syncevolution-1.5/0000755000373300037200000000000012424710003015665 5ustar00nightlyallusers00000000000000syncevolution-1.5/build/0000755000373300037200000000000012424707642017003 5ustar00nightlyallusers00000000000000syncevolution-1.5/build/gen-git-version.sh0000755000373300001540000000615512326412403022175 0ustar00nightlynightly00000000000000#! /bin/sh # This scripts takes current version as a parameter, generates the version # and prints it to standard output - this way it is usable with m4_esyscmd, # which can be used inside AC_INIT. The script will print the passed version if # the following checks pass: # - SyncEvolution source is clean (git status reports # no "modified" files or "untracked" files, or the source # is not in git at all) # - the source is tagged with the version of SyncEvolution # (git describe --tags HEAD reports something which matches, # for example syncevolution-1-0-beta-2a for 1.0beta2a) # - same for libsynthesis, if the SYNTHESISSRC env variable # is set # # If these tests fail, the version is extended: # ++SE++SYSYNC+ # = date # = [+unclean] # = shortened hash from describe (for example, 1040ffd) # +unclean = source was dirty set -e version="$1" checksource () { dir=$1 force=$2 dirty= if [ ! -d $dir/.git ]; then return fi cur=`pwd` cd $dir if git status | grep -e "modified:" -e "Untracked files:" -q; then dirty='+unclean' fi describe=`git describe --tags` hash=`cat .git/HEAD | sed -e 's/ref: //'` if [ "`echo $hash | sed -e 's/[0-9a-fA-F]//g'`" ] ; then # contains other characters than simple hex, probably a reference: # convert to abbreviated hash hash=`git show-ref --abbrev --hash --verify $hash` else # already a hash, abbreviate hash=`echo $hash | sed -e 's/\(......\).*/\1/'` fi if git show-ref --tags | grep -q $hash; then # there is at least one tag matching HEAD; # pick the most recent one (based on lexical sorting) exact=1 tag=`git show-ref --tags | grep $hash | sort | tail -1 | sed -e 's;.*refs/tags/;;'` else # Detect --g suffix added when tag is older than HEAD. # Remove suffix to get tag (doesn't matter if we do not pick # the most recent one). exact= tag=`echo $describe | sed -e 's/-[0123456789]*-g.*//'` fi simpletag=$tag # Hyphens between numbers in the tag are dots in the version # and all other hyphens can be removed. while true; do tmp=`echo $simpletag | sed -e 's/\([0123456789]\)-\([0123456789]\)/\1.\2/'` if [ $tmp = $simpletag ]; then break else simpletag=$tmp fi done simpletag=`echo $simpletag | sed -e 's/-//g'` if [ "$dirty" ] || [ "$force" ]; then # previous check failed, always print hash echo $hash$dirty elif [ "$exact" ] && echo $simpletag | grep -q "syncevolution${version}\$"; then true else echo $hash$dirty fi cd $cur } versionsuffix='' syncevo=`checksource .` if [ "$SYNTHESISSRC" ]; then sysync=`checksource $SYNTHESISSRC $syncevo` fi # run check again, to get hash when only libsynthesis failed syncevo=`checksource . $sysync` if [ "$syncevo" ]; then versionsuffix="+SE+$syncevo" fi if [ "$sysync" ]; then versionsuffix="$versionsuffix+SYSYNC+$sysync" fi if [ "$versionsuffix" ]; then versionsuffix="+`date +%Y%m%d`$versionsuffix" fi # using printf, because echo -n is not portable. hopefully printf is. printf %s "$version$versionsuffix" syncevolution-1.5/build/source2html.py0000644000373300001540000000365412326412403021443 0ustar00nightlynightly00000000000000#!/usr/bin/python """ Converts source code (first parameter, can be - for stdin) to HTML (stdout), using pygments if installed, otherwise simple text manipulation without syntax highlighting. In both cases the output will have "True-" as anchors for each line. """ import sys filename = sys.argv[1] if filename == '-': code = sys.stdin.read() else: code = open(filename).read() out = sys.stdout try: import pygments import pygments.lexers from pygments.formatters import HtmlFormatter if filename == '-': lexer = pygments.lexers.guess_lexer(code) else: lexer = pygments.lexers.guess_lexer_for_filename(filename, code) formatter = HtmlFormatter(full=True, linenos=True, lineanchors=True) pygments.highlight(code, lexer, formatter, out) except: import cgi print >>sys.stderr, "source2html.py failed with pygments:", sys.exc_info() print >>sys.stderr, "falling back to internal code" out.write('''
''')
    lines = code.split('\n')
    for line in range(1, len(lines)):
        out.write('%4d\n' % line)
    out.write('%4d' % len(lines))
    out.write('
')
    for lineno, line in enumerate(lines):
        out.write('%s\n' % (lineno + 1, cgi.escape(line)))
    out.write('''
''') syncevolution-1.5/build/build.am0000644000373300001540000000061612326412403020233 0ustar00nightlynightly00000000000000dist_noinst_SCRIPTS += build/gen-git-version.sh \ build/source2html.py EXTRA_DIST += \ build/export-foreign-git.sh \ build/export-gdbus.sh \ build/export-synthesis-xml.sh \ build/gen-backends-am.sh \ build/gen-backends.sh \ build/gen-changelog.pl \ build/gen-linguas.sh \ build/import-foreign-git.sh \ build/import-gdbus.sh \ build/import-synthesis-xml.sh \ build/update-copyrights.sh syncevolution-1.5/build/export-foreign-git.sh0000755000373300001540000000271312326412403022705 0ustar00nightlynightly00000000000000#! /bin/sh # # Exports changes made to files so that the upstream # maintainers can import the changes into their own # git repo. All changes which are not marked as # being from the remote git repo with a "commit ID" # comment are exported. # # Result are numbered .patch files, as with "git format-patch". # # Run this inside the top level of a clean # syncevolution git repository with the following # parameters: # - file system path for foreign git repository # - a remote directory into which the source file(s) are to be placed, # preserving all remaining directories after stripping # - common local directory to be stripped from source file(s) # - one or more source file names, with paths relative to the # local repository set -e set -x FOREIGN="$1" shift TARGET_DIR="$1" shift SOURCE_DIR="$1" shift SOURCE="$@" FOREIGN_NAME=`basename $FOREIGN` # iterate over commits involving the relevant files, # starting with oldest one counter=1 for commit in `(git log --format=format:%H $SOURCE; echo) | perl -e 'print reverse(<>)'`; do if git log -n 1 $commit | grep -q "$FOREIGN_NAME commit ID"; then # nothing to do, is in original git repo true else file=`printf %03d $counter`-`git log -n 1 --format=format:%f $commit`.patch counter=`expr $counter + 1` git log -n 1 -p --stat --format=email $commit $SOURCE | perl -p -e "s;$SOURCE_DIR;$TARGET_DIR;g;" -e "s/^index [0-9a-f]*\.\.[0-9a-f]* [0-9]*\n$//;" >$file fi done syncevolution-1.5/build/export-gdbus.sh0000755000373300001540000000105712326412403021577 0ustar00nightlynightly00000000000000#! /bin/sh # # Run this inside the top level of a clean # syncevolution git repository. Pass the path # to a gdbus repository (default: ../libgdbus). # # The script generates .patch files for all changes # made in the current branch to files which are # shared with gdbus. The resulting files can # be imported with "git am". set -e set -x `dirname $0`/export-foreign-git.sh "${1:-../libgdbus}" src src/gdbus \ src/gdbus/debug.c \ src/gdbus/debug.h \ src/gdbus/gdbus.h \ src/gdbus/mainloop.c \ src/gdbus/object.c \ src/gdbus/watch.c syncevolution-1.5/build/export-synthesis-xml.sh0000755000373300001540000000135412326412403023322 0ustar00nightlynightly00000000000000#! /bin/sh # # Run this inside the top level of a clean # syncevolution git repository. Pass the path # to a gdbus repository (default: ../libsynthesis). # # The script generates .patch files for all changes # made in the current branch to files which are # shared with gdbus. The resulting files can # be imported with "git am". set -e set -x path="${1:-../libsynthesis}" files="`((cd $path/src/sysync_SDK && find configs \( -name '*.xml' -o -name 'update-samples.pl' -o -name README \) -a \! \( -name 'sync*_sample_config.xml' -o -name sunbird_client.xml \)) && (cd src/syncevo && find configs -name '*.xml' -o name README)) | sort -u | sed -e 's;^;src/syncevo/;'`" `dirname $0`/export-foreign-git.sh "$path" src/sysync_SDK src/syncevo $files syncevolution-1.5/build/gen-backends-am.sh0000755000373300001540000000152412326412403022067 0ustar00nightlynightly00000000000000#!/bin/sh amfile='src/backends/backends.am' tmpfile="$amfile.$$" rm -f "$tmpfile" touch "$tmpfile" BACKENDS="`echo src/backends/*/configure-sub.in | sed -e 's%/configure-sub\.in%%g' | sort`" BACKEND_REGISTRIES="`echo src/backends/*/*Register.cpp | sort`" tf() { echo "$1" >>"$tmpfile" } # tf '# This is a stupid workaround for an absolute path in SYNCEVOLUTION_LIBS.' # tf '# See AUTOTOOLS-TODO for details.' # tf '@SYNCEVOLUTION_LIBS@: src/syncevo/libsyncevolution.la ; @true' # tf '' tf "BACKENDS = $BACKENDS" tf '' tf "BACKEND_REGISTRIES = $BACKEND_REGISTRIES" tf '' tf '# backend includes' for backend in $BACKENDS do name=`echo "$backend" | sed -e 's%src/backends/%%'` tf "include \$(top_srcdir)/$backend/$name.am" done if test ! -f "$amfile" || ! cmp -s "$amfile" "$tmpfile" then mv "$tmpfile" "$amfile" else rm -f "$tmpfile" fi syncevolution-1.5/build/gen-backends.sh0000755000373300001540000000133412326412403021473 0ustar00nightlynightly00000000000000#! /bin/sh # # This script prints all configure-sub.in in src/backends # directory to standard output. This is meant to be used # from m4_esyscmd inside configure.ac. # # The motivation for this non-standard approach was that # it allows adding new backends without touching core # files, which should have simplified the development of # out-of-tree backends. Now git pretty much removes # the need for such tricks, but it's still around. tmpfile="configure.in.$$" rm -f "$tmpfile" for sub in src/backends/*/configure-sub.in do echo "# vvvvvvvvvvvvvv $sub vvvvvvvvvvvvvv" >>"$tmpfile" cat "$sub" >>"$tmpfile" echo "# ^^^^^^^^^^^^^^ $sub ^^^^^^^^^^^^^^" >>"$tmpfile" echo >>"$tmpfile" done cat "$tmpfile" rm -f "$tmpfile" syncevolution-1.5/build/gen-changelog.pl0000755000373300001540000000577612326412403021667 0ustar00nightlynightly00000000000000#!/usr/bin/perl use strict; use warnings; use Text::Wrap; use Pod::Usage; use Getopt::Long; use POSIX qw( strftime ); $Text::Wrap::columns = 74; # git commands our $GIT_LOG = 'git log --pretty=format:"%at|%an|<%ae>|%h|%s"'; our $GIT_DIFF_TREE = 'git diff-tree --name-only -r'; my $help; my $result = GetOptions( "h|help" => \$help, ); pod2usage(1) if $help; our $revs = $ARGV[0] or undef; my $log_cmd = $GIT_LOG; $log_cmd .= ' ' . $revs if defined $revs; open my $git_log, '-|', $log_cmd or die("Unable to invoke git-log: $!\n"); while (<$git_log>) { my $log_line = $_; chomp($log_line); my ($timestamp, $committer, $email, $commit_hash, $subject) = split /\|/, $log_line, 5; # use a shorter date line my $date = strftime("%Y-%m-%d", localtime($timestamp)); print STDOUT $date, " ", $committer, " ", $email, "\n\n"; # list the file changes if ($commit_hash) { my $diff_cmd = $GIT_DIFF_TREE . " " . $commit_hash; open my $git_diff, '-|', $diff_cmd or die("Unable to invoke git-diff-tree: $!\n"); while (<$git_diff>) { my $diff_line = $_; chomp($diff_line); next if $diff_line =~ /^$commit_hash/; print STDOUT "\t* ", $diff_line, ":\n"; } close($git_diff); } else { print STDOUT "\t* *:\n"; } print STDOUT "\n"; # no need to use the full body, the subject will do if (defined $subject) { $subject =~ s/\t//g; print STDOUT wrap("\t", "\t", $subject), "\n"; } print STDOUT "\n"; } close($git_log); 0; __END__ =pod =head1 NAME gen-changelog - Creates a ChangeLog from a git log =head1 SYNOPSIS gen-changelog =head1 DESCRIPTION B is a small Perl script that reads the output of git log and creates a file using the GNU ChangeLog format. It should be used when creating a tarball of a project, to provide a full log of the changes to the users. =head1 OPTIONS =over 4 =item -h, --help Prints a brief help message =item EsinceE..EuntilE Show only commits between the named two commits. When either EsinceE or EuntilE is omitted, it defaults to `HEAD`, i.e. the tip of the current branch. For a more complete list of ways to spell EsinceE and EuntilE, see "SPECIFYING REVISIONS" section in git rev-parse. =back =head1 CAVEATS B is very simple and should be tweaked to fit your use case. It does fit the author's, but he'll gladly accept patches and requests. =head1 EXAMPLES =over 4 =item Print the full log and redirect it to a file gen-changelog > ChangeLog =item Print the changelog of the local changes gen-changelog origin..HEAD =back =head1 AUTHOR Emmanuele Bassi Eebassi (at) gnome.orgE =head1 COPYRIGHT AND LICENSE Copyright (C) 2009 Emmanuele Bassi This program is free software. It can be distributed and/or modified under the terms of Perl itself. See L for further details. =cut syncevolution-1.5/build/gen-linguas.sh0000755000373300001540000000042712326412403021365 0ustar00nightlynightly00000000000000#!/bin/sh -e lings_new="LINGUAS.new.$$" lings="LINGUAS" # create LINGUAS file: every .po is included cd po ls -1 *.po | sort -u | sed -e 's/.po$//' >"$lings_new" if test -f "$lings" && cmp -s "$lings" "$lings_new" then rm "$lings_new" else mv "$lings_new" "$lings" fi syncevolution-1.5/build/import-foreign-git.sh0000755000373300001540000000544412326412403022702 0ustar00nightlynightly00000000000000#! /bin/sh # # Run this inside the top level of a clean # syncevolution git repository with the following # parameters: # - file system path for foreign git repository # - name of local branch for importing changes # - a local directory into which the source file(s) is to be placed, # preserving all remaining directories after stripping # - number of directory levels to strip from source file(s) # - one or more source file names, with paths relative to the # foreign repository set -e set -x FOREIGN="$1" shift TARGET_BRANCH="$1" shift TARGET_DIR="$1" shift SOURCE_LEVELS="$1" shift SOURCE="$@" FOREIGN_NAME=`basename $FOREIGN` TARGET=`for i in $SOURCE; do echo $i | perl -p -e "s;([^/]*/){$SOURCE_LEVELS};$TARGET_DIR/;"; done` PATCH=`mktemp` MSG=`mktemp` git checkout $TARGET_BRANCH # find lastest imported commit: # import everything unless one of the files already exists, # in which case we assume that all of the others also exist revisions=master for i in $TARGET; do if [ -f $i ]; then revisions="`git log -n 1 -- $TARGET | tail -1`..master" break fi done count=`(cd "$FOREIGN" && git log -p $revisions -- $SOURCE) | grep '^commit' | wc -l` # iterate over all commits from oldest to newest i=1 while [ $i -le $count ]; do # get complete patch (cd "$FOREIGN" && git log -p --max-count=1 --skip=`expr $count - $i` $revisions -- $SOURCE) >$PATCH # get just the commit message (cd "$FOREIGN" && git log --max-count=1 --skip=`expr $count - $i` $revisions -- $SOURCE) >$MSG # apply patch to file: enter directory and skip pathname from patch if ! (cd $TARGET_DIR && patch -p`expr $SOURCE_LEVELS + 1` <$PATCH); then echo "patch failed in $TARGET_DIR: patch -p`expr $SOURCE_LEVELS + 1` <$PATCH" echo "continue? yes/no [no]" read yesno if [ "$yesno" != "yes" ]; then exit 1 fi fi # now commit it (can't use commit because we want to preserve date): # - add to index for t in $TARGET; do [ -f $t ] && git add $t done # - write index id=`git write-tree` # - find information for commit and commit parent=`git show-ref --heads --hash $TARGET_BRANCH` origid=`grep ^commit $MSG | sed -e 's/commit //'` GIT_AUTHOR_NAME="`grep ^Author: $MSG | sed -e 's/Author: \(.*\) <.*/\1/'`" GIT_AUTHOR_EMAIL="`grep ^Author: $MSG | sed -e 's/Author: [^<]*<\([^>]*\)>/\1/'`" GIT_AUTHOR_DATE="`grep ^Date: $MSG | sed -e 's/Date: *//'`" export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE id=`(grep '^ ' $MSG | sed -e 's/^ *//' && echo && echo "$FOREIGN_NAME commit ID:" && echo $origid) | git commit-tree $id -p $parent` # - update branch and check it out git update-ref refs/heads/$TARGET_BRANCH $id git reset --hard $TARGET_BRANCH # next patch i=`expr $i + 1` done syncevolution-1.5/build/import-gdbus.sh0000755000373300001540000000122212326412403021562 0ustar00nightlynightly00000000000000#! /bin/sh # # Run this inside the top level of a clean # syncevolution git repository. Pass the path # to a gdbus repository (default: ../libgdbus). # # The script switches to the "gdbus" branch # in the syncevolution repo and then merges all # patches committed to the "master" branch in the # gdbus repo, updating the "gdbus" branch # as it goes along. # # The original commit IDs are recorded # at the end of each commit message. set -e set -x `dirname $0`/import-foreign-git.sh "${1:-../libgdbus}" gdbus src/gdbus 1 \ src/debug.c \ src/debug.h \ src/gdbus.h \ src/mainloop.c \ src/Makefile.am \ src/object.c \ src/watch.c syncevolution-1.5/build/import-synthesis-xml.sh0000755000373300001540000000145712326412403023317 0ustar00nightlynightly00000000000000#! /bin/sh # # Run this inside the top level of a clean # syncevolution git repository. Pass the path # to a synthesis repository (default: ../libsynthesis). # # The script switches to the "synthesis-xml-fragments" branch # in the syncevolution repo and then merges all # patches committed to the "master" branch in the # synthesis repo, updating the "synthesis" branch # as it goes along. # # The original commit IDs are recorded # at the end of each commit message. set -e set -x path="${1:-../libsynthesis}" files="`cd $path && find src/sysync_SDK/configs/ \( -name '*.xml' -o -name 'update-samples.pl' -o -name README \) -a \! \( -name 'sync*_sample_config.xml' -o -name sunbird_client.xml \)`" `dirname $0`/import-foreign-git.sh "${1:-../libsynthesis}" synthesis-xml-fragments src/syncevo/configs 3 $files syncevolution-1.5/build/update-copyrights.sh0000755000373300001540000000477712326412403022643 0ustar00nightlynightly00000000000000#! /bin/sh # # Usage: update-copyrights.sh "author" # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA currentyear=`date +%Y` oldyear=`expr $currentyear - 1` export currentyear oldyear author addcopyright () { file="$1" author="$2" if grep -w "Copyright.*$currentyear.*$author" $file >/dev/null; then # done true elif grep -w "Copyright.*-$oldyear $author" $file >/dev/null; then # replace end year perl -pi -e 's/-$ENV{oldyear} $ENV{author}/-$ENV{currentyear} $ENV{author}/' $file echo updated: $author: $file elif grep -w "Copyright.*$oldyear $author" $file >/dev/null; then # add consecutive year perl -pi -e 's/$ENV{oldyear} $ENV{author}/$ENV{oldyear}-$ENV{currentyear} $ENV{author}/' $file echo updated: $author: $file elif grep -w "Copyright.*$author" $file >/dev/null; then # add separate year perl -pi -e 's/(Copyright.*) $ENV{author}/$1, $ENV{currentyear} $ENV{author}/' $file echo updated: $author: $file elif grep -w "Copyright" $file >/dev/null; then # add new line after the last copyright line # -i doesn't work with reading all lines? perl -e '$_ = join ("", <>); s/(.*)((^[ *#]*Copyright)[^\n]*)/$1$2\n$3 (C) $ENV{currentyear} $ENV{author}/ms; print;' \ $file >$file.bak && mv $file.bak $file && echo added: $author: $file || rm $file.bak && echo no copyright: $author: $file else echo skipped: $author: $file fi } for file in `git ls-files "$@"`; do git log --since=2009-01-01 --pretty='format:%ai: %an <%ae>' $file | grep ^$currentyear | sed -e 's/.*: //' | sort -u | while read author; do case $author in *intel.com*) author="Intel Corporation" esac addcopyright "$file" "$author" done done syncevolution-1.5/m4/0000755000373300037200000000000012424707640016222 5ustar00nightlyallusers00000000000000syncevolution-1.5/m4/intltool.m40000644000373300001540000002772412424700451020157 0ustar00nightlynightly00000000000000## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- ## Copyright (C) 2001 Eazel, Inc. ## Author: Maciej Stachowiak ## Kenneth Christiansen ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## As a special exception to the GNU General Public License, if you ## distribute this file as part of a program that contains a ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 42 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi if test -z "$AM_DEFAULT_VERBOSITY"; then AM_DEFAULT_VERBOSITY=1 fi AC_SUBST([AM_DEFAULT_VERBOSITY]) INTLTOOL_V_MERGE='$(INTLTOOL__v_MERGE_$(V))' INTLTOOL__v_MERGE_='$(INTLTOOL__v_MERGE_$(AM_DEFAULT_VERBOSITY))' INTLTOOL__v_MERGE_0='@echo " ITMRG " [$]@;' AC_SUBST(INTLTOOL_V_MERGE) AC_SUBST(INTLTOOL__v_MERGE_) AC_SUBST(INTLTOOL__v_MERGE_0) INTLTOOL_V_MERGE_OPTIONS='$(intltool__v_merge_options_$(V))' intltool__v_merge_options_='$(intltool__v_merge_options_$(AM_DEFAULT_VERBOSITY))' intltool__v_merge_options_0='-q' AC_SUBST(INTLTOOL_V_MERGE_OPTIONS) AC_SUBST(intltool__v_merge_options_) AC_SUBST(intltool__v_merge_options_0) INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' if test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge 5000; then INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u --no-translations $< [$]@' else INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; $(INTLTOOL_V_MERGE)_it_tmp_dir=tmp.intltool.[$][$]RANDOM && mkdir [$][$]_it_tmp_dir && LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u [$][$]_it_tmp_dir $< [$]@ && rmdir [$][$]_it_tmp_dir' fi INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; $(INTLTOOL_V_MERGE)LC_ALL=C $(INTLTOOL_MERGE) $(INTLTOOL_V_MERGE_OPTIONS) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION=`$INTLTOOL_PERL -e "printf '%vd', $^V"` AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) syncevolution-1.5/m4/libtool.m40000644000373300001540000105754212424700473017765 0ustar00nightlynightly00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS syncevolution-1.5/m4/ltoptions.m40000644000373300001540000003007312424700473020341 0ustar00nightlynightly00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) syncevolution-1.5/m4/ltsugar.m40000644000373300001540000001042412424700473017765 0ustar00nightlynightly00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) syncevolution-1.5/m4/ltversion.m40000644000373300001540000000126212424700473020331 0ustar00nightlynightly00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) syncevolution-1.5/m4/lt~obsolete.m40000644000373300001540000001375612424700473020671 0ustar00nightlynightly00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) syncevolution-1.5/m4-repo/0000755000373300037200000000000012424707640017165 5ustar00nightlyallusers00000000000000syncevolution-1.5/m4-repo/autotroll.m40000644000373300001540000005013012326412403021264 0ustar00nightlynightly00000000000000# Build Qt apps with the autotools (Autoconf/Automake). # M4 macros. # This file is part of AutoTroll. # Copyright (C) 2006 Benoit Sigoure # # AutoTroll 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. # # In addition, as a special exception, the copyright holders of AutoTroll # give you unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the macros of # AutoTroll. You need not follow the terms of the GNU General Public License # when using or distributing such scripts, even though portions of the text of # AutoTroll appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes AutoTroll. # # This special exception to the GPL applies to versions of AutoTroll # released by the copyright holders of AutoTroll. Note that people who make # modified versions of AutoTroll are not obligated to grant this special # exception for their modified versions; it is their choice whether to do so. # The GNU General Public License gives permission to release a modified version # without this exception; this exception also makes it possible to release a # modified version which carries forward this exception. # ------------- # # DOCUMENTATION # # ------------- # # Disclaimer: Never tested with anything else than Qt 4.2! Feedback welcome. # Simply invoke AT_WITH_QT in your configure.ac. AT_WITH_QT can take # arguments which are documented in depth below. The default arguments are # equivalent to the default .pro file generated by qmake. # # Invoking AT_WITH_QT will do the following: # - Add a --with-qt option to your configure # - Find qmake, moc and uic and save them in the make variables $(QMAKE), # $(MOC), $(UIC). # - Save the path to Qt in $(QT_PATH) # - Find the flags to use Qt, that is: # * $(QT_DEFINES): -D's defined by qmake. # * $(QT_CFLAGS): CFLAGS as defined by qmake (C?!) # * $(QT_CXXFLAGS): CXXFLAGS as defined by qmake. # * $(QT_INCPATH): -I's defined by qmake. # * $(QT_CPPFLAGS): Same as $(QT_DEFINES) + $(QT_INCPATH) # * $(QT_LFLAGS): LFLAGS defined by qmake. # * $(QT_LDFLAGS): Same thing as $(QT_LFLAGS). # * $(QT_LIBS): LIBS defined by qmake. # # You *MUST* invoke $(MOC) and/or $(UIC) where necessary. AutoTroll provides # you with Makerules to ease this, here is a sample Makefile.am to use with # AutoTroll which builds the code given in the chapter 7 of the Qt Tutorial: # http://doc.trolltech.com/4.2/tutorial-t7.html # # ------------------------------------------------------------------------- # include $(top_srcdir)/build-aux/autotroll.mk # # ACLOCAL_AMFLAGS = -I build-aux # # bin_PROGRAMS = lcdrange # lcdrange_SOURCES = $(BUILT_SOURCES) lcdrange.cpp lcdrange.h main.cpp # lcdrange_CXXFLAGS = $(QT_CXXFLAGS) $(AM_CXXFLAGS) # lcdrange_CPPFLAGS = $(QT_CPPFLAGS) $(AM_CPPFLAGS) # lcdrange_LDFLAGS = $(QT_LDFLAGS) $(LDFLAGS) # lcdrange_LDADD = $(QT_LIBS) $(LDADD) # # BUILT_SOURCES = lcdrange.moc.cpp # ------------------------------------------------------------------------- # # Note that your MOC, UIC and QRC files *MUST* be listed manually in # BUILT_SOURCES. If you name them properly (eg: .moc.cc, .qrc.cc, .ui.cc -- of # course you can use .cpp or .cxx or .C rather than .cc) AutoTroll will build # them automagically for you (using implicit rules defined in autotroll.mk). m4_define([_AUTOTROLL_SERIAL], [m4_translit([ # serial 5 ], [# ], [])]) m4_ifdef([AX_INSTEAD_IF], [], [AC_DEFUN([AX_INSTEAD_IF], [m4_ifval([$1], [AC_MSG_WARN([$2]); [$1]], [AC_MSG_ERROR([$2])])])]) m4_pattern_forbid([^AT_])dnl m4_pattern_forbid([^_AT_])dnl # AT_WITH_QT([QT_modules], [QT_config], [QT_misc], [RUN-IF-FAILED], [RUN-IF-OK]) # ------------------------------------------------------------------------------ # Enable Qt support and add an option --with-qt to the configure script. # # The QT_modules argument is optional and defines extra modules to enable or # disable (it's equivalent to the QT variable in .pro files). Modules can be # specified as follows: # # AT_WITH_QT => No argument -> No QT value. # Qmake sets it to "core gui" by default. # AT_WITH_QT([xml]) => QT += xml # AT_WITH_QT([+xml]) => QT += xml # AT_WITH_QT([-gui]) => QT -= gui # AT_WITH_QT([xml -gui +sql svg]) => QT += xml sql svg # QT -= gui # # The QT_config argument is also optional and follows the same convention as # QT_modules. Instead of changing the QT variable, it changes the CONFIG # variable, which is used to tweak configuration and compiler options. # # The last argument, QT_misc (also optional) will be copied as-is the .pro # file used to guess how to compile Qt apps. You may use it to further tweak # the build process of Qt apps if tweaking the QT or CONFIG variables isn't # enough for you. # # RUN-IF-FAILED is arbitrary code to execute if Qt cannot be found or if any # problem happens. If this argument is omitted, then AC_MSG_ERROR will be # called. RUN-IF-OK is arbitrary code to execute if Qt was successfully found. AC_DEFUN([AT_WITH_QT], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CXX])dnl echo "$as_me: this is autotroll.m4[]_AUTOTROLL_SERIAL" >&AS_MESSAGE_LOG_FD test x"$TROLL" != x && echo 'ViM rox emacs.' dnl Memo: AC_ARG_WITH(package, help-string, [if-given], [if-not-given]) AC_ARG_WITH([qt], [AS_HELP_STRING([--with-qt], [Path to Qt @<:@Look in PATH and /usr/local/Trolltech@:>@])], [QT_PATH=$withval]) # this is a hack to get decent flow control with 'break' for _qt_ignored in once; do # Find Qt. AC_ARG_VAR([QT_PATH], [Path to the Qt installation]) if test -d /usr/local/Trolltech; then # Try to find the latest version. tmp_qt_paths=`echo /usr/local/Trolltech/*/bin | tr ' ' '\n' | sort -nr \ | xargs | sed 's/ */:/g'` fi # Path to which recent MacPorts (~v1.7) install Qt4. test -d /opt/local/libexec/qt4-mac/bin \ && tmp_qt_paths="$tmp_qt_paths:/opt/local/libexec/qt4-mac/bin" # Find qmake. AC_ARG_VAR([QMAKE], [Qt Makefile generator command]) AC_PATH_PROGS([QMAKE], [qmake qmake-qt4 qmake-qt3], [missing], [$QT_DIR:$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$QMAKE" = xmissing; then AX_INSTEAD_IF([$4], [Cannot find qmake in your PATH. Try using --with-qt.]) break fi # Find moc (Meta Object Compiler). AC_ARG_VAR([MOC], [Qt Meta Object Compiler command]) AC_PATH_PROGS([MOC], [moc moc-qt4 moc-qt3], [missing], [$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$MOC" = xmissing; then AX_INSTEAD_IF([$4], [Cannot find moc (Meta Object Compiler) in your PATH. Try using --with-qt.]) break fi # Find uic (User Interface Compiler). AC_ARG_VAR([UIC], [Qt User Interface Compiler command]) AC_PATH_PROGS([UIC], [uic uic-qt4 uic-qt3 uic3], [missing], [$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$UIC" = xmissing; then AX_INSTEAD_IF([$4], [Cannot find uic (User Interface Compiler) in your PATH. Try using --with-qt.]) break fi # Find rcc (Qt Resource Compiler). AC_ARG_VAR([RCC], [Qt Resource Compiler command]) AC_PATH_PROGS([RCC], [rcc], [false], [$QT_PATH:$PATH:$tmp_qt_paths]) if test x"$UIC" = xfalse; then AC_MSG_WARN([Cannot find rcc (Qt Resource Compiler) in your PATH.\ Try using --with-qt.]) fi AC_MSG_CHECKING([whether host operating system is Darwin]) at_darwin=no at_qmake_args= case $host_os in darwin*) at_darwin=yes at_qmake_args='-spec macx-g++' ;; esac AC_MSG_RESULT([$at_darwin]) # If we don't know the path to Qt, guess it from the path to qmake. if test x"$QT_PATH" = x; then QT_PATH=`dirname "$QMAKE"` fi if test x"$QT_PATH" = x; then AX_INSTEAD_IF([$4], [Cannot find the path to your Qt install. Use --with-qt.]) break fi AC_SUBST([QT_PATH]) # Get ready to build a test-app with Qt. if mkdir conftest.dir && cd conftest.dir; then :; else AX_INSTEAD_IF([$4], [Cannot mkdir conftest.dir or cd to that directory.]) break fi cat >conftest.h <<_ASEOF #include class Foo: public QObject { Q_OBJECT; public: Foo(); ~Foo() {} public Q_SLOTS: void setValue(int value); Q_SIGNALS: void valueChanged(int newValue); private: int value_; }; _ASEOF cat >conftest.cpp <<_ASEOF #include "conftest.h" Foo::Foo() : value_ (42) { connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); } void Foo::setValue(int value) { value_ = value; } int main() { Foo f; } _ASEOF if $QMAKE -project; then :; else AX_INSTEAD_IF([$4], [Calling $QMAKE -project failed.]) break fi # Find the .pro file generated by qmake. pro_file='conftest.dir.pro' test -f $pro_file || pro_file=`echo *.pro` if test -f "$pro_file"; then :; else AX_INSTEAD_IF([$4], [Can't find the .pro file generated by Qmake.]) break fi dnl Tweak the value of QT in the .pro if have been the 1st arg. m4_ifval([$1], [_AT_TWEAK_PRO_FILE([QT], [$1])]) dnl Tweak the value of CONFIG in the .pro if have been given a 2nd arg. m4_ifval([$2], [_AT_TWEAK_PRO_FILE([CONFIG], [$2])]) m4_ifval([$3], [ # Add the extra-settings the user wants to set in the .pro echo "$3" >>"$pro_file" ]) echo "$as_me:$LINENO: Invoking $QMAKE on $pro_file" >&AS_MESSAGE_LOG_FD sed 's/^/| /' "$pro_file" >&AS_MESSAGE_LOG_FD if $QMAKE $at_qmake_args; then :; else AX_INSTEAD_IF([$4], [Calling $QMAKE $at_qmake_args failed.]) break fi # QMake has a very annoying misfeature: sometimes it generates Makefiles # where all the references to the files from the Qt installation are # relative. We can't use them as-is because if we take, say, a # -I../../usr/include/Qt from that Makefile, the flag is invalid as soon # as we use it in another (sub) directory. So what this perl pass does is # that it rewrite all relative paths to absolute paths. Another problem # when building on Cygwin is that QMake mixes paths with blackslashes and # forward slashes and paths must be handled with extra care because of the # stupid Windows drive letters. echo "$as_me:$LINENO: fixing the Makefiles:" Makefile* >&AS_MESSAGE_LOG_FD cat >fixmk.pl <<\EOF [use strict; use Cwd qw(cwd abs_path); # This variable is useful on Cygwin for the following reason: Say that you are # in `/' (that is, in fact you are in C:/cygwin, or something like that) if you # `cd ..' then obviously you remain in `/' (that is in C:/cygwin). QMake # generates paths that are relative to C:/ (or another driver letter, whatever) # so the trick to get the `..' resolved properly is to prepend the absolute # path of the current working directory in a Windows-style. C:/cygwin/../ will # properly become C:/. my $d = ""; my $r2a = 0; my $b2f = 0; my $cygwin = 0; if ($^O eq "cygwin") { $cygwin = 1; $d = cwd(); $d = `cygpath --mixed '$d'`; chomp($d); $d .= "/"; } sub rel2abs($) { my $p = $d . shift; # print "r2a p=$p"; -e $p || return $p; if ($cygwin) { $p = `cygpath --mixed '$p'`; chomp($p); } else { # Do not use abs_path on Cygwin: it incorrectly resolves the paths that are # relative to C:/ rather than `/'. $p = abs_path($p); } # print " -> $p\n"; ++$r2a; return $p; } # Only useful on Cygwin. sub back2forward($) { my $p = shift; # print "b2f p=$p"; -e $p || return $p; $p = `cygpath --mixed '$p'`; chomp($p); # print " -> $p\n"; ++$b2f; return $p; } foreach my $mk (@ARGV) { next if $mk =~ /~$/; open(MK, $mk) or die("open $mk: $!"); # print "mk=$mk\n"; my $file = join("", ); close(MK) or die("close $mk: $!"); rename $mk, $mk . "~" or die("rename $mk: $!"); $file =~ s{(?:\.\.[\\/])+(?:[^"'\s:]+)}{rel2abs($&)}gse; $file =~ s{(?:[a-zA-Z]:[\\/])?(?:[^"\s]+\\[^"\s:]+)+} {back2forward($&)}gse if $cygwin; open(MK, ">", $mk) or die("open >$mk: $!"); print MK $file; close(MK) or die("close >$mk: $!"); print "$mk: updated $r2a relative paths and $b2f backslash-style paths\n"; $r2a = 0; $b2f = 0; }] EOF perl >&AS_MESSAGE_LOG_FD -w fixmk.pl Makefile* || AC_MSG_WARN([failed to fix the Makefiles generated by $QMAKE]) rm -f fixmk.pl # Try to compile a simple Qt app. AC_CACHE_CHECK([whether we can build a simple Qt app], [at_cv_qt_build], [at_cv_qt_build=ko : ${MAKE=make} if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 4' else echo "$as_me:$LINENO: Build failed, trying to #include \ instead" >&AS_MESSAGE_LOG_FD sed 's///' conftest.h > tmp.h && mv tmp.h conftest.h if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 3' else # Sometimes (such as on Debian) build will fail because Qt hasn't been # installed in debug mode and qmake tries (by default) to build apps in # debug mode => Try again in release mode. echo "$as_me:$LINENO: Build failed, trying to enforce release mode" \ >&AS_MESSAGE_LOG_FD _AT_TWEAK_PRO_FILE([CONFIG], [+release]) sed 's///' conftest.h > tmp.h && mv tmp.h conftest.h if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 4, release mode forced' else echo "$as_me:$LINENO: Build failed, trying to #include \ instead" >&AS_MESSAGE_LOG_FD sed 's///' conftest.h >tmp.h && mv tmp.h conftest.h if $MAKE >&AS_MESSAGE_LOG_FD 2>&1; then at_cv_qt_build='ok, looks like Qt 3, release mode forced' else at_cv_qt_build=ko echo "$as_me:$LINENO: failed program was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.h >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: failed program was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.cpp >&AS_MESSAGE_LOG_FD fi # if make with Qt3-style #include and release mode forced. fi # if make with Qt4-style #include and release mode forced. fi # if make with Qt3-style #include. fi # if make with Qt4-style #include. ])dnl end: AC_CACHE_CHECK(at_cv_qt_build) if test x"$at_cv_qt_build" = xko; then AX_INSTEAD_IF([$4], [Cannot build a test Qt program]) cd .. break fi QT_VERSION_MAJOR=`echo "$at_cv_qt_build" | sed 's/[[^0-9]]*//g'` AC_SUBST([QT_VERSION_MAJOR]) # This sed filter is applied after an expression of the form: /^FOO.*=/!d; # It starts by removing the beginning of the line, removing references to # SUBLIBS, removing unnecessary whitespaces at the beginning, and prefixes # all variable uses by QT_. qt_sed_filter='s///; s/$(SUBLIBS)//g; s/^ *//; s/\$(\(@<:@A-Z_@:>@@<:@A-Z_@:>@*\))/$(QT_\1)/g' # Find the Makefile (qmake happens to generate a fake Makefile which invokes # a Makefile.Debug or Makefile.Release). We we have both, we'll pick the # Makefile.Release. The reason is that the main difference is that release # uses -Os and debug -g. We can override -Os by passing another -O but we # usually don't override -g. if test -f Makefile.Release; then at_mfile='Makefile.Release' else at_mfile='Makefile' fi if test -f $at_mfile; then :; else AX_INSTEAD_IF([$4], [Cannot find the Makefile generated by qmake.]) cd .. break fi # Find the DEFINES of Qt (should have been named CPPFLAGS). AC_CACHE_CHECK([for the DEFINES to use with Qt], [at_cv_env_QT_DEFINES], [at_cv_env_QT_DEFINES=`sed "/^DEFINES@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_DEFINES], [$at_cv_env_QT_DEFINES]) # Find the CFLAGS of Qt (We can use Qt in C?!) AC_CACHE_CHECK([for the CFLAGS to use with Qt], [at_cv_env_QT_CFLAGS], [at_cv_env_QT_CFLAGS=`sed "/^CFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_CFLAGS], [$at_cv_env_QT_CFLAGS]) # Find the CXXFLAGS of Qt. AC_CACHE_CHECK([for the CXXFLAGS to use with Qt], [at_cv_env_QT_CXXFLAGS], [at_cv_env_QT_CXXFLAGS=`sed "/^CXXFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_CXXFLAGS], [$at_cv_env_QT_CXXFLAGS]) # Find the INCPATH of Qt. AC_CACHE_CHECK([for the INCPATH to use with Qt], [at_cv_env_QT_INCPATH], [at_cv_env_QT_INCPATH=`sed "/^INCPATH@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_INCPATH], [$at_cv_env_QT_INCPATH]) AC_SUBST([QT_CPPFLAGS], ["$at_cv_env_QT_DEFINES $at_cv_env_QT_INCPATH"]) # Find the LFLAGS of Qt (Should have been named LDFLAGS) AC_CACHE_CHECK([for the LDFLAGS to use with Qt], [at_cv_env_QT_LDFLAGS], [at_cv_env_QT_LDFLAGS=`sed "/^LFLAGS@<:@^A-Z=@:>@*=/!d;$qt_sed_filter" $at_mfile`]) AC_SUBST([QT_LFLAGS], [$at_cv_env_QT_LDFLAGS]) AC_SUBST([QT_LDFLAGS], [$at_cv_env_QT_LDFLAGS]) # Find the LIBS of Qt. AC_CACHE_CHECK([for the LIBS to use with Qt], [at_cv_env_QT_LIBS], [at_cv_env_QT_LIBS=`sed "/^LIBS@<:@^A-Z@:>@*=/!d;$qt_sed_filter" $at_mfile` if test x$at_darwin = xyes; then # Fix QT_LIBS: as of today Libtool (GNU Libtool 1.5.23a) doesn't handle # -F properly. The "bug" has been fixed on 22 October 2006 # by Peter O'Gorman but we provide backward compatibility here. at_cv_env_QT_LIBS=`echo "$at_cv_env_QT_LIBS" \ | sed 's/^-F/-Wl,-F/;s/ -F/ -Wl,-F/g'` fi ]) AC_SUBST([QT_LIBS], [$at_cv_env_QT_LIBS]) cd .. && rm -rf conftest.dir # Run the user code $5 done # end hack (useless for to be able to use break) ]) # AT_REQUIRE_QT_VERSION(QT_version, RUN-IF-FAILED, RUN-IF-OK) # ----------------------------------------------------------- # Check (using qmake) that Qt's version "matches" QT_version. # Must be run AFTER AT_WITH_QT. Requires autoconf 2.60. # # RUN-IF-FAILED is arbitrary code to execute if Qt cannot be found or if any # problem happens. If this argument is omitted, then AC_MSG_ERROR will be # called. RUN-IF-OK is arbitrary code to execute if Qt was successfully found. AC_DEFUN([AT_REQUIRE_QT_VERSION], [ AC_PREREQ([2.60]) # this is a hack to get decent flow control with 'break' for _qt_ignored in once; do if test x"$QMAKE" = x; then AX_INSTEAD_IF([$2], [\$QMAKE is empty.\ Did you invoke AT@&t@_WITH_QT before AT@&t@_REQUIRE_QT_VERSION?]) break fi AC_CACHE_CHECK([for Qt's version], [at_cv_QT_VERSION], [echo "$as_me:$LINENO: Running $QMAKE --version:" >&AS_MESSAGE_LOG_FD $QMAKE --version >&AS_MESSAGE_LOG_FD 2>&1 qmake_version_sed=['/^.*\([0-9]\.[0-9]\.[0-9]\).*$/!d;s//\1/'] at_cv_QT_VERSION=`$QMAKE --version 2>&1 | sed "$qmake_version_sed"`]) if test x"$at_cv_QT_VERSION" = x; then AX_INSTEAD_IF([$2], [Cannot detect Qt's version.]) break fi AC_SUBST([QT_VERSION], [$at_cv_QT_VERSION]) AS_VERSION_COMPARE([$QT_VERSION], [$1], [AX_INSTEAD_IF([$2; break;], [This package requires Qt $1 or above.])]) # Run the user code $3 done # end hack (useless for to be able to use break) ]) # _AT_TWEAK_PRO_FILE(QT_VAR, VALUE) # --------------------------- # @internal. Tweak the variable QT_VAR in the .pro. # VALUE is an IFS-separated list of value and each value is rewritten # as follows: # +value => QT_VAR += value # -value => QT_VAR -= value # value => QT_VAR += value AC_DEFUN([_AT_TWEAK_PRO_FILE], [ # Tweak the value of $1 in the .pro file for $2. qt_conf='' for at_mod in $2; do at_mod=`echo "$at_mod" | sed 's/^-//; tough s/^+//; beef :ough s/^/$1 -= /;n :eef s/^/$1 += /'` qt_conf="$qt_conf $at_mod" done echo "$qt_conf" | sed 1d >>"$pro_file" ]) syncevolution-1.5/m4-repo/ax_boost_base.m40000644000373300001540000002415312326412403022055 0ustar00nightlynightly00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Test for the Boost C++ libraries of a particular version (or newer) # # If no path to the installed boost library is given the macro searchs # under /usr, /usr/local, /opt and /opt/local and evaluates the # $BOOST_ROOT environment variable. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) # # And sets: # # HAVE_BOOST # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2009 Peter Adolphs # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 20 AC_DEFUN([AX_BOOST_BASE], [ AC_ARG_WITH([boost], [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], [use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) @<:@ARG=yes@:>@ ])], [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ac_boost_path="" else want_boost="yes" ac_boost_path="$withval" fi ], [want_boost="yes"]) AC_ARG_WITH([boost-libdir], AS_HELP_STRING([--with-boost-libdir=LIB_DIR], [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), [ if test -d "$withval" then ac_boost_lib_path="$withval" else AC_MSG_ERROR(--with-boost-libdir expected directory name) fi ], [ac_boost_lib_path=""] ) if test "x$want_boost" = "xyes"; then boost_lib_version_req=ifelse([$1], ,1.20.0,$1) boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` if test "x$boost_lib_version_req_sub_minor" = "x" ; then boost_lib_version_req_sub_minor="0" fi WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) succeeded=no dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! libsubdirs="lib" ax_arch=`uname -m` if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = s390x -o $ax_arch = sparc64; then libsubdirs="lib64 lib lib64" fi dnl first we check the system location for boost libraries dnl this location ist chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM if test "$ac_boost_path" != ""; then BOOST_CPPFLAGS="-I$ac_boost_path/include" for ac_boost_path_tmp in $libsubdirs; do if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" break fi done elif test "$cross_compiling" != yes; then for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then for libsubdir in $libsubdirs ; do if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done fi dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter if test "$ac_boost_lib_path" != ""; then BOOST_LDFLAGS="-L$ac_boost_lib_path" fi CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes"; then _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done fi else if test "$cross_compiling" != yes; then for ac_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp best_path=$ac_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) fi if test "$succeeded" != "yes" ; then if test "$_version" = "0" ; then AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else AC_SUBST(BOOST_CPPFLAGS) AC_SUBST(BOOST_LDFLAGS) AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) syncevolution-1.5/m4-repo/ax_boost_locale.m40000644000373300001540000001047612326412403022405 0ustar00nightlynightly00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_locale.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_LOCALE # # DESCRIPTION # # Test for System library from the Boost C++ libraries. The macro requires # a preceding call to AX_BOOST_BASE. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_LOCALE_LIB) # # And sets: # # HAVE_BOOST_LOCALE # # LICENSE # # Copyright (c) 2012 Xiyue Deng # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 1 AC_DEFUN([AX_BOOST_LOCALE], [ AC_ARG_WITH([boost-locale], AS_HELP_STRING([--with-boost-locale@<:@=special-lib@:>@], [use the Locale library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-locale=boost_locale-gcc-mt ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_locale_lib="" else want_boost="yes" ax_boost_user_locale_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_BUILD]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_CACHE_CHECK(whether the Boost::Locale library is available, ax_cv_boost_locale, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[boost::locale::generator gen; std::locale::global(gen(""));]])], ax_cv_boost_locale=yes, ax_cv_boost_locale=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_locale" = "xyes"; then AC_SUBST(BOOST_CPPFLAGS) AC_DEFINE(HAVE_BOOST_LOCALE,,[define if the Boost::Locale library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` LDFLAGS_SAVE=$LDFLAGS if test "x$ax_boost_user_locale_lib" = "x"; then for libextension in `ls $BOOSTLIBDIR/libboost_locale*.so* $BOOSTLIBDIR/libboost_locale*.dylib* $BOOSTLIBDIR/libboost_locale*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_locale.*\)\.so.*$;\1;' -e 's;^lib\(boost_locale.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_locale.*\)\.a.*$;\1;'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_LOCALE_LIB="-l$ax_lib"; AC_SUBST(BOOST_LOCALE_LIB) link_locale="yes"; break], [link_locale="no"]) done if test "x$link_locale" != "xyes"; then for libextension in `ls $BOOSTLIBDIR/boost_locale*.dll* $BOOSTLIBDIR/boost_locale*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_locale.*\)\.dll.*$;\1;' -e 's;^\(boost_locale.*\)\.a.*$;\1;'` boost_locale; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_LOCALE_LIB="-l$ax_lib"; AC_SUBST(BOOST_LOCALE_LIB) link_locale="yes"; break], [link_locale="no"]) done fi else for ax_lib in $ax_boost_user_locale_lib boost_locale-$ax_boost_user_locale_lib; do AC_CHECK_LIB($ax_lib, exit, [BOOST_LOCALE_LIB="-l$ax_lib"; AC_SUBST(BOOST_LOCALE_LIB) link_locale="yes"; break], [link_locale="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the library!) fi if test "x$link_locale" = "xno"; then AC_MSG_ERROR(Could not link against $ax_lib !) fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) syncevolution-1.5/m4-repo/dk-warn.m40000644000373300001540000000712512326412403020610 0ustar00nightlynightly00000000000000## Copyright (c) 2004-2007 Daniel Elstner ## ## This file is part of danielk's Autostuff. ## ## danielk's Autostuff 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. ## ## danielk's Autostuff 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 danielk's Autostuff; if not, write to the Free Software Foundation, ## Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #serial 20070116 ## DK_ARG_ENABLE_WARNINGS(variable, min-flags, max-flags, [deprecation-prefixes]) ## ## Provide the --enable-warnings configure argument, set to "min" by default. ## and should be space-separated lists of compiler ## warning flags to use with --enable-warnings=min or --enable-warnings=max, ## respectively. Warning level "fatal" is the same as "max" but in addition ## enables -Werror mode. ## ## If not empty, should be a list of module prefixes ## which is expanded to -D_DISABLE_DEPRECATED flags if fatal warnings ## are enabled, too. ## AC_DEFUN([DK_ARG_ENABLE_WARNINGS], [dnl m4_if([$3],, [AC_FATAL([3 arguments expected])])[]dnl dnl AC_ARG_ENABLE([warnings], [AS_HELP_STRING( [--enable-warnings=@<:@min|max|fatal|no@:>@], [control compiler pickyness @<:@min@:>@])], [dk_enable_warnings=$enableval], [dk_enable_warnings=min])[]dnl dk_lang= case $ac_compile in *'$CXXFLAGS '*) dk_lang='C++' dk_cc=$CXX dk_conftest=conftest.${ac_ext-cc} ;; *'$CFLAGS '*) dk_lang=C dk_cc=$CC dk_conftest=conftest.${ac_ext-c} ;; esac AS_IF([test "x$dk_lang" != x], [ AC_MSG_CHECKING([which $dk_lang compiler warning flags to use]) case $dk_enable_warnings in no) dk_warning_flags=;; max) dk_warning_flags="$3";; fatal) dk_warning_flags="$3 -Werror";; *) dk_warning_flags="$2";; esac dk_deprecation_flags= m4_if([$4],,, [ AS_IF([test "x$dk_enable_warnings" = xfatal], [ dk_deprecation_prefixes="$4" for dk_prefix in $dk_deprecation_prefixes do dk_deprecation_flags="${dk_deprecation_flags}-D${dk_prefix}_DISABLE_DEPRECATED " done ]) ])[]dnl dk_tested_flags= AS_IF([test "x$dk_warning_flags" != x], [ # Keep in mind that the dummy source must be devoid of any # problems that might cause diagnostics. AC_LANG_CONFTEST([AC_LANG_SOURCE( [[int main(int argc, char** argv) { return (argv != 0) ? argc : 0; }]])]) for dk_flag in $dk_warning_flags do # Test whether the compiler accepts the flag. GCC doesn't bail # out when given an unsupported flag but prints a warning, so # check the compiler output instead. dk_cc_out=`$dk_cc $dk_tested_flags $dk_flag -c "$dk_conftest" 2>&1 || echo failed` rm -f "conftest.${OBJEXT-o}" AS_IF([test "x$dk_cc_out" = x], [ AS_IF([test "x$dk_tested_flags" = x], [dk_tested_flags=$dk_flag], [dk_tested_flags="$dk_tested_flags $dk_flag"]) ], [ echo "$dk_cc_out" >&AS_MESSAGE_LOG_FD ]) done rm -f "$dk_conftest" ]) dk_all_flags=$dk_deprecation_flags$dk_tested_flags AC_SUBST([$1], [$dk_all_flags]) test "x$dk_all_flags" != x || dk_all_flags=none AC_MSG_RESULT([$dk_all_flags]) ]) ]) syncevolution-1.5/m4-repo/se_macros.m40000644000373300001540000001436212326412403021221 0ustar00nightlynightly00000000000000#serial 20110803 ## _SE_VERSIONS(MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION, NANO_VERSION) ## ## exports MICRO_VERSION and NANO_VERSION to se_test_micro_version and ## se_test_nano_version defines respectively. If any of passed parameters are ## empty, those defines are defined as '0'. MAJOR_VERSION and MINOR_VERSION are ## ignored. ## m4_define([_SE_VERSIONS], [dnl m4_ifval([$3], [dnl nonempty part m4_define([se_test_micro_version], [$3]) ], [dnl empty part m4_define([se_test_micro_version], [0]) ] )[]dnl m4_ifval([$4], [dnl nonempty part m4_define([se_test_nano_version], [$4]) ], [dnl empty part m4_define([se_test_nano_version], [0]) ] )[]dnl ] )[]dnl ## SE_CHECK_FOR_STABLE_RELEASE ## ## No-op if STABLE_RELEASE is already defined. ## ## Defines STABLE_RELEASE to 'no' if the nano version is 99 (1.1.99.5 is ## an unstable, pre-release version) or the current version is dirty ## (something is appended by gen-git-version.sh). ## ## If above fails, then STABLE_RELEASE is defined to 'yes'. ## AC_DEFUN([SE_CHECK_FOR_STABLE_RELEASE], [m4_ifndef([STABLE_RELEASE], [dnl ifndef part m4_define([se_test_plus_index], m4_index(AC_PACKAGE_VERSION, [+]))[]dnl m4_if(se_test_plus_index, [-1], [dnl if part m4_define([se_test_version], AC_PACKAGE_VERSION) ], [dnl else part m4_define([se_test_version], m4_substr(AC_PACKAGE_VERSION, [0], se_test_plus_index)) m4_define([se_test_dirty_version], [yes]) ] )[]dnl _SE_VERSIONS(m4_bpatsubst(se_test_version, [[^0-9A-Za-z]+], [,]))[]dnl m4_if(se_test_micro_version, [99], [dnl if part m4_define([se_test_nano_number], m4_translit(se_test_nano_version, [A-Za-z])) dnl m4_if(m4_eval(se_test_nano_number [>= 5]), [1], dnl [dnl if part dnl m4_define([STABLE_RELEASE], [yes]) dnl ] dnl ) ], [dnl else part m4_ifndef([se_test_dirty_version], [dnl ifndef part m4_define([STABLE_RELEASE], [yes]) ] ) ] )[]dnl m4_ifndef([STABLE_RELEASE], [dnl ifndef part m4_define([STABLE_RELEASE], [no]) ] ) dnl macros cleanup m4_ifdef([se_test_plus_index], [dnl ifdef part m4_undefine([se_test_plus_index]) ] )[]dnl m4_ifdef([se_test_version], [dnl ifdef part m4_undefine([se_test_version]) ] )[]dnl m4_ifdef([se_test_dirty_version], [dnl ifdef part m4_undefine([se_test_dirty_version]) ] )[]dnl m4_ifdef([se_test_micro_version], [dnl ifdef part m4_undefine([se_test_micro_version]) ] )[]dnl m4_ifdef([se_test_nano_version], [dnl ifdef part m4_undefine([se_test_nano_version]) ] )[]dnl m4_ifdef([se_test_nano_number], [dnl ifdef part m4_undefine([se_test_nano_number]) ] )[]dnl ] )[]dnl ] ) ## SE_ENABLE_BACKENDS_PRE ## ## Marks BACKEND_DEFINES and SYNCSOURCES as variables to be substituted. ## For internal use only. ## AC_DEFUN([SE_ENABLE_BACKENDS_PRE], [AC_SUBST(SYNCSOURCES) AC_SUBST(BACKEND_DEFINES) BACKENDS='' BACKEND_DEFINES='' SYNCSOURCES='' ]) ## SE_ARG_ENABLE_BACKEND(BACKEND, DIR, HELP-STRING, [ACTION-IF-GIVEN], ## [ACTION-IF-NOT-GIVEN]) ## ## Same as AC_ARG_ENABLE(), but also tells configure that the ## backend exists. ## ## BACKEND = name of modules built in that dir as .la files without the ## obligatory sync prefix, e.g. "ebook" ## DIR = name of the directory inside src/backends, e.g., "evolution" ## AC_DEFUN([SE_ARG_ENABLE_BACKEND], [AC_REQUIRE([SE_ENABLE_BACKENDS_PRE]) AC_ARG_ENABLE($1, $3, $4, $5) BACKENDS="$BACKENDS $1" BACKEND_DEFINES="$BACKEND_DEFINES ENABLE_[]m4_translit($1, [a-z], [A-Z])" for source in $2 do SYNCSOURCES="$SYNCSOURCES src/backends/$2/sync$1.la" done ] ) ## SE_ADD_BACKENDS ## ## Adds backends available under src/backends. See build/gen-backends.sh script. ## AC_DEFUN([SE_ADD_BACKENDS], [m4_esyscmd(build/gen-backends.sh) ] ) ## SE_GENERATE_AM_FILES ## ## Generates some .am files needed by automake. ## AC_DEFUN([SE_GENERATE_AM_FILES], [m4_syscmd(build/gen-backends-am.sh) ] ) ## SE_GENERATE_LINGUAS ## ## Generates LINGUAS file. ## AC_DEFUN([SE_GENERATE_LINGUAS], [m4_syscmd(build/gen-linguas.sh) ] ) syncevolution-1.5/po/0000755000373300037200000000000012424707642016322 5ustar00nightlyallusers00000000000000syncevolution-1.5/po/LINGUAS.README0000644000373300001540000000024512326412403020113 0ustar00nightlynightly00000000000000For translators: LINGUAS file is generated, so putting .po file here is enough. To test translation please run ./autogen.sh in top level directory of the project. syncevolution-1.5/po/Makefile.in.in0000644000373300001540000001604612424700451020614 0ustar00nightlynightly00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT="$(INTLTOOL_EXTRACT)" XGETTEXT="$(XGETTEXT)" srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ INTLTOOL_V_MSGFMT = $(INTLTOOL__v_MSGFMT_$(V)) INTLTOOL__v_MSGFMT_= $(INTLTOOL__v_MSGFMT_$(AM_DEFAULT_VERBOSITY)) INTLTOOL__v_MSGFMT_0 = @echo " MSGFMT" $@; .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(INTLTOOL_V_MSGFMT)$(MSGFMT) -o $@ $< .po.gmo: $(INTLTOOL_V_MSGFMT)file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: syncevolution-1.5/po/POTFILES.in0000644000373300001540000000074212326412403017711 0ustar00nightlynightly00000000000000src/gtk-ui/main.c src/gtk-ui/sync-ui.c src/gtk-ui/sync-ui-config.c src/gtk-ui/ui.xml src/gtk-ui/sync.desktop.in src/gtk-ui/sync-gtk.desktop.in src/gtk-ui/sync-config-widget.c src/gtk3-ui/main.c src/gtk3-ui/sync-ui.c src/gtk3-ui/sync-ui-config.c src/gtk3-ui/ui.xml src/gtk3-ui/sync.desktop.in src/gtk3-ui/sync-gtk.desktop.in src/gtk3-ui/sync-config-widget.c src/gnome-bluetooth/syncevolution.c src/dbus/server/notification-backend-libnotify.cpp src/dbus/server/auto-sync-manager.cpp syncevolution-1.5/po/ar.po0000644000373300001540000004304112326412403017075 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-10-16 11:24+0000\n" "PO-Revision-Date: 2009-11-16 16:28+0200\n" "Last-Translator: Yousef Abu Al Naser \n" "Language-Team: ITSOFTEX \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" "X-Poedit-Language: Arabic\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 #: ../src/gtk-ui/ui.glade.h:28 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "تزامن" #: ../src/gtk-ui/sync-ui.c:259 msgid "Addressbook" msgstr "Ø¯ÙØªØ± العناوين" #: ../src/gtk-ui/sync-ui.c:261 msgid "Calendar" msgstr "التقويم" #: ../src/gtk-ui/sync-ui.c:263 msgid "Todo" msgstr "للعمل" #: ../src/gtk-ui/sync-ui.c:265 msgid "Memo" msgstr "ملاحظة" #: ../src/gtk-ui/sync-ui.c:320 msgid "Failed to save current service in GConf configuration system" msgstr "ÙØ´Ù„ ÙÙŠ Ø­ÙØ¸ الخدمة الحالية ÙÙŠ نظام مكونات GConf" #: ../src/gtk-ui/sync-ui.c:331 msgid "Failed to save service configuration to SyncEvolution" msgstr "ÙØ´Ù„ ÙÙŠ Ø­ÙØ¸ مكونات الخدمة لسينك اÙولوشن" #: ../src/gtk-ui/sync-ui.c:416 msgid "Failed to get service configuration from SyncEvolution" msgstr "ÙØ´Ù„ ÙÙŠ الحصول على مكونات الخدمة من سينك اÙولوشن" #: ../src/gtk-ui/sync-ui.c:480 msgid "Failed to remove service configuration from SyncEvolution" msgstr "ÙØ´Ù„ ÙÙŠ ازالة مكونات الخدمة من سينك اÙولوشن" #: ../src/gtk-ui/sync-ui.c:600 msgid "Service must have a name and server URL" msgstr "يتوجب على الخدمة ان يكون لها اسم وعنوان خادم" #. sync is no longer in progress for some reason #: ../src/gtk-ui/sync-ui.c:676 msgid "Failed to cancel: sync was no longer in progress" msgstr "ÙØ´Ù„ ÙÙŠ الالغاء. لم يكن التزامن ÙÙŠ التقدم." #: ../src/gtk-ui/sync-ui.c:680 msgid "Failed to cancel sync" msgstr "ÙØ´Ù„ ÙÙŠ إلغاء التزامن" #: ../src/gtk-ui/sync-ui.c:684 msgid "Canceling sync" msgstr "جاري إلغاء التزامن" #: ../src/gtk-ui/sync-ui.c:698 msgid "Trying to cancel sync" msgstr "محاولة إلغاء التزامن" #: ../src/gtk-ui/sync-ui.c:705 #, c-format msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised." msgstr "هل ترغب بمحي كل البيانات المحلية واستبدالها ببيانات من %sØŸ بشكل عام هذا شيء غير محبذ. " #: ../src/gtk-ui/sync-ui.c:710 #, c-format msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised." msgstr "هل ترغب بمحي كل البيانات ÙÙŠ %s وتبديلها ببياناتك المحلية؟ بشكل عام لا ننصح بذلك." #: ../src/gtk-ui/sync-ui.c:727 msgid "No, cancel sync" msgstr "كلا, إلغاء التزامن" #: ../src/gtk-ui/sync-ui.c:728 msgid "Yes, delete and replace" msgstr "نعم، امح واستبدل" #: ../src/gtk-ui/sync-ui.c:750 msgid "No sources are enabled, not syncing" msgstr "لا يوجد مصادر Ù…ÙØ¹Ù‘لة، لم يجر التزامن" #: ../src/gtk-ui/sync-ui.c:767 msgid "A sync is already in progress" msgstr "عملية تزامن أخرى جارية" #: ../src/gtk-ui/sync-ui.c:769 msgid "Failed to start sync" msgstr "ÙØ´Ù„ ÙÙŠ بدء التزامن" #: ../src/gtk-ui/sync-ui.c:774 msgid "Starting sync" msgstr "بدء التزامن" #: ../src/gtk-ui/sync-ui.c:799 msgid "Last synced just seconds ago" msgstr "آخر تزامن منذ بضعة ثواني" #: ../src/gtk-ui/sync-ui.c:802 msgid "Last synced a minute ago" msgstr "آخر تزامن منذ دقيقة" #: ../src/gtk-ui/sync-ui.c:805 #, c-format msgid "Last synced %ld minutes ago" msgstr "آخر تزامن منذ %ld دقائق" #: ../src/gtk-ui/sync-ui.c:808 msgid "Last synced an hour ago" msgstr "آخر تزامن منذ ساعة" #: ../src/gtk-ui/sync-ui.c:811 #, c-format msgid "Last synced %ld hours ago" msgstr "آخر تزامن منذ %ld ساعات" #: ../src/gtk-ui/sync-ui.c:814 msgid "Last synced a day ago" msgstr "آخر تزامن منذ يوم" #: ../src/gtk-ui/sync-ui.c:817 #, c-format msgid "Last synced %ld days ago" msgstr "آخر تزامن منذ %ld أيام" #: ../src/gtk-ui/sync-ui.c:902 msgid "Sync again" msgstr "تزامن مرة أخرى" #: ../src/gtk-ui/sync-ui.c:904 #: ../src/gtk-ui/ui.glade.h:29 msgid "Sync now" msgstr "تزامن الآن" #: ../src/gtk-ui/sync-ui.c:913 msgid "Syncing" msgstr "جاري التزامن" #: ../src/gtk-ui/sync-ui.c:919 msgid "Cancel sync" msgstr "إلغاء التزامن" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:1266 #, c-format msgid "%s (not supported by this service)" msgstr "%s (غير معتمد ÙÙŠ هذه الخدمة)" #: ../src/gtk-ui/sync-ui.c:1299 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "كان هنالك %d عمليات Ø±ÙØ¶ عن بعد" msgstr[1] "كان هنالك عملية Ø±ÙØ¶ واحدة" msgstr[2] "كان هنالك عمليتا Ø±ÙØ¶ عن بعد" msgstr[3] "كان هنالك %d عمليات Ø±ÙØ¶ عن بعد" msgstr[4] "كان هنالك %d عملية Ø±ÙØ¶ عن بعد" msgstr[5] "كان هنالك %d عملية Ø±ÙØ¶ عن بعد" #: ../src/gtk-ui/sync-ui.c:1304 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "كان هنالك %d عمليات Ø±ÙØ¶ محلية" msgstr[1] "كان هنالك عملية Ø±ÙØ¶ محلية واحدة" msgstr[2] "كان هنالك عمليتا Ø±ÙØ¶ محليتان" msgstr[3] "كان هنالك %d عمليات Ø±ÙØ¶ محلية" msgstr[4] "كان هنالك %d عملية Ø±ÙØ¶ محلية" msgstr[5] "كان هنالك %d عملية Ø±ÙØ¶ محلية" #: ../src/gtk-ui/sync-ui.c:1309 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "كان هنالك %d عمليات Ø±ÙØ¶ محلية Ùˆ %d عمليات Ø±ÙØ¶ عن بعد" #: ../src/gtk-ui/sync-ui.c:1314 #, c-format msgid "Last time: No changes." msgstr "آخر مرة: بدون تغيير" #: ../src/gtk-ui/sync-ui.c:1316 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "آخر مرة: ارسلت %d تغييرات" msgstr[1] "آخر مرة ارسلت تغيير واحد" msgstr[2] "آخر مرة ارسلت تغييران" msgstr[3] "آخر مرة: ارسلت %d تغييرات" msgstr[4] "آخر مرة ارسلت %d تغيير" msgstr[5] "آخر مرة ارسلت %d تغيير" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:1324 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "آخر مرة: طبقت %d تغييرات" msgstr[1] "آخر مرة: طبقت تغيير واحد" msgstr[2] "آخر مرة: طبقت تغييران" msgstr[3] "آخر مرة: طبقت %d تغييرات" msgstr[4] "آخر مرة: طبقت %d تغيير" msgstr[5] "آخر مرة: طبقت %d تغيير" #: ../src/gtk-ui/sync-ui.c:1329 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "آخر مرة: طبقت %d تغييرات وارسلت %d تغييرات" #: ../src/gtk-ui/sync-ui.c:1421 msgid "Failed to get server configuration from SyncEvolution" msgstr "ÙØ´Ù„ ÙÙŠ الحصول على مكونات الخادم من سينك اÙولوشن" #: ../src/gtk-ui/sync-ui.c:1473 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync." msgstr "ScheduleWorld يمكّنك من ابقاء جهات الاتصال، احداث، مهام والملاحظات ÙÙŠ تزامن" #: ../src/gtk-ui/sync-ui.c:1476 msgid "Google Sync can back up and synchronize your Address Book with your Gmail contacts." msgstr "بامكان جوجل سينك ان يقوم بنسخ احتياطية وتزامن Ù„Ø¯ÙØªØ± العناوين مع حسابك ÙÙŠ Gmail" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-ui.c:1482 msgid "Back up your contacts and calendar. Sync with a singleclick, anytime, anywhere (DEMO)." msgstr "قم باعداد نسخ احتياطية لجهات الاتصال والتقويم الخاص بك. تزامن بنقرة واحدة, ÙÙŠ اي وقت واي مكان." #: ../src/gtk-ui/sync-ui.c:1510 msgid "New service" msgstr "خدمة جديدة" #: ../src/gtk-ui/sync-ui.c:1557 msgid "Server URL" msgstr "عنوان الخادم" #. TRANSLATORS: placeholder is a source name in settings window #: ../src/gtk-ui/sync-ui.c:1579 #, c-format msgid "%s URI" msgstr "عنوان %s " #: ../src/gtk-ui/sync-ui.c:1716 #: ../src/gtk-ui/ui.glade.h:17 msgid "Launch website" msgstr "ÙØªØ­ الموقع" #: ../src/gtk-ui/sync-ui.c:1720 msgid "Setup and use" msgstr "اضبط واستخدم" #: ../src/gtk-ui/sync-ui.c:1766 msgid "Failed to get list of manually setup services from SyncEvolution" msgstr "ÙØ´Ù„ ÙÙŠ الحصول على قائمة الخدمات المضبوطة يدويا من سينك اÙولوشن" #: ../src/gtk-ui/sync-ui.c:1807 msgid "Failed to get list of supported services from SyncEvolution" msgstr "ÙØ´Ù„ ÙÙŠ الحصول على قائمة الخدمات المدعومة من سينك اÙولوشن" #. TODO: this is a hack... SyncEnd should be a signal of it's own, #. not just hacked on top of the syncevolution error codes #: ../src/gtk-ui/sync-ui.c:1968 msgid "Service configuration not found" msgstr "تكوين الخدمة غير موجود" #: ../src/gtk-ui/sync-ui.c:1974 msgid "Not authorized" msgstr "غير مخوّل" #: ../src/gtk-ui/sync-ui.c:1976 msgid "Forbidden" msgstr "محظور" #: ../src/gtk-ui/sync-ui.c:1978 msgid "Not found" msgstr "غير موجود" #: ../src/gtk-ui/sync-ui.c:1980 msgid "Fatal database error" msgstr "خطأ ÙØ§Ø¯Ø­ ÙÙŠ قاعدة البيانات" #: ../src/gtk-ui/sync-ui.c:1982 msgid "Database error" msgstr "مشكلة ÙÙŠ قاعدة البيانات" #: ../src/gtk-ui/sync-ui.c:1984 msgid "No space left" msgstr "لم يبق مكان" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1987 msgid "Failed to process SyncML" msgstr "ÙØ´Ù„ ÙÙŠ تحليل SyncML" #: ../src/gtk-ui/sync-ui.c:1989 msgid "Server authorization failed" msgstr "ÙØ´Ù„ ÙÙŠ تخويل الخادم" #: ../src/gtk-ui/sync-ui.c:1991 msgid "Failed to parse configuration file" msgstr "ÙØ´Ù„ ÙÙŠ تحليل مل٠المكونات" #: ../src/gtk-ui/sync-ui.c:1993 msgid "Failed to read configuration file" msgstr "ÙØ´Ù„ ÙÙŠ قراءة مل٠المكونات" #: ../src/gtk-ui/sync-ui.c:1995 msgid "No configuration found" msgstr "لا يوجد مكوّنات" #: ../src/gtk-ui/sync-ui.c:1997 msgid "No configuration file found" msgstr "مل٠التكوين غير موجود" #: ../src/gtk-ui/sync-ui.c:1999 msgid "Server sent bad content" msgstr "ارسل الخادم مضمون غير صالح" #: ../src/gtk-ui/sync-ui.c:2001 msgid "Transport failure (no connection?)" msgstr "ÙØ´Ù„ ÙÙŠ النقل (لا يوجد اتصال؟)" #: ../src/gtk-ui/sync-ui.c:2003 msgid "Connection timed out" msgstr "انقضاء مهلة الاتصال" #: ../src/gtk-ui/sync-ui.c:2005 msgid "Connection certificate has expired" msgstr "انتهت صلاحية رخصة الاتصال" #: ../src/gtk-ui/sync-ui.c:2007 msgid "Connection certificate is invalid" msgstr "رخصة الاتصال غير صالحة" #: ../src/gtk-ui/sync-ui.c:2010 msgid "Connection failed" msgstr "ÙØ´Ù„ ÙÙŠ الاتصال" #: ../src/gtk-ui/sync-ui.c:2012 msgid "URL is bad" msgstr "العنوان خاطئ" #: ../src/gtk-ui/sync-ui.c:2014 msgid "Server not found" msgstr "لم يتم ايجاد الخادم" #: ../src/gtk-ui/sync-ui.c:2016 #, c-format msgid "Error %d" msgstr "خطأ %d" #: ../src/gtk-ui/sync-ui.c:2026 msgid "Sync D-Bus service exited unexpectedly" msgstr "تزامن مع خدمة D-Bus انتهى بطريقة غير متوقعة" #: ../src/gtk-ui/sync-ui.c:2029 #: ../src/gtk-ui/sync-ui.c:2080 msgid "Sync Failed" msgstr "ÙØ´Ù„ ÙÙŠ التزامن" #: ../src/gtk-ui/sync-ui.c:2072 msgid "Sync complete" msgstr "اكتمل التزامن" #: ../src/gtk-ui/sync-ui.c:2077 msgid "Sync canceled" msgstr "تم إلغاء التزامن" #. NOTE extra1 can be error here #: ../src/gtk-ui/sync-ui.c:2095 msgid "Ending sync" msgstr "إنهاء التزامن" #. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text #: ../src/gtk-ui/sync-ui.c:2119 #, c-format msgid "Preparing '%s'" msgstr "تحضير '%s'" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2131 #, c-format msgid "Sending '%s'" msgstr "ارسال '%s'" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2143 #, c-format msgid "Receiving '%s'" msgstr "جاري الحصول '%s'" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "بيانات" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "لا يوجد خدمة تزامن ÙÙŠ الاستخدام" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "ÙØ´Ù„ ÙÙŠ التزامن" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "ÙØ¦Ø© التزامن" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "إعداد يدوي" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "الخدمات المعتمدة" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Ø§Ø¶Ø§ÙØ© خدمة جديدة" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "عودة للتزامن" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "تغيير خدمة\n" "التزامن" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "محي كل البيانات المحلية وتبديلها ببيانات عن بعد" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "محي كل البيانات عن بعد واستبدالها ببيانات محلية" #: ../src/gtk-ui/ui.glade.h:13 msgid "Delete this service" msgstr "حذ٠هذه الخدمة" #: ../src/gtk-ui/ui.glade.h:14 msgid "Edit service settings" msgstr "تحرير إعدادات الخدمة" #: ../src/gtk-ui/ui.glade.h:15 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "ان كنت لا ترى اسم خدمتك ÙÙŠ الأعلى لكنك تعر٠ان مزود التزامن يستخدم SyncML\n" "بامكانك ضبط الخدمة بشكل يدوي." #: ../src/gtk-ui/ui.glade.h:18 msgid "Merge local and remote data (recommended)" msgstr "دمج البيانات المحلية والبعيدة (Ù…ÙØ¶Ù„)" #: ../src/gtk-ui/ui.glade.h:19 msgid "Password" msgstr "كلمة السر" #: ../src/gtk-ui/ui.glade.h:20 msgid "Reset original server settings" msgstr "اعادة إعدادات الخادم الأصلية" #: ../src/gtk-ui/ui.glade.h:21 msgid "Save and use this service" msgstr "Ø§Ø­ÙØ¸ واستخدم هذه الخدمة" #: ../src/gtk-ui/ui.glade.h:22 msgid "Select sync service" msgstr "أختر خدمة تزامن" #: ../src/gtk-ui/ui.glade.h:23 msgid "Server settings" msgstr "اعدادات الخادم" #: ../src/gtk-ui/ui.glade.h:24 msgid "Service name" msgstr "اسم الخدمة" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "نأسÙ, للتزامن تحتاج\n" "لاتصال انترنت" #: ../src/gtk-ui/ui.glade.h:27 msgid "Stop using this service" msgstr "توق٠عن استخدام هذه الخدمة" #: ../src/gtk-ui/ui.glade.h:30 msgid "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "نأسÙ, التزامن غير Ù…ØªÙˆÙØ± (خدمة D-Bus لم تتجاوب)" #: ../src/gtk-ui/ui.glade.h:31 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "للتزامن تحتاج الى اتصال شبكة وحساب ÙÙŠ خدمة تزامن\n" "نحن ندعم الخدمات التالية:" #: ../src/gtk-ui/ui.glade.h:33 msgid "Username" msgstr "اسم المستخدم" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" "لم يتم اختيار خدمة تزامن بعد. خدمات التزامن تمنحك القدرة\n" "على تزامن بيانات من حاسبوبك الشبكي وخدمة شبكية." #: ../src/gtk-ui/sync.desktop.in.h:2 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "محتلن" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "تزامن (جي تي كي)" syncevolution-1.5/po/ast.po0000644000373300001540000007627012326412403017274 0ustar00nightlynightly00000000000000msgid "" msgstr "" "Project-Id-Version: syncevolution.master\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2010-05-22 09:19+0000\n" "PO-Revision-Date: \n" "Last-Translator: astur \n" "Language-Team: Softastur \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Asturian\n" "X-Poedit-SourceCharset: utf-8\n" "Plural-Forms: nplurals=2; plural=n!=1;\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 #: ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Sincronizador" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contautos" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Cites" #: ../src/gtk-ui/sync-ui.c:270 #: ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Xeres" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notes" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Cites y xeres" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Aniciando..." #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Quies una sincronización lenta con %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Sí, facer sincronización lenta" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Non, encaboxar la sincronización" #. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised." msgstr "¿Quies desaniciar tolos datos llocales y sustituyilos polos datos de %s? Esto nun ye mui recomendable." #: ../src/gtk-ui/sync-ui.c:429 #: ../src/gtk-ui/sync-ui.c:460 msgid "Yes, delete and replace" msgstr "Sí, desaniciar y camudar" #: ../src/gtk-ui/sync-ui.c:429 #: ../src/gtk-ui/sync-ui.c:460 #: ../src/gtk-ui/sync-ui.c:1605 msgid "No" msgstr "Non" #. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:455 #, c-format msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised." msgstr "¿Quies desaniciar tolos datos de %s y sustituyilos polos datos llocales? Esto nun ye mui recomendable." # We are trying to cancel the synchronization #: ../src/gtk-ui/sync-ui.c:487 msgid "Trying to cancel sync" msgstr "Tamos intentando encaboxar la sincronización" # There is no space left #: ../src/gtk-ui/sync-ui.c:529 msgid "No service or device selected" msgstr "Nun s'esbilló dengún serviciu o preséu" # Last synchronization happened a few seconds ago #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:537 #, c-format msgid "%s - synced just now" msgstr "%s - sincronizóse fai unos segundos" # Last synchronization happened one minute ago #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced a minute ago" msgstr "%s - sincronizóse fai un minutu" # Last synchronization happened %ld minutes ago #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - sincronizóse fai %ld minutos" # Last synchronization happened one hour ago #: ../src/gtk-ui/sync-ui.c:550 #, c-format msgid "%s - synced an hour ago" msgstr "%s - sincronizóse fai una hora" # Last synchronization happened %ld hours ago #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - sincronizóse fai %ld hores" # Last synchronization happened one day ago #: ../src/gtk-ui/sync-ui.c:559 #, c-format msgid "%s - synced a day ago" msgstr "%s - sincronizóse fai un día" # Last synchronization happened %ld days ago #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - sincronizóse fai %ld díes" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:612 #: ../src/gtk-ui/sync-ui.c:726 msgid "Sync now" msgstr "Sincronizar" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:618 #: ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Sincronización lenta" #: ../src/gtk-ui/sync-ui.c:619 msgid "Other options..." msgstr "Otres opciones..." # "Select a service". Omitted 'syn' because there's no room in the button for proper display. The context is clear and this will not impair understanding by the user. #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:624 msgid "Select sync service" msgstr "Esbillar un serviciu" # Edit the configuration of the service #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:629 msgid "Edit service settings" msgstr "Editar la configuración del serviciu" # There's no sync service yet between the netbook and a web service. #: ../src/gtk-ui/sync-ui.c:700 msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices." msgstr "Entá nun escoyisti dengún serviciu o preséu de sincronización. Estos servicios permítente sincronizar los datos ente'l miniportátil y un serviciu web. Tamién puede facese direutamente con dellos preseos." #: ../src/gtk-ui/sync-ui.c:722 msgid "Sync again" msgstr "¡Sincronízate!" #: ../src/gtk-ui/sync-ui.c:743 msgid "Restoring" msgstr "Restaurando" # Synchronization is taking place #: ../src/gtk-ui/sync-ui.c:745 msgid "Syncing" msgstr "Sincronizando" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:757 #: ../src/gtk-ui/sync-ui.c:3399 msgid "Cancel sync" msgstr "Encaboxar la sincronización" #: ../src/gtk-ui/sync-ui.c:922 msgid "Back to sync" msgstr "Volver a la sincronización" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1224 msgid "Automatic sync" msgstr "" "Sincronización\n" "automática" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1519 #, c-format msgid "Affected data: %s %s" msgstr "Datos afeutaos: %s %s" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: none" msgstr "Datos afeutaos: dengún" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1602 #, c-format msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost." msgstr "¿Quies restaurar la copia de seguridá de %s? Tolos cambeos que tengas fechos dende entós van perdese." #: ../src/gtk-ui/sync-ui.c:1605 msgid "Yes, restore" msgstr "Sí, restaurar" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1637 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1656 #, c-format msgid "Backed up before syncing with %s" msgstr "Copia de seguridá fecha enantes de sincronizar con %s" #: ../src/gtk-ui/sync-ui.c:1673 msgid "Restore" msgstr "Restaurar" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1780 #, c-format msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible." msgstr "Una sincronización normal con %s nun ye dable nesti intre. Puedes facer una sincronización lenta de dos víes o entamar de cero. Tamién puedes restaurar una copia de seguridá, pero igual se fai necesaria una sincronización lenta o entamar de cero enantes de que seya dable una sincronización normal." #: ../src/gtk-ui/sync-ui.c:1790 #, c-format msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup." msgstr "Si asocede daqué realmente malo, puedes intentar una sincronización lenta, entamar de cero o restaurar la copia de seguridá." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1799 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Desaniciar tolos datos\n" "llocales y trocalos con\n" "datos de %s" #: ../src/gtk-ui/sync-ui.c:1805 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Desaniciar tolos datos en\n" "%s y trocalos\n" "colos tos datos llocales" #: ../src/gtk-ui/sync-ui.c:2267 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Error al obtener la llista de servicios compatibles de SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2321 msgid "There was a problem communicating with the sync process. Please try again later." msgstr "Hebo un problema de comunicación nel procesu de sincronización. Inténtalo más sero." #: ../src/gtk-ui/sync-ui.c:2380 msgid "Restore failed" msgstr "Falló al Restaurar" #: ../src/gtk-ui/sync-ui.c:2383 #: ../src/gtk-ui/sync-ui.c:3268 msgid "Sync failed" msgstr "Falló al Sincronizar" #: ../src/gtk-ui/sync-ui.c:2389 msgid "Restore complete" msgstr "Restauráu completu" #: ../src/gtk-ui/sync-ui.c:2392 msgid "Sync complete" msgstr "¡Sincronizáu!" #: ../src/gtk-ui/sync-ui.c:2484 #, c-format msgid "Preparing '%s'" msgstr "Tresnando '%s'" #: ../src/gtk-ui/sync-ui.c:2487 #, c-format msgid "Receiving '%s'" msgstr "Recibiendo '%s'" #: ../src/gtk-ui/sync-ui.c:2490 #, c-format msgid "Sending '%s'" msgstr "Unviando '%s'" #: ../src/gtk-ui/sync-ui.c:2611 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Hebo un rechazu remotu." msgstr[1] "Hebo %ld rechazos remotos." #: ../src/gtk-ui/sync-ui.c:2616 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Hebo un rechazu llocal." msgstr[1] "Hebo %ld rechazos llocales." #: ../src/gtk-ui/sync-ui.c:2621 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Hebo %ld rechazos llocales y %ld rechazos remotos." #: ../src/gtk-ui/sync-ui.c:2626 #, c-format msgid "Last time: No changes." msgstr "La cabera vegada: nun hebo cambeos." #: ../src/gtk-ui/sync-ui.c:2628 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "La cabera vegada: unvióse un cambéu." msgstr[1] "La cabera vegada: unviáronse %ld cambeos." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "La cabera vegada: aplicóse un cambéu." msgstr[1] "La cabera vegada: aplicáronse %ld cambeos." #: ../src/gtk-ui/sync-ui.c:2641 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "La cabera vegada: aplicáronse %ld cambeos y unviáronse %ld cambeos." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2848 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Hebo un problema na cabera sincronización:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2858 #, c-format msgid "You've just restored a backup. The changes have not been synced with %s yet" msgstr "Restauraste una copia de resguardu. Los cambeos entá nun se sincronicen con %s" #: ../src/gtk-ui/sync-ui.c:3146 msgid "Waiting for current operation to finish..." msgstr "Esperando a que la operación actual fine..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3180 msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data." msgstr "Nun ye dable una sincronización normal nesti intre. El sirvidor suxer una sincronización lenta, pero puede qu'esto nun seya lo que quies si dambes partes yá tienen datos." # the syncronization service D-Bus closed unexpectedly #: ../src/gtk-ui/sync-ui.c:3184 msgid "The sync process died unexpectedly." msgstr "El serviciu de sincronización zarróse d'esmenu." #: ../src/gtk-ui/sync-ui.c:3189 msgid "Password request was not answered. You can save the password in the settings to prevent the request." msgstr "Nun se retrucó a la solicitú de contraseña. Pa evitar qu'apaeza otra vegada, puede atroxase la contraseña nos axustes." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3193 msgid "There was a problem processing sync request. Trying again may help." msgstr "Hebo un problema al procesar la solicitú de sincronización. Intentalo otra vegada puede ayudar." #: ../src/gtk-ui/sync-ui.c:3199 msgid "Failed to login. Could there be a problem with your username or password?" msgstr "Accesu fallíu. ¿Podría haber dalgún problema col to usuariu o contraseña?" #: ../src/gtk-ui/sync-ui.c:3202 msgid "Forbidden" msgstr "Prohibío" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3208 msgid "A data source could not be found. Could there be a problem with the settings?" msgstr "Nun pudo atopase la fonte de datos. ¿Podría haber dalgún problema cola configuración?" # Fatal error in the database #: ../src/gtk-ui/sync-ui.c:3212 msgid "Remote database error" msgstr "Fallu na base de datos remota" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3215 msgid "There is a problem with the local database. Syncing again or rebooting may help." msgstr "Hai un problema cola base de datos llocal. Sincronizar otra vegada o reaniciar puede aidar." # There is no space left #: ../src/gtk-ui/sync-ui.c:3218 msgid "No space on disk" msgstr "Nun hai espaciu en discu" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Failed to process SyncML" msgstr "Fallu al procesar SyncML" # the server didn't accept the authorization #: ../src/gtk-ui/sync-ui.c:3222 msgid "Server authorization failed" msgstr "El sirvidor nun aceutó l'autorización" # Error while analysing the syntax of the configuration file #: ../src/gtk-ui/sync-ui.c:3224 msgid "Failed to parse configuration file" msgstr "Fallu al analizar el ficheru de configuración" # Error while reading the configuration file #: ../src/gtk-ui/sync-ui.c:3226 msgid "Failed to read configuration file" msgstr "Fallu al lleer del ficheru de configuración" # The configuration has not been found #: ../src/gtk-ui/sync-ui.c:3228 msgid "No configuration found" msgstr "Nun s'alcontró la configuración" # The configuration file has not been found #: ../src/gtk-ui/sync-ui.c:3230 msgid "No configuration file found" msgstr "Nun s'alcontró'l ficheru de configuración" # The server sent an an invalid content #: ../src/gtk-ui/sync-ui.c:3232 msgid "Server sent bad content" msgstr "El sirvidor unvió un conteníu non válidu" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Connection certificate has expired" msgstr "El certificáu de conexón venció" # The connection certificate is not valid #: ../src/gtk-ui/sync-ui.c:3236 msgid "Connection certificate is invalid" msgstr "El certificáu de conexón nun ye válidu" #: ../src/gtk-ui/sync-ui.c:3244 msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings." msgstr "Nun pudimos coneutanos col sirvidor. El problema podría ser temporal o podría haber dalgún problema cola configuración." # The URL is incorrect #: ../src/gtk-ui/sync-ui.c:3251 msgid "The server URL is bad" msgstr "La URL del sirvidor ye incorreuta" #: ../src/gtk-ui/sync-ui.c:3256 msgid "The server was not found" msgstr "Nun s'alcontró'l sirvidor" #: ../src/gtk-ui/sync-ui.c:3258 #, c-format msgid "Error %d" msgstr "Fallu: %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3396 msgid "Password is required for sync" msgstr "Requierse contraseña pa la sincronización" #: ../src/gtk-ui/sync-ui.c:3400 msgid "Sync with password" msgstr "Sincronización con contraseña" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3410 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Por favor introduz la contraseña pa sincronizar con %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Aiciones" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "o" # compatible services #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Sincronización direuta" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Sincronización de rede" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Restaurar de la copia de seguridá" # compatible services #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Sincronización lenta" # compatible services #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Entamar dende cero" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Una sincronización lenta compara elementos de dambos llaos ya intenta combinalos. \n" "Esto puede fallar en dellos casos, criando duplicaos o perda d'información." # I had to shorten the string to fit the button #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Amestar preséu" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Amestar serviciu" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost." msgstr "Les copies de seguridá faense enantes cada vegada que sincronizamos. Escueyi una copia de seguridá pa restaurar. Cualesquier cambéu que tengas fechu dende entós, va perdese." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendariu" #. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Camudar o editar\n" "serviciu sincronizador" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Zarrar" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Desaniciar tolos datos en Zyb \n" "y sustituyilos cola to\n" "información llocal" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Desaniciar tolos datos\n" "llocales y trocalos con\n" "datos de %s" #. button in main view, right side. Keep length to 20 characters or so, use two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Iguar urxencia\n" "en sincronización" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Si nun puedes ver el to serviciu de sincronización arriba, pero sabes que'l to fornidor emplega SyncML\n" "puedes configurar el serviciu manualmente." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Configuración" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Sincronización d'emerxencia" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Pa executar la sincronización faen falta una conexón de rede y una cuenta nun serviciu de sincronización. \n" "Son compatibles los siguientes servicios:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "Usa Bluetooth pa sincronizar los tos datos dende un preséu a otru. " #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "Vas necesitar amestar preseos Bluetooth enantes de que puedan sincronizase." #: ../src/gtk-ui/sync.desktop.in.h:2 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Al día" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Sync (GTK)" #: ../src/gtk-ui/sync-config-widget.c:78 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync." msgstr "ScheduleWorld permítete sincronizar los contautos, eventos, xeres y notes." #: ../src/gtk-ui/sync-config-widget.c:81 msgid "Google Sync can back up and synchronize your contacts with your Gmail contacts." msgstr "Google Sync puede facer copia de resguardu y sincroniza los tos contautos colos que tengas en Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:87 msgid "Back up your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)." msgstr "Resguarda los tos contautos y el calendariu. Sincronízalos con un clic, en cualesquier intre y dende au seya (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:90 msgid "Mobical Backup and Restore service allows you to securely back up your personal mobile data for free." msgstr "El serviciu Mobical Backup and Restore permítete facer copies de resguardu segures de la información del to móvil de baldre." #: ../src/gtk-ui/sync-config-widget.c:93 msgid "ZYB is a simple way for people to store and share mobile information online." msgstr "ZYB ye un mou cenciellu pa que la xente atroxe y comparta la información móvil en llinia." #: ../src/gtk-ui/sync-config-widget.c:96 msgid "Memotoo lets you access your personal data from any computer connected to the Internet." msgstr "Memotoo permítete acceder a los tos datos personales dende cualesquier computadora coneutada con Internet." # Error while analysing the syntax of the configuration file #: ../src/gtk-ui/sync-config-widget.c:192 msgid "Sorry, failed to save the configuration" msgstr "Sentímoslo, nun pudo atroxase la configuración" #: ../src/gtk-ui/sync-config-widget.c:381 msgid "Service must have a name and server URL" msgstr "El serviciu tien de tener un nome y una URL" #: ../src/gtk-ui/sync-config-widget.c:422 #, c-format msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end." msgstr "¿Quies reaxustar la configuración pa %s? Esto nun desaniciará denguna información sincronizada nes partes." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:426 msgid "Yes, reset" msgstr "Sí, reaniciar" #: ../src/gtk-ui/sync-config-widget.c:427 #: ../src/gtk-ui/sync-config-widget.c:438 msgid "No, keep settings" msgstr "Non, caltener configuración" #: ../src/gtk-ui/sync-config-widget.c:432 #, c-format msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings." msgstr "¿Quies desaniciar la configuración de %s? Esto nun desaniciará denguna información sincronizada en dengún de los dos llaos, pero desaniciará esta configuración. " #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:437 msgid "Yes, delete" msgstr "Sí, desaniciar" #: ../src/gtk-ui/sync-config-widget.c:467 msgid "Reset settings" msgstr "Devolver la configuración a los valores orixinales" #: ../src/gtk-ui/sync-config-widget.c:470 msgid "Delete settings" msgstr "Desaniciar la configuración" # Configuring and using #: ../src/gtk-ui/sync-config-widget.c:480 msgid "Save and use" msgstr "Guardar y usar" #: ../src/gtk-ui/sync-config-widget.c:483 msgid "" "Save and replace\n" "current service" msgstr "" "Guardar y trocar\n" "serviciu actual" #: ../src/gtk-ui/sync-config-widget.c:493 msgid "Stop using device" msgstr "Dexar d'usar esti preséu" #: ../src/gtk-ui/sync-config-widget.c:496 msgid "Stop using service" msgstr "Dexar d'usar esti serviciu" # URI of %s #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:679 #, c-format msgid "%s URI" msgstr "URI de %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:854 #, c-format msgid "Send changes to %s" msgstr "Unviar cambeos a %s" #: ../src/gtk-ui/sync-config-widget.c:859 #, c-format msgid "Receive changes from %s" msgstr "Recibir cambéu de %s" #: ../src/gtk-ui/sync-config-widget.c:875 msgid "Sync" msgstr "Sincronizar" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:891 msgid "Server address" msgstr "Direición del sirvidor" # I had to use colon to avoid the problem of selecting a masculine or feminine gender in the article, which would create problems down the road. #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:967 #, c-format msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed" msgstr "Paez qu'esti preséu ye: %s'. Si nun ye cierto, mira la llista de los preseos compatibles y seleiciona'l correutu, si apaez." #: ../src/gtk-ui/sync-config-widget.c:973 msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed" msgstr "Nun sabemos qué preséu ye ésti. Mira la llista de los preseos compatibles y seleiciona'l correutu, si apaez." #: ../src/gtk-ui/sync-config-widget.c:1126 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Preseos Bluetooth" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1132 #, c-format msgid "%s - manually setup" msgstr "%s - configurar manualmente" # Open the website #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1807 msgid "Launch website" msgstr "Abrir el sitiu web" # Configuring and using #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1816 msgid "Set up now" msgstr "Configurar agora" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1912 msgid "Username" msgstr "Usuariu" #: ../src/gtk-ui/sync-config-widget.c:1927 msgid "Password" msgstr "Contraseña" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:1950 msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration." msgstr "La configuración ye más complexa de lo que podemos amosar equí. Cambeos en el mou de sincronización o les tribes de datos sincronizaos van sobroscribir esa configuración." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1969 msgid "Hide server settings" msgstr "Anubrir la configuración del sirvidor" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1989 msgid "Show server settings" msgstr "Amosar la configuración del sirvidor" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sincronizar n'aplicación de sincronización" # Synchronization is taking place #: ../src/syncevo-dbus-server.cpp:5667 #, c-format msgid "%s is syncing" msgstr "%s ta sincronizándose" #: ../src/syncevo-dbus-server.cpp:5668 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "Anicióse a sincronizar esta máquina col serviciu de sincronización %s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:5682 #, c-format msgid "%s sync complete" msgstr "Completóse la sincronización de %s" #: ../src/syncevo-dbus-server.cpp:5683 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "Finóse de sincronizar esta máquina col serviciu de sincronización %s." #. if sync is successfully started and has errors, or not started successful with a fatal problem #: ../src/syncevo-dbus-server.cpp:5688 msgid "Sync problem." msgstr "Problemes na sincronización." #: ../src/syncevo-dbus-server.cpp:5689 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "Hebo un fallu mentantu la sincronización, y tienes qu'igualu." #: ../src/syncevo-dbus-server.cpp:5762 msgid "View" msgstr "Ver" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:5766 msgid "Dismiss" msgstr "Zarrar" #~ msgid "" #~ "Do you want to replace %s with %s? This will not remove any synced " #~ "information on either end but you will no longer be able to sync with %s." #~ msgstr "" #~ "¿Quies camudar %s por %s? Esto nun va desaniciar denguna información " #~ "sincronizada nes partes pero nun podrás volver a sincronizar con %s." #~ msgid "Yes, use %s" #~ msgstr "Sí, usa %s" #~ msgid "No, use %s" #~ msgstr "Non, usa %s" #~ msgid "Database error" #~ msgstr "Error na base de datos" syncevolution-1.5/po/ca.po0000644000373300001540000004005612326412403017061 0ustar00nightlynightly00000000000000# Syncevolution Catalan translation. # Copyright (C) 2009 Free Software Foundation, Inc. # This file is distributed under the same license as the Syncevolution package. # Gil Forcada , 2009. # #: ../src/gtk-ui/sync-ui.c:765 msgid "" msgstr "" "Project-Id-Version: Syncevolution 2.x\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-08-15 09:21+0000\n" "PO-Revision-Date: 2010-01-02 14:18+0100\n" "Last-Translator: Gil Forcada \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "Sincronització" #: ../src/gtk-ui/sync-ui.c:259 msgid "Addressbook" msgstr "Llibreta d'adreces" #: ../src/gtk-ui/sync-ui.c:261 msgid "Calendar" msgstr "Calendari" #: ../src/gtk-ui/sync-ui.c:263 msgid "Todo" msgstr "Tasques" #: ../src/gtk-ui/sync-ui.c:265 msgid "Memo" msgstr "Anotacions" #: ../src/gtk-ui/sync-ui.c:320 msgid "Failed to save current service in GConf configuration system" msgstr "" "No s'ha pogut desar el servei actual en el sistema de configuració GConf" #: ../src/gtk-ui/sync-ui.c:331 msgid "Failed to save service configuration to SyncEvolution" msgstr "No s'ha pogut desar la configuració del servei al SyncEvolution" #: ../src/gtk-ui/sync-ui.c:416 msgid "Failed to get service configuration from SyncEvolution" msgstr "No s'ha pogut obtenir la configuració del servei del SyncEvolution" #: ../src/gtk-ui/sync-ui.c:480 msgid "Failed to remove service configuration from SyncEvolution" msgstr "No s'ha pogut suprimir la configuració del servei del SyncEvolution" #: ../src/gtk-ui/sync-ui.c:600 msgid "Service must have a name and server URL" msgstr "El servei ha de tenir un nom i l'URL de servidor" #. sync is no longer in progress for some reason #: ../src/gtk-ui/sync-ui.c:676 msgid "Failed to cancel: sync was no longer in progress" msgstr "No s'ha pogut cancel·lar: ja no s'estava sincronitzant" #: ../src/gtk-ui/sync-ui.c:680 msgid "Failed to cancel sync" msgstr "No s'ha pogut cancel·lar la sincronització" #: ../src/gtk-ui/sync-ui.c:684 msgid "Canceling sync" msgstr "S'està cancel·lant la sincronització" #: ../src/gtk-ui/sync-ui.c:698 msgid "Trying to cancel sync" msgstr "S'està intentant cancel·lar la sincronització" #: ../src/gtk-ui/sync-ui.c:705 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Voleu suprimir totes les dades locals i reemplaçar-les amb les dades de %s? " "Normalment no és recomanable fer-ho." #: ../src/gtk-ui/sync-ui.c:710 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Voleu suprimir totes les dades de %s i reemplaçar-les amb les vostres dades " "locals? Normalment no és recomanable fer-ho." #: ../src/gtk-ui/sync-ui.c:727 msgid "No, cancel sync" msgstr "No, cancel·la la sincronització" #: ../src/gtk-ui/sync-ui.c:728 msgid "Yes, delete and replace" msgstr "Sí, suprimeix-ho i reemplaça-ho" #: ../src/gtk-ui/sync-ui.c:750 msgid "No sources are enabled, not syncing" msgstr "No hi ha cap font habilitada, no se sincronitzarà" #: ../src/gtk-ui/sync-ui.c:767 msgid "A sync is already in progress" msgstr "Ja s'està sincronitzant" #: ../src/gtk-ui/sync-ui.c:769 msgid "Failed to start sync" msgstr "No s'ha pogut iniciar la sincronització" #: ../src/gtk-ui/sync-ui.c:774 msgid "Starting sync" msgstr "S'està iniciant la sincronització" #: ../src/gtk-ui/sync-ui.c:799 msgid "Last synced just seconds ago" msgstr "Acabeu de sincronitzar" #: ../src/gtk-ui/sync-ui.c:802 msgid "Last synced a minute ago" msgstr "Fa alguns minuts que s'ha realitzat l'última sincronització" #: ../src/gtk-ui/sync-ui.c:805 #, c-format msgid "Last synced %ld minutes ago" msgstr "Fa %ld minuts que s'ha realitzat l'última sincronització" #: ../src/gtk-ui/sync-ui.c:808 msgid "Last synced an hour ago" msgstr "Fa una hora que s'ha realitzat l'última sincronització" #: ../src/gtk-ui/sync-ui.c:811 #, c-format msgid "Last synced %ld hours ago" msgstr "Fa %ld hores que s'ha realitzat l'última sincronització" #: ../src/gtk-ui/sync-ui.c:814 msgid "Last synced a day ago" msgstr "Ahir es va realitzar l'última sincronització" #: ../src/gtk-ui/sync-ui.c:817 #, c-format msgid "Last synced %ld days ago" msgstr "Fa %ld dies que es va realitzar l'última sincronització" #: ../src/gtk-ui/sync-ui.c:902 msgid "Sync again" msgstr "Sincronitza una altra vegada" #: ../src/gtk-ui/sync-ui.c:904 ../src/gtk-ui/ui.glade.h:29 msgid "Sync now" msgstr "Sincronitza ara" #: ../src/gtk-ui/sync-ui.c:913 msgid "Syncing" msgstr "S'està sincronitzant" #: ../src/gtk-ui/sync-ui.c:919 msgid "Cancel sync" msgstr "Cancel·la la sincronització" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:1266 #, c-format msgid "%s (not supported by this service)" msgstr "%s (aquest servei no permet fer-ho)" #: ../src/gtk-ui/sync-ui.c:1299 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "Hi ha hagut un rebuig remot." msgstr[1] "Hi ha hagut %d rebuigs remots." #: ../src/gtk-ui/sync-ui.c:1304 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "Hi ha hagut un rebuig local." msgstr[1] "Hi ha hagut %d rebuigs locals." #: ../src/gtk-ui/sync-ui.c:1309 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "Hi han hagut %d rebuigs locals i %d rebuigs remots." #: ../src/gtk-ui/sync-ui.c:1314 #, c-format msgid "Last time: No changes." msgstr "L'última vegada: cap canvi." #: ../src/gtk-ui/sync-ui.c:1316 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "L'última vegada: es va enviar un canvi." msgstr[1] "L'última vegada: es van enviar %d canvis." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:1324 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "L'última vegada: es va aplicar un canvi." msgstr[1] "L'última vegada: es van aplicar %d canvis." #: ../src/gtk-ui/sync-ui.c:1329 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "L'última vegada: es van aplicar %d canvis i se'n van enviar %d." #: ../src/gtk-ui/sync-ui.c:1421 msgid "Failed to get server configuration from SyncEvolution" msgstr "No s'ha pogut obtenir la configuració del servidor del SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1473 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in " "sync." msgstr "" "El ScheduleWorld us permet mantenir sincronitzats els contactes, els " "esdeveniments, les tasques i les anotacions." #: ../src/gtk-ui/sync-ui.c:1476 msgid "" "Google Sync can back up and synchronize your Address Book with your Gmail " "contacts." msgstr "" "El Google Sync pot fer còpies de seguretat i sincronitzar la llibreta " "d'adreces amb els contactes del GMail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-ui.c:1482 msgid "" "Back up your contacts and calendar. Sync with a singleclick, anytime, " "anywhere (DEMO)." msgstr "" "Feu una còpia de seguretat dels vostres contactes i calendaris. " "Sincronitzeu-los amb un sol clic, a qualsevol hora a qualsevol lloc " "(DEMOSTRACIÓ)." #: ../src/gtk-ui/sync-ui.c:1510 msgid "New service" msgstr "Servei nou" #: ../src/gtk-ui/sync-ui.c:1557 msgid "Server URL" msgstr "URL del servidor" #. TRANSLATORS: placeholder is a source name in settings window #: ../src/gtk-ui/sync-ui.c:1579 #, c-format msgid "%s URI" msgstr "URI de %s" #: ../src/gtk-ui/sync-ui.c:1716 ../src/gtk-ui/ui.glade.h:17 msgid "Launch website" msgstr "Obre el lloc web" #: ../src/gtk-ui/sync-ui.c:1720 msgid "Setup and use" msgstr "Configureu i utilitzeu" #: ../src/gtk-ui/sync-ui.c:1766 msgid "Failed to get list of manually setup services from SyncEvolution" msgstr "" "No s'ha pogut obtenir la llista dels serveis configurats manualment del " "SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1807 msgid "Failed to get list of supported services from SyncEvolution" msgstr "No s'ha pogut obtenir la llista dels serveis admesos pel SyncEvolution" #. TODO: this is a hack... SyncEnd should be a signal of it's own, #. not just hacked on top of the syncevolution error codes #: ../src/gtk-ui/sync-ui.c:1968 msgid "Service configuration not found" msgstr "No s'ha trobat la configuració del servei" #: ../src/gtk-ui/sync-ui.c:1974 msgid "Not authorized" msgstr "No autoritzat" #: ../src/gtk-ui/sync-ui.c:1976 msgid "Forbidden" msgstr "Prohibit" #: ../src/gtk-ui/sync-ui.c:1978 msgid "Not found" msgstr "No s'ha trobat" #: ../src/gtk-ui/sync-ui.c:1980 msgid "Fatal database error" msgstr "Error greu a la base de dades" #: ../src/gtk-ui/sync-ui.c:1982 msgid "Database error" msgstr "Error en la base de dades" #: ../src/gtk-ui/sync-ui.c:1984 msgid "No space left" msgstr "No queda espai lliure" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1987 msgid "Failed to process SyncML" msgstr "No s'ha pogut processar el SyncML" #: ../src/gtk-ui/sync-ui.c:1989 msgid "Server authorization failed" msgstr "Ha fallat l'autorització del servidor" #: ../src/gtk-ui/sync-ui.c:1991 msgid "Failed to parse configuration file" msgstr "No s'ha pogut analitzar el fitxer de configuració" #: ../src/gtk-ui/sync-ui.c:1993 msgid "Failed to read configuration file" msgstr "No s'ha pogut llegir el fitxer de configuració" #: ../src/gtk-ui/sync-ui.c:1995 msgid "No configuration found" msgstr "No s'ha trobat la configuració" #: ../src/gtk-ui/sync-ui.c:1997 msgid "No configuration file found" msgstr "No s'ha trobat el fitxer de configuració" #: ../src/gtk-ui/sync-ui.c:1999 msgid "Server sent bad content" msgstr "El servidor ha enviat continguts erronis" #: ../src/gtk-ui/sync-ui.c:2001 msgid "Transport failure (no connection?)" msgstr "Error en la transmissió (no hi ha connexió?)" #: ../src/gtk-ui/sync-ui.c:2003 msgid "Connection timed out" msgstr "La connexió ha expirat" #: ../src/gtk-ui/sync-ui.c:2005 msgid "Connection certificate has expired" msgstr "El certificat de la connexió ha expirat" #: ../src/gtk-ui/sync-ui.c:2007 msgid "Connection certificate is invalid" msgstr "El certificat de la connexió no és vàlid" #: ../src/gtk-ui/sync-ui.c:2010 msgid "Connection failed" msgstr "Ha fallat la connexió" #: ../src/gtk-ui/sync-ui.c:2012 msgid "URL is bad" msgstr "L'URL és errònia" #: ../src/gtk-ui/sync-ui.c:2014 msgid "Server not found" msgstr "No s'ha trobat el servidor" #: ../src/gtk-ui/sync-ui.c:2016 #, c-format msgid "Error %d" msgstr "Error %d" #: ../src/gtk-ui/sync-ui.c:2026 msgid "Sync D-Bus service exited unexpectedly" msgstr "El servei de D-Bus de sincronització s'ha tancat inesperadament" #: ../src/gtk-ui/sync-ui.c:2029 ../src/gtk-ui/sync-ui.c:2080 msgid "Sync Failed" msgstr "Ha fallat la sincronització" #: ../src/gtk-ui/sync-ui.c:2072 msgid "Sync complete" msgstr "S'ha completat la sincronització" #: ../src/gtk-ui/sync-ui.c:2077 msgid "Sync canceled" msgstr "S'ha cancel·lat la sincronització" #. NOTE extra1 can be error here #: ../src/gtk-ui/sync-ui.c:2095 msgid "Ending sync" msgstr "S'està acabat la sincronització" #. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text #: ../src/gtk-ui/sync-ui.c:2119 #, c-format msgid "Preparing '%s'" msgstr "S'està preparant «%s»" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2131 #, c-format msgid "Sending '%s'" msgstr "S'està enviant «%s»" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2143 #, c-format msgid "Receiving '%s'" msgstr "S'està rebent «%s»" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "Dades" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "No s'està utilitzant cap servei de sincronització" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "S'ha produït un error en la sincronització" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "Tipus de sincronització" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "Configuració manual" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "Serveis coneguts" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Afegeix un servei nou" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "Torna a la sincronització" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "Canvia el servei\n" "de sincronització" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "Suprimeix totes les dades locals i reemplaça-les per les remotes" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "Suprimeix totes les dades remotes i reemplaça-les per les locals" #: ../src/gtk-ui/ui.glade.h:13 msgid "Delete this service" msgstr "Suprimeix aquest servei" #: ../src/gtk-ui/ui.glade.h:14 msgid "Edit service settings" msgstr "Edita els paràmetres del servei" #: ../src/gtk-ui/ui.glade.h:15 msgid "" "If you don't see your service above but know that your sync provider uses " "SyncML\n" "you can setup a service manually." msgstr "" "Si no veieu el vostre servei aquí sobre però sabeu que el vostre proveïdor " "de sincronització permet utilitzar SyncML\n" "podeu configurar un servei manualment." #: ../src/gtk-ui/ui.glade.h:18 msgid "Merge local and remote data (recommended)" msgstr "Unifica les dades locals i remotes (recomanat)" #: ../src/gtk-ui/ui.glade.h:19 msgid "Password" msgstr "Contrasenya" #: ../src/gtk-ui/ui.glade.h:20 msgid "Reset original server settings" msgstr "Reinicia els paràmetres originals del servidor" #: ../src/gtk-ui/ui.glade.h:21 msgid "Save and use this service" msgstr "Desa i utilitza aquest servei" #: ../src/gtk-ui/ui.glade.h:22 msgid "Select sync service" msgstr "Seleccioneu el servei de sincronització" #: ../src/gtk-ui/ui.glade.h:23 msgid "Server settings" msgstr "Paràmetres del servidor" #: ../src/gtk-ui/ui.glade.h:24 msgid "Service name" msgstr "Nom del servei" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "Heu d'estar connectat a Internet\n" "per a poder fer una sincronització." #: ../src/gtk-ui/ui.glade.h:27 msgid "Stop using this service" msgstr "No facis servir més aquest servei" #: ../src/gtk-ui/ui.glade.h:30 msgid "" "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "" "No està disponible la sincronització (el servei de D-Bus no respon)." #: ../src/gtk-ui/ui.glade.h:31 msgid "" "To sync you'll need a network connection and an account with a sync " "service.\n" "We support the following services: " msgstr "" "Per a poder sincronitzar necessiteu una connexió a Internet i un compte " "a un servei de sincronització.\n" "Ja hi ha configuracions per als següents serveis:" #: ../src/gtk-ui/ui.glade.h:33 msgid "Username" msgstr "Nom d'usuari" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" "Encara no heu seleccionat cap servei de sincronització. Aquests us \n" "permeten sincronitzar dades entre el vostre ordinador i serveis webs." #: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Actualitzat" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Sincronització (GTK)" syncevolution-1.5/po/da.po0000644000373300001540000003652012326412403017063 0ustar00nightlynightly00000000000000# Danish translation of syncevolution # Copyright (C) 2009 # This file is distributed under the same license as the syncevolution package. # Kris Thomsen , 2009. # #: ../src/gtk-ui/sync-ui.c:765 msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-11-19 18:24+0000\n" "PO-Revision-Date: 2009-11-24 22:25+0100\n" "Last-Translator: Kris Thomsen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "Synkronisering" #: ../src/gtk-ui/sync-ui.c:259 msgid "Addressbook" msgstr "Adressebog" #: ../src/gtk-ui/sync-ui.c:261 msgid "Calendar" msgstr "Kalender" #: ../src/gtk-ui/sync-ui.c:263 msgid "Todo" msgstr "GøremÃ¥lsliste" #: ../src/gtk-ui/sync-ui.c:265 msgid "Memo" msgstr "Huskeliste" #: ../src/gtk-ui/sync-ui.c:320 msgid "Failed to save current service in GConf configuration system" msgstr "Kunne ikke gemme aktuel tjeneste i GConf-konfigurationssystem" #: ../src/gtk-ui/sync-ui.c:331 msgid "Failed to save service configuration to SyncEvolution" msgstr "Kunne ikke gemme tjenestekonfigurationen til SyncEvolution" #: ../src/gtk-ui/sync-ui.c:416 msgid "Failed to get service configuration from SyncEvolution" msgstr "Kunne ikke hente tjenestekonfigurationen fra SyncEvolution" #: ../src/gtk-ui/sync-ui.c:480 msgid "Failed to remove service configuration from SyncEvolution" msgstr "Kunne ikke fjerne tjenestekonfigurationen fra SyncEvolution" #: ../src/gtk-ui/sync-ui.c:600 msgid "Service must have a name and server URL" msgstr "Tjeneste skal have et navn og en server-URL" #. sync is no longer in progress for some reason #: ../src/gtk-ui/sync-ui.c:676 msgid "Failed to cancel: sync was no longer in progress" msgstr "Kunne ikke annullere: synkronisering var ikke længere kørende" #: ../src/gtk-ui/sync-ui.c:680 msgid "Failed to cancel sync" msgstr "Kunne ikke annullere synkronisering" #: ../src/gtk-ui/sync-ui.c:684 msgid "Canceling sync" msgstr "Annullerer synkronisering" #: ../src/gtk-ui/sync-ui.c:698 msgid "Trying to cancel sync" msgstr "Prøver at annullere synkronisering" #: ../src/gtk-ui/sync-ui.c:705 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Vil du slette alle lokale data og erstatte dem med data fra %s? Dette er " "normalvis ikke anbefalet." #: ../src/gtk-ui/sync-ui.c:710 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Vil du slette alle data i %s og erstatte dem med dine lokale data? " "Dette er normalvis ikke anbefalet." #: ../src/gtk-ui/sync-ui.c:727 msgid "No, cancel sync" msgstr "Nej, annullér synkronisering" #: ../src/gtk-ui/sync-ui.c:728 msgid "Yes, delete and replace" msgstr "Ja, slet og erstat" #: ../src/gtk-ui/sync-ui.c:750 msgid "No sources are enabled, not syncing" msgstr "Ingen kilder er aktiveret, synkronisér ikke" #: ../src/gtk-ui/sync-ui.c:767 msgid "A sync is already in progress" msgstr "En synkronisering er allerede i gang" #: ../src/gtk-ui/sync-ui.c:769 msgid "Failed to start sync" msgstr "Kunne ikke starte synkronisering" #: ../src/gtk-ui/sync-ui.c:774 msgid "Starting sync" msgstr "Starter synkronisering" #: ../src/gtk-ui/sync-ui.c:799 msgid "Last synced just seconds ago" msgstr "Sidst synkroniseret for kun fÃ¥ sekunder siden" #: ../src/gtk-ui/sync-ui.c:802 msgid "Last synced a minute ago" msgstr "Sidst synkroniseret for et minut siden" #: ../src/gtk-ui/sync-ui.c:805 #, c-format msgid "Last synced %ld minutes ago" msgstr "Sidst synkroniseret for %ld minutter siden" #: ../src/gtk-ui/sync-ui.c:808 msgid "Last synced an hour ago" msgstr "Sidst synkroniseret for en time siden" #: ../src/gtk-ui/sync-ui.c:811 #, c-format msgid "Last synced %ld hours ago" msgstr "Sidst synkroniseret for %ld timer siden" #: ../src/gtk-ui/sync-ui.c:814 msgid "Last synced a day ago" msgstr "Sidst synkroniseret for en dag siden" #: ../src/gtk-ui/sync-ui.c:817 #, c-format msgid "Last synced %ld days ago" msgstr "Sidst synkroniseret for %ld dage siden" #: ../src/gtk-ui/sync-ui.c:902 msgid "Sync again" msgstr "Synkronisér igen" #: ../src/gtk-ui/sync-ui.c:904 ../src/gtk-ui/ui.glade.h:29 msgid "Sync now" msgstr "Synkronisér nu" #: ../src/gtk-ui/sync-ui.c:913 msgid "Syncing" msgstr "Synkroniserer" #: ../src/gtk-ui/sync-ui.c:919 msgid "Cancel sync" msgstr "Annullér synkronisering" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:1266 #, c-format msgid "%s (not supported by this service)" msgstr "%s (ikke understøttet af denne tjeneste)" #: ../src/gtk-ui/sync-ui.c:1299 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "Der var én fjernafvisning." msgstr[1] "Der var %d fjernafvisninger." #: ../src/gtk-ui/sync-ui.c:1304 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "Der var én lokal afvisning." msgstr[1] "Der var %d lokale afvisninger." #: ../src/gtk-ui/sync-ui.c:1309 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "Der var %d lokale afvisninger og %d fjernafvisninger." #: ../src/gtk-ui/sync-ui.c:1314 #, c-format msgid "Last time: No changes." msgstr "Sidste gang: Ingen ændringer." #: ../src/gtk-ui/sync-ui.c:1316 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "Sidste gang: Èn ændring indsendt." msgstr[1] "Sidste gang: %d ændringer indsendt." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:1324 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "Sidste gang: Èn ændring tilføjet." msgstr[1] "Sidste gang: %d ændringer tilføjet." #: ../src/gtk-ui/sync-ui.c:1329 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "Sidste gang: %d ændringer tilføjet og %d ændringer indsendt." #: ../src/gtk-ui/sync-ui.c:1421 msgid "Failed to get server configuration from SyncEvolution" msgstr "Kunne ikke hente serverkonfiguration fra SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1473 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in " "sync." msgstr "" "ScheduleWorld giver dig mulighed for at holde dine kontakter, aktiviteter, gøremÃ¥l " "og noter synkroniseret." #: ../src/gtk-ui/sync-ui.c:1476 msgid "" "Google Sync can back up and synchronize your Address Book with your Gmail " "contacts." msgstr "" "Google Sync kan tage en sikkerhedskopi og synkronisere din adressebog med " "dine Gmail-kontakter." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-ui.c:1482 msgid "" "Back up your contacts and calendar. Sync with a singleclick, anytime, " "anywhere (DEMO)." msgstr "" "Lav en sikkerhedskopi af dine kontakter og kalender. Synkroniser med " "enkeltklik, nÃ¥r som helst og hvor som helst (DEMO)." #: ../src/gtk-ui/sync-ui.c:1510 msgid "New service" msgstr "Ny tjeneste" #: ../src/gtk-ui/sync-ui.c:1557 msgid "Server URL" msgstr "Server URL" #. TRANSLATORS: placeholder is a source name in settings window #: ../src/gtk-ui/sync-ui.c:1579 #, c-format msgid "%s URI" msgstr "%s URI" #: ../src/gtk-ui/sync-ui.c:1716 ../src/gtk-ui/ui.glade.h:17 msgid "Launch website" msgstr "Ã…ben websted" #: ../src/gtk-ui/sync-ui.c:1720 msgid "Setup and use" msgstr "Sæt op og brug" #: ../src/gtk-ui/sync-ui.c:1766 msgid "Failed to get list of manually setup services from SyncEvolution" msgstr "Kunne ikke hente liste over manuelt opsatte tjenester fra SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1807 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Kunne ikke hente liste over understøttede tjenester fra SyncEvolution" #. TODO: this is a hack... SyncEnd should be a signal of it's own, #. not just hacked on top of the syncevolution error codes #: ../src/gtk-ui/sync-ui.c:1968 msgid "Service configuration not found" msgstr "Tjenestekonfiguration ikke fundet" #: ../src/gtk-ui/sync-ui.c:1974 msgid "Not authorized" msgstr "Ikke godkendt" #: ../src/gtk-ui/sync-ui.c:1976 msgid "Forbidden" msgstr "Forbudt" #: ../src/gtk-ui/sync-ui.c:1978 msgid "Not found" msgstr "Ikke fundet" #: ../src/gtk-ui/sync-ui.c:1980 msgid "Fatal database error" msgstr "Fatal databasefejl" #: ../src/gtk-ui/sync-ui.c:1982 msgid "Database error" msgstr "Databasefejl" #: ../src/gtk-ui/sync-ui.c:1984 msgid "No space left" msgstr "Ingen plads tilbage" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1987 msgid "Failed to process SyncML" msgstr "Kunne ikke behandle SyncML" #: ../src/gtk-ui/sync-ui.c:1989 msgid "Server authorization failed" msgstr "Godkendelse af server mislykkedes" #: ../src/gtk-ui/sync-ui.c:1991 msgid "Failed to parse configuration file" msgstr "Kunne ikke tolke konfigurationsfil" #: ../src/gtk-ui/sync-ui.c:1993 msgid "Failed to read configuration file" msgstr "Kunne ikke læse konfigurationsfil" #: ../src/gtk-ui/sync-ui.c:1995 msgid "No configuration found" msgstr "Ingen konfiguration fundet" #: ../src/gtk-ui/sync-ui.c:1997 msgid "No configuration file found" msgstr "Ingen konfigurationsfil fundet" #: ../src/gtk-ui/sync-ui.c:1999 msgid "Server sent bad content" msgstr "Serveren sendte ugyldigt indhold" #: ../src/gtk-ui/sync-ui.c:2001 msgid "Transport failure (no connection?)" msgstr "Transportfejl (ingen forbindelse?)" #: ../src/gtk-ui/sync-ui.c:2003 msgid "Connection timed out" msgstr "Tiden for forbindelsen er løbet ud" #: ../src/gtk-ui/sync-ui.c:2005 msgid "Connection certificate has expired" msgstr "Forbindelsescertifikatet er udløbet" #: ../src/gtk-ui/sync-ui.c:2007 msgid "Connection certificate is invalid" msgstr "Forbindelsescertifikat er ugyldigt" #: ../src/gtk-ui/sync-ui.c:2010 msgid "Connection failed" msgstr "Forbindelse mislykkedes" #: ../src/gtk-ui/sync-ui.c:2012 msgid "URL is bad" msgstr "URL er ugyldig" #: ../src/gtk-ui/sync-ui.c:2014 msgid "Server not found" msgstr "Server ikke fundet" #: ../src/gtk-ui/sync-ui.c:2016 #, c-format msgid "Error %d" msgstr "Fejl %d" #: ../src/gtk-ui/sync-ui.c:2026 msgid "Sync D-Bus service exited unexpectedly" msgstr "Synkroniserings-D-Bus-tjeneste afsluttede ikke som forventet" #: ../src/gtk-ui/sync-ui.c:2029 ../src/gtk-ui/sync-ui.c:2080 msgid "Sync Failed" msgstr "Synkronisering mislykkedes" #: ../src/gtk-ui/sync-ui.c:2072 msgid "Sync complete" msgstr "Synkronisering gennemført" #: ../src/gtk-ui/sync-ui.c:2077 msgid "Sync canceled" msgstr "Synkronisering annulleret" #. NOTE extra1 can be error here #: ../src/gtk-ui/sync-ui.c:2095 msgid "Ending sync" msgstr "Afslutter synkronisering" #. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text #: ../src/gtk-ui/sync-ui.c:2119 #, c-format msgid "Preparing '%s'" msgstr "Forbereder \"%s\"" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2131 #, c-format msgid "Sending '%s'" msgstr "Sender \"%s\"" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2143 #, c-format msgid "Receiving '%s'" msgstr "Modtager \"%s\"" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "Data" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "Ingen synkroniseringstjeneste i brug" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "Synkroniseringsfejl" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "Synkroniseringstype" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "Manuel opsætning" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "Understøttede tjenester" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Tilføj ny tjeneste" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "Tilbage til synkronisering" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "Skift synkroniserings-\n" "tjeneste" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "Slet alle lokale data og erstat dem med fjerndata" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "Slet alle fjerndata og erstat dem med lokale data" #: ../src/gtk-ui/ui.glade.h:13 msgid "Delete this service" msgstr "Slet denne tjeneste" #: ../src/gtk-ui/ui.glade.h:14 msgid "Edit service settings" msgstr "Redigér tjenesteindstillinger" #: ../src/gtk-ui/ui.glade.h:15 msgid "" "If you don't see your service above but know that your sync provider uses " "SyncML\n" "you can setup a service manually." msgstr "" "Hvis du ikke kan se din tjeneste ovenfor, men ved at din synkroniseringsudbyder " "bruger SyncML,\n" "kan du sætte en tjeneste manuelt." #: ../src/gtk-ui/ui.glade.h:18 msgid "Merge local and remote data (recommended)" msgstr "Læg lokale og fjerndata sammen (anbefalet)" #: ../src/gtk-ui/ui.glade.h:19 msgid "Password" msgstr "Adgangskode" #: ../src/gtk-ui/ui.glade.h:20 msgid "Reset original server settings" msgstr "Nulstil til originale serverindstillinger" #: ../src/gtk-ui/ui.glade.h:21 msgid "Save and use this service" msgstr "Gem og brug denne tjeneste" #: ../src/gtk-ui/ui.glade.h:22 msgid "Select sync service" msgstr "Vælg synkroniseringstjeneste" #: ../src/gtk-ui/ui.glade.h:23 msgid "Server settings" msgstr "Tjenesteopsætning" #: ../src/gtk-ui/ui.glade.h:24 msgid "Service name" msgstr "Tjenestenavn" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "Beklager, du skal bruge en internetforbindelse\n" "for at synkronisere." #: ../src/gtk-ui/ui.glade.h:27 msgid "Stop using this service" msgstr "Stop med at bruge denne tjeneste" #: ../src/gtk-ui/ui.glade.h:30 msgid "" "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "" "Synkronisering er ikke tilgængelig (D-Bus-tjenesten svarer ikke), beklager." #: ../src/gtk-ui/ui.glade.h:31 msgid "" "To sync you'll need a network connection and an account with a sync " "service.\n" "We support the following services: " msgstr "" "For at synkronisere skal du have en netværksforbindelse og en konto med " "en synkroniseringstjeneste.\n" "Vi understøtter følgende tjenester: " #: ../src/gtk-ui/ui.glade.h:33 msgid "Username" msgstr "Brugernavn" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" "Du har ikke valgt en synkroniseringstjeneste endnu. Synkroniseringstjenester \n" "lader dig synkronisere dine data mellem din netbook og en webtjeneste." #: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Fuldt opdatereret" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Synkronisering (GTK)" syncevolution-1.5/po/de.po0000644000373300001540000007526312326412403017076 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 11:21+0000\n" "Last-Translator: GLS_Translator_DEU1 \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Synchronisation" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Kontakte" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Termine" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Aufgaben" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notizen" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Termine & Aufgaben" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Sync wird gestartet" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Willst du mit %s eine langsame Synchronisation durchführen?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Ja, langsame Synchronisation durchführen" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Nein, Synchronisation abbrechen" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Möchtest du alle lokalen Daten löschen und mit Daten von %s ersetzen? Dies " "ist normalerweise nicht zu empfehlen." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Ja, löschen und ersetzen" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Nein" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Möchtest du alle Daten in %s löschen und mit deinen lokalen Daten ersetzen? " "Dies ist normalerweise nicht zu empfehlen." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Abbruchversuch der Synchronisation" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Kein Service oder Gerät gewählt" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - Synchronisation fand vor wenigen Sekunden statt" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - Synchronisation fand vor einer Minute statt" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - Synchronisation fand vor %ld Minuten statt" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - Synchronisation fand vor einer Stunde statt" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - Synchronisation fand vor %ld Stunden statt" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - Synchronisation fand vor einem Tag statt" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - Synchronisation fand vor %ld Tagen statt" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Jetzt syncen" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "" "Langsame\n" "Synchronisation" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Andere Optionen..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Synchronisations-Service wählen" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Service-Einstellungen bearbeiten" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Es ist noch kein Synchronisations-Service oder Gerät ausgewählt. Sync-" "Services synchronisieren die Daten deines Netbooks mit einem Web-Service. " "Mit einigen Geräten kannst du auch direkt synchronisieren." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Erneut syncen" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Wiederherstellung" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Syncen..." #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "" "Synchronisation\n" "abbrechen" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Zurück zur Synchronisation" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "" "Automatische\n" "Synchronisation" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Betroffene Daten: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Betroffene Daten: Keine" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Soll die Sicherheitskopie von %s wiederhergestellt werden? Alle seither " "gemachten Änderungen gehen dann verloren." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Ja, wiederherstellen" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Sicherheitskopie wurde erstellt vor Synchronisation mit %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Wiederherstellen" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Eine normale Synchronisation mit %s ist zur Zeit nicht möglich. Du kannst " "eine langsame Zwei-Wege-Synchronisation durchführen, neu anfangen, oder eine" " Sicherheitskopie wiederherstellen. Eine langsame Synchronisation oder ein " "Neuanfang sind jedoch erforderlich, bevor eine normale Synchronisation " "mäglich ist." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Falls etwas fehlgeschlagen ist, kannst du eine langsame Synchronisation " "versuchen, neu anfangen oder von der Sicherheitskopie Daten " "wiederherstellen." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Alle lokalen Daten\n" "löschen und ersetzen mit\n" "Daten von %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Alle Daten auf %s\n" "löschen und ersetzen\n" "mit deinen lokalen Daten" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "" "Liste der unterstützten Services konnte nicht von SyncEvolution empfangen " "werden." #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Bei der Kommunikation mit dem Sync-Service trat ein Problem auf. Versuche es" " später nochmals." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Verbindung fehlgeschlagen" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Sync fehlgeschlagen" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Wiederherstellung beendet" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Sync beendet" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "'%s' wird vorbereitet" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "'%s' wird empfangen" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "'%s' wird gesendet" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Es gab eine Remote-Ablehnung." msgstr[1] "Es gab %ld Remote-Ablehnungen." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Es gab eine lokale Ablehnung." msgstr[1] "Es gab %ld lokale Ablehnungen." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Es gab %ld lokale Ablehnungen und %ld Remote-Ablehnungen." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Letztes Mal: Keine Änderungen." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Letztes Mal: Eine Änderung abgeschickt." msgstr[1] "Letztes Mal: %ld Änderungen abgeschickt." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Letztes Mal: Eine Änderung angewandt." msgstr[1] "Letztes Mal: %ld Änderungen angewandt." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "" "Letztes Mal: %ld Änderungen angewandt und %ld Änderungen abgeschickt." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Bei der letzten Synchronisation trat ein Problem auf:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Du hast soeben eine Sicherheitskopie erstellt. Die Änderungen wurden noch " "nicht mit %s synchronisiert." #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Warten auf Beenden des laufenden Vorgangs..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Eine normale Synchronisation ist zur Zeit nicht möglich. Der Server schlägt " "eine langsame Synchronisation vor, doch wenn beide Enden bereits Daten " "haben, ist dies vielleicht nicht immer wünschenswert." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Sync-Prozess wurde unerwartet abgebrochen." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Passwortanfrage wurde nicht beantwortet. Du kannst das Passwort in den " "Einstellungen speichern, um die Anfrage zu vermeiden." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Beim Bearbeiten der Synchronisationsanfrage trat ein Problem auf. Es wird " "empfohlen, es noch einmal zu versuchen." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Anmeldung gescheitert. Es könnte ein Problem mit dem Benutzernamen oder dem " "Kennwort bestehen." #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Verboten" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "Die Datenquelle wurde nicht gefunden. Könnte es ein Problem bei den " "Einstellungen geben?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Fehler bei Remote-Datenbank" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Es gibt ein Problem mit der lokalen Datenbank. Es wird empfohlen, noch " "einmal zu synchronisieren oder den Computer neu zu starten" #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Kein Platz auf der Festplatte" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "SyncML konnte nicht verarbeitet werden" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Serverauthentifizierung fehlgeschlagen" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Konfigurationsdatei konnte nicht analysiert werden" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Konfigurationsdatei konnte nicht gelesen werden" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Keine Konfiguration gefunden" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Keine Konfigurationsdatei gefunden" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Der Server hat ungültigen Inhalt gesendet" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Das Zertifikat der Verbindung ist abgelaufen" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Das Zertifikat der Verbindung ist ungültig" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Verbindung mit dem Server konnte nicht hergestellt werden. Das Problem ist " "vielleicht nur temporär, oder es könnte ein Fehler bei den Einstellungen " "vorliegen." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "Server-URL ist nicht korrekt" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Der Server wurde nicht gefunden" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Fehler %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Kennwort ist zur Synchronisation erforderlich" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Synchronisation mit Kennwort" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Kennwort zur Synchronisation mit %s eingeben:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Handlungen" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "oder" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Direkte Synchronisation" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Netzwerk-Synchronisation" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Wiederherstellung von der Sicherheitskopie" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Langsame Synchronisation" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Neu anfangen" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Eine langsame Synchronisation vergleicht Elemente beider Seiten und fügt sie zusammen.\n" "Dies kann manchmal fehlschlagen und Duplikate oder verlorene Informationen zur Folge haben." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Gerät zufügen" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Service zufügen" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Bei jeder Synchronisation wird eine Sicherheitskopie erstellt. Wähle zur " "Wiederherstellung eine Sicherheitskopie. Seither vorgenommene Änderungen " "gehen verloren." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Kalender" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Sync Service\n" "ändern/bearbeiten" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Schließen" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Alle Daten auf Zyb löschen\n" "und mit lokaler Information\n" "ersetzen" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Alle lokalen Informationen\n" "löschen und ersetzen\n" "mit Daten von Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Einen Sync\n" "Notfall beheben" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Wenn dein Service nicht aufgelistet ist, aber dein Synchronisationsanbieter SyncML\n" "verwendet, kannst du einen Service manuell konfigurieren." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Einstellungen" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Sync Notfall" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Zur Synchronisation brauchst du eine Netzwerkverbindung und ein Konto bei einem\n" "Synchronisations-Service. Wir unterstützen die folgenden Services:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Benutze Bluetooth, um die Daten von einem Gerät mit einem anderen zu " "synchronisieren." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Bluetooth-Geräte müssen zugefügt werden, bevor sie synchronisiert werden " "können." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Aktuell bleiben" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synchronize PIM data" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld erlaubt dir, deine Kontakte, Events, Aufgaben und Notizen zu " "synchronisieren." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Synchronisation kann dein Addressbuch mit deinen Gmail Kontakten " "synchronisieren und eine Sicherheitskopie davon erstellen." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Erstelle Sicherheitskopien deiner Kontakte und deines Kalenders. Sync mit " "einem einzigen Klick, irgendwann, irgendwo (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Mit Mobical Backup und Restore Service kannst du gratis eine " "Sicherheitskopie deiner persönlichen mobilen Daten erstellen." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "Mit ZYB können mobile Informationen online geteilt und gespeichert werden." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo gibt Zugriff auf persönliche Daten von jedem Computer, der mit dem " "Internet verbunden ist." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Das Speichern der Konfiguration ist leider fehlgeschlagen" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Der Service muss einen Namen und eine URL haben" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Für diesen Service ist ein Benutzername erforderlich" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Sollen die Einstellungen für %s neu eingerichtet werden? Es wird dabei keine" " synchronisierte Information gelöscht." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Ja, neu einrichten" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Nein, Einstellungen behalten" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Sollen die Einstellungen für %s gelöscht werden? Dabei werden keine " "synchronisierten Informationen gelöscht, jedoch wird die Service-" "Konfiguration gelöscht." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Ja, löschen" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Einstellungen zurücksetzen" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Einstellungen löschen" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Speichern und benutzen" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Diesen Service\n" "speichern und ersetzen" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Service nicht mehr benutzen" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Service nicht mehr benutzen" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "URI von %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Änderungen senden an %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Änderungen von %s empfangen" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sync" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Serveradresse" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Dieses Gerät scheint ein '%s' zu sein. Sollte das nicht stimmen, schau dir " "bitte die Liste der unterstützten Geräte an, um dein Gerät auszuwählen." #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Dieses Gerät kann nicht genau identifiziert werden. Schau dir bitte die " "Liste der unterstützten Geräte an, um dein Gerät auszuwählen." #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth-Gerät" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - manuell einrichten" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Website starten" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Jetzt einrichten" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Diese Einstellungen verwenden" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Benutzername" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Kennwort" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Die Service-Konfiguration ist komplexer als hier angezeigt werden kann. " "Änderungen am Synchronisationsmodus oder den synchronisierten Datentypen " "werden diese Konfiguration überschreiben." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Servereinstellungen " #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Servereinstellungen anzeigen" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sync in der Sync Anwendung" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s Synchronisation" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "Die Synchronisation deines Computers mit dem %s Sync-Service wurde " "gestartet." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s Synchronisation abgeschlossen" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" "Die Synchronisation deines Computers mit dem %s Sync-Service ist " "abgeschlossen." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Sync-Problem" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "Ein Problem mit der Synchronisation bedarf deiner Aufmerksamkeit." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Anzeigen" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Ignorieren" syncevolution-1.5/po/en_GB.po0000644000373300001540000007127412326412403017456 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Margie Foster , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-05 19:25+0000\n" "Last-Translator: margie \n" "Language-Team: English (United Kingdom) (http://www.transifex.net/projects/p/meego/team/en_GB/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_GB\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Sync" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contacts" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Appointments" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Tasks" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notes" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Appointments & Tasks" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Starting sync" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Do you want to slow sync with %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Yes, do slow sync" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "No, cancel sync" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Yes, delete and replace" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "No" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Trying to cancel sync" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "No service or device selected" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - synced just now" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - synced a minute ago" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - synced %ld minutes ago" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - synced an hour ago" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - synced %ld hours ago" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - synced a day ago" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - synced %ld days ago" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Sync now" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Slow sync" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Other options..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Select sync service" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Edit service settings" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "You haven't selected a sync service or device yet. Sync services let you " "synchronise your data between your netbook and a web service. You can also " "sync directly with some devices." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Sync again" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Restoring" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Syncing" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Cancel sync" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Back to sync" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Automatic sync" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Affected data: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Affected data: none" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Yes, restore" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Backed up before syncing with %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Restore" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Delete all your local\n" "data and replace with\n" "data from %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Delete all data on\n" "%s and replace\n" "with your local data" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Failed to get list of supported services from SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "There was a problem communicating with the sync process. Please try again " "later." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Restore failed" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Sync failed" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Restore complete" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Sync complete" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Preparing '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Receiving '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Sending '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "There was one remote rejection." msgstr[1] "There were %ld remote rejections." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "There was one local rejection." msgstr[1] "There were %ld local rejections." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "There were %ld local rejections and %ld remote rejections." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Last time: No changes." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Last time: Sent one change." msgstr[1] "Last time: Sent %ld changes." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Last time: Applied one change." msgstr[1] "Last time: Applied %ld changes." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Last time: Applied %ld changes and sent %ld changes." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "There was a problem with last sync:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "You've just restored a backup. The changes have not been synced with %s yet" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Waiting for current operation to finish..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "The sync process died unexpectedly." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Password request was not answered. You can save the password in the settings" " to prevent the request." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "There was a problem processing sync request. Trying again may help." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Failed to login. Could there be a problem with your username or password?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Forbidden" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "A data source could not be found. Could there be a problem with the " "settings?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Remote database error" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "There is a problem with the local database. Syncing again or rebooting may " "help." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "No space on disk" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Failed to process SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Server authorisation failed" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Failed to parse configuration file" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Failed to read configuration file" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "No configuration found" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "No configuration file found" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Server sent bad content" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Connection certificate has expired" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Connection certificate is invalid" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "The server URL is bad" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "The server was not found" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Error %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Password is required for sync" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Sync with password" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Please enter password for syncing with %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Actions" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "or" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Direct sync" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Network sync" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Restore from backup" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Slow sync" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Start from scratch" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Add new device" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Add new service" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendar" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Change or edit\n" "sync service" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Close" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Delete all data on Zyb \n" "and replace with your\n" "local information" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Delete all your local\n" "information and replace\n" "with data from Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Fix a sync\n" "emergency" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Settings" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Sync Emergency" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "Use Bluetooth to Sync your data from one device to another." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "You will need to add Bluetooth devices before they can be synced." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Up to date" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synchronize PIM data" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync can back up and synchronise your contacts with your Gmail " "contacts." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB is a simple way for people to store and share mobile information online." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Sorry, failed to save the configuration" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Service must have a name and server URL" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "A username is required for this service" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Yes, reset" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "No, keep settings" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Yes, delete" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Reset settings" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Delete settings" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Save and use" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Save and replace\n" "current service" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Stop using device" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Stop using service" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Send changes to %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Receive changes from %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sync" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Server address" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth device" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - manually setup" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Launch website" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Set up now" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Use these settings" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Username" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Password" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Hide server settings" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Show server settings" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sync in the Sync application" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s is syncing" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "We have just started to sync your computer with the %s sync service." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s sync complete" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "We have just finished syncing your computer with the %s sync service." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Sync problem." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "Sorry, there's a problem with your sync that you need to attend to." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "View" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Dismiss" syncevolution-1.5/po/en_US.po0000644000373300001540000007126512326412403017515 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Margie Foster , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-05 22:05+0000\n" "Last-Translator: margie \n" "Language-Team: English (United States) (http://www.transifex.net/projects/p/meego/team/en_US/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: en_US\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Sync" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contacts" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Appointments" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Tasks" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notes" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Appointments & Tasks" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Starting sync" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Do you want to slow sync with %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Yes, do slow sync" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "No, cancel sync" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Yes, delete and replace" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "No" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Trying to cancel sync" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "No service or device selected" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - synced just now" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - synced a minute ago" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - synced %ld minutes ago" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - synced an hour ago" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - synced %ld hours ago" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - synced a day ago" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - synced %ld days ago" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Sync now" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Slow sync" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Other options..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Select sync service" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Edit service settings" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Sync again" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Restoring" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Syncing" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Cancel sync" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Back to sync" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Automatic sync" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Affected data: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Affected data: none" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Yes, restore" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Backed up before syncing with %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Restore" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Delete all your local\n" "data and replace with\n" "data from %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Delete all data on\n" "%s and replace\n" "with your local data" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Failed to get list of supported services from SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "There was a problem communicating with the sync process. Please try again " "later." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Restore failed" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Sync failed" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Restore complete" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Sync complete" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Preparing '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Receiving '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Sending '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "There was one remote rejection." msgstr[1] "There were %ld remote rejections." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "There was one local rejection." msgstr[1] "There were %ld local rejections." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "There were %ld local rejections and %ld remote rejections." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Last time: No changes." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Last time: Sent one change." msgstr[1] "Last time: Sent %ld changes." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Last time: Applied one change." msgstr[1] "Last time: Applied %ld changes." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Last time: Applied %ld changes and sent %ld changes." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "There was a problem with last sync:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "You've just restored a backup. The changes have not been synced with %s yet" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Waiting for current operation to finish..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "The sync process died unexpectedly." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Password request was not answered. You can save the password in the settings" " to prevent the request." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "There was a problem processing sync request. Trying again may help." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Failed to log in. Could there be a problem with your username or password?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Forbidden" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "A data source could not be found. Could there be a problem with the " "settings?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Remote database error" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "There is a problem with the local database. Syncing again or rebooting may " "help." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "No space on disk" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Failed to process SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Server authorization failed" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Failed to parse configuration file" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Failed to read configuration file" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "No configuration found" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "No configuration file found" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Server sent bad content" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Connection certificate has expired" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Connection certificate is invalid" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "The server URL is bad" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "The server was not found" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Error %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Password is required for sync" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Sync with password" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Please enter password for syncing with %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Actions" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "or" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Direct sync" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Network sync" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Restore from backup" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Slow sync" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Start from scratch" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Add new device" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Add new service" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Backups are made before every sync. Choose a backup to restore. Any changes " "you have made since then will be lost." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendar" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Change or edit\n" "sync service" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Close" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Delete all data on Zyb \n" "and replace with your\n" "local information" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Delete all your local\n" "information and replace\n" "with data from Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Fix a sync\n" "emergency" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Settings" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Sync Emergency" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "Use Bluetooth to sync your data from one device to another." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "You will need to add Bluetooth devices before they can be synced." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Up to date" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synchronize PIM data" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB is a simple way for people to store and share mobile information online." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Sorry, failed to save the configuration" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Service must have a name and server URL" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "A username is required for this service" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Yes, reset" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "No, keep settings" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Yes, delete" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Reset settings" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Delete settings" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Save and use" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Save and replace\n" "current service" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Stop using device" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Stop using service" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Send changes to %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Receive changes from %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sync" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Server address" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth device" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - manually set up" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Launch website" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Set up now" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Use these settings" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Username" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Password" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Hide server settings" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Show server settings" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sync in the Sync application" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s is syncing" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "We have just started to sync your computer with the %s sync service." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s sync complete" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "We have just finished syncing your computer with the %s sync service." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Sync problem." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "Sorry, there's a problem with your sync that you need to attend to." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "View" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Dismiss" syncevolution-1.5/po/es.po0000644000373300001540000007476012326412403017116 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-09 00:30+0000\n" "Last-Translator: GLS_ESP \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/meego/team/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Sincronizador" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contactos" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Citas" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Tareas" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notas" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Citas y tareas" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Iniciando..." #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Deseas una sincronización lenta con %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Sí, realizar sincronización lenta" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "No, cancelar la sincronización" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "¿Quieres borrar todos los datos locales y sustituirlos por los datos de %s? " "Normalmente, no es recomendable." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Sí, borrar y reemplazar" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "No" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "¿Quieres borrar todos los datos de %s y sustituirlos por los datos locales? " "Normalmente, no es recomendable." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Estamos intentando cancelar la sincronización" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "No se ha seleccionado ningún servicio o dispositivo" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - se sincronizo hace unos segundos" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - se sincronizo hace un minuto" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - se sincronizo hace %ld minutos" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - se sincronizo hace una hora" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - se sincronizo hace %ld horas" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - se sincronizo hace un día" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - se sincronizo hace %ld días" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Sincronizar" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Sincronización lenta" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Otras opciones..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Seleccionar un servicio" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Editar la configuración del servicio" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Todavía no has seleccionado ningún servicio o dispositivo de sincronización." " Estos servicios te permiten sincronizar los datos entre el miniportátil y " "un servicio web. También puede hacerse directamente con algunos " "dispositivos." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "¡Sincronízate!" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Restaurando" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Sincronizando..." #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Cancelar la sincronización" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Volver a la sincronización" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "" "Sincronización\n" "automática" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Datos afectados: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Datos afectados: ninguno" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "¿Deseas restaurar la copia de seguridad de %s? Todos los cambios que hayas " "realizado desde entonces se perderán." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Sí, restaurar" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Copia de seguridad realizada ante de sincronizar con %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Restaurar" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Una sincronización normal con %s no es posible en este momento. Puedes " "realizar una sincronización lenta de dos vías o iniciar de cero. También " "puedes restaurar una copia de seguridad, pero una sincronización lenta o " "iniciar de cero igual será necesaria antes de que sea posible una " "sincronización normal." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Si algo realmente malo sucede, puedes intentar una sincronización lenta, " "empezar de cero o restaurar la copia de seguridad." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Borrar todos los datos\n" "locales y reemplazarlos con\n" "datos de %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Borrar todos los datos en\n" "%s y reemplazarlos\n" "con tus datos locales" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Error al obtener la lista de servicios compatibles de SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Ha ocurrido un problema de comunicación en el proceso de sincronización. " "Inténtalo más tarde." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Restaurar falló" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Sincronización falló" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Restaurado completo" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "¡Sincronizado!" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Preparando '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Recibiendo '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Enviando '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Hubo un rechazo remoto." msgstr[1] "Hubo %ld rechazos remotos." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Hubo un rechazo local." msgstr[1] "Hubo %ld rechazos locales." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Se han producido %ld rechazos locales y %ld rechazos remotos." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "La última vez: no hubo cambios." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "La última vez: se envió un cambio." msgstr[1] "La última vez: se enviaron %ld cambios." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "La última vez: se aplicó un cambio." msgstr[1] "La última vez: se aplicaron %ld cambios." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "La última vez: se aplicaron %ld cambios y se enviaron %ld cambios." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Hubo un problema en la última sincronización:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Has restaurado una copia de resguardo. Los cambios aún no se sincronizan con" " %s" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Esperando que la operación actual termine..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Una sincronización normal no es posible en este momento. El servidor sugiere" " una sincronización lenta, pero esto no es necesariamente lo que deseas si " "ambas partes ya tienen datos." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "El servicio de sincronización se cerró inesperadamente." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "No se ha respondido a la solicitud de contraseña. Para evitar que aparezca " "otra vez, se puede guardar la contraseña en los ajustes." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Ha ocurrido un problema al procesar la solicitud de sincronización. Intentar" " otra vez puede ayudar." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Acceso fallido. ¿Podría haber algún problema con tu usuario o contraseña?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Prohibido" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "No se pudo hallar la fuente de datos. ¿Podría haber algún problema con la " "configuración?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Error en la base de datos remota" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Hay un problema con la base de datos local. Sincronizar otra vez o reiniciar" " puede ayudar." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "No queda espacio" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Error al procesar SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "El servidor no ha aceptado la autorización" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Error al analizar la sintaxis del archivo de configuración" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Error al leer del archivo de configuración" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "No se ha encontrado la configuración" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "No se ha encontrado el archivo de configuración" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "El servidor envió un contenido no válido" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "El certificado de conexión está vencido" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "El certificado de conexión no es válido" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "No hemos podido conectarnos con el servidor. El problema podría ser temporal" " o podría haber algún problema con la configuración." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "La URL del servidor es incorrecta" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "No se ha encontrado el servidor" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Error: %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Se requiere contraseña para la sincronización" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Sincronización con contraseña" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Por favor ingresa la contraseña para sincronizar con %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Acciones" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "o" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Sincronización directa" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Sincronización de red" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Restaurar de la copia de seguridad" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Sincronización lenta" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Comenzar desde cero" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Una sincronización lenta compara elementos de ambos lados e intenta combinarlos. \n" "Esto puede fallar en algunos casos, creando duplicados o perdida de información." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Agregar dispositivo" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Agregar servicio" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Las copias de seguridad son realizadas antes cada vez que sincronizamos. " "Elije una copia de seguridad para restaurar. Cualquier cambio que hayas " "realizado desde entonces se perderá." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendario" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Cambiar o editar\n" "servicio sincronizador" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Cerrar" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Borrar todos los datos en Zyb \n" "y sustituirlos con tu\n" "información local" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Borrar todos los datos\n" "locales y reemplazarlos con\n" "datos de Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Arreglar urgencia\n" "en sincronización" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Si no puedes ver tú servicio de sincronización arriba, pero sabes que tú proveedor emplea SyncML\n" "puedes configurar el servicio manualmente." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Configuración" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Sincronización de emergencia" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Para ejecutar la sincronización hacen falta una conexión de red y una cuenta en un servicio de sincronización. \n" "Son compatibles los siguientes servicios:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Utiliza Bluetooth para sincronizar tus datos a partir de un dispositivo a " "otro. " #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Necesitarás agregar dispositivos Bluetooth antes de que puedan ser " "sincronizados." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Al día" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Sincronizar los datos del gestor de información personal (GIP)" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld te permite sincronizar los contactos, eventos, tareas y notas." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync puede hacer copia de resguardo y sincroniza tus contactos y con " "los que tengas en Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Resguarda tus contactos y el calendario. Sincronízalos con un clic, en " "cualquier momento y desde donde sea (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "El servicio Mobical Backup and Restore te permite realizar copias de " "resguardo seguras de la información de tu móvil gratis." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB es una manera simple para que la gente almacene y comparta la " "información móvil en línea." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo te permite acceder a tus datos personales desde cualquier " "computadora conectada con Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Lo sentimos, no se pudo guardar la configuración" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "El servicio debe llamarse de alguna manera y tener una URL" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Este servicio requiere un nombre de usuario" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "¿Deseas reajustar la configuración para %s? Esto no removerá ninguna " "información sincronizada en las partes." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Sí, reiniciar" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "No, mantener configuración" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "¿Quieres eliminar la configuración de %s? Esto no eliminará ninguna " "información sincronizada en ninguno de los dos lados, pero eliminará esta " "configuración. " #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Sí, borrar" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Devolver la configuración a sus valores originales" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Borrar la configuración" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Guardar y usar" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Guardar y reemplazar\n" "servicio actual" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Dejar de usar este dispositivo" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Dejar de usar este servicio" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "URI de %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Enviar cambios a %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Recibir cambio de %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sincronizar" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Dirección del servidor" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Parece que este dispositivo es: %s'. Si no es cierto, mira la lista de los " "dispositivos compatibles y selecciona el correcto, si aparece." #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "No sabemos qué dispositivo es éste. Mira la lista de los dispositivos " "compatibles y selecciona el correcto, si aparece." #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Dispositivo Bluetooth" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - configurar manualmente" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Abrir el sitio web" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Configurar ahora" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Usar estos ajustes" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Usuario" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Contraseña" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "La configuración es más compleja de lo que podemos mostrar aquí. Cambios en " "el modo de sincronización o los tipos de datos sincronizados sobrescribirán " "esa configuración." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Ocultar la configuración del servidor" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Mostrar la configuración del servidor" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sincronizar en la aplicación de sincronización" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s está sincronizándose" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "Hemos empezado a sincronizar esta máquina con el servicio de sincronización " "%s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "Se ha completado la sincronización de %s" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" "Hemos terminado de sincronizar esta máquina con el servicio de " "sincronización %s." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Problemas en la sincronización." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" "Ha ocurrido un problema durante la sincronización que debes solucionar." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Ver" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Cerrar" syncevolution-1.5/po/fi.po0000644000373300001540000007333512326412403017102 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Eija Lapinleimu , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 18:07+0000\n" "Last-Translator: GLS_Translator_FIN1 \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Synkkaus" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Yhteyshenkilöt" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Tapaamiset" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Tehtävät" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Huomautukset" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Tapaamiset ja tehtävät" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Aloitetaan synkkaus" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Haluatko hitaan synkkauksen kohteen %s kanssa?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Kyllä, tehdään hidas synkkaus" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Ei, peru synkkaus" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Haluatko poistaa kaikki paikalliset tiedot ja korvata ne tiedoilla kohteesta" " %s? Tämä ei ole yleensä suositeltavaa." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Kyllä, poista ja korvaa" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Ei" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Haluatko poistaa kaikki tiedot kohteessa %s ja korvata ne paikallisilla " "tiedoillasi? Tämä ei ole yleensä suositeltavaa." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Yritetään perua synkkaus" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Palvelua tai laitetta ei ole valittuna" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - synkataan juuri nyt" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - Synkattu viimeksi minuutti sitten" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - Synkattu viimeksi %ld minuuttia sitten" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - Synkattu viimeksi tunti sitten" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - Synkattu viimeksi %ld tuntia sitten" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - Synkattu viimeksi eilen" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - Synkattu viimeksi %ld päivää sitten" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Synkkaa nyt" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "" "Hidas\n" "synkkaus" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Muut asetukset..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Määritä synkkauspalvelu" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Muuta palveluasetuksia" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Synkkauspalvelua tai laitetta ei ole vielä valittu. Synkkauspalvelu " "mahdollistaa Netbookisi ja verkkopalvelusi tietojen synkkauksen. Voit myös " "synkata suoraan joitakin laitteita." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Synkkaa taas" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Palautetaan" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Synkkaus käynnissä" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Peru synkkaus" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Takaisin synkkaukseen" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Automaattinen synkkaus" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Koskee tietoja: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Koskee tietoja: ei mitään" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Haluatko palauttaa varmuuskopioinnin kohteesta %s? Menetät kaikki tämän " "jälkeen tekemäsi muutokset." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Kyllä, palauta" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Varmuuskopioitu ennen sunkkausta kohteen %s kanssa" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Palauttaa" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Normaali synkkaus kohteen %s ei ole mahdollinen täällä kertaa. Voit tehdä " "hitaan kaksisuuntaisen synkkauksen tai aloittaa nollasta. Voit myös " "palauttaa varmuuskopion, mutta joko hidas synkkaus tai aloittaminen nollasta" " vaaditaan, ennen kuin normaali synkkaus on mahdollinen." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Jos jotakin on mennyt järkyttävän pieleen, voit yrittää hidasta synkkausta, " "aloittamista nollasta tai palauttaa varmuuskopiosta." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Poista kaikki paikalliset\n" " tiedot ja korvaa ne \n" "tiedoilla kohteesta %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Poista kaikki tiedot kohteesta\n" "%s ja korvaa \n" "paikallisilla tiedoilla" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Tuettujen palveluiden listan saaminen SyncEvolutionista epäonnistui" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Ilmeni onglema kommunikoitaessa synkkausprosessin kanssa. Yritä myöhemmin " "uudelleen." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Palauttaminen epäonnistui" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Synkkaus epäonnistui" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Palautus valmis" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Synkkaus valmis" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Valmistellaan: '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Vastaanotetaan: '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Lähetetään: '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Tapahtui yksi etähylkäys" msgstr[1] "Tapahtui %ld etähylkäystä" #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Tapahtui yksi paikallinen hylkäys" msgstr[1] "Tapahtui %ld paikallista hylkäystä" #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Tapahtui %ld paikallista hylkäystä ja %ld etähylkäystä" #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Viime kerta: ei muutoksia" #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Viime kerralla: yksi muutos lähetetty." msgstr[1] "Viime kerralla: %ld muutosta lähetetty." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Viime kerralla: yksi muutos sovellettu." msgstr[1] "Viime kerralla: %ld muutosta sovellettu." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Viime kerralla: Sovellettu %ld muutosta ja lähetetty %ld muutosta." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Ilmeni onglema viimeisen synkkauksen kanssa :\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Olet juuri palauttanut varmuuskopion. Muutoksia ei ole vielä synkattu " "kohteen %s kanssa." #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Nykyisen toiminnon päättymistä odotetaan..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Normaali synkkaus ei ole mahdollinen tällä kertaa. Palvelin suosittelee " "hidasta synkkausta, mutta tämä ei aina ehkä ole sitä, mitä haluat, jos " "molemmissa päissä on jo tietoja." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Synkkauspalvelu loppui odottamattomasti" #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Salasanapyyntöön ei vastattu. Voit tallentaa salasanan asetuksissa " "estääksesi pyynnön." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Synkkauspyynnön prosessoimisessa ilmeni ongelma. Voi auttaa, jos yrität " "uudelleen." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Sisäänkirjautuminen ei onnistunut. Voisiko käyttäjänimen tai salasanan " "kanssa olla ongelma?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Kielletty" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "Tietolähdettä ei löydy. Voisiko asetusten kanssa olla ongelma?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Etätietokantavirhe" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Paikallisen tietokannan kanssa on ongelmia. Voi auttaa, jos synkkaat " "uudelleen tai buuttaat." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Levykkeen tila lopussa" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "SyncML:n käsittely epäonnistui" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Serverin varmennus epäonnistui" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Asetustiedoston jäsennys epäonnistui" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Asetustiedoston lukeminen epäonnistui" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Asetuksia ei löydy" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Asetustiedostoa ei löytynyt" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Serveri lähetti virheellistä sisältöä" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Yhteyden varmenne on vanhentunut" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Yhteyden varmenne on virheellinen" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Palvelimeen ei saada yhteyttä. Ongelma voi olla tilapäinen tai palvelimen " "asetuksissa voi olla virhe. " #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "Serverin URL on virheellinen" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Serveriä ei löydy" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Virhe: %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Synkkaukseen vaaditaan salasana." #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Synkkaa salasanan kanssa" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Anna salasana synkkaukseen kohteen %s kanssa:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Toiminnot" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "tai" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Suora synkkaus" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Verkon synkkaus" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Palauta varmuuskopiosta" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Hidas synkkaus" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Aloita nollasta" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Hidas synkkaus vertailee kohteita molemmista päistä ja yrittää yhdistää ne. \n" "Tämä saattaa joissakin tapauksissa epäonnistua, johtaa kaksoiskappeleiden muodostumiseen tai tietojen menettämiseen." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Lisää uusi laite" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Lisää uusi palvelu" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Varmuuskopiot tehdään ennen jokaista synkkausta. Valitse varmuuskopio " "palautettavaksi. Kaikki tämän jälkeen tekemäsi muutokset menetetään. " #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Kalenteri" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Muuta tai muokkaa\n" "synkkauspalvelua" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Sulje" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Poista kaikki tiedot kohteessa Zyb \n" "ja korvaa ne omilla\n" "paikallisilla tiedoilla" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Poista kaikki paikalliset\n" "tiedot ja korvaa\n" "ne Zybin tiedoilla" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Korjaa sync\n" "hätätila" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Jos et näe palveluasi yllä mutta tiedät, että synkkauspalvelun tarjoajasi käyttää\n" "SyncML:ää, voit määrittää palvelun manuaalisesti." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Asetukset" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Synkkauksen hätätila" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Synkkaus edellyttää verkkoyhteyttä ja synkkauspalvelutiliä.\n" "Me tuemme seuraavia palveluita:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "Käytä Bluetoothia ja synkkaa tiedot yhdeltä laitteelta toiselle." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "Sinun täytyy lisätä Bluetooth-laitteet ennen kuin niitä voi synkata." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Ajantasalla" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synkronoi PIM-tiedot" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld mahdollistaa kontaktien,tapahtumien,tehtävien, ja viestien " "synkkaamisen. " #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "Google Sync voi kopioida ja synkata kontaktisi Gmail-kontakteihisi" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Varmuuskopioi kontaktisi ja kalenterisi. Synkkaa yhdellä klikkauksella, " "milloin ja missä tahansa (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Mobical-varmuuskopio- ja palautuspalvelun avulla voit varmuuskopioida omat " "mobiilitietosi ilmaiseksi ja varmasti." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB on yksinkertainen tapa tallentaa ja jakaa mobiilitietoja verkossa." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Mometoon avulla voi käyttää omia tietoja kaikilta koneilta, joilla on " "Internet-yhteys. " #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Konfiguraation tallennus epäonnistui" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Palvelulla pitää olla nimi ja palvelimen URL" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Tähän palveluun vaaditaan käyttäjätunnus" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Haluatko nollata kohteen %s asetukset? Tämä ei poista mitään synkattuja " "tietoja kummassakaan päässä." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Kyllä, nollaa." #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Ei, säilytä asetukset" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Haluatko poistaa kohteen %s asetukset? Tämä ei poista mitään synkattuja " "tietoja kummassakaan päässä, mutta poistaa nämä asetukset. " #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Kyllä, poista" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Nollaa asetukset" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Poista asetukset" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Tallenna ja käytä" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Tallenna ja korvaa\n" "nykyinen palvelu" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Lopeta laitteen käyttö" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Lopeta palvelun käyttö" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "Kohteen %s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Lähetä muutokset kohteeseen %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Vastaanota muutokset kohteesta %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Synkkaa" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Serverin osoite" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Tämä laite näyttää siltä, että se saattaisi olla '%s'. Jos tämä ei ole " "oikein, katso tätä tuettujen laitteiden luetteloa ja poimi omasi, jos se on " "luettelossa." #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Emme tiedä täsmälleen, mikä tämä laite on. Katso luetteloa tuetuista ja " "poimi omasi, jos se on luettelossa." #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth-laite" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - manuaalinen asetus" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Siirry sivustoon" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Tee asetukset nyt" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Käytä näitä asetuksia" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Käyttäjätunnus" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Salasana" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Nykyinen konfiguraatio on monimutkaisempi kuin täällä voidaan näyttää. " "Muutokset synkkaustilaan tai synkattuihin tietotyyppeihin korvaavat tämän " "konfiguroinnin. " #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Piilota serverin asetukset" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Näytä serverin asetukset" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Synkkaa synkkaussovelluksessa. " #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "Synkkaus käynnissä kohteessa %s" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "Tietokoneesi synkkaus on juuri aloitettu %s-synkkauspalvelulla." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "Kohteen %s synkkaus valmis" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "Tietokoneesi synkkaus on juuri lopetettu %s-synkkauspalvelulla." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Synkkauksen ongelma" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "Sorry, ilmeni ongelma synkkauksessa, jota sinun täytyy seurata." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Näytä" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Hylkää" syncevolution-1.5/po/fr.po0000644000373300001540000007664012326412403017115 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-09 19:05+0000\n" "Last-Translator: GLS_FRA2 \n" "Language-Team: French (http://www.transifex.net/projects/p/meego/team/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Synchronisation" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contacts" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Rendez-vous" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Tâches" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notes" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Rendez-vous et Tâches" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Synchronisation en cours de démarrage" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Voulez-vous effectuer une synchronisation lente avec %s ?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Oui, effectuer une synchronisation lente" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Non, annuler la synchronisation" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Voulez-vous effacer toutes les données locales et les remplacer avec les " "données de %s ? Ceci est en général une mauvaise idée." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Oui, supprimer et remplacer" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Non" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Voulez-vous effacer toutes les données de %s et les remplacer avec vos " "données locales ? Ceci est en général une mauvaise idée." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Essai d'annulation de la synchronisation" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Aucun service ou périphérique sélectionné" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - dernière synchronisation il y a quelques secondes" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - dernière synchronisation il y a moins d'une minute" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - dernière synchronisation il y a %ld minutes" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - dernière synchronisation il y a moins d'une heure" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - dernière synchronisation il y a %ld heures" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - dernière synchronisation hier" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - dernière synchronisation il y a %ld jours" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Synchroniser" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Synchronisation lente" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Autres options..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Sélectionner le service de synchronisation" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Modifier les paramètres du service" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Vous n'avez pas encore sélectionné de service de synchronisation ou de " "périphérique. Les services de synchronisation vous permettent de " "synchroniser vos données de votre netbook à un service web. Vous pouvez " "également synchroniser directement avec certains périphériques." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Synchroniser de nouveau" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Restauration en cours" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Synchronisation en cours" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Annuler la synchronisation" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Retourner à la synchronisation" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Synchronisation automatique" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Données affectées : %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Données affectées : aucunes" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Voulez-vous restaurer la sauvegarde de %s ? Toutes les modifications " "effectuées à partir de là seront perdues." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Oui, restaurer" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Sauvegardé avant la synchronisation avec %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Restaurer" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Une synchronisation normale avec %s est actuellement impossible. Vous pouvez" " effectuer une synchronisation lente à deux files ou alors reprendre à zéro." " Vous pouvez aussi restaurer une sauvegarde, mais une synchronisation lente " "ou une reprise à zéro seront nécessaires avant qu'une synchronisation soit " "possible." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "En cas de problème sérieux, vous pouvez essayer une synchronisation lente, " "reprendre à zéro ou alors restaurer depuis une sauvegarde." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Supprimer toutes\n" "les données locales\n" "et les remplacer avec\n" "les données de %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Supprimer toutes les données\n" "sur %s et les remplacer\n" "avec les données locales" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "" "Impossible d'obtenir la liste des services pris en charge depuis " "SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Un problème est survenu en communiquant avec le processus de " "synchronisation. Veuillez réessayer ultérieurement." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Échec de la restauration" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Échec de la synchronisation" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Restauration terminée" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Synchronisation terminée" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "'%s' en cours de préparation" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "'%s' en cours de réception" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "'%s' en cours d'envoi" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Il y a eu un rejet distant." msgstr[1] "Il y a eu %ld rejets distants." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Il y a eu un rejet local." msgstr[1] "Il y a eu %ld rejets locaux." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Il y a eu %ld rejets locaux et %ld rejets distants." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Dernière fois : pas de changement. " #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Dernière fois : un changement envoyé." msgstr[1] "Dernière fois : %ld changements envoyés." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Dernière fois : un changement reçu." msgstr[1] "Dernière fois : %ld changements reçus." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Dernière fois : %ld changements reçus et %ld changements envoyés." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Un problème est survenu lors de la dernière synchronisation :\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Vous venez de restaurer une sauvegarde. Les modifications n'ont pas encore " "été synchronisées avec %s" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "En attente de fin d'opération en cours..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Une synchronisation normale est actuellement impossible. Le serveur suggère " "une synchronisation lente, mais cela n'est pas forcément dans votre intérêt " "si les deux côtés contiennent déjà des données." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Processus de synchronisation terminé de façon inattendue." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "La demande de mot de passe n'a pas été prise en compte. Vous pouvez " "enregistrer le mot de passe dans les paramètres pour empêcher la demande." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Un problème est survenu lors du traitement de la demande de synchronisation." " Une nouvelle tentative peut se révéler utile." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Échec de connexion. Pourrait-il y avoir un problème avec votre nom " "d'utilisateur ou bien votre mot de passe ?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Interdit" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "Une source de données n'a pas pu être trouvée. Pourrait-il y avoir un " "problème avec les paramètres ?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Erreur de base de données à distance" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Il y a un problème avec la base de données locale. Synchroniser de nouveau " "ou bien redémarrer peut aider." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Il n'y a plus d'espace disponible sur le disque" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Impossible de terminer SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "L'autorisation du serveur a échoué" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Impossible d'analyser le fichier de configuration" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Impossible de lire le fichier de configuration" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Aucune configuration trouvée" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Aucun fichier de configuration trouvé" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Le serveur a transmis des données incorrectes" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Le certificat de la connexion a expiré" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "le certificat de la connexion est invalide" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Nous n'avons pas pu nous connecter au serveur. Il se peut que le problème " "soit temporaire ou bien qu’il y ait une erreur avec les paramètres." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "L'URL du serveur est mauvaise" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Le serveur n'a pas été trouvé" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Erreur %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Mot de passe nécessaire pour la synchronisation" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Synchronisation avec le mot de passe..." #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Veuillez saisir le mot de passe pour synchroniser avec %s :" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Actions" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "ou" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Synchronisation directe" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Synchronisation réseau" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Restaurer depuis une sauvegarde" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Synchronisation lente" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Reprendre à zéro" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Une synchronisation lente compare les articles des deux côtés et tente de les fusionner. \n" "Cela peut échouer dans certains cas, provoquant des duplicatas ou une perte d'information. " #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Nouveau peripherique" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Nouveau service" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Les sauvegardes sont effectuées à chaque synchronisation. Choisissez une " "sauvegarde à restaurer. Toutes les modifications effectuées à partir de là " "seront perdues." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendrier" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Changer ou modifier\n" "le service de\n" "synchronisation" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Fermer" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Supprimer toutes\n" "les données sur Zyb\n" "et les remplacer avec\n" "les données locales " #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Supprimer toutes\n" "les données locales\n" "et les remplacer avec\n" "les données de Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Réparer une\n" "urgence de\n" "synchronisation" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Si vous ne voyez pas votre service mais savez que votre fournisseur de services\n" "de synchronisation utilise SyncML, vous pouvez configurer un service manuellement." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Paramètres" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Urgence de synchronisation" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Pour synchroniser vous avez besoin d'une connexion réseau et d'un compte avec un service de synchronisation.\n" "Nous prenons en charge les services suivants :" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Utiliser Bluetooth pour synchroniser vos données d'un périphérique à " "l'autre." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Vous devrez ajouter des périphériques Bluetooth avant de pouvoir les " "synchroniser. " #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "À jour" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synchroniser les données du gestionnaire d'informations personnelles" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld vous permet de garder vos contacts, événements, tâches et " "notes synchronisés." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync permet de sauvegarder et synchroniser votre carnet d'adresses " "avec vos contacts Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Sauvegarde de vos contacts et calendrier. Synchronisation en un seul clic, " "n'importe quand, n'importe où (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Le service Mobical de sauvegarde et de restauration vous permet de " "sauvegarder vos données personnelles mobiles gratuitement et en toute " "sécurité." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB est une façon simple de stocker et de partager les informations mobiles " "en ligne." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo vous permet d'accéder à vos données personnelles depuis n'importe " "quel ordinateur connecté à Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Désolé, la sauvegarde de la configuration a échoué" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Le service doit avoir un nom et une URL de serveur" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Un nom d'utilisateur est nécessaire pour ce service" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Voulez-vous réinitialiser les paramètres pour %s ? Cela ne supprimera aucune" " information synchronisée de part et d’autre. " #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Oui, réinitialiser" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Non, conserver les paramètres" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Voulez-vous supprimer les paramètres pour %s ? Cela ne supprimera aucune " "information synchronisée de part et d’autre mais supprimera ces paramètres." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Oui, supprimer" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Rétablir les paramètres" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Supprimer les paramètres" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Sauvegarder et utiliser" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Sauvegarder et utiliser\n" "le service actuel" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Ne plus utiliser ce périphérique" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Ne plus utiliser ce service" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Envoyer les modifications à %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Recevoir les modifications de %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Synchroniser" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Adresse du serveur" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Il semble que le périphérique est un '%s'. Si ce n'est pas correct, veuillez" " consulter la liste de périphériques pris en charge et sélectionnez le votre" " s'il apparait dans la liste" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Nous ne savons pas exactement ce qu’est ce périphérique. Veuillez consulter " "la liste de périphériques pris en charge et sélectionnez le votre s'il " "apparait dans la liste" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Périphérique Bluetooth" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - configurer manuellement" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Lancer le site Web" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Configurer" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Utiliser ces paramètres" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Nom d'utilisateur" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Mot de passe" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "La configuration actuelle est plus complexe que ce qui peut être affiché " "ici. Les modifications apportées au mode synchronisation ou aux types de " "données synchronisées écraseront cette configuration." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Masquer les paramètres du serveur" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Afficher les paramètres du serveur" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Synchroniser dans l'application Synchronisation" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s est en cours de synchronisation" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "Démarrage de la synchronisation de votre ordinateur avec le service %s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "Synchronisation %s terminée" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "Synchronisation de votre ordinateur avec le service %s" #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Problème de synchronisation." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "Désolé, il y a un problème avec la synchronisation que vous tentez." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Affichage" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Ignorer" syncevolution-1.5/po/gl.po0000644000373300001540000003737312326412403017110 0ustar00nightlynightly00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # #: ../src/gtk-ui/sync-ui.c:764 # Xosé , 2009. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-10-01 19:27+0000\n" "PO-Revision-Date: 2009-10-14 21:52+0200\n" "Last-Translator: Xosé \n" "Language-Team: Galego \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 1.0\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "Sincronizar" #: ../src/gtk-ui/sync-ui.c:259 msgid "Addressbook" msgstr "Caderno de enderezos" #: ../src/gtk-ui/sync-ui.c:261 msgid "Calendar" msgstr "Calendario" #: ../src/gtk-ui/sync-ui.c:263 msgid "Todo" msgstr "Tarefa" #: ../src/gtk-ui/sync-ui.c:265 msgid "Memo" msgstr "Nota" #: ../src/gtk-ui/sync-ui.c:320 msgid "Failed to save current service in GConf configuration system" msgstr "" "Non foi posíbel gravar o servizo actual no sistema de configuración GConf" #: ../src/gtk-ui/sync-ui.c:331 msgid "Failed to save service configuration to SyncEvolution" msgstr "Non foi posíbel gravar a configuración do servizo en SyncEvolution" #: ../src/gtk-ui/sync-ui.c:416 msgid "Failed to get service configuration from SyncEvolution" msgstr "Fallou a obtención da configuración do servizo do SyncEvolution" #: ../src/gtk-ui/sync-ui.c:479 msgid "Failed to remove service configuration from SyncEvolution" msgstr "Fallou a eliminación da configuración do servizo do SyncEvolution" #: ../src/gtk-ui/sync-ui.c:599 msgid "Service must have a name and server URL" msgstr "O servizo ten que ter un nome e un URL de servidor" #. sync is no longer in progress for some reason #: ../src/gtk-ui/sync-ui.c:675 msgid "Failed to cancel: sync was no longer in progress" msgstr "Fallou a cancelación: xa non se está a sincronizar" #: ../src/gtk-ui/sync-ui.c:679 msgid "Failed to cancel sync" msgstr "Fallou a cancelación da sincronización" #: ../src/gtk-ui/sync-ui.c:683 msgid "Canceling sync" msgstr "A cancelar a sincronización" #: ../src/gtk-ui/sync-ui.c:697 msgid "Trying to cancel sync" msgstr "A tentar cancelar a sincronización" #: ../src/gtk-ui/sync-ui.c:704 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Quere eliminar todos os datos locais e substituílos por %s? Normalmente non " "se recomenda isto." #: ../src/gtk-ui/sync-ui.c:709 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Quere eliminar todos os datos de %s e substituílos polos seus datos locais? " "Normalmente non se recomenda isto." #: ../src/gtk-ui/sync-ui.c:726 msgid "No, cancel sync" msgstr "Non, cancelar a sincronización" #: ../src/gtk-ui/sync-ui.c:727 msgid "Yes, delete and replace" msgstr "Si, eliminar e substituír" #: ../src/gtk-ui/sync-ui.c:749 msgid "No sources are enabled, not syncing" msgstr "Non se activou ningunha fonte, non se sincroniza" #: ../src/gtk-ui/sync-ui.c:766 msgid "A sync is already in progress" msgstr "Xa hai unha sincronización en proceso" #: ../src/gtk-ui/sync-ui.c:768 msgid "Failed to start sync" msgstr "Foi imposíbel comezar a sincronización" #: ../src/gtk-ui/sync-ui.c:773 msgid "Starting sync" msgstr "A comezar a sincronización" #: ../src/gtk-ui/sync-ui.c:798 msgid "Last synced just seconds ago" msgstr "Sincronizouse por última vez só hai uns segundos" #: ../src/gtk-ui/sync-ui.c:801 msgid "Last synced a minute ago" msgstr "Sincronizouse por última vez hai un minuto" #: ../src/gtk-ui/sync-ui.c:804 #, c-format msgid "Last synced %ld minutes ago" msgstr "Sincronizouse por última vez hai %ld minutos" #: ../src/gtk-ui/sync-ui.c:807 msgid "Last synced an hour ago" msgstr "Sincronizouse por última vez hai unha hora" #: ../src/gtk-ui/sync-ui.c:810 #, c-format msgid "Last synced %ld hours ago" msgstr "Sincronizouse por última vez hai %ld horas" #: ../src/gtk-ui/sync-ui.c:813 msgid "Last synced a day ago" msgstr "Sincronizouse por última vez hai un día" #: ../src/gtk-ui/sync-ui.c:816 #, c-format msgid "Last synced %ld days ago" msgstr "Sincronizouse por última vez hai %ld días" #: ../src/gtk-ui/sync-ui.c:901 msgid "Sync again" msgstr "Sincronizar de novo" #: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29 msgid "Sync now" msgstr "Sincronizar agora" #: ../src/gtk-ui/sync-ui.c:912 msgid "Syncing" msgstr "A sincronizar" #: ../src/gtk-ui/sync-ui.c:918 msgid "Cancel sync" msgstr "Cancelar a sincronización" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:1265 #, c-format msgid "%s (not supported by this service)" msgstr "%s (non admitido por este servizo)" #: ../src/gtk-ui/sync-ui.c:1298 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "Houbo un rexeitamento remoto." msgstr[1] "Houbo %d rexeitamentos remotos." #: ../src/gtk-ui/sync-ui.c:1303 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "Houbo un rexeitamento local." msgstr[1] "Houbo %d rexeitamentos locais." #: ../src/gtk-ui/sync-ui.c:1308 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "Houbo %d rexeitamentos locais e %d rexeitamentos remotos." #: ../src/gtk-ui/sync-ui.c:1313 #, c-format msgid "Last time: No changes." msgstr "Última vez: Sen cambios." #: ../src/gtk-ui/sync-ui.c:1315 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "Última vez: Enviouse un cambio." msgstr[1] "Última vez: Enviáronse %d cambios." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:1323 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "Última vez: Aplicouse un cambio." msgstr[1] "Última vez: Aplicáronse %d cambios." #: ../src/gtk-ui/sync-ui.c:1328 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "Última vez: Aplicáronse %d cambios e enviáronse %d cambios." #: ../src/gtk-ui/sync-ui.c:1420 msgid "Failed to get server configuration from SyncEvolution" msgstr "Fallou a obtención da configuración do servidor do SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1472 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in " "sync." msgstr "" "ScheduleWorld permite manter os contactos, eventos, tarefas e notas en " "sincronía." #: ../src/gtk-ui/sync-ui.c:1475 msgid "" "Google Sync can back up and synchronize your Address Book with your Gmail " "contacts." msgstr "" "Google Sync pode crear unha copia de seguranza e sincronizar o seu caderno " "de enderezos cos seus contactos de Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-ui.c:1481 msgid "" "Back up your contacts and calendar. Sync with a singleclick, anytime, " "anywhere (DEMO)." msgstr "" "Faga unha copia de seguranza dos seus contactos e do seu calendario. " "Sincronice con só premer unha tecla, en calquera momento, en calquera lugar " "(DEMOSTRACIÓN)." #: ../src/gtk-ui/sync-ui.c:1509 msgid "New service" msgstr "Novo servizo" #: ../src/gtk-ui/sync-ui.c:1556 msgid "Server URL" msgstr "URL do servidor" #. TRANSLATORS: placeholder is a source name in settings window #: ../src/gtk-ui/sync-ui.c:1578 #, c-format msgid "%s URI" msgstr "URI %s" #: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17 msgid "Launch website" msgstr "Lanzar un sitio web" #: ../src/gtk-ui/sync-ui.c:1719 msgid "Setup and use" msgstr "Configurar e utilizar" #: ../src/gtk-ui/sync-ui.c:1765 msgid "Failed to get list of manually setup services from SyncEvolution" msgstr "" "Fallou a obtención da listaxe de servizos de configuración manuais do " "SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1806 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Fallou a obtención da listaxe de servizos admitidos do SyncEvolution" #. TODO: this is a hack... SyncEnd should be a signal of it's own, #. not just hacked on top of the syncevolution error codes #: ../src/gtk-ui/sync-ui.c:1967 msgid "Service configuration not found" msgstr "Non se atopou a configuración do servizo" #: ../src/gtk-ui/sync-ui.c:1973 msgid "Not authorized" msgstr "Non ten autorización" #: ../src/gtk-ui/sync-ui.c:1975 msgid "Forbidden" msgstr "Prohibido" #: ../src/gtk-ui/sync-ui.c:1977 msgid "Not found" msgstr "Non se atopa" #: ../src/gtk-ui/sync-ui.c:1979 msgid "Fatal database error" msgstr "Houbo un erro moi grave da base de datos" #: ../src/gtk-ui/sync-ui.c:1981 msgid "Database error" msgstr "Erro da base de datos" #: ../src/gtk-ui/sync-ui.c:1983 msgid "No space left" msgstr "Non hai espazo de abondo" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1986 msgid "Failed to process SyncML" msgstr "Fallou o procesamento de SyncML" #: ../src/gtk-ui/sync-ui.c:1988 msgid "Server authorization failed" msgstr "Fallou a autenticación do servidor" #: ../src/gtk-ui/sync-ui.c:1990 msgid "Failed to parse configuration file" msgstr "Fallou a análise do ficheiro de configuración" #: ../src/gtk-ui/sync-ui.c:1992 msgid "Failed to read configuration file" msgstr "Fallou a lectura do ficheiro de configuración" #: ../src/gtk-ui/sync-ui.c:1994 msgid "No configuration found" msgstr "Non se atopou ningunha configuración" #: ../src/gtk-ui/sync-ui.c:1996 msgid "No configuration file found" msgstr "Non se atopou ningún ficheiro de configuración" #: ../src/gtk-ui/sync-ui.c:1998 msgid "Server sent bad content" msgstr "O servidor enviou contento incorrecto" #: ../src/gtk-ui/sync-ui.c:2000 msgid "Transport failure (no connection?)" msgstr "Houbo un fallo do transporte (non hai conexión?)" #: ../src/gtk-ui/sync-ui.c:2002 msgid "Connection timed out" msgstr "A conexión excedeu o tempo de espera" #: ../src/gtk-ui/sync-ui.c:2004 msgid "Connection certificate has expired" msgstr "Caducou o certificado da conexión" #: ../src/gtk-ui/sync-ui.c:2006 msgid "Connection certificate is invalid" msgstr "O certificado da conexión non é válido" #: ../src/gtk-ui/sync-ui.c:2009 msgid "Connection failed" msgstr "Fallou a conexión" #: ../src/gtk-ui/sync-ui.c:2011 msgid "URL is bad" msgstr "O URL é incorrecto" #: ../src/gtk-ui/sync-ui.c:2013 msgid "Server not found" msgstr "Non se atopa o servidor" #: ../src/gtk-ui/sync-ui.c:2015 #, c-format msgid "Error %d" msgstr "Erro %d" #: ../src/gtk-ui/sync-ui.c:2025 msgid "Sync D-Bus service exited unexpectedly" msgstr "O servizo Sync D-Bus saíu inesperadamente" #: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079 msgid "Sync Failed" msgstr "Fallou a sincronización" #: ../src/gtk-ui/sync-ui.c:2071 msgid "Sync complete" msgstr "Rematou a sincronización" #: ../src/gtk-ui/sync-ui.c:2076 msgid "Sync canceled" msgstr "Cancelouse a sincronización" #. NOTE extra1 can be error here #: ../src/gtk-ui/sync-ui.c:2094 msgid "Ending sync" msgstr "A rematar a sincronización" #. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text #: ../src/gtk-ui/sync-ui.c:2118 #, c-format msgid "Preparing '%s'" msgstr "A preparar \"%s\"" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2130 #, c-format msgid "Sending '%s'" msgstr "A enviar \"%s\"" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2142 #, c-format msgid "Receiving '%s'" msgstr "A recibir \"%s\"" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "Datos" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "Non hai ningún servizo de sincronización en uso" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "Fallo da sincronización" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "Tipo de sincronización" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "Configuración manual" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "Servizos admitidos" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Engadir un servizo novo" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "Volver á sincronización" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "Mudar de servizo\n" "de sincronización" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "Eliminar todos os datos locais e substituílos por datos remotos" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "Eliminar todos os datos remotos e substituílos por datos locais" #: ../src/gtk-ui/ui.glade.h:13 msgid "Delete this service" msgstr "Eliminar este servizo" #: ../src/gtk-ui/ui.glade.h:14 msgid "Edit service settings" msgstr "Modificar a configuración do servizo" #: ../src/gtk-ui/ui.glade.h:15 msgid "" "If you don't see your service above but know that your sync provider uses " "SyncML\n" "you can setup a service manually." msgstr "" "Se non ve o servizo arriba mais saibe que o fornecedor de sincronización " "emprega SyncML,\n" "pode configurar un servizo manualmente." #: ../src/gtk-ui/ui.glade.h:18 msgid "Merge local and remote data (recommended)" msgstr "Fusionar os datos locais e os remotos (recomendado)" #: ../src/gtk-ui/ui.glade.h:19 msgid "Password" msgstr "Contrasinal" #: ../src/gtk-ui/ui.glade.h:20 msgid "Reset original server settings" msgstr "Restaurar a configuración orixinal do servidor" #: ../src/gtk-ui/ui.glade.h:21 msgid "Save and use this service" msgstr "Gardar e empregar este servizo" #: ../src/gtk-ui/ui.glade.h:22 msgid "Select sync service" msgstr "Seleccionar o servizo de sincronización" #: ../src/gtk-ui/ui.glade.h:23 msgid "Server settings" msgstr "Configuración do servidor" #: ../src/gtk-ui/ui.glade.h:24 msgid "Service name" msgstr "Nome do servizo" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "Desculpe, precisa dunha ligazón\n" "á Internet para sincronizar." #: ../src/gtk-ui/ui.glade.h:27 msgid "Stop using this service" msgstr "Deixar de empregar este servizo" #: ../src/gtk-ui/ui.glade.h:30 msgid "" "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "" "A sincronización non está dispoñíbel (o servizo D-Bus non responde). " "Desculpas." #: ../src/gtk-ui/ui.glade.h:31 msgid "" "To sync you'll need a network connection and an account with a sync " "service.\n" "We support the following services: " msgstr "" "Para sincronizar é precisa unha conexión á rede e unha conta con servizo de " "sincronización.\n" "Admitimos os servizos seguintes: " #: ../src/gtk-ui/ui.glade.h:33 msgid "Username" msgstr "Nome de usuario" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" "Aínda non seleccionou ningún servizo de sincronización. Os servizos de " "sincronización\n" " permiten sincronizar os datos entre o seu portátil e un servizo web." #: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Actualizado" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Sincronizar (GTK)" syncevolution-1.5/po/hu.po0000644000373300001540000003377612326412403017125 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-12-21 18:45+0000\n" "PO-Revision-Date: 2010-01-26 16:07+0100\n" "Last-Translator: Gergely Lónyai \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n!=1;\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-SourceCharset: utf-8\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 #: ../src/gtk-ui/ui.glade.h:20 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "Szinkronizálás" #. TRANSLATORS: The name was changed from 'Addressbook' to #. 'Contacts' to match naming in rest of moblin. Please make sure the #. name you use matches the name in the panel and Contacts application. #: ../src/gtk-ui/sync-ui.c:192 msgid "Contacts" msgstr "Kapcsolatok" #: ../src/gtk-ui/sync-ui.c:194 msgid "Calendar" msgstr "Naptár" #: ../src/gtk-ui/sync-ui.c:196 msgid "Todo" msgstr "TeendÅ‘k listája" #: ../src/gtk-ui/sync-ui.c:198 msgid "Memo" msgstr "Feljegyzés" #. TODO show in UI: failed to abort sync (while syncing) #: ../src/gtk-ui/sync-ui.c:273 msgid "Failed to abort sync" msgstr "Nem sikerült a szinkronizálás" #. TODO show in UI: sync failed (failed to even start) #: ../src/gtk-ui/sync-ui.c:287 msgid "Failed to start sync" msgstr "Nem sikerült a szinkronizálás elindítása" #: ../src/gtk-ui/sync-ui.c:293 msgid "Starting sync" msgstr "Szinkronizálás elindítása" #: ../src/gtk-ui/sync-ui.c:309 msgid "Trying to cancel sync" msgstr "Kísérlet a szinkronizálás leállítására" #: ../src/gtk-ui/sync-ui.c:316 #, c-format msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised." msgstr "" #: ../src/gtk-ui/sync-ui.c:321 #, c-format msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised." msgstr "" #: ../src/gtk-ui/sync-ui.c:338 msgid "No, cancel sync" msgstr "Ãllítsd le a szinkronizálást" #: ../src/gtk-ui/sync-ui.c:340 msgid "Yes, delete and replace" msgstr "Töröld vagy cseréld le" #: ../src/gtk-ui/sync-ui.c:377 msgid "Last synced just seconds ago" msgstr "Az utolsó szinkronizálás pár másodperce volt" #: ../src/gtk-ui/sync-ui.c:380 msgid "Last synced a minute ago" msgstr "Az utolsó szinkronizálás egy perce volt" #: ../src/gtk-ui/sync-ui.c:383 #, c-format msgid "Last synced %ld minutes ago" msgstr "Az utolsó szinkronizálás %ld perce volt" #: ../src/gtk-ui/sync-ui.c:386 msgid "Last synced an hour ago" msgstr "Az utolsó szinkronizálás pár órája volt" #: ../src/gtk-ui/sync-ui.c:389 #, c-format msgid "Last synced %ld hours ago" msgstr "Az utolsó szinkronizálás %ld órája volt" #: ../src/gtk-ui/sync-ui.c:392 msgid "Last synced a day ago" msgstr "Az utolsó szinkronizálás egy napja volt" #: ../src/gtk-ui/sync-ui.c:395 #, c-format msgid "Last synced %ld days ago" msgstr "Az utolsó szinkronizálás %ld napja volt" #: ../src/gtk-ui/sync-ui.c:480 msgid "Sync again" msgstr "Szinkronizálás újra" #: ../src/gtk-ui/sync-ui.c:482 #: ../src/gtk-ui/ui.glade.h:21 msgid "Sync now" msgstr "Szinkronizálás most" #: ../src/gtk-ui/sync-ui.c:493 msgid "Syncing" msgstr "Szinkronizálás" #: ../src/gtk-ui/sync-ui.c:499 msgid "Cancel sync" msgstr "Szinkronizálás leállítása" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:849 #, c-format msgid "%s (not supported by this service)" msgstr "%s (nem támogatott ezen az eszközön)" #: ../src/gtk-ui/sync-ui.c:1046 msgid "Failed to get list of configured services from SyncEvolution" msgstr "" #: ../src/gtk-ui/sync-ui.c:1117 msgid "Failed to get list of supported services from SyncEvolution" msgstr "" #: ../src/gtk-ui/sync-ui.c:1221 msgid "Sync complete" msgstr "A szinkronizálás kész" #: ../src/gtk-ui/sync-ui.c:1310 #, c-format msgid "Preparing '%s'" msgstr "'%s' elÅ‘készítése" #: ../src/gtk-ui/sync-ui.c:1313 #, c-format msgid "Receiving '%s'" msgstr "'%s' fogadása" #: ../src/gtk-ui/sync-ui.c:1316 #, c-format msgid "Sending '%s'" msgstr "'%s' küldése" #: ../src/gtk-ui/sync-ui.c:1705 msgid "Waiting for current operation to finish..." msgstr "Várakozás az aktuális művelet befejezÅ‘désére..." #: ../src/gtk-ui/sync-ui.c:1750 msgid "Not authorized" msgstr "Nincs jogosultság" #: ../src/gtk-ui/sync-ui.c:1752 msgid "Forbidden" msgstr "Visszautasítva" #: ../src/gtk-ui/sync-ui.c:1754 msgid "Not found" msgstr "Nem található" #: ../src/gtk-ui/sync-ui.c:1756 msgid "Fatal database error" msgstr "Végzetes adatbázishiba" #: ../src/gtk-ui/sync-ui.c:1758 msgid "Database error" msgstr "Adatbázishiba" #: ../src/gtk-ui/sync-ui.c:1760 msgid "No space left" msgstr "Nincs több szabad hely" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1763 msgid "Failed to process SyncML" msgstr "SyncML feldolgozása sikertelen" #: ../src/gtk-ui/sync-ui.c:1765 msgid "Server authorization failed" msgstr "A szerver azonosítása sikertelen" #: ../src/gtk-ui/sync-ui.c:1767 msgid "Failed to parse configuration file" msgstr "A konfigurációs fájl feldolgozása sikertelen" #: ../src/gtk-ui/sync-ui.c:1769 msgid "Failed to read configuration file" msgstr "Nem sikerült olvasni a konfigurációs fájlból" #: ../src/gtk-ui/sync-ui.c:1771 msgid "No configuration found" msgstr "A beállítások nem találhatóak" #: ../src/gtk-ui/sync-ui.c:1773 msgid "No configuration file found" msgstr "A konfigurációs fájl nem található" #: ../src/gtk-ui/sync-ui.c:1775 msgid "Server sent bad content" msgstr "A kiszolgáló hibás tartalmat küldött" #: ../src/gtk-ui/sync-ui.c:1777 msgid "Transport failure (no connection?)" msgstr "Az átvitel nem sikerült (nincs kapcsolat?)" #: ../src/gtk-ui/sync-ui.c:1779 msgid "Connection timed out" msgstr "IdÅ‘túllépés a kapcsolatban" #: ../src/gtk-ui/sync-ui.c:1781 msgid "Connection certificate has expired" msgstr "A kapcsolat tanúsítványa lejárt" #: ../src/gtk-ui/sync-ui.c:1783 msgid "Connection certificate is invalid" msgstr "A kapcsolat tanúsítványa érvénytelen." #: ../src/gtk-ui/sync-ui.c:1786 msgid "Connection failed" msgstr "A kapcsolódás sikertelen" #: ../src/gtk-ui/sync-ui.c:1788 msgid "URL is bad" msgstr "Az URL hibás" #: ../src/gtk-ui/sync-ui.c:1790 msgid "Server not found" msgstr "A kiszolgáló nem található" #: ../src/gtk-ui/sync-ui.c:1792 #, c-format msgid "Error %d" msgstr "Hiba %d" #. TODO show in UI: server disappeared #: ../src/gtk-ui/sync-ui.c:1803 msgid "Syncevolution.Server D-Bus service exited unexpectedly" msgstr "" #: ../src/gtk-ui/sync-ui.c:1806 msgid "Sync Failed" msgstr "Szinkronizáció sikertelen" #: ../src/gtk-ui/sync-ui-config.c:95 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui-config.c:100 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui-config.c:105 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "" #: ../src/gtk-ui/sync-ui-config.c:110 #, c-format msgid "Last time: No changes." msgstr "Utolsó idÅ‘pont: nincs változás." #: ../src/gtk-ui/sync-ui-config.c:112 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "Utolsó bejegyzés: Egy változtatás elküldve." msgstr[1] "Utolsó bejegyzés: %d változtatás elküldve." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui-config.c:120 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "Utolsó bejegyzés: Egy változtatás alkalmazva." msgstr[1] "Utolsó bejegyzés: %d változtatás alkalmazva." #: ../src/gtk-ui/sync-ui-config.c:125 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "Utolsó bejegyzés: %d változtatás alkalmazva, %d változtatás elküldve" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "Adat" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "Nincs használva sznkronizálás" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "Szinkronizáció sikertelen" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "Szinkronizálás típusa" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "Kézi beállítás" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "Támogatott eszközök" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Új szolgáltatás felvétele" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "Vissza a szinkronizációhoz" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "Szinkronizációs szolgáltatás\n" "megváltoztatása" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "Minden helyi adat törlése, és a távoli adatok letöltése" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "Minden távoli adat törlése, és minden helyi adat letöltése" #: ../src/gtk-ui/ui.glade.h:13 msgid "Edit service settings" msgstr "A szolgáltatás beállításainak módosítása" #: ../src/gtk-ui/ui.glade.h:14 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" #: ../src/gtk-ui/ui.glade.h:16 msgid "Merge local and remote data (recommended)" msgstr "A helyi és távoli adatok összefésülése (ajánlott)" #: ../src/gtk-ui/ui.glade.h:17 msgid "Select sync service" msgstr "Szinkronizációs szolgáltatás kiválasztása" #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "Bocsi, de kell egy internetkapcsolat\n" "a szinkronizáláshoz." #: ../src/gtk-ui/ui.glade.h:22 msgid "Sync settings" msgstr "Szinkronizációs beállítások" #: ../src/gtk-ui/ui.glade.h:23 msgid "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "Bocsi, a szinkronizálás jelenleg nem elérhetÅ‘ (a D-Bus szolgáltatás nem válaszol)." #: ../src/gtk-ui/ui.glade.h:24 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" #: ../src/gtk-ui/ui.glade.h:26 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" #: ../src/gtk-ui/sync.desktop.in.h:2 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Friss" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Sync (GTK)" #: ../src/gtk-ui/sync-config-widget.c:48 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:51 msgid "Google Sync can back up and synchronize your Address Book with your Gmail contacts." msgstr "A Google Sync a Címjegyzéket szinkronizálja a Google kapcsolatokkal" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:57 msgid "Back up your contacts and calendar. Sync with a singleclick, anytime, anywhere (DEMO)." msgstr "Kapcsolatok és a naptár mentése. Szinkronizálj egy klikkel bármikor, bárhol (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:227 msgid "Service must have a name and server URL" msgstr "A szolgáltatáshoz adj meg egy nevet és egy kiszolgáló URL címét" #: ../src/gtk-ui/sync-config-widget.c:271 msgid "Reset service" msgstr "Szolgáltatás újraindítása" #: ../src/gtk-ui/sync-config-widget.c:274 msgid "Delete service" msgstr "Szolgáltatás törlése" #: ../src/gtk-ui/sync-config-widget.c:284 msgid "Save and use" msgstr "Mentés és használat" #: ../src/gtk-ui/sync-config-widget.c:287 msgid "" "Save and replace\n" "current service" msgstr "" "Elment és a jelenlegi\n" "szolgáltatás lecserélése" #. TRANSLATORS: label for an entry in service configuration. #. * Placeholder is a source name in settings window. #. * Example: "Addressbook URI" #: ../src/gtk-ui/sync-config-widget.c:355 #, c-format msgid "%s URI" msgstr "URI: %s" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:419 msgid "Server URL" msgstr "Kiszolgáló URL" #. TRANSLATORS: this is the epander label for server settings #: ../src/gtk-ui/sync-config-widget.c:459 msgid "Hide server settings" msgstr "Kiszolgáló beállítások elrejtése" #: ../src/gtk-ui/sync-config-widget.c:461 msgid "Show server settings" msgstr "Kiszolgáló beállítások mutatása" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:512 #, c-format msgid "%s - manually setup" msgstr "%s - kézi beállítás" #. TRANSLATORS: linkbutton label #: ../src/gtk-ui/sync-config-widget.c:1189 msgid "Launch website" msgstr "Weboldal futtatása" #. TRANSLATORS: button label #: ../src/gtk-ui/sync-config-widget.c:1198 msgid "Set up now" msgstr "Beállítás most" #. TRANSLATORS: labels of entries #: ../src/gtk-ui/sync-config-widget.c:1236 msgid "Username" msgstr "Felhasználónév" #: ../src/gtk-ui/sync-config-widget.c:1251 msgid "Password" msgstr "Jelszó" #: ../src/gtk-ui/sync-config-widget.c:1295 msgid "Stop using service" msgstr "Szolgáltatás használatának leállítása" syncevolution-1.5/po/id.po0000644000373300001540000003544112326412403017074 0ustar00nightlynightly00000000000000#: ../src/gtk-ui/sync-ui.c:764 msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-10-01 19:27+0000\n" "PO-Revision-Date: \n" "Last-Translator: Andika Triwidada \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Indonesian\n" "X-Poedit-Country: INDONESIA\n" "X-Poedit-SourceCharset: utf-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "Selaraskan" #: ../src/gtk-ui/sync-ui.c:259 msgid "Addressbook" msgstr "Buku Alamat" #: ../src/gtk-ui/sync-ui.c:261 msgid "Calendar" msgstr "Kalender" #: ../src/gtk-ui/sync-ui.c:263 msgid "Todo" msgstr "Todo" #: ../src/gtk-ui/sync-ui.c:265 msgid "Memo" msgstr "Memo" #: ../src/gtk-ui/sync-ui.c:320 msgid "Failed to save current service in GConf configuration system" msgstr "Gagal menyimpan layanan kini ke sistem konfigurasi GConf" #: ../src/gtk-ui/sync-ui.c:331 msgid "Failed to save service configuration to SyncEvolution" msgstr "Gagal menyimpan konfigurasi layanan ke SyncEvolution" #: ../src/gtk-ui/sync-ui.c:416 msgid "Failed to get service configuration from SyncEvolution" msgstr "Gagal mendapat konfigurasi layanan dari SyncEvolution" #: ../src/gtk-ui/sync-ui.c:479 msgid "Failed to remove service configuration from SyncEvolution" msgstr "Gagal menghapus konfigurasi layanan dari SyncEvolution" #: ../src/gtk-ui/sync-ui.c:599 msgid "Service must have a name and server URL" msgstr "Layanan mesti punya URL server dan nama" #. sync is no longer in progress for some reason #: ../src/gtk-ui/sync-ui.c:675 msgid "Failed to cancel: sync was no longer in progress" msgstr "Gagal membatalkan: sync tak lagi sedang berlangsung" #: ../src/gtk-ui/sync-ui.c:679 msgid "Failed to cancel sync" msgstr "Gagal membatalkan sync" #: ../src/gtk-ui/sync-ui.c:683 msgid "Canceling sync" msgstr "Membatalkan sync" #: ../src/gtk-ui/sync-ui.c:697 msgid "Trying to cancel sync" msgstr "Mencoba membatalkan sync" #: ../src/gtk-ui/sync-ui.c:704 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Apakah Anda ingin menghapus semua data lokal dan menggantinya dengan data " "dari %s? Ini biasanya tak disarankan." #: ../src/gtk-ui/sync-ui.c:709 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Apakah Anda ingin menghapus semua data di %s dan menggantinya dengan data " "lokal Anda? Biasanya ini tak disarankan." #: ../src/gtk-ui/sync-ui.c:726 msgid "No, cancel sync" msgstr "Tidak, batalkan sync" #: ../src/gtk-ui/sync-ui.c:727 msgid "Yes, delete and replace" msgstr "Ya, hapus dan gantikan" #: ../src/gtk-ui/sync-ui.c:749 msgid "No sources are enabled, not syncing" msgstr "Tak ada sumber yang diaktifkan, tak menyelaraskan" #: ../src/gtk-ui/sync-ui.c:766 msgid "A sync is already in progress" msgstr "Syns sedang berlangsung" #: ../src/gtk-ui/sync-ui.c:768 msgid "Failed to start sync" msgstr "Gagal memulai sync" #: ../src/gtk-ui/sync-ui.c:773 msgid "Starting sync" msgstr "Memulai sync" #: ../src/gtk-ui/sync-ui.c:798 msgid "Last synced just seconds ago" msgstr "Diselaraskan terakhir beberapa detik yang lalu" #: ../src/gtk-ui/sync-ui.c:801 msgid "Last synced a minute ago" msgstr "Diselaraskan terakhir semenit yang lalu" #: ../src/gtk-ui/sync-ui.c:804 #, c-format msgid "Last synced %ld minutes ago" msgstr "Diselaraskan terakhir %ld menit yang lalu" #: ../src/gtk-ui/sync-ui.c:807 msgid "Last synced an hour ago" msgstr "Diselaraskan terakhir sejam yang lalu" #: ../src/gtk-ui/sync-ui.c:810 #, c-format msgid "Last synced %ld hours ago" msgstr "Diselaraskan terakhir %ld jam yang lalu" #: ../src/gtk-ui/sync-ui.c:813 msgid "Last synced a day ago" msgstr "Diselaraskan terakhir sehari yang lalu" #: ../src/gtk-ui/sync-ui.c:816 #, c-format msgid "Last synced %ld days ago" msgstr "Diselaraskan terakhir %ld hari yang lalu" #: ../src/gtk-ui/sync-ui.c:901 msgid "Sync again" msgstr "Sync lagi" #: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29 msgid "Sync now" msgstr "Sync sekarang" #: ../src/gtk-ui/sync-ui.c:912 msgid "Syncing" msgstr "Menyelaraskan" #: ../src/gtk-ui/sync-ui.c:918 msgid "Cancel sync" msgstr "Batalkan sync" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:1265 #, c-format msgid "%s (not supported by this service)" msgstr "%s (tak didukung oleh layanan ini)" #: ../src/gtk-ui/sync-ui.c:1298 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "Ada satu penolakan remote." msgstr[1] "Ada %d penolakan remote." #: ../src/gtk-ui/sync-ui.c:1303 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "Ada satu penolakan lokal." msgstr[1] "Ada %d penolakan lokal." #: ../src/gtk-ui/sync-ui.c:1308 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "Ada %d penolakan lokal dan %d penolakan " #: ../src/gtk-ui/sync-ui.c:1313 #, c-format msgid "Last time: No changes." msgstr "Terakhir kali: Tak ada perubahan." #: ../src/gtk-ui/sync-ui.c:1315 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "Terakhir kali: Dikirim satu perubahan." msgstr[1] "Terakhir kali: Dikirim %d perubahan." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:1323 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "Terakhir kali: Diterapkan satu perubahan." msgstr[1] "Terakhir kali: Diterapkan %d perubahan." #: ../src/gtk-ui/sync-ui.c:1328 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "Terakhir kali: Diterapkan %d perubahan dan dikirim %d perubahan." #: ../src/gtk-ui/sync-ui.c:1420 msgid "Failed to get server configuration from SyncEvolution" msgstr "Gagal mendapat konfigurasi server dari SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1472 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in " "sync." msgstr "" "ScheduleWorld memungkinkan Anda menjaga kontak, peristiwa, tugas, dan " "catatan Anda tetap selaras." #: ../src/gtk-ui/sync-ui.c:1475 msgid "" "Google Sync can back up and synchronize your Address Book with your Gmail " "contacts." msgstr "" "Google Sync dapat membuat cadangan dan menyelaraskan Buku Alamat Anda dengan " "kontak Gmail Anda." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-ui.c:1481 msgid "" "Back up your contacts and calendar. Sync with a singleclick, anytime, " "anywhere (DEMO)." msgstr "" "Buat cadangan kontak dan kalender Anda. Selaraskan dengan satu klik, " "kapanpun, dari manapun (DEMO)." #: ../src/gtk-ui/sync-ui.c:1509 msgid "New service" msgstr "Layanan baru" #: ../src/gtk-ui/sync-ui.c:1556 msgid "Server URL" msgstr "URL Server" #. TRANSLATORS: placeholder is a source name in settings window #: ../src/gtk-ui/sync-ui.c:1578 #, c-format msgid "%s URI" msgstr "%s URI" #: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17 msgid "Launch website" msgstr "Luncurkan situs web" #: ../src/gtk-ui/sync-ui.c:1719 msgid "Setup and use" msgstr "Persiapkan dan gunakan" #: ../src/gtk-ui/sync-ui.c:1765 msgid "Failed to get list of manually setup services from SyncEvolution" msgstr "" "Gagal mendapat daftar layanan yang disiapkan secara manual dari SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1806 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Gagal mendapat daftar layanan yang didukung dari SyncEvolution" #. TODO: this is a hack... SyncEnd should be a signal of it's own, #. not just hacked on top of the syncevolution error codes #: ../src/gtk-ui/sync-ui.c:1967 msgid "Service configuration not found" msgstr "Konfigurasi layanan tak ditemukan" #: ../src/gtk-ui/sync-ui.c:1973 msgid "Not authorized" msgstr "Tidak diijinkan" #: ../src/gtk-ui/sync-ui.c:1975 msgid "Forbidden" msgstr "Terlarang" #: ../src/gtk-ui/sync-ui.c:1977 msgid "Not found" msgstr "Tidak ketemu" #: ../src/gtk-ui/sync-ui.c:1979 msgid "Fatal database error" msgstr "Galat basis data fatal" #: ../src/gtk-ui/sync-ui.c:1981 msgid "Database error" msgstr "Galat basis data" #: ../src/gtk-ui/sync-ui.c:1983 msgid "No space left" msgstr "Tidak ada ruang tersisa" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1986 msgid "Failed to process SyncML" msgstr "Gagal memroses SyncML" #: ../src/gtk-ui/sync-ui.c:1988 msgid "Server authorization failed" msgstr "Otorisasi server gagal" #: ../src/gtk-ui/sync-ui.c:1990 msgid "Failed to parse configuration file" msgstr "Gagal mengurai berkas konfigurasi" #: ../src/gtk-ui/sync-ui.c:1992 msgid "Failed to read configuration file" msgstr "Gagal membaca berkas konfigurasi" #: ../src/gtk-ui/sync-ui.c:1994 msgid "No configuration found" msgstr "Konfigurasi tak ditemukan" #: ../src/gtk-ui/sync-ui.c:1996 msgid "No configuration file found" msgstr "Berkas konfigurasi tak ditemukan" #: ../src/gtk-ui/sync-ui.c:1998 msgid "Server sent bad content" msgstr "Server mengirim muatan cacat" #: ../src/gtk-ui/sync-ui.c:2000 msgid "Transport failure (no connection?)" msgstr "Kegagalan transport (tiada koneksi?)" #: ../src/gtk-ui/sync-ui.c:2002 msgid "Connection timed out" msgstr "Koneksi time out" #: ../src/gtk-ui/sync-ui.c:2004 msgid "Connection certificate has expired" msgstr "Sertifikat server sudah kadaluwarsa" #: ../src/gtk-ui/sync-ui.c:2006 msgid "Connection certificate is invalid" msgstr "Sertifikat koneksi tak valid" #: ../src/gtk-ui/sync-ui.c:2009 msgid "Connection failed" msgstr "Koneksi gagal" #: ../src/gtk-ui/sync-ui.c:2011 msgid "URL is bad" msgstr "URL cacat" #: ../src/gtk-ui/sync-ui.c:2013 msgid "Server not found" msgstr "Server tak ditemukan" #: ../src/gtk-ui/sync-ui.c:2015 #, c-format msgid "Error %d" msgstr "Galat %d" #: ../src/gtk-ui/sync-ui.c:2025 msgid "Sync D-Bus service exited unexpectedly" msgstr "Layanan D-Bus Sync keluar tak disangka-sangka" #: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079 msgid "Sync Failed" msgstr "Sync Gagal" #: ../src/gtk-ui/sync-ui.c:2071 msgid "Sync complete" msgstr "Sync komplit" #: ../src/gtk-ui/sync-ui.c:2076 msgid "Sync canceled" msgstr "Sync dibatalkan" #. NOTE extra1 can be error here #: ../src/gtk-ui/sync-ui.c:2094 msgid "Ending sync" msgstr "Mengakhiri sync" #. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text #: ../src/gtk-ui/sync-ui.c:2118 #, c-format msgid "Preparing '%s'" msgstr "Menyiapkan '%s'" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2130 #, c-format msgid "Sending '%s'" msgstr "Mengirim '%s'" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2142 #, c-format msgid "Receiving '%s'" msgstr "Menerima '%s'" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "Data" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "Tak ada layanan sync yang dipakai" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "Kegagalan sync" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "Tipe Sync" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "Penyiapan manual" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "Layanan yang didukung" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Tambah layanan baru" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "Kembali ke sync" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "Ubah layanan\n" "sync" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "Hapus semua data lokal dan gantikan dengan data remote" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "Hapus semua data remote dan gantikan dengan data lokal" #: ../src/gtk-ui/ui.glade.h:13 msgid "Delete this service" msgstr "Hapus layanan ini" #: ../src/gtk-ui/ui.glade.h:14 msgid "Edit service settings" msgstr "Edit pengaturan layanan" #: ../src/gtk-ui/ui.glade.h:15 msgid "" "If you don't see your service above but know that your sync provider uses " "SyncML\n" "you can setup a service manually." msgstr "" "Bila Anda tak melihat layanan Anda di atas tapi tahu bahwa penyedia sync " "Anda memakai SyncML\n" "Anda dapat mempersiapkan suatu layanan secara manual." #: ../src/gtk-ui/ui.glade.h:18 msgid "Merge local and remote data (recommended)" msgstr "Gabunga data lokal dan remote (disarankan)" #: ../src/gtk-ui/ui.glade.h:19 msgid "Password" msgstr "Kata sandi" #: ../src/gtk-ui/ui.glade.h:20 msgid "Reset original server settings" msgstr "Tata ulang pengaturan asli server" #: ../src/gtk-ui/ui.glade.h:21 msgid "Save and use this service" msgstr "Simpan dan pakai layanan ini" #: ../src/gtk-ui/ui.glade.h:22 msgid "Select sync service" msgstr "Pilih layanan penyelarasan" #: ../src/gtk-ui/ui.glade.h:23 msgid "Server settings" msgstr "Pengaturan server" #: ../src/gtk-ui/ui.glade.h:24 msgid "Service name" msgstr "Nama layanan" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "Maaf, Anda perlu sambungan\n" "internet untuk sync." #: ../src/gtk-ui/ui.glade.h:27 msgid "Stop using this service" msgstr "Berhenti pakai layanan ini" #: ../src/gtk-ui/ui.glade.h:30 msgid "" "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "Penyelarasan tak tersedia (layanan D-Bus tak menjawab), maaf." #: ../src/gtk-ui/ui.glade.h:31 msgid "" "To sync you'll need a network connection and an account with a sync " "service.\n" "We support the following services: " msgstr "" "Untuk sync Anda perlu koneksi jaringan dan sebuah akun dari layanan sync.\n" "Kami mendukung layanan berikut:" #: ../src/gtk-ui/ui.glade.h:33 msgid "Username" msgstr "Nama pengguna" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" "Anda belum memilih suatu layanan sync. Layanan sync memungkinkan Anda\n" "menyelaraskan data antara netbook Anda dan suatu layanan web." #: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Terkini" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Sync (GTK)" syncevolution-1.5/po/it.po0000644000373300001540000007517112326412403017120 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Milo Casagrande , 2009. # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 00:27+0000\n" "Last-Translator: GLS_Translator_ITA2 \n" "Language-Team: Italian (http://www.transifex.net/projects/p/meego/team/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Sincronizzazione" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contatti" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Appuntamenti" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Compiti" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Note" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Appuntamenti e compiti" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Avvio sincronizzazione" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Vuoi effettuare la sincronizzazione lenta con %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Sì, effettua la sincronizzazione lenta" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Annulla sincronizzazione" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Eliminare i dati locali e sostituirli con quelli da %s? Solitamente questo " "non è consigliato." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Elimina e sostituisci" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "No" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Eliminare i dati in %s e sostituirli con quelli locali? Solitamente questo " "non è consigliato." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Tentativo di annullare la sincronizzazione" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Nessun servizio o dispositivo selezionato" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - Ultima sincronizzazione pochi secondi fa" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - Ultima sincronizzazione un minuto fa" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - Ultima sincronizzazione %ld minuti fa" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - Ultima sincronizzazione un'ora fa" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - Ultima sincronizzazione %ld ore fa" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - Ultima sincronizzazione un giorno fa" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - Ultima sincronizzazione %ld giorni fa" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Sincronizza ora" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Sincronizzazione lenta" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Altre opzioni..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Seleziona servizio di sincronizzazione" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Modifica impostazioni" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Non è ancora stato selezionato un servizio di sincronizzazione. Questi " "servizi consentono di sincronizzare i dati tra il proprio netbook e un " "servizio web. E' anche possibile sincronizzare direttamente con alcuni " "dispositivi." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Sincronizza ancora" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Ripristino" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Sincronizzazione" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Annulla sincronizzazione" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Torna indietro" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Sincronizzazione automatica" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Dati interessati: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Dati interessati: nessuno" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Vuoi ripristinare il backup da %s? Tutte le modifiche apportate da allora " "saranno perse." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Sì, ripristina" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Back up effettuato prima della sincronizzazione con %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Ripristina" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Una sincronizzazione normale con %s non è possibile in questo momento. Si " "può fare una sincronizzazione lenta a due vie o iniziare da zero. Si può " "anche ripristinare dal backup, ma una sincronizzazione lenta o un inizio da " "zero saranno comunque richiesti prima che sia possibile una sincronizzazione" " normale." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Se qualcosa è andato terribilmente storto, puoi provare una sincronizzazione" " lenta, iniziare da zero o ripristinare dal backup" #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Eliminare i dati locali\n" "e sostituirli con\n" "quelli da %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Eliminare i dati su\n" "%s e sostituirli\n" "con quelli locali" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Recupero elenco dei servizi supportati da SyncEvolution non riuscito" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Si è verificato un problema di comunicazione con il processo di " "sincronizzazione. Si prega di riprovare più tardi." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Ripristino non riuscito" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Sincronizzazione non riuscita" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Ripristino completato" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Sincronizzazione completata" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Preparazione di '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Ricezione di '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Invio di '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Si è verificato un rifiuto remoto." msgstr[1] "Si sono verificati %ld rifiuti remoti." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Si è verificato un rifiuto locale." msgstr[1] "Si sono verificati %ld rifiuti locali." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Si sono verificati %ld rifiuti locali e %ld remoti." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Ultima volta: nessuna modifica." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Ultima volta: inviata una modifica." msgstr[1] "Ultima volta: inviate %ld modifiche." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Ultima volta: applicata una modifica." msgstr[1] "Ultima volta: applicate %ld modifiche." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Ultima volta: applicate %ld modifiche e inviate %ld." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Si è verificato un problema con l'ultima sincronizzazione:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Hai appena ripristinato un backup. I cambiamenti non sono ancora stati " "sincronizzati con %s" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "In attesa che termini l'operazione..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Una sincronizzazione normale non è possibile in questo momento. Il server " "suggerisce una sincronizzazione lenta, ma questo potrebbe non essere sempre " "quello che vuoi, se entrambe le estremità hanno dati." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Il servizio di sincronizzazione è terminato inaspettatamente." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "La richiesta della password ha ricevuto risposta. È possibile salvare la " "password nelle impostazioni per evitare la richiesta." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "C'è stato un problema di elaborazione delle richieste di sincronizzazione. " "Riprovare potrebbe risolvere il problema." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Impossibile effettuare il login. Ci potrebbe essere un problema con il tuo " "nome utente o la password?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Proibito" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "Impossibile trovare la sorgente. Ci potrebbe essere un problema con le " "impostazioni?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Errore remoto nel database" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "C'è un problema con il database locale. Sincronizzare di nuovo o riavviare." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Spazio esaurito sul disco" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Elaborazione SyncML non riuscita" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Autorizzazione server non riuscita" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Analisi del file di configurazione non riuscita" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Lettura del file di configurazione non riuscita" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Non è stata trovata alcuna configurazione" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Non è stato trovato alcun file di configurazione" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Il server ha inviato dei contenuti errati" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Il certificato della connessione è scaduto" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Il certificato della connessione non è valido" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Non siamo stati in grado di connetterci al server. Il problema potrebbe " "essere temporaneo o ci potrebbe essere qualcosa di sbagliato con le " "impostazioni." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "L'URL del server non è corretto" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Il server non è stato trovato" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Errore %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Password necessaria per la sincronizzazione" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Sincronizza con password" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Inserire la password per la sincronizzazione con %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Azioni" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "oppure" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Sincronizzazione diretta" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Sincronizzazione di rete" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Ripristina dal backup" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Sincronizzazione lenta" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Inizia da zero" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Una sincronizzazione lenta compara gli elementi da entrambe le parti e tenta di metterli insieme. \n" "Questo potrebbe non riuscire in alcuni casi, portando a duplicati o a informazioni perse." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Aggiungi un nuovo dispositivo" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Aggiungi servizio" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "I backup sono effettuati prima di ogni sincronizzazione. Scegli un backup da" " ripristinare. Ogni modifica fatta da allora andrà persa." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendario" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Cambia o modifica\n" "sincronizzazione" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Chiudi" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Eliminare i dati su Zyb \n" "e sostituirli con quelli locali" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Eliminare i dati locali\n" "e sostituirli con quelli da Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Risolvi una\n" "sincronizzazione di\n" "emergenza" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Se non vengono visualizzati i propri servizi, ma si è certi che il proprio provider\n" "usa SyncML, è possibile impostare un servizio manualmente." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Impostazioni" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Sincronizzazione di emergenza" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Per effettuare la sincronizzazione sono necessari una connessione e un account con un servizio di sincronizzazione.\n" "I servizi supportati sono: " #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "Usa Blootooth per sincronizzare i dati da un dispositivo all'altro." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Devi aggiungere i dispositivi Bluetooth prima che possano essere " "sincronizzati." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Aggiornato" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Sincronizza dati PIM" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld consente di tenere sincronizzati contatti, eventi, attività e " "note." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync è in grado di eseguire backup di sicurezza e di sincronizzare la" " propria rubrica con i contatti di Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Eseguire una copia di sicurezza dei propri contatti e del proprio " "calendario. Sincronizzare con un solo clic, sempre e ovunque (dimostrativo)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Il servizio Mobical Backup and Restore ti permette di effettuare backup dei " "tuoi mobile data gratuitamente e in tutta sicurezza." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB è un modo semplice di memorizzare e condividere le tue informazioni " "mobili online." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo ti permettere di accedere ai tuoi dati personali da qualsiasi " "computer connesso a internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Siamo spiacenti, impossibile salvare la configurazione" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Il servizio deve avere un nome e un indirizzo del server" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Il nome utente è necessario per questo servizio" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Vuoi ripristinare le impostazioni per %s? Questa operazione non rimuoverà " "nessuna informazione sincronizzata." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Sì, ripristina" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "No, mantieni le impostazioni" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Vuoi eliminare le impostazioni per %s? Questa operazione non rimuoverà " "nessuna informazione sincronizzata ma rimuoverà le configurazioni per questo" " servizio." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Sì, elimina" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Reimposta le impostazioni" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Elimina le impostazioni" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Salva e usa" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Salva e sostituisci\n" " il servizio" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Non usare il servizio" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Non usare il servizio" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "URI di %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Invia modifiche a %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Ricevi le modifiche per %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sincronizzazione" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Indirizzo server" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Il dispositivo sembra essere un '%s'. Se questo non è corretto, si prega di " "dare un'occhiata alla lista dei dispositivi supportati e scegliere quello " "più appropriato" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Non sappiamo che sia esattamente questo dispositivo. Si prega di dare " "un'occhiata alla lista delle periferiche supportate e scegliere quella " "appropriata se è elencata" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Dispositivo Bluetooth" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - configura manualmente" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Visita il sito web" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Configura adesso" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Usare queste impostazioni" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Nome utente" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Password" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "La configurazione del servizio attuale è più complessa di quello che può " "essere mostrato qui. Le modifiche alla modalità di sincronizzazione o ai " "tipi di dati sincronizzati sovrascriveranno quella configurazione." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Nascondi impostazioni server" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Mostra impostazioni server" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sincronizza nell'applicazione di sincronizzazione" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s è in fase di sincronizzazione" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "Abbiamo appena iniziato a sincronizzare il computer con il servizio di " "sincronizzazione %s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "Sincronizzazione di %s completata" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" "Abbiamo finito di sincronizzare il computer con il servizio di " "sincronizzazione %s." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Problema di sincronizzazione." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "C'è un problema con la sincronizzazione che richiede attenzione." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Visualizza" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Scarta" syncevolution-1.5/po/ja.po0000644000373300001540000007677012326412403017104 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 06:05+0000\n" "Last-Translator: GLS_Translator_JPN \n" "Language-Team: Japanese (http://www.transifex.net/projects/p/meego/team/ja/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "åŒæœŸåŒ–" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "連絡先" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "予定" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "タスク" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "メモ" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "予定ã¨ã‚¿ã‚¹ã‚¯" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "åŒæœŸåŒ–ã‚’é–‹å§‹ã—ã¦ã„ã¾ã™" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "%s ã§ä½Žé€ŸåŒæœŸã—ã¾ã™ã‹?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "ã¯ã„ã€ä½Žé€ŸåŒæœŸã—ã¾ã™" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "ã„ã„ãˆã€åŒæœŸåŒ–をキャンセルã™ã‚‹" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "ローカルデータをã™ã¹ã¦å‰Šé™¤ã—ã¦ã€%s ã®ãƒ‡ãƒ¼ã‚¿ã«ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿé€šå¸¸ã¯æŽ¨å¥¨ã•れã¾ã›ã‚“。" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "ã¯ã„ã€å‰Šé™¤ã—ã¦ç½®ãæ›ãˆã‚‹" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "ã„ã„ãˆ" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "%s ã®ãƒ‡ãƒ¼ã‚¿ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¦ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ãƒ¼ã‚¿ã«ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿé€šå¸¸ã¯æŽ¨å¥¨ã•れã¾ã›ã‚“。" #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "åŒæœŸåŒ–ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚’試行ã—ã¦ã„ã¾ã™" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "サービスã¾ãŸã¯ãƒ‡ãƒã‚¤ã‚¹ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - åŒæœŸã•れã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - 1 分å‰ã«åŒæœŸã•れã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - %ld 分å‰ã«åŒæœŸã•れã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - 1 時間å‰ã«åŒæœŸã•れã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - %ld 時間å‰ã«åŒæœŸã•れã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - 剿—¥ã«åŒæœŸã•れã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - %ld æ—¥å‰ã«åŒæœŸã•れã¾ã—ãŸ" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "今ã€åŒæœŸåŒ–ã™ã‚‹" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "ä½Žé€ŸåŒæœŸ" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "ä»–ã®ã‚ªãƒ—ション" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "åŒæœŸåŒ–ã‚µãƒ¼ãƒ“ã‚¹ã‚’é¸æŠž" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "サービス設定ã®ç·¨é›†" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "åŒæœŸåŒ–サービスã¾ãŸã¯ãƒ‡ãƒã‚¤ã‚¹ãŒã¾ã é¸æŠžã•れã¦ã„ã¾ã›ã‚“ã€‚åŒæœŸåŒ–サービスã§ãƒãƒƒãƒˆãƒ–ック㨠Web " "サービス間ã®ãƒ‡ãƒ¼ã‚¿ã‚’åŒæœŸã§ãã¾ã™ã€‚ã¾ãŸã€ä»–ã®ä¸€éƒ¨ã®ãƒ‡ãƒã‚¤ã‚¹ã¨ç›´æŽ¥åŒæœŸã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "ã‚‚ã†1åº¦åŒæœŸåŒ–" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "復元中" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "åŒæœŸåŒ–中" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "åŒæœŸåŒ–ã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "åŒæœŸåŒ–ã«æˆ»ã‚‹" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "è‡ªå‹•åŒæœŸ" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "影響をå—ã‘ãŸãƒ‡ãƒ¼ã‚¿: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "影響をå—ã‘ãŸãƒ‡ãƒ¼ã‚¿: ãªã—" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "%s ã‹ã‚‰ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を復元ã—ã¾ã™ã‹? ã“れã¾ã§ã«å¤‰æ›´ã—ãŸå†…容ã¯ã™ã¹ã¦å¤±ã‚れã¦ã—ã¾ã„ã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "ã¯ã„ã€å¾©å…ƒã—ã¾ã™" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "%s ã§åŒæœŸã™ã‚‹å‰ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•れã¾ã™" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "復元" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "%s " "ã§ã®é€šå¸¸åŒæœŸã¯ç¾åœ¨ã§ãã¾ã›ã‚“。低速ã§åŒæ–¹å‘åŒæœŸã™ã‚‹ã‹ã€æœ€åˆã‹ã‚‰ã‚„り直ã™ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を復元ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ãŒã€é€šå¸¸ã®åŒæœŸã‚’行ã†å‰ã«ä½Žé€ŸåŒæœŸã‚’行ã†ã‹ã€æœ€åˆã‹ã‚‰ã‚„り直ã™å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "深刻ãªå•題ãŒç”Ÿã˜ãŸå ´åˆã¯ã€ä½Žé€ŸåŒæœŸã‚’行ã†ã‹ã€æœ€åˆã‹ã‚‰ã‚„り直ã™ã‹ã€ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒã§ãã¾ã™ã€‚" #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "ローカルデータをã™ã¹ã¦\n" "削除ã—ã¦ã€%s ã®ãƒ‡ãƒ¼ã‚¿ã«\n" "ç½®ãæ›ãˆã¾ã™" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "%s ã®ãƒ‡ãƒ¼ã‚¿ã‚’ã™ã¹ã¦å‰Šé™¤\n" "ã—ã¦ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ãƒ¼ã‚¿ã«\n" "ç½®ãæ›ãˆã¾ã™" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "サãƒãƒ¼ãƒˆã•れã¦ã„るサービスã®ãƒªã‚¹ãƒˆã‚’ SyncEvolution ã‹ã‚‰å…¥æ‰‹ã™ã‚‹ã®ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "åŒæœŸåŒ–プロセスã¸ã®é€šä¿¡ã«å•題ãŒã‚りã¾ã—ãŸã€‚時間を置ã„ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。" #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "復元ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "åŒæœŸã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "復元ã®å®Œäº†" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "åŒæœŸåŒ–ã®å®Œäº†" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "待機中ã§ã™ï¼š%s" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "å—信中ã§ã™ï¼š%s" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "é€ä¿¡ä¸­ã§ã™ï¼š%s" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "ãƒªãƒ¢ãƒ¼ãƒˆã§æŽ¥ç¶šæ‹’å¦ãŒ 1 ä»¶ã‚りã¾ã—ãŸã€‚@ãƒªãƒ¢ãƒ¼ãƒˆã§æŽ¥ç¶šæ‹’å¦ãŒ %ldl ä»¶ã‚りã¾ã—ãŸã€‚" #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "ãƒ­ãƒ¼ã‚«ãƒ«ã§æŽ¥ç¶šæ‹’å¦ãŒ 1 ä»¶ã‚りã¾ã—ãŸã€‚@ãƒ­ãƒ¼ã‚«ãƒ«ã§æŽ¥ç¶šæ‹’å¦ãŒ %ld ä»¶ã‚りã¾ã—ãŸã€‚" #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "ãƒ­ãƒ¼ã‚«ãƒ«ã®æŽ¥ç¶šæ‹’å¦ãŒ %ld ä»¶ã€ãŠã‚ˆã³ãƒªãƒ¢ãƒ¼ãƒˆã®æŽ¥ç¶šæ‹’å¦ãŒ %ld ä»¶ã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "å‰å›žï¼šå¤‰æ›´ãªã—。" #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "å‰å›žï¼š1 箇所ã®å¤‰æ›´ãŒé€ä¿¡ã•れã¾ã—ãŸã€‚@å‰å›žï¼š%ld 箇所ã®å¤‰æ›´ãŒé€ä¿¡ã•れã¾ã—ãŸã€‚" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "å‰å›žï¼š1 箇所ã®å¤‰æ›´ã‚’é©ç”¨ã—ã¾ã—ãŸã€‚@å‰å›žï¼š%ld 箇所ã®å¤‰æ›´ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚" #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "å‰å›žï¼š%ld 箇所ã®å¤‰æ›´ã‚’é©ç”¨ã—ã€%ld 箇所ã®å¤‰æ›´ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚" #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "å‰å›žã®åŒæœŸåŒ–ã«æ¬¡ã®å•題ãŒã‚りã¾ã—ãŸ:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®å¾©å…ƒãŒå®Œäº†ã—ã¾ã—ãŸã€‚変更内容ã¯ã¾ã  %s ã¨åŒæœŸã•れã¦ã„ã¾ã›ï½Ž" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "å®Ÿè¡Œä¸­ã®æ“作ã®çµ‚了を待機ã—ã¦ã„ã¾ã™..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "é€šå¸¸åŒæœŸã¯ç¾åœ¨ã§ãã¾ã›ã‚“。サーãƒãƒ¼ã¯ä½Žé€ŸåŒæœŸã‚’推奨ã—ã¦ã„ã¾ã™ãŒã€åŒæ–¹ã«æ—¢ã«ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚‹å ´åˆã¯æœŸå¾…通りã®çµæžœã«ãªã‚‰ãªã„å ´åˆãŒã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "åŒæœŸã‚µãƒ¼ãƒ“スãŒçªç„¶çµ‚了ã—ã¾ã—ãŸã€‚" #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰è¦æ±‚ã«ç­”ãˆã¦ã„ã¾ã›ã‚“。設定ã§ãƒ‘スワードをä¿å­˜ã™ã‚‹ã¨ã€ãƒ‘スワードãŒè¦æ±‚ã•れãªã‚ˆã†ã«ã§ãã¾ã™ã€‚" #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "åŒæœŸåŒ–è¦æ±‚ã®å‡¦ç†ã«å•題ãŒã‚りã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。" #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚ユーザーåã¾ãŸã¯ãƒ‘スワードã«å•題ãŒã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "アクセスãŒç¦æ­¢ã•れã¦ã„ã¾ã™" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "データã®ã‚½ãƒ¼ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。設定ã«å•題ãŒã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "リモート データベースã®ã‚¨ãƒ©ãƒ¼" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "ローカル データベースã«å•題ãŒã‚りã¾ã™ã€‚å†åº¦åŒæœŸã‚’行ã†ã‹ã€å†èµ·å‹•ã§è§£æ±ºã§ãã‚‹ã‹ã‚‚知れã¾ã›ã‚“。" #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "ディスクã«ç©ºã領域ãŒã‚りã¾ã›ã‚“" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "SyncML プロセスã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "サーãƒãƒ¼èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "設定ファイルã®ä¸­æ–­ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "設定ファイルã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "設定項目ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "設定ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "サーãƒãƒ¼ãŒæ‚ªã„コンテンツをé€ä¿¡ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "æŽ¥ç¶šè¨¼æ˜Žæ›¸ã®æœŸé™ãŒåˆ‡ã‚Œã¦ã„ã¾ã™" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "接続証明書ãŒç„¡åйã§ã™" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。障害ã¯ä¸€æ™‚çš„ã§ã‚ã‚‹å¯èƒ½æ€§ã‚‚ã‚りã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã®è¨­å®šã«å•題ãŒã‚ã‚‹å¯èƒ½æ€§ã‚‚ã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "サーãƒãƒ¼ã® URL ãŒæ­£ã—ãã‚りã¾ã›ã‚“" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "サーãƒãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "エラー:%d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "åŒæœŸã«ã¯ãƒ‘スワードãŒå¿…è¦ã§ã™" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "パスワード付ãåŒæœŸ" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "%s ã¨åŒæœŸã™ã‚‹ãŸã‚ã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "æ“作" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "ã¾ãŸã¯" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "ç›´æŽ¥åŒæœŸ" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åŒæœŸ" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒ" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "ä½Žé€ŸåŒæœŸ" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "最åˆã‹ã‚‰ã‚„り直ã™" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "ä½Žé€ŸåŒæœŸã§ã¯åŒæ–¹ã®ã‚¢ã‚¤ãƒ†ãƒ ãŒæ¯”較ã•れã€ãƒžãƒ¼ã‚¸ãŒè©¦è¡Œã•れã¾ã™ã€‚\n" "失敗ã—ãŸå ´åˆã€æƒ…å ±ã®é‡è¤‡ã‚„æå¤±ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "æ–°è¦ãƒ‡ãƒã‚¤ã‚¹" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "æ–°è¦ã‚µãƒ¼ãƒ“ス" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯åŒæœŸã‚’実行ã™ã‚‹å‰ã«å¿…ãšå®Ÿè¡Œã•れã¾ã™ã€‚ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®å¾©å…ƒã‚’é¸æŠžã—ã¦ãã ã•ã„。ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—時以é™ã®å¤‰æ›´å†…容ã¯å¤±ã‚れã¾ã™ã€‚" #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "カレンダー" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "åŒæœŸåŒ–サービスã®\n" "変更ã¾ãŸã¯ç·¨é›†" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "é–‰ã˜ã‚‹" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Zyb 上ã®ãƒ‡ãƒ¼ã‚¿ã‚’ã™ã¹ã¦\n" "削除ã—ã¦ã€ãƒ­ãƒ¼ã‚«ãƒ«æƒ…å ±\n" "ã«ç½®ãæ›ãˆã¾ã™" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "ローカル情報をã™ã¹ã¦l\n" "削除ã—ã¦ã€Zyb ã®ãƒ‡ãƒ¼ã‚¿l\n" "ã«ç½®ãæ›ãˆã¾ã™" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "ç·Šæ€¥åŒæœŸåŒ–\n" "を修正" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "ã”利用ã®åŒæœŸåŒ–プロãƒã‚¤ãƒ€ãƒ¼ãŒ SyncML を使用ã—ã¦ã„ã¦ã‚‹ã®ã«ã‚µãƒ¼ãƒ“スãŒä¸Šã«\n" "表示ã•れãªã„å ´åˆã¯ã€ã‚µãƒ¼ãƒ“スを手動ã§è¨­å®šã—ã¦ãã ã•ã„。" #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "設定" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "ç·Šæ€¥åŒæœŸåŒ–" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "åŒæœŸåŒ–機能を使用ã™ã‚‹ã«ã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã¨åŒæœŸåŒ–サービスã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒ\n" "å¿…è¦ã§ã™ã€‚以下ãŒã€ã‚µãƒãƒ¼ãƒˆã•れã¦ã„るサービスã§ã™ã€‚" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "Bluetooth を使用ã—ã¦ãƒ‡ãƒã‚¤ã‚¹åŒå£«ã®ãƒ‡ãƒ¼ã‚¿ã‚’åŒæœŸã—ã¾ã™ã€‚" #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "åŒæœŸã‚’行ã†å‰ã« Bluetooth デãƒã‚¤ã‚¹ã‚’追加ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "PIM データã®åŒæœŸ" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "ScheduleWorld ã§ã¯ã€é€£çµ¡å…ˆã€ã‚¤ãƒ™ãƒ³ãƒˆã€ã‚¿ã‚¹ã‚¯ã€ãƒ¡ãƒ¢ã‚’åŒæœŸã•ã›ã¦ãŠãã“ã¨ãŒã§ãã¾ã™ã€‚" #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "Google Sync ã§ã¯ã€é€£çµ¡å…ˆã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã€Gmail ã®é€£çµ¡å…ˆã¨åŒæœŸã§ãã¾ã™ã€‚" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "連絡先ã¨ã‚«ãƒ¬ãƒ³ãƒ€ãƒ¼ã‚’ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ã¾ã™ã€‚ã„ã¤ã§ã‚‚ã€ã©ã“ã§ã‚‚ã€ã‚¯ãƒªãƒƒã‚¯ 1 ã¤ã§åŒæœŸã—ã¾ã™ (デモ)。" #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "Mobical ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŠã‚ˆã³å¾©å…ƒã‚µãƒ¼ãƒ“スを使用ã™ã‚‹ã¨ã€ç„¡æ–™ã§å€‹äººã®æºå¸¯é›»è©±ãƒ‡ãƒ¼ã‚¿ã‚’安全ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ãã¾ã™ã€‚" #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "ZYB を使用ã™ã‚‹ã¨æºå¸¯é›»è©±ã®æƒ…報をオンラインã§ç°¡å˜ã«ä¿å­˜ã—ãŸã‚Šå…±æœ‰ã§ãã¾ã™ã€‚" #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "Memotoo を使用ã™ã‚‹ã¨ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã—ãŸã‚³ãƒ³ãƒ”ュータã‹ã‚‰è‡ªåˆ†ã®å€‹äººãƒ‡ãƒ¼ã‚¿ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚" #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "設置ã®ä¿å­˜ã«å¤±æ•—ã—ã¾ã—ãŸ" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "サービスã«ã¯åå‰ã¨ã‚µãƒ¼ãƒãƒ¼ã® URL ãŒå¿…è¦ã§ã™" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "ã“ã®ã‚µãƒ¼ãƒ“スã«ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒå¿…è¦ã§ã™" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "%s ã®è¨­å®šå†…容をリセットã—ã¾ã™ã‹? ã“ã®æ“作を行ã£ã¦ã‚‚åŒæ–¹ã®åŒæœŸã•ã‚ŒãŸæƒ…å ±ã¯ä¸€åˆ‡å‰Šé™¤ã•れã¾ã›ã‚“。" #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "ã¯ã„ã€ãƒªã‚»ãƒƒãƒˆã—ã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "ã„ã„ãˆã€è¨­å®šã‚’ãã®ã¾ã¾ã«ã—ã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "%s ã®è¨­å®šã‚’削除ã—ã¾ã™ã‹? ã“ã®æ“作を行ã£ã¦ã‚‚åŒæ–¹ã®åŒæœŸã—ãŸæƒ…å ±ã¯ä¸€åˆ‡å‰Šé™¤ã•れã¾ã›ã‚“ãŒã€ã©ã¡ã‚‰å´ã®è¨­å®šã‚‚削除ã•れã¾ã™ã€‚" #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "ã¯ã„ã€å‰Šé™¤ã—ã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "設定ã®ãƒªã‚»ãƒƒãƒˆ" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "設定ã®å‰Šé™¤" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "ä¿å­˜ã—ã¦ä½¿ç”¨ã—ã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "ä¿å­˜ã—ã¦ã“ã®ã‚µãƒ¼ãƒ“ス\n" "ã‚’ç½®ãæ›ãˆã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "デãƒã‚¤ã‚¹ã®ä½¿ç”¨ã‚’中止ã™ã‚‹" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "サービスã®ä½¿ç”¨ã‚’中止ã™ã‚‹" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s ã® URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "%s ã«å¤‰æ›´ã‚’é€ä¿¡ã—ã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "%s ã‹ã‚‰å¤‰æ›´ã‚’å—ä¿¡ã—ã¾ã™" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "åŒæœŸåŒ–" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "サーãƒãƒ¼ãƒ»ã‚¢ãƒ‰ãƒ¬ã‚¹" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã¯ã€Œ%sã€ã¨åˆ¤æ–­ã•れã¾ã—ãŸã€‚æ­£ã—ããªã„å ´åˆã¯ã€ã‚µãƒãƒ¼ãƒˆã•れã¦ã„るデãƒã‚¤ã‚¹ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã”利用ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’判別ã§ãã¾ã›ã‚“。サãƒãƒ¼ãƒˆã•れã¦ã„るデãƒã‚¤ã‚¹ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã”利用ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’é¸æŠžã—ã¦ãã ã•ã„。" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth デãƒã‚¤ã‚¹" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - 手動設定" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Web サイトã«ã‚¢ã‚¯ã‚»ã‚¹" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "ã™ãã«è¨­å®šã™ã‚‹" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "ã“れらã®è¨­å®šã‚’使用ã™ã‚‹" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "ユーザーå" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "パスワード" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "ç¾åœ¨ã®ã‚µãƒ¼ãƒ“ス設定ã¯ã“ã“ã«è¡¨ç¤ºã§ãる内容よりも複雑ã§ã™ã€‚åŒæœŸãƒ¢ãƒ¼ãƒ‰ã¾ãŸã¯åŒæœŸãƒ‡ãƒ¼ã‚¿ã¸ã®å¤‰æ›´ã¯ã€ãã®è¨­å®šå†…容を上書ãã—ã¾ã™ã€‚" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "サーãƒã®è¨­å®šã‚’éš ã™" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "サーãƒã®è¨­å®šã‚’表示ã™ã‚‹" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "åŒæœŸåŒ–アプリケーション内ã®åŒæœŸ" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s ã¯åŒæœŸä¸­ã§ã™ã€‚" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "ãŠä½¿ã„ã®ãƒ‡ãƒã‚¤ã‚¹ã¨ %s åŒæœŸåŒ–サービスã®åŒæœŸã‚’é–‹å§‹ã—ã¾ã—ãŸã€‚" #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s ã®åŒæœŸåŒ–ãŒå®Œäº†ã—ã¾ã—ãŸ" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "ã”利用ã®ãƒ‡ãƒã‚¤ã‚¹ã¨ %s åŒæœŸåŒ–サービスã®åŒæœŸãŒå®Œäº†ã—ã¾ã—ãŸã€‚" #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "åŒæœŸåŒ–ã«å•題ãŒã‚りã¾ã™ã€‚" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "接続対象ã®åŒæœŸåŒ–サービスã«å•題ãŒã‚りã¾ã™ã€‚" #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "表示" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "é–‰ã˜ã‚‹" syncevolution-1.5/po/ko.po0000644000373300001540000007516212326412403017115 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-08 21:49+0000\n" "Last-Translator: GLS_KOR \n" "Language-Team: Korean (http://www.transifex.net/projects/p/meego/team/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "ë™ê¸°í™”" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "ì—°ë½ì²˜" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "약ì†" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "작업" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "메모" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "ì•½ì† ë° ìž‘ì—…" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "ë™ê¸°í™” 시작 " #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr " %sê³¼ì˜ ë™ê¸°í™”를 늦추시겠습니까?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "예, ë™ê¸°í™”를 늦춰주십시오." #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "아니요, ë™ê¸°í™”를 취소하겠습니다." #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "모든 로컬 ë°ì´í„°ì„ 삭제하고 %s로 ë¶€í„°ì˜ ë°ì´í„°ë¡œ 바꾸시겠습니까? í•­ìƒ ê¶Œí•˜ì§€ëŠ” 않습니다" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "예, 삭제하시고 변경하십시오" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "아니요." #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "%sì— ìžˆëŠ” 모든 ë°ì´í„°ë¥¼ 삭제하고 ë‹¹ì‹ ì˜ ë¡œì»¬ ë°ì´í„°ë¡œ 바꾸시겠습니까? í•­ìƒ ê¶Œí•˜ì§€ëŠ” 않습니다." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "ë™ê¸°í™” 취소 시ë„" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "서비스나 장치가 ì„ íƒë˜ì§€ 않았ìŒ" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - 방금 ë™ê¸°í™”ë¨" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - ì¼ ë¶„ ì „ ë™ê¸°í™”ë¨" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - %ld ë¶„ ì „ ë™ê¸°í™”ë¨" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - 한 시간 ì „ ë™ê¸°í™”ë¨" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - %ld 시간 ì „ ë™ê¸°í™”ë¨" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - 하루 ì „ ë™ê¸°í™”ë¨" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - %ld ì¼ ì „ ë™ê¸°í™”ë¨" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "지금 ë™ê¸°í™” 시ë„" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "ëŠë¦° ë™ê¸°í™”" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "기타 옵션..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "ë™ê¸°í™” 서비스를 ì„ íƒí•˜ì‹­ì‹œì˜¤." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "서비스 설정 편집" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "ë™ê¸°í™” 서비스나 장치를 ì•„ì§ ì„ íƒí•˜ì§€ 않았습니다. ë™ê¸°í™” 서비스는 ë„·ë¶ê³¼ 웹 서비스 사ì´ì˜ ë°ì´í„°ë¥¼ ë™ê¸°í™” 시켜ì¤ë‹ˆë‹¤. ë˜í•œ ì¼ë¶€ 장치를" " 사용하여 ì§ì ‘ ë™ê¸°í™”í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. " #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "다시 ë™ê¸°í™” 시ë„" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "ë³µì›ì¤‘" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "ë™ê¸°í™” 시ë„중" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "ë™ê¸°í™” 취소" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "ë™ê¸°í™”로 다시 ëŒì•„가기" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "ìžë™ ë™ê¸°í™”" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "ì˜í–¥ë°›ì€ ë°ì´í„°: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "ì˜í–¥ë°›ì€ ë°ì´í„°: ì—†ìŒ" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "%sì—서 ë°±ì—…ì„ ë³µì›í•˜ì‹œê² ìŠµë‹ˆê¹Œ? ê·¸ ì´í›„ì˜ ë³€ê²½ ë‚´ìš©ì€ ëª¨ë‘ ì†ì‹¤ë©ë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "네, ë³µì›í•´ 주십시오." #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "%s와 ë™ê¸°í™”하기 ì „ì— ë°±ì—…ë˜ì—ˆìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "ë³µì›" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "ì§€ê¸ˆì€ %sì™€ì˜ ì •ìƒì ì¸ ë™ê¸°í™”ê°€ 가능하지 않습니다. ëŠë¦° ì–‘ë°©í–¥ ë™ê¸°í™”를 하거나 처ìŒë¶€í„° 새로 시작할 수 있습니다. ë°±ì—…ì„ ë³µì›í•  수ë„" " 있지만, ì •ìƒì ì¸ ë™ê¸°í™”ê°€ 가능해지기 전까지는 ëŠë¦° ë™ê¸°í™”를 하거나 처ìŒë¶€í„° 새로 시작해야 합니다." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "뭔가 아주 잘못ë˜ì—ˆì„ 경우, ëŠë¦° ë™ê¸°í™”를 시ë„해보거나 처ìŒë¶€í„° 새로 시작하거나 백업으로부터 ë³µì›í•  수 있습니다." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "모든 로컬 ë°ì´í„°ë¥¼\n" "삭제하고 %sì˜ ë°ì´í„°ë¡œ\n" "êµì²´í•˜ì‹­ì‹œì˜¤." #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "%sì˜ ë°ì´í„°ë¥¼ 모ë‘\n" "삭제하고 로컬 ë°ì´í„°ë¡œ\n" "êµì²´í•˜ì‹­ì‹œì˜¤." #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "SyncEvolution으로 부터 ì§€ì› ì„œë¹„ìŠ¤ 목ë¡ì„ 불러오기를 실패했습니다." #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "ë™ê¸°í™” í”„ë¡œì„¸ìŠ¤ì™€ì˜ í†µì‹ ì— ë¬¸ì œê°€ 있습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하십시오." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "ë³µì› ì‹¤íŒ¨" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "ë™ê¸°í™” 실패" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "ë³µì› ì™„ë£Œ" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "ë™ê¸°í™” 완료" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "'%s' 준비하는 중" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "'%s' 받는 중" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "'%s' 보내는 중" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "%ld ê°œì˜ ì›ê²© 거부가 있었습니다." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "%ld ê°œì˜ ë¡œì»¬ 거부가 있었습니다." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "%ld ê°œì˜ ë¡œì»¬ 거부와 %ld ê°œì˜ ì›ê²© 거부가 있었습니다. " #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "지난 시간: ë³€ë™ ì‚¬í•­ ì—†ìŒ." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "최근: %ld ê°œì˜ ë³€ê²½ ì‚¬í•­ì„ ë³´ëƒˆìŠµë‹ˆë‹¤." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "최근: %ld ê°œì˜ ë³€ê²½ ì‚¬í•­ì„ ì ìš©í–ˆìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "최근: %ld ê°œì˜ ë³€ê²½ ë‚´ìš©ì„ ì ìš©í–ˆê³ , %ld ê°œì˜ ë³€ê²½ ë‚´ìš©ì„ ë³´ëƒˆìŠµë‹ˆë‹¤." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "최근 ë™ê¸°í™”ì— ë¬¸ì œê°€ 있습니다.\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "방금 ë°±ì—…ì„ ë³µì›í–ˆìŠµë‹ˆë‹¤. 변경 ë‚´ìš©ì€ ì•„ì§ %s와 ë™ê¸°í™”ë˜ì§€ 않았습니다." #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "현재 ìž‘ë™ì´ ë나기를 기다리고 있습니다..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "ì§€ê¸ˆì€ ì •ìƒì ì¸ ë™ê¸°í™”ê°€ 가능하지 않습니다. 서버는 ëŠë¦° ë™ê¸°í™”를 제안하지만, ì´ë¯¸ 양쪽 ëì— ë°ì´í„°ê°€ 있는 경우 ì´ê²ƒì´ í•­ìƒ ê·€í•˜ê°€ " "ì›í•˜ì‹œëŠ” ë°©ë²•ì´ ì•„ë‹ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "ë™ê¸°í™” 프로세스가 ê°‘ìžê¸° 종료했습니다." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "암호 ìš”ì²­ì— ì‘답하지 않았습니다. ì„¤ì •ì— ì•”í˜¸ë¥¼ 저장하면 ìš”ì²­ì„ í•˜ì§€ 않습니다." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "ë™ê¸°í™” ìš”ì²­ì„ ì²˜ë¦¬í•˜ëŠ” ì¤‘ì— ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 시ë„하면 문제가 í•´ê²°ë  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "로그ì¸í•˜ì§€ 못했습니다. ì‚¬ìš©ìž ì´ë¦„ì´ë‚˜ ì•”í˜¸ì— ë¬¸ì œê°€ 있습니까?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "금지" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "ë°ì´í„° ì›ë³¸ì„ ì°¾ì„ ìˆ˜ 없습니다. 서버 ì„¤ì •ì— ë¬¸ì œê°€ 있습니까?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "ì›ê²© ë°ì´í„°ë² ì´ìФ 오류" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "ì´ê²ƒì€ 로컬 ë°ì´í„°ë² ì´ìФ 문제입니다. 다시 ë™ê¸°í™”하거나 재부트하면 문제가 í•´ê²°ë  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "디스í¬ì— ë‚¨ì€ ê³µê°„ì´ ì—†ìŒ" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "SyncML 프로세스 실패" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "서버 권한 부여 실패" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "구성 íŒŒì¼ êµ¬ë¬¸ ë¶„ì„ ì‹¤íŒ¨" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "구성요소 íŒŒì¼ ì½ê¸° 실패" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "구성요소를 ì°¾ì„수 없습니다." #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "구성요소 파ì¼ì„ 찾지 못했습니다." #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "서버가 ì•ˆì¢‹ì€ ì»¨í…츠를 보냈습니다." #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "ì—°ê²° ì¸ì¦ì´ 만료ë˜ì—ˆìŠµë‹ˆë‹¤. " #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "ì—°ê²° ì¸ì¦ì´ 유효하지 않습니다." #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "ì„œë²„ì— ì—°ê²°í•  수 없습니다. ì´ ë¬¸ì œëŠ” ì¼ì‹œì ì´ê±°ë‚˜ ì„¤ì •ì— ë¬¸ì œê°€ ìžˆì„ ìˆ˜ 있습니다." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "서버 URLì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "서버를 ì°¾ì„ ìˆ˜ 없습니다." #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "오류 %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "ë™ê¸°í™”하려면 암호가 필요합니다." #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "암호 ë™ê¸°í™”" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "%s ë™ê¸°í™” 암호를 입력하십시오." #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "ë™ìž‘" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "ë˜ëŠ”" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "ì§ì ‘ ë™ê¸°í™”" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "ë„¤íŠ¸ì›Œí¬ ë™ê¸°í™”" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "백업으로부터 ë³µì›" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "ëŠë¦° ë™ê¸°í™”" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "처ìŒë¶€í„° 새로 시작" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "ëŠë¦° ë™ê¸°í™”는 ì–‘ë°©í–¥ì˜ í•­ëª©ì„ ë¹„êµí•œ 다ìŒ, ì´ë“¤ì€ 병합하려고 합니다.\n" "ì´ê²ƒì€ ì¼ë¶€ì˜ 경우 실패할 수 있으며 ê·¸ ê²°ê³¼ 복제ë˜ê±°ë‚˜ ë˜ëŠ” ì •ë³´ì˜ ì†ì‹¤ì„ 가져올 수 있습니다." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "새로운 장치 추가" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "새로운 서비스 추가" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "ë°±ì—…ì€ ë§¤ë²ˆ ë™ê¸°í™”하기 ì „ì— ë§Œë“¤ì–´ì§‘ë‹ˆë‹¤. ë³µì›í•  ë°±ì—…ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. ê·¸ ì´í›„ì˜ ë³€ê²½ ë‚´ìš©ì€ ëª¨ë‘ ì†ì‹¤ë©ë‹ˆë‹¤." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "캘린ë”" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "ë™ê¸°í™” 서비스\n" "변경 ë˜ëŠ” 편집" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "닫기" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Zybì˜ ëª¨ë“  ë°ì´í„°ë¥¼\n" "삭제하고 로컬 정보로\n" "êµì²´í•˜ì‹­ì‹œì˜¤." #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "모든 로컬 정보를\n" "삭제하고 Zyb ë°ì´í„°ë¡œ\n" "êµì²´í•˜ì‹­ì‹œì˜¤." #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "ë™ê¸°í™” 수리\n" "비ìƒì‹œ" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "만약 ë‹¹ì‹ ì˜ ì„œë¹„ìŠ¤ê°€ ë³´ì´ì§€ëŠ” 않지만 ë‹¹ì‹ ì˜ ë™ê¸°í™” 제공ìžê°€ \n" "SyncMLì„ ì‚¬ìš©í•˜ëŠ”ê²ƒì„ ì•Œê³  있다면\n" "서비스를 수ë™ìœ¼ë¡œ 설정할 수 있습니다." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "설정값" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "ë™ê¸°í™” 비ìƒ" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "ë™ê¸°í™”를 하려면 ë„¤íŠ¸ì›Œí¬ ì—°ê²°ê³¼ 계정 서비스가 필요합니다.\n" "ë‹¤ìŒ ì„œë¹„ìŠ¤ë¥¼ ì§€ì›í•©ë‹ˆë‹¤." #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "ë°ì´í„°ë¥¼ 한 장치ì—서 다른 장치로 ë™ê¸°í™”하려면 블루투스를 사용하십시오." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "ë°ì´í„°ê°€ ë™ê¸°í™”ë˜ê¸° ì „ì— ë¸”ë£¨íˆ¬ìŠ¤ë¥¼ 추가해야 합니다." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "최신" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "PIM ë°ì´í„° ë™ê¸°í™”" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "scheduleworldì—서 ê·€ì‚¬ì˜ ì—°ë½ì²˜, ì´ë²¤íЏ, 작업 ë° ë™ê¸°í™” 노트를 ë³´ì¡´í•  수 있습니다. " #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "Google Syncì—서 ê·€í•˜ì˜ ì—°ë½ì²˜ 기ë¡ì„ Gmail ì—°ë½ì²˜ë¡œ 백업하거나 ë™ê¸°í™”í•  수 있습니다. " #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "ê·€í•˜ì˜ ì—°ë½ì²˜ ë° ì¼ì •ì„ ë°±ì—…í•©ë‹ˆë‹¤. 한 ë²ˆì˜ í´ë¦­ìœ¼ë¡œ 언제 어디서나 ë™ê¸°í™”ê°€ 가능합니다(DEMO). " #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "Mobical 백업과 ë³µì› ì„œë¹„ìŠ¤ë¥¼ 사용하면 ê°œì¸ìš© ëª¨ë°”ì¼ ë°ì´í„°ë¥¼ 무료로 안전하게 백업할 수 있습니다." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "ZYB는 ëª¨ë°”ì¼ ì •ë³´ë¥¼ 온ë¼ì¸ìœ¼ë¡œ 저장하고 공유할 수 있는 간단한 방법입니다." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "Memotoo를 사용하면 ì¸í„°ë„·ì— ì—°ê²°ëœ ì»´í“¨í„°ì—서 ê°œì¸ìš© ë°ì´í„°ë¥¼ 액세스할 수 있습니다." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "죄송합니다만 êµ¬ì„±ì„ ì €ìž¥í•˜ì§€ 못했습니다." #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "서비스는 ë°˜ë“¯ì´ ì´ë¦„ ë° ì„œë²„ URLì´ ìžˆì–´ì•¼ 합니다." #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "ì´ ì„œë¹„ìŠ¤ë¥¼ ì´ìš©í•˜ë ¤ë©´ ì‚¬ìš©ìž ì´ë¦„ì„ ìž…ë ¥í•´ì•¼ 합니다." #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "%sì˜ ì„¤ì •ê°’ì„ ë‹¤ì‹œ 설정하시겠습니까? ì´ê²ƒì€ ë™ê¸°í™”ëœ ì •ë³´ë¥¼ ì–´ëŠ í•œìª½ì—ì„œë„ ì œê±°í•˜ì§€ 않습니다." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "예, 재설정합니다." #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "아니요, ì„¤ì •ê°’ì„ ìœ ì§€í•©ë‹ˆë‹¤." #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "%sì˜ ì„¤ì •ê°’ì„ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ? ì´ê²ƒì€ ë™ê¸°í™”ëœ ì •ë³´ë¥¼ ì–´ëŠ í•œìª½ì—ì„œë„ ì œê±°í•˜ì§€ëŠ” 않지만 ì´ ì„¤ì •ê°’ë“¤ì€ ì œê±°í•©ë‹ˆë‹¤." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "예, 삭제합니다." #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "설정값 재설정" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "설정값 ì‚­ì œ" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "저장 ë° ì‚¬ìš©" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "현재 서비스를\n" "저장하고 êµì²´í•©ë‹ˆë‹¤." #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "장치 사용 중단" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "서비스 사용 중단" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "%s으로 변경 ë‚´ìš©ì„ ë³´ëƒ…ë‹ˆë‹¤." #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "%sì—서 변경 ë‚´ìš©ì„ ë°›ìŠµë‹ˆë‹¤." #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "ë™ê¸°í™”" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "서버 주소" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "ì´ ìž¥ì¹˜ëŠ” '%s'ì¸ ê²ƒ 같습니다. 그렇지 않으면 ì§€ì› ìž¥ì¹˜ 목ë¡ì—서 ì—´ê±°ëœ ê²ƒì´ ìžˆëŠ”ì§€ 찾아보십시오." #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "ì´ ìž¥ì¹˜ê°€ 정확히 무엇ì¸ì§€ 모르겠습니다. ì§€ì› ìž¥ì¹˜ 목ë¡ì—서 ì—´ê±°ëœ ê²ƒì´ ìžˆëŠ”ì§€ 찾아보십시오." #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - 블루투스 장치" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - 수ë™ìœ¼ë¡œ 설정" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "웹사ì´íЏ 시작" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "지금 설정" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "ì´ ì„¤ì •ê°’ë“¤ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "ì‚¬ìš©ìž ì´ë¦„" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "암호" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "현재 êµ¬ì„±ì€ ì—¬ê¸°ì— í‘œì‹œë  ìˆ˜ 있는 것보다 ë” ë³µìž¡í•©ë‹ˆë‹¤. ë™ê¸°í™” 모드 ë˜ëŠ” ë™ê¸°í™”ëœ ë°ì´í„° ìœ í˜•ì„ ë³€ê²½í•˜ë©´ ê·¸ êµ¬ì„±ì„ ë®ì–´ì“°ê²Œ ë©ë‹ˆë‹¤." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "서버 설정값 숨김" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "서버 설정값 표시" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "ë™ê¸°í™” ì‘ìš© 프로그램ì—서 ë™ê¸°í™”" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s ë™ê¸°í™” 중" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "%s ë™ê¸°í™” 서비스로 방금 ê·€í•˜ì˜ ì»´í“¨í„°ë¥¼ ë™ê¸°í™”하기 시작했습니다." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s ë™ê¸°í™” 완료" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "%s ë™ê¸°í™” 서비스로 방금 ê·€í•˜ì˜ ì»´í“¨í„° ë™ê¸°í™”를 마쳤습니다." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "ë™ê¸°í™” 문제" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "죄송합니다. ë™ê¸°í™”ì— ë¬¸ì œê°€ 있으니 주ì˜ë¥¼ 요합니다." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "보기" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "종료" syncevolution-1.5/po/nl.po0000644000373300001540000007345212326412403017115 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Jiri Najman , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 12:22+0000\n" "Last-Translator: GLS_Translator_NLD1 \n" "Language-Team: Dutch (http://www.transifex.net/projects/p/meego/team/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Synchronisatie" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contacten" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Afspraken" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Taken" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Opmerkingen" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Afspraken & Taken" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Synchronisatie wordt gestart" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Wilt u langzaam synchroniseren met %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Ja, voer een synchronisatie uit" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Nee, breek synchronisatie af" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Wil je alle lokale data verwijderen en vervangen met data van %s? Dit is " "niet aan te raden." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Ja, verwijder en vervang" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Nee" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Wil je alle data in %s verwijderen en vervangen met lokale data? Dit is niet" " aan te raden." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Proberen syncrhonisatie af te breken" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Geen service of apparaat geselecteerd" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - just klaar met synchroniseren" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - een minuut geleden gesynchroniseerd" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - %ld minuten geleden gesynchroniseerd" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - een uur geleden gesynchroniseerd" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - %ld uren geleden gesynchroniseerd" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - een dag geleden gesynchroniseerd" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - %ld dagen geleden gesynchroniseerd" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Synchroniseer nu" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Synchronisatie" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Andere opties..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Selecteer synchronisatie service" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Bewerk service instellingen" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Je hebt geen synchronisatie service of apparaat geselecteerd. Synchronisatie" " service laten je synchroniseren tussen je netbook en een web service." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Synchroniseer opnieuw" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Herstellen" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Synchronisatie bezig" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Synchronisatie afbreken" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Terug naar synchronisatie" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Automatische synchronisatie" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Betroffen gegevens: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Betroffen gegevens: geen" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Wilt u de backup terugzetten van % s? Alle wijzigingen die u sindsdien hebt " "gemaakt gaan verloren." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Ja, herstellen" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Gebackupt vóór synchroniseren met %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Herstellen" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Een normale synchronisatie met %s is niet mogelijk op dit moment. U kunt een" " langzame twee-weg synchronisatie uitvoeren of weer starten vanaf het begin." " U kunt ook een back-up terugzetten, maar een langzame twee-weg " "synchronisatie of starten vanaf het begin is nog steeds noodzakelijk voordat" " een normale synchronisatie mogelijk is." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Als iets verschrikkelijk mis is gegaan, kunt u een langzame synchronisatie " "proberen, starten vanaf het begin of herstellen vanaf een backup." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Verwijder al uw lokale\n" "data en vervang het\n" "met data van %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Verwijder alle data op\n" "%s en vervang het\n" "met uw lokale data" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Fout bij het verkrijgen van ondersteunde services uit SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Er was een probleem met de synchronisatie communicatie. Probeer het later " "nog eens." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Herstellen mislukt" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Synchronisatie mislukt" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Herstellen afgerond" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Synchronisatie afgerond" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "'%s' voorbereiden" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "'%s' ontvangen" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "'%s' versturen" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Er waren %ld externe afwijzingen." msgstr[1] "Er waren %ld externe verwerpingen." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Er was een lokale afwijzing." msgstr[1] "Er waren %ld lokale afwijzingen." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Er waren %ld lokale en %ld externe afwijzingen." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Laatste keer: geen veranderingen." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Laatste keer: één verandering verstuurd." msgstr[1] "Laatste keer: %ld veranderingen verstuurd." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Laatste keer: één verandering uitgevoerd." msgstr[1] "Laatste keer: %ld veranderingen uitgevoerd." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Laatste keer: %ld wijzigingen uitgevoerd, %ld verzonden." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Er was een probleem met de laatste synchonisatie:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Je hebt zojuist hersteld van een backup. De veranderingen zijn nog niet met " "%s gesynchroniseerd" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Wachten op het voltooien van de huidige operatie..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "Een normale synchronisatie is niet mogelijk op dit moment." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "De synchronisatie service hing onverwachts op" #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Wachtwoord was niet beantwoord. Je kunt het wachtwoord in de instellingen " "opslaan om dit probleem te voorkomen." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Er is een probleem met de synchronisatie. Opnieuw proberen kan wellicht " "helpen." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Inloggen Mislukt. Is er een probleem met uw gebruikersnaam of wachtwoord?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Verboden" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "De bron kon niet worden gevonden. Is er een probleem met de " "serverinstellingen?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Service database fout" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Er is een probleem met de lokale database. Opnieuw synchroniseren of " "herstarten kan helpen." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Geen schijf ruimte beschikbaar" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Fout bij verwerken van SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Server authorisatie mislukt" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Fout bij verwerken van configuratie bestand" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Fout bij lezen van configuratie bestand" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Geen configuratie gevonden" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Geen configuratie bestand gevonden" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Server verstuurde foute gegevens" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Verbindingscertificaat is verlopen" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Verbindingscertificaat is ongeldig" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "We waren niet in staat om verbinding te maken met de server. Het probleem " "kan tijdelijk zijn of er kan iets mis zijn met de serverinstellingen." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "De server URL is niet geldig" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Server niet gevonden" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Fout %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Een wachtwoord is vereist voor synchronisatie" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Synchroniseer met een wachtwoord" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Voer een wachtwoord in voor synchroniseren met %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Acties" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "of" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Direct synchroniseren" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Netwerk synchronisatie" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Herstel vanaf backup" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Langzame synchronisatie" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Starten vanaf het begin" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Een langzame synchronisatie vergelijkt items van beide kanten en\n" "probeert ze samen te voegen. Soms mislukt dit, en dit kan leiden tot\n" "duplicaten of verloren gegevens." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Nieuw apparaat" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Nieuwe service " #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Backups worden gemaakt vóór elke synchronisatie. Kies een backup om te " "herstellen. Eventuele wijzigingen die u hebt gemaakt sindsdien zullen " "verloren gaan." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Kalender" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Wijzig of bewerk\n" "synchronisatie\n" "service" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Sluiten" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Verwijder alle data op\n" "Zyb en vervang het\n" "met lokale data" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Verwijder alle lokale\n" "data en vervang het\n" "met data van Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Los een synchroni-\n" "satie noodgeval op" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Als je niet hierboven je service ziet maar je weet dat je service provider SyncML gebruikt,\n" "kun je handmatig een service opzetten." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Instellingen" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Synchronisatie noodgeval" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Om te synchroniseren moet je een netwerkverbinding hebben en een account met een\n" "synchronisatie service. De volgende services zijn ondersteund:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Gebruik Bluetooth voor het synchroniseren van gegevens van het ene apparaat " "naar het andere." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "U moet Bluetooth-apparaten toevoegen voordat ze kunnen worden " "gesynchroniseerd." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Niet veroudert" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "PIM-data synchroniseren" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld kan je contacten, gebeurtenissen, taken en notities " "synchroniseren." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync kan je adresboek en Gmail contacten synchroniseren en er backups" " van maken." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Backup je adresboek en kalender. Synchroniseer met een muisklik, elk moment," " overal (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Met Mobical Backup and Herstel service kunt u uw persoonlijke mobiele data " "veilig en gratis backuppen." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "Met ZYB kan men eenvoudige mobiele informatie online opslaan en delen." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Met Memotoo kunt u toegang krijgen tot uw persoonlijke gegevens vanaf elke " "computer die aangesloten is op het internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Fout bij het opslaan van het configuratie bestand" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Service moet een naam en server URL hebben" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Voor deze service is een gebruikersnaam vereist" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Wilt u de instellingen voor %s resetten? Data dat al gesynchroniseerde is " "zal niet worden verwijderd." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Ja, reset" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Nee, behoud de instellingen" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Wilt u de instellingen voor %s verwijderen? Data dat al gesynchroniseerde is" " zal niet worden verwijderd, alleen deze service configuratie zal worden " "verwijdert." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Ja, verwijderen" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Instellingen wissen" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Verwijder instellingen" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Opslaan en gebruik" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Opslaan en vervang\n" "de huidige service" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Stop apparaat gebruik" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Stop service gebruik" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Stuur wijzigingen naar '%s'" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Ontvang veranderingen van %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Synchronisatie" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Server adres" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Dit apparaat ziet eruit als een '%s'. Als dit niet correct is, kijk dan in " "de lijst met ondersteunde apparaten en kies de juiste." #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "We kunnen niet zien wat voor apparaat dit is. Kijk naar de lijst van " "ondersteunde apparaten en kies de juiste." #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth-apparaat" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - handmatig instellen" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Start website" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Nu instellen" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Deze instellingen gebruiken" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "gebruikersnaam" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Wachtwoord" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "De huidige configuratie is complexer dan wat hier kan worden weergegeven. " "Wijzigingen aan de synchronisatie modus of aan de gesynchroniseerd data " "types overschrijft de configuratie." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Server instellingen verbergen" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Server instellingen weergeven" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Synchroniseer in de synchronisatie toepassing" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s synchronisatie bezig" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "We hebben de synchronisatie met service %s en je computer gestart." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s synchronisatie afgerond" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "Synchronisatie met service %s en je computer is voltooid." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Synchronisatie probleem." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" "Sorry, er is een probleem met de synchronisatie dat naar ingekeken moet " "worden." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Bekijk" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Gezien" syncevolution-1.5/po/pl.po0000644000373300001540000007535512326412403017123 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Andrzej Zaborowski , 2009. # Romuald Pawlikowski , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 18:11+0000\n" "Last-Translator: GLS_Translator_PLK2 \n" "Language-Team: Polish (http://www.transifex.net/projects/p/meego/team/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Synchronizuj" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Kontakty" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Spotkania" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Zadania" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notatki" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Spotkania i zadania" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Rozpoczynanie synchronizacji" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Czy chcesz dokonać wolnej synchronizacji z %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Tak, wykonaj wolnÄ… synchronizacjÄ™" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Nie, anuluj synchronizacjÄ™" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Czy chcesz usunąć wszystkie lokalne dane i zastÄ…pić je danymi z %s? Nie jest" " to zwykle zalecane." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Tak, usuÅ„ i zastÄ…p" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Nie" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Czy chcesz usunąć wszystkie dane w %s i zastÄ…pić je danymi lokalnymi? Nie " "jest to zwykle zalecane." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Trwa próba anulowania synchronizacji" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Nie wybrano usÅ‚ugi lub urzÄ…dzenia" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - wÅ‚aÅ›nie zsynchronizowano" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - zsynchronizowano minutÄ™ temu" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - zsynchronizowano %ld minut temu" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - zsynchronizowano godzinÄ™ temu" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - zsynchronizowano %ld godzin temu" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - zsynchronizowano wczoraj" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - zsynchronizowano %ld dni temu" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Synchronizuj teraz" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Wolna synchronizacja" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Inne opcje..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Wybierz usÅ‚ugÄ™ synchronizacji" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Edycja ustawieÅ„ usÅ‚ugi" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Nie wybraÅ‚eÅ› jeszcze usÅ‚ugi synchronizacji lub urzÄ…dzenia. UsÅ‚ugi " "synchronizacji pozwalajÄ… na synchronizowanie danych pomiÄ™dzy netbookiem a " "usÅ‚ugÄ… internetowÄ…. Można również synchronizować bezpoÅ›rednio z niektórymi " "urzÄ…dzeniami." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Synchronizuj jeszcze raz" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Przywracanie" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Synchronizowanie" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Anuluj synchronizacjÄ™" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Powrót do synchronizacji" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "" "Automatyczna\n" "synchronizacja" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Dane, na które ma to wpÅ‚yw: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Dane, na które ma to wpÅ‚yw: brak" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Czy chcesz przywrócić kopiÄ™ zapasowÄ… z %s? Wszystkie wprowadzone od tamtego " "czasu zmiany zostanÄ… utracone." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Tak, przywróć" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Wykonano kopie zapasowÄ… przed synchronizacjÄ… z %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Przywróć" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Normalna synchronizacja z %s nie jest teraz możliwa. Można wykonać wolnÄ…, " "dwukierunkowÄ… synchronizacjÄ™, lub zacząć od poczÄ…tku. Można również " "przywrócić kopiÄ™ zapasowÄ…, ale wykonanie wolnej synchronizacji lub " "rozpoczÄ™cie od poczÄ…tku wciąż bÄ™dzie wymagane, zanim normalna synchronizacja" " bÄ™dzie możliwa." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "W przypadku poważnych problemów można spróbować wykonać wolnÄ… " "synchronizacjÄ™, zacząć od poczÄ…tku lub przywrócić z kopii zapasowej." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Skasuj wszystkie lokalne\n" "dane i zastÄ…p je\n" "zdalnymi z %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Skasuj wszystkie dane\n" "na %s i zastÄ…p je\n" "lokalnymi" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Błąd przy pobieraniu listy kompatybilnych usÅ‚ug z SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "WystÄ…piÅ‚ problem podczas komunikacji z procesem synchronizacji. Spróbuj " "ponownie później." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Przywracanie nie powiodÅ‚o siÄ™" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Synchronizacja nie powiodÅ‚a siÄ™" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Przywracanie zakoÅ„czone" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Synchronizacja zakoÅ„czona" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Przygotowywanie '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Odbieranie '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "WysyÅ‚anie '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Druga strona odrzuciÅ‚a jeden z elementów." msgstr[1] "Druga strona odrzuciÅ‚a %ld elementy." msgstr[2] "Druga strona odrzuciÅ‚a %ld elementów." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Odrzucono lokalnie jeden element." msgstr[1] "Odrzucono lokalnie %ld elementy." msgstr[2] "Odrzucono lokalnie %ld elementów." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "" "Odrzucono lokalnie %ld elementów podczas gdy druga strona odrzuciÅ‚a %ld " "elementów." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Ostatnio: brak zmian." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Ostatnio: wysÅ‚ano jednÄ… zmianÄ™." msgstr[1] "Ostatnio: wysÅ‚ano %ld zmiany." msgstr[2] "Ostatnio: wysÅ‚ano %ld zmian." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Ostatnio: zastosowano jednÄ… zmianÄ™." msgstr[1] "Ostatnio: zastosowano %ld zmiany." msgstr[2] "Ostatnio: zastosowano %ld zmian." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Ostatnio: zastosowano %ld zmian i wysÅ‚ano %ld zmian." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "WystÄ…piÅ‚ problem z ostatniÄ… synchronizacjÄ…:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "WÅ‚aÅ›nie przywrócono kopiÄ™ zapasowÄ…. Zmiany nie zostaÅ‚y jeszcze " "zsynchronizowane z %s" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Oczekiwanie na zakoÅ„czenie bieżącej operacji..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Wykonanie normalnej synchronizacji nie jest teraz możliwe. Serwer sugeruje " "wykonanie wolnej synchronizacji, ale może to nie być pożądana czynność w " "przypadku, gdy po obu stronach znajdujÄ… siÄ™ już dane." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Proces synchronizacji zostaÅ‚ nieoczekiwanie zakoÅ„czony." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Nie uzyskano odpowiedzi na żądanie o hasÅ‚o. HasÅ‚o można zapisać w " "ustawieniach, aby uniknąć wysyÅ‚ania żądania." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "WystÄ…piÅ‚ problem z przetwarzaniem żądania synchronizacji. Ponowna próba może" " pomóc." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Logowanie nie powiodÅ‚o siÄ™. Czy może to być problem z nazwÄ… użytkownika lub " "hasÅ‚em?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Nie dozwolone" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "Nie można odnaleźć źródÅ‚a danych. Czy może być to problem z ustawieniami?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Błąd zdalnej bazy danych" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "WystÄ…piÅ‚ problem z lokalnÄ… bazÄ… danych. Ponowna synchronizacja lub " "uruchomienie komputera mogÄ… pomóc." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Brak miejsca na dysku" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Błąd przetwarzania SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Serwer nie zaakceptowaÅ‚ autoryzacji" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Błąd skÅ‚adniowy w pliku konfiguracyjnym" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Błąd odczytu pliku konfiguracyjnego" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Nie znaleziono konfiguracji" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Nie znaleziono pliku konfiguracyjnego" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Serwer przysÅ‚aÅ‚ nie prawidÅ‚owe dane" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "WygasÅ‚ certyfikat połączenia" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "NiewÅ‚aÅ›ciwy certyfikat połączenia" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Nie można połączyć siÄ™ z serwerem. Problem może być tymczasowy, lub " "ustawienia mogÄ… być błędne." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "NieprawidÅ‚owy adres URL serwera" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Nie znaleziono serwera" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Błąd %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Synchronizacja wymaga hasÅ‚a" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Synchronizacja z hasÅ‚em" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Podaj hasÅ‚o do synchronizacji z %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "CzynnoÅ›ci" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "lub" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Synchronizacja bezpoÅ›rednia" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Synchronizacja sieciowa" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Przywracanie z kopii zapasowej" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Wolna synchronizacja" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Zacznij od poczÄ…tku" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Powolna synchronizacja porównuje elementu po obu stronach i próbuje je połączyć. \n" "W niektórych przypadkach może siÄ™ to nie powieść, prowadzÄ…c do zduplikowania lub utraty informacji." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Dodaj nowe urzÄ…dzenie" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Dodaj nowÄ… usÅ‚ugÄ™" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Kopie zapasowe sÄ… wykonywane przy każdej synchronizacji. Wybierz kopiÄ™ " "zapasowÄ…, z której przywrócić. Wszelkie zmiany wprowadzone od tamtego czasu " "zostanÄ… utracone." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Kalendarz" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "ZmieÅ„ lub edytuj\n" "usÅ‚ugÄ™ synchronizacji" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Zamknij" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Skasuj wszystkie dane\n" "z usÅ‚ugi Zyb i zastÄ…p\n" "je lokalnymi" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Skasuj wszystkie lokalne\n" "dane i zastÄ…p je zdalnymi\n" "z usÅ‚ugi Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Napraw awariÄ™\n" "synchronizacji" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "JeÅ›li Twoja usÅ‚uga nie jest widoczna powyżej a wiesz że dostawca używa SyncML\n" "możesz ustawić usÅ‚ugÄ™ rÄ™cznie." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Ustawienia" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Awaria synchronizacji" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Aby móc synchronizować potrzebne sÄ… połączenie z sieciÄ… oraz konto dla usÅ‚ugi\n" "synchronizacji. NastÄ™pujÄ…ce usÅ‚ugi sÄ… kompatybilne:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Użyj interfejsu Bluetooth lub zsynchronizuj dane z jednego urzÄ…dzenia z " "innym." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Konieczne bÄ™dzie dodanie urzÄ…dzeÅ„ Bluetooth, zanim bÄ™dÄ… one synchronizowane." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Aktualny" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synchronizuj dane PIM" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld pozwala na synchronizowanie kontaktów, spotkaÅ„, zadaÅ„ i " "notatek." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync może zapisywać i synchronizować kopiÄ™ twojej książki adresowej z" " kontaktami Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Zrób kopiÄ™ zapasowÄ… swoich kontaktów i kalendarza. Synchronizuj jednym " "klikniÄ™ciem, kiedykolwiek i gdziekolwiek (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "UsÅ‚uga kopii zapasowej i przywracania Mobical umożliwia za darmo wykonanie " "bezpiecznej kopii zapasowej osobistych danych mobilnych." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB to prosty sposób na przechowywanie i udostÄ™pnianie informacji mobilnych " "w trybie online." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo umożliwia dostÄ™p do informacji osobistych z dowolnego komputera " "podłączonego do sieci Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Przepraszamy, zapis pliku konfiguracyjnego nie powiódÅ‚ siÄ™" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "UsÅ‚uga musi mieć nazwÄ™ i URL serwera" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Ta usÅ‚uga wymaga podania nazwy użytkownika" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Czy chcesz zresetować ustawienia dla %s? Nie spowoduje to usuniÄ™cia " "jakichkolwiek informacji zsynchronizowanych na żadnym z urzÄ…dzeÅ„." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Tak, zresetuj" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Nie, zachowaj ustawienia" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Czy chcesz usunąć ustawienia dla %s? Nie spowoduje to usuniÄ™cia " "jakichkolwiek informacji zsynchronizowanych na żadnym z urzÄ…dzeÅ„, ale " "spowoduje usuniÄ™cie ustawieÅ„." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Tak, usuÅ„" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Resetuj ustawienia" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "UsuÅ„ ustawienia" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Zapisz i użyj" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Zapisz i zastÄ…p\n" "bieżącÄ… usÅ‚ugÄ™" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "ZaprzestaÅ„ używania urzÄ…dzenia" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "ZaprzestaÅ„ używania usÅ‚ugi" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "URI %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "WyÅ›lij zmiany do %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Odbierz zmiany od %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Synchronizacja" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Adres serwera" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Najprawdopodobniej do urzÄ…dzenie to „%sâ€. JeÅ›li tak nie jest, przejrzyj " "listÄ™ obsÅ‚ugiwanych urzÄ…dzeÅ„ i wybierz posiadane, jeÅ›li siÄ™ na niej " "znajduje." #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Nie można dokÅ‚adnie zidentyfikować urzÄ…dzenia. Przejrzyj listÄ™ obsÅ‚ugiwanych" " urzÄ…dzeÅ„ i wybierz posiadane, jeÅ›li siÄ™ na niej znajduje." #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - UrzÄ…dzenie Bluetooth" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - konfiguracja rÄ™czna" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Otworzyć stronÄ™ www" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Skonfiguruj teraz" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Użyj tych ustawieÅ„" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Nazwa użytkownika" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "HasÅ‚o" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Bieżąca konfiguracja usÅ‚ugi jest bardziej skomplikowana niż to, co można tu " "pokazać. Zmiany trybu synchronizacji lub synchronizowanych typów danych " "nadpiszÄ… tÄ™ konfiguracjÄ™." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Ukryj ustawienia serwera" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Pokaż ustawienia serwera" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Synchronizuj w aplikacji do synchronizacji" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "Synchronizowanie %s" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "WÅ‚aÅ›nie rozpoczÄ™to synchronizacjÄ™ komputera z usÅ‚ugÄ… synchronizacji %s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "Synchronizacja %s zakoÅ„czona" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" "WÅ‚aÅ›nie zakoÅ„czono synchronizacjÄ™ komputera z usÅ‚ugÄ… synchronizacji %s." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Problem z synchronizacjÄ…." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" "Przepraszamy, wystÄ…piÅ‚ problem z synchronizacjÄ… wymagajÄ…cy interwencji " "użytkownika." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Pokaż" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Odrzuć" syncevolution-1.5/po/pt_BR.po0000644000373300001540000007445312326412403017514 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-10 00:43+0000\n" "Last-Translator: GLS_PTB \n" "Language-Team: Portuguese (Brazilian) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Sincronização" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Contatos" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Compromissos" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Tarefas" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Notas" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Compromissos e tarefas" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Iniciando sincronização" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Você quer fazer sincronização lenta com %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Sim, faça sincronização lenta" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Não, cancele a sincronização" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Você quer excluir todos os dados locais e substituir por dados de: %s? Isso " "não é aconselhável." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Sim, excluir e substituir" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Não" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Você quer excluir todos os dados em: %s e substituir por seus dados locais? " "Isso não é aconselhável." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Tentando cancelar sincronização" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Nenhum serviço ou dispositivo selecionado" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - fez sincronização agora mesmo" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - fez sincronização há um minuto atrás" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - fez sincronização há: %ld minutos atrás" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - fez sincronização há uma hora atrás" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - fez sincronização há: %ld horas atrás" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - sincronização há um dia atrás" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - sincronização há %ld dias atrás" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Sincron. agora" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Sincronização lenta" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Outras opções" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Selecione serviço de sincronização" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Editar configurações de serviço" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Você ainda não selecionou um serviço de sincronização ou dispositivo. " "Serviços de sincronização permitem a sincronização de dados entre seu " "netbook e um serviço na web. Você também pode sincronizar diretamente com " "alguns dispositivos." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Sincronize de novo" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Restaurando" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Sincronizando" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Cancelar sincronização" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Voltar à sincronização" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Sincronização automática" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Dados afetados: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Dados afetados: nenhum" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Você quer restaurar o backup do %s? Todas as modificações que você fez " "depois serão perdidas." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Sim, restaurar" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Fez backup antes de sincronização com %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Restaurar" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Uma sincronização normal com %s não é possível agora. Você poderá fazer uma " "sincronização lenta bidirecional ou iniciar do começo. Você também poderá " "restaurar um backup, mas uma sincronização lenta ou começando do início " "ainda será necessária antes de uma sincronização normal." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Se algo está terrivelmente errado, você ainda pode tentar uma sincronização " "lenta, começar tudo de novo ou restaurar do backup." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Excluir todos os dados\n" "locais e substitua com\n" "dados de %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Excluir todos os dados no\n" "%s e substituir\n" "com seus dados locais" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Não conseguiu a lista de serviços suportados do SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Houve um problema comunicando com o processo de sincronização. Favor tente " "de novo mais tarde." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Restauração falhou" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Sincronização falhou" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Restauração completada" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Sincronização completada" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Preparando: '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Recebendo: '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Enviando: '%s" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Houve uma rejeição remota." msgstr[1] "Houve %ld rejeições remotas." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Houve uma rejeição local." msgstr[1] "Houve %ld rejeições locais." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Houve %ld rejeições locais e %ld rejeições remotas." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Ultima vez: sem mudanças." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Ultima vez: Enviou uma mudança." msgstr[1] "Ultima vez: Enviou %ld mudanças." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Ultima vez: Efetuou uma mudança." msgstr[1] "Ultima vez: Efetuou %ld mudanças." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Ultima vez: Efetuou %ld mudanças e enviou %ld mudanças." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Houve um problema com a ultima sincronização:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Você acabou de restaurar um backup. As modificações não foram sincronizadas " "com %s ainda" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Aguardando a conclusão da atual operação..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Uma sincronização normal não é possível agora. O servidor sugere uma " "sincronização normal, mas isto não é sempre aquilo que você deseja se ambos " "os lados têm dados." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Saída inesperada do serviço de sincronização." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "O pedido de senha não teve resposta. Você pode salvar a senha nas " "configurações para prevenir o pedido." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Houve um problema com o processamento do pedido de sincronização. Tentar de " "novo poderá ajudar. " #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "Falha do login. Existe um problema com seu nome de usuário ou senha?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Proibido" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "" "Uma fonte de dados não pôde ser encontrada. Existe um problema com as " "configurações?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Erro no banco de dados remoto" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Existe um problema com o banco de dados local. Nova sincronização ou " "reinicialização poderá ajudar. " #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Não há espaço no disco" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Falhou o processo de SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Autorização do servidor falhou" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Falha na triagem do arquivo de configuração" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Falha na leitura do arquivo de configuração" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Nenhuma configuração encontrada" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Nenhum arquivo de configuração encontrado" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Servidor enviou conteúdo ruim" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Certificado de conexão vencido" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Certificado de conexão inválido" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Não foi possível conectar com o servidor. O problema pode ser temporário ou " "talvez exista um problema com as configurações." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "O URL do servidor está ruim" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Servidor não localizado" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Erro: %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Senha é necessária para sincronização " #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Sincronização com senha" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Favor introduzir a senha para sincronização com %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Ações" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "ou" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Sincronização direta" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Sincronização de rede" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Restaurar do backup" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "Sincronização lenta" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Começar do início" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "Uma sincronização lenta compara itens dos dois lados e tenta intercalá-los.\n" "Isto poderá falhar em alguns casos, resultando em duplicatas ou informações perdidas." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Adicionar novo dispositivo" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Adicionar novo serviço" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Backups são feitos antes de cada sincronização . Selecione um backup para " "restaurar. Quaisquer modificações que você fez depois serão perdidas." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Calendário" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Modificar ou editar\n" "serviço de sincron." #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Fechar" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Excluir todos os dados no Zyb \n" "e substituir por suas\n" "informações locais" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Excluir todos as\n" "informações locais e\n" "substituir por dados de Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Conserta uma\n" "sincr. emergência" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Se não ver seu serviço acima, porém sabe que seu provedor de sinc. usa SyncML\n" "você poderá configurá-la manualmente." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Configurações " #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Emergência sincronização " #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Para sincronizar você precisa de conexão de rede e uma conta com serviço\n" "de sincronização. Nós suportamos os seguintes serviços:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Use Bluetooth para sincronização de dados de um dispositivo para outro." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Você precisará adicionar dispositivos Bluetooth antes que eles possam fazer " "sincronização." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Atualizado" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Sincronizar dados PIM" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld possibilita manter sincronizados seus contatos, eventos, " "tarefas e anotações." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync pode fazer backup e sincronizar seus contatos com seus contatos " "Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Faça backup de seus contatos e calendário. Sincronize com um só clique, a " "qualquer hora em qualquer lugar (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "O serviço Backup e Restauração Mobical permite o backup seguro de seus dados" " móveis pessoais de graça." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB é uma maneira simples para as pessoas armazenarem e compartilharem " "informações móveis online." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo permite a você acessar seus dados pessoais de qualquer computador " "conectado a Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Sinto muito, falha ao salvar a configuração" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Serviço tem que ter um nome e um URL de servidor" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "É preciso fornecer um nome de usuário para este serviço" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Você quer restaurar as configurações para %s? Isto não removerá qualquer " "informação sincronizada em cada lado." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Sim, redefinir" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Não, manter configurações " #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Você quer excluir as configurações para %s? Isto não removerá qualquer " "informação sincronizada de cada lado, mas removerá essas configurações." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Sim, excluir " #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Redefinir configurações " #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Excluir configurações" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Salvar e usar" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Salvar e substituir\n" "serviço atual" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Pare de usar o dispositivo" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Pare de usar o serviço" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "URI: %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Enviar mudanças para %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Receber modificações de %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sincronização" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Endereço de servidor" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Este dispositivo parece ser um '%s'. Se isto não for o caso, favor verificar" " a lista de dispositivos suportados e selecione o seu se constar da lista" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Não sabemos que dispositivo isto é exatamente. Favor verificar a lista de " "dispositivos suportados e selecione o seu se constar da lista" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - dispositivo Bluetooth " #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - configurar manualmente" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Iniciar o site na web" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Configure agora" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Usar essas configurações" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Nome do usuário" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Senha" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Atual configuração é complexa demais para ser mostrada aqui. As modificações" " ao modo sincronização ou tipos de dados sincronizados substituirão aquela " "configuração," #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Ocultar configurações de servidor" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Mostrar configurações de servidor" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Sincronização no aplicativo Sync" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s está sincronizando" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "Começamos a sincronização de seu computador com o serviço de sincronização " "%s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s Sincronização completada" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" "Completamos a sincronização de seu computador com o serviço de sincronização" " %s." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Problema com sincronização. " #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" "Sinto muito, existe um problema com sua sincronização e necessita a sua " "atenção." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Visualizar" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Ignorar" syncevolution-1.5/po/ro.po0000644000373300001540000004144612326412403017122 0ustar00nightlynightly00000000000000# Romanian translations for syncevolution package. # Copyright (C) 2009 The syncevolution copyright holder # This file is distributed under the same license as the syncevolution package. # Cosmin Bordeianu , 2009. # #: ../src/gtk-ui/sync-ui.c:764 msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-10-01 19:27+0000\n" "PO-Revision-Date: 2009-10-03 20:23+0200\n" "Last-Translator: Cosmin Bordeianu \n" "Language-Team: Moblin Romania \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Romanian\n" "X-Poedit-Country: ROMANIA\n" "X-Poedit-SourceCharset: utf-8\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 ../src/gtk-ui/ui.glade.h:28 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "Sincronizare" #: ../src/gtk-ui/sync-ui.c:259 msgid "Addressbook" msgstr "Jurnal" #: ../src/gtk-ui/sync-ui.c:261 msgid "Calendar" msgstr "Calendar" #: ../src/gtk-ui/sync-ui.c:263 msgid "Todo" msgstr "De făcut" #: ../src/gtk-ui/sync-ui.c:265 msgid "Memo" msgstr "Momento" #: ../src/gtk-ui/sync-ui.c:320 msgid "Failed to save current service in GConf configuration system" msgstr "" "Nu s-a putut salva serviciul de configurare al sistemului actual în GConf" #: ../src/gtk-ui/sync-ui.c:331 msgid "Failed to save service configuration to SyncEvolution" msgstr "Nu s-a putut salva configuraÈ›ia serviciului pentru SyncEvolution" #: ../src/gtk-ui/sync-ui.c:416 msgid "Failed to get service configuration from SyncEvolution" msgstr "Nu s-a putut obÈ›ine configuraÈ›ia serviciului pentru SyncEvolution" #: ../src/gtk-ui/sync-ui.c:479 msgid "Failed to remove service configuration from SyncEvolution" msgstr "Nu s-a putut È™terge configuraÈ›ia serviciului pentru SyncEvolution" #: ../src/gtk-ui/sync-ui.c:599 msgid "Service must have a name and server URL" msgstr "Serviciul trebuie sa conÈ›ină un nume È™i o adresă de internet" #. sync is no longer in progress for some reason #: ../src/gtk-ui/sync-ui.c:675 msgid "Failed to cancel: sync was no longer in progress" msgstr "Nu s-a putut anula: Sincronizarea nu era în curs de desfășurare" #: ../src/gtk-ui/sync-ui.c:679 msgid "Failed to cancel sync" msgstr "Nu s-a putut anula sincronizarea" #: ../src/gtk-ui/sync-ui.c:683 msgid "Canceling sync" msgstr "Anulează sincronizarea" #: ../src/gtk-ui/sync-ui.c:697 msgid "Trying to cancel sync" msgstr "ÃŽncerc să anulez sincronizarea" #: ../src/gtk-ui/sync-ui.c:704 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "DoriÈ›i să È™tergeÈ›i toate datele locale È™i să le înlocuiÈ›i cu date din %s? " "Acest lucru nu este, de obicei, recomand." #: ../src/gtk-ui/sync-ui.c:709 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "DoriÈ›i să È™tergeÈ›i toate datele din %s È™i să le înlocuiÈ›i cu datele locale? " "Acest lucru nu este, de obicei, recomand." #: ../src/gtk-ui/sync-ui.c:726 msgid "No, cancel sync" msgstr "Nu, anulează sincronizarea" #: ../src/gtk-ui/sync-ui.c:727 msgid "Yes, delete and replace" msgstr "Da, È™terge È™i înlocuieÈ™te" #: ../src/gtk-ui/sync-ui.c:749 msgid "No sources are enabled, not syncing" msgstr "Nu există o sursă activată, nu se sincronizează" #: ../src/gtk-ui/sync-ui.c:766 msgid "A sync is already in progress" msgstr "O sincronizare este deja în curs de desfășurare" #: ../src/gtk-ui/sync-ui.c:768 msgid "Failed to start sync" msgstr "Nu s-a putut porni sincronizarea" #: ../src/gtk-ui/sync-ui.c:773 msgid "Starting sync" msgstr "PorneÈ™te sincronizarea" #: ../src/gtk-ui/sync-ui.c:798 msgid "Last synced just seconds ago" msgstr "Ultima sincronizare a fost făcută acum câteva secunde" #: ../src/gtk-ui/sync-ui.c:801 msgid "Last synced a minute ago" msgstr "Ultima sincronizare a fost făcută acum un minut" #: ../src/gtk-ui/sync-ui.c:804 #, c-format msgid "Last synced %ld minutes ago" msgstr "Ultima sincronizare a fost făcută acum %ld minute" #: ../src/gtk-ui/sync-ui.c:807 msgid "Last synced an hour ago" msgstr "Ultima sincronizare a fost făcută acum o oră" #: ../src/gtk-ui/sync-ui.c:810 #, c-format msgid "Last synced %ld hours ago" msgstr "Ultima sincronizare a fost făcută acum %ld ore" #: ../src/gtk-ui/sync-ui.c:813 msgid "Last synced a day ago" msgstr "Ultima sincronizare a fost făcută acum o zi" #: ../src/gtk-ui/sync-ui.c:816 #, c-format msgid "Last synced %ld days ago" msgstr "Ultima sincronizare a fost făcută acum %ld zile" #: ../src/gtk-ui/sync-ui.c:901 msgid "Sync again" msgstr "Sincronizează din nou" #: ../src/gtk-ui/sync-ui.c:903 ../src/gtk-ui/ui.glade.h:29 msgid "Sync now" msgstr "Sincronizează acum" #: ../src/gtk-ui/sync-ui.c:912 msgid "Syncing" msgstr "Se sincronizează" #: ../src/gtk-ui/sync-ui.c:918 msgid "Cancel sync" msgstr "Anulează sincronizarea" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:1265 #, c-format msgid "%s (not supported by this service)" msgstr "%s (serviciul nu suportă)" #: ../src/gtk-ui/sync-ui.c:1298 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "A existat o respingere de la distanţă." msgstr[1] "Au existat %d respingeri de la distanţă." #: ../src/gtk-ui/sync-ui.c:1303 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "A existat o respingere locală." msgstr[1] "Au existat %d respingeri locale." #: ../src/gtk-ui/sync-ui.c:1308 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "Au existat %d respingeri locale È™i %d respingeri de la distanță." #: ../src/gtk-ui/sync-ui.c:1313 #, c-format msgid "Last time: No changes." msgstr "Ultima dată: Nici o schimbare" #: ../src/gtk-ui/sync-ui.c:1315 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "Ultima dată: A fost trimisă o modificare" msgstr[1] "Ultima dată: Au fost trimise %d modificări." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:1323 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "Ultima dată: A fost aplicată o modificare." msgstr[1] "Ultima dată: Au fost aplicate %d modificări." #: ../src/gtk-ui/sync-ui.c:1328 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "Ultima dată: Au fost aplicate %d modificări È™i %d au fost trimise." #: ../src/gtk-ui/sync-ui.c:1420 msgid "Failed to get server configuration from SyncEvolution" msgstr "Nu am putut să retrag configuraÈ›ia serverului de la SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1472 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in " "sync." msgstr "" "ScheduleWorld permite păstrarea contactelor, a evenimentelor, sarcinilor È™i " "a notiÈ›elor sincronizate." #: ../src/gtk-ui/sync-ui.c:1475 msgid "" "Google Sync can back up and synchronize your Address Book with your Gmail " "contacts." msgstr "" "Google Sync poate face o copie de rezervă È™i sincroniza Jurnalul cu " "contactele dvs. Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-ui.c:1481 msgid "" "Back up your contacts and calendar. Sync with a singleclick, anytime, " "anywhere (DEMO)." msgstr "" "Copiază contactele È™i calendarul. Sincronizează cu un singur clic, oricând, " "oriunde (DEMO)." #: ../src/gtk-ui/sync-ui.c:1509 msgid "New service" msgstr "Serviciu nou" #: ../src/gtk-ui/sync-ui.c:1556 msgid "Server URL" msgstr "Adresa Serverului" #. TRANSLATORS: placeholder is a source name in settings window #: ../src/gtk-ui/sync-ui.c:1578 #, c-format msgid "%s URI" msgstr "%s adrese" #: ../src/gtk-ui/sync-ui.c:1715 ../src/gtk-ui/ui.glade.h:17 msgid "Launch website" msgstr "Lansează site-ul" #: ../src/gtk-ui/sync-ui.c:1719 msgid "Setup and use" msgstr "Configurează È™i foloseÈ™te" #: ../src/gtk-ui/sync-ui.c:1765 msgid "Failed to get list of manually setup services from SyncEvolution" msgstr "" "Nu am putut retrage lista de configurări manuale ale serviciilor de la " "SyncEvolution" #: ../src/gtk-ui/sync-ui.c:1806 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Nu am putut retrage lista cu servicii suportate de la SyncEvolution" #. TODO: this is a hack... SyncEnd should be a signal of it's own, #. not just hacked on top of the syncevolution error codes #: ../src/gtk-ui/sync-ui.c:1967 msgid "Service configuration not found" msgstr "Nu a fost găsită configuraÈ›ia serviciului" #: ../src/gtk-ui/sync-ui.c:1973 msgid "Not authorized" msgstr "Nu aveÈ›i autorizaÈ›ie" #: ../src/gtk-ui/sync-ui.c:1975 msgid "Forbidden" msgstr "Interzis" #: ../src/gtk-ui/sync-ui.c:1977 msgid "Not found" msgstr "Nu a fost găsit(ă)" #: ../src/gtk-ui/sync-ui.c:1979 msgid "Fatal database error" msgstr "Eroare fatală la baza de date" #: ../src/gtk-ui/sync-ui.c:1981 msgid "Database error" msgstr "Eroare la baza de date" #: ../src/gtk-ui/sync-ui.c:1983 msgid "No space left" msgstr "Nu mai există spaÈ›iu" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1986 msgid "Failed to process SyncML" msgstr "Nu s-a putut procesa SyncML" #: ../src/gtk-ui/sync-ui.c:1988 msgid "Server authorization failed" msgstr "AutorizaÅ£ia serverului nu a reuÅŸit" #: ../src/gtk-ui/sync-ui.c:1990 msgid "Failed to parse configuration file" msgstr "Nu s-a putut interpreta fiÈ™ierul de configurare" #: ../src/gtk-ui/sync-ui.c:1992 msgid "Failed to read configuration file" msgstr "Nu s-a putut citi fiÈ™ierul de configurare" #: ../src/gtk-ui/sync-ui.c:1994 msgid "No configuration found" msgstr "Nu s-a găsit nici o configuraÈ›ie" #: ../src/gtk-ui/sync-ui.c:1996 msgid "No configuration file found" msgstr "Nu s-a găsit nici un fiÈ™ier de configurare" #: ../src/gtk-ui/sync-ui.c:1998 msgid "Server sent bad content" msgstr "Serverul a trimis conÈ›inut eronat" #: ../src/gtk-ui/sync-ui.c:2000 msgid "Transport failure (no connection?)" msgstr "Transport eÈ™uat (nici o conexiune?)" #: ../src/gtk-ui/sync-ui.c:2002 msgid "Connection timed out" msgstr "Timpul acordat conectării a expirat" #: ../src/gtk-ui/sync-ui.c:2004 msgid "Connection certificate has expired" msgstr "Certificatul conexiunii a expirat" #: ../src/gtk-ui/sync-ui.c:2006 msgid "Connection certificate is invalid" msgstr "Certificatul conexiunii este invalid" #: ../src/gtk-ui/sync-ui.c:2009 msgid "Connection failed" msgstr "Conexiunea a eÈ™uat" #: ../src/gtk-ui/sync-ui.c:2011 msgid "URL is bad" msgstr "Adresa este greÈ™ită" #: ../src/gtk-ui/sync-ui.c:2013 msgid "Server not found" msgstr "Serverul nu a fost găsit" #: ../src/gtk-ui/sync-ui.c:2015 #, c-format msgid "Error %d" msgstr "Eroare %d" #: ../src/gtk-ui/sync-ui.c:2025 msgid "Sync D-Bus service exited unexpectedly" msgstr "" "Procesul de sincronizare a serviciului D-Bus s-a întrerupt pe neaÈ™teptate" #: ../src/gtk-ui/sync-ui.c:2028 ../src/gtk-ui/sync-ui.c:2079 msgid "Sync Failed" msgstr "Sincronizarea a eÈ™uat" #: ../src/gtk-ui/sync-ui.c:2071 msgid "Sync complete" msgstr "Sincronizarea este completă" #: ../src/gtk-ui/sync-ui.c:2076 msgid "Sync canceled" msgstr "Sincronizarea a fost amânată" #. NOTE extra1 can be error here #: ../src/gtk-ui/sync-ui.c:2094 msgid "Ending sync" msgstr "Terminare sincronizare" #. TRANSLATORS: placeholder is a source name (e.g. 'Calendar') in a progress text #: ../src/gtk-ui/sync-ui.c:2118 #, c-format msgid "Preparing '%s'" msgstr "Prepară '%s'" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2130 #, c-format msgid "Sending '%s'" msgstr "Se trimite '%s'" #. TRANSLATORS: placeholder is a source name in a progress text #: ../src/gtk-ui/sync-ui.c:2142 #, c-format msgid "Receiving '%s'" msgstr "Se primeÈ™te '%s'" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "Date" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "Nici un serviciu de sincronizare în curs" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "Sincronizare eÈ™uată" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "Tipul de sincronizare" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "Configurare manuală" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "Servicii suportate" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "Adaugă un nou dispozitiv" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "ÃŽnapoi la sincronizare" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" "Schimbă serviciul\n" "de sincronizare" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "Șterge toate datele locale È™i înlocuieÈ™te-le cu date de la distanţă" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "Șterge toate datele de la distanță È™i înlocuieÈ™te-le cu date locale" #: ../src/gtk-ui/ui.glade.h:13 msgid "Delete this service" msgstr "Șterge acest serviciu" #: ../src/gtk-ui/ui.glade.h:14 msgid "Edit service settings" msgstr "Modifică setările serviciului" #: ../src/gtk-ui/ui.glade.h:15 msgid "" "If you don't see your service above but know that your sync provider uses " "SyncML\n" "you can setup a service manually." msgstr "" "Dacă nu vizibil serviciul mai sus, dar se È™tie că furnizorul de sincronizări " "utilizează tehnologia SyncML\n" "este posibilă configurarea manuală a unui serviciu." #: ../src/gtk-ui/ui.glade.h:18 msgid "Merge local and remote data (recommended)" msgstr "Fuzionează datele locale cu cele la distanţă (recomandat)" #: ../src/gtk-ui/ui.glade.h:19 msgid "Password" msgstr "Parolă" #: ../src/gtk-ui/ui.glade.h:20 msgid "Reset original server settings" msgstr "RestabileÈ™te setările implicite ale serverului" #: ../src/gtk-ui/ui.glade.h:21 msgid "Save and use this service" msgstr "Salvează È™i foloseÈ™te acest serviciu" #: ../src/gtk-ui/ui.glade.h:22 msgid "Select sync service" msgstr "Selectează serviciul de sincronizare" #: ../src/gtk-ui/ui.glade.h:23 msgid "Server settings" msgstr "Setările serverului" #: ../src/gtk-ui/ui.glade.h:24 msgid "Service name" msgstr "Numele serviciului" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" "Ne pare rău, aveÈ›i nevoie de o conexiune\n" "la internet pentru sincronizare" #: ../src/gtk-ui/ui.glade.h:27 msgid "Stop using this service" msgstr "Nu mai folosiÈ›i acest serviciu" #: ../src/gtk-ui/ui.glade.h:30 msgid "" "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "" "Sincronizarea nu este accesibilă (Serviciul D-Bus nu răspunde), ne pare rău." #: ../src/gtk-ui/ui.glade.h:31 msgid "" "To sync you'll need a network connection and an account with a sync " "service.\n" "We support the following services: " msgstr "" "Pentru a sincroniza, este nevoie de o conexiune la reÈ›ea È™i un cont cu " "servicii de sincronizare.\n" "Noi sprijinim următoarele servicii: " #: ../src/gtk-ui/ui.glade.h:33 msgid "Username" msgstr "Utilizator" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" "Nu este înfiinÅ£at nici un serviciu de sincronizare. Serviciile de " "sincronizare permit \n" "sincronizarea datelor între netbook ÅŸi un serviciu web." #: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "La zi" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Sincronizare (GTK)" #~ msgid "Last time: Received one change." #~ msgid_plural "Last time: Received %d changes." #~ msgstr[0] "Ultima dată: A fost primită o modificare." #~ msgstr[1] "Ultima dată: Au fost primite %d modificări." #~ msgid "Last time: Received %d changes and sent %d changes." #~ msgstr "Ultima dată: Au fost primite %d modificări È™i %d au fost trimise." #~ msgid "Setup sync service" #~ msgstr "Configurează serviciul de sincronizare" #~ msgid "" #~ "You haven't set up a sync service yet. Sync services let you \n" #~ "synchronize your data between your netbook and a web service." #~ msgstr "" #~ "Nu este înfiinÅ£at nici un serviciu de sincronizare. Serviciile de " #~ "sincronizare permit \n" #~ "sincronizarea datelor între netbook ÅŸi un serviciu web." syncevolution-1.5/po/ru.po0000644000373300001540000011042612326412403017123 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-05 23:16+0000\n" "Last-Translator: GLS_Translator_RUS2 \n" "Language-Team: Russian (http://www.transifex.net/projects/p/meego/team/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "СинхронизациÑ" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Контакты" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Ð’Ñтречи" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "ЗаданиÑ" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "ПримечаниÑ" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Ð’Ñтречи и заданиÑ" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Ðачало Ñинхронизации" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Замедлить Ñинхронизацию Ñ %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Да, замедлить Ñинхронизацию" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Ðет, отменить Ñинхронизацию" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Удалить вÑе локальные данные и заменить их на %s? Обычно Ñто не " "рекомендуетÑÑ." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Да, удалить и заменить" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Ðет" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Хотите удалить вÑе данные в %s и заменить на ваши локальные данные? Обычно " "Ñто не рекомендуетÑÑ." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Попытка отменить Ñинхронизацию" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Служба или уÑтройÑтво не выбраны" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - Ñинхронизировано ÑейчаÑ" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - Ñинхронизировано минуту назад" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - Ñинхронизировано %ld минут назад" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - Ñинхронизировано Ñ‡Ð°Ñ Ð½Ð°Ð·Ð°Ð´" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - Ñинхронизировано %ld чаÑов назад" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - Ñинхронизировано день назад" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - Ñинхронизировано %ld дней назад" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Синхронизировать" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "МедленнаÑ/nÑинхронизациÑ" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Другие варианты..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Выбрать Ñлужбу Ñинхронизации" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Редактировать наÑтройки Ñлужбы" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Служба Ñинхронизации или уÑтройÑтво еще не выбраны. Службы Ñинхронизации " "позволÑÑŽÑ‚ Ñинхронизировать данные между нетбуком и веб-Ñлужбой. Кроме того, " "вы можете выполнить Ñинхронизацию непоÑредÑтвенно Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ уÑтройÑтвами." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Синхронизировать повторно" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "ВоÑÑтановление" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "СинхронизациÑ" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Отменить Ñинхронизацию" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "ВернутьÑÑ Ðº Ñинхронизации" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "ÐвтоматичеÑÐºÐ°Ñ ÑинхронизациÑ" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Поврежденные данные: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Поврежденные данные: нет" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "ВоÑÑтановить резервные файлы из %s? Ð’Ñе внеÑенные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ утрачены." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Да, воÑÑтановить" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Создана Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ Ñинхронизацией Ñ %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "ВоÑÑтановить" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Ð’ наÑтоÑщий момент ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ %s невозможна. Ð’Ñ‹ можете " "выполнить медленную двуÑтороннюю Ñинхронизацию или начать Ñ Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð¾Ð¹ верÑии." " Ð’Ñ‹ также можете воÑÑтановить резервную копию, но Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ " "или Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð°Ñ Ð²Ñ€ÐµÑÐ¸Ñ Ð²Ñе еще будут необходимы до того, как ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ " "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñтанет возможной." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "При наличии Ñерьезных Ñбоев можно попробовать выполнить медленную " "Ñинхронизацию, запуÑк Ñ Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð¾Ð¹ верÑии или воÑÑтановление резервной копии." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Удалите вÑе Ñвои локальные\n" "данные и замените на\n" "данные из %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Удалите вÑе данные на\n" "%s и замените\n" "на Ñвои локальные данные" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Ðе удалоÑÑŒ получить ÑпиÑок поддерживаемых Ñлужб от SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "проблема уÑтановки ÑвÑзи Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑом Ñинхронизации. Повторите попытку позже." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "ВоÑÑтановление не удалоÑÑŒ" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "ВоÑÑтановление завершено" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð°" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Подготовка '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Получение '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Отправка '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Удаленное отклонение: одно." msgstr[1] "Удаленные отклонениÑ: %ld." msgstr[2] "Удаленные отклонениÑ: %ld." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Локальное отклонение: одно." msgstr[1] "Локальные отклонениÑ: %ld." msgstr[2] "Локальные отклонениÑ: %ld." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Было %ld локальных и %ld удаленных отказов." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Прошлый раз: без изменений." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Прошлый раз: отправлено одно изменение." msgstr[1] "Прошлый раз: отправлено изменений: %ld." msgstr[2] "Прошлый раз: отправлено изменений: %ld." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Прошлый раз: применено одно изменение." msgstr[1] "Прошлый раз: применено изменений: %ld." msgstr[2] "Прошлый раз: применено изменений: %ld." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Прошлый раз: применено %ld и отправлено %ld изменений." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней Ñинхронизации:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Ð’Ñ‹ только что воÑÑтановили резервную копию. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐµÑ‰Ðµ не " "Ñинхронизированы Ñ %s" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Ожидание Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ операции..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "Ð’ наÑтоÑщий момент ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°. Сервер предлагает " "медленную Ñинхронизацию, но Ñто не вÑегда приводит к желаемому результату, " "еÑли на обеих Ñторонах уже имеютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Ðеожиданный Ñбой процеÑÑа Ñинхронизации." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¾ÑталÑÑ Ð±ÐµÐ· ответа. Ð’Ñ‹ можете Ñохранить пароль в наÑтройках " "Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Проблема обработки запроÑа Ñинхронизации. Возможно, Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° может " "помочь." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Ðе удалоÑÑŒ войти в ÑиÑтему. Возможно, неправильное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ " "пароль?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Запрещено" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "ИÑточник найти не удалоÑÑŒ. Возможно, неправильные наÑтройки." #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Ошибка удаленной базы данных" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Проблема локальной базы данных. Возможно, Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸Ð»Ð¸ " "перезагрузка могут помочь." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "ÐедоÑтаточно Ñвободного меÑта на диÑке" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Ðе удалоÑÑŒ обработать SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñервера не удалаÑÑŒ" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Преобразование файла конфигурации не удалоÑÑŒ" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Ðе удалоÑÑŒ прочитать файл конфигурации" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ найдена" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Файл конфигурации не найден" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Сервер отправил недейÑтвительную информацию" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ñертификата Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñтек" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Сертификат Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ´ÐµÐ¹Ñтвителен" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Ðе удалоÑÑŒ подключитьÑÑ Ðº Ñерверу. Проблема может быть временной, либо " "неправильно указаны наÑтройки." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "Ðеверный URL-Ð°Ð´Ñ€ÐµÑ Ñервера" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Сервер найти не удалоÑÑŒ" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Ошибка %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Ð”Ð»Ñ Ñинхронизации требуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Введите пароль Ð´Ð»Ñ Ñинхронизации Ñ %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "ДейÑтвиÑ" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "или" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "ПрÑÐ¼Ð°Ñ ÑинхронизациÑ" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ ÑинхронизациÑ" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "ВоÑÑтановить из резервной копии" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "ÐœÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ ÑинхронизациÑ" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "ЗапуÑк из черновой верÑии" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "ÐœÐµÐ´Ð»ÐµÐ½Ð½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñравнивает Ñлементы Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон и выполнÑет их объединение. \n" "Ð’ некоторых ÑлучаÑÑ… Ñто может вызвать поÑвление копий данных или их утрату. " #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Ðовое уÑтройÑтво" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "ÐÐ¾Ð²Ð°Ñ Ñлужба" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Резервные копии ÑоздаютÑÑ Ð¿ÐµÑ€ÐµÐ´ каждой Ñинхронизацией. Выберите одну из них " "Ð´Ð»Ñ Ð²Ð¾ÑÑтановлениÑ. Ð’Ñе изменениÑ, внеÑенные поÑле Ñтого, будут утрачены." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Календарь" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Изменить\n" "Ñлужбу Ñинхронизации" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Закрыть" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Удалите вÑе данные на Zyb \n" "и замените на Ñвою\n" "локальную информацию" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Удалите вÑÑŽ Ñвою локальную\n" "информацию и замените\n" "на данные из Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Изменить ÑкÑтренную\n" "Ñинхронизацию" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "ЕÑли Ñлужба не отображаетÑÑ Ð²Ð²ÐµÑ€Ñ…Ñƒ, но извеÑтно, что провайдер иÑпользует SyncML,\n" "Ñлужбу можно наÑтроить вручную." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "ÐаÑтройки" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "ЭкÑÑ‚Ñ€ÐµÐ½Ð½Ð°Ñ ÑинхронизациÑ" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Ð”Ð»Ñ Ñинхронизации вам потребуетÑÑ Ñетевое подключение и ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñо Ñлужбой Ñинхронизации.\n" "ПоддерживаютÑÑ Ñледующие Ñлужбы: " #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "ИÑпользуйте bluetooth Ð´Ð»Ñ Ñинхронизации Ñвоих данных между уÑтройÑтвами." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" "Перед Ñинхронизацией вам необходимо добавить уÑтройÑтва Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ " "Bluetooth." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Обновлено" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Синхронизировать данные PIM" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "ScheduleWorld позволÑет Ñинхронизировать ваши контакты, информацию о " "ÑобытиÑÑ…, Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸ заметки." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync может Ñоздавать резервные копии и Ñинхронизировать ваши контакты" " Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°Ð¼Ð¸ в Gmail." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Создайте резервные копии Ñвоих контактов и календарÑ. СинхронизируйтеÑÑŒ " "одним щелчком мыши в любое Ð²Ñ€ÐµÐ¼Ñ Ð¸ в любом меÑте (ДЕМО)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Служба Mobical позволÑет вам безопаÑно и беÑплатно Ñоздавать копии ваших " "перÑональных мобильных данных." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB - Ñто проÑтой ÑпоÑоб Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ передачи мобильной информации в режиме " "онлайн." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Memotoo позволÑет вам получить доÑтуп к Ñвоим данным Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ компьютера, " "подключенного к Интернету." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Ðе удалоÑÑŒ Ñохранить файл конфигурации" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "У Ñлужбы должно быть Ð¸Ð¼Ñ Ð¸ URL-Ð°Ð´Ñ€ÐµÑ Ñервера" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Ðеобходимо указать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñтой Ñлужбы" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "СброÑить наÑтройки Ð´Ð»Ñ %s? Это не приведет к удалению какой-либо " "Ñинхронизированной информации на любой из Ñторон." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Да, ÑброÑить" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Ðет, Ñохранить наÑтройки" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Удалить наÑтройки Ð´Ð»Ñ %s? Это не приведет к удалению какой-либо " "Ñинхронизированной информации на любой Ñтороне, но при Ñтом Ñти наÑтройки " "будут удалены." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Да, удалить" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "СброÑить наÑтройки" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Удалить наÑтройки" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Сохранить и иÑпользовать" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Сохранить и заменить\n" "текущую Ñлужбу" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Прекратить иÑпользование уÑтройÑтва" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Прекратить иÑпользование Ñервера" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "URL-Ð°Ð´Ñ€ÐµÑ %s" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Отправить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Получить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Sync" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "ÐÐ´Ñ€ÐµÑ Ñервера" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Возможно, Ñто уÑтройÑтво - '%s'. ЕÑли Ñто неверно, проÑмотрите ÑпиÑок " "поддерживаемых уÑтройÑтв и выберите Ñвое, еÑли оно указано" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Ðевозможно точно уÑтановить тип уÑтройÑтва. ПроÑмотрите ÑпиÑок " "поддерживаемых уÑтройÑтв и выберите Ñвое, еÑли оно указано" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth-уÑтройÑтво" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - Ñ€ÑƒÑ‡Ð½Ð°Ñ Ð½Ð°Ñтройка" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Открыть веб-Ñайт" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "ÐаÑтроить ÑейчаÑ" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "ИÑпользовать Ñти наÑтройки" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Пароль" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñервера более ÑложнаÑ, чем та, которую можно отобразить" " здеÑÑŒ. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° Ñинхронизации или Ñинхронизированных типов данных " "перезапишут Ñту конфигурацию." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Скрыть наÑтройки Ñервера" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Отобразить наÑтройки Ñервера" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Синхронизировать в приложении Sync" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ %s" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ компьютера Ñо Ñлужбой Ñинхронизации %s только что " "началаÑÑŒ." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ %s завершена" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ компьютера Ñо Ñлужбой Ñинхронизации %s только что " "завершилаÑÑŒ." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Ошибка Ñинхронизации" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" "Во Ð²Ñ€ÐµÐ¼Ñ Ñинхронизации возникла проблема, на которую вам Ñледует обратить " "внимание." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "ПроÑмотреть" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Отклонить" syncevolution-1.5/po/sk.po0000644000373300001540000006025112326412403017112 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Tomáš Virgl , 2010. # msgid "" msgstr "" "Project-Id-Version: syncevolution.master\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2010-04-21 09:23+0000\n" "PO-Revision-Date: 2010-04-20 23:45+0200\n" "Last-Translator: Tomáš Virgl \n" "Language-Team: slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "SynchronizovaÅ¥" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Kontakty" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Stretnutia" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Úlohy" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Poznámky" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Stretnutia a úlohy" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "ZaÄína sa synchronizácia" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Chcete zahájiÅ¥ pomalú synchronizáciu s %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Ãno, zahájiÅ¥ pomalú synchronizáciu" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Nie, zruÅ¡iÅ¥ synchronizovanie" #. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Chcete vymazaÅ¥ vÅ¡etky lokálne dáta a nahradiÅ¥ ich dátami z %s? Toto sa " "zvyÄajne neodporúÄa." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:460 msgid "Yes, delete and replace" msgstr "Ãno, vymazaÅ¥ a nahradiÅ¥" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:460 #: ../src/gtk-ui/sync-ui.c:1580 msgid "No" msgstr "Nie" #. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:455 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Chcete vymazaÅ¥ vÅ¡etky dáta v %s a nahradiÅ¥ ich vaÅ¡imi lokálnymi dátami? Toto " "sa zvyÄajne neodporúÄa." #: ../src/gtk-ui/sync-ui.c:487 msgid "Trying to cancel sync" msgstr "Pokúša sa zruÅ¡iÅ¥ synchronizácia" #: ../src/gtk-ui/sync-ui.c:529 msgid "No service or device selected" msgstr "Nie je vybraná žiadna služba alebo zariadenie" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:537 #, c-format msgid "%s - synced just now" msgstr "%s - synchronizované práve teraz" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced a minute ago" msgstr "%s - synchronizované pred minútou" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - synchronizované pred %ld minútami" #: ../src/gtk-ui/sync-ui.c:550 #, c-format msgid "%s - synced an hour ago" msgstr "%s - synchronizované pred hodinou" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - synchronizované pred %ld hodinami" #: ../src/gtk-ui/sync-ui.c:559 #, c-format msgid "%s - synced a day ago" msgstr "%s - synchronizované pred jedným dňom" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - synchronizované pred %ld dňami" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:612 ../src/gtk-ui/sync-ui.c:726 msgid "Sync now" msgstr "SynchronizovaÅ¥ teraz" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:618 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "Pomalá synchronizácia" #: ../src/gtk-ui/sync-ui.c:619 msgid "Other options..." msgstr "Iné možnosti..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:624 msgid "Select sync service" msgstr "Vyberte si synchronizaÄnú službu" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:629 msgid "Edit service settings" msgstr "UpraviÅ¥ nastavenia služby" #: ../src/gtk-ui/sync-ui.c:700 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Nevybrali ste si žiadnu synchronizaÄnú službu alebo zariadenie. " "SynchronizaÄná služba vám umožní synchronizovaÅ¥ si vaÅ¡e dáta medzi netbookom " "a webovou službou. Taktiež môžete dáta synchronizovaÅ¥ priamo s niektorými " "zariadeniami." #: ../src/gtk-ui/sync-ui.c:722 msgid "Sync again" msgstr "SynchronizovaÅ¥ znovu" #: ../src/gtk-ui/sync-ui.c:743 msgid "Restoring" msgstr "Obnovovanie" #: ../src/gtk-ui/sync-ui.c:745 msgid "Syncing" msgstr "Synchronizovanie" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:757 ../src/gtk-ui/sync-ui.c:3373 msgid "Cancel sync" msgstr "" "ZruÅ¡iÅ¥\n" "synchronizáciu" #: ../src/gtk-ui/sync-ui.c:922 msgid "Back to sync" msgstr "Späť na synchronizáciu" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1223 msgid "Automatic sync" msgstr "" "Automatická\n" "synchronizácia" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1494 #, c-format msgid "Affected data: %s %s" msgstr "Dotknuté dáta: %s %s" #: ../src/gtk-ui/sync-ui.c:1499 #, c-format msgid "Affected data: none" msgstr "Dotknuté dáta: žiadne" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1577 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Chcete obnoviÅ¥ zálohu z %s? VÅ¡etky zmeny, ktoré ste urobili doteraz budú " "stratené." #: ../src/gtk-ui/sync-ui.c:1580 msgid "Yes, restore" msgstr "Ãno, obnoviÅ¥" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1612 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1631 #, c-format msgid "Backed up before syncing with %s" msgstr "Pred synchronizovaním s %s bola vytvorená záložná kópia." #: ../src/gtk-ui/sync-ui.c:1648 msgid "Restore" msgstr "ObnoviÅ¥" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1755 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "Momentálne nie je možné vykonaÅ¥ obyÄajnú synchronizáciu s %s. Môžete vykonaÅ¥ " "pomalú synchronizáciu alebo zaÄaÅ¥ úplne od zaÄiatku. Taktiež môžete obnoviÅ¥ " "zálohu, ale pomalá synchronizácia alebo zaÄiatok budú požadované pred tým " "než bude možná obyÄajná synchronizácia." #: ../src/gtk-ui/sync-ui.c:1765 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "KeÄ sa stane nieÄo veľmi zlé môžete skúsiÅ¥ pomalú synchronizáciu, zaÄaÅ¥ " "úplne od zaÄiatku alebo obnoviÅ¥ zálohu." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1774 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "VymazaÅ¥ vÅ¡etky\n" "lokálne dáta a nahradiÅ¥\n" "ich s dátami z %s" #: ../src/gtk-ui/sync-ui.c:1780 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "VymazaÅ¥ vÅ¡etky dáta\n" "na %s a nahradiÅ¥ ich\n" "lokálnymi dátami" #: ../src/gtk-ui/sync-ui.c:2241 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Zlyhalo získavanie zoznamu podporovaných služieb z SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2295 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Nastal problém pri komunikovaní so synchronizaÄným procesom. Pokus zopakujte " "neskôr." #: ../src/gtk-ui/sync-ui.c:2354 msgid "Restore failed" msgstr "Obnova zlyhala" #: ../src/gtk-ui/sync-ui.c:2357 ../src/gtk-ui/sync-ui.c:3242 msgid "Sync failed" msgstr "Synchronizácia zlyhala" #: ../src/gtk-ui/sync-ui.c:2363 msgid "Restore complete" msgstr "Obnova hotová" #: ../src/gtk-ui/sync-ui.c:2366 msgid "Sync complete" msgstr "Synchronizácia hotová" #: ../src/gtk-ui/sync-ui.c:2458 #, c-format msgid "Preparing '%s'" msgstr "Pripravuje sa '%s'" #: ../src/gtk-ui/sync-ui.c:2461 #, c-format msgid "Receiving '%s'" msgstr "Prijíma sa '%s'" #: ../src/gtk-ui/sync-ui.c:2464 #, c-format msgid "Sending '%s'" msgstr "Posiela sa '%s'" #: ../src/gtk-ui/sync-ui.c:2585 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui.c:2590 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui.c:2595 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "" #: ../src/gtk-ui/sync-ui.c:2600 #, c-format msgid "Last time: No changes." msgstr "" #: ../src/gtk-ui/sync-ui.c:2602 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "" msgstr[1] "" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2610 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui.c:2615 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "" #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2822 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" #: ../src/gtk-ui/sync-ui.c:2832 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" #: ../src/gtk-ui/sync-ui.c:3120 msgid "Waiting for current operation to finish..." msgstr "" #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3154 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync, " "but this might not always be what you want if both ends already have data." msgstr "" #: ../src/gtk-ui/sync-ui.c:3158 msgid "The sync process died unexpectedly." msgstr "" #: ../src/gtk-ui/sync-ui.c:3163 msgid "" "Password request was not answered. You can save the password in the settings " "to prevent the request." msgstr "" #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3167 msgid "There was a problem processing sync request. Trying again may help." msgstr "" #: ../src/gtk-ui/sync-ui.c:3173 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" #: ../src/gtk-ui/sync-ui.c:3176 msgid "Forbidden" msgstr "" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3182 msgid "" "A data source could not be found. Could there be a problem with the settings?" msgstr "" #: ../src/gtk-ui/sync-ui.c:3186 msgid "Remote database error" msgstr "" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3189 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" #: ../src/gtk-ui/sync-ui.c:3192 msgid "No space on disk" msgstr "" #: ../src/gtk-ui/sync-ui.c:3194 msgid "Failed to process SyncML" msgstr "" #: ../src/gtk-ui/sync-ui.c:3196 msgid "Server authorization failed" msgstr "" #: ../src/gtk-ui/sync-ui.c:3198 msgid "Failed to parse configuration file" msgstr "" #: ../src/gtk-ui/sync-ui.c:3200 msgid "Failed to read configuration file" msgstr "" #: ../src/gtk-ui/sync-ui.c:3202 msgid "No configuration found" msgstr "" #: ../src/gtk-ui/sync-ui.c:3204 msgid "No configuration file found" msgstr "" #: ../src/gtk-ui/sync-ui.c:3206 msgid "Server sent bad content" msgstr "" #: ../src/gtk-ui/sync-ui.c:3208 msgid "Connection certificate has expired" msgstr "" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Connection certificate is invalid" msgstr "" #: ../src/gtk-ui/sync-ui.c:3218 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" #: ../src/gtk-ui/sync-ui.c:3225 msgid "The server URL is bad" msgstr "" #: ../src/gtk-ui/sync-ui.c:3230 msgid "The server was not found" msgstr "" #: ../src/gtk-ui/sync-ui.c:3232 #, c-format msgid "Error %d" msgstr "" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3370 msgid "Password is required for sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:3374 msgid "Sync with password" msgstr "" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3384 #, c-format msgid "Please enter password for syncing with %s:" msgstr "" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "" #. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" #. button in main view, right side. Keep length to 20 characters or so, use two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses " "SyncML\n" "you can setup a service manually." msgstr "" #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync " "service.\n" "We support the following services: " msgstr "" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" #: ../src/gtk-ui/sync.desktop.in.h:2 ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:78 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in " "sync." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:81 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:87 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:90 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:93 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:96 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:192 msgid "Sorry, failed to save the configuration" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:381 msgid "Service must have a name and server URL" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:422 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:426 msgid "Yes, reset" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:427 #: ../src/gtk-ui/sync-config-widget.c:438 msgid "No, keep settings" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:432 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:437 msgid "Yes, delete" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:467 msgid "Reset settings" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:470 msgid "Delete settings" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:480 msgid "Save and use" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:483 msgid "" "Save and replace\n" "current service" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:493 msgid "Stop using device" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:496 msgid "Stop using service" msgstr "" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:679 #, c-format msgid "%s URI" msgstr "" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:854 #, c-format msgid "Send changes to %s" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:859 #, c-format msgid "Receive changes from %s" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:875 msgid "Sync" msgstr "" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:891 msgid "Server address" msgstr "" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:967 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:973 msgid "" "We don't know what this device is exactly. Please take a look at the list of " "supported devices and pick yours if it is listed" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:1126 #, c-format msgid "%s - Bluetooth device" msgstr "" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1132 #, c-format msgid "%s - manually setup" msgstr "" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1807 msgid "Launch website" msgstr "" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1816 msgid "Set up now" msgstr "" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1912 msgid "Username" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:1927 msgid "Password" msgstr "" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:1950 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1969 msgid "Hide server settings" msgstr "" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1989 msgid "Show server settings" msgstr "" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "" #: ../src/syncevo-dbus-server.cpp:5664 #, c-format msgid "%s is syncing" msgstr "" #: ../src/syncevo-dbus-server.cpp:5665 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:5679 #, c-format msgid "%s sync complete" msgstr "" #: ../src/syncevo-dbus-server.cpp:5680 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" #. if sync is successfully started and has errors, or not started successful with a fatal problem #: ../src/syncevo-dbus-server.cpp:5685 msgid "Sync problem." msgstr "" #: ../src/syncevo-dbus-server.cpp:5686 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" #: ../src/syncevo-dbus-server.cpp:5759 msgid "View" msgstr "" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:5763 msgid "Dismiss" msgstr "" syncevolution-1.5/po/sv.po0000644000373300001540000007326612326412403017137 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Annika Olsson , 2011. # Mathilda , 2011. # , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-11 17:36+0000\n" "Last-Translator: GLS_SVE1 \n" "Language-Team: Swedish (http://www.transifex.net/projects/p/meego/team/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "Synkronisering " #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "Kontakter" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Möten" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "Uppgifter" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "Anteckningar" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "Möten och uppgifter" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Startar synkronisering" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "Vill du sakta ner synkronisering med %s?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "Ja, sakta ner synk" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Nej, avbryt synkronisering " #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "" "Vill du radera alla lokala data och ersätta dem med data frÃ¥n %s? Detta " "rekommenderas vanligtvis inte." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "Ja, radera och ersätt filer" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "Nej" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "" "Vill du radera alla data pÃ¥ %s och ersätta dem med lokala data? Detta " "rekommenderas vanligtvis inte." #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "Försöker att avbryta synkronisering" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "Ingen markerad tjänst eller enhet" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - synkroniserade nyss" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - synkroniserat en minut sedan" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - synkroniserat %ld minuter sedan" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - synkroniserat en timme sedan" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - synkroniserat %ld timmar sedan" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - synkroniserat en dag sedan" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - synkroniserat %ld dagar sedan" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "Synkronisera nu" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "LÃ¥ngsam synkronisering " #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "Andra alternativ" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "Välj synkroniseringstjänst" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "Ändra inställningar för tjänst" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "" "Du har inte valt synktjänst eller -enhet än. Med synktjänster kan du synka " "dina data mellan din netbook och en webbtjänst. Du kan ocksÃ¥ synka direkt " "med vissa enheter." #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "Synkronisera igen" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "Ã…terställer" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "Synkroniserar " #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "Avbryt synkronisering" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "Tillbaka till synkronisering" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "Automatisk synkronisering" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "Data som pÃ¥verkas: %s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "Data som pÃ¥verkas: inga" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "" "Vill du Ã¥terställa säkerhetskopian frÃ¥n %s? DÃ¥ förlorar du alla ändringar du" " har gjort sedan dess." #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "Ja, Ã¥terställ" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "Säkerhetskopierades före synkronisering med %s" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "Ã…terställ" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "En normal synkronisering med %s är inte möjlig just nu. Du kan göra en " "lÃ¥ngsam tvÃ¥vägssynk eller börja om frÃ¥n början. Du kan ocksÃ¥ Ã¥terställa en " "säkerhetskopia, men en lÃ¥ngsam synk eller att börja om frÃ¥n början krävs " "ändÃ¥ innan normal synk blir möjlig." #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "" "Om nÃ¥got har gÃ¥tt verkligt fel kan du prova en lÃ¥ngsam synk, börja frÃ¥n " "början eller Ã¥terställa frÃ¥n säkerhetskopian." #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "Radera alla lokala\n" "data och ersätt med\n" "data frÃ¥n %s" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "Radera alla data pÃ¥\n" "%s och ersätt med\n" "dina lokala data" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "Kunde inte fÃ¥ en lista med tjänster som stöds frÃ¥n SyncEvolution" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "" "Det uppstod problem vid kommunikation med synkprocessen. Försök igen senare." #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "Ã…terställning misslyckades" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "Synk misslyckades" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "Ã…terställning färdig" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "Synk färdig" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "Förbereder '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "Tas emot frÃ¥n '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "Skickas till '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "Det finns en fjärr-refusering." msgstr[1] "Det finns %ld fjärr-refuseringar." #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "Det finns en lokal refusering." msgstr[1] "Det finns %ld lokala refuseringar." #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "Det fanns %ld lokala refuseringar och %ld fjärr-refuseringar." #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "Senast: Inga ändringar." #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "Senast: Skickade en ändring." msgstr[1] "Senast: Skickade %ld ändringar." #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "Senast: Utförde en ändring." msgstr[1] "Senast: Utförde %ld ändringar." #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "Senast: Utförde %ld ändringar och skickade %ld ändringar." #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "Problem med senaste synkronisering:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" "Du har just Ã¥terställt en säkerhetskopia. Ändringarna har ännu inte " "synkroniserats med %s" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "Väntar pÃ¥ att nuvarande Ã¥tgärd ska bli klar..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "" "En normal synk är inte möjlig just nu. Servern föreslÃ¥r en lÃ¥ngsam synk men " "detta kanke inte alltid är vad du vill ha om bÃ¥da ändar redan har data." #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "Synkprocessen avslutades oväntat." #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "" "LösenordsförfrÃ¥gan besvarades inte. Förhindra förfrÃ¥gan genom att spara " "lösenordet i inställningarna." #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "" "Problem med behandling av synkbegäran. Det kan vara en bra idé att försöka " "igen." #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "" "Kunde inte logg in. Kan det finnas problem med ditt användarnamn eller " "lösenord?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "Förbjuden" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "Hittade inte en datakälla. Kan det finnas problem i inställningarna?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "Fjärrdatabasfel" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "" "Det finns problem i den lokala databasen. Det kan vara en bra idé att " "synkronisera eller starta upp igen." #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "Inget diskutrymme" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "Kunde inte hantera SyncML" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "Kunde inte ansluta till server" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "Kunde inte analysera konfigurationsfilen " #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "Kunde inte öppna konfigurationsfilen" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "Konfiurationen hittades inte" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "Konfigurationsfilen hittades inte" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "Server skickade felaktigt innehÃ¥ll" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "Utfärdat certifikat har gÃ¥tt ut" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "Anslutningscertifikatet är ogiltig." #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "" "Vi kunde inte ansluta till servern. Problemet kan vara temporärt eller sÃ¥ " "kan det finnas fel i inställningarna." #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "Ogiltig server-URL" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "Hittade inte servern" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "Fel %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "Lösenord krävs för synkronisering" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "Synkronisera med lösenord" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "Ange lösenord för synkronisering med %s:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "Ã…tgärder" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "eller" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "Direktsynk" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "Nätverkssynk" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "Ã…terställ frÃ¥n säkerhetskopia" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "LÃ¥ngsam synk" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "Börja frÃ¥n början" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "LÃ¥ngsam synkronisering jämför objekt frÃ¥n bÃ¥da sidor och försöker kombinera dem. \n" "Detta kan misslyckas i vissa fall och leda till duplikat eller förlorad information." #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Lägg till ny enhet" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Lägg till ny tjänst" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "" "Säkerhetskopieringar görs före varje synkronisering. Välj en säkerhetskopia " "att Ã¥terställa. Alla ändringar som du gjort sedan dess förloras." #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Kalender" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "Ändra eller redigera\n" "synktjänst" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Stäng" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "Radera alla data pÃ¥ Zyb \n" "och ersätt med din\n" "lokala information" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "Radera all lokal\n" "information och ersätt\n" "med data frÃ¥n Zyb" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "Fixa ett akut\n" "synkproblem" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "Om du inte ser din tjänst ovan men vet att ditt synkföretag använder SyncML\n" "kan du manuellt göra inställningarna." #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Inställningar" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "Akut synkproblem" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "Innan du kan synkronisera behöver du nätverksanslutning och ett konto med\n" "synktjänst. Vi stöder följande tjänster:" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" "Använd Bluetooth för att synkroisera dina data frÃ¥n en enhet till en annan." #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "Du mÃ¥ste lägga till Bluetooth-enheter innan du kan synkronisera dem." #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "Uppdaterad" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "Synkronisera PIM-data" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "" "Med ScheduleWorld kan du hÃ¥lla kontakter, aktiviteter, uppgifter och " "meddelanden uppdaterade." #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "" "Google Sync kan säkerhetskopiera och synka dina kontakter med dina Gmail-" "kontakter." #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "" "Säkerhetskopiera kontakter och kalender. Synka med ett enkelklick, när som " "helst, var som helst (DEMO)." #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "" "Med Mobical-tjänsten för säkerhetskopiering och Ã¥terställning kan du säkert " "säkerhetskopia dina personliga mobila data gratis." #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "" "ZYB är ett enkelt sätt för människor att lagra och dela mobilinformation " "online." #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "" "Med Memotoo kan du nÃ¥ dina personliga data frÃ¥n valfri dator ansluten till " "Internet." #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "Kunde inte spara konfigurationen " #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "Du mÃ¥ste ange ett namn pÃ¥ tjänsten och URL till servern" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "Det behövs ett användarnamn för denna tjänst" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "" "Vill du Ã¥terställa inställningarna för %s? Detta tar inte bort nÃ¥gon " "synkroniserad information pÃ¥ nÃ¥gon ände." #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "Ja, Ã¥terställ" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "Nej, behÃ¥ll inställningar" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "" "Vill du ta bort inställningarna för %s? Detta tar inte bort nÃ¥gon " "synkroniserad information pÃ¥ nÃ¥gon ände men det tar bort dessa " "inställningar." #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "Ja, radera" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "Ã…terställ inställningar" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "Radera inställningar" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "Spara och använd" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "Spara och ersätt\n" "nuvarande tjänst" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "Sluta använda enhet" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "Sluta använda tjänst" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "Skicka ändringar till %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "Ta emot ändringar frÃ¥n %s" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "Synkronisera" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "Serveradress" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "" "Den här enheten ser ut som om den kan vara en %s. Om detta inte är korrekt, " "ta en titt pÃ¥ listan med enheter som stöds och välj din om den finns med pÃ¥ " "listan" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "" "Vi kan inte identifiera den här enheten. Ta en titt pÃ¥ listan med enheter " "som stöds och välj din om den finns med pÃ¥ listan" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - Bluetooth-enhet" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - konfigurera manuellt" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "Öppna webbplatsen " #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "Konfigurera nu" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "Använd dessa inställningar" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "Användarnamn" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "Lösenord" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "" "Nuvarande konfiguration är mer komplex än vad som kan visas här. Ändringar i" " synkläge eller synkroniserade datatyper skriver över den konfigurationen." #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "Dölj serverinställningar" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "Visa serverinställningar" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "Synkronisera i programmet Sync" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s synkroniserar " #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "Vi har nyss börjat synkronisera din dator med synktjänsten %s." #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s synk färdig" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "Vi har precis synkroniserat din dator med synktjänsten %s." #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "Synkproblem." #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" "Det finns ett problem i din synkronisering som du mÃ¥ste ta en titt pÃ¥." #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "Visa" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "Ignorera" syncevolution-1.5/po/th.po0000644000373300001540000002570612326412403017116 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2009-12-21 18:45+0000\n" "PO-Revision-Date: 2010-01-19 22:07+0700\n" "Last-Translator: Anuchit Chalothorn \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n!=1;\n" "X-Poedit-Language: Thai\n" "X-Poedit-Country: THAILAND\n" "X-Poedit-SourceCharset: utf-8\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:31 #: ../src/gtk-ui/ui.glade.h:20 #: ../src/gtk-ui/sync.desktop.in.h:1 msgid "Sync" msgstr "" #. TRANSLATORS: The name was changed from 'Addressbook' to #. 'Contacts' to match naming in rest of moblin. Please make sure the #. name you use matches the name in the panel and Contacts application. #: ../src/gtk-ui/sync-ui.c:192 msgid "Contacts" msgstr "" #: ../src/gtk-ui/sync-ui.c:194 msgid "Calendar" msgstr "" #: ../src/gtk-ui/sync-ui.c:196 msgid "Todo" msgstr "" #: ../src/gtk-ui/sync-ui.c:198 msgid "Memo" msgstr "" #. TODO show in UI: failed to abort sync (while syncing) #: ../src/gtk-ui/sync-ui.c:273 msgid "Failed to abort sync" msgstr "" #. TODO show in UI: sync failed (failed to even start) #: ../src/gtk-ui/sync-ui.c:287 msgid "Failed to start sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:293 msgid "Starting sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:309 msgid "Trying to cancel sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:316 #, c-format msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised." msgstr "" #: ../src/gtk-ui/sync-ui.c:321 #, c-format msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised." msgstr "" #: ../src/gtk-ui/sync-ui.c:338 msgid "No, cancel sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:340 msgid "Yes, delete and replace" msgstr "" #: ../src/gtk-ui/sync-ui.c:377 msgid "Last synced just seconds ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:380 msgid "Last synced a minute ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:383 #, c-format msgid "Last synced %ld minutes ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:386 msgid "Last synced an hour ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:389 #, c-format msgid "Last synced %ld hours ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:392 msgid "Last synced a day ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:395 #, c-format msgid "Last synced %ld days ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:480 msgid "Sync again" msgstr "" #: ../src/gtk-ui/sync-ui.c:482 #: ../src/gtk-ui/ui.glade.h:21 msgid "Sync now" msgstr "" #: ../src/gtk-ui/sync-ui.c:493 msgid "Syncing" msgstr "" #: ../src/gtk-ui/sync-ui.c:499 msgid "Cancel sync" msgstr "" #. TRANSLATORS: placeholder is a source name, shown with checkboxes in main window #: ../src/gtk-ui/sync-ui.c:849 #, c-format msgid "%s (not supported by this service)" msgstr "" #: ../src/gtk-ui/sync-ui.c:1046 msgid "Failed to get list of configured services from SyncEvolution" msgstr "" #: ../src/gtk-ui/sync-ui.c:1117 msgid "Failed to get list of supported services from SyncEvolution" msgstr "" #: ../src/gtk-ui/sync-ui.c:1221 msgid "Sync complete" msgstr "" #: ../src/gtk-ui/sync-ui.c:1310 #, c-format msgid "Preparing '%s'" msgstr "" #: ../src/gtk-ui/sync-ui.c:1313 #, c-format msgid "Receiving '%s'" msgstr "" #: ../src/gtk-ui/sync-ui.c:1316 #, c-format msgid "Sending '%s'" msgstr "" #: ../src/gtk-ui/sync-ui.c:1705 msgid "Waiting for current operation to finish..." msgstr "" #: ../src/gtk-ui/sync-ui.c:1750 msgid "Not authorized" msgstr "" #: ../src/gtk-ui/sync-ui.c:1752 msgid "Forbidden" msgstr "" #: ../src/gtk-ui/sync-ui.c:1754 msgid "Not found" msgstr "" #: ../src/gtk-ui/sync-ui.c:1756 msgid "Fatal database error" msgstr "" #: ../src/gtk-ui/sync-ui.c:1758 msgid "Database error" msgstr "" #: ../src/gtk-ui/sync-ui.c:1760 msgid "No space left" msgstr "" #. TODO identify problem item somehow ? #: ../src/gtk-ui/sync-ui.c:1763 msgid "Failed to process SyncML" msgstr "" #: ../src/gtk-ui/sync-ui.c:1765 msgid "Server authorization failed" msgstr "" #: ../src/gtk-ui/sync-ui.c:1767 msgid "Failed to parse configuration file" msgstr "" #: ../src/gtk-ui/sync-ui.c:1769 msgid "Failed to read configuration file" msgstr "" #: ../src/gtk-ui/sync-ui.c:1771 msgid "No configuration found" msgstr "" #: ../src/gtk-ui/sync-ui.c:1773 msgid "No configuration file found" msgstr "" #: ../src/gtk-ui/sync-ui.c:1775 msgid "Server sent bad content" msgstr "" #: ../src/gtk-ui/sync-ui.c:1777 msgid "Transport failure (no connection?)" msgstr "" #: ../src/gtk-ui/sync-ui.c:1779 msgid "Connection timed out" msgstr "" #: ../src/gtk-ui/sync-ui.c:1781 msgid "Connection certificate has expired" msgstr "" #: ../src/gtk-ui/sync-ui.c:1783 msgid "Connection certificate is invalid" msgstr "" #: ../src/gtk-ui/sync-ui.c:1786 msgid "Connection failed" msgstr "" #: ../src/gtk-ui/sync-ui.c:1788 msgid "URL is bad" msgstr "" #: ../src/gtk-ui/sync-ui.c:1790 msgid "Server not found" msgstr "" #: ../src/gtk-ui/sync-ui.c:1792 #, c-format msgid "Error %d" msgstr "" #. TODO show in UI: server disappeared #: ../src/gtk-ui/sync-ui.c:1803 msgid "Syncevolution.Server D-Bus service exited unexpectedly" msgstr "" #: ../src/gtk-ui/sync-ui.c:1806 msgid "Sync Failed" msgstr "" #: ../src/gtk-ui/sync-ui-config.c:95 #, c-format msgid "There was one remote rejection." msgid_plural "There were %d remote rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui-config.c:100 #, c-format msgid "There was one local rejection." msgid_plural "There were %d local rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui-config.c:105 #, c-format msgid "There were %d local rejections and %d remote rejections." msgstr "" #: ../src/gtk-ui/sync-ui-config.c:110 #, c-format msgid "Last time: No changes." msgstr "" #: ../src/gtk-ui/sync-ui-config.c:112 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %d changes." msgstr[0] "" msgstr[1] "" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui-config.c:120 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %d changes." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui-config.c:125 #, c-format msgid "Last time: Applied %d changes and sent %d changes." msgstr "" #: ../src/gtk-ui/ui.glade.h:1 msgid "Data" msgstr "" #: ../src/gtk-ui/ui.glade.h:2 msgid "No sync service in use" msgstr "" #: ../src/gtk-ui/ui.glade.h:3 msgid "Sync failure" msgstr "" #: ../src/gtk-ui/ui.glade.h:4 msgid "Type of Sync" msgstr "" #: ../src/gtk-ui/ui.glade.h:5 msgid "Manual setup" msgstr "" #: ../src/gtk-ui/ui.glade.h:6 msgid "Supported services" msgstr "" #: ../src/gtk-ui/ui.glade.h:7 msgid "Add new service" msgstr "" #: ../src/gtk-ui/ui.glade.h:8 msgid "Back to sync" msgstr "" #: ../src/gtk-ui/ui.glade.h:9 msgid "" "Change sync\n" "service" msgstr "" #: ../src/gtk-ui/ui.glade.h:11 msgid "Delete all local data and replace it with remote data" msgstr "" #: ../src/gtk-ui/ui.glade.h:12 msgid "Delete all remote data and replace it with local data" msgstr "" #: ../src/gtk-ui/ui.glade.h:13 msgid "Edit service settings" msgstr "" #: ../src/gtk-ui/ui.glade.h:14 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" #: ../src/gtk-ui/ui.glade.h:16 msgid "Merge local and remote data (recommended)" msgstr "" #: ../src/gtk-ui/ui.glade.h:17 msgid "Select sync service" msgstr "" #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Sorry, you need an internet\n" "connection to sync." msgstr "" #: ../src/gtk-ui/ui.glade.h:22 msgid "Sync settings" msgstr "" #: ../src/gtk-ui/ui.glade.h:23 msgid "Synchronization is not available (D-Bus service does not answer), sorry." msgstr "" #: ../src/gtk-ui/ui.glade.h:24 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" #: ../src/gtk-ui/ui.glade.h:26 msgid "" "You haven't selected a sync service yet. Sync services let you \n" "synchronize your data between your netbook and a web service." msgstr "" #: ../src/gtk-ui/sync.desktop.in.h:2 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:48 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:51 msgid "Google Sync can back up and synchronize your Address Book with your Gmail contacts." msgstr "" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:57 msgid "Back up your contacts and calendar. Sync with a singleclick, anytime, anywhere (DEMO)." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:227 msgid "Service must have a name and server URL" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:271 msgid "Reset service" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:274 msgid "Delete service" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:284 msgid "Save and use" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:287 msgid "" "Save and replace\n" "current service" msgstr "" #. TRANSLATORS: label for an entry in service configuration. #. * Placeholder is a source name in settings window. #. * Example: "Addressbook URI" #: ../src/gtk-ui/sync-config-widget.c:355 #, c-format msgid "%s URI" msgstr "" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:419 msgid "Server URL" msgstr "" #. TRANSLATORS: this is the epander label for server settings #: ../src/gtk-ui/sync-config-widget.c:459 msgid "Hide server settings" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:461 msgid "Show server settings" msgstr "" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:512 #, c-format msgid "%s - manually setup" msgstr "" #. TRANSLATORS: linkbutton label #: ../src/gtk-ui/sync-config-widget.c:1189 msgid "Launch website" msgstr "" #. TRANSLATORS: button label #: ../src/gtk-ui/sync-config-widget.c:1198 msgid "Set up now" msgstr "" #. TRANSLATORS: labels of entries #: ../src/gtk-ui/sync-config-widget.c:1236 msgid "Username" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:1251 msgid "Password" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:1295 msgid "Stop using service" msgstr "" syncevolution-1.5/po/tr.po0000644000373300001540000005721712326412403017132 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://moblin.org/projects/syncevolution\n" "POT-Creation-Date: 2010-05-19 09:19+0000\n" "PO-Revision-Date: 2010-05-19 10:57-0500\n" "Last-Translator: Ahmet Özgür Erdemli \n" "Language-Team: MeeGo Türkçe\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-Language: Turkish\n" "X-Poedit-Country: TURKEY\n" "X-Poedit-SourceCharset: utf-8\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 #: ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "Randevular" #: ../src/gtk-ui/sync-ui.c:270 #: ../src/gtk-ui/ui.glade.h:40 #, fuzzy msgid "Tasks" msgstr "Sık Kullanılan Görevler" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 #, fuzzy msgid "Appointments & Tasks" msgstr "Sık Kullanılan Görevler" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "Senkronizasyonu baÅŸlat" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "Hayır, senkronizasyonu iptal et" #. TRANSLATORS: confirmation dialog for refresh-from-server. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "Do you want to delete all local data and replace it with data from %s? This is not usually advised." msgstr "" #: ../src/gtk-ui/sync-ui.c:429 #: ../src/gtk-ui/sync-ui.c:460 msgid "Yes, delete and replace" msgstr "" #: ../src/gtk-ui/sync-ui.c:429 #: ../src/gtk-ui/sync-ui.c:460 #: ../src/gtk-ui/sync-ui.c:1605 msgid "No" msgstr "Hayır" #. TRANSLATORS: confirmation dialog for refresh-from-client. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:455 #, c-format msgid "Do you want to delete all data in %s and replace it with your local data? This is not usually advised." msgstr "" #: ../src/gtk-ui/sync-ui.c:487 msgid "Trying to cancel sync" msgstr "Senkronizasyon iptal edilmeye çalışılıyor" #: ../src/gtk-ui/sync-ui.c:529 msgid "No service or device selected" msgstr "" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:537 #, c-format msgid "%s - synced just now" msgstr "%s - yeni senkronize edildi" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced a minute ago" msgstr "%s - bir dakika önce senkronize edildi" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced %ld minutes ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:550 #, c-format msgid "%s - synced an hour ago" msgstr "%s - bir saat önce senkronize edildi" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced %ld hours ago" msgstr "" #: ../src/gtk-ui/sync-ui.c:559 #, c-format msgid "%s - synced a day ago" msgstr "%s - bir gün önce senkronize edildi" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced %ld days ago" msgstr "" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:612 #: ../src/gtk-ui/sync-ui.c:726 msgid "Sync now" msgstr "Åžimdi senkronize et" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:618 #: ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "YavaÅŸ senkronizasyon" #: ../src/gtk-ui/sync-ui.c:619 msgid "Other options..." msgstr "DiÄŸer seçenekler..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:624 msgid "Select sync service" msgstr "Senkronizasyon servisi seçin" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:629 msgid "Edit service settings" msgstr "Servis ayarlarını deÄŸiÅŸtirin" #: ../src/gtk-ui/sync-ui.c:700 msgid "You haven't selected a sync service or device yet. Sync services let you synchronize your data between your netbook and a web service. You can also sync directly with some devices." msgstr "" #: ../src/gtk-ui/sync-ui.c:722 msgid "Sync again" msgstr "Tekrar senkronize edin" #: ../src/gtk-ui/sync-ui.c:743 msgid "Restoring" msgstr "" #: ../src/gtk-ui/sync-ui.c:745 msgid "Syncing" msgstr "" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:757 #: ../src/gtk-ui/sync-ui.c:3399 msgid "Cancel sync" msgstr "Senkronizasyonu iptal et" #: ../src/gtk-ui/sync-ui.c:922 msgid "Back to sync" msgstr "Senkronizasyona geri dönün" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1224 msgid "Automatic sync" msgstr "Otomatik senkronizasyon" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1519 #, fuzzy, c-format msgid "Affected data: %s %s" msgstr "Veri isteniyor" #: ../src/gtk-ui/sync-ui.c:1524 #, fuzzy, c-format msgid "Affected data: none" msgstr "Etkilenen paketler:Hiçbiri" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1602 #, c-format msgid "Do you want to restore the backup from %s? All changes you have made since then will be lost." msgstr "" #: ../src/gtk-ui/sync-ui.c:1605 #, fuzzy msgid "Yes, restore" msgstr "Evet, sil" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1637 #, c-format msgid "%x %X" msgstr "" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1656 #, c-format msgid "Backed up before syncing with %s" msgstr "" #: ../src/gtk-ui/sync-ui.c:1673 msgid "Restore" msgstr "" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1780 #, c-format msgid "A normal sync with %s is not possible at this time. You can do a slow two-way sync or start from scratch. You can also restore a backup, but a slow sync or starting from scratch will still be required before normal sync is possible." msgstr "" #: ../src/gtk-ui/sync-ui.c:1790 #, c-format msgid "If something has gone horribly wrong, you can try a slow sync, start from scratch or restore from backup." msgstr "" #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1799 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" #: ../src/gtk-ui/sync-ui.c:1805 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" #: ../src/gtk-ui/sync-ui.c:2267 msgid "Failed to get list of supported services from SyncEvolution" msgstr "" #: ../src/gtk-ui/sync-ui.c:2321 msgid "There was a problem communicating with the sync process. Please try again later." msgstr "" #: ../src/gtk-ui/sync-ui.c:2380 #, fuzzy msgid "Restore failed" msgstr "BaÄŸlantı baÅŸarısız" #: ../src/gtk-ui/sync-ui.c:2383 #: ../src/gtk-ui/sync-ui.c:3268 msgid "Sync failed" msgstr "Senkronizasyon baÅŸarısız" #: ../src/gtk-ui/sync-ui.c:2389 #, fuzzy msgid "Restore complete" msgstr "Tamam, ancak tek deÄŸil" #: ../src/gtk-ui/sync-ui.c:2392 msgid "Sync complete" msgstr "Senkronizasyon tamamlandı" #: ../src/gtk-ui/sync-ui.c:2484 #, c-format msgid "Preparing '%s'" msgstr "'%s' hazırlanıyor" #: ../src/gtk-ui/sync-ui.c:2487 #, c-format msgid "Receiving '%s'" msgstr "" #: ../src/gtk-ui/sync-ui.c:2490 #, c-format msgid "Sending '%s'" msgstr "'%s' gönderiliyor" #: ../src/gtk-ui/sync-ui.c:2611 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui.c:2616 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui.c:2621 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "" #: ../src/gtk-ui/sync-ui.c:2626 #, c-format msgid "Last time: No changes." msgstr "" #: ../src/gtk-ui/sync-ui.c:2628 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "" msgstr[1] "" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "" msgstr[1] "" #: ../src/gtk-ui/sync-ui.c:2641 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "" #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2848 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" #: ../src/gtk-ui/sync-ui.c:2858 #, c-format msgid "You've just restored a backup. The changes have not been synced with %s yet" msgstr "" #: ../src/gtk-ui/sync-ui.c:3146 msgid "Waiting for current operation to finish..." msgstr "" #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3180 msgid "A normal sync is not possible at this time. The server suggests a slow sync, but this might not always be what you want if both ends already have data." msgstr "" #: ../src/gtk-ui/sync-ui.c:3184 msgid "The sync process died unexpectedly." msgstr "" #: ../src/gtk-ui/sync-ui.c:3189 msgid "Password request was not answered. You can save the password in the settings to prevent the request." msgstr "" #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3193 msgid "There was a problem processing sync request. Trying again may help." msgstr "" #: ../src/gtk-ui/sync-ui.c:3199 msgid "Failed to login. Could there be a problem with your username or password?" msgstr "" #: ../src/gtk-ui/sync-ui.c:3202 msgid "Forbidden" msgstr "" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3208 msgid "A data source could not be found. Could there be a problem with the settings?" msgstr "" #: ../src/gtk-ui/sync-ui.c:3212 #, fuzzy msgid "Remote database error" msgstr "Dahili hata oluÅŸtu" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3215 msgid "There is a problem with the local database. Syncing again or rebooting may help." msgstr "" #: ../src/gtk-ui/sync-ui.c:3218 msgid "No space on disk" msgstr "Diskte yer kalmadı" #: ../src/gtk-ui/sync-ui.c:3220 #, fuzzy msgid "Failed to process SyncML" msgstr "Dizin okuma baÅŸarısız %s: %m" #: ../src/gtk-ui/sync-ui.c:3222 #, fuzzy msgid "Server authorization failed" msgstr "Paket indirme baÅŸarısız" #: ../src/gtk-ui/sync-ui.c:3224 #, fuzzy msgid "Failed to parse configuration file" msgstr "Geçici dosya açılamadı" #: ../src/gtk-ui/sync-ui.c:3226 #, fuzzy msgid "Failed to read configuration file" msgstr "Geçici dosya okumak için açılamadı" #: ../src/gtk-ui/sync-ui.c:3228 #, fuzzy msgid "No configuration found" msgstr "Hiçbir eÅŸleÅŸme bulunamadı." #: ../src/gtk-ui/sync-ui.c:3230 #, fuzzy msgid "No configuration file found" msgstr "XPM baÅŸlığı bulunamadı" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Server sent bad content" msgstr "" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Connection certificate has expired" msgstr "" #: ../src/gtk-ui/sync-ui.c:3236 #, fuzzy msgid "Connection certificate is invalid" msgstr "Temel PNM resim türü geçersiz" #: ../src/gtk-ui/sync-ui.c:3244 msgid "We were unable to connect to the server. The problem could be temporary or there could be something wrong with the settings." msgstr "" #: ../src/gtk-ui/sync-ui.c:3251 #, fuzzy msgid "The server URL is bad" msgstr "Adres bir _yansı listesi" #: ../src/gtk-ui/sync-ui.c:3256 #, fuzzy msgid "The server was not found" msgstr "Paket bulunamadı" #: ../src/gtk-ui/sync-ui.c:3258 #, c-format msgid "Error %d" msgstr "Hata: %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3396 msgid "Password is required for sync" msgstr "" #: ../src/gtk-ui/sync-ui.c:3400 #, fuzzy msgid "Sync with password" msgstr "Åžifreyi girin" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3410 #, c-format msgid "Please enter password for syncing with %s:" msgstr "" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "ya da" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "AÄŸ senkronizasyonu" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "Yeni cihaz ekle" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "Yeni servis ekle" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost." msgstr "" #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "Takvim" #. Button in main view, right side. Keep to below 20 chars per line, feel free to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "Kapat" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" #. button in main view, right side. Keep length to 20 characters or so, use two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "Ayarlar" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "" #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "" #: ../src/gtk-ui/sync.desktop.in.h:2 #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Up to date" msgstr "Güncel" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "Sync (GTK)" msgstr "Seknronize et (GTK)" #: ../src/gtk-ui/sync-config-widget.c:78 msgid "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in sync." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:81 msgid "Google Sync can back up and synchronize your contacts with your Gmail contacts." msgstr "" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:87 msgid "Back up your contacts and calendar. Sync with a single click, anytime, anywhere (DEMO)." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:90 msgid "Mobical Backup and Restore service allows you to securely back up your personal mobile data for free." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:93 msgid "ZYB is a simple way for people to store and share mobile information online." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:96 msgid "Memotoo lets you access your personal data from any computer connected to the Internet." msgstr "" #: ../src/gtk-ui/sync-config-widget.c:192 #, fuzzy msgid "Sorry, failed to save the configuration" msgstr "TIFF resmi kaydedilemedi" #: ../src/gtk-ui/sync-config-widget.c:381 msgid "Service must have a name and server URL" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:422 #, c-format msgid "Do you want to reset the settings for %s? This will not remove any synced information on either end." msgstr "" #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:426 #, fuzzy msgid "Yes, reset" msgstr "Evet, sil" #: ../src/gtk-ui/sync-config-widget.c:427 #: ../src/gtk-ui/sync-config-widget.c:438 #, fuzzy msgid "No, keep settings" msgstr "Yeni baÄŸlantı ayarları" #: ../src/gtk-ui/sync-config-widget.c:432 #, c-format msgid "Do you want to delete the settings for %s? This will not remove any synced information on either end but it will remove these settings." msgstr "" #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:437 msgid "Yes, delete" msgstr "Evet, sil" #: ../src/gtk-ui/sync-config-widget.c:467 #, fuzzy msgid "Reset settings" msgstr "AÄŸ ayarları" #: ../src/gtk-ui/sync-config-widget.c:470 #, fuzzy msgid "Delete settings" msgstr "AÄŸ ayarları" #: ../src/gtk-ui/sync-config-widget.c:480 #, fuzzy msgid "Save and use" msgstr "Önceki yazıtipini kullan" #: ../src/gtk-ui/sync-config-widget.c:483 msgid "" "Save and replace\n" "current service" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:493 #, fuzzy msgid "Stop using device" msgstr "FCP cihazı ekle" #: ../src/gtk-ui/sync-config-widget.c:496 #, fuzzy msgid "Stop using service" msgstr "3G servisi seçin" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:679 #, fuzzy, c-format msgid "%s URI" msgstr "Kaynak URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:854 #, fuzzy, c-format msgid "Send changes to %s" msgstr "%s çalıştırılamadı: %s" #: ../src/gtk-ui/sync-config-widget.c:859 #, fuzzy, c-format msgid "Receive changes from %s" msgstr "Sık Kullanılanlardan Çıkart" #: ../src/gtk-ui/sync-config-widget.c:875 msgid "Sync" msgstr "Senkronizasyon" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:891 #, fuzzy msgid "Server address" msgstr "IPv6 adresi:" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:967 #, c-format msgid "This device looks like it might be a '%s'. If this is not correct, please take a look at the list of supported devices and pick yours if it is listed" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:973 msgid "We don't know what this device is exactly. Please take a look at the list of supported devices and pick yours if it is listed" msgstr "" #: ../src/gtk-ui/sync-config-widget.c:1126 #, fuzzy, c-format msgid "%s - Bluetooth device" msgstr "RAID Cihazı" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1132 #, fuzzy, c-format msgid "%s - manually setup" msgstr "Adres kurulumu" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1807 #, fuzzy msgid "Launch website" msgstr "PackageKit Sitesi" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1816 #, fuzzy msgid "Set up now" msgstr "Åžimdi Bul" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1912 msgid "Username" msgstr "Kullanıcı Adı" #: ../src/gtk-ui/sync-config-widget.c:1927 msgid "Password" msgstr "Åžifre" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:1950 msgid "Current configuration is more complex than what can be shown here. Changes to sync mode or synced data types will overwrite that configuration." msgstr "" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1969 #, fuzzy msgid "Hide server settings" msgstr "Yeni baÄŸlantı ayarları" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1989 #, fuzzy msgid "Show server settings" msgstr "Yeni baÄŸlantı ayarları" #: ../src/gnome-bluetooth/syncevolution.c:110 #, fuzzy msgid "Sync in the Sync application" msgstr "Oturumu Aç" #: ../src/syncevo-dbus-server.cpp:5667 #, fuzzy, c-format msgid "%s is syncing" msgstr "Üzgünüz, %s çalışmıyor" #: ../src/syncevo-dbus-server.cpp:5668 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "" #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:5682 #, fuzzy, c-format msgid "%s sync complete" msgstr "Tamam, ancak tek deÄŸil" #: ../src/syncevo-dbus-server.cpp:5683 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "" #. if sync is successfully started and has errors, or not started successful with a fatal problem #: ../src/syncevo-dbus-server.cpp:5688 msgid "Sync problem." msgstr "Senkronizasyon problemi." #: ../src/syncevo-dbus-server.cpp:5689 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "" #: ../src/syncevo-dbus-server.cpp:5762 #, fuzzy msgid "View" msgstr "Dokümanları görüntüle" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:5766 #, fuzzy msgid "Dismiss" msgstr "Bırak" syncevolution-1.5/po/zh_CN.po0000644000373300001540000007007612326412403017504 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # , 2011. # , 2011. # Zhu Yanhai , 2009. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-06 00:09+0000\n" "Last-Translator: GLS_Translator_CHS2 \n" "Language-Team: Chinese (China) (http://www.transifex.net/projects/p/meego/team/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "è”系人" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "约会" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "任务" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "便æ¡" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "约会和任务" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "æ­£åœ¨å¼€å§‹åŒæ­¥" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "您想è¦å’Œ %s è¿›è¡Œæ…¢é€ŸåŒæ­¥å—?" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "å¥½çš„ï¼Œåšæ…¢é€ŸåŒæ­¥å§" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "ä¸ï¼Œå–æ¶ˆåŒæ­¥" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "您想删除所有本地数æ®å¹¶ç”¨æ¥è‡ª%sçš„æ•°æ®æ›¿ä»£å®ƒä»¬å—?通常我们ä¸å»ºè®®æ‚¨è¿™æ ·åš." #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "æ˜¯çš„ï¼Œåˆ é™¤ç„¶åŽæ›¿ä»£" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "我ä¸è¦åšæ…¢é€ŸåŒæ­¥" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "您想删除 %s 中的所有数æ®å¹¶ç”¨æ‚¨çš„æœ¬åœ°æ•°æ®æ¥æ›¿ä»£å®ƒä»¬å—?通常我们ä¸å»ºè®®æ‚¨è¿™æ ·åš" #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "å°è¯•å–æ¶ˆåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "没有选择æœåŠ¡æˆ–è®¾å¤‡" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - åˆšåˆšåŒæ­¥å®Œ" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - 一分钟å‰å·²åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - %ld 分钟å‰å·²åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - 䏀尿—¶å‰å·²åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - %ld å°æ—¶å‰å·²åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - 一天之å‰å·²åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - %ld 天之å‰å·²åŒæ­¥" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "çŽ°åœ¨åŒæ­¥" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "æ…¢é€ŸåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "其它选项" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "é€‰æ‹©åŒæ­¥æœåŠ¡" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "编辑æœåŠ¡è®¾ç½®" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "æ‚¨å°šæœªé€‰æ‹©åŒæ­¥æœåŠ¡æˆ–è®¾å¤‡ã€‚åŒæ­¥æœåŠ¡å…许您在您的上网本和网络æœåŠ¡ä¹‹é—´åŒæ­¥æ•°æ®ã€‚您也å¯ä»¥ç›´æŽ¥ä¸Žä¸€äº›è®¾å¤‡åŒæ­¥ã€‚" #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "冿¬¡åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "æ¢å¤" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "æ­£åœ¨åŒæ­¥" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "å–æ¶ˆåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "è¿”å›žåŒæ­¥" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "è‡ªåŠ¨åŒæ­¥" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "å—å½±å“的资料:%s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "å—å½±å“的资料:没有" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "您想è¦ä»Ž %s æ¢å¤å¤‡ä»½å—?您从那个时间" #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "是的,æ¢å¤å¤‡ä»½" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "在和 %s åŒæ­¥å‰å·²å¤‡ä»½" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "æ¢å¤" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "与 %s çš„æ­£å¸¸åŒæ­¥çŽ°åœ¨æ— æ³•è¿›è¡Œã€‚æ‚¨å¯ä»¥åšæ…¢é€ŸåŒå‘åŒæ­¥æˆ–从头开始。您也å¯ä»¥æ¢å¤ä¸€ä¸ªå¤‡ä»½ï¼Œä½†æ˜¯æ­£å¸¸åŒæ­¥ä¹‹å‰è¿˜æ˜¯ä¼šéœ€è¦æ…¢é€ŸåŒæ­¥æˆ–从头开始。" #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "如果å‘生严é‡é”™è¯¯ï¼Œæ‚¨å¯ä»¥å°è¯•æ…¢é€ŸåŒæ­¥ï¼Œä»Žå¤´å¼€å§‹æˆ–者从备份æ¢å¤ã€‚" #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "删除所有本地\n" "æ•°æ®å¹¶ç”¨ %s \n" "æ•°æ®æ›¿ä»£å®ƒä»¬" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "删除所有 %s 上的\n" "æ•°æ®å¹¶ç”¨æœ¬åœ°æ•°æ®\n" "替代它们" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "未能从 SyncEvolution 得到支æŒçš„æœåŠ¡åˆ—è¡¨" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "ä¸ŽåŒæ­¥è¿›ç¨‹é€šä¿¡æ—¶å‘生问题。请ç¨åŽå†è¯•。" #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "æ¢å¤å¤±è´¥" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "åŒæ­¥å¤±è´¥" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "æ¢å¤å®Œæˆ" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "åŒæ­¥å®Œæˆ" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "正在准备 '%s'" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "正在接收 '%s'" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "正在å‘é€ '%s'" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "有 %ld 次远程拒ç»ã€‚" #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "有 %ld 次本地拒ç»ã€‚" #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "一共出现了 %ld 个本地拒ç»å’Œ %ld 个远端拒ç»ã€‚" #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "最近一次:没有更改" #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "最近一次:å‘é€äº† %ld 个更改。" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "最近一次:应用了 %ld 个更改。" #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "最近一次: 应用了 %ld 个更改并å‘é€äº† %ld 个更改。" #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "ä¸Šä¸€ä¸ªåŒæ­¥å‘生问题:\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "您刚刚æ¢å¤äº†ä¸€ä¸ªå¤‡ä»½ã€‚这些修改还没有和 %s åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "正在等待当å‰çš„æ“ä½œå®Œæˆã€‚。。" #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "çŽ°åœ¨æ— æ³•è¿›è¡Œæ­£å¸¸åŒæ­¥ã€‚æœåŠ¡å™¨å»ºè®®æ‚¨åšæ…¢é€ŸåŒæ­¥ï¼Œä½†æ˜¯å¦‚æžœåŒæ­¥åŒæ–¹å·²ç»éƒ½æœ‰æ•°æ®ï¼Œæ‚¨å¯èƒ½å¹¶ä¸æƒ³ä½¿ç”¨æ…¢é€ŸåŒæ­¥ã€‚" #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "åŒæ­¥æœåŠ¡å¼‚å¸¸é€€å‡ºã€‚" #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "密ç è¯·æ±‚没有回å¤ã€‚您å¯ä»¥åœ¨è®¾ç½®ä¸­ä¿å­˜å¯†ç ï¼Œä»¥é˜²æ­¢å¯†ç è¯·æ±‚。" #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "处ç†åŒæ­¥è¯·æ±‚æ—¶å‘生问题。请å†è¯•一次。" #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "登录失败。会ä¸ä¼šæ˜¯æ‚¨çš„ç”¨æˆ·åæˆ–å¯†ç æœ‰é—®é¢˜ï¼Ÿ" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "è¢«ç¦æ­¢" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "æ— æ³•æ‰¾åˆ°æ•°æ®æ¥æºã€‚会ä¸ä¼šæ˜¯è®¾ç½®æœ‰é—®é¢˜ï¼Ÿ" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "远程数æ®åº“错误" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "æœ¬åœ°èµ„æ–™åº“æœ‰é—®é¢˜ã€‚è¯·é‡æ–°åŒæ­¥æˆ–è€…é‡æ–°å¯åЍå¯èƒ½ä¼šæœ‰å¸®åŠ©ã€‚" #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "ç£ç›˜ä¸Šæ²¡æœ‰å‰©ä½™ç©ºé—´" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "å¤„ç† SyncML 失败" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "æœåŠ¡å™¨è®¤è¯å¤±è´¥" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "è§£æžé…置文件出错" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "读é…置文件时出错" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "未找到é…ç½®" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "未找到é…置文件" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "æœåС噍å‘é€çš„内容错误" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "该连接的认è¯å·²è¿‡æœŸ" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "连接认è¯ä¸åˆæ³•" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "我们无法连接到æœåŠ¡å™¨ã€‚é—®é¢˜å¯èƒ½æ˜¯æš‚时的,也å¯èƒ½æ˜¯è®¾ç½®æœ‰é—®é¢˜ã€‚" #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "æœåŠ¡å™¨çš„ URL有错误" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "没有找到æœåС噍" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "错误 %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "åŒæ­¥éœ€è¦å¯†ç " #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "用密ç åŒæ­¥" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "请输入与 %s åŒæ­¥çš„密ç ï¼š" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "动作" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "或者" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "ç›´æŽ¥åŒæ­¥" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "ç½‘ç»œåŒæ­¥" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "从备份æ¢å¤" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "æ…¢é€ŸåŒæ­¥" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "从头开始" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "æ…¢é€ŸåŒæ­¥ä¼šæ¯”è¾ƒåŒæ­¥åŒæ–¹çš„æ•°æ®ï¼Œå¹¶å°è¯•åˆå¹¶å®ƒä»¬ã€‚\n" "在æŸäº›æƒ…况下å¯èƒ½ä¼šå¤±è´¥ï¼Œå¯¼è‡´æ•°æ®è¢«é‡å¤æˆ–者丢失数æ®ã€‚" #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "添加新设备" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "添加新æœåŠ¡" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "åœ¨æˆ‘ä»¬æ¯æ¬¡åŒæ­¥å‰éƒ½ä¼šè¿›è¡Œå¤‡ä»½ã€‚è¯·é€‰æ‹©è¦æ¢å¤çš„备份。所有您从备份时间åŽåšçš„æ›´æ”¹éƒ½å°†ä¸¢å¤±ã€‚" #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "日历" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "æ”¹å˜æˆ–编辑\n" "åŒæ­¥æœåŠ¡" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "关闭" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "" "删除所有 Zyb ä¸Šçš„æ•°æ® \n" "å¹¶ç”¨æœ¬åœ°æ•°æ® \n" "替代它们" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "" "删除所有本地数æ®\n" "并用 Zyb 上的数æ®\n" "替代它们" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "ä¿®å¤åŒæ­¥\n" "紧急状况" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "å¦‚æžœæ‚¨æ²¡æœ‰åœ¨ä¸Šè¾¹çœ‹è§æ‚¨çš„æœåŠ¡,ä½†çŸ¥é“æ‚¨çš„æœåŠ¡æä¾›è€…使用了SyncML接å£\n" "那么您å¯ä»¥æ‰‹åŠ¨è®¾ç½®æœåŠ¡" #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "设置" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "åŒæ­¥ç´§æ€¥çж况" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "è¦è¿›è¡ŒåŒæ­¥æ‚¨éœ€è¦ä¸€ä¸ªç½‘ç»œè¿žæŽ¥å’Œä¸€ä¸ªåŒæ­¥æœåŠ¡çš„è´¦å·.\n" "æˆ‘ä»¬ç›®å‰æ”¯æŒä»¥ä¸‹æœåŠ¡" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "使用è“牙将您的数æ®ä»Žä¸€ä¸ªè®¾å¤‡åŒæ­¥åˆ°å¦ä¸€ä¸ªè®¾å¤‡ã€‚" #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "åŒæ­¥å‰ä½ éœ€è¦æ·»åŠ è“牙设备。" #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "åŒæ­¥æ•°æ®" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "åŒæ­¥ PIM(个人信æ¯ç®¡ç†å™¨ï¼‰æ•°æ®" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "ScheduleWorld 使您的è”系人ã€äº‹ä»¶ã€ä»»åŠ¡å’Œä¾¿æ¡ä¿æŒåŒæ­¥ã€‚" #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "Google Sync å¯ä»¥æŠŠæ‚¨çš„è”系人和 Gmail è”ç³»äººå¤‡ä»½å’ŒåŒæ­¥ã€‚" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "备份您的è”系人和日历。åªéœ€ä¸€é”®å³å¯åŒæ­¥ï¼Œéšæ—¶ã€éšåœ°ï¼ˆæ¼”示)。" #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "Mobical 备份和æ¢å¤æœåŠ¡å¯ä»¥è®©æ‚¨å…费而且安全地备份您的个人行动数æ®ã€‚" #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "ZYB æ˜¯è®©æ‚¨ç½‘ä¸Šå­˜å‚¨å’Œåˆ†äº«è¡ŒåŠ¨å’¨è¯¢çš„ç®€å•æ–¹æ³•。" #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "Memotoo 让您从连接到互è”ç½‘çš„ä»»ä½•ç”µè„‘ä¸­å­˜å–æ‚¨çš„个人数æ®ã€‚" #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "对ä¸èµ·ï¼Œä¿å­˜é…置失败" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "需è¦ç»™æœåŠ¡æŒ‡å®šä¸€ä¸ªåå­—å’ŒæœåŠ¡å™¨åœ°å€" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "æ­¤æœåŠ¡è¦æ±‚用户å" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "您想è¦é‡ç½® %s 的设置å—?这ä¸ä¼šç§»é™¤ä»»ä½•åŒæ­¥åŒæ–¹å·²ç»åŒæ­¥çš„æ•°æ®ã€‚" #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "是,é‡ç½®ã€‚" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "ä¸ï¼Œä¿ç•™è®¾ç½®" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "您想è¦åˆ é™¤ %s 的设置å—?这ä¸ä¼šç§»é™¤ä»»ä½•åŒæ–¹å·²åŒæ­¥çš„资料,但是会移除这些设置。" #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "是的,删除" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "é‡ç½®è®¾ç½®" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "删除设置" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "ä¿å­˜å¹¶ä½¿ç”¨" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "ä¿å­˜å¹¶æ›¿æ¢\n" "现有æœåŠ¡" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "åœæ­¢ä½¿ç”¨æ­¤è®¾å¤‡" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "åœæ­¢ä½¿ç”¨æ­¤æœåŠ¡" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "å‘逿›´æ”¹è‡³%s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "接收改动自%s " #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "åŒæ­¥" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "æœåŠ¡å™¨åœ°å€" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "设备看起æ¥åƒâ€œ%sâ€ã€‚å¦‚æžœä¸æ˜¯ï¼Œè¯·çœ‹ä¸€ä¸‹åˆ—表中支æŒçš„设备,并从中选择您的设备。" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "我们ä¸çŸ¥é“这到底是什么设备。请看一下列表中支æŒçš„设备,并从中选择您的设备。" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - è“牙设备" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - 手动设置" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "打开站点" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "现在设置" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "使用这些设置" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "用户å" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "密ç " #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "ç›®å‰çš„é…ç½®æ¯”å½“å‰æ˜¾ç¤ºçš„æ›´å¤æ‚ã€‚åŒæ­¥æ¨¡å¼æˆ–å·²åŒæ­¥æ•°æ®ç±»åž‹çš„æ›´æ”¹å°†ä¼šè¦†ç›–æ­¤é…置。" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "éšè—æœåŠ¡å™¨è®¾ç½®" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "显示æœåŠ¡å™¨è®¾ç½®" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "åœ¨åŒæ­¥åº”ç”¨ä¸­åŒæ­¥" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s æ­£åœ¨è¿›è¡ŒåŒæ­¥" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "我们已ç»å°†æ‚¨çš„电脑与 %s å¼€å§‹åŒæ­¥ã€‚" #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s åŒæ­¥å®Œæˆ" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "我们已ç»å®Œæˆæ‚¨çš„电脑与 %s çš„åŒæ­¥ã€‚" #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "åŒæ­¥å‡ºçŽ°é—®é¢˜ã€‚" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "æŠ±æ­‰ï¼Œæœ‰ä¸€ä¸ªåŒæ­¥éœ€è¦æ‚¨çœ‹ä¸€ä¸‹ã€‚" #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "查看" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "解除" syncevolution-1.5/po/zh_TW.po0000644000373300001540000007057012326412403017535 0ustar00nightlynightly00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Cheng-Chia Tseng , 2010. # Chung-Ying Huang , 2011. # , 2011. # Wen-Hsin Moh , 2011. msgid "" msgstr "" "Project-Id-Version: syncevolution\n" "Report-Msgid-Bugs-To: https://bugs.meego.com/\n" "POT-Creation-Date: 2011-12-05 10:21-0800\n" "PO-Revision-Date: 2011-12-09 19:35+0000\n" "Last-Translator: GLS_CHT \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.net/projects/p/meego/team/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0\n" #. TRANSLATORS: this is the application name that may be used by e.g. #. the windowmanager #: ../src/gtk-ui/main.c:40 ../src/gtk-ui/ui.glade.h:38 #: ../src/gtk-ui/sync.desktop.in.h:1 #: ../src/gnome-bluetooth/syncevolution.c:112 msgid "Sync" msgstr "åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:266 msgid "Contacts" msgstr "è¯çµ¡äºº" #: ../src/gtk-ui/sync-ui.c:268 msgid "Appointments" msgstr "約會" #: ../src/gtk-ui/sync-ui.c:270 ../src/gtk-ui/ui.glade.h:40 msgid "Tasks" msgstr "工作" #: ../src/gtk-ui/sync-ui.c:272 msgid "Notes" msgstr "備註" #. TRANSLATORS: This is a "combination source" for syncing with devices #. * that combine appointments and tasks. the name should match the ones #. * used for calendar and todo above #: ../src/gtk-ui/sync-ui.c:277 msgid "Appointments & Tasks" msgstr "約會與工作" #: ../src/gtk-ui/sync-ui.c:349 msgid "Starting sync" msgstr "æ­£åœ¨é–‹å§‹åŒæ­¥" #. TRANSLATORS: slow sync confirmation dialog message. Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:387 #, c-format msgid "Do you want to slow sync with %s?" msgstr "您想è¦èˆ‡ %s é€²è¡Œæ…¢é€ŸåŒæ­¥å—Žï¼Ÿ" #: ../src/gtk-ui/sync-ui.c:391 msgid "Yes, do slow sync" msgstr "æ˜¯ï¼ŒåŸ·è¡Œæ…¢é€ŸåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:391 msgid "No, cancel sync" msgstr "ä¸ï¼Œå–æ¶ˆåŒæ­¥" #. TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:424 #, c-format msgid "" "Do you want to delete all local data and replace it with data from %s? This " "is not usually advised." msgstr "您è¦åˆªé™¤æ‰€æœ‰æœ¬æ©Ÿè³‡æ–™ï¼Œä¸¦ä½¿ç”¨ %s 上的資料å–代它嗎?我們通常ä¸å»ºè­°é€™éº¼åšã€‚" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 msgid "Yes, delete and replace" msgstr "是,刪除並å–代" #: ../src/gtk-ui/sync-ui.c:429 ../src/gtk-ui/sync-ui.c:462 #: ../src/gtk-ui/sync-ui.c:1610 msgid "No" msgstr "å¦" #. TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder #. * is service/device name #: ../src/gtk-ui/sync-ui.c:457 #, c-format msgid "" "Do you want to delete all data in %s and replace it with your local data? " "This is not usually advised." msgstr "您è¦åˆªé™¤æ‰€æœ‰åœ¨ %s 上的資料,並且使用本機資料å–代它嗎?我們通常ä¸å»ºè­°é€™éº¼åšã€‚" #: ../src/gtk-ui/sync-ui.c:491 msgid "Trying to cancel sync" msgstr "æ­£åœ¨å˜—è©¦å–æ¶ˆåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:533 msgid "No service or device selected" msgstr "未é¸å–æœå‹™æˆ–è£ç½®" #. TRANSLATORS: This is the title on main view. Placeholder is #. * the service name. Example: "Google - synced just now" #: ../src/gtk-ui/sync-ui.c:541 #, c-format msgid "%s - synced just now" msgstr "%s - 剛æ‰åŒæ­¥éŽ" #: ../src/gtk-ui/sync-ui.c:545 #, c-format msgid "%s - synced a minute ago" msgstr "%s - 一分é˜å‰åŒæ­¥éŽ" #: ../src/gtk-ui/sync-ui.c:549 #, c-format msgid "%s - synced %ld minutes ago" msgstr "%s - %ld 分é˜å‰åŒæ­¥éŽ" #: ../src/gtk-ui/sync-ui.c:554 #, c-format msgid "%s - synced an hour ago" msgstr "%s - 䏀尿™‚å‰åŒæ­¥éŽ" #: ../src/gtk-ui/sync-ui.c:558 #, c-format msgid "%s - synced %ld hours ago" msgstr "%s - %ld å°æ™‚å‰åŒæ­¥éŽ" #: ../src/gtk-ui/sync-ui.c:563 #, c-format msgid "%s - synced a day ago" msgstr "%s - 一天å‰åŒæ­¥éŽ" #: ../src/gtk-ui/sync-ui.c:567 #, c-format msgid "%s - synced %ld days ago" msgstr "%s - %ld 天å‰åŒæ­¥éŽ" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "You've just restored a backup. The changes have not been " #. * "synced with %s yet" #: ../src/gtk-ui/sync-ui.c:616 ../src/gtk-ui/sync-ui.c:701 msgid "Sync now" msgstr "ç¾åœ¨åŒæ­¥" #. TRANSLATORS: Action button in info bar in main view. Shown with e.g. #. * "A normal sync is not possible at this time..." message. #. * "Other options" will open Emergency view #: ../src/gtk-ui/sync-ui.c:622 ../src/gtk-ui/ui.glade.h:37 msgid "Slow sync" msgstr "æ…¢é€ŸåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:623 msgid "Other options..." msgstr "å…¶ä»–é¸é …..." #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * when no service is selected. Will open configuration view #: ../src/gtk-ui/sync-ui.c:628 msgid "Select sync service" msgstr "é¸å–åŒæ­¥æœå‹™" #. TRANSLATORS: Action button in info bar in main view. Shown e.g. #. * login to service fails. Will open configuration view for this service #: ../src/gtk-ui/sync-ui.c:633 msgid "Edit service settings" msgstr "編輯æœå‹™è¨­å®š" #: ../src/gtk-ui/sync-ui.c:709 msgid "" "You haven't selected a sync service or device yet. Sync services let you " "synchronize your data between your netbook and a web service. You can also " "sync directly with some devices." msgstr "您尚未é¸å–åŒæ­¥æœå‹™æˆ–è£ç½®ã€‚åŒæ­¥æœå‹™è®“您在您的網路筆電與網路æœå‹™é–“åŒæ­¥æ‚¨çš„資料。您也å¯ä»¥ç›´æŽ¥å’Œä¸€äº›è£ç½®é€²è¡ŒåŒæ­¥ã€‚" #: ../src/gtk-ui/sync-ui.c:729 msgid "Sync again" msgstr "冿¬¡åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:748 msgid "Restoring" msgstr "正在還原" #: ../src/gtk-ui/sync-ui.c:750 msgid "Syncing" msgstr "æ­£åœ¨åŒæ­¥ä¸­" #. TRANSLATORS: This is for the button in main view, right side. #. Keep line length below ~20 characters, use two lines if needed #: ../src/gtk-ui/sync-ui.c:762 ../src/gtk-ui/sync-ui.c:3407 msgid "Cancel sync" msgstr "å–æ¶ˆåŒæ­¥" #: ../src/gtk-ui/sync-ui.c:927 msgid "Back to sync" msgstr "è¿”å›žåŒæ­¥" #. TRANSLATORS: label for checkbutton/toggle in main view. #. * Please stick to similar length strings or break the line with #. * "\n" if absolutely needed #: ../src/gtk-ui/sync-ui.c:1229 msgid "Automatic sync" msgstr "è‡ªå‹•åŒæ­¥" #. This is the expander label in emergency view. It summarizes the #. * currently selected data sources. First placeholder is service/device #. * name, second a comma separeted list of sources. #. * E.g. "Affected data: Google Contacts, Appointments" #: ../src/gtk-ui/sync-ui.c:1524 #, c-format msgid "Affected data: %s %s" msgstr "å—影響的資料:%s %s" #: ../src/gtk-ui/sync-ui.c:1529 #, c-format msgid "Affected data: none" msgstr "å—影響的資料:無" #. TRANSLATORS: confirmation for restoring a backup. placeholder is the #. * backup time string defined below #: ../src/gtk-ui/sync-ui.c:1607 #, c-format msgid "" "Do you want to restore the backup from %s? All changes you have made since " "then will be lost." msgstr "您想è¦é‚„原來自 %s 的備份嗎?所有您從那時起的變更都會喪失。" #: ../src/gtk-ui/sync-ui.c:1610 msgid "Yes, restore" msgstr "是,還原" #. TRANSLATORS: date/time for strftime(), used in emergency view backup #. * label. Any time format that shows date and time is good. #: ../src/gtk-ui/sync-ui.c:1642 #, c-format msgid "%x %X" msgstr "%x %X" #. TRANSLATORS: label for a backup in emergency view. Placeholder is #. * service or device name #: ../src/gtk-ui/sync-ui.c:1661 #, c-format msgid "Backed up before syncing with %s" msgstr "在與 %s åŒæ­¥å‰å·²å‚™ä»½" #: ../src/gtk-ui/sync-ui.c:1678 msgid "Restore" msgstr "還原" #. TRANSLATORS: this is an explanation in Emergency view. #. * Placeholder is a service/device name #: ../src/gtk-ui/sync-ui.c:1785 #, c-format msgid "" "A normal sync with %s is not possible at this time. You can do a slow two-" "way sync or start from scratch. You can also restore a backup, but a slow " "sync or starting from scratch will still be required before normal sync is " "possible." msgstr "" "與 %s çš„ä¸€èˆ¬åŒæ­¥ç›®å‰ç„¡æ³•使用。您å¯ä»¥åŸ·è¡Œæ…¢é€Ÿé›™æ–¹åŒæ­¥ï¼Œæˆ–是從零開始。您也å¯ä»¥å¾žå‚™ä»½ä¸­é‚„åŽŸï¼Œä½†æ˜¯åœ¨ä¸€èˆ¬åŒæ­¥å¯ä»¥ä½¿ç”¨ä¹‹å‰ï¼Œæœƒéœ€è¦æ…¢é€ŸåŒæ­¥æˆ–從零開始。" #: ../src/gtk-ui/sync-ui.c:1795 #, c-format msgid "" "If something has gone horribly wrong, you can try a slow sync, start from " "scratch or restore from backup." msgstr "如果有æ±è¥¿ç™¼ç”Ÿå¯æ€•錯誤,您å¯ä»¥å˜—è©¦æ…¢é€ŸåŒæ­¥ã€å¾žé›¶é–‹å§‹æˆ–是從備份還原。" #. TRANSLATORS: These are a buttons in Emergency view. Placeholder is a #. * service/device name. Please don't use too long lines, but feel free to #. * use several lines. #: ../src/gtk-ui/sync-ui.c:1804 #, c-format msgid "" "Delete all your local\n" "data and replace with\n" "data from %s" msgstr "" "刪除所有本機\n" "資料並使用來自\n" "%s 的資料å–代" #: ../src/gtk-ui/sync-ui.c:1810 #, c-format msgid "" "Delete all data on\n" "%s and replace\n" "with your local data" msgstr "" "刪除所有 %s 上的\n" "資料並使用您的本機\n" "資料å–代" #: ../src/gtk-ui/sync-ui.c:2275 msgid "Failed to get list of supported services from SyncEvolution" msgstr "從 SyncEvolution å–得支æ´çš„æœå‹™æ¸…å–®æ™‚å¤±æ•—" #: ../src/gtk-ui/sync-ui.c:2329 msgid "" "There was a problem communicating with the sync process. Please try again " "later." msgstr "èˆ‡åŒæ­¥ç¨‹åºæºé€šæˆæœ‰éŒ¯èª¤ç™¼ç”Ÿã€‚è«‹ç¨å€™é‡è©¦ã€‚" #: ../src/gtk-ui/sync-ui.c:2388 msgid "Restore failed" msgstr "還原失敗" #: ../src/gtk-ui/sync-ui.c:2391 ../src/gtk-ui/sync-ui.c:3276 msgid "Sync failed" msgstr "åŒæ­¥å¤±æ•—" #: ../src/gtk-ui/sync-ui.c:2397 msgid "Restore complete" msgstr "還原完æˆ" #: ../src/gtk-ui/sync-ui.c:2400 msgid "Sync complete" msgstr "åŒæ­¥å®Œæˆ" #: ../src/gtk-ui/sync-ui.c:2492 #, c-format msgid "Preparing '%s'" msgstr "正在準備「%sã€" #: ../src/gtk-ui/sync-ui.c:2495 #, c-format msgid "Receiving '%s'" msgstr "正在接收「%sã€" #: ../src/gtk-ui/sync-ui.c:2498 #, c-format msgid "Sending '%s'" msgstr "正在傳é€ã€Œ%sã€" #: ../src/gtk-ui/sync-ui.c:2619 #, c-format msgid "There was one remote rejection." msgid_plural "There were %ld remote rejections." msgstr[0] "有 %ld 個é ç«¯æ‹’絕。" #: ../src/gtk-ui/sync-ui.c:2624 #, c-format msgid "There was one local rejection." msgid_plural "There were %ld local rejections." msgstr[0] "有 %ld 個本機拒絕。" #: ../src/gtk-ui/sync-ui.c:2629 #, c-format msgid "There were %ld local rejections and %ld remote rejections." msgstr "æœ‰éŽ %ld 次本機拒絕和 %ld 次é ç«¯æ‹’絕。" #: ../src/gtk-ui/sync-ui.c:2634 #, c-format msgid "Last time: No changes." msgstr "上次:沒有變更。" #: ../src/gtk-ui/sync-ui.c:2636 #, c-format msgid "Last time: Sent one change." msgid_plural "Last time: Sent %ld changes." msgstr[0] "ä¸Šæ¬¡ï¼šå·²å‚³é€ %ld 個變更。" #. This is about changes made to the local data. Not all of these #. changes were requested by the remote server, so "applied" #. is a better word than "received" (bug #5185). #: ../src/gtk-ui/sync-ui.c:2644 #, c-format msgid "Last time: Applied one change." msgid_plural "Last time: Applied %ld changes." msgstr[0] "上次:已套用 %ld 個變更。" #: ../src/gtk-ui/sync-ui.c:2649 #, c-format msgid "Last time: Applied %ld changes and sent %ld changes." msgstr "上次:套用了 %ld 個變更並傳é€äº† %ld 個變更。" #. TRANSLATORS: the placeholder is a error message (hopefully) #. * explaining the problem #: ../src/gtk-ui/sync-ui.c:2856 #, c-format msgid "" "There was a problem with last sync:\n" "%s" msgstr "" "ä¸Šæ¬¡åŒæ­¥æœ‰éŒ¯èª¤ç™¼ç”Ÿï¼š\n" "%s" #: ../src/gtk-ui/sync-ui.c:2866 #, c-format msgid "" "You've just restored a backup. The changes have not been synced with %s yet" msgstr "您剛æ‰å·²ç¶“還原一份備份。這些變更尚未與 %s åŒæ­¥" #: ../src/gtk-ui/sync-ui.c:3154 msgid "Waiting for current operation to finish..." msgstr "正在等候目å‰çš„æ“ä½œå®Œæˆ..." #. TRANSLATORS: next strings are error messages. #: ../src/gtk-ui/sync-ui.c:3188 msgid "" "A normal sync is not possible at this time. The server suggests a slow sync," " but this might not always be what you want if both ends already have data." msgstr "ä¸€èˆ¬åŒæ­¥ç›®å‰ç„¡æ³•使用。這å°ä¼ºæœå™¨å»ºè­°ä½¿ç”¨æ…¢é€ŸåŒæ­¥ï¼Œä½†é€™å¯èƒ½ä¸ç¸½æ˜¯æ‚¨æƒ³è¦çš„,因為雙方å¯èƒ½éƒ½å·²ç¶“有資料。" #: ../src/gtk-ui/sync-ui.c:3192 msgid "The sync process died unexpectedly." msgstr "åŒæ­¥ç¨‹åºåœ¨æ²’æœ‰é æœŸçš„æƒ…æ³ä¸‹çµ‚止了。" #: ../src/gtk-ui/sync-ui.c:3197 msgid "" "Password request was not answered. You can save the password in the settings" " to prevent the request." msgstr "密碼請求沒有回應。您å¯ä»¥åœ¨è¨­å®šå€¼å…§å„²å­˜å¯†ç¢¼ä¾†ç•¥éŽè«‹æ±‚。" #. TODO use the service device name here, this is a remote problem #: ../src/gtk-ui/sync-ui.c:3201 msgid "There was a problem processing sync request. Trying again may help." msgstr "åŒæ­¥è«‹ç™¼ç”Ÿå•題。é‡è©¦ä¸€æ¬¡å¯èƒ½æœƒæœ‰å¹«åŠ©ã€‚" #: ../src/gtk-ui/sync-ui.c:3207 msgid "" "Failed to login. Could there be a problem with your username or password?" msgstr "登入失敗。您的使用者åç¨±æˆ–å¯†ç¢¼æ˜¯å¦æœ‰å•題?" #: ../src/gtk-ui/sync-ui.c:3210 msgid "Forbidden" msgstr "ç¦æ­¢" #. TRANSLATORS: data source means e.g. calendar or addressbook #: ../src/gtk-ui/sync-ui.c:3216 msgid "" "A data source could not be found. Could there be a problem with the " "settings?" msgstr "無法找到資料來æºã€‚è¨­å®šå€¼æ˜¯å¦æœ‰å•題?" #: ../src/gtk-ui/sync-ui.c:3220 msgid "Remote database error" msgstr "é ç«¯è³‡æ–™åº«éŒ¯èª¤" #. This can happen when EDS is borked, restart it may help... #: ../src/gtk-ui/sync-ui.c:3223 msgid "" "There is a problem with the local database. Syncing again or rebooting may " "help." msgstr "本機資料庫有å•é¡Œã€‚å†æ¬¡åŒæ­¥æˆ–æ˜¯é‡æ–°é–‹æ©Ÿå¯èƒ½æœƒæœ‰æ‰€å¹«åŠ©ã€‚" #: ../src/gtk-ui/sync-ui.c:3226 msgid "No space on disk" msgstr "ç£ç¢Ÿæ²’有空間" #: ../src/gtk-ui/sync-ui.c:3228 msgid "Failed to process SyncML" msgstr "進行 SyncML 動作失敗" #: ../src/gtk-ui/sync-ui.c:3230 msgid "Server authorization failed" msgstr "伺æœå™¨æŽˆæ¬Šå¤±æ•—" #: ../src/gtk-ui/sync-ui.c:3232 msgid "Failed to parse configuration file" msgstr "è§£æžè¨­ç½®æª”案動作失敗" #: ../src/gtk-ui/sync-ui.c:3234 msgid "Failed to read configuration file" msgstr "讀å–設置檔案動作失敗" #: ../src/gtk-ui/sync-ui.c:3236 msgid "No configuration found" msgstr "未找到設置" #: ../src/gtk-ui/sync-ui.c:3238 msgid "No configuration file found" msgstr "未找到設置檔案" #: ../src/gtk-ui/sync-ui.c:3240 msgid "Server sent bad content" msgstr "伺æœå™¨å‚³é€å‡ºå£žçš„內容" #: ../src/gtk-ui/sync-ui.c:3242 msgid "Connection certificate has expired" msgstr "é€£ç·šæ†‘è­‰å·±éŽæœŸ" #: ../src/gtk-ui/sync-ui.c:3244 msgid "Connection certificate is invalid" msgstr "連線憑證無效" #: ../src/gtk-ui/sync-ui.c:3252 msgid "" "We were unable to connect to the server. The problem could be temporary or " "there could be something wrong with the settings." msgstr "我們無法連接到伺æœå™¨ã€‚å•題å¯èƒ½æ˜¯æš«æ™‚的,或是伺æœå™¨çš„設定值å¯èƒ½æœ‰å•題。" #: ../src/gtk-ui/sync-ui.c:3259 msgid "The server URL is bad" msgstr "伺æœå™¨çš„ URL ä¸å°" #: ../src/gtk-ui/sync-ui.c:3264 msgid "The server was not found" msgstr "找ä¸åˆ°ä¼ºæœå™¨" #: ../src/gtk-ui/sync-ui.c:3266 #, c-format msgid "Error %d" msgstr "錯誤 %d" #. TRANSLATORS: password request dialog contents: title, cancel button #. * and ok button #: ../src/gtk-ui/sync-ui.c:3404 msgid "Password is required for sync" msgstr "åŒæ­¥éœ€è¦å¯†ç¢¼" #: ../src/gtk-ui/sync-ui.c:3408 msgid "Sync with password" msgstr "ä½¿ç”¨å¯†ç¢¼é€²è¡ŒåŒæ­¥" #. TRANSLATORS: password request dialog message, placeholder is service name #: ../src/gtk-ui/sync-ui.c:3418 #, c-format msgid "Please enter password for syncing with %s:" msgstr "請輸入使用 %s é€²è¡ŒåŒæ­¥çš„密碼:" #. title for the buttons on the right side of main view #: ../src/gtk-ui/ui.glade.h:2 msgid "Actions" msgstr "動作" #. text between the two "start from scratch" buttons in emergency view #: ../src/gtk-ui/ui.glade.h:4 msgid "or" msgstr "或" #: ../src/gtk-ui/ui.glade.h:5 msgid "Direct sync" msgstr "ç›´æŽ¥åŒæ­¥" #: ../src/gtk-ui/ui.glade.h:6 msgid "Network sync" msgstr "ç¶²è·¯åŒæ­¥" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:8 msgid "Restore from backup" msgstr "從備份還原" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:10 msgid "Slow sync" msgstr "æ…¢é€ŸåŒæ­¥" #. a title in emergency view #: ../src/gtk-ui/ui.glade.h:12 msgid "Start from scratch" msgstr "從零開始" #: ../src/gtk-ui/ui.glade.h:13 msgid "" "A slow sync compares items from both sides and tries to merge them. \n" "This may fail in some cases, leading to duplicates or lost information." msgstr "" "æ…¢é€ŸåŒæ­¥æœƒæ¯”較兩邊的項目,並嘗試åˆä½µå®ƒå€‘。\n" "這在æŸäº›æƒ…æ³ä¸‹å¯èƒ½æœƒå¤±æ•—,並導致副本產生或是éºå¤±è³‡è¨Šã€‚" #: ../src/gtk-ui/ui.glade.h:15 msgid "Add new device" msgstr "加入新è£ç½®" #: ../src/gtk-ui/ui.glade.h:16 msgid "Add new service" msgstr "新增æœå‹™" #. explanation of "Restore backup" function #: ../src/gtk-ui/ui.glade.h:18 msgid "" "Backups are made before every time we Sync. Choose a backup to restore. Any " "changes you have made since then will be lost." msgstr "åœ¨æˆ‘å€‘æ¯æ¬¡åŒæ­¥å‰éƒ½æœƒé€²è¡Œå‚™ä»½ã€‚鏿“‡è¦é‚„原的備份。所有您從那時起的變更都會喪失。" #: ../src/gtk-ui/ui.glade.h:19 msgid "Calendar" msgstr "行事曆" #. Button in main view, right side. Keep to below 20 chars per line, feel free #. to use two lines #: ../src/gtk-ui/ui.glade.h:21 msgid "" "Change or edit\n" "sync service" msgstr "" "變更或編輯\n" "åŒæ­¥æœå‹™" #. close button for settings window #: ../src/gtk-ui/ui.glade.h:24 msgid "Close" msgstr "關閉" #: ../src/gtk-ui/ui.glade.h:25 msgid "" "Delete all data on Zyb \n" "and replace with your\n" "local information" msgstr "刪除所有é ç«¯è³‡æ–™ï¼Œä¸¦ä½¿ç”¨æœ¬æ©Ÿè³‡æ–™å–代" #: ../src/gtk-ui/ui.glade.h:28 msgid "" "Delete all your local\n" "information and replace\n" "with data from Zyb" msgstr "刪除所有本機資料,並使用é ç«¯è³‡æ–™å–代" #. button in main view, right side. Keep length to 20 characters or so, use #. two lines if needed #: ../src/gtk-ui/ui.glade.h:32 msgid "" "Fix a sync\n" "emergency" msgstr "" "ä¿®æ­£åŒæ­¥\n" "緊急狀æ³" #: ../src/gtk-ui/ui.glade.h:34 msgid "" "If you don't see your service above but know that your sync provider uses SyncML\n" "you can setup a service manually." msgstr "" "如果您在上方沒有看到您的æœå‹™ï¼Œä½†æ˜¯æ‚¨çŸ¥é“æ‚¨çš„åŒæ­¥åŠŸèƒ½ä¾›æ‡‰å» å•†ä½¿ç”¨ SyncML 的話,\n" "您å¯ä»¥æ‰‹å‹•設定æœå‹™ã€‚" #: ../src/gtk-ui/ui.glade.h:36 msgid "Settings" msgstr "設定" #: ../src/gtk-ui/ui.glade.h:39 msgid "Sync Emergency" msgstr "åŒæ­¥ç·Šæ€¥ç‹€æ³" #: ../src/gtk-ui/ui.glade.h:41 msgid "" "To sync you'll need a network connection and an account with a sync service.\n" "We support the following services: " msgstr "" "è‹¥è¦åŒæ­¥ï¼Œæ‚¨éœ€è¦æœ‰ç¶²è·¯é€£ç·šä»¥åŠä½¿ç”¨åŒæ­¥æœå‹™çš„帳號。\n" "我們支æ´ä¸‹åˆ—æœå‹™ï¼š" #: ../src/gtk-ui/ui.glade.h:43 msgid "Use Bluetooth to Sync your data from one device to another." msgstr "使用è—牙從æŸè£ç½®åŒæ­¥æ‚¨çš„資料到å¦ä¸€å€‹è£ç½®åŽ»ã€‚" #: ../src/gtk-ui/ui.glade.h:44 msgid "You will need to add Bluetooth devices before they can be synced." msgstr "åœ¨å®ƒå€‘èƒ½è¢«åŒæ­¥å‰ï¼Œæ‚¨éœ€è¦å…ˆåŠ å…¥è—牙è£ç½®ã€‚" #: ../src/gtk-ui/sync.desktop.in.h:2 msgid "Up to date" msgstr "已是最新" #: ../src/gtk-ui/sync-gtk.desktop.in.h:1 msgid "SyncEvolution (GTK)" msgstr "SyncEvolution (GTK)" #: ../src/gtk-ui/sync-gtk.desktop.in.h:2 msgid "Synchronize PIM data" msgstr "將個人資訊管ç†ç³»çµ± (PIM) çš„è³‡æ–™åŒæ­¥" #: ../src/gtk-ui/sync-config-widget.c:88 msgid "" "ScheduleWorld enables you to keep your contacts, events, tasks, and notes in" " sync." msgstr "ScheduleWorld å¯ä»¥è®“您的連絡人ã€è¡Œäº‹æ›†äº‹é …ã€å·¥ä½œã€ä»¥åŠè¨»è¨˜ä¿æŒåŒæ­¥ã€‚" #: ../src/gtk-ui/sync-config-widget.c:91 msgid "" "Google Sync can back up and synchronize your contacts with your Gmail " "contacts." msgstr "Google Sync å¯ä»¥å°‡æ‚¨çš„è¯çµ¡äººå’Œ Gmail 連絡人進行備份以åŠåŒæ­¥ã€‚" #. TRANSLATORS: Please include the word "demo" (or the equivalent in #. your language): Funambol is going to be a 90 day demo service #. in the future #: ../src/gtk-ui/sync-config-widget.c:97 msgid "" "Back up your contacts and calendar. Sync with a single click, anytime, " "anywhere (DEMO)." msgstr "備份您的連絡人與行事曆。一個按éµå°±åŒæ­¥ï¼Œä»»ä½•時間ã€ä»»ä½•地點 (樣本)。" #: ../src/gtk-ui/sync-config-widget.c:100 msgid "" "Mobical Backup and Restore service allows you to securely back up your " "personal mobile data for free." msgstr "Mobical 備份與還原æœå‹™è®“您å¯ä»¥å®‰å…¨åœ°å‚™ä»½å€‹äººè¡Œå‹•資料,而且å…費。" #: ../src/gtk-ui/sync-config-widget.c:103 msgid "" "ZYB is a simple way for people to store and share mobile information online." msgstr "ZYB 是人們儲存與線上分享行動資訊的一種簡單方法。" #: ../src/gtk-ui/sync-config-widget.c:106 msgid "" "Memotoo lets you access your personal data from any computer connected to " "the Internet." msgstr "Memotoo èƒ½è®“æ‚¨å¾žä»»ä½•é€£æŽ¥åˆ°ç¶²è·¯çš„é›»è…¦å­˜å–æ‚¨çš„個人資料。" #: ../src/gtk-ui/sync-config-widget.c:195 msgid "Sorry, failed to save the configuration" msgstr "很抱歉,儲存設定檔失敗" #: ../src/gtk-ui/sync-config-widget.c:445 msgid "Service must have a name and server URL" msgstr "æœå‹™é …ç›®å¿…é ˆè¦æœ‰ä¸€å€‹å稱和伺æœå™¨ç¶²å€" #. TRANSLATORS: error dialog when creating a new sync configuration #: ../src/gtk-ui/sync-config-widget.c:451 msgid "A username is required for this service" msgstr "æ­¤æœå‹™éœ€è¦ä½¿ç”¨è€…å稱" #: ../src/gtk-ui/sync-config-widget.c:493 #, c-format msgid "" "Do you want to reset the settings for %s? This will not remove any synced " "information on either end." msgstr "您想è¦ç‚º %s é‡è¨­è¨­å®šå—Žï¼Ÿé€™ä¸æœƒç§»é™¤ä»»ä½•å…©æ–¹åŒæ­¥éŽçš„資訊。" #. TRANSLATORS: buttons in reset-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:497 msgid "Yes, reset" msgstr "是,é‡è¨­" #: ../src/gtk-ui/sync-config-widget.c:498 #: ../src/gtk-ui/sync-config-widget.c:509 msgid "No, keep settings" msgstr "ä¸ï¼Œç¶­æŒè¨­å®š" #: ../src/gtk-ui/sync-config-widget.c:503 #, c-format msgid "" "Do you want to delete the settings for %s? This will not remove any synced " "information on either end but it will remove these settings." msgstr "您想è¦ç‚º %s åˆªé™¤è¨­å®šå€¼å—Žï¼Ÿé€™ä¸æœƒç§»é™¤ä»»ä½•å…©ç«¯åŒæ­¥éŽçš„資訊,但是它會移除這些設定值。" #. TRANSLATORS: buttons in delete-service warning dialog #: ../src/gtk-ui/sync-config-widget.c:508 msgid "Yes, delete" msgstr "是,刪除" #: ../src/gtk-ui/sync-config-widget.c:539 msgid "Reset settings" msgstr "é‡è¨­è¨­å®šå€¼" #: ../src/gtk-ui/sync-config-widget.c:542 msgid "Delete settings" msgstr "刪除設定值" #: ../src/gtk-ui/sync-config-widget.c:552 msgid "Save and use" msgstr "儲存並使用" #: ../src/gtk-ui/sync-config-widget.c:555 msgid "" "Save and replace\n" "current service" msgstr "" "儲存並å–代\n" "ç›®å‰çš„æœå‹™" #: ../src/gtk-ui/sync-config-widget.c:563 msgid "Stop using device" msgstr "åœæ­¢ä½¿ç”¨è£ç½®" #: ../src/gtk-ui/sync-config-widget.c:566 msgid "Stop using service" msgstr "åœæ­¢ä½¿ç”¨æœå‹™" #. TRANSLATORS: label for an entry in service configuration form. #. * Placeholder is a source name. #. * Example: "Appointments URI" #: ../src/gtk-ui/sync-config-widget.c:749 #, c-format msgid "%s URI" msgstr "%s URI" #. TRANSLATORS: toggles in service configuration form, placeholder is service #. * or device name #: ../src/gtk-ui/sync-config-widget.c:936 #, c-format msgid "Send changes to %s" msgstr "傳é€è®Šæ›´åˆ° %s" #: ../src/gtk-ui/sync-config-widget.c:941 #, c-format msgid "Receive changes from %s" msgstr "接收來自 %s 的變更" #: ../src/gtk-ui/sync-config-widget.c:957 msgid "Sync" msgstr "åŒæ­¥" #. TRANSLATORS: label of a entry in service configuration #: ../src/gtk-ui/sync-config-widget.c:973 msgid "Server address" msgstr "伺æœå™¨ä½å€" #. TRANSLATORS: explanation before a device template combobox. #. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution #. * Client' #: ../src/gtk-ui/sync-config-widget.c:1049 #, c-format msgid "" "This device looks like it might be a '%s'. If this is not correct, please " "take a look at the list of supported devices and pick yours if it is listed" msgstr "æ­¤è£ç½®çœ‹èµ·ä¾†å¯èƒ½æ˜¯ã€Œ%sã€ã€‚å¦‚æžœä¸æ­£ç¢ºçš„話,請查看支æ´è£ç½®çš„æ¸…單,如果它列於其中的話請é¸å–您的è£ç½®ã€‚" #: ../src/gtk-ui/sync-config-widget.c:1055 #: ../src/gtk-ui/sync-config-widget.c:1915 msgid "" "We don't know what this device is exactly. Please take a look at the list of" " supported devices and pick yours if it is listed" msgstr "我們ä¸çŸ¥é“æ­¤è£ç½®åˆ°åº•是什麼。請查看支æ´è£ç½®çš„æ¸…單,如果它列於其中的話請é¸å–您的è£ç½®ã€‚" #: ../src/gtk-ui/sync-config-widget.c:1207 #, c-format msgid "%s - Bluetooth device" msgstr "%s - è—牙è£ç½®" #. TRANSLATORS: service title for services that are not based on a #. * template in service list, the placeholder is the name of the service #: ../src/gtk-ui/sync-config-widget.c:1213 #, c-format msgid "%s - manually setup" msgstr "%s - 手動設置" #. TRANSLATORS: link button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1886 msgid "Launch website" msgstr "開啟網站" #. TRANSLATORS: button in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1895 msgid "Set up now" msgstr "立刻設置" #: ../src/gtk-ui/sync-config-widget.c:1953 msgid "Use these settings" msgstr "使用這些設定" #. TRANSLATORS: labels of entries in service configuration form #: ../src/gtk-ui/sync-config-widget.c:1991 msgid "Username" msgstr "使用者å稱" #: ../src/gtk-ui/sync-config-widget.c:2006 msgid "Password" msgstr "密碼" #. TRANSLATORS: warning in service configuration form for people #. who have modified the configuration via other means. #: ../src/gtk-ui/sync-config-widget.c:2029 msgid "" "Current configuration is more complex than what can be shown here. Changes " "to sync mode or synced data types will overwrite that configuration." msgstr "ç›®å‰çš„設定檔比這裡能夠顯示的還è¦è¤‡é›œè¨±å¤šã€‚è®Šæ›´ç‚ºåŒæ­¥æ¨¡å¼æˆ–æ˜¯åŒæ­¥éŽçš„資料類型將會覆蓋寫入那份設定檔。" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2048 msgid "Hide server settings" msgstr "éš±è—伺æœå™¨è¨­å®š" #. TRANSLATORS: this is the epander label for server settings #. in service configuration form #: ../src/gtk-ui/sync-config-widget.c:2068 msgid "Show server settings" msgstr "顯示伺æœå™¨è¨­å®š" #: ../src/gnome-bluetooth/syncevolution.c:110 msgid "Sync in the Sync application" msgstr "åœ¨ã€ŒåŒæ­¥ã€æ‡‰ç”¨ç¨‹å¼å…§åŒæ­¥" #: ../src/syncevo-dbus-server.cpp:6653 #, c-format msgid "%s is syncing" msgstr "%s æ­£åœ¨åŒæ­¥ä¸­" #: ../src/syncevo-dbus-server.cpp:6654 #, c-format msgid "We have just started to sync your computer with the %s sync service." msgstr "æˆ‘å€‘å‰›é–‹å§‹å°‡æ‚¨çš„é›»è…¦åŒæ­¥åˆ° %s åŒæ­¥æœå‹™ã€‚" #. if sync is successfully started and done #: ../src/syncevo-dbus-server.cpp:6670 #, c-format msgid "%s sync complete" msgstr "%s åŒæ­¥å®Œæˆ" #: ../src/syncevo-dbus-server.cpp:6671 #, c-format msgid "We have just finished syncing your computer with the %s sync service." msgstr "我們剛完æˆå°‡æ‚¨çš„é›»è…¦åŒæ­¥åˆ° %s åŒæ­¥æœå‹™ã€‚" #. if sync is successfully started and has errors, or not started successful #. with a fatal problem #: ../src/syncevo-dbus-server.cpp:6676 msgid "Sync problem." msgstr "åŒæ­¥ç™¼ç”Ÿå•題。" #: ../src/syncevo-dbus-server.cpp:6677 msgid "Sorry, there's a problem with your sync that you need to attend to." msgstr "æŠ±æ­‰ï¼Œæ‚¨çš„åŒæ­¥æœ‰å€‹å•題是您需è¦é—œå¿ƒçš„。" #: ../src/syncevo-dbus-server.cpp:6758 msgid "View" msgstr "檢視" #. Use "default" as ID because that is what mutter-moblin #. recognizes: it then skips the action instead of adding it #. in addition to its own "Dismiss" button (always added). #: ../src/syncevo-dbus-server.cpp:6762 msgid "Dismiss" msgstr "摒棄" syncevolution-1.5/po/ChangeLog0000644000373300001540000000000012326412403017671 0ustar00nightlynightly00000000000000syncevolution-1.5/po/POTFILES.skip0000644000373300001540000000015712326412403020251 0ustar00nightlynightly00000000000000src/gtk-ui/ui.xml src/gtk-ui/gtkinfobar.c src/synthesis/src/pcre/pcre_compile.c src/dbus/server/pim/testpim.py syncevolution-1.5/po/Makevars0000644000373300001540000000343112326412403017626 0ustar00nightlynightly00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = http://moblin.org/projects/syncevolution # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = syncevolution-1.5/po/LINGUAS0000664000373300001540000000014112267716706017175 0ustar00nightlynightly00000000000000ar ast ca da de en_GB en_US es fi fr gl hu id it ja ko nl pl pt_BR ro ru sk sv th tr zh_CN zh_TW syncevolution-1.5/src/0000755000373300037200000000000012424707661016474 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/0000755000373300037200000000000012424707641020244 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/activesync/0000755000373300037200000000000012424707641022414 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/activesync/configure-sub.in0000644000373300001540000000474412326412403025335 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. SE_ARG_ENABLE_BACKEND(activesync, activesync, [AS_HELP_STRING([--enable-activesync], [enable access to servers via ActiveSync (default off)])], [enable_activesync="$enableval"], [enable_activesync="no"]) AC_ARG_WITH(activesyncd-src, AS_HELP_STRING([--with-activesyncd-src=], [Specifies location of the activesyncd source root directory. Use this when activesyncd is to be compiled as part of the SyncEvolution compilation.]), [ACTIVESYNCDSRC="$withval" test "$ACTIVESYNCDSRC" != "yes" || AC_MSG_ERROR([--with-synthesis-src requires a parameter (base directory, svn URL or git URL)])], [ACTIVESYNCDSRC=""]) AM_CONDITIONAL([BUILD_ACTIVESYNCD], [test "$enable_activesync" = "yes" && test "$ACTIVESYNCDSRC" != ""]) if test "$enable_activesync" = "yes"; then if test "$ACTIVESYNCDSRC" != ""; then # brute-force dependency on any file in the source repo LIBEASCLIENT_LA_DEPENDENCIES=`find "$ACTIVESYNCDSRC"/* -type f -printf '%p ' ` AC_SUBST(LIBEASCLIENT_LA_DEPENDENCIES) mkdir -p src/backends/activesync/activesyncd/build AC_MSG_NOTICE([configuring activesyncd using the $ACTIVESYNCDSRC source code]) ( set -x; cd src/backends/activesync/activesyncd/build && $ACTIVESYNCDSRC/configure --disable-eplugin --disable-camel-backend --disable-qtconfig --prefix=`pwd`/../install) || AC_MSG_ERROR([configuring activesyncd failed]) # hard-coded replacement for pkg-config: necessary because # .pc file not installed yet EASCLIENT_LIBS=src/backends/activesync/activesyncd/install/lib/libeasclient.la EASCLIENT_DEPENDENCIES=src/backends/activesync/activesyncd/install/lib/libeasclient.la EASCLIENT_CFLAGS=-Isrc/backends/activesync/activesyncd/install/include/eas-daemon/eas-client AC_SUBST(EASCLIENT_LIBS) AC_SUBST(EASCLIENT_DEPENDENCIES) AC_SUBST(EASCLIENT_CFLAGS) else PKG_CHECK_MODULES(EASCLIENT, libeasclient) fi AC_DEFINE(ENABLE_ACTIVESYNC, 1, [ActiveSync available]) need_ical="yes" need_glib="yes" fi BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $EASCLIENT_CFLAGS" syncevolution-1.5/src/backends/activesync/README0000644000373300001540000001327512326412403023114 0ustar00nightlynightly00000000000000Compilation =========== activesyncd development files must be installed so that pkg-config finds libeassync.pc. --enable-activesync then enables the ActiveSync backend. It is off by default, even if development files are found. Quickstart ========== Check that it is enabled: $ syncevolution backend=? | grep -i activesync ActiveSync Address Book = eas-contacts ActiveSync Events = eas-events ActiveSync Todos = eas-todos ActiveSync Memos = eas-memos Configure access to the server: $ syncevolution --configure \ syncURL= \ username= \ addressbook/backend=eas-contacts \ calendar/backend=eas-events \ todo/backend=eas-todos \ memo/backend=eas-memos \ target-config@exchange addressbook calendar todo memo List items: $ syncevolution --print-items target-config@exchange [calendar|addressbook|todo|memo] Debugging: - run with --daemon=no (otherwise syncevo-dbus-server will execute the operation) - set SYNCEVOLUTION_DEBUG (otherwise SyncEvolution will suppress stdout/stderr from libs) Configure synchronization: $ syncevolution --configure \ --template SyncEvolution_Client \ syncURL=local://@exchange \ username= \ password= \ exchange Run a sync (involving all four data types!): $ syncevolution exchange Sync only events: $ syncevolution exchange calendar Note that it is not possible to share the same username in the target config between different sync configs, because change tracking is tied to the account, not the config using it. For the same reason, listing items will affect syncing if the same username (= account) is used in both. As a workaround it is possible to set up different accounts for the same server, see below. Backend Testing =============== In addition to an activesyncd account called (usually an email adddress), also create an activesyncd account called _B ("_B" appended) with the same settings *plus* "device_id" set explicitly. The value must be different than the one chosen automatically (see apps/activesyncd/device_id key). Because Exchange might not accept arbitrary strings, stick to the scheme of "32 digit hexadecimal number". This second accounts is required for Client::Source::*::testChanges, which must simulate two independent ActiveSync clients. Configure "local" testing (backend is covered, no syncing involved): ./syncevolution --configure username= \ eas_event/backend=eas-events \ eas_event/database= \ eas_contact/backend=eas-contacts \ eas_contact/database= \ --template SyncEvolution target-config@client-test-exchange On MeeGo: - install syncevolution-test and syncevolution-synccompare - create an empty directory, enter it - copy /usr/share/doc/syncevolution/testcases - CLIENT_TEST_UNIQUE_UID=1 \ CLIENT_TEST_SERVER=exchange \ client-test Client::Source::eas_event When compiling SyncEvolution: - enter the src directory - CLIENT_TEST_UNIQUE_UID=1 \ CLIENT_TEST_SERVER=exchange \ PATH=.:$PATH \ ./client-test Client::Source::eas_event CLIENT_TEST_UNIQUE_UID is necessary to avoid a UID conflict in a simple-minded insertion test. The proper solution is to add an "item exists" error to activesyncd and handle that in ActiveSyncSource::insertItem(). The test data that is used for testImport is in: testcases/eds_event.ics This data was meant for Evolution. Because it is standard iCalendar 2.0, it is a suitable starting point for Exchange. If it turns out that this data doesn't work with Exchange, then a simplified/adapter version of the file can be put into: testcases/eds_event.ics.exchange.tem Sync Testing ============ - Configure target-config@exchange with source 'calendar' and 'addressbook'. - Create two sync configs: syncevolution --configure \ syncURL=local://@exchange \ username= \ eds_event/backend=evolution-calendar \ eds_event/uri=eas_event \ eds_event/database=SyncEvolution_Test_eds_event_1 \ eds_contact/backend=evolution-contacts \ eds_contact/uri=eas_contact \ eds_contact/database=SyncEvolution_Test_eds_contact_1 \ --template SyncEvolution_Client exchange_1@client-test-1 eds_event eds_contact syncevolution --configure \ syncURL=local://@exchange \ username=_B \ eds_event/backend=evolution-calendar \ eds_event/uri=eas_event \ eds_event/database=SyncEvolution_Test_eds_event_2 \ eds_contact/backend=evolution-contacts \ eds_contact/uri=eas_contact \ eds_contact/database=SyncEvolution_Test_eds_contact_2 \ --template SyncEvolution_Client exchange_2@client-test-2 eds_event eds_contact - Create calendars named as follows in Evolution: SyncEvolution_Test_eds_event_1 SyncEvolution_Test_eds_event_2 - run test (see above for invoking client-test and setting up "testcases"): CLIENT_TEST_UNIQUE_UID=1 CLIENT_TEST_SERVER=exchange \ client-test Client::Sync::eds_event::testCopy This setup depends on overriding the username in target-config@exchange with different usernames in each sync config. This is necessary because change tracking depends on that username. Google via ActiveSync ===================== - Use "googleeas" instead of "exchange", because ActiveSyncSourceRegister.cpp needs to know that it is talking to Google, to work around the lack of Fetch command support. syncevolution-1.5/src/backends/activesync/ActiveSyncSourceRegister.cpp0000664000373300001540000002500412405555067027705 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "ActiveSyncSource.h" #include "ActiveSyncCalendarSource.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef ENABLE_UNIT_TESTS # include # include #endif #include #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe; isMe = sourceType.m_backend == "ActiveSync Address Book"; if (isMe) { return #ifdef ENABLE_ACTIVESYNC new ActiveSyncContactSource(params) #else RegisterSyncSource::InactiveSource(params) #endif ; } isMe = sourceType.m_backend == "ActiveSync Events"; if (isMe) { return #ifdef ENABLE_ACTIVESYNC new ActiveSyncCalendarSource(params, EAS_ITEM_CALENDAR) #else RegisterSyncSource::InactiveSource(params) #endif ; } isMe = sourceType.m_backend == "ActiveSync Todos"; if (isMe) { return #ifdef ENABLE_ACTIVESYNC new ActiveSyncCalFormatSource(params, EAS_ITEM_TODO) #else RegisterSyncSource::InactiveSource(params) #endif ; } isMe = sourceType.m_backend == "ActiveSync Memos"; if (isMe) { return #ifdef ENABLE_ACTIVESYNC new ActiveSyncCalFormatSource(params, EAS_ITEM_JOURNAL) #else RegisterSyncSource::InactiveSource(params) #endif ; } return NULL; } static RegisterSyncSource registerMe("ActiveSync", #ifdef ENABLE_ACTIVESYNC true, #else false, #endif createSource, "ActiveSync Address Book = eas-contacts\n" "ActiveSync Events = eas-events\n" "ActiveSync Todos = eas-todos\n" "ActiveSync Memos = eas-memos", Values() + (Aliases("ActiveSync Address Book") + "eas-contacts") + (Aliases("ActiveSync Events") + "eas-events") + (Aliases("ActiveSync Todos") + "eas-todos") + (Aliases("ActiveSync Memos") + "eas-memos")); #ifdef ENABLE_ACTIVESYNC #ifdef ENABLE_UNIT_TESTS class ActiveSyncsTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ActiveSyncsTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("contacts", "ActiveSync Address Book", true)); source.reset(SyncSource::createTestingSource("events", "ActiveSync Events", true)); source.reset(SyncSource::createTestingSource("todos", "ActiveSync Todos", true)); source.reset(SyncSource::createTestingSource("memos", "ActiveSync Memos", true)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(ActiveSyncsTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif /** * Takes all existing items in the source and writes them into the file, * separated by a blank line. beginSync() with the previous sync key was * already called. * * Used for testing and thus should better not rely on cached information, * but ActiveSync doesn't offer an independent "list and/or retrieve all items" * operation. Using the cached information implies that we won't find bugs in * the handling of that information. */ static int DumpItems(ClientTest &client, TestingSyncSource &source, const std::string &file, bool forceBaseReadItem) { ActiveSyncSource &eassource = static_cast(source); ofstream out(file.c_str()); // find all ActiveSync server IDs: in ActiveSyncCalendarSource, // each server ID might appear multiple times, once for each // recurrence associated with it std::set easids; BOOST_FOREACH (const std::string &luid, eassource.getAllItems()) { // slight hack: we know that luids in ActiveSyncSource base // class pass through this method unmodified, so no need to // avoid it StringPair ids = ActiveSyncCalendarSource::splitLUID(luid); easids.insert(ids.first); } BOOST_FOREACH(const std::string &easid, easids) { std::string item; if (forceBaseReadItem) { // This bypasses the more specialized // ActiveSyncCalendarSource::readItem(), which helps // reveal potential bugs in it. However, it depends on a // working Fetch operation in the ActiveSync server, which // Google doesn't seem to provide (404 error). eassource.ActiveSyncSource::readItem(easid, item); } else { // Normal readItem() works with Google by using the cached // item. However, the source must have done a beginSync() // with empty sync key, because otherwise the cache is // not guaranteed to be complete. eassource.readItem(easid, item); } out << item << '\n'; if (!boost::ends_with(item, "\n")) { out << '\n'; } } return 0; } static TestingSyncSource *createEASSource(const ClientTestConfig::createsource_t &create, ClientTest &client, const std::string &clientID, int source, bool isSourceA) { std::auto_ptr res(create(client, clientID, source, isSourceA)); // Mangle username: if the base username in the config is account // "foo", then source B uses "foo_B", because otherwise it'll end // up sharing change tracking with source A. if (!isSourceA) { ActiveSyncSource *eassource = static_cast(res.get()); std::string account = eassource->getSyncConfig().getSyncUser().toString(); account += "_B"; eassource->getSyncConfig().setSyncUsername(account, true); } if (res->getDatabaseID().empty()) { return res.release(); } else { // sorry, no database SE_LOG_ERROR(NULL, "cannot create EAS datastore for database %s, check config", res->getDatabaseID().c_str()); return NULL; } } // common settings for all kinds of data static void updateConfigEAS(const RegisterSyncSourceTest */* me */, ClientTestConfig &config, EasItemType type) { // cannot run tests involving a second database: // wrap orginal source creation, set default database for // database #0 and refuse to return a source for database #1 config.m_createSourceA = boost::bind(createEASSource, config.m_createSourceA, _1, _2, _3, _4); config.m_createSourceB = boost::bind(createEASSource, config.m_createSourceB, _1, _2, _3, _4); config.m_dump = boost::bind(DumpItems, _1, _2, _3, type == EAS_ITEM_CONTACT || // need to read from our cache for Google Calendar, // because it does not support Fetch strcmp(getEnv("CLIENT_TEST_SERVER", ""), "googleeas") ); config.m_sourceLUIDsAreVolatile = true; // TODO: find out how ActiveSync/Exchange handle children without parent; // at the moment, the child is stored as if it was a stand-alone event // and the RECURRENCE-ID is lost (BMC #22831). config.m_linkedItemsRelaxedSemantic = false; } static class ActiveSyncContactTest : public RegisterSyncSourceTest { public: ActiveSyncContactTest() : RegisterSyncSourceTest("eas_contact", // name of test => Client::Source::eas_contact" "eds_contact" // name of test cases: inherit from EDS, override below ) {} virtual void updateConfig(ClientTestConfig &config) const { // override default eds_contact test config config.m_type = "eas-contacts"; // TODO: provide comprehensive set of vCard 3.0 contacts as they are understood by the ActiveSync library // config.testcases = "testcases/eas_contact.vcf"; updateConfigEAS(this, config, EAS_ITEM_CONTACT); } } ActiveSyncContactTest; static class ActiveSyncEventTest : public RegisterSyncSourceTest { public: ActiveSyncEventTest() : RegisterSyncSourceTest("eas_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "eas-events"; updateConfigEAS(this, config, EAS_ITEM_CALENDAR); } } ActiveSyncEventTest; static class ActiveSyncTodoTest : public RegisterSyncSourceTest { public: ActiveSyncTodoTest() : RegisterSyncSourceTest("eas_task", "eds_task") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "eas-todos"; updateConfigEAS(this, config, EAS_ITEM_TODO); } } ActiveSyncTodoTest; static class ActiveSyncMemoTest : public RegisterSyncSourceTest { public: ActiveSyncMemoTest() : RegisterSyncSourceTest("eas_memo", "eds_memo") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "eas-memos"; updateConfigEAS(this, config, EAS_ITEM_JOURNAL); } } ActiveSyncMemoTest; } // anonymous namespace #endif // ENABLE_ACTIVESYNC SE_END_CXX syncevolution-1.5/src/backends/activesync/activesync.am0000644000373300001540000000356212326412403024721 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ src/backends/activesync/configure-sub.in \ src/backends/activesync/README src_backends_activesync_lib = src/backends/activesync/syncactivesync.la MOSTLYCLEANFILES += $(src_backends_activesync_lib) if ENABLE_MODULES src_backends_activesync_backenddir = $(BACKENDS_DIRECTORY) src_backends_activesync_backend_LTLIBRARIES = $(src_backends_activesync_lib) else noinst_LTLIBRARIES += $(src_backends_activesync_lib) endif src_backends_activesync_src = \ src/backends/activesync/ActiveSyncSource.h \ src/backends/activesync/ActiveSyncSource.cpp \ src/backends/activesync/ActiveSyncCalendarSource.h \ src/backends/activesync/ActiveSyncCalendarSource.cpp src_backends_activesync_syncactivesync_la_SOURCES = $(src_backends_activesync_src) src_backends_activesync_syncactivesync_la_LIBADD = $(EASCLIENT_LIBS) $(SYNCEVOLUTION_LIBS) $(LIBICAL_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS) src_backends_activesync_syncactivesync_la_LDFLAGS = -no-undefined -module -avoid-version src_backends_activesync_syncactivesync_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_activesync_syncactivesync_la_CXXFLAGS = $(EASCLIENT_CFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(LIBICAL_CFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) src_backends_activesync_syncactivesync_la_DEPENDENCIES = src/syncevo/libsyncevolution.la $(EASCLIENT_DEPENDENCIES) # activated by EASCLIENT_DEPENDENCIES: usually empty, unless --with-activesyncd-src is used $(src_backends_activesync_src) src/backends/activesync/ActiveSyncSourceRegister.cpp: $(EASCLIENT_DEPENDENCIES) $(EASCLIENT_DEPENDENCIES): $(LIBEASCLIENT_LA_DEPENDENCIES) cd src/backends/activesync/activesyncd/build && $(MAKE) for i in libeasaccount/src libeasclient eas-daemon/libeas libeastest/src eas-daemon/src; do \ (cd src/backends/activesync/activesyncd/build/$$i && $(MAKE) DESTDIR= install) || exit 1; \ done syncevolution-1.5/src/backends/activesync/ActiveSyncSource.h0000664000373300001540000002603012405555067025645 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_ACTIVESYNCSOURCE #define INCL_ACTIVESYNCSOURCE #include #include #ifdef ENABLE_ACTIVESYNC #include #include #include #include #include #include #include #include "libeassync.h" #include #include #include SE_BEGIN_CXX /** * Synchronizes contacts, events, tasks and journals with an * ActiveSync server. Sub-classes provide the necessary specialization * for different data formats. * * Data is exchanged between ActiveSyncSource, ActiveSync library, and * Synthesis engine as vCard 3.0 and iCalendar 2.0 format. The * standard contact and calendar profile is used, with ACTIVESYNC set * as sub-rule. This influences how the Synthesis engine converts to * and from its internal format. See KDE in * src/syncevo/profiles/datatypes/01vcard-profile.xml for an extensive * example how that works. * * Each ActiveSync calendar item is a VCALENDAR which contains all * VEVENTs with the same UID. The SyncEvolution/Synthesis engine works * with individual VEVENTs per item. This implies that someone has to * map between the two concepts. This is done in the derived * ActiveSyncCalendarSource, similar to the existing MapSyncSource. * * Reusing that class was considered, but discarded because * MapSyncSource assumes that the class that it wraps uses id/revision * string pairs for change tracking, which is not the case for * ActiveSync. * * A sync session is done like this: * - The Synthesis sync anchor directly maps to the * ActiveSync sync key. * - In SyncSourceSession::beginSync() (inherited from TestingSyncSource), * the ActiveSync library is asked for changes (for a non-empty key) * or all items (empty key). * - The returned item IDs are stored in SyncSourceChanges. * Only the server's IDs are used. They map 1:1 with the "luid" in * the SyncSource API and the Synthesis engine. * Because a full list of all existing items is expected, * ActiveSyncSource maintains a list of all known items * in the params.m_nodes.getTrackingNode() that it gets * for that purpose. * - The returned item content is cached in a local content cache * and returns items from that when asked to via * SyncSourceSerialize. * - As items are added/remove/updated, the content cache, the list * of IDs, and the sync key are updated. The expectation is * that any changes made by other ActiveSync server clients * will be reported when asking for changes based on that updated * key without including changes made by our own client, even * when these changes happen concurrently. This is true for * Exchange 2010 + ActiveSync 12.1. * TODO: write a test program to verify that assumption. * Google + ActiveSync 12.0 do not support this. * TODO: deal with server-side changes reported to us at the * time when we make changes ourselves. * - When multiple events are in one item, it can happen that * the event series has to be retrieved individually from the * server. Example: * - nothing changed on server => nothing sent at start of sync, * cache empty * - ActiveSyncCalendarSource must delete a detached recurrence * inside a series * - retrieve series * - remove recurrence * - sent back the updated series * - At the end of the sync, the updated ID list is stored and * the updated sync key is returned to the Synthesis engine. * - If anything goes wrong, a fatal error is returned to the * Synthesis engine, which then invalidates the sync key and * thus forces a slow sync in the next session. * TODO: investigate more intelligent ways of recovering. * The problem will be that trying again with the original * sync key will return changes made by the client itself * as part of the incomplete sync session. * * The command line item manipulation operations * (--import/export/update/print-items/delete-items) always start a * session without a sync key and thus (with the current API) have to * download all items before doing anything. * TODO: optimize that */ class ActiveSyncSource : public TestingSyncSource, // == SyncSourceSession, SyncSourceChanges, SyncSourceDelete, SyncSourceSerialize // TODO: implement SyncSourceLogging to get nicer debug and command line output // virtual public SyncSourceLogging, virtual public SyncSourceAdmin, virtual public SyncSourceBlob { public: ActiveSyncSource(const SyncSourceParams ¶ms) : TestingSyncSource(params), // Ensure that arbitrary keys can be stored (SafeConfigNode) and // that we use a common prefix, so that we can use the key/value store // also for other keys if the need ever arises). m_itemNode(new PrefixConfigNode("item-", boost::shared_ptr(new SafeConfigNode(params.m_nodes.getTrackingNode())))), m_context(params.m_context) { if (!m_context) { m_context.reset(new SyncConfig()); } } /** sync config used by this instance, never NULL */ SyncConfig &getSyncConfig() { return *m_context; } /* partial implementation of SyncSource */ virtual void enableServerMode(); virtual bool serverModeEnabled() const; virtual Databases getDatabases(); virtual void open(); virtual void close(); virtual std::string getPeerMimeType() const { return getMimeType(); } /* implementation of SyncSourceSession */ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); /* implementation of SyncSourceDelete */ virtual void deleteItem(const string &luid); /* partial implementation of SyncSourceSerialize */ virtual std::string getMimeType() const = 0; virtual std::string getMimeVersion() const = 0; virtual InsertItemResult insertItem(const std::string &luid, const std::string &item); virtual void readItem(const std::string &luid, std::string &item); /** to be provided by derived class */ virtual EasItemType getEasType() const = 0; protected: virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments); EasSyncHandler *getHandler() { return m_handler.get(); } std::string getFolder() { return m_folder; } std::string getStartSyncKey() { return m_startSyncKey; } void setStartSyncKey(const std::string &startSyncKey) { m_startSyncKey = startSyncKey; } std::string getCurrentSyncKey() { return m_currentSyncKey; } void setCurrentSyncKey(const std::string ¤tSyncKey) { m_currentSyncKey = currentSyncKey; } void findCollections(const std::string &account, bool force_update); std::string lookupFolder(const std::string &folder); boost::shared_ptr m_itemNode; private: /** "target-config@" instance which holds our username == ActiveSync account ID */ boost::shared_ptr m_context; /** account ID for libeas, must be set in "username" config property */ std::string m_account; /** folder ID for libeas, optionally set in "database" config property */ std::string m_folder; /** smart pointer holding reference to EasSyncHandler during session */ eptr m_handler; /** original sync key, set when session starts */ std::string m_startSyncKey; /** current sync key, set when session starts and updated as changes are made */ std::string m_currentSyncKey; /** * server-side IDs of all items, updated as changes are reported and/or are made; * NULL if not using change tracking */ boost::shared_ptr m_ids; /** * cache of all items, filled at begin of session and updated as * changes are made (if doing change tracking) */ std::map m_items; /** * list of folders */ typedef struct Collection { std::string collectionId; std::string name; std::string parentId; std::string pathName; unsigned type; bool pathFound; ActiveSyncSource *source; Collection() : type(0), pathFound(false), source(NULL) {} int getFolderType(); bool collectionIsDefault(); std::string fullPath(); } collection; std::map m_collections; // Indexed by collectionID typedef std::map FolderPaths; FolderPaths m_folderPaths; // Maps pathName to collectionId }; class ActiveSyncContactSource : public ActiveSyncSource { public: ActiveSyncContactSource(const SyncSourceParams ¶ms) : ActiveSyncSource(params) {} protected: /* partial implementation of SyncSourceSerialize */ virtual std::string getMimeType() const { return "text/vcard"; } virtual std::string getMimeVersion() const { return "3.0"; } EasItemType getEasType() const { return EAS_ITEM_CONTACT; } }; /** * used for all iCalendar 2.0 items (events, todos, journals) */ class ActiveSyncCalFormatSource : public ActiveSyncSource { EasItemType m_type; public: ActiveSyncCalFormatSource(const SyncSourceParams ¶ms, EasItemType type) : ActiveSyncSource(params), m_type(type) {} protected: /* partial implementation of SyncSourceSerialize */ virtual std::string getMimeType() const { return "text/calendar"; } virtual std::string getMimeVersion() const { return "2.0"; } EasItemType getEasType() const { return m_type; } }; void EASItemUnref(EasItemInfo *info); /** non-copyable list of EasItemInfo pointers, owned by list */ typedef GListCXX EASItemsCXX; void GStringUnref(char *str); /** non-copyable list of strings, owned by list */ typedef GListCXX EASIdsCXX; /** non-copyable smart pointer to an EasItemInfo, unrefs when going out of scope */ typedef eptr EASItemPtr; void EASFolderUnref(EasFolder *f); /** non-copyable list of EasFolder pointers, owned by list */ typedef GListCXX EASFoldersCXX; SE_END_CXX #endif // ENABLE_ACTIVESYNC #endif // INCL_ACTIVESYNCSOURCE syncevolution-1.5/src/backends/activesync/ActiveSyncSource.cpp0000664000373300001540000005056312330727742026206 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef ENABLE_ACTIVESYNC #include "ActiveSyncSource.h" #include #include #include #include #include #include SE_GOBJECT_TYPE(EasSyncHandler) /* #include */ #include SE_BEGIN_CXX void EASItemUnref(EasItemInfo *info) { g_object_unref(&info->parent_instance); } void GStringUnref(char *str) { g_free(str); } void EASFolderUnref(EasFolder *f) { g_object_unref(&f->parent_instance); } void ActiveSyncSource::enableServerMode() { SyncSourceAdmin::init(m_operations, this); SyncSourceBlob::init(m_operations, getCacheDir()); } bool ActiveSyncSource::serverModeEnabled() const { return m_operations.m_loadAdminData; } /* Recursively work out full path name */ std::string ActiveSyncSource::Collection::fullPath() { if (!pathFound) { if (parentId == "0") { pathName = name; } else { pathName = source->m_collections[parentId].fullPath() + "/" + name; } pathFound = true; } return pathName; } void ActiveSyncSource::findCollections(const std::string &account, const bool force_update) { GErrorCXX gerror; EasSyncHandlerCXX handler; EASFoldersCXX folders; if (!m_collections.empty()) { if (!force_update) return; m_collections.clear(); m_folderPaths.clear(); } /* Fetch the folders */ handler = EasSyncHandlerCXX::steal(eas_sync_handler_new(account.c_str())); if (!handler) throwError(SE_HERE, "findCollections cannot allocate sync handler"); if (!eas_sync_handler_get_folder_list (handler, force_update, folders, NULL, gerror)) { gerror.throwError(SE_HERE, "fetching folder list"); } /* Save the Collections */ BOOST_FOREACH(EasFolder *folder, folders) { m_collections[folder->folder_id].collectionId = folder->folder_id; m_collections[folder->folder_id].name = folder->display_name; m_collections[folder->folder_id].parentId = folder->parent_id; m_collections[folder->folder_id].type = folder->type; m_collections[folder->folder_id].source = this; } /* Save the full paths */ BOOST_FOREACH(std::string id, m_collections | boost::adaptors::map_keys) { m_folderPaths[m_collections[id].fullPath()] = id; } } int ActiveSyncSource::Collection::getFolderType () { switch (type) { case EAS_FOLDER_TYPE_DEFAULT_INBOX: case EAS_FOLDER_TYPE_DEFAULT_DRAFTS: case EAS_FOLDER_TYPE_DEFAULT_DELETED_ITEMS: case EAS_FOLDER_TYPE_DEFAULT_SENT_ITEMS: case EAS_FOLDER_TYPE_DEFAULT_OUTBOX: case EAS_FOLDER_TYPE_USER_CREATED_MAIL: return EAS_ITEM_MAIL; case EAS_FOLDER_TYPE_DEFAULT_TASKS: case EAS_FOLDER_TYPE_USER_CREATED_TASKS: return EAS_ITEM_TODO; case EAS_FOLDER_TYPE_DEFAULT_CALENDAR: case EAS_FOLDER_TYPE_USER_CREATED_CALENDAR: return EAS_ITEM_CALENDAR; case EAS_FOLDER_TYPE_DEFAULT_CONTACTS: case EAS_FOLDER_TYPE_USER_CREATED_CONTACTS: return EAS_ITEM_CONTACT; case EAS_FOLDER_TYPE_DEFAULT_NOTES: case EAS_FOLDER_TYPE_USER_CREATED_NOTES: //TODO: implement memos case EAS_FOLDER_TYPE_DEFAULT_JOURNAL: case EAS_FOLDER_TYPE_USER_CREATED_JOURNAL: case EAS_FOLDER_TYPE_UNKNOWN: case EAS_FOLDER_TYPE_RECIPIENT_CACHE: default: return -1; } } bool ActiveSyncSource::Collection::collectionIsDefault () { return type == EAS_FOLDER_TYPE_DEFAULT_INBOX || type == EAS_FOLDER_TYPE_DEFAULT_DRAFTS || type == EAS_FOLDER_TYPE_DEFAULT_DELETED_ITEMS || type == EAS_FOLDER_TYPE_DEFAULT_SENT_ITEMS || type == EAS_FOLDER_TYPE_DEFAULT_OUTBOX || type == EAS_FOLDER_TYPE_DEFAULT_TASKS || type == EAS_FOLDER_TYPE_DEFAULT_CALENDAR || type == EAS_FOLDER_TYPE_DEFAULT_CONTACTS || type == EAS_FOLDER_TYPE_DEFAULT_NOTES || type == EAS_FOLDER_TYPE_DEFAULT_JOURNAL; } ActiveSyncSource::Databases ActiveSyncSource::getDatabases() { Databases result; // do a scan if username is set UserIdentity identity = m_context->getSyncUser(); if (identity.m_provider != USER_IDENTITY_PLAIN_TEXT) { throwError(SE_HERE, StringPrintf("%s: only the 'user:' format is supported by ActiveSync", identity.toString().c_str())); } const std::string &account = identity.m_identity; if (!account.empty()) { findCollections(account, true); BOOST_FOREACH(Collection coll, m_collections | boost::adaptors::map_values) { if (coll.getFolderType() == getEasType()) { result.push_back(Database(coll.pathName, coll.collectionId, coll.collectionIsDefault())); } } } else { result.push_back(Database("to scan, specify --print-databases username= backend=\""+getSourceType().m_backend+"\"", "")); } return result; } std::string ActiveSyncSource::lookupFolder(const std::string &folder) { // If folder matches a collectionId, use that if (m_collections.find(folder) != m_collections.end()) return folder; // If folder begins with /, drop it std::string key; if (!folder.empty() && folder[0] == '/') { key = folder.substr(1); } else { key = folder; } // Lookup folder name FolderPaths::const_iterator entry = m_folderPaths.find(key); if (entry != m_folderPaths.end()) { return entry->second; } // Not found return ""; } void ActiveSyncSource::open() { // extract account ID and throw error if missing UserIdentity identity = m_context->getSyncUser(); if (identity.m_provider != USER_IDENTITY_PLAIN_TEXT) { throwError(SE_HERE, StringPrintf("%s: only the 'user:' format is supported by ActiveSync", identity.toString().c_str())); } const std::string &username = identity.m_identity; std::string folder = getDatabaseID(); SE_LOG_DEBUG(NULL, "using eas sync account %s from config %s with folder %s", username.c_str(), m_context->getConfigName().c_str(), folder.c_str()); if (folder.empty()) { // Most common case is empty string m_folder = folder; } else { // Lookup folder name // Try using cached folder list findCollections(username, false); m_folder = lookupFolder(folder); if (m_folder.empty()) { // Fetch latest folder list and try again findCollections(username, true); m_folder = lookupFolder(folder); } if (m_folder.empty()) { throwError(SE_HERE, "could not find folder: "+folder); } } m_account = username; // create handler m_handler.set(eas_sync_handler_new(m_account.c_str()), "EAS handler"); } void ActiveSyncSource::close() { // free handler if not done already m_handler.set(NULL); } void ActiveSyncSource::beginSync(const std::string &lastToken, const std::string &resumeToken) { // erase content which might have been set in a previous call reset(); // claim item node for ids, if not done yet if (m_itemNode && !m_ids) { m_ids.swap(m_itemNode); } // incremental sync (non-empty token) or start from scratch m_startSyncKey = lastToken; if (lastToken.empty()) { // slow sync: wipe out cached list of IDs, will be filled anew below SE_LOG_DEBUG(getDisplayName(), "sync key empty, starting slow sync"); m_ids->clear(); } else { SE_LOG_DEBUG(getDisplayName(), "sync key %s for account '%s' folder '%s', starting incremental sync", lastToken.c_str(), m_account.c_str(), m_folder.c_str()); } gboolean moreAvailable = TRUE; m_currentSyncKey = m_startSyncKey; // same logic as in ActiveSyncCalendarSource::beginSync() bool slowSync = false; for (bool firstIteration = true; moreAvailable; firstIteration = false) { gchar *buffer = NULL; GErrorCXX gerror; EASItemsCXX created, updated; EASIdsCXX deleted; bool wasSlowSync = m_currentSyncKey.empty(); if (!eas_sync_handler_get_items(m_handler, m_currentSyncKey.c_str(), &buffer, getEasType(), m_folder.c_str(), created, updated, deleted, &moreAvailable, gerror)) { if (gerror.m_gerror && /* gerror.m_gerror->domain == EAS_TYPE_CONNECTION_ERROR && gerror.m_gerror->code == EAS_CONNECTION_SYNC_ERROR_INVALIDSYNCKEY && */ gerror.m_gerror->message && strstr(gerror.m_gerror->message, "Sync error: Invalid synchronization key") && firstIteration) { // fall back to slow sync slowSync = true; m_currentSyncKey = ""; m_ids->clear(); continue; } gerror.throwError(SE_HERE, "reading ActiveSync changes"); } GStringPtr bufferOwner(buffer, "reading changes: empty sync key returned"); // TODO: Test that we really get an empty token here for an unexpected slow // sync. If not, we'll start an incremental sync here and later the engine // will ask us for older, unmodified item content which we won't have. // populate ID lists and content cache BOOST_FOREACH(EasItemInfo *item, created) { if (!item->server_id) { throwError(SE_HERE, "no server ID for new eas item"); } string luid(item->server_id); if (luid.empty()) { throwError(SE_HERE, "empty server ID for new eas item"); } SE_LOG_DEBUG(getDisplayName(), "new item %s", luid.c_str()); addItem(luid, NEW); m_ids->setProperty(luid, "1"); if (!item->data) { throwError(SE_HERE, StringPrintf("no body returned for new eas item %s", luid.c_str())); } m_items[luid] = item->data; } BOOST_FOREACH(EasItemInfo *item, updated) { if (!item->server_id) { throwError(SE_HERE, "no server ID for updated eas item"); } string luid(item->server_id); if (luid.empty()) { throwError(SE_HERE, "empty server ID for updated eas item"); } SE_LOG_DEBUG(getDisplayName(), "updated item %s", luid.c_str()); addItem(luid, UPDATED); // m_ids.setProperty(luid, "1"); not necessary, should already exist (TODO: check?!) if (!item->data) { throwError(SE_HERE, StringPrintf("no body returned for updated eas item %s", luid.c_str())); } m_items[luid] = item->data; } BOOST_FOREACH(const char *serverID, deleted) { if (!serverID) { throwError(SE_HERE, "no server ID for deleted eas item"); } string luid(serverID); if (luid.empty()) { throwError(SE_HERE, "empty server ID for deleted eas item"); } SE_LOG_DEBUG(getDisplayName(), "deleted item %s", luid.c_str()); addItem(luid, DELETED); m_ids->removeProperty(luid); } // update key m_currentSyncKey = buffer; // Google hack: if we started with an empty sync key (= slow sync) // and got no results (= existing items), then try one more time, // because Google only seems to report results when asked with // a valid sync key. As an additional sanity check make sure that // we have a valid sync key now. if (wasSlowSync && created.empty() && !m_currentSyncKey.empty()) { moreAvailable = true; } } // now also generate full list of all current items: // old items + new (added to m_ids above) - deleted (removed above) ConfigProps props; m_ids->readProperties(props); BOOST_FOREACH(const StringPair &entry, props) { const std::string &luid = entry.first; SE_LOG_DEBUG(getDisplayName(), "existing item %s", luid.c_str()); addItem(luid, ANY); } if (slowSync) { // tell engine that we need a slow sync, if it didn't know already SE_THROW_EXCEPTION_STATUS(StatusException, "ActiveSync error: Invalid synchronization key", STATUS_SLOW_SYNC_508); } } std::string ActiveSyncSource::endSync(bool success) { // store current set of items if (!success) { m_ids->clear(); } m_ids->flush(); // let engine do incremental sync next time or start from scratch // in case of failure std::string newSyncKey = success ? m_currentSyncKey : ""; SE_LOG_DEBUG(getDisplayName(), "next sync key %s", newSyncKey.empty() ? "empty" : newSyncKey.c_str()); return newSyncKey; } void ActiveSyncSource::deleteItem(const string &luid) { // asking to delete a non-existent item via ActiveSync does not // trigger an error; this is expected by the caller, so detect // the problem by looking up the item in our list (and keep the // list up-to-date elsewhere) if (m_ids && m_ids->readProperty(luid).empty()) { throwError(SE_HERE, STATUS_NOT_FOUND, "item not found: " + luid); } // send delete request // TODO (?): batch delete requests GListCXX items; items.push_back((char *)luid.c_str()); GErrorCXX gerror; char *buffer; if (!eas_sync_handler_delete_items(m_handler, m_currentSyncKey.c_str(), &buffer, getEasType(), m_folder.c_str(), items, gerror)) { gerror.throwError(SE_HERE, "deleting eas item"); } GStringPtr bufferOwner(buffer, "delete items: empty sync key returned"); // remove from item list if (m_ids) { m_items.erase(luid); m_ids->removeProperty(luid); } // update key m_currentSyncKey = buffer; } SyncSourceSerialize::InsertItemResult ActiveSyncSource::insertItem(const std::string &luid, const std::string &data) { SyncSourceSerialize::InsertItemResult res; EASItemPtr tmp(eas_item_info_new(), "EasItem"); EasItemInfo *item = tmp.get(); if (!luid.empty()) { // update item->server_id = g_strdup(luid.c_str()); } else { // add // TODO: is a local id needed? We don't have one. } item->data = g_strdup(data.c_str()); EASItemsCXX items; items.push_front(tmp.release()); GErrorCXX gerror; char *buffer; // distinguish between update (existing luid) // or creation (empty luid) if (luid.empty()) { // send item to server if (!eas_sync_handler_add_items(m_handler, m_currentSyncKey.c_str(), &buffer, getEasType(), m_folder.c_str(), items, gerror)) { gerror.throwError(SE_HERE, "adding eas item"); } if (!item->server_id) { throwError(SE_HERE, "no server ID for new eas item"); } // get new ID from updated item res.m_luid = item->server_id; if (res.m_luid.empty()) { throwError(SE_HERE, "empty server ID for new eas item"); } // TODO: if someone else has inserted a new calendar item // with the same UID as the one we are trying to insert here, // what will happen? Does the ActiveSync server prevent // adding our own version of the item or does it merge? // res.m_merged = ??? } else { // update item on server if (!eas_sync_handler_update_items(m_handler, m_currentSyncKey.c_str(), &buffer, getEasType(), m_folder.c_str(), items, gerror)) { gerror.throwError(SE_HERE, "updating eas item"); } res.m_luid = luid; } GStringPtr bufferOwner(buffer, "insert item: empty sync key returned"); // add/update in cache if (m_ids) { m_items[res.m_luid] = data; m_ids->setProperty(res.m_luid, "1"); } // update key m_currentSyncKey = buffer; return res; } void ActiveSyncSource::readItem(const std::string &luid, std::string &item) { // return straight from cache? std::map::iterator it = m_items.find(luid); if (it == m_items.end()) { // no, must fetch EASItemPtr tmp(eas_item_info_new(), "EasItem"); GErrorCXX gerror; if (!eas_sync_handler_fetch_item(m_handler, m_folder.c_str(), luid.c_str(), tmp, getEasType(), gerror)) { if (gerror.m_gerror->message && strstr(gerror.m_gerror->message, "ObjectNotFound") /* gerror.matches(EAS_CONNECTION_ERROR, EAS_CONNECTION_ITEMOPERATIONS_ERROR_OBJECTNOTFOUND) (gdb) p *m_gerror $7 = {domain = 156, code = 36, message = 0xda2940 "GDBus.Error:org.meego.activesyncd.ItemOperationsError.ObjectNotFound: Document library - The object was not found or access denied."} */) { throwError(SE_HERE, STATUS_NOT_FOUND, "item not found: " + luid); } else { gerror.throwError(SE_HERE, StringPrintf("reading eas item %s", luid.c_str())); } } if (!tmp->data) { throwError(SE_HERE, StringPrintf("no body returned for eas item %s", luid.c_str())); } item = tmp->data; } else { item = it->second; } } void ActiveSyncSource::getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { TestingSyncSource::getSynthesisInfo(info, fragments); /** * Disable reading of existing item by engine before updating * it by pretending to do the merging ourselves. This works * as long as the local side is able to store all data that * activesyncd gives to us and updates on the ActiveSync * server. * * Probably some Exchange-specific extensions currently get * lost because activesyncd does not know how to represent * them as vCard and does not tell the ActiveSync server that * it cannot handle them. */ boost::replace_first(info.m_datastoreOptions, "true", ""); /** * no ActiveSync specific rules yet, use condensed format as * if we were storing locally, with all extensions enabled */ info.m_backendRule = "LOCALSTORAGE"; /** * access to data must be done early so that a slow sync can be * enforced when the ActiveSync sync key turns out to be * invalid */ info.m_earlyStartDataRead = true; } SE_END_CXX #endif /* ENABLE_ACTIVESYNC */ #ifdef ENABLE_MODULES # include "ActiveSyncSourceRegister.cpp" #endif syncevolution-1.5/src/backends/activesync/ActiveSyncCalendarSource.h0000644000373300001540000001213012326412403027255 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010,2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_ACTIVESYNCCALENDARSOURCE #define INCL_ACTIVESYNCCALENDARSOURCE #include #ifdef ENABLE_ACTIVESYNC #include "ActiveSyncSource.h" #include #include #include #include #include #include SE_BEGIN_CXX /** * Similar to CalDAVSource (and partly copied from it): implements * operations with one VEVENT per item in terms of operations * on items which bundle all VEVENTs with the same UID in one item. * * It works by keeping all active items as VCALENDAR icalcomponent in * memory and updating that when asked to add/update/remove VEVENTs. * The update VCALENDAR items are then stored via the base class. * * Terminology: * - easid = davLUID in CalDAVSource = ActiveSync item ID used in base ActiveSyncSource and by ActiveSync peer, * 1:1 mapping to uid * - uid = mainid in MapSyncSource = the UID shared by multiple VEVENTs * - rid = subid in MapSyncSource = RECURRENCE-ID, turned into a simple string by Event::getRid() * - luid = easid/rid concatenated by createLUID() and split with splitLUID() */ class ActiveSyncCalendarSource : public ActiveSyncCalFormatSource { public: ActiveSyncCalendarSource(const SyncSourceParams ¶ms, EasItemType type); // override operations in base class to work with luid == easid/rid instead // of just easid virtual std::string getDescription(const string &luid); virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); virtual void deleteItem(const string &luid); virtual InsertItemResult insertItem(const std::string &luid, const std::string &item); virtual void readItem(const std::string &luid, std::string &item); /** split luid into uid (first) and rid (second) */ static StringPair splitLUID(const std::string &luid); // more efficient implementation than in TestingSyncSource virtual void removeAllItems(); private: /** compose luid from mainid and subid */ static std::string createLUID(const std::string &uid, const std::string &rid); /** escape / in uid with %2F, so that splitMainIDValue() and splitLUID() can use / as separator */ static StringEscape m_escape; /** * Information about each merged item. */ class Event : boost::noncopyable { public: /** the ActiveSync ID */ std::string m_easid; /** the iCalendar 2.0 UID */ std::string m_uid; /** * the list of simplified RECURRENCE-IDs (without time zone, * see icalTime2Str()), empty string for VEVENT without * RECURRENCE-ID */ std::set m_subids; /** * parsed VCALENDAR component representing the current * state of the item as it exists on the WebDAV server, * must be kept up-to-date as we make changes, may be NULL */ eptr m_calendar; /** date-time as string, without time zone */ static std::string icalTime2Str(const icaltimetype &tt); /** RECURRENCE-ID, empty if none */ static std::string getSubID(icalcomponent *icomp); /** UID, empty if none */ static std::string getUID(icalcomponent *icomp); static void setUID(icalcomponent *icomp, const std::string &uid); }; /** * A cache of information about each merged item. Maps from * easid to Event. */ class EventCache : public std::map > { public: EventCache() : m_initialized(false) {} bool m_initialized; iterator findByUID(const std::string &uid); } m_cache; Event &findItem(const std::string &easid); Event &loadItem(const std::string &easid); Event &loadItem(Event &event); /** * create event (if necessary) and populate based on given iCalendar 2.0 VCALENDAR */ Event &setItemData(const std::string &easid, const std::string &data); /** * On-disk representation of m_cache (without the item data). * Format same as in MapSyncSource (code copied, refactor!). */ boost::shared_ptr m_trackingNode; }; SE_END_CXX #endif // ENABLE_ACTIVESYNC #endif // INCL_ACTIVESYNCCALENDARSOURCE syncevolution-1.5/src/backends/activesync/ActiveSyncCalendarSource.cpp0000664000373300001540000007036712330727742027644 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010,2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_ACTIVESYNC // include first, it sets HANDLE_LIBICAL_MEMORY for us #include #include "ActiveSyncCalendarSource.h" #include #include SE_BEGIN_CXX ActiveSyncCalendarSource::ActiveSyncCalendarSource(const SyncSourceParams ¶ms, EasItemType type) : ActiveSyncCalFormatSource(params, type) { } void ActiveSyncCalendarSource::beginSync(const std::string &lastToken, const std::string &resumeToken) { // erase content which might have been set in a previous call reset(); // claim item node for our change tracking, if not done already if (m_itemNode && !m_trackingNode) { m_trackingNode.swap(m_itemNode); } // incremental sync (non-empty token) or start from scratch setStartSyncKey(lastToken); if (lastToken.empty()) { // slow sync: wipe out cached list of IDs, will be filled anew below SE_LOG_DEBUG(getDisplayName(), "sync key empty, starting slow sync"); m_trackingNode->clear(); } else { SE_LOG_DEBUG(getDisplayName(), "sync key %s, starting incremental sync", lastToken.c_str()); // re-populate cache from storage, without any item data ConfigProps props; m_trackingNode->readProperties(props); BOOST_FOREACH(const StringPair &prop, props) { const std::string &easid = prop.first; const std::string &value = prop.second; size_t pos = value.find('/'); bool okay = false; if (pos == 0) { pos = value.find('/', 1); if (pos != value.npos) { std::string revision = m_escape.unescape(value.substr(1, pos - 1)); size_t nextpos = value.find('/', pos + 1); if (nextpos != value.npos) { std::string uid = m_escape.unescape(value.substr(pos + 1, nextpos - pos - 1)); boost::shared_ptr &eventptr = m_cache[easid]; if (!eventptr) { eventptr = boost::shared_ptr(new Event); } eventptr->m_easid = easid; eventptr->m_uid = uid; pos = nextpos; while ((nextpos = value.find('/', pos + 1)) != value.npos) { std::string subid = m_escape.unescape(value.substr(pos + 1, nextpos - pos - 1)); eventptr->m_subids.insert(subid); pos = nextpos; } okay = true; } } } if (!okay) { SE_LOG_DEBUG(getDisplayName(), "unsupported or corrupt revision entry: %s = %s", easid.c_str(), value.c_str()); } } } gboolean moreAvailable = TRUE; setCurrentSyncKey(getStartSyncKey()); // same logic as in ActiveSyncSource::beginSync() // TODO: use slow sync? bool slowSync = false; for (bool firstIteration = true; moreAvailable; firstIteration = false) { gchar *buffer = NULL; GErrorCXX gerror; EASItemsCXX created, updated; EASIdsCXX deleted; bool wasSlowSync = getCurrentSyncKey().empty(); if (!eas_sync_handler_get_items(getHandler(), getCurrentSyncKey().c_str(), &buffer, getEasType(), getFolder().c_str(), created, updated, deleted, &moreAvailable, gerror)) { if (gerror.m_gerror && /* gerror.m_gerror->domain == EAS_TYPE_CONECTION_ERROR && gerror.m_gerror->code == EAS_CONNECTION_SYNC_ERROR_INVALIDSYNCKEY && */ gerror.m_gerror->message && !strstr(gerror.m_gerror->message, "Sync error: Invalid synchronization key") && firstIteration) { // fall back to slow sync // slowSync = true; setCurrentSyncKey(""); m_trackingNode->clear(); continue; } gerror.throwError(SE_HERE, "reading ActiveSync changes"); } GStringPtr bufferOwner(buffer, "reading changes: empty sync key returned"); // TODO: Test that we really get an empty token here for an unexpected slow // sync. If not, we'll start an incremental sync here and later the engine // will ask us for older, unmodified item content which we won't have. // populate ID lists and content cache BOOST_FOREACH(EasItemInfo *item, created) { if (!item->server_id) { throwError(SE_HERE, "no server ID for new eas item"); } string easid(item->server_id); if (easid.empty()) { throwError(SE_HERE, "empty server ID for new eas item"); } SE_LOG_DEBUG(getDisplayName(), "new eas item %s", easid.c_str()); if (!item->data) { throwError(SE_HERE, StringPrintf("no body returned for new eas item %s", easid.c_str())); } Event &event = setItemData(easid, item->data); BOOST_FOREACH(const std::string &subid, event.m_subids) { SE_LOG_DEBUG(getDisplayName(), "new eas item %s = uid %s + rid %s", easid.c_str(), event.m_uid.c_str(), subid.c_str()); addItem(createLUID(easid, subid), NEW); } } BOOST_FOREACH(EasItemInfo *item, updated) { if (!item->server_id) { throwError(SE_HERE, "no server ID for updated eas item"); } string easid(item->server_id); if (easid.empty()) { throwError(SE_HERE, "empty server ID for updated eas item"); } SE_LOG_DEBUG(getDisplayName(), "updated eas item %s", easid.c_str()); if (!item->data) { throwError(SE_HERE, StringPrintf("no body returned for updated eas item %s", easid.c_str())); } Event &event = setItemData(easid, item->data); BOOST_FOREACH(const std::string &subid, event.m_subids) { SE_LOG_DEBUG(getDisplayName(), "deleted eas item %s = uid %s + rid %s", easid.c_str(), event.m_uid.c_str(), subid.c_str()); addItem(createLUID(easid, subid), UPDATED); } } BOOST_FOREACH(const char *serverID, deleted) { if (!serverID) { throwError(SE_HERE, "no server ID for deleted eas item"); } string easid(serverID); if (easid.empty()) { throwError(SE_HERE, "empty server ID for deleted eas item"); } Event &event = findItem(easid); if (event.m_subids.empty()) { SE_LOG_DEBUG(getDisplayName(), "deleted eas item %s empty?!", easid.c_str()); } else { BOOST_FOREACH(const std::string &subid, event.m_subids) { SE_LOG_DEBUG(getDisplayName(), "deleted eas item %s = uid %s + rid %s", easid.c_str(), event.m_uid.c_str(), subid.c_str()); addItem(createLUID(easid, subid), DELETED); } } m_cache.erase(easid); } // update key setCurrentSyncKey(buffer); // Google hack: if we started with an empty sync key (= slow sync) // and got no results (= existing items), then try one more time, // because Google only seems to report results when asked with // a valid sync key. As an additional sanity check make sure that // we have a valid sync key now. if (wasSlowSync && created.empty() && !getCurrentSyncKey().empty()) { moreAvailable = true; } } // now also generate full list of all current items: // old items + new (added to m_events above) - deleted (removed above) BOOST_FOREACH(const EventCache::value_type &entry, m_cache) { const std::string &easid = entry.first; const boost::shared_ptr &eventptr = entry.second; BOOST_FOREACH(const std::string &subid, eventptr->m_subids) { SE_LOG_DEBUG(getDisplayName(), "existing eas item %s = uid %s + rid %s", easid.c_str(), eventptr->m_uid.c_str(), subid.c_str()); addItem(createLUID(easid, subid), ANY); } } } std::string ActiveSyncCalendarSource::endSync(bool success) { m_trackingNode->clear(); if (success) { BOOST_FOREACH(const EventCache::value_type &entry, m_cache) { const std::string &easid = entry.first; const boost::shared_ptr &eventptr = entry.second; std::stringstream buffer; buffer << "//"; // use same format as in MapSyncSource, just in case - was '/' << m_escape.escape(ids.m_revision) << '/'; buffer << m_escape.escape(eventptr->m_uid) << '/'; BOOST_FOREACH(const std::string &subid, eventptr->m_subids) { buffer << m_escape.escape(subid) << '/'; } m_trackingNode->setProperty(easid, buffer.str()); } } else { setCurrentSyncKey(""); } // flush both nodes, just in case; in practice, the properties // end up in the same file and only get flushed once m_trackingNode->flush(); std::string newSyncKey = getCurrentSyncKey(); SE_LOG_DEBUG(getDisplayName(), "next sync key %s", newSyncKey.empty() ? "empty" : newSyncKey.c_str()); return newSyncKey; } std::string ActiveSyncCalendarSource::getDescription(const string &luid) { StringPair ids = MapSyncSource::splitLUID(luid); const std::string &easid = ids.first; const std::string &subid = ids.second; Event &event = findItem(easid); if (!event.m_calendar) { // Don't load (expensive!) only to provide the description. // Returning an empty string will trigger the fallback (logging the ID). return ""; } for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { std::string descr; const char *summary = icalcomponent_get_summary(comp); if (summary && summary[0]) { descr += summary; } if (true /* is event */) { const char *location = icalcomponent_get_location(comp); if (location && location[0]) { if (!descr.empty()) { descr += ", "; } descr += location; } } // TODO: other item types return descr; } } return ""; } ActiveSyncCalendarSource::Event &ActiveSyncCalendarSource::findItem(const std::string &easid) { EventCache::iterator it = m_cache.find(easid); if (it == m_cache.end()) { throwError(SE_HERE, STATUS_NOT_FOUND, "merged event not found: " + easid); } return *it->second; } ActiveSyncCalendarSource::Event &ActiveSyncCalendarSource::loadItem(const std::string &easid) { Event &event = findItem(easid); return loadItem(event); } ActiveSyncCalendarSource::Event &ActiveSyncCalendarSource::loadItem(Event &event) { if (!event.m_calendar) { std::string item; ActiveSyncSource::readItem(event.m_easid, item); event.m_calendar.set(icalcomponent_new_from_string((char *)item.c_str()), // hack for old libical "parsing iCalendar 2.0"); } return event; } ActiveSyncCalendarSource::Event &ActiveSyncCalendarSource::setItemData(const std::string &easid, const std::string &data) { boost::shared_ptr &eventptr = m_cache[easid]; if (eventptr) { eventptr->m_uid.clear(); eventptr->m_subids.clear(); } else { eventptr = boost::shared_ptr(new Event); } Event &event = *eventptr; event.m_easid = easid; event.m_calendar.set(icalcomponent_new_from_string((char *)data.c_str()), // hack for old libical "parsing iCalendar 2.0"); for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (event.m_uid.empty()) { event.m_uid = Event::getUID(comp); } std::string subid = Event::getSubID(comp); event.m_subids.insert(subid); } return event; } std::string ActiveSyncCalendarSource::Event::icalTime2Str(const icaltimetype &tt) { static const struct icaltimetype null = { 0 }; if (!memcmp(&tt, &null, sizeof(null))) { return ""; } else { eptr timestr(ical_strdup(icaltime_as_ical_string(tt))); if (!timestr) { SE_THROW("cannot convert to time string"); } return timestr.get(); } } std::string ActiveSyncCalendarSource::Event::getSubID(icalcomponent *comp) { struct icaltimetype rid = icalcomponent_get_recurrenceid(comp); return icalTime2Str(rid); } std::string ActiveSyncCalendarSource::Event::getUID(icalcomponent *comp) { std::string uid; icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_UID_PROPERTY); if (prop) { uid = icalproperty_get_uid(prop); } return uid; } void ActiveSyncCalendarSource::Event::setUID(icalcomponent *comp, const std::string &uid) { icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_UID_PROPERTY); if (prop) { icalproperty_set_uid(prop, uid.c_str()); } else { icalcomponent_add_property(comp, icalproperty_new_uid(uid.c_str())); } } ActiveSyncCalendarSource::EventCache::iterator ActiveSyncCalendarSource::EventCache::findByUID(const std::string &uid) { for (iterator it = begin(); it != end(); ++it) { if (it->second->m_uid == uid) { return it; } } return end(); } SyncSourceRaw::InsertItemResult ActiveSyncCalendarSource::insertItem(const std::string &luid, const std::string &item) { StringPair ids = splitLUID(luid); const std::string &callerEasID = ids.first; std::string easid = ids.first; const std::string &callerSubID = ids.second; // parse new event boost::shared_ptr newEvent(new Event); newEvent->m_calendar.set(icalcomponent_new_from_string((char *)item.c_str()), // hack for old libical "parsing iCalendar 2.0"); icalcomponent *firstcomp = NULL; for (icalcomponent *comp = firstcomp = icalcomponent_get_first_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT)) { std::string subid = Event::getSubID(comp); EventCache::iterator it; if (!luid.empty() && (it = m_cache.find(luid)) != m_cache.end()) { // Additional sanity check: ensure that the expected UID is set. // Necessary if the peer we synchronize with (aka the local // data storage) doesn't support foreign UIDs. Maemo 5 calendar // backend is one example. Event::setUID(comp, it->second->m_uid); newEvent->m_uid = it->second->m_uid; } else { newEvent->m_uid = Event::getUID(comp); if (newEvent->m_uid.empty()) { // create new UID newEvent->m_uid = UUID(); Event::setUID(comp, newEvent->m_uid); } } newEvent->m_subids.insert(subid); } if (newEvent->m_subids.size() != 1) { SE_THROW("new CalDAV item did not contain exactly one VEVENT"); } std::string subid = *newEvent->m_subids.begin(); // Determine whether we already know the merged item even though // our caller didn't. std::string knownSubID = callerSubID; if (easid.empty()) { EventCache::iterator it = m_cache.findByUID(newEvent->m_uid); if (it != m_cache.end()) { easid = it->first; knownSubID = subid; } } InsertItemResultState state = ITEM_OKAY; if (easid.empty()) { // New VEVENT; should not be part of an existing merged item // ("meeting series"). InsertItemResult res = ActiveSyncSource::insertItem("", item); easid = res.m_luid; EventCache::iterator it = m_cache.find(res.m_luid); if (it != m_cache.end()) { // merge into existing Event Event &event = loadItem(*it->second); if (event.m_subids.find(subid) != event.m_subids.end()) { // was already in that item but caller didn't seem to know state = ITEM_MERGED; } else { // add to merged item event.m_subids.insert(subid); } icalcomponent_merge_component(event.m_calendar, newEvent->m_calendar.release()); // function destroys merged calendar } else { // add to cache without further changes newEvent->m_easid = res.m_luid; m_cache[newEvent->m_easid] = newEvent; } } else { if (subid != knownSubID && !subid.empty()) { SE_THROW(StringPrintf("update for eas item %s rid %s has wrong rid %s", easid.c_str(), knownSubID.c_str(), subid.c_str())); } Event &event = findItem(easid); if (subid.empty() && subid != knownSubID) { // fix incomplete iCalendar 2.0 item: should have had a RECURRENCE-ID icalcomponent *newcomp = icalcomponent_get_first_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT); icalproperty *prop = icalcomponent_get_first_property(newcomp, ICAL_RECURRENCEID_PROPERTY); if (prop) { icalcomponent_remove_property(newcomp, prop); icalproperty_free(prop); } // reconstruct RECURRENCE-ID with known value and TZID from start time of // the parent event or (if not found) the current event eptr rid(icalproperty_new_recurrenceid(icaltime_from_string(knownSubID.c_str())), "new rid"); icalproperty *dtstart = NULL; icalcomponent *comp; // look for parent first for (comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp && !dtstart; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (!icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY)) { dtstart = icalcomponent_get_first_property(comp, ICAL_DTSTART_PROPERTY); } } // fall back to current event if (!dtstart) { dtstart = icalcomponent_get_first_property(newcomp, ICAL_DTSTART_PROPERTY); } // ignore missing TZID if (dtstart) { icalparameter *tzid = icalproperty_get_first_parameter(dtstart, ICAL_TZID_PARAMETER); if (tzid) { icalproperty_set_parameter(rid, icalparameter_new_clone(tzid)); } } // finally add RECURRENCE-ID and fix newEvent's meta information icalcomponent_add_property(newcomp, rid.release()); subid = knownSubID; newEvent->m_subids.erase(""); newEvent->m_subids.insert(subid); } if (event.m_subids.size() == 1 && *event.m_subids.begin() == subid) { // special case: no need to load old data, replace or request merge immediately event.m_calendar = newEvent->m_calendar; if (easid != callerEasID) { state = ITEM_NEEDS_MERGE; goto done; } } else { // populate event loadItem(event); // update cache: find old VEVENT and remove it before adding new one icalcomponent *removeme = NULL; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { removeme = comp; break; } } if (easid != callerEasID) { // caller didn't know final UID: if found, then tell him to // merge the items, if not, then don't complain about // it not being found (like we do when the item should exist // but doesn't) if (removeme) { state = ITEM_NEEDS_MERGE; goto done; } else { event.m_subids.insert(subid); } } else { if (removeme) { // this is what we expect when the caller mentions the ActiveSync ID icalcomponent_remove_component(event.m_calendar, removeme); icalcomponent_free(removeme); } else { // caller confused?! SE_THROW("event not found"); } } icalcomponent_merge_component(event.m_calendar, newEvent->m_calendar.release()); // function destroys merged calendar } eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); std::string data = icalstr.get(); // TODO: avoid updating item on server immediately? InsertItemResult res = ActiveSyncSource::insertItem(event.m_easid, data); if (res.m_state == ITEM_MERGED || res.m_luid != event.m_easid) { // should not merge with anything, if so, our cache was invalid SE_THROW("CalDAV item not updated as expected"); } } done: return SyncSourceRaw::InsertItemResult(createLUID(easid, subid), "", state); } void ActiveSyncCalendarSource::readItem(const std::string &luid, std::string &item) { StringPair ids = splitLUID(luid); const std::string &easid = ids.first; const std::string &subid = ids.second; Event &event = loadItem(easid); if (event.m_subids.size() == 1) { // simple case: convert existing VCALENDAR if (*event.m_subids.begin() == subid) { eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); item = icalstr.get(); } else { throwError(SE_HERE, STATUS_NOT_FOUND, "sub event not found: " + subid + " in " + easid); } } else { // complex case: create VCALENDAR with just the VTIMEZONE definition(s) // and the one event, then convert that eptr calendar(icalcomponent_new(ICAL_VCALENDAR_COMPONENT), "VCALENDAR"); for (icalcomponent *tz = icalcomponent_get_first_component(event.m_calendar, ICAL_VTIMEZONE_COMPONENT); tz; tz = icalcomponent_get_next_component(event.m_calendar, ICAL_VTIMEZONE_COMPONENT)) { eptr clone(icalcomponent_new_clone(tz), "VTIMEZONE"); icalcomponent_add_component(calendar, clone.release()); } bool found = false; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { eptr clone(icalcomponent_new_clone(comp), "VEVENT"); icalcomponent_add_component(calendar, clone.release()); found = true; break; } } if (!found) { throwError(SE_HERE, STATUS_NOT_FOUND, "sub event not found: " + subid + " in " + easid); } eptr icalstr(ical_strdup(icalcomponent_as_ical_string(calendar))); item = icalstr.get(); } } void ActiveSyncCalendarSource::deleteItem(const string &luid) { StringPair ids = splitLUID(luid); const std::string &easid = ids.first; const std::string &subid = ids.second; // find item in cache first, load only if it is not going to be // removed entirely Event &event = findItem(easid); if (event.m_subids.size() == 1) { // remove entire merged item, nothing will be left after removal if (*event.m_subids.begin() != subid) { throwError(SE_HERE, STATUS_NOT_FOUND, "sub event not found: " + subid + " in " + easid); } else { event.m_subids.clear(); event.m_calendar = NULL; ActiveSyncSource::deleteItem(ids.first); } m_cache.erase(easid); } else { loadItem(event); bool found = false; // bool parentRemoved = false; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { icalcomponent_remove_component(event.m_calendar, comp); icalcomponent_free(comp); found = true; // if (subid.empty()) { // parentRemoved = true; // } } } if (!found) { throwError(SE_HERE, STATUS_NOT_FOUND, "sub event not found: " + subid + " in " + easid); } event.m_subids.erase(subid); // TODO: avoid updating the item immediately eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); InsertItemResult res = ActiveSyncSource::insertItem(easid, icalstr.get()); if (res.m_state != ITEM_OKAY || res.m_luid != easid) { SE_THROW("unexpected result of removing sub event"); } } } void ActiveSyncCalendarSource::removeAllItems() { BOOST_FOREACH(const EventCache::value_type &entry, m_cache) { ActiveSyncSource::deleteItem(entry.first); } m_cache.clear(); } std::string ActiveSyncCalendarSource::createLUID(const std::string &uid, const std::string &subid) { std::string luid = m_escape.escape(uid); if (!subid.empty()) { luid += '/'; luid += m_escape.escape(subid); } return luid; } std::pair ActiveSyncCalendarSource::splitLUID(const std::string &luid) { size_t index = luid.find('/'); if (index != luid.npos) { return make_pair(m_escape.unescape(luid.substr(0, index)), m_escape.unescape(luid.substr(index + 1))); } else { return make_pair(m_escape.unescape(luid), ""); } } StringEscape ActiveSyncCalendarSource::m_escape('%', "/"); SE_END_CXX #endif // ENABLE_ACTIVESYNC syncevolution-1.5/src/backends/akonadi/0000755000373300037200000000000012424707641021652 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/akonadi/configure-sub.in0000644000373300001540000000435512326412403024571 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. AC_CHECK_PROGS([QMAKE], [qmake qmake-qt4]) # Check for Akonadi. There is no .pc file for it, # so fall back to normal header file and library checking. # kdepimlibs5-dev >= 4.3 provides the necessary files. AKONADIFOUND=yes if ! test "$KDEPIM_CFLAGS"; then KDEPIM_CFLAGS="-I`kde4-config --path include` -I`kde4-config --path include`/KDE" if test "$QMAKE"; then KDEPIM_CFLAGS="$KDEPIM_CFLAGS -I`$QMAKE -query QT_INSTALL_HEADERS` -I`$QMAKE -query QT_INSTALL_HEADERS`/QtCore" fi fi if ! test "$KDEPIM_LIBS"; then KDEPIM_LIBS="-L`kde4-config --install lib` -lakonadi-kde `pkg-config --libs QtDBus` -lQtCore -lkdeui -lkdecore" fi AC_LANG_PUSH(C++) old_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $KDEPIM_CFLAGS" AC_CHECK_HEADERS(Akonadi/Collection, [], [AKONADIFOUND=no]) CPPFLAGS="$old_CPPFLAGS" AC_LANG_POP(C++) # In contrast to the Evolution backend, the Akonadi backend is # currently considered optional. "configure" will enable it only # if explicitly enabled (was turned on automatically previously, # for example on Ubuntu Hardy, and didn't compile). SE_ARG_ENABLE_BACKEND(akonadi, akonadi, [AS_HELP_STRING([--disable-akonadi], [disable access to Akonadi (default is to use it if akonadi.pc is found)])], [enable_akonadi="$enableval" test $AKONADIFOUND = "yes" || test $enable_akonadi = "no" || AC_MSG_ERROR([akonadi.pc not found. Install it to compile with the Akonadi backend enabled.])], [enable_akonadi=no] ) if test "$enable_akonadi" = "yes"; then # conditional compilation in preprocessor AC_DEFINE(ENABLE_AKONADI, 1, [Akonadi available]) else # avoid unneeded dependencies on Akonadi KDEPIM_CFLAGS= KDEPIM_LIBS= fi AC_SUBST(KDEPIM_LIBS) AC_SUBST(KDEPIM_CFLAGS) # conditional compilation in make AM_CONDITIONAL([ENABLE_AKONADI], [test "$enable_akonadi" = "yes"]) # let others include Akonadi backend's header file # (not strictly necessary, could be avoided by not # including Akonadi header files in public header file # of source) BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $KDEPIM_CFLAGS" syncevolution-1.5/src/backends/akonadi/README0000664000373300001540000000314712405555067022365 0ustar00nightlynightly00000000000000Getting started with Akonadi on Debian testing: aptitude install libakonadi-dev akonadi-server \ libqt4-dev kdepim-runtime \ akonadiconsole \ kdepimlibs5-dev Controlling Akonadi server: akonadictl start/stop/restart Debugging Akonadi: akonadiconsole Configuring without Evolution and with Akonadi: /syncevolution/configure --with-synthesis-src=/libsynthesis \ CFLAGS="-g -Wall -Werror -Wno-unknown-pragmas" \ CXXFLAGS="-g -Wall -Werror -Wno-unknown-pragmas" \ --disable-shared --enable-static \ --enable-libcurl \ --enable-unit-tests --enable-integration-tests \ --disable-ecal --disable-ebook --disable-libsoup \ --enable-akonadi --enable-kwallet This creates src/syncevolution and src/client-test which can be run under a debugger directly. Query databases: syncevolution Configuring syncevolution for contacts with Akonadi as backend: syncevolution --configure --datastore-property sync=none \ --sync-property username=... \ --sync-property password=... \ scheduleworld syncevolution --configure --datastore-property sync=two-way \ --datastore-property type=kde-contacts \ --datastore-property evolutionsource=akonadi:?... \ scheduleworld addressbook Initial run: syncevolution --sync slow scheduleworld addressbook All following runs: syncevolution scheduleworld syncevolution-1.5/src/backends/akonadi/AkonadiSyncSourceRegister.cpp0000644000373300001540000003641112326412403027264 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "akonadisyncsource.h" #include #include "test.h" #include #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe; isMe = sourceType.m_backend == "KDE Address Book"; if (isMe /* || sourceType.m_backend == "addressbook" */) { if (sourceType.m_format == "" || sourceType.m_format == "text/vcard" || sourceType.m_format == "text/x-vcard") { return #ifdef ENABLE_AKONADI new AkonadiContactSource(params) #else isMe ? RegisterSyncSource::InactiveSource(params) : NULL #endif ; } else { return NULL; } } isMe = sourceType.m_backend == "KDE Task List"; if (isMe /* || sourceType.m_backend == "todo" */) { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar" || sourceType.m_format == "text/x-vcalendar") { return #ifdef ENABLE_AKONADI new AkonadiTaskSource(params) #else isMe ? RegisterSyncSource::InactiveSource(params) : NULL #endif ; } else { return NULL; } } isMe = sourceType.m_backend == "KDE Memos"; if (isMe /* || sourceType.m_backend == "memo" */) { if (sourceType.m_format == "" || sourceType.m_format == "text/plain") { return #ifdef ENABLE_AKONADI new AkonadiMemoSource(params) #else isMe ? RegisterSyncSource::InactiveSource(params) : NULL #endif ; } else { return NULL; } } isMe = sourceType.m_backend == "KDE Calendar"; if (isMe /* || sourceType.m_backend == "calendar" */) { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar" || sourceType.m_format == "text/x-vcalendar" /* this is for backwards compatibility with broken configs */ ) { return #ifdef ENABLE_AKONADI new AkonadiCalendarSource(params) #else isMe ? RegisterSyncSource::InactiveSource(params) : NULL #endif ; } else { return NULL; } } return NULL; } static RegisterSyncSource registerMe("KDE Contact/Calendar/Task List/Memos", #ifdef ENABLE_AKONADI true, #else false, #endif createSource, "KDE Address Book = KDE Contacts = addressbook = contacts = kde-contacts\n" " vCard 2.1 (default) = text/x-vcard\n" " vCard 3.0 = text/vcard\n" " The later is the internal format of KDE and preferred with\n" " servers that support it. One such server is ScheduleWorld\n" " together with the \"card3\" uri.\n" "KDE Calendar = calendar = events = kde-events\n" " iCalendar 2.0 (default) = text/calendar\n" " vCalendar 1.0 = text/x-calendar\n" "KDE Task List = KDE Tasks = todo = tasks = kde-tasks\n" " iCalendar 2.0 (default) = text/calendar\n" " vCalendar 1.0 = text/x-calendar\n" "KDE Memos = memo = memos = kde-memos\n" " plain text in UTF-8 (default) = text/plain\n", Values() + (Aliases("KDE Address Book") + "KDE Contacts" + "kde-contacts") + (Aliases("KDE Calendar") + "kde-calendar") + (Aliases("KDE Task List") + "KDE Tasks" + "kde-tasks") + (Aliases("KDE Memos") + "kde-memos")); #ifdef ENABLE_AKONADI #ifdef ENABLE_UNIT_TESTS class AkonadiTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(AkonadiTest); CPPUNIT_TEST(testInstantiate); // There is no default database in Akonadi: // CPPUNIT_TEST(testOpenDefaultCalendar); // CPPUNIT_TEST(testOpenDefaultTodo); // CPPUNIT_TEST(testOpenDefaultMemo); // Besides, don't enable tests which depend on running Akonadi, // because that would cause "client-test SyncEvolution" unless // Akonadi was started first: // CPPUNIT_TEST(testTimezones); CPPUNIT_TEST_SUITE_END(); protected: static string addItem(boost::shared_ptr source, string &data) { SyncSourceRaw::InsertItemResult res = source->insertItemRaw("", data); return res.m_luid; } void testInstantiate() { boost::shared_ptr source; // source.reset(SyncSource::createTestingSource("addressbook", "addressbook", true)); // source.reset(SyncSource::createTestingSource("addressbook", "contacts", true)); source.reset(SyncSource::createTestingSource("addressbook", "kde-contacts", true)); source.reset(SyncSource::createTestingSource("addressbook", "KDE Contacts", true)); source.reset(SyncSource::createTestingSource("addressbook", "KDE Address Book:text/x-vcard", true)); source.reset(SyncSource::createTestingSource("addressbook", "KDE Address Book:text/vcard", true)); // source.reset(SyncSource::createTestingSource("calendar", "calendar", true)); source.reset(SyncSource::createTestingSource("calendar", "kde-calendar", true)); source.reset(SyncSource::createTestingSource("calendar", "KDE Calendar:text/calendar", true)); // source.reset(SyncSource::createTestingSource("tasks", "tasks", true)); source.reset(SyncSource::createTestingSource("tasks", "kde-tasks", true)); source.reset(SyncSource::createTestingSource("tasks", "KDE Tasks", true)); source.reset(SyncSource::createTestingSource("tasks", "KDE Task List:text/calendar", true)); // source.reset(SyncSource::createTestingSource("memos", "memos", true)); source.reset(SyncSource::createTestingSource("memos", "kde-memos", true)); source.reset(SyncSource::createTestingSource("memos", "KDE Memos:text/plain", true)); } // TODO: support default databases // void testOpenDefaultAddressBook() { // boost::shared_ptr source; // source.reset((TestingSyncSource *)SyncSource::createTestingSource("contacts", "kde-contacts", true, NULL)); // CPPUNIT_ASSERT_NO_THROW(source->open()); // } // void testOpenDefaultCalendar() { // boost::shared_ptr source; // source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "kde-calendar", true, NULL)); // CPPUNIT_ASSERT_NO_THROW(source->open()); // } // void testOpenDefaultTodo() { // boost::shared_ptr source; // source.reset((TestingSyncSource *)SyncSource::createTestingSource("tasks", "kde-tasks", true, NULL)); // CPPUNIT_ASSERT_NO_THROW(source->open()); // } // void testOpenDefaultMemo() { // boost::shared_ptr source; // source.reset((TestingSyncSource *)SyncSource::createTestingSource("memos", "kde-memos", true, NULL)); // CPPUNIT_ASSERT_NO_THROW(source->open()); // } void testTimezones() { const char *prefix = getenv("CLIENT_TEST_EVOLUTION_PREFIX"); if (!prefix) { prefix = "SyncEvolution_Test_"; } boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("eds_event", "kde-calendar", true, prefix)); CPPUNIT_ASSERT_NO_THROW(source->open()); string newyork = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:America/New_York\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:-0400\n" "TZOFFSETTO:-0500\n" "TZNAME:EST\n" "DTSTART:19701025T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:-0500\n" "TZOFFSETTO:-0400\n" "TZNAME:EDT\n" "DTSTART:19700405T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\n" "END:DAYLIGHT\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:artificial\n" "DTSTAMP:20060416T205224Z\n" "DTSTART;TZID=America/New_York:20060406T140000\n" "DTEND;TZID=America/New_York:20060406T143000\n" "TRANSP:OPAQUE\n" "SEQUENCE:2\n" "SUMMARY:timezone New York with custom definition\n" "DESCRIPTION:timezone New York with custom definition\n" "CLASS:PUBLIC\n" "CREATED:20060416T205301Z\n" "LAST-MODIFIED:20060416T205301Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; string luid; CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, newyork)); string newyork_suffix = newyork; boost::replace_first(newyork_suffix, "UID:artificial", "UID:artificial-2"); boost::replace_all(newyork_suffix, "TZID:America/New_York", "TZID://FOOBAR/America/New_York-SUFFIX"); CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, newyork_suffix)); string notimezone = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:artificial-3\n" "DTSTAMP:20060416T205224Z\n" "DTSTART;TZID=America/New_York:20060406T140000\n" "DTEND;TZID=America/New_York:20060406T143000\n" "TRANSP:OPAQUE\n" "SEQUENCE:2\n" "SUMMARY:timezone New York without custom definition\n" "DESCRIPTION:timezone New York without custom definition\n" "CLASS:PUBLIC\n" "CREATED:20060416T205301Z\n" "LAST-MODIFIED:20060416T205301Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, notimezone)); // fake VTIMEZONE where daylight saving starts on first Sunday in March string fake_march = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:FAKE\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:-0400\n" "TZOFFSETTO:-0500\n" "TZNAME:EST MARCH\n" "DTSTART:19701025T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:-0500\n" "TZOFFSETTO:-0400\n" "TZNAME:EDT\n" "DTSTART:19700405T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=3\n" "END:DAYLIGHT\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:artificial-4\n" "DTSTAMP:20060416T205224Z\n" "DTSTART;TZID=FAKE:20060406T140000\n" "DTEND;TZID=FAKE:20060406T143000\n" "TRANSP:OPAQUE\n" "SEQUENCE:2\n" "SUMMARY:fake timezone with daylight starting in March\n" "CLASS:PUBLIC\n" "CREATED:20060416T205301Z\n" "LAST-MODIFIED:20060416T205301Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_march)); string fake_may = fake_march; boost::replace_first(fake_may, "UID:artificial-4", "UID:artificial-5"); boost::replace_first(fake_may, "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=3", "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=5"); boost::replace_first(fake_may, "starting in March", "starting in May"); boost::replace_first(fake_may, "TZNAME:EST MARCH", "TZNAME:EST MAY"); CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_may)); // insert again, shouldn't re-add timezone CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_may)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(AkonadiTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif static class vCard30Test : public RegisterSyncSourceTest { public: vCard30Test() : RegisterSyncSourceTest("kde_contact", "eds_contact") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "kde-contacts"; } } vCard30Test; static class iCal20Test : public RegisterSyncSourceTest { public: iCal20Test() : RegisterSyncSourceTest("kde_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "kde-calendar"; // Looks like iCalendar file resource in Akonadi 1.11.0 does // not actually enforce iCalendar 2.0 semantic. It allows // updating of events with no UID // (testLinkedItemsInsertBothUpdateChildNoIDs) // and fails to detect double-adds (testInsertTwice). // TODO: this should better be fixed. config.m_sourceKnowsItemSemantic = false; } } iCal20Test; static class iTodo20Test : public RegisterSyncSourceTest { public: iTodo20Test() : RegisterSyncSourceTest("kde_task", "eds_task") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "kde-tasks"; // See above. config.m_sourceKnowsItemSemantic = false; } } iTodo20Test; static class MemoTest : public RegisterSyncSourceTest { public: MemoTest() : RegisterSyncSourceTest("kde_memo", "eds_memo") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "KDE Memos"; // use an alias here to test that } } memoTest; } #endif // ENABLE_AKONADI SE_END_CXX syncevolution-1.5/src/backends/akonadi/akonadi.am0000644000373300001540000000173412326412403023414 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ src/backends/akonadi/configure-sub.in \ src/backends/akonadi/README src_backends_akonadi_lib = src/backends/akonadi/syncakonadi.la MOSTLYCLEANFILES += $(src_backends_akonadi_lib) if ENABLE_MODULES src_backends_akonadi_backenddir = $(BACKENDS_DIRECTORY) src_backends_akonadi_backend_LTLIBRARIES = $(src_backends_akonadi_lib) else noinst_LTLIBRARIES += $(src_backends_akonadi_lib) endif src_backends_akonadi_syncakonadi_la_SOURCES = \ src/backends/akonadi/akonadisyncsource.h \ src/backends/akonadi/akonadisyncsource.cpp src_backends_akonadi_syncakonadi_la_LIBADD = $(KDEPIM_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_akonadi_syncakonadi_la_LDFLAGS = -module -avoid-version src_backends_akonadi_syncakonadi_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) src_backends_akonadi_syncakonadi_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_akonadi_syncakonadi_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/akonadi/akonadisyncsource.h0000644000373300001540000001352512326412403025365 0ustar00nightlynightly00000000000000/* Copyright (c) 2009 Sascha Peilicke This application is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this application; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef AKONADISYNCSOURCE_H #define AKONADISYNCSOURCE_H #include "config.h" #ifdef ENABLE_AKONADI #include #include #include #include #include SE_BEGIN_CXX class TimeTrackingObserver; /** * General purpose Akonadi Sync Source. Choosing the type of data is * done when instantiating it, using the Akonadi MIME subtypes. * Payload is always using the native Akonadi format (no special "raw" * and "engine" formats). * * Change tracking is done via the item uid/revision attributes. * * Databases (collections in Akonadi terminology) are selected via * their int64 ID number. */ class AkonadiSyncSource : public TrackingSyncSource { public: /** * @param submime the MIME type string used by Akonadi * to identify contacts, tasks, events, etc. * @param params the SyncEvolution source parameters */ AkonadiSyncSource(const char *submime, const SyncSourceParams ¶ms); virtual ~AkonadiSyncSource(); /* methods that have to be implemented to complete TrackingSyncSource */ virtual Databases getDatabases(); virtual void open(); virtual void listAllItems(SyncSourceRevisions::RevisionMap_t &revisions); virtual InsertItemResult insertItem(const std::string &luid, const std::string &item, bool raw); virtual void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &luid); virtual void close(); virtual bool isEmpty(); private: void start(); protected: Akonadi::Collection m_collection; /** * MIME types(s) of items, from submime constructor parameter. * Only one format is supported, but it may have different aliases (for example, * application/x-vnd.kde.notes == application/x-vnd.akonadi.note). */ QStringList m_mimeTypes; /** * The actual type to be used inside the collection. Set after opening * the collection. */ QString m_contentMimeType; }; class AkonadiContactSource : public AkonadiSyncSource { public: AkonadiContactSource(const SyncSourceParams ¶ms) : AkonadiSyncSource("text/directory", params) { } virtual std::string getMimeType() const { return "text/vcard"; } virtual std::string getMimeVersion() const { return "3.0"; } void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { TrackingSyncSource::getSynthesisInfo(info, fragments); /** enable the KDE X- extensions in the Synthesis<->backend conversion */ info.m_backendRule = "KDE"; /* * Disable the default VCARD_BEFOREWRITE_SCRIPT_EVOLUTION. * If any KDE-specific transformations via such a script * are needed, it can be named here and then defined by appending * to the fragments. */ info.m_beforeWriteScript = ""; // "$VCARD_BEFOREWRITE_SCRIPT_KDE;"; // fragments.m_datatypes["VCARD_BEFOREWRITE_SCRIPT_KDE"] = ""; } }; class AkonadiCalendarSource : public AkonadiSyncSource { public: AkonadiCalendarSource(const SyncSourceParams ¶ms) : AkonadiSyncSource("application/x-vnd.akonadi.calendar.event", params) { } // TODO: the items are expected to be complete VCALENDAR with // all necessary VTIMEZONEs and one VEVENT (here) resp. VTODO // (AkonadiTodoSource). Not sure what we get from Akonadi. virtual std::string getMimeType() const { return "text/calendar"; } virtual std::string getMimeVersion() const { return "2.0"; } }; class AkonadiTaskSource : public AkonadiSyncSource { public: AkonadiTaskSource(const SyncSourceParams ¶ms) : AkonadiSyncSource("application/x-vnd.akonadi.calendar.todo", params) { } virtual std::string getMimeType() const { return "text/calendar"; } virtual std::string getMimeVersion() const { return "2.0"; } }; class AkonadiMemoSource : public AkonadiSyncSource { private: QString toKJots(QString data); QString toSynthesis(QString data); public: AkonadiMemoSource(const SyncSourceParams ¶ms) : AkonadiSyncSource("text/x-vnd.akonadi.note,application/x-vnd.kde.notes", params) { } // TODO: the AkonadiMemoSource is expected to import/export // plain text with the summary in the first line; currently // the AkonadiSyncSource will use VJOURNAL // Also Currently there is no application which uses akonadi backend // to display notes: probably work for knote?? virtual std::string getMimeType() const { return "text/plain"; } virtual std::string getMimeVersion() const { return "1.0"; } virtual InsertItemResult insertItem(const std::string &luid, const std::string &item, bool raw); virtual void readItem(const std::string &luid, std::string &item, bool raw); }; SE_END_CXX #endif // ENABLE_AKONADI #endif // AKONADISYNCSOURCE_H syncevolution-1.5/src/backends/akonadi/akonadisyncsource.cpp0000664000373300001540000003365612330727742025743 0ustar00nightlynightly00000000000000/* Copyright (c) 2009 Sascha Peilicke This application is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This application 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this application; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "akonadisyncsource.h" #ifdef ENABLE_AKONADI #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX using namespace Akonadi; /** * We take over ownership of jobs by storing them in smart pointers * (RAII). This is how SyncEvolution does things and more predictable * than assuming that a future exec() call will auto-delete them as * part of its event processing. * * To avoid double frees, we need to disable auto-deletion. * This method does that. Use like this: * std::auto_ptr statisticsJob(DisableAutoDelete(new CollectionStatisticsJob(m_collection))); */ template J *DisableAutoDelete(J *job) { job->setAutoDelete(false); return job; } AkonadiSyncSource::AkonadiSyncSource(const char *submime, const SyncSourceParams ¶ms) : TrackingSyncSource(params) { m_mimeTypes = QString(submime).split(",", QString::SkipEmptyParts); } AkonadiSyncSource::~AkonadiSyncSource() { } bool AkonadiSyncSource::isEmpty() { if (!GRunIsMain()) { bool result; GRunInMain(boost::lambda::var(result) = boost::lambda::bind(&AkonadiSyncSource::isEmpty, this)); return result; } //To Check if the respective collection is Empty, without actually loading the collections std::auto_ptr statisticsJob(DisableAutoDelete(new CollectionStatisticsJob(m_collection))); if (!statisticsJob->exec()) { throwError(SE_HERE, "Error fetching the collection stats"); } return statisticsJob->statistics().count() == 0; } void AkonadiSyncSource::start() { if (!GRunIsMain()) { GRunInMain(boost::bind(&AkonadiSyncSource::start, this)); return; } // Check for Akonadi server. if (!Akonadi::ServerManager::isRunning()) { // Don't try to start it. A normal KDE user should have it already // running. Users of other desktop systems probably don't want it // to run, if they have it installed at all. // // Starting it here also produces output that we don't want mixed // into normal SyncEvolution command line output. #if 0 SE_LOG_DEBUG(NULL, "Akonadi Server isn't running, and hence starting it."); if (!Akonadi::Control::start()) { SE_THROW("Couldn't Start Akonadi Server: hence the akonadi backend of syncevolution wont work .."); } #else SE_THROW("Akonadi is not running. It can be started with 'akonadictl start'."); #endif } } SyncSource::Databases AkonadiSyncSource::getDatabases() { if (!GRunIsMain()) { Databases result; GRunInMain(boost::lambda::var(result) = boost::lambda::bind(&AkonadiSyncSource::getDatabases, this)); return result; } start(); Databases res; // Insert databases which match the "type" of the source, including a user-visible // description and a database IDs. Exactly one of the databases should be marked // as the default one used by the source. // res.push_back("Contacts", "some-KDE-specific-ID", isDefault); std::auto_ptr fetchJob(DisableAutoDelete(new CollectionFetchJob(Collection::root(), CollectionFetchJob::Recursive))); fetchJob->fetchScope().setContentMimeTypes(m_mimeTypes); if (!fetchJob->exec()) { throwError(SE_HERE, "cannot list collections"); } // Currently, the first collection of the right type is the default // This decision should go to the GUI: which deals with sync profiles. bool isFirst = true; Collection::List collections = fetchJob->collections(); foreach (const Collection &collection, collections) { res.push_back(Database(collection.name().toUtf8().constData(), collection.url().url().toUtf8().constData(), isFirst)); isFirst = false; } return res; } void AkonadiSyncSource::open() { if (!GRunIsMain()) { GRunInMain(boost::bind(&AkonadiSyncSource::open, this)); return; } start(); // the "evolutionsource" property, empty for default, // otherwise the collection URL or a name string id = getDatabaseID(); // hack for testing: use first resp. second database if (boost::starts_with(id, "Test_")) { Databases databases = getDatabases(); ssize_t index = -1; if (boost::ends_with(id, "_1")) { index = 0; } else if (boost::ends_with(id, "_2")) { index = 1; } if (index >= 0) { if (databases.size() <= (size_t)index) { SE_THROW("need two Akonadi resources for testing"); } id = databases[index].m_uri; SE_LOG_DEBUG(NULL, "testing Akonadi with %s", id.c_str()); } } if (!boost::starts_with(id, "akonadi:")) { // TODO: support selection by name and empty ID for default SE_THROW("database must be selected via database = akonadi:?collection="); } m_collection = Collection::fromUrl(KUrl(id.c_str())); // Verify that the collection exists and ensure that // m_collection.contentMimeTypes() returns valid information. The // collection constructed so far only contains the collection ID. std::auto_ptr fetchJob(DisableAutoDelete(new CollectionFetchJob(m_collection, CollectionFetchJob::Base))); if (!fetchJob->exec()) { throwError(SE_HERE, StringPrintf("cannot fetch collection %s", id.c_str())); } Collection::List collections = fetchJob->collections(); if (collections.isEmpty()) { throwError(SE_HERE, StringPrintf("collection %s not found", id.c_str())); } m_collection = collections.front(); m_contentMimeType = ""; QStringList collectionMimeTypes = m_collection.contentMimeTypes(); foreach (const QString &mimeType, m_mimeTypes) { if (collectionMimeTypes.contains(mimeType)) { m_contentMimeType = mimeType; break; } } if (m_contentMimeType.isEmpty()) { throwError(SE_HERE, StringPrintf("Resource %s cannot store items of type(s) %s. It can only store %s.", id.c_str(), m_mimeTypes.join(",").toUtf8().constData(), collectionMimeTypes.join(",").toUtf8().constData())); } } void AkonadiSyncSource::listAllItems(SyncSourceRevisions::RevisionMap_t &revisions) { if (!GRunIsMain()) { GRunInMain(boost::bind(&AkonadiSyncSource::listAllItems, this, boost::ref(revisions))); return; } // copy all local IDs and the corresponding revision std::auto_ptr fetchJob(DisableAutoDelete(new ItemFetchJob(m_collection))); if (!fetchJob->exec()) { throwError(SE_HERE, "listing items"); } BOOST_FOREACH (const Item &item, fetchJob->items()) { // Filter out items which don't have the right type (for example, VTODO when // syncing events) if (m_mimeTypes.contains(item.mimeType())) { revisions[QByteArray::number(item.id()).constData()] = QByteArray::number(item.revision()).constData(); } } } void AkonadiSyncSource::close() { // TODO: close collection!? } TrackingSyncSource::InsertItemResult AkonadiSyncSource::insertItem(const std::string &luid, const std::string &data, bool raw) { if (!GRunIsMain()) { InsertItemResult result; GRunInMain(boost::lambda::var(result) = boost::lambda::bind(&AkonadiSyncSource::insertItem, this, boost::cref(luid), boost::cref(data), raw)); return result; } Item item; if (luid.empty()) { item.setMimeType(m_mimeTypes.front()); item.setPayloadFromData(QByteArray(data.c_str())); std::auto_ptr createJob(DisableAutoDelete(new ItemCreateJob(item, m_collection))); if (!createJob->exec()) { throwError(SE_HERE, string("storing new item ") + luid); return InsertItemResult("", "", ITEM_OKAY); } item = createJob->item(); } else { Entity::Id syncItemId = QByteArray(luid.c_str()).toLongLong(); std::auto_ptr fetchJob(DisableAutoDelete(new ItemFetchJob(Item(syncItemId)))); if (!fetchJob->exec()) { throwError(SE_HERE, string("checking item ") + luid); } item = fetchJob->items().first(); item.setPayloadFromData(QByteArray(data.c_str())); std::auto_ptr modifyJob(DisableAutoDelete(new ItemModifyJob(item))); // TODO: SyncEvolution must pass the known revision that // we are updating. // TODO: check that the item has not been updated in the meantime if (!modifyJob->exec()) { throwError(SE_HERE, string("updating item ") + luid); return InsertItemResult("", "", ITEM_OKAY); } item = modifyJob->item(); } // Read-only datastores may not have actually added something here! // The Jobs themselves throw errors, and hence the return statements // above will take care of this return InsertItemResult(QByteArray::number(item.id()).constData(), QByteArray::number(item.revision()).constData(), ITEM_OKAY); } void AkonadiSyncSource::removeItem(const string &luid) { if (!GRunIsMain()) { GRunInMain(boost::bind(&AkonadiSyncSource::removeItem, this, boost::cref(luid))); return; } Entity::Id syncItemId = QByteArray(luid.c_str()).toLongLong(); // Delete the item from our collection // TODO: check that the revision is right (need revision from SyncEvolution) std::auto_ptr deleteJob(DisableAutoDelete(new ItemDeleteJob(Item(syncItemId)))); if (!deleteJob->exec()) { throwError(SE_HERE, string("deleting item " ) + luid); } } void AkonadiSyncSource::readItem(const std::string &luid, std::string &data, bool raw) { if (!GRunIsMain()) { GRunInMain(boost::bind(&AkonadiSyncSource::readItem, this, boost::cref(luid), boost::ref(data), raw)); return; } Entity::Id syncItemId = QByteArray(luid.c_str()).toLongLong(); std::auto_ptr fetchJob(DisableAutoDelete(new ItemFetchJob(Item(syncItemId)))); fetchJob->fetchScope().fetchFullPayload(); if (fetchJob->exec()) { if (fetchJob->items().empty()) { throwError(SE_HERE, STATUS_NOT_FOUND, string("extracting item ") + luid); } QByteArray payload = fetchJob->items().first().payloadData(); data.assign(payload.constData(), payload.size()); } else { throwError(SE_HERE, string("extracting item " ) + luid); } } QString AkonadiMemoSource::toKJots(QString data){ // KJots stores it's resource in the format //Subject: Hello World //Content-Type: text/plain <------- always plain text for the akonadi resource //Date: Wed, 30 Mar 2011 01:02:48 +0530 <----date created //MIME-Version: 1.0 <----- always the same // <---- This line break seperates the content from the information // QString subject = "Subject: "; QString contentType = "Content-Type: text/plain"; QString dateTime = QDateTime::currentDateTime().toString(Qt::ISODate); QString mimeVersion = "MIME-Version: 1.0"; QString content; QStringList lines = data.split('\n'); subject += lines.first(); content = data.remove(0,data.indexOf('\n')+1); QString result = subject + '\n' + contentType + '\n' + dateTime + '\n'+ mimeVersion + "\n\n"+ content; return result; } QString AkonadiMemoSource::toSynthesis(QString data){ //Synthesis expects Plain Text in the form Subject + "\n" + Content QString subject; QString content; subject = data.split('\n').first(); subject.remove("Subject: "); content = data.remove(0,data.indexOf("\n\n")+2); return subject+'\n'+content; } void AkonadiMemoSource::readItem(const std::string &luid, std::string &data, bool raw) { AkonadiSyncSource::readItem(luid, data, raw); data = toSynthesis(QString::fromStdString(data)).toStdString(); } TrackingSyncSource::InsertItemResult AkonadiMemoSource::insertItem(const std::string &luid, const std::string &data, bool raw) { std::string formattedData = toKJots(QString::fromStdString(data)).toStdString(); return AkonadiSyncSource::insertItem(luid, formattedData , raw); } SE_END_CXX #endif // ENABLE_AKONADI #ifdef ENABLE_MODULES # include "AkonadiSyncSourceRegister.cpp" #endif syncevolution-1.5/src/backends/evolution/0000755000373300037200000000000012424707641022270 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/evolution/configure-sub.in0000644000373300001540000001035612326412403025205 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. anymissing=" Please install the development packages of Evolution and/or set the PKG_CONFIG_PATH variable so that it points towards the .pc files of libedataserver, libecal and libebook (the latter two are optional). You can check that these packages are available by running pkg-config --list-all." evomissing="No compatible evolution-data-server was found. $anymissing" dnl check for Evolution packages PKG_CHECK_MODULES(EPACKAGE, libedataserver-1.2, EDSFOUND=yes, [EDSFOUND=no]) PKG_CHECK_MODULES(ECAL, libecal-1.2, ECALFOUND=yes, [ECALFOUND=no]) PKG_CHECK_MODULES(EBOOK, libebook-1.2, EBOOKFOUND=yes, [EBOOKFOUND=no]) PKG_CHECK_MODULES(EBOOK_VERSION, [libebook-1.2 >= 3.3], [AC_DEFINE(HAVE_E_CONTACT_INLINE_LOCAL_PHOTOS, 1, [have e_contact_inline_local_photos()])], [true]) SE_ARG_ENABLE_BACKEND(ebook, evolution, [AS_HELP_STRING([--disable-ebook], [disable access to Evolution addressbooks (must be used to compile without it)])], [enable_ebook="$enableval"], [test "$EBOOKFOUND" = "yes" && enable_ebook="yes" || AC_MSG_ERROR([libebook not found. Use --disable-ebook to compile without or install the necessary development files.])] ) SE_ARG_ENABLE_BACKEND(ecal, evolution, [AS_HELP_STRING([--disable-ecal], [disable access to Evolution calendars and tasks (must be used to compile without it)])], [enable_ecal="$enableval"], [test "$ECALFOUND" = "yes" && enable_ecal="yes" || AC_MSG_ERROR([libecal not found. Use --disable-ecal to compile without or install the necessary development files.])] ) enable_evo="no" if test "$enable_ebook" = "yes"; then test "x${EBOOKFOUND}" = "xyes" || AC_MSG_ERROR([--enable-ebook requires pkg-config information for libebook, which was not found]) AC_DEFINE(ENABLE_EBOOK, 1, [libebook available]) enable_evo="yes" else EBOOK_CFLAGS= EBOOK_LIBS= fi AM_CONDITIONAL([ENABLE_ECAL], [test "$enable_ecal" = "yes"]) if test "$enable_ecal" = "yes"; then need_ical="yes" test "x${ECALFOUND}" = "xyes" || AC_MSG_ERROR([--enable-ecal requires pkg-config information for libecal, which was not found"]) AC_DEFINE(ENABLE_ECAL, 1, [libecal available]) enable_evo="yes" else ECAL_CFLAGS= ECAL_LIBS= fi if test "$enable_evo" = "yes"; then need_glib="yes" if test "$EDSFOUND" = "yes"; then AC_DEFINE(HAVE_EDS, 1, [evolution-dataserver available]) else AC_MSG_ERROR($evomissing) fi # Only the EClient code supports the API in EDS 3.5.x. PKG_CHECK_MODULES(EDS_VERSION, [libedataserver-1.2 >= 3.5], [AC_DEFINE(USE_EDS_CLIENT, 1, [use e_book/cal_client_* calls]) # Was used for a while (ESourceBackendSummarySetup), but not anymore. # Don't depend on it, it wasn't in 3.6 yet. # PKG_CHECK_MODULES(EBOOKCONTACTS, libebook-contacts-1.2) AC_CHECK_LIB(ebook-1.2, e_book_client_new_direct, [AC_DEFINE(HAVE_E_BOOK_CLIENT_NEW_DIRECT, 1, [use e_book_client_new_direct])], [true], [$EDS_VERSION_LIBS]) AC_CHECK_LIB(ebook-1.2, e_book_client_connect_direct_sync, [AC_DEFINE(HAVE_E_BOOK_CLIENT_CONNECT_DIRECT_SYNC, 1, [use e_book_client_connect_direct_sync])], [true], [$EDS_VERSION_LIBS]) ], [CFLAGS_old="$CFLAGS" CFLAGS="$CFLAGS $EPACKAGE_CFLAGS" AC_CHECK_HEADERS(libedataserver/eds-version.h) CFLAGS="$CFLAGS_old"]) else EPACKAGE_CFLAGS= EPACKAGE_LIBS= fi BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $EPACKAGE_CFLAGS $ECAL_CFLAGS $EBOOK_CFLAGS $EBOOKCONTACTS_CFLAGS" syncevolution-1.5/src/backends/evolution/EvolutionCalendarSourceRegister.cpp0000644000373300001540000003364312326412403031121 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "EvolutionCalendarSource.h" #include "EvolutionMemoSource.h" #include "test.h" #include #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe; bool enabled; EDSAbiWrapperInit(); enabled = EDSAbiHaveEcal && EDSAbiHaveEdataserver; isMe = sourceType.m_backend == "Evolution Task List"; if (isMe || sourceType.m_backend == "todo") { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar" || sourceType.m_format == "text/x-calendar" || sourceType.m_format == "text/x-vcalendar") { return #ifdef ENABLE_ECAL enabled ? new EvolutionCalendarSource(EVOLUTION_CAL_SOURCE_TYPE_TASKS, params) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } } isMe = sourceType.m_backend == "Evolution Memos"; if (isMe || sourceType.m_backend == "memo") { if (sourceType.m_format == "" || sourceType.m_format == "text/plain") { return #ifdef ENABLE_ECAL enabled ? new EvolutionMemoSource(params) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } else if (sourceType.m_format == "text/calendar") { return #ifdef ENABLE_ECAL enabled ? new EvolutionCalendarSource(EVOLUTION_CAL_SOURCE_TYPE_MEMOS, params) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } else { return NULL; } } isMe = sourceType.m_backend == "Evolution Calendar"; if (isMe || sourceType.m_backend == "calendar") { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar" || sourceType.m_format == "text/x-calendar" || sourceType.m_format == "text/x-vcalendar") { return #ifdef ENABLE_ECAL enabled ? new EvolutionCalendarSource(EVOLUTION_CAL_SOURCE_TYPE_EVENTS, params) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } else { return NULL; } } return NULL; } static RegisterSyncSource registerMe("Evolution Calendar/Task List/Memos", #ifdef ENABLE_ECAL true, #else false, #endif createSource, "Evolution Calendar = calendar = events = evolution-events\n" " iCalendar 2.0 (default) = text/calendar\n" " vCalendar 1.0 = text/x-vcalendar\n" "Evolution Task List = Evolution Tasks = todo = tasks = evolution-tasks\n" " iCalendar 2.0 (default) = text/calendar\n" " vCalendar 1.0 = text/x-vcalendar\n" "Evolution Memos = memo = memos = evolution-memos\n" " plain text in UTF-8 (default) = text/plain\n" " iCalendar 2.0 = text/calendar\n" " vCalendar 1.0 = text/x-vcalendar\n" " The later format is not tested because none of the\n" " supported SyncML servers accepts it.\n", Values() + (Aliases("Evolution Calendar") + "evolution-calendar") + (Aliases("Evolution Task List") + "Evolution Tasks" + "evolution-tasks") + (Aliases("Evolution Memos") + "evolution-memos")); #ifdef ENABLE_ECAL #ifdef ENABLE_UNIT_TESTS class EvolutionCalendarTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(EvolutionCalendarTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST(testOpenDefaultCalendar); CPPUNIT_TEST(testOpenDefaultTodo); CPPUNIT_TEST(testOpenDefaultMemo); CPPUNIT_TEST(testTimezones); CPPUNIT_TEST_SUITE_END(); protected: static string addItem(boost::shared_ptr source, string &data) { SyncSourceRaw::InsertItemResult res = source->insertItemRaw("", data); return res.m_luid; } void testInstantiate() { boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "calendar", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "evolution-calendar", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "Evolution Calendar:text/calendar", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "tasks", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "evolution-tasks", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "Evolution Tasks", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "Evolution Task List:text/calendar", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "memos", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "evolution-memos", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "Evolution Memos:text/plain", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "Evolution Memos:text/calendar", true)); } void testOpenDefaultCalendar() { boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "evolution-calendar", true, NULL)); CPPUNIT_ASSERT_NO_THROW(source->open()); } void testOpenDefaultTodo() { boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "evolution-tasks", true, NULL)); CPPUNIT_ASSERT_NO_THROW(source->open()); } void testOpenDefaultMemo() { boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("calendar", "evolution-memos", true, NULL)); CPPUNIT_ASSERT_NO_THROW(source->open()); } void testTimezones() { const char *prefix = getenv("CLIENT_TEST_EVOLUTION_PREFIX"); if (!prefix) { prefix = "SyncEvolution_Test_"; } boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("eds_event", "evolution-calendar", true, prefix)); CPPUNIT_ASSERT_NO_THROW(source->open()); string newyork = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:America/New_York\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:-0400\n" "TZOFFSETTO:-0500\n" "TZNAME:EST\n" "DTSTART:19701025T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:-0500\n" "TZOFFSETTO:-0400\n" "TZNAME:EDT\n" "DTSTART:19700405T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\n" "END:DAYLIGHT\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:artificial\n" "DTSTAMP:20060416T205224Z\n" "DTSTART;TZID=America/New_York:20060406T140000\n" "DTEND;TZID=America/New_York:20060406T143000\n" "TRANSP:OPAQUE\n" "SEQUENCE:2\n" "SUMMARY:timezone New York with custom definition\n" "DESCRIPTION:timezone New York with custom definition\n" "CLASS:PUBLIC\n" "CREATED:20060416T205301Z\n" "LAST-MODIFIED:20060416T205301Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; string luid; CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, newyork)); string newyork_suffix = newyork; boost::replace_first(newyork_suffix, "UID:artificial", "UID:artificial-2"); boost::replace_all(newyork_suffix, "TZID:America/New_York", "TZID://FOOBAR/America/New_York-SUFFIX"); CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, newyork_suffix)); string notimezone = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:artificial-3\n" "DTSTAMP:20060416T205224Z\n" "DTSTART;TZID=America/New_York:20060406T140000\n" "DTEND;TZID=America/New_York:20060406T143000\n" "TRANSP:OPAQUE\n" "SEQUENCE:2\n" "SUMMARY:timezone New York without custom definition\n" "DESCRIPTION:timezone New York without custom definition\n" "CLASS:PUBLIC\n" "CREATED:20060416T205301Z\n" "LAST-MODIFIED:20060416T205301Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, notimezone)); // fake VTIMEZONE where daylight saving starts on first Sunday in March string fake_march = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:FAKE\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:-0400\n" "TZOFFSETTO:-0500\n" "TZNAME:EST MARCH\n" "DTSTART:19701025T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:-0500\n" "TZOFFSETTO:-0400\n" "TZNAME:EDT\n" "DTSTART:19700405T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=3\n" "END:DAYLIGHT\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:artificial-4\n" "DTSTAMP:20060416T205224Z\n" "DTSTART;TZID=FAKE:20060406T140000\n" "DTEND;TZID=FAKE:20060406T143000\n" "TRANSP:OPAQUE\n" "SEQUENCE:2\n" "SUMMARY:fake timezone with daylight starting in March\n" "CLASS:PUBLIC\n" "CREATED:20060416T205301Z\n" "LAST-MODIFIED:20060416T205301Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_march)); string fake_may = fake_march; boost::replace_first(fake_may, "UID:artificial-4", "UID:artificial-5"); boost::replace_first(fake_may, "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=3", "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=5"); boost::replace_first(fake_may, "starting in March", "starting in May"); boost::replace_first(fake_may, "TZNAME:EST MARCH", "TZNAME:EST MAY"); CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_may)); // insert again, shouldn't re-add timezone CPPUNIT_ASSERT_NO_THROW(luid = addItem(source, fake_may)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(EvolutionCalendarTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif static class iCal20Test : public RegisterSyncSourceTest { public: iCal20Test() : RegisterSyncSourceTest("eds_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "evolution-calendar"; } } iCal20Test; static class iTodo20Test : public RegisterSyncSourceTest { public: iTodo20Test() : RegisterSyncSourceTest("eds_task", "eds_task") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "evolution-tasks"; } } iTodo20Test; static class SuperTest : public RegisterSyncSourceTest { public: SuperTest() : RegisterSyncSourceTest("calendar+todo", "calendar+todo") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "virtual:text/x-vcalendar"; config.m_subConfigs = "eds_event,eds_task"; } } superTest; static class MemoTest : public RegisterSyncSourceTest { public: MemoTest() : RegisterSyncSourceTest("eds_memo", "eds_memo") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "Evolution Memos"; // use an alias here to test that } } memoTest; } #endif // ENABLE_ECAL SE_END_CXX syncevolution-1.5/src/backends/evolution/EvolutionContactSourceRegister.cpp0000644000373300001540000001602112326412403030772 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "EvolutionContactSource.h" #include "test.h" #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe = sourceType.m_backend == "Evolution Address Book"; bool maybeMe = sourceType.m_backend == "addressbook"; bool enabled; EDSAbiWrapperInit(); enabled = EDSAbiHaveEbook && EDSAbiHaveEdataserver; if (isMe || maybeMe) { if (sourceType.m_format == "text/x-vcard") { return #ifdef ENABLE_EBOOK enabled ? new EvolutionContactSource(params, EVC_FORMAT_VCARD_21) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } else if (sourceType.m_format == "" || sourceType.m_format == "text/vcard") { return #ifdef ENABLE_EBOOK enabled ? new EvolutionContactSource(params, EVC_FORMAT_VCARD_30) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } } return NULL; } static RegisterSyncSource registerMe("Evolution Address Book", #ifdef ENABLE_EBOOK true, #else false, #endif createSource, "Evolution Address Book = Evolution Contacts = addressbook = contacts = evolution-contacts\n" " vCard 2.1 = text/x-vcard\n" " vCard 3.0 (default) = text/vcard\n" " The later is the internal format of Evolution and preferred with\n" " servers that support it.", Values() + (Aliases("Evolution Address Book") + "Evolution Contacts" + "evolution-contacts")); #ifdef ENABLE_EBOOK #ifdef ENABLE_UNIT_TESTS class EvolutionContactTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(EvolutionContactTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST(testImport); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("addressbook", "addressbook", true)); source.reset(SyncSource::createTestingSource("addressbook", "contacts", true)); source.reset(SyncSource::createTestingSource("addressbook", "evolution-contacts", true)); source.reset(SyncSource::createTestingSource("addressbook", "Evolution Contacts", true)); source.reset(SyncSource::createTestingSource("addressbook", "Evolution Address Book:text/x-vcard", true)); source.reset(SyncSource::createTestingSource("addressbook", "Evolution Address Book:text/vcard", true)); } /** * Tests parsing of contacts as they might be send by certain servers. * This complements the actual testing with real servers and might cover * cases not occurring with servers that are actively tested against. */ void testImport() { // this only tests that we can instantiate something under the type "addressbook"; // it might not be an EvolutionContactSource boost::shared_ptr source21(dynamic_cast(SyncSource::createTestingSource("evolutioncontactsource21", "evolution-contacts:text/x-vcard", true))); boost::shared_ptr source30(dynamic_cast(SyncSource::createTestingSource("evolutioncontactsource30", "Evolution Address Book:text/vcard", true))); string parsed; #if 0 // TODO: enable testing of incoming items again. Right now preparse() doesn't // do anything and needs to be replaced with Synthesis mechanisms. // SF bug 1796086: sync with EGW: lost or messed up telephones parsed = "BEGIN:VCARD\r\nVERSION:3.0\r\nTEL;CELL:cell\r\nEND:VCARD\r\n"; CPPUNIT_ASSERT_EQUAL(parsed, preparse(*source21, "BEGIN:VCARD\nVERSION:2.1\nTEL;CELL:cell\nEND:VCARD\n", "text/x-vcard")); parsed = "BEGIN:VCARD\r\nVERSION:3.0\r\nTEL;TYPE=CAR:car\r\nEND:VCARD\r\n"; CPPUNIT_ASSERT_EQUAL(parsed, preparse(*source21, "BEGIN:VCARD\nVERSION:2.1\nTEL;TYPE=CAR:car\nEND:VCARD\n", "text/x-vcard")); parsed = "BEGIN:VCARD\r\nVERSION:3.0\r\nTEL;TYPE=HOME:home\r\nEND:VCARD\r\n"; CPPUNIT_ASSERT_EQUAL(parsed, preparse(*source21, "BEGIN:VCARD\nVERSION:2.1\nTEL:home\nEND:VCARD\n", "text/x-vcard")); // TYPE=PARCEL not supported by Evolution, used to represent Evolutions TYPE=OTHER parsed = "BEGIN:VCARD\r\nVERSION:3.0\r\nTEL;TYPE=OTHER:other\r\nEND:VCARD\r\n"; CPPUNIT_ASSERT_EQUAL(parsed, preparse(*source21, "BEGIN:VCARD\nVERSION:2.1\nTEL;TYPE=PARCEL:other\nEND:VCARD\n", "text/x-vcard")); parsed = "BEGIN:VCARD\r\nVERSION:3.0\r\nTEL;TYPE=HOME;TYPE=VOICE:cell\r\nEND:VCARD\r\n"; CPPUNIT_ASSERT_EQUAL(parsed, preparse(*source21, "BEGIN:VCARD\nVERSION:2.1\nTEL;TYPE=HOME,VOICE:cell\nEND:VCARD\n", "text/x-vcard")); #endif } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(EvolutionContactTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif static class VCard30Test : public RegisterSyncSourceTest { public: VCard30Test() : RegisterSyncSourceTest("eds_contact", "eds_contact") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "evolution-contacts:text/vcard"; config.m_update = config.m_genericUpdate; // this property gets re-added by EDS and thus cannot be removed config.m_essentialProperties.insert("X-EVOLUTION-FILE-AS"); } } vCard30Test; } #endif // ENABLE_EBOOK SE_END_CXX syncevolution-1.5/src/backends/evolution/evolution.am0000664000373300001540000000544212405555067024466 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/evolution/configure-sub.in src_backends_evolution_lib = src/backends/evolution/syncecal.la src/backends/evolution/syncebook.la MOSTLYCLEANFILES += $(src_backends_evolution_lib) if ENABLE_MODULES src_backends_evolution_backenddir = $(BACKENDS_DIRECTORY) src_backends_evolution_backend_LTLIBRARIES = $(src_backends_evolution_lib) else noinst_LTLIBRARIES += $(src_backends_evolution_lib) endif src_backends_evolution_syncecal_src = \ src/backends/evolution/EvolutionSyncSource.h \ src/backends/evolution/EvolutionSyncSource.cpp \ src/backends/evolution/EvolutionCalendarSource.h \ src/backends/evolution/EvolutionMemoSource.h \ src/backends/evolution/EvolutionCalendarSource.cpp \ $(NOP) if ENABLE_ECAL src_backends_evolution_syncecal_src += \ src/backends/evolution/e-cal-check-timezones.c \ src/backends/evolution/e-cal-check-timezones.h endif src_backends_evolution_syncebook_src = \ src/backends/evolution/EvolutionSyncSource.h \ src/backends/evolution/EvolutionSyncSource.cpp \ src/backends/evolution/EvolutionContactSource.h \ src/backends/evolution/EvolutionContactSource.cpp src_backends_evolution_cppflags = \ $(SYNCEVOLUTION_CFLAGS) \ -I$(top_srcdir)/test \ $(BACKEND_CPPFLAGS) \ -I$(top_srcdir)/src/backends/evolution src_backends_evolution_syncecal_la_SOURCES = $(src_backends_evolution_syncecal_src) # $(EBOOKCONTACTS_LIBS) is needed for ESourceBackendSummary, which we # use in EvolutionSyncSource and thus in syncecal. src_backends_evolution_syncecal_la_LIBADD = $(ECAL_LIBS) $(EBOOKCONTACTS_LIBS) $(SYNCEVOLUTION_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS) # _GNU_SOURCE and -ldl for libical.c + dlsym(): src_backends_evolution_syncecal_la_CPPFLAGS = -D_GNU_SOURCE \ -De_cal_check_timezones=syncevolution_check_timezones \ -De_cal_tzlookup_ecal=syncevolution_tzlookup_ecal \ -De_cal_tzlookup_icomp=syncevolution_tzlookup_icomp \ -De_cal_match_tzid=syncevolution_match_tzid \ $(src_backends_evolution_cppflags) src_backends_evolution_syncecal_la_LDFLAGS = -module -avoid-version -ldl src_backends_evolution_syncecal_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) src_backends_evolution_syncecal_la_DEPENDENCIES = src/syncevo/libsyncevolution.la src_backends_evolution_syncebook_la_SOURCES = $(src_backends_evolution_syncebook_src) src_backends_evolution_syncebook_la_LIBADD = $(EBOOK_LIBS) $(EBOOKCONTACTS_LIBS) $(SYNCEVOLUTION_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS) src_backends_evolution_syncebook_la_LDFLAGS = -module -avoid-version src_backends_evolution_syncebook_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) src_backends_evolution_syncebook_la_CPPFLAGS = $(src_backends_evolution_cppflags) src_backends_evolution_syncebook_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/evolution/EvolutionSyncSource.h0000664000373300001540000001116312330727742026271 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTIONSYNCSOURCE #define INCL_EVOLUTIONSYNCSOURCE #include #include #include #include #if defined(HAVE_EDS) # if defined(USE_EDS_CLIENT) # include # else SE_GOBJECT_TYPE(ESourceList) #endif #endif SE_BEGIN_CXX /** * The base class for all Evolution backends. * Same as TrackingSyncSource plus some Evolution * specific helper methods. */ class EvolutionSyncSource : public TrackingSyncSource { public: /** * Creates a new Evolution sync source. */ EvolutionSyncSource(const SyncSourceParams ¶ms, int granularitySeconds = 1) : TrackingSyncSource(params, granularitySeconds) { } void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { TrackingSyncSource::getSynthesisInfo(info, fragments); info.m_backendRule = "EVOLUTION"; } protected: #ifdef HAVE_EDS #ifdef USE_EDS_CLIENT void getDatabasesFromRegistry(SyncSource::Databases &result, const char *extension, ESource *(*getDef)(ESourceRegistry *)); EClientCXX openESource(const char *extension, ESource *(*refBuiltin)(ESourceRegistry *), const boost::function &newClient); // Implementation of SyncSource calls which only works when using EDS Client API // and EDS > 3.4. Older EDS has no way of creating sources easily (or at all). virtual Database createDatabase(const Database &database); virtual void deleteDatabase(const std::string &uri, RemoveData removeData); /** E_SOURCE_EXTENSION_ADDRESS_BOOK, etc. */ virtual const char *sourceExtension() const = 0; /** reference the system address book, calendar, etc. */ virtual ESourceCXX refSystemDB() const = 0; #endif /** * searches the list for a source with the given uri or name * * @param list a list previously obtained from Gnome * @param id a string identifying the data source: either its name or uri * @return pointer to source (caller owns reference) or NULL if not found */ ESource *findSource(const ESourceListCXX &list, const string &id); #endif public: #ifdef HAVE_EDS using SyncSourceBase::throwError; /** * throw an exception after an operation failed and * remember that this instance has failed * * output format: : : * * @param action a string describing the operation or object involved * @param gerror a more detailed description of the failure, * may be empty */ void throwError(const SourceLocation &where, const string &action, GErrorCXX &gerror); #endif }; /** * Utility class which hides the mechanisms needed to handle events * during asynchronous calls. */ class EvolutionAsync { public: EvolutionAsync() { m_loop = GMainLoopStealCXX(g_main_loop_new(NULL, TRUE)); } /** start processing events */ void run() { if (g_main_context_is_owner(g_main_context_default())) { g_main_loop_run(m_loop.get()); } else { // Let master thread handle events. while (g_main_loop_is_running(m_loop.get())) { Sleep(0.1); } } } /** stop processing events, to be called inside run() by callback */ void quit() { g_main_loop_quit(m_loop.get()); } private: GMainLoopCXX m_loop; }; SE_END_CXX #endif // INCL_EVOLUTIONSYNCSOURCE syncevolution-1.5/src/backends/evolution/EvolutionSyncSource.cpp0000664000373300001540000003303412330727742026625 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "EvolutionSyncSource.h" #include #include #include #ifdef USE_EDS_CLIENT #include SE_GLIB_TYPE(GKeyFile, g_key_file) #endif #include SE_BEGIN_CXX #ifdef HAVE_EDS #ifdef USE_EDS_CLIENT void EvolutionSyncSource::getDatabasesFromRegistry(SyncSource::Databases &result, const char *extension, ESource *(*refDef)(ESourceRegistry *)) { ESourceRegistryCXX registry = EDSRegistryLoader::getESourceRegistry(); ESourceListCXX sources(e_source_registry_list_sources(registry, extension)); ESourceCXX def(refDef ? refDef(registry) : NULL, TRANSFER_REF); BOOST_FOREACH (ESource *source, sources) { result.push_back(Database(e_source_get_display_name(source), e_source_get_uid(source), e_source_equal(def, source))); } } static void handleErrorCB(EClient */*client*/, const gchar *error_msg, gpointer user_data) { EvolutionSyncSource *that = static_cast(user_data); SE_LOG_ERROR(that->getDisplayName(), "%s", error_msg); } EClientCXX EvolutionSyncSource::openESource(const char *extension, ESource *(*refBuiltin)(ESourceRegistry *), const boost::function &newClient) { EClientCXX client; GErrorCXX gerror; ESourceRegistryCXX registry = EDSRegistryLoader::getESourceRegistry(); ESourceListCXX sources(e_source_registry_list_sources(registry, extension)); string id = getDatabaseID(); ESource *source = findSource(sources, id); bool created = false; if (!source) { if (refBuiltin && (id.empty() || id == "<>")) { ESourceCXX builtin(refBuiltin(registry), TRANSFER_REF); client = EClientCXX::steal(newClient(builtin, gerror)); // } else if (!id.compare(0, 7, "file://")) { // TODO: create source // m_calendar = ECalClientCXX::steal(e_cal_client_new_from_uri(id.c_str(), sourceType(), gerror)); } else { throwError(SE_HERE, string("database not found: '") + id + "'"); } created = true; } else { client = EClientCXX::steal(newClient(source, gerror)); } if (!client) { throwError(SE_HERE, "accessing database", gerror); } // Listen for errors g_signal_connect (client, "backend-error", G_CALLBACK(handleErrorCB), this); g_signal_connect_after(client, "backend-died", G_CALLBACK(Exception::fatalError), (void *)"Evolution Data Server has died unexpectedly."); while (true) { // Always allow EDS to create the database. "only-if-exists = // true" does not make sense. if (!e_client_open_sync(client, false, NULL, gerror)) { if (gerror && g_error_matches(gerror, E_CLIENT_ERROR, E_CLIENT_ERROR_BUSY)) { gerror.clear(); sleep(1); } else if (created) { // Opening newly created address books often failed in // old EDS releases - try again. Probably covered by // more recently added E_CLIENT_ERROR_BUSY check above. gerror.clear(); sleep(5); } else { throwError(SE_HERE, "opening database", gerror); } } else { // Success! break; } } // record result for SyncSource::getDatabase() source = e_client_get_source(client); if (source) { Database database(e_source_get_display_name(source), e_source_get_uid(source)); setDatabase(database); } return client; } SyncSource::Database EvolutionSyncSource::createDatabase(const Database &database) { // We'll need this later. Create it before doing any real work. ESourceRegistryCXX registry = EDSRegistryLoader::getESourceRegistry(); // Clone the system DB. This allows the distro to change the // configuration (backend, extensions (= in particular // the contacts DB summary fields)) without having to // modify SyncEvolution. ESourceCXX systemSource = refSystemDB(); gsize len; PlainGStr ini(e_source_to_string(systemSource, &len)); // Modify the entries in the key file directly. We can't // instantiate an ESource (no API for it), copying the values from // the key file into a fresh ESource is difficult (would have to // reimplement EDS internal encoding/decoding), and copying from // systemSource is hard (don't know which extensions it has, // cannot instantiate extensions of unknown types, because // e_source_get_extension() only works for types that were // created). static const char *mainSection = "Data Source"; GKeyFileCXX keyfile(g_key_file_new(), TRANSFER_REF); GErrorCXX gerror; if (!g_key_file_load_from_data(keyfile, ini, len, G_KEY_FILE_NONE, gerror)) { gerror.throwError(SE_HERE, "parsing ESource .ini data"); } PlainGStrArray keys(g_key_file_get_keys(keyfile, mainSection, NULL, gerror)); if (!keys) { gerror.throwError(SE_HERE, "listing keys in main section"); } for (int i = 0; keys.at(i); i++) { if (boost::starts_with(keys.at(i), "DisplayName[")) { if (!g_key_file_remove_key(keyfile, mainSection, keys.at(i), gerror)) { gerror.throwError(SE_HERE, "remove key"); } } } g_key_file_set_string(keyfile, mainSection, "DisplayName", database.m_name.c_str()); g_key_file_set_boolean(keyfile, mainSection, "Enabled", true); ini = g_key_file_to_data(keyfile, &len, NULL); const char *configDir = g_get_user_config_dir(); int fd; std::string filename; std::string uid; // Create sources dir. It might have been removed (for example, while // testing) without having been recreated by evolution-source-registry. std::string sourceDir = StringPrintf("%s/evolution/sources", configDir); mkdir_p(sourceDir); // Create unique ID if necessary. while (true) { uid = database.m_uri.empty() ? UUID() : database.m_uri; filename = StringPrintf("%s/%s.source", sourceDir.c_str(), uid.c_str()); fd = ::open(filename.c_str(), O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR); if (fd >= 0) { break; } if (errno == EEXIST) { if (!database.m_uri.empty()) { SE_THROW(StringPrintf("ESource UUID %s already in use", database.m_uri.c_str())); } else { // try again with new random UUID } } else { SE_THROW(StringPrintf("creating %s failed: %s", filename.c_str(), strerror(errno))); } } ssize_t written = write(fd, ini.get(), len); int res = ::close(fd); if (written != (ssize_t)len || res) { SE_THROW(StringPrintf("writing to %s failed: %s", filename.c_str(), strerror(errno))); } // We need to wait until ESourceRegistry notices the new file. SE_LOG_DEBUG(getDisplayName(), "waiting for ESourceRegistry to notice new ESource %s", uid.c_str()); while (!ESourceCXX(e_source_registry_ref_source(registry, uid.c_str()), TRANSFER_REF)) { // This will block forever if called from the non-main-thread. // Don't do that... g_main_context_iteration(NULL, true); } SE_LOG_DEBUG(getDisplayName(), "ESourceRegistry has new ESource %s", uid.c_str()); // Try triggering that by attempting to create an ESource with the same // UUID. Does not work! evolution-source-registry simply overwrites the // file that we created earlier. // ESourceCXX source(e_source_new_with_uid(uid.c_str(), // NULL, gerror), // TRANSFER_REF); // e_source_set_display_name(source, "syncevolution-fake"); // e_source_set_parent(source, "local-stub"); // ESourceListCXX sources; // sources.push_back(source.ref()); // ESourceListCXX unrefs sources it points to // if (!e_source_registry_create_sources_sync(registry, // sources, // NULL, // gerror)) { // gerror.throwError(SE_HERE, StringPrintf("creating EDS database of type %s with name '%s'%s%s", // sourceExtension(), // database.m_name.c_str(), // database.m_uri.empty() ? "" : " and URI ", // database.m_uri.c_str())); // } else { // SE_THROW("creating syncevolution-fake ESource succeeded although it should have failed"); // } return Database(database.m_name, uid); } void EvolutionSyncSource::deleteDatabase(const std::string &uri, RemoveData removeData) { ESourceRegistryCXX registry = EDSRegistryLoader::getESourceRegistry(); ESourceCXX source(e_source_registry_ref_source(registry, uri.c_str()), TRANSFER_REF); if (!source) { throwError(SE_HERE, StringPrintf("EDS database with URI '%s' cannot be deleted, does not exist", uri.c_str())); } GErrorCXX gerror; if (!e_source_remove_sync(source, NULL, gerror)) { throwError(SE_HERE, StringPrintf("deleting EDS database with URI '%s'", uri.c_str()), gerror); } if (removeData == REMOVE_DATA_FORCE) { // Don't wait for evolution-source-registry cache-reaper to // run, instead remove files ourselves. The reaper runs only // once per day and also only moves the data into a trash // folder, were it would linger until finally removed after 30 // days. // // This is equivalent to "rm -rf $XDG_DATA_HOME/evolution/*/". std::string basedir = StringPrintf("%s/evolution", g_get_user_data_dir()); if (isDir(basedir)) { BOOST_FOREACH (const std::string &kind, ReadDir(basedir)) { std::string subdir = basedir + "/" + kind; if (isDir(subdir)) { BOOST_FOREACH (const std::string &source, ReadDir(subdir)) { // We assume that the UUID of the database // consists only of characters which can be // used in the directory name, i.e., no // special encoding of the directory name. if (source == uri) { rm_r(subdir + "/" + source); // Keep searching, just in case, although // there should only be one. } } } } } } } #endif // USE_EDS_CLIENT ESource *EvolutionSyncSource::findSource(const ESourceListCXX &list, const string &id ) { string finalID; if (!id.empty()) { finalID = id; } else { // Nothing selected specifically, use the one marked as default. BOOST_FOREACH(const Database &db, getDatabases()) { if (db.m_isDefault) { finalID = db.m_uri; break; } } } #ifdef USE_EDS_CLIENT BOOST_FOREACH (ESource *source, list) { bool found = !finalID.compare(e_source_get_display_name(source)) || !finalID.compare(e_source_get_uid(source)); if (found) { return source; } } #else for (GSList *g = e_source_list_peek_groups (list.get()); g; g = g->next) { ESourceGroup *group = E_SOURCE_GROUP (g->data); GSList *s; for (s = e_source_group_peek_sources (group); s; s = s->next) { ESource *source = E_SOURCE (s->data); GStringPtr uri(e_source_get_uri(source)); bool found = finalID.empty() || !finalID.compare(e_source_peek_name(source)) || (uri && !finalID.compare(uri)); if (found) { return source; } } } #endif return NULL; } void EvolutionSyncSource::throwError(const SourceLocation &where, const string &action, GErrorCXX &gerror) { string gerrorstr; if (gerror) { gerrorstr += ": "; gerrorstr += gerror->message; } else { gerrorstr = ": failure"; } throwError(where, action + gerrorstr); } #endif // HAVE_EDS SE_END_CXX syncevolution-1.5/src/backends/evolution/EvolutionContactSource.h0000644000373300001540000002116312326412403026735 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTIONCONTACTSOURCE #define INCL_EVOLUTIONCONTACTSOURCE #include "config.h" #include "EvolutionSyncSource.h" #include #include #include #ifdef ENABLE_EBOOK #include #include #ifdef USE_EDS_CLIENT SE_GOBJECT_TYPE(EBookClient) SE_GOBJECT_TYPE(EBookClientView) #endif SE_GOBJECT_TYPE(EContact) SE_BEGIN_CXX class ContactCache; /** * Implements access to Evolution address books. */ class EvolutionContactSource : public EvolutionSyncSource, public SyncSourceLogging, private boost::noncopyable { public: EvolutionContactSource(const SyncSourceParams ¶ms, EVCardFormat vcardFormat = EVC_FORMAT_VCARD_30); virtual ~EvolutionContactSource(); // // implementation of SyncSource // virtual Databases getDatabases(); virtual void open(); virtual bool isEmpty(); virtual void close(); virtual std::string getMimeType() const; virtual std::string getMimeVersion() const; protected: // // implementation of TrackingSyncSource callbacks // virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &uid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &uid); // implementation of SyncSourceLogging callback virtual std::string getDescription(const string &luid); // need to override native format: it is always vCard 3.0 void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { EvolutionSyncSource::getSynthesisInfo(info, fragments); info.m_profile = "\"vCard\", 2"; info.m_native = "vCard30EDS"; // Replace normal vCard30 and vCard21 types with the // EDS flavors which apply EDS specific transformations *before* // letting the engine process the incoming item. This ensures // that during a slow sync, modified (!) incoming item and // DB item really match. Otherwise the engine compares unmodified // incoming item and modified DB item, finding a mismatch caused // by the transformations, and writes an item which ends up being // identical to the one which is in the DB. boost::replace_all(info.m_datatypes, "vCard30", "vCard30EDS"); boost::replace_all(info.m_datatypes, "vCard21", "vCard21EDS"); // Redundant when the same transformations are already applied to // incoming items. But disabling it does not improve performance much, // so keep it enabled just to be on the safe side. info.m_beforeWriteScript = "$VCARD_BEFOREWRITE_SCRIPT_EVOLUTION;"; info.m_afterReadScript = "$VCARD_AFTERREAD_SCRIPT_EVOLUTION;"; } #ifdef USE_EDS_CLIENT virtual const char *sourceExtension() const { return E_SOURCE_EXTENSION_ADDRESS_BOOK; } virtual ESourceCXX refSystemDB() const { return ESourceCXX(e_source_registry_ref_builtin_address_book(EDSRegistryLoader::getESourceRegistry()), TRANSFER_REF); } #endif private: /** extract REV string for contact, throw error if not found */ std::string getRevision(const std::string &uid); /** valid after open(): the address book that this source references */ #ifdef USE_EDS_CLIENT EBookClientCXX m_addressbook; enum AccessMode { SYNCHRONOUS, BATCHED, DEFAULT } m_accessMode; InitState m_asyncOpCounter; enum AsyncStatus { MODIFYING, /**< insert or update request sent */ REVISION, /**< asked for revision */ DONE /**< finished successfully or with failure, depending on m_gerror */ }; struct Pending { std::string m_name; EContactCXX m_contact; std::string m_uid; std::string m_revision; AsyncStatus m_status; GErrorCXX m_gerror; Pending() : m_status(MODIFYING) {} }; typedef std::list< boost::shared_ptr >PendingContainer_t; /** * Batched "contact add/update" operations. * Delete is not batched because we need per-item status * information - see removeItem(). */ PendingContainer_t m_batchedAdd; PendingContainer_t m_batchedUpdate; InitState m_numRunningOperations; InsertItemResult checkBatchedInsert(const boost::shared_ptr &pending); void completedAdd(const boost::shared_ptr &batched, gboolean success, /* const GStringListFreeCXX &uids */ GSList *uids, const GError *gerror) throw (); void completedUpdate(const boost::shared_ptr &batched, gboolean success, const GError *gerror) throw (); virtual void flushItemChanges(); virtual void finishItemChanges(); // Read-ahead of item data. boost::shared_ptr m_contactCache, m_contactCacheNext; int m_cacheMisses, m_cacheStalls; int m_contactReads; /**< number of readItemAsKey() calls */ int m_contactsFromDB; /**< number of contacts requested from DB (including ones not found) */ int m_contactQueries; /**< total number of e_book_client_get_contacts() calls */ ReadAheadOrder m_readAheadOrder; ReadAheadItems m_nextLUIDs; void checkCacheForError(boost::shared_ptr &cache); void invalidateCachedContact(const std::string &luid); void invalidateCachedContact(boost::shared_ptr &cache, const std::string &luid); bool getContact(const string &luid, EContact **contact, GErrorCXX &gerror); bool getContactFromCache(const string &luid, EContact **contact, GErrorCXX &gerror); enum ReadingMode { START, /**< luid is needed, must be read */ CONTINUE /**< luid is from old request, find next ones */ }; boost::shared_ptr startReading(const std::string &luid, ReadingMode mode); void completedRead(const boost::weak_ptr &cachePtr, gboolean success, GSList *contactsPtr, const GError *gerror) throw(); void logCacheStats(Logger::Level level); // Use the information provided to us to implement read-ahead efficiently. virtual void setReadAheadOrder(ReadAheadOrder order, const ReadAheadItems &luids); virtual void getReadAheadOrder(ReadAheadOrder &order, ReadAheadItems &luids); #else eptr m_addressbook; #endif /** the format of vcards that new items are expected to have */ const EVCardFormat m_vcardFormat; /** * a list of Evolution vcard properties which have to be encoded * as X-SYNCEVOLUTION-* when sending to server in 2.1 and decoded * back when receiving. */ static const class extensions : public set { public: extensions() : prefix("X-SYNCEVOLUTION-") { this->insert("FBURL"); this->insert("CALURI"); } const string prefix; } m_vcardExtensions; /** * a list of properties which SyncEvolution (in contrast to * the server) will only store once in each contact */ static const class unique : public set { public: unique () { insert("X-AIM"); insert("X-GROUPWISE"); insert("X-ICQ"); insert("X-YAHOO"); insert("X-EVOLUTION-ANNIVERSARY"); insert("X-EVOLUTION-ASSISTANT"); insert("X-EVOLUTION-BLOG-URL"); insert("X-EVOLUTION-FILE-AS"); insert("X-EVOLUTION-MANAGER"); insert("X-EVOLUTION-SPOUSE"); insert("X-EVOLUTION-VIDEO-URL"); insert("X-MOZILLA-HTML"); insert("FBURL"); insert("CALURI"); } } m_uniqueProperties; }; SE_END_CXX #endif // ENABLE_EBOOK #endif // INCL_EVOLUTIONCONTACTSOURCE syncevolution-1.5/src/backends/evolution/EvolutionContactSource.cpp0000644000373300001540000013011512415725055027277 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include using namespace std; #include "config.h" #include "EvolutionSyncSource.h" #include #ifdef ENABLE_EBOOK #include "EvolutionContactSource.h" #include #include #include #ifdef USE_EDS_CLIENT #include #endif #include #include #include #include #include #include SE_GLIB_TYPE(EBookQuery, e_book_query) SE_BEGIN_CXX inline bool IsContactNotFound(const GError *gerror) { return gerror && #ifdef USE_EDS_CLIENT gerror->domain == E_BOOK_CLIENT_ERROR && gerror->code == E_BOOK_CLIENT_ERROR_CONTACT_NOT_FOUND #else gerror->domain == E_BOOK_ERROR && gerror->code == E_BOOK_ERROR_CONTACT_NOT_FOUND #endif ; } const EvolutionContactSource::extensions EvolutionContactSource::m_vcardExtensions; const EvolutionContactSource::unique EvolutionContactSource::m_uniqueProperties; EvolutionContactSource::EvolutionContactSource(const SyncSourceParams ¶ms, EVCardFormat vcardFormat) : EvolutionSyncSource(params), m_vcardFormat(vcardFormat) { #ifdef USE_EDS_CLIENT m_cacheMisses = m_cacheStalls = m_contactReads = m_contactsFromDB = m_contactQueries = 0; m_readAheadOrder = READ_NONE; const char *mode = getEnv("SYNCEVOLUTION_EDS_ACCESS_MODE", ""); m_accessMode = boost::iequals(mode, "synchronous") ? SYNCHRONOUS : boost::iequals(mode, "batched") ? BATCHED : DEFAULT; #endif SyncSourceLogging::init(InitList("N_FIRST") + "N_MIDDLE" + "N_LAST", " ", m_operations); } EvolutionContactSource::~EvolutionContactSource() { // Don't close while we have pending operations. They might // complete after we got destroyed, causing them to use an invalid // "this" pointer. We also don't know how well EDS copes with // closing the address book while it has pending operations - EDS // maintainer mcrha wasn't sure. // // TODO: cancel the operations(). finishItemChanges(); close(); #ifdef USE_EDS_CLIENT // logCacheStats(Logger::DEBUG); #endif } #ifdef USE_EDS_CLIENT static EClient *newEBookClient(ESource *source, GError **gerror) { return E_CLIENT(e_book_client_new(source, gerror)); } #endif EvolutionSyncSource::Databases EvolutionContactSource::getDatabases() { Databases result; #ifdef USE_EDS_CLIENT getDatabasesFromRegistry(result, E_SOURCE_EXTENSION_ADDRESS_BOOK, e_source_registry_ref_default_address_book); #else ESourceList *sources = NULL; if (!e_book_get_addressbooks(&sources, NULL)) { Exception::throwError(SE_HERE, "unable to access address books"); } Databases secondary; for (GSList *g = e_source_list_peek_groups (sources); g; g = g->next) { ESourceGroup *group = E_SOURCE_GROUP (g->data); for (GSList *s = e_source_group_peek_sources (group); s; s = s->next) { ESource *source = E_SOURCE (s->data); eptr uri(e_source_get_uri(source)); string uristr; if (uri) { uristr = uri.get(); } Database entry(e_source_peek_name(source), uristr, false); if (boost::starts_with(uristr, "couchdb://")) { // Append CouchDB address books at the end of the list, // otherwise preserving the order of address books. // // The reason is Moblin Bugzilla #7877 (aka CouchDB // feature request #479110): the initial release of // evolution-couchdb in Ubuntu 9.10 is unusable because // it does not support the REV property. // // Reordering the entries ensures that the CouchDB // address book is not used as the default database by // SyncEvolution, as it happened in Ubuntu 9.10. // Users can still pick it intentionally via // "evolutionsource". secondary.push_back(entry); } else { result.push_back(entry); } } } result.insert(result.end(), secondary.begin(), secondary.end()); // No results? Try system address book (workaround for embedded Evolution Dataserver). if (!result.size()) { eptr book; GErrorCXX gerror; const char *name; name = "<>"; book = e_book_new_system_addressbook (gerror); gerror.clear(); if (!book) { name = "<>"; book = e_book_new_default_addressbook (gerror); } if (book) { const char *uri = e_book_get_uri (book); result.push_back(Database(name, uri, true)); } } else { // the first DB found is the default result[0].m_isDefault = true; } #endif return result; } void EvolutionContactSource::open() { #ifdef USE_EDS_CLIENT m_addressbook.reset(E_BOOK_CLIENT(openESource(E_SOURCE_EXTENSION_ADDRESS_BOOK, e_source_registry_ref_builtin_address_book, newEBookClient).get())); #else GErrorCXX gerror; bool created = false; bool onlyIfExists = false; // always try to create address book, because even if there is // a source there's no guarantee that the actual database was // created already; the original logic below for only setting // this when explicitly requesting a new address book // therefore failed in some cases ESourceList *tmp; if (!e_book_get_addressbooks(&tmp, gerror)) { throwError(SE_HERE, "unable to access address books", gerror); } ESourceListCXX sources(tmp, TRANSFER_REF); string id = getDatabaseID(); ESource *source = findSource(sources, id); if (!source) { // might have been special "<>" or "<>", try that and // creating address book from file:// URI before giving up if (id.empty() || id == "<>") { m_addressbook.set( e_book_new_system_addressbook (gerror), "system address book" ); } else if (id.empty() || id == "<>") { m_addressbook.set( e_book_new_default_addressbook (gerror), "default address book" ); } else if (boost::starts_with(id, "file://")) { m_addressbook.set(e_book_new_from_uri(id.c_str(), gerror), "creating address book"); } else { throwError(SE_HERE, string(getName()) + ": no such address book: '" + id + "'"); } created = true; } else { m_addressbook.set( e_book_new( source, gerror ), "address book" ); } if (!e_book_open( m_addressbook, onlyIfExists, gerror) ) { if (created) { // opening newly created address books often fails, try again once more sleep(5); if (!e_book_open(m_addressbook, onlyIfExists, gerror)) { throwError(SE_HERE, "opening address book", gerror); } } else { throwError(SE_HERE, "opening address book", gerror); } } // users are not expected to configure an authentication method, // so pick one automatically if the user indicated that he wants authentication // by setting user or password UserIdentity identity = getUser(); InitStateString passwd = getPassword(); if (identity.wasSet() || passwd.wasSet()) { GList *authmethod; if (!e_book_get_supported_auth_methods(m_addressbook, &authmethod, gerror)) { throwError(SE_HERE, "getting authentication methods", gerror); } while (authmethod) { // map identity + password to plain username/password credentials Credentials cred = IdentityProviderCredentials(identity, passwd); const char *method = (const char *)authmethod->data; SE_LOG_DEBUG(getDisplayName(), "trying authentication method \"%s\", user %s, password %s", method, identity.wasSet() ? "configured" : "not configured", passwd.wasSet() ? "configured" : "not configured"); if (e_book_authenticate_user(m_addressbook, cred.m_username.c_str(), cred.m_password.c_str(), method, gerror)) { SE_LOG_DEBUG(getDisplayName(), "authentication succeeded"); break; } else { SE_LOG_ERROR(getDisplayName(), "authentication failed: %s", gerror->message); } authmethod = authmethod->next; } } g_signal_connect_after(m_addressbook, "backend-died", G_CALLBACK(Exception::fatalError), (void *)"Evolution Data Server has died unexpectedly, contacts no longer available."); #endif } bool EvolutionContactSource::isEmpty() { // TODO: add more efficient implementation which does not // depend on actually pulling all items from EDS RevisionMap_t revisions; listAllItems(revisions); return revisions.empty(); } #ifdef USE_EDS_CLIENT class EBookClientViewSyncHandler { public: typedef boost::function Process_t; EBookClientViewSyncHandler(const EBookClientViewCXX &view, const Process_t &process) : m_process(process), m_view(view) {} bool process(GErrorCXX &gerror) { // Listen for view signals m_view.connectSignal("objects-added", boost::bind(m_process, _2)); m_view.connectSignal("complete", boost::bind(&EBookClientViewSyncHandler::completed, this, _2)); // Start the view e_book_client_view_start (m_view, m_error); if (m_error) { std::swap(gerror, m_error); return false; } // Async -> Sync m_loop.run(); e_book_client_view_stop (m_view, NULL); if (m_error) { std::swap(gerror, m_error); return false; } else { return true; } } void completed(const GError *error) { m_error = error; m_loop.quit(); } public: // Event loop for Async -> Sync EvolutionAsync m_loop; private: // Process list callback boost::function m_process; // View watched EBookClientViewCXX m_view; // Possible error while watching the view GErrorCXX m_error; }; static void list_revisions(const GSList *contacts, EvolutionContactSource::RevisionMap_t *revisions) { const GSList *l; for (l = contacts; l; l = l->next) { EContact *contact = E_CONTACT(l->data); if (!contact) { SE_THROW("contact entry without data"); } pair revmapping; const char *uid = (const char *)e_contact_get_const(contact, E_CONTACT_UID); if (!uid || !uid[0]) { SE_THROW("contact entry without UID"); } revmapping.first = uid; const char *rev = (const char *)e_contact_get_const(contact, E_CONTACT_REV); if (!rev || !rev[0]) { SE_THROW(string("contact entry without REV: ") + revmapping.first); } revmapping.second = rev; revisions->insert(revmapping); } } #endif void EvolutionContactSource::listAllItems(RevisionMap_t &revisions) { #ifdef USE_EDS_CLIENT GErrorCXX gerror; EBookClientView *view; EBookQueryCXX allItemsQuery(e_book_query_any_field_contains(""), TRANSFER_REF); PlainGStr buffer(e_book_query_to_string (allItemsQuery.get())); const char *sexp = getenv("SYNCEVOLUTION_EBOOK_QUERY"); if (sexp) { SE_LOG_INFO(NULL, "restricting item set to items matching %s", sexp); } else { sexp = buffer; } if (!e_book_client_get_view_sync(m_addressbook, sexp, &view, NULL, gerror)) { throwError(SE_HERE, "getting the view" , gerror); } EBookClientViewCXX viewPtr = EBookClientViewCXX::steal(view); // Optimization: set fields_of_interest (UID / REV) GListCXX interesting_field_list; interesting_field_list.push_back(e_contact_field_name (E_CONTACT_UID)); interesting_field_list.push_back(e_contact_field_name (E_CONTACT_REV)); e_book_client_view_set_fields_of_interest (viewPtr, interesting_field_list, gerror); if (gerror) { SE_LOG_ERROR(getDisplayName(), "e_book_client_view_set_fields_of_interest: %s", (const char*)gerror); gerror.clear(); } EBookClientViewSyncHandler handler(viewPtr, boost::bind(list_revisions, _1, &revisions)); if (!handler.process(gerror)) { throwError(SE_HERE, "watching view", gerror); } #else GErrorCXX gerror; eptr allItemsQuery(e_book_query_any_field_contains(""), "query"); GList *nextItem; if (!e_book_get_contacts(m_addressbook, allItemsQuery, &nextItem, gerror)) { throwError(SE_HERE, "reading all items", gerror ); } eptr listptr(nextItem); while (nextItem) { EContact *contact = E_CONTACT(nextItem->data); if (!contact) { throwError(SE_HERE, "contact entry without data"); } pair revmapping; const char *uid = (const char *)e_contact_get_const(contact, E_CONTACT_UID); if (!uid || !uid[0]) { throwError(SE_HERE, "contact entry without UID"); } revmapping.first = uid; const char *rev = (const char *)e_contact_get_const(contact, E_CONTACT_REV); if (!rev || !rev[0]) { throwError(SE_HERE, string("contact entry without REV: ") + revmapping.first); } revmapping.second = rev; revisions.insert(revmapping); nextItem = nextItem->next; } #endif } void EvolutionContactSource::close() { m_addressbook.reset(); } string EvolutionContactSource::getRevision(const string &luid) { if (!needChanges()) { return ""; } EContact *contact; GErrorCXX gerror; if ( #ifdef USE_EDS_CLIENT !e_book_client_get_contact_sync(m_addressbook, luid.c_str(), &contact, NULL, gerror) #else !e_book_get_contact(m_addressbook, luid.c_str(), &contact, gerror) #endif ) { if (IsContactNotFound(gerror)) { throwError(SE_HERE, STATUS_NOT_FOUND, string("retrieving item: ") + luid); } else { throwError(SE_HERE, string("reading contact ") + luid, gerror); } } eptr contactptr(contact, "contact"); const char *rev = (const char *)e_contact_get_const(contact, E_CONTACT_REV); if (!rev || !rev[0]) { throwError(SE_HERE, string("contact entry without REV: ") + luid); } return rev; } #ifdef USE_EDS_CLIENT class ContactCache : public std::map { public: /** Asynchronous method call still pending. */ bool m_running; /** The last luid requested in this query. Needed to start with the next contact after it. */ std::string m_lastLUID; /** Result of batch read. Any error here means that the call failed completely. */ GErrorCXX m_gerror; /** A debug logging name for this query. */ std::string m_name; }; void EvolutionContactSource::setReadAheadOrder(ReadAheadOrder order, const ReadAheadItems &luids) { SE_LOG_DEBUG(getDisplayName(), "reading: set order '%s', %ld luids", order == READ_NONE ? "none" : order == READ_ALL_ITEMS ? "all" : order == READ_CHANGED_ITEMS ? "changed" : order == READ_SELECTED_ITEMS ? "selected" : "???", (long)luids.size()); m_readAheadOrder = order; m_nextLUIDs = luids; // Be conservative and throw away all cached data. Not doing so // can confuse our "cache miss" counting, for example when it uses // a cache where some entries have been removed in // invalidateCachedContact() and then mistakes the gaps for cache // misses. // // Another reason is that we want to use fairly recent data (in // case of concurrent changes in the DB, which currently is not // detected by the cache). m_contactCache.reset(); m_contactCacheNext.reset(); } void EvolutionContactSource::getReadAheadOrder(ReadAheadOrder &order, ReadAheadItems &luids) { order = m_readAheadOrder; luids = m_nextLUIDs; } void EvolutionContactSource::checkCacheForError(boost::shared_ptr &cache) { if (cache->m_gerror) { GErrorCXX gerror; std::swap(gerror, cache->m_gerror); cache.reset(); throwError(SE_HERE, StringPrintf("reading contacts %s", cache->m_name.c_str()), gerror); } } void EvolutionContactSource::invalidateCachedContact(const std::string &luid) { invalidateCachedContact(m_contactCache, luid); invalidateCachedContact(m_contactCacheNext, luid); } void EvolutionContactSource::invalidateCachedContact(boost::shared_ptr &cache, const std::string &luid) { if (cache) { ContactCache::iterator it = cache->find(luid); if (it != cache->end()) { SE_LOG_DEBUG(getDisplayName(), "reading: remove contact %s from cache because of remove or update", luid.c_str()); // If we happen to read that contact (unlikely), it'll be // considered a cache miss. That's okay. Together with // counting cache misses it'll help us avoid using // read-ahead when the Synthesis engine is randomly // accessing contacts. cache->erase(it); } } } bool EvolutionContactSource::getContact(const string &luid, EContact **contact, GErrorCXX &gerror) { SE_LOG_DEBUG(getDisplayName(), "reading: getting contact %s", luid.c_str()); // Use switch and let compiler tell us when we don't cover a case. ReadAheadOrder order #ifndef __clang_analyzer__ // scan-build would complain: value stored to 'order' during // its initialization is never read. But we need to keep it // otherwise, to avoid: 'order' may be used uninitialized in // this function [-Werror=maybe-uninitialized] = m_readAheadOrder #endif ; switch (m_accessMode) { case SYNCHRONOUS: order = READ_NONE; break; case BATCHED: case DEFAULT: order = m_readAheadOrder; break; }; m_contactReads++; if (order == READ_NONE) { m_contactsFromDB++; m_contactQueries++; return e_book_client_get_contact_sync(m_addressbook, luid.c_str(), contact, NULL, gerror); } else { return getContactFromCache(luid, contact, gerror); } } bool EvolutionContactSource::getContactFromCache(const string &luid, EContact **contact, GErrorCXX &gerror) { *contact = NULL; // Use ContactCache. if (m_contactCache) { SE_LOG_DEBUG(getDisplayName(), "reading: active cache %s", m_contactCache->m_name.c_str()); // Ran into a problem? checkCacheForError(m_contactCache); // Does the cache cover our item? ContactCache::const_iterator it = m_contactCache->find(luid); if (it == m_contactCache->end()) { if (m_contactCacheNext) { SE_LOG_DEBUG(getDisplayName(), "reading: not in cache, try cache %s", m_contactCacheNext->m_name.c_str()); // Throw away old cache, try with next one. This is not // a cache miss (yet). m_contactCache = m_contactCacheNext; m_contactCacheNext.reset(); return getContactFromCache(luid, contact, gerror); } else { SE_LOG_DEBUG(getDisplayName(), "reading: not in cache, nothing pending -> start reading"); // Throw away cache, start new read below. m_contactCache.reset(); } } else { SE_LOG_DEBUG(getDisplayName(), "reading: in %s cache", m_contactCache->m_running ? "running" : "loaded"); if (m_contactCache->m_running) { m_cacheStalls++; GRunWhile(boost::lambda::var(m_contactCache->m_running)); } // Problem? checkCacheForError(m_contactCache); SE_LOG_DEBUG(getDisplayName(), "reading: in cache, %s", it->second ? "available" : "not found"); if (it->second) { // Got it. *contact = it->second.ref(); } else { // Delay throwing error. We need to go through the read-ahead code below. gerror.take(g_error_new(E_BOOK_CLIENT_ERROR, E_BOOK_CLIENT_ERROR_CONTACT_NOT_FOUND, "uid %s not found in batch read", luid.c_str())); } } } // No current cache? In that case we must read and block. if (!m_contactCache) { m_contactCache = startReading(luid, START); // Call code above recursively, which will block. return getContactFromCache(luid, contact, gerror); } // Can we read ahead? if (!m_contactCacheNext && !m_contactCache->m_running) { m_contactCacheNext = startReading(m_contactCache->m_lastLUID, CONTINUE); } // Everything is okay when we get here. Either we have the contact or // it wasn't in the database. SE_LOG_DEBUG(getDisplayName(), "reading: read %s: %s", luid.c_str(), gerror ? gerror->message : "<>"); logCacheStats(Logger::DEBUG); return !gerror; } static int MaxBatchSize() { int maxBatchSize = atoi(getEnv("SYNCEVOLUTION_EDS_BATCH_SIZE", "50")); if (maxBatchSize < 1) { maxBatchSize = 1; } return maxBatchSize; } boost::shared_ptr EvolutionContactSource::startReading(const std::string &luid, ReadingMode mode) { SE_LOG_DEBUG(getDisplayName(), "reading: %s contact %s", mode == START ? "must read" : mode == CONTINUE ? "continue after" : "???", luid.c_str()); static int maxBatchSize = MaxBatchSize(); std::vector uidQueries; uidQueries.resize(maxBatchSize); std::vector uids; uids.resize(maxBatchSize); int size = 0; bool found = false; switch (m_readAheadOrder) { case READ_ALL_ITEMS: case READ_CHANGED_ITEMS: { const Items_t &items = getAllItems(); const Items_t &newItems = getNewItems(); const Items_t &updatedItems = getUpdatedItems(); Items_t::const_iterator it = items.find(luid); // Always read the requested item, even if not found in item list? if (mode == START) { uids[0] = &luid; size++; } // luid is dealt with, either way. if (it != items.end()) { // Check that it is a valid candidate for caching, else // we have a cache miss prediction. if (m_readAheadOrder == READ_ALL_ITEMS || newItems.find(luid) != newItems.end() || updatedItems.find(luid) != updatedItems.end()) { found = true; } ++it; } while (size < maxBatchSize && it != items.end()) { const std::string &luid = *it; if (m_readAheadOrder == READ_ALL_ITEMS || newItems.find(luid) != newItems.end() || updatedItems.find(luid) != updatedItems.end()) { uids[size] = &luid; ++size; } ++it; } break; } case READ_SELECTED_ITEMS: { ReadAheadItems::const_iterator it = boost::find(std::make_pair(m_nextLUIDs.begin(), m_nextLUIDs.end()), luid); // Always read the requested item, even if not found in item list? if (mode == START) { uids[0] = &luid; size++; } // luid is dealt with, either way. if (it != m_nextLUIDs.end()) { found = true; ++it; } while (size < maxBatchSize && it != m_nextLUIDs.end()) { uids[size] = &*it; ++size; ++it; } break; } case READ_NONE: // May be reached when read-ahead was turned off while // preparing for it. if (mode == START) { uids[0] = &luid; size++; } break; } if (m_readAheadOrder != READ_NONE && mode == START && !found) { // The requested contact was not on our list. Consider this // a cache miss (or rather, cache prediction failure) and turn // of the read-ahead. m_cacheMisses++; SE_LOG_DEBUG(getDisplayName(), "reading: disable read-ahead due to cache miss"); m_readAheadOrder = READ_NONE; } boost::shared_ptr cache; if (size) { // Prepare parameter for EDS C call. Ownership of query instances is in uidQueries array. boost::scoped_array queries(new EBookQuery *[size]); for (int i = 0; i < size; i++) { // This shouldn't compile because we don't specify how ownership is handled. // The reset() method always bumps the ref count, which is not what we want here! // uidQueries[i].reset(e_book_query_field_test(E_CONTACT_UID, E_BOOK_QUERY_IS, it->c_str())); // // Take over ownership. uidQueries[i] = EBookQueryCXX::steal(e_book_query_field_test(E_CONTACT_UID, E_BOOK_QUERY_IS, uids[i]->c_str())); queries[i] = uidQueries[i].get(); } EBookQueryCXX query(e_book_query_or(size, queries.get(), false), TRANSFER_REF); PlainGStr sexp(e_book_query_to_string(query.get())); cache.reset(new ContactCache); cache->m_running = true; cache->m_name = StringPrintf("%s-%s (%d)", uids[0]->c_str(), uids[size - 1]->c_str(), size); cache->m_lastLUID = *uids[size - 1]; BOOST_FOREACH (const std::string *uid, std::make_pair(uids.begin(), uids.begin() + size)) { (*cache)[*uid] = EContactCXX(); } m_contactsFromDB += size; m_contactQueries++; SYNCEVO_GLIB_CALL_ASYNC(e_book_client_get_contacts, boost::bind(&EvolutionContactSource::completedRead, this, boost::weak_ptr(cache), _1, _2, _3), m_addressbook, sexp, NULL); SE_LOG_DEBUG(getDisplayName(), "reading: started contact read %s", cache->m_name.c_str()); } return cache; } typedef GListCXX< EContact, GSList, GObjectDestructor > ContactListCXX; void EvolutionContactSource::completedRead(const boost::weak_ptr &cachePtr, gboolean success, GSList *contactsPtr, const GError *gerror) throw() { try { ContactListCXX contacts(contactsPtr); // transfers ownership boost::shared_ptr cache = cachePtr.lock(); if (!cache) { SE_LOG_DEBUG(getDisplayName(), "reading: contact read finished, results no longer needed: %s", gerror ? gerror->message : "<>"); return; } SE_LOG_DEBUG(getDisplayName(), "reading: contact read %s finished: %s", cache->m_name.c_str(), gerror ? gerror->message : "<>"); if (success) { BOOST_FOREACH (EContact *contact, contacts) { const char *uid = (const char *)e_contact_get_const(contact, E_CONTACT_UID); SE_LOG_DEBUG(getDisplayName(), "reading: contact read %s got %s", cache->m_name.c_str(), uid); (*cache)[uid] = EContactCXX(contact, ADD_REF); } } else { cache->m_gerror = gerror; } cache->m_running = false; } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } void EvolutionContactSource::logCacheStats(Logger::Level level) { SE_LOG(getDisplayName(), level, "requested %d, retrieved %d from DB in %d queries, misses %d/%d (%d%%), stalls %d", m_contactReads, m_contactsFromDB, m_contactQueries, m_cacheMisses, m_contactReads, m_contactReads ? m_cacheMisses * 100 / m_contactReads : 0, m_cacheStalls); } #endif void EvolutionContactSource::readItem(const string &luid, std::string &item, bool raw) { EContact *contact; GErrorCXX gerror; if ( #ifdef USE_EDS_CLIENT !getContact(luid, &contact, gerror) #else !e_book_get_contact(m_addressbook, luid.c_str(), &contact, gerror) #endif ) { if (IsContactNotFound(gerror)) { throwError(SE_HERE, STATUS_NOT_FOUND, string("reading contact: ") + luid); } else { throwError(SE_HERE, string("reading contact ") + luid, gerror); } } eptr contactptr(contact, "contact"); // Inline PHOTO data if exporting, leave VALUE=uri references unchanged // when processing inside engine (will be inlined by engine as needed). // The function for doing the inlining was added in EDS 3.4. // In compatibility mode, we must check the function pointer for non-NULL. // In direct call mode, the existence check is done by configure. if (raw #ifdef EVOLUTION_COMPATIBILITY && e_contact_inline_local_photos #endif ) { #if defined(EVOLUTION_COMPATIBILITY) || defined(HAVE_E_CONTACT_INLINE_LOCAL_PHOTOS) if (!e_contact_inline_local_photos(contactptr, gerror)) { throwError(SE_HERE, string("inlining PHOTO file data in ") + luid, gerror); } #endif } eptr vcardstr(e_vcard_to_string(&contactptr->parent, EVC_FORMAT_VCARD_30)); if (!vcardstr) { throwError(SE_HERE, string("failure extracting contact from Evolution " ) + luid); } item = vcardstr.get(); } #ifdef USE_EDS_CLIENT TrackingSyncSource::InsertItemResult EvolutionContactSource::checkBatchedInsert(const boost::shared_ptr &pending) { SE_LOG_DEBUG(pending->m_name, "checking operation: %s", pending->m_status == MODIFYING ? "waiting" : "inserted"); if (pending->m_status == MODIFYING) { return TrackingSyncSource::InsertItemResult(boost::bind(&EvolutionContactSource::checkBatchedInsert, this, pending)); } if (pending->m_gerror) { pending->m_gerror.throwError(SE_HERE, pending->m_name); } string newrev = getRevision(pending->m_uid); return TrackingSyncSource::InsertItemResult(pending->m_uid, newrev, ITEM_OKAY); } void EvolutionContactSource::completedAdd(const boost::shared_ptr &batched, gboolean success, GSList *uids, const GError *gerror) throw() { try { // The destructor ensures that the pending operations complete // before destructing the instance, so our "this" pointer is // always valid here. SE_LOG_DEBUG(getDisplayName(), "batch add of %d contacts completed", (int)batched->size()); m_numRunningOperations--; PendingContainer_t::iterator it = (*batched).begin(); GSList *uid = uids; while (it != (*batched).end() && uid) { SE_LOG_DEBUG((*it)->m_name, "completed: %s", success ? "<>" : gerror ? gerror->message : "<>"); if (success) { (*it)->m_uid = static_cast(uid->data); // Get revision when engine checks the item. (*it)->m_status = REVISION; } else { (*it)->m_status = DONE; (*it)->m_gerror = gerror; } ++it; uid = uid->next; } while (it != (*batched).end()) { // Should never happen. SE_LOG_DEBUG((*it)->m_name, "completed: missing uid?!"); (*it)->m_status = DONE; ++it; } g_slist_free_full(uids, g_free); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } void EvolutionContactSource::completedUpdate(const boost::shared_ptr &batched, gboolean success, const GError *gerror) throw() { try { SE_LOG_DEBUG(getDisplayName(), "batch update of %d contacts completed", (int)batched->size()); m_numRunningOperations--; PendingContainer_t::iterator it = (*batched).begin(); while (it != (*batched).end()) { SE_LOG_DEBUG((*it)->m_name, "completed: %s", success ? "<>" : gerror ? gerror->message : "<>"); if (success) { (*it)->m_status = REVISION; } else { (*it)->m_status = DONE; (*it)->m_gerror = gerror; } ++it; } } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } void EvolutionContactSource::flushItemChanges() { if (!m_batchedAdd.empty()) { SE_LOG_DEBUG(getDisplayName(), "batch add of %d contacts starting", (int)m_batchedAdd.size()); m_numRunningOperations++; GListCXX contacts; // Iterate backwards, push to front (cheaper for single-linked list) -> same order in the end. BOOST_REVERSE_FOREACH (const boost::shared_ptr &pending, m_batchedAdd) { contacts.push_front(pending->m_contact.get()); } // Transfer content without copying and then copy only the shared pointer. boost::shared_ptr batched(new PendingContainer_t); std::swap(*batched, m_batchedAdd); SYNCEVO_GLIB_CALL_ASYNC(e_book_client_add_contacts, boost::bind(&EvolutionContactSource::completedAdd, this, batched, _1, _2, _3), m_addressbook, contacts, NULL); } if (!m_batchedUpdate.empty()) { SE_LOG_DEBUG(getDisplayName(), "batch update of %d contacts starting", (int)m_batchedUpdate.size()); m_numRunningOperations++; GListCXX contacts; BOOST_REVERSE_FOREACH (const boost::shared_ptr &pending, m_batchedUpdate) { contacts.push_front(pending->m_contact.get()); } boost::shared_ptr batched(new PendingContainer_t); std::swap(*batched, m_batchedUpdate); SYNCEVO_GLIB_CALL_ASYNC(e_book_client_modify_contacts, boost::bind(&EvolutionContactSource::completedUpdate, this, batched, _1, _2), m_addressbook, contacts, NULL); } } void EvolutionContactSource::finishItemChanges() { if (m_numRunningOperations) { SE_LOG_DEBUG(getDisplayName(), "waiting for %d pending operations to complete", m_numRunningOperations.get()); while (m_numRunningOperations) { g_main_context_iteration(NULL, true); } SE_LOG_DEBUG(getDisplayName(), "pending operations completed"); } } #endif TrackingSyncSource::InsertItemResult EvolutionContactSource::insertItem(const string &uid, const std::string &item, bool raw) { EContactCXX contact(e_contact_new_from_vcard(item.c_str()), TRANSFER_REF); if (contact) { e_contact_set(contact, E_CONTACT_UID, uid.empty() ? NULL : const_cast(uid.c_str())); GErrorCXX gerror; #ifdef USE_EDS_CLIENT invalidateCachedContact(uid); switch (m_accessMode) { case SYNCHRONOUS: if (uid.empty()) { gchar* newuid; if (!e_book_client_add_contact_sync(m_addressbook, contact, &newuid, NULL, gerror)) { throwError(SE_HERE, "add new contact", gerror); } PlainGStr newuidPtr(newuid); string newrev = getRevision(newuid); return InsertItemResult(newuid, newrev, ITEM_OKAY); } else { if (!e_book_client_modify_contact_sync(m_addressbook, contact, NULL, gerror)) { throwError(SE_HERE, "updating contact "+ uid, gerror); } string newrev = getRevision(uid); return InsertItemResult(uid, newrev, ITEM_OKAY); } break; case BATCHED: case DEFAULT: std::string name = StringPrintf("%s: %s operation #%d", getDisplayName().c_str(), uid.empty() ? "add" : ("insert " + uid).c_str(), m_asyncOpCounter++); SE_LOG_DEBUG(name, "queueing for batched %s", uid.empty() ? "add" : "update"); boost::shared_ptr pending(new Pending); pending->m_name = name; pending->m_contact = contact; pending->m_uid = uid; if (uid.empty()) { m_batchedAdd.push_back(pending); } else { m_batchedUpdate.push_back(pending); } // SyncSource is going to live longer than Synthesis // engine, so using "this" is safe here. return InsertItemResult(boost::bind(&EvolutionContactSource::checkBatchedInsert, this, pending)); break; } #else if (uid.empty() ? e_book_add_contact(m_addressbook, contact, gerror) : e_book_commit_contact(m_addressbook, contact, gerror)) { const char *newuid = (const char *)e_contact_get_const(contact, E_CONTACT_UID); if (!newuid) { throwError(SE_HERE, "no UID for contact"); } string newrev = getRevision(newuid); return InsertItemResult(newuid, newrev, ITEM_OKAY); } else { throwError(SE_HERE, uid.empty() ? "storing new contact" : string("updating contact ") + uid, gerror); } #endif } else { throwError(SE_HERE, string("failure parsing vcard " ) + item); } // not reached! return InsertItemResult("", "", ITEM_OKAY); } void EvolutionContactSource::removeItem(const string &uid) { GErrorCXX gerror; if ( #ifdef USE_EDS_CLIENT (invalidateCachedContact(uid), !e_book_client_remove_contact_by_uid_sync(m_addressbook, uid.c_str(), NULL, gerror)) #else !e_book_remove_contact(m_addressbook, uid.c_str(), gerror) #endif ) { if (IsContactNotFound(gerror)) { throwError(SE_HERE, STATUS_NOT_FOUND, string("deleting contact: ") + uid); } else { throwError(SE_HERE, string( "deleting contact " ) + uid, gerror); } } } std::string EvolutionContactSource::getDescription(const string &luid) { try { EContact *contact; GErrorCXX gerror; if ( #ifdef USE_EDS_CLIENT !getContact(luid, &contact, gerror) #else !e_book_get_contact(m_addressbook, luid.c_str(), &contact, gerror) #endif ) { throwError(SE_HERE, string("reading contact ") + luid, gerror); } eptr contactptr(contact, "contact"); const char *name = (const char *)e_contact_get_const(contact, E_CONTACT_FULL_NAME); if (name) { return name; } const char *fileas = (const char *)e_contact_get_const(contact, E_CONTACT_FILE_AS); if (fileas) { return fileas; } EContactName *names = (EContactName *)e_contact_get(contact, E_CONTACT_NAME); std::list buffer; if (names) { try { if (names->given && names->given[0]) { buffer.push_back(names->given); } if (names->additional && names->additional[0]) { buffer.push_back(names->additional); } if (names->family && names->family[0]) { buffer.push_back(names->family); } } catch (...) { } e_contact_name_free(names); } return boost::join(buffer, " "); } catch (...) { // Instead of failing we log the error and ask // the caller to log the UID. That way transient // errors or errors in the logging code don't // prevent syncs. handleException(); return ""; } } std::string EvolutionContactSource::getMimeType() const { switch( m_vcardFormat ) { case EVC_FORMAT_VCARD_21: return "text/x-vcard"; break; case EVC_FORMAT_VCARD_30: default: return "text/vcard"; break; } } std::string EvolutionContactSource::getMimeVersion() const { switch( m_vcardFormat ) { case EVC_FORMAT_VCARD_21: return "2.1"; break; case EVC_FORMAT_VCARD_30: default: return "3.0"; break; } } SE_END_CXX #endif /* ENABLE_EBOOK */ #ifdef ENABLE_MODULES # include "EvolutionContactSourceRegister.cpp" #endif syncevolution-1.5/src/backends/evolution/EvolutionCalendarSource.h0000664000373300001540000002332012363164605027063 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTIONCALENDARSOURCE #define INCL_EVOLUTIONCALENDARSOURCE #include "config.h" #include "EvolutionSyncSource.h" #include #include #ifdef ENABLE_ECAL #include #ifdef USE_EDS_CLIENT SE_GOBJECT_TYPE(ECalClient) SE_GOBJECT_TYPE(ECalClientView) #endif SE_BEGIN_CXX /** * Source type independent from ECal / ECalClient to abstract * the two different enums in the APIs. */ typedef enum { EVOLUTION_CAL_SOURCE_TYPE_EVENTS, EVOLUTION_CAL_SOURCE_TYPE_TASKS, EVOLUTION_CAL_SOURCE_TYPE_MEMOS } EvolutionCalendarSourceType; inline bool IsCalObjNotFound(const GError *gerror) { return gerror && #ifdef USE_EDS_CLIENT gerror->domain == E_CAL_CLIENT_ERROR && gerror->code == E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND #else gerror->domain == E_CALENDAR_ERROR && gerror->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND #endif ; } /** * Implements access to Evolution calendars, either * using the to-do item or events. Change tracking * is done by looking at the modification time stamp. * Recurring events and their detached recurrences are * handled as one item for the main event and one item * for each detached recurrence. */ class EvolutionCalendarSource : public EvolutionSyncSource, public SyncSourceLogging, private boost::noncopyable { public: /** * @param type chooses which kind of calendar data to use: * EVOLUTION_CAL_SOURCE_TYPE_EVENTS, * EVOLUTION_CAL_SOURCE_TYPE_TASKS, * EVOLUTION_CAL_SOURCE_TYPE_MEMOS */ EvolutionCalendarSource(EvolutionCalendarSourceType type, const SyncSourceParams ¶ms); virtual ~EvolutionCalendarSource() { close(); } // // implementation of SyncSource // virtual Databases getDatabases(); virtual void open(); virtual bool isEmpty(); virtual void close(); virtual std::string getMimeType() const { return "text/calendar"; } virtual std::string getMimeVersion() const { return "2.0"; } void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { // All EDS calendar storages must suppport UID/RECURRENCE-ID, // it's part of the API. Therefore we can rely on it. EvolutionSyncSource::getSynthesisInfo(info, fragments); info.m_globalIDs = true; } /** * An item is identified in the calendar by * its UID (unique ID) and RID (recurrence ID). * The RID may be empty. * * This is turned into a SyncML LUID by * concatenating them: -rid. */ class ItemID { public: ItemID(const string &uid, const string &rid) : m_uid(uid), m_rid(rid) {} ItemID(const char *uid, const char *rid): m_uid(uid ? uid : ""), m_rid(rid ? rid : "") {} ItemID(const string &luid); const string m_uid, m_rid; string getLUID() const; static string getLUID(const string &uid, const string &rid); }; /** * Extract item ID from calendar item. An icalcomponent must * refer to the VEVENT/VTODO/VJOURNAL component. */ static ItemID getItemID(ECalComponent *ecomp); static ItemID getItemID(icalcomponent *icomp); /** * Extract modification string from calendar item. * @return empty string if no time was available */ static string getItemModTime(ECalComponent *ecomp); static string getItemModTime(icalcomponent *icomp); protected: // // implementation of TrackingSyncSource callbacks // virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &uid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &uid); // implementation of SyncSourceLogging callback virtual std::string getDescription(const string &luid); protected: /** valid after open(): the calendar that this source references */ #ifdef USE_EDS_CLIENT ECalClientCXX m_calendar; #else eptr m_calendar; ECal *(*m_newSystem)(void); /**< e_cal_new_system_calendar, etc. */ #endif string m_typeName; /**< "calendar", "task list", "memo list" */ EvolutionCalendarSourceType m_type; /**< use events, tasks or memos? */ // Convenience function for source type casting #ifdef USE_EDS_CLIENT ECalClientSourceType sourceType() const { return (ECalClientSourceType)m_type; } virtual const char *sourceExtension() const { return m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? E_SOURCE_EXTENSION_CALENDAR : m_type == EVOLUTION_CAL_SOURCE_TYPE_TASKS ? E_SOURCE_EXTENSION_TASK_LIST : m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? E_SOURCE_EXTENSION_MEMO_LIST : ""; } virtual ESourceCXX refSystemDB() const { ESource *(*ref)(ESourceRegistry *) = m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? e_source_registry_ref_builtin_calendar : m_type == EVOLUTION_CAL_SOURCE_TYPE_TASKS ? e_source_registry_ref_builtin_task_list : m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? e_source_registry_ref_builtin_memo_list : NULL; return ESourceCXX(ref ? ref(EDSRegistryLoader::getESourceRegistry()) : NULL, TRANSFER_REF); } #else ECalSourceType sourceType() const { return (ECalSourceType)m_type; } #endif /** * retrieve the item with the given id - may throw exception * * caller has to free result */ icalcomponent *retrieveItem(const ItemID &id); /** retrieve the item with the given luid as VCALENDAR string - may throw exception */ string retrieveItemAsString(const ItemID &id); /** returns the type which the ical library uses for our components */ icalcomponent_kind getCompType() { return m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? ICAL_VEVENT_COMPONENT : m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? ICAL_VJOURNAL_COMPONENT : ICAL_VTODO_COMPONENT; } #ifndef USE_EDS_CLIENT /** ECalAuthFunc which calls the authenticate() methods */ static char *eCalAuthFunc(ECal *ecal, const char *prompt, const char *key, gpointer user_data) { return ((EvolutionCalendarSource *)user_data)->authenticate(prompt, key); } /** actual implementation of ECalAuthFunc */ char *authenticate(const char *prompt, const char *key); #endif /** * Returns the LUID of a calendar item. */ string getLUID(ECalComponent *ecomp); /** * Extract modification string of an item stored in * the calendar. * @return empty string if no time was available */ string getItemModTime(const ItemID &id); /** * Convert to string in canonical representation. */ static string icalTime2Str(const struct icaltimetype &tt); /** * A set of all existing objects. Initialized in the last call to * listAllItems() and then updated as items get * added/removed. Used to decide how insertItem() has to be * implemented without the troublesome querying of the EDS * backend. */ class LUIDs : public map< string, set > { public: bool containsUID(const std::string &uid) const { return findUID(uid) != end(); } const_iterator findUID(const std::string &uid) const { return find(uid); } bool containsLUID(const ItemID &id) const; void insertLUID(const ItemID &id); void eraseLUID(const ItemID &id); } m_allLUIDs; /** * A list of ref-counted smart pointers to icalcomponents. * The list members can be copied; destroying the last instance * will destroy the smart pointer, which then calls * icalcomponent_free(). */ typedef list< boost::shared_ptr< eptr > > ICalComps_t; /** * Utility function which extracts all icalcomponents with * the given UID, stores them in a list and then removes * them from the calendar. Trying to remove a non-existant * UID is logged, but not an error. It simply returns an * empty list. * * Relies on m_allLUIDs, but does not update it. The caller must * ensure that the calendar remains in a consistent state. * * @param returnOnlyChildren only return children in list, even if parent is also removed * @param ignoreNotFound don't throw a STATUS_NOT_FOUND error when deleting fails with * a NOT_FOUND error */ ICalComps_t removeEvents(const string &uid, bool returnOnlyChildren, bool ignoreNotFound = true); }; SE_END_CXX #endif // ENABLE_ECAL #endif // INCL_EVOLUTIONSYNCSOURCE syncevolution-1.5/src/backends/evolution/EvolutionMemoSource.h0000664000373300001540000000325112405555067026253 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTIONMEMOSOURCE #define INCL_EVOLUTIONMEMOSOURCE #include "config.h" #include #include SE_BEGIN_CXX #ifdef ENABLE_ECAL /** * Implements access to Evolution memo lists (stored as calendars), * exporting/importing the memos in plain UTF-8 text. Only the DESCRIPTION * part of a memo is synchronized. */ class EvolutionMemoSource : public EvolutionCalendarSource { public: EvolutionMemoSource(const SyncSourceParams ¶ms) : EvolutionCalendarSource(EVOLUTION_CAL_SOURCE_TYPE_MEMOS, params) {} // // implementation of SyncSource // virtual std::string getMimeType() const { return "text/calendar+plain"; } virtual std::string getMimeVersion() const { return "2.0"; } }; #endif // ENABLE_ECAL SE_END_CXX #endif // INCL_EVOLUTIONMEMOSOURCE syncevolution-1.5/src/backends/evolution/EvolutionCalendarSource.cpp0000644000373300001540000012631712415725055027426 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include using namespace std; #include "config.h" #ifdef ENABLE_ECAL // include first, it sets HANDLE_LIBICAL_MEMORY for us #include #include #include #include #include "EvolutionCalendarSource.h" #include "EvolutionMemoSource.h" #include "e-cal-check-timezones.h" #include #include SE_BEGIN_CXX static const string EVOLUTION_CALENDAR_PRODID("PRODID:-//ACME//NONSGML SyncEvolution//EN"), EVOLUTION_CALENDAR_VERSION("VERSION:2.0"); bool EvolutionCalendarSource::LUIDs::containsLUID(const ItemID &id) const { const_iterator it = findUID(id.m_uid); return it != end() && it->second.find(id.m_rid) != it->second.end(); } void EvolutionCalendarSource::LUIDs::insertLUID(const ItemID &id) { (*this)[id.m_uid].insert(id.m_rid); } void EvolutionCalendarSource::LUIDs::eraseLUID(const ItemID &id) { iterator it = find(id.m_uid); if (it != end()) { set::iterator it2 = it->second.find(id.m_rid); if (it2 != it->second.end()) { it->second.erase(it2); if (it->second.empty()) { erase(it); } } } } static int granularity() { // This long delay is necessary in combination // with Evolution Exchange Connector: when updating // a child event, it seems to take a while until // the change really is effective. static int secs = 5; static bool checked = false; if (!checked) { // allow setting the delay (used during testing to shorten runtime) const char *delay = getenv("SYNC_EVOLUTION_EVO_CALENDAR_DELAY"); if (delay) { secs = atoi(delay); } checked = true; } return secs; } EvolutionCalendarSource::EvolutionCalendarSource(EvolutionCalendarSourceType type, const SyncSourceParams ¶ms) : EvolutionSyncSource(params, granularity()), m_type(type) { switch (m_type) { case EVOLUTION_CAL_SOURCE_TYPE_EVENTS: SyncSourceLogging::init(InitList("SUMMARY") + "LOCATION", ", ", m_operations); m_typeName = "calendar"; #ifndef USE_EDS_CLIENT m_newSystem = e_cal_new_system_calendar; #endif break; case EVOLUTION_CAL_SOURCE_TYPE_TASKS: SyncSourceLogging::init(InitList("SUMMARY"), ", ", m_operations); m_typeName = "task list"; #ifndef USE_EDS_CLIENT m_newSystem = e_cal_new_system_tasks; #endif break; case EVOLUTION_CAL_SOURCE_TYPE_MEMOS: SyncSourceLogging::init(InitList("SUBJECT"), ", ", m_operations); m_typeName = "memo list"; #ifndef USE_EDS_CLIENT // This is not available in older Evolution versions. // A configure check could detect that, but as this isn't // important the functionality is simply disabled. m_newSystem = NULL /* e_cal_new_system_memos */; #endif break; default: Exception::throwError(SE_HERE, "internal error, invalid calendar type"); break; } } SyncSource::Databases EvolutionCalendarSource::getDatabases() { GErrorCXX gerror; Databases result; #ifdef USE_EDS_CLIENT getDatabasesFromRegistry(result, sourceExtension(), m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? e_source_registry_ref_default_calendar : m_type == EVOLUTION_CAL_SOURCE_TYPE_TASKS ? e_source_registry_ref_default_task_list : m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? e_source_registry_ref_default_memo_list : NULL); #else ESourceList *tmp = NULL; if (!e_cal_get_sources(&tmp, sourceType(), gerror)) { // ignore unspecific errors (like on Maemo with no support for memos) // and continue with empty list (perhaps defaults work) if (!gerror) { tmp = NULL; } else { throwError(SE_HERE, "unable to access backend databases", gerror); } } ESourceListCXX sources(tmp, TRANSFER_REF); bool first = true; for (GSList *g = sources ? e_source_list_peek_groups (sources) : NULL; g; g = g->next) { ESourceGroup *group = E_SOURCE_GROUP (g->data); for (GSList *s = e_source_group_peek_sources (group); s; s = s->next) { ESource *source = E_SOURCE (s->data); eptr uri(e_source_get_uri(source)); result.push_back(Database(e_source_peek_name(source), uri ? uri.get() : "", first)); first = false; } } if (result.empty() && m_newSystem) { eptr calendar(m_newSystem()); if (calendar.get()) { // okay, default system database exists const char *uri = e_cal_get_uri(calendar.get()); result.push_back(Database("<>", uri ? uri : "<>")); } } #endif return result; } #ifdef USE_EDS_CLIENT static EClient *newECalClient(ESource *source, ECalClientSourceType ecalSourceType, GError **gerror) { return E_CLIENT(e_cal_client_new(source, ecalSourceType, gerror)); } #else char *EvolutionCalendarSource::authenticate(const char *prompt, const char *key) { std::string passwd = getPassword(); SE_LOG_DEBUG(getDisplayName(), "authentication requested, prompt \"%s\", key \"%s\" => %s", prompt, key, !passwd.empty() ? "returning configured password" : "no password configured"); return !passwd.empty() ? strdup(passwd.c_str()) : NULL; } #endif void EvolutionCalendarSource::open() { #ifdef USE_EDS_CLIENT // Open twice. This solves an issue where Evolution's CalDAV // backend only updates its local cache *after* a sync (= while // closing the calendar?), instead of doing it *before* a sync (in // e_cal_open()). // // This workaround is applied to *all* backends because there might // be others with similar problems and for local storage it is // a reasonably cheap operation (so no harm there). for (int retries = 0; retries < 2; retries++) { m_calendar.reset(E_CAL_CLIENT(openESource(sourceExtension(), m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS ? e_source_registry_ref_builtin_calendar : m_type == EVOLUTION_CAL_SOURCE_TYPE_TASKS ? e_source_registry_ref_builtin_task_list : m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS ? e_source_registry_ref_builtin_memo_list : NULL, boost::bind(newECalClient, _1, sourceType(), _2)).get())); } #else GErrorCXX gerror; bool onlyIfExists = false; // always try to create address book, because even if there is // a source there's no guarantee that the actual database was // created already; the original logic below for only setting // this when explicitly requesting a new database // therefore failed in some cases ESourceList *tmp; if (!e_cal_get_sources(&tmp, sourceType(), gerror)) { throwError(SE_HERE, "unable to access backend databases", gerror); } ESourceListCXX sources(tmp, TRANSFER_REF); string id = getDatabaseID(); ESource *source = findSource(sources, id); bool created = false; // Open twice. This solves an issue where Evolution's CalDAV // backend only updates its local cache *after* a sync (= while // closing the calendar?), instead of doing it *before* a sync (in // e_cal_open()). // // This workaround is applied to *all* backends because there might // be others with similar problems and for local storage it is // a reasonably cheap operation (so no harm there). for (int retries = 0; retries < 2; retries++) { if (!source) { // might have been special "<>" or "<>", try that and // creating address book from file:// URI before giving up if ((id.empty() || id == "<>") && m_newSystem) { m_calendar.set(m_newSystem(), (string("system ") + m_typeName).c_str()); } else if (!id.compare(0, 7, "file://")) { m_calendar.set(e_cal_new_from_uri(id.c_str(), sourceType()), (string("creating ") + m_typeName).c_str()); } else { throwError(SE_HERE, string("not found: '") + id + "'"); } created = true; onlyIfExists = false; } else { m_calendar.set(e_cal_new(source, sourceType()), m_typeName.c_str()); } e_cal_set_auth_func(m_calendar, eCalAuthFunc, this); if (!e_cal_open(m_calendar, onlyIfExists, gerror)) { if (created) { // opening newly created address books often failed, perhaps that also applies to calendars - try again gerror.clear(); sleep(5); if (!e_cal_open(m_calendar, onlyIfExists, gerror)) { throwError(SE_HERE, string("opening ") + m_typeName, gerror); } } else { throwError(SE_HERE, string("opening ") + m_typeName, gerror); } } } #endif g_signal_connect_after(m_calendar, "backend-died", G_CALLBACK(Exception::fatalError), (void *)"Evolution Data Server has died unexpectedly, database no longer available."); } bool EvolutionCalendarSource::isEmpty() { // TODO: add more efficient implementation which does not // depend on actually pulling all items from EDS RevisionMap_t revisions; listAllItems(revisions); return revisions.empty(); } #ifdef USE_EDS_CLIENT class ECalClientViewSyncHandler { public: typedef boost::function Process_t; ECalClientViewSyncHandler(ECalClientViewCXX &view, const Process_t &process) : m_process(process), m_view(view) {} bool processSync(GErrorCXX &gerror) { // Listen for view signals m_view.connectSignal("objects-added", boost::bind(m_process, _2)); m_view.connectSignal("complete", boost::bind(&ECalClientViewSyncHandler::completed, this, _2)); // Start the view e_cal_client_view_start (m_view, m_error); if (m_error) { std::swap(gerror, m_error); return false; } // Async -> Sync m_loop.run(); e_cal_client_view_stop (m_view, NULL); if (m_error) { std::swap(gerror, m_error); return false; } else { return true; } } void completed(const GError *error) { m_error = error; m_loop.quit(); } public: // Event loop for Async -> Sync EvolutionAsync m_loop; private: // Process list callback Process_t m_process; // View watched ECalClientViewCXX m_view; // Possible error while watching the view GErrorCXX m_error; }; static void list_revisions(const GSList *objects, EvolutionCalendarSource::RevisionMap_t *revisions) { const GSList *l; for (l = objects; l; l = l->next) { icalcomponent *icomp = (icalcomponent*)l->data; EvolutionCalendarSource::ItemID id = EvolutionCalendarSource::getItemID(icomp); string luid = id.getLUID(); string modTime = EvolutionCalendarSource::getItemModTime(icomp); (*revisions)[luid] = modTime; } } #endif void EvolutionCalendarSource::listAllItems(RevisionMap_t &revisions) { GErrorCXX gerror; #ifdef USE_EDS_CLIENT ECalClientView *view; if (!e_cal_client_get_view_sync (m_calendar, "#t", &view, NULL, gerror)) { throwError(SE_HERE, "getting the view" , gerror); } ECalClientViewCXX viewPtr = ECalClientViewCXX::steal(view); // TODO: Optimization: use set fields_of_interest (UID / REV / LAST-MODIFIED) ECalClientViewSyncHandler handler(viewPtr, boost::bind(list_revisions, _1, &revisions)); if (!handler.processSync(gerror)) { throwError(SE_HERE, "watching view", gerror); } // Update m_allLUIDs m_allLUIDs.clear(); RevisionMap_t::iterator it; for(it = revisions.begin(); it != revisions.end(); ++it) { m_allLUIDs.insertLUID(it->first); } #else GList *nextItem; m_allLUIDs.clear(); if (!e_cal_get_object_list_as_comp(m_calendar, "#t", &nextItem, gerror)) { throwError(SE_HERE, "reading all items", gerror); } eptr listptr(nextItem); while (nextItem) { ECalComponent *ecomp = E_CAL_COMPONENT(nextItem->data); ItemID id = getItemID(ecomp); string luid = id.getLUID(); string modTime = getItemModTime(ecomp); m_allLUIDs.insertLUID(id); revisions[luid] = modTime; nextItem = nextItem->next; } #endif } void EvolutionCalendarSource::close() { m_calendar.reset(); } void EvolutionCalendarSource::readItem(const string &luid, std::string &item, bool raw) { ItemID id(luid); item = retrieveItemAsString(id); } #ifdef USE_EDS_CLIENT icaltimezone * my_tzlookup(const gchar *tzid, gconstpointer ecalclient, GCancellable *cancellable, GError **error) { icaltimezone *zone = NULL; GError *local_error = NULL; if (e_cal_client_get_timezone_sync((ECalClient *)ecalclient, tzid, &zone, cancellable, &local_error)) { return zone; } else if (local_error && local_error->domain == E_CAL_CLIENT_ERROR) { // Ignore *all* E_CAL_CLIENT_ERROR errors, e_cal_client_get_timezone_sync() does // not reliably return a specific code like E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND. // See the 'e_cal_client_check_timezones() + e_cal_client_tzlookup() + Could not retrieve calendar time zone: Invalid object' // mail thread. g_clear_error (&local_error); } else if (local_error) { g_propagate_error (error, local_error); } return NULL; } #endif EvolutionCalendarSource::InsertItemResult EvolutionCalendarSource::insertItem(const string &luid, const std::string &item, bool raw) { bool update = !luid.empty(); InsertItemResultState state = ITEM_OKAY; bool detached = false; string newluid = luid; string data = item; string modTime; /* * Evolution/libical can only deal with \, as separator. * Replace plain , in incoming event CATEGORIES with \, - * based on simple text search/replace and thus will not work * in all cases... * * Inverse operation in extractItemAsString(). */ size_t propstart = data.find("\nCATEGORIES"); bool modified = false; while (propstart != data.npos) { size_t eol = data.find('\n', propstart + 1); size_t comma = data.find(',', propstart); while (eol != data.npos && comma != data.npos && comma < eol) { if (data[comma-1] != '\\') { data.insert(comma, "\\"); comma++; modified = true; } comma = data.find(',', comma + 1); } propstart = data.find("\nCATEGORIES", propstart + 1); } if (modified) { SE_LOG_DEBUG(getDisplayName(), "after replacing , with \\, in CATEGORIES:\n%s", data.c_str()); } eptr icomp(icalcomponent_new_from_string((char *)data.c_str())); if( !icomp ) { throwError(SE_HERE, string("failure parsing ical") + data); } GErrorCXX gerror; // fix up TZIDs if ( #ifdef USE_EDS_CLIENT !e_cal_client_check_timezones(icomp, NULL, my_tzlookup, (const void *)m_calendar.get(), NULL, gerror) #else !e_cal_check_timezones(icomp, NULL, e_cal_tzlookup_ecal, (const void *)m_calendar.get(), gerror) #endif ) { throwError(SE_HERE, string("fixing timezones") + data, gerror); } // insert before adding/updating the event so that the new VTIMEZONE is // immediately available should anyone want it for (icalcomponent *tcomp = icalcomponent_get_first_component(icomp, ICAL_VTIMEZONE_COMPONENT); tcomp; tcomp = icalcomponent_get_next_component(icomp, ICAL_VTIMEZONE_COMPONENT)) { eptr zone(icaltimezone_new(), "icaltimezone"); icaltimezone_set_component(zone, tcomp); GErrorCXX gerror; const char *tzid = icaltimezone_get_tzid(zone); if (!tzid || !tzid[0]) { // cannot add a VTIMEZONE without TZID SE_LOG_DEBUG(getDisplayName(), "skipping VTIMEZONE without TZID"); } else { gboolean success = #ifdef USE_EDS_CLIENT e_cal_client_add_timezone_sync(m_calendar, zone, NULL, gerror) #else e_cal_add_timezone(m_calendar, zone, gerror) #endif ; if (!success) { throwError(SE_HERE, string("error adding VTIMEZONE ") + tzid, gerror); } } } // the component to update/add must be the // ICAL_VEVENT/VTODO_COMPONENT of the item, // e_cal_create/modify_object() fail otherwise icalcomponent *subcomp = icalcomponent_get_first_component(icomp, getCompType()); if (!subcomp) { throwError(SE_HERE, "extracting event"); } // Remove LAST-MODIFIED: the Evolution Exchange Connector does not // properly update this property if it is already present in the // incoming data. icalproperty *modprop; while ((modprop = icalcomponent_get_first_property(subcomp, ICAL_LASTMODIFIED_PROPERTY)) != NULL) { icalcomponent_remove_property(subcomp, modprop); icalproperty_free(modprop); modprop = NULL; } if (!update) { ItemID id = getItemID(subcomp); const char *uid = NULL; // Trying to add a normal event which already exists leads to a // gerror->domain == E_CALENDAR_ERROR // gerror->code == E_CALENDAR_STATUS_OBJECT_ID_ALREADY_EXISTS // error. Depending on the Evolution version, the subcomp // UID gets removed (>= 2.12) or remains unchanged. // // Existing detached recurrences are silently updated when // trying to add them. This breaks our return code and change // tracking. // // Escape this madness by checking the existence ourselve first // based on our list of existing LUIDs. Note that this list is // not updated during a sync. This is correct as long as no LUID // gets used twice during a sync (examples: add + add, delete + add), // which should never happen. newluid = id.getLUID(); if (m_allLUIDs.containsLUID(id)) { state = ITEM_NEEDS_MERGE; } else { // if this is a detached recurrence, then we // must use e_cal_modify_object() below if // the parent or any other child already exists if (!id.m_rid.empty() && m_allLUIDs.containsUID(id.m_uid)) { detached = true; } else { // Creating the parent while children are already in // the calendar confuses EDS (at least 2.12): the // parent is stored in the .ics with the old UID, but // the uid returned to the caller is a different // one. Retrieving the item then fails. Avoid this // problem by removing the children from the calendar, // adding the parent, then updating it with the // saved children. // // TODO: still necessary with e_cal_client API? ICalComps_t children; if (id.m_rid.empty()) { children = removeEvents(id.m_uid, true); } // creating new objects works for normal events and detached occurrences alike if ( #ifdef USE_EDS_CLIENT e_cal_client_create_object_sync(m_calendar, subcomp, (gchar **)&uid, NULL, gerror) #else e_cal_create_object(m_calendar, subcomp, (gchar **)&uid, gerror) #endif ) { #ifdef USE_EDS_CLIENT PlainGStr owner((gchar *)uid); #endif // Evolution workaround: don't rely on uid being set if we already had // one. In Evolution 2.12.1 it was set to garbage. The recurrence ID // shouldn't have changed either. ItemID newid(!id.m_uid.empty() ? id.m_uid : uid, id.m_rid); newluid = newid.getLUID(); modTime = getItemModTime(newid); m_allLUIDs.insertLUID(newid); } else { throwError(SE_HERE, "storing new item", gerror); } // Recreate any children removed earlier: when we get here, // the parent exists and we must update it. BOOST_FOREACH(boost::shared_ptr< eptr > &icalcomp, children) { if ( #ifdef USE_EDS_CLIENT !e_cal_client_modify_object_sync(m_calendar, *icalcomp, CALOBJ_MOD_THIS, NULL, gerror) #else !e_cal_modify_object(m_calendar, *icalcomp, CALOBJ_MOD_THIS, gerror) #endif ) { throwError(SE_HERE, string("recreating item ") + newluid, gerror); } } } } } if (update || (state != ITEM_OKAY && state != ITEM_NEEDS_MERGE) || detached) { ItemID id(newluid); bool isParent = id.m_rid.empty(); // ensure that the component has the right UID and // RECURRENCE-ID if (update) { if (!id.m_uid.empty()) { icalcomponent_set_uid(subcomp, id.m_uid.c_str()); } if (!id.m_rid.empty()) { // Reconstructing the RECURRENCE-ID is non-trivial, // because our luid only contains the date-time, but // not the time zone. Only do the work if the event // really doesn't have a RECURRENCE-ID. struct icaltimetype rid; rid = icalcomponent_get_recurrenceid(subcomp); if (icaltime_is_null_time(rid)) { // Preserve the original RECURRENCE-ID, including // timezone, no matter what the update contains // (might have wrong timezone or UTC). eptr orig(retrieveItem(id)); icalproperty *orig_rid = icalcomponent_get_first_property(orig, ICAL_RECURRENCEID_PROPERTY); if (orig_rid) { icalcomponent_add_property(subcomp, icalproperty_new_clone(orig_rid)); } } } } if (isParent) { // CALOBJ_MOD_THIS for parent items (UID set, no RECURRENCE-ID) // is not supported by all backends: the Exchange Connector // fails with it. It might be an incorrect usage of the API. // Therefore we have to use CALOBJ_MOD_ALL, but that removes // children. bool hasChildren = false; LUIDs::const_iterator it = m_allLUIDs.find(id.m_uid); if (it != m_allLUIDs.end()) { BOOST_FOREACH(const string &rid, it->second) { if (!rid.empty()) { hasChildren = true; break; } } } if (hasChildren) { // Use CALOBJ_MOD_ALL and temporarily remove // the children, then add them again. Otherwise they would // get deleted. ICalComps_t children = removeEvents(id.m_uid, true); // Parent is gone, too, and needs to be recreated. const char *uid = NULL; if ( #ifdef USE_EDS_CLIENT !e_cal_client_create_object_sync(m_calendar, subcomp, (char **)&uid, NULL, gerror) #else !e_cal_create_object(m_calendar, subcomp, (char **)&uid, gerror) #endif ) { throwError(SE_HERE, string("creating updated item ") + luid, gerror); } #ifdef USE_EDS_CLIENT PlainGStr owner((gchar *)uid); #endif // Recreate any children removed earlier: when we get here, // the parent exists and we must update it. BOOST_FOREACH(boost::shared_ptr< eptr > &icalcomp, children) { if ( #ifdef USE_EDS_CLIENT !e_cal_client_modify_object_sync(m_calendar, *icalcomp, CALOBJ_MOD_THIS, NULL, gerror) #else !e_cal_modify_object(m_calendar, *icalcomp, CALOBJ_MOD_THIS, gerror) #endif ) { throwError(SE_HERE, string("recreating item ") + luid, gerror); } } } else { // no children, updating is simple if ( #ifdef USE_EDS_CLIENT !e_cal_client_modify_object_sync(m_calendar, subcomp, CALOBJ_MOD_ALL, NULL, gerror) #else !e_cal_modify_object(m_calendar, subcomp, CALOBJ_MOD_ALL, gerror) #endif ) { throwError(SE_HERE, string("updating item ") + luid, gerror); } } } else { // child event if ( #ifdef USE_EDS_CLIENT !e_cal_client_modify_object_sync(m_calendar, subcomp, CALOBJ_MOD_THIS, NULL, gerror) #else !e_cal_modify_object(m_calendar, subcomp, CALOBJ_MOD_THIS, gerror) #endif ) { throwError(SE_HERE, string("updating item ") + luid, gerror); } } ItemID newid = getItemID(subcomp); newluid = newid.getLUID(); modTime = getItemModTime(newid); } return InsertItemResult(newluid, modTime, state); } EvolutionCalendarSource::ICalComps_t EvolutionCalendarSource::removeEvents(const string &uid, bool returnOnlyChildren, bool ignoreNotFound) { ICalComps_t events; LUIDs::const_iterator it = m_allLUIDs.find(uid); if (it != m_allLUIDs.end()) { BOOST_FOREACH(const string &rid, it->second) { ItemID id(uid, rid); icalcomponent *icomp = retrieveItem(id); if (icomp) { if (id.m_rid.empty() && returnOnlyChildren) { icalcomponent_free(icomp); } else { events.push_back(ICalComps_t::value_type(new eptr(icomp))); } } } } // removes all events with that UID, including children GErrorCXX gerror; if (!uid.empty() && // e_cal_client_remove_object_sync() in EDS 3.8 aborts the process for empty UID, other versions cannot succeed, so skip the call. #ifdef USE_EDS_CLIENT !e_cal_client_remove_object_sync(m_calendar, uid.c_str(), NULL, CALOBJ_MOD_ALL, NULL, gerror) #else !e_cal_remove_object(m_calendar, uid.c_str(), gerror) #endif ) { if (IsCalObjNotFound(gerror)) { SE_LOG_DEBUG(getDisplayName(), "%s: request to delete non-existant item ignored", uid.c_str()); if (!ignoreNotFound) { throwError(SE_HERE, STATUS_NOT_FOUND, string("delete item: ") + uid); } } else { throwError(SE_HERE, string("deleting item " ) + uid, gerror); } } return events; } void EvolutionCalendarSource::removeItem(const string &luid) { GErrorCXX gerror; ItemID id(luid); if (id.m_rid.empty()) { /* * Removing the parent item also removes all children. Evolution * does that automatically. Calling e_cal_remove_object_with_mod() * without valid rid confuses Evolution, don't do it. As a workaround * remove all items with the given uid and if we only wanted to * delete the parent, then recreate the children. */ ICalComps_t children = removeEvents(id.m_uid, true, TRANSFER_REF); // recreate children bool first = true; BOOST_FOREACH(boost::shared_ptr< eptr > &icalcomp, children) { if (first) { char *uid; if ( #ifdef USE_EDS_CLIENT !e_cal_client_create_object_sync(m_calendar, *icalcomp, &uid, NULL, gerror) #else !e_cal_create_object(m_calendar, *icalcomp, &uid, gerror) #endif ) { throwError(SE_HERE, string("recreating first item ") + luid, gerror); } #ifdef USE_EDS_CLIENT PlainGStr owner((gchar *)uid); #endif first = false; } else { if ( #ifdef USE_EDS_CLIENT !e_cal_client_modify_object_sync(m_calendar, *icalcomp, CALOBJ_MOD_THIS, NULL, gerror) #else !e_cal_modify_object(m_calendar, *icalcomp, CALOBJ_MOD_THIS, gerror) #endif ) { throwError(SE_HERE, string("recreating following item ") + luid, gerror); } } } } else { // workaround for EDS 2.32 API semantic: succeeds even if // detached recurrence doesn't exist and adds EXDATE, // therefore we have to check for existence first eptr item(retrieveItem(id)); gboolean success = !item ? false : #ifdef USE_EDS_CLIENT // TODO: is this necessary? e_cal_client_remove_object_sync(m_calendar, id.m_uid.c_str(), id.m_rid.c_str(), CALOBJ_MOD_ONLY_THIS, NULL, gerror) #else e_cal_remove_object_with_mod(m_calendar, id.m_uid.c_str(), id.m_rid.c_str(), CALOBJ_MOD_THIS, gerror) #endif ; if (!item || (!success && IsCalObjNotFound(gerror))) { SE_LOG_DEBUG(getDisplayName(), "%s: request to delete non-existant item", luid.c_str()); throwError(SE_HERE, STATUS_NOT_FOUND, string("delete item: ") + id.getLUID()); } else if (!success) { throwError(SE_HERE, string("deleting item " ) + luid, gerror); } } m_allLUIDs.eraseLUID(id); if (!id.m_rid.empty()) { // Removing the child may have modified the parent. // We must record the new LAST-MODIFIED string, // otherwise it might be reported as modified during // the next sync (timing dependent: if the parent // was updated before removing the child *and* the // update and remove fall into the same second, // then the modTime does not change again during the // removal). try { ItemID parent(id.m_uid, ""); string modTime = getItemModTime(parent); string parentLUID = parent.getLUID(); updateRevision(getTrackingNode(), parentLUID, parentLUID, modTime); } catch (...) { // There's no guarantee that the parent still exists. // Instead of checking that, ignore errors (a bit hacky, // but better than breaking the removal). } } } icalcomponent *EvolutionCalendarSource::retrieveItem(const ItemID &id) { GErrorCXX gerror; icalcomponent *comp = NULL; if ( #ifdef USE_EDS_CLIENT !e_cal_client_get_object_sync(m_calendar, id.m_uid.c_str(), !id.m_rid.empty() ? id.m_rid.c_str() : NULL, &comp, NULL, gerror) #else !e_cal_get_object(m_calendar, id.m_uid.c_str(), !id.m_rid.empty() ? id.m_rid.c_str() : NULL, &comp, gerror) #endif ) { if (IsCalObjNotFound(gerror)) { throwError(SE_HERE, STATUS_NOT_FOUND, string("retrieving item: ") + id.getLUID()); } else { throwError(SE_HERE, string("retrieving item: ") + id.getLUID(), gerror); } } if (!comp) { throwError(SE_HERE, string("retrieving item: ") + id.getLUID()); } eptr ptr(comp); /* * EDS bug: if a parent doesn't exist while a child does, and we ask * for the parent, we are sent the (first?) child. Detect this and * turn it into a "not found" error. */ if (id.m_rid.empty()) { struct icaltimetype rid = icalcomponent_get_recurrenceid(comp); if (!icaltime_is_null_time(rid)) { throwError(SE_HERE, string("retrieving item: got child instead of parent: ") + id.m_uid); } } return ptr.release(); } string EvolutionCalendarSource::retrieveItemAsString(const ItemID &id) { eptr comp(retrieveItem(id)); eptr icalstr; #ifdef USE_EDS_CLIENT icalstr = e_cal_client_get_component_as_string(m_calendar, comp); #else icalstr = e_cal_get_component_as_string(m_calendar, comp); #endif if (!icalstr) { // One reason why e_cal_get_component_as_string() can fail is // that it uses a TZID which has no corresponding VTIMEZONE // definition. Evolution GUI ignores the TZID and interprets // the times as local time. Do the same when exporting the // event by removing the bogus TZID. icalproperty *prop = icalcomponent_get_first_property (comp, ICAL_ANY_PROPERTY); while (prop) { // removes only the *first* TZID - but there shouldn't be more than one icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER); prop = icalcomponent_get_next_property (comp, ICAL_ANY_PROPERTY); } // now try again #ifdef USE_EDS_CLIENT icalstr = e_cal_client_get_component_as_string(m_calendar, comp); #else icalstr = e_cal_get_component_as_string(m_calendar, comp); #endif if (!icalstr) { throwError(SE_HERE, string("could not encode item as iCalendar: ") + id.getLUID()); } else { SE_LOG_DEBUG(getDisplayName(), "had to remove TZIDs because e_cal_get_component_as_string() failed for:\n%s", icalstr.get()); } } /* * Evolution/libical can only deal with \, as separator. * Replace plain \, in outgoing event CATEGORIES with , - * based on simple text search/replace and thus will not work * in all cases... * * Inverse operation in insertItem(). */ string data = string(icalstr); size_t propstart = data.find("\nCATEGORIES"); bool modified = false; while (propstart != data.npos) { size_t eol = data.find('\n', propstart + 1); size_t comma = data.find(',', propstart); while (eol != data.npos && comma != data.npos && comma < eol) { if (data[comma-1] == '\\') { data.erase(comma - 1, 1); comma--; modified = true; } comma = data.find(',', comma + 1); } propstart = data.find("\nCATEGORIES", propstart + 1); } if (modified) { SE_LOG_DEBUG(getDisplayName(), "after replacing \\, with , in CATEGORIES:\n%s", data.c_str()); } return data; } std::string EvolutionCalendarSource::getDescription(const string &luid) { try { eptr comp(retrieveItem(ItemID(luid))); std::string descr; const char *summary = icalcomponent_get_summary(comp); if (summary && summary[0]) { descr += summary; } if (m_type == EVOLUTION_CAL_SOURCE_TYPE_EVENTS) { const char *location = icalcomponent_get_location(comp); if (location && location[0]) { if (!descr.empty()) { descr += ", "; } descr += location; } } if (m_type == EVOLUTION_CAL_SOURCE_TYPE_MEMOS && descr.empty()) { // fallback to first line of body text icalproperty *desc = icalcomponent_get_first_property(comp, ICAL_DESCRIPTION_PROPERTY); if (desc) { const char *text = icalproperty_get_description(desc); if (text) { const char *eol = strchr(text, '\n'); if (eol) { descr.assign(text, eol - text); } else { descr = text; } } } } return descr; } catch (...) { // Instead of failing we log the error and ask // the caller to log the UID. That way transient // errors or errors in the logging code don't // prevent syncs. handleException(); return ""; } } string EvolutionCalendarSource::ItemID::getLUID() const { return getLUID(m_uid, m_rid); } string EvolutionCalendarSource::ItemID::getLUID(const string &uid, const string &rid) { return uid + "-rid" + rid; } EvolutionCalendarSource::ItemID::ItemID(const string &luid) { size_t ridoff = luid.rfind("-rid"); if (ridoff != luid.npos) { const_cast(m_uid) = luid.substr(0, ridoff); const_cast(m_rid) = luid.substr(ridoff + strlen("-rid")); } else { const_cast(m_uid) = luid; } } EvolutionCalendarSource::ItemID EvolutionCalendarSource::getItemID(ECalComponent *ecomp) { icalcomponent *icomp = e_cal_component_get_icalcomponent(ecomp); if (!icomp) { SE_THROW("internal error in getItemID(): ECalComponent without icalcomp"); } return getItemID(icomp); } EvolutionCalendarSource::ItemID EvolutionCalendarSource::getItemID(icalcomponent *icomp) { const char *uid; struct icaltimetype rid; uid = icalcomponent_get_uid(icomp); rid = icalcomponent_get_recurrenceid(icomp); return ItemID(uid ? uid : "", icalTime2Str(rid)); } string EvolutionCalendarSource::getItemModTime(ECalComponent *ecomp) { struct icaltimetype *modTime; e_cal_component_get_last_modified(ecomp, &modTime); eptr > modTimePtr(modTime); if (!modTimePtr) { return ""; } else { return icalTime2Str(*modTimePtr.get()); } } string EvolutionCalendarSource::getItemModTime(const ItemID &id) { if (!needChanges()) { return ""; } eptr icomp(retrieveItem(id)); return getItemModTime(icomp); } string EvolutionCalendarSource::getItemModTime(icalcomponent *icomp) { icalproperty *modprop = icalcomponent_get_first_property(icomp, ICAL_LASTMODIFIED_PROPERTY); if (!modprop) { return ""; } struct icaltimetype modTime = icalproperty_get_lastmodified(modprop); return icalTime2Str(modTime); } string EvolutionCalendarSource::icalTime2Str(const icaltimetype &tt) { static const struct icaltimetype null = { 0 }; if (!memcmp(&tt, &null, sizeof(null))) { return ""; } else { eptr timestr(ical_strdup(icaltime_as_ical_string(tt))); if (!timestr) { SE_THROW("cannot convert to time string"); } return timestr.get(); } } SE_END_CXX #endif /* ENABLE_ECAL */ #ifdef ENABLE_MODULES # include "EvolutionCalendarSourceRegister.cpp" #endif syncevolution-1.5/src/backends/evolution/e-cal-check-timezones.c0000644000373300001540000004304212326412403026316 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008 Novell, Inc. * Copyright (C) 2009 Patrick Ohly * * Authors: Patrick Ohly * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ #ifndef HANDLE_LIBICAL_MEMORY # define HANDLE_LIBICAL_MEMORY 1 #endif #include #ifdef LIBICAL_MEMFIXES /* avoid dependency on icalstrdup.h, works when compiling as part of EDS >= 2.22 */ # define ical_strdup(_x) (_x) #else /* use icalstrdup.h to get runtime detection of memory fix patch */ # include #endif #include "e-cal-check-timezones.h" #include #include /** * Matches a location to a system timezone definition via a fuzzy * search and returns the matching TZID, or NULL if none found. * * Currently simply strips a suffix introduced by a hyphen, * as in "America/Denver-(Standard)". */ static const char *e_cal_match_location(const char *location) { icaltimezone *icomp; const char *tail; size_t len; char *buffer; icomp = icaltimezone_get_builtin_timezone (location); if (icomp) { return icaltimezone_get_tzid(icomp); } /* try a bit harder by stripping trailing suffix */ tail = strrchr(location, '-'); len = tail ? (tail - location) : strlen(location); buffer = g_malloc(len + 1); if (buffer) { memcpy(buffer, location, len); buffer[len] = 0; icomp = icaltimezone_get_builtin_timezone (buffer); g_free(buffer); if (icomp) { return icaltimezone_get_tzid(icomp); } } return NULL; } /** * e_cal_match_tzid: * matches a TZID against the system timezone definitions * and returns the matching TZID, or NULL if none found */ const char *e_cal_match_tzid(const char *tzid) { const char *location; const char *systzid; size_t len = strlen(tzid); ssize_t eostr; /* * Try without any trailing spaces/digits: they might have been added * by e_cal_check_timezones() in order to distinguish between * different incompatible definitions. At that time mapping * to system time zones must have failed, but perhaps now * we have better code and it succeeds... */ eostr = len - 1; while (eostr >= 0 && isdigit(tzid[eostr])) { eostr--; } while (eostr >= 0 && isspace(tzid[eostr])) { eostr--; } if (eostr + 1 < len) { char *strippedtzid = g_strndup(tzid, eostr + 1); if (strippedtzid) { systzid = e_cal_match_tzid(strippedtzid); g_free(strippedtzid); if (systzid) { return systzid; } } } /* * old-style Evolution: /softwarestudio.org/Olson_20011030_5/America/Denver * * jump from one slash to the next and check whether the remainder * is a known location; start with the whole string (just in case) */ for (location = tzid; location && location[0]; location = strchr(location + 1, '/')) { systzid = e_cal_match_location(location[0] == '/' ? location + 1 : location); if (systzid) { return systzid; } } /* TODO: lookup table for Exchange TZIDs */ return NULL; } static void patch_tzids(icalcomponent *subcomp, GHashTable *mapping) { char *tzid = NULL; if (icalcomponent_isa(subcomp) != ICAL_VTIMEZONE_COMPONENT) { icalproperty *prop = icalcomponent_get_first_property(subcomp, ICAL_ANY_PROPERTY); while (prop) { icalparameter *param = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER); while (param) { const char *oldtzid; const char *newtzid; g_free(tzid); tzid = g_strdup(icalparameter_get_tzid(param)); if (!g_hash_table_lookup_extended(mapping, tzid, (gpointer *)&oldtzid, (gpointer *)&newtzid)) { /* Corresponding VTIMEZONE not seen before! */ newtzid = e_cal_match_tzid(tzid); } if (newtzid) { icalparameter_set_tzid(param, newtzid); } param = icalproperty_get_next_parameter(prop, ICAL_TZID_PARAMETER); } prop = icalcomponent_get_next_property(subcomp, ICAL_ANY_PROPERTY); } } g_free(tzid); } static void addsystemtz(gpointer key, gpointer value, gpointer user_data) { const char *tzid = key; icalcomponent *comp = user_data; icaltimezone *zone; zone = icaltimezone_get_builtin_timezone_from_tzid(tzid); if (zone) { icalcomponent_add_component(comp, icalcomponent_new_clone(icaltimezone_get_component(zone))); } } /** * e_cal_check_timezones: * @comp: a VCALENDAR containing a list of * VTIMEZONE and arbitrary other components, in * arbitrary order: these other components are * modified by this call * @comps: a list of icalcomponent instances which * also have to be patched; may be NULL * @tzlookup: a callback function which is called to retrieve * a calendar's VTIMEZONE definition; the returned * definition is *not* freed by e_cal_check_timezones() * (to be compatible with e_cal_get_timezone()); * NULL indicates that no such timezone exists * or an error occurred * @custom: an arbitrary pointer which is passed through to * the tzlookup function * @error: an error description in case of a failure * * This function cleans up VEVENT, VJOURNAL, VTODO and VTIMEZONE * items which are to be imported into Evolution. * * Using VTIMEZONE definitions is problematic because they cannot be * updated properly when timezone definitions change. They are also * incomplete (for compatibility reason only one set of rules for * summer saving changes can be included, even if different rules * apply in different years). This function looks for matches of the * used TZIDs against system timezones and replaces such TZIDs with * the corresponding system timezone. This works for TZIDs containing * a location (found via a fuzzy string search) and for Outlook TZIDs * (via a hard-coded lookup table). * * Some programs generate broken meeting invitations with TZID, but * without including the corresponding VTIMEZONE. Importing such * invitations unchanged causes problems later on (meeting displayed * incorrectly, #e_cal_get_component_as_string fails). The situation * where this occurred in the past (found by a SyncEvolution user) is * now handled via the location based mapping. * * If this mapping fails, this function also deals with VTIMEZONE * conflicts: such conflicts occur when the calendar already contains * an old VTIMEZONE definition with the same TZID, but different * summer saving rules. Replacing the VTIMEZONE potentially breaks * displaying of old events, whereas not replacing it breaks the new * events (the behavior in Evolution <= 2.22.1). * * The way this problem is resolved is by renaming the new VTIMEZONE * definition until the TZID is unique. A running count is appended to * the TZID. All items referencing the renamed TZID are adapted * accordingly. * * Return value: TRUE if successful, FALSE otherwise. */ gboolean e_cal_check_timezones(icalcomponent *comp, GList *comps, icaltimezone *(*tzlookup)(const char *tzid, const void *custom, GError **error), const void *custom, GError **error) { gboolean success = TRUE; icalcomponent *subcomp = NULL; icaltimezone *zone = icaltimezone_new(); char *key = NULL, *value = NULL; char *buffer = NULL; char *zonestr = NULL; char *tzid = NULL; GList *l; /** a hash from old to new tzid; strings dynamically allocated */ GHashTable *mapping = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); /** a hash of all system time zone IDs which have to be added; strings are shared with mapping hash */ GHashTable *systemtzids = g_hash_table_new(g_str_hash, g_str_equal); *error = NULL; if (!mapping || !zone) { goto nomem; } /* iterate over all VTIMEZONE definitions */ subcomp = icalcomponent_get_first_component(comp, ICAL_VTIMEZONE_COMPONENT); while (subcomp) { if (icaltimezone_set_component(zone, subcomp)) { g_free(tzid); tzid = g_strdup(icaltimezone_get_tzid(zone)); if (tzid) { const char *newtzid = e_cal_match_tzid(tzid); if (newtzid) { /* matched against system time zone */ g_free(key); key = g_strdup(tzid); if (!key) { goto nomem; } g_free(value); value = g_strdup(newtzid); if (!value) { goto nomem; } g_hash_table_insert(mapping, key, value); g_hash_table_insert(systemtzids, value, NULL); key = value = NULL; } else { zonestr = ical_strdup(icalcomponent_as_ical_string(subcomp)); /* check for collisions with existing timezones */ int counter; for (counter = 0; counter < 100 /* sanity limit */; counter++) { icaltimezone *existing_zone; if (counter) { g_free(value); value = g_strdup_printf("%s %d", tzid, counter); } existing_zone = tzlookup(counter ? value : tzid, custom, error); if (!existing_zone) { if (*error) { goto failed; } else { break; } } g_free(buffer); buffer = ical_strdup(icalcomponent_as_ical_string(icaltimezone_get_component(existing_zone))); if (counter) { char *fulltzid = g_strdup_printf("TZID:%s", value); size_t baselen = strlen("TZID:") + strlen(tzid); size_t fulllen = strlen(fulltzid); char *tzidprop; /* * Map TZID with counter suffix back to basename. */ tzidprop = strstr(buffer, fulltzid); if (tzidprop) { memmove(tzidprop + baselen, tzidprop + fulllen, strlen(tzidprop + fulllen) + 1); } g_free(fulltzid); } /* * If the strings are identical, then the * VTIMEZONE definitions are identical. If * they are not identical, then VTIMEZONE * definitions might still be semantically * correct and we waste some space by * needlesly duplicating the VTIMEZONE. This * is expected to occur rarely (if at all) in * practice. */ if (!strcmp(zonestr, buffer)) { break; } } if (!counter) { /* does not exist, nothing to do */ } else { /* timezone renamed */ icalproperty *prop = icalcomponent_get_first_property(subcomp, ICAL_TZID_PROPERTY); while (prop) { icalproperty_set_value_from_string(prop, value, "NO"); prop = icalcomponent_get_next_property(subcomp, ICAL_ANY_PROPERTY); } g_free(key); key = g_strdup(tzid); g_hash_table_insert(mapping, key, value); key = value = NULL; } } } } subcomp = icalcomponent_get_next_component(comp, ICAL_VTIMEZONE_COMPONENT); } /* * now replace all TZID parameters in place */ subcomp = icalcomponent_get_first_component(comp, ICAL_ANY_COMPONENT); while (subcomp) { /* * Leave VTIMEZONE unchanged, iterate over properties of * everything else. * * Note that no attempt is made to remove unused VTIMEZONE * definitions. That would just make the code more complex for * little additional gain. However, newly used time zones are * added below. */ patch_tzids (subcomp, mapping); subcomp = icalcomponent_get_next_component(comp, ICAL_ANY_COMPONENT); } for (l = comps; l; l = l->next) { patch_tzids (l->data, mapping); } /* * add system time zones that we mapped to: adding them ensures * that the VCALENDAR remains consistent */ g_hash_table_foreach(systemtzids, addsystemtz, comp); goto done; nomem: /* set gerror for "out of memory" if possible, otherwise abort via g_error() */ *error = g_error_new(E_CALENDAR_ERROR, E_CALENDAR_STATUS_OTHER_ERROR, "out of memory"); if (!*error) { g_error("e_cal_check_timezones(): out of memory, cannot proceed - sorry!"); } failed: /* gerror should have been set already */ success = FALSE; done: if (mapping) { g_hash_table_destroy(mapping); } if (systemtzids) { g_hash_table_destroy(systemtzids); } if (zone) { icaltimezone_free(zone, 1); } g_free(tzid); g_free(zonestr); g_free(buffer); g_free(key); g_free(value); return success; } /** * e_cal_tzlookup_ecal: * @custom: must be a valid ECal pointer * * An implementation of the tzlookup callback which clients * can use. Calls #e_cal_get_timezone. */ icaltimezone *e_cal_tzlookup_ecal(const char *tzid, const void *custom, GError **error) { ECal *ecal = (ECal *)custom; icaltimezone *zone = NULL; if (e_cal_get_timezone(ecal, tzid, &zone, error)) { g_assert(*error == NULL); return zone; } else { g_assert(*error); if ((*error)->domain == E_CALENDAR_ERROR && ((*error)->code == E_CALENDAR_STATUS_OBJECT_NOT_FOUND /* EDS < 2.30 */ || (*error)->code == E_CALENDAR_STATUS_INVALID_OBJECT /* EDS >= 2.30 */ )) { /* * we had to trigger this error to check for the timezone existance, * clear it and return NULL */ g_clear_error(error); } return NULL; } } /** * e_cal_tzlookup_icomp: * @custom: must be a icalcomponent pointer which contains * either a VCALENDAR with VTIMEZONEs or VTIMEZONES * directly * * An implementation of the tzlookup callback which backends * like the file backend can use. Searches for the timezone * in the component list. */ icaltimezone *e_cal_tzlookup_icomp(const char *tzid, const void *custom, GError **error) { icalcomponent *icomp = (icalcomponent *)custom; return icalcomponent_get_timezone(icomp, (char *)tzid); } syncevolution-1.5/src/backends/evolution/e-cal-check-timezones.h0000644000373300001540000000355512326412403026330 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008 Novell, Inc. * Copyright (C) 2009 Patrick Ohly * * Authors: Patrick Ohly * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser 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. */ #ifndef E_CAL_CHECK_TIMEZONES_H #define E_CAL_CHECK_TIMEZONES_H #include /* #include */ #include G_BEGIN_DECLS gboolean e_cal_check_timezones(icalcomponent *comp, GList *comps, icaltimezone *(*tzlookup)(const char *tzid, const void *custom, GError **error), const void *custom, GError **error); icaltimezone *e_cal_tzlookup_ecal(const char *tzid, const void *custom, GError **error); icaltimezone *e_cal_tzlookup_icomp(const char *tzid, const void *custom, GError **error); const char *e_cal_match_tzid(const char *tzid); G_END_DECLS #endif /* E_CAL_CHECK_TIMEZONES_H */ syncevolution-1.5/src/backends/file/0000755000373300037200000000000012424707641021163 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/file/configure-sub.in0000644000373300001540000000272512326412403024101 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. dnl Checks for required libraris can go here; none required for simple files. dnl dnl This is from the sqlite backend: dnl PKG_CHECK_MODULES(SQLITE, sqlite3, SQLITEFOUND=yes, [SQLITEFOUND=no]) dnl AC_SUBST(SQLITE_CFLAGS) dnl AC_SUBST(SQLITE_LIBS) FILE_CFLAGS= FILE_LIBS= AC_SUBST(FILE_CFLAGS) AC_SUBST(FILE_LIBS) dnl If additional compile flags are necessary to include the header dnl files of the backend, then add them here. BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $FILE_CFLAGS" dnl name of backend library (there could be more than one per directory), dnl name of the directory, dnl help string, dnl --enable/disable chosen explicitly dnl default, may depend on availability of prerequisites in more complex backends SE_ARG_ENABLE_BACKEND(file, file, [AS_HELP_STRING([--disable-file], [disable file-based backend which stores items in separate files in a fixed directory (default on)])], [enable_file="$enableval"], [enable_file="yes"] ) if test "$enable_file" = "yes"; then dnl It's good to check the prerequisites here, in case --enable-file was used. dnl test "x${SQLITEFOUND}" = "xyes" || AC_MSG_ERROR([--enable-sqlite requires pkg-config information for sqlite3, which was not found]) AC_DEFINE(ENABLE_FILE, 1, [file available]) fi syncevolution-1.5/src/backends/file/FileSyncSourceRegister.cpp0000644000373300001540000001530612326412403026106 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "FileSyncSource.h" #include "test.h" #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); // The string returned by getSourceType() is always the one // registered as main Aliases() below. bool isMe = sourceType.m_backend == "file"; #ifndef ENABLE_FILE // tell SyncEvolution if the user wanted to use a disabled sync source, // otherwise let it continue searching return isMe ? RegisterSyncSource::InactiveSource(params) : NULL; #else // Also recognize one of the standard types? // Not in the FileSyncSource! bool maybeMe = false /* sourceType.m_backend == "addressbook" */; if (isMe || maybeMe) { // The FileSyncSource always needs the database format. if (!sourceType.m_localFormat.empty()) { return new FileSyncSource(params, sourceType.m_localFormat); } else { return NULL; } } return NULL; #endif } static RegisterSyncSource registerMe("Files in one directory", #ifdef ENABLE_FILE true, #else false, #endif createSource, "Files in one directory = file\n" " Stores items in one directory as one file per item.\n" " The directory is selected via database=[file://].\n" " It will only be created if the prefix is given, otherwise\n" " it must exist already.\n" " The database format *must* be specified explicitly. It may be\n" " different from the sync format, as long as there are\n" " conversion rules (for example, vCard 2.1 <-> vCard 3.0). If\n" " the sync format is empty, the database format is used.\n" " Examples for databaseFormat + syncFormat:\n" " text/plain + text/plain\n" " text/x-vcard + text/vcard\n" " text/calendar\n" " Examples for evolutionsource:\n" " /home/joe/datadir - directory must exist\n" " file:///tmp/scratch - directory is created\n", Values() + (Aliases("file") + "Files in one directory")); #ifdef ENABLE_FILE #ifdef ENABLE_UNIT_TESTS class FileSyncSourceUnitTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(FileSyncSourceUnitTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("file", "file:text/vcard:3.0", true)); source.reset(SyncSource::createTestingSource("file", "file:text/plain:1.0", true)); source.reset(SyncSource::createTestingSource("file", "Files in one directory:text/x-vcard:2.1", true)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(FileSyncSourceUnitTest); #endif // ENABLE_UNIT_TESTS // The anonymous namespace ensures that we don't get // name clashes: although the classes and objects are // only defined in this file, the methods generated // for local classes will clash with other methods // of other classes with the same name if no namespace // is used. // // The code above is not yet inside the anonymous // name space because it would show up inside // the CPPUnit unit test names. Use a unique class // name there. namespace { #if 0 } #endif static class VCard30Test : public RegisterSyncSourceTest { public: VCard30Test() : RegisterSyncSourceTest("file_contact", "eds_contact") {} virtual void updateConfig(ClientTestConfig &config) const { // tell testInsertTwice that we won't detect duplicates config.m_sourceKnowsItemSemantic = false; config.m_type = "file:text/vcard:3.0"; } } VCard30Test; static class ICal20Test : public RegisterSyncSourceTest { public: ICal20Test() : RegisterSyncSourceTest("file_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "file:text/calendar:2.0"; // A sync source which supports linked items (= recurring // event with detached exception) is expected to handle // inserting the parent or child twice by turning the // second operation into an update. The file backend is // to dumb for that and therefore fails these tests: // // Client::Source::file_event::testLinkedItemsInsertParentTwice // Client::Source::file_event::testLinkedItemsInsertChildTwice // // Disable linked item testing to avoid this. config.m_sourceKnowsItemSemantic = false; } } ICal20Test; static class ITodo20Test : public RegisterSyncSourceTest { public: ITodo20Test() : RegisterSyncSourceTest("file_task", "eds_task") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_sourceKnowsItemSemantic = false; config.m_type = "file:text/calendar:2.0"; } } ITodo20Test; static class SuperTest : public RegisterSyncSourceTest { public: SuperTest() : RegisterSyncSourceTest("file_calendar+todo", "calendar+todo") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_sourceKnowsItemSemantic = false; config.m_type = "virtual:text/x-vcalendar"; config.m_subConfigs = "file_event,file_task"; } } superTest; } #endif // ENABLE_FILE SE_END_CXX syncevolution-1.5/src/backends/file/file.am0000644000373300001540000000244112326412403022232 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/file/configure-sub.in src_backends_file_lib = src/backends/file/syncfile.la MOSTLYCLEANFILES += $(src_backends_file_lib) if ENABLE_MODULES src_backends_file_backenddir = $(BACKENDS_DIRECTORY) src_backends_file_backend_LTLIBRARIES = $(src_backends_file_lib) else noinst_LTLIBRARIES += $(src_backends_file_lib) endif src_backends_file_src = \ src/backends/file/FileSyncSource.h \ src/backends/file/FileSyncSource.cpp src_backends_file_syncfile_la_SOURCES = $(src_backends_file_src) src_backends_file_syncfile_la_LIBADD = $(FILE_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_file_syncfile_la_LDFLAGS = -module -avoid-version src_backends_file_syncfile_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) src_backends_file_syncfile_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_file_syncfile_la_DEPENDENCIES = src/syncevo/libsyncevolution.la # If you need special test cases for your sync source, then # install them here. Here's how the sqlite backend does that: # #../../testcases/sqlite_vcard21.vcf: $(FUNAMBOL_SUBDIR)/test/test/testcases/vcard21.vcf # mkdir -p ${@D} # perl -e '$$_ = join("", <>); s/^(ADR|TEL|EMAIL|PHOTO).*?(?=^\S)//msg; s/;X-EVOLUTION-UI-SLOT=\d+//g; print;' $< >$@ #all: ../../testcases/sqlite_vcard21.vcf syncevolution-1.5/src/backends/file/FileSyncSource.h0000644000373300001540000001007512326412403024044 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_FILESYNCSOURCE #define INCL_FILESYNCSOURCE #include #ifdef ENABLE_FILE #include #include #include SE_BEGIN_CXX /** * Stores each SyncML item as a separate file in a directory. The * directory has to be specified via the database name, using * [file://] as format. The file:// prefix is optional, but the * directory is only created if it is used. * SyncSource::getDatabaseID() gives us the database name. * * Change tracking is done via the file systems modification time * stamp: editing a file treats it as modified and then sends it to * the server in the next sync. Removing and adding files also works. * * The local unique identifier for each item is its name in the * directory. New files are created using a running count which * initialized based on the initial content of the directory to * "highest existing number + 1" and incremented to avoid collisions. * * Although this sync source itself does not care about the content of * each item/file, the server needs to know what each item sent to it * contains and what items the source is able to receive. Therefore * the "type" property for this source must contain a data format * specified, including a version for it. Here are some examples: * - type=file:text/vcard:3.0 * - type=file:text/plain:1.0 */ class FileSyncSource : public TrackingSyncSource, private boost::noncopyable { public: FileSyncSource(const SyncSourceParams ¶ms, const string &dataformat); protected: /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual void close(); virtual Databases getDatabases(); virtual std::string getMimeType() const; virtual std::string getMimeVersion() const; /* implementation of TrackingSyncSource interface */ virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &luid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &uid); private: /** * @name values obtained from the source's "database format" configuration property * * Other sync sources only support one hard-coded type and * don't need such variables. */ /**@{*/ string m_mimeType; /**@}*/ /** directory selected via the database name in open(), reset in close() */ string m_basedir; /** a counter which is used to name new files */ long m_entryCounter; /** * get access time for file, formatted as revision string * @param filename absolute path or path relative to current directory */ string getATimeString(const string &filename); /** * create full filename from basedir and entry name */ string createFilename(const string &entry); void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { TrackingSyncSource::getSynthesisInfo(info, fragments); // files can store all kinds of extensions, so tell // engine to enable them info.m_backendRule = "ALL"; } }; SE_END_CXX #endif // ENABLE_FILE #endif // INCL_FILESYNCSOURCE syncevolution-1.5/src/backends/file/FileSyncSource.cpp0000664000373300001540000002001712330727742024410 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_FILE #include "FileSyncSource.h" // SyncEvolution includes a copy of Boost header files. // They are safe to use without creating additional // build dependencies. boost::filesystem requires a // library and therefore is avoided here. Some // utility functions from SyncEvolution are used // instead, plus standard C/Posix functions. #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX FileSyncSource::FileSyncSource(const SyncSourceParams ¶ms, const string &dataformat) : TrackingSyncSource(params), m_mimeType(dataformat), m_entryCounter(0) { if (dataformat.empty()) { throwError(SE_HERE, "a database format must be specified"); } } std::string FileSyncSource::getMimeType() const { return m_mimeType.c_str(); } std::string FileSyncSource::getMimeVersion() const { if (boost::iequals(m_mimeType, "text/vcard")) { return "3.0"; } else if (boost::iequals(m_mimeType, "text/x-vcard")) { return "2.1"; } else if (boost::iequals(m_mimeType, "text/calendar")) { return "2.0"; } else if (boost::iequals(m_mimeType, "text/x-vcalendar")) { return "1.0"; } else { return ""; } } void FileSyncSource::open() { const string &database = getDatabaseID(); const string prefix("file://"); string basedir; bool createDir = false; std::string varname = StringPrintf("SYNCEVOLUTION_FILE_SOURCE_DELAY_OPEN_%s", getDisplayName().c_str()); const char *delay = getenv(varname.c_str()); if (delay) { int seconds = atoi(delay); SE_LOG_DEBUG(getDisplayName(), "sleeping %ds while opening file source", seconds); Sleep(seconds); SE_LOG_DEBUG(getDisplayName(), "continue opening file source"); } // file:// is optional. It indicates that the // directory is to be created. if (boost::starts_with(database, prefix)) { basedir = database.substr(prefix.size()); createDir = true; } else { basedir = database; } // check and, if allowed and necessary, create it if (!isDir(basedir)) { if (errno == ENOENT && createDir) { mkdir_p(basedir.c_str()); } else { throwError(SE_HERE, basedir, errno); } } // success! m_basedir = basedir; } bool FileSyncSource::isEmpty() { DIR *dir = NULL; bool empty = true; try { dir = opendir(m_basedir.c_str()); if (!dir) { Exception::throwError(SE_HERE, m_basedir, errno); } errno = 0; struct dirent *entry = readdir(dir); while (entry) { if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { empty = false; break; } entry = readdir(dir); } if (errno) { Exception::throwError(SE_HERE, m_basedir, errno); } } catch(...) { if (dir) { closedir(dir); } throw; } closedir(dir); return empty; } void FileSyncSource::close() { m_basedir.clear(); } FileSyncSource::Databases FileSyncSource::getDatabases() { Databases result; result.push_back(Database("select database via directory path", "[file://]")); return result; } void FileSyncSource::listAllItems(RevisionMap_t &revisions) { ReadDir dirContent(m_basedir); std::string varname = StringPrintf("SYNCEVOLUTION_FILE_SOURCE_DELAY_LISTALL_%s", getDisplayName().c_str()); const char *delay = getenv(varname.c_str()); if (delay) { int seconds = atoi(delay); SE_LOG_DEBUG(getDisplayName(), "sleeping %ds while listing items in file source", seconds); Sleep(seconds); SE_LOG_DEBUG(getDisplayName(), "continue listing items in file source"); } BOOST_FOREACH(const string &entry, dirContent) { string filename = createFilename(entry); string revision = getATimeString(filename); long entrynum = atoll(entry.c_str()); if (entrynum >= m_entryCounter) { m_entryCounter = entrynum + 1; } revisions[entry] = revision; } } void FileSyncSource::readItem(const string &uid, std::string &item, bool raw) { string filename = createFilename(uid); if (!ReadFile(filename, item)) { throwError(SE_HERE, filename + ": reading failed", errno); } } TrackingSyncSource::InsertItemResult FileSyncSource::insertItem(const string &uid, const std::string &item, bool raw) { string newuid = uid; string creationTime; string filename; // Inserting a new and updating an existing item often uses // very similar code. In this case only the code for determining // the filename differs. // // In other sync sources the database might also have limitations // for the content of different items, for example, only one // VCALENDAR:EVENT with a certain UID. If the server does not // recognize that and sends a new item which collides with an // existing one, then the existing one should be updated. if (uid.size()) { // valid local ID: update that file filename = createFilename(uid); } else { // no local ID: create new file while (true) { ostringstream buff; buff << m_entryCounter; filename = createFilename(buff.str()); // only create and truncate if file does not // exist yet, otherwise retry with next counter struct stat dummy; if (stat(filename.c_str(), &dummy)) { if (errno == ENOENT) { newuid = buff.str(); break; } else { throwError(SE_HERE, filename, errno); } } m_entryCounter++; } } ofstream out; out.open(filename.c_str()); out.write(item.c_str(), item.size()); out.close(); if (!out.good()) { throwError(SE_HERE, filename + ": writing failed", errno); } return InsertItemResult(newuid, getATimeString(filename), ITEM_OKAY); } void FileSyncSource::removeItem(const string &uid) { string filename = createFilename(uid); if (unlink(filename.c_str())) { throwError(SE_HERE, filename, errno); } } string FileSyncSource::getATimeString(const string &filename) { struct stat buf; if (stat(filename.c_str(), &buf)) { throwError(SE_HERE, filename, errno); } time_t mtime = buf.st_mtime; int mnsec = buf.st_mtim.tv_nsec; ostringstream revision; revision << mtime; if (mnsec) { revision << "." << mnsec; } return revision.str(); } string FileSyncSource::createFilename(const string &entry) { string filename = m_basedir + "/" + entry; return filename; } SE_END_CXX #endif /* ENABLE_FILE */ #ifdef ENABLE_MODULES # include "FileSyncSourceRegister.cpp" #endif syncevolution-1.5/src/backends/gnome/0000755000373300037200000000000012424707641021351 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/gnome/configure-sub.in0000644000373300001540000000202712326412403024262 0ustar00nightlynightly00000000000000PKG_CHECK_MODULES(KEYRING, [gnome-keyring-1 >= 2.20], HAVE_KEYRING=yes, HAVE_KEYRING=no) AC_ARG_ENABLE(gnome-keyring, AS_HELP_STRING([--enable-gnome-keyring], [enables or disables support for the GNOME keyring; default is on if development files are available]), [enable_gnome_keyring="$enableval" test "$enable_gnome_keyring" = "yes" || test "$enable_gnome_keyring" = "no" || AC_MSG_ERROR([invalid value for --enable-gnome-keyring: $enable_gnome_keyring]) test "$enable_gnome_keyring" = "no" || test "$HAVE_KEYRING" = "yes" || AC_MSG_ERROR([gnome-keyring-1 pkg >= 2.20 not found, needed for --enable-gnome-keyring])], enable_gnome_keyring="$HAVE_KEYRING") if test $enable_gnome_keyring = "yes"; then have_keyring=yes AC_DEFINE(USE_GNOME_KEYRING, 1, [define if gnome keyring should be used in dbus service]) # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/gnome/platformgnome.la" fi syncevolution-1.5/src/backends/gnome/GNOMEPlatformRegister.cpp0000644000373300001540000000225012326412403025743 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef USE_GNOME_KEYRING #include "GNOMEPlatform.h" #include #include SE_BEGIN_CXX static class GNOMEInit { public: GNOMEInit() { GetLoadPasswordSignal().connect(1, GNOMELoadPasswordSlot); GetSavePasswordSignal().connect(1, GNOMESavePasswordSlot); } } gnomeinit; SE_END_CXX #endif // USE_GNOME_KEYRING syncevolution-1.5/src/backends/gnome/gnome.am0000644000373300001540000000175012326412403022610 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/gnome/configure-sub.in src_backends_gnome_lib = src/backends/gnome/platformgnome.la MOSTLYCLEANFILES += $(src_backends_gnome_lib) src_backends_gnome_platformgnome_la_SOURCES = \ src/backends/gnome/GNOMEPlatform.h \ src/backends/gnome/GNOMEPlatform.cpp if ENABLE_MODULES src_backends_gnome_backenddir = $(BACKENDS_DIRECTORY) src_backends_gnome_backend_LTLIBRARIES = $(src_backends_gnome_lib) src_backends_gnome_platformgnome_la_SOURCES += \ src/backends/gnome/GNOMEPlatformRegister.cpp else noinst_LTLIBRARIES += $(src_backends_gnome_lib) endif src_backends_gnome_platformgnome_la_LIBADD = $(KEYRING_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_gnome_platformgnome_la_LDFLAGS = -module -avoid-version src_backends_gnome_platformgnome_la_CXXFLAGS = $(KEYRING_CFLAGS) $(SYNCEVOLUTION_CFLAGS) src_backends_gnome_platformgnome_la_CPPFLAGS = -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_gnome_platformgnome_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/gnome/GNOMEPlatform.h0000644000373300001540000000275312326412403023713 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_GNOMEPLATFORM #define INCL_GNOMEPLATFORM #include #include #include SE_BEGIN_CXX struct ConfigPasswordKey; bool GNOMELoadPasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, InitStateString &password); bool GNOMESavePasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key); SE_END_CXX #endif // INCL_GNOMEPLATFORM syncevolution-1.5/src/backends/gnome/GNOMEPlatform.cpp0000664000373300001540000002142712330727742024261 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef USE_GNOME_KEYRING extern "C" { #include } #include "GNOMEPlatform.h" #include #include #include #include SE_BEGIN_CXX // Occasionally, libgnome-keyring fails with the following error messages: // Gkr: received an invalid, unencryptable, or non-utf8 secret // Gkr: call to daemon returned an invalid response: (null).(null) // // We work around that by retrying the operation a few times, for at // most this period of time. Didn't really help, so disable it for now // by using a zero duration. static const double GNOMEKeyringRetryDuration = 2; // seconds static const double GNOMEKeyringRetryInterval = 0.1; // seconds /** * libgnome-keyring has an internal gkr_reset_session() * method which gets called when the "org.freedesktop.secrets" * disconnects from the D-Bus session bus. * * We cannot call that method directly, but we can get it called by * faking the "disconnect" signal. That works because * on_connection_filter() in gkr-operation.c doesn't check who the * sender of the signal is. * * Once gkr_reset_session() got called, the next operation will * re-establish the connection. After the failure above, the second * attempt usually works. * * Any other client using libgnome-keyring will also be tricked into * disconnecting temporarily. That should be fine, any running * operation will continue to run and complete (?). */ static void FlushGNOMEKeyring() { // Invoking dbus-send is easier than writing this in C++. // Besides, it ensures that the signal comes from some other // process. Not sure whether signals are sent back to the sender. system("dbus-send --session --type=signal /org/freedesktop/DBus org.freedesktop.DBus.NameOwnerChanged string:'org.freedesktop.secrets' string:':9.99' string:''"); } /** * GNOME keyring distinguishes between empty and unset * password keys. This function returns NULL for an * empty std::string. */ inline const char *passwdStr(const std::string &str) { return str.empty() ? NULL : str.c_str(); } static bool UseGNOMEKeyring(const InitStateTri &keyring) { // Disabled by user? if (keyring.getValue() == InitStateTri::VALUE_FALSE) { return false; } // If explicitly selected, it must be us. if (keyring.getValue() == InitStateTri::VALUE_STRING && !boost::iequals(keyring.get(), "GNOME")) { return false; } // Use GNOME Keyring. return true; } bool GNOMELoadPasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, InitStateString &password) { if (!UseGNOMEKeyring(keyring)) { SE_LOG_DEBUG(NULL, "not using GNOME keyring"); return false; } GnomeKeyringResult result = GNOME_KEYRING_RESULT_OK; GList* list; Timespec start = Timespec::monotonic(); double sleepSecs = 0; do { if (sleepSecs != 0) { SE_LOG_DEBUG(NULL, "%s: previous attempt to load password '%s' from GNOME keyring failed, will try again: %s", key.description.c_str(), key.toString().c_str(), gnome_keyring_result_to_message(result)); FlushGNOMEKeyring(); Sleep(sleepSecs); } result = gnome_keyring_find_network_password_sync(passwdStr(key.user), passwdStr(key.domain), passwdStr(key.server), passwdStr(key.object), passwdStr(key.protocol), passwdStr(key.authtype), key.port, &list); sleepSecs = GNOMEKeyringRetryInterval; } while (result != GNOME_KEYRING_RESULT_OK && (Timespec::monotonic() - start).duration() < GNOMEKeyringRetryDuration); // if find password stored in gnome keyring if(result == GNOME_KEYRING_RESULT_OK && list && list->data ) { GnomeKeyringNetworkPasswordData *key_data; key_data = (GnomeKeyringNetworkPasswordData*)list->data; password = std::string(key_data->password); gnome_keyring_network_password_list_free(list); SE_LOG_DEBUG(NULL, "%s: loaded password from GNOME keyring using %s", key.description.c_str(), key.toString().c_str()); } else { SE_LOG_DEBUG(NULL, "password not in GNOME keyring using %s: %s", key.toString().c_str(), result == GNOME_KEYRING_RESULT_NO_MATCH ? "no match" : result != GNOME_KEYRING_RESULT_OK ? gnome_keyring_result_to_message(result) : "empty result list"); } return true; } bool GNOMESavePasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { if (!UseGNOMEKeyring(keyring)) { SE_LOG_DEBUG(NULL, "not using GNOME keyring"); return false; } // Cannot store a password for just a user, that's ambiguous. // Also, a password without server ("user=foo") somehow removes // the password with server ("user=foo server=bar"). if (key.user.empty() || (key.domain.empty() && key.server.empty() && key.object.empty())) { SE_THROW(StringPrintf("%s: cannot store password in GNOME keyring, not enough attributes (%s). Try setting syncURL or remoteDeviceID if this is a sync password.", key.description.c_str(), key.toString().c_str())); } guint32 itemId; GnomeKeyringResult result = GNOME_KEYRING_RESULT_OK; // write password to keyring Timespec start = Timespec::monotonic(); double sleepSecs = 0; do { if (sleepSecs != 0) { SE_LOG_DEBUG(NULL, "%s: previous attempt to save password '%s' in GNOME keyring failed, will try again: %s", key.description.c_str(), key.toString().c_str(), gnome_keyring_result_to_message(result)); FlushGNOMEKeyring(); Sleep(sleepSecs); } result = gnome_keyring_set_network_password_sync(NULL, passwdStr(key.user), passwdStr(key.domain), passwdStr(key.server), passwdStr(key.object), passwdStr(key.protocol), passwdStr(key.authtype), key.port, password.c_str(), &itemId); sleepSecs = GNOMEKeyringRetryInterval; } while (result != GNOME_KEYRING_RESULT_OK && (Timespec::monotonic() - start).duration() < GNOMEKeyringRetryDuration); if (result != GNOME_KEYRING_RESULT_OK) { Exception::throwError(SE_HERE, StringPrintf("%s: saving password '%s' in GNOME keyring failed: %s", key.description.c_str(), key.toString().c_str(), gnome_keyring_result_to_message(result))); } SE_LOG_DEBUG(NULL, "saved password in GNOME keyring using %s", key.toString().c_str()); // handled return true; } SE_END_CXX #endif // USE_GNOME_KEYRING syncevolution-1.5/src/backends/goa/0000755000373300037200000000000012424707641021012 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/goa/configure-sub.in0000644000373300001540000000131512326412403023722 0ustar00nightlynightly00000000000000AC_ARG_ENABLE(goa, AS_HELP_STRING([--disable-goa], [enables or disables support for the GNOME Online Account single-sign-on system; default is on]), [enable_goa="$enableval" test "$enable_goa" = "yes" || test "$enable_goa" = "no" || AC_MSG_ERROR([invalid value for --enable-goa: $enable_goa]) ], enable_goa="yes") if test $enable_goa = "yes"; then AC_DEFINE(USE_GOA, 1, [use GNOME Online Accounts]) # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/goa/providergoa.la" fi # conditional compilation in make AM_CONDITIONAL([USE_GOA], [test "$use_goa" = "yes"]) syncevolution-1.5/src/backends/goa/README0000644000373300001540000001065712326412403021513 0ustar00nightlynightly00000000000000Google CalDAV/CardDAV via OAuth2 with GNOME Online Accounts (GOA) ================================================================= Setup ----- SyncEvolution depends on a GNOME Online Accounts with CalDAV *and* CardDAV enabled for Google. This is hard-coded in the source code, so recompiling is the only (sane) way to change that. CalDAV has been enabled for a while, CardDAV is recent (>= 3.10). It is possible to patch 3.8 without recompiling (see below). Versions older than 3.8 do not work because they lack OAuth2 support. SyncEvolution needs an active account for Google in the GNOME Control Center, under "online accounts". Enable the different data categories if and only if you want to access the data with the core GNOME apps. SyncEvolution ignores these settings. Usage ----- OAuth2 authentication with GNOME Online Accounts is enabled by setting username or databaseUser to a string of the format goa: Typically there is only one account using a Google email address, so that can be used to select the account. SyncEvolution checks if it is really unique and if not, provides a list of all accounts with their account ID. Then the unique account ID should be used instead. The base URL for each service currently needs to be given via syncURL: syncevolution --print-databases \ backend=carddav \ username=goa:john.doe@gmail.com \ syncURL=https://www.googleapis.com/.well-known/carddav src/syncevolution --print-databases \ backend=caldav \ username=goa:john.doe@gmail.com \ syncURL=https://apidata.googleusercontent.com/caldav/v2 Once that works, follow the "CalDAV and CardDAV" instructions from the README with the different username and syncURL. Debugging --------- Add --daemon=no to the command line to prevent shifting the actual command executing into syncevo-dbus-server and (from there) syncevo-dbus-helper. Set SYNCEVOLUTION_DEBUG=1 to see all debug messages and increase the loglevel to see HTTP requests: SYNCEVOLUTION_DEBUG=1 syncevolution --daemon=no \ loglevel=4 \ --print-databases \ ... Known Problems -------------- When accessing CardDAV: status-line] < HTTP/1.1 401 Unauthorized [hdr] WWW-Authenticate: AuthSub realm="https://www.google.com/accounts/AuthSubRequest" allowed-scopes="https://www.googleapis.com/auth/carddav" ... GData authError Authorization Invalid Credentials ... [INFO] operation temporarily (?) failed, going to retry in 5.0s before giving up in 295.8s: PROPFIND: Neon error code 3 = NE_AUTH, HTTP status 401: Could not authenticate to server: ignored AuthSub challenge ... This happens when using a GNOME Online Accounts which does (or did) not request CardDAV access when logging into Google. Install GNOME Online Accounts >= 3.10 or patch it (see below), "killall goa-daemon", then re-create the account in the GNOME Control Center. Patching GOA 3.8 ---------------- It is possible to add CardDAV support to 3.8 without recompiling GNOME Online Accounts. However, the downside is that this approach has to disable access to some other kind of data and breaks when updating or reinstalling GOA. 1. Locate libgoa-backend-1.0.so.0.0.0: typically it is in /usr/lib or /usr/lib64. 2. Open it in a text editor which can handle binary data (like emacs). 3. Switch to "overwrite mode". 4. Find the string starting with https://www.googleapis.com/auth/userinfo.email 6. Overwrite the part which you don't need with https://www.googleapis.com/auth/carddav and spaces. For example, if Google Docs access is not needed, replace "https://docs.google.com/feeds/ https://docs.googleusercontent.com/ https://spreadsheets.google.com/feeds/ " with "https://www.googleapis.com/auth/carddav " Here's a perl command which replaces Google Docs with CardDAV: perl -pi -e 's;https://docs.google.com/feeds/ https://docs.googleusercontent.com/ https://spreadsheets.google.com/feeds/ ;https://www.googleapis.com/auth/carddav ;' /usr/lib*/libgoa-backend-1.0.so.0.0.0 syncevolution-1.5/src/backends/goa/GOARegister.cpp0000644000373300001540000000322612326412403023444 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include "goa.h" #include #include SE_BEGIN_CXX static class GOAProvider : public IdentityProvider { public: GOAProvider() : IdentityProvider("goa", "goa:\n" " Authentication using GNOME Online Accounts,\n" " using an account created and managed with GNOME Control Center.") {} virtual boost::shared_ptr create(const InitStateString &username, const InitStateString &password) { // Returning NULL if not enabled... boost::shared_ptr provider; #ifdef USE_GOA provider = createGOAAuthProvider(username, password); #endif return provider; } } gsso; SE_END_CXX syncevolution-1.5/src/backends/goa/goa.am0000644000373300001540000000201212326412403021702 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/goa/configure-sub.in \ src/backends/goa/README \ $(NONE) src_backends_goa_lib = src/backends/goa/providergoa.la MOSTLYCLEANFILES += $(src_backends_goa_lib) src_backends_goa_providergoa_la_SOURCES = \ src/backends/goa/goa.h \ src/backends/goa/goa.cpp \ $(NONE) if ENABLE_MODULES src_backends_goa_backenddir = $(BACKENDS_DIRECTORY) src_backends_goa_backend_LTLIBRARIES = $(src_backends_goa_lib) src_backends_goa_providergoa_la_SOURCES += \ src/backends/goa/GOARegister.cpp else noinst_LTLIBRARIES += $(src_backends_goa_lib) endif src_backends_goa_providergoa_la_LIBADD = $(SYNCEVOLUTION_LIBS) $(gdbus_build_dir)/libgdbussyncevo.la $(DBUS_LIBS) src_backends_goa_providergoa_la_LDFLAGS = -module -avoid-version src_backends_goa_providergoa_la_CXXFLAGS = $(SYNCEVOLUTION_CFLAGS) $(SYNCEVO_WFLAGS) $(DBUS_CFLAGS) src_backends_goa_providergoa_la_CPPFLAGS = -I$(gdbus_dir) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_goa_providergoa_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/goa/goa.h0000644000373300001540000000226112326412403021542 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_GOA_AUTH_PROVIDER # define INCL_SYNC_EVOLUTION_GOA_AUTH_PROVIDER #include #include #include SE_BEGIN_CXX class AuthProvider; boost::shared_ptr createGOAAuthProvider(const InitStateString &username, const InitStateString &password); SE_END_CXX #endif syncevolution-1.5/src/backends/goa/goa.cpp0000664000373300001540000002330612405555067022116 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef USE_GOA #include "goa.h" #include #include #include #include #include #include SE_BEGIN_CXX /* * We call the GOA D-Bus API directly. This is easier than using * libgoa because our own D-Bus wrapper gives us data in C++ data * structures. It also avoids another library dependency. */ static const char GOA_BUS_NAME[] = "org.gnome.OnlineAccounts"; static const char GOA_PATH[] = "/org/gnome/OnlineAccounts"; static const char OBJECT_MANAGER_INTERFACE[] = "org.freedesktop.DBus.ObjectManager"; static const char OBJECT_MANAGER_GET_MANAGED_OBJECTS[] = "GetManagedObjects"; static const char GOA_ACCOUNT_INTERFACE[] = "org.gnome.OnlineAccounts.Account"; static const char GOA_ACCOUNT_ENSURE_CREDENTIALS[] = "EnsureCredentials"; static const char GOA_ACCOUNT_PRESENTATION_IDENTITY[] = "PresentationIdentity"; static const char GOA_ACCOUNT_ID[] = "Id"; static const char GOA_ACCOUNT_PROVIDER_NAME[] = "ProviderName"; static const char GOA_OAUTH2_INTERFACE[] = "org.gnome.OnlineAccounts.OAuth2Based"; static const char GOA_OAUTH2_GET_ACCESS_TOKEN[] = "GetAccessToken"; class GOAAccount; class GOAManager : private GDBusCXX::DBusRemoteObject { typedef std::map // property value - we only care about strings > Properties; typedef std::map Interfaces; typedef std::map ManagedObjects; GDBusCXX::DBusClientCall1 m_getManagedObjects; public: GOAManager(const GDBusCXX::DBusConnectionPtr &conn); /** * Find a particular account, identified by its representation ID * (the unique user visible string). The account must support OAuth2, * otherwise an error is thrown. */ boost::shared_ptr lookupAccount(const std::string &representationID); }; class GOAAccount { GDBusCXX::DBusRemoteObject m_account; GDBusCXX::DBusRemoteObject m_oauth2; public: GOAAccount(const GDBusCXX::DBusConnectionPtr &conn, const std::string &path); GDBusCXX::DBusClientCall1 m_ensureCredentials; GDBusCXX::DBusClientCall1 m_getAccessToken; }; GOAManager::GOAManager(const GDBusCXX::DBusConnectionPtr &conn) : GDBusCXX::DBusRemoteObject(conn, GOA_PATH, OBJECT_MANAGER_INTERFACE, GOA_BUS_NAME), m_getManagedObjects(*this, OBJECT_MANAGER_GET_MANAGED_OBJECTS) { } boost::shared_ptr GOAManager::lookupAccount(const std::string &username) { SE_LOG_DEBUG(NULL, "Looking up all accounts in GNOME Online Accounts, searching for '%s'.", username.c_str()); ManagedObjects objects = m_getManagedObjects(); GDBusCXX::DBusObject_t accountPath; bool unique = true; bool hasOAuth2 = false; std::vector accounts; BOOST_FOREACH (const ManagedObjects::value_type &object, objects) { const GDBusCXX::DBusObject_t &path = object.first; const Interfaces &interfaces = object.second; // boost::adaptors::keys() would be nicer, but is not available on Ubuntu Lucid. std::list interfaceKeys; BOOST_FOREACH (const Interfaces::value_type &entry, interfaces) { interfaceKeys.push_back(entry.first); } SE_LOG_DEBUG(NULL, "GOA object %s implements %s", path.c_str(), boost::join(interfaceKeys, ", ").c_str()); Interfaces::const_iterator it = interfaces.find(GOA_ACCOUNT_INTERFACE); if (it != interfaces.end()) { const Properties &properties = it->second; Properties::const_iterator id = properties.find(GOA_ACCOUNT_ID); Properties::const_iterator presentationID = properties.find(GOA_ACCOUNT_PRESENTATION_IDENTITY); if (id != properties.end() && presentationID != properties.end()) { const std::string &idStr = boost::get(id->second); const std::string &presentationIDStr = boost::get(presentationID->second); Properties::const_iterator provider = properties.find(GOA_ACCOUNT_PROVIDER_NAME); std::string description = StringPrintf("%s, %s = %s", provider == properties.end() ? "???" : boost::get(provider->second).c_str(), presentationIDStr.c_str(), idStr.c_str()); SE_LOG_DEBUG(NULL, "GOA account %s", description.c_str()); accounts.push_back(description); // The assumption here is that ID and presentation // identifier are so different that there can be // no overlap. Otherwise we would have to know // whether the user gave us an ID or presentation // identifier. if (idStr == username || presentationIDStr == username) { if (accountPath.empty()) { accountPath = path; hasOAuth2 = interfaces.find(GOA_OAUTH2_INTERFACE) != interfaces.end(); SE_LOG_DEBUG(NULL, "found matching GNOME Online Account for '%s': %s", username.c_str(), description.c_str()); } else { unique = false; } } } else { SE_LOG_DEBUG(NULL, "ignoring %s, lacks expected properties", path.c_str()); } } } std::sort(accounts.begin(), accounts.end()); if (accountPath.empty()) { if (accounts.empty()) { SE_THROW(StringPrintf("GNOME Online Account '%s' not found. You must set up the account in GNOME Control Center/Online Accounts first.", username.c_str())); } else { SE_THROW(StringPrintf("GNOME Online Account '%s' not found. Choose one of the following:\n%s", username.c_str(), boost::join(accounts, "\n").c_str())); } } else if (!unique) { SE_THROW(StringPrintf("GNOME Online Account '%s' is not unique. Choose one of the following, using the unique ID instead of the more ambiguous representation name:\n%s", username.c_str(), boost::join(accounts, "\n").c_str())); } else if (!hasOAuth2) { SE_THROW(StringPrintf("Found GNOME Online Account '%s', but it does not support OAuth2. Are you sure that you picked the right account and that you are using GNOME Online Accounts >= 3.8?", username.c_str())); } boost::shared_ptr account(new GOAAccount(getConnection(), accountPath)); return account; } GOAAccount::GOAAccount(const GDBusCXX::DBusConnectionPtr &conn, const std::string &path) : m_account(conn, path, GOA_ACCOUNT_INTERFACE, GOA_BUS_NAME), m_oauth2(conn, path, GOA_OAUTH2_INTERFACE, GOA_BUS_NAME), m_ensureCredentials(m_account, GOA_ACCOUNT_ENSURE_CREDENTIALS), m_getAccessToken(m_oauth2, GOA_OAUTH2_GET_ACCESS_TOKEN) { } class GOAAuthProvider : public AuthProvider { boost::shared_ptr m_account; public: GOAAuthProvider(const boost::shared_ptr &account) : m_account(account) {} virtual bool methodIsSupported(AuthMethod method) const { return method == AUTH_METHOD_OAUTH2; } virtual Credentials getCredentials() const { SE_THROW("only OAuth2 is supported"); } virtual std::string getOAuth2Bearer(int failedTokens, const PasswordUpdateCallback &passwordUpdateCallback) const { m_account->m_ensureCredentials(); std::string token = m_account->m_getAccessToken(); return token; } virtual std::string getUsername() const { return ""; } }; boost::shared_ptr createGOAAuthProvider(const InitStateString &username, const InitStateString &password) { // Because we share the connection, hopefully this won't be too expensive. GDBusCXX::DBusErrorCXX err; GDBusCXX::DBusConnectionPtr conn = dbus_get_bus_connection("SESSION", NULL, false, &err); if (!conn) { err.throwFailure("connecting to session bus"); } GOAManager manager(conn); boost::shared_ptr account = manager.lookupAccount(username); boost::shared_ptr provider(new GOAAuthProvider(account)); return provider; } SE_END_CXX #endif // USE_GOA syncevolution-1.5/src/backends/kcalextended/0000755000373300037200000000000012424707641022677 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/kcalextended/configure-sub.in0000644000373300001540000000122612326412403025610 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. # BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS ..." SE_ARG_ENABLE_BACKEND(kcalextended, kcalextended, [AS_HELP_STRING([--enable-kcalextended], [enable support for Maemo's KCalExtended storage])], [enable_kcalextended="$enableval"], [enable_kcalextended="no"] ) if test "$enable_kcalextended" = "yes"; then AC_DEFINE(ENABLE_KCALEXTENDED, 1, [KCalExtended available]) PKG_CHECK_MODULES(KCALEXTENDED, libmkcal libkcalcoren) fi syncevolution-1.5/src/backends/kcalextended/KCalExtendedSourceRegister.cpp0000644000373300001540000001413712326412403030402 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2010 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "KCalExtendedSource.h" #include "test.h" #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe = sourceType.m_backend == "mkcal-events"; bool maybeMe = sourceType.m_backend == "calendar"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/x-vcalendar" || sourceType.m_format == "text/x-calendar" || sourceType.m_format == "text/calendar") { return #ifdef ENABLE_KCALEXTENDED true ? new KCalExtendedSource(params, KCalExtendedSource::Event) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } } isMe = sourceType.m_backend == "mkcal-todos"; maybeMe = sourceType.m_backend == "todo"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/x-vcalendar" || sourceType.m_format == "text/x-calendar" || sourceType.m_format == "text/calendar") { return #ifdef ENABLE_KCALEXTENDED true ? new KCalExtendedSource(params, KCalExtendedSource::Todo) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } } isMe = sourceType.m_backend == "mkcal-notes"; maybeMe = sourceType.m_backend == "memo"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/x-vcalendar" || sourceType.m_format == "text/x-calendar" || sourceType.m_format == "text/calendar") { return #ifdef ENABLE_KCALEXTENDED true ? new KCalExtendedSource(params, KCalExtendedSource::Journal) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } } return NULL; } static RegisterSyncSource registerMe("KCalExtended", #ifdef ENABLE_KCALEXTENDED true, #else false, #endif createSource, "mkcal-events = mkcal = KCalExtended = calendar\n" " 'database' normally is the name of a calendar\n" " inside the default calendar storage. If it starts\n" " with the 'SyncEvolution_Test_' prefix, it will be\n" " created as needed, otherwise it must exist.\n" #ifdef ENABLE_MAEMO " If it starts with the 'uid:' prefix, the specified\n" " calendar in the default SQLite storage file will\n" " be used. It must exist.\n" #endif " If it starts with the 'file://' prefix, the default\n" " calendar in the specified SQLite storage file will\n" " created (if needed) and used.\n" "mkcal-todos = todo\n" " Same as above.\n" "mkcal-notes = memo\n" #ifdef ENABLE_MAEMO " Same as above. Keep in mind that, by default, notes\n" " are stored in their own database, separate from\n" " events and todos. The name of this database is\n" " hardcoded into the device's builtin Notes app.\n" " Don't override the default unless you know what\n" " you are doing.\n", #else " Same as above.\n", #endif Values() + (Aliases("mkcal-events") + "mkcal" + "KCalExtended" + "MeeGo Calendar") + (Aliases("mkcal-todos") + "MeeGo Tasks") + (Aliases("mkcal-notes") + "MeeGo Notes")); #ifdef ENABLE_KCALEXTENDED #ifdef ENABLE_UNIT_TESTS class KCalExtendedSourceUnitTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(KCalExtendedSourceUnitTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("KCalExtended", "KCalExtended:text/calendar:2.0", true)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(KCalExtendedSourceUnitTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif static class ICal20Test : public RegisterSyncSourceTest { public: ICal20Test() : RegisterSyncSourceTest("kcal_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "KCalExtended:text/calendar"; // after fixing BMC #6061, mKCal is able to delete individual // VEVENTs, without enforcing the "each child must have parent" rule config.m_linkedItemsRelaxedSemantic = true; } } iCal20Test; } #endif // ENABLE_KCALEXTENDED SE_END_CXX syncevolution-1.5/src/backends/kcalextended/kcalextended.am0000644000373300001540000000211212326412403025455 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/kcalextended/configure-sub.in src_backends_kcalextended_lib = src/backends/kcalextended/synckcalextended.la MOSTLYCLEANFILES += $(src_backends_kcalextended_lib) if ENABLE_MODULES src_backends_kcalextended_backenddir = $(BACKENDS_DIRECTORY) src_backends_kcalextended_backend_LTLIBRARIES = $(src_backends_kcalextended_lib) else noinst_LTLIBRARIES += $(src_backends_kcalextended_lib) endif src_backends_kcalextended_synckcalextended_la_SOURCES = \ src/backends/kcalextended/KCalExtendedSource.h \ src/backends/kcalextended/KCalExtendedSource.cpp src_backends_kcalextended_synckcalextended_la_LIBADD = $(KCALEXTENDED_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_kcalextended_synckcalextended_la_LDFLAGS = -module -avoid-version src_backends_kcalextended_synckcalextended_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(KCALEXTENDED_CFLAGS) $(SYNCEVO_WFLAGS) src_backends_kcalextended_synckcalextended_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_kcalextended_synckcalextended_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/kcalextended/KCalExtendedSource.h0000644000373300001540000000641312326412403026340 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_KCALEXTENDEDSYNCSOURCE #define INCL_KCALEXTENDEDSYNCSOURCE #include #ifdef ENABLE_KCALEXTENDED #include #include SE_BEGIN_CXX class KCalExtendedData; /** * Access contacts stored in KCalExtended. * * Change tracking is based on time stamps instead of id/revision * pairs as in other sources. Items are imported/export as iCalendar 2.0 * strings. This allows us to implement TestingSyncSource (and thus * use client-test). We have to override the begin/end methods * to get time stamps recorded as anchors. * * This class is designed so that no KCalExtended header files are required * to include this header file. */ class KCalExtendedSource : public TestingSyncSource, private SyncSourceAdmin, private SyncSourceBlob, private SyncSourceRevisions, public SyncSourceLogging, private boost::noncopyable { public: enum Type { Event = 0, Todo = 1, Journal = 2 }; KCalExtendedSource(const SyncSourceParams ¶ms, Type type); ~KCalExtendedSource(); protected: /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual void close(); virtual Databases getDatabases(); virtual void enableServerMode(); virtual bool serverModeEnabled() const; virtual std::string getPeerMimeType() const { return getMimeType(); } /* implementation of SyncSourceSession interface */ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); /* implementation of SyncSourceDelete interface */ virtual void deleteItem(const string &luid); /* implementation of SyncSourceSerialize interface */ virtual std::string getMimeType() const; virtual std::string getMimeVersion() const; virtual InsertItemResult insertItem(const std::string &luid, const std::string &item); virtual void readItem(const std::string &luid, std::string &item); /* * implementation of SyncSourceRevisions * * Used for backup/restore (with dummy revision string). */ virtual void listAllItems(RevisionMap_t &revisions); /* implementation of SyncSourceLogging */ virtual std::string getDescription(const string &luid); private: KCalExtendedData *m_data; Type m_type; unsigned m_delete_run; unsigned m_insert_run; }; SE_END_CXX #endif // ENABLE_KCALEXTENDED #endif // INCL_KCALEXTENDEDSYNCSOURCE syncevolution-1.5/src/backends/kcalextended/KCalExtendedSource.cpp0000664000373300001540000005551512330727742026716 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_KCALEXTENDED #include "KCalExtendedSource.h" #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX /** * All std::string and plain C strings in SyncEvolution are in UTF-8. * QString must be told about that explicitly. */ static QString std2qstring(const std::string &str) { return QString::fromUtf8(str.c_str()); } // static QString std2qstring(const char *str) { return QString::fromUtf8(str); } /** * Convert back to UTF-8. */ static std::string qstring2std(const QString str) { return str.toUtf8().constData(); } class KCalExtendedData { KCalExtendedSource *m_parent; bool m_modified; QString m_notebook; QString m_notebookUID; KCalCore::IncidenceBase::IncidenceType m_type; mKCal::ExtendedCalendar::Ptr m_calendar; mKCal::ExtendedStorage::Ptr m_storage; public: KCalExtendedData(KCalExtendedSource *parent, const QString ¬ebook, const KCalExtendedSource::Type &type) : m_parent(parent), m_modified(false), m_notebook(notebook) { switch (type) { case KCalExtendedSource::Event: m_type = KCalCore::IncidenceBase::TypeEvent; break; case KCalExtendedSource::Todo: m_type = KCalCore::IncidenceBase::TypeTodo; break; case KCalExtendedSource::Journal: m_type = KCalCore::IncidenceBase::TypeJournal; break; default: m_type = KCalCore::IncidenceBase::TypeUnknown; break; } if (!qApp) { static const char *argv[] = { "SyncEvolution" }; static int argc = 1; new QCoreApplication(argc, (char **)argv); } } void extractIncidences(KCalCore::Incidence::List &incidences, SyncSourceChanges::State state, SyncSourceChanges &changes) { foreach (KCalCore::Incidence::Ptr incidence, incidences) { if (incidence->type() == m_type) { SE_LOG_DEBUG(NULL, "item %s %s", getItemID(incidence).getLUID().c_str(), state == SyncSourceChanges::ANY ? "exists" : state == SyncSourceChanges::NEW ? "is new" : state == SyncSourceChanges::UPDATED ? "is updated" : state == SyncSourceChanges::DELETED ? "was deleted" : "unknown state"); changes.addItem(getItemID(incidence).getLUID(), state); } } } /** * An item is identified in the calendar by * its UID (unique ID) and RID (recurrence ID). * The RID may be empty. * * This is turned into a SyncML LUID by * concatenating them: -rid. */ class ItemID { public: ItemID(const string &uid, const string &rid) : m_uid(uid), m_rid(rid) {} ItemID(const char *uid, const char *rid): m_uid(uid ? uid : ""), m_rid(rid ? rid : "") {} ItemID(const string &luid); const string m_uid, m_rid; QString getIDString() const { return std2qstring(m_uid); } KDateTime getDateTime() const { return KDateTime::fromString(std2qstring(m_rid)); } string getLUID() const; static string getLUID(const string &uid, const string &rid); }; ItemID getItemID(const KCalCore::Incidence::Ptr &incidence); KCalCore::Incidence::Ptr findIncidence(const string &luid); friend class KCalExtendedSource; }; string KCalExtendedData::ItemID::getLUID() const { return getLUID(m_uid, m_rid); } string KCalExtendedData::ItemID::getLUID(const string &uid, const string &rid) { return uid + "-rid" + rid; } KCalExtendedData::ItemID::ItemID(const string &luid) { size_t ridoff = luid.rfind("-rid"); if (ridoff != luid.npos) { const_cast(m_uid) = luid.substr(0, ridoff); const_cast(m_rid) = luid.substr(ridoff + strlen("-rid")); } else { const_cast(m_uid) = luid; } } KCalCore::Incidence::Ptr KCalExtendedData::findIncidence(const string &luid) { ItemID id(luid); QString uid = id.getIDString(); KDateTime rid = id.getDateTime(); // if (!m_storage->load(uid, rid)) { // m_parent->throwError(SE_HERE, string("failed to load incidence ") + luid); // } KCalCore::Incidence::Ptr incidence = m_calendar->incidence(uid, rid); return incidence; } KCalExtendedData::ItemID KCalExtendedData::getItemID(const KCalCore::Incidence::Ptr &incidence) { QString uid = incidence->uid(); KDateTime rid = incidence->recurrenceId(); string ridStr; if (rid.isValid()) { ridStr = qstring2std(rid.toString()); } return ItemID(qstring2std(uid), ridStr); } KCalExtendedSource::KCalExtendedSource(const SyncSourceParams ¶ms, Type type) : TestingSyncSource(params) { SyncSourceRevisions::init(this, this, 0, m_operations); switch (type) { case Event: SyncSourceLogging::init(InitList("SUMMARY") + "LOCATION", ", ", m_operations); break; case Todo: SyncSourceLogging::init(InitList("SUMMARY"), ", ", m_operations); break; case Journal: SyncSourceLogging::init(InitList("SUBJECT"), ", ", m_operations); break; default: throwError(SE_HERE, "invalid calendar type"); break; } m_data = NULL; m_type = type; m_delete_run = 0; m_insert_run = 0; } KCalExtendedSource::~KCalExtendedSource() { delete m_data; } std::string KCalExtendedSource::getMimeType() const { return m_type == Journal ? "text/calendar+plain" : "text/calendar"; } std::string KCalExtendedSource::getMimeVersion() const { return "2.0"; } void KCalExtendedSource::open() { // read specified database name from "database" property std::string databaseID = getDatabaseID(); // TODO: also support todoType m_data = new KCalExtendedData(this, databaseID.c_str(), m_type); m_data->m_calendar = mKCal::ExtendedCalendar::Ptr(new mKCal::ExtendedCalendar(KDateTime::Spec::LocalZone())); if (databaseID.empty() || boost::starts_with(databaseID, "file://") ) { // if databaseID is empty, create default storage at default location // else if databaseID has a "file://" prefix, create storage at the specified place // use default notebook in default storage if ( boost::starts_with(databaseID, "file://") ) { mKCal::SqliteStorage::Ptr ss(new mKCal::SqliteStorage(m_data->m_calendar, QString(databaseID.c_str() + strlen("file://")), false)); m_data->m_storage = ss.staticCast(); } else { m_data->m_storage = mKCal::ExtendedCalendar::defaultStorage(m_data->m_calendar); } if (!m_data->m_storage->open()) { throwError(SE_HERE, "failed to open storage"); } #ifdef ENABLE_MAEMO mKCal::Notebook::Ptr defaultNotebook; // For notes, we need a different default database: // Notes (uid:66666666-7777-8888-9999-000000000000) if (databaseID.empty() && m_type == Journal) { defaultNotebook = m_data->m_storage->notebook("66666666-7777-8888-9999-000000000000"); } else { defaultNotebook = m_data->m_storage->defaultNotebook(); } #else mKCal::Notebook::Ptr defaultNotebook = m_data->m_storage->defaultNotebook(); #endif if (!defaultNotebook) { throwError(SE_HERE, "no default Notebook"); } m_data->m_notebookUID = defaultNotebook->uid(); #ifdef ENABLE_MAEMO } else if (boost::starts_with(databaseID, "uid:")) { // if databaseID has a "uid:" prefix, open existing notebook with given ID in default storage m_data->m_storage = mKCal::ExtendedCalendar::defaultStorage(m_data->m_calendar); if (!m_data->m_storage->open()) { throwError(SE_HERE, "failed to open storage"); } QString uid = databaseID.c_str() + strlen("uid:"); mKCal::Notebook::Ptr notebook = m_data->m_storage->notebook(uid); if ( !notebook ) { throwError(SE_HERE, string("no such notebook with UID \"") + uid.toStdString() + string("\" in default storage")); } m_data->m_notebookUID = notebook->uid(); #endif } else { // use databaseID as notebook name to search for an existing notebook // if found use it, otherwise: // 1) with "SyncEvolution_Test_" prefix, create a new notebook with given name and add it to default storage // 2) without a special prefix, throw an error m_data->m_storage = mKCal::ExtendedCalendar::defaultStorage(m_data->m_calendar); if (!m_data->m_storage->open()) { throwError(SE_HERE, "failed to open storage"); } QString name = databaseID.c_str(); mKCal::Notebook::Ptr notebook; mKCal::Notebook::List notebookList = m_data->m_storage->notebooks(); mKCal::Notebook::List::Iterator it; for ( it = notebookList.begin(); it != notebookList.end(); ++it ) { if ( name == (*it)->name() ) { break; } } if ( it == notebookList.end() ) { if ( boost::starts_with(databaseID, "SyncEvolution_Test_") ) { notebook = mKCal::Notebook::Ptr ( new mKCal::Notebook(QString(), name, QString(), QString(), false, true, false, false,true) ); if ( !notebook ) { throwError(SE_HERE, "failed to create notebook"); } m_data->m_storage->addNotebook(notebook, false); } else { throwError(SE_HERE, string("no such notebook with name \"") + string(databaseID) + string("\" in default storage")); } } else { notebook = *it; } m_data->m_notebookUID = notebook->uid(); } // we are not currently using partial loading because there were // issues with it (BMC #6061); the load() calls elsewhere in this // file are commented out if (!m_data->m_storage->loadNotebookIncidences(m_data->m_notebookUID)) { throwError(SE_HERE, "failed to load calendar"); } } bool KCalExtendedSource::isEmpty() { switch (m_data->m_type) { case KCalCore::IncidenceBase::TypeEvent: return !m_data->m_calendar->eventCount(); case KCalCore::IncidenceBase::TypeTodo: return !m_data->m_calendar->todoCount(); case KCalCore::IncidenceBase::TypeJournal: return !m_data->m_calendar->journalCount(); default: return true; } } void KCalExtendedSource::close() { if (m_data->m_storage) { m_data->m_storage->close(); } if (m_data->m_calendar) { m_data->m_calendar->close(); } } void KCalExtendedSource::enableServerMode() { SyncSourceAdmin::init(m_operations, this); SyncSourceBlob::init(m_operations, getCacheDir()); } bool KCalExtendedSource::serverModeEnabled() const { return m_operations.m_loadAdminData; } KCalExtendedSource::Databases KCalExtendedSource::getDatabases() { Databases result; m_data = new KCalExtendedData(this, getDatabaseID().c_str(), m_type); m_data->m_calendar = mKCal::ExtendedCalendar::Ptr(new mKCal::ExtendedCalendar(KDateTime::Spec::LocalZone())); m_data->m_storage = mKCal::ExtendedCalendar::defaultStorage(m_data->m_calendar); if (!m_data->m_storage->open()) { throwError(SE_HERE, "failed to open storage"); } mKCal::Notebook::List notebookList = m_data->m_storage->notebooks(); mKCal::Notebook::List::Iterator it; for ( it = notebookList.begin(); it != notebookList.end(); ++it ) { #ifdef ENABLE_MAEMO string name = (*it)->name().toStdString(); string uid = (*it)->uid().toStdString(); // For notes, we need a different default database: // Notes (uid:66666666-7777-8888-9999-000000000000) bool isDefault = (m_type != Journal) ? (*it)->isDefault() : (uid == "66666666-7777-8888-9999-000000000000"); result.push_back(Database( name, "uid:" + uid, isDefault )); #else bool isDefault = (*it)->isDefault(); result.push_back(Database( (*it)->name().toStdString(), (m_data->m_storage).staticCast()->databaseName().toStdString(), isDefault)); #endif } m_data->m_storage->close(); m_data->m_calendar->close(); return result; } void KCalExtendedSource::beginSync(const std::string &lastToken, const std::string &resumeToken) { const char *anchor = resumeToken.empty() ? lastToken.c_str() : resumeToken.c_str(); KCalCore::Incidence::List incidences; // return all items incidences = m_data->m_calendar->incidences(); // if (!m_data->m_storage->allIncidences(&incidences, m_data->m_notebookUID)) { // throwError(SE_HERE, "allIncidences() failed"); // } m_data->extractIncidences(incidences, SyncSourceChanges::ANY, *this); if (*anchor) { SE_LOG_DEBUG(NULL, "checking for changes since %s UTC", anchor); KDateTime endSyncTime(QDateTime::fromString(QString(anchor), Qt::ISODate), KDateTime::Spec::UTC()); KCalCore::Incidence::List added, modified, deleted; if (!m_data->m_storage->insertedIncidences(&added, endSyncTime, m_data->m_notebookUID)) { throwError(SE_HERE, "insertedIncidences() failed"); } if (!m_data->m_storage->modifiedIncidences(&modified, endSyncTime, m_data->m_notebookUID)) { throwError(SE_HERE, "modifiedIncidences() failed"); } if (!m_data->m_storage->deletedIncidences(&deleted, endSyncTime, m_data->m_notebookUID)) { throwError(SE_HERE, "deletedIncidences() failed"); } // It is guaranteed that modified and inserted items are // returned as inserted, so no need to check that. m_data->extractIncidences(added, SyncSourceChanges::NEW, *this); m_data->extractIncidences(modified, SyncSourceChanges::UPDATED, *this); m_data->extractIncidences(deleted, SyncSourceChanges::DELETED, *this); } } std::string KCalExtendedSource::endSync(bool success) { if (m_data->m_modified) { if (!m_data->m_storage->save()) { throwError(SE_HERE, "could not save calendar"); } time_t modtime = time(NULL); // Saving set the modified time stamps of all items needed // saving, so ensure that we sleep for one second starting now. // Must sleep before taking the time stamp for the anchor, // because changes made after and including (>= instead of >) that time // stamp will be considered as "changes made after last sync". time_t current = modtime; do { sleep(1 - (current - modtime)); current = time(NULL); } while (current - modtime < 1); m_delete_run = 0; m_insert_run = 0; } QDateTime now = QDateTime::currentDateTime().toUTC(); string anchor(qstring2std(now.toString(Qt::ISODate))); return anchor; } void KCalExtendedSource::readItem(const string &uid, std::string &item) { KCalCore::Incidence::Ptr incidence(m_data->findIncidence(uid)); if (!incidence) { throwError(SE_HERE, string("failure extracting ") + uid); } KCalCore::Calendar::Ptr calendar(new KCalCore::MemoryCalendar(KDateTime::Spec::LocalZone())); calendar->addIncidence(incidence); KCalCore::ICalFormat formatter; item = qstring2std(formatter.toString(calendar)); } TestingSyncSource::InsertItemResult KCalExtendedSource::insertItem(const string &uid, const std::string &item) { if (m_delete_run > 0) { // Since the storage's save() might do deletes *after* inserts, // the final save() could fail if we're doing a refresh-from-peer // (where everything is first deleted and then reinserted), as // the inserts will fail due to the existing entries not being // deleted yet. To avoid the problem, make sure we save between // the deletes and the inserts. if (!m_data->m_storage->save()) { throwError(SE_HERE, "could not save calendar"); } m_delete_run = 0; m_insert_run = 0; } KCalCore::Calendar::Ptr calendar(new KCalCore::MemoryCalendar(KDateTime::Spec::LocalZone())); KCalCore::ICalFormat parser; if (!parser.fromString(calendar, std2qstring(item))) { throwError(SE_HERE, "error parsing iCalendar 2.0 item"); } KCalCore::Incidence::List incidences = calendar->rawIncidences(); if (incidences.empty()) { throwError(SE_HERE, "iCalendar 2.0 item empty?!"); } InsertItemResultState updated; string newUID; string oldUID = uid; // check for existing incidence with this UID and RECURRENCE-ID first, // update when found even if caller didn't know about that existing // incidence if (uid.empty()) { QString id = incidences[0]->uid(); KDateTime rid = incidences[0]->recurrenceId(); if (!id.isEmpty()) { // m_data->m_storage->load(id, rid); KCalCore::Incidence::Ptr incidence = m_data->m_calendar->incidence(id, rid); if (incidence) { oldUID = m_data->getItemID(incidence).getLUID(); } } } // Brute-force copying of all time zone definitions. Ignores name // conflicts, which is something better handled in a generic mKCal // API function (BMC #8604). KCalCore::ICalTimeZones *source = calendar->timeZones(); if (source) { KCalCore::ICalTimeZones *target = m_data->m_calendar->timeZones(); if (target) { BOOST_FOREACH(const KCalCore::ICalTimeZone &zone, source->zones().values()) { target->add(zone); } } } if (oldUID.empty()) { KCalCore::Incidence::Ptr incidence = incidences[0]; updated = ITEM_OKAY; if (!m_data->m_calendar->addIncidence(incidence)) { throwError(SE_HERE, "could not add incidence"); } m_data->m_calendar->setNotebook(incidence, m_data->m_notebookUID); newUID = m_data->getItemID(incidence).getLUID(); } else { KCalCore::Incidence::Ptr incidence = incidences[0]; updated = uid.empty() ? ITEM_REPLACED : ITEM_OKAY; newUID = oldUID; KCalCore::Incidence::Ptr original = m_data->findIncidence(oldUID); if (!original) { throwError(SE_HERE, "incidence to be updated not found"); } if (original->type() != incidence->type()) { throwError(SE_HERE, "cannot update incidence, wrong type?!"); } // preserve UID and RECURRENCE-ID, because this must not change // and some peers don't preserve it incidence->setUid(original->uid()); if (original->hasRecurrenceId()) { incidence->setRecurrenceId(original->recurrenceId()); } // created() corresponds to the CREATED property (= time when // item was created in the local storage for the first time), // so it can never be modified by our peer and must be // preserved unconditionally in updates. incidence->setCreated(original->created()); // now overwrite item in calendar (KCalCore::IncidenceBase &)*original = (KCalCore::IncidenceBase &)*incidence; m_data->m_calendar->setNotebook(original, m_data->m_notebookUID); // no need to save } m_data->m_modified = true; m_insert_run++; return InsertItemResult(newUID, "", updated); } void KCalExtendedSource::deleteItem(const string &uid) { KCalCore::Incidence::Ptr incidence = m_data->findIncidence(uid); if (!incidence) { // throwError(SE_HERE, string("incidence ") + uid + " not found"); // don't treat this as error, it can happen, for example // when the master event was removed before (MBC #6061) return; } if (!m_data->m_calendar->deleteIncidence(incidence)) { throwError(SE_HERE, string("could not delete incidence") + uid); } m_data->m_modified = true; m_delete_run++; } void KCalExtendedSource::listAllItems(RevisionMap_t &revisions) { KCalCore::Incidence::List incidences; incidences = m_data->m_calendar->incidences(); // if (!m_data->m_storage->allIncidences(&incidences, m_data->m_notebookUID)) { // throwError(SE_HERE, "allIncidences() failed"); // } foreach (KCalCore::Incidence::Ptr incidence, incidences) { if (incidence->type() == m_data->m_type) { revisions[m_data->getItemID(incidence).getLUID()] = "1"; } } } std::string KCalExtendedSource::getDescription(const string &luid) { try { KCalCore::Incidence::Ptr incidence = m_data->findIncidence(luid); if (incidence) { list parts; QString str; // for VEVENT str = incidence->summary(); if (!str.isEmpty()) { parts.push_back(qstring2std(str)); } str = incidence->location(); if (!str.isEmpty()) { parts.push_back(qstring2std(str)); } return boost::join(parts, ", "); } else { return ""; } } catch (...) { return ""; } } SE_END_CXX #endif /* ENABLE_KCALEXTENDED */ #ifdef ENABLE_MODULES # include "KCalExtendedSourceRegister.cpp" #endif syncevolution-1.5/src/backends/kde/0000755000373300037200000000000012424707641021007 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/kde/configure-sub.in0000644000373300001540000000410512326412403023717 0ustar00nightlynightly00000000000000# first check for qmake-qt4, because qmake may point to qmake-qt3. AC_CHECK_PROGS([QMAKE], [qmake-qt4 qmake]) if test "x$QMAKE" != 'x' then AC_PATH_PROG([KDE4_CONFIG], [kde4-config], [no]) if test "x$KDE4_CONFIG" != 'xno' then KDEKWALLETFOUND=yes if ! test "$KDE_KWALLET_CFLAGS"; then KDE_KWALLET_CFLAGS="-I`$KDE4_CONFIG --path include` -I`$KDE4_CONFIG --path include`/KDE `pkg-config --cflags QtDBus QtCore`" fi if ! test "$KDE_KWALLET_LIBS"; then KDE_KWALLET_LIBS="-lkdeui -lkdecore -L`kde4-config --install lib` `pkg-config --libs QtDBus QtCore`" fi AC_LANG_PUSH(C++) old_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $KDE_KWALLET_CFLAGS" AC_CHECK_HEADERS(kwallet.h, [], [KDEKWALLETFOUND=no]) CPPFLAGS="$old_CPPFLAGS" AC_LANG_POP(C++) else KDEKWALLETFOUND=no fi else KDEKWALLETFOUND=no fi # In contrast to the GNOME KEYRING, the KWallet is # currently considered optional. "configure" will never enable # by default, because that is a change that might not be # expected by traditional users. AC_ARG_ENABLE(kwallet, AS_HELP_STRING([--enable-kwallet], [enable access to KWallet]), [use_kde_kwallet="$enableval" test $KDEKWALLETFOUND = "yes" || test "$use_kde_kwallet" = "no" || AC_MSG_ERROR([kwallet.pc not found. Install it to compile with the KWallet enabled.])], [use_kde_kwallet="no"]) if test "$use_kde_kwallet" = "yes"; then have_keyring=yes # conditional compilation in preprocessor AC_DEFINE(USE_KDE_KWALLET, 1, [KWallet available]) # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/kde/platformkde.la" # TODO: KWallet needs Qt. Enable the Qt check in # configure-post.in, otherwise it fails to compiler # when none of the backends ask for Qt. else # avoid unneeded dependencies on KWallet KDE_KWALLET_CFLAGS= KDE_KWALLET_LIBS= fi AC_SUBST(KDE_KWALLET_LIBS) AC_SUBST(KDE_KWALLET_CFLAGS) # conditional compilation in make AM_CONDITIONAL([USE_KDE_KWALLET], [test "$use_kde_kwallet" = "yes"]) syncevolution-1.5/src/backends/kde/KDEPlatformRegister.cpp0000644000373300001540000000247012326412403025143 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Dinesh * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef USE_KDE_KWALLET #include "KDEPlatform.h" #include #include #include SE_BEGIN_CXX static class KDEInit { public: KDEInit() { GetLoadPasswordSignal().connect(0, KWalletLoadPasswordSlot); GetSavePasswordSignal().connect(0, KWalletSavePasswordSlot); SyncContext::GetInitMainSignal().connect(KDEInitMainSlot); } } kdeinit; SE_END_CXX #endif // USE_KDE_WALLET syncevolution-1.5/src/backends/kde/kde.am0000644000373300001540000000166612326412403021712 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/kde/configure-sub.in src_backends_kde_lib = src/backends/kde/platformkde.la MOSTLYCLEANFILES += $(src_backends_kde_lib) src_backends_kde_platformkde_la_SOURCES = \ src/backends/kde/KDEPlatform.h \ src/backends/kde/KDEPlatform.cpp if ENABLE_MODULES src_backends_kde_backenddir = $(BACKENDS_DIRECTORY) src_backends_kde_backend_LTLIBRARIES = $(src_backends_kde_lib) src_backends_kde_platformkde_la_SOURCES += \ src/backends/kde/KDEPlatformRegister.cpp else noinst_LTLIBRARIES += $(src_backends_kde_lib) endif src_backends_kde_platformkde_la_LIBADD = $(KDE_KWALLET_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_kde_platformkde_la_LDFLAGS = -module -avoid-version src_backends_kde_platformkde_la_CXXFLAGS = $(KDE_KWALLET_CFLAGS) $(SYNCEVOLUTION_CFLAGS) src_backends_kde_platformkde_la_CPPFLAGS = -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_kde_platformkde_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/kde/KDEPlatform.h0000644000373300001540000000304312326412403023100 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_KDEPLATFORM #define INCL_KDEPLATFORM #include #include #include SE_BEGIN_CXX struct ConfigPasswordKey; void KDEInitMainSlot(const char *appname); bool KWalletLoadPasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, InitStateString &password); bool KWalletSavePasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key); SE_END_CXX #endif // INCL_KDEPLATFORM syncevolution-1.5/src/backends/kde/KDEPlatform.cpp0000664000373300001540000002176412330727742023461 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Dinesh * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef USE_KDE_KWALLET #include "KDEPlatform.h" #include #include #include // Qt headers may define "signals" as preprocessor symbol, // which conflicts with glib C headers included indirectly // above. This order of header files works. #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX // TODO: this check should be global static bool HaveDBus; void KDEInitMainSlot(const char *appname) { // Very simple check. API doesn't say whether asking // for the bus connection will connect immediately. // We use a private connection here instead of the shared // QDBusConnection::sessionBus() because we don't have // a QCoreApplication yet. Otherwise we get a warning: // "QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave." { QDBusConnection dbus = QDBusConnection::connectToBus(QDBusConnection::SessionBus, "org.syncevolution.kde-platform-test-connection"); HaveDBus = dbus.isConnected(); } if (!HaveDBus) { // KApplication has been seen to crash without D-Bus (BMC #25596). // Bail out here if we don't have D-Bus. return; } //QCoreApplication *app; int argc = 1; static char *argv[] = { const_cast(appname), NULL }; KAboutData aboutData(// The program name used internally. "syncevolution", // The message catalog name // If null, program name is used instead. 0, // A displayable program name string. ki18n("SyncEvolution"), // The program version string. VERSION, // Short description of what the app does. ki18n("Lets Akonadi synchronize with a SyncML Peer"), // The license this code is released under KAboutData::License_GPL, // Copyright Statement ki18n("(c) 2010-12"), // Optional text shown in the About box. // Can contain any information desired. ki18n(""), // The program homepage string. "http://www.syncevolution.org/", // The bug report email address "syncevolution@syncevolution.org"); KCmdLineArgs::init(argc, argv, &aboutData); if (!kapp) { // Don't allow KApplication to mess with SIGINT/SIGTERM. // Restore current behavior after construction. struct sigaction oldsigint, oldsigterm; sigaction(SIGINT, NULL, &oldsigint); sigaction(SIGTERM, NULL, &oldsigterm); // Explicitly disable GUI mode in the KApplication. Otherwise // the whole binary will fail to run when there is no X11 // display. new KApplication(false); //To stop KApplication from spawning it's own DBus Service ... Will have to patch KApplication about this QDBusConnection::sessionBus().unregisterService("org.syncevolution.syncevolution-"+QString::number(getpid())); sigaction(SIGINT, &oldsigint, NULL); sigaction(SIGTERM, &oldsigterm, NULL); } } static bool UseKWallet(const InitStateTri &keyring, int slotCount) { // Disabled by user? if (keyring.getValue() == InitStateTri::VALUE_FALSE) { return false; } // When both (presumably) GNOME keyring and KWallet are available, // check if the user really wanted KWallet before using KWallet // instead of GNOME keyring. This default favors GNOME keyring // over KWallet because SyncEvolution traditionally used that. if (keyring.getValue() == InitStateTri::VALUE_TRUE && slotCount > 1) { return false; } // If explicitly selected, it must be us. if (keyring.getValue() == InitStateTri::VALUE_STRING && !boost::iequals(keyring.get(), "KDE")) { return false; } // User wants KWallet, but is it usable? if (!HaveDBus) { SE_THROW("KDE KWallet requested, but it is not usable (running outside of a D-Bus session)"); } // Use KWallet. return true; } /** * Here we use server sync url without protocol prefix and * user account name as the key in the keyring. * * Also since the KWallet's API supports only storing (key,password) * or Map , the former is used. */ bool KWalletLoadPasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, InitStateString &password) { if (!UseKWallet(keyring, GetLoadPasswordSignal().num_slots() - INTERNAL_LOAD_PASSWORD_SLOTS)) { SE_LOG_DEBUG(NULL, "not using KWallet"); return false; } QString walletPassword; QString walletKey = QString(key.user.c_str()) + ',' + QString(key.domain.c_str())+ ','+ QString(key.server.c_str())+','+ QString(key.object.c_str())+','+ QString(key.protocol.c_str())+','+ QString(key.authtype.c_str())+','+ QString::number(key.port); QString wallet_name = KWallet::Wallet::NetworkWallet(); //QString folder = QString::fromUtf8("Syncevolution"); const QLatin1String folder("Syncevolution"); bool found = false; if (!KWallet::Wallet::keyDoesNotExist(wallet_name, folder, walletKey)) { KWallet::Wallet *wallet = KWallet::Wallet::openWallet(wallet_name, -1, KWallet::Wallet::Synchronous); if (wallet && wallet->setFolder(folder) && wallet->readPassword(walletKey, walletPassword) == 0) { password = walletPassword.toStdString(); found = true; } } SE_LOG_DEBUG(NULL, "%s password in KWallet using %s", found ? "found" : "no", key.toString().c_str()); return true; } bool KWalletSavePasswordSlot(const InitStateTri &keyring, const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { if (!UseKWallet(keyring, GetSavePasswordSignal().num_slots() - INTERNAL_SAVE_PASSWORD_SLOTS)) { SE_LOG_DEBUG(NULL, "not using KWallet"); return false; } /* It is possible to let CmdlineSyncClient decide which of fields in ConfigPasswordKey it would use * but currently only use passed key instead */ // write password to keyring const QString walletKey = QString::fromStdString(key.user + ',' + key.domain + ',' + key.server + ',' + key.object + ',' + key.protocol + ',' + key.authtype + ',')+ QString::number(key.port); const QString walletPassword = QString::fromStdString(password); bool write_success = false; const QString wallet_name = KWallet::Wallet::NetworkWallet(); const QLatin1String folder("Syncevolution"); KWallet::Wallet *wallet = KWallet::Wallet::openWallet(wallet_name, -1, KWallet::Wallet::Synchronous); if (wallet) { if (!wallet->hasFolder(folder)) { wallet->createFolder(folder); } if (wallet->setFolder(folder) && wallet->writePassword(walletKey, walletPassword) == 0) { write_success = true; } } if (!write_success) { Exception::throwError(SE_HERE, "Saving " + passwordName + " in KWallet failed."); } SE_LOG_DEBUG(NULL, "stored password in KWallet using %s", key.toString().c_str()); return write_success; } SE_END_CXX #endif // USE_KDE_WALLET syncevolution-1.5/src/backends/maemo/0000755000373300037200000000000012424707641021342 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/maemo/configure-sub.in0000644000373300001540000000155212326412403024255 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. dnl Check for calendar-backend PKG_CHECK_MODULES(MCALB, calendar-backend, MCALBFOUND=yes, [MCALBFOUND=no]) AC_SUBST(MCALB_CFLAGS) AC_SUBST(MCALB_LIBS) BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $MCALB_CFLAGS" SE_ARG_ENABLE_BACKEND(maemocal, maemo, [AS_HELP_STRING([--enable-maemocal], [enable access to PIM data stored in Maemo 5 calendar application (default off)])], [enable_maemocal="$enableval"], [enable_maemocal="no"] ) if test "$enable_maemocal" = "yes"; then test "x${MCALBFOUND}" = "xyes" || AC_MSG_ERROR([--enable-maemocal requires pkg-config information for calendar-backend, which was not found]) AC_DEFINE(ENABLE_MAEMO_CALENDAR, 1, [Maemo 5 calendar available]) fi syncevolution-1.5/src/backends/maemo/MaemoCalendarSourceRegister.cpp0000644000373300001540000001346512326412403027245 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "MaemoCalendarSource.h" #include "test.h" #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe = sourceType.m_backend == "Maemo Calendar"; #ifndef ENABLE_MAEMO_CALENDAR if (isMe) return RegisterSyncSource::InactiveSource(params); #else bool maybeMe = sourceType.m_backend == "calendar"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar") { return new MaemoCalendarSource(EVENT, ICAL_TYPE, params); } else if (sourceType.m_format == "text/x-vcalendar") { return new MaemoCalendarSource(EVENT, VCAL_TYPE, params); } else { return NULL; } } #endif isMe = sourceType.m_backend == "Maemo Tasks"; #ifndef ENABLE_MAEMO_CALENDAR if (isMe) return RegisterSyncSource::InactiveSource(params); #else maybeMe = sourceType.m_backend == "todo"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar") { return new MaemoCalendarSource(TODO, ICAL_TYPE, params); } else if (sourceType.m_format == "text/x-vcalendar") { return new MaemoCalendarSource(TODO, VCAL_TYPE, params); } else { return NULL; } } #endif isMe = sourceType.m_backend == "Maemo Notes"; #ifndef ENABLE_MAEMO_CALENDAR if (isMe) return RegisterSyncSource::InactiveSource(params); #else maybeMe = sourceType.m_backend == "memo"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar") { return new MaemoCalendarSource(JOURNAL, ICAL_TYPE, params); } else if (sourceType.m_format == "text/x-vcalendar") { return new MaemoCalendarSource(JOURNAL, VCAL_TYPE, params); } else if (sourceType.m_format == "text/plain") { return new MaemoCalendarSource(JOURNAL, -1, params); } else { return NULL; } } #endif return NULL; } static RegisterSyncSource registerMe("Maemo Calendar/Tasks/Notes", #ifdef ENABLE_MAEMO_CALENDAR true, #else false, #endif createSource, "Maemo Calendar = calendar = events = maemo-events\n" " iCalendar 2.0 (default) = text/calendar\n" " vCalendar 1.0 = text/x-vcalendar\n" "Maemo Tasks = todo = tasks = maemo-tasks\n" " iCalendar 2.0 (default) = text/calendar\n" " vCalendar 1.0 = text/x-vcalendar\n" "Maemo Notes = memo = memos = notes = journal = maemo-notes\n" " plain text in UTF-8 (default) = text/plain\n" " iCalendar 2.0 = text/calendar\n" " vCalendar 1.0 = text/x-vcalendar\n", Values() + (Aliases("Maemo Calendar") + "maemo-events") + (Aliases("Maemo Tasks") + "maemo-tasks") + (Aliases("Maemo Notes") + "maemo-notes")); #ifdef ENABLE_MAEMO_CALENDAR #ifdef ENABLE_UNIT_TESTS class MaemoCalendarSourceUnitTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(MaemoCalendarSourceUnitTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("calendar", "calendar", true)); source.reset(SyncSource::createTestingSource("calendar", "maemo-events", true)); source.reset(SyncSource::createTestingSource("calendar", "Maemo Calendar:text/calendar", true)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(MaemoCalendarSourceUnitTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif static class iCal20Test : public RegisterSyncSourceTest { public: iCal20Test() : RegisterSyncSourceTest("maemo_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "maemo-events"; } } iCal20Test; static class iTodo20Test : public RegisterSyncSourceTest { public: iTodo20Test() : RegisterSyncSourceTest("maemo_task", "eds_task") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "maemo-tasks"; } } iTodo20Test; static class MemoTest : public RegisterSyncSourceTest { public: MemoTest() : RegisterSyncSourceTest("maemo_memo", "eds_memo") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "maemo-notes"; } } memoTest; } #endif // ENABLE_MAEMO_CALENDAR SE_END_CXX syncevolution-1.5/src/backends/maemo/maemo.am0000644000373300001540000000172612326412403022575 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/maemo/configure-sub.in src_backends_maemo_lib = src/backends/maemo/syncmaemocal.la MOSTLYCLEANFILES += $(src_backends_maemo_lib) if ENABLE_MODULES src_backends_maemo_backenddir = $(BACKENDS_DIRECTORY) src_backends_maemo_backend_LTLIBRARIES = $(src_backends_maemo_lib) else noinst_LTLIBRARIES += $(src_backends_maemo_lib) endif src_backends_maemo_src = \ src/backends/maemo/MaemoCalendarSource.h \ src/backends/maemo/MaemoCalendarSource.cpp src_backends_maemo_syncmaemocal_la_SOURCES = $(src_backends_maemo_src) src_backends_maemo_syncmaemocal_la_LIBADD = $(MCALB_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_maemo_syncmaemocal_la_LDFLAGS = -module -avoid-version src_backends_maemo_syncmaemocal_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) src_backends_maemo_syncmaemocal_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_maemo_syncmaemocal_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/maemo/MaemoCalendarSource.h0000644000373300001540000000547712326412403025211 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_MAEMOCALENDARSOURCE #define INCL_MAEMOCALENDARSOURCE #include #ifdef ENABLE_MAEMO_CALENDAR #include #include #include #include #include SE_BEGIN_CXX /** * Implement access to Maemo calendar. * Change tracking is done by using the last-modified time * as TrackingSyncSource revisions. While it might be possible * to improve performance by using the getAllAdded/Modified * etc methods, it would make the change tracking less robust, * so it doesn't seem worth it. */ class MaemoCalendarSource : public TrackingSyncSource, public SyncSourceLogging, private boost::noncopyable { public: MaemoCalendarSource(int EntryType, int EntryFormat, const SyncSourceParams ¶ms); ~MaemoCalendarSource(); protected: /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual void close(); virtual Databases getDatabases(); virtual std::string getMimeType() const; virtual std::string getMimeVersion() const; virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments); /* implementation of TrackingSyncSource interface */ virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &luid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &luid); /* implementation of SyncSourceLogging interface */ virtual std::string getDescription(const string &luid); private: CMulticalendar *mc; /**< multicalendar */ CCalendar *cal; /**< calendar */ int entry_type; /**< entry type */ int entry_format; /**< entry format */ ICalConverter *conv; /**< converter */ string get_revision(CComponent * c); }; SE_END_CXX #endif // ENABLE_MAEMO_CALENDAR #endif // INCL_MAEMOCALENDARSOURCE syncevolution-1.5/src/backends/maemo/MaemoCalendarSource.cpp0000664000373300001540000002733612330727742025556 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_MAEMO_CALENDAR #include "MaemoCalendarSource.h" #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX MaemoCalendarSource::MaemoCalendarSource(int EntryType, int EntryFormat, const SyncSourceParams ¶ms) : TrackingSyncSource(params), entry_type(EntryType), entry_format(EntryFormat) { switch (EntryType) { case EVENT: SyncSourceLogging::init(InitList("SUMMARY") + "LOCATION", ", ", m_operations); break; case TODO: SyncSourceLogging::init(InitList("SUMMARY"), ", ", m_operations); break; case JOURNAL: SyncSourceLogging::init(InitList("SUBJECT"), ", ", m_operations); break; default: throwError(SE_HERE, "invalid calendar type"); break; } mc = CMulticalendar::MCInstance(); cal = NULL; conv = NULL; if (!mc) { throwError(SE_HERE, "Could not connect to Maemo Calendar backend"); } } MaemoCalendarSource::~MaemoCalendarSource() { // Don't rely on close() getting called to free resources. There's // no hard guarantee that it gets called in all cases. MaemoCalendarSource::close(); } std::string MaemoCalendarSource::getMimeType() const { switch (entry_format) { case -1: return "text/plain"; case ICAL_TYPE: return entry_type == JOURNAL ? "text/calendar+plain" : "text/calendar"; case VCAL_TYPE: return "text/x-calendar"; default: return NULL; } } std::string MaemoCalendarSource::getMimeVersion() const { switch (entry_format) { case -1: return "1.0"; case ICAL_TYPE: return "2.0"; case VCAL_TYPE: return "1.0"; default: return NULL; } } void MaemoCalendarSource::getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { TrackingSyncSource::getSynthesisInfo(info, fragments); info.m_backendRule = "MAEMO-CALENDAR"; info.m_afterReadScript += "$FIX_EXDATE_SCRIPT;\n"; } void MaemoCalendarSource::open() { string id = getDatabaseID(); const string id_prefix("id:"); int err; if (!id.size()) { CCalendar *def_cal = mc->getSynchronizedCalendar(); // generate a new instance of default calendar, // which we can safely delete in the close() method cal = mc->getCalendarById(def_cal->getCalendarId(), err); } else if (boost::starts_with(id, id_prefix)) { istringstream uri(id.substr(id_prefix.size())); int cid; uri >> cid; cal = mc->getCalendarById(cid, err); } else { // try the calendar's name cal = mc->getCalendarByName(id, err); } if (!cal) { throwError(SE_HERE, string("not found: ") + id); } conv = new ICalConverter; conv->setSyncing(true); // not sure what this does, but may as well tell the truth } bool MaemoCalendarSource::isEmpty() { int id = cal->getCalendarId(), err; switch (entry_type) { case EVENT: return !mc->getEventCount(id, err); case TODO: return !mc->getTodoCount(id, err); case JOURNAL: return !mc->getNoteCount(id, err); default: return true; } } void MaemoCalendarSource::close() { delete conv; conv = NULL; delete cal; cal = NULL; } MaemoCalendarSource::Databases MaemoCalendarSource::getDatabases() { // getDefaultCalendar returns the Private calendar, // getSynchronizedCalendar returns the Main calendar // (the same calendar Nokia PC Suite would sync with) CCalendar *def_cal = mc->getSynchronizedCalendar(); int def_id = def_cal->getCalendarId(); vector< CCalendar * > calendars = mc->getListCalFromMc(); Databases result; BOOST_FOREACH(CCalendar * c, calendars) { int id = c->getCalendarId(); ostringstream uri; uri << "id:" << id; result.push_back(Database(c->getCalendarName(), uri.str(), id == def_id)); } mc->releaseListCalendars(calendars); return result; } void MaemoCalendarSource::listAllItems(RevisionMap_t &revisions) { #if 0 /* this code exposes a bug in calendar-backend, https://bugs.maemo.org/show_bug.cgi?id=8277 */ // I've found no way to query the last modified time of a component // without getting the whole component. // This limit should hopefully reduce memory usage of that a bit, // though it could be bad if the database happens to change // between getComponents() calls. static const int limit = 1024; int ofs = 0, err; vector< CComponent * > comps; for (;;) { comps = cal->getComponents(entry_type, -1, -1, limit, ofs, err); // Note that non-success value in "err" is not necessarily fatal, // I seem to get a nonspecific "application error" if there are no // components of the specified type, so just ignore it for now if (!comps.size()) break; BOOST_FOREACH(CComponent * c, comps) { revisions[c->getId()] = get_revision(c); // Testing shows that the backend doesn't free the memory itself delete c; ofs++; } } #else // Instead, get a full list of IDs from getIdList(), then // load each entry from the calendar one by one. The // alternative would be to load the whole calendar into // memory all at once, but that's probably not all that // desirable, given the N900's limited memory. int err; vector< string > ids = cal->getIdList(entry_type, err); BOOST_FOREACH(std::string& id, ids) { CComponent *c = cal->getEntry(id, entry_type, err); if (!c) { throwError(SE_HERE, string("retrieving item: ") + id); } revisions[id] = get_revision(c); delete c; } #endif } void MaemoCalendarSource::readItem(const string &uid, std::string &item, bool raw) { int err; CComponent * c = cal->getEntry(uid, entry_type, err); if (!c) { throwError(SE_HERE, string("retrieving item: ") + uid); } if (entry_format == -1) { item = c->getSummary(); err = CALENDAR_OPERATION_SUCCESSFUL; } else { item = conv->localToIcalVcal(c, FileType(entry_format), err); } delete c; if (err != CALENDAR_OPERATION_SUCCESSFUL) { throwError(SE_HERE, string("generating ical for item: ") + uid); } } TrackingSyncSource::InsertItemResult MaemoCalendarSource::insertItem(const string &uid, const std::string &item, bool raw) { int err; CComponent *c; bool r; InsertItemResultState u = ITEM_OKAY; TrackingSyncSource::InsertItemResult result; if (cal->getCalendarType() == BIRTHDAY_CALENDAR) { // stubbornly refuse to try this throwError(SE_HERE, string("can't sync smart calendar ") + cal->getCalendarName()); } if (entry_format == -1) { c = new CJournal(item); err = CALENDAR_OPERATION_SUCCESSFUL; } else { vector< CComponent * > comps = conv->icalVcalToLocal(item, FileType(entry_format), err); // Note that a non-success value in "err" is not necessarily fatal, // I seem to get a nonspecific "application error" on certain types of // barely-legal input (mostly on todo entries), yet a component is returned if (!comps.size()) { if (err != CALENDAR_OPERATION_SUCCESSFUL) { throwError(SE_HERE, string("parsing ical: ") + item); } else { throwError(SE_HERE, string("no events in ical: ") + item); } } vector< CComponent * >::iterator it = comps.begin(); if (comps.size() > 1) { for (; it != comps.end(); ++it) { delete (*it); } throwError(SE_HERE, string("too many events in ical: ") + item); } c = *it; } // I wish there were public modifyEntry and addEntry methods, // so I wouldn't need the switches // (using the batch-operation modifyComponents and addComponents methods on // individual items would probably be inefficient) if (uid.size()) { c->setId(uid); switch (entry_type) { case EVENT: r = cal->modifyEvent (static_cast< CEvent * >(c), err); break; case TODO: r = cal->modifyTodo (static_cast< CTodo * >(c), err); break; case JOURNAL: r = cal->modifyJournal(static_cast< CJournal * >(c), err); break; default: r = false; err = CALENDAR_SYSTEM_ERROR; } if (!r) { throwError(SE_HERE, string("updating item ") + uid); } } else { switch (entry_type) { case EVENT: r = cal->addEvent (static_cast< CEvent * >(c), err); break; case TODO: r = cal->addTodo (static_cast< CTodo * >(c), err); break; case JOURNAL: r = cal->addJournal(static_cast< CJournal * >(c), err); break; default: r = false; err = CALENDAR_SYSTEM_ERROR; } if (!r) { throwError(SE_HERE, string("creating item ")); } if (err == CALENDAR_ENTRY_DUPLICATED) { u = ITEM_REPLACED; } } result = InsertItemResult(c->getId(), get_revision(c), u); delete c; return result; } void MaemoCalendarSource::removeItem(const string &uid) { int err; if (cal->getCalendarType() == BIRTHDAY_CALENDAR) { // stubbornly refuse to try this throwError(SE_HERE, string("can't sync smart calendar ") + cal->getCalendarName()); } cal->deleteComponent(uid, err); if (err != CALENDAR_OPERATION_SUCCESSFUL) { throwError(SE_HERE, string("deleting item: ") + uid); } } string MaemoCalendarSource::get_revision(CComponent * c) { time_t mtime = c->getLastModified(); ostringstream revision; revision << mtime; return revision.str(); } std::string MaemoCalendarSource::getDescription(const string &uid) { string ret; int err; CComponent * c = cal->getEntry(uid, entry_type, err); if (c) { list parts; string str; str = c->getSummary(); if (!str.empty()) { parts.push_back(str); } if (entry_type == EVENT) { str = c->getLocation(); if (!str.empty()) { parts.push_back(str); } } ret = boost::join(parts, ", "); delete c; } return ret; } SE_END_CXX #endif /* ENABLE_MAEMO_CALENDAR */ #ifdef ENABLE_MODULES # include "MaemoCalendarSourceRegister.cpp" #endif syncevolution-1.5/src/backends/oauth2/0000755000373300037200000000000012424707641021446 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/oauth2/configure-sub.in0000664000373300001540000000261112405555067024374 0ustar00nightlynightly00000000000000# Both json-c.pc (libjson-c-dev on Debian Testing) and json.pc # (legacy, libjson0-dev on Debian Wheezy and Testing) are okay. PKG_CHECK_MODULES(JSON, [json], HAVE_JSON=yes, [PKG_CHECK_MODULES(JSON, [json-c], HAVE_JSON=yes, HAVE_JSON=no)]) def_oauth2="no" if test "$ENABLE_LIBSOUP" = "yes" && test "$HAVE_JSON" = "yes"; then def_oauth2="yes" fi AC_ARG_ENABLE(oauth2, AS_HELP_STRING([--enable-oauth2], [enables or disables support for refresh token single-sign-on system without HMI; default is on if development files are available]), [enable_oauth2="$enableval" test "$enable_oauth2" = "yes" || test "$enable_oauth2" = "no" || AC_MSG_ERROR([invalid value for --enable-oauth2: $enable_oauth2]) test "$enable_oauth2" = "no" || test "$HAVE_JSON" = "yes" || test "$ENABLE_LIBSOUP" = "yes"|| AC_MSG_ERROR([required pkg(s) not found that are needed for --enable-oauth2])], enable_oauth2="$def_oauth2") if test "$enable_oauth2" = "yes"; then # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/oauth2/provideroauth2.la" if test "$enable_static" = "yes"; then AC_DEFINE(STATIC_OAUTH2, 1, [activate OAuth2 based on refresh token]) fi fi # conditional compilation in make AM_CONDITIONAL([USE_OAUTH2], [test "$enable_oauth2" = "yes"]) syncevolution-1.5/src/backends/oauth2/README0000664000373300001540000000522212405555067022155 0ustar00nightlynightly00000000000000Google CalDAV/CardDAV via OAuth2 ================================ Setup without GUI ----------------- In case of system without a the graphical user interface required by GOA or gSSO, OAuth2 authorization can be made using refresh token obtained by user in other way (e.g. using gSSO on another system with UI support, described below). OAuth2 authentication using refresh token is enabled by setting OAuth2 refresh token as password and setting username to "username=oauth2:{'TokenHost': 'https://accounts.google.com', 'TokenPath': '/o/oauth2/token', 'Scope': 'https://www.googleapis.com/auth/carddav https://www.googleapis.com/auth/calendar', 'ClientID': '923794261470.apps.googleusercontent.com', 'ClientSecret': 'SlVBAcxamM0TBPlvX2c1zbEY'}" Values of ClientId and ClientSecret need to be substituted with correct values (values here are from GOA, see below). Obtaining OAuth2 refresh token ============================== Obtaining refresh token value using gSSO ---------------------------------------- gSSO identity need to be created using: gsso-example --create-identity=google-for-syncevolution --identity-method=oauth --identity-realms=google.com Identity stored with id 7 After that Google access token can be queried using: gsso-example --get-google-token=7 --client-id=94523794261470.apps.googleusercontent.com --client-secret=SlVBAcxamM0TBPlvX2c1zbaEY Got response: {'Scope': <'https://www.google.com/m8/feeds https://www.googleapis.com/auth/carddav'>, 'AccessToken': <'ya29.dgBz-K-p5jYehyEAAAC5-vhCTOK183D8YxCnv8JJlGKTeV42B6IICDS3pTc1aVl7lTSLHv3OUXfSWEN3ZTA'>, 'TokenParameters': <@a{sv} {}>, 'TokenType': <'Bearer'>, 'RefreshToken': <'1/qXyWpORF_J30KNhZs7kVU8UnHLtt7o-hlud2yViII0A'>, 'Duration': , 'Timestamp': } Values of client-id and client-secret need to be substituted with correct values. Refresh token is returned in response. Please note that gsso-example currently does not provide a way to define requested scope of token as parameter, in example above its source code was modified to use "https://www.google.com/m8/feeds https://www.googleapis.com/auth/carddav" scope as default one. Obtaining refresh token value using GNOME Online Accounts (GOA) --------------------------------------------------------------- Default values of Client Id and Client Secret for GOA are: 923794261470.apps.googleusercontent.com and SlVBAcxamM0TBPlvX2c1zbEY After setting up account its refresh token value can be obtained from GNOME Keyring, using the seahorse UI. The keyring should contain a password for "GOA google credentials for identity account_", which is a JSON string containing a couple of values, including refresh token. syncevolution-1.5/src/backends/oauth2/oauth2Register.cpp0000664000373300001540000000336712405555067024720 0ustar00nightlynightly00000000000000/* * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #if defined(USE_OAUTH2) || defined(STATIC_OAUTH2) #include "oauth2.h" #include #include SE_BEGIN_CXX static class OAuth2Provider : public IdentityProvider { public: OAuth2Provider() : IdentityProvider("oauth2", "oauth2:\n" " Authentication using refresh token.\n" " GVariant text dump suitable for g_variant_parse() (see\n" " https://developer.gnome.org/glib/stable/gvariant-text.html).\n" " It must contain a hash with keys 'TokenHost', 'TokenPath', \n" " 'Scope', 'ClientID', 'ClientSecret'\n") {} virtual boost::shared_ptr create(const InitStateString &username, const InitStateString &password) { boost::shared_ptr provider; provider = createOAuth2AuthProvider(username, password); return provider; } } gsso; SE_END_CXX #endif // is enabled syncevolution-1.5/src/backends/oauth2/oauth2.am0000664000373300001540000000227012405555067023016 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/oauth2/configure-sub.in \ src/backends/oauth2/README \ $(NONE) src_backends_oauth2_libs = if USE_OAUTH2 src_backends_oauth2_libs += src/backends/oauth2/provideroauth2.la endif MOSTLYCLEANFILES += $(src_backends_oauth2_libs) src_backends_oauth2_sources = \ src/backends/oauth2/oauth2.h \ src/backends/oauth2/oauth2.cpp \ $(NONE) if ENABLE_MODULES src_backends_oauth2_backenddir = $(BACKENDS_DIRECTORY) src_backends_oauth2_backend_LTLIBRARIES = $(src_backends_oauth2_libs) src_backends_oauth2_sources += \ src/backends/oauth2/oauth2Register.cpp else noinst_LTLIBRARIES += $(src_backends_oauth2_libs) endif src_backends_oauth2_provideroauth2_la_SOURCES = $(src_backends_oauth2_sources) src_backends_oauth2_provideroauth2_la_LIBADD = $(JSON_LIBS) $(GLIB_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_oauth2_provideroauth2_la_LDFLAGS = -module -avoid-version src_backends_oauth2_provideroauth2_la_CXXFLAGS = $(JSON_CFLAGS) $(GLIB_CFLAGS) $(SYNCEVO_WFLAGS) $(SYNCEVOLUTION_CFLAGS) src_backends_oauth2_provideroauth2_la_CPPFLAGS = -DUSE_OAUTH2 -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_oauth2_provideroauth2_la_DEPENDENCIES = src/syncevo/libsyncevolution.la syncevolution-1.5/src/backends/oauth2/oauth2.h0000664000373300001540000000227412405555067022654 0ustar00nightlynightly00000000000000/* * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_OAUTH2_AUTH_PROVIDER #define INCL_SYNC_EVOLUTION_OAUTH2_AUTH_PROVIDER #include #include #include SE_BEGIN_CXX class AuthProvider; boost::shared_ptr createOAuth2AuthProvider(const InitStateString &username, const InitStateString &password); SE_END_CXX #endif syncevolution-1.5/src/backends/oauth2/oauth2.cpp0000664000373300001540000002042112405555067023201 0ustar00nightlynightly00000000000000/* * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include SE_BEGIN_CXX class RefreshTokenAuthProvider : public AuthProvider { boost::shared_ptr m_agent; std::string m_tokenHost; std::string m_tokenPath; std::string m_scope; std::string m_clientID; std::string m_clientSecret; std::string m_refreshToken; mutable std::string m_accessToken; public: RefreshTokenAuthProvider(const char* tokenHost, const char* tokenPath, const char* scope, const char* clientID, const char* clientSecret, const char* refreshToken) : m_tokenHost(tokenHost), m_tokenPath(tokenPath), m_scope(scope), m_clientID(clientID), m_clientSecret(clientSecret), m_refreshToken(refreshToken) { #ifdef ENABLE_LIBSOUP boost::shared_ptr agent(new SoupTransportAgent(static_cast(NULL))); m_agent = agent; #elif defined(ENABLE_LIBCURL) m_agent = new CurlTransportAgent(); #endif } virtual bool methodIsSupported(AuthMethod method) const { return method == AUTH_METHOD_OAUTH2; } virtual Credentials getCredentials() const { SE_THROW("only OAuth2 is supported"); } virtual std::string getOAuth2Bearer(int failedTokens, const PasswordUpdateCallback &passwordUpdateCallback) const { SE_LOG_DEBUG(NULL, "retrieving OAuth2 token, attempt %d", failedTokens); //in case of retry do not use cached access token, request it again if (1 >= failedTokens) { m_accessToken.clear(); } if (m_accessToken.empty()) { const char *reply; size_t replyLen; std::string contentType; m_agent->setURL(m_tokenHost + m_tokenPath); m_agent->setContentType("application/x-www-form-urlencoded"); std::ostringstream oss; oss<<"grant_type=refresh_token&client_id="<getReply(reply, replyLen, contentType); json_object *jobj = json_tokener_parse(reply); if (jobj) { json_object_object_foreach(jobj, key, val) { if (strcmp("access_token", key) == 0) { m_accessToken = json_object_get_string(val); } if (strcmp("refresh_token", key) == 0) { std::string newRefreshToken = json_object_get_string(val); if (passwordUpdateCallback) { try { passwordUpdateCallback(newRefreshToken); } catch (...) { std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); SE_LOG_INFO(NULL, "The attempt to update the refresh token in the 'password' property failed, probably because there is no configuration for it: %s\nRemember to use the new token in the future: %s", explanation.c_str(), newRefreshToken.c_str()); } } } } json_object_put(jobj); } else { SE_THROW("OAuth2 misformatted response"); } } break; case TransportAgent::TIME_OUT: SE_LOG_DEBUG(NULL, "retrieving OAuth2 token - agent time out"); SE_THROW("OAuth2 request timed out"); break; case TransportAgent::INACTIVE: case TransportAgent::CLOSED: case TransportAgent::FAILED: { std::string errorString; m_agent->getReply(reply, replyLen, contentType); json_object *jobj = json_tokener_parse(reply); if (jobj) { json_object_object_foreach(jobj, key, val) { if (strcmp ("error", key) == 0) { errorString = json_object_get_string(val); } } json_object_put(jobj); } SE_THROW("OAuth2 request failed with error: " + errorString); break; } case TransportAgent::CANCELED: SE_LOG_DEBUG(NULL, "retrieving OAuth2 token - agent cancelled"); SE_THROW("OAuth2 request cancelled"); break; } } return m_accessToken; } virtual std::string getUsername() const { return ""; } }; boost::shared_ptr createOAuth2AuthProvider(const InitStateString &username, const InitStateString &password) { // Expected content of parameter GVariant. boost::shared_ptr hashtype(g_variant_type_new("a{ss}"), g_variant_type_free); // 'username' is the part after oauth2: which we can parse directly. GErrorCXX gerror; GVariantStealCXX parametersVar(g_variant_parse(hashtype.get(), username.c_str(), NULL, NULL, gerror)); if (!parametersVar) { gerror.throwError(SE_HERE, "parsing 'oauth2:' username"); } GHashTableCXX parameters(Variant2StrHashTable(parametersVar)); // Extract the values that we expect in the parameters hash. const char *tokenHost; const char *tokenPath; const char *scope; const char *clientID; const char *clientSecret; tokenHost = (const gchar *)g_hash_table_lookup(parameters, "TokenHost"); if (!tokenHost) { SE_THROW("need 'TokenHost: ' in 'oauth2:' parameters"); } tokenPath = (const gchar *)g_hash_table_lookup(parameters, "TokenPath"); if (!tokenPath) { SE_THROW("need 'TokenPath: ' in 'oauth2:' parameters"); } scope = (const gchar *)g_hash_table_lookup(parameters, "Scope"); if (!scope) { SE_THROW("need 'Scope: ' in 'oauth2:' parameters"); } clientID = (const gchar *)g_hash_table_lookup(parameters, "ClientID"); if (!clientID) { SE_THROW("need 'ClientID: ' in 'oauth2:' parameters"); } clientSecret = (const gchar *)g_hash_table_lookup(parameters, "ClientSecret"); if (!clientSecret) { SE_THROW("need 'ClientSecret: ' in 'oauth2:' parameters"); } if (password.empty()) { SE_THROW("need refresh token provided as password"); } boost::shared_ptr provider(new RefreshTokenAuthProvider(tokenHost, tokenPath, scope, clientID, clientSecret, password.c_str())); return provider; } SE_END_CXX syncevolution-1.5/src/backends/pbap/0000755000373300037200000000000012424707641021166 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/pbap/configure-sub.in0000644000373300001540000000261612326412403024103 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. dnl Checks for required libraris can go here; none required for simple files. dnl dnl This is from the sqlite backend: dnl PKG_CHECK_MODULES(SQLITE, sqlite3, SQLITEFOUND=yes, [SQLITEFOUND=no]) dnl AC_SUBST(SQLITE_CFLAGS) dnl AC_SUBST(SQLITE_LIBS) PBAP_CFLAGS= PBAP_LIBS= AC_SUBST(PBAP_CFLAGS) AC_SUBST(BAP_LIBS) dnl If additional compile flags are necessary to include the header dnl files of the backend, then add them here. BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $PBAP_CFLAGS" dnl name of backend library (there could be more than one per directory), dnl name of the directory, dnl help string, dnl --enable/disable chosen explicitly dnl default, may depend on availability of prerequisites in more complex backends SE_ARG_ENABLE_BACKEND(pbap, pbap, [AS_HELP_STRING([--enable-pbap], [enable Phone Book Access Protocol (PBAP) based backend which provides one-way synchronization (default off)])], [enable_pbap="$enableval"], [enable_pbap="no"] ) if test "$enable_pbap" = "yes"; then dnl It's good to check the prerequisites here, in case --enable-pbap was used. AC_DEFINE(ENABLE_PBAP, 1, [pbap available]) dnl Needed for g_file_open_tmp(). need_glib="yes" fi syncevolution-1.5/src/backends/pbap/README0000664000373300001540000001434112363142310021661 0ustar00nightlynightly00000000000000Usage ===== The "pbap" backend provides access to an addressbook stored in a remote device using the Bluetooth PBAP protocol. This is achieved using the D-Bus services from obex-client (obexd), which needs to be running. The "database" property specifies the Bluetooth address of the device to be connected. The "databaseFormat" can be used as follows: [(2.1|3.0)][:][^]propname,propname,... 3.0 = download in vCard 3.0 instead of the default 2.1 3.0:^PHOTO = download in vCard 3.0 format, excluding PHOTO PHOTO = download in vCard 2.1 format, only the PHOTO Valid property names are the ones listed by obexd in ListFilterFields(). These fields may include: VERSION FN N PHOTO BDAY ADR LABEL TEL EMAIL MAILER TZ GEO TITLE ROLE LOGO AGENT ORG NOTE REV SOUND URL UID KEY NICKNAME CATEGORIES CLASS BITxy (for different values of xy) Set "SYNCEVOLUTION_DEBUG=1" as environment variable when using the backend to see a list of filter fields supported by obexd. Syncing ======= The backend itself is not able to detect changes since the last sync, mostly because PBAP as a protocol makes that hard. For example, it makes no guarantee that an item has the same ID in two different sessions. The intended use for the PBAP backend therefore is in the "slow local cache" sync mode: always pull all data and let the sync engine update a local database. The local database is not allowed to be modified outside of the sync. Any such change may get lost at any time. # configure backend # # # Preventing a slow sync is possible in local-cache mode. It # makes no sense for PBAP and thus has to be turned off. syncevolution --configure \ syncURL= \ addressbook/backend=pbap \ addressbook/database=obex-bt://XX:XX:XX:XX:XX:XX \ preventSlowSync=false \ target-config@pbap addressbook # print items syncevolution --print-items \ target-config@pbap addressbook # Configure synchronization. # # 'local-cache' expands to 'local-cache-incremental', which will try # to do an incremental sync but be turned into a slow sync by # the PBAP backend. syncevolution --configure \ --template SyncEvolution_Client \ syncURL=local://@pbap \ sync=local-cache \ pbap addressbook # run synchronization syncevolution pbap It may or may not be desirable to sync only the text properties of a contact. This can be considerably faster, because the PHOTO property is large and increases the download and processing time. SyncEvolution supports that in three different ways, chosen via the SYNCEVOLUTION_PBAP_SYNC env variable: SYNCEVOLUTION_PBAP_SYNC=text syncevolution pbap Synchronize only the text properties by excluding the PHOTO property, keep all photos already stored locally. SYNCEVOLUTION_PBAP_SYNC=all syncevolution pbap Synchronize all properties according to the databaseFormat in one go, adding/updating/removing photos locally to match the phone. SYNCEVOLUTION_PBAP_SYNC=incremental syncevolution pbap Synchronize first text, then all data. Conceptually this is the same as two invocations with "text" and then "all". Because the implementation reuses the same PBAP session and sync session, it is slightly faster. It is slower than a single "all" sync because the entire set of contacts must be downloaded and synced twice, once without photo, then with. SYNCEVOLUTION_PBAP_SYNC has side effect on the entire sync and thus may only be used in a sync config which synchronizes contacts via PBAP. The PIM Manager defaults to SYNCEVOLUTION_PBAP_SYNC=incremental. This can be overriden by setting the env variable when starting syncevo-dbus-server, for example by patching src/dbus/server/syncevo-dbus-server-startup.sh.in = /usr/libexec/syncevo-dbus-server-startup.sh, or using the new SyncPeerWithFlags() and 'pbap-sync' flag. Transfering in chunks ===================== The default is to pull all contacts in one transfer. This can be changed to transfer in chunks. Optionally the size of the chunks can be adjusted dynamically at runtime to achieve a certain time per transfer. The purpose of transferring in chunks is twofold: 1. It avoids having to pull the entire address book into a file which then has to be kept around until syncing is complete. 2. By randomly starting at different offsets, eventually all data gets added to the local cache even if no sync ever completes. This gets configured with environment variables: SYNCEVOLUTION_PBAP_CHUNK_MAX_COUNT_PHOTO= A value larger 0 enables chunking when transferring contacts with photo data. SYNCEVOLUTION_PBAP_CHUNK_MAX_COUNT_NO_PHOTO= A value larger 0 enables chunking when transferring contacts without photo data. SYNCEVOLUTION_PBAP_CHUNK_TRANSFER_TIME= The desired duration of each transfer. Indirectly also controls the amount of data which has to be buffered. Defaults to 30 seconds, turned off with any value <= 0 seconds. SYNCEVOLUTION_PBAP_CHUNK_TIME_LAMBDA=<0 to 1> Controls how quickly new measurements adapt the chunk size. 0 is fastest (= next transfer uses exactly the calculated number of contacts), 1 is not at all (= all transfers use the intitial number). Defaults to 0.1. SYNCEVOLUTION_PBAP_CHUNK_OFFSET=<0 to number of contacts in phone> Overrides the random selection of the start offset. Useful for debugging. Offsets which are out of range get mapped into a valid offset. For example, consider a Samsung Galaxy S3, Android 4.3, average contact size 6KB with photo data and 235B without. The transfer rate is 40KB/s with photo data, 17KB/s without. To achieve 30s per chunk, one needs to choose 243 contacts per chunk with photo data resp. 2500 without. A transfer of 1000 contacts without photos completes in under 17 seconds, with photos under 2:05 minutes. In this case, downloading in chunks was almost as fast as transferring all at once. To debug transferring in chunks, run SYNCEVOLUTION_DEBUG=1 syncevolution --daemon=no --export - \ backend=pbap loglevel=4 \ database=obex-bt://64:B3:10:C0:8C:2E 2>&1 | grep -e transferred -e "pullall" -e "max count" syncevolution-1.5/src/backends/pbap/PbapSyncSourceRegister.cpp0000644000373300001540000000471412326412403026115 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "PbapSyncSource.h" #include "test.h" #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); // The string returned by getSourceType() is always the one // registered as main Aliases() below. bool isMe = sourceType.m_backend == "PBAP Address Book"; #ifndef ENABLE_PBAP // tell SyncEvolution if the user wanted to use a disabled sync source, // otherwise let it continue searching return isMe ? RegisterSyncSource::InactiveSource(params) : NULL; #else // Also recognize one of the standard types? // Not in the PbapSyncSource! bool maybeMe = false /* sourceType.m_backend == "addressbook" */; if (isMe || maybeMe) { return new PbapSyncSource(params); } return NULL; #endif } static RegisterSyncSource registerMe("One-way sync using PBAP", #ifdef ENABLE_PBAP true, #else false, #endif createSource, "One-way sync using PBAP = pbap\n" " Requests phonebook entries using PBAP profile, and thus\n" " supporting read-only operations.\n" " The BT address is selected via database=obex-bt://.\n", Values() + (Aliases("PBAP Address Book") + "pbap")); SE_END_CXX syncevolution-1.5/src/backends/pbap/pbap.am0000644000373300001540000000274312326412403022245 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ src/backends/pbap/configure-sub.in \ src/backends/pbap/README \ $(NONE) src_backends_pbap_lib = src/backends/pbap/syncpbap.la MOSTLYCLEANFILES += $(src_backends_pbap_lib) if ENABLE_MODULES src_backends_pbap_backenddir = $(BACKENDS_DIRECTORY) src_backends_pbap_backend_LTLIBRARIES = $(src_backends_pbap_lib) else noinst_LTLIBRARIES += $(src_backends_pbap_lib) endif src_backends_pbap_src = \ src/backends/pbap/PbapSyncSource.h \ src/backends/pbap/PbapSyncSource.cpp src_backends_pbap_syncpbap_la_SOURCES = $(src_backends_pbap_src) src_backends_pbap_syncpbap_la_LIBADD = $(PBAP_LIBS) $(PCRECPP_LIBS) $(SYNCEVOLUTION_LIBS) $(DBUS_LIBS) $(gdbus_build_dir)/libgdbussyncevo.la src_backends_pbap_syncpbap_la_LDFLAGS = -module -avoid-version $(DBUS_LIBS) src_backends_pbap_syncpbap_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) $(DBUS_CFLAGS) src_backends_pbap_syncpbap_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(gdbus_dir) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_pbap_syncpbap_la_DEPENDENCIES = src/syncevo/libsyncevolution.la $(gdbus_build_dir)/libgdbussyncevo.la # If you need special test cases for your sync source, then # install them here. Here's how the sqlite backend does that: # #../../testcases/sqlite_vcard21.vcf: $(FUNAMBOL_SUBDIR)/test/test/testcases/vcard21.vcf # mkdir -p ${@D} # perl -e '$$_ = join("", <>); s/^(ADR|TEL|EMAIL|PHOTO).*?(?=^\S)//msg; s/;X-EVOLUTION-UI-SLOT=\d+//g; print;' $< >$@ #all: ../../testcases/sqlite_vcard21.vcf syncevolution-1.5/src/backends/pbap/PbapSyncSource.h0000644000373300001540000000627612326412403024062 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_PBAPSYNCSOURCE #define INCL_PBAPSYNCSOURCE #include #ifdef ENABLE_PBAP #include #include #include #include #include SE_BEGIN_CXX class PullAll; class PbapSession; class PbapSyncSource : virtual public SyncSource, virtual public SyncSourceSession, virtual public SyncSourceRaw, private boost::noncopyable { public: PbapSyncSource(const SyncSourceParams ¶ms); ~PbapSyncSource(); protected: /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual void close(); virtual void setFreeze(bool freeze); virtual Databases getDatabases(); virtual void enableServerMode(); virtual bool serverModeEnabled() const; virtual std::string getPeerMimeType() const; virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments); /* implementation of SyncSourceSession interface */ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); /* implementation of SyncSourceRaw interface */ virtual InsertItemResult insertItemRaw(const std::string &luid, const std::string &item); virtual void readItemRaw(const std::string &luid, std::string &item); private: boost::shared_ptr m_session; boost::shared_ptr m_pullAll; enum PBAPSyncMode { PBAP_SYNC_NORMAL, ///< Read contact data according to filter. PBAP_SYNC_TEXT, ///< Sync without reading photo data from phone and keeping local photos instead. PBAP_SYNC_INCREMENTAL ///< Sync first without photo data (as in PBAP_SYNC_TEXT), /// then add photo data in second cycle. } m_PBAPSyncMode; bool m_isFirstCycle; bool m_hadContacts; /** * List items as expected by Synthesis engine. */ sysync::TSyError readNextItem(sysync::ItemID aID, sysync::sInt32 *aStatus, bool aFirst); /** * Copy item into Synthesis key. */ sysync::TSyError readItemAsKey(sysync::cItemID aID, sysync::KeyH aItemKey); }; SE_END_CXX #endif // ENABLE_PBAP #endif // INCL_PBAPSYNCSOURCE syncevolution-1.5/src/backends/pbap/PbapSyncSource.cpp0000664000373300001540000015354712410530262024421 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * Copyright (C) 2012 BMW Car IT GmbH. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_PBAP #include "PbapSyncSource.h" #include #include #include #include #include #include #include #include #include // PBAP backend does not compile without GLib. #include #include #include #include #include "gdbus-cxx-bridge.h" #include #include #include #include SE_BEGIN_CXX #define OBC_SERVICE "org.openobex.client" // obexd < 0.47 #define OBC_SERVICE_NEW "org.bluez.obex.client" // obexd >= 0.47, including 0.48 (with yet another slight API change!) #define OBC_SERVICE_NEW5 "org.bluez.obex" // obexd in Bluez 5.0 #define OBC_CLIENT_INTERFACE "org.openobex.Client" #define OBC_CLIENT_INTERFACE_NEW "org.bluez.obex.Client" #define OBC_CLIENT_INTERFACE_NEW5 "org.bluez.obex.Client1" #define OBC_PBAP_INTERFACE "org.openobex.PhonebookAccess" #define OBC_PBAP_INTERFACE_NEW "org.bluez.obex.PhonebookAccess" #define OBC_PBAP_INTERFACE_NEW5 "org.bluez.obex.PhonebookAccess1" #define OBC_TRANSFER_INTERFACE_NEW "org.bluez.obex.Transfer" #define OBC_TRANSFER_INTERFACE_NEW5 "org.bluez.obex.Transfer1" typedef std::map Content; typedef std::list ContactQueue; typedef std::list Properties; typedef boost::variant< std::string, Properties, uint16_t > Bluez5Values; typedef std::map Bluez5Filter; typedef std::map > Params; typedef std::pair Bluez5PullAllResult; enum PullData { PULL_AS_CONFIGURED, PULL_WITHOUT_PHOTOS }; struct PullParams { /** Which data to pull. */ PullData m_pullData; /** * How much time is meant to be used per chunk. */ double m_timePerChunk; /** * The lambda factor used in exponential smoothing of the max * count per transfer to achieve the desired time per chunk. * 0 means "use latest observation only", 1 means "keep using * initial chunk size". */ double m_timeLambda; /** Initial chunk size in number of contacts, without and with photo data. */ uint16_t m_startMaxCount[2]; /** Initial chunk offset, again in contacts. */ uint16_t m_startOffset; PullParams() { memset(this, 0, sizeof(*this)); } }; /** * This class is responsible for a) generating unique IDs for each * contact in a certain order (returned one-by-one via getNextID()) * and b) returning the contact one-by-one in that order * (getContact()). This is done to match the way how the sync engine * handles items. * * Although the API of getContact() allows random access, we don't need * to support that for syncing. * * IDs are #0 to #n-1 where n = GetSize() at the time when the session * starts. * * A simple transfer then just does a PullAll() and returns the * incoming data one at a time. The downsides are a) if the transfer * always gets interrupted in the middle, we never cache contacts at * the end and b) the entire data must be stored temporarily, either in RAM * or on disk. * * Transfers have been reported to take half an hour for slow peers and * large address books. This is perhaps unusual, but it happens. More common * is the second downside. * * Transferring in chunks addresses both. Here's a potential (and not * 100% correct!) algorithm for transferring a complete address book in chunks: * * uint16 used = GetSize() # not the same as maximum offset! * uint16 start = choose_start() * uint16 chunksize = choose_chunk_size() * * uint16 i * for (i = start; i < used; i += chunksize) { * PullAll( Offset = i, MaxCount = chunksize) * } * for (i = 0; i < start; i += chunksize) { * PullAll( Offset = i, MaxCount = min(chunksize, start - 1) * } * * Note that GetSize() is specified as returning the number of entries in * the selected phonebook object that are actually used (i.e. indexes that * correspond to non-NULL entries). This is relevant if contacts get * deleted after starting the session. In that case, the algorithm above * will not necessarily read all contacts. Here's an example: * offsets #0 till #99, with contacts #10 till #19 deleted * chunksize = 10 * GetSize() = 90 * * => this will request offsets #0 till #89, missing contacts #90 till #99 * * This could be fixed with an additional PullAll, leading to: * * for (i = start; i < used; i += chunksize) { * PullAll( Offset = i, MaxCount = chunksize) * } * PullAll(Offset = i) # no MaxCount! * for (i = 0; i < start; i += chunksize) { * PullAll( Offset = i, MaxCount = min(chunksize, start - 1) * } * * The additional PullAll() is meant to read all contacts at the end which * would not be covered otherwise. * * Now the other problem: MaxCount means "read chunksize contacts * starting at #i". Therefore the algorithm above will end up reading contacts * multiple times occasionally. Example: * * offsets #0 till #99, with contact #0 deleted * chunksize = 10 * GetSize() = 98 * * PullAll(Offset = 0, MaxCount = 10) => returns 10 contacts #1 till #10 (inclusive) * PullAll(Offset = 10, MaxCount = 10) => returns 10 contacts #10 till #19 * => contact #10 appears twice in the result * * The duplicate cannot be filtered out easily because the UID is not * reliable. This could be addressed by keeping a hash of each contact and * discarding those who are exact matches for already seen contacts. It's easier * to accept the duplicate and remove it during the next sync. * * When combining these two problems (some contacts read twice, plus * the additional PullAll() at the end), we can get more contacts than * originally anticipated based on GetSize(). The sync engine will not * ask for more contacts than we originally announced. Therefore the * current implementation does *not* do the additional PullAll(); this * is unlikely to cause any real problems because it should be rare * that the number of contacts changes in the short period of time * between establishing the session and asking for the size. * * There are two more aspects that I chose to ignore above: how to * implement the choice of start offset and chunk size. * * Start offset could be random (no persistent state needed) or could * continue where the last sync left off. The latter will require a write * after each PullAll() (in case of unexpected shutdowns), even if nothing * ever changes. Is that acceptable? Probably not. The current implementation * chooses randomly by default. * * The chunk size in bytes depends on the size of the average contact, * which is unknown. Make it too small, and we end up generating lots * of individual transfers. Make it too large, and we still have * chunks that never transfer completely. The current implementation * uses self-tuning to achieve a certain desired transfer time per * chunk. * * This algorithm can be tuned by env variables. See the README for * details. */ class PullAll { PullParams m_pullParams; std::string m_buffer; // vCards kept in memory when using old obexd. TmpFile m_tmpFile; // Stored in temporary file and mmapped with more recent obexd. // Maps contact number to chunks of m_buffer or m_tmpFile. Content m_content; int m_contentStartIndex; uint16_t m_numContacts; // Number of existing contacts, according to GetSize() or after downloading. uint16_t m_currentContact; // Numbered starting with zero according to discovery in addVCards. boost::shared_ptr m_session; // Only set when there is a transfer ongoing. size_t m_tmpFileOffset; // Number of bytes already parsed. uint16_t m_transferOffset; // First contact requested as part of current transfer. uint16_t m_initialOffset; // First contact request by first transfer. uint16_t m_transferMaxCount; // Number of contacts requested as part of current transfer, 0 when not doing chunked transfers. uint16_t m_desiredMaxCount; // Number of contacts supposed to be transfered, may be more than m_transferMaxCount when reading at the end of the enumerated contacts. Bluez5Filter m_filter; // Current filter for a Bluez5-like transfer (includes obexd 0.48 case). Timespec m_transferStart; // Start time of current transfer. // Observed results from the last transfer. double m_lastTransferRate; double m_lastContactSizeAverage; bool m_wasSuspended; friend class PbapSession; friend class PbapSyncSource; public: PullAll(); ~PullAll(); std::string getNextID(); bool getContact(const char *id, pcrecpp::StringPiece &vcard); const char *addVCards(int startIndex, const pcrecpp::StringPiece &content); }; PullAll::PullAll() : m_contentStartIndex(0), m_numContacts(0), m_currentContact(0), m_tmpFileOffset(0), m_transferOffset(0), m_initialOffset(0), m_transferMaxCount(0), m_desiredMaxCount(0), m_lastTransferRate(0), m_lastContactSizeAverage(0), m_wasSuspended(false) {} PullAll::~PullAll() { } class PbapSession : private boost::noncopyable { public: static boost::shared_ptr create(PbapSyncSource &parent); void initSession(const std::string &address, const std::string &format); typedef std::map Content; boost::shared_ptr startPullAll(const PullParams &pullParams); void continuePullAll(PullAll &state); void checkForError(); // Throws exception if transfer failed. Timespec transferComplete() const; void resetTransfer(); void shutdown(void); void setFreeze(bool freeze); void blockOnFreeze(); private: PbapSession(PbapSyncSource &parent); PbapSyncSource &m_parent; boost::weak_ptr m_self; std::auto_ptr m_client; bool m_frozen; enum { OBEXD_OLD, // obexd < 0.47 OBEXD_NEW, // obexd == 0.47, file-based transfer // OBEXD_048 // obexd == 0.48, file-based transfer without SetFilter and with filter parameter to PullAll() BLUEZ5 // obexd in Bluez >= 5.0 } m_obexAPI; Bluez5Filter m_filter5; Properties m_filterFields; Properties supportedProperties() const; /** * m_transferComplete will be set to the current monotonic time when observing a * "Complete" signal on a transfer object path which has the * current session as prefix. There may be more than one such transfer, * so record all completions that we see and then pick the right one. * * It also gets set when an error occurred for such a transfer, * in which case m_error will also be set. * * This only works as long as the session is only used for a * single transfer. Otherwise a more complex tracking of * completion, for example per transfer object path, is needed. */ class Completion { public: Timespec m_transferComplete; std::string m_transferErrorCode; std::string m_transferErrorMsg; static Completion now() { Completion res; res.m_transferComplete = Timespec::monotonic(); return res; } }; typedef std::map Transfers; Transfers m_transfers; std::string m_currentTransfer; std::auto_ptr > m_errorSignal; void errorCb(const GDBusCXX::Path_t &path, const std::string &error, const std::string &msg); // Bluez 5 typedef GDBusCXX::SignalWatch4 > PropChangedSignal_t; std::auto_ptr m_propChangedSignal; void propChangedCb(const GDBusCXX::Path_t &path, const std::string &interface, const Params &changed, const std::vector &invalidated); // new obexd API typedef GDBusCXX::SignalWatch1 CompleteSignal_t; std::auto_ptr m_completeSignal; void completeCb(const GDBusCXX::Path_t &path); typedef GDBusCXX::SignalWatch3 > PropertyChangedSignal_t; std::auto_ptr m_propertyChangedSignal; void propertyChangedCb(const GDBusCXX::Path_t &path, const std::string &name, const boost::variant &value); std::auto_ptr m_session; }; PbapSession::PbapSession(PbapSyncSource &parent) : m_parent(parent), m_frozen(false) { } boost::shared_ptr PbapSession::create(PbapSyncSource &parent) { boost::shared_ptr session(new PbapSession(parent)); session->m_self = session; return session; } void PbapSession::propChangedCb(const GDBusCXX::Path_t &path, const std::string &interface, const Params &changed, const std::vector &invalidated) { // Called for a path which matches the current session, so we know // that the signal is for our transfer. Only need to check the status. Params::const_iterator it = changed.find("Status"); if (it != changed.end()) { std::string status = boost::get(it->second); SE_LOG_DEBUG(NULL, "OBEXD transfer %s: %s", path.c_str(), status.c_str()); if (status == "complete" || status == "error") { Completion completion = Completion::now(); if (status == "error") { // We have to make up some error descriptions. The Bluez // 5 API no longer seems to provide that. completion.m_transferErrorCode = "transfer failed"; completion.m_transferErrorMsg = "reason unknown"; } m_transfers[path] = completion; } else if (status == "active" && m_currentTransfer == path && m_frozen) { // Retry Suspend() which must have failed earlier. try { GDBusCXX::DBusRemoteObject transfer(m_client->getConnection(), m_currentTransfer, OBC_TRANSFER_INTERFACE_NEW5, OBC_SERVICE_NEW5, true); GDBusCXX::DBusClientCall0(transfer, "Suspend")(); SE_LOG_DEBUG(NULL, "successfully suspended transfer when it became active"); } catch (...) { // Ignore all errors here. The worst that can happen is that // the transfer continues to run. Once Bluez supports suspending // queued transfers we shouldn't get here at all. std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); SE_LOG_DEBUG(NULL, "ignoring failure of delayed suspend: %s", explanation.c_str()); } } } } void PbapSession::completeCb(const GDBusCXX::Path_t &path) { SE_LOG_DEBUG(NULL, "obexd transfer %s completed", path.c_str()); m_transfers[path] = Completion::now(); } void PbapSession::errorCb(const GDBusCXX::Path_t &path, const std::string &error, const std::string &msg) { SE_LOG_DEBUG(NULL, "obexd transfer %s failed: %s %s", path.c_str(), error.c_str(), msg.c_str()); Completion &completion = m_transfers[path]; completion.m_transferComplete = Timespec::monotonic(); completion.m_transferErrorCode = error; completion.m_transferErrorMsg = msg; } void PbapSession::propertyChangedCb(const GDBusCXX::Path_t &path, const std::string &name, const boost::variant &value) { const int64_t *tmp = boost::get(&value); if (tmp) { SE_LOG_DEBUG(NULL, "obexd transfer %s property change: %s = %ld", path.c_str(), name.c_str(), (long signed)*tmp); } else { SE_LOG_DEBUG(NULL, "obexd transfer %s property change: %s", path.c_str(), name.c_str()); } } Properties PbapSession::supportedProperties() const { Properties props; static const std::set supported = boost::assign::list_of("VERSION") ("FN") ("N") ("PHOTO") ("BDAY") ("ADR") ("LABEL") ("TEL") ("EMAIL") ("MAILER") ("TZ") ("GEO") ("TITLE") ("ROLE") ("LOGO") ("AGENT") ("ORG") ("NOTE") ("REV") ("SOUND") ("URL") ("UID") ("KEY") ("NICKNAME") ("CATEGORIES") ("CLASS"); BOOST_FOREACH (const std::string &prop, m_filterFields) { // Be conservative and only ask for properties that we // really know how to use. obexd also lists the bit field // strings ("BIT01") but phones have been seen to reject // queries when those were enabled. if (supported.find(prop) != supported.end()) { props.push_back(prop); } } return props; } void PbapSession::initSession(const std::string &address, const std::string &format) { if (m_session.get()) { return; } // format string uses: // [(2.1|3.0):][^]propname,propname,... // // 3.0:^PHOTO = download in vCard 3.0 format, excluding PHOTO // 2.1:PHOTO = download in vCard 2.1 format, only the PHOTO std::string version; std::string tmp; std::string properties; const pcrecpp::RE re("(?:(2\\.1|3\\.0):?)?(\\^?)([-a-zA-Z,]*)"); if (!re.FullMatch(format, &version, &tmp, &properties)) { m_parent.throwError(SE_HERE, StringPrintf("invalid specification of PBAP vCard format (databaseFormat): %s", format.c_str())); } char negated = tmp.c_str()[0]; if (version.empty()) { // same default as in obexd version = "2.1"; } if (version != "2.1" && version != "3.0") { m_parent.throwError(SE_HERE, StringPrintf("invalid vCard version prefix in PBAP vCard format specification (databaseFormat): %s", format.c_str())); } std::set keywords; boost::split(keywords, properties, boost::is_from_range(',', ',')); typedef std::map > Params; Params params; params["Target"] = std::string("PBAP"); std::string session; GDBusCXX::DBusConnectionPtr conn = GDBusCXX::dbus_get_bus_connection("SESSION", NULL, true, NULL); // We must attempt to use the new interface(s), otherwise we won't know whether // the daemon exists or can be started. m_obexAPI = BLUEZ5; m_client.reset(new GDBusCXX::DBusRemoteObject(conn, "/org/bluez/obex", OBC_CLIENT_INTERFACE_NEW5, OBC_SERVICE_NEW5, true)); try { SE_LOG_DEBUG(NULL, "trying to use bluez 5 obexd service %s", OBC_SERVICE_NEW5); session = GDBusCXX::DBusClientCall1(*m_client, "CreateSession")(address, params); } catch (const std::exception &error) { if (!strstr(error.what(), "org.freedesktop.DBus.Error.ServiceUnknown") && !strstr(error.what(), "org.freedesktop.DBus.Error.UnknownObject")) { throw; } // Fall back to old interface. SE_LOG_DEBUG(NULL, "bluez obex service not available (%s), falling back to previous obexd one %s", error.what(), OBC_SERVICE_NEW); m_obexAPI = OBEXD_NEW; } if (session.empty()) { m_client.reset(new GDBusCXX::DBusRemoteObject(conn, "/", OBC_CLIENT_INTERFACE_NEW, OBC_SERVICE_NEW, true)); try { SE_LOG_DEBUG(NULL, "trying to use new obexd service %s", OBC_SERVICE_NEW); session = GDBusCXX::DBusClientCall1(*m_client, "CreateSession")(address, params); } catch (const std::exception &error) { if (!strstr(error.what(), "org.freedesktop.DBus.Error.ServiceUnknown")) { throw; } // Fall back to old interface. SE_LOG_DEBUG(NULL, "new obexd service(s) not available (%s), falling back to old one %s", error.what(), OBC_SERVICE); m_obexAPI = OBEXD_OLD; } } if (session.empty()) { m_client.reset(new GDBusCXX::DBusRemoteObject(conn, "/", OBC_CLIENT_INTERFACE, OBC_SERVICE, true)); params["Destination"] = std::string(address); session = GDBusCXX::DBusClientCall1(*m_client, "CreateSession")(params); } if (session.empty()) { m_parent.throwError(SE_HERE, "PBAP: failed to create session"); } if (m_obexAPI != OBEXD_OLD) { m_session.reset(new GDBusCXX::DBusRemoteObject(m_client->getConnection(), session, m_obexAPI == BLUEZ5 ? OBC_PBAP_INTERFACE_NEW5 : OBC_PBAP_INTERFACE_NEW, m_obexAPI == BLUEZ5 ? OBC_SERVICE_NEW5 : OBC_SERVICE_NEW, true)); // Filter Transfer signals via path prefix. Discussions on Bluez // list showed that this is meant to be possible, even though the // client-api.txt documentation itself didn't (and still doesn't) // make it clear: // "[PATCH obexd v0] client-doc: Guarantee prefix in transfer paths" // http://www.spinics.net/lists/linux-bluetooth/msg28409.html // // Be extra careful with asynchronous callbacks: bind to weak // pointer and ignore callback when the instance is already gone. // Should not happen with signals (destructing the class unregisters // the watch), but very well may happen in asynchronous method // calls. Therefore maintain m_self and show how to use it here. if (m_obexAPI == BLUEZ5) { // Bluez 5 m_propChangedSignal.reset(new PropChangedSignal_t (GDBusCXX::SignalFilter(m_client->getConnection(), session, "org.freedesktop.DBus.Properties", "PropertiesChanged", GDBusCXX::SignalFilter::SIGNAL_FILTER_PATH_PREFIX))); m_propChangedSignal->activate(boost::bind(&PbapSession::propChangedCb, m_self, _1, _2, _3, _4)); } else { // obexd >= 0.47 m_completeSignal.reset(new CompleteSignal_t (GDBusCXX::SignalFilter(m_client->getConnection(), session, OBC_TRANSFER_INTERFACE_NEW, "Complete", GDBusCXX::SignalFilter::SIGNAL_FILTER_PATH_PREFIX))); m_completeSignal->activate(boost::bind(&PbapSession::completeCb, m_self, _1)); // same for error m_errorSignal.reset(new GDBusCXX::SignalWatch3 (GDBusCXX::SignalFilter(m_client->getConnection(), session, OBC_TRANSFER_INTERFACE_NEW, "Error", GDBusCXX::SignalFilter::SIGNAL_FILTER_PATH_PREFIX))); m_errorSignal->activate(boost::bind(&PbapSession::errorCb, m_self, _1, _2, _3)); // and property changes m_propertyChangedSignal.reset(new PropertyChangedSignal_t(GDBusCXX::SignalFilter(m_client->getConnection(), session, OBC_TRANSFER_INTERFACE_NEW, "PropertyChanged", GDBusCXX::SignalFilter::SIGNAL_FILTER_PATH_PREFIX))); m_propertyChangedSignal->activate(boost::bind(&PbapSession::propertyChangedCb, m_self, _1, _2, _3)); } } else { // obexd < 0.47 m_session.reset(new GDBusCXX::DBusRemoteObject(m_client->getConnection(), session, OBC_PBAP_INTERFACE, OBC_SERVICE, true)); } SE_LOG_DEBUG(NULL, "PBAP session created: %s", m_session->getPath()); // get filter list so that we can continue validating our format specifier m_filterFields = GDBusCXX::DBusClientCall1< Properties >(*m_session, "ListFilterFields")(); SE_LOG_DEBUG(NULL, "supported PBAP filter fields:\n %s", boost::join(m_filterFields, "\n ").c_str()); Properties filter; if (negated) { // negated, start with everything set filter = supportedProperties(); } // validate parameters and update filter BOOST_FOREACH (const std::string &prop, keywords) { if (prop.empty()) { continue; } Properties::const_iterator entry = std::find_if(m_filterFields.begin(), m_filterFields.end(), boost::bind(&boost::iequals, _1, prop, std::locale())); if (entry == m_filterFields.end()) { m_parent.throwError(SE_HERE, StringPrintf("invalid property name in PBAP vCard format specification (databaseFormat): %s", prop.c_str())); } if (negated) { filter.remove(*entry); } else { filter.push_back(*entry); } } GDBusCXX::DBusClientCall0(*m_session, "Select")(std::string("int"), std::string("PB")); m_filter5["Format"] = version == "2.1" ? "vcard21" : "vcard30"; m_filter5["Fields"] = filter; SE_LOG_DEBUG(NULL, "PBAP session initialized"); } boost::shared_ptr PbapSession::startPullAll(const PullParams &pullParams) { resetTransfer(); blockOnFreeze(); // Update prepared filter to match pullData. Bluez5Filter currentFilter = m_filter5; std::string &format = boost::get(currentFilter["Format"]); std::list &filter = boost::get< std::list >(currentFilter["Fields"]); switch (pullParams.m_pullData) { case PULL_AS_CONFIGURED: // Avoid empty filter. Android 4.3 on Samsung Galaxy S3 // only returns the mandatory FN, N, TEL fields when no // filter is set. const char *filterSource; if (filter.empty()) { filterSource = "default properties"; filter = supportedProperties(); } else { filterSource = "configured"; } SE_LOG_DEBUG(NULL, "pull all with %s filter: '%s'", filterSource, boost::join(filter, " ").c_str()); break; case PULL_WITHOUT_PHOTOS: // Remove PHOTO from list or create list with the other properties. if (filter.empty()) { filter = supportedProperties(); } for (Properties::iterator it = filter.begin(); it != filter.end(); ++it) { if (*it == "PHOTO") { filter.erase(it); break; } } SE_LOG_DEBUG(NULL, "pull all without photos: '%s'", boost::join(filter, " ").c_str()); break; } bool pullAllWithFiltersFallback = false; if (m_obexAPI == OBEXD_OLD || m_obexAPI == OBEXD_NEW) { try { GDBusCXX::DBusClientCall0(*m_session, "SetFilter")(filter); GDBusCXX::DBusClientCall0(*m_session, "SetFormat")(format); } catch (...) { // Ignore failure, can happen with 0.48. Instead send filter together // with PullAll method call. Exception::handle(HANDLE_EXCEPTION_NO_ERROR); pullAllWithFiltersFallback = true; } } boost::shared_ptr state(new PullAll); state->m_pullParams = pullParams; state->m_contentStartIndex = 0; state->m_currentContact = 0; state->m_transferOffset = 0; state->m_desiredMaxCount = 0; state->m_initialOffset = 0; state->m_transferMaxCount = 0; state->m_lastTransferRate = 0; state->m_lastContactSizeAverage = 0; state->m_wasSuspended = false; if (m_obexAPI != OBEXD_OLD) { // Beware, this will lead to a "Complete" signal in obexd // 0.47. We need to be careful with looking at the right // transfer to determine whether PullAll completed. state->m_numContacts = GDBusCXX::DBusClientCall1(*m_session, "GetSize")(); SE_LOG_DEBUG(NULL, "Expecting %d contacts.", state->m_numContacts); state->m_tmpFile.create(TmpFile::FILE); SE_LOG_DEBUG(NULL, "Created temporary file for PullAll %s", state->m_tmpFile.filename().c_str()); // Start chunk size depends on whether we pull PHOTOs. bool pullPhotos = std::find(filter.begin(), filter.end(), "PHOTO") != filter.end(); state->m_transferMaxCount = pullParams.m_startMaxCount[pullPhotos]; if (state->m_transferMaxCount > 0 && (pullAllWithFiltersFallback || m_obexAPI == BLUEZ5)) { // Enable transfering in chunks. state->m_desiredMaxCount = state->m_transferMaxCount; state->m_initialOffset = state->m_transferOffset = pullParams.m_startOffset < 0 ? 0 : (pullParams.m_startOffset % state->m_numContacts); uint16_t available = state->m_numContacts - state->m_transferOffset; if (available < state->m_transferMaxCount) { // Don't read past end of contacts. state->m_transferMaxCount = available; } currentFilter["Offset"] = state->m_transferOffset; currentFilter["MaxCount"] = state->m_transferMaxCount; state->m_filter = currentFilter; } state->m_transferStart.resetMonotonic(); Bluez5PullAllResult tuple = pullAllWithFiltersFallback ? // 0.48 GDBusCXX::DBusClientCall1 >(*m_session, "PullAll")(state->m_tmpFile.filename(), currentFilter) : m_obexAPI == OBEXD_NEW ? // 0.47 GDBusCXX::DBusClientCall1 >(*m_session, "PullAll")(state->m_tmpFile.filename()) : // 5.x GDBusCXX::DBusClientCall2(*m_session, "PullAll")(state->m_tmpFile.filename(), currentFilter); const GDBusCXX::DBusObject_t &transfer = tuple.first; const Params &properties = tuple.second; m_currentTransfer = transfer; SE_LOG_DEBUG(NULL, "start pullall offset #%u count %u, transfer path %s, %ld properties", state->m_transferOffset, state->m_transferMaxCount, transfer.c_str(), (long)properties.size()); // Work will be finished incrementally in PullAll::getContact(). // // In the meantime we return IDs by simply enumerating the expected ones. // If we don't get as many contacts as expected, we return 404 in getContact() // and the Synthesis engine will ignore the ID (src/sysync/binfileimplds.cpp: // "Record does not exist any more in database%s -> ignore"). state->m_tmpFileOffset = 0; state->m_session = m_self.lock(); state->m_filter = currentFilter; } else { // < 0.47 // // This only works once. Incremental syncing with the same // session leads to a "PullAll method with no arguments not // found" error from obex-client. Looks like a bug/limitation // of obex-client < 0.47. Not sure what we should do about // this: disable incremental sync for old obex-client? Reject // it? Catch the error and add a better exlanation? GDBusCXX::DBusClientCall1 pullall(*m_session, "PullAll"); state->m_buffer = pullall(); state->addVCards(0, state->m_buffer); state->m_numContacts = state->m_content.size(); } return state; } const char *PullAll::addVCards(int startIndex, const pcrecpp::StringPiece &vcards) { pcrecpp::StringPiece vcarddata; pcrecpp::StringPiece tmp = vcards; int count = startIndex; pcrecpp::RE re("[\\r\\n]*(^BEGIN:VCARD.*?^END:VCARD)", pcrecpp::RE_Options().set_dotall(true).set_multiline(true)); while (re.Consume(&tmp, &vcarddata)) { m_content[count] = vcarddata; ++count; } SE_LOG_DEBUG(NULL, "PBAP content parsed: %d contacts starting at ID %d", count - startIndex, startIndex); return tmp.data(); } void PbapSession::continuePullAll(PullAll &state) { m_transfers.clear(); state.m_transferStart.resetMonotonic(); blockOnFreeze(); Bluez5PullAllResult tuple = m_obexAPI == BLUEZ5 ? GDBusCXX::DBusClientCall2(*m_session, "PullAll")(state.m_tmpFile.filename(), state.m_filter) : // must be 0.48 GDBusCXX::DBusClientCall1 >(*m_session, "PullAll")(state.m_tmpFile.filename(), state.m_filter); const GDBusCXX::DBusObject_t &transfer = tuple.first; const Params &properties = tuple.second; m_currentTransfer = transfer; SE_LOG_DEBUG(NULL, "continue pullall offset #%u count %u, transfer path %s, %ld properties", state.m_transferOffset, state.m_transferMaxCount, transfer.c_str(), (long)properties.size()); } void PbapSession::checkForError() { Transfers::const_iterator it = m_transfers.find(m_currentTransfer); if (it != m_transfers.end()) { if (!it->second.m_transferErrorCode.empty()) { m_parent.throwError(SE_HERE, StringPrintf("%s: %s", it->second.m_transferErrorCode.c_str(), it->second.m_transferErrorMsg.c_str())); } } } Timespec PbapSession::transferComplete() const { Timespec res; Transfers::const_iterator it = m_transfers.find(m_currentTransfer); if (it != m_transfers.end()) { res = it->second.m_transferComplete; } return res; } void PbapSession::resetTransfer() { m_transfers.clear(); } std::string PullAll::getNextID() { std::string id; if (m_currentContact < m_numContacts) { id = StringPrintf("%d", m_currentContact); m_currentContact++; } return id; } bool PullAll::getContact(const char *id, pcrecpp::StringPiece &vcard) { int contactNumber = atoi(id); SE_LOG_DEBUG(NULL, "get PBAP contact ID %s", id); if (contactNumber < 0 || contactNumber >= m_numContacts) { SE_LOG_DEBUG(NULL, "invalid contact number"); return false; } Content::iterator it; SuspendFlags &s = SuspendFlags::getSuspendFlags(); while ((it = m_content.find(contactNumber)) == m_content.end() && m_session && (!m_session->transferComplete() || m_tmpFile.moreData() || m_transferMaxCount)) { // Wait? We rely on regular propgress signals to wake us up. // obex 0.47 sends them every 64KB, at least in combination // with a Samsung Galaxy SIII. This may depend on both obexd // and the phone, so better check ourselves and perhaps do it // less often - unmap/map can be expensive and invalidates // some of the unread data (at least how it is implemented // now). while (!m_session->transferComplete() && m_tmpFile.moreData() < 128 * 1024) { s.checkForNormal(); g_main_context_iteration(NULL, true); } m_session->checkForError(); Timespec completed = m_session->transferComplete(); if (m_tmpFile.moreData()) { // Remap. This shifts all addresses already stored in // m_content, so beware and update those. pcrecpp::StringPiece oldMem = m_tmpFile.stringPiece(); m_tmpFile.unmap(); m_tmpFile.map(); pcrecpp::StringPiece newMem = m_tmpFile.stringPiece(); ssize_t delta = newMem.data() - oldMem.data(); BOOST_FOREACH (Content::value_type &entry, m_content) { pcrecpp::StringPiece &vcard = entry.second; vcard.set(vcard.data() + delta, vcard.size()); } // File exists and obexd has written into it, so now we // can unlink it to avoid leaking it if we crash. m_tmpFile.remove(); // Continue parsing where we stopped before. pcrecpp::StringPiece next(newMem.data() + m_tmpFileOffset, newMem.size() - m_tmpFileOffset); const char *end = addVCards(m_contentStartIndex + m_content.size(), next); size_t newTmpFileOffset = end - newMem.data(); SE_LOG_DEBUG(NULL, "PBAP content parsed: %ld out of %d (total), %d out of %d (last update)", (long)newTmpFileOffset, newMem.size(), (int)(end - next.data()), next.size()); m_tmpFileOffset = newTmpFileOffset; if (completed) { double duration = (completed - m_transferStart).duration(); m_lastTransferRate = duration > 0 ? m_tmpFile.size() / duration : 0; m_lastContactSizeAverage = m_content.size() ? (double)m_tmpFile.size() / (double)m_content.size() : 0; SE_LOG_DEBUG(NULL, "transferred %ldKB and %ld contacts in %.1fs -> transfer rate %.1fKB/s and %.1fcontacts/s, average contact size %.0fB", (long)m_tmpFile.size() / 1024, (long)m_content.size(), duration, m_lastTransferRate / 1024, m_content.size() / duration, m_lastContactSizeAverage); } } else if (completed && m_transferMaxCount > 0) { // Tune m_desiredMaxCount to achieve the intended transfer // time. Ignore clipped or suspended transfers, they are // not representative. Also avoid completely bogus // observations. if (m_pullParams.m_timePerChunk > 0 && !m_wasSuspended && m_transferMaxCount == m_desiredMaxCount && m_lastTransferRate > 0 && m_lastContactSizeAverage > 0) { // Use exponential moving average. double count = m_lastTransferRate * m_pullParams.m_timePerChunk / m_lastContactSizeAverage; double newcount = m_desiredMaxCount * m_pullParams.m_timeLambda + count * (1 - m_pullParams.m_timeLambda); uint16_t nextcount = (newcount < 0 || newcount > 0xFFFF) ? 0xFFFF : (uint16_t)newcount; SE_LOG_DEBUG(NULL, "old max count %u, measured max count for last transfer %.1f, lambda %f, next max count %u", m_desiredMaxCount, count, m_pullParams.m_timeLambda, nextcount); m_desiredMaxCount = nextcount; } m_wasSuspended = false; if (m_transferOffset + m_transferMaxCount < m_numContacts) { // Move one chunk forward. m_transferOffset += m_transferMaxCount; m_transferMaxCount = std::min((uint16_t)(((m_transferOffset < m_initialOffset) ? m_initialOffset : m_numContacts) - m_transferOffset), m_desiredMaxCount); } else { // Wrap around to offset #0. m_transferOffset = 0; m_transferMaxCount = std::min(m_initialOffset, m_desiredMaxCount); } if (m_transferMaxCount > 0) { m_filter["Offset"] = m_transferOffset; m_filter["MaxCount"] = m_transferMaxCount; m_tmpFileOffset = 0; m_tmpFile.close(); m_tmpFile.unmap(); m_tmpFile.create(TmpFile::FILE); SE_LOG_DEBUG(NULL, "Created next temporary file for PullAll %s", m_tmpFile.filename().c_str()); m_contentStartIndex += m_content.size(); m_content.clear(); m_session->continuePullAll(*this); } } } if (it == m_content.end()) { SE_LOG_DEBUG(NULL, "did not get the expected contact #%d, perhaps some contacts were deleted?", contactNumber); return false; } vcard = it->second; return true; } void PbapSession::shutdown(void) { GDBusCXX::DBusClientCall0 removeSession(*m_client, "RemoveSession"); // always clear pointer, even if method call fails GDBusCXX::DBusObject_t path(m_session->getPath()); //m_session.reset(); SE_LOG_DEBUG(NULL, "removed session: %s", path.c_str()); removeSession(path); SE_LOG_DEBUG(NULL, "PBAP session closed"); } void PbapSession::setFreeze(bool freeze) { SE_LOG_DEBUG(NULL, "PbapSession::setFreeze(%s, %s)", m_currentTransfer.c_str(), freeze ? "freeze" : "thaw"); if (freeze == m_frozen) { SE_LOG_DEBUG(NULL, "no change in freeze state"); return; } if (m_client.get()) { if (m_obexAPI == OBEXD_OLD) { SE_THROW("freezing OBEX transfer not possible with old obexd"); } if (!m_currentTransfer.empty()) { // Suspend/Resume implemented since Bluez 5.15. If not // implemented, we will get a D-Bus exception that is returned // to the caller as error, which will abort the sync. GDBusCXX::DBusRemoteObject transfer(m_client->getConnection(), m_currentTransfer, OBC_TRANSFER_INTERFACE_NEW5, OBC_SERVICE_NEW5, true); try { if (freeze) { GDBusCXX::DBusClientCall0(transfer, "Suspend")(); } else { GDBusCXX::DBusClientCall0(transfer, "Resume")(); } } catch (...) { std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); if (m_currentTransfer.empty() || transferComplete()) { // Transfer already finished. This causes obexd to report // "GDBus.Error:org.freedesktop.DBus.Error.UnknownObject: Method "xxx" with signature "" on interface "org.bluez.obex.Transfer1" doesn't exist." // // We can ignore any error for suspend/resume when // there is no active transfer. The sync engine will // handle suspending/resuming the processing of the data. SE_LOG_DEBUG(NULL, "ignore error after transfer completed: %s", explanation.c_str()); } else if (freeze && explanation.find("org.bluez.obex.Error.NotInProgress") != explanation.npos) { // Suspending failed because the transfer had not // started yet (still queuing), see // "org.bluez.obex.Transfer1 Suspend/Resume in // queued state" on linux-bluetooth. // Ignore this and retry the Suspend when the transfer // becomes active. SE_LOG_DEBUG(NULL, "must retry Suspend(), got error at the moment: %s", explanation.c_str()); } else { // Have to abort. GDBusCXX::DBusClientCall0(transfer, "Cancel")(); // Bluez does not change the transfer status when cancelling it, // so our propChangedCb() doesn't get called. We need to record // the end of the transfer directly to stop the syncing. Completion completion = Completion::now(); completion.m_transferErrorCode = "cancelled"; completion.m_transferErrorMsg = "transfer cancelled because suspending not possible"; m_transfers[m_currentTransfer] = completion; Exception::tryRethrow(explanation, true); } } } } // Handle setFreeze() before and after we have a running // transfer by setting a flag and checking that flag before // initiating a new transfer. m_frozen = freeze; } void PbapSession::blockOnFreeze() { SuspendFlags &s = SuspendFlags::getSuspendFlags(); while (m_frozen) { s.checkForNormal(); g_main_context_iteration(NULL, true); } } PbapSyncSource::PbapSyncSource(const SyncSourceParams ¶ms) : SyncSource(params) { SyncSourceSession::init(m_operations); m_operations.m_readNextItem = boost::bind(&PbapSyncSource::readNextItem, this, _1, _2, _3); m_operations.m_readItemAsKey = boost::bind(&PbapSyncSource::readItemAsKey, this, _1, _2); m_session = PbapSession::create(*this); const char *PBAPSyncMode = getenv("SYNCEVOLUTION_PBAP_SYNC"); m_PBAPSyncMode = !PBAPSyncMode ? PBAP_SYNC_NORMAL : boost::iequals(PBAPSyncMode, "incremental") ? PBAP_SYNC_INCREMENTAL : boost::iequals(PBAPSyncMode, "text") ? PBAP_SYNC_TEXT : boost::iequals(PBAPSyncMode, "all") ? PBAP_SYNC_NORMAL : (throwError(SE_HERE, StringPrintf("invalid value for SYNCEVOLUTION_PBAP_SYNC: %s", PBAPSyncMode)), PBAP_SYNC_NORMAL); m_isFirstCycle = true; m_hadContacts = false; } PbapSyncSource::~PbapSyncSource() { } void PbapSyncSource::open() { string database = getDatabaseID(); const string prefix("obex-bt://"); if (!boost::starts_with(database, prefix)) { throwError(SE_HERE, "database should specifiy device address (obex-bt://)"); } std::string address = database.substr(prefix.size()); m_session->initSession(address, getDatabaseFormat()); } void PbapSyncSource::beginSync(const std::string &lastToken, const std::string &resumeToken) { if (!lastToken.empty()) { throwError(SE_HERE, STATUS_SLOW_SYNC_508, std::string("PBAP cannot do change detection")); } } std::string PbapSyncSource::endSync(bool success) { m_pullAll.reset(); // Non-empty so that beginSync() can detect non-slow syncs and ask // for one. return "1"; } bool PbapSyncSource::isEmpty() { return false; // We don't know for sure. Doesn't matter, so pretend to not be empty. } void PbapSyncSource::close() { m_session->shutdown(); } void PbapSyncSource::setFreeze(bool freeze) { if (m_session) { m_session->setFreeze(freeze); } if (m_pullAll) { m_pullAll->m_wasSuspended = true; } } PbapSyncSource::Databases PbapSyncSource::getDatabases() { Databases result; result.push_back(Database("select database via bluetooth address", "[obex-bt://]", false, true)); return result; } void PbapSyncSource::enableServerMode() { SE_THROW("PbapSyncSource does not implement server mode."); } bool PbapSyncSource::serverModeEnabled() const { return false; } std::string PbapSyncSource::getPeerMimeType() const { return "text/vcard"; } void PbapSyncSource::getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { // Use vCard 3.0 with minimal conversion by default. std::string type = "raw/text/vcard"; SourceType sourceType = getSourceType(); if (!sourceType.m_format.empty()) { type = sourceType.m_format; } if (type == "raw/text/vcard") { // Raw mode. info.m_native = "vCard30"; info.m_fieldlist = "Raw"; info.m_profile = ""; } else { // Assume that it's something more traditional requiring parsing. info.m_native = "vCard21"; info.m_fieldlist = "contacts"; info.m_profile = "\"vCard\", 1"; } info.m_datatypes = getDataTypeSupport(type, sourceType.m_forceFormat); /** * Access to data must be done early so that a slow sync can be * enforced. */ info.m_earlyStartDataRead = true; } // TODO: return IDs based on GetSize(), read only when engine needs data. sysync::TSyError PbapSyncSource::readNextItem(sysync::ItemID aID, sysync::sInt32 *aStatus, bool aFirst) { if (aFirst) { PullParams params; memset(¶ms, 0, sizeof(params)); params.m_pullData = (m_PBAPSyncMode == PBAP_SYNC_TEXT || (m_PBAPSyncMode == PBAP_SYNC_INCREMENTAL && m_isFirstCycle)) ? PULL_WITHOUT_PHOTOS : PULL_AS_CONFIGURED; const char *env; if ((env = getenv("SYNCEVOLUTION_PBAP_CHUNK_TRANSFER_TIME")) != NULL) { params.m_timePerChunk = atof(env); } else { params.m_timePerChunk = 30; } static const double LAMBDA_DEF = 0.1; if ((env = getenv("SYNCEVOLUTION_PBAP_CHUNK_TIME_LAMBDA")) != NULL) { params.m_timeLambda = atof(env); } else { params.m_timeLambda = LAMBDA_DEF; } if (params.m_timeLambda < 0 || params.m_timeLambda > 1) { params.m_timeLambda = LAMBDA_DEF; } if ((env = getenv("SYNCEVOLUTION_PBAP_CHUNK_MAX_COUNT_PHOTO")) != NULL) { params.m_startMaxCount[true] = atoi(env); } if ((env = getenv("SYNCEVOLUTION_PBAP_CHUNK_MAX_COUNT_NO_PHOTO")) != NULL) { params.m_startMaxCount[false] = atoi(env); } if ((env = getenv("SYNCEVOLUTION_PBAP_CHUNK_OFFSET")) != NULL) { params.m_startOffset = atoi(env); } else { unsigned int seed = (unsigned int)Timespec::system().seconds(); // Clip it such that it is >= 0 and < 0x10000. params.m_startOffset = rand_r(&seed) % 0x10000; } m_pullAll = m_session->startPullAll(params); } if (!m_pullAll) { throwError(SE_HERE, "logic error: readNextItem without aFirst=true before"); } std::string id = m_pullAll->getNextID(); if (id.empty()) { *aStatus = sysync::ReadNextItem_EOF; if (m_PBAPSyncMode == PBAP_SYNC_INCREMENTAL && m_hadContacts && m_isFirstCycle) { requestAnotherSync(); m_isFirstCycle = false; } } else { *aStatus = sysync::ReadNextItem_Unchanged; aID->item = StrAlloc(id.c_str()); aID->parent = NULL; m_hadContacts = true; } return sysync::LOCERR_OK; } sysync::TSyError PbapSyncSource::readItemAsKey(sysync::cItemID aID, sysync::KeyH aItemKey) { if (!m_pullAll) { throwError(SE_HERE, "logic error: readItemAsKey() without preceeding readNextItem()"); } pcrecpp::StringPiece vcard; if (m_pullAll->getContact(aID->item, vcard)) { return getSynthesisAPI()->setValue(aItemKey, "itemdata", vcard.data(), vcard.size()); } else { return sysync::DB_NotFound; } } SyncSourceRaw::InsertItemResult PbapSyncSource::insertItemRaw(const std::string &luid, const std::string &item) { throwError(SE_HERE, "writing via PBAP is not supported"); return InsertItemResult(); } void PbapSyncSource::readItemRaw(const std::string &luid, std::string &item) { if (!m_pullAll) { throwError(SE_HERE, "logic error: readItemRaw() without preceeding readNextItem()"); } pcrecpp::StringPiece vcard; if (m_pullAll->getContact(luid.c_str(), vcard)) { item.assign(vcard.data(), vcard.size()); } else { throwError(SE_HERE, STATUS_NOT_FOUND, string("retrieving item: ") + luid); } } SE_END_CXX #endif /* ENABLE_PBAP */ #ifdef ENABLE_MODULES # include "PbapSyncSourceRegister.cpp" #endif syncevolution-1.5/src/backends/qtcontacts/0000755000373300037200000000000012424707641022427 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/qtcontacts/configure-sub.in0000644000373300001540000000160512326412403025341 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. # BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS ..." SE_ARG_ENABLE_BACKEND(qtcontacts, qtcontacts, [AS_HELP_STRING([--enable-qtcontacts], [enable support for QtMobility's QtContacts storage])], [enable_qtcontacts="$enableval"], [enable_qtcontacts="no"] ) if test "$enable_qtcontacts" = "yes"; then AC_DEFINE(ENABLE_QTCONTACTS, 1, [QtContacts available]) # AC_WITH_QT() will be called in configure-post if need_qt_modules is not empty, # setting QT_* flags. need_qt_modules="$need_qt_modules +gui" # GUI needed for QVersit qt_config="$qt_config +mobility" qt_misc="$qt_misc MOBILITY += contacts versit" fi AC_SUBST(QT_CONTACTS_LIBS) syncevolution-1.5/src/backends/qtcontacts/QtContactsSourceRegister.cpp0000644000373300001540000002047412326412403027723 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "QtContactsSource.h" #include "test.h" #ifdef ENABLE_QTCONTACTS #include #include #include #endif #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe = sourceType.m_backend == "QtContacts"; bool maybeMe = sourceType.m_backend == "addressbook"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/x-vcard" || sourceType.m_format == "text/vcard") { return #ifdef ENABLE_QTCONTACTS true ? new QtContactsSource(params) : #endif isMe ? RegisterSyncSource::InactiveSource(params) : NULL; } } return NULL; } static RegisterSyncSource registerMe("QtContacts", #ifdef ENABLE_QTCONTACTS true, #else false, #endif createSource, "QtContacts = addressbook = contacts = qt-contacts\n" " vCard 3.0 = text/vcard\n" " 'database' is specified via a QtContacts URI, which\n" " consists of qtcontacts::.\n" " Examples: 'qtcontacts:tracker:' or 'qtcontacts:eds:source=local:/system'\n", Values() + (Aliases("QtContacts") + "qt-contacts")); #ifdef ENABLE_QTCONTACTS #ifdef ENABLE_UNIT_TESTS class QtContactsSourceUnitTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(QtContactsSourceUnitTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST(testHandler); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("qtcontacts", "qtcontacts:text/vcard:3.0", true)); source.reset(SyncSource::createTestingSource("qtcontacts", "QtContacts", true)); } void testHandler() { QContact out; QList contacts; QContactDetailFieldDefinition field; QContactDetailDefinition unique; QMap details; unique.setName("Unique"); unique.setUnique(true); field.setDataType(QVariant::Bool); unique.insertField("Bool", field); field.setDataType(QVariant::Int); unique.insertField("Int", field); field.setDataType(QVariant::UInt); unique.insertField("UInt", field); field.setDataType(QVariant::Date); unique.insertField("Date", field); field.setDataType(QVariant::DateTime); unique.insertField("DateTime", field); field.setDataType(QVariant::String); unique.insertField("String", field); field.setDataType(QVariant::ByteArray); unique.insertField("ByteArray", field); details["Unique"] = unique; QContactDetailDefinition multiple; multiple.setName("Multiple"); field.setDataType(QVariant::String); multiple.insertField("String", field); details["Multiple"] = multiple; QContactBirthday birthday; birthday.setDate(QDate(2000, 1, 1)); CPPUNIT_ASSERT(out.saveDetail(&birthday)); QContactEmailAddress email; email.setEmailAddress("john.doe@foo.com"); CPPUNIT_ASSERT(out.saveDetail(&email)); QContactDetail detailUnique("Unique"); detailUnique.setValue("Bool", QVariant(true)); detailUnique.setValue("Int", QVariant(-1)); detailUnique.setValue("UInt", QVariant(4294967295u)); detailUnique.setValue("Date", QVariant(QDate(2011, 12, 1))); detailUnique.setValue("DateTime", QVariant(QDateTime(QDate(2011, 12, 1), QTime(23, 59, 59)))); detailUnique.setValue("String", QVariant(QString("hello world;\nhow are you?"))); detailUnique.setValue("ByteArray", QVariant(QByteArray() + 'a' + 'b' + 'c')); CPPUNIT_ASSERT(out.saveDetail(&detailUnique)); QContactDetail detailMulti1("Multiple"); detailMulti1.setValue("String", QVariant(QString("hello"))); CPPUNIT_ASSERT(out.saveDetail(&detailMulti1)); QContactDetail detailMulti2("Multiple"); detailMulti2.setValue("String", QVariant(QString("world"))); CPPUNIT_ASSERT(out.saveDetail(&detailMulti2)); // empty name because parser otherwise does things like // synthesizing custom and display name, which breaks the // comparison below QContactName name; CPPUNIT_ASSERT(out.saveDetail(&name)); contacts << out; SyncEvoQtContactsHandler handler(details); QVersitContactExporter exporter; exporter.setDetailHandler(&handler); CPPUNIT_ASSERT(exporter.exportContacts(contacts, QVersitDocument::VCard30Type)); QByteArray vcard; QVersitWriter writer(&vcard); CPPUNIT_ASSERT(writer.startWriting(exporter.documents())); writer.waitForFinished(); CPPUNIT_ASSERT(!writer.error()); string item = vcard.constData(); CPPUNIT_ASSERT_EQUAL(string("BEGIN:VCARD\r\n" "VERSION:3.0\r\n" "BDAY:2000-01-01\r\n" "EMAIL:john.doe@foo.com\r\n" "X-SYNCEVO-QTCONTACTS:Unique^Bool^BOOL^1^ByteArray^VARIANT^0000000c0000000003\r\n" " 616263^Date^DATE^2011-12-01^DateTime^DATETIME^2011-12-01T23:59:59^Int^INT^-\r\n" " 1^String^STRING^hello world\\;|0ahow are you?^UInt^UINT^4294967295\r\n" "X-SYNCEVO-QTCONTACTS:Multiple^String^STRING^hello\r\n" "X-SYNCEVO-QTCONTACTS:Multiple^String^STRING^world\r\n" "FN:\r\n" "N:;;;;\r\n" "END:VCARD\r\n"), item); QVersitReader reader(QByteArray(item.c_str())); CPPUNIT_ASSERT(reader.startReading()); reader.waitForFinished(); CPPUNIT_ASSERT(!reader.error()); QVersitContactImporter importer; importer.setPropertyHandler(&handler); CPPUNIT_ASSERT(importer.importDocuments(reader.results())); contacts = importer.contacts(); QContact &in = contacts.first(); QString outString, inString; QDebug(&outString) << out; QDebug(&inString) << in; if (out != in) { // strings are never quite equal due to key, so skip this check // if QContact itself thinks its values are equal CPPUNIT_ASSERT_EQUAL(string(outString.toUtf8().constData()), string(inString.toUtf8().constData())); } } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(QtContactsSourceUnitTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif static class VCard30Test : public RegisterSyncSourceTest { public: VCard30Test() : RegisterSyncSourceTest("qt_contact", "eds_contact") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "qt-contacts:text/vcard"; config.m_testcases = "testcases/qt_contact.vcf"; } } vCard30Test; } #endif // ENABLE_QTCONTACTS SE_END_CXX syncevolution-1.5/src/backends/qtcontacts/qtcontacts.am0000644000373300001540000000245212326412403024744 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/qtcontacts/configure-sub.in src_backends_qtcontacts_lib = src/backends/qtcontacts/syncqtcontacts.la MOSTLYCLEANFILES += $(src_backends_qtcontacts_lib) if ENABLE_MODULES src_backends_qtcontacts_backenddir = $(BACKENDS_DIRECTORY) src_backends_qtcontacts_backend_LTLIBRARIES = $(src_backends_qtcontacts_lib) else noinst_LTLIBRARIES += $(src_backends_qtcontacts_lib) endif src_backends_qtcontacts_syncqtcontacts_la_SOURCES = \ src/backends/qtcontacts/QtContactsSource.h \ src/backends/qtcontacts/QtContactsSource.cpp src_backends_qtcontacts_syncqtcontacts_la_LIBADD = $(QT_CONTACTS_LIBS) $(QT_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_qtcontacts_syncqtcontacts_la_LDFLAGS = -module -avoid-version $(QT_LDFLAGS) src_backends_qtcontacts_syncqtcontacts_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) $(QT_CPPFLAGS) src_backends_qtcontacts_syncqtcontacts_la_DEPENDENCIES = src/syncevo/libsyncevolution.la # Allow Qt to set some compile flags, but not the ones normally set via configure. # In particular -W is not compatible with the SyncEvolution header files (we have # unused parameters in some inline functions). src_backends_qtcontacts_syncqtcontacts_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(filter-out -O2 -g -W -Wall, $(QT_CXXFLAGS)) $(SYNCEVO_WFLAGS) syncevolution-1.5/src/backends/qtcontacts/QtContactsSource.h0000644000373300001540000000435412326412403025662 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_QTCONTACTSSYNCSOURCE #define INCL_QTCONTACTSSYNCSOURCE #include #ifdef ENABLE_QTCONTACTS #include #include #include SE_BEGIN_CXX class QtContactsData; /** * Access contacts stored in QtContacts. * * This class is designed so that no Qt header files are required * to include this header file. */ class QtContactsSource : public TrackingSyncSource, public SyncSourceLogging, private boost::noncopyable { public: QtContactsSource(const SyncSourceParams ¶ms); ~QtContactsSource(); protected: /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual void close(); virtual Databases getDatabases(); virtual std::string getMimeType() const { return "text/vcard"; } virtual std::string getMimeVersion() const { return "3.0"; } /* implementation of TrackingSyncSource interface */ virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &luid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &uid); /* implementation of SyncSourceLogging */ virtual std::string getDescription(const string &luid); private: QtContactsData *m_data; }; SE_END_CXX #endif // ENABLE_QTCONTACTS #endif // INCL_QTCONTACTSSYNCSOURCE syncevolution-1.5/src/backends/qtcontacts/QtContactsSource.cpp0000664000373300001540000005741712330727742026241 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_QTCONTACTS #include "QtContactsSource.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX using namespace QtMobility; /** * This handler represents QContactDetails which have no * mapping to vCard by storing them inside a X-SYNCEVO-QTCONTACTS * property. * * The exact format is: * X-SYNCEVOLUTION-QTCONTACTS:;(;;)* * * = detail name * = field name * = as in backup plugin (BOOL/INT/UINT/DATE/TIME/DATETIME/STRING/VARIANT) * STRING = QString as UTF-8 string, with special characters escaped * as in N * VARIANT = anything else, including byte arrays * * This is similar to the QtMobility 1.1 backup plugin (http://doc.qt.nokia.com/qtmobility-1.1/versitplugins.html). * The main differences are: * - This handler has a 1:1 mapping between QContactDetail and * vCard property; the backup plugin uses one property per QContactDetail * field and groups to combine them. * - Details which have a mapping to vCard are left untouched. * The backup plugin always adds at least the DetailUri. * * The reasons for implementing our own handler is: * - The "restore" part of the backup/restore plugin is completely missing * in QtMobility 1.1 and therefore it is unusable. * - The single property per detail approach is more readable (IMHO, of course). * - Turning a property back into a detail is likely to be easier when all information * is in single property. * - Groups in vCard are unusual and thus more likely to confuse peers. * The extended format used by this handler only relies on the normal X- property * extension. * * The restore from property part of this handler ignores all details * and fields which are not valid for the contact. In other words, it * does not define details. * * Example backup plugin: * G1.UID:{8c0bc9aa-9379-4aec-b8f1-78ba55992076} * G1.X-NOKIA-QCONTACTFIELD;DETAIL=Guid;FIELD=DetailUri:http://www.semanticdesk * top.org/ontologies/2007/03/22/nco#default-contact-me#Guid * G2.N:;Me;;; * G2.X-NOKIA-QCONTACTFIELD;DETAIL=Name;FIELD=DetailUri:http://www.semanticdesk * top.org/ontologies/2007/03/22/nco#default-contact-me#Name * G3.TEL;TYPE=VOICE: * G3.X-NOKIA-QCONTACTFIELD;DETAIL=PhoneNumber;FIELD=DetailUri:urn:uuid:5087e2a * 2-39f4-37a9-757c-ee291294f9e9 * G4.X-NOKIA-QCONTACTFIELD;DETAIL=Pet;FIELD=Name:Rex * G4.X-NOKIA-QCONTACTFIELD;DETAIL=Pet;FIELD=Age;DATATYPE=INT:14 * * Example this handler: * UID:{8c0bc9aa-9379-4aec-b8f1-78ba55992076} * N:;Me;;; * TEL: * X-SYNCEVO-QTCONTACTS:Pet^Name^STRING^Rex^Age^INT^14 * * The somewhat strange ^ separator is necessary because custom properties cannot * be of compound type in QVersit (http://bugreports.qt.nokia.com/browse/QTMOBILITY-1298). */ class SyncEvoQtContactsHandler : public QVersitContactImporterPropertyHandlerV2, public QVersitContactExporterDetailHandlerV2 { const QMap m_details; public: /** * @param details definition of all details that are valid for a contact (only relevant for parsing vCard) */ SyncEvoQtContactsHandler(const QMap &details = QMap()) : m_details(details) {} virtual void contactProcessed(const QContact &contact, QVersitDocument *document ) {} virtual void detailProcessed( const QContact &contact, const QContactDetail &detail, const QVersitDocument &document, QSet *processedFields, QList *toBeRemoved, QList *toBeAdded) { // ignore details if // - already encoded (assumed to do a good enough job) // - read-only = synthesized (we would not be able to write it back anyway) // - the default "Type = Contact" // - empty detail (empty QContactName otherwise would be encoded) if (!toBeAdded->empty() || (detail.accessConstraints() & QContactDetail::ReadOnly) || (detail.definitionName() == "Type" && contact.type() == "Contact") || detail.isEmpty()) { return; } QStringList content; content << detail.definitionName(); // QVariantMap fields = detail.variantValues(); for (QVariantMap::const_iterator entry = fields.begin(); entry != fields.end(); ++entry) { const QString &fieldName = entry.key(); const QVariant &value = entry.value(); content << fieldName; // if (value.type() == QVariant::String) { content << "STRING" << value.toString().toUtf8(); } else if (value.type() == QVariant::Bool) { content << "BOOL" << (value.toBool() ? "1" : "0"); } else if (value.type() == QVariant::Int) { content << "INT" << QString::number(value.toInt()); } else if (value.type() == QVariant::UInt) { content << "UINT" << QString::number(value.toUInt()); } else if (value.type() == QVariant::Date) { content << "DATE" << value.toDate().toString(Qt::ISODate); } else if (value.type() == QVariant::DateTime) { content << "DATETIME" << value.toDateTime().toString(Qt::ISODate); } else { QByteArray valueBytes; QDataStream stream(&valueBytes, QIODevice::WriteOnly); stream << value; content << "VARIANT" << valueBytes.toHex().constData(); } *processedFields << fieldName; } // Using QVersitProperty::CompoundType and the string list // as-is would be nice, but isn't supported by QtMobility 1.2.0 beta // because QVersitReader will not know that the property is // of compound type and will replace \; with ; without splitting // into individual strings first. See http://bugreports.qt.nokia.com/browse/QTMOBILITY-1298 // // Workaround: replace ^ inside strings with | and then use ^ as separator // These characters were chosen because they are not special in vCard and thus // require no further escaping. QVersitProperty prop; prop.setName("X-SYNCEVO-QTCONTACTS"); #ifdef USE_QVERSIT_COMPOUND prop.setValueType(QVersitProperty::CompoundType); prop.setValue(QVariant(content)); #else StringEscape escape('|', "^"); std::list strings; BOOST_FOREACH(const QString &str, content) { strings.push_back(escape.escape(string(str.toUtf8().constData()))); } prop.setValue(QVariant(QString::fromUtf8(boost::join(strings, "^").c_str()))); #endif *toBeAdded << prop; } virtual void documentProcessed(const QVersitDocument &document, QContact *contact) {} virtual void propertyProcessed( const QVersitDocument &document, const QVersitProperty &property, const QContact &contact, bool *alreadyProcessed, QList *updatedDetails) { if (*alreadyProcessed || property.name() != "X-SYNCEVO-QTCONTACTS") { // not something that we need to parse return; } *alreadyProcessed = true; #ifdef USE_QVERSIT_COMPOUND QStringList content = property.value(); #else QStringList content; StringEscape escape('|', "^"); typedef boost::split_iterator string_split_iterator; string valueString = property.value().toUtf8().constData(); string_split_iterator it = boost::make_split_iterator(valueString, boost::first_finder("^", boost::is_iequal())); while (it != string_split_iterator()) { content << QString::fromUtf8(escape.unescape(std::string(it->begin(), it->end())).c_str()); ++it; } #endif // detail name available? if (content.size() > 0) { const QString &detailName = content[0]; QMap::const_iterator it = m_details.constFind(detailName); // detail still exists? if (it != m_details.constEnd()) { const QContactDetailDefinition &definition = *it; // now decode all fields and copy into new detail QContactDetail detail(content[0]); int i = 1; while (i + 2 < content.size()) { const QString &fieldName = content[i++]; const QString &type = content[i++]; const QString &valueString = content[i++]; QVariant value; if (type == "STRING") { value.setValue(valueString); } else if (type == "BOOL") { value.setValue(valueString == "1"); } else if (type == "INT") { value.setValue(valueString.toInt()); } else if (type == "UINT") { value.setValue(valueString.toUInt()); } else if (type == "DATE") { value.setValue(QDate::fromString(valueString, Qt::ISODate)); } else if (type == "DATETIME") { value.setValue(QDateTime::fromString(valueString, Qt::ISODate)); } else if (type == "VARIANT") { QByteArray valueBytes = QByteArray::fromHex(valueString.toAscii()); QDataStream stream(&valueBytes, QIODevice::ReadOnly); stream >> value; } else { // unknown type, skip it continue; } // skip fields which are (no longer) valid, have wrong type or wrong value QMap fields = definition.fields(); QMap::const_iterator it2 = fields.constFind(fieldName); if (it2 != fields.constEnd()) { if (it2->dataType() == value.type()) { QVariantList allowed = it2->allowableValues(); if (allowed.empty() || allowed.indexOf(value) != -1) { // add field detail.setValue(fieldName, value); } } } } // update contact with the new detail *updatedDetails << detail; } } } }; class QtContactsData { QtContactsSource *m_parent; QString m_managerURI; cxxptr m_manager; public: QtContactsData(QtContactsSource *parent, const QString &managerURI) : m_parent(parent), m_managerURI(managerURI) { if (!qApp) { static const char *argv[] = { "SyncEvolution" }; static int argc = 1; new QCoreApplication(argc, (char **)argv); } } static QList createContactList(const string &uid) { QList list; list.append(atoi(uid.c_str())); return list; } static QContactLocalIdFilter createFilter(const string &uid) { QContactLocalIdFilter filter; filter.setIds(createContactList(uid)); return filter; } static string getLUID(const QContact &contact) { QContactLocalId id = contact.localId(); return StringPrintf("%u", id); } static string getRev(const QContact &contact) { QContactTimestamp rev = contact.detail(); QDateTime stamp = rev.lastModified(); if (!stamp.isValid()) { stamp = rev.created(); } return stamp.toString().toLocal8Bit().constData(); } template void checkError(const char *op, T &req) { if (req.error()) { m_parent->throwError(SE_HERE, StringPrintf("%s: failed with error %d", op, req.error())); } } template void checkError(const char *op, T &req, const QMap &errors) { if (errors.isEmpty()) { checkError(op, req); } else { list res; foreach (int index, errors.keys()) { res.push_back(StringPrintf("entry #%d failed with error %d", index, errors[index])); } m_parent->throwError(SE_HERE, StringPrintf("%s: failed with error %d, ", op, req.error()) + boost::join(res, ", ")); } } friend class QtContactsSource; }; QtContactsSource::QtContactsSource(const SyncSourceParams ¶ms) : TrackingSyncSource(params) { m_data = NULL; SyncSourceLogging::init(InitList("N_FIRST") + "N_MIDDLE" + "N_LAST", " ", m_operations); } QtContactsSource::~QtContactsSource() { delete m_data; } void QtContactsSource::open() { QString buffer; QDebug(&buffer) << "available managers (default one first): " << QContactManager::availableManagers(); SE_LOG_DEBUG(NULL, buffer.toUtf8().data()); string id = getDatabaseID(); m_data = new QtContactsData(this, id.c_str()); cxxptr manager(QContactManager::fromUri(m_data->m_managerURI), "QTContactManager"); if (manager->error()) { throwError(SE_HERE, StringPrintf("failed to open QtContact database %s, error code %d", m_data->m_managerURI.toLocal8Bit().constData(), manager->error())); } buffer = ""; QDebug(&buffer) << manager->managerUri() << " manager supports contact types: " << manager->supportedContactTypes() << " and data types: " << manager->supportedDataTypes(); SE_LOG_DEBUG(NULL, buffer.toUtf8().data()); m_data->m_manager = manager; } bool QtContactsSource::isEmpty() { return false; } void QtContactsSource::close() { m_data->m_manager.set(0); } QtContactsSource::Databases QtContactsSource::getDatabases() { Databases result; QStringList availableManagers = QContactManager::availableManagers(); bool isDefault = true; #if 0 result.push_back(Database("select database via QtContacts Manager URL", "qtcontacts:tracker:")); #endif foreach (QString manager, availableManagers) { QMap params; QString uri = QContactManager::buildUri(manager, params); result.push_back(Database(manager.toStdString(), uri.toStdString(), isDefault)); isDefault = false; } return result; } void QtContactsSource::listAllItems(RevisionMap_t &revisions) { #ifdef ENABLE_MAEMO QContactLocalId self_id = m_data->m_manager->selfContactId(); #endif QContactFetchRequest fetch; fetch.setManager(m_data->m_manager.get()); #ifdef ENABLE_MAEMO // only sync contacts from addressbook, not from Telepathy or wherever QContactDetailFilter filter; filter.setDetailDefinitionName(QContactSyncTarget::DefinitionName, QContactSyncTarget::FieldSyncTarget); filter.setValue("addressbook"); filter.setMatchFlags(QContactFilter::MatchExactly); fetch.setFilter(filter); #endif // only need ID and time stamps QContactFetchHint hint; hint.setOptimizationHints(QContactFetchHint::OptimizationHints(QContactFetchHint::NoRelationships|QContactFetchHint::NoBinaryBlobs)); hint.setDetailDefinitionsHint(QStringList() << QContactTimestamp::DefinitionName); fetch.setFetchHint(hint); fetch.start(); fetch.waitForFinished(); m_data->checkError("read all items", fetch); foreach (const QContact &contact, fetch.contacts()) { #ifdef ENABLE_MAEMO if (contact.localId() == self_id) { // Do not synchronize "self" contact continue; } #endif string revision = QtContactsData::getRev(contact); string luid = QtContactsData::getLUID(contact); if (luid == "2147483647" && revision == "") { // Seems to be a special, artifical contact that always // exists. Ignore it. // // Also note that qtcontacts-tracker and/or QtContacts // spew out a warning on stdout about it (?): // skipping contact with unsupported IRI: "http://www.semanticdesktop.org/ontologies/2007/03/22/nco#default-contact-emergency" continue; } revisions[luid] = revision; } } void QtContactsSource::readItem(const string &uid, std::string &item, bool raw) { QContactFetchRequest fetch; fetch.setManager(m_data->m_manager.get()); fetch.setFilter(QtContactsData::createFilter(uid)); fetch.start(); fetch.waitForFinished(); QList contacts = fetch.contacts(); for (int i = 0; i < contacts.size(); ++i) { QContact &contact = contacts[i]; const QContactAvatar avatar = contact.detail(QContactAvatar::DefinitionName); const QContactThumbnail thumb = contact.detail(QContactThumbnail::DefinitionName); if (!avatar.isEmpty() && thumb.isEmpty()) { QImage image(avatar.imageUrl().path()); QContactThumbnail thumbnail; thumbnail.setThumbnail(image); contact.saveDetail(&thumbnail); } // foreach (const QContactSyncTarget &target, contact.details()) { // std::cout << " Sync Target: " << target.syncTarget().toUtf8().data() << std::endl; // } } QStringList profiles; #ifdef USE_PROFILE_BACKUP_RAW_FORMAT if (raw) { profiles << QVersitContactHandlerFactory::ProfileBackup; } #endif SyncEvoQtContactsHandler handler; QVersitContactExporter exporter(profiles); exporter.setDetailHandler(&handler); if (!exporter.exportContacts(contacts, QVersitDocument::VCard30Type)) { throwError(SE_HERE, uid + ": encoding as vCard 3.0 failed"); } QByteArray vcard; QVersitWriter writer(&vcard); if (!writer.startWriting(exporter.documents())) { throwError(SE_HERE, uid + ": writing as vCard 3.0 failed"); } writer.waitForFinished(); item = vcard.constData(); m_data->checkError("encoding as vCard 3.0", writer); } TrackingSyncSource::InsertItemResult QtContactsSource::insertItem(const string &uid, const std::string &item, bool raw) { QVersitReader reader(QByteArray(item.c_str())); if (!reader.startReading()) { throwError(SE_HERE, "reading vCard failed"); } reader.waitForFinished(); m_data->checkError("decoding vCard", reader); QStringList profiles; #ifdef USE_PROFILE_BACKUP_RAW_FORMAT if (raw) { profiles << QVersitContactHandlerFactory::ProfileBackup; } #endif SyncEvoQtContactsHandler handler(m_data->m_manager->detailDefinitions()); QVersitContactImporter importer(profiles); importer.setPropertyHandler(&handler); if (!importer.importDocuments(reader.results())) { throwError(SE_HERE, "importing vCard failed"); } QList contacts = importer.contacts(); QContact &contact = contacts.first(); if (!uid.empty()) { QContactId id; id.setManagerUri(m_data->m_managerURI); id.setLocalId(atoi(uid.c_str())); contact.setId(id); } QContactSaveRequest save; save.setManager(m_data->m_manager.get()); save.setContacts(QList() << contact); save.start(); save.waitForFinished(); m_data->checkError("saving contact", save, save.errorMap()); QList savedContacts = save.contacts(); QContact &savedContact = savedContacts.first(); // Saving is not guaranteed to update the time stamp (BMC #5710). // Need to read again. QContactFetchRequest fetch; fetch.setManager(m_data->m_manager.get()); fetch.setFilter(QtContactsData::createFilter(QtContactsData::getLUID(savedContact))); QContactFetchHint hint; hint.setOptimizationHints(QContactFetchHint::OptimizationHints(QContactFetchHint::NoRelationships|QContactFetchHint::NoBinaryBlobs)); hint.setDetailDefinitionsHint(QStringList() << QContactTimestamp::DefinitionName); fetch.setFetchHint(hint); fetch.start(); fetch.waitForFinished(); QContact &finalContact = fetch.contacts().first(); return InsertItemResult(QtContactsData::getLUID(savedContact), QtContactsData::getRev(finalContact), ITEM_OKAY); } void QtContactsSource::removeItem(const string &uid) { #if 1 QContactRemoveRequest remove; remove.setManager(m_data->m_manager.get()); remove.setContactIds(QtContactsData::createContactList(uid)); remove.start(); remove.waitForFinished(); m_data->checkError("remove contact", remove, remove.errorMap()); #else m_data->m_manager->removeContact(atoi(uid.c_str())); #endif } std::string QtContactsSource::getDescription(const string &luid) { try { QContactFetchRequest fetch; fetch.setManager(m_data->m_manager.get()); fetch.setFilter(QtContactsData::createFilter(luid)); fetch.start(); fetch.waitForFinished(); if (fetch.contacts().isEmpty()) { return ""; } QContact contact = fetch.contacts().first(); string descr = contact.displayLabel().toLocal8Bit().constData(); return descr; } catch (...) { // Instead of failing we log the error and ask // the caller to log the UID. That way transient // errors or errors in the logging code don't // prevent syncs. handleException(); return ""; } } SE_END_CXX #endif /* ENABLE_QTCONTACTS */ #ifdef ENABLE_MODULES # include "QtContactsSourceRegister.cpp" #endif syncevolution-1.5/src/backends/signon/0000755000373300037200000000000012424707641021541 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/signon/accounts/0000755000373300037200000000000012424707641023360 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/signon/accounts/caldav.service-type0000644000373300001540000000026412326412403026765 0ustar00nightlynightly00000000000000 CalDAV Integrate your events, tasks, memos via CalDAV syncevolution-1.5/src/backends/signon/accounts/carddav.service-type0000644000373300001540000000025312326412403027135 0ustar00nightlynightly00000000000000 CardDAV Integrate your contacts via CardDAV syncevolution-1.5/src/backends/signon/accounts/google-caldav.service.in0000644000373300001540000000161612326412403027667 0ustar00nightlynightly00000000000000 contacts Google Contacts google syncevolution-1.5/src/backends/signon/accounts/google-carddav.service.in0000644000373300001540000000161712326412403030042 0ustar00nightlynightly00000000000000 contacts Google Contacts google syncevolution-1.5/src/backends/signon/accounts/google.provider.in0000664000373300001540000000241112337651013026631 0ustar00nightlynightly00000000000000 Google Contacts syncevolution-1.5/src/backends/signon/configure-sub.in0000664000373300001540000001415212337651013024462 0ustar00nightlynightly00000000000000PKG_CHECK_MODULES(GSSO, [libgsignon-glib >= 2.0], HAVE_GSSO=yes, HAVE_GSSO=no) PKG_CHECK_MODULES(UOA, [libsignon-glib >= 1.7], HAVE_UOA=yes, HAVE_UOA=no) PKG_CHECK_MODULES(ACCOUNTS, [libaccounts-glib >= 1.8], HAVE_ACCOUNTS=yes, HAVE_ACCOUNTS=no) def_gsso="no" def_uoa="no" def_signon="no" if test "$HAVE_GSSO" = "yes" && test "$HAVE_ACCOUNTS" = "yes"; then def_gsso="yes" fi if test "$HAVE_UOA" = "yes" && test "$HAVE_ACCOUNTS" = "yes"; then def_uoa="yes" fi if test "$HAVE_GSSO" = "yes"; then DEFAULT_SIGNON="GSSO" def_signon="yes" elif test "$HAVE_UOA" = "yes"; then DEFAULT_SIGNON="UOA" def_signon="yes" fi AC_SUBST(DEFAULT_SIGNON) # The backends could be compiled independently. However, the XML example files # for accounts only get created once and the backends require conflicting values # in them. # # Also, when compiling without dynamic module loading, signonRegister.cpp will # only be compiled once and thus can activate only one of the actual signon # implementations. AC_ARG_ENABLE(gsso, AS_HELP_STRING([--enable-gsso], [enables or disables support for the gSSO + Accounts single-sign-on system; default is on if development files are available]), [enable_gsso="$enableval" test "$enable_gsso" = "yes" || test "$enable_gsso" = "no" || AC_MSG_ERROR([invalid value for --enable-gsso: $enable_gsso]) test "$enable_gsso" = "no" || (test "$HAVE_GSSO" = "yes" && test "$HAVE_ACCOUNTS" = "yes" ) || AC_MSG_ERROR([required pkg(s) not found that are needed for --enable-gsso])], enable_gsso="$def_gsso") if test $enable_gsso = "yes"; then # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/signon/providergsso.la" GOOGLE_METHOD="oauth" GOOGLE_MECHANISM="oauth2" AC_SUBST(GOOGLE_METHOD) AC_SUBST(GOOGLE_MECHANISM) if test "$enable_static" = "yes"; then AC_DEFINE(STATIC_GSSO, 1, [activate gsso]) fi fi # conditional compilation in make AM_CONDITIONAL([USE_GSSO], [test "$enable_gsso" = "yes"]) AC_ARG_ENABLE(uoa, AS_HELP_STRING([--enable-uoa], [enables or disables support for the UOA single-sign-on system; default is on if development files are available]), [enable_uoa="$enableval" test "$enable_uoa" = "yes" || test "$enable_uoa" = "no" || AC_MSG_ERROR([invalid value for --enable-uoa: $enable_uoa]) test "$enable_uoa" = "no" || (test "$HAVE_UOA" = "yes" && test "$HAVE_ACCOUNTS" = "yes" ) || AC_MSG_ERROR([required pkg(s) not found that are needed for --enable-uoa])], enable_uoa="$def_uoa") if test $enable_uoa = "yes"; then # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/signon/provideruoa.la" GOOGLE_METHOD="oauth2" GOOGLE_MECHANISM="web_server" AC_SUBST(GOOGLE_METHOD) AC_SUBST(GOOGLE_MECHANISM) if test "$enable_static" = "yes"; then AC_DEFINE(STATIC_UOA, 1, [activate gsso]) fi fi # conditional compilation in make AM_CONDITIONAL([USE_UOA], [test "$enable_uoa" = "yes"]) AC_ARG_ENABLE(signon, AS_HELP_STRING([--enable-sign], [enables or disables support for the UOA or gSSO single-sign-on system without Accounts; default is on if development files are available]), [enable_signon="$enableval" test "$enable_signon" = "yes" || test "$enable_signon" = "no" || AC_MSG_ERROR([invalid value for --enable-signon: $enable_signon]) test "$enable_signon" = "no" || test "$HAVE_UOA" = "yes" || test "$HAVE_GSSO" = "yes" || AC_MSG_ERROR([required pkg(s) not found that are needed for --enable-signon])], enable_signon="$def_signon") if test $enable_signon = "yes"; then # link into static executables, similar to a SyncSource SYNCSOURCES="$SYNCSOURCES src/backends/signon/providersignon.la" AC_SUBST(GOOGLE_METHOD) AC_SUBST(GOOGLE_MECHANISM) if test "$enable_static" = "yes"; then AC_DEFINE(STATIC_SIGNON, 1, [activate gsso]) fi fi # conditional compilation in make AM_CONDITIONAL([USE_SIGNON], [test "$enable_signon" = "yes"]) AC_ARG_WITH([google-client-id], AS_HELP_STRING([--with-google-client-id=...], [OAuth2 client ID for google.provider]), [GOOGLE_CLIENT_ID=$withval], [GOOGLE_CLIENT_ID=insert-your-client-id-here]) AC_ARG_WITH([google-client-secret], AS_HELP_STRING([--with-google-client-secret=...], [OAuth2 client secret for google.provider]), [GOOGLE_CLIENT_SECRET=$withval], [GOOGLE_CLIENT_SECRET=insert-your-client-secret-here]) AC_SUBST(GOOGLE_CLIENT_ID) AC_SUBST(GOOGLE_CLIENT_SECRET) AC_ARG_WITH([google-client-id-caldav], AS_HELP_STRING([--with-google-client-id-caldav=...], [OAuth2 client ID for google-caldav.service]), [GOOGLE_CLIENT_ID_CALDAV=$withval], [GOOGLE_CLIENT_ID_CALDAV=insert-your-client-id-here]) AC_ARG_WITH([google-client-secret-caldav], AS_HELP_STRING([--with-google-client-secret-caldav=...], [OAuth2 client secret for google-caldav.service]), [GOOGLE_CLIENT_SECRET_CALDAV=$withval], [GOOGLE_CLIENT_SECRET_CALDAV=insert-your-client-secret-here]) AC_SUBST(GOOGLE_CLIENT_ID_CALDAV) AC_SUBST(GOOGLE_CLIENT_SECRET_CALDAV) AC_ARG_WITH([google-client-id-carddav], AS_HELP_STRING([--with-google-client-id-carddav=...], [OAuth2 client ID for google-carddav.service]), [GOOGLE_CLIENT_ID_CARDDAV=$withval], [GOOGLE_CLIENT_ID_CARDDAV=insert-your-client-id-here]) AC_ARG_WITH([google-client-secret-carddav], AS_HELP_STRING([--with-google-client-secret-carddav=...], [OAuth2 client secret for google-carddav.service]), [GOOGLE_CLIENT_SECRET_CARDDAV=$withval], [GOOGLE_CLIENT_SECRET_CARDDAV=insert-your-client-secret-here]) AC_SUBST(GOOGLE_CLIENT_ID_CARDDAV) AC_SUBST(GOOGLE_CLIENT_SECRET_CARDDAV) AC_CONFIG_FILES([ src/backends/signon/accounts/google-caldav.service src/backends/signon/accounts/google-carddav.service src/backends/signon/accounts/google.provider ]) syncevolution-1.5/src/backends/signon/README0000664000373300001540000001201612337651013022237 0ustar00nightlynightly00000000000000Google CalDAV/CardDAV via OAuth2 ================================ Setup with gSSO and Accounts ---------------------------- SyncEvolution needs an active account for Google. Services for CardDAV and CalDAV can be used, but are not required if the provider was already configured to ask for CardDAV and CalDAV access. SyncEvolution source code ships with example .provider, .service, and .service-type files in the src/backends/signon/accounts directory. These files work with gSSO and (when compiled for that instead ) with UOA. When compiling, it is possible to insert valid client ID+secret into these files using the --with-google-client-* configure options. The example files then get installed into $docdir/accounts/[providers|services|service_types]. SyncEvolution binaries from syncevolution.org are compiled with valid client ID+secret. Distributions are encouraged to *not* reuse the same credentials and register themselves with Google instead. That way, abuse of the credentials affects less users and the quota available to all users of the same credentials does not get exhausted as quickly. Users of the syncevolution.org binaries need to install the /usr/share/doc/syncevolution/accounts themselves, typically in their home directory: cp -a /usr/share/doc/syncevolution/accounts ~/.local/share/accounts A "google" account needs to be created and enabled: ag-tool create-account google google-for-syncevolution ID=`ag-tool list-accounts | grep google-for-syncevolution | sed -e 's/ .*//'` ag-tool enable-account $ID Optionally, one can also enable the services: ag-tool enable-service $ID google-carddav ag-tool enable-service $ID google-caldav It is not possible to create signond identities via command line tools. SyncEvolution will create those automatically and store them for the provider so that it can be reused in future operations. Setup with gSSO and without Accounts ==================================== An identity must be created once: $ gsso-example --create-identity=google-for-syncevolution --identity-method=oauth --identity-realms=google.com Identity stored with id 3 $ ID=3 On normal Linux desktops, access control is based on executable file paths. On such a system grant SyncEvolution access to the new identity with: $ gsso-example --add-context=$ID --system-context=/syncevolution --application-context= $ gsso-example --add-context=$ID --system-context=/libexec/syncevo-dbus-server --application-context= $ gsso-example --add-context=$ID --system-context=/libexec/syncevo-dbus-helper --application-context= $ gsso-example --add-context=$ID --system-context=/libexec/syncevo-local-sync --application-context= On Tizen, set a Smack label: --system-context=User --application-context= Then use "username=signon: {'identity': , 'method': <'oauth'>, 'mechanism': <'oauth2'>, 'session': <{'TokenHost': <'accounts.google.com'>, 'ForceClientAuthViaRequestBody': , 'Scope': <'email https://www.googleapis.com/auth/carddav'>, 'UiPolicy': , 'ClientId': <'73652887053-2ciia00v5fseed7s0sudggdu3oaoo2re.apps.googleusercontent.com'>, 'AuthPath': <'/o/oauth2/auth'>, 'ResponseType': <'code'>, 'AuthHost': <'accounts.google.com'>, 'ClientSecret': <'2YDYzyI6HWSJFd5dOqz0uZGj'>, 'Realms': <['google.com']>, 'RedirectUri': <'http://localhost'>, 'TokenPath': <'/o/oauth2/token'>}> }" in the commands below. This is the information that SyncEvolution would normally find in the accounts system. Usage ----- OAuth2 authentication with gSSO is enabled by setting username or databaseUser to a string of the format gsso:[,] When used without service name, SyncEvolution will ask for access to CalDAV and CardDAV only once. When used with service name, it will ask for access to only CalDAV or CardDAV, but it will have to ask twice (once for each service). The base URL for each service currently needs to be given via syncURL: syncevolution --print-databases \ backend=carddav \ username=gsso:$ID,google-carddav \ syncURL=https://www.googleapis.com/.well-known/carddav src/syncevolution --print-databases \ backend=caldav \ username=gsso:$ID,google-caldav \ syncURL=https://apidata.googleusercontent.com/caldav/v2 Once that works, follow the "CalDAV and CardDAV" instructions from the README with the different username and syncURL. Debugging --------- Add --daemon=no to the command line to prevent shifting the actual command executing into syncevo-dbus-server and (from there) syncevo-dbus-helper. Warning: gsignond limits access to the identity to the executable which created it. One has to use different accounts for syncevolution with and without --daemon=no and another account when using valgrind. Set SYNCEVOLUTION_DEBUG=1 to see all debug messages and increase the loglevel to see HTTP requests: SYNCEVOLUTION_DEBUG=1 syncevolution --daemon=no \ loglevel=4 \ --print-databases \ ... syncevolution-1.5/src/backends/signon/signonRegister.cpp0000664000373300001540000000725612424466461025107 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include "signon.h" #include #include SE_BEGIN_CXX #if defined(USE_GSSO) || defined(USE_UOA) || defined(USE_SIGNON) || defined(STATIC_GSSO) || defined(STATIC_UOA) || defined(STATIC_SIGNON) static class SignonProvider : public IdentityProvider { public: SignonProvider() : // This uses "gsso" at the moment. The advantage of that is that if // gSSO and UOA were installed in parallel, the user could choose which // one to use. If it turns out that the two will never be installed at the // same time, then this perhaps should be "signon" instead, which then would // pick either a gSSO or UAO backend depending on which is available. #if defined(USE_ACCOUNTS) && defined(USE_GSSO) || defined(STATIC_GSSO) IdentityProvider("gsso", "gsso:[,]\n" " Authentication using libgsignond + libaccounts,\n" " using an account created and managed with libaccounts.\n" " The service name is optional. If not given, the\n" " settings from the account will be used.") #elif defined(USE_ACCOUNTS) && defined(USE_UOA) || defined(STATIC_UOA) IdentityProvider("uoa", "uoa:[,]\n" " Authentication using libsignon + libaccounts,\n" " using an account created and managed with libaccounts.\n" " The service name is optional. If not given, the\n" " settings from the account will be used.") #elif defined(USE_SIGNON) || defined(STATIC_SIGNON) IdentityProvider("signon", "signon:]\n" " Authentication using libgsignond with an identity created\n" " before calling SyncEvolution. The string is a\n" " GVariant text dump suitable for g_variant_parse() (see\n" " https://developer.gnome.org/glib/stable/gvariant-text.html).\n" " It must contain a hash with keys 'identity', 'method', \n" " 'session' and 'mechanism'. The first two values are used for\n" " signon_identity_create_session(), the last one for\n" " signon_auth_session_process_async().\n") #endif {} virtual boost::shared_ptr create(const InitStateString &username, const InitStateString &password) { boost::shared_ptr provider; provider = createSignonAuthProvider(username, password); return provider; } } gsso; #endif // one signon-based provider enabled SE_END_CXX syncevolution-1.5/src/backends/signon/signon.am0000664000373300001540000000752012337651013023177 0ustar00nightlynightly00000000000000dist_noinst_DATA += src/backends/signon/configure-sub.in \ src/backends/signon/README \ $(NONE) # Distribute the .in file, install the generated one. accounts_servicesdir = $(docdir)/accounts/services nodist_accounts_services_DATA = \ src/backends/signon/accounts/google-caldav.service \ src/backends/signon/accounts/google-carddav.service \ $(NONE) dist_noinst_DATA += $(nodist_accounts_services_DATA:%:%.in) # Distribute the .in file, install the generated one. accounts_providersdir = $(docdir)/accounts/providers nodist_accounts_providers_DATA = \ src/backends/signon/accounts/google.provider \ $(NONE) dist_noinst_DATA += $(nodist_accounts_providers_DATA:%:%.in) # Distribute and install the same file. accounts_service_typesdir = $(docdir)/accounts/service_types dist_accounts_service_types_DATA = \ src/backends/signon/accounts/caldav.service-type \ src/backends/signon/accounts/carddav.service-type \ $(NONE) src_backends_signon_libs = if USE_GSSO src_backends_signon_libs += src/backends/signon/providergsso.la endif if USE_UOA src_backends_signon_libs += src/backends/signon/provideruoa.la endif if USE_SIGNON src_backends_signon_libs += src/backends/signon/providersignon.la endif MOSTLYCLEANFILES += $(src_backends_signon_libs) src_backends_signon_common_sources = \ src/backends/signon/signon.h \ src/backends/signon/signon.cpp \ $(NONE) if ENABLE_MODULES src_backends_signon_backenddir = $(BACKENDS_DIRECTORY) src_backends_signon_backend_LTLIBRARIES = $(src_backends_signon_libs) src_backends_signon_common_sources += \ src/backends/signon/signonRegister.cpp else noinst_LTLIBRARIES += $(src_backends_signon_libs) endif src_backends_signon_common_libadd = $(SYNCEVOLUTION_LIBS) src_backends_signon_common_ldflags = -module -avoid-version src_backends_signon_common_cxxflags = $(SYNCEVOLUTION_CFLAGS) src_backends_signon_common_cppflags = -DUSE_SIGNON -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_signon_common_dependencies = src/syncevo/libsyncevolution.la if USE_GSSO src_backends_signon_providergsso_la_SOURCES = $(src_backends_signon_common_sources) src_backends_signon_providergsso_la_LIBADD = $(GSSO_LIBS) $(ACCOUNTS_LIBS) $(src_backends_signon_common_libadd) src_backends_signon_providergsso_la_LDFLAGS = $(src_backends_signon_common_ldflags) src_backends_signon_providergsso_la_CXXFLAGS = $(GSSO_CFLAGS) $(ACCOUNTS_CFLAGS) $(src_backends_signon_common_cxxflags) src_backends_signon_providergsso_la_CPPFLAGS = -DUSE_GSSO -DUSE_ACCOUNTS $(src_backends_signon_common_cppflags) src_backends_signon_providergsso_la_DEPENDENCIES = $(src_backends_signon_common_dependencies) endif if USE_UOA src_backends_signon_provideruoa_la_SOURCES = $(src_backends_signon_common_sources) src_backends_signon_provideruoa_la_LIBADD = $(UOA_LIBS) $(ACCOUNTS_LIBS) $(src_backends_signon_common_libadd) src_backends_signon_provideruoa_la_LDFLAGS = $(src_backends_signon_common_ldflags) src_backends_signon_provideruoa_la_CXXFLAGS = $(UOA_CFLAGS) $(ACCOUNTS_CFLAGS) $(src_backends_signon_common_cxxflags) src_backends_signon_provideruoa_la_CPPFLAGS = -DUSE_UOA -DUSE_ACCOUNTS $(src_backends_signon_common_cppflags) src_backends_signon_provideruoa_la_DEPENDENCIES = $(src_backends_signon_common_dependencies) endif if USE_SIGNON src_backends_signon_providersignon_la_SOURCES = $(src_backends_signon_common_sources) src_backends_signon_providersignon_la_LIBADD = $($(DEFAULT_SIGNON)_LIBS) $(ACCOUNTS_LIBS) $(src_backends_signon_common_libadd) src_backends_signon_providersignon_la_LDFLAGS = $(src_backends_signon_common_ldflags) src_backends_signon_providersignon_la_CXXFLAGS = $($(DEFAULT_SIGNON)_CFLAGS) $(ACCOUNTS_CFLAGS) $(src_backends_signon_common_cxxflags) src_backends_signon_providersignon_la_CPPFLAGS = -DUSE_$(DEFAULT_SIGNON) $(src_backends_signon_common_cppflags) src_backends_signon_providersignon_la_DEPENDENCIES = $(src_backends_signon_common_dependencies) endif syncevolution-1.5/src/backends/signon/signon.h0000644000373300001540000000227512326412403023025 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_SIGNON_AUTH_PROVIDER # define INCL_SYNC_EVOLUTION_SIGNON_AUTH_PROVIDER #include #include #include SE_BEGIN_CXX class AuthProvider; boost::shared_ptr createSignonAuthProvider(const InitStateString &username, const InitStateString &password); SE_END_CXX #endif syncevolution-1.5/src/backends/signon/signon.cpp0000664000373300001540000003400112424700450023353 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #ifdef USE_SIGNON #ifdef USE_GSSO #include "libgsignon-glib/signon-auth-service.h" #include "libgsignon-glib/signon-identity.h" #elif defined USE_UOA #include "libsignon-glib/signon-auth-service.h" #include "libsignon-glib/signon-identity.h" #endif // USE_GSSO #ifdef USE_ACCOUNTS #include "libaccounts-glib/ag-account.h" #include "libaccounts-glib/ag-account-service.h" #include #include #include #endif #include #include #include #include SE_GOBJECT_TYPE(SignonAuthService) SE_GOBJECT_TYPE(SignonAuthSession) SE_GOBJECT_TYPE(SignonIdentity) #ifdef USE_ACCOUNTS SE_GOBJECT_TYPE(AgAccount) SE_GOBJECT_TYPE(AgAccountService) SE_GOBJECT_TYPE(AgManager) SE_GLIB_TYPE(AgService, ag_service) SE_GLIB_TYPE(AgAuthData, ag_auth_data) #endif #endif // USE_SIGNON #include SE_BEGIN_CXX #ifdef USE_SIGNON #ifdef USE_ACCOUNTS typedef GListCXX ServiceListCXX; #endif class SignonAuthProvider : public AuthProvider { SignonAuthSessionCXX m_authSession; GHashTableCXX m_sessionData; std::string m_mechanism; public: SignonAuthProvider(const SignonAuthSessionCXX &authSession, const GHashTableCXX &sessionData, const std::string &mechanism) : m_authSession(authSession), m_sessionData(sessionData), m_mechanism(mechanism) {} virtual bool methodIsSupported(AuthMethod method) const { return method == AUTH_METHOD_OAUTH2; } virtual Credentials getCredentials() const { SE_THROW("only OAuth2 is supported"); } virtual std::string getOAuth2Bearer(int failedTokens, const PasswordUpdateCallback &passwordUpdateCallback) const { SE_LOG_DEBUG(NULL, "retrieving OAuth2 token, attempt %d", failedTokens); // Retry login if even the refreshed token failed. g_hash_table_insert(m_sessionData, g_strdup("UiPolicy"), g_variant_ref_sink(g_variant_new_uint32(failedTokens >= 2 ? SIGNON_POLICY_REQUEST_PASSWORD : 0))); // We get assigned a plain pointer to an instance that we'll own, // so we have to use the "steal" variant to enable that assignment. GVariantStealCXX resultDataVar; GErrorCXX gerror; GVariantCXX sessionDataVar(HashTable2Variant(m_sessionData)); PlainGStr buffer(g_variant_print(sessionDataVar, true)); SE_LOG_DEBUG(NULL, "asking for OAuth2 token with method %s, mechanism %s and parameters %s", signon_auth_session_get_method(m_authSession), m_mechanism.c_str(), buffer.get()); #define signon_auth_session_process_async_finish signon_auth_session_process_finish SYNCEVO_GLIB_CALL_SYNC(resultDataVar, gerror, signon_auth_session_process_async, m_authSession, sessionDataVar, m_mechanism.c_str(), NULL); buffer.reset(resultDataVar ? g_variant_print(resultDataVar, true) : NULL); SE_LOG_DEBUG(NULL, "OAuth2 token result: %s, %s", buffer.get() ? buffer.get() : "<>", gerror ? gerror->message : "???"); if (!resultDataVar || gerror) { SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("could not obtain OAuth2 token: %s", gerror ? gerror->message : "???"), STATUS_FORBIDDEN); } GHashTableCXX resultData(Variant2HashTable(resultDataVar)); GVariant *tokenVar = static_cast(g_hash_table_lookup(resultData, (gpointer)"AccessToken")); if (!tokenVar) { SE_THROW("no AccessToken in OAuth2 response"); } const char *token = g_variant_get_string(tokenVar, NULL); if (!token) { SE_THROW("AccessToken did not contain a string value"); } return token; } virtual std::string getUsername() const { return ""; } }; #ifdef USE_ACCOUNTS class StoreIdentityData { public: StoreIdentityData() : m_running(true) {} bool m_running; guint32 m_id; GErrorCXX m_gerror; }; static void StoreIdentityCB(SignonIdentity *self, guint32 id, const GError *error, gpointer userData) { StoreIdentityData *data = reinterpret_cast(userData); data->m_running = false; data->m_id = id; data->m_gerror = error; } boost::shared_ptr createSignonAuthProvider(const InitStateString &username, const InitStateString &password) { boost::shared_ptr provider; // Split username into and . // Be flexible and allow leading/trailing white space. // Comma is optional. static const pcrecpp::RE re("^\\s*(\\d+)\\s*,?\\s*(.*)\\s*$"); AgAccountId accountID; std::string serviceName; if (!re.FullMatch(username, &accountID, &serviceName)) { SE_THROW(StringPrintf("username must have the format gsso:,: %s", username.c_str())); } SE_LOG_DEBUG(NULL, "looking up account ID %d and service '%s'", accountID, serviceName.c_str()); AgManagerCXX manager(ag_manager_new(), TRANSFER_REF); GErrorCXX gerror; AgAccountCXX account(ag_manager_load_account(manager, accountID, gerror), TRANSFER_REF); if (!account) { gerror.throwError(SE_HERE, StringPrintf("loading account with ID %d from %s failed", accountID, username.c_str())); } if (!ag_account_get_enabled(account)) { SE_THROW(StringPrintf("account with ID %d from %s is disabled, refusing to use it", accountID, username.c_str())); } AgAccountServiceCXX accountService; if (serviceName.empty()) { accountService = AgAccountServiceCXX::steal(ag_account_service_new(account, NULL)); } else { ServiceListCXX services(ag_account_list_enabled_services(account)); BOOST_FOREACH (AgService *service, services) { const char *name = ag_service_get_name(service); SE_LOG_DEBUG(NULL, "enabled service: %s", name); if (serviceName == name) { accountService = AgAccountServiceCXX::steal(ag_account_service_new(account, service)); // Do *not* select the service for reading/writing properties. // AgAccountService does this internally, and when we create // a new identity below, we want it to be shared by all // services so that the user only needs to log in once. // ag_account_select_service(account, service); break; } } } if (!accountService) { SE_THROW(StringPrintf("service '%s' in account with ID %d not found or not enabled", serviceName.c_str(), accountID)); } AgAuthDataCXX authData(ag_account_service_get_auth_data(accountService), TRANSFER_REF); // SignonAuthServiceCXX authService(signon_auth_service_new(), TRANSFER_REF); guint signonID = ag_auth_data_get_credentials_id(authData); const char *method = ag_auth_data_get_method(authData); const char *mechanism = ag_auth_data_get_mechanism(authData); GVariantCXX sessionDataVar(ag_auth_data_get_login_parameters(authData, NULL), TRANSFER_REF); GHashTableCXX sessionData(Variant2HashTable(sessionDataVar)); #ifdef USE_GSSO GVariant *realmsVariant = (GVariant *)g_hash_table_lookup(sessionData, "Realms"); PlainGStrArray realms(g_variant_dup_strv(realmsVariant, NULL)); #endif // Check that the service has a credentials ID. If not, create it and // store its ID permanently. if (!signonID) { SE_LOG_DEBUG(NULL, "have to create signon identity"); SignonIdentityCXX identity(signon_identity_new(), TRANSFER_REF); boost::shared_ptr identityInfo(signon_identity_info_new(), signon_identity_info_free); signon_identity_info_set_caption(identityInfo.get(), StringPrintf("created by SyncEvolution for account #%d and service %s", accountID, serviceName.empty() ? "<>" : serviceName.c_str()).c_str()); const gchar *mechanisms[] = { mechanism ? mechanism : "*", NULL }; signon_identity_info_set_method(identityInfo.get(), method, mechanisms); #ifdef USE_GSSO if (realms) { signon_identity_info_set_realms(identityInfo.get(), realms); } #endif StoreIdentityData data; signon_identity_store_credentials_with_info(identity, identityInfo.get(), StoreIdentityCB, &data); GRunWhile(boost::lambda::var(data.m_running)); if (!data.m_id || data.m_gerror) { SE_THROW(StringPrintf("failed to create signon identity: %s", data.m_gerror ? data.m_gerror->message : "???")); } // Now store in account. static const char CREDENTIALS_ID[] = "CredentialsId"; ag_account_set_variant(account, CREDENTIALS_ID, g_variant_new_uint32(data.m_id)); #define ag_account_store_async_finish ag_account_store_finish gboolean res; SYNCEVO_GLIB_CALL_SYNC(res, gerror, ag_account_store_async, account, NULL); if (!res) { gerror.throwError(SE_HERE, "failed to store account"); } authData = AgAuthDataCXX::steal(ag_account_service_get_auth_data(accountService)); signonID = ag_auth_data_get_credentials_id(authData); if (!signonID) { SE_THROW("still no signonID?!"); } method = ag_auth_data_get_method(authData); mechanism = ag_auth_data_get_mechanism(authData); } SignonIdentityCXX identity(signon_identity_new_from_db(signonID), TRANSFER_REF); SE_LOG_DEBUG(NULL, "using signond identity %d", signonID); SignonAuthSessionCXX authSession(signon_identity_create_session(identity, method, gerror), TRANSFER_REF); // TODO (?): retrieve start URL from account system provider.reset(new SignonAuthProvider(authSession, sessionData, mechanism)); return provider; } #else // USE_ACCOUNTS boost::shared_ptr createSignonAuthProvider(const InitStateString &username, const InitStateString &password) { // Expected content of parameter GVariant. boost::shared_ptr hashtype(g_variant_type_new("a{sv}"), g_variant_type_free); // 'username' is the part after signon: which we can parse directly. GErrorCXX gerror; GVariantCXX parametersVar(g_variant_parse(hashtype.get(), username.c_str(), NULL, NULL, gerror), TRANSFER_REF); if (!parametersVar) { gerror.throwError(SE_HERE, "parsing 'signon:' username"); } GHashTableCXX parameters(Variant2HashTable(parametersVar)); // Extract the values that we expect in the parameters hash. guint32 signonID; const char *method; const char *mechanism; GVariant *value; value = (GVariant *)g_hash_table_lookup(parameters, "identity"); if (!value || !g_variant_type_equal(G_VARIANT_TYPE_UINT32, g_variant_get_type(value))) { SE_THROW("need 'identity: ' in 'signon:' parameters"); } signonID = g_variant_get_uint32(value); value = (GVariant *)g_hash_table_lookup(parameters, "method"); if (!value || !g_variant_type_equal(G_VARIANT_TYPE_STRING, g_variant_get_type(value))) { SE_THROW("need 'method: ' in 'signon:' parameters"); } method = g_variant_get_string(value, NULL); value = (GVariant *)g_hash_table_lookup(parameters, "mechanism"); if (!value || !g_variant_type_equal(G_VARIANT_TYPE_STRING, g_variant_get_type(value))) { SE_THROW("need 'mechanism: ' in 'signon:' parameters"); } mechanism = g_variant_get_string(value, NULL); value = (GVariant *)g_hash_table_lookup(parameters, "session"); if (!value || !g_variant_type_equal(hashtype.get(), g_variant_get_type(value))) { SE_THROW("need 'session: ' in 'signon:' parameters"); } GHashTableCXX sessionData(Variant2HashTable(value)); SE_LOG_DEBUG(NULL, "using identity %u, method %s, mechanism %s", signonID, method, mechanism); SignonIdentityCXX identity(signon_identity_new_from_db(signonID), TRANSFER_REF); SE_LOG_DEBUG(NULL, "using signond identity %d", signonID); SignonAuthSessionCXX authSession(signon_identity_create_session(identity, method, gerror), TRANSFER_REF); boost::shared_ptr provider(new SignonAuthProvider(authSession, sessionData, mechanism)); return provider; } #endif // USE_ACCOUNTS #endif // USE_SIGNON SE_END_CXX syncevolution-1.5/src/backends/sqlite/0000755000373300037200000000000012424707641021545 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/sqlite/configure-sub.in0000644000373300001540000000163012326412403024455 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. dnl check for sqlite PKG_CHECK_MODULES(SQLITE, sqlite3, SQLITEFOUND=yes, [SQLITEFOUND=no]) AC_SUBST(SQLITE_CFLAGS) AC_SUBST(SQLITE_LIBS) BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $SQLITE_CFLAGS" SE_ARG_ENABLE_BACKEND(sqlite, sqlite, [AS_HELP_STRING([--enable-sqlite], [enable access to PIM data stored in SQLite files (experimental, default off)])], [enable_sqlite="$enableval"], [enable_sqlite="no"] ) if test "$enable_sqlite" = "yes"; then test "x${SQLITEFOUND}" = "xyes" || AC_MSG_ERROR([--enable-sqlite requires pkg-config information for sqlite3, which was not found]) AC_DEFINE(ENABLE_SQLITE, 1, [sqlite available]) else # avoid linking against it if not needed SQLITE_CFLAGS= SQLITE_LIBS= fi syncevolution-1.5/src/backends/sqlite/README0000664000373300001540000000204512405555067022254 0ustar00nightlynightly00000000000000This is a demo backend. It uses a database schema that is similar to the one used on the iPhone, but it is not as complete. To compile this backend as part of SyncEvolution, configure with --enable-sqlite. To compile it against a binary distribution of SyncEvolution, make sure that the SyncEvolution, Synthesis and sqlite developer files are installed and that pkg-config can find syncevolution.pc, synthesis.pc and sqlite.pc. Set your PKG_CONFIG_PATH if necessary. Then the source files can be compiled as follows: g++ -fpic -DPIC -DENABLE_SQLITE -shared -I. \ `pkg-config --cflags --libs syncevolution` `pkg-config --cflags --libs sqlite` *.cpp \ -o /tmp/syncsqlite.so Install /tmp/syncsqlite.so by moving it into the "lib/syncevolution/backends" directory of the SyncEvolution installation. It then should show up as additional choice for the "type" property: syncevolution --datastore-property type=? ... SQLite Address Book = addressbook = contacts = sqlite-contacts vCard 2.1 (default) = text/x-vcard syncevolution-1.5/src/backends/sqlite/SQLiteContactSourceRegister.cpp0000644000373300001540000000722512326412403027432 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "SQLiteContactSource.h" #ifdef ENABLE_UNIT_TESTS # include # include #endif #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe = sourceType.m_backend == "SQLite Address Book"; #ifndef ENABLE_SQLITE return isMe ? RegisterSyncSource::InactiveSource(params) : NULL; #else bool maybeMe = sourceType.m_backend == "addressbook"; if (isMe || maybeMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/x-vcard") { return new SQLiteContactSource(params); } else { return NULL; } } return NULL; #endif } static RegisterSyncSource registerMe("SQLite Address Book", #ifdef ENABLE_SQLITE true, #else false, #endif createSource, "SQLite Address Book = addressbook = contacts = sqlite-contacts\n" " vCard 2.1 (default) = text/x-vcard\n", Values() + (Aliases("SQLite Address Book") + "sqlite-contacts" + "sqlite")); #ifdef ENABLE_SQLITE #ifdef ENABLE_UNIT_TESTS class EvolutionSQLiteContactsTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(EvolutionSQLiteContactsTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("contacts", "contacts", true)); source.reset(SyncSource::createTestingSource("contacts", "addressbook", true)); source.reset(SyncSource::createTestingSource("contacts", "sqlite-contacts", true)); source.reset(SyncSource::createTestingSource("contacts", "SQLite Address Book:text/x-vcard", true)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(EvolutionSQLiteContactsTest); #endif // ENABLE_UNIT_TESTS /*Client-Test requries the backends is an instance of TestingSyncSource * which in turn requires backends support serialized access for the data * which is not supported by SQLiteContactSource.*/ #if 0 #ifdef ENABLE_INTEGRATION_TESTS namespace { #if 0 } #endif static class VCard21Test : public RegisterSyncSourceTest { public: VCard21Test() : RegisterSyncSourceTest("sqlite_vcard21", "vcard21") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "sqlite-contacts:text/x-vcard"; config.m_testcases = "testcases/sqlite_vcard21.vcf"; } } VCard21Test; } #endif // ENABLE_INTEGRATION_TESTS #endif #endif // ENABLE_SQLITE SE_END_CXX syncevolution-1.5/src/backends/sqlite/sqlite.am0000644000373300001540000000275712326412403023210 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ src/backends/sqlite/configure-sub.in \ src/backends/sqlite/README src_backends_sqlite_lib = src/backends/sqlite/syncsqlite.la MOSTLYCLEANFILES += $(src_backends_sqlite_lib) if ENABLE_MODULES src_backends_sqlite_backenddir = $(BACKENDS_DIRECTORY) src_backends_sqlite_backend_LTLIBRARIES = $(src_backends_sqlite_lib) else noinst_LTLIBRARIES += $(src_backends_sqlite_lib) endif src_backends_sqlite_src = \ src/backends/sqlite/SQLiteUtil.h \ src/backends/sqlite/SQLiteUtil.cpp \ src/backends/sqlite/SQLiteContactSource.h \ src/backends/sqlite/SQLiteContactSource.cpp src_backends_sqlite_syncsqlite_la_SOURCES = $(src_backends_sqlite_src) src_backends_sqlite_syncsqlite_la_LIBADD = $(SQLITE_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_sqlite_syncsqlite_la_LDFLAGS = -module -avoid-version src_backends_sqlite_syncsqlite_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) src_backends_sqlite_syncsqlite_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) -I$(top_srcdir)/src/backends/sqlite src_backends_sqlite_syncsqlite_la_DEPENDENCIES = src/syncevo/libsyncevolution.la # SQLiteContactSource does not support all fields from Funambol vCard 2.1 # test cases: filter them out before testing #../../testcases/sqlite_vcard21.vcf: $(FUNAMBOL_SUBDIR)/test/test/testcases/vcard21.vcf # mkdir -p ${@D} # perl -e '$$_ = join("", <>); s/^(ADR|TEL|EMAIL|PHOTO).*?(?=^\S)//msg; s/;X-EVOLUTION-UI-SLOT=\d+//g; print;' $< >$@ # all: ../../testcases/sqlite_vcard21.vcf syncevolution-1.5/src/backends/sqlite/SQLiteUtil.h0000664000373300001540000001210012330727742023533 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SQLITESYNCSOURCE #define INCL_SQLITESYNCSOURCE #ifdef ENABLE_SQLITE #include #include #include #include #include #include SE_BEGIN_CXX using namespace std; class SQLiteUnref { public: static void unref(sqlite3 *db) { sqlite3_close(db); } static void unref(sqlite3_stmt *stmt) { sqlite3_finalize(stmt); } }; typedef eptr sqliteptr; /** * This class implements access to SQLite database files: * - opening the database file * - error reporting * - creating a database file * - converting to and from a VObject via a simple property<->column name mapping */ class SQLiteUtil { public: /** information about the database mapping */ struct Mapping { const char *colname; /**< column name in SQL table */ const char *tablename; /**< name of the SQL table which has this column */ const char *fieldname; /**< synthesis internal field name, no corresponding synthesis field if empty*/ int colindex; /**< determined dynamically in open(): index of the column, -1 if not present */ }; const Mapping &getMapping(int i) { return m_mapping[i]; } /** * @param name a name for the data source, used for error messages * @param fileid a descriptor which identifies the file to be opened: * currently valid syntax is file:// followed by path * @param mapping array with database mapping, terminated by NULL colname * @param schema database schema to use when creating new databases, may be NULL */ void open(const string &name, const string &fileid, const Mapping *mapping, const char *schema); void close(); /** * throw error for a specific sqlite3 operation on m_db * @param operation a description of the operation which failed */ void throwError(const SourceLocation &where, const string &operation); /** * wrapper around sqlite3_prepare() which operates on the current * database and throws an error if the call fails * * @param sqlfmt printf-style format string for query, followed by parameters for sprintf */ sqlite3_stmt *prepareSQL(const char *sqlfmt, ...); /** * wrapper around sqlite3_prepare() which operates on the current * database and throws an error if the call fails * * @param sql preformatted SQL statement(s) * @param nextsql pointer to next statement in sql */ sqlite3_stmt *prepareSQLWrapper(const char *sql, const char **nextsql = NULL); /** checks the result of an sqlite3 call, throws an error if faulty, otherwise returns the result */ int checkSQL(int res, const char *operation = "SQLite call") { if (res != SQLITE_OK && res != SQLITE_ROW && res != SQLITE_DONE) { throwError(SE_HERE, operation); } return res; } /** type used for row keys */ typedef long long key_t; string toString(key_t key) { char buffer[32]; sprintf(buffer, "%lld", key); return buffer; } #define SQLITE3_COLUMN_KEY sqlite3_column_int64 /** return row ID for a certain row */ key_t findKey(const char *database, const char *keyname, const char *key); /** return a specific column for a row identified by a certain key column as text, returns default text if not found */ string findColumn(const char *database, const char *keyname, const char *key, const char *column, const char *def); /** a wrapper for sqlite3_column_test() which will check for NULL and returns default text instead */ string getTextColumn(sqlite3_stmt *stmt, int col, const char *def = ""); typedef unsigned long syncml_time_t; /** transform column to same time base as used by SyncML libary (typically time()) */ syncml_time_t getTimeColumn(sqlite3_stmt *stmt, int col); /** convert time to string */ static string time2str(syncml_time_t t); private: /* copy of open() parameters */ arrayptr m_mapping; string m_name; string m_fileid; /** current database */ eptr m_db; }; SE_END_CXX #endif // ENABLE_SQLITE #endif // INCL_SQLITESYNCSOURCE syncevolution-1.5/src/backends/sqlite/SQLiteUtil.cpp0000664000373300001540000001326512330727742024103 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef ENABLE_SQLITE #include "SQLiteUtil.h" #include #include #include #include #include SE_BEGIN_CXX void SQLiteUtil::throwError(const SourceLocation &here, const string &operation) { string descr = m_name + ": '" + m_fileid + "': " + operation + " failed"; if (m_db) { const char *error = sqlite3_errmsg(m_db); descr += ": "; descr += error ? error : "unspecified error"; } Exception::throwError(here, descr); } sqlite3_stmt *SQLiteUtil::prepareSQLWrapper(const char *sql, const char **nextsql) { sqlite3_stmt *stmt = NULL; checkSQL(sqlite3_prepare(m_db, sql, -1, &stmt, nextsql), sql); return stmt; } sqlite3_stmt *SQLiteUtil::prepareSQL(const char *sqlfmt, ...) { va_list ap; va_start(ap, sqlfmt); string s = StringPrintfV (sqlfmt, ap); va_end(ap); return prepareSQLWrapper(s.c_str()); } SQLiteUtil::key_t SQLiteUtil::findKey(const char *database, const char *keyname, const char *key) { sqliteptr query(prepareSQL("SELECT ROWID FROM %s WHERE %s = '%s';", database, keyname, key)); int res = checkSQL(sqlite3_step(query), "getting key"); if (res == SQLITE_ROW) { return sqlite3_column_int64(query, 0); } else { return -1; } } string SQLiteUtil::findColumn(const char *database, const char *keyname, const char *key, const char *column, const char *def) { sqliteptr query(prepareSQL("SELECT %s FROM %s WHERE %s = '%s';", column, database, keyname, key)); int res = checkSQL(sqlite3_step(query), "getting key"); if (res == SQLITE_ROW) { const unsigned char *text = sqlite3_column_text(query, 0); return text ? (const char *)text : def; } else { return def; } } string SQLiteUtil::getTextColumn(sqlite3_stmt *stmt, int col, const char *def) { const unsigned char *text = sqlite3_column_text(stmt, col); return text ? (const char *)text : def; } SQLiteUtil::syncml_time_t SQLiteUtil::getTimeColumn(sqlite3_stmt *stmt, int col) { // assumes that the database stores the result of time() directly return sqlite3_column_int64(stmt, col); } string SQLiteUtil::time2str(SQLiteUtil::syncml_time_t t) { char buffer[128]; sprintf(buffer, "%lu", t); return buffer; } void SQLiteUtil::open(const string &name, const string &fileid, const SQLiteUtil::Mapping *mapping, const char *schema) { close(); m_name = name; m_fileid = fileid; const string prefix("file://"); bool create = fileid.substr(0, prefix.size()) == prefix; string filename = create ? fileid.substr(prefix.size()) : fileid; if (!create && access(filename.c_str(), F_OK)) { throw runtime_error(m_name + ": no such database: '" + filename + "'"); } sqlite3 *db; int res = sqlite3_open(filename.c_str(), &db); m_db = db; checkSQL(res, "opening"); // check whether file is empty = newly created, define schema if that's the case sqliteptr check(prepareSQLWrapper("SELECT * FROM sqlite_master;")); switch (sqlite3_step(check)) { case SQLITE_ROW: // okay break; case SQLITE_DONE: { // empty const char *nextsql = schema; while (nextsql && *nextsql) { const char *sql = nextsql; sqliteptr create(prepareSQLWrapper(sql, &nextsql)); while (true) { int res = sqlite3_step(create); if (res == SQLITE_DONE) { break; } else if (res == SQLITE_ROW) { // continue } else { throwError(SE_HERE, "creating database");\ } } } break; } default: throwError(SE_HERE, "checking content"); break; } // query database schema to find columns we need int i; for (i = 0; mapping[i].colname; i++) ; m_mapping.set(new Mapping[i + 1]); sqliteptr query; string tablename; for (i = 0; mapping[i].colname; i++) { m_mapping[i] = mapping[i]; // switching to a different table? if (tablename != m_mapping[i].tablename) { tablename = m_mapping[i].tablename; query.set(prepareSQL("SELECT * FROM %s;", tablename.c_str())); } // search for this column name for (m_mapping[i].colindex = sqlite3_column_count(query) - 1; m_mapping[i].colindex >= 0; m_mapping[i].colindex--) { const char *name = sqlite3_column_name(query, m_mapping[i].colindex); if (name && !strcasecmp(m_mapping[i].colname, name)) { break; } } } memset(&m_mapping[i], 0, sizeof(m_mapping[i])); } void SQLiteUtil::close() { m_db = NULL; } SE_END_CXX #endif /* ENABLE_SQLITE */ syncevolution-1.5/src/backends/sqlite/SQLiteContactSource.h0000644000373300001540000001070512326412403025367 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SQLITECONTACTSOURCE #define INCL_SQLITECONTACTSOURCE #include #include #include #include #include #include SE_BEGIN_CXX #ifdef ENABLE_SQLITE /** * Uses SQLiteUtil for contacts with a schema inspired by the one used * by Mac OS X. That schema has hierarchical tables which is not * supported by SQLiteUtil, therefore SQLiteContactSource uses a * simplified schema where each contact consists of one row in the * database table. * * The handling of the "N" and "ORG" property shows how mapping * between one property and multiple different columns works. * * Properties which can occur more than once per contact like address, * email and phone numbers are not supported. They would have to be * stored in additional tables. * * Change tracking is done by implementing a modification date as part * of each contact and using that as the revision string. * The database file is created automatically if the database ID is * file:///. */ class SQLiteContactSource : public SyncSource, virtual public SyncSourceSession, virtual public SyncSourceAdmin, virtual public SyncSourceBlob, virtual public SyncSourceRevisions, virtual public SyncSourceDelete, virtual public SyncSourceLogging, virtual public SyncSourceChanges { public: SQLiteContactSource(const SyncSourceParams ¶ms) : SyncSource(params), m_trackingNode(new PrefixConfigNode("item-", boost::shared_ptr(new SafeConfigNode(params.m_nodes.getTrackingNode())))) { SyncSourceSession::init(m_operations); SyncSourceDelete::init(m_operations); SyncSourceRevisions::init(NULL, NULL, 1, m_operations); SyncSourceChanges::init(m_operations); m_operations.m_isEmpty = boost::bind(&SQLiteContactSource::isEmpty, this); m_operations.m_readItemAsKey = boost::bind(&SQLiteContactSource::readItemAsKey, this, _1, _2); m_operations.m_insertItemAsKey = boost::bind(&SQLiteContactSource::insertItemAsKey, this, _1, (sysync::cItemID)NULL, _2); m_operations.m_updateItemAsKey = boost::bind(&SQLiteContactSource::insertItemAsKey, this, _1, _2, _3); SyncSourceLogging::init(InitList ("N_FIRST")+"N_MIDDLE"+"N_LAST", ", ", m_operations); } protected: /* implementation of SyncSource interface */ virtual void open(); virtual void close(); virtual Databases getDatabases(); virtual void enableServerMode(); virtual bool serverModeEnabled() const; virtual std::string getPeerMimeType() const { return "text/x-vcard"; } /* Methods in SyncSource */ virtual void getSynthesisInfo (SynthesisInfo &info, XMLConfigFragments &fragment); sysync::TSyError readItemAsKey(sysync::cItemID aID, sysync::KeyH aItemKey); sysync::TSyError insertItemAsKey(sysync::KeyH aItemKey, sysync::cItemID aID, sysync::ItemID newID); /* Methods in SyncSourceSession*/ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); /* Methods in SyncSourceDelete*/ virtual void deleteItem(const string &luid); /* Methods in SyncSourceRevisions */ virtual void listAllItems(RevisionMap_t &revisions); private: /** encapsulates access to database */ boost::shared_ptr m_trackingNode; SQLiteUtil m_sqlite; /** implements the m_isEmpty operation */ bool isEmpty(); }; #endif // ENABLE_SQLITE SE_END_CXX #endif // INCL_SQLITECONTACTSOURCE syncevolution-1.5/src/backends/sqlite/SQLiteContactSource.cpp0000664000373300001540000003031012330727742025730 0ustar00nightlynightly00000000000000/* * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #ifdef ENABLE_SQLITE #include "SQLiteContactSource.h" #include #include #include #include #include #include #include SE_BEGIN_CXX enum { PERSON_LAST, PERSON_MIDDLE, PERSON_FIRST, PERSON_PREFIX, PERSON_SUFFIX, PERSON_LASTSORT, PERSON_FIRSTSORT, PERSON_ORGANIZATION, PERSON_DEPARTMENT, PERSON_UNIT, PERSON_NOTE, PERSON_BIRTHDAY, PERSON_JOBTITLE, PERSON_TITLE, PERSON_NICKNAME, PERSON_FULLNAME, PERSON_CATEGORIES, PERSON_AIM, PERSON_GROUPWISE, PERSON_ICQ, PERSON_YAHOO, PERSON_FILEAS, PERSON_ANNIVERSARY, PERSON_ASSISTANT, PERSON_MANAGER, PERSON_SPOUSE, PERSON_URL, PERSON_BLOG_URL, PERSON_VIDEO_URL, LAST_COL }; void SQLiteContactSource::open() { static const SQLiteUtil::Mapping mapping[LAST_COL + 1] = { { "Last", "ABPerson", "N_LAST"}, { "Middle", "ABPerson", "N_MIDDLE"}, { "First", "ABPerson", "N_FIRST" }, { "Prefix", "ABPerson", "N_PREFIX" }, { "Suffix", "ABPerson", "N_SUFFIX" }, { "FirstSort", "ABPerson", "" }, { "LastSort", "ABPerson", "" }, { "Organization", "ABPerson", "ORG_NAME" }, { "Department", "ABPerson", "ORG_DIVISION" }, { "Unit", "ABPerson", "ORG_OFFICE" }, //{"Team", "ABPerson", "ORG_TEAM" } { "Note", "ABPerson", "NOTE" }, { "Birthday", "ABPerson", "BDAY" }, { "JobTitle", "ABPerson", "ROLE" }, { "Title", "ABPerson", "TITLE" }, { "Nickname", "ABPerson", "NICKNAME" }, { "CompositeNameFallback", "ABPerson", "FN" }, { "Categories", "ABPerson", "CATEGORIES" }, { "AIM", "ABPerson", "AIM_HANDLE" }, { "Groupwise", "ABPerson", "GROUPWISE_HANDLE" }, { "ICQ", "ABPerson", "ICQ_HANDLE" }, { "Yahoo", "ABPerson", "YAHOO_HANDLE" }, { "FileAs", "ABPerson", "FILE-AS" }, { "Anniversary", "ABPerson", "ANNIVERSARY" }, { "Assistant", "ABPerson", "ASSISTANT" }, { "Manager", "ABPerson", "MANAGER" }, { "Spouse", "ABPerson", "SPOUSE" }, { "URL", "ABPerson", "WEB" }, { "BlogURL", "ABPerson", "BLOGURL" }, { "VideoURL", "ABPerson", "VIDEOURL" }, { NULL } }; static const char *schema = "BEGIN TRANSACTION;" "CREATE TABLE ABPerson (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, " "First TEXT, " "Last TEXT, " "Middle TEXT, " "FirstPhonetic TEXT, " "MiddlePhonetic TEXT, " "LastPhonetic TEXT, " "Organization TEXT, " "Department TEXT, " "Unit TEXT, " "Note TEXT, " "Kind INTEGER, " "Birthday TEXT, " "JobTitle TEXT, " "Title TEXT, " "Nickname TEXT, " "Prefix TEXT, " "Suffix TEXT, " "FirstSort TEXT, " "LastSort TEXT, " "CreationDate INTEGER, " "ModificationDate INTEGER, " "CompositeNameFallback TEXT, " "Categories TEXT, " "AIM TEXT, " "Groupwise TEXT, " "ICQ Text, " "Yahoo TEXT, " "Anniversary TEXT, " "Assistant TEXT, " "Manager TEXT, " "Spouse TEXT, " "URL TEXT, " "BlogURL TEXT, " "VideoURL TEXT, " "FileAs TEXT);" "COMMIT;"; string id = getDatabaseID(); m_sqlite.open(getName(), id.c_str(), mapping, schema); } void SQLiteContactSource::close() { m_sqlite.close(); } void SQLiteContactSource::getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragment) { SourceType sourceType = getSourceType(); string type; if (!sourceType.m_format.empty()) { type = sourceType.m_format; } info.m_native = "vCard21"; info.m_fieldlist = "contacts"; info.m_datatypes = " \n" " \n"; if (type == "text/x-vcard:2.1" || type == "text/x-vcard") { info.m_datatypes = " \n"; if (!sourceType.m_forceFormat) { info.m_datatypes += " \n"; } } else if (type == "text/vcard:3.0" || type == "text/vcard") { info.m_datatypes = " \n"; if (!sourceType.m_forceFormat) { info.m_datatypes += " \n"; } } else { throwError(SE_HERE, string("configured MIME type not supported: ") + type); } } SQLiteContactSource::Databases SQLiteContactSource::getDatabases() { Databases result; result.push_back(Database("select database via file path", "file:///")); return result; } bool SQLiteContactSource::isEmpty() { // there are probably more efficient ways to do this, but this is just // a proof-of-concept anyway sqliteptr all(m_sqlite.prepareSQL("SELECT ROWID FROM ABPerson;")); while (m_sqlite.checkSQL(sqlite3_step(all)) == SQLITE_ROW) { return false; } return true; } void SQLiteContactSource::listAllItems(RevisionMap_t &revisions) { sqliteptr all(m_sqlite.prepareSQL("SELECT ROWID, CreationDate, ModificationDate FROM ABPerson;")); while (m_sqlite.checkSQL(sqlite3_step(all)) == SQLITE_ROW) { string uid = m_sqlite.toString(SQLITE3_COLUMN_KEY(all, 0)); string modTime = m_sqlite.time2str(m_sqlite.getTimeColumn(all, 2)); revisions.insert(RevisionMap_t::value_type(uid, modTime)); } } sysync::TSyError SQLiteContactSource::readItemAsKey(sysync::cItemID aID, sysync::KeyH aItemKey) { string uid = aID->item; sqliteptr contact(m_sqlite.prepareSQL("SELECT * FROM ABPerson WHERE ROWID = '%s';", uid.c_str())); if (m_sqlite.checkSQL(sqlite3_step(contact)) != SQLITE_ROW) { throwError(SE_HERE, STATUS_NOT_FOUND, string("contact not found: ") + uid); } for (int i = 0; isetValue(aItemKey, field, value.c_str(), value.size()); if (res != sysync::LOCERR_OK) { SE_LOG_WARNING(getDisplayName(), "SQLite backend: set field %s value %s failed", field.c_str(), value.c_str()); } } } return sysync::LOCERR_OK; } sysync::TSyError SQLiteContactSource::insertItemAsKey(sysync::KeyH aItemKey, sysync::cItemID aID, sysync::ItemID newID) { string uid = aID ? aID->item :""; string newuid = uid; string creationTime; string first, last; stringstream cols; stringstream values; // scan-build: value stored to 'numparams' is never read. std::list insValues; for (int i = 0; igetValue (aItemKey, field, data)) { insValues.push_back (string (data.get())); cols << m_sqlite.getMapping(i).colname << ", "; values <<"?, "; if (field == "N_FIRST") { first = insValues.back(); } else if (field == "N_LAST") { last = insValues.back(); } } } // synthesize sort keys: upper case with specific order of first/last name string firstsort = first + " " + last; boost::to_upper(firstsort); string lastsort = last + " " + first; boost::to_upper(lastsort); cols << "FirstSort, LastSort"; values << "?, ?"; insValues.push_back(firstsort); insValues.push_back(lastsort); // optional fixed UID, potentially fixed creation time if (uid.size()) { creationTime = m_sqlite.findColumn("ABPerson", "ROWID", uid.c_str(), "CreationDate", ""); cols << ", ROWID"; values << ", ?"; } cols << ", CreationDate, ModificationDate"; values << ", ?, ?"; // delete complete row so that we can recreate it if (uid.size()) { sqliteptr remove(m_sqlite.prepareSQL("DELETE FROM ABPerson WHERE ROWID == ?;")); m_sqlite.checkSQL(sqlite3_bind_text(remove, 1, uid.c_str(), -1, SQLITE_TRANSIENT)); m_sqlite.checkSQL(sqlite3_step(remove)); } string cols_str = cols.str(); string values_str = values.str(); sqliteptr insert(m_sqlite.prepareSQL("INSERT INTO ABPerson( %s ) VALUES( %s );", cols.str().c_str(), values.str().c_str())); // now bind parameter values in the same order as the columns specification above int param = 1; BOOST_FOREACH (string &value, insValues) { m_sqlite.checkSQL(sqlite3_bind_text(insert, param++, value.c_str(), -1, SQLITE_TRANSIENT)); } if (uid.size()) { m_sqlite.checkSQL(sqlite3_bind_text(insert, param++, uid.c_str(), -1, SQLITE_TRANSIENT)); m_sqlite.checkSQL(sqlite3_bind_text(insert, param++, creationTime.c_str(), -1, SQLITE_TRANSIENT)); } else { m_sqlite.checkSQL(sqlite3_bind_int64(insert, param++, (long long)time(NULL))); } SQLiteUtil::syncml_time_t modificationTime = time(NULL); m_sqlite.checkSQL(sqlite3_bind_int64(insert, param++, modificationTime)); m_sqlite.checkSQL(sqlite3_step(insert)); if (!uid.size()) { // figure out which UID was assigned to the new contact newuid = m_sqlite.findColumn("SQLITE_SEQUENCE", "NAME", "ABPerson", "SEQ", ""); } newID->item = StrAlloc(newuid.c_str()); updateRevision(*m_trackingNode, uid, newuid, m_sqlite.time2str(modificationTime)); return sysync::LOCERR_OK; } void SQLiteContactSource::deleteItem(const string& uid) { sqliteptr del; del.set(m_sqlite.prepareSQL("DELETE FROM ABPerson WHERE " "ABPerson.ROWID = ?;")); m_sqlite.checkSQL(sqlite3_bind_text(del, 1, uid.c_str(), -1, SQLITE_TRANSIENT)); m_sqlite.checkSQL(sqlite3_step(del)); // TODO: throw STATUS_NOT_FOUND exception when nothing was deleted deleteRevision(*m_trackingNode, uid); } void SQLiteContactSource::enableServerMode() { SyncSourceAdmin::init(m_operations, this); SyncSourceBlob::init(m_operations, getCacheDir()); } bool SQLiteContactSource::serverModeEnabled() const { return m_operations.m_loadAdminData; } void SQLiteContactSource::beginSync(const std::string &lastToken, const std::string &resumeToken) { detectChanges(*m_trackingNode, CHANGES_FULL); } std::string SQLiteContactSource::endSync(bool success) { if (success) { m_trackingNode->flush(); } else { // The Synthesis docs say that we should rollback in case of // failure. Cannot do that for data, so lets at least keep // the revision map unchanged. } // no token handling at the moment (not needed for clients) return ""; } SE_END_CXX #endif /* ENABLE_SQLITE */ #ifdef ENABLE_MODULES # include "SQLiteContactSourceRegister.cpp" #endif syncevolution-1.5/src/backends/webdav/0000755000373300037200000000000012424707641021514 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/webdav/configure-sub.in0000644000373300001540000000312512326412403024425 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. SE_ARG_ENABLE_BACKEND(dav, webdav, [AS_HELP_STRING([--enable-dav], [enable WebDAV based backends (CalDAV) (default off)])], [enable_dav="$enableval"], [enable_dav="no"] ) if test "$enable_dav" = "yes"; then need_ical="yes" PKG_CHECK_MODULES(NEON, neon >= 0.29, [AC_DEFINE(HAVE_LIBNEON_SYSTEM_PROXY, 1, [ne_session_system_proxy() available]) AC_DEFINE(HAVE_LIBNEON_OPTIONS, 1, [ne_options2() and NE_CAP_* defines available])], [PKG_CHECK_MODULES(NEON, neon >= 0.27)]) AC_DEFINE(ENABLE_DAV, 1, [DAV available]) AC_DEFINE(ENABLE_ICAL, 1, [libical in use]) BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $NEON_CFLAGS" fi AC_ARG_ENABLE(neon-compatibility, AS_HELP_STRING([--enable-neon-compatibility], [increase compatibility with binary libneon installations by loading libneon[-gnutls].27.so dynamically instead of linking against it]), [enable_neon_compat="$enableval"], [enable_neon_compat="no"] ) if test "$enable_neon_compat" = "yes"; then AC_DEFINE(NEON_COMPATIBILITY, 1, [dynamically open libneon]) NEON_LIBS="`echo $NEON_LIBS | sed -e 's/\(-lneon\(-gnutls\)*\|[^ ]*libneon\(-gnutls\)*.la\)/-ldl/'`" fi AM_CONDITIONAL([NEON_COMPATIBILITY], [test "$enable_neon_compat" = "yes"]) syncevolution-1.5/src/backends/webdav/WebDAVSourceRegister.cpp0000664000373300001540000004420412336456617026014 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #include "WebDAVSource.h" #include "CalDAVSource.h" #include "CalDAVVxxSource.h" #include "CardDAVSource.h" #include #include #include #ifdef ENABLE_UNIT_TESTS #include "test.h" #endif #ifdef NEON_COMPATIBILITY #include #endif #include #include #include #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); bool isMe; // Backend is enabled if a suitable libneon can be found. In // binary compatibility mode, libneon was not linked against. // Instead we dlopen() it and don't care whether that is // libneon.so.27 or libneon-gnutls.so.27. Debian Testing only has // the later. #ifdef NEON_COMPATIBILITY static bool enabled; if (!enabled) { // try libneon.so.27 first because it seems to be a bit more // common and upstream seems to use OpenSSL void *dl = dlopen("libneon.so.27", RTLD_LAZY|RTLD_GLOBAL); if (!dl) { dl = dlopen("libneon-gnutls.so.27", RTLD_LAZY|RTLD_GLOBAL); } if (dl) { enabled = true; } } #elif defined(ENABLE_DAV) static bool enabled = true; #endif isMe = sourceType.m_backend == "CalDAV" || sourceType.m_backend == "CalDAVTodo" || sourceType.m_backend == "CalDAVJournal"; if (isMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/calendar" || sourceType.m_format == "text/x-calendar" || sourceType.m_format == "text/x-vcalendar") { #ifdef ENABLE_DAV if (enabled) { boost::shared_ptr settings; if (sourceType.m_backend == "CalDAV") { if (EDSAbiHaveIcal) { boost::shared_ptr sub(new CalDAVSource(params, settings)); return new MapSyncSource(params, sub); } } else { return new CalDAVVxxSource(sourceType.m_backend == "CalDAVTodo" ? "VTODO" : "VJOURNAL", params, settings); } } #endif return RegisterSyncSource::InactiveSource(params); } } isMe = sourceType.m_backend == "CardDAV"; if (isMe) { if (sourceType.m_format == "" || sourceType.m_format == "text/x-vcard" || sourceType.m_format == "text/vcard") { #ifdef ENABLE_DAV if (enabled) { boost::shared_ptr settings; return new CardDAVSource(params, settings); } #endif return RegisterSyncSource::InactiveSource(params); } } return NULL; } static class RegisterWebDAVSyncSource : public RegisterSyncSource { public: RegisterWebDAVSyncSource() : RegisterSyncSource("DAV", #ifdef ENABLE_DAV true, #else false, #endif createSource, "CalDAV\n" " calendar events\n" "CalDAVTodo\n" " tasks\n" "CalDAVJournal\n" " memos\n" "CardDAV\n" " contacts\n" , Values() + Aliases("CalDAV") + Aliases("CalDAVTodo") + Aliases("CalDAVJournal") + Aliases("CardDAV") ) { // configure and register our own property; // do this regardless whether the backend is enabled, // so that config migration always includes this property WebDAVCredentialsOkay().setHidden(true); SyncConfig::getRegistry().push_back(&WebDAVCredentialsOkay()); } } registerMe; #ifdef ENABLE_DAV #ifdef ENABLE_UNIT_TESTS class WebDAVTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(WebDAVTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST(testHTMLEntities); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset((TestingSyncSource *)SyncSource::createTestingSource("CalDAV", "CalDAV", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("CalDAV", "CalDAV:text/calendar", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("CalDAV", "CalDAV:text/x-vcalendar", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("CardDAV", "CardDAV", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("CardDAV", "CardDAV:text/vcard", true)); source.reset((TestingSyncSource *)SyncSource::createTestingSource("CardDAV", "CardDAV:text/x-vcard", true)); } std::string decode(const char *item) { std::string buffer = item; CardDAVSource::replaceHTMLEntities(buffer); return buffer; } void testHTMLEntities() { // named entries CPPUNIT_ASSERT_EQUAL(std::string("\" & ' < >"), decode("" & ' < >")); // decimal and hex, encoded in different ways CPPUNIT_ASSERT_EQUAL(std::string("\" & ' < >"), decode("" & ' < >")); // no translation needed CPPUNIT_ASSERT_EQUAL(std::string("hello world"), decode("hello world")); // entity at start CPPUNIT_ASSERT_EQUAL(std::string("< "), decode("< ")); // entity at end CPPUNIT_ASSERT_EQUAL(std::string(" <"), decode(" <")); // double quotation CPPUNIT_ASSERT_EQUAL(std::string("\\"), decode("&#92;")); CPPUNIT_ASSERT_EQUAL(std::string("ampersand entity & less-than entity <"), decode("ampersand entity & less-than entity &lt;")); // invalid entities CPPUNIT_ASSERT_EQUAL(std::string(" &"), decode(" &")); CPPUNIT_ASSERT_EQUAL(std::string("&"), decode("&")); CPPUNIT_ASSERT_EQUAL(std::string("& "), decode("& ")); CPPUNIT_ASSERT_EQUAL(std::string("&;"), decode("&;")); CPPUNIT_ASSERT_EQUAL(std::string("&; "), decode("&; ")); CPPUNIT_ASSERT_EQUAL(std::string(" &; "), decode(" &; ")); CPPUNIT_ASSERT_EQUAL(std::string(" &;"), decode(" &;")); CPPUNIT_ASSERT_EQUAL(std::string("&xyz;"), decode("&xyz;")); CPPUNIT_ASSERT_EQUAL(std::string("f;"), decode("f;")); CPPUNIT_ASSERT_EQUAL(std::string("f;"), decode("f;")); CPPUNIT_ASSERT_EQUAL(std::string(" ;"), decode(" ;")); CPPUNIT_ASSERT_EQUAL(std::string("&#quot ;"), decode("&#quot ;")); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(WebDAVTest); #endif // ENABLE_UNIT_TESTS namespace { #if 0 } #endif /** * implements one specific source for local testing; * creates "target-config@client-test-" peer config * and source inside it before instantiating the * source */ class WebDAVTest : public RegisterSyncSourceTest { std::string m_server; std::string m_type; std::string m_database; ConfigProps m_props; public: /** * @param server for example, "yahoo", "google" * @param type "caldav", "caldavtodo", "caldavjournal" or "carddav" * @param props sync properties (username, password, syncURL, ...) * or key/value parameters for the testing (testcases) */ WebDAVTest(const std::string &server, const std::string &type, const ConfigProps &props) : RegisterSyncSourceTest(server + "_" + type, // for example, google_caldav props.get(type + "/testconfig", props.get("testconfig", type == "caldav" ? "eds_event" : type == "caldavtodo" ? "eds_task" : type == "caldavjournal" ? "eds_memo" : type == "carddav" ? "eds_contact" : type))), m_server(server), m_type(type), m_props(props) {} std::string getDatabase() const { return m_database; } void setDatabase(const std::string &database) { m_database = database; } virtual void updateConfig(ClientTestConfig &config) const { config.m_type = m_type.c_str(); if (m_type == "caldav") { config.m_supportsReccurenceEXDates = true; } config.m_sourceKnowsItemSemantic = m_type == "caldav" || m_type == "caldavjournal" || m_type == "caldavtodo"; config.m_createSourceA = boost::bind(&WebDAVTest::createSource, this, _2, _4); config.m_createSourceB = boost::bind(&WebDAVTest::createSource, this, _2, _4); ConfigProps::const_iterator it = m_props.find(m_type + "/testcases"); if (it != m_props.end() || (it = m_props.find("testcases")) != m_props.end()) { config.m_testcases = it->second.c_str(); } else if (m_type == "carddav") { // CardDAV uses a non-EDS vCard flavor, so we can't use the // default eds_contact.vcf. config.m_testcases = "testcases/carddav.vcf"; } } // This is very similar to client-test-app.cpp. TODO: refactor?! TestingSyncSource *createSource(const std::string &clientID, bool isSourceA) const { std::string name = m_server + "_" + m_type; const char *server = getenv("CLIENT_TEST_SERVER"); std::string config = "target-config@client-test"; if (server) { config += "-"; config += server; } std::string tracking = string("_") + clientID + string("_") + (isSourceA ? "A" : "B"); SE_LOG_DEBUG(NULL, "instantiating testing source %s in config %s, with tracking name %s", name.c_str(), config.c_str(), tracking.c_str()); boost::shared_ptr context(new SyncConfig(config)); SyncSourceNodes nodes = context->getSyncSourceNodes(name, tracking); // Copy properties from the Client::Sync // @_/ config, to ensure // that a testing source used as part of Client::Sync uses the // same settings. std::string peerName = std::string(server ? server : "no-such-server") + "_" + clientID; boost::shared_ptr peer(new SyncConfig(peerName)); // Resolve credentials. SimpleUserInterface ui(peer->getKeyring()); PasswordConfigProperty::checkPasswords(ui, *peer, PasswordConfigProperty::CHECK_PASSWORD_ALL, boost::assign::list_of(name)); SyncSourceNodes peerNodes = peer->getSyncSourceNodes(name); SE_LOG_DEBUG(NULL, "overriding testing source %s properties with the ones from config %s = %s", name.c_str(), peerName.c_str(), peer->getRootPath().c_str()); BOOST_FOREACH(const ConfigProperty *prop, SyncSourceConfig::getRegistry()) { if (prop->isHidden()) { continue; } boost::shared_ptr node = peerNodes.getNode(*prop); InitStateString value = prop->getProperty(*node); SE_LOG_DEBUG(NULL, " %s = %s (%s)", prop->getMainName().c_str(), value.c_str(), value.wasSet() ? "set" : "default"); node = nodes.getNode(*prop); node->setProperty(prop->getMainName(), value); } // Also copy loglevel. context->setLogLevel(peer->getLogLevel()); context->flush(); // Always set properties taken from the environment. nodes.getProperties()->setProperty("backend", InitStateString(m_type, true)); SE_LOG_DEBUG(NULL, " additional property backend = %s (from CLIENT_TEST_WEBDAV)", m_type.c_str()); BOOST_FOREACH(const StringPair &propval, m_props) { boost::shared_ptr node = context->getNode(propval.first); if (node) { SE_LOG_DEBUG(NULL, " additional property %s = %s (from CLIENT_TEST_WEBDAV)", propval.first.c_str(), propval.second.c_str()); node->setProperty(propval.first, InitStateString(propval.second, true)); } else if (!boost::ends_with(propval.first, "testconfig") && !boost::ends_with(propval.first, "testcases")) { SE_THROW(StringPrintf("invalid property %s=%s set in CLIENT_TEST_WEBDAV for %s %s", propval.first.c_str(), propval.second.c_str(), m_server.c_str(), m_type.c_str())); } } context->flush(); SyncSourceParams params(m_type, nodes, context); SyncSource *ss = SyncSource::createSource(params); ss->setDisplayName(ss->getDisplayName() + (isSourceA ? " #A" : " #B")); return static_cast(ss); } }; /** * creates WebDAV sources by parsing * CLIENT_TEST_WEBDAV= [caldav] [carddav] = ...; ... */ static class WebDAVTestSingleton : RegisterSyncSourceTest { /** * It could be that different sources are configured to use * the same resource (= database property). Get the database * property of each source by instantiating it. Check against * already added entries and if a match is found, record the * link. This enables the Client::Source::xxx::testLinkedSources * test of that previous entry. */ class WebDAVList { list< boost::shared_ptr >m_sources; public: void push_back(const boost::shared_ptr &source) { boost::scoped_ptr instance(source->createSource("1", true)); std::string database = instance->getDatabaseID(); source->setDatabase(database); BOOST_FOREACH (const boost::shared_ptr &other, m_sources) { if (other->getDatabase() == database) { other->m_linkedSources.push_back(source->m_configName); break; } } m_sources.push_back(source); } }; mutable WebDAVList m_sources; public: WebDAVTestSingleton() : RegisterSyncSourceTest("", "") // empty, only purpose is to get init() called {} virtual void updateConfig(ClientTestConfig &config) const {} virtual void init() const { static bool initialized; if (initialized) { return; } initialized = true; const char *env = getenv("CLIENT_TEST_WEBDAV"); if (!env) { return; } std::string settings(env); boost::char_separator sep1(";"); boost::char_separator sep2("\t "); BOOST_FOREACH(const std::string &entry, boost::tokenizer< boost::char_separator >(settings, boost::char_separator(";"))) { std::string server; bool caldav = false, caldavtodo = false, caldavjournal = false, carddav = false; ConfigProps props; BOOST_FOREACH(const std::string &token, boost::tokenizer< boost::char_separator >(entry, boost::char_separator("\t "))) { if (server.empty()) { server = token; } else if (token == "caldav") { caldav = true; } else if (token == "caldavtodo") { caldavtodo = true; } else if (token == "caldavjournal") { caldavjournal = true; } else if (token == "carddav") { carddav = true; } else { size_t pos = token.find('='); if (pos == token.npos) { SE_THROW(StringPrintf("CLIENT_TEST_WEBDAV: unknown keyword %s", token.c_str())); } props[token.substr(0,pos)] = token.substr(pos + 1); } } if (caldav) { boost::shared_ptr ptr(new WebDAVTest(server, "caldav", props)); m_sources.push_back(ptr); } if (caldavtodo) { boost::shared_ptr ptr(new WebDAVTest(server, "caldavtodo", props)); m_sources.push_back(ptr); } if (caldavjournal) { boost::shared_ptr ptr(new WebDAVTest(server, "caldavjournal", props)); m_sources.push_back(ptr); } if (carddav) { boost::shared_ptr ptr(new WebDAVTest(server, "carddav", props)); m_sources.push_back(ptr); } } } } WebDAVTestSingleton; } #endif // ENABLE_DAV SE_END_CXX syncevolution-1.5/src/backends/webdav/syncevo-webdav-lookup.sh0000775000373300001540000001275212405555067026153 0ustar00nightlynightly00000000000000#! /bin/bash # # Copyright (C) 2011 Intel Corporation # # Does DNS SRV and TXT queries to find the full URL, including method # (HTTP or HTTPS), host name, port and path (currently hard-coded to # .well-known/, should use TXT, except that none of the current # services seem to use that either, so couldn't test). # # See http://tools.ietf.org/html/draft-daboo-srv-caldav-10 # # Works with a variety of underlying utilities: # - adnshost # - host # - nslookup # # Usage: syncevo-webdav-lookup.sh carddav|caldav # Stdout: http[s]://:/ # Stderr: error messages indicating failure, empty for success # Return codes: # 1 general error # 2 no DNS utility found # 3 no result for domain # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA # set -o pipefail TYPE=$1 DOMAIN=$2 # Dump diagnostics on exit, if it still exists. LOG=`mktemp` trap "[ -s $LOG ] && ( echo $0 failed to find '$TYPE $DOMAIN':; cat $LOG >&2 ); rm -f $LOG" EXIT # We depend on certain output strings which might be localized. export LC_ALL=C # find one of the supported tools for DNS queries TOOL= ALTERNATIVES="adnshost host /usr/lib/syncevolution/host nslookup" for i in $ALTERNATIVES; do if which $i >/dev/null; then TOOL=$i break fi done if [ ! "$TOOL" ]; then echo "need one of: $ALTERNATIVES" >&2 exit 2 fi # redirect tool errors and commands executed into log; # try HTTPS first for type in ${TYPE}s ${TYPE}; do ( case $type in *s) METHOD=https;; *) METHOD=http;; esac HOSTNAME= PORT= # should be looked up via TXT, currently hard-coded URLPATH=.well-known/$TYPE set -xeo pipefail case $TOOL in adnshost) if res=`$TOOL -Fi -tsrv _$type._tcp.$DOMAIN | tee -a $LOG | grep -e ^_$type._tcp.$DOMAIN -e nxdomain -e permfail`; then # _carddavs._tcp.yahoo.com.cn SRV 1 1 443 carddav.address.yahoo.com misconfig 101 prohibitedcname "DNS alias found where canonical name wanted" ( ) PORT=`echo $res | sed -e 's;.* SRV [^ ]* [^ ]* \([^ ]*\) \([^ ]*\).*;\1;'` HOSTNAME=`echo $res | sed -e 's;.* SRV [^ ]* [^ ]* \([^ ]*\) \([^ ]*\).*;\2;'` else ret=$? if echo "$res" | grep -q -e nxdomain -e permfail; then ret=3 fi exit $ret fi ;; nslookup) if res=`$TOOL -type=srv _$type._tcp.$DOMAIN | tee -a $LOG | grep -e "service =" -e NXDOMAIN -e 'canonical name' | head -1`; then if echo "$res" | grep -q -e NXDOMAIN -e 'canonical name'; then exit 3 else # _caldavs._tcp.yahoo.com service = 1 1 443 caldav.calendar.yahoo.com. PORT=`echo $res | sed -e 's;.*service = [^ ]* [^ ]* \([^ ]*\) \([^ ]*\)\.;\1;'` HOSTNAME=`echo $res | sed -e 's;.*service = [^ ]* [^ ]* \([^ ]*\) \([^ ]*\)\.;\2;'` fi else ret=$? if echo "$res" | grep -q -e NXDOMAIN -e 'canonical name'; then ret=3 fi exit $ret fi ;; host|*/host) # "host -t srv _carddavs._tcp.googleapis.com" returns only alias information. # If we see that instead of the service entry, then we know that the information # is permanently not available. if res=`$TOOL -t srv _$type._tcp.$DOMAIN | tee -a $LOG | grep -e "\" -e NXDOMAIN -e 'is an alias' | head -1`; then if echo "$res" | grep -q -e NXDOMAIN -e 'is an alias'; then exit 3 else # _caldavs._tcp.yahoo.com has SRV record 1 1 443 caldav.calendar.yahoo.com. # _caldavs._tcp.yahoo.com SRV 1 1 443 caldav.calendar.yahoo.com PORT=`echo $res | sed -e 's;.* \([^ ]*\) \([^. ]\+\(\.[^. ]\+\)*\)\.\?;\1;'` HOSTNAME=`echo $res | sed -e 's;.* \([^ ]*\) \([^. ]\+\(\.[^. ]\+\)*\)\.\?;\2;'` fi else ret=$? if echo "$res" | grep -q -e NXDOMAIN -e 'is an alias'; then ret=3 fi exit $ret fi ;; *) echo "unsupported tool $TOOL" exit 1 ;; esac # print result echo $METHOD://$HOSTNAME:$PORT/$URLPATH ) 2>>$LOG ret=$? if [ $ret -eq 0 ]; then # success, discard errrors rm -f $LOG exit 0 fi done # nothing worked exit $ret syncevolution-1.5/src/backends/webdav/README0000644000373300001540000003242312360741064022216 0ustar00nightlynightly00000000000000Usage ===== The "webdav" backend provides sync sources for CalDAV and CardDAV. They can be selected with backend=CalDAV resp. backend=CardDAV. In contrast to other backends, these sources need additional information about a peer: * syncURL: Specifies URL of calendar or contacts collection. %u gets replaced with the username. A ?SyncEvolution=,,... parameter provides further control. Currently implemented keywords: UpdateHack = work around Google's REV CalDAV quirks AlarmHack = when storing a VEVENT without VALARM, store it multiple times, because otherwise Google Calendar adds a default alarm Google = enables all hacks needed for Google Specifying a syncURL is optional. If not given, then DNS SRV lookups based on the domain name in the username are used to find the right host. In theory, .well-known URIs are then used to find the right path on that host, but in practice none of the peers that were tested (Google and Yahoo) seemed to support that. Therefore the code contains a fallback for well-known Yahoo paths when .well-known URIs fail. * username/password: credentials, if available use the email address (needed for auto discovery of CalDAV or CardDAV server) They also use: * loglevel: >= 3: basic logging of HTTP traffic >= 4: also logging of HTTP body >= 5: also SSL and WebDAV lock handling >= 6: detailed information about XML parsing >= 11: plaintext HTTP authentication The recommended way of using the CalDAV and CardDAV backends is to configure a context with the "target-config" peer inside it. Such a context then can be used as part of a local sync with other sources. See the Google section below for examples. Multiple calendars/address books ================================ This is not yet implemented. The code always ends up picking the default collection. Eventually the goal is to enable: 1. listing of available collections 2. selecting them via the "database" property Only the second point is currently implemented. The "database" property now can hold the final URL of the collection (aka database) on the WebDAV server which is used for the source. Setting it skips the entire auto-discovery process, which makes access quite a bit faster and more reliable. Because most UIs won't know initially how to find these URLs (listing them not supported by the core SyncEvolution) and/or won't have the necessary user dialogs, the property is set automatically after a successful sync. This avoids the accidental switching between databases when the user adds or removes databases on the server (which can lead to different results of the auto discovery). There's still no guarantee that the database picked by default is the "right" one. That can only be solved in the UI because servers typically don't have a "default" or "personal" flag for their collections. Concurrency =========== The original plan was to lock the server's collection while manipulating it during a sync. But Google Calendar does not support locks, so that was not pursued further. An alternative would be to run a sync without locking and detect concurrent modifications, but that is not implemented yet. Therefore it is possible (although not likely) that changes get lost when some other client changes an item after SyncEvolution started a sync and before that same item gets modified by SyncEvolution as part of that sync. Change tracking itself copes with changes made while a sync runs. They'll be synchronized as part of the next sync. Google ====== Google supports CalDAV access to its calendars. Several quirks were encountered, which SyncEvolution tries to work around as good as possible. Use syncURL=https://www.google.com/calendar/dav/%u/user/?SyncEvolution=Google to enable these workarounds. # create context for accessing Google CalDAV server, # not visible in sync UI (consumerReady = 0): syncevolution --configure \ --template SyncEvolution \ backend=CalDAV \ syncURL=https://www.google.com/calendar/dav/%u/user/?SyncEvolution=Google \ username= \ password= \ consumerReady=0 \ target-config@google calendar # list events in the server syncevolution --print-items target-config@google calendar # show the content of these events on stdout syncevolution --export - target-config@google calendar # set up synchronization, using "google-calendar" as peer name # because "google" is typically used for the SyncML-based # contact sync, which uses a different syncURL; # username/password can be left empty to use the credentials # configured above syncevolution --configure \ --template "SyncEvolution Client" \ syncURL=local://@google \ consumerReady=1 \ username= \ password= \ google-calendar calendar # run a sync for the first time (allow slow sync) syncevolution --sync slow google-calendar # normal sync, also possible via sync UI syncevolution google-calendar Yahoo ===== Yahoo supports both CalDAV and CardDAV. CalDAV is available at this time (beginning 2011) if and only if the user has switched to the "Yahoo! Calendar Beta". It is stable enough to be useful. CardDAV works in read/write mode, but has severe limitations: * Contacts sent by Yahoo encode special characters with HTML/XML entities, in one case even multiple times (\ -> \ -> &#92;). At the moment SyncEvolution unconditionally works around that by replacing these entities, which is wrong for servers working correctly. * Contacts are sent with UTF-8 encoding by Yahoo, but uploading such contacts leads to non-ASCII characters being replaced with a question mark on the server. Both of these issues can be reproduced with iOS 4 when configuring Yahoo as generic CardDAV server. Yahoo uses different hosts for CalDAV and CardDAV. Leave the syncURL empty and use the @yahoo email address as username to let the backend do the host lookup. # configure CalDAV and CardDAV with Yahoo, # with host lookup via the domain in the username syncevolution --configure \ --template SyncEvolution \ calendar/backend=CalDAV \ addressbook/backend=CardDAV \ syncURL= \ username= \ password= \ consumerReady=0 \ target-config@yahoo addressbook calendar # list items, use "--export -" to see content syncevolution --print-items target-config@yahoo calendar syncevolution --print-items target-config@yahoo addressbook # configure synchronization, with addressbook not enabled syncevolution --configure \ --template "SyncEvolution Client" \ addressbook/sync=disabled \ syncURL=local://@yahoo \ username= \ password= \ yahoo addressbook calendar Debugging/Troubleshooting ========================= Run the commands above with "loglevel=4" or higher. Set SYNCEVOLUTION_DEBUG=1 to see the full neon output directly (instead of having it filtered and, if present, written into a logfile) and run the operation locally with --daemon=no (instead of inside the syncevo-dbus-server). Example: SYNCEVOLUTION_DEBUG=1 syncevolution --daemon=no loglevel=4 --print-items @google calendar Each sync produces two log files, one for the main config ("google-calendar"), one for the target config ("target-config@google"). It is possible to choose different log levels: syncevolution --run \ loglevel=1 \ loglevel@google=11 \ google-calendar Occassionally Google Calendar gets confused and reports VEVENTs in response to a REPORT which then are not returned for a GET. Symptoms of that are: [ERROR @google] @google/calendar: event not found SyncEvolution tries hard to avoid such situations, but some calendars already seem to be in such a state to begin with. Deleting offending events via the web interface helps in such cases. When running under debugger, then beware that the WebDAV part runs inside a forked process. Use gdb's "set follow-fork-mode child" to enter the child. Make sure that you don't accidentally follow execution into one of the external shell commands: $ gdb ./syncevolution (gdb) set follow-fork-mode child (gdb) b SyncEvo::LocalTransportAgent::run Breakpoint 1 at 0x846755: file /home/pohly/syncevolution/syncevolution/src/syncevo/LocalTransportAgent.cpp, line 159. (gdb) run --daemon=no --run google-calendar Starting program: /home/pohly/work/syncevolution/src/syncevolution --daemon=no --run google-calendar [Thread debugging using libthread_db enabled] [INFO] @default/addressbook: inactive [INFO] @default/calendar+todo: inactive [INFO] @default/memo: inactive [INFO] @default/todo: inactive [New process 4655] [Thread debugging using libthread_db enabled] [Switching to Thread 0x7ffff7fc27e0 (LWP 4655)] Breakpoint 1, SyncEvo::LocalTransportAgent::run (this=0xc2a310) at /home/pohly/syncevolution/syncevolution/src/syncevo/LocalTransportAgent.cpp:159 159 const char *delay = getenv("SYNCEVOLUTION_LOCAL_CHILD_DELAY"); (gdb) set follow-fork-mode parent (gdb) b SyncEvo::CalDAVSource::readSubItem Breakpoint 2 at 0x69d47c: file /home/pohly/syncevolution/syncevolution/src/backends/webdav/CalDAVSource.cpp, line 382. (gdb) c Continuing. [...] Breakpoint 2, SyncEvo::CalDAVSource::readSubItem (this=0xec7430, davLUID=..., subid=..., item=...) at /home/pohly/syncevolution/syncevolution/src/backends/webdav/CalDAVSource.cpp:382 382 Event &event = loadItem(davLUID); (gdb) ... Alternatively, setting SYNCEVOLUTION_LOCAL_CHILD_DELAY= in the environment and the attaching to the second "syncevolution" process also works. Implementation ============== The neon library is used for HTTP/WebDAV. CalDAV and CardDAV queries can be done with it, although not supported directly. SyncEvolution's NeonCXX provides a C++ API on top of neon, with exceptions thrown for errors, Boost function pointers for callbacks and handles that track the underlying pointers. WebDAVSource contains the main WebDAV logic. It is customized via virtual methods by derived CalDAVSource and CardDAVSource whenever necessary. These sources use the resource name/ETag pair to detect changes. So for CardDAV retrieving the meta information is sufficient to detect changes. With CalDAV the situation is a bit more complex. A CalDAV item contains multiple VEVENTs, whereas SyncEvolution works on one VEVENT at a time during synchronization. The MapSyncSource uses a CalDAVSource and exposes calendar data with one VEVENT per item. MapSyncSource is generic enough to be used by sources which implement the SubSyncSource interface. The downside is that the number of VEVENTs inside each CalDAV item and their UID/RECURRENCE-ID properties need to be known before a sync. In the default mode of SyncEvolution (with automatic data backups before and after a sync), this additional information is collected as part of creating the backup, so no additional overhead is incurred, but when disabling backups, a sync still needs to download the calendar data first. In theory, CalDAV can report just the necessary UID/RECURRENCE-ID properties and SyncEvolution uses that, but in practice, servers return the full data. DNS SRV lookup is implemented using the syncevo-webdav-lookup utility script which calls "host", "adnshost" or "nslookup", depending on what is available. This approach avoids a hard dependency on a specfic resolver library and (for some of these) writing quite a bit of additional code. Testing ======= Testing via client-test is possible for the Client::Source tests. They cover importing/exporting of items and change tracking. client-test needs to be told in the CLIENT_TEST_WEBDAV env variable which CalDAV or CardDAV servers are available and the sync properties for them. It then creates a suitable "target-config@client-test-" config with "caldav" and/or "carddav" sources. Sync properties can be specified; if not given, the relevant ones must be set inside that config already. In addition to sync properties, the following properties can be used to influence the test setup itself: testconfig = name of a test config known to ClientTest::getTestData(), default is "eds_contact" (for CardDAV) and "eds_event" (for CalDAV) testcases = name of file holding data for testImport (eds_contact.vcf and eds_event.ics) The format of CLIENT_TEST_WEBDAV is: [caldav] [carddav] [] = ...; ... = sync property or [caldav/carddav/]/testcases Example: env PATH=backends/webdav/:$PATH \ "CLIENT_TEST_WEBDAV= yahoo caldav carddav username= password= caldav/testcases=testcases/yahoo_event.ics carddav/testcases=testcases/yahoo_contact.vcf ; google caldav username= password= testcases=testcases/google_event.ics syncURL=https://www.google.com/calendar/dav/%u/user/?SyncEvolution=Google" \ ./client-test \ Client::Source::yahoo_caldav::testOpen \ Client::Source::yahoo_carddav::testOpen \ Client::Source::google_caldav::testOpen Note that this assumes that the test is run inside the "src" directory without installing it, so the PATH must include the backend dir which contains syncevo-webdav-lookup. syncevolution-1.5/src/backends/webdav/webdav.am0000664000373300001540000000411612363142310023115 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ src/backends/webdav/configure-sub.in \ src/backends/webdav/WebDAVSourceRegister.cpp \ src/backends/webdav/syncevo-webdav-lookup.sh \ src/backends/webdav/README src_backends_webdav_lib = src/backends/webdav/syncdav.la MOSTLYCLEANFILES += $(src_backends_webdav_lib) if ENABLE_MODULES src_backends_webdav_backenddir = $(BACKENDS_DIRECTORY) src_backends_webdav_backend_LTLIBRARIES = $(src_backends_webdav_lib) else noinst_LTLIBRARIES += $(src_backends_webdav_lib) endif bin_SCRIPTS += src/syncevo-webdav-lookup CLEANFILES += src/syncevo-webdav-lookup src/syncevo-webdav-lookup: $(top_srcdir)/src/backends/webdav/syncevo-webdav-lookup.sh $(AM_V_GEN) rm -f $@ && cp $< $@ && chmod a+rx $@ src_backends_webdav_src = \ src/backends/webdav/CalDAVSource.h \ src/backends/webdav/CalDAVSource.cpp \ src/backends/webdav/CalDAVVxxSource.h \ src/backends/webdav/CalDAVVxxSource.cpp \ src/backends/webdav/CardDAVSource.h \ src/backends/webdav/CardDAVSource.cpp \ src/backends/webdav/WebDAVSource.h \ src/backends/webdav/WebDAVSource.cpp \ src/backends/webdav/NeonCXX.h \ src/backends/webdav/NeonCXX.cpp src_backends_webdav_syncdav_la_SOURCES = $(src_backends_webdav_src) src_backends_webdav_syncdav_la_LIBADD = $(NEON_LIBS) $(SYNCEVOLUTION_LIBS) $(LIBICAL_LIBS) src_backends_webdav_syncdav_la_LDFLAGS = -module -avoid-version src_backends_webdav_syncdav_la_CXXFLAGS = $(NEON_CFLAGS) $(SYNCEVO_WFLAGS) $(LIBICAL_CFLAGS) src_backends_webdav_syncdav_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_webdav_syncdav_la_DEPENDENCIES = src/syncevo/libsyncevolution.la if NEON_COMPATIBILITY all_local_installchecks += webdav_so_check endif WEBDAV_SO_CHECK_FILES = $(DESTDIR)/$(bindir)/syncevolution if ENABLE_MODULES WEBDAV_SO_CHECK_FILES += $(DESTDIR)/$(src_backends_webdav_backenddir)/syncdav.so endif webdav_so_check: for i in $(WEBDAV_SO_CHECK_FILES); do \ if [ -e $$i ]; then \ if ldd $$i | grep libneon; then \ echo $$i should not be linked against libneon; exit 1; \ fi; \ else \ echo $$i not found; exit 1; \ fi \ done syncevolution-1.5/src/backends/webdav/CalDAVSource.h0000644000373300001540000001740112326412403023713 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #ifndef INCL_CALDAVSOURCE #define INCL_CALDAVSOURCE #include #ifdef ENABLE_DAV #include "WebDAVSource.h" #include #include #include #include #include #include SE_BEGIN_CXX class CalDAVSource : public WebDAVSource, public SubSyncSource, public SyncSourceLogging { public: CalDAVSource(const SyncSourceParams ¶ms, const boost::shared_ptr &settings); /* implementation of SyncSourceSerialize interface */ virtual std::string getMimeType() const { return "text/calendar"; } virtual std::string getMimeVersion() const { return "2.0"; } /* implementation of SubSyncSource interface */ virtual void begin() { contactServer(); } virtual void endSubSync(bool success) { if (success) { storeServerInfos(); } } virtual std::string subDatabaseRevision() { return databaseRevision(); } virtual void listAllSubItems(SubRevisionMap_t &revisions); virtual void updateAllSubItems(SubRevisionMap_t &revisions); virtual void setAllSubItems(const SubRevisionMap_t &revisions); virtual SubItemResult insertSubItem(const std::string &uid, const std::string &subid, const std::string &item); virtual void readSubItem(const std::string &uid, const std::string &subid, std::string &item); virtual std::string removeSubItem(const string &uid, const std::string &subid); virtual void removeMergedItem(const std::string &luid); virtual void flushItem(const string &uid); virtual std::string getSubDescription(const string &uid, const string &subid); // implementation of SyncSourceLogging callback virtual std::string getDescription(const string &luid); /** * Dump each resource item unmodified into the given directory. * The ConfigNode stores the luid/etag mapping. */ void backupData(const SyncSource::Operations::ConstBackupInfo &oldBackup, const SyncSource::Operations::BackupInfo &newBackup, BackupReport &report); /** * Restore database from data stored in backupData(). Will be * called inside open()/close() pair. beginSync() is *not* called. */ void restoreData(const SyncSource::Operations::ConstBackupInfo &oldBackup, bool dryrun, SyncSourceReport &report); // disambiguate getSynthesisAPI() SDKInterface *getSynthesisAPI() const { return SubSyncSource::getSynthesisAPI(); } protected: // implementation of WebDAVSource callbacks virtual std::string serviceType() const { return "caldav"; } virtual bool typeMatches(const StringMap &props) const; virtual std::string homeSetProp() const { return "urn:ietf:params:xml:ns:caldav:calendar-home-set"; } virtual std::string wellKnownURL() const { return "/.well-known/caldav"; } virtual std::string contentType() const { return "text/calendar; charset=utf-8"; } virtual std::string suffix() const { return ".ics"; } virtual std::string getContent() const { return "VEVENT"; } virtual bool getContentMixed() const { return true; } private: /** * Information about each merged item. */ class Event : boost::noncopyable { public: Event() : m_sequence(0), m_lastmodtime(0) {} /** the ID used by WebDAVSource */ std::string m_DAVluid; /** the iCalendar 2.0 UID */ std::string m_UID; /** revision string in WebDAVSource */ std::string m_etag; /** maximum sequence number of any sub item */ long m_sequence; /** maximum modification time of any sub item */ time_t m_lastmodtime; /** * the list of simplified RECURRENCE-IDs (without time zone, * see icalTime2Str()), empty string for VEVENT without * RECURRENCE-ID */ std::set m_subids; /** * parsed VCALENDAR component representing the current * state of the item as it exists on the WebDAV server, * must be kept up-to-date as we make changes, may be NULL */ eptr m_calendar; /** * clean up calendar directly after receiving it from peer: * RECURRENCE-ID in UTC, remove X-LIC-ERROR */ static void fixIncomingCalendar(icalcomponent *calendar); /** date-time as string, without time zone */ static std::string icalTime2Str(const icaltimetype &tt); /** RECURRENCE-ID, empty if none */ static std::string getSubID(icalcomponent *icomp); /** SEQUENCE number, 0 if none */ static int getSequence(icalcomponent *icomp); static void setSequence(icalcomponent *icomp, int sequenceval); /** UID, empty if none */ static std::string getUID(icalcomponent *icomp); static void setUID(icalcomponent *icomp, const std::string &uid); /** rename RECURRENCE-ID to X-SYNCEVOLUTION-RECURRENCE-ID and vice versa */ static void escapeRecurrenceID(std::string &data); static void unescapeRecurrenceID(std::string &data); }; /** * A cache of information about each merged item. Maps from * WebDAVSource local ID to Event. Items in the cache are in the * format as expected by the local side, with RECURRENCE-ID. * * This is not necessarily how the data is sent to the server: * - RECURRENCE-ID in an item which has no master event * is replaced by X-SYNCEVOLUTION-RECURRENCE-ID because * Google gets confused by a single detached event without * parent (Event::escapeRecurrenceID()). * * When retrieving an EVENT from the server this is substituted * again before parsing (depends on server preserving X- * extensions, see Event::unescapeRecurrenceID()). */ class EventCache : public std::map > { public: EventCache() : m_initialized(false) {} bool m_initialized; iterator findByUID(const std::string &uid); } m_cache; Event &findItem(const std::string &davLUID); Event &loadItem(const std::string &davLUID); Event &loadItem(Event &event); std::string getSubDescription(Event &event, const string &subid); /** calback for multiget: same as appendItem, but also records luid of all responses */ int appendMultigetResult(SubRevisionMap_t &revisions, std::set &luids, const std::string &href, const std::string &etag, std::string &data); /** callback for listAllSubItems: parse and add new item */ int appendItem(SubRevisionMap_t &revisions, const std::string &href, const std::string &etag, std::string &data); /** callback for backupData(): dump into backup */ int backupItem(ItemCache &cache, const std::string &href, const std::string &etag, std::string &data); /** callback for loadItem(): store right item from REPORT */ int storeItem(const std::string &wantedLuid, std::string &item, std::string &data, const std::string &href); /** add to m_cache */ void addSubItem(const std::string &luid, const SubRevisionEntry &entry); /** store as luid + revision */ void addResource(StringMap &items, const std::string &href, const std::string &etag); }; SE_END_CXX #endif // ENABLE_DAV #endif // INCL_CALDAVSOURCE syncevolution-1.5/src/backends/webdav/CalDAVSource.cpp0000644000373300001540000017115112360741064024257 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #include "config.h" #ifdef ENABLE_DAV // include first, it sets HANDLE_LIBICAL_MEMORY for us #include #include "CalDAVSource.h" #include #include #include SE_BEGIN_CXX /** * @return "" if subid is empty, otherwise subid */ static std::string SubIDName(const std::string &subid) { return subid.empty() ? "" : subid; } /** remove X-SYNCEVOLUTION-EXDATE-DETACHED from VEVENT */ static void removeSyncEvolutionExdateDetached(icalcomponent *parent) { icalproperty *prop = icalcomponent_get_first_property(parent, ICAL_ANY_PROPERTY); while (prop) { icalproperty *next = icalcomponent_get_next_property(parent, ICAL_ANY_PROPERTY); const char *xname = icalproperty_get_x_name(prop); if (xname && !strcmp(xname, "X-SYNCEVOLUTION-EXDATE-DETACHED")) { icalcomponent_remove_property(parent, prop); icalproperty_free(prop); } prop = next; } } CalDAVSource::CalDAVSource(const SyncSourceParams ¶ms, const boost::shared_ptr &settings) : WebDAVSource(params, settings) { SyncSourceLogging::init(InitList("SUMMARY") + "LOCATION", ", ", m_operations); // override default backup/restore from base class with our own // version m_operations.m_backupData = boost::bind(&CalDAVSource::backupData, this, _1, _2, _3); m_operations.m_restoreData = boost::bind(&CalDAVSource::restoreData, this, _1, _2, _3); } void CalDAVSource::listAllSubItems(SubRevisionMap_t &revisions) { revisions.clear(); const std::string query = "\n" "\n" "\n" "\n" // In practice, peers always return the full data dump // even if asked to return only a subset. Therefore we use this // REPORT to populate our m_cache instead of sending lots of GET // requests later on: faster sync, albeit with higher // memory consumption. // // Because incremental syncs typically don't use listAllSubItems(), // this looks like a good trade-off. #ifdef SHORT_ALL_SUB_ITEMS_DATA "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" #else "\n" #endif "\n" // filter expected by Yahoo! Calendar "\n" "\n" "\n" "\n" "\n" "\n" "\n"; Timespec deadline = createDeadline(); getSession()->startOperation("REPORT 'meta data'", deadline); while (true) { string data; Neon::XMLParser parser; parser.initReportParser(boost::bind(&CalDAVSource::appendItem, this, boost::ref(revisions), _1, _2, boost::ref(data))); m_cache.clear(); m_cache.m_initialized = false; parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:caldav", "calendar-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(data), _2, _3)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } } m_cache.m_initialized = true; } void CalDAVSource::addResource(StringMap &items, const std::string &href, const std::string &etag) { std::string davLUID = path2luid(Neon::URI::parse(href).m_path); items[davLUID] = ETag2Rev(etag); } void CalDAVSource::updateAllSubItems(SubRevisionMap_t &revisions) { // list items to identify new, updated and removed ones const std::string query = "\n" "\n" "\n" "\n" "\n" // filter expected by Yahoo! Calendar "\n" "\n" "\n" "\n" "\n" "\n" "\n"; Timespec deadline = createDeadline(); StringMap items; getSession()->startOperation("updateAllSubItems REPORT 'list items'", deadline); while (true) { string data; Neon::XMLParser parser; items.clear(); parser.initReportParser(boost::bind(&CalDAVSource::addResource, this, boost::ref(items), _1, _2)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } } // remove obsolete entries SubRevisionMap_t::iterator it = revisions.begin(); while (it != revisions.end()) { SubRevisionMap_t::iterator next = it; ++next; if (items.find(it->first) == items.end()) { revisions.erase(it); } it = next; } // build list of new or updated entries, // copy others to cache m_cache.clear(); m_cache.m_initialized = false; std::list mustRead; BOOST_FOREACH(const StringPair &item, items) { SubRevisionMap_t::iterator it = revisions.find(item.first); if (it == revisions.end() || it->second.m_revision != item.second) { // read current information below SE_LOG_DEBUG(NULL, "updateAllSubItems(): read new or modified item %s", item.first.c_str()); mustRead.push_back(item.first); // The server told us that the item exists. We still need // to deal with the situation that the server might fail // to deliver the item data when we ask for it below. // // There are two reasons when this can happen: either an // item was removed in the meantime or the server is // confused. The latter started to happen reliably with // the Google Calendar server sometime in January/February // 2012. // // In both cases, let's assume that the item is really gone // (and not just unreadable due to that other Google Calendar // bug, see loadItem()+REPORT workaround), and therefore let's // remove the entry from the revisions. if (it != revisions.end()) { revisions.erase(it); } m_cache.erase(item.first); } else { // copy still relevant information SE_LOG_DEBUG(NULL, "updateAllSubItems(): unmodified item %s", it->first.c_str()); addSubItem(it->first, it->second); } } // request dump of these items, add to cache and revisions // // Failures to find or read certain items will be // ignored. appendItem() will only be called for actually // retrieved items. This is partly intentional: Google is known to // have problems with providing all of its data via GET or the // multiget REPORT below. It returns a 404 error for items that a // calendar-query includes (see loadItem()). Such items are // ignored and thus will be silently skipped. This is not // perfect, but better than failing the sync. // // Unfortunately there are other servers (Radicale, I'm looking at // you) which simply return neither data nor errors for the // requested hrefs. To handle that we try the multiget first, // record retrieved or failed responses, then follow up with // individual requests for anything that wasn't mentioned. if (!mustRead.empty()) { std::stringstream buffer; buffer << "\n" "\n" "\n" " \n" " \n" "\n"; BOOST_FOREACH(const std::string &luid, mustRead) { buffer << "" << luid2path(luid) << "\n"; } buffer << ""; std::string query = buffer.str(); std::set results; // LUIDs of all hrefs returned by report getSession()->startOperation("updateAllSubItems REPORT 'multiget new/updated items'", deadline); while (true) { string data; Neon::XMLParser parser; parser.initReportParser(boost::bind(&CalDAVSource::appendMultigetResult, this, boost::ref(revisions), boost::ref(results), _1, _2, boost::ref(data))); parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:caldav", "calendar-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(data), _2, _3)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } } // Workaround for Radicale 0.6.4: it simply returns nothing (no error, no data). // Fall back to GET of items with no response. BOOST_FOREACH(const std::string &luid, mustRead) { if (results.find(luid) == results.end()) { getSession()->startOperation(StringPrintf("GET item %s not returned by 'multiget new/updated items'", luid.c_str()), deadline); std::string path = luid2path(luid); std::string data; std::string etag; while (true) { data.clear(); Neon::Request req(*getSession(), "GET", path, "", data); req.addHeader("Accept", contentType()); if (req.run()) { etag = getETag(req); break; } } appendItem(revisions, path, etag, data); } } } } int CalDAVSource::appendMultigetResult(SubRevisionMap_t &revisions, std::set &luids, const std::string &href, const std::string &etag, std::string &data) { // record which items were seen in the response... luids.insert(path2luid(href)); // and store information about them return appendItem(revisions, href, etag, data); } int CalDAVSource::appendItem(SubRevisionMap_t &revisions, const std::string &href, const std::string &etag, std::string &data) { // Ignore responses with no data: this is not perfect (should better // try to figure out why there is no data), but better than // failing. // // One situation is the response for the collection itself, // which comes with a 404 status and no data with Google Calendar. if (data.empty()) { return 0; } Event::unescapeRecurrenceID(data); eptr calendar(icalcomponent_new_from_string((char *)data.c_str()), // cast is a hack for broken definition in old libical "iCalendar 2.0"); Event::fixIncomingCalendar(calendar.get()); std::string davLUID = path2luid(Neon::URI::parse(href).m_path); SubRevisionEntry &entry = revisions[davLUID]; entry.m_revision = ETag2Rev(etag); long maxSequence = 0; std::string uid; entry.m_subids.clear(); for (icalcomponent *comp = icalcomponent_get_first_component(calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(calendar, ICAL_VEVENT_COMPONENT)) { std::string subid = Event::getSubID(comp); uid = Event::getUID(comp); long sequence = Event::getSequence(comp); if (sequence > maxSequence) { maxSequence = sequence; } entry.m_subids.insert(subid); } entry.m_uid = uid; // Ignore items which contain no VEVENT. Happens with Google Calendar // after using it for a while. Deleting them via DELETE doesn't seem // to have an effect either, so all we really can do is ignore them. if (entry.m_subids.empty()) { SE_LOG_DEBUG(NULL, "ignoring broken item %s (is empty)", davLUID.c_str()); revisions.erase(davLUID); m_cache.erase(davLUID); data.clear(); return 0; } if (!m_cache.m_initialized) { boost::shared_ptr event(new Event); event->m_DAVluid = davLUID; event->m_UID = uid; event->m_etag = entry.m_revision; event->m_subids = entry.m_subids; event->m_sequence = maxSequence; #ifndef SHORT_ALL_SUB_ITEMS_DATA // we got a full data dump, use it for (icalcomponent *comp = icalcomponent_get_first_component(calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(calendar, ICAL_VEVENT_COMPONENT)) { } event->m_calendar = calendar; #endif m_cache.insert(make_pair(davLUID, event)); } // reset data for next item data.clear(); return 0; } void CalDAVSource::addSubItem(const std::string &luid, const SubRevisionEntry &entry) { boost::shared_ptr &event = m_cache[luid]; event.reset(new Event); event->m_DAVluid = luid; event->m_etag = entry.m_revision; event->m_UID = entry.m_uid; // We don't know sequence and last-modified. This // information will have to be filled in by loadItem() // when some operation on this event needs it. event->m_subids = entry.m_subids; } void CalDAVSource::setAllSubItems(const SubRevisionMap_t &revisions) { if (!m_cache.m_initialized) { // populate our cache (without data) from the information cached // for us BOOST_FOREACH(const SubRevisionMap_t::value_type &subentry, revisions) { addSubItem(subentry.first, subentry.second); } m_cache.m_initialized = true; } } SubSyncSource::SubItemResult CalDAVSource::insertSubItem(const std::string &luid, const std::string &callerSubID, const std::string &item) { SubItemResult subres; // parse new event boost::shared_ptr newEvent(new Event); newEvent->m_calendar.set(icalcomponent_new_from_string((char *)item.c_str()), // hack for old libical "parsing iCalendar 2.0"); // Google Calendar adds a default alarm each time a VEVENT is // added anew. Avoid that by adding a dummy VALARM with // ACTION=NONE. Must include a fake TRIGGER. This is what iOS // does. icalcomponent *event; if (settings().googleAlarmHack() && (event = icalcomponent_get_first_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT)) != NULL && !icalcomponent_get_first_component(event, ICAL_VALARM_COMPONENT)) { static eptr alarm(icalcomponent_new_from_string("BEGIN:VALARM\r\n" "ACTION:NONE\r\n" "DESCRIPTION:ignore me\r\n" "TRIGGER:-PT1H\r\n" "END:VALARM"), "dummy VALARM"); icalcomponent_add_component(event, icalcomponent_new_clone(alarm)); } struct icaltimetype lastmodtime = icaltime_null_time(); icalcomponent *firstcomp = NULL; for (icalcomponent *comp = firstcomp = icalcomponent_get_first_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT)) { std::string subid = Event::getSubID(comp); EventCache::iterator it; // remove X-SYNCEVOLUTION-EXDATE-DETACHED, could be added by // the engine's read/modify/write cycle when resolving a // conflict removeSyncEvolutionExdateDetached(comp); if (!luid.empty() && (it = m_cache.find(luid)) != m_cache.end()) { // Additional sanity check: ensure that the expected UID is set. // Necessary if the peer we synchronize with (aka the local // data storage) doesn't support foreign UIDs. Maemo 5 calendar // backend is one example. Event::setUID(comp, it->second->m_UID); newEvent->m_UID = it->second->m_UID; } else { newEvent->m_UID = Event::getUID(comp); if (newEvent->m_UID.empty()) { // create new UID newEvent->m_UID = UUID(); Event::setUID(comp, newEvent->m_UID); } } newEvent->m_sequence = Event::getSequence(comp); newEvent->m_subids.insert(subid); // set DTSTAMP to LAST-MODIFIED in replacement // // Needed because Google insists on replacing the original // DTSTAMP and checks it (409, "Can only store an event with // a newer DTSTAMP"). // // According to RFC 2445, the property is set once when the // event is created for the first time. RFC 5545 extends this // and states that without a METHOD property (the case with // CalDAV), DTSTAMP is identical to LAST-MODIFIED, so Google // is right. icalproperty *dtstamp = icalcomponent_get_first_property(comp, ICAL_DTSTAMP_PROPERTY); if (dtstamp) { icalproperty *lastmod = icalcomponent_get_first_property(comp, ICAL_LASTMODIFIED_PROPERTY); if (lastmod) { lastmodtime = icalproperty_get_lastmodified(lastmod); icalproperty_set_dtstamp(dtstamp, lastmodtime); } } } if (newEvent->m_subids.size() != 1) { SE_THROW("new CalDAV item did not contain exactly one VEVENT"); } std::string subid = *newEvent->m_subids.begin(); // Determine whether we already know the merged item even though // our caller didn't. std::string davLUID = luid; std::string knownSubID = callerSubID; if (davLUID.empty()) { EventCache::iterator it = m_cache.findByUID(newEvent->m_UID); if (it != m_cache.end()) { davLUID = it->first; knownSubID = subid; } } if (davLUID.empty()) { // New VEVENT; should not be part of an existing merged item // ("meeting series"). // // If another app created a resource with the same UID, // then two things can happen: // 1. server merges the data (Google) // 2. adding the item is rejected (standard compliant CalDAV server) // // If the UID is truely new, then // 3. the server may rename the item // // The following code deals with case 3 and also covers case // 1, but our usual Google workarounds (for example, no // patching of SEQUENCE) were not applied and thus sending the // item might fail. // // Case 2 is not currently handled and causes the sync to fail. // This is in line with the current design ("concurrency detected, // causes error, fixed by trying again in slow sync"). InsertItemResult res; // Yahoo expects resource names to match UID + ".ics". std::string name = newEvent->m_UID + ".ics"; std::string buffer; SE_LOG_DEBUG(getDisplayName(), "inserting new VEVENT"); eptr icalstr(ical_strdup(icalcomponent_as_ical_string(newEvent->m_calendar))); std::string data = icalstr.get(); res = insertItem(name, data, true); subres.m_mainid = res.m_luid; subres.m_uid = newEvent->m_UID; subres.m_subid = subid; subres.m_revision = res.m_revision; EventCache::iterator it = m_cache.find(res.m_luid); if (it != m_cache.end()) { // merge into existing Event Event &event = loadItem(*it->second); event.m_etag = res.m_revision; if (event.m_subids.find(subid) != event.m_subids.end()) { // was already in that item but caller didn't seem to know, // and now we replaced the data on the CalDAV server subres.m_state = ITEM_REPLACED; } else { // add to merged item event.m_subids.insert(subid); } icalcomponent_merge_component(event.m_calendar, newEvent->m_calendar.release()); // function destroys merged calendar } else { // add to cache without further changes newEvent->m_DAVluid = res.m_luid; newEvent->m_etag = res.m_revision; m_cache[newEvent->m_DAVluid] = newEvent; } } else { if (!subid.empty() && subid != knownSubID) { SE_THROW(StringPrintf("new CalDAV item does not have right RECURRENCE-ID: item %s != expected %s", subid.c_str(), knownSubID.c_str())); } Event &event = loadItem(davLUID); if (subid.empty() && subid != knownSubID) { // fix incomplete iCalendar 2.0 item: should have had a RECURRENCE-ID icalcomponent *newcomp = icalcomponent_get_first_component(newEvent->m_calendar, ICAL_VEVENT_COMPONENT); icalproperty *prop = icalcomponent_get_first_property(newcomp, ICAL_RECURRENCEID_PROPERTY); if (prop) { icalcomponent_remove_property(newcomp, prop); icalproperty_free(prop); } // reconstruct RECURRENCE-ID with known value and TZID from start time of // the parent event or (if not found) the current event eptr rid(icalproperty_new_recurrenceid(icaltime_from_string(knownSubID.c_str())), "new rid"); icalproperty *dtstart = NULL; icalcomponent *comp; // look for parent first for (comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp && !dtstart; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (!icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY)) { dtstart = icalcomponent_get_first_property(comp, ICAL_DTSTART_PROPERTY); } } // fall back to current event if (!dtstart) { dtstart = icalcomponent_get_first_property(newcomp, ICAL_DTSTART_PROPERTY); } // ignore missing TZID if (dtstart) { icalparameter *tzid = icalproperty_get_first_parameter(dtstart, ICAL_TZID_PARAMETER); if (tzid) { icalproperty_set_parameter(rid, icalparameter_new_clone(tzid)); } } // finally add RECURRENCE-ID and fix newEvent's meta information icalcomponent_add_property(newcomp, rid.release()); subid = knownSubID; newEvent->m_subids.erase(""); newEvent->m_subids.insert(subid); } // no changes expected yet, copy previous attributes subres.m_mainid = davLUID; subres.m_uid = event.m_UID; subres.m_subid = subid; subres.m_revision = event.m_etag; // Google hack: increase sequence number if smaller or equal to // sequence on server. Server rejects update otherwise. // See http://code.google.com/p/google-caldav-issues/issues/detail?id=26 if (settings().googleUpdateHack()) { // always bump SEQ by one before PUT event.m_sequence++; if (newEvent->m_sequence < event.m_sequence) { // override in new event, existing ones will be updated below Event::setSequence(firstcomp, event.m_sequence); } else { // new event sequence is equal or higher, use that event.m_sequence = newEvent->m_sequence; } } // update cache: find old VEVENT and remove it before adding new one, // update last modified time of all other components icalcomponent *removeme = NULL; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { removeme = comp; } else if (settings().googleUpdateHack()) { // increase modification time stamps to that of the new item, // Google rejects the whole update otherwise if (!icaltime_is_null_time(lastmodtime)) { icalproperty *dtstamp = icalcomponent_get_first_property(comp, ICAL_DTSTAMP_PROPERTY); if (dtstamp) { icalproperty_set_dtstamp(dtstamp, lastmodtime); } icalproperty *lastmod = icalcomponent_get_first_property(comp, ICAL_LASTMODIFIED_PROPERTY); if (lastmod) { icalproperty_set_lastmodified(lastmod, lastmodtime); } } // set SEQ to the one increased above Event::setSequence(comp, event.m_sequence); } } if (davLUID != luid) { // caller didn't know final UID: if found, then tell him to // merge the data and try again if (removeme) { subres.m_state = ITEM_NEEDS_MERGE; goto done; } else { event.m_subids.insert(subid); } } else { if (removeme) { // this is what we expect when the caller mentions the DAV LUID icalcomponent_remove_component(event.m_calendar, removeme); icalcomponent_free(removeme); } else { // caller confused?! SE_THROW("event not found"); } } icalcomponent_merge_component(event.m_calendar, newEvent->m_calendar.release()); // function destroys merged calendar eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); std::string data = icalstr.get(); // TODO: avoid updating item on server immediately? try { SE_LOG_DEBUG(getDisplayName(), "updating VEVENT"); InsertItemResult res = insertItem(event.m_DAVluid, data, true); if (res.m_state != ITEM_OKAY || res.m_luid != event.m_DAVluid) { // should not merge with anything, if so, our cache was invalid SE_THROW("CalDAV item not updated as expected"); } event.m_etag = res.m_revision; subres.m_revision = event.m_etag; } catch (const TransportStatusException &ex) { if (ex.syncMLStatus() == 403 && strstr(ex.what(), "You don't have access to change that event")) { // Google Calendar sometimes refuses writes for specific items, // typically meetings organized by someone else. #if 1 // Treat like a temporary, per item error to avoid aborting the // whole sync session. Doesn't really solve the problem (client // and server remain out of sync and will run into this again and // again), but better than giving up on all items or ignoring the // problem. SE_THROW_EXCEPTION_STATUS(StatusException, "CalDAV peer rejected updated with 403, keep trying", SyncMLStatus(417)); #else // Assume that the item hasn't changed and mark it as "merged". // This is incorrect. The 403 error has been seen in cases where // a detached recurrence had to be added to an existing meeting // series. Ignoring the problem means would keep the detached // recurrence out of the server permanently. SE_LOG_INFO(getDisplayName(), "%s: not updated because CalDAV server refused write access for it", getSubDescription(event, subid).c_str()); subres.m_merged = true; subres.m_revision = event.m_etag; #endif } else if (ex.syncMLStatus() == 409 && strstr(ex.what(), "Can only store an event with a newer DTSTAMP")) { SE_LOG_DEBUG(NULL, "resending VEVENT with updated SEQUENCE/LAST-MODIFIED/DTSTAMP to work around 409"); // Sometimes a PUT of two linked events updates one of them on the server // (visible in modified SEQUENCE and LAST-MODIFIED values) and then // fails with 409 because, presumably, the other item now has // too low SEQUENCE/LAST-MODIFIED/DTSTAMP values. // // An attempt with splitting the PUT in advance worked for some cases, // but then it still happened for others. So let's use brute force and // try again once more after reading the updated event anew. eptr fullcal = event.m_calendar; loadItem(event); event.m_sequence++; lastmodtime = icaltime_from_timet(event.m_lastmodtime, false); lastmodtime.is_utc = 1; event.m_calendar = fullcal; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (!icaltime_is_null_time(lastmodtime)) { icalproperty *dtstamp = icalcomponent_get_first_property(comp, ICAL_DTSTAMP_PROPERTY); if (dtstamp) { icalproperty_set_dtstamp(dtstamp, lastmodtime); } icalproperty *lastmod = icalcomponent_get_first_property(comp, ICAL_LASTMODIFIED_PROPERTY); if (lastmod) { icalproperty_set_lastmodified(lastmod, lastmodtime); } } Event::setSequence(comp, event.m_sequence); } eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); std::string data = icalstr.get(); InsertItemResult res = insertItem(event.m_DAVluid, data, true); if (res.m_state != ITEM_OKAY || res.m_luid != event.m_DAVluid) { // should not merge with anything, if so, our cache was invalid SE_THROW("CalDAV item not updated as expected"); } event.m_etag = res.m_revision; subres.m_revision = event.m_etag; } else { throw; } } } done: return subres; } void CalDAVSource::readSubItem(const std::string &davLUID, const std::string &subid, std::string &item) { Event &event = loadItem(davLUID); if (event.m_subids.size() == 1) { // simple case: convert existing VCALENDAR if (*event.m_subids.begin() == subid) { eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); item = icalstr.get(); } else { SE_THROW("event not found"); } } else { // complex case: create VCALENDAR with just the VTIMEZONE definition(s) // and the one event, then convert that eptr calendar(icalcomponent_new(ICAL_VCALENDAR_COMPONENT), "VCALENDAR"); for (icalcomponent *tz = icalcomponent_get_first_component(event.m_calendar, ICAL_VTIMEZONE_COMPONENT); tz; tz = icalcomponent_get_next_component(event.m_calendar, ICAL_VTIMEZONE_COMPONENT)) { eptr clone(icalcomponent_new_clone(tz), "VTIMEZONE"); icalcomponent_add_component(calendar, clone.release()); } bool found = false; icalcomponent *parent = NULL; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { eptr clone(icalcomponent_new_clone(comp), "VEVENT"); if (subid.empty()) { parent = clone.get(); } icalcomponent_add_component(calendar, clone.release()); found = true; break; } } if (!found) { SE_THROW("event not found"); } // tell engine and peers about EXDATEs implied by // RECURRENCE-IDs in detached recurrences by creating // X-SYNCEVOLUTION-EXDATE-DETACHED in the parent if (parent && event.m_subids.size() > 1) { // remove all old X-SYNCEVOLUTION-EXDATE-DETACHED (just in case) removeSyncEvolutionExdateDetached(parent); // now populate with RECURRENCE-IDs of detached recurrences for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY); if (prop) { eptr rid(ical_strdup(icalproperty_get_value_as_string(prop))); icalproperty *exdate = icalproperty_new_from_string(StringPrintf("X-SYNCEVOLUTION-EXDATE-DETACHED:%s", rid.get()).c_str()); if (exdate) { icalparameter *tzid = icalproperty_get_first_parameter(prop, ICAL_TZID_PARAMETER); if (tzid) { icalproperty_add_parameter(exdate, icalparameter_new_clone(tzid)); } icalcomponent_add_property(parent, exdate); } } } } eptr icalstr(ical_strdup(icalcomponent_as_ical_string(calendar))); item = icalstr.get(); } } void CalDAVSource::Event::escapeRecurrenceID(std::string &data) { boost::replace_all(data, "\nRECURRENCE-ID", "\nX-SYNCEVOLUTION-RECURRENCE-ID"); } void CalDAVSource::Event::unescapeRecurrenceID(std::string &data) { boost::replace_all(data, "\nX-SYNCEVOLUTION-RECURRENCE-ID", "\nRECURRENCE-ID"); } std::string CalDAVSource::removeSubItem(const string &davLUID, const std::string &subid) { EventCache::iterator it = m_cache.find(davLUID); if (it == m_cache.end()) { // gone already throwError(SE_HERE, STATUS_NOT_FOUND, "deleting item: " + davLUID); return ""; } // use item as it is, load only if it is not going to be removed entirely Event &event = *it->second; if (event.m_subids.size() == 1) { // remove entire merged item, nothing will be left after removal if (*event.m_subids.begin() != subid) { SE_LOG_DEBUG(getDisplayName(), "%s: request to remove the %s recurrence: only the %s recurrence exists", davLUID.c_str(), SubIDName(subid).c_str(), SubIDName(*event.m_subids.begin()).c_str()); throwError(SE_HERE, STATUS_NOT_FOUND, "remove sub-item: " + SubIDName(subid) + " in " + davLUID); return event.m_etag; } else { try { removeItem(event.m_DAVluid); } catch (const TransportStatusException &ex) { if (ex.syncMLStatus() == 409 && strstr(ex.what(), "Can't delete a recurring event")) { // Google CalDAV: // HTTP/1.1 409 Can't delete a recurring event except on its organizer's calendar // // Workaround: remove RRULE and EXDATE before deleting bool updated = false; icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); if (comp) { icalproperty *prop; while ((prop = icalcomponent_get_first_property(comp, ICAL_RRULE_PROPERTY)) != NULL) { icalcomponent_remove_property(comp, prop); icalproperty_free(prop); updated = true; } while ((prop = icalcomponent_get_first_property(comp, ICAL_EXDATE_PROPERTY)) != NULL) { icalcomponent_remove_property(comp, prop); icalproperty_free(prop); updated = true; } } if (updated) { SE_LOG_DEBUG(getDisplayName(), "Google recurring event delete hack: remove RRULE before deleting"); eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); insertSubItem(davLUID, subid, icalstr.get()); // It has been observed that trying the DELETE immediately // failed again with the same "Can't delete a recurring event" // error although the event no longer has an RRULE. Seems // that the Google server sometimes need a bit of time until // changes really trickle through all databases. Let's // try a few times before giving up. for (int retry = 0; retry < 5; retry++) { try { SE_LOG_DEBUG(getDisplayName(), "Google recurring event delete hack: remove event, attempt #%d", retry); removeSubItem(davLUID, subid); break; } catch (const TransportStatusException &ex2) { if (ex2.syncMLStatus() == 409 && strstr(ex2.what(), "Can't delete a recurring event")) { SE_LOG_DEBUG(getDisplayName(), "Google recurring event delete hack: try again in a second"); Sleep(1); } else { throw; } } } } else { SE_LOG_DEBUG(getDisplayName(), "Google recurring event delete hack not applicable, giving up"); throw; } } else { throw; } } } m_cache.erase(davLUID); return ""; } else { loadItem(event); bool found = false; for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { icalcomponent_remove_component(event.m_calendar, comp); icalcomponent_free(comp); found = true; } } if (!found) { throwError(SE_HERE, STATUS_NOT_FOUND, "remove sub-item: " + SubIDName(subid) + " in " + davLUID); return event.m_etag; } event.m_subids.erase(subid); // TODO: avoid updating the item immediately eptr icalstr(ical_strdup(icalcomponent_as_ical_string(event.m_calendar))); InsertItemResult res = insertItem(davLUID, icalstr.get(), true); if (res.m_state != ITEM_OKAY || res.m_luid != davLUID) { SE_THROW("unexpected result of removing sub event"); } event.m_etag = res.m_revision; return event.m_etag; } } void CalDAVSource::removeMergedItem(const std::string &davLUID) { EventCache::iterator it = m_cache.find(davLUID); if (it == m_cache.end()) { // gone already, no need to do anything SE_LOG_DEBUG(getDisplayName(), "%s: ignoring request to delete non-existent item", davLUID.c_str()); return; } // use item as it is, load only if it is not going to be removed entirely Event &event = *it->second; // remove entire merged item, nothing will be left after removal try { removeItem(event.m_DAVluid); } catch (const TransportStatusException &ex) { if (ex.syncMLStatus() == 409 && strstr(ex.what(), "Can't delete a recurring event")) { // Google CalDAV: // HTTP/1.1 409 Can't delete a recurring event except on its organizer's calendar // // Workaround: use the workarounds from removeSubItem() std::set subids = event.m_subids; for (std::set::reverse_iterator it = subids.rbegin(); it != subids.rend(); ++it) { removeSubItem(davLUID, *it); } } else { throw; } } m_cache.erase(davLUID); } void CalDAVSource::flushItem(const string &davLUID) { // TODO: currently we always flush immediately, so no need to send data here EventCache::iterator it = m_cache.find(davLUID); if (it != m_cache.end()) { it->second->m_calendar.set(NULL); } } std::string CalDAVSource::getSubDescription(const string &davLUID, const string &subid) { EventCache::iterator it = m_cache.find(davLUID); if (it == m_cache.end()) { // unknown item, return empty string for fallback return ""; } else { return getSubDescription(*it->second, subid); } } std::string CalDAVSource::getSubDescription(Event &event, const string &subid) { if (!event.m_calendar) { // Don't load (expensive!) only to provide the description. // Returning an empty string will trigger the fallback (logging the ID). return ""; } for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (Event::getSubID(comp) == subid) { std::string descr; const char *summary = icalcomponent_get_summary(comp); if (summary && summary[0]) { descr += summary; } if (true /* is event */) { const char *location = icalcomponent_get_location(comp); if (location && location[0]) { if (!descr.empty()) { descr += ", "; } descr += location; } } // TODO: other item types return descr; } } return ""; } std::string CalDAVSource::getDescription(const string &luid) { StringPair ids = MapSyncSource::splitLUID(luid); return getSubDescription(ids.first, ids.second); } CalDAVSource::Event &CalDAVSource::findItem(const std::string &davLUID) { EventCache::iterator it = m_cache.find(davLUID); if (it == m_cache.end()) { throwError(SE_HERE, STATUS_NOT_FOUND, "finding item: " + davLUID); } return *it->second; } CalDAVSource::Event &CalDAVSource::loadItem(const std::string &davLUID) { Event &event = findItem(davLUID); return loadItem(event); } int CalDAVSource::storeItem(const std::string &wantedLuid, std::string &item, std::string &data, const std::string &href) { std::string luid = path2luid(Neon::URI::parse(href).m_path); if (luid == wantedLuid) { SE_LOG_DEBUG(NULL, "got item %s via REPORT fallback", luid.c_str()); item = data; } data.clear(); return 0; } CalDAVSource::Event &CalDAVSource::loadItem(Event &event) { if (!event.m_calendar) { std::string item; try { readItem(event.m_DAVluid, item, true); } catch (const TransportStatusException &ex) { if (ex.syncMLStatus() == 404) { // Someone must have created a detached recurrence on // the server without the master event. We avoid that // with the "Google Child Hack", but have no control // over other clients. So let's deal with this problem // after logging it. Exception::log(); // We know about the event because it showed up in a REPORT. // So let's use such a REPORT to retrieve the desired item. // Not as efficient as a GET (and thus not the default), but // so be it. #if 0 // This would be fairly efficient, but runs into the same 404 error as a GET. std::string query = StringPrintf("\n" "\n" "\n" " \n" "\n" "<[CDATA[%s]]>\n" "", event.m_DAVluid.c_str()); Neon::XMLParser parser; std::string href, etag; item = ""; parser.initReportParser(href, etag); parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:caldav", "calendar-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(item), _2, _3)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); report.run(); #else std::string query = StringPrintf("\n" "\n" "\n" "\n" "\n" "\n" // filter expected by Yahoo! Calendar "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n", event.m_UID.c_str()); Timespec deadline = createDeadline(); getSession()->startOperation("REPORT 'single item'", deadline); while (true) { Neon::XMLParser parser; std::string data; parser.initReportParser(boost::bind(&CalDAVSource::storeItem, this, boost::ref(event.m_DAVluid), boost::ref(item), boost::ref(data), _1)); parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:caldav", "calendar-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(data), _2, _3)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } } #endif } else { throw; } } Event::unescapeRecurrenceID(item); event.m_calendar.set(icalcomponent_new_from_string((char *)item.c_str()), // hack for old libical "parsing iCalendar 2.0"); Event::fixIncomingCalendar(event.m_calendar.get()); // Sequence number/last-modified might have been increased by last save. // Or the cache was populated by setAllSubItems(), which doesn't give // us the information. In that case, UID might also still be unknown. // Either way, check it again. for (icalcomponent *comp = icalcomponent_get_first_component(event.m_calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(event.m_calendar, ICAL_VEVENT_COMPONENT)) { if (event.m_UID.empty()) { event.m_UID = Event::getUID(comp); } long sequence = Event::getSequence(comp); if (sequence > event.m_sequence) { event.m_sequence = sequence; } icalproperty *lastmod = icalcomponent_get_first_property(comp, ICAL_LASTMODIFIED_PROPERTY); if (lastmod) { icaltimetype lastmodtime = icalproperty_get_lastmodified(lastmod); time_t mod = icaltime_as_timet(lastmodtime); if (mod > event.m_lastmodtime) { event.m_lastmodtime = mod; } } } } return event; } void CalDAVSource::Event::fixIncomingCalendar(icalcomponent *calendar) { // Evolution has a problem when the parent event uses a time // zone and the RECURRENCE-ID uses UTC (can happen in Exchange // meeting invitations): then Evolution and/or libical do not // recognize that the detached recurrence overrides the // regular recurrence and display both. // // As a workaround, remember time zone of DTSTART in parent event // in the first loop iteration. Then below transform the RECURRENCE-ID // time. bool ridInUTC = false; const icaltimezone *zone = NULL; for (icalcomponent *comp = icalcomponent_get_first_component(calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(calendar, ICAL_VEVENT_COMPONENT)) { // remember whether we need to convert RECURRENCE-ID struct icaltimetype rid = icalcomponent_get_recurrenceid(comp); if (icaltime_is_utc(rid)) { ridInUTC = true; } // is parent event? -> remember time zone unless it is UTC static const struct icaltimetype null = { 0 }; if (!memcmp(&rid, &null, sizeof(null))) { struct icaltimetype dtstart = icalcomponent_get_dtstart(comp); if (!icaltime_is_utc(dtstart)) { zone = icaltime_get_timezone(dtstart); } } // remove useless X-LIC-ERROR icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_ANY_PROPERTY); while (prop) { icalproperty *next = icalcomponent_get_next_property(comp, ICAL_ANY_PROPERTY); const char *name = icalproperty_get_property_name(prop); if (name && !strcmp("X-LIC-ERROR", name)) { icalcomponent_remove_property(comp, prop); icalproperty_free(prop); } prop = next; } } // now update RECURRENCE-ID? if (zone && ridInUTC) { for (icalcomponent *comp = icalcomponent_get_first_component(calendar, ICAL_VEVENT_COMPONENT); comp; comp = icalcomponent_get_next_component(calendar, ICAL_VEVENT_COMPONENT)) { icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_RECURRENCEID_PROPERTY); if (prop) { struct icaltimetype rid = icalproperty_get_recurrenceid(prop); if (icaltime_is_utc(rid)) { rid = icaltime_convert_to_zone(rid, const_cast(zone)); // icaltime_convert_to_zone should take a "const timezone" but doesn't icalproperty_set_recurrenceid(prop, rid); icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER); icalparameter *param = icalparameter_new_from_value_string(ICAL_TZID_PARAMETER, icaltimezone_get_tzid(const_cast(zone))); icalproperty_set_parameter(prop, param); } } } } } std::string CalDAVSource::Event::icalTime2Str(const icaltimetype &tt) { static const struct icaltimetype null = { 0 }; if (!memcmp(&tt, &null, sizeof(null))) { return ""; } else { eptr timestr(ical_strdup(icaltime_as_ical_string(tt))); if (!timestr) { SE_THROW("cannot convert to time string"); } return timestr.get(); } } std::string CalDAVSource::Event::getSubID(icalcomponent *comp) { struct icaltimetype rid = icalcomponent_get_recurrenceid(comp); return icalTime2Str(rid); } std::string CalDAVSource::Event::getUID(icalcomponent *comp) { std::string uid; icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_UID_PROPERTY); if (prop) { uid = icalproperty_get_uid(prop); } return uid; } void CalDAVSource::Event::setUID(icalcomponent *comp, const std::string &uid) { icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_UID_PROPERTY); if (prop) { icalproperty_set_uid(prop, uid.c_str()); } else { icalcomponent_add_property(comp, icalproperty_new_uid(uid.c_str())); } } int CalDAVSource::Event::getSequence(icalcomponent *comp) { int sequence = 0; icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_SEQUENCE_PROPERTY); if (prop) { sequence = icalproperty_get_sequence(prop); } return sequence; } void CalDAVSource::Event::setSequence(icalcomponent *comp, int sequence) { icalproperty *prop = icalcomponent_get_first_property(comp, ICAL_SEQUENCE_PROPERTY); if (prop) { icalproperty_set_sequence(prop, sequence); } else { icalcomponent_add_property(comp, icalproperty_new_sequence(sequence)); } } CalDAVSource::EventCache::iterator CalDAVSource::EventCache::findByUID(const std::string &uid) { for (iterator it = begin(); it != end(); ++it) { if (it->second->m_UID == uid) { return it; } } return end(); } void CalDAVSource::backupData(const SyncSource::Operations::ConstBackupInfo &oldBackup, const SyncSource::Operations::BackupInfo &newBackup, BackupReport &backupReport) { contactServer(); // If this runs as part of the sync preparations, then we might // use the result to populate our m_cache. But because dumping // data is typically disabled, this optimization isn't really // worth that much. ItemCache cache; cache.init(oldBackup, newBackup, false); // stream directly from REPORT with full data into backup const std::string query = "\n" "\n" "\n" "\n" "\n" "\n" // filter expected by Yahoo! Calendar "\n" "\n" "\n" "\n" "\n" "\n" "\n"; string data; Neon::XMLParser parser; parser.initReportParser(boost::bind(&CalDAVSource::backupItem, this, boost::ref(cache), _1, _2, boost::ref(data))); parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:caldav", "calendar-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(data), _2, _3)); Timespec deadline = createDeadline(); getSession()->startOperation("REPORT 'full calendar'", deadline); while (true) { Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } cache.reset(); } cache.finalize(backupReport); } int CalDAVSource::backupItem(ItemCache &cache, const std::string &href, const std::string &etag, std::string &data) { // detect and ignore empty items, like we do in appendItem() eptr calendar(icalcomponent_new_from_string((char *)data.c_str()), // cast is a hack for broken definition in old libical "iCalendar 2.0"); if (icalcomponent_get_first_component(calendar, ICAL_VEVENT_COMPONENT)) { Event::unescapeRecurrenceID(data); std::string luid = path2luid(Neon::URI::parse(href).m_path); std::string rev = ETag2Rev(etag); cache.backupItem(data, luid, rev); } else { SE_LOG_DEBUG(NULL, "ignoring broken item %s during backup (is empty)", href.c_str()); } // reset data for next item data.clear(); return 0; } void CalDAVSource::restoreData(const SyncSource::Operations::ConstBackupInfo &oldBackup, bool dryrun, SyncSourceReport &report) { // TODO: implement restore throw("not implemented"); } bool CalDAVSource::typeMatches(const StringMap &props) const { StringMap::const_iterator it = props.find("urn:ietf:params:xml:ns:caldav:supported-calendar-component-set"); if (it != props.end() && it->second.find("") != std::string::npos) { return true; } else { return false; } } SE_END_CXX #endif // ENABLE_DAV syncevolution-1.5/src/backends/webdav/CalDAVVxxSource.h0000644000373300001540000000415212326412403024420 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #ifndef INCL_CALDAVVXXSOURCE #define INCL_CALDAVVXXSOURCE #include #ifdef ENABLE_DAV #include "WebDAVSource.h" #include #include #include #include #include #include SE_BEGIN_CXX /** * Supports VJOURNAL and VTODO via CalDAV. * * In contrast to CalDAVSource, no complex handling * of UID/RECURRENCE-ID is necessary because those do not * apply to VJOURNAL and VTODO. * * Therefore CalDAVVxxSource is much closer to CardDAVSource, * except that it uses CalDAV. */ class CalDAVVxxSource : public WebDAVSource, public SyncSourceLogging { public: /** * @param content "VJOURNAL" or "VTODO" */ CalDAVVxxSource(const std::string &content, const SyncSourceParams ¶ms, const boost::shared_ptr &settings); /* implementation of SyncSourceSerialize interface */ virtual std::string getMimeType() const { return m_content == "VJOURNAL" ? "text/calendar+plain" : "text/calendar"; } virtual std::string getMimeVersion() const { return "2.0"; } // implementation of SyncSourceLogging callback virtual std::string getDescription(const string &luid); protected: // implementation of WebDAVSource callbacks virtual std::string serviceType() const { return "caldav"; } virtual bool typeMatches(const StringMap &props) const; virtual std::string homeSetProp() const { return "urn:ietf:params:xml:ns:caldav:calendar-home-set"; } virtual std::string wellKnownURL() const { return "/.well-known/caldav"; } virtual std::string contentType() const { return "text/calendar; charset=utf-8"; } virtual std::string suffix() const { return ".ics"; } virtual std::string getContent() const { return m_content; } virtual bool getContentMixed() const { return true; } private: const std::string m_content; }; SE_END_CXX #endif // ENABLE_DAV #endif // INCL_CALDAVVXXSOURCE syncevolution-1.5/src/backends/webdav/CalDAVVxxSource.cpp0000644000373300001540000000240312326412403024750 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #include "CalDAVVxxSource.h" #ifdef ENABLE_DAV #include SE_BEGIN_CXX // TODO: use EDS backend icalstrdup.c #define ical_strdup(_x) (_x) CalDAVVxxSource::CalDAVVxxSource(const std::string &content, const SyncSourceParams ¶ms, const boost::shared_ptr &settings) : WebDAVSource(params, settings), m_content(content) { SyncSourceLogging::init(InitList("SUMMARY") + "LOCATION", " ", m_operations); } std::string CalDAVVxxSource::getDescription(const string &luid) { // TODO return ""; } bool CalDAVVxxSource::typeMatches(const StringMap &props) const { std::string davcomp = StringPrintf("", m_content.c_str()); StringMap::const_iterator it = props.find("urn:ietf:params:xml:ns:caldav:supported-calendar-component-set"); if (it != props.end() && it->second.find(davcomp) != std::string::npos) { return true; } else { return false; } } SE_END_CXX #endif // ENABLE_DAV syncevolution-1.5/src/backends/webdav/CardDAVSource.h0000664000373300001540000000623312363672170024102 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #ifndef INCL_CARDDAVSOURCE #define INCL_CARDDAVSOURCE #include #ifdef ENABLE_DAV #include "WebDAVSource.h" #include #include #include #include #include #include SE_BEGIN_CXX class CardDAVCache; class CardDAVSource : public WebDAVSource, public SyncSourceLogging { public: CardDAVSource(const SyncSourceParams ¶ms, const boost::shared_ptr &settings); /* implementation of SyncSourceSerialize interface */ virtual std::string getMimeType() const { return "text/vcard"; } virtual std::string getMimeVersion() const { return "3.0"; } // implementation of SyncSourceLogging callback virtual std::string getDescription(const string &luid); // implements read-ahead and vCard specific conversions on top of generic WebDAV readItem() virtual void readItem(const std::string &luid, std::string &item, bool raw); virtual InsertItemResult insertItem(const string &luid, const std::string &item, bool raw); virtual void removeItem(const string &luid); // Use the information provided to us to implement read-ahead efficiently. virtual void setReadAheadOrder(ReadAheadOrder order, const ReadAheadItems &luids); virtual void getReadAheadOrder(ReadAheadOrder &order, ReadAheadItems &luids); protected: // implementation of WebDAVSource callbacks virtual std::string serviceType() const { return "carddav"; } virtual bool typeMatches(const StringMap &props) const; virtual std::string homeSetProp() const { return "urn:ietf:params:xml:ns:carddav:addressbook-home-set"; } virtual std::string wellKnownURL() const { return "/.well-known/carddav"; } virtual std::string contentType() const { return "text/vcard; charset=utf-8"; } virtual std::string getContent() const { return "VCARD"; } virtual bool getContentMixed() const { return false; } private: ReadAheadOrder m_readAheadOrder; ReadAheadItems m_nextLUIDs; boost::shared_ptr m_cardDAVCache; int m_cacheMisses; /**< number of times that we had to get a contact without using the cache */ int m_contactReads; /**< number of readItem() calls */ int m_contactsFromDB; /**< number of contacts requested from DB (including ones not found) */ int m_contactQueries; /**< total number of GET or multiget REPORT requests */ typedef std::vector BatchLUIDs; void logCacheStats(Logger::Level level); boost::shared_ptr readBatch(const std::string &luid); void invalidateCachedItem(const std::string &luid); void addItemToCache(boost::shared_ptr &cache, BatchLUIDs &luids, const std::string &href, const std::string &etag, std::string &data); void readItemInternal(const std::string &luid, std::string &item, bool raw); }; SE_END_CXX #endif // ENABLE_DAV #endif // INCL_CARDDAVSOURCE syncevolution-1.5/src/backends/webdav/CardDAVSource.cpp0000664000373300001540000003056312363672170024440 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #include "CardDAVSource.h" #ifdef ENABLE_DAV #include SE_BEGIN_CXX // TODO: use EDS backend icalstrdup.c #define ical_strdup(_x) (_x) typedef boost::shared_ptr BatchReadFailure; class CardDAVCache : public std::map< std::string, boost::variant > { }; CardDAVSource::CardDAVSource(const SyncSourceParams ¶ms, const boost::shared_ptr &settings) : WebDAVSource(params, settings), m_readAheadOrder(READ_NONE), m_cacheMisses(0), m_contactReads(0), m_contactsFromDB(0), m_contactQueries(0) { SyncSourceLogging::init(InitList("N_FIRST") + "N_MIDDLE" + "N_LAST", " ", m_operations); } void CardDAVSource::logCacheStats(Logger::Level level) { SE_LOG(getDisplayName(), level, "requested %d, retrieved %d from server in %d queries, misses %d/%d (%d%%)", m_contactReads, m_contactsFromDB, m_contactQueries, m_cacheMisses, m_contactReads, m_contactReads ? m_cacheMisses * 100 / m_contactReads : 0); } std::string CardDAVSource::getDescription(const string &luid) { // TODO return ""; } void CardDAVSource::readItemInternal(const std::string &luid, std::string &item, bool raw) { if (m_cardDAVCache) { CardDAVCache::const_iterator it = m_cardDAVCache->find(luid); if (it != m_cardDAVCache->end()) { const std::string *data = boost::get(&it->second); if (data) { SE_LOG_DEBUG(getDisplayName(), "reading %s from cache", luid.c_str()); item = *data; return; } const BatchReadFailure *failure = boost::get(&it->second); if (failure) { SE_LOG_DEBUG(getDisplayName(), "reading %s into cache had failed: %s", luid.c_str(), (*failure)->what()); throw **failure; } SE_THROW(StringPrintf("internal error, empty cache entry for %s", luid.c_str())); } } if (m_readAheadOrder != READ_NONE) { m_cardDAVCache = readBatch(luid); // Try again above. readItemInternal(luid, item, raw); return; } // Fallback: get inidividual item. m_contactsFromDB++; m_contactQueries++; WebDAVSource::readItem(luid, item, raw); } void CardDAVSource::readItem(const std::string &luid, std::string &item, bool raw) { m_contactReads++; readItemInternal(luid, item, raw); logCacheStats(Logger::DEBUG); } static size_t MaxBatchSize() { int maxBatchSize = atoi(getEnv("SYNCEVOLUTION_CARDDAV_BATCH_SIZE", "50")); if (maxBatchSize < 1) { maxBatchSize = 1; } return maxBatchSize; } boost::shared_ptr CardDAVSource::readBatch(const std::string &luid) { static size_t maxBatchSize = MaxBatchSize(); BatchLUIDs luids; luids.reserve(maxBatchSize); bool found = false; switch (m_readAheadOrder) { case READ_ALL_ITEMS: case READ_CHANGED_ITEMS: { const Items_t &items = getAllItems(); const Items_t &newItems = getNewItems(); const Items_t &updatedItems = getUpdatedItems(); Items_t::const_iterator it = items.find(luid); // Always read the requested item, even if not found in item list. luids.push_back(&luid); if (it != items.end()) { // Check that it is a valid candidate for caching, else // we have a cache miss prediction. if (m_readAheadOrder == READ_ALL_ITEMS || newItems.find(luid) != newItems.end() || updatedItems.find(luid) != updatedItems.end()) { found = true; } ++it; } while (luids.size() < maxBatchSize && it != items.end()) { const std::string &luid = *it; if (m_readAheadOrder == READ_ALL_ITEMS || newItems.find(luid) != newItems.end() || updatedItems.find(luid) != updatedItems.end()) { luids.push_back(&luid); } ++it; } break; } case READ_SELECTED_ITEMS: { ReadAheadItems::const_iterator it; // boost::find(std::make_pair(, m_nextLUIDs.end()), luid) - not available on Ubuntu Lucid for (it = m_nextLUIDs.begin(); it != m_nextLUIDs.end() && *it != luid; ++it) {} // Always read the requested item, even if not found in item list. luids.push_back(&luid); if (it != m_nextLUIDs.end()) { found = true; ++it; } while (luids.size() < maxBatchSize && it != m_nextLUIDs.end()) { luids.push_back(&*it); ++it; } break; } case READ_NONE: // May be reached when read-ahead was turned off while // preparing for it. luids.push_back(&luid); break; } boost::shared_ptr cache; if (m_readAheadOrder != READ_NONE && !found) { // The requested contact was not on our list. Consider this // a cache miss (or rather, cache prediction failure) and turn // off the read-ahead. m_cacheMisses++; SE_LOG_DEBUG(getDisplayName(), "reading: disable read-ahead due to cache miss"); m_readAheadOrder = READ_NONE; return cache; } cache.reset(new CardDAVCache); if (!luids.empty()) { Timespec deadline = createDeadline(); m_contactQueries++; m_contactsFromDB += luids.size(); getSession()->startOperation("MULTIGET", deadline); while (!luids.empty()) { std::stringstream query; query << "\n" "\n" "\n" "\n" "\n" "\n" ; BOOST_FOREACH(const std::string *luid, luids) { query << "" << luid2path(*luid) << "\n"; } query << ""; string data; Neon::XMLParser parser; // This removes all items for which we get data from luids. // The purpose of that is two-fold: don't request data again that // we already got when resending, and detect missing 404 status errors // with Google. parser.initReportParser(boost::bind(&CardDAVSource::addItemToCache, this, cache, boost::ref(luids), _1, _2, boost::ref(data))); parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:carddav", "address-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(data), _2, _3)); std::string request = query.str(); Neon::Request req(*getSession(), "REPORT", getCalendar().m_path, request, parser); req.addHeader("Depth", "0"); req.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (req.run()) { // CardDAV servers must include a response for each requested item. // Google CardDAV doesn't due that at the time of implementing the // batched read. As a workaround assume that any remaining item // isn't available. BOOST_FOREACH(const std::string *luid, luids) { boost::shared_ptr failure(new TransportStatusException(__FILE__, __LINE__, StringPrintf("%s: not contained in multiget response", luid->c_str()), STATUS_NOT_FOUND)); (*cache)[*luid] = failure; } break; } } } return cache; } void CardDAVSource::addItemToCache(boost::shared_ptr &cache, BatchLUIDs &luids, const std::string &href, const std::string &etag, std::string &data) { std::string luid = path2luid(href); // TODO: error checking CardDAVCache::mapped_type result; if (!data.empty()) { result = data; SE_LOG_DEBUG(getDisplayName(), "batch response: got %ld bytes of data for %s", (long)data.size(), luid.c_str()); } else { SE_LOG_DEBUG(getDisplayName(), "batch response: unknown failure for %s", luid.c_str()); } (*cache)[luid] = result; bool found = false; for (BatchLUIDs::iterator it = luids.begin(); it != luids.end(); ++it) { if (**it == luid) { luids.erase(it); found = true; break; } } if (!found) { SE_LOG_DEBUG(getDisplayName(), "batch response: unexpected item: %s = %s", href.c_str(), luid.c_str()); } // reset data for next item data.clear(); } CardDAVSource::InsertItemResult CardDAVSource::insertItem(const string &luid, const std::string &item, bool raw) { invalidateCachedItem(luid); return WebDAVSource::insertItem(luid, item, raw); } void CardDAVSource::removeItem(const string &luid) { invalidateCachedItem(luid); WebDAVSource::removeItem(luid); } void CardDAVSource::setReadAheadOrder(ReadAheadOrder order, const ReadAheadItems &luids) { SE_LOG_DEBUG(getDisplayName(), "reading: set order '%s', %ld luids", order == READ_NONE ? "none" : order == READ_ALL_ITEMS ? "all" : order == READ_CHANGED_ITEMS ? "changed" : order == READ_SELECTED_ITEMS ? "selected" : "???", (long)luids.size()); m_readAheadOrder = order; m_nextLUIDs = luids; // Be conservative and throw away all cached data. Not doing so // can confuse our "cache miss" counting, for example when it uses // a cache where some entries have been removed in // invalidateCachedContact() and then mistakes the gaps for cache // misses. // // Another reason is that we want to use fairly recent data (in // case of concurrent changes in the DB, which currently is not // detected by the cache). m_cardDAVCache.reset(); } void CardDAVSource::getReadAheadOrder(ReadAheadOrder &order, ReadAheadItems &luids) { order = m_readAheadOrder; luids = m_nextLUIDs; } void CardDAVSource::invalidateCachedItem(const std::string &luid) { if (m_cardDAVCache) { CardDAVCache::iterator it = m_cardDAVCache->find(luid); if (it != m_cardDAVCache->end()) { SE_LOG_DEBUG(getDisplayName(), "reading: remove contact %s from cache because of remove or update", luid.c_str()); // If we happen to read that contact (unlikely), it'll be // considered a cache miss. That's okay. Together with // counting cache misses it'll help us avoid using // read-ahead when the Synthesis engine is randomly // accessing contacts. m_cardDAVCache->erase(it); } } } bool CardDAVSource::typeMatches(const StringMap &props) const { StringMap::const_iterator it = props.find("DAV::resourcetype"); if (it != props.end()) { const std::string &type = it->second; // allow parameters (no closing bracket) // and allow also "carddavaddressbook" (caused by invalid Neon // string concatenation?!) if (type.find(" #include #include SE_BEGIN_CXX extern BoolConfigProperty &WebDAVCredentialsOkay(); SE_END_CXX #ifdef ENABLE_DAV #include #include #include "NeonCXX.h" SE_BEGIN_CXX class ContextSettings; /** * Implements generic access to a WebDAV collection. * * Change tracking is based on TrackingSyncSource, with the following mapping: * - locally unique id = relative URI of resource in collection * - revision string = ETag of resource in collection */ class WebDAVSource : public TrackingSyncSource, private boost::noncopyable { public: /** * @param settings instance which provides necessary settings callbacks for Neon */ WebDAVSource(const SyncSourceParams ¶ms, const boost::shared_ptr &settings); /** * Utility function: replace HTML entities until none are left * in the decoded string - for Yahoo! Contacts bug. */ static void replaceHTMLEntities(std::string &item); protected: /** * Initialize HTTP session and locate the right collection. * To be called after open() to do the heavy initializtion * work. */ void contactServer(); /** * DNS SRV lookup for current service type. * Returns the found URL, otherwise throws exception. */ std::string lookupDNSSRV(const std::string &domain); /** * Scan server based on username/password/syncURL. Callback is * passed name and URL of each collection (in this order) plus * some flags (isReadOnly = collection cannot be written); * may return false to stop scanning gracefully or throw errors to * abort. * * @return true if scanning completed, false if callback requested stop */ bool findCollections(const boost::function &callback); /** store resource URL permanently after successful sync */ void storeServerInfos(); /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual bool isUsable(); virtual void close(); virtual Databases getDatabases(); void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments); /** intercept TrackingSyncSource::beginSync() to do the expensive initialization */ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken) { contactServer(); TrackingSyncSource::beginSync(lastToken, resumeToken); } /** hook into session to store infos */ virtual std::string endSync(bool success) { if (success) { storeServerInfos(); } return TrackingSyncSource::endSync(success); } /** sets m_postPath */ void checkPostSupport(); /* implementation of TrackingSyncSource interface */ virtual std::string databaseRevision(); virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &luid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &uid); /** * A resource path is turned into a locally unique ID by * stripping the calendar path prefix, or keeping the full * path for resources outside of the calendar. */ std::string path2luid(const std::string &path); /** * Full path can be reconstructed from relative LUID by * appending it to the calendar path, or using the path * as it is. */ std::string luid2path(const std::string &luid); /** * ETags are turned into revision strings by ignoring the W/ weak * marker (because we don't care for literal storage of items) and * by stripping the quotation marks. */ std::string ETag2Rev(const std::string &etag); /** * Calculates the time after which the next operation is * expected to complete before giving up, based on * current time and retry settings. * @return absolute time, empty if no retrying allowed */ Timespec createDeadline() const; // access to neon session and calendar, valid between open() and close() boost::shared_ptr getSession() { return m_session; } Neon::URI &getCalendar() { return m_calendar; } // access to settings owned by this instance Neon::Settings &settings() { return *m_settings; } /** * SRV type to be used for finding URL (caldav, carddav, ...) */ virtual string serviceType() const = 0; /** * return true if resource with the given properties is something we can work with; * properties which are queried are currently hard-coded in WebDAVSource::open() * * @param props mapping from fully qualified properties to their values, * normalized by neon library */ virtual bool typeMatches(const StringMap &props) const = 0; /** * property pointing to URL path with suitable collections ("calendar-home-set", "address-home-set", ...); * must be known to WebDAVSource::open() already */ virtual std::string homeSetProp() const = 0; /** * well-known URL, including full path (/.well-known/caldav), * empty if none */ virtual std::string wellKnownURL() const = 0; /** * HTTP content type for PUT */ virtual std::string contentType() const = 0; /** * VEVENT, VTODO, VJOURNAL, VCARD */ virtual std::string getContent() const = 0; /** * true if a collection might contain items with different content * types */ virtual bool getContentMixed() const = 0; /** * create new resource name (only last component, not full path) * * Some servers require that this matches the item content, * for example Yahoo CardDAV wants .vcf. * * @param item original item data * @param buffer empty, may be filled with modified item data * @retval luid new resource name, not URL encoded * @return item data to be sent */ virtual const std::string *createResourceName(const std::string &item, std::string &buffer, std::string &luid); /** * optionally modify item content to match the luid of the item we are going to update */ virtual const std::string *setResourceName(const std::string &item, std::string &buffer, const std::string &luid); /** * Find one item by its UID property value and return the corresponding * resource name relative to the current collection (aka luid). */ std::string findByUID(const std::string &uid, const Timespec &deadline); /** * Get UID property value from vCard 3.0 or iCalendar 2.0 text * items. * @retval startp offset of first character of UID value (i.e., directly after colon), * npos if no UID was found * @retval endp offset of first line break character (\r or \n) after UID value, * npos if no UID was found * @return UID value without line breaks and folding characters removed */ static std::string extractUID(const std::string &item, size_t *startp = NULL, size_t *endp = NULL); /** * .vcf for VCARD and .ics for everything else. */ virtual std::string getSuffix() const; private: /** settings to be used, never NULL, may be the same as m_contextSettings */ boost::shared_ptr m_settings; /** settings constructed by us instead of caller, may be NULL */ boost::shared_ptr m_contextSettings; boost::shared_ptr m_session; /** normalized path: including backslash, URI encoded */ Neon::URI m_calendar; /** * Unset until checkPostSupport() is called, * valid path for POST if server supports RFC 5995, * empty otherwise. */ InitStateString m_postPath; /** * Information about certain paths (path->property->value). * The container acts like a hash (supports indexing with unique string) * but adds new entries at the end like a vector. */ class Props_t : public std::vector< std::pair < std::string, std::map > > { public: typedef std::string key_type; typedef std::map mapped_type; mapped_type &operator [] (const key_type &key); iterator find(const key_type &key); const_iterator find(const key_type &key) const { return const_cast(this)->find(key); } }; /** extract value from first value, empty string if not inside propval */ std::string extractHREF(const std::string &propval); /** extract all value values from a set, empty if none */ std::list extractHREFs(const std::string &propval); void openPropCallback(Props_t &davProps, const Neon::URI &uri, const ne_propname *prop, const char *value, const ne_status *status); void listAllItemsCallback(const Neon::URI &uri, const ne_prop_result_set *results, RevisionMap_t &revisions, bool &failed); int checkItem(RevisionMap_t &revisions, const std::string &href, const std::string &etag, std::string *data); void backupData(const boost::function &op, const Operations::ConstBackupInfo &oldBackup, const Operations::BackupInfo &newBackup, BackupReport &report) { contactServer(); op(oldBackup, newBackup, report); } void restoreData(const boost::function &op, const Operations::ConstBackupInfo &oldBackup, bool dryrun, SyncSourceReport &report) { contactServer(); op(oldBackup, dryrun, report); } /** * return true if the resource with the given properties is one * of those collections which is guaranteed to not contain * other, unrelated collections (a CalDAV collection must not * contain a CardDAV collection, for example) */ bool isLeafCollection(const StringMap &props) const; protected: /** * Extracts ETag from response header, empty if not found. */ std::string getETag(Neon::Request &req) { return ETag2Rev(req.getResponseHeader("ETag")); } /** * Extracts new LUID from response header, empty if not found. */ std::string getLUID(Neon::Request &req); }; SE_END_CXX #endif // ENABLE_DAV #endif // INCL_WEBDAVSOURCE syncevolution-1.5/src/backends/webdav/WebDAVSource.cpp0000664000373300001540000030036712405555067024310 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation */ #include "WebDAVSource.h" #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX BoolConfigProperty &WebDAVCredentialsOkay() { static BoolConfigProperty okay("webDAVCredentialsOkay", "credentials were accepted before"); return okay; } #ifdef ENABLE_DAV /** * Retrieve settings from SyncConfig. * NULL pointer for config is allowed. */ class ContextSettings : public Neon::Settings { public: /** * Base URL(s) for WebDAV service. * More than one can be give as candidate for scanning. */ typedef std::vector URLs; private: boost::shared_ptr m_context; SyncSourceConfig *m_sourceConfig; URLs m_urls; std::string m_urlsDescription; std::string m_url; std::string m_urlDescription; /** do change tracking without relying on CTag */ bool m_noCTag; bool m_googleUpdateHack; bool m_googleAlarmHack; // credentials were valid in the past: stored persistently in tracking node bool m_credentialsOkay; public: ContextSettings(const boost::shared_ptr &context, SyncSourceConfig *sourceConfig) : m_context(context), m_sourceConfig(sourceConfig), m_noCTag(false), m_googleUpdateHack(false), m_googleAlarmHack(false), m_credentialsOkay(false) { URLs urls; std::string description = ""; std::string syncName = m_context->getConfigName(); if (syncName.empty()) { syncName = ""; } // check source config first if (m_sourceConfig) { urls.push_back(m_sourceConfig->getDatabaseID()); std::string &url = urls.front(); std::string sourceName = m_sourceConfig->getName(); if (sourceName.empty()) { sourceName = ""; } description = StringPrintf("sync config '%s', datastore config '%s', database='%s'", syncName.c_str(), sourceName.c_str(), url.c_str()); } // fall back to sync context if ((urls.empty() || (urls.size() == 1 && urls.front().empty())) && m_context) { urls = m_context->getSyncURL(); description = StringPrintf("sync config '%s', syncURL='%s'", syncName.c_str(), boost::join(urls, " ").c_str()); } // remember result and set flags setURLs(urls, description); if (!urls.empty()) { setURL(urls.front(), description); } // m_credentialsOkay: no corresponding setting when using // credentials + URL from source config, in which case we // never know that credentials should work (bad for Google, // with its temporary authentication errors) if (m_context) { boost::shared_ptr node = m_context->getNode(WebDAVCredentialsOkay()); m_credentialsOkay = WebDAVCredentialsOkay().getPropertyValue(*node); } } void setURLs(const URLs &urls, const std::string &description) { m_urls = urls; m_urlsDescription = description; } URLs getURLs() { return m_urls; } std::string getURLsDescription() { return m_urlsDescription; } void setURL(const std::string &url, const std::string &description) { initializeFlags(url); m_url = url; m_urlDescription = description; } std::string getURL() { return m_url; } std::string getURLDescription() { return m_urlDescription; } virtual bool verifySSLHost() { return !m_context || m_context->getSSLVerifyHost(); } virtual bool verifySSLCertificate() { return !m_context || m_context->getSSLVerifyServer(); } virtual std::string proxy() { if (!m_context || !m_context->getUseProxy()) { return ""; } else { return m_context->getProxyHost(); } } bool noCTag() const { return m_noCTag; } virtual bool googleUpdateHack() const { return m_googleUpdateHack; } virtual bool googleAlarmHack() const { return m_googleAlarmHack; } virtual int timeoutSeconds() const { return m_context->getRetryDuration(); } virtual int retrySeconds() const { int seconds = m_context->getRetryInterval(); if (seconds >= 0) { seconds /= (120 / 5); // default: 2min => 5s } return seconds; } virtual void getCredentials(const std::string &realm, std::string &username, std::string &password); virtual boost::shared_ptr getAuthProvider(); void updatePassword(const string &password); std::string getUsername() { lookupAuthProvider(); return m_authProvider->getUsername(); } virtual bool getCredentialsOkay() { return m_credentialsOkay; } virtual void setCredentialsOkay(bool okay) { if (m_credentialsOkay != okay && m_context) { boost::shared_ptr node = m_context->getNode(WebDAVCredentialsOkay()); if (!node->isReadOnly()) { WebDAVCredentialsOkay().setProperty(*node, okay); node->flush(); } m_credentialsOkay = okay; } } virtual int logLevel() { return m_context ? m_context->getLogLevel().get() : Logger::instance().getLevel(); } private: void initializeFlags(const std::string &url); boost::shared_ptr m_authProvider; void lookupAuthProvider(); }; void ContextSettings::getCredentials(const std::string &realm, std::string &username, std::string &password) { lookupAuthProvider(); Credentials creds = m_authProvider->getCredentials(); username = creds.m_username; password = creds.m_password; } boost::shared_ptr ContextSettings::getAuthProvider() { lookupAuthProvider(); return m_authProvider; } void ContextSettings::updatePassword(const std::string &password) { m_context->setSyncPassword(password, false); m_context->flush(); } void ContextSettings::lookupAuthProvider() { if (m_authProvider) { return; } UserIdentity identity; InitStateString password; // prefer source config if anything is set there const char *credentialsFrom = "undefined"; if (m_sourceConfig) { identity = m_sourceConfig->getUser(); password = m_sourceConfig->getPassword(); credentialsFrom = "datastore config"; } // fall back to context if (m_context && !identity.wasSet() && !password.wasSet()) { identity = m_context->getSyncUser(); password = m_context->getSyncPassword(); credentialsFrom = "context"; } SE_LOG_DEBUG(NULL, "using username '%s' from %s for WebDAV, password %s", identity.toString().c_str(), credentialsFrom, password.wasSet() ? "was set" : "not set"); // lookup actual authentication method instead of assuming username/password m_authProvider = AuthProvider::create(identity, password); } void ContextSettings::initializeFlags(const std::string &url) { bool googleUpdate = false, googleAlarm = false, noCTag = false; Neon::URI uri = Neon::URI::parse(url); typedef boost::split_iterator string_split_iterator; for (string_split_iterator arg = boost::make_split_iterator(uri.m_query, boost::first_finder("&", boost::is_iequal())); arg != string_split_iterator(); ++arg) { static const std::string keyword = "SyncEvolution="; if (boost::istarts_with(*arg, keyword)) { std::string params(arg->begin() + keyword.size(), arg->end()); for (string_split_iterator flag = boost::make_split_iterator(params, boost::first_finder(",", boost::is_iequal())); flag != string_split_iterator(); ++flag) { if (boost::iequals(*flag, "UpdateHack")) { googleUpdate = true; } else if (boost::iequals(*flag, "ChildHack")) { // Not used anymore, flag ignored. } else if (boost::iequals(*flag, "AlarmHack")) { googleAlarm = true; } else if (boost::iequals(*flag, "Google")) { googleUpdate = googleAlarm = true; } else if (boost::iequals(*flag, "NoCTag")) { noCTag = true; } else { SE_THROW(StringPrintf("unknown SyncEvolution flag %s in URL %s", std::string(flag->begin(), flag->end()).c_str(), url.c_str())); } } } else if (arg->end() != arg->begin()) { SE_THROW(StringPrintf("unknown parameter %s in URL %s", std::string(arg->begin(), arg->end()).c_str(), url.c_str())); } } // store final result m_googleUpdateHack = googleUpdate; m_googleAlarmHack = googleAlarm; m_noCTag = noCTag; } WebDAVSource::Props_t::mapped_type & WebDAVSource::Props_t::operator [] (const WebDAVSource::Props_t::key_type &key) { iterator it = find(key); if (it != end()) { return it->second; } else { push_back(value_type(key, mapped_type())); return back().second; } } WebDAVSource::Props_t::iterator WebDAVSource::Props_t::find(const WebDAVSource::Props_t::key_type &key) { for (iterator it = begin(); it != end(); ++it) { if (it->first == key) { return it; } } return end(); } WebDAVSource::WebDAVSource(const SyncSourceParams ¶ms, const boost::shared_ptr &settings) : TrackingSyncSource(params), m_settings(settings) { if (!m_settings) { m_contextSettings.reset(new ContextSettings(params.m_context, this)); m_settings = m_contextSettings; } /* insert contactServer() into BackupData_t and RestoreData_t (implemented by SyncSourceRevisions) */ m_operations.m_backupData = boost::bind(&WebDAVSource::backupData, this, m_operations.m_backupData, _1, _2, _3); m_operations.m_restoreData = boost::bind(&WebDAVSource::restoreData, this, m_operations.m_restoreData, _1, _2, _3); // ignore the "Request ends, status 207 class 2xx, error line:" printed by neon LogRedirect::addIgnoreError(", error line:"); // ignore error messages in returned data LogRedirect::addIgnoreError("Read block ("); } static const std::string UID("\nUID:"); const std::string *WebDAVSource::createResourceName(const std::string &item, std::string &buffer, std::string &luid) { luid = extractUID(item); std::string suffix = getSuffix(); if (luid.empty()) { // must modify item luid = UUID(); buffer = item; size_t start = buffer.find("\nEND:" + getContent()); if (start != buffer.npos) { start++; buffer.insert(start, StringPrintf("UID:%s\r\n", luid.c_str())); } luid += suffix; return &buffer; } else { luid += suffix; return &item; } } const std::string *WebDAVSource::setResourceName(const std::string &item, std::string &buffer, const std::string &luid) { std::string olduid = luid; std::string suffix = getSuffix(); if (boost::ends_with(olduid, suffix)) { olduid.resize(olduid.size() - suffix.size()); } // First check if the item already contains the right UID // or at least some UID. If there is a UID, we trust it to be correct, // because our guess here (resource name == UID) can be wrong, for // example for items created by other clients or by us when using // POST and letting the server choose the resource name. // // This relies on our peer doing the right thing. size_t start, end; std::string uid = extractUID(item, &start, &end); if (uid == olduid || !uid.empty()) { return &item; } // insert or overwrite buffer = item; if (start != std::string::npos) { // overwrite buffer.replace(start, end - start, olduid); } else { // insert start = buffer.find("\nEND:" + getContent()); if (start != buffer.npos) { start++; buffer.insert(start, StringPrintf("UID:%s\n", olduid.c_str())); } } return &buffer; } std::string WebDAVSource::extractUID(const std::string &item, size_t *startp, size_t *endp) { std::string luid; if (startp) { *startp = std::string::npos; } if (endp) { *endp = std::string::npos; } // find UID, use that plus ".vcf" as resource name (expected by Yahoo Contacts) size_t start = item.find(UID); if (start != item.npos) { start += UID.size(); size_t end = item.find("\n", start); if (end != item.npos) { if (startp) { *startp = start; } luid = item.substr(start, end - start); if (boost::ends_with(luid, "\r")) { luid.resize(luid.size() - 1); } // keep checking for more lines because of folding while (end + 1 < item.size() && item[end + 1] == ' ') { start = end + 1; end = item.find("\n", start); if (end == item.npos) { // incomplete, abort luid = ""; if (startp) { *startp = std::string::npos; } break; } luid += item.substr(start, end - start); if (boost::ends_with(luid, "\r")) { luid.resize(luid.size() - 1); } } // success, return all information if (endp) { // don't include \r or \n *endp = item[end - 1] == '\r' ? end - 1 : end; } } } return luid; } std::string WebDAVSource::getSuffix() const { return getContent() == "VCARD" ? ".vcf" : ".ics"; } void WebDAVSource::replaceHTMLEntities(std::string &item) { while (true) { bool found = false; std::string decoded; size_t last = 0; // last character copied size_t next = 0; // next character to be looked at while (true) { next = item.find('&', next); size_t start = next; if (next == item.npos) { // finish decoding if (found) { decoded.append(item, last, item.size() - last); } break; } next++; size_t end = next; while (end != item.size()) { char c = item[end]; if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '#')) { end++; } else { break; } } if (end == item.size() || item[end] != ';') { // Invalid character between & and ; or no // proper termination? No entity, continue // decoding in next loop iteration. next = end; continue; } unsigned char c = 0; if (next < end) { if (item[next] == '#') { // decimal or hexadecimal number next++; if (next < end) { int base; if (item[next] == 'x') { // hex base = 16; next++; } else { base = 10; } while (next < end) { unsigned char v = tolower(item[next]); if (v >= '0' && v <= '9') { next++; c = c * base + (v - '0'); } else if (base == 16 && v >= 'a' && v <= 'f') { next++; c = c * base + (v - 'a') + 10; } else { // invalid character, abort scanning of this entity break; } } } } else { // check for entities struct { const char *m_name; unsigned char m_character; } entities[] = { // core entries, extend as needed... { "quot", '"' }, { "amp", '&' }, { "apos", '\'' }, { "lt", '<' }, { "gt", '>' }, { NULL, 0 } }; int i = 0; while (true) { const char *name = entities[i].m_name; if (!name) { break; } if (!item.compare(next, end - next, name)) { c = entities[i].m_character; next += strlen(name); break; } i++; } } if (next == end) { // swallowed all characters in entity, must be valid: // copy all uncopied characters plus the new one found = true; decoded.reserve(item.size()); decoded.append(item, last, start - last); decoded.append(1, c); last = end + 1; } } next = end + 1; } if (found) { item = decoded; } else { break; } } } void WebDAVSource::open() { // Nothing to do here, expensive initialization is in contactServer(). } static bool setFirstURL(Neon::URI &result, bool &resultIsReadOnly, const std::string &name, const Neon::URI &uri, bool isReadOnly) { if (result.empty() || // Overwrite read-only with read/write collection. (resultIsReadOnly && !isReadOnly)) { result = uri; resultIsReadOnly = isReadOnly; } // Stop if read/write found. return resultIsReadOnly; } void WebDAVSource::contactServer() { if (!m_calendar.empty() && m_session) { // we have done this work before, no need to repeat it return; } SE_LOG_DEBUG(NULL, "using libneon %s with %s", ne_version_string(), Neon::features().c_str()); // Can we skip auto-detection because a full resource URL is set? std::string database = getDatabaseID(); if (!database.empty() && m_contextSettings) { m_calendar = Neon::URI::parse(database, true); // m_contextSettings = m_settings, so this sets m_settings->getURL() m_contextSettings->setURL(database, StringPrintf("%s database=%s", getDisplayName().c_str(), database.c_str())); // start talking to host defined by m_settings->getURL() m_session = Neon::Session::create(m_settings); SE_LOG_INFO(getDisplayName(), "using configured database=%s", database.c_str()); // force authentication via username/password or OAuth2 m_session->forceAuthorization(m_settings->getAuthProvider()); return; } // Create session and find first collection (the default). Prefer // read/write collections over read-only, just like getDatabases() // does. bool isReadOnly; m_calendar = Neon::URI(); SE_LOG_INFO(getDisplayName(), "determine final URL based on %s", m_contextSettings ? m_contextSettings->getURLDescription().c_str() : ""); findCollections(boost::bind(setFirstURL, boost::ref(m_calendar), boost::ref(isReadOnly), _1, _2, _3)); if (m_calendar.empty()) { throwError(SE_HERE, "no database found"); } SE_LOG_INFO(getDisplayName(), "final URL path %s", m_calendar.m_path.c_str()); // Check some server capabilities. Purely informational at this // point, doesn't have to succeed either (Google 401 throttling // workaround not active here, so it may really fail!). #ifdef HAVE_LIBNEON_OPTIONS if (Logger::instance().getLevel() >= Logger::DEV) { try { SE_LOG_DEBUG(NULL, "read capabilities of %s", m_calendar.toURL().c_str()); m_session->startOperation("OPTIONS", Timespec()); int caps = m_session->options(m_calendar.m_path); static const Flag descr[] = { { NE_CAP_DAV_CLASS1, "Class 1 WebDAV (RFC 2518)" }, { NE_CAP_DAV_CLASS2, "Class 2 WebDAV (RFC 2518)" }, { NE_CAP_DAV_CLASS3, "Class 3 WebDAV (RFC 4918)" }, { NE_CAP_MODDAV_EXEC, "mod_dav 'executable' property" }, { NE_CAP_DAV_ACL, "WebDAV ACL (RFC 3744)" }, { NE_CAP_VER_CONTROL, "DeltaV version-control" }, { NE_CAP_CO_IN_PLACE, "DeltaV checkout-in-place" }, { NE_CAP_VER_HISTORY, "DeltaV version-history" }, { NE_CAP_WORKSPACE, "DeltaV workspace" }, { NE_CAP_UPDATE, "DeltaV update" }, { NE_CAP_LABEL, "DeltaV label" }, { NE_CAP_WORK_RESOURCE, "DeltaV working-resouce" }, { NE_CAP_MERGE, "DeltaV merge" }, { NE_CAP_BASELINE, "DeltaV baseline" }, { NE_CAP_ACTIVITY, "DeltaV activity" }, { NE_CAP_VC_COLLECTION, "DeltaV version-controlled-collection" }, { 0, NULL } }; SE_LOG_DEBUG(NULL, "%s WebDAV capabilities: %s", m_session->getURL().c_str(), Flags2String(caps, descr).c_str()); } catch (const Neon::FatalException &ex) { throw; } catch (...) { Exception::handle(); } } #endif // HAVE_LIBNEON_OPTIONS } class Candidate { public: enum Flags { LIST = (1u << 0), // Also list all members to find more candidates. NONE = 0 }; /** Normalizes url if non-empty, interprets it relative to uri. */ Candidate(const Neon::URI &uri, const std::string &url, int flags) : m_uri(uri), m_flags(flags) { if (url.empty()) { m_uri.m_path = ""; } else { // Use normalize path with current host, unless the url contained // its own host and protocol. Neon::URI other = Neon::URI::parse(url); if (other.m_scheme.empty()) { other.m_scheme = uri.m_scheme; } if (!other.m_port) { other.m_port = uri.m_port; } if (other.m_host.empty()) { other.m_host = uri.m_host; } m_uri = other; } } Candidate(const Neon::URI &uri, int flags) : m_uri(uri), m_flags(flags) {} Candidate() : m_flags(NONE) {} Neon::URI m_uri; int m_flags; // operator bool () const { return !m_path.empty(); } bool empty() const { return m_uri.empty(); } bool operator < (const Candidate &other) const { int compare = m_uri.compare(other.m_uri); return compare < 0 || (compare == 0 && m_flags < other.m_flags); } bool operator == (const Candidate &other) const { return m_uri == other.m_uri && m_flags == other.m_flags; } }; std::string WebDAVSource::lookupDNSSRV(const std::string &domain) { std::string url; int timeoutSeconds = m_settings->timeoutSeconds(); int retrySeconds = m_settings->retrySeconds(); FILE *in = NULL; try { Timespec startTime = Timespec::monotonic(); retry: in = popen(StringPrintf("syncevo-webdav-lookup '%s' '%s'", serviceType().c_str(), domain.c_str()).c_str(), "r"); if (!in) { throwError(SE_HERE, "starting syncevo-webdav-lookup for DNS SRV lookup failed", errno); } // ridicuously long URLs are truncated... char buffer[1024]; size_t read = fread(buffer, 1, sizeof(buffer) - 1, in); buffer[read] = 0; if (read > 0 && buffer[read - 1] == '\n') { read--; } buffer[read] = 0; url = buffer; int res = pclose(in); in = NULL; if (res != -1 && WIFEXITED(res)) { res = WEXITSTATUS(res); } else { res = -1; } switch (res) { case 0: SE_LOG_DEBUG(getDisplayName(), "found syncURL '%s' via DNS SRV", buffer); break; case 2: throwError(SE_HERE, StringPrintf("syncevo-webdav-lookup did not find a DNS utility to search for %s in %s", serviceType().c_str(), domain.c_str())); break; case 3: throwError(SE_HERE, StringPrintf("DNS SRV search for %s in %s did not find the service", serviceType().c_str(), domain.c_str())); break; case -1: throwError(SE_HERE, StringPrintf("DNS SRV search for %s in %s failed", serviceType().c_str(), domain.c_str())); break; default: { Timespec now = Timespec::monotonic(); if (retrySeconds > 0 && timeoutSeconds > 0) { if (now < startTime + timeoutSeconds) { SE_LOG_DEBUG(getDisplayName(), "DNS SRV search failed due to network issues, retry in %d seconds", retrySeconds); Sleep(retrySeconds); goto retry; } else { SE_LOG_INFO(getDisplayName(), "DNS SRV search timed out after %d seconds", timeoutSeconds); } } // probably network problem throwError(SE_HERE, STATUS_TRANSPORT_FAILURE, StringPrintf("DNS SRV search for %s in %s failed", serviceType().c_str(), domain.c_str())); break; } } } catch (...) { if (in) { pclose(in); } throw; } return url; } bool WebDAVSource::findCollections(const boost::function &storeResult) { bool res = true; // completed int timeoutSeconds = m_settings->timeoutSeconds(); int retrySeconds = m_settings->retrySeconds(); SE_LOG_DEBUG(getDisplayName(), "timout %ds, retry %ds => %s", timeoutSeconds, retrySeconds, (timeoutSeconds <= 0 || retrySeconds <= 0) ? "resending disabled" : "resending allowed"); boost::shared_ptr authProvider = m_contextSettings->getAuthProvider(); std::string username = authProvider->getUsername(); // If no URL was configured, then try DNS SRV lookup. // syncevo-webdav-lookup and at least one of the tools // it depends on (host, nslookup, adnshost, ...) must // be in the shell search path. // // Only our own m_contextSettings allows overriding the // URL. Not an issue, in practice it is always used. bool didDNS = false; ContextSettings::URLs urls; if (m_contextSettings) { urls = m_contextSettings->getURLs(); } else { urls.push_back(m_settings->getURL()); } if ((urls.empty() || (urls.size() == 1 && urls.front().empty())) && m_contextSettings) { didDNS = true; size_t pos = username.find('@'); if (pos == username.npos) { // throw authentication error to indicate that the credentials are wrong throwError(SE_HERE, STATUS_UNAUTHORIZED, StringPrintf("syncURL not configured and username %s does not contain a domain", username.c_str())); } std::string domain = username.substr(pos + 1); std::string url = lookupDNSSRV(domain); urls.clear(); urls.push_back(url); m_contextSettings->setURLs(urls, StringPrintf("DNS SRV URL for domain %s and service %s", domain.c_str(), serviceType().c_str())); } // start talking to host defined by m_settings->getURL() m_session = Neon::Session::create(m_settings); SE_LOG_INFO(getDisplayName(), "start database search at %s%s%s", m_settings->getURL().c_str(), m_contextSettings ? ", from " : "", m_contextSettings ? m_contextSettings->getURLDescription().c_str() : ""); // Find default calendar. Same for address book, with slightly // different parameters. // // Stops when: // - current path is calendar collection (= contains VEVENTs) // Gives up: // - when running in circles // - nothing else to try out // - tried 10 times // Follows: // - current-user-principal // - CalDAV calendar-home-set // - collections // // TODO: support more than one calendar. Instead of stopping at the first one, // scan more throroughly, then decide deterministically. int counter = 0; const int limit = 1000; // Keeps track of paths to look at and those which were already // tested. What is done for each candidate varies. class Tried : public std::set { std::list m_candidates; bool m_found; public: Tried() : m_found(false) {} /** Was path not tested yet and is not already a candidate? */ bool isNew(const Candidate &candidate) { return !candidate.empty() && find(candidate) == end() && std::find(m_candidates.begin(), m_candidates.end(), candidate) == m_candidates.end(); } /** Hand over next candidate to caller, empty if none available. */ Candidate getNextCandidate() { if (!m_candidates.empty() ) { Candidate candidate = m_candidates.front(); m_candidates.pop_front(); return candidate; } else { return Candidate(); } } /** remember that path was tested */ void insert(const Candidate &candidate) { std::set::insert(candidate); m_candidates.remove(candidate); } enum Position { FRONT, BACK }; void addCandidate(const Candidate &candidate, Position position) { if (isNew(candidate)) { if (position == FRONT) { m_candidates.push_front(candidate); } else { m_candidates.push_back(candidate); } } } void foundResult() { m_found = true; } /** Nothing left to try and nothing found => bail out with error for last candidate. */ bool errorIsFatal() { return m_candidates.empty() && !m_found; } } tried; // Populate URLs to be scanned with configured URLs. BOOST_FOREACH(const std::string &url, urls) { Neon::URI uri = Neon::URI::parse(url); // Avoid listing members for the initial URLs. If the user gave us // the root of a generic WebDAV server, a recursive listing of // all resource collections on it will take too long. We only // list the home sets. Candidate candidate(Neon::URI::parse(url), Candidate::NONE); tried.addCandidate(candidate, Tried::BACK); // Add well-known URL as fallback to be tried if configured // path was empty. eGroupware also replies with a redirect for the // empty path, but relying on that alone is risky because it isn't // specified. if (candidate.m_uri.m_path.empty() || candidate.m_uri.m_path == "/") { std::string wellknown = wellKnownURL(); if (!wellknown.empty()) { tried.addCandidate(Candidate(candidate.m_uri, wellknown, Candidate::NONE), Tried::BACK); } } } Candidate candidate = tried.getNextCandidate(); Props_t davProps; Neon::Session::PropfindPropCallback_t callback = boost::bind(&WebDAVSource::openPropCallback, this, boost::ref(davProps), _1, _2, _3, _4); // With Yahoo! the initial connection often failed with 50x // errors. Retrying individual requests is error prone because at // least one (asking for .well-known/[caldav|carddav]) always // results in 502. Let the PROPFIND requests be resent, but in // such a way that the overall discovery will never take longer // than the total configured timeout period. // // The PROPFIND with openPropCallback is idempotent, because it // will just overwrite previously found information in davProps. // Therefore resending is okay. Timespec finalDeadline = createDeadline(); // no resending if left empty // Remember whether we have found the home set. If we do not come // across it as part of the regular search, then we need to search // a bit harder for it. bool haveHomeSet = false; // Remember whether we have results for https://apidata.googleusercontent.com:443/caldav/v2. bool haveGoogleCalDAV2 = false; while (true) { bool usernameInserted = false; Candidate next; // Replace %u with the username, if the %u is found. Also, keep track // of this event happening, because if we later on get a 404 error, // we will convert it to 401 only if the path contains the username // and it was indeed us who put the username there (not the server). if (boost::find_first(candidate.m_uri.m_path, "%u")) { boost::replace_all(candidate.m_uri.m_path, "%u", Neon::URI::escape(username)); usernameInserted = true; } tried.insert(candidate); SE_LOG_DEBUG(NULL, "testing %s", candidate.m_uri.toURL().c_str()); Neon::URI currentURI = m_session->getURI(); Neon::URI &newURI = candidate.m_uri; bool success = false; bool isWellKnown = boost::starts_with(candidate.m_uri.m_path, "/.well-known/"); // Special hack Google: if we already have results for the current CalDAV // endpoint, then don't try the legacy one. if (newURI.m_host == "www.google.com" && (boost::starts_with(newURI.m_path, "/calendar/dav/") || newURI.m_path =="/calendar/dav") && haveGoogleCalDAV2) { SE_LOG_DEBUG(getDisplayName(), "skipping legacy Google CalDAV"); goto next; } // Accessing the well-known URIs should lead to a redirect, but // with Yahoo! Calendar all I got was a 502 "connection refused". // Yahoo! Contacts also doesn't redirect. Instead on ends with // a Principal resource - perhaps reading that would lead further. // // So anyway, let's try the well-known URI first, but also add // the root path as fallback. if (candidate.m_uri.m_path == "/.well-known/caldav/" || candidate.m_uri.m_path == "/.well-known/carddav/") { // remove trailing slash added by normalization, to be aligned with draft-daboo-srv-caldav-10 candidate.m_uri.m_path.resize(candidate.m_uri.m_path.size() - 1); // Yahoo! Calendar returns no redirect. According to rfc4918 appendix-E, // a client may simply try the root path in case of such a failure, // which happens to work for Yahoo. tried.addCandidate(Candidate(currentURI, "/", Candidate::NONE), Tried::BACK); // TODO: Google Calendar, with workarounds // candidates.push_back(StringPrintf("/calendar/dav/%s/user/", Neon::URI::escape(username).c_str())); } try { if (newURI.m_scheme != currentURI.m_scheme || newURI.m_host != currentURI.m_host || newURI.getPort() != currentURI.getPort()) { // Need to re-initialize the session. if (m_contextSettings) { SE_LOG_DEBUG(getDisplayName(), "switching HTTP session from %s to %s", currentURI.toURL().c_str(), newURI.toURL().c_str()); m_contextSettings->setURL(newURI.toURL(), "redirect during database scan"); } else { SE_THROW(StringPrintf("switching HTTP session from %s to %s not possible at the moment", currentURI.toURL().c_str(), newURI.toURL().c_str())); } m_session = Neon::Session::create(m_settings); } currentURI = newURI; // disable resending for some known cases where it never succeeds Timespec deadline = finalDeadline; if (isWellKnown && m_settings->getURL().find("yahoo.com") != string::npos) { deadline = Timespec(); } if (Logger::instance().getLevel() >= Logger::DEV) { // First dump WebDAV "allprops" properties (does not contain // properties which must be asked for explicitly!). Only // relevant for debugging. try { SE_LOG_DEBUG(NULL, "debugging: read all WebDAV properties of %s", candidate.m_uri.toURL().c_str()); // Use OAuth2, if available. boost::shared_ptr authProvider = m_settings->getAuthProvider(); if (authProvider->methodIsSupported(AuthProvider::AUTH_METHOD_OAUTH2)) { m_session->forceAuthorization(authProvider); } Neon::Session::PropfindPropCallback_t callback = boost::bind(&WebDAVSource::openPropCallback, this, boost::ref(davProps), _1, _2, _3, _4); m_session->propfindProp(candidate.m_uri.m_path, 0, NULL, callback, Timespec()); } catch (const Neon::FatalException &ex) { throw; } catch (...) { handleException(HANDLE_EXCEPTION_NO_ERROR); } } // Now ask for some specific properties of interest for us. // Using CALDAV:allprop would be nice, but doesn't seem to // be possible with Neon. // // The "current-user-principal" is particularly relevant, // because it leads us from // "/.well-known/[carddav/caldav]" (or whatever that // redirected to) to the current user and its // "[calendar/addressbook]-home-set". // // Apple Calendar Server only returns that information if // we force authorization to be used. Otherwise it returns // // // // // We send valid credentials here, using Basic authorization, // if configured to use credentials instead of something like OAuth2. // The rationale is that this cuts down on the number of // requests for https while still being secure. For // http, our Neon wrapper is smart enough to ignore our request. // // See also: // http://tools.ietf.org/html/rfc4918#appendix-E // http://lists.w3.org/Archives/Public/w3c-dist-auth/2005OctDec/0243.html // http://thread.gmane.org/gmane.comp.web.webdav.neon.general/717/focus=719 m_session->forceAuthorization(m_settings->getAuthProvider()); davProps.clear(); // Avoid asking for CardDAV properties when only using CalDAV // and vice versa, to avoid breaking both when the server is only // broken for one of them (like Google, which (temporarily?) sent // invalid CardDAV properties). static const ne_propname caldav[] = { // WebDAV ACL { "DAV:", "alternate-URI-set" }, { "DAV:", "principal-URL" }, { "DAV:", "current-user-principal" }, { "DAV:", "group-member-set" }, { "DAV:", "group-membership" }, { "DAV:", "displayname" }, { "DAV:", "resourcetype" }, // CalDAV { "urn:ietf:params:xml:ns:caldav", "calendar-home-set" }, { "urn:ietf:params:xml:ns:caldav", "calendar-description" }, { "urn:ietf:params:xml:ns:caldav", "calendar-timezone" }, { "urn:ietf:params:xml:ns:caldav", "supported-calendar-component-set" }, { "urn:ietf:params:xml:ns:caldav", "supported-calendar-data" }, { "urn:ietf:params:xml:ns:caldav", "max-resource-size" }, { "urn:ietf:params:xml:ns:caldav", "min-date-time" }, { "urn:ietf:params:xml:ns:caldav", "max-date-time" }, { "urn:ietf:params:xml:ns:caldav", "max-instances" }, { "urn:ietf:params:xml:ns:caldav", "max-attendees-per-instance" }, // ACL, http://www.ietf.org/rfc/rfc3744.txt { "DAV:", "current-user-privilege-set" }, { NULL, NULL } }; static const ne_propname carddav[] = { // WebDAV ACL { "DAV:", "alternate-URI-set" }, { "DAV:", "principal-URL" }, { "DAV:", "current-user-principal" }, { "DAV:", "group-member-set" }, { "DAV:", "group-membership" }, { "DAV:", "displayname" }, { "DAV:", "resourcetype" }, // CardDAV { "urn:ietf:params:xml:ns:carddav", "addressbook-home-set" }, { "urn:ietf:params:xml:ns:carddav", "principal-address" }, { "urn:ietf:params:xml:ns:carddav", "addressbook-description" }, { "urn:ietf:params:xml:ns:carddav", "supported-address-data" }, { "urn:ietf:params:xml:ns:carddav", "max-resource-size" }, // ACL, http://www.ietf.org/rfc/rfc3744.txt { "DAV:", "current-user-privilege-set" }, { NULL, NULL } }; SE_LOG_DEBUG(NULL, "read relevant properties of %s", candidate.m_uri.toURL().c_str()); m_session->propfindProp(candidate.m_uri.m_path, 0, getContent() == "VCARD" ? carddav : caldav, callback, deadline); success = true; } catch (const Neon::FatalException &ex) { throw; } catch (const Neon::RedirectException &ex) { // follow to new location Neon::URI next = Neon::URI::parse(ex.getLocation(), true); // keep old host + scheme + port if not set in next location if (next.m_scheme.empty()) { next.m_scheme = currentURI.m_scheme; } if (next.m_host.empty()) { next.m_host = currentURI.m_host; } if (!next.m_port) { next.m_port = currentURI.m_port; } Candidate nextCandidate(next, candidate.m_flags); if (tried.isNew(nextCandidate)) { SE_LOG_DEBUG(NULL, "new candidate from %s -> %s redirect", currentURI.toURL().c_str(), next.toURL().c_str()); tried.addCandidate(nextCandidate, Tried::FRONT); } else { SE_LOG_DEBUG(NULL, "already known candidate from %s -> %s redirect", currentURI.toURL().c_str(), next.toURL().c_str()); } } catch (const TransportStatusException &ex) { SE_LOG_DEBUG(NULL, "TransportStatusException: %s", ex.what()); if (ex.syncMLStatus() == 404 && boost::find_first(candidate.m_uri.m_path, username) && usernameInserted) { // We're actually looking at an authentication error: the path to the calendar has // not been found, so the username was wrong. Let's hijack the error message and // code of the exception by throwing a new one. string descr = StringPrintf("Path not found: %s. Is the username '%s' correct?", candidate.m_uri.toURL().c_str(), username.c_str()); int code = 401; SE_THROW_EXCEPTION_STATUS(TransportStatusException, descr, SyncMLStatus(code)); } else if (isWellKnown && !didDNS) { // The server doesn't have the .well-known redirect that we were looking for. // We might be able to find the right server via DNS SRV lookup instead. // Happens with [www].icloud.com, for which DNS SRV points to // https://[caldav|carddav].icloud.com:443/.well-known/[caldav|carddav] std::string domain = m_session->getURI().m_host; std::string wwwdomain; static const char WWW[] = "www."; if (boost::starts_with(domain, WWW)) { wwwdomain = domain; domain.erase(0, sizeof(WWW) - 1); } std::string url; didDNS = true; try { SE_LOG_DEBUG(getDisplayName(), "try DNS SRV lookup after .well-known failed: %s", domain.c_str()); url = lookupDNSSRV(domain); } catch (const Exception &ex) { if (!wwwdomain.empty()) { SE_LOG_DEBUG(getDisplayName(), "try DNS SRV lookup with www prefix: %s", wwwdomain.c_str()); url = lookupDNSSRV(wwwdomain); } else if (tried.errorIsFatal()) { throw; } else { SE_LOG_DEBUG(NULL, "ignore error for DNS SRV fallback: %s", ex.what()); } } if (!url.empty()) { Neon::URI uri = Neon::URI::parse(url); Candidate dnsCandidate(uri, Candidate::NONE); if (tried.isNew(dnsCandidate)) { tried.addCandidate(dnsCandidate, Tried::FRONT); SE_LOG_DEBUG(getDisplayName(), "new candidate from DNS SRV lookup: %s", uri.toURL().c_str()); } } } else { if (tried.errorIsFatal()) { throw; } else { // ignore the error (whatever it was!), try next // candidate; needed to handle 502 "Connection // refused" for /.well-known/caldav/ from Yahoo! // Calendar SE_LOG_DEBUG(NULL, "ignore error for URI candidate: %s", ex.what()); } } } catch (const Exception &ex) { if (tried.errorIsFatal()) { throw; } else { // ignore the error (whatever it was!), try next // candidate; needed to handle 502 "Connection // refused" for /.well-known/caldav/ from Yahoo! // Calendar SE_LOG_DEBUG(NULL, "ignore error for URI candidate: %s", ex.what()); } } if (success) { Props_t::iterator pathProps = davProps.find(candidate.m_uri.m_path); if (pathProps == davProps.end()) { // No reply for requested path? Happens with Yahoo Calendar server, // which returns information about "/dav" when asked about "/". // Move to that path. if (!davProps.empty()) { pathProps = davProps.begin(); string newpath = pathProps->first; SE_LOG_DEBUG(NULL, "use properties for '%s' instead of '%s'", newpath.c_str(), candidate.m_uri.toURL().c_str()); candidate.m_uri.m_path = newpath; } } StringMap *props = pathProps == davProps.end() ? NULL : &pathProps->second; bool isResult = false; std::string type; if (props) { type = (*props)["DAV::resourcetype"]; } bool isCollection = type.find("") != type.npos; if (isCollection && props && isLeafCollection(*props) && typeMatches(*props)) { isResult = true; StringMap::const_iterator it; // TODO: filter out CalDAV collections which do // not contain the right components // (urn:ietf:params:xml:ns:caldav:supported-calendar-component-set) // found something tried.foundResult(); it = props->find("DAV::displayname"); Neon::URI uri = m_session->getURI(); uri.m_path = candidate.m_uri.m_path; std::string name; if (it != props->end()) { name = it->second; } // Might be read-only. Assume it is read/write unless we // find the opposite. bool isReadOnly = false; it = props->find("DAV::current-user-privilege-set"); if (it != props->end()) { const std::string &priviliges = it->second; SE_LOG_DEBUG(NULL, "current-user-privilege-set: %s", priviliges.c_str()); // Be careful here: parsing XML with string operations is fragile, // so don't go to read-only mode if we don't find DAV::read. // Also beware of the double vs. single colon oddity from libneon. if ((priviliges.find("DAV::write") == priviliges.npos && priviliges.find("DAV::read") != priviliges.npos) || (priviliges.find("DAV:write") == priviliges.npos && priviliges.find("DAV:read") != priviliges.npos)) { isReadOnly = true; } } else { SE_LOG_DEBUG(NULL, "no current-user-privilege-set, assume read/write"); } SE_LOG_DEBUG(NULL, "found %s = %s", name.c_str(), uri.toURL().c_str()); if (uri.m_host == "apidata.googleusercontent.com" && boost::starts_with(uri.m_path, "/caldav/v2/")) { haveGoogleCalDAV2 = true; } res = storeResult(name, uri, isReadOnly); if (!res) { // done break; } } // find next path: // prefer CardDAV:calendar-home-set or CalDAV:addressbook-home-set std::list homes; if (props) { homes = extractHREFs((*props)[homeSetProp()]); } BOOST_FOREACH(const std::string &home, homes) { // The home set is a collection of collections, so it // cannot be the collection we look for. But it contains them, // so we must list its content. Candidate homeCandidate(m_session->getURI(), home, Candidate::LIST); if (tried.isNew(homeCandidate)) { haveHomeSet = true; if (next.empty()) { // Follow it directly before any other // candidates because the home set is most // likely to contain the default collection. SE_LOG_DEBUG(NULL, "follow home-set property to %s", homeCandidate.m_uri.toURL().c_str()); next = homeCandidate; } else { SE_LOG_DEBUG(NULL, "new candidate from home-set property %s", home.c_str()); tried.addCandidate(homeCandidate, Tried::FRONT); } } } // alternatively, follow principal URL if (next.empty()) { Candidate principal(m_session->getURI(), props ? extractHREF((*props)["DAV::current-user-principal"]) : "", Candidate::NONE); // TODO: // xmlns:d="DAV:" // /m8/carddav/principals/__uids__/patrick.ohly@googlemail.com/ if (tried.isNew(principal)) { next = principal; SE_LOG_DEBUG(NULL, "follow current-user-prinicipal to %s", next.m_uri.toURL().c_str()); } } if (isResult && next.empty() && !haveHomeSet) { // We found a valid collection without having seen the // home set, and the meta data of the collection does // not point us to the principal or the home set. // // Happens with Google CaldDAV, causing us to not find // other calendars if scan started at the default // calendar. As a workaround, walk up the uri and check // them for meta data. std::string path = candidate.m_uri.m_path; size_t pos; while ((pos = path.rfind('/')) != path.npos) { path.resize(pos); Candidate parent(m_session->getURI(), path.empty() ? "/" : path, Candidate::NONE); if (tried.isNew(parent)) { SE_LOG_DEBUG(NULL, "check parent %s", parent.m_uri.toURL().c_str()); tried.addCandidate(parent, Tried::BACK); } } } // Finally, recursively descend into some collections. if (isCollection) { if (props && isLeafCollection(*props)) { // The goal here was to prevent diving into collections which are // known to not contain other relevant collections. SE_LOG_DEBUG(NULL, "skipping listing because collection cannot contain other relevant collections: %s", candidate.m_uri.toURL().c_str()); } else if (!(candidate.m_flags & Candidate::LIST)) { SE_LOG_DEBUG(NULL, "skipping listing because we don't know whether collection contains relevant collections: %s", candidate.m_uri.toURL().c_str()); } else { // List members and find new candidates. // Yahoo! Calendar does not return resources contained in /dav//Calendar/ // if is used. Properties must be requested explicitly. SE_LOG_DEBUG(NULL, "list items in %s", candidate.m_uri.toURL().c_str()); // See findCollections() for the reason why we are not mixing CalDAV and CardDAV // properties. static const ne_propname caldav[] = { { "DAV:", "displayname" }, { "DAV:", "resourcetype" }, { "urn:ietf:params:xml:ns:caldav", "calendar-home-set" }, { "urn:ietf:params:xml:ns:caldav", "calendar-description" }, { "urn:ietf:params:xml:ns:caldav", "calendar-timezone" }, { "urn:ietf:params:xml:ns:caldav", "supported-calendar-component-set" }, { NULL, NULL } }; static const ne_propname carddav[] = { { "DAV:", "displayname" }, { "DAV:", "resourcetype" }, { "urn:ietf:params:xml:ns:carddav", "addressbook-home-set" }, { "urn:ietf:params:xml:ns:carddav", "addressbook-description" }, { "urn:ietf:params:xml:ns:carddav", "supported-address-data" }, { NULL, NULL } }; davProps.clear(); m_session->propfindProp(candidate.m_uri.m_path, 1, getContent() == "VCARD" ? carddav : caldav, callback, finalDeadline); // Also list recursively. The home set may be an // "ordinary collection that has child or // descendant calendar collections owned by the // principal" (RFC 4791). int subFlags = Candidate::LIST; BOOST_FOREACH(Props_t::value_type &entry, davProps) { const std::string &sub = entry.first; const std::string &subType = entry.second["DAV::resourcetype"]; Candidate subCandidate(m_session->getURI(), sub, subFlags); // new candidates are: // - untested // - not already a candidate // - a resource, but not the CalDAV schedule-inbox/outbox // - not shared ("global-addressbook" in Apple Calendar Server), // because these are unlikely to be the right "default" collection // // Trying to prune away collections here which are not of the // right type *and* cannot contain collections of the right // type (example: Apple Calendar Server "inbox" under // calendar-home-set URL with type "CALDAV:schedule-inbox") requires // knowledge not current provided by derived classes. TODO (?). if (!tried.isNew(subCandidate)) { SE_LOG_DEBUG(NULL, "skipping because already checked: %s", sub.c_str()); } else if (subType.find("") == subType.npos || subType.find("getURI(), sub, subFlags); if (tried.isNew(subCandidate)) { tried.addCandidate(subCandidate, Tried::BACK); SE_LOG_DEBUG(NULL, "new sub candidate: %s", sub.c_str()); } } } } } } next: if (next.empty()) { // use next untried candidate next = tried.getNextCandidate(); if (next.empty()) { // done searching break; } SE_LOG_DEBUG(NULL, "follow candidate %s", next.m_uri.toURL().c_str()); } counter++; if (counter > limit) { throwError(SE_HERE, StringPrintf("giving up search for collection after %d attempts", limit)); } candidate = next; } return res; } std::string WebDAVSource::extractHREF(const std::string &propval) { // all additional parameters after opening resp. closing tag static const std::string hrefStart = "', start); if (start != propval.npos) { start++; size_t end = propval.find(hrefEnd, start); if (end != propval.npos) { return propval.substr(start, end - start); } } return ""; } std::list WebDAVSource::extractHREFs(const std::string &propval) { std::list res; // all additional parameters after opening resp. closing tag static const std::string hrefStart = "', start); if (start != propval.npos) { start++; size_t end = propval.find(hrefEnd, start); if (end != propval.npos) { res.push_back(propval.substr(start, end - start)); current = end; } else { break; } } else { break; } } return res; } void WebDAVSource::openPropCallback(Props_t &davProps, const Neon::URI &uri, const ne_propname *prop, const char *value, const ne_status *status) { // TODO: recognize CALDAV:calendar-timezone and use it for local time conversion of events std::string name; if (prop->nspace) { name = prop->nspace; } name += ":"; name += prop->name; if (value) { davProps[uri.m_path][name] = value; boost::trim_if(davProps[uri.m_path][name], boost::is_space()); } } bool WebDAVSource::isEmpty() { contactServer(); // listing all items is relatively efficient, let's use that // TODO: use truncated result search RevisionMap_t revisions; listAllItems(revisions); return revisions.empty(); } bool WebDAVSource::isUsable() { // Traditionally, this check used getDatabases() which // succeeded with a fixed response if no credentials were given. // Only if credentials were give was the source really checked, // and that check was broken because it did not really verify // that a given "database" really was a collection. // // It was also surprising that a simple configure operation // resulted in a server access. // // So let's pretend that all WebDAV sources are usable for now // until we figure out a better approach. return true; } void WebDAVSource::close() { m_session.reset(); } static bool storeCollection(SyncSource::Databases &result, const std::string &name, const Neon::URI &uri, bool isReadOnly) { std::string url = uri.toURL(); // avoid duplicates BOOST_FOREACH(const SyncSource::Database &entry, result) { if (entry.m_uri == url) { // already found before return true; } } result.push_back(SyncSource::Database(name, url, false, isReadOnly)); return true; } WebDAVSource::Databases WebDAVSource::getDatabases() { Databases result; // do a scan if some kind of credentials were set if (m_contextSettings->getAuthProvider()->wasConfigured()) { findCollections(boost::bind(storeCollection, boost::ref(result), _1, _2, _3)); // Move all read-only collections to the end of the array. // They are probably not the default calendar (for example, // with ownCloud we find a read-only "Birthday Calendar" // before the "Default Calendar"). // // WebDAVSource::contactServer() does the same. size_t e = result.size(), i = 0; while (i < e) { if (result[i].m_isReadOnly) { // Move to end. result.push_back(result[i]); // Remove at current position. result.erase(result.begin() + i); // Check that position again and ignore the already // checked entry at the end. e--; } else { // Next position. i++; } } if (!result.empty()) { result.front().m_isDefault = true; } } else { result.push_back(Database("select database via absolute URL, set username/password to scan, set syncURL to base URL if server does not support auto-discovery", "")); } return result; } void WebDAVSource::getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { contactServer(); TrackingSyncSource::getSynthesisInfo(info, fragments); // only CalDAV enforces unique UID std::string content = getContent(); if (content == "VEVENT" || content == "VTODO" || content == "VJOURNAL") { info.m_globalIDs = true; } if (content == "VEVENT") { info.m_backendRule = "HAVE-SYNCEVOLUTION-EXDATE-DETACHED"; } else if (content == "VCARD") { // Assume that a CardDAV server has and preserves UID values. info.m_backendRule = "CARDDAV"; fragments.m_remoterules["CARDDAV"] = " \n" " none\n" " yes\n" " \n" " \n" " \n" " \n" " "; // Assume that a CardDAV server uses IMPP (RFC 4770) and // Apple Address book (X-AB) extensions. Convert to the traditional, // internal fields (ANNIVERSARY, JABBER, etc.) after reading // from a CardDAV server and from the traditional fields // before writing. info.m_beforeWriteScript = "$VCARD_BEFOREWRITE_SCRIPT_WEBDAV;\n"; info.m_afterReadScript = "$VCARD_AFTERREAD_SCRIPT_WEBDAV;\n"; } // TODO: instead of identifying the peer based on the // session URI, use some information gathered about // it during contactServer() if (m_session) { string host = m_session->getURI().m_host; if (host.find("google") != host.npos) { info.m_backendRule = "GOOGLE"; // Same as CARDDAV above, minus HAVE-EVOLUTION-UI-SLOT-IN-IMPP. // Sending IMPP;X-SERVICE-TYPE=..;X-EVOLUTION-UI-SLOT= // causes Google to ignore X-SERVICE-TYPE. fragments.m_remoterules["GOOGLE"] = " \n" " none\n" " yes\n" " \n" // " \n" " \n" " \n" " "; } else if (host.find("yahoo") != host.npos) { info.m_backendRule = "YAHOO"; fragments.m_remoterules["YAHOO"] = " \n" " none\n" // Yahoo! Contacts reacts with a "500 - internal server error" // to an empty X-GENDER property. In general, empty properties // should never be necessary in CardDAV and CalDAV, because // sent items conceptually replace the one on the server, so // disable them all. " yes\n" // BDAY is ignored if it has the compact 19991231 instead of // 1999-12-31, although both are valid. " \n" // Yahoo accepts extensions, so send them. However, it // doesn't seem to store the X-EVOLUTION-UI-SLOT parameter // extensions. " \n" " \n" " \n" " "; } } SE_LOG_DEBUG(getDisplayName(), "using data conversion rules for '%s'", info.m_backendRule.c_str()); } void WebDAVSource::storeServerInfos() { if (getDatabaseID().empty()) { // user did not select resource, remember the one used for the // next sync setDatabaseID(m_calendar.toURL()); getProperties()->flush(); } } void WebDAVSource::checkPostSupport() { if (m_postPath.wasSet()) { return; } static const ne_propname getaddmember[] = { { "DAV:", "add-member" }, { NULL, NULL } }; Timespec deadline = createDeadline(); Props_t davProps; Neon::Session::PropfindPropCallback_t callback = boost::bind(&WebDAVSource::openPropCallback, this, boost::ref(davProps), _1, _2, _3, _4); SE_LOG_DEBUG(NULL, "check POST support of %s", m_calendar.m_path.c_str()); m_session->propfindProp(m_calendar.m_path, 0, getaddmember, callback, deadline); // Fatal communication problems will be reported via exceptions. // Once we get here, invalid or incomplete results can be // treated as "don't have revision string". m_postPath = extractHREF(davProps[m_calendar.m_path]["DAV::add-member"]); SE_LOG_DEBUG(NULL, "%s POST support: %s", m_calendar.m_path.c_str(), m_postPath.empty() ? "" : m_postPath.get().c_str()); } /** * See https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-ctag.txt */ static const ne_propname getctag[] = { { "http://calendarserver.org/ns/", "getctag" }, { NULL, NULL } }; std::string WebDAVSource::databaseRevision() { if (m_contextSettings && m_contextSettings->noCTag()) { // return empty string to disable usage of CTag return ""; } contactServer(); Timespec deadline = createDeadline(); Props_t davProps; Neon::Session::PropfindPropCallback_t callback = boost::bind(&WebDAVSource::openPropCallback, this, boost::ref(davProps), _1, _2, _3, _4); SE_LOG_DEBUG(NULL, "read ctag of %s", m_calendar.m_path.c_str()); m_session->propfindProp(m_calendar.m_path, 0, getctag, callback, deadline); // Fatal communication problems will be reported via exceptions. // Once we get here, invalid or incomplete results can be // treated as "don't have revision string". string ctag = davProps[m_calendar.m_path]["http://calendarserver.org/ns/:getctag"]; return ctag; } static const ne_propname getetag[] = { { "DAV:", "getetag" }, { "DAV:", "resourcetype" }, { NULL, NULL } }; void WebDAVSource::listAllItems(RevisionMap_t &revisions) { contactServer(); if (!getContentMixed()) { // Can use simple PROPFIND because we do not have to // double-check that each item really contains the right data. bool failed = false; Timespec deadline = createDeadline(); m_session->propfindURI(m_calendar.m_path, 1, getetag, boost::bind(&WebDAVSource::listAllItemsCallback, this, _1, _2, boost::ref(revisions), boost::ref(failed)), deadline); if (failed) { SE_THROW("incomplete listing of all items"); } } else { // We have to read item data and verify that it really is // something we have to (and may) work on. Currently only // happens for CalDAV, CardDAV items are uniform. The CalDAV // comp-filter alone should the trick, but some servers (for // example Radicale 0.7) ignore it and thus we could end up // deleting items we were not meant to touch. const std::string query = "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" // filter expected by Yahoo! Calendar "\n" "\n" "\n" "\n" "\n" "\n" "\n"; Timespec deadline = createDeadline(); getSession()->startOperation("REPORT 'meta data'", deadline); while (true) { string data; Neon::XMLParser parser; parser.initReportParser(boost::bind(&WebDAVSource::checkItem, this, boost::ref(revisions), _1, _2, &data)); parser.pushHandler(boost::bind(Neon::XMLParser::accept, "urn:ietf:params:xml:ns:caldav", "calendar-data", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(data), _2, _3)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } } } } std::string WebDAVSource::findByUID(const std::string &uid, const Timespec &deadline) { RevisionMap_t revisions; std::string query; if (getContent() == "VCARD") { // use CardDAV query = "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "" + uid + "\n" "\n" "\n" "\n" "\n"; } else { // use CalDAV query = "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" // Collation from RFC 4791, not supported yet by all servers. // Apple Calendar Server did not like CDATA. // TODO: escape special characters. "" /* <[CDATA[ */ + uid + /* ]]> */ "\n" "\n" "\n" "\n" "\n" "\n"; } getSession()->startOperation("REPORT 'UID lookup'", deadline); while (true) { Neon::XMLParser parser; parser.initReportParser(boost::bind(&WebDAVSource::checkItem, this, boost::ref(revisions), _1, _2, (std::string *)0)); Neon::Request report(*getSession(), "REPORT", getCalendar().m_path, query, parser); report.addHeader("Depth", "1"); report.addHeader("Content-Type", "application/xml; charset=\"utf-8\""); if (report.run()) { break; } } switch (revisions.size()) { case 0: SE_THROW_EXCEPTION_STATUS(TransportStatusException, "object not found", SyncMLStatus(404)); break; case 1: return revisions.begin()->first; break; default: // should not happen SE_THROW(StringPrintf("UID %s not unique?!", uid.c_str())); } // not reached return ""; } void WebDAVSource::listAllItemsCallback(const Neon::URI &uri, const ne_prop_result_set *results, RevisionMap_t &revisions, bool &failed) { static const ne_propname prop = { "DAV:", "getetag" }; static const ne_propname resourcetype = { "DAV:", "resourcetype" }; const char *type = ne_propset_value(results, &resourcetype); if (type && strstr(type, "")) { // skip collections return; } std::string uid = path2luid(uri.m_path); if (uid.empty()) { // skip collection itself (should have been detected as collection already) return; } const char *etag = ne_propset_value(results, &prop); if (etag) { std::string rev = ETag2Rev(etag); SE_LOG_DEBUG(NULL, "item %s = rev %s", uid.c_str(), rev.c_str()); revisions[uid] = rev; } else { failed = true; SE_LOG_ERROR(NULL, "%s: %s", uri.toURL().c_str(), Neon::Status2String(ne_propset_status(results, &prop)).c_str()); } } int WebDAVSource::checkItem(RevisionMap_t &revisions, const std::string &href, const std::string &etag, std::string *data) { // Ignore responses with no data: this is not perfect (should better // try to figure out why there is no data), but better than // failing. // // One situation is the response for the collection itself, // which comes with a 404 status and no data with Google Calendar. if (data && data->empty()) { return 0; } // No need to parse, user content cannot start at start of line in // iCalendar 2.0. if (!data || data->find("\nBEGIN:" + getContent()) != data->npos) { std::string davLUID = path2luid(Neon::URI::parse(href).m_path); std::string rev = ETag2Rev(etag); revisions[davLUID] = rev; } // reset data for next item if (data) { data->clear(); } return 0; } std::string WebDAVSource::path2luid(const std::string &path) { // m_calendar.m_path is normalized, path is not. // Before comparing, normalize it. std::string res = Neon::URI::normalizePath(path, false); if (boost::starts_with(res, m_calendar.m_path)) { res = Neon::URI::unescape(res.substr(m_calendar.m_path.size())); } else { // keep full, absolute path as LUID } return res; } std::string WebDAVSource::luid2path(const std::string &luid) { if (boost::starts_with(luid, "/")) { return luid; } else { return m_calendar.resolve(Neon::URI::escape(luid)).m_path; } } void WebDAVSource::readItem(const string &uid, std::string &item, bool raw) { Timespec deadline = createDeadline(); m_session->startOperation("GET", deadline); while (true) { item.clear(); Neon::Request req(*m_session, "GET", luid2path(uid), "", item); // useful with CardDAV: server might support more than vCard 3.0, but we don't req.addHeader("Accept", contentType()); try { if (req.run()) { break; } } catch (const TransportStatusException &ex) { if (ex.syncMLStatus() == 410) { // Radicale reports 410 'Gone'. Hmm, okay. // Let's map it to the expected 404. SE_THROW_EXCEPTION_STATUS(TransportStatusException, "object not found (was 410 'Gone')", SyncMLStatus(404)); } throw; } } } TrackingSyncSource::InsertItemResult WebDAVSource::insertItem(const string &uid, const std::string &item, bool raw) { std::string new_uid; std::string rev; InsertItemResultState state = ITEM_OKAY; // By default use PUT. Change that to POST when creating new items // and server supports it. That avoids the problem of having to // choose a path and figuring out whether the server really used it. static const char putOperation[] = "PUT"; static const char postOperation[] = "POST"; const char *operation = putOperation; if (uid.empty()) { checkPostSupport(); if (!m_postPath.empty()) { operation = postOperation; } } Timespec deadline = createDeadline(); // no resending if left empty m_session->startOperation(operation, deadline); std::string result; int counter = 0; retry: counter++; result = ""; if (uid.empty()) { // Pick a resource name (done by derived classes, by default random), // catch unexpected conflicts via If-None-Match: *. std::string buffer; const std::string *data = createResourceName(item, buffer, new_uid); Neon::Request req(*m_session, operation, operation == postOperation ? m_postPath : luid2path(new_uid), *data, result); // Clearing the idempotent flag would allow us to clearly // distinguish between a connection error (no changes made // on server) and a server failure (may or may not have // changed something) because it'll close the connection // first. // // But because we are going to try resending // the PUT anyway in case of 5xx errors we might as well // treat it like an idempotent request (which it is, // in a way, because we'll try to get our data onto // the server no matter what) and keep reusing an // existing connection. // req.setFlag(NE_REQFLAG_IDEMPOTENT, 0); // For this to work we must allow the server to overwrite // an item that we might have created before. Don't allow // that in the first attempt. Only relevant for PUT. if (operation != postOperation && counter == 1) { req.addHeader("If-None-Match", "*"); } req.addHeader("Content-Type", contentType().c_str()); static const std::set expected = boost::assign::list_of(412)(403); if (!req.run(&expected)) { goto retry; } SE_LOG_DEBUG(NULL, "add item status: %s", Neon::Status2String(req.getStatus()).c_str()); switch (req.getStatusCode()) { case 204: // stored, potentially in a different resource than requested // when the UID was recognized break; case 201: // created break; case 403: // For a POST, this might be a UID conflict that we didn't detect // ourselves. Happens for VJOURNAL and the testInsertTwice test // when testing with Apple Calendar server. It then returns: // Content-Type: text/xml // Body: // // // // /calendars/__uids__/user01/tasks/c5490e736b6836c4d353d98bc78b3a3d.ics // // UID already exists // // // Handling that would be nice (see FDO #77424), but for now we just // do the same as for "Precondition Failed" and search for the UID. if (operation == postOperation) { try { std::string uid = extractUID(item); if (!uid.empty()) { std::string luid = findByUID(uid, deadline); return InsertItemResult(luid, "", ITEM_NEEDS_MERGE); } } catch (...) { // Ignore the error and report the original problem below. Exception::log(); } } SE_THROW_EXCEPTION_STATUS(TransportStatusException, std::string("unexpected status for PUT: ") + Neon::Status2String(req.getStatus()), SyncMLStatus(req.getStatus()->code)); break; case 412: { // "Precondition Failed": our only precondition is the one about // If-None-Match, which means that there must be an existing item // with the same UID. Go find it, so that we can report back the // right luid. std::string uid = extractUID(item); std::string luid = findByUID(uid, deadline); return InsertItemResult(luid, "", ITEM_NEEDS_MERGE); break; } default: SE_THROW_EXCEPTION_STATUS(TransportStatusException, std::string("unexpected status for insert: ") + Neon::Status2String(req.getStatus()), SyncMLStatus(req.getStatus()->code)); break; } rev = getETag(req); std::string real_luid = getLUID(req); if (!real_luid.empty()) { // Google renames the resource automatically to something of the form // .ics. Interestingly enough, our 1234567890!@#$%^&*()<>@dummy UID // test case leads to a resource path which Google then cannot find // via CalDAV. client-test must run with CLIENT_TEST_SIMPLE_UID=1... SE_LOG_DEBUG(NULL, "new item mapped to %s", real_luid.c_str()); new_uid = real_luid; // TODO: find a better way of detecting unexpected updates. // state = ... } else if (!rev.empty()) { // Yahoo Contacts returns an etag, but no href. For items // that were really created as requested, that's okay. But // Yahoo Contacts silently merges the new contact with an // existing one, presumably if it is "similar" enough. The // web interface allows creating identical contacts // multiple times; not so CardDAV. We are not even told // the path of that other contact... Detect this by // checking whether the item really exists. // // Google also returns an etag without a href. However, // Google really creates a new item. We cannot tell here // whether merging took place. As we are supporting Google // but not Yahoo at the moment, let's assume that a new item // was created. RevisionMap_t revisions; bool failed = false; m_session->propfindURI(luid2path(new_uid), 0, getetag, boost::bind(&WebDAVSource::listAllItemsCallback, this, _1, _2, boost::ref(revisions), boost::ref(failed)), deadline); // Turns out we get a result for our original path even in // the case of a merge, although the original path is not // listed when looking at the collection. Let's use that // to return the "real" uid to our caller. if (revisions.size() == 1 && revisions.begin()->first != new_uid) { SE_LOG_DEBUG(NULL, "%s mapped to %s by peer", new_uid.c_str(), revisions.begin()->first.c_str()); new_uid = revisions.begin()->first; // This would have to be uncommented for Yahoo. // state = ITEM_REPLACED; } } } else { new_uid = uid; std::string buffer; const std::string *data = setResourceName(item, buffer, new_uid); Neon::Request req(*m_session, "PUT", luid2path(new_uid), *data, result); // See above for discussion of idempotent and PUT. // req.setFlag(NE_REQFLAG_IDEMPOTENT, 0); req.addHeader("Content-Type", contentType()); // TODO: match exactly the expected revision, aka ETag, // or implement locking. Note that the ETag might not be // known, for example in this case: // - PUT succeeds // - PROPGET does not // - insertItem() fails // - Is retried? Might need slow sync in this case! // // req.addHeader("If-Match", etag); if (!req.run()) { goto retry; } SE_LOG_DEBUG(NULL, "update item status: %s", Neon::Status2String(req.getStatus()).c_str()); switch (req.getStatusCode()) { case 204: // the expected outcome, as we were asking for an overwrite break; case 201: // Huh? Shouldn't happen, but Google sometimes reports it // even when updating an item. Accept it. // SE_THROW("unexpected creation instead of update"); break; default: SE_THROW_EXCEPTION_STATUS(TransportStatusException, std::string("unexpected status for update: ") + Neon::Status2String(req.getStatus()), SyncMLStatus(req.getStatus()->code)); break; } rev = getETag(req); std::string real_luid = getLUID(req); if (!real_luid.empty() && real_luid != new_uid) { SE_THROW(StringPrintf("updating item: real luid %s does not match old luid %s", real_luid.c_str(), new_uid.c_str())); } } if (rev.empty()) { // Server did not include etag header. Must request it // explicitly (leads to race condition!). Google Calendar // assigns a new ETag even if the body has not changed, // so any kind of caching of ETag would not work either. bool failed = false; RevisionMap_t revisions; m_session->propfindURI(luid2path(new_uid), 0, getetag, boost::bind(&WebDAVSource::listAllItemsCallback, this, _1, _2, boost::ref(revisions), boost::ref(failed)), deadline); rev = revisions[new_uid]; if (failed || rev.empty()) { SE_THROW("could not retrieve ETag"); } } return InsertItemResult(new_uid, rev, state); } std::string WebDAVSource::ETag2Rev(const std::string &etag) { std::string res = etag; if (boost::starts_with(res, "W/")) { res.erase(0, 2); } if (res.size() >= 2 && res[0] == '"' && res[res.size() - 1] == '"') { res = res.substr(1, res.size() - 2); } return res; } std::string WebDAVSource::getLUID(Neon::Request &req) { std::string location = req.getResponseHeader("Location"); if (location.empty()) { return location; } else { return path2luid(Neon::URI::parse(location).m_path); } } bool WebDAVSource::isLeafCollection(const StringMap &props) const { // CardDAV and CalDAV both promise to not contain anything // unrelated to them StringMap::const_iterator it = props.find("DAV::resourcetype"); if (it != props.end()) { const std::string &type = it->second; // allow parameters (no closing bracket) // and allow also "carddavaddressbook" (caused by invalid Neon // string concatenation?!) if (type.find("timeoutSeconds(); int retrySeconds = m_settings->retrySeconds(); if (timeoutSeconds > 0 && retrySeconds > 0) { return Timespec::monotonic() + timeoutSeconds; } else { return Timespec(); } } void WebDAVSource::removeItem(const string &uid) { Timespec deadline = createDeadline(); m_session->startOperation("DELETE", deadline); std::string item, result; boost::scoped_ptr req; while (true) { req.reset(new Neon::Request(*m_session, "DELETE", luid2path(uid), item, result)); // TODO: match exactly the expected revision, aka ETag, // or implement locking. // req.addHeader("If-Match", etag); static const std::set expected = boost::assign::list_of(412); if (req->run(&expected)) { break; } } SE_LOG_DEBUG(NULL, "remove item status: %s", Neon::Status2String(req->getStatus()).c_str()); switch (req->getStatusCode()) { case 204: // the expected outcome break; case 200: // reported by Radicale, also okay break; case 412: // Radicale reports 412 'Precondition Failed'. Hmm, okay. // Let's map it to the expected 404. SE_THROW_EXCEPTION_STATUS(TransportStatusException, "object not found (was 412 'Precondition Failed')", SyncMLStatus(404)); break; default: SE_THROW_EXCEPTION_STATUS(TransportStatusException, std::string("unexpected status for removal: ") + Neon::Status2String(req->getStatus()), SyncMLStatus(req->getStatus()->code)); break; } } #endif /* ENABLE_DAV */ SE_END_CXX #ifdef ENABLE_MODULES # include "WebDAVSourceRegister.cpp" #endif syncevolution-1.5/src/backends/webdav/NeonCXX.h0000664000373300001540000005151212405555067023001 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Patrick Ohly */ /** * Simplifies usage of neon in C++ by wrapping some calls in C++ * classes. Includes all neon header files relevant for the backend. */ #ifndef INCL_NEONCXX #define INCL_NEONCXX #include #include #include #include #include #include #include // TODO: remove this again using namespace std; #include #include #include #include SE_BEGIN_CXX class AuthProvider; namespace Neon { #if 0 } #endif /** comma separated list of features supported by libneon in use */ std::string features(); class Request; /** * Throwing this will stop all further attempts to use the * remote service. */ class FatalException : public StatusException { public: FatalException(const std::string &file, int line, const std::string &what, SyncMLStatus status) : StatusException(file, line, what, status) {} }; class Settings { public: /** * base URL for WebDAV service */ virtual std::string getURL() = 0; /** * host name must match for SSL? */ virtual bool verifySSLHost() = 0; /** * SSL certificate must be valid? */ virtual bool verifySSLCertificate() = 0; /** * proxy URL, empty for system default */ virtual std::string proxy() = 0; /** * fill in username and password for specified realm (URL?), * throw error if not available */ virtual void getCredentials(const std::string &realm, std::string &username, std::string &password) = 0; /** * Grant access to AuthProvider. In addition to plain username/password * in getCredentials, this one here might also be used for OAuth2. */ virtual boost::shared_ptr getAuthProvider() = 0; /** * Updates password to new one returned during OAuth2 authorization. */ virtual void updatePassword(const std::string& password) = 0; /** * Google returns a 401 error even if the credentials * are valid. It seems to use that to throttle request * rates. This read/write setting remembers whether the * credentials were used successfully in the past, * in which case we try harder to get a failed request * executed. Otherwise we give up immediately. */ virtual bool getCredentialsOkay() = 0; virtual void setCredentialsOkay(bool okay) = 0; /** * standard SyncEvolution log level, see * Session::Session() how that is mapped to neon debugging */ virtual int logLevel() = 0; /** * if true, then manipulate SEQUENCE and LAST-MODIFIED properties * so that Google CalDAV server accepts updates */ virtual bool googleUpdateHack() const = 0; /** * if true, then check whether server has added an unwanted alarm * and resend to get rid of it */ virtual bool googleAlarmHack() const = 0; /** * duration in seconds after which communication with a server * fails with a timeout error; <= 0 picks a large default value */ virtual int timeoutSeconds() const = 0; /** * for network operations which fail before reaching timeoutSeconds() * and can/should be retried: try again if > 0 */ virtual int retrySeconds() const = 0; /** * use this to create a boost_shared pointer for a * Settings instance which needs to be freed differently */ struct NullDeleter { void operator()(Settings *) const {} }; }; struct URI { std::string m_scheme; std::string m_host; std::string m_userinfo; unsigned int m_port; std::string m_path; std::string m_query; std::string m_fragment; URI() : m_port(0) {} /** * Split URL into parts. Throws TransportAgentException on * invalid url. Port will be set to default for scheme if not set * in URL. Path is normalized. * * @param collection set to true if the normalized path is for * a collection and shall have a trailing sl */ static URI parse(const std::string &url, bool collection=false); static URI fromNeon(const ne_uri &other, bool collection=false); /** * produce new URI from current path and new one (may be absolute * and relative) */ URI resolve(const std::string &path) const; /** compose URL from parts */ std::string toURL() const; /** * URL-escape string */ static std::string escape(const std::string &text); static std::string unescape(const std::string &text); /** * Removes differences caused by escaping different characters. * Appends slash if path is a collection (or meant to be one) and * doesn't have a trailing slash. Removes double slashes. * * @param path an absolute path (leading slash) */ static std::string normalizePath(const std::string &path, bool collection); int compare(const URI &other) const { int res; res = m_scheme.compare(other.m_scheme); if (!res) { res = m_host.compare(other.m_host); if (!res) { res = m_userinfo.compare(other.m_userinfo); if (!res) { res = other.getPort() - getPort(); if (!res) { res = m_path.compare(other.m_path); if (!res) { res = m_query.compare(other.m_query); if (!res) { res = m_fragment.compare(other.m_fragment); } } } } } } return res; } bool operator == (const URI &other) const { return compare(other) == 0; } bool operator < (const URI &other) const { return compare(other) < 0; } bool operator <= (const URI &other) const { return compare(other) <= 0; } bool operator > (const URI &other) const { return compare(other) > 0; } bool operator >= (const URI &other) const { return compare(other) >= 0; } int getPort() const { return m_port ? m_port : m_scheme == "https" ? 443 : m_scheme == "http" ? 80 : 0; } bool empty() const { return m_scheme.empty() && m_host.empty() && m_userinfo.empty() && m_port == 0 && m_path.empty() && m_query.empty() && m_fragment.empty(); } }; /** produce debug string for status, which may be NULL */ std::string Status2String(const ne_status *status); /** * Wraps all session related activities. * Throws transport errors for fatal problems. */ class Session { /** * @param settings must provide information about settings on demand */ Session(const boost::shared_ptr &settings); static boost::shared_ptr m_cachedSession; bool m_forceAuthorizationOnce; boost::shared_ptr m_authProvider; /** * Count how often a request was sent with credentials. * If the request succeeds, we assume that the credentials * were okay. A bit fuzzy because forcing authorization * might succeed despite invalid credentials if the * server doesn't check them. */ bool m_credentialsSent; /** * Count the number of consecutive times that an OAuth2 token * failed to get accepted. This can happen when the current one * expired and needs to be refreshed or we need re-authorization * by the user. */ int m_oauthTokenRejections; /** * Cached token for OAuth2. Obtained before starting the request in run(), * used in preSend(), invalidated when it caused an authentication error * in checkError(). */ std::string m_oauth2Bearer; /** * current operation; used for debugging output */ string m_operation; /** * current deadline for operation */ Timespec m_deadline; public: /** * Create or reuse Session instance. * * One Session instance is kept alive throughout the life of the process, * to reuse proxy information (libproxy has a considerably delay during * initialization) and HTTP connection/authentication. */ static boost::shared_ptr create(const boost::shared_ptr &settings); ~Session(); #ifdef HAVE_LIBNEON_OPTIONS /** ne_options2() for a specific path*/ unsigned int options(const std::string &path); #endif /** * called with URI and complete result set; exceptions are logged, but ignored */ typedef boost::function PropfindURICallback_t; /** * called with URI and specific property, value string may be NULL (error case); * exceptions are logged and abort iterating over properties (but not URIs) */ typedef boost::function PropfindPropCallback_t; /** ne_simple_propfind(): invoke callback for each URI */ void propfindURI(const std::string &path, int depth, const ne_propname *props, const PropfindURICallback_t &callback, const Timespec &deadline); /** * ne_simple_propfind(): invoke callback for each property of each URI * @param deadline stop resending after that point in time, * zero disables resending * @param retrySeconds number of seconds to wait between resending, * must not be negative */ void propfindProp(const std::string &path, int depth, const ne_propname *props, const PropfindPropCallback_t &callback, const Timespec &deadline); /** URL which is in use */ std::string getURL() const { return m_uri.toURL(); } /** same as getURL() split into parts */ const URI &getURI() const { return m_uri; } /** * to be called *once* before executing a request * or retrying it * * call sequence is this: * - startOperation() * - repeat until success or final failure: create request, run(), checkError() * * @param operation internal descriptor for debugging (for example, PROPFIND) * @param deadline time at which the operation must be completed, otherwise it'll be considered failed; * empty if the operation is only meant to be attempted once */ void startOperation(const string &operation, const Timespec &deadline); /** * Run one attempt to execute the request. May be called multiple times. * * Uses checkError() underneath to detect fatal errors and throw * exceptions. * * @return result of Session::checkError() */ bool run(Request &request, const std::set *expectedCodes); /** * to be called after each operation which might have produced debugging output by neon; * automatically called by checkError() */ void flush(); ne_session *getSession() const { return m_session; } /** * Force next request in this session to have Basic authorization * (when username/password are provided by AuthProvider) or all * requests to use OAuth2 authentication. */ void forceAuthorization(const boost::shared_ptr &authProvider); private: boost::shared_ptr m_settings; bool m_debugging; ne_session *m_session; URI m_uri; std::string m_proxyURL; /** time when last successul request completed, maintained by checkError() */ Timespec m_lastRequestEnd; /** number of times a request was sent, maintained by startOperation(), the credentials callback, and checkError() */ int m_attempt; void checkAuthorization(); /** * throw error if error code indicates failure; * pass additional status code from a request whenever possible * * @param error return code from Neon API call * @param code HTTP status code * @param status optional ne_status pointer, non-NULL for all requests * @param location optional "Location" header value * @param expectedCodes set of codes which are normal and must not result * in retrying or an exception (returns true, as if the * operation succeeded) * * @return true for success, false if retry needed (only if deadline not empty); * errors reported via exceptions */ bool checkError(int error, int code = 0, const ne_status *status = NULL, const string &newLocation = "", const std::string &oldLocation = "", const std::set *expectedCodes = NULL); /** ne_set_server_auth() callback */ static int getCredentials(void *userdata, const char *realm, int attempt, char *username, char *password) throw(); /** ne_ssl_set_verify() callback */ static int sslVerify(void *userdata, int failures, const ne_ssl_certificate *cert) throw(); /** ne_props_result callback which invokes a PropfindURICallback_t as user data */ static void propsResult(void *userdata, const ne_uri *uri, const ne_prop_result_set *results) throw(); /** iterate over properties in result set */ static void propsIterate(const URI &uri, const ne_prop_result_set *results, const PropfindPropCallback_t &callback); /** ne_propset_iterator callback which invokes pair */ static int propIterator(void *userdata, const ne_propname *pname, const char *value, const ne_status *status) throw(); // use pointers here, g++ 4.2.3 has issues with references (which was used before) typedef std::pair PropIteratorUserdata_t; /** Neon callback for preSend() */ static void preSendHook(ne_request *req, void *userdata, ne_buffer *header) throw(); /** implements forced Basic authentication, if requested */ void preSend(ne_request *req, ne_buffer *header); }; /** * encapsulates a ne_xml_parser */ class XMLParser { public: XMLParser(); ~XMLParser(); ne_xml_parser *get() const { return m_parser; } /** * See ne_xml_startelm_cb: * arguments are parent state, namespace, name, attributes (NULL terminated) * @return < 0 abort, 0 decline, > 0 accept */ typedef boost::function StartCB_t; /** * See ne_xml_cdata_cb: * arguments are state of element, data and data len * May be NULL. * @return != 0 to abort */ typedef boost::function DataCB_t; /** * See ne_xml_endelm_cb: * arguments are state of element, namespace, name * May be NULL. * @return != 0 to abort */ typedef boost::function EndCB_t; /** * add new handler, see ne_xml_push_handler() */ XMLParser &pushHandler(const StartCB_t &start, const DataCB_t &data = DataCB_t(), const EndCB_t &end = EndCB_t()); /** * StartCB_t: accepts a new element if namespace and name match */ static int accept(const std::string &nspaceExpected, const std::string &nameExpected, const char *nspace, const char *name); /** * DataCB_t: append to std::string */ static int append(std::string &buffer, const char *data, size_t len); /** * EndCB_t: clear std::string */ static int reset(std::string &buffer); /** * called once a response is completely parse * * @param href the path for which the response was sent * @param etag it's etag, empty if not requested or available */ typedef boost::function ResponseEndCB_t; /** * Setup parser for handling REPORT result. * Already deals with href and etag, caching it * for each response and passing it to the "response * complete" callback. * * Caller still needs to push a handler for * "urn:ietf:params:xml:ns:caldav", "calendar-data", * or any other elements that it wants to know about. * * @param responseEnd called at the end of processing each response; * this is the only time when all relevant * parts of the response are guaranteed to have been seen; * when expecting only one response, the callback * is not needed */ void initReportParser(const ResponseEndCB_t &responseEnd = ResponseEndCB_t()); private: ne_xml_parser *m_parser; struct Callbacks { Callbacks(const StartCB_t &start, const DataCB_t &data = DataCB_t(), const EndCB_t &end = EndCB_t()) : m_start(start), m_data(data), m_end(end) {} StartCB_t m_start; DataCB_t m_data; EndCB_t m_end; }; std::list m_stack; /** buffers for initReportParser() */ std::string m_href, m_etag; int doResponseEnd(const ResponseEndCB_t &responseEnd) { if (responseEnd) { responseEnd(m_href, m_etag); } // clean up for next response m_href.clear(); m_etag.clear(); return 0; } static int startCB(void *userdata, int parent, const char *nspace, const char *name, const char **atts); static int dataCB(void *userdata, int state, const char *cdata, size_t len); static int endCB(void *userdata, int state, const char *nspace, const char *name); }; /** * encapsulates a ne_request, with std::string as read and write buffer */ class Request { public: /** * read and write buffers owned by caller */ Request(Session &session, const std::string &method, const std::string &path, const std::string &body, std::string &result); /** * read from buffer (owned by caller!) and * parse result as XML */ Request(Session &session, const std::string &method, const std::string &path, const std::string &body, XMLParser &parser); ~Request(); void setFlag(ne_request_flag flag, int value) { ne_set_request_flag(m_req, flag, value); } void addHeader(const std::string &name, const std::string &value) { ne_add_request_header(m_req, name.c_str(), value.c_str()); } /** * Execute the request. See Session::run(). */ bool run(const std::set *expectedCodes = NULL) { return m_session.run(*this, expectedCodes); } std::string getResponseHeader(const std::string &name) { const char *value = ne_get_response_header(m_req, name.c_str()); return value ? value : ""; } int getStatusCode() { return ne_get_status(m_req)->code; } const ne_status *getStatus() { return ne_get_status(m_req); } ne_request *getRequest() const { return m_req; } std::string *getResult() const { return m_result; } XMLParser *getParser() const { return m_parser; } std::string getPath() const { return m_path; } /** ne_block_reader implementation */ static int addResultData(void *userdata, const char *buf, size_t len); private: // buffers for string (copied by ne_request_create(), // but due to a bug in neon, our method string is still used // for credentials) std::string m_method; // Path used when creating the request. Copied by ne_request_create(), // but cannot be accessed later via the request. std::string m_path; Session &m_session; ne_request *m_req; std::string *m_result; XMLParser *m_parser; }; /** thrown for 301 HTTP status */ class RedirectException : public TransportException { const int m_code; const std::string m_url; public: RedirectException(const std::string &file, int line, const std::string &what, int code, const std::string &url) : TransportException(file, line, what), m_code(code), m_url(url) {} ~RedirectException() throw() {} /** returns exact HTTP status code (301, 302, ...) */ int getCode() const { return m_code; } /** returns URL to where the request was redirected */ std::string getLocation() const { return m_url; } }; } SE_END_CXX #endif // INCL_NEONCXX syncevolution-1.5/src/backends/webdav/NeonCXX.cpp0000664000373300001540000010524112405555067023333 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Patrick Ohly */ #include #ifdef ENABLE_DAV #include "NeonCXX.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX namespace Neon { #if 0 } #endif std::string features() { std::list res; if (ne_has_support(NE_FEATURE_SSL)) { res.push_back("SSL"); } if (ne_has_support(NE_FEATURE_ZLIB)) { res.push_back("ZLIB"); } if (ne_has_support(NE_FEATURE_IPV6)) { res.push_back("IPV6"); } if (ne_has_support(NE_FEATURE_LFS)) { res.push_back("LFS"); } if (ne_has_support(NE_FEATURE_SOCKS)) { res.push_back("SOCKS"); } if (ne_has_support(NE_FEATURE_TS_SSL)) { res.push_back("TS_SSL"); } if (ne_has_support(NE_FEATURE_I18N)) { res.push_back("I18N"); } return boost::join(res, ", "); } URI URI::parse(const std::string &url, bool collection) { ne_uri uri; int error = ne_uri_parse(url.c_str(), &uri); URI res = fromNeon(uri, collection); if (!res.m_port) { res.m_port = ne_uri_defaultport(res.m_scheme.c_str()); } ne_uri_free(&uri); if (error) { SE_THROW_EXCEPTION(TransportException, StringPrintf("invalid URL '%s' (parsed as '%s')", url.c_str(), res.toURL().c_str())); } return res; } URI URI::fromNeon(const ne_uri &uri, bool collection) { URI res; if (uri.scheme) { res.m_scheme = uri.scheme; } if (uri.host) { res.m_host = uri.host; } if (uri.userinfo) { res.m_userinfo = uri.userinfo; } if (uri.path) { res.m_path = normalizePath(uri.path, collection); } if (uri.query) { res.m_query = uri.query; } if (uri.fragment) { res.m_fragment = uri.fragment; } res.m_port = uri.port; return res; } URI URI::resolve(const std::string &path) const { ne_uri tmp[2]; ne_uri full; memset(tmp, 0, sizeof(tmp)); tmp[0].path = const_cast(m_path.c_str()); tmp[1].path = const_cast(path.c_str()); ne_uri_resolve(tmp + 0, tmp + 1, &full); URI res(*this); res.m_path = full.path; ne_uri_free(&full); return res; } std::string URI::toURL() const { std::ostringstream buffer; buffer << m_scheme << "://"; if (!m_userinfo.empty()) { buffer << m_userinfo << "@"; } buffer << m_host; if (m_port) { buffer << ":" << m_port; } buffer << m_path; if (!m_query.empty()) { buffer << "?" << m_query; } if (!m_fragment.empty()) { buffer << "#" << m_fragment; } return buffer.str(); } std::string URI::escape(const std::string &text) { SmartPtr tmp(ne_path_escape(text.c_str())); // Fail gracefully. I have observed ne_path_escape returning NULL // a couple of times, with input "%u". It makes sense, if the // escaping fails, to just return the same string, because, well, // it couldn't be escaped. return tmp ? tmp.get() : text; } std::string URI::unescape(const std::string &text) { SmartPtr tmp(ne_path_unescape(text.c_str())); // Fail gracefully. See also the similar comment for the escape() method. return tmp ? tmp.get() : text; } std::string URI::normalizePath(const std::string &path, bool collection) { std::string res; res.reserve(path.size() * 150 / 100); // always start with one leading slash res = "/"; typedef boost::split_iterator string_split_iterator; string_split_iterator it = boost::make_split_iterator(path, boost::first_finder("/", boost::is_iequal())); while (!it.eof()) { if (it->begin() == it->end()) { // avoid adding empty path components ++it; } else { std::string split(it->begin(), it->end()); // Let's have an exception here for "%u", since we use that to replace the // actual username into the path. It's safe to ignore "%u" because it // couldn't be in a valid URI anyway. // TODO: we should find a neat way to remove the awareness of "%u" from // NeonCXX. std::string normalizedSplit = split; if (split != "%u") { normalizedSplit = escape(unescape(split)); } res += normalizedSplit; ++it; if (!it.eof()) { res += '/'; } } } if (collection && !boost::ends_with(res, "/")) { res += '/'; } return res; } std::string Status2String(const ne_status *status) { if (!status) { return ""; } return StringPrintf("", status->major_version, status->minor_version, status->code, status->klass, status->reason_phrase ? status->reason_phrase : "\"\""); } Session::Session(const boost::shared_ptr &settings) : m_forceAuthorizationOnce(false), m_credentialsSent(false), m_oauthTokenRejections(0), m_settings(settings), m_debugging(false), m_session(NULL), m_attempt(0) { int logLevel = m_settings->logLevel(); if (logLevel >= 3) { ne_debug_init(stderr, NE_DBG_FLUSH|NE_DBG_HTTP|NE_DBG_HTTPAUTH| (logLevel >= 4 ? NE_DBG_HTTPBODY : 0) | (logLevel >= 5 ? (NE_DBG_LOCKS|NE_DBG_SSL) : 0)| (logLevel >= 6 ? (NE_DBG_XML|NE_DBG_XMLPARSE) : 0)| (logLevel >= 11 ? (NE_DBG_HTTPPLAIN) : 0)); m_debugging = true; } else { ne_debug_init(NULL, 0); } ne_sock_init(); m_uri = URI::parse(settings->getURL()); m_session = ne_session_create(m_uri.m_scheme.c_str(), m_uri.m_host.c_str(), m_uri.m_port); ne_set_server_auth(m_session, getCredentials, this); if (m_uri.m_scheme == "https") { // neon only initializes session->ssl_context if // using https and segfaults in ne_ssl_trust_default_ca() // of ne_gnutls.c if ne_ssl_trust_default_ca() // is called for non-https. So better call these // functions only when needed. ne_ssl_set_verify(m_session, sslVerify, this); ne_ssl_trust_default_ca(m_session); // hack for Yahoo: need a client certificate ne_ssl_client_cert *cert = ne_ssl_clicert_read("client.p12"); SE_LOG_DEBUG(NULL, "client cert is %s", !cert ? "missing" : ne_ssl_clicert_encrypted(cert) ? "encrypted" : "unencrypted"); if (cert) { if (ne_ssl_clicert_encrypted(cert)) { if (ne_ssl_clicert_decrypt(cert, "meego")) { SE_LOG_DEBUG(NULL, "decryption failed"); } } ne_ssl_set_clicert(m_session, cert); } } m_proxyURL = settings->proxy(); if (m_proxyURL.empty()) { #ifdef HAVE_LIBNEON_SYSTEM_PROXY // hard compile-time dependency ne_session_system_proxy(m_session, 0); #else // compiled against older libneon, but might run with more recent neon typedef void (*session_system_proxy_t)(ne_session *sess, unsigned int flags); session_system_proxy_t session_system_proxy = (session_system_proxy_t)dlsym(RTLD_DEFAULT, "ne_session_system_proxy"); if (session_system_proxy) { session_system_proxy(m_session, 0); } #endif } else { URI proxyuri = URI::parse(m_proxyURL); ne_session_proxy(m_session, proxyuri.m_host.c_str(), proxyuri.m_port); } int seconds = settings->timeoutSeconds(); if (seconds < 0) { seconds = 5 * 60; } ne_set_read_timeout(m_session, seconds); ne_set_connect_timeout(m_session, seconds); ne_hook_pre_send(m_session, preSendHook, this); } Session::~Session() { if (m_session) { ne_session_destroy(m_session); } ne_sock_exit(); } boost::shared_ptr Session::m_cachedSession; boost::shared_ptr Session::create(const boost::shared_ptr &settings) { URI uri = URI::parse(settings->getURL()); if (m_cachedSession && m_cachedSession->m_uri == uri && m_cachedSession->m_proxyURL == settings->proxy()) { // reuse existing session with new settings pointer m_cachedSession->m_settings = settings; return m_cachedSession; } // create new session m_cachedSession.reset(new Session(settings)); return m_cachedSession; } int Session::getCredentials(void *userdata, const char *realm, int attempt, char *username, char *password) throw() { try { Session *session = static_cast(userdata); boost::shared_ptr authProvider = session->m_settings->getAuthProvider(); if (authProvider && authProvider->methodIsSupported(AuthProvider::AUTH_METHOD_OAUTH2)) { // We have to fail here because we cannot provide neon // with a username/password combination. Instead we rely // on the "retry request" mechanism to resend the request // with a fresh token. SE_LOG_DEBUG(NULL, "giving up on request, try again with new OAuth2 token"); return 1; } else if (!attempt) { // try again with credentials std::string user, pw; session->m_settings->getCredentials(realm, user, pw); SyncEvo::Strncpy(username, user.c_str(), NE_ABUFSIZ); SyncEvo::Strncpy(password, pw.c_str(), NE_ABUFSIZ); session->m_credentialsSent = true; SE_LOG_DEBUG(NULL, "retry request with credentials"); return 0; } else { // give up return 1; } } catch (...) { Exception::handle(); SE_LOG_ERROR(NULL, "no credentials for %s", realm); return 1; } } void Session::forceAuthorization(const boost::shared_ptr &authProvider) { m_forceAuthorizationOnce = true; m_authProvider = authProvider; } void Session::preSendHook(ne_request *req, void *userdata, ne_buffer *header) throw() { try { static_cast(userdata)->preSend(req, header); } catch (...) { Exception::handle(); } } void Session::preSend(ne_request *req, ne_buffer *header) { // sanity check: startOperation must have been called if (m_operation.empty()) { SE_THROW("internal error: startOperation() not called"); } bool haveUserAgentHeader = boost::starts_with(header->data, "User-Agent:") || strstr(header->data, "\nUser-Agent:"); if (!haveUserAgentHeader) { ne_buffer_concat(header, "User-Agent: SyncEvolution\r\n", (const char *)NULL); } // Only do this once when using normal username/password. // Always do it when using OAuth2. bool useOAuth2 = m_authProvider && m_authProvider->methodIsSupported(AuthProvider::AUTH_METHOD_OAUTH2); if (m_forceAuthorizationOnce || useOAuth2) { m_forceAuthorizationOnce = false; bool haveAuthorizationHeader = boost::starts_with(header->data, "Authorization:") || strstr(header->data, "\nAuthorization:"); if (useOAuth2) { if (haveAuthorizationHeader) { SE_THROW("internal error: already have Authorization header when about to add OAuth2"); } // Token was obtained by Session::run(). SE_LOG_DEBUG(NULL, "using OAuth2 token '%s' to authenticate", m_oauth2Bearer.c_str()); m_credentialsSent = true; // SmartPtr blob(ne_base64((const unsigned char *)m_oauth2Bearer.c_str(), m_oauth2Bearer.size())); ne_buffer_concat(header, "Authorization: Bearer ", m_oauth2Bearer.c_str() /* blob.get() */, "\r\n", (const char *)NULL); } else if (m_uri.m_scheme == "https") { // append "Authorization: Basic" header if not present already if (!haveAuthorizationHeader) { Credentials creds = m_authProvider->getCredentials(); std::string credentials = creds.m_username + ":" + creds.m_password; SmartPtr blob(ne_base64((const unsigned char *)credentials.c_str(), credentials.size())); ne_buffer_concat(header, "Authorization: Basic ", blob.get(), "\r\n", (const char *)NULL); } // check for acceptance of credentials later m_credentialsSent = true; SE_LOG_DEBUG(NULL, "forced sending credentials"); } else { SE_LOG_DEBUG(NULL, "skipping forced sending credentials because not using https"); } } } int Session::sslVerify(void *userdata, int failures, const ne_ssl_certificate *cert) throw() { try { Session *session = static_cast(userdata); static const Flag descr[] = { { NE_SSL_NOTYETVALID, "certificate not yet valid" }, { NE_SSL_EXPIRED, "certificate has expired" }, { NE_SSL_IDMISMATCH, "hostname mismatch" }, { NE_SSL_UNTRUSTED, "untrusted certificate" }, { 0, NULL } }; SE_LOG_DEBUG(NULL, "%s: SSL verification problem: %s", session->getURL().c_str(), Flags2String(failures, descr).c_str()); if (!session->m_settings->verifySSLCertificate()) { SE_LOG_DEBUG(NULL, "ignoring bad certificate"); return 0; } if (failures == NE_SSL_IDMISMATCH && !session->m_settings->verifySSLHost()) { SE_LOG_DEBUG(NULL, "ignoring hostname mismatch"); return 0; } return 1; } catch (...) { Exception::handle(); return 1; } } #ifdef HAVE_LIBNEON_OPTIONS unsigned int Session::options(const std::string &path) { unsigned int caps; checkError(ne_options2(m_session, path.c_str(), &caps)); return caps; } #endif // HAVE_LIBNEON_OPTIONS class PropFindDeleter { public: void operator () (ne_propfind_handler *handler) { if (handler) { ne_propfind_destroy(handler); } } }; void Session::propfindURI(const std::string &path, int depth, const ne_propname *props, const PropfindURICallback_t &callback, const Timespec &deadline) { startOperation("PROPFIND", deadline); retry: boost::shared_ptr handler; int error; checkAuthorization(); handler = boost::shared_ptr(ne_propfind_create(m_session, path.c_str(), depth), PropFindDeleter()); if (props != NULL) { error = ne_propfind_named(handler.get(), props, propsResult, const_cast(static_cast(&callback))); } else { error = ne_propfind_allprop(handler.get(), propsResult, const_cast(static_cast(&callback))); } // remain valid as long as "handler" is valid ne_request *req = ne_propfind_get_request(handler.get()); const ne_status *status = ne_get_status(req); const char *tmp = ne_get_response_header(req, "Location"); std::string location(tmp ? tmp : ""); if (!checkError(error, status->code, status, location, path)) { goto retry; } } void Session::propsResult(void *userdata, const ne_uri *uri, const ne_prop_result_set *results) throw() { try { PropfindURICallback_t *callback = static_cast(userdata); (*callback)(URI::fromNeon(*uri), results); } catch (...) { Exception::handle(); } } void Session::propfindProp(const std::string &path, int depth, const ne_propname *props, const PropfindPropCallback_t &callback, const Timespec &deadline) { propfindURI(path, depth, props, boost::bind(&Session::propsIterate, _1, _2, boost::cref(callback)), deadline); } void Session::propsIterate(const URI &uri, const ne_prop_result_set *results, const PropfindPropCallback_t &callback) { PropIteratorUserdata_t data(&uri, &callback); ne_propset_iterate(results, propIterator, &data); } int Session::propIterator(void *userdata, const ne_propname *pname, const char *value, const ne_status *status) throw() { try { const PropIteratorUserdata_t *data = static_cast(userdata); (*data->second)(*data->first, pname, value, status); return 0; } catch (...) { Exception::handle(); return 1; // abort iterating } } void Session::startOperation(const string &operation, const Timespec &deadline) { SE_LOG_DEBUG(NULL, "starting %s, credentials %s, %s", operation.c_str(), m_settings->getCredentialsOkay() ? "okay" : "unverified", deadline ? StringPrintf("deadline in %.1lfs", (deadline - Timespec::monotonic()).duration()).c_str() : "no deadline"); // now is a good time to check for user abort SuspendFlags::getSuspendFlags().checkForNormal(); // remember current operation attributes m_operation = operation; m_deadline = deadline; // no credentials set yet for next request m_credentialsSent = false; // first attempt at request m_attempt = 0; } void Session::flush() { if (m_debugging && LogRedirect::redirectingStderr()) { // flush stderr and wait a bit: this might help to get // the redirected output via LogRedirect fflush(stderr); Sleep(0.001); } } bool Session::checkError(int error, int code, const ne_status *status, const std::string &newLocation, const std::string &oldLocation, const std::set *expectedCodes) { flush(); SuspendFlags &s = SuspendFlags::getSuspendFlags(); // unset operation, set it again only if the same operation is going to be retried string operation = m_operation; m_operation = ""; // determine error description, may be made more specific below string descr; if (code) { descr = StringPrintf("%s: Neon error code %d, HTTP status %d: %s", operation.c_str(), error, code, ne_get_error(m_session)); } else { descr = StringPrintf("%s: Neon error code %d, no HTTP status: %s", operation.c_str(), error, ne_get_error(m_session)); } // true for specific errors which might go away after a retry bool retry = false; // detect redirect if ((error == NE_ERROR || error == NE_OK) && (code >= 300 && code <= 399)) { // Special case Google: detect redirect to temporary error page // and retry; same for redirect to login page. Only do that for // "real" URLs, not for the root or /calendar/ that we run into // when scanning, because the login there will always fail. if (oldLocation != "/" && oldLocation != "/calendar/" && (boost::starts_with(newLocation, "http://www.google.com/googlecalendar/unavailable.html") || boost::starts_with(newLocation, "https://www.google.com/googlecalendar/unavailable.html") || boost::starts_with(newLocation, "https://accounts.google.com/ServiceLogin"))) { retry = true; } else { SE_THROW_EXCEPTION_2(RedirectException, StringPrintf("%s: %d status: %s redirected to %s", operation.c_str(), code, oldLocation.c_str(), newLocation.c_str()), code, newLocation); } } switch (error) { case NE_OK: // request itself completed, but might still have resulted in bad status if (expectedCodes && expectedCodes->find(code) != expectedCodes->end()) { // return to caller immediately as if we had succeeded, // without throwing an exception and without retrying return true; } if (code && (code < 200 || code >= 300)) { if (status) { descr = StringPrintf("%s: bad HTTP status: %s", operation.c_str(), Status2String(status).c_str()); } else { descr = StringPrintf("%s: bad HTTP status: %d", operation.c_str(), code); } if (code >= 500 && code <= 599 && // not implemented code != 501 && // HTTP version not supported code != 505) { // potentially temporary server failure, may try again retry = true; } } else { // all fine, no retry necessary: clean up // remember completion time of request m_lastRequestEnd = Timespec::monotonic(); // assume that credentials were valid, if sent if (m_credentialsSent) { SE_LOG_DEBUG(NULL, "credentials accepted"); m_settings->setCredentialsOkay(true); } m_oauthTokenRejections = 0; return true; } break; case NE_AUTH: { // Retry OAuth2-based request if we still have a valid token. bool useOAuth2 = m_authProvider && m_authProvider->methodIsSupported(AuthProvider::AUTH_METHOD_OAUTH2); if (useOAuth2) { // Try again with new token? Need to restore the counter, // because it is relevant for getOAuth2Bearer() in preSend(). if (m_oauthTokenRejections < 2) { if (!m_oauth2Bearer.empty() && m_credentialsSent) { SE_LOG_DEBUG(NULL, "discarding used and rejected OAuth2 token '%s'", m_oauth2Bearer.c_str()); m_oauthTokenRejections++; m_oauth2Bearer.clear(); } else { SE_LOG_DEBUG(NULL, "OAuth2 token '%s' not used?!", m_oauth2Bearer.c_str()); } retry = true; SE_LOG_DEBUG(NULL, "OAuth2 retry after %d failed tokens", m_oauthTokenRejections); } else { SE_LOG_DEBUG(NULL, "too many failed OAuth2 tokens, giving up"); } } // tell caller what kind of transport error occurred code = STATUS_UNAUTHORIZED; descr = StringPrintf("%s: Neon error code %d = NE_AUTH, HTTP status %d: %s", operation.c_str(), error, code, ne_get_error(m_session)); break; } case NE_ERROR: if (code) { descr = StringPrintf("%s: Neon error code %d: %s", operation.c_str(), error, ne_get_error(m_session)); if (code >= 500 && code <= 599 && // not implemented code != 501 && // HTTP version not supported code != 505) { // potentially temporary server failure, may try again retry = true; } } else if (descr.find("Secure connection truncated") != descr.npos || descr.find("decryption failed or bad record mac") != descr.npos) { // occasionally seen with Google server; let's retry // For example: "Could not read status line: SSL error: decryption failed or bad record mac" retry = true; } break; case NE_LOOKUP: case NE_TIMEOUT: case NE_CONNECT: retry = true; break; } if (code == 401) { if (m_settings->getCredentialsOkay()) { SE_LOG_DEBUG(NULL, "credential error due to throttling (?), retry"); retry = true; } else { // give up without retrying SE_LOG_DEBUG(NULL, "credential error, no success with them before => report it"); } } SE_LOG_DEBUG(NULL, "%s, %s", descr.c_str(), retry ? "might retry" : "must not retry"); if (retry) { m_attempt++; if (!m_deadline) { SE_LOG_DEBUG(NULL, "retrying not allowed for %s (no deadline)", operation.c_str()); } else { Timespec now = Timespec::monotonic(); if (now < m_deadline) { int retrySeconds = m_settings->retrySeconds(); if (retrySeconds >= 0) { Timespec last = m_lastRequestEnd; Timespec now = Timespec::monotonic(); if (!last) { last = now; } int delay = retrySeconds * (1 << (m_attempt - 1)); Timespec next = last + delay; if (next > m_deadline) { // no point in waiting (potentially much) until after our // deadline, do final attempt at that time next = m_deadline; } if (next > now) { double duration = (next - now).duration(); SE_LOG_DEBUG(NULL, "retry %s in %.1lfs, attempt #%d", operation.c_str(), duration, m_attempt); // Inform the user, because this will take a // while and we don't want to give the // impression of being stuck. SE_LOG_INFO(NULL, "operation temporarily (?) failed, going to retry in %.1lfs before giving up in %.1lfs: %s", duration, (m_deadline - now).duration(), descr.c_str()); Sleep(duration); } else { SE_LOG_DEBUG(NULL, "retry %s immediately (due already), attempt #%d", operation.c_str(), m_attempt); } } else { SE_LOG_DEBUG(NULL, "retry %s immediately (retry interval <= 0), attempt #%d", operation.c_str(), m_attempt); } // try same operation again? if (s.getState() == SuspendFlags::NORMAL) { m_operation = operation; return false; } } else { SE_LOG_DEBUG(NULL, "retry %s would exceed deadline, bailing out", m_operation.c_str()); } } } if (code == 401) { // fatal credential error, remember that SE_LOG_DEBUG(NULL, "credentials rejected"); m_settings->setCredentialsOkay(false); } if (code) { // copy error code into exception SE_THROW_EXCEPTION_STATUS(TransportStatusException, descr, SyncMLStatus(code)); } else { SE_THROW_EXCEPTION(TransportException, descr); } } XMLParser::XMLParser() { m_parser = ne_xml_create(); } XMLParser::~XMLParser() { ne_xml_destroy(m_parser); } XMLParser &XMLParser::pushHandler(const StartCB_t &start, const DataCB_t &data, const EndCB_t &end) { m_stack.push_back(Callbacks(start, data, end)); Callbacks &cb = m_stack.back(); ne_xml_push_handler(m_parser, startCB, dataCB, endCB, &cb); return *this; } int XMLParser::startCB(void *userdata, int parent, const char *nspace, const char *name, const char **atts) { Callbacks *cb = static_cast(userdata); try { return cb->m_start(parent, nspace, name, atts); } catch (...) { Exception::handle(); SE_LOG_ERROR(NULL, "startCB %s %s failed", nspace, name); return -1; } } int XMLParser::dataCB(void *userdata, int state, const char *cdata, size_t len) { Callbacks *cb = static_cast(userdata); try { return cb->m_data ? cb->m_data(state, cdata, len) : 0; } catch (...) { Exception::handle(); SE_LOG_ERROR(NULL, "dataCB failed"); return -1; } } int XMLParser::endCB(void *userdata, int state, const char *nspace, const char *name) { Callbacks *cb = static_cast(userdata); try { return cb->m_end ? cb->m_end(state, nspace, name) : 0; } catch (...) { Exception::handle(); SE_LOG_ERROR(NULL, "endCB %s %s failed", nspace, name); return -1; } } int XMLParser::accept(const std::string &nspaceExpected, const std::string &nameExpected, const char *nspace, const char *name) { if (nspace && nspaceExpected == nspace && name && nameExpected == name) { return 1; } else { return 0; } } int XMLParser::append(std::string &buffer, const char *data, size_t len) { buffer.append(data, len); return 0; } int XMLParser::reset(std::string &buffer) { buffer.clear(); return 0; } void XMLParser::initReportParser(const ResponseEndCB_t &responseEnd) { pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "multistatus", _2, _3)); pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "response", _2, _3), Neon::XMLParser::DataCB_t(), boost::bind(&Neon::XMLParser::doResponseEnd, this, responseEnd)); pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "href", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(m_href), _2, _3)); pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "propstat", _2, _3)); pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "status", _2, _3) /* check status? */); pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "prop", _2, _3)); pushHandler(boost::bind(Neon::XMLParser::accept, "DAV:", "getetag", _2, _3), boost::bind(Neon::XMLParser::append, boost::ref(m_etag), _2, _3)); } Request::Request(Session &session, const std::string &method, const std::string &path, const std::string &body, std::string &result) : m_method(method), m_path(path), m_session(session), m_result(&result), m_parser(NULL) { m_req = ne_request_create(session.getSession(), m_method.c_str(), path.c_str()); ne_set_request_body_buffer(m_req, body.c_str(), body.size()); } Request::Request(Session &session, const std::string &method, const std::string &path, const std::string &body, XMLParser &parser) : m_method(method), m_path(path), m_session(session), m_result(NULL), m_parser(&parser) { m_req = ne_request_create(session.getSession(), m_method.c_str(), path.c_str()); ne_set_request_body_buffer(m_req, body.c_str(), body.size()); } Request::~Request() { ne_request_destroy(m_req); } #ifdef NEON_COMPATIBILITY /** * wrapper needed to allow lazy resolution of the ne_accept_2xx() function when needed * instead of when loaded */ static int ne_accept_2xx(void *userdata, ne_request *req, const ne_status *st) { return ::ne_accept_2xx(userdata, req, st); } #endif void Session::checkAuthorization() { bool useOAuth2 = m_authProvider && m_authProvider->methodIsSupported(AuthProvider::AUTH_METHOD_OAUTH2); if (useOAuth2 && m_oauth2Bearer.empty()) { // Count the number of times we asked for new tokens. This helps // the provider determine whether the token that it returns are valid. try { m_oauth2Bearer = m_authProvider->getOAuth2Bearer(m_oauthTokenRejections, boost::bind(&Settings::updatePassword, m_settings, _1)); SE_LOG_DEBUG(NULL, "got new OAuth2 token '%s' for next request", m_oauth2Bearer.c_str()); } catch (...) { std::string explanation; Exception::handle(explanation); // Treat all errors as fatal authentication errors. // Our caller will abort immediately. SE_THROW_EXCEPTION_STATUS(FatalException, StringPrintf("logging into remote service failed: %s", explanation.c_str()), STATUS_FORBIDDEN); } } } bool Session::run(Request &request, const std::set *expectedCodes) { int error; // Check for authorization while we still can. checkAuthorization(); std::string *result = request.getResult(); ne_request *req = request.getRequest(); if (result) { result->clear(); ne_add_response_body_reader(req, ne_accept_2xx, Request::addResultData, &request); error = ne_request_dispatch(req); } else { error = ne_xml_dispatch_request(req, request.getParser()->get()); } return checkError(error, request.getStatus()->code, request.getStatus(), request.getResponseHeader("Location"), request.getPath(), expectedCodes); } int Request::addResultData(void *userdata, const char *buf, size_t len) { Request *me = static_cast(userdata); me->m_result->append(buf, len); return 0; } } SE_END_CXX #endif // ENABLE_DAV syncevolution-1.5/src/backends/xmlrpc/0000755000373300037200000000000012424707641021551 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/backends/xmlrpc/configure-sub.in0000644000373300001540000000355612326412403024472 0ustar00nightlynightly00000000000000dnl -*- mode: Autoconf; -*- dnl Invoke autogen.sh to produce a configure script. dnl Checks for required libraries. dnl dnl This is from the sqlite backend: dnl PKG_CHECK_MODULES(SQLITE, sqlite3, SQLITEFOUND=yes, [SQLITEFOUND=no]) dnl AC_SUBST(SQLITE_CFLAGS) dnl AC_SUBST(SQLITE_LIBS) dnl No pkg-config available for xmlrpc-c dnl PKG_CHECK_MODULES(XMLRPC,xmlrpc-c,XMLRPCFOUND=yes, [XMLRPCFOUND=no]) dnl name of backend library (there could be more than one per directory), dnl name of the directory, dnl help string, dnl --enable/disable chosen explicitly dnl default, may depend on availability of prerequisites in more complex backends SE_ARG_ENABLE_BACKEND(xmlrpc, xmlrpc, [AS_HELP_STRING([--enable-xmlrpc], [enable XMLRPC-based backend which stores items on a central web service (default off)])], [enable_xmlrpc="$enableval"], [enable_xmlrpc="no"] ) if test "$enable_xmlrpc" = "yes"; then dnl It's good to check the prerequisites here, in case --enable-xmlrpc was used. dnl test "x${SQLITEFOUND}" = "xyes" || AC_MSG_ERROR([--enable-sqlite requires pkg-config information for sqlite3, which was not found]) AC_PATH_PROG([XMLRPC_C_CONFIG], [xmlrpc-c-config], [no]) test "x$XMLRPC_C_CONFIG" != 'xno' || AC_MSG_ERROR([--enable-xmlrpc requires xmlrpc-c-config, which was not found]) XMLRPC_CFLAGS=`$XMLRPC_C_CONFIG c++2 client --cflags` XMLRPC_LIBS=`$XMLRPC_C_CONFIG c++2 client --libs` AC_SUBST(XMLRPC_CFLAGS) AC_SUBST(XMLRPC_LIBS) dnl If additional compile flags are necessary to include the header dnl files of the backend, then add them here. BACKEND_CPPFLAGS="$BACKEND_CPPFLAGS $XMLRPC_CFLAGS" AC_DEFINE(ENABLE_XMLRPC, 1, [XMLRPC available]) fi syncevolution-1.5/src/backends/xmlrpc/README0000644000373300001540000001245412326412403022247 0ustar00nightlynightly00000000000000== Summary == This is a backend to use a web application, probably a webmail or PIM application, as data store. The communication is done using XMLRPC. == Installation == This backend requires the Xmlrpc-c libraries from http://xmlrpc-c.sourceforge.net Precompiled packages exist for many Linux distributions, on Ubuntu or Debian, they development package is installed by: apt-get install libxmlrpc-c3-dev To compile this backend as part of SyncEvolution, configure with --enable-xmlrpc. == Configuration == The type parameter is similar to that on the file backend, e.g. type = xmlrpc:text/calendar:2.0 MIME type and version must be set according to the implementation on the XMLRPC interface side. The evolutionsource parameter contains the information of the XMLRPC service, e.g. evolutionsource = http://hostname/xmlrpc|database|username|password The parameter contains several fields, delimited by a pipe character. The parameters after the URL are used as the first parameters in every XMLRPC request. Their number is not fixed, it depends on the implementation of the XMLRPC interface. == XMLRPC interface == The parameters after the URL in the evolutionsource parameter are passed as the first parameters of the XMLRPC request. Their number is not limited by the backend, the number may even be 0, if the respective information is given as part of the URL (or not necessary). This set of parameters is represented in the specification below with "...". All parameters are sent and expected as string values. Four methods have to implemented in the XMLRPC interface: * listAllItems(...) Returns a list of id with some kind of version information, e.g. timestamp of the last modification, as XMLRPC struct. The id is a string value. * readItem(..., id) Reads a single item from the data store. The return value contains a string containing the element as vcard or icalender object. * insertItem(..., id, object) Creates a new or updates an existing object in the data store. With an empty id parameter, a new object will be created. The return value contains a struct, equal to that of listAllItems, but with only one entry, namely the updated or created one. * removeItem(..., id) Removes an object from the data store. The return value is ignored by the backend. == Sample XMLRPC snippets == The following snippets of the method requests and response shall explain the used data types. If incorrect datatypes (e.g. int value instead of string) are used, the communication will fail. * listAllItems XML-RPC CALL: listAllItems addr testmb04 *secret* XML-RPC RESPONSE: 48541259607642 48551259605716 48561259842773 48581259610815 48571259605717 * readItem XML-RPC CALL: readItem addr testmb04 *secret* 4855 XML-RPC RESPONSE: BEGIN:VCARD VERSION:3.0 N:Knipp;Franz;;; FN:Franz Knipp EMAIL:knipp@m-otion.com END:VCARD * insertItem XML-RPC CALL: insertItem addr testmb04 *secret* BEGIN:VCARD VERSION:3.0 FN:Patrick Ohly N:Ohly;Patrick;;; EMAIL:patrick.ohly@intel.com END:VCARD XML-RPC RESPONSE: 48631260216497 * removeItem XML-RPC CALL: removeItem addr testmb04 *secret* 4863 XML-RPC RESPONSE: syncevolution-1.5/src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp0000664000373300001540000001323712337651014026632 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 m-otion communications GmbH , waived * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "XMLRPCSyncSource.h" #include "test.h" #include SE_BEGIN_CXX static SyncSource *createSource(const SyncSourceParams ¶ms) { SourceType sourceType = SyncSource::getSourceType(params.m_nodes); // The string returned by getSourceType() is always the one // registered as main Aliases() below. bool isMe = sourceType.m_backend == "XMLRPC interface"; #ifndef ENABLE_XMLRPC // tell SyncEvolution if the user wanted to use a disabled sync source, // otherwise let it continue searching return isMe ? RegisterSyncSource::InactiveSource(params) : NULL; #else // Also recognize one of the standard types? // Not in the FileSyncSource! bool maybeMe = false /* sourceType.m_backend == "addressbook" */; if (isMe || maybeMe) { // The FileSyncSource always needs the data format // parameter in sourceType.m_format. if (/* sourceType.m_format == "" || sourceType.m_format == "text/x-vcard" */ sourceType.m_format.size()) { return new XMLRPCSyncSource(params, sourceType.m_format); } else { return NULL; } } return NULL; #endif } static RegisterSyncSource registerMe("XMLRPC interface for data exchange", #ifdef ENABLE_XMLRPC true, #else false, #endif createSource, "XMLRPC interface = xmlrpc\n" " Data exchange is done via an XMLRPC interface on the datastore.\n", Values() + (Aliases("XMLRPC interface") + "xmlrpc")); #ifdef ENABLE_XMLRPC #ifdef ENABLE_UNIT_TESTS class XMLRPCSyncSourceUnitTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(XMLRPCSyncSourceUnitTest); CPPUNIT_TEST(testInstantiate); CPPUNIT_TEST_SUITE_END(); protected: void testInstantiate() { boost::shared_ptr source; source.reset(SyncSource::createTestingSource("xmlrpc", "xmlrpc:text/vcard:3.0", true)); source.reset(SyncSource::createTestingSource("xmlrpc", "xmlrpc:text/plain:1.0", true)); source.reset(SyncSource::createTestingSource("xmlrpc", "XMLRPC interface:text/x-vcard:2.1", true)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(XMLRPCSyncSourceUnitTest); #endif // ENABLE_UNIT_TESTS #ifdef ENABLE_INTEGRATION_TESTS // The anonymous namespace ensures that we don't get // name clashes: although the classes and objects are // only defined in this file, the methods generated // for local classes will clash with other methods // of other classes with the same name if no namespace // is used. // // The code above is not yet inside the anonymous // name space because it would show up inside // the CPPUnit unit test names. Use a unique class // name there. namespace { #if 0 } #endif static class VCard21Test : public RegisterSyncSourceTest { public: VCard21Test() : RegisterSyncSourceTest("xmlrpc_contact", "eds_contact") {} virtual void updateConfig(ClientTestConfig &config) const { // set type as required by XMLRPCSyncSource // and leave everything else at its default config.m_type = "xmlrpc:text/x-vcard:2.1"; } } VCard21Test; static class VCard30Test : public RegisterSyncSourceTest { public: VCard30Test() : RegisterSyncSourceTest("xmlrpc_contact", "eds_contact") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "xmlrpc:text/vcard:3.0"; } } VCard30Test; static class ICal20Test : public RegisterSyncSourceTest { public: ICal20Test() : RegisterSyncSourceTest("xmlrpc_event", "eds_event") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "xmlrpc:text/calendar:2.0"; // A sync source which supports linked items (= recurring // event with detached exception) is expected to handle // inserting the parent or child twice by turning the // second operation into an update. The file backend is // to dumb for that and therefore fails these tests: // // Client::Source::xmlrpc_event::testLinkedItemsInsertParentTwice // Client::Source::xmlrpc_event::testLinkedItemsInsertChildTwice // // Disable linked item testing to avoid this. config.m_sourceKnowsItemSemantic = false; } } ICal20Test; static class ITodo20Test : public RegisterSyncSourceTest { public: ITodo20Test() : RegisterSyncSourceTest("xmlrpc_task", "eds_task") {} virtual void updateConfig(ClientTestConfig &config) const { config.m_type = "xmlrpc:text/calendar:2.0"; } } ITodo20Test; } #endif // ENABLE_INTEGRATION_TESTS #endif // ENABLE_XMLRPC SE_END_CXX syncevolution-1.5/src/backends/xmlrpc/xmlrpc.am0000644000373300001540000000257412326412403023215 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ src/backends/xmlrpc/configure-sub.in \ src/backends/xmlrpc/README src_backends_xmlrpc_lib = src/backends/xmlrpc/syncxmlrpc.la MOSTLYCLEANFILES += $(src_backends_xmlrpc_lib) if ENABLE_MODULES src_backends_xmlrpc_backenddir = $(BACKENDS_DIRECTORY) src_backends_xmlrpc_backend_LTLIBRARIES = $(src_backends_xmlrpc_lib) else noinst_LTLIBRARIES += $(src_backends_xmlrpc_lib) endif src_backends_xmlrpc_src = \ src/backends/xmlrpc/XMLRPCSyncSource.h \ src/backends/xmlrpc/XMLRPCSyncSource.cpp src_backends_xmlrpc_syncxmlrpc_la_SOURCES = $(src_backends_xmlrpc_src) src_backends_xmlrpc_syncxmlrpc_la_LIBADD = $(XMLRPC_LIBS) $(SYNCEVOLUTION_LIBS) src_backends_xmlrpc_syncxmlrpc_la_LDFLAGS = -module -avoid-version src_backends_xmlrpc_syncxmlrpc_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(SYNCEVO_WFLAGS) src_backends_xmlrpc_syncxmlrpc_la_CPPFLAGS = $(SYNCEVOLUTION_CFLAGS) -I$(top_srcdir)/test $(BACKEND_CPPFLAGS) src_backends_xmlrpc_syncxmlrpc_la_DEPENDENCIES = src/syncevo/libsyncevolution.la # If you need special test cases for your sync source, then # install them here. Here's how the sqlite backend does that: # #../../testcases/sqlite_vcard21.vcf: $(FUNAMBOL_SUBDIR)/test/test/testcases/vcard21.vcf # mkdir -p ${@D} # perl -e '$$_ = join("", <>); s/^(ADR|TEL|EMAIL|PHOTO).*?(?=^\S)//msg; s/;X-EVOLUTION-UI-SLOT=\d+//g; print;' $< >$@ #all: ../../testcases/sqlite_vcard21.vcf syncevolution-1.5/src/backends/xmlrpc/XMLRPCSyncSource.h0000644000373300001540000000463412326412403024564 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 m-otion communications GmbH , waived * Copyright (C) 2007-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_XMLRPCSYNCSOURCE #define INCL_XMLRPCSYNCSOURCE #include #ifdef ENABLE_XMLRPC #include #include #include SE_BEGIN_CXX class XMLRPCSyncSource : public TrackingSyncSource { public: XMLRPCSyncSource(const SyncSourceParams ¶ms, const string &dataformat); protected: /* implementation of SyncSource interface */ virtual void open(); virtual bool isEmpty(); virtual void close(); virtual Databases getDatabases(); virtual std::string getMimeType() const; virtual std::string getMimeVersion() const; /* implementation of TrackingSyncSource interface */ virtual void listAllItems(RevisionMap_t &revisions); virtual InsertItemResult insertItem(const string &luid, const std::string &item, bool raw); void readItem(const std::string &luid, std::string &item, bool raw); virtual void removeItem(const string &uid); private: /** * @name values obtained from the source's type property * * Other sync sources only support one hard-coded type and * don't need such variables. */ /**@{*/ string m_mimeType; string m_mimeVersion; string m_supportedTypes; /**@}*/ /** @name values obtained from the database name */ string m_serverUrl; vector m_splitDatabase; xmlrpc_c::paramList prepareParamList(); xmlrpc_c::clientSimple client; }; SE_END_CXX #endif // ENABLE_XMLRPC #endif // INCL_XMLRPCSYNCSOURCE syncevolution-1.5/src/backends/xmlrpc/XMLRPCSyncSource.cpp0000664000373300001540000001140012330727742025120 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 m-otion communications GmbH , waived * Copyright (C) 2007-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_XMLRPC #include "XMLRPCSyncSource.h" #include #include #include SE_BEGIN_CXX XMLRPCSyncSource::XMLRPCSyncSource(const SyncSourceParams ¶ms, const string &dataformat) : TrackingSyncSource(params) { if (dataformat.empty()) { throwError(SE_HERE, "a data format must be specified"); } size_t sep = dataformat.find(':'); if (sep == dataformat.npos) { throwError(SE_HERE, string("data format not specified as :: " + dataformat)); } m_mimeType.assign(dataformat, 0, sep); m_mimeVersion = dataformat.substr(sep + 1); m_supportedTypes = dataformat; string const dbid = getDatabaseID(); boost::split(m_splitDatabase, dbid, boost::is_from_range('|', '|')); m_serverUrl = m_splitDatabase[0]; } std::string XMLRPCSyncSource::getMimeType() const { return m_mimeType.c_str(); } std::string XMLRPCSyncSource::getMimeVersion() const { return m_mimeVersion.c_str(); } void XMLRPCSyncSource::open() { } bool XMLRPCSyncSource::isEmpty() { // TODO: provide a real implementation. Always returning false // here disables the "allow slow sync when no local data" heuristic // for preventSlowSync=1. return false; } void XMLRPCSyncSource::close() { } XMLRPCSyncSource::Databases XMLRPCSyncSource::getDatabases() { Databases result; result.push_back(Database("select database via URL", "")); return result; } void XMLRPCSyncSource::listAllItems(RevisionMap_t &revisions) { xmlrpc_c::value result; client.call(m_serverUrl, "listAllItems", prepareParamList(), &result); if(result.type() == xmlrpc_c::value::TYPE_STRUCT) { xmlrpc_c::value_struct const tmp(result); map const resultMap( static_cast >(tmp)); map::const_iterator it; for(it = resultMap.begin(); it != resultMap.end(); ++it) revisions[(*it).first] = xmlrpc_c::value_string((*it).second); } } void XMLRPCSyncSource::readItem(const string &uid, std::string &item, bool raw) { xmlrpc_c::paramList p = prepareParamList(); p.add(xmlrpc_c::value_string(uid)); xmlrpc_c::value result; client.call(m_serverUrl, "readItem", p, &result); item = xmlrpc_c::value_string(result); } TrackingSyncSource::InsertItemResult XMLRPCSyncSource::insertItem(const string &uid, const std::string &item, bool raw) { xmlrpc_c::paramList p = prepareParamList(); p.add(xmlrpc_c::value_string(uid)); p.add(xmlrpc_c::value_string(item)); xmlrpc_c::value result; client.call(m_serverUrl, "insertItem", p, &result); xmlrpc_c::value_struct const tmp(result); map const resultMap( static_cast >(tmp)); if(resultMap.size() != 1) { throw("Return value of insertItem has wrong length."); } map::const_iterator it; it = resultMap.begin(); return InsertItemResult((*it).first, xmlrpc_c::value_string((*it).second), ITEM_OKAY); } void XMLRPCSyncSource::removeItem(const string &uid) { xmlrpc_c::paramList p = prepareParamList(); p.add(xmlrpc_c::value_string(uid)); xmlrpc_c::value result; client.call(m_serverUrl, "removeItem", p, &result); } xmlrpc_c::paramList XMLRPCSyncSource::prepareParamList() { xmlrpc_c::paramList p; for(size_t i = 1; i < m_splitDatabase.size(); i++) { p.add(xmlrpc_c::value_string(m_splitDatabase[i])); } return p; } SE_END_CXX #endif /* ENABLE_XMLRPC */ #ifdef ENABLE_MODULES # include "XMLRPCSyncSourceRegister.cpp" #endif syncevolution-1.5/src/backends/backends.am0000644000373300001540000000376612403321402022153 0ustar00nightlynightly00000000000000BACKENDS = src/backends/activesync src/backends/akonadi src/backends/evolution src/backends/file src/backends/gnome src/backends/goa src/backends/kcalextended src/backends/kde src/backends/maemo src/backends/oauth2 src/backends/pbap src/backends/qtcontacts src/backends/signon src/backends/sqlite src/backends/webdav src/backends/xmlrpc BACKEND_REGISTRIES = src/backends/activesync/ActiveSyncSourceRegister.cpp src/backends/akonadi/AkonadiSyncSourceRegister.cpp src/backends/evolution/EvolutionCalendarSourceRegister.cpp src/backends/evolution/EvolutionContactSourceRegister.cpp src/backends/file/FileSyncSourceRegister.cpp src/backends/gnome/GNOMEPlatformRegister.cpp src/backends/goa/GOARegister.cpp src/backends/kcalextended/KCalExtendedSourceRegister.cpp src/backends/kde/KDEPlatformRegister.cpp src/backends/maemo/MaemoCalendarSourceRegister.cpp src/backends/oauth2/oauth2Register.cpp src/backends/pbap/PbapSyncSourceRegister.cpp src/backends/qtcontacts/QtContactsSourceRegister.cpp src/backends/signon/signonRegister.cpp src/backends/sqlite/SQLiteContactSourceRegister.cpp src/backends/webdav/WebDAVSourceRegister.cpp src/backends/xmlrpc/XMLRPCSyncSourceRegister.cpp # backend includes include $(top_srcdir)/src/backends/activesync/activesync.am include $(top_srcdir)/src/backends/akonadi/akonadi.am include $(top_srcdir)/src/backends/evolution/evolution.am include $(top_srcdir)/src/backends/file/file.am include $(top_srcdir)/src/backends/gnome/gnome.am include $(top_srcdir)/src/backends/goa/goa.am include $(top_srcdir)/src/backends/kcalextended/kcalextended.am include $(top_srcdir)/src/backends/kde/kde.am include $(top_srcdir)/src/backends/maemo/maemo.am include $(top_srcdir)/src/backends/oauth2/oauth2.am include $(top_srcdir)/src/backends/pbap/pbap.am include $(top_srcdir)/src/backends/qtcontacts/qtcontacts.am include $(top_srcdir)/src/backends/signon/signon.am include $(top_srcdir)/src/backends/sqlite/sqlite.am include $(top_srcdir)/src/backends/webdav/webdav.am include $(top_srcdir)/src/backends/xmlrpc/xmlrpc.am syncevolution-1.5/src/dbus/0000755000373300037200000000000012424707641017427 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/glib/0000755000373300037200000000000012424707642020345 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/glib/syncevo-dbus.pc.in0000644000373300001540000000036512326412403023532 0ustar00nightlynightly00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: syncevo-dbus Description: SyncEvolution D-Bus API wrapper Version: @VERSION@ Cflags: -I${includedir} Requires: dbus-glib-1 Libs: -L${libdir} -lsyncevo-dbus syncevolution-1.5/src/dbus/glib/syncevo-marshal.list0000644000373300001540000000031512326412403024163 0ustar00nightlynightly00000000000000VOID:STRING,STRING,INT,INT,INT,INT VOID:STRING,STRING VOID:STRING,BOOLEAN VOID:STRING,STRING,STRING VOID:STRING,STRING,STRING,STRING,STRING,BOXED VOID:INT,BOXED VOID:UINT,UINT,BOXED VOID:STRING,UINT,BOXED syncevolution-1.5/src/dbus/glib/README0000644000373300001540000000012112326412403021026 0ustar00nightlynightly00000000000000This is the C wrapper for the SyncEvolution DBus API. It is used by the GTK ui. syncevolution-1.5/src/dbus/glib/syncevo-dbus-types.h0000644000373300001540000001320112326412403024105 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __SYNCEVO_TYPES_H__ #define __SYNCEVO_TYPES_H__ #include #define SYNCEVO_DBUS_ERROR_EXCEPTION "org.syncevolution.Exception" #define SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG "org.syncevolution.NoSuchConfig" #define SYNCEVO_DBUS_ERROR_NO_SUCH_SOURCE "org.syncevolution.NoSuchsource" #define SYNCEVO_DBUS_ERROR_INVALID_CALL "org.syncevolution.InvalidCall" #define SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE "org.syncevolution.SourceUnusable" typedef enum { SYNCEVO_SYNC_UNKNOWN, /* Cannot be used in Sync */ SYNCEVO_SYNC_DEFAULT, /* cannot be received in GetStatus*/ SYNCEVO_SYNC_NONE, SYNCEVO_SYNC_TWO_WAY, SYNCEVO_SYNC_SLOW, SYNCEVO_SYNC_REFRESH_FROM_CLIENT, SYNCEVO_SYNC_REFRESH_FROM_SERVER, SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT, SYNCEVO_SYNC_ONE_WAY_FROM_SERVER, } SyncevoSyncMode; /* SyncevoSessionStatus is a bitfield, although most value are exclusive */ typedef enum { SYNCEVO_STATUS_UNKNOWN = 0, SYNCEVO_STATUS_QUEUEING = 1 << 0, SYNCEVO_STATUS_IDLE = 1 << 1, SYNCEVO_STATUS_RUNNING = 1 << 2, SYNCEVO_STATUS_ABORTING = 1 << 3, SYNCEVO_STATUS_SUSPENDING = 1 << 4, SYNCEVO_STATUS_DONE = 1 << 5, /* the ones below are modifiers */ SYNCEVO_STATUS_WAITING = 1 << 6 } SyncevoSessionStatus; typedef enum { SYNCEVO_PHASE_NONE, SYNCEVO_PHASE_PREPARING, SYNCEVO_PHASE_SENDING, SYNCEVO_PHASE_RECEIVING, } SyncevoSourcePhase; #define SYNCEVO_TYPE_STRING_STRING_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING)) #define SYNCEVO_TYPE_SOURCE_STATUS (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID)) #define SYNCEVO_TYPE_SOURCE_STATUSES (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, SYNCEVO_TYPE_SOURCE_STATUS)) #define SYNCEVO_TYPE_SOURCE_PROGRESS (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID)) #define SYNCEVO_TYPE_SOURCE_PROGRESSES (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, SYNCEVO_TYPE_SOURCE_PROGRESS)) typedef GHashTable SyncevoConfig; typedef GHashTable SyncevoSourceModes; typedef GHashTable SyncevoSourceStatuses; typedef GHashTable SyncevoSourceProgresses; typedef GPtrArray SyncevoReports; typedef GPtrArray SyncevoSessions; gboolean syncevo_config_get_value (SyncevoConfig *config, const char *source, const char *key, char **value); gboolean syncevo_config_set_value (SyncevoConfig *config, const char *source, const char *key, const char *value); typedef void (*ConfigFunc) (char *name, GHashTable *source_configuration, gpointer user_data); void syncevo_config_foreach_source (SyncevoConfig *config, ConfigFunc func, gpointer userdata); void syncevo_config_free (SyncevoConfig *config); const char* syncevo_sync_mode_to_string (SyncevoSyncMode mode); SyncevoSyncMode syncevo_sync_mode_from_string (const char *mode_str); SyncevoSourceModes* syncevo_source_modes_new (); void syncevo_source_modes_add (SyncevoSourceModes *source_modes, char *source, SyncevoSyncMode mode); void syncevo_source_modes_free (SyncevoSourceModes *source_modes); SyncevoSessionStatus syncevo_session_status_from_string (const char *status_str); typedef void (*SourceStatusFunc) (char *name, SyncevoSyncMode mode, SyncevoSessionStatus status, guint error_code, gpointer user_data); void syncevo_source_statuses_foreach (SyncevoSourceStatuses *source_statuses, SourceStatusFunc func, gpointer data); void syncevo_source_statuses_free (SyncevoSourceStatuses *source_statuses); typedef void (*SourceProgressFunc) (const char *name, SyncevoSourcePhase phase, gpointer user_data); void syncevo_source_progresses_foreach (SyncevoSourceProgresses *source_progresses, SourceProgressFunc func, gpointer userdata); void syncevo_source_progresses_free (SyncevoSourceProgresses *source_progresses); GHashTable* syncevo_reports_index (SyncevoReports *reports, guint index); guint syncevo_reports_get_length (SyncevoReports *reports); void syncevo_reports_free (SyncevoReports *reports); const char* syncevo_sessions_index (SyncevoSessions *sessions, guint index); void syncevo_sessions_free (SyncevoSessions *sessions); #endif syncevolution-1.5/src/dbus/glib/syncevo-server.h0000644000373300001540000001515712326412403023330 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __SYNCEVO_SERVER_H__ #define __SYNCEVO_SERVER_H__ #include #include "syncevo-dbus-types.h" #include "syncevo-session.h" G_BEGIN_DECLS enum SyncevoServerError{ SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT = 1, }; #define SYNCEVO_SERVER_ERROR_QUARK g_quark_from_static_string ("syncevo-server") #define DBUS_SERVICE_SYNCEVO_SERVER "org.syncevolution" #define DBUS_PATH_SYNCEVO_SERVER "/org/syncevolution/Server" #define DBUS_INTERFACE_SYNCEVO_SERVER "org.syncevolution.Server" #define SYNCEVO_TYPE_SERVER (syncevo_server_get_type ()) #define SYNCEVO_SERVER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SYNCEVO_TYPE_SERVER, SyncevoServer)) #define SYNCEVO_IS_SERVER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SYNCEVO_TYPE_SERVER)) typedef struct _SyncevoServer { GObject parent_object; } SyncevoServer; typedef struct _SyncevoServerClass { GObjectClass parent_class; void (*session_changed) (SyncevoServer *syncevo, char *session_path, gboolean started); void (*presence_changed) (SyncevoServer *syncevo, char *configuration, char *status, char *transport); void (*info_request) (SyncevoServer *syncevo, char *id, char *session_path, char *state, char *handler_path, char *type, GHashTable *parameters); void (*templates_changed) (SyncevoServer *syncevo); void (*shutdown) (SyncevoServer *syncevo); } SyncevoServerClass; GType syncevo_server_get_type (void); SyncevoServer *syncevo_server_get_default (); typedef void (*SyncevoServerGenericCb) (SyncevoServer *server, GError *error, gpointer userdata); typedef void (*SyncevoServerGetConfigsCb) (SyncevoServer *syncevo, char **config_names, GError *error, gpointer userdata); void syncevo_server_get_configs (SyncevoServer *syncevo, gboolean template, SyncevoServerGetConfigsCb callback, gpointer userdata); typedef void (*SyncevoServerGetConfigCb) (SyncevoServer *syncevo, SyncevoConfig *config, GError *error, gpointer userdata); void syncevo_server_get_config (SyncevoServer *syncevo, const char *config_name, gboolean template, SyncevoServerGetConfigCb callback, gpointer userdata); typedef void (*SyncevoServerGetReportsCb) (SyncevoServer *syncevo, SyncevoReports *reports, GError *error, gpointer userdata); void syncevo_server_get_reports (SyncevoServer *syncevo, const char *config_name, guint start, guint count, SyncevoServerGetReportsCb callback, gpointer userdata); typedef void (*SyncevoServerStartSessionCb) (SyncevoServer *syncevo, char *session_path, GError *error, gpointer userdata); void syncevo_server_start_session (SyncevoServer *syncevo, const char *config_name, SyncevoServerStartSessionCb callback, gpointer userdata); void syncevo_server_start_no_sync_session (SyncevoServer *syncevo, const char *config_name, SyncevoServerStartSessionCb callback, gpointer userdata); typedef void (*SyncevoServerGetSessionsCb) (SyncevoServer *syncevo, SyncevoSessions *sessions, GError *error, gpointer userdata); void syncevo_server_get_sessions (SyncevoServer *syncevo, SyncevoServerGetSessionsCb callback, gpointer userdata); typedef void (*SyncevoServerGetPresenceCb) (SyncevoServer *syncevo, char *status, char **transports, GError *error, gpointer userdata); void syncevo_server_get_presence (SyncevoServer *syncevo, const char *config_name, SyncevoServerGetPresenceCb callback, gpointer userdata); void syncevo_server_check_source (SyncevoServer *server, const char *config, const char *source, SyncevoServerGenericCb callback, gpointer userdata); void syncevo_server_info_response (SyncevoServer *server, const char *id, const char *state, GHashTable *response, SyncevoServerGenericCb callback, gpointer userdata); G_END_DECLS #endif syncevolution-1.5/src/dbus/glib/syncevo-session.h0000644000373300001540000001443512326412403023503 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __SYNCEVO_SESSION_H__ #define __SYNCEVO_SESSION_H__ #include #include "syncevo-dbus-types.h" G_BEGIN_DECLS enum SyncevoSessionError{ SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT = 1, }; #define SYNCEVO_SESSION_DBUS_SERVICE "org.syncevolution" #define SYNCEVO_SESSION_DBUS_INTERFACE "org.syncevolution.Session" #define SYNCEVO_TYPE_SESSION (syncevo_session_get_type ()) #define SYNCEVO_SESSION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SYNCEVO_TYPE_SESSION, SyncevoSession)) #define SYNCEVO_IS_SESSION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SYNCEVO_TYPE_SESSION)) typedef struct _SyncevoSession { GObject parent_object; } SyncevoSession; typedef struct _SyncevoSessionClass { GObjectClass parent_class; void (*status_changed) (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses); void (*progress_changed) (SyncevoSession *session, int progress, SyncevoSourceProgresses *source_progresses); } SyncevoSessionClass; GType syncevo_session_get_type (void); typedef void (*SyncevoSessionGenericCb) (SyncevoSession *session, GError *error, gpointer userdata); typedef void (*SyncevoSessionGetConfigNameCb) (SyncevoSession *session, char *name, GError *error, gpointer userdata); void syncevo_session_get_config_name (SyncevoSession *session, SyncevoSessionGetConfigNameCb callback, gpointer userdata); typedef void (*SyncevoSessionGetConfigCb) (SyncevoSession *session, SyncevoConfig *config, GError *error, gpointer userdata); void syncevo_session_get_config (SyncevoSession *session, gboolean template, SyncevoSessionGetConfigCb callback, gpointer userdata); void syncevo_session_set_config (SyncevoSession *session, gboolean update, gboolean temporary, SyncevoConfig *config, SyncevoSessionGenericCb callback, gpointer userdata); typedef void (*SyncevoSessionGetReportsCb) (SyncevoSession *session, SyncevoReports *reports, GError *error, gpointer userdata); void syncevo_session_get_reports (SyncevoSession *session, guint start, guint count, SyncevoSessionGetReportsCb callback, gpointer userdata); void syncevo_session_sync (SyncevoSession *session, SyncevoSyncMode mode, SyncevoSourceModes *source_modes, SyncevoSessionGenericCb callback, gpointer userdata); void syncevo_session_abort (SyncevoSession *session, SyncevoSessionGenericCb callback, gpointer userdata); void syncevo_session_suspend (SyncevoSession *session, SyncevoSessionGenericCb callback, gpointer userdata); typedef void (*SyncevoSessionGetStatusCb) (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, gpointer userdata); void syncevo_session_get_status (SyncevoSession *session, SyncevoSessionGetStatusCb callback, gpointer userdata); typedef void (*SyncevoSessionGetProgressCb) (SyncevoSession *session, guint progress, SyncevoSourceProgresses *source_progresses, GError *error, gpointer userdata); void syncevo_session_get_progress (SyncevoSession *session, SyncevoSessionGetProgressCb callback, gpointer userdata); void syncevo_session_check_source (SyncevoSession *session, const char *source, SyncevoSessionGenericCb callback, gpointer userdata); void syncevo_session_restore (SyncevoSession *session, const char *backup_dir, const gboolean before, const char **sources, SyncevoSessionGenericCb callback, gpointer userdata); const char *syncevo_session_get_path (SyncevoSession *session); SyncevoSession *syncevo_session_new (const char *path); G_END_DECLS #endif syncevolution-1.5/src/dbus/glib/glib.am0000644000373300001540000000747512326412403021425 0ustar00nightlynightly00000000000000if COND_GUI src_dbus_glib_lib = src/dbus/glib/libsyncevo-dbus.la lib_LTLIBRARIES += $(src_dbus_glib_lib) src_dbus_glib_cppflags = \ -I$(top_srcdir) \ $(SYNTHESIS_CFLAGS) \ -I$(top_srcdir)/src/dbus/glib \ -I$(top_builddir)/src/dbus/glib DISTCLEANFILES += src/dbus/glib/syncevo-dbus.pc dist_noinst_DATA += \ src/dbus/glib/syncevo-dbus.pc.in \ src/dbus/glib/syncevo-marshal.list \ src/dbus/glib/README #pkgconfigdir is defined in $(top_srcdir)/setup-variables.am pkgconfig_DATA += src/dbus/glib/syncevo-dbus.pc noinst_PROGRAMS += src/dbus/glib/test-syncevo-dbus src_dbus_glib_test_syncevo_dbus_SOURCES = src/dbus/glib/test.c src_dbus_glib_test_syncevo_dbus_LDADD = $(DBUS_GLIB_LIBS) $(src_dbus_glib_lib) src_dbus_glib_test_syncevo_dbus_CFLAGS = $(DBUS_GLIB_CFLAGS) $(SYNCEVO_WFLAGS) src_dbus_glib_test_syncevo_dbus_CPPFLAGS = $(src_dbus_glib_cppflags) src_dbus_glib_built_sources = \ src/dbus/glib/syncevo-marshal.c \ src/dbus/glib/syncevo-marshal.h \ src/dbus/glib/syncevo-server-bindings.h \ src/dbus/glib/syncevo-connection-bindings.h \ src/dbus/glib/syncevo-session-bindings.h \ src/dbus/glib/syncevo-server-glue.h \ src/dbus/glib/syncevo-connection-glue.h \ src/dbus/glib/syncevo-session-glue.h \ src/dbus/glib/syncevo-server.xml \ src/dbus/glib/syncevo-connection.xml \ src/dbus/glib/syncevo-session.xml BUILT_SOURCES += $(src_dbus_glib_built_sources) CLEANFILES += $(src_dbus_glib_built_sources) # D-Bus binding tool gets confused by doc comments, strip them first src/dbus/glib/%.xml: $(top_srcdir)/src/dbus/interfaces/spec-strip-docs.xsl $(top_srcdir)/src/dbus/interfaces/%-full.xml $(AM_V_GEN)$(XSLT) -o $@ $+ src/dbus/glib/%-bindings.h: src/dbus/glib/stamp-%-bindings.h $(AM_V_GEN) @true src/dbus/glib/stamp-%-bindings.h: src/dbus/glib/%.xml $(AM_V_at)XGENNAME='$(dir $@)xgen-$(notdir $@)' \ && BINDINGSNAME='$(dir $@)$(subst stamp-,,$(notdir $@))' \ && $(DBUS_BINDING_TOOL) --mode=glib-client --prefix=syncevo $< >"$$XGENNAME" \ && (cmp -s "$$XGENNAME" "$$BINDINGSNAME" || cp "$$XGENNAME" "$$BINDINGSNAME" )\ && rm -f "$$XGENNAME" \ && echo 'timestamp' >$@ src/dbus/glib/syncevo-marshal.h: $(top_srcdir)/src/dbus/glib/syncevo-marshal.list $(GLIB_GENMARSHAL) $(AM_V_GEN)$(GLIB_GENMARSHAL) $< --header --prefix=syncevo_marshal > $@ src/dbus/glib/syncevo-marshal.c: $(top_srcdir)/src/dbus/glib/syncevo-marshal.list src/dbus/glib/syncevo-marshal.h $(GLIB_GENMARSHAL) $(AM_V_GEN)echo "#include \"syncevo-marshal.h\"" > $@ \ && $(GLIB_GENMARSHAL) --prefix=syncevo_marshal $(top_srcdir)/src/dbus/glib/syncevo-marshal.list --body >> $@ src/dbus/glib/%-glue.h: src/dbus/glib/stamp-%-glue.h $(AM_V_GEN) @true src/dbus/glib/stamp-%-glue.h: src/dbus/glib/%.xml $(AM_V_at)XGENNAME='$(dir $@)xgen-$(notdir $@)' \ && GLUENAME='$(dir $@)$(subst stamp-,,$(notdir $@))' \ && $(DBUS_BINDING_TOOL) --prefix=syncevo --mode=glib-server $< >"$$XGENNAME" \ && (cmp -s "$$XGENNAME" "$$GLUENAME" || cp "$$XGENNAME" "$$GLUENAME") \ && rm -f "$$XGENNAME" \ && echo 'timestamp' >$@ nodist_src_dbus_glib_libsyncevo_dbus_la_SOURCES = \ $(src_dbus_glib_built_sources) src_dbus_glib_libsyncevo_dbus_la_SOURCES = \ $(src_dbus_glib_syncevo_dbus_headers) \ src/dbus/glib/syncevo-dbus-types.c \ src/dbus/glib/syncevo-server.c \ src/dbus/glib/syncevo-session.c src_dbus_glib_libsyncevo_dbus_la_CFLAGS = \ -I$(top_srcdir) \ -I$(top_builddir) \ $(DBUS_GLIB_CFLAGS) \ $(SYNCEVO_WFLAGS) src_dbus_glib_libsyncevo_dbus_la_LIBADD = \ $(DBUS_GLIB_LIBS) src_dbus_glib_libsyncevo_dbus_la_CPPFLAGS = \ $(src_dbus_glib_cppflags) src_dbus_glib_syncevo_dbus_headers = \ src/dbus/glib/syncevo-dbus-types.h \ src/dbus/glib/syncevo-server.h \ src/dbus/glib/syncevo-session.h src_dbus_glib_libsyncevo_dbus_includedir = $(includedir)/syncevo-dbus src_dbus_glib_libsyncevo_dbus_include_HEADERS = \ $(src_dbus_glib_syncevo_dbus_headers) endif syncevolution-1.5/src/dbus/glib/syncevo-dbus-types.c0000644000373300001540000003061312326412403024106 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include "syncevo-dbus-types.h" gboolean syncevo_config_get_value (SyncevoConfig *config, const char *source, const char *key, char **value) { char *name; GHashTable *source_config; g_return_val_if_fail (config, FALSE); g_return_val_if_fail (value, FALSE); *value = NULL; if (!source || strlen (source) == 0) { name = g_strdup (""); } else { name = g_strdup_printf ("source/%s", source); } source_config = (GHashTable*)g_hash_table_lookup (config, name); g_free (name); if (source_config) { return g_hash_table_lookup_extended (source_config, key, NULL, (gpointer*)value); } return FALSE; } gboolean syncevo_config_set_value (SyncevoConfig *config, const char *source, const char *key, const char *value) { gboolean changed; char *name; char *old_value; GHashTable *source_config; g_return_val_if_fail (config, FALSE); g_return_val_if_fail (key, FALSE); if (!source || strlen (source) == 0) { name = g_strdup (""); } else { name = g_strdup_printf ("source/%s", source); } source_config = (GHashTable*)g_hash_table_lookup (config, name); if (!source_config) { source_config = g_hash_table_new (g_str_hash, g_str_equal); g_hash_table_insert (config, name, source_config); } else { g_free (name); } old_value = g_hash_table_lookup (source_config, key); if ((!old_value && !value) || (old_value && value && strcmp (old_value, value) == 0)) { changed = FALSE; } else { changed = TRUE; g_hash_table_insert (source_config, g_strdup (key), g_strdup (value)); } return changed; } void syncevo_config_foreach_source (SyncevoConfig *config, ConfigFunc func, gpointer userdata) { GHashTableIter iter; char *key; GHashTable *value; g_hash_table_iter_init (&iter, config); while (g_hash_table_iter_next (&iter, (gpointer*)&key, (gpointer*)&value)) { if (key && g_str_has_prefix (key, "source/")) { char *name; name = key+7; func (name, value, userdata); } } } void syncevo_config_free (SyncevoConfig *config) { /* NOTE: Hashtables gcreated by dbus-glib should free their contents */ if (config) { g_hash_table_destroy (config); } } const char* syncevo_sync_mode_to_string (SyncevoSyncMode mode) { const char *mode_str; switch (mode) { case SYNCEVO_SYNC_NONE: mode_str = "none"; break; case SYNCEVO_SYNC_TWO_WAY: mode_str = "two-way"; break; case SYNCEVO_SYNC_SLOW: mode_str = "slow"; break; case SYNCEVO_SYNC_REFRESH_FROM_CLIENT: mode_str = "refresh-from-client"; break; case SYNCEVO_SYNC_REFRESH_FROM_SERVER: mode_str = "refresh-from-server"; break; case SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT: mode_str = "one-way-from-client"; break; case SYNCEVO_SYNC_ONE_WAY_FROM_SERVER: mode_str = "one-way-from-server"; break; case SYNCEVO_SYNC_DEFAULT: mode_str = ""; break; default: mode_str = ""; break; } return mode_str; } SyncevoSourceModes* syncevo_source_modes_new () { return g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); } void syncevo_source_modes_add (SyncevoSourceModes *source_modes, char *source, SyncevoSyncMode mode) { const char *mode_str; g_return_if_fail (source_modes); g_return_if_fail (source); mode_str = syncevo_sync_mode_to_string (mode); g_hash_table_insert (source_modes, source, (char*)mode_str); } void syncevo_source_modes_free (SyncevoSourceModes *source_modes) { /* no need to free keys/values */ g_hash_table_destroy (source_modes); } SyncevoSessionStatus syncevo_session_status_from_string (const char *status_str) { SyncevoSessionStatus status; if (!status_str) { status = SYNCEVO_STATUS_UNKNOWN; } else if (g_str_has_prefix (status_str, "queueing")) { status = SYNCEVO_STATUS_QUEUEING; } else if (g_str_has_prefix (status_str, "idle")) { status = SYNCEVO_STATUS_IDLE; } else if (g_str_has_prefix (status_str, "done")) { status = SYNCEVO_STATUS_DONE; } else if (g_str_has_prefix (status_str, "running")) { status = SYNCEVO_STATUS_RUNNING; } else if (g_str_has_prefix (status_str, "aborting")) { status = SYNCEVO_STATUS_ABORTING; } else if (g_str_has_prefix (status_str, "suspending")) { status = SYNCEVO_STATUS_SUSPENDING; } else { status = SYNCEVO_STATUS_UNKNOWN; } if (status_str && strstr (status_str, ";waiting")) { status |= SYNCEVO_STATUS_WAITING; } return status; } SyncevoSyncMode syncevo_sync_mode_from_string (const char *mode_str) { if (!mode_str || g_str_has_prefix (mode_str, "none") || g_str_has_prefix (mode_str, "disabled")) { return SYNCEVO_SYNC_NONE; } else if (g_str_has_prefix (mode_str, "two-way")) { return SYNCEVO_SYNC_TWO_WAY; } else if (g_str_has_prefix (mode_str, "slow")) { return SYNCEVO_SYNC_SLOW; } else if (g_str_has_prefix (mode_str, "refresh-from-client")) { return SYNCEVO_SYNC_REFRESH_FROM_CLIENT; } else if (g_str_has_prefix (mode_str, "refresh-from-server")) { return SYNCEVO_SYNC_REFRESH_FROM_SERVER; } else if (g_str_has_prefix (mode_str, "one-way-from-client")) { return SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT; } else if (g_str_has_prefix (mode_str, "one-way-from-server")) { return SYNCEVO_SYNC_ONE_WAY_FROM_SERVER; } else { return SYNCEVO_SYNC_UNKNOWN; } } static SyncevoSessionStatus syncevo_source_status_from_string (const char *status_str) { SyncevoSessionStatus status; if (!status_str) { status = SYNCEVO_STATUS_UNKNOWN; } else if (g_str_has_prefix (status_str, "idle")) { status = SYNCEVO_STATUS_IDLE; } else if (g_str_has_prefix (status_str, "running")) { status = SYNCEVO_STATUS_RUNNING; } else if (g_str_has_prefix (status_str, "done")) { status = SYNCEVO_STATUS_DONE; } else { status = SYNCEVO_STATUS_UNKNOWN; } /* check modifiers */ if (status_str && strstr (status_str, ";waiting")) { status |= SYNCEVO_STATUS_WAITING; } return status; } void syncevo_source_statuses_foreach (SyncevoSourceStatuses *source_statuses, SourceStatusFunc func, gpointer data) { GHashTableIter iter; GValueArray *source_status; char *name; g_return_if_fail (source_statuses); g_hash_table_iter_init (&iter, source_statuses); while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&source_status)) { const char *mode_str; const char *status_str; SyncevoSyncMode mode; SyncevoSessionStatus status; guint error_code; mode_str = g_value_get_string (g_value_array_get_nth (source_status, 0)); mode = syncevo_sync_mode_from_string (mode_str); status_str = g_value_get_string (g_value_array_get_nth (source_status, 1)); status = syncevo_source_status_from_string (status_str); error_code = g_value_get_uint (g_value_array_get_nth (source_status, 2)); func (name, mode, status, error_code, data); } } static void free_source_status_item (char *source, GValueArray *status_array) { g_free (source); g_boxed_free (SYNCEVO_TYPE_SOURCE_STATUS, status_array); } void syncevo_source_statuses_free (SyncevoSourceStatuses *source_statuses) { g_hash_table_foreach (source_statuses, (GHFunc)free_source_status_item, NULL); g_hash_table_destroy (source_statuses); } void syncevo_source_progresses_foreach (SyncevoSourceProgresses *source_progresses, SourceProgressFunc func, gpointer userdata) { const char *phase_str, *name; GHashTableIter iter; GValueArray *progress_array; g_return_if_fail (source_progresses); g_hash_table_iter_init (&iter, source_progresses); while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&progress_array)) { SyncevoSourcePhase phase; phase_str = g_value_get_string (g_value_array_get_nth (progress_array, 0)); if (!phase_str) { phase = SYNCEVO_PHASE_NONE; } else if (g_str_has_prefix (phase_str, "preparing")) { phase = SYNCEVO_PHASE_PREPARING; } else if (g_str_has_prefix (phase_str, "sending")) { phase = SYNCEVO_PHASE_SENDING; } else if (g_str_has_prefix (phase_str, "receiving")) { phase = SYNCEVO_PHASE_RECEIVING; } else { phase = SYNCEVO_PHASE_NONE; } /* val = g_value_array_get_nth (progress_array, 1); progress->prepare_current = g_value_get_int (val); val = g_value_array_get_nth (progress_array, 2); progress->prepare_total = g_value_get_int (val); val = g_value_array_get_nth (progress_array, 3); progress->send_current = g_value_get_int (val); val = g_value_array_get_nth (progress_array, 4); progress->send_total = g_value_get_int (val); val = g_value_array_get_nth (progress_array, 5); progress->receive_current = g_value_get_int (val); val = g_value_array_get_nth (progress_array, 6); progress->receive_total = g_value_get_int (val); */ func (name, phase, userdata); } } static void free_source_progress_item (char *source, GValueArray *progress_array) { g_free (source); g_boxed_free (SYNCEVO_TYPE_SOURCE_PROGRESS, progress_array); } void syncevo_source_progresses_free (SyncevoSourceProgresses *source_progresses) { g_hash_table_foreach (source_progresses, (GHFunc)free_source_progress_item, NULL); g_hash_table_destroy (source_progresses); } static void free_report_item (char *key, char *value) { g_free (key); g_free (value); } static void syncevo_report_free (GHashTable *report) { g_hash_table_foreach (report, (GHFunc)free_report_item, NULL); g_hash_table_destroy (report); } GHashTable* syncevo_reports_index (SyncevoReports *reports, guint index) { g_return_val_if_fail (reports, NULL); return (GHashTable*)g_ptr_array_index (reports, index); } guint syncevo_reports_get_length (SyncevoReports *reports) { return reports->len; } void syncevo_reports_free (SyncevoReports *reports) { g_ptr_array_foreach (reports, (GFunc)syncevo_report_free, NULL); g_ptr_array_free (reports, TRUE); } const char* syncevo_sessions_index (SyncevoSessions *sessions, guint index) { g_return_val_if_fail (sessions, NULL); if (index >= sessions->len) { return NULL; } return (const char*)g_ptr_array_index (sessions, index); } void syncevo_sessions_free (SyncevoSessions *sessions) { g_ptr_array_foreach (sessions, (GFunc)g_free, NULL); g_ptr_array_free (sessions, TRUE); } syncevolution-1.5/src/dbus/glib/syncevo-server.c0000644000373300001540000006726312326412403023330 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include "syncevo-server.h" #include "syncevo-marshal.h" #include "syncevo-server-bindings.h" typedef struct _ServerAsyncData { SyncevoServer *server; GCallback callback; gpointer userdata; } ServerAsyncData; enum { SESSION_CHANGED, PRESENCE_CHANGED, INFO_REQUEST, TEMPLATES_CHANGED, SHUTDOWN, LAST_SIGNAL }; static guint32 signals[LAST_SIGNAL] = {0, }; typedef struct _SyncevoServerPrivate { DBusGProxy *proxy; } SyncevoServerPrivate; #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNCEVO_TYPE_SERVER, SyncevoServerPrivate)) G_DEFINE_TYPE (SyncevoServer, syncevo_server, G_TYPE_OBJECT); static ServerAsyncData* server_async_data_new (SyncevoServer *server, GCallback callback, gpointer userdata) { ServerAsyncData *data; data = g_slice_new0 (ServerAsyncData); data->server = server; data->callback = G_CALLBACK (callback); data->userdata = userdata; return data; } static void server_async_data_free (ServerAsyncData *data) { g_slice_free (ServerAsyncData, data); } static void generic_callback (DBusGProxy *proxy, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerGenericCb)data->callback) (data->server, error, data->userdata); } server_async_data_free (data); } static gboolean generic_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "The D-Bus object does not exist"); (*(SyncevoServerGenericCb)data->callback) (data->server, error, data->userdata); server_async_data_free (data); return FALSE; } static void templates_changed_cb (DBusGProxy *proxy, SyncevoServer *server) { g_signal_emit (server, signals[TEMPLATES_CHANGED], 0); } static void session_changed_cb (DBusGProxy *proxy, char *session_path, gboolean started, SyncevoServer *server) { g_signal_emit (server, signals[SESSION_CHANGED], 0, session_path, started); } static void presence_cb (DBusGProxy *proxy, char *configuration, char *status, char *transport, SyncevoServer *server) { g_signal_emit (server, signals[PRESENCE_CHANGED], 0, configuration, status, transport); } static void info_request_cb (DBusGProxy *proxy, char *id, char *session_path, char *state, char *handler_path, char *type, GHashTable *parameters, SyncevoServer *server) { g_signal_emit (server, signals[INFO_REQUEST], 0, id, session_path, state, handler_path, type, parameters); } static void proxy_destroy_cb (DBusGProxy *proxy, SyncevoServer *server) { SyncevoServerPrivate *priv; priv = GET_PRIVATE (server); if (priv->proxy) { g_object_unref (priv->proxy); } priv->proxy = NULL; g_signal_emit (server, signals[SHUTDOWN], 0); } #if 0 static void detach_cb (DBusGProxy *proxy, GError *error, gpointer userdata) { if (error) { g_warning ("Server.Detach failed: %s", error->message); g_error_free (error); } } #endif static void dispose (GObject *object) { SyncevoServerPrivate *priv; priv = GET_PRIVATE (object); if (priv->proxy) { dbus_g_proxy_disconnect_signal (priv->proxy, "SessionChanged", G_CALLBACK (session_changed_cb), object); dbus_g_proxy_disconnect_signal (priv->proxy, "Presence", G_CALLBACK (presence_cb), object); dbus_g_proxy_disconnect_signal (priv->proxy, "InfoRequest", G_CALLBACK (info_request_cb), object); dbus_g_proxy_disconnect_signal (priv->proxy, "TemplatesChanged", G_CALLBACK (templates_changed_cb), object); dbus_g_proxy_disconnect_signal (priv->proxy, "destroy", G_CALLBACK (proxy_destroy_cb), object); org_syncevolution_Server_detach (priv->proxy, NULL); g_object_unref (priv->proxy); priv->proxy = NULL; } G_OBJECT_CLASS (syncevo_server_parent_class)->dispose (object); } static void attach_cb (DBusGProxy *proxy, GError *error, gpointer userdata) { if (error) { g_warning ("Server.Attach failed: %s", error->message); g_error_free (error); } } static gboolean syncevo_server_get_new_proxy (SyncevoServer *server) { DBusGConnection *connection; GError *error; guint32 result; SyncevoServerPrivate *priv; DBusGProxy *proxy; priv = GET_PRIVATE (server); error = NULL; connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); if (connection == NULL) { g_printerr ("Failed to open connection to bus: %s\n", error->message); g_error_free (error); priv->proxy = NULL; return FALSE; } /* we want to use dbus_g_proxy_new_for_name_owner() for the destroy signal * so need to start the service by hand by using DBUS proxy: */ proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); if (!dbus_g_proxy_call (proxy, "StartServiceByName", NULL, G_TYPE_STRING, DBUS_SERVICE_SYNCEVO_SERVER, G_TYPE_UINT, 0, G_TYPE_INVALID, G_TYPE_UINT, &result, G_TYPE_INVALID)) { g_warning ("StartServiceByName call failed"); } g_object_unref (proxy); /* the real proxy */ priv->proxy = dbus_g_proxy_new_for_name_owner (connection, DBUS_SERVICE_SYNCEVO_SERVER, DBUS_PATH_SYNCEVO_SERVER, DBUS_INTERFACE_SYNCEVO_SERVER, &error); if (priv->proxy == NULL) { g_printerr ("dbus_g_proxy_new_for_name_owner() failed: %s\n", error->message); g_error_free (error); return FALSE; } dbus_g_proxy_add_signal (priv->proxy, "SessionChanged", DBUS_TYPE_G_OBJECT_PATH, G_TYPE_BOOLEAN, G_TYPE_INVALID); dbus_g_proxy_connect_signal (priv->proxy, "SessionChanged", G_CALLBACK (session_changed_cb), server, NULL); dbus_g_proxy_add_signal (priv->proxy, "Presence", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_connect_signal (priv->proxy, "Presence", G_CALLBACK (presence_cb), server, NULL); dbus_g_proxy_add_signal (priv->proxy, "InfoRequest", G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, SYNCEVO_TYPE_STRING_STRING_HASHTABLE, G_TYPE_INVALID); dbus_g_proxy_connect_signal (priv->proxy, "InfoRequest", G_CALLBACK (info_request_cb), server, NULL); dbus_g_proxy_add_signal (priv->proxy, "TemplatesChanged", G_TYPE_INVALID); dbus_g_proxy_connect_signal (priv->proxy, "TemplatesChanged", G_CALLBACK (templates_changed_cb), server, NULL); g_signal_connect (priv->proxy, "destroy", G_CALLBACK (proxy_destroy_cb), server); org_syncevolution_Server_attach_async (priv->proxy, (org_syncevolution_Server_attach_reply)attach_cb, NULL); return TRUE; } static void syncevo_server_init (SyncevoServer *server) { /* SessionChanged */ dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_BOOLEAN, G_TYPE_NONE, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_BOOLEAN, G_TYPE_INVALID); /* Presence */ dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID); /* InfoRequest */ dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_STRING_STRING_STRING_STRING_BOXED, G_TYPE_NONE, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOXED, G_TYPE_INVALID); /* TemplatesChanged */ dbus_g_object_register_marshaller (g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, G_TYPE_INVALID); syncevo_server_get_new_proxy (server); } static void syncevo_server_class_init (SyncevoServerClass *klass) { GObjectClass *o_class = (GObjectClass *) klass; o_class->dispose = dispose; g_type_class_add_private (klass, sizeof (SyncevoServerPrivate)); signals[SESSION_CHANGED] = g_signal_new ("session-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoServerClass, session_changed), NULL, NULL, syncevo_marshal_VOID__STRING_BOOLEAN, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN); signals[PRESENCE_CHANGED] = g_signal_new ("presence-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoServerClass, presence_changed), NULL, NULL, syncevo_marshal_VOID__STRING_STRING_STRING, G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); signals[INFO_REQUEST] = g_signal_new ("info-request", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoServerClass, info_request), NULL, NULL, syncevo_marshal_VOID__STRING_STRING_STRING_STRING_STRING_BOXED, G_TYPE_NONE, 6, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); signals[TEMPLATES_CHANGED] = g_signal_new ("templates-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoServerClass, templates_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); signals[SHUTDOWN] = g_signal_new ("shutdown", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoServerClass, shutdown), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } SyncevoServer * syncevo_server_get_default () { static SyncevoServer *server = NULL; if (server == NULL) { server = g_object_new (SYNCEVO_TYPE_SERVER, NULL); g_object_add_weak_pointer (G_OBJECT (server), (gpointer) &server); return server; } return g_object_ref (server); } static void get_configs_callback (DBusGProxy *proxy, char **config_names, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerGetConfigsCb)data->callback) (data->server, config_names, error, data->userdata); } server_async_data_free (data); } static gboolean get_configs_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "Could not start service"); (*(SyncevoServerGetConfigsCb)data->callback) (data->server, NULL, error, data->userdata); server_async_data_free (data); return FALSE; } void syncevo_server_get_configs (SyncevoServer *syncevo, gboolean template, SyncevoServerGetConfigsCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)get_configs_error, data); } return; } org_syncevolution_Server_get_configs_async (priv->proxy, template, (org_syncevolution_Server_get_configs_reply) get_configs_callback, data); } static void get_config_callback (DBusGProxy *proxy, SyncevoConfig *configuration, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerGetConfigCb)data->callback) (data->server, configuration, error, data->userdata); } server_async_data_free (data); } static gboolean get_config_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "Could not start service"); (*(SyncevoServerGetConfigCb)data->callback) (data->server, NULL, error, data->userdata); server_async_data_free (data); return FALSE; } void syncevo_server_get_config (SyncevoServer *syncevo, const char *config_name, gboolean template, SyncevoServerGetConfigCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)get_config_error, data); } return; } org_syncevolution_Server_get_config_async (priv->proxy, config_name, template, (org_syncevolution_Server_get_config_reply) get_config_callback, data); } static void get_reports_callback (DBusGProxy *proxy, SyncevoReports *reports, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerGetReportsCb)data->callback) (data->server, reports, error, data->userdata); } server_async_data_free (data); } static gboolean get_reports_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "Could not start service"); (*(SyncevoServerGetReportsCb)data->callback) (data->server, NULL, error, data->userdata); server_async_data_free (data); return FALSE; } void syncevo_server_get_reports (SyncevoServer *syncevo, const char *config_name, guint start, guint count, SyncevoServerGetReportsCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)get_reports_error, data); } return; } org_syncevolution_Server_get_reports_async (priv->proxy, config_name, start, count, (org_syncevolution_Server_get_reports_reply) get_reports_callback, data); } static void start_session_callback (SyncevoServer *syncevo, char *session_path, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerStartSessionCb)data->callback) (data->server, session_path, error, data->userdata); } server_async_data_free (data); } static gboolean start_session_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "Could not start service"); (*(SyncevoServerStartSessionCb)data->callback) (data->server, NULL, error, data->userdata); server_async_data_free (data); return FALSE; } void syncevo_server_start_session (SyncevoServer *syncevo, const char *config_name, SyncevoServerStartSessionCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)start_session_error, data); } return; } org_syncevolution_Server_start_session_async (priv->proxy, config_name, (org_syncevolution_Server_start_session_reply) start_session_callback, data); } void syncevo_server_start_no_sync_session (SyncevoServer *syncevo, const char *config_name, SyncevoServerStartSessionCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; const char *flags[2] = {"no-sync", NULL}; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)start_session_error, data); } return; } org_syncevolution_Server_start_session_with_flags_async (priv->proxy, config_name, flags, (org_syncevolution_Server_start_session_reply) start_session_callback, data); } static void get_sessions_callback (SyncevoServer *syncevo, SyncevoSessions *sessions, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerGetSessionsCb)data->callback) (data->server, sessions, error, data->userdata); } server_async_data_free (data); } static gboolean get_sessions_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "Could not start service"); (*(SyncevoServerGetSessionsCb)data->callback) (data->server, NULL, error, data->userdata); server_async_data_free (data); return FALSE; } void syncevo_server_get_sessions (SyncevoServer *syncevo, SyncevoServerGetSessionsCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)get_sessions_error, data); } return; } org_syncevolution_Server_get_sessions_async (priv->proxy, (org_syncevolution_Server_get_reports_reply) get_sessions_callback, data); } static void check_presence_callback (SyncevoServer *syncevo, char *status, char **transports, GError *error, ServerAsyncData *data) { if (data->callback) { (*(SyncevoServerGetPresenceCb)data->callback) (data->server, status, transports, error, data->userdata); } server_async_data_free (data); } static gboolean check_presence_error (ServerAsyncData *data) { GError *error; error = g_error_new_literal (SYNCEVO_SERVER_ERROR_QUARK, SYNCEVO_SERVER_ERROR_NO_DBUS_OBJECT, "Could not start service"); (*(SyncevoServerGetPresenceCb)data->callback) (data->server, NULL, NULL, error, data->userdata); server_async_data_free (data); return FALSE; } void syncevo_server_get_presence (SyncevoServer *syncevo, const char *config_name, SyncevoServerGetPresenceCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (syncevo); data = server_async_data_new (syncevo, G_CALLBACK (callback), userdata); if (!priv->proxy && !syncevo_server_get_new_proxy (syncevo)) { if (callback) { g_idle_add ((GSourceFunc)check_presence_error, data); } return; } org_syncevolution_Server_check_presence_async (priv->proxy, config_name, (org_syncevolution_Server_check_presence_reply) check_presence_callback, data); } void syncevo_server_check_source (SyncevoServer *server, const char *config, const char *source, SyncevoServerGenericCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (server); data = server_async_data_new (server, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Server_check_source_async (priv->proxy, config, source, (org_syncevolution_Server_check_source_reply) generic_callback, data); } void syncevo_server_info_response (SyncevoServer *server, const char *id, const char *state, GHashTable *response, SyncevoServerGenericCb callback, gpointer userdata) { ServerAsyncData *data; SyncevoServerPrivate *priv; priv = GET_PRIVATE (server); data = server_async_data_new (server, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Server_info_response_async (priv->proxy, id, state, response, (org_syncevolution_Server_info_response_reply) generic_callback, data); } syncevolution-1.5/src/dbus/glib/syncevo-session.c0000644000373300001540000005565412326412403023506 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include "syncevo-session.h" #include "syncevo-marshal.h" #include "syncevo-session-bindings.h" typedef struct _SessionAsyncData { SyncevoSession *session; GCallback callback; gpointer userdata; } SessionAsyncData; enum { PROP_0, PROP_SESSION_PATH, }; enum { STATUS_CHANGED, PROGRESS_CHANGED, LAST_SIGNAL }; static guint32 signals[LAST_SIGNAL] = {0, }; typedef struct _SyncevoSessionPrivate { DBusGProxy *proxy; char *path; } SyncevoSessionPrivate; #define GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SYNCEVO_TYPE_SESSION, SyncevoSessionPrivate)) G_DEFINE_TYPE (SyncevoSession, syncevo_session, G_TYPE_OBJECT); static SessionAsyncData* session_async_data_new (SyncevoSession *session, GCallback callback, gpointer userdata) { SessionAsyncData *data; data = g_slice_new0 (SessionAsyncData); data->session = session; data->callback = G_CALLBACK (callback); data->userdata = userdata; return data; } static void session_async_data_free (SessionAsyncData *data) { g_slice_free (SessionAsyncData, data); } static void status_changed_cb (DBusGProxy *proxy, char *status, guint error_code, SyncevoSourceStatuses *source_statuses, SyncevoSession *session) { g_signal_emit (session, signals[STATUS_CHANGED], 0, syncevo_session_status_from_string (status), error_code, source_statuses); } static void progress_changed_cb (DBusGProxy *proxy, int progress, SyncevoSourceProgresses *source_progresses, SyncevoSession *session) { g_signal_emit (session, signals[PROGRESS_CHANGED], 0, progress, source_progresses); } static void syncevo_session_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { SyncevoSession *session = SYNCEVO_SESSION (object); SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); switch (property_id) { case PROP_SESSION_PATH: g_value_set_string (value, priv->path); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void syncevo_session_set_path (SyncevoSession *session, const char *path) { SyncevoSessionPrivate *priv; DBusGConnection *connection; GError *error; priv = GET_PRIVATE (session); error = NULL; priv->path = g_strdup (path); if (!priv->path) { return; } connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); if (connection == NULL) { g_printerr ("Failed to open connection to bus: %s\n", error->message); g_error_free (error); priv->proxy = NULL; return; } priv->proxy = dbus_g_proxy_new_for_name (connection, SYNCEVO_SESSION_DBUS_SERVICE, priv->path, SYNCEVO_SESSION_DBUS_INTERFACE); if (priv->proxy == NULL) { g_printerr ("dbus_g_proxy_new_for_name() failed for path '%s'", priv->path); return; } dbus_g_proxy_add_signal (priv->proxy, "StatusChanged", G_TYPE_STRING, G_TYPE_UINT, SYNCEVO_TYPE_SOURCE_STATUSES, G_TYPE_INVALID); dbus_g_proxy_connect_signal (priv->proxy, "StatusChanged", G_CALLBACK (status_changed_cb), session, NULL); dbus_g_proxy_add_signal (priv->proxy, "ProgressChanged", G_TYPE_INT, SYNCEVO_TYPE_SOURCE_PROGRESSES, G_TYPE_INVALID); dbus_g_proxy_connect_signal (priv->proxy, "ProgressChanged", G_CALLBACK (progress_changed_cb), session, NULL); } static void syncevo_session_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { SyncevoSession *session = SYNCEVO_SESSION (object); switch (property_id) { case PROP_SESSION_PATH: syncevo_session_set_path (session, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void dispose (GObject *object) { SyncevoSessionPrivate *priv; priv = GET_PRIVATE (object); if (priv->proxy) { dbus_g_proxy_disconnect_signal (priv->proxy, "ProgressChanged", G_CALLBACK (progress_changed_cb), object); dbus_g_proxy_disconnect_signal (priv->proxy, "StatusChanged", G_CALLBACK (status_changed_cb), object); /* TODO: need to do this async... */ org_syncevolution_Session_detach (priv->proxy, NULL); g_object_unref (priv->proxy); priv->proxy = NULL; } G_OBJECT_CLASS (syncevo_session_parent_class)->dispose (object); } static void syncevo_session_class_init (SyncevoSessionClass *klass) { GObjectClass *o_class = (GObjectClass *) klass; GParamSpec *pspec; o_class->dispose = dispose; o_class->set_property = syncevo_session_set_property; o_class->get_property = syncevo_session_get_property; g_type_class_add_private (klass, sizeof (SyncevoSessionPrivate)); signals[STATUS_CHANGED] = g_signal_new ("status-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoSessionClass, status_changed), NULL, NULL, syncevo_marshal_VOID__UINT_UINT_BOXED, G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_POINTER); signals[PROGRESS_CHANGED] = g_signal_new ("progress-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncevoSessionClass, progress_changed), NULL, NULL, syncevo_marshal_VOID__INT_BOXED, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER); pspec = g_param_spec_string ("session-path", "Session path", "The D-Bus path this Syncevolution session uses", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (o_class, PROP_SESSION_PATH, pspec); } static void syncevo_session_init (SyncevoSession *session) { /* ProgressChanged */ dbus_g_object_register_marshaller (syncevo_marshal_VOID__INT_BOXED, G_TYPE_NONE, G_TYPE_INT, G_TYPE_BOXED, G_TYPE_INVALID); /* StatusChanged */ dbus_g_object_register_marshaller (syncevo_marshal_VOID__STRING_UINT_BOXED, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_BOXED, G_TYPE_INVALID); } static void generic_callback (DBusGProxy *proxy, GError *error, SessionAsyncData *data) { if (data->callback) { (*(SyncevoSessionGenericCb)data->callback) (data->session, error, data->userdata); } session_async_data_free (data); } static gboolean generic_error (SessionAsyncData *data) { GError *error; error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"), SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT, "The D-Bus object does not exist"); (*(SyncevoSessionGenericCb)data->callback) (data->session, error, data->userdata); session_async_data_free (data); return FALSE; } static void get_config_name_callback (DBusGProxy *proxy, char *name, GError *error, SessionAsyncData *data) { if (data->callback) { (*(SyncevoSessionGetConfigNameCb)data->callback) (data->session, name, error, data->userdata); } session_async_data_free (data); } void syncevo_session_get_config_name (SyncevoSession *session, SyncevoSessionGetConfigNameCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_get_config_name_async (priv->proxy, (org_syncevolution_Session_get_config_name_reply) get_config_name_callback, data); } static void get_config_callback (DBusGProxy *proxy, SyncevoConfig *configuration, GError *error, SessionAsyncData *data) { if (data->callback) { (*(SyncevoSessionGetConfigCb)data->callback) (data->session, configuration, error, data->userdata); } session_async_data_free (data); } static gboolean get_config_error (SessionAsyncData *data) { GError *error; error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"), SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT, "The D-Bus object does not exist"); (*(SyncevoSessionGetConfigCb)data->callback) (data->session, NULL, error, data->userdata); session_async_data_free (data); return FALSE; } void syncevo_session_get_config (SyncevoSession *session, gboolean template, SyncevoSessionGetConfigCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)get_config_error, data); } return; } org_syncevolution_Session_get_config_async (priv->proxy, template, (org_syncevolution_Session_get_config_reply) get_config_callback, data); } void syncevo_session_set_config (SyncevoSession *session, gboolean update, gboolean temporary, SyncevoConfig *config, SyncevoSessionGenericCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_set_config_async (priv->proxy, update, temporary, config, (org_syncevolution_Session_set_config_reply) generic_callback, data); } static void get_reports_callback (DBusGProxy *proxy, SyncevoReports *reports, GError *error, SessionAsyncData *data) { if (data->callback) { (*(SyncevoSessionGetReportsCb)data->callback) (data->session, reports, error, data->userdata); } session_async_data_free (data); } static gboolean get_reports_error (SessionAsyncData *data) { GError *error; error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"), SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT, "The D-Bus object does not exist"); (*(SyncevoSessionGetReportsCb)data->callback) (data->session, NULL, error, data->userdata); session_async_data_free (data); return FALSE; } void syncevo_session_get_reports (SyncevoSession *session, guint start, guint count, SyncevoSessionGetReportsCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)get_reports_error, data); } return; } org_syncevolution_Session_get_reports_async (priv->proxy, start, count, (org_syncevolution_Session_get_reports_reply)get_reports_callback, data); } void syncevo_session_sync (SyncevoSession *session, SyncevoSyncMode mode, SyncevoSourceModes *source_modes, SyncevoSessionGenericCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_sync_async (priv->proxy, syncevo_sync_mode_to_string (mode), source_modes, (org_syncevolution_Session_sync_reply) generic_callback, data); } void syncevo_session_abort (SyncevoSession *session, SyncevoSessionGenericCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_abort_async (priv->proxy, (org_syncevolution_Session_abort_reply) generic_callback, data); } void syncevo_session_suspend (SyncevoSession *session, SyncevoSessionGenericCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_suspend_async (priv->proxy, (org_syncevolution_Session_suspend_reply) generic_callback, data); } static void get_status_callback (DBusGProxy *proxy, char *status, guint error_code, SyncevoSourceStatuses *sources, GError *error, SessionAsyncData *data) { if (data->callback) { (*(SyncevoSessionGetStatusCb)data->callback) (data->session, syncevo_session_status_from_string (status), error_code, sources, error, data->userdata); } session_async_data_free (data); } static gboolean get_status_error (SessionAsyncData *data) { GError *error; error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"), SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT, "The D-Bus object does not exist"); (*(SyncevoSessionGetStatusCb)data->callback) (data->session, SYNCEVO_STATUS_UNKNOWN, 0, NULL, error, data->userdata); session_async_data_free (data); return FALSE; } void syncevo_session_get_status (SyncevoSession *session, SyncevoSessionGetStatusCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)get_status_error, data); } return; } org_syncevolution_Session_get_status_async (priv->proxy, (org_syncevolution_Session_get_status_reply) get_status_callback, data); } static void get_progress_callback (DBusGProxy *proxy, int progress, SyncevoSourceProgresses *source_progresses, GError *error, SessionAsyncData *data) { if (data->callback) { (*(SyncevoSessionGetProgressCb)data->callback) (data->session, progress, source_progresses, error, data->userdata); } session_async_data_free (data); } static gboolean get_progress_error (SessionAsyncData *data) { GError *error; error = g_error_new_literal (g_quark_from_static_string ("syncevo-session"), SYNCEVO_SESSION_ERROR_NO_DBUS_OBJECT, "The D-Bus object does not exist"); (*(SyncevoSessionGetProgressCb)data->callback) (data->session, -1, NULL, error, data->userdata); session_async_data_free (data); return FALSE; } void syncevo_session_get_progress (SyncevoSession *session, SyncevoSessionGetProgressCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)get_progress_error, data); } return; } org_syncevolution_Session_get_progress_async (priv->proxy, (org_syncevolution_Session_get_progress_reply) get_progress_callback, data); } void syncevo_session_check_source (SyncevoSession *session, const char *source, SyncevoSessionGenericCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_check_source_async (priv->proxy, source, (org_syncevolution_Session_check_source_reply) generic_callback, data); } void syncevo_session_restore (SyncevoSession *session, const char *backup_dir, const gboolean before, const char **sources, SyncevoSessionGenericCb callback, gpointer userdata) { SessionAsyncData *data; SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); data = session_async_data_new (session, G_CALLBACK (callback), userdata); if (!priv->proxy) { if (callback) { g_idle_add ((GSourceFunc)generic_error, data); } return; } org_syncevolution_Session_restore_async (priv->proxy, backup_dir, before, sources, (org_syncevolution_Session_check_source_reply) generic_callback, data); } const char* syncevo_session_get_path (SyncevoSession *session) { SyncevoSessionPrivate *priv; priv = GET_PRIVATE (session); return priv->path; } SyncevoSession* syncevo_session_new (const char *path) { return g_object_new (SYNCEVO_TYPE_SESSION, "session-path", path, NULL); } syncevolution-1.5/src/dbus/glib/test.c0000664000373300001540000002175112363672170021321 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /* test syncevo dbus client wrappers */ #include "syncevo-server.h" #include gboolean stop = FALSE; GMainLoop *loop; /* // This is the old progress callback, here for future reference... static void progress_cb (SyncevoService *service, char *server, char *source, int type, int extra1, int extra2, int extra3, GMainLoop *loop) { char *mode, *speed; int percent; switch(type) { case -1: g_print ("Finished syncing %s with return value %d\n", server, extra1); g_main_loop_quit (loop); break; case PEV_SESSIONSTART: g_debug (" progress: %s: session start", server); break; case PEV_SESSIONEND: g_debug (" progress: %s: session end", server); break; case PEV_SENDSTART: g_debug (" progress: %s: send start", server); break; case PEV_SENDEND: g_debug (" progress: %s: send end", server); break; case PEV_RECVSTART: g_debug (" progress: %s: receive start", server); break; case PEV_RECVEND: g_debug (" progress: %s: receive end", server); break; case PEV_ALERTED: switch (extra1) { case 0: speed = ""; break; case 1: speed = "slow "; break; case 2: speed = "first time slow "; break; default: g_assert_not_reached(); } switch (extra3) { case 0: mode = "two-way"; break; case 1: mode = "from server"; break; case 2: mode = "from client"; break; default: g_assert_not_reached(); } g_debug (" source progress: %s/%s: alert (%s%s)", server, source, speed, mode); break; case PEV_PREPARING: percent = CLAMP (100 * extra1 / extra2, 0, 100); g_debug (" source progress: %s/%s: preparing (%d%%)", server, source, percent); break; case PEV_ITEMSENT: percent = CLAMP (100 * extra1 / extra2, 0, 100); g_debug (" source progress: %s/%s: item sent (%d%%)", server, source, percent); break; case PEV_ITEMRECEIVED: percent = CLAMP (100 * extra1 / extra2, 0, 100); g_debug (" source progress: %s/%s: item received (%d%%)", server, source, percent); break; case PEV_ITEMPROCESSED: g_debug (" source progress: %s/%s: item processed (added %d, updated %d, deleted %d)", server, source, extra1, extra2, extra3); break; case PEV_SYNCSTART: g_debug (" source progress: %s/%s: sync started", server, source); break; case PEV_SYNCEND: switch (extra1) { case 0: g_debug (" source progress: %s/%s: sync finished", server, source); break; case LOCERR_USERABORT: g_debug (" source progress: %s/%s: sync aborted by user", server, source); break; case LOCERR_USERSUSPEND: g_debug (" source progress: %s/%s: sync suspended by user", server, source); break; default: g_debug (" source progress: %s/%s: sync finished with error %d", server, source, extra1); } break; default: if(source) g_debug (" source progress: %s/%s: unknown type (%d)", server, source, type); else g_debug (" progress: %s: unknown type (%d)", server, type); g_debug (" %d, %d, %d", extra1, extra2, extra3); } } */ static void get_template_configs_cb(SyncevoServer *server, char **config_names, GError *error, gpointer userdata) { char **name; if (error) { g_printerr ("GetConfigs error: %s", error->message); g_error_free (error); return; } g_print ("GetConfigs (template=TRUE):\n"); for (name = config_names; name && *name; name++) { g_print ("\t%s\n", *name); } g_print ("\n"); } static void print_config_value (char *key, char *value, gpointer data) { g_print ("\t\t%s = %s\n", key, value); } static void print_config (char *key, GHashTable *sourceconfig, gpointer data) { g_print ("\tsource = %s\n", key); g_hash_table_foreach (sourceconfig, (GHFunc)print_config_value, NULL); } static void get_config_cb (SyncevoSession *session, SyncevoConfig *config, GError *error, gpointer userdata) { if (error) { g_printerr ("GetConfig error: %s\n", error->message); g_error_free (error); return; } g_print ("Session configuration:\n"); g_hash_table_foreach (config, (GHFunc)print_config, NULL); } static void progress_cb (SyncevoSession *session, int progress, SyncevoSourceProgresses *source_progresses) { g_print ("\tprogress = %d\n", progress); } static void status_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, gpointer *data) { if (status == SYNCEVO_STATUS_DONE) { g_print ("Session done."); g_object_unref (session); g_main_loop_quit (loop); } } static void start_session_cb (SyncevoServer *server, char *path, GError *error, gpointer userdata) { GHashTable *source_modes; SyncevoSession *session; if (error) { g_printerr ("StartSession error: %s\n", error->message); g_error_free (error); return; } g_print ("\nTesting Session...\n\n"); session = syncevo_session_new (path); syncevo_session_get_config (session, FALSE, (SyncevoSessionGetConfigCb)get_config_cb, NULL); g_signal_connect (session, "progress-changed", G_CALLBACK (progress_cb), NULL); g_signal_connect (session, "status-changed", G_CALLBACK (status_cb), NULL); /* TODO should wait for session status == idle */ source_modes = g_hash_table_new (g_str_hash, g_str_equal); syncevo_session_sync (session, SYNCEVO_SYNC_DEFAULT, source_modes, NULL, NULL); g_hash_table_unref (source_modes); } static void get_configs_cb(SyncevoServer *server, char **config_names, GError *error, char *service_name) { char **name; if (error) { g_printerr ("GetConfigs error: %s\n", error->message); g_error_free (error); return; } g_print ("GetConfigs (template=FALSE):\n"); for (name = config_names; name && *name; name++){ g_print ("\t%s\n", *name); } g_print ("\n"); if (stop) { g_print ("No server given, stopping here.\n"); g_main_loop_quit (loop); } } static void session_changed_cb (SyncevoServer *server, char *path, gboolean active, gpointer data) { g_print ("Session %s is now %s\n", path, active ? "active" : "not active"); } int main (int argc, char *argv[]) { SyncevoServer *server; char *service = NULL; #if !GLIB_CHECK_VERSION(2,36,0) g_type_init(); #endif g_print ("Testing Server...\n"); server = syncevo_server_get_default (); syncevo_server_get_configs (server, TRUE, (SyncevoServerGetConfigsCb)get_template_configs_cb, NULL); syncevo_server_get_configs (server, FALSE, (SyncevoServerGetConfigsCb)get_configs_cb, NULL); g_signal_connect (server, "session-changed", G_CALLBACK (session_changed_cb), NULL); if (argc < 2) { stop = TRUE; } service = argv[1]; if (service) syncevo_server_start_session (server, service, (SyncevoServerStartSessionCb)start_session_cb, NULL); loop = g_main_loop_new (NULL, TRUE); g_main_loop_run (loop); return 0; } syncevolution-1.5/src/dbus/interfaces/0000755000373300037200000000000012424707641021552 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/interfaces/spec-strip-docs.xsl0000644000373300001540000000215012326412403025127 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/dbus/interfaces/spec-to-docbook.xsl0000644000373300001540000004726512326412403025120 0ustar00nightlynightly00000000000000 interface Methods Signals Implemented Interfaces Objects implementing also implements org.freedesktop.DBus.Introspectable, org.freedesktop.DBus.Properties Properties Description Details Signal Details Property Details : <anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>:<xsl:value-of select="@name"/></xsl:attribute></anchor>The "<xsl:value-of select="@name"/>" property '' : <anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>::<xsl:value-of select="@name"/></xsl:attribute></anchor>The <xsl:value-of select="@name"/> signal () : Since /> is deprecated since version and should not be used in newly-written code. Use : :: . instead. See also: : Errors : Permissions <anchor role="function"><xsl:attribute name="id"><xsl:value-of select="$basename"/>.<xsl:value-of select="@name"/></xsl:attribute></anchor><xsl:value-of select="@name"/> () () :'' ::() .() '' , '' , '' syncevolution-1.5/src/dbus/interfaces/syncevo-connection-full.xml0000644000373300001540000001143112326412403026667 0ustar00nightlynightly00000000000000 The SyncEvolution connection object can be used to exchange messages. Pass data to SyncEvolution. The response is returned via the Reply-signal, so subscribe to that first. The data to be processed. Empty messages are invalid and will trigger an error. The MIME type of the message. "application/vnd.syncml.ds.notification", "application/vnd.syncml+xml" and "application/vnd.syncml+wbxml" are currently supported. Indicates that the connection object is no longer needed. TRUE if the connection is being closed after successfully delivering the final response. FALSE if an error is encountered that cannot be handled by the peer or its transport. SyncEvolution cannot rely on getting a close(FALSE) call in all cases. If its caller disappears from the bus it must assume that there was a fatal error and close the connection. A description which explains the error, may be empty. Used for debugging. The data to be returned to the peer. An empty reply is possible as response to the last message; it must not be delivered. Instead, final will be true and the connection needs to be closed. It is possible that a non-empty reply is sent without the final flag, immediately followed by an empty reply which has the flag set. As described above, the empty reply must be ignored and close() must be called once the non-empty reply is delivered. The MIME type of the reply. The same types as for the message are supported. Transport specific meta information. Currently defined: "URL" - the URL for an HTTP POST. True if this is the last reply. No further messages are expected and the session should be closed once the reply was delivered successfully. The first message in a new connection triggers the creation of a new, random session ID which is returned together with the response. The caller is responsible for ensuring that only messages belonging to this session are passed to future process() calls. In practice the session ID does not change after the first message, but this is not guaranteed and the caller should always use the most recent value. Sent when the server has to shut down the connection. All further operations on it will fail. Resuming the connection may or may not work in such a case. This signal is sent at most once for each connection. No reply will be sent on an aborted connection. syncevolution-1.5/src/dbus/interfaces/syncevo-server-full.xml0000644000373300001540000011134412326412403026042 0ustar00nightlynightly00000000000000 Server is the entry object for SyncEvolution client API. It can be used to query information and to start and monitor sessions. Sessions are required to modify the state of SyncEvolution and to synchronize data. They are implemented by additional objects, which exist as long as they are needed (= have clients) or are executing (for example, running a sync session). A session must be active before it can be used. If there are multiple conflicting session requests, they will be queued and started one after the other. At the moment, SyncEvolution will only run one session at a time, although the API would allow concurrent sessions. To be notified when a session is ready for use, subscribe to the SessionChanged signal before asking for a session. It may fire before the request to create a session returns. Either handle that or use Session.GetStatus() to check whether the session is still "queueing". Method calls may fail with the following errors: org.syncevolution.Exceptioncatch-all error condition. org.syncevolution.NoSuchConfigserver configuration name is invalid org.syncevolution.NoSuchSourcesource name is invalid org.syncevolution.SourceUnusableCheckSource() may return this if source is not usable (for various possible reasons). org.syncevolution.InvalidCalla call is (perhaps no longer) allowed or suitable in the current situation, like Detach() when the client is not attached. Describes which features are implemented by the server. If the method itself is unavailable, then the features correspond to SyncEvolution 1.0. The following capabilities are currently defined: ConfigChanged Server.ConfigChange signal available; if not, reread config after each session GetConfigName Session.GetConfigName() implemented SessionAttach Session.Attach() implemented Notifications Server.DisableNotifications() and Server.EnableNotifications() implemented Version Server.GetVersion() implemented; note that this is not meant to be used to determine supported features SessionFlags Server.StartSessionWithFlags() and Session.GetFlags() are implemented DatabaseProperties uses "database", "databaseUser", "databasePassword" source properties instead of the older names "evolutionsource", "evolutionuser", "evolutionpassword"; semantic is unchanged NamedConfig Session.Get/SetNamedConfig() are implemented set of supported capabilities Returns information about server side implementations. "version" - main SyncEvolution release name (usually a number, sometimes also a beta or alpha suffix), "system" - some plain text information about system libraries, "backends" - available backend libraries With no client attached, the server will shut down after a certain period of inactivity. Attaching to the server prevents that. Attaching is not necessary to invoke methods. The main purpose is to keep the server running while clients are around and listen for signals, in particular the Presence signal. Each attach has to be matched by one detach, so that one client has the capability to attach to the server many times in different modules. The behavior of calling Detach() more often than Attach() is undefined. Detaches an attached client. A client which disconnects from D-Bus is automatically detached from the server. Prevents showing of user visible notifications by the syncevo-dbus-server. Must be called while the client is attached to the server. Notifications will be disabled until the client detaches or calls EnableNotifications(). The calls cannot be nested, so calling DisableNotifications()/DisableNoticiations()/EnableNotifications() will enable notifications. describes the notifications which are to be disabled; currently ignored by server, pass empty string Allows showing of user visible notifications again. describes the notifications which are to be enabled; currently ignored by server, pass empty string Launches sync-ui as a reaction of the user activating a notification. Get an array of all configured servers (or templates) In getting templates mode, the dbus server checks all paired devices from bluez daemon and filters them by SyncML capability. Then it looks through built-in templates and returns their matched templates. Multiple templates might be created for each device, with different matching scores(range: 1-5). Scores represent how well the device name matches a template. The higher, the better. A template might be used to help creation for multiple devices. Thus template names must be reset in a naming rule. They are re-named with 'Bluetooth_< mac address>_<sequence number>'. Here 'mac address' is the mac address of the Bluetooth device and 'sequence number' enumerates all the matched templates created for the device. When retrieving the templates with GetConfig(), several additional properties will be returned which can be used to pick the right template for a device, see GetConfig(). The 'syncURL' is already replaced with the mac address of the device and thus can be used to find all templates refering to the same device. if TRUE, will return template names, otherwise will return configured servers array of configured server (or template) names Get the configuration of a specific server (or template). The dictionary keys are "source/<source name>" for sources and the empty string for the main server configuration. More keys might be added in the future. The values are "configuration dictionaries" which contain keys and values matching those in the SyncEvolution server configuration files. In addition, some special keys for read-only values are added. These entries may be set when reading a config or template and can be sent when writing it, but will not actually be stored. configName Normalized configuration. For example, if a session is opened for "FooBar" and there is an existing configuration "foobar@some-context", then the latter is used for the session instead of the "FooBar" shorthand. All configuration names sent by syncevo-dbus-server are normalized. D-Bus clients should compare that against the "configName" value instead of the config name chosen by them or the user. description device template: the description for the template (non-localized string) score device template: the calculated score based on the device name and template (1-5, 5 is best) deviceName device template: the device name that the template is for (copied verbatim from that device, typically chosen by the user of the device) templateName device template: string identifying the class of devices the templates works for, like "Nokia S40"; meant to be shown to users; optional, fall back to first entry in fingerPrint if not set hardwareName device template: "vendor[ model]" string extracted from a device database, unset if neither vendor nor model are known. The deviceName above is probably a better way to present the device to the user, because if a user has multiple identical devices, he hopefully chose unique names for them. fingerPrint device template: comma separated list of devices which work with this template, typically in "vendor model" format; can be used by D-Bus clients to re-match with user provided device information Properties which are not set are also not present in the configuration dictionaries. The semantic difference between "not set" and "empty" or "set to default" is that unset values will always use the default value, even after that changed during a software update. Properties that are set always use the chosen value. Note that property keys are case insensitive. The D-Bus interface specification would allow to send two properties whose keys only differ in case to the server. The result is undefined. server name if TRUE, will return a matching template configuration, otherwise will return a matching server configuration server (or template) configuration Checks whether a sync with a particular server can start. server name See Presence signal for details. All currently available transports. See Presence signal for details. Get synchronization reports for a specific server server name index of the first (newest) report that will be returned; reports are number starting with zero for the newest maximum number of returned reports synchronization reports The array contains report dictionaries. The dictionary keys can be defined by below BNFs: Key ::= 'dir' | 'peer' | 'start' | 'end' | 'status' | 'error' | SourceKey SourceKey ::= SourcePrefix SourcePart SourcePrefix ::= 'source' Sep SourceName SourceName ::= character+ SourcePart ::= Sep ('mode' | 'first' | 'resume' | 'status' | 'backup-before' | 'backup-after' | StatPart) StatPart ::= 'stat' Sep LocName Sep StateName Sep ResultName LocName ::= 'local' | 'remote' StateName ::= 'added' | 'updated' | 'removed' | 'any' ResultName ::= 'total' | 'reject' | 'match' | 'conflict_server_won' | 'conflict_client_won' | 'conflict_duplicated' | 'sent' | 'received' Sep ::= '-' If SourceName has characters '_' and '-', they will be escaped with '__' and '_+' respectively. This means that a key can be split at '-' before replacing these escape sequences in the source name. For a key which contains StatPart, if its value is 0, its pair-value won't be included in the dictionary. Get list of available databases that can be synchronized by a source backend. server name name of the source configuration which defines the backend ("type" property) information about all available databases each entry contains in this order: an optional name that can be shown to the user (already localized or chosen by the user, empty if unavailable), a unique value for the "database" (previously, "evolutionSource") property, a boolean which is true at most once for the default source Tests whether the source configuration is correct. Raises the SourceUnusable exception if not. server name name of the source configuration which is to be tested Start a session. The object is created instantly but will not be ready for method calls until status changes from "queueing" to "idle". The Detach() method can be called before that. Same as StartSessionWithFlags() without any flags set. name of configuration to be created or used in session session D-Bus object path Start a session. The object is created instantly but will not be ready for method calls until status changes from "queueing" to "idle". The Detach() method can be called before that. Additional flags, identified by strings, can be passed to control the session creation. They can be retrieved with Session.GetFlags(). The following flags are currently defined: no-sync session will not be used for running a synchronization all-configs session will provide read/write access to all configurations, via Get/SetNamedConfig() name of configuration to be created or used in session; typically this will be empty when used in combination with 'all-configs' and Get/SetNamedConfig() optional flags session D-Bus object path Establishes a connection between SyncEvolution and a peer (SyncML client or server). That peer might contact SyncEvolution via D-Bus directly (local sync) or via a SyncEvolution server stub that acts as gateway between a peer that is connected to the stub via some other transport mechanism (remote sync). For SyncEvolution this difference is almost completely transparent. In contrast to connections established by SyncEvolution itself, the peer has to send the first message and SyncEvolution replies. If the first message is a normal SyncML message, then SyncEvolution acts as SyncML server. Alternatively, a Notification message can be sent to request that SyncEvolution initiates a SyncML session as client. In the later case, SyncEvolution may or may not use the connection established by Connect(), depending on the content of that first message. The result of Connect() is an object that implements the org.syncevolution.Connection interface. It has to be used for sending at least one message to start the sync. If SyncEvolution needs to abort the connection, it will issue the Close-signal and remove the object. A peer needs to subscribe to that signal before starting to wait for a reply. In addition, the client should also watch out for SyncEvolution quitting unexpectedly. SyncEvolution supports re-establishing a connection that was interrupted. This only works when the peer is a SyncML client, supports resending messages, and the non-D-Bus message transport supports sending the session number as part of the meta information. Various information about the peer who initiated the connection. All of it is optional unless explicitly specified otherwise. Short, single line strings are preferred. "description" - a description of the peer in a format and language that is understood by the user. "id" - a unique ID for this particular peer, in a format that is specific to the transport. The ID only has to be unique among peers using that transport at the current point in time. "transport" - a string identifying the entity which talks directly to SyncEvolution (peer or transport stub). If available, this should be a D-Bus interface name, like "org.openobex.obexd". The main purpose right now is for informing the user and debugging. Later it might also be used to call methods in that interface or for choosing a local configuration for the peer based on its ID. "transport_description" - could be used to describe the version of the transport entity. If false, then the peer is trusted and shall be given access to SyncEvolution without further checks by SyncEvolution itself. This is useful for peers which already run as local user processes with same access rights to the data as SyncEvolution or for transports that authenticate and authorize access via their own mechanisms. If true, then a SyncML client peer must provide valid credentials as part of the SyncML session. For a server, a valid configuration must exist. SyncEvolution searches for such a configuration by matching the sync URL in the Notification with sync URLs in the configurations. If this is a reconnect for an older session, then pass the session ID here. Otherwise pass an empty string. New session IDs are created in response to the initial message, see Reply signal. The connection object created by SyncEvolution in response to this connection request. Implements the org.syncevolution.Connection interface. Get currently existing sessions. This includes active and queueing sessions. array of session D-Bus object paths, in the order in which they will run, running ones first Session start or end session D-Bus object path TRUE if session was started and is active now (= ready for use), FALSE if it ended Template added or removed, for example because a Bluetooth peer was paired resp. removed. To find out more, request list of templates anew. Configuration added, updated or removed. To find out more, request list of configurations anew. Indicates whether a server can be reached right now. This signal can be used by GUIs to prevent starting a sync when it is known to fail, for example because the network is currently down. At the moment, the SyncEvolution server can only monitor network connectivity, which is a cheap local operation and thus done unconditionally while the server runs (see Attach()). Detecting the presence of non-HTTP-based peers might be more costly. Additional APIs might be added to turn that on only when needed. The CheckPresence() method will always force a check. name of the server configuration "no transport" - the transport necessary to reach the server is not working. "not present" - the server is known to be down or unreachable. "" - the server might be usable. Syncs can still fail. Other non-empty strings might be added in the future. They always indicate a condition which prevents syncing. If the server can be reached via multiple transports, this is the one which triggered the signal. Content of the string to be decided... Emitted whenever the server needs information that only a client can provide. Because the server does not know whether clients are monitoring it (attaching to the server is optional) and/or which of the attached clients are able to handle the request, it broadcasts the request. Clients react by calling InfoResponse. The flow of events is this: information needed InfoRequest("request") InfoResponse("working") + dialog is opened (if necessary) InfoRequest("waiting") information becomes available InfoResponse("response") InfoRequest("done") Clients should work on those requests that they support, unless another client was faster (InfoRequest("waiting")). Because there is a race condition, multiple dialogs might be opened. The user only has to enter data in one of them. A client can close his dialog upon InfoRequest("done") and/or InfoRequest("waiting") with a 'handler' parameter which is some other client. If the server does not get a InfoResponse("working") soon enough (in the range of minutes, not seconds), it has to assume that no client can provide the information and fall back to some default or abort. For "type = password" the following keys are used as part of the "parameters" string hash: "name" name of the password property in the config "description" unique English description of the required password. Content is determined by the individual password property, so this may change. Currently used are "SyncML Server", "proxy", "'source name' backend" (with 'source name' replaced by the same names also used for the corresponding config entry). "user", "server", "domain", "object", "protocol", "authtype", "port" optional keys as they would be used in the GNOME keyring. unique ID for the request the Session which is affected, may be empty "request" for a new request, "waiting" for one which is being serviced by some client, "done" for a request which was resolved or timed out for state="waiting": the client which first replied with InfoResponse("working") Determines which information is needed. Currently only "password" for interactive password requests is defined. Auxiliary parameters which depend on the type. reply for a specific InfoRequest unique ID sent by InfoRequest "working" to indicate that a response will be sent later, "response" for the actual reply Response values, valid in state="response", depend on type. For "password" the following keys are used: "password" - the password text, optional, do not set the key if the user cancelled the request Broadcast the console part of the output D-Bus object path. If the output belongs to a session, then path is set as session's object path. Else, it's set as dbus server's object path. the output level (DEBUG/INFO/SHOW/ERROR/WARNING/DEVELOPER) the output string to be broadcast A short tag identifying which process produced the output. Should be shown to the user. Empty for main process in a sync. syncevolution-1.5/src/dbus/interfaces/syncevo-session-full.xml0000644000373300001540000004610112326412403026215 0ustar00nightlynightly00000000000000 A Session object is used to do do syncs and to modify the server configurations. Clients can create a Session with Server.StartSession(), attach to a session started by some other client with Session.Attach(), and detach from it with Session.Detach(). Commands (other than Attach() and Detach()) cannot be used before the status changes to "idle" (see GetStatus() and StatusChanged). Get the session flags set with Server.StartSessionWithFlags(). session flags Get the configuration name of the session. Every session is associated with a specific configuration, as requested by the creator of the session. This call returns the normalized configuration name. Note that this may be different from the name used when creating the configuration, because that name is not required to be normalized. Therefore this method may be useful both for the creator of the session and other clients which cannot know the configuration name without calling this method. peer configuration name Get the configuration identified by the name given to StartSession() if TRUE, will return a matching template configuration, otherwise will return the stored configuration server configuration See Server.GetConfig() for dictionary description. Set the configuration of the server TRUE if existing configuration should be updated. FALSE if existing configuration should be cleared. "Cleared" in this context means that all existing properties are removed before setting those passed as argument. Configuration entries (the user-visible part as well as the related meta information, plus the containing directory if it is empty) which are not referenced by a key in the configuration are removed. Setting a completely empty configuration with "update=FALSE" can thus be used to remove the entire configuration. "Completely empty" means "no entries at all" ({} in Python notation). This is different from a config with no properties set ({"": {}} = sync properties reset to defaults, no sources; {"": {}, "source/addressbook": {}} = same, with address book reset to defaults). When a specific peer was selected via the configuration name, clearing and removing properties is done only for the peer-specific properties. When no specific peer was selected, setting an empty configuration with "update=FALSE" removes all source settings and all peers. This allows starting from scratch; setting a non-empty configuration with "update=FALSE" will replace the peer-independent source properties with those that are sent in the new configuration and remove the sources which are not listed, also in all peers. TRUE if configuration changes should only be used for the duration of the session. This is useful to run a single sync session with different settings, for example with an increased logging level. "update=FALSE" removes all previous temporary settings before adding the current ones. Temporary config changes modify the result of GetConfig(), but are ignored when making permanent changes in SetConfig(). server configuration See Server.GetConfig() for dictionary description. Get the configuration identified by the name given in the first argument; same as Server.GetConfig(), provided again in Session for the sake of completeness configuration name Same as SetConfig() except that the modified configuration is named explicitly configuration name; if exactly the same as in StartSession() or StartSessionWithFlags(), then SetNamedConfig() behaves exactly like SetConfig() and none of the constraints for SetNamedConfig() apply temporary changes of the configuration are currently only supported for the configuration chosen when creating the session Get synchronization reports for the server index of the first (newest) report that will be returned maximum number of returned reports synchronization reports See Server.GetReports() for array description. Get list of available databases that can be synchronized by a source backend. name of the source configuration which defines the backend ("type" property); a temporary config is allowed here information about all available databases each entry contains in this order: an optional name that can be shown to the user (already localized or chosen by the user, empty if unavailable), a unique value for the "database" (previously "evolutionSource") property, a boolean which is true at most once for the default source Tests whether the source configuration is correct. Raises the SourceUnusable exception if not. name of the source configuration which is to be tested; a temporary config is allowed here Start synchronization. The synchronization mode selection for sources works like this: Primarily, use mode from "sources" array. If the source was not found or its mode was empty, use the mode parameter. If mode parameter is empty, use the mode in configuration. Examples: sync all with mode from config: Sync (NULL, ()) refresh all from server: Sync ("refresh-from-server", ()) force slow sync for calendar, use mode from config for others: Sync (NULL, (("calendar", "slow"))) sync only calendar and addressbook, with mode from config: Sync ("none", (("calendar", NULL), ("addressbook", NULL))) Syncevolution will by default output a sync "diff" in the end of Sync(). Producing the diff can be expensive CPU-wise, so setting the configuration value "printChanges" to 0 before a Sync() is advised for clients who are not interested in the diff. synchronization mode Valid values are all synchronization modes used in syncevolution server configuration files and the empty string. synchronization source modes Source modes to override the 'mode' variable for specific sources. The dictionary key is source name, value is synchronization mode. Valid synchronization modes are all synchronization modes used in syncevolution server configuration files and the empty string. Abort synchronization. See Status-signal for results. Suspend synchronization. See Status-signal for results. Prevents destruction of the session until the client detaches or quits. Implemented with a counter, so each Attach() must be matched by a Detach() to free the session. Meant to be used by clients which want to follow the progress of a session started by the daemon or some other client. StartSession() automatically includes one Attach() call, so typically the client which created a session never calls Attach() and Detach() only once. Each Attach() or StartSession() must be matched by one Detach() call, otherwise the session will not be destructed. A client that quits without these calls will be detached automatically. Restores the data of the selected sources to the state from before or after the selected synchronization. The synchronization is selected via its session directory. Other directories can also be given as long as they contain database dumps in the format created by SyncEvolution. When "sources" are empty, it assumes to restore all available backup sources in the session. If a source is not found in the backup database, then an exception is thrown. Once this method is called, the session is not active anymore. Thus, to call other APIs, a new session is needed to create. the session directory restore to the data before or after the session sources list that be needed to restore Valid values are all available sources. Checks whether a sync with the current server can start. See org.syncevolution.Server Presence signal for details. Get session status. Individual source statuses are relevant and provided only when status is neither "queuing" nor "idle". Session status Valid values include strings starting with "queueing", "idle" (ready to execute commands), "running", "aborting", "suspending", "done" (a sync was executed, individual source statuses for that sync are available, session is now inactive and cannot execute new commands). The strings may contain additional specifiers separated by a semicolons: "running;waiting", "suspending;waiting". There may be several specifiers: "running;waiting;foo". Specifier "waiting" means that the dbus server is waiting for some external events, typically IO events(like network transports, etc). If "waiting" is absent, then we've done the waiting. Error code for current or last action (zero for no error). Synchronization source status dictionary Dictionary key is source name. The value structs contain synchronization mode, source status and error code. Valid values for status are the same as for status parameter above. "done" represents a synced source when the whole sync is not done yet. Get synchronization progress Rough estimate of current progress 0-100. Synchronization source progress dictionary Dictionary key is source name. The value structs contain phase (can be one of "", "preparing", "sending", "receiving"), prepare count, prepare total, send count, send total, receive count and receive total. -1 is used for unknown. Normally only the 'counts' increase but there are cases where the total will increase as well. Starts execution of the operation defined via the command line arguments. Like Sync(), it returns immediately even if the operation still runs. Session completion indicates that the operation is done. To determine whether that operation was successful, check the session status. Command line arguments Environment variables in clients Session status change. See GetStatus() for argument descriptions. Synchronization progress change. See GetProgress() for argument descriptions. syncevolution-1.5/src/dbus/interfaces/README0000644000373300001540000000055112326412403022243 0ustar00nightlynightly00000000000000The documentation of .xml files follows dbus-introspect-docs.dtd and uses spec-to-docbook.xsl from William Jon McCann to convert the documentation into DocBook and then HTML. See http://cgit.freedesktop.org/ConsoleKit/tree/doc/dbus for latest (?) copy of the script and http://cgit.freedesktop.org/ConsoleKit/tree/src for some examples. syncevolution-1.5/src/dbus/interfaces/interfaces.am0000644000373300001540000000405212326412403024025 0ustar00nightlynightly00000000000000src/dbus/interfaces/%.xml: src/dbus/interfaces/%-full.xml src/dbus/interfaces/.stamp $(AM_V_GEN)$(XSLT) -o $@ $(top_srcdir)/src/dbus/interfaces/spec-strip-docs.xsl $< if COND_DOC src/dbus/interfaces/%-doc.xml: src/dbus/interfaces/%-full.xml src/dbus/interfaces/.stamp $(AM_V_GEN)$(XSLT) -o $@ $(top_srcdir)/src/dbus/interfaces/spec-to-docbook.xsl $< src/dbus/interfaces/syncevo-dbus-api-doc.xml: src/dbus/interfaces/syncevo-server-doc.xml src/dbus/interfaces/syncevo-session-doc.xml src/dbus/interfaces/syncevo-connection-doc.xml $(AM_V_GEN)echo '' >$@ \ && echo 'SyncEvolution D-Bus API $(VERSION)' >>$@ \ && for xml in $+; \ do \ tail -n +2 $$xml >>$@; \ done; \ echo '' >>$@ src/dbus/interfaces/syncevo-dbus-api-doc.html: src/dbus/interfaces/syncevo-dbus-api-doc.xml build/xsl/html/docbook.xsl src/dbus/interfaces/.stamp $(AM_V_GEN)$(XSLT) -o $@ $(top_srcdir)/build/xsl/html/docbook.xsl $< # This serializes the creation of src/dbus/interfaces when using # out-of-tree builds. xsltproc does this as part of its -o # implementation, but that failed once when using parallel make (race # condition?). src/dbus/interfaces/.stamp: mkdir -p $(@D) touch $@ doc_DATA += src/dbus/interfaces/syncevo-dbus-api-doc.html endif if COND_DOC src_dbus_interfaces_built_sources = \ src/dbus/interfaces/syncevo-server-doc.xml \ src/dbus/interfaces/syncevo-connection-doc.xml \ src/dbus/interfaces/syncevo-session-doc.xml \ src/dbus/interfaces/syncevo-dbus-api-doc.xml \ src/dbus/interfaces/syncevo-dbus-api-doc.html else src_dbus_interfaces_built_sources = endif BUILT_SOURCES += $(src_dbus_interfaces_built_sources) CLEANFILES += \ $(src_dbus_interfaces_built_sources) \ src/dbus/interfaces/.stamp \ $(NONE) dist_noinst_DATA += \ src/dbus/interfaces/spec-strip-docs.xsl \ src/dbus/interfaces/spec-to-docbook.xsl \ src/dbus/interfaces/syncevo-connection-full.xml \ src/dbus/interfaces/syncevo-server-full.xml \ src/dbus/interfaces/syncevo-session-full.xml \ src/dbus/interfaces/README syncevolution-1.5/src/dbus/qt/0000755000373300037200000000000012424707641020053 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/qt/syncevolution-qt-dbus.pc.in0000644000373300001540000000040212326412403025106 0ustar00nightlynightly00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: syncevolution-qt-dbus Description: SyncEvolution Qt D-Bus bindings Version: @VERSION@ Cflags: -I${includedir} Requires: QtDBus Libs: -L${libdir} -lsyncevolution-qt-dbus syncevolution-1.5/src/dbus/qt/qt.am0000644000373300001540000000534012326412403020630 0ustar00nightlynightly00000000000000if ENABLE_QT_DBUS src_dbus_qt_libsyncevolution_qt_dbus_libraries = \ src/dbus/qt/libsyncevolution-qt-dbus.la lib_LTLIBRARIES += $(src_dbus_qt_libsyncevolution_qt_dbus_libraries) src_dbus_qt_libsyncevolution_qt_dbus_headers = src/dbus/qt/dbustypes.h src_dbus_qt_libsyncevolution_qt_dbus_includedir = $(includedir)/syncevolution-qt-dbus nodist_src_dbus_qt_libsyncevolution_qt_dbus_include_HEADERS = \ $(src_dbus_qt_libsyncevolution_qt_dbus_headers) \ $(built_headers) dist_src_dbus_qt_libsyncevolution_qt_dbus_la_SOURCES = \ $(src_dbus_qt_libsyncevolution_qt_dbus_headers) \ src/dbus/qt/dbustypes.cpp nodist_src_dbus_qt_libsyncevolution_qt_dbus_la_SOURCES = \ $(src_dbus_qt_built_sources) src_dbus_qt_cppflags = \ $(SYNCEVOLUTION_CFLAGS) \ -I$(top_srcdir)/test \ $(BACKEND_CPPFLAGS) built_headers = \ src/dbus/qt/syncevo-server-full.h \ src/dbus/qt/syncevo-session-full.h \ src/dbus/qt/syncevo-connection-full.h src_dbus_qt_built_sources = \ src/dbus/qt/syncevo-server-full.cpp \ src/dbus/qt/syncevo-session-full.cpp \ src/dbus/qt/syncevo-connection-full.cpp \ src/dbus/qt/syncevo-server-full.moc.cpp \ src/dbus/qt/syncevo-session-full.moc.cpp \ src/dbus/qt/syncevo-connection-full.moc.cpp \ $(built_headers) BUILT_SOURCES += $(src_dbus_qt_built_sources) MOSTLYCLEANFILES += $(src_dbus_qt_libsyncevolution_qt_dbus_libraries) MAINTAINERCLEANFILES += src/dbus/qt/Makefile.in CLEANFILES += $(src_dbus_qt_built_sources) \ src/dbus/qt/stamp-server \ src/dbus/qt/stamp-session \ src/dbus/qt/stamp-connection DISTCLEANFILES += src/dbus/qt/syncevolution-qt-dbus.pc dist_noinst_DATA += \ src/dbus/qt/syncevolution-qt-dbus.pc.in #pkgconfigdir is defined in $(top_srcdir)/setup-variables.am pkgconfig_DATA += src/dbus/qt/syncevolution-qt-dbus.pc src_dbus_qt_libsyncevolution_qt_dbus_la_LIBADD = $(QT_DBUS_LIBS) $(QT_LIBS) src_dbus_qt_libsyncevolution_qt_dbus_la_CPPFLAGS = $(src_dbus_qt_cppflags) $(QT_CPPFLAGS) # Allow Qt to set some compile flags, but not the ones normally set via configure. # In particular -W is not compatible with the SyncEvolution header files (we have # unused parameters in some inline functions). src_dbus_qt_libsyncevolution_qt_dbus_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(filter-out -O2 -g -W -Wall, $(QT_CXXFLAGS)) $(SYNCEVO_WFLAGS) src/dbus/qt/syncevo-%-full.cpp src/dbus/qt/syncevo-%-full.h: src/dbus/qt/stamp-% $(AM_V_GEN) @true # work around #ifndef SYNCEVO-SERVER-FULL_H_1305547804 bug src/dbus/qt/stamp-%: $(top_srcdir)/src/dbus/interfaces/syncevo-%-full.xml $(AM_V_at)@QDBUSXML_TO_CPP@ -p src/dbus/qt/syncevo-$*-full -i src/dbus/qt/dbustypes.h $< \ && perl -pi -e 's/SYNCEVO-(\w*)-FULL_H/SYNCEVO_$$1_FULL_H/' src/dbus/qt/syncevo-$*-full.* \ && echo 'timestamp' >$@ endif # ENABLE_QT_DBUS syncevolution-1.5/src/dbus/qt/dbustypes.h0000644000373300001540000000631212326412403022060 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef DBUSTYPES_H #define DBUSTYPES_H #include #include #include #include #include struct SyncDatabase { QString name; QString source; bool flag; }; Q_DECLARE_METATYPE ( SyncDatabase ) // Marshall the SyncDatabase data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const SyncDatabase &mystruct); // Retrieve the SyncDatabase data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, SyncDatabase &mystruct); struct SyncProgress { QString phase; int prepareCount; int prepareTotal; int sendCount; int sendTotal; int recieveCount; int recieveTotal; }; Q_DECLARE_METATYPE ( SyncProgress ) // Marshall the SyncProgress data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const SyncProgress &mystruct); // Retrieve the SyncProgress data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, SyncProgress &mystruct); struct SyncStatus { QString mode; QString status; unsigned int error; }; Q_DECLARE_METATYPE ( SyncStatus ) // Marshall the SyncStatus data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const SyncStatus &mystruct); // Retrieve the SyncStatus data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, SyncStatus &mystruct); typedef QMap QStringMap; typedef QMap QStringMultiMap; typedef QList< QStringMap > QArrayOfStringMap; typedef QList< SyncDatabase > QArrayOfDatabases; typedef QMap QSyncProgressMap; typedef QMap QSyncStatusMap; Q_DECLARE_METATYPE ( QStringMap ) Q_DECLARE_METATYPE ( QStringMultiMap ) Q_DECLARE_METATYPE ( QArrayOfStringMap ) Q_DECLARE_METATYPE ( QArrayOfDatabases ) Q_DECLARE_METATYPE ( QSyncProgressMap ) Q_DECLARE_METATYPE ( QSyncStatusMap ) inline void syncevolution_qt_dbus_register_types() { qDBusRegisterMetaType< SyncDatabase >(); qDBusRegisterMetaType< QStringMap >(); qDBusRegisterMetaType< QStringMultiMap >(); qDBusRegisterMetaType< QArrayOfStringMap >(); qDBusRegisterMetaType< QArrayOfDatabases >(); qDBusRegisterMetaType< SyncProgress >(); qDBusRegisterMetaType< QSyncProgressMap >(); qDBusRegisterMetaType< SyncStatus >(); qDBusRegisterMetaType< QSyncStatusMap >(); } #endif //MYTYPES_H syncevolution-1.5/src/dbus/qt/dbustypes.cpp0000644000373300001540000000501212326412403022407 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "dbustypes.h" // Marshall the SyncDatabase data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const SyncDatabase &d) { argument.beginStructure(); argument << d.name << d.source << d.flag; argument.endStructure(); return argument; } // Retrieve the SyncDatabase data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, SyncDatabase &d) { argument.beginStructure(); argument >> d.name >> d.source >> d.flag; argument.endStructure(); return argument; } // Marshall the SyncProgress data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const SyncProgress &p) { argument.beginStructure(); argument << p.prepareCount << p.prepareTotal << p.sendCount << p.sendTotal << p.recieveCount \ << p.recieveTotal; argument.endStructure(); return argument; } // Retrieve the SyncProgress data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, SyncProgress &p) { argument.beginStructure(); argument >> p.prepareCount >> p.prepareTotal >> p.sendCount >> p.sendTotal >> p.recieveCount \ >> p.recieveTotal; argument.endStructure(); return argument; } // Marshall the SyncStatus data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const SyncStatus &s) { argument.beginStructure(); argument << s.mode << s.status << s.error; argument.endStructure(); return argument; } // Retrieve the SyncStatus data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, SyncStatus &s) { argument.beginStructure(); argument >> s.mode >> s.status >> s.error; argument.endStructure(); return argument; } syncevolution-1.5/src/dbus/server/0000755000373300037200000000000012424707642020736 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/0000755000373300037200000000000012424707642021523 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/examples/0000755000373300037200000000000012424707642023341 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/examples/search.py0000775000373300001540000003461612424466461025022 0ustar00nightlynightly00000000000000#! /usr/bin/python -u # -*- coding: utf-8 -*- # vim: set fileencoding=utf-8 :# # # Copyright (C) 2012 Intel Corporation # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA # Changes sorting, active address books and/or searches. # Run with no arguments to see the current state. # # Examples: # search.py --order=last/first # search.py --order=first/last # search.py --active-address-book '' --active-address-book 'peer-foobar' # search.py --search "[]" # search.py --search "[('any-contains', 'Joe')]" # search.py --search "[('phone', '+49891234')]" # # Use perf to analyze startup and reading all data, using a populated # system address book: # search.py -a 'peer-aa_bb_cc_dd_ee_ff' \ # -o first/last \ # -s '[]' \ # --verbosity 1 \ # --read-all \ # --start-operation 'set -x; sudo perf record -a -o %(operation)s.perf & sleep 2 && pidof perf' \ # --end-operation 'set -x; sudo killall -INT perf && sleep 2' # sudo perf report -i search.perf # # When searching, the script will print the results as they come in. # To continue waiting for changes until interrupted via CTRL-C, use # --monitor. import dbus import dbus.service try: import gobject except ImportError: from gi.repository import GObject as gobject from dbus.mainloop.glib import DBusGMainLoop import functools import subprocess import sys import time import traceback import itertools from optparse import OptionParser VERBOSITY_INFO = 0 VERBOSITY_NOTIFICATIONS = 1 VERBOSITY_DATA_SUMMARY = 2 VERBOSITY_DATA_FULL = 3 VERBOSITY_DEBUG = 4 parser = OptionParser() parser.add_option("-a", "--active-address-book", dest="address_books", action="append", default=[], help="Set one active address book, repeat to activate more than one. " "Default is to leave the current set unchanged.", metavar="ADDRESS-BOOK-ID") parser.add_option("-s", "--search", dest="search", default=None, help="Search expression in Python syntax. " "Default is to not search at all.", metavar="SEARCH-EXPRESSION") parser.add_option("-m", "--monitor", default=False, action="store_true", help="Keep running after receiving initial set of search results.") parser.add_option("-o", "--order", dest="order", default=None, help="Set new global sort order. Default is to use the existing one.", metavar="ORDER-NAME") parser.add_option("-r", "--read-all", default=False, action="store_true", help="Read entire view content each time the view is stable. " "If false, then modified or added contacts are requested right away.") parser.add_option("--start-operation", default=None, help="A shell command which gets invoked when the script enters a new phase. " "%(operation) gets replaced by a single word which describes that phase. " "See checkpoint() calls in the source for details. " "For benchmarking it is recommended to combine this with --read-all. " "Example value: set -x; sudo perf record -a -o %(operation)s.perf & sleep 2 && pidof perf") parser.add_option("--end-operation", default=None, help="A shell command which gets invoked when the script exits a phase. " "Example value: set -x; sudo killall -INT perf && sleep 2") parser.add_option("--verbosity", default=VERBOSITY_DATA_FULL, type="int", help="Determine what is printed. " "0 = only minimal progress messages. " "1 = also summary of view notifications. " "2 = also a one-line entry per contact. " "3 = also a dump of the contact. " "4 = also debug output for the script itself. " ) (options, args) = parser.parse_args() DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() loop = gobject.MainLoop() # The example does all calls to D-Bus with a very long timeout. A # real app should instead either never time out (because all of the # calls can, in theory, take arbitrarily long to complete) or be # prepared to deal with timeouts. timeout = 100000 # Contact PIM Manager. manager = dbus.Interface(bus.get_object('org._01.pim.contacts', '/org/01/pim/contacts'), 'org._01.pim.contacts.Manager') # Simplify the output of values returned via D-Bus by replacing # types like dbus.Dictionary with a normal Python dictionary # and by sorting lists (the order of all list entries never matters # in the contact dictionary). dbus_type_mapping = { dbus.Array: list, dbus.Boolean: bool, dbus.Byte: int, dbus.Dictionary: dict, dbus.Double: float, dbus.Int16: int, dbus.Int32: int, dbus.Int64: long, dbus.ObjectPath: str, dbus.Signature: str, dbus.String: unicode, dbus.Struct: tuple, dbus.UInt16: int, dbus.UInt32: int, dbus.UInt64: long, dbus.UTF8String: unicode } def strip_dbus(instance): base = dbus_type_mapping.get(type(instance), None) if base == dict or isinstance(instance, dict): return dict([(strip_dbus(k), strip_dbus(v)) for k, v in instance.iteritems()]) if base == list or isinstance(instance, list): l = [strip_dbus(v) for v in instance] l.sort() return l if base == tuple or isinstance(instance, tuple): return tuple([strip_dbus(v) for v in instance]) if base == None: return instance if base == unicode: # try conversion to normal string try: return str(instance) except UnicodeEncodeError: pass return base(instance) begin = time.time() starttime = begin running = None def checkpoint(operation): global starttime, running if running: now = time.time() print "+%04.3fs %s stopping '%s', duration %fs" % (now - begin, time.ctime(now), running, now - starttime) if options.end_operation: subprocess.check_call(options.end_operation % {'operation': running}, shell=True) running = None if operation: if options.end_operation: subprocess.check_call(options.start_operation % {'operation': operation}, shell=True) now = time.time() print "+%04.3fs %s starting '%s'" % (now - begin, time.ctime(now), operation) starttime = now running = operation def nothrow(fn): '''Function decorator which dumps exceptions to stdout. Use for callbacks.''' @functools.wraps(fn) def wrapper(*a, **b): try: fn(*a, **b) except: print traceback.format_exc() return wrapper class ContactsView(dbus.service.Object): '''Implements ViewAgent. Logs changes to stdout and maintains+shows the current content.''' def __init__(self): '''Create ViewAgent with the chosen path.''' # A real app would have to ensure that the path is unique for the # process. This example only has one ViewAgent and thus can use # a fixed path. self.path = '/org/syncevolution/search' # Currently known contact data, size matches view. self.contacts = [] dbus.service.Object.__init__(self, dbus.SessionBus(), self.path) def getIDs(self, start, count): '''Return just the IDs for a range of contacts in the current view.''' return [isinstance(x, dict) and x['id'] or x for x in self.contacts[start:start + count]] def search(self, filter): '''Start a search.''' print 'searching: %s' % filter self.viewPath = manager.Search(filter, self.path, timeout=100000) # This example uses the ViewControl to read contact data. # It does not close the view explicitly when # terminating. Instead it relies on the PIM Manager to # detect that the client disconnects from D-Bus. # Alternatively a client can also remove only its ViewAgent, # which will be noticed by the PIM Manager the next time it # tries to send a change. self.view = dbus.Interface(bus.get_object(manager.bus_name, self.viewPath), 'org._01.pim.contacts.ViewControl') def read(self, ids): '''Read contact data which was modified or added.''' self.view.ReadContacts(ids, timeout=100000, reply_handler=lambda x: self.ContactsRead(ids, x), error_handler=lambda x: self.ReadFailed(ids, x)) def dump(self, start, count): '''Show content of view. Highlight the contacts in the given range.''' if options.verbosity < VERBOSITY_DATA_SUMMARY: return for index, contact in enumerate(self.contacts): if start == index: # empty line with marker where range starts print '=> ' print '%s %03d %s' % \ (start != None and index >= start and index < start + count and '*' or ' ', index, isinstance(contact, dict) and contact.get('full-name', '<>') or '<>') if options.verbosity >= VERBOSITY_DATA_FULL: print ' ', strip_dbus(contact) print @nothrow def ContactsRead(self, ids, contacts): if options.verbosity >= VERBOSITY_DATA_FULL: print 'got contact data %s => %s ' % (ids, strip_dbus(contacts)) min = len(contacts) max = -1 for index, contact in contacts: if index >= 0: self.contacts[index] = contact if min > index: min = index if max < index: max = index if max > 0: self.dump(min, max - min + 1) if options.read_all and not options.monitor: loop.quit() @nothrow def ReadFailed(self, ids, error): print 'request for contact data %s failed: %s' % \ (ids, error) @nothrow @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='oias', out_signature='') def ContactsModified(self, view, start, ids): if options.verbosity >= VERBOSITY_NOTIFICATIONS: print 'contacts modified: %s, start %d, count %d, ids %s' % \ (view, start, len(ids), options.verbosity >= VERBOSITY_DATA_SUMMARY and strip_dbus(ids) or '<...>') self.contacts[start:start + len(ids)] = ids self.dump(start, len(ids)) if not options.read_all: self.read(ids) @nothrow @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='oias', out_signature='') def ContactsAdded(self, view, start, ids): if options.verbosity >= VERBOSITY_NOTIFICATIONS: print 'contacts added: %s, start %d, count %d, ids %s' % \ (view, start, len(ids), options.verbosity >= VERBOSITY_DATA_SUMMARY and strip_dbus(ids) or '<...>') self.contacts[start:start] = ids self.dump(start, len(ids)) if not options.read_all: self.read(ids) @nothrow @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='oii', out_signature='') def ContactsRemoved(self, view, start, count): if options.verbosity >= VERBOSITY_NOTIFICATIONS: print 'contacts removed: %s, start %d, count %d, ids %s' % \ (view, start, len(ids), options.verbosity >= VERBOSITY_DATA_SUMMARY and strip_dbus(ids) or '<...>') # Remove obsolete entries. del self.contacts[start:start + len(ids)] self.dump(start, 0) @nothrow @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='o', out_signature='') def Quiescent(self, view): if options.verbosity >= VERBOSITY_NOTIFICATIONS: print 'view is stable' if options.read_all: # Avoid reading in parallel, if quiescence signal repeats. if running != 'read': checkpoint('read') self.read(self.getIDs(0, len(self.contacts))) elif not options.monitor: loop.quit() checkpoint('getallpeers') peers = strip_dbus(manager.GetAllPeers()) print 'peers: %s' % peers print 'available databases: %s' % ([''] + ['peer-' + uid for uid in peers.keys()]) checkpoint('getactiveaddressbooks') address_books = strip_dbus(manager.GetActiveAddressBooks()) if options.address_books: print 'active address books %s -> %s' % (address_books, options.address_books) checkpoint('setactiveaddressbooks') manager.SetActiveAddressBooks(options.address_books) else: print 'active address books: %s' % options.address_books checkpoint('getsortorder') order = strip_dbus(manager.GetSortOrder()) if options.order: print 'active sort order %s -> %s' % (order, options.order) checkpoint('setsortorder') manager.SetSortOrder(options.order) else: print 'active sort order: %s' % order if options.search != None: checkpoint('search') view = ContactsView() view.search(eval(options.search)) loop.run() else: print 'no search expression given, quitting' checkpoint(None) syncevolution-1.5/src/dbus/server/pim/examples/sync.py0000775000373300001540000002615612424466461024531 0ustar00nightlynightly00000000000000#! /usr/bin/python -u # -*- coding: utf-8 -*- # vim: set fileencoding=utf-8 :# # # Copyright (C) 2012 Intel Corporation # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA # Configure, sync and/or remove a PBAP-capable phone. # The peer UID is set to the Bluetooth MAC address. # # Examples: # sync.py --bt-mac A0:4E:04:1E:AD:30 --configure # sync.py --bt-mac A0:4E:04:1E:AD:30 --sync # sync.py --bt-mac A0:4E:04:1E:AD:30 --remove # sync.py --bt-mac A0:4E:04:1E:AD:30 --configure --sync --remove import dbus import dbus.service try: import gobject except ImportError: from gi.repository import GObject as gobject from dbus.mainloop.glib import DBusGMainLoop import functools import sys import traceback import itertools import json import time from optparse import OptionParser # Needed for --poll-progress. glib = None try: import glib except ImportError: try: from gi.repository import GLib as glib except ImportError: pass parser = OptionParser() parser.add_option("", "--peer", default=None, help="Set the peer name. Derived from --bt-mac if unset.") parser.add_option("-b", "--bt-mac", dest="mac", default=None, help="Set the Bluetooth MAC address and thus UID of the phone peer.", metavar="aa:bb:cc:dd:ee:ff") parser.add_option("-d", "--debug", action="store_true", default=False, help="Print debug output coming from SyncEvolution server.") parser.add_option("-p", "--progress", action="store_true", default=False, help="Print progress information during a sync, triggered by PIM Manager signals.") parser.add_option("", "--poll-progress", action="store", type="float", default=None, help="Print progress information during a sync, pulled via polling at the given frequency.") parser.add_option("-m", "--mode", action="store", default='', help="Override default PBAP sync mode. One of 'all', 'text', 'incremental' (default).") parser.add_option("", "--sync-flags", action="store", default='{}', help="""Additionall SyncPeerWithFlags() flags in JSON notation. For example: '--sync-flags={ "pbap-chunk-transfer-time": 20, "pbap-chunk-time-lambda": 0.5, "pbap-chunk-max-count-photo": 100 }'""") parser.add_option("", "--peer-config", action="store", default='{}', help="""ConfigurePeer() properties in JSON notation. Not needed when --bt-mac is set, the default configuration then will be for PBAP with that phone. Can be used to sync via CardDAV: '--peer-config={"protocol": "CardDAV", "address": "google", "username": "goa:john.doe@gmail.com", "syncmode": "two-way"}'""") parser.add_option("-f", "--progress-frequency", action="store", type="float", default=0.0, help="Override default progress event frequency.") parser.add_option("-c", "--configure", action="store_true", default=False, help="Enable configuring the peer.") parser.add_option("-s", "--sync", action="store_true", default=False, help="Cache data of peer.") parser.add_option("-r", "--remove", action="store_true", default=False, help="Remove peer configuration and data.") (options, args) = parser.parse_args() if options.configure or options.sync or options.remove: peername = options.peer or options.mac if not peername: sys.exit('--peer or --bt-mac parameter must be given') # Use MAC address as UID of peer, but without colons # and all in lower case. See https://bugs.freedesktop.org/show_bug.cgi?id=56436 peername = peername.replace(':', '').lower() DBusGMainLoop(set_as_default=True) bus = dbus.SessionBus() loop = gobject.MainLoop() # Contact PIM Manager. manager = dbus.Interface(bus.get_object('org._01.pim.contacts', '/org/01/pim/contacts'), 'org._01.pim.contacts.Manager') # Capture and print debug output. def log_output(path, level, output, component): print '%s %s: %s' % (level, (component or 'sync'), output) # Format seconds as mm:ss[.mmm]. def format_seconds(seconds, with_milli): if with_milli: format = '%02d:%06.3f' else: format = '%02d:%02d' return format % (seconds / 60, seconds % 60) # Keep track of time when progress messages were received. last = time.time() start = last BAR_LENGTH = 20 def log_progress(uid, event, data): global last, start now = time.time() prefix = '%s/+%s:' % (format_seconds(now - start, False), format_seconds(now - last, True)) if event == 'progress': percent = data['percent'] del data['percent'] bar = int(percent * BAR_LENGTH) * '-' if len(bar) > 0 and len(bar) < BAR_LENGTH: bar = bar[0:-1] + '>' print prefix, '|%s%s| %.1f%% %s' % (bar, (BAR_LENGTH - len(bar)) * ' ', percent * 100, strip_dbus(data)) else: print prefix, '%s = %s' % (event, strip_dbus(data)) last = now if options.debug: bus.add_signal_receiver(log_output, "LogOutput", "org.syncevolution.Server", "org.syncevolution", None) if options.progress: bus.add_signal_receiver(log_progress, "SyncProgress", "org._01.pim.contacts.Manager", "org._01.pim.contacts", None) # Simplify the output of values returned via D-Bus by replacing # types like dbus.Dictionary with a normal Python dictionary # and by sorting lists (the order of all list entries never matters # in the contact dictionary). dbus_type_mapping = { dbus.Array: list, dbus.Boolean: bool, dbus.Byte: int, dbus.Dictionary: dict, dbus.Double: float, dbus.Int16: int, dbus.Int32: int, dbus.Int64: long, dbus.ObjectPath: str, dbus.Signature: str, dbus.String: unicode, dbus.Struct: tuple, dbus.UInt16: int, dbus.UInt32: int, dbus.UInt64: long, dbus.UTF8String: unicode } def strip_dbus(instance): base = dbus_type_mapping.get(type(instance), None) if base == dict or isinstance(instance, dict): return dict([(strip_dbus(k), strip_dbus(v)) for k, v in instance.iteritems()]) if base == list or isinstance(instance, list): l = [strip_dbus(v) for v in instance] l.sort() return l if base == tuple or isinstance(instance, tuple): return tuple([strip_dbus(v) for v in instance]) if base == None: return instance if base == unicode: # try conversion to normal string try: return str(instance) except UnicodeEncodeError: pass return base(instance) # Call all methods asynchronously, to avoid timeouts and # to capture debug output while the methods run. error = None result = None def failed(err): global error error = err loop.quit() def done(*args): global result loop.quit() if len(args) == 1: result = args[0] elif len(args) > 1: result = args def run(syncing=False): global result result = None if syncing: print 'Running a sync, press CTRL-C to control it interactively.' while result is None and error is None: try: loop.run() except KeyboardInterrupt: while True: print '[a]bort, [s]uspend, [r]esume, continue? ', response = sys.stdin.readline() try: if response == 'a\n': manager.StopSync(peername) break elif response == 's\n': manager.SuspendSync(peername) break elif response == 'r\n': manager.ResumeSync(peername) break elif response == '\n': break else: print 'Unknown response, try again.' except dbus.exceptions.DBusException, ex: print 'operation %s failed: %s' % (response, ex) else: loop.run() if error: print print error print return result async_args = { 'reply_handler': done, 'error_handler': failed, 'timeout': 100000, # very large, infinite doesn't seem to be supported by Python D-Bus bindings } manager.GetAllPeers(**async_args) peers = strip_dbus(run()) print 'peers: %s' % peers print 'available databases: %s' % ([''] + ['peer-' + uid for uid in peers.keys()]) if not error and options.configure: peer = json.loads(options.peer_config) if options.mac: if not 'protocol' in peer: peer['protocol'] = 'PBAP' if not 'address' in peer: peer['address'] = options.mac print 'adding peer config %s = %s' % (peername, peer) manager.SetPeer(peername, peer, **async_args) run() def pull_progress(): status = manager.GetPeerStatus(peername) print 'Poll status:', strip_dbus(status) return True if not error and options.sync: # Do it once before starting the sync. if options.poll_progress is not None: pull_progress() print 'syncing peer %s' % peername flags = json.loads(options.sync_flags) if options.progress_frequency != 0.0: flags['progress-frequency'] = options.progress_frequency if options.mode: flags['pbap-sync'] = options.mode if flags: manager.SyncPeerWithFlags(peername, flags, **async_args) else: manager.SyncPeer(peername, **async_args) # Start regular polling of status. timeout = None if options.poll_progress is not None: timeout = glib.Timeout(int(1 / options.poll_progress * 1000)) timeout.set_callback(pull_progress) timeout.attach(loop.get_context()) # Wait for completion of sync. run(syncing=True) # Stop polling, in case that we remove the peer. if timeout: timeout.destroy() if not error and options.remove: print 'removing peer %s' % peername manager.RemovePeer(peername, **async_args) run() if options.debug: print "waiting for further debug output, press CTRL-C to stop" loop.run() syncevolution-1.5/src/dbus/server/pim/test-dbus/0000755000373300037200000000000012424707640023433 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/db-active/0000755000373300037200000000000012424707640025271 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/db-active/config/0000755000373300037200000000000012424707640026536 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/db-active/config/syncevolution/0000755000373300037200000000000012424707642031461 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/db-active/config/syncevolution/pim-manager.ini0000644000373300001540000000017212326412403034166 0ustar00nightlynightly00000000000000sort = active = system-address-book pim-manager-testactive-testcontacts-a, pim-manager-testactive-testcontacts-c syncevolution-1.5/src/dbus/server/pim/test-dbus/first-last-sort/0000755000373300037200000000000012424707640026510 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/first-last-sort/config/0000755000373300037200000000000012424707640027755 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/first-last-sort/config/syncevolution/0000755000373300037200000000000012424707642032700 5ustar00nightlyallusers00000000000000pim-manager.ini0000644000373300001540000000002212326412403035320 0ustar00nightlynightly00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/first-last-sort/config/syncevolutionsort = first/last syncevolution-1.5/src/dbus/server/pim/test-dbus/simple-sort/0000755000373300037200000000000012424707640025711 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/simple-sort/config/0000755000373300037200000000000012424707640027156 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/simple-sort/config/syncevolution/0000755000373300037200000000000012424707642032101 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/dbus/server/pim/test-dbus/simple-sort/config/syncevolution/pim-manager.ini0000644000373300001540000000000712326412403034603 0ustar00nightlynightly00000000000000sort = syncevolution-1.5/src/dbus/server/pim/org._01.pim.contacts.service.in0000644000373300001540000000015312326412403027066 0ustar00nightlynightly00000000000000[D-BUS Service] Name=org._01.pim.contacts Exec=@libexecdir@/syncevo-dbus-server @SYNCEVO_DBUS_SERVER_ARGS@ syncevolution-1.5/src/dbus/server/pim/view.h0000644000373300001540000001042712326412403022461 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Base classes for reading data, in particular individuals. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PIM_VIEW #define INCL_SYNCEVO_DBUS_SERVER_PIM_VIEW #include "folks.h" #include SE_BEGIN_CXX /** * Accesses data once started. Derived classes report that data * differently. */ class View { Bool m_started; std::string m_name; public: typedef boost::signals2::signal QuiescenceSignal_t; /** * Triggered each time the view reaches a quiescence state, meaning * that its current content is stable, at least for now. */ QuiescenceSignal_t m_quiescenceSignal; /** * False when more changes are known to come. */ virtual bool isQuiescent() const = 0; /** * A name for the view, for debugging. */ const char *getName() const { return m_name.c_str(); } void setName(const std::string &name) { m_name = name; } /** * Start filling the view. Gives the user a chance to connect * to the signals first. May be called multiple times. */ void start(); /** * start() was called. */ bool isRunning() const; protected: /** * Start filling the view. Will only be called once by start(). */ virtual void doStart() = 0; }; /** * Reports individuals once as they come in, unsorted. */ class StreamingView : public View { public: typedef boost::signals2::signal AddedSignal_t; /** * A new FolksIndividual was added. */ AddedSignal_t m_addedSignal; }; /** * A view on a sorted list of individuals. Entries are numbered from * #0 to #n - 1, where n is the number of entries. Change * notifications are based upon those numbers and will be triggered * immediately. */ class IndividualView : public View { public: typedef boost::signals2::signal ChangeSignal_t; /** * A new FolksIndividual was added at a specific index. This * increased the index of all individuals it was inserted in front * off by one. */ ChangeSignal_t m_addedSignal; /** * A FolksIndividual was removed at a specific index. This * increased the index of all individuals after it by one. */ ChangeSignal_t m_removedSignal; /** * A FolksIndividual was modified at a specific index, without * affecting its position in the view. If changing a FolksIndividual * affects its position, m_removedSignal followed by m_addedSignal * will be emitted. */ ChangeSignal_t m_modifiedSignal; /** * Replace filter with more specific one (refine = true) or redo * search without limitations. */ virtual void replaceFilter(const boost::shared_ptr &individualFilter, bool refine) { SE_THROW("adding a search not supported by this view"); } /** current number of entries */ virtual int size() const = 0; typedef std::vector< std::pair > Contacts; /** read a set of contacts - see org.01.pim.contacts.ViewControl.ReadContacts() */ virtual void readContacts(const std::vector &ids, Contacts &contacts); /** returns access to one individual or an empty pointer if outside of the current range */ virtual const IndividualData *getContact(int index) = 0; protected: void findContact(const std::string &id, int hint, int &index, FolksIndividualCXX &individual); }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_VIEW syncevolution-1.5/src/dbus/server/pim/full-view.h0000644000373300001540000001156412326412403023424 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVO_DBUS_SERVER_FULL_VIEW #define INCL_SYNCEVO_DBUS_SERVER_FULL_VIEW #include "view.h" #include SE_BEGIN_CXX /** * The view which takes input directly from IndividualAggregator * and maintains a sorted set of contacts as result. */ class FullView : public IndividualView { FolksIndividualAggregatorCXX m_folks; boost::shared_ptr m_locale; bool m_localeChanged; bool m_isQuiescent; boost::weak_ptr m_self; Timeout m_waitForIdle; std::set m_pendingModifications; Timeout m_quiescenceDelay; /** * Sorted vector. Sort order is maintained by this class. */ typedef boost::ptr_vector Entries_t; Entries_t m_entries; /** * The sort object to be used. */ boost::shared_ptr m_compare; FullView(const FolksIndividualAggregatorCXX &folks, const boost::shared_ptr &locale); void init(const boost::shared_ptr &self); /** * Run via m_waitForIdle if (and only if) something * changed. */ void onIdle(); /** * Ensure that onIdle() gets invoked. */ void waitForIdle(); /** * Adds the new individual to m_entries, transfers ownership * (data == NULL afterwards). */ void doAddIndividual(Entries_t::auto_type &data); public: /** * @param folks the aggregator to use */ static boost::shared_ptr create(const FolksIndividualAggregatorCXX &folks, const boost::shared_ptr &locale); /** * Change locale. Updating pre-computed data must be triggered by * calling setCompare() later. */ void setLocale(const boost::shared_ptr &locale); /** FolksIndividualAggregator "individuals-changed" slot */ void individualsChanged(GeeSet *added, GeeSet *removed, gchar *message, FolksPersona *actor, FolksGroupDetailsChangeReason reason = FOLKS_GROUP_DETAILS_CHANGE_REASON_NONE); /** GObject "notify" slot */ void individualModified(gpointer gobject, GParamSpec *pspec); /** * FolksIndividualAggregator "is-quiescent" property change slot. * * It turned out that "quiescence" is only set to true once in * FolksIndividualAggregator. The code which watches that signal * is still in place, but it will only get invoked once. * * Therefore the main mechanism for emitting m_quiescenceSignal in * FullView is an idle callback which gets invoked each time the * daemon has nothing to do, which implies that (at least for now) * libfolks has no pending work to do. */ void quiescenceChanged(); /** * Mirrors the FolksIndividualAggregator "is-quiesent" state: * false initially, then true for the rest of the run. */ virtual bool isQuiescent() const { return m_isQuiescent; } /** * Add a FolksIndividual. Starts monitoring it for changes. */ void addIndividual(FolksIndividual *individual); /** * Deal with FolksIndividual modification. */ void modifyIndividual(FolksIndividual *individual); /** * Remove a FolksIndividual. */ void removeIndividual(FolksIndividual *individual); /** * Set new sort method. Reorders current set of entries on the * fly. Default is lexicographical comparison of the single-string * full name. * * @param compare the new ordering or NULL for the builtin default (last/first with ASCII lexicographic comparison) */ void setCompare(const boost::shared_ptr &compare); // from IndividualView virtual void doStart(); virtual int size() const { return (int)m_entries.size(); } virtual const IndividualData *getContact(int index) { return (index >= 0 && (unsigned)index < m_entries.size()) ? &m_entries[index] : NULL; } }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_FULL_VIEW syncevolution-1.5/src/dbus/server/pim/filtered-view.h0000644000373300001540000000724112326412403024255 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PIM_FILTERED_VIEW #define INCL_SYNCEVO_DBUS_SERVER_PIM_FILTERED_VIEW #include "view.h" #include SE_BEGIN_CXX /** * A subset of some other view. Takes input from that view and thus * can rely on individuals being sorted by their index number in the * other view. */ class FilteredView : public IndividualView { boost::weak_ptr m_self; boost::shared_ptr m_parent; boost::shared_ptr m_filter; /** * Maps local indices to indices in parent view. Could be be * optimized to map entire ranges, but for the sake of simplicitly * let's use a 1:1 mapping for now. */ typedef std::vector Entries_t; Entries_t m_local2parent; FilteredView(const boost::shared_ptr &parent, const boost::shared_ptr &filter); void init(const boost::shared_ptr &self); bool isFull() const { return isFull(m_local2parent, m_filter); } static bool isFull(const Entries_t &local2parent, const boost::shared_ptr &filter); /** * Request filling up the filtered view once things are stable again. */ void fillView(); /** * internal helper for fillView(), do not call directly */ void fillViewCb(); Timeout m_fillViewOnIdle; void parentQuiescent(); public: /** * Creates an idle IndividualAggregator. Configure it and * subscribe to signals, then call start(). */ static boost::shared_ptr create(const boost::shared_ptr &parent, const boost::shared_ptr &filter); /** * Mirrors the quiesent state of the underlying view. */ virtual bool isQuiescent() const { return m_parent->isQuiescent(); } /** * Add a FolksIndividual if it matches the filter. Tracking of * changes to individuals is done in parent view. */ void addIndividual(int parentIndex, const IndividualData &data); /** * Removes a FolksIndividual. Might not have been added at all. */ void removeIndividual(int parentIndex, const IndividualData &data); /** * Check whether a changed individual still belongs into the view. */ void modifyIndividual(int parentIndex, const IndividualData &data); // from IndividualView virtual void doStart(); virtual void replaceFilter(const boost::shared_ptr &individualFilter, bool refine); virtual int size() const { return (int)m_local2parent.size(); } virtual const IndividualData *getContact(int index) { return (index >= 0 && (unsigned)index < m_local2parent.size()) ? m_parent->getContact(m_local2parent[index]) : NULL; } }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_FILTERED_VIEW syncevolution-1.5/src/dbus/server/pim/edsf-view.h0000644000373300001540000000446712326412403023407 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Search in an EBook once. Uses folks-eds (= EDSF) to turn EContacts * into FolksPersonas and from that into FolksIndividuals. Results * will be sorted after the search is complete, then they will be * advertised with the "added" signal. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PIM_EDSF_VIEW #define INCL_SYNCEVO_DBUS_SERVER_PIM_EDSF_VIEW #include "view.h" #include #include #include SE_GOBJECT_TYPE(EBookClient) SE_GOBJECT_TYPE(EdsfPersonaStore); #include SE_BEGIN_CXX class EDSFView : public StreamingView { boost::weak_ptr m_self; ESourceRegistryCXX m_registry; std::string m_uuid; std::string m_query; EBookClientCXX m_ebook; EdsfPersonaStoreCXX m_store; Bool m_isQuiescent; EDSFView(const ESourceRegistryCXX ®istry, const std::string &uuid, const std::string &query); void init(const boost::shared_ptr &self); void opened(gboolean success, const GError *gerror) throw(); void read(gboolean success, GSList *contactlist, const GError *gerror) throw(); public: static boost::shared_ptr create(const ESourceRegistryCXX ®istry, const std::string &uuid, const std::string &query); virtual bool isQuiescent() const { return m_isQuiescent; } protected: virtual void doStart(); }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_EDSF_VIEW syncevolution-1.5/src/dbus/server/pim/locale-factory.h0000644000373300001540000001277412326412403024422 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Abstract definition of sorting and searching plugin. Used * by folks.cpp, must be provided by exactly one implementation * which is chosen at compile time. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PIM_LOCALE_FACTORY #define INCL_SYNCEVO_DBUS_SERVER_PIM_LOCALE_FACTORY #include #include #include #include #include SE_BEGIN_CXX class IndividualCompare; class IndividualFilter; /** * Normalized phone numbers (E164). A subset of the full * i18n::phonenumbers::PhoneNumber data. */ class SimpleE164 { public: SimpleE164() : m_countryCode(0), m_nationalNumber(0) {} typedef int32_t CountryCode_t; typedef uint64_t NationalNumber_t; /** * Country code (for example, 49 for the +49 prefix of Germany), * 0 if unknown/unset. */ CountryCode_t m_countryCode; /** * Phone number after the country code as it would appear in E.164 * after the + prefix, again given as binary value, * 0 if unknown/unset. */ NationalNumber_t m_nationalNumber; /** * + if country code and national number are set, * + if only country code is set, * if only national number is set, * empty string if both are unset. */ std::string toString() const; bool operator == (const SimpleE164 &other) const { return m_countryCode == other.m_countryCode && m_nationalNumber == other.m_nationalNumber; } bool operator != (const SimpleE164 &other) const { return !(*this == other); } }; /** * Factory for everything related to the current locale: sorting and * searching. */ class LocaleFactory { public: /** * Exactly one factory can be created, chosen at compile time. */ static boost::shared_ptr createFactory(); /** * Creates a compare instance or throws an error when that is not * possible. * * @param order factory-specific string which chooses one of * the orderings supported by the factory * @return a valid instance, must not be NULL */ virtual boost::shared_ptr createCompare(const std::string &order) = 0; /** * A recursive definition of a search expression. * All operand names, field names and values are strings. */ typedef boost::make_recursive_variant< std::string, std::vector< boost::recursive_variant_ > >::type Filter_t; /** * Simplified JSON representation (= no escaping of special characters), * for debugging and error reporting. */ static std::string Filter2String(const Filter_t &filter); /** * Throws "expected , got instead: " when * conversion to V fails. */ static const std::string &getFilterString(const Filter_t &filter, const char *expected); static const std::vector &getFilterArray(const Filter_t &filter, const char *expected); /** * Creates a filter instance or throws an error when that is not * possible. * * @param represents a (sub-)filter * @level 0 at the root of the filter, incremented by one for each * non-trivial indirection; i.e., [ [ ] ] still * treats as if it was the root search * * @return a valid instance, must not be NULL */ virtual boost::shared_ptr createFilter(const Filter_t &filter, int level) = 0; /** * To be called when parsing a Filter_t caused an exception. * Will add information about the filter and a preamble, if * called at the top level. */ static void handleFilterException(const Filter_t &filter, int level, const std::string *file, int line); /** * Pre-computed data for a single FolksIndividual which will be needed * for searching. Strictly speaking, this should be an opaque pointer * whose content is entirely owned by the implementation of LocaleFactory. * For the sake of performance and simplicity, we define a struct instead * which can be embedded inside IndividualData. Leads to better memory * locality and reduces overall memory consumption/usage. */ struct Precomputed { typedef std::vector PhoneNumbers; PhoneNumbers m_phoneNumbers; bool operator == (const Precomputed &other) const; bool operator != (const Precomputed &other) const { return !(*this == other); } }; /** * (Re)set pre-computed data for an individual. */ virtual bool precompute(FolksIndividual *individual, Precomputed &precomputed) const = 0; }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_LOCALE_FACTORY syncevolution-1.5/src/dbus/server/pim/merge-view.h0000644000373300001540000000625212326412403023557 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Combines results from multiple independent views ("unified address * book light") until the main view is quiescent. Then this view * switches over to mirroring the main view. When switching, it tries * to minimize change signals. * * The independent views don't have to do their own sorting and don't * need store individuals. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PIM_MERGE_VIEW #define INCL_SYNCEVO_DBUS_SERVER_PIM_MERGE_VIEW #include "view.h" #include SE_BEGIN_CXX class MergeView : public IndividualView { public: typedef std::vector< boost::shared_ptr > Searches; private: boost::weak_ptr m_self; boost::shared_ptr m_view; Searches m_searches; boost::shared_ptr m_locale; boost::shared_ptr m_compare; /** * As soon as this is true, m_entries becomes irrelevant and * MergeView becomes a simple proxy for m_view. */ Bool m_viewReady; /** * Sorted entries from the simple views. */ typedef boost::ptr_vector Entries; Entries m_entries; MergeView(const boost::shared_ptr &view, const Searches &searches, const boost::shared_ptr &locale, const boost::shared_ptr &compare); void init(const boost::shared_ptr &self); void addEDSIndividual(const FolksIndividualCXX &individual) throw (); void edsDone(const std::string &uuid) throw (); void viewReady() throw (); public: static boost::shared_ptr create(const boost::shared_ptr &view, const Searches &searches, const boost::shared_ptr &locale, const boost::shared_ptr &compare); virtual bool isQuiescent() const { return m_view->isQuiescent(); } virtual int size() const { return m_viewReady ? m_view->size() : m_entries.size(); } virtual const IndividualData *getContact(int index) { return m_viewReady ? m_view->getContact(index) : (index >= 0 && (size_t)index < m_entries.size()) ? &m_entries[index] : NULL; } protected: virtual void doStart(); }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_MERGE_VIEW syncevolution-1.5/src/dbus/server/pim/individual-traits.h0000644000373300001540000000653512326412403025150 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The D-Bus IPC binding for folks.h. Maps FolksIndividual to and * from the D-Bus dict described in pim-manager-api.txt. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_INDIVIDUAL_TRAITS #define INCL_SYNCEVO_DBUS_SERVER_INDIVIDUAL_TRAITS #include #include "gdbus-cxx-bridge.h" #include "../dbus-callbacks.h" #include "folks.h" #include SE_BEGIN_CXX void DBus2PersonaDetails(GDBusCXX::ExtractArgs &context, GDBusCXX::reader_type &iter, PersonaDetails &details); void FolksIndividual2DBus(const FolksIndividualCXX &individual, GDBusCXX::builder_type &builder); void Details2Persona(const Result &result, const PersonaDetails &details, FolksPersona *persona); SE_END_CXX namespace GDBusCXX { using namespace SyncEvo; /** * The mapping between the internal representation of a * FolksIndividual and D-Bus. Only a subset of the internal * properties are supported. * * The D-Bus side is a mapping from string keys to values which * are either plain text or another such mapping. Boost * cannot represent such a variant, so we cheat and only declare * std::string as content. It doesn't matter for the D-Bus * signature and decoding/encoding is done differently anyway. * * Like the rest of the code for the org._01 API, this code only * works with GDBus GIO. */ template <> struct dbus_traits : public dbus_traits< std::map > > { typedef FolksIndividualCXX host_type; typedef const FolksIndividualCXX &arg_type; static void append(GDBusCXX::builder_type &builder, arg_type individual) { FolksIndividual2DBus(individual, builder); } }; /** * The corresponding mapping from D-Bus to a GeeMap for add_persona_from_details. * See http://telepathy.freedesktop.org/doc/folks/vala/Folks.PersonaStore.add_persona_from_details.html * and http://telepathy.freedesktop.org/doc/folks-eds/vala/Edsf.PersonaStore.add_persona_from_details.html */ template <> struct dbus_traits : public dbus_traits< std::map > > { typedef PersonaDetails host_type; typedef const PersonaDetails &arg_type; static void get(ExtractArgs &context, GDBusCXX::reader_type &iter, host_type &individual) { DBus2PersonaDetails(context, iter, individual); } }; } #endif // INCL_SYNCEVO_DBUS_SERVER_INDIVIDUAL_TRAITS syncevolution-1.5/src/dbus/server/pim/folks.h0000664000373300001540000003012012405555067022633 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The classes in this file implement sorting, searching and * configuring of the unified address book based on libfolks. * * This is pure C++ code. The D-Bus IPC binding for it is * implemented separately in pim-manager.h/cpp. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_IVI_FOLKS #define INCL_SYNCEVO_DBUS_SERVER_IVI_FOLKS #include #include "locale-factory.h" #include "../dbus-callbacks.h" #include "../timeout.h" #include #include #include #include #include #include SE_GOBJECT_TYPE(FolksIndividualAggregator) SE_GOBJECT_TYPE(FolksIndividual) SE_GOBJECT_TYPE(FolksEmailFieldDetails) SE_GOBJECT_TYPE(FolksBackendStore) SE_GOBJECT_TYPE(FolksBackend) SE_GOBJECT_TYPE(FolksPersonaStore) SE_GOBJECT_TYPE(FolksAbstractFieldDetails) SE_GOBJECT_TYPE(FolksRoleFieldDetails) SE_GOBJECT_TYPE(FolksRole) SE_GOBJECT_TYPE(FolksPostalAddress) SE_GOBJECT_TYPE(FolksNoteFieldDetails) SE_GOBJECT_TYPE(FolksPostalAddressFieldDetails) SE_GOBJECT_TYPE(FolksPersona) SE_GOBJECT_TYPE(FolksLocation) SE_GOBJECT_TYPE(GeeHashSet) #include SE_BEGIN_CXX class PersonaDetails; /** * Abstract interface for comparing two FolksIndividual instances. * The properties of a folks individual may change at any time. * Therefore the key properties which determine the sort order * must be copied from the individual. They will be updated when * the individual changes. * * The other advantage is that complex, derived keys only need * to be computed once instead of each time during a comparison. * For example, boost::locale::collator::transform() can be used * to generate the keys. */ class IndividualCompare { public: static boost::shared_ptr defaultCompare(); virtual ~IndividualCompare() {} typedef std::vector Criteria_t; /** * Calculate an ordered set of criteria for comparing * individuals. The default comparison will start with the initial * criteria and move on until a difference is found. * * This is necessary because a single string of "Doe, John" is * treated differently in a collation than the pair of strings * "Doe" and "John". * * @param individual the individual for which sort keys are to be created * @retval criteria cleared before the call, filled afterwards */ virtual void createCriteria(FolksIndividual *individual, Criteria_t &criteria) const = 0; /** * Partial sort order: true if a smaller than b. * * Default implementation uses normal std::string::compare(). */ virtual bool compare(const Criteria_t &a, const Criteria_t &b) const; }; /** * A FolksIndividual plus its sort criteria and search cache. */ struct IndividualData { /** * Sets all members to match the given individual, using the * compare instance to compute values. Both compare and locale may * be NULL. * * Returns true if the precomputed values changed. */ bool init(const IndividualCompare *compare, const LocaleFactory *locale, FolksIndividual *individual); FolksIndividualCXX m_individual; IndividualCompare::Criteria_t m_criteria; LocaleFactory::Precomputed m_precomputed; }; /** * wraps an IndividualCompare for std algorithms on IndividualData */ class IndividualDataCompare : public std::binary_function { boost::shared_ptr m_compare; public: IndividualDataCompare(const boost::shared_ptr &compare) : m_compare(compare) {} IndividualDataCompare(const IndividualDataCompare &other) : m_compare(other.m_compare) {} bool operator () (const IndividualData &a, const IndividualData &b) const { return m_compare->compare(a.m_criteria, b.m_criteria); } }; /** * Abstract interface for filtering (aka searching) FolksIndividual * instances. */ class IndividualFilter { int m_maxResults; public: IndividualFilter() : m_maxResults(-1) {} virtual ~IndividualFilter() {} /** Maximum number of results. -1 for unlimited. */ int getMaxResults() const { return m_maxResults; } void setMaxResults(int maxResults) { m_maxResults = maxResults; } /** * True if within the number of expected results. */ bool isIncluded(size_t index) const { return m_maxResults == -1 || index < (size_t)m_maxResults; } /** * The corresponding EBook query string * (http://developer.gnome.org/libebook/stable/libebook-e-book-query.html#e-book-query-to-string) * for the filter, if there is one. Empty if not. */ virtual std::string getEBookFilter() const { return ""; } /** true if the contact matches the filter */ virtual bool matches(const IndividualData &data) const = 0; }; /** * A filter which just enforces a maximum number of results, * something that FullView cannot do. */ class MatchAll : public IndividualFilter { public: virtual bool matches(const IndividualData &data) const { return true; } }; /** * A fake filter which just carries the maximum result parameter. * Separate type because the dynamic_cast<> can be used to detect * this special case. */ class ParamFilter : public MatchAll { }; class FullView; /** * Is a normal FolksIndividualAggregator and adds sorting, searching * and browsing to it. At least the full sorted view always exists. */ class IndividualAggregator { /** empty when not started yet */ boost::shared_ptr m_view; boost::shared_ptr m_compare; boost::shared_ptr m_locale; boost::weak_ptr m_self; FolksIndividualAggregatorCXX m_folks; FolksBackendStoreCXX m_backendStore; /** * NULL when backends haven't been loaded yet. * Set by backendsLoaded(). */ FolksBackendCXX m_eds; /** * Set by backendsLoaded(), if possible. If m_eds != NULL * and m_systemStore == NULL, no system address book is * available. If m_eds == NULL, hook into m_backendsLoadedSignal * to be notified. */ FolksPersonaStoreCXX m_systemStore; boost::signals2::signal m_backendsLoadedSignal; /** * The set of enabled EDS databases, referenced by the UUID. * Empty by default. */ GeeHashSetCXX m_databases; /** string representation for debugging */ std::string dumpDatabases(); IndividualAggregator(const boost::shared_ptr &locale); void init(boost::shared_ptr &self); /** * Called when backend store is prepared. At that point, backends * can be disabled or enabled and loading them can be kicked of. */ void storePrepared(); /** * Called when all Folks backends are loaded, before the * aggregator does its work. Now is the right time to initialize * the set of databases and prepare the aggregator, if start() was * already called. */ void backendsLoaded(); /** * Executes the given operation when the EDS system address book * is prepared. The operation may throw an exception, which (like * all other errors) is reported as failure for the asynchronous * operation. */ void runWithAddressBook(const boost::function &operation, const ErrorCb_t &onError) throw(); void runWithAddressBookHaveEDS(const boost::signals2::connection &conn, const boost::function &operation, const ErrorCb_t &onError) throw(); void runWithAddressBookPrepared(const GError *gerror, const boost::function &operation, const ErrorCb_t &onError) throw(); /** * Executes the given operation after looking up the FolksPersona * in the system address book, which must be prepared and loaded * at that point. */ void runWithPersona(const boost::function &operation, const std::string &localID, const ErrorCb_t &onError) throw(); void doRunWithPersona(const boost::function &operation, const std::string &localID, const ErrorCb_t &onError) throw(); /** the operation for runWithAddressBook() */ void doAddContact(const Result &result, const PersonaDetails &details); /** handle result of adding contact */ void addContactDone(const GError *gerror, FolksPersona *persona, const Result &result) throw(); void doModifyContact(const Result &result, FolksPersona *persona, const PersonaDetails &details) throw(); void doRemoveContact(const Result &result, FolksPersona *persona) throw(); void removeContactDone(const GError *gerror, const Result &result) throw(); public: /** * Creates an idle IndividualAggregator. Configure it and * subscribe to signals, then call start(). */ static boost::shared_ptr create(const boost::shared_ptr &locale); /** * Access to FolksIndividualAggregator which is owned by * the aggregator. */ FolksIndividualAggregator *getFolks() const { return m_folks.get(); } /** * Set sorting without starting the view just yet. */ void setCompare(const boost::shared_ptr &compare); /** * Change current locale. Must be followed by setCompare() to update * any pre-computed data. */ void setLocale(const boost::shared_ptr &locale); /** * Starts pulling and sorting of contacts. * Creates m_view and starts populating it. * Can be called multiple times. * * See also org.01.pim.contacts.Manager.Start(). */ void start(); /** * start() was called, or something caused it to be called. */ bool isRunning() const; /** * configure active databases * * @param set of EDS database UUIDs, empty string for the default * system address book */ void setDatabases(std::set &databases); /** * Each aggregator has exactly one full view on the data. This * method grants access to it and its change signals. * * @return never empty, start() will be called if necessary */ boost::shared_ptr getMainView(); /** * Add contact to system address book. Returns new local ID * as result. */ void addContact(const Result &result, const PersonaDetails &details); /** * Modify contact in system address book. */ void modifyContact(const Result &result, const std::string &localID, const PersonaDetails &details); /** * Remove contact in system address book. */ void removeContact(const Result &result, const std::string &localID); }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_IVI_FOLKS syncevolution-1.5/src/dbus/server/pim/manager.h0000664000373300001540000002543712363142310023130 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The D-Bus IPC binding for folks.h and SyncEvolution's * PBAP support. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PIM_MANAGER #define INCL_SYNCEVO_DBUS_SERVER_PIM_MANAGER #include "folks.h" #include "locale-factory.h" #include "../server.h" #include "../session.h" #include #include SE_BEGIN_CXX class LocaledListener; /** * Implementation of org._01.pim.contacts.Manager. */ class Manager : public GDBusCXX::DBusObjectHelper { GThread *m_mainThread; boost::weak_ptr m_self; boost::shared_ptr m_server; boost::shared_ptr m_folks; boost::shared_ptr m_locale; boost::shared_ptr m_localedListener; /** Stores "sort" property in XDG ~/.config/syncevolution/pim-manager.ini'. */ boost::shared_ptr m_configNode; std::string m_sortOrder; Bool m_preventingAutoTerm; /** * Contains the EDS UUIDs of all address books contributing to the current * unified address book. */ std::set m_enabledEBooks; typedef std::list< std::pair< boost::shared_ptr, boost::shared_ptr > > Pending_t; /** holds the references to pending session requests, see runInSession() */ Pending_t m_pending; Manager(const boost::shared_ptr &server); void init(); void initFolks(); void initDatabases(); void initSorting(const std::string &order); void localeChanged(); typedef boost::signals2::signal &locale)> LocaleChangedSignal; LocaleChangedSignal m_localeChanged; public: /** Manager.Start() */ void start(); /** Manager.Stop() */ void stop(); /** Manager.IsRunning() */ bool isRunning(); /** Manager.SetSortOrder() */ void setSortOrder(const std::string &order); /** Manager.GetSortOrder() */ std::string getSortOrder(); /** Manager.Search() */ void search(const boost::shared_ptr< GDBusCXX::Result1 > &result, const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch, const std::vector &filter, const GDBusCXX::DBusObject_t &agentPath); private: void searchWithRegistry(const ESourceRegistryCXX ®istry, const GError *gerror, const boost::shared_ptr< GDBusCXX::Result1 > &result, const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch, const LocaleFactory::Filter_t &filter, const GDBusCXX::DBusObject_t &agentPath) throw(); void doSearch(const ESourceRegistryCXX ®istry, const boost::shared_ptr< GDBusCXX::Result1 > &result, const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch, const LocaleFactory::Filter_t &filter, const GDBusCXX::DBusObject_t &agentPath); public: /** Manager.GetActiveAddressBooks() */ void getActiveAddressBooks(std::vector &dbIDs); /** Manager.SetActiveAddressBooks() */ void setActiveAddressBooks(const std::vector &dbIDs); /** Manager.CreatePeer() */ void createPeer(const boost::shared_ptr &result, const std::string &uid, const StringMap &properties); /** Manager.ModifyPeer() */ void modifyPeer(const boost::shared_ptr &result, const std::string &uid, const StringMap &properties); private: enum ConfigureMode { SET_PEER, CREATE_PEER, MODIFY_PEER }; void setPeer(const boost::shared_ptr &result, const std::string &uid, const StringMap &properties, ConfigureMode mode); void doSetPeer(const boost::shared_ptr &session, const boost::shared_ptr &result, const std::string &uid, const StringMap &properties, ConfigureMode mode); public: /** Manager.RemovePeer() */ void removePeer(const boost::shared_ptr &result, const std::string &uid); private: void doRemovePeer(const boost::shared_ptr &session, const boost::shared_ptr &result, const std::string &uid); public: typedef std::map > SyncResult; /** Manager.SyncPeer() */ void syncPeer(const boost::shared_ptr > &result, const std::string &uid); typedef std::map > SyncFlags; /** Manager.SyncPeerWithFlags() */ void syncPeerWithFlags(const boost::shared_ptr > &result, const std::string &uid, const SyncFlags &flags); /** Manager.SyncProgress */ GDBusCXX::EmitSignal3 emitSyncProgress; private: void doSyncPeer(const boost::shared_ptr &session, const boost::shared_ptr > &result, const std::string &uid, const SyncFlags &flags); void report2SyncProgress(const std::string &uid, const std::string &sourceName, const SyncSourceReport &source); void progress2SyncProgress(const std::string &uid, Session *session, int32_t percent, const Session::SourceProgresses_t &progress); public: /** Manager.StopSync() */ void stopSync(const boost::shared_ptr &result, const std::string &uid); typedef std::map > PeerStatus; /** Manager.GetPeerStatus() */ PeerStatus getPeerStatus(const std::string &uid); /** Manager.SuspendSync() */ void suspendSync(const boost::shared_ptr< GDBusCXX::Result1 > &result, const std::string &uid) { setFreeze(result, uid, true); } /** Manager.ResumeSync() */ void resumeSync(const boost::shared_ptr< GDBusCXX::Result1 > &result, const std::string &uid) { setFreeze(result, uid, false); } /** internal */ void setFreeze(const boost::shared_ptr< GDBusCXX::Result1 > &result, const std::string &uid, bool freeze); typedef std::map PeersMap; /** Manager.GetAllPeers() */ PeersMap getAllPeers(); /** Manager.AddContact() */ void addContact(const boost::shared_ptr< GDBusCXX::Result1 > &result, const std::string &addressbook, const PersonaDetails &details); /** Manager.ModifyContact() */ void modifyContact(const boost::shared_ptr &result, const std::string &addressbook, const std::string &localID, const PersonaDetails &details); /** Manager.RemoveContact() */ void removeContact(const boost::shared_ptr &result, const std::string &addressbook, const std::string &localID); private: /** * Starts a session for the given config and with the * given flags, then when it is active, invokes the callback. * Failures will be reported back to via the result * pointer. */ void runInSession(const std::string &config, Server::SessionFlags flags, const boost::shared_ptr &result, const boost::function &session)> &callback); /** * Common boilerplate code for anything that runs inside * an active session in response to some D-Bus method call * (like doSetPeer). */ void doSession(const boost::weak_ptr &session, const boost::shared_ptr &result, const boost::function &session)> &callback); /** true if the current thread is the one handling the event loop and running all operations */ bool isMain() { return g_thread_self() == m_mainThread; } /** * Runs the operation inside the main thread and returns once the * main thread is done with it. */ void runInMainVoid(const boost::function &operation); template R runInMainRes(const boost::function &operation); void runInMainV(void (Manager::*method)()) { runInMainVoid(boost::bind(method, this)); } template R runInMainR(R (Manager::*method)()) { return runInMainRes(boost::bind(method, this)); } template void runInMainV(void (Manager::*method)(B1), A1 a1) { runInMainVoid(boost::bind(method, this, a1)); } template R runInMainR(R (Manager::*method)(B1), A1 a1) { return runInMainRes(boost::bind(method, this, a1)); } public: /** * Creates an instance of the Manager which runs as part * of the given server, using the same D-Bus connection * and using the server's services (tracking clients, * startup/shutdown). * * While the Manager exists, it blocks auto-termination * of the server and serves method calls as part of the * main event loop. */ static boost::shared_ptr create(const boost::shared_ptr &server); ~Manager(); }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PIM_MANAGER syncevolution-1.5/src/dbus/server/pim/persona-details.h0000644000373300001540000000431712326412403024602 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The D-Bus IPC binding for folks.h. Maps FolksIndividual to and * from the D-Bus dict described in pim-manager-api.txt. */ #ifndef INCL_SYNCEVO_DBUS_SERVER_PERSONA_DETAILS #define INCL_SYNCEVO_DBUS_SERVER_PERSONA_DETAILS #include #include #include #include #include SE_BEGIN_CXX // This is okay with g++ 4.7 and clang 3.0. // typedef boost::intrusive_ptr PersonaDetails; // However, g++ 4.5 is more picky and rejects // template <> struct dbus_traits : // "template argument 1 is invalid" // // Besides working around this compiler bug, // defining a real class also has the advantage that we can // define D-Bus traits for multiple classes using boost::intrusive_ptr // as base, should that ever be necessary. class PersonaDetails : public boost::intrusive_ptr { public: PersonaDetails() : // Keys are static (from folks_persona_store_detail_key()), values // are dynamically allocated GValueCXX instances owned by the hash. boost::intrusive_ptr(g_hash_table_new_full(g_str_hash, g_str_equal, NULL, GValueCXX::destroy), false) {} }; SE_END_CXX #endif // INCL_SYNCEVO_DBUS_SERVER_PERSONA_DETAILS syncevolution-1.5/src/dbus/server/pim/view.cpp0000644000373300001540000000514712326412403023017 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "view.h" #include SE_BEGIN_CXX void View::start() { SE_LOG_DEBUG(NULL, "%s: start() %s", getName(), m_started ? "already done" : "doing it now"); if (!m_started) { m_started = true; doStart(); } } bool View::isRunning() const { return m_started; } void IndividualView::findContact(const std::string &id, int hint, int &index, FolksIndividualCXX &individual) { int i; int count = size(); // Start searching at the hint. for (i = hint; i < count; i++) { individual = getContact(i)->m_individual; if (id == folks_individual_get_id(individual.get())) { index = i; return; } } // Finish search before the hint. for (i = 0; i < hint; i++) { individual = getContact(i)->m_individual; if (id == folks_individual_get_id(individual.get())) { index = i; return; } } // Nothing found. index = -1; individual.reset(); } void IndividualView::readContacts(const std::vector &ids, Contacts &contacts) { contacts.clear(); contacts.reserve(ids.size()); // The search is optimized for the case where many consecutive // contacts in increasing order are requested. For that case, a // linear search is needed for the first contact and then the // following ones are found in constant time. // // Randomly requesting contacts performs poorly, due to the O(n) // lookup complexity. int hint = 0; BOOST_FOREACH (const std::string &id, ids) { int index; FolksIndividualCXX individual; findContact(id, hint, index, individual); contacts.push_back(std::make_pair(index, individual)); if (index >= 0) { hint = index; } } } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/full-view.cpp0000644000373300001540000003337312326412403023761 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "full-view.h" #include #include #include SE_BEGIN_CXX FullView::FullView(const FolksIndividualAggregatorCXX &folks, const boost::shared_ptr &locale) : m_folks(folks), m_locale(locale), m_localeChanged(false), // set only after explicit setLocale() m_isQuiescent(false), // Ensure that there is a sort criteria. m_compare(IndividualCompare::defaultCompare()) { setName("full view"); } void FullView::init(const boost::shared_ptr &self) { m_self = self; } void FullView::doStart() { // Populate view from current set of data. Usually FullView // gets instantiated when the aggregator is idle, in which // case there won't be any contacts yet. // // Optimize the initial loading by filling a vector and sorting it // more efficiently, then adding it all in one go. // Use pointers in array, to speed up sorting. boost::ptr_vector individuals; IndividualData data; typedef GeeCollCXX< GeeMapEntryWrapper > Coll; GeeMap *map = folks_individual_aggregator_get_individuals(m_folks); Coll coll(map, ADD_REF); guint size = gee_map_get_size(map); individuals.reserve(size); SE_LOG_DEBUG(NULL, "starting with %u individuals", size); BOOST_FOREACH (const Coll::value_type &entry, coll) { FolksIndividual *individual = entry.value(); data.init(m_compare.get(), m_locale.get(), individual); individuals.push_back(new IndividualData(data)); } individuals.sort(IndividualDataCompare(m_compare)); // Copy the sorted data into the view in one go. m_entries.insert(m_entries.begin(), individuals.begin(), individuals.end()); // Avoid loop if no-one is listening. if (!m_addedSignal.empty()) { for (size_t index = 0; index < m_entries.size(); index++) { m_addedSignal(index, m_entries[index]); } } // Connect to changes. Aggregator might live longer than we do, so // bind to weak pointer and check our existence at runtime. m_folks.connectSignal("individuals-changed", boost::bind(&FullView::individualsChanged, m_self, _2, _3, _4, _5, _6)); // Track state as part of normal event processing. Don't check the // state directly, because then we might get into an inconsistent // state (changes still pending in our queue, function call // already returns true). m_isQuiescent = folks_individual_aggregator_get_is_quiescent(m_folks.get()); m_folks.connectSignal("notify::is-quiescent", boost::bind(&FullView::quiescenceChanged, m_self)); } boost::shared_ptr FullView::create(const FolksIndividualAggregatorCXX &folks, const boost::shared_ptr &locale) { boost::shared_ptr view(new FullView(folks, locale)); view->init(view); return view; } void FullView::setLocale(const boost::shared_ptr &locale) { m_locale = locale; m_localeChanged = true; // Don't recompute all IndividualData content. That will be done // as part of setCompare(), which must be called later. } void FullView::individualsChanged(GeeSet *added, GeeSet *removed, gchar *message, FolksPersona *actor, FolksGroupDetailsChangeReason reason) { SE_LOG_DEBUG(NULL, "individuals changed, %s, %d added, %d removed, message: %s", actor ? folks_persona_get_display_id(actor) : "<>", added ? gee_collection_get_size(GEE_COLLECTION(added)) : 0, removed ? gee_collection_get_size(GEE_COLLECTION(removed)) : 0, message); typedef GeeCollCXX Coll; // Remove first, to match the "remove + added = modified" change optimization // in Manager::handleChange(). if (removed) { BOOST_FOREACH (FolksIndividual *individual, Coll(removed, ADD_REF)) { removeIndividual(individual); } } if (added) { // TODO (?): Optimize adding many new individuals by pre-sorting them, // then using that information to avoid comparisons in addIndividual(). BOOST_FOREACH (FolksIndividual *individual, Coll(added, ADD_REF)) { addIndividual(individual); } } } void FullView::individualModified(gpointer gobject, GParamSpec *pspec) { SE_LOG_DEBUG(NULL, "individual %p modified", gobject); FolksIndividual *individual = FOLKS_INDIVIDUAL(gobject); // Delay the expensive modification check until the process is // idle, because in practice we get several change signals for // each contact change in EDS. // // See https://bugzilla.gnome.org/show_bug.cgi?id=684764 // "too many FolksIndividual modification signals" m_pendingModifications.insert(FolksIndividualCXX(individual, ADD_REF)); waitForIdle(); } void FullView::quiescenceChanged() { bool quiescent = folks_individual_aggregator_get_is_quiescent(m_folks); SE_LOG_DEBUG(NULL, "aggregator is %s", quiescent ? "quiescent" : "busy"); // In practice, libfolks only switches from "busy" to "quiescent" // once. See https://bugzilla.gnome.org/show_bug.cgi?id=684766 // "enter and leave quiescence state". if (quiescent) { int seconds = atoi(getEnv("SYNCEVOLUTION_PIM_DELAY_FOLKS", "0")); if (seconds > 0) { // Delay the quiescent state change as requested. SE_LOG_DEBUG(NULL, "delay aggregrator quiescence by %d seconds", seconds); m_quiescenceDelay.runOnce(seconds, boost::bind(&FullView::quiescenceChanged, this)); unsetenv("SYNCEVOLUTION_PIM_DELAY_FOLKS"); return; } m_isQuiescent = true; m_quiescenceSignal(); } } void FullView::doAddIndividual(Entries_t::auto_type &data) { // Binary search to find insertion point. Entries_t::iterator it = std::lower_bound(m_entries.begin(), m_entries.end(), *data, IndividualDataCompare(m_compare)); size_t index = it - m_entries.begin(); it = m_entries.insert(it, data.release()); SE_LOG_DEBUG(NULL, "full view: added at #%ld/%ld", (long)index, (long)m_entries.size()); m_addedSignal(index, *it); waitForIdle(); // Monitor individual for changes. it->m_individual.connectSignal("notify", boost::bind(&FullView::individualModified, m_self, _1, _2)); } void FullView::addIndividual(FolksIndividual *individual) { Entries_t::auto_type data(new IndividualData); data->init(m_compare.get(), m_locale.get(), individual); doAddIndividual(data); } void FullView::modifyIndividual(FolksIndividual *individual) { // Brute-force search for the individual. Pointer comparison is // sufficient, libfolks will not change instances without // announcing it. for (Entries_t::iterator it = m_entries.begin(); it != m_entries.end(); ++it) { if (it->m_individual.get() == individual) { size_t index = it - m_entries.begin(); Entries_t::auto_type data(new IndividualData); data->init(m_compare.get(), m_locale.get(), individual); if (data->m_criteria != it->m_criteria && ((it != m_entries.begin() && !m_compare->compare((it - 1)->m_criteria, data->m_criteria)) || (it + 1 != m_entries.end() && !m_compare->compare(data->m_criteria, (it + 1)->m_criteria)))) { // Sort criteria changed in such a way that the old // sorting became invalid => move the entry. Do it // as simple as possible, because this is not expected // to happen often. SE_LOG_DEBUG(NULL, "full view: temporarily removed at #%ld/%ld", (long)index, (long)m_entries.size()); Entries_t::auto_type old = m_entries.release(it); m_removedSignal(index, *old); doAddIndividual(data); } else { SE_LOG_DEBUG(NULL, "full view: modified at #%ld/%ld", (long)index, (long)m_entries.size()); // Use potentially modified pre-computed data. m_entries.replace(it, data.release()); m_modifiedSignal(index, *it); waitForIdle(); } return; } } // Not a bug: individual might have been removed before we got // around to processing the modification notification. SE_LOG_DEBUG(NULL, "full view: modified individual not found"); } void FullView::removeIndividual(FolksIndividual *individual) { for (Entries_t::iterator it = m_entries.begin(); it != m_entries.end(); ++it) { if (it->m_individual.get() == individual) { size_t index = it - m_entries.begin(); SE_LOG_DEBUG(NULL, "full view: removed at #%ld/%ld", (long)index, (long)m_entries.size()); Entries_t::auto_type data = m_entries.release(it); m_removedSignal(index, *data); waitForIdle(); return; } } // A bug?! SE_LOG_DEBUG(NULL, "full view: individual to be removed not found"); } void FullView::onIdle() { SE_LOG_DEBUG(NULL, "full view: process is idle"); // Process delayed contact modifications. BOOST_FOREACH (const FolksIndividualCXX &individual, m_pendingModifications) { modifyIndividual(const_cast(individual.get())); } m_pendingModifications.clear(); // If not quiescent at the moment, then we can rely on getting // that signal triggered by folks and don't need to send it now. if (isQuiescent()) { m_quiescenceSignal(); } } void FullView::waitForIdle() { if (!m_waitForIdle) { // Run this after all other idle callbacks that we may have added, // like the "fill view on idle" callback in the filtered view. m_waitForIdle.runOnce(boost::bind(&FullView::onIdle, this), Timeout::PRIORITY_LOW); } } void FullView::setCompare(const boost::shared_ptr &compare) { m_compare = compare ? compare : IndividualCompare::defaultCompare(); // Make a copy of the original order. The actual instances // continue to be owned by m_entries. boost::scoped_array old(new IndividualData *[m_entries.size()]); memcpy(old.get(), m_entries.c_array(), sizeof(IndividualData *) * m_entries.size()); // Change sort criteria and sort. // Optionally also re-compute locale-dependent values, if // the locale changed (see setLocale()). LocaleFactory *locale = m_localeChanged ? m_locale.get() : NULL; m_localeChanged = false; boost::dynamic_bitset modified(locale ? m_entries.size() : 0); for (size_t i = 0; i < m_entries.size(); i++ ) { IndividualData &data = m_entries[i]; bool preComputedModified = data.init(m_compare.get(), locale, data.m_individual); if (locale && preComputedModified) { modified.set(i); } } m_entries.sort(IndividualDataCompare(m_compare)); // Now check for changes. for (size_t index = 0; index < m_entries.size(); index++) { IndividualData &previous = *old[index], ¤t = m_entries[index]; if (previous.m_individual != current.m_individual || (locale && modified[index])) { // Contact at the index changed. Don't try to find out // where it came from now. The effect is that temporarily // the same contact might be shown at two different // indices. m_modifiedSignal(index, current); } } // Current status is stable again (?), send out all modifications. if (isQuiescent()) { m_quiescenceSignal(); } } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/filtered-view.cpp0000644000373300001540000003670412326412403024616 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "filtered-view.h" #include #include #include #include SE_BEGIN_CXX FilteredView::FilteredView(const boost::shared_ptr &parent, const boost::shared_ptr &filter) : m_parent(parent), m_filter(filter) { setName("filtered view"); } void FilteredView::init(const boost::shared_ptr &self) { m_self = self; m_parent->m_quiescenceSignal.connect(boost::bind(&FilteredView::parentQuiescent, m_self)); } void FilteredView::parentQuiescent() { // State of the parent is stable again. Check if we queued a "fill view" // operation and do it now, before forwarding the quiescent signal. // This gives us the chance to add a contact before a previous remove // signal is sent, which then enables the combination of two signals // into one. if (m_fillViewOnIdle) { fillViewCb(); m_fillViewOnIdle.deactivate(); } m_quiescenceSignal(); } boost::shared_ptr FilteredView::create(const boost::shared_ptr &parent, const boost::shared_ptr &filter) { boost::shared_ptr view(new FilteredView(parent, filter)); view->init(view); return view; } void FilteredView::doStart() { m_parent->start(); // Add initial content. Our processing of the new contact must not // cause changes to the parent view, otherwise the result will not // be inconsistent. for (int index = 0; !isFull() && index < m_parent->size(); index++) { addIndividual(index, *m_parent->getContact(index)); } // Start listening to signals. m_parent->m_addedSignal.connect(ChangeSignal_t::slot_type(boost::bind(&FilteredView::addIndividual, this, _1, _2)).track(m_self)); m_parent->m_modifiedSignal.connect(ChangeSignal_t::slot_type(boost::bind(&FilteredView::modifyIndividual, this, _1, _2)).track(m_self)); m_parent->m_removedSignal.connect(ChangeSignal_t::slot_type(boost::bind(&FilteredView::removeIndividual, this, _1, _2)).track(m_self)); } bool FilteredView::isFull(const Entries_t &local2parent, const boost::shared_ptr &filter) { size_t newEndIndex = local2parent.end() - local2parent.begin(); return !filter->isIncluded(newEndIndex); } void FilteredView::fillViewCb() { // Can we add back contacts which were excluded because of the // maximum number of results? SE_LOG_DEBUG(NULL, "filtered view %s: fill view on idle", getName()); int candidate = m_local2parent.empty() ? 0 : m_local2parent.back() + 1; while (!isFull() && candidate < m_parent->size()) { const IndividualData *data = m_parent->getContact(candidate); addIndividual(candidate, *data); candidate++; } } void FilteredView::fillView() { if (!m_fillViewOnIdle) { m_fillViewOnIdle.runOnce(-1, boost::bind(&FilteredView::fillViewCb, this)); } } void FilteredView::replaceFilter(const boost::shared_ptr &individualFilter, bool refine) { // Keep number of results the same, to avoid additional corner // cases. if (individualFilter->getMaxResults() != -1 && individualFilter->getMaxResults() != m_filter->getMaxResults()) { SE_THROW("refining the search must not change the maximum number of results"); } individualFilter->setMaxResults(m_filter->getMaxResults()); if (refine) { // Take advantage of the hint that the search is more strict: // we know that we can limit searching to the contacts which // already matched the previous search. bool removed = false; size_t index = 0; while (index < m_local2parent.size()) { const IndividualData *data = m_parent->getContact(m_local2parent[index]); if (individualFilter->matches(*data)) { // Still matched, just skip it. ++index; } else { // No longer matched, remove it. m_local2parent.erase(m_local2parent.begin() + index); m_removedSignal(index, *data); removed = true; } } m_filter = individualFilter; if (removed) { fillView(); } } else { // Brute-force approach. // // Here is an example of old and new mapping: // index into local2parent old value new value // 0 10 10 // 1 20 30 // 2 30 40 // 3 50 50 // 4 70 60 // 5 - 70 // 6 - 80 // // The LCS (see below) is: // (0, 0, 10) (2, 1, 30) (3, 3, 50) (4, 5, 70) // // The expected change signals for this transition are: // "removed", 1 // "added", 2 // "added", 4 // "added", 6 // // Note that this example does not include all corner cases. // Also relevant is adding or removing multiple entries at the // same index. // // One could also emit a "modified" signal for each index if // it is different, but then a single insertion or deletion // would led to invalidating the entire view. // // 1. build new result list. Entries_t local2parent; int candidate = 0; while (!isFull(local2parent, individualFilter) && candidate < m_parent->size()) { const IndividualData *data = m_parent->getContact(candidate); if (individualFilter->matches(*data)) { local2parent.push_back(candidate); } candidate++; } // 2. morph existing one into new one. // // Uses the SyncEvolution longest-common-subsequence // algorithm. Because all entries are different, there can be // only one solution and thus there is no need for a cost // function to find "better" solutions. std::vector< LCS::Entry > common; common.reserve(std::min(m_local2parent.size(), local2parent.size())); LCS::lcs(m_local2parent, local2parent, std::back_inserter(common), LCS::accessor_sequence()); // To emit the discovered changes as "added" and "removed" // signals, we need to look at identical entries. // The "delta" here always represents the value "new = b" - // "old = a" which needs to be added to the old index to get // the new one. It summarizes the change signals emitted so // far. For each common entry, we need to check if the delta // is different from what we have told the agent so far. int delta = 0; // The "shift" is the "old modified" - "old original" that // tells us how many entries were added (positive value) or // removed (negative value) via signals. int shift = 0; // Old and new index represent the indices of the previous // common element plus 1; in other words, the expected next // common element. size_t oldIndex = 0, newIndex = 0; BOOST_FOREACH (const LCS::Entry &entry, common) { int new_delta = (ssize_t)entry.index_b - (ssize_t)entry.index_a; if (delta != new_delta) { // When emitting "added" or "removed" signals, // be careful about getting the original index // in the old set right. It needs to be adjusted // to include the already sent changes. if (delta < new_delta) { size_t change = new_delta - delta; for (size_t i = 0; i < change; i++) { const IndividualData *data = m_parent->getContact(local2parent[newIndex + i]); // Keep adding at new indices, one new element // after the other. m_addedSignal(oldIndex - shift + i, *data); } shift -= change; } else if (delta > new_delta) { size_t change = delta - new_delta; shift += change; for (size_t i = 0; i < change; i++) { size_t index = oldIndex - shift; const IndividualData *data = m_parent->getContact(m_local2parent[index + i]); // Keep removing at the same index, because // that's how it'll look to the recipient. m_removedSignal(index, *data); } } new_delta = delta; } oldIndex = entry.index_a + 1; newIndex = entry.index_b + 1; } // Now deal with entries after the latest common entry, in // both arrays. for (size_t index = oldIndex; index < m_local2parent.size(); index++) { const IndividualData *data = m_parent->getContact(m_local2parent[index]); m_removedSignal(oldIndex - shift, *data); } for (size_t index = newIndex; index < local2parent.size(); index++) { const IndividualData *data = m_parent->getContact(local2parent[index]); m_addedSignal(index, *data); } // - swap std::swap(m_local2parent, local2parent); } // If the parent is currently busy, then we can delay sending the // signal until it is no longer busy. if (isQuiescent()) { parentQuiescent(); } } void FilteredView::addIndividual(int parentIndex, const IndividualData &data) { // We can use binary search to find the insertion point. // Check last entry first, because that is going to be // very common when adding via doStart(). Entries_t::iterator it; if (!m_local2parent.empty() && m_local2parent.back() < parentIndex) { it = m_local2parent.end(); } else { it = std::lower_bound(m_local2parent.begin(), m_local2parent.end(), parentIndex); } // Adding a contact in the parent changes values in our // mapping array, regardless whether the new contact also // gets and entry in it. Shift all following indices. for (Entries_t::iterator it2 = it; it2 != m_local2parent.end(); ++it2) { (*it2)++; } if (m_filter->matches(data)) { size_t index = it - m_local2parent.begin(); if (m_filter->isIncluded(index)) { // Remove first if necessary, to ensure that recipient // never has more entries in its view than requested. size_t newEndIndex = m_local2parent.end() - m_local2parent.begin(); if (newEndIndex > index && !m_filter->isIncluded(newEndIndex)) { const IndividualData *data = m_parent->getContact(m_local2parent.back()); SE_LOG_DEBUG(NULL, "%s: removed at #%ld/%ld to make room for new entry", getName(), (long)(newEndIndex - 1), (long)m_local2parent.size()); m_local2parent.pop_back(); m_removedSignal(newEndIndex - 1, *data); // Iterator might have pointed to removed entry, which may have // invalidated it. Get fresh iterator based on index. it = m_local2parent.begin() + index; } m_local2parent.insert(it, parentIndex); SE_LOG_DEBUG(NULL, "%s: added at #%ld/%ld", getName(), (long)index, (long)m_local2parent.size()); m_addedSignal(index, data); } else { SE_LOG_DEBUG(NULL, "%s: not added at #%ld/%ld because outside of result range", getName(), (long)index, (long)m_local2parent.size()); } } } void FilteredView::removeIndividual(int parentIndex, const IndividualData &data) { // The entries are sorted. Therefore we can use a binary search // to find the parentIndex or the first entry after it. Entries_t::iterator it = std::lower_bound(m_local2parent.begin(), m_local2parent.end(), parentIndex); // Removing a contact in the parent changes values in our mapping // array, regardless whether the removed contact is part of our // view. Shift all following indices, including the removed entry // if it is part of the view. bool found = it != m_local2parent.end() && *it == parentIndex; for (Entries_t::iterator it2 = it; it2 != m_local2parent.end(); ++it2) { (*it2)--; } if (found) { size_t index = it - m_local2parent.begin(); SE_LOG_DEBUG(NULL, "%s: removed at #%ld/%ld", getName(), (long)index, (long)m_local2parent.size()); m_local2parent.erase(it); m_removedSignal(index, data); // Try adding more contacts from the parent once the parent // is done with sending us changes - in other words, wait until // the process is idle. fillView(); } } void FilteredView::modifyIndividual(int parentIndex, const IndividualData &data) { Entries_t::iterator it = std::lower_bound(m_local2parent.begin(), m_local2parent.end(), parentIndex); bool matches = m_filter->matches(data); if (it != m_local2parent.end() && *it == parentIndex) { // Was matched before the change. size_t index = it - m_local2parent.begin(); if (matches) { // Still matched, merely pass on modification signal. SE_LOG_DEBUG(NULL, "%s: modified at #%ld/%ld", getName(), (long)index, (long)m_local2parent.size()); m_modifiedSignal(index, data); } else { // Removed. SE_LOG_DEBUG(NULL, "%s: removed at #%ld/%ld due to modification", getName(), (long)index, (long)m_local2parent.size()); m_local2parent.erase(it); m_removedSignal(index, data); fillView(); } } else if (matches) { // Was not matched before and is matched now => add it. size_t index = it - m_local2parent.begin(); if (m_filter->isIncluded(index)) { m_local2parent.insert(it, parentIndex); SE_LOG_DEBUG(NULL, "%s: added at #%ld/%ld due to modification", getName(), (long)index, (long)m_local2parent.size()); m_addedSignal(index, data); } } else { // Neither matched before nor now => nothing changed. } } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/edsf-view.cpp0000644000373300001540000001371112326412403023732 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "edsf-view.h" #include SE_GOBJECT_TYPE(EdsfPersona); SE_BEGIN_CXX EDSFView::EDSFView(const ESourceRegistryCXX ®istry, const std::string &uuid, const std::string &query) : m_registry(registry), m_uuid(uuid), m_query(query) { } void EDSFView::init(const boost::shared_ptr &self) { m_self = self; } boost::shared_ptr EDSFView::create(const ESourceRegistryCXX ®istry, const std::string &uuid, const std::string &query) { boost::shared_ptr view(new EDSFView(registry, uuid, query)); view->init(view); return view; } void EDSFView::doStart() { // This function may get entered again, see retry code in opened() below. ESourceCXX source(e_source_registry_ref_source(m_registry, m_uuid.c_str()), TRANSFER_REF); if (!source) { SE_LOG_DEBUG(NULL, "edsf %s: address book not found", m_uuid.c_str()); return; } m_store = EdsfPersonaStoreCXX::steal(edsf_persona_store_new_with_source_registry(m_registry, source)); GErrorCXX gerror; #ifdef HAVE_E_BOOK_CLIENT_CONNECT_DIRECT_SYNC // TODO: use asynchronous version, once there is one in EDS if (!getenv("SYNCEVOLUTION_NO_PIM_EDS_DIRECT")) { while (!m_ebook) { SE_LOG_DEBUG(NULL, "edsf %s: synchronously connecting direct", m_uuid.c_str()); m_ebook = EBookClientCXX::steal(E_BOOK_CLIENT(e_book_client_connect_direct_sync(m_registry, source, NULL, gerror))); if (!m_ebook) { SE_LOG_DEBUG(NULL, "edsf %s: no DRA client for address book: %s", m_uuid.c_str(), gerror ? gerror->message : "???"); if (gerror && g_error_matches(gerror, E_CLIENT_ERROR, E_CLIENT_ERROR_BUSY)) { SE_LOG_DEBUG(NULL, "edsf %s: try again", m_uuid.c_str()); gerror.clear(); } else { return; } } } // Already opened by call above, proceed immediately. opened(true, NULL); return; } #endif SE_LOG_DEBUG(NULL, "edsf %s: new client", m_uuid.c_str()); m_ebook = EBookClientCXX::steal(e_book_client_new(source, gerror)); if (!m_ebook) { SE_LOG_DEBUG(NULL, "edsf %s: no normal client for address book: %s", m_uuid.c_str(), gerror ? gerror->message : "???"); return; } SE_LOG_DEBUG(NULL, "edsf %s: asynchronous open", m_uuid.c_str()); SYNCEVO_GLIB_CALL_ASYNC(e_client_open, boost::bind(&EDSFView::opened, m_self, _1, _2), E_CLIENT(m_ebook.get()), false, NULL); } void EDSFView::opened(gboolean success, const GError *gerror) throw() { try { if (!success) { SE_LOG_DEBUG(NULL, "edsf %s: opening failed: %s", m_uuid.c_str(), gerror ? gerror->message : "???"); if (gerror && g_error_matches(gerror, E_CLIENT_ERROR, E_CLIENT_ERROR_BUSY)) { SE_LOG_DEBUG(NULL, "edsf %s: try again", m_uuid.c_str()); doStart(); return; } } SE_LOG_DEBUG(NULL, "edsf %s: opened successfully, reading contacts asynchronously: %s", m_uuid.c_str(), m_query.c_str()); SYNCEVO_GLIB_CALL_ASYNC(e_book_client_get_contacts, boost::bind(&EDSFView::read, m_self, _1, _2, _3), m_ebook.get(), m_query.c_str(), NULL); } catch (...) { Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } } void EDSFView::read(gboolean success, GSList *contactslist, const GError *gerror) throw() { try { SE_LOG_DEBUG(NULL, "edsf %s: reading contacts completed: %s", m_uuid.c_str(), success ? "success" : gerror ? gerror->message : "failed without error"); GListCXX contacts(contactslist); if (!success) { SE_LOG_DEBUG(NULL, "edsf %s: reading failed: %s", m_uuid.c_str(), gerror->message); return; } BOOST_FOREACH (EContact *contact, contacts) { EdsfPersonaCXX persona(edsf_persona_new(m_store, contact), TRANSFER_REF); GeeHashSetCXX personas(gee_hash_set_new(G_TYPE_OBJECT, g_object_ref, g_object_unref, NULL, NULL, NULL, NULL, NULL, NULL), TRANSFER_REF); gee_collection_add(GEE_COLLECTION(personas.get()), persona.get()); FolksIndividualCXX individual(folks_individual_new(GEE_SET(personas.get())), TRANSFER_REF); m_addedSignal(individual); } m_isQuiescent = true; m_quiescenceSignal(); } catch (...) { Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/locale-factory.cpp0000644000373300001540000001773612326412403024760 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Common code for sorting and searching. */ #include "locale-factory.h" #include "folks.h" #include #include SE_BEGIN_CXX std::string SimpleE164::toString() const { std::ostringstream out; if (m_countryCode) { out << "+" << m_countryCode; } if (m_nationalNumber) { out << m_nationalNumber; } return out.str(); } bool LocaleFactory::Precomputed::operator == (const LocaleFactory::Precomputed &other) const { if (other.m_phoneNumbers.size() != m_phoneNumbers.size()) { return false; } PhoneNumbers::const_iterator ita = other.m_phoneNumbers.begin(); PhoneNumbers::const_iterator itb = m_phoneNumbers.begin(); while (ita != other.m_phoneNumbers.end()) { if (*ita != *itb) { return false; } ++ita; ++itb; } return true; } class Filter2StringVisitor : public boost::static_visitor { std::ostringstream m_out; public: void operator () (const std::string &str) { m_out << "'" << str << "'"; } void operator () (const std::vector &filter) { m_out << "["; for (size_t i = 0; i < filter.size(); i++) { if (i == 0) { m_out << " "; } else { m_out << ", "; } boost::apply_visitor(*this, filter[i]); } m_out << " ]"; } std::string toString() { return m_out.str(); } }; std::string LocaleFactory::Filter2String(const Filter_t &filter) { Filter2StringVisitor visitor; boost::apply_visitor(visitor, filter); return visitor.toString(); } template const V &getFilter(const LocaleFactory::Filter_t &filter, const char *expected) { const V *value = boost::get(&filter); if (!value) { throw std::runtime_error(StringPrintf("expected %s, got instead: %s", expected, LocaleFactory::Filter2String(filter).c_str())); } return *value; } const std::string &LocaleFactory::getFilterString(const Filter_t &filter, const char *expected) { return getFilter(filter, expected); } const std::vector &LocaleFactory::getFilterArray(const Filter_t &filter, const char *expected) { return getFilter< std::vector >(filter, expected); } void LocaleFactory::handleFilterException(const Filter_t &filter, int level, const std::string *file, int line) { std::string what; Exception::handle(what, HANDLE_EXCEPTION_NO_ERROR); what = StringPrintf("%s nesting level %d: %s\n%s", level == 0 ? "Error while parsing a search filter.\nMost specific term comes last, then the error message:\n" : "", level, Filter2String(filter).c_str(), what.c_str()); if (file) { throw Exception(*file, line, what); } else { throw std::runtime_error(what); } } class LogicFilter : public IndividualFilter { protected: std::vector< boost::shared_ptr > m_subFilter; public: void addFilter(const boost::shared_ptr &filter) { m_subFilter.push_back(filter); } }; class OrFilter : public LogicFilter { public: virtual bool matches(const IndividualData &data) const { BOOST_FOREACH (const boost::shared_ptr &filter, m_subFilter) { if (filter->matches(data)) { return true; } } return false; } }; class AndFilter : public LogicFilter { public: virtual bool matches(const IndividualData &data) const { BOOST_FOREACH (const boost::shared_ptr &filter, m_subFilter) { if (!filter->matches(data)) { return false; } } // Does not match if empty, just like 'or'. return !m_subFilter.empty(); } }; boost::shared_ptr LocaleFactory::createFilter(const Filter_t &filter, int level) { boost::shared_ptr res; try { const std::vector &terms = getFilterArray(filter, "array of terms"); if (terms.empty()) { res.reset(new MatchAll()); return res; } // Array of arrays? // May contain search parameters ('limit') and one // filter expression. if (boost::get< std::vector >(&terms[0])) { boost::shared_ptr params; BOOST_FOREACH (const Filter_t &subfilter, terms) { boost::shared_ptr tmp = createFilter(subfilter, level + 1); if (dynamic_cast(tmp.get())) { // New parameter overwrites old one. If we ever // want to support more than one parameter, we // need to be more selective here. params = tmp; } else if (!res) { res = tmp; } else { SE_THROW("Filter can only be combined with other filters inside a logical operation."); } } if (params) { if (res) { // Copy parameter(s) to real filter. res->setMaxResults(params->getMaxResults()); } else { // Or just use it as-is because no filter was // given. It'll work like MatchAll. res = params; } } } else { // Not an array, so must be string. const std::string &operation = getFilterString(terms[0], "operation name"); if (operation == "limit") { // Level 0 is the [] containing the ['limit', ...]. // We thus expect it at level 1. if (level != 1) { SE_THROW("'limit' parameter only allowed at top level."); } if (terms.size() != 2) { SE_THROW("'limit' needs exactly one parameter."); } const std::string &limit = getFilterString(terms[1], "'filter' value as string"); int maxResults = boost::lexical_cast(limit); res.reset(new ParamFilter()); res->setMaxResults(maxResults); } else if (operation == "or" || operation == "and") { boost::shared_ptr logicFilter(operation == "or" ? static_cast(new OrFilter()) : static_cast(new AndFilter())); for (size_t i = 1; i < terms.size(); i++ ) { logicFilter->addFilter(createFilter(terms[i], level + 1)); } res = logicFilter; } else { SE_THROW(StringPrintf("Unknown operation '%s'", operation.c_str())); } } } catch (const Exception &ex) { handleFilterException(filter, level, &ex.m_file, ex.m_line); } catch (...) { handleFilterException(filter, level, NULL, 0); } return res; } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/merge-view.cpp0000644000373300001540000001747012326412403024116 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "merge-view.h" #include SE_BEGIN_CXX MergeView::MergeView(const boost::shared_ptr &view, const Searches &searches, const boost::shared_ptr &locale, const boost::shared_ptr &compare) : m_view(view), m_searches(searches), m_locale(locale), m_compare(compare) { } void MergeView::init(const boost::shared_ptr &self) { m_self = self; } boost::shared_ptr MergeView::create(const boost::shared_ptr &view, const Searches &searches, const boost::shared_ptr &locale, const boost::shared_ptr &compare) { boost::shared_ptr merge(new MergeView(view, searches, locale, compare)); merge->init(merge); return merge; } void MergeView::doStart() { BOOST_FOREACH (const Searches::value_type &search, m_searches) { search->m_quiescenceSignal.connect(boost::bind(&MergeView::edsDone, m_self, std::string(search->getName()))); search->m_addedSignal.connect(boost::bind(&MergeView::addEDSIndividual, m_self, _1)); search->start(); } m_view->m_quiescenceSignal.connect(boost::bind(&MergeView::viewReady, m_self)); m_view->start(); if (m_view->isQuiescent()) { // Switch to view directly. viewReady(); } } void MergeView::addEDSIndividual(const FolksIndividualCXX &individual) throw () { try { Entries::auto_type data(new IndividualData); data->init(m_compare.get(), m_locale.get(), individual); // Binary search to find insertion point. Entries::iterator it = std::lower_bound(m_entries.begin(), m_entries.end(), *data, IndividualDataCompare(m_compare)); size_t index = it - m_entries.begin(); it = m_entries.insert(it, data.release()); SE_LOG_DEBUG(NULL, "%s: added at #%ld/%ld", getName(), (long)index, (long)m_entries.size()); m_addedSignal(index, *it); } catch (...) { Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } } void MergeView::edsDone(const std::string &uuid) throw () { try { SE_LOG_DEBUG(NULL, "%s: %s is done", getName(), uuid.c_str()); BOOST_FOREACH (const Searches::value_type &search, m_searches) { if (!search->isQuiescent()) { SE_LOG_DEBUG(NULL, "%s: still waiting for %s", getName(), search->getName()); return; } } SE_LOG_DEBUG(NULL, "%s: all EDS searches done, %s", getName(), m_viewReady ? "folks also done" : "still waiting for folks, send quiescent now"); if (!m_viewReady) { // folks is still busy, this may take a while. Therefore // flush current status. // // TODO (?): it would be good to have a way to signal "done // for now, better results coming" to the client. As // things stand at the moment, it might conclude that // incomplete resuls from EDS is all that there is to show // to the user. Not much of a problem, though, if the // quality of those results is good. m_quiescenceSignal(); } } catch (...) { Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } } static void GetPersonaUIDs(FolksIndividual *individual, std::set &uids) { GeeCollCXX personas(folks_individual_get_personas(individual), ADD_REF); BOOST_FOREACH (FolksPersona *persona, personas) { // Includes backend, address book, and UID inside address book. uids.insert(folks_persona_get_uid(persona)); } } static bool SamePersonas(FolksIndividual *a, FolksIndividual *b) { std::set a_uids, b_uids; GetPersonaUIDs(a, a_uids); GetPersonaUIDs(b, b_uids); if (a_uids.size() == b_uids.size()) { BOOST_FOREACH (const std::string &uid, a_uids) { if (b_uids.find(uid) == b_uids.end()) { break; } } return true; } return false; } void MergeView::viewReady() throw () { try { if (!m_viewReady) { m_viewReady = true; SE_LOG_DEBUG(NULL, "%s: folks is ready: %d entries from EDS, %d from folks", getName(), (int)m_entries.size(), (int)m_view->size()); // Change signals which transform the current view into the final one. int index; for (index = 0; index < m_view->size() && index < (int)m_entries.size(); index++) { const IndividualData &oldData = m_entries[index]; const IndividualData *newData = m_view->getContact(index); // Minimize changes if old and new data are // identical. Instead of checking all data, assume // that if the underlying contacts are identical, then // so must be the data. if (!SamePersonas(oldData.m_individual, newData->m_individual)) { SE_LOG_DEBUG(NULL, "%s: entry #%d modified", getName(), index); m_modifiedSignal(index, *newData); } } for (; index < m_view->size(); index++) { const IndividualData *newData = m_view->getContact(index); SE_LOG_DEBUG(NULL, "%s: entry #%d added", getName(), index); m_addedSignal(index, *newData); } // Index stays the same when removing, because the following // entries get shifted. int removeAt = index; for (; index < (int)m_entries.size(); index++) { const IndividualData &oldData = m_entries[index]; SE_LOG_DEBUG(NULL, "%s: entry #%d removed", getName(), index); m_removedSignal(removeAt, oldData); } // Free resources which are no longer needed. // The expectation is that this will abort loading // from EDS. try { m_searches.clear(); m_entries.clear(); } catch (...) { Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } SE_LOG_DEBUG(NULL, "%s: switched to folks, quiescent", getName()); m_quiescenceSignal(); } } catch (...) { Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/individual-traits.cpp0000664000373300001540000015143512355040516025511 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The D-Bus IPC binding for folks.h. Maps FolksIndividual to and * from the D-Bus dict described in pim-manager-api.txt. */ #include "individual-traits.h" #include "persona-details.h" #include "folks.h" SE_GLIB_TYPE(GDateTime, g_date_time) SE_GOBJECT_TYPE(GTimeZone) SE_GOBJECT_TYPE(GObject) SE_BEGIN_CXX typedef GValueDynTypedCXX GValueDateTimeCXX; static const char * const CONTACT_HASH_FULL_NAME = "full-name"; static const char * const CONTACT_HASH_NICKNAME = "nickname"; static const char * const CONTACT_HASH_STRUCTURED_NAME = "structured-name"; static const char * const CONTACT_HASH_STRUCTURED_NAME_FAMILY = "family"; static const char * const CONTACT_HASH_STRUCTURED_NAME_GIVEN = "given"; static const char * const CONTACT_HASH_STRUCTURED_NAME_ADDITIONAL = "additional"; static const char * const CONTACT_HASH_STRUCTURED_NAME_PREFIXES = "prefixes"; static const char * const CONTACT_HASH_STRUCTURED_NAME_SUFFIXES = "suffixes"; static const char * const CONTACT_HASH_ALIAS = "alias"; static const char * const CONTACT_HASH_PHOTO = "photo"; static const char * const CONTACT_HASH_BIRTHDAY = "birthday"; static const char * const CONTACT_HASH_LOCATION = "location"; static const char * const CONTACT_HASH_EMAILS = "emails"; static const char * const CONTACT_HASH_PHONES = "phones"; static const char * const CONTACT_HASH_URLS = "urls"; static const char * const CONTACT_HASH_NOTES = "notes"; static const char * const CONTACT_HASH_ADDRESSES = "addresses"; static const char * const CONTACT_HASH_ADDRESSES_PO_BOX = "po-box"; static const char * const CONTACT_HASH_ADDRESSES_EXTENSION = "extension"; static const char * const CONTACT_HASH_ADDRESSES_STREET = "street"; static const char * const CONTACT_HASH_ADDRESSES_LOCALITY = "locality"; static const char * const CONTACT_HASH_ADDRESSES_REGION = "region"; static const char * const CONTACT_HASH_ADDRESSES_POSTAL_CODE = "postal-code"; static const char * const CONTACT_HASH_ADDRESSES_COUNTRY = "country"; static const char * const CONTACT_HASH_ROLES = "roles"; static const char * const CONTACT_HASH_ROLES_ORGANISATION = "organisation"; static const char * const CONTACT_HASH_ROLES_TITLE = "title"; static const char * const CONTACT_HASH_ROLES_ROLE = "role"; static const char * const CONTACT_HASH_GROUPS = "groups"; static const char * const CONTACT_HASH_SOURCE = "source"; static const char * const CONTACT_HASH_ID = "id"; static const char * const INDIVIDUAL_DICT = "a{sv}"; static const char * const INDIVIDUAL_DICT_ENTRY = "{sv}"; /** * Checks whether a certain value is the default value and thus * can be skipped when converting to D-Bus. * * class B provides additional type information, which is necessary * to check a GeeSet containing FolksRoleFieldDetails differently * than other GeeSets. */ template struct IsNonDefault { template static bool check(V value) { // Default version uses normal C/C++ rules, for example pointer non-NULL. // For bool and integer, the value will only be sent if true or non-zero. return value; } static bool check(const gchar *value) { // Don't send empty strings. return value && value[0]; } static bool check(GeeSet *value) { // Don't send empty sets. return value && gee_collection_get_size(GEE_COLLECTION(value)); } }; template <> struct IsNonDefault< GeeCollCXX > { static bool check(GeeSet *value) { // Don't send empty set and set which contains only empty roles. if (value) { BOOST_FOREACH (FolksRoleFieldDetails *value, GeeCollCXX(value, ADD_REF)) { FolksRole *role = static_cast(const_cast((folks_abstract_field_details_get_value(FOLKS_ABSTRACT_FIELD_DETAILS(value))))); if (IsNonDefault::check(folks_role_get_organisation_name(role)) || IsNonDefault::check(folks_role_get_title(role)) || IsNonDefault::check(folks_role_get_role(role))) { return true; } } } return false; } }; /** * Adds a dict entry to the builder, with 'key' as string key and the * result of 'get()' as value. */ template void SerializeFolks(GDBusCXX::builder_type &builder, O *obj, V (*get)(O *), const char *key) { if (!obj) { SE_THROW("casting to base class failed"); } V value = get(obj); if (IsNonDefault::check(value)) { g_variant_builder_open(&builder, G_VARIANT_TYPE(INDIVIDUAL_DICT_ENTRY)); // dict entry GDBusCXX::dbus_traits::append(builder, key); g_variant_builder_open(&builder, G_VARIANT_TYPE("v")); // variant GDBusCXX::dbus_traits::append(builder, value); g_variant_builder_close(&builder); // variant g_variant_builder_close(&builder); // dict entry } } template void SerializeFolks(GDBusCXX::builder_type &builder, O *obj, V (*get)(O *), B *, // dummy parameter, determines base type const char *key) { if (!obj) { SE_THROW("casting to base class failed"); } V value = get(obj); B coll(value, ADD_REF); if (IsNonDefault::check(value)) { g_variant_builder_open(&builder, G_VARIANT_TYPE(INDIVIDUAL_DICT_ENTRY)); // dict entry GDBusCXX::dbus_traits::append(builder, key); g_variant_builder_open(&builder, G_VARIANT_TYPE("v")); // variant GDBusCXX::dbus_traits::append(builder, coll); g_variant_builder_close(&builder); // variant g_variant_builder_close(&builder); // dict entry } } SE_END_CXX namespace GDBusCXX { template <> struct dbus_traits { static void append(builder_type &builder, FolksStructuredName *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE(INDIVIDUAL_DICT)); // dict SyncEvo::SerializeFolks(builder, value, folks_structured_name_get_family_name, CONTACT_HASH_STRUCTURED_NAME_FAMILY); SyncEvo::SerializeFolks(builder, value, folks_structured_name_get_given_name, CONTACT_HASH_STRUCTURED_NAME_GIVEN); SyncEvo::SerializeFolks(builder, value, folks_structured_name_get_additional_names, CONTACT_HASH_STRUCTURED_NAME_ADDITIONAL); SyncEvo::SerializeFolks(builder, value, folks_structured_name_get_prefixes, CONTACT_HASH_STRUCTURED_NAME_PREFIXES); SyncEvo::SerializeFolks(builder, value, folks_structured_name_get_suffixes, CONTACT_HASH_STRUCTURED_NAME_SUFFIXES); g_variant_builder_close(&builder); // dict } }; /** Path to icon (the expected case) or uninitialized string (not set or not a file). */ static InitStateString ExtractFilePath(GLoadableIcon *value) { if (value && G_IS_FILE_ICON(value)) { GFileIcon *fileIcon = G_FILE_ICON(value); GFile *file = g_file_icon_get_file(fileIcon); if (file) { PlainGStr uri(g_file_get_uri(file)); // Have a path. return InitStateString(uri.get(), true); } } // No path. return InitStateString(); } template <> struct dbus_traits { static void append(builder_type &builder, GLoadableIcon *value) { InitStateString path = ExtractFilePath(value); // EDS is expected to only work with URIs for the PHOTO // property, therefore we shouldn't get here without a valid // path. Either way, we need to store something. GDBusCXX::dbus_traits::append(builder, path.c_str()); } }; template <> struct dbus_traits { static void append(builder_type &builder, FolksPostalAddress *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE(INDIVIDUAL_DICT)); // dict SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_po_box, CONTACT_HASH_ADDRESSES_PO_BOX); SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_extension, CONTACT_HASH_ADDRESSES_EXTENSION); SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_street, CONTACT_HASH_ADDRESSES_STREET); SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_locality, CONTACT_HASH_ADDRESSES_LOCALITY); SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_region, CONTACT_HASH_ADDRESSES_REGION); SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_postal_code, CONTACT_HASH_ADDRESSES_POSTAL_CODE); SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_country, CONTACT_HASH_ADDRESSES_COUNTRY); // Not used by EDS. The tracker backend in folks was able to provide such a uid. // SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_address_format, CONTACT_HASH_ADDRESSES_FORMAT); // SyncEvo::SerializeFolks(builder, value, folks_postal_address_get_uid, "uid"); g_variant_builder_close(&builder); // dict } }; template <> struct dbus_traits { static void append(builder_type &builder, FolksRole *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE(INDIVIDUAL_DICT)); // dict // Other parts of ORG are not currently supported by libfolks. SyncEvo::SerializeFolks(builder, value, folks_role_get_organisation_name, CONTACT_HASH_ROLES_ORGANISATION); SyncEvo::SerializeFolks(builder, value, folks_role_get_title, CONTACT_HASH_ROLES_TITLE); SyncEvo::SerializeFolks(builder, value, folks_role_get_role, CONTACT_HASH_ROLES_ROLE); // Not used: // SyncEvo::SerializeFolks(builder, value, folks_role_get_uid, "uid"); g_variant_builder_close(&builder); // dict } }; // TODO: put into global header file static const char * const MANAGER_PREFIX = "pim-manager-"; template <> struct dbus_traits { static void append(builder_type &builder, FolksPersona *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE("(ss)")); // pair of peer ID and local ID const gchar *uid = folks_persona_get_uid(value); if (uid) { gchar *backend, *storeID, *personaID; folks_persona_split_uid(uid, &backend, &storeID, &personaID); PlainGStr tmp1(backend), tmp2(storeID), tmp3(personaID); if (boost::starts_with(storeID, MANAGER_PREFIX)) { dbus_traits::append(builder, storeID + strlen(MANAGER_PREFIX)); } else { // Must be the system address book. dbus_traits::append(builder, ""); } dbus_traits::append(builder, personaID); } else { dbus_traits::append(builder, ""); dbus_traits::append(builder, ""); } g_variant_builder_close(&builder); // pair } }; // Only use this with FolksAbstractFieldDetails instances where // the value is a string. template <> struct dbus_traits { static void append(builder_type &builder, FolksAbstractFieldDetails *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE("(sas)")); // pair of string and string list gconstpointer v = folks_abstract_field_details_get_value(value); dbus_traits::append(builder, v ? (const char *)v : ""); g_variant_builder_open(&builder, G_VARIANT_TYPE("as")); GeeMultiMap *map = folks_abstract_field_details_get_parameters(value); if (map) { GeeCollCXX coll(gee_multi_map_get(map, FOLKS_ABSTRACT_FIELD_DETAILS_PARAM_TYPE), TRANSFER_REF); BOOST_FOREACH (const char *type, coll) { dbus_traits::append(builder, type); } } g_variant_builder_close(&builder); // string list g_variant_builder_close(&builder); // pair } }; template <> struct dbus_traits { static void append(builder_type &builder, FolksPostalAddressFieldDetails *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE(StringPrintf("(%sas)", INDIVIDUAL_DICT).c_str())); // pair of dict and string list FolksAbstractFieldDetails *fieldDetails = FOLKS_ABSTRACT_FIELD_DETAILS(value); gconstpointer v = folks_abstract_field_details_get_value(fieldDetails); dbus_traits::append(builder, static_cast(const_cast(v))); g_variant_builder_open(&builder, G_VARIANT_TYPE("as")); GeeMultiMap *map = folks_abstract_field_details_get_parameters(fieldDetails); if (map) { GeeCollCXX coll(gee_multi_map_get(map, "type"), TRANSFER_REF); BOOST_FOREACH (const char *type, coll) { dbus_traits::append(builder, type); } } g_variant_builder_close(&builder); // string list g_variant_builder_close(&builder); // pair } }; template <> struct dbus_traits { static void append(builder_type &builder, FolksNoteFieldDetails *value) { FolksAbstractFieldDetails *fieldDetails = FOLKS_ABSTRACT_FIELD_DETAILS(value); gconstpointer v = folks_abstract_field_details_get_value(fieldDetails); dbus_traits::append(builder, static_cast(v)); // plain string // Ignore parameters. LANGUAGE is hardly ever set. } }; template <> struct dbus_traits { static void append(builder_type &builder, FolksRoleFieldDetails *value) { FolksAbstractFieldDetails *fieldDetails = FOLKS_ABSTRACT_FIELD_DETAILS(value); gconstpointer v = folks_abstract_field_details_get_value(fieldDetails); dbus_traits::append(builder, static_cast(const_cast((v)))); // Ignore parameters. LANGUAGE is hardly ever set. } }; // Used for types like V = FolksEmailFieldDetails * template struct dbus_traits< GeeCollCXX > { static void append(builder_type &builder, const GeeCollCXX &collection) { g_variant_builder_open(&builder, G_VARIANT_TYPE("av")); // array of variants BOOST_FOREACH (V value, collection) { g_variant_builder_open(&builder, G_VARIANT_TYPE("v")); // variant dbus_traits::append(builder, value); g_variant_builder_close(&builder); // variant } g_variant_builder_close(&builder); // array of variants } }; template <> struct dbus_traits { static void append(builder_type &builder, GDateTime *value) { // Extract local date from UTC date + time + UTC offset. // // The libfolks EDS backend does date + 00:00 in local time, // then converts to UTC. We need to hard-code the stripping // of the time. Folks should make it easier to extract the date, see // https://bugzilla.gnome.org/show_bug.cgi?id=684905 // // TODO: if folks doesn't get fixed, then we should cache the // GTimeZone local = g_time_zone_new_local() // and use that throughout the runtime of the process, like // folks-eds does. GDateTimeCXX local(g_date_time_to_local(value), TRANSFER_REF); gint year, month, day; g_date_time_get_ymd(local.get(), &year, &month, &day); g_variant_builder_open(&builder, G_VARIANT_TYPE("(iii)")); // tuple with year, month, day GDBusCXX::dbus_traits::append(builder, year); GDBusCXX::dbus_traits::append(builder, month); GDBusCXX::dbus_traits::append(builder, day); g_variant_builder_close(&builder); // tuple } }; template <> struct dbus_traits { static void append(builder_type &builder, FolksLocation *value) { g_variant_builder_open(&builder, G_VARIANT_TYPE("(dd)")); // tuple with latitude + longitude GDBusCXX::dbus_traits::append(builder, value->latitude); GDBusCXX::dbus_traits::append(builder, value->longitude); g_variant_builder_close(&builder); // tuple } }; } // namespace GDBusCXX SE_BEGIN_CXX static guint FolksAbstractFieldDetailsHash(gconstpointer v, void *d) { return folks_abstract_field_details_hash((FolksAbstractFieldDetails *)v); } static gboolean FolksAbstractFieldDetailsEqual(gconstpointer a, gconstpointer b, void *d) { return folks_abstract_field_details_equal((FolksAbstractFieldDetails *)a, (FolksAbstractFieldDetails *)b); } /** * Copy from D-Bus into a type derived from FolksAbstractFieldDetails, * including type flags. */ static void DBus2AbstractField(GDBusCXX::ExtractArgs &context, GVariantIter &valueIter, PersonaDetails &details, GType detailType, FolksPersonaDetail detail, FolksAbstractFieldDetails *(*fieldNew)(const gchar *, GeeMultiMap *)) { // type of emails, urls, etc. typedef std::vector< std::pair< std::string, std::vector > > Details_t; Details_t value; GDBusCXX::dbus_traits::get(context, valueIter, value); GeeHashSetCXX set(gee_hash_set_new(detailType, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), TRANSFER_REF); BOOST_FOREACH (const Details_t::value_type &entry, value) { const Details_t::value_type::first_type &val = entry.first; const Details_t::value_type::second_type &flags = entry.second; FolksAbstractFieldDetailsCXX field(fieldNew(val.c_str(), NULL), TRANSFER_REF); BOOST_FOREACH (const std::string &type, flags) { folks_abstract_field_details_add_parameter(field.get(), FOLKS_ABSTRACT_FIELD_DETAILS_PARAM_TYPE, type.c_str()); } gee_collection_add(GEE_COLLECTION(set.get()), field.get()); } g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(detail)), new GValueObjectCXX(set.get())); } /** * Copy from D-Bus into a type derived from FolksAbstractFieldDetails, * excluding type flags. */ static void DBus2SimpleAbstractField(GDBusCXX::ExtractArgs &context, GVariantIter &valueIter, PersonaDetails &details, GType detailType, FolksPersonaDetail detail, FolksAbstractFieldDetails *(*fieldNew)(const gchar *, GeeMultiMap *)) { // type of notes typedef std::vector Details_t; Details_t value; GDBusCXX::dbus_traits::get(context, valueIter, value); GeeHashSetCXX set(gee_hash_set_new(detailType, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), TRANSFER_REF); BOOST_FOREACH (const std::string &val, value) { FolksAbstractFieldDetailsCXX field(fieldNew(val.c_str(), NULL), TRANSFER_REF); gee_collection_add(GEE_COLLECTION(set.get()), field.get()); } g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(detail)), new GValueObjectCXX(set.get())); } /** * Copy from D-Bus into FolksRoleFieldDetails. */ static void DBus2Role(GDBusCXX::ExtractArgs &context, GVariantIter &valueIter, PersonaDetails &details) { // type of role typedef std::vector Details_t; Details_t value; GDBusCXX::dbus_traits::get(context, valueIter, value); GeeHashSetCXX set(gee_hash_set_new(FOLKS_TYPE_ROLE_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), TRANSFER_REF); BOOST_FOREACH (const StringMap &entry, value) { FolksRoleCXX role(folks_role_new(NULL, NULL, NULL), TRANSFER_REF); BOOST_FOREACH (const StringPair &aspect, entry) { const std::string &k = aspect.first; const std::string &v = aspect.second; if (k == CONTACT_HASH_ROLES_ORGANISATION) { folks_role_set_organisation_name(role, v.c_str()); } else if (k == CONTACT_HASH_ROLES_TITLE) { folks_role_set_title(role, v.c_str()); } else if (k == CONTACT_HASH_ROLES_ROLE) { folks_role_set_role(role, v.c_str()); } } FolksRoleFieldDetailsCXX field(folks_role_field_details_new(role.get(), NULL), TRANSFER_REF); gee_collection_add(GEE_COLLECTION(set.get()), field.get()); } g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_ROLES)), new GValueObjectCXX(set.get())); } /** * Copy from D-Bus into a set of strings. */ static void DBus2Groups(GDBusCXX::ExtractArgs &context, GVariantIter &valueIter, PersonaDetails &details) { std::list value; GDBusCXX::dbus_traits::get(context, valueIter, value); GeeHashSetCXX set(gee_hash_set_new(G_TYPE_STRING, (GBoxedCopyFunc)g_strdup, g_free, NULL, NULL, NULL, NULL, NULL, NULL), TRANSFER_REF); BOOST_FOREACH(const std::string &entry, value) { gee_collection_add(GEE_COLLECTION(set.get()), entry.c_str()); } g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_GROUPS)), new GValueObjectCXX(set.get())); } /** * Copy from D-Bus into a FolksAddressFieldDetails. */ static void DBus2Addr(GDBusCXX::ExtractArgs &context, GVariantIter &valueIter, PersonaDetails &details) { // type of CONTACT_HASH_ADDRESSES typedef std::vector< std::pair< StringMap, std::vector > > Details_t; Details_t value; GDBusCXX::dbus_traits::get(context, valueIter, value); GeeHashSetCXX set(gee_hash_set_new(FOLKS_TYPE_POSTAL_ADDRESS_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), TRANSFER_REF); BOOST_FOREACH (const Details_t::value_type &entry, value) { const StringMap &fields = entry.first; const std::vector &flags = entry.second; FolksPostalAddressCXX address(folks_postal_address_new(GetWithDef(fields, CONTACT_HASH_ADDRESSES_PO_BOX).c_str(), GetWithDef(fields, CONTACT_HASH_ADDRESSES_EXTENSION).c_str(), GetWithDef(fields, CONTACT_HASH_ADDRESSES_STREET).c_str(), GetWithDef(fields, CONTACT_HASH_ADDRESSES_LOCALITY).c_str(), GetWithDef(fields, CONTACT_HASH_ADDRESSES_REGION).c_str(), GetWithDef(fields, CONTACT_HASH_ADDRESSES_POSTAL_CODE).c_str(), GetWithDef(fields, CONTACT_HASH_ADDRESSES_COUNTRY).c_str(), NULL /* address format */, NULL /* uid */), TRANSFER_REF); FolksAbstractFieldDetailsCXX field(FOLKS_ABSTRACT_FIELD_DETAILS(folks_postal_address_field_details_new(address.get(), NULL)), TRANSFER_REF); BOOST_FOREACH (const std::string &type, flags) { folks_abstract_field_details_add_parameter(field.get(), FOLKS_ABSTRACT_FIELD_DETAILS_PARAM_TYPE, type.c_str()); } gee_collection_add(GEE_COLLECTION(set.get()), field.get()); } g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_POSTAL_ADDRESSES)), new GValueObjectCXX(set.get())); } static FolksAbstractFieldDetails *my_folks_note_field_details_new_wrapper(const gchar *value, GeeMultiMap *parameters) { return FOLKS_ABSTRACT_FIELD_DETAILS(folks_note_field_details_new(value, parameters, NULL)); } void DBus2PersonaDetails(GDBusCXX::ExtractArgs &context, GDBusCXX::reader_type &iter, PersonaDetails &details) { GDBusCXX::GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_ARRAY)) { SE_THROW("D-Bus contact hash: unexpected content"); } GVariantIter contIter; GDBusCXX::GVariantCXX child; g_variant_iter_init(&contIter, var); // array while((child = g_variant_iter_next_value(&contIter)) != NULL) { GVariantIter childIter; g_variant_iter_init(&childIter, child); // dict entry std::string key; GDBusCXX::dbus_traits::get(context, childIter, key); GDBusCXX::GVariantCXX valueVarient(g_variant_iter_next_value(&childIter)); if (valueVarient == NULL || !g_variant_type_equal(g_variant_get_type(valueVarient), G_VARIANT_TYPE_VARIANT)) { SE_THROW("D-Bus contact hash entry: value must be variant"); } GVariantIter valueIter; g_variant_iter_init(&valueIter, valueVarient); if (key == CONTACT_HASH_FULL_NAME) { std::string value; GDBusCXX::dbus_traits::get(context, valueIter, value); g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_FULL_NAME)), new GValueStringCXX(value.c_str())); } else if (key == CONTACT_HASH_STRUCTURED_NAME) { StringMap value; GDBusCXX::dbus_traits::get(context, valueIter, value); g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_STRUCTURED_NAME)), new GValueObjectCXX(folks_structured_name_new(GetWithDef(value, CONTACT_HASH_STRUCTURED_NAME_FAMILY).c_str(), GetWithDef(value, CONTACT_HASH_STRUCTURED_NAME_GIVEN).c_str(), GetWithDef(value, CONTACT_HASH_STRUCTURED_NAME_ADDITIONAL).c_str(), GetWithDef(value, CONTACT_HASH_STRUCTURED_NAME_PREFIXES).c_str(), GetWithDef(value, CONTACT_HASH_STRUCTURED_NAME_SUFFIXES).c_str()), TRANSFER_REF)); } else if (key == CONTACT_HASH_PHOTO) { std::string value; GDBusCXX::dbus_traits::get(context, valueIter, value); GFileCXX file(g_file_new_for_uri(value.c_str()), TRANSFER_REF); g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_AVATAR)), new GValueObjectCXX(g_file_icon_new(file.get()), TRANSFER_REF)); } else if (key == CONTACT_HASH_BIRTHDAY) { boost::tuple value; GDBusCXX::dbus_traits::get(context, valueIter, value); GDateTimeCXX local(g_date_time_new_local(value.get<0>(), value.get<1>(), value.get<2>(), 0, 0, 0), TRANSFER_REF); g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_BIRTHDAY)), new GValueDateTimeCXX(g_date_time_to_utc(local.get()), TRANSFER_REF)); } else if (key == CONTACT_HASH_LOCATION) { boost::tuple value; GDBusCXX::dbus_traits::get(context, valueIter, value); FolksLocationCXX location(folks_location_new(value.get<0>(), value.get<1>()), TRANSFER_REF); g_hash_table_insert(details.get(), const_cast(folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_LOCATION)), new GValueObjectCXX(location.get())); } else if (key == CONTACT_HASH_EMAILS) { DBus2AbstractField(context, valueIter, details, FOLKS_TYPE_EMAIL_FIELD_DETAILS, FOLKS_PERSONA_DETAIL_EMAIL_ADDRESSES, reinterpret_cast(folks_email_field_details_new)); } else if (key == CONTACT_HASH_PHONES) { DBus2AbstractField(context, valueIter, details, FOLKS_TYPE_PHONE_FIELD_DETAILS, FOLKS_PERSONA_DETAIL_PHONE_NUMBERS, reinterpret_cast(folks_phone_field_details_new)); } else if (key == CONTACT_HASH_URLS) { DBus2AbstractField(context, valueIter, details, FOLKS_TYPE_URL_FIELD_DETAILS, FOLKS_PERSONA_DETAIL_URLS, reinterpret_cast(folks_url_field_details_new)); } else if (key == CONTACT_HASH_NOTES) { DBus2SimpleAbstractField(context, valueIter, details, FOLKS_TYPE_NOTE_FIELD_DETAILS, FOLKS_PERSONA_DETAIL_NOTES, my_folks_note_field_details_new_wrapper); } else if (key == CONTACT_HASH_ROLES) { DBus2Role(context, valueIter, details); } else if (key == CONTACT_HASH_GROUPS) { DBus2Groups(context, valueIter, details); } else if (key == CONTACT_HASH_ADDRESSES) { DBus2Addr(context, valueIter, details); } } } struct Pending { Pending(const Result &result, FolksPersona *persona) : m_result(result), m_persona(persona, ADD_REF), m_current(0) {} Result m_result; FolksPersonaCXX m_persona; typedef boost::function AsyncDone; typedef boost::function Prepare; typedef boost::tuple > Change; typedef std::vector Changes; Changes m_changes; size_t m_current; }; static bool GeeCollectionEqual(GeeCollection *a, GeeCollection *b) { return gee_collection_get_size(a) == gee_collection_get_size(b) && gee_collection_contains_all(a, b); } /** * Gets called by event loop. All errors must be reported back to the caller. */ static void Details2PersonaStep(const GError *gerror, const boost::shared_ptr &pending) throw () { try { if (gerror) { GErrorCXX::throwError(SE_HERE, "modifying property", gerror); } size_t current = pending->m_current++; if (current < pending->m_changes.size()) { // send next change, as determined earlier Pending::Change &change = pending->m_changes[current]; SE_LOG_DEBUG(NULL, "modification step %d/%d: %s", (int)current, (int)pending->m_changes.size(), boost::get<1>(change)); boost::get<0>(change)(new Pending::AsyncDone(boost::bind(Details2PersonaStep, _1, pending))); } else { pending->m_result.done(); } } catch (...) { // Tell caller about specific error. pending->m_result.failed(); } } void Details2Persona(const Result &result, const PersonaDetails &details, FolksPersona *persona) { boost::shared_ptr pending(new Pending(result, persona)); #define PUSH_CHANGE(_prepare) \ SE_LOG_DEBUG(NULL, "queueing new change: %s", #_prepare); \ pending->m_changes.push_back(Pending::Change(boost::bind(_prepare, \ details, \ value, \ SYNCEVO_GLIB_CALL_ASYNC_CXX(_prepare)::handleGLibResult, \ _1), \ #_prepare, \ tracker)) const GValue *gvalue; boost::shared_ptr tracker; gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_FULL_NAME))); { const gchar *value; if (gvalue) { value = g_value_get_string(gvalue); tracker = boost::shared_ptr(g_strdup(value), g_free); } else { value = NULL; } FolksNameDetails *details = FOLKS_NAME_DETAILS(persona); if (g_strcmp0(value, folks_name_details_get_full_name(details))) { PUSH_CHANGE(folks_name_details_change_full_name); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_STRUCTURED_NAME))); { FolksStructuredName *value; if (gvalue) { value = FOLKS_STRUCTURED_NAME(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(folks_structured_name_new("", "", "", "", ""), g_object_unref); value = static_cast(tracker.get()); } FolksNameDetails *details = FOLKS_NAME_DETAILS(persona); if (!folks_structured_name_equal(value, folks_name_details_get_structured_name(details))) { PUSH_CHANGE(folks_name_details_change_structured_name); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_AVATAR))); { FolksAvatarDetails *details = FOLKS_AVATAR_DETAILS(persona); GLoadableIcon *value; if (gvalue) { value = G_LOADABLE_ICON(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(); value = NULL; } InitStateString newPath = GDBusCXX::ExtractFilePath(value); InitStateString oldPath = GDBusCXX::ExtractFilePath(folks_avatar_details_get_avatar(details)); if (newPath.wasSet() != oldPath.wasSet() || newPath != oldPath) { PUSH_CHANGE(folks_avatar_details_change_avatar); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_BIRTHDAY))); { GDateTime *value; if (gvalue) { value = static_cast(g_value_get_boxed(gvalue)); tracker = boost::shared_ptr(g_date_time_ref(value), g_date_time_unref); } else { tracker = boost::shared_ptr(); value = NULL; } FolksBirthdayDetails *details = FOLKS_BIRTHDAY_DETAILS(persona); GDateTime *old = folks_birthday_details_get_birthday(details); if ((value == NULL && old != NULL) || (value != NULL && old == NULL) || !g_date_time_equal(value, old)) { PUSH_CHANGE(folks_birthday_details_change_birthday); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_LOCATION))); { FolksLocation *value; if (gvalue) { value = static_cast(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(); value = NULL; } FolksLocationDetails *details = FOLKS_LOCATION_DETAILS(persona); FolksLocation *old = folks_location_details_get_location(details); if ((value == NULL && old != NULL) || (value != NULL && old == NULL) || (value && old && (value->latitude != old->latitude || value->longitude != old->longitude))) { PUSH_CHANGE(folks_location_details_change_location); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_EMAIL_ADDRESSES))); { GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(FOLKS_TYPE_EMAIL_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksEmailDetails *details = FOLKS_EMAIL_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_email_details_get_email_addresses(details)))) { PUSH_CHANGE(folks_email_details_change_email_addresses); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_PHONE_NUMBERS))); { GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(FOLKS_TYPE_PHONE_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksPhoneDetails *details = FOLKS_PHONE_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_phone_details_get_phone_numbers(details)))) { PUSH_CHANGE(folks_phone_details_change_phone_numbers); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_URLS))); { GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(FOLKS_TYPE_URL_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksUrlDetails *details = FOLKS_URL_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_url_details_get_urls(details)))) { PUSH_CHANGE(folks_url_details_change_urls); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_NOTES))); { // At the moment the comparison fails and tiggers a write on each update?! GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(FOLKS_TYPE_NOTE_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksNoteDetails *details = FOLKS_NOTE_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_note_details_get_notes(details)))) { PUSH_CHANGE(folks_note_details_change_notes); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_ROLES))); { GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(FOLKS_TYPE_ROLE_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksRoleDetails *details = FOLKS_ROLE_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_role_details_get_roles(details)))) { PUSH_CHANGE(folks_role_details_change_roles); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_GROUPS))); { GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(G_TYPE_STRING, (GBoxedCopyFunc)g_strdup, g_free, NULL, NULL, NULL, NULL, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksGroupDetails *details = FOLKS_GROUP_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_group_details_get_groups(details)))) { PUSH_CHANGE(folks_group_details_change_groups); } } gvalue = static_cast(g_hash_table_lookup(details.get(), folks_persona_store_detail_key(FOLKS_PERSONA_DETAIL_POSTAL_ADDRESSES))); { GeeSet *value; if (gvalue) { value = GEE_SET(g_value_get_object(gvalue)); tracker = boost::shared_ptr(g_object_ref(value), g_object_unref); } else { tracker = boost::shared_ptr(gee_hash_set_new(FOLKS_TYPE_POSTAL_ADDRESS_FIELD_DETAILS, g_object_ref, g_object_unref, FolksAbstractFieldDetailsHash, NULL, NULL, FolksAbstractFieldDetailsEqual, NULL, NULL), g_object_unref); value = static_cast(tracker.get()); } FolksPostalAddressDetails *details = FOLKS_POSTAL_ADDRESS_DETAILS(persona); if (!GeeCollectionEqual(GEE_COLLECTION(value), GEE_COLLECTION(folks_postal_address_details_get_postal_addresses(details)))) { PUSH_CHANGE(folks_postal_address_details_change_postal_addresses); } } Details2PersonaStep(NULL, pending); } void FolksIndividual2DBus(const FolksIndividualCXX &individual, GDBusCXX::builder_type &builder) { g_variant_builder_open(&builder, G_VARIANT_TYPE(INDIVIDUAL_DICT)); // dict FolksNameDetails *name = FOLKS_NAME_DETAILS(individual.get()); SerializeFolks(builder, name, folks_name_details_get_full_name, CONTACT_HASH_FULL_NAME); SerializeFolks(builder, name, folks_name_details_get_nickname, CONTACT_HASH_NICKNAME); SerializeFolks(builder, name, folks_name_details_get_structured_name, CONTACT_HASH_STRUCTURED_NAME); // gconstpointer folks_abstract_field_details_get_value (FolksAbstractFieldDetails* self); FolksAliasDetails *alias = FOLKS_ALIAS_DETAILS(individual.get()); SerializeFolks(builder, alias, folks_alias_details_get_alias, CONTACT_HASH_ALIAS); FolksAvatarDetails *avatar = FOLKS_AVATAR_DETAILS(individual.get()); SerializeFolks(builder, avatar, folks_avatar_details_get_avatar, CONTACT_HASH_PHOTO); FolksBirthdayDetails *birthday = FOLKS_BIRTHDAY_DETAILS(individual.get()); SerializeFolks(builder, birthday, folks_birthday_details_get_birthday, CONTACT_HASH_BIRTHDAY); // const gchar* folks_birthday_details_get_calendar_event_id (FolksBirthdayDetails* self); FolksLocationDetails *location = FOLKS_LOCATION_DETAILS(individual.get()); SerializeFolks(builder, location, folks_location_details_get_location, CONTACT_HASH_LOCATION); FolksEmailDetails *emails = FOLKS_EMAIL_DETAILS(individual.get()); SerializeFolks(builder, emails, folks_email_details_get_email_addresses, (GeeCollCXX*)NULL, CONTACT_HASH_EMAILS); FolksPhoneDetails *phones = FOLKS_PHONE_DETAILS(individual.get()); SerializeFolks(builder, phones, folks_phone_details_get_phone_numbers, (GeeCollCXX*)NULL, CONTACT_HASH_PHONES); FolksUrlDetails *urls = FOLKS_URL_DETAILS(individual.get()); SerializeFolks(builder, urls, folks_url_details_get_urls, (GeeCollCXX*)NULL, CONTACT_HASH_URLS); // Doesn't work like this, folks_im_details_get_im_addresses returns // a GeeMultiMap, not a GeeList. Not required anyway. // FolksImDetails *im = FOLKS_IM_DETAILS(individual.get()); // SerializeFolks(builder, im, folks_im_details_get_im_addresses, // (GeeCollCXX*)NULL, "im"); FolksNoteDetails *notes = FOLKS_NOTE_DETAILS(individual.get()); SerializeFolks(builder, notes, folks_note_details_get_notes, (GeeCollCXX*)NULL, CONTACT_HASH_NOTES); FolksPostalAddressDetails *postal = FOLKS_POSTAL_ADDRESS_DETAILS(individual.get()); SerializeFolks(builder, postal, folks_postal_address_details_get_postal_addresses, (GeeCollCXX*)NULL, CONTACT_HASH_ADDRESSES); FolksRoleDetails *roles = FOLKS_ROLE_DETAILS(individual.get()); SerializeFolks(builder, roles, folks_role_details_get_roles, (GeeCollCXX*)NULL, CONTACT_HASH_ROLES); FolksGroupDetails *groups = FOLKS_GROUP_DETAILS(individual.get()); SerializeFolks(builder, groups, folks_group_details_get_groups, (GeeStringCollection*)NULL, CONTACT_HASH_GROUPS); SerializeFolks(builder, individual.get(), folks_individual_get_personas, (GeeCollCXX*)NULL, CONTACT_HASH_SOURCE); SerializeFolks(builder, individual.get(), folks_individual_get_id, CONTACT_HASH_ID); #if 0 // Not exposed via D-Bus. FolksGender folks_gender_details_get_gender (FolksGenderDetails* self); GeeMultiMap* folks_web_service_details_get_web_service_addresses (FolksWebServiceDetails* self); guint folks_interaction_details_get_im_interaction_count (FolksInteractionDetails* self); GDateTime* folks_interaction_details_get_last_im_interaction_datetime (FolksInteractionDetails* self); guint folks_interaction_details_get_call_interaction_count (FolksInteractionDetails* self); GDateTime* folks_interaction_details_get_last_call_interaction_datetime (FolksInteractionDetails* self); GeeSet* folks_local_id_details_get_local_ids (FolksLocalIdDetails* self); const gchar* folks_presence_details_get_default_message_from_type (FolksPresenceType type); FolksPresenceType folks_presence_details_get_presence_type (FolksPresenceDetails* self); const gchar* folks_presence_details_get_presence_message (FolksPresenceDetails* self); const gchar* folks_presence_details_get_presence_status (FolksPresenceDetails* self); #endif g_variant_builder_close(&builder); // dict } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/folks.cpp0000664000373300001540000006363112405555067023203 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include "folks.h" #include "full-view.h" #include "filtered-view.h" #include "individual-traits.h" #include "persona-details.h" #include #include "test.h" #include #include #include #include SE_BEGIN_CXX /** * Generic error callback. There really isn't much that can be done if * libfolks fails, except for logging the problem. */ static void logResult(const GError *gerror, const char *operation) { if (gerror) { SE_LOG_ERROR(NULL, "%s: %s", operation, gerror->message); } else { SE_LOG_DEBUG(NULL, "%s: done", operation); } } class CompareFormattedName : public IndividualCompare { bool m_reversed; bool m_firstLast; public: CompareFormattedName(bool reversed = false, bool firstLast = false) : m_reversed(reversed), m_firstLast(firstLast) { } virtual void createCriteria(FolksIndividual *individual, Criteria_t &criteria) const { FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *family = folks_structured_name_get_family_name(fn); const char *given = folks_structured_name_get_given_name(fn); SE_LOG_DEBUG(NULL, "criteria: formatted name: %s, %s", family, given); if (m_firstLast) { criteria.push_back(given ? given : ""); criteria.push_back(family ? family : ""); } else { criteria.push_back(family ? family : ""); criteria.push_back(given ? given : ""); } } else { SE_LOG_DEBUG(NULL, "criteria: no formatted"); } } virtual bool compare(const Criteria_t &a, const Criteria_t &b) const { return m_reversed ? IndividualCompare::compare(b, a) : IndividualCompare::compare(a, b); } }; boost::shared_ptr IndividualCompare::defaultCompare() { boost::shared_ptr compare(new CompareFormattedName); return compare; } bool IndividualData::init(const IndividualCompare *compare, const LocaleFactory *locale, FolksIndividual *individual) { bool precomputedModified = false; m_individual = FolksIndividualCXX(individual, ADD_REF); if (compare) { m_criteria.clear(); compare->createCriteria(individual, m_criteria); } if (locale) { precomputedModified = locale->precompute(individual, m_precomputed); } return precomputedModified; } bool IndividualCompare::compare(const Criteria_t &a, const Criteria_t &b) const { Criteria_t::const_iterator ita = a.begin(), itb = b.begin(); while (itb != b.end()) { if (ita == a.end()) { // a is shorter return true; } int cmp = ita->compare(*itb); if (cmp < 0) { // String comparison shows that a is less than b. return true; } else if (cmp > 0) { // Is greater, so definitely not less => don't compare // rest of the criteria. return false; } else { // Equal, continue comparing. ++ita; ++itb; } } // a is not less b return false; } IndividualAggregator::IndividualAggregator(const boost::shared_ptr &locale) : m_locale(locale), m_databases(gee_hash_set_new(G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL, NULL, NULL, NULL), TRANSFER_REF) { } void IndividualAggregator::init(boost::shared_ptr &self) { m_self = self; m_backendStore = FolksBackendStoreCXX::steal(folks_backend_store_dup()); // Ignore some known harmless messages from folks. LogRedirect::addIgnoreError("Error preparing Backend 'ofono'"); LogRedirect::addIgnoreError("Error preparing Backend 'telepathy'"); SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_prepare, boost::bind(&IndividualAggregator::storePrepared, m_self), m_backendStore); m_folks = FolksIndividualAggregatorCXX::steal(folks_individual_aggregator_new_with_backend_store(m_backendStore)); } boost::shared_ptr IndividualAggregator::create(const boost::shared_ptr &locale) { boost::shared_ptr aggregator(new IndividualAggregator(locale)); aggregator->init(aggregator); return aggregator; } std::string IndividualAggregator::dumpDatabases() { std::string res; BOOST_FOREACH (const gchar *tmp, GeeStringCollection(GEE_COLLECTION(m_databases.get()), ADD_REF)) { if (!res.empty()) { res += ", "; } res += tmp; } return res; } void IndividualAggregator::storePrepared() { SE_LOG_DEBUG(NULL, "backend store is prepared"); // Have to hard-code the list of known backends that we don't want. SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_disable_backend, boost::bind(logResult, (const GError *)NULL, "folks_backend_store_disable_backend"), m_backendStore, "telepathy"); SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_disable_backend, boost::bind(logResult, (const GError *)NULL, "folks_backend_store_disable_backend"), m_backendStore, "tracker"); SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_disable_backend, boost::bind(logResult, (const GError *)NULL, "folks_backend_store_disable_backend"), m_backendStore, "key-file"); SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_disable_backend, boost::bind(logResult, (const GError *)NULL, "folks_backend_store_disable_backend"), m_backendStore, "libsocialweb"); // Explicitly enable EDS, just to be sure. SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_enable_backend, boost::bind(logResult, (const GError *)NULL, "folks_backend_store_enable_backend"), m_backendStore, "eds"); // Start loading backends right away. Assumes that the // asynchronous operations above will be done first. SYNCEVO_GLIB_CALL_ASYNC(folks_backend_store_load_backends, boost::bind(&IndividualAggregator::backendsLoaded, m_self), m_backendStore); } void IndividualAggregator::backendsLoaded() { SE_LOG_DEBUG(NULL, "backend store has loaded backends"); GeeCollectionCXX coll(folks_backend_store_list_backends(m_backendStore), TRANSFER_REF); BOOST_FOREACH (FolksBackend *backend, GeeCollCXX(coll)) { SE_LOG_DEBUG(NULL, "folks backend: %s", folks_backend_get_name(backend)); } m_eds = FolksBackendCXX::steal(folks_backend_store_dup_backend_by_name(m_backendStore, "eds")); if (m_eds) { // Remember system store, for writing contacts. GeeMap *stores = folks_backend_get_persona_stores(m_eds); FolksPersonaStore *systemStore = static_cast(gee_map_get(stores, "system-address-book")); m_systemStore = FolksPersonaStoreCXX(systemStore, TRANSFER_REF); // Tell the backend which databases we want. SE_LOG_DEBUG(NULL, "backends loaded: setting EDS persona stores: [%s]", dumpDatabases().c_str()); folks_backend_set_persona_stores(m_eds, GEE_SET(m_databases.get())); if (m_view) { // We were started, prepare aggregator. SYNCEVO_GLIB_CALL_ASYNC(folks_individual_aggregator_prepare, boost::bind(logResult, _1, "folks_individual_aggregator_prepare"), getFolks()); } // Execute delayed work. m_backendsLoadedSignal(); } else { SE_LOG_ERROR(NULL, "EDS backend not active?!"); } } void IndividualAggregator::setDatabases(std::set &databases) { gee_collection_clear(GEE_COLLECTION(m_databases.get())); BOOST_FOREACH (const std::string &database, databases) { gee_collection_add(GEE_COLLECTION(m_databases.get()), database.c_str()); } if (m_eds) { // Backend is loaded, tell it about the change. SE_LOG_DEBUG(NULL, "backends already loaded: setting EDS persona stores directly: [%s]", dumpDatabases().c_str()); folks_backend_set_persona_stores(m_eds, GEE_SET(m_databases.get())); } else { SE_LOG_DEBUG(NULL, "backends not loaded yet: setting EDS persona stores delayed: [%s]", dumpDatabases().c_str()); } } void IndividualAggregator::setCompare(const boost::shared_ptr &compare) { // Don't start main view. Instead rememeber the compare instance // for start(). m_compare = compare; if (m_view) { m_view->setCompare(compare); } } void IndividualAggregator::setLocale(const boost::shared_ptr &locale) { m_locale = locale; if (m_view) { m_view->setLocale(m_locale); } } void IndividualAggregator::start() { if (!m_view) { m_view = FullView::create(m_folks, m_locale); if (m_compare) { m_view->setCompare(m_compare); } if (m_eds) { // Backend was loaded and configured, we can prepare the aggregator. SYNCEVO_GLIB_CALL_ASYNC(folks_individual_aggregator_prepare, boost::bind(logResult, _1, "folks_individual_aggregator_prepare"), getFolks()); } } } bool IndividualAggregator::isRunning() const { return m_view; } boost::shared_ptr IndividualAggregator::getMainView() { if (!m_view) { start(); } return m_view; } void IndividualAggregator::addContact(const Result &result, const PersonaDetails &details) { // Called directly by D-Bus client. Need fully functional system address book. runWithAddressBook(boost::bind(&IndividualAggregator::doAddContact, this, result, details), result.getOnError()); } void IndividualAggregator::doAddContact(const Result &result, const PersonaDetails &details) { SYNCEVO_GLIB_CALL_ASYNC(folks_persona_store_add_persona_from_details, boost::bind(&IndividualAggregator::addContactDone, this, _2, _1, result), m_systemStore, details.get()); } void IndividualAggregator::addContactDone(const GError *gerror, FolksPersona *persona, const Result &result) throw() { try { // Handle result of folks_persona_store_add_persona_from_details(). if (!persona || gerror) { GErrorCXX::throwError(SE_HERE, "add contact", gerror); } const gchar *uid = folks_persona_get_uid(persona); if (uid) { gchar *backend, *storeID, *personaID; folks_persona_split_uid(uid, &backend, &storeID, &personaID); PlainGStr tmp1(backend), tmp2(storeID), tmp3(personaID); result.done(personaID); } else { SE_THROW("new persona has empty UID"); } } catch (...) { result.failed(); } } void IndividualAggregator::modifyContact(const Result &result, const std::string &localID, const PersonaDetails &details) { runWithPersona(boost::bind(&IndividualAggregator::doModifyContact, this, result, _1, details), localID, result.getOnError()); } void IndividualAggregator::doModifyContact(const Result &result, FolksPersona *persona, const PersonaDetails &details) throw() { try { // Asynchronously modify the persona. This will be turned into // EDS updates by folks. Details2Persona(result, details, persona); } catch (...) { result.failed(); } } void IndividualAggregator::removeContact(const Result &result, const std::string &localID) { runWithPersona(boost::bind(&IndividualAggregator::doRemoveContact, this, result, _1), localID, result.getOnError()); } void IndividualAggregator::doRemoveContact(const Result &result, FolksPersona *persona) throw() { try { SYNCEVO_GLIB_CALL_ASYNC(folks_persona_store_remove_persona, boost::bind(&IndividualAggregator::removeContactDone, this, _1, result), m_systemStore, persona); } catch (...) { result.failed(); } } void IndividualAggregator::removeContactDone(const GError *gerror, const Result &result) throw() { try { if (gerror) { GErrorCXX::throwError(SE_HERE, "remove contact", gerror); } result.done(); } catch (...) { result.failed(); } } void IndividualAggregator::runWithAddressBook(const boost::function &operation, const ErrorCb_t &onError) throw() { try { if (m_eds) { runWithAddressBookHaveEDS(boost::signals2::connection(), operation, onError); } else { // Do it later. m_backendsLoadedSignal.connect_extended(boost::bind(&IndividualAggregator::runWithAddressBookHaveEDS, this, _1, operation, onError)); } } catch (...) { onError(); } } void IndividualAggregator::runWithAddressBookHaveEDS(const boost::signals2::connection &conn, const boost::function &operation, const ErrorCb_t &onError) throw() { try { // Called after we obtained EDS backend. Need system store // which is prepared. m_backendsLoadedSignal.disconnect(conn); if (!m_systemStore) { SE_THROW("system address book not found"); } if (folks_persona_store_get_is_prepared(m_systemStore)) { runWithAddressBookPrepared(NULL, operation, onError); } else { SYNCEVO_GLIB_CALL_ASYNC(folks_persona_store_prepare, boost::bind(&IndividualAggregator::runWithAddressBookPrepared, this, _1, operation, onError), m_systemStore); } } catch (...) { onError(); } } void IndividualAggregator::runWithAddressBookPrepared(const GError *gerror, const boost::function &operation, const ErrorCb_t &onError) throw() { try { // Called after EDS system store is prepared, successfully or unsuccessfully. if (gerror) { GErrorCXX::throwError(SE_HERE, "prepare EDS system address book", gerror); } operation(); } catch (...) { onError(); } } void IndividualAggregator::runWithPersona(const boost::function &operation, const std::string &localID, const ErrorCb_t &onError) throw() { try { runWithAddressBook(boost::bind(&IndividualAggregator::doRunWithPersona, this, operation, localID, onError), onError); } catch (...) { onError(); } } void IndividualAggregator::doRunWithPersona(const boost::function &operation, const std::string &localID, const ErrorCb_t &onError) throw() { try { typedef GeeCollCXX< GeeMapEntryWrapper > Coll; Coll personas(folks_persona_store_get_personas(m_systemStore), ADD_REF); BOOST_FOREACH (const Coll::value_type &entry, personas) { // key seems to be : const gchar *key = entry.key(); const gchar *colon = strchr(key, ':'); if (colon && localID == colon + 1) { operation(entry.value()); return; } } SE_THROW(StringPrintf("contact with local ID '%s' not found in system address book", localID.c_str())); } catch (...) { onError(); } } #ifdef ENABLE_UNIT_TESTS class FolksTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(FolksTest); CPPUNIT_TEST(open); CPPUNIT_TEST(gvalue); CPPUNIT_TEST_SUITE_END(); private: static void asyncCB(const GError *gerror, const char *func, bool &failed, bool &done) { done = true; if (gerror) { failed = true; SE_LOG_ERROR(NULL, "%s: %s", func, gerror->message); } } void open() { FolksIndividualAggregatorCXX aggregator(folks_individual_aggregator_new(), TRANSFER_REF); bool done = false, failed = false; SYNCEVO_GLIB_CALL_ASYNC(folks_individual_aggregator_prepare, boost::bind(asyncCB, _1, "folks_individual_aggregator_prepare", boost::ref(failed), boost::ref(done)), aggregator); while (!done) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(!failed); while (!folks_individual_aggregator_get_is_quiescent(aggregator)) { g_main_context_iteration(NULL, true); } GeeMap *individuals = folks_individual_aggregator_get_individuals(aggregator); typedef GeeCollCXX< GeeMapEntryWrapper > Coll; Coll coll(individuals, ADD_REF); SE_LOG_DEBUG(NULL, "%d individuals", gee_map_get_size(individuals)); GeeMapIteratorCXX it(gee_map_map_iterator(individuals), TRANSFER_REF); while (gee_map_iterator_next(it)) { PlainGStr id(reinterpret_cast(gee_map_iterator_get_key(it))); FolksIndividualCXX individual(reinterpret_cast(gee_map_iterator_get_value(it)), TRANSFER_REF); GValueStringCXX fullname; g_object_get_property(G_OBJECT(individual.get()), "full-name", &fullname); SE_LOG_DEBUG(NULL, "map: id %s name %s = %s", id.get(), fullname.toString().c_str(), fullname.get()); } GeeIteratorCXX it2(gee_iterable_iterator(GEE_ITERABLE(individuals)), TRANSFER_REF); while (gee_iterator_next(it2)) { GeeMapEntryCXX entry(reinterpret_cast(gee_iterator_get(it2)), TRANSFER_REF); gchar *id(reinterpret_cast(const_cast(gee_map_entry_get_key(entry)))); FolksIndividual *individual(reinterpret_cast(const_cast(gee_map_entry_get_value(entry)))); GValueStringCXX fullname; g_object_get_property(G_OBJECT(individual), "full-name", &fullname); SE_LOG_DEBUG(NULL, "iterable: id %s name %s = %s", id, fullname.toString().c_str(), fullname.get()); } Coll::const_iterator curr = coll.begin(); Coll::const_iterator end = coll.end(); if (curr != end) { const gchar *id = (*curr).key(); FolksIndividual *individual((*curr).value()); GValueStringCXX fullname; g_object_get_property(G_OBJECT(individual), "full-name", &fullname); SE_LOG_DEBUG(NULL, "first: id %s name %s = %s", id, fullname.toString().c_str(), fullname.get()); ++curr; } BOOST_FOREACH (Coll::value_type &entry, coll) { const gchar *id = entry.key(); FolksIndividual *individual(entry.value()); // GValueStringCXX fullname; // g_object_get_property(G_OBJECT(individual), "full-name", &fullname); const gchar *fullname = folks_name_details_get_full_name(FOLKS_NAME_DETAILS(individual)); SE_LOG_DEBUG(NULL, "boost: id %s %s name %s", id, fullname ? "has" : "has no", fullname); typedef GeeCollCXX EmailColl; EmailColl emails(folks_email_details_get_email_addresses(FOLKS_EMAIL_DETAILS(individual)), ADD_REF); SE_LOG_DEBUG(NULL, " %d emails", gee_collection_get_size(GEE_COLLECTION(emails.get()))); BOOST_FOREACH (FolksEmailFieldDetails *email, emails) { SE_LOG_DEBUG(NULL, " %s", reinterpret_cast(folks_abstract_field_details_get_value(FOLKS_ABSTRACT_FIELD_DETAILS(email)))); } } aggregator.reset(); } void gvalue() { GValueBooleanCXX b(true); SE_LOG_DEBUG(NULL, "GValueBooleanCXX(true) = %s", b.toString().c_str()); GValueBooleanCXX b2(b); CPPUNIT_ASSERT_EQUAL(b.get(), b2.get()); b2.set(false); CPPUNIT_ASSERT_EQUAL(b.get(), (gboolean)!b2.get()); b2 = b; CPPUNIT_ASSERT_EQUAL(b.get(), b2.get()); GValueStringCXX str("foo bar"); SE_LOG_DEBUG(NULL, "GValueStringCXX(\"foo bar\") = %s", str.toString().c_str()); CPPUNIT_ASSERT(!strcmp(str.get(), "foo bar")); GValueStringCXX str2(str); CPPUNIT_ASSERT(!strcmp(str.get(), str2.get())); CPPUNIT_ASSERT(str.get() != str2.get()); str2.set("foo"); CPPUNIT_ASSERT(strcmp(str.get(), str2.get())); CPPUNIT_ASSERT(str.get() != str2.get()); str2 = str; CPPUNIT_ASSERT(!strcmp(str.get(), str2.get())); CPPUNIT_ASSERT(str.get() != str2.get()); str2.take(g_strdup("bar")); CPPUNIT_ASSERT(strcmp(str.get(), str2.get())); CPPUNIT_ASSERT(str.get() != str2.get()); const char *fixed = "fixed"; str2.setStatic(fixed); CPPUNIT_ASSERT(!strcmp(str2.get(), fixed)); CPPUNIT_ASSERT(str2.get() == fixed); } static void individualSignal(std::ostringstream &out, const char *action, int index, const IndividualData &data) { out << action << ": " << index << " " << folks_name_details_get_full_name(FOLKS_NAME_DETAILS(data.m_individual.get())) << std::endl; } static void monitorView(IndividualView &view, std::ostringstream &out) { view.m_addedSignal.connect(boost::bind(individualSignal, boost::ref(out), "added", _1, _2)); view.m_removedSignal.connect(boost::bind(individualSignal, boost::ref(out), "removed", _1, _2)); view.m_modifiedSignal.connect(boost::bind(individualSignal, boost::ref(out), "modified", _1, _2)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(FolksTest); #endif SE_END_CXX syncevolution-1.5/src/dbus/server/pim/manager.cpp0000664000373300001540000023074012424466461023474 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "manager.h" #include "individual-traits.h" #include "persona-details.h" #include "filtered-view.h" #include "full-view.h" #include "merge-view.h" #include "edsf-view.h" #include "../resource.h" #include "../client.h" #include "../session.h" #include "../localed-listener.h" #include #include #include #include #include #include #include SE_BEGIN_CXX static const char * const MANAGER_SERVICE = "org._01.pim.contacts"; static const char * const MANAGER_PATH = "/org/01/pim/contacts"; static const char * const MANAGER_IFACE = "org._01.pim.contacts.Manager"; static const char * const MANAGER_ERROR_ABORTED = "org._01.pim.contacts.Manager.Aborted"; static const char * const MANAGER_ERROR_BAD_STATUS = "org._01.pim.contacts.Manager.BadStatus"; static const char * const MANAGER_ERROR_ALREADY_EXISTS = "org._01.pim.contacts.Manager.AlreadyExists"; static const char * const MANAGER_ERROR_NOT_FOUND = "org._01.pim.contacts.Manager.NotFound"; static const char * const AGENT_IFACE = "org._01.pim.contacts.ViewAgent"; static const char * const CONTROL_IFACE = "org._01.pim.contacts.ViewControl"; static const char * const MANAGER_CONFIG_SORT_PROPERTY = "sort"; static const char * const MANAGER_CONFIG_ACTIVE_ADDRESS_BOOKS_PROPERTY = "active"; /** * Prefix for peer databases ("peer-") */ static const char * const DB_PEER_PREFIX = "peer-"; /** * Name prefix for SyncEvolution config contexts used by PIM manager. * Used in combination with the uid string provided by the PIM manager * client, like this: * * eds@pim-manager- source 'eds' syncs with target-config@pim-manager- * source 'remote' for PBAP. * * eds@pim-manager- source 'local' syncs with a SyncML peer directly. */ static const char * const MANAGER_PREFIX = "pim-manager-"; static const char * const MANAGER_LOCAL_CONFIG = "eds"; static const char * const MANAGER_LOCAL_SOURCE = "local"; static const char * const MANAGER_REMOTE_CONFIG = "target-config"; static const char * const MANAGER_REMOTE_SOURCE = "remote"; Manager::Manager(const boost::shared_ptr &server) : DBusObjectHelper(server->getConnection(), MANAGER_PATH, MANAGER_IFACE), m_mainThread(g_thread_self()), m_server(server), m_locale(LocaleFactory::createFactory()), m_localedListener(LocaledListener::create()), emitSyncProgress(*this, "SyncProgress") { // Update our own environment and sorting on each locale change. m_localedListener->m_localeValues.connect(boost::bind(&LocaledListener::setLocale, m_localedListener.get(), _1)); m_localedListener->m_localeChanged.connect(boost::bind(&Manager::localeChanged, this)); // Get the environment once from localed, just to be sure. m_localedListener->check(boost::bind(&LocaledListener::setLocale, boost::weak_ptr(m_localedListener), _1)); } Manager::~Manager() { // Clear the pending queue before self-desctructing, because the // entries hold pointers to this instance. m_pending.clear(); if (m_preventingAutoTerm) { m_server->autoTermUnref(); } } #ifdef PIM_MANAGER_TEST_THREADING static gpointer StartManager(gpointer data) { Manager *manager = static_cast(data); manager->start(); return NULL; } #endif void Manager::init() { // Restore sort order and active databases. m_configNode.reset(new IniFileConfigNode(SubstEnvironment("${XDG_CONFIG_HOME}/syncevolution"), "pim-manager.ini", false)); InitStateString order = m_configNode->readProperty(MANAGER_CONFIG_SORT_PROPERTY); m_sortOrder = order.wasSet() ? order : "last/first"; InitStateString active = m_configNode->readProperty(MANAGER_CONFIG_ACTIVE_ADDRESS_BOOKS_PROPERTY); m_enabledEBooks.clear(); BOOST_FOREACH(const std::string &entry, boost::tokenizer< boost::char_separator >(active, boost::char_separator(", \t"))) { if (!entry.empty()) { m_enabledEBooks.insert(entry); } } initFolks(); try { initSorting(m_sortOrder); } catch (...) { std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); SE_LOG_WARNING(NULL, "Restoring sort order from config failed, falling back to default: %s", explanation.c_str()); m_sortOrder = "last/first"; initSorting(m_sortOrder); } initDatabases(); add(this, &Manager::start, "Start"); add(this, &Manager::stop, "Stop"); add(this, &Manager::isRunning, "IsRunning"); add(this, &Manager::setSortOrder, "SetSortOrder"); add(this, &Manager::getSortOrder, "GetSortOrder"); add(this, &Manager::search, "Search"); add(this, &Manager::getActiveAddressBooks, "GetActiveAddressBooks"); add(this, &Manager::setActiveAddressBooks, "SetActiveAddressBooks"); add(this, &Manager::modifyPeer, "SetPeer"); // The original method name, keep it for backwards compatibility. add(this, &Manager::createPeer, "CreatePeer"); // Strict version: uid must be new. add(this, &Manager::removePeer, "RemovePeer"); add(this, &Manager::syncPeer, "SyncPeer"); add(this, &Manager::syncPeerWithFlags, "SyncPeerWithFlags"); add(this, &Manager::stopSync, "StopSync"); add(this, &Manager::getPeerStatus, "GetPeerStatus"); add(this, &Manager::suspendSync, "SuspendSync"); add(this, &Manager::resumeSync, "ResumeSync"); add(this, &Manager::getAllPeers, "GetAllPeers"); add(this, &Manager::addContact, "AddContact"); add(this, &Manager::modifyContact, "ModifyContact"); add(this, &Manager::removeContact, "RemoveContact"); add(emitSyncProgress); // Ready, make it visible via D-Bus. activate(); // Claim MANAGER_SERVICE name on connection. // We don't care about the result. GDBusCXX::DBusConnectionPtr(getConnection()).ownNameAsync(MANAGER_SERVICE, boost::function()); #ifdef PIM_MANAGER_TEST_THREADING GThread *thread = g_thread_new("start", StartManager, this); g_thread_unref(thread); #endif } struct TaskForMain { GMutex m_mutex; GCond m_cond; bool m_done; boost::function m_operation; boost::function m_rethrow; void runTaskOnIdle() { g_mutex_lock(&m_mutex); // Exceptions must be reported back to the original thread. // This is done by serializing them as string, then using the // existing Exception::tryRethrow() to turn that string back // into an instance of the right class. try { m_operation(); } catch (...) { std::string explanation; Exception::handle(explanation); m_rethrow = boost::bind(Exception::tryRethrow, explanation, true); } // Wake up task. m_done = true; g_cond_signal(&m_cond); g_mutex_unlock(&m_mutex); } }; template void AssignResult(const boost::function &operation, R &res) { res = operation(); } template R Manager::runInMainRes(const boost::function &operation) { // Prepare task. R res; TaskForMain task; g_mutex_init(&task.m_mutex); g_cond_init(&task.m_cond); task.m_done = false; task.m_operation = boost::bind(&AssignResult, boost::cref(operation), boost::ref(res)); // Run in main. Timeout timeout; timeout.runOnce(-1, boost::bind(&TaskForMain::runTaskOnIdle, &task)); g_main_context_wakeup(NULL); g_mutex_lock(&task.m_mutex); while (!task.m_done) { g_cond_wait(&task.m_cond, &task.m_mutex); } g_mutex_unlock(&task.m_mutex); // Rethrow exceptions (optional) and return result. g_cond_clear(&task.m_cond); g_mutex_clear(&task.m_mutex); if (task.m_rethrow) { task.m_rethrow(); } return res; } static int Return1(const boost::function &operation) { operation(); return 1; } void Manager::runInMainVoid(const boost::function &operation) { runInMainRes(boost::bind(Return1, boost::cref(operation))); } void Manager::initFolks() { m_folks = IndividualAggregator::create(m_locale); } void Manager::initSorting(const std::string &order) { // Mirror sorting order in m_folks main view. // Empty string passes NULL pointer to setCompare(), // which chooses the builtin sorting in folks.cpp, // independent of the locale plugin. boost::shared_ptr compare = order.empty() ? IndividualCompare::defaultCompare() : m_locale->createCompare(order); m_folks->setCompare(compare); } void Manager::localeChanged() { // First update locale. m_locale = LocaleFactory::createFactory(); // Change sorting. First install new locale in // IndividualAggregator and through it in FullView. if (m_folks) { m_folks->setLocale(m_locale); } // Then update IndividualData of all loaded individuals by // changing the sort order. initSorting(m_sortOrder); // Now update views. m_localeChanged(m_locale); } boost::shared_ptr Manager::create(const boost::shared_ptr &server) { boost::shared_ptr manager(new Manager(server)); manager->m_self = manager; manager->init(); return manager; } boost::shared_ptr CreateContactManager(const boost::shared_ptr &server, bool start) { boost::shared_ptr manager = Manager::create(server); if (start) { manager->start(); } return manager; } void Manager::start() { if (!isMain()) { runInMainV(&Manager::start); return; } if (!m_preventingAutoTerm) { // Prevent automatic shut down during idle times, because we need // to keep our unified address book available. m_server->autoTermRef(); m_preventingAutoTerm = true; } m_folks->start(); } void Manager::stop() { if (!isMain()) { runInMainV(&Manager::stop); return; } // If there are no active searches, then recreate aggregator. // Instead of tracking open views, use the knowledge that an // idle server has only two references to the main view: // one inside m_folks, one given back to us here. if (m_folks->getMainView().use_count() <= 2) { SE_LOG_DEBUG(NULL, "restarting due to Manager.Stop()"); initFolks(); initDatabases(); initSorting(m_sortOrder); if (m_preventingAutoTerm) { // Allow auto shutdown again. m_server->autoTermUnref(); m_preventingAutoTerm = false; } } } bool Manager::isRunning() { if (!isMain()) { return runInMainR(&Manager::isRunning); } return m_folks->isRunning(); } void Manager::setSortOrder(const std::string &order) { if (!isMain()) { runInMainV(&Manager::setSortOrder, order); return; } if (order == getSortOrder()) { // Nothing to do. return; } // String is checked as part of initSorting, // only store if parsing succeeds. initSorting(order); m_configNode->writeProperty(MANAGER_CONFIG_SORT_PROPERTY, InitStateString(order, true)); m_configNode->flush(); m_sortOrder = order; } std::string Manager::getSortOrder() { if (!isMain()) { return runInMainR(&Manager::getSortOrder); } return m_sortOrder; } /** * Connects a normal IndividualView to a D-Bus client. * Provides the org.01.pim.contacts.ViewControl API. */ class ViewResource : public Resource, public GDBusCXX::DBusObjectHelper { static unsigned int m_counter; boost::weak_ptr m_self; GDBusCXX::DBusRemoteObject m_viewAgent; boost::shared_ptr m_view; boost::shared_ptr m_locale; boost::weak_ptr m_owner; LocaleFactory::Filter_t m_filter; struct Change { Change() : m_start(0), m_call(NULL) {} int m_start; std::deque m_ids; const GDBusCXX::DBusClientCall0 *m_call; } m_pendingChange, m_lastChange; GDBusCXX::DBusClientCall0 m_quiescent; GDBusCXX::DBusClientCall0 m_contactsModified, m_contactsAdded, m_contactsRemoved; ViewResource(const boost::shared_ptr view, const boost::shared_ptr &locale, const boost::shared_ptr &owner, const LocaleFactory::Filter_t &filter, GDBusCXX::connection_type *connection, const GDBusCXX::Caller_t &ID, const GDBusCXX::DBusObject_t &agentPath) : GDBusCXX::DBusObjectHelper(connection, StringPrintf("%s/view%d", MANAGER_PATH, m_counter++), CONTROL_IFACE), m_viewAgent(connection, agentPath, AGENT_IFACE, ID), m_view(view), m_locale(locale), m_owner(owner), m_filter(filter), // use ViewAgent interface m_quiescent(m_viewAgent, "Quiescent"), m_contactsModified(m_viewAgent, "ContactsModified"), m_contactsAdded(m_viewAgent, "ContactsAdded"), m_contactsRemoved(m_viewAgent, "ContactsRemoved") {} /** * Invokes one of m_contactsModified/Added/Removed. A failure of * the asynchronous call indicates that the client is dead and * that its view can be purged. */ template void sendChange(const GDBusCXX::DBusClientCall0 &call, int start, const V &ids) { // Changes get aggregated inside handleChange(). call.start(getObject(), start, ids, boost::bind(ViewResource::sendDone, m_self, _1, &call == &m_contactsModified ? "ContactsModified()" : &call == &m_contactsAdded ? "ContactsAdded()" : &call == &m_contactsRemoved ? "ContactsRemoved()" : "???", true)); } /** * Merge local changes as much as possible, to avoid excessive * D-Bus traffic. Pending changes get flushed each time the * view reports that it is stable again or contact data * needs to be sent back to the client. Flushing in the second * case is necessary, because otherwise the client will not have * an up-to-date view when the requested data arrives. */ void handleChange(const GDBusCXX::DBusClientCall0 &call, int start, const IndividualData &data) { FolksIndividual *individual = data.m_individual.get(); const char *id = folks_individual_get_id(individual); SE_LOG_DEBUG(NULL, "handle change %s: %s, #%d, %s = %s", getPath(), &call == &m_contactsModified ? "modified" : &call == &m_contactsAdded ? "added" : &call == &m_contactsRemoved ? "remove" : "???", start, id, folks_name_details_get_full_name(FOLKS_NAME_DETAILS(individual)) ); int pendingCount = m_pendingChange.m_ids.size(); if (pendingCount == 0) { // Sending a "contact modified" twice for the same range is redundant. // If the recipient read the data since the last signal, m_lastChange // got cleared and we don't do this optimization. if (m_lastChange.m_call == &m_contactsModified && &call == &m_contactsModified && start >= m_lastChange.m_start && start < m_lastChange.m_start + (int)m_lastChange.m_ids.size()) { SE_LOG_DEBUG(NULL, "handle change %s: redundant 'modified' signal, ignore", getPath()); return; } // Nothing pending, delay sending. m_pendingChange.m_call = &call; m_pendingChange.m_start = start; m_pendingChange.m_ids.push_back(id); SE_LOG_DEBUG(NULL, "handle change %s: stored as pending change", getPath()); return; } if (m_pendingChange.m_call == &call) { // Same operation. Can we extend it? if (&call == &m_contactsModified) { // Modification, indices are unchanged. if (start + 1 == m_pendingChange.m_start) { // New modified element at the front. SE_LOG_DEBUG(NULL, "handle change %s: insert modification, #%d + %d and #%d => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, m_pendingChange.m_start - 1, pendingCount + 1); m_pendingChange.m_ids.push_front(id); m_pendingChange.m_start--; return; } else if (start == m_pendingChange.m_start + pendingCount) { // New modified element at the end. SE_LOG_DEBUG(NULL, "handle change %s: append modification, #%d + %d and #%d => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, m_pendingChange.m_start, pendingCount + 1); m_pendingChange.m_ids.push_back(id); return; } else if (start >= m_pendingChange.m_start && start < m_pendingChange.m_start + pendingCount) { // Element modified again => no change, except perhaps for the ID. SE_LOG_DEBUG(NULL, "handle change %s: modification of already modified contact, #%d + %d and #%d => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, m_pendingChange.m_start, pendingCount); m_pendingChange.m_ids[start - m_pendingChange.m_start] = id; return; } } else if (&call == &m_contactsAdded) { // Added individuals. The new start index already includes // the previously added individuals. int newCount = m_pendingChange.m_ids.size() + 1; if (start >= m_pendingChange.m_start) { // Adding in the middle or at the end? int end = m_pendingChange.m_start + pendingCount; if (start == end) { SE_LOG_DEBUG(NULL, "handle change %s: increase count of 'added' individuals at end, #%d + %d and #%d new => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, m_pendingChange.m_start, newCount); m_pendingChange.m_ids.push_back(id); return; } else if (start < end) { SE_LOG_DEBUG(NULL, "handle change %s: increase count of 'added' individuals in the middle, #%d + %d and #%d new => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, m_pendingChange.m_start, newCount); m_pendingChange.m_ids.insert(m_pendingChange.m_ids.begin() + (start - m_pendingChange.m_start), id); return; } } else { // Adding directly before the previous start? if (start + 1 == m_pendingChange.m_start) { SE_LOG_DEBUG(NULL, "handle change %s: reduce start and increase count of 'added' individuals, #%d + %d and #%d => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, start, newCount); m_pendingChange.m_start = start; m_pendingChange.m_ids.push_front(id); return; } } } else { // Removed individuals. The new start was already reduced by // previously removed individuals. int newCount = m_pendingChange.m_ids.size() + 1; if (start == m_pendingChange.m_start) { // Removing directly at end. SE_LOG_DEBUG(NULL, "handle change %s: increase count of 'removed' individuals, #%d + %d and #%d => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, m_pendingChange.m_start, newCount); m_pendingChange.m_ids.push_back(id); return; } else if (start + 1 == m_pendingChange.m_start) { // Removing directly before the previous start. SE_LOG_DEBUG(NULL, "handle change %s: reduce start and increase count of 'removed' individuals, #%d + %d and #%d => #%d + %d", getPath(), m_pendingChange.m_start, pendingCount, start, start, newCount); m_pendingChange.m_start = start; m_pendingChange.m_ids.push_front(id); return; } } } // More complex merging is possible. For example, "removed 1 // at #10" and "added 1 at #10" can be turned into "modified 1 // at #10", if the ID is the same. This happens when a contact // gets modified and folks decides to recreate the // FolksIndividual instead of modifying it. if (m_pendingChange.m_call == &m_contactsRemoved && &call == &m_contactsAdded && start == m_pendingChange.m_start && 1 == m_pendingChange.m_ids.size() && m_pendingChange.m_ids.front() == id) { SE_LOG_DEBUG(NULL, "handle change %s: removed individual was re-added => #%d modified", getPath(), start); m_pendingChange.m_call = &m_contactsModified; return; } // Cannot merge changes. flushChanges(); // Now remember requested change. m_pendingChange.m_call = &call; m_pendingChange.m_start = start; m_pendingChange.m_ids.clear(); m_pendingChange.m_ids.push_back(id); } /** Clear pending state and flush. */ void flushChanges() { int count = m_pendingChange.m_ids.size(); if (count) { SE_LOG_DEBUG(NULL, "send change %s: %s, #%d + %d", getPath(), m_pendingChange.m_call == &m_contactsModified ? "modified" : m_pendingChange.m_call == &m_contactsAdded ? "added" : m_pendingChange.m_call == &m_contactsRemoved ? "remove" : "???", m_pendingChange.m_start, count); m_lastChange = m_pendingChange; m_pendingChange.m_ids.clear(); sendChange(*m_lastChange.m_call, m_lastChange.m_start, m_lastChange.m_ids); } } /** Current state is stable. Flush and tell agent. */ void quiescent() { flushChanges(); m_quiescent.start(getObject(), boost::bind(ViewResource::sendDone, m_self, _1, "Quiescent()", false)); } /** * Used as callback for sending changes to the ViewAgent. Only * holds weak references and thus does not prevent deleting view * or client. */ static void sendDone(const boost::weak_ptr &self, const std::string &error, const char *method, bool required) { if (required && !error.empty()) { // remove view because it is no longer needed SE_LOG_DEBUG(NULL, "ViewAgent %s method call failed, deleting view: %s", method, error.c_str()); boost::shared_ptr r = self.lock(); if (r) { r->close(); } } } void init(boost::shared_ptr self) { m_self = self; // activate D-Bus interface add(this, &ViewResource::readContacts, "ReadContacts"); add(this, &ViewResource::close, "Close"); add(this, &ViewResource::refineSearch, "RefineSearch"); add(this, &ViewResource::replaceSearch, "ReplaceSearch"); activate(); // The view might have been started already, for example when // reconnecting a ViewResource to the persistent full view. // Therefore tell the agent about the current content before // starting, then connect to signals, and finally start. int size = m_view->size(); if (size) { std::vector ids; ids.reserve(size); const IndividualData *data; for (int i = 0; i < size; i++) { data = m_view->getContact(i); ids.push_back(folks_individual_get_id(data->m_individual.get())); } sendChange(m_contactsAdded, 0, ids); } m_view->m_quiescenceSignal.connect(IndividualView::QuiescenceSignal_t::slot_type(&ViewResource::quiescent, this).track(self)); m_view->m_modifiedSignal.connect(IndividualView::ChangeSignal_t::slot_type(&ViewResource::handleChange, this, boost::cref(m_contactsModified), _1, _2).track(self)); m_view->m_addedSignal.connect(IndividualView::ChangeSignal_t::slot_type(&ViewResource::handleChange, this, boost::cref(m_contactsAdded), _1, _2).track(self)); m_view->m_removedSignal.connect(IndividualView::ChangeSignal_t::slot_type(&ViewResource::handleChange, this, boost::cref(m_contactsRemoved), _1, _2).track(self)); m_view->start(); // start() did all the initial work, no further changes expected // if state is considered stable => tell users. if (m_view->isQuiescent()) { quiescent(); } } public: /** returns the integer number that will be used for the next view resource */ static unsigned getNextViewNumber() { return m_counter; } static boost::shared_ptr create(const boost::shared_ptr &view, const boost::shared_ptr &locale, const boost::shared_ptr &owner, const LocaleFactory::Filter_t &filter, GDBusCXX::connection_type *connection, const GDBusCXX::Caller_t &ID, const GDBusCXX::DBusObject_t &agentPath) { boost::shared_ptr viewResource(new ViewResource(view, locale, owner, filter, connection, ID, agentPath)); viewResource->init(viewResource); return viewResource; } /** ViewControl.ReadContacts() */ void readContacts(const std::vector &ids, IndividualView::Contacts &contacts) { if (!ids.empty()) { // Ensure that client's view is up-to-date, then prepare the // data for it. flushChanges(); m_view->readContacts(ids, contacts); // Discard the information about the previous 'modified' signal // if the client now has data in that range. Necessary because // otherwise future 'modified' signals for that range might get // suppressed in handleChange(). int modifiedCount = m_lastChange.m_ids.size(); if (m_lastChange.m_call == &m_contactsModified && modifiedCount) { BOOST_FOREACH (const IndividualView::Contacts::value_type &entry, contacts) { int index = entry.first; if (index >= m_lastChange.m_start && index < m_lastChange.m_start + modifiedCount) { m_lastChange.m_ids.clear(); break; } } } } } /** ViewControl.Close() */ void close() { // Removing the resource from its owner will drop the last // reference and delete it when we return. boost::shared_ptr r = m_self.lock(); if (r) { boost::shared_ptr c = m_owner.lock(); if (c) { c->detach(r.get()); } } } /** ViewControl.RefineSearch() */ void refineSearch(const std::vector &filterArray) { replaceSearch(filterArray, true); } void replaceSearch(const std::vector &filterArray, bool refine) { // Same as in Search(). m_filter = filterArray; redoSearch(refine); } /** * Start filtering again, using the current environment. To be * called after a locale change or when m_filter changed. * * @param refine true only if it is known to the caller that the new result set is * a subset of the current one, false if uncertain */ void redoSearch(bool refine) { boost::shared_ptr individualFilter = m_locale->createFilter(m_filter, 0); m_view->replaceFilter(individualFilter, refine); } /** * Change locale, then refilter because the filter may have changed. */ void setLocale(const boost::shared_ptr &locale) { m_locale = locale; redoSearch(true); } }; unsigned int ViewResource::m_counter; void Manager::search(const boost::shared_ptr< GDBusCXX::Result1 > &result, const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch, const std::vector &filterVector, const GDBusCXX::DBusObject_t &agentPath) { // TODO: figure out a native, thread-safe API for this. // Start folks in parallel with asking for an ESourceRegistry. start(); // We use a std::vector as outer type to help Python decide how to // send the empty list []. When we declare our parameter as // variant instead of array of variants, as we do now, then the // Python programmer has to use dbus.Array([], signature='s'), // which breaks backwards compatibility (wasn't necessary earlier) // and is not easy to use. // // But before we can pass the filter on, we need to turn it into // a variant containing the vector. LocaleFactory::Filter_t filter; filter = filterVector; // We don't know for sure whether we'll need the ESourceRegistry. // Ask for it, just to be sure. If we need to hurry because we are // doing a caller ID lookup during startup, then we'll need it. EDSRegistryLoader::getESourceRegistryAsync(boost::bind(&Manager::searchWithRegistry, m_self, _1, _2, result, ID, watch, filter, agentPath)); } void Manager::searchWithRegistry(const ESourceRegistryCXX ®istry, const GError *gerror, const boost::shared_ptr< GDBusCXX::Result1 > &result, const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch, const LocaleFactory::Filter_t &filter, const GDBusCXX::DBusObject_t &agentPath) throw() { try { if (!registry) { GErrorCXX::throwError(SE_HERE, "create ESourceRegistry", gerror); } doSearch(registry, result, ID, watch, filter, agentPath); } catch (...) { // Tell caller about specific error. dbusErrorCallback(result); } } void Manager::doSearch(const ESourceRegistryCXX ®istry, const boost::shared_ptr< GDBusCXX::Result1 > &result, const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch, const LocaleFactory::Filter_t &filter, const GDBusCXX::DBusObject_t &agentPath) { // Create and track view which is owned by the caller. boost::shared_ptr client = m_server->addClient(ID, watch); boost::shared_ptr view; view = m_folks->getMainView(); bool quiescent = view->isQuiescent(); std::string ebookFilter; // Always use a filtered view. That way we can implement ReplaceView or RefineView // without having to switch from a FullView to a FilteredView. boost::shared_ptr individualFilter = m_locale->createFilter(filter, 0); ebookFilter = individualFilter->getEBookFilter(); if (quiescent) { // Don't search via EDS directly because the unified // address book is ready. ebookFilter.clear(); } view = FilteredView::create(view, individualFilter); view->setName(StringPrintf("filtered view%u", ViewResource::getNextViewNumber())); SE_LOG_DEBUG(NULL, "preparing %s: EDS search term is '%s', active address books %s", view->getName(), ebookFilter.c_str(), boost::join(m_enabledEBooks, " ").c_str()); if (!ebookFilter.empty() && !m_enabledEBooks.empty()) { // Set up direct searching in all active address books. // These searches are done once, so don't bother to deal // with future changes to the active address books or // the sort order. MergeView::Searches searches; searches.reserve(m_enabledEBooks.size()); boost::shared_ptr compare = m_sortOrder.empty() ? IndividualCompare::defaultCompare() : m_locale->createCompare(m_sortOrder); BOOST_FOREACH (const std::string &uuid, m_enabledEBooks) { searches.push_back(EDSFView::create(registry, uuid, ebookFilter)); searches.back()->setName(StringPrintf("eds view %s %s", uuid.c_str(), ebookFilter.c_str())); } boost::shared_ptr merge(MergeView::create(view, searches, m_locale, compare)); merge->setName(StringPrintf("merge view%u", ViewResource::getNextViewNumber())); view = merge; } boost::shared_ptr viewResource(ViewResource::create(view, m_locale, client, filter, getConnection(), ID, agentPath)); client->attach(boost::shared_ptr(viewResource)); // Redo search when locale changes. m_localeChanged.connect(LocaleChangedSignal::slot_type(&ViewResource::setLocale, viewResource.get(), _1).track(viewResource)); // created local resource result->done(viewResource->getPath()); } void Manager::runInSession(const std::string &config, Server::SessionFlags flags, const boost::shared_ptr &result, const boost::function &session)> &callback) { try { boost::shared_ptr session = m_server->startInternalSession(config, flags, boost::bind(&Manager::doSession, this, _1, result, callback)); if (session->getSyncStatus() == Session::SYNC_QUEUEING) { // Must continue to wait instead of dropping the last reference. m_pending.push_back(std::make_pair(result, session)); } } catch (...) { // Tell caller about specific error. dbusErrorCallback(result); } } void Manager::doSession(const boost::weak_ptr &weakSession, const boost::shared_ptr &result, const boost::function &session)> &callback) { try { boost::shared_ptr session = weakSession.lock(); if (!session) { // Destroyed already? return; } // Drop permanent reference, session will be destroyed when we // return. m_pending.remove(std::make_pair(result, session)); // Now run the operation. callback(session); } catch (...) { // Tell caller about specific error. dbusErrorCallback(result); } } void Manager::getActiveAddressBooks(std::vector &dbIDs) { BOOST_FOREACH (const std::string &uuid, m_enabledEBooks) { if (uuid == "system-address-book") { dbIDs.push_back(""); } else { dbIDs.push_back(DB_PEER_PREFIX + uuid.substr(strlen(MANAGER_PREFIX))); } } } void Manager::setActiveAddressBooks(const std::vector &dbIDs) { // Build list of EDS UUIDs. std::set uuids; BOOST_FOREACH (const std::string &dbID, dbIDs) { if (boost::starts_with(dbID, DB_PEER_PREFIX)) { // Database of a specific peer. std::string uid = dbID.substr(strlen(DB_PEER_PREFIX)); uuids.insert(MANAGER_PREFIX + uid); } else if (dbID.empty()) { // System database. It's UUID is hard-coded here because // it is fixed in practice and managing an ESourceRegistry // just to get the value seems overkill. uuids.insert("system-address-book"); } else { SE_THROW("invalid address book ID: " + dbID); } } // Swap and set in aggregator. std::swap(uuids, m_enabledEBooks); initDatabases(); m_configNode->writeProperty(MANAGER_CONFIG_ACTIVE_ADDRESS_BOOKS_PROPERTY, InitStateString(boost::join(m_enabledEBooks, " "), true)); m_configNode->flush(); } void Manager::initDatabases() { m_folks->setDatabases(m_enabledEBooks); } static void checkPeerUID(const std::string &uid) { const pcrecpp::RE re("[-a-z0-9]*"); if (!re.FullMatch(uid)) { SE_THROW(StringPrintf("invalid peer uid: %s", uid.c_str())); } } void Manager::createPeer(const boost::shared_ptr &result, const std::string &uid, const StringMap &properties) { setPeer(result, uid, properties, CREATE_PEER); } void Manager::modifyPeer(const boost::shared_ptr &result, const std::string &uid, const StringMap &properties) { setPeer(result, uid, properties, SET_PEER); } void Manager::setPeer(const boost::shared_ptr &result, const std::string &uid, const StringMap &properties, ConfigureMode mode) { checkPeerUID(uid); runInSession(StringPrintf("@%s%s", MANAGER_PREFIX, uid.c_str()), Server::SESSION_FLAG_NO_SYNC, result, boost::bind(&Manager::doSetPeer, this, _1, result, uid, properties, mode)); } static const char * const PEER_KEY_PROTOCOL = "protocol"; // static const char * const PEER_SYNCML_PROTOCOL = "SyncML"; static const char * const PEER_PBAP_PROTOCOL = "PBAP"; static const char * const PEER_FILES_PROTOCOL = "files"; static const char * const PEER_CARDDAV_PROTOCOL = "CardDAV"; static const char * const PEER_KEY_TRANSPORT = "transport"; static const char * const PEER_BLUETOOTH_TRANSPORT = "Bluetooth"; // static const char * const PEER_IP_TRANSPORT = "IP"; static const char * const PEER_DEF_TRANSPORT = PEER_BLUETOOTH_TRANSPORT; static const char * const PEER_KEY_ADDRESS = "address"; static const char * const PEER_KEY_DATABASE = "database"; static const char * const PEER_KEY_USERNAME = "username"; static const char * const PEER_KEY_PASSWORD = "password"; static const char * const PEER_KEY_LOGDIR = "logdir"; static const char * const PEER_KEY_MAXSESSIONS = "maxsessions"; static const char * const PEER_KEY_SYNCMODE = "syncmode"; static const char * const PEER_CACHE_SYNCMODE = "cache"; static const char * const PEER_TWO_WAY_SYNCMODE = "two-way"; static std::string GetEssential(const StringMap &properties, const char *key, bool allowEmpty = false) { InitStateString entry = GetWithDef(properties, key); if (!entry.wasSet() || (!allowEmpty && entry.empty())) { SE_THROW(StringPrintf("peer config: '%s' must be set%s", key, allowEmpty ? "" : " to a non-empty value")); } return entry; } void Manager::doSetPeer(const boost::shared_ptr &session, const boost::shared_ptr &result, const std::string &uid, const StringMap &properties, ConfigureMode mode) { // The session is active now, we have exclusive control over the // databases and the config. Create or update config. std::string protocol = GetEssential(properties, PEER_KEY_PROTOCOL); std::string transport = GetWithDef(properties, PEER_KEY_TRANSPORT, PEER_DEF_TRANSPORT); std::string address = GetEssential(properties, PEER_KEY_ADDRESS); std::string database = GetWithDef(properties, PEER_KEY_DATABASE); std::string logdir = GetWithDef(properties, PEER_KEY_LOGDIR); std::string maxsessions = GetWithDef(properties, PEER_KEY_MAXSESSIONS); std::string username = GetWithDef(properties, PEER_KEY_USERNAME); std::string password = GetWithDef(properties, PEER_KEY_PASSWORD); std::string syncmode = GetWithDef(properties, PEER_KEY_SYNCMODE); unsigned maxLogDirs = 0; if (!maxsessions.empty()) { // https://svn.boost.org/trac/boost/ticket/5494 if (boost::starts_with(maxsessions, "-")) { SE_THROW(StringPrintf("negative 'maxsessions' not allowed: %s", maxsessions.c_str())); } maxLogDirs = boost::lexical_cast(maxsessions); } std::string localDatabaseName = MANAGER_PREFIX + uid; std::string context = StringPrintf("@%s%s", MANAGER_PREFIX, uid.c_str()); SE_LOG_DEBUG(NULL, "%s: creating config for protocol %s", uid.c_str(), protocol.c_str()); if (protocol == PEER_PBAP_PROTOCOL) { if (!database.empty()) { SE_THROW(StringPrintf("peer config: %s=%s: choosing database not supported for %s=%s", PEER_KEY_ADDRESS, address.c_str(), PEER_KEY_PROTOCOL, protocol.c_str())); } if (transport != PEER_BLUETOOTH_TRANSPORT) { SE_THROW(StringPrintf("peer config: %s=%s: only transport %s is supported for %s=%s", PEER_KEY_TRANSPORT, transport.c_str(), PEER_BLUETOOTH_TRANSPORT, PEER_KEY_PROTOCOL, protocol.c_str())); } } if (protocol == PEER_PBAP_PROTOCOL || protocol == PEER_CARDDAV_PROTOCOL || protocol == PEER_FILES_PROTOCOL) { // Create, modify or set local config. boost::shared_ptr config(new SyncConfig(MANAGER_LOCAL_CONFIG + context)); switch (mode) { case CREATE_PEER: if (config->exists()) { // When creating a config, the uid must not be in use already. result->failed(GDBusCXX::dbus_error(MANAGER_ERROR_ALREADY_EXISTS, StringPrintf("uid %s is already in use", uid.c_str()))); return; } break; case MODIFY_PEER: if (!config->exists()) { // Modifying expects the config to exist already. result->failed(GDBusCXX::dbus_error(MANAGER_ERROR_NOT_FOUND, StringPrintf("uid %s is not in use", uid.c_str()))); return; } break; case SET_PEER: // May or may not exist, doesn't matter. break; } config->setDefaults(); config->prepareConfigForWrite(); config->setPreventSlowSync(false); config->setSyncURL("local://" + context); config->setPeerIsClient(true); config->setDumpData(false); config->setPrintChanges(false); if (!logdir.empty()) { config->setLogDir(logdir); } if (!maxsessions.empty()) { config->setMaxLogDirs(maxLogDirs); } config->setLogLevel(atoi(getEnv("SYNCEVOLUTION_LOGLEVEL", "0"))); boost::shared_ptr source(config->getSyncSourceConfig(MANAGER_LOCAL_SOURCE)); source->setBackend("evolution-contacts"); source->setDatabaseID(localDatabaseName); source->setURI(MANAGER_REMOTE_SOURCE); if (protocol == PEER_CARDDAV_PROTOCOL && syncmode == PEER_TWO_WAY_SYNCMODE) { source->setSync("two-way"); } else if (syncmode.empty() || syncmode == PEER_CACHE_SYNCMODE) { source->setSync("local-cache"); } else { SE_THROW(StringPrintf("peer config: unsupported mode for %s: %s=%s", protocol.c_str(), PEER_KEY_SYNCMODE, syncmode.c_str())); } config->flush(); // Ensure that database exists. SyncSourceParams params(MANAGER_LOCAL_SOURCE, config->getSyncSourceNodes(MANAGER_LOCAL_SOURCE), config, context); boost::scoped_ptr syncSource(SyncSource::createSource(params)); SyncSource::Databases databases = syncSource->getDatabases(); bool found = false; BOOST_FOREACH (const SyncSource::Database &database, databases) { if (database.m_uri == localDatabaseName) { found = true; break; } } if (!found) { syncSource->createDatabase(SyncSource::Database(localDatabaseName, localDatabaseName)); } // Now also create target config, in the same context. config.reset(new SyncConfig(MANAGER_REMOTE_CONFIG + context)); config->setDefaults(); config->prepareConfigForWrite(); config->setPreventSlowSync(false); config->setDumpData(false); config->setPrintChanges(false); if (!logdir.empty()) { config->setLogDir(logdir); } config->setLogLevel(atoi(getEnv("SYNCEVOLUTION_LOGLEVEL", "0"))); if (!maxsessions.empty()) { config->setMaxLogDirs(maxLogDirs); } if (protocol == PEER_CARDDAV_PROTOCOL) { if (!address.empty()) { // Retrieve syncURL from template. boost::shared_ptr peer(SyncConfig::createPeerTemplate(address)); if (!peer) { SE_THROW(StringPrintf("peer config: no such template: %s=%s", PEER_KEY_ADDRESS, address.c_str())); } config->setSyncURL(peer->getSyncURL()); } config->setSyncUsername(username); config->setSyncPassword(password); } source = config->getSyncSourceConfig(MANAGER_REMOTE_SOURCE); if (protocol == PEER_PBAP_PROTOCOL) { // PBAP source->setDatabaseID("obex-bt://" + address); source->setBackend("pbap"); } else if (protocol == PEER_CARDDAV_PROTOCOL) { // CardDAV source->setDatabaseID(database); source->setBackend("carddav"); } else { // Local sync with files on the target side. // Format is hard-coded to vCard 3.0. source->setDatabaseID("file://" + address); source->setDatabaseFormat("raw/text/vcard"); source->setBackend("file"); } config->flush(); } else { SE_THROW(StringPrintf("peer config: %s=%s not supported", PEER_KEY_PROTOCOL, protocol.c_str())); } // Report success. SE_LOG_DEBUG(NULL, "%s: created config for protocol %s", uid.c_str(), protocol.c_str()); result->done(); } static Manager::SyncResult SourceProgress2SyncProgress(Session *session, int32_t percent, const Session::SourceProgresses_t &progress) { Manager::SyncResult result; // As default, always trust the normal completion computation. // PBAP syncing is handled as special case below. result["percent"] = (double)percent / 100; // Non-PBAP sync as default, with empty string as default. Manager::SyncResult::mapped_type &syncCycle = result["sync-cycle"]; syncCycle = std::string(""); // It should have the well-known source. static const std::string name = MANAGER_LOCAL_SOURCE; Session::SourceProgresses_t::const_iterator it; if ((it = progress.find(name)) != progress.end()) { const SourceProgress &source = it->second; Session::SourceProgresses_t last; session->getLastProgress(last); Session::SourceProgresses_t::iterator it = last.find(name); if ((source.m_added > 0 || source.m_updated > 0 || source.m_deleted > 0) && (it == last.end() || source.m_added != it->second.m_added || source.m_updated != it->second.m_updated || source.m_deleted != it->second.m_deleted)) { // Create the entry. We don't specify what it contains and "None" would // be best, but boost::variant cannot be empty and void is not supported // by our D-Bus wrapper, so set it to 'true'. result["modified"] = true; } if (session->getSyncMode() == "pbap") { StringMap env = session->getSyncEnv(); StringMap::const_iterator var = env.find("SYNCEVOLUTION_PBAP_SYNC"); int cycles = (var != env.end() && var->second == "incremental") ? 2 : 1; double percent = 0; SyncSourceReport report; if (cycles == 2 && session->getSyncSourceReport(name, report)) { // Done first cycle. percent = 0.5; syncCycle = std::string("incremental-picture"); } else if (cycles == 2) { syncCycle = std::string("incremental-text"); } else if (var != env.end() && var->second == "text") { syncCycle = std::string("text"); } else { syncCycle = std::string("all"); } if (source.m_receiveTotal > 0 && source.m_phase == "receiving") { percent += (double)source.m_receiveCount / (cycles * source.m_receiveTotal); } result["percent"] = percent; } } return result; } Manager::PeerStatus Manager::getPeerStatus(const std::string &uid) { checkPeerUID(uid); PeerStatus status; // Idle unless we find a running session. status["status"] = "idle"; // Same logic as in stopPeer(). std::string syncConfigName = StringPrintf("%s@%s%s", MANAGER_LOCAL_CONFIG, MANAGER_PREFIX, uid.c_str()); boost::shared_ptr session = m_server->getSyncSession(); if (session) { std::string configName = session->getConfigName(); if (configName == syncConfigName) { status["status"] = session->getFreeze() ? "suspended" : "syncing"; int32_t percent; Session::SourceProgresses_t sources; session->getProgress(percent, sources); status["progress"] = SourceProgress2SyncProgress(session.get(), percent, sources); status["last-progress"] = (Timespec::monotonic() - session->getLastProgressTimestamp()).duration(); } } return status; } Manager::PeersMap Manager::getAllPeers() { PeersMap peers; SyncConfig::ConfigList configs = SyncConfig::getConfigs(); std::string prefix = StringPrintf("%s@%s", MANAGER_LOCAL_CONFIG, MANAGER_PREFIX); BOOST_FOREACH (const StringPair &entry, configs) { if (boost::starts_with(entry.first, prefix)) { // One of our configs. std::string uid = entry.first.substr(prefix.size()); StringMap &properties = peers[uid]; // Extract relevant properties from configs. SyncConfig localConfig(entry.first); InitState< std::vector > syncURLs = localConfig.getSyncURL(); std::string syncURL; if (!syncURLs.empty()) { syncURL = syncURLs[0]; } if (boost::starts_with(syncURL, "local://")) { // Look at target source to determine protocol. SyncConfig targetConfig(StringPrintf("%s@%s%s", MANAGER_REMOTE_CONFIG, MANAGER_PREFIX, uid.c_str())); boost::shared_ptr source(targetConfig.getSyncSourceConfig(MANAGER_REMOTE_SOURCE)); std::string backend = source->getBackend(); std::string database = source->getDatabaseID(); if (backend == "PBAP Address Book") { properties[PEER_KEY_PROTOCOL] = PEER_PBAP_PROTOCOL; if (boost::starts_with(database, "obex-bt://")) { properties[PEER_KEY_ADDRESS] = database.substr(strlen("obex-bt://")); } } else if (backend == "file") { properties[PEER_KEY_PROTOCOL] = PEER_FILES_PROTOCOL; if (boost::starts_with(database, "file://")) { properties[PEER_KEY_ADDRESS] = database.substr(strlen("file://")); } } } } } return peers; } void Manager::removePeer(const boost::shared_ptr &result, const std::string &uid) { checkPeerUID(uid); runInSession(StringPrintf("@%s%s", MANAGER_PREFIX, uid.c_str()), Server::SESSION_FLAG_NO_SYNC, result, boost::bind(&Manager::doRemovePeer, this, _1, result, uid)); } void Manager::doRemovePeer(const boost::shared_ptr &session, const boost::shared_ptr &result, const std::string &uid) { std::string localDatabaseName = MANAGER_PREFIX + uid; std::string context = StringPrintf("@%s%s", MANAGER_PREFIX, uid.c_str()); // Remove database. This is expected to be noticed by libfolks // once we delete the database without us having to tell it, but // doing so doesn't hurt. m_enabledEBooks.erase(localDatabaseName); initDatabases(); m_configNode->writeProperty(MANAGER_CONFIG_ACTIVE_ADDRESS_BOOKS_PROPERTY, InitStateString(boost::join(m_enabledEBooks, " "), true)); m_configNode->flush(); // Access config via context (includes sync and target config). boost::shared_ptr config(new SyncConfig(context)); // Remove database, if it exists. if (config->exists(CONFIG_LEVEL_CONTEXT)) { boost::shared_ptr source(config->getSyncSourceConfig(MANAGER_LOCAL_SOURCE)); SyncSourceNodes nodes = config->getSyncSourceNodes(MANAGER_LOCAL_SOURCE); if (nodes.dataConfigExists()) { SyncSourceParams params(MANAGER_LOCAL_SOURCE, nodes, config, context); boost::scoped_ptr syncSource(SyncSource::createSource(params)); SyncSource::Databases databases = syncSource->getDatabases(); bool found = false; BOOST_FOREACH (const SyncSource::Database &database, databases) { if (database.m_uri == localDatabaseName) { found = true; break; } } if (found) { syncSource->deleteDatabase(localDatabaseName, SyncSource::REMOVE_DATA_FORCE); } } } // Remove entire context, just in case. Placing the code here also // ensures that nothing except the config itself has the config // nodes open, which would prevent removing them. For the same // reason the SyncConfig is recreated: to clear all references to // sources that were opened via it. config.reset(new SyncConfig(context)); config->remove(); config->flush(); // Report success. result->done(); } void Manager::syncPeer(const boost::shared_ptr > &result, const std::string &uid) { checkPeerUID(uid); runInSession(StringPrintf("%s@%s%s", MANAGER_LOCAL_CONFIG, MANAGER_PREFIX, uid.c_str()), Server::SESSION_FLAG_NO_SYNC, result, boost::bind(&Manager::doSyncPeer, this, _1, result, uid, SyncFlags())); } void Manager::syncPeerWithFlags(const boost::shared_ptr > &result, const std::string &uid, const SyncFlags &flags) { checkPeerUID(uid); runInSession(StringPrintf("%s@%s%s", MANAGER_LOCAL_CONFIG, MANAGER_PREFIX, uid.c_str()), Server::SESSION_FLAG_NO_SYNC, result, boost::bind(&Manager::doSyncPeer, this, _1, result, uid, flags)); } static Manager::SyncResult SyncReport2Result(const SyncReport &report) { Manager::SyncResult result; int added = 0, updated = 0, removed = 0; if (!report.empty()) { const SyncSourceReport &source = report.begin()->second; added = source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ADDED, SyncSourceReport::ITEM_TOTAL); updated = source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_UPDATED, SyncSourceReport::ITEM_TOTAL); removed = source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_REMOVED, SyncSourceReport::ITEM_TOTAL); } result["modified"] = added || updated || removed; result["added"] = added; result["updated"] = updated; result["removed"] = removed; return result; } static void doneSyncPeer(const boost::shared_ptr > &result, SyncMLStatus status, const SyncReport &report) { if (status == STATUS_OK || status == STATUS_HTTP_OK) { result->done(SyncReport2Result(report)); } else if (status == (SyncMLStatus)sysync::LOCERR_USERABORT) { result->failed(GDBusCXX::dbus_error(MANAGER_ERROR_ABORTED, "running sync aborted, probably by StopSync()")); } else { result->failed(GDBusCXX::dbus_error(MANAGER_ERROR_BAD_STATUS, Status2String(status))); } } void Manager::doSyncPeer(const boost::shared_ptr &session, const boost::shared_ptr > &result, const std::string &uid, const SyncFlags &flags) { // Keep client informed about progress. emitSyncProgress(uid, "started", SyncResult()); session->m_doneSignal.connect(Session::DoneSignal_t::slot_type(boost::ref(emitSyncProgress), uid, "done", SyncResult()).track(m_self)); // emitSyncProgress indirectly relies in the "this" pointer session->m_sourceSynced.connect(boost::bind(&Manager::report2SyncProgress, m_self, uid, _1, _2)); // React *before* Session updates its value for getLastProgress(). */ session->m_progressSignal.connect(boost::bind(&Manager::progress2SyncProgress, m_self, uid, session.get(), _1, _2), boost::signals2::at_front); // Determine sync mode. "pbap" is valid only when the remote // source uses the PBAP backend. For the file backend, we use // "ephemeral", which ensures that absolutely no sync meta data // gets written (simulates PBAP). Everything else uses normal // syncing. std::string syncMode; std::string context = StringPrintf("@%s%s", MANAGER_PREFIX, uid.c_str()); boost::shared_ptr config(new SyncConfig(MANAGER_REMOTE_CONFIG + context)); boost::shared_ptr source(config->getSyncSourceConfig(MANAGER_REMOTE_SOURCE)); if (source->getBackend() == "PBAP Address Book") { syncMode = "pbap"; } else if (source->getBackend() == "file") { syncMode = "ephemeral"; } StringMap env; BOOST_FOREACH (const SyncFlags::value_type &entry, flags) { if (entry.first == "pbap-sync") { const std::string *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects a string value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } if (*value != "text" && *value != "all" && *value != "incremental") { SE_THROW(StringPrintf("SyncPeerWithFlags flag 'pbap-sync' expects one of 'text', 'all', or 'incremental': %s", value->c_str())); } env["SYNCEVOLUTION_PBAP_SYNC"] = *value; } else if (entry.first == "pbap-chunk-max-count-photo") { const int32_t *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects an integer value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } env["SYNCEVOLUTION_PBAP_CHUNK_MAX_COUNT_PHOTO"] = StringPrintf("%d", *value); } else if (entry.first == "pbap-chunk-max-count-no-photo") { const int32_t *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects an integer value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } env["SYNCEVOLUTION_PBAP_CHUNK_MAX_COUNT_NO_PHOTO"] = StringPrintf("%d", *value); } else if (entry.first == "pbap-chunk-transfer-time") { const int32_t *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects an integer value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } env["SYNCEVOLUTION_PBAP_CHUNK_TRANSFER_TIME"] = StringPrintf("%d", *value); } else if (entry.first == "pbap-chunk-time-lambda") { const double *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects a double value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } env["SYNCEVOLUTION_PBAP_CHUNK_TIME_LAMBDA"] = StringPrintf("%f", *value); } else if (entry.first == "pbap-chunk-offset") { const int32_t *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects an integer value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } env["SYNCEVOLUTION_PBAP_CHUNK_OFFSET"] = StringPrintf("%d", *value); } else if (entry.first == "progress-frequency") { const double *value = boost::get(&entry.second); if (!value) { SE_THROW(StringPrintf("SyncPeerWithFlags flag '%s' expects a double value, got instead: %s", entry.first.c_str(), ToString(entry.second).c_str())); } if (*value <= 0) { SE_THROW(StringPrintf("SyncPeerWithFlags flag 'progress-frequency' must be a positive, non-zero frequency value (Hz): %lf", *value)); } // Configure session progress frequency. session->setProgressTimeout(1 / *value * 1000 /* ms */); } else { SE_THROW(StringPrintf("invalid SyncPeerWithFlags flag: %s", entry.first.c_str())); } } // Always be explicit about the PBAP sync mode. Needed to have syncing // and PIM Manager aligned on the exact mode. if (env.find("SYNCEVOLUTION_PBAP_SYNC") == env.end()) { env["SYNCEVOLUTION_PBAP_SYNC"] = getEnv("SYNCEVOLUTION_PBAP_SYNC", "incremental"); } // After sync(), the session is tracked as the active sync session // by the server. It was removed from our own m_pending list by // doSession(). session->syncExtended(syncMode, SessionCommon::SourceModes_t(), env); // Relay result to caller when done. session->m_doneSignal.connect(boost::bind(doneSyncPeer, result, _1, _2)); } void Manager::report2SyncProgress(const std::string &uid, const std::string &sourceName, const SyncSourceReport &source) { SyncReport report; report.addSyncSourceReport("foo", source); emitSyncProgress(uid, "modified", SyncReport2Result(report)); } void Manager::progress2SyncProgress(const std::string &uid, Session *session, int32_t percent, const Session::SourceProgresses_t &progress) { emitSyncProgress(uid, "progress", SourceProgress2SyncProgress(session, percent, progress)); } void Manager::stopSync(const boost::shared_ptr &result, const std::string &uid) { checkPeerUID(uid); // Fully qualified peer config name. Only used for sync sessions // and thus good enough to identify them. std::string syncConfigName = StringPrintf("%s@%s%s", MANAGER_LOCAL_CONFIG, MANAGER_PREFIX, uid.c_str()); // Remove all pending sessions of the peer. Make a complete // copy of the list, to avoid issues with modifications of the // underlying list while we iterate over it. BOOST_FOREACH (const Pending_t::value_type &entry, Pending_t(m_pending)) { std::string configName = entry.second->getConfigName(); if (configName == syncConfigName) { entry.first->failed(GDBusCXX::dbus_error(MANAGER_ERROR_ABORTED, "pending sync aborted by StopSync()")); m_pending.remove(entry); } } // Stop the currently running sync if it is for the peer. // It may or may not complete, depending on what it is currently // doing. We'll check in doneSyncPeer(). boost::shared_ptr session = m_server->getSyncSession(); bool aborting = false; if (session) { std::string configName = session->getConfigName(); if (configName == syncConfigName) { // Return to caller later, when aborting is done. session->abortAsync(SimpleResult(boost::bind(&GDBusCXX::Result0::done, result), createDBusErrorCb(result))); aborting = true; } } if (!aborting) { result->done(); } } void Manager::setFreeze(const boost::shared_ptr< GDBusCXX::Result1 > &result, const std::string &uid, bool freeze) { checkPeerUID(uid); // Fully qualified peer config name. Only used for sync sessions // and thus good enough to identify them. std::string syncConfigName = StringPrintf("%s@%s%s", MANAGER_LOCAL_CONFIG, MANAGER_PREFIX, uid.c_str()); // Remove all pending sessions of the peer. Make a complete // copy of the list, to avoid issues with modifications of the // underlying list while we iterate over it. // // Cancel pending syncs. This is similar to how we handle suspending of // queued obex transfers: those can't be suspended either and therefore // cancelling them is the simplest solution. BOOST_FOREACH (const Pending_t::value_type &entry, Pending_t(m_pending)) { std::string configName = entry.second->getConfigName(); if (configName == syncConfigName) { entry.first->failed(GDBusCXX::dbus_error(MANAGER_ERROR_ABORTED, "pending sync aborted by StopSync()")); m_pending.remove(entry); } } // Freeze the currently running sync if it is for the peer. boost::shared_ptr session = m_server->getSyncSession(); bool freezing = false; if (session) { std::string configName = session->getConfigName(); if (configName == syncConfigName) { // Return to caller later, when aborting is done. session->setFreezeAsync(freeze, Result(boost::bind(&GDBusCXX::Result1::done, result, _1), createDBusErrorCb(result))); freezing = true; } } if (!freezing) { result->done(false); } } void Manager::addContact(const boost::shared_ptr< GDBusCXX::Result1 > &result, const std::string &addressbook, const PersonaDetails &details) { try { if (!addressbook.empty()) { SE_THROW("only the system address book is writable"); } m_folks->addContact(createDBusCb(result), details); } catch (...) { dbusErrorCallback(result); } } void Manager::modifyContact(const boost::shared_ptr &result, const std::string &addressbook, const std::string &localID, const PersonaDetails &details) { try { if (!addressbook.empty()) { SE_THROW("only the system address book is writable"); } m_folks->modifyContact(createDBusCb(result), localID, details); } catch (...) { dbusErrorCallback(result); } } void Manager::removeContact(const boost::shared_ptr &result, const std::string &addressbook, const std::string &localID) { try { if (!addressbook.empty()) { SE_THROW("only the system address book is writable"); } m_folks->removeContact(createDBusCb(result), localID); } catch (...) { dbusErrorCallback(result); } } SE_END_CXX syncevolution-1.5/src/dbus/server/pim/README0000664000373300001540000007623012405555067022240 0ustar00nightlynightly00000000000000Overview ======== The code in this directory only gets compiled when SyncEvolution is configured with --enable-dbus-service-pim. It uses libfolks and the PBAP backend to implement a unified address book. This additional functionality is provided via the org._01.pim D-Bus API. That API is independent of libfolks and SyncEvolution. That it is implemented inside syncevo-dbus-server merely simplifies the implementation, by reusing some code provided by SyncEvolution and the core Server class: * C++ D-Bus bindings * logging * D-Bus server life cycle control: delay shut down while clients make calls, inhibit shutdown while clients are registered, restart when files change on disk during system update, ... * direct access to SyncEvolution instead having to go through the http://api.syncevolution.org D-Bus API Compilation =========== Use --enable-dbus-service-pim --enable-pbap --enable-ebook. --enable-ebook is already the default at the moment. It must not be disabled. The PBAP backend can be disabled. However, then fetching data from phones via PBAP obviously does not work. More information ================ Public discussion started here, comments can be sent via the gmane "reply" feature: http://comments.gmane.org/gmane.comp.mobile.syncevolution/4009 Issues specific to PIM Manager can be found in this graph: https://bugs.freedesktop.org/showdependencygraph.cgi?id=55916&display=web&rankdir=TB Dependencies ============ A fairly recent libfolks > 0.7.4 is required. The 837a88 commit is required and several other pending changes are recommended: https://bugzilla.gnome.org/show_bug.cgi?id=686693 writing birthday lacks conversion from UTC https://bugzilla.gnome.org/show_bug.cgi?id=685401 linking by email https://bugzilla.gnome.org/show_bug.cgi?id=686695 support nickname in add_persona_from_details Other requirements: * Evolution Data Server >= 3.6 * boost::locale and libphonenumber (when using the default sorting and searching) * glib >= 2.30 * Python >= 2.7 (only for testing) Known issues ============ None at the moment. Extending the implementation ============================ Sorting and searching can be replaced with a different implementation at compile time via --enable-dbus-service-pim[=]: it uses the file src/dbus/server/pim/locale-factory-.cpp to implement sorting and searching. Any additional library dependencies for that file need to be added to the main configure.ac. The default implementation is based on boost::locale and libphonenumber and is described below. Sorting ======= The sort order can be "first/last", "last/first", "fullname". "first/last" sorts based on the first name stored in the "name" property, with the last name used to break ties between equal first names. "last/first" reverts that comparison. "fullname" sorts based on the full name chosen for the contact if there is such a string, otherwise it uses the concatenation of the individual name componts without prefix (= "[] [] [] [])" as fallback. In other words, it sorts correctly when either all contacts have a full name explicitly set or the full names that were set following the same pattern as the fallback. Sorting is case-insensitive. The default is "last/first" if not set earlier. In addition, an empty string as sort order picks a simple, ASCII-based "last/first" sorting. This is used for testing. Searching ========= Supported searches: [ ] - An empty list matches all contacts. [ [ ], [ 'limit', ] ] - a 'limit' search term with a number as parameter (formatted as string) can be added at the top level term to truncate the search results after a certain number of contacts. Example: Search([['any-contains', 'Joe'], ['limit', '10']]) => return the first 10 Joes. As with any other search, the resulting view will be updated if contact data changes. The limit must not be changed in a RefineSearch(). A 'limit' term may (but doesn't have to) be given. If it is given, its value must match the value set when creating the search. This limitation simplifies the implementation and its testing. The limitation could be removed if there is sufficient demand. [ [ ] ] - the same as [ ] [ 'or', , , ... ] - combines 0 to n other searches and results in a match if any of the sub-searches matches. ['or'] without any sub-search does not match. [ 'and', , , ... ] - like 'or', but matches if and only if all of the sub-searches match. [ 'phone', '' ] - Look up a valid phone number (= "caller ID"). The country code for the current locale is added if no country code was given in the number. Phone numbers in the unified address book must start with the resulting full number, after being normalized the same way. In other words: - Formatting does not matter. - Alpha characters are aliases for numbers on the keypad and match their corresponding number. - Additional digits in the address book are ignored, only the prefix must match (extensions may or may not be included in ). - Phone numbers in the address book which cannot be normalized cannot be matched. [ 'is|contains|begins-with|ends-with', '', '', '' ] - compares a specified field against the search text. For the 'is' operation, the entire field must match, for 'contains' anywhere inside the value, for 'begins_with' at the beginning and for 'ends_with' at the end. Fields are referenced as in the contact dictionary (see below), using multiple path components if necessary. Supported for matching are: 'full-name' - string 'nickname' - string 'structured-name/family' - string 'structured-name/given' - string 'structured-name/additional' - string 'phones/value' - telephone number 'emails/value' - string 'addresses/po-box' - string 'addresses/extension' - string 'addresses/street' - string 'addresses/locality' - string 'addresses/region' - string 'addresses/postal-code' - string 'addresses/country' - string The fields referencing value lists ('phones', 'email', 'address') check against any of the entries in these lists. Except for 'phones/value', all values are treated as text values. For text values, the default search without explicit flags is very tolerant, meaning that it ignores quite a few differences between search term and value. The default search: - transliterates any foreign script in search term and values to Latin before comparison, thus finding 江 when searching for Jiang and vice-versa - is case-insensitive - is accent-insensitive Case and accent differences get removed after the optional transliteration. Spaces between words always matter. This behavior can be modified by giving additional, optional flags after the search value: 'case-insensitive' - force case-insensitive search (available for the sake of consistency and just in case, should the default ever change) 'case-sensitive' - force case-sensitive search 'accent-insensitive', 'accent-sensitive' - same for accents 'transliteration' - force transliteration, i.e. explicitly choose the current default 'no-transliteration' - disable transliteration For telephone numbers, only digits are compared. Latin alphabetic characters are treated as aliases for digits as they typically occur on a keypad or old rotary dial phones ('A', 'b', 'c' map to '1', etc.). If the full name was not set explicitly for a contact, the concatenation of the given, middle and family with a space as separator is used instead when matching against the 'full-name' field. Using the current syntax it is not possible to define searches where the *same* value in a value list must meet different criteria ("cell phone number containing the digits 1234"). Something like that could be added as a future extensions, for example by allowing search values to have more complex types than the simple ''. [ 'any-contains', '', ] - Sub-string search for in the following contact values: first, middle or last name, formatted name, nick name, phone number, or email address. Optional flags include: 'case-insensitive' (the default), 'case-sensitive'. This search is equivalent to: [ 'or', [ 'contains', 'structured-name/given', '', ], [ 'contains', 'structured-name/additional', '', ], [ 'contains', 'structured-name/family', '', ], [ 'contains', 'full-name', '', ], [ 'contains', 'emails/value', '', ], [ 'contains', 'phones/value', ''] ] Note that lookup and search are different: the former is based on a valid number, the later on user input. A 'phone' lookup can compare normalized numbers including the country code, to ensure that the lookup is exact and does not mismatch numbers from different countries. Heuristics like suffix matching do not do this correctly in all cases. An 'any-contains' search is based on user input, which might contain just some digits in the middle of the phone number. The search ignores formatting in both input and address book. Compound searches with 'and' and 'or' are evaluated lazily, from the first to the last sub-search. Therefore it makes sense to list sub-searches that are more likely to match first. Phone number lookup =================== A "phone" search must return results quickly (<30ms with 10000 contacts) under all circumstances, including the period of time where the unified address book is still getting assembled in memory. To achieve this, SyncEvolution searches directly in the active address books and presents these results until the ones from the unified address book are ready. A quiescence signal will be sent when: 1. results from EDS are complete before the ones from the unified address book 2. results from the unified address book are complete. The first signal will be skipped and the EDS results discarded if EDS turns out to be slower than the unified address book. Results from different EDS address books are not unified, for the sake of simplicity. They get sorted according to the sort order that was active when starting the search. Changing the sort order while the search runs will only affect the final results from the unified address book. Refining such a search is not supported because refining a phone number lookup is not useful. Peers ===== The following keys are supported for the configuration of a peer: - "protocol" - defines how to access the address book. "PBAB" (phone book access protocol), "files" (read vCard files from directory) and "CardDAV" (one-way or two way syncing with a CardDAV server) are implemented. "SyncML" could be added easily. - "transport" - defines how to establish the connection. The only supported value is "Bluetooth" (for protocol=PBAP or SyncML), which is also the default if not given explicitly. Can be left unset for CardDAV. - "address" - the Bluetooth MAC address in the aa:bb:cc:dd:ee:ff format (for transport=Bluetooth); for CardDAV, this can be the name of a SyncEvolution configuration template (for example, "Google") in which case the default address book on that server will be used unless a database is set explicitly - "username", "password" - the credentials to use for CardDAV, can be left unset for PBAP and file - "database" - empty or unset for the internal address book (protocol=PBAP), or the path to the directory (protocol=file), or the URL of a specific contact collection (protocol=CardDAV, overrides the "address") - "syncmode" - "cache" for one-way syncing with local read-only data (the only allowed value for protocol=PBAP and the default if unset), "two-way" for two-way syncing with locally writable data. In two-way mode, SyncEvolution minimizes user interaction when resolving problems (no slow sync prevention, for example). - "logdir" - a directory in which directories are created with debug information about sync session. - "maxsessions" - number of sessions that are allowed to exist after a sync (>= 0): 0 is special and means unlimited, 1 for just the latest, etc.; old sessions are pruned heuristically (for example, keep sessions where something changed instead of some where nothing changed), so there is no hard guarantee that the last n sessions are present. Not supported via the API at the moment: - selecting a specific phone address book - selecting which vCard properties get cached - listing all available CardDAV contact collections Syncing ======= SyncPeer() and SyncPeerWithFlags() in SyncEvolution will return a dict with all of the following entries set: "modified": boolean - data was modified "added" : integer - number of new contacts "updated" : integer - number of updated contacts "removed" : integer - number of deleted contacts In other words, the caller can reliably detect when nothing changed, but when contacts were modified or added, it needs to read them to determine which kind of properties were modified or added. It is possible that the same contact gets counted twice, for example when adding it in the first text-only cycle and later updating it with photo data in the second cycle, or updating some text first and the photo later. Additional control over syncing is possible via the flags dictionary in SyncPeerWithFlags(). The following keys are possible: "progress-frequency": double - desired frequency in Hz (= events per second) of the SyncProgress "progress" event. Default is 1/s. "pbap-sync": string "text"|"all"|"incremental" - synchronize only text properties, all properties or first text, then all. The default is taken from SYNCEVOLUTION_PBAP_SYNC if set, otherwise it is "incremental". "pbap-chunk-max-count-photo", "pbap-chunk-max-count-no-photo", "pbap-chunk-transfer-time", "pbap-chunk-offset": int32_t - see PBAP README. "pbap-chunk-time-lambda": double - see PBAP README When doing text syncing, local photo data is preserved. The incremental sync has the same effect as a text-only sync followed by an all-properties sync. The only difference is that it looks and behaves like a single sync of the peer. The SyncProgress is triggered by SyncEvolution with three different keys (in this order, with "modified" occuring zero or more times): "started" ("modified" | "progress")* "done" "started" and "done" send an empty data dictionary. "modified" sends the same dictionary as the one returned by SyncPeer(), if and only if contact data was modified. So by definition, "modified" will be True in the dictionary, but is included anyway for the sake of consistency. "progress" sends a dictionary with these keys: - "percent": double - value from 0 (start of sync) to 1 (end of sync) - "modified": undefined value - set if the database was modified since the last "progress" event. Detecting the exact moment when a change is made can be hard, so the implementation may err on the side of caution and signal a change more often than strictly necessary. The recipient must check the database anyway to determine what changed. The value is intentionally undefined at the moment and the recipient must not make assumptions about it. Instead it should just check for the presence of the entry. In the future, more specific information about what was modified might be included as value. - "sync-cycle": string - describes in what phase the sync is at the moment, see "pbap-sync" in SyncPeerWithFlags() - "text" - text-only sync active - "all" - non-incremental text and picture sync active - "incremental-text" - incremental sync active, currently syncing text - "incremental-picture" - incremental sync active, done with text, now syncing pictures - "" - some other kind of sync (non-PBAP, for example) "progress" is guaranteed to be emitted at the end of each cycle. In contrast to "modified", it will also be sent throughout the sync *if and only if* progress has been made, regardless whether that progress led to contact data changes or an increase in the completion percentage. That way, the event also serves as a heartbeat mechanism. The completion percentage is based purely on the number of contacts on the peer, which is the only thing known about the peer at the start of a sync. In a simple sync involving just one cycle, the percentage is "number of processed contacts / total contacts". In a sync involving two cycles, it is "number of processed contacts / 2 / total contacts". Because each contact gets processed once per cycle, that gives 50% completion at the end of the first cycle and 100% at the end of the second. Note that progress will not be linear over time even for a simple sync, because some contacts will take more time to download and process than others. For an incremental sync, the first cycle is likely to be much faster than the second one because the second one includes photo data. Progress events get emitted at the time when progress is made. If that is too close in time to the last progress event (see "progress-frequency"), the event is skipped. Events are not simply sent at regular intervals because that would emit events even when syncing is not making progress and distort the timing information (for example, 50% reached and recorded at time t, actual event with 50% sent at t + delta). In practice, the number of progress events is limited by various chunk sizes in the implementation (internal SyncML message size, amount of new data that must come in via PBAP before processing it), leading to a refresh rate during Bluetooth transfers which is closer to every two seconds. GetPeerStatus() returns two additional entries in the dictionary: "progress": same dictionary as the SyncProgress "progress" value "last-progress": double - time in seconds since the last "progress" event. This is included to let a polling client determine whether the sync is still alive. Contact Data ============ A contact dictionary has the following key/value pairs. More properties may be added later. contact dictionary: "id" - string, see API description "source" - string, see API description "full-name" - string, formatted by the user or automatically (vCard FN) "nickname" - string "structured-name" - name dictionary (vCard N) "photo" - string, the URL (usually of a local file; EDS strips all inline photo data in vCards and puts them into local files, leading to URLs like: file:///home/user/.local/share/evolution/addressbook/system/photos/pas_id_5012983E0000065A_photo-file0.image%2Fjpeg) "birthday" - birthday tuple "emails" - value list with strings as value "phones" - value list with strings as value "urls" - value list with strings as value "notes" - list of strings; in practice only one entry is supported "addresses" - value list with an address dictionary as value "roles" - list of role dictionaries "groups" - list strings representing the names of groups the contact belongs to (CATEGORIES in vCard) "location" - a pair of doubles, representing latitude + longitude (in this order, see GEO in vCard); typically based on WGS84 name dictionary: "family" - string, the last name "given" - string, the fist name "additional" - string, middle names "prefixes" - string, name prefix like "Mr." "suffixes" - string, name suffix like "Sr." birthday tuple: (yy, mm, dd) - integer values for year, month, and day role dictionary: "organisation" - main organization ("Foo ACME") "title" - title inside that organization ("vice president") "role" - role as part of that origanization ("adviser") value list: [ (value, [parameter, ...]), (value, ...) ] value - depends on the property parameter - a string, with values again depending on the property; a value may have zero to n different parameters phone parameters: "voice" "fax" "car" "cell" "pager" "pref" "home" "work" "other" (might not be set explicitly) address parameters: "home" "work" "other" (might not be set explicitly) url parameters: "x-home-page" "x-blog" "x-free-busy" - public calendar free/busy URL "x-video" - video chat URL address dictionary: "po-box" - string, post office box "extension" - string, address extension "street" - string, street name "locality" - string, city name "region" - string, area name "postal-code" - string "country" - string Note: all of the strings and values above are defined by SyncEvolution in individual-traits.cpp, except for parameter strings. Those come directly from folks, more specifically AbstractFieldDetails: http://telepathy.freedesktop.org/doc/folks/vala/Folks.AbstractFieldDetails.html Here is an example contact dictionary, using Python syntax: { 'full-name': 'John Doe', 'nickname': 'Johnny', 'groups': ['friends', 'soccer'], 'location': (30.12, -130.34), 'structured-name': {'given': 'John', 'family': 'Doe'}, 'birthday': (2006, 1, 8), 'photo': 'file:///home/user/file.png', 'roles': [ { 'organisation': 'Test Inc.', 'role': 'professional test case', 'title': 'Senior Tester', }, ], 'source': [ ('test-dbus-foo', luids[0]) ], 'id': 'xyz', 'notes': [ 'This is a test case which uses almost all Evolution fields.', ], 'emails': [ ('john.doe@home.priv', ['home']), ('john.doe@other.world', ['other']), ('john.doe@work.com', ['work']), ('john.doe@yet.another.world', ['other']), ], 'phones': [ ('business 1', ['voice', 'work']), ('businessfax 4', ['fax', 'work']), ('car 7', ['car']), ('home 2', ['home', 'voice']), ('homefax 5', ['fax', 'home']), ('mobile 3', ['cell']), ('pager 6', ['pager']), ('primary 8', ['pref']), ], 'addresses': [ ({'country': 'New Testonia', 'locality': 'Test Megacity', 'po-box': 'Test Box #3', 'postal-code': '12347', 'region': 'Test County', 'street': 'Test Drive 3'}, []), ({'country': 'Old Testovia', 'locality': 'Test Town', 'po-box': 'Test Box #2', 'postal-code': '12346', 'region': 'Upper Test County', 'street': 'Test Drive 2'}, ['work']), ({'country': 'Testovia', 'locality': 'Test Village', 'po-box': 'Test Box #1', 'postal-code': '12345', 'region': 'Lower Test County', 'street': 'Test Drive 1'}, ['home']), ], 'urls': [ ('chat', ['x-video']), ('free/busy', ['x-free-busy']), ('http://john.doe.com', ['x-home-page']), ('web log', ['x-blog']), ], } Configuration and data handling =============================== The configuration of peers is mapped to normal SyncEvolution configurations. Every peer gets its own context, which contains both the local source definition for the peer and sync plus target configs. The special name space prefix "pim-manager-" used to identify them and avoid potential conflicts with normal SyncEvolution configurations. Look in ~/.config/syncevolution/pim-manager-* to find the configuration files. Local EDS databases are created with a fixed UID and name that also have that prefix. One could go one step further than it is currently done and set these databases to "disabled" in the ESourceRegistry, which would hide them in Evolution. The SyncEvolution command line can be used to view or manipulate these databases: https://syncevolution.org/wiki/item-operations The sort order and set of active address books are stored persistently in ~/.config/syncevolution/pim-manager.ini as: - "sort" = same value as in the API - "active" = space, comma or tab separated EDS source UUIDs Usage ===== The PIM manager is part of the syncevo-dbus-server. It can be started automatically via D-Bus or explicitly. When started automatically, it logs error messages to syslog. The PIM manager starts as idle and needs to be started via the D-Bus Start() API before it begins assembling the unified address book. SyncEvolution installs an XDG autostart file (/etc/xdg/autostart/syncevo-dbus-server.desktop) which, on systems supporting that mechanism, ensures that syncevo-dbus-server is started once. This is used for automatic syncing, which is not active when using only the PIM Manager. Therefore syncevo-dbus-server will terminate again after some idle period. It's recommended to disable this mechanism or patch syncevo-dbus-server.desktop to start the server with different options. In particular the "--start-pim" option may be useful to start up the UI and the server in parallel. Here is a list of supported options: Help Options: -h, --help Show help options Application Options: -d, --duration=seconds/'unlimited' Shut down automatically when idle for this duration (default 300 seconds) -v, --verbosity=level Choose amount of output, 0 = no output, 1 = errors, 2 = info, 3 = debug; default is 1. -o, --stdout Enable printing to stdout (result of operations) and stderr (errors/info/debug). -s, --no-syslog Disable printing to syslog. -p, --start-pim Activate the PIM Manager (= unified address book) immediately. Limitations =========== There are no hard-coded limits. In practice the number of contacts, parallel searches, peers, etc. is limited by CPU performance, amount of RAM and disk space. Functionality ============= Caching ------- Caching of contacts is done roughly like this: 1. The PBAP backend reads all contact data. See src/backends/pbap. 2. As part of a local sync (see main SyncEvolution README), a local-cache-slow sync is done. In that mode all local data is compared against the incoming data. Matches are found according to the properties that are defined as compare="always" or compare="slowsync" in src/syncevo/configs/datatypes/00vcard-fieldlist.xml. In the default file, these are the first, middle and last name and the organization. 3. Local entries which have a match are updated with data from that match, unmatched local entries are removed and unmatched incoming ones are created. This means that changing "less important" properties will be turned into local updates. This has the desirable effect of not changing the local ID of the existing contact, which might become important when attaching local meta data to that contact via its local ID (not supported at the moment; folks itself has a favorite flag which is stored like that). It also reduces disk IO. If matching fails, a contact will get deleted and recreated. The end result in the unified address book is still the same, because folks does not rely on the ID for linking. With CardDAV, only the initial sync downloads all contacts. Any following sync uses locally stored meta data about the server to detect changes (added, updated, deleted contacts) and then applies these changes locally. If an incremental sync is impossible for whatever reason (for example, the local meta data about the CardDAV server got lost), SyncEvolution falls back to the PBAP approach of comparing local and remote data and updating the local side. Supported fields ---------------- The PBAP backend always downloads the entire vCard. It supports restricting the vCard to specific properties, see src/backend/pbap/README. However, this is not used by the PIM Manager. In particular, PHOTO data is always included in the download right away. A mode where caching only works without PHOTO in the initial pass and then adds that in a second step could be added. Internally a vCard is represented as a Synthesis field list (again, see 00vcard-fieldlist.xml). X- extensions in the incoming vCard are preserved. Unified address book -------------------- The unified address book is assembled by folks based on properties that it considers "linkable". Linkable properties must be unique for a person. A phone number is not linkable, because different persons living at the same place might share a phone. For EDS, the linkable properties are defined in folk's backends/eds/lib/edsf-persona.vala and currently are: - instant messaging handles - email addresses - local IDs (not used in this context) - web service addresses (not used in this context) folks supports heuristics for identifying persons which are likely to be the same. This is not used by the PIM Manager. If it was, then links would have to be established based on the local IDs and keeping those stable became more important. Localization ------------ The usual environment variables are used to determine the locale: LC_CTYPE, LC_ALL, and LANG in that order (i.e. LC_CTYPE first and LANG last). There is no support for changing that once syncevo-dbus-server runs. boost::locale is used for collation while sorting contacts. The secondary collation level is used, which means that case, punctuation are ignored while accents are relevant. This is hard-coded in locale-factory-boost.cpp as DEFAULT_COLLATION_LEVEL. Searching is either done with a strict text comparison (case sensitive) or after using case folding (case insensitive, see http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding). A 'phone' lookup uses libphonenumber to compare the free-form text field for telephone numbers against a caller ID. The text field must be in a format that libphonenumber understands, otherwise it will be ignored. A country code is optional. If missing, the country code of the current locale will be added before the comparison. Testing ======= Tests are mostly written in Python. See test/test-dbus.py (base classes and testing of the normal SyncEvolution D-Bus API) and src/dbus/server/pim/testpim.py. These operations manipulate the system address book. To avoid unexpected data loss when a developer runs the script in his normal environment, check that testpim.py gets run like this: XDG_CONFIG_HOME=`pwd`/temp-testpim/config \ XDG_DATA_HOME=`pwd`/temp-testpim/local/cache \ PATH=/bin:/libexec:$PATH \ /test/dbus-session.sh \ /src/dbus/server/pim/testpim.py This will use temp-testpim in addition to temp-testdbus in the current directory for temporary files. If TEST_DBUS_PBAP_PHONE is set to the Bluetooth MAC address (like A0:4E:04:1E:AD:30) of a phone, PBAP syncing with that phone is tested. The phone must be paired, connected and support SyncML in addition to PBAP. The test hard-codes Nokia SyncML settings to keep it simpe and because Nokia phones are most likely to be used. syncevolution-1.5/src/dbus/server/pim/pim-manager-api.txt0000644000373300001540000004564412326412403025054 0ustar00nightlynightly00000000000000Preamble ======== This text describes a D-Bus API. The API implements in-vehicle infotainment (IVI) use cases around contacts: - cache address books from peers (primarily phones connected via Bluetooth) in local address books - provide a unified address book that combines a configurable (and changing) subset of the local address books - fast phone number lookup - browsing and searching in the unified address book Tasks that are expected to be done by the user of this API: - identify peers and their capabilities - decide how and when peer data should be cached - define which data goes into the unified address book In other words, the API provides the mechanisms and the user the policy. Several aspects of this API may differ depending on the implementation. For example, searching for contacts and syncing with peers are not described in the API. Consult the documentation of the API implementation to learn what it supports. For SyncEvolution, that documentation is the src/dbus/server/pim/README file. Datatypes ========= Peers ----- A peer is an entity which has exactly one address book that is meant to be cached locally. Typically a peer is a phone connected via Bluetooth and accessed via PBAP, but it could also be a web service that supports CardDAV or a phone with SyncML support. Peers are identified by a unique string ID. That ID needs to be assigned by the user of this API. The string must not be empty and may only contain characters a-z, 0-9 and hyphen. No other assumptions about its content are made. For example, the phone's Bluetooth MAC address could be used after removing or replacing the colon and using lower case hex characters. For an entity that has more than one address book, multiple peers must be configured. For each peer, enough information must be provided to access its address book. That information is passed via D-Bus as a string-to-string dict, with keys and their values being defined by the implementation. For the sake of API and implementation simplicity, a peer can have only one running sync at a time. The API uses the peer ID for information about such a running sync (see "SyncProgress" signal). Address books ------------- Address books which mirror data from a specific peer use the string "peer-" as ID, where is the unique ID of that peer. In addition, there is a system address book which is independent of any particular phone. Its ID is the empty string. This naming scheme can be extended later on, to support other kinds of address books. Contact ------- A single contact is transferred via D-Bus as a string->variant dict where the keys are predefined property names and the values represent simple values (a string for "full-name") or more complex structures (list of phone numbers for "phone-numbers", with each list entry itself being a combination of type flags and the actual value). [comment: this mirrors the properties of a libfolks Individual: http://telepathy.freedesktop.org/doc/folks/c/FolksIndividual.html] Some properties of a FolksIndividual only make sense locally and are not transmitted, for example the personas it is derived from. Some other properties provide information not found that way in FolksIndividual: - "source" = list of string pairs, where each pair is a combination of address book ID and local contact ID inside that address book (not necessarily the same as the vCard UID of a contact!) - "id" = an opaque string which identifies the contact while it exists inside any PIM Manager view. See ContactsAdded and ReadContacts. Property values which are large (like photos) are not sent via D-Bus. Instead a link to a local file is sent. For a full definition of contact properties see the implementation documentation. Search results -------------- The goal is to support a UI which: - displays an ordered list of the search result, - can show the initial results with minimal delay, - can load actual content for the display as needed (only load the parts which are visible or will be visible soon). The content of the unified address book can change at any time. The API design takes that into account by using a model/view/controller model. The model is the complete list of contacts, sorted according to the currently configured sort order. Sorting is part of the model to simplify generating views. The view is the subset of the data that a user of the API has requested. In the most extreme case, all contacts are part of the view. Therefore contact data has to be requested explicitly. Contacts are numbered 0 to n-1 in each view, where n is the number of contacts in the view. Sort order is the same as in the underlying model. Change notifications with these index numbers are sent as contacts are added, modified or removed. The controller is the part of the API which allows changing contacts in the system address book, changing the sort order, enabling or disabling address books, etc. Note that removing or adding a contact changes the numbers assigned to other contacts. Example: - A view containing 10 contacts is created. - A notification about "contacts #0 to #9 added" is sent (given as pair of first index and count, not list of numbers). - The five contacts starting with #5 to are read via their ID. - Contact #4 gets removed. The user needs to remember that the data that it has now corresponds to contacts #4 to #8. - Contact #5 gets added, before the contact which had that number before. The user now has contacts #4 and #6 to #9. It should request contact #5 if (or once) it is needed to provide a complete list to the user. [comment: using a view could be simplified by including contact data in the change notifications. This is not planned at the moment because it would not work well for large views. When adding it, there should be an API to restrict which properties of a contact get sent.] Error handling ============== D-Bus error messages are not localized. They are meant for debugging, not for displaying to the user. In cases where the caller may be able to do something about an error, specific error codes are defined as part of the API. However, typically errors are generic and the caller simply has to assume that the PIM storage is currently unusable. Unless noted otherwise, calls return when the requested operation is complete. The following errors are defined. In addition to the D-Bus name of the error they provide a textual error description. org._01.pim.contacts.Manager.Aborted Some operation was intentionally aborted instead of letting it complete. Typically not an error. org._01.pim.contacts.Manager.BadStatus A generic error report. The error description is a string which gives further information for debugging. API === PIM Manager ----------- The PIM manager is used to hold the unified address book in memory, create views on it, change configuration and control data transfers from phones. Service: org._01.pim.contacts Interface: org._01.pim.contacts.Manager Object path: /org/01/pim/contacts Methods: void Start() The PIM manager does not start loading contact data right away. That allows setting the options like sort order first and/or delaying the loading until it is needed. After Start(), changing options that affect the unified address book will take effect immediately. Calling Start() is optional, any method asking for data will automatically do that. void Stop() Explicitly tells the PIM manager to discard the unified address book and free up the memory if possible (= not currently in use). Primarily useful for testing. void SetSortOrder(string mode) "mode" must be one of the values supported by the implementation. string GetSortOrder() Returns the current sort order. list of strings GetActiveAddressBooks() Returns the IDs of the address books which currently contribute to the unified address book. void SetActiveAddressBooks(list of strings) Sets the address books which contribute to the unified address book. void CreatePeer(string uid, dict properties) Creates a peer. Will fail with a org._01.pim.contacts.Manager.AlreadyExists error if the uid is already in use. To change the configuration of a peer, remove and recreate it. This ensures that its data gets removed, too. [A ModifyPeer() might get added if there is demand for it and the desired behavior (remove cached data or keep it?) is better understood.] As a backwards compatibility measure this method is also available as SetPeer() with the semantic that the config is created or modified automatically as needed. void RemovePeer(string uid) Removes a peer and all its cached data. If that data was part of the active address books, it will be removed automatically. dict SyncPeer(string uid) Retrieve contacts from the peer and ensure that the local cache is identical to the address book of the peer. The call returns once the operation is complete. Only if there was no error can the caller assume that the cache is up-to-date. In this case, a string to variant dictionary is returned which provided additional information about the sync. The content of the dictionary is implementation dependent. If the call fails, no dictionary is returned and the local cache may or may not be up-to-date. It may or may not have been updated. The caller needs to check the local cache to find out what it contains. dict SyncPeerWithFlags(string uid, dict flags) Same as SyncPeer() with additional control over the sync via optional flags. The flags and their values are implementation-dependent. void StopSync(string uid) Stop any running sync for the given peer. The SyncPeer() method which started such a sync will return with an "aborted" error once the sync was stopped. bool SuspendSync(string uid) Suspend any running sync for the given peer. The SyncPeer() method which started such a sync will continue to run. If suspending is not possible for some reason, the sync will automatically abort or fail (depending on the peer). It is okay to suspend twice. Suspend and resume calls are not nested, so a suspended sync resumes after one ResumeSync(), regardless how often SuspendSync() was called. Returns true if and only the suspend state changed, otherwise false. bool ResumeSync(string uid) Resume a previously suspended sync. It is not an error to call this when there is no sync running or it was not suspended. Returns true if and only the suspend state changed, otherwise false. dict GetPeerStatus(string uid) Returns information about the peer and its sync status. The returned dictionary contains: "status": string "idle", "syncing", "suspended" - describes whether a sync is currently running. Idle means "no active sync"; there might be a pending SyncPeer(). Implementations can also provide information similar to the data provided by the SyncProgress signal. dict of UID to string key/value dict GetAllPeers() Returns information about all currently configured peers. object Search(list filter, object agent) Creates a new view which contains all contacts matching the filter. The call returns the object path of a view object after validating parameters and starting the result gathering, and before completing the search. The view object can be used to control the view via the org._01.pim.contacts.ViewControl interface. The content of the filter is defined by the implementation. Notifications for the view are sent back to the caller by invoking methods from the org._01.pim.contacts.ViewAgent interface on the object whose path is given in the "view" parameter. If any of these method calls fail, the view will automatically be destroyed. In other words, the caller first needs to get ready to process results by registering an object on the bus before calling Search(). [comment: this allows sending results to just one recipient, something that cannot be done easily with the use of signals as in, for example, obexd. In obexd, the initiator of a transfer has to subscribe to org.bluez.obex.Transfer on the object path returned to it when starting the transfer, then check the current status before waiting for signals, because the "Completed" signal might have been sent before it could register for it.] string AddContact(string addressbook, dict contact) Adds a new contact to the given address book. Typically only the system address book is writable. Contact properties which are unknown or cannot be stored are silently ignored. Returns the local ID of the new contact in the address book. Photo data that is sent inline in the dict will be split out into a file that gets associated with the contact. A photo file that gets linked will continue to be owned by the caller; the contact storage may or may not make a copy of it, depending on which storage is used. void ModifyContact(string addressbook, string localid, dict contact) Updates an existing contact. void RemoveContact(string addressbook, string localid) Remove the contact and all of its associated data (like the photo, if the photo file is owned by the contact storage). Signals: SyncProgress(string uid, string event, dict data) Provides information about a running sync for the peer with the given "uid". The "event" string describes what happened and the "data" dictionary provides further information about it with a mapping from event specific string keys to variants as value. Service: org._01.pim.contacts Interface: org._01.pim.contacts.ViewControl Object path: [variable prefix]/{view0,view1,....} Methods: list of (int index, contact dicts) pairs ReadContacts(array ids) Requests the data of the contacts idenfified via their IDs. Only the data of contacts that are still part of the view can be returned. The returned list contains the current index of the requested contact plus its data. -1 and an empty dictionary are returned for contacts which can no longer be read, for example because they were removed from the view in the meantime or because the ID was simply invalid. Note that the caller must process the call response after all events via the ViewAgent interface. Otherwise the index numbers are potentially out of sync and thus unreliable. Doing this call asynchronously and dealing with the response as part of the main event loop will do the right thing automatically, because D-Bus guarantees ordering of messages. Making this explicit by returning data via another org._01.pim.contacts.ViewAgent method was considered and rejected a) for the sake of keeping this API simple and b) to allow simple synchronous calls where it makes sense (testing, for example). void Close() Closes the view and all resources associated with it. Pending ReadContacts() calls will return without any data and no error. void RefineSearch(list filter) Replaces the current filter of the view with a new one. The new filter must be stricter than the old one. Contacts which were already filtered out will not be added back to the view when setting a less restrictive filter (simplifies the implementation and improves performance). void ReplaceSearch(list filter, bool refine) Same as RefineSearch() if refine is true. If refine is false, the new filter can be less restrictive and contacts which did not match the old filter will be added back to the list of matching contacts. Service: [user of the PIM Manager] Interface: org._01.pim.contacts.ViewAgent Object path: [as chosen by user of PIM Manager] Methods: void ContactsModified(object view, int start, array ids) Contacts #start till #start + count (inclusive) have changed. Data that the recipient of the call might have cached became invalid and should be reloaded. It is possible that a contact gets replaced by another with a single "contact modified" signal. In other words, the ID at each position may change and thus the IDs are sent as part of the signal. In cases where a contact changes its position in the view, both a combination of "contact removed" + "contact added" (single contact changes) as well as several "contact modified" signals are possible (contacts swap position, for example when reordering). In the later case, a contact will temporarily appear at two different positions. void ContactsAdded(object view, int start, array ids) New contacts were added to the view. The number of new contacts is given via the size of the ids array. The ID of each new contact is guaranteed to be the same in all views. IDs may get reused after their contact got removed from the last view it was contained in. In particular there is no guarantee that it is persistent across restarts of the PIM manager. The contact which previously had index #start now has index #start + count, etc. void ContactsRemoved(object view, int start, array ids) Some contacts were removed from the view. The contact which previous had index #start + count (if there was one) now has index #start, etc. void Quiescent(object view) The current content of the view is complete. No further updates are expected until something changes again (underlying data, ordering, active address books, filter). Changing data (directly or via syncing) can trigger multiple "Quiescent" signals, depending on when these changes are reported by the underlying storage. Changing multiple settings will trigger one "Quiescent" per change. Implementing the Quiescent() method in a ViewAgent is optional. syncevolution-1.5/src/dbus/server/pim/testpim.py0000775000373300001540000061430712424466461023425 0ustar00nightlynightly00000000000000#! /usr/bin/python -u # -*- coding: utf-8 -*- # vim: set fileencoding=utf-8 :# # # Copyright (C) 2012 Intel Corporation # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA # PIM Manager specific tests, using Python unittest as framework. # # Run with "syncevolution", "synccompare" and "syncevo-dbus-server" in # the PATH. # # Uses the normal testdbus.py infrastructure by including that file. # Can be run directly from the SyncEvolution source code or after # copying test/testdbus.py and src/dbus/server/pim/testpim.py into the # same directory. import os import errno import sys import inspect import unittest import time import copy import subprocess import dbus import traceback import re import itertools import codecs import pprint import shutil import ConfigParser import io import localed # Update path so that testdbus.py can be found. pimFolder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0])) if pimFolder not in sys.path: sys.path.insert(0, pimFolder) testFolder = os.path.realpath(os.path.abspath(os.path.join(os.path.split(inspect.getfile(inspect.currentframe()))[0], "../../../../test"))) if testFolder not in sys.path: sys.path.insert(0, testFolder) # Rely on the glib/gobject compatibility import code in test-dbus.py. from testdbus import glib, gobject from testdbus import DBusUtil, timeout, Timeout, property, usingValgrind, xdg_root, bus, logging, NullLogging, loop, listall import testdbus def timeFunction(func, *args1, **args2): start = time.time() res = { } args2['reply_handler'] = lambda x: (res.__setitem__('okay', x), loop.quit()) args2['error_handler'] = lambda x: (res.__setitem__('failed', x), loop.quit()) func(*args1, **args2) loop.run() end = time.time() if 'failed' in res: raise res['failed'] return (end - start, res['okay']) @unittest.skip("not a real test") class ContactsView(dbus.service.Object, unittest.TestCase): '''Implements ViewAgent, starts a search and mirrors the remote state locally.''' counter = 1 def __init__(self, manager): '''Create ViewAgent with the chosen path.''' self.manager = manager # Ensure unique path across different tests. self.path = '/org/syncevolution/testpim%d' % ContactsView.counter ContactsView.counter = ContactsView.counter + 1 self.view = None # List of encountered errors in ViewAgent, should always be empty. self.errors = [] # Currently known contact data, size matches view. # Entry is a string (just the ID is known), # a tuple (ID + time when reading started), or # a dictionary (actual content known). self.contacts = [] # Change events, as list of ("modified/added/removed", start, count). self.events = [] # Number of times that ViewAgent.Quiescent() was called. self.quiescentCount = 0 self.logging = logging # Called at the end of each view notification. # May throw exceptions, which will be recorded in self.errors. self.check = lambda: True dbus.service.Object.__init__(self, dbus.SessionBus(), self.path) unittest.TestCase.__init__(self) # Set self.check and returns a wrapper for use in runUntil. # The function passed in should not check self.errors, this # will be added by setCheck() for use in runUntil. def setCheck(self, check): if check: self.check = check else: check = lambda: True self.check = check return lambda: (self.assertEqual([], self.errors), check()) def runTest(self): pass def search(self, filter): '''Start a search.''' self.viewPath = self.manager.Search(filter, self.path) self.view = dbus.Interface(bus.get_object(self.manager.bus_name, self.viewPath), 'org._01.pim.contacts.ViewControl') def close(self): self.view.Close() def getIDs(self, start, count): '''Return just the IDs for a range of contacts in the current view.''' return [isinstance(x, dict) and x['id'] or \ isinstance(x, tuple) and x[0] or \ x \ for x in self.contacts[start:start + count]] def countData(self, start, count): '''Number of contacts with data in the given range.''' total = 0 for contact in self.contacts[start:start + count]: if isinstance(contact, dict): total = total + 1 return total def haveData(self, start, count = 1): '''True if all contacts in the range have data.''' return count == self.countData(start, count) def haveNoData(self, start, count = 1): '''True if all contacts in the range have no data.''' return 0 == self.countData(start, count) def processEvent(self, message, event): self.logging.log(message) self.events.append(event) @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='oias', out_signature='') def ContactsModified(self, view, start, ids): count = len(ids) self.processEvent('contacts modified: %s, start %d, ids %s' % (view, start, ids), ('modified', start, count)) try: self.assertEqual(view, self.viewPath) self.assertGreaterEqual(start, 0) self.assertGreater(count, 0) self.assertLessEqual(start + count, len(self.contacts)) # Overwrite valid data with just the (possibly modified) ID. self.contacts[start:start + count] = [str(x) for x in ids] self.logging.printf('contacts modified => %s', self.contacts) self.check() except: error = traceback.format_exc() self.logging.printf('contacts modified: error: %s' % error) self.errors.append(error) @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='oias', out_signature='') def ContactsAdded(self, view, start, ids): count = len(ids) self.processEvent('contacts added: %s, start %d, ids %s' % (view, start, ids), ('added', start, count)) try: self.assertEqual(view, self.viewPath) self.assertGreaterEqual(start, 0) self.assertGreater(count, 0) self.assertLessEqual(start, len(self.contacts)) self.contacts[start:start] = [str(x) for x in ids] self.logging.printf('contacts added => %s', self.contacts) self.check() except: error = traceback.format_exc() self.logging.printf('contacts added: error: %s' % error) self.errors.append(error) @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='oias', out_signature='') def ContactsRemoved(self, view, start, ids): count = len(ids) self.processEvent('contacts removed: %s, start %d, ids %s' % (view, start, ids), ('removed', start, count)) try: self.assertEqual(view, self.viewPath) self.assertGreaterEqual(start, 0) self.assertGreater(count, 0) self.assertLessEqual(start + count, len(self.contacts)) self.assertEqual(self.getIDs(start, count), ids) del self.contacts[start:start + count] self.logging.printf('contacts removed => %s', self.contacts) self.check() except: error = traceback.format_exc() self.logging.printf('contacts removed: error: %s' % error) self.errors.append(error) @dbus.service.method(dbus_interface='org._01.pim.contacts.ViewAgent', in_signature='o', out_signature='') def Quiescent(self, view): # Allow exceptions from self.processEvent to be returned to caller, # because Quiescent() is allowed to fail. testQuiescentOptional # depends on that after hooking into the self.processEvent call. self.quiescentCount = self.quiescentCount + 1 self.processEvent('quiescent: %s' % view, ('quiescent',)) try: self.check() except: error = traceback.format_exc() self.logging.printf('quiescent: error: %s' % error) self.errors.append(error) def read(self, start, count=1): '''Read the specified range of contact data.''' starttime = time.time() ids = [] for index, entry in enumerate(self.contacts[start:start+count]): if isinstance(entry, str): ids.append(entry) self.contacts[start + index] = (entry, starttime) # Avoid composing too large requests because they make the # server unresponsive and trigger our Watchdog. Instead chop up # into pieces and ask for more once we get the response. def step(contacts, start): for index, contact in contacts: if index >= 0: self.contacts[index] = contact if start < len(ids): end = min(start + 50, len(ids)) self.view.ReadContacts(ids[start:end], reply_handler=lambda contacts: step(contacts, end), error_handler=lambda error: self.errors.append(x)) step([], 0) class Watchdog(): '''Send D-Bus queries regularly to the daemon and measure response time.''' def __init__(self, test, manager, threshold=0.1, interval=0.2): self.test = test self.manager = manager self.started = None self.results = [] # tuples of start time + duration self.threshold = threshold self.interval = interval self.timeout = None def start(self): self.timeout = glib.Timeout(int(self.interval * 1000)) self.timeout.set_callback(self._ping) self.timeout.attach(loop.get_context()) if self.threshold < 0: print '\nPinging server at intervals of %fs.' % self.interval def stop(self): if self.timeout: self.timeout.destroy() self.started = None def check(self): '''Assert that all queries were served quickly enough.''' if self.threshold > 0: tooslow = [x for x in self.results if x[1] > self.threshold] self.test.assertEqual([], tooslow) if self.started: self.test.assertLess(time.time() - self.started, self.threshold) def reset(self): self.results = [] self.started = None def checkpoint(self, name): self.check() logging.printf('ping results for %s: %s', name, self.results) if self.threshold < 0: for result in self.results: print '%s: ping duration: %f' % (name, result[1]) self.reset() def _ping(self): if not self.started: # Run with a long timeout. We want to know how long it # takes to reply, even if it is too long. started = time.time() self.started = started self.manager.GetAllPeers(reply_handler=lambda peers: self._done(started, self.results, None), error_handler=lambda error: self._done(started, self.results, error)) return True def _done(self, started, results, error): '''Record result. Intentionally uses the results array from the time when the call started, to handle intermittent checkpoints.''' duration = time.time() - started if self.threshold > 0 and duration > self.threshold or error: logging.printf('ping failure: duration %fs, error %s', duration, error) if error: results.append((started, duration, error)) else: results.append((started, duration)) if self.started == started: self.started = None class TestPIMUtil(DBusUtil): def setUp(self): self.cleanup = [] self.manager = dbus.Interface(bus.get_object('org._01.pim.contacts', '/org/01/pim/contacts'), 'org._01.pim.contacts.Manager') # Determine location of EDS source configs. config = os.environ.get("XDG_CONFIG_HOME", None) if config: self.sourcedir = os.path.join(config, "evolution", "sources") else: self.sourcedir = os.path.expanduser("~/.config/evolution/sources") # SyncEvolution uses a local temp dir. self.configdir = os.path.join(xdg_root, "syncevolution") # Common prefix for peer UIDs. Use different prefixes in each test, # because evolution-addressbook-factory keeps the old instance # open when syncevo-dbus-server stops or crashes and then fails # to work with that database when we remove it. self.uidPrefix = self.testname.replace('_', '-').lower() + '-' # Prefix used by PIM Manager in EDS. self.managerPrefix = 'pim-manager-' # Remove all sources and configs which were created by us # before running the test. removed = False if os.path.exists(self.sourcedir): for source in os.listdir(self.sourcedir): if source.startswith(self.managerPrefix + self.uidPrefix): os.unlink(os.path.join(self.sourcedir, source)) removed = True if removed: # Give EDS time to notice the removal. time.sleep(5) def tearDown(self): for x in self.cleanup: x() def setUpView(self, peers=['foo'], withSystemAddressBook=False, search=[], withLogging=True): '''Set up peers and create a view for them.''' # Ignore all currently existing EDS databases. self.sources = self.currentSources() self.expected = self.sources.copy() self.peers = {} # dummy peer directory self.contacts = os.path.abspath(os.path.join(xdg_root, 'contacts')) os.makedirs(self.contacts) # add peers self.uid = None self.uids = [] for peer in peers: uid = self.uidPrefix + peer if self.uid == None: # Remember first uid for tests which only use one. self.uid = uid self.uids.append(uid) self.peers[uid] = {'protocol': 'PBAP', 'address': 'xxx'} self.manager.SetPeer(uid, self.peers[uid]) self.expected.add(self.managerPrefix + uid) self.assertEqual(self.peers, self.manager.GetAllPeers()) self.assertEqual(self.expected, self.currentSources()) # Delete local data in the cache. logging.log('deleting all items of ' + uid) self.runCmdline(['--delete-items', '@' + self.managerPrefix + uid, 'local', '*']) # Limit active databases to the one we just created. addressbooks = ['peer-' + uid for uid in self.uids] if withSystemAddressBook: addressbooks.append('') # Delete content of system address book. The check at the start of # the script ensures that this is not the real one of the user. logging.log('deleting all items of system address book') self.runCmdline(['--delete-items', 'backend=evolution-contacts', '--luids', '*']) self.manager.SetActiveAddressBooks(addressbooks) self.assertEqual(addressbooks, self.manager.GetActiveAddressBooks(), sortLists=True) # Start view. self.view = ContactsView(self.manager) if not withLogging: self.view.processEvent = lambda message, event: True self.view.logging = NullLogging() # Optional: search and wait for it to be stable. if search != None: self.view.search(search) self.runUntil('empty view', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) # Clear unknown sequence of events. self.view.events = [] def runCmdline(self, command, **args): '''use syncevolution command line without syncevo-dbus-server, for the sake of keeping code here minimal''' cmdline = testdbus.TestCmdline() cmdline.setUp() try: cmdline.running = True cmdline.session = None # Must use our own self.storedenv here, cmdline doesn't have it. c = [ '--daemon=no' ] + command logging.printf('running syncevolution command line: %s' % c) return cmdline.runCmdline(c, testInstance=self, env=self.storedenv, sessionFlags=None, **args) finally: cmdline.running = False def exportCache(self, uid, filename): '''dump local cache content into file''' self.runCmdline(['--export', filename, '@' + self.managerPrefix + uid, 'local']) contacts = open(filename, 'r').read() # Ignore one empty vcard because the Nokia N97 always sends such a vcard, # despite having deleted everything via SyncML. contacts = re.sub(r'''BEGIN:VCARD\r? VERSION:3.0\r? ((UID|PRODID|REV):.*\r? |N:;;;;\r? |FN:\r? )*END:VCARD(\r|\n)*''', '', contacts, 1) open(filename, 'w').write(contacts) def extractLUIDs(self, out): '''Extract the LUIDs from syncevolution --import/update output.''' r = re.compile(r'''#.*: (\S+)\n''') matches = r.split(out) # Even entry is text (empty here), odd entry is the match group. return matches[1::2] def compareDBs(self, expected, real, ignoreExtensions=True): '''ensure that two sets of items (file or directory) are identical at the semantic level''' env = copy.deepcopy(os.environ) if ignoreExtensions: # Allow the phone to add extensions like X-CLASS=private # (seen with Nokia N97 mini - FWIW, the phone should have # use CLASS=PRIVATE, because it was using vCard 3.0). # Also removes X-EVOLUTION-FILE-AS. env['CLIENT_TEST_STRIP_PROPERTIES'] = 'X-[-_a-zA-Z0-9]*' sub = subprocess.Popen(['synccompare', expected, real], env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout, stderr = sub.communicate() self.assertEqual(0, sub.returncode, msg="env 'CLIENT_TEST_STRIP_PROPERTIES=%s' synccompare %s %s\n%s" % (env.get('CLIENT_TEST_STRIP_PROPERTIES', ''), expected, real, stdout)) def configurePhone(self, phone, uid, contacts): '''set up SyncML for copying all vCard 3.0 files in 'contacts' to the phone, if phone was set''' if phone: self.runCmdline(['--configure', 'syncURL=obex-bt://' + phone, 'backend=file', 'database=file://' + contacts, 'databaseFormat=text/vcard', # Hard-coded Nokia config. 'remoteIdentifier=PC Suite', 'peerIsClient=1', 'uri=Contacts', # Config name and source for syncPhone(). 'phone@' + self.managerPrefix + uid, 'addressbook']) def syncPhone(self, phone, uid, syncMode='refresh-from-local'): '''use SyncML config for copying all vCard 3.0 files in 'contacts' to the phone, if phone was set''' if phone: self.runCmdline(['--sync', syncMode, 'phone@' + self.managerPrefix + uid, 'addressbook']) def run(self, result, serverArgs=[]): # No errors must be logged. During testRead, libphonenumber used to print # [ERROR] Number too short to be viable: 8 # [ERROR] The string supplied did not seem to be a phone number. # to stdout until we reduced the log level. # # ==4039== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 185 from 175) # as printed by valgrind is okay, so don't match that. # # We check both D-Bus messages (which did not contain that # text, but some other error messages) and the servers stdout. def unicodeLog(test, log): open('/tmp/out', 'wb').write(log) print re.match(r'ERROR(?! SUMMARY:)', log) # Using assertNotRegexMatches with a negative lookahead led to unicode errors?! # Therefore stick to plain text checks and avoid false matches against valgind's # 'ERROR SUMMARY' by replacing that first. self.runTestDBusCheck = lambda test, log: test.assertNotIn('ERROR', log.replace('ERROR SUMMARY:', 'error summary:')) self.runTestOutputCheck = self.runTestDBusCheck # We have to clean the xdg_root ourselves. We have to be nice # to EDS and can't just wipe out the entire directory. # Same for GNOME Online Accounts. items = list(os.walk(xdg_root)) items.reverse() for dirname, dirs, files in items: reldir = os.path.relpath(dirname, xdg_root) for dir in dirs: # evolution-source-registry gets confused when we remove # the "sources" directory itself. # GNOME Online Accounts settings and GNOME keyrings must survive. if (reldir == 'config/evolution' and dir == 'sources') or \ (reldir == 'data' and dir == 'keyrings') or \ (reldir == 'config' and dir.startswith('goa')): continue dest = os.path.join(dirname, dir) try: os.rmdir(dest) except OSError, ex: if ex.errno != errno.ENOTEMPTY: raise for file in files: dest = os.path.join(dirname, file) # Don't delete a DB that may still be in use by # evolution-addressbook-factory and that we may still need. # Other DBs can be removed because we are not going to depend on # them anymore thanks to the per-test uid prefix. if reldir == 'data/evolution/addressbook/system' or \ reldir == 'data/keyrings' or \ reldir.startswith('config/goa'): continue os.unlink(dest) # We have to wait until evolution-source-registry catches up # and recognized that the sources are gone, otherwise # evolution-addressbook-factory will keep the .db files open # although we already removed them. while True: out, err = subprocess.Popen(['syncevolution', '--print-databases', '--daemon=no', 'backend=evolution-contacts'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() self.assertEqual('', err) # Count the number of database entries. An exact # comparison against the output does not work, because the # name of the system address book due to localization and # (to a lesser degree) its UID may change. if len([x for x in out.split('\n') if x.startswith(' ')]) == 1: break else: time.sleep(0.5) # Does not work, Reload()ing a running registry confuses evolution-addressbook-factory. # # for i in range(0, 100): # try: # registry = dbus.Interface(bus.get_object('org.gnome.evolution.dataserver.Sources%d' % i, # '/org/gnome/evolution/dataserver/SourceManager'), # 'org.gnome.evolution.dataserver.SourceManager') # except dbus.exceptions.DBusException, ex: # if ex.get_dbus_name() != 'org.freedesktop.DBus.Error.ServiceUnknown': # raise # registry.Reload() # # Give it some time... # time.sleep(2) # Runtime varies a lot when using valgrind, because # of the need to check an additional process. Allow # a lot more time when running under valgrind. self.runTest(result, own_xdg=False, own_home=False, serverArgs=serverArgs, defTimeout=usingValgrind() and 600 or 20) def currentSources(self): '''returns current set of EDS sources as set of UIDs, without the .source suffix''' return set([os.path.splitext(x)[0] for x in (os.path.exists(self.sourcedir) and os.listdir(self.sourcedir) or [])]) def readManagerIni(self): '''returns content of manager.ini file, split into lines and sorted, None if not found''' filename = os.path.join(xdg_root, "config", "syncevolution", "pim-manager.ini") if os.path.exists(filename): lines = open(filename, "r").readlines() lines.sort() return lines else: return None class TestContacts(TestPIMUtil, unittest.TestCase): """Tests for org._01.pim.contacts API. The tests use the system's EDS, which must be >= 3.6. They create additional databases in EDS under the normal location. This is necessary because the tests cannot tell the EDS source registry daemon to run with a different XDG root. """ def testUIDError(self): '''TestContacts.testUIDError - check that invalid UID is properly detected and reported''' with self.assertRaisesRegexp(dbus.DBusException, 'invalid peer uid: CAPITAL-LETTERS-NOT-ALLOWED'): self.manager.SetPeer('CAPITAL-LETTERS-NOT-ALLOWED', {}) @property("snapshot", "simple-sort") def testConfig(self): '''TestContacts.testConfig - set and remove peers''' sources = self.currentSources() expected = sources.copy() peers = {} # add foo uid = self.uidPrefix + 'foo' peers[uid] = {'protocol': 'PBAP', 'address': 'xxx'} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['sort =\n'], self.readManagerIni()) # Check effect of SetActiveAddressBooks() on pim-manager.ini. self.manager.SetActiveAddressBooks(['peer-' + uid]) self.assertEqual(['active = pim-manager-' + uid + '\n', 'sort =\n'], self.readManagerIni()) self.manager.SetActiveAddressBooks([]) self.assertEqual(['active = \n', 'sort =\n'], self.readManagerIni()) # PIM Manager must not allow overwriting an existing config. # Uses the new name for SetPeer(). with self.assertRaisesRegexp(dbus.DBusException, 'org._01.pim.contacts.Manager.AlreadyExists: uid ' + uid + ' is already in use') as cm: self.manager.CreatePeer(uid, peers[uid]) self.assertEqual('org._01.pim.contacts.Manager.AlreadyExists', cm.exception.get_dbus_name()) # TODO: work around EDS bug: e_source_remove_sync() quickly after # e_source_registry_create_sources_sync() leads to an empty .source file: # [Data Source] # DisplayName=Unnamed # Enabled=true # Parent= # # That prevents reusing the same UID. time.sleep(2) # remove foo expected.remove(self.managerPrefix + uid) del peers[uid] self.manager.RemovePeer(uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = \n', 'sort =\n'], self.readManagerIni()) # add and remove foo again, this time while its address book is active uid = self.uidPrefix + 'foo4' # work around EDS bug with reusing UID peers[uid] = {'protocol': 'PBAP', 'address': 'xxx'} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.manager.SetActiveAddressBooks(['peer-' + uid]) self.assertEqual(['active = pim-manager-' + uid + '\n', 'sort =\n'], self.readManagerIni()) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) time.sleep(2) expected.remove(self.managerPrefix + uid) del peers[uid] self.manager.RemovePeer(uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = \n', 'sort =\n'], self.readManagerIni()) # add foo, bar, xyz addressbooks = [] uid = self.uidPrefix + 'foo2' addressbooks.append('peer-' + uid) peers[uid] = {'protocol': 'PBAP', 'address': 'xxx'} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = \n', 'sort =\n'], self.readManagerIni()) uid = self.uidPrefix + 'bar' addressbooks.append('peer-' + uid) peers[uid] = {'protocol': 'PBAP', 'address': 'yyy'} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) uid = self.uidPrefix + 'xyz' addressbooks.append('peer-' + uid) peers[uid] = {'protocol': 'PBAP', 'address': 'zzz'} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = \n', 'sort =\n'], self.readManagerIni()) self.manager.SetActiveAddressBooks(addressbooks) addressbooks.sort() self.assertEqual(['active = ' + ' '.join([x.replace('peer-', 'pim-manager-') for x in addressbooks]) + '\n', 'sort =\n'], self.readManagerIni()) # EDS workaround time.sleep(2) # remove yxz, bar, foo expected.remove(self.managerPrefix + uid) del peers[uid] addressbooks.remove('peer-' + uid) self.manager.RemovePeer(uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = ' + ' '.join([x.replace('peer-', 'pim-manager-') for x in addressbooks]) + '\n', 'sort =\n'], self.readManagerIni()) # EDS workaround time.sleep(2) uid = self.uidPrefix + 'bar' expected.remove(self.managerPrefix + uid) del peers[uid] addressbooks.remove('peer-' + uid) self.manager.RemovePeer(uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = ' + ' '.join([x.replace('peer-', 'pim-manager-') for x in addressbooks]) + '\n', 'sort =\n'], self.readManagerIni()) # EDS workaround time.sleep(2) uid = self.uidPrefix + 'foo2' expected.remove(self.managerPrefix + uid) del peers[uid] addressbooks.remove('peer-' + uid) self.manager.RemovePeer(uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) self.assertEqual(['active = ' + ' '.join([x.replace('peer-', 'pim-manager-') for x in addressbooks]) + '\n', 'sort =\n'], self.readManagerIni()) # EDS workaround time.sleep(2) @property("snapshot", "broken-config") def testBrokenConfig(self): '''TestContacts.testBrokenConfig - start with broken pim-manager.ini''' self.manager.Start() self.assertEqual("last/first", self.manager.GetSortOrder()) @timeout(os.environ.get('TESTPIM_TEST_SYNC_TESTCASES', False) and 300000 or usingValgrind() and 3000 or 300) @property("snapshot", "simple-sort") def testSync(self): '''TestContacts.testSync - test caching of a dummy peer which uses a real phone or a local directory as fallback''' sources = self.currentSources() expected = sources.copy() peers = {} logdir = xdg_root + '/cache/syncevolution' # If set, then test importing all these contacts, # matching them, and removing them. Prints timing information. testcases = os.environ.get('TESTPIM_TEST_SYNC_TESTCASES', None) if testcases: def progress(step, duration): print edslogs = [x for x in os.listdir(logdir) if x.startswith('eds@')] edslogs.sort() print '%s: %fs, see %s' % (step, duration, os.path.join(logdir, edslogs[-1])) else: def progress(*args1, **args2): pass syncProgress = [] signal = bus.add_signal_receiver(lambda uid, event, data: (logging.printf('received SyncProgress: %s, %s, %s', self.stripDBus(uid, sortLists=False), self.stripDBus(event, sortLists=False), self.stripDBus(data, sortLists=False)), syncProgress.append((uid, event, data)), logging.printf('progress %s' % self.stripDBus(syncProgress, sortLists=False))), 'SyncProgress', 'org._01.pim.contacts.Manager', None, #'org._01.pim.contacts', '/org/01/pim/contacts', byte_arrays=True, utf8_strings=True) targetsessions = [] logdir = xdg_root + '/cache/syncevolution/' # for entry in os.listdir(logdir): # session = os.path.join(logdir, entry) # if entry.startswith('target_+config@'): # targetsessions.append(session) # Must be called after each sync with the peer. def checkSync(expectedResult, result, intermediateResult, logdir): if expectedResult is not None: self.assertEqual(expectedResult, result) while not (uid, 'done', {}) in syncProgress: self.loopIteration('added signal') progress = [ (uid, 'started', {}) ] if intermediateResult: progress.append((uid, 'modified', intermediateResult)) progress.append((uid, 'modified', expectedResult)) progress.append((uid, 'done', {})) self.assertEqual(progress, [(u, e, d) for u, e, d in syncProgress if e != 'progress']) # Verify result on target side. We don't get any information about it # from the PIM Manager, so look at the status.ini file directly. # For that we need to identify the new session dir. newsessions = [] for entry in os.listdir(logdir): session = os.path.join(logdir, entry) if 'target_+config@' in entry and \ (not session in targetsessions): newsessions.append(session) self.assertTrue(newsessions) self.assertEqual(len(newsessions), 1) session = newsessions[0] targetsessions.extend(newsessions) config = ConfigParser.ConfigParser() content = '[fake]\n' + open(os.path.join(session, 'status.ini')).read() config.readfp(io.BytesIO(content)) content = dict(config.items('fake')) for i in ['start', 'end', 'source-remote-stat-local-any-sent', 'source-remote-stat-remote-added-total']: if i in content: del content[i] self.assertEqual({ 'status': '200', 'source-remote-mode': 'slow', 'source-remote-first': 'true', 'source-remote-resume': 'false', 'source-remote-status': '0', 'source-remote-backup-before': '-1', 'source-remote-backup-after': '-1', }, content) # Must be the Bluetooth MAC address (like A0:4E:04:1E:AD:30) # of a phone which is paired, currently connected, and # supports both PBAP and SyncML. SyncML is needed for putting # data onto the phone. Nokia phones like the N97 Mini are # known to work and easily available, therefore the test # hard-codes the Nokia SyncML settings (could be changed). # # If set, that phone will be used instead of local sync with # the file backend. phone = os.environ.get('TEST_DBUS_PBAP_PHONE', None) # dummy peer directory contacts = os.path.abspath(os.path.join(xdg_root, 'contacts')) os.makedirs(contacts) # add foo uid = self.uidPrefix + 'foo' if phone: peers[uid] = {'protocol': 'PBAP', 'address': phone} else: peers[uid] = {'protocol': 'files', 'address': contacts} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) # Clear data in the phone. self.configurePhone(phone, uid, contacts) self.syncPhone(phone, uid) def listsyncevo(exclude=[]): '''find all files owned by SyncEvolution, excluding the logs for syncing with a real phone''' return listall([os.path.join(xdg_root, x) for x in ['config/syncevolution', 'cache/syncevolution']], exclude + ['.*/phone@.*', '.*/peers/phone.*']) # Remember current list of files and modification time stamp. files = listsyncevo() # Remove all data locally. There may or may not have been data # locally, because the database of the peer might have existed # from previous tests. duration, res = timeFunction(self.manager.SyncPeer, uid) progress('clear', duration) # TODO: check that syncPhone() really used PBAP - but how? checkSync(None, None, None, logdir) # Should not have written files, except for specific exceptions: exclude = [] # - directories in which we need to create files exclude.extend([xdg_root + '/cache/syncevolution/eds@[^/]*$', xdg_root + '/cache/syncevolution/target_.config@[^/]*$']) # - some files which are allowed to be written exclude.extend([xdg_root + '/cache/syncevolution/[^/]*/(status.ini|syncevolution-log.html)$']) # Now compare files and their modification time stamp. # SYNCEVOLUTION_LOGLEVEL can be used to increase verbosity # during these tests, in which case this particular assert # may fail because of extra message dumps. if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) # Export data from local database into a file via the --export # operation in the syncevo-dbus-server. Depends on (and tests) # that the SyncEvolution configuration was created as # expected. It does not actually check that EDS is used - the # test would also pass for any other storage. export = os.path.join(xdg_root, 'local.vcf') self.exportCache(uid, export) # Must be empty now. self.compareDBs(contacts, export) # Add a contact. if phone: john = '''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD''' else: # Test all fields that PIM Manager supports in its D-Bus API # when using the file backend, because (in contrast to a phone) # we know that it supports them, too. # # The order of properties is intentionally not how # libsynthesis generates them, because we need to ensure # that the field lists are in a normalized form when # comparing arrays. This is currently achieved by the # parse/encode cycle on the client side, which must use # the same vCard flavor and options as the local storage. # # This happens to work for EDS but is not guaranteed to # work for other storages. # # Whether empty properties get generated or not is relevant. # To test this, our test case has no URL. john = r'''BEGIN:VCARD VERSION:3.0 TITLE:Senior Tester ORG:Test Inc.;Testing;test#1 ROLE:professional test case X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;;; X-EVOLUTION-FILE-AS:Doe\, John CATEGORIES:TEST X-EVOLUTION-BLOG-URL:web log GEO:30.12;-130.34 CALURI:calender FBURL:free/busy X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD ''' if testcases: # Split test case file into files. numPhotos = 0 hasPhoto = re.compile('^PHOTO[;:].+\r?$', re.MULTILINE) for i, data in enumerate(open(testcases).read().split('\n\n')): item = os.path.join(contacts, '%d.vcf' % i) output = open(item, "w") output.write(data) if hasPhoto.search(data): numPhotos = numPhotos + 1 output.close() numItems = i + 1 else: item = os.path.join(contacts, 'john.vcf') output = open(item, "w") output.write(john) output.close() numItems = 1 numPhotos = 1 self.syncPhone(phone, uid) syncProgress = [] duration, result = timeFunction(self.manager.SyncPeer, uid) progress('import', duration) incrementalSync = phone and os.environ.get('SYNCEVOLUTION_PBAP_SYNC', 'incremental') == 'incremental' if incrementalSync: # Single contact gets added, then updated to add the photo. finalUpdated = numPhotos intermediate = {'modified': True, 'added': numItems, 'updated': 0, 'removed': 0} else: finalUpdated = 0 intermediate = None checkSync({'modified': True, 'added': numItems, 'updated': finalUpdated, 'removed': 0}, result, intermediate, logdir) # Also exclude modified database files. if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) # Testcase data does not necessarily import/export without changes. if not testcases: self.exportCache(uid, export) self.compareDBs(contacts, export) # Skip logdir tests when focusing on syncing data. if not testcases: # Keep one session directory in a non-default location. logdir = xdg_root + '/pim-logdir' peers[uid]['logdir'] = logdir peers[uid]['maxsessions'] = '1' self.manager.SetPeer(uid, peers[uid]) files = listsyncevo(exclude=exclude) syncProgress = [] result = self.manager.SyncPeer(uid) expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} checkSync(expectedResult, result, incrementalSync and expectedResult, logdir) exclude.append(logdir + '(/$)') if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) self.assertEqual(2, len(os.listdir(logdir))) # No changes. syncProgress = [] duration, result = timeFunction(self.manager.SyncPeer, uid) progress('match', duration) expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} checkSync(expectedResult, result, incrementalSync and expectedResult, logdir) if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) if not phone: self.assertEqual(testcases and 6 or 2, len(os.listdir(logdir))) if not testcases: # And now prune none. peers[uid]['maxsessions'] = '0' self.manager.SetPeer(uid, peers[uid]) files = listsyncevo(exclude=exclude) syncProgress = [] result = self.manager.SyncPeer(uid) expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} checkSync(expectedResult, result, incrementalSync and expectedResult, logdir) exclude.append(logdir + '(/$)') if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) self.assertEqual(4, len(os.listdir(logdir))) # Test syncing again. Incremental sync only possible with real phone. if phone: syncProgress = [] expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} duration, result = timeFunction(self.manager.SyncPeerWithFlags, uid, { 'pbap-sync': 'text' }) # TODO: check that we actually do text-only sync checkSync(expectedResult, result, None, logdir) syncProgress = [] duration, result = timeFunction(self.manager.SyncPeerWithFlags, uid, { 'pbap-sync': 'all' }) expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} # TODO: check that we actually do complete sync checkSync(expectedResult, result, None, logdir) syncProgress = [] duration, result = timeFunction(self.manager.SyncPeerWithFlags, uid, { 'pbap-sync': 'incremental' }) expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} # TODO: check that we actually do incremental sync *without* relying on # "modified" begin emitted at the end of the first cycle despite there being # no changes. checkSync(expectedResult, result, expectedResult, logdir) else: # Normal sync, no changes expected. syncProgress = [] duration, result = timeFunction(self.manager.SyncPeerWithFlags, uid, {}) checkSync(expectedResult, result, None, logdir) if not phone and not testcases: # Simulate text-only sync by removing the photo from the file # and running a sync in text-only mode. Nothing should change. john = re.sub(r'''\nPHOTO.*\n( .*\n)*''', '\n', john) output = open(item, "w") output.write(john) output.close() syncProgress = [] expectedResult = {'modified': False, 'added': 0, 'updated': 0, 'removed': 0} duration, result = timeFunction(self.manager.SyncPeerWithFlags, uid, { 'pbap-sync': 'text' }) # This verifies that we actually do text-only sync, because if we did # a full sync, the photo would get removed. checkSync(expectedResult, result, None, logdir) # Cannot update data when using pre-defined test cases. if not testcases: # Update contact, removing extra properties. john = '''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John END:VCARD''' output = open(item, "w") output.write(john) output.close() self.syncPhone(phone, uid) syncProgress = [] result = self.manager.SyncPeer(uid) checkSync({'modified': True, 'added': 0, 'updated': 1, 'removed': 0}, result, incrementalSync and {'modified': False, 'added': 0, 'updated': 0, 'removed': 0}, logdir) # Remove contact(s). for file in os.listdir(contacts): os.remove(os.path.join(contacts, file)) self.syncPhone(phone, uid) syncProgress = [] duration, result = timeFunction(self.manager.SyncPeer, uid) progress('remove', duration) expectedResult = {'modified': True, 'added': 0, 'updated': 0, 'removed': numItems} checkSync(expectedResult, result, incrementalSync and expectedResult, logdir) # Test invalid maxsession values. if not testcases: with self.assertRaisesRegexp(dbus.DBusException, "negative 'maxsessions' not allowed: -1"): self.manager.SetPeer(uid, {'protocol': 'PBAP', 'address': 'foo', 'maxsessions': '-1'}) if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) with self.assertRaisesRegexp(dbus.DBusException, 'bad lexical cast: source type value could not be interpreted as target'): self.manager.SetPeer(uid, {'protocol': 'PBAP', 'address': 'foo', 'maxsessions': '1000000000000000000000000000000000000000000000'}) if not "SYNCEVOLUTION_LOGLEVEL" in os.environ: self.assertEqual(files, listsyncevo(exclude=exclude)) @timeout(100) @property("ENV", "SYNCEVOLUTION_SYNC_DELAY=5") # first parent sleeps, then child -> total delay 10s @property("snapshot", "simple-sort") def testSyncSuspend(self): '''TestContacts.testSyncSuspend - test Suspend/ResumeSync()''' self.setUpServer() sources = self.currentSources() expected = sources.copy() peers = {} # Disable the default checking because # we trigger one ERROR message. self.runTestDBusCheck = None self.runTestOutputCheck = None # dummy peer directory contacts = os.path.abspath(os.path.join(xdg_root, 'contacts')) os.makedirs(contacts) # add foo uid = self.uidPrefix + 'foo' peers[uid] = {'protocol': 'files', 'address': contacts} self.manager.SetPeer(uid, peers[uid]) expected.add(self.managerPrefix + uid) self.assertEqual(peers, self.manager.GetAllPeers()) self.assertEqual(expected, self.currentSources()) # Can't suspend or resume. Not an error, though. self.assertEqual(False, self.manager.SuspendSync(uid)) self.assertEqual(False, self.manager.ResumeSync(uid)) # Start a sync. Because of SYNCEVOLUTION_SYNC_DELAY, this will block long # enough for us to suspend the sync. Normally, the delay would be small. # When suspending, we resume after the end of the delay and thus can # detect that suspending really worked by looking at timing. syncCompleted = [ False ] self.suspended = None self.resumed = None self.syncStarted = None def result(index, res): syncCompleted[index] = res def output(path, level, text, procname): if self.running and text == 'ready to sync': logging.printf('suspending sync') self.syncStarted = time.time() self.suspended = self.manager.SuspendSync(uid) self.suspended2 = self.manager.SuspendSync(uid) logging.printf('waiting 20 seconds') time.sleep(20) logging.printf('resuming sync') self.resumed = self.manager.ResumeSync(uid) self.resumed2 = self.manager.ResumeSync(uid) receiver = bus.add_signal_receiver(output, 'LogOutput', 'org.syncevolution.Server', self.server.bus_name, byte_arrays=True, utf8_strings=True) try: self.manager.SyncPeer(uid, reply_handler=lambda x: result(0, True), error_handler=lambda x: result(0, x)) self.runUntil('sync done', check=lambda: True, until=lambda: not False in syncCompleted) self.syncEnded = time.time() finally: receiver.remove() # Check for successful sync, with intermediate suspend/resume. self.assertEqual(True, self.suspended) self.assertEqual(False, self.suspended2) self.assertEqual(True, self.resumed) self.assertEqual(False, self.resumed2) self.assertEqual(True, syncCompleted[0]) self.assertLess(20, self.syncEnded - self.syncStarted) @timeout(60) @property("snapshot", "simple-sort") def testView(self): '''TestContacts.testView - test making changes to the unified address book''' self.setUpView() # Insert new contact. self.view.quiescentCount = 0 john = '''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John END:VCARD''' item = os.path.join(self.contacts, 'john.vcf') output = open(item, "w") output.write(john) output.close() logging.log('inserting John') out, err, returncode = self.runCmdline(['--import', item, '@' + self.managerPrefix + self.uid, 'local']) luid = self.extractLUIDs(out)[0] # Run until the view has adapted. self.runUntil('view with one contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) # Check for the one expected event. self.assertEqual([('added', 0, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 # Read contact. logging.log('reading contact') self.view.read(0) self.runUntil('contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual('John Doe', self.view.contacts[0]['full-name']) # Update contacts. johnBDay = '''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John BDAY:20120924 END:VCARD''' output = open(item, "w") output.write(johnBDay) output.close() logging.log('updating John') self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luid]) self.runUntil('view with changed contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('modified', 0, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 # Remove contact. self.runCmdline(['--delete-items', '@' + self.managerPrefix + self.uid, 'local', '*']) self.runUntil('view without contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('removed', 0, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 @timeout(60) @property("snapshot", "simple-sort") def testViewSorting(self): '''TestContacts.testViewSorting - check that sorting works when changing contacts''' self.setUpView() # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. The default sort method is active, which is not # locale-aware. Therefore the test data only uses ASCII characters. for i, contact in enumerate(['''BEGIN:VCARD VERSION:3.0 FN:Abraham Zoo N:Zoo;Abraham END:VCARD''', '''BEGIN:VCARD VERSION:3.0 FN:Benjamin Yeah N:Yeah;Benjamin END:VCARD''', '''BEGIN:VCARD VERSION:3.0 FN:Charly Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = open(item, "w") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with three contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3) # Check for the one expected event. # TODO: self.assertEqual([('added', 0, 3)], view.events) self.view.events = [] # Read contacts. logging.log('reading contacts') self.view.read(0, 3) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual('Charly Xing', self.view.contacts[0]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[1]['full-name']) self.assertEqual('Abraham Zoo', self.view.contacts[2]['full-name']) # We should have seen all events for the changes above now, # start with a clean slate. self.view.events = [] self.view.quiescentCount = 0 # No re-ordering necessary: criteria doesn't change. item = os.path.join(self.contacts, 'contact0.vcf') output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:Abraham Zoo N:Zoo;Abraham BDAY:20120924 END:VCARD''') output.close() self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('view with changed contact #2', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('modified', 2, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 logging.log('reading updated contact') self.view.read(2, 1) self.runUntil('updated contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(2)) self.assertEqual('Charly Xing', self.view.contacts[0]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[1]['full-name']) self.assertEqual('Abraham Zoo', self.view.contacts[2]['full-name']) # No re-ordering necessary: criteria changes, but not in a relevant way, at end. item = os.path.join(self.contacts, 'contact0.vcf') output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:Abraham Zoo N:Zoo;Abraham;Middle BDAY:20120924 END:VCARD''') output.close() self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('view with changed contact #2', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('modified', 2, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 logging.log('reading updated contact') self.view.read(2, 1) self.runUntil('updated contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(2)) self.assertEqual('Charly Xing', self.view.contacts[0]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[1]['full-name']) self.assertEqual('Abraham Zoo', self.view.contacts[2]['full-name']) # No re-ordering necessary: criteria changes, but not in a relevant way, in the middle. item = os.path.join(self.contacts, 'contact1.vcf') output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:Benjamin Yeah N:Yeah;Benjamin;Middle END:VCARD''') output.close() self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[1]]) self.runUntil('view with changed contact #1', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('modified', 1, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 logging.log('reading updated contact') self.view.read(1, 1) self.runUntil('updated contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(1)) self.assertEqual('Charly Xing', self.view.contacts[0]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[1]['full-name']) self.assertEqual('Abraham Zoo', self.view.contacts[2]['full-name']) # No re-ordering necessary: criteria changes, but not in a relevant way, in the middle. item = os.path.join(self.contacts, 'contact2.vcf') output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:Charly Xing N:Xing;Charly;Middle END:VCARD''') output.close() self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[2]]) self.runUntil('view with changed contact #0', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('modified', 0, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 logging.log('reading updated contact') self.view.read(0, 1) self.runUntil('updated contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual('Charly Xing', self.view.contacts[0]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[1]['full-name']) self.assertEqual('Abraham Zoo', self.view.contacts[2]['full-name']) # Re-ordering necessary: last item (Zoo;Abraham) becomes first (Ace;Abraham). item = os.path.join(self.contacts, 'contact0.vcf') output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:Abraham Ace N:Ace;Abraham;Middle BDAY:20120924 END:VCARD''') output.close() self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('view with changed contact #0', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('removed', 2, 1), ('added', 0, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 logging.log('reading updated contact') self.view.read(0, 1) self.runUntil('updated contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual('Abraham Ace', self.view.contacts[0]['full-name']) self.assertEqual('Charly Xing', self.view.contacts[1]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[2]['full-name']) # Re-ordering necessary: first item (Ace;Abraham) becomes last (Zoo;Abraham). item = os.path.join(self.contacts, 'contact0.vcf') output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:Abraham Zoo N:Zoo;Abraham;Middle BDAY:20120924 END:VCARD''') output.close() self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('view with changed contact #2', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('removed', 0, 1), ('added', 2, 1), ('quiescent',)], self.view.events) self.view.events = [] self.view.quiescentCount = 0 logging.log('reading updated contact') self.view.read(2, 1) self.runUntil('updated contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(2)) self.assertEqual('Charly Xing', self.view.contacts[0]['full-name']) self.assertEqual('Benjamin Yeah', self.view.contacts[1]['full-name']) self.assertEqual('Abraham Zoo', self.view.contacts[2]['full-name']) @timeout(60) # boost::locale checks LC_TYPE first, then LC_ALL, LANG. Set all, just # to be sure. @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") @property("snapshot", "first-last-sort") def testSortOrder(self): '''TestContacts.testSortOrder - check that sorting works when changing the comparison''' self.setUpView() # Locale-aware "first/last" sorting from "first-last-sort" config. self.assertEqual("first/last", self.manager.GetSortOrder()) # Expect an error, no change to sort order. with self.assertRaisesRegexp(dbus.DBusException, 'sort order.*not supported'): self.manager.SetSortOrder('no-such-order') self.assertEqual("first/last", self.manager.GetSortOrder()) # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Äbraham END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Bénjamin END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 FN:Chàrly Xing N:Xing;Chàrly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with three contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3) # Check for the one expected event. # TODO: self.assertEqual([('added', 0, 3)], view.events) self.view.events = [] # Read contacts. logging.log('reading contacts') self.view.read(0, 3) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual(u'Äbraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Bénjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Chàrly', self.view.contacts[2]['structured-name']['given']) # Invert sort order. self.manager.SetSortOrder("last/first") # Check that order was adapted and stored permanently. self.assertEqual("last/first", self.manager.GetSortOrder()) self.assertIn("sort = last/first\n", self.readManagerIni()) # Contact in the middle may or may not become invalidated. self.runUntil('reordered', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3 and \ self.view.haveNoData(0) and \ self.view.haveNoData(2)) # Read contacts. logging.log('reading contacts') self.view.read(0, 3) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual('Xing', self.view.contacts[0]['structured-name']['family']) self.assertEqual('Yeah', self.view.contacts[1]['structured-name']['family']) self.assertEqual('Zoo', self.view.contacts[2]['structured-name']['family']) # Sort by FN or as fallback. self.manager.SetSortOrder("fullname") self.runUntil('reordered', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3 and \ self.view.haveNoData(0) and \ self.view.haveNoData(2)) logging.log('reading contacts') self.view.read(0, 3) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) self.assertEqual(u'Äbraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Bénjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Chàrly', self.view.contacts[2]['structured-name']['given']) @timeout(60) @property("snapshot", "simple-sort") def testRead(self): '''TestContacts.testRead - check that folks and PIM Manager deliver EDS data correctly''' self.setUpView() # Insert new contacts. # # Not all of the vCard properties need to be available via PIM Manager. testcases = [r'''BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing;test#1 ROLE:professional test case X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-FOOBAR-EXTENSION;X-FOOBAR-PARAMETER=foobar:has to be stored internally by engine and preserved in testExtensions test\; never sent to a peer X-TEST;PARAMETER1=nonquoted;PARAMETER2="quoted because of spaces":Content with\nMultiple\nText lines\nand national chars: äöü X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;;; X-EVOLUTION-FILE-AS:Doe\, John CATEGORIES:TEST1,TEST2 GEO:30.12;-130.34 X-EVOLUTION-BLOG-URL:web log CALURI:calender FBURL:free/busy X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD '''] for i, contact in enumerate(testcases): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = open(item, "w") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == len(testcases)) # Check for the one expected event. # TODO: self.assertEqual([('added', 0, len(testcases))], view.events) self.view.events = [] # Read contacts. logging.log('reading contacts') self.view.read(0, len(testcases)) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) contact = copy.deepcopy(self.view.contacts[0]) # Simplify the photo URI, if there was one. Avoid any assumptions # about the filename, except that it is a file:/// uri. if contact.has_key('photo'): contact['photo'] = re.sub('^file:///.*', 'file:///', contact['photo']) if contact.has_key('id'): contact['id'] = '' self.assertEqual({'full-name': 'John Doe', 'groups': ['TEST1', 'TEST2'], 'location': (30.12, -130.34), 'nickname': 'user1', 'structured-name': {'given': 'John', 'family': 'Doe'}, 'birthday': (2006, 1, 8), 'photo': 'file:///', 'roles': [ { 'organisation': 'Test Inc.', 'role': 'professional test case', 'title': 'Senior Tester', }, ], 'source': [ (self.uidPrefix + 'foo', luids[0]) ], 'id': '', 'notes': [ 'This is a test case which uses almost all Evolution fields.', ], 'emails': [ ('john.doe@home.priv', ['home']), ('john.doe@other.world', ['other']), ('john.doe@work.com', ['work']), ('john.doe@yet.another.world', ['other']), ], 'phones': [ ('business 1', ['voice', 'work']), ('businessfax 4', ['fax', 'work']), ('car 7', ['car']), ('home 2', ['home', 'voice']), ('homefax 5', ['fax', 'home']), ('mobile 3', ['cell']), ('pager 6', ['pager']), ('primary 8', ['pref']), ], 'addresses': [ ({'country': 'New Testonia', 'locality': 'Test Megacity', 'po-box': 'Test Box #3', 'postal-code': '12347', 'region': 'Test County', 'street': 'Test Drive 3'}, []), ({'country': 'Old Testovia', 'locality': 'Test Town', 'po-box': 'Test Box #2', 'postal-code': '12346', 'region': 'Upper Test County', 'street': 'Test Drive 2'}, ['work']), ({'country': 'Testovia', 'locality': 'Test Village', 'po-box': 'Test Box #1', 'postal-code': '12345', 'region': 'Lower Test County', 'street': 'Test Drive 1'}, ['home']), ], 'urls': [ ('chat', ['x-video']), ('free/busy', ['x-free-busy']), ('http://john.doe.com', ['x-home-page']), ('web log', ['x-blog']), ], }, # Order of list entries in the result is not specified. # Must sort before comparing. contact, sortLists=True) def addressbooks(self): entries = os.listdir(os.path.join(os.environ["XDG_DATA_HOME"], "evolution", "addressbook")) entries.sort(); # Ignore trash folder and system DB, because they may or may not be present. for db in ('trash', 'system'): try: entries.remove(db) except ValueError: pass return entries @timeout(60) @property("snapshot", "simple-sort") def testRemove(self): '''TestContacts.testRemove - check that EDS database is created and removed''' self.setUpView(search=None) # Force sqlite DB files to exist by inserting a contact. testcases = [r'''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John TEL:1234-5678 EMAIL:john.doe@example.com URL:http://john.doe.com X-JABBER:jd@example.com END:VCARD '''] for i, contact in enumerate(testcases): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = open(item, "w") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) self.assertEqual([self.managerPrefix + self.uid], self.addressbooks()) self.manager.RemovePeer(self.uid) self.assertEqual([], self.addressbooks()) @timeout(60) @property("snapshot", "simple-sort") def testRemoveLive(self): '''TestContacts.testRemove - check that EDS database is created and removed while it is open in a view''' self.setUpView() # Force sqlite DB files to exist by inserting a contact. testcases = [r'''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John TEL:1234-5678 EMAIL:john.doe@example.com URL:http://john.doe.com X-JABBER:jd@example.com END:VCARD '''] for i, contact in enumerate(testcases): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = open(item, "w") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Run until the view has adapted. self.runUntil('view with one contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) > 0) # Don't wait for more contacts here. They shouldn't come, and if # they do, we'll notice it below. self.assertEqual(1, len(self.view.contacts)) self.assertEqual([self.managerPrefix + self.uid], self.addressbooks()) self.manager.RemovePeer(self.uid) self.assertEqual([], self.addressbooks()) @timeout(60) @property("snapshot", "simple-sort") def testStop(self): '''TestContacts.testStop - stop a started server''' # Auto-start. self.assertEqual(False, self.manager.IsRunning()) self.setUpView(peers=['foo']) self.assertEqual(True, self.manager.IsRunning()) # Must not stop now. self.manager.Stop() self.view.read(0, 0) # It may stop after closing the view. self.view.view.Close() self.manager.Stop() self.assertEqual(False, self.manager.IsRunning()) @timeout(60) @property("snapshot", "simple-sort") def testEmpty(self): '''TestContacts.testEmpty - start with empty view without databases''' self.setUpView(peers=[]) # Let it run for a bit longer, to catch further unintentional changes. now = time.time() self.runUntil('delay', check=lambda: (self.assertEqual([], self.view.errors), self.assertEqual([], self.view.contacts)), until=lambda: time.time() - now > 10) @timeout(60) @property("snapshot", "simple-sort") def testMerge(self): '''TestContacts.testMerge - merge identical contacts from two stores''' self.setUpView(peers=['foo', 'bar']) # folks merges this because a) X-JABBER (always) b) EMAIL (only # with patch for https://bugzilla.gnome.org/show_bug.cgi?id=685401). john = '''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John TEL:1234-5678 EMAIL:john.doe@example.com URL:http://john.doe.com X-JABBER:jd@example.com END:VCARD''' item = os.path.join(self.contacts, 'john.vcf') output = open(item, "w") output.write(john) output.close() check = self.view.setCheck(lambda: self.assertGreater(2, len(self.view.contacts))) luids = {} for uid in self.uids: logging.log('inserting John into ' + uid) out, err, returncode = self.runCmdline(['--import', item, '@' + self.managerPrefix + uid, 'local']) luids[uid] = self.extractLUIDs(out) # Run until the view has adapted. We accept Added + Removed + Added # (happens when folks switches IDs, which happens when the "primary" store # changes) and Added + Updated. # # Let it run for a bit longer, to catch further unintentional changes # and ensure that changes from both stores where processed. now = time.time() self.runUntil('delay', check=check, until=lambda: time.time() - now > 10) self.assertEqual(1, len(self.view.contacts)) self.view.setCheck(None) # Read contact. logging.log('reading contact') self.view.read(0, 1) self.runUntil('contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) contact = copy.deepcopy(self.view.contacts[0]) self.assertEqual({'full-name': 'John Doe', 'structured-name': {'given': 'John', 'family': 'Doe'}, 'emails': [('john.doe@example.com', [])], 'phones': [('1234-5678', [])], 'urls': [('http://john.doe.com', ['x-home-page'])], 'id': contact.get('id', ''), 'source': [ (self.uidPrefix + 'bar', luids[self.uidPrefix + 'bar'][0]), (self.uidPrefix + 'foo', luids[self.uidPrefix + 'foo'][0]) ], }, # Order of list entries in the result is not specified. # Must sort before comparing. contact, sortLists=True) @timeout(int(os.environ.get('TESTPIM_TEST_ACTIVE_NUM', 10)) * (usingValgrind() and 15 or 6)) @property("snapshot", "db-active") def testActive(self): '''TestContacts.testActive - reconfigure active address books several times''' contactsPerPeer = int(os.environ.get('TESTPIM_TEST_ACTIVE_NUM', 10)) self.assertEqual(['', 'peer-' + self.uidPrefix + 'a', 'peer-' + self.uidPrefix + 'c'], self.manager.GetActiveAddressBooks(), sortLists=True) withLogging = (contactsPerPeer <= 10) checkPerformance = os.environ.get('TESTPIM_TEST_ACTIVE_RESPONSE', None) threshold = 0 if checkPerformance: threshold = float(checkPerformance) # When starting the search right away and then add more # contact data later, we test the situation where new data # comes in because of a sync. # # When adding data first and then searching, we cover the # startup situation with already populated caches. # # Both are relevant scenarios. The first one stresses folks # more, because SyncEvolution adds contacts one at a time, # which then leads to many D-Bus messages containing a single # "contact added" notification that need to be processed by # folks. Testing this is the default. if os.environ.get('TESTPIM_TEST_ACTIVE_LOAD', False): # Delay starting the PIM Manager until data is ready to be read. # More realistic that way; otherwise folks must process new # contacts one-by-one. search=None else: # Start folks right away. search='' peers = ['a', 'b', 'c'] self.setUpView(peers=peers, withSystemAddressBook=True, search=search, withLogging=withLogging) active = [''] + peers # Check that active databases were adapted and stored permanently. self.assertEqual(['', 'peer-' + self.uidPrefix + 'a', 'peer-' + self.uidPrefix + 'b', 'peer-' + self.uidPrefix + 'c'], self.manager.GetActiveAddressBooks(), sortLists=True) # Order mirrors the one of SetActiveAddressBooks() in setUpView(), # assuming that the PIM Manager preserves that order (not really guaranteed # by the API, but is how it is implemented). self.assertIn('active = pim-manager-' + self.uidPrefix + 'a pim-manager-' + self.uidPrefix + 'b pim-manager-' + self.uidPrefix + 'c system-address-book\n', self.readManagerIni()) for peer in active: for index in range(0, contactsPerPeer): item = os.path.join(self.contacts, 'john%d.vcf' % index) output = open(item, "w") output.write('''BEGIN:VCARD VERSION:3.0 FN:John_%(peer)s%(index)04d Doe N:Doe;John_%(peer)s%(index)04d END:VCARD''' % {'peer': peer, 'index': index}) output.close() uid = self.uidPrefix + peer logging.log('inserting data into ' + uid) if peer != '': out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + uid, 'local']) else: out, err, returncode = self.runCmdline(['--import', self.contacts, 'database=', 'backend=evolution-contacts']) # Ping server regularly and check that it remains responsive. # Depends on processing all D-Bus replies with minimum # delay, because delays caused by us would lead to false negatives. w = Watchdog(self, self.manager, threshold=threshold) if checkPerformance: w.start() self.cleanup.append(w.stop) # Start the view if not done yet and run until the view has adapted. if search == None: self.view.search('') self.runUntil('view with contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == contactsPerPeer * len(active), may_block=checkPerformance) w.checkpoint('full view') def checkContacts(): contacts = copy.deepcopy(self.view.contacts) for contact in contacts: del contact['id'] del contact['source'] expected = [{'full-name': first + ' Doe', 'structured-name': {'given': first, 'family': 'Doe'}} for \ first in ['John_%(peer)s%(index)04d' % {'peer': peer, 'index': index} \ for peer in active \ for index in range(0, contactsPerPeer)] ] return (expected, contacts) def assertHaveContacts(): expected, contacts = checkContacts() self.assertEqual(expected, contacts) # Read contacts. logging.log('reading contacts') self.view.read(0, contactsPerPeer * len(active)) self.runUntil('contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, contactsPerPeer * len(active)), may_block=not withLogging) assertHaveContacts() w.checkpoint('contact data') def haveExpectedView(): current = time.time() logNow = withLogging or current - haveExpectedView.last > 1 if len(self.view.contacts) == contactsPerPeer * len(active): if self.view.haveData(0, contactsPerPeer * len(active)): expected, contacts = checkContacts() # TODO: avoid calling this if expected == contacts: logging.log('got expected data') return True else: if withLogging: logging.printf('data mismatch, keep waiting; currently have: %s', contacts) elif logNow: logging.printf('data mismatch, keep waiting') else: self.view.read(0, len(self.view.contacts)) if logNow: logging.log('still waiting for all data') elif logNow: logging.printf('wrong contact count, keep waiting: have %d, want %d', len(self.view.contacts), contactsPerPeer * len(active)) haveExpectedView.last = current return False haveExpectedView.last = time.time() # Now test all subsets until we are back at 'all active'. current = ['', 'a', 'b', 'c'] for active in [filter(lambda x: x != None, [s, a, b, c]) for s in [None, ''] for a in [None, 'a'] for b in [None, 'b'] for c in [None, 'c']]: logging.printf('changing address books %s -> %s', current, active) self.manager.SetActiveAddressBooks([x != '' and 'peer-' + self.uidPrefix + x or x for x in active]) self.runUntil('contacts %s' % str(active), check=lambda: self.assertEqual([], self.view.errors), until=haveExpectedView, may_block=not withLogging) w.checkpoint('%s -> %s' % (current, active)) current = active @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterExisting(self): '''TestContacts.testFilterExisting - check that filtering works when applied to static contacts''' self.setUpView() # Can refine full view. Doesn't change anything here. self.view.view.RefineSearch([]) # Override default sorting. self.assertEqual("last/first", self.manager.GetSortOrder()) self.manager.SetSortOrder("first/last") # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Ace TEL:1234 TEL:56/78 TEL:+1-800-FOOBAR TEL:089/7888-99 EMAIL:az@example.com END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin TEL:+1-89-7888-99 END:VCARD''', # Chárleß has chárless as representation after folding the case. # This is different from lower case. # See http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with three contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3) # Check for the one expected event. # TODO: self.assertEqual([('added', 0, 3)], view.events) self.view.events = [] # Read contacts. logging.log('reading contacts') self.view.read(0, 3) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 3)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Find Charly by his FN (case insensitive by default). view = ContactsView(self.manager) view.search([['any-contains', 'chÃrles']]) self.runUntil('charles search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('charles', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) # We can expand the search with ReplaceSearch(). view.view.ReplaceSearch([], False) self.runUntil('expanded view with three contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3) self.view.read(0, 3) self.runUntil('expanded contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 3)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Find Charly by his FN (case insensitive explicitly). view = ContactsView(self.manager) view.search([['any-contains', 'chÃrless', 'case-insensitive']]) self.runUntil('charles search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('charles', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) # Find Charly by his FN (case sensitive explicitly). view = ContactsView(self.manager) view.search([['any-contains', 'Chárleß', 'case-sensitive']]) self.runUntil('charles search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('charles', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) # Do not find Charly by his FN (case sensitive explicitly). view = ContactsView(self.manager) view.search([['any-contains', 'charles', 'case-sensitive']]) self.runUntil('charles search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Find Abraham and Benjamin. view = ContactsView(self.manager) view.search([['any-contains', 'am']]) self.runUntil('"am" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(2, len(view.contacts)) view.read(0, 2) self.runUntil('two contacts', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', view.contacts[1]['structured-name']['given']) # Refine search without actually changing the result. for refine in [True, False]: view.quiescentCount = 0 view.view.ReplaceSearch([['any-contains', 'am']], refine) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', view.contacts[1]['structured-name']['given']) # Restrict search to Benjamin. The result is a view # which has different indices than the full view. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'Benjamin']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) # Refine again, without changes. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'Benjamin']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) # Refine to empty view. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'XXXBenjamin']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Find Abraham by his nickname. view = ContactsView(self.manager) view.search([['any-contains', 'ace']]) self.runUntil('"ace" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('two contacts', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham by his email. view = ContactsView(self.manager) view.search([['any-contains', 'az@']]) self.runUntil('"az@" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('two contacts', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham by his 1234 telephone number. view = ContactsView(self.manager) view.search([['any-contains', '1234']]) self.runUntil('"1234" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('1234 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham by his 1234 telephone number, as sub-string. view = ContactsView(self.manager) view.search([['any-contains', '23']]) self.runUntil('"23" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('23 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham by his 1234 telephone number, ignoring # formatting. view = ContactsView(self.manager) view.search([['any-contains', '12/34']]) self.runUntil('"12/34" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('12/34 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham by his 56/78 telephone number, ignoring # slash in contact. view = ContactsView(self.manager) view.search([['any-contains', '5678']]) self.runUntil('"5678" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('5678 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham via the +1-800-FOOBAR vanity number. view = ContactsView(self.manager) view.search([['any-contains', '+1-800-foobar']]) self.runUntil('"+1-800-foobar" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('+1-800-foobar data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham via the +1-800-FOOBAR vanity number, with digits # instead of alpha characters. view = ContactsView(self.manager) view.search([['any-contains', '366227']]) self.runUntil('"366227" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('366227 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham via caller ID for +1-800-FOOBAR. view = ContactsView(self.manager) view.search([['phone', '+1800366227']]) self.runUntil('"+1800366227" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('+1800366227 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham via caller ID for 089/7888-99 (country is Germany). view = ContactsView(self.manager) view.search([['phone', '+4989788899']]) self.runUntil('"+4989788899" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('+4989788899 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham via caller ID for +44 89 7888-99 (Abraham has no country code # set and matches, whereas Benjamin has +1 as country code and does not match). view = ContactsView(self.manager) view.search([['phone', '+4489788899']]) self.runUntil('"+4489788899" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('+4489788899 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Find Abraham and Benjamin via 089/7888-99 (not a full caller # ID, but at least a valid phone number). Benjamin matches # despite having +1 as country code because the search term # doesn't have a country code. view = ContactsView(self.manager) view.search([['phone', '089788899']]) self.runUntil('"089788899" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(2, len(view.contacts)) view.read(0, 2) self.runUntil('089788899 data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', view.contacts[1]['structured-name']['given']) # Don't find anyone. view = ContactsView(self.manager) view.search([['phone', '+49897888000']]) self.runUntil('"+49897888000" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) def doFilter(self, testdata, searches): self.setUpView() msg = None view = None try: # Insert new contacts and calculate their family names. names = [] numtestcases = len(testdata) for i, contact in enumerate(testdata): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") if isinstance(contact, tuple): # name + vcard output.write(contact[1]) names.append(contact[0]) else: # just the name output.write(u'''BEGIN:VCARD VERSION:3.0 FN:%(name)s N:%(name)s;;;; END:VCARD ''' % { 'name': contact }) names.append(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with three contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == numtestcases) # Check for the one expected event. # TODO: self.assertEqual([('added', 0, 3)], view.events) self.view.events = [] # Read contacts. logging.log('reading contacts') self.view.read(0, numtestcases) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, numtestcases)) for i, name in enumerate(names): msg = u'contact #%d with name %s in\n%s' % (i, name, pprint.pformat(self.stripDBus(self.view.contacts, sortLists=False))) self.assertEqual(name, self.view.contacts[i]['full-name']) # Run searches and compare results. for i, (query, names) in enumerate(searches): msg = u'query %s, names %s' % (query, names) view = ContactsView(self.manager) view.search(query) self.runUntil('search %d: %s' % (i, query), check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) msg = u'query %s, names %s in\n%s' % (query, names, pprint.pformat(self.stripDBus(view.contacts, sortLists=False))) self.assertEqual(len(names), len(view.contacts)) view.read(0, len(names)) self.runUntil('data %d: %s' % (i, query), check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0, len(names))) for e, name in enumerate(names): msg = u'query %s, names %s, name #%d %s in\n%s' % (query, names, e, name, pprint.pformat(self.stripDBus(view.contacts, sortLists=False))) self.assertEqual(name, view.contacts[e]['full-name']) except Exception, ex: if msg: info = sys.exc_info() raise Exception('%s:\n%s' % (msg, repr(ex))), None, info[2] else: raise return view @timeout(60) @property("ENV", "LC_TYPE=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8 LANG=ja_JP.UTF-8") def testFilterJapanese(self): self.doFilter(# Names of all contacts, sorted as expected. ('111', u'1月', 'Bad'), # Query + expected results. (([], ('111', u'1月', 'Bad')), ([['any-contains', '1']], ('111', u'1月')), ([['any-contains', u'1月']], (u'1月',))) ) @timeout(60) @property("ENV", "LC_TYPE=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 LANG=zh_CN.UTF-8") def testFilterChinesePinyin(self): self.doFilter(# Names of all contacts, sorted as expected. # 江 = jiÄng = Jiang when using Pinyin and thus after Jeffries and before Meadows. # é³¥ = niÇŽo before 女性 = nÇš xìng (see FDO #66618) ('Adams', 'Jeffries', u'江', 'jiang', 'Meadows', u'é³¥', u'女性' ), # 'J' may or may not match Jiang; by default, it matches. (([['any-contains', 'J']], ('Jeffries', u'江', 'jiang')), ([['any-contains', 'J', 'no-transliteration']], ('Jeffries', 'jiang')), ([['any-contains', 'J', 'no-transliteration', 'case-sensitive']], ('Jeffries',)), ([['any-contains', u'江']], (u'江', 'jiang')), ([['any-contains', u'jiang']], (u'江', 'jiang')), ([['any-contains', u'jiÄng']], (u'江', 'jiang')), ([['any-contains', u'jiÄng', 'no-transliteration']], ('jiang',)), ([['any-contains', u'jiÄng', 'accent-sensitive']], (u'江',)), ([['any-contains', u'jiÄng', 'accent-sensitive', 'case-sensitive']], (u'江',)), ([['any-contains', u'JiÄng', 'accent-sensitive', 'case-sensitive']], ()), ([['any-contains', u'Jiang']], (u'江', 'jiang')), ), ) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterGermany(self): self.doFilter(# Names of all contacts, sorted as expected. # DIN 5007 Variant 2 defines phone book sorting in # Germany. It does not apply to Austria. # Example from http://de.wikipedia.org/wiki/Alphabetische_Sortierung (u'Göbel', u'Goethe', u'Göthe', u'Götz', u'Goldmann'), (), ) @timeout(60) @property("ENV", "LC_TYPE=zh_CN.UTF-8 LANG=zh_CN.UTF-8") def testLocaled(self): # Use mixed Chinese/Western names, because then the locale really matters. namespinyin = ('Adams', 'Jeffries', u'江', 'Meadows', u'é³¥', u'女性' ) namesgerman = ('Adams', 'Jeffries', 'Meadows', u'女性', u'江', u'é³¥' ) numtestcases = len(namespinyin) self.doFilter(namespinyin, ()) daemon = localed.Localed() msg = None try: # Broadcast Locale value together with PropertiesChanged signal. self.view.quiescentCount = 0 daemon.SetLocale(['LC_TYPE=de_DE.UTF-8', 'LANG=de_DE.UTF-8'], False) logging.log('reading contacts, German') self.runUntil('German sorting', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 1) self.view.read(0, numtestcases) self.runUntil('German contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, numtestcases)) for i, name in enumerate(namesgerman): msg = u'contact #%d with name %s in\n%s' % (i, name, pprint.pformat(self.stripDBus(self.view.contacts, sortLists=False))) self.assertEqual(name, self.view.contacts[i]['full-name']) # Switch back to Pinyin without including the new value. self.view.quiescentCount = 0 daemon.SetLocale(['LC_TYPE=zh_CN.UTF-8', 'LANG=zh_CN.UTF-8'], True) logging.log('reading contacts, Pinyin') self.runUntil('Pinyin sorting', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 1) self.view.read(0, numtestcases) self.runUntil('Pinyin contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, numtestcases)) for i, name in enumerate(namespinyin): msg = u'contact #%d with name %s in\n%s' % (i, name, pprint.pformat(self.stripDBus(self.view.contacts, sortLists=False))) self.assertEqual(name, self.view.contacts[i]['full-name']) except Exception, ex: if msg: info = sys.exc_info() raise Exception('%s:\n%s' % (msg, repr(ex))), None, info[2] else: raise finally: daemon.remove_from_connection() @timeout(60) # Must disable usage of pre-computed phone numbers from EDS, because although we can # tell EDS about locale changes, it currently crashes when we do that (https://bugs.freedesktop.org/show_bug.cgi?id=59571#c20). # # Remove the SYNCEVOLUTION_PIM_EDS_NO_E164=1 part from ENV to test and use EDS. @property("ENV", "LANG=en_US.UTF-8") def testLocaledPhone(self): # Parsing of 01164 3 331 6005 depends on locale: in the US, 011 is followed # by a country code, and therefore libphonenumber parses the string as # +64 (for New Zealand) with 3 331 6005 as national number. # Germany (and other countries) don't have that prefix; libphonenumber # ends up returning 116433316005 as national number with +49 as the # default country code. Same example as in phonenumberutil_test.cc. # # We use this difference to determine whether the desired locale was used # for normalizing the phone number. usingEDS = not 'SYNCEVOLUTION_PIM_EDS_NO_E164=1' in self.getTestProperty("ENV", "") if usingEDS: daemon = localed.Localed() daemon.SetLocale(['LANG=en_US.UTF-8'], True) # Give EDS some time to notice the new daemon and it's en_US setting. Timeout.addTimeout(5, loop.quit) loop.run() testcases = (('Doe', '''BEGIN:VCARD VERSION:3.0 FN:Doe N:Doe;;;; TEL:01164 3 331 6005 END:VCARD '''),) names = ('Doe') numtestcases = len(testcases) view = self.doFilter(testcases, (([['phone', '+64 3 331 6005']], ('Doe',)),)) msg = None if not usingEDS: # Don't do that too early, otherwise EDS also sees the daemon # and crashes (https://bugs.freedesktop.org/show_bug.cgi?id=59571#c20). daemon = localed.Localed() try: # Contact no longer matched because it's phone number normalization # becomes different. view.quiescentCount = 0 daemon.SetLocale(['LANG=de_DE.UTF-8'], True) self.runUntil('German locale', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > (usingEDS and 2 or 1)) self.assertEqual(len(view.contacts), 0) # Switch back to US. view.quiescentCount = 0 daemon.SetLocale(['LANG=en_US.UTF-8'], True) self.runUntil('US locale', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > (usingEDS and 2 or 1)) self.assertEqual(len(view.contacts), 1) except Exception, ex: if msg: info = sys.exc_info() raise Exception('%s:\n%s' % (msg, repr(ex))), None, info[2] else: raise finally: daemon.remove_from_connection() # Not supported correctly by ICU? # See icu-support "Subject: Austrian phone book sorting" # @timeout(60) # @property("ENV", "LC_TYPE=de_AT.UTF-8 LC_ALL=de_AT.UTF-8 LANG=de_AT.UTF-8") # def testFilterAustria(self): # self.doFilter(# Names of all contacts, sorted as expected. # # Austrian phone book sorting. # # Example from http://de.wikipedia.org/wiki/Alphabetische_Sortierung # (u'Goethe', u'Goldmann', u'Göbel', u'Göthe', u'Götz'), # (), # ) @timeout(60) def testFilterLogic(self): '''TestContacts.testFilterLogic - check logic operators''' self.doFilter(('Xing', 'Yeah', 'Zooh'), ((['or', ['any-contains', 'X'], ['any-contains', 'Z']], ('Xing', 'Zooh')), (['or', ['any-contains', 'X']], ('Xing',)), (['or', ['any-contains', 'Z']], ('Zooh',)), (['or'], ()), (['and', ['any-contains', 'h'], ['any-contains', 'Z']], ('Zooh',)), (['and', ['any-contains', 'h']], ('Yeah', 'Zooh')), (['and', ['any-contains', 'Z']], ('Zooh',)), (['and', ['any-contains', 'h'], ['any-contains', 'Z'], ['any-contains', 'A']], ()), (['and'], ()), # Python D-Bus does not like mixing elements of different types in a list. # In a tuple that's fine, and also works with the PIM Manager. (('or', ('and', ('any-contains', 'h'), ('any-contains', 'Z')), ('any-contains', 'X')), ('Xing', 'Zooh')), (('and', ('or', ('any-contains', 'X'), ('any-contains', 'Z')), ('any-contains', 'h')), ('Zooh',)))) @timeout(60) def testFilterFields(self): '''TestContacts.testFilterFields - check filter operations on fields''' self.doFilter([('John Doe', r'''BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing;test#1 ROLE:professional test case X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;Johnny;; X-EVOLUTION-FILE-AS:Doe\, John CATEGORIES:TEST X-EVOLUTION-BLOG-URL:web log GEO:30.12;-130.34 CALURI:calender FBURL:free/busy X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;Test Extension;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 TEL:12 34-5 END:VCARD ''')], ((['is', 'full-name', 'john doe'], ('John Doe',)), (['is', 'full-name', 'John Doe', 'case-sensitive'], ('John Doe',)), (['is', 'full-name', 'john doe', 'case-sensitive'], ()), (['is', 'full-name', 'John Doe', 'case-insensitive'], ('John Doe',)), (['is', 'full-name', 'john'], ()), (['contains', 'full-name', 'ohn d'], ('John Doe',)), (['contains', 'full-name', 'ohn D', 'case-sensitive'], ('John Doe',)), (['contains', 'full-name', 'ohn d', 'case-sensitive'], ()), (['contains', 'full-name', 'ohn d', 'case-insensitive'], ('John Doe',)), (['contains', 'full-name', 'foobar'], ()), (['begins-with', 'full-name', 'john'], ('John Doe',)), (['begins-with', 'full-name', 'John', 'case-sensitive'], ('John Doe',)), (['begins-with', 'full-name', 'john', 'case-sensitive'], ()), (['begins-with', 'full-name', 'John', 'case-insensitive'], ('John Doe',)), (['begins-with', 'full-name', 'doe'], ()), (['ends-with', 'full-name', 'doe'], ('John Doe',)), (['ends-with', 'full-name', 'Doe', 'case-sensitive'], ('John Doe',)), (['ends-with', 'full-name', 'doe', 'case-sensitive'], ()), (['ends-with', 'full-name', 'Doe', 'case-insensitive'], ('John Doe',)), (['ends-with', 'full-name', 'john'], ()), (['is', 'nickname', 'user1'], ('John Doe',)), (['is', 'nickname', 'Johnny'], ()), (['is', 'structured-name/family', 'Doe'], ('John Doe',)), (['is', 'structured-name/family', 'John'], ()), (['is', 'structured-name/given', 'John'], ('John Doe',)), (['is', 'structured-name/given', 'Doe'], ()), (['is', 'structured-name/additional', 'Johnny'], ('John Doe',)), (['is', 'structured-name/additional', 'John'], ()), (['is', 'emails/value', 'john.doe@work.com'], ('John Doe',)), (['is', 'emails/value', 'foo@abc.com'], ()), (['is', 'addresses/po-box', 'Test Box #3'], ('John Doe',)), (['is', 'addresses/po-box', 'Foo Box'], ()), (['is', 'addresses/extension', 'Test Extension'], ('John Doe',)), (['is', 'addresses/extension', 'Foo Extension'], ()), (['is', 'addresses/street', 'Test Drive 3'], ('John Doe',)), (['is', 'addresses/street', 'Rodeo Drive'], ()), (['is', 'addresses/locality', 'Test Megacity'], ('John Doe',)), (['is', 'addresses/locality', 'New York'], ()), (['is', 'addresses/region', 'Test County'], ('John Doe',)), (['is', 'addresses/region', 'Testovia'], ()), (['is', 'addresses/postal-code', '54321'], ()), (['is', 'addresses/country', 'New Testonia'], ('John Doe',)), (['is', 'addresses/country', 'America'], ()), (['is', 'phones/value', 'business 1'], ('John Doe',)), (['is', 'phones/value', 'business 123'], ()), (['is', 'phones/value', '12345'], ('John Doe',)), (['is', 'phones/value', '123456'], ()), )) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterQuiescence(self): '''TestContacts.testFilterQuiescence - check that starting server via filter leads to quiescence signal''' self.setUpView(peers=[], withSystemAddressBook=True, search=[('any-contains', 'foo')]) self.assertEqual(1, self.view.quiescentCount) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFullQuiescence(self): '''TestContacts.testFullQuiescence - check that starting server via filter leads to quiescence signal''' self.setUpView(peers=[], withSystemAddressBook=True, search=[]) self.assertEqual(1, self.view.quiescentCount) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterLive(self): '''TestContacts.testFilterLive - check that filtering works while adding contacts''' self.setUpView() self.manager.SetSortOrder("first/last") # Find Charly by his FN (case insensitive by default). view = ContactsView(self.manager) view.search([['any-contains', 'chÃrles']]) self.runUntil('charles search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Ace TEL:1234 EMAIL:az@example.com END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin END:VCARD''', # Chárleß has chárless as representation after folding the case. # This is different from lower case. # See http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with one contact', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) > 0) # Don't wait for more contacts here. They shouldn't come, and if # they do, we'll notice it below. self.assertEqual(1, len(view.contacts)) # Search for telephone number. phone = ContactsView(self.manager) phone.search([['phone', '1234']]) self.runUntil('phone results', check=lambda: self.assertEqual([], phone.errors), until=lambda: phone.quiescentCount > 0) self.assertEqual(1, len(phone.contacts)) # Read contacts. logging.log('reading contacts') view.read(0, 1) self.view.read(0, 3) self.runUntil('contacts', check=lambda: (self.assertEqual([], view.errors), self.assertEqual([], self.view.errors)), until=lambda: view.haveData(0) and \ self.view.haveData(0, 3)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Unmatched contact remains unmatched. # Modified phone number no longer matched. item = os.path.join(self.contacts, 'contact%d.vcf' % 0) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:King TEL:123 EMAIL:az@example.com END:VCARD''') output.close() logging.log('change nick of Abraham') # Check as part of event processing: # - view has one unmodified contact check1 = view.setCheck(lambda: (self.assertEqual(1, len(view.contacts)), self.assertIsInstance(view.contacts[0], dict))) # - self.view changes, must not encounter errors check2 = self.view.setCheck(None) check = lambda: (check1(), check2()) out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('Abraham nickname changed', check=check, until=lambda: self.view.haveNoData(0)) self.view.read(0, 1) self.runUntil('Abraham nickname read', check=check, until=lambda: self.view.haveData(0)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) # No longer part of the telephone search view. self.runUntil('phone results', check=lambda: self.assertEqual([], phone.errors), until=lambda: len(phone.contacts) == 0) phone.close() # Matched contact remains matched, but we loose the data. check1 = view.setCheck(lambda: self.assertEqual(1, len(view.contacts))) item = os.path.join(self.contacts, 'contact%d.vcf' % 2) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing NICKNAME:Angel N:Xing;Charly END:VCARD''') output.close() logging.log('change nick of Charly') out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[2]]) self.runUntil('Charly nickname changed', check=check, until=lambda: self.view.haveNoData(2) and \ view.haveNoData(0)) view.read(0, 1) self.view.read(2, 1) self.runUntil('Charly nickname read', check=check, until=lambda: self.view.haveData(2) and \ view.haveData(0)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Unmatched contact gets matched. check1 = view.setCheck(lambda: self.assertLess(0, len(view.contacts))) item = os.path.join(self.contacts, 'contact%d.vcf' % 0) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Chárleß alter ego TEL:1234 EMAIL:az@example.com END:VCARD''') output.close() logging.log('change nick of Abraham, II') out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('Abraham nickname changed', check=check, until=lambda: self.view.haveNoData(0) and \ len(view.contacts) == 2) check1 = view.setCheck(lambda: self.assertEqual(2, len(view.contacts))) self.assertNotIsInstance(view.contacts[0], dict) self.assertIsInstance(view.contacts[1], dict) view.read(0, 1) self.view.read(0, 1) self.runUntil('Abraham nickname read, II', check=check, until=lambda: self.view.haveData(0) and \ view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Charly', view.contacts[1]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) # Invert sort order. check1 = view.setCheck(None) self.manager.SetSortOrder("last/first") self.runUntil('reordering', check=check, until=lambda: self.view.haveNoData(0) and \ self.view.haveNoData(2) and \ view.haveNoData(0, 2)) view.read(0, 2) self.view.read(0, 3) self.runUntil('read reordered contacts', check=check, until=lambda: self.view.haveData(0, 3) and \ view.haveData(0, 2)) self.assertEqual(2, len(view.contacts)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', view.contacts[1]['structured-name']['given']) self.assertEqual(3, len(self.view.contacts)) self.assertEqual(u'Charly', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[2]['structured-name']['given']) # And back again. self.manager.SetSortOrder("first/last") self.runUntil('reordering, II', check=check, until=lambda: self.view.haveNoData(0) and \ self.view.haveNoData(2) and \ view.haveNoData(0, 2)) view.read(0, 2) self.view.read(0, 3) self.runUntil('read reordered contacts, II', check=check, until=lambda: self.view.haveData(0, 3) and \ view.haveData(0, 2)) self.assertEqual(2, len(view.contacts)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Charly', view.contacts[1]['structured-name']['given']) self.assertEqual(3, len(self.view.contacts)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Matched contact gets unmatched. check1 = view.setCheck(lambda: self.assertLess(0, len(view.contacts))) item = os.path.join(self.contacts, 'contact%d.vcf' % 0) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:None TEL:1234 EMAIL:az@example.com END:VCARD''') output.close() logging.log('change nick of Abraham, II') out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('Abraham nickname changed to None', check=check, until=lambda: self.view.haveNoData(0) and \ len(view.contacts) == 1) self.assertIsInstance(view.contacts[0], dict) self.view.read(0, 1) check1 = view.setCheck(lambda: (self.assertEqual(1, len(view.contacts)), self.assertIsInstance(view.contacts[0], dict))) self.runUntil('Abraham nickname read, None', check=check, until=lambda: self.view.haveData(0)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) # Finally, remove everything. logging.log('remove contacts') check1 = view.setCheck(None) out, err, returncode = self.runCmdline(['--delete-items', '@' + self.managerPrefix + self.uid, 'local', '*']) self.runUntil('all contacts removed', check=lambda: (self.assertEqual([], view.errors), self.assertEqual([], self.view.errors)), until=lambda: len(self.view.contacts) == 0 and \ len(view.contacts) == 0) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterExistingLimit(self): '''TestContacts.testFilterExistingLimit - check that filtering works when applied to static contacts, with maximum number of results''' self.setUpView() # Override default sorting. self.assertEqual("last/first", self.manager.GetSortOrder()) self.manager.SetSortOrder("first/last") # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Ace TEL:1234 TEL:56/78 TEL:+1-800-FOOBAR TEL:089/7888-99 EMAIL:az@example.com END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin TEL:+1-89-7888-99 END:VCARD''', # Chárleß has chárless as representation after folding the case. # This is different from lower case. # See http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with three contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 3) # Check for the one expected event. # TODO: self.assertEqual([('added', 0, 3)], view.events) self.view.events = [] # Read contacts. logging.log('reading contacts') self.view.read(0, 3) self.runUntil('contacts', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 3)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Browse initial two contacts (= uses MatchAll filter with limit). view = ContactsView(self.manager) view.search([['limit', '2']]) self.runUntil('browse results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(2, len(view.contacts)) view.read(0, 2) self.runUntil('browse data', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0, 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) view.close() # Find Abraham and Benjamin but stop at first contact. view = ContactsView(self.manager) view.search([['any-contains', 'am'], ['limit', '1']]) self.runUntil('"am" search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('one contact', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Changing the limit is not supported. with self.assertRaisesRegexp(dbus.DBusException, r'.*: refining the search must not change the maximum number of results$'): view.view.RefineSearch([['limit', '3'], ['any-contains', 'foo']]) # Refine search without actually changing the result. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'am'], ['limit', '1']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) # Restrict search to Benjamin. We can leave out the limit, the old # stays active automatically. Abraham drops out of the view # and Benjamin enters the result subset. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'Benjamin']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) self.assertFalse(view.haveData(0)) view.read(0, 1) self.runUntil('Benjamin', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) # Refine again, without changes. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'Benjamin']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) # Refine to empty view. view.quiescentCount = 0 view.view.RefineSearch([['any-contains', 'XXXBenjamin']]) self.runUntil('end of search refinement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Expand back to view with Benjamin. view.quiescentCount = 0 view.view.ReplaceSearch([['any-contains', 'Benjamin']], False) self.runUntil('end of search replacement', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) view.read(0, 1) self.runUntil('Benjamin', check=lambda: self.assertEqual([], view.errors), until=lambda: view.haveData(0)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterLiveLimit(self): '''TestContacts.testFilterLiveLimit - check that filtering works while modifying contacts, with a maximum number of results''' self.setUpView() self.manager.SetSortOrder("first/last") # Find Abraham and Benjamin, but limit results to first one. view = ContactsView(self.manager) view.search([['any-contains', 'am'], ['limit', '1']]) self.runUntil('am search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham FN:Abraham Zoo NICKNAME:Ace END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin END:VCARD''', # Chárleß has chárless as representation after folding the case. # This is different from lower case. # See http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with one contact', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) > 0 and len(self.view.contacts) == 3) # Don't wait for more contacts here. They shouldn't come, and if # they do, we'll notice it below. self.assertEqual(1, len(view.contacts)) # Check conditions as part of view updates. check1 = view.setCheck(None) check2 = self.view.setCheck(None) check = lambda: (check1(), check2()) # Read contacts. logging.log('reading contacts') view.read(0, 1) self.view.read(0, 3) self.runUntil('contacts', check=check, until=lambda: view.haveData(0) and \ self.view.haveData(0, 3)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Matched contact remains matched. item = os.path.join(self.contacts, 'contact%d.vcf' % 0) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham FN:Abraham Zoo NICKNAME:King END:VCARD''') output.close() logging.log('change nick of Abraham') check1 = view.setCheck(lambda: self.assertEqual(1, len(view.contacts))) out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('Abraham nickname changed', check=check, until=lambda: self.view.haveNoData(0) and view.haveNoData(0)) view.read(0, 1) self.view.read(0, 1) self.runUntil('Abraham nickname read', check=check, until=lambda: self.view.haveData(0) and view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) # Unmatched contact gets matched, but stays out of view. item = os.path.join(self.contacts, 'contact%d.vcf' % 0) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly NICKNAME:mamam END:VCARD''') output.close() logging.log('change nick of Charly') check1 = view.setCheck(lambda: self.assertLess(0, len(view.contacts))) out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[2]]) self.runUntil('Charly nickname changed', check=check, until=lambda: self.view.haveNoData(2)) check1 = view.setCheck(lambda: self.assertEqual(1, len(view.contacts))) self.assertEqual(1, len(view.contacts)) self.assertTrue(view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertFalse(self.view.haveData(2)) self.view.read(2, 1) self.runUntil('Abraham nickname read, II', check=check, until=lambda: self.view.haveData(2) and \ view.haveData(0)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Invert sort order. check1 = view.setCheck(None) self.manager.SetSortOrder("last/first") self.runUntil('reordering', check=check, until=lambda: self.view.haveNoData(0) and \ self.view.haveNoData(2) and \ view.haveNoData(0, 1)) view.read(0, 1) self.view.read(0, 3) self.runUntil('read reordered contacts', check=check, until=lambda: self.view.haveData(0, 3) and \ view.haveData(0, 1)) self.assertEqual(1, len(view.contacts)) self.assertEqual(u'Charly', view.contacts[0]['structured-name']['given']) self.assertEqual(3, len(self.view.contacts)) self.assertEqual(u'Charly', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[2]['structured-name']['given']) # And back again. self.manager.SetSortOrder("first/last") self.runUntil('reordering, II', check=check, until=lambda: self.view.haveNoData(0) and \ self.view.haveNoData(2) and \ view.haveNoData(0, 1)) view.read(0, 1) self.view.read(0, 3) self.runUntil('read reordered contacts, II', check=check, until=lambda: self.view.haveData(0, 3) and \ view.haveData(0, 1)) self.assertEqual(1, len(view.contacts)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(3, len(self.view.contacts)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Matched contact gets unmatched. item = os.path.join(self.contacts, 'contact%d.vcf' % 0) output = codecs.open(item, "w", "utf-8") output.write(u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abrahan FN:Abrahan Zoo NICKNAME:None END:VCARD''') output.close() logging.log('change name of Abraham') out, err, returncode = self.runCmdline(['--update', item, '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('Abraham -> Abrahan', check=check, until=lambda: self.view.haveNoData(0) and \ len(view.contacts) == 1 and \ view.haveNoData(0)) check1 = view.setCheck(lambda: self.assertEqual(1, len(view.contacts))) view.read(0, 1) self.view.read(0, 1) self.runUntil('Abrahan read', check=check, until=lambda: self.view.haveData(0) and view.haveData(0)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abrahan', self.view.contacts[0]['structured-name']['given']) # Finally, remove everything. logging.log('remove contacts') check1 = view.setCheck(None) out, err, returncode = self.runCmdline(['--delete-items', '@' + self.managerPrefix + self.uid, 'local', '*']) self.runUntil('all contacts removed', check=check, until=lambda: len(self.view.contacts) == 0 and \ len(view.contacts) == 0) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterLiveLimitInverted(self): '''TestContacts.testFilterLiveLimitInverted - check that filtering works while modifying contacts, with a maximum number of results, and inverted sort order''' self.setUpView() self.manager.SetSortOrder("last/first") # Find Benjamin and Abraham, but limit results to first one. view = ContactsView(self.manager) view.search([['any-contains', 'am'], ['limit', '1']]) self.runUntil('am search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham FN:Abraham Zoo NICKNAME:Ace END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin FN:Benjamin Yeah END:VCARD''', # Chárleß has chárless as representation after folding the case. # This is different from lower case. # See http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with one contact', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) > 0 and len(self.view.contacts) == 3) # Don't wait for more contacts here. They shouldn't come, and if # they do, we'll notice it below. self.assertEqual(1, len(view.contacts)) # Read contacts. logging.log('reading contacts') view.read(0, 1) self.view.read(0, 3) self.runUntil('contacts', check=lambda: (self.assertEqual([], view.errors), self.assertEqual([], self.view.errors)), until=lambda: view.haveData(0) and \ self.view.haveData(0, 3)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[2]['structured-name']['given']) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testFilterLiveLimitRemove(self): '''TestContacts.testFilterLiveLimitRemove - check that filtering works while removing a contact, with a maximum number of results''' self.setUpView() self.manager.SetSortOrder("first/last") # Find Abraham and Benjamin, but limit results to first one. view = ContactsView(self.manager) view.search([['any-contains', 'am'], ['limit', '1']]) self.runUntil('am search results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(0, len(view.contacts)) # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham FN:Abraham Zoo NICKNAME:Ace END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin END:VCARD''', # Chárleß has chárless as representation after folding the case. # This is different from lower case. # See http://www.boost.org/doc/libs/1_51_0/libs/locale/doc/html/glossary.html#term_case_folding u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Relies on importing contacts sorted ascending by file name. luids = self.extractLUIDs(out) logging.printf('created contacts with luids: %s' % luids) # Run until the view has adapted. self.runUntil('view with one contact', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) > 0 and len(self.view.contacts) == 3) # Don't wait for more contacts here. They shouldn't come, and if # they do, we'll notice it below. self.assertEqual(1, len(view.contacts)) # Read contacts. logging.log('reading contacts') view.read(0, 1) self.view.read(0, 3) self.runUntil('contacts', check=lambda: (self.assertEqual([], view.errors), self.assertEqual([], self.view.errors)), until=lambda: view.haveData(0) and \ self.view.haveData(0, 3)) self.assertEqual(u'Abraham', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[2]['structured-name']['given']) # Remove Abraham. Gets replaced by Benjamin in the view. self.runCmdline(['--delete-items', '@' + self.managerPrefix + self.uid, 'local', luids[0]]) self.runUntil('view with Benjamin', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) == 1 and view.haveNoData(0) and len(self.view.contacts) == 2) view.read(0, 1) self.runUntil('Benjamin', check=lambda: (self.assertEqual([], view.errors), self.assertEqual([], self.view.errors)), until=lambda: view.haveData(0) and \ self.view.haveData(0, 2)) self.assertEqual(u'Benjamin', view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Charly', self.view.contacts[1]['structured-name']['given']) # Remove Benjamin. self.runCmdline(['--delete-items', '@' + self.managerPrefix + self.uid, 'local', luids[1]]) self.runUntil('view without Benjamin', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) == 0 and len(self.view.contacts) == 1) self.assertEqual(u'Charly', self.view.contacts[0]['structured-name']['given']) @timeout(60) @property("snapshot", "simple-sort") @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8") def testContactWrite(self): '''TestContacts.testContactWrite - add, update and remove contact''' self.setUpView(peers=[], withSystemAddressBook=True) # Use unicode strings to make the assertEqual output nicer in case # of a mismatch. It's not necessary otherwise. # # This covers all fields which can be written by the folks EDS # backend. john = { 'full-name': 'John Doe', 'groups': ['Foo', 'Bar'], 'location': (30.12, -130.34), 'structured-name': { 'family': 'Doe', 'given': 'John', 'additional': 'D.', 'prefixes': 'Mr.', 'suffixes': 'Sr.' }, # 'nickname': 'Johnny', TODO: should be stored by folks, currently not supported 'birthday': (2011, 12, 1), # 'photo': 'file:///tmp/photo.png', TODO: test with real file, folks will store the content of it # 'gender', 'male', not exposed via D-Bus # 'im': ... # 'is-favorite': ... 'emails': [ ( 'john.doe@work', [ 'work' ] ), ( 'john@home', [ 'home' ] ), ], 'phones': [ ( '1234', ['fax']), ( '5678', ['cell', 'work'] ), ( 'foobar', dbus.Array(signature="s")), # empty string list ], 'addresses': [ ( { 'country': 'United States of America', 'extension': 'ext', 'locality': 'New York', 'po-box': 'box', 'region': 'NY', 'street': 'Lower East Side', }, ['work'] ), ( { 'locality': 'Boston', 'street': 'Main Street', }, dbus.Array(signature="s") # empty string list ), ], # 'web-services' 'roles': [ { 'organisation': 'ACME', 'title': 'president', 'role': 'decision maker', }, { 'organisation': 'BAR', 'title': 'CEO', 'role': 'spokesperson', }, ], 'notes': [ 'note\n\ntext', # TODO: notes -> note (EDS only supports one NOTE) ], 'urls': [ ('chat', ['x-video']), ('free/busy', ['x-free-busy']), ('http://john.doe.com', ['x-home-page']), ('web log', ['x-blog']), ], } with self.assertRaisesRegexp(dbus.DBusException, r'.*: only the system address book is writable'): self.manager.AddContact('no-such-address-book', john) # Add new contact. localID = self.manager.AddContact('', john) john['source'] = [('', unicode(localID))] self.runUntil('view with one contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) > 0) self.assertEqual(1, len(self.view.contacts)) self.view.read(0, 1) self.runUntil('contact data', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0)) contact = self.view.contacts[0] john['id'] = contact.get('id', '') self.assertEqual(john, contact, sortLists=True) with self.assertRaisesRegexp(dbus.DBusException, r'''.*: contact with local ID 'no-such-local-id' not found in system address book'''): self.manager.ModifyContact('', 'no-such-local-id', john) # Update the contact. john = { 'source': [('', localID)], 'id': contact.get('id', ''), 'full-name': 'John A. Doe', 'groups': ['Foo', 'Bar'], 'location': (30.12, -130.34), 'structured-name': { 'family': 'Doe', 'given': 'John', 'additional': 'A.', 'prefixes': 'Mr.', 'suffixes': 'Sr.' }, # 'nickname': 'Johnny', TODO: should be stored by folks, currently not supported - https://bugzilla.gnome.org/show_bug.cgi?id=686695 'birthday': (2011, 12, 24), # 'photo': 'file:///tmp/photo.png', TODO: test with real file, folks will store the content of it # 'gender', 'male', not exposed via D-Bus # 'im': ... # 'is-favorite': ... 'emails': [ ( 'john2@home', [ 'home' ] ), ], 'phones': [ ( '1234', ['fax']), ( '56789', ['work'] ), ], 'addresses': [ ( { 'country': 'United States of America', 'extension': 'ext', 'locality': 'New York', 'po-box': 'box', 'region': 'NY', 'street': 'Upper East Side', }, ['work'] ), ( { 'country': 'United States of America', 'locality': 'Boston', 'street': 'Main Street', }, dbus.Array(signature="s") # empty string list ), ], # 'web-services' 'roles': [ { 'organisation': 'ACME', 'title': 'senior president', 'role': 'scapegoat', }, ], 'notes': [ 'note\n\ntext modified', # TODO: notes -> note (EDS only supports one NOTE) ], 'urls': [ ('http://john.A.doe.com', ['x-home-page']), ('web log 2', ['x-blog']), ], } self.manager.ModifyContact('', localID, john) self.runUntil('modified contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 1 and self.view.haveNoData(0)) # Keep asking for data for a while: we may get "modified" signals multiple times, # which invalidates data that we just read until the unified address book # is stable again. start = time.time() self.runUntil('modified contact data', check=lambda: (self.assertEqual([], self.view.errors), self.view.haveData(0) or self.view.read(0, 1) or True), until=lambda: self.view.haveData(0) and time.time() - start > 5) self.assertEqual(john, self.view.contacts[0], sortLists=True) # Search for modified telephone number. # Depends on having a valid country set via env variables. view = ContactsView(self.manager) view.search([['phone', '56789']]) self.runUntil('phone results', check=lambda: self.assertEqual([], view.errors), until=lambda: view.quiescentCount > 0) self.assertEqual(1, len(view.contacts)) # Remove all properties, except for a minimal name. # Entirely emtpy contacts make no sense. john = { 'source': [('', localID)], 'id': contact.get('id', ''), 'full-name': 'nobody', 'structured-name': { 'given': 'nobody', }, } self.manager.ModifyContact('', localID, john) self.runUntil('modified contact', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 1 and self.view.haveNoData(0)) start = time.time() self.runUntil('modified contact data', check=lambda: (self.assertEqual([], self.view.errors), self.view.haveData(0) or self.view.read(0, 1) or True), until=lambda: self.view.haveData(0) and time.time() - start > 5) self.assertEqual(john, self.view.contacts[0], sortLists=True) # No longer part of the telephone search view. self.runUntil('phone results', check=lambda: self.assertEqual([], view.errors), until=lambda: len(view.contacts) == 0) # Remove the contact. self.manager.RemoveContact('', localID) self.runUntil('empty view', check=lambda: self.assertEqual([], self.view.errors), until=lambda: len(self.view.contacts) == 0) # TODO: check that deleting or modifying a contact works directly # after starting the PIM manager. The problem is that FolksPersonaStore # might still be loading the contacts, in which case looking up the # contact would fail. @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8 SYNCEVOLUTION_PIM_DELAY_FOLKS=5") def testFilterStartup(self): '''TestContacts.testFilterStartup - phone number lookup while folks still loads''' self.setUpView(search=None) # Override default sorting. self.assertEqual("last/first", self.manager.GetSortOrder()) self.manager.SetSortOrder("first/last") # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Ace TEL:1234 TEL:56/78 TEL:+1-800-FOOBAR TEL:089/788899 EMAIL:az@example.com END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin TEL:+49-89-788899 END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Now start with a phone number search which must look # directly in EDS because the unified address book is not # ready (delayed via env variable). self.view.search([['phone', '089/788899']]) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual(2, len(self.view.contacts)) self.view.read(0, 2) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) # Wait for final results from folks. The same in this case. self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 1) self.assertEqual(2, len(self.view.contacts)) self.view.read(0, 2) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) # Nothing changed when folks became active. self.assertEqual([ ('added', 0, 2), ('quiescent',), ('quiescent',), ], self.view.events) def doFilterStartupRefine(self, simpleSearch=True): '''TestContacts.testFilterStartupRefine - phone number lookup while folks still loads, with folks finding more contacts (simple search in EDS) or the same contacts (intelligent search)''' self.setUpView(search=None) # Override default sorting. self.assertEqual("last/first", self.manager.GetSortOrder()) self.manager.SetSortOrder("first/last") # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Ace TEL:1234 TEL:56/78 TEL:+1-800-FOOBAR TEL:089/788899 EMAIL:az@example.com END:VCARD''', # Extra space, breaks suffix match in EDS. # A more intelligent phone number search in EDS # will find this again. u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin TEL:+49-89-7888 99 END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact%d.vcf' % i) output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.log('inserting contacts') out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + self.uid, 'local']) # Now start with a phone number search which must look # directly in EDS because the unified address book is not # ready (delayed via env variable). self.view.search([['phone', '089/788899']]) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) if simpleSearch: self.assertEqual(1, len(self.view.contacts)) self.view.read(0, 1) else: self.assertEqual(2, len(self.view.contacts)) self.view.read(0, 2) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, simpleSearch and 1 or 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) if not simpleSearch: self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) # Wait for final results from folks. Also finds Benjamin. self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 1) self.assertEqual(2, len(self.view.contacts)) self.view.read(0, 2) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) if simpleSearch: # One contact added by folks. self.assertEqual([ ('added', 0, 1), ('quiescent',), ('added', 1, 1), ('quiescent',), ], self.view.events) else: # Two contacts added initially, not updated by folks. self.assertEqual([ ('added', 0, 2), ('quiescent',), ('quiescent',), ], self.view.events) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8 SYNCEVOLUTION_PIM_DELAY_FOLKS=5 SYNCEVOLUTION_PIM_EDS_SUBSTRING=1") def testFilterStartupRefine(self): '''TestContacts.testFilterStartupRefine - phone number lookup while folks still loads, with folks finding more contacts because we use substring search in EDS''' self.doFilterStartupRefine() @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8 SYNCEVOLUTION_PIM_DELAY_FOLKS=5") def testFilterStartupRefineSmart(self): '''TestContacts.testFilterStartupRefine - phone number lookup while folks still loads, with folks finding the same contacts because we use smart search in EDS''' # This test depends on libphonenumber support in EDS! self.doFilterStartupRefine(simpleSearch=False) @timeout(60) @property("ENV", "LC_TYPE=de_DE.UTF-8 LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8 SYNCEVOLUTION_PIM_DELAY_FOLKS=5") def testFilterStartupMany(self): '''TestContacts.testFilterStartupMany - phone number lookup in many address books''' self.setUpView(search=None, peers=['0', '1', '2']) # Override default sorting. self.assertEqual("last/first", self.manager.GetSortOrder()) self.manager.SetSortOrder("first/last") # Insert new contacts. # # The names are chosen so that sorting by first name and sorting by last name needs to # reverse the list. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 N:Zoo;Abraham NICKNAME:Ace TEL:1234 TEL:56/78 TEL:+1-800-FOOBAR TEL:089/788899 EMAIL:az@example.com END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 N:Yeah;Benjamin TEL:+49-89-788899 END:VCARD''', u'''BEGIN:VCARD VERSION:3.0 FN:Charly 'Chárleß' Xing N:Xing;Charly END:VCARD''']): item = os.path.join(self.contacts, 'contact.vcf') output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.printf('inserting contact %d', i) uid = self.uidPrefix + str(i) out, err, returncode = self.runCmdline(['--import', self.contacts, '@' + self.managerPrefix + uid, 'local']) # Now start with a phone number search which must look # directly in EDS because the unified address book is not # ready (delayed via env variable). self.view.search([['phone', '089/788899']]) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual(2, len(self.view.contacts)) self.view.read(0, 2) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) # Wait for final results from folks. The same in this case. self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 1) self.assertEqual(2, len(self.view.contacts)) self.view.read(0, 2) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.haveData(0, 2)) self.assertEqual(u'Abraham', self.view.contacts[0]['structured-name']['given']) self.assertEqual(u'Benjamin', self.view.contacts[1]['structured-name']['given']) # Nothing changed when folks became active. self.assertEqual([ ('added', 0, 2), ('quiescent',), ('quiescent',), ], self.view.events) @timeout(60) def testDeadAgent(self): '''TestContacts.testDeadAgent - an error from the agent kills the view''' self.setUpView(search=None, peers=[], withSystemAddressBook=True) # Insert new contact. for i, contact in enumerate([u'''BEGIN:VCARD VERSION:3.0 FN:John Doe N:Doe;John END:VCARD''', ]): item = os.path.join(self.contacts, 'contact.vcf') output = codecs.open(item, "w", "utf-8") output.write(contact) output.close() logging.printf('inserting contact %d', i) out, err, returncode = self.runCmdline(['--import', self.contacts, 'backend=evolution-contacts']) # Plug into processEvent() method so that it throws an error # when receiving the ContactsAdded method call. The same cannot be # done for Quiescent, because that call is optional and thus allowed # to fail. original = self.view.processEvent def intercept(message, event): if event[0] == 'quiescent': # Sometimes the aggregator was seen as idle before # it loaded the item above, leading to one # additional 'quiescent' before 'added'. Not sure # why. Anyway, that belongs into a different test, # so ignore 'quiescent' here. return # Record it. original(message, event) # Raise error? if event[0] == 'added': logging.printf('raising "fake error" for event %s' % event) raise Exception('fake error') self.view.processEvent = intercept self.view.search([]) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.events) self.assertEqual([('added', 0, 1)], self.view.events) # Expect an error, view should have been closed already. with self.assertRaisesRegexp(dbus.DBusException, "org.freedesktop.DBus.Error.UnknownMethod: .*"): self.view.close() @timeout(60) def testQuiescentOptional(self): '''TestContacts.testQuiescentOptional - the Quiescent() method is allowed to fail''' self.setUpView(search=None, peers=[], withSystemAddressBook=True) # Plug into "Quiescent" method so that it throws an error. original = self.view.processEvent def intercept(message, event): original(message, event) if event[0] == 'quiescent': raise Exception('fake error') self.view.processEvent = intercept self.view.search([]) self.runUntil('phone results', check=lambda: self.assertEqual([], self.view.errors), until=lambda: self.view.quiescentCount > 0) self.assertEqual([('quiescent',)], self.view.events) self.view.close() class TestSlowSync(TestPIMUtil, unittest.TestCase): """Test PIM Manager Sync""" def run(self, result): TestPIMUtil.run(self, result, serverArgs=['-d', '10']) @timeout(usingValgrind() and 600 or 60) @property("ENV", "SYNCEVOLUTION_SYNC_DELAY=20") def testSlowSync(self): '''TestSlowSync.testSlowSync - run a sync which takes longer than the 10 second inactivity duration''' # dummy peer directory contacts = os.path.abspath(os.path.join(xdg_root, 'contacts')) os.makedirs(contacts) # add foo peers = {} uid = self.uidPrefix + 'foo' peers[uid] = {'protocol': 'files', 'address': contacts} self.manager.SetPeer(uid, peers[uid]) self.manager.SyncPeer(uid) if __name__ == '__main__': error = '' paths = [ (os.path.dirname(x), os.path.basename(x)) for x in \ [ os.environ.get(y, '') for y in ['XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME'] ] ] xdg_root = paths[0][0] if not xdg_root or xdg_root != paths[1][0] or xdg_root != paths[2][0] or \ paths[0][1] != 'config' or paths[1][1] != 'data' or paths[2][1] != 'cache': # Don't allow user of the script to erase his normal EDS data and enforce # common basedir with well-known names for each xdg home. error = error + 'testpim.py must be started in a D-Bus session with XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_CACHE_HOME set to temporary directories /config, /data, /cache because it will modify system EDS databases there and relies on a known, flat layout underneath a common directory.\n' else: # Tell test-dbus.py about the temporary directory that we expect # to use. It'll wipe it clean for us because we run with own_xdg=true. testdbus.xdg_root = xdg_root if os.environ.get('LANG', '') != 'de_DE.utf-8': error = error + 'EDS daemon must use the same LANG=de_DE.utf-8 as tests to get phone number normalization right.\n' if error: sys.exit(error) unittest.main() syncevolution-1.5/src/dbus/server/pim/locale-factory-boost.cpp0000664000373300001540000014166212355040516026106 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The boost::locale based implementation of locale-factory.h. */ #include "locale-factory.h" #include "folks.h" #include #include #include #include #include #include #include #include #include SE_GLIB_TYPE(EBookQuery, e_book_query) SE_BEGIN_CXX typedef boost::shared_ptr EPhoneNumberCXX; EPhoneNumberCXX EPhoneNumberCXXNew(EPhoneNumber *number) { return EPhoneNumberCXX(number, e_phone_number_free); } /** * Use higher levels to break ties between strings which are * considered equal at the lower levels. For example, "Façade" and * "facade" would be compared as equal when using only base * characters, but compare differently when also considering a higher * level which includes accents. * * The drawback of higher levels is that they are computationally more * expensive (transformation is slower and leads to longer transformed * strings, thus a longer string comparisons during compare). * * The default here pays attention to accents, case, and * punctuation. According to * http://userguide.icu-project.org/collation/concepts, it is required * for Japanese. */ static const boost::locale::collator_base::level_type DEFAULT_COLLATION_LEVEL = boost::locale::collator_base::quaternary; class CompareBoost : public IndividualCompare, private boost::noncopyable { std::locale m_locale; const boost::locale::collator &m_collator; std::auto_ptr m_trans; public: CompareBoost(const std::locale &locale); std::string transform(const char *string) const; std::string transform(const std::string &string) const; }; CompareBoost::CompareBoost(const std::locale &locale) : m_locale(locale), m_collator(std::use_facet< boost::locale::collator >(m_locale)) { std::string language = std::use_facet(m_locale).language(); if (language == "zh") { // Hard-code Pinyin sorting for all Chinese countries. // // There are three different ways of sorting Chinese and Western names: // 1. Sort Chinese characters in pinyin order, but separate from Latin // 2. Sort them interleaved with Latin, by the first character. // 3. Sort them fully interleaved with Latin. // Source: Mark Davis, ICU, http://sourceforge.net/mailarchive/forum.php?thread_name=CAJ2xs_GEnN-u3%3D%2B7P5puaF1%2BU__fX-4tuA-kEybThN9xsw577Q%40mail.gmail.com&forum_name=icu-support // // Either 2 or 3 is what apparently more people expect. Implementing 2 is // harder, whereas 3 fits into the "generate keys, compare keys" concept // of IndividualCompare, so we kind of arbitrarily implement that. SE_LOG_DEBUG(NULL, "enabling Pinyin"); UErrorCode status = U_ZERO_ERROR; icu::Transliterator *trans = icu::Transliterator::createInstance("Han-Latin", UTRANS_FORWARD, status); m_trans.reset(trans); if (U_FAILURE(status)) { SE_LOG_WARNING(NULL, "creating ICU Han-Latin Transliterator for Pinyin failed, error code %s; falling back to normal collation", u_errorName(status)); m_trans.reset(); } else if (!trans) { SE_LOG_WARNING(NULL, "creating ICU Han-Latin Transliterator for Pinyin failed, no error code; falling back to normal collation"); } } } std::string CompareBoost::transform(const char *string) const { if (!string) { return ""; } return transform(std::string(string)); } std::string CompareBoost::transform(const std::string &string) const { // TODO: use e_collator_generate_key if (m_trans.get()) { // std::string result; // m_trans->transliterate(icu::StringPiece(string), icu::StringByteSink(&result)); icu::UnicodeString buffer(string.c_str()); m_trans->transliterate(buffer); std::string result; buffer.toUTF8String(result); result = m_collator.transform(DEFAULT_COLLATION_LEVEL, result); return result; } else { return m_collator.transform(DEFAULT_COLLATION_LEVEL, string); } } class CompareFirstLastBoost : public CompareBoost { public: CompareFirstLastBoost(const std::locale &locale) : CompareBoost(locale) {} virtual void createCriteria(FolksIndividual *individual, Criteria_t &criteria) const { FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *family = folks_structured_name_get_family_name(fn); const char *given = folks_structured_name_get_given_name(fn); criteria.push_back(transform(given)); criteria.push_back(transform(family)); } } }; class CompareLastFirstBoost : public CompareBoost { public: CompareLastFirstBoost(const std::locale &locale) : CompareBoost(locale) {} virtual void createCriteria(FolksIndividual *individual, Criteria_t &criteria) const { FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *family = folks_structured_name_get_family_name(fn); const char *given = folks_structured_name_get_given_name(fn); criteria.push_back(transform(family)); criteria.push_back(transform(given)); } } }; class CompareFullnameBoost : public CompareBoost { public: CompareFullnameBoost(const std::locale &locale) : CompareBoost(locale) {} virtual void createCriteria(FolksIndividual *individual, Criteria_t &criteria) const { const char *fullname = folks_name_details_get_full_name(FOLKS_NAME_DETAILS(individual)); if (fullname) { criteria.push_back(transform(fullname)); } else { FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *given = folks_structured_name_get_given_name(fn); const char *middle = folks_structured_name_get_additional_names(fn); const char *family = folks_structured_name_get_family_name(fn); const char *suffix = folks_structured_name_get_suffixes(fn); std::string buffer; buffer.reserve(256); #define APPEND(_str) \ if (_str && *_str) { \ if (!buffer.empty()) { \ buffer += _str; \ } \ } APPEND(given); APPEND(middle); APPEND(family); APPEND(suffix); #undef APPEND criteria.push_back(transform(buffer)); } } } }; /** * Implements 'any-contains' and acts as utility base class * for the other text comparison operators. */ class AnyContainsBoost : public IndividualFilter { public: enum Mode { EXACT = 0, CASE_INSENSITIVE = 1<<0, ACCENT_INSENSITIVE = 1<<1, TRANSLITERATE = 1<<2, ALL = CASE_INSENSITIVE| ACCENT_INSENSITIVE| TRANSLITERATE| 0 }; AnyContainsBoost(const std::locale &locale, const std::string &searchValue, int mode) : m_locale(locale), // For performance reasons we use ICU directly and thus need // an ICU::Locale. // m_ICULocale(std::use_facet(m_locale).language().c_str(), // std::use_facet(m_locale).country().c_str(), // std::use_facet(m_locale).variant().c_str()), // m_collator(std::use_facet(locale)), m_searchValue(searchValue), m_mode(mode) { if (mode & TRANSLITERATE) { UErrorCode status = U_ZERO_ERROR; m_transliterator.reset(Transliterator::createInstance ("Any-Latin", UTRANS_FORWARD, status)); if (!m_transliterator || U_FAILURE(status)) { SE_LOG_WARNING(NULL, "creating ICU Any-Latin Transliterator failed, error code %s; falling back to not transliterating", u_errorName(status)); m_transliterator.reset(); mode ^= TRANSLITERATE; m_mode = mode; } } switch (mode) { case EXACT: break; default: m_searchValueTransformed = transform(m_searchValue); break; } m_searchValueTel = normalizePhoneText(m_searchValue.c_str()); } /** * Turn filter arguments into bit field. */ static int getFilterMode(const std::vector &terms, size_t start); /** simplify according to mode */ std::string transform(const char *in) const; std::string transform(const std::string &in) const { return transform(in.c_str()); } /** * The search text is not necessarily a full phone number, * therefore we cannot parse it with libphonenumber. Instead * do a sub-string search after telephone specific normalization, * to let the search ignore irrelevant formatting aspects: * * - Map ASCII characters to the corresponding digit. * - Reduce to just the digits before comparison (no spaces, no * punctuation). * * Example: +1-800-FOOBAR -> 1800366227 */ static std::string normalizePhoneText(const char *tel) { static const i18n::phonenumbers::PhoneNumberUtil &util(*i18n::phonenumbers::PhoneNumberUtil::GetInstance()); std::string res; char c; bool haveAlpha = false; while ((c = *tel) != '\0') { if (isdigit(c)) { res += c; } else if (isalpha(c)) { haveAlpha = true; res += c; } ++tel; } // Only scan through the string again if we really have to. if (haveAlpha) { util.ConvertAlphaCharactersInNumber(&res); } return res; } bool containsSearchText(const char *text) const { if (!text) { return false; } switch (m_mode) { case EXACT: return boost::contains(text, m_searchValue); break; default: { std::string transformed = transform(text); return boost::contains(transformed, m_searchValueTransformed); break; } } // not reached return false; } bool containsSearchTel(const char *text) const { std::string tel = normalizePhoneText(text); return boost::contains(tel, m_searchValueTel); } bool isSearchText(const char *text) const { if (!text) { return false; } switch (m_mode) { case EXACT: return boost::equals(text, m_searchValue); break; default: { std::string transformed = transform(text); return boost::equals(transformed, m_searchValueTransformed); break; } } // not reached return false; } bool isSearchTel(const char *text) const { std::string tel = normalizePhoneText(text); return boost::equals(tel, m_searchValueTel); } bool beginsWithSearchText(const char *text) const { if (!text) { return false; } switch (m_mode) { case EXACT: return boost::starts_with(text, m_searchValue); break; default: { std::string transformed = transform(text); return boost::starts_with(transformed, m_searchValueTransformed); break; } } // not reached return false; } bool beginsWithSearchTel(const char *text) const { std::string tel = normalizePhoneText(text); return boost::starts_with(tel, m_searchValueTel); } bool endsWithSearchText(const char *text) const { if (!text) { return false; } switch (m_mode) { case EXACT: return boost::ends_with(text, m_searchValue); break; default: { std::string transformed = transform(text); return boost::ends_with(transformed, m_searchValueTransformed); break; } } // not reached return false; } bool endsWithSearchTel(const char *text) const { std::string tel = normalizePhoneText(text); return boost::ends_with(tel, m_searchValueTel); } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksNameDetails *name = FOLKS_NAME_DETAILS(individual); const char *fullname = folks_name_details_get_full_name(name); if (containsSearchText(fullname)) { return true; } const char *nickname = folks_name_details_get_nickname(name); if (containsSearchText(nickname)) { return true; } FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *given = folks_structured_name_get_given_name(fn); if (containsSearchText(given)) { return true; } const char *middle = folks_structured_name_get_additional_names(fn); if (containsSearchText(middle)) { return true; } const char *family = folks_structured_name_get_family_name(fn); if (containsSearchText(family)) { return true; } } FolksEmailDetails *emailDetails = FOLKS_EMAIL_DETAILS(individual); GeeSet *emails = folks_email_details_get_email_addresses(emailDetails); BOOST_FOREACH (FolksAbstractFieldDetails *email, GeeCollCXX(emails, ADD_REF)) { const gchar *value = reinterpret_cast(folks_abstract_field_details_get_value(email)); if (containsSearchText(value)) { return true; } } FolksPhoneDetails *phoneDetails = FOLKS_PHONE_DETAILS(individual); GeeSet *phones = folks_phone_details_get_phone_numbers(phoneDetails); BOOST_FOREACH (FolksAbstractFieldDetails *phone, GeeCollCXX(phones, ADD_REF)) { const gchar *value = reinterpret_cast(folks_abstract_field_details_get_value(phone)); if (containsSearchTel(value)) { return true; } } return false; } private: std::locale m_locale; // icu::Locale m_ICULocale; boost::shared_ptr m_transliterator; std::string m_searchValue; std::string m_searchValueTransformed; std::string m_searchValueTel; int m_mode; // const bool (*m_contains)(const std::string &, const std::string &, const std::locale &); }; std::string AnyContainsBoost::transform(const char *in) const { icu::UnicodeString unicode = icu::UnicodeString::fromUTF8(in); if (m_mode & TRANSLITERATE) { m_transliterator->transliterate(unicode); } if (m_mode & CASE_INSENSITIVE) { unicode.foldCase(); } std::string utf8; unicode.toUTF8String(utf8); if (m_mode & ACCENT_INSENSITIVE) { // Haven't found an easy way to do this with ICU. // Use e_util_utf8_remove_accents(), which also ensures // consistency with EDS. PlainGStr res = e_util_utf8_remove_accents(utf8.c_str()); return std::string(res); } else { return utf8; } } int AnyContainsBoost::getFilterMode(const std::vector &terms, size_t start) { int mode = ALL; for (size_t i = start; i < terms.size(); i++) { const std::string &flag = LocaleFactory::getFilterString(terms[i], "any-contains flag"); if (flag == "case-sensitive") { mode &= ~CASE_INSENSITIVE; } else if (flag == "case-insensitive") { mode |= CASE_INSENSITIVE; } else if (flag == "accent-sensitive") { mode &= ~ACCENT_INSENSITIVE; } else if (flag == "accent-insensitive") { mode |= ACCENT_INSENSITIVE; } else if (flag == "no-transliteration") { mode &= ~TRANSLITERATE; } else if (flag == "transliteration") { mode |= TRANSLITERATE; } else { SE_THROW("unsupported filter flag: " + flag); } } return mode; } class FilterFullName : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterFullName(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksNameDetails *name = FOLKS_NAME_DETAILS(individual); const char *fullname = folks_name_details_get_full_name(name); return (this->*m_operation)(fullname); } }; class FilterNickname : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterNickname(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksNameDetails *name = FOLKS_NAME_DETAILS(individual); const char *fullname = folks_name_details_get_nickname(name); return (this->*m_operation)(fullname); } }; class FilterFamilyName : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterFamilyName(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *name = folks_structured_name_get_family_name(fn); return (this->*m_operation)(name); } else { return false; } } }; class FilterGivenName : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterGivenName(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *name = folks_structured_name_get_given_name(fn); return (this->*m_operation)(name); } else { return false; } } }; class FilterAdditionalName : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterAdditionalName(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksStructuredName *fn = folks_name_details_get_structured_name(FOLKS_NAME_DETAILS(individual)); if (fn) { const char *name = folks_structured_name_get_additional_names(fn); return (this->*m_operation)(name); } else { return false; } } }; class FilterEmails : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterEmails(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksEmailDetails *emailDetails = FOLKS_EMAIL_DETAILS(individual); GeeSet *emails = folks_email_details_get_email_addresses(emailDetails); BOOST_FOREACH (FolksAbstractFieldDetails *email, GeeCollCXX(emails, ADD_REF)) { const gchar *value = reinterpret_cast(folks_abstract_field_details_get_value(email)); if ((this->*m_operation)(value)) { return true; } } return false; } }; class FilterTel : public AnyContainsBoost { bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterTel(const std::locale &locale, const std::string &searchValue, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, 0 /* doesn't matter */), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksPhoneDetails *phoneDetails = FOLKS_PHONE_DETAILS(individual); GeeSet *phones = folks_phone_details_get_phone_numbers(phoneDetails); BOOST_FOREACH (FolksAbstractFieldDetails *phone, GeeCollCXX(phones, ADD_REF)) { const gchar *value = reinterpret_cast(folks_abstract_field_details_get_value(phone)); if ((this->*m_operation)(value)) { return true; } } return false; } }; class FilterAddr : public AnyContainsBoost { protected: bool (AnyContainsBoost::*m_operation)(const char *text) const; public: FilterAddr(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : AnyContainsBoost(locale, searchValue, mode), m_operation(operation) { } virtual bool matches(const IndividualData &data) const { FolksIndividual *individual = data.m_individual.get(); FolksPostalAddressDetails *addressDetails = FOLKS_POSTAL_ADDRESS_DETAILS(individual); GeeSet *addresses = folks_postal_address_details_get_postal_addresses(addressDetails); BOOST_FOREACH (FolksPostalAddressFieldDetails *address, GeeCollCXX(addresses, ADD_REF)) { const FolksPostalAddress *value = reinterpret_cast(folks_abstract_field_details_get_value(FOLKS_ABSTRACT_FIELD_DETAILS(address))); if (matchesAddr(value)) { return true; } } return false; } virtual bool matchesAddr(const FolksPostalAddress *addr) const = 0; }; class FilterAddrPOBox : public FilterAddr { public: FilterAddrPOBox(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_po_box(const_cast(addr)); return (this->*m_operation)(attr); } }; class FilterAddrExtension : public FilterAddr { public: FilterAddrExtension(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_extension(const_cast(addr)); return (this->*m_operation)(attr); } }; class FilterAddrStreet : public FilterAddr { public: FilterAddrStreet(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_street(const_cast(addr)); return (this->*m_operation)(attr); } }; class FilterAddrLocality : public FilterAddr { public: FilterAddrLocality(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_locality(const_cast(addr)); return (this->*m_operation)(attr); } }; class FilterAddrRegion : public FilterAddr { public: FilterAddrRegion(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_region(const_cast(addr)); return (this->*m_operation)(attr); } }; class FilterAddrPostalCode : public FilterAddr { public: FilterAddrPostalCode(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_postal_code(const_cast(addr)); return (this->*m_operation)(attr); } }; class FilterAddrCountry : public FilterAddr { public: FilterAddrCountry(const std::locale &locale, const std::string &searchValue, int mode, bool (AnyContainsBoost::*operation)(const char *text) const) : FilterAddr(locale, searchValue, mode, operation) { } virtual bool matchesAddr(const FolksPostalAddress *addr) const { const char *attr = folks_postal_address_get_country(const_cast(addr)); return (this->*m_operation)(attr); } }; SimpleE164 String2E164(const char *tel, const char *country) { SimpleE164 e164; GErrorCXX gerror; EPhoneNumberCXX number(EPhoneNumberCXXNew(e_phone_number_from_string(tel, country, gerror))); if (!number) { gerror.throwError(SE_HERE, "parsing number"); } EPhoneNumberCountrySource source; e164.m_countryCode = e_phone_number_get_country_code(number.get(), &source); if (source == E_PHONE_NUMBER_COUNTRY_FROM_DEFAULT) { e164.m_countryCode = 0; } PlainGStr national(e_phone_number_get_national_number(number.get())); e164.m_nationalNumber = national.get() ? boost::lexical_cast(national.get()) : 0; return e164; } /** * Search value must be a valid caller ID (with or without a country * code). The telephone numbers in the contacts may or may not be * valid; only valid ones will match. The user is expected to clean up * that data to get exact matches for the others. * * The matching uses the same semantic as EQUALS_NATIONAL_PHONE_NUMBER: * - If both numbers have an explicit country code, that code must be * the same for a match. * - If one or both numbers have no country code, matching the national * part is enough for a match. */ class PhoneStartsWith : public IndividualFilter { public: PhoneStartsWith(const std::locale &m_locale, const std::string &tel) : m_phoneNumberUtil(*i18n::phonenumbers::PhoneNumberUtil::GetInstance()), m_simpleEDSSearch(getenv("SYNCEVOLUTION_PIM_EDS_SUBSTRING") || !e_phone_number_is_supported()), m_country(std::use_facet(m_locale).country()) { m_number = String2E164(tel.c_str(), m_country.c_str()); } virtual bool matches(const IndividualData &data) const { BOOST_FOREACH(const SimpleE164 &number, data.m_precomputed.m_phoneNumbers) { // National part must always match, country code only if // set explicitly in both (NSN_MATCH in libphonenumber, // EQUALS_NATIONAL_PHONE_NUMBER in EDS). if (number.m_nationalNumber == m_number.m_nationalNumber && (!number.m_countryCode || !m_number.m_countryCode || number.m_countryCode == m_number.m_countryCode)) { return true; } } return false; } virtual std::string getEBookFilter() const { std::string tel = m_number.toString(); size_t len = std::min((size_t)4, tel.size()); EBookQueryCXX query(m_simpleEDSSearch ? // A suffix match with a limited number of digits is most // likely to find the right contacts. e_book_query_field_test(E_CONTACT_TEL, E_BOOK_QUERY_ENDS_WITH, tel.substr(tel.size() - len, len).c_str()) : // We use EQUALS_NATIONAL_PHONE_NUMBER // instead of EQUALS_PHONE_NUMBER here, // because it will also match contacts // were the country code was not set // explicitly. EQUALS_PHONE_NUMBER would // do a stricter comparison and not match // those. // // If the contact has a country code set, // then EQUALS_NATIONAL_PHONE_NUMBER will // check that and not return a false match // if the country code is different. // // We try to pass the E164 string here. If // the search term had no country code, // that's a bit difficult because we can't // just add the default country code. // That would break the // NATIONAL_PHONE_NUMBER semantic because // EDS wouldn't know that the search term // had no country code. We resort to the // format of SimpleE164.toString(), which // is passing the national number // formatted as string. e_book_query_field_test(E_CONTACT_TEL, E_BOOK_QUERY_EQUALS_NATIONAL_PHONE_NUMBER, tel.c_str()), TRANSFER_REF); PlainGStr filter(e_book_query_to_string(query.get())); return filter.get(); } private: const i18n::phonenumbers::PhoneNumberUtil &m_phoneNumberUtil; bool m_simpleEDSSearch; std::string m_country; SimpleE164 m_number; }; class PhoneNumberLogger : public i18n::phonenumbers::Logger { const char *getPrefix() { switch (level()) { case i18n::phonenumbers::LOG_FATAL: return "phonenumber fatal"; break; case i18n::phonenumbers::LOG_ERROR: return "phonenumber error"; break; case i18n::phonenumbers::LOG_WARNING: return "phonenumber warning"; break; case i18n::phonenumbers::LOG_INFO: return "phonenumber info"; break; case i18n::phonenumbers::LOG_DEBUG: return "phonenumber debug"; break; default: return "phonenumber ???"; break; } } public: virtual void WriteMessage(const std::string &msg) { SE_LOG(getPrefix(), level() == i18n::phonenumbers::LOG_FATAL ? SyncEvo::Logger::ERROR : SyncEvo::Logger::DEBUG, "%s", msg.c_str()); } }; class LocaleFactoryBoost : public LocaleFactory { const i18n::phonenumbers::PhoneNumberUtil &m_phoneNumberUtil; bool m_edsSupportsPhoneNumbers; std::locale m_locale; std::string m_country; std::string m_defaultCountryCode; PhoneNumberLogger m_logger; public: LocaleFactoryBoost() : m_phoneNumberUtil(*i18n::phonenumbers::PhoneNumberUtil::GetInstance()), m_edsSupportsPhoneNumbers(e_phone_number_is_supported() && !getenv("SYNCEVOLUTION_PIM_EDS_NO_E164")), m_locale(genLocale()), m_country(std::use_facet(m_locale).country()), m_defaultCountryCode(StringPrintf("+%d", m_phoneNumberUtil.GetCountryCodeForRegion(m_country))) { // Redirect output of libphonenumber and make it a bit quieter // than it is by default. We map fatal libphonenumber errors // to ERROR and everything else to DEBUG. // // The PhoneNumberUtil instance owns the logger, so we don't // need (and must not) free it. libphonenumber < r571 has the // same API and thus this code compiles. However, older // libphonenumer does not actually free the instance, causing // a minor memory leak. i18n::phonenumbers::PhoneNumberUtil::GetInstance()->SetLogger(new PhoneNumberLogger); } static std::locale genLocale() { // Get current locale from environment. Configure the // generated locale so that it supports what we need and // nothing more. boost::locale::generator gen; gen.characters(boost::locale::char_facet); gen.categories(boost::locale::collation_facet | boost::locale::convert_facet | boost::locale::information_facet); // Hard-code "phonebook" collation for certain languages // where we know that it is desirable. We could use it // in all cases, except that ICU has a bug where it does not // fall back properly to the base collation. See // http://sourceforge.net/mailarchive/message.php?msg_id=30802924 // and http://bugs.icu-project.org/trac/ticket/10149 std::locale locale = gen(""); std::string name = std::use_facet(locale).name(); std::string language = std::use_facet(locale).language(); std::string country = std::use_facet(locale).country(); SE_LOG_DEV(NULL, "PIM Manager running with locale %s = language %s in country %s", name.c_str(), language.c_str(), country.c_str()); if (language == "de" || language == "fi") { SE_LOG_DEV(NULL, "enabling phonebook collation for language %s", language.c_str()); locale = gen(name + "@collation=phonebook"); } return locale; } virtual boost::shared_ptr createCompare(const std::string &order) { boost::shared_ptr res; if (order == "first/last") { res.reset(new CompareFirstLastBoost(m_locale)); } else if (order == "last/first") { res.reset(new CompareLastFirstBoost(m_locale)); } else if (order == "fullname") { res.reset(new CompareFullnameBoost(m_locale)); } else { SE_THROW("boost locale factory: sort order '" + order + "' not supported"); } return res; } virtual boost::shared_ptr createFilter(const Filter_t &filter, int level) { boost::shared_ptr res; try { const std::vector &terms = getFilterArray(filter, "array of terms"); // Only handle arrays where the first entry is a string // that we recognize. All other cases are handled by the generic // LocaleFactory. if (!terms.empty() && boost::get(&terms[0])) { const std::string &operation = getFilterString(terms[0], "operation name"); // Pick default operation. Will be replaced with // telephone-specific operation once we know that the // field is 'phones/value'. bool (AnyContainsBoost::*func)(const char *text) const; if (operation == "contains") { func = &AnyContainsBoost::containsSearchText; } else if (operation == "is") { func = &AnyContainsBoost::isSearchText; } else if (operation == "begins-with") { func = &AnyContainsBoost::beginsWithSearchText; } else if (operation == "ends-with") { func = &AnyContainsBoost::endsWithSearchText; } else { func = NULL; } if (func) { switch (terms.size()) { case 1: SE_THROW("missing field name and search value"); break; case 2: SE_THROW("missing search value"); break; } const std::string &field = getFilterString(terms[1], "search field"); const std::string &value = getFilterString(terms[2], "search string"); if (field == "phones/value") { if (terms.size() > 3) { SE_THROW("Additional entries after 'phones/value' field filter not allowed."); } // Use the telephone specific functions. res.reset(new FilterTel(m_locale, value, func == &AnyContainsBoost::containsSearchText ? &AnyContainsBoost::containsSearchTel : func == &AnyContainsBoost::isSearchText ? &AnyContainsBoost::isSearchTel : func == &AnyContainsBoost::beginsWithSearchText ? &AnyContainsBoost::beginsWithSearchTel : func == &AnyContainsBoost::endsWithSearchText ? &AnyContainsBoost::endsWithSearchTel : func)); } else { int mode = AnyContainsBoost::getFilterMode(terms, 3); if (field == "full-name") { res.reset(new FilterFullName(m_locale, value, mode, func)); } else if (field == "nickname") { res.reset(new FilterNickname(m_locale, value, mode, func)); } else if (field == "structured-name/family") { res.reset(new FilterFamilyName(m_locale, value, mode, func)); } else if (field == "structured-name/given") { res.reset(new FilterGivenName(m_locale, value, mode, func)); } else if (field == "structured-name/additional") { res.reset(new FilterAdditionalName(m_locale, value, mode, func)); } else if (field == "emails/value") { res.reset(new FilterEmails(m_locale, value, mode, func)); } else if (field == "addresses/po-box") { res.reset(new FilterAddrPOBox(m_locale, value, mode, func)); } else if (field == "addresses/extension") { res.reset(new FilterAddrExtension(m_locale, value, mode, func)); } else if (field == "addresses/street") { res.reset(new FilterAddrStreet(m_locale, value, mode, func)); } else if (field == "addresses/locality") { res.reset(new FilterAddrLocality(m_locale, value, mode, func)); } else if (field == "addresses/region") { res.reset(new FilterAddrRegion(m_locale, value, mode, func)); } else if (field == "addresses/postal-code") { res.reset(new FilterAddrPostalCode(m_locale, value, mode, func)); } else if (field == "addresses/country") { res.reset(new FilterAddrCountry(m_locale, value, mode, func)); } else { SE_THROW("Unknown field name: " + field); } } } else if (operation == "any-contains") { if (terms.size() < 2) { SE_THROW("missing search value"); } const std::string &value = getFilterString(terms[1], "search string"); int mode = AnyContainsBoost::getFilterMode(terms, 2); res.reset(new AnyContainsBoost(m_locale, value, mode)); } else if (operation == "phone") { if (terms.size() != 2) { SE_THROW("'phone' filter needs exactly one parameter."); } const std::string &value = getFilterString(terms[1], "search string"); res.reset(new PhoneStartsWith(m_locale, value)); } } } catch (const Exception &ex) { handleFilterException(filter, level, &ex.m_file, ex.m_line); } catch (...) { handleFilterException(filter, level, NULL, 0); } // Let base class handle it if we didn't recognize the operation. return res ? res : LocaleFactory::createFilter(filter, level); } virtual bool precompute(FolksIndividual *individual, Precomputed &precomputed) const { LocaleFactory::Precomputed old; std::swap(old, precomputed); FolksPhoneDetails *phoneDetails = FOLKS_PHONE_DETAILS(individual); GeeSet *phones = folks_phone_details_get_phone_numbers(phoneDetails); precomputed.m_phoneNumbers.reserve(gee_collection_get_size(GEE_COLLECTION(phones))); BOOST_FOREACH (FolksAbstractFieldDetails *phone, GeeCollCXX(phones, ADD_REF)) { const gchar *value = reinterpret_cast(folks_abstract_field_details_get_value(phone)); if (value) { if (m_edsSupportsPhoneNumbers) { // Check X-EVOLUTION-E164 (made lowercase by folks!). // // It has the format ,, // where happens to be in quotation marks. // This ends up being split into individual values which // are returned in random order by folks (a bug?!). // // Example: TEL;X-EVOLUTION-E164=891234,"+49":+49-89-1234 // => value '+49-89-1234', params [ '+49', '891234' ]. // // We restore the right order by sorting, which puts the // country code first, and then joining. GeeCollectionCXX coll(folks_abstract_field_details_get_parameter_values(phone, "x-evolution-e164"), TRANSFER_REF); if (coll) { std::vector components; components.reserve(2); BOOST_FOREACH (const gchar *component, GeeStringCollection(coll)) { // Empty component represents an unset // country code. Note that it is not // certain whether we get to see the empty // component. At the moment (EDS 3.7, // folks 0.9.1), someone swallows it. components.push_back(component); } if (!components.empty()) { // Only one component? We must still miss the country code. if (components.size() == 1) { components.push_back(""); } std::sort(components.begin(), components.end()); try { SimpleE164 number; number.m_countryCode = components[0].empty() ? 0 : boost::lexical_cast(components[0]); number.m_nationalNumber = components[1].empty() ? 0 : boost::lexical_cast(components[1]); precomputed.m_phoneNumbers.push_back(number); } catch (const boost::bad_lexical_cast &ex) { SE_LOG_WARNING(NULL, "ignoring malformed X-EVOLUTION-E164 (sorted): %s", boost::join(components, ", ").c_str()); } } } // Either EDS had a normalized value or there is none because // the value is not a phone number. No need to try parsing again. continue; } try { // This fallback for missing X-EVOLUTION-E164 in EDS still relies // on libphonenumber support in libebook, so it does not really help // if EDS was compiled without libphonenumber. It is primarily useful // for testing (see TestContacts.testLocaledPhone). SimpleE164 e164 = String2E164(value, m_country.c_str()); if (e164.m_countryCode || e164.m_nationalNumber) { precomputed.m_phoneNumbers.push_back(e164); } } catch (const Exception &ex) { // Silently ignore parse errors. SE_LOG_DEBUG(NULL, "ignoring unparsable TEL '%s': %s", value, ex.what()); } } } // Now check if any phone number changed. return old != precomputed; } }; boost::shared_ptr LocaleFactory::createFactory() { return boost::shared_ptr(new LocaleFactoryBoost()); } SE_END_CXX syncevolution-1.5/src/dbus/server/org.syncevolution.service.in0000644000373300001540000000015012326412403026237 0ustar00nightlynightly00000000000000[D-BUS Service] Name=org.syncevolution Exec=@libexecdir@/syncevo-dbus-server @SYNCEVO_DBUS_SERVER_ARGS@ syncevolution-1.5/src/dbus/server/syncevo-dbus-server-startup.sh.in0000755000373300001540000000014712326412403027140 0ustar00nightlynightly00000000000000#! /bin/sh sleep 120 exec @libexecdir@/syncevo-dbus-server @SYNCEVO_DBUS_SERVER_ARGS@ 2>/dev/null 1>&1 syncevolution-1.5/src/dbus/server/syncevo-dbus-server.desktop.in0000644000373300001540000000023412326412403026471 0ustar00nightlynightly00000000000000[Desktop Entry] Type=Application Hidden=false Name=syncevo-dbus-server Comment=SyncEvolution D-Bus Server Exec=@libexecdir@/syncevo-dbus-server-startup.sh syncevolution-1.5/src/dbus/server/bluetooth_products.ini0000644000373300001540000001064412326412403025203 0ustar00nightlynightly00000000000000# Vendor lookup table # # The key is the VendorID and the value the Vendor name. This list # was obtained from # http://www.bluetooth.org/Technical/AssignedNumbers/identifiers.htm # # FIXME: This is available from Bluez. Use that. [Vendors] 0x0000=Sony Ericsson 0x0001=Nokia 0x0002=Intel Corp. 0x0003=IBM Corp. 0x0004=Toshiba Corp. 0x0005=3Com 0x0006=Microsoft 0x0007=Lucent 0x0008=Motorola 0x0009=Infineon Technologies AG 0x000A=Cambridge Silicon Radio 0x000B=Silicon Wave 0x000C=Digianswer A/S 0x000D=Texas Instruments Inc. 0x000E=Parthus Technologies Inc. 0x000F=Broadcom Corporation 0x0010=Mitel Semiconductor 0x0011=Widcomm, Inc. 0x0012=Zeevo, Inc. 0x0013=Atmel Corporation 0x0014=Mitsubishi Electric Corporation 0x0015=RTX Telecom A/S 0x0016=KC Technology Inc. 0x0017=Newlogic 0x0018=Transilica, Inc. 0x0019=Rohde & Schwarz GmbH & Co. KG 0x001A=TTPCom Limited 0x001B=Signia Technologies, Inc. 0x001C=Conexant Systems Inc. 0x001D=Qualcomm 0x001E=Inventel 0x001F=AVM Berlin 0x0020=BandSpeed, Inc. 0x0021=Mansella Ltd 0x0022=NEC Corporation 0x0023=WavePlus Technology Co., Ltd. 0x0024=Alcatel 0x0025=Philips Semiconductors 0x0026=C Technologies 0x0027=Open Interface 0x0028=R F Micro Devices 0x0029=Hitachi Ltd 0x002A=Symbol Technologies, Inc. 0x002B=Tenovis 0x002C=Macronix International Co. Ltd. 0x002D=GCT Semiconductor 0x002E=Norwood Systems 0x002F=MewTel Technology Inc. 0x0030=ST Microelectronics 0x0031=Synopsys 0x0032=Red-M (Communications) Ltd 0x0033=Commil Ltd 0x0034=Computer Access Technology Corporation (CATC) 0x0035=Eclipse (HQ Espana) S.L. 0x0036=Renesas Technology Corp. 0x0037=Mobilian Corporation 0x0038=Terax 0x0039=Integrated System Solution Corp. 0x003A=Matsushita Electric Industrial Co., Ltd. 0x003B=Gennum Corporation 0x003C=Research In Motion 0x003D=IPextreme, Inc. 0x003E=Systems and Chips, Inc 0x003F=Bluetooth SIG, Inc 0x0040=Seiko Epson Corporation 0x0041=Integrated Silicon Solution Taiwan, Inc. 0x0042=CONWISE Technology Corporation Ltd 0x0043=PARROT SA 0x0044=Socket Mobile 0x0045=Atheros Communications, Inc. 0x0046=MediaTek, Inc. 0x0047=Bluegiga 0x0048=Marvell Technology Group Ltd. 0x0049=3DSP Corporation 0x004A=Accel Semiconductor Ltd. 0x004B=Continental Automotive Systems 0x004C=Apple, Inc. 0x004D=Staccato Communications, Inc. 0x004E=Avago Technologies 0x004F=APT Licensing Ltd. 0x0050=SiRF Technology, Inc. 0x0051=Tzero Technologies, Inc. 0x0052=J&M Corporation 0x0053=Free2move AB 0x0054=3DiJoy Corporation 0x0055=Plantronics, Inc. 0x0056=Sony Ericsson 0x0057=Harman International Industries, Inc. 0x0058=Vizio, Inc. 0x0059=Nordic Semiconductor ASA 0x005A=EM Microelectronic-Marin SA 0x005B=Ralink Technology Corporation 0x005C=Belkin International, Inc. 0x005D=Realtek Semiconductor Corporation 0x005E=Stonestreet One, LLC 0x005F=Wicentric, Inc. 0x0060=RivieraWaves S.A.S 0x0061=RDA Microelectronics 0x0062=Gibson Guitars 0x0063=MiCommand Inc. 0x0064=Band XI International, LLC 0x0065=Hewlett-Packard Company 0x0066=9Solutions Oy 0x0067=GN Netcom A/S 0x0068=General Motors 0x0069=A&D Engineering, Inc. 0x006A=MindTree Ltd. 0x006B=Polar Electro OY 0x006C=Beautiful Enterprise Co., Ltd. 0x006D=BriarTek, Inc. 0x006E=Summit Data Communications, Inc. 0x006F=Sound ID 0x0070=Monster, LLC 0x0071=connectBlue AB # Product lookup table # # The keys are of the form "VendorID_ProductID", and the value "Vendor # Model". The VendorID needs to be used as a prefix because ProductIDs # are only unique per vendor. Currently we have no list of product IDs # from vendors so we add them as we find them. To this end we've # written a script (bluetooth-device-id-inspector.py) located in the # top level "test" directory which scans for this info and outputs a # file that can be sent to syncEvolution developers for inclusion. # [Products] 0x0000_0xc089=Sony Ericsson W580i 0x0000_0xc112=Sony Ericsson W995 0x0001_0x003c=Nokia 5310 0x0001_0x0084=Nokia N85 0x0001_0x00c2=Nokia 3720 Classic 0x0001_0x00e7=Nokia 5230 0x0001_0x00ff=Nokia E7 0x0001_0x0191=Nokia 2323 # Questionable devices # # The following all have 0x0000 as product ids. The Android devices # all seem to do this. # # SyncML support: False # Source: 0x0002 # Vendor: 0x000a=LG # product: 0x0000=P990 # # SyncML support: False # Source: 0x0001 # Vendor: 0x000f=HTC # product: 0x0000=Desire HD # # SyncML support: True # Source: 0x0002 # Vendor: 0x000a=Samsung # product: 0x0000=Nexus S # # Devices known to not support the Bluetooth Device ID profile # # Nokia N95 # Nokia N900 # Nokia E71 # Nokia N950 # Siemens S55 syncevolution-1.5/src/dbus/server/server.am0000664000373300001540000001756112424466461022422 0ustar00nightlynightly00000000000000EXTRA_DIST += \ src/dbus/server/pim/README \ src/dbus/server/pim/pim-manager-api.txt \ src/dbus/server/pim/examples/search.py \ src/dbus/server/pim/examples/sync.py \ src/dbus/server/pim/testpim.py \ src/dbus/server/pim/test-dbus/db-active/config/syncevolution/pim-manager.ini \ src/dbus/server/pim/test-dbus/simple-sort/config/syncevolution/pim-manager.ini \ src/dbus/server/pim/test-dbus/first-last-sort/config/syncevolution/pim-manager.ini if COND_DBUS noinst_LTLIBRARIES += src/dbus/server/libsyncevodbusserver.la src_dbus_server_server_cpp_files = \ src/dbus/server/notification-backend-noop.cpp \ src/dbus/server/notification-backend-libnotify.cpp \ src/dbus/server/notification-backend-mlite.cpp \ src/dbus/server/notification-manager-factory.cpp \ src/dbus/server/auto-sync-manager.cpp \ src/dbus/server/bluez-manager.cpp \ src/dbus/server/client.cpp \ src/dbus/server/connection.cpp \ src/dbus/server/connman-client.cpp \ src/dbus/server/dbus-callbacks.cpp \ src/dbus/server/dbus-user-interface.cpp \ src/dbus/server/exceptions.cpp \ src/dbus/server/localed-listener.cpp \ src/dbus/server/info-req.cpp \ src/dbus/server/network-manager-client.cpp \ src/dbus/server/presence-status.cpp \ src/dbus/server/progress-data.cpp \ src/dbus/server/read-operations.cpp \ src/dbus/server/server.cpp \ src/dbus/server/session.cpp src_dbus_server_server_h_files = \ $(src_dbus_server_server_cpp_files:.cpp=.h) \ src/dbus/server/notification-backend-base.h \ src/dbus/server/notification-manager.h \ src/dbus/server/notification-manager-base.h \ src/dbus/server/auto-term.h \ src/dbus/server/cmdline-wrapper.h \ src/dbus/server/resource.h \ src/dbus/server/restart.h \ src/dbus/server/session-common.h \ src/dbus/server/source-progress.h \ src/dbus/server/source-status.h \ src/dbus/server/timeout.h \ src/dbus/server/timer.h src_dbus_server_libsyncevodbusserver_la_SOURCES = \ $(src_dbus_server_server_h_files) \ $(src_dbus_server_server_cpp_files) \ src/dbus/server/main.cpp nodist_src_dbus_server_libsyncevodbusserver_la_SOURCES = dist_pkgdata_DATA += src/dbus/server/bluetooth_products.ini src_dbus_server_libsyncevodbusserver_la_LDFLAGS = src_dbus_server_libsyncevodbusserver_la_LIBADD = $(LIBNOTIFY_LIBS) $(MLITE_LIBS) $(DBUS_LIBS) $(PCRECPP_LIBS) $(ICU_LIBS) src_dbus_server_libsyncevodbusserver_la_CPPFLAGS = -DHAVE_CONFIG_H -DSYNCEVOLUTION_LOCALEDIR=\"${SYNCEVOLUTION_LOCALEDIR}\" -I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir) -I$(gdbus_dir) $(BACKEND_CPPFLAGS) src_dbus_server_libsyncevodbusserver_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(SYNTHESIS_CFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(LIBNOTIFY_CFLAGS) $(MLITE_CFLAGS) $(SYNCEVO_WFLAGS) $(ICU_CFLAGS) if COND_DBUS_PIM src_dbus_server_server_cpp_files += \ src/dbus/server/pim/view.cpp \ src/dbus/server/pim/full-view.cpp \ src/dbus/server/pim/filtered-view.cpp \ src/dbus/server/pim/edsf-view.cpp \ src/dbus/server/pim/locale-factory.cpp \ src/dbus/server/pim/merge-view.cpp \ src/dbus/server/pim/individual-traits.cpp \ src/dbus/server/pim/folks.cpp \ src/dbus/server/pim/manager.cpp src_dbus_server_server_h_files += \ src/dbus/server/pim/persona-details.h nodist_src_dbus_server_libsyncevodbusserver_la_SOURCES += \ src/dbus/server/pim/locale-factory-@DBUS_PIM_PLUGIN@.cpp src_dbus_server_libsyncevodbusserver_la_LDFLAGS += $(DBUS_PIM_PLUGIN_LDFLAGS) src_dbus_server_libsyncevodbusserver_la_LIBADD += $(FOLKS_LIBS) $(DBUS_PIM_PLUGIN_LIBS) $(PHONENUMBERS_LIBS) src_dbus_server_libsyncevodbusserver_la_CXXFLAGS += $(FOLKS_CFLAGS) $(DBUS_PIM_PLUGIN_CFLAGS) $(PHONENUMBERS_CFLAGS) $(DLT_CFLAGS) endif # Need to list all plugins here and not include the active one in the regular # source list above, because "make dist" would only include the configured one. EXTRA_DIST += \ src/dbus/server/pim/locale-factory-boost.cpp # Session helper: syncevo-dbus-helper noinst_LTLIBRARIES += src/dbus/server/libsyncevodbushelper.la src_dbus_server_dbus_helper_cpp_files = \ src/dbus/server/dbus-callbacks.cpp \ src/dbus/server/dbus-sync.cpp \ src/dbus/server/dbus-transport-agent.cpp \ src/dbus/server/session-helper.cpp src_dbus_server_dbus_helper_h_files = \ $(src_dbus_server_dbus_helper_cpp_files:.cpp=.h) \ src/dbus/server/cmdline-wrapper.h src_dbus_server_libsyncevodbushelper_la_SOURCES = \ $(src_dbus_server_dbus_helper_h_files) \ $(src_dbus_server_dbus_helper_cpp_files) \ src/dbus/server/session-common.h \ src/dbus/server/sync-helper.cpp src_dbus_server_libsyncevodbushelper_la_LIBADD = $(DBUS_LIBS) src_dbus_server_libsyncevodbushelper_la_CPPFLAGS = -DHAVE_CONFIG_H -DSYNCEVOLUTION_LOCALEDIR=\"${SYNCEVOLUTION_LOCALEDIR}\" -I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir) -I$(gdbus_dir) $(BACKEND_CPPFLAGS) src_dbus_server_libsyncevodbushelper_la_CXXFLAGS = $(SYNCEVOLUTION_CXXFLAGS) $(CORE_CXXFLAGS) $(SYNTHESIS_CFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(SYNCEVO_WFLAGS) # Deal with .service, .desktop and startup script files. CLEANFILES += \ $(src_dbus_server_service_files) \ $(src_dbus_server_desktop) \ $(src_dbus_server_script) src_dbus_server_script_in = src/dbus/server/syncevo-dbus-server-startup.sh.in src_dbus_server_script = $(src_dbus_server_script_in:.sh.in=.sh) src_dbus_server_desktop_in = src/dbus/server/syncevo-dbus-server.desktop.in src_dbus_server_desktop = $(src_dbus_server_desktop_in:.desktop.in=.desktop) src_dbus_server_autostartdir = $(sysconfdir)/xdg/autostart src_dbus_server_autostart_DATA = $(src_dbus_server_desktop) libexec_SCRIPTS += $(src_dbus_server_script) $(src_dbus_server_script): $(src_dbus_server_script_in) @sed -e "s|\@libexecdir\@|$(libexecdir)|" -e "s|\@SYNCEVO_DBUS_SERVER_ARGS\@|$(SYNCEVO_DBUS_SERVER_ARGS)|" $< >$@ $(src_dbus_server_desktop): $(src_dbus_server_desktop_in) @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< >$@ src_dbus_server_service_files_in = src/dbus/server/org.syncevolution.service.in src_dbus_server_service_files = $(src_dbus_server_service_files_in:.service.in=.service) src_dbus_server_servicedir = $(DBUS_SERVICES_DIR) src_dbus_server_service_DATA = $(src_dbus_server_service_files) src/dbus/server/%.service: src/dbus/server/%.service.in @sed -e "s|\@libexecdir\@|$(libexecdir)|" -e "s|\@SYNCEVO_DBUS_SERVER_ARGS\@|$(SYNCEVO_DBUS_SERVER_ARGS)|" $< >$@ if COND_DBUS_PIM src_dbus_server_service_files_in += \ src/dbus/server/pim/org._01.pim.contacts.service.in test_SCRIPTS += \ src/dbus/server/pim/examples/search.py \ src/dbus/server/pim/examples/sync.py \ $(NOP) if ENABLE_TESTING test_SCRIPTS += \ src/dbus/server/pim/testpim.py \ $(NOP) # It would be nice if we could use the nobase_ prefix here, but we # can't because we want to replace parts of the path. Instead we have # to spell out the desired install dir completely for each file. src_dbus_server_testdbusdir = $(testdir)/test-dbus src_dbus_server_testdbus_broken_configdir = $(src_dbus_server_testdbusdir)/broken-config/config/syncevolution src_dbus_server_testdbus_broken_config_DATA = src/dbus/server/pim/test-dbus/broken-config/config/syncevolution/pim-manager.ini src_dbus_server_testdbus_db_activedir = $(src_dbus_server_testdbusdir)/db-active/config/syncevolution src_dbus_server_testdbus_db_active_DATA = src/dbus/server/pim/test-dbus/db-active/config/syncevolution/pim-manager.ini src_dbus_server_testdbus_first_last_sortdir = $(src_dbus_server_testdbusdir)/first-last-sort/config/syncevolution src_dbus_server_testdbus_first_last_sort_DATA = src/dbus/server/pim/test-dbus/first-last-sort/config/syncevolution/pim-manager.ini src_dbus_server_testdbus_simple_sortdir = $(src_dbus_server_testdbusdir)/simple-sort/config/syncevolution src_dbus_server_testdbus_simple_sort_DATA = src/dbus/server/pim/test-dbus/simple-sort/config/syncevolution/pim-manager.ini endif # ENABLE_TESTING endif # COND_DBUS_PIM dist_noinst_DATA += \ $(src_dbus_server_service_files_in) \ $(src_dbus_server_script_in) \ $(src_dbus_server_desktop_in) endif syncevolution-1.5/src/dbus/server/dbus-callbacks.h0000644000373300001540000001624212326412403023575 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_DBUS_CALLBACKS #define INCL_DBUS_CALLBACKS #include #include #include #include #include #include SE_BEGIN_CXX /** * Any method inside syncevo-dbus-server which might block for * extended periods of time must be asynchronous. It has to alert the * caller of success (with a custom callback) or failure (with the * ErrorCb_t callback) once it is done with executing the triggered * operation. * * The error callback is invoked inside an exception handler. The * callback then needs to rethrow the exection to determine what the * real error is and react accordingly. A default error callback which * relays the error back to the D-Bus caller is provided below * (dbusErrorCallback(), used by createDBusErrorCb()). * * Asynchronous functions have to take care that exactly those * exceptions which indicate a failure of the requested operation * invoke the error callback. There might be other exceptions, usually * related to fatal problems in the process itself. * * The caller of an asynchronous method doesn't have to (and in fact, * shouldn't!) catch these exceptions and leave handling of them to * the top-level catch clauses. In return it may assume that the error * callback is invoked only in relation to the requested operation and * that the server is able to continue to run. * Only one of these two callbacks gets invoked, and only once. Empty * callbacks are allowed. * * It is the responsibility of the caller to ensure that any objects * bound to the callback are still around when the callback gets * invoked. One simple way of doing that is via BoostHelper.h and * binding to a boost::weak_ptr that tracks the instance to which * the callback belongs. * * The recommended naming is to use the "Async" suffix in the function * name and a "const SimpleResult &result" as last parameter. Example: * * void killSessionsAsync(const std::string &peerDeviceID, * const SimpleResult &result); * * Some asynchronous methods might also take a D-Bus result pointer * plus a success callback, then deal with errors internally by * relaying them to the D-Bus client. Example: * * void runOperationAsync(RunOperation op, * const boost::shared_ptr &dbusResult, * const SuccessCb_t &helperReady) * ... * useHelperAsync(SimpleResult(helperReady, * boost::bind(&Session::failureCb, this))); * * Session::failureCb() in this example then does some work on its own * and finally calls dbusErrorCallback(dbusResult). */ typedef boost::function ErrorCb_t; /** * Because callbacks always come in pairs, the following * utility class is usually used in asynchronous * calls. It's parameterized with the prototype of * the success call. */ template class Result { boost::function

m_onSuccess; ErrorCb_t m_onError; public: Result(const boost::function

&onSuccess, const ErrorCb_t &onError) : m_onSuccess(onSuccess), m_onError(onError) {} boost::function

getOnSuccess() const { return m_onSuccess; } ErrorCb_t getOnError() const { return m_onError; } void done() const { if (m_onSuccess) m_onSuccess(); } template void done(const A1 &a1) const { if (m_onSuccess) m_onSuccess(a1); } template void done(const A1 &a1, const A2 &a2) const { if (m_onSuccess) m_onSuccess(a1, a2); } template void done(const A1 &a1, const A2 &a2, const A3 &a3) const { if (m_onSuccess) m_onSuccess(a1, a2, a3); } void failed() const { if (m_onError) m_onError(); } }; /** * Convenience function for creating a ResultCb for a pair of success * and failure callbacks. Determines type automatically based on type * of success callback. */ template Result

makeCb(const boost::function

&onSuccess, const ErrorCb_t &onFailure) { return Result

(onSuccess, onFailure); } /** * Implements the error callback, can also be called directly inside a * catch clause as a general utility function in other error callbacks. * * @param result failed() is called here * @return status code (see SyncML.h) */ uint32_t dbusErrorCallback(const boost::shared_ptr &result); /** * Creates an error callback which can be used to return a pending * exception as a D-Bus error. Template call which is parameterized * with the GDBusCXX::Result* class that takes the error. */ ErrorCb_t createDBusErrorCb(const boost::shared_ptr &result); /** * Creates a result object which passes back results and turns * exceptions into dbus_error instances with the given interface * name. * TODO: interface name */ template Result createDBusCb(const boost::shared_ptr< GDBusCXX::Result1 > &result) { return Result(boost::bind(&GDBusCXX::Result1::done, result, _1), createDBusErrorCb(result)); } /** * Creates a result object which passes back zero results and turns * exceptions into dbus_error instances with the given interface name. * TODO: interface name */ static inline Result createDBusCb(const boost::shared_ptr< GDBusCXX::Result0 > &result) { return Result(boost::bind(&GDBusCXX::Result0::done, result), createDBusErrorCb(result)); } /** * a generic "operation successful" callback with no parameters */ typedef boost::function SuccessCb_t; /** * A generic "operation completed/failed" result pair (no parameters * for completion). Same as Result, but because it doesn't * have overloaded done() template methods the done method can be used * in boost::bind(). */ class SimpleResult { public: SuccessCb_t m_onSuccess; ErrorCb_t m_onError; public: SimpleResult(const SuccessCb_t &onSuccess, const ErrorCb_t &onError) : m_onSuccess(onSuccess), m_onError(onError) {} void done() const { if (m_onSuccess) m_onSuccess(); } void failed() const { if (m_onError) m_onError(); } }; SE_END_CXX #endif // INCL_DBUS_CALLBACKS syncevolution-1.5/src/dbus/server/dbus-sync.h0000644000373300001540000000642712326412403022636 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef DBUS_SYNC_H #define DBUS_SYNC_H #include "session-common.h" #include #include #include #include #include SE_BEGIN_CXX class SessionHelper; namespace SessionCommon { struct SyncParams; } /** * Maps sync events to D-Bus signals in SessionHelper. * Does password requests by sending out a request for * them via SessionHelper and waiting until a reply (positive * or negative) is received. */ class DBusSync : public SyncContext, private UserInterface { SessionHelper &m_helper; SessionCommon::SyncParams m_params; bool m_waiting; boost::function m_passwordSuccess; boost::function m_passwordFailure; std::string m_passwordDescr; boost::signals2::connection m_parentWatch; boost::signals2::connection m_suspendFlagsWatch; void suspendFlagsChanged(SuspendFlags &flags); public: DBusSync(const SessionCommon::SyncParams ¶ms, SessionHelper &helper); ~DBusSync(); /** to be called by SessionHelper when it gets a response via D-Bus */ void passwordResponse(bool timedOut, bool aborted, const std::string &password); protected: virtual boost::shared_ptr createTransportAgent(); virtual void displaySyncProgress(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3); virtual bool displaySourceProgress(SyncSource &source, const SyncSourceEvent &event, bool flush); virtual void reportStepCmd(sysync::uInt16 stepCmd); virtual void syncSuccessStart(); string askPassword(const string &passwordName, const string &descr, const ConfigPasswordKey &key); virtual void askPasswordAsync(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, const boost::function &success, const boost::function &failureException); virtual bool savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key); virtual void readStdin(std::string &content); }; SE_END_CXX #endif // DBUS_SYNC_H syncevolution-1.5/src/dbus/server/dbus-transport-agent.h0000644000373300001540000000555412326412403025012 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef DBUS_TRANSPORT_AGENT_H #define DBUS_TRANSPORT_AGENT_H #include #include #include #include #include #include "session-common.h" SE_BEGIN_CXX class Connection; class SessionHelper; /** * A proxy for a Connection instance in the syncevo-dbus-server. The * Connection instance can go away (weak pointer, must be locked and * and checked each time it is needed). The agent must remain * available as long as the engine needs and basically becomes * unusuable once the connection dies. That information is relayed * to it via the D-Bus API. * * Reconnecting is not currently supported. */ class DBusTransportAgent : public TransportAgent { SessionHelper &m_helper; /** information about outgoing message, provided by user of this instance */ std::string m_url; std::string m_type; /** latest message sent to us */ SharedBuffer m_incomingMsg; std::string m_incomingMsgType; /** explanation for problem, sent to us by syncevo-dbus-server */ std::string m_error; /** * Current state. Changed by us as messages are sent and received * and by syncevo-dbus-server: * - connectionState with error -> failed * - connectionState without error -> closed */ SessionCommon::ConnectionState m_state; void doWait(); public: DBusTransportAgent(SessionHelper &helper); void serverAlerted(); void storeMessage(const GDBusCXX::DBusArray &buffer, const std::string &type); void storeState(const std::string &error); virtual void setURL(const std::string &url) { m_url = url; } virtual void setContentType(const std::string &type) { m_type = type; } virtual void send(const char *data, size_t len); virtual void cancel() {} virtual void shutdown(); virtual Status wait(bool noReply = false); virtual void setTimeout(int seconds) {} virtual void getReply(const char *&data, size_t &len, std::string &contentType); }; SE_END_CXX #endif // DBUS_TRANSPORT_AGENT_H syncevolution-1.5/src/dbus/server/session-helper.h0000644000373300001540000001351112326412403023657 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SESSION_HELPER_H #define SESSION_HELPER_H #include "session-common.h" #include "dbus-sync.h" #include #include #include #include #include SE_BEGIN_CXX class LogRedirect; class ForkExecChild; class SessionHelperLogger; /** * Waits for requests via the internal D-Bus connection in run(), sent * by the Session class in syncevo-dbus-server. Then for each request * it remembers what to do in m_operation and returns from the event * loop and executes the requested operation, pretty much like the * traditional syncevo-dbus-server did. */ class SessionHelper : public GDBusCXX::DBusObjectHelper, private boost::noncopyable { GMainLoop *m_loop; GDBusCXX::DBusConnectionPtr m_conn; boost::shared_ptr m_forkexec; boost::function m_operation; boost::shared_ptr m_logger; PushLogger m_pushLogger; /** valid during doSync() */ boost::scoped_ptr m_sync; /** called by main event loop: initiate a sync operation */ void sync(const SessionCommon::SyncParams ¶ms, const boost::shared_ptr< GDBusCXX::Result2 > &result); /** * called by run(): do the sync operation * @return true if the helper is meant to terminate */ bool doSync(const SessionCommon::SyncParams ¶ms, const boost::shared_ptr< GDBusCXX::Result2 > &result); void restore(const std::string &configName, const string &dir, bool before, const std::vector &sources, const boost::shared_ptr< GDBusCXX::Result1 > &result); bool doRestore(const std::string &configName, const string &dir, bool before, const std::vector &sources, const boost::shared_ptr< GDBusCXX::Result1 > &result); void execute(const vector &args, const map &vars, const boost::shared_ptr< GDBusCXX::Result1 > &result); bool doExecute(const vector &args, const map &vars, const boost::shared_ptr< GDBusCXX::Result1 > &result); /** SessionHelper.PasswordResponse */ void passwordResponse(bool timedOut, bool aborted, const std::string &password); /** SessionHelper.SetFreeze */ bool setFreeze(bool frozen); public: SessionHelper(GMainLoop *loop, const GDBusCXX::DBusConnectionPtr &conn, const boost::shared_ptr &forkexec); ~SessionHelper(); void setDBusLogLevel(Logger::Level level); Logger::Level getDBusLogLevel() const; void activate(); void run(); GMainLoop *getLoop() const { return m_loop; } /** Still have connection to parent. Shortcut which asks the ForkExecChild class. */ bool connected(); boost::shared_ptr getForkExecChild() { return m_forkexec; } /** Server.LogOutput for the session D-Bus object */ GDBusCXX::EmitSignal3 emitLogOutput; /** SyncContext::displaySyncProgress */ GDBusCXX::EmitSignal4 emitSyncProgress; /** SyncContext::displaySourceProgress */ GDBusCXX::EmitSignal6 emitSourceProgress; /** SyncContext::m_sourceSyncedSignal */ GDBusCXX::EmitSignal2 emitSourceSynced; /** SyncContext::reportStepCmd -> true/false for "waiting on IO" */ GDBusCXX::EmitSignal1 emitWaiting; /** SyncContext::syncSuccessStart */ GDBusCXX::EmitSignal0Template emitSyncSuccessStart; /** Cmdline::configWasModified() */ GDBusCXX::EmitSignal0Template emitConfigChanged; /** SyncContext::askPassword */ GDBusCXX::EmitSignal2 emitPasswordRequest; /** send message to parent's connection (buffer, type, url) */ GDBusCXX::EmitSignal3, std::string, std::string> emitMessage; /** tell parent's connection to shut down */ GDBusCXX::EmitSignal0Template emitShutdown; /** store the next message received by the session's connection */ void storeMessage(const GDBusCXX::DBusArray &message, const std::string &type) { m_messageSignal(message, type); } typedef boost::signals2::signal &, const std::string &)> MessageSignal_t; MessageSignal_t m_messageSignal; /** store the latest connection state information */ void connectionState(const std::string &error) { m_connectionStateSignal(error); } typedef boost::signals2::signal ConnectionStateSignal_t; ConnectionStateSignal_t m_connectionStateSignal; }; SE_END_CXX #endif // SESSION_HELPER_H syncevolution-1.5/src/dbus/server/cmdline-wrapper.h0000644000373300001540000000421712326412403024013 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef CMD_LINE_WRAPPER_H #define CMD_LINE_WRAPPER_H #include #include "dbus-sync.h" #include "exceptions.h" #include "session-helper.h" SE_BEGIN_CXX /** * A wrapper to maintain the execution of command line arguments from * dbus clients. It creates the DBusSync instance when required and * sets up the same environment as in the D-Bus client. */ class CmdlineWrapper : public Cmdline { virtual SyncContext* createSyncClient() { SessionCommon::SyncParams params; params.m_config = getConfigName(); return new DBusSync(params, m_helper); } SessionHelper &m_helper; /** environment variables passed from client */ map m_envVars; public: CmdlineWrapper(SessionHelper &helper, const vector &args, const map &vars) : Cmdline(args), m_helper(helper), m_envVars(vars) {} bool run() { //temporarily set environment variables and restore them after running list > changes; BOOST_FOREACH(const StringPair &var, m_envVars) { changes.push_back(boost::shared_ptr(new ScopedEnvChange(var.first, var.second))); } bool success = Cmdline::run(); return success; } }; SE_END_CXX #endif // CMD_LINE_WRAPPER_H syncevolution-1.5/src/dbus/server/dbus-callbacks.cpp0000644000373300001540000000401612326412403024124 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "dbus-callbacks.h" #include "session-common.h" #include #include SE_BEGIN_CXX uint32_t dbusErrorCallback(const boost::shared_ptr &result) { try { // If there is no pending exception, the process will abort // with "terminate called without an active exception"; // dbusErrorCallback() should only be called when there is // a pending exception. // TODO: catch this misuse in a better way throw; } catch (...) { // let D-Bus parent log the error std::string explanation; uint32_t error = Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); try { result->failed(GDBusCXX::dbus_error(SessionCommon::SERVER_IFACE, explanation)); } catch (...) { // Ignore failures while sending the reply. This can // happen when our caller dropped the connection before we // could reply. Exception::handle(HANDLE_EXCEPTION_NO_ERROR); } return error; } // keep compiler happy return 500; } ErrorCb_t createDBusErrorCb(const boost::shared_ptr &result) { return boost::bind(dbusErrorCallback, result); } SE_END_CXX syncevolution-1.5/src/dbus/server/dbus-sync.cpp0000664000373300001540000003160412363672170023200 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "dbus-sync.h" #include "session-helper.h" #include "dbus-transport-agent.h" #include #include #include SE_BEGIN_CXX DBusSync::DBusSync(const SessionCommon::SyncParams ¶ms, SessionHelper &helper) : SyncContext(params.m_config, true), m_helper(helper), m_params(params), m_waiting(false) { setUserInterface(this); setServerAlerted(params.m_serverAlerted); if (params.m_serverMode) { initServer(params.m_sessionID, params.m_initialMessage, params.m_initialMessageType); } if (params.m_remoteInitiated) { setRemoteInitiated(true); } // Watch status of parent and our own process and cancel // any pending password request if parent or we go down. boost::shared_ptr forkexec = m_helper.getForkExecChild(); if (forkexec) { m_parentWatch = forkexec->m_onQuit.connect(boost::bind(&DBusSync::passwordResponse, this, true, false, "")); } m_suspendFlagsWatch = SuspendFlags::getSuspendFlags().m_stateChanged.connect(boost::bind(&DBusSync::suspendFlagsChanged, this, _1)); // Apply temporary config filters. The parameters of this function // override the source filters, if set. setConfigFilter(true, "", params.m_syncFilter); FilterConfigNode::ConfigFilter filter; filter = params.m_sourceFilter; if (!params.m_mode.empty()) { if (params.m_mode == "ephemeral") { makeEphemeral(); } else if (params.m_mode == "pbap") { // "pbap" may only be used by caller when it knows that // the mode is safe to use. makeEphemeral(); const char *sync = getenv("SYNCEVOLUTION_PBAP_SYNC"); if (!sync) { SE_LOG_DEBUG(NULL, "enabling default SYNCEVOLUTION_PBAP_SYNC=incremental"); setenv("SYNCEVOLUTION_PBAP_SYNC", "incremental", true); } else { SE_LOG_DEBUG(NULL, "using SYNCEVOLUTION_PBAP_SYNC=%s from environment", sync); } } else { filter["sync"] = params.m_mode; } } setConfigFilter(false, "", filter); BOOST_FOREACH(const std::string &source, getSyncSources()) { SessionCommon::SourceFilters_t::const_iterator fit = params.m_sourceFilters.find(source); filter = fit == params.m_sourceFilters.end() ? FilterConfigNode::ConfigFilter() : fit->second; SessionCommon::SourceModes_t::const_iterator it = params.m_sourceModes.find(source); if (it != params.m_sourceModes.end()) { filter["sync"] = it->second; } setConfigFilter(false, source, filter); } // Create source status and progress entries for each source in // the parent. See Session::sourceProgress(). BOOST_FOREACH(const std::string source, getSyncSources()) { m_helper.emitSourceProgress(sysync::PEV_PREPARING, source, SYNC_NONE, 0, 0, 0); } // Forward the SourceSyncedSignal via D-Bus. m_sourceSyncedSignal.connect(boost::bind(m_helper.emitSourceSynced, _1, _2)); } DBusSync::~DBusSync() { m_parentWatch.disconnect(); m_suspendFlagsWatch.disconnect(); } boost::shared_ptr DBusSync::createTransportAgent() { if (m_params.m_serverAlerted || m_params.m_serverMode) { // Use the D-Bus Connection to send and receive messages. boost::shared_ptr agent(new DBusTransportAgent(m_helper)); // Hook up agent with D-Bus in the helper. The agent may go // away at any time, so use instance tracking. m_helper.m_messageSignal.connect(SessionHelper::MessageSignal_t::slot_type(&DBusTransportAgent::storeMessage, agent.get(), _1, _2).track(agent)); m_helper.m_connectionStateSignal.connect(SessionHelper::ConnectionStateSignal_t::slot_type(&DBusTransportAgent::storeState, agent.get(), _1).track(agent)); if (m_params.m_serverAlerted) { // A SAN message was sent to us, need to reply. agent->serverAlerted(); } else if (m_params.m_serverMode) { // Let transport return initial message to engine. agent->storeMessage(GDBusCXX::DBusArray(m_params.m_initialMessage.size(), reinterpret_cast(m_params.m_initialMessage.get())), m_params.m_initialMessageType); } return agent; } else { // no connection, use HTTP via libsoup/GMainLoop GMainLoop *loop = m_helper.getLoop(); boost::shared_ptr agent = SyncContext::createTransportAgent(loop); return agent; } } void DBusSync::displaySyncProgress(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3) { SyncContext::displaySyncProgress(type, extra1, extra2, extra3); m_helper.emitSyncProgress(type, extra1, extra2, extra3); } bool DBusSync::displaySourceProgress(SyncSource &source, const SyncSourceEvent &event, bool flush) { bool cached = SyncContext::displaySourceProgress(source, event, flush); if (!cached) { // Tell parent about current source statistics directly before // PEV_ITEMRECEIVED. The PIM Manager relies on that extra // information. if (event.m_type == sysync::PEV_ITEMRECEIVED) { m_helper.emitSourceProgress(sysync::PEV_ITEMPROCESSED, source.getName(), source.getFinalSyncMode(), source.getAdded(), source.getUpdated(), source.getDeleted()); } m_helper.emitSourceProgress(event.m_type, source.getName(), source.getFinalSyncMode(), event.m_extra1, event.m_extra2, event.m_extra3); } return cached; } void DBusSync::reportStepCmd(sysync::uInt16 stepCmd) { switch(stepCmd) { case sysync::STEPCMD_SENDDATA: case sysync::STEPCMD_RESENDDATA: case sysync::STEPCMD_NEEDDATA: // sending or waiting if (!m_waiting) { m_helper.emitWaiting(true); m_waiting = true; } break; default: // otherwise, processing if (m_waiting) { m_helper.emitWaiting(false); m_waiting = false; } break; } } void DBusSync::syncSuccessStart() { m_helper.emitSyncSuccessStart(); } string DBusSync::askPassword(const string &passwordName, const string &descr, const ConfigPasswordKey &key) { std::string password; std::string error; askPasswordAsync(passwordName, descr, key, boost::bind(static_cast(&std::string::assign), &password, _1), boost::bind(static_cast(&Exception::handle), boost::ref(error), HANDLE_EXCEPTION_NO_ERROR)); // We know that askPasswordAsync() is done when it cleared the // callback functors. while (m_passwordSuccess) { g_main_context_iteration(NULL, true); } if (!error.empty()) { Exception::tryRethrow(error); SE_THROW(StringPrintf("password request failed: %s", error.c_str())); } return password; } void DBusSync::askPasswordAsync(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, const boost::function &success, const boost::function &failureException) { // cannot handle more than one password request at a time m_passwordSuccess.clear(); m_passwordFailure.clear(); m_passwordDescr = descr; InitStateString password; if (GetLoadPasswordSignal()(getKeyring(), passwordName, descr, key, password) && password.wasSet()) { // handled success(password); return; } try { SE_LOG_DEBUG(NULL, "asking parent for password"); m_passwordSuccess = success; m_passwordFailure = failureException; m_helper.emitPasswordRequest(descr, key); if (!m_helper.connected()) { SE_LOG_DEBUG(NULL, "password request failed, lost connection"); SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("Could not get the '%s' password from user, no connection to UI.", descr.c_str()), STATUS_PASSWORD_TIMEOUT); } if (SuspendFlags::getSuspendFlags().getState() != SuspendFlags::NORMAL) { SE_LOG_DEBUG(NULL, "password request failed, was asked to terminate"); SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("Could not get the '%s' password from user, was asked to shut down.", descr.c_str()), STATUS_PASSWORD_TIMEOUT); } } catch (...) { m_passwordSuccess.clear(); m_passwordFailure.clear(); failureException(); } } void DBusSync::passwordResponse(bool timedOut, bool aborted, const std::string &password) { boost::function success; boost::function failureException; std::swap(success, m_passwordSuccess); std::swap(failureException, m_passwordFailure); if (success && failureException) { SE_LOG_DEBUG(NULL, "password result: %s", timedOut ? "timeout or parent gone" : aborted ? "user abort" : password.empty() ? "empty password" : "valid password"); try { if (timedOut) { SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("Could not get the '%s' password from user.", m_passwordDescr.c_str()), STATUS_PASSWORD_TIMEOUT); } else if (aborted) { SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("User did not provide the '%s' password.", m_passwordDescr.c_str()), SyncMLStatus(sysync::LOCERR_USERABORT)); } else { success(password); } } catch (...) { failureException(); } } } void DBusSync::suspendFlagsChanged(SuspendFlags &flags) { if (flags.getState() != SuspendFlags::NORMAL) { passwordResponse(true, false, ""); } } bool DBusSync::savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { if (GetSavePasswordSignal()(getKeyring(), passwordName, password, key)) { return true; } // not saved return false; } void DBusSync::readStdin(std::string &content) { // might get called, must be avoided by user SE_THROW("reading from stdin not supported when running with daemon, use --daemon=no"); } SE_END_CXX syncevolution-1.5/src/dbus/server/dbus-transport-agent.cpp0000644000373300001540000001431712326412403025342 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "dbus-transport-agent.h" #include "session-helper.h" SE_BEGIN_CXX DBusTransportAgent::DBusTransportAgent(SessionHelper &helper) : m_helper(helper), m_state(SessionCommon::SETUP) { } void DBusTransportAgent::serverAlerted() { SE_LOG_DEBUG(NULL, "D-Bus transport: server alerted (old state: %s, %s)", SessionCommon::ConnectionStateToString(m_state).c_str(), m_error.c_str()); if (m_state == SessionCommon::SETUP) { m_state = SessionCommon::PROCESSING; } else { SE_THROW_EXCEPTION(TransportException, "setting 'server alerted' only allowed during setup"); } } void DBusTransportAgent::storeMessage(const GDBusCXX::DBusArray &buffer, const std::string &type) { SE_LOG_DEBUG(NULL, "D-Bus transport: store incoming message, %ld bytes, %s (old state: %s, %s)", (long)buffer.first, type.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str(), m_error.c_str()); if (m_state == SessionCommon::SETUP || m_state == SessionCommon::WAITING) { m_incomingMsg = SharedBuffer(reinterpret_cast(buffer.second), buffer.first); m_incomingMsgType = type; m_state = SessionCommon::PROCESSING; } else if (m_state == SessionCommon::PROCESSING && m_incomingMsgType == type && m_incomingMsg.size() == buffer.first && !memcmp(m_incomingMsg.get(), buffer.second, buffer.first)) { // Exactly the same message, accept resend without error, and // without doing anything. } else { SE_THROW_EXCEPTION(TransportException, "unexpected message"); } } void DBusTransportAgent::storeState(const std::string &error) { SE_LOG_DEBUG(NULL, "D-Bus transport: got error '%s', current error is '%s', state %s", error.c_str(), m_error.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); if (!error.empty()) { // specific error encountered m_state = SessionCommon::FAILED; if (m_error.empty()) { m_error = error; } } else if (m_state == SessionCommon::FINAL) { // expected loss of connection m_state = SessionCommon::DONE; } else { // unexpected loss of connection m_state = SessionCommon::FAILED; } } void DBusTransportAgent::send(const char *data, size_t len) { SE_LOG_DEBUG(NULL, "D-Bus transport: outgoing message %ld bytes, %s, %s", (long)len, m_type.c_str(), m_url.c_str()); if (m_state != SessionCommon::PROCESSING) { SE_THROW_EXCEPTION(TransportException, "cannot send to our D-Bus peer"); } m_state = SessionCommon::WAITING; m_incomingMsg = SharedBuffer(); m_helper.emitMessage(GDBusCXX::DBusArray(len, reinterpret_cast(data)), m_type, m_url); } void DBusTransportAgent::shutdown() { SE_LOG_DEBUG(NULL, "D-Bus transport: shut down (old state: %s, %s)", SessionCommon::ConnectionStateToString(m_state).c_str(), m_error.c_str()); if (m_state == SessionCommon::PROCESSING) { m_state = SessionCommon::FINAL; m_helper.emitShutdown(); } } void DBusTransportAgent::doWait() { SE_LOG_DEBUG(NULL, "D-Bus transport: wait - old state: %s, %s", SessionCommon::ConnectionStateToString(m_state).c_str(), m_error.c_str()); if (SuspendFlags::getSuspendFlags().getState() == SuspendFlags::NORMAL) { // Block for one iteration. Both D-Bus calls and signals (thanks // to the SuspendFlags guard in the running sync session) will // wake us up. g_main_context_iteration(NULL, true); } SE_LOG_DEBUG(NULL, "D-Bus transport: wait - new state: %s, %s", SessionCommon::ConnectionStateToString(m_state).c_str(), m_error.c_str()); } DBusTransportAgent::Status DBusTransportAgent::wait(bool noReply) { switch (m_state) { case SessionCommon::PROCESSING: return GOT_REPLY; break; case SessionCommon::FINAL: doWait(); // if the connection is still available, then keep waiting if (m_state == SessionCommon::FINAL) { return ACTIVE; } else if (m_error.empty()) { return INACTIVE; } else { SE_THROW_EXCEPTION(TransportException, m_error); return FAILED; } break; case SessionCommon::WAITING: if (noReply) { // message is sent as far as we know, so return return INACTIVE; } doWait(); // tell caller to check again return ACTIVE; break; case SessionCommon::DONE: if (!noReply) { SE_THROW_EXCEPTION(TransportException, "internal error: transport has shut down, can no longer receive reply"); } return CLOSED; default: SE_THROW_EXCEPTION(TransportException, "send() on connection which is not ready"); break; } return FAILED; } void DBusTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType) { data = m_incomingMsg.get(); len = m_incomingMsg.size(); contentType = m_incomingMsgType; } SE_END_CXX syncevolution-1.5/src/dbus/server/session-helper.cpp0000664000373300001540000002704412405555067024236 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include "session-helper.h" #include "dbus-callbacks.h" #include "cmdline-wrapper.h" #include #include #include SE_BEGIN_CXX static void dumpString(const std::string &output) { fputs(output.c_str(), stdout); } /** * Same logging approach as in Server class: pretend that we * have reference counting for the SessionHelper class and * use mutex locking to prevent dangling pointers. */ class SessionHelperLogger : public Logger { Handle m_parentLogger; boost::shared_ptr m_helper; Level m_dbusLogLevel; public: SessionHelperLogger(const boost::shared_ptr &helper): m_parentLogger(Logger::instance()), m_helper(helper), m_dbusLogLevel(DEBUG) { } void setDBusLogLevel(Level level) { m_dbusLogLevel = level; } Level getDBusLogLevel() const { return m_dbusLogLevel; } virtual void remove() throw () { RecMutex::Guard guard = lock(); m_helper.reset(); } virtual void messagev(const MessageOptions &options, const char *format, va_list args) { RecMutex::Guard guard = lock(); static bool dbg = getenv("SYNCEVOLUTION_DEBUG"); if (dbg) { // Let parent LogRedirect or utility function handle the // output *in addition* to logging via D-Bus. That way // it'll be visible via our stdout/stderr (= console) // right away. // // In non-debug mode, nothing should get written to // stdout/stder, which got redirected into a pipe // read by our parend. In that mode, the parent will include // our output in its own output streams. va_list argsCopy; va_copy(argsCopy, args); if (m_parentLogger) { m_parentLogger.messagev(options, format, argsCopy); } else { formatLines(options.m_level, DEBUG, options.m_processName, options.m_prefix, format, argsCopy, boost::bind(dumpString, _1)); } va_end(argsCopy); } else if (m_parentLogger) { // Pass through to parent, but marked in such a way that // only the DLT and syslog logger will react to it, but // not LogStdout. That's necessary because // syncevo-dbus-server handles stdout for us. va_list argsCopy; va_copy(argsCopy, args); MessageOptions buffer(options); buffer.m_flags |= MessageOptions::ONLY_GLOBAL_LOG; m_parentLogger.messagev(buffer, format, argsCopy); va_end(argsCopy); } if (m_helper && options.m_level <= m_dbusLogLevel) { // send to parent string log = StringPrintfV(format, args); if (options.m_prefix) { std::string prefix = *options.m_prefix; prefix += ": "; boost::replace_all(log, "\n", prefix); log.insert(0, prefix); } string strLevel = Logger::levelToStr(options.m_level); try { m_helper->emitLogOutput(strLevel, log, options.m_processName ? *options.m_processName : getProcessName()); } catch (...) { // Give up forwarding output. m_helper.reset(); } } } }; SessionHelper::SessionHelper(GMainLoop *loop, const GDBusCXX::DBusConnectionPtr &conn, const boost::shared_ptr &forkexec) : GDBusCXX::DBusObjectHelper(conn, std::string(SessionCommon::HELPER_PATH) + "/" + forkexec->getInstance(), SessionCommon::HELPER_IFACE, GDBusCXX::DBusObjectHelper::Callback_t(), // we don't care about a callback per message true), // direct connection, close it when done m_loop(loop), m_conn(conn), m_forkexec(forkexec), m_logger(new SessionHelperLogger(boost::shared_ptr(this, NopDestructor()))), emitLogOutput(*this, "LogOutput"), emitSyncProgress(*this, "SyncProgress"), emitSourceProgress(*this, "SourceProgress"), emitSourceSynced(*this, "SourceSynced"), emitWaiting(*this, "Waiting"), emitSyncSuccessStart(*this, "SyncSuccessStart"), emitConfigChanged(*this, "ConfigChanged"), emitPasswordRequest(*this, "PasswordRequest"), emitMessage(*this, "Message"), emitShutdown(*this, "Shutdown") { add(this, &SessionHelper::sync, "Sync"); add(this, &SessionHelper::restore, "Restore"); add(this, &SessionHelper::execute, "Execute"); add(this, &SessionHelper::setFreeze, "SetFreeze"); add(this, &SessionHelper::passwordResponse, "PasswordResponse"); add(this, &SessionHelper::storeMessage, "StoreMessage"); add(this, &SessionHelper::connectionState, "ConnectionState"); add(emitLogOutput); add(emitSyncProgress); add(emitSourceProgress); add(emitSourceSynced); add(emitWaiting); add(emitSyncSuccessStart); add(emitConfigChanged); add(emitPasswordRequest); add(emitMessage); add(emitShutdown); } void SessionHelper::setDBusLogLevel(Logger::Level level) { m_logger->setDBusLogLevel(level); } Logger::Level SessionHelper::getDBusLogLevel() const { return m_logger->getDBusLogLevel(); } void SessionHelper::activate() { GDBusCXX::DBusObjectHelper::activate(); m_pushLogger.reset(m_logger); } SessionHelper::~SessionHelper() { m_pushLogger.reset(); m_logger.reset(); } void SessionHelper::run() { SuspendFlags &s = SuspendFlags::getSuspendFlags(); while (true) { if (s.getState() != SuspendFlags::NORMAL) { SE_LOG_DEBUG(NULL, "terminating because of suspend or abort signal"); break; } if (m_operation && m_operation()) { SE_LOG_DEBUG(NULL, "terminating as requested by operation"); break; } g_main_loop_run(m_loop); } } bool SessionHelper::connected() { return m_forkexec && m_forkexec->getState() == ForkExecChild::CONNECTED; } void SessionHelper::sync(const SessionCommon::SyncParams ¶ms, const boost::shared_ptr< GDBusCXX::Result2 > &result) { m_operation = boost::bind(&SessionHelper::doSync, this, params, result); g_main_loop_quit(m_loop); } bool SessionHelper::doSync(const SessionCommon::SyncParams ¶ms, const boost::shared_ptr< GDBusCXX::Result2 > &result) { try { m_sync.reset(new DBusSync(params, *this)); SyncReport report; SyncMLStatus status = m_sync->sync(&report); if (status) { // Clear the abort signal, to allow the process to send // out the D-Bus response. Our parent will signal us again // after it received the response. // TODO SE_THROW_EXCEPTION_STATUS(StatusException, "sync failed", status); } result->done(true, report); } catch (...) { dbusErrorCallback(result); } m_sync.reset(); // quit helper return true; } void SessionHelper::restore(const std::string &configName, const string &dir, bool before, const std::vector &sources, const boost::shared_ptr< GDBusCXX::Result1 > &result) { m_operation = boost::bind(&SessionHelper::doRestore, this, configName, dir, before, sources, result); g_main_loop_quit(m_loop); } bool SessionHelper::doRestore(const std::string &configName, const string &dir, bool before, const std::vector &sources, const boost::shared_ptr< GDBusCXX::Result1 > &result) { try { SessionCommon::SyncParams params; params.m_config = configName; DBusSync sync(params, *this); if (!sources.empty()) { BOOST_FOREACH(const std::string &source, sources) { FilterConfigNode::ConfigFilter filter; filter["sync"] = InitStateString("two-way", true); sync.setConfigFilter(false, source, filter); } // disable other sources FilterConfigNode::ConfigFilter disabled; disabled["sync"] = InitStateString("disabled", true); sync.setConfigFilter(false, "", disabled); } sync.restore(dir, before ? SyncContext::DATABASE_BEFORE_SYNC : SyncContext::DATABASE_AFTER_SYNC); result->done(true); } catch (...) { dbusErrorCallback(result); } // quit helper return true; } void SessionHelper::execute(const vector &args, const map &vars, const boost::shared_ptr< GDBusCXX::Result1 > &result) { m_operation = boost::bind(&SessionHelper::doExecute, this, args, vars, result); g_main_loop_quit(m_loop); } bool SessionHelper::doExecute(const vector &args, const map &vars, const boost::shared_ptr< GDBusCXX::Result1 > &result) { try { CmdlineWrapper cmdline(*this, args, vars); if (!cmdline.parse()) { SE_THROW_EXCEPTION(DBusSyncException, "arguments parsing error"); } bool success = false; // a command line operation can be many things, tell parent SessionCommon::RunOperation op; op = cmdline.isSync() ? SessionCommon::OP_SYNC : cmdline.isRestore() ? SessionCommon::OP_RESTORE : SessionCommon::OP_CMDLINE; emitSyncProgress(sysync::PEV_CUSTOM_START, op, 0, 0); try { success = cmdline.run(); } catch (...) { if (cmdline.configWasModified()) { emitConfigChanged(); } throw; } if (cmdline.configWasModified()) { emitConfigChanged(); } result->done(success); } catch (...) { dbusErrorCallback(result); } // quit helper return true; } void SessionHelper::passwordResponse(bool timedOut, bool aborted, const std::string &password) { if (m_sync) { m_sync->passwordResponse(timedOut, aborted, password); } else { SE_LOG_DEBUG(NULL, "discarding obsolete password response"); } } bool SessionHelper::setFreeze(bool frozen) { return m_sync ? m_sync->setFreeze(frozen) : false; } SE_END_CXX syncevolution-1.5/src/dbus/server/session-common.h0000644000373300001540000002304012326412403023666 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SESSION_COMMON_H #define SESSION_COMMON_H #include "source-status.h" #include "source-progress.h" #include #include #include #include #include SE_BEGIN_CXX /** * This namespace holds constants and defines for Sessions and its * consumers. */ namespace SessionCommon { const char * const SERVICE_NAME = "org.syncevolution"; const char * const CONNECTION_PATH = "/org/syncevolution/Connection"; const char * const CONNECTION_IFACE = "org.syncevolution.Connection"; const char * const SESSION_PATH = "/org/syncevolution/Session"; const char * const SESSION_IFACE = "org.syncevolution.Session"; const char * const SERVER_PATH = "/org/syncevolution/Server"; const char * const SERVER_IFACE = "org.syncevolution.Server"; const char * const HELPER_PATH = "/dbushelper"; const char * const HELPER_IFACE = "org.syncevolution.Helper"; const char * const HELPER_DESTINATION = "direct.peer"; // doesn't matter, routing is off /** * The operation running inside the session. */ enum RunOperation { OP_SYNC, /**< running a sync */ OP_RESTORE, /**< restoring data */ OP_CMDLINE, /**< executing command line */ OP_NULL /**< idle, accepting commands via D-Bus */ }; inline std::string runOpToString(RunOperation op) { static const char * const strings[] = { "sync", "restore", "cmdline" }; return op >= OP_SYNC && op <= OP_CMDLINE ? strings[op] : ""; } /** * Used by both Connection class (inside server) and * DBusTransportAgent (inside helper). */ enum ConnectionState { SETUP, /**< ready for first message */ PROCESSING, /**< received message, waiting for engine's reply */ WAITING, /**< waiting for next follow-up message */ FINAL, /**< engine has sent final reply, wait for ACK by peer */ DONE, /**< peer has closed normally after the final reply */ FAILED /**< in a failed state, no further operation possible */ }; /** maps to names for debugging */ inline std::string ConnectionStateToString(ConnectionState state) { static const char * const strings[] = { "SETUP", "PROCESSING", "WAITING", "FINAL", "DONE", "FAILED" }; return state >= SETUP && state <= FAILED ? strings[state] : "???"; } typedef StringMap SourceModes_t; typedef std::map SourceFilters_t; /** * all the information that syncevo-dbus-server needs to * send to syncevo-dbus-helper before the latter can * run a sync */ struct SyncParams { SyncParams() : m_serverMode(false), m_serverAlerted(false), m_remoteInitiated(false) {} std::string m_config; std::string m_mode; SourceModes_t m_sourceModes; bool m_serverMode; bool m_serverAlerted; bool m_remoteInitiated; std::string m_sessionID; SharedBuffer m_initialMessage; std::string m_initialMessageType; SyncEvo::FilterConfigNode::ConfigFilter m_syncFilter; SyncEvo::FilterConfigNode::ConfigFilter m_sourceFilter; SourceFilters_t m_sourceFilters; }; } SE_END_CXX namespace GDBusCXX { using namespace SyncEvo::SessionCommon; using namespace SyncEvo; template<> struct dbus_traits : public dbus_struct_traits > > > > > > > > > > > > {}; /** * Similar to DBusArray, but with different native * types. Uses encoding/decoding from the base class, copies * to/from SharedBuffer as needed. * * DBusArray is more efficient because it avoids * copying the bytes from the D-Bus message when decoding, * but it is harder to use natively (cannot be copied). * SharedBuffer does ref counting for the memory chunk, * so once initialized, copying it is cheap. */ template <> struct dbus_traits : public dbus_traits< DBusArray > { typedef dbus_traits< DBusArray > base; typedef SharedBuffer host_type; typedef const SharedBuffer &arg_type; #ifdef GDBUS_CXX_GIO static void get(GDBusCXX::ExtractArgs &context, GDBusCXX::reader_type &iter, host_type &buffer) { base::host_type array; base::get(context, iter, array); buffer = SharedBuffer(reinterpret_cast(array.second), array.first); } #else static void get(GDBusCXX::connection_type *conn, GDBusCXX::message_type *msg, GDBusCXX::reader_type &iter, host_type &buffer) { base::host_type array; base::get(conn, msg, iter, array); buffer = SharedBuffer(reinterpret_cast(array.second), array.first); } #endif static void append(GDBusCXX::builder_type &builder, arg_type buffer) { base::host_type array(buffer.size(), reinterpret_cast(buffer.get())); base::append(builder, array); } }; template <> struct dbus_traits : public dbus_traits< std::string > { typedef dbus_traits< std::string > base; typedef SyncReport host_type; typedef const SyncReport &arg_type; #ifdef GDBUS_CXX_GIO static void get(GDBusCXX::ExtractArgs &context, GDBusCXX::reader_type &iter, host_type &report) { std::string dump; base::get(context, iter, dump); report = SyncReport(dump); } #else static void get(GDBusCXX::connection_type *conn, GDBusCXX::message_type *msg, GDBusCXX::reader_type &iter, host_type &report) { std::string dump; base::get(conn, msg, iter, dump); report = SyncReport(dump); } #endif static void append(GDBusCXX::builder_type &builder, arg_type report) { base::append(builder, report.toString()); } }; template <> struct dbus_traits : public dbus_traits< std::string > { typedef dbus_traits< std::string > base; typedef SyncSourceReport host_type; typedef const SyncSourceReport &arg_type; #ifdef GDBUS_CXX_GIO static void get(GDBusCXX::ExtractArgs &context, GDBusCXX::reader_type &iter, host_type &source) { std::string dump; base::get(context, iter, dump); SyncReport report = SyncReport(dump); const SyncSourceReport *foo = report.findSyncSourceReport("foo"); if (!foo) { SE_THROW("incomplete SyncReport"); } source = *foo; } #else static void get(GDBusCXX::connection_type *conn, GDBusCXX::message_type *msg, GDBusCXX::reader_type &iter, host_type &source) { std::string dump; base::get(conn, msg, iter, dump); SyncReport report = SyncReport(dump); const SyncSourceReport *foo = report.findSyncSourceReport("foo"); if (!foo) { SE_THROW("incomplete SyncReport"); } source = *foo; } #endif static void append(GDBusCXX::builder_type &builder, arg_type source) { SyncReport report; report.addSyncSourceReport("foo", source); base::append(builder, report.toString()); } }; } #endif // SESSION_COMMON_H syncevolution-1.5/src/dbus/server/sync-helper.cpp0000664000373300001540000002044012330727742023516 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "session-helper.h" #include #include #include #include #include #include using namespace SyncEvo; using namespace GDBusCXX; namespace { GMainLoop *loop = NULL; int logLevelDBus = Logger::INFO; // that one is actually never called. probably a bug in ForkExec - it should // call m_onFailure instead of throwing an exception void onFailure(const std::string &error, bool &failed) throw () { SE_LOG_DEBUG(NULL, "failure, quitting now: %s", error.c_str()); failed = true; } void onConnect(const DBusConnectionPtr &conn, const boost::shared_ptr &forkexec, boost::shared_ptr &helper) { helper.reset(new SessionHelper(loop, conn, forkexec)); helper->activate(); helper->setDBusLogLevel(Logger::Level(logLevelDBus)); } void onAbort() { g_main_loop_quit(loop); } } // anonymous namespace /** * This program is a helper of syncevo-dbus-server which provides the * Connection and Session DBus interfaces and runs individual sync * sessions. It is only intended to be started by syncevo-dbus-server, */ int main(int argc, char **argv, char **envp) { // delay the client for debugging purposes const char *delay = getenv("SYNCEVOLUTION_LOCAL_CHILD_DELAY"); if (delay) { Sleep(atoi(delay)); } if (getenv("SYNCEVOLUTION_DBUS_HELPER_VGDB")) { // Trigger an error in valgrind. Use in combination with // --vgdb-error=1 --vgdb=yes (note the =1!) to attach when // the process is running. void *dummy = malloc(1); free(dummy); // cppcheck-suppress deallocDealloc // cppcheck-suppress doubleFree // cppcheck-suppress uninitvar free(dummy); } SyncContext::initMain("syncevo-dbus-helper"); loop = g_main_loop_new(NULL, FALSE); // Suspend and abort are signaled via SIGINT/SIGTERM // respectively. SuspendFlags handle that for us. // SIGURG is used as acknowledgement from parent to us that we // can quite. SuspendFlags &s = SuspendFlags::getSuspendFlags(); s.setLevel(Logger::DEV); boost::shared_ptr guard = s.activate((1< redirect; PushLogger pushRedirect; if (!debug) { redirect.reset(new LogRedirect(LogRedirect::STDERR_AND_STDOUT)); pushRedirect.reset(redirect); } #ifdef USE_DLT // Set by syncevo-dbus-server for us. bool useDLT = getenv("SYNCEVOLUTION_USE_DLT") != NULL; PushLogger loggerdlt; if (useDLT) { loggerdlt.reset(new LoggerDLT(DLT_SYNCEVO_DBUS_HELPER_ID, "SyncEvolution local sync helper")); } #endif setvbuf(stderr, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); try { static GOptionEntry entries[] = { { "dbus-verbosity", 'v', 0, G_OPTION_ARG_INT, &logLevelDBus, "Choose amount of output via D-Bus signals with Logger::Level; default is INFO = 3.", "level" }, { NULL } }; GErrorCXX gerror; static GOptionContext *context = g_option_context_new("- SyncEvolution D-Bus Helper"); g_option_context_add_main_entries(context, entries, GETTEXT_PACKAGE); bool success = g_option_context_parse(context, &argc, &argv, gerror); if (!success) { gerror.throwError(SE_HERE, "parsing command line options"); } if (debug) { Logger::instance().setLevel(Logger::DEBUG); Logger::setProcessName(StringPrintf("syncevo-dbus-helper-%ld", (long)getpid())); } // syncevo-dbus-helper produces the output which is of most // interest to users, and therefore it is allowed to print // [INFO/ERROR/DEBUG] without including a process name in // the brackets, like the other processes do. // Logger::setProcessName("syncevo-dbus-helper"); boost::shared_ptr forkexec = ForkExecChild::create(); boost::shared_ptr helper; bool failed = false; forkexec->m_onConnect.connect(boost::bind(onConnect, _1, boost::cref(forkexec), boost::ref(helper))); forkexec->m_onFailure.connect(boost::bind(onFailure, _2, boost::ref(failed))); forkexec->connect(); // Run until we are connected, failed or get interrupted. boost::signals2::connection c = s.m_stateChanged.connect(boost::bind(&onAbort)); SE_LOG_DEBUG(NULL, "helper (pid %d) finished setup, waiting for parent connection", getpid()); while (true) { if (s.getState() != SuspendFlags::NORMAL) { // not an error, someone wanted us to stop SE_LOG_DEBUG(NULL, "aborted via signal while starting, terminating"); // tell caller that we aborted by terminating via the SIGTERM signal return 0; } if (failed) { SE_THROW("parent connection failed"); } if (helper) { // done break; } // wait g_main_loop_run(loop); } // Now we no longer care whether the parent connection fails. // TODO: What if the parent fails to call us and instead closes his // side of the connection? Will we notice and abort? c.disconnect(); SE_LOG_DEBUG(NULL, "connected to parent, run helper"); helper->run(); SE_LOG_DEBUG(NULL, "helper operation done"); helper.reset(); SE_LOG_DEBUG(NULL, "helper destroyed"); // Wait for confirmation from parent that we are allowed to // quit. This is necessary because we might have pending IO // for the parent, like D-Bus method replies. while (true) { if (s.getReceivedSignals() & (1<getState() != ForkExecChild::CONNECTED) { // No point running any longer, parent is gone. // // This can occur during normal operations, so don't // treat it as an error: // - we send final method response // - parent signals us and closes the connection // - our event loop processes these two events such // that we see the "not connected" one first SE_LOG_DEBUG(NULL, "parent has quit, terminating"); return 0; } g_main_context_iteration(NULL, true); } } catch ( const std::exception &ex ) { SE_LOG_ERROR(NULL, "helper quitting with exception: %s", ex.what()); } catch (...) { SE_LOG_ERROR(NULL, "helper quitting: unknown error"); } return 1; } syncevolution-1.5/src/dbus/server/notification-backend-noop.h0000644000373300001540000000246212326412403025746 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_BACKEND_NOOP_H #define __NOTIFICATION_BACKEND_NOOP_H #include "syncevo/declarations.h" #include "notification-backend-base.h" SE_BEGIN_CXX class NotificationBackendNoop : public NotificationBackendBase { public: NotificationBackendNoop(); virtual ~NotificationBackendNoop(); bool init(); void publish(const std::string& summary, const std::string& body, const std::string& viewParams = std::string()); }; SE_END_CXX #endif // __NOTIFICATION_BACKEND_NOOP_H syncevolution-1.5/src/dbus/server/notification-backend-libnotify.h0000644000373300001540000000402012326412403026762 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_BACKEND_LIBNOTIFY_H #define __NOTIFICATION_BACKEND_LIBNOTIFY_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #if HAS_NOTIFY #include "syncevo/declarations.h" #include "notification-backend-base.h" #include SE_BEGIN_CXX class NotificationBackendLibnotify : public NotificationBackendBase { public: NotificationBackendLibnotify(); virtual ~NotificationBackendLibnotify(); /** * Callback for the notification action. */ static void notifyAction(NotifyNotification *notify, gchar *action, gpointer userData); bool init(); void publish(const std::string& summary, const std::string& body, const std::string& viewParams = std::string()); private: /** * Flag to indicate whether libnotify has been successfully * initialized. */ bool m_initialized; /** * Flag to indicate whether libnotify accepts actions. */ bool m_acceptsActions; /** * The current notification. */ NotifyNotification *m_notification; }; SE_END_CXX #endif // HAS_NOTIFY #endif // __NOTIFICATION_BACKEND_LIBNOTIFY_H syncevolution-1.5/src/dbus/server/notification-backend-mlite.h0000644000373300001540000000247012326412403026104 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_BACKEND_MLITE_H #define __NOTIFICATION_BACKEND_MLITE_H #include "syncevo/declarations.h" #include "notification-backend-base.h" SE_BEGIN_CXX class NotificationBackendMLite : public NotificationBackendBase { public: NotificationBackendMLite(); virtual ~NotificationBackendMLite(); bool init(); void publish(const std::string& summary, const std::string& body, const std::string& viewParams = std::string()); }; SE_END_CXX #endif // __NOTIFICATION_BACKEND_MLITE_H syncevolution-1.5/src/dbus/server/notification-manager-factory.h0000644000373300001540000000257712326412403026474 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_MANAGER_FACTORY_H #define __NOTIFICATION_MANAGER_FACTORY_H #include "syncevo/declarations.h" #include "notification-manager.h" #include SE_BEGIN_CXX class NotificationBackendBase; class NotificationManagerFactory { public: /** Creates the appropriate NotificationManager for the current * platform. * Note: NotificationManagerFactory does not take ownership of * the returned pointer: the user must delete it when done. */ static boost::shared_ptr createManager(); }; SE_END_CXX #endif syncevolution-1.5/src/dbus/server/auto-sync-manager.h0000644000373300001540000001657212326412403024263 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef AUTO_SYNC_MANAGER_H #define AUTO_SYNC_MANAGER_H #include #include #include #include #include #include #include #include #include "notification-manager-factory.h" #include "timeout.h" SE_BEGIN_CXX class Server; class Session; /** * Manager to manage automatic sync. * * Once a configuration is enabled with automatic sync, possibly http * or obex-bt or both, the manager tracks whether they are ready to * run. For that it watches which transports are available (and how * long), which syncs run, etc. * * Automatic syncs only run when the server is idle. Then a new * Session is created and thus runs immediately. Because multiple * parallel sessions are not currently supported by SyncEvolution, * scheduling the next session waits until the server is idle again. * * Currently only time-based automatic syncs are supported. * Syncs triggered by local or remote changes will be added * later. */ class AutoSyncManager { Server &m_server; boost::weak_ptr m_me; /** true if we currently hold a ref for AutoTerm */ bool m_autoTermLocked; /** currently running auto sync session */ boost::shared_ptr m_session; /** connects m_server.m_idleSignal with schedule() */ boost::signals2::connection m_idleConnection; /** time when Bluetooth and HTTP transports became available, zero if not available */ Timespec m_btStartTime, m_httpStartTime; /** initialize m_idleConnection */ void connectIdle(); public: /** * A single task for automatic sync. * * Caches information about the corresponding configuration. * Some of that information is directly from the config, other * is collected from sessions (time of last sync). * * Each task maintains information for all sync URLs. */ class AutoSyncTask { public: /** * unique, normalized config name, set when task is created the first time; * by definition it cannot be changed later */ const std::string m_configName; /** * user-configurable peer name, with config name as fallback */ std::string m_peerName; /** copy of config's remoteDeviceId sync property */ std::string m_remoteDeviceId; /** copy of config's notifyLevel property */ SyncConfig::NotifyLevel m_notifyLevel; /** last auto sync attempt succeeded (needed for notification logic) */ bool m_syncSuccessStart; /** last auto sync attempt showed permanent failure (don't retry) */ bool m_permanentFailure; /** autoSyncDelay = the time that the peer must at least have been around (seconds) */ unsigned int m_delay; /** * autoSyncInterval = the minimum time in seconds between syncs. * * Documentation is vague about whether this is measured as the time from * start to start or between end to start. Traditionally, the implementation * was between starts (= fixed rate). This assumed that syncs are short compared * to the interval. In the extreme case (seen in testing), a sync takes longer * than the interval and thus the next sync is started immediately - probably * not what is expected. Keeping the behavior for now. */ unsigned int m_interval; /** * currently the start time of the last sync, measured with * the monotonicly increasing OS time */ Timespec m_lastSyncTime; /** maps syncURL to a specific transport mechanism */ enum Transport { NEEDS_HTTP, NEEDS_BT, NEEDS_OTHER }; /** list of sync URLs for which autosyncing over their transport mechanism , in same order as in syncURL */ typedef std::list< std::pair > URLInfo_t; URLInfo_t m_urls; AutoSyncTask(const std::string &configName) : m_configName(configName), m_syncSuccessStart(false), m_permanentFailure(false), m_delay(0), m_interval(0) { } /* /\** compare whether two tasks are the same, based on unique config name *\/ */ /* bool operator==(const AutoSyncTask &right) const */ /* { */ /* return m_peer == right.m_peer; */ /* } */ Timeout m_intervalTimeout; Timeout m_btTimeout; Timeout m_httpTimeout; }; /* /\** remove tasks from m_peerMap and m_workQueue created from the config *\/ */ /* void remove(const std::string &configName); */ /** * A map with information about *all* configs ever seen while auto * sync manager was active, including configs without auto sync * enabled (to track when and if they ran) and deleted configs * (because they might get recreated). */ typedef std::map > PeerMap; PeerMap m_peerMap; /** used to send notifications */ boost::shared_ptr m_notificationManager; /** * It reads all peers which are enabled to do auto sync and store them in * the m_peerMap and then add timeout sources in the main loop to schedule * auto sync tasks. */ void init(); /** * check m_peerMap: runs syncs that are ready, sets/updates timers for the rest * * @param reason a short explanation why the method gets called (for debugging) */ void schedule(const std::string &reason); /** * Watch further progress (if auto sync session), * record start time (in all cases). */ void sessionStarted(const boost::shared_ptr &session); /** Show "sync started" notification. */ void autoSyncSuccessStart(AutoSyncTask *task); /** Show completion notification. */ void autoSyncDone(AutoSyncTask *task, SyncMLStatus status); /** Record result. */ void anySyncDone(AutoSyncTask *task, SyncMLStatus status); AutoSyncManager(Server &server); public: static boost::shared_ptr createAutoSyncManager(Server &server); /** * prevent dbus server automatic termination when it has * any auto sync task enabled in the configs. * If returning true, prevent automatic termination. */ bool preventTerm(); /** init a config and set up auto sync task for it */ void initConfig(const std::string &configName); }; SE_END_CXX #endif // AUTO_SYNC_MANAGER_H syncevolution-1.5/src/dbus/server/bluez-manager.h0000644000373300001540000001663412326412403023461 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef BLUEZ_MANAGER_H #define BLUEZ_MANAGER_H #include #include "gdbus-cxx-bridge.h" #include #include SE_BEGIN_CXX class Server; class GLibNotify; /** * Query bluetooth devices from org.bluez * The basic workflow is: * 1) get default adapter from bluez by calling 'DefaultAdapter' method of org.bluez.Manager * 2) get all devices of the adapter by calling 'ListDevices' method of org.bluez.Adapter * 3) iterate all devices and get properties for each one by calling 'GetProperties' method of org.bluez.Device. * Then check its UUIDs whether it contains sync services and put it in the sync device list if it is. If this * is a sync device we then call DiscoverServices to check for the PnPInformation service record. * * To track changes of devices dynamically, here also listen signals from bluez: * org.bluez.Manager - DefaultAdapterChanged: default adapter is changed and thus have to get its devices * and update sync device list * org.bluez.Adapter - DeviceCreated, DeviceRemoved: device is created or removed and device list is updated * org.bluez.Device - PropertyChanged: property is changed and device information is changed and tracked * * This class is to manage querying bluetooth devices from org.bluez. Also * it acts a proxy to org.bluez.Manager. */ class BluezManager : public GDBusCXX::DBusRemoteObject { public: BluezManager(Server &server); bool isDone() { return m_done; } private: class BluezDevice; /** * This class acts a proxy to org.bluez.Adapter. * Call methods of org.bluez.Adapter and listen signals from it * to get devices list and track its changes */ class BluezAdapter: public GDBusCXX::DBusRemoteObject { public: BluezAdapter (BluezManager &manager, const std::string &path); void checkDone(bool forceDone = false) { if(forceDone || m_devReplies >= m_devNo) { m_devReplies = m_devNo = 0; m_manager.setDone(true); } else { m_manager.setDone(false); } } std::vector >& getDevices() { return m_devices; } private: /** callback of 'ListDevices' signal. Used to get all available devices of the adapter */ void listDevicesCb(const std::vector &devices, const std::string &error); /** callback of 'DeviceRemoved' signal. Used to track a device is removed */ void deviceRemoved(const GDBusCXX::DBusObject_t &object); /** callback of 'DeviceCreated' signal. Used to track a new device is created */ void deviceCreated(const GDBusCXX::DBusObject_t &object); BluezManager &m_manager; /** the number of device for the default adapter */ int m_devNo; /** the number of devices having reply */ int m_devReplies; /** all available devices */ std::vector > m_devices; /** represents 'DeviceRemoved' signal of org.bluez.Adapter*/ GDBusCXX::SignalWatch1 m_deviceRemoved; /** represents 'DeviceAdded' signal of org.bluez.Adapter*/ GDBusCXX::SignalWatch1 m_deviceAdded; friend class BluezDevice; }; /** * This class acts a proxy to org.bluez.Device. * Call methods of org.bluez.Device and listen signals from it * to get properties of device and track its changes */ class BluezDevice: public GDBusCXX::DBusRemoteObject { public: typedef std::map, std::string > > PropDict; typedef std::map ServiceDict; BluezDevice (BluezAdapter &adapter, const std::string &path); std::string getMac() { return m_mac; } /** * check whether the current device has sync service if yes, * put it in the adapter's sync devices list */ void checkSyncService(const std::vector &uuids); private: /** callback of 'GetProperties' method. The properties of the device is gotten */ void getPropertiesCb(const PropDict &props, const std::string &error); /** callback of 'DiscoverServices' method. The service records are retrieved */ void discoverServicesCb(const ServiceDict &serviceDict, const std::string &error); /** callback of 'PropertyChanged' signal. Changed property is tracked */ void propertyChanged(const std::string &name, const boost::variant, std::string> &prop); BluezAdapter &m_adapter; /** name of the device */ std::string m_name; /** mac address of the device */ std::string m_mac; /** whether the calling of 'GetProperties' is returned */ bool m_reply; typedef GDBusCXX::SignalWatch2, std::string> > PropertySignal; /** represents 'PropertyChanged' signal of org.bluez.Device */ PropertySignal m_propertyChanged; friend class BluezAdapter; }; /* * check whether the data is generated. If errors, force initilization done */ void setDone(bool done) { m_done = done; } /** callback of 'DefaultAdapter' method to get the default bluetooth adapter */ void defaultAdapterCb(const GDBusCXX::DBusObject_t &adapter, const std::string &error); /** callback of 'DefaultAdapterChanged' signal to track changes of the default adapter */ void defaultAdapterChanged(const GDBusCXX::DBusObject_t &adapter); Server &m_server; GDBusCXX::DBusConnectionPtr m_bluezConn; boost::shared_ptr m_adapter; // Holds the bluetooth lookup table and whether it was successfully loaded. class lookupTable : private boost::noncopyable { public: lookupTable() : bt_key_file(NULL), isLoaded(false) {} ~lookupTable() { if (bt_key_file) g_key_file_free(bt_key_file); } GKeyFile *bt_key_file; bool isLoaded; } m_lookupTable; boost::shared_ptr m_watchedFile; void loadBluetoothDeviceLookupTable(); bool getPnpInfoNamesFromValues(const std::string &vendorValue, std::string &vendorName, const std::string &productValue, std::string &productName); /** represents 'DefaultAdapterChanged' signal of org.bluez.Adapter*/ GDBusCXX::SignalWatch1 m_adapterChanged; /** flag to indicate whether the calls are all returned */ bool m_done; }; SE_END_CXX #endif // BLUEZ_MANAGER_H syncevolution-1.5/src/dbus/server/client.h0000644000373300001540000000735512326412403022206 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef CLIENT_H #define CLIENT_H #include #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX class Server; class Resource; /** * Tracks a single client and all sessions and connections that it is * connected to. Referencing them ensures that they stay around as * long as needed. */ class Client { Server &m_server; typedef std::list< boost::shared_ptr > Resources_t; Resources_t m_resources; /** counts how often a client has called Attach() without Detach() */ int m_attachCount; /** current client setting for notifications (see HAS_NOTIFY) */ bool m_notificationsEnabled; public: const GDBusCXX::Caller_t m_ID; Client(Server &server, const GDBusCXX::Caller_t &ID) : m_server(server), m_attachCount(0), m_notificationsEnabled(true), m_ID(ID) {} ~Client(); void increaseAttachCount() { ++m_attachCount; } void decreaseAttachCount() { --m_attachCount; } int getAttachCount() const { return m_attachCount; } void setNotificationsEnabled(bool enabled) { m_notificationsEnabled = enabled; } bool getNotificationsEnabled() const { return m_notificationsEnabled; } /** * Attach a specific resource to this client. As long as the * resource is attached, it cannot be freed. Can be called * multiple times, which means that detach() also has to be called * the same number of times to finally detach the resource. */ void attach(boost::shared_ptr resource) { m_resources.push_back(resource); } /** * Detach once from the given resource. Has to be called as * often as attach() to really remove all references to the * session. It's an error to call detach() more often than * attach(). */ void detach(Resource *resource); void detach(boost::shared_ptr resource) { detach(resource.get()); } /** * Remove all references to the given resource, regardless whether * it was referenced not at all or multiple times. */ void detachAll(Resource *resource) { Resources_t::iterator it = m_resources.begin(); while (it != m_resources.end()) { if (it->get() == resource) { it = m_resources.erase(it); } else { ++it; } } } void detachAll(boost::shared_ptr resource) { detachAll(resource.get()); } /** * return corresponding smart pointer for a certain resource, * empty pointer if not found */ boost::shared_ptr findResource(Resource *resource) { for (Resources_t::iterator it = m_resources.begin(); it != m_resources.end(); ++it) { if (it->get() == resource) { // got it return *it; } } return boost::shared_ptr(); } }; SE_END_CXX #endif // CLIENT_H syncevolution-1.5/src/dbus/server/connection.h0000644000373300001540000001322412326412403023057 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef CONNECTION_H #define CONNECTION_H #include "session.h" #include "session-common.h" #include "resource.h" #include #include #include SE_BEGIN_CXX class Server; class Session; /** * Represents and implements the Connection interface. * * The connection interacts with a Session by creating the Session and * exchanging data with it. For that, the connection registers itself * with the Session and unregisters again when it goes away. * * In contrast to clients, the Session only keeps a weak_ptr, which * becomes invalid when the referenced object gets deleted. Typically * this means the Session has to abort, unless reconnecting is * supported. */ class Connection : public GDBusCXX::DBusObjectHelper, public Resource { private: Server &m_server; boost::weak_ptr m_me; StringMap m_peer; bool m_mustAuthenticate; SessionCommon::ConnectionState m_state; std::string m_failure; /** first parameter for Session::sync() */ std::string m_syncMode; /** second parameter for Session::sync() */ SessionCommon::SourceModes_t m_sourceModes; const std::string m_sessionID; boost::shared_ptr m_session; /** * Defines the timeout in seconds. -1 and thus "no timeout" by default. * * The timeout is acticated each time the connection goes into * WAITING mode. Once it triggers, the connection is put into * the FAILED and queued for delayed deletion in the server. */ int m_timeoutSeconds; Timeout m_timeout; void activateTimeout(); void timeoutCb(); /** * buffer for received data, waiting here for engine to ask * for it via DBusTransportAgent::getReply(). */ SharedBuffer m_incomingMsg; std::string m_incomingMsgType; struct SANContent { std::vector m_syncType; std::vector m_contentType; std::vector m_serverURI; }; /** * The content of a parsed SAN package to be processed via * connection.ready */ boost::shared_ptr m_SANContent; std::string m_peerBtAddr; /** * records the reason for the failure, sends Abort signal and puts * the connection into the FAILED state. */ void failed(const std::string &reason); /** * returns " ( via )" */ static std::string buildDescription(const StringMap &peer); /** Connection.Process() */ void process(const GDBusCXX::Caller_t &caller, const GDBusCXX::DBusArray &message, const std::string &message_type); /** Connection.Close() */ void close(const GDBusCXX::Caller_t &caller, bool normal, const std::string &error); /** wrapper around sendAbort */ void abort(); /** Connection.Abort */ GDBusCXX::EmitSignal0 sendAbort; bool m_abortSent; /** Connection.Reply */ GDBusCXX::EmitSignal5 &, const std::string &, const StringMap &, bool, const std::string &> reply; Connection(Server &server, const GDBusCXX::DBusConnectionPtr &conn, const std::string &session_num, const StringMap &peer, bool must_authenticate); public: const std::string m_description; static boost::shared_ptr createConnection(Server &server, const GDBusCXX::DBusConnectionPtr &conn, const std::string &session_num, const StringMap &peer, bool must_authenticate); ~Connection(); /** session requested by us is ready to run a sync */ void ready(); /** send outgoing message via connection */ void send(const GDBusCXX::DBusArray buffer, const std::string &type, const std::string &url); /** send last, empty message and enter FINAL state */ void sendFinalMsg(); /** connection is no longer needed, ensure that it gets deleted */ void shutdown(); /** peer is not trusted, must authenticate as part of SyncML */ bool mustAuthenticate() const { return m_mustAuthenticate; } /** new incoming message ready */ typedef boost::signals2::signal &, const std::string &)> MessageSignal_t; MessageSignal_t m_messageSignal; /** connection went down (empty string) or failed (error message) */ typedef boost::signals2::signal StatusSignal_t; StatusSignal_t m_statusSignal; }; SE_END_CXX #endif // CONNECTION_H syncevolution-1.5/src/dbus/server/connman-client.h0000644000373300001540000000325212326412403023625 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef CONNMAN_CLIENT_H #define CONNMAN_CLIENT_H #include #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX class Server; /* * Implements org.connman.Manager * GetProperty : getPropCb * PropertyChanged: propertyChanged **/ class ConnmanClient : public GDBusCXX::DBusRemoteObject { public: ConnmanClient (Server &server); void propertyChanged(const std::string &name, const boost::variant, std::string> &prop); void getPropCb(const std::map >& props, const std::string &error); /** TRUE if watching ConnMan status */ bool isAvailable() { return m_available; } private: bool m_available; Server &m_server; GDBusCXX::SignalWatch2 > m_propertyChanged; }; SE_END_CXX #endif // CONNMAN_CLIENT_H syncevolution-1.5/src/dbus/server/dbus-user-interface.h0000644000373300001540000000365512326412403024576 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef DBUS_USER_INTERFACE_H #define DBUS_USER_INTERFACE_H #include #include #include SE_BEGIN_CXX /** * This class is mainly to implement two virtual functions 'askPassword' * and 'savePassword' of ConfigUserInterface. The main functionality is * to only get and save passwords in the gnome keyring. */ class DBusUserInterface : public UserInterface { public: DBusUserInterface(const InitStateTri &keyring); /* * Ask password from keyring, if not found, empty string * is returned */ std::string askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key); //save password to keyring, if not successful, false is returned. bool savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key); /** * Read stdin via InfoRequest/Response. */ void readStdin(std::string &content); private: InitStateTri m_keyring; }; SE_END_CXX #endif // DBUS_USER_INTERFACE_H syncevolution-1.5/src/dbus/server/exceptions.h0000644000373300001540000000710112326412403023076 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SYNCEVO_EXCEPTIONS_H #define SYNCEVO_EXCEPTIONS_H #include #include "config.h" // Can't use the GDBusCXX::message_type typedef here because it's not // defined till we include gdbus-cxx-bridge.h below. #ifdef WITH_GIO_GDBUS // Forward decleration can't be used here due to later typedef _GDBusMessage GDBusMessage. #include #else struct DBusMessage; #endif SE_BEGIN_CXX #ifdef WITH_GIO_GDBUS GDBusMessage *SyncEvoHandleException(GDBusMessage *msg); #else DBusMessage *SyncEvoHandleException(DBusMessage *msg); #endif SE_END_CXX // This needs to be defined before including gdbus-cxx-bridge.h! #define DBUS_CXX_EXCEPTION_HANDLER SyncEvo::SyncEvoHandleException #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX class DBusSyncException : public GDBusCXX::DBusCXXException, public Exception { public: DBusSyncException(const std::string &file, int line, const std::string &what) : Exception(file, line, what) {} /** * get exception name, used to convert to dbus error name * subclasses should override it */ virtual std::string getName() const { return "org.syncevolution.Exception"; } virtual const char* getMessage() const { return Exception::what(); } }; /** * exceptions classes deriving from DBusException * org.syncevolution.NoSuchConfig */ class NoSuchConfig: public DBusSyncException { public: NoSuchConfig(const std::string &file, int line, const std::string &error): DBusSyncException(file, line, error) {} virtual std::string getName() const { return "org.syncevolution.NoSuchConfig";} }; /** * org.syncevolution.NoSuchSource */ class NoSuchSource : public DBusSyncException { public: NoSuchSource(const std::string &file, int line, const std::string &error): DBusSyncException(file, line, error) {} virtual std::string getName() const { return "org.syncevolution.NoSuchSource";} }; /** * org.syncevolution.InvalidCall */ class InvalidCall : public DBusSyncException { public: InvalidCall(const std::string &file, int line, const std::string &error): DBusSyncException(file, line, error) {} virtual std::string getName() const { return "org.syncevolution.InvalidCall";} }; /** * org.syncevolution.SourceUnusable * CheckSource will use this when the source cannot be used for whatever reason */ class SourceUnusable : public DBusSyncException { public: SourceUnusable(const std::string &file, int line, const std::string &error): DBusSyncException(file, line, error) {} virtual std::string getName() const { return "org.syncevolution.SourceUnusable";} }; SE_END_CXX #endif // SYNCEVO_EXCEPTIONS_H syncevolution-1.5/src/dbus/server/localed-listener.h0000644000373300001540000000721512326412403024151 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOCALED_LISTENER #define INCL_LOCALED_LISTENER #include #include #include #include #include SE_BEGIN_CXX /** * The D-Bus binding for http://www.freedesktop.org/wiki/Software/systemd/localed/ */ class LocaledListener : public GDBusCXX::DBusRemoteObject { public: /** * Singleton - at most one instance of LocaledListener will exist. * It lives as long as one of the create() callers keeps the reference. */ static boost::shared_ptr create(); /** * array of var=value, for example LANG, LC_NUMERIC, etc. */ typedef std::vector LocaleEnv; /** * Emitted for each new set of env variables from localed. * May or may not be different from what we have already. */ boost::signals2::signal m_localeValues; /** * The result callback is guaranteed to be invoked once, * either with the current settings from localed or, if * retrieving those fails, with the current environment. */ void check(const boost::function &result); /** * Updates current environment to match the one in the parameter. * Emits m_localeChanged if and only if something really changed. * * Not called by default. To ensure that the current environment * matches localed, do: * - use current settings * - m_localeValues -> setLocale * - check -> setLocale * * Alternatively, one could wait until check() completes and only * then use the current settings. */ void setLocale(const LocaleEnv &locale); typedef boost::signals2::signal LocaleChangedSignal; /** * Emitted by setLocale() only if something really changed in the * local environment. */ LocaleChangedSignal m_localeChanged; private: boost::weak_ptr m_self; typedef boost::variant LocaleVariant; typedef std::map Properties; typedef std::vector Invalidated; GDBusCXX::SignalWatch3 m_propertiesChanged; GDBusCXX::DBusClientCall1 m_propertiesGet; LocaledListener(); void onPropertiesChange(const std::string &interface, const Properties &properties, const Invalidated &invalidated); typedef boost::function ProcessLocalePropCB_t; void processLocaleProperty(const LocaleVariant &locale, const std::string &error, bool mustCall, const ProcessLocalePropCB_t &result); void emitLocaleEnv(const LocaleEnv &env); }; SE_END_CXX #endif // INCL_LOCALED_LISTENER syncevolution-1.5/src/dbus/server/info-req.h0000644000373300001540000000732612326412403022446 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INFO_REQ_H #define INFO_REQ_H #include #include "gdbus-cxx-bridge.h" #include "timeout.h" #include #include SE_BEGIN_CXX class Server; /** * A wrapper for handling info request and response. */ class InfoReq { public: typedef std::map InfoMap; // status of current request enum Status { ST_RUN, // request is running ST_OK, // ok, response is gotten ST_TIMEOUT, // timeout ST_CANCEL // request is cancelled }; /** * constructor * The default timeout is 120 seconds */ InfoReq(Server &server, const std::string &type, const InfoMap ¶meters, const std::string &sessionPath, uint32_t timeout = 120); ~InfoReq(); std::string getId() const { return m_id; } std::string getSessionPath() const; std::string getInfoStateStr() const { return infoStateToString(m_infoState); } std::string getHandler() const { return m_handler; } std::string getType() const { return m_type; } const InfoMap& getParam() const { return m_param; } /** * Connect to this signal to be notified that a final response has * been received. */ typedef boost::signals2::signal ResponseSignal_t; ResponseSignal_t m_responseSignal; /** * Connect to this signal to be notified when it is considered timed out. * The timeout counting restarts each time any client sends any kind of * response. */ typedef boost::signals2::signal TimeoutSignal_t; TimeoutSignal_t m_timeoutSignal; /** get current status in string format */ std::string getStatusStr() const { return statusToString(m_status); } /** set response from dbus clients */ void setResponse(const GDBusCXX::Caller_t &caller, const std::string &state, const InfoMap &response); private: static std::string statusToString(Status status); enum InfoState { IN_REQ, //request IN_WAIT, // waiting IN_DONE // done }; static std::string infoStateToString(InfoState state); Server &m_server; /** caller's session, might be NULL */ const std::string m_sessionPath; /** unique id of this info request */ std::string m_id; /** times out this amount of seconds after last interaction with client */ uint32_t m_timeoutSeconds; Timeout m_timeout; /** info req state defined in dbus api */ InfoState m_infoState; /** status to indicate the info request is timeout, ok, abort, etc */ Status m_status; /** the handler of the responsed dbus client */ GDBusCXX::Caller_t m_handler; /** the type of the info request */ std::string m_type; /** parameters from info request callers */ InfoMap m_param; /** response returned from dbus clients */ InfoMap m_response; void done(); }; SE_END_CXX #endif // INFO_REQ_H syncevolution-1.5/src/dbus/server/network-manager-client.h0000644000373300001540000000506512326412403025301 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef NETWORK_MANAGER_CLIENT_H #define NETWORK_MANAGER_CLIENT_H #include #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX class Server; /** * Client for org.freedesktop.NetworkManager * The initial state of NetworkManager is queried via * org.freedesktop.DBus.Properties. Dynamic changes are listened via * org.freedesktop.NetworkManager - StateChanged signal */ class NetworkManagerClient : public GDBusCXX::DBusRemoteObject { public: enum NM_State { NM_STATE_UNKNOWN = 0, /* following values for NM < 0.9 */ NM_STATE_ASLEEP_DEPRECATED = 1, NM_STATE_CONNECTING_DEPRECATED = 2, NM_STATE_CONNECTED_DEPRECATED = 3, NM_STATE_DISCONNECTED_DEPRECATED = 4, /* following values for NM >= 0.9 */ NM_STATE_ASLEEP = 10, NM_STATE_DISCONNECTED = 20, NM_STATE_DISCONNECTING = 30, NM_STATE_CONNECTING = 40, NM_STATE_CONNECTED_LOCAL = 50, NM_STATE_CONNECTED_SITE = 60, NM_STATE_CONNECTED_GLOBAL = 70, }; public: NetworkManagerClient(Server& server); void stateChanged(uint32_t uiState); /** TRUE if watching Network Manager status */ bool isAvailable() { return m_available; } private: bool m_available; class NetworkManagerProperties : public DBusRemoteObject { public: NetworkManagerProperties(NetworkManagerClient& manager); void get(); void getCallback(const boost::variant &prop, const std::string &error); private: NetworkManagerClient &m_manager; }; Server &m_server; GDBusCXX::SignalWatch1 m_stateChanged; NetworkManagerProperties m_properties; }; SE_END_CXX #endif // NETWORK_MANAGER_CLIENT_H syncevolution-1.5/src/dbus/server/presence-status.h0000644000373300001540000000612012326412403024042 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef PRESENCE_STATUS_H #define PRESENCE_STATUS_H #include "read-operations.h" #include SE_BEGIN_CXX class Server; class PresenceStatus { bool m_httpPresence; bool m_btPresence; bool m_initiated; Server &m_server; enum PeerStatus { /* The transport is not available (local problem) */ NOTRANSPORT, /* The peer is not contactable (remote problem) */ UNREACHABLE, /* Not for sure whether the peer is presence but likely*/ MIGHTWORK, INVALID }; typedef std::map > > StatusMap; typedef std::pair > > StatusPair; typedef std::pair PeerStatusPair; StatusMap m_peers; static std::string status2string (PeerStatus status) { switch (status) { case NOTRANSPORT: return "no transport"; break; case UNREACHABLE: return "not present"; break; case MIGHTWORK: return ""; break; case INVALID: return "invalid transport status"; } // not reached, keep compiler happy return ""; } public: PresenceStatus (Server &server) :m_httpPresence (false), m_btPresence (false), m_initiated (false), m_server (server) { } enum TransportType{ HTTP_TRANSPORT, BT_TRANSPORT, INVALID_TRANSPORT }; void init(); /* Implement Server::checkPresence*/ void checkPresence (const std::string &peer, std::string& status, std::vector &transport); void updateConfigPeers (const std::string &peer, const ReadOperations::Config_t &config); void updatePresenceStatus (bool newStatus, TransportType type); bool getHttpPresence() { return m_httpPresence; } bool getBtPresence() { return m_btPresence; } /** emitted on changes of the current value */ typedef boost::signals2::signal PresenceSignal_t; PresenceSignal_t m_httpPresenceSignal; PresenceSignal_t m_btPresenceSignal; private: void updatePresenceStatus (bool httpPresence, bool btPresence); }; SE_END_CXX #endif // PRESENCE_STATUS_H syncevolution-1.5/src/dbus/server/progress-data.h0000644000373300001540000001325512326412403023477 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef PROGRESS_DATA_H #define PROGRESS_DATA_H #include #include SE_BEGIN_CXX /** * Hold progress info and try to estimate current progress */ class ProgressData { public: /** * big steps, each step contains many operations, such as * data prepare, message send/receive. * The partitions of these steps are based on profiling data * for many usage scenarios and different sync modes */ enum ProgressStep { /** an invalid step */ PRO_SYNC_INVALID = 0, /** * sync prepare step: do some preparations and checkings, * such as source preparation, engine preparation */ PRO_SYNC_PREPARE, /** * session init step: transport connection set up, * start a session, authentication and dev info generation * normally it needs one time syncML messages send-receive. * Sometimes it may need messages send/receive many times to * handle authentication */ PRO_SYNC_INIT, /** * prepare sync data and send data, also receive data from server. * Also may need send/receive messages more than one time if too * much data. * assume 5 items to be sent by default */ PRO_SYNC_DATA, /** * item receive handling, send client's status to server and * close the session * assume 5 items to be received by default */ PRO_SYNC_UNINIT, /** number of sync steps */ PRO_SYNC_TOTAL }; /** * internal mode to represent whether it is possible that data is sent to * server or received from server. This could help remove some incorrect * hypothesis. For example, if only to client, then it is no data item * sending to server. */ enum InternalMode { INTERNAL_NONE = 0, INTERNAL_ONLY_TO_CLIENT = 1, INTERNAL_ONLY_TO_SERVER = 1 << 1, INTERNAL_TWO_WAY = 1 + (1 << 1) }; /** * treat a one-time send-receive without data items * as an internal standard unit. * below are ratios of other operations compared to one * standard unit. * These ratios might be dynamicall changed in the future. */ /** PRO_SYNC_PREPARE step ratio to standard unit */ static const float PRO_SYNC_PREPARE_RATIO; /** data prepare for data items to standard unit. All are combined by profiling data */ static const float DATA_PREPARE_RATIO; /** one data item send's ratio to standard unit */ static const float ONEITEM_SEND_RATIO; /** one data item receive&parse's ratio to standard unit */ static const float ONEITEM_RECEIVE_RATIO; /** connection setup to standard unit */ static const float CONN_SETUP_RATIO; /** assume the number of data items */ static const int DEFAULT_ITEMS = 5; /** default times of message send/receive in each step */ static const int MSG_SEND_RECEIVE_TIMES = 1; ProgressData(); int32_t getProgress() const { return m_progress; } /** set percentage, including clipping to the 0-100 range */ void setProgress(int32_t progress); /** * change the big step */ void setStep(ProgressStep step); /** * calc progress when a message is sent */ void sendStart(); /** * calc progress when a message is received from server */ void receiveEnd(); /** * re-calc progress proportions according to syncmode hint * typically, if only refresh-from-client, then * client won't receive data items. */ void addSyncMode(SyncMode mode); /** * calc progress when data prepare for sending */ void itemPrepare(); /** * calc progress when a data item is received */ void itemReceive(const std::string &source, int count, int total); private: /** update progress data */ void updateProg(float ratio); /** dynamically adapt the proportion of each step by their current units */ void recalc(); /** internally check sync mode */ void checkInternalMode(); /** get total units of current step and remaining steps */ float getRemainTotalUnits(); /** get default units of given step */ static float getDefaultUnits(ProgressStep step); private: /** progress percentage */ int32_t m_progress; /** current big step */ ProgressStep m_step; /** count of message send/receive in current step. Cleared in the start of a new step */ int m_sendCounts; /** internal sync mode combinations */ int m_internalMode; /** proportions when each step is end */ float m_syncProp[PRO_SYNC_TOTAL]; /** remaining units of each step according to current step */ float m_syncUnits[PRO_SYNC_TOTAL]; /** proportion of a standard unit, may changes dynamically */ float m_propOfUnit; /** current sync source */ std::string m_source; }; SE_END_CXX #endif // PROGRESS_DATA_H syncevolution-1.5/src/dbus/server/read-operations.h0000644000373300001540000000774212326412403024024 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef READ_OPERATIONS_H #define READ_OPERATIONS_H #include #include #include "gdbus-cxx-bridge.h" SE_BEGIN_CXX class Server; /** * Implements the read-only methods in a Session and the Server. * Only data is the server configuration name, everything else * is created and destroyed inside the methods. */ class ReadOperations { public: const std::string m_configName; Server &m_server; ReadOperations(const std::string &config_name, Server &server); /** the double dictionary used to represent configurations */ typedef std::map< std::string, StringMap > Config_t; /** the array of reports filled by getReports() */ typedef std::vector< StringMap > Reports_t; /** the array of databases used by getDatabases() */ typedef SyncSource::Database SourceDatabase; typedef SyncSource::Databases SourceDatabases_t; /** implementation of D-Bus GetConfigs() */ void getConfigs(bool getTemplates, std::vector &configNames); /** implementation of D-Bus GetConfig() for m_configName as server configuration */ void getConfig(bool getTemplate, Config_t &config); /** implementation of D-Bus GetNamedConfig() for configuration named in parameter */ void getNamedConfig(const std::string &configName, bool getTemplate, Config_t &config); /** implementation of D-Bus GetReports() for m_configName as server configuration */ void getReports(uint32_t start, uint32_t count, Reports_t &reports); /** Session.CheckSource() */ void checkSource(const string &sourceName); /** Session.GetDatabases() */ void getDatabases(const string &sourceName, SourceDatabases_t &databases); private: /** * This virtual function is used to let subclass set * filters to config. Only used internally. * Return true if filters exists and have been set. * Otherwise, nothing is set to config */ virtual bool setFilters(SyncConfig &config) { return false; } /** * utility method which constructs a SyncConfig which references a local configuration (never a template) * * In general, the config must exist, except in two cases: * - configName = @default (considered always available) * - mustExist = false (used when reading a templates for a context which might not exist yet) */ boost::shared_ptr getLocalConfig(const std::string &configName, bool mustExist = true); }; SE_END_CXX namespace GDBusCXX { using namespace SyncEvo; /** * dbus_traits for SourceDatabase. Put it here for * avoiding polluting gxx-dbus-bridge.h */ template<> struct dbus_traits : public dbus_struct_traits > > >{}; } #endif // READ_OPERATIONS_H syncevolution-1.5/src/dbus/server/server.h0000664000373300001540000006024212424466461022246 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SYNCEVO_DBUS_SERVER_H #define SYNCEVO_DBUS_SERVER_H #include #include #include #include #include #include "exceptions.h" #include "auto-term.h" #include "timeout.h" #include "dbus-callbacks.h" #include "read-operations.h" #include SE_BEGIN_CXX class Resource; class Session; class Server; class InfoReq; class BluezManager; class Restart; class Client; class GLibNotify; class AutoSyncManager; class PresenceStatus; class ConnmanClient; class NetworkManagerClient; // TODO: avoid polluting namespace using namespace std; class ServerLogger; /** * Implements the main org.syncevolution.Server interface. * * The Server class is responsible for listening to clients and * spinning of sync sessions as requested by clients. */ class Server : public GDBusCXX::DBusObjectHelper { GMainLoop *m_loop; guint m_suspendFlagsSource; bool m_shutdownRequested; Timespec m_lastFileMod; boost::shared_ptr &m_restart; GDBusCXX::DBusConnectionPtr m_conn; uint32_t m_lastSession; typedef std::list< std::pair< boost::shared_ptr, boost::shared_ptr > > Clients_t; Clients_t m_clients; /** * Functor will never be called, important are the shared pointers * bound to it. m_delayDeletion will be cleared in idle and when * server terminates, thus unrefing anything encapsulated inside * it. */ std::list< boost::function > m_delayDeletion; /** * Watch all files mapped into our address space. When * modifications are seen (as during a package upgrade), sets * m_shutdownRequested. This prevents adding new sessions and * prevents running already queued ones, because future sessions * might not be able to execute correctly without a restart. For example, a * sync with libsynthesis from 1.1 does not work with * SyncEvolution XML files from 1.2. The daemon then waits * for the changes to settle (see SHUTDOWN_QUIESENCE_SECONDS) and either shuts * down or restarts. The latter is necessary if the daemon has * automatic syncing enabled in a config. */ list< boost::shared_ptr > m_files; void fileModified(const std::string &file); bool shutdown(); /** * timer which counts seconds until server is meant to shut down */ Timeout m_shutdownTimer; /** * The session which currently holds the main lock on the server. * To avoid issues with concurrent modification of data or configs, * only one session may make such modifications at a time. A * plain pointer which is reset by the session's deconstructor. * * The server doesn't hold a shared pointer to the session so * that it can be deleted when the last client detaches from it. * * A weak pointer alone did not work because it does not provide access * to the underlying pointer after the last corresponding shared * pointer is gone (which triggers the deconstructing of the session). */ Session *m_activeSession; /** * The weak pointer that corresponds to m_activeSession. */ boost::weak_ptr m_activeSessionRef; /** * The running sync session. Having a separate reference to it * ensures that the object won't go away prematurely, even if all * clients disconnect. * * The session itself needs to request this special treatment with * addSyncSession() and remove itself with removeSyncSession() when * done. */ boost::shared_ptr m_syncSession; typedef std::list< boost::weak_ptr > WorkQueue_t; /** * A queue of pending, idle Sessions. Sorted by priority, most * important one first. Currently this is used to give client * requests a boost over remote connections and (in the future) * automatic syncs. * * Active sessions are removed from this list and then continue * to exist as long as a client in m_clients references it or * it is the currently running sync session (m_syncSession). */ WorkQueue_t m_workQueue; /** * a hash of pending InfoRequest */ typedef std::map > InfoReqMap; // hash map of pending info requests InfoReqMap m_infoReqMap; // the index of last info request uint32_t m_lastInfoReq; // a hash to represent matched templates for devices, the key is // the peer name typedef std::map > MatchedTemplates; MatchedTemplates m_matchedTempls; boost::shared_ptr m_bluezManager; /** devices which have sync services */ SyncConfig::DeviceList m_syncDevices; /** * Watch callback for a specific client or connection. */ void clientGone(Client *c); public: // D-Bus API, also usable directly /** Server.GetCapabilities() */ vector getCapabilities(); /** Server.GetVersions() */ StringMap getVersions(); /** Server.Attach() */ void attachClient(const GDBusCXX::Caller_t &caller, const boost::shared_ptr &watch); /** Server.Detach() */ void detachClient(const GDBusCXX::Caller_t &caller); /** Server.DisableNotifications() */ void disableNotifications(const GDBusCXX::Caller_t &caller, const string ¬ifications) { setNotifications(false, caller, notifications); } /** Server.EnableNotifications() */ void enableNotifications(const GDBusCXX::Caller_t &caller, const string ¬ifications) { setNotifications(true, caller, notifications); } /** Server.NotificationAction() */ void notificationAction(const GDBusCXX::Caller_t &caller) { pid_t pid; if((pid = fork()) == 0) { // search sync-ui from $PATH execlp("sync-ui", "sync-ui", (const char*)0); // Failing that, try meego-ux-settings/Sync execlp("meego-qml-launcher", "meego-qml-launcher", "--opengl", "--fullscreen", "--app", "meego-ux-settings", "--cmd", "showPage", "--cdata", "Sync", (const char*)0); // Failing that, simply exit exit(0); } } /** actual implementation of enable and disable */ void setNotifications(bool enable, const GDBusCXX::Caller_t &caller, const string ¬ifications); /** Server.Connect() */ void connect(const GDBusCXX::Caller_t &caller, const boost::shared_ptr &watch, const StringMap &peer, bool must_authenticate, const std::string &session, GDBusCXX::DBusObject_t &object); /** Server.StartSession() */ void startSession(const GDBusCXX::Caller_t &caller, const boost::shared_ptr &watch, const std::string &server, GDBusCXX::DBusObject_t &object) { startSessionWithFlags(caller, watch, server, std::vector(), object); } /** Server.StartSessionWithFlags() */ void startSessionWithFlags(const GDBusCXX::Caller_t &caller, const boost::shared_ptr &watch, const std::string &server, const std::vector &flags, GDBusCXX::DBusObject_t &object); /** internal representation of D-Bus API Server.StartSessionWithFlags() */ enum SessionFlags { SESSION_FLAG_NONE = 0, SESSION_FLAG_NO_SYNC = 1<<0, SESSION_FLAG_ALL_CONFIGS = 1<<1 }; /** * Creates a session, queues it, then invokes the callback * once the session is active. The caller is responsible * for holding a reference to the session. If it drops * that reference, the session gets deleted and the callback * will not be called. */ boost::shared_ptr startInternalSession(const std::string &server, SessionFlags flags, const boost::function &session)> &callback); /** Server.GetConfig() */ void getConfig(const std::string &config_name, bool getTemplate, ReadOperations::Config_t &config) { ReadOperations ops(config_name, *this); ops.getConfig(getTemplate , config); } /** Server.GetReports() */ void getReports(const std::string &config_name, uint32_t start, uint32_t count, ReadOperations::Reports_t &reports) { ReadOperations ops(config_name, *this); ops.getReports(start, count, reports); } /** Server.CheckSource() */ void checkSource(const std::string &configName, const std::string &sourceName) { ReadOperations ops(configName, *this); ops.checkSource(sourceName); } /** Server.GetDatabases() */ void getDatabases(const std::string &configName, const string &sourceName, ReadOperations::SourceDatabases_t &databases) { ReadOperations ops(configName, *this); ops.getDatabases(sourceName, databases); } /** Server.GetConfigs() */ void getConfigs(bool getTemplates, std::vector &configNames) { ReadOperations ops("", *this); ops.getConfigs(getTemplates, configNames); } /** Server.CheckPresence() */ void checkPresence(const std::string &server, std::string &status, std::vector &transports); /** Server.GetSessions() */ void getSessions(std::vector &sessions); /** Server.InfoResponse() */ void infoResponse(const GDBusCXX::Caller_t &caller, const std::string &id, const std::string &state, const std::map &response); /** Server.SessionChanged */ GDBusCXX::EmitSignal2 sessionChanged; /** Server.PresenceChanged */ GDBusCXX::EmitSignal3 presence; /** * Server.TemplatesChanged, triggered each time m_syncDevices, the * input for the templates, is changed */ GDBusCXX::EmitSignal0 templatesChanged; /** * Server.ConfigChanged, triggered each time a session ends * which modified its configuration */ GDBusCXX::EmitSignal0 configChanged; /** Server.InfoRequest */ GDBusCXX::EmitSignal6 &> infoRequest; /** wrapper around Server.LogOutput, filters by DBusLogLevel */ void logOutput(const GDBusCXX::DBusObject_t &path, Logger::Level level, const std::string &explanation, const std::string &procname); void setDBusLogLevel(Logger::Level level) { m_dbusLogLevel = level; } Logger::Level getDBusLogLevel() const { return m_dbusLogLevel; } private: /** Server.LogOutput */ GDBusCXX::EmitSignal4 m_logOutputSignal; friend class InfoReq; /** emit InfoRequest */ void emitInfoReq(const InfoReq &); /** get the next id of InfoRequest */ std::string getNextInfoReq(); /** remove InfoReq from hash map */ void removeInfoReq(const std::string &infoReqId); boost::scoped_ptr m_presence; boost::scoped_ptr m_connman; boost::scoped_ptr m_networkManager; /** Manager to automatic sync */ boost::shared_ptr m_autoSync; //automatic termination AutoTerm m_autoTerm; // The level of detail for D-Bus logging signals. Logger::Level m_dbusLogLevel; // Created in constructor and captures parent logger there, // then pushed as default logger in activate(). boost::shared_ptr m_logger; PushLogger m_pushLogger; /** * All active timeouts created by addTimeout(). * Each timeout which requests to be not called * again will be removed from this list. */ list< boost::shared_ptr > m_timeouts; /** * called each time a timeout triggers, * removes those which are done */ bool callTimeout(const boost::shared_ptr &timeout, const boost::function &callback); /** called 1 minute after last client detached from a session */ static void sessionExpired(const boost::shared_ptr &session); /** hooked into m_idleSignal, controls auto-termination */ void onIdleChange(bool idle); /** hooked up to SuspendFlags fd via g_io_add_watch */ static gboolean onSuspendFlagsChange(GIOChannel *source, GIOCondition condition, gpointer data) throw (); public: Server(GMainLoop *loop, boost::shared_ptr &restart, const GDBusCXX::DBusConnectionPtr &conn, int duration); void activate(); ~Server(); /** access to the GMainLoop reference used by this Server instance */ GMainLoop *getLoop() { return m_loop; } /** process D-Bus calls until the server is ready to quit */ void run(); /** currently running operation */ boost::shared_ptr getSyncSession() const { return m_syncSession; } /** true iff no work is pending */ bool isIdle() const { return !m_activeSession && m_workQueue.empty(); } /** isIdle() has changed its value, current value included */ typedef boost::signals2::signal IdleSignal_t; IdleSignal_t m_idleSignal; /** * More specific "config changed signal", called with normalized * config name as parameter. Config name is empty if all configs * were affected. */ typedef boost::signals2::signal ConfigChangedSignal_t; ConfigChangedSignal_t m_configChangedSignal; /** * Called when a session starts its real work (= calls addSyncSession()). */ typedef boost::signals2::signal &)> NewSyncSessionSignal_t; NewSyncSessionSignal_t m_newSyncSessionSignal; /** * look up client by its ID */ boost::shared_ptr findClient(const GDBusCXX::Caller_t &ID); /** * find client by its ID or create one anew */ boost::shared_ptr addClient(const GDBusCXX::Caller_t &ID, const boost::shared_ptr &watch); /** detach this resource from all clients which own it */ void detach(Resource *resource); /** * Enqueue a session. Might also make it ready immediately, * if nothing else is first in the queue. To be called * by the creator of the session, *after* the session is * ready to run. */ void enqueue(const boost::shared_ptr &session); /** * Remove all sessions with this device ID from the * queue. If the active session also has this ID, * the session will be aborted and/or deactivated. * * Has to be asynchronous because it might involve ensuring that * there is no running helper for this device ID, which requires * communicating with the helper. */ void killSessionsAsync(const std::string &peerDeviceID, const SimpleResult &result); /** * Remove a session from the work queue. If it is running a sync, * it will keep running and nothing will change. Otherwise, if it * is "ready" (= holds a lock on its configuration), then release * that lock. */ void dequeue(Session *session); /** * Remember that the session is running a sync (or some other * important operation) and keeps a pointer to it, to prevent * deleting it. Currently can only called by the active sync * session. Will fail if all clients have detached already. * * If successful, it triggers m_newSyncSessionSignal. */ void addSyncSession(Session *session); /** * Session is done, ready to be deleted again. */ void removeSyncSession(Session *session); /** * Checks whether the server is ready to run another session * and if so, activates the first one in the queue. */ void checkQueue(); /** * Special behavior for sessions: keep them around for another * minute after the are no longer needed. Must be called by the * creator of the session right before it would normally cause the * destruction of the session. * * This allows another client to attach and/or get information * about the session. * * This is implemented as a timeout which holds a reference to the * session. Once the timeout fires, it is called and then removed, * which removes the reference. */ void delaySessionDestruction(const boost::shared_ptr &session); /** * Works for any kind of object: keep shared pointer until the * event loop is idle, then unref it inside. Useful for instances * which need to delete themselves. */ template void delayDeletion(const boost::shared_ptr &t) { // The functor will never be called, important here is only // that it contains a copy of the shared pointer. m_delayDeletion.push_back(boost::bind(delayDeletionDummy, t)); g_idle_add(&Server::delayDeletionCb, this); } template static void delayDeletionDummy(const boost::shared_ptr &t) throw () {} static gboolean delayDeletionCb(gpointer userData) throw () { Server *me = static_cast(userData); try { me->m_delayDeletion.clear(); } catch (...) { // Something unexpected went wrong, can only shut down. Exception::handle(HANDLE_EXCEPTION_FATAL); } return false; } /** * Handle the password request from a specific session. Ask our * clients, relay answer to session if it is still around at the * time when we get the response. * * Server does not keep a strong reference to info request, * caller must do that or the request will automatically be * deleted. */ boost::shared_ptr passwordRequest(const std::string &descr, const ConfigPasswordKey &key, const boost::weak_ptr &session); /** got response for earlier request, need to extract password and tell session */ void passwordResponse(const StringMap &response, const boost::weak_ptr &session); /** * Invokes the given callback once in the given amount of seconds. * Keeps a copy of the callback. If the Server is destructed * before that time, then the callback will be deleted without * being called. */ void addTimeout(const boost::function &callback, int seconds); /** * InfoReq will be added to map automatically and removed again * when it completes or times out. Caller is responsible for * calling removeInfoReq() when the request becomes obsolete * sooner than that. */ boost::shared_ptr createInfoReq(const string &type, const std::map ¶meters, const Session &session); void autoTermRef(int counts = 1) { m_autoTerm.ref(counts); } void autoTermUnref(int counts = 1) { m_autoTerm.unref(counts); } /** callback to reset for auto termination checking */ void autoTermCallback() { m_autoTerm.reset(); } /** poll_nm callback for connman, used for presence detection*/ void connmanCallback(const std::map > >& props, const string &error); PresenceStatus& getPresenceStatus(); void clearPeerTempls() { m_matchedTempls.clear(); } void addPeerTempl(const string &templName, const boost::shared_ptr peerTempl); boost::shared_ptr getPeerTempl(const string &peer); /** * methods to operate device list. See DeviceList definition. * The device id here is the identifier of device, the same as definition in DeviceList. * In bluetooth devices, it refers to actually the mac address of the bluetooth. * The finger print and match mode is used to match templates. */ /** get sync devices */ void getDeviceList(SyncConfig::DeviceList &devices); /** get a device according to device id. If not found, return false. */ bool getDevice(const string &deviceId, SyncConfig::DeviceDescription &device); /** add a device */ void addDevice(const SyncConfig::DeviceDescription &device); /** remove a device by device id. If not found, do nothing */ void removeDevice(const string &deviceId); /** update a device with the given device information. If not found, do nothing */ void updateDevice(const string &deviceId, const SyncConfig::DeviceDescription &device); /** emit a presence signal */ void emitPresence(const string &server, const string &status, const string &transport) { presence(server, status, transport); } /** * Returns new unique session ID. Implemented with a running * counter. Checks for overflow, but not currently for active * sessions. */ std::string getNextSession(); /** * Number of seconds to wait after file modifications are observed * before shutting down or restarting. Shutting down could be done * immediately, but restarting might not work right away. 10 * seconds was chosen because every single package is expected to * be upgraded on disk in that interval. If a long-running system * upgrade replaces additional packages later, then the server * might restart multiple times during a system upgrade. Because it * never runs operations directly after starting, that shouldn't * be a problem. */ static const int SHUTDOWN_QUIESENCE_SECONDS = 10; /** * false if any client requested suppression of notifications */ bool notificationsEnabled(); void message2DBus(const Logger::MessageOptions &options, const char *format, va_list args, const std::string &dbusPath, const std::string &procname); }; // extensions to the D-Bus server, created dynamically by main() #ifdef ENABLE_DBUS_PIM boost::shared_ptr CreateContactManager(const boost::shared_ptr &server, bool start); #endif SE_END_CXX #endif // SYNCEVO_DBUS_SERVER_H syncevolution-1.5/src/dbus/server/session.h0000664000373300001540000005207412355040516022417 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SESSION_H #define SESSION_H #include #include #include #include #include #include "session-common.h" #include "read-operations.h" #include "progress-data.h" #include "source-progress.h" #include "source-status.h" #include "timer.h" #include "timeout.h" #include "resource.h" #include "dbus-callbacks.h" SE_BEGIN_CXX class Connection; class Server; class ForkExecParent; class SessionProxy; class InfoReq; /** * Represents and implements the Session interface. Use * boost::shared_ptr to track it and ensure that there are references * to it as long as the connection is needed. * * The actual implementation is split into two parts: * - state as exposed via D-Bus is handled entirely in this class * - syncing and command line execution run inside * the forked syncevo-dbus-helper * * This allows creating and tracking a Session locally in * syncevo-dbus-server and minimizes asynchronous calls into the * helper. The helper is started on demand (which might be never, * for simple sessions). */ class Session : public GDBusCXX::DBusObjectHelper, public Logger, public Resource, private ReadOperations, private boost::noncopyable { public: /** * the sync status for session */ enum SyncStatus { SYNC_QUEUEING, ///< waiting to become ready for use SYNC_IDLE, ///< ready, session is initiated but sync not started SYNC_RUNNING, ///< sync is running SYNC_ABORT, ///< sync is aborting SYNC_SUSPEND, ///< sync is suspending SYNC_DONE, ///< sync is done SYNC_ILLEGAL }; /** Part of D-Bus API. */ typedef std::map SourceStatuses_t; /** Part of D-Bus API. */ typedef std::map APISourceProgresses_t; /** Internal, with automatic conversion to APISourceProgresses_t when needed. */ struct SourceProgresses_t : public std::map { operator APISourceProgresses_t () const { APISourceProgresses_t to; to.insert(begin(), end()); return to; } }; private: std::vector m_flags; const std::string m_sessionID; std::string m_peerDeviceID; /** Starts the helper, on demand (see useHelperAsync()). */ boost::shared_ptr m_forkExecParent; /** The D-Bus proxy for the helper. */ boost::shared_ptr m_helper; /** * Ensures that helper is running and that its D-Bus API is * available via m_helper, then invokes the success * callback. Startup errors are reported back via the error * callback. It is the responsibility of that error callback to * turn the session into the right failure state, usually via * Session::failed(). Likewise, any unexpected failures or helper * shutdowns need to be monitored by the caller of * useHelperAsync(). useHelperAsync() merely logs these events. * * useHelperAsync() and its helper function, useHelper2(), are the * ones called directly from the main event loop. They ensure that * any exceptions thrown inside them, including exceptions thrown * by the result.done(), are logged and turned into * result.failed() calls. * * In practice, the helper is started at most once per session, to * run the operation (see runOperation()). When it terminates, the * session is either considered "done" or "failed", depending on * whether the operation has completed already. * @param env additional env variables to be set in the helper process */ void useHelperAsync(const SimpleResult &result, const StringMap &env = StringMap()); /** * Finish the work started by useHelperAsync once helper has * connected. The operation might still fail at this point. */ void useHelper2(const SimpleResult &result, const boost::signals2::connection &c); /** set up m_helper */ void onConnect(const GDBusCXX::DBusConnectionPtr &conn) throw (); /** unset m_helper but not m_forkExecParent (still processing signals) */ void onQuit(int result) throw (); /** set after abort() and suspend(), to turn "child died' into the LOCERR_USERABORT status code */ void expectChildTerm(int result) throw (); /** log failure */ void onFailure(SyncMLStatus status, const std::string &explanation) throw (); /** log error output from helper */ void onOutput(const char *buffer, size_t length); bool m_serverMode; bool m_serverAlerted; SharedBuffer m_initialMessage; string m_initialMessageType; boost::weak_ptr m_connection; std::string m_connectionError; bool m_useConnection; /** temporary config changes */ FilterConfigNode::ConfigFilter m_syncFilter; FilterConfigNode::ConfigFilter m_sourceFilter; SessionCommon::SourceFilters_t m_sourceFilters; /** whether dbus clients set temporary configs */ bool m_tempConfig; /** * whether the dbus clients updated, removed or cleared configs, * ignoring temporary configuration changes */ bool m_setConfig; /** Session life cycle */ enum SessionStatus { SESSION_IDLE, /**< not active yet, only Detach() allowed */ SESSION_ACTIVE, /**< active, config changes and Sync()/Execute() allowed */ SESSION_RUNNING, /**< one-time operation (Sync() or Execute()) in progress */ SESSION_DONE /**< operation completed, only Detach() still allowed */ }; SessionStatus m_status; /** * set when operation was aborted, enables special handling of "child quit" in onQuit(). */ bool m_wasAborted; /** * True iff we initiated the sync. */ bool m_remoteInitiated; SyncStatus m_syncStatus; /** maps to names as used in D-Bus API */ inline std::string static syncStatusToString(SyncStatus state) { static const char * const strings[SYNC_ILLEGAL] = { "queueing", "idle", "running", "aborting", "suspending", "done" }; return state >= SYNC_QUEUEING && state < SYNC_ILLEGAL ? strings[state] : ""; } /** step info: whether engine is waiting for something */ bool m_stepIsWaiting; /** * Priority which determines position in queue. * Lower is more important. PRI_DEFAULT is zero. */ int m_priority; /** progress data, holding progress calculation related info */ ProgressData m_progData; SourceStatuses_t m_sourceStatus; uint32_t m_error; SourceProgresses_t m_sourceProgress; Timespec m_lastProgressTimestamp; SourceProgresses_t m_lastProgress; bool m_freeze; // syncProgress() and sourceProgress() turn raw data from helper // into usable information on D-Bus server side void syncProgress(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3); void sourceProgress(sysync::TProgressEventEnum type, const std::string &sourceName, SyncMode sourceSyncMode, int32_t extra1, int32_t extra2, int32_t extra3); /** timer for fire status/progress usages */ Timer m_statusTimer; Timer m_progressTimer; /** the total number of sources to be restored */ int m_restoreSrcTotal; /** the number of sources that have been restored */ int m_restoreSrcEnd; /** * Wrapper around useHelperAsync() which sets up the session * to execute a specific operation (sync, command line, ...). */ void runOperationAsync(SessionCommon::RunOperation op, const SuccessCb_t &helperReady, const StringMap &env = StringMap()); /** * A Session can be used for exactly one of the operations. This * is the one. This gets set by the D-Bus method implementation * which triggers the operation. All other D-Bus method * implementations need to check it before allowing an operation * or method call which would conflict or be illegal. */ SessionCommon::RunOperation m_runOperation; /** * If m_runOperation == OP_CMDLINE, then we need further information * from the helper about the actual operation. We get that information * via a sync progress signal with event == PEV_CUSTOM_START. */ SessionCommon::RunOperation m_cmdlineOp; // parameters from syncExtended() std::string m_syncMode; StringMap m_syncEnv; typedef std::map SyncSourceReports; static void StoreSyncSourceReport(SyncSourceReports &reports, const std::string &name, const SyncSourceReport &report) { reports[name] = report; } /** Recorded during a sync for getSyncSourceReport. */ SyncSourceReports m_syncSourceReports; public: SessionCommon::RunOperation getOperation() const { return m_runOperation; } std::string getSyncMode() const { return m_syncMode; } StringMap getSyncEnv() const { return m_syncEnv; } /** Session.Attach() */ void attach(const GDBusCXX::Caller_t &caller); /** Session.Detach() */ void detach(const GDBusCXX::Caller_t &caller); /** Session.GetStatus() */ void getStatus(std::string &status, uint32_t &error, SourceStatuses_t &sources); /** Session.GetProgress() */ void getAPIProgress(int32_t &progress, APISourceProgresses_t &sources); /** Internal, with more information. */ void getProgress(int32_t &progress, SourceProgresses_t &sources); /** Timestamp is set each time that m_progressSignal is triggered. */ Timespec getLastProgressTimestamp() const { return m_lastProgressTimestamp; } /** SourceProgresses_t is set each time that m_progressSignal is triggered. */ void getLastProgress(Session::SourceProgresses_t &progress) const { progress = m_lastProgress; } /** Session.Restore() */ void restore(const string &dir, bool before, const std::vector &sources); void restore2(const string &dir, bool before, const std::vector &sources); /** Session.checkPresence() */ void checkPresence (string &status); /** Session.Execute() */ void execute(const vector &args, const map &vars); void execute2(const vector &args, const map &vars); private: /** * Must be called each time that properties changing the * overall status are changed (m_syncStatus, m_error, m_sourceStatus). * Ensures that the corresponding D-Bus signal is sent. * * Doesn't always send the signal immediately, because often it is * likely that more status changes will follow shortly. To ensure * that the "final" status is sent, call with flush=true. * * @param flush force sending the current status */ void fireStatus(bool flush = false); /** like fireStatus() for progress information */ void fireProgress(bool flush = false); /** Session.StatusChanged */ GDBusCXX::EmitSignal3 emitStatus; /** Session.ProgressChanged */ GDBusCXX::EmitSignal2 emitProgress; public: boost::signals2::signal m_statusSignal; boost::signals2::signal m_progressSignal; /** * Sets minimum period of time in milliseconds between progress * signals. Events coming to short after the previous one get * skipped, to ensure that if an event gets emitted, it gets * emitted at the time of the change. * * There is no guarantee that progress can be emitted very * frequently (say, every second). In practice it gets updated at * the end of processing each SyncML message. */ void setProgressTimeout(unsigned long ms) { m_progressTimer.setTimeout(ms); } /** * Sessions must always be held in a shared pointer * because some operations depend on that. This * constructor function here ensures that and * also adds a weak pointer to the instance itself, * so that it can create more shared pointers as * needed. */ static boost::shared_ptr createSession(Server &server, const std::string &peerDeviceID, const std::string &config_name, const std::string &session, const std::vector &flags = std::vector()); /** * automatically marks the session as completed before deleting it */ ~Session(); /** * explicitly mark an idle session as completed, even if it doesn't * get deleted yet (exceptions not expected by caller) */ void done(bool success) throw () { doneCb(success); } private: Session(Server &server, const std::string &peerDeviceID, const std::string &config_name, const std::string &session, const std::vector &flags = std::vector()); boost::weak_ptr m_me; boost::shared_ptr m_passwordRequest; void passwordRequest(const std::string &descr, const ConfigPasswordKey &key); void sendViaConnection(const GDBusCXX::DBusArray buffer, const std::string &type, const std::string &url); void shutdownConnection(); void storeMessage(const GDBusCXX::DBusArray &message, const std::string &type); void connectionState(const std::string &error); /** * Sends all messages via D-Bus, as if they came from the session * helper. To be activated only temporarily while executing code * in the server which is related to the session. */ virtual void messagev(const MessageOptions &options, const char *format, va_list args); public: enum { PRI_CMDLINE = -10, PRI_DEFAULT = 0, PRI_CONNECTION = 10, PRI_AUTOSYNC = 20 }; /** * Default priority is 0. Higher means less important. */ void setPriority(int priority) { m_priority = priority; } int getPriority() const { return m_priority; } bool isServerAlerted() const { return m_serverAlerted; } void setServerAlerted(bool serverAlerted) { m_serverAlerted = serverAlerted; } void initServer(SharedBuffer data, const std::string &messageType); void setStubConnection(const boost::shared_ptr c) { m_connection = c; m_useConnection = c; } boost::weak_ptr getStubConnection() { return m_connection; } bool useStubConnection() { return m_useConnection; } /** * After the connection closes, the Connection instance is * destructed immediately. This is necessary so that the * corresponding cleanup can remove all other classes * only referenced by the Connection. * * This leads to the problem that an active sync cannot * query the final error code of the connection. This * is solved by setting a generic error code here when * the sync starts and overwriting it when the connection * closes. */ void setStubConnectionError(const std::string &error) { m_connectionError = error; } std::string getStubConnectionError() { return m_connectionError; } Server &getServer() { return ReadOperations::m_server; } std::string getConfigName() { return m_configName; } std::string getSessionID() const { return m_sessionID; } std::string getPeerDeviceID() const { return m_peerDeviceID; } /** Session.GetFlags() */ std::vector getFlags() { return m_flags; } /** Session.GetConfigName() */ std::string getNormalConfigName() { return SyncConfig::normalizeConfigString(m_configName); } /** Session.SetConfig() */ void setConfig(bool update, bool temporary, const ReadOperations::Config_t &config); /** Session.SetNamedConfig() */ void setNamedConfig(const std::string &configName, bool update, bool temporary, const ReadOperations::Config_t &config); /** Session.Sync() */ void sync(const std::string &mode, const SessionCommon::SourceModes_t &sourceModes) { syncExtended(mode, sourceModes, StringMap()); } void syncExtended(const std::string &mode, const SessionCommon::SourceModes_t &sourceModes, const StringMap &env); /** * finish the work started by sync once helper is ready (invoked * by useHelperAsync() and thus may throw exceptions) */ void sync2(const std::string &mode, const SessionCommon::SourceModes_t &sourceModes); /** Session.Abort() */ void abort(); /** abort active session, trigger result once done */ void abortAsync(const SimpleResult &result); /** Session.Suspend() */ void suspend(); /** Change freeze state, trigger result once done. */ void setFreezeAsync(bool freeze, const Result &result); bool getFreeze() const { return m_freeze; } /** * step info for engine: whether the engine is blocked by something * If yes, 'waiting' will be appended as specifiers in the status string. * see GetStatus documentation. */ void setWaiting(bool isWaiting); SyncStatus getSyncStatus() const { return m_syncStatus; } /** session was just activated */ typedef boost::signals2::signal SessionActiveSignal_t; SessionActiveSignal_t m_sessionActiveSignal; /** sync is successfully started */ typedef boost::signals2::signal SyncSuccessStartSignal_t; SyncSuccessStartSignal_t m_syncSuccessStartSignal; /** sync completed (may have failed) */ typedef boost::signals2::signal DoneSignal_t; DoneSignal_t m_doneSignal; /** a source was synced, emitted multiple times during a multi-cycle sync */ typedef boost::signals2::signal SourceSyncedSignal_t; SourceSyncedSignal_t m_sourceSynced; /** gets latest SyncSourceReport of a source, returns false if none available yet */ bool getSyncSourceReport(const std::string &sourceName, SyncSourceReport &report) const; /** * Called by server when the session is ready to run. * Only the session itself can deactivate itself. */ void activateSession(); /** * Called by server when it has a password response for the * session. The session ensures that it only has one pending * request at a time, so these parameters are enough to identify * the request. */ void passwordResponse(bool timedOut, bool aborted, const std::string &password); void setRemoteInitiated (bool remote) { m_remoteInitiated = remote;} private: /** set m_syncFilter and m_sourceFilters to config */ virtual bool setFilters(SyncConfig &config); void dbusResultCb(const std::string &operation, bool success, const SyncReport &report, const std::string &error) throw(); void setFreezeDone(bool changed, const std::string &error, bool freeze, const Result &result); /** * to be called inside a catch() clause: returns error for any * pending D-Bus method and then calls doneCb() */ void failureCb() throw(); /** * explicitly mark the session as completed, even if it doesn't * get deleted yet (invoked directly or indirectly from event * loop and thus must not throw exceptions) * * @param success if false, then ensure that m_error is set * before finalizing the session * @param report valid only in case of success */ void doneCb(bool success, const SyncReport &report = SyncReport()) throw(); }; SE_END_CXX #endif // SESSION_H syncevolution-1.5/src/dbus/server/notification-backend-base.h0000644000373300001540000000231012326412403025675 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_BACKEND_BASE_H #define __NOTIFICATION_BACKEND_BASE_H #include "syncevo/declarations.h" #include SE_BEGIN_CXX class NotificationBackendBase { public: virtual bool init() = 0; virtual void publish(const std::string& summary, const std::string& body, const std::string& viewParams = std::string()) = 0; }; SE_END_CXX #endif syncevolution-1.5/src/dbus/server/notification-manager.h0000644000373300001540000000347012326412403025020 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_MANAGER_H #define __NOTIFICATION_MANAGER_H #include "notification-manager-base.h" #include "syncevo/declarations.h" #include SE_BEGIN_CXX template class NotificationManager : public NotificationManagerBase { public: NotificationManager(); virtual ~NotificationManager(); bool init(); void publish(const std::string& summary, const std::string& body, const std::string& viewParams = std::string()); private: T m_backend; }; template NotificationManager::NotificationManager() { } template NotificationManager::~NotificationManager() { } template bool NotificationManager::init() { return m_backend.init(); } template void NotificationManager::publish(const std::string& summary, const std::string& body, const std::string& viewParams) { m_backend.publish(summary, body, viewParams); } SE_END_CXX #endif syncevolution-1.5/src/dbus/server/notification-manager-base.h0000644000373300001540000000306412326412403025727 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef __NOTIFICATION_MANAGER_BASE_H #define __NOTIFICATION_MANAGER_BASE_H #include "syncevo/declarations.h" #include SE_BEGIN_CXX class NotificationManagerBase { public: /** Initializes the backend. */ virtual bool init() { return true; } /** Publishes the notification through the backend. * @param summary The summary of the notification. * @param body The main content of the notification. * @param viewParams Parameters used by sync-ui (opened when the * notification activated. */ virtual void publish(const std::string& summary, const std::string& body, const std::string& viewParams = std::string()) {} }; SE_END_CXX #endif syncevolution-1.5/src/dbus/server/auto-term.h0000644000373300001540000001223712326412403022640 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef AUTOTERM_H #define AUTOTERM_H #include #include SE_BEGIN_CXX /** * Automatic termination and track clients * The dbus server will automatic terminate once it is idle in a given time. * If any attached clients or connections, it never terminate. * Once no actives, timer is started to detect the time of idle. * Note that there will be less-than TERM_INTERVAL inaccuracy in seconds, * that's because we do check every TERM_INTERVAL seconds. */ class AutoTerm { GMainLoop *m_loop; bool &m_shutdownRequested; int m_refs; time_t m_interval; guint m_checkSource; time_t m_lastUsed; /** * This callback is called as soon as we might have to terminate. * If it finds that the server has been used in the meantime, it * will simply set another timeout and check again later. */ static gboolean checkCallback(gpointer data) { AutoTerm *at = static_cast(data); if (!at->m_refs) { // currently idle, but also long enough? time_t now = time(NULL); if (at->m_lastUsed + at->m_interval <= now) { // yes, shut down event loop and daemon SE_LOG_DEBUG(NULL, "terminating because not in use and idle for more than %ld seconds", (long)at->m_interval); at->m_shutdownRequested = true; g_main_loop_quit(at->getLoop()); } else { // check again later SE_LOG_DEBUG(NULL, "not terminating because last used %ld seconds ago, check again in %ld seconds", (long)(now - at->m_lastUsed), (long)(at->m_lastUsed + at->m_interval - now)); at->m_checkSource = g_timeout_add_seconds(at->m_lastUsed + at->m_interval - now, checkCallback, data); } } else { SE_LOG_DEBUG(NULL, "not terminating, not renewing timeout because busy"); } // always remove the current timeout, its job is done return FALSE; } public: /** * constructor * If interval is less than 0, it means 'unlimited' and never terminate */ AutoTerm(GMainLoop *loop, bool &shutdownRequested, int interval) : m_loop(loop), m_shutdownRequested(shutdownRequested), m_refs(0), m_checkSource(0), m_lastUsed(0) { if (interval <= 0) { m_interval = 0; // increasing reference counts prevents shutdown forever ref(); } else { m_interval = interval; } reset(); } ~AutoTerm() { if (m_checkSource) { g_source_remove(m_checkSource); } } /** access to the GMainLoop. */ GMainLoop *getLoop() { return m_loop; } //increase the actives objects void ref(int refs = 1) { m_refs += refs; reset(); } //decrease the actives objects void unref(int refs = 1) { m_refs -= refs; if(m_refs <= 0) { m_refs = 0; } reset(); } /** * To be called each time the server interacts with a client, * which includes adding or removing a client. If necessary, * this installs a timeout to stop the daemon when it has been * idle long enough. */ void reset() { if (m_refs > 0) { // in use, don't need timeout if (m_checkSource) { SE_LOG_DEBUG(NULL, "deactivating idle termination because in use"); g_source_remove(m_checkSource); m_checkSource = 0; } } else { // An already active timeout will trigger at the chosen time, // then notice that the server has been used in the meantime and // reset the timer. Therefore we don't have to remove it. m_lastUsed = time(NULL); if (!m_checkSource) { SE_LOG_DEBUG(NULL, "activating idle termination in %ld seconds because idle", m_interval); m_checkSource = g_timeout_add_seconds(m_interval, checkCallback, static_cast(this)); } } } }; SE_END_CXX #endif // AUTOTERM_H syncevolution-1.5/src/dbus/server/resource.h0000644000373300001540000000176412326412403022555 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef RESOURCE_H #define RESOURCE_H SE_BEGIN_CXX /** * Anything that can be owned by a client, like a connection * or session. */ class Resource { public: virtual ~Resource() {} }; SE_END_CXX #endif // RESOURCE_H syncevolution-1.5/src/dbus/server/restart.h0000644000373300001540000000427212326412403022407 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef RESTART_H #define RESTART_H #include #include #include #include #include #include SE_BEGIN_CXX /** * Encapsulates startup environment from main() and can do execve() * with it later on. Assumes that argv[0] is the executable to run. */ class Restart { std::vector m_argv; std::vector m_env; void saveArray(std::vector &array, char **p) { while(*p) { array.push_back(*p); p++; } } const char **createArray(const std::vector &array) { const char **res = new const char *[(array.size() + 1)]; size_t i; for (i = 0; i < array.size(); i++) { res[i] = array[i].c_str(); } res[i] = NULL; return res; } public: Restart(char **argv, char **env) { saveArray(m_argv, argv); saveArray(m_env, env); } void restart() { boost::scoped_array argv(createArray(m_argv)); boost::scoped_array env(createArray(m_env)); LogRedirect::reset(); if (execve(argv[0], (char *const *)argv.get(), (char *const *)env.get())) { SE_THROW(StringPrintf("restarting syncevo-dbus-server failed: %s", strerror(errno))); } } }; SE_END_CXX #endif // RESTART_H syncevolution-1.5/src/dbus/server/source-progress.h0000644000373300001540000000605112326412403024062 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SOURCE_PROGRESS_H #define SOURCE_PROGRESS_H #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX /** Part of the D-Bus API, see GetProgress() and ProgressChanged. */ struct APISourceProgress { APISourceProgress() : m_phase(""), m_prepareCount(-1), m_prepareTotal(-1), m_sendCount(-1), m_sendTotal(-1), m_receiveCount(-1), m_receiveTotal(-1) {} std::string m_phase; int32_t m_prepareCount, m_prepareTotal; int32_t m_sendCount, m_sendTotal; int32_t m_receiveCount, m_receiveTotal; }; /** Used internally. */ struct SourceProgress : public APISourceProgress { SourceProgress() : m_added(0), m_updated(0), m_deleted(0) {} // Statistics from actual SyncSource operations. May differ // from item operations processed and counted by the sync engine. int32_t m_added, m_updated, m_deleted; }; SE_END_CXX namespace GDBusCXX { using namespace SyncEvo; template<> struct dbus_traits : public dbus_struct_traits > > > > > > > {}; template<> struct dbus_traits : public dbus_struct_traits > > > > {}; } #endif // SOURCE_PROGRESS_H syncevolution-1.5/src/dbus/server/source-status.h0000644000373300001540000000332312326412403023540 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SOURCE_STATUS_H #define SOURCE_STATUS_H #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX struct SourceStatus { SourceStatus() : m_mode("none"), m_status("idle"), m_error(0) {} void set(const std::string &mode, const std::string &status, uint32_t error) { m_mode = mode; m_status = status; m_error = error; } std::string m_mode; std::string m_status; uint32_t m_error; }; SE_END_CXX namespace GDBusCXX { using namespace SyncEvo; template<> struct dbus_traits : public dbus_struct_traits > > > {}; } #endif // SOURCE_STATUS_H syncevolution-1.5/src/dbus/server/timeout.h0000644000373300001540000001134012326412403022403 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef TIMEOUT_H #define TIMEOUT_H #include #include #include #include #include SE_BEGIN_CXX /** * Utility class which makes it easier to work with g_timeout_add_seconds(). * Instantiate this class with a specific callback. Use boost::bind() * to attach specific parameters to that callback. Then activate * the timeout. Destructing this class will automatically remove * the timeout and thus ensure that it doesn't trigger without * valid parameters. * * This class is thread-safe. If called by a thread different from the * main thread, the callback will happen inside the main thread. Use * g_main_context_wakeup() to ensure that the main thread notices the * new callback right away. */ class Timeout : boost::noncopyable { guint m_tag; boost::function m_callback; public: enum { PRIORITY_HIGH = G_PRIORITY_HIGH, PRIORITY_DEFAULT = G_PRIORITY_DEFAULT, PRIORITY_HIGH_IDLE = G_PRIORITY_HIGH_IDLE, PRIORITY_DEFAULT_IDLE = G_PRIORITY_DEFAULT_IDLE, PRIORITY_LOW = G_PRIORITY_LOW }; Timeout() : m_tag(0) { } ~Timeout() { if (m_tag) { g_source_remove(m_tag); } } /** * call the callback at regular intervals until it returns false * * @param seconds a value < 0 runs the function as soon as the process is idle, * otherwise in the specified amount of time */ void activate(int seconds, const boost::function &callback, int priority = G_PRIORITY_DEFAULT) { deactivate(); m_callback = callback; m_tag = seconds < 0 ? g_idle_add(triggered, static_cast(this)) : g_timeout_add_seconds(seconds, triggered, static_cast(this)); if (!m_tag) { SE_THROW("g_timeout_add_seconds() or g_idle_add() failed"); } } void activate(const boost::function &idleCallback, int priority = G_PRIORITY_DEFAULT_IDLE) { activate(-1, idleCallback, priority); } /** * invoke the callback once */ void runOnce(int seconds, const boost::function &callback, int priority = G_PRIORITY_DEFAULT) { activate(seconds, boost::bind(&Timeout::once, callback), priority); } void runOnce(const boost::function &idleCallback, int priority = G_PRIORITY_DEFAULT) { runOnce(-1, idleCallback, priority); } /** * stop calling the callback, drop callback */ void deactivate() { if (m_tag) { g_source_remove(m_tag); m_tag = 0; } m_callback = 0; } /** true iff active */ operator bool () const { return m_tag != 0; } private: static gboolean triggered(gpointer data) throw () { Timeout *me = static_cast(data); bool runAgain = false; uint tag = me->m_tag; try { // Be extra careful and don't trigger a deactivated callback. if (me->m_callback) { runAgain = me->m_callback(); } } catch (...) { // Something unexpected went wrong, can only shut down. Exception::handle(HANDLE_EXCEPTION_FATAL); } if (!runAgain && // Returning false will automatically deactivate the source, remember that. me->m_tag == tag // Beware that the callback may have already reused the Timeout instance. // In that case, we must not reset the new tag and callback. ) { me->m_tag = 0; me->m_callback = 0; } return runAgain; } static bool once(const boost::function &callback) { callback(); return false; } }; SE_END_CXX #endif // TIMEOUT_H syncevolution-1.5/src/dbus/server/timer.h0000644000373300001540000000374112326412403022043 0ustar00nightlynightly00000000000000 /* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef TIMER_H #define TIMER_H #include #include #include #include SE_BEGIN_CXX /** * A timer helper to check whether now is timeout according to * user's setting. Timeout is calculated in milliseconds */ class Timer { Timespec m_startTime; ///< start time unsigned long m_timeoutMs; ///< timeout in milliseconds, set by user public: /** * constructor * @param timeoutMs timeout in milliseconds */ Timer(unsigned long timeoutMs = 0) : m_timeoutMs(timeoutMs) { reset(); } /** * Change the default timeout. */ void setTimeout(unsigned long ms) { m_timeoutMs = ms; } /** * reset the timer and mark start time as current time */ void reset() { m_startTime.resetMonotonic(); } /** * check whether it is timeout */ bool timeout() { return timeout(m_timeoutMs); } /** * check whether the duration timer records is longer than the given duration */ bool timeout(unsigned long timeoutMs) { return (Timespec::monotonic() - m_startTime).duration() * 1000 >= timeoutMs; } }; SE_END_CXX #endif // TIMER_H syncevolution-1.5/src/dbus/server/notification-backend-noop.cpp0000644000373300001540000000221012326412403026270 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "notification-backend-noop.h" SE_BEGIN_CXX NotificationBackendNoop::NotificationBackendNoop() { } NotificationBackendNoop::~NotificationBackendNoop() { } bool NotificationBackendNoop::init() { return true; } void NotificationBackendNoop::publish( const std::string& summary, const std::string& body, const std::string& viewParams) { } SE_END_CXX syncevolution-1.5/src/dbus/server/notification-backend-libnotify.cpp0000644000373300001540000001377312326412403027334 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if HAS_NOTIFY #include "notification-backend-libnotify.h" #include "syncevo/util.h" #include "syncevo/GLibSupport.h" #include #include #include #include #include #ifdef NOTIFY_COMPATIBILITY # include #endif SE_BEGIN_CXX #ifdef NOTIFY_COMPATIBILITY /** * set to real old C notify_notification_new() (with widget pointer) or new one (without); * because of the x86/AMD64 calling conventions, calling the newer function with * one extra parameter is okay */ gboolean (*notify_init)(const char *app_name); GList *(*notify_get_server_caps)(void); NotifyNotification *(*notify_notification_new)(const char *summary, const char *body, const char *icon, void *widget); void (*notify_notification_add_action)(NotifyNotification *notification, const char *action, const char *label, NotifyActionCallback callback, gpointer user_data, GFreeFunc free_func); void (*notify_notification_clear_actions)(NotifyNotification *notification); gboolean (*notify_notification_close)(NotifyNotification *notification, GError **error); gboolean (*notify_notification_show)(NotifyNotification *notification, GError **error); static bool NotFound(const char *func) { SE_LOG_DEBUG(NULL, "%s: not found", func); return false; } #endif NotificationBackendLibnotify::NotificationBackendLibnotify() : m_initialized(false), m_acceptsActions(false), m_notification(NULL) { } NotificationBackendLibnotify::~NotificationBackendLibnotify() { } void NotificationBackendLibnotify::notifyAction( NotifyNotification *notify, gchar *action, gpointer userData) { if(boost::iequals(action, "view")) { pid_t pid; if((pid = fork()) == 0) { // search sync-ui from $PATH if(execlp("sync-ui", "sync-ui", (const char*)0) < 0) { exit(0); } } } // if dismissed, ignore. } bool NotificationBackendLibnotify::init() { #ifdef NOTIFY_COMPATIBILITY void *dlhandle = NULL; int i; for (i = 1; i <= 4; i++) { dlhandle = dlopen(StringPrintf("libnotify.so.%d", i).c_str(), RTLD_LAZY|RTLD_GLOBAL); if (!dlhandle) { SE_LOG_DEBUG(NULL, "failed to load libnotify.so.%d: %s", i, dlerror()); } else { break; } } if (!dlhandle) { return false; } #define LOOKUP(_x) ((_x = reinterpret_cast(dlsym(dlhandle, #_x))) || \ NotFound(#_x)) if (!LOOKUP(notify_init) || !LOOKUP(notify_get_server_caps) || !LOOKUP(notify_notification_new) || !LOOKUP(notify_notification_add_action) || !LOOKUP(notify_notification_clear_actions) || !LOOKUP(notify_notification_close) || !LOOKUP(notify_notification_show)) { return false; } SE_LOG_DEBUG(NULL, "using libnotify.so.%d", i); #endif m_initialized = notify_init("SyncEvolution"); if(m_initialized) { GStringListFreeCXX list(notify_get_server_caps()); BOOST_FOREACH (const char *cap, list) { if(boost::iequals(cap, "actions")) { m_acceptsActions = true; } } return true; } return false; } void NotificationBackendLibnotify::publish( const std::string& summary, const std::string& body, const std::string& viewParams) { if(!m_initialized) return; if(m_notification) { notify_notification_clear_actions(m_notification); notify_notification_close(m_notification, NULL); } #ifndef NOTIFY_CHECK_VERSION # define NOTIFY_CHECK_VERSION(_x,_y,_z) 0 #endif #if !NOTIFY_CHECK_VERSION(0,7,0) || defined(NOTIFY_COMPATIBILITY) m_notification = notify_notification_new(summary.c_str(), body.c_str(), NULL, NULL); #else m_notification = notify_notification_new(summary.c_str(), body.c_str(), NULL); #endif //if actions are not supported, don't add actions //An example is Ubuntu Notify OSD. It uses an alert box //instead of a bubble when a notification is appended with actions. //the alert box won't be closed until user inputs. //so disable it in case of no support of actions if(m_acceptsActions) { notify_notification_add_action(m_notification, "view", _("View"), notifyAction, (gpointer)viewParams.c_str(), NULL); // Use "default" as ID because that is what mutter-moblin // recognizes: it then skips the action instead of adding it // in addition to its own "Dismiss" button (always added). notify_notification_add_action(m_notification, "default", _("Dismiss"), notifyAction, (gpointer)viewParams.c_str(), NULL); } notify_notification_show(m_notification, NULL); } SE_END_CXX #endif // HAS_NOTIFY syncevolution-1.5/src/dbus/server/notification-backend-mlite.cpp0000644000373300001540000000361212326412403026436 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef HAS_MLITE #include "notification-backend-mlite.h" #include #include SE_BEGIN_CXX /// TODO: these should really be in a common place. #define SYNCEVOLUTION_SERVICE_NAME "org.syncevolution" #define SYNCEVOLUTION_OBJECT_PATH "/org/syncevolution/Server" #define SYNCEVOLUTION_INTERFACE "org.syncevolution.Server" NotificationBackendMLite::NotificationBackendMLite() { } NotificationBackendMLite::~NotificationBackendMLite() { } bool NotificationBackendMLite::init() { return true; } void NotificationBackendMLite::publish( const std::string& summary, const std::string& body, const std::string& viewParams) { MNotification n ("Sync"); n.setSummary(QString::fromStdString(summary)); n.setBody(QString::fromStdString(body)); n.setImage("image://themedimage/icons/settings/sync"); MRemoteAction action(SYNCEVOLUTION_SERVICE_NAME, SYNCEVOLUTION_OBJECT_PATH, SYNCEVOLUTION_INTERFACE, "NotificationAction"); n.setAction(action); n.publish(); } SE_END_CXX #endif syncevolution-1.5/src/dbus/server/notification-manager-factory.cpp0000644000373300001540000000401512326412403027014 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "notification-manager-factory.h" #include "notification-backend-noop.h" #include "notification-backend-mlite.h" #include "notification-backend-libnotify.h" #include "notification-manager.h" #include SE_BEGIN_CXX #define SYNC_UI_PATH "/usr/bin/sync-ui" boost::shared_ptr NotificationManagerFactory::createManager() { boost::shared_ptr mgr; /* Detect what kind of manager we need: if /usr/bin/sync-ui * doesn't exists, we shall use the MLite backend; otherwise, if * libnotify is enabled, we shall use the libnotify backend; * if everything fails, then we'll use the no-op backend. */ if(access(SYNC_UI_PATH, F_OK) != 0) { // i.e. it does not exist #if defined(HAS_MLITE) mgr.reset(new NotificationManager()); #elif defined(HAS_NOTIFY) mgr.reset(new NotificationManager()); #endif } else { // it exists #if defined(HAS_NOTIFY) mgr.reset(new NotificationManager()); #endif } // Fallback if no manager was created if(mgr.get() == 0) mgr.reset(new NotificationManager()); return mgr; } SE_END_CXX syncevolution-1.5/src/dbus/server/auto-sync-manager.cpp0000644000373300001540000005255612326412403024620 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "auto-sync-manager.h" #include "session.h" #include "server.h" #include "dbus-callbacks.h" #include "presence-status.h" #include #include #include SE_BEGIN_CXX AutoSyncManager::AutoSyncManager(Server &server) : m_server(server), m_autoTermLocked(false) { } static void updatePresence(Timespec *t, bool present) { *t = present ? Timespec::monotonic() : Timespec(); } boost::shared_ptr AutoSyncManager::createAutoSyncManager(Server &server) { boost::shared_ptr result(new AutoSyncManager(server)); result->m_me = result; result->init(); // update cached information about a config each time it changes server.m_configChangedSignal.connect(Server::ConfigChangedSignal_t::slot_type(&AutoSyncManager::initConfig, result.get(), _1).track(result)); // monitor running sessions server.m_newSyncSessionSignal.connect(Server::NewSyncSessionSignal_t::slot_type(&AutoSyncManager::sessionStarted, result.get(), _1).track(result)); // Keep track of the time when a transport became online. As with // time of last sync, we are pessimistic here and assume that the // transport just now became available. PresenceStatus &p = server.getPresenceStatus(); Timespec now = Timespec::monotonic(); if (p.getBtPresence()) { result->m_btStartTime = now; } p.m_btPresenceSignal.connect(PresenceStatus::PresenceSignal_t::slot_type(updatePresence, &result->m_btStartTime, _1).track(result)); if (p.getHttpPresence()) { result->m_httpStartTime = now; } p.m_httpPresenceSignal.connect(PresenceStatus::PresenceSignal_t::slot_type(updatePresence, &result->m_httpStartTime, _1).track(result)); return result; } void AutoSyncManager::init() { m_notificationManager = NotificationManagerFactory::createManager(); m_notificationManager->init(); m_peerMap.clear(); SyncConfig::ConfigList list = SyncConfig::getConfigs(); BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, list) { initConfig(server.first); } } void AutoSyncManager::initConfig(const std::string &configName) { SE_LOG_DEBUG(NULL, "auto sync: updating info about config %s", configName.c_str()); if (configName.empty()) { // Anything might have changed. Check all configs we know // about (might have been removed) and all existing configs // (might have been modified). std::set configs; BOOST_FOREACH (const PeerMap::value_type &entry, m_peerMap) { const std::string &configName = entry.first; configs.insert(configName); } BOOST_FOREACH (const StringPair &entry, SyncConfig::getConfigs()) { const std::string &configName = entry.first; configs.insert(configName); } BOOST_FOREACH (const std::string &configName, configs) { if (!configName.empty()) { initConfig(configName); } } // TODO: only call schedule() once in this case, instead // once per recursive initConfig(). } // TODO: once we depend on shared settings, remember to check // all other configs which share the same set of settings. // Not currently the case. // Create anew or update, directly in map. Never remove // old entries, because we want to keep the m_lastSyncTime // in cases where configs get removed and recreated. boost::shared_ptr &task = m_peerMap[configName]; if (!task) { task.reset(new AutoSyncTask(configName)); // We should check past sessions here. Instead we assume // the "worst" case, which is that the session ran zero // seconds ago. This has the additional benefit that we // don't run automatic sync sessions directly after // starting up (the system or syncevo-dbus-server). task->m_lastSyncTime = Timespec::monotonic(); } SyncConfig config (configName); if (config.exists()) { std::vector urls = config.getSyncURL(); std::string autoSync = config.getAutoSync(); //enable http and bt? bool http = false, bt = false; bool any = false; if (autoSync.empty() || boost::iequals(autoSync, "0") || boost::iequals(autoSync, "f")) { http = false; bt = false; any = false; } else if (boost::iequals(autoSync, "1") || boost::iequals(autoSync, "t")) { http = true; bt = true; any = true; } else { BOOST_FOREACH(std::string op, boost::tokenizer< boost::char_separator >(autoSync, boost::char_separator(","))) { if(boost::iequals(op, "http")) { http = true; } else if(boost::iequals(op, "obex-bt")) { bt = true; } } } task->m_peerName = config.getPeerName(); if (task->m_peerName.empty()) { task->m_peerName = configName; } task->m_interval = config.getAutoSyncInterval(); task->m_delay = config.getAutoSyncDelay(); task->m_remoteDeviceId = config.getRemoteDevID(); task->m_notifyLevel = config.getNotifyLevel(); // Assume that whatever change was made might have resolved // the past problem -> allow auto syncing again. task->m_permanentFailure = false; SE_LOG_DEBUG(NULL, "auto sync: %s: auto sync '%s', %s, %s, %d seconds repeat interval, %d seconds online delay", configName.c_str(), autoSync.c_str(), bt ? "Bluetooth" : "no Bluetooth", http ? "HTTP" : "no HTTP", task->m_interval, task->m_delay); task->m_urls.clear(); BOOST_FOREACH(std::string url, urls) { AutoSyncTask::Transport transport = AutoSyncTask::NEEDS_OTHER; // fallback for unknown sync URL if (boost::istarts_with(url, "http")) { transport = AutoSyncTask::NEEDS_HTTP; } else if (boost::istarts_with(url, "local")) { // TODO: instead of assuming that local sync needs HTTP, really look into the target config // and determine what the peerType is transport = AutoSyncTask::NEEDS_HTTP; } else if (boost::istarts_with(url, "obex-bt")) { transport = AutoSyncTask::NEEDS_BT; } if((transport == AutoSyncTask::NEEDS_HTTP && http) || (transport == AutoSyncTask::NEEDS_BT && bt) || (transport == AutoSyncTask::NEEDS_OTHER && any)) { task->m_urls.push_back(std::make_pair(transport, url)); SE_LOG_DEBUG(NULL, "auto sync: adding config %s url %s", configName.c_str(), url.c_str()); } } } else { // Just clear urls, which disables auto syncing. task->m_urls.clear(); } bool lock = preventTerm(); if (m_autoTermLocked && !lock) { SE_LOG_DEBUG(NULL, "auto sync: allow auto shutdown"); m_server.autoTermUnref(); m_autoTermLocked = false; } else if (!m_autoTermLocked && lock) { SE_LOG_DEBUG(NULL, "auto sync: prevent auto shutdown"); m_server.autoTermRef(); m_autoTermLocked = true; } // reschedule schedule("initConfig() for " + configName); } void AutoSyncManager::schedule(const std::string &reason) { SE_LOG_DEBUG(NULL, "auto sync: reschedule, %s", reason.c_str()); // idle callback will be (re)set if needed m_idleConnection.disconnect(); if (!preventTerm()) { SE_LOG_DEBUG(NULL, "auto sync: nothing to do"); return; } if (!m_server.isIdle()) { // Only schedule automatic syncs when nothing else is // going on or pending. SE_LOG_DEBUG(NULL, "auto sync: server not idle"); connectIdle(); return; } // Now look for a suitable task that is ready to run. Timespec now = Timespec::monotonic(); BOOST_FOREACH (const PeerMap::value_type &entry, m_peerMap) { const std::string &configName = entry.first; const boost::shared_ptr &task = entry.second; if (task->m_interval <= 0 || // not enabled task->m_permanentFailure) { // don't try again continue; } if (task->m_lastSyncTime + task->m_interval > now) { // Ran too recently, check again in the future. Always // reset timer, because both m_lastSyncTime and m_interval // may have changed. // // Adds two seconds just to be on the safe side and not // wake up again too soon. int seconds = (task->m_lastSyncTime + task->m_interval - now).seconds() + 2; SE_LOG_DEBUG(NULL, "auto sync: %s: interval expires in %ds", configName.c_str(), seconds); task->m_intervalTimeout.runOnce(seconds, boost::bind(&AutoSyncManager::schedule, this, configName + " interval timer")); continue; } std::string readyURL; BOOST_FOREACH (const AutoSyncTask::URLInfo_t::value_type &urlinfo, task->m_urls) { // check m_delay against presence of transport Timespec *starttime = NULL; PresenceStatus::PresenceSignal_t *signal = NULL; Timeout *timeout = NULL; switch (urlinfo.first) { case AutoSyncTask::NEEDS_HTTP: SE_LOG_DEBUG(NULL, "auto sync: %s: %s uses HTTP", configName.c_str(), urlinfo.second.c_str()); starttime = &m_httpStartTime; signal = &m_server.getPresenceStatus().m_httpPresenceSignal; timeout = &task->m_httpTimeout; break; case AutoSyncTask::NEEDS_BT: SE_LOG_DEBUG(NULL, "auto sync: %s: %s uses Bluetooth", configName.c_str(), urlinfo.second.c_str()); starttime = &m_btStartTime; signal = &m_server.getPresenceStatus().m_btPresenceSignal; timeout = &task->m_btTimeout; break; case AutoSyncTask::NEEDS_OTHER: SE_LOG_DEBUG(NULL, "auto sync: %s: %s uses some unknown transport", configName.c_str(), urlinfo.second.c_str()); break; } if (!starttime || // some other transport, assumed to be online, use it (*starttime && // present (task->m_delay <= 0 || *starttime + task->m_delay <= now))) { // present long enough SE_LOG_DEBUG(NULL, "auto sync: %s: ready to run via %s (transport present for %lds > %ds auto sync delay)", configName.c_str(), urlinfo.second.c_str(), starttime ? (long)(*starttime - now).seconds() : -1, task->m_delay); readyURL = urlinfo.second; break; } if (!*starttime) { // check again when it becomes present signal->connect(PresenceStatus::PresenceSignal_t::slot_type(&AutoSyncManager::schedule, this, "presence change").track(m_me)); SE_LOG_DEBUG(NULL, "auto sync: %s: transport for %s not present", configName.c_str(), urlinfo.second.c_str()); } else { // check again after waiting the requested amount of time int seconds = (*starttime + task->m_delay - now).seconds() + 2; SE_LOG_DEBUG(NULL, "auto sync: %s: presence delay of transport for %s expires in %ds", configName.c_str(), urlinfo.second.c_str(), seconds); timeout->runOnce(seconds, boost::bind(&AutoSyncManager::schedule, this, configName + " transport timer")); } } if (!readyURL.empty()) { // Found a task, run it. The session is not attached to any client, // but we keep a pointer to it, so it won't go away. // m_task = task; // Just in case... also done in syncDone() when we detect // that session is completed. m_server.delaySessionDestruction(m_session); task->m_syncSuccessStart = false; m_session = Session::createSession(m_server, task->m_remoteDeviceId, configName, m_server.getNextSession()); // Temporarily set sync URL to the one which we picked above // once the session is active (setConfig() not allowed earlier). ReadOperations::Config_t config; config[""]["syncURL"] = readyURL; m_session->m_sessionActiveSignal.connect(boost::bind(&Session::setConfig, m_session.get(), true, true, config)); // Run sync as soon as it is active. m_session->m_sessionActiveSignal.connect(boost::bind(&Session::sync, m_session.get(), "", SessionCommon::SourceModes_t())); // Now run it. m_session->activate(); m_server.enqueue(m_session); // Reschedule when server is idle again. connectIdle(); return; } } SE_LOG_DEBUG(NULL, "auto sync: nothing to do now"); } void AutoSyncManager::connectIdle() { m_idleConnection = m_server.m_idleSignal.connect(Server::IdleSignal_t::slot_type(&AutoSyncManager::schedule, this, "server is idle").track(m_me)); } void AutoSyncManager::sessionStarted(const boost::shared_ptr &session) { // Do we have a task for this config? std::string configName = session->getConfigName(); PeerMap::iterator it = m_peerMap.find(configName); if (it == m_peerMap.end()) { SE_LOG_DEBUG(NULL, "auto sync: ignore running sync %s without config", configName.c_str()); return; } boost::shared_ptr me = m_me.lock(); if (!me) { SE_LOG_DEBUG(NULL, "auto sync: already destructing, ignore new sync %s", configName.c_str()); return; } const boost::shared_ptr &task = it->second; task->m_lastSyncTime = Timespec::monotonic(); // track permanent failure session->m_doneSignal.connect(Session::DoneSignal_t::slot_type(&AutoSyncManager::anySyncDone, this, task.get(), _1).track(task).track(me)); if (m_session == session) { // Only for our own auto sync session: notify user once session starts successful. // // In the (unlikely) case that the AutoSyncTask gets deleted, the // slot won't get involved, thus skipping user notifications. // Also protects against manager destructing before session. session->m_syncSuccessStartSignal.connect(Session::SyncSuccessStartSignal_t::slot_type(&AutoSyncManager::autoSyncSuccessStart, this, task.get()).track(task).track(me)); // Notify user once session ends, with or without failure. // Same instance tracking as for sync success start. session->m_doneSignal.connect(Session::DoneSignal_t::slot_type(&AutoSyncManager::autoSyncDone, this, task.get(), _1).track(task).track(me)); } } bool AutoSyncManager::preventTerm() { BOOST_FOREACH (const PeerMap::value_type &entry, m_peerMap) { const boost::shared_ptr &task = entry.second; if (task->m_interval > 0 && !task->m_permanentFailure && !task->m_urls.empty()) { // that task might run return true; } } return false; } void AutoSyncManager::autoSyncSuccessStart(AutoSyncTask *task) { task->m_syncSuccessStart = true; SE_LOG_INFO(NULL,"Automatic sync for '%s' has been successfully started.\n", task->m_peerName.c_str()); if (m_server.notificationsEnabled() && task->m_notifyLevel >= SyncConfig::NOTIFY_ALL) { std::string summary = StringPrintf(_("%s is syncing"), task->m_peerName.c_str()); std::string body = StringPrintf(_("We have just started to sync your computer with the %s sync service."), task->m_peerName.c_str()); // TODO: set config information for 'sync-ui' m_notificationManager->publish(summary, body); } } /** * True if the error is likely to go away by itself when continuing * with auto-syncing. This errs on the side of showing notifications * too often rather than not often enough. */ static bool ErrorIsTemporary(SyncMLStatus status) { switch (status) { case STATUS_TRANSPORT_FAILURE: return true; default: // pretty much everying this not temporary return false; } } void AutoSyncManager::autoSyncDone(AutoSyncTask *task, SyncMLStatus status) { SE_LOG_INFO(NULL,"Automatic sync for '%s' has been done.\n", task->m_peerName.c_str()); if (m_server.notificationsEnabled()) { // send a notification to notification server std::string summary, body; if (task->m_syncSuccessStart && status == STATUS_OK) { if (task->m_notifyLevel >= SyncConfig::NOTIFY_ALL) { // if sync is successfully started and done summary = StringPrintf(_("%s sync complete"), task->m_peerName.c_str()); body = StringPrintf(_("We have just finished syncing your computer with the %s sync service."), task->m_peerName.c_str()); //TODO: set config information for 'sync-ui' m_notificationManager->publish(summary, body); } } else if (task->m_syncSuccessStart || !ErrorIsTemporary(status)) { if (task->m_notifyLevel >= SyncConfig::NOTIFY_ERROR) { // if sync is successfully started and has errors, or not started successful with a permanent error // that needs attention summary = StringPrintf(_("Sync problem.")); body = StringPrintf(_("Sorry, there's a problem with your sync that you need to attend to.")); //TODO: set config information for 'sync-ui' m_notificationManager->publish(summary, body); } } } // keep session around to give clients a chance to query it m_server.delaySessionDestruction(m_session); m_session.reset(); } void AutoSyncManager::anySyncDone(AutoSyncTask *task, SyncMLStatus status) { // set "permanently failed" flag according to most recent result task->m_permanentFailure = status != STATUS_OK && !ErrorIsTemporary(status); SE_LOG_DEBUG(NULL, "auto sync: sync session %s done, result %d %s", task->m_configName.c_str(), status, task->m_permanentFailure ? "is a permanent failure" : status == STATUS_OK ? "is success" : "is temporary failure"); } SE_END_CXX syncevolution-1.5/src/dbus/server/bluez-manager.cpp0000644000373300001540000003406012326412403024005 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include "bluez-manager.h" #include "server.h" #include "syncevo/SmartPtr.h" #include #include using namespace GDBusCXX; SE_BEGIN_CXX BluezManager::BluezManager(Server &server) : DBusRemoteObject(!strcmp(getEnv("DBUS_TEST_BLUETOOTH", ""), "none") ? NULL : /* simulate missing Bluez */ GDBusCXX::dbus_get_bus_connection(!strcmp(getEnv("DBUS_TEST_BLUETOOTH", ""), "session") ? "SESSION" : /* use our own Bluez stub */ "SYSTEM" /* use real Bluez */, NULL, true, NULL), "/", "org.bluez.Manager", "org.bluez", true), m_server(server), m_adapterChanged(*this, "DefaultAdapterChanged") { if (getConnection()) { m_done = false; DBusClientCall1 getAdapter(*this, "DefaultAdapter"); getAdapter.start(boost::bind(&BluezManager::defaultAdapterCb, this, _1, _2 )); m_adapterChanged.activate(boost::bind(&BluezManager::defaultAdapterChanged, this, _1)); } else { m_done = true; } } void BluezManager::defaultAdapterChanged(const DBusObject_t &adapter) { m_done = false; //remove devices that belong to this original adapter if(m_adapter) { BOOST_FOREACH(boost::shared_ptr &device, m_adapter->getDevices()) { m_server.removeDevice(device->getMac()); } } string error; defaultAdapterCb(adapter, error); } void BluezManager::defaultAdapterCb(const DBusObject_t &adapter, const string &error) { if(!error.empty()) { SE_LOG_DEBUG(NULL, "Error in calling DefaultAdapter of Interface org.bluez.Manager: %s", error.c_str()); m_done = true; return; } m_adapter.reset(new BluezAdapter(*this, adapter)); } BluezManager::BluezAdapter::BluezAdapter(BluezManager &manager, const string &path) : DBusRemoteObject(manager.getConnection(), path, "org.bluez.Adapter", "org.bluez"), m_manager(manager), m_devNo(0), m_devReplies(0), m_deviceRemoved(*this, "DeviceRemoved"), m_deviceAdded(*this, "DeviceCreated") { DBusClientCall1 > listDevices(*this, "ListDevices"); listDevices.start(boost::bind(&BluezAdapter::listDevicesCb, this, _1, _2)); m_deviceRemoved.activate(boost::bind(&BluezAdapter::deviceRemoved, this, _1)); m_deviceAdded.activate(boost::bind(&BluezAdapter::deviceCreated, this, _1)); } void BluezManager::BluezAdapter::listDevicesCb(const std::vector &devices, const string &error) { if(!error.empty()) { SE_LOG_DEBUG(NULL, "Error in calling ListDevices of Interface org.bluez.Adapter: %s", error.c_str()); checkDone(true); return; } m_devNo = devices.size(); BOOST_FOREACH(const DBusObject_t &device, devices) { boost::shared_ptr bluezDevice(new BluezDevice(*this, device)); m_devices.push_back(bluezDevice); } checkDone(); } void BluezManager::BluezAdapter::deviceRemoved(const DBusObject_t &object) { string address; std::vector >::iterator devIt; for(devIt = m_devices.begin(); devIt != m_devices.end(); ++devIt) { if(boost::equals((*devIt)->getPath(), object)) { address = (*devIt)->m_mac; if((*devIt)->m_reply) { m_devReplies--; } m_devNo--; m_devices.erase(devIt); break; } } m_manager.m_server.removeDevice(address); } void BluezManager::BluezAdapter::deviceCreated(const DBusObject_t &object) { m_devNo++; boost::shared_ptr bluezDevice(new BluezDevice(*this, object)); m_devices.push_back(bluezDevice); } BluezManager::BluezDevice::BluezDevice (BluezAdapter &adapter, const string &path) : GDBusCXX::DBusRemoteObject(adapter.m_manager.getConnection(), path, "org.bluez.Device", "org.bluez"), m_adapter(adapter), m_reply(false), m_propertyChanged(*this, "PropertyChanged") { DBusClientCall1 getProperties(*this, "GetProperties"); getProperties.start(boost::bind(&BluezDevice::getPropertiesCb, this, _1, _2)); m_propertyChanged.activate(boost::bind(&BluezDevice::propertyChanged, this, _1, _2)); } /** * check whether the current device has the PnP Information attribute. */ static bool hasPnpInfoService(const std::vector &uuids) { // The UUID that indicates the PnPInformation attribute is available. static const char * PNPINFOMATION_ATTRIBUTE_UUID = "00001200-0000-1000-8000-00805f9b34fb"; // Note: GetProperties appears to return this list sorted which binary_search requires. if(std::binary_search(uuids.begin(), uuids.end(), PNPINFOMATION_ATTRIBUTE_UUID)) { return true; } return false; } void BluezManager::BluezDevice::checkSyncService(const std::vector &uuids) { static const char * SYNCML_CLIENT_UUID = "00000002-0000-1000-8000-0002ee000002"; bool hasSyncService = false; Server &server = m_adapter.m_manager.m_server; BOOST_FOREACH(const string &uuid, uuids) { //if the device has sync service, add it to the device list if(boost::iequals(uuid, SYNCML_CLIENT_UUID)) { hasSyncService = true; if(!m_mac.empty()) { SyncConfig::DeviceDescription deviceDesc(m_mac, m_name, SyncConfig::MATCH_FOR_SERVER_MODE); server.addDevice(deviceDesc); if(hasPnpInfoService(uuids)) { DBusClientCall1 discoverServices(*this, "DiscoverServices"); static const std::string PNP_INFO_UUID("0x1200"); discoverServices.start(PNP_INFO_UUID, boost::bind(&BluezDevice::discoverServicesCb, this, _1, _2)); } } break; } } // if sync service is not available now, possible to remove device if(!hasSyncService && !m_mac.empty()) { server.removeDevice(m_mac); } } /* * Parse the XML-formatted service record. */ bool extractValuefromServiceRecord(const std::string &serviceRecord, const std::string &attributeId, std::string &attributeValue) { // Find atribute size_t pos = serviceRecord.find(attributeId); // Only proceed if the attribute id was found. if(pos != std::string::npos) { pos = serviceRecord.find("value", pos + attributeId.size()); pos = serviceRecord.find("\"", pos) + 1; int valLen = serviceRecord.find("\"", pos) - pos; attributeValue = serviceRecord.substr(pos, valLen); return true; } return false; } void BluezManager::loadBluetoothDeviceLookupTable() { GError *err = NULL; string filePath(SyncEvolutionDataDir() + "/bluetooth_products.ini"); if(!g_key_file_load_from_file(m_lookupTable.bt_key_file, filePath.c_str(), G_KEY_FILE_NONE, &err)) { SE_LOG_DEBUG(NULL, "%s[%d]: %s - filePath = %s, error = %s", __FILE__, __LINE__, "Bluetooth products file not loaded", filePath.c_str(), err->message); m_lookupTable.isLoaded = false; } else { m_lookupTable.isLoaded = true; } } /* * Get the names of the PnpInformation vendor and product from their * respective ids. At a minimum we need a matching vendor id for this * function to return true. If the product id is not found then we set * it to "", an empty string. */ bool BluezManager::getPnpInfoNamesFromValues(const std::string &vendorValue, std::string &vendorName, const std::string &productValue, std::string &productName) { if(!m_lookupTable.bt_key_file) { // If this is the first invocation we then we need to start watching the loopup table. if (!m_watchedFile) { m_lookupTable.bt_key_file = g_key_file_new(); string filePath(SyncEvolutionDataDir() + "/bluetooth_products.ini"); m_watchedFile = boost::shared_ptr( new GLibNotify(filePath.c_str(), boost::bind(&BluezManager::loadBluetoothDeviceLookupTable, this))); } loadBluetoothDeviceLookupTable(); // Make sure the file was actually loaded if(!m_lookupTable.isLoaded) { return false; } } const char *VENDOR_GROUP = "Vendors"; const char *PRODUCT_GROUP = "Products"; GStringPtr vendor(g_key_file_get_string(m_lookupTable.bt_key_file, VENDOR_GROUP, vendorValue.c_str(), NULL)); if(vendor) { vendorName = vendor.get(); } else { // We at least need a vendor id match. return false; } GStringPtr product(g_key_file_get_string(m_lookupTable.bt_key_file, PRODUCT_GROUP, productValue.c_str(), NULL)); if(product) { productName = product.get(); } else { // If the product is not in the look-up table, the product is // set to an empty string. productName = ""; } return true; } void BluezManager::BluezDevice::discoverServicesCb(const ServiceDict &serviceDict, const string &error) { ServiceDict::const_iterator iter = serviceDict.begin(); if(iter != serviceDict.end()) { std::string serviceRecord = (*iter).second; if(!serviceRecord.empty()) { static const std::string SOURCE_ATTRIBUTE_ID("0x0205"); std::string sourceId; extractValuefromServiceRecord(serviceRecord, SOURCE_ATTRIBUTE_ID, sourceId); // A sourceId of 0x001 indicates that the vendor ID was // assigned by the Bluetooth SIG. // TODO: A sourceId of 0x002, means the vendor id was assigned by // the USB Implementor's forum. We do nothing in this case but // should do that look up as well. if(!boost::iequals(sourceId, "0x0001")) { return; } std::string vendorId, productId; static const std::string VENDOR_ATTRIBUTE_ID ("0x0201"); static const std::string PRODUCT_ATTRIBUTE_ID("0x0202"); extractValuefromServiceRecord(serviceRecord, VENDOR_ATTRIBUTE_ID, vendorId); extractValuefromServiceRecord(serviceRecord, PRODUCT_ATTRIBUTE_ID, productId); std::string vendorName, productName; if (!m_adapter.m_manager.getPnpInfoNamesFromValues(vendorId, vendorName, vendorId + "_" + productId, productName)) { return; } Server &server = m_adapter.m_manager.m_server; SyncConfig::DeviceDescription devDesc; if (server.getDevice(m_mac, devDesc)) { devDesc.m_pnpInformation = boost::shared_ptr( new SyncConfig::PnpInformation(vendorName, productName)); server.updateDevice(m_mac, devDesc); } } } } void BluezManager::BluezDevice::getPropertiesCb(const PropDict &props, const string &error) { m_adapter.m_devReplies++; m_reply = true; if(!error.empty()) { SE_LOG_DEBUG(NULL, "Error in calling GetProperties of Interface org.bluez.Device: %s", error.c_str()); } else { PropDict::const_iterator it = props.find("Name"); if(it != props.end()) { m_name = boost::get(it->second); } it = props.find("Address"); if(it != props.end()) { m_mac = boost::get(it->second); } PropDict::const_iterator uuids = props.find("UUIDs"); if(uuids != props.end()) { const std::vector uuidVec = boost::get >(uuids->second); checkSyncService(uuidVec); } } m_adapter.checkDone(); } void BluezManager::BluezDevice::propertyChanged(const string &name, const boost::variant, string> &prop) { Server &server = m_adapter.m_manager.m_server; if(boost::iequals(name, "Name")) { m_name = boost::get(prop); SyncConfig::DeviceDescription device; if(server.getDevice(m_mac, device)) { device.m_deviceName = m_name; server.updateDevice(m_mac, device); } } else if(boost::iequals(name, "UUIDs")) { const std::vector uuidVec = boost::get >(prop); checkSyncService(uuidVec); } else if(boost::iequals(name, "Address")) { string mac = boost::get(prop); SyncConfig::DeviceDescription device; if(server.getDevice(m_mac, device)) { device.m_deviceId = mac; server.updateDevice(m_mac, device); } m_mac = mac; } } SE_END_CXX syncevolution-1.5/src/dbus/server/client.cpp0000644000373300001540000000432012326412403022526 0ustar00nightlynightly00000000000000 /* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "client.h" #include "session.h" #include "server.h" SE_BEGIN_CXX Client::~Client() { SE_LOG_DEBUG(NULL, "D-Bus client %s is destructing", m_ID.c_str()); // explicitly detach all resources instead of just freeing the // list, so that the special behavior for sessions in detach() is // triggered while (!m_resources.empty()) { detach(m_resources.front().get()); } } void Client::detach(Resource *resource) { for (Resources_t::iterator it = m_resources.begin(); it != m_resources.end(); ++it) { if (it->get() == resource) { if (it->unique()) { // client was the last owner, and thus the session must be idle (otherwise // it would also be referenced as active session) boost::shared_ptr session = boost::dynamic_pointer_cast(*it); if (session) { // give clients a chance to query the session m_server.delaySessionDestruction(session); // allow other sessions to start session->done(false); } } // this will trigger removal of the resource if // the client was the last remaining owner m_resources.erase(it); return; } } SE_THROW_EXCEPTION(InvalidCall, "cannot detach from resource that client is not attached to"); } SE_END_CXX syncevolution-1.5/src/dbus/server/connection.cpp0000664000373300001540000006551012405555067023435 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "server.h" #include "connection.h" #include "client.h" #include #include #include using namespace GDBusCXX; SE_BEGIN_CXX void Connection::failed(const std::string &reason) { SE_LOG_DEBUG(NULL, "Connection %s: failed: %s (old state %s)", m_sessionID.c_str(), reason.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); if (m_failure.empty()) { m_failure = reason; if (m_session) { m_session->setStubConnectionError(reason); } } // notify client abort(); // ensure that state is failed m_state = SessionCommon::FAILED; // tell helper (again) m_statusSignal(reason); // A "failed" connection is dead, no further operations on it // are allowed, in particular not the normal Connection.Close(). // Therefore remove ourselves. // // But don't delete ourselves while some code of the Connection still // runs. Instead let server do that as part of its event loop. boost::shared_ptr c = m_me.lock(); if (c) { m_server.delayDeletion(c); m_server.detach(this); } } std::string Connection::buildDescription(const StringMap &peer) { StringMap::const_iterator desc = peer.find("description"), id = peer.find("id"), trans = peer.find("transport"), trans_desc = peer.find("transport_description"); std::string buffer; buffer.reserve(256); if (desc != peer.end()) { buffer += desc->second; } if (id != peer.end() || trans != peer.end()) { if (!buffer.empty()) { buffer += " "; } buffer += "("; if (id != peer.end()) { buffer += id->second; if (trans != peer.end()) { buffer += " via "; } } if (trans != peer.end()) { buffer += trans->second; if (trans_desc != peer.end()) { buffer += " "; buffer += trans_desc->second; } } buffer += ")"; } return buffer; } static bool IsSyncML(const std::string &messageType) { return messageType == TransportAgent::m_contentTypeSyncML || messageType == TransportAgent::m_contentTypeSyncWBXML; } void Connection::process(const Caller_t &caller, const GDBusCXX::DBusArray &message, const std::string &message_type) { SE_LOG_DEBUG(NULL, "Connection %s: D-Bus client %s sends %lu bytes, %s (old state %s)", m_sessionID.c_str(), caller.c_str(), (unsigned long)message.first, message_type.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); boost::shared_ptr client(m_server.findClient(caller)); if (!client) { SE_THROW("unknown client"); } boost::shared_ptr myself = boost::static_pointer_cast(client->findResource(this)); if (!myself) { SE_THROW("client does not own connection"); } // any kind of error from now on terminates the connection try { switch (m_state) { case SessionCommon::SETUP: { std::string config; std::string peerDeviceID; bool serverMode = false; bool serverAlerted = false; // check message type, determine whether we act // as client or server, choose config if (message_type == "HTTP Config") { // type used for testing, payload is config name config.assign(reinterpret_cast(message.second), message.first); } else if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) { serverAlerted = true; sysync::SanPackage san; if (san.PassSan(const_cast(message.second), message.first, 2) || san.GetHeader()) { // We are very tolerant regarding the content of the message. // If it doesn't parse, try to do something useful anyway. // only for SAN 1.2, for SAN 1.0/1.1 we can not be sure // whether it is a SAN package or a normal sync pacakge if (message_type == TransportAgent::m_contentTypeServerAlertedNotificationDS) { config = "default"; SE_LOG_DEBUG(NULL, "SAN parsing failed, falling back to 'default' config"); } } else { //Server alerted notification case // Extract server ID and match it against a server // configuration. Multiple different peers might use the // same serverID ("PC Suite"), so check properties of the // of our configs first before going back to the name itself. std::string serverID = san.fServerID; SyncConfig::ConfigList servers = SyncConfig::getConfigs(); BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, servers) { SyncConfig conf(server.first); vector urls = conf.getSyncURL(); BOOST_FOREACH (const string &url, urls) { if (url == serverID) { config = server.first; break; } } if (!config.empty()) { break; } } // for Bluetooth transports match against mac address. StringMap::const_iterator id = m_peer.find("id"), trans = m_peer.find("transport"); if (trans != m_peer.end() && id != m_peer.end()) { if (trans->second == "org.openobex.obexd") { m_peerBtAddr = id->second.substr(0, id->second.find("+")); BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, servers) { SyncConfig conf(server.first); vector urls = conf.getSyncURL(); BOOST_FOREACH (string &url, urls){ url = url.substr (0, url.find("+")); SE_LOG_DEBUG(NULL, "matching against %s",url.c_str()); if (url.find ("obex-bt://") ==0 && url.substr(strlen("obex-bt://"), url.npos) == m_peerBtAddr) { config = server.first; break; } } if (!config.empty()){ break; } } } } if (config.empty()) { BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, servers) { if (server.first == serverID) { config = serverID; break; } } } // create a default configuration name if none matched if (config.empty()) { config = serverID+"_"+getCurrentTime(); SE_LOG_DEBUG(NULL, "SAN Server ID '%s' unknown, falling back to automatically created '%s' config", serverID.c_str(), config.c_str()); } SE_LOG_DEBUG(NULL, "SAN sync with config %s", config.c_str()); m_SANContent.reset (new SANContent ()); // extract number of sources int numSources = san.fNSync; int syncType; uint32_t contentType; std::string serverURI; if (!numSources) { SE_LOG_DEBUG(NULL, "SAN message with no datastores, using selected modes"); // Synchronize all known sources with the default mode. if (san.GetNthSync(0, syncType, contentType, serverURI)) { SE_LOG_DEBUG(NULL, "SAN invalid header, using default modes"); } else if (syncType < SYNC_FIRST || syncType > SYNC_LAST) { SE_LOG_DEBUG(NULL, "SAN invalid sync type %d, using default modes", syncType); } else { m_syncMode = PrettyPrintSyncMode(SyncMode(syncType), true); SE_LOG_DEBUG(NULL, "SAN sync mode for all configured datastores: %s", m_syncMode.c_str()); } } else { for (int sync = 1; sync <= numSources; sync++) { if (san.GetNthSync(sync, syncType, contentType, serverURI)) { SE_LOG_DEBUG(NULL, "SAN invalid sync entry #%d", sync); } else if (syncType < SYNC_FIRST || syncType > SYNC_LAST) { SE_LOG_DEBUG(NULL, "SAN invalid sync type %d for entry #%d, ignoring entry", syncType, sync); } else { std::string syncMode = PrettyPrintSyncMode(SyncMode(syncType), true); m_SANContent->m_syncType.push_back (syncMode); m_SANContent->m_serverURI.push_back (serverURI); m_SANContent->m_contentType.push_back (contentType); } } } } // TODO: use the session ID set by the server if non-null } else if (// relaxed checking for XML: ignore stuff like "; CHARSET=UTF-8" IsSyncML(message_type.substr(0, message_type.find(';')))) { // run a new SyncML session as server serverMode = true; if (m_peer.find("config") == m_peer.end() && !m_peer["config"].empty()) { SE_LOG_DEBUG(NULL, "ignoring pre-chosen config '%s'", m_peer["config"].c_str()); } // peek into the data to extract the locURI = device ID, // then use it to find the configuration SyncContext::SyncMLMessageInfo info; info = SyncContext::analyzeSyncMLMessage(reinterpret_cast(message.second), message.first, message_type); if (info.m_deviceID.empty()) { // TODO: proper exception SE_THROW("could not extract LocURI=deviceID from initial message"); } BOOST_FOREACH(const SyncConfig::ConfigList::value_type &entry, SyncConfig::getConfigs()) { SyncConfig peer(entry.first); if (info.m_deviceID == peer.getRemoteDevID()) { config = entry.first; SE_LOG_INFO(NULL, "matched %s against config %s (%s)", info.toString().c_str(), entry.first.c_str(), entry.second.c_str()); // Stop searching. Other peer configs might have the same remoteDevID. // We go with the first one found, which because of the sort order // of getConfigs() ensures that "foo" is found before "foo.old". break; } } if (config.empty()) { // TODO: proper exception SE_THROW(string("no configuration found for ") + info.toString()); } // identified peer, still need to abort previous sessions below peerDeviceID = info.m_deviceID; } else { SE_THROW(StringPrintf("message type '%s' not supported for starting a sync", message_type.c_str())); } // run session as client or server m_state = SessionCommon::PROCESSING; m_session = Session::createSession(m_server, peerDeviceID, config, m_sessionID); m_session->activate(); if (serverMode) { m_session->initServer(SharedBuffer(reinterpret_cast(message.second), message.first), message_type); } m_session->setServerAlerted(serverAlerted); m_session->setPriority(Session::PRI_CONNECTION); m_session->setStubConnection(myself); // this will be reset only when the connection shuts down okay // or overwritten with the error given to us in // Connection::close() m_session->setStubConnectionError("closed prematurely"); // Now abort all earlier sessions, if necessary. The new // session will be enqueued below and thus won't get // killed. It also won't run unless all other sessions // before it terminate, therefore we don't need to check // for success. if (!peerDeviceID.empty()) { // TODO: On failure we should kill the connection (beware, // it might go away before killing completes and/or // fails - need to use shared pointer tracking). // // boost::shared_ptr c = m_me.lock(); // if (!c) { // SE_THROW("internal error: Connection::process() cannot lock its own instance"); // } m_server.killSessionsAsync(peerDeviceID, SimpleResult(SuccessCb_t(), ErrorCb_t())); } m_server.enqueue(m_session); break; } case SessionCommon::PROCESSING: SE_THROW("protocol error: already processing a message"); break; case SessionCommon::WAITING: m_incomingMsg = SharedBuffer(reinterpret_cast(message.second), message.first); m_incomingMsgType = message_type; m_messageSignal(DBusArray(m_incomingMsg.size(), reinterpret_cast(m_incomingMsg.get())), m_incomingMsgType); m_state = SessionCommon::PROCESSING; m_timeout.deactivate(); break; case SessionCommon::FINAL: SE_THROW("protocol error: final reply sent, no further message processing possible"); case SessionCommon::DONE: SE_THROW("protocol error: connection closed, no further message processing possible"); break; case SessionCommon::FAILED: SE_THROW(m_failure); break; default: SE_THROW("protocol error: unknown internal state"); break; } } catch (const std::exception &error) { failed(error.what()); throw; } catch (...) { failed("unknown exception in Connection::process"); throw; } } void Connection::send(const DBusArray buffer, const std::string &type, const std::string &url) { SE_LOG_DEBUG(NULL, "Connection %s: send %lu bytes, %s, %s (old state %s)", m_sessionID.c_str(), (unsigned long)buffer.first, type.c_str(), url.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); if (m_state != SessionCommon::PROCESSING) { SE_THROW_EXCEPTION(TransportException, "cannot send to our D-Bus peer"); } // Change state in advance. If we fail while replying, then all // further resends will fail with the error above. m_state = SessionCommon::WAITING; activateTimeout(); m_incomingMsg = SharedBuffer(); // TODO: turn D-Bus exceptions into transport exceptions StringMap meta; meta["URL"] = url; reply(buffer, type, meta, false, m_sessionID); } void Connection::sendFinalMsg() { SE_LOG_DEBUG(NULL, "Connection %s: shut down (old state %s)", m_sessionID.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); if (m_state == SessionCommon::PROCESSING) { // send final, empty message and wait for close m_state = SessionCommon::FINAL; reply(GDBusCXX::DBusArray(0, 0), "", StringMap(), true, m_sessionID); } } void Connection::close(const Caller_t &caller, bool normal, const std::string &error) { SE_LOG_DEBUG(NULL, "Connection %s: client %s closes connection %s %s%s%s (old state %s)", m_sessionID.c_str(), caller.c_str(), getPath(), normal ? "normally" : "with error", error.empty() ? "" : ": ", error.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); boost::shared_ptr client(m_server.findClient(caller)); if (!client) { SE_THROW("unknown client"); } // Remove reference to us from client, will destruct *this* // instance. To let us finish our work safely, keep a reference // that the server will unref when everything is idle again. boost::shared_ptr c = m_me.lock(); if (!c) { SE_THROW("connection already destructing"); } m_server.delayDeletion(c); client->detach(this); if (!normal || m_state != SessionCommon::FINAL) { std::string err = error.empty() ? "connection closed unexpectedly" : error; m_statusSignal(err); if (m_session) { m_session->setStubConnectionError(err); } failed(err); } else { m_state = SessionCommon::DONE; m_statusSignal(""); if (m_session) { m_session->setStubConnectionError(""); } } // TODO (?): errors during shutdown of the helper will not get // reported back to the client, which sees the operation as // completed successfully once this call returns. } void Connection::abort() { if (!m_abortSent) { SE_LOG_DEBUG(NULL, "Connection %s: send abort to client (state %s)", m_sessionID.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); sendAbort(); m_abortSent = true; } else { SE_LOG_DEBUG(NULL, "Connection %s: not sending abort to client, already done (state %s)", m_sessionID.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); } } void Connection::shutdown() { SE_LOG_DEBUG(NULL, "Connection %s: self-destructing (state %s)", m_sessionID.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); // trigger removal of this connection by removing all // references to it m_server.detach(this); } Connection::Connection(Server &server, const DBusConnectionPtr &conn, const std::string &sessionID, const StringMap &peer, bool must_authenticate) : DBusObjectHelper(conn, std::string("/org/syncevolution/Connection/") + sessionID, "org.syncevolution.Connection", boost::bind(&Server::autoTermCallback, &server)), m_server(server), m_peer(peer), m_mustAuthenticate(must_authenticate), m_state(SessionCommon::SETUP), m_sessionID(sessionID), m_timeoutSeconds(-1), sendAbort(*this, "Abort"), m_abortSent(false), reply(*this, "Reply"), m_description(buildDescription(peer)) { add(this, &Connection::process, "Process"); add(this, &Connection::close, "Close"); add(sendAbort); add(reply); m_server.autoTermRef(); SE_LOG_DEBUG(NULL, "Connection %s: created", m_sessionID.c_str()); } boost::shared_ptr Connection::createConnection(Server &server, const DBusConnectionPtr &conn, const std::string &sessionID, const StringMap &peer, bool must_authenticate) { boost::shared_ptr c(new Connection(server, conn, sessionID, peer, must_authenticate)); c->m_me = c; return c; } Connection::~Connection() { SE_LOG_DEBUG(NULL, "Connection %s: done with '%s'%s%s%s (old state %s)", m_sessionID.c_str(), m_description.c_str(), m_state == SessionCommon::DONE ? ", normal shutdown" : " unexpectedly", m_failure.empty() ? "" : ": ", m_failure.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); try { if (m_state != SessionCommon::DONE) { abort(); m_state = SessionCommon::FAILED; } // DBusTransportAgent waiting? Wake it up. m_statusSignal(m_failure); m_session.reset(); } catch (...) { // log errors, but do not propagate them because we are // destructing Exception::handle(); } m_server.autoTermUnref(); } void Connection::ready() { SE_LOG_DEBUG(NULL, "Connection %s: ready to run (old state %s)", m_sessionID.c_str(), SessionCommon::ConnectionStateToString(m_state).c_str()); //if configuration not yet created std::string configName = m_session->getConfigName(); SyncConfig config (configName); if (!config.exists() && m_SANContent) { SE_LOG_DEBUG(NULL, "Configuration %s not exists for a runnable session in a SAN context, create it automatically", configName.c_str()); ReadOperations::Config_t from; const std::string templateName = "SyncEvolution"; // TODO: support SAN from other well known servers ReadOperations ops(templateName, m_server); ops.getConfig(true , from); if (!m_peerBtAddr.empty()){ from[""]["SyncURL"] = string ("obex-bt://") + m_peerBtAddr; } m_session->setConfig (false, false, from); } // As we cannot resend messages via D-Bus even if running as // client (API not designed for it), let's use the hard server // timeout from RetryDuration here. m_timeoutSeconds = config.getRetryDuration(); const SyncContext context (configName); std::list sources = context.getSyncSources(); if (m_SANContent && !m_SANContent->m_syncType.empty()) { // check what the server wants us to synchronize // and only synchronize that m_syncMode = "disabled"; for (size_t sync=0; syncm_syncType.size(); sync++) { std::string syncMode = m_SANContent->m_syncType[sync]; std::string serverURI = m_SANContent->m_serverURI[sync]; //uint32_t contentType = m_SANContent->m_contentType[sync]; bool found = false; BOOST_FOREACH(const std::string &source, sources) { boost::shared_ptr sourceConfig(context.getSyncSourceConfig(source)); // prefix match because the local // configuration might contain // additional parameters (like date // range selection for events) if (boost::starts_with(sourceConfig->getURINonEmpty(), serverURI)) { SE_LOG_DEBUG(NULL, "SAN entry #%d = datastore %s with mode %s", (int)sync, source.c_str(), syncMode.c_str()); m_sourceModes[source] = syncMode; found = true; break; } } if (!found) { SE_LOG_DEBUG(NULL, "SAN entry #%d with mode %s ignored because Server URI %s is unknown", (int)sync, syncMode.c_str(), serverURI.c_str()); } } if (m_sourceModes.empty()) { SE_LOG_DEBUG(NULL, "SAN message with no known entries, falling back to default"); m_syncMode = ""; } } if (m_SANContent) { m_session->setRemoteInitiated(true); } // proceed with sync now that our session is ready m_session->sync(m_syncMode, m_sourceModes); } void Connection::activateTimeout() { if (m_timeoutSeconds >= 0) { m_timeout.runOnce(m_timeoutSeconds, boost::bind(&Connection::timeoutCb, this)); } else { m_timeout.deactivate(); } } void Connection::timeoutCb() { SE_LOG_DEBUG(NULL, "Connection %s: timed out after %ds (state %s)", m_sessionID.c_str(), m_timeoutSeconds, SessionCommon::ConnectionStateToString(m_state).c_str()); failed(StringPrintf("timed out after %ds", m_timeoutSeconds)); } SE_END_CXX syncevolution-1.5/src/dbus/server/connman-client.cpp0000644000373300001540000000726012326412403024163 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "connman-client.h" #include "server.h" #include "presence-status.h" SE_BEGIN_CXX ConnmanClient::ConnmanClient(Server &server): DBusRemoteObject(!strcmp(getEnv("DBUS_TEST_CONNMAN", ""), "none") ? NULL : /* simulate missing ConnMan */ GDBusCXX::dbus_get_bus_connection(!strcmp(getEnv("DBUS_TEST_CONNMAN", ""), "session") ? "SESSION" : /* use our own ConnMan stub */ "SYSTEM" /* use real ConnMan */, NULL, true, NULL), "/", "net.connman.Manager", "net.connman", true), m_available(false), m_server(server), m_propertyChanged(*this, "PropertyChanged") { if (getConnection()) { typedef std::map > PropDict; GDBusCXX::DBusClientCall1 getProp(*this,"GetProperties"); getProp.start(boost::bind(&ConnmanClient::getPropCb, this, _1, _2)); m_propertyChanged.activate(boost::bind(&ConnmanClient::propertyChanged, this, _1, _2)); }else{ SE_LOG_DEBUG(NULL, "DBus connection setup for connman failed"); } } void ConnmanClient::getPropCb (const std::map >& props, const string &error){ if (!error.empty()) { m_available = false; if (error == "org.freedesktop.DBus.Error.ServiceUnknown") { // ensure there is still first set of singal set in case of no // connman available m_server.getPresenceStatus().updatePresenceStatus (true, PresenceStatus::HTTP_TRANSPORT); SE_LOG_DEBUG(NULL, "No connman service available %s", error.c_str()); return; } SE_LOG_DEBUG(NULL, "error in connmanCallback %s", error.c_str()); return; } m_available = true; typedef std::pair > element; bool httpPresence = false; BOOST_FOREACH (element entry, props) { // just check online state, we don't care how about the underlying technology if (entry.first == "State") { std::string state = boost::get(entry.second); httpPresence = state == "online"; break; } } //now delivering the signals m_server.getPresenceStatus().updatePresenceStatus (httpPresence, PresenceStatus::HTTP_TRANSPORT); } void ConnmanClient::propertyChanged(const std::string &name, const boost::variant, std::string> &prop) { if (name == "State") { std::string state = boost::get(prop); m_server.getPresenceStatus().updatePresenceStatus(state == "online", PresenceStatus::HTTP_TRANSPORT); } } SE_END_CXX syncevolution-1.5/src/dbus/server/dbus-user-interface.cpp0000644000373300001540000000361512326412403025125 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "dbus-user-interface.h" #include SE_BEGIN_CXX DBusUserInterface::DBusUserInterface(const InitStateTri &keyring) : m_keyring(keyring) { } std::string DBusUserInterface::askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key) { InitStateString password; if (GetLoadPasswordSignal()(m_keyring, passwordName, descr, key, password) && password.wasSet()) { // handled return password; } //if not found, return empty return ""; } bool DBusUserInterface::savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { if (GetSavePasswordSignal()(m_keyring, passwordName, password, key)) { return true; } // not saved return false; } void DBusUserInterface::readStdin(std::string &content) { SE_THROW("reading stdin in D-Bus server not supported, use --daemon=no in command line"); } SE_END_CXX syncevolution-1.5/src/dbus/server/exceptions.cpp0000644000373300001540000000314212326412403023432 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "exceptions.h" SE_BEGIN_CXX /** * implement syncevolution exception handler * to cover its default implementation */ GDBusCXX::message_type *SyncEvoHandleException(GDBusCXX::message_type *msg) { /** give an opportunity to let syncevolution handle exception */ Exception::handle(); try { throw; } catch (const GDBusCXX::dbus_error &ex) { return DBUS_NEW_ERROR_MSG(msg, ex.dbusName().c_str(), "%s", ex.what()); } catch (const GDBusCXX::DBusCXXException &ex) { return DBUS_NEW_ERROR_MSG(msg, ex.getName().c_str(), "%s", ex.getMessage()); } catch (const std::runtime_error &ex) { return DBUS_NEW_ERROR_MSG(msg, "org.syncevolution.Exception", "%s", ex.what()); } catch (...) { return DBUS_NEW_ERROR_MSG(msg, "org.syncevolution.Exception", "unknown"); } } SE_END_CXX syncevolution-1.5/src/dbus/server/localed-listener.cpp0000644000373300001540000001742512326412403024510 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "localed-listener.h" #include #include #include #include #include #include #include SE_BEGIN_CXX static const char LOCALED_PATH[] = "/org/freedesktop/locale1"; static const char LOCALED_INTERFACE[] = "org.freedesktop.locale1"; static const char LOCALED_DESTINATION[] = "org.freedesktop.locale1"; static const char LOCALED_LOCALE_PROPERTY[] = "Locale"; /** * Must be a complete list, because we need to know which variables * we have to unset if not set remotely. * * Localed intentionally does not support LC_ALL. As localed.c says: * "We don't list LC_ALL here on purpose. People should be using LANG instead." */ static const char * const LOCALED_ENV_VARS[] = { "LANG", "LC_CTYPE", "LC_NUMERIC", "LC_TIME", "LC_COLLATE", "LC_MONETARY", "LC_MESSAGES", "LC_PAPER", "LC_NAME", "LC_ADDRESS", "LC_TELEPHONE", "LC_MEASUREMENT", "LC_IDENTIFICATION" }; static const char PROPERTIES_INTERFACE[] = "org.freedesktop.DBus.Properties"; static const char PROPERTIES_CHANGED_SIGNAL[] = "PropertiesChanged"; static const char PROPERTIES_GET[] = "Get"; LocaledListener::LocaledListener(): GDBusCXX::DBusRemoteObject(!strcmp(getEnv("SYNCEVOLUTION_LOCALED", ""), "none") ? NULL : /* simulate missing localed */ GDBusCXX::dbus_get_bus_connection(!strcmp(getEnv("SYNCEVOLUTION_LOCALED", ""), "session") ? "SESSION" : /* use our own localed stub */ "SYSTEM" /* use real localed */, NULL, false, NULL), LOCALED_PATH, PROPERTIES_INTERFACE, LOCALED_DESTINATION), m_propertiesChanged(*this, PROPERTIES_CHANGED_SIGNAL), m_propertiesGet(*this, PROPERTIES_GET) { if (getConnection()) { m_propertiesChanged.activate(boost::bind(&LocaledListener::onPropertiesChange, this, _1, _2, _3)); } else { SE_LOG_DEBUG(NULL, "localed: not activating, no connection"); } }; boost::shared_ptr LocaledListener::create() { static boost::weak_ptr singleton; boost::shared_ptr self = singleton.lock(); if (!self) { self.reset(new LocaledListener()); self->m_self = self; singleton = self; } return self; }; void LocaledListener::onPropertiesChange(const std::string &interface, const Properties &properties, const Invalidated &invalidated) { if (interface == LOCALED_INTERFACE) { boost::function result(boost::bind(&LocaledListener::emitLocaleEnv, m_self, _1)); BOOST_FOREACH (const Properties::value_type &entry, properties) { if (entry.first == LOCALED_LOCALE_PROPERTY) { const LocaleEnv *locale = boost::get(&entry.second); if (locale) { SE_LOG_DEBUG(NULL, "localed: got new Locale"); processLocaleProperty(*locale, "", false, result); } else { SE_LOG_DEBUG(NULL, "localed: got new Locale of invalid type?! Ignore."); } return; } } if (std::find(invalidated.begin(), invalidated.end(), LOCALED_LOCALE_PROPERTY) != invalidated.end()) { SE_LOG_DEBUG(NULL, "localed: Locale changed, need to get new value"); m_propertiesGet.start(std::string(LOCALED_INTERFACE), std::string(LOCALED_LOCALE_PROPERTY), boost::bind(&LocaledListener::processLocaleProperty, m_self, _1, _2, false, result)); } SE_LOG_DEBUG(NULL, "localed: ignoring irrelevant property change"); } } void LocaledListener::processLocaleProperty(const LocaleVariant &variant, const std::string &error, bool mustCall, const ProcessLocalePropCB_t &result) { SE_LOG_DEBUG(NULL, "localed: got Locale property: %s", error.empty() ? "<>" : error.c_str()); const LocaleEnv *locale = error.empty() ? boost::get(&variant) : NULL; LocaleEnv current; if (!locale && mustCall) { SE_LOG_DEBUG(NULL, "localed: using current environment as fallback"); BOOST_FOREACH (const char *name, LOCALED_ENV_VARS) { const char *value = getenv(name); if (value) { current.push_back(StringPrintf("%s=%s", name, value)); } } locale = ¤t; } if (locale) { result(*locale); } } void LocaledListener::emitLocaleEnv(const LocaleEnv &env) { SE_LOG_DEBUG(NULL, "localed: got environment: %s", boost::join(env, " ").c_str()); m_localeValues(env); } void LocaledListener::check(const boost::function &result) { if (getConnection()) { SE_LOG_DEBUG(NULL, "localed: get current Locale property"); m_propertiesGet.start(std::string(LOCALED_INTERFACE), std::string(LOCALED_LOCALE_PROPERTY), boost::bind(&LocaledListener::processLocaleProperty, m_self, _1, _2, true, result)); } else { processLocaleProperty(LocaleVariant(), "no D-Bus connection", true, result); } } void LocaledListener::setLocale(const LocaleEnv &locale) { bool modified = false; BOOST_FOREACH (const char *name, LOCALED_ENV_VARS) { const char *value = getenv(name); std::string assignment = StringPrintf("%s=", name); LocaleEnv::const_iterator instance = std::find_if(locale.begin(), locale.end(), boost::bind(boost::starts_with, _1, name)); const char *newvalue = instance != locale.end() ? instance->c_str() + assignment.size() : NULL; if ((value && newvalue && strcmp(value, newvalue)) || (!value && newvalue)) { modified = true; setenv(name, newvalue, true); SE_LOG_DEBUG(NULL, "localed: %s = %s -> %s", name, value ? value : "", newvalue); } else if (value && !newvalue) { modified = true; unsetenv(name); SE_LOG_DEBUG(NULL, "localed: %s = %s -> ", name, value); } } SE_LOG_DEBUG(NULL, "localed: environment %s", modified ? "changed" : "unchanged"); if (modified) { m_localeChanged(); } } SE_END_CXX syncevolution-1.5/src/dbus/server/info-req.cpp0000644000373300001540000000556012326412403022777 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "info-req.h" #include "server.h" using namespace GDBusCXX; SE_BEGIN_CXX InfoReq::InfoReq(Server &server, const string &type, const InfoMap ¶meters, const string &sessionPath, uint32_t timeout) : m_server(server), m_sessionPath(sessionPath), m_id(server.getNextInfoReq()), m_timeoutSeconds(timeout), m_infoState(IN_REQ), m_status(ST_RUN), m_type(type), m_param(parameters) { m_server.emitInfoReq(*this); m_timeout.runOnce(m_timeoutSeconds, boost::bind(boost::ref(m_timeoutSignal))); m_param.clear(); } InfoReq::~InfoReq() { m_handler = ""; done(); } string InfoReq::statusToString(Status status) { switch(status) { case ST_RUN: return "running"; case ST_OK: return "ok"; case ST_CANCEL: return "cancelled"; case ST_TIMEOUT: return "timeout"; default: return ""; }; } string InfoReq::infoStateToString(InfoState state) { switch(state) { case IN_REQ: return "request"; case IN_WAIT: return "waiting"; case IN_DONE: return "done"; default: return ""; } } void InfoReq::setResponse(const Caller_t &caller, const string &state, const InfoMap &response) { if(m_status != ST_RUN) { return; } else if(m_infoState == IN_REQ && state == "working") { m_handler = caller; m_infoState = IN_WAIT; m_server.emitInfoReq(*this); //reset the timer, used to check timeout m_timeout.runOnce(m_timeoutSeconds, boost::bind(boost::ref(m_timeoutSignal))); } else if ((m_infoState == IN_WAIT || m_infoState == IN_REQ) && state == "response") { m_response = response; m_handler = caller; m_status = ST_OK; m_responseSignal(m_response); done(); } } string InfoReq::getSessionPath() const { return m_sessionPath; } void InfoReq::done() { if (m_infoState != IN_DONE) { m_infoState = IN_DONE; m_server.emitInfoReq(*this); } m_server.removeInfoReq(getId()); } SE_END_CXX syncevolution-1.5/src/dbus/server/network-manager-client.cpp0000644000373300001540000000771112326412403025634 0ustar00nightlynightly00000000000000 /* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "network-manager-client.h" #include "server.h" #include "presence-status.h" SE_BEGIN_CXX NetworkManagerClient::NetworkManagerClient(Server &server) : DBusRemoteObject(!strcmp(getEnv("DBUS_TEST_NETWORK_MANAGER", ""), "none") ? NULL : /* simulate missing Network Manager */ GDBusCXX::dbus_get_bus_connection(!strcmp(getEnv("DBUS_TEST_NETWORK_MANAGER", ""), "session") ? "SESSION" : /* use our own Network Manager stub */ "SYSTEM" /* use real Network Manager */, NULL, true, NULL), "/org/freedesktop/NetworkManager", "org.freedesktop.NetworkManager", "org.freedesktop.NetworkManager", true), m_available(false), m_server(server), m_stateChanged(*this, "StateChanged"), m_properties(*this) { if (getConnection()) { m_properties.get(); m_stateChanged.activate(boost::bind( &NetworkManagerClient::stateChanged, this, _1)); } else { SE_LOG_DEBUG(NULL, "DBus connection setup for NetworkManager failed"); } } void NetworkManagerClient::stateChanged(uint32_t uiState) { switch (uiState) { case NM_STATE_ASLEEP: case NM_STATE_DISCONNECTED: case NM_STATE_DISCONNECTING: case NM_STATE_CONNECTING: case NM_STATE_ASLEEP_DEPRECATED: case NM_STATE_CONNECTING_DEPRECATED: case NM_STATE_DISCONNECTED_DEPRECATED: SE_LOG_DEBUG(NULL, "NetworkManager disconnected"); m_server.getPresenceStatus().updatePresenceStatus( false, PresenceStatus::HTTP_TRANSPORT); break; default: SE_LOG_DEBUG(NULL, "NetworkManager connected"); m_server.getPresenceStatus().updatePresenceStatus( true, PresenceStatus::HTTP_TRANSPORT); } } NetworkManagerClient::NetworkManagerProperties::NetworkManagerProperties( NetworkManagerClient& manager) : GDBusCXX::DBusRemoteObject(manager.getConnection(), "/org/freedesktop/NetworkManager", "org.freedesktop.DBus.Properties", "org.freedesktop.NetworkManager"), m_manager(manager) { } void NetworkManagerClient::NetworkManagerProperties::get() { GDBusCXX::DBusClientCall1 > get(*this, "Get"); get.start(std::string(m_manager.getInterface()), std::string("State"), boost::bind(&NetworkManagerProperties::getCallback, this, _1, _2)); } void NetworkManagerClient::NetworkManagerProperties::getCallback( const boost::variant &prop, const std::string &error) { if(!error.empty()) { SE_LOG_DEBUG(NULL, "Error in calling Get of Interface org.freedesktop.DBus.Properties : %s", error.c_str()); } else { // Now, and only now, do we know that NetworkManager is running. m_manager.m_available = true; m_manager.stateChanged(boost::get(prop)); } } SE_END_CXX syncevolution-1.5/src/dbus/server/presence-status.cpp0000644000373300001540000001400612326412403024377 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "presence-status.h" #include "server.h" SE_BEGIN_CXX void PresenceStatus::init(){ //initialize the configured peer list if (!m_initiated) { SyncConfig::ConfigList list = SyncConfig::getConfigs(); BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, list) { SyncConfig config (server.first); vector urls = config.getSyncURL(); m_peers[server.first].clear(); BOOST_FOREACH (const string &url, urls) { // take current status into account, // PresenceStatus::checkPresence() calls init() and // expects up-to-date information PeerStatus status; if ((boost::starts_with(url, "obex-bt") && m_btPresence) || (boost::starts_with (url, "http") && m_httpPresence) || boost::starts_with (url, "local")) { status = MIGHTWORK; } else { status = NOTRANSPORT; } m_peers[server.first].push_back(make_pair(url, status)); } } m_initiated = true; } } /* Implement PresenceStatus::checkPresence*/ void PresenceStatus::checkPresence (const string &peer, string& status, std::vector &transport) { if (!m_initiated) { //might triggered by updateConfigPeers init(); } string peerName = SyncConfig::normalizeConfigString (peer); vector< pair > mytransports = m_peers[peerName]; if (mytransports.empty()) { //wrong config name? status = status2string(NOTRANSPORT); transport.clear(); return; } PeerStatus mystatus = MIGHTWORK; transport.clear(); //only if all transports are unavailable can we declare the peer //status as unavailable BOOST_FOREACH (PeerStatusPair &mytransport, mytransports) { if (mytransport.second == MIGHTWORK) { transport.push_back (mytransport.first); } } if (transport.empty()) { mystatus = NOTRANSPORT; } status = status2string(mystatus); } void PresenceStatus::updateConfigPeers (const std::string &peer, const ReadOperations::Config_t &config) { ReadOperations::Config_t::const_iterator iter = config.find (""); if (iter != config.end()) { //As a simple approach, just reinitialize the whole STATUSMAP //it will cause later updatePresenceStatus resend all signals //and a reload in checkPresence m_initiated = false; } } void PresenceStatus::updatePresenceStatus (bool newStatus, PresenceStatus::TransportType type) { if (type == PresenceStatus::HTTP_TRANSPORT) { updatePresenceStatus (newStatus, m_btPresence); } else if (type == PresenceStatus::BT_TRANSPORT) { updatePresenceStatus (m_httpPresence, newStatus); }else { } } void PresenceStatus::updatePresenceStatus (bool httpPresence, bool btPresence) { bool httpChanged = (m_httpPresence != httpPresence); bool btChanged = (m_btPresence != btPresence); if (m_initiated && !httpChanged && !btChanged) { //nothing changed return; } //initialize the configured peer list using old presence status bool initiated = m_initiated; if (!m_initiated) { init(); } // switch to new status m_httpPresence = httpPresence; m_btPresence = btPresence; if (httpChanged) { m_httpPresenceSignal(httpPresence); } if (btChanged) { m_btPresenceSignal(btPresence); } //iterate all configured peers and fire singals BOOST_FOREACH (StatusPair &peer, m_peers) { //iterate all possible transports //TODO One peer might got more than one signals, avoid this std::vector > &transports = peer.second; BOOST_FOREACH (PeerStatusPair &entry, transports) { string url = entry.first; if (boost::starts_with (url, "http") && (httpChanged || !initiated)) { entry.second = m_httpPresence ? MIGHTWORK: NOTRANSPORT; m_server.emitPresence (peer.first, status2string (entry.second), entry.first); SE_LOG_DEBUG(NULL, "http presence signal %s,%s,%s", peer.first.c_str(), status2string (entry.second).c_str(), entry.first.c_str()); } else if (boost::starts_with (url, "obex-bt") && (btChanged || !initiated)) { entry.second = m_btPresence ? MIGHTWORK: NOTRANSPORT; m_server.emitPresence (peer.first, status2string (entry.second), entry.first); SE_LOG_DEBUG(NULL, "bluetooth presence signal %s,%s,%s", peer.first.c_str(), status2string (entry.second).c_str(), entry.first.c_str()); } else if (boost::starts_with (url, "local") && !initiated) { m_server.emitPresence (peer.first, status2string (MIGHTWORK), entry.first); SE_LOG_DEBUG(NULL, "local presence signal %s,%s,%s", peer.first.c_str(), status2string (MIGHTWORK).c_str(), entry.first.c_str()); } } } } SE_END_CXX syncevolution-1.5/src/dbus/server/progress-data.cpp0000644000373300001540000001562712326412403024037 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "progress-data.h" #include #include SE_BEGIN_CXX const float ProgressData::PRO_SYNC_PREPARE_RATIO = 0.2; const float ProgressData::DATA_PREPARE_RATIO = 0.10; const float ProgressData::ONEITEM_SEND_RATIO = 0.05; const float ProgressData::ONEITEM_RECEIVE_RATIO = 0.05; const float ProgressData::CONN_SETUP_RATIO = 0.5; ProgressData::ProgressData() : m_progress(0), m_step(PRO_SYNC_INVALID), m_sendCounts(0), m_internalMode(INTERNAL_NONE) { /** * init default units of each step */ float totalUnits = 0.0; for(int i = 0; i < PRO_SYNC_TOTAL; i++) { float units = getDefaultUnits((ProgressStep)i); m_syncUnits[i] = units; totalUnits += units; } m_propOfUnit = 1.0 / totalUnits; /** * init default sync step proportions. each step stores proportions of * its previous steps and itself. */ m_syncProp[0] = 0; for(int i = 1; i < PRO_SYNC_TOTAL - 1; i++) { m_syncProp[i] = m_syncProp[i - 1] + m_syncUnits[i] / totalUnits; } m_syncProp[PRO_SYNC_TOTAL - 1] = 1.0; } void ProgressData::setProgress(int progress) { m_progress = progress > 100 ? 100 : progress < 0 ? 0 : progress; } void ProgressData::setStep(ProgressStep step) { if(m_step != step) { /** if state is changed, progress is set as the end of current step*/ setProgress(100.0 * m_syncProp[(int)m_step]); m_step = step; ///< change to new state m_sendCounts = 0; ///< clear send/receive counts m_source = ""; ///< clear source } } void ProgressData::sendStart() { checkInternalMode(); m_sendCounts++; /* self adapts. If a new send and not default, we need re-calculate proportions */ if(m_sendCounts > MSG_SEND_RECEIVE_TIMES) { m_syncUnits[(int)m_step] += 1; recalc(); } /** * If in the send operation of PRO_SYNC_UNINIT, it often takes extra time * to send message due to items handling */ if(m_step == PRO_SYNC_UNINIT && m_syncUnits[(int)m_step] != MSG_SEND_RECEIVE_TIMES) { updateProg(DATA_PREPARE_RATIO); } } void ProgressData::receiveEnd() { /** * often receiveEnd is the last operation of each step by default. * If more send/receive, then we need expand proportion of current * step and re-calc them */ updateProg(m_syncUnits[(int)m_step]); } void ProgressData::addSyncMode(SyncMode mode) { switch(mode) { case SYNC_TWO_WAY: case SYNC_SLOW: m_internalMode |= INTERNAL_TWO_WAY; break; case SYNC_ONE_WAY_FROM_CLIENT: case SYNC_REFRESH_FROM_CLIENT: m_internalMode |= INTERNAL_ONLY_TO_CLIENT; break; case SYNC_ONE_WAY_FROM_SERVER: case SYNC_REFRESH_FROM_SERVER: m_internalMode |= INTERNAL_ONLY_TO_SERVER; break; default: ; }; } void ProgressData::itemPrepare() { checkInternalMode(); /** * only the first PEV_ITEMPREPARE event takes some time * due to data access, other events don't according to * profiling data */ if(m_source.empty()) { m_source = "source"; ///< use this to check whether itemPrepare occurs updateProg(DATA_PREPARE_RATIO); } } void ProgressData::itemReceive(const std::string &source, int count, int total) { /** * source is used to check whether a new source is received * If the first source, we compare its total number and default number * then re-calc sync units */ if(m_source.empty()) { m_source = source; if(total != 0) { m_syncUnits[PRO_SYNC_UNINIT] += ONEITEM_RECEIVE_RATIO * (total - DEFAULT_ITEMS); recalc(); } /** if another new source, add them into sync units */ } else if(m_source != source){ m_source = source; if(total != 0) { m_syncUnits[PRO_SYNC_UNINIT] += ONEITEM_RECEIVE_RATIO * total; recalc(); } } updateProg(ONEITEM_RECEIVE_RATIO); } void ProgressData::updateProg(float ratio) { setProgress(m_progress + m_propOfUnit * 100 * ratio); m_syncUnits[(int)m_step] -= ratio; } /** dynamically adapt the proportion of each step by their current units */ void ProgressData::recalc() { float units = getRemainTotalUnits(); if(std::abs(units) < std::numeric_limits::epsilon()) { m_propOfUnit = 0.0; } else { m_propOfUnit = ( 100.0 - m_progress ) / (100.0 * units); } if(m_step != PRO_SYNC_TOTAL -1 ) { m_syncProp[(int)m_step] = m_progress / 100.0 + m_syncUnits[(int)m_step] * m_propOfUnit; for(int i = ((int)m_step) + 1; i < PRO_SYNC_TOTAL - 1; i++) { m_syncProp[i] = m_syncProp[i - 1] + m_syncUnits[i] * m_propOfUnit; } } } void ProgressData::checkInternalMode() { if(!m_internalMode) { return; } else if(m_internalMode & INTERNAL_TWO_WAY) { // don't adjust } else if(m_internalMode & INTERNAL_ONLY_TO_CLIENT) { // only to client, remove units of prepare and send m_syncUnits[PRO_SYNC_DATA] -= (ONEITEM_RECEIVE_RATIO * DEFAULT_ITEMS + DATA_PREPARE_RATIO); recalc(); } else if(m_internalMode & INTERNAL_ONLY_TO_SERVER) { // only to server, remove units of receive m_syncUnits[PRO_SYNC_UNINIT] -= (ONEITEM_RECEIVE_RATIO * DEFAULT_ITEMS + DATA_PREPARE_RATIO); recalc(); } m_internalMode = INTERNAL_NONE; } float ProgressData::getRemainTotalUnits() { float total = 0.0; for(int i = (int)m_step; i < PRO_SYNC_TOTAL; i++) { total += m_syncUnits[i]; } return total; } float ProgressData::getDefaultUnits(ProgressStep step) { switch(step) { case PRO_SYNC_PREPARE: return PRO_SYNC_PREPARE_RATIO; case PRO_SYNC_INIT: return CONN_SETUP_RATIO + MSG_SEND_RECEIVE_TIMES; case PRO_SYNC_DATA: return ONEITEM_SEND_RATIO * DEFAULT_ITEMS + DATA_PREPARE_RATIO + MSG_SEND_RECEIVE_TIMES; case PRO_SYNC_UNINIT: return ONEITEM_RECEIVE_RATIO * DEFAULT_ITEMS + DATA_PREPARE_RATIO + MSG_SEND_RECEIVE_TIMES; default: return 0; }; } SE_END_CXX syncevolution-1.5/src/dbus/server/read-operations.cpp0000664000373300001540000003355412405555067024375 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "read-operations.h" #include "dbus-user-interface.h" #include "server.h" #include "dbus-sync.h" #include SE_BEGIN_CXX ReadOperations::ReadOperations(const std::string &config_name, Server &server) : m_configName(config_name), m_server(server) {} void ReadOperations::getConfigs(bool getTemplates, std::vector &configNames) { if (getTemplates) { SyncConfig::DeviceList devices; // get device list from dbus server, currently only bluetooth devices m_server.getDeviceList(devices); // also include server templates in search devices.push_back(SyncConfig::DeviceDescription("", "", SyncConfig::MATCH_FOR_CLIENT_MODE)); //clear existing templates in dbus server m_server.clearPeerTempls(); SyncConfig::TemplateList list = SyncConfig::getPeerTemplates(devices); std::map numbers; BOOST_FOREACH(const boost::shared_ptr peer, list) { //if it is not a template for device if(peer->m_deviceName.empty()) { configNames.push_back(peer->m_templateId); } else { string templName = "Bluetooth_"; templName += peer->m_deviceId; templName += "_"; std::map::iterator it = numbers.find(peer->m_deviceId); if(it == numbers.end()) { numbers.insert(std::make_pair(peer->m_deviceId, 1)); templName += "1"; } else { it->second++; stringstream seq; seq << it->second; templName += seq.str(); } configNames.push_back(templName); m_server.addPeerTempl(templName, peer); } } } else { SyncConfig::ConfigList list = SyncConfig::getConfigs(); BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server, list) { configNames.push_back(server.first); } } } boost::shared_ptr ReadOperations::getLocalConfig(const string &configName, bool mustExist) { string peer, context; SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configName), peer, context); boost::shared_ptr syncConfig(new SyncConfig(configName)); /** if config was not set temporarily */ if (!setFilters(*syncConfig)) { // the default configuration can always be opened for reading, // everything else must exist if ((context != "default" || peer != "") && mustExist && !syncConfig->exists()) { SE_THROW_EXCEPTION(NoSuchConfig, "No configuration '" + configName + "' found"); } } return syncConfig; } void ReadOperations::getConfig(bool getTemplate, Config_t &config) { getNamedConfig(m_configName, getTemplate, config); } void ReadOperations::getNamedConfig(const std::string &configName, bool getTemplate, Config_t &config) { map localConfigs; boost::shared_ptr dbusConfig; SyncConfig *syncConfig; string syncURL; /** get server template */ if(getTemplate) { string peer, context; boost::shared_ptr peerTemplate = m_server.getPeerTempl(configName); if(peerTemplate) { SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(peerTemplate->m_templateId), peer, context); dbusConfig = SyncConfig::createPeerTemplate(peerTemplate->m_path); // if we have cached template information, add match information for it localConfigs.insert(pair("description", peerTemplate->m_description)); stringstream score; score << peerTemplate->m_rank; localConfigs.insert(pair("score", score.str())); // Actually this fingerprint is transferred by getConfigs, which refers to device name localConfigs.insert(pair("deviceName", peerTemplate->m_deviceName)); // This is the reliable device info obtained from the bluetooth // device id profile (DIP) or emtpy if DIP not supported. if (!peerTemplate->m_hardwareName.empty()) { localConfigs.insert(pair("hardwareName", peerTemplate->m_hardwareName)); } // This is the fingerprint of the template localConfigs.insert(pair("fingerPrint", peerTemplate->m_matchedModel)); // This is the template name presented to UI (or device class) if (!peerTemplate->m_templateName.empty()) { localConfigs.insert(pair("templateName", peerTemplate->m_templateName)); } // if the peer is client, then replace syncURL with bluetooth // MAC address syncURL = "obex-bt://"; syncURL += peerTemplate->m_deviceId; } else { SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configName), peer, context); dbusConfig = SyncConfig::createPeerTemplate(peer); } if(!dbusConfig.get()) { SE_THROW_EXCEPTION(NoSuchConfig, "No template '" + configName + "' found"); } // use the shared properties from the right context as filter // so that the returned template preserves existing properties boost::shared_ptr shared = getLocalConfig(string("@") + context, false); ConfigProps props; shared->getProperties()->readProperties(props); dbusConfig->setConfigFilter(true, "", props); BOOST_FOREACH(std::string source, shared->getSyncSources()) { SyncSourceNodes nodes = shared->getSyncSourceNodes(source, ""); props.clear(); nodes.getProperties()->readProperties(props); // Special case "type" property: the value in the context // is not preserved. Every new peer must ensure that // its own value is compatible (= same backend) with // the other peers. props.erase("type"); dbusConfig->setConfigFilter(false, source, props); } syncConfig = dbusConfig.get(); } else { dbusConfig = getLocalConfig(configName); DBusUserInterface ui(dbusConfig->getKeyring()); //try to check password and read password from gnome keyring if possible PasswordConfigProperty::checkPasswords(ui, *dbusConfig, // Keep usernames as they are, but retrieve passwords for the D-Bus client. PasswordConfigProperty::CHECK_PASSWORD_ALL & ~PasswordConfigProperty::CHECK_PASSWORD_RESOLVE_USERNAME, dbusConfig->getSyncSources()); syncConfig = dbusConfig.get(); } /** get sync properties and their values */ ConfigPropertyRegistry &syncRegistry = SyncConfig::getRegistry(); BOOST_FOREACH(const ConfigProperty *prop, syncRegistry) { InitStateString value = prop->getProperty(*syncConfig->getProperties()); if (boost::iequals(prop->getMainName(), "syncURL") && !syncURL.empty() ) { localConfigs.insert(pair(prop->getMainName(), syncURL)); } else if (value.wasSet()) { localConfigs.insert(pair(prop->getMainName(), value)); } } // Set ConsumerReady for existing SyncEvolution < 1.2 configs // if not set explicitly, // because in older releases all existing configurations where // shown. SyncEvolution 1.2 is more strict and assumes that // ConsumerReady must be set explicitly. The sync-ui always has // set the flag for configs created or modified with it, but the // command line did not. Matches similar code in the Cmdline.cpp // migration code. // // This does not apply to templates which always have ConsumerReady // set explicitly (to on or off) or not set (same as off). if (!getTemplate && syncConfig->getConfigVersion(CONFIG_LEVEL_PEER, CONFIG_CUR_VERSION) == 0 /* SyncEvolution < 1.2 */) { localConfigs.insert(make_pair("ConsumerReady", "1")); } // insert 'configName' of the chosen config (configName is not normalized) localConfigs.insert(pair("configName", syncConfig->getConfigName())); config.insert(pair >("", localConfigs)); /* get configurations from sources */ list sources = syncConfig->getSyncSources(); BOOST_FOREACH(const string &name, sources) { localConfigs.clear(); SyncSourceNodes sourceNodes = syncConfig->getSyncSourceNodes(name); ConfigPropertyRegistry &sourceRegistry = SyncSourceConfig::getRegistry(); BOOST_FOREACH(const ConfigProperty *prop, sourceRegistry) { InitStateString value = prop->getProperty(*sourceNodes.getProperties()); if (value.wasSet()) { localConfigs.insert(pair(prop->getMainName(), value)); } } config.insert(pair >( "source/" + name, localConfigs)); } } void ReadOperations::getReports(uint32_t start, uint32_t count, Reports_t &reports) { SyncContext client(m_configName, false); std::vector dirs; client.getSessions(dirs); uint32_t index = 0; // newest report firstly for( int i = dirs.size() - 1; i >= 0; --i) { /** if start plus count is bigger than actual size, then return actual - size reports */ if(index >= start && index - start < count) { const string &dir = dirs[i]; std::map aReport; // insert a 'dir' as an ID for the current report aReport.insert(pair("dir", dir)); SyncReport report; // peerName is also extracted from the dir string peerName = client.readSessionInfo(dir,report); boost::shared_ptr config(new SyncConfig(m_configName)); string storedPeerName = config->getPeerName(); //if can't find peer name, use the peer name from the log dir if(!storedPeerName.empty()) { peerName = storedPeerName; } /** serialize report to ConfigProps and then copy them to reports */ IniHashConfigNode node("/dev/null","",true); node << report; ConfigProps props; node.readProperties(props); BOOST_FOREACH(const ConfigProps::value_type &entry, props) { aReport.insert(entry); } // a new key-value pair <"peer", [peer name]> is transferred aReport.insert(pair("peer", peerName)); reports.push_back(aReport); } index++; } } void ReadOperations::checkSource(const std::string &sourceName) { boost::shared_ptr config(new SyncConfig(m_configName)); setFilters(*config); list sourceNames = config->getSyncSources(); list::iterator it; for(it = sourceNames.begin(); it != sourceNames.end(); ++it) { if(*it == sourceName) { break; } } if(it == sourceNames.end()) { SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' has no '" + sourceName + "' datastore"); } bool checked = false; try { // this can already throw exceptions when the config is invalid SyncSourceParams params(sourceName, config->getSyncSourceNodes(sourceName), config); auto_ptr syncSource(SyncSource::createSource(params, false, config.get())); if (syncSource.get()) { syncSource->open(); // success! checked = true; } } catch (...) { Exception::handle(); } if (!checked) { SE_THROW_EXCEPTION(SourceUnusable, "The datastore '" + sourceName + "' is not usable"); } } void ReadOperations::getDatabases(const string &sourceName, SourceDatabases_t &databases) { boost::shared_ptr config(new SyncConfig(m_configName)); setFilters(*config); SyncSourceParams params(sourceName, config->getSyncSourceNodes(sourceName), config); const SourceRegistry ®istry(SyncSource::getSourceRegistry()); BOOST_FOREACH(const RegisterSyncSource *sourceInfo, registry) { auto_ptr source(sourceInfo->m_create(params)); if (!source.get()) { continue; } else if (source->isInactive()) { SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' backend of datastore '" + sourceName + "' is not supported"); } else { databases = source->getDatabases(); return; } } SE_THROW_EXCEPTION(NoSuchSource, "'" + m_configName + "' has no '" + sourceName + "' datastore"); } SE_END_CXX syncevolution-1.5/src/dbus/server/server.cpp0000664000373300001540000010744012424466461022603 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * Copyright (C) 2011 Symbio, Ville Nummela * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include "server.h" #include "info-req.h" #include "connection.h" #include "bluez-manager.h" #include "session.h" #include "timeout.h" #include "restart.h" #include "client.h" #include "auto-sync-manager.h" #include "connman-client.h" #include "network-manager-client.h" #include "presence-status.h" #include using namespace GDBusCXX; SE_BEGIN_CXX void Server::onIdleChange(bool idle) { SE_LOG_DEBUG(NULL, "server is %s", idle ? "idle" : "not idle"); if (idle) { autoTermUnref(); } else { autoTermRef(); } } class ServerLogger : public Logger { Logger::Handle m_parentLogger; // Currently a strong reference. Would be a weak reference // if we had proper reference counting for Server. boost::shared_ptr m_server; public: ServerLogger(const boost::shared_ptr &server) : m_parentLogger(Logger::instance()), m_server(server) { } virtual void remove() throw () { // Hold the Logger mutex while cutting our connection to the // server. The code using m_server below does the same and // holds the mutex while logging. That way we prevent threads // from holding onto the server while it tries to shut down. // // This is important because the server's live time is not // really controlled via the boost::shared_ptr, it may // destruct while there are still references. See // Server::m_logger instantiation below. RecMutex::Guard guard = lock(); m_server.reset(); } virtual void messagev(const MessageOptions &options, const char *format, va_list args) { // Ensure that remove() cannot proceed while we have the // server in use. RecMutex::Guard guard = lock(); Server *server = m_server.get(); message2DBus(server, options, format, args, server ? server->getPath() : "", getProcessName()); } /** * @param server may be NULL, in which case logging only goes to parent */ void message2DBus(Server *server, const MessageOptions &options, const char *format, va_list args, const std::string &dbusPath, const std::string &procname) { // Keeps logging consistent: otherwise thread A might log to // parent, thread B to parent and D-Bus, then thread A // finishes its logging via D-Bus. The order of log messages // would then not be the same in the parent and D-Bus. RecMutex::Guard guard = lock(); // iterating over args in messagev() is destructive, must make a copy first va_list argsCopy; va_copy(argsCopy, args); m_parentLogger.messagev(options, format, args); if (server) { try { if (options.m_level <= server->getDBusLogLevel()) { string log = StringPrintfV(format, argsCopy); server->logOutput(dbusPath, options.m_level, log, procname); } } catch (...) { remove(); // Give up on server logging silently. } } va_end(argsCopy); } }; void Server::clientGone(Client *c) { for (Clients_t::iterator it = m_clients.begin(); it != m_clients.end(); ++it) { if (it->second.get() == c) { SE_LOG_DEBUG(NULL, "D-Bus client %s has disconnected", c->m_ID.c_str()); autoTermUnref(it->second->getAttachCount()); m_clients.erase(it); return; } } SE_LOG_DEBUG(NULL, "unknown client has disconnected?!"); } std::string Server::getNextSession() { // Make the session ID somewhat random. This protects to // some extend against injecting unwanted messages into the // communication. m_lastSession++; if (!m_lastSession) { m_lastSession++; } return StringPrintf("%u%u", rand(), m_lastSession); } vector Server::getCapabilities() { // Note that this is tested by test-dbus.py in // TestServer.testCapabilities, update the test when adding // capabilities. vector capabilities; capabilities.push_back("ConfigChanged"); capabilities.push_back("GetConfigName"); capabilities.push_back("NamedConfig"); capabilities.push_back("Notifications"); capabilities.push_back("Version"); capabilities.push_back("SessionFlags"); capabilities.push_back("SessionAttach"); capabilities.push_back("DatabaseProperties"); return capabilities; } StringMap Server::getVersions() { StringMap versions; versions["version"] = VERSION; versions["system"] = EDSAbiWrapperInfo(); versions["backends"] = SyncSource::backendsInfo(); return versions; } void Server::attachClient(const Caller_t &caller, const boost::shared_ptr &watch) { boost::shared_ptr client = addClient(caller, watch); autoTermRef(); client->increaseAttachCount(); } void Server::detachClient(const Caller_t &caller) { boost::shared_ptr client = findClient(caller); if (client) { autoTermUnref(); client->decreaseAttachCount(); } } void Server::setNotifications(bool enabled, const Caller_t &caller, const string & /* notifications */) { boost::shared_ptr client = findClient(caller); if (client && client->getAttachCount()) { client->setNotificationsEnabled(enabled); } else { SE_THROW("client not attached, not allowed to change notifications"); } } bool Server::notificationsEnabled() { for (Clients_t::iterator it = m_clients.begin(); it != m_clients.end(); ++it) { if (!it->second->getNotificationsEnabled()) { return false; } } return true; } void Server::connect(const Caller_t &caller, const boost::shared_ptr &watch, const StringMap &peer, bool must_authenticate, const std::string &session, DBusObject_t &object) { if (m_shutdownRequested) { // don't allow new connections, we cannot activate them SE_THROW("server shutting down"); } if (!session.empty()) { // reconnecting to old connection is not implemented yet throw std::runtime_error("not implemented"); } std::string new_session = getNextSession(); boost::shared_ptr c(Connection::createConnection(*this, getConnection(), new_session, peer, must_authenticate)); SE_LOG_DEBUG(NULL, "connecting D-Bus client %s with connection %s '%s'", caller.c_str(), c->getPath(), c->m_description.c_str()); boost::shared_ptr client = addClient(caller, watch); client->attach(c); c->activate(); object = c->getPath(); } void Server::startSessionWithFlags(const Caller_t &caller, const boost::shared_ptr &watch, const std::string &server, const std::vector &flags, DBusObject_t &object) { if (m_shutdownRequested) { // don't allow new sessions, we cannot activate them SE_THROW("server shutting down"); } boost::shared_ptr client = addClient(caller, watch); std::string new_session = getNextSession(); boost::shared_ptr session = Session::createSession(*this, "is this a client or server session?", server, new_session, flags); client->attach(session); session->activate(); enqueue(session); object = session->getPath(); } boost::shared_ptr Server::startInternalSession(const std::string &server, SessionFlags flags, const boost::function &session)> &callback) { if (m_shutdownRequested) { // don't allow new sessions, we cannot activate them SE_THROW("server shutting down"); } std::vector dbusFlags; if (flags & SESSION_FLAG_NO_SYNC) { dbusFlags.push_back("no-sync"); } if (flags & SESSION_FLAG_ALL_CONFIGS) { dbusFlags.push_back("all-configs"); } std::string new_session = getNextSession(); boost::shared_ptr session = Session::createSession(*this, "is this a client or server session?", server, new_session, dbusFlags); session->m_sessionActiveSignal.connect(boost::bind(callback, boost::weak_ptr(session))); session->activate(); enqueue(session); return session; } void Server::checkPresence(const std::string &server, std::string &status, std::vector &transports) { return getPresenceStatus().checkPresence(server, status, transports); } void Server::getSessions(std::vector &sessions) { sessions.reserve(m_workQueue.size() + 1); if (m_activeSession) { sessions.push_back(m_activeSession->getPath()); } BOOST_FOREACH(boost::weak_ptr &session, m_workQueue) { boost::shared_ptr s = session.lock(); if (s) { sessions.push_back(s->getPath()); } } } Server::Server(GMainLoop *loop, boost::shared_ptr &restart, const DBusConnectionPtr &conn, int duration) : DBusObjectHelper(conn, SessionCommon::SERVER_PATH, SessionCommon::SERVER_IFACE, boost::bind(&Server::autoTermCallback, this)), m_loop(loop), m_suspendFlagsSource(0), m_shutdownRequested(false), m_restart(restart), m_conn(conn), m_lastSession(time(NULL)), m_activeSession(NULL), m_lastInfoReq(0), m_bluezManager(new BluezManager(*this)), sessionChanged(*this, "SessionChanged"), presence(*this, "Presence"), templatesChanged(*this, "TemplatesChanged"), configChanged(*this, "ConfigChanged"), infoRequest(*this, "InfoRequest"), m_logOutputSignal(*this, "LogOutput"), m_autoTerm(m_loop, m_shutdownRequested, duration), m_dbusLogLevel(Logger::INFO), // TODO (?): turn Server into a proper reference counted instance. // This would help with dangling references to it when other threads // use it for logging, see ServerLogger. However, with mutex locking // in ServerLogger that shouldn't be a problem. m_logger(new ServerLogger(boost::shared_ptr(this, NopDestructor()))) { struct timeval tv; gettimeofday(&tv, NULL); srand(tv.tv_usec); add(this, &Server::getCapabilities, "GetCapabilities"); add(this, &Server::getVersions, "GetVersions"); add(this, &Server::attachClient, "Attach"); add(this, &Server::detachClient, "Detach"); add(this, &Server::enableNotifications, "EnableNotifications"); add(this, &Server::disableNotifications, "DisableNotifications"); add(this, &Server::notificationAction, "NotificationAction"); add(this, &Server::connect, "Connect"); add(this, &Server::startSession, "StartSession"); add(this, &Server::startSessionWithFlags, "StartSessionWithFlags"); add(this, &Server::getConfigs, "GetConfigs"); add(this, &Server::getConfig, "GetConfig"); add(this, &Server::getReports, "GetReports"); add(this, &Server::checkSource, "CheckSource"); add(this, &Server::getDatabases, "GetDatabases"); add(this, &Server::checkPresence, "CheckPresence"); add(this, &Server::getSessions, "GetSessions"); add(this, &Server::infoResponse, "InfoResponse"); add(sessionChanged); add(templatesChanged); add(configChanged); add(presence); add(infoRequest); add(m_logOutputSignal); // Log entering and leaving idle state and // allow/prevent auto-termination. m_idleSignal.connect(boost::bind(&Server::onIdleChange, this, _1)); // connect ConfigChanged signal to source for that information m_configChangedSignal.connect(boost::bind(boost::ref(configChanged))); } gboolean Server::onSuspendFlagsChange(GIOChannel *source, GIOCondition condition, gpointer data) throw () { Server *me = static_cast(data); try { if (!SuspendFlags::getSuspendFlags().isNormal()) { me->m_shutdownRequested = true; g_main_loop_quit(me->m_loop); SE_LOG_INFO(NULL, "server shutting down because of SIGINT or SIGTERM"); } } catch (...) { Exception::handle(); } // Keep watching, just in case that we catch multiple signals. return TRUE; } void Server::activate() { // Watch SuspendFlags fd to react to signals quickly. int fd = SuspendFlags::getSuspendFlags().getEventFD(); GIOChannelCXX channel(g_io_channel_unix_new(fd), TRANSFER_REF); m_suspendFlagsSource = g_io_add_watch(channel, G_IO_IN, onSuspendFlagsChange, this); // Activate our D-Bus object *before* interacting with D-Bus // any further. Otherwise GIO D-Bus will start processing // messages for us while we start up and reject them because // out object isn't visible to it yet. GDBusCXX::DBusObjectHelper::activate(); // Push ourselves as logger for the time being. m_logger->setLevel(Logger::DEBUG); m_pushLogger.reset(m_logger); m_presence.reset(new PresenceStatus(*this)); // Assume that Bluetooth is available. Neither ConnMan nor Network // manager can tell us about that. The "Bluetooth" ConnMan technology // is about IP connection via Bluetooth - not what we need. getPresenceStatus().updatePresenceStatus(true, PresenceStatus::BT_TRANSPORT); m_connman.reset(new ConnmanClient(*this)); m_networkManager.reset(new NetworkManagerClient(*this)); if ((!m_connman || !m_connman->isAvailable()) && (!m_networkManager || !m_networkManager->isAvailable())) { // assume that we are online if no network manager was found at all getPresenceStatus().updatePresenceStatus(true, PresenceStatus::HTTP_TRANSPORT); } // create auto sync manager, now that server is ready m_autoSync = AutoSyncManager::createAutoSyncManager(*this); } Server::~Server() { // make sure all other objects are gone before destructing ourselves if (m_suspendFlagsSource) { g_source_remove(m_suspendFlagsSource); } m_syncSession.reset(); m_workQueue.clear(); m_clients.clear(); m_autoSync.reset(); m_infoReqMap.clear(); m_timeouts.clear(); m_delayDeletion.clear(); m_connman.reset(); m_networkManager.reset(); m_presence.reset(); m_pushLogger.reset(); m_logger.reset(); } bool Server::shutdown() { Timespec now = Timespec::monotonic(); bool autosync = m_autoSync && m_autoSync->preventTerm(); SE_LOG_DEBUG(NULL, "shut down or restart server at %lu.%09lu because of file modifications, auto sync %s", now.tv_sec, now.tv_nsec, autosync ? "on" : "off"); if (autosync) { // suitable exec() call which restarts the server using the same environment it was in // when it was started SE_LOG_INFO(NULL, "server restarting because files loaded into memory were modified on disk"); m_restart->restart(); } else { // leave server now g_main_loop_quit(m_loop); SE_LOG_INFO(NULL, "server shutting down because files loaded into memory were modified on disk"); } return false; } void Server::fileModified(const std::string &file) { SE_LOG_DEBUG(NULL, "file %s modified, %s shutdown: %s, %s", file.c_str(), m_shutdownRequested ? "continuing" : "initiating", m_shutdownTimer ? "timer already active" : "timer not yet active", m_activeSession ? "waiting for active session to finish" : "setting timer"); m_lastFileMod = Timespec::monotonic(); if (!m_activeSession) { m_shutdownTimer.activate(SHUTDOWN_QUIESENCE_SECONDS, boost::bind(&Server::shutdown, this)); } m_shutdownRequested = true; } void Server::run() { // This has the intended side effect that it loads everything into // memory which might be dynamically loadable, like backend // plugins. StringMap map = getVersions(); SE_LOG_DEBUG(NULL, "D-Bus server ready to run, versions:"); BOOST_FOREACH(const StringPair &entry, map) { SE_LOG_DEBUG(NULL, "%s: %s", entry.first.c_str(), entry.second.c_str()); } // Now that everything is loaded, check memory map for files which we have to monitor. set files; std::ifstream in("/proc/self/maps"); while (!in.eof()) { string line; getline(in, line); size_t off = line.find('/'); if (off != line.npos && line.find(" r-xp ") != line.npos) { files.insert(line.substr(off)); } } in.close(); BOOST_FOREACH(const string &file, files) { try { SE_LOG_DEBUG(NULL, "watching: %s", file.c_str()); boost::shared_ptr notify(new GLibNotify(file.c_str(), boost::bind(&Server::fileModified, this, file))); m_files.push_back(notify); } catch (...) { // ignore errors for indidividual files Exception::handle(); } } SE_LOG_INFO(NULL, "ready to run"); // Note that with GDBus GIO, this will also finally request the // "org.syncevolution" name. This relies on preserving the name in // m_conn that we originally passed to dbus_get_bus_connection(). // getConnection() works with a plain GDBusConnection and doesn't // have the name, so we really need our own copy of // DBusConnectionPtr here. dbus_bus_connection_undelay(m_conn); if (!m_shutdownRequested) { g_main_loop_run(m_loop); } SE_LOG_DEBUG(NULL, "%s", "Exiting Server::run"); } /** * look up client by its ID */ boost::shared_ptr Server::findClient(const Caller_t &ID) { for (Clients_t::iterator it = m_clients.begin(); it != m_clients.end(); ++it) { if (it->second->m_ID == ID) { return it->second; } } return boost::shared_ptr(); } boost::shared_ptr Server::addClient(const Caller_t &ID, const boost::shared_ptr &watch) { boost::shared_ptr client(findClient(ID)); if (client) { return client; } client.reset(new Client(*this, ID)); // add to our list *before* checking that peer exists, so // that clientGone() can remove it if the check fails m_clients.push_back(std::make_pair(watch, client)); watch->setCallback(boost::bind(&Server::clientGone, this, client.get())); return client; } void Server::detach(Resource *resource) { BOOST_FOREACH(const Clients_t::value_type &client_entry, m_clients) { client_entry.second->detachAll(resource); } } void Server::enqueue(const boost::shared_ptr &session) { bool idle = isIdle(); WorkQueue_t::iterator it = m_workQueue.end(); while (it != m_workQueue.begin()) { --it; // skip over dead sessions, they will get cleaned up elsewhere boost::shared_ptr session = it->lock(); if (session && session->getPriority() <= session->getPriority()) { ++it; break; } } m_workQueue.insert(it, session); checkQueue(); if (idle) { m_idleSignal(false); } } void Server::killSessionsAsync(const std::string &peerDeviceID, const SimpleResult &onResult) { WorkQueue_t::iterator it = m_workQueue.begin(); while (it != m_workQueue.end()) { boost::shared_ptr session = it->lock(); if (session && session->getPeerDeviceID() == peerDeviceID) { SE_LOG_DEBUG(NULL, "removing pending session %s because it matches deviceID %s", session->getSessionID().c_str(), peerDeviceID.c_str()); // remove session and its corresponding connection boost::shared_ptr c = session->getStubConnection().lock(); if (c) { c->shutdown(); } it = m_workQueue.erase(it); } else { ++it; } } // Check active session. We need to wait for it to shut down cleanly. boost::shared_ptr active = m_activeSessionRef.lock(); if (active && active->getPeerDeviceID() == peerDeviceID) { SE_LOG_DEBUG(NULL, "aborting active session %s because it matches deviceID %s", active->getSessionID().c_str(), peerDeviceID.c_str()); // hand over work to session active->abortAsync(onResult); } else { onResult.done(); } } void Server::dequeue(Session *session) { bool idle = isIdle(); if (m_syncSession.get() == session) { // This is the running sync session. // It's not in the work queue and we have to // keep it active, so nothing to do. return; } for (WorkQueue_t::iterator it = m_workQueue.begin(); it != m_workQueue.end(); ++it) { if (it->lock().get() == session) { // remove from queue m_workQueue.erase(it); break; } } if (m_activeSession == session) { // The session is releasing the lock, so someone else might // run now. sessionChanged(session->getPath(), false); m_activeSession = NULL; m_activeSessionRef.reset(); checkQueue(); } if (!idle && isIdle()) { m_idleSignal(true); } } void Server::addSyncSession(Session *session) { // Only one session can run a sync, and only the active session // can make itself the sync session. if (m_syncSession) { if (m_syncSession.get() != session) { SE_THROW("already have a sync session"); } else { return; } } m_syncSession = m_activeSessionRef.lock(); m_newSyncSessionSignal(m_syncSession); if (!m_syncSession) { SE_THROW("session should not start a sync, all clients already detached"); } if (m_syncSession.get() != session) { m_syncSession.reset(); SE_THROW("inactive session asked to become sync session"); } } void Server::removeSyncSession(Session *session) { if (session == m_syncSession.get()) { // Normally the owner calls this, but if it is already gone, // then do it again and thus effectively start counting from // now. delaySessionDestruction(m_syncSession); m_syncSession.reset(); } else { SE_LOG_DEBUG(NULL, "ignoring removeSyncSession() for session %s, it is not the sync session", session->getSessionID().c_str()); } } static void quitLoop(GMainLoop *loop) { SE_LOG_DEBUG(NULL, "stopping server's event loop"); g_main_loop_quit(loop); } void Server::checkQueue() { if (m_activeSession) { // still busy return; } if (m_shutdownRequested) { // Don't schedule new sessions. Instead return to Server::run(). // But don't do it immediately: when done inside the Session.Detach() // call, the D-Bus response was not delivered reliably to the client // which caused the shutdown. SE_LOG_DEBUG(NULL, "shutting down in checkQueue(), idle and shutdown was requested"); addTimeout(boost::bind(quitLoop, m_loop), 0); return; } while (!m_workQueue.empty()) { boost::shared_ptr session = m_workQueue.front().lock(); m_workQueue.pop_front(); if (session) { // activate the session m_activeSession = session.get(); m_activeSessionRef = session; SE_LOG_DEBUG(NULL, "activating session %p", m_activeSession); session->activateSession(); sessionChanged(session->getPath(), true); return; } } } void Server::sessionExpired(const boost::shared_ptr &session) { SE_LOG_DEBUG(NULL, "session %s expired", session->getSessionID().c_str()); } void Server::delaySessionDestruction(const boost::shared_ptr &session) { if (!session) { return; } SE_LOG_DEBUG(NULL, "delaying destruction of session %s by one minute", session->getSessionID().c_str()); addTimeout(boost::bind(&Server::sessionExpired, session), 60 /* 1 minute */); } inline void insertPair(std::map ¶ms, const string &key, const string &value) { if(!value.empty()) { params.insert(pair(key, value)); } } boost::shared_ptr Server::passwordRequest(const string &descr, const ConfigPasswordKey &key, const boost::weak_ptr &s) { boost::shared_ptr session = s.lock(); if (!session) { // already gone, ignore request return boost::shared_ptr(); } std::map params; insertPair(params, "description", descr); insertPair(params, "user", key.user); insertPair(params, "SyncML server", key.server); insertPair(params, "domain", key.domain); insertPair(params, "object", key.object); insertPair(params, "protocol", key.protocol); insertPair(params, "authtype", key.authtype); insertPair(params, "port", key.port ? StringPrintf("%u",key.port) : ""); boost::shared_ptr req = createInfoReq("password", params, *session); // Return password or failure to Session and thus the session helper. req->m_responseSignal.connect(boost::bind(&Server::passwordResponse, this, _1, s)); // Tell session about timeout. req->m_timeoutSignal.connect(InfoReq::TimeoutSignal_t::slot_type(&Session::passwordResponse, session.get(), true, false, "").track(s)); // Request becomes obsolete when session is done. session->m_doneSignal.connect(boost::bind(&Server::removeInfoReq, this, req->getId())); return req; } void Server::passwordResponse(const InfoReq::InfoMap &response, const boost::weak_ptr &s) { boost::shared_ptr session = s.lock(); if (!session) { // already gone, ignore request return; } InfoReq::InfoMap::const_iterator it = response.find("password"); if (it == response.end()) { // no password provided, user wants to abort session->passwordResponse(false, true, ""); } else { // password provided, might be empty session->passwordResponse(false, false, it->second); } } bool Server::callTimeout(const boost::shared_ptr &timeout, const boost::function &callback) { callback(); // We are executing the timeout, don't invalidate the instance // until later when our caller is no longer using the instance to // call us. delayDeletion(timeout); m_timeouts.remove(timeout); return false; } void Server::addTimeout(const boost::function &callback, int seconds) { boost::shared_ptr timeout(new Timeout); m_timeouts.push_back(timeout); timeout->activate(seconds, boost::bind(&Server::callTimeout, this, // avoid copying the shared pointer here, // otherwise the Timeout will never be deleted boost::ref(m_timeouts.back()), callback)); } void Server::infoResponse(const Caller_t &caller, const std::string &id, const std::string &state, const std::map &response) { InfoReqMap::iterator it = m_infoReqMap.find(id); // if not found, ignore if (it != m_infoReqMap.end()) { const boost::shared_ptr infoReq = it->second.lock(); if (infoReq) { infoReq->setResponse(caller, state, response); } } } boost::shared_ptr Server::createInfoReq(const string &type, const std::map ¶meters, const Session &session) { boost::shared_ptr infoReq(new InfoReq(*this, type, parameters, session.getPath())); m_infoReqMap.insert(std::make_pair(infoReq->getId(), infoReq)); // will be removed automatically infoReq->m_responseSignal.connect(boost::bind(&Server::removeInfoReq, this, infoReq->getId())); infoReq->m_timeoutSignal.connect(boost::bind(&Server::removeInfoReq, this, infoReq->getId())); return infoReq; } std::string Server::getNextInfoReq() { return StringPrintf("%u", ++m_lastInfoReq); } void Server::emitInfoReq(const InfoReq &req) { infoRequest(req.getId(), req.getSessionPath(), req.getInfoStateStr(), req.getHandler(), req.getType(), req.getParam()); } void Server::removeInfoReq(const std::string &id) { // remove InfoRequest from hash map m_infoReqMap.erase(id); } PresenceStatus &Server::getPresenceStatus() { if (!m_presence) { SE_THROW("internal error: Server::getPresenceStatus() called while server has no instance"); } return *m_presence; } void Server::getDeviceList(SyncConfig::DeviceList &devices) { //wait bluez or other device managers // TODO: make this asynchronous?! while(!m_bluezManager->isDone()) { g_main_loop_run(m_loop); } devices.clear(); devices = m_syncDevices; } void Server::addPeerTempl(const string &templName, const boost::shared_ptr peerTempl) { std::string lower = templName; boost::to_lower(lower); m_matchedTempls.insert(MatchedTemplates::value_type(lower, peerTempl)); } boost::shared_ptr Server::getPeerTempl(const string &peer) { std::string lower = peer; boost::to_lower(lower); MatchedTemplates::iterator it = m_matchedTempls.find(lower); if(it != m_matchedTempls.end()) { return it->second; } else { return boost::shared_ptr(); } } bool Server::getDevice(const string &deviceId, SyncConfig::DeviceDescription &device) { SyncConfig::DeviceList::iterator syncDevIt; for (syncDevIt = m_syncDevices.begin(); syncDevIt != m_syncDevices.end(); ++syncDevIt) { if (boost::equals(syncDevIt->m_deviceId, deviceId)) { device = *syncDevIt; if (syncDevIt->m_pnpInformation) { device.m_pnpInformation = boost::shared_ptr( new SyncConfig::PnpInformation(syncDevIt->m_pnpInformation->m_vendor, syncDevIt->m_pnpInformation->m_product)); } return true; } } return false; } void Server::addDevice(const SyncConfig::DeviceDescription &device) { SyncConfig::DeviceList::iterator it; for (it = m_syncDevices.begin(); it != m_syncDevices.end(); ++it) { if (boost::iequals(it->m_deviceId, device.m_deviceId)) { break; } } if (it == m_syncDevices.end()) { m_syncDevices.push_back(device); templatesChanged(); } } void Server::removeDevice(const string &deviceId) { SyncConfig::DeviceList::iterator syncDevIt; for (syncDevIt = m_syncDevices.begin(); syncDevIt != m_syncDevices.end(); ++syncDevIt) { if (boost::equals(syncDevIt->m_deviceId, deviceId)) { m_syncDevices.erase(syncDevIt); templatesChanged(); break; } } } void Server::updateDevice(const string &deviceId, const SyncConfig::DeviceDescription &device) { SyncConfig::DeviceList::iterator it; for (it = m_syncDevices.begin(); it != m_syncDevices.end(); ++it) { if (boost::iequals(it->m_deviceId, deviceId)) { (*it) = device; templatesChanged(); break; } } } void Server::message2DBus(const Logger::MessageOptions &options, const char *format, va_list args, const std::string &dbusPath, const std::string &procname) { // prefix is used to set session path // for general server output, the object path field is dbus server // the object path can't be empty for object paths prevent using empty string. m_logger->message2DBus(this, options, format, args, dbusPath, procname); } void Server::logOutput(const GDBusCXX::DBusObject_t &path, Logger::Level level, const std::string &explanation, const std::string &procname) { if (level <= m_dbusLogLevel) { string strLevel = Logger::levelToStr(level); m_logOutputSignal(path, strLevel, explanation, procname); } } SE_END_CXX syncevolution-1.5/src/dbus/server/session.cpp0000644000373300001540000016126612360740724022760 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "session.h" #include "connection.h" #include "server.h" #include "client.h" #include "restart.h" #include "info-req.h" #include "session-common.h" #include "dbus-callbacks.h" #include "presence-status.h" #include #include #include #ifdef USE_DLT #include #endif #include #include using namespace GDBusCXX; SE_BEGIN_CXX /** A Proxy to the remote session. */ class SessionProxy : public GDBusCXX::DBusRemoteObject { public: SessionProxy(const GDBusCXX::DBusConnectionPtr &conn, const std::string &instance) : GDBusCXX::DBusRemoteObject(conn.get(), std::string(SessionCommon::HELPER_PATH) + "/" + instance, SessionCommon::HELPER_IFACE, SessionCommon::HELPER_DESTINATION, true), // This is a one-to-one connection. Close it. /* m_getNamedConfig (*this, "GetNamedConfig"), */ /* m_setNamedConfig (*this, "SetNamedConfig"), */ /* m_getReports (*this, "GetReports"), */ /* m_checkSource (*this, "CheckSource"), */ /* m_getDatabases (*this, "GetDatabases"), */ m_sync(*this, "Sync"), m_setFreeze(*this, "SetFreeze"), m_restore(*this, "Restore"), m_execute(*this, "Execute"), m_passwordResponse(*this, "PasswordResponse"), m_storeMessage(*this, "StoreMessage"), m_connectionState(*this, "ConnectionState"), /* m_abort (*this, "Abort"), */ /* m_suspend (*this, "Suspend"), */ /* m_getStatus (*this, "GetStatus"), */ /* m_getProgress (*this, "GetProgress"), */ /* m_restore (*this, "Restore"), */ /* m_execute (*this, "Execute"), */ /* m_serverShutdown (*this, "ServerShutdown"), */ /* m_passwordResponse (*this, "PasswordResponse"), */ /* m_setActive (*this, "SetActive"), */ /* m_statusChanged (*this, "StatusChanged", false), */ /* m_progressChanged (*this, "ProgressChanged", false), */ m_logOutput(*this, "LogOutput", false), m_syncProgress(*this, "SyncProgress", false), m_sourceProgress(*this, "SourceProgress", false), m_sourceSynced(*this, "SourceSynced", false), m_waiting(*this, "Waiting", false), m_syncSuccessStart(*this, "SyncSuccessStart", false), m_configChanged(*this, "ConfigChanged", false), m_passwordRequest(*this, "PasswordRequest", false), m_sendMessage(*this, "Message", false), m_shutdownConnection(*this, "Shutdown", false) {} /* GDBusCXX::DBusClientCall1 m_getNamedConfig; */ /* GDBusCXX::DBusClientCall1 m_setNamedConfig; */ /* GDBusCXX::DBusClientCall1 > m_getReports; */ /* GDBusCXX::DBusClientCall0 m_checkSource; */ /* GDBusCXX::DBusClientCall1 m_getDatabases; */ GDBusCXX::DBusClientCall2 m_sync; GDBusCXX::DBusClientCall1 m_setFreeze; GDBusCXX::DBusClientCall1 m_restore; GDBusCXX::DBusClientCall1 m_execute; /* GDBusCXX::DBusClientCall0 m_serverShutdown; */ GDBusCXX::DBusClientCall0 m_passwordResponse; GDBusCXX::DBusClientCall0 m_storeMessage; GDBusCXX::DBusClientCall0 m_connectionState; /* GDBusCXX::DBusClientCall0 m_setActive; */ /* GDBusCXX::SignalWatch3 m_statusChanged; */ GDBusCXX::SignalWatch3 m_logOutput; GDBusCXX::SignalWatch4 m_syncProgress; GDBusCXX::SignalWatch6 m_sourceProgress; GDBusCXX::SignalWatch2 m_sourceSynced; GDBusCXX::SignalWatch1 m_waiting; GDBusCXX::SignalWatch0 m_syncSuccessStart; GDBusCXX::SignalWatch0 m_configChanged; GDBusCXX::SignalWatch2 m_passwordRequest; GDBusCXX::SignalWatch3, std::string, std::string> m_sendMessage; GDBusCXX::SignalWatch0 m_shutdownConnection; }; void Session::attach(const Caller_t &caller) { boost::shared_ptr client(m_server.findClient(caller)); if (!client) { throw runtime_error("unknown client"); } boost::shared_ptr me = m_me.lock(); if (!me) { throw runtime_error("session already deleted?!"); } client->attach(me); } void Session::detach(const Caller_t &caller) { boost::shared_ptr client(m_server.findClient(caller)); if (!client) { throw runtime_error("unknown client"); } client->detach(this); } /** * validate key/value property and copy it to the filter * if okay */ static void copyProperty(const StringPair &keyvalue, ConfigPropertyRegistry ®istry, FilterConfigNode::ConfigFilter &filter) { const std::string &name = keyvalue.first; const std::string &value = keyvalue.second; const ConfigProperty *prop = registry.find(name); if (!prop) { SE_THROW_EXCEPTION(InvalidCall, StringPrintf("unknown property '%s'", name.c_str())); } std::string error; if (!prop->checkValue(value, error)) { SE_THROW_EXCEPTION(InvalidCall, StringPrintf("invalid value '%s' for property '%s': '%s'", value.c_str(), name.c_str(), error.c_str())); } filter.insert(std::make_pair(keyvalue.first, InitStateString(keyvalue.second, true))); } static void setSyncFilters(const ReadOperations::Config_t &config,FilterConfigNode::ConfigFilter &syncFilter,std::map &sourceFilters) { ReadOperations::Config_t::const_iterator it; for (it = config.begin(); it != config.end(); ++it) { map::const_iterator sit; string name = it->first; if (name.empty()) { ConfigPropertyRegistry ®istry = SyncConfig::getRegistry(); for (sit = it->second.begin(); sit != it->second.end(); ++sit) { // read-only properties can (and have to be) ignored static const char *init[] = { "configName", "description", "score", "deviceName", "hardwareName", "templateName", "fingerprint" }; static const set< std::string, Nocase > special(init, init + (sizeof(init) / sizeof(*init))); if (special.find(sit->first) == special.end()) { copyProperty(*sit, registry, syncFilter); } } } else if (boost::starts_with(name, "source/")) { name = name.substr(strlen("source/")); FilterConfigNode::ConfigFilter &sourceFilter = sourceFilters[name]; ConfigPropertyRegistry ®istry = SyncSourceConfig::getRegistry(); for (sit = it->second.begin(); sit != it->second.end(); ++sit) { copyProperty(*sit, registry, sourceFilter); } } else { SE_THROW_EXCEPTION(InvalidCall, StringPrintf("invalid config entry '%s'", name.c_str())); } } } void Session::setConfig(bool update, bool temporary, const ReadOperations::Config_t &config) { setNamedConfig(m_configName, update, temporary, config); } void Session::setNamedConfig(const std::string &configName, bool update, bool temporary, const ReadOperations::Config_t &config) { PushLogger guard(m_me); if (m_runOperation != SessionCommon::OP_NULL) { string msg = StringPrintf("%s started, cannot change configuration at this time", runOpToString(m_runOperation).c_str()); SE_THROW_EXCEPTION(InvalidCall, msg); } if (m_status != SESSION_ACTIVE) { SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time"); } // avoid the check if effect is the same as setConfig() if (m_configName != configName) { bool found = false; BOOST_FOREACH(const std::string &flag, m_flags) { if (boost::iequals(flag, "all-configs")) { found = true; break; } } if (!found) { SE_THROW_EXCEPTION(InvalidCall, "SetNameConfig() only allowed in 'all-configs' sessions"); } if (temporary) { SE_THROW_EXCEPTION(InvalidCall, "SetNameConfig() with temporary config change only supported for config named when starting the session"); } } m_server.getPresenceStatus().updateConfigPeers (configName, config); /** check whether we need remove the entire configuration */ if(!update && !temporary && config.empty()) { boost::shared_ptr syncConfig(new SyncConfig(configName)); if(syncConfig.get()) { syncConfig->remove(); m_setConfig = true; } return; } /* * validate input config and convert to filters; * if validation fails, no harm was done at this point yet */ FilterConfigNode::ConfigFilter syncFilter; SourceFilters_t sourceFilters; setSyncFilters(config, syncFilter, sourceFilters); if (temporary) { /* save temporary configs in session filters, either erasing old temporary settings or adding to them */ if (update) { m_syncFilter.insert(syncFilter.begin(), syncFilter.end()); BOOST_FOREACH(SourceFilters_t::value_type &source, sourceFilters) { SourceFilters_t::iterator it = m_sourceFilters.find(source.first); if (it != m_sourceFilters.end()) { // add to existing source filter it->second.insert(source.second.begin(), source.second.end()); } else { // add source filter m_sourceFilters.insert(source); } } } else { m_syncFilter = syncFilter; m_sourceFilters = sourceFilters; } m_tempConfig = true; } else { /* need to save configurations */ boost::shared_ptr from(new SyncConfig(configName)); /* if it is not clear mode and config does not exist, an error throws */ if(update && !from->exists()) { SE_THROW_EXCEPTION(NoSuchConfig, "The configuration '" + configName + "' doesn't exist" ); } if(!update) { list sources = from->getSyncSources(); list::iterator it; for(it = sources.begin(); it != sources.end(); ++it) { string source = "source/"; source += *it; ReadOperations::Config_t::const_iterator configIt = config.find(source); if(configIt == config.end()) { /** if no config for this source, we remove it */ from->removeSyncSource(*it); } else { /** just clear visiable properties, remove them and their values */ from->clearSyncSourceProperties(*it); } } from->clearSyncProperties(); } /** generate new sources in the config map */ for (ReadOperations::Config_t::const_iterator it = config.begin(); it != config.end(); ++it) { string sourceName = it->first; if(sourceName.find("source/") == 0) { sourceName = sourceName.substr(7); ///> 7 is the length of "source/" from->getSyncSourceNodes(sourceName); } } /* apply user settings */ from->setConfigFilter(true, "", syncFilter); map::iterator it; for (it = sourceFilters.begin(); it != sourceFilters.end(); ++it) { from->setConfigFilter(false, it->first, it->second); } // We need no interactive user interface, but we do need to handle // storing passwords in a keyring here. boost::shared_ptr syncConfig(new SyncContext(configName)); syncConfig->prepareConfigForWrite(); syncConfig->copy(*from, NULL); class KeyringUI : public UserInterface { InitStateString m_keyring; public: KeyringUI(const InitStateString &keyring) : m_keyring(keyring) {} // Implement UserInterface. virtual bool savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { return GetSavePasswordSignal()(m_keyring, passwordName, password, key); } virtual void readStdin(std::string &content) { SE_THROW("not implemented"); } virtual std::string askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key) { SE_THROW("not implemented"); return ""; } } ui(syncConfig->getKeyring()); syncConfig->preFlush(ui); syncConfig->flush(); m_setConfig = true; } } void Session::initServer(SharedBuffer data, const std::string &messageType) { PushLogger guard(m_me); m_serverMode = true; m_initialMessage = data; m_initialMessageType = messageType; } void Session::syncExtended(const std::string &mode, const SessionCommon::SourceModes_t &sourceModes, const StringMap &env) { PushLogger guard(m_me); if (m_runOperation == SessionCommon::OP_SYNC) { string msg = StringPrintf("%s started, cannot start again", runOpToString(m_runOperation).c_str()); SE_THROW_EXCEPTION(InvalidCall, msg); } else if (m_runOperation != SessionCommon::OP_NULL) { string msg = StringPrintf("%s started, cannot start sync", runOpToString(m_runOperation).c_str()); SE_THROW_EXCEPTION(InvalidCall, msg); } if (m_status != SESSION_ACTIVE) { SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time"); } m_syncMode = mode; m_syncEnv = env; // Turn session into "running sync" now, before returning to // caller. Starting the helper (if needed) and making it // execute the sync is part of "running sync". runOperationAsync(SessionCommon::OP_SYNC, boost::bind(&Session::sync2, this, mode, sourceModes), env); } void Session::sync2(const std::string &mode, const SessionCommon::SourceModes_t &sourceModes) { PushLogger guard(m_me); if (!m_forkExecParent || !m_helper) { SE_THROW("syncing cannot continue, helper died"); } // helper is ready, tell it what to do SyncParams params; params.m_config = m_configName; params.m_mode = mode; params.m_sourceModes = sourceModes; params.m_serverMode = m_serverMode; params.m_serverAlerted = m_serverAlerted; params.m_remoteInitiated = m_remoteInitiated; params.m_sessionID = m_sessionID; params.m_initialMessage = m_initialMessage; params.m_initialMessageType = m_initialMessageType; params.m_syncFilter = m_syncFilter; params.m_sourceFilter = m_sourceFilter; params.m_sourceFilters = m_sourceFilters; boost::shared_ptr c = m_connection.lock(); if (c && !c->mustAuthenticate()) { // unsetting username/password disables checking them params.m_syncFilter["password"] = InitStateString("", true); params.m_syncFilter["username"] = InitStateString("", true); } // Relay messages between connection and helper.If the // connection goes away, we need to tell the helper, because // otherwise it will never know that its message went into nirvana // and that it is waiting for a reply that will never come. // // We also need to send responses to the helper asynchronously // and ignore failures -> do it in our code instead of connection // signals directly. // // Session might quit before connection, so use instance // tracking. m_helper->m_sendMessage.activate(boost::bind(&Session::sendViaConnection, this, _1, _2, _3)); m_helper->m_shutdownConnection.activate(boost::bind(&Session::shutdownConnection, this)); boost::shared_ptr connection = m_connection.lock(); if (connection) { connection->m_messageSignal.connect(Connection::MessageSignal_t::slot_type(&Session::storeMessage, this, _1, _2).track(m_me)); connection->m_statusSignal.connect(Connection::StatusSignal_t::slot_type(&Session::connectionState, this, _1)); } // Helper implements Sync() asynchronously. If it completes // normally, dbusResultCb() will call doneCb() directly. Otherwise // the error is recorded before ending the session. Premature // exits by the helper are handled by D-Bus, which then will abort // the pending method call. m_helper->m_sync.start(params, boost::bind(&Session::dbusResultCb, m_me, "sync()", _1, _2, _3)); } void Session::abort() { PushLogger guard(m_me); if (m_runOperation != SessionCommon::OP_SYNC && m_runOperation != SessionCommon::OP_CMDLINE) { SE_THROW_EXCEPTION(InvalidCall, "sync not started, cannot abort at this time"); } if (m_forkExecParent) { // Tell helper to abort via SIGTERM. The signal might get // delivered so soon that the helper quits immediately. // Treat that as "aborted by user" instead of failure // in m_onQuit. m_wasAborted = true; m_forkExecParent->stop(SIGTERM); } if (m_syncStatus == SYNC_RUNNING || m_syncStatus == SYNC_SUSPEND) { m_syncStatus = SYNC_ABORT; fireStatus(true); } } void Session::setFreezeAsync(bool freeze, const Result &result) { PushLogger guard(m_me); SE_LOG_DEBUG(NULL, "session %s: SetFreeze(%s), %s", getPath(), freeze ? "freeze" : "thaw", m_forkExecParent ? "send to helper" : "no effect, because no helper"); if (m_forkExecParent) { m_helper->m_setFreeze.start(freeze, boost::bind(&Session::setFreezeDone, m_me, _1, _2, freeze, result)); } else { // Had no effect. result.done(false); } } void Session::setFreezeDone(bool changed, const std::string &error, bool freeze, const Result &result) { PushLogger guard(m_me); try { SE_LOG_DEBUG(NULL, "session %s: SetFreeze(%s) returned from helper %s, error %s", getPath(), freeze ? "freeze" : "thaw", changed ? "changed freeze state" : "no effect", error.c_str()); if (!error.empty()) { Exception::tryRethrowDBus(error); } if (changed) { m_freeze = freeze; } result.done(changed); } catch (...) { result.failed(); } } void Session::suspend() { PushLogger guard(m_me); if (m_runOperation != SessionCommon::OP_SYNC && m_runOperation != SessionCommon::OP_CMDLINE) { SE_THROW_EXCEPTION(InvalidCall, "sync not started, cannot suspend at this time"); } if (m_forkExecParent) { // same as abort(), except that we use SIGINT m_wasAborted = true; m_forkExecParent->stop(SIGINT); } if (m_syncStatus == SYNC_RUNNING) { m_syncStatus = SYNC_SUSPEND; fireStatus(true); } } void Session::abortAsync(const SimpleResult &result) { PushLogger guard(m_me); if (!m_forkExecParent) { result.done(); } else { // Tell helper to quit, if necessary by aborting a running sync. // Once it is dead we know that the session no longer runs. // This must succeed; there is no timeout or failure mode. // TODO: kill helper after a certain amount of time?! m_forkExecParent->stop(SIGTERM); m_forkExecParent->m_onQuit.connect(boost::bind(&SimpleResult::done, result)); } } void Session::getStatus(std::string &status, uint32_t &error, SourceStatuses_t &sources) { PushLogger guard(m_me); status = syncStatusToString(m_syncStatus); if (m_stepIsWaiting) { status += ";waiting"; } error = m_error; sources = m_sourceStatus; } void Session::getAPIProgress(int32_t &progress, APISourceProgresses_t &sources) { PushLogger guard(m_me); progress = m_progData.getProgress(); sources = m_sourceProgress; } void Session::getProgress(int32_t &progress, SourceProgresses_t &sources) { PushLogger guard(m_me); progress = m_progData.getProgress(); sources = m_sourceProgress; } bool Session::getSyncSourceReport(const std::string &sourceName, SyncSourceReport &report) const { SyncSourceReports::const_iterator it = m_syncSourceReports.find(sourceName); if (it != m_syncSourceReports.end()) { report = it->second; return true; } else { return false; } } void Session::fireStatus(bool flush) { PushLogger guard(m_me); std::string status; uint32_t error; SourceStatuses_t sources; /** not force flushing and not timeout, return */ if(!flush && !m_statusTimer.timeout()) { return; } m_statusTimer.reset(); getStatus(status, error, sources); m_statusSignal(status, error, sources); } void Session::fireProgress(bool flush) { PushLogger guard(m_me); int32_t progress; SourceProgresses_t sources; /** not force flushing and not timeout, return */ if(!flush && !m_progressTimer.timeout()) { return; } m_progressTimer.reset(); getProgress(progress, sources); m_progressSignal(progress, sources); } boost::shared_ptr Session::createSession(Server &server, const std::string &peerDeviceID, const std::string &config_name, const std::string &session, const std::vector &flags) { boost::shared_ptr me(new Session(server, peerDeviceID, config_name, session, flags)); me->m_me = me; return me; } static void SetProgress(Session::SourceProgresses_t &to, const Session::SourceProgresses_t &from) { to = from; } Session::Session(Server &server, const std::string &peerDeviceID, const std::string &config_name, const std::string &session, const std::vector &flags) : DBusObjectHelper(server.getConnection(), std::string("/org/syncevolution/Session/") + session, "org.syncevolution.Session", boost::bind(&Server::autoTermCallback, &server)), ReadOperations(config_name, server), m_flags(flags), m_sessionID(session), m_peerDeviceID(peerDeviceID), m_serverMode(false), m_serverAlerted(false), m_useConnection(false), m_tempConfig(false), m_setConfig(false), m_status(SESSION_IDLE), m_wasAborted(false), m_remoteInitiated(false), m_syncStatus(SYNC_QUEUEING), m_stepIsWaiting(false), m_priority(PRI_DEFAULT), m_error(0), m_lastProgressTimestamp(Timespec::monotonic()), m_freeze(false), m_statusTimer(100), m_progressTimer(50), m_restoreSrcTotal(0), m_restoreSrcEnd(0), m_runOperation(SessionCommon::OP_NULL), m_cmdlineOp(SessionCommon::OP_CMDLINE), emitStatus(*this, "StatusChanged"), emitProgress(*this, "ProgressChanged") { add(this, &Session::attach, "Attach"); add(this, &Session::detach, "Detach"); add(this, &Session::getFlags, "GetFlags"); add(this, &Session::getNormalConfigName, "GetConfigName"); add(static_cast(this), &ReadOperations::getConfigs, "GetConfigs"); add(static_cast(this), &ReadOperations::getConfig, "GetConfig"); add(static_cast(this), &ReadOperations::getNamedConfig, "GetNamedConfig"); add(this, &Session::setConfig, "SetConfig"); add(this, &Session::setNamedConfig, "SetNamedConfig"); add(static_cast(this), &ReadOperations::getReports, "GetReports"); add(static_cast(this), &ReadOperations::checkSource, "CheckSource"); add(static_cast(this), &ReadOperations::getDatabases, "GetDatabases"); add(this, &Session::sync, "Sync"); add(this, &Session::abort, "Abort"); add(this, &Session::suspend, "Suspend"); add(this, &Session::getStatus, "GetStatus"); add(this, &Session::getAPIProgress, "GetProgress"); add(this, &Session::restore, "Restore"); add(this, &Session::checkPresence, "CheckPresence"); add(this, &Session::execute, "Execute"); add(emitStatus); add(emitProgress); m_statusSignal.connect(boost::bind(boost::ref(emitStatus), _1, _2, _3)); m_progressSignal.connect(boost::bind(&Timespec::resetMonotonic, &m_lastProgressTimestamp)); m_progressSignal.connect(boost::bind(SetProgress, boost::ref(m_lastProgress), _2)); m_progressSignal.connect(boost::bind(boost::ref(emitProgress), _1, _2)); SE_LOG_DEBUG(NULL, "session %s created", getPath()); } void Session::passwordRequest(const std::string &descr, const ConfigPasswordKey &key) { PushLogger guard(m_me); m_passwordRequest = m_server.passwordRequest(descr, key, m_me); } void Session::dbusResultCb(const std::string &operation, bool success, const SyncReport &report, const std::string &error) throw() { PushLogger guard(m_me); try { SE_LOG_DEBUG(NULL, "%s helper call completed, %s", operation.c_str(), !error.empty() ? error.c_str() : success ? "<>" : "<>"); if (error.empty()) { doneCb(success, report); } else { // Translate back into local exception, will be handled by // catch clause and (eventually) failureCb(). Exception::tryRethrowDBus(error); // generic fallback throw GDBusCXX::dbus_error("org.syncevolution.gdbuscxx.Exception", error); } } catch (...) { failureCb(); } } void Session::failureCb() throw() { PushLogger guard(m_me); try { if (m_status == SESSION_DONE) { // ignore errors that happen after session already closed, // only log them std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); m_server.logOutput(getPath(), Logger::ERROR, explanation, ""); } else { // finish session with failure uint32_t error; try { throw; } catch (...) { // only record problem std::string explanation; error = Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); m_server.logOutput(getPath(), Logger::ERROR, explanation, ""); } // set error, but don't overwrite older one if (!m_error) { SE_LOG_DEBUG(NULL, "session failed: remember %d error", error); m_error = error; } // will fire status signal, including the error doneCb(false); } } catch (...) { // fatal problem, log it and terminate Exception::handle(HANDLE_EXCEPTION_FATAL); } } void Session::doneCb(bool success, const SyncReport &report) throw() { PushLogger guard(m_me); try { if (m_status == SESSION_DONE) { return; } m_status = SESSION_DONE; m_syncStatus = SYNC_DONE; if (!success && !m_error) { // some kind of local, internal problem m_error = STATUS_FATAL + sysync::LOCAL_STATUS_CODE; } fireStatus(true); boost::shared_ptr connection = m_connection.lock(); if (connection) { connection->shutdown(); } // tell everyone who is interested that our config changed (includes D-Bus signal) if (m_setConfig) { m_server.m_configChangedSignal(m_configName); } SE_LOG_DEBUG(NULL, "session %s done, config %s, %s, result %d", getPath(), m_configName.c_str(), m_setConfig ? "modified" : "not modified", m_error); m_doneSignal((SyncMLStatus)m_error, report); // now also kill helper m_helper.reset(); if (m_forkExecParent) { // Abort (just in case, helper should already be waiting // for SIGURG). m_forkExecParent->stop(SIGTERM); // Quit. m_forkExecParent->stop(SIGURG); } m_server.removeSyncSession(this); m_server.dequeue(this); } catch (...) { // fatal problem, log it and terminate (?!) Exception::handle(); } } Session::~Session() { SE_LOG_DEBUG(NULL, "session %s deconstructing", getPath()); // If we are not done yet, then something went wrong. doneCb(false); } /** child has quit before connecting, invoke result.failed() with suitable exception pending */ static void raiseChildTermError(int status, const SimpleResult &result) { try { SE_THROW(StringPrintf("helper died unexpectedly with return code %d before connecting", status)); } catch (...) { result.failed(); } } void Session::runOperationAsync(SessionCommon::RunOperation op, const SuccessCb_t &helperReady, const StringMap &env) { PushLogger guard(m_me); m_server.addSyncSession(this); m_runOperation = op; m_status = SESSION_RUNNING; m_syncStatus = SYNC_RUNNING; fireStatus(true); useHelperAsync(SimpleResult(helperReady, boost::bind(&Session::failureCb, this)), env); } void Session::useHelperAsync(const SimpleResult &result, const StringMap &env) { PushLogger guard(m_me); try { if (m_helper) { // exists already, invoke callback directly result.done(); } // Construct m_forkExecParent if it doesn't exist yet or not // currently starting. The only situation where the latter // might happen is when the helper is still starting when // a new request comes in. In that case we reuse the same // helper process for both operations. if (!m_forkExecParent || m_forkExecParent->getState() != ForkExecParent::STARTING) { std::vector args; args.push_back("--dbus-verbosity"); args.push_back(StringPrintf("%d", m_server.getDBusLogLevel())); m_forkExecParent = SyncEvo::ForkExecParent::create("syncevo-dbus-helper", args); #ifdef USE_DLT if (getenv("SYNCEVOLUTION_USE_DLT")) { m_forkExecParent->addEnvVar("SYNCEVOLUTION_USE_DLT", StringPrintf("%d", LoggerDLT::getCurrentDLTLogLevel())); } #endif BOOST_FOREACH (const StringPair &entry, env) { SE_LOG_DEBUG(NULL, "running helper with env variable %s=%s", entry.first.c_str(), entry.second.c_str()); m_forkExecParent->addEnvVar(entry.first, entry.second); } // We own m_forkExecParent, so the "this" pointer for // onConnect will live longer than the signal in // m_forkExecParent -> no need for resource // tracking. onConnect sets up m_helper. The other two // only log the event. m_forkExecParent->m_onConnect.connect(bind(&Session::onConnect, this, _1)); m_forkExecParent->m_onQuit.connect(boost::bind(&Session::onQuit, this, _1)); m_forkExecParent->m_onFailure.connect(boost::bind(&Session::onFailure, this, _1, _2)); if (!getenv("SYNCEVOLUTION_DEBUG")) { // Any output from the helper is unexpected and will be // logged as error. The helper initializes stderr and // stdout redirection once it runs, so anything that // reaches us must have been problems during early process // startup or final shutdown. m_forkExecParent->m_onOutput.connect(bind(&Session::onOutput, this, _1, _2)); } } // Now also connect result with the right events. Will be // called after setting up m_helper (first come, first // serve). We copy the "result" instance with boost::bind, and // the creator of it must have made sure that we can invoke it // at any time without crashing. // // If the helper quits before connecting, the startup // failed. Need to remove that connection when successful. boost::signals2::connection c = m_forkExecParent->m_onQuit.connect(boost::bind(&raiseChildTermError, _1, result)); m_forkExecParent->m_onConnect.connect(boost::bind(&Session::useHelper2, this, result, c)); if (m_forkExecParent->getState() == ForkExecParent::IDLE) { m_forkExecParent->start(); } } catch (...) { // The assumption here is that any exception is related only // to the requested operation, and that the server itself is still // healthy. result.failed(); } } void Session::messagev(const MessageOptions &options, const char *format, va_list args) { // log with session path and empty process name, // just like the syncevo-dbus-helper does m_server.message2DBus(options, format, args, getPath(), ""); } static void Logging2ServerAndStdout(Server &server, const GDBusCXX::DBusObject_t &path, const Logger::MessageOptions &options, const char *format, ...) { va_list args; va_start(args, format); server.message2DBus(options, format, args, path, options.m_processName ? *options.m_processName : ""); va_end(args); } static void Logging2Server(Server &server, const GDBusCXX::DBusObject_t &path, const std::string &strLevel, const std::string &explanation, const std::string &procname) { static bool dbg = getenv("SYNCEVOLUTION_DEBUG"); if (dbg) { // Print to D-Bus directly. The helper handles its own // printing to the console. server.logOutput(path, Logger::strToLevel(strLevel.c_str()), explanation, procname); } else { // Print to D-Bus and console, because the helper // relies on us to do that. Its own stdout/stderr // was redirected into our pipe and any output // there is considered an error. Logger::MessageOptions options(Logger::strToLevel(strLevel.c_str())); options.m_processName = &procname; options.m_flags = Logger::MessageOptions::ALREADY_LOGGED; Logging2ServerAndStdout(server, path, options, "%s", explanation.c_str()); } } void Session::useHelper2(const SimpleResult &result, const boost::signals2::connection &c) { PushLogger guard(m_me); try { // helper is running, don't call result.failed() when it quits // sometime in the future c.disconnect(); // Verify that helper is really ready. Might not be the // case when something internally failed in onConnect. if (m_helper) { // Resend all output from helper via the server's own // LogOutput signal, with the session's object path as // first parameter. // // Any code in syncevo-dbus-server which might produce // output related to the session runs while a Session::LoggingGuard // captures output by pushing Session as logger onto the // logging stack. The Session::messagev implementation then // also calls m_server.logOutput, as if the syncevo-dbus-helper // had produced that output. // // The downside is that unrelated output (like // book-keeping messages about other clients) will also be // captured. m_helper->m_logOutput.activate(boost::bind(Logging2Server, boost::ref(m_server), getPath(), _1, _2, _3)); result.done(); } else { SE_THROW("internal error, helper not ready"); } } catch (...) { // Same assumption as above: let's hope the server is still // sane. result.failed(); } } void Session::onConnect(const GDBusCXX::DBusConnectionPtr &conn) throw () { PushLogger guard(m_me); try { std::string instance = m_forkExecParent->getInstance(); SE_LOG_DEBUG(NULL, "helper %s has connected", instance.c_str()); m_helper.reset(new SessionProxy(conn, instance)); // Activate signal watch on helper signals. m_helper->m_syncProgress.activate(boost::bind(&Session::syncProgress, this, _1, _2, _3, _4)); m_helper->m_sourceProgress.activate(boost::bind(&Session::sourceProgress, this, _1, _2, _3, _4, _5, _6)); m_helper->m_sourceSynced.activate(boost::bind(boost::ref(m_sourceSynced), _1, _2)); m_sourceSynced.connect(boost::bind(StoreSyncSourceReport, boost::ref(m_syncSourceReports), _1, _2)); m_helper->m_waiting.activate(boost::bind(&Session::setWaiting, this, _1)); m_helper->m_syncSuccessStart.activate(boost::bind(boost::ref(Session::m_syncSuccessStartSignal))); m_helper->m_configChanged.activate(boost::bind(boost::ref(m_server.m_configChangedSignal), "")); m_helper->m_passwordRequest.activate(boost::bind(&Session::passwordRequest, this, _1, _2)); } catch (...) { Exception::handle(); } } void Session::onQuit(int status) throw () { PushLogger guard(m_me); try { SE_LOG_DEBUG(NULL, "helper quit with return code %d, was %s", status, m_wasAborted ? "aborted" : "not aborted"); if (m_status == SESSION_DONE) { // don't care anymore whether the helper goes down, not an error SE_LOG_DEBUG(NULL, "session already completed, ignore helper"); } else if (m_wasAborted && ((WIFEXITED(status) && WEXITSTATUS(status) == 0) || (WIFSIGNALED(status) && WTERMSIG(status) == SIGTERM))) { SE_LOG_DEBUG(NULL, "helper terminated via SIGTERM, as expected"); if (!m_error) { m_error = sysync::LOCERR_USERABORT; SE_LOG_DEBUG(NULL, "helper was asked to quit -> error %d = LOCERR_USERABORT", m_error); } } else { // Premature exit from helper?! Not necessarily, it could // be that we get the "helper has quit" signal from // ForkExecParent before processing the helper's D-Bus // method reply. So instead of recording an error here, // wait for that reply. If the helper died without sending // it, then D-Bus will generate a "connection lost" error // for our pending method call. // // Except that libdbus does not deliver that error // reliably. As a workaround, schedule closing the // session as an idle callback, after that potential // future method return call was handled. The assumption // is that it is pending - it must be, because with the // helper gone, IO with it must be ready. Just to be sure // a small delay is used. } m_server.addTimeout(boost::bind(&Session::doneCb, m_me, false, SyncReport()), 1 /* seconds */); } catch (...) { Exception::handle(); } } void Session::onFailure(SyncMLStatus status, const std::string &explanation) throw () { PushLogger guard(m_me); try { SE_LOG_DEBUG(NULL, "helper failed, status code %d = %s, %s", status, Status2String(status).c_str(), explanation.c_str()); } catch (...) { Exception::handle(); } } void Session::onOutput(const char *buffer, size_t length) { PushLogger guard(m_me); // treat null-bytes inside the buffer like line breaks size_t off = 0; do { SE_LOG_ERROR("session-helper", "%s", buffer + off); off += strlen(buffer + off) + 1; } while (off < length); } void Session::activateSession() { PushLogger guard(m_me); if (m_status != SESSION_IDLE) { SE_THROW("internal error, session changing from non-idle to active"); } m_status = SESSION_ACTIVE; if (m_syncStatus == SYNC_QUEUEING) { m_syncStatus = SYNC_IDLE; fireStatus(true); } boost::shared_ptr c = m_connection.lock(); if (c) { c->ready(); } m_sessionActiveSignal(); } void Session::passwordResponse(bool timedOut, bool aborted, const std::string &password) { PushLogger guard(m_me); if (m_helper) { // Ignore communicaton failures with helper here, // we'll notice that elsewhere m_helper->m_passwordResponse.start(timedOut, aborted, password, boost::function()); } } void Session::syncProgress(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3) { PushLogger guard(m_me); switch(type) { case sysync::PEV_CUSTOM_START: m_cmdlineOp = (RunOperation)extra1; break; case sysync::PEV_SESSIONSTART: m_progData.setStep(ProgressData::PRO_SYNC_INIT); fireProgress(true); break; case sysync::PEV_SESSIONEND: // Ignore the error here. It was seen // (TestSessionAPIsDummy.testAutoSyncNetworkFailure) that the // engine reports 20017 = user abort when the real error is a // transport error encountered outside of the // engine. Recording the error as seen by the engine leads to // an incorrect final session result. Instead wait for the // result of the sync method invocation. // // if((uint32_t)extra1 != m_error) { // SE_LOG_DEBUG(NULL, "session sync progress: failed with code %d", extra1); // m_error = extra1; // fireStatus(true); // } m_progData.setStep(ProgressData::PRO_SYNC_INVALID); fireProgress(true); break; case sysync::PEV_SENDSTART: m_progData.sendStart(); break; case sysync::PEV_SENDEND: case sysync::PEV_RECVSTART: case sysync::PEV_RECVEND: m_progData.receiveEnd(); fireProgress(); break; case sysync::PEV_DISPLAY100: case sysync::PEV_SUSPENDCHECK: case sysync::PEV_DELETING: break; case sysync::PEV_SUSPENDING: m_syncStatus = SYNC_SUSPEND; fireStatus(true); break; default: ; } } void Session::sourceProgress(sysync::TProgressEventEnum type, const std::string &sourceName, SyncMode sourceSyncMode, int32_t extra1, int32_t extra2, int32_t extra3) { PushLogger guard(m_me); // a command line operation can be many things, helper must have told us SessionCommon::RunOperation op = m_runOperation == SessionCommon::OP_CMDLINE ? m_cmdlineOp : m_runOperation; switch(op) { case SessionCommon::OP_SYNC: { // Helper will create new source entries by sending a // sysync::PEV_PREPARING with SYNC_NONE. Must fire progress // and status events for such new sources. SourceProgresses_t::iterator pit = m_sourceProgress.find(sourceName); bool sourceProgressCreated = pit == m_sourceProgress.end(); SourceProgress &progress = sourceProgressCreated ? m_sourceProgress[sourceName] : pit->second; SourceStatuses_t::iterator sit = m_sourceStatus.find(sourceName); bool sourceStatusCreated = sit == m_sourceStatus.end(); SourceStatus &status = sourceStatusCreated ? m_sourceStatus[sourceName] : sit->second; switch(type) { case sysync::PEV_SYNCSTART: if (sourceSyncMode != SYNC_NONE) { m_progData.setStep(ProgressData::PRO_SYNC_UNINIT); fireProgress(); } break; case sysync::PEV_SYNCEND: if (sourceSyncMode != SYNC_NONE) { status.set(PrettyPrintSyncMode(sourceSyncMode), "done", extra1); fireStatus(true); } break; case sysync::PEV_PREPARING: if (sourceSyncMode != SYNC_NONE) { progress.m_phase = "preparing"; progress.m_prepareCount = extra1; progress.m_prepareTotal = extra2; m_progData.itemPrepare(); fireProgress(true); } else { // Check whether the sources where created. if (sourceProgressCreated) { fireProgress(); } if (sourceStatusCreated) { fireStatus(); } } break; case sysync::PEV_ITEMSENT: if (sourceSyncMode != SYNC_NONE) { progress.m_phase = "sending"; progress.m_sendCount = extra1; progress.m_sendTotal = extra2; fireProgress(true); } break; case sysync::PEV_ITEMRECEIVED: if (sourceSyncMode != SYNC_NONE) { progress.m_phase = "receiving"; progress.m_receiveCount = extra1; progress.m_receiveTotal = extra2; m_progData.itemReceive(sourceName, extra1, extra2); fireProgress(); } break; case sysync::PEV_ITEMPROCESSED: progress.m_added = extra1; progress.m_updated = extra2; progress.m_deleted = extra3; // Do not fireProgress() here! We are going to get a // PEV_ITEMRECEIVED directly afterwards (see // dbus-sync.cpp). break; case sysync::PEV_ALERTED: if (sourceSyncMode != SYNC_NONE) { // Reset item counts, must be set (a)new. // Relevant in multi-cycle syncing. progress.m_receiveCount = -1; progress.m_receiveTotal = -1; progress.m_sendCount = -1; progress.m_sendTotal = -1; status.set(PrettyPrintSyncMode(sourceSyncMode), "running", 0); fireStatus(true); m_progData.setStep(ProgressData::PRO_SYNC_DATA); m_progData.addSyncMode(sourceSyncMode); fireProgress(); } break; default: ; } break; } case SessionCommon::OP_RESTORE: { switch(type) { case sysync::PEV_ALERTED: // count the total number of sources to be restored m_restoreSrcTotal++; break; case sysync::PEV_SYNCSTART: { if (sourceSyncMode != SYNC_NONE) { SourceStatus &status = m_sourceStatus[sourceName]; // set statuses as 'restore-from-backup' status.set(PrettyPrintSyncMode(sourceSyncMode), "running", 0); fireStatus(true); } break; } case sysync::PEV_SYNCEND: { if (sourceSyncMode != SYNC_NONE) { m_restoreSrcEnd++; SourceStatus &status = m_sourceStatus[sourceName]; status.set(PrettyPrintSyncMode(sourceSyncMode), "done", 0); m_progData.setProgress(100 * m_restoreSrcEnd / m_restoreSrcTotal); fireStatus(true); fireProgress(true); } break; } default: break; } break; } default: break; } } bool Session::setFilters(SyncConfig &config) { PushLogger guard(m_me); /** apply temporary configs to config */ config.setConfigFilter(true, "", m_syncFilter); // set all sources in the filter to config BOOST_FOREACH(const SourceFilters_t::value_type &value, m_sourceFilters) { config.setConfigFilter(false, value.first, value.second); } return m_tempConfig; } void Session::setWaiting(bool isWaiting) { PushLogger guard(m_me); // if stepInfo doesn't change, then ignore it to avoid duplicate status info if(m_stepIsWaiting != isWaiting) { m_stepIsWaiting = isWaiting; fireStatus(true); } } void Session::restore(const string &dir, bool before, const std::vector &sources) { PushLogger guard(m_me); if (m_runOperation == SessionCommon::OP_RESTORE) { string msg = StringPrintf("restore started, cannot restore again"); SE_THROW_EXCEPTION(InvalidCall, msg); } else if (m_runOperation != SessionCommon::OP_NULL) { // actually this never happen currently, for during the real restore process, // it never poll the sources in default main context string msg = StringPrintf("%s started, cannot restore", runOpToString(m_runOperation).c_str()); SE_THROW_EXCEPTION(InvalidCall, msg); } if (m_status != SESSION_ACTIVE) { SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time"); } runOperationAsync(SessionCommon::OP_RESTORE, boost::bind(&Session::restore2, this, dir, before, sources)); } void Session::restore2(const string &dir, bool before, const std::vector &sources) { PushLogger guard(m_me); if (!m_forkExecParent || !m_helper) { SE_THROW("syncing cannot continue, helper died"); } // helper is ready, tell it what to do m_helper->m_restore.start(m_configName, dir, before, sources, boost::bind(&Session::dbusResultCb, m_me, "restore()", _1, SyncReport(), _2)); } void Session::execute(const vector &args, const map &vars) { PushLogger guard(m_me); if (m_runOperation == SessionCommon::OP_CMDLINE) { SE_THROW_EXCEPTION(InvalidCall, "cmdline started, cannot start again"); } else if (m_runOperation != SessionCommon::OP_NULL) { string msg = StringPrintf("%s started, cannot start cmdline", runOpToString(m_runOperation).c_str()); SE_THROW_EXCEPTION(InvalidCall, msg); } if (m_status != SESSION_ACTIVE) { SE_THROW_EXCEPTION(InvalidCall, "session is not active, call not allowed at this time"); } runOperationAsync(SessionCommon::OP_CMDLINE, boost::bind(&Session::execute2, this, args, vars)); } void Session::execute2(const vector &args, const map &vars) { PushLogger guard(m_me); if (!m_forkExecParent || !m_helper) { SE_THROW("syncing cannot continue, helper died"); } // helper is ready, tell it what to do m_helper->m_execute.start(args, vars, boost::bind(&Session::dbusResultCb, m_me, "execute()", _1, SyncReport(), _2)); } /*Implementation of Session.CheckPresence */ void Session::checkPresence (string &status) { PushLogger guard(m_me); vector transport; m_server.checkPresence(m_configName, status, transport); } void Session::sendViaConnection(const DBusArray buffer, const std::string &type, const std::string &url) { PushLogger guard(m_me); try { boost::shared_ptr connection = m_connection.lock(); if (!connection) { SE_THROW_EXCEPTION(TransportException, "D-Bus peer has disconnected"); } connection->send(buffer, type, url); } catch (...) { std::string explanation; Exception::handle(explanation); connectionState(explanation); } } void Session::shutdownConnection() { PushLogger guard(m_me); try { boost::shared_ptr connection = m_connection.lock(); if (!connection) { SE_THROW_EXCEPTION(TransportException, "D-Bus peer has disconnected"); } connection->sendFinalMsg(); } catch (...) { std::string explanation; Exception::handle(explanation); connectionState(explanation); } } void Session::storeMessage(const DBusArray &message, const std::string &type) { PushLogger guard(m_me); // ignore errors if (m_helper) { m_helper->m_storeMessage.start(message, type, boost::function()); } } void Session::connectionState(const std::string &error) { PushLogger guard(m_me); // ignore errors if (m_helper) { m_helper->m_connectionState.start(error, boost::function()); } } SE_END_CXX syncevolution-1.5/src/dbus/server/main.cpp0000664000373300001540000002063012424466461022214 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "server.h" #include "restart.h" #include "session-common.h" #include #include #include #include #include #include #ifdef USE_DLT # include #endif using namespace SyncEvo; using namespace GDBusCXX; namespace { GMainLoop *loop = NULL; const char * const execName = "syncevo-dbus-server"; bool parseDuration(int &duration, const char* value) { if(value == NULL) { return false; } else if (boost::iequals(value, "unlimited")) { duration = -1; return true; } else if ((duration = atoi(value)) > 0) { return true; } else { return false; } } } // anonymous namespace static Logger::Level checkLogLevel(const char *option, int logLevel) { switch (logLevel) { case 0: return Logger::NONE; case 1: return Logger::ERROR; case 2: return Logger::INFO; case 3: return Logger::DEBUG; default: SE_THROW(StringPrintf("invalid parameter value %d for %s: must be one of 0, 1, 2 or 3", logLevel, option)); return Logger::NONE; } } int main(int argc, char **argv, char **envp) { // remember environment for restart boost::shared_ptr restart; restart.reset(new Restart(argv, envp)); // Internationalization for auto sync messages. setlocale(LC_ALL, ""); bindtextdomain(GETTEXT_PACKAGE, getEnv("SYNCEVOLUTION_LOCALE_DIR", SYNCEVOLUTION_LOCALEDIR)); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); try { gchar *durationString = NULL; int duration = 600; int logLevel = 1; int logLevelDBus = 2; gboolean stdoutEnabled = false; gboolean syslogEnabled = true; #ifdef USE_DLT gboolean dltEnabled = false; #endif #ifdef ENABLE_DBUS_PIM gboolean startPIM = false; #endif GOptionEntry entries[] = { { "duration", 'd', 0, G_OPTION_ARG_STRING, &durationString, "Shut down automatically when idle for this duration", "seconds/'unlimited'" }, { "verbosity", 'v', 0, G_OPTION_ARG_INT, &logLevel, "Choose amount of output, 0 = no output, 1 = errors, 2 = info, 3 = debug; default is 1.", "level" }, { "dbus-verbosity", 'v', 0, G_OPTION_ARG_INT, &logLevelDBus, "Choose amount of output via D-Bus signals, 0 = no output, 1 = errors, 2 = info, 3 = debug; default is 2.", "level" }, { "stdout", 'o', 0, G_OPTION_ARG_NONE, &stdoutEnabled, "Enable printing to stdout (result of operations) and stderr (errors/info/debug).", NULL }, { "no-syslog", 's', G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &syslogEnabled, "Disable printing to syslog.", NULL }, #ifdef USE_DLT { "dlt", 0, 0, G_OPTION_ARG_NONE, &dltEnabled, "Enable logging via GENIVI Diagnostic Log and Trace.", NULL }, #endif #ifdef ENABLE_DBUS_PIM { "start-pim", 'p', 0, G_OPTION_ARG_NONE, &startPIM, "Activate the PIM Manager (= unified address book) immediately.", NULL }, #endif { NULL } }; GErrorCXX gerror; static GOptionContext *context = g_option_context_new("- SyncEvolution D-Bus Server"); g_option_context_add_main_entries(context, entries, GETTEXT_PACKAGE); bool success = g_option_context_parse(context, &argc, &argv, gerror); PlainGStr durationOwner(durationString); if (!success) { gerror.throwError(SE_HERE, "parsing command line options"); } if (durationString && !parseDuration(duration, durationString)) { SE_THROW(StringPrintf("invalid parameter value '%s' for --duration/-d: must be positive number of seconds or 'unlimited'", durationString)); } Logger::Level level = checkLogLevel("--debug", logLevel); Logger::Level levelDBus = checkLogLevel("--dbus-debug", logLevelDBus); // Temporarily set G_DBUS_DEBUG. Hopefully GIO will read and // remember it, because we don't want to keep it set // permanently, lest it gets passed on to other processes. const char *gdbus = getenv("SYNCEVOLUTION_DBUS_SERVER_GDBUS"); if (gdbus) { setenv("G_DBUS_DEBUG", gdbus, 1); } SyncContext::initMain(execName); loop = g_main_loop_new (NULL, FALSE); setvbuf(stderr, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); // Redirect output and optionally log to syslog. PushLogger redirect(new LogRedirect(LogRedirect::STDERR_AND_STDOUT)); redirect->setLevel(stdoutEnabled ? level : Logger::NONE); #ifdef USE_DLT PushLogger loggerdlt; if (dltEnabled) { // DLT logging with default log level DLT_LOG_WARN. This // default was chosen because DLT's own default, // DLT_LOG_INFO, leads to too much output given that a lot // of the standard messages in SyncEvolution and // libsynthesis are labelled informational. setenv("SYNCEVOLUTION_USE_DLT", StringPrintf("%d", DLT_LOG_WARN).c_str(), true); loggerdlt.reset(new LoggerDLT(DLT_SYNCEVO_DBUS_SERVER_ID, "SyncEvolution D-Bus server")); } else { unsetenv("SYNCEVOLUTION_USE_DLT"); } #endif PushLogger syslogger; if (syslogEnabled && level > Logger::NONE) { syslogger.reset(new LoggerSyslog(execName)); syslogger->setLevel(level); } // syncevo-dbus-server should hardly ever produce output that // is relevant for end users, so include the somewhat cryptic // process name for developers in this process, and not in // syncevo-dbus-helper. Logger::setProcessName("syncevo-dbus-server"); boost::shared_ptr guard = SuspendFlags::getSuspendFlags().activate(); DBusErrorCXX err; DBusConnectionPtr conn = dbus_get_bus_connection("SESSION", SessionCommon::SERVICE_NAME, true, &err); if (!conn) { err.throwFailure("dbus_get_bus_connection()", " failed - server already running?"); } // make this object the main owner of the connection boost::scoped_ptr obj(new DBusObject(conn, "foo", "bar", true)); boost::shared_ptr server(new SyncEvo::Server(loop, restart, conn, duration)); server->setDBusLogLevel(levelDBus); server->activate(); #ifdef ENABLE_DBUS_PIM boost::shared_ptr manager(SyncEvo::CreateContactManager(server, startPIM)); #endif if (gdbus) { unsetenv("G_DBUS_DEBUG"); } server->run(); SE_LOG_DEBUG(NULL, "cleaning up"); #ifdef ENABLE_DBUS_PIM manager.reset(); #endif server.reset(); obj.reset(); SE_LOG_DEBUG(NULL, "flushing D-Bus connection"); conn.flush(); conn.reset(); SE_LOG_INFO(NULL, "terminating, closing logging"); syslogger.reset(); redirect.reset(); guard.reset(); SE_LOG_INFO(NULL, "terminating"); return 0; } catch ( const std::exception &ex ) { SE_LOG_ERROR(NULL, "%s", ex.what()); } catch (...) { SE_LOG_ERROR(NULL, "unknown error"); } return 1; } syncevolution-1.5/src/dbus/dbus.am0000644000373300001540000000027412326412403020516 0ustar00nightlynightly00000000000000include $(top_srcdir)/src/dbus/interfaces/interfaces.am include $(top_srcdir)/src/dbus/glib/glib.am include $(top_srcdir)/src/dbus/qt/qt.am include $(top_srcdir)/src/dbus/server/server.am syncevolution-1.5/src/gdbus/0000755000373300037200000000000012424707642017577 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/gdbus/test/0000755000373300037200000000000012424707642020556 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/gdbus/test/example.cpp0000644000373300001540000001743712326412403022540 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2009 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * 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 St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "gdbus-cxx-bridge.h" #include #include namespace GDBusCXX { struct args { int a; std::string b; std::map c; }; static void hello_global() {} class Test { typedef boost::shared_ptr< Result1 > string_result; struct async { async(const boost::shared_ptr &watch, Watch *watch2, const string_result &result): m_watch(watch), m_watch2(watch2), m_result(result) {} ~async() { delete m_watch2; } boost::shared_ptr m_watch; Watch *m_watch2; string_result m_result; }; static gboolean method_idle(gpointer data) { std::auto_ptr mydata(static_cast(data)); std::cout << "replying to method_async" << std::endl; mydata->m_result->done("Hello World, asynchronous and delayed"); return false; } static void disconnect(const std::string &id, const std::string &peer) { std::cout << id << ": " << peer << " has disconnected." << std::endl; } public: static void hello_static() {} void hello_const() const {} static void hello_world(const char *msg) { puts(msg); } void hello_base() {} void method(std::string &text) { text = "Hello World"; } void method_async(const Caller_t &caller, const boost::shared_ptr &watch, int32_t secs, const string_result &r) { watch->setCallback(boost::bind(disconnect, "watch1", caller)); Watch *watch2 = r->createWatch(boost::bind(disconnect, "watch2", caller)); std::cout << "method_async called by " << caller << " delay " << secs << std::endl; g_timeout_add_seconds(secs, method_idle, new async(watch, watch2, r)); } void method2(int32_t arg, int32_t &ret) { ret = arg * 2; } int32_t method3(int32_t arg) { return arg * 3; } void method8_simple(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8) { } void method9_async(Result9 *r) { r->done(1, 2, 3, 4, 5, 6, 7, 8, 9); delete r; } int32_t method9(int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, int32_t a8, int32_t a9) { return 0; } void hash(const std::map &in, std::map &out) { for (std::map::const_iterator it = in.begin(); it != in.end(); ++it) { out.insert(std::make_pair((int16_t)it->first, it->second * it->second)); } } void array(const std::vector &in, std::vector &out) { for (std::vector::const_iterator it = in.begin(); it != in.end(); ++it) { out.push_back(*it * *it); } } void error() { throw dbus_error("org.example.error.Invalid", "error"); } void argtest(const args &in, args &out) { out = in; out.a = in.a + 1; } }; class Test2 { public: void test2() {} }; template<> struct dbus_traits : public dbus_struct_traits, &args::c> > > > {}; class DBusTest : public Test, private Test2 { DBusObjectHelper m_object; DBusObjectHelper m_secondary; public: DBusTest(const DBusConnectionPtr conn) : m_object(conn, "/test", "org.example.Test"), // same path! m_secondary(conn, m_object.getPath(), "org.example.Secondary"), signal(m_object, "Signal") { m_object.add(this, &Test::method8_simple, "Method8Simple"); // m_object.add(this, &Test::method10_async, "Method10Async", G_DBUS_METHOD_FLAG_ASYNC); // m_object.add(this, &Test::method9, "Method9"); m_object.add(this, &Test::method2, "Method2"); m_object.add(this, &Test::method3, "Method3"); m_object.add(this, &Test::method, "Test"); m_object.add(this, &Test::method_async, "TestAsync"); m_object.add(this, &Test::argtest, "ArgTest"); m_object.add(this, &Test::hash, "Hash"); m_object.add(this, &Test::array, "Array"); m_object.add(this, &Test::error, "Error"); m_object.add(&hello_global, "Global"); m_object.add(&DBusTest::hello_static, "Static"); m_object.add(static_cast(this), &Test2::test2, "Private"); // The hello_const() method cannot be registered // because there is no matching MakeMethodEntry<> // specialization for it or DBusObjectHelper::add() // fails to determine the right function type, // depending how one wants to interpret the problem. // m_object.add2(this, &DBusTest::hello_const, "Const"); m_object.add(signal); m_secondary.add(this, &DBusTest::hello, "Hello"); } ~DBusTest() { } EmitSignal3 &>signal; void hello() {} static void hello_static() {} void hello_const() const {} void activate() { m_secondary.activate(); m_object.activate(); } void deactivate() { m_object.deactivate(); m_secondary.deactivate(); } }; static GMainLoop *main_loop = NULL; static void sig_term(int sig) { g_main_loop_quit(main_loop); } } // namespace GDBusCXX using namespace GDBusCXX; int main(int argc, char *argv[]) { DBusConnectionPtr conn; DBusErrorCXX err; struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_term; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); sa.sa_handler = SIG_IGN; sigaction(SIGCHLD, &sa, NULL); sigaction(SIGPIPE, &sa, NULL); main_loop = g_main_loop_new(NULL, FALSE); conn = dbus_get_bus_connection("SESSION", "org.example", false, &err); if (!conn) { if (dbus_error_is_set(&err) == TRUE) { fprintf(stderr, "%s\n", err.message); dbus_error_free(&err); } else fprintf(stderr, "Can't register with session bus\n"); exit(1); } std::auto_ptr test(new DBusTest(conn)); test->activate(); test->signal(42, "hello world", std::map()); test->deactivate(); test->activate(); test->signal(123, "here I am again", std::map()); g_main_loop_run(main_loop); test.reset(); g_main_loop_unref(main_loop); return 0; } syncevolution-1.5/src/gdbus/README0000644000373300001540000000215312326412403020267 0ustar00nightlynightly00000000000000This is a copy of the libgdbus source code: http://git.kernel.org/?p=bluetooth/libgdbus.git;a=summary It is licensed under LGPL v2.1, see upstream COPYING. The source is included here because there is no stable upstream release. Patches added here need to be submitted upstream. Likewise, patches applied upstream must be imported. The build/import-gdbus.sh and build/export-gdbus.sh scripts automate that process. To import fixes from upstream: - checkout out libgdbus and syncevolution - enter syncevolution directory - if not done before, create local "gdbus" branch: git branch gdbus origin/gdbus - run build/import-gdbus.sh - "gdbus" branch is now checked out and updated - verify changes, merge into master, etc. - push into remote syncevolution repo To export fixes to upstream: - check out relevant branch in syncevolution which has our local changes (typically "master") - run build/export-gdbus.sh - send 0*.patch files to upstream Caveats: - only files explicitly mentioned in the two scripts are imported/exports - Makefile changes are only imported, but not exported (local changes not relevant upstream) syncevolution-1.5/src/gdbus/gdbus.am0000644000373300001540000000242612326412403021035 0ustar00nightlynightly00000000000000# include_HEADERS = src/gdbus/gdbus.h dist_noinst_DATA += \ src/gdbus/README if ENABLE_MODULES lib_LTLIBRARIES += src/gdbus/libgdbussyncevo.la src_gdbus_version_info = -version-info 0:0:0 else noinst_LTLIBRARIES += src/gdbus/libgdbussyncevo.la endif src_gdbus_libgdbussyncevo_la_SOURCES = \ src/gdbus/debug.h \ src/gdbus/debug.c \ src/gdbus/mainloop.c \ src/gdbus/object.c \ src/gdbus/watch.c \ src/gdbus/gdbus.h \ src/gdbus/gdbus-cxx-bridge.h \ src/gdbus/gdbus-cxx-bridge.cpp \ src/gdbus/gdbus-cxx.h src_gdbus_libgdbussyncevo_la_LDFLAGS = $(src_gdbus_version_info) -export-symbols-regex b_dbus_.* src_gdbus_libgdbussyncevo_la_LIBADD = @GLIB_LIBS@ @DBUS_LIBS@ src_gdbus_libgdbussyncevo_la_CFLAGS = @GLIB_CFLAGS@ @DBUS_CFLAGS@ $(SYNCEVO_WFLAGS) src_gdbus_libgdbussyncevo_la_CXXFLAGS = @GLIB_CFLAGS@ @DBUS_CFLAGS@ $(SYNCEVO_WFLAGS) src_gdbus_libgdbussyncevo_la_CPPFLAGS = $(BOOST_CPPFLAGS) # include_HEADERS = src/gdbus/gdbus-cxx-bridge.h src/gdbus/gdbus-cxx.h noinst_PROGRAMS += src/gdbus/example src_gdbus_example_SOURCES = src/gdbus/test/example.cpp src_gdbus_example_CXXFLAGS = @GLIB_CFLAGS@ @DBUS_CFLAGS@ $(SYNCEVO_WFLAGS) src_gdbus_example_LDADD = src/gdbus/libgdbussyncevo.la @GLIB_LIBS@ @DBUS_LIBS@ src_gdbus_example_CPPFLAGS = -I$(top_srcdir)/src/gdbus $(BOOST_CPPFLAGS) syncevolution-1.5/src/gdbus/debug.h0000644000373300001540000000165012326412403020647 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #include //#define DBG(fmt, arg...) g_debug("%s: " fmt, __FUNCTION__ , ## arg) #define DBG(fmt, arg...) syncevolution-1.5/src/gdbus/debug.c0000644000373300001540000000201012326412403020631 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include "debug.h" static void __attribute__ ((constructor)) __init(void) { DBG(""); } static void __attribute__ ((destructor)) __cleanup(void) { DBG(""); } syncevolution-1.5/src/gdbus/mainloop.c0000644000373300001540000003715012326412403021376 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #ifdef NEED_DBUS_WATCH_GET_UNIX_FD #define dbus_watch_get_unix_fd dbus_watch_get_fd #endif #include "gdbus.h" #include "debug.h" static dbus_int32_t connection_slot = -1; static dbus_int32_t server_slot = -1; typedef struct { DBusConnection *connection; GMainContext *context; GSource *queue; BDBusWatchFunction disconnect; void *disconnect_data; BDBusDestroyFunction disconnect_destroy; gboolean unshared; } ConnectionData; typedef struct { DBusWatch *watch; GSource *source; } WatchData; typedef struct { DBusTimeout *timeout; guint id; } TimeoutData; typedef struct { GSource source; DBusConnection *connection; } QueueData; static GSList *watches = NULL; static GSList *timeouts = NULL; static gboolean queue_prepare(GSource *source, gint *timeout) { DBusConnection *connection = ((QueueData *) source)->connection; DBG("source %p", source); *timeout = -1; return (dbus_connection_get_dispatch_status(connection) == DBUS_DISPATCH_DATA_REMAINS); } static gboolean queue_check(GSource *source) { DBG("source %p", source); return FALSE; } static gboolean queue_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { DBusConnection *connection = ((QueueData *) source)->connection; DBG("source %p", source); dbus_connection_ref(connection); dbus_connection_dispatch(connection); dbus_connection_unref(connection); return TRUE; } static GSourceFuncs queue_funcs = { queue_prepare, queue_check, queue_dispatch, NULL }; static gboolean dispatch_watch(GIOChannel *source, GIOCondition condition, gpointer user_data) { WatchData *data = user_data; unsigned int flags = 0; DBG("source %p condition %d watch data %p", source, condition, data); if (condition & G_IO_IN) flags |= DBUS_WATCH_READABLE; if (condition & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE; if (condition & G_IO_ERR) flags |= DBUS_WATCH_ERROR; if (condition & G_IO_HUP) flags |= DBUS_WATCH_HANGUP; dbus_watch_handle(data->watch, flags); return TRUE; } static void finalize_watch(gpointer memory) { DBG("watch data %p", memory); } static void free_watch(void *memory) { DBG("watch data %p", memory); if (memory == NULL) return; watches = g_slist_remove(watches, memory); WatchData *watch_data = (WatchData*)memory; GSource* source = watch_data->source; if (source != NULL) { g_source_destroy(source); watch_data->source = NULL; } g_free(watch_data); } static dbus_bool_t add_watch(DBusWatch *watch, void *user_data) { ConnectionData *data = user_data; GIOCondition condition = G_IO_ERR | G_IO_HUP; GIOChannel *channel; GSource *source; WatchData *watch_data; unsigned int flags; int fd; DBG("watch %p connection data %p", watch, data); if (dbus_watch_get_enabled(watch) == FALSE) return TRUE; flags = dbus_watch_get_flags(watch); if (flags & DBUS_WATCH_READABLE) condition |= G_IO_IN; if (flags & DBUS_WATCH_WRITABLE) condition |= G_IO_OUT; fd = dbus_watch_get_unix_fd(watch); DBG("flags %d fd %d", flags, fd); watch_data = g_new0(WatchData, 1); channel = g_io_channel_unix_new(fd); source = g_io_create_watch(channel, condition); watch_data->watch = watch; watch_data->source = source; g_source_set_callback(source, (GSourceFunc) dispatch_watch, watch_data, finalize_watch); g_source_attach(source, data->context); watches = g_slist_prepend(watches, watch_data); dbus_watch_set_data(watch, watch_data, free_watch); g_io_channel_unref(channel); DBG("watch data %p", watch_data); return TRUE; } static void remove_watch(DBusWatch *watch, void *user_data) { WatchData *watch_data = dbus_watch_get_data(watch); DBG("watch %p watch data %p connection data %p", watch, watch_data, user_data); if (watch_data == NULL) return; watches = g_slist_remove(watches, watch_data); if (watch_data->source != NULL) { g_source_destroy(watch_data->source); // g_source_unref(watch_data->source); watch_data->source = NULL; } // this will call free_watch() and deallocate watch_data dbus_watch_set_data(watch, NULL, NULL); } static void watch_toggled(DBusWatch *watch, void *user_data) { DBG("watch %p connection data %p", watch, user_data); if (dbus_watch_get_enabled(watch) == TRUE) add_watch(watch, user_data); else remove_watch(watch, user_data); } static gboolean dispatch_timeout(gpointer user_data) { TimeoutData *timeout_data = user_data; DBG("timeout data %p", timeout_data); dbus_timeout_handle(timeout_data->timeout); return FALSE; } static void free_timeout(void *memory) { TimeoutData *timeout_data = memory; DBG("timeout data %p", timeout_data); if (timeout_data->id > 0) g_source_remove(timeout_data->id); g_free(timeout_data); } static dbus_bool_t add_timeout(DBusTimeout *timeout, void *user_data) { TimeoutData *timeout_data; DBG("timeout %p connection data %p", timeout, user_data); if (dbus_timeout_get_enabled(timeout) == FALSE) return TRUE; timeout_data = g_new0(TimeoutData, 1); timeout_data->timeout = timeout; timeout_data->id = g_timeout_add(dbus_timeout_get_interval(timeout), dispatch_timeout, timeout_data); timeouts = g_slist_prepend(timeouts, timeout_data); dbus_timeout_set_data(timeout, timeout_data, free_timeout); DBG("timeout data %p", timeout_data); return TRUE; } static void remove_timeout(DBusTimeout *timeout, void *user_data) { TimeoutData *timeout_data = dbus_timeout_get_data(timeout); DBG("timeout %p connection data %p", timeout, user_data); if (timeout_data == NULL) return; timeouts = g_slist_remove(timeouts, timeout_data); if (timeout_data->id > 0) g_source_remove(timeout_data->id); timeout_data->id = 0; } static void timeout_toggled(DBusTimeout *timeout, void *user_data) { DBG("timeout %p connection data %p", timeout, user_data); if (dbus_timeout_get_enabled(timeout) == TRUE) add_timeout(timeout, user_data); else remove_timeout(timeout, user_data); } static void wakeup_context(void *user_data) { ConnectionData *data = user_data; DBG("connection data %p", data); g_main_context_wakeup(data->context); } static ConnectionData *setup_connection(DBusConnection *connection, gboolean unshared, GMainContext *context) { ConnectionData *data; DBG("connection %p context %p", connection, context); data = g_new0(ConnectionData, 1); data->context = g_main_context_ref(context); data->unshared = unshared; DBG("connection data %p", data); if (connection == NULL) return data; data->connection = connection; data->queue = g_source_new(&queue_funcs, sizeof(QueueData)); ((QueueData *) data->queue)->connection = connection; g_source_attach(data->queue, context); return data; } static void free_connection(void *memory) { ConnectionData *data = memory; DBG("connection data %p", data); b_dbus_remove_all_watches(data->connection); //b_dbus_unregister_all_objects(data->connection); if (data->queue) g_source_destroy(data->queue); // At the point when free_connection gets called, // the last unref already happened and the connection // is gone; trying to close it here is too later. // ConnectionData holds *no* reference on data->connection, // so don't unref either. If it did, the connection would // never get freed. #if 0 if (data->unshared) dbus_connection_close(data->connection); dbus_connection_unref(data->connection); #endif if (data->disconnect_destroy) data->disconnect_destroy (data->disconnect_data); g_main_context_unref(data->context); g_free(data); } /** * b_dbus_setup_connection: * @connection: a #DBusConnection * @unshared: the connection is private and must be closed explicitly * @context: a #GMainContext or #NULL for default context * * Setup connection with main context * * Sets the watch and timeout functions of a #DBusConnection * to integrate the connection with the GLib main loop. * Pass in #NULL for the #GMainContext unless you're * doing something specialized. */ void b_dbus_setup_connection(DBusConnection *connection, gboolean unshared, GMainContext *context) { ConnectionData *data; DBG("connection %p context %p", connection, context); if (dbus_connection_allocate_data_slot(&connection_slot) == FALSE) return; DBG("connection slot %d", connection_slot); data = dbus_connection_get_data(connection, connection_slot); if (data != NULL) return; dbus_connection_set_exit_on_disconnect(connection, TRUE); if (context == NULL) context = g_main_context_default(); data = setup_connection(connection, unshared, context); if (data == NULL) return; if (dbus_connection_set_data(connection, connection_slot, data, free_connection) == FALSE) { g_free(data); return; } dbus_connection_set_watch_functions(connection, add_watch, remove_watch, watch_toggled, data, NULL); dbus_connection_set_timeout_functions(connection, add_timeout, remove_timeout, timeout_toggled, data, NULL); dbus_connection_set_wakeup_main_function(connection, wakeup_context, data, NULL); } /** * b_dbus_server_connection: * @server: a #DBusServer * * Setup server with main context * * Sets the watch and timeout functions of a #DBusServer * to integrate the connection with the GLib main loop. */ void b_dbus_setup_server(DBusServer *server) { ConnectionData *data; if (dbus_server_allocate_data_slot(&server_slot) == FALSE) return; DBG("server slot %d", server_slot); data = dbus_server_get_data(server, server_slot); if (data != NULL) return; data = setup_connection(NULL, TRUE, g_main_context_default()); if (data == NULL) return; if (dbus_server_set_data(server, server_slot, data, free_connection) == FALSE) { g_free(data); return; } dbus_server_set_watch_functions(server, add_watch, remove_watch, watch_toggled, data, NULL); dbus_server_set_timeout_functions(server, add_timeout, remove_timeout, timeout_toggled, data, NULL); } /** * b_dbus_cleanup_connection: * @connection: a #DBusConnection * * Cleanup the setup of DBusConnection and free the * allocated memory. */ void b_dbus_cleanup_connection(DBusConnection *connection) { DBG("connection %p slot %d", connection, connection_slot); if (connection_slot < 0) return; dbus_connection_set_data(connection, connection_slot, NULL, NULL); dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); } /** * b_dbus_setup_bus: * @type: a #DBusBusType * @name: well known name * @unshared: use dbus_bus_get_private() to ensure that we have the connection * for ourself (otherwise assertions and CRITICAL warnings were triggered * inside glib-dbus when the app also used that) * @error: a #DBusError * * Connect to bus and setup connection * * Returns a connection to the given bus and requests a * well known name for it. Sets the watch and timeout * functions for it. * * Returns: newly setup #DBusConnection */ DBusConnection *b_dbus_setup_bus(DBusBusType type, const char *name, gboolean unshared, DBusError *error) { DBusConnection *connection; DBG("type %d name %s error %p", type, name, error); connection = unshared ? dbus_bus_get_private(type, error) : dbus_bus_get(type, error); if (error != NULL) { if (dbus_error_is_set(error) == TRUE) return NULL; } if (connection == NULL) return NULL; if (name != NULL) { if (dbus_bus_request_name(connection, name, DBUS_NAME_FLAG_DO_NOT_QUEUE, error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER ) { goto failed; } if (error != NULL) { if (dbus_error_is_set(error) == TRUE) { goto failed; } } } b_dbus_setup_connection(connection, unshared, NULL); return connection; failed: if (unshared) dbus_connection_close(connection); dbus_connection_unref(connection); return NULL; } /** * b_dbus_setup_address: * @address: bus address * @error: a #DBusError * * Connect to bus and setup connection * * Returns a connection to the bus specified via * the given address and sets the watch and timeout * functions for it. * * Returns: newly setup #DBusConnection */ DBusConnection *b_dbus_setup_address(const char *address, DBusError *error) { DBusConnection *connection; DBG("address %s error %p", address, error); connection = dbus_connection_open(address, error); if (error != NULL) { if (dbus_error_is_set(error) == TRUE) return NULL; } if (connection == NULL) return NULL; b_dbus_setup_connection(connection, FALSE, NULL); return connection; } /** * b_dbus_request_name: * @connection: a #DBusConnection * @name: well known name * @error: a #DBusError * * Requests a well known name for connection. * * Returns: #TRUE on success */ gboolean b_dbus_request_name(DBusConnection *connection, const char *name, DBusError *error) { DBG("connection %p name %s error %p", connection, name, error); if (name == NULL) return FALSE; if (dbus_bus_request_name(connection, name, DBUS_NAME_FLAG_DO_NOT_QUEUE, error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER ) return FALSE; if (error != NULL) { if (dbus_error_is_set(error) == TRUE) return FALSE; } return TRUE; } static DBusHandlerResult disconnect_filter(DBusConnection *connection, DBusMessage *message, void *user_data) { ConnectionData *data = user_data; if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected") == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; DBG("disconnected"); if (data->disconnect) data->disconnect (connection, data->disconnect_data); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } /** * b_dbus_set_disconnect_function: * @connection: a #DBusConnection * @function: a #BDBusWatchFunction * @user_data: user data to pass to the function * @destroy: a #BDBusDestroyFunction * * Set a callback function that will be called when the * D-Bus message bus exits. * * Returns: #TRUE on success */ gboolean b_dbus_set_disconnect_function(DBusConnection *connection, BDBusWatchFunction function, void *user_data, BDBusDestroyFunction destroy) { ConnectionData *data = dbus_connection_get_data(connection, connection_slot); if (!data) return FALSE; if (data->disconnect_destroy) data->disconnect_destroy (data->disconnect_data); data->disconnect_destroy = NULL; data->disconnect = NULL; data->disconnect_data = NULL; dbus_connection_set_exit_on_disconnect(connection, FALSE); if (dbus_connection_add_filter(connection, disconnect_filter, data, NULL) == FALSE) return FALSE; data = dbus_connection_get_data(connection, connection_slot); data->disconnect = function; data->disconnect_data = user_data; data->disconnect_destroy = destroy; return TRUE; } syncevolution-1.5/src/gdbus/object.c0000664000373300001540000010357112355040516021035 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "gdbus.h" #include "debug.h" static dbus_int32_t connection_slot = -1; typedef struct { GStaticMutex mutex; GSList *objects; } ConnectionData; typedef struct { gint refcount; char *path; GStaticMutex mutex; GSList *interfaces; char *introspect; } ObjectData; typedef struct { char *name; BDBusMethodTable *methods; BDBusSignalTable *signals; BDBusPropertyTable *properties; void *user_data; BDBusDestroyFunction destroy; BDBusInterfaceFunction callback; } InterfaceData; static InterfaceData *find_interface(GSList *interfaces, const char *name) { GSList *list; for (list = interfaces; list; list = list->next) { InterfaceData *interface = list->data; if (strcmp(name, interface->name) == 0) return interface; } return NULL; } static ObjectData *find_object(GSList *objects, const char *path) { GSList *list; for (list = objects; list; list = list->next) { ObjectData *object = list->data; if (strcmp(path, object->path) == 0) return object; } return NULL; } static BDBusPropertyTable *find_property(InterfaceData *interface, const char *name) { BDBusPropertyTable *property; if (interface == NULL) return NULL; for (property = interface->properties; property && property->name; property++) if (strcmp(property->name, name) == 0) return property; return NULL; } static void add_arguments(GString *xml, const char *direction, const char *signature) { DBusSignatureIter iter; dbus_signature_iter_init(&iter, signature); if (dbus_signature_iter_get_current_type(&iter) == DBUS_TYPE_INVALID) return; do { char *sig = dbus_signature_iter_get_signature(&iter); g_string_append_printf(xml, "\t\t\t\n", direction); else g_string_append(xml, "/>\n"); } while (dbus_signature_iter_next(&iter) == TRUE); } static inline void add_annotation(GString *xml, const char *name) { g_string_append_printf(xml, "\t\t\t\n", name); } static inline void add_methods(GString *xml, BDBusMethodTable *methods) { BDBusMethodTable *method; for (method = methods; method && method->name; method++) { g_string_append_printf(xml, "\t\t\n", method->name); add_arguments(xml, "in", method->signature); add_arguments(xml, "out", method->reply); if (method->flags & G_DBUS_METHOD_FLAG_DEPRECATED) add_annotation(xml, "org.freedesktop.DBus.Deprecated"); if (method->flags & G_DBUS_METHOD_FLAG_NOREPLY) add_annotation(xml, "org.freedesktop.DBus.Method.NoReply"); g_string_append(xml, "\t\t\n"); } } static inline void add_signals(GString *xml, BDBusSignalTable *signals) { BDBusSignalTable *signal; for (signal = signals; signal && signal->name; signal++) { g_string_append_printf(xml, "\t\t\n", signal->name); add_arguments(xml, NULL, signal->signature); if (signal->flags & G_DBUS_SIGNAL_FLAG_DEPRECATED) add_annotation(xml, "org.freedesktop.DBus.Deprecated"); g_string_append(xml, "\t\t\n"); } } static inline void add_properties(GString *xml, BDBusPropertyTable *properties) { BDBusPropertyTable *property; for (property = properties; property && property->name; property++) { const char *access; if (property->type == NULL) continue; if (property->get == NULL && property->set == NULL) continue; if (property->get != NULL) { if (property->set == NULL) access = "read"; else access = "readwrite"; } else access = "write"; g_string_append_printf(xml, "\t\t\n", property->name, property->type, access); if (property->flags & G_DBUS_PROPERTY_FLAG_DEPRECATED) add_annotation(xml, "org.freedesktop.DBus.Deprecated"); g_string_append(xml, "\t\t\n"); } } static char *generate_introspect(DBusConnection *connection, const char *path, ObjectData *data) { GString *xml; GSList *list; char **children; int i; DBG("connection %p path %s", connection, path); xml = g_string_new(DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE); g_string_append_printf(xml, "\n", path); g_string_append_printf(xml, "\t\n", DBUS_INTERFACE_INTROSPECTABLE); g_string_append(xml, "\t\t\n"); add_arguments(xml, "out", "s"); g_string_append(xml, "\t\t\n"); g_string_append(xml, "\t\n"); g_string_append_printf(xml, "\t\n", DBUS_INTERFACE_PROPERTIES); g_string_append(xml, "\t\t\n"); add_arguments(xml, "in", "ss"); add_arguments(xml, "out", "v"); g_string_append(xml, "\t\t\n"); g_string_append(xml, "\t\t\n"); add_arguments(xml, "in", "ssv"); g_string_append(xml, "\t\t\n"); g_string_append(xml, "\t\t\n"); add_arguments(xml, "in", "s"); add_arguments(xml, "out", "a{sv}"); g_string_append(xml, "\t\t\n"); g_string_append(xml, "\t\n"); for (list = data->interfaces; list; list = list->next) { InterfaceData *interface = list->data; g_string_append_printf(xml, "\t\n", interface->name); add_methods(xml, interface->methods); add_signals(xml, interface->signals); add_properties(xml, interface->properties); g_string_append(xml, "\t\n"); } if (dbus_connection_list_registered(connection, path, &children) == FALSE) goto done; for (i = 0; children[i]; i++) g_string_append_printf(xml, "\t\n", children[i]); dbus_free_string_array(children); done: g_string_append(xml, "\n"); return g_string_free(xml, FALSE); } static void update_parent(DBusConnection *connection, const char *path) { ObjectData *data; char *parent; DBG("connection %p path %s", connection, path); if (strlen(path) < 2 || path[0] != '/') return; parent = g_path_get_dirname(path); if (parent == NULL) return; if (dbus_connection_get_object_path_data(connection, parent, (void *) &data) == FALSE) { update_parent(connection, parent); goto done; } if (data == NULL) { update_parent(connection, parent); goto done; } g_free(data->introspect); data->introspect = generate_introspect(connection, parent, data); done: g_free(parent); } static DBusHandlerResult send_message(DBusConnection *connection, DBusMessage *message) { dbus_bool_t result; result = dbus_connection_send(connection, message, NULL); dbus_message_unref(message); if (result == FALSE) return DBUS_HANDLER_RESULT_NEED_MEMORY; return DBUS_HANDLER_RESULT_HANDLED; } static DBusHandlerResult send_error(DBusConnection *connection, DBusMessage *message, const char *name, const char *text) { DBusMessage *error; error = dbus_message_new_error(message, name, text); if (error == NULL) return DBUS_HANDLER_RESULT_NEED_MEMORY; return send_message(connection, error); } static DBusHandlerResult introspect(DBusConnection *connection, DBusMessage *message, ObjectData *data) { DBusMessage *reply; DBG("connection %p message %p object data %p", connection, message, data); if (data->introspect == NULL) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; if (dbus_message_has_signature(message, DBUS_TYPE_INVALID_AS_STRING) == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; reply = dbus_message_new_method_return(message); if (reply == NULL) return DBUS_HANDLER_RESULT_NEED_MEMORY; dbus_message_append_args(reply, DBUS_TYPE_STRING, &data->introspect, DBUS_TYPE_INVALID); return send_message(connection, reply); } static DBusHandlerResult properties_get(DBusConnection *connection, DBusMessage *message, ObjectData *data) { DBusMessage *reply; BDBusPropertyTable *property; DBusMessageIter iter, value; dbus_bool_t result; const char *interface, *name; InterfaceData *iface; DBG("connection %p message %p object data %p", connection, message, data); if (dbus_message_has_signature(message, DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_INVALID_AS_STRING) == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID); DBG("interface %s name %s", interface, name); iface = find_interface(data->interfaces, interface); property = find_property(iface, name); if (property == NULL) return send_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "Property not found"); if (property->get == NULL) return send_error(connection, message, DBUS_ERROR_ACCESS_DENIED, "Reading of property not allowed"); reply = dbus_message_new_method_return(message); if (reply == NULL) return DBUS_HANDLER_RESULT_NEED_MEMORY; dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, property->type, &value); result = property->get(connection, &value, iface->user_data); dbus_message_iter_close_container(&iter, &value); if (result == FALSE) { dbus_message_unref(reply); return send_error(connection, message, DBUS_ERROR_FAILED, "Reading of property failed"); } return send_message(connection, reply); } static DBusHandlerResult properties_set(DBusConnection *connection, DBusMessage *message, ObjectData *data) { DBusMessage *reply; BDBusPropertyTable *property; DBusMessageIter iter, value; const char *interface, *name; InterfaceData *iface; DBG("connection %p message %p object data %p", connection, message, data); if (dbus_message_has_signature(message, DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_TYPE_INVALID_AS_STRING) == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; dbus_message_iter_init(message, &iter); dbus_message_iter_get_basic(&iter, &interface); dbus_message_iter_next(&iter); dbus_message_iter_get_basic(&iter, &name); dbus_message_iter_next(&iter); dbus_message_iter_recurse(&iter, &value); DBG("interface %s name %s", interface, name); iface = find_interface(data->interfaces, interface); property = find_property(iface, name); if (property == NULL) return send_error(connection, message, DBUS_ERROR_BAD_ADDRESS, "Property not found"); if (property->set == NULL) return send_error(connection, message, DBUS_ERROR_ACCESS_DENIED, "Writing to property not allowed"); reply = dbus_message_new_method_return(message); if (reply == NULL) return DBUS_HANDLER_RESULT_NEED_MEMORY; dbus_message_append_args(reply, DBUS_TYPE_INVALID); if (property->set(connection, &value, iface->user_data) == FALSE) { dbus_message_unref(reply); return send_error(connection, message, DBUS_ERROR_FAILED, "Writing to property failed"); } return send_message(connection, reply); } static inline void append_message(DBusMessageIter *value, DBusMessage *message) { DBusMessageIter iter, temp; dbus_message_iter_init(message, &temp); dbus_message_iter_recurse(&temp, &iter); do { int type = dbus_message_iter_get_arg_type(&iter); void *data; dbus_message_iter_get_basic(&iter, &data); dbus_message_iter_append_basic(value, type, &data); } while (dbus_message_iter_next(&iter) == TRUE); } static void do_getall(DBusConnection *connection, DBusMessageIter *iter, InterfaceData *interface, ObjectData *data) { BDBusPropertyTable *property; if (interface == NULL) return; for (property = interface->properties; property && property->name; property++) { DBusMessage *message; DBusMessageIter entry, value; dbus_bool_t result; if (property->get == NULL) continue; message = dbus_message_new(DBUS_MESSAGE_TYPE_METHOD_RETURN); if (message == NULL) continue; dbus_message_iter_init_append(message, &entry); dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, property->type, &value); result = property->get(connection, &value, interface->user_data); dbus_message_iter_close_container(&entry, &value); if (result == TRUE) { dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL, &entry); dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &property->name); dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, property->type, &value); append_message(&value, message); dbus_message_iter_close_container(&entry, &value); dbus_message_iter_close_container(iter, &entry); } dbus_message_unref(message); } } static DBusHandlerResult properties_getall(DBusConnection *connection, DBusMessage *message, ObjectData *data) { DBusMessage *reply; DBusMessageIter iter, dict; const char *interface; DBG("connection %p message %p object data %p", connection, message, data); if (dbus_message_has_signature(message, DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_INVALID_AS_STRING) == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID); DBG("interface %s", interface); reply = dbus_message_new_method_return(message); if (reply == NULL) return DBUS_HANDLER_RESULT_NEED_MEMORY; dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); do_getall(connection, &dict, find_interface(data->interfaces, interface), data); dbus_message_iter_close_container(&iter, &dict); return send_message(connection, reply); } static DBusHandlerResult handle_message(DBusConnection *connection, DBusMessage *message, void *user_data) { ObjectData *data = user_data; InterfaceData *interface; BDBusMethodTable *method; DBG("object data %p", data); if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect") == TRUE) return introspect(connection, message, data); if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "Get") == TRUE) return properties_get(connection, message, data); if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "Set") == TRUE) return properties_set(connection, message, data); if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "GetAll") == TRUE) return properties_getall(connection, message, data); interface = find_interface(data->interfaces, dbus_message_get_interface(message)); if (interface == NULL) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; DBG("interface data %p name %s", interface, interface->name); for (method = interface->methods; method->name && method->function; method++) { DBusMessage *reply; BDBusMethodFlags flags = method->flags; if (dbus_message_is_method_call(message, interface->name, method->name) == FALSE) continue; if (dbus_message_has_signature(message, method->signature) == FALSE) continue; if(interface->callback) { interface->callback(interface->user_data); } /* method->function() might disconnect the interface, in which case the "method" pointer itself becomes invalid - don't use it below */ reply = method->function(connection, message, (flags & G_DBUS_METHOD_FLAG_METHOD_DATA) ? method->method_data : interface->user_data); method = NULL; if (flags & G_DBUS_METHOD_FLAG_NOREPLY) { if (reply != NULL) dbus_message_unref(reply); return DBUS_HANDLER_RESULT_HANDLED; } if (flags & G_DBUS_METHOD_FLAG_ASYNC) { if (reply == NULL) return DBUS_HANDLER_RESULT_HANDLED; } if (reply == NULL) return DBUS_HANDLER_RESULT_NEED_MEMORY; return send_message(connection, reply); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static void handle_unregister(DBusConnection *connection, void *user_data) { ObjectData *data = user_data; GSList *list; DBG("object data %p path %s", data, data->path); g_free(data->path); for (list = data->interfaces; list; list = list->next) { InterfaceData *interface = list->data; DBG("interface data %p name %s", interface, interface->name); if (interface->destroy) interface->destroy(interface->user_data); g_free(interface->name); g_free(interface); } g_slist_free(data->interfaces); g_free(data->introspect); g_static_mutex_free(&data->mutex); g_free(data); } static DBusObjectPathVTable object_table = { .unregister_function = handle_unregister, .message_function = handle_message, }; /** * b_dbus_register_object: * @connection: the connection * @path: object path * * Registers a path in the object hierarchy. * * Returns: #TRUE on success */ static gboolean b_dbus_register_object(DBusConnection *connection, const char *path) { ConnectionData *data; ObjectData *object; DBG("connection %p path %s", connection, path); if (dbus_connection_allocate_data_slot(&connection_slot) == FALSE) return FALSE; DBG("connection slot %d", connection_slot); data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) { data = g_try_new0(ConnectionData, 1); if (data == NULL) { dbus_connection_free_data_slot(&connection_slot); return 0; } g_static_mutex_init(&data->mutex); if (dbus_connection_set_data(connection, connection_slot, data, NULL) == FALSE) { dbus_connection_free_data_slot(&connection_slot); g_free(data); return 0; } } DBG("connection data %p", data); g_static_mutex_lock(&data->mutex); object = find_object(data->objects, path); if (!object) { object = g_new0(ObjectData, 1); g_static_mutex_init(&object->mutex); object->path = g_strdup(path); object->interfaces = NULL; object->refcount = 0; object->introspect = generate_introspect(connection, path, object); if (dbus_connection_register_object_path(connection, path, &object_table, object) == FALSE) { g_free(object->introspect); g_free(object); return FALSE; } data->objects = g_slist_append(data->objects, object); } object->refcount++; g_static_mutex_unlock(&data->mutex); DBG("object data %p", object); update_parent(connection, path); return TRUE; } /** * b_dbus_unregister_object: * @connection: the connection * @path: object path * * Unregister the given path in the object hierarchy and * free the assigned data structures. * * Returns: #TRUE on success */ static gboolean b_dbus_unregister_object(DBusConnection *connection, const char *path) { ConnectionData *data; ObjectData *object; gboolean result = TRUE; DBG("connection %p path %s", connection, path); data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) return FALSE; if (dbus_connection_get_object_path_data(connection, path, (void *) &object) == FALSE) return FALSE; if (object == NULL) return FALSE; g_static_mutex_lock(&data->mutex); object->refcount--; if (!object->refcount) { result = dbus_connection_unregister_object_path(connection, path); data->objects = g_slist_remove(data->objects, object); if (!data->objects) dbus_connection_set_data(connection, connection_slot, NULL, NULL); } g_static_mutex_unlock(&data->mutex); dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); if (!data->objects) { g_static_mutex_free(&data->mutex); g_free(data); } update_parent(connection, path); return result; } #if 0 /** * b_dbus_unregister_object_hierarchy: * @connection: the connection * @path: object path * * Unregister the given path and all subpaths in the * object hierarchy and free all assigned data strcutures. * * Returns: #TRUE on success */ static gboolean b_dbus_unregister_object_hierarchy(DBusConnection *connection, const char *path) { ConnectionData *data; ObjectData *object; GSList *list; size_t pathlen; dbus_bool_t result; DBG("connection %p path %s", connection, path); data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) return FALSE; if (dbus_connection_get_object_path_data(connection, path, (void *) &object) == FALSE) return FALSE; if (object == NULL) return FALSE; pathlen = strlen(path); g_static_mutex_lock(&data->mutex); for (list = data->objects; list; list = list->next) { ObjectData *object = list->data; if (strlen(object->path) <= pathlen) continue; if (strncmp(object->path, path, pathlen) != 0) continue; DBG("object data %p path %s", object, object->path); data->objects = g_slist_remove(data->objects, object); dbus_connection_unregister_object_path(connection, object->path); dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); } g_static_mutex_unlock(&data->mutex); result = b_dbus_unregister_object(connection, path); if (result == FALSE) return FALSE; update_parent(connection, path); return TRUE; } /** * b_dbus_unregister_all_objects: * @connection: the connection * * Unregister the all paths in the object hierarchy. */ static void b_dbus_unregister_all_objects(DBusConnection *connection) { ConnectionData *data; GSList *list; DBG("connection %p slot %d", connection, connection_slot); if (connection_slot < 0) return; data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) return; DBG("connection data %p", data); g_static_mutex_lock(&data->mutex); for (list = data->objects; list; list = list->next) { ObjectData *object = list->data; DBG("object data %p path %s", object, object->path); dbus_connection_unregister_object_path(connection, object->path); dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); } g_slist_free(data->objects); g_static_mutex_unlock(&data->mutex); g_free(data); } #endif /** * b_dbus_register_interface: * @connection: the connection * @path: object path * @name: interface name * @methods: method table * @signals: signal table * @properties: property table * @user_data: user data to assign to interface * @destroy: function called to destroy user_data * * Registers an interface for the given path in the * object hierarchy with the given methods, signals * and/or properties. * * Returns: #TRUE on success */ gboolean b_dbus_register_interface_with_callback(DBusConnection *connection, const char *path, const char *name, BDBusMethodTable *methods, BDBusSignalTable *signals, BDBusPropertyTable *properties, void *user_data, BDBusDestroyFunction destroy, BDBusInterfaceFunction callback) { ObjectData *object; InterfaceData *interface; DBG("connection %p path %s name %s", connection, path, name); if (b_dbus_register_object(connection, path) == FALSE) return FALSE; if (dbus_connection_get_object_path_data(connection, path, (void *) &object) == FALSE) return FALSE; if (object == NULL) return FALSE; if (find_interface(object->interfaces, name) != NULL) return FALSE; interface = g_new0(InterfaceData, 1); interface->name = g_strdup(name); interface->methods = methods; interface->signals = signals; interface->properties = properties; interface->user_data = user_data; interface->destroy = destroy; interface->callback = callback; g_static_mutex_lock(&object->mutex); object->interfaces = g_slist_append(object->interfaces, interface); g_free(object->introspect); object->introspect = generate_introspect(connection, path, object); g_static_mutex_unlock(&object->mutex); return TRUE; } gboolean b_dbus_register_interface(DBusConnection *connection, const char *path, const char *name, BDBusMethodTable *methods, BDBusSignalTable *signals, BDBusPropertyTable *properties, void *user_data, BDBusDestroyFunction destroy) { return b_dbus_register_interface_with_callback(connection, path, name, methods, signals, properties, user_data, destroy, NULL); } /** * b_dbus_unregister_interface: * @connection: the connection * @path: object path * @name: interface name * * Unregister the given interface for the given path * in the object hierarchy. * * Returns: #TRUE on success */ gboolean b_dbus_unregister_interface(DBusConnection *connection, const char *path, const char *name) { ObjectData *object; InterfaceData *interface; DBG("connection %p path %s name %s", connection, path, name); if (dbus_connection_get_object_path_data(connection, path, (void *) &object) == FALSE) return FALSE; if (object == NULL) return FALSE; interface = find_interface(object->interfaces, name); if (interface == NULL) return FALSE; g_static_mutex_lock(&object->mutex); object->interfaces = g_slist_remove(object->interfaces, interface); g_free(object->introspect); object->introspect = generate_introspect(connection, path, object); g_static_mutex_unlock(&object->mutex); g_free(interface->name); g_free(interface); b_dbus_unregister_object(connection, path); return TRUE; } char *printf_dyn(const char *format, va_list ap) { va_list aq; char *buffer = NULL; ssize_t size = 0; ssize_t realsize = 255; do { // vsnprintf() destroys ap, so make a copy first va_copy(aq, ap); if (size < realsize) { char *oldbuffer = buffer; buffer = (char *)realloc(buffer, realsize + 1); if (!buffer) { if (oldbuffer) { free(oldbuffer); } return strdup(""); } size = realsize; } // cppcheck-suppress nullPointer realsize = vsnprintf(buffer, size + 1, format, aq); if (realsize == -1) { // old-style vnsprintf: exact len unknown, try again with doubled size realsize = size * 2; } va_end(aq); } while(realsize > size); return buffer; } /** * b_dbus_create_error_valist: * @message: the originating message * @name: the error name * @format: the error description * @args: argument list * * Create error reply for the given message. * * Returns: reply message on success */ DBusMessage *b_dbus_create_error_valist(DBusMessage *message, const char *name, const char *format, va_list args) { DBusMessage *msg = NULL; char *descr; DBG("message %p name %s", message, name); descr = printf_dyn(format, args); if (descr) { msg = dbus_message_new_error(message, name, descr); free(descr); } return msg; } /** * b_dbus_create_error: * @message: the originating message * @name: the error name * @format: the error description * @varargs: list of parameters * * Create error reply for the given message. * * Returns: reply message on success */ DBusMessage *b_dbus_create_error(DBusMessage *message, const char *name, const char *format, ...) { va_list args; DBusMessage *reply; DBG("message %p name %s", message, name); va_start(args, format); reply = b_dbus_create_error_valist(message, name, format, args); va_end(args); return reply; } /** * b_dbus_create_reply_valist: * @message: the originating message * @type: first argument type * @args: argument list * * Create reply for the given message. * * Returns: reply message on success */ DBusMessage *b_dbus_create_reply_valist(DBusMessage *message, int type, va_list args) { DBusMessage *reply; DBG("message %p", message); reply = dbus_message_new_method_return(message); if (reply == NULL) return NULL; if (dbus_message_append_args_valist(reply, type, args) == FALSE) { dbus_message_unref(reply); return NULL; } return reply; } /** * b_dbus_create_reply: * @message: the originating message * @type: first argument type * @varargs: list of parameters * * Create reply for the given message. * * Returns: reply message on success */ DBusMessage *b_dbus_create_reply(DBusMessage *message, int type, ...) { va_list args; DBusMessage *reply; DBG("message %p", message); va_start(args, type); reply = b_dbus_create_reply_valist(message, type, args); va_end(args); return reply; } /** * b_dbus_send_message: * @connection: the connection * @message: the message to send * * Send message via the given D-Bus connection. * * The reference count for the message will be decremented by this * function. * * Returns: #TRUE on success */ gboolean b_dbus_send_message(DBusConnection *connection, DBusMessage *message) { dbus_bool_t result; DBG("connection %p message %p", connection, message); result = dbus_connection_send(connection, message, NULL); dbus_message_unref(message); return result; } /** * b_dbus_send_error: * @connection: the connection * @message: the originating message * @name: the error name * @format: the error description * @varargs: list of parameters * * Send error reply for the given message and via the given D-Bus * connection. * * Returns: #TRUE on success */ gboolean b_dbus_send_error(DBusConnection *connection, DBusMessage *message, const char *name, const char *format, ...) { va_list args; DBusMessage *error; DBG("connection %p message %p", connection, message); va_start(args, format); error = b_dbus_create_error_valist(message, name, format, args); va_end(args); if (error == NULL) return FALSE; return b_dbus_send_message(connection, error); } /** * b_dbus_send_reply_valist: * @connection: the connection * @message: the originating message * @type: first argument type * @args: argument list * * Send reply for the given message and via the given D-Bus * connection. * * Returns: #TRUE on success */ gboolean b_dbus_send_reply_valist(DBusConnection *connection, DBusMessage *message, int type, va_list args) { DBusMessage *reply; DBG("connection %p message %p", connection, message); reply = dbus_message_new_method_return(message); if (reply == NULL) return FALSE; if (dbus_message_append_args_valist(reply, type, args) == FALSE) { dbus_message_unref(reply); return FALSE; } return b_dbus_send_message(connection, reply); } /** * b_dbus_send_reply: * @connection: the connection * @message: the originating message * @type: first argument type * @varargs: list of parameters * * Send reply for the given message and via the given D-Bus * connection. * * Returns: #TRUE on success */ gboolean b_dbus_send_reply(DBusConnection *connection, DBusMessage *message, int type, ...) { va_list args; gboolean result; DBG("connection %p message %p", connection, message); va_start(args, type); result = b_dbus_send_reply_valist(connection, message, type, args); va_end(args); return result; } static BDBusSignalTable *find_signal(GSList *interfaces, const char *interface, const char *name) { InterfaceData *data; BDBusSignalTable *signal; data = find_interface(interfaces, interface); if (data == NULL) return NULL; for (signal = data->signals; signal && signal->name; signal++) { if (strcmp(signal->name, name) == 0) break; } return signal; } /** * b_dbus_emit_signal_valist: * @connection: the connection * @path: object path * @interface: interface name * @name: signal name * @type: first argument type * @args: argument list * * Emit a signal for the given path and interface with * the given signal name. * * The signal signature will be check against the registered * signal table. * * Returns: #TRUE on success */ gboolean b_dbus_emit_signal_valist(DBusConnection *connection, const char *path, const char *interface, const char *name, int type, va_list args) { ObjectData *object; BDBusSignalTable *signal; DBusMessage *message; const char *signature; gboolean result = FALSE; DBG("connection %p path %s name %s.%s", connection, path, interface, name); if (dbus_connection_get_object_path_data(connection, path, (void *) &object) == FALSE) return FALSE; if (object == NULL) return FALSE; signal = find_signal(object->interfaces, interface, name); if (signal == NULL) return FALSE; message = dbus_message_new_signal(path, interface, name); if (message == NULL) return FALSE; if (dbus_message_append_args_valist(message, type, args) == FALSE) goto done; signature = dbus_message_get_signature(message); if (strcmp(signal->signature, signature) != 0) goto done; DBG("connection %p signature \"%s\"", connection, signature); if (dbus_connection_send(connection, message, NULL) == FALSE) goto done; result = TRUE; done: dbus_message_unref(message); return result; } /** * b_dbus_emit_signal: * @connection: the connection * @path: object path * @interface: interface name * @name: signal name * @type: first argument type * @varargs: list of parameters * * Emit a signal for the given path and interface with * the given signal name. * * The signal signature will be check against the registered * signal table. * * Returns: #TRUE on success */ gboolean b_dbus_emit_signal(DBusConnection *connection, const char *path, const char *interface, const char *name, int type, ...) { va_list args; gboolean result; DBG("connection %p path %s name %s.%s", connection, path, interface, name); va_start(args, type); result = b_dbus_emit_signal_valist(connection, path, interface, name, type, args); va_end(args); return result; } syncevolution-1.5/src/gdbus/watch.c0000644000373300001540000003106212326412403020662 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include #include "gdbus.h" #include "debug.h" static dbus_int32_t connection_slot = -1; typedef struct { GSList *watches; GSList *handlers; guint next_id; } ConnectionData; typedef struct { guint id; char *name; void *user_data; char *match; BDBusWatchFunction connect; BDBusWatchFunction disconn; BDBusDestroyFunction destroy; } WatchData; typedef struct { guint id; void *user_data; BDBusWatchFunction function; BDBusDestroyFunction destroy; } DisconnectData; typedef struct { guint id; void *user_data; char *match; BDBusSignalFunction function; BDBusDestroyFunction destroy; } SignalData; static DBusHandlerResult signal_function(DBusConnection *connection, DBusMessage *message, void *user_data) { ConnectionData *data = user_data; GSList *list; DBG("connection %p message %p", connection, message); for (list = data->handlers; list; list = list->next) { SignalData *signal = list->data; gboolean result; if (signal->function == NULL) continue; result = signal->function(connection, message, signal->user_data); if (result == TRUE) continue; if (signal->destroy != NULL) signal->destroy(signal->user_data); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static DBusHandlerResult owner_function(DBusConnection *connection, DBusMessage *message, void *user_data) { ConnectionData *data = user_data; GSList *list; const char *name, *old, *new; DBG("connection %p message %p", connection, message); if (dbus_message_get_args(message, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &old, DBUS_TYPE_STRING, &new, DBUS_TYPE_INVALID) == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; DBG("name %s \"%s\" => \"%s\"", name, old, new); /* * Allow the watch to remove itself. That'll make the "list" pointer * invalid, need to read it before calling the watch. */ list = data->watches; while (list) { WatchData *watch = list->data; list = list->next; if (strcmp(name, watch->name) != 0) continue; if (watch->connect != NULL && *old == '\0' && *new != '\0') watch->connect(connection, watch->user_data); if (watch->disconn != NULL && *old != '\0' && *new == '\0') watch->disconn(connection, watch->user_data); } return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static DBusHandlerResult filter_function(DBusConnection *connection, DBusMessage *message, void *user_data) { if (dbus_message_is_signal(message, DBUS_INTERFACE_DBUS, "NameOwnerChanged") == TRUE) return owner_function(connection, message, user_data); if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_SIGNAL) return signal_function(connection, message, user_data); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } static ConnectionData *get_connection_data(DBusConnection *connection) { ConnectionData *data; /* dbus_bool_t result; */ DBG("connection %p", connection); if (dbus_connection_allocate_data_slot(&connection_slot) == FALSE) return NULL; DBG("connection slot %d", connection_slot); data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) { data = g_try_new0(ConnectionData, 1); if (data == NULL) { dbus_connection_free_data_slot(&connection_slot); return NULL; } data->next_id = 1; if (dbus_connection_set_data(connection, connection_slot, data, NULL) == FALSE) { dbus_connection_free_data_slot(&connection_slot); g_free(data); return NULL; } /* result = */ dbus_connection_add_filter(connection, filter_function, data, NULL); } return data; } static void put_connection_data(DBusConnection *connection) { dbus_connection_free_data_slot(&connection_slot); } /** * b_dbus_add_service_watch: * @connection: the connection * @name: unique or well known name * @connect: function called on name connect * @disconnect: function called on name disconnect * @user_data: user data to pass to the function * @destroy: function called to destroy user_data * * Add new watch to listen for connects and/or disconnects * of a client for the given connection. * * Returns: identifier of the watch */ guint b_dbus_add_service_watch(DBusConnection *connection, const char *name, BDBusWatchFunction connect, BDBusWatchFunction disconnect, void *user_data, BDBusDestroyFunction destroy) { ConnectionData *data; WatchData *watch; DBusError error; DBG("connection %p name %s", connection, name); data = get_connection_data(connection); if (data == NULL) return 0; DBG("connection data %p", data); watch = g_try_new0(WatchData, 1); if (watch == NULL) goto error; watch->name = g_strdup(name); if (watch->name == NULL) goto error; watch->user_data = user_data; watch->connect = connect; watch->disconn = disconnect; watch->destroy = destroy; watch->match = g_strdup_printf("interface=%s,member=NameOwnerChanged,arg0=%s", DBUS_INTERFACE_DBUS, name); if (watch->match == NULL) goto error; dbus_error_init(&error); dbus_bus_add_match(connection, watch->match, &error); if (dbus_error_is_set(&error) == TRUE) { dbus_error_free(&error); goto error; } watch->id = data->next_id++; data->watches = g_slist_append(data->watches, watch); DBG("tag %d", watch->id); return watch->id; error: // Doesn't look valid: Possible null pointer dereference: watch - otherwise it is redundant to check it against null. // cppcheck-suppress nullPointer if (watch != NULL) { g_free(watch->name); g_free(watch->match); } g_free(watch); put_connection_data(connection); return 0; } /** * b_dbus_remove_watch: * @connection: the connection * @tag: watch identifier * * Removes the watch for the given identifier. * * Returns: #TRUE on success */ gboolean b_dbus_remove_watch(DBusConnection *connection, guint tag) { ConnectionData *data; GSList *list; DBG("connection %p tag %d", connection, tag); if (connection_slot < 0) return FALSE; data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) return FALSE; for (list = data->watches; list; list = list->next) { WatchData *watch = list->data; if (watch->id == tag) { data->watches = g_slist_remove(data->watches, watch); if (watch->destroy != NULL) watch->destroy(watch->user_data); dbus_bus_remove_match(connection, watch->match, NULL); g_free(watch->name); g_free(watch->match); g_free(watch); goto done; } } for (list = data->handlers; list; list = list->next) { SignalData *signal = list->data; if (signal->id == tag) { data->handlers = g_slist_remove(data->handlers, signal); if (signal->destroy != NULL) signal->destroy(signal->user_data); dbus_bus_remove_match(connection, signal->match, NULL); g_free(signal->match); g_free(signal); goto done; } } return FALSE; done: if (!data->watches && !data->handlers) { dbus_connection_remove_filter(connection, filter_function, data); dbus_connection_set_data(connection, connection_slot, NULL, NULL); g_free(data); } dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); return TRUE; } /** * b_dbus_remove_all_watches: * @connection: the connection * * Removes all registered watches. */ void b_dbus_remove_all_watches(DBusConnection *connection) { ConnectionData *data; GSList *list; DBG("connection %p slot %d", connection, connection_slot); if (connection_slot < 0) return; data = dbus_connection_get_data(connection, connection_slot); if (data == NULL) return; DBG("connection data %p", data); for (list = data->watches; list; list = list->next) { WatchData *watch = list->data; DBG("watch data %p tag %d", watch, watch->id); if (watch->destroy != NULL) watch->destroy(watch->user_data); dbus_bus_remove_match(connection, watch->match, NULL); g_free(watch->match); g_free(watch->name); g_free(watch); dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); } g_slist_free(data->watches); for (list = data->handlers; list; list = list->next) { SignalData *signal = list->data; DBG("signal data %p tag %d", signal, signal->id); if (signal->destroy != NULL) signal->destroy(signal->user_data); dbus_bus_remove_match(connection, signal->match, NULL); g_free(signal->match); g_free(signal); dbus_connection_free_data_slot(&connection_slot); DBG("connection slot %d", connection_slot); } g_slist_free(data->handlers); dbus_connection_remove_filter(connection, filter_function, data); g_free(data); } static void disconnect_function(DBusConnection *connection, void *user_data) { DisconnectData *data = user_data; // The callback function might remove the watch, // which invalidates the data pointer. Remember // the ID. guint id = data->id; data->function(connection, data->user_data); b_dbus_remove_watch(connection, id); } static void disconnect_release(void *user_data) { g_free(user_data); } /** * b_dbus_add_disconnect_watch: * @connection: the connection * @name: unique or well known name * @function: function called on name disconnect * @user_data: user data to pass to the function * @destroy: function called to destroy user_data * * Add new watch to listen for disconnect of a client * for the given connection. * * After the callback has been called, this watch will be * automatically removed. * * Returns: identifier of the watch */ guint b_dbus_add_disconnect_watch(DBusConnection *connection, const char *name, BDBusWatchFunction function, void *user_data, BDBusDestroyFunction destroy) { DisconnectData *data; data = g_try_new0(DisconnectData, 1); if (data == NULL) return 0; data->user_data = user_data; data->function = function; data->destroy = destroy; data->id = b_dbus_add_service_watch(connection, name, NULL, disconnect_function, data, disconnect_release); if (data->id == 0) { g_free(data); return 0; } return data->id; } /** * b_dbus_add_signal_watch: * @connection: the connection * @rule: matching rule for this signal * @function: function called when signal arrives * @user_data: user data to pass to the function * @destroy: function called to destroy user_data * @is_bus_conn: whether the connection is with the bus * * Add new watch to listen for specific signals of * a client for the given connection. * * If the callback returns #FALSE this watch will be * automatically removed. * * Returns: identifier of the watch */ guint b_dbus_add_signal_watch(DBusConnection *connection, const char *rule, BDBusSignalFunction function, void *user_data, BDBusDestroyFunction destroy, gboolean is_bus_conn) { ConnectionData *data; SignalData *signal; DBusError error; DBG("connection %p rule %s", connection, rule); data = get_connection_data(connection); if (data == NULL) return 0; DBG("connection data %p", data); signal = g_try_new0(SignalData, 1); if (signal == NULL) goto error; signal->match = g_strdup(rule); if (!signal->match) goto error; signal->user_data = user_data; signal->function = function; signal->destroy = destroy; if (is_bus_conn) { dbus_error_init(&error); dbus_bus_add_match(connection, rule, &error); if (dbus_error_is_set(&error) == TRUE) { dbus_error_free(&error); goto error; } } signal->id = data->next_id++; data->handlers = g_slist_append(data->handlers, signal); DBG("tag %d", signal->id); return signal->id; error: // Doesn't look valid: Possible null pointer dereference: signal - otherwise it is redundant to check it against null. // cppcheck-suppress nullPointer if (signal) g_free(signal->match); g_free(signal); put_connection_data(connection); return 0; } syncevolution-1.5/src/gdbus/gdbus.h0000644000373300001540000002104612326412403020666 0ustar00nightlynightly00000000000000/* * * Library for simple D-Bus integration with GLib * * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifndef __BDBUS_H #define __BDBUS_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include /** * SECTION:gdbus * @title: D-Bus helper library * @short_description: Library for simple D-Bus integration with GLib */ /** * BDBusDestroyFunction: * @user_data: user data to pass to the function * * Destroy function */ typedef void (* BDBusDestroyFunction) (void *user_data); /** * BDBusWatchFunction: * @connection: a #DBusConnection * @user_data: user data to pass to the function * * Watch function */ typedef void (* BDBusWatchFunction) (DBusConnection *connection, void *user_data); /** * BDBusSignalFunction: * @connection: a #DBusConnection * @message: a #DBusMessage * @user_data: user data to pass to the function * * Signal function * * Returns: #FALSE to remove this watch */ typedef gboolean (* BDBusSignalFunction) (DBusConnection *connection, DBusMessage *message, void *user_data); /** * BDBusMethodFunction: * @connection: a #DBusConnection * @message: a #DBusMessage * @user_data: user data to pass to the function * * Method function * * Returns: #DBusMessage reply */ typedef DBusMessage * (* BDBusMethodFunction) (DBusConnection *connection, DBusMessage *message, void *user_data); /** * BDBusPropertyGetFunction: * @connection: a #DBusConnection * @iter: a #DBusMessageIter * @user_data: user data to pass to the function * * Property get function * * Returns: #TRUE on success */ typedef dbus_bool_t (* BDBusPropertyGetFunction) (DBusConnection *connection, DBusMessageIter *iter, void *user_data); /** * BDBusPropertySetFunction: * @connection: a #DBusConnection * @iter: a #DBusMessageIter * @user_data: user data to pass to the function * * Property set function * * Returns: #TRUE on success */ typedef dbus_bool_t (* BDBusPropertySetFunction) (DBusConnection *connection, DBusMessageIter *iter, void *user_data); /** * BDBusInterfaceFunction: * @user_data: user data to pass to the function * * Callback function for interface */ typedef void (* BDBusInterfaceFunction) (void *user_data); /** * BDBusMethodFlags: * @G_DBUS_METHOD_FLAG_DEPRECATED: annotate deprecated methods * @G_DBUS_METHOD_FLAG_NOREPLY: annotate methods with no reply * @G_DBUS_METHOD_FLAG_ASYNC: annotate asynchronous methods * @G_DBUS_METHOD_FLAG_METHOD_DATA: the method is passed the * BDBusMethodTable method_data pointer * instead of the b_dbus_register_interface() * user_data pointer * * Method flags */ typedef enum { G_DBUS_METHOD_FLAG_NONE = 0, G_DBUS_METHOD_FLAG_DEPRECATED = (1 << 0), G_DBUS_METHOD_FLAG_NOREPLY = (1 << 1), G_DBUS_METHOD_FLAG_ASYNC = (1 << 2), G_DBUS_METHOD_FLAG_METHOD_DATA = (1 << 3), } BDBusMethodFlags; /** * BDBusSignalFlags: * @G_DBUS_SIGNAL_FLAG_DEPRECATED: annotate deprecated signals * * Signal flags */ typedef enum { G_DBUS_SIGNAL_FLAG_NONE = 0, G_DBUS_SIGNAL_FLAG_DEPRECATED = (1 << 0), } BDBusSignalFlags; /** * BDBusPropertyFlags: * @G_DBUS_PROPERTY_FLAG_DEPRECATED: annotate deprecated properties * * Property flags */ typedef enum { G_DBUS_PROPERTY_FLAG_NONE = 0, G_DBUS_PROPERTY_FLAG_DEPRECATED = (1 << 0), } BDBusPropertyFlags; /** * BDBusMethodTable: * @name: method name * @signature: method signature * @reply: reply signature * @function: method function * @flags: method flags * @method_data: passed as BDBusMethodFunction user_data if * G_DBUS_METHOD_FLAG_METHOD_DATA is set * @destroy: destructor function for method table; not called * by gdbus itself, because it never frees BDBusMethodTable * entries, but useful in upper layers * * Method table */ typedef struct { const char *name; const char *signature; const char *reply; BDBusMethodFunction function; BDBusMethodFlags flags; void *method_data; BDBusDestroyFunction destroy; } BDBusMethodTable; /** * BDBusSignalTable: * @name: signal name * @signature: signal signature * @flags: signal flags * * Signal table */ typedef struct { const char *name; const char *signature; BDBusSignalFlags flags; } BDBusSignalTable; /** * BDBusPropertyTable: * @name: property name * @type: property value type * @get: property get function * @set: property set function * @flags: property flags * * Property table */ typedef struct { const char *name; const char *type; BDBusPropertyGetFunction get; BDBusPropertyGetFunction set; BDBusPropertyFlags flags; } BDBusPropertyTable; void b_dbus_setup_connection(DBusConnection *connection, gboolean unshared, GMainContext *context); void b_dbus_cleanup_connection(DBusConnection *connection); void b_dbus_setup_server(DBusServer *server); DBusConnection *b_dbus_setup_bus(DBusBusType type, const char *name, gboolean unshared, DBusError *error); DBusConnection *b_dbus_setup_address(const char *address, DBusError *error); gboolean b_dbus_request_name(DBusConnection *connection, const char *name, DBusError *error); gboolean b_dbus_set_disconnect_function(DBusConnection *connection, BDBusWatchFunction function, void *user_data, BDBusDestroyFunction destroy); gboolean b_dbus_register_interface(DBusConnection *connection, const char *path, const char *name, BDBusMethodTable *methods, BDBusSignalTable *signals, BDBusPropertyTable *properties, void *user_data, BDBusDestroyFunction destroy); gboolean b_dbus_register_interface_with_callback(DBusConnection *connection, const char *path, const char *name, BDBusMethodTable *methods, BDBusSignalTable *signals, BDBusPropertyTable *properties, void *user_data, BDBusDestroyFunction destroy, BDBusInterfaceFunction callback); gboolean b_dbus_unregister_interface(DBusConnection *connection, const char *path, const char *name); DBusMessage *b_dbus_create_error(DBusMessage *message, const char *name, const char *format, ...); DBusMessage *b_dbus_create_error_valist(DBusMessage *message, const char *name, const char *format, va_list args); DBusMessage *b_dbus_create_reply(DBusMessage *message, int type, ...); DBusMessage *b_dbus_create_reply_valist(DBusMessage *message, int type, va_list args); gboolean b_dbus_send_message(DBusConnection *connection, DBusMessage *message); gboolean b_dbus_send_error(DBusConnection *connection, DBusMessage *message, const char *name, const char *format, ...); gboolean b_dbus_send_reply(DBusConnection *connection, DBusMessage *message, int type, ...); gboolean b_dbus_send_reply_valist(DBusConnection *connection, DBusMessage *message, int type, va_list args); gboolean b_dbus_emit_signal(DBusConnection *connection, const char *path, const char *interface, const char *name, int type, ...); gboolean b_dbus_emit_signal_valist(DBusConnection *connection, const char *path, const char *interface, const char *name, int type, va_list args); guint b_dbus_add_service_watch(DBusConnection *connection, const char *name, BDBusWatchFunction connect, BDBusWatchFunction disconnect, void *user_data, BDBusDestroyFunction destroy); guint b_dbus_add_disconnect_watch(DBusConnection *connection, const char *name, BDBusWatchFunction function, void *user_data, BDBusDestroyFunction destroy); guint b_dbus_add_signal_watch(DBusConnection *connection, const char *rule, BDBusSignalFunction function, void *user_data, BDBusDestroyFunction destroy, gboolean is_bus_conn); gboolean b_dbus_remove_watch(DBusConnection *connection, guint tag); void b_dbus_remove_all_watches(DBusConnection *connection); #ifdef __cplusplus } #endif #endif /* __BDBUS_H */ syncevolution-1.5/src/gdbus/gdbus-cxx-bridge.h0000664000373300001540000050672612405555067022753 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * This file contains everything that a D-Bus server needs to * integrate a normal C++ class into D-Bus. Argument and result * marshaling is done in wrapper functions which convert directly * to normal C++ types (bool, integers, std::string, std::map<>, ...). * See dbus_traits for the full list of supported types. * * Before explaining the binding, some terminology first: * - A function has a return type and multiple parameters. * - Input parameters are read-only arguments of the function. * - The function can return values to the caller via the * return type and output parameters (retvals). * * The C++ binding roughly looks like this: * - Arguments can be passed as plain types or const references: void foo(int arg); void bar(const std::string &str); * - A single result can be returned as return value: * int foo(); * - Multiple results can be copied into instances provided by * the wrapper, passed by reference: void foo(std::string &res); * - A return value, arguments and retvals can be combined * arbitrarily. In the D-Bus reply the return code comes before * all return values. * * Asynchronous methods are possible by declaring one parameter as a * Result pointer and later calling the virtual function provided by * it. Parameter passing of results is less flexible than that of * method parameters: the later allows both std::string as well as * const std::string &, for results only the const reference is * supported. The Result instance is passed as pointer and then owned * by the called method. * * Reference counting via boost::intrusive_ptr ensures that all * D-Bus objects are handled automatically internally. */ #ifndef INCL_BDBUS_CXX_BRIDGE #define INCL_BDBUS_CXX_BRIDGE #include "gdbus.h" #include "gdbus-cxx.h" // Not defined by 1.4.x in Maemo Harmattan; INT_MAX has the same // value and effect there. In older libdbus, it is the same as // a very long timeout (2147483s), which is good enough. #include #ifndef DBUS_TIMEOUT_INFINITE # define DBUS_TIMEOUT_INFINITE INT_MAX #endif #include #include #include // Boost docs want this in the boost:: namespace, but // that fails with clang 2.9 depending on the inclusion order of // header files. Global namespace works in all cases. void intrusive_ptr_add_ref(DBusConnection *con); void intrusive_ptr_release(DBusConnection *con); void intrusive_ptr_add_ref(DBusMessage *msg); void intrusive_ptr_release(DBusMessage *msg); void intrusive_ptr_add_ref(DBusPendingCall *call); void intrusive_ptr_release(DBusPendingCall *call); static inline void intrusive_ptr_add_ref(DBusServer *server) { dbus_server_ref(server); } static inline void intrusive_ptr_release(DBusServer *server) { dbus_server_unref(server); } #include #include #include #include #include #include #include /* The connection is the only client-exposed type from the C API. To * keep changes to a minimum while supporting both dbus * implementations, this is made to be a define. The intention is to * remove the define once the in-tree gdbus is dropped. */ #define DBUS_NEW_ERROR_MSG b_dbus_create_error namespace GDBusCXX { // GDBusCXX aliases for the underlying types. // Useful for some external dbus_traits which // need to pass pointers to these types in their // append()/get() methods without depending on GIO or // libdbus types. typedef DBusConnection connection_type; typedef DBusMessage message_type; typedef DBusMessageIter builder_type; typedef DBusMessageIter reader_type; class DBusMessagePtr; class DBusConnectionPtr : public boost::intrusive_ptr { public: DBusConnectionPtr() {} // connections are typically created once, so increment the ref counter by default DBusConnectionPtr(DBusConnection *conn, bool add_ref = true) : boost::intrusive_ptr(conn, add_ref) {} DBusConnection *reference(void) throw() { DBusConnection *conn = get(); dbus_connection_ref(conn); return conn; } /** empty stub: flushing only necessary with GIO D-Bus */ void flush() {} /** GDBus GIO specific: disconnect callback */ typedef boost::function Disconnect_t; void setDisconnect(const Disconnect_t &func); #define GDBUS_CXX_HAVE_DISCONNECT 1 }; class DBusMessagePtr : public boost::intrusive_ptr { public: DBusMessagePtr() {} // expected to be used for messages created anew, // so use the reference already incremented for us // and don't increment by default DBusMessagePtr(DBusMessage *msg, bool add_ref = false) : boost::intrusive_ptr(msg, add_ref) {} DBusMessage *reference(void) throw() { DBusMessage *msg = get(); dbus_message_ref(msg); return msg; } }; class DBusPendingCallPtr : public boost::intrusive_ptr { public: DBusPendingCallPtr(DBusPendingCall *call, bool add_ref = false) : boost::intrusive_ptr(call, add_ref) {} DBusPendingCall *reference(void) throw() { DBusPendingCall *call = get(); dbus_pending_call_ref(call); return call; } }; /** * wrapper around DBusError which initializes * the struct automatically, then can be used to * throw an exception */ class DBusErrorCXX : public DBusError { public: DBusErrorCXX() { dbus_error_init(this); } void throwFailure(const std::string &operation, const std::string &explanation = " failed") { if (dbus_error_is_set(this)) { throw std::runtime_error(operation + ": " + message); } else { throw std::runtime_error(operation + explanation); } } operator bool () { return dbus_error_is_set(this); } }; DBusConnectionPtr dbus_get_bus_connection(const char *busType, const char *name, bool unshared, DBusErrorCXX *err); DBusConnectionPtr dbus_get_bus_connection(const std::string &address, DBusErrorCXX *err); void dbus_bus_connection_undelay(const DBusConnectionPtr &conn); /** * Wrapper around DBusServer. Does intentionally not expose * any of the underlying methods so that the public API * can be implemented differently for GIO GDBus. */ class DBusServerCXX : private boost::noncopyable { public: ~DBusServerCXX(); /** * Called for each new connection. Callback must store the DBusConnectionPtr, * otherwise it will be unref'ed after the callback returns. * If the new connection is not wanted, then it is good style to close it * explicitly in the callback. */ typedef boost::function NewConnection_t; /** * Start listening for new connections on an unused address. */ static boost::shared_ptr listen(const NewConnection_t &newConnection, DBusErrorCXX *err); /** * address used by the server */ std::string getAddress() const { return m_address; } private: DBusServerCXX(DBusServer *server, const std::string &address); static void newConnection(DBusServer *server, DBusConnection *newConn, void *data) throw(); NewConnection_t m_newConnection; boost::intrusive_ptr m_server; std::string m_address; }; /** * Special type for object paths. A string in practice. */ class DBusObject_t : public std::string { public: DBusObject_t() {} template DBusObject_t(T val) : std::string(val) {} template DBusObject_t &operator = (T val) { assign(val); return *this; } }; /** * specializations of this must defined methods for encoding and * decoding type C and declare its signature */ template struct dbus_traits {}; struct dbus_traits_base { /** * A C++ method or function can handle a call asynchronously by * asking to be passed a "boost::shared_ptr" parameter. * The dbus_traits for those parameters have "asynchronous" set to * true, which skips all processing after calling the method. */ static const bool asynchronous = false; }; /** * Append a varying number of parameters as result to the * message, using AppendRetvals(msg) << res1 << res2 << ...; * * Types can be anything that has a dbus_traits, including * types which are normally recognized as input parameters in D-Bus * method calls. */ class AppendRetvals { DBusMessageIter m_iter; public: AppendRetvals(DBusMessagePtr &msg) { dbus_message_iter_init_append(msg.get(), &m_iter); } template AppendRetvals & operator << (const A &a) { dbus_traits::append(m_iter, a); return *this; } }; /** * Append a varying number of method parameters as result to the reply * message, using AppendArgs(msg) << Set(res1) << Set(res2) << ...; */ struct AppendArgs { DBusMessageIter m_iter; AppendArgs(DBusMessage *msg) { dbus_message_iter_init_append(msg, &m_iter); } /** syntactic sugar: redirect << into Set instance */ template AppendArgs & operator << (const A &a) { return a.set(*this); } /** * Always append argument, including those types which * would be recognized by << as parameters and thus get * skipped. */ template AppendArgs & operator + (const A &a) { dbus_traits::append(m_iter, a); return *this; } }; /** default: skip it, not a result of the method */ template struct Set { Set(A &a) {} AppendArgs &set(AppendArgs &context) const { return context; } }; /** same for const reference */ template struct Set { Set(A &a) {} AppendArgs &set(AppendArgs &context) const { return context; } }; /** specialization for reference: marshal result */ template struct Set { A &m_a; Set(A &a) : m_a(a) {} AppendArgs &set(AppendArgs &context) const { dbus_traits::append(context.m_iter, m_a); return context; } }; /** * Extract values from a message, using ExtractArgs(conn, msg) >> Get(val1) >> Get(val2) >> ...; * * This complements AppendArgs: it skips over those method arguments * which are results of the method. Which values are skipped and * which are marshalled depends on the specialization of Get and thus * ultimately on the prototype of the method. */ struct ExtractArgs { DBusConnection *m_conn; DBusMessage *m_msg; DBusMessageIter m_iter; public: ExtractArgs(DBusConnection *conn, DBusMessage *msg) { m_conn = conn; m_msg = msg; dbus_message_iter_init(msg, &m_iter); } /** syntactic sugar: redirect >> into Get instance */ template ExtractArgs & operator >> (const A &a) { return a.get(*this); } }; /** default: extract data from message */ template struct Get { A &m_a; Get(A &a) : m_a(a) {} ExtractArgs &get(ExtractArgs &context) const { dbus_traits::get(context.m_conn, context.m_msg, context.m_iter, m_a); return context; } }; /** same for const reference */ template struct Get { A &m_a; Get(A &a) : m_a(a) {} ExtractArgs &get(ExtractArgs &context) const { dbus_traits::get(context.m_conn, context.m_msg, context.m_iter, m_a); return context; } }; /** specialization for reference: skip it, not an input parameter */ template struct Get { Get(A &a) {} ExtractArgs &get(ExtractArgs &context) const { return context; } }; /** * combines D-Bus connection, path and interface */ class DBusObject { DBusConnectionPtr m_conn; std::string m_path; std::string m_interface; bool m_closeConnection; public: /** * @param closeConnection set to true if the connection * is private and this instance of * DBusObject is meant to be the * last user of the connection; * when this DBusObject deconstructs, * it'll close the connection * (required by libdbus for private * connections; the mechanism in GDBus for * this didn't work) */ DBusObject(const DBusConnectionPtr &conn, const std::string &path, const std::string &interface, bool closeConnection = false) : m_conn(conn), m_path(path), m_interface(interface), m_closeConnection(closeConnection) {} virtual ~DBusObject() { if (m_closeConnection && m_conn) { dbus_connection_close(m_conn.get()); } } DBusConnection *getConnection() const { return m_conn.get(); } const char *getPath() const { return m_path.c_str(); } const char *getInterface() const { return m_interface.c_str(); } }; /** * adds destination to D-Bus connection, path and interface */ class DBusRemoteObject : public DBusObject { std::string m_destination; public: DBusRemoteObject(const DBusConnectionPtr &conn, const std::string &path, const std::string &interface, const std::string &destination, bool closeConnection = false) : DBusObject(conn, path, interface, closeConnection), m_destination(destination) {} const char *getDestination() const { return m_destination.c_str(); } }; template class EmitSignal0Template { const DBusObject &m_object; const std::string m_signal; public: EmitSignal0Template(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () () { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; typedef EmitSignal0Template EmitSignal0; template class EmitSignal1 { const DBusObject &m_object; const std::string m_signal; public: EmitSignal1(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () (A1 a1) { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } AppendRetvals(msg) << a1; if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; template class EmitSignal2 { const DBusObject &m_object; const std::string m_signal; public: EmitSignal2(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () (A1 a1, A2 a2) { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } AppendRetvals(msg) << a1 << a2; if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; template class EmitSignal3 { const DBusObject &m_object; const std::string m_signal; public: EmitSignal3(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3) { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } AppendRetvals(msg) << a1 << a2 << a3; if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; template class EmitSignal4 { const DBusObject &m_object; const std::string m_signal; public: EmitSignal4(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3, A4 a4) { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } AppendRetvals(msg) << a1 << a2 << a3 << a4; if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; template class EmitSignal5 { const DBusObject &m_object; const std::string m_signal; public: EmitSignal5(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5; if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; template class EmitSignal6 { const DBusObject &m_object; const std::string m_signal; public: EmitSignal6(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { DBusMessagePtr msg(dbus_message_new_signal(m_object.getPath(), m_object.getInterface(), m_signal.c_str())); if (!msg) { if (optional) { return; } throw std::runtime_error("dbus_message_new_signal() failed"); } AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6; if (!dbus_connection_send(m_object.getConnection(), msg.get(), NULL)) { if (optional) { return; } throw std::runtime_error("dbus_connection_send failed"); } } BDBusSignalTable makeSignalEntry(BDBusSignalFlags flags = G_DBUS_SIGNAL_FLAG_NONE) const { BDBusSignalTable entry; entry.name = m_signal.c_str(); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); entry.flags = flags; return entry; } }; template struct MakeMethodEntry { // There is no generic implementation of this method. // If you get an error about it missing, then write // a specialization for your type M (the method pointer). // // static BDBusMethodTable make(const char *name, // BDBusMethodFlags flags) }; /** * Storage for method/signal/property arrays. * Always contains at least one empty element * at the end or is NULL. */ template class DBusVector { size_t m_entries; size_t m_size; T *m_elements; static void destroy(BDBusMethodTable &entry) { free(const_cast(entry.name)); free(const_cast(entry.signature)); free(const_cast(entry.reply)); if (entry.destroy) { entry.destroy(&entry); } } static void destroy(BDBusSignalTable &entry) { free(const_cast(entry.signature)); // if (entry.destroy) { // entry.destroy(&entry); // } } public: DBusVector() : m_entries(0), m_size(0), m_elements(NULL) {} ~DBusVector() { if (m_elements) { for (size_t i = 0; i < m_entries; i++) { destroy(m_elements[i]); } free(m_elements); } } T *get() { return m_elements; } void push_back(const T &element) { if (m_entries + 1 >= m_size) { size_t newSize = m_size ? m_size * 2 : 16; T *elements = static_cast(realloc(m_elements, newSize * sizeof(T))); if (!elements) { throw std::bad_alloc(); } m_elements = elements; m_size = newSize; } m_elements[m_entries] = element; m_entries++; memset(m_elements + m_entries, 0, sizeof(T)); } }; /** * utility class for registering an interface */ class DBusObjectHelper : public DBusObject { boost::function m_callback; bool m_activated; DBusVector m_methods; DBusVector m_signals; public: typedef boost::function Callback_t; DBusObjectHelper(const DBusConnectionPtr &conn, const std::string &path, const std::string &interface, const Callback_t &callback = Callback_t(), bool closeConnection = false) : DBusObject(conn, path, interface, closeConnection), m_callback(callback), m_activated(false) { } ~DBusObjectHelper() { deactivate(); } /** * binds a member to the this pointer of its instance * and invokes it when the specified method is called */ template void add(A1 instance, M C::*method, const char *name, BDBusMethodFlags flags = G_DBUS_METHOD_FLAG_NONE) { typedef MakeMethodEntry< boost::function > entry_type; m_methods.push_back(entry_type::make(name, flags, entry_type::boostptr(method, instance))); } /** * binds a plain function pointer with no additional arguments and * invokes it when the specified method is called */ template void add(M *function, const char *name, BDBusMethodFlags flags = G_DBUS_METHOD_FLAG_NONE) { m_methods.push_back(MakeMethodEntry< boost::function >::make(name, flags, function)); } /** * add an existing signal entry */ template void add(const S &s) { m_signals.push_back(s.makeSignalEntry()); } void activate(BDBusMethodTable *methods, BDBusSignalTable *signals, BDBusPropertyTable *properties, const Callback_t &callback) { if (!b_dbus_register_interface_with_callback(getConnection(), getPath(), getInterface(), methods, signals, properties, this, NULL, interfaceCallback)) { throw std::runtime_error(std::string("b_dbus_register_interface() failed for ") + getPath() + " " + getInterface()); } m_callback = callback; m_activated = true; } void activate() { if (!b_dbus_register_interface_with_callback(getConnection(), getPath(), getInterface(), m_methods.get(), m_signals.get(), NULL, this, NULL, interfaceCallback)) { throw std::runtime_error(std::string("b_dbus_register_interface() failed for ") + getPath() + " " + getInterface()); } m_activated = true; } void deactivate() { if (m_activated) { if (!b_dbus_unregister_interface(getConnection(), getPath(), getInterface())) { throw std::runtime_error(std::string("b_dbus_unregister_interface() failed for ") + getPath() + " " + getInterface()); } m_activated = false; } } static void interfaceCallback(void *userData) { DBusObjectHelper* helper = static_cast(userData); if (helper->m_callback) { helper->m_callback(); } } }; /** * to be used for plain parameters like int32_t: * treat as arguments which have to be extracted * from the D-Bus message and can be skipped when * encoding the reply */ template struct basic_marshal : public dbus_traits_base { typedef host host_type; typedef host arg_type; static const int dbus_type = dbus; /** * copy value from D-Bus iterator into variable */ static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host &value) { if (dbus_message_iter_get_arg_type(&iter) != dbus) { throw std::runtime_error("invalid argument"); } dbus_message_iter_get_basic(&iter, &value); dbus_message_iter_next(&iter); } /** * copy value into D-Bus iterator */ static void append(DBusMessageIter &iter, arg_type value) { if (!dbus_message_iter_append_basic(&iter, dbus, &value)) { throw std::runtime_error("out of memory"); } } }; template<> struct dbus_traits : public basic_marshal< uint8_t, DBUS_TYPE_BYTE > { /** * plain type, regardless of whether used as * input or output parameter */ static std::string getType() { return "y"; } /** * plain type => input parameter => non-empty signature */ static std::string getSignature() {return getType(); } /** * plain type => not returned to caller */ static std::string getReply() { return ""; } }; /** if the app wants to use signed char, let it and treat it like a byte */ template<> struct dbus_traits : dbus_traits { typedef int8_t host_type; typedef int8_t arg_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &value) { dbus_traits::get(conn, msg, iter, reinterpret_cast(value)); } }; template<> struct dbus_traits : public basic_marshal< int16_t, DBUS_TYPE_INT16 > { static std::string getType() { return "n"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< uint16_t, DBUS_TYPE_UINT16 > { static std::string getType() { return "q"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< int32_t, DBUS_TYPE_INT32 > { static std::string getType() { return "i"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< uint32_t, DBUS_TYPE_UINT32 > { static std::string getType() { return "u"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< int64_t, DBUS_TYPE_INT64 > { static std::string getType() { return "x"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< uint64_t, DBUS_TYPE_UINT64 > { static std::string getType() { return "t"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< double, DBUS_TYPE_DOUBLE > { static std::string getType() { return "d"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public dbus_traits_base { static std::string getType() { return "b"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } static const int dbus = DBUS_TYPE_BOOLEAN; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, bool &value) { if (dbus_message_iter_get_arg_type(&iter) != dbus) { throw std::runtime_error("invalid argument"); } dbus_bool_t dbus_value; dbus_message_iter_get_basic(&iter, &dbus_value); dbus_message_iter_next(&iter); value = dbus_value; } static void append(DBusMessageIter &iter, bool value) { dbus_bool_t dbus_value = value; if (!dbus_message_iter_append_basic(&iter, dbus, &dbus_value)) { throw std::runtime_error("out of memory"); } } typedef bool host_type; typedef bool arg_type; }; template<> struct dbus_traits : public dbus_traits_base { static std::string getType() { return "s"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } static const int dbus = DBUS_TYPE_STRING; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, std::string &value) { if (dbus_message_iter_get_arg_type(&iter) != dbus) { throw std::runtime_error("invalid argument"); } const char *str; dbus_message_iter_get_basic(&iter, &str); dbus_message_iter_next(&iter); value = str; } static void append(DBusMessageIter &iter, const std::string &value) { const char *str = value.c_str(); if (!dbus_message_iter_append_basic(&iter, dbus, &str)) { throw std::runtime_error("out of memory"); } } typedef std::string host_type; typedef const std::string &arg_type; }; template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return "o"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } static const int dbus = DBUS_TYPE_OBJECT_PATH; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, DBusObject_t &value) { if (dbus_message_iter_get_arg_type(&iter) != dbus) { throw std::runtime_error("invalid argument"); } const char *str; dbus_message_iter_get_basic(&iter, &str); dbus_message_iter_next(&iter); value = str; } static void append(DBusMessageIter &iter, const DBusObject_t &value) { const char *str = value.c_str(); if (!dbus_message_iter_append_basic(&iter, dbus, &str)) { throw std::runtime_error("out of memory"); } } typedef DBusObject_t host_type; typedef const DBusObject_t &arg_type; }; /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, Caller_t &value) { const char *peer = dbus_message_get_sender(msg); if (!peer) { throw std::runtime_error("D-Bus method call without sender?!"); } value = peer; } typedef Caller_t host_type; typedef const Caller_t &arg_type; }; /** * a std::pair - maps to D-Bus struct */ template struct dbus_traits< std::pair > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType() + dbus_traits::getType(); } static std::string getType() { return "(" + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef std::pair host_type; typedef const std::pair &arg_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &pair) { if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRUCT) { throw std::runtime_error("invalid argument"); } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { dbus_traits::get(conn, msg, sub, pair.first); } if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { dbus_traits::get(conn, msg, sub, pair.second); } dbus_message_iter_next(&iter); } static void append(DBusMessageIter &iter, arg_type pair) { DBusMessageIter sub; if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_STRUCT, NULL, &sub)) { throw std::runtime_error("out of memory"); } dbus_traits::append(sub, pair.first); dbus_traits::append(sub, pair.second); if (!dbus_message_iter_close_container(&iter, &sub)) { throw std::runtime_error("out of memory"); } } }; /** * dedicated type for chunk of data, to distinguish this case from * a normal std::pair of two values */ template class DBusArray : public std::pair { public: DBusArray() : std::pair(0, NULL) {} DBusArray(size_t len, const V *data) : std::pair(len, data) {} }; template class DBusArray makeDBusArray(size_t len, const V *data) { return DBusArray(len, data); } /** * Pass array of basic type plus its number of entries. * Can only be used in cases where the caller owns the * memory and can discard it when the call returns, in * other words, for method calls, asynchronous replys and * signals, but not for return values. */ template struct dbus_traits< DBusArray > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType(); } static std::string getType() { return std::string("a") + dbus_traits::getType(); } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef DBusArray host_type; typedef const host_type &arg_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &array) { if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) { throw std::runtime_error("invalid argument"); } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); int type = dbus_message_iter_get_arg_type(&sub); // type is zero for empty arrays?! if (type && type != dbus_traits::dbus_type) { throw std::runtime_error("invalid argument"); } int nelements; typename dbus_traits::host_type *data; dbus_message_iter_get_fixed_array(&sub, &data, &nelements); array.first = nelements; array.second = data; dbus_message_iter_next(&iter); if (!type && nelements) { // non-empty array of invalid type?! throw std::runtime_error("could not decode DBusArray: type is zero, but array isn't empty"); } } static void append(DBusMessageIter &iter, arg_type array) { DBusMessageIter sub; if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, getContainedType().c_str(), &sub) || !dbus_message_iter_append_fixed_array(&sub, dbus_traits::dbus_type, &array.second, array.first) || !dbus_message_iter_close_container(&iter, &sub)) { throw std::runtime_error("out of memory"); } } }; /** * a std::map - treat it like a D-Bus dict */ template struct dbus_traits< std::map > : public dbus_traits_base { static std::string getContainedType() { return std::string("{") + dbus_traits::getType() + dbus_traits::getType() + "}"; } static std::string getType() { return std::string("a") + getContainedType(); } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef std::map host_type; typedef const host_type &arg_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &dict) { if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) { throw std::runtime_error("invalid argument"); } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); int type; while ((type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { if (type != DBUS_TYPE_DICT_ENTRY) { throw std::runtime_error("invalid argument"); } DBusMessageIter entry; dbus_message_iter_recurse(&sub, &entry); K key; V value; dbus_traits::get(conn, msg, entry, key); dbus_traits::get(conn, msg, entry, value); dict.insert(std::make_pair(key, value)); dbus_message_iter_next(&sub); } dbus_message_iter_next(&iter); } static void append(DBusMessageIter &iter, arg_type dict) { DBusMessageIter sub; if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, getContainedType().c_str(), &sub)) { throw std::runtime_error("out of memory"); } for(typename host_type::const_iterator it = dict.begin(); it != dict.end(); ++it) { DBusMessageIter entry; if (!dbus_message_iter_open_container(&sub, DBUS_TYPE_DICT_ENTRY, NULL, &entry)) { throw std::runtime_error("out of memory"); } dbus_traits::append(entry, it->first); dbus_traits::append(entry, it->second); if (!dbus_message_iter_close_container(&sub, &entry)) { throw std::runtime_error("out of memory"); } } if (!dbus_message_iter_close_container(&iter, &sub)) { throw std::runtime_error("out of memory"); } } }; /** * a std::vector - maps to D-Bus array, but with inefficient marshaling * because we cannot get a base pointer for the whole array */ template struct dbus_traits< std::vector > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType(); } static std::string getType() { return std::string("a") + getContainedType(); } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef std::vector host_type; typedef const std::vector &arg_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &array) { if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY) { throw std::runtime_error("invalid argument"); } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); while (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_INVALID) { V value; dbus_traits::get(conn, msg, sub, value); array.push_back(value); } dbus_message_iter_next(&iter); } static void append(DBusMessageIter &iter, arg_type array) { DBusMessageIter sub; if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, getContainedType().c_str(), &sub)) { throw std::runtime_error("out of memory"); } for(typename host_type::const_iterator it = array.begin(); it != array.end(); ++it) { dbus_traits::append(sub, *it); } if (!dbus_message_iter_close_container(&iter, &sub)) { throw std::runtime_error("out of memory"); } } }; /** simple smart pointer which takes memory allocated by libdbus and frees it with dbus_free() */ template class DBusMem : private boost::noncopyable { T *m_pointer; public: DBusMem(T *pointer) : m_pointer(pointer) {} ~DBusMem() { if (m_pointer) dbus_free(m_pointer); } operator T * () { return m_pointer; } T * get() { return m_pointer; } operator bool () { return m_pointer != 0; } }; /** * Helper class to append variant values into an iterator */ class append_visitor_dummy_type {}; struct append_visitor : public boost::static_visitor<> { DBusMessageIter &iter; append_visitor(DBusMessageIter &i) : iter(i) {} template void operator()(const V &v) const { DBusMessageIter sub; if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, dbus_traits::getType().c_str(), &sub)) { throw std::runtime_error("out of memory"); } dbus_traits::append(sub, v); if (!dbus_message_iter_close_container(&iter, &sub)) { throw std::runtime_error("out of memory"); } } }; /** * A boost::variant maps to a dbus variant, only care about values of * type V but will not throw error if type is not matched, this is useful if * application is interested on only a sub set of possible value types * in variant. */ template struct dbus_traits > : public dbus_traits_base { static std::string getType() { return "v"; } static std::string getSignature() { return getType(); } static std::string getReply() { return ""; } static const int dbus = DBUS_TYPE_VARIANT; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, boost::variant &value) { if (dbus_message_iter_get_arg_type(&iter) != dbus) { throw std::runtime_error("invalid argument"); return; } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); DBusMem sig(dbus_message_iter_get_signature(&sub)); if (dbus_traits::getSignature() != sig.get()) { //ignore unrecognized sub type in variant return; } V val; dbus_traits::get (conn, msg, sub, val); value = val; } static void append(DBusMessageIter &iter, const boost::variant &value) { boost::apply_visitor(append_visitor(iter), value); } typedef boost::variant host_type; typedef const boost::variant &arg_type; }; /** * A boost::variant maps to a dbus variant, only care about values of * type V1, V2 but will not throw error if type is not matched, this is useful if * application is interested on only a sub set of possible value types * in variant. */ template struct dbus_traits > : public dbus_traits_base { static std::string getType() { return "v"; } static std::string getSignature() { return getType(); } static std::string getReply() { return ""; } static const int dbus = DBUS_TYPE_VARIANT; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, boost::variant &value) { if (dbus_message_iter_get_arg_type(&iter) != dbus) { throw std::runtime_error("invalid argument"); return; } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); DBusMem sig(dbus_message_iter_get_signature(&sub)); if (dbus_traits::getSignature() == sig.get()) { V1 val; dbus_traits::get (conn, msg, sub, val); value = val; } else if (dbus_traits::getSignature() == sig.get()) { V2 val; dbus_traits::get (conn, msg, sub, val); value = val; } else { //ignore unrecognized sub type in variant } } static void append(DBusMessageIter &iter, const boost::variant &value) { boost::apply_visitor(append_visitor(iter), value); } typedef boost::variant host_type; typedef const boost::variant &arg_type; }; /** * a single member m of type V in a struct K */ template struct dbus_member_single { static std::string getType() { return dbus_traits::getType(); } typedef V host_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, K &val) { dbus_traits::get(conn, msg, iter, val.*m); } static void append(DBusMessageIter &iter, const K &val) { dbus_traits::append(iter, val.*m); } }; /** * a member m of type V in a struct K, followed by another dbus_member * or dbus_member_single to end the chain */ template struct dbus_member { static std::string getType() { return dbus_traits::getType() + M::getType(); } typedef V host_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, K &val) { dbus_traits::get(conn, msg, iter, val.*m); M::get(conn, msg, iter, val); } static void append(DBusMessageIter &iter, const K &val) { dbus_traits::append(iter, val.*m); M::append(iter, val); } }; /** * The base class of type V of a struct K, followed by another dbus_member * or dbus_member_single to end the chain */ template struct dbus_base { static std::string getType() { return dbus_traits::getType() + M::getType(); } typedef V host_type; static void get(ExtractArgs &context, GVariantIter &iter, K &val) { dbus_traits::get(context, iter, val); M::get(context, iter, val); } static void append(GVariantBuilder &builder, const K &val) { dbus_traits::append(builder, val); M::append(builder, val); } }; /** * a helper class which implements dbus_traits for * a class, use with: * struct foo { int a; std::string b; }; * template<> struct dbus_traits< foo > : dbus_struct_traits< foo, * dbus_member > > {}; */ template struct dbus_struct_traits : public dbus_traits_base { static std::string getContainedType() { return M::getType(); } static std::string getType() { return std::string("(") + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef K host_type; typedef const K &arg_type; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &val) { if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRUCT) { throw std::runtime_error("invalid argument"); } DBusMessageIter sub; dbus_message_iter_recurse(&iter, &sub); M::get(conn, msg, sub, val); dbus_message_iter_next(&iter); } static void append(DBusMessageIter &iter, arg_type val) { DBusMessageIter sub; if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_STRUCT, NULL, &sub)) { throw std::runtime_error("out of memory"); } M::append(sub, val); if (!dbus_message_iter_close_container(&iter, &sub)) { throw std::runtime_error("out of memory"); } } }; /** * a helper class which implements dbus_traits for an enum, * parameterize it with the enum type and an integer type * large enough to hold all valid enum values */ template struct dbus_enum_traits : public dbus_traits { typedef E host_type; typedef E arg_type; // cast from enum to int in append() is implicit; in // get() we have to make it explicit static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &val) { I ival; dbus_traits::get(conn, msg, iter, ival); val = static_cast(ival); } }; /** * special case const reference parameter: * treat like pass-by-value input argument * * Example: const std::string &arg */ template struct dbus_traits : public dbus_traits {}; /** * special case writeable reference parameter: * must be a return value * * Example: std::string &retval */ template struct dbus_traits : public dbus_traits { static std::string getSignature() { return ""; } static std::string getReply() { return dbus_traits::getType(); } }; /** * dbus-cxx base exception thrown in dbus server * org.syncevolution.gdbuscxx.Exception * This base class only contains interfaces, no data members */ class DBusCXXException { public: /** * get exception name, used to convert to dbus error name * subclasses should override it */ virtual std::string getName() const { return "org.syncevolution.gdbuscxx.Exception"; } /** * get error message */ virtual const char* getMessage() const { return "unknown"; } }; static DBusMessage *handleException(DBusMessage *msg) { try { #ifdef DBUS_CXX_EXCEPTION_HANDLER return DBUS_CXX_EXCEPTION_HANDLER(msg); #else throw; #endif } catch (const dbus_error &ex) { return b_dbus_create_error(msg, ex.dbusName().c_str(), "%s", ex.what()); } catch (const DBusCXXException &ex) { return b_dbus_create_error(msg, ex.getName().c_str(), "%s", ex.getMessage()); } catch (const std::runtime_error &ex) { return b_dbus_create_error(msg, "org.syncevolution.gdbuscxx.Exception", "%s", ex.what()); } catch (...) { return b_dbus_create_error(msg, "org.syncevolution.gdbuscxx.Exception", "unknown"); } } /** * Check presence of a certain D-Bus client. */ class Watch : private boost::noncopyable { DBusConnectionPtr m_conn; boost::function m_callback; bool m_called; guint m_watchID; static void disconnect(DBusConnection *connection, void *user_data) { Watch *watch = static_cast(user_data); if (!watch->m_called) { watch->m_called = true; if (watch->m_callback) { watch->m_callback(); } } } public: Watch(const DBusConnectionPtr &conn, const boost::function &callback = boost::function()) : m_conn(conn), m_callback(callback), m_called(false), m_watchID(0) { } void setCallback(const boost::function &callback) { m_callback = callback; if (m_called && m_callback) { m_callback(); } } void activate(const char *peer) { if (!peer) { throw std::runtime_error("Watch::activate(): no peer"); } // Install watch first ... m_watchID = b_dbus_add_disconnect_watch(m_conn.get(), peer, disconnect, this, NULL); if (!m_watchID) { throw std::runtime_error("b_dbus_add_disconnect_watch() failed"); } // ... then check that the peer really exists, // otherwise we'll never notice the disconnect. // If it disconnects while we are doing this, // then disconnect() will be called twice, // but it handles that. DBusErrorCXX error; if (!dbus_bus_name_has_owner(m_conn.get(), peer, &error)) { if (error) { error.throwFailure("dbus_bus_name_has_owner()"); } disconnect(m_conn.get(), this); } } ~Watch() { if (m_watchID) { if (!b_dbus_remove_watch(m_conn.get(), m_watchID)) { // this may happen because the watch is // removed automatically when it was triggered } m_watchID = 0; } } }; /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits< boost::shared_ptr > : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, boost::shared_ptr &value) { boost::shared_ptr watch(new Watch(conn)); watch->activate(dbus_message_get_sender(msg)); value = watch; } static void append(DBusMessageIter &iter, const boost::shared_ptr &value) {} typedef boost::shared_ptr host_type; typedef const boost::shared_ptr &arg_type; }; /** * base class for D-Bus results, * keeps references to required objects and provides the * failed() method */ class DBusResult : virtual public Result { protected: DBusConnectionPtr m_conn; /**< connection via which the message was received */ DBusMessagePtr m_msg; /**< the method invocation message */ public: DBusResult(DBusConnection *conn, DBusMessage *msg) : m_conn(conn, true), m_msg(msg, true) {} virtual void failed(const dbus_error &error) { if (!b_dbus_send_error(m_conn.get(), m_msg.get(), error.dbusName().c_str(), "%s", error.what())) { throw std::runtime_error("b_dbus_send_error() failed"); } } virtual Watch *createWatch(const boost::function &callback) { std::auto_ptr watch(new Watch(m_conn, callback)); watch->activate(dbus_message_get_sender(m_msg.get())); return watch.release(); } }; class DBusResult0 : public Result0, public DBusResult { public: DBusResult0(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done() { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return ""; } }; template class DBusResult1 : public Result1, public DBusResult { public: DBusResult1(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous; }; template class DBusResult2 : public Result2, public DBusResult { public: DBusResult2(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult1::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult1::asynchronous; }; template class DBusResult3 : public Result3, public DBusResult { public: DBusResult3(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult2::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult2::asynchronous; }; template class DBusResult4 : public Result4, public DBusResult { public: DBusResult4(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult3::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult3::asynchronous; }; template class DBusResult5 : public Result5, public DBusResult { public: DBusResult5(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult4::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult4::asynchronous; }; template class DBusResult6 : public Result6, public DBusResult { public: DBusResult6(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult5::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult5::asynchronous; }; template class DBusResult7 : public Result7, public DBusResult { public: DBusResult7(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult6::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult6::asynchronous; }; template class DBusResult8 : public Result8, public DBusResult { public: DBusResult8(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult7::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult7::asynchronous; }; template class DBusResult9 : public Result9, public DBusResult { public: DBusResult9(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult8::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult8::asynchronous; }; template class DBusResult10 : public Result10, public DBusResult { public: DBusResult10(DBusConnection *conn, DBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) { DBusMessagePtr reply(b_dbus_create_reply(m_msg.get(), DBUS_TYPE_INVALID)); if (!reply) { throw std::runtime_error("no DBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9 << a10; if (!dbus_connection_send(m_conn.get(), reply.get(), NULL)) { throw std::runtime_error("dbus_connection_send failed"); } } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult9::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult9::asynchronous; }; /** * A parameter which points towards one of our Result* structures. * All of the types contained in it count towards the Reply signature. * The requested Result type itself is constructed here. * * @param R Result0, Result1, ... * @param DBusR the class implementing R */ template struct dbus_traits_result { static std::string getType() { return DBusR::getSignature(); } static std::string getSignature() { return ""; } static std::string getReply() { return getType(); } typedef boost::shared_ptr host_type; typedef boost::shared_ptr &arg_type; static const bool asynchronous = true; static void get(DBusConnection *conn, DBusMessage *msg, DBusMessageIter &iter, host_type &value) { value.reset(new DBusR(conn, msg)); } }; template <> struct dbus_traits< boost::shared_ptr > : public dbus_traits_result {}; template struct dbus_traits< boost::shared_ptr< Result1 > >: public dbus_traits_result< Result1, DBusResult1 > {}; template struct dbus_traits< boost::shared_ptr< Result2 > >: public dbus_traits_result< Result2, DBusResult2 > {}; template struct dbus_traits< boost::shared_ptr< Result3 > >: public dbus_traits_result< Result3, DBusResult3 > {}; template struct dbus_traits< boost::shared_ptr< Result4 > >: public dbus_traits_result< Result4, DBusResult4 > {}; template struct dbus_traits< boost::shared_ptr< Result5 > >: public dbus_traits_result< Result5, DBusResult5 > {}; template struct dbus_traits< boost::shared_ptr< Result6 > >: public dbus_traits_result< Result6, DBusResult6 > {}; template struct dbus_traits< boost::shared_ptr< Result7 > >: public dbus_traits_result< Result7, DBusResult7 > {}; template struct dbus_traits< boost::shared_ptr< Result8 > >: public dbus_traits_result< Result8, DBusResult8 > {}; template struct dbus_traits< boost::shared_ptr< Result9 > >: public dbus_traits_result< Result9, DBusResult9 > {}; template struct dbus_traits< boost::shared_ptr< Result10 > >: public dbus_traits_result< Result10, DBusResult10 > {}; #if 0 /** * Call with two parameters and one return code. All other calls are * variations of this, so this one is fully documented to explain all * tricks used in these templates. The actual code without comments is * below. */ template struct MakeMethodEntry< boost::function > { typedef boost::function M; // Any type a Result parameter? This can be computed at compile time. static const bool asynchronous = dbus_traits< DBusResult2 >::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { // all exceptions must be caught and translated into // a suitable D-Bus reply try { // Argument types might may be references or pointers. // To instantiate a variable we need the underlying // datatype, which is provided by the dbus_traits. // "typename" is necessary to tell the compiler // that host_type really is a type. typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; // Extract all parameters. Because we don't now // whether a parameter is an argument or a return // value, we call get() for each of them and let // the corresponding dbus_traits decide that. Traits // for types which are plain types or const references // have a non-empty get(), whereas references are treated // as return values and have an empty get(). DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); dbus_traits::get(conn, msg, iter, a2); // The data pointer is a pointer to a boost function, // as set up for us by make(). The compiler knows the // exact method prototype and thus can handle // call-by-value and call-by-reference correctly. r = (*static_cast(data))(a1, a2); // No reply necessary? If any of the types is asking for // a Result handle, then the reply will be sent later. if (asynchronous) { return NULL; } // Now prepare the reply. As with extracting parameters, // append() is empty for those parameters where nothing // has to be done. DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; dbus_message_iter_init_append(reply, &iter); // We know that the return value has to be appended, // even though the trait would not normally do that // because it is a plain type => call utility function // directly. dbus_traits::append(iter, r); dbus_traits::append(iter, a1); dbus_traits::append(iter, a2); return reply; } catch (...) { // let handleException rethrow the exception // to determine its type return handleException(msg); } } /** * The boost function doesn't have a virtual destructor. * Therefore we have to cast down to the right type M * before deleting it. The rest of the allocated data * is freed by BDBusVector. */ static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } /** * Creates a BDBusMethodTable entry. * The strings inside the entry are allocated * with strdup(), to be freed by BDBusVector::destroy(). */ BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); // same trick as before: only argument types // are added to the signature std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); // now the same for reply types buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); // these are the function templates above entry.function = methodFunction; entry.destroy = destroyFunction; // make sure that methodFunction has access to the boost function entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; #endif // 0 /** ===> 10 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); typedef boost::function M; template static M bind(Mptr C::*method, I instance) { // this fails because bind() only supports up to 9 parameters, including // the initial this pointer return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8, _9 /* _10 */); } static const bool asynchronous = dbus_traits< DBusResult10 >::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; typename dbus_traits::host_type a9; typename dbus_traits::host_type a10; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8) >> Get(a9) >> Get(a10); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8) << Set(a9) << Set(a10); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 9 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8, A9); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { // this fails because bind() only supports up to 9 parameters, including // the initial this pointer return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8, _9); } static const bool asynchronous = DBusResult9::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; typename dbus_traits::host_type a9; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8) >> Get(a9); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8) << Set(a9); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 9 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8, A9); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8, _9); } static const bool asynchronous = DBusResult9::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; typename dbus_traits::host_type a9; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8) >> Get(a9); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8) << Set(a9); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 8 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8); } static const bool asynchronous = DBusResult8::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 8 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8); } static const bool asynchronous = DBusResult8::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 7 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6, A7); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7); } static const bool asynchronous = DBusResult7::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 7 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7); } static const bool asynchronous = DBusResult7::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 6 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6); } static const bool asynchronous = DBusResult6::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 6 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6); } static const bool asynchronous = DBusResult6::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6); (*static_cast(data))(a1, a2, a3, a4, a5, a6); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 5 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5); } static const bool asynchronous = DBusResult5::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5); r = (*static_cast(data))(a1, a2, a3, a4, a5); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 5 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5); } static const bool asynchronous = DBusResult5::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5); (*static_cast(data))(a1, a2, a3, a4, a5); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 4 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4); } static const bool asynchronous = DBusResult4::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4); r = (*static_cast(data))(a1, a2, a3, a4); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 4 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4); } static const bool asynchronous = DBusResult4::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4); (*static_cast(data))(a1, a2, a3, a4); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 3 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3); } static const bool asynchronous = DBusResult3::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3); r = (*static_cast(data))(a1, a2, a3); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 3 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3); } static const bool asynchronous = DBusResult3::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3); (*static_cast(data))(a1, a2, a3); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 2 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2); } static const bool asynchronous = DBusResult2::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2); r = (*static_cast(data))(a1, a2); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1) << Set(a2); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 2 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2); } static const bool asynchronous = DBusResult2::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; ExtractArgs(conn, msg) >> Get(a1) >> Get(a2); (*static_cast(data))(a1, a2); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1) << Set(a2); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 1 argument, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1); } static const bool asynchronous = DBusResult1::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; typename dbus_traits::host_type a1; ExtractArgs(conn, msg) >> Get(a1); r = (*static_cast(data))(a1); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r << Set(a1); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** ===> 1 parameter */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1); } static const bool asynchronous = DBusResult1::asynchronous; static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type a1; ExtractArgs(conn, msg) >> Get(a1); (*static_cast(data))(a1); if (asynchronous) { return NULL; } DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) << Set(a1); return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; buffer += dbus_traits::getSignature(); entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getReply(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA | (asynchronous ? G_DBUS_METHOD_FLAG_ASYNC : 0)); entry.method_data = new M(m); return entry; } }; /** 0 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance); } static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { typename dbus_traits::host_type r; r = (*static_cast(data))(); DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; AppendArgs(reply) + r; return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; entry.signature = strdup(buffer.c_str()); buffer.clear(); buffer += dbus_traits::getType(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA); entry.method_data = new M(m); return entry; } }; /** ===> 0 parameter */ template <> struct MakeMethodEntry< boost::function > { typedef void (Mptr)(); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance); } static DBusMessage *methodFunction(DBusConnection *conn, DBusMessage *msg, void *data) { try { (*static_cast(data))(); DBusMessage *reply = dbus_message_new_method_return(msg); if (!reply) return NULL; return reply; } catch (...) { return handleException(msg); } } static void destroyFunction(void *user_data) { BDBusMethodTable *entry = static_cast(user_data); delete static_cast(entry->method_data); } static BDBusMethodTable make(const char *name, BDBusMethodFlags flags, const M &m) { BDBusMethodTable entry; entry.name = strdup(name); std::string buffer; entry.signature = strdup(buffer.c_str()); buffer.clear(); entry.reply = strdup(buffer.c_str()); entry.function = methodFunction; entry.destroy = destroyFunction; entry.flags = BDBusMethodFlags(flags | G_DBUS_METHOD_FLAG_METHOD_DATA); entry.method_data = new M(m); return entry; } }; template struct TraitsBase { typedef Cb Callback_t; typedef Ret Return_t; struct CallbackData { //only keep connection, for DBusClientCall instance is absent when 'dbus client call' returns //suppose connection is available in the callback handler const DBusConnectionPtr m_conn; Callback_t m_callback; CallbackData(const DBusConnectionPtr &conn, const Callback_t &callback) : m_conn(conn), m_callback(callback) {} }; }; struct VoidReturn {}; struct VoidTraits : public TraitsBase, VoidReturn> { typedef TraitsBase, VoidReturn> base; typedef base::Callback_t Callback_t; typedef base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &/*reply*/, const DBusConnectionPtr &/*conn*/) { return Return_t(); } static void handleMessage(DBusMessagePtr &/*reply*/, base::CallbackData *data, const std::string &error) { //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(error); } } }; template struct Ret1Traits : public TraitsBase, R1> { typedef TraitsBase, R1> base; typedef typename base::Callback_t Callback_t; typedef typename base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &reply, const DBusConnectionPtr &conn) { typename dbus_traits::host_type r; ExtractArgs(conn.get(), reply.get()) >> Get(r); return r; } static void handleMessage(DBusMessagePtr &reply, typename base::CallbackData *data, const std::string &error) { typename dbus_traits::host_type r; if (error.empty()) { ExtractArgs(data->m_conn.get(), reply.get()) >> Get(r); } //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(r, error); } } }; template struct Ret2Traits : public TraitsBase, std::pair > { typedef TraitsBase, std::pair > base; typedef typename base::Callback_t Callback_t; typedef typename base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &reply, const DBusConnectionPtr &conn) { Return_t r; ExtractArgs(conn.get(), reply.get()) >> Get(r.first) >> Get(r.second); return r; } static void handleMessage(DBusMessagePtr &reply, typename base::CallbackData *data, const std::string &error) { typename dbus_traits::host_type r1; typename dbus_traits::host_type r2; if (error.empty()) { ExtractArgs(data->m_conn.get(), reply.get()) >> Get(r1) >> Get(r2); } //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(r1, r2, error); } } }; template struct Ret3Traits : public TraitsBase, boost::tuple > { typedef TraitsBase, boost::tuple > base; typedef typename base::Callback_t Callback_t; typedef typename base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &reply, const DBusConnectionPtr &conn) { Return_t r; ExtractArgs(conn.get(), reply.get()) >> Get(boost::get<0>(r)) >> Get(boost::get<1>(r)) >> Get(boost::get<2>(r)); return r; } static void handleMessage(DBusMessagePtr &reply, typename base::CallbackData *data, const std::string &error) { typename dbus_traits::host_type r1; typename dbus_traits::host_type r2; typename dbus_traits::host_type r3; if (error.empty()) { ExtractArgs(data->m_conn.get(), reply.get()) >> Get(r1) >> Get(r2) >> Get(r3); } //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(r1, r2, r3, error); } } }; /** fill buffer with error name and description (if available), return true if error found */ bool CheckError(const DBusMessagePtr &reply, std::string &buffer); template class DBusClientCall { public: typedef typename CallTraits::Callback_t Callback_t; typedef typename CallTraits::Return_t Return_t; typedef typename CallTraits::base::CallbackData CallbackData; protected: const std::string m_destination; const std::string m_path; const std::string m_interface; const std::string m_method; const DBusConnectionPtr m_conn; static void dbusCallback (DBusPendingCall *call, void *user_data) { CallbackData *data = static_cast(user_data); DBusMessagePtr reply = dbus_pending_call_steal_reply (call); std::string error; CheckError(reply, error); CallTraits::handleMessage(reply, data, error); } /** * called by libdbus to free the user_data pointer set in * dbus_pending_call_set_notify() */ static void callDataUnref(void *user_data) { delete static_cast(user_data); } void prepare(DBusMessagePtr &msg) { // Constructor steals reference, reset() doesn't! // Therefore use constructor+copy instead of reset(). msg = DBusMessagePtr(dbus_message_new_method_call(m_destination.c_str(), m_path.c_str(), m_interface.c_str(), m_method.c_str())); if (!msg) { throw std::runtime_error("dbus_message_new_method_call() failed"); } } void send(DBusMessagePtr &msg, const Callback_t &callback) { DBusPendingCall *call; if (!dbus_connection_send_with_reply(m_conn.get(), msg.get(), &call, DBUS_TIMEOUT_INFINITE)) { throw std::runtime_error("dbus_connection_send failed"); } else if (call == NULL) { throw std::runtime_error("received pending call is NULL"); } DBusPendingCallPtr mCall (call); CallbackData *data = new CallbackData(m_conn, callback); dbus_pending_call_set_notify(mCall.get(), dbusCallback, data, callDataUnref); } Return_t sendAndReturn(DBusMessagePtr &msg) { DBusErrorCXX error; // Constructor steals reference, reset() doesn't! // Therefore use constructor+copy instead of reset(). DBusMessagePtr reply = DBusMessagePtr(dbus_connection_send_with_reply_and_block(m_conn.get(), msg.get(), DBUS_TIMEOUT_INFINITE, &error)); if (!reply) { error.throwFailure(m_method); } return CallTraits::demarshal(reply, m_conn); } public: DBusClientCall(const DBusRemoteObject &object, const std::string &method) :m_destination (object.getDestination()), m_path (object.getPath()), m_interface (object.getInterface()), m_method (method), m_conn (object.getConnection()) { } DBusConnection *getConnection() { return m_conn.get(); } std::string getMethod() const { return m_method; } Return_t operator () () { DBusMessagePtr msg; prepare(msg); return sendAndReturn(msg); } void start(const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); send(msg, callback); } template Return_t operator () (const A1 &a1) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1; return sendAndReturn(msg); } template void start(const A1 &a1, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1; send(msg, callback); } template Return_t operator () (const A1 &a1, const A2 &a2) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2; return sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2; send(msg, callback); } template void operator ()(const A1 &a1, const A2 &a2, const A3 &a3) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const A10 &a10) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9 << a10; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const A10 &a10, const Callback_t &callback) { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9 << a10; send(msg, callback); } }; /* * A DBus Client Call object handling zero or more parameter and * zero return value. */ class DBusClientCall0 : public DBusClientCall { public: DBusClientCall0 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall(object, method) { } }; /** 1 return value and 0 or more parameters */ template class DBusClientCall1 : public DBusClientCall > { public: DBusClientCall1 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall >(object, method) { } }; /** 2 return value and 0 or more parameters */ template class DBusClientCall2 : public DBusClientCall > { public: DBusClientCall2 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall >(object, method) { } }; /** 3 return value and 0 or more parameters */ template class DBusClientCall3 : public DBusClientCall > { public: DBusClientCall3 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall >(object, method) { } }; /** * Common functionality of all SignalWatch* classes. * @param T boost::function with the right signature */ template class SignalWatch { public: SignalWatch(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : m_object(object), m_signal(signal), m_tag(0), m_is_bus_conn(is_bus_conn) { } ~SignalWatch() { if (m_tag) { DBusConnection *connection = m_object.getConnection(); if (connection) { b_dbus_remove_watch(connection, m_tag); } } } typedef T Callback_t; const Callback_t &getCallback() const{ return m_callback; } protected: const DBusRemoteObject &m_object; std::string m_signal; guint m_tag; T m_callback; bool m_is_bus_conn; std::string makeSignalRule() { std::string rule; rule = "type='signal',path='"; rule += m_object.getPath(); rule += "',interface='"; rule += m_object.getInterface(); rule += "',member='"; rule += m_signal; rule += "'"; return rule; } static gboolean isMatched(DBusMessage *msg, void *data) { SignalWatch *watch = static_cast(data); return dbus_message_has_path(msg, watch->m_object.getPath()) && dbus_message_is_signal(msg, watch->m_object.getInterface(), watch->m_signal.c_str()); } void activateInternal(const Callback_t &callback, gboolean (*cb)(DBusConnection *, DBusMessage *, void *)) { m_callback = callback; std::string rule = makeSignalRule(); m_tag = b_dbus_add_signal_watch(m_object.getConnection(), rule.c_str(), cb, this, NULL, m_is_bus_conn); if (!m_tag) { throw std::runtime_error(std::string("activating signal failed: ") + "path " + m_object.getPath() + " interface " + m_object.getInterface() + " member " + m_signal); } } }; class SignalWatch0 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch0(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if(isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb = static_cast< SignalWatch *>(data)->getCallback(); cb(); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch1 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch1(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if (SignalWatch::isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb =static_cast< SignalWatch *>(data)->getCallback(); typename dbus_traits::host_type a1; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); cb(a1); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch2 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch2(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if (SignalWatch::isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb = static_cast< SignalWatch *>(data)->getCallback(); typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); dbus_traits::get(conn, msg, iter, a2); cb(a1, a2); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch3 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch3(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if (SignalWatch::isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb =static_cast< SignalWatch *>(data)->getCallback(); typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); dbus_traits::get(conn, msg, iter, a2); dbus_traits::get(conn, msg, iter, a3); cb(a1, a2, a3); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch4 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch4(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if (SignalWatch::isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb = static_cast< SignalWatch *>(data)->getCallback(); typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); dbus_traits::get(conn, msg, iter, a2); dbus_traits::get(conn, msg, iter, a3); dbus_traits::get(conn, msg, iter, a4); cb(a1, a2, a3, a4); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch5 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch5(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if (SignalWatch::isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb = static_cast< SignalWatch *>(data)->getCallback(); typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); dbus_traits::get(conn, msg, iter, a2); dbus_traits::get(conn, msg, iter, a3); dbus_traits::get(conn, msg, iter, a4); dbus_traits::get(conn, msg, iter, a5); cb(a1, a2, a3, a4, a5); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch6 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch6(const DBusRemoteObject &object, const std::string &signal, bool is_bus_conn = true) : SignalWatch(object, signal, is_bus_conn) { } static gboolean internalCallback(DBusConnection *conn, DBusMessage *msg, void *data) { if (SignalWatch::isMatched(msg, data) == FALSE) { return TRUE; } const Callback_t &cb = static_cast< SignalWatch *>(data)->getCallback(); typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; DBusMessageIter iter; dbus_message_iter_init(msg, &iter); dbus_traits::get(conn, msg, iter, a1); dbus_traits::get(conn, msg, iter, a2); dbus_traits::get(conn, msg, iter, a3); dbus_traits::get(conn, msg, iter, a4); dbus_traits::get(conn, msg, iter, a5); dbus_traits::get(conn, msg, iter, a6); cb(a1, a2, a3, a4, a5, a6); return TRUE; } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; } // namespace GDBusCXX #endif // INCL_BDBUS_CXX_BRIDGE syncevolution-1.5/src/gdbus/gdbus-cxx-bridge.cpp0000644000373300001540000001226712326412403023260 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "gdbus-cxx-bridge.h" #include #include void intrusive_ptr_add_ref(DBusConnection *con) { dbus_connection_ref(con); } void intrusive_ptr_release(DBusConnection *con) { dbus_connection_unref(con); } void intrusive_ptr_add_ref(DBusMessage *msg) { dbus_message_ref(msg); } void intrusive_ptr_release(DBusMessage *msg) { dbus_message_unref(msg); } void intrusive_ptr_add_ref(DBusPendingCall *call) { dbus_pending_call_ref (call); } void intrusive_ptr_release(DBusPendingCall *call) { dbus_pending_call_unref (call); } namespace GDBusCXX { DBusConnectionPtr dbus_get_bus_connection(const char *busType, const char *name, bool unshared, DBusErrorCXX *err) { return DBusConnectionPtr(b_dbus_setup_bus(boost::iequals(busType, "SYSTEM") ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, name, unshared, err), false); } static void ConnectionLost(DBusConnection *connection, void *user_data) { DBusConnectionPtr::Disconnect_t *cb = static_cast(user_data); (*cb)(); } static void DestroyDisconnect(void *user_data) { DBusConnectionPtr::Disconnect_t *cb = static_cast(user_data); delete cb; } void DBusConnectionPtr::setDisconnect(const Disconnect_t &func) { b_dbus_set_disconnect_function(get(), ConnectionLost, new Disconnect_t(func), DestroyDisconnect); } DBusConnectionPtr dbus_get_bus_connection(const std::string &address, DBusErrorCXX *err) { DBusConnectionPtr conn(dbus_connection_open_private(address.c_str(), err), false); if (conn) { b_dbus_setup_connection(conn.get(), TRUE, NULL); dbus_connection_set_exit_on_disconnect(conn.get(), FALSE); } return conn; } void dbus_bus_connection_undelay(const DBusConnectionPtr &/*ptr*/) { // no op } boost::shared_ptr DBusServerCXX::listen(const NewConnection_t &newConnection, DBusErrorCXX *err) { DBusServer *server = NULL; char address[80]; address[0] = 0; for (int counter = 1; counter < 100 && !server; counter++) { if (*err) { g_debug("dbus_server_listen(%s) failed, trying next candidate: %s", address, err->message); dbus_error_init(err); } sprintf(address, "unix:abstract=gdbuscxx-%d", counter); server = dbus_server_listen(address, err); } if (!server) { return boost::shared_ptr(); } b_dbus_setup_server(server); boost::shared_ptr res(new DBusServerCXX(server, address)); res->m_newConnection = newConnection; dbus_server_set_new_connection_function(server, DBusServerCXX::newConnection, res.get(), NULL); return res; } void DBusServerCXX::newConnection(DBusServer *server, DBusConnection *newConn, void *data) throw() { DBusServerCXX *me = static_cast(data); if (me->m_newConnection) { try { b_dbus_setup_connection(newConn, FALSE, NULL); dbus_connection_set_exit_on_disconnect(newConn, FALSE); DBusConnectionPtr conn(newConn); me->m_newConnection(*me, conn); } catch (...) { g_error("handling new D-Bus connection failed with C++ exception"); } } } DBusServerCXX::DBusServerCXX(DBusServer *server, const std::string &address) : m_server(server), m_address(address) { } DBusServerCXX::~DBusServerCXX() { if (m_server) { dbus_server_disconnect(m_server.get()); } } bool CheckError(const DBusMessagePtr &reply, std::string &buffer) { const char* errname = dbus_message_get_error_name (reply.get()); if (errname) { buffer = errname; DBusMessageIter iter; if (dbus_message_iter_init(reply.get(), &iter)) { if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) { buffer += ": "; const char *str; dbus_message_iter_get_basic(&iter, &str); buffer += str; } } return true; } else { return false; } } } syncevolution-1.5/src/gdbus/gdbus-cxx.h0000644000373300001540000001170012326412403021462 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_BDBUS_CXX #define INCL_BDBUS_CXX #include #include #include #include namespace GDBusCXX { /** * An exception class which can be thrown to create * specific D-Bus exception on the bus. */ class dbus_error : public std::runtime_error { public: /** * @param dbus_name the D-Bus error name, like "org.example.error.Invalid" * @param what a more detailed description */ dbus_error(const std::string &dbus_name, const std::string &what) : std::runtime_error(what), m_dbus_name(dbus_name) {} ~dbus_error() throw() {} const std::string &dbusName() const { return m_dbus_name; } private: std::string m_dbus_name; }; class Watch; /** * Special parameter type that identifies a caller. A string in practice. */ class Caller_t : public std::string { public: Caller_t() {} template Caller_t(T val) : std::string(val) {} template Caller_t &operator = (T val) { assign(val); return *this; } }; /** * Call object which needs to be called with the results * of an asynchronous method call. So instead of * "int foo()" one would implement * "void foo(Result1 > *r)" * and after foo has returned, call r->done(res). Use const * references as type for complex results. * * A Result instance can be copied, but only called once. */ class Result { public: virtual ~Result() {} /** report failure to caller */ virtual void failed(const dbus_error &error) = 0; /** * Calls the given callback once when the peer that the result * would be delivered to disconnects. The callback will also be * called if the peer is already gone by the time that the watch * is requested. * * Alternatively a method can ask to get called with a life Watch * by specifying "const boost::shared_ptr &" as parameter * and then calling its setCallback(). */ virtual Watch *createWatch(const boost::function &callback) = 0; }; class Result0 : virtual public Result { public: /** tell caller that we are done */ virtual void done() = 0; }; template class Result1 : virtual public Result { public: /** return result to caller */ virtual void done(A1 a1) = 0; }; template struct Result2 : virtual public Result { virtual void done(A1 a1, A2 a2) = 0; }; template struct Result3 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3) = 0; }; template struct Result4 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4) = 0; }; template struct Result5 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) = 0; }; template struct Result6 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) = 0; }; template struct Result7 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) = 0; }; template struct Result8 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) = 0; }; template struct Result9 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) = 0; }; template struct Result10 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) = 0; }; } // namespace GDBusCXX #endif // INCL_BDBUS_CXX syncevolution-1.5/src/gdbusxx/0000755000373300037200000000000012424707642020157 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/gdbusxx/gdbusxx.am0000644000373300001540000000131712326412403021773 0ustar00nightlynightly00000000000000if ENABLE_MODULES lib_LTLIBRARIES += src/gdbusxx/libgdbussyncevo.la src_gdbusxx_version_info = -version-info 0:0:0 else noinst_LTLIBRARIES += src/gdbusxx/libgdbussyncevo.la endif src_gdbusxx_libgdbussyncevo_la_SOURCES = \ src/gdbusxx/gdbus-cxx-bridge.h \ src/gdbusxx/gdbus-cxx-bridge.cpp \ src/gdbusxx/gdbus-cxx.h src_gdbusxx_libgdbussyncevo_la_LDFLAGS = $(src_gdbus_version_info) src_gdbusxx_libgdbussyncevo_la_LIBADD = $(GLIB_LIBS) $(DBUS_LIBS) src_gdbusxx_libgdbussyncevo_la_CXXFLAGS = $(GLIB_CFLAGS) $(DBUS_CFLAGS) $(SYNCEVO_WFLAGS) src_gdbusxx_libgdbussyncevo_la_CPPFLAGS = $(BOOST_CPPFLAGS) -I$(top_srcdir)/src/ # allow access to libsyncevolution utility code MAINTAINERCLEANFILES += Makefile.in syncevolution-1.5/src/gdbusxx/gdbus-cxx-bridge.h0000664000373300001540000061226012330727742023320 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * This file contains everything that a D-Bus server needs to * integrate a normal C++ class into D-Bus. Argument and result * marshaling is done in wrapper functions which convert directly * to normal C++ types (bool, integers, std::string, std::map<>, ...). * See dbus_traits for the full list of supported types. * * Before explaining the binding, some terminology first: * - A function has a return type and multiple parameters. * - Input parameters are read-only arguments of the function. * - The function can return values to the caller via the * return type and output parameters (retvals). * * The C++ binding roughly looks like this: * - Arguments can be passed as plain types or const references: void foo(int arg); void bar(const std::string &str); * - A single result can be returned as return value: * int foo(); * - Multiple results can be copied into instances provided by * the wrapper, passed by reference: void foo(std::string &res); * - A return value, arguments and retvals can be combined * arbitrarily. In the D-Bus reply the return code comes before * all return values. * * Asynchronous methods are possible by declaring one parameter as a * Result pointer and later calling the virtual function provided by * it. Parameter passing of results is less flexible than that of * method parameters: the later allows both std::string as well as * const std::string &, for results only the const reference is * supported. The Result instance is passed as pointer and then owned * by the called method. * * Reference counting via boost::intrusive_ptr ensures that all * D-Bus objects are handled automatically internally. */ #ifndef INCL_GDBUS_CXX_BRIDGE #define INCL_GDBUS_CXX_BRIDGE #include "gdbus-cxx.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* The SyncEvolution exception handler must integrate into the D-Bus * C++ wrapper. In contrast to the rest of the code, that handler uses * some of the internal classes. * * To keep changes to a minimum while supporting both dbus * implementations, this is made to be a define. The intention is to * remove the define once the in-tree gdbus is dropped. */ #define DBUS_NEW_ERROR_MSG g_dbus_message_new_method_error // allow some code to deal with API differences betwee GDBus C++ for GIO // and the version for libdbus #define GDBUS_CXX_GIO 1 // Boost docs want this in the boost:: namespace, but // that fails with clang 2.9 depending on the inclusion order of // header files. Global namespace works in all cases. void intrusive_ptr_add_ref(GDBusConnection *con); void intrusive_ptr_release(GDBusConnection *con); void intrusive_ptr_add_ref(GDBusMessage *msg); void intrusive_ptr_release(GDBusMessage *msg); namespace GDBusCXX { // GDBusCXX aliases for the underlying types. // Useful for some external dbus_traits which // need to pass pointers to these types in their // append()/get() methods without depending on GIO or // libdbus types. typedef GDBusConnection connection_type; typedef GDBusMessage message_type; typedef GVariantBuilder builder_type; typedef GVariantIter reader_type; /** * Simple auto_ptr for GVariant. */ class GVariantCXX : boost::noncopyable { GVariant *m_var; public: /** takes over ownership */ GVariantCXX(GVariant *var = NULL) : m_var(var) {} ~GVariantCXX() { if (m_var) { g_variant_unref(m_var); } } operator GVariant * () { return m_var; } GVariantCXX &operator = (GVariant *var) { if (m_var != var) { if (m_var) { g_variant_unref(m_var); } m_var = var; } return *this; } }; class GVariantIterCXX : boost::noncopyable { GVariantIter *m_var; public: /** takes over ownership */ GVariantIterCXX(GVariantIter *var = NULL) : m_var(var) {} ~GVariantIterCXX() { if (m_var) { g_variant_iter_free(m_var); } } operator GVariantIter * () { return m_var; } GVariantIterCXX &operator = (GVariantIter *var) { if (m_var != var) { if (m_var) { g_variant_iter_free(m_var); } m_var = var; } return *this; } }; class DBusMessagePtr; inline void throwFailure(const std::string &object, const std::string &operation, GError *error) { std::string description = object; if (!description.empty()) { description += ": "; } description += operation; if (error) { description += ": "; description += error->message; g_clear_error(&error); } else { description += " failed"; } throw std::runtime_error(description); } class DBusConnectionPtr : public boost::intrusive_ptr { /** * Bus name of client, as passed to dbus_get_bus_connection(). * The name will be requested in dbus_bus_connection_undelay() = * undelay(), to give the caller a chance to register objects on * the new connection. */ std::string m_name; public: DBusConnectionPtr() {} // connections are typically created once, so increment the ref counter by default DBusConnectionPtr(GDBusConnection *conn, bool add_ref = true) : boost::intrusive_ptr(conn, add_ref) {} DBusConnectionPtr(const DBusConnectionPtr &other) : boost::intrusive_ptr(other), m_name(other.m_name) {} GDBusConnection *reference(void) throw() { GDBusConnection *conn = get(); g_object_ref(conn); return conn; } /** * Ensure that all IO is sent out of the process. * Blocks. Only use it right before shutting down. */ void flush(); typedef boost::function Disconnect_t; void setDisconnect(const Disconnect_t &func); // #define GDBUS_CXX_HAVE_DISCONNECT 1 /** * Starts processing of messages, * claims the bus name set with addName() or * when creating the connection (legacy API, * done that way for compatibility with GDBus for libdbus). */ void undelay() const; void addName(const std::string &name) { m_name = name; } /** * Claims another name on the connection. * * The callback will be invoked with true as * parameter once the name was successfully * claimed. If that fails, false will be passed. * * The caller should be prepared to get called * again later on, when loosing an already obtained * name. Currently this shouldn't happen, though, * because name transfer is not enabled when * registering the name. * * The callback is allowed to be empty. */ void ownNameAsync(const std::string &name, const boost::function &obtainedCB) const; }; class DBusMessagePtr : public boost::intrusive_ptr { public: DBusMessagePtr() {} // expected to be used for messages created anew, // so use the reference already incremented for us // and don't increment by default DBusMessagePtr(GDBusMessage *msg, bool add_ref = false) : boost::intrusive_ptr(msg, add_ref) {} GDBusMessage *reference(void) throw() { GDBusMessage *msg = get(); g_object_ref(msg); return msg; } }; /** * wrapper around GError which initializes * the struct automatically, then can be used to * throw an exception */ class DBusErrorCXX { GError *m_error; public: DBusErrorCXX(GError *error = NULL) : m_error(error) { } DBusErrorCXX(const DBusErrorCXX &dbus_error) : m_error(NULL) { if (dbus_error.m_error) { m_error = g_error_copy (dbus_error.m_error); } } DBusErrorCXX & operator=(const DBusErrorCXX &dbus_error) { if (this != &dbus_error) { set(dbus_error.m_error ? g_error_copy(dbus_error.m_error) : NULL); } return *this; } void set(GError *error) { if (m_error) { g_error_free (m_error); } m_error = error; } ~DBusErrorCXX() { if (m_error) { g_error_free (m_error); } } void throwFailure(const std::string &operation, const std::string &explanation = " failed") { std::string error_message(m_error ? (std::string(": ") + m_error->message) : ""); throw std::runtime_error(operation + explanation + error_message); } std::string getMessage() const { return m_error ? m_error->message : ""; } }; DBusConnectionPtr dbus_get_bus_connection(const char *busType, const char *name, bool unshared, DBusErrorCXX *err); DBusConnectionPtr dbus_get_bus_connection(const std::string &address, DBusErrorCXX *err); inline void dbus_bus_connection_undelay(const DBusConnectionPtr &conn) { conn.undelay(); } /** * Wrapper around DBusServer. Does intentionally not expose * any of the underlying methods so that the public API * can be implemented differently for GIO libdbus. */ class DBusServerCXX : private boost::noncopyable { public: ~DBusServerCXX(); /** * Called for each new connection. Callback must store the DBusConnectionPtr, * otherwise it will be unref'ed after the callback returns. * If the new connection is not wanted, then it is good style to close it * explicitly in the callback. Message processing is delayed on the new * connection, so the callback can set up objects and then must undelay * the connection. */ typedef boost::function NewConnection_t; /** * Start listening for new connections. Mimics the libdbus DBusServer API, but * underneath sets up a single connection via pipes. The caller must fork * the process which calls dbus_get_bus_connection() before entering the main * event loop again because that is when the DBusServerCXX will finish * the connection setup (close child fd, call newConnection). * * All errors are reported via exceptions, not "err". */ static boost::shared_ptr listen(const NewConnection_t &newConnection, DBusErrorCXX *err); /** * address used by the server */ std::string getAddress() const { return m_address; } private: DBusServerCXX(const std::string &address); DBusConnectionPtr m_connection; NewConnection_t m_newConnection; guint m_connectionIdle; int m_childfd; std::string m_address; static gboolean onIdleOnce(gpointer custom); }; /** * Special type for object paths. A string in practice. */ class DBusObject_t : public std::string { public: DBusObject_t() {} template DBusObject_t(T val) : std::string(val) {} template DBusObject_t &operator = (T val) { assign(val); return *this; } }; /** * specializations of this must defined methods for encoding and * decoding type C and declare its signature */ template struct dbus_traits {}; struct dbus_traits_base { /** * A C++ method or function can handle a call asynchronously by * asking to be passed a "boost::shared_ptr" parameter. * The dbus_traits for those parameters have "asynchronous" set to * true, which skips all processing after calling the method. */ static const bool asynchronous = false; }; /** * Append a varying number of parameters as result to the * message, using AppendRetvals(msg) << res1 << res2 << ...; * * Types can be anything that has a dbus_traits, including * types which are normally recognized as input parameters in D-Bus * method calls. */ class AppendRetvals { GDBusMessage *m_msg; GVariantBuilder m_builder; public: AppendRetvals(DBusMessagePtr &msg) { m_msg = msg.get(); g_variant_builder_init(&m_builder, G_VARIANT_TYPE_TUPLE); } ~AppendRetvals() { g_dbus_message_set_body(m_msg, g_variant_builder_end(&m_builder)); } template AppendRetvals & operator << (const A &a) { dbus_traits::append(m_builder, a); return *this; } }; /** * Append a varying number of method parameters as result to the reply * message, using AppendArgs(msg) << Set(res1) << Set(res2) << ...; */ struct AppendArgs { GDBusMessage *m_msg; GVariantBuilder m_builder; AppendArgs(const std::auto_ptr &msg) { m_msg = msg.get(); if (!m_msg) { throw std::runtime_error("NULL GDBusMessage reply"); } g_variant_builder_init(&m_builder, G_VARIANT_TYPE_TUPLE); } ~AppendArgs() { g_dbus_message_set_body(m_msg, g_variant_builder_end(&m_builder)); } /** syntactic sugar: redirect << into Set instance */ template AppendArgs & operator << (const A &a) { return a.set(*this); } /** * Always append argument, including those types which * would be recognized by << as parameters and thus get * skipped. */ template AppendArgs & operator + (const A &a) { dbus_traits::append(m_builder, a); return *this; } }; /** default: skip it, not a result of the method */ template struct Set { Set(typename dbus_traits::host_type &a) {} AppendArgs &set(AppendArgs &context) const { return context; } }; /** same for const reference */ template struct Set { Set(typename dbus_traits::host_type &a) {} AppendArgs &set(AppendArgs &context) const { return context; } }; /** specialization for reference: marshal result */ template struct Set { typename dbus_traits::host_type &m_a; Set(typename dbus_traits::host_type &a) : m_a(a) {} AppendArgs &set(AppendArgs &context) const { dbus_traits::append(context.m_builder, m_a); return context; } }; /** * Extract values from a message, using ExtractArgs(conn, msg) >> Get(val1) >> Get(val2) >> ...; * * This complements AppendArgs: it skips over those method arguments * which are results of the method. Which values are skipped and * which are marshalled depends on the specialization of Get and thus * ultimately on the prototype of the method. */ struct ExtractArgs { // always set GDBusConnection *m_conn; // only set when handling a method call GDBusMessage **m_msg; // only set for method call or response GVariantIter m_iter; // only set when m_msg is NULL (happens when handling signal) const char *m_sender; const char *m_path; const char *m_interface; const char *m_signal; protected: void init(GDBusConnection *conn, GDBusMessage **msg, GVariant *msgBody, const char *sender, const char *path, const char *interface, const char *signal); ExtractArgs() {} public: /** constructor for parsing a method invocation message, which must not be NULL */ ExtractArgs(GDBusConnection *conn, GDBusMessage *&msg); /** constructor for parsing signal parameters */ ExtractArgs(GDBusConnection *conn, const char *sender, const char *path, const char *interface, const char *signal); /** syntactic sugar: redirect >> into Get instance */ template ExtractArgs & operator >> (const A &a) { return a.get(*this); } }; /** * Need separate class because overloading ExtractArgs constructor * with "GDBusMessage &*msg" (for method calls and its special * DBusResult semantic) and "GDBusMessage *msg" (here) is not * possible. We can't just use the former in, for example, * Ret1Traits::demarshal() because we only have a temporary value on * the stack to bind the reference to. */ class ExtractResponse : public ExtractArgs { public: /** constructor for message response */ ExtractResponse(GDBusConnection *conn, GDBusMessage *msg); }; /** default: extract data from message */ template struct Get { typename dbus_traits::host_type &m_a; Get(typename dbus_traits::host_type &a) : m_a(a) {} ExtractArgs &get(ExtractArgs &context) const { dbus_traits::get(context, context.m_iter, m_a); return context; } }; /** same for const reference */ template struct Get { typename dbus_traits::host_type &m_a; Get(typename dbus_traits::host_type &a) : m_a(a) {} ExtractArgs &get(ExtractArgs &context) const { dbus_traits::get(context, context.m_iter, m_a); return context; } }; /** specialization for reference: skip it, not an input parameter */ template struct Get { Get(typename dbus_traits::host_type &a) {} ExtractArgs &get(ExtractArgs &context) const { return context; } }; /** * combines D-Bus connection, path and interface */ class DBusObject { protected: DBusConnectionPtr m_conn; DBusObject_t m_path; std::string m_interface; private: bool m_closeConnection; public: /** * @param closeConnection set to true if the connection * is private and this instance of * DBusObject is meant to be the * last user of the connection; * when this DBusObject deconstructs, * it'll close the connection * (required by libdbus for private * connections; the mechanism in GDBus for * this didn't work) */ DBusObject(const DBusConnectionPtr &conn, const std::string &path, const std::string &interface, bool closeConnection = false) : m_conn(conn), m_path(path), m_interface(interface), m_closeConnection(closeConnection) {} virtual ~DBusObject() { if (m_closeConnection && m_conn) { // TODO: is this also necessary for GIO GDBus? // dbus_connection_close(m_conn.get()); } } GDBusConnection *getConnection() const { return m_conn.get(); } const char *getPath() const { return m_path.c_str(); } const DBusObject_t &getObject() const { return m_path; } const char *getInterface() const { return m_interface.c_str(); } }; /** * adds destination to D-Bus connection, path and interface */ class DBusRemoteObject : public DBusObject { protected: std::string m_destination; public: DBusRemoteObject(const DBusConnectionPtr &conn, const std::string &path, const std::string &interface, const std::string &destination, bool closeConnection = false) : DBusObject(conn, path, interface, closeConnection), m_destination(destination) {} const char *getDestination() const { return m_destination.c_str(); } }; template class EmitSignalHelper { protected: const DBusObject &m_object; const std::string m_signal; EmitSignalHelper(const DBusObject &object, const std::string &signal) : m_object(object), m_signal(signal) {} void sendMsg(const DBusMessagePtr &msg) { if (optional) { g_dbus_connection_send_message(m_object.getConnection(), msg.get(), G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL); } else { if (!msg) { throwFailure(m_signal, "g_dbus_message_new_signal()", NULL); } GError *error = NULL; if (!g_dbus_connection_send_message(m_object.getConnection(), msg.get(), G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error)) { throwFailure(m_signal, "g_dbus_connection_send_message()", error); } } } }; template class EmitSignal0Template : private EmitSignalHelper { public: EmitSignal0Template(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () () { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->ref_count = 1; return entry; } }; typedef EmitSignal0Template EmitSignal0; void appendArgInfo(GPtrArray *pa, const std::string &type); template void appendNewArg(GPtrArray *pa) { // "in" direction appendArgInfo(pa, dbus_traits::getSignature()); } template void appendNewArgForReply(GPtrArray *pa) { // "out" direction appendArgInfo(pa, dbus_traits::getReply()); } template void appendNewArgForReturn(GPtrArray *pa) { // "out" direction, type must not be skipped appendArgInfo(pa, dbus_traits::getType()); } template class EmitSignal1 : private EmitSignalHelper { public: EmitSignal1(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () (A1 a1) { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } AppendRetvals(msg) << a1; EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); GPtrArray *args = g_ptr_array_new(); appendNewArg(args); g_ptr_array_add(args, NULL); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->args = (GDBusArgInfo **)g_ptr_array_free (args, FALSE); entry->ref_count = 1; return entry; } }; template class EmitSignal2 : private EmitSignalHelper { public: EmitSignal2(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () (A1 a1, A2 a2) { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } AppendRetvals(msg) << a1 << a2; EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); GPtrArray *args = g_ptr_array_new(); appendNewArg(args); appendNewArg(args); g_ptr_array_add(args, NULL); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->args = (GDBusArgInfo **)g_ptr_array_free (args, FALSE); entry->ref_count = 1; return entry; } }; template class EmitSignal3 : private EmitSignalHelper { public: EmitSignal3(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3) { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } AppendRetvals(msg) << a1 << a2 << a3; EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); GPtrArray *args = g_ptr_array_new(); appendNewArg(args); appendNewArg(args); appendNewArg(args); g_ptr_array_add(args, NULL); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->args = (GDBusArgInfo **)g_ptr_array_free (args, FALSE); entry->ref_count = 1; return entry; } }; template class EmitSignal4 : private EmitSignalHelper { public: EmitSignal4(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3, A4 a4) { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } AppendRetvals(msg) << a1 << a2 << a3 << a4; EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); GPtrArray *args = g_ptr_array_new(); appendNewArg(args); appendNewArg(args); appendNewArg(args); appendNewArg(args); g_ptr_array_add(args, NULL); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->args = (GDBusArgInfo **)g_ptr_array_free (args, FALSE); entry->ref_count = 1; return entry; } }; template class EmitSignal5 : private EmitSignalHelper { public: EmitSignal5(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5; EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); GPtrArray *args = g_ptr_array_new(); appendNewArg(args); appendNewArg(args); appendNewArg(args); appendNewArg(args); appendNewArg(args); g_ptr_array_add(args, NULL); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->args = (GDBusArgInfo **)g_ptr_array_free (args, FALSE); entry->ref_count = 1; return entry; } }; template class EmitSignal6 : private EmitSignalHelper { public: EmitSignal6(const DBusObject &object, const std::string &signal) : EmitSignalHelper(object, signal) {} typedef void result_type; void operator () (A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { DBusMessagePtr msg(g_dbus_message_new_signal(EmitSignalHelper::m_object.getPath(), EmitSignalHelper::m_object.getInterface(), EmitSignalHelper::m_signal.c_str())); if (!msg) { if (optional) { return; } throwFailure(EmitSignalHelper::m_signal, "g_dbus_message_new_signal()", NULL); } AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6; EmitSignalHelper::sendMsg(msg); } GDBusSignalInfo *makeSignalEntry() const { GDBusSignalInfo *entry = g_new0(GDBusSignalInfo, 1); GPtrArray *args = g_ptr_array_sized_new(7); appendNewArg(args); appendNewArg(args); appendNewArg(args); appendNewArg(args); appendNewArg(args); appendNewArg(args); g_ptr_array_add(args, NULL); entry->name = g_strdup(EmitSignalHelper::m_signal.c_str()); entry->args = (GDBusArgInfo **)g_ptr_array_free (args, FALSE); entry->ref_count = 1; return entry; } }; struct FunctionWrapperBase { void* m_func_ptr; FunctionWrapperBase(void* func_ptr) : m_func_ptr(func_ptr) {} virtual ~FunctionWrapperBase() {} }; template struct FunctionWrapper : public FunctionWrapperBase { FunctionWrapper(boost::function* func_ptr) : FunctionWrapperBase(reinterpret_cast(func_ptr)) {} virtual ~FunctionWrapper() { delete reinterpret_cast*>(m_func_ptr); } }; struct MethodHandler { typedef GDBusMessage *(*MethodFunction)(GDBusConnection *conn, GDBusMessage *msg, void *data); typedef boost::shared_ptr FuncWrapper; typedef std::pair CallbackPair; typedef std::map MethodMap; static MethodMap m_methodMap; static boost::function m_callback; static std::string make_prefix(const char *object_path) { return std::string(object_path) + "~"; } static std::string make_method_key(const char *object_path, const char *method_name) { return make_prefix(object_path) + method_name; } static void handler(GDBusConnection *connection, const gchar *sender, const gchar *object_path, const gchar *interface_name, const gchar *method_name, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer user_data) { MethodMap::iterator it; it = m_methodMap.find(make_method_key(object_path, method_name)); if (it == m_methodMap.end()) { g_dbus_method_invocation_return_dbus_error(invocation, "org.SyncEvolution.NoMatchingMethodName", "No methods registered with this name"); return; } // http://developer.gnome.org/gio/stable/GDBusConnection.html#GDBusInterfaceMethodCallFunc // does not say so explicitly, but it seems that 'invocation' was created for us. // If we don't unref it, it leaks (visible in refdbg). // // The documentation for the class itself says that 'the normal way to obtain a // GDBusMethodInvocation object is to receive it as an argument to the // handle_method_call()' - note the word 'obtain', which seems to imply ownership. // This is consistent with the transfer of ownership to calls like // g_dbus_method_invocation_return_dbus_error(), which take over ownership // of the invocation instance. // // Because we work with messages directly for the reply from now on, we // unref 'invocation' immediately after referencing the underlying message. DBusMessagePtr msg(g_dbus_method_invocation_get_message(invocation), true); g_object_unref(invocation); // Set to NULL, just to be sure we remember that it is gone. // cppcheck-suppress uselessAssignmentPtrArg invocation = NULL; // We are calling callback because we want to keep server alive as long // as possible. This callback is in fact delaying server's autotermination. if (m_callback) { m_callback(); } MethodFunction methodFunc = it->second.first; void *methodData = reinterpret_cast(it->second.second->m_func_ptr); GDBusMessage *reply; reply = (methodFunc)(connection, msg.get(), methodData); if (!reply) { // probably asynchronous, might also be out-of-memory; // either way, don't send a reply now return; } GError *error = NULL; g_dbus_connection_send_message(connection, reply, G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error); g_object_unref(reply); // Cannot throw an exception, glib event loop won't know what to do with it; // pretend that the problem didn't happen. if (error != NULL) { g_error_free (error); } } }; template struct MakeMethodEntry { // There is no generic implementation of this method. // If you get an error about it missing, then write // a specialization for your type M (the method pointer). // // static GDBusMethodEntry make(const char *name) }; // Wrapper around g_dbus_method_info_unref or g_dbus_signal_info_unref // with additional NULL check. The methods themselves crash on NULL, // which happens when appending the terminating NULL to m_methods/m_signals // below. template void InfoDestroy(gpointer ptr) { if (ptr) { I *info = static_cast(ptr); f(info); } } /** * utility class for registering an interface */ class DBusObjectHelper : public DBusObject { // 0 when not registered (= activated). guint m_connId; GDBusInterfaceInfo m_ifInfo; GDBusInterfaceVTable m_ifVTable; // These arrays must stay valid as long as we are active, // because our GDBusInterfaceInfo points to it without // ever freeing the memory. GPtrArray *m_methods; GPtrArray *m_signals; public: typedef boost::function Callback_t; DBusObjectHelper(DBusConnectionPtr conn, const std::string &path, const std::string &interface, const Callback_t &callback = Callback_t(), bool closeConnection = false) : DBusObject(conn, path, interface, closeConnection), m_connId(0), m_methods(g_ptr_array_new_with_free_func(InfoDestroy)), m_signals(g_ptr_array_new_with_free_func(InfoDestroy)) { memset(&m_ifInfo, 0, sizeof(m_ifInfo)); memset(&m_ifVTable, 0, sizeof(m_ifVTable)); if (!MethodHandler::m_callback) { MethodHandler::m_callback = callback; } } ~DBusObjectHelper() { deactivate(); MethodHandler::MethodMap::iterator iter(MethodHandler::m_methodMap.begin()); MethodHandler::MethodMap::iterator iter_end(MethodHandler::m_methodMap.end()); MethodHandler::MethodMap::iterator first_to_erase(iter_end); MethodHandler::MethodMap::iterator last_to_erase(iter_end); const std::string prefix(MethodHandler::make_prefix(getPath())); while (iter != iter_end) { const bool prefix_equal(!iter->first.compare(0, prefix.size(), prefix)); if (prefix_equal && (first_to_erase == iter_end)) { first_to_erase = iter; } else if (!prefix_equal && (first_to_erase != iter_end)) { last_to_erase = iter; break; } ++iter; } if (first_to_erase != iter_end) { MethodHandler::m_methodMap.erase(first_to_erase, last_to_erase); } g_ptr_array_free(m_methods, TRUE); g_ptr_array_free(m_signals, TRUE); } /** * binds a member to the this pointer of its instance * and invokes it when the specified method is called */ template void add(A1 instance, M C::*method, const char *name) { if (m_connId) { throw std::logic_error("You can't add new methods after registration!"); } typedef MakeMethodEntry< boost::function > entry_type; g_ptr_array_add(m_methods, entry_type::make(name)); boost::function *func = new boost::function(entry_type::boostptr(method, instance)); MethodHandler::FuncWrapper wrapper(new FunctionWrapper(func)); MethodHandler::CallbackPair methodAndData = std::make_pair(entry_type::methodFunction, wrapper); const std::string key(MethodHandler::make_method_key(getPath(), name)); MethodHandler::m_methodMap.insert(std::make_pair(key, methodAndData)); } /** * binds a plain function pointer with no additional arguments and * invokes it when the specified method is called */ template void add(M *function, const char *name) { if (m_connId) { throw std::logic_error("You can't add new functions after registration!"); } typedef MakeMethodEntry< boost::function > entry_type; g_ptr_array_add(m_methods, entry_type::make(name)); boost::function *func = new boost::function(function); MethodHandler::FuncWrapper wrapper(new FunctionWrapper(func)); MethodHandler::CallbackPair methodAndData = std::make_pair(entry_type::methodFunction, wrapper); const std::string key(MethodHandler::make_method_key(getPath(), name)); MethodHandler::m_methodMap.insert(std::make_pair(key, methodAndData)); } /** * add an existing signal entry */ template void add(const S &s) { if (m_connId) { throw std::logic_error("You can't add new signals after registration!"); } g_ptr_array_add(m_signals, s.makeSignalEntry()); } void activate() { // method and signal array must be NULL-terminated. if (m_connId) { throw std::logic_error("This object was already activated."); } if (m_methods->len && m_methods->pdata[m_methods->len - 1] != NULL) { g_ptr_array_add(m_methods, NULL); } if (m_signals->len && m_signals->pdata[m_signals->len - 1] != NULL) { g_ptr_array_add(m_signals, NULL); } // Meta data is owned by this instance, not GDBus. // This is what most examples do and deviating from that // can (did!) lead to memory leaks. For example, // the ownership of the method array cannot be transferred // to GDBusInterfaceInfo. m_ifInfo.ref_count = -1; m_ifInfo.name = const_cast(getInterface()); // Due to ref_count == -1, m_ifInfo.name is not going to get freed despite the missing const. m_ifInfo.methods = (GDBusMethodInfo **)m_methods->pdata; m_ifInfo.signals = (GDBusSignalInfo **)m_signals->pdata; m_ifVTable.method_call = MethodHandler::handler; m_connId = g_dbus_connection_register_object(getConnection(), getPath(), &m_ifInfo, &m_ifVTable, this, NULL, NULL); if (m_connId == 0) { throw std::runtime_error(std::string("g_dbus_connection_register_object() failed for ") + getPath() + " " + getInterface()); } } void deactivate() { if (m_connId) { if (!g_dbus_connection_unregister_object(getConnection(), m_connId)) { throw std::runtime_error(std::string("g_dbus_connection_unregister_object() failed for ") + getPath() + " " + getInterface()); } m_connId = 0; } } }; /** * to be used for plain parameters like int32_t: * treat as arguments which have to be extracted * from the GVariants and can be skipped when * encoding the reply */ struct VariantTypeBoolean { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_BOOLEAN; } }; struct VariantTypeByte { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_BYTE; } }; struct VariantTypeInt16 { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_INT16; } }; struct VariantTypeUInt16 { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_UINT16; } }; struct VariantTypeInt32 { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_INT32; } }; struct VariantTypeUInt32 { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_UINT32; } }; struct VariantTypeInt64 { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_INT64; } }; struct VariantTypeUInt64 { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_UINT64; } }; struct VariantTypeDouble { static const GVariantType* getVariantType() { return G_VARIANT_TYPE_DOUBLE; } }; #define GDBUS_CXX_QUOTE(x) #x #define GDBUS_CXX_LINE(l) GDBUS_CXX_QUOTE(l) #define GDBUS_CXX_SOURCE_INFO __FILE__ ":" GDBUS_CXX_LINE(__LINE__) template struct basic_marshal : public dbus_traits_base { typedef host host_type; typedef host arg_type; /** * copy value from GVariant iterator into variable */ static void get(ExtractArgs &context, GVariantIter &iter, host &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), VariantTraits::getVariantType())) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } const char *type = g_variant_get_type_string(var); g_variant_get(var, type, &value); } /** * copy value into D-Bus iterator */ static void append(GVariantBuilder &builder, arg_type value) { const gchar *typeStr = g_variant_type_dup_string(VariantTraits::getVariantType()); g_variant_builder_add(&builder, typeStr, value); g_free((gpointer)typeStr); } }; template<> struct dbus_traits : public basic_marshal< uint8_t, VariantTypeByte > { /** * plain type, regardless of whether used as * input or output parameter */ static std::string getType() { return "y"; } /** * plain type => input parameter => non-empty signature */ static std::string getSignature() {return getType(); } /** * plain type => not returned to caller */ static std::string getReply() { return ""; } }; /** if the app wants to use signed char, let it and treat it like a byte */ template<> struct dbus_traits : dbus_traits { typedef int8_t host_type; typedef int8_t arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &value) { dbus_traits::get(context, iter, reinterpret_cast(value)); } }; template<> struct dbus_traits : public basic_marshal< int16_t, VariantTypeInt16 > { static std::string getType() { return "n"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< uint16_t, VariantTypeUInt16 > { static std::string getType() { return "q"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< int32_t, VariantTypeInt32 > { static std::string getType() { return "i"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< uint32_t, VariantTypeUInt32 > { static std::string getType() { return "u"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< int64_t, VariantTypeInt64 > { static std::string getType() { return "x"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< uint64_t, VariantTypeUInt64 > { static std::string getType() { return "t"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public basic_marshal< double, VariantTypeDouble > { static std::string getType() { return "d"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } }; template<> struct dbus_traits : public dbus_traits_base // cannot use basic_marshal because VariantTypeBoolean packs/unpacks // a gboolean, which is not a C++ bool (4 bytes vs 1 on x86_64) // public basic_marshal< bool, VariantTypeBoolean > { static std::string getType() { return "b"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef bool host_type; typedef bool arg_type; static void get(ExtractArgs &context, GVariantIter &iter, bool &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), VariantTypeBoolean::getVariantType())) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } gboolean buffer; const char *type = g_variant_get_type_string(var); g_variant_get(var, type, &buffer); value = buffer; } static void append(GVariantBuilder &builder, bool value) { const gchar *typeStr = g_variant_type_dup_string(VariantTypeBoolean::getVariantType()); g_variant_builder_add(&builder, typeStr, (gboolean)value); g_free((gpointer)typeStr); } }; template<> struct dbus_traits : public dbus_traits_base { static std::string getType() { return "s"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, std::string &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_STRING)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } const char *str = g_variant_get_string(var, NULL); value = str; } static void append(GVariantBuilder &builder, const std::string &value) { g_variant_builder_add_value(&builder, g_variant_new_string(value.c_str())); } typedef std::string host_type; typedef const std::string &arg_type; }; template<> struct dbus_traits : public dbus_traits_base { static std::string getType() { return "s"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } // Cannot copy into that type. Can only be used for encoding. static void append(GVariantBuilder &builder, const char *value) { g_variant_builder_add_value(&builder, g_variant_new_string(value ? value : "")); } typedef const char *host_type; typedef const char *arg_type; }; template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return "o"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, DBusObject_t &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_OBJECT_PATH)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } const char *objPath = g_variant_get_string(var, NULL); value = objPath; } static void append(GVariantBuilder &builder, const DBusObject_t &value) { if (!g_variant_is_object_path(value.c_str())) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } g_variant_builder_add_value(&builder, g_variant_new_object_path(value.c_str())); } typedef DBusObject_t host_type; typedef const DBusObject_t &arg_type; }; /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, Caller_t &value) { const char *peer = (context.m_msg && *context.m_msg) ? g_dbus_message_get_sender(*context.m_msg) : context.m_sender; if (!peer) { throw std::runtime_error("D-Bus method call without sender?!"); } value = peer; } typedef Caller_t host_type; typedef const Caller_t &arg_type; }; /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, Path_t &value) { const char *path = (context.m_msg && *context.m_msg) ? g_dbus_message_get_path(*context.m_msg) : context.m_path; if (!path) { throw std::runtime_error("D-Bus message without path?!"); } value = path; } typedef Path_t host_type; typedef const Path_t &arg_type; }; /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, Interface_t &value) { const char *path = (context.m_msg && *context.m_msg) ? g_dbus_message_get_interface(*context.m_msg) : context.m_interface; if (!path) { throw std::runtime_error("D-Bus message without interface?!"); } value = path; } typedef Interface_t host_type; typedef const Interface_t &arg_type; }; /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, Member_t &value) { const char *path = (context.m_msg && *context.m_msg) ? g_dbus_message_get_member(*context.m_msg) : NULL; if (!path) { throw std::runtime_error("D-Bus message without member?!"); } value = path; } typedef Member_t host_type; typedef const Member_t &arg_type; }; /** * a std::pair - maps to D-Bus struct */ template struct dbus_traits< std::pair > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType() + dbus_traits::getType(); } static std::string getType() { return "(" + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef std::pair host_type; typedef const std::pair &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &pair) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_TUPLE)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter tupIter; g_variant_iter_init(&tupIter, var); dbus_traits::get(context, tupIter, pair.first); dbus_traits::get(context, tupIter, pair.second); } static void append(GVariantBuilder &builder, arg_type pair) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); dbus_traits::append(builder, pair.first); dbus_traits::append(builder, pair.second); g_variant_builder_close(&builder); } }; /** * a boost::tuple - maps to D-Bus struct */ template struct dbus_traits< boost::tuple > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType() + dbus_traits::getType(); } static std::string getType() { return "(" + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef boost::tuple host_type; typedef const boost::tuple &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &t) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_TUPLE)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter tupIter; g_variant_iter_init(&tupIter, var); dbus_traits::get(context, tupIter, boost::tuples::get<0>(t)); dbus_traits::get(context, tupIter, boost::tuples::get<1>(t)); } static void append(GVariantBuilder &builder, arg_type t) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); dbus_traits::append(builder, boost::tuples::get<0>(t)); dbus_traits::append(builder, boost::tuples::get<1>(t)); g_variant_builder_close(&builder); } }; /** * a boost::tuple - maps to D-Bus struct */ template struct dbus_traits< boost::tuple > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType() + dbus_traits::getType() + dbus_traits::getType(); } static std::string getType() { return "(" + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef boost::tuple host_type; typedef const boost::tuple &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &t) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_TUPLE)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter tupIter; g_variant_iter_init(&tupIter, var); dbus_traits::get(context, tupIter, boost::tuples::get<0>(t)); dbus_traits::get(context, tupIter, boost::tuples::get<1>(t)); dbus_traits::get(context, tupIter, boost::tuples::get<2>(t)); } static void append(GVariantBuilder &builder, arg_type t) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); dbus_traits::append(builder, boost::tuples::get<0>(t)); dbus_traits::append(builder, boost::tuples::get<1>(t)); dbus_traits::append(builder, boost::tuples::get<2>(t)); g_variant_builder_close(&builder); } }; /** * a boost::tuple - maps to D-Bus struct */ template struct dbus_traits< boost::tuple > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType() + dbus_traits::getType() + dbus_traits::getType() + dbus_traits::getType(); } static std::string getType() { return "(" + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef boost::tuple host_type; typedef const boost::tuple &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &t) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_TUPLE)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter tupIter; g_variant_iter_init(&tupIter, var); dbus_traits::get(context, tupIter, boost::tuples::get<0>(t)); dbus_traits::get(context, tupIter, boost::tuples::get<1>(t)); dbus_traits::get(context, tupIter, boost::tuples::get<2>(t)); dbus_traits::get(context, tupIter, boost::tuples::get<3>(t)); } static void append(GVariantBuilder &builder, arg_type t) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); dbus_traits::append(builder, boost::tuples::get<0>(t)); dbus_traits::append(builder, boost::tuples::get<1>(t)); dbus_traits::append(builder, boost::tuples::get<2>(t)); dbus_traits::append(builder, boost::tuples::get<3>(t)); g_variant_builder_close(&builder); } }; /** * dedicated type for chunk of data, to distinguish this case from * a normal std::pair of two values */ template class DBusArray : public std::pair { public: DBusArray() : std::pair(0, NULL) {} DBusArray(size_t len, const V *data) : std::pair(len, data) {} }; template class DBusArray makeDBusArray(size_t len, const V *data) { return DBusArray(len, data); } /** * Pass array of basic type plus its number of entries. * Can only be used in cases where the caller owns the * memory and can discard it when the call returns, in * other words, for method calls, asynchronous replys and * signals, but not for return values. */ template struct dbus_traits< DBusArray > : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType(); } static std::string getType() { return std::string("a") + dbus_traits::getType(); } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef DBusArray host_type; typedef const host_type &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &array) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_ARRAY)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } typedef typename dbus_traits::host_type V_host_type; gsize nelements; V_host_type *data; data = (V_host_type *) g_variant_get_fixed_array(var, &nelements, static_cast(sizeof(V_host_type))); array.first = nelements; array.second = data; } static void append(GVariantBuilder &builder, arg_type array) { g_variant_builder_add_value(&builder, g_variant_new_from_data(G_VARIANT_TYPE(getType().c_str()), (gconstpointer)array.second, array.first, true, // data is trusted to be in serialized form NULL, NULL // no need to free data )); } }; /** * a std::map - treat it like a D-Bus dict */ template struct dbus_traits< std::map > : public dbus_traits_base { static std::string getContainedType() { return std::string("{") + dbus_traits::getType() + dbus_traits::getType() + "}"; } static std::string getType() { return std::string("a") + getContainedType(); } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef std::map host_type; typedef const host_type &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &dict) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_ARRAY)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter contIter; GVariantCXX child; g_variant_iter_init(&contIter, var); while((child = g_variant_iter_next_value(&contIter)) != NULL) { K key; V value; GVariantIter childIter; g_variant_iter_init(&childIter, child); dbus_traits::get(context, childIter, key); dbus_traits::get(context, childIter, value); dict.insert(std::make_pair(key, value)); } } static void append(GVariantBuilder &builder, arg_type dict) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); for(typename host_type::const_iterator it = dict.begin(); it != dict.end(); ++it) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getContainedType().c_str())); dbus_traits::append(builder, it->first); dbus_traits::append(builder, it->second); g_variant_builder_close(&builder); } g_variant_builder_close(&builder); } }; /** * A collection of items (works for std::list, std::vector, std::deque, ...). * Maps to D-Bus array, but with inefficient marshaling * because we cannot get a base pointer for the whole array. */ template struct dbus_traits_collection : public dbus_traits_base { static std::string getContainedType() { return dbus_traits::getType(); } static std::string getType() { return std::string("a") + getContainedType(); } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef C host_type; typedef const C &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &array) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_ARRAY)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } int nelements = g_variant_n_children(var); GVariantIter childIter; g_variant_iter_init(&childIter, var); for(int i = 0; i < nelements; ++i) { V value; dbus_traits::get(context, childIter, value); array.push_back(value); } } static void append(GVariantBuilder &builder, arg_type array) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); for(typename host_type::const_iterator it = array.begin(); it != array.end(); ++it) { dbus_traits::append(builder, *it); } g_variant_builder_close(&builder); } }; template struct dbus_traits< std::vector > : public dbus_traits_collection, V> {}; template struct dbus_traits< std::list > : public dbus_traits_collection, V> {}; template struct dbus_traits< std::deque > : public dbus_traits_collection, V> {}; struct append_visitor : public boost::static_visitor<> { GVariantBuilder &builder; append_visitor(GVariantBuilder &b) : builder(b) {} template void operator()(const V &v) const { dbus_traits::append(builder, v); } }; /** * A boost::variant maps to a dbus variant, only care about values of * type V but will not throw error if type is not matched, this is useful if * application is interested on only a sub set of possible value types * in variant. */ template struct dbus_variant_base : public dbus_traits_base { static std::string getType() { return "v"; } static std::string getSignature() { return getType(); } static std::string getReply() { return ""; } typedef BV host_type; typedef const BV &arg_type; static void append(GVariantBuilder &builder, const BV &value) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); boost::apply_visitor(append_visitor(builder), value); g_variant_builder_close(&builder); } }; template struct dbus_traits > : public dbus_variant_base< boost::variant > { static void get(ExtractArgs &context, GVariantIter &iter, boost::variant &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_VARIANT)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter varIter; g_variant_iter_init(&varIter, var); GVariantCXX varVar(g_variant_iter_next_value(&varIter)); const char *type = g_variant_get_type_string(varVar); if (dbus_traits::getSignature() != type) { //ignore unrecognized sub type in variant return; } V val; // Note: Reset the iterator so that the call to dbus_traits::get() will get the right variant; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } }; template struct dbus_traits > : public dbus_variant_base< boost::variant > { static void get(ExtractArgs &context, GVariantIter &iter, boost::variant &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_VARIANT)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter varIter; g_variant_iter_init(&varIter, var); GVariantCXX varVar(g_variant_iter_next_value(&varIter)); const char *type = g_variant_get_type_string(varVar); if (dbus_traits::getSignature() == type) { V1 val; // Note: Reset the iterator so that the call to dbus_traits::get() will get the right variant; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V2 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else { // ignore unrecognized sub type in variant return; } } }; template struct dbus_traits > : public dbus_variant_base< boost::variant > { static void get(ExtractArgs &context, GVariantIter &iter, boost::variant &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_VARIANT)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter varIter; g_variant_iter_init(&varIter, var); GVariantCXX varVar(g_variant_iter_next_value(&varIter)); const char *type = g_variant_get_type_string(varVar); if (dbus_traits::getSignature() == type) { V1 val; // Note: Reset the iterator so that the call to dbus_traits::get() will get the right variant; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V2 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V3 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else { // ignore unrecognized sub type in variant return; } } }; template struct dbus_traits > : public dbus_variant_base< boost::variant > { static void get(ExtractArgs &context, GVariantIter &iter, boost::variant &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_VARIANT)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter varIter; g_variant_iter_init(&varIter, var); GVariantCXX varVar(g_variant_iter_next_value(&varIter)); const char *type = g_variant_get_type_string(varVar); if (dbus_traits::getSignature() == type) { V1 val; // Note: Reset the iterator so that the call to dbus_traits::get() will get the right variant; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V2 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V3 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V4 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else { // ignore unrecognized sub type in variant return; } } }; template struct dbus_traits > : public dbus_variant_base< boost::variant > { static void get(ExtractArgs &context, GVariantIter &iter, boost::variant &value) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_equal(g_variant_get_type(var), G_VARIANT_TYPE_VARIANT)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter varIter; g_variant_iter_init(&varIter, var); GVariantCXX varVar(g_variant_iter_next_value(&varIter)); const char *type = g_variant_get_type_string(varVar); if (dbus_traits::getSignature() == type) { V1 val; // Note: Reset the iterator so that the call to dbus_traits::get() will get the right variant; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V2 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V3 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V4 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else if (dbus_traits::getSignature() == type) { V5 val; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, val); value = val; } else { // ignore unrecognized sub type in variant return; } } }; /** * A recursive variant. Can represent values of a certain type V and * vectors with a mixture of such values and the variant. Limiting * this to vectors is done for the sake of simplicity and because * vector is fairly efficient to work with, in particular when * implementing methods. * * It would be nice to not refer to boost internals here. But using * "typename boost::make_recursive_variant >::type" * instead of the expanded * "boost::variant< boost::detail::variant::recursive_flag, A>" * leads to a compiler error: * class template partial specialization contains a template parameter that can not be deduced; this partial specialization will never be used [-Werror] * ...dbus_traits < typename boost::make_recursive_variant >::type > ... * ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ template struct dbus_traits < boost::variant, A> > : public dbus_traits_base { static std::string getType() { return "v"; } static std::string getSignature() { return getType(); } static std::string getReply() { return ""; } typedef boost::variant, A> host_type; typedef const host_type &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &value) { GVariantIterCXX itercopy(g_variant_iter_copy(&iter)); // Peek at next element, then decide what to do with it. GVariantCXX var(g_variant_iter_next_value(&iter)); // We accept a variant, the plain type V, or an array. // This is necessary for clients like Python which // send [['foo', 'bar']] as 'aas' when seeing 'v' // as signature. if (var == NULL) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } const char *type = g_variant_get_type_string(var); if (!strcmp(type, "v")) { // Strip the outer variant and decode the inner value recursively, in // our own else branch. GVariantIter varIter; g_variant_iter_init(&varIter, var); dbus_traits::get(context, varIter, value); } else if (dbus_traits::getSignature() == type) { V val; dbus_traits::get(context, *itercopy, val); value = val; } else if (type[0] == 'a') { std::vector val; dbus_traits< std::vector >::get(context, *itercopy, val); value = val; } else if (type[0] == '(') { // Treat a tuple like an array. We have to iterate ourself here. std::vector val; GVariantIter tupIter; g_variant_iter_init(&tupIter, var); GVariantIterCXX copy(g_variant_iter_copy(&tupIter)); // Step through the elements in lockstep. We need this // because we must not call the get() method when there is // nothing to unpack. while (GVariantCXX(g_variant_iter_next_value(copy))) { host_type tmp; dbus_traits::get(context, tupIter, tmp); val.push_back(tmp); } value = val; } else { // More strict than the other variants, because it is mostly used for // method calls where we don't want to silently ignore parts of the // parameter. throw std::runtime_error(std::string("expected recursive variant containing " + dbus_traits::getSignature() + ", got " + type)); return; } } static void append(GVariantBuilder &builder, const boost::variant &value) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); boost::apply_visitor(append_visitor(builder), value); g_variant_builder_close(&builder); } }; /** * a single member m of type V in a struct K */ template struct dbus_member_single { static std::string getType() { return dbus_traits::getType(); } typedef V host_type; static void get(ExtractArgs &context, GVariantIter &iter, K &val) { dbus_traits::get(context, iter, val.*m); } static void append(GVariantBuilder &builder, const K &val) { dbus_traits::append(builder, val.*m); } }; /** * a member m of type V in a struct K, followed by another dbus_member * or dbus_member_single to end the chain */ template struct dbus_member { static std::string getType() { return dbus_traits::getType() + M::getType(); } typedef V host_type; static void get(ExtractArgs &context, GVariantIter &iter, K &val) { dbus_traits::get(context, iter, val.*m); M::get(context, iter, val); } static void append(GVariantBuilder &builder, const K &val) { dbus_traits::append(builder, val.*m); M::append(builder, val); } }; /** * The base class of type V of a struct K, followed by another dbus_member * or dbus_member_single to end the chain */ template struct dbus_base { static std::string getType() { return dbus_traits::getType() + M::getType(); } typedef V host_type; static void get(ExtractArgs &context, GVariantIter &iter, K &val) { dbus_traits::get(context, iter, val); M::get(context, iter, val); } static void append(GVariantBuilder &builder, const K &val) { dbus_traits::append(builder, val); M::append(builder, val); } }; /** * a helper class which implements dbus_traits for * a class, use with: * struct foo { int a; std::string b; }; * template<> struct dbus_traits< foo > : dbus_struct_traits< foo, * dbus_member > > {}; */ template struct dbus_struct_traits : public dbus_traits_base { static std::string getContainedType() { return M::getType(); } static std::string getType() { return std::string("(") + getContainedType() + ")"; } static std::string getSignature() {return getType(); } static std::string getReply() { return ""; } typedef K host_type; typedef const K &arg_type; static void get(ExtractArgs &context, GVariantIter &iter, host_type &val) { GVariantCXX var(g_variant_iter_next_value(&iter)); if (var == NULL || !g_variant_type_is_subtype_of(g_variant_get_type(var), G_VARIANT_TYPE_TUPLE)) { throw std::runtime_error("g_variant failure " GDBUS_CXX_SOURCE_INFO); } GVariantIter tupIter; g_variant_iter_init(&tupIter, var); M::get(context, tupIter, val); } static void append(GVariantBuilder &builder, arg_type val) { g_variant_builder_open(&builder, G_VARIANT_TYPE(getType().c_str())); M::append(builder, val); g_variant_builder_close(&builder); } }; /** * a helper class which implements dbus_traits for an enum, * parameterize it with the enum type and an integer type * large enough to hold all valid enum values */ template struct dbus_enum_traits : public dbus_traits { typedef E host_type; typedef E arg_type; // cast from enum to int in append() is implicit; in // get() we have to make it explicit static void get(ExtractArgs &context, GVariantIter &iter, host_type &val) { I ival; dbus_traits::get(context, iter, ival); val = static_cast(ival); } }; /** * special case const reference parameter: * treat like pass-by-value input argument * * Example: const std::string &arg */ template struct dbus_traits : public dbus_traits {}; /** * special case writeable reference parameter: * must be a return value * * Example: std::string &retval */ template struct dbus_traits : public dbus_traits { static std::string getSignature() { return ""; } static std::string getReply() { return dbus_traits::getType(); } }; /** * dbus-cxx base exception thrown in dbus server * org.syncevolution.gdbuscxx.Exception * This base class only contains interfaces, no data members */ class DBusCXXException { public: /** * get exception name, used to convert to dbus error name * subclasses should override it */ virtual std::string getName() const { return "org.syncevolution.gdbuscxx.Exception"; } /** * get error message */ virtual const char* getMessage() const { return "unknown"; } }; static GDBusMessage *handleException(GDBusMessage *&callerMsg) { // We provide a reply to the message. Clear the "msg" variable // in our caller's context to make it as done. GDBusMessage *msg = callerMsg; callerMsg = NULL; try { #ifdef DBUS_CXX_EXCEPTION_HANDLER return DBUS_CXX_EXCEPTION_HANDLER(msg); #else throw; #endif } catch (const dbus_error &ex) { return g_dbus_message_new_method_error_literal(msg, ex.dbusName().c_str(), ex.what()); } catch (const DBusCXXException &ex) { return g_dbus_message_new_method_error_literal(msg, ex.getName().c_str(), ex.getMessage()); } catch (const std::runtime_error &ex) { return g_dbus_message_new_method_error_literal(msg, "org.syncevolution.gdbuscxx.Exception", ex.what()); } catch (...) { return g_dbus_message_new_method_error_literal(msg, "org.syncevolution.gdbuscxx.Exception", "unknown"); } } /** * Check presence of a certain D-Bus client. */ class Watch : private boost::noncopyable { DBusConnectionPtr m_conn; boost::function m_callback; bool m_called; guint m_watchID; std::string m_peer; static void nameOwnerChanged(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data); void disconnected(); public: Watch(const DBusConnectionPtr &conn, const boost::function &callback = boost::function()); ~Watch(); /** * Changes the callback triggered by this Watch. If the watch has * already fired, the callback is invoked immediately. */ void setCallback(const boost::function &callback); /** * Starts watching for disconnect of that peer * and also checks whether it is currently * still around. */ void activate(const char *peer); }; void getWatch(ExtractArgs &context, boost::shared_ptr &value); /** * pseudo-parameter: not part of D-Bus signature, * but rather extracted from message attributes */ template <> struct dbus_traits< boost::shared_ptr > : public dbus_traits_base { static std::string getType() { return ""; } static std::string getSignature() { return ""; } static std::string getReply() { return ""; } static void get(ExtractArgs &context, GVariantIter &iter, boost::shared_ptr &value) { getWatch(context, value); } static void append(GVariantBuilder &builder, const boost::shared_ptr &value) {} typedef boost::shared_ptr host_type; typedef const boost::shared_ptr &arg_type; }; /** * base class for D-Bus results, * keeps references to required objects and provides the * failed() method */ class DBusResult : virtual public Result { protected: DBusConnectionPtr m_conn; /**< connection via which the message was received */ DBusMessagePtr m_msg; /**< the method invocation message */ bool m_haveOwnership; /**< this class is responsible for sending a method reply */ bool m_replied; /**< a response was sent */ void sendMsg(const DBusMessagePtr &msg) { m_replied = true; GError *error = NULL; if (!g_dbus_connection_send_message(m_conn.get(), msg.get(), G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &error)) { throwFailure("", "g_dbus_connection_send_message()", error); } } public: DBusResult(GDBusConnection *conn, GDBusMessage *msg) : m_conn(conn, true), m_msg(msg, true), m_haveOwnership(false), m_replied(false) {} ~DBusResult() { if (m_haveOwnership && !m_replied) { try { failed(dbus_error("org.syncevolution.gdbus", "processing the method call failed")); } catch (...) { // Ignore failure, we are probably shutting down // anyway, which will tell the caller that the // method won't be processed. } } } void transferOwnership() throw () { m_haveOwnership = true; } virtual void failed(const dbus_error &error) { DBusMessagePtr errMsg(g_dbus_message_new_method_error(m_msg.get(), error.dbusName().c_str(), "%s", error.what())); sendMsg(errMsg); } virtual Watch *createWatch(const boost::function &callback) { std::auto_ptr watch(new Watch(m_conn, callback)); watch->activate(g_dbus_message_get_sender(m_msg.get())); return watch.release(); } }; class DBusResult0 : public Result0, public DBusResult { public: DBusResult0(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done() { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } sendMsg(reply); } static std::string getSignature() { return ""; } }; template class DBusResult1 : public Result1, public DBusResult { public: DBusResult1(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous; }; template class DBusResult2 : public Result2, public DBusResult { public: DBusResult2(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult1::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult1::asynchronous; }; template class DBusResult3 : public Result3, public DBusResult { public: DBusResult3(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult2::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult2::asynchronous; }; template class DBusResult4 : public Result4, public DBusResult { public: DBusResult4(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult3::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult3::asynchronous; }; template class DBusResult5 : public Result5, public DBusResult { public: DBusResult5(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult4::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult4::asynchronous; }; template class DBusResult6 : public Result6, public DBusResult { public: DBusResult6(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult5::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult5::asynchronous; }; template class DBusResult7 : public Result7, public DBusResult { public: DBusResult7(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult6::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult6::asynchronous; }; template class DBusResult8 : public Result8, public DBusResult { public: DBusResult8(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult7::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult7::asynchronous; }; template class DBusResult9 : public Result9, public DBusResult { public: DBusResult9(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult8::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult8::asynchronous; }; template class DBusResult10 : public Result10, public DBusResult { public: DBusResult10(GDBusConnection *conn, GDBusMessage *msg) : DBusResult(conn, msg) {} virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) { DBusMessagePtr reply(g_dbus_message_new_method_reply(m_msg.get())); if (!reply) { throw std::runtime_error("no GDBusMessage"); } AppendRetvals(reply) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9 << a10; sendMsg(reply); } static std::string getSignature() { return dbus_traits::getSignature() + DBusResult9::getSignature(); } static const bool asynchronous = dbus_traits::asynchronous || DBusResult9::asynchronous; }; /** * Helper class for constructing a DBusResult: while inside the * initial method call handler, we have a try/catch block which will * reply to the caller. Once we leave that block, this class here * destructs and transfers the responsibility for sending a reply to * the DBusResult instance. */ template class DBusResultGuard : public boost::shared_ptr { GDBusMessage **m_msg; public: DBusResultGuard() : m_msg(NULL) {} ~DBusResultGuard() throw () { DBusR *result = boost::shared_ptr::get(); // Our caller has not cleared its "msg" instance, // which means that from now on it will be our // responsibility to provide a response. if (result && m_msg && *m_msg) { result->transferOwnership(); } } void initDBusResult(ExtractArgs &context) { m_msg = context.m_msg; boost::shared_ptr::reset(new DBusR(context.m_conn, context.m_msg ? *context.m_msg : NULL)); } }; /** * A parameter which points towards one of our Result* structures. * All of the types contained in it count towards the Reply signature. * The requested Result type itself is constructed here. * * @param R Result0, Result1, ... * @param DBusR the class implementing R */ template struct dbus_traits_result { static std::string getType() { return DBusR::getSignature(); } static std::string getSignature() { return ""; } static std::string getReply() { return getType(); } typedef DBusResultGuard host_type; typedef boost::shared_ptr &arg_type; static const bool asynchronous = true; static void get(ExtractArgs &context, GVariantIter &iter, host_type &value) { value.initDBusResult(context); } }; template <> struct dbus_traits< boost::shared_ptr > : public dbus_traits_result {}; template struct dbus_traits< boost::shared_ptr< Result1 > >: public dbus_traits_result< Result1, DBusResult1 > {}; template struct dbus_traits< boost::shared_ptr< Result2 > >: public dbus_traits_result< Result2, DBusResult2 > {}; template struct dbus_traits< boost::shared_ptr< Result3 > >: public dbus_traits_result< Result3, DBusResult3 > {}; template struct dbus_traits< boost::shared_ptr< Result4 > >: public dbus_traits_result< Result4, DBusResult4 > {}; template struct dbus_traits< boost::shared_ptr< Result5 > >: public dbus_traits_result< Result5, DBusResult5 > {}; template struct dbus_traits< boost::shared_ptr< Result6 > >: public dbus_traits_result< Result6, DBusResult6 > {}; template struct dbus_traits< boost::shared_ptr< Result7 > >: public dbus_traits_result< Result7, DBusResult7 > {}; template struct dbus_traits< boost::shared_ptr< Result8 > >: public dbus_traits_result< Result8, DBusResult8 > {}; template struct dbus_traits< boost::shared_ptr< Result9 > >: public dbus_traits_result< Result9, DBusResult9 > {}; template struct dbus_traits< boost::shared_ptr< Result10 > >: public dbus_traits_result< Result10, DBusResult10 > {}; /** ===> 10 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); typedef boost::function M; template static M bind(Mptr C::*method, I instance) { // this fails because bind() only supports up to 9 parameters, including // the initial this pointer return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8, _9 /* _10 */); } static const bool asynchronous = dbus_traits< DBusResult10 >::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; typename dbus_traits::host_type a9; typename dbus_traits::host_type a10; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8) >> Get(a9) >> Get(a10); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8) << Set(a9) << Set(a10); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 9 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8, A9); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { // this fails because bind() only supports up to 9 parameters, including // the initial this pointer return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8, _9); } static const bool asynchronous = DBusResult9::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; typename dbus_traits::host_type a9; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8) >> Get(a9); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8) << Set(a9); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 9 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8, A9); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8, _9); } static const bool asynchronous = DBusResult9::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; typename dbus_traits::host_type a9; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8) >> Get(a9); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8) << Set(a9); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 8 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8); } static const bool asynchronous = DBusResult8::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 8 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7, A8); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7, _8); } static const bool asynchronous = DBusResult8::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; typename dbus_traits::host_type a8; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7) >> Get(a8); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7, a8); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7) << Set(a8); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 7 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6, A7); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7); } static const bool asynchronous = DBusResult7::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 7 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6, A7); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6, _7); } static const bool asynchronous = DBusResult7::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; typename dbus_traits::host_type a7; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6) >> Get(a7); (*static_cast(data))(a1, a2, a3, a4, a5, a6, a7); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6) << Set(a7); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 6 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5, A6); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6); } static const bool asynchronous = DBusResult6::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6); r = (*static_cast(data))(a1, a2, a3, a4, a5, a6); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 6 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5, A6); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5, _6); } static const bool asynchronous = DBusResult6::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5) >> Get(a6); (*static_cast(data))(a1, a2, a3, a4, a5, a6); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5) << Set(a6); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 5 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4, A5); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5); } static const bool asynchronous = DBusResult5::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5); r = (*static_cast(data))(a1, a2, a3, a4, a5); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 5 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4, A5); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4, _5); } static const bool asynchronous = DBusResult5::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4) >> Get(a5); (*static_cast(data))(a1, a2, a3, a4, a5); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4) << Set(a5); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 4 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3, A4); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4); } static const bool asynchronous = DBusResult4::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4); r = (*static_cast(data))(a1, a2, a3, a4); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3) << Set(a4); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 4 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3, A4); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3, _4); } static const bool asynchronous = DBusResult4::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3) >> Get(a4); (*static_cast(data))(a1, a2, a3, a4); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3) << Set(a4); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 3 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2, A3); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3); } static const bool asynchronous = DBusResult3::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3); r = (*static_cast(data))(a1, a2, a3); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2) << Set(a3); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 3 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2, A3); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2, _3); } static const bool asynchronous = DBusResult3::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2) >> Get(a3); (*static_cast(data))(a1, a2, a3); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2) << Set(a3); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 2 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1, A2); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2); } static const bool asynchronous = DBusResult2::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2); r = (*static_cast(data))(a1, a2); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1) << Set(a2); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 2 parameters */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1, A2); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1, _2); } static const bool asynchronous = DBusResult2::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; try { ExtractArgs(conn, msg) >> Get(a1) >> Get(a2); (*static_cast(data))(a1, a2); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1) << Set(a2); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 1 argument, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(A1); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1); } static const bool asynchronous = DBusResult1::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; typename dbus_traits::host_type a1; try { ExtractArgs(conn, msg) >> Get(a1); r = (*static_cast(data))(a1); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r << Set(a1); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 1 parameter */ template struct MakeMethodEntry< boost::function > { typedef void (Mptr)(A1); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance, _1); } static const bool asynchronous = DBusResult1::asynchronous; static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type a1; try { ExtractArgs(conn, msg) >> Get(a1); (*static_cast(data))(a1); if (asynchronous) { return NULL; } reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) << Set(a1); } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *inArgs = g_ptr_array_new(); appendNewArg(inArgs); g_ptr_array_add(inArgs, NULL); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReply(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = (GDBusArgInfo **)g_ptr_array_free(inArgs, FALSE); entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** 0 arguments, 1 return value */ template struct MakeMethodEntry< boost::function > { typedef R (Mptr)(); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance); } static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { std::auto_ptr reply; typename dbus_traits::host_type r; try { r = (*static_cast(data))(); reply.reset(g_dbus_message_new_method_reply(msg)); AppendArgs(reply) + r; } catch (...) { return handleException(msg); } return reply.release(); } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); GPtrArray *outArgs = g_ptr_array_new(); appendNewArgForReturn(outArgs); g_ptr_array_add(outArgs, NULL); entry->name = g_strdup(name); entry->in_args = NULL; entry->out_args = (GDBusArgInfo **)g_ptr_array_free(outArgs, FALSE); entry->ref_count = 1; return entry; } }; /** ===> 0 parameter */ template <> struct MakeMethodEntry< boost::function > { typedef void (Mptr)(); typedef boost::function M; template static M boostptr(Mptr C::*method, I instance) { return boost::bind(method, instance); } static GDBusMessage *methodFunction(GDBusConnection *conn, GDBusMessage *msg, void *data) { try { (*static_cast(data))(); GDBusMessage *reply = g_dbus_message_new_method_reply(msg); return reply; } catch (...) { return handleException(msg); } } static GDBusMethodInfo *make(const char *name) { GDBusMethodInfo *entry = g_new0(GDBusMethodInfo, 1); entry->name = g_strdup(name); entry->in_args = NULL; entry->out_args = NULL; entry->ref_count = 1; return entry; } }; template struct TraitsBase { typedef Cb Callback_t; typedef Ret Return_t; struct CallbackData { //only keep connection, for DBusClientCall instance is absent when 'dbus client call' returns //suppose connection is available in the callback handler const DBusConnectionPtr m_conn; Callback_t m_callback; CallbackData(const DBusConnectionPtr &conn, const Callback_t &callback) : m_conn(conn), m_callback(callback) {} }; }; struct VoidReturn {}; struct VoidTraits : public TraitsBase, VoidReturn> { typedef TraitsBase, VoidReturn> base; typedef base::Callback_t Callback_t; typedef base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &/*reply*/, const DBusConnectionPtr &/*conn*/) { return Return_t(); } static void handleMessage(DBusMessagePtr &reply, base::CallbackData *data, GError* error) { std::string error_msg; //unmarshal the return results and call user callback if (error != NULL || g_dbus_message_to_gerror(reply.get(), &error)) { if (boost::starts_with(error->message, "GDBus.Error:")) { error_msg = error->message + 12; } else { error_msg = error->message; } } if (data->m_callback) { data->m_callback(error_msg); } delete data; if (error != NULL) { g_error_free (error); } } }; template struct Ret1Traits : public TraitsBase, R1> { typedef TraitsBase, R1> base; typedef typename base::Callback_t Callback_t; typedef typename base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &reply, const DBusConnectionPtr &conn) { typename dbus_traits::host_type r; ExtractResponse(conn.get(), reply.get()) >> Get(r); return r; } static void handleMessage(DBusMessagePtr &reply, typename base::CallbackData *data, GError* error) { typename dbus_traits::host_type r; std::string error_msg; if (error == NULL && !g_dbus_message_to_gerror(reply.get(), &error)) { ExtractResponse(data->m_conn.get(), reply.get()) >> Get(r); } else if (boost::starts_with(error->message, "GDBus.Error:")) { error_msg = error->message + 12; } else { error_msg = error->message; } //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(r, error_msg); } delete data; // cppcheck-suppress nullPointer // Looks invalid: cppcheck warning: nullPointer - Possible null pointer dereference: error - otherwise it is redundant to check it against null. if (error != NULL) { g_error_free (error); } } }; template struct Ret2Traits : public TraitsBase, std::pair > { typedef TraitsBase, std::pair > base; typedef typename base::Callback_t Callback_t; typedef typename base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &reply, const DBusConnectionPtr &conn) { Return_t r; ExtractResponse(conn.get(), reply.get()) >> Get(r.first) >> Get(r.second); return r; } static void handleMessage(DBusMessagePtr &reply, typename base::CallbackData *data, GError* error) { typename dbus_traits::host_type r1; typename dbus_traits::host_type r2; std::string error_msg; if (error == NULL && !g_dbus_message_to_gerror(reply.get(), &error)) { ExtractResponse(data->m_conn.get(), reply.get()) >> Get(r1) >> Get(r2); } else if (boost::starts_with(error->message, "GDBus.Error:")) { error_msg = error->message + 12; } else { error_msg = error->message; } //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(r1, r2, error_msg); } delete data; // cppcheck-suppress nullPointer // Looks invalid: cppcheck warning: nullPointer - Possible null pointer dereference: error - otherwise it is redundant to check it against null. if (error != NULL) { g_error_free (error); } } }; template struct Ret3Traits : public TraitsBase, boost::tuple > { typedef TraitsBase, boost::tuple > base; typedef typename base::Callback_t Callback_t; typedef typename base::Return_t Return_t; static Return_t demarshal(DBusMessagePtr &reply, const DBusConnectionPtr &conn) { Return_t r; ExtractResponse(conn.get(), reply.get()) >> Get(boost::get<0>(r)) >> Get(boost::get<1>(r)) >> Get(boost::get<2>(r)); return r; } static void handleMessage(DBusMessagePtr &reply, typename base::CallbackData *data, GError* error) { typename dbus_traits::host_type r1; typename dbus_traits::host_type r2; typename dbus_traits::host_type r3; std::string error_msg; if (error == NULL && !g_dbus_message_to_gerror(reply.get(), &error)) { ExtractResponse(data->m_conn.get(), reply.get()) >> Get(r1) >> Get(r2) >> Get(r3); } else if (boost::starts_with(error->message, "GDBus.Error:")) { error_msg = error->message + 12; } else { error_msg = error->message; } //unmarshal the return results and call user callback if (data->m_callback) { data->m_callback(r1, r2, r3, error_msg); } delete data; // cppcheck-suppress nullPointer // Looks invalid: cppcheck warning: nullPointer - Possible null pointer dereference: error - otherwise it is redundant to check it against null. if (error != NULL) { g_error_free (error); } } }; template class DBusClientCall { public: typedef typename CallTraits::Callback_t Callback_t; typedef typename CallTraits::Return_t Return_t; typedef typename CallTraits::base::CallbackData CallbackData; protected: const std::string m_destination; const std::string m_path; const std::string m_interface; const std::string m_method; const DBusConnectionPtr m_conn; static void dbusCallback (GObject *src_obj, GAsyncResult *res, void *user_data) throw () { try { CallbackData *data = static_cast(user_data); GError *err = NULL; DBusMessagePtr reply(g_dbus_connection_send_message_with_reply_finish(data->m_conn.get(), res, &err)); CallTraits::handleMessage(reply, data, err); } catch (const std::exception &ex) { g_error("unexpected exception caught in dbusCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in dbusCallback()"); } } void prepare(DBusMessagePtr &msg) const { // Constructor steals reference, reset() doesn't! // Therefore use constructor+copy instead of reset(). msg = DBusMessagePtr(g_dbus_message_new_method_call(m_destination.c_str(), m_path.c_str(), m_interface.c_str(), m_method.c_str())); if (!msg) { throw std::runtime_error("g_dbus_message_new_method_call() failed"); } } void send(DBusMessagePtr &msg, const Callback_t &callback) const { CallbackData *data = new CallbackData(m_conn, callback); g_dbus_connection_send_message_with_reply(m_conn.get(), msg.get(), G_DBUS_SEND_MESSAGE_FLAGS_NONE, G_MAXINT, // no timeout NULL, NULL, dbusCallback, data); } Return_t sendAndReturn(DBusMessagePtr &msg) const { GError* error = NULL; DBusMessagePtr reply(g_dbus_connection_send_message_with_reply_sync(m_conn.get(), msg.get(), G_DBUS_SEND_MESSAGE_FLAGS_NONE, G_MAXINT, // no timeout NULL, NULL, &error)); if (error || g_dbus_message_to_gerror(reply.get(), &error)) { DBusErrorCXX(error).throwFailure(m_method); } return CallTraits::demarshal(reply, m_conn); } public: DBusClientCall(const DBusRemoteObject &object, const std::string &method) :m_destination (object.getDestination()), m_path (object.getPath()), m_interface (object.getInterface()), m_method (method), m_conn (object.getConnection()) { } GDBusConnection *getConnection() { return m_conn.get(); } std::string getMethod() const { return m_method; } Return_t operator () () { DBusMessagePtr msg; prepare(msg); return sendAndReturn(msg); } void start(const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); send(msg, callback); } template Return_t operator () (const A1 &a1) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1; return sendAndReturn(msg); } template void start(const A1 &a1, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1; send(msg, callback); } template Return_t operator () (const A1 &a1, const A2 &a2) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2; return sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9; send(msg, callback); } template void operator () (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const A10 &a10) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9 << a10; sendAndReturn(msg); } template void start(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const A10 &a10, const Callback_t &callback) const { DBusMessagePtr msg; prepare(msg); AppendRetvals(msg) << a1 << a2 << a3 << a4 << a5 << a6 << a7 << a8 << a9 << a10; send(msg, callback); } }; /* * A DBus Client Call object handling zero or more parameter and * zero return value. */ class DBusClientCall0 : public DBusClientCall { public: DBusClientCall0 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall(object, method) { } }; /** 1 return value and 0 or more parameters */ template class DBusClientCall1 : public DBusClientCall > { public: DBusClientCall1 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall >(object, method) { } }; /** 2 return value and 0 or more parameters */ template class DBusClientCall2 : public DBusClientCall > { public: DBusClientCall2 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall >(object, method) { } }; /** 3 return value and 0 or more parameters */ template class DBusClientCall3 : public DBusClientCall > { public: DBusClientCall3 (const DBusRemoteObject &object, const std::string &method) : DBusClientCall >(object, method) { } }; /** * Describes which signals are meant to be received by the callback in * a SignalWatch. Only available when using GDBus C++ for GIO (this * code here). GDBus libdbus only supports passing a DBusRemoteObject * to the SignalWatch constructors, which does a match based on object * path, interface name, and signal name. * * Traditionally, all three strings had to be given. Now if any of * them is empty, it is excluded from the filter entirely (any string * matches). * * Using this class adds the possibility to do a path prefix match or, * in the future, other kind of matches. * * TODO: add support for filtering by sender. Not doing so leads to * a situation where a malicious local process can fake signals. * * Avoid situations where different SignalWatches use exactly the same * filter. Creating both watches will work, but when one is destroyed * it might happen that the process stops receiving signals from the * D-Bus daemon because the watch for that signal filter was removed * from the connection (neither D-Bus spec nor D-Bus GIO guarantee * that the match is ref counted). */ class SignalFilter : public DBusRemoteObject { public: enum Flags { SIGNAL_FILTER_NONE, /** * Normally, a path must match completely. With this flag set, * any signal which has the given path as prefix * matches. * * The path filter must not end in a slash. * * Example: "/foo/bar/xyz" matches "/foo/bar" only if * SIGNAL_FILTER_PATH_PREFIX is set. "/foo/barxyz" does not * match it in any case. * */ SIGNAL_FILTER_PATH_PREFIX = 1<<0 }; /** * Match based on object path and interface as stored in object * and based on signal name as passed separately. Does a full * match of all unless a a string is empty, in which case * that criteria is ignored. */ SignalFilter(const DBusRemoteObject &object, const std::string &signal) : DBusRemoteObject(object), m_signal(signal), m_flags(SIGNAL_FILTER_NONE) {} /** * Full control over filtering. */ SignalFilter(const DBusConnectionPtr &conn, const std::string &path, const std::string &interface, const std::string &signal, Flags flags) : DBusRemoteObject(conn, path, interface, ""), m_signal(signal), m_flags(flags) {} const char *getSignal() const { return m_signal.c_str(); } Flags getFlags() const { return Flags(m_flags); } /** * Check that current signal matches the filter. Necessary * because GIO D-Bus does not know about "path_namespace" and * because G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE seems to disable all * signal filtering by GIO. */ bool matches(const ExtractArgs &context) const { return (m_interface.empty() || m_interface == context.m_interface) && (m_signal.empty() || m_signal == context.m_signal) && (m_path.empty() || ((m_flags & SIGNAL_FILTER_PATH_PREFIX) ? (strlen(context.m_path) > m_path.size() && !m_path.compare(0, m_path.size(), context.m_path, m_path.size()) && context.m_path[m_path.size()] == '/') : m_path == context.m_path)); } private: std::string m_signal; Flags m_flags; }; /** * Helper class for builting a match rule. */ class Criteria : public std::list { public: void add(const char *keyword, const char *value) { if (value && value[0]) { std::string buffer; buffer.reserve(strlen(keyword) + strlen(value) + 3); buffer += keyword; buffer += '='; buffer += '\''; buffer += value; buffer += '\''; push_back(buffer); } } std::string createMatchRule() const { return boost::join(*this, ","); } }; /** * Common functionality of all SignalWatch* classes. * @param T boost::function with the right signature */ template class SignalWatch : public SignalFilter { public: SignalWatch(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalFilter(object, signal), m_tag(0), m_manualMatch(false) { } SignalWatch(const SignalFilter &filter) : SignalFilter(filter), m_tag(0), m_manualMatch(false) { } ~SignalWatch() { try { if (m_tag) { GDBusConnection *connection = getConnection(); if (connection) { g_dbus_connection_signal_unsubscribe(connection, m_tag); } } if (m_manualMatch) { DBusClientCall0(GDBusCXX::DBusRemoteObject(getConnection(), "/org/freedesktop/DBus", "org.freedesktop.DBus", "org.freedesktop.DBus"), "RemoveMatch")(m_matchRule); } } catch (...) { // TODO (?): log error } } typedef T Callback_t; const Callback_t &getCallback() const { return m_callback; } protected: guint m_tag; T m_callback; bool m_manualMatch; std::string m_matchRule; void activateInternal(const Callback_t &callback, GDBusSignalCallback cb) { m_callback = callback; m_tag = g_dbus_connection_signal_subscribe(getConnection(), NULL, getInterface()[0] ? getInterface() : NULL, getSignal()[0] ? getSignal() : NULL, (!(getFlags() & SIGNAL_FILTER_PATH_PREFIX) && getPath()[0]) ? getPath() : NULL, NULL, (getFlags() & SIGNAL_FILTER_PATH_PREFIX) ? G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE : G_DBUS_SIGNAL_FLAGS_NONE, cb, this, NULL); if (!m_tag) { throw std::runtime_error(std::string("activating signal failed: ") + "path " + getPath() + " interface " + getInterface() + " member " + getSignal()); } if (getFlags() & SignalFilter::SIGNAL_FILTER_PATH_PREFIX) { // Need to set up match rules manually. Criteria criteria; criteria.push_back("type='signal'"); criteria.add("interface", getInterface()); criteria.add("member", getSignal()); criteria.add("path_namespace", getPath()); m_matchRule = criteria.createMatchRule(); DBusClientCall0(GDBusCXX::DBusRemoteObject(getConnection(), "/org/freedesktop/DBus", "org.freedesktop.DBus", "org.freedesktop.DBus"), "AddMatch")(m_matchRule); m_manualMatch = true; } } }; class SignalWatch0 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch0(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch0(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) throw () { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } const Callback_t &cb = watch->getCallback(); cb(); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch1 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch1(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch1(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) throw() { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } typename dbus_traits::host_type a1; GVariantIter iter; g_variant_iter_init(&iter, params); dbus_traits::get(context, iter, a1); const Callback_t &cb = watch->getCallback(); cb(a1); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch2 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch2(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch2(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) throw () { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; GVariantIter iter; g_variant_iter_init(&iter, params); dbus_traits::get(context, iter, a1); dbus_traits::get(context, iter, a2); const Callback_t &cb = watch->getCallback(); cb(a1, a2); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch3 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch3(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch3(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) throw () { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; GVariantIter iter; g_variant_iter_init(&iter, params); dbus_traits::get(context, iter, a1); dbus_traits::get(context, iter, a2); dbus_traits::get(context, iter, a3); const Callback_t &cb = watch->getCallback(); cb(a1, a2, a3); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch4 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch4(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch4(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) throw () { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; GVariantIter iter; g_variant_iter_init(&iter, params); dbus_traits::get(context, iter, a1); dbus_traits::get(context, iter, a2); dbus_traits::get(context, iter, a3); dbus_traits::get(context, iter, a4); const Callback_t &cb = watch->getCallback(); cb(a1, a2, a3, a4); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch5 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch5(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch5(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; GVariantIter iter; g_variant_iter_init(&iter, params); dbus_traits::get(context, iter, a1); dbus_traits::get(context, iter, a2); dbus_traits::get(context, iter, a3); dbus_traits::get(context, iter, a4); dbus_traits::get(context, iter, a5); const Callback_t &cb = watch->getCallback(); cb(a1, a2, a3, a4, a5); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; template class SignalWatch6 : public SignalWatch< boost::function > { typedef boost::function Callback_t; public: SignalWatch6(const DBusRemoteObject &object, const std::string &signal, bool = true) : SignalWatch(object, signal) { } SignalWatch6(const SignalFilter &filter) : SignalWatch(filter) {} static void internalCallback(GDBusConnection *conn, const gchar *sender, const gchar *path, const gchar *interface, const gchar *signal, GVariant *params, gpointer data) throw () { try { SignalWatch *watch = static_cast< SignalWatch *>(data); ExtractArgs context(conn, sender, path, interface, signal); if (!watch->matches(context)) { return; } typename dbus_traits::host_type a1; typename dbus_traits::host_type a2; typename dbus_traits::host_type a3; typename dbus_traits::host_type a4; typename dbus_traits::host_type a5; typename dbus_traits::host_type a6; GVariantIter iter; g_variant_iter_init(&iter, params); dbus_traits::get(context, iter, a1); dbus_traits::get(context, iter, a2); dbus_traits::get(context, iter, a3); dbus_traits::get(context, iter, a4); dbus_traits::get(context, iter, a5); dbus_traits::get(context, iter, a6); const Callback_t &cb = watch->getCallback(); cb(a1, a2, a3, a4, a5, a6); } catch (const std::exception &ex) { g_error("unexpected exception caught in internalCallback(): %s", ex.what()); } catch (...) { g_error("unexpected exception caught in internalCallback()"); } } void activate(const Callback_t &callback) { SignalWatch< boost::function >::activateInternal(callback, internalCallback); } }; } // namespace GDBusCXX #endif // INCL_GDBUS_CXX_BRIDGE syncevolution-1.5/src/gdbusxx/gdbus-cxx-bridge.cpp0000664000373300001540000004401612330727742023651 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "gdbus-cxx-bridge.h" #include #include #include #include #include #include #include #include #include #include SE_GOBJECT_TYPE(GSignondPipeStream) void intrusive_ptr_add_ref(GDBusConnection *con) { g_object_ref(con); } void intrusive_ptr_release(GDBusConnection *con) { g_object_unref(con); } void intrusive_ptr_add_ref(GDBusMessage *msg) { g_object_ref(msg); } void intrusive_ptr_release(GDBusMessage *msg) { g_object_unref(msg); } namespace GDBusCXX { using namespace SyncEvo; MethodHandler::MethodMap MethodHandler::m_methodMap; boost::function MethodHandler::m_callback; void appendArgInfo(GPtrArray *pa, const std::string &type) { // Empty if not used in the current direction (in or out), // ignore then. if (type.empty()) { // TODO: replace runtime check with compile-time check // via type specialization... not terribly important, though. return; } GDBusArgInfo *argInfo = g_new0(GDBusArgInfo, 1); argInfo->signature = g_strdup(type.c_str()); argInfo->ref_count = 1; g_ptr_array_add(pa, argInfo); } struct OwnNameAsyncData { enum State { OWN_NAME_WAITING, OWN_NAME_OBTAINED, OWN_NAME_LOST }; OwnNameAsyncData(const std::string &name, const boost::function &obtainedCB) : m_name(name), m_obtainedCB(obtainedCB), m_state(OWN_NAME_WAITING) {} static void busNameAcquired(GDBusConnection *connection, const gchar *name, gpointer userData) throw () { boost::shared_ptr *data = static_cast< boost::shared_ptr *>(userData); (*data)->m_state = OWN_NAME_OBTAINED; try { g_debug("got D-Bus name %s", name); if ((*data)->m_obtainedCB) { (*data)->m_obtainedCB(true); } } catch (...) { (*data)->m_state = OWN_NAME_LOST; } } static void busNameLost(GDBusConnection *connection, const gchar *name, gpointer userData) throw () { boost::shared_ptr *data = static_cast< boost::shared_ptr *>(userData); (*data)->m_state = OWN_NAME_LOST; try { g_debug("lost %s %s", connection ? "D-Bus connection for name" : "D-Bus name", name); if ((*data)->m_obtainedCB) { (*data)->m_obtainedCB(false); } } catch (...) { } } static void freeData(gpointer userData) throw () { delete static_cast< boost::shared_ptr *>(userData); } static boost::shared_ptr ownName(GDBusConnection *conn, const std::string &name, boost::function obtainedCB = boost::function()) { boost::shared_ptr data(new OwnNameAsyncData(name, obtainedCB)); g_bus_own_name_on_connection(conn, data->m_name.c_str(), G_BUS_NAME_OWNER_FLAGS_NONE, OwnNameAsyncData::busNameAcquired, OwnNameAsyncData::busNameLost, new boost::shared_ptr(data), OwnNameAsyncData::freeData); return data; } const std::string m_name; const boost::function m_obtainedCB; State m_state; }; void DBusConnectionPtr::undelay() const { if (!m_name.empty()) { g_debug("starting to acquire D-Bus name %s", m_name.c_str()); boost::shared_ptr data = OwnNameAsyncData::ownName(get(), m_name); while (data->m_state == OwnNameAsyncData::OWN_NAME_WAITING) { g_main_context_iteration(NULL, true); } g_debug("done with acquisition of %s", m_name.c_str()); if (data->m_state == OwnNameAsyncData::OWN_NAME_LOST) { throw std::runtime_error("could not obtain D-Bus name - already running?"); } } g_dbus_connection_start_message_processing(get()); } void DBusConnectionPtr::ownNameAsync(const std::string &name, const boost::function &obtainedCB) const { OwnNameAsyncData::ownName(get(), name, obtainedCB); } DBusConnectionPtr dbus_get_bus_connection(const char *busType, const char *name, bool unshared, DBusErrorCXX *err) { DBusConnectionPtr conn; GError* error = NULL; GBusType type = boost::iequals(busType, "SESSION") ? G_BUS_TYPE_SESSION : G_BUS_TYPE_SYSTEM; if (unshared) { char *address = g_dbus_address_get_for_bus_sync(type, NULL, &error); if(address == NULL) { if (err) { err->set(error); } return NULL; } // Here we set up a private client connection using the chosen bus' address. conn = DBusConnectionPtr(g_dbus_connection_new_for_address_sync(address, (GDBusConnectionFlags) (G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION), NULL, NULL, &error), false); g_free(address); if(conn == NULL) { if (err) { err->set(error); } else { g_clear_error(&error); } return NULL; } } else { // This returns a singleton, shared connection object. conn = DBusConnectionPtr(g_bus_get_sync(type, NULL, &error), false); if(conn == NULL) { if (err) { err->set(error); } else { g_clear_error(&error); } return NULL; } } if (name) { // Request name later in undelay(), after the caller // had a chance to add objects. conn.addName(name); // Acting as client, need to stop when D-Bus daemon dies. g_dbus_connection_set_exit_on_close(conn.get(), TRUE); } return conn; } DBusConnectionPtr dbus_get_bus_connection(const std::string &address, DBusErrorCXX *err) { // "address" needs to be the file descriptor number set up // by DBusServerCXX::listen(). GuardFD fd(atoi(address.c_str())); GSignondPipeStreamCXX stream(gsignond_pipe_stream_new(fd, fd, true), TRANSFER_REF); fd.release(); GErrorCXX gerror; GDBusCXX::DBusConnectionPtr conn(g_dbus_connection_new_sync(G_IO_STREAM(stream.get()), NULL, G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, NULL, NULL, gerror)); if (!conn && err) { err->set(gerror.release()); } return conn; } static void ConnectionLost(GDBusConnection *connection, gboolean remotePeerVanished, GError *error, gpointer data) { DBusConnectionPtr::Disconnect_t *cb = static_cast(data); (*cb)(); } static void DestroyDisconnect(gpointer data, GClosure *closure) { DBusConnectionPtr::Disconnect_t *cb = static_cast(data); delete cb; } void DBusConnectionPtr::flush() { // ignore errors g_dbus_connection_flush_sync(get(), NULL, NULL); } void DBusConnectionPtr::setDisconnect(const Disconnect_t &func) { g_signal_connect_closure(get(), "closed", g_cclosure_new(G_CALLBACK(ConnectionLost), new Disconnect_t(func), DestroyDisconnect), true); } boost::shared_ptr DBusServerCXX::listen(const NewConnection_t &newConnection, DBusErrorCXX *) { // Create two fds connected via a two-way stream. The parent // keeps fd[0] which gets closed automatically when the child // execs. The parent closes the child's fd[1] after forking. int fds[2]; int retval = socketpair(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0, fds); if (retval) { SE_THROW(StringPrintf("socketpair: %s", strerror(errno))); } GuardFD parentfd(fds[0]); GuardFD childfd(fds[1]); // Child must inherit its fd. int fdflags; if ((fdflags = fcntl(childfd, F_GETFD)) == -1 || fcntl(childfd, F_SETFD, fdflags & ~FD_CLOEXEC)) { SE_THROW(StringPrintf("fcntl: %s", strerror(errno))); } // Out listen "address" is the FD number. std::string address = StringPrintf("%d", childfd.get()); // Transfer ownership of parent fd. GSignondPipeStreamCXX stream(gsignond_pipe_stream_new(parentfd, parentfd, true), TRANSFER_REF); parentfd.release(); GErrorCXX gerror; GDBusCXX::DBusConnectionPtr connection(g_dbus_connection_new_sync(G_IO_STREAM(stream.get()), NULL, G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING, NULL, NULL, gerror), false); if (!connection) { gerror.throwError(SE_HERE, "creating GIO D-Bus connection"); } // A fake DBusServerCXX which does nothing more than return the address, aka // our FD number, and store data for the idle callback. boost::shared_ptr res(new DBusServerCXX(address)); res->m_newConnection = newConnection; res->m_connection = connection; // Will be freed in the idle callback. Caller must have forked by then. res->m_childfd = childfd.release(); // The caller must have some time to set up connection handling and fork. // Delay the newConnection() callback until we enter the main event loop // again. Callback must be removed when destructing prematurely because it // has a plain "this" pointer. res->m_connectionIdle = g_idle_add(onIdleOnce, &*res); return res; } DBusServerCXX::DBusServerCXX(const std::string &address) : m_connectionIdle(0), m_childfd(-1), m_address(address) { } DBusServerCXX::~DBusServerCXX() { if (m_connectionIdle) { g_source_remove(m_connectionIdle); } if (m_childfd >= 0) { close(m_childfd); } } gboolean DBusServerCXX::onIdleOnce(gpointer custom) { DBusServerCXX *me = static_cast(custom); me->m_connectionIdle = 0; me->m_newConnection(*me, me->m_connection); me->m_connection.reset(); close(me->m_childfd); me->m_childfd = -1; // not again return false; } void Watch::nameOwnerChanged(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { Watch *watch = static_cast(user_data); if (!watch->m_called) { gchar *name = NULL, *oldOwner = NULL, *newOwner = NULL; g_variant_get(parameters, "(sss)", &name, &oldOwner, &newOwner); bool matches = name && watch->m_peer == name && newOwner && !*newOwner; g_free(name); g_free(oldOwner); g_free(newOwner); if (matches) { watch->disconnected(); } } } void Watch::disconnected() { if (!m_called) { m_called = true; if (m_callback) { m_callback(); } } } Watch::Watch(const DBusConnectionPtr &conn, const boost::function &callback) : m_conn(conn), m_callback(callback), m_called(false), m_watchID(0) { } void Watch::setCallback(const boost::function &callback) { m_callback = callback; if (m_called && m_callback) { m_callback(); } } void Watch::activate(const char *peer) { if (!peer) { throw std::runtime_error("Watch::activate(): no peer"); } m_peer = peer; // Install watch first ... m_watchID = g_dbus_connection_signal_subscribe(m_conn.get(), NULL, // TODO org.freedesktop.DBus? "org.freedesktop.DBus", "NameOwnerChanged", "/org/freedesktop/DBus", NULL, G_DBUS_SIGNAL_FLAGS_NONE, nameOwnerChanged, this, NULL); if (!m_watchID) { throw std::runtime_error("g_dbus_connection_signal_subscribe(): NameLost failed"); } // ... then check that the peer really exists, // otherwise we'll never notice the disconnect. // If it disconnects while we are doing this, // then disconnect() will be called twice, // but it handles that. GError *error = NULL; GVariant *result = g_dbus_connection_call_sync(m_conn.get(), "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "NameHasOwner", g_variant_new("(s)", peer), G_VARIANT_TYPE("(b)"), G_DBUS_CALL_FLAGS_NONE, -1, // default timeout NULL, &error); if (result != NULL) { bool actual_result = false; g_variant_get(result, "(b)", &actual_result); if (!actual_result) { disconnected(); } } else { std::string error_message(error->message); g_error_free(error); std::string err_msg("g_dbus_connection_call_sync(): NameHasOwner - "); throw std::runtime_error(err_msg + error_message); } } Watch::~Watch() { if (m_watchID) { g_dbus_connection_signal_unsubscribe(m_conn.get(), m_watchID); m_watchID = 0; } } void getWatch(ExtractArgs &context, boost::shared_ptr &value) { std::auto_ptr watch(new Watch(context.m_conn)); watch->activate((context.m_msg && *context.m_msg) ? g_dbus_message_get_sender(*context.m_msg) : context.m_sender); value.reset(watch.release()); } void ExtractArgs::init(GDBusConnection *conn, GDBusMessage **msg, GVariant *msgBody, const char *sender, const char *path, const char *interface, const char *signal) { m_conn = conn; m_msg = msg; m_sender = sender; m_path = path; m_interface = interface; m_signal = signal; if (msgBody != NULL) { g_variant_iter_init(&m_iter, msgBody); } } ExtractArgs::ExtractArgs(GDBusConnection *conn, GDBusMessage *&msg) { init(conn, &msg, g_dbus_message_get_body(msg), NULL, NULL, NULL, NULL); } ExtractArgs::ExtractArgs(GDBusConnection *conn, const char *sender, const char *path, const char *interface, const char *signal) { init(conn, NULL, NULL, sender, path, interface, signal); } ExtractResponse::ExtractResponse(GDBusConnection *conn, GDBusMessage *msg) { init(conn, NULL, g_dbus_message_get_body(msg), g_dbus_message_get_sender(msg), NULL, NULL, NULL); } } // namespace GDBusCXX syncevolution-1.5/src/gdbusxx/gdbus-cxx.h0000644000373300001540000001365412326412403022054 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_GDBUS_CXX #define INCL_GDBUS_CXX #include #include #include #include namespace GDBusCXX { /** * An exception class which can be thrown to create * specific D-Bus exception on the bus. */ class dbus_error : public std::runtime_error { public: /** * @param dbus_name the D-Bus error name, like "org.example.error.Invalid" * @param what a more detailed description */ dbus_error(const std::string &dbus_name, const std::string &what) : std::runtime_error(what), m_dbus_name(dbus_name) {} ~dbus_error() throw() {} const std::string &dbusName() const { return m_dbus_name; } private: std::string m_dbus_name; }; /** * Special parameter type that identifies a D-Bus bus address. A string in practice. */ class Caller_t : public std::string { public: Caller_t() {} template Caller_t(T val) : std::string(val) {} template Caller_t &operator = (T val) { assign(val); return *this; } }; /** * Special parameter type that identifies the path in a D-Bus message. A string in practice. */ class Path_t : public std::string { public: Path_t() {} template Path_t(T val) : std::string(val) {} template Path_t &operator = (T val) { assign(val); return *this; } }; /** * Special parameter type that identifies the interface in a D-Bus message. A string in practice. */ class Interface_t : public std::string { public: Interface_t() {} template Interface_t(T val) : std::string(val) {} template Interface_t &operator = (T val) { assign(val); return *this; } }; /** * Special parameter type that identifies the member of an interface * (= signal or method) in a D-Bus message. A string in practice. */ class Member_t : public std::string { public: Member_t() {} template Member_t(T val) : std::string(val) {} template Member_t &operator = (T val) { assign(val); return *this; } }; class Watch; /** * Call object which needs to be called with the results * of an asynchronous method call. So instead of * "int foo()" one would implement * "void foo(Result1 > *r)" * and after foo has returned, call r->done(res). Use const * references as type for complex results. * * A Result instance can be copied, but only called once. */ class Result { public: virtual ~Result() {} /** report failure to caller */ virtual void failed(const dbus_error &error) = 0; /** * Calls the given callback once when the peer that the result * would be delivered to disconnects. The callback will also be * called if the peer is already gone by the time that the watch * is requested. * * Alternatively a method can ask to get called with a life Watch * by specifying "const boost::shared_ptr &" as parameter * and then calling its setCallback(). */ virtual Watch *createWatch(const boost::function &callback) = 0; }; class Result0 : virtual public Result { public: /** tell caller that we are done */ virtual void done() = 0; }; template class Result1 : virtual public Result { public: /** return result to caller */ virtual void done(A1 a1) = 0; }; template struct Result2 : virtual public Result { virtual void done(A1 a1, A2 a2) = 0; }; template struct Result3 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3) = 0; }; template struct Result4 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4) = 0; }; template struct Result5 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) = 0; }; template struct Result6 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) = 0; }; template struct Result7 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) = 0; }; template struct Result8 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) = 0; }; template struct Result9 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) = 0; }; template struct Result10 : virtual public Result { virtual void done(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) = 0; }; } // namespace GDBusCXX #endif // INCL_GDBUS_CXX syncevolution-1.5/src/gnome-bluetooth/0000755000373300037200000000000012424707642021603 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/gnome-bluetooth/gnome-bluetooth.am0000644000373300001540000000115012326412403025036 0ustar00nightlynightly00000000000000src_gnome_bluetoothdir = $(GNOMEBLUETOOTH_DIR)/plugins/ src_gnome_bluetooth_LTLIBRARIES = src/gnome-bluetooth/libgbtsyncevolution.la src_gnome_bluetooth_libgbtsyncevolution_la_SOURCES = src/gnome-bluetooth/syncevolution.c src_gnome_bluetooth_libgbtsyncevolution_la_LDFLAGS = -module -avoid-version src_gnome_bluetooth_libgbtsyncevolution_la_LIBADD = $(GUI_LIBS) $(DBUS_GLIB_LIBS) src_gnome_bluetooth_libgbtsyncevolution_la_CPPFLAGS = \ $(GNOMEBLUETOOTH_CFLAGS) \ -DLOCALEDIR=\"$(SYNCEVOLUTION_LOCALEDIR)\" src_gnome_bluetooth_libgbtsyncevolution_la_CFLAGS = $(SYNCEVO_WFLAGS) $(GUI_CFLAGS) $(DBUS_GLIB_CFLAGS) syncevolution-1.5/src/gnome-bluetooth/syncevolution.c0000644000373300001540000000742412326412403024506 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #define SYNCUI_BINARY "sync-ui" #define SYNCUI_ARG "--show-settings obex+bt://" /*Only detecting SyncML Client*/ static gboolean has_config_widget (const char *bdaddr, const char **uuids) { int i; if (uuids == NULL) { return FALSE; } for (i = 0; uuids[i] != NULL; i++) { if (!g_strcmp0 (uuids[i], "SyncMLClient")) { //find whether "sync-ui" is available if (g_find_program_in_path (SYNCUI_BINARY) == NULL) { return FALSE; } return TRUE; } } return FALSE; } static void button_clicked (GtkButton *button, gpointer user_data) { const char *bdaddr; pid_t midman; pid_t syncui; char args[sizeof (SYNCUI_ARG) + sizeof ("FF:FF:FF:FF:FF:FF")]; bdaddr = g_object_get_data (G_OBJECT (button), "bdaddr"); midman = fork (); if (midman == 0) { //in midman process syncui = fork(); if (syncui == 0) { // in syncui process strcpy (args, SYNCUI_ARG); strncat (args, bdaddr, sizeof ("FF:FF:FF:FF:FF:FF")); if (execlp (SYNCUI_BINARY, args, NULL) == -1){ g_warning ("SyncEvolution plugin failed to launch sync-ui!"); exit (-1); } } else if (syncui == -1) { // error in forking sub process g_warning ("SyncEvolution plugin failed to launch sync-ui!"); exit (-1); } else { //do nothing, just exit. This will cause sync-ui //process an orphan. exit (0); } } else if (midman == -1) { //error in forking sub process g_warning ("SyncEvolution plugin failed to launch sync-ui!"); } else { //in bluetooth-panel process if (waitpid (midman, NULL, 0) == -1){ //error in waitpid g_warning ("SyncEvolution plugin failed to launch sync-ui!"); } } } static GtkWidget * get_config_widgets (const char *bdaddr, const char **uuids) { GtkWidget *hbox; GtkWidget *button; GtkWidget *label1; GtkWidget *label2; int label_max_width = 40; int button_max_width = 10; hbox = gtk_hbox_new (FALSE, 6); gtk_widget_show (hbox); label1 = gtk_label_new (_("Sync in the Sync application")); gtk_label_set_max_width_chars (GTK_LABEL(label1), label_max_width); label2 = gtk_label_new (_("Sync")); gtk_label_set_max_width_chars (GTK_LABEL(label2), button_max_width); button = gtk_button_new (); gtk_container_add (GTK_CONTAINER(button), label2); g_object_set_data_full (G_OBJECT (button), "bdaddr", g_strdup (bdaddr), g_free); gtk_widget_show (label1); gtk_widget_show_all (button); gtk_box_pack_start (GTK_BOX(hbox), label1, FALSE, FALSE, 6); gtk_box_pack_end (GTK_BOX(hbox), button, FALSE, FALSE, 6); /* And set the signal */ g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (button_clicked), NULL); return hbox; } static void device_removed (const char *bdaddr) { //nothing todo } static GbtPluginInfo plugin_info = { "SyncEvolution", has_config_widget, get_config_widgets, device_removed }; GBT_INIT_PLUGIN(plugin_info) syncevolution-1.5/src/gtk-ui/0000755000373300037200000000000012424707642017673 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/gtk-ui/README0000644000373300001540000000065212326412403020365 0ustar00nightlynightly00000000000000SyncEvolution Graphical User Interface for Moblin * Running Syncevolution D-Bus service must be either running or installed properly (so DBus autostart works). the client itself must be installed so glade ui file and rc style file get found. * Support This is the GTK+-2.0 version of the client. It is supported but sohuld be considered to be in maintenance mode: Please consider the version in src/gtk3-ui. syncevolution-1.5/src/gtk-ui/sync.desktop.in0000644000373300001540000000023512326412403022456 0ustar00nightlynightly00000000000000[Desktop Entry] _Name=Sync _Comment=Up to date Version=1.0 Type=Application Exec=sync-ui Icon=sync Categories=Network;GTK; Terminal=false StartupNotify=true syncevolution-1.5/src/gtk-ui/sync-gtk.desktop.in0000644000373300001540000000027112326412403023241 0ustar00nightlynightly00000000000000[Desktop Entry] _Name=SyncEvolution (GTK) _Comment=Synchronize PIM data Version=1.0 Type=Application Exec=sync-ui Icon=sync Categories=Office;PDA;GTK; Terminal=false StartupNotify=true syncevolution-1.5/src/gtk-ui/sync.png0000644000373300001540000000602712326412403021171 0ustar00nightlynightly00000000000000‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe< ¹IDATxÚÔY[lÕþç²»ã]ïz½ëõ&±M.ŽãpI 4‚†Š*Q¤¶© UªèRÕŠ¶B¢ U[P€>ÐVä¡€RûÒÒJTôBÓÐT¤Š+äBâ@b'¾Ækï®÷:×~ÿÙ™½xmC™p¤Ï™™sÎ|ÿý?³ÒÑ£Gé³ÜdúŒ7u¥‡SSS: ùV›Ê­Y³¦´Ò$iÇŽtüøñ†›/½ô’ÝZÐç5M»½­­m—ã8þÕD/I’>33sï=†Ë,Ͻ{÷šõs{ƒnx}ŽöO¿ÆßÐÖuuÝÖÞÞîí¸ºòwÚ¸iÓ™L†FÏŸ¹P(<Á¾ýdòýÍݱM¨§££ã`ïæÍÛE¡39›þ8mÒæM*««cEÓ ë#*Ý“Ph;ØÚÚºgøÔ)>Ÿÿ.-ë~ÝÁ¹?4oÑC#eŠ$Ú(Ô£ GXf™6 ¦‹ôÚÐý¤_£¯vk´¹¯ï®o½µ'÷VücÉ(ÔÇ¿çóU$}ð\‰¢í¤µÕ±Û¡rÑ¢rÉ&Ÿ ö®==¼ ž…B!òûý÷aؾRM4íïâlÉ!Ëêø®iØTxËrª÷ŸJe_€ŒÊ=øãnt‰•Âh<ØÒ",…}ø>M¦¯Ä}´½U¡¾–FYäd(gÑÑŒI›3W;‘^¶È4e§œÉš´ïQT5ÎWd ˆÁ^.-yÖú%zô*np¯mzV$ÁÐî6Uлzb¬L¯gÌf“¹Øöòà}šŸàÂŒ‚A[‰Ÿ¿"õ ‹ÍQ‡=zU€Z’?3ÎÀ,1^jO0úÔF¾}º@#%» ¾“qœ(d™ÞÍt[2@þŠpãKúb¬_ƒÄU‘hÞ"y‘ØdƒgiÞ=\æágÍð¯ñœÏ!ýýþ’AaUæ¶9 }(ðBš¯êþŠpÀ*/¥°ªª×0Ç–H 4*è©M-¢æõãsÍþÅþ `îûÍöWL¥[]3âvo¢Q£ƒ`ð•ޤ ˜‰³¬Ø<Þ7[–dˆ‹hoŶ{ïà­2yÛÞÕ® s;0Z¢¥^Çà¹íàýðo¾Çt 3e›ÖAKý!…nÄ<¦‡7:ô³‘ý+e4k HWÌŽs„|ˆ.Å@“ÞEž×(2™®yÜêJqÎqÁµãåš'éIÝ¡ç&Ëô—YC„GŽñõíK>úV—F7EUúÕÕ!úó´NžÎ/®Šà5çF£[§§§;0¼¸8ăÁZÆ)Ø¢þ±m[PØ 8ƒp(ïÞbZ*Zýt½Fûâ*s:Ù–Õ@‡§KtÿPš~1"„I_OúéÌpñÇ(°n%NÞ ä¡w®õ’EÐ\w‹B7¹&8œ]Úa_8Ÿ£;~ÚóÓƒ›‚thªX3"ÓËHf Èn „v«n „øÉ¦× Æ—§+r’úцf5דeZ´høöý{w‚~wS¬J|’%×ýébÅþ¯û„ùy÷I䂊p˜çpÏa¿Þ"(à®óЏ!„7æÚ‚rØ‚Y»‰ê}«~Õå.uN·zU©ZB×x‹Od¡6É'Ò}}ËÚíyãíï‹Ðý=!êÒzrkDÐÀl©AÊ×¶Õ Á,*ÍW' ´o}«[F@ªV³SãtÙ¬ÎYœ±qÀY_*•¸¤x¯Ê@8Q«GGãà%ËŽï¦éÅÑ=¸¡•¾œl€oîh>3\€ãÿa4KÏd0G©1DKE²z#U†OΗ žÁTÍaêA¯&òˆ©ªZMCiƒ”ʆe0u“ΦËôƒñJÔ¹6꧈_}V·1–éTZ§™Z$É""Ýsdœz`RSZ\çþzg§XÏíyH²–/”`î499Yaà‘Gá½:ZÜ"®Z¿-’›7P»/6­Ssi LåéÚöºs½â/ÿ—˜ùê<~>° 3ûØöNÚ·¡"ýSóe¬›mþJ r¥çWØU hðì ^JW–ã2`"ª0p˰?ÔÉ*]2¡Khä±í z ?JÏž§éÀÕÌâædîìÓ½›Úð%ºûðXõÝ‹>RÔýpdû¾(7Û¸@òB(›YÒÉ,Ê"ž“C—ÕÆtºã¯çè™[ÖÒ-Éõ„|ôøŽÎ\÷ì;sôôÛ—„ .]–J48§ È•¢n›aÂqã°©«½yoL穜7ÈQ>úWÇ1äo¼zžnY¢ûz£¢ïim>]Èô÷±,À§ÄxÅ]u*` €~0Ð!€ôMUÛ¦ÛŽM,âÖÆN«EªcSùËýÎ%|€ú*×---=ÅbQ0ÀI¬*n1 ³?éïpYÄõÉ\]‘|ù_êêJ Eä/þñNa"IàØ'ìÞqèJnRsœ¥R­týZvÅ‚¾-YËî.æ„/wOL on ^qàùó¢‡ ¶OóóóœÑ{UÔÁp8B'O½C7\ÿ91áákZ1¹…^¹XºB$ ~·ÒaA¾‰rB屬æóù÷£Ñv»pÕd‘®Á` ­Ã!ä;}¡+J ©Ô<9L ¹­MvÒ\¡ðžšÍf‡;;õQ¿ß·~6•¢Ã¯¡¶H„â1Rþüé:3,K”Íd)“ÍV¿Nض9™N§Ï¨8áá0ÿlWW÷ϧff}\%òD&˲Dåø©þ‰‡hS%yœLĉ‰ñßÌÌÌœS¶mÛ6M3mšÆÙh[$áó’ºnTËÞO=\BÞ7ZM PÀïžœœ88>>>077—BFV xôl¡P8Š£8,l hÚFY’{pò Ÿ¨ÈGÆX®ÏC’878ŸDÎsê{ìkêG’ G–M¼gz6;:—ËÉd2cår9ã÷ûutØ”sYH¥R£ îÀ&!ôA†±ß­\å:ªJè£$Öj~mÔ²]G ZÇþ%Pã<÷üE}‹0w]pC®™ìîÈ‹uÜ×q›O$~Ö $±ÛcécÚ¸SωÛÛèL÷¯VÆRÂÂÿÈîÁž¥Q»JXÌÊÿNv%3ÃFL83ã´Ô©©)«»»ÛAyêèºnx’ì–« 6’YêÜ3pOÒœÒ9O°Vêãôå2báUÀûã]–qNam°,”<¬&o!oÙ¨‡¬ÙÙY[íëës ‹U‡ÐÄH,‹2&K\opïš™„0+úO2Oxà0$+z¾ Ìœ ¡Šﵑ…-"Uoo¯£Äb1g×®]„šH, …BÊ ÁT4µ±!/´’ɤŠ̱$LlÄ6j¹¶*úË%ÜÃT,€6yo–6ÞkBºl f"² é«ÍŒ0[¶lqœÿ 0-:1€´ò IEND®B`‚syncevolution-1.5/src/gtk-ui/sync-generic.png0000644000373300001540000000320512326412403022576 0ustar00nightlynightly00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDATxœí›kˆUUÇkœÑñ9F˜Yá K²Š„BCRŒ$F˜ÈB B ‹š¬(°¨¬/’Hù¥¨Œ¢¨B‚(ûP™½èæk¤ÌrLK«©ttVö:s÷ܹsιwö¹ÇafÁæœYóßk¯ó?û±Ö>ûŠªÒŸ¥6º‘Ÿq@{ ÛuÀaUÈ^&"Q‘Lº‚ªJvCIm ÝÐ@¶ÿ d'SéF€ªþ°Èýâ;¥T@DF¿ÛŸGRØàlà/U=+oU‘’5À »[†½½s§úÒÑ08 LHag° ø'„SÕ”žˆDUõP’‰ësAEMÞä-äí@Þ’4d""2h¦[™‚ ÁÛ€¿`«•mªšYPÕ-VU‘z\$§Àá4v€s€SªZWl¯Xä p^JÛ€—€uªº/eÔ’D@¹Ò¡ªƒŠíukT¤¸Ø ìvã†ãH+Ók¬ÌÄܼ ¬TÕÖ |+)Î5:¶nªÀo)íŒNªêV?Z;èEV("Sf`10ÄüYªª›+±WJÔ+GU•Åí´ÀÞùÀ»žÍõXî¥ÝNƒõ¡Þ3^ŠÏær\Ä©À†`„~x¯àöY kûfw..gQ`I¥v„Bü~"МR,C ›!Y ¼¦©jšÔ½›¡ëD˜E9Râ ï˜-À—ÀÀ=À°”=á=kccE=ÉŒÔgX†9,À“¸'Ž´V`UÀ$ óÁ¥P­ ^3g;p¡îr`<0¸ ¸ øÂ#b P—`w½a×åBP“3 øÐ=ÌNÀϤéÞÀÑPW•ààðh œÚC]’ÒöeÀŸVï±ì7†k¬ÀÍÀikxS n8.©R`®§¯¾Žãr‚ýqÌ·zmqó°Æp««Bp‹½ùh¬.‹ÁÞg˜ížn(…¼¸t÷ÀvÓ7Å´q‡a^.ç9*Ú‘EÀ«¸ãSï©2ß®Ïxº;qãüЈKÈn~æ{Ø·ìÚÓFäÇä÷»J…o?ŠÖ{ì~j þ+Ã\éév˜nAvéw{ºi¦kic’ad>€¥¸”ÜŽ£cðû 3ÙÓ7ÝØ"lƒéOxº©¦ÛÓF”xµãbFàÞÌæ¯á]ÖðôL«a&xºïL·°;Çôû=ÝÕ¦ÛÓÆDÃü,ÃÅ'I¤BlŠFcR æ#»Þäé^·ë³"2ODDäÜöÀóvŠ]Æ´µxÎîWªjüÇš=`Žù1˜&Ã|êéj÷)½ | Œô°Qd¸<¦Û½úĬJ¡‡@3 a(. ŒbÿëŠô͸õÿ8°x/À­ üJ̦ ðb¹Š€ÙÆ^!1.ŠÂàr"Á(nNÀ.³îÿDYþ @pkp—(¯\”®O°;ŸB¼…”éqÙþ1«ÍÑ7pƒ)$D lnÅmOÃm‡¯>÷0IÈÏ&âÂâv`Fv(p7n;¾Ô•6¬3†{°µÞ[M“×wᶺ?³ °x·jtëò¸ˆ²÷Ѧ§r ø¸ Ú §ñ%F`¶×cŠËž4$„v0J]O‹2$ n n¬õÂT$dñ–î§“/ l[MkHKBpÌhUèžj«I@9$dB€9ð…Ý¢O€‹ªI@Z2#À¸øÑ›63«E@ ZŠÿßy> +‘ÑÀSÀÜ$…½­Ö3¾ÆE|ÑÞþ…¸€èbà{U}Á³åX(ó+“ˆ4àBðnu3'Àsb îÀ ÜY‚4rXU;jVJ@\ݪà9RƒKrfY‹!FàBå}¸“#;Íj.¬nß' 7’ýþ˜Üy;· ·yËy;· ·yK.Çå{+"ìø|_#`7.[¬Oö ÇŠ}*‘: ?é+K´ÄBû¡¥ßO‚ÿ([žMFd¤ÀIEND®B`‚syncevolution-1.5/src/gtk-ui/sync-spinner.gif0000644000373300001540000000414612326412403022626 0ustar00nightlynightly00000000000000GIF89añ½½½¾¾¾¿¿¿!ù !ÿ NETSCAPE2.0,7œ©Ëí¢ˆ/Eyo½3g‡yb#uáW)cj¡ì±¾+{2L¿ö½×ý& è‚C"ˤá%o̦3Q!ù ,Hœ©Ëí¢BÉ5œ€žL‰À‹¼¥3=€a"رþÃÕtÄëV’Êñh!j¦Ôª¡!ù ,Nœ©Ëíã@.„°ÓÊ ^¶…Ù rÔ'¥ÇŠ9c¢‘Í woCÊàh²C°ä£!^Ñ‹¢¤O×Çùñ쎣f5Ñ%~]]ëŒN !ù ,Hœ©Ëí‡"®IE€Îº ncVZç§µ¢‡0%K(”h­8)`¯Ë§'!Q˜Åê÷:•ÔNŠE³¬Èí“ ‹Ã!ù ,‚½½½¾¾¾¿¿¿ÀÀÀ?HºÜþ0JÂŒ5_—û^öa5’å‰fƒºšnËj:‹u×r”Õ”>í,bж2\–ÁÉ 0õ¸®Ø,!!ù ,‚½½½¾¾¾¿¿¿ÀÀÀ6HºÜþ0JªÎj¼´çŠ·qâEŠ`÷¥áÈ¢,µ¾3mưí†Xé‘_Í1+½Ÿîk:Ÿ‹!ù ,2œ©Ëí¢ /Í[ÇÝuóç R÷efhª­iùºñÈžSÝÊ™wï¼èûE‚žY‡L* !ù ,5œ©Ëí¢ŒÍ*Þnóæa XYW™œèA®C»Âñ䲪{ YâÞŒÑù&Ý%«)—ÌA!ù ,7œ©Ëí¢ŒïÌ+Þ¡qÎ|Û2"Sx…ÞY%X린%Ïk—ëo¾Ø@ÀßÐxPz̦ÓP!ù ,Jœ©ËíDœà*s~SãØtŸÕb–^' b‹¨'ò.ªR詤l¡å‚ )!c)ÉÒ#=¤èY›J~ÓäµKåÇän!ù ,<œ©Ëí¢ŒÍKÞ¡qÎ|`²‘—‚-§)…ëñ¢­ËòT©xÎ À£ † lg„Ì’Ê"³ùŒJ§TD!ù ,<œ©Ëí¢Œïˆ‰©Ë<´Þ1`˜p%¦d‹Š âÔº+|°³tâŸ^Óß­©¤x\“‹ ó J§TC!ù ,:œ©Ëí¢ŒïÌ+ÞÁñÍ|œ"y-i²¢û†14«õÜæg²oÚ(¨Ê c3z”̦ó J¥!ù ,‚¼¼¼½½½¾¾¾¿¿¿9HºÜþ0J%ª­“Ý%ÿB‚ÐH6ŸÆ9+{¹V¹¡¯«S·âž™j"DkXrÉl:ŸÐ¨ô™!ù ,Hœ©Ëí&@œàIóË@JÚxž@ÕòEÝÈ)kG"ð¨¨ß¢%ØéæGê0é:šÌ27>¤a&p"ZRˆ±šÄ`‘­÷ ‹!ù ,Kœ©Ëí&"S #include #include #include "config.h" #include "sync-ui.h" static char *settings_id = NULL; static GOptionEntry entries[] = { { "show-settings", 0, 0, G_OPTION_ARG_STRING, &settings_id, "Open sync settings for given sync url or configuration name", "url or config name" }, { NULL } }; static void set_app_name_and_icon () { /* TRANSLATORS: this is the application name that may be used by e.g. the windowmanager */ g_set_application_name (_("Sync")); gtk_window_set_default_icon_name ("sync"); } static void init (int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; gtk_init (&argc, &argv); bindtextdomain (GETTEXT_PACKAGE, SYNCEVOLUTION_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); context = g_option_context_new ("- synchronise PIM data with Syncevolution"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_add_group (context, gtk_get_option_group (TRUE)); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_warning ("option parsing failed: %s\n", error->message); } } #ifdef ENABLE_UNIQUE #include enum { COMMAND_0, COMMAND_SHOW_CONFIGURATION /* no sync-ui specific commands */ }; static UniqueResponse message_received_cb (UniqueApp *app, gint command, UniqueMessageData *message, guint time_, app_data *data) { char *arg; GtkWindow *main_win; main_win = sync_ui_get_main_window (data); switch (command) { case UNIQUE_ACTIVATE: if (GTK_IS_WINDOW (main_win)) { /* move the main window to the screen that sent us the command */ gtk_window_set_screen (GTK_WINDOW (main_win), unique_message_data_get_screen (message)); gtk_window_present (GTK_WINDOW (main_win)); } break; case COMMAND_SHOW_CONFIGURATION: arg = unique_message_data_get_text (message); if (GTK_IS_WINDOW (main_win) && arg) { /* move the main window to the screen that sent us the command */ gtk_window_set_screen (GTK_WINDOW (main_win), unique_message_data_get_screen (message)); sync_ui_show_settings (data, arg); } break; default: break; } return UNIQUE_RESPONSE_OK; } int main (int argc, char *argv[]) { UniqueApp *app; init (argc, argv); app = unique_app_new_with_commands ("org.Moblin.Sync", NULL, "show-configuration", COMMAND_SHOW_CONFIGURATION, NULL); if (unique_app_is_running (app)) { UniqueMessageData *message = NULL; UniqueCommand command = UNIQUE_ACTIVATE; if (settings_id) { command = COMMAND_SHOW_CONFIGURATION; message = unique_message_data_new (); unique_message_data_set_text (message, settings_id, -1); } unique_app_send_message (app, command, message); unique_message_data_free (message); } else { app_data *data; set_app_name_and_icon (); data = sync_ui_create (); if (data) { /* UniqueApp watches the main window so it can terminate * the startup notification sequence for us */ unique_app_watch_window (app, sync_ui_get_main_window (data)); /* handle notifications from new app launches */ g_signal_connect (app, "message-received", G_CALLBACK (message_received_cb), data); if (settings_id) { sync_ui_show_settings (data, settings_id); } gtk_main (); } } g_object_unref (app); return 0; } #else int main (int argc, char *argv[]) { app_data *data; init (argc, argv); set_app_name_and_icon (); data = sync_ui_create (); if (settings_id) { sync_ui_show_settings (data, settings_id); } gtk_main (); return 0; } #endif /* ENABLE_UNIQUE */ syncevolution-1.5/src/gtk-ui/sync-ui.c0000644000373300001540000036356012326412403021252 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include "syncevo-server.h" #include "syncevo-session.h" /* for return value definitions */ /* TODO: would be nice to have a non-synthesis-dependent API but for now it's like this... */ #include #include "config.h" #include "sync-ui-config.h" #include "sync-ui.h" #include "sync-config-widget.h" /* local copy of GtkInfoBar, used when GTK+ < 2.18 */ #include "gtkinfobar.h" #ifdef USE_MOBLIN_UX #include "mux-frame.h" #ifdef MX_GTK_0_99_1 #include #else #include #endif #endif static gboolean support_canceling = FALSE; #define REPORTS_PER_CALL 10 #define SYNC_UI_ICON_SIZE 48 #define STRING_VARIANT_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) enum { PAGE_MAIN, PAGE_SETTINGS, PAGE_EMERGENCY, }; typedef enum bluetooth_type { SYNC_BLUETOOTH_NONE, SYNC_BLUETOOTH_GNOME, SYNC_BLUETOOTH_MOBLIN } bluetooth_type; typedef enum app_state { SYNC_UI_STATE_CURRENT_STATE, SYNC_UI_STATE_GETTING_SERVER, SYNC_UI_STATE_NO_SERVER, SYNC_UI_STATE_SERVER_OK, SYNC_UI_STATE_SERVER_FAILURE, SYNC_UI_STATE_SYNCING, } app_state; typedef enum ui_operation { OP_SYNC, /* use sync mode from config */ OP_SYNC_SLOW, OP_SYNC_REFRESH_FROM_CLIENT, OP_SYNC_REFRESH_FROM_SERVER, OP_SAVE, OP_RESTORE, } ui_operation; typedef struct operation_data { app_data *data; ui_operation operation; gboolean started; const char *dir; /* for OP_RESTORE */ } operation_data; struct _app_data { GtkWidget *sync_win; GtkWidget *services_win; /* will be NULL when USE_MOBLIN_UX is set*/ GtkWidget *emergency_win; /* will be NULL when USE_MOBLIN_UX is set*/ #ifdef USE_MOBLIN_UX GtkWidget *notebook; /* only in use with USE_MOBLIN_UX */ GtkWidget *back_btn; /* only in use with USE_MOBLIN_UX */ #endif GtkWidget *settings_btn; /* only in use with USE_MOBLIN_UX */ guint settings_id; GtkWidget *service_box; GtkWidget *info_bar; GtkWidget *no_connection_box; GtkWidget *main_frame; GtkWidget *log_frame; GtkWidget *server_icon_box; GtkWidget *offline_label; GtkWidget *progress; GtkWidget *sync_status_label; GtkWidget *spinner_image; GtkWidget *sync_btn; GtkWidget *change_service_btn; GtkWidget *emergency_btn; GtkWidget *server_label; GtkWidget *autosync_box; GtkWidget *autosync_toggle; GtkWidget *last_synced_label; GtkWidget *sources_box; GtkWidget *new_service_btn; GtkWidget *new_device_btn; GtkWidget *services_box; GtkWidget *devices_box; GtkWidget *scrolled_window; GtkWidget *expanded_config; GtkWidget *settings_close_btn; GtkWidget *emergency_label; GtkWidget *emergency_expander; GtkWidget *emergency_source_table; GtkWidget *refresh_from_server_btn_label; GtkWidget *refresh_from_client_btn_label; GtkWidget *emergency_backup_table; GtkWidget *emergency_close_btn; GtkWidget *password_dialog_entry; char *password_dialog_id; gboolean forced_emergency; GHashTable *emergency_sources; guint backup_count; gboolean online; gboolean syncing; gboolean synced_this_session; int last_sync; guint last_sync_src_id; ui_operation current_operation; server_config *current_service; app_state current_state; guint service_list_updates_left; gboolean open_current; /* should the service list open the current service when it populates next time*/ char *config_id_to_open; SyncevoServer *server; SyncevoSession *running_session; /* session that is currently active */ bluetooth_type bluetooth_wizard; }; static void set_sync_progress (app_data *data, float progress, char *status); static void set_app_state (app_data *data, app_state state); static void show_main_view (app_data *data); static void update_emergency_view (app_data *data); static void update_emergency_expander (app_data *data); static void show_emergency_view (app_data *data); static void show_services_list (app_data *data, const char *config_id_to_open); static void update_services_list (app_data *data); static void update_service_ui (app_data *data); static void setup_new_service_clicked (GtkButton *btn, app_data *data); static gboolean source_config_update_widget (source_config *source); static void get_presence_cb (SyncevoServer *server, char *status, char **transport, GError *error, app_data *data); static void get_reports_cb (SyncevoServer *server, SyncevoReports *reports, GError *error, app_data *data); static void start_session_cb (SyncevoServer *server, char *path, GError *error, operation_data *op_data); static void get_config_for_main_win_cb (SyncevoServer *server, SyncevoConfig *config, GError *error, app_data *data); void toggle_set_active (GtkWidget *toggle, gboolean active) { #ifdef USE_MOBLIN_UX /* MxGtkLightSwitch does not have "active" property yet */ mx_gtk_light_switch_set_active (MX_GTK_LIGHT_SWITCH (toggle), active); #else g_object_set (toggle, "active", active, NULL); #endif } gboolean toggle_get_active (GtkWidget *toggle) { #ifdef USE_MOBLIN_UX /* MxGtkLightSwitch does not have "active" property yet */ return mx_gtk_light_switch_get_active (MX_GTK_LIGHT_SWITCH (toggle)); #else gboolean active; g_object_get (toggle, "active", &active, NULL); return active; #endif } void show_error_dialog (GtkWidget *widget, const char* message) { GtkWindow *window = GTK_WINDOW (gtk_widget_get_toplevel (widget)); GtkWidget *w; w = gtk_message_dialog_new (window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", message); gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (w); } static void remove_child (GtkWidget *widget, GtkContainer *container) { gtk_container_remove (container, widget); } static void change_service_clicked_cb (GtkButton *btn, app_data *data) { /* data->open_current = TRUE; */ show_services_list (data, NULL); } static void emergency_clicked_cb (GtkButton *btn, app_data *data) { show_emergency_view (data); } char* get_pretty_source_name (const char *source_name) { /* TRANSLATORS: There have been name changes to keep things in line with * the rest of the moblin UI. Please make sure the name you use matches * the ones in e.g. the panels. */ if (strcmp (source_name, "addressbook") == 0) { return g_strdup (_("Contacts")); } else if (strcmp (source_name, "calendar") == 0) { return g_strdup (_("Appointments")); } else if (strcmp (source_name, "todo") == 0) { return g_strdup (_("Tasks")); } else if (strcmp (source_name, "memo") == 0) { return g_strdup (_("Notes")); } else if (strcmp (source_name, "calendar+todo") == 0) { /* TRANSLATORS: This is a "combination source" for syncing with devices * that combine appointments and tasks. the name should match the ones * used for calendar and todo above */ return g_strdup (_("Appointments & Tasks")); } else { char *tmp; tmp = g_strdup (source_name); tmp[0] = g_ascii_toupper (tmp[0]); return tmp; } } char* get_pretty_source_name_markup (const char *source_name) { char *plain, *markup; plain = get_pretty_source_name (source_name); markup = g_markup_escape_text (plain, -1); g_free (plain); return markup; } static void reload_config (app_data *data, const char *server) { server_config_free (data->current_service); data->forced_emergency = FALSE; g_hash_table_remove_all (data->emergency_sources); if (!server || strlen (server) == 0) { data->current_service = NULL; update_service_ui (data); set_app_state (data, SYNC_UI_STATE_SERVER_OK); } else { data->synced_this_session = FALSE; data->current_service = g_slice_new0 (server_config); data->current_service->name = g_strdup (server); set_app_state (data, SYNC_UI_STATE_GETTING_SERVER); syncevo_server_get_config (data->server, data->current_service->name, FALSE, (SyncevoServerGetConfigCb)get_config_for_main_win_cb, data); } } static void abort_sync_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { /* TODO show in UI: failed to abort sync (while syncing) */ g_error_free (error); } /* status change handler takes care of updating UI */ } static void sync_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { /* TODO show in UI: sync failed (failed to even start) */ g_error_free (error); g_object_unref (session); return; } set_sync_progress (data, 0.0, _("Starting sync")); /* stop updates of "last synced" */ if (data->last_sync_src_id > 0) g_source_remove (data->last_sync_src_id); set_app_state (data, SYNC_UI_STATE_SYNCING); } gboolean show_confirmation (GtkWidget *widget, const char *message, const char *yes, const char *no) { GtkWidget *w; int ret; w = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", message); gtk_dialog_add_buttons (GTK_DIALOG (w), no, GTK_RESPONSE_NO, yes, GTK_RESPONSE_YES, NULL); ret = gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (w); return (ret == GTK_RESPONSE_YES); } static void slow_sync (app_data *data) { operation_data *op_data; char *message; /* TRANSLATORS: slow sync confirmation dialog message. Placeholder * is service/device name */ message = g_strdup_printf (_("Do you want to slow sync with %s?"), data->current_service->pretty_name); /* TRANSLATORS: slow sync confirmation dialog buttons */ if (!show_confirmation (data->sync_win, message, _("Yes, do slow sync"), _("No, cancel sync"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_SYNC_SLOW; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void slow_sync_clicked_cb (GtkButton *btn, app_data *data) { slow_sync (data); } static void refresh_from_server_clicked_cb (GtkButton *btn, app_data *data) { operation_data *op_data; char *message; /* TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder * is service/device name */ message = g_strdup_printf (_("Do you want to delete all local data and replace it with " "data from %s? This is not usually advised."), data->current_service->pretty_name); /* TRANSLATORS: "refresh from peer" confirmation dialog buttons */ if (!show_confirmation (data->sync_win, message, _("Yes, delete and replace"), _("No"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = peer_is_client (data->current_service->config) ? OP_SYNC_REFRESH_FROM_CLIENT : OP_SYNC_REFRESH_FROM_SERVER; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void refresh_from_client_clicked_cb (GtkButton *btn, app_data *data) { operation_data *op_data; char *message; /* TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder * is service/device name */ message = g_strdup_printf (_("Do you want to delete all data in %s and replace it with " "your local data? This is not usually advised."), data->current_service->pretty_name); /* TRANSLATORS: "refresh from local side" confirmation dialog buttons */ if (!show_confirmation (data->sync_win, message, _("Yes, delete and replace"), _("No"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = peer_is_client (data->current_service->config) ? OP_SYNC_REFRESH_FROM_SERVER : OP_SYNC_REFRESH_FROM_CLIENT; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void start_sync (app_data *data) { operation_data *op_data; if (data->syncing) { syncevo_session_abort (data->running_session, (SyncevoSessionGenericCb)abort_sync_cb, data); set_sync_progress (data, -1.0, _("Trying to cancel sync")); } else { op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_SYNC; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); } } static void sync_clicked_cb (GtkButton *btn, app_data *data) { g_return_if_fail (data->current_service); start_sync (data); } #define DAY 60 * 60 * 24 #define HALF_DAY 60 * 60 * 12 #define HOUR 60 * 60 #define HALF_HOUR 60 * 30 #define MINUTE 60 #define HALF_MINUTE 30 static gboolean refresh_last_synced_label (app_data *data) { GTimeVal val; glong diff; char *msg; int delay; g_get_current_time (&val); diff = val.tv_sec - data->last_sync; if (!data->current_service) { msg = g_strdup (_("No service or device selected")); delay = -1; } else if (data->last_sync <= 0) { msg = g_strdup (data->current_service->pretty_name); /* we don't know */ delay = -1; } else if (diff < HALF_MINUTE) { /* TRANSLATORS: This is the title on main view. Placeholder is * the service name. Example: "Google - synced just now" */ msg = g_strdup_printf (_("%s - synced just now"), data->current_service->pretty_name); delay = 10; } else if (diff < MINUTE + HALF_MINUTE) { msg = g_strdup_printf (_("%s - synced a minute ago"), data->current_service->pretty_name); delay = MINUTE; } else if (diff < HOUR) { msg = g_strdup_printf (_("%s - synced %ld minutes ago"), data->current_service->pretty_name, (diff + HALF_MINUTE) / MINUTE); delay = MINUTE; } else if (diff < HOUR + HALF_HOUR) { msg = g_strdup_printf (_("%s - synced an hour ago"), data->current_service->pretty_name); delay = HOUR; } else if (diff < DAY) { msg = g_strdup_printf (_("%s - synced %ld hours ago"), data->current_service->pretty_name, (diff + HALF_HOUR) / (HOUR)); delay = HOUR; } else if (diff < DAY + HALF_DAY) { msg = g_strdup_printf (_("%s - synced a day ago"), data->current_service->pretty_name); delay = HOUR; } else { msg = g_strdup_printf (_("%s - synced %ld days ago"), data->current_service->pretty_name, (diff + HALF_DAY) / (DAY)); delay = HOUR; } gtk_label_set_text (GTK_LABEL (data->server_label), msg); g_free (msg); if (data->last_sync_src_id > 0) g_source_remove (data->last_sync_src_id); if (delay > 0) data->last_sync_src_id = g_timeout_add_seconds (delay, (GSourceFunc)refresh_last_synced_label, data); return FALSE; } static void set_sync_progress (app_data *data, float progress, char *status) { if (progress >= 0) gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (data->progress), progress); if (status) gtk_progress_bar_set_text (GTK_PROGRESS_BAR (data->progress), status); } static void set_info_bar (GtkWidget *widget, GtkMessageType type, SyncErrorResponse response_id, const char *message) { GtkWidget *container, *label; GtkInfoBar *bar = GTK_INFO_BAR (widget); if (!message) { gtk_widget_hide (widget); return; } container = gtk_info_bar_get_action_area (bar); gtk_container_foreach (GTK_CONTAINER (container), (GtkCallback)remove_child, container); switch (response_id) { case SYNC_ERROR_RESPONSE_SYNC: /* TRANSLATORS: Action button in info bar in main view. Shown with e.g. * "You've just restored a backup. The changes have not been " * "synced with %s yet" */ gtk_info_bar_add_button (bar, _("Sync now"), response_id); break; case SYNC_ERROR_RESPONSE_EMERGENCY: /* TRANSLATORS: Action button in info bar in main view. Shown with e.g. * "A normal sync is not possible at this time..." message. * "Other options" will open Emergency view */ gtk_info_bar_add_button (bar, _("Slow sync"), SYNC_ERROR_RESPONSE_EMERGENCY_SLOW_SYNC); gtk_info_bar_add_button (bar, _("Other options..."), response_id); break; case SYNC_ERROR_RESPONSE_SETTINGS_SELECT: /* TRANSLATORS: Action button in info bar in main view. Shown e.g. * when no service is selected. Will open configuration view */ gtk_info_bar_add_button (bar, _("Select sync service"), response_id); break; case SYNC_ERROR_RESPONSE_SETTINGS_OPEN: /* TRANSLATORS: Action button in info bar in main view. Shown e.g. * login to service fails. Will open configuration view for this service */ gtk_info_bar_add_button (bar, _("Edit service settings"), response_id); break; case SYNC_ERROR_RESPONSE_NONE: break; default: g_warn_if_reached (); } gtk_info_bar_set_message_type (bar, type); container = gtk_info_bar_get_content_area (bar); gtk_container_foreach (GTK_CONTAINER (container), (GtkCallback)remove_child, container); label = gtk_label_new (message); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_set_size_request (label, 450, -1); gtk_box_pack_start (GTK_BOX (container), label, FALSE, FALSE, 8); gtk_widget_show (label); gtk_widget_show (widget); } static void set_app_state (app_data *data, app_state state) { if (state != SYNC_UI_STATE_CURRENT_STATE) data->current_state = state; switch (data->current_state) { case SYNC_UI_STATE_GETTING_SERVER: gtk_widget_hide (data->service_box); gtk_widget_hide (data->info_bar); gtk_label_set_text (GTK_LABEL (data->sync_status_label), ""); refresh_last_synced_label (data); gtk_widget_set_sensitive (data->main_frame, TRUE); gtk_widget_set_sensitive (data->sync_btn, FALSE); gtk_widget_set_sensitive (data->change_service_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, FALSE); break; case SYNC_UI_STATE_SERVER_FAILURE: gtk_widget_hide (data->service_box); gtk_widget_hide (data->autosync_box); gtk_widget_hide (data->progress); refresh_last_synced_label (data); /* info bar content should be set earlier */ gtk_widget_show (data->info_bar); gtk_label_set_text (GTK_LABEL (data->sync_status_label), ""); gtk_widget_set_sensitive (data->main_frame, FALSE); gtk_widget_set_sensitive (data->sync_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); gtk_widget_set_sensitive (data->change_service_btn, FALSE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, FALSE); break; case SYNC_UI_STATE_SERVER_OK: if (data->online) { gtk_widget_hide (data->no_connection_box); } else { gtk_widget_show (data->no_connection_box); } /* TRANSLATORS: These are for the button in main view, right side. Keep line length below ~20 characters, use two lines if needed */ gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Sync now")); if (!data->current_service) { gtk_widget_hide (data->service_box); gtk_widget_hide (data->autosync_box); gtk_widget_hide (data->progress); set_info_bar (data->info_bar, GTK_MESSAGE_INFO, SYNC_ERROR_RESPONSE_SETTINGS_SELECT, _("You haven't selected a sync service or device yet. " "Sync services let you synchronize your data " "between your netbook and a web service. You can " "also sync directly with some devices.")); refresh_last_synced_label (data); gtk_label_set_text (GTK_LABEL (data->sync_status_label), ""); gtk_widget_set_sensitive (data->sync_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->change_service_btn); } else { gtk_widget_hide (data->info_bar); gtk_widget_show (data->service_box); gtk_widget_show (data->autosync_box); gtk_widget_set_sensitive (data->sync_btn, data->online); gtk_widget_set_sensitive (data->emergency_btn, TRUE); if (data->synced_this_session && data->current_operation != OP_RESTORE) { gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Sync again")); } else { gtk_widget_hide (data->progress); } gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->sync_btn); } gtk_widget_set_sensitive (data->main_frame, TRUE); gtk_widget_set_sensitive (data->change_service_btn, TRUE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, TRUE); data->syncing = FALSE; break; case SYNC_UI_STATE_SYNCING: /* we have a active session, and a session is running (the running session may or may not be ours) */ gtk_widget_show (data->progress); if (data->current_operation == OP_RESTORE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Restoring")); } else { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Syncing")); } gtk_widget_set_sensitive (data->main_frame, FALSE); gtk_widget_set_sensitive (data->change_service_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, FALSE); gtk_widget_set_sensitive (data->sync_btn, support_canceling && data->current_operation != OP_RESTORE); if (support_canceling && support_canceling && data->current_operation != OP_RESTORE) { /* TRANSLATORS: This is for the button in main view, right side. Keep line length below ~20 characters, use two lines if needed */ gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Cancel sync")); } data->syncing = TRUE; break; default: g_assert_not_reached (); } } #ifdef USE_MOBLIN_UX static GtkWidget* switch_dummy_to_mux_frame (GtkWidget *dummy) { GtkWidget *frame, *parent; const char *title; g_assert (GTK_IS_BIN (dummy)); frame = mux_frame_new (); gtk_widget_set_name (frame, gtk_widget_get_name (dummy)); title = gtk_frame_get_label (GTK_FRAME(dummy)); if (title && strlen (title) > 0) gtk_frame_set_label (GTK_FRAME (frame), title); parent = gtk_widget_get_parent (dummy); g_assert (GTK_IS_BOX (parent)); gtk_widget_reparent (gtk_bin_get_child (GTK_BIN (dummy)), frame); gtk_container_remove (GTK_CONTAINER (parent), dummy); gtk_box_pack_start (GTK_BOX (parent), frame, TRUE, TRUE, 0); gtk_widget_show (frame); return frame; } static void set_page (app_data *data, int page) { int current = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook)); if (page != current) { gtk_notebook_set_current_page (GTK_NOTEBOOK (data->notebook), page); if (page != PAGE_MAIN) { gtk_widget_show (data->back_btn); } else { gtk_widget_hide (data->back_btn); } /* make sure the toggle is correct */ g_signal_handler_block (data->settings_btn, data->settings_id); if (page == PAGE_SETTINGS) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->settings_btn), TRUE); } else if (current == PAGE_SETTINGS) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->settings_btn), FALSE); } g_signal_handler_unblock (data->settings_btn, data->settings_id); } gtk_window_present (GTK_WINDOW (data->sync_win)); } static void settings_toggled (GtkToggleButton *button, app_data *data) { int page = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook)); if (page == PAGE_SETTINGS) { show_main_view (data); } else { show_services_list (data, NULL); } } static gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event, app_data *data) { int page = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook)); if (event->keyval == GDK_KEY_Escape && page != PAGE_MAIN) { show_main_view (data); } return FALSE; } /* For some reason metacity sometimes won't maximize but will if asked * another time. For the record, I'm not proud of writing this */ static gboolean try_maximize (GtkWindow *win) { static int count = 0; count++; gtk_window_maximize (win); return (count < 10); } static void setup_windows (app_data *data, GtkWidget *main, GtkWidget *settings, GtkWidget *emergency) { GtkWidget *tmp, *toolbar, *close_btn; GtkToolItem *item; g_assert (GTK_IS_WINDOW (main)); g_assert (GTK_IS_WINDOW (settings)); g_assert (GTK_IS_WINDOW (emergency)); data->sync_win = main; data->services_win = NULL; data->emergency_win = NULL; /* populate the notebook with window contents */ data->notebook = gtk_notebook_new (); gtk_widget_show (data->notebook); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (data->notebook), FALSE); gtk_notebook_set_show_border (GTK_NOTEBOOK (data->notebook), FALSE); gtk_window_maximize (GTK_WINDOW (data->sync_win)); g_timeout_add (10, (GSourceFunc)try_maximize, data->sync_win); gtk_window_set_decorated (GTK_WINDOW (data->sync_win), FALSE); gtk_widget_set_name (data->sync_win, "meego_win"); g_signal_connect (data->sync_win, "key-press-event", G_CALLBACK (key_press_cb), data); tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (data->sync_win))); gtk_container_remove (GTK_CONTAINER (data->sync_win), tmp); gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL); g_object_unref (tmp); tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (settings))); gtk_container_remove (GTK_CONTAINER (settings), tmp); gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL); g_object_unref (tmp); tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (emergency))); gtk_container_remove (GTK_CONTAINER (emergency), tmp); gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL); g_object_unref (tmp); tmp = gtk_vbox_new (FALSE, 0); gtk_widget_show (tmp); gtk_container_add (GTK_CONTAINER (data->sync_win), tmp); gtk_box_pack_end (GTK_BOX (tmp), data->notebook, TRUE, TRUE, 0); /* create the window toolbar */ toolbar = gtk_toolbar_new (); gtk_widget_set_name (toolbar, "moblin-toolbar"); gtk_box_pack_start (GTK_BOX (tmp), toolbar, FALSE, FALSE, 0); data->back_btn = gtk_button_new_with_label (_("Back to sync")); gtk_widget_set_name (data->back_btn, "moblin-toolbar-button"); gtk_widget_set_can_focus (data->back_btn, FALSE); gtk_widget_set_no_show_all (data->back_btn, TRUE); g_signal_connect_swapped (data->back_btn, "clicked", G_CALLBACK (show_main_view), data); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), data->back_btn); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 0); item = gtk_tool_item_new (); gtk_tool_item_set_expand (item, TRUE); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 1); data->settings_btn = gtk_toggle_button_new (); gtk_widget_set_can_focus (data->settings_btn, FALSE); gtk_widget_set_name (data->settings_btn, "moblin-settings-button"); data->settings_id = g_signal_connect (data->settings_btn, "toggled", G_CALLBACK (settings_toggled), data); gtk_container_add (GTK_CONTAINER (data->settings_btn), gtk_image_new_from_icon_name ("preferences-other", GTK_ICON_SIZE_LARGE_TOOLBAR)); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), data->settings_btn); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); close_btn = gtk_button_new (); gtk_widget_set_can_focus (close_btn, FALSE); gtk_widget_set_name (close_btn, "moblin-close-button"); g_signal_connect (close_btn, "clicked", G_CALLBACK (gtk_main_quit), NULL); gtk_container_add (GTK_CONTAINER (close_btn), gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_LARGE_TOOLBAR)); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), close_btn); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); gtk_widget_show_all (toolbar); /* no need for close buttons */ gtk_widget_hide (data->settings_close_btn); gtk_widget_hide (data->emergency_close_btn); } static void show_emergency_view (app_data *data) { update_emergency_view (data); set_page (data, PAGE_EMERGENCY); } static void show_services_list (app_data *data, const char *config_id_to_open) { g_free (data->config_id_to_open); data->config_id_to_open = g_strdup (config_id_to_open); set_page (data, PAGE_SETTINGS); update_services_list (data); } static void show_main_view (app_data *data) { set_page (data, PAGE_MAIN); } #else /* return the placeholders themselves when not using Moblin UX */ static GtkWidget* switch_dummy_to_mux_frame (GtkWidget *dummy) { return dummy; } static void setup_windows (app_data *data, GtkWidget *main, GtkWidget *settings, GtkWidget *emergency) { data->sync_win = main; data->services_win = settings; data->emergency_win = emergency; gtk_window_set_transient_for (GTK_WINDOW (data->services_win), GTK_WINDOW (data->sync_win)); gtk_window_set_transient_for (GTK_WINDOW (data->emergency_win), GTK_WINDOW (data->sync_win)); g_signal_connect (data->services_win, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); g_signal_connect (data->emergency_win, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); } static void show_emergency_view (app_data *data) { update_emergency_view (data); gtk_widget_hide (data->services_win); gtk_window_present (GTK_WINDOW (data->emergency_win)); } static void show_services_list (app_data *data, const char *config_id_to_open) { g_free (data->config_id_to_open); data->config_id_to_open = g_strdup (config_id_to_open); gtk_widget_hide (data->emergency_win); gtk_window_present (GTK_WINDOW (data->services_win)); update_services_list (data); } static void show_main_view (app_data *data) { gtk_widget_hide (data->services_win); gtk_widget_hide (data->emergency_win); gtk_window_present (GTK_WINDOW (data->sync_win)); } #endif /* This is a hacky way to achieve autoscrolling when the expanders open/close */ static void services_box_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, app_data *data) { if (GTK_IS_WIDGET (data->expanded_config)) { int y; GtkAdjustment *adj; GtkAllocation alloc; gtk_widget_translate_coordinates (data->expanded_config, data->services_box, 0, 0, NULL, &y); gtk_widget_get_allocation (data->expanded_config, &alloc); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (data->scrolled_window)); gtk_adjustment_clamp_page (adj, y, y + alloc.height); data->expanded_config = NULL; } } static void info_bar_response_cb (GtkInfoBar *info_bar, SyncErrorResponse response_id, app_data *data) { switch (response_id) { case SYNC_ERROR_RESPONSE_SYNC: start_sync (data); break; case SYNC_ERROR_RESPONSE_EMERGENCY_SLOW_SYNC: slow_sync (data); break; case SYNC_ERROR_RESPONSE_EMERGENCY: show_emergency_view (data); break; case SYNC_ERROR_RESPONSE_SETTINGS_OPEN: data->open_current = TRUE; show_services_list (data, NULL); break; case SYNC_ERROR_RESPONSE_SETTINGS_SELECT: show_services_list (data, NULL); break; default: g_warn_if_reached (); } } static void new_device_clicked_cb (GtkButton *btn, app_data *data) { DBusGProxy *proxy; DBusGConnection *bus; char *argv[2] = {"bluetooth-wizard", NULL}; GError *error = NULL; switch (data->bluetooth_wizard) { case SYNC_BLUETOOTH_MOBLIN: bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); if (bus) { proxy = dbus_g_proxy_new_for_name (bus, "org.moblin.UX.Shell.Toolbar", "/org/moblin/UX/Shell/Toolbar", "org.moblin.UX.Shell.Toolbar"); dbus_g_proxy_call_no_reply (proxy, "ShowPanel", G_TYPE_STRING, "bluetooth-panel", G_TYPE_INVALID, G_TYPE_INVALID); g_object_unref (proxy); } break; case SYNC_BLUETOOTH_GNOME: if (!gdk_spawn_on_screen (gtk_window_get_screen (GTK_WINDOW (data->sync_win)), NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &error)) { g_warning ("Failed to spawn bluetooth-wizard: %s", error->message); g_error_free (error); return; } break; default: ; } } static void name_has_owner_cb (DBusGProxy *proxy, gboolean has_owner, GError *error, app_data *data) { if (has_owner) { gtk_widget_show (data->new_device_btn); data->bluetooth_wizard = SYNC_BLUETOOTH_MOBLIN; } g_object_unref (proxy); } static void init_bluetooth_ui (app_data *data) { char *bt_wizard; DBusGConnection *bus; DBusGProxy *proxy; data->bluetooth_wizard = SYNC_BLUETOOTH_NONE; /* look for gnome bluetooth wizard first */ bt_wizard = g_find_program_in_path ("bluetooth-wizard"); if (bt_wizard) { gtk_widget_show (data->new_device_btn); data->bluetooth_wizard = SYNC_BLUETOOTH_GNOME; g_free (bt_wizard); } else { /* try Moblin shell next (bluetooth panel integrates bt wizard) */ bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); proxy = dbus_g_proxy_new_for_name (bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); if (proxy) { org_freedesktop_DBus_name_has_owner_async (proxy, "org.moblin.UX.Shell.Toolbar", (org_freedesktop_DBus_name_has_owner_reply)name_has_owner_cb, data); } } } static void autosync_toggle_cb (GtkWidget *widget, gpointer x, app_data *data) { if (data->current_service && data->current_service->config) { gboolean new_active, old_active; char *autosync = NULL; new_active = toggle_get_active (widget); syncevo_config_get_value (data->current_service->config, NULL, "autoSync", &autosync); old_active = (g_strcmp0 (autosync, "1") == 0); if (old_active != new_active) { char *new_val; operation_data *op_data; new_val = new_active ? "1": "0"; syncevo_config_set_value (data->current_service->config, NULL, "autoSync", new_val); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_SAVE; op_data->started = FALSE; syncevo_server_start_no_sync_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); } } } static void build_autosync_ui (app_data *data) { char *txt; /* TRANSLATORS: label for checkbutton/toggle in main view. * Please stick to similar length strings or break the line with * "\n" if absolutely needed */ txt = _("Automatic sync"); #ifdef USE_MOBLIN_UX GtkWidget *lbl; lbl = gtk_label_new (txt); gtk_widget_show (lbl); gtk_box_pack_end (GTK_BOX (data->autosync_box), lbl, FALSE, FALSE, 0); data->autosync_toggle = mx_gtk_light_switch_new (); gtk_widget_show (data->autosync_toggle); gtk_box_pack_end (GTK_BOX (data->autosync_box), data->autosync_toggle, FALSE, FALSE, 0); g_signal_connect (data->autosync_toggle, "switch-flipped", G_CALLBACK (autosync_toggle_cb), data); #else GtkWidget *align; align = gtk_alignment_new (0.5, 1.0, 1.0, 0.0); gtk_widget_show (align); gtk_box_pack_start (GTK_BOX (data->autosync_box), align, TRUE, TRUE, 0); data->autosync_toggle = gtk_check_button_new_with_label (txt); gtk_container_add (GTK_CONTAINER (align), data->autosync_toggle); g_signal_connect (data->autosync_toggle, "notify::active", G_CALLBACK (autosync_toggle_cb), data); #endif gtk_widget_show (data->autosync_toggle); } static void glade_name_workaround (GtkBuilder *builder, const char *name) { GtkWidget *w; w = GTK_WIDGET (gtk_builder_get_object (builder, name)); if (w) { gtk_widget_set_name (w, name); } } static gboolean init_ui (app_data *data) { GtkBuilder *builder; GError *error = NULL; GtkWidget /* *frame, */ * service_error_box, *btn; GtkAdjustment *adj; gtk_rc_parse (THEMEDIR "sync-ui.rc"); builder = gtk_builder_new (); gtk_builder_add_from_file (builder, GLADEDIR "ui.xml", &error); if (error) { g_printerr ("Failed to load user interface from %s: %s\n", GLADEDIR "ui.xml", error->message); g_error_free (error); g_object_unref (builder); return FALSE; } data->service_box = GTK_WIDGET (gtk_builder_get_object (builder, "service_box")); service_error_box = GTK_WIDGET (gtk_builder_get_object (builder, "service_error_box")); data->info_bar = gtk_info_bar_new (); gtk_widget_set_no_show_all (data->info_bar, TRUE); g_signal_connect (data->info_bar, "response", G_CALLBACK (info_bar_response_cb), data); gtk_box_pack_start (GTK_BOX (service_error_box), data->info_bar, TRUE, TRUE, 16); data->no_connection_box = GTK_WIDGET (gtk_builder_get_object (builder, "no_connection_box")); data->server_icon_box = GTK_WIDGET (gtk_builder_get_object (builder, "server_icon_box")); data->offline_label = GTK_WIDGET (gtk_builder_get_object (builder, "offline_label")); data->progress = GTK_WIDGET (gtk_builder_get_object (builder, "progressbar")); data->change_service_btn = GTK_WIDGET (gtk_builder_get_object (builder, "change_service_btn")); data->emergency_btn = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_btn")); data->sync_btn = GTK_WIDGET (gtk_builder_get_object (builder, "sync_btn")); data->sync_status_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_status_label")); data->spinner_image = GTK_WIDGET (gtk_builder_get_object (builder, "spinner_image")); gtk_image_set_from_file (GTK_IMAGE (data->spinner_image), THEMEDIR "sync-spinner.gif"); gtk_widget_set_no_show_all (data->spinner_image, TRUE); gtk_widget_hide (data->spinner_image); data->autosync_box = GTK_WIDGET (gtk_builder_get_object (builder, "autosync_box")); build_autosync_ui (data); data->server_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_service_label")); data->last_synced_label = GTK_WIDGET (gtk_builder_get_object (builder, "last_synced_label")); data->sources_box = GTK_WIDGET (gtk_builder_get_object (builder, "sources_box")); data->new_service_btn = GTK_WIDGET (gtk_builder_get_object (builder, "new_service_btn")); gtk_widget_set_size_request (data->new_service_btn, SYNC_UI_LIST_BTN_WIDTH, SYNC_UI_LIST_ICON_SIZE); g_signal_connect (data->new_service_btn, "clicked", G_CALLBACK (setup_new_service_clicked), data); /* service list view */ data->scrolled_window = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow")); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (data->scrolled_window)); data->services_box = GTK_WIDGET (gtk_builder_get_object (builder, "services_box")); gtk_container_set_focus_vadjustment (GTK_CONTAINER (data->services_box), adj); g_signal_connect(data->services_box, "size-allocate", G_CALLBACK (services_box_allocate_cb), data); data->devices_box = GTK_WIDGET (gtk_builder_get_object (builder, "devices_box")); data->settings_close_btn = GTK_WIDGET (gtk_builder_get_object (builder, "settings_close_btn")); /* emergency view */ btn = GTK_WIDGET (gtk_builder_get_object (builder, "slow_sync_btn")); g_signal_connect (btn, "clicked", G_CALLBACK (slow_sync_clicked_cb), data); data->refresh_from_server_btn_label = GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_server_btn_label")); g_signal_connect (GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_server_btn")), "clicked", G_CALLBACK (refresh_from_server_clicked_cb), data); data->refresh_from_client_btn_label = GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_client_btn_label")); g_signal_connect (GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_client_btn")), "clicked", G_CALLBACK (refresh_from_client_clicked_cb), data); data->emergency_label = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_label")); data->emergency_expander = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_expander")); data->emergency_source_table = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_source_table")); data->emergency_backup_table = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_backup_table")); data->emergency_close_btn = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_close_btn")); /* No (documented) way to add own widgets to gtkbuilder it seems... swap the all dummy widgets with Muxwidgets */ setup_windows (data, GTK_WIDGET (gtk_builder_get_object (builder, "sync_win")), GTK_WIDGET (gtk_builder_get_object (builder, "services_win")), GTK_WIDGET (gtk_builder_get_object (builder, "emergency_win"))); data->main_frame = switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "main_frame"))); data->log_frame = switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "log_frame"))); /* frame = */ switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "services_list_frame"))); /* frame = */ switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "emergency_frame"))); g_signal_connect (data->sync_win, "destroy", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (data->change_service_btn, "clicked", G_CALLBACK (change_service_clicked_cb), data); g_signal_connect (data->emergency_btn, "clicked", G_CALLBACK (emergency_clicked_cb), data); g_signal_connect (data->sync_btn, "clicked", G_CALLBACK (sync_clicked_cb), data); g_signal_connect_swapped (data->emergency_close_btn, "clicked", G_CALLBACK (show_main_view), data); g_signal_connect_swapped (data->settings_close_btn, "clicked", G_CALLBACK (show_main_view), data); g_signal_connect (data->emergency_btn, "clicked", G_CALLBACK (emergency_clicked_cb), data); data->new_device_btn = GTK_WIDGET (gtk_builder_get_object (builder, "new_device_btn")); g_signal_connect (data->new_device_btn, "clicked", G_CALLBACK (new_device_clicked_cb), data); /* workarounds for glade not working with gtkbuilder >= 2.20: * widgets do not get names. */ glade_name_workaround (builder, "meego_win"); glade_name_workaround (builder, "sync_data_and_type_box"); glade_name_workaround (builder, "log_frame"); glade_name_workaround (builder, "backup_frame"); glade_name_workaround (builder, "services_frame"); glade_name_workaround (builder, "sync_service_label"); glade_name_workaround (builder, "sync_status_label"); glade_name_workaround (builder, "no_server_label"); glade_name_workaround (builder, "sync_failure_label"); glade_name_workaround (builder, "sync_btn"); init_bluetooth_ui (data); g_object_unref (builder); return TRUE; } static void load_icon (const char *uri, GtkBox *icon_box, guint icon_size) { GError *error = NULL; GdkPixbuf *pixbuf; GtkWidget *image; const char *filename; if (uri && strlen (uri) > 0) { if (g_str_has_prefix (uri, "file://")) { filename = uri+7; } else { g_warning ("only file:// icon uri is supported: %s", uri); filename = THEMEDIR "sync-generic.png"; } } else { filename = THEMEDIR "sync-generic.png"; } pixbuf = gdk_pixbuf_new_from_file_at_scale (filename, icon_size, icon_size, TRUE, &error); if (!pixbuf) { g_warning ("Failed to load service icon: %s", error->message); g_error_free (error); return; } image = gtk_image_new_from_pixbuf (pixbuf); gtk_widget_set_size_request (image, icon_size, icon_size); g_object_unref (pixbuf); gtk_container_foreach (GTK_CONTAINER(icon_box), (GtkCallback)remove_child, icon_box); gtk_box_pack_start (icon_box, image, FALSE, FALSE, 0); gtk_widget_show (image); } static void emergency_toggle_notify_active_cb (GtkWidget *widget, gpointer p, app_data *data) { gboolean active; char *source; active = toggle_get_active (widget); source = g_object_get_data (G_OBJECT (widget), "source"); g_return_if_fail (source); if (active) { g_hash_table_insert (data->emergency_sources, g_strdup (source), ""); } else { g_hash_table_remove (data->emergency_sources, source); } update_emergency_expander (data); } static GtkWidget* add_emergency_toggle_widget (app_data *data, const char *title, gboolean active, guint row, guint col) { GtkWidget *toggle; #ifdef USE_MOBLIN_UX GtkWidget *label; col = col * 2; label = gtk_label_new (title); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (data->emergency_source_table), label, col, col + 1, row, row + 1, GTK_FILL, GTK_FILL, 16, 0); toggle = mx_gtk_light_switch_new (); toggle_set_active (toggle, active); g_signal_connect (toggle, "switch-flipped", G_CALLBACK (emergency_toggle_notify_active_cb), data); #else toggle = gtk_check_button_new_with_label (title); toggle_set_active (toggle, active); g_signal_connect (toggle, "notify::active", G_CALLBACK (emergency_toggle_notify_active_cb), data); #endif gtk_widget_show (toggle); gtk_table_attach (GTK_TABLE (data->emergency_source_table), toggle, col + 1, col + 2, row, row + 1, GTK_FILL, GTK_FILL, 0, 0); return toggle; } static void update_emergency_expander (app_data *data) { char *text, *sources = NULL; GHashTableIter iter; char *name; g_hash_table_iter_init (&iter, data->emergency_sources); while (g_hash_table_iter_next (&iter, (gpointer)&name, NULL)) { char *pretty, *tmp; pretty = get_pretty_source_name (name); if (sources) { tmp = g_strdup_printf ("%s, %s", sources, pretty); g_free (sources); g_free (pretty); sources = tmp; } else { sources = pretty; } } if (sources) { /* This is the expander label in emergency view. It summarizes the * currently selected data sources. First placeholder is service/device * name, second a comma separeted list of sources. * E.g. "Affected data: Google Contacts, Appointments" */ text = g_strdup_printf (_("Affected data: %s %s"), data->current_service->pretty_name, sources); g_free (sources); } else { text = g_strdup_printf (_("Affected data: none")); } gtk_expander_set_label (GTK_EXPANDER (data->emergency_expander), text); g_free (text); } static void add_emergency_source (const char *name, GHashTable *source, app_data *data) { source_config *conf; GtkWidget *toggle; guint rows, cols; guint row; static guint col; gboolean active = TRUE; char *pretty_name; conf = g_hash_table_lookup (data->current_service->source_configs, name); g_object_get (data->emergency_source_table, "n-rows", &rows, "n-columns", &cols, NULL); if (cols != 1 && col == 0){ col = 1; row = rows - 1; } else { col = 0; row = rows; } active = (g_hash_table_lookup (data->emergency_sources, name) != NULL); pretty_name = get_pretty_source_name (name); toggle = add_emergency_toggle_widget (data, pretty_name, active, row, col); gtk_widget_set_sensitive (toggle, source_config_is_usable (conf)); g_object_set_data_full (G_OBJECT (toggle), "source", g_strdup (name), g_free); g_free (pretty_name); } static void update_backup_visibilities (app_data *data) { char *key; GHashTableIter iter; GList *l, *widgets; widgets = gtk_container_get_children ( GTK_CONTAINER (data->emergency_backup_table)); gtk_widget_show_all (data->emergency_backup_table); /* hide backup widgets that do not contain selected sources */ g_hash_table_iter_init (&iter, data->emergency_sources); while (g_hash_table_iter_next (&iter, (gpointer)&key, NULL)) { for (l = widgets; l; l = l->next) { if (!g_object_get_data (G_OBJECT (l->data), key)) { gtk_widget_hide (GTK_WIDGET (l->data)); } } } g_list_free (widgets); } static void restore_clicked_cb (GtkButton *btn, app_data *data) { const char *dir, *time_str; operation_data *op_data; char *message; dir = g_object_get_data (G_OBJECT (btn), "dir"); time_str = g_object_get_data (G_OBJECT (btn), "time"); g_return_if_fail (dir && time_str); /* TRANSLATORS: confirmation for restoring a backup. placeholder is the * backup time string defined below */ message = g_strdup_printf (_("Do you want to restore the backup from %s? " "All changes you have made since then will be lost."), time_str); if (!show_confirmation (data->sync_win, message, _("Yes, restore"), _("No"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_RESTORE; op_data->dir = dir; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void add_backup (app_data *data, const char *peername, const char *dir, long endtime, GList *sources) { GtkWidget *timelabel, *label, *blabel, *button, *box;; guint rows; char *text; char time_str[60]; struct tm *tim; tim = localtime (&endtime); /* TRANSLATORS: date/time for strftime(), used in emergency view backup * label. Any time format that shows date and time is good. */ strftime (time_str, sizeof (time_str), _("%x %X"), tim); g_object_get (data->emergency_backup_table, "n-rows", &rows, NULL); box = gtk_vbox_new (TRUE, 6); gtk_table_attach (GTK_TABLE (data->emergency_backup_table), box, 0, 1, rows, rows + 1, GTK_EXPAND|GTK_FILL, GTK_FILL, 16, 0); timelabel = gtk_label_new (time_str); gtk_misc_set_alignment (GTK_MISC (timelabel), 0.0, 0.5); gtk_label_set_line_wrap (GTK_LABEL (timelabel), TRUE); gtk_widget_set_size_request (timelabel, 600, -1); gtk_box_pack_start (GTK_BOX (box), timelabel, TRUE, TRUE, 0); /* TRANSLATORS: label for a backup in emergency view. Placeholder is * service or device name */ text = g_strdup_printf (_("Backed up before syncing with %s"), peername); label = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_set_size_request (label, 600, -1); gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); g_free (text); button = gtk_button_new (); gtk_table_attach (GTK_TABLE (data->emergency_backup_table), button, 1, 2, rows, rows + 1, GTK_FILL, GTK_SHRINK, 32, 0); g_object_set_data_full (G_OBJECT (button), "dir", g_strdup(dir), g_free); g_object_set_data_full (G_OBJECT (button), "time", g_strdup(time_str), g_free); g_signal_connect (button, "clicked", G_CALLBACK (restore_clicked_cb), data); blabel = gtk_label_new (_("Restore")); gtk_misc_set_padding (GTK_MISC (blabel), 32, 0); gtk_container_add (GTK_CONTAINER (button), blabel); for (; sources; sources = sources->next) { g_object_set_data (G_OBJECT (box), (char *)sources->data, ""); g_object_set_data (G_OBJECT (button), (char *)sources->data, ""); } } static void get_reports_for_backups_cb (SyncevoServer *server, SyncevoReports *reports, GError *error, app_data *data) { guint len, i; if (error) { g_warning ("Error in Session.GetReports: %s", error->message); g_error_free (error); /* non-fatal, unknown error */ return; } len = syncevo_reports_get_length (reports); for (i = 0; i < len; i++) { GHashTable *report = syncevo_reports_index (reports, i); GHashTableIter iter; char *key, *val; /* long status = -1; */ long endtime = -1; char *peername = NULL; char *dir = NULL; GList *backup_sources = NULL; g_hash_table_iter_init (&iter, report); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&val)) { char **strs; strs = g_strsplit (key, "-", 6); if (!strs) { continue; } if (g_strcmp0 (strs[0], "source") == 0 && g_strcmp0 (strs[2], "backup") == 0 && g_strcmp0 (strs[3], "before") == 0) { backup_sources = g_list_prepend (backup_sources, g_strdup (strs[1])); } else if (g_strcmp0 (strs[0], "end") == 0) { endtime = strtol (val, NULL, 10); } else if (g_strcmp0 (strs[0], "status") == 0) { /* status = strtol (val, NULL, 10); */ } else if (g_strcmp0 (strs[0], "peer") == 0) { peername = val; } else if (g_strcmp0 (strs[0], "dir") == 0) { dir = val; } g_strfreev (strs); } if (peername && dir && endtime > 0) { add_backup (data, peername, dir, endtime, backup_sources); } g_list_foreach (backup_sources, (GFunc)g_free, NULL); g_list_free (backup_sources); } data->backup_count += len; if (len == REPORTS_PER_CALL) { syncevo_server_get_reports (data->server, "", data->backup_count, REPORTS_PER_CALL, (SyncevoServerGetReportsCb)get_reports_for_backups_cb, data); } update_backup_visibilities (data); } static const char* get_syncevo_context (const char *config_name) { char *context; context = g_strrstr (config_name, "@"); if (!context) { context = ""; } return context; } static void update_emergency_view (app_data *data) { char *text; if (!data->current_service) { g_warning ("no service defined in Emergency view"); return; } if (data->forced_emergency) { text = g_strdup_printf ( /* TRANSLATORS: this is an explanation in Emergency view. * Placeholder is a service/device name */ _("A normal sync with %s is not possible at this time. " "You can do a slow two-way sync or start from scratch. You " "can also restore a backup, but a slow sync or starting from " "scratch will still be required before normal sync is " "possible."), data->current_service->pretty_name); } else { /* TRANSLATORS: this is an explanation in Emergency view. * Placeholder is a service/device name */ text = g_strdup_printf ( _("If something has gone horribly wrong, you can try a " "slow sync, start from scratch or restore from backup.")); } gtk_label_set_text (GTK_LABEL (data->emergency_label), text); g_free (text); /* TRANSLATORS: These are a buttons in Emergency view. Placeholder is a * service/device name. Please don't use too long lines, but feel free to * use several lines. */ text = g_strdup_printf (_("Delete all your local\n" "data and replace with\n" "data from %s"), data->current_service->pretty_name); gtk_label_set_text (GTK_LABEL (data->refresh_from_server_btn_label), text); g_free (text); text = g_strdup_printf (_("Delete all data on\n" "%s and replace\n" "with your local data"), data->current_service->pretty_name); gtk_label_set_text (GTK_LABEL (data->refresh_from_client_btn_label), text); g_free (text); gtk_container_foreach (GTK_CONTAINER (data->emergency_source_table), (GtkCallback)remove_child, data->emergency_source_table); gtk_table_resize (GTK_TABLE (data->emergency_source_table), 1, 1); /* using this instead of current_service->source_configs * to get the same order as the configuration has... */ syncevo_config_foreach_source (data->current_service->config, (ConfigFunc)add_emergency_source, data); update_emergency_expander (data); data->backup_count = 0; gtk_container_foreach (GTK_CONTAINER (data->emergency_backup_table), (GtkCallback)remove_child, data->emergency_backup_table); gtk_table_resize (GTK_TABLE (data->emergency_backup_table), 1, 1); syncevo_server_get_reports (data->server, get_syncevo_context (data->current_service->name), 0, REPORTS_PER_CALL, (SyncevoServerGetReportsCb)get_reports_for_backups_cb, data); } static void update_service_source_ui (const char *name, source_config *conf, app_data *data) { GtkWidget *lbl, *box; char *pretty_name, *title; if (!source_config_is_usable (conf)) { return; } conf->box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (data->sources_box), conf->box, FALSE, FALSE, 8); pretty_name = get_pretty_source_name_markup (name); title = g_strdup_printf ("%s", pretty_name); lbl = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (lbl), title); g_free (pretty_name); g_free (title); gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (conf->box), lbl, TRUE, TRUE, 0); box = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (conf->box), box, FALSE, FALSE, 0); conf->info_bar = gtk_info_bar_new (); gtk_box_pack_start (GTK_BOX (box), conf->info_bar, TRUE, TRUE, 16); gtk_widget_set_no_show_all (conf->info_bar, TRUE); g_signal_connect (conf->info_bar, "response", G_CALLBACK (info_bar_response_cb), data); conf->label = gtk_label_new (NULL); gtk_misc_set_alignment (GTK_MISC (conf->label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (conf->box), conf->label, TRUE, TRUE, 0); source_config_update_widget (conf); gtk_widget_show_all (conf->box); } static void check_source_cb (SyncevoSession *session, GError *error, source_config *source) { if (error) { if(error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE)) { /* source is not supported locally */ if (source) { source->supported_locally = FALSE; if (source->box) { /* widget is already on screen, hide it */ gtk_widget_hide (source->box); } } } else { g_warning ("CheckSource failed: %s", error->message); /* non-fatal, unknown error */ } g_error_free (error); return; } } static void update_service_ui (app_data *data) { char *icon_uri = NULL; char *autosync = NULL; gtk_container_foreach (GTK_CONTAINER (data->sources_box), (GtkCallback)remove_child, data->sources_box); if (data->current_service && data->current_service->config) { syncevo_config_get_value (data->current_service->config, NULL, "IconURI", &icon_uri); syncevo_config_get_value (data->current_service->config, NULL, "autoSync", &autosync); g_hash_table_foreach (data->current_service->source_configs, (GHFunc)update_service_source_ui, data); } load_icon (icon_uri, GTK_BOX (data->server_icon_box), SYNC_UI_ICON_SIZE); toggle_set_active (data->autosync_toggle, g_strcmp0 (autosync, "1") == 0); refresh_last_synced_label (data); gtk_widget_show_all (data->sources_box); } static void unexpand_config_widget (GtkWidget *w, GtkWidget *exception) { if (SYNC_IS_CONFIG_WIDGET (w) && exception && exception != w) { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (w), FALSE); } } static void config_widget_expanded_cb (GtkWidget *widget, GParamSpec *pspec, app_data *data) { if (sync_config_widget_get_expanded (SYNC_CONFIG_WIDGET (widget))) { data->expanded_config = widget; gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)unexpand_config_widget, widget); } } static void config_widget_changed_cb (GtkWidget *widget, app_data *data) { if (sync_config_widget_get_current (SYNC_CONFIG_WIDGET (widget))) { const char *name = NULL; name = sync_config_widget_get_name (SYNC_CONFIG_WIDGET (widget)); reload_config (data, name); show_main_view (data); } else { reload_config (data, NULL); update_services_list (data); } } static SyncConfigWidget* add_configuration_to_box (GtkBox *box, SyncevoConfig *config, const char *name, gboolean has_template, gboolean has_configuration, app_data *data) { GtkWidget *item = NULL; gboolean current = FALSE; const char *current_name = NULL; if (data->current_service) { current_name = data->current_service->pretty_name; if (data->current_service->name && name && g_ascii_strcasecmp (name, data->current_service->name) == 0) { current = TRUE; } } item = sync_config_widget_new (data->server, name, config, current, current_name, has_configuration, has_template); g_signal_connect (item, "changed", G_CALLBACK (config_widget_changed_cb), data); g_signal_connect (item, "notify::expanded", G_CALLBACK (config_widget_expanded_cb), data); gtk_widget_show (item); gtk_box_pack_start (box, item, FALSE, FALSE, 0); if (current) { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (item), data->open_current); } if (g_strcmp0 (name, "default") == 0) { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (item), TRUE); } if (data->config_id_to_open) { sync_config_widget_expand_id (SYNC_CONFIG_WIDGET (item), data->config_id_to_open); } return SYNC_CONFIG_WIDGET (item); } static void find_new_service_config (SyncConfigWidget *w, GtkWidget **found) { if (SYNC_IS_CONFIG_WIDGET (w)) { if (!sync_config_widget_get_configured (w) && !sync_config_widget_get_has_template (w)) { *found = GTK_WIDGET (w); } } } typedef struct config_data { app_data *data; char *name; gboolean has_configuration; gboolean has_template; GHashTable *device_templates; } config_data; #define LEGAL_CONFIG_NAME_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ1234567890-_" static void get_config_for_config_widget_cb (SyncevoServer *server, SyncevoConfig *config, GError *error, config_data *c_data) { char *ready, *is_peer, *url, *type; c_data->data->service_list_updates_left--; if (error) { /* show in UI? */ g_warning ("Server.GetConfig() failed: %s", error->message); g_error_free (error); return; } syncevo_config_get_value (config, NULL, "ConsumerReady", &ready); syncevo_config_get_value (config, NULL, "PeerIsClient", &is_peer); syncevo_config_get_value (config, NULL, "syncURL", &url); syncevo_config_get_value (config, NULL, "peerType", &type); if (g_strcmp0 ("1", ready) != 0 || (type && g_strcmp0 ("WebDAV", type) == 0) || (url && g_str_has_prefix (url, "local://@"))) { /* Ignore existing configs and templates unless they are explicitly marked as "ConsumerReady. Also ignore webdav (and the local syncs used for webdav) for now */ } else if (is_peer && g_strcmp0 ("1", is_peer) == 0) { if (url) { SyncConfigWidget *w; char *fp, *tmp, *template_name, *device_name = NULL; char **fpv = NULL; syncevo_config_get_value (config, NULL, "deviceName", &tmp); if (!tmp) { device_name = g_strdup (c_data->name); } else { device_name = g_strcanon (g_strdup (tmp), LEGAL_CONFIG_NAME_CHARS, '-'); } syncevo_config_get_value (config, NULL, "templateName", &template_name); if (!template_name) { syncevo_config_get_value (config, NULL, "fingerPrint", &fp); if (fp) { fpv = g_strsplit_set (fp, ",;", 2); if (g_strv_length (fpv) > 0) { template_name = fpv[0]; } } } /* keep a list of added devices */ w = g_hash_table_lookup (c_data->device_templates, url); if (!w) { w = add_configuration_to_box (GTK_BOX (c_data->data->devices_box), config, device_name, c_data->has_template, c_data->has_configuration, c_data->data); g_hash_table_insert (c_data->device_templates, url, w); sync_config_widget_add_alternative_config (w, template_name, config, c_data->has_configuration); } else { /* TODO: might want to add a new widget, if user has created more * configs for same device: this really requires us to look at * all configs / templates, then decide what to sho w*/ /* there is a widget for this device already, add this info there*/ sync_config_widget_add_alternative_config (w, template_name, config, c_data->has_configuration); } g_free (device_name); g_strfreev (fpv); } } else { add_configuration_to_box (GTK_BOX (c_data->data->services_box), config, c_data->name, c_data->has_template, c_data->has_configuration, c_data->data); } g_free (c_data->name); g_hash_table_unref (c_data->device_templates); g_slice_free (config_data, c_data); } static void get_config_for_config_widget (app_data *data, const char *config, gboolean has_template, gboolean has_configuration, GHashTable *device_templates) { config_data *c_data; data->service_list_updates_left++; c_data = g_slice_new0 (config_data); c_data->data = data; c_data->name = g_strdup (config); c_data->has_template = has_template; c_data->has_configuration = has_configuration; if (device_templates) { c_data->device_templates = g_hash_table_ref (device_templates); } syncevo_server_get_config (data->server, config, !has_configuration, (SyncevoServerGetConfigCb)get_config_for_config_widget_cb, c_data); } static void setup_new_service_clicked (GtkButton *btn, app_data *data) { GtkWidget *widget = NULL; gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)unexpand_config_widget, NULL); /* if a new service config has already been added, use that. * Otherwise add one. */ gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)find_new_service_config, &widget); if (!widget) { get_config_for_config_widget (data, "default", TRUE, FALSE, NULL); } else { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (widget), TRUE); } } typedef struct templates_data { app_data *data; char **templates; } templates_data; static void get_configs_cb (SyncevoServer *server, char **configs, GError *error, templates_data *templ_data) { char **config_iter, **template_iter, **templates; app_data *data; GHashTable *device_templates; templ_data->data->service_list_updates_left = 0; templates = templ_data->templates; data = templ_data->data; g_slice_free (templates_data, templ_data); if (error) { show_main_view (data); g_warning ("Server.GetConfigs() failed: %s", error->message); g_strfreev (templates); g_error_free (error); return; } device_templates = g_hash_table_new (g_str_hash, g_str_equal); for (template_iter = templates; *template_iter; template_iter++){ gboolean found_config = FALSE; for (config_iter = configs; *config_iter; config_iter++) { if (*template_iter && *config_iter && g_ascii_strncasecmp (*template_iter, *config_iter, strlen (*config_iter)) == 0) { /* have template and config */ get_config_for_config_widget (data, *config_iter, TRUE, TRUE, device_templates); found_config = TRUE; break; } } if (!found_config) { /* have template, no config */ get_config_for_config_widget (data, *template_iter, TRUE, FALSE, device_templates); } } for (config_iter = configs; *config_iter; config_iter++) { gboolean found_template = FALSE; for (template_iter = templates; *template_iter; template_iter++) { if (*template_iter && *config_iter && g_ascii_strncasecmp (*template_iter, *config_iter, strlen (*config_iter)) == 0) { found_template = TRUE; break; } } if (!found_template) { /* have config, no template */ get_config_for_config_widget (data, *config_iter, FALSE, TRUE, device_templates); } } /* config initialization might ref/unref as well... */ g_hash_table_unref (device_templates); g_strfreev (configs); g_strfreev (templates); } static void get_template_configs_cb (SyncevoServer *server, char **templates, GError *error, app_data *data) { templates_data *templ_data; if (error) { data->service_list_updates_left = 0; show_main_view (data); show_error_dialog (data->sync_win, _("Failed to get list of supported services from SyncEvolution")); g_warning ("Server.GetConfigs() failed: %s", error->message); g_error_free (error); return; } templ_data = g_slice_new (templates_data); templ_data->data = data; templ_data->templates = templates; syncevo_server_get_configs (data->server, FALSE, (SyncevoServerGetConfigsCb)get_configs_cb, templ_data); } static void update_services_list (app_data *data) { if (data->service_list_updates_left > 0) { return; } gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)remove_child, data->services_box); gtk_container_foreach (GTK_CONTAINER (data->devices_box), (GtkCallback)remove_child, data->devices_box); /* set temp number before we know the real one */ data->service_list_updates_left = 1; syncevo_server_get_configs (data->server, TRUE, (SyncevoServerGetConfigsCb)get_template_configs_cb, data); } static void get_config_for_main_win_cb (SyncevoServer *server, SyncevoConfig *config, GError *error, app_data *data) { if (error) { if (error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)) { /* another syncevolution client probably removed the config */ reload_config (data, NULL); } else { g_warning ("Error in Server.GetConfig: %s", error->message); /* TRANSLATORS: message in main view */ set_info_bar (data->info_bar, GTK_MESSAGE_ERROR, SYNC_ERROR_RESPONSE_NONE, _("There was a problem communicating with the " "sync process. Please try again later.")); set_app_state (data, SYNC_UI_STATE_SERVER_FAILURE); } g_error_free (error); return; } if (config) { GHashTableIter iter; char *name; source_config *source; server_config_init (data->current_service, config); set_app_state (data, SYNC_UI_STATE_SERVER_OK); /* get "locally supported" status for all sources */ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&source)) { syncevo_server_check_source (data->server, data->current_service->name, name, (SyncevoServerGenericCb)check_source_cb, source); } syncevo_server_get_presence (server, data->current_service->name, (SyncevoServerGetPresenceCb)get_presence_cb, data); syncevo_server_get_reports (server, data->current_service->name, 0, 1, (SyncevoServerGetReportsCb)get_reports_cb, data); update_service_ui (data); } } static void set_running_session_status (app_data *data, SyncevoSessionStatus status, int error_code) { if (status & SYNCEVO_STATUS_QUEUEING) { g_warning ("Running session is queued, this shouldn't happen..."); } else if (status & SYNCEVO_STATUS_IDLE) { set_app_state (data, SYNC_UI_STATE_SERVER_OK); } else if (status & SYNCEVO_STATUS_DONE) { char *err; err = get_error_string_for_code (error_code, NULL); if (err) { if (data->current_operation == OP_RESTORE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Restore failed")); } else { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync failed")); } g_free (err); } else { if (data->current_operation == OP_RESTORE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Restore complete")); } else { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync complete")); } } set_app_state (data, SYNC_UI_STATE_SERVER_OK); set_sync_progress (data, 1.0, ""); } else if (status & SYNCEVO_STATUS_RUNNING || status & SYNCEVO_STATUS_SUSPENDING || status & SYNCEVO_STATUS_ABORTING) { set_app_state (data, SYNC_UI_STATE_SYNCING); } if (status & SYNCEVO_STATUS_WAITING) { gtk_widget_show (data->spinner_image); } else { gtk_widget_hide (data->spinner_image); } } static void running_session_status_changed_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, app_data *data) { set_running_session_status (data, status, error_code); } static void get_running_session_status_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, app_data *data) { if (error) { g_warning ("Error in Session.GetStatus: %s", error->message); g_error_free (error); /* non-fatal, unknown error */ return; } set_running_session_status (data, status, error_code); } typedef struct source_progress_data { app_data *data; SyncevoSourcePhase phase; const char *source; } source_progress_data; static void find_updated_source_progress (const char *name, SyncevoSourcePhase phase, source_progress_data *prog_data) { GHashTable *configs = prog_data->data->current_service ? prog_data->data->current_service->source_configs : NULL; source_config *config; config = configs ? g_hash_table_lookup (configs, name) : NULL; if (config) { if (phase != config->phase) { config->phase = phase; prog_data->phase = config->phase; prog_data->source = name; } } } static void running_session_progress_changed_cb (SyncevoSession *session, int progress, SyncevoSourceProgresses *source_progresses, app_data *data) { source_progress_data *prog_data = g_slice_new0 (source_progress_data); prog_data->data = data; prog_data->phase = SYNCEVO_PHASE_NONE; prog_data->source = NULL; syncevo_source_progresses_foreach (source_progresses, (SourceProgressFunc)find_updated_source_progress, prog_data); if (!prog_data->source) { set_sync_progress (data, ((float)progress) / 100, NULL); } else { char *name; char *msg = NULL; name = get_pretty_source_name (prog_data->source); switch (prog_data->phase) { case SYNCEVO_PHASE_PREPARING: msg = g_strdup_printf (_("Preparing '%s'"), name); break; case SYNCEVO_PHASE_RECEIVING: msg = g_strdup_printf (_("Receiving '%s'"), name); break; case SYNCEVO_PHASE_SENDING: msg = g_strdup_printf (_("Sending '%s'"), name); break; default: ; } if (msg) { set_sync_progress (data, ((float)progress) / 100, msg); } g_free (msg); g_free (name); } g_slice_free (source_progress_data, prog_data); } typedef struct source_stats { long status; long mode; long local_changes; long remote_changes; long local_rejections; long remote_rejections; } source_stats; static void free_source_stats (source_stats *stats) { g_slice_free (source_stats, stats); } static gboolean handle_source_report_item (char **strs, const char *value, GHashTable *sources) { source_stats *stats; char **tmp; char *name; if (g_strv_length (strs) < 3) { return FALSE; } /* replace '__' with '_' and '_+' with '-' */ tmp = g_strsplit (strs[1], "__", 0); name = g_strjoinv ("_", tmp); g_strfreev (tmp); tmp = g_strsplit (name, "_+", 0); g_free (name); name = g_strjoinv ("-", tmp); g_strfreev (tmp); stats = g_hash_table_lookup (sources, name); if (!stats) { stats = g_slice_new0 (source_stats); g_hash_table_insert (sources, g_strdup (name), stats); } g_free (name); if (strcmp (strs[2], "stat") == 0) { if (g_strv_length (strs) != 6) { return FALSE; } if (strcmp (strs[3], "remote") == 0) { if (strcmp (strs[4], "added") == 0 || strcmp (strs[4], "updated") == 0 || strcmp (strs[4], "removed") == 0) { stats->remote_changes += strtol (value, NULL, 10); } else if (strcmp (strs[5], "reject") == 0) { stats->remote_rejections += strtol (value, NULL, 10); } } else if (strcmp (strs[3], "local") == 0) { if (strcmp (strs[4], "added") == 0 || strcmp (strs[4], "updated") == 0 || strcmp (strs[4], "removed") == 0) { stats->local_changes += strtol (value, NULL, 10); } else if (strcmp (strs[5], "reject") == 0) { stats->local_rejections += strtol (value, NULL, 10); } } else { return FALSE; } } else if (strcmp (strs[2], "mode") == 0) { stats->mode = strtol (value, NULL, 10); } else if (strcmp (strs[2], "status") == 0) { stats->status = strtol (value, NULL, 10); } else if (strcmp (strs[2], "resume") == 0) { } else if (strcmp (strs[2], "first") == 0) { } else if (strcmp (strs[2], "backup") == 0) { if (g_strv_length (strs) != 4) { return FALSE; } if (strcmp (strs[3], "before") == 0) { } else if (strcmp (strs[3], "after") == 0) { } else { return FALSE; } } else { return FALSE; } return TRUE; } static char* get_report_summary (source_config *source) { char *rejects = NULL; char *changes = NULL; char *msg = NULL; if (!source->stats_set) { return g_strdup (""); } if (source->local_rejections + source->remote_rejections == 0) { rejects = NULL; } else if (source->local_rejections == 0) { rejects = g_strdup_printf (ngettext ("There was one remote rejection.", "There were %ld remote rejections.", source->remote_rejections), source->remote_rejections); } else if (source->remote_rejections == 0) { rejects = g_strdup_printf (ngettext ("There was one local rejection.", "There were %ld local rejections.", source->local_rejections), source->local_rejections); } else { rejects = g_strdup_printf (_ ("There were %ld local rejections and %ld remote rejections."), source->local_rejections, source->remote_rejections); } if (source->local_changes + source->remote_changes == 0) { changes = g_strdup_printf (_("Last time: No changes.")); } else if (source->local_changes == 0) { changes = g_strdup_printf (ngettext ("Last time: Sent one change.", "Last time: Sent %ld changes.", source->remote_changes), source->remote_changes); } else if (source->remote_changes == 0) { // This is about changes made to the local data. Not all of these // changes were requested by the remote server, so "applied" // is a better word than "received" (bug #5185). changes = g_strdup_printf (ngettext ("Last time: Applied one change.", "Last time: Applied %ld changes.", source->local_changes), source->local_changes); } else { changes = g_strdup_printf (_("Last time: Applied %ld changes and sent %ld changes."), source->local_changes, source->remote_changes); } if (rejects) msg = g_strdup_printf ("%s\n%s", changes, rejects); else msg = g_strdup (changes); g_free (rejects); g_free (changes); return msg; } /* return TRUE if no errors are shown */ static gboolean source_config_update_widget (source_config *source) { char *msg; gboolean show_error; SyncErrorResponse response; if (!source->label) { return TRUE; } msg = get_error_string_for_code (source->status, &response); if (msg) { show_error = TRUE; set_info_bar (source->info_bar, GTK_MESSAGE_ERROR, response, msg); } else { show_error = FALSE; gtk_widget_hide (source->info_bar); msg = get_report_summary (source); gtk_label_set_text (GTK_LABEL (source->label), msg); } g_free (msg); return !show_error; } static void get_reports_cb (SyncevoServer *server, SyncevoReports *reports, GError *error, app_data *data) { long status = -1; long common_status = -1; source_stats *stats; GHashTable *sources; /* key is source name, value is a source_stats */ GHashTableIter iter; const char *key, *val; source_config *source_conf; char *error_msg; SyncErrorResponse response; gboolean have_source_errors; GHashTable *report = NULL; guint len; if (error) { g_warning ("Error in Session.GetReports: %s", error->message); g_error_free (error); /* non-fatal, unknown error */ return; } sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)free_source_stats); len = syncevo_reports_get_length (reports); if (len > 0) { report = syncevo_reports_index (reports, 0); val = g_hash_table_lookup (report, "dir"); if (!val || strlen (val) == 0) { /* dummy report for first time sync info*/ if (len > 1) { report = syncevo_reports_index (reports, 1); } else { report = NULL; } } } if (report) { g_hash_table_iter_init (&iter, report); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&val)) { char **strs; strs = g_strsplit (key, "-", 6); if (!strs) { continue; } if (strcmp (strs[0], "source") == 0) { if (!handle_source_report_item (strs, val, sources)) { g_warning ("Unidentified sync report item: %s=%s", key, val); } } else if (strcmp (strs[0], "start") == 0) { /* not used */ } else if (strcmp (strs[0], "end") == 0) { data->last_sync = strtol (val, NULL, 10); } else if (strcmp (strs[0], "status") == 0) { status = strtol (val, NULL, 10); } else if (strcmp (strs[0], "peer") == 0) { /* not used */ } else if (strcmp (strs[0], "error") == 0) { /* not used */ } else if (strcmp (strs[0], "dir") == 0) { /* not used */ } else { g_warning ("Unidentified sync report item: %s=%s", key, val); } g_strfreev (strs); } } else { common_status = 0; } /* sources now has all statistics we want */ /* ficure out if all sources have same status or if there's a slow sync */ data->forced_emergency = FALSE; g_hash_table_remove_all (data->emergency_sources); g_hash_table_iter_init (&iter, sources); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&stats)) { if (stats->status == 22001) { /* ignore abort because of another source slow syncing */ } else if (stats->status == 22000) { common_status = stats->status; data->forced_emergency = TRUE; g_hash_table_insert (data->emergency_sources, g_strdup (key), ""); } else if (common_status == -1) { common_status = stats->status; } else if (common_status != stats->status) { common_status = 0; } } if (status != 200) { /* don't want to show a sync time for failed syncs */ data->last_sync = -1; } if (!data->forced_emergency) { /* if user initiates a emergency sync wihtout forced_emergency, enable all sources by default*/ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&source_conf)) { if (source_config_is_usable (source_conf)) { g_hash_table_insert (data->emergency_sources, g_strdup (key), ""); } } } /* get common error message */ error_msg = get_error_string_for_code (common_status, &response); have_source_errors = FALSE; g_hash_table_iter_init (&iter, sources); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&stats)) { /* store the statistics in source config */ source_conf = g_hash_table_lookup (data->current_service->source_configs, key); if (source_conf) { source_conf->stats_set = TRUE; source_conf->local_changes = stats->local_changes; source_conf->remote_changes = stats->remote_changes; source_conf->local_rejections = stats->local_rejections; source_conf->remote_rejections = stats->remote_rejections; if (error_msg) { /* there is a service-wide error, no need to show here */ source_conf->status = 0; } else { source_conf->status = stats->status; } /* if ui has been constructed already, update it */ if (!source_config_update_widget (source_conf)) { have_source_errors = TRUE; } } } if (!error_msg && !have_source_errors) { /* no common source errors or individual source errors: it's still possible that there are sync errors */ error_msg = get_error_string_for_code (status, &response); } /* update service UI */ refresh_last_synced_label (data); if (error_msg) { GtkMessageType type = GTK_MESSAGE_ERROR; if (response == SYNC_ERROR_RESPONSE_EMERGENCY) { type = GTK_MESSAGE_QUESTION; } if (!data->synced_this_session) { /* TRANSLATORS: the placeholder is a error message (hopefully) * explaining the problem */ char *msg = g_strdup_printf (_("There was a problem with last sync:\n%s"), error_msg); g_free (error_msg); error_msg = msg; } set_info_bar (data->info_bar, type, response, error_msg); g_free (error_msg); } else if (data->current_operation == OP_RESTORE) { /* special case for just after restoring */ error_msg = g_strdup_printf (_("You've just restored a backup. The changes have not been " "synced with %s yet"), data->current_service->pretty_name); set_info_bar (data->info_bar, GTK_MESSAGE_INFO, SYNC_ERROR_RESPONSE_SYNC, error_msg); } g_hash_table_destroy (sources); } static void set_config_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { g_warning ("Error in Session.SetConfig: %s", error->message); g_error_free (error); /* TODO show in UI: save failed */ } g_object_unref (session); } static void restore_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { g_warning ("Error in Session.Restore: %s", error->message); g_error_free (error); return; } } static void restore_backup (app_data *data, SyncevoSession *session, const char *dir) { char **sources; GHashTableIter iter; int i = 0; char *source; sources = g_malloc0 (sizeof (char*) * (g_hash_table_size (data->emergency_sources) + 1)); g_hash_table_iter_init (&iter, data->emergency_sources); while (g_hash_table_iter_next (&iter, (gpointer)&source, NULL)) { sources[i++] = g_strdup (source); } sources[i] = NULL; syncevo_session_restore (session, dir, TRUE, (const char**)sources, (SyncevoSessionGenericCb)restore_cb, data); g_strfreev (sources); } static void save_config (app_data *data, SyncevoSession *session) { syncevo_session_set_config (session, TRUE, FALSE, data->current_service->config, (SyncevoSessionGenericCb)set_config_cb, data); } static void do_sync (operation_data *op_data, SyncevoSession *session) { GHashTable *source_modes; GHashTableIter iter; source_config *source; SyncevoSyncMode mode = SYNCEVO_SYNC_NONE; app_data *data = op_data->data; source_modes = syncevo_source_modes_new (); if (op_data->operation != OP_SYNC) { /* in an emergency sync, set non-emergency sources to not sync*/ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, NULL, (gpointer)&source)) { if (g_hash_table_lookup (data->emergency_sources, source->name) == NULL) { syncevo_source_modes_add (source_modes, source->name, SYNCEVO_SYNC_NONE); } } } /* override all non-supported with "none". */ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, NULL, (gpointer)&source)) { if (!source->supported_locally) { syncevo_source_modes_add (source_modes, source->name, SYNCEVO_SYNC_NONE); } } /* use given mode or use default for normal syncs */ switch (op_data->operation) { case OP_SYNC: mode = SYNCEVO_SYNC_DEFAULT; break; case OP_SYNC_SLOW: mode = SYNCEVO_SYNC_SLOW; break; case OP_SYNC_REFRESH_FROM_CLIENT: mode = SYNCEVO_SYNC_REFRESH_FROM_CLIENT; break; case OP_SYNC_REFRESH_FROM_SERVER: mode = SYNCEVO_SYNC_REFRESH_FROM_SERVER; break; default: g_warn_if_reached(); } syncevo_session_sync (session, mode, source_modes, (SyncevoSessionGenericCb)sync_cb, data); syncevo_source_modes_free (source_modes); } static void set_config_for_sync_cb (SyncevoSession *session, GError *error, operation_data *op_data) { if (error) { g_warning ("Error in Session.SetConfig: %s", error->message); g_error_free (error); /* TODO show in UI: sync failed (failed to even start) */ return; } do_sync (op_data, session); } static void run_operation (operation_data *op_data, SyncevoSession *session) { SyncevoConfig *config; /* when we first get idle, start the operation */ if (op_data->started) { return; } op_data->started = TRUE; op_data->data->current_operation = op_data->operation; /* time for business */ switch (op_data->operation) { case OP_SYNC: case OP_SYNC_SLOW: case OP_SYNC_REFRESH_FROM_CLIENT: case OP_SYNC_REFRESH_FROM_SERVER: /* Make sure we don't get change diffs printed out, then sync */ config = g_hash_table_new (g_str_hash, g_str_equal); syncevo_config_set_value (config, NULL, "printChanges", "0"); syncevo_session_set_config (session, TRUE, TRUE, config, (SyncevoSessionGenericCb)set_config_for_sync_cb, op_data); syncevo_config_free (config); break; case OP_SAVE: save_config (op_data->data, session); break; case OP_RESTORE: restore_backup (op_data->data, session, op_data->dir); break; default: g_warn_if_reached (); } } /* Our sync session status */ static void status_changed_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, operation_data *op_data) { switch (status) { case SYNCEVO_STATUS_IDLE: run_operation (op_data, session); break; case SYNCEVO_STATUS_DONE: op_data->data->synced_this_session = TRUE; /* no need for sync session anymore */ g_object_unref (session); /* refresh stats -- the service may no longer be the one syncing, * and we might have only saved config but what the heck... */ syncevo_server_get_reports (op_data->data->server, op_data->data->current_service->name, 0, 1, (SyncevoServerGetReportsCb)get_reports_cb, op_data->data); g_slice_free (operation_data, op_data); default: ; } } /* Our sync (or config-save) session status */ static void get_status_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, operation_data *op_data) { if (error) { g_warning ("Error in Session.GetStatus: %s", error->message); g_error_free (error); g_object_unref (session); switch (op_data->operation) { case OP_SYNC: /* TODO show in UI: sync failed (failed to even start) */ break; case OP_SAVE: /* TODO show in UI: save failed */ break; default: g_warn_if_reached (); } g_slice_free (operation_data, op_data); return; } if (status == SYNCEVO_STATUS_IDLE) { run_operation (op_data, session); } } static void start_session_cb (SyncevoServer *server, char *path, GError *error, operation_data *op_data) { SyncevoSession *session; app_data *data = op_data->data; if (error) { g_warning ("Error in Server.StartSession: %s", error->message); g_error_free (error); g_free (path); switch (op_data->operation) { case OP_SYNC: /* TODO show in UI: sync failed (failed to even start) */ break; case OP_SAVE: /* TODO show in UI: save failed */ break; default: g_warn_if_reached (); } g_slice_free (operation_data, op_data); return; } session = syncevo_session_new (path); if (data->running_session && strcmp (path, syncevo_session_get_path (data->running_session)) != 0) { /* This is a really unfortunate event: Someone got a session and we did not have time to set UI insensitive... */ gtk_label_set_markup (GTK_LABEL (data->server_label), _("Waiting for current operation to finish...")); gtk_widget_show_all (data->sources_box); } /* we want to know about status changes to our session */ g_signal_connect (session, "status-changed", G_CALLBACK (status_changed_cb), op_data); syncevo_session_get_status (session, (SyncevoSessionGetStatusCb)get_status_cb, op_data); g_free (path); } /* TODO: this function should accept source/peer name as param */ char* get_error_string_for_code (int error_code, SyncErrorResponse *response) { if (response) { *response = SYNC_ERROR_RESPONSE_NONE; } switch (error_code) { case -1: /* no errorcode */ case 0: case 200: case LOCERR_USERABORT: case LOCERR_USERSUSPEND: return NULL; case 22000: if (response) { *response = SYNC_ERROR_RESPONSE_EMERGENCY; } /* TRANSLATORS: next strings are error messages. */ return g_strdup (_("A normal sync is not possible at this time. The server " "suggests a slow sync, but this might not always be " "what you want if both ends already have data.")); case 22002: return g_strdup (_("The sync process died unexpectedly.")); case 22003: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup (_("Password request was not answered. You can save the " "password in the settings to prevent the request.")); case 506: /* TODO use the service device name here, this is a remote problem */ return g_strdup (_("There was a problem processing sync request. " "Trying again may help.")); case DB_Unauthorized: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("Failed to login. Could there be a problem with " "your username or password?")); case DB_Forbidden: return g_strdup(_("Forbidden")); case DB_NotFound: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } /* TRANSLATORS: data source means e.g. calendar or addressbook */ return g_strdup(_("A data source could not be found. Could there be a " "problem with the settings?")); case DB_Fatal: case DB_Error: return g_strdup(_("Remote database error")); case LOCAL_STATUS_CODE + DB_Fatal: /* This can happen when EDS is borked, restart it may help... */ return g_strdup(_("There is a problem with the local database. " "Syncing again or rebooting may help.")); case DB_Full: return g_strdup(_("No space on disk")); case LOCERR_PROCESSMSG: return g_strdup(_("Failed to process SyncML")); case LOCERR_AUTHFAIL: return g_strdup(_("Server authorization failed")); case LOCERR_CFGPARSE: return g_strdup(_("Failed to parse configuration file")); case LOCERR_CFGREAD: return g_strdup(_("Failed to read configuration file")); case LOCERR_NOCFG: return g_strdup(_("No configuration found")); case LOCERR_NOCFGFILE: return g_strdup(_("No configuration file found")); case LOCERR_BADCONTENT: return g_strdup(_("Server sent bad content")); case LOCERR_CERT_EXPIRED: return g_strdup(_("Connection certificate has expired")); case LOCERR_CERT_INVALID: return g_strdup(_("Connection certificate is invalid")); case LOCERR_CONN: case LOCERR_NOCONN: case LOCERR_TRANSPFAIL: case LOCERR_TIMEOUT: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("We were unable to connect to the server. The problem " "could be temporary or there could be something wrong " "with the settings.")); case LOCERR_BADURL: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("The server URL is bad")); case LOCERR_SRVNOTFOUND: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("The server was not found")); default: return g_strdup_printf (_("Error %d"), error_code); } } static void server_shutdown_cb (SyncevoServer *server, app_data *data) { if (data->syncing) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync failed")); set_sync_progress (data, 1.0 , ""); set_app_state (data, SYNC_UI_STATE_SERVER_OK); } /* re-init server here */ } static void set_running_session (app_data *data, const char *path) { if (data->running_session) { g_object_unref (data->running_session); } if (!path) { data->running_session = NULL; return; } data->running_session = syncevo_session_new (path); g_signal_connect (data->running_session, "progress-changed", G_CALLBACK (running_session_progress_changed_cb), data); g_signal_connect (data->running_session, "status-changed", G_CALLBACK (running_session_status_changed_cb), data); syncevo_session_get_status (data->running_session, (SyncevoSessionGetStatusCb)get_running_session_status_cb, data); } static void set_online_status (app_data *data, gboolean online) { if (online != data->online) { data->online = online; if (data->current_state == SYNC_UI_STATE_SERVER_OK) { if (data->online) { gtk_widget_hide (data->no_connection_box); } else { gtk_widget_show (data->no_connection_box); } } gtk_widget_set_sensitive (data->sync_btn, data->online); } } static void get_presence_cb (SyncevoServer *server, char *status, char **transports, GError *error, app_data *data) { if (error) { g_warning ("Server.GetSessions failed: %s", error->message); g_error_free (error); /* non-fatal, ignore in UI */ return; } if (data->current_service && status) { set_online_status (data, strcmp (status, "") == 0); } g_free (status); g_strfreev (transports); } static void password_dialog_response_cb (GtkWidget *dialog, int response, app_data *data) { const char *password; GHashTable *return_dict; return_dict = g_hash_table_new (g_str_hash, g_str_equal); if (response == GTK_RESPONSE_OK) { password = gtk_entry_get_text (GTK_ENTRY (data->password_dialog_entry)); g_hash_table_insert (return_dict, "password", (gpointer)password); } syncevo_server_info_response (data->server, data->password_dialog_id, "response", return_dict, NULL, NULL); g_hash_table_destroy (return_dict); g_free (data->password_dialog_id); data->password_dialog_id = NULL; gtk_widget_destroy (dialog); } static void info_request_cb (SyncevoServer *syncevo, char *id, char *session_path, char *state, char *handler_path, char *type, GHashTable *parameters, app_data *data) { GHashTable *t; GtkWidget *dialog, *content, *label, *align; char *msg; if (g_strcmp0 (state, "request") != 0 || g_strcmp0 (type, "password") != 0) { /* not handling other stuff */ return; } if (!data->running_session || g_strcmp0 (session_path, syncevo_session_get_path (data->running_session)) != 0) { /* not our problem */ return; } t = g_hash_table_new (g_str_hash, g_str_equal); syncevo_server_info_response (syncevo, id, "working", t, NULL, NULL); g_hash_table_destroy (t); data->password_dialog_id = g_strdup (id); /* TRANSLATORS: password request dialog contents: title, cancel button * and ok button */ dialog = gtk_dialog_new_with_buttons (_("Password is required for sync"), GTK_WINDOW (data->sync_win), GTK_DIALOG_DESTROY_WITH_PARENT, _("Cancel sync"), GTK_RESPONSE_CANCEL, _("Sync with password"), GTK_RESPONSE_OK, NULL); content = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); align = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 16, 16); gtk_widget_show (align); gtk_box_pack_start (GTK_BOX (content), align, FALSE, FALSE, 6); /* TRANSLATORS: password request dialog message, placeholder is service name */ msg = g_strdup_printf (_("Please enter password for syncing with %s:"), data->current_service->pretty_name); label = gtk_label_new (msg); gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); gtk_widget_set_size_request (label, 500, -1); gtk_widget_show (label); gtk_container_add (GTK_CONTAINER (align), label); g_free (msg); align = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 16, 16); gtk_widget_show (align); gtk_box_pack_start (GTK_BOX (content), align, FALSE, FALSE, 6); data->password_dialog_entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (data->password_dialog_entry), 99); gtk_entry_set_width_chars (GTK_ENTRY (data->password_dialog_entry), 30); gtk_entry_set_visibility (GTK_ENTRY (data->password_dialog_entry), FALSE); gtk_widget_show (data->password_dialog_entry); gtk_container_add (GTK_CONTAINER (align), data->password_dialog_entry); g_signal_connect (dialog, "response", G_CALLBACK (password_dialog_response_cb), data); gtk_window_present (GTK_WINDOW (dialog)); gtk_widget_grab_focus (data->password_dialog_entry); } static void server_presence_changed_cb (SyncevoServer *server, char *config_name, char *status, char *transport, app_data *data) { if (data->current_service && config_name && status && g_ascii_strcasecmp (data->current_service->name, config_name) == 0) { set_online_status (data, strcmp (status, "") == 0); } } static void server_templates_changed_cb (SyncevoServer *server, app_data *data) { if (gtk_widget_get_visible (data->services_box)) { update_services_list (data); } } static void server_session_changed_cb (SyncevoServer *server, char *path, gboolean started, app_data *data) { if (started) { set_running_session (data, path); } else if (data->running_session && strcmp (syncevo_session_get_path (data->running_session), path) == 0 ) { set_running_session (data, NULL); } } static void get_sessions_cb (SyncevoServer *server, SyncevoSessions *sessions, GError *error, app_data *data) { const char *path; if (error) { g_warning ("Server.GetSessions failed: %s", error->message); g_error_free (error); /* TODO show in UI: failed first syncevo call (unexpected, fatal?) */ return; } /* assume first one is active */ path = syncevo_sessions_index (sessions, 0); set_running_session (data, path); syncevo_sessions_free (sessions); } static void get_config_for_default_peer_cb (SyncevoServer *syncevo, SyncevoConfig *config, GError *error, app_data *data) { char *name; if (error) { g_warning ("Server.GetConfig failed: %s", error->message); g_error_free (error); /* TODO show in UI: failed first syncevo call (unexpected, fatal?) */ return; } syncevo_config_get_value (config, NULL, "defaultPeer", &name); reload_config (data, name); syncevo_config_free (config); } app_data* sync_ui_create () { app_data *data; data = g_slice_new0 (app_data); data->online = TRUE; data->current_state = SYNC_UI_STATE_GETTING_SERVER; data->forced_emergency = FALSE; data->emergency_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); if (!init_ui (data)) { return NULL; } data->server = syncevo_server_get_default(); g_signal_connect (data->server, "shutdown", G_CALLBACK (server_shutdown_cb), data); g_signal_connect (data->server, "session-changed", G_CALLBACK (server_session_changed_cb), data); g_signal_connect (data->server, "presence-changed", G_CALLBACK (server_presence_changed_cb), data); g_signal_connect (data->server, "templates-changed", G_CALLBACK (server_templates_changed_cb), data); g_signal_connect (data->server, "info-request", G_CALLBACK (info_request_cb), data); syncevo_server_get_config (data->server, "", FALSE, (SyncevoServerGetConfigCb)get_config_for_default_peer_cb, data); syncevo_server_get_sessions (data->server, (SyncevoServerGetSessionsCb)get_sessions_cb, data); gtk_window_present (GTK_WINDOW (data->sync_win)); return data; } void sync_ui_show_settings (app_data *data, const char *id) { show_services_list (data, id); } GtkWindow* sync_ui_get_main_window (app_data *data) { return GTK_WINDOW(data->sync_win); } syncevolution-1.5/src/gtk-ui/sync-ui.h0000644000373300001540000000350412326412403021244 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SYNC_UI_H #define SYNC_UI_H #include #include "config.h" #include "sync-ui-config.h" #include "sync-ui.h" #define SYNC_UI_LIST_ICON_SIZE 32 #define SYNC_UI_LIST_BTN_WIDTH 150 typedef struct _app_data app_data; typedef enum SyncErrorResponse { SYNC_ERROR_RESPONSE_NONE, SYNC_ERROR_RESPONSE_SYNC, SYNC_ERROR_RESPONSE_SETTINGS_SELECT, SYNC_ERROR_RESPONSE_SETTINGS_OPEN, SYNC_ERROR_RESPONSE_EMERGENCY, SYNC_ERROR_RESPONSE_EMERGENCY_SLOW_SYNC, } SyncErrorResponse; char* get_pretty_source_name (const char *source_name); char* get_error_string_for_code (int error_code, SyncErrorResponse *response); void show_error_dialog (GtkWidget *widget, const char* message); gboolean show_confirmation (GtkWidget *widget, const char *message, const char *yes, const char *no); app_data *sync_ui_create (); GtkWindow *sync_ui_get_main_window (app_data *data); void sync_ui_show_settings (app_data *data, const char *id); void toggle_set_active (GtkWidget *toggle, gboolean active); gboolean toggle_get_active (GtkWidget *toggle); #endif syncevolution-1.5/src/gtk-ui/sync-ui-config.c0000644000373300001540000001006712326412403022504 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include "sync-ui-config.h" #include "sync-ui.h" void server_config_free (server_config *server) { if (!server) return; g_free (server->name); syncevo_config_free (server->config); g_slice_free (server_config, server); } void server_config_update_from_entry (server_config *server, GtkEntry *entry) { char **str; const char *new_str; /* all entries have a pointer to the correct string in server_config */ str = g_object_get_data (G_OBJECT (entry), "value"); g_assert (str); new_str = gtk_entry_get_text (entry); if ((*str == NULL && strlen (new_str) != 0) || (*str != NULL && strcmp (*str, new_str) != 0)) { server->changed = TRUE; g_free (*str); *str = g_strdup (new_str); } } static void add_source_config (char *name, GHashTable *syncevo_source_config, GHashTable *source_configs) { source_config *new_conf; new_conf = g_slice_new0 (source_config); new_conf->name = name; new_conf->supported_locally = TRUE; new_conf->stats_set = FALSE; new_conf->config = syncevo_source_config; g_hash_table_insert (source_configs, name, new_conf); } void server_config_init (server_config *server, SyncevoConfig *config) { server->config = config; /* build source_configs */ server->source_configs = g_hash_table_new (g_str_hash, g_str_equal); syncevo_config_foreach_source (config, (ConfigFunc)add_source_config, server->source_configs); if (!syncevo_config_get_value (config, NULL, "PeerName", &server->pretty_name)) { server->pretty_name = server->name; } } gboolean source_config_is_usable (source_config *source) { const char *source_uri; source_uri = g_hash_table_lookup (source->config, "uri"); if (!source_config_is_enabled (source) || !source_uri || strlen (source_uri) == 0 || !source->supported_locally) { return FALSE; } return TRUE; } gboolean source_config_is_enabled (source_config *source) { char *mode; mode = g_hash_table_lookup (source->config, "sync"); if (mode && (strcmp (mode, "none") == 0 || strcmp (mode, "disabled") == 0)) { return FALSE; } return TRUE; } server_data* server_data_new (const char *name, gpointer *data) { server_data *serv_data; serv_data = g_slice_new0 (server_data); serv_data->data = data; serv_data->config = g_slice_new0 (server_config); serv_data->config->name = g_strdup (name); return serv_data; } void server_data_free (server_data *data, gboolean free_config) { if (!data) return; if (free_config && data->config) { server_config_free (data->config); } if (data->options_override) { /* g_ptr_array_foreach (data->options_override, (GFunc)syncevo_option_free, NULL); */ g_ptr_array_free (data->options_override, TRUE); } g_slice_free (server_data, data); } gboolean peer_is_client (SyncevoConfig *config) { char *is_client; g_return_val_if_fail (config, FALSE); syncevo_config_get_value (config, NULL, "PeerIsClient", &is_client); return is_client && g_strcmp0 ("1", is_client) == 0; } syncevolution-1.5/src/gtk-ui/sync-ui-config.h0000644000373300001540000000605712326412403022515 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SYNC_UI_CONFIG_H #define SYNC_UI_CONFIG_H #include #include "syncevo-session.h" #include "syncevo-server.h" typedef struct source_config { char *name; gboolean supported_locally; SyncevoSourcePhase phase; gboolean stats_set; long status; long local_changes; long remote_changes; long local_rejections; long remote_rejections; GtkWidget *info_bar; /* info/error bar, after ui has been constructed */ GtkWidget *label; /* source report label, after ui has been constructed */ GtkWidget *box; /* source box, after ui has been constructed */ GHashTable *config; /* link to a "sub-hashtable" inside server_config->config */ } source_config; typedef struct server_config { char *name; char *pretty_name; char *password; /* any field in config has changed */ gboolean changed; /* a authentication detail (base_url/username/password) has changed */ gboolean auth_changed; gboolean password_changed; GHashTable *source_configs; /* source_config's*/ SyncevoConfig *config; } server_config; gboolean source_config_is_usable (source_config *source); gboolean source_config_is_enabled (source_config *source); void source_config_free (source_config *source); void server_config_init (server_config *server, SyncevoConfig *config); void server_config_free (server_config *server); void server_config_update_from_entry (server_config *server, GtkEntry *entry); GPtrArray* server_config_get_option_array (server_config *server); void server_config_disable_unsupported_sources (server_config *server); void server_config_ensure_default_sources_exist (server_config *server); /* data structure for syncevo_service_get_template_config_async and * syncevo_service_get_server_config_async. server is the server that * the method was called for. options_override are options that should * be overridden on the config we get. */ typedef struct server_data { server_config *config; GPtrArray *options_override; gpointer *data; } server_data; server_data* server_data_new (const char *name, gpointer *data); void server_data_free (server_data *data, gboolean free_config); /** * utility function: TRUE if the config belongs to a client (PeerIsClient) */ gboolean peer_is_client (SyncevoConfig *config); #endif syncevolution-1.5/src/gtk-ui/mux-frame.c0000644000373300001540000003067212326412403021557 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "mux-frame.h" #include static GdkColor mux_frame_default_border_color = { 0, 0xdddd, 0xe2e2, 0xe5e5 }; static GdkColor mux_frame_default_bullet_color = { 0, 0xaaaa, 0xaaaa, 0xaaaa }; static gfloat mux_frame_bullet_size_factor = 1.3; #define MUX_FRAME_BULLET_PADDING 10 static void mux_frame_buildable_init (GtkBuildableIface *iface); static void mux_frame_buildable_add_child (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *type); G_DEFINE_TYPE_WITH_CODE (MuxFrame, mux_frame, GTK_TYPE_FRAME, G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, mux_frame_buildable_init)) static void mux_frame_dispose (GObject *object) { G_OBJECT_CLASS (mux_frame_parent_class)->dispose (object); } static void mux_frame_finalize (GObject *object) { G_OBJECT_CLASS (mux_frame_parent_class)->finalize (object); } static void label_changed_cb (MuxFrame *frame) { char *font = NULL; GtkFrame *gtk_frame = GTK_FRAME (frame); GtkWidget *label = gtk_frame_get_label_widget (gtk_frame); if (!label) return; /* ensure font is correct */ gtk_widget_style_get (GTK_WIDGET (frame), "title-font", &font, NULL); if (font) { PangoFontDescription *desc; desc = pango_font_description_from_string (font); gtk_widget_modify_font (label, desc); pango_font_description_free (desc); g_free (font); } gtk_misc_set_alignment (GTK_MISC (label), 0.0, 1.0); } static void mux_frame_update_style (MuxFrame *frame) { GdkColor *border_color, *bullet_color; gtk_widget_style_get (GTK_WIDGET (frame), "border-color", &border_color, "bullet-color", &bullet_color, NULL); if (border_color) { frame->border_color = *border_color; gdk_color_free (border_color); } else { frame->border_color = mux_frame_default_border_color; } if (bullet_color) { frame->bullet_color = *bullet_color; gdk_color_free (bullet_color); } else { frame->bullet_color = mux_frame_default_bullet_color; } label_changed_cb (frame); } static void rounded_rectangle (cairo_t * cr, double x, double y, double w, double h, guint radius) { if (radius > w / 2) radius = w / 2; if (radius > h / 2) radius = h / 2; cairo_move_to (cr, x + radius, y); cairo_arc (cr, x + w - radius, y + radius, radius, M_PI * 1.5, M_PI * 2); cairo_arc (cr, x + w - radius, y + h - radius, radius, 0, M_PI * 0.5); cairo_arc (cr, x + radius, y + h - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x + radius, y + radius, radius, M_PI, M_PI * 1.5); } static void mux_frame_paint (GtkWidget *widget, GdkRectangle *area) { MuxFrame *frame = MUX_FRAME (widget); cairo_t *cairo; GtkStyle *style; guint width; g_return_if_fail (widget != NULL); g_return_if_fail (MUX_IS_FRAME (widget)); g_return_if_fail (area != NULL); style = gtk_widget_get_style (widget); cairo = gdk_cairo_create (widget->window); width = gtk_container_get_border_width (GTK_CONTAINER (widget)); /* draw border */ if (width != 0) { gdk_cairo_set_source_color (cairo, &frame->border_color); rounded_rectangle (cairo, widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height, width); cairo_clip (cairo); gdk_cairo_rectangle (cairo, area); cairo_clip (cairo); cairo_paint (cairo); } /* draw background */ gdk_cairo_set_source_color (cairo, &style->bg[GTK_WIDGET_STATE(widget)]); rounded_rectangle (cairo, widget->allocation.x + width, widget->allocation.y + width, widget->allocation.width - 2 * width, widget->allocation.height- 2 * width, width); cairo_clip (cairo); gdk_cairo_rectangle (cairo, area); cairo_clip (cairo); cairo_paint (cairo); /* draw bullet before title */ if (gtk_frame_get_label_widget (GTK_FRAME (frame))) { gdk_cairo_set_source_color (cairo, &frame->bullet_color); rounded_rectangle (cairo, frame->bullet_allocation.x, frame->bullet_allocation.y, frame->bullet_allocation.height, frame->bullet_allocation.height, 4); cairo_clip (cairo); gdk_cairo_rectangle (cairo, area); cairo_clip (cairo); cairo_paint (cairo); } cairo_destroy (cairo); } static gboolean mux_frame_expose(GtkWidget *widget, GdkEventExpose *event) { GtkWidgetClass *grand_parent; if (gtk_widget_is_drawable (widget)) { mux_frame_paint (widget, &event->area); grand_parent = GTK_WIDGET_CLASS (g_type_class_peek_parent (mux_frame_parent_class)); grand_parent->expose_event (widget, event); } return FALSE; } static void mux_frame_size_request (GtkWidget *widget, GtkRequisition *requisition) { GtkWidget *label = gtk_frame_get_label_widget (GTK_FRAME (widget)); GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget)); GtkRequisition child_req; GtkRequisition title_req; child_req.width = child_req.height = 0; if (child) gtk_widget_size_request (child, &child_req); title_req.width = title_req.height = 0; if (label) { gtk_widget_size_request (label, &title_req); /* add room for bullet */ title_req.height = title_req.height * mux_frame_bullet_size_factor + 2 * MUX_FRAME_BULLET_PADDING; title_req.width += title_req.height * mux_frame_bullet_size_factor + 2 * MUX_FRAME_BULLET_PADDING; } requisition->width = MAX (child_req.width, title_req.width) + 2 * (GTK_CONTAINER (widget)->border_width + GTK_WIDGET (widget)->style->xthickness); requisition->height = title_req.height + child_req.height + 2 * (GTK_CONTAINER (widget)->border_width + GTK_WIDGET (widget)->style->ythickness); } static void mux_frame_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkBin *bin = GTK_BIN (widget); MuxFrame *mux_frame = MUX_FRAME (widget); GtkFrame *frame = GTK_FRAME (widget); GtkAllocation child_allocation; int xmargin, ymargin, title_height; widget->allocation = *allocation; xmargin = GTK_CONTAINER (widget)->border_width + widget->style->xthickness; ymargin = GTK_CONTAINER (widget)->border_width + widget->style->ythickness; title_height = 0; if (frame->label_widget) { GtkAllocation title_allocation; GtkRequisition title_req; gtk_widget_get_child_requisition (frame->label_widget, &title_req); /* the bullet is bigger than the text */ title_height = title_req.height * mux_frame_bullet_size_factor + 2 * MUX_FRAME_BULLET_PADDING; /* x allocation starts after bullet */ title_allocation.x = allocation->x + xmargin + title_height; title_allocation.y = allocation->y + ymargin + MUX_FRAME_BULLET_PADDING; title_allocation.width = MIN (title_req.width, allocation->width - 2 * xmargin - title_height); title_allocation.height = title_height - 2 * MUX_FRAME_BULLET_PADDING; gtk_widget_size_allocate (frame->label_widget, &title_allocation); mux_frame->bullet_allocation.x = allocation->x + xmargin + MUX_FRAME_BULLET_PADDING; mux_frame->bullet_allocation.y = allocation->y + ymargin + MUX_FRAME_BULLET_PADDING; mux_frame->bullet_allocation.width = title_allocation.height; mux_frame->bullet_allocation.height = title_allocation.height; } child_allocation.x = allocation->x + xmargin; child_allocation.y = allocation->y + ymargin + title_height; child_allocation.width = allocation->width - 2 * xmargin; child_allocation.height = allocation->height - 2 * ymargin - title_height; if (GTK_WIDGET_MAPPED (widget) && (child_allocation.x != frame->child_allocation.x || child_allocation.y != frame->child_allocation.y || child_allocation.width != frame->child_allocation.width || child_allocation.height != frame->child_allocation.height)) { gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE); } if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { gtk_widget_size_allocate (bin->child, &child_allocation); } frame->child_allocation = child_allocation; } static void mux_frame_style_set (GtkWidget *widget, GtkStyle *previous) { MuxFrame *frame = MUX_FRAME (widget); mux_frame_update_style (frame); GTK_WIDGET_CLASS (mux_frame_parent_class)->style_set (widget, previous); } static void mux_frame_class_init (MuxFrameClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GParamSpec *pspec; object_class->dispose = mux_frame_dispose; object_class->finalize = mux_frame_finalize; widget_class->expose_event = mux_frame_expose; widget_class->size_request = mux_frame_size_request; widget_class->size_allocate = mux_frame_size_allocate; widget_class->style_set = mux_frame_style_set; pspec = g_param_spec_boxed ("border-color", "Border color", "Color of the outside border", GDK_TYPE_COLOR, G_PARAM_READABLE); gtk_widget_class_install_style_property(widget_class, pspec); pspec = g_param_spec_boxed ("bullet-color", "Bullet color", "Color of the rounded rectangle before a title", GDK_TYPE_COLOR, G_PARAM_READABLE); gtk_widget_class_install_style_property(widget_class, pspec); pspec = g_param_spec_string ("title-font", "Title font", "Pango font description string for title text", "12", G_PARAM_READWRITE); gtk_widget_class_install_style_property(widget_class, pspec); } static void mux_frame_buildable_add_child (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *type) { if (!type) gtk_container_add (GTK_CONTAINER (buildable), GTK_WIDGET (child)); else GTK_BUILDER_WARN_INVALID_CHILD_TYPE (MUX_FRAME (buildable), type); } static void mux_frame_buildable_init (GtkBuildableIface *iface) { iface->add_child = mux_frame_buildable_add_child; } static void mux_frame_init (MuxFrame *self) { g_signal_connect (self, "notify::label-widget", G_CALLBACK (label_changed_cb), NULL); } GtkWidget* mux_frame_new (void) { return g_object_new (MUX_TYPE_FRAME, "border-width", 4, NULL); } syncevolution-1.5/src/gtk-ui/mux-frame.h0000644000373300001540000000325112326412403021555 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _MUX_FRAME #define _MUX_FRAME #include #include G_BEGIN_DECLS #define MUX_TYPE_FRAME mux_frame_get_type() #define MUX_FRAME(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUX_TYPE_FRAME, MuxFrame)) #define MUX_FRAME_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), MUX_TYPE_FRAME, MuxFrameClass)) #define MUX_IS_FRAME(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUX_TYPE_FRAME)) #define MUX_IS_FRAME_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), MUX_TYPE_FRAME)) #define MUX_FRAME_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), MUX_TYPE_FRAME, MuxFrameClass)) typedef struct { GtkFrame parent; GtkAllocation bullet_allocation; GdkColor bullet_color; GdkColor border_color; } MuxFrame; typedef struct { GtkFrameClass parent_class; } MuxFrameClass; GType mux_frame_get_type (void); GtkWidget* mux_frame_new (void); G_END_DECLS #endif syncevolution-1.5/src/gtk-ui/sync-config-widget.c0000644000373300001540000022321012326412403023346 0ustar00nightlynightly00000000000000#include "config.h" #include #include #include #include #include #ifdef USE_MOBLIN_UX #ifdef MX_GTK_0_99_1 #include #else #include #endif #endif #include "sync-ui.h" #include "sync-config-widget.h" /* local copy of GtkInfoBar, used when GTK+ < 2.18 */ #include "gtkinfobar.h" #define INDICATOR_SIZE 16 #define CHILD_PADDING 3 G_DEFINE_TYPE (SyncConfigWidget, sync_config_widget, GTK_TYPE_CONTAINER) typedef struct source_widgets { char *name; GtkWidget *label; GtkWidget *entry; GtkWidget *check; GtkWidget *source_toggle_label; guint count; } source_widgets; enum { PROP_0, PROP_SERVER, PROP_NAME, PROP_CONFIG, PROP_CURRENT, PROP_HAS_TEMPLATE, PROP_CONFIGURED, PROP_CURRENT_SERVICE_NAME, PROP_EXPANDED, }; enum { SIGNAL_CHANGED, LAST_SIGNAL }; static guint32 signals[LAST_SIGNAL] = {0, }; typedef struct save_config_data { SyncConfigWidget *widget; gboolean delete; gboolean temporary; source_widgets *widgets; char *basename; } save_config_data; static void start_session_for_config_write_cb (SyncevoServer *server, char *path, GError *error, save_config_data *data); static void sync_config_widget_update_label (SyncConfigWidget *self); static void sync_config_widget_set_name (SyncConfigWidget *self, const char *name); static void remove_child (GtkWidget *widget, GtkContainer *container) { gtk_container_remove (container, widget); } const char* get_service_description (const char *service) { if (!service) return NULL; /* TRANSLATORS: Descriptions for specific services, shown in service * configuration form */ if (strcmp (service, "ScheduleWorld") == 0) { return _("ScheduleWorld enables you to keep your contacts, events, " "tasks, and notes in sync."); }else if (strcmp (service, "Google") == 0) { return _("Google Sync can back up and synchronize your contacts " "with your Gmail contacts."); }else if (strcmp (service, "Funambol") == 0) { /* TRANSLATORS: Please include the word "demo" (or the equivalent in your language): Funambol is going to be a 90 day demo service in the future */ return _("Back up your contacts and calendar. Sync with a single " "click, anytime, anywhere (DEMO)."); }else if (strcmp (service, "Mobical") == 0) { return _("Mobical Backup and Restore service allows you to securely " "back up your personal mobile data for free."); }else if (strcmp (service, "ZYB") == 0) { return _("ZYB is a simple way for people to store and share mobile " "information online."); }else if (strcmp (service, "Memotoo") == 0) { return _("Memotoo lets you access your personal data from any " "computer connected to the Internet."); } return NULL; } static void update_source_uri (char *name, GHashTable *source_configuration, SyncConfigWidget *self) { const char *uri; source_widgets *widgets; widgets = (source_widgets*)g_hash_table_lookup (self->sources, name); if (!widgets) { return; } uri = gtk_entry_get_text (GTK_ENTRY (widgets->entry)); g_hash_table_insert (source_configuration, g_strdup ("uri"), g_strdup (uri)); } static source_widgets * source_widgets_ref (source_widgets *widgets) { if (widgets) { widgets->count++; } return widgets; } static void source_widgets_unref (source_widgets *widgets) { if (widgets) { widgets->count--; if (widgets->count == 0) g_slice_free (source_widgets, widgets); } } static void check_source_cb (SyncevoSession *session, GError *error, source_widgets *widgets) { gboolean show = TRUE; if (error) { if(error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE)) { show = FALSE; } else { g_warning ("CheckSource failed: %s", error->message); /* non-fatal, ignore in UI */ } g_error_free (error); } if (widgets->count > 1) { if (show) { /* NOTE: with the new two sources per row layout not showing things * may look weird in some cases... the layout should really only be * done at this point */ gtk_widget_show (widgets->source_toggle_label); gtk_widget_show (widgets->label); gtk_widget_show (widgets->entry); gtk_widget_show (widgets->check); } else { /* next save should disable this source */ toggle_set_active (widgets->check, FALSE); } } source_widgets_unref (widgets); g_object_unref (session); } static void set_config_cb (SyncevoSession *session, GError *error, save_config_data *data) { if (error) { g_warning ("Error in Session.SetConfig: %s", error->message); g_error_free (error); g_object_unref (session); show_error_dialog (GTK_WIDGET (data->widget), _("Sorry, failed to save the configuration")); return; } if (data->temporary) { syncevo_session_check_source (session, data->widgets->name, (SyncevoSessionGenericCb)check_source_cb, data->widgets); } else { data->widget->configured = TRUE; g_signal_emit (data->widget, signals[SIGNAL_CHANGED], 0); g_object_unref (session); } } static void get_config_for_overwrite_prevention_cb (SyncevoSession *session, SyncevoConfig *config, GError *error, save_config_data *data) { static int index = 0; char *name; if (error) { index = 0; if (error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)) { /* Config does not exist (as expected), we can now save */ syncevo_session_set_config (session, data->temporary, data->temporary, data->widget->config, (SyncevoSessionGenericCb)set_config_cb, data); return; } g_warning ("Unexpected error in Session.GetConfig: %s", error->message); g_error_free (error); g_object_unref (session); return; } /* Config exists when we are trying to create a new config... * Need to start a new session with another name */ g_object_unref (session); name = g_strdup_printf ("%s__%d", data->basename, ++index); sync_config_widget_set_name (data->widget, name); g_free (name); syncevo_server_start_no_sync_session (data->widget->server, data->widget->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void save_config (save_config_data *data, SyncevoSession *session) { SyncConfigWidget *w = data->widget; if (data->delete) { syncevo_config_free (w->config); w->config = g_hash_table_new (g_str_hash, g_str_equal); } /* if this is a client peer (a device) and not configured, we * need to test that we aren't overwriting existing * configs */ /* TODO: This might be a good thing to do for any configurations.*/ if (peer_is_client (w->config) && !w->configured && !data->temporary) { syncevo_session_get_config (session, FALSE, (SyncevoSessionGetConfigCb)get_config_for_overwrite_prevention_cb, data); } else { syncevo_session_set_config (session, data->temporary, data->temporary, data->widget->config, (SyncevoSessionGenericCb)set_config_cb, data); } } static void status_changed_for_config_write_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, save_config_data *data) { if (status == SYNCEVO_STATUS_IDLE) { save_config (data, session); } } static void get_status_for_config_write_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, save_config_data *data) { if (error) { g_warning ("Error in Session.GetStatus: %s", error->message); g_error_free (error); g_object_unref (session); /* TODO show in UI: save failed in service list */ return; } syncevo_source_statuses_free (source_statuses); if (status == SYNCEVO_STATUS_IDLE) { save_config (data, session); } } static void start_session_for_config_write_cb (SyncevoServer *server, char *path, GError *error, save_config_data *data) { SyncevoSession *session; if (error) { g_warning ("Error in Server.StartSession: %s", error->message); g_error_free (error); /* TODO show in UI: save failed in service list */ return; } session = syncevo_session_new (path); /* we want to know about status changes to our session */ g_signal_connect (session, "status-changed", G_CALLBACK (status_changed_for_config_write_cb), data); syncevo_session_get_status (session, (SyncevoSessionGetStatusCb)get_status_for_config_write_cb, data); } static void stop_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { save_config_data *data; if (!self->config) { return; } syncevo_config_set_value (self->config, NULL, "defaultPeer", ""); sync_config_widget_set_current (self, FALSE); data = g_slice_new (save_config_data); data->widget = self; data->delete = FALSE; data->temporary = FALSE; syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void use_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { save_config_data *data; const char *username, *password, *sync_url, *pretty_name; char *real_url, *device; gboolean send, receive; SyncevoSyncMode mode; if (!self->config) { return; } if (!self->config_name || strlen (self->config_name) == 0) { g_free (self->config_name); self->config_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry))); } if (self->mode_changed) { GHashTableIter iter; source_widgets *widgets; char *name; gboolean client = peer_is_client (self->config); send = toggle_get_active (self->send_check); receive = toggle_get_active (self->receive_check); if (send && receive) { mode = SYNCEVO_SYNC_TWO_WAY; } else if (send) { mode = client ? SYNCEVO_SYNC_ONE_WAY_FROM_SERVER : SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT; } else if (receive) { mode = client ? SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT : SYNCEVO_SYNC_ONE_WAY_FROM_SERVER; } else { mode = SYNCEVO_SYNC_NONE; } g_hash_table_iter_init (&iter, self->sources); while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&widgets)) { const char *mode_str; gboolean active; active = toggle_get_active (widgets->check) && GTK_WIDGET_SENSITIVE (widgets->check); if (active) { mode_str = syncevo_sync_mode_to_string (mode); } else { mode_str = "none"; } syncevo_config_set_value (self->config, name, "sync", mode_str); } } username = gtk_entry_get_text (GTK_ENTRY (self->username_entry)); syncevo_config_set_value (self->config, NULL, "username", username); sync_url = gtk_entry_get_text (GTK_ENTRY (self->baseurl_entry)); /* make a wild guess if no scheme in url */ if (strstr (sync_url, "://") == NULL) { real_url = g_strdup_printf ("http://%s", sync_url); } else { real_url = g_strdup (sync_url); } syncevo_config_set_value (self->config, NULL, "syncURL", real_url); password = gtk_entry_get_text (GTK_ENTRY (self->password_entry)); syncevo_config_set_value (self->config, NULL, "password", password); syncevo_config_get_value (self->config, NULL, "deviceName", &device); if (!device || strlen (device) == 0) { if (!self->config_name || strlen (self->config_name) == 0 || !sync_url || strlen (sync_url) == 0) { show_error_dialog (GTK_WIDGET (self), _("Service must have a name and server URL")); return; } } syncevo_config_foreach_source (self->config, (ConfigFunc)update_source_uri, self); pretty_name = gtk_entry_get_text (GTK_ENTRY (self->entry)); syncevo_config_set_value (self->config, NULL, "PeerName", pretty_name); syncevo_config_get_value (self->config, NULL, "PeerName", &self->pretty_name); syncevo_config_set_value (self->config, NULL, "defaultPeer", self->config_name); sync_config_widget_set_current (self, TRUE); data = g_slice_new (save_config_data); data->widget = self; data->delete = FALSE; data->temporary = FALSE; data->basename = g_strdup (self->config_name); syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); g_free (real_url); } static void reset_delete_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { char *msg, *yes, *no; save_config_data *data; if (!self->config) { return; } if (self->has_template) { /*TRANSLATORS: warning dialog text for resetting pre-defined services */ msg = g_strdup_printf (_("Do you want to reset the settings for %s? " "This will not remove any synced information on either end."), self->pretty_name); /*TRANSLATORS: buttons in reset-service warning dialog */ yes = _("Yes, reset"); no = _("No, keep settings"); } else { /*TRANSLATORS: warning dialog text for deleting user-defined services */ msg = g_strdup_printf (_("Do you want to delete the settings for %s? " "This will not remove any synced information on either " "end but it will remove these settings."), self->pretty_name); /*TRANSLATORS: buttons in delete-service warning dialog */ yes = _("Yes, delete"); no = _("No, keep settings"); } /*TRANSLATORS: decline button in "Reset/delete service" warning dialogs */ if (!show_confirmation (GTK_WIDGET (self), msg, yes, no)) { g_free (msg); return; } g_free (msg); if (self->current) { sync_config_widget_set_current (self, FALSE); } data = g_slice_new (save_config_data); data->widget = self; data->delete = TRUE; data->temporary = FALSE; syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void update_buttons (SyncConfigWidget *self) { if (self->has_template) { /* TRANSLATORS: button labels in service configuration form */ gtk_button_set_label (GTK_BUTTON (self->reset_delete_button), _("Reset settings")); } else { gtk_button_set_label (GTK_BUTTON (self->reset_delete_button), _("Delete settings")); } if (self->configured) { gtk_widget_show (GTK_WIDGET (self->reset_delete_button)); } else { gtk_widget_hide (GTK_WIDGET (self->reset_delete_button)); } if (self->current || !self->current_service_name) { gtk_button_set_label (GTK_BUTTON (self->use_button), _("Save and use")); } else { gtk_button_set_label (GTK_BUTTON (self->use_button), _("Save and replace\ncurrent service")); } if (self->current && self->config) { if (peer_is_client (self->config)) { gtk_button_set_label (GTK_BUTTON (self->stop_button), _("Stop using device")); } else { gtk_button_set_label (GTK_BUTTON (self->stop_button), _("Stop using service")); } gtk_widget_show (self->stop_button); } else { gtk_widget_hide (self->stop_button); } } static void mode_widget_notify_active_cb (GtkWidget *widget, GParamSpec *pspec, SyncConfigWidget *self) { self->mode_changed = TRUE; } static void source_entry_notify_text_cb (GObject *gobject, GParamSpec *pspec, source_widgets *widgets) { gboolean new_editable, old_editable; const char *text; text = gtk_entry_get_text (GTK_ENTRY (widgets->entry)); new_editable = (strlen (text) > 0); old_editable = GTK_WIDGET_SENSITIVE (widgets->check); if (new_editable != old_editable) { gtk_widget_set_sensitive (widgets->check, new_editable); toggle_set_active (widgets->check, new_editable); } } static GtkWidget* add_toggle_widget (SyncConfigWidget *self, const char *title, gboolean active, guint row, guint col) { GtkWidget *toggle; int padding; padding = (col == 1) ? 0 : 32; #ifdef USE_MOBLIN_UX GtkWidget *label; col = col * 2; label = gtk_label_new (title); gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); gtk_widget_set_size_request (label, 260, -1); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach (GTK_TABLE (self->mode_table), label, col, col + 1, row, row + 1, GTK_FILL, GTK_FILL, 0, 0); toggle = mx_gtk_light_switch_new (); g_signal_connect_swapped (toggle, "hide", G_CALLBACK (gtk_widget_hide), label); g_signal_connect_swapped (toggle, "show", G_CALLBACK (gtk_widget_show), label); toggle_set_active (toggle, active); g_signal_connect (toggle, "switch-flipped", G_CALLBACK (mode_widget_notify_active_cb), self); #else toggle = gtk_check_button_new_with_label (title); gtk_widget_set_size_request (toggle, 260, -1); toggle_set_active (toggle, active); g_signal_connect (toggle, "notify::active", G_CALLBACK (mode_widget_notify_active_cb), self); #endif gtk_table_attach (GTK_TABLE (self->mode_table), toggle, col + 1, col + 2, row, row + 1, GTK_FILL, GTK_FILL, padding, 0); return toggle; } /* check if config includes a virtual source that covers the given * source */ static gboolean virtual_source_exists (SyncevoConfig *config, const char *name) { GHashTableIter iter; const char *source_string; GHashTable *source_config; g_hash_table_iter_init (&iter, config); while (g_hash_table_iter_next (&iter, (gpointer)&source_string, (gpointer)&source_config)) { char **strs; if (g_str_has_prefix (source_string, "source/")) { const char *uri, *type; type = g_hash_table_lookup (source_config, "backend"); uri = g_hash_table_lookup (source_config, "uri"); if (!uri || !type || !g_str_has_prefix (type, "virtual:")) { /* this source is not defined, or not virtual */ continue; } strs = g_strsplit (source_string + 7, "+", 0); if (g_strv_length (strs) > 1) { int i; for (i = 0; strs[i]; i++) { if (g_strcmp0 (name, strs[i]) == 0) { g_strfreev (strs); return TRUE; } } } g_strfreev (strs); } } return FALSE; } static void init_source (char *name, GHashTable *source_configuration, SyncConfigWidget *self) { char *str, *pretty_name; const char *uri, *type; guint rows; guint row; static guint col = 0; source_widgets *widgets; SyncevoSyncMode mode; save_config_data *data; type = g_hash_table_lookup (source_configuration, "backend"); uri = g_hash_table_lookup (source_configuration, "uri"); if (!type || strlen (type) == 0) { return; } if (g_str_has_prefix (type, "virtual:") && !uri) { /* undefined virtual source */ return; } if (virtual_source_exists (self->config, name)) { return; } g_object_get (self->mode_table, "n-rows", &rows, NULL); if (!self->no_source_toggles && col == 0) { col = 1; row = rows - 1; } else { col = 0; row = rows; } self->no_source_toggles = FALSE; widgets = g_slice_new0 (source_widgets); widgets->name = name; widgets->count = 1; g_hash_table_insert (self->sources, name, widgets); widgets->source_toggle_label = self->source_toggle_label; pretty_name = get_pretty_source_name (name); mode = syncevo_sync_mode_from_string (g_hash_table_lookup (source_configuration, "sync")); widgets->check = add_toggle_widget (self, pretty_name, (mode > SYNCEVO_SYNC_NONE), row, col); /* TRANSLATORS: label for an entry in service configuration form. * Placeholder is a source name. * Example: "Appointments URI" */ str = g_strdup_printf (_("%s URI"), pretty_name); widgets->label = gtk_label_new (str); g_free (str); g_free (pretty_name); g_object_get (self->server_settings_table, "n-rows", &row, NULL); gtk_misc_set_alignment (GTK_MISC (widgets->label), 0.0, 0.5); gtk_table_attach (GTK_TABLE (self->server_settings_table), widgets->label, 0, 1, row, row + 1, GTK_FILL, GTK_EXPAND, 0, 0); widgets->entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (widgets->entry), 99); gtk_entry_set_width_chars (GTK_ENTRY (widgets->entry), 80); if (uri) { gtk_entry_set_text (GTK_ENTRY (widgets->entry), uri); } gtk_table_attach_defaults (GTK_TABLE (self->server_settings_table), widgets->entry, 1, 2, row, row + 1); g_signal_connect (widgets->entry, "notify::text", G_CALLBACK (source_entry_notify_text_cb), widgets); gtk_widget_set_sensitive (widgets->check, uri && strlen (uri) > 0); /* start a session so we save a temporary config so we can do * CheckSource, and show the source-related widgets if the * source is available */ data = g_slice_new (save_config_data); data->widget = self; data->delete = FALSE; data->temporary = TRUE; data->widgets = source_widgets_ref (widgets); syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void get_common_mode (char *name, GHashTable *source_configuration, SyncevoSyncMode *common_mode) { SyncevoSyncMode mode; char *mode_str, *type; type = g_hash_table_lookup (source_configuration, "backend"); if (!type || strlen (type) == 0) { return; } mode_str = g_hash_table_lookup (source_configuration, "sync"); mode = syncevo_sync_mode_from_string (mode_str); if (mode == SYNCEVO_SYNC_NONE) { return; } if (*common_mode == SYNCEVO_SYNC_NONE) { *common_mode = mode; } else if (mode != *common_mode) { *common_mode = SYNCEVO_SYNC_UNKNOWN; } } void sync_config_widget_expand_id (SyncConfigWidget *self, const char *id) { if (id && self->config) { char *sync_url; if (syncevo_config_get_value (self->config, NULL, "syncURL", &sync_url) && strncmp (sync_url, id, strlen (id)) == 0) { sync_config_widget_set_expanded (self, TRUE); } else if (self->config_name && g_ascii_strcasecmp (self->config_name, id) == 0) { sync_config_widget_set_expanded (self, TRUE); } } } static void sync_config_widget_update_expander (SyncConfigWidget *self) { char *username = ""; char *password = ""; char *sync_url = ""; const char *descr; char *str; GtkWidget *label, *align; SyncevoSyncMode mode = SYNCEVO_SYNC_NONE; gboolean send, receive; gboolean client; gtk_container_foreach (GTK_CONTAINER (self->server_settings_table), (GtkCallback)remove_child, self->server_settings_table); gtk_table_resize (GTK_TABLE (self->server_settings_table), 2, 1); gtk_container_foreach (GTK_CONTAINER (self->mode_table), (GtkCallback)remove_child, self->mode_table); gtk_table_resize (GTK_TABLE (self->mode_table), 2, 1); client = peer_is_client (self->config); if (client) { if (!self->device_template_selected) { gtk_widget_hide (self->settings_box); gtk_widget_show (self->device_selector_box); /* temporary solution for device template selection: * show list of templates only */ } else { gtk_widget_show (self->settings_box); gtk_widget_hide (self->device_selector_box); gtk_widget_hide (self->userinfo_table); gtk_widget_hide (self->fake_expander); } } else { gtk_widget_show (self->settings_box); gtk_widget_hide (self->device_selector_box); gtk_widget_show (self->userinfo_table); gtk_widget_show (self->fake_expander); } syncevo_config_foreach_source (self->config, (ConfigFunc)get_common_mode, &mode); switch (mode) { case SYNCEVO_SYNC_TWO_WAY: send = receive = TRUE; break; case SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT: if (client) { send = FALSE; receive = TRUE; } else { send = TRUE; receive = FALSE; } break; case SYNCEVO_SYNC_ONE_WAY_FROM_SERVER: if (client) { send = TRUE; receive = FALSE; } else { send = FALSE; receive = TRUE; } break; default: gtk_widget_show (self->complex_config_info_bar); send = FALSE; receive = FALSE; } self->mode_changed = FALSE; if (self->pretty_name) { gtk_entry_set_text (GTK_ENTRY (self->entry), self->pretty_name); } if (!self->config_name || strlen (self->config_name) == 0) { gtk_expander_set_expanded (GTK_EXPANDER (self->expander), TRUE); } descr = get_service_description (self->config_name); if (descr) { gtk_label_set_text (GTK_LABEL (self->description_label), get_service_description (self->config_name)); gtk_widget_show (self->description_label); } else { gtk_widget_hide (self->description_label); } update_buttons (self); /* TRANSLATORS: toggles in service configuration form, placeholder is service * or device name */ str = g_strdup_printf (_("Send changes to %s"), self->pretty_name); self->send_check = add_toggle_widget (self, str, send, 0, 0); gtk_widget_show (self->send_check); g_free (str); str = g_strdup_printf (_("Receive changes from %s"), self->pretty_name); self->receive_check = add_toggle_widget (self, str, receive, 0, 1); gtk_widget_show (self->receive_check); g_free (str); align = gtk_alignment_new (0.0, 1.0, 0.0, 0.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 10, 0, 0, 0); gtk_widget_show (align); gtk_table_attach (GTK_TABLE (self->mode_table), align, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); self->source_toggle_label = gtk_label_new (""); /* TRANSLATORS: Label for the source toggles in configuration form. This is a verb, as in "Sync Calendar". */ gtk_label_set_markup (GTK_LABEL (self->source_toggle_label), _("Sync")); gtk_widget_show (self->source_toggle_label); gtk_container_add (GTK_CONTAINER (align), self->source_toggle_label); syncevo_config_get_value (self->config, NULL, "username", &username); syncevo_config_get_value (self->config, NULL, "password", &password); syncevo_config_get_value (self->config, NULL, "syncURL", &sync_url); if (username) { gtk_entry_set_text (GTK_ENTRY (self->username_entry), username); } if (password) { gtk_entry_set_text (GTK_ENTRY (self->password_entry), password); } // TRANSLATORS: label of a entry in service configuration label = gtk_label_new (_("Server address")); gtk_misc_set_alignment (GTK_MISC (label), 9.0, 0.5); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (self->server_settings_table), label, 0, 1, 0, 1, GTK_FILL, GTK_EXPAND, 0, 0); self->baseurl_entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (self->baseurl_entry), 99); gtk_entry_set_width_chars (GTK_ENTRY (self->baseurl_entry), 80); if (sync_url) { gtk_entry_set_text (GTK_ENTRY (self->baseurl_entry), sync_url); } gtk_widget_show (self->baseurl_entry); gtk_table_attach_defaults (GTK_TABLE (self->server_settings_table), self->baseurl_entry, 1, 2, 0, 1); /* update source widgets */ if (self->sources) { g_hash_table_destroy (self->sources); } self->sources = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)source_widgets_unref); self->no_source_toggles = TRUE; syncevo_config_foreach_source (self->config, (ConfigFunc)init_source, self); } /* only adds config to hashtable and combo */ static void sync_config_widget_add_config (SyncConfigWidget *self, const char *name, SyncevoConfig *config) { GtkListStore *store; GtkTreeIter iter; const char *guess_name; SyncevoConfig *guess_config; int score = 1; int guess_score, second_guess_score = -1; char *str; store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (self->combo))); if (syncevo_config_get_value (config, NULL, "score", &str)) { score = (int)strtol (str, NULL, 10); } gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, name, 1, config, 2, score, -1); /* make an educated guess if possible */ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &guess_name, 1, &guess_config, 2, &guess_score, -1); if (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)) { gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 2, &second_guess_score, -1); } if (guess_score > 1 && guess_score > second_guess_score) { gtk_combo_box_set_active (GTK_COMBO_BOX (self->combo), 0); /* TRANSLATORS: explanation before a device template combobox. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution * Client' */ str = g_strdup_printf (_("This device looks like it might be a '%s'. " "If this is not correct, please take a look at " "the list of supported devices and pick yours " "if it is listed"), guess_name); } else { gtk_combo_box_set_active (GTK_COMBO_BOX (self->combo), -1); str = g_strdup (_("We don't know what this device is exactly. " "Please take a look at the list of " "supported devices and pick yours if it " "is listed")); } gtk_label_set_text (GTK_LABEL (self->device_text), str); g_free (str); } static void sync_config_widget_update_pretty_name (SyncConfigWidget *self) { self->pretty_name = NULL; if (self->config) { syncevo_config_get_value (self->config, NULL, "PeerName", &self->pretty_name); if (!self->pretty_name) { syncevo_config_get_value (self->config, NULL, "deviceName", &self->pretty_name); } } if (!self->pretty_name) { self->pretty_name = self->config_name; } } static void sync_config_widget_set_config (SyncConfigWidget *self, SyncevoConfig *config) { self->config = config; sync_config_widget_update_pretty_name (self); } static void setup_service_clicked (GtkButton *btn, SyncConfigWidget *self) { sync_config_widget_set_expanded (self, TRUE); } static void sync_config_widget_set_name (SyncConfigWidget *self, const char *name) { g_free (self->config_name); self->config_name = g_strdup (name); sync_config_widget_update_pretty_name (self); } static void device_selection_btn_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { GtkTreeIter iter; if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->combo), &iter)) { const char *name; SyncevoConfig *config; GtkTreeModel *model; self->device_template_selected = TRUE; model = gtk_combo_box_get_model(GTK_COMBO_BOX (self->combo)); gtk_tree_model_get (model, &iter, 0, &name, -1 ); gtk_tree_model_get (model, &iter, 1, &config, -1 ); sync_config_widget_set_config (self, config); sync_config_widget_update_expander (self); } } static void server_settings_notify_expand_cb (GtkExpander *expander, GParamSpec *pspec, SyncConfigWidget *self) { /* NOTE: expander can be the fake or real one... */ if (gtk_expander_get_expanded (GTK_EXPANDER (self->fake_expander))) { g_signal_handlers_disconnect_by_func (self->fake_expander, server_settings_notify_expand_cb, self); gtk_widget_hide (self->fake_expander); gtk_expander_set_expanded (GTK_EXPANDER (self->fake_expander), FALSE); gtk_expander_set_expanded (GTK_EXPANDER (self->expander), TRUE); gtk_widget_show (self->expander); g_signal_connect (self->expander, "notify::expanded", G_CALLBACK (server_settings_notify_expand_cb), self); } else { g_signal_handlers_disconnect_by_func (self->expander, server_settings_notify_expand_cb, self); gtk_widget_hide (self->expander); gtk_widget_show (self->fake_expander); g_signal_connect (self->fake_expander, "notify::expanded", G_CALLBACK (server_settings_notify_expand_cb), self); } } static GdkPixbuf* load_icon (const char *uri, guint icon_size) { GError *error = NULL; GdkPixbuf *pixbuf; const char *filename; if (uri && strlen (uri) > 0) { if (g_str_has_prefix (uri, "file://")) { filename = uri+7; } else { g_warning ("only file:// icon uri is supported: %s", uri); filename = THEMEDIR "sync-generic.png"; } } else { filename = THEMEDIR "sync-generic.png"; } pixbuf = gdk_pixbuf_new_from_file_at_scale (filename, icon_size, icon_size, TRUE, &error); if (!pixbuf) { g_warning ("Failed to load service icon: %s", error->message); g_error_free (error); return NULL; } return pixbuf; } static void sync_config_widget_update_label (SyncConfigWidget *self) { if (self->config && self->pretty_name) { char *url, *sync_url; char *str; syncevo_config_get_value (self->config, NULL, "WebURL", &url); syncevo_config_get_value (self->config, NULL, "syncURL", &sync_url); if (self->current) { str = g_strdup_printf ("%s", self->pretty_name); } else { str = g_strdup_printf ("%s", self->pretty_name); } if (g_str_has_prefix (sync_url, "obex-bt://")) { char *tmp = g_strdup_printf (_("%s - Bluetooth device"), str); g_free (str); str = tmp; } else if (!self->has_template) { /* TRANSLATORS: service title for services that are not based on a * template in service list, the placeholder is the name of the service */ char *tmp = g_strdup_printf (_("%s - manually setup"), str); g_free (str); str = tmp; } else if (url && strlen (url) > 0) { char *tmp = g_strdup_printf ("%s -",str); g_free (str); str = tmp; } gtk_label_set_markup (GTK_LABEL (self->label), str); g_free (str); } } void sync_config_widget_set_current_service_name (SyncConfigWidget *self, const char *name) { g_free (self->current_service_name); self->current_service_name = g_strdup (name); update_buttons (self); } void sync_config_widget_set_current (SyncConfigWidget *self, gboolean current) { if (self->current != current) { self->current = current; sync_config_widget_update_label (self); } } static void set_session (SyncConfigWidget *self, const char *path) { g_free (self->running_session); self->running_session = g_strdup (path); gtk_widget_set_sensitive (GTK_WIDGET (self->reset_delete_button), !self->running_session); gtk_widget_set_sensitive (GTK_WIDGET (self->use_button), !self->running_session); /* TODO: maybe add a explanation text somewhere: * "Configuration changes are not possible while a sync is in progress" */ } static void session_changed_cb (SyncevoServer *server, char *path, gboolean started, SyncConfigWidget *self) { if (started) { set_session (self, path); } else if (g_strcmp0 (self->running_session, path) == 0 ) { set_session (self, NULL); } } static void get_sessions_cb (SyncevoServer *server, SyncevoSessions *sessions, GError *error, SyncConfigWidget *self) { if (error) { g_warning ("Server.GetSessions failed: %s", error->message); g_error_free (error); /* non-fatal, ignore in UI */ g_object_unref (self); return; } set_session (self, syncevo_sessions_index (sessions, 0)); syncevo_sessions_free (sessions); g_object_unref (self); } void sync_config_widget_set_server (SyncConfigWidget *self, SyncevoServer *server) { if (self->server) { g_signal_handlers_disconnect_by_func (self->server, session_changed_cb, self); g_object_unref (self->server); self->server = NULL; } if (!server && !self->server) { return; } self->server = g_object_ref (server); /* monitor sessions so we can set editing buttons insensitive */ g_signal_connect (self->server, "session-changed", G_CALLBACK (session_changed_cb), self); /* reference is released in callback */ g_object_ref (self); syncevo_server_get_sessions (self->server, (SyncevoServerGetSessionsCb)get_sessions_cb, self); } static void sync_config_widget_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (object); switch (property_id) { case PROP_SERVER: sync_config_widget_set_server (self, g_value_get_pointer (value)); break; case PROP_NAME: sync_config_widget_set_name (self, g_value_get_string (value)); break; case PROP_CONFIG: sync_config_widget_set_config (self, g_value_get_pointer (value)); break; case PROP_CURRENT: sync_config_widget_set_current (self, g_value_get_boolean (value)); break; case PROP_HAS_TEMPLATE: sync_config_widget_set_has_template (self, g_value_get_boolean (value)); break; case PROP_CONFIGURED: sync_config_widget_set_configured (self, g_value_get_boolean (value)); break; case PROP_CURRENT_SERVICE_NAME: sync_config_widget_set_current_service_name (self, g_value_get_string (value)); break; case PROP_EXPANDED: sync_config_widget_set_expanded (self, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void sync_config_widget_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (object); switch (property_id) { case PROP_SERVER: g_value_set_pointer (value, self->server); case PROP_NAME: g_value_set_string (value, self->config_name); case PROP_CONFIG: g_value_set_pointer (value, self->config); case PROP_CURRENT: g_value_set_boolean (value, self->current); case PROP_HAS_TEMPLATE: g_value_set_boolean (value, self->has_template); case PROP_CONFIGURED: g_value_set_boolean (value, self->configured); case PROP_CURRENT_SERVICE_NAME: g_value_set_string (value, self->current_service_name); case PROP_EXPANDED: g_value_set_boolean (value, self->expanded); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void sync_config_widget_dispose (GObject *object) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (object); sync_config_widget_set_server (self, NULL); if (self->config) { syncevo_config_free (self->config); } self->config = NULL; g_free (self->config_name); self->config_name = NULL; g_free (self->current_service_name); self->current_service_name = NULL; g_free (self->running_session); self->running_session = NULL; if (self->sources) { g_hash_table_destroy (self->sources); self->sources = NULL; } G_OBJECT_CLASS (sync_config_widget_parent_class)->dispose (object); } static void init_default_config (SyncConfigWidget *self) { sync_config_widget_set_name (self, ""); self->has_template = FALSE; syncevo_config_set_value (self->config, NULL, "username", ""); syncevo_config_set_value (self->config, NULL, "password", ""); syncevo_config_set_value (self->config, NULL, "syncURL", ""); syncevo_config_set_value (self->config, NULL, "WebURL", ""); syncevo_config_set_value (self->config, "memo", "uri", ""); syncevo_config_set_value (self->config, "todo", "uri", ""); syncevo_config_set_value (self->config, "addressbook", "uri", ""); syncevo_config_set_value (self->config, "calendar", "uri", ""); } static gboolean label_button_expose_cb (GtkWidget *widget, GdkEventExpose *event, SyncConfigWidget *self) { GtkExpanderStyle style; gint indicator_x, indicator_y; indicator_x = widget->style->xthickness + INDICATOR_SIZE / 2; indicator_y = widget->style->ythickness + widget->allocation.height / 2; if (self->expanded) { style = GTK_EXPANDER_EXPANDED; } else { style = GTK_EXPANDER_COLLAPSED; } gtk_paint_expander (widget->style, widget->window, widget->state, NULL, GTK_WIDGET (self), NULL, indicator_x, indicator_y, style); return FALSE; } static gboolean sync_config_widget_expose_event (GtkWidget *widget, GdkEventExpose *event) { GdkRectangle rect; SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); rect.x = widget->allocation.x; rect.y = widget->allocation.y; rect.height = widget->allocation.height; rect.width = widget->allocation.width; gtk_paint_box (widget->style, widget->window, widget->state, GTK_SHADOW_OUT, &rect, widget, NULL, rect.x, rect.y, rect.width, rect.height); gtk_container_propagate_expose (GTK_CONTAINER (self), self->label_box, event); gtk_container_propagate_expose (GTK_CONTAINER (self), self->expando_box, event); return FALSE; } static void sync_config_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkRequisition req; GtkAllocation alloc; SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GTK_WIDGET_CLASS (sync_config_widget_parent_class)->size_allocate (widget, allocation); gtk_widget_size_request (self->label_box, &req); alloc.x = allocation->x + widget->style->xthickness; alloc.y = allocation->y + widget->style->ythickness; alloc.width = allocation->width - 2 * widget->style->xthickness; alloc.height = req.height; gtk_widget_size_allocate (self->label_box, &alloc); if (self->expanded) { gtk_widget_size_request (self->expando_box, &req); alloc.x = allocation->x + 2 * widget->style->xthickness; alloc.y = allocation->y + widget->style->ythickness + alloc.height + CHILD_PADDING; alloc.width = allocation->width - 4 * widget->style->xthickness; alloc.height = req.height; gtk_widget_size_allocate (self->expando_box, &alloc); } } static void sync_config_widget_size_request (GtkWidget *widget, GtkRequisition *requisition) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GtkRequisition req; requisition->width = widget->style->xthickness * 2; requisition->height = widget->style->ythickness * 2; gtk_widget_size_request (self->label_box, &req); requisition->width += req.width; requisition->height = MAX (req.height, INDICATOR_SIZE) + widget->style->ythickness * 2; if (self->expanded) { gtk_widget_size_request (self->expando_box, &req); requisition->width = MAX (requisition->width, req.width + widget->style->xthickness * 4); requisition->height += req.height + 2 * widget->style->ythickness; } } static GObject * sync_config_widget_constructor (GType gtype, guint n_properties, GObjectConstructParam *properties) { SyncConfigWidget *self; GObjectClass *parent_class; char *url, *icon; GdkPixbuf *buf; parent_class = G_OBJECT_CLASS (sync_config_widget_parent_class); self = SYNC_CONFIG_WIDGET (parent_class->constructor (gtype, n_properties, properties)); if (!self->config || !self->server) { g_warning ("No SyncevoServer or Syncevoconfig set for SyncConfigWidget"); return G_OBJECT (self); } if (g_strcmp0 (self->config_name, "default") == 0) { init_default_config (self); gtk_widget_show (self->entry); gtk_widget_hide (self->label); } else { gtk_widget_hide (self->entry); gtk_widget_show (self->label); } syncevo_config_get_value (self->config, NULL, "WebURL", &url); syncevo_config_get_value (self->config, NULL, "IconURI", &icon); buf = load_icon (icon, SYNC_UI_LIST_ICON_SIZE); gtk_image_set_from_pixbuf (GTK_IMAGE (self->image), buf); g_object_unref (buf); if (url && strlen (url) > 0) { gtk_link_button_set_uri (GTK_LINK_BUTTON (self->link), url); gtk_widget_show (self->link); } else { gtk_widget_hide (self->link); } sync_config_widget_update_label (self); sync_config_widget_update_expander (self); /* hack to get focus in the right place on "Setup new service" */ if (gtk_widget_get_visible (self->entry)) { gtk_widget_grab_focus (self->entry); } return G_OBJECT (self); } static void sync_config_widget_map (GtkWidget *widget) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); if (self->label_box && gtk_widget_get_visible (self->expando_box)) { gtk_widget_map (self->label_box); } if (self->expando_box && gtk_widget_get_visible (self->expando_box)) { gtk_widget_map (self->expando_box); } GTK_WIDGET_CLASS (sync_config_widget_parent_class)->map (widget); } static void sync_config_widget_unmap (GtkWidget *widget) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GTK_WIDGET_CLASS (sync_config_widget_parent_class)->unmap (widget); if (self->label_box) { gtk_widget_unmap (self->label_box); } if (self->expando_box) { gtk_widget_unmap (self->expando_box); } } static void sync_config_widget_add (GtkContainer *container, GtkWidget *widget) { g_warning ("Can't add widgets in to SyncConfigWidget!"); } static void sync_config_widget_remove (GtkContainer *container, GtkWidget *widget) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (container); if (self->label_box == widget) { gtk_widget_unparent (widget); self->label_box = NULL; } if (self->expando_box == widget) { gtk_widget_unparent (widget); self->expando_box = NULL; } } static void sync_config_widget_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (container); if (self->label_box) { (* callback) (self->label_box, callback_data); } if (self->expando_box) { (* callback) (self->expando_box, callback_data); } } static void sync_config_widget_class_init (SyncConfigWidgetClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *w_class = GTK_WIDGET_CLASS (klass); GtkContainerClass *c_class = GTK_CONTAINER_CLASS (klass); GParamSpec *pspec; object_class->set_property = sync_config_widget_set_property; object_class->get_property = sync_config_widget_get_property; object_class->dispose = sync_config_widget_dispose; object_class->constructor = sync_config_widget_constructor; w_class->expose_event = sync_config_widget_expose_event; w_class->size_request = sync_config_widget_size_request; w_class->size_allocate = sync_config_widget_size_allocate; w_class->map = sync_config_widget_map; w_class->unmap = sync_config_widget_unmap; c_class->add = sync_config_widget_add; c_class->remove = sync_config_widget_remove; c_class->forall = sync_config_widget_forall; pspec = g_param_spec_pointer ("server", "SyncevoServer", "The SyncevoServer to use in Syncevolution DBus calls", G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_SERVER, pspec); pspec = g_param_spec_string ("name", "Configuration name", "The name of the Syncevolution service configuration", NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_NAME, pspec); pspec = g_param_spec_pointer ("config", "SyncevoConfig", "The SyncevoConfig struct this widget represents. Takes ownership.", G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CONFIG, pspec); pspec = g_param_spec_boolean ("current", "Current", "Whether the service is currently used", FALSE, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CURRENT, pspec); pspec = g_param_spec_boolean ("has-template", "has template", "Whether the service has a matching template", FALSE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_HAS_TEMPLATE, pspec); pspec = g_param_spec_boolean ("configured", "Configured", "Whether the service has a configuration already", FALSE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CONFIGURED, pspec); pspec = g_param_spec_string ("current-service-name", "Current service name", "The name of the currently used service or NULL", NULL, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CURRENT_SERVICE_NAME, pspec); pspec = g_param_spec_boolean ("expanded", "Expanded", "Whether the expander is open or closed", FALSE, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_EXPANDED, pspec); signals[SIGNAL_CHANGED] = g_signal_new ("changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncConfigWidgetClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void label_enter_notify_cb (GtkWidget *widget, GdkEventCrossing *event, SyncConfigWidget *self) { if (!self->expanded) { gtk_widget_show (self->button); } gtk_widget_set_state (self->label_box, GTK_STATE_PRELIGHT); } static void label_leave_notify_cb (GtkWidget *widget, GdkEventCrossing *event, SyncConfigWidget *self) { if (event->detail != GDK_NOTIFY_INFERIOR) { gtk_widget_hide (self->button); gtk_widget_set_state (self->label_box, GTK_STATE_NORMAL); } } static void device_combo_changed (GtkComboBox *combo, SyncConfigWidget *self) { int active; active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo)); gtk_widget_set_sensitive (self->device_select_btn, active > -1); } static void label_button_release_cb (GtkWidget *widget, GdkEventButton *event, SyncConfigWidget *self) { if (event->button == 1) { sync_config_widget_set_expanded (self, !sync_config_widget_get_expanded (self)); } } static gint compare_list_items (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, SyncConfigWidget *self) { int score_a, score_b; gtk_tree_model_get(model, a, 2, &score_a, -1); gtk_tree_model_get(model, b, 2, &score_b, -1); return score_a - score_b; } static void sync_config_widget_init (SyncConfigWidget *self) { GtkWidget *tmp_box, *hbox, *cont, *vbox, *label; GtkListStore *store; GtkCellRenderer *renderer; gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); self->label_box = gtk_event_box_new (); gtk_widget_set_app_paintable (self->label_box, TRUE); gtk_widget_show (self->label_box); gtk_widget_set_parent (self->label_box, GTK_WIDGET (self)); gtk_widget_set_size_request (self->label_box, -1, SYNC_UI_LIST_ICON_SIZE + 6); g_signal_connect (self->label_box, "enter-notify-event", G_CALLBACK (label_enter_notify_cb), self); g_signal_connect (self->label_box, "leave-notify-event", G_CALLBACK (label_leave_notify_cb), self); g_signal_connect (self->label_box, "button-release-event", G_CALLBACK (label_button_release_cb), self); g_signal_connect (self->label_box, "expose-event", G_CALLBACK (label_button_expose_cb), self); hbox = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox); gtk_container_add (GTK_CONTAINER (self->label_box), hbox); self->image = gtk_image_new (); /* leave room for drawing the expander indicator in expose handler */ gtk_widget_set_size_request (self->image, SYNC_UI_LIST_ICON_SIZE + INDICATOR_SIZE, SYNC_UI_LIST_ICON_SIZE); gtk_misc_set_alignment (GTK_MISC (self->image), 1.0, 0.5); gtk_widget_show (self->image); gtk_box_pack_start (GTK_BOX (hbox), self->image, FALSE, FALSE, 8); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (hbox), tmp_box, FALSE, FALSE, 8); self->label = gtk_label_new (""); gtk_label_set_max_width_chars (GTK_LABEL (self->label), 60); gtk_label_set_ellipsize (GTK_LABEL (self->label), PANGO_ELLIPSIZE_END); gtk_misc_set_alignment (GTK_MISC (self->label), 0.0, 0.5); gtk_widget_show (self->label); gtk_box_pack_start (GTK_BOX (tmp_box), self->label, FALSE, FALSE, 0); self->entry = gtk_entry_new (); gtk_widget_set_no_show_all (self->entry, TRUE); gtk_box_pack_start (GTK_BOX (tmp_box), self->entry, FALSE, FALSE, 4); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (tmp_box), vbox, FALSE, FALSE, 0); /* TRANSLATORS: link button in service configuration form */ self->link = gtk_link_button_new_with_label ("", _("Launch website")); gtk_widget_set_no_show_all (self->link, TRUE); gtk_box_pack_start (GTK_BOX (vbox), self->link, TRUE, FALSE, 0); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 32); /* TRANSLATORS: button in service configuration form */ self->button = gtk_button_new_with_label (_("Set up now")); gtk_widget_set_size_request (self->button, SYNC_UI_LIST_BTN_WIDTH, -1); g_signal_connect (self->button, "clicked", G_CALLBACK (setup_service_clicked), self); gtk_box_pack_start (GTK_BOX (vbox), self->button, TRUE, FALSE, 0); /* label_box built, now build expando_box */ self->expando_box = gtk_hbox_new (FALSE, 0); gtk_widget_set_no_show_all (self->expando_box, TRUE); gtk_widget_set_parent (self->expando_box, GTK_WIDGET (self)); self->device_selector_box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (self->expando_box), self->device_selector_box, TRUE, TRUE, 16); hbox = gtk_hbox_new (FALSE, 8); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (self->device_selector_box), hbox, FALSE, TRUE, 8); self->device_text = gtk_label_new (_("We don't know what this device is exactly. " "Please take a look at the list of " "supported devices and pick yours if it " "is listed")); gtk_widget_show (self->device_text); gtk_label_set_line_wrap (GTK_LABEL (self->device_text), TRUE); gtk_widget_set_size_request (self->device_text, 600, -1); gtk_box_pack_start (GTK_BOX (hbox), self->device_text, FALSE, TRUE, 0); hbox = gtk_hbox_new (FALSE, 16); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (self->device_selector_box), hbox, FALSE, TRUE, 16); store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), 2, GTK_SORT_DESCENDING); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (store), 2, (GtkTreeIterCompareFunc)compare_list_items, NULL, NULL); self->combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); g_object_unref (G_OBJECT (store)); gtk_widget_set_size_request (self->combo, 200, -1); gtk_widget_show (self->combo); gtk_box_pack_start (GTK_BOX (hbox), self->combo, FALSE, TRUE, 0); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(self->combo), renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(self->combo), renderer, "text", 0, NULL); g_signal_connect (self->combo, "changed", G_CALLBACK (device_combo_changed), self); self->device_select_btn = gtk_button_new_with_label (_("Use these settings")); gtk_widget_set_sensitive (self->device_select_btn, FALSE); gtk_widget_show (self->device_select_btn); gtk_box_pack_start (GTK_BOX (hbox), self->device_select_btn, FALSE, TRUE, 0); g_signal_connect (self->device_select_btn, "clicked", G_CALLBACK (device_selection_btn_clicked_cb), self); /* settings_box has normal expander contents */ self->settings_box = gtk_vbox_new (FALSE, 0); gtk_widget_show (self->settings_box); gtk_box_pack_start (GTK_BOX (self->expando_box), self->settings_box, TRUE, TRUE, 16); vbox = gtk_vbox_new (FALSE, 8); gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (self->settings_box), vbox, TRUE, TRUE, 0); tmp_box = gtk_vbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (vbox), tmp_box, FALSE, FALSE, 8); self->description_label = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (self->description_label), 0.0, 0.5); gtk_widget_set_size_request (self->description_label, 700, -1); gtk_label_set_line_wrap (GTK_LABEL (self->description_label), TRUE); gtk_box_pack_start (GTK_BOX (tmp_box), self->description_label, FALSE, FALSE, 0); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (vbox), tmp_box, FALSE, FALSE, 0); self->userinfo_table = gtk_table_new (4, 2, FALSE); gtk_table_set_row_spacings (GTK_TABLE (self->userinfo_table), 2); gtk_table_set_col_spacings (GTK_TABLE (self->userinfo_table), 5); gtk_widget_show (self->userinfo_table); gtk_box_pack_start (GTK_BOX (tmp_box), self->userinfo_table, FALSE, FALSE, 0); /* TRANSLATORS: labels of entries in service configuration form */ label = gtk_label_new (_("Username")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), label, 0, 1, 0, 1); self->username_entry = gtk_entry_new (); gtk_widget_show (self->username_entry); gtk_entry_set_width_chars (GTK_ENTRY (self->username_entry), 40); gtk_entry_set_max_length (GTK_ENTRY (self->username_entry), 99); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), self->username_entry, 1, 2, 0, 1); label = gtk_label_new (_("Password")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), label, 0, 1, 1, 2); self->password_entry = gtk_entry_new (); gtk_widget_show (self->password_entry); gtk_entry_set_width_chars (GTK_ENTRY (self->password_entry), 40); gtk_entry_set_visibility (GTK_ENTRY (self->password_entry), FALSE); gtk_entry_set_max_length (GTK_ENTRY (self->password_entry), 99); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), self->password_entry, 1, 2, 1, 2); self->complex_config_info_bar = gtk_info_bar_new (); gtk_info_bar_set_message_type (GTK_INFO_BAR (self->complex_config_info_bar), GTK_MESSAGE_WARNING); gtk_box_pack_start (GTK_BOX (vbox), self->complex_config_info_bar, FALSE, FALSE, 0); /* TRANSLATORS: warning in service configuration form for people who have modified the configuration via other means. */ label = gtk_label_new (_("Current configuration is more complex " "than what can be shown here. Changes to sync " "mode or synced data types will overwrite that " "configuration.")); gtk_widget_set_size_request (label, 600, -1); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_show (label); cont = gtk_info_bar_get_content_area ( GTK_INFO_BAR (self->complex_config_info_bar)); gtk_container_add (GTK_CONTAINER (cont), label); self->mode_table = gtk_table_new (4, 1, FALSE); gtk_table_set_row_spacings (GTK_TABLE (self->mode_table), 2); gtk_table_set_col_spacings (GTK_TABLE (self->mode_table), 5); gtk_widget_show (self->mode_table); gtk_box_pack_start (GTK_BOX (vbox), self->mode_table, FALSE, FALSE, 0); /* TRANSLATORS: this is the epander label for server settings in service configuration form */ self->expander = gtk_expander_new (_("Hide server settings")); gtk_box_pack_start (GTK_BOX (vbox), self->expander, FALSE, FALSE, 8); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_container_add (GTK_CONTAINER (self->expander), tmp_box); self->server_settings_table = gtk_table_new (1, 1, FALSE); gtk_table_set_row_spacings (GTK_TABLE (self->server_settings_table), 2); gtk_table_set_col_spacings (GTK_TABLE (self->server_settings_table), 5); gtk_widget_show (self->server_settings_table); gtk_box_pack_start (GTK_BOX (tmp_box), self->server_settings_table, FALSE, FALSE, 0); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (vbox), tmp_box, FALSE, FALSE, 8); /* TRANSLATORS: this is the epander label for server settings in service configuration form */ self->fake_expander = gtk_expander_new (_("Show server settings")); gtk_widget_show (self->fake_expander); gtk_box_pack_start (GTK_BOX (tmp_box), self->fake_expander, FALSE, FALSE, 0); g_signal_connect (self->fake_expander, "notify::expanded", G_CALLBACK (server_settings_notify_expand_cb), self); self->use_button = gtk_button_new (); gtk_widget_show (self->use_button); gtk_box_pack_end (GTK_BOX (tmp_box), self->use_button, FALSE, FALSE, 8); g_signal_connect (self->use_button, "clicked", G_CALLBACK (use_clicked_cb), self); self->stop_button = gtk_button_new (); gtk_box_pack_end (GTK_BOX (tmp_box), self->stop_button, FALSE, FALSE, 8); g_signal_connect (self->stop_button, "clicked", G_CALLBACK (stop_clicked_cb), self); self->reset_delete_button = gtk_button_new (); gtk_widget_show (self->reset_delete_button); gtk_box_pack_end (GTK_BOX (tmp_box), self->reset_delete_button, FALSE, FALSE, 8); g_signal_connect (self->reset_delete_button, "clicked", G_CALLBACK (reset_delete_clicked_cb), self); } GtkWidget* sync_config_widget_new (SyncevoServer *server, const char *name, SyncevoConfig *config, gboolean current, const char *current_service_name, gboolean configured, gboolean has_template) { return g_object_new (SYNC_TYPE_CONFIG_WIDGET, "server", server, "name", name, "config", config, "current", current, "current-service-name", current_service_name, "configured", configured, "has-template", has_template, NULL); } void sync_config_widget_set_expanded (SyncConfigWidget *self, gboolean expanded) { g_return_if_fail (SYNC_IS_CONFIG_WIDGET (self)); if (self->expanded != expanded) { self->expanded = expanded; if (self->expanded) { gtk_widget_hide (self->button); gtk_widget_show (self->expando_box); if (gtk_widget_get_visible (self->entry)) { gtk_widget_grab_focus (self->entry); } else { gtk_widget_grab_focus (self->username_entry); } } else { gtk_widget_show (self->button); gtk_widget_hide (self->expando_box); } g_object_notify (G_OBJECT (self), "expanded"); } } gboolean sync_config_widget_get_expanded (SyncConfigWidget *self) { return self->expanded; } void sync_config_widget_set_has_template (SyncConfigWidget *self, gboolean has_template) { if (self->has_template != has_template) { self->has_template = has_template; update_buttons (self); sync_config_widget_update_label (self); } } gboolean sync_config_widget_get_has_template (SyncConfigWidget *self) { return self->has_template; } void sync_config_widget_set_configured (SyncConfigWidget *self, gboolean configured) { if (self->configured != configured) { self->configured = configured; self->device_template_selected = configured; update_buttons (self); } } gboolean sync_config_widget_get_configured (SyncConfigWidget *self) { return self->configured; } gboolean sync_config_widget_get_current (SyncConfigWidget *widget) { return widget->current; } const char* sync_config_widget_get_name (SyncConfigWidget *widget) { return widget->config_name; } void sync_config_widget_add_alternative_config (SyncConfigWidget *self, const char *template_name, SyncevoConfig *config, gboolean configured) { sync_config_widget_add_config (self, template_name, config); if (configured) { sync_config_widget_set_config (self, config); sync_config_widget_set_configured (self, TRUE); } sync_config_widget_update_expander (self); } syncevolution-1.5/src/gtk-ui/sync-config-widget.h0000644000373300001540000000763412326412403023365 0ustar00nightlynightly00000000000000#ifndef _SYNC_CONFIG_WIDGET #define _SYNC_CONFIG_WIDGET #include #include #include "syncevo-server.h" G_BEGIN_DECLS #define SYNC_TYPE_CONFIG_WIDGET sync_config_widget_get_type() #define SYNC_CONFIG_WIDGET(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidget)) #define SYNC_CONFIG_WIDGET_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidgetClass)) #define SYNC_IS_CONFIG_WIDGET(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SYNC_TYPE_CONFIG_WIDGET)) #define SYNC_IS_CONFIG_WIDGET_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), SYNC_TYPE_CONFIG_WIDGET)) #define SYNC_CONFIG_WIDGET_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidgetClass)) typedef struct { GtkContainer parent; GtkWidget *expando_box; GtkWidget *label_box; GtkWidget *device_selector_box; GtkWidget *device_text; GtkWidget *combo; GtkWidget *device_select_btn; GtkWidget *settings_box; gboolean current; /* is this currently used config */ char *current_service_name; /* name of the current service */ gboolean configured; /* actual service configuration exists on server */ gboolean device_template_selected; gboolean has_template; /* this service configuration has a matching template */ gboolean expanded; SyncevoServer *server; SyncevoConfig *config; GHashTable *configs; /* possible configs. config above is one of these */ char *config_name; char *pretty_name; char *running_session; char *expand_id; /* label */ GtkWidget *image; GtkWidget *label; GtkWidget *entry; GtkWidget *link; GtkWidget *button; /* content */ GtkWidget *description_label; GtkWidget *userinfo_table; GtkWidget *name_label; GtkWidget *name_entry; GtkWidget *complex_config_info_bar; GtkWidget *mode_table; GtkWidget *send_check; GtkWidget *receive_check; GtkWidget *username_entry; GtkWidget *password_entry; GtkWidget *source_toggle_label; GtkWidget *baseurl_entry; GtkWidget *expander; GtkWidget *fake_expander; GtkWidget *server_settings_table; GtkWidget *reset_delete_button; GtkWidget *stop_button; GtkWidget *use_button; GHashTable *sources; /* key is source name, value is source_widgets */ gboolean mode_changed; gboolean no_source_toggles; } SyncConfigWidget; typedef struct { GtkContainerClass parent_class; void (*changed) (SyncConfigWidget *widget); } SyncConfigWidgetClass; GType sync_config_widget_get_type (void); GtkWidget *sync_config_widget_new (SyncevoServer *server, const char *name, SyncevoConfig *config, gboolean current, const char *current_service_name, gboolean configured, gboolean has_template); void sync_config_widget_set_expanded (SyncConfigWidget *widget, gboolean expanded); gboolean sync_config_widget_get_expanded (SyncConfigWidget *widget); gboolean sync_config_widget_get_current (SyncConfigWidget *widget); void sync_config_widget_set_current (SyncConfigWidget *self, gboolean current); void sync_config_widget_set_has_template (SyncConfigWidget *self, gboolean has_template); gboolean sync_config_widget_get_has_template (SyncConfigWidget *self); void sync_config_widget_set_configured (SyncConfigWidget *self, gboolean configured); gboolean sync_config_widget_get_configured (SyncConfigWidget *self); const char *sync_config_widget_get_name (SyncConfigWidget *widget); void sync_config_widget_expand_id (SyncConfigWidget *self, const char *id); void sync_config_widget_add_alternative_config (SyncConfigWidget *self, const char *name, SyncevoConfig *config, gboolean configured); G_END_DECLS #endif syncevolution-1.5/src/gtk-ui/gtkinfobar.c0000644000373300001540000011375212326412403022005 0ustar00nightlynightly00000000000000/* * gtkinfobar.c * This file is from GTK+, used here when GTK version < 2.18 * * Copyright (C) 2005 - Paolo Maggi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the gedit Team, 2005. See the AUTHORS file for a * list of people on the gtk Team. * See the gedit ChangeLog files for a list of changes. * * Modified by the GTK+ team, 2008-2009. */ #include "config.h" #ifndef GTK_2_18 #include "gtkinfobar.h" #include #include #include #include #define I_(X) X #define P_(X) X /** * SECTION:gtkinfobar * @short_description: Report important messages to the user * @include: gtk/gtk.h * @see_also: #GtkStatusbar, #GtkMessageDialog * * #GtkInfoBar is a widget that can be used to show messages to * the user without showing a dialog. It is often temporarily shown * at the top or bottom of a document. In contrast to #GtkDialog, which * has a horizontal action area at the bottom, #GtkInfoBar has a * vertical action area at the side. * * The API of #GtkInfoBar is very similar to #GtkDialog, allowing you * to add buttons to the action area with gtk_info_bar_add_button() or * gtk_info_bar_new_with_buttons(). The sensitivity of action widgets * can be controlled with gtk_info_bar_set_response_sensitive(). * To add widgets to the main content area of a #GtkInfoBar, use * gtk_info_bar_get_content_area() and add your widgets to the container. * * Similar to #GtkMessageDialog, the contents of a #GtkInfoBar can by * classified as error message, warning, informational message, etc, * by using gtk_info_bar_set_message_type(). GTK+ uses the message type * to determine the background color of the message area. * * * Simple GtkInfoBar usage. * * /* set up info bar */ * info_bar = gtk_info_bar_new (); * gtk_widget_set_no_show_all (info_bar, TRUE); * message_label = gtk_label_new (""); * gtk_widget_show (message_label); * content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar)); * gtk_container_add (GTK_CONTAINER (content_area), message_label); * gtk_info_bar_add_button (GTK_INFO_BAR (info_bar), * GTK_STOCK_OK, GTK_RESPONSE_OK); * g_signal_connect (info_bar, "response", * G_CALLBACK (gtk_widget_hide), NULL); * gtk_table_attach (GTK_TABLE (table), * info_bar, * 0, 1, 2, 3, * GTK_EXPAND | GTK_FILL, 0, * 0, 0); * * /* ... */ * * /* show an error message */ * gtk_label_set_text (GTK_LABEL (message_label), error_message); * gtk_info_bar_set_message_type (GTK_INFO_BAR (info_bar), * GTK_MESSAGE_ERROR); * gtk_widget_show (info_bar); * * * * * GtkInfoBar as GtkBuildable * * The GtkInfoBar implementation of the GtkBuildable interface exposes * the content area and action area as internal children with the names * "content_area" and "action_area". * * * GtkInfoBar supports a custom <action-widgets> element, which * can contain multiple <action-widget> elements. The "response" * attribute specifies a numeric response, and the content of the element * is the id of widget (which should be a child of the dialogs @action_area). * * */ #define GTK_INFO_BAR_GET_PRIVATE(object) \ (G_TYPE_INSTANCE_GET_PRIVATE ((object), \ GTK_TYPE_INFO_BAR, \ GtkInfoBarPrivate)) enum { PROP_0, PROP_MESSAGE_TYPE }; struct _GtkInfoBarPrivate { GtkWidget *content_area; GtkWidget *action_area; GtkMessageType message_type; }; typedef struct _ResponseData ResponseData; struct _ResponseData { gint response_id; }; enum { RESPONSE, CLOSE, LAST_SIGNAL }; static guint signals[LAST_SIGNAL]; static void gtk_info_bar_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gtk_info_bar_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void gtk_info_bar_style_set (GtkWidget *widget, GtkStyle *prev_style); static gboolean gtk_info_bar_expose (GtkWidget *widget, GdkEventExpose *event); static void gtk_info_bar_buildable_interface_init (GtkBuildableIface *iface); static GObject *gtk_info_bar_buildable_get_internal_child (GtkBuildable *buildable, GtkBuilder *builder, const gchar *childname); static gboolean gtk_info_bar_buildable_custom_tag_start (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *tagname, GMarkupParser *parser, gpointer *data); static void gtk_info_bar_buildable_custom_finished (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *tagname, gpointer user_data); G_DEFINE_TYPE_WITH_CODE (GtkInfoBar, gtk_info_bar, GTK_TYPE_HBOX, G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, gtk_info_bar_buildable_interface_init)) static void gtk_info_bar_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GtkInfoBar *info_bar; GtkInfoBarPrivate *priv; info_bar = GTK_INFO_BAR (object); priv = GTK_INFO_BAR_GET_PRIVATE (info_bar); switch (prop_id) { case PROP_MESSAGE_TYPE: gtk_info_bar_set_message_type (info_bar, g_value_get_enum (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gtk_info_bar_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GtkInfoBar *info_bar; GtkInfoBarPrivate *priv; info_bar = GTK_INFO_BAR (object); priv = GTK_INFO_BAR_GET_PRIVATE (info_bar); switch (prop_id) { case PROP_MESSAGE_TYPE: g_value_set_enum (value, gtk_info_bar_get_message_type (info_bar)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gtk_info_bar_finalize (GObject *object) { G_OBJECT_CLASS (gtk_info_bar_parent_class)->finalize (object); } static void response_data_free (gpointer data) { g_slice_free (ResponseData, data); } static ResponseData * get_response_data (GtkWidget *widget, gboolean create) { ResponseData *ad = g_object_get_data (G_OBJECT (widget), "gtk-info-bar-response-data"); if (ad == NULL && create) { ad = g_slice_new (ResponseData); g_object_set_data_full (G_OBJECT (widget), I_("gtk-info-bar-response-data"), ad, response_data_free); } return ad; } static GtkWidget * find_button (GtkInfoBar *info_bar, gint response_id) { GList *children, *list; GtkWidget *child = NULL; children = gtk_container_get_children (GTK_CONTAINER (info_bar->priv->action_area)); for (list = children; list; list = list->next) { ResponseData *rd = get_response_data (list->data, FALSE); if (rd && rd->response_id == response_id) { child = list->data; break; } } g_list_free (children); return child; } static void gtk_info_bar_close (GtkInfoBar *info_bar) { if (!find_button (info_bar, GTK_RESPONSE_CANCEL)) return; gtk_info_bar_response (GTK_INFO_BAR (info_bar), GTK_RESPONSE_CANCEL); } static gboolean gtk_info_bar_expose (GtkWidget *widget, GdkEventExpose *event) { GtkInfoBarPrivate *priv = GTK_INFO_BAR_GET_PRIVATE (widget); const char* type_detail[] = { "infobar-info", "infobar-warning", "infobar-question", "infobar-error", "infobar" }; if (priv->message_type != GTK_MESSAGE_OTHER) { const char *detail; detail = type_detail[priv->message_type]; gtk_paint_box (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, widget, detail, widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height); } if (GTK_WIDGET_CLASS (gtk_info_bar_parent_class)->expose_event) GTK_WIDGET_CLASS (gtk_info_bar_parent_class)->expose_event (widget, event); return FALSE; } static void gtk_info_bar_class_init (GtkInfoBarClass *klass) { GtkWidgetClass *widget_class; GObjectClass *object_class; GtkBindingSet *binding_set; widget_class = GTK_WIDGET_CLASS (klass); object_class = G_OBJECT_CLASS (klass); object_class->get_property = gtk_info_bar_get_property; object_class->set_property = gtk_info_bar_set_property; object_class->finalize = gtk_info_bar_finalize; widget_class->style_set = gtk_info_bar_style_set; widget_class->expose_event = gtk_info_bar_expose; klass->close = gtk_info_bar_close; /** * GtkInfoBar:message-type: * * The type of the message. * * The type is used to determine the colors to use in the info bar. * The following symbolic color names can by used to customize * these colors: * "info_fg_color", "info_bg_color", * "warning_fg_color", "warning_bg_color", * "question_fg_color", "question_bg_color", * "error_fg_color", "error_bg_color". * "other_fg_color", "other_bg_color". * * If the type is #GTK_MESSAGE_OTHER, no info bar is painted but the * colors are still set. * * Since: 2.18 */ g_object_class_install_property (object_class, PROP_MESSAGE_TYPE, g_param_spec_enum ("message-type", P_("Message Type"), P_("The type of message"), GTK_TYPE_MESSAGE_TYPE, GTK_MESSAGE_INFO, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); /** * GtkInfoBar::response: * @info_bar: the object on which the signal is emitted * @response_id: the response ID * * Emitted when an action widget is clicked or the application programmer * calls gtk_dialog_response(). The @response_id depends on which action * widget was clicked. * * Since: 2.18 */ signals[RESPONSE] = g_signal_new (I_("response"), G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GtkInfoBarClass, response), NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT); /** * GtkInfoBar::close: * * The ::close signal is a * keybinding signal * which gets emitted when the user uses a keybinding to dismiss * the info bar. * * The default binding for this signal is the Escape key. * * Since: 2.18 */ signals[CLOSE] = g_signal_new (I_("close"), G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkInfoBarClass, close), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /** * GtkInfoBar:content-area-border: * * The width of the border around the content * content area of the info bar. * * Since: 2.18 */ gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("content-area-border", P_("Content area border"), P_("Width of border around the content area"), 0, G_MAXINT, 8, G_PARAM_READABLE)); /** * GtkInfoBar:content-area-spacing: * * The default spacing used between elements of the * content area of the info bar. * * Since: 2.18 */ gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("content-area-spacing", P_("Content area spacing"), P_("Spacing between elements of the area"), 0, G_MAXINT, 16, G_PARAM_READABLE)); /** * GtkInfoBar:button-spacing: * * Spacing between buttons in the action area of the info bar. * * Since: 2.18 */ gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("button-spacing", P_("Button spacing"), P_("Spacing between buttons"), 0, G_MAXINT, 6, G_PARAM_READABLE)); /** * GtkInfoBar:action-area-border: * * Width of the border around the action area of the info bar. * * Since: 2.18 */ gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("action-area-border", P_("Action area border"), P_("Width of border around the action area"), 0, G_MAXINT, 5, G_PARAM_READABLE)); binding_set = gtk_binding_set_by_class (klass); gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, "close", 0); g_type_class_add_private (object_class, sizeof (GtkInfoBarPrivate)); } static void gtk_info_bar_update_colors (GtkInfoBar *info_bar) { GtkWidget *widget = (GtkWidget*)info_bar; GtkInfoBarPrivate *priv; GdkColor info_default_border_color = { 0, 0xb800, 0xad00, 0x9d00 }; GdkColor info_default_fill_color = { 0, 0xff00, 0xff00, 0xbf00 }; GdkColor warning_default_border_color = { 0, 0xb000, 0x7a00, 0x2b00 }; GdkColor warning_default_fill_color = { 0, 0xfc00, 0xaf00, 0x3e00 }; GdkColor question_default_border_color = { 0, 0x6200, 0x7b00, 0xd960 }; GdkColor question_default_fill_color = { 0, 0x8c00, 0xb000, 0xd700 }; GdkColor error_default_border_color = { 0, 0xa800, 0x2700, 0x2700 }; GdkColor error_default_fill_color = { 0, 0xf000, 0x3800, 0x3800 }; GdkColor other_default_border_color = { 0, 0xb800, 0xad00, 0x9d00 }; GdkColor other_default_fill_color = { 0, 0xff00, 0xff00, 0xbf00 }; GdkColor *fg = NULL; GdkColor *bg = NULL; GdkColor sym_fg, sym_bg; GtkStyle *style; const char* fg_color_name[] = { "info_fg_color", "warning_fg_color", "question_fg_color", "error_fg_color", "other_fg_color" }; const char* bg_color_name[] = { "info_bg_color", "warning_bg_color", "question_bg_color", "error_bg_color", "other_bg_color" }; priv = GTK_INFO_BAR_GET_PRIVATE (info_bar); style = gtk_widget_get_style (widget); if (gtk_style_lookup_color (style, fg_color_name[priv->message_type], &sym_fg) && gtk_style_lookup_color (style, bg_color_name[priv->message_type], &sym_bg)) { fg = &sym_fg; bg = &sym_bg; } else { switch (priv->message_type) { case GTK_MESSAGE_INFO: fg = &info_default_border_color; bg = &info_default_fill_color; break; case GTK_MESSAGE_WARNING: fg = &warning_default_border_color; bg = &warning_default_fill_color; break; case GTK_MESSAGE_QUESTION: fg = &question_default_border_color; bg = &question_default_fill_color; break; case GTK_MESSAGE_ERROR: fg = &error_default_border_color; bg = &error_default_fill_color; break; case GTK_MESSAGE_OTHER: fg = &other_default_border_color; bg = &other_default_fill_color; break; } } if (!gdk_color_equal (bg, &widget->style->bg[GTK_STATE_NORMAL])) gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, bg); if (!gdk_color_equal (fg, &widget->style->fg[GTK_STATE_NORMAL])) gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, fg); } static void gtk_info_bar_style_set (GtkWidget *widget, GtkStyle *prev_style) { GtkInfoBar *info_bar = GTK_INFO_BAR (widget); gint button_spacing; gint action_area_border; gint content_area_spacing; gint content_area_border; gtk_widget_style_get (widget, "button-spacing", &button_spacing, "action-area-border", &action_area_border, "content-area-spacing", &content_area_spacing, "content-area-border", &content_area_border, NULL); gtk_box_set_spacing (GTK_BOX (info_bar->priv->action_area), button_spacing); gtk_container_set_border_width (GTK_CONTAINER (info_bar->priv->action_area), action_area_border); gtk_box_set_spacing (GTK_BOX (info_bar->priv->content_area), content_area_spacing); gtk_container_set_border_width (GTK_CONTAINER (info_bar->priv->content_area), content_area_border); gtk_info_bar_update_colors (info_bar); } static void gtk_info_bar_init (GtkInfoBar *info_bar) { GtkWidget *content_area; GtkWidget *action_area; gtk_widget_push_composite_child (); info_bar->priv = GTK_INFO_BAR_GET_PRIVATE (info_bar); content_area = gtk_hbox_new (FALSE, 0); gtk_widget_show (content_area); gtk_box_pack_start (GTK_BOX (info_bar), content_area, TRUE, TRUE, 0); action_area = gtk_vbutton_box_new (); gtk_widget_show (action_area); gtk_button_box_set_layout (GTK_BUTTON_BOX (action_area), GTK_BUTTONBOX_END); gtk_box_pack_start (GTK_BOX (info_bar), action_area, FALSE, TRUE, 0); gtk_widget_set_app_paintable (GTK_WIDGET (info_bar), TRUE); gtk_widget_set_redraw_on_allocate (GTK_WIDGET (info_bar), TRUE); info_bar->priv->content_area = content_area; info_bar->priv->action_area = action_area; gtk_widget_pop_composite_child (); } static GtkBuildableIface *parent_buildable_iface; static void gtk_info_bar_buildable_interface_init (GtkBuildableIface *iface) { parent_buildable_iface = g_type_interface_peek_parent (iface); iface->get_internal_child = gtk_info_bar_buildable_get_internal_child; iface->custom_tag_start = gtk_info_bar_buildable_custom_tag_start; iface->custom_finished = gtk_info_bar_buildable_custom_finished; } static GObject * gtk_info_bar_buildable_get_internal_child (GtkBuildable *buildable, GtkBuilder *builder, const gchar *childname) { if (strcmp (childname, "content_area") == 0) return G_OBJECT (GTK_INFO_BAR (buildable)->priv->content_area); else if (strcmp (childname, "action_area") == 0) return G_OBJECT (GTK_INFO_BAR (buildable)->priv->action_area); return parent_buildable_iface->get_internal_child (buildable, builder, childname); } static gint get_response_for_widget (GtkInfoBar *info_bar, GtkWidget *widget) { ResponseData *rd; rd = get_response_data (widget, FALSE); if (!rd) return GTK_RESPONSE_NONE; else return rd->response_id; } static void action_widget_activated (GtkWidget *widget, GtkInfoBar *info_bar) { gint response_id; response_id = get_response_for_widget (info_bar, widget); gtk_info_bar_response (info_bar, response_id); } /** * gtk_info_bar_add_action_widget: * @info_bar: a #GtkInfoBar * @child: an activatable widget * @response_id: response ID for @child * * Add an activatable widget to the action area of a #GtkInfoBar, * connecting a signal handler that will emit the #GtkInfoBar::response * signal on the message area when the widget is activated. The widget * is appended to the end of the message areas action area. * * Since: 2.18 */ void gtk_info_bar_add_action_widget (GtkInfoBar *info_bar, GtkWidget *child, gint response_id) { ResponseData *ad; guint signal_id; g_return_if_fail (GTK_IS_INFO_BAR (info_bar)); g_return_if_fail (GTK_IS_WIDGET (child)); ad = get_response_data (child, TRUE); ad->response_id = response_id; if (GTK_IS_BUTTON (child)) signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON); else signal_id = GTK_WIDGET_GET_CLASS (child)->activate_signal; if (signal_id) { GClosure *closure; closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated), G_OBJECT (info_bar)); g_signal_connect_closure_by_id (child, signal_id, 0, closure, FALSE); } else g_warning ("Only 'activatable' widgets can be packed into the action area of a GtkInfoBar"); gtk_box_pack_end (GTK_BOX (info_bar->priv->action_area), child, FALSE, FALSE, 0); if (response_id == GTK_RESPONSE_HELP) gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (info_bar->priv->action_area), child, TRUE); } /** * gtk_info_bar_get_action_area: * @info_bar: a #GtkInfoBar * * Returns the action area of @info_bar. * * Returns: the action area. * * Since: 2.18 */ GtkWidget* gtk_info_bar_get_action_area (GtkInfoBar *info_bar) { g_return_val_if_fail (GTK_IS_INFO_BAR (info_bar), NULL); return info_bar->priv->action_area; } /** * gtk_info_bar_get_content_area: * @info_bar: a #GtkInfoBar * * Returns the content area of @info_bar. * * Returns: the content area. * * Since: 2.18 */ GtkWidget* gtk_info_bar_get_content_area (GtkInfoBar *info_bar) { g_return_val_if_fail (GTK_IS_INFO_BAR (info_bar), NULL); return info_bar->priv->content_area; } /** * gtk_info_bar_add_button: * @info_bar: a #GtkInfoBar * @button_text: text of button, or stock ID * @response_id: response ID for the button * * Adds a button with the given text (or a stock button, if button_text * is a stock ID) and sets things up so that clicking the button will emit * the "response" signal with the given response_id. The button is appended * to the end of the info bars's action area. The button widget is * returned, but usually you don't need it. * * Returns: the button widget that was added * * Since: 2.18 */ GtkWidget* gtk_info_bar_add_button (GtkInfoBar *info_bar, const gchar *button_text, gint response_id) { GtkWidget *button; g_return_val_if_fail (GTK_IS_INFO_BAR (info_bar), NULL); g_return_val_if_fail (button_text != NULL, NULL); button = gtk_button_new_from_stock (button_text); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_show (button); gtk_info_bar_add_action_widget (info_bar, button, response_id); return button; } static void add_buttons_valist (GtkInfoBar *info_bar, const gchar *first_button_text, va_list args) { const gchar* text; gint response_id; g_return_if_fail (GTK_IS_INFO_BAR (info_bar)); if (first_button_text == NULL) return; text = first_button_text; response_id = va_arg (args, gint); while (text != NULL) { gtk_info_bar_add_button (info_bar, text, response_id); text = va_arg (args, gchar*); if (text == NULL) break; response_id = va_arg (args, int); } } /** * gtk_info_bar_add_buttons: * @info_bar: a #GtkInfoBar * @first_button_text: button text or stock ID * @...: response ID for first button, then more text-response_id pairs, * ending with %NULL * * Adds more buttons, same as calling gtk_info_bar_add_button() * repeatedly. The variable argument list should be %NULL-terminated * as with gtk_info_bar_new_with_buttons(). Each button must have both * text and response ID. * * Since: 2.18 */ void gtk_info_bar_add_buttons (GtkInfoBar *info_bar, const gchar *first_button_text, ...) { va_list args; va_start (args, first_button_text); add_buttons_valist (info_bar, first_button_text, args); va_end (args); } /** * gtk_info_bar_new: * * Creates a new #GtkInfoBar object. * * Returns: a new #GtkInfoBar object * * Since: 2.18 */ GtkWidget * gtk_info_bar_new (void) { return g_object_new (GTK_TYPE_INFO_BAR, NULL); } /** * gtk_info_bar_new_with_buttons: * @first_button_text: stock ID or text to go in first button, or %NULL * @...: response ID for first button, then additional buttons, ending * with %NULL * * Creates a new #GtkInfoBar with buttons. Button text/response ID * pairs should be listed, with a %NULL pointer ending the list. * Button text can be either a stock ID such as %GTK_STOCK_OK, or * some arbitrary text. A response ID can be any positive number, * or one of the values in the #GtkResponseType enumeration. If the * user clicks one of these dialog buttons, GtkInfoBar will emit * the "response" signal with the corresponding response ID. * * Returns: a new #GtkInfoBar */ GtkWidget* gtk_info_bar_new_with_buttons (const gchar *first_button_text, ...) { GtkInfoBar *info_bar; va_list args; info_bar = GTK_INFO_BAR (gtk_info_bar_new ()); va_start (args, first_button_text); add_buttons_valist (info_bar, first_button_text, args); va_end (args); return GTK_WIDGET (info_bar); } /** * gtk_info_bar_set_response_sensitive: * @info_bar: a #GtkInfoBar * @response_id: a response ID * @setting: TRUE for sensitive * * Calls gtk_widget_set_sensitive (widget, setting) for each * widget in the info bars's action area with the given response_id. * A convenient way to sensitize/desensitize dialog buttons. * * Since: 2.18 */ void gtk_info_bar_set_response_sensitive (GtkInfoBar *info_bar, gint response_id, gboolean setting) { GList *children, *list; g_return_if_fail (GTK_IS_INFO_BAR (info_bar)); children = gtk_container_get_children (GTK_CONTAINER (info_bar->priv->action_area)); for (list = children; list; list = list->next) { GtkWidget *widget = list->data; ResponseData *rd = get_response_data (widget, FALSE); if (rd && rd->response_id == response_id) gtk_widget_set_sensitive (widget, setting); } g_list_free (children); } /** * gtk_info_bar_set_default_response: * @info_bar: a #GtkInfoBar * @response_id: a response ID * * Sets the last widget in the info bar's action area with * the given response_id as the default widget for the dialog. * Pressing "Enter" normally activates the default widget. * * Since: 2.18 */ void gtk_info_bar_set_default_response (GtkInfoBar *info_bar, gint response_id) { GList *children, *list; g_return_if_fail (GTK_IS_INFO_BAR (info_bar)); children = gtk_container_get_children (GTK_CONTAINER (info_bar->priv->action_area)); for (list = children; list; list = list->next) { GtkWidget *widget = list->data; ResponseData *rd = get_response_data (widget, FALSE); if (rd && rd->response_id == response_id) gtk_widget_grab_default (widget); } g_list_free (children); } /** * gtk_info_bar_response: * @info_bar: a #GtkInfoBar * @response_id: a response ID * * Emits the 'response' signal with the given @response_id. * * Since: 2.18 */ void gtk_info_bar_response (GtkInfoBar *info_bar, gint response_id) { g_return_if_fail (GTK_IS_INFO_BAR (info_bar)); g_signal_emit (info_bar, signals[RESPONSE], 0, response_id); } typedef struct { gchar *widget_name; gchar *response_id; } ActionWidgetInfo; typedef struct { GtkInfoBar *info_bar; GtkBuilder *builder; GSList *items; gchar *response; } ActionWidgetsSubParserData; static void attributes_start_element (GMarkupParseContext *context, const gchar *element_name, const gchar **names, const gchar **values, gpointer user_data, GError **error) { ActionWidgetsSubParserData *parser_data = (ActionWidgetsSubParserData*)user_data; guint i; if (strcmp (element_name, "action-widget") == 0) { for (i = 0; names[i]; i++) if (strcmp (names[i], "response") == 0) parser_data->response = g_strdup (values[i]); } else if (strcmp (element_name, "action-widgets") == 0) return; else g_warning ("Unsupported tag for GtkInfoBar: %s\n", element_name); } static void attributes_text_element (GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { ActionWidgetsSubParserData *parser_data = (ActionWidgetsSubParserData*)user_data; ActionWidgetInfo *item; if (!parser_data->response) return; item = g_new (ActionWidgetInfo, 1); item->widget_name = g_strndup (text, text_len); item->response_id = parser_data->response; parser_data->items = g_slist_prepend (parser_data->items, item); parser_data->response = NULL; } static const GMarkupParser attributes_parser = { attributes_start_element, NULL, attributes_text_element, }; gboolean gtk_info_bar_buildable_custom_tag_start (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *tagname, GMarkupParser *parser, gpointer *data) { ActionWidgetsSubParserData *parser_data; if (child) return FALSE; if (strcmp (tagname, "action-widgets") == 0) { parser_data = g_slice_new0 (ActionWidgetsSubParserData); parser_data->info_bar = GTK_INFO_BAR (buildable); parser_data->items = NULL; *parser = attributes_parser; *data = parser_data; return TRUE; } return parent_buildable_iface->custom_tag_start (buildable, builder, child, tagname, parser, data); } static void gtk_info_bar_buildable_custom_finished (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *tagname, gpointer user_data) { GSList *l; ActionWidgetsSubParserData *parser_data; GObject *object; GtkInfoBar *info_bar; ResponseData *ad; guint signal_id; if (strcmp (tagname, "action-widgets")) { parent_buildable_iface->custom_finished (buildable, builder, child, tagname, user_data); return; } info_bar = GTK_INFO_BAR (buildable); parser_data = (ActionWidgetsSubParserData*)user_data; parser_data->items = g_slist_reverse (parser_data->items); for (l = parser_data->items; l; l = l->next) { ActionWidgetInfo *item = l->data; object = gtk_builder_get_object (builder, item->widget_name); if (!object) { g_warning ("Unknown object %s specified in action-widgets of %s", item->widget_name, gtk_buildable_get_name (GTK_BUILDABLE (buildable))); continue; } ad = get_response_data (GTK_WIDGET (object), TRUE); ad->response_id = atoi (item->response_id); if (GTK_IS_BUTTON (object)) signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON); else signal_id = GTK_WIDGET_GET_CLASS (object)->activate_signal; if (signal_id) { GClosure *closure; closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated), G_OBJECT (info_bar)); g_signal_connect_closure_by_id (object, signal_id, 0, closure, FALSE); } if (ad->response_id == GTK_RESPONSE_HELP) gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (info_bar->priv->action_area), GTK_WIDGET (object), TRUE); g_free (item->widget_name); g_free (item->response_id); g_free (item); } g_slist_free (parser_data->items); g_slice_free (ActionWidgetsSubParserData, parser_data); } /** * gtk_info_bar_set_message_type: * @info_bar: a #GtkInfoBar * @message_type: a #GtkMessageType * * Sets the message type of the message area. * GTK+ uses this type to determine what color to use * when drawing the message area. * * Since: 2.18 */ void gtk_info_bar_set_message_type (GtkInfoBar *info_bar, GtkMessageType message_type) { GtkInfoBarPrivate *priv; AtkObject *atk_obj; g_return_if_fail (GTK_IS_INFO_BAR (info_bar)); priv = GTK_INFO_BAR_GET_PRIVATE (info_bar); if (priv->message_type != message_type) { priv->message_type = message_type; gtk_info_bar_update_colors (info_bar); gtk_widget_queue_draw (GTK_WIDGET (info_bar)); atk_obj = gtk_widget_get_accessible (GTK_WIDGET (info_bar)); if (GTK_IS_ACCESSIBLE (atk_obj)) { GtkStockItem item; const char *stock_id = NULL; atk_object_set_role (atk_obj, ATK_ROLE_ALERT); switch (message_type) { case GTK_MESSAGE_INFO: stock_id = GTK_STOCK_DIALOG_INFO; break; case GTK_MESSAGE_QUESTION: stock_id = GTK_STOCK_DIALOG_QUESTION; break; case GTK_MESSAGE_WARNING: stock_id = GTK_STOCK_DIALOG_WARNING; break; case GTK_MESSAGE_ERROR: stock_id = GTK_STOCK_DIALOG_ERROR; break; case GTK_MESSAGE_OTHER: break; default: g_warning ("Unknown GtkMessageType %u", message_type); break; } if (stock_id) { gtk_stock_lookup (stock_id, &item); atk_object_set_name (atk_obj, item.label); } } g_object_notify (G_OBJECT (info_bar), "message-type"); } } /** * gtk_info_bar_get_message_type: * @info_bar: a #GtkInfoBar * * Returns the message type of the message area. * * Returns: the message type of the message area. * * Since: 2.18 */ GtkMessageType gtk_info_bar_get_message_type (GtkInfoBar *info_bar) { GtkInfoBarPrivate *priv; g_return_val_if_fail (GTK_IS_INFO_BAR (info_bar), GTK_MESSAGE_OTHER); priv = GTK_INFO_BAR_GET_PRIVATE (info_bar); return priv->message_type; } #define __GTK_INFO_BAR_C__ #endif syncevolution-1.5/src/gtk-ui/gtkinfobar.h0000644000373300001540000001066412326412403022010 0ustar00nightlynightly00000000000000/* * gtkinfobar.h * This file is from GTK+, used here when GTK version < 2.18 * * Copyright (C) 2005 - Paolo Maggi * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the gedit Team, 2005. See the gedit AUTHORS file for a * list of people on the gedit Team. * See the gedit ChangeLog files for a list of changes. * * Modified by the GTK+ Team, 2008-2009. */ #include "config.h" #ifndef GTK_2_18 #ifndef __GTK_INFO_BAR_H__ #define __GTK_INFO_BAR_H__ #include G_BEGIN_DECLS /* * Type checking and casting macros */ #define GTK_TYPE_INFO_BAR (gtk_info_bar_get_type()) #define GTK_INFO_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_INFO_BAR, GtkInfoBar)) #define GTK_INFO_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_INFO_BAR, GtkInfoBarClass)) #define GTK_IS_INFO_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_INFO_BAR)) #define GTK_IS_INFO_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_INFO_BAR)) #define GTK_INFO_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_INFO_BAR, GtkInfoBarClass)) typedef struct _GtkInfoBarPrivate GtkInfoBarPrivate; typedef struct _GtkInfoBarClass GtkInfoBarClass; typedef struct _GtkInfoBar GtkInfoBar; struct _GtkInfoBar { GtkHBox parent; /*< private > */ GtkInfoBarPrivate *priv; }; struct _GtkInfoBarClass { GtkHBoxClass parent_class; /* Signals */ void (* response) (GtkInfoBar *info_bar, gint response_id); /* Keybinding signals */ void (* close) (GtkInfoBar *info_bar); /* Padding for future expansion */ void (*_gtk_reserved1) (void); void (*_gtk_reserved2) (void); void (*_gtk_reserved3) (void); void (*_gtk_reserved4) (void); void (*_gtk_reserved5) (void); void (*_gtk_reserved6) (void); }; GType gtk_info_bar_get_type (void) G_GNUC_CONST; GtkWidget *gtk_info_bar_new (void); GtkWidget *gtk_info_bar_new_with_buttons (const gchar *first_button_text, ...); GtkWidget *gtk_info_bar_get_action_area (GtkInfoBar *info_bar); GtkWidget *gtk_info_bar_get_content_area (GtkInfoBar *info_bar); void gtk_info_bar_add_action_widget (GtkInfoBar *info_bar, GtkWidget *child, gint response_id); GtkWidget *gtk_info_bar_add_button (GtkInfoBar *info_bar, const gchar *button_text, gint response_id); void gtk_info_bar_add_buttons (GtkInfoBar *info_bar, const gchar *first_button_text, ...); void gtk_info_bar_set_response_sensitive (GtkInfoBar *info_bar, gint response_id, gboolean setting); void gtk_info_bar_set_default_response (GtkInfoBar *info_bar, gint response_id); /* Emit response signal */ void gtk_info_bar_response (GtkInfoBar *info_bar, gint response_id); void gtk_info_bar_set_message_type (GtkInfoBar *info_bar, GtkMessageType message_type); GtkMessageType gtk_info_bar_get_message_type (GtkInfoBar *info_bar); G_END_DECLS #endif /* __GTK_INFO_BAR_H__ */ #endif syncevolution-1.5/src/gtk-ui/ui.xml0000644000373300001540000027747212326412403020664 0ustar00nightlynightly00000000000000 1024 False 5 Sync Emergency True 800 550 True sync_win True False 4 True False 0 none True True never True False queue True False True False 8 True False 8 800 True False 0 If something has gone horribly wrong you can try a slow sync, start from scratch or restore from backup. True False True 0 True True True False 0 20 True False 2 Calendar True True False False True Tasks True True False False True 1 2 True False Affected data: False True 1 False True 8 0 True False 5 True False 0 <big>Slow sync</big> True False True 0 True False 0 0 0 40 40 True False 6 True True True False True False 16 Slow sync True True 0 True False 8 A slow sync compares items from both sides and tries to merge them. This may fail in some cases, leading to duplicates or lost information. True True 1 False True 1 False True 8 1 True False 5 True False 0 <big>Start from scratch</big> True False True 0 True False 0 0 0 40 40 True False True True True False True False 16 Delete all your local information and replace with data from Zyb False True 0 True False 15 <b>or</b> True False False 1 True True True False True False 16 Delete all data on Zyb and replace with your local information False True 2 False True 1 False True 8 2 True False 5 True False 0 <big>Restore from backup</big> True False True 0 True False queue 40 40 True False 800 True False 0 Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost. True False False 0 True True True False queue True False 10 2 16 True False 0 5 Backup before syncing Dec 5th 2009 16:35 2 3 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 5th 2009 13:35 3 4 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 5th 2009 11:35 4 5 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 3rd 5 6 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 1st 6 7 GTK_FILL GTK_FILL True False 0 5 Backup before syncing yesterday 1 2 GTK_FILL GTK_FILL True False 0 5 Backup before syncing two hours ago GTK_FILL Restore True True True False 1 2 GTK_FILL GTK_FILL 16 True True 1 True True 1 True True 8 3 False True 40 0 True False True True True 0 True False Close True True True False False True 12 end 0 False True 1 1024 False 5 Settings True 800 550 True sync_win True False 4 True False 0 none True True never True False queue True False True False 12 36 12 True False 12 True False 5 True False 0 <big>Network sync</big> True False True 0 True False True False To sync you'll need a network connection and an account with a sync service. We support the following services: False True 0 False True 1 300 True True in True False queue True False True True 2 True False True False 0 If you don't see your service above but know that your sync provider uses SyncML you can setup a service manually. True True 0 Add new service 150 True True True False False True 8 1 False False 3 True True 8 0 400 True False 5 True False 0 <big>Direct sync</big> True False True 0 True False True False Use Bluetooth to Sync your data from one device to another. False True 0 False True 1 300 True True in True False queue True False True True 2 True False True False 0 You will need to add Bluetooth devices before they can be synced. True True 0 Add new device 150 True True False False True 8 1 False False 3 True True 1 True True 0 True False True True True 6 0 True False Close True True True False False True 12 end 0 False True 1 1024 False Sync 800 550 True False True False 4 4 True False True False 0 none True False True False 48 48 True False True False gtk-missing-image 6 True True 0 False True 10 0 True False 0 0.20000000298023224 True end 42 False True 5 1 True False 6 4 False False 8 end 2 False True 16 0 True False True False True False True False True False True False False True 0 False True False 0 none True False 5 12 True False False False 0 False True 1 True True 55 0 False False 6 0 False True 0 False True 1 True False True False True 0 True True 0 250 True False 5 True False True False 0 in True False True False True False True False 0 False False 6 0 24 True False True False gtk-missing-image False True 0 False True 1 False True 0 False True 10 0 True False True False False False True 0 False True 5 0 False True 5 1 25 True False False end True True 5 end 0 False False 2 True False True False 10 True False 0 <b>Actions</b> True False True 0 Sync now True True True False False False 1 True True True False True False Change or edit sync service center False False 2 Fix a sync emergency True True True False False False 3 True True 30 0 False True 20 3 True False True True True 0 True True 0 False True end 1 True True 0 syncevolution-1.5/src/gtk3-ui/0000755000373300037200000000000012424707642017756 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/gtk3-ui/README0000644000373300001540000000037512326412403020452 0ustar00nightlynightly00000000000000SyncEvolution Graphical User Interface for Moblin * Running Syncevolution D-Bus service must be either running or installed properly (so DBus autostart works). the client itself must be installed so glade ui file and rc style file get found. syncevolution-1.5/src/gtk3-ui/sync.desktop.in0000644000373300001540000000023512326412403022541 0ustar00nightlynightly00000000000000[Desktop Entry] _Name=Sync _Comment=Up to date Version=1.0 Type=Application Exec=sync-ui Icon=sync Categories=Network;GTK; Terminal=false StartupNotify=true syncevolution-1.5/src/gtk3-ui/sync-gtk.desktop.in0000644000373300001540000000027112326412403023324 0ustar00nightlynightly00000000000000[Desktop Entry] _Name=SyncEvolution (GTK) _Comment=Synchronize PIM data Version=1.0 Type=Application Exec=sync-ui Icon=sync Categories=Office;PDA;GTK; Terminal=false StartupNotify=true syncevolution-1.5/src/gtk3-ui/sync.png0000644000373300001540000000602712326412403021254 0ustar00nightlynightly00000000000000‰PNG  IHDR00Wù‡tEXtSoftwareAdobe ImageReadyqÉe< ¹IDATxÚÔY[lÕþç²»ã]ïz½ëõ&±M.ŽãpI 4‚†Š*Q¤¶© UªèRÕŠ¶B¢ U[P€>ÐVä¡€RûÒÒJTôBÓÐT¤Š+äBâ@b'¾Ækï®÷:×~ÿÙ™½xmC™p¤Ï™™sÎ|ÿý?³ÒÑ£Gé³ÜdúŒ7u¥‡SSS: ùV›Ê­Y³¦´Ò$iÇŽtüøñ†›/½ô’ÝZÐç5M»½­­m—ã8þÕD/I’>33sï=†Ë,Ͻ{÷šõs{ƒnx}ŽöO¿ÆßÐÖuuÝÖÞÞîí¸ºòwÚ¸iÓ™L†FÏŸ¹P(<Á¾ýdòýÍݱM¨§££ã`ïæÍÛE¡39›þ8mÒæM*««cEÓ ë#*Ý“Ph;ØÚÚºgøÔ)>Ÿÿ.-ë~ÝÁ¹?4oÑC#eŠ$Ú(Ô£ GXf™6 ¦‹ôÚÐý¤_£¯vk´¹¯ï®o½µ'÷VücÉ(ÔÇ¿çóU$}ð\‰¢í¤µÕ±Û¡rÑ¢rÉ&Ÿ ö®==¼ ž…B!òûý÷aؾRM4íïâlÉ!Ëêø®iØTxËrª÷ŸJe_€ŒÊ=øãnt‰•Âh<ØÒ",…}ø>M¦¯Ä}´½U¡¾–FYäd(gÑÑŒI›3W;‘^¶È4e§œÉš´ïQT5ÎWd ˆÁ^.-yÖú%zô*np¯mzV$ÁÐî6Uлzb¬L¯gÌf“¹Øöòà}šŸàÂŒ‚A[‰Ÿ¿"õ ‹ÍQ‡=zU€Z’?3ÎÀ,1^jO0úÔF¾}º@#%» ¾“qœ(d™ÞÍt[2@þŠpãKúb¬_ƒÄU‘hÞ"y‘ØdƒgiÞ=\æágÍð¯ñœÏ!ýýþ’AaUæ¶9 }(ðBš¯êþŠpÀ*/¥°ªª×0Ç–H 4*è©M-¢æõãsÍþÅþ `îûÍöWL¥[]3âvo¢Q£ƒ`ð•ޤ ˜‰³¬Ø<Þ7[–dˆ‹hoŶ{ïà­2yÛÞÕ® s;0Z¢¥^Çà¹íàýðo¾Çt 3e›ÖAKý!…nÄ<¦‡7:ô³‘ý+e4k HWÌŽs„|ˆ.Å@“ÞEž×(2™®yÜêJqÎqÁµãåš'éIÝ¡ç&Ëô—YC„GŽñõíK>úV—F7EUúÕÕ!úó´NžÎ/®Šà5çF£[§§§;0¼¸8ăÁZÆ)Ø¢þ±m[PØ 8ƒp(ïÞbZ*Zýt½Fûâ*s:Ù–Õ@‡§KtÿPš~1"„I_OúéÌpñÇ(°n%NÞ ä¡w®õ’EÐ\w‹B7¹&8œ]Úa_8Ÿ£;~ÚóÓƒ›‚thªX3"ÓËHf Èn „v«n „øÉ¦× Æ—§+r’úцf5דeZ´høöý{w‚~wS¬J|’%×ýébÅþ¯û„ùy÷I䂊p˜çpÏa¿Þ"(à®óЏ!„7æÚ‚rØ‚Y»‰ê}«~Õå.uN·zU©ZB×x‹Od¡6É'Ò}}ËÚíyãíï‹Ðý=!êÒzrkDÐÀl©AÊ×¶Õ Á,*ÍW' ´o}«[F@ªV³SãtÙ¬ÎYœ±qÀY_*•¸¤x¯Ê@8Q«GGãà%ËŽï¦éÅÑ=¸¡•¾œl€oîh>3\€ãÿa4KÏd0G©1DKE²z#U†OΗ žÁTÍaêA¯&òˆ©ªZMCiƒ”ʆe0u“ΦËôƒñJÔ¹6꧈_}V·1–éTZ§™Z$É""Ýsdœz`RSZ\çþzg§XÏíyH²–/”`î499Yaà‘Gá½:ZÜ"®Z¿-’›7P»/6­Ssi LåéÚöºs½â/ÿ—˜ùê<~>° 3ûØöNÚ·¡"ýSóe¬›mþJ r¥çWØU hðì ^JW–ã2`"ª0p˰?ÔÉ*]2¡Khä±í z ?JÏž§éÀÕÌâædîìÓ½›Úð%ºûðXõÝ‹>RÔýpdû¾(7Û¸@òB(›YÒÉ,Ê"ž“C—ÕÆtºã¯çè™[ÖÒ-Éõ„|ôøŽÎ\÷ì;sôôÛ—„ .]–J48§ È•¢n›aÂqã°©«½yoL穜7ÈQ>úWÇ1äo¼zžnY¢ûz£¢ïim>]Èô÷±,À§ÄxÅ]u*` €~0Ð!€ôMUÛ¦ÛŽM,âÖÆN«EªcSùËýÎ%|€ú*×---=ÅbQ0ÀI¬*n1 ³?éïpYÄõÉ\]‘|ù_êêJ Eä/þñNa"IàØ'ìÞqèJnRsœ¥R­týZvÅ‚¾-YËî.æ„/wOL on ^qàùó¢‡ ¶OóóóœÑ{UÔÁp8B'O½C7\ÿ91áákZ1¹…^¹XºB$ ~·ÒaA¾‰rB屬æóù÷£Ñv»pÕd‘®Á` ­Ã!ä;}¡+J ©Ô<9L ¹­MvÒ\¡ðžšÍf‡;;õQ¿ß·~6•¢Ã¯¡¶H„â1Rþüé:3,K”Íd)“ÍV¿Nض9™N§Ï¨8áá0ÿlWW÷ϧff}\%òD&˲Dåø©þ‰‡hS%yœLĉ‰ñßÌÌÌœS¶mÛ6M3mšÆÙh[$áó’ºnTËÞO=\BÞ7ZM PÀïžœœ88>>>077—BFV xôl¡P8Š£8,l hÚFY’{pò Ÿ¨ÈGÆX®ÏC’878ŸDÎsê{ìkêG’ G–M¼gz6;:—ËÉd2cår9ã÷ûutØ”sYH¥R£ îÀ&!ôA†±ß­\å:ªJè£$Öj~mÔ²]G ZÇþ%Pã<÷üE}‹0w]pC®™ìîÈ‹uÜ×q›O$~Ö $±ÛcécÚ¸SωÛÛèL÷¯VÆRÂÂÿÈîÁž¥Q»JXÌÊÿNv%3ÃFL83ã´Ô©©)«»»ÛAyêèºnx’ì–« 6’YêÜ3pOÒœÒ9O°Vêãôå2báUÀûã]–qNam°,”<¬&o!oÙ¨‡¬ÙÙY[íëës ‹U‡ÐÄH,‹2&K\opïš™„0+úO2Oxà0$+z¾ Ìœ ¡Šﵑ…-"Uoo¯£Äb1g×®]„šH, …BÊ ÁT4µ±!/´’ɤŠ̱$LlÄ6j¹¶*úË%ÜÃT,€6yo–6ÞkBºl f"² é«ÍŒ0[¶lqœÿ 0-:1€´ò IEND®B`‚syncevolution-1.5/src/gtk3-ui/sync-generic.png0000644000373300001540000000320512326412403022661 0ustar00nightlynightly00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDATxœí›kˆUUÇkœÑñ9F˜Yá K²Š„BCRŒ$F˜ÈB B ‹š¬(°¨¬/’Hù¥¨Œ¢¨B‚(ûP™½èæk¤ÌrLK«©ttVö:s÷ܹsιwö¹ÇafÁæœYóßk¯ó?û±Ö>ûŠªÒŸ¥6º‘Ÿq@{ ÛuÀaUÈ^&"Q‘Lº‚ªJvCIm ÝÐ@¶ÿ d'SéF€ªþ°Èýâ;¥T@DF¿ÛŸGRØàlà/U=+oU‘’5À »[†½½s§úÒÑ08 LHag° ø'„SÕ”žˆDUõP’‰ësAEMÞä-äí@Þ’4d""2h¦[™‚ ÁÛ€¿`«•mªšYPÕ-VU‘z\$§Àá4v€s€SªZWl¯Xä p^JÛ€—€uªº/eÔ’D@¹Ò¡ªƒŠíukT¤¸Ø ìvã†ãH+Ók¬ÌÄܼ ¬TÕÖ |+)Î5:¶nªÀo)íŒNªêV?Z;èEV("Sf`10ÄüYªª›+±WJÔ+GU•Åí´ÀÞùÀ»žÍõXî¥ÝNƒõ¡Þ3^ŠÏær\Ä©À†`„~x¯àöY kûfw..gQ`I¥v„Bü~"МR,C ›!Y ¼¦©jšÔ½›¡ëD˜E9Râ ï˜-À—ÀÀ=À°”=á=kccE=ÉŒÔgX†9,À“¸'Ž´V`UÀ$ óÁ¥P­ ^3g;p¡îr`<0¸ ¸ øÂ#b P—`w½a×åBP“3 øÐ=ÌNÀϤéÞÀÑPW•ààðh œÚC]’ÒöeÀŸVï±ì7†k¬ÀÍÀikxS n8.©R`®§¯¾Žãr‚ýqÌ·zmqó°Æp««Bp‹½ùh¬.‹ÁÞg˜ížn(…¼¸t÷ÀvÓ7Å´q‡a^.ç9*Ú‘EÀ«¸ãSï©2ß®Ïxº;qãüЈKÈn~æ{Ø·ìÚÓFäÇä÷»J…o?ŠÖ{ì~j þ+Ã\éév˜nAvéw{ºi¦kic’ad>€¥¸”ÜŽ£cðû 3ÙÓ7ÝØ"lƒéOxº©¦ÛÓF”xµãbFàÞÌæ¯á]ÖðôL«a&xºïL·°;Çôû=ÝÕ¦ÛÓÆDÃü,ÃÅ'I¤BlŠFcR æ#»Þäé^·ë³"2ODDäÜöÀóvŠ]Æ´µxÎîWªjüÇš=`Žù1˜&Ã|êéj÷)½ | Œô°Qd¸<¦Û½úĬJ¡‡@3 a(. ŒbÿëŠô͸õÿ8°x/À­ üJ̦ ðb¹Š€ÙÆ^!1.ŠÂàr"Á(nNÀ.³îÿDYþ @pkp—(¯\”®O°;ŸB¼…”éqÙþ1«ÍÑ7pƒ)$D lnÅmOÃm‡¯>÷0IÈÏ&âÂâv`Fv(p7n;¾Ô•6¬3†{°µÞ[M“×wᶺ?³ °x·jtëò¸ˆ²÷Ѧ§r ø¸ Ú §ñ%F`¶×cŠËž4$„v0J]O‹2$ n n¬õÂT$dñ–î§“/ l[MkHKBpÌhUèžj«I@9$dB€9ð…Ý¢O€‹ªI@Z2#À¸øÑ›63«E@ ZŠÿßy> +‘ÑÀSÀÜ$…½­Ö3¾ÆE|ÑÞþ…¸€èbà{U}Á³åX(ó+“ˆ4àBðnu3'Àsb îÀ ÜY‚4rXU;jVJ@\ݪà9RƒKrfY‹!FàBå}¸“#;Íj.¬nß' 7’ýþ˜Üy;· ·yËy;· ·yK.Çå{+"ìø|_#`7.[¬Oö ÇŠ}*‘: ?é+K´ÄBû¡¥ßO‚ÿ([žMFd¤ÀIEND®B`‚syncevolution-1.5/src/gtk3-ui/sync-spinner.gif0000644000373300001540000000414612326412403022711 0ustar00nightlynightly00000000000000GIF89añ½½½¾¾¾¿¿¿!ù !ÿ NETSCAPE2.0,7œ©Ëí¢ˆ/Eyo½3g‡yb#uáW)cj¡ì±¾+{2L¿ö½×ý& è‚C"ˤá%o̦3Q!ù ,Hœ©Ëí¢BÉ5œ€žL‰À‹¼¥3=€a"رþÃÕtÄëV’Êñh!j¦Ôª¡!ù ,Nœ©Ëíã@.„°ÓÊ ^¶…Ù rÔ'¥ÇŠ9c¢‘Í woCÊàh²C°ä£!^Ñ‹¢¤O×Çùñ쎣f5Ñ%~]]ëŒN !ù ,Hœ©Ëí‡"®IE€Îº ncVZç§µ¢‡0%K(”h­8)`¯Ë§'!Q˜Åê÷:•ÔNŠE³¬Èí“ ‹Ã!ù ,‚½½½¾¾¾¿¿¿ÀÀÀ?HºÜþ0JÂŒ5_—û^öa5’å‰fƒºšnËj:‹u×r”Õ”>í,bж2\–ÁÉ 0õ¸®Ø,!!ù ,‚½½½¾¾¾¿¿¿ÀÀÀ6HºÜþ0JªÎj¼´çŠ·qâEŠ`÷¥áÈ¢,µ¾3mưí†Xé‘_Í1+½Ÿîk:Ÿ‹!ù ,2œ©Ëí¢ /Í[ÇÝuóç R÷efhª­iùºñÈžSÝÊ™wï¼èûE‚žY‡L* !ù ,5œ©Ëí¢ŒÍ*Þnóæa XYW™œèA®C»Âñ䲪{ YâÞŒÑù&Ý%«)—ÌA!ù ,7œ©Ëí¢ŒïÌ+Þ¡qÎ|Û2"Sx…ÞY%X린%Ïk—ëo¾Ø@ÀßÐxPz̦ÓP!ù ,Jœ©ËíDœà*s~SãØtŸÕb–^' b‹¨'ò.ªR詤l¡å‚ )!c)ÉÒ#=¤èY›J~ÓäµKåÇän!ù ,<œ©Ëí¢ŒÍKÞ¡qÎ|`²‘—‚-§)…ëñ¢­ËòT©xÎ À£ † lg„Ì’Ê"³ùŒJ§TD!ù ,<œ©Ëí¢Œïˆ‰©Ë<´Þ1`˜p%¦d‹Š âÔº+|°³tâŸ^Óß­©¤x\“‹ ó J§TC!ù ,:œ©Ëí¢ŒïÌ+ÞÁñÍ|œ"y-i²¢û†14«õÜæg²oÚ(¨Ê c3z”̦ó J¥!ù ,‚¼¼¼½½½¾¾¾¿¿¿9HºÜþ0J%ª­“Ý%ÿB‚ÐH6ŸÆ9+{¹V¹¡¯«S·âž™j"DkXrÉl:ŸÐ¨ô™!ù ,Hœ©Ëí&@œàIóË@JÚxž@ÕòEÝÈ)kG"ð¨¨ß¢%ØéæGê0é:šÌ27>¤a&p"ZRˆ±šÄ`‘­÷ ‹!ù ,Kœ©Ëí&"S #include #include "config.h" #include "sync-ui.h" static char *settings_id = NULL; static GOptionEntry entries[] = { { "show-settings", 0, 0, G_OPTION_ARG_STRING, &settings_id, "Open sync settings for given sync url or configuration name", "url or config name" }, { NULL } }; static void set_app_name_and_icon () { /* TRANSLATORS: this is the application name that may be used by e.g. the windowmanager */ g_set_application_name (_("Sync")); gtk_window_set_default_icon_name ("sync"); } static void init (int argc, char *argv[]) { GError *error = NULL; GOptionContext *context; gtk_init (&argc, &argv); bindtextdomain (GETTEXT_PACKAGE, SYNCEVOLUTION_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); context = g_option_context_new ("- synchronise PIM data with Syncevolution"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_add_group (context, gtk_get_option_group (TRUE)); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_warning ("option parsing failed: %s\n", error->message); } } #ifdef ENABLE_UNIQUE #include enum { COMMAND_0, COMMAND_SHOW_CONFIGURATION /* no sync-ui specific commands */ }; static UniqueResponse message_received_cb (UniqueApp *app, gint command, UniqueMessageData *message, guint time_, app_data *data) { char *arg; GtkWindow *main_win; main_win = sync_ui_get_main_window (data); switch (command) { case UNIQUE_ACTIVATE: if (GTK_IS_WINDOW (main_win)) { /* move the main window to the screen that sent us the command */ gtk_window_set_screen (GTK_WINDOW (main_win), unique_message_data_get_screen (message)); gtk_window_present (GTK_WINDOW (main_win)); } break; case COMMAND_SHOW_CONFIGURATION: arg = unique_message_data_get_text (message); if (GTK_IS_WINDOW (main_win) && arg) { /* move the main window to the screen that sent us the command */ gtk_window_set_screen (GTK_WINDOW (main_win), unique_message_data_get_screen (message)); sync_ui_show_settings (data, arg); } break; default: break; } return UNIQUE_RESPONSE_OK; } int main (int argc, char *argv[]) { UniqueApp *app; init (argc, argv); app = unique_app_new_with_commands ("org.Moblin.Sync", NULL, "show-configuration", COMMAND_SHOW_CONFIGURATION, NULL); if (unique_app_is_running (app)) { UniqueMessageData *message = NULL; UniqueCommand command = UNIQUE_ACTIVATE; if (settings_id) { command = COMMAND_SHOW_CONFIGURATION; message = unique_message_data_new (); unique_message_data_set_text (message, settings_id, -1); } unique_app_send_message (app, command, message); unique_message_data_free (message); } else { app_data *data; set_app_name_and_icon (); data = sync_ui_create (); if (data) { /* UniqueApp watches the main window so it can terminate * the startup notification sequence for us */ unique_app_watch_window (app, sync_ui_get_main_window (data)); /* handle notifications from new app launches */ g_signal_connect (app, "message-received", G_CALLBACK (message_received_cb), data); if (settings_id) { sync_ui_show_settings (data, settings_id); } gtk_main (); } } g_object_unref (app); return 0; } #else int main (int argc, char *argv[]) { app_data *data; init (argc, argv); set_app_name_and_icon (); data = sync_ui_create (); if (settings_id) { sync_ui_show_settings (data, settings_id); } gtk_main (); return 0; } #endif /* ENABLE_UNIQUE */ syncevolution-1.5/src/gtk3-ui/sync-ui.c0000644000373300001540000036317012326412403021332 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include #include "syncevo-server.h" #include "syncevo-session.h" /* for return value definitions */ /* TODO: would be nice to have a non-synthesis-dependent API but for now it's like this... */ #include #include "config.h" #include "sync-ui-config.h" #include "sync-ui.h" #include "sync-config-widget.h" #ifdef USE_MOBLIN_UX #include "mux-frame.h" #endif static gboolean support_canceling = FALSE; #define REPORTS_PER_CALL 10 #define SYNC_UI_ICON_SIZE 48 #define STRING_VARIANT_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) enum { PAGE_MAIN, PAGE_SETTINGS, PAGE_EMERGENCY, }; typedef enum bluetooth_type { SYNC_BLUETOOTH_NONE, SYNC_BLUETOOTH_GNOME, SYNC_BLUETOOTH_MOBLIN } bluetooth_type; typedef enum app_state { SYNC_UI_STATE_CURRENT_STATE, SYNC_UI_STATE_GETTING_SERVER, SYNC_UI_STATE_NO_SERVER, SYNC_UI_STATE_SERVER_OK, SYNC_UI_STATE_SERVER_FAILURE, SYNC_UI_STATE_SYNCING, } app_state; typedef enum ui_operation { OP_SYNC, /* use sync mode from config */ OP_SYNC_SLOW, OP_SYNC_REFRESH_FROM_CLIENT, OP_SYNC_REFRESH_FROM_SERVER, OP_SAVE, OP_RESTORE, } ui_operation; typedef struct operation_data { app_data *data; ui_operation operation; gboolean started; const char *dir; /* for OP_RESTORE */ } operation_data; struct _app_data { GtkWidget *sync_win; GtkWidget *services_win; /* will be NULL when USE_MOBLIN_UX is set*/ GtkWidget *emergency_win; /* will be NULL when USE_MOBLIN_UX is set*/ #ifdef USE_MOBLIN_UX GtkWidget *notebook; /* only in use with USE_MOBLIN_UX */ GtkWidget *back_btn; /* only in use with USE_MOBLIN_UX */ #endif GtkWidget *settings_btn; /* only in use with USE_MOBLIN_UX */ guint settings_id; GtkWidget *service_box; GtkWidget *info_bar; GtkWidget *no_connection_box; GtkWidget *main_frame; GtkWidget *log_frame; GtkWidget *server_icon_box; GtkWidget *offline_label; GtkWidget *progress; GtkWidget *sync_status_label; GtkWidget *spinner_image; GtkWidget *sync_btn; GtkWidget *change_service_btn; GtkWidget *emergency_btn; GtkWidget *server_label; GtkWidget *autosync_box; GtkWidget *autosync_toggle; GtkWidget *last_synced_label; GtkWidget *sources_box; GtkWidget *new_service_btn; GtkWidget *new_device_btn; GtkWidget *services_box; GtkWidget *devices_box; GtkWidget *scrolled_window; GtkWidget *expanded_config; GtkWidget *settings_close_btn; GtkWidget *emergency_label; GtkWidget *emergency_expander; GtkWidget *emergency_source_table; GtkWidget *refresh_from_server_btn_label; GtkWidget *refresh_from_client_btn_label; GtkWidget *emergency_backup_table; GtkWidget *emergency_close_btn; GtkWidget *password_dialog_entry; char *password_dialog_id; gboolean forced_emergency; GHashTable *emergency_sources; guint backup_count; gboolean online; gboolean syncing; gboolean synced_this_session; int last_sync; guint last_sync_src_id; ui_operation current_operation; server_config *current_service; app_state current_state; guint service_list_updates_left; gboolean open_current; /* should the service list open the current service when it populates next time*/ char *config_id_to_open; SyncevoServer *server; SyncevoSession *running_session; /* session that is currently active */ bluetooth_type bluetooth_wizard; }; static void set_sync_progress (app_data *data, float progress, char *status); static void set_app_state (app_data *data, app_state state); static void show_main_view (app_data *data); static void update_emergency_view (app_data *data); static void update_emergency_expander (app_data *data); static void show_emergency_view (app_data *data); static void show_services_list (app_data *data, const char *config_id_to_open); static void update_services_list (app_data *data); static void update_service_ui (app_data *data); static void setup_new_service_clicked (GtkButton *btn, app_data *data); static gboolean source_config_update_widget (source_config *source); static void get_presence_cb (SyncevoServer *server, char *status, char **transport, GError *error, app_data *data); static void get_reports_cb (SyncevoServer *server, SyncevoReports *reports, GError *error, app_data *data); static void start_session_cb (SyncevoServer *server, char *path, GError *error, operation_data *op_data); static void get_config_for_main_win_cb (SyncevoServer *server, SyncevoConfig *config, GError *error, app_data *data); void show_error_dialog (GtkWidget *widget, const char* message) { GtkWindow *window = GTK_WINDOW (gtk_widget_get_toplevel (widget)); GtkWidget *w; w = gtk_message_dialog_new (window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", message); gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (w); } static void remove_child (GtkWidget *widget, GtkContainer *container) { gtk_container_remove (container, widget); } static void change_service_clicked_cb (GtkButton *btn, app_data *data) { /* data->open_current = TRUE; */ show_services_list (data, NULL); } static void emergency_clicked_cb (GtkButton *btn, app_data *data) { show_emergency_view (data); } char* get_pretty_source_name (const char *source_name) { /* TRANSLATORS: There have been name changes to keep things in line with * the rest of the moblin UI. Please make sure the name you use matches * the ones in e.g. the panels. */ if (strcmp (source_name, "addressbook") == 0) { return g_strdup (_("Contacts")); } else if (strcmp (source_name, "calendar") == 0) { return g_strdup (_("Appointments")); } else if (strcmp (source_name, "todo") == 0) { return g_strdup (_("Tasks")); } else if (strcmp (source_name, "memo") == 0) { return g_strdup (_("Notes")); } else if (strcmp (source_name, "calendar+todo") == 0) { /* TRANSLATORS: This is a "combination source" for syncing with devices * that combine appointments and tasks. the name should match the ones * used for calendar and todo above */ return g_strdup (_("Appointments & Tasks")); } else { char *tmp; tmp = g_strdup (source_name); tmp[0] = g_ascii_toupper (tmp[0]); return tmp; } } char* get_pretty_source_name_markup (const char *source_name) { char *plain, *markup; plain = get_pretty_source_name (source_name); markup = g_markup_escape_text (plain, -1); g_free (plain); return markup; } static void reload_config (app_data *data, const char *server) { server_config_free (data->current_service); data->forced_emergency = FALSE; g_hash_table_remove_all (data->emergency_sources); if (!server || strlen (server) == 0) { data->current_service = NULL; update_service_ui (data); set_app_state (data, SYNC_UI_STATE_SERVER_OK); } else { data->synced_this_session = FALSE; data->current_service = g_slice_new0 (server_config); data->current_service->name = g_strdup (server); set_app_state (data, SYNC_UI_STATE_GETTING_SERVER); syncevo_server_get_config (data->server, data->current_service->name, FALSE, (SyncevoServerGetConfigCb)get_config_for_main_win_cb, data); } } static void abort_sync_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { /* TODO show in UI: failed to abort sync (while syncing) */ g_error_free (error); } /* status change handler takes care of updating UI */ } static void sync_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { /* TODO show in UI: sync failed (failed to even start) */ g_error_free (error); g_object_unref (session); return; } set_sync_progress (data, 0.0, _("Starting sync")); /* stop updates of "last synced" */ if (data->last_sync_src_id > 0) g_source_remove (data->last_sync_src_id); set_app_state (data, SYNC_UI_STATE_SYNCING); } gboolean show_confirmation (GtkWidget *widget, const char *message, const char *yes, const char *no) { GtkWidget *w; int ret; w = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", message); gtk_dialog_add_buttons (GTK_DIALOG (w), no, GTK_RESPONSE_NO, yes, GTK_RESPONSE_YES, NULL); ret = gtk_dialog_run (GTK_DIALOG (w)); gtk_widget_destroy (w); return (ret == GTK_RESPONSE_YES); } static void slow_sync (app_data *data) { operation_data *op_data; char *message; /* TRANSLATORS: slow sync confirmation dialog message. Placeholder * is service/device name */ message = g_strdup_printf (_("Do you want to slow sync with %s?"), data->current_service->pretty_name); /* TRANSLATORS: slow sync confirmation dialog buttons */ if (!show_confirmation (data->sync_win, message, _("Yes, do slow sync"), _("No, cancel sync"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_SYNC_SLOW; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void slow_sync_clicked_cb (GtkButton *btn, app_data *data) { slow_sync (data); } static void refresh_from_server_clicked_cb (GtkButton *btn, app_data *data) { operation_data *op_data; char *message; /* TRANSLATORS: confirmation dialog for "refresh from peer". Placeholder * is service/device name */ message = g_strdup_printf (_("Do you want to delete all local data and replace it with " "data from %s? This is not usually advised."), data->current_service->pretty_name); /* TRANSLATORS: "refresh from peer" confirmation dialog buttons */ if (!show_confirmation (data->sync_win, message, _("Yes, delete and replace"), _("No"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = peer_is_client (data->current_service->config) ? OP_SYNC_REFRESH_FROM_CLIENT : OP_SYNC_REFRESH_FROM_SERVER; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void refresh_from_client_clicked_cb (GtkButton *btn, app_data *data) { operation_data *op_data; char *message; /* TRANSLATORS: confirmation dialog for "refresh from local side". Placeholder * is service/device name */ message = g_strdup_printf (_("Do you want to delete all data in %s and replace it with " "your local data? This is not usually advised."), data->current_service->pretty_name); /* TRANSLATORS: "refresh from local side" confirmation dialog buttons */ if (!show_confirmation (data->sync_win, message, _("Yes, delete and replace"), _("No"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = peer_is_client (data->current_service->config) ? OP_SYNC_REFRESH_FROM_SERVER : OP_SYNC_REFRESH_FROM_CLIENT; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void start_sync (app_data *data) { operation_data *op_data; if (data->syncing) { syncevo_session_abort (data->running_session, (SyncevoSessionGenericCb)abort_sync_cb, data); set_sync_progress (data, -1.0, _("Trying to cancel sync")); } else { op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_SYNC; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); } } static void sync_clicked_cb (GtkButton *btn, app_data *data) { g_return_if_fail (data->current_service); start_sync (data); } #define DAY 60 * 60 * 24 #define HALF_DAY 60 * 60 * 12 #define HOUR 60 * 60 #define HALF_HOUR 60 * 30 #define MINUTE 60 #define HALF_MINUTE 30 static gboolean refresh_last_synced_label (app_data *data) { GTimeVal val; glong diff; char *msg; int delay; g_get_current_time (&val); diff = val.tv_sec - data->last_sync; if (!data->current_service) { msg = g_strdup (_("No service or device selected")); delay = -1; } else if (data->last_sync <= 0) { msg = g_strdup (data->current_service->pretty_name); /* we don't know */ delay = -1; } else if (diff < HALF_MINUTE) { /* TRANSLATORS: This is the title on main view. Placeholder is * the service name. Example: "Google - synced just now" */ msg = g_strdup_printf (_("%s - synced just now"), data->current_service->pretty_name); delay = 10; } else if (diff < MINUTE + HALF_MINUTE) { msg = g_strdup_printf (_("%s - synced a minute ago"), data->current_service->pretty_name); delay = MINUTE; } else if (diff < HOUR) { msg = g_strdup_printf (_("%s - synced %ld minutes ago"), data->current_service->pretty_name, (diff + HALF_MINUTE) / MINUTE); delay = MINUTE; } else if (diff < HOUR + HALF_HOUR) { msg = g_strdup_printf (_("%s - synced an hour ago"), data->current_service->pretty_name); delay = HOUR; } else if (diff < DAY) { msg = g_strdup_printf (_("%s - synced %ld hours ago"), data->current_service->pretty_name, (diff + HALF_HOUR) / (HOUR)); delay = HOUR; } else if (diff < DAY + HALF_DAY) { msg = g_strdup_printf (_("%s - synced a day ago"), data->current_service->pretty_name); delay = HOUR; } else { msg = g_strdup_printf (_("%s - synced %ld days ago"), data->current_service->pretty_name, (diff + HALF_DAY) / (DAY)); delay = HOUR; } gtk_label_set_text (GTK_LABEL (data->server_label), msg); g_free (msg); if (data->last_sync_src_id > 0) g_source_remove (data->last_sync_src_id); if (delay > 0) data->last_sync_src_id = g_timeout_add_seconds (delay, (GSourceFunc)refresh_last_synced_label, data); return FALSE; } static void set_sync_progress (app_data *data, float progress, char *status) { if (progress >= 0) gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (data->progress), progress); if (status) gtk_progress_bar_set_text (GTK_PROGRESS_BAR (data->progress), status); } static void set_info_bar (GtkWidget *widget, GtkMessageType type, SyncErrorResponse response_id, const char *message) { GtkWidget *container, *label; GtkInfoBar *bar = GTK_INFO_BAR (widget); if (!message) { gtk_widget_hide (widget); return; } container = gtk_info_bar_get_action_area (bar); gtk_container_foreach (GTK_CONTAINER (container), (GtkCallback)remove_child, container); switch (response_id) { case SYNC_ERROR_RESPONSE_SYNC: /* TRANSLATORS: Action button in info bar in main view. Shown with e.g. * "You've just restored a backup. The changes have not been " * "synced with %s yet" * Please make this text multi-line if your text is longer * than ~25 chars (example: "My very long\nbutton title") */ gtk_info_bar_add_button (bar, _("Sync now"), response_id); break; case SYNC_ERROR_RESPONSE_EMERGENCY: /* TRANSLATORS: Action button in info bar in main view. Shown with e.g. * "A normal sync is not possible at this time..." message. * "Other options" will open Emergency view * Please make this text multi-line if your text is longer * than ~25 chars (example: "My very long\nbutton title") */ gtk_info_bar_add_button (bar, _("Slow sync"), SYNC_ERROR_RESPONSE_EMERGENCY_SLOW_SYNC); gtk_info_bar_add_button (bar, _("Other options..."), response_id); break; case SYNC_ERROR_RESPONSE_SETTINGS_SELECT: /* TRANSLATORS: Action button in info bar in main view. Shown e.g. * when no service is selected. Will open configuration view * Please make this text multi-line if your text is longer * than ~25 chars (example: "My very long\nbutton title") */ gtk_info_bar_add_button (bar, _("Select sync service"), response_id); break; case SYNC_ERROR_RESPONSE_SETTINGS_OPEN: /* TRANSLATORS: Action button in info bar in main view. Shown e.g. * login to service fails. Will open configuration view for this service * (e.g. "Edit service\nsettings") * Please make this text multi-line if your text is longer * than ~25 chars (example: "My very long\nbutton title") */ gtk_info_bar_add_button (bar, _("Edit service settings"), response_id); break; case SYNC_ERROR_RESPONSE_NONE: break; default: g_warn_if_reached (); } gtk_info_bar_set_message_type (bar, type); container = gtk_info_bar_get_content_area (bar); gtk_container_foreach (GTK_CONTAINER (container), (GtkCallback)remove_child, container); label = gtk_label_new (message); gtk_widget_set_name (label, "info_label"); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_set_size_request (label, 250, -1); gtk_box_pack_start (GTK_BOX (container), label, FALSE, FALSE, 8); gtk_widget_show (label); gtk_widget_show (widget); } static void set_app_state (app_data *data, app_state state) { if (state != SYNC_UI_STATE_CURRENT_STATE) data->current_state = state; switch (data->current_state) { case SYNC_UI_STATE_GETTING_SERVER: gtk_widget_hide (data->service_box); gtk_widget_hide (data->info_bar); gtk_label_set_text (GTK_LABEL (data->sync_status_label), ""); refresh_last_synced_label (data); gtk_widget_set_sensitive (data->main_frame, TRUE); gtk_widget_set_sensitive (data->sync_btn, FALSE); gtk_widget_set_sensitive (data->change_service_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, FALSE); break; case SYNC_UI_STATE_SERVER_FAILURE: gtk_widget_hide (data->service_box); gtk_widget_hide (data->autosync_box); gtk_widget_hide (data->progress); refresh_last_synced_label (data); /* info bar content should be set earlier */ gtk_widget_show (data->info_bar); gtk_label_set_text (GTK_LABEL (data->sync_status_label), ""); gtk_widget_set_sensitive (data->main_frame, FALSE); gtk_widget_set_sensitive (data->sync_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); gtk_widget_set_sensitive (data->change_service_btn, FALSE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, FALSE); break; case SYNC_UI_STATE_SERVER_OK: if (data->online) { gtk_widget_hide (data->no_connection_box); } else { gtk_widget_show (data->no_connection_box); } /* TRANSLATORS: These are for the button in main view, right side. Keep line length below ~20 characters, use two lines if needed */ gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Sync now")); if (!data->current_service) { gtk_widget_hide (data->service_box); gtk_widget_hide (data->autosync_box); gtk_widget_hide (data->progress); set_info_bar (data->info_bar, GTK_MESSAGE_INFO, SYNC_ERROR_RESPONSE_SETTINGS_SELECT, _("You haven't selected a sync service or device yet. " "Sync services let you synchronize your data " "between your netbook and a web service. You can " "also sync directly with some devices.")); refresh_last_synced_label (data); gtk_label_set_text (GTK_LABEL (data->sync_status_label), ""); gtk_widget_set_sensitive (data->sync_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->change_service_btn); } else { gtk_widget_hide (data->info_bar); gtk_widget_show (data->service_box); gtk_widget_show (data->autosync_box); gtk_widget_set_sensitive (data->sync_btn, data->online); gtk_widget_set_sensitive (data->emergency_btn, TRUE); if (data->synced_this_session && data->current_operation != OP_RESTORE) { gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Sync again")); } else { gtk_widget_hide (data->progress); } gtk_window_set_focus (GTK_WINDOW (data->sync_win), data->sync_btn); } gtk_widget_set_sensitive (data->main_frame, TRUE); gtk_widget_set_sensitive (data->change_service_btn, TRUE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, TRUE); data->syncing = FALSE; break; case SYNC_UI_STATE_SYNCING: /* we have a active session, and a session is running (the running session may or may not be ours) */ gtk_widget_show (data->progress); if (data->current_operation == OP_RESTORE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Restoring")); } else { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Syncing")); } gtk_widget_set_sensitive (data->main_frame, FALSE); gtk_widget_set_sensitive (data->change_service_btn, FALSE); gtk_widget_set_sensitive (data->emergency_btn, FALSE); if (data->settings_btn) gtk_widget_set_sensitive (data->settings_btn, FALSE); gtk_widget_set_sensitive (data->sync_btn, support_canceling && data->current_operation != OP_RESTORE); if (support_canceling && support_canceling && data->current_operation != OP_RESTORE) { /* TRANSLATORS: This is for the button in main view, right side. Keep line length below ~20 characters, use two lines if needed */ gtk_button_set_label (GTK_BUTTON (data->sync_btn), _("Cancel sync")); } data->syncing = TRUE; break; default: g_assert_not_reached (); } } #ifdef USE_MOBLIN_UX static GtkWidget* switch_dummy_to_mux_frame (GtkWidget *dummy) { GtkWidget *frame, *parent; const char *title; g_assert (GTK_IS_BIN (dummy)); frame = mux_frame_new (); gtk_widget_set_name (frame, gtk_widget_get_name (dummy)); title = gtk_frame_get_label (GTK_FRAME(dummy)); if (title && strlen (title) > 0) gtk_frame_set_label (GTK_FRAME (frame), title); parent = gtk_widget_get_parent (dummy); g_assert (GTK_IS_BOX (parent)); gtk_widget_reparent (gtk_bin_get_child (GTK_BIN (dummy)), frame); gtk_container_remove (GTK_CONTAINER (parent), dummy); gtk_box_pack_start (GTK_BOX (parent), frame, TRUE, TRUE, 0); gtk_widget_show (frame); return frame; } static void set_page (app_data *data, int page) { int current = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook)); if (page != current) { gtk_notebook_set_current_page (GTK_NOTEBOOK (data->notebook), page); if (page != PAGE_MAIN) { gtk_widget_show (data->back_btn); } else { gtk_widget_hide (data->back_btn); } /* make sure the toggle is correct */ g_signal_handler_block (data->settings_btn, data->settings_id); if (page == PAGE_SETTINGS) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->settings_btn), TRUE); } else if (current == PAGE_SETTINGS) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (data->settings_btn), FALSE); } g_signal_handler_unblock (data->settings_btn, data->settings_id); } gtk_window_present (GTK_WINDOW (data->sync_win)); } static void settings_toggled (GtkToggleButton *button, app_data *data) { int page = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook)); if (page == PAGE_SETTINGS) { show_main_view (data); } else { show_services_list (data, NULL); } } static gboolean key_press_cb (GtkWidget *widget, GdkEventKey *event, app_data *data) { int page = gtk_notebook_get_current_page (GTK_NOTEBOOK (data->notebook)); if (event->keyval == GDK_KEY_Escape && page != PAGE_MAIN) { show_main_view (data); } return FALSE; } /* For some reason metacity sometimes won't maximize but will if asked * another time. For the record, I'm not proud of writing this */ static gboolean try_maximize (GtkWindow *win) { static int count = 0; count++; gtk_window_maximize (win); return (count < 10); } static void setup_windows (app_data *data, GtkWidget *main, GtkWidget *settings, GtkWidget *emergency) { GtkWidget *tmp, *toolbar, *close_btn; GtkToolItem *item; g_assert (GTK_IS_WINDOW (main)); g_assert (GTK_IS_WINDOW (settings)); g_assert (GTK_IS_WINDOW (emergency)); data->sync_win = main; data->services_win = NULL; data->emergency_win = NULL; /* populate the notebook with window contents */ data->notebook = gtk_notebook_new (); gtk_widget_show (data->notebook); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (data->notebook), FALSE); gtk_notebook_set_show_border (GTK_NOTEBOOK (data->notebook), FALSE); gtk_window_maximize (GTK_WINDOW (data->sync_win)); g_timeout_add (10, (GSourceFunc)try_maximize, data->sync_win); gtk_window_set_decorated (GTK_WINDOW (data->sync_win), FALSE); gtk_widget_set_name (data->sync_win, "meego_win"); g_signal_connect (data->sync_win, "key-press-event", G_CALLBACK (key_press_cb), data); tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (data->sync_win))); gtk_container_remove (GTK_CONTAINER (data->sync_win), tmp); gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL); g_object_unref (tmp); tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (settings))); gtk_container_remove (GTK_CONTAINER (settings), tmp); gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL); g_object_unref (tmp); tmp = g_object_ref (gtk_bin_get_child (GTK_BIN (emergency))); gtk_container_remove (GTK_CONTAINER (emergency), tmp); gtk_notebook_append_page (GTK_NOTEBOOK (data->notebook), tmp, NULL); g_object_unref (tmp); tmp = gtk_vbox_new (FALSE, 0); gtk_widget_show (tmp); gtk_container_add (GTK_CONTAINER (data->sync_win), tmp); gtk_box_pack_end (GTK_BOX (tmp), data->notebook, TRUE, TRUE, 0); /* create the window toolbar */ toolbar = gtk_toolbar_new (); gtk_widget_set_name (toolbar, "moblin-toolbar"); gtk_box_pack_start (GTK_BOX (tmp), toolbar, FALSE, FALSE, 0); data->back_btn = gtk_button_new_with_label (_("Back to sync")); gtk_widget_set_name (data->back_btn, "moblin-toolbar-button"); gtk_widget_set_can_focus (data->back_btn, FALSE); gtk_widget_set_no_show_all (data->back_btn, TRUE); g_signal_connect_swapped (data->back_btn, "clicked", G_CALLBACK (show_main_view), data); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), data->back_btn); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 0); item = gtk_tool_item_new (); gtk_tool_item_set_expand (item, TRUE); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, 1); data->settings_btn = gtk_toggle_button_new (); gtk_widget_set_can_focus (data->settings_btn, FALSE); gtk_widget_set_name (data->settings_btn, "moblin-settings-button"); data->settings_id = g_signal_connect (data->settings_btn, "toggled", G_CALLBACK (settings_toggled), data); gtk_container_add (GTK_CONTAINER (data->settings_btn), gtk_image_new_from_icon_name ("preferences-other", GTK_ICON_SIZE_LARGE_TOOLBAR)); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), data->settings_btn); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); close_btn = gtk_button_new (); gtk_widget_set_can_focus (close_btn, FALSE); gtk_widget_set_name (close_btn, "moblin-close-button"); g_signal_connect (close_btn, "clicked", G_CALLBACK (gtk_main_quit), NULL); gtk_container_add (GTK_CONTAINER (close_btn), gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_LARGE_TOOLBAR)); item = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (item), close_btn); gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1); gtk_widget_show_all (toolbar); /* no need for close buttons */ gtk_widget_hide (data->settings_close_btn); gtk_widget_hide (data->emergency_close_btn); } static void show_emergency_view (app_data *data) { update_emergency_view (data); set_page (data, PAGE_EMERGENCY); } static void show_services_list (app_data *data, const char *config_id_to_open) { g_free (data->config_id_to_open); data->config_id_to_open = g_strdup (config_id_to_open); set_page (data, PAGE_SETTINGS); update_services_list (data); } static void show_main_view (app_data *data) { set_page (data, PAGE_MAIN); } #else /* return the placeholders themselves when not using Moblin UX */ static GtkWidget* switch_dummy_to_mux_frame (GtkWidget *dummy) { return dummy; } static void setup_windows (app_data *data, GtkWidget *main, GtkWidget *settings, GtkWidget *emergency) { data->sync_win = main; data->services_win = settings; data->emergency_win = emergency; gtk_window_set_transient_for (GTK_WINDOW (data->services_win), GTK_WINDOW (data->sync_win)); gtk_window_set_transient_for (GTK_WINDOW (data->emergency_win), GTK_WINDOW (data->sync_win)); g_signal_connect (data->services_win, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); g_signal_connect (data->emergency_win, "delete-event", G_CALLBACK (gtk_widget_hide_on_delete), NULL); } static void show_emergency_view (app_data *data) { update_emergency_view (data); gtk_widget_hide (data->services_win); gtk_window_present (GTK_WINDOW (data->emergency_win)); } static void show_services_list (app_data *data, const char *config_id_to_open) { g_free (data->config_id_to_open); data->config_id_to_open = g_strdup (config_id_to_open); gtk_widget_hide (data->emergency_win); gtk_window_present (GTK_WINDOW (data->services_win)); update_services_list (data); } static void show_main_view (app_data *data) { gtk_widget_hide (data->services_win); gtk_widget_hide (data->emergency_win); gtk_window_present (GTK_WINDOW (data->sync_win)); } #endif /* This is a hacky way to achieve autoscrolling when the expanders open/close */ static void services_box_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, app_data *data) { if (GTK_IS_WIDGET (data->expanded_config)) { int y; GtkAdjustment *adj; GtkAllocation alloc; gtk_widget_translate_coordinates (data->expanded_config, data->services_box, 0, 0, NULL, &y); gtk_widget_get_allocation (data->expanded_config, &alloc); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (data->scrolled_window)); gtk_adjustment_clamp_page (adj, y, y + alloc.height); data->expanded_config = NULL; } } static void info_bar_response_cb (GtkInfoBar *info_bar, SyncErrorResponse response_id, app_data *data) { switch (response_id) { case SYNC_ERROR_RESPONSE_SYNC: start_sync (data); break; case SYNC_ERROR_RESPONSE_EMERGENCY_SLOW_SYNC: slow_sync (data); break; case SYNC_ERROR_RESPONSE_EMERGENCY: show_emergency_view (data); break; case SYNC_ERROR_RESPONSE_SETTINGS_OPEN: data->open_current = TRUE; show_services_list (data, NULL); break; case SYNC_ERROR_RESPONSE_SETTINGS_SELECT: show_services_list (data, NULL); break; default: g_warn_if_reached (); } } static void new_device_clicked_cb (GtkButton *btn, app_data *data) { DBusGProxy *proxy; DBusGConnection *bus; GError *error = NULL; GAppInfo *info; GAppLaunchContext *context; switch (data->bluetooth_wizard) { case SYNC_BLUETOOTH_MOBLIN: bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); if (bus) { proxy = dbus_g_proxy_new_for_name (bus, "org.moblin.UX.Shell.Toolbar", "/org/moblin/UX/Shell/Toolbar", "org.moblin.UX.Shell.Toolbar"); dbus_g_proxy_call_no_reply (proxy, "ShowPanel", G_TYPE_STRING, "bluetooth-panel", G_TYPE_INVALID, G_TYPE_INVALID); g_object_unref (proxy); } break; case SYNC_BLUETOOTH_GNOME: info = (GAppInfo*) g_desktop_app_info_new ("bluetooth-wizard.desktop"); context = (GAppLaunchContext*) gdk_display_get_app_launch_context ( gtk_widget_get_display (data->sync_win)); g_app_info_launch (info, NULL, context, &error); if (error) { g_warning ("Failed to spawn bluetooth-wizard: %s", error->message); g_error_free (error); return; } g_object_unref (info); g_object_unref (context); break; default: ; } } static void name_has_owner_cb (DBusGProxy *proxy, gboolean has_owner, GError *error, app_data *data) { if (has_owner) { gtk_widget_show (data->new_device_btn); data->bluetooth_wizard = SYNC_BLUETOOTH_MOBLIN; } g_object_unref (proxy); } static void init_bluetooth_ui (app_data *data) { char *bt_wizard; DBusGConnection *bus; DBusGProxy *proxy; data->bluetooth_wizard = SYNC_BLUETOOTH_NONE; /* look for gnome bluetooth wizard first */ bt_wizard = g_find_program_in_path ("bluetooth-wizard"); if (bt_wizard) { gtk_widget_show (data->new_device_btn); data->bluetooth_wizard = SYNC_BLUETOOTH_GNOME; g_free (bt_wizard); } else { /* try Moblin shell next (bluetooth panel integrates bt wizard) */ bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL); proxy = dbus_g_proxy_new_for_name (bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); if (proxy) { org_freedesktop_DBus_name_has_owner_async (proxy, "org.moblin.UX.Shell.Toolbar", (org_freedesktop_DBus_name_has_owner_reply)name_has_owner_cb, data); } } } static void autosync_toggle_cb (GtkWidget *widget, gpointer x, app_data *data) { if (data->current_service && data->current_service->config) { gboolean new_active, old_active; char *autosync = NULL; new_active = gtk_switch_get_active (GTK_SWITCH (widget)); syncevo_config_get_value (data->current_service->config, NULL, "autoSync", &autosync); old_active = (g_strcmp0 (autosync, "1") == 0); if (old_active != new_active) { char *new_val; operation_data *op_data; new_val = new_active ? "1": "0"; syncevo_config_set_value (data->current_service->config, NULL, "autoSync", new_val); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_SAVE; op_data->started = FALSE; syncevo_server_start_no_sync_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); } } } static void build_autosync_ui (app_data *data) { char *txt; GtkWidget *lbl; /* TRANSLATORS: label for checkbutton/toggle in main view. * Please stick to similar length strings or break the line with * "\n" if absolutely needed */ txt = _("Automatic sync"); lbl = gtk_label_new (txt); gtk_widget_show (lbl); gtk_box_pack_end (GTK_BOX (data->autosync_box), lbl, FALSE, FALSE, 0); data->autosync_toggle = gtk_switch_new (); gtk_widget_show (data->autosync_toggle); gtk_box_pack_end (GTK_BOX (data->autosync_box), data->autosync_toggle, FALSE, FALSE, 0); g_signal_connect (data->autosync_toggle, "notify::active", G_CALLBACK (autosync_toggle_cb), data); gtk_widget_show (data->autosync_toggle); } static void glade_name_workaround (GtkBuilder *builder, const char *name) { GtkWidget *w; w = GTK_WIDGET (gtk_builder_get_object (builder, name)); if (w) { gtk_widget_set_name (w, name); } } static gboolean init_ui (app_data *data) { GtkBuilder *builder; GError *error = NULL; GtkWidget /* *frame, */ * service_error_box, *btn; GtkAdjustment *adj; GtkCssProvider *provider; builder = gtk_builder_new (); gtk_builder_add_from_file (builder, GLADEDIR "ui.xml", &error); if (error) { g_printerr ("Failed to load user interface from %s: %s\n", GLADEDIR "ui.xml", error->message); g_error_free (error); g_object_unref (builder); return FALSE; } data->service_box = GTK_WIDGET (gtk_builder_get_object (builder, "service_box")); service_error_box = GTK_WIDGET (gtk_builder_get_object (builder, "service_error_box")); data->info_bar = gtk_info_bar_new (); gtk_widget_set_no_show_all (data->info_bar, TRUE); g_signal_connect (data->info_bar, "response", G_CALLBACK (info_bar_response_cb), data); gtk_box_pack_start (GTK_BOX (service_error_box), data->info_bar, TRUE, TRUE, 16); data->no_connection_box = GTK_WIDGET (gtk_builder_get_object (builder, "no_connection_box")); data->server_icon_box = GTK_WIDGET (gtk_builder_get_object (builder, "server_icon_box")); data->offline_label = GTK_WIDGET (gtk_builder_get_object (builder, "offline_label")); data->progress = GTK_WIDGET (gtk_builder_get_object (builder, "progressbar")); data->change_service_btn = GTK_WIDGET (gtk_builder_get_object (builder, "change_service_btn")); data->emergency_btn = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_btn")); data->sync_btn = GTK_WIDGET (gtk_builder_get_object (builder, "sync_btn")); data->sync_status_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_status_label")); data->spinner_image = GTK_WIDGET (gtk_builder_get_object (builder, "spinner_image")); gtk_image_set_from_file (GTK_IMAGE (data->spinner_image), THEMEDIR "sync-spinner.gif"); gtk_widget_set_no_show_all (data->spinner_image, TRUE); gtk_widget_hide (data->spinner_image); data->autosync_box = GTK_WIDGET (gtk_builder_get_object (builder, "autosync_box")); build_autosync_ui (data); data->server_label = GTK_WIDGET (gtk_builder_get_object (builder, "sync_service_label")); data->last_synced_label = GTK_WIDGET (gtk_builder_get_object (builder, "last_synced_label")); data->sources_box = GTK_WIDGET (gtk_builder_get_object (builder, "sources_box")); data->new_service_btn = GTK_WIDGET (gtk_builder_get_object (builder, "new_service_btn")); gtk_widget_set_size_request (data->new_service_btn, SYNC_UI_LIST_BTN_WIDTH, SYNC_UI_LIST_ICON_SIZE); g_signal_connect (data->new_service_btn, "clicked", G_CALLBACK (setup_new_service_clicked), data); /* service list view */ data->scrolled_window = GTK_WIDGET (gtk_builder_get_object (builder, "scrolledwindow")); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (data->scrolled_window)); data->services_box = GTK_WIDGET (gtk_builder_get_object (builder, "services_box")); gtk_container_set_focus_vadjustment (GTK_CONTAINER (data->services_box), adj); g_signal_connect(data->services_box, "size-allocate", G_CALLBACK (services_box_allocate_cb), data); data->devices_box = GTK_WIDGET (gtk_builder_get_object (builder, "devices_box")); data->settings_close_btn = GTK_WIDGET (gtk_builder_get_object (builder, "settings_close_btn")); /* emergency view */ btn = GTK_WIDGET (gtk_builder_get_object (builder, "slow_sync_btn")); g_signal_connect (btn, "clicked", G_CALLBACK (slow_sync_clicked_cb), data); data->refresh_from_server_btn_label = GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_server_btn_label")); g_signal_connect (GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_server_btn")), "clicked", G_CALLBACK (refresh_from_server_clicked_cb), data); data->refresh_from_client_btn_label = GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_client_btn_label")); g_signal_connect (GTK_WIDGET (gtk_builder_get_object (builder, "refresh_from_client_btn")), "clicked", G_CALLBACK (refresh_from_client_clicked_cb), data); data->emergency_label = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_label")); data->emergency_expander = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_expander")); data->emergency_source_table = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_source_table")); data->emergency_backup_table = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_backup_table")); data->emergency_close_btn = GTK_WIDGET (gtk_builder_get_object (builder, "emergency_close_btn")); /* No (documented) way to add own widgets to gtkbuilder it seems... swap the all dummy widgets with Muxwidgets */ setup_windows (data, GTK_WIDGET (gtk_builder_get_object (builder, "sync_win")), GTK_WIDGET (gtk_builder_get_object (builder, "services_win")), GTK_WIDGET (gtk_builder_get_object (builder, "emergency_win"))); data->main_frame = switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "main_frame"))); data->log_frame = switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "log_frame"))); /* frame = */ switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "services_list_frame"))); /* frame = */ switch_dummy_to_mux_frame (GTK_WIDGET (gtk_builder_get_object (builder, "emergency_frame"))); g_signal_connect (data->sync_win, "destroy", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (data->change_service_btn, "clicked", G_CALLBACK (change_service_clicked_cb), data); g_signal_connect (data->emergency_btn, "clicked", G_CALLBACK (emergency_clicked_cb), data); g_signal_connect (data->sync_btn, "clicked", G_CALLBACK (sync_clicked_cb), data); g_signal_connect_swapped (data->emergency_close_btn, "clicked", G_CALLBACK (show_main_view), data); g_signal_connect_swapped (data->settings_close_btn, "clicked", G_CALLBACK (show_main_view), data); g_signal_connect (data->emergency_btn, "clicked", G_CALLBACK (emergency_clicked_cb), data); data->new_device_btn = GTK_WIDGET (gtk_builder_get_object (builder, "new_device_btn")); g_signal_connect (data->new_device_btn, "clicked", G_CALLBACK (new_device_clicked_cb), data); /* workarounds for glade not working with gtkbuilder >= 2.20: * widgets do not get names. */ glade_name_workaround (builder, "meego_win"); glade_name_workaround (builder, "sync_data_and_type_box"); glade_name_workaround (builder, "log_frame"); glade_name_workaround (builder, "backup_frame"); glade_name_workaround (builder, "services_frame"); glade_name_workaround (builder, "sync_service_label"); glade_name_workaround (builder, "sync_status_label"); glade_name_workaround (builder, "no_server_label"); glade_name_workaround (builder, "sync_failure_label"); glade_name_workaround (builder, "sync_btn"); init_bluetooth_ui (data); /* custom styling */ provider = gtk_css_provider_new (); if (gtk_css_provider_load_from_path (provider, THEMEDIR "sync-ui.css", &error)) { gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref (provider); } else { g_printerr ("Failed to load styles from %s: %s\n", THEMEDIR "sync-ui.css", error->message); g_error_free (error); error = NULL; } g_object_unref (builder); return TRUE; } static void load_icon (const char *uri, GtkBox *icon_box, guint icon_size) { GError *error = NULL; GdkPixbuf *pixbuf; GtkWidget *image; const char *filename; if (uri && strlen (uri) > 0) { if (g_str_has_prefix (uri, "file://")) { filename = uri+7; } else { g_warning ("only file:// icon uri is supported: %s", uri); filename = THEMEDIR "sync-generic.png"; } } else { filename = THEMEDIR "sync-generic.png"; } pixbuf = gdk_pixbuf_new_from_file_at_scale (filename, icon_size, icon_size, TRUE, &error); if (!pixbuf) { g_warning ("Failed to load service icon: %s", error->message); g_error_free (error); return; } image = gtk_image_new_from_pixbuf (pixbuf); gtk_widget_set_size_request (image, icon_size, icon_size); g_object_unref (pixbuf); gtk_container_foreach (GTK_CONTAINER(icon_box), (GtkCallback)remove_child, icon_box); gtk_box_pack_start (icon_box, image, FALSE, FALSE, 0); gtk_widget_show (image); } static void emergency_toggle_notify_active_cb (GtkWidget *widget, gpointer p, app_data *data) { char *source; source = g_object_get_data (G_OBJECT (widget), "source"); g_return_if_fail (source); if (gtk_switch_get_active (GTK_SWITCH (widget))) { g_hash_table_insert (data->emergency_sources, g_strdup (source), ""); } else { g_hash_table_remove (data->emergency_sources, source); } update_emergency_expander (data); } static GtkWidget* add_emergency_toggle_widget (app_data *data, const char *title, gboolean active, guint row, guint col) { GtkWidget *toggle; GtkWidget *label; col = col * 2; label = gtk_label_new (title); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (data->emergency_source_table), label, col, col + 1, row, row + 1, GTK_FILL, GTK_FILL, 16, 0); toggle = gtk_switch_new (); gtk_switch_set_active (GTK_SWITCH (toggle), active); g_signal_connect (toggle, "notify::active", G_CALLBACK (emergency_toggle_notify_active_cb), data); gtk_widget_show (toggle); gtk_table_attach (GTK_TABLE (data->emergency_source_table), toggle, col + 1, col + 2, row, row + 1, GTK_FILL, GTK_FILL, 0, 0); return toggle; } static void update_emergency_expander (app_data *data) { char *text, *sources = NULL; GHashTableIter iter; char *name; g_hash_table_iter_init (&iter, data->emergency_sources); while (g_hash_table_iter_next (&iter, (gpointer)&name, NULL)) { char *pretty, *tmp; pretty = get_pretty_source_name (name); if (sources) { tmp = g_strdup_printf ("%s, %s", sources, pretty); g_free (sources); g_free (pretty); sources = tmp; } else { sources = pretty; } } if (sources) { /* This is the expander label in emergency view. It summarizes the * currently selected data sources. First placeholder is service/device * name, second a comma separeted list of sources. * E.g. "Affected data: Google Contacts, Appointments" */ text = g_strdup_printf (_("Affected data: %s %s"), data->current_service->pretty_name, sources); g_free (sources); } else { text = g_strdup_printf (_("Affected data: none")); } gtk_expander_set_label (GTK_EXPANDER (data->emergency_expander), text); g_free (text); } static void add_emergency_source (const char *name, GHashTable *source, app_data *data) { source_config *conf; GtkWidget *toggle; guint rows, cols; guint row; static guint col; gboolean active = TRUE; char *pretty_name; conf = g_hash_table_lookup (data->current_service->source_configs, name); g_object_get (data->emergency_source_table, "n-rows", &rows, "n-columns", &cols, NULL); if (cols != 1 && col == 0){ col = 1; row = rows - 1; } else { col = 0; row = rows; } active = (g_hash_table_lookup (data->emergency_sources, name) != NULL); pretty_name = get_pretty_source_name (name); toggle = add_emergency_toggle_widget (data, pretty_name, active, row, col); gtk_widget_set_sensitive (toggle, source_config_is_usable (conf)); g_object_set_data_full (G_OBJECT (toggle), "source", g_strdup (name), g_free); g_free (pretty_name); } static void update_backup_visibilities (app_data *data) { char *key; GHashTableIter iter; GList *l, *widgets; widgets = gtk_container_get_children ( GTK_CONTAINER (data->emergency_backup_table)); gtk_widget_show_all (data->emergency_backup_table); /* hide backup widgets that do not contain selected sources */ g_hash_table_iter_init (&iter, data->emergency_sources); while (g_hash_table_iter_next (&iter, (gpointer)&key, NULL)) { for (l = widgets; l; l = l->next) { if (!g_object_get_data (G_OBJECT (l->data), key)) { gtk_widget_hide (GTK_WIDGET (l->data)); } } } g_list_free (widgets); } static void restore_clicked_cb (GtkButton *btn, app_data *data) { const char *dir, *time_str; operation_data *op_data; char *message; dir = g_object_get_data (G_OBJECT (btn), "dir"); time_str = g_object_get_data (G_OBJECT (btn), "time"); g_return_if_fail (dir && time_str); /* TRANSLATORS: confirmation for restoring a backup. placeholder is the * backup time string defined below */ message = g_strdup_printf (_("Do you want to restore the backup from %s? " "All changes you have made since then will be lost."), time_str); if (!show_confirmation (data->sync_win, message, _("Yes, restore"), _("No"))) { g_free (message); return; } g_free (message); op_data = g_slice_new (operation_data); op_data->data = data; op_data->operation = OP_RESTORE; op_data->dir = dir; op_data->started = FALSE; syncevo_server_start_session (data->server, data->current_service->name, (SyncevoServerStartSessionCb)start_session_cb, op_data); show_main_view (data); } static void add_backup (app_data *data, const char *peername, const char *dir, long endtime, GList *sources) { GtkWidget *timelabel, *label, *blabel, *button, *box;; guint rows; char *text; char time_str[60]; struct tm *tim; tim = localtime (&endtime); /* TRANSLATORS: date/time for strftime(), used in emergency view backup * label. Any time format that shows date and time is good. */ strftime (time_str, sizeof (time_str), _("%x %X"), tim); g_object_get (data->emergency_backup_table, "n-rows", &rows, NULL); box = gtk_vbox_new (TRUE, 6); gtk_table_attach (GTK_TABLE (data->emergency_backup_table), box, 0, 1, rows, rows + 1, GTK_EXPAND|GTK_FILL, GTK_FILL, 16, 0); timelabel = gtk_label_new (time_str); gtk_misc_set_alignment (GTK_MISC (timelabel), 0.0, 0.5); gtk_label_set_line_wrap (GTK_LABEL (timelabel), TRUE); gtk_widget_set_size_request (timelabel, 600, -1); gtk_box_pack_start (GTK_BOX (box), timelabel, TRUE, TRUE, 0); /* TRANSLATORS: label for a backup in emergency view. Placeholder is * service or device name */ text = g_strdup_printf (_("Backed up before syncing with %s"), peername); label = gtk_label_new (text); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_set_size_request (label, 600, -1); gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0); g_free (text); button = gtk_button_new (); gtk_table_attach (GTK_TABLE (data->emergency_backup_table), button, 1, 2, rows, rows + 1, GTK_FILL, GTK_SHRINK, 32, 0); g_object_set_data_full (G_OBJECT (button), "dir", g_strdup(dir), g_free); g_object_set_data_full (G_OBJECT (button), "time", g_strdup(time_str), g_free); g_signal_connect (button, "clicked", G_CALLBACK (restore_clicked_cb), data); blabel = gtk_label_new (_("Restore")); gtk_misc_set_padding (GTK_MISC (blabel), 32, 0); gtk_container_add (GTK_CONTAINER (button), blabel); for (; sources; sources = sources->next) { g_object_set_data (G_OBJECT (box), (char *)sources->data, ""); g_object_set_data (G_OBJECT (button), (char *)sources->data, ""); } } static void get_reports_for_backups_cb (SyncevoServer *server, SyncevoReports *reports, GError *error, app_data *data) { guint len, i; if (error) { g_warning ("Error in Session.GetReports: %s", error->message); g_error_free (error); /* non-fatal, unknown error */ return; } len = syncevo_reports_get_length (reports); for (i = 0; i < len; i++) { GHashTable *report = syncevo_reports_index (reports, i); GHashTableIter iter; char *key, *val; /* long status = -1; */ long endtime = -1; char *peername = NULL; char *dir = NULL; GList *backup_sources = NULL; g_hash_table_iter_init (&iter, report); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&val)) { char **strs; strs = g_strsplit (key, "-", 6); if (!strs) { continue; } if (g_strcmp0 (strs[0], "source") == 0 && g_strcmp0 (strs[2], "backup") == 0 && g_strcmp0 (strs[3], "before") == 0) { backup_sources = g_list_prepend (backup_sources, g_strdup (strs[1])); } else if (g_strcmp0 (strs[0], "end") == 0) { endtime = strtol (val, NULL, 10); } else if (g_strcmp0 (strs[0], "status") == 0) { /* status = strtol (val, NULL, 10); */ } else if (g_strcmp0 (strs[0], "peer") == 0) { peername = val; } else if (g_strcmp0 (strs[0], "dir") == 0) { dir = val; } g_strfreev (strs); } if (peername && dir && endtime > 0) { add_backup (data, peername, dir, endtime, backup_sources); } g_list_foreach (backup_sources, (GFunc)g_free, NULL); g_list_free (backup_sources); } data->backup_count += len; if (len == REPORTS_PER_CALL) { syncevo_server_get_reports (data->server, "", data->backup_count, REPORTS_PER_CALL, (SyncevoServerGetReportsCb)get_reports_for_backups_cb, data); } update_backup_visibilities (data); } static const char* get_syncevo_context (const char *config_name) { char *context; context = g_strrstr (config_name, "@"); if (!context) { context = ""; } return context; } static void update_emergency_view (app_data *data) { char *text; if (!data->current_service) { g_warning ("no service defined in Emergency view"); return; } if (data->forced_emergency) { text = g_strdup_printf ( /* TRANSLATORS: this is an explanation in Emergency view. * Placeholder is a service/device name */ _("A normal sync with %s is not possible at this time. " "You can do a slow two-way sync or start from scratch. You " "can also restore a backup, but a slow sync or starting from " "scratch will still be required before normal sync is " "possible."), data->current_service->pretty_name); } else { /* TRANSLATORS: this is an explanation in Emergency view. * Placeholder is a service/device name */ text = g_strdup_printf ( _("If something has gone horribly wrong, you can try a " "slow sync, start from scratch or restore from backup.")); } gtk_label_set_text (GTK_LABEL (data->emergency_label), text); g_free (text); /* TRANSLATORS: These are a buttons in Emergency view. Placeholder is a * service/device name. Please don't use too long lines, but feel free to * use several lines. */ text = g_strdup_printf (_("Delete all your local\n" "data and replace with\n" "data from %s"), data->current_service->pretty_name); gtk_label_set_text (GTK_LABEL (data->refresh_from_server_btn_label), text); g_free (text); text = g_strdup_printf (_("Delete all data on\n" "%s and replace\n" "with your local data"), data->current_service->pretty_name); gtk_label_set_text (GTK_LABEL (data->refresh_from_client_btn_label), text); g_free (text); gtk_container_foreach (GTK_CONTAINER (data->emergency_source_table), (GtkCallback)remove_child, data->emergency_source_table); gtk_table_resize (GTK_TABLE (data->emergency_source_table), 1, 1); /* using this instead of current_service->source_configs * to get the same order as the configuration has... */ syncevo_config_foreach_source (data->current_service->config, (ConfigFunc)add_emergency_source, data); update_emergency_expander (data); data->backup_count = 0; gtk_container_foreach (GTK_CONTAINER (data->emergency_backup_table), (GtkCallback)remove_child, data->emergency_backup_table); gtk_table_resize (GTK_TABLE (data->emergency_backup_table), 1, 1); syncevo_server_get_reports (data->server, get_syncevo_context (data->current_service->name), 0, REPORTS_PER_CALL, (SyncevoServerGetReportsCb)get_reports_for_backups_cb, data); } static void update_service_source_ui (const char *name, source_config *conf, app_data *data) { GtkWidget *lbl, *box; char *pretty_name, *title; if (!source_config_is_usable (conf)) { return; } conf->box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (data->sources_box), conf->box, FALSE, FALSE, 8); pretty_name = get_pretty_source_name_markup (name); title = g_strdup_printf ("%s", pretty_name); lbl = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (lbl), title); g_free (pretty_name); g_free (title); gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (conf->box), lbl, TRUE, TRUE, 0); box = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (conf->box), box, FALSE, FALSE, 0); conf->info_bar = gtk_info_bar_new (); gtk_box_pack_start (GTK_BOX (box), conf->info_bar, TRUE, TRUE, 16); gtk_widget_set_no_show_all (conf->info_bar, TRUE); g_signal_connect (conf->info_bar, "response", G_CALLBACK (info_bar_response_cb), data); conf->label = gtk_label_new (NULL); gtk_misc_set_alignment (GTK_MISC (conf->label), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (conf->box), conf->label, TRUE, TRUE, 0); source_config_update_widget (conf); gtk_widget_show_all (conf->box); } static void check_source_cb (SyncevoSession *session, GError *error, source_config *source) { if (error) { if(error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE)) { /* source is not supported locally */ if (source) { source->supported_locally = FALSE; if (source->box) { /* widget is already on screen, hide it */ gtk_widget_hide (source->box); } } } else { g_warning ("CheckSource failed: %s", error->message); /* non-fatal, unknown error */ } g_error_free (error); return; } } static void update_service_ui (app_data *data) { char *icon_uri = NULL; char *autosync = NULL; gtk_container_foreach (GTK_CONTAINER (data->sources_box), (GtkCallback)remove_child, data->sources_box); if (data->current_service && data->current_service->config) { syncevo_config_get_value (data->current_service->config, NULL, "IconURI", &icon_uri); syncevo_config_get_value (data->current_service->config, NULL, "autoSync", &autosync); g_hash_table_foreach (data->current_service->source_configs, (GHFunc)update_service_source_ui, data); } load_icon (icon_uri, GTK_BOX (data->server_icon_box), SYNC_UI_ICON_SIZE); gtk_switch_set_active (GTK_SWITCH (data->autosync_toggle), g_strcmp0 (autosync, "1") == 0); refresh_last_synced_label (data); gtk_widget_show_all (data->sources_box); } static void unexpand_config_widget (GtkWidget *w, GtkWidget *exception) { if (SYNC_IS_CONFIG_WIDGET (w) && exception && exception != w) { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (w), FALSE); } } static void config_widget_expanded_cb (GtkWidget *widget, GParamSpec *pspec, app_data *data) { if (sync_config_widget_get_expanded (SYNC_CONFIG_WIDGET (widget))) { data->expanded_config = widget; gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)unexpand_config_widget, widget); } } static void config_widget_changed_cb (GtkWidget *widget, app_data *data) { if (sync_config_widget_get_current (SYNC_CONFIG_WIDGET (widget))) { const char *name = NULL; name = sync_config_widget_get_name (SYNC_CONFIG_WIDGET (widget)); reload_config (data, name); show_main_view (data); } else { reload_config (data, NULL); update_services_list (data); } } static SyncConfigWidget* add_configuration_to_box (GtkBox *box, SyncevoConfig *config, const char *name, gboolean has_template, gboolean has_configuration, app_data *data) { GtkWidget *item = NULL; gboolean current = FALSE; const char *current_name = NULL; if (data->current_service) { current_name = data->current_service->pretty_name; if (data->current_service->name && name && g_ascii_strcasecmp (name, data->current_service->name) == 0) { current = TRUE; } } item = sync_config_widget_new (data->server, name, config, current, current_name, has_configuration, has_template); g_signal_connect (item, "changed", G_CALLBACK (config_widget_changed_cb), data); g_signal_connect (item, "notify::expanded", G_CALLBACK (config_widget_expanded_cb), data); gtk_widget_show (item); gtk_box_pack_start (box, item, FALSE, FALSE, 0); if (current) { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (item), data->open_current); } if (g_strcmp0 (name, "default") == 0) { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (item), TRUE); } if (data->config_id_to_open) { sync_config_widget_expand_id (SYNC_CONFIG_WIDGET (item), data->config_id_to_open); } return SYNC_CONFIG_WIDGET (item); } static void find_new_service_config (SyncConfigWidget *w, GtkWidget **found) { if (SYNC_IS_CONFIG_WIDGET (w)) { if (!sync_config_widget_get_configured (w) && !sync_config_widget_get_has_template (w)) { *found = GTK_WIDGET (w); } } } typedef struct config_data { app_data *data; char *name; gboolean has_configuration; gboolean has_template; GHashTable *device_templates; } config_data; #define LEGAL_CONFIG_NAME_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ1234567890-_" static void get_config_for_config_widget_cb (SyncevoServer *server, SyncevoConfig *config, GError *error, config_data *c_data) { char *ready, *is_peer, *url, *type; c_data->data->service_list_updates_left--; if (error) { /* show in UI? */ g_warning ("Server.GetConfig() failed: %s", error->message); g_error_free (error); return; } syncevo_config_get_value (config, NULL, "ConsumerReady", &ready); syncevo_config_get_value (config, NULL, "PeerIsClient", &is_peer); syncevo_config_get_value (config, NULL, "syncURL", &url); syncevo_config_get_value (config, NULL, "peerType", &type); if (g_strcmp0 ("1", ready) != 0 || (type && g_strcmp0 ("WebDAV", type) == 0) || (url && g_str_has_prefix (url, "local://@"))) { /* Ignore existing configs and templates unless they are explicitly marked as "ConsumerReady. Also ignore webdav (and the local syncs used for webdav) for now */ } else if (is_peer && g_strcmp0 ("1", is_peer) == 0) { if (url) { SyncConfigWidget *w; char *fp, *tmp, *template_name, *device_name = NULL; char **fpv = NULL; syncevo_config_get_value (config, NULL, "deviceName", &tmp); if (!tmp) { device_name = g_strdup (c_data->name); } else { device_name = g_strcanon (g_strdup (tmp), LEGAL_CONFIG_NAME_CHARS, '-'); } syncevo_config_get_value (config, NULL, "templateName", &template_name); if (!template_name) { syncevo_config_get_value (config, NULL, "fingerPrint", &fp); if (fp) { fpv = g_strsplit_set (fp, ",;", 2); if (g_strv_length (fpv) > 0) { template_name = fpv[0]; } } } /* keep a list of added devices */ w = g_hash_table_lookup (c_data->device_templates, url); if (!w) { w = add_configuration_to_box (GTK_BOX (c_data->data->devices_box), config, device_name, c_data->has_template, c_data->has_configuration, c_data->data); g_hash_table_insert (c_data->device_templates, url, w); sync_config_widget_add_alternative_config (w, template_name, config, c_data->has_configuration); } else { /* TODO: might want to add a new widget, if user has created more * configs for same device: this really requires us to look at * all configs / templates, then decide what to sho w*/ /* there is a widget for this device already, add this info there*/ sync_config_widget_add_alternative_config (w, template_name, config, c_data->has_configuration); } g_free (device_name); g_strfreev (fpv); } } else { add_configuration_to_box (GTK_BOX (c_data->data->services_box), config, c_data->name, c_data->has_template, c_data->has_configuration, c_data->data); } g_free (c_data->name); g_hash_table_unref (c_data->device_templates); g_slice_free (config_data, c_data); } static void get_config_for_config_widget (app_data *data, const char *config, gboolean has_template, gboolean has_configuration, GHashTable *device_templates) { config_data *c_data; data->service_list_updates_left++; c_data = g_slice_new0 (config_data); c_data->data = data; c_data->name = g_strdup (config); c_data->has_template = has_template; c_data->has_configuration = has_configuration; if (device_templates) { c_data->device_templates = g_hash_table_ref (device_templates); } syncevo_server_get_config (data->server, config, !has_configuration, (SyncevoServerGetConfigCb)get_config_for_config_widget_cb, c_data); } static void setup_new_service_clicked (GtkButton *btn, app_data *data) { GtkWidget *widget = NULL; gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)unexpand_config_widget, NULL); /* if a new service config has already been added, use that. * Otherwise add one. */ gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)find_new_service_config, &widget); if (!widget) { get_config_for_config_widget (data, "default", TRUE, FALSE, NULL); } else { sync_config_widget_set_expanded (SYNC_CONFIG_WIDGET (widget), TRUE); } } typedef struct templates_data { app_data *data; char **templates; } templates_data; static void get_configs_cb (SyncevoServer *server, char **configs, GError *error, templates_data *templ_data) { char **config_iter, **template_iter, **templates; app_data *data; GHashTable *device_templates; templ_data->data->service_list_updates_left = 0; templates = templ_data->templates; data = templ_data->data; g_slice_free (templates_data, templ_data); if (error) { show_main_view (data); g_warning ("Server.GetConfigs() failed: %s", error->message); g_strfreev (templates); g_error_free (error); return; } device_templates = g_hash_table_new (g_str_hash, g_str_equal); for (template_iter = templates; *template_iter; template_iter++){ gboolean found_config = FALSE; for (config_iter = configs; *config_iter; config_iter++) { if (*template_iter && *config_iter && g_ascii_strncasecmp (*template_iter, *config_iter, strlen (*config_iter)) == 0) { /* have template and config */ get_config_for_config_widget (data, *config_iter, TRUE, TRUE, device_templates); found_config = TRUE; break; } } if (!found_config) { /* have template, no config */ get_config_for_config_widget (data, *template_iter, TRUE, FALSE, device_templates); } } for (config_iter = configs; *config_iter; config_iter++) { gboolean found_template = FALSE; for (template_iter = templates; *template_iter; template_iter++) { if (*template_iter && *config_iter && g_ascii_strncasecmp (*template_iter, *config_iter, strlen (*config_iter)) == 0) { found_template = TRUE; break; } } if (!found_template) { /* have config, no template */ get_config_for_config_widget (data, *config_iter, FALSE, TRUE, device_templates); } } /* config initialization might ref/unref as well... */ g_hash_table_unref (device_templates); g_strfreev (configs); g_strfreev (templates); } static void get_template_configs_cb (SyncevoServer *server, char **templates, GError *error, app_data *data) { templates_data *templ_data; if (error) { data->service_list_updates_left = 0; show_main_view (data); show_error_dialog (data->sync_win, _("Failed to get list of supported services from SyncEvolution")); g_warning ("Server.GetConfigs() failed: %s", error->message); g_error_free (error); return; } templ_data = g_slice_new (templates_data); templ_data->data = data; templ_data->templates = templates; syncevo_server_get_configs (data->server, FALSE, (SyncevoServerGetConfigsCb)get_configs_cb, templ_data); } static void update_services_list (app_data *data) { if (data->service_list_updates_left > 0) { return; } gtk_container_foreach (GTK_CONTAINER (data->services_box), (GtkCallback)remove_child, data->services_box); gtk_container_foreach (GTK_CONTAINER (data->devices_box), (GtkCallback)remove_child, data->devices_box); /* set temp number before we know the real one */ data->service_list_updates_left = 1; syncevo_server_get_configs (data->server, TRUE, (SyncevoServerGetConfigsCb)get_template_configs_cb, data); } static void get_config_for_main_win_cb (SyncevoServer *server, SyncevoConfig *config, GError *error, app_data *data) { if (error) { if (error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)) { /* another syncevolution client probably removed the config */ reload_config (data, NULL); } else { g_warning ("Error in Server.GetConfig: %s", error->message); /* TRANSLATORS: message in main view */ set_info_bar (data->info_bar, GTK_MESSAGE_ERROR, SYNC_ERROR_RESPONSE_NONE, _("There was a problem communicating with the " "sync process. Please try again later.")); set_app_state (data, SYNC_UI_STATE_SERVER_FAILURE); } g_error_free (error); return; } if (config) { GHashTableIter iter; char *name; source_config *source; server_config_init (data->current_service, config); set_app_state (data, SYNC_UI_STATE_SERVER_OK); /* get "locally supported" status for all sources */ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&source)) { syncevo_server_check_source (data->server, data->current_service->name, name, (SyncevoServerGenericCb)check_source_cb, source); } syncevo_server_get_presence (server, data->current_service->name, (SyncevoServerGetPresenceCb)get_presence_cb, data); syncevo_server_get_reports (server, data->current_service->name, 0, 1, (SyncevoServerGetReportsCb)get_reports_cb, data); update_service_ui (data); } } static void set_running_session_status (app_data *data, SyncevoSessionStatus status, int error_code) { if (status & SYNCEVO_STATUS_QUEUEING) { g_warning ("Running session is queued, this shouldn't happen..."); } else if (status & SYNCEVO_STATUS_IDLE) { set_app_state (data, SYNC_UI_STATE_SERVER_OK); } else if (status & SYNCEVO_STATUS_DONE) { char *err; err = get_error_string_for_code (error_code, NULL); if (err) { if (data->current_operation == OP_RESTORE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Restore failed")); } else { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync failed")); } g_free (err); } else { if (data->current_operation == OP_RESTORE) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Restore complete")); } else { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync complete")); } } set_app_state (data, SYNC_UI_STATE_SERVER_OK); set_sync_progress (data, 1.0, ""); } else if (status & SYNCEVO_STATUS_RUNNING || status & SYNCEVO_STATUS_SUSPENDING || status & SYNCEVO_STATUS_ABORTING) { set_app_state (data, SYNC_UI_STATE_SYNCING); } if (status & SYNCEVO_STATUS_WAITING) { gtk_widget_show (data->spinner_image); } else { gtk_widget_hide (data->spinner_image); } } static void running_session_status_changed_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, app_data *data) { set_running_session_status (data, status, error_code); } static void get_running_session_status_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, app_data *data) { if (error) { g_warning ("Error in Session.GetStatus: %s", error->message); g_error_free (error); /* non-fatal, unknown error */ return; } set_running_session_status (data, status, error_code); } typedef struct source_progress_data { app_data *data; SyncevoSourcePhase phase; const char *source; } source_progress_data; static void find_updated_source_progress (const char *name, SyncevoSourcePhase phase, source_progress_data *prog_data) { GHashTable *configs = prog_data->data->current_service ? prog_data->data->current_service->source_configs : NULL; source_config *config; config = configs ? g_hash_table_lookup (configs, name) : NULL; if (config) { if (phase != config->phase) { config->phase = phase; prog_data->phase = config->phase; prog_data->source = name; } } } static void running_session_progress_changed_cb (SyncevoSession *session, int progress, SyncevoSourceProgresses *source_progresses, app_data *data) { source_progress_data *prog_data = g_slice_new0 (source_progress_data); prog_data->data = data; prog_data->phase = SYNCEVO_PHASE_NONE; prog_data->source = NULL; syncevo_source_progresses_foreach (source_progresses, (SourceProgressFunc)find_updated_source_progress, prog_data); if (!prog_data->source) { set_sync_progress (data, ((float)progress) / 100, NULL); } else { char *name; char *msg = NULL; name = get_pretty_source_name (prog_data->source); switch (prog_data->phase) { case SYNCEVO_PHASE_PREPARING: msg = g_strdup_printf (_("Preparing '%s'"), name); break; case SYNCEVO_PHASE_RECEIVING: msg = g_strdup_printf (_("Receiving '%s'"), name); break; case SYNCEVO_PHASE_SENDING: msg = g_strdup_printf (_("Sending '%s'"), name); break; default: ; } if (msg) { set_sync_progress (data, ((float)progress) / 100, msg); } g_free (msg); g_free (name); } g_slice_free (source_progress_data, prog_data); } typedef struct source_stats { long status; long mode; long local_changes; long remote_changes; long local_rejections; long remote_rejections; } source_stats; static void free_source_stats (source_stats *stats) { g_slice_free (source_stats, stats); } static gboolean handle_source_report_item (char **strs, const char *value, GHashTable *sources) { source_stats *stats; char **tmp; char *name; if (g_strv_length (strs) < 3) { return FALSE; } /* replace '__' with '_' and '_+' with '-' */ tmp = g_strsplit (strs[1], "__", 0); name = g_strjoinv ("_", tmp); g_strfreev (tmp); tmp = g_strsplit (name, "_+", 0); g_free (name); name = g_strjoinv ("-", tmp); g_strfreev (tmp); stats = g_hash_table_lookup (sources, name); if (!stats) { stats = g_slice_new0 (source_stats); g_hash_table_insert (sources, g_strdup (name), stats); } g_free (name); if (strcmp (strs[2], "stat") == 0) { if (g_strv_length (strs) != 6) { return FALSE; } if (strcmp (strs[3], "remote") == 0) { if (strcmp (strs[4], "added") == 0 || strcmp (strs[4], "updated") == 0 || strcmp (strs[4], "removed") == 0) { stats->remote_changes += strtol (value, NULL, 10); } else if (strcmp (strs[5], "reject") == 0) { stats->remote_rejections += strtol (value, NULL, 10); } } else if (strcmp (strs[3], "local") == 0) { if (strcmp (strs[4], "added") == 0 || strcmp (strs[4], "updated") == 0 || strcmp (strs[4], "removed") == 0) { stats->local_changes += strtol (value, NULL, 10); } else if (strcmp (strs[5], "reject") == 0) { stats->local_rejections += strtol (value, NULL, 10); } } else { return FALSE; } } else if (strcmp (strs[2], "mode") == 0) { stats->mode = strtol (value, NULL, 10); } else if (strcmp (strs[2], "status") == 0) { stats->status = strtol (value, NULL, 10); } else if (strcmp (strs[2], "resume") == 0) { } else if (strcmp (strs[2], "first") == 0) { } else if (strcmp (strs[2], "backup") == 0) { if (g_strv_length (strs) != 4) { return FALSE; } if (strcmp (strs[3], "before") == 0) { } else if (strcmp (strs[3], "after") == 0) { } else { return FALSE; } } else { return FALSE; } return TRUE; } static char* get_report_summary (source_config *source) { char *rejects = NULL; char *changes = NULL; char *msg = NULL; if (!source->stats_set) { return g_strdup (""); } if (source->local_rejections + source->remote_rejections == 0) { rejects = NULL; } else if (source->local_rejections == 0) { rejects = g_strdup_printf (ngettext ("There was one remote rejection.", "There were %ld remote rejections.", source->remote_rejections), source->remote_rejections); } else if (source->remote_rejections == 0) { rejects = g_strdup_printf (ngettext ("There was one local rejection.", "There were %ld local rejections.", source->local_rejections), source->local_rejections); } else { rejects = g_strdup_printf (_ ("There were %ld local rejections and %ld remote rejections."), source->local_rejections, source->remote_rejections); } if (source->local_changes + source->remote_changes == 0) { changes = g_strdup_printf (_("Last time: No changes.")); } else if (source->local_changes == 0) { changes = g_strdup_printf (ngettext ("Last time: Sent one change.", "Last time: Sent %ld changes.", source->remote_changes), source->remote_changes); } else if (source->remote_changes == 0) { // This is about changes made to the local data. Not all of these // changes were requested by the remote server, so "applied" // is a better word than "received" (bug #5185). changes = g_strdup_printf (ngettext ("Last time: Applied one change.", "Last time: Applied %ld changes.", source->local_changes), source->local_changes); } else { changes = g_strdup_printf (_("Last time: Applied %ld changes and sent %ld changes."), source->local_changes, source->remote_changes); } if (rejects) msg = g_strdup_printf ("%s\n%s", changes, rejects); else msg = g_strdup (changes); g_free (rejects); g_free (changes); return msg; } /* return TRUE if no errors are shown */ static gboolean source_config_update_widget (source_config *source) { char *msg; gboolean show_error; SyncErrorResponse response; if (!source->label) { return TRUE; } msg = get_error_string_for_code (source->status, &response); if (msg) { show_error = TRUE; set_info_bar (source->info_bar, GTK_MESSAGE_ERROR, response, msg); } else { show_error = FALSE; gtk_widget_hide (source->info_bar); msg = get_report_summary (source); gtk_label_set_text (GTK_LABEL (source->label), msg); } g_free (msg); return !show_error; } static void get_reports_cb (SyncevoServer *server, SyncevoReports *reports, GError *error, app_data *data) { long status = -1; long common_status = -1; source_stats *stats; GHashTable *sources; /* key is source name, value is a source_stats */ GHashTableIter iter; const char *key, *val; source_config *source_conf; char *error_msg; SyncErrorResponse response; gboolean have_source_errors; GHashTable *report = NULL; guint len; if (error) { g_warning ("Error in Session.GetReports: %s", error->message); g_error_free (error); /* non-fatal, unknown error */ return; } sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)free_source_stats); len = syncevo_reports_get_length (reports); if (len > 0) { report = syncevo_reports_index (reports, 0); val = g_hash_table_lookup (report, "dir"); if (!val || strlen (val) == 0) { /* dummy report for first time sync info*/ if (len > 1) { report = syncevo_reports_index (reports, 1); } else { report = NULL; } } } if (report) { g_hash_table_iter_init (&iter, report); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&val)) { char **strs; strs = g_strsplit (key, "-", 6); if (!strs) { continue; } if (strcmp (strs[0], "source") == 0) { if (!handle_source_report_item (strs, val, sources)) { g_warning ("Unidentified sync report item: %s=%s", key, val); } } else if (strcmp (strs[0], "start") == 0) { /* not used */ } else if (strcmp (strs[0], "end") == 0) { data->last_sync = strtol (val, NULL, 10); } else if (strcmp (strs[0], "status") == 0) { status = strtol (val, NULL, 10); } else if (strcmp (strs[0], "peer") == 0) { /* not used */ } else if (strcmp (strs[0], "error") == 0) { /* not used */ } else if (strcmp (strs[0], "dir") == 0) { /* not used */ } else { g_warning ("Unidentified sync report item: %s=%s", key, val); } g_strfreev (strs); } } else { common_status = 0; } /* sources now has all statistics we want */ /* ficure out if all sources have same status or if there's a slow sync */ data->forced_emergency = FALSE; g_hash_table_remove_all (data->emergency_sources); g_hash_table_iter_init (&iter, sources); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&stats)) { if (stats->status == 22001) { /* ignore abort because of another source slow syncing */ } else if (stats->status == 22000) { common_status = stats->status; data->forced_emergency = TRUE; g_hash_table_insert (data->emergency_sources, g_strdup (key), ""); } else if (common_status == -1) { common_status = stats->status; } else if (common_status != stats->status) { common_status = 0; } } if (status != 200) { /* don't want to show a sync time for failed syncs */ data->last_sync = -1; } if (!data->forced_emergency) { /* if user initiates a emergency sync wihtout forced_emergency, enable all sources by default*/ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&source_conf)) { if (source_config_is_usable (source_conf)) { g_hash_table_insert (data->emergency_sources, g_strdup (key), ""); } } } /* get common error message */ error_msg = get_error_string_for_code (common_status, &response); have_source_errors = FALSE; g_hash_table_iter_init (&iter, sources); while (g_hash_table_iter_next (&iter, (gpointer)&key, (gpointer)&stats)) { /* store the statistics in source config */ source_conf = g_hash_table_lookup (data->current_service->source_configs, key); if (source_conf) { source_conf->stats_set = TRUE; source_conf->local_changes = stats->local_changes; source_conf->remote_changes = stats->remote_changes; source_conf->local_rejections = stats->local_rejections; source_conf->remote_rejections = stats->remote_rejections; if (error_msg) { /* there is a service-wide error, no need to show here */ source_conf->status = 0; } else { source_conf->status = stats->status; } /* if ui has been constructed already, update it */ if (!source_config_update_widget (source_conf)) { have_source_errors = TRUE; } } } if (!error_msg && !have_source_errors) { /* no common source errors or individual source errors: it's still possible that there are sync errors */ error_msg = get_error_string_for_code (status, &response); } /* update service UI */ refresh_last_synced_label (data); if (error_msg) { GtkMessageType type = GTK_MESSAGE_ERROR; if (response == SYNC_ERROR_RESPONSE_EMERGENCY) { type = GTK_MESSAGE_QUESTION; } if (!data->synced_this_session) { /* TRANSLATORS: the placeholder is a error message (hopefully) * explaining the problem */ char *msg = g_strdup_printf (_("There was a problem with last sync:\n%s"), error_msg); g_free (error_msg); error_msg = msg; } set_info_bar (data->info_bar, type, response, error_msg); g_free (error_msg); } else if (data->current_operation == OP_RESTORE) { /* special case for just after restoring */ error_msg = g_strdup_printf (_("You've just restored a backup. The changes have not been " "synced with %s yet"), data->current_service->pretty_name); set_info_bar (data->info_bar, GTK_MESSAGE_INFO, SYNC_ERROR_RESPONSE_SYNC, error_msg); } g_hash_table_destroy (sources); } static void set_config_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { g_warning ("Error in Session.SetConfig: %s", error->message); g_error_free (error); /* TODO show in UI: save failed */ } g_object_unref (session); } static void restore_cb (SyncevoSession *session, GError *error, app_data *data) { if (error) { g_warning ("Error in Session.Restore: %s", error->message); g_error_free (error); return; } } static void restore_backup (app_data *data, SyncevoSession *session, const char *dir) { char **sources; GHashTableIter iter; int i = 0; char *source; sources = g_malloc0 (sizeof (char*) * (g_hash_table_size (data->emergency_sources) + 1)); g_hash_table_iter_init (&iter, data->emergency_sources); while (g_hash_table_iter_next (&iter, (gpointer)&source, NULL)) { sources[i++] = g_strdup (source); } sources[i] = NULL; syncevo_session_restore (session, dir, TRUE, (const char**)sources, (SyncevoSessionGenericCb)restore_cb, data); g_strfreev (sources); } static void save_config (app_data *data, SyncevoSession *session) { syncevo_session_set_config (session, TRUE, FALSE, data->current_service->config, (SyncevoSessionGenericCb)set_config_cb, data); } static void do_sync (operation_data *op_data, SyncevoSession *session) { GHashTable *source_modes; GHashTableIter iter; source_config *source; SyncevoSyncMode mode = SYNCEVO_SYNC_NONE; app_data *data = op_data->data; source_modes = syncevo_source_modes_new (); if (op_data->operation != OP_SYNC) { /* in an emergency sync, set non-emergency sources to not sync*/ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, NULL, (gpointer)&source)) { if (g_hash_table_lookup (data->emergency_sources, source->name) == NULL) { syncevo_source_modes_add (source_modes, source->name, SYNCEVO_SYNC_NONE); } } } /* override all non-supported with "none". */ g_hash_table_iter_init (&iter, data->current_service->source_configs); while (g_hash_table_iter_next (&iter, NULL, (gpointer)&source)) { if (!source->supported_locally) { syncevo_source_modes_add (source_modes, source->name, SYNCEVO_SYNC_NONE); } } /* use given mode or use default for normal syncs */ switch (op_data->operation) { case OP_SYNC: mode = SYNCEVO_SYNC_DEFAULT; break; case OP_SYNC_SLOW: mode = SYNCEVO_SYNC_SLOW; break; case OP_SYNC_REFRESH_FROM_CLIENT: mode = SYNCEVO_SYNC_REFRESH_FROM_CLIENT; break; case OP_SYNC_REFRESH_FROM_SERVER: mode = SYNCEVO_SYNC_REFRESH_FROM_SERVER; break; default: g_warn_if_reached(); } syncevo_session_sync (session, mode, source_modes, (SyncevoSessionGenericCb)sync_cb, data); syncevo_source_modes_free (source_modes); } static void set_config_for_sync_cb (SyncevoSession *session, GError *error, operation_data *op_data) { if (error) { g_warning ("Error in Session.SetConfig: %s", error->message); g_error_free (error); /* TODO show in UI: sync failed (failed to even start) */ return; } do_sync (op_data, session); } static void run_operation (operation_data *op_data, SyncevoSession *session) { SyncevoConfig *config; /* when we first get idle, start the operation */ if (op_data->started) { return; } op_data->started = TRUE; op_data->data->current_operation = op_data->operation; /* time for business */ switch (op_data->operation) { case OP_SYNC: case OP_SYNC_SLOW: case OP_SYNC_REFRESH_FROM_CLIENT: case OP_SYNC_REFRESH_FROM_SERVER: /* Make sure we don't get change diffs printed out, then sync */ config = g_hash_table_new (g_str_hash, g_str_equal); syncevo_config_set_value (config, NULL, "printChanges", "0"); syncevo_session_set_config (session, TRUE, TRUE, config, (SyncevoSessionGenericCb)set_config_for_sync_cb, op_data); syncevo_config_free (config); break; case OP_SAVE: save_config (op_data->data, session); break; case OP_RESTORE: restore_backup (op_data->data, session, op_data->dir); break; default: g_warn_if_reached (); } } /* Our sync session status */ static void status_changed_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, operation_data *op_data) { switch (status) { case SYNCEVO_STATUS_IDLE: run_operation (op_data, session); break; case SYNCEVO_STATUS_DONE: op_data->data->synced_this_session = TRUE; /* no need for sync session anymore */ g_object_unref (session); /* refresh stats -- the service may no longer be the one syncing, * and we might have only saved config but what the heck... */ syncevo_server_get_reports (op_data->data->server, op_data->data->current_service->name, 0, 1, (SyncevoServerGetReportsCb)get_reports_cb, op_data->data); g_slice_free (operation_data, op_data); default: ; } } /* Our sync (or config-save) session status */ static void get_status_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, operation_data *op_data) { if (error) { g_warning ("Error in Session.GetStatus: %s", error->message); g_error_free (error); g_object_unref (session); switch (op_data->operation) { case OP_SYNC: /* TODO show in UI: sync failed (failed to even start) */ break; case OP_SAVE: /* TODO show in UI: save failed */ break; default: g_warn_if_reached (); } g_slice_free (operation_data, op_data); return; } if (status == SYNCEVO_STATUS_IDLE) { run_operation (op_data, session); } } static void start_session_cb (SyncevoServer *server, char *path, GError *error, operation_data *op_data) { SyncevoSession *session; app_data *data = op_data->data; if (error) { g_warning ("Error in Server.StartSession: %s", error->message); g_error_free (error); g_free (path); switch (op_data->operation) { case OP_SYNC: /* TODO show in UI: sync failed (failed to even start) */ break; case OP_SAVE: /* TODO show in UI: save failed */ break; default: g_warn_if_reached (); } g_slice_free (operation_data, op_data); return; } session = syncevo_session_new (path); if (data->running_session && strcmp (path, syncevo_session_get_path (data->running_session)) != 0) { /* This is a really unfortunate event: Someone got a session and we did not have time to set UI insensitive... */ gtk_label_set_markup (GTK_LABEL (data->server_label), _("Waiting for current operation to finish...")); gtk_widget_show_all (data->sources_box); } /* we want to know about status changes to our session */ g_signal_connect (session, "status-changed", G_CALLBACK (status_changed_cb), op_data); syncevo_session_get_status (session, (SyncevoSessionGetStatusCb)get_status_cb, op_data); g_free (path); } /* TODO: this function should accept source/peer name as param */ char* get_error_string_for_code (int error_code, SyncErrorResponse *response) { if (response) { *response = SYNC_ERROR_RESPONSE_NONE; } switch (error_code) { case -1: /* no errorcode */ case 0: case 200: case LOCERR_USERABORT: case LOCERR_USERSUSPEND: return NULL; case 22000: if (response) { *response = SYNC_ERROR_RESPONSE_EMERGENCY; } /* TRANSLATORS: next strings are error messages. */ return g_strdup (_("A normal sync is not possible at this time. The server " "suggests a slow sync, but this might not always be " "what you want if both ends already have data.")); case 22002: return g_strdup (_("The sync process died unexpectedly.")); case 22003: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup (_("Password request was not answered. You can save the " "password in the settings to prevent the request.")); case 506: /* TODO use the service device name here, this is a remote problem */ return g_strdup (_("There was a problem processing sync request. " "Trying again may help.")); case DB_Unauthorized: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("Failed to login. Could there be a problem with " "your username or password?")); case DB_Forbidden: return g_strdup(_("Forbidden")); case DB_NotFound: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } /* TRANSLATORS: data source means e.g. calendar or addressbook */ return g_strdup(_("A data source could not be found. Could there be a " "problem with the settings?")); case DB_Fatal: case DB_Error: return g_strdup(_("Remote database error")); case LOCAL_STATUS_CODE + DB_Fatal: /* This can happen when EDS is borked, restart it may help... */ return g_strdup(_("There is a problem with the local database. " "Syncing again or rebooting may help.")); case DB_Full: return g_strdup(_("No space on disk")); case LOCERR_PROCESSMSG: return g_strdup(_("Failed to process SyncML")); case LOCERR_AUTHFAIL: return g_strdup(_("Server authorization failed")); case LOCERR_CFGPARSE: return g_strdup(_("Failed to parse configuration file")); case LOCERR_CFGREAD: return g_strdup(_("Failed to read configuration file")); case LOCERR_NOCFG: return g_strdup(_("No configuration found")); case LOCERR_NOCFGFILE: return g_strdup(_("No configuration file found")); case LOCERR_BADCONTENT: return g_strdup(_("Server sent bad content")); case LOCERR_CERT_EXPIRED: return g_strdup(_("Connection certificate has expired")); case LOCERR_CERT_INVALID: return g_strdup(_("Connection certificate is invalid")); case LOCERR_CONN: case LOCERR_NOCONN: case LOCERR_TRANSPFAIL: case LOCERR_TIMEOUT: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("We were unable to connect to the server. The problem " "could be temporary or there could be something wrong " "with the settings.")); case LOCERR_BADURL: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("The server URL is bad")); case LOCERR_SRVNOTFOUND: if (response) { *response = SYNC_ERROR_RESPONSE_SETTINGS_OPEN; } return g_strdup(_("The server was not found")); default: return g_strdup_printf (_("Error %d"), error_code); } } static void server_shutdown_cb (SyncevoServer *server, app_data *data) { if (data->syncing) { gtk_label_set_text (GTK_LABEL (data->sync_status_label), _("Sync failed")); set_sync_progress (data, 1.0 , ""); set_app_state (data, SYNC_UI_STATE_SERVER_OK); } /* re-init server here */ } static void set_running_session (app_data *data, const char *path) { if (data->running_session) { g_object_unref (data->running_session); } if (!path) { data->running_session = NULL; return; } data->running_session = syncevo_session_new (path); g_signal_connect (data->running_session, "progress-changed", G_CALLBACK (running_session_progress_changed_cb), data); g_signal_connect (data->running_session, "status-changed", G_CALLBACK (running_session_status_changed_cb), data); syncevo_session_get_status (data->running_session, (SyncevoSessionGetStatusCb)get_running_session_status_cb, data); } static void set_online_status (app_data *data, gboolean online) { if (online != data->online) { data->online = online; if (data->current_state == SYNC_UI_STATE_SERVER_OK) { if (data->online) { gtk_widget_hide (data->no_connection_box); } else { gtk_widget_show (data->no_connection_box); } } gtk_widget_set_sensitive (data->sync_btn, data->online); } } static void get_presence_cb (SyncevoServer *server, char *status, char **transports, GError *error, app_data *data) { if (error) { g_warning ("Server.GetSessions failed: %s", error->message); g_error_free (error); /* non-fatal, ignore in UI */ return; } if (data->current_service && status) { set_online_status (data, strcmp (status, "") == 0); } g_free (status); g_strfreev (transports); } static void password_dialog_response_cb (GtkWidget *dialog, int response, app_data *data) { const char *password; GHashTable *return_dict; return_dict = g_hash_table_new (g_str_hash, g_str_equal); if (response == GTK_RESPONSE_OK) { password = gtk_entry_get_text (GTK_ENTRY (data->password_dialog_entry)); g_hash_table_insert (return_dict, "password", (gpointer)password); } syncevo_server_info_response (data->server, data->password_dialog_id, "response", return_dict, NULL, NULL); g_hash_table_destroy (return_dict); g_free (data->password_dialog_id); data->password_dialog_id = NULL; gtk_widget_destroy (dialog); } static void info_request_cb (SyncevoServer *syncevo, char *id, char *session_path, char *state, char *handler_path, char *type, GHashTable *parameters, app_data *data) { GHashTable *t; GtkWidget *dialog, *content, *label, *align; char *msg; if (g_strcmp0 (state, "request") != 0 || g_strcmp0 (type, "password") != 0) { /* not handling other stuff */ return; } if (!data->running_session || g_strcmp0 (session_path, syncevo_session_get_path (data->running_session)) != 0) { /* not our problem */ return; } t = g_hash_table_new (g_str_hash, g_str_equal); syncevo_server_info_response (syncevo, id, "working", t, NULL, NULL); g_hash_table_destroy (t); data->password_dialog_id = g_strdup (id); /* TRANSLATORS: password request dialog contents: title, cancel button * and ok button */ dialog = gtk_dialog_new_with_buttons (_("Password is required for sync"), GTK_WINDOW (data->sync_win), GTK_DIALOG_DESTROY_WITH_PARENT, _("Cancel sync"), GTK_RESPONSE_CANCEL, _("Sync with password"), GTK_RESPONSE_OK, NULL); content = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); align = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 16, 16); gtk_widget_show (align); gtk_box_pack_start (GTK_BOX (content), align, FALSE, FALSE, 6); /* TRANSLATORS: password request dialog message, placeholder is service name */ msg = g_strdup_printf (_("Please enter password for syncing with %s:"), data->current_service->pretty_name); label = gtk_label_new (msg); gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); gtk_widget_set_size_request (label, 500, -1); gtk_widget_show (label); gtk_container_add (GTK_CONTAINER (align), label); g_free (msg); align = gtk_alignment_new (0.0, 0.5, 0.0, 0.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 0, 0, 16, 16); gtk_widget_show (align); gtk_box_pack_start (GTK_BOX (content), align, FALSE, FALSE, 6); data->password_dialog_entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (data->password_dialog_entry), 99); gtk_entry_set_width_chars (GTK_ENTRY (data->password_dialog_entry), 30); gtk_entry_set_visibility (GTK_ENTRY (data->password_dialog_entry), FALSE); gtk_widget_show (data->password_dialog_entry); gtk_container_add (GTK_CONTAINER (align), data->password_dialog_entry); g_signal_connect (dialog, "response", G_CALLBACK (password_dialog_response_cb), data); gtk_window_present (GTK_WINDOW (dialog)); gtk_widget_grab_focus (data->password_dialog_entry); } static void server_presence_changed_cb (SyncevoServer *server, char *config_name, char *status, char *transport, app_data *data) { if (data->current_service && config_name && status && g_ascii_strcasecmp (data->current_service->name, config_name) == 0) { set_online_status (data, strcmp (status, "") == 0); } } static void server_templates_changed_cb (SyncevoServer *server, app_data *data) { if (gtk_widget_get_visible (data->services_box)) { update_services_list (data); } } static void server_session_changed_cb (SyncevoServer *server, char *path, gboolean started, app_data *data) { if (started) { set_running_session (data, path); } else if (data->running_session && strcmp (syncevo_session_get_path (data->running_session), path) == 0 ) { set_running_session (data, NULL); } } static void get_sessions_cb (SyncevoServer *server, SyncevoSessions *sessions, GError *error, app_data *data) { const char *path; if (error) { g_warning ("Server.GetSessions failed: %s", error->message); g_error_free (error); /* TODO show in UI: failed first syncevo call (unexpected, fatal?) */ return; } /* assume first one is active */ path = syncevo_sessions_index (sessions, 0); set_running_session (data, path); syncevo_sessions_free (sessions); } static void get_config_for_default_peer_cb (SyncevoServer *syncevo, SyncevoConfig *config, GError *error, app_data *data) { char *name; if (error) { g_warning ("Server.GetConfig failed: %s", error->message); g_error_free (error); /* TODO show in UI: failed first syncevo call (unexpected, fatal?) */ return; } syncevo_config_get_value (config, NULL, "defaultPeer", &name); reload_config (data, name); syncevo_config_free (config); } app_data* sync_ui_create () { app_data *data; data = g_slice_new0 (app_data); data->online = TRUE; data->current_state = SYNC_UI_STATE_GETTING_SERVER; data->forced_emergency = FALSE; data->emergency_sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); if (!init_ui (data)) { return NULL; } data->server = syncevo_server_get_default(); g_signal_connect (data->server, "shutdown", G_CALLBACK (server_shutdown_cb), data); g_signal_connect (data->server, "session-changed", G_CALLBACK (server_session_changed_cb), data); g_signal_connect (data->server, "presence-changed", G_CALLBACK (server_presence_changed_cb), data); g_signal_connect (data->server, "templates-changed", G_CALLBACK (server_templates_changed_cb), data); g_signal_connect (data->server, "info-request", G_CALLBACK (info_request_cb), data); syncevo_server_get_config (data->server, "", FALSE, (SyncevoServerGetConfigCb)get_config_for_default_peer_cb, data); syncevo_server_get_sessions (data->server, (SyncevoServerGetSessionsCb)get_sessions_cb, data); gtk_window_present (GTK_WINDOW (data->sync_win)); return data; } void sync_ui_show_settings (app_data *data, const char *id) { show_services_list (data, id); } GtkWindow* sync_ui_get_main_window (app_data *data) { return GTK_WINDOW(data->sync_win); } syncevolution-1.5/src/gtk3-ui/sync-ui.h0000644000373300001540000000350412326412403021327 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SYNC_UI_H #define SYNC_UI_H #include #include "config.h" #include "sync-ui-config.h" #include "sync-ui.h" #define SYNC_UI_LIST_ICON_SIZE 32 #define SYNC_UI_LIST_BTN_WIDTH 150 typedef struct _app_data app_data; typedef enum SyncErrorResponse { SYNC_ERROR_RESPONSE_NONE, SYNC_ERROR_RESPONSE_SYNC, SYNC_ERROR_RESPONSE_SETTINGS_SELECT, SYNC_ERROR_RESPONSE_SETTINGS_OPEN, SYNC_ERROR_RESPONSE_EMERGENCY, SYNC_ERROR_RESPONSE_EMERGENCY_SLOW_SYNC, } SyncErrorResponse; char* get_pretty_source_name (const char *source_name); char* get_error_string_for_code (int error_code, SyncErrorResponse *response); void show_error_dialog (GtkWidget *widget, const char* message); gboolean show_confirmation (GtkWidget *widget, const char *message, const char *yes, const char *no); app_data *sync_ui_create (); GtkWindow *sync_ui_get_main_window (app_data *data); void sync_ui_show_settings (app_data *data, const char *id); void toggle_set_active (GtkWidget *toggle, gboolean active); gboolean toggle_get_active (GtkWidget *toggle); #endif syncevolution-1.5/src/gtk3-ui/sync-ui-config.c0000644000373300001540000001004512326412403022563 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include "sync-ui-config.h" #include "sync-ui.h" void server_config_free (server_config *server) { if (!server) return; g_free (server->name); syncevo_config_free (server->config); g_slice_free (server_config, server); } void server_config_update_from_entry (server_config *server, GtkEntry *entry) { char **str; const char *new_str; /* all entries have a pointer to the correct string in server_config */ str = g_object_get_data (G_OBJECT (entry), "value"); g_assert (str); new_str = gtk_entry_get_text (entry); if ((*str == NULL && strlen (new_str) != 0) || (*str != NULL && strcmp (*str, new_str) != 0)) { server->changed = TRUE; g_free (*str); *str = g_strdup (new_str); } } static void add_source_config (char *name, GHashTable *syncevo_source_config, GHashTable *source_configs) { source_config *new_conf; new_conf = g_slice_new0 (source_config); new_conf->name = name; new_conf->supported_locally = TRUE; new_conf->stats_set = FALSE; new_conf->config = syncevo_source_config; g_hash_table_insert (source_configs, name, new_conf); } void server_config_init (server_config *server, SyncevoConfig *config) { server->config = config; /* build source_configs */ server->source_configs = g_hash_table_new (g_str_hash, g_str_equal); syncevo_config_foreach_source (config, (ConfigFunc)add_source_config, server->source_configs); if (!syncevo_config_get_value (config, NULL, "PeerName", &server->pretty_name)) { server->pretty_name = server->name; } } gboolean source_config_is_usable (source_config *source) { const char *source_uri; source_uri = g_hash_table_lookup (source->config, "uri"); if (!source_config_is_enabled (source) || !source_uri || strlen (source_uri) == 0 || !source->supported_locally) { return FALSE; } return TRUE; } gboolean source_config_is_enabled (source_config *source) { char *mode; mode = g_hash_table_lookup (source->config, "sync"); if (mode && (strcmp (mode, "none") == 0 || strcmp (mode, "disabled") == 0)) { return FALSE; } return TRUE; } server_data* server_data_new (const char *name, gpointer *data) { server_data *serv_data; serv_data = g_slice_new0 (server_data); serv_data->data = data; serv_data->config = g_slice_new0 (server_config); serv_data->config->name = g_strdup (name); return serv_data; } void server_data_free (server_data *data, gboolean free_config) { if (!data) return; if (free_config && data->config) { server_config_free (data->config); } if (data->options_override) { /* g_ptr_array_foreach (data->options_override, (GFunc)syncevo_option_free, NULL); */ g_ptr_array_free (data->options_override, TRUE); } g_slice_free (server_data, data); } gboolean peer_is_client (SyncevoConfig *config) { char *is_client; g_return_val_if_fail (config, FALSE); syncevo_config_get_value (config, NULL, "PeerIsClient", &is_client); return is_client && g_strcmp0 ("1", is_client) == 0; } syncevolution-1.5/src/gtk3-ui/sync-ui-config.h0000644000373300001540000000605712326412403022600 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef SYNC_UI_CONFIG_H #define SYNC_UI_CONFIG_H #include #include "syncevo-session.h" #include "syncevo-server.h" typedef struct source_config { char *name; gboolean supported_locally; SyncevoSourcePhase phase; gboolean stats_set; long status; long local_changes; long remote_changes; long local_rejections; long remote_rejections; GtkWidget *info_bar; /* info/error bar, after ui has been constructed */ GtkWidget *label; /* source report label, after ui has been constructed */ GtkWidget *box; /* source box, after ui has been constructed */ GHashTable *config; /* link to a "sub-hashtable" inside server_config->config */ } source_config; typedef struct server_config { char *name; char *pretty_name; char *password; /* any field in config has changed */ gboolean changed; /* a authentication detail (base_url/username/password) has changed */ gboolean auth_changed; gboolean password_changed; GHashTable *source_configs; /* source_config's*/ SyncevoConfig *config; } server_config; gboolean source_config_is_usable (source_config *source); gboolean source_config_is_enabled (source_config *source); void source_config_free (source_config *source); void server_config_init (server_config *server, SyncevoConfig *config); void server_config_free (server_config *server); void server_config_update_from_entry (server_config *server, GtkEntry *entry); GPtrArray* server_config_get_option_array (server_config *server); void server_config_disable_unsupported_sources (server_config *server); void server_config_ensure_default_sources_exist (server_config *server); /* data structure for syncevo_service_get_template_config_async and * syncevo_service_get_server_config_async. server is the server that * the method was called for. options_override are options that should * be overridden on the config we get. */ typedef struct server_data { server_config *config; GPtrArray *options_override; gpointer *data; } server_data; server_data* server_data_new (const char *name, gpointer *data); void server_data_free (server_data *data, gboolean free_config); /** * utility function: TRUE if the config belongs to a client (PeerIsClient) */ gboolean peer_is_client (SyncevoConfig *config); #endif syncevolution-1.5/src/gtk3-ui/mux-frame.c0000644000373300001540000003103412326412403021633 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "mux-frame.h" #include static GdkColor mux_frame_default_border_color = { 0, 0xdddd, 0xe2e2, 0xe5e5 }; static GdkColor mux_frame_default_bullet_color = { 0, 0xaaaa, 0xaaaa, 0xaaaa }; static gfloat mux_frame_bullet_size_factor = 1.3; #define MUX_FRAME_BULLET_PADDING 10 static void mux_frame_buildable_init (GtkBuildableIface *iface); static void mux_frame_buildable_add_child (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *type); G_DEFINE_TYPE_WITH_CODE (MuxFrame, mux_frame, GTK_TYPE_FRAME, G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, mux_frame_buildable_init)) static void mux_frame_dispose (GObject *object) { G_OBJECT_CLASS (mux_frame_parent_class)->dispose (object); } static void mux_frame_finalize (GObject *object) { G_OBJECT_CLASS (mux_frame_parent_class)->finalize (object); } static void label_changed_cb (MuxFrame *frame) { char *font = NULL; GtkWidget *label = gtk_frame_get_label_widget (GTK_FRAME (frame)); if (!label) return; /* ensure font is correct */ gtk_widget_style_get (GTK_WIDGET (frame), "title-font", &font, NULL); if (font) { PangoFontDescription *desc; desc = pango_font_description_from_string (font); gtk_widget_modify_font (label, desc); pango_font_description_free (desc); g_free (font); } gtk_misc_set_alignment (GTK_MISC (label), 0.0, 1.0); } static void mux_frame_update_style (MuxFrame *frame) { GdkColor *border_color, *bullet_color; gtk_widget_style_get (GTK_WIDGET (frame), "border-color", &border_color, "bullet-color", &bullet_color, NULL); if (border_color) { frame->border_color = *border_color; gdk_color_free (border_color); } else { frame->border_color = mux_frame_default_border_color; } if (bullet_color) { frame->bullet_color = *bullet_color; gdk_color_free (bullet_color); } else { frame->bullet_color = mux_frame_default_bullet_color; } label_changed_cb (frame); } static void rounded_rectangle (cairo_t * cr, double x, double y, double w, double h, guint radius) { if (radius > w / 2) radius = w / 2; if (radius > h / 2) radius = h / 2; cairo_move_to (cr, x + radius, y); cairo_arc (cr, x + w - radius, y + radius, radius, M_PI * 1.5, M_PI * 2); cairo_arc (cr, x + w - radius, y + h - radius, radius, 0, M_PI * 0.5); cairo_arc (cr, x + radius, y + h - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x + radius, y + radius, radius, M_PI, M_PI * 1.5); } static void mux_frame_paint (GtkWidget *widget, cairo_t *cairo) { MuxFrame *frame = MUX_FRAME (widget); GtkStyle *style; guint width; GtkAllocation allocation; g_return_if_fail (widget != NULL); g_return_if_fail (MUX_IS_FRAME (widget)); style = gtk_widget_get_style (widget); width = gtk_container_get_border_width (GTK_CONTAINER (widget)); gtk_widget_get_allocation (widget, &allocation); /* draw border */ if (width != 0) { gdk_cairo_set_source_color (cairo, &frame->border_color); rounded_rectangle (cairo, 0, 0, allocation.width, allocation.height, width); cairo_clip (cairo); cairo_paint (cairo); } /* draw background */ gdk_cairo_set_source_color (cairo, &style->bg[gtk_widget_get_state (widget)]); rounded_rectangle (cairo, width, width, allocation.width - 2 * width, allocation.height - 2 * width, width); cairo_clip (cairo); cairo_paint (cairo); /* draw bullet before title */ if (gtk_frame_get_label_widget (GTK_FRAME (frame))) { gdk_cairo_set_source_color (cairo, &frame->bullet_color); rounded_rectangle (cairo, 0, 0, frame->bullet_allocation.width, frame->bullet_allocation.height, 4); cairo_clip (cairo); cairo_paint (cairo); } } static gboolean mux_frame_draw(GtkWidget *widget, cairo_t *cr) { GtkWidgetClass *grand_parent; if (gtk_widget_is_drawable (widget)) { mux_frame_paint (widget, cr); grand_parent = GTK_WIDGET_CLASS (g_type_class_peek_parent (mux_frame_parent_class)); grand_parent->draw (widget, cr); } return FALSE; } static void mux_frame_size_request (GtkWidget *widget, GtkRequisition *requisition) { GtkWidget *label = gtk_frame_get_label_widget (GTK_FRAME (widget)); GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget)); GtkRequisition child_req; GtkRequisition title_req; child_req.width = child_req.height = 0; if (child) gtk_widget_size_request (child, &child_req); title_req.width = title_req.height = 0; if (label) { gtk_widget_size_request (label, &title_req); /* add room for bullet */ title_req.height = title_req.height * mux_frame_bullet_size_factor + 2 * MUX_FRAME_BULLET_PADDING; title_req.width += title_req.height * mux_frame_bullet_size_factor + 2 * MUX_FRAME_BULLET_PADDING; } requisition->width = MAX (child_req.width, title_req.width) + 2 * (gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->xthickness); requisition->height = title_req.height + child_req.height + 2 * (gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->ythickness); } static void mux_frame_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width) { GtkRequisition requisition; mux_frame_size_request (widget, &requisition); *minimal_width = *natural_width = requisition.width; } static void mux_frame_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height) { GtkRequisition requisition; mux_frame_size_request (widget, &requisition); *minimal_height = *natural_height = requisition.height; } static void mux_frame_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkBin *bin = GTK_BIN (widget); MuxFrame *mux_frame = MUX_FRAME (widget); GtkFrame *frame = GTK_FRAME (widget); GtkAllocation child_allocation; GtkWidget *child; int xmargin, ymargin, title_height; gtk_widget_set_allocation (widget, allocation); xmargin = gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->xthickness; ymargin = gtk_container_get_border_width (GTK_CONTAINER (widget)) + gtk_widget_get_style (widget)->ythickness; title_height = 0; if (gtk_frame_get_label_widget (frame)) { GtkAllocation title_allocation; GtkRequisition title_req; gtk_widget_get_child_requisition (gtk_frame_get_label_widget (frame), &title_req); /* the bullet is bigger than the text */ title_height = title_req.height * mux_frame_bullet_size_factor + 2 * MUX_FRAME_BULLET_PADDING; /* x allocation starts after bullet */ title_allocation.x = allocation->x + xmargin + title_height; title_allocation.y = allocation->y + ymargin + MUX_FRAME_BULLET_PADDING; title_allocation.width = MIN (title_req.width, allocation->width - 2 * xmargin - title_height); title_allocation.height = title_height - 2 * MUX_FRAME_BULLET_PADDING; gtk_widget_size_allocate (gtk_frame_get_label_widget (frame), &title_allocation); mux_frame->bullet_allocation.x = allocation->x + xmargin + MUX_FRAME_BULLET_PADDING; mux_frame->bullet_allocation.y = allocation->y + ymargin + MUX_FRAME_BULLET_PADDING; mux_frame->bullet_allocation.width = title_allocation.height; mux_frame->bullet_allocation.height = title_allocation.height; } child_allocation.x = allocation->x + xmargin; child_allocation.y = allocation->y + ymargin + title_height; child_allocation.width = allocation->width - 2 * xmargin; child_allocation.height = allocation->height - 2 * ymargin - title_height; if (gtk_widget_get_mapped (widget)) { gdk_window_invalidate_rect (gtk_widget_get_window (widget), allocation, FALSE); } child = gtk_bin_get_child (bin); if (child && gtk_widget_get_visible (child)) { gtk_widget_size_allocate (child, &child_allocation); } } static void mux_frame_style_set (GtkWidget *widget, GtkStyle *previous) { MuxFrame *frame = MUX_FRAME (widget); mux_frame_update_style (frame); GTK_WIDGET_CLASS (mux_frame_parent_class)->style_set (widget, previous); } static void mux_frame_class_init (MuxFrameClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GParamSpec *pspec; object_class->dispose = mux_frame_dispose; object_class->finalize = mux_frame_finalize; widget_class->draw = mux_frame_draw; widget_class->get_preferred_width = mux_frame_get_preferred_width; widget_class->get_preferred_height = mux_frame_get_preferred_height; widget_class->size_allocate = mux_frame_size_allocate; widget_class->style_set = mux_frame_style_set; pspec = g_param_spec_boxed ("border-color", "Border color", "Color of the outside border", GDK_TYPE_COLOR, G_PARAM_READABLE); gtk_widget_class_install_style_property(widget_class, pspec); pspec = g_param_spec_boxed ("bullet-color", "Bullet color", "Color of the rounded rectangle before a title", GDK_TYPE_COLOR, G_PARAM_READABLE); gtk_widget_class_install_style_property(widget_class, pspec); pspec = g_param_spec_string ("title-font", "Title font", "Pango font description string for title text", "12", G_PARAM_READWRITE); gtk_widget_class_install_style_property(widget_class, pspec); } static void mux_frame_buildable_add_child (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const gchar *type) { if (!type) gtk_container_add (GTK_CONTAINER (buildable), GTK_WIDGET (child)); else GTK_BUILDER_WARN_INVALID_CHILD_TYPE (MUX_FRAME (buildable), type); } static void mux_frame_buildable_init (GtkBuildableIface *iface) { iface->add_child = mux_frame_buildable_add_child; } static void mux_frame_init (MuxFrame *self) { g_signal_connect (self, "notify::label-widget", G_CALLBACK (label_changed_cb), NULL); } GtkWidget* mux_frame_new (void) { return g_object_new (MUX_TYPE_FRAME, "border-width", 4, NULL); } syncevolution-1.5/src/gtk3-ui/mux-frame.h0000644000373300001540000000325112326412403021640 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _MUX_FRAME #define _MUX_FRAME #include #include G_BEGIN_DECLS #define MUX_TYPE_FRAME mux_frame_get_type() #define MUX_FRAME(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUX_TYPE_FRAME, MuxFrame)) #define MUX_FRAME_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), MUX_TYPE_FRAME, MuxFrameClass)) #define MUX_IS_FRAME(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MUX_TYPE_FRAME)) #define MUX_IS_FRAME_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), MUX_TYPE_FRAME)) #define MUX_FRAME_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), MUX_TYPE_FRAME, MuxFrameClass)) typedef struct { GtkFrame parent; GtkAllocation bullet_allocation; GdkColor bullet_color; GdkColor border_color; } MuxFrame; typedef struct { GtkFrameClass parent_class; } MuxFrameClass; GType mux_frame_get_type (void); GtkWidget* mux_frame_new (void); G_END_DECLS #endif syncevolution-1.5/src/gtk3-ui/sync-config-widget.c0000644000373300001540000022413712326412403023442 0ustar00nightlynightly00000000000000#include "config.h" #include #include #include #include #include "sync-ui.h" #include "sync-config-widget.h" #define INDICATOR_SIZE 16 #define CHILD_PADDING 3 G_DEFINE_TYPE (SyncConfigWidget, sync_config_widget, GTK_TYPE_CONTAINER) typedef struct source_widgets { char *name; GtkWidget *label; GtkWidget *entry; GtkWidget *check; GtkWidget *source_toggle_label; guint count; } source_widgets; enum { PROP_0, PROP_SERVER, PROP_NAME, PROP_CONFIG, PROP_CURRENT, PROP_HAS_TEMPLATE, PROP_CONFIGURED, PROP_CURRENT_SERVICE_NAME, PROP_EXPANDED, }; enum { SIGNAL_CHANGED, LAST_SIGNAL }; static guint32 signals[LAST_SIGNAL] = {0, }; typedef struct save_config_data { SyncConfigWidget *widget; gboolean delete; gboolean temporary; source_widgets *widgets; char *basename; } save_config_data; static void start_session_for_config_write_cb (SyncevoServer *server, char *path, GError *error, save_config_data *data); static void sync_config_widget_update_label (SyncConfigWidget *self); static void sync_config_widget_set_name (SyncConfigWidget *self, const char *name); static void remove_child (GtkWidget *widget, GtkContainer *container) { gtk_container_remove (container, widget); } const char* get_service_description (const char *service) { if (!service) return NULL; /* TRANSLATORS: Descriptions for specific services, shown in service * configuration form */ if (strcmp (service, "ScheduleWorld") == 0) { return _("ScheduleWorld enables you to keep your contacts, events, " "tasks, and notes in sync."); }else if (strcmp (service, "Google") == 0) { return _("Google Sync can back up and synchronize your contacts " "with your Gmail contacts."); }else if (strcmp (service, "Funambol") == 0) { /* TRANSLATORS: Please include the word "demo" (or the equivalent in your language): Funambol is going to be a 90 day demo service in the future */ return _("Back up your contacts and calendar. Sync with a single " "click, anytime, anywhere (DEMO)."); }else if (strcmp (service, "Mobical") == 0) { return _("Mobical Backup and Restore service allows you to securely " "back up your personal mobile data for free."); }else if (strcmp (service, "ZYB") == 0) { return _("ZYB is a simple way for people to store and share mobile " "information online."); }else if (strcmp (service, "Memotoo") == 0) { return _("Memotoo lets you access your personal data from any " "computer connected to the Internet."); } return NULL; } static void update_source_uri (char *name, GHashTable *source_configuration, SyncConfigWidget *self) { const char *uri; source_widgets *widgets; widgets = (source_widgets*)g_hash_table_lookup (self->sources, name); if (!widgets) { return; } uri = gtk_entry_get_text (GTK_ENTRY (widgets->entry)); g_hash_table_insert (source_configuration, g_strdup ("uri"), g_strdup (uri)); } static source_widgets * source_widgets_ref (source_widgets *widgets) { if (widgets) { widgets->count++; } return widgets; } static void source_widgets_unref (source_widgets *widgets) { if (widgets) { widgets->count--; if (widgets->count == 0) g_slice_free (source_widgets, widgets); } } static void check_source_cb (SyncevoSession *session, GError *error, source_widgets *widgets) { gboolean show = TRUE; if (error) { if(error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_SOURCE_UNUSABLE)) { show = FALSE; } else { g_warning ("CheckSource failed: %s", error->message); /* non-fatal, ignore in UI */ } g_error_free (error); } if (widgets->count > 1) { if (show) { /* NOTE: with the new two sources per row layout not showing things * may look weird in some cases... the layout should really only be * done at this point */ gtk_widget_show (widgets->source_toggle_label); gtk_widget_show (widgets->label); gtk_widget_show (widgets->entry); gtk_widget_show (widgets->check); } else { /* next save should disable this source */ gtk_switch_set_active (GTK_SWITCH (widgets->check), FALSE); } } source_widgets_unref (widgets); g_object_unref (session); } static void set_config_cb (SyncevoSession *session, GError *error, save_config_data *data) { if (error) { g_warning ("Error in Session.SetConfig: %s", error->message); g_error_free (error); g_object_unref (session); show_error_dialog (GTK_WIDGET (data->widget), _("Sorry, failed to save the configuration")); return; } if (data->temporary) { syncevo_session_check_source (session, data->widgets->name, (SyncevoSessionGenericCb)check_source_cb, data->widgets); } else { data->widget->configured = TRUE; g_signal_emit (data->widget, signals[SIGNAL_CHANGED], 0); g_object_unref (session); } } static void get_config_for_overwrite_prevention_cb (SyncevoSession *session, SyncevoConfig *config, GError *error, save_config_data *data) { static int index = 0; char *name; if (error) { index = 0; if (error->code == DBUS_GERROR_REMOTE_EXCEPTION && dbus_g_error_has_name (error, SYNCEVO_DBUS_ERROR_NO_SUCH_CONFIG)) { /* Config does not exist (as expected), we can now save */ syncevo_session_set_config (session, data->temporary, data->temporary, data->widget->config, (SyncevoSessionGenericCb)set_config_cb, data); return; } g_warning ("Unexpected error in Session.GetConfig: %s", error->message); g_error_free (error); g_object_unref (session); return; } /* Config exists when we are trying to create a new config... * Need to start a new session with another name */ g_object_unref (session); name = g_strdup_printf ("%s__%d", data->basename, ++index); sync_config_widget_set_name (data->widget, name); g_free (name); syncevo_server_start_no_sync_session (data->widget->server, data->widget->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void save_config (save_config_data *data, SyncevoSession *session) { SyncConfigWidget *w = data->widget; if (data->delete) { syncevo_config_free (w->config); w->config = g_hash_table_new (g_str_hash, g_str_equal); } /* if this is a client peer (a device) and not configured, we * need to test that we aren't overwriting existing * configs */ /* TODO: This might be a good thing to do for any configurations.*/ if (peer_is_client (w->config) && !w->configured && !data->temporary) { syncevo_session_get_config (session, FALSE, (SyncevoSessionGetConfigCb)get_config_for_overwrite_prevention_cb, data); } else { syncevo_session_set_config (session, data->temporary, data->temporary, data->widget->config, (SyncevoSessionGenericCb)set_config_cb, data); } } static void status_changed_for_config_write_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, save_config_data *data) { if (status == SYNCEVO_STATUS_IDLE) { save_config (data, session); } } static void get_status_for_config_write_cb (SyncevoSession *session, SyncevoSessionStatus status, guint error_code, SyncevoSourceStatuses *source_statuses, GError *error, save_config_data *data) { if (error) { g_warning ("Error in Session.GetStatus: %s", error->message); g_error_free (error); g_object_unref (session); /* TODO show in UI: save failed in service list */ return; } syncevo_source_statuses_free (source_statuses); if (status == SYNCEVO_STATUS_IDLE) { save_config (data, session); } } static void start_session_for_config_write_cb (SyncevoServer *server, char *path, GError *error, save_config_data *data) { SyncevoSession *session; if (error) { g_warning ("Error in Server.StartSession: %s", error->message); g_error_free (error); /* TODO show in UI: save failed in service list */ return; } session = syncevo_session_new (path); /* we want to know about status changes to our session */ g_signal_connect (session, "status-changed", G_CALLBACK (status_changed_for_config_write_cb), data); syncevo_session_get_status (session, (SyncevoSessionGetStatusCb)get_status_for_config_write_cb, data); } static void stop_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { save_config_data *data; if (!self->config) { return; } syncevo_config_set_value (self->config, NULL, "defaultPeer", ""); sync_config_widget_set_current (self, FALSE); data = g_slice_new (save_config_data); data->widget = self; data->delete = FALSE; data->temporary = FALSE; syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void use_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { save_config_data *data; const char *username, *password, *sync_url, *pretty_name; char *real_url, *device; gboolean send, receive; SyncevoSyncMode mode; if (!self->config) { return; } if (!self->config_name || strlen (self->config_name) == 0) { g_free (self->config_name); self->config_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (self->entry))); } if (self->mode_changed) { GHashTableIter iter; source_widgets *widgets; char *name; gboolean client = peer_is_client (self->config); send = gtk_switch_get_active (GTK_SWITCH (self->send_check)); receive = gtk_switch_get_active (GTK_SWITCH (self->receive_check)); if (send && receive) { mode = SYNCEVO_SYNC_TWO_WAY; } else if (send) { mode = client ? SYNCEVO_SYNC_ONE_WAY_FROM_SERVER : SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT; } else if (receive) { mode = client ? SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT : SYNCEVO_SYNC_ONE_WAY_FROM_SERVER; } else { mode = SYNCEVO_SYNC_NONE; } g_hash_table_iter_init (&iter, self->sources); while (g_hash_table_iter_next (&iter, (gpointer)&name, (gpointer)&widgets)) { const char *mode_str; gboolean active; active = gtk_switch_get_active (GTK_SWITCH (widgets->check)) && gtk_widget_get_sensitive (widgets->check); if (active) { mode_str = syncevo_sync_mode_to_string (mode); } else { mode_str = "none"; } syncevo_config_set_value (self->config, name, "sync", mode_str); } } username = gtk_entry_get_text (GTK_ENTRY (self->username_entry)); syncevo_config_set_value (self->config, NULL, "username", username); sync_url = gtk_entry_get_text (GTK_ENTRY (self->baseurl_entry)); /* make a wild guess if no scheme in url */ if (strstr (sync_url, "://") == NULL) { real_url = g_strdup_printf ("http://%s", sync_url); } else { real_url = g_strdup (sync_url); } syncevo_config_set_value (self->config, NULL, "syncURL", real_url); password = gtk_entry_get_text (GTK_ENTRY (self->password_entry)); syncevo_config_set_value (self->config, NULL, "password", password); syncevo_config_get_value (self->config, NULL, "deviceName", &device); if (!device || strlen (device) == 0) { if (!self->config_name || strlen (self->config_name) == 0 || !sync_url || strlen (sync_url) == 0) { show_error_dialog (GTK_WIDGET (self), _("Service must have a name and server URL")); return; } } syncevo_config_foreach_source (self->config, (ConfigFunc)update_source_uri, self); pretty_name = gtk_entry_get_text (GTK_ENTRY (self->entry)); syncevo_config_set_value (self->config, NULL, "PeerName", pretty_name); syncevo_config_get_value (self->config, NULL, "PeerName", &self->pretty_name); syncevo_config_set_value (self->config, NULL, "defaultPeer", self->config_name); sync_config_widget_set_current (self, TRUE); data = g_slice_new (save_config_data); data->widget = self; data->delete = FALSE; data->temporary = FALSE; data->basename = g_strdup (self->config_name); syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); g_free (real_url); } static void reset_delete_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { char *msg, *yes, *no; save_config_data *data; if (!self->config) { return; } if (self->has_template) { /*TRANSLATORS: warning dialog text for resetting pre-defined services */ msg = g_strdup_printf (_("Do you want to reset the settings for %s? " "This will not remove any synced information on either end."), self->pretty_name); /*TRANSLATORS: buttons in reset-service warning dialog */ yes = _("Yes, reset"); no = _("No, keep settings"); } else { /*TRANSLATORS: warning dialog text for deleting user-defined services */ msg = g_strdup_printf (_("Do you want to delete the settings for %s? " "This will not remove any synced information on either " "end but it will remove these settings."), self->pretty_name); /*TRANSLATORS: buttons in delete-service warning dialog */ yes = _("Yes, delete"); no = _("No, keep settings"); } /*TRANSLATORS: decline button in "Reset/delete service" warning dialogs */ if (!show_confirmation (GTK_WIDGET (self), msg, yes, no)) { g_free (msg); return; } g_free (msg); if (self->current) { sync_config_widget_set_current (self, FALSE); } data = g_slice_new (save_config_data); data->widget = self; data->delete = TRUE; data->temporary = FALSE; syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void update_buttons (SyncConfigWidget *self) { if (self->has_template) { /* TRANSLATORS: button labels in service configuration form */ gtk_button_set_label (GTK_BUTTON (self->reset_delete_button), _("Reset settings")); } else { gtk_button_set_label (GTK_BUTTON (self->reset_delete_button), _("Delete settings")); } if (self->configured) { gtk_widget_show (GTK_WIDGET (self->reset_delete_button)); } else { gtk_widget_hide (GTK_WIDGET (self->reset_delete_button)); } if (self->current || !self->current_service_name) { gtk_button_set_label (GTK_BUTTON (self->use_button), _("Save and use")); } else { gtk_button_set_label (GTK_BUTTON (self->use_button), _("Save and replace\ncurrent service")); } if (self->current && self->config) { if (peer_is_client (self->config)) { gtk_button_set_label (GTK_BUTTON (self->stop_button), _("Stop using device")); } else { gtk_button_set_label (GTK_BUTTON (self->stop_button), _("Stop using service")); } gtk_widget_show (self->stop_button); } else { gtk_widget_hide (self->stop_button); } } static void mode_widget_notify_active_cb (GtkWidget *widget, GParamSpec *pspec, SyncConfigWidget *self) { self->mode_changed = TRUE; } static void source_entry_notify_text_cb (GObject *gobject, GParamSpec *pspec, source_widgets *widgets) { gboolean new_editable, old_editable; const char *text; text = gtk_entry_get_text (GTK_ENTRY (widgets->entry)); new_editable = (strlen (text) > 0); old_editable = gtk_widget_get_sensitive (widgets->check); if (new_editable != old_editable) { gtk_widget_set_sensitive (widgets->check, new_editable); gtk_switch_set_active (GTK_SWITCH (widgets->check), new_editable); } } static GtkWidget* add_toggle_widget (SyncConfigWidget *self, const char *title, gboolean active, guint row, guint col) { GtkWidget *toggle; int padding; GtkWidget *label; padding = (col == 1) ? 0 : 32; col = col * 2; label = gtk_label_new (title); gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END); gtk_widget_set_size_request (label, 260, -1); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_table_attach (GTK_TABLE (self->mode_table), label, col, col + 1, row, row + 1, GTK_FILL, GTK_FILL, 0, 0); toggle = gtk_switch_new (); g_signal_connect_swapped (toggle, "hide", G_CALLBACK (gtk_widget_hide), label); g_signal_connect_swapped (toggle, "show", G_CALLBACK (gtk_widget_show), label); gtk_switch_set_active (GTK_SWITCH (toggle), active); g_signal_connect (toggle, "notify::active", G_CALLBACK (mode_widget_notify_active_cb), self); gtk_table_attach (GTK_TABLE (self->mode_table), toggle, col + 1, col + 2, row, row + 1, GTK_FILL, GTK_FILL, padding, 0); return toggle; } /* check if config includes a virtual source that covers the given * source */ static gboolean virtual_source_exists (SyncevoConfig *config, const char *name) { GHashTableIter iter; const char *source_string; GHashTable *source_config; g_hash_table_iter_init (&iter, config); while (g_hash_table_iter_next (&iter, (gpointer)&source_string, (gpointer)&source_config)) { char **strs; if (g_str_has_prefix (source_string, "source/")) { const char *uri, *type; type = g_hash_table_lookup (source_config, "backend"); uri = g_hash_table_lookup (source_config, "uri"); if (!uri || !type || !g_str_has_prefix (type, "virtual:")) { /* this source is not defined, or not virtual */ continue; } strs = g_strsplit (source_string + 7, "+", 0); if (g_strv_length (strs) > 1) { int i; for (i = 0; strs[i]; i++) { if (g_strcmp0 (name, strs[i]) == 0) { g_strfreev (strs); return TRUE; } } } g_strfreev (strs); } } return FALSE; } static void init_source (char *name, GHashTable *source_configuration, SyncConfigWidget *self) { char *str, *pretty_name; const char *uri, *type; guint rows; guint row; static guint col = 0; source_widgets *widgets; SyncevoSyncMode mode; save_config_data *data; type = g_hash_table_lookup (source_configuration, "backend"); uri = g_hash_table_lookup (source_configuration, "uri"); if (!type || strlen (type) == 0) { return; } if (g_str_has_prefix (type, "virtual:") && !uri) { /* undefined virtual source */ return; } if (virtual_source_exists (self->config, name)) { return; } g_object_get (self->mode_table, "n-rows", &rows, NULL); if (!self->no_source_toggles && col == 0) { col = 1; row = rows - 1; } else { col = 0; row = rows; } self->no_source_toggles = FALSE; widgets = g_slice_new0 (source_widgets); widgets->name = name; widgets->count = 1; g_hash_table_insert (self->sources, name, widgets); widgets->source_toggle_label = self->source_toggle_label; pretty_name = get_pretty_source_name (name); mode = syncevo_sync_mode_from_string (g_hash_table_lookup (source_configuration, "sync")); widgets->check = add_toggle_widget (self, pretty_name, (mode > SYNCEVO_SYNC_NONE), row, col); /* TRANSLATORS: label for an entry in service configuration form. * Placeholder is a source name. * Example: "Appointments URI" */ str = g_strdup_printf (_("%s URI"), pretty_name); widgets->label = gtk_label_new (str); g_free (str); g_free (pretty_name); g_object_get (self->server_settings_table, "n-rows", &row, NULL); gtk_misc_set_alignment (GTK_MISC (widgets->label), 0.0, 0.5); gtk_table_attach (GTK_TABLE (self->server_settings_table), widgets->label, 0, 1, row, row + 1, GTK_FILL, GTK_EXPAND, 0, 0); widgets->entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (widgets->entry), 99); gtk_entry_set_width_chars (GTK_ENTRY (widgets->entry), 80); if (uri) { gtk_entry_set_text (GTK_ENTRY (widgets->entry), uri); } gtk_table_attach_defaults (GTK_TABLE (self->server_settings_table), widgets->entry, 1, 2, row, row + 1); g_signal_connect (widgets->entry, "notify::text", G_CALLBACK (source_entry_notify_text_cb), widgets); gtk_widget_set_sensitive (widgets->check, uri && strlen (uri) > 0); /* start a session so we save a temporary config so we can do * CheckSource, and show the source-related widgets if the * source is available */ data = g_slice_new (save_config_data); data->widget = self; data->delete = FALSE; data->temporary = TRUE; data->widgets = source_widgets_ref (widgets); syncevo_server_start_no_sync_session (self->server, self->config_name, (SyncevoServerStartSessionCb)start_session_for_config_write_cb, data); } static void get_common_mode (char *name, GHashTable *source_configuration, SyncevoSyncMode *common_mode) { SyncevoSyncMode mode; char *mode_str, *type; type = g_hash_table_lookup (source_configuration, "backend"); if (!type || strlen (type) == 0) { return; } mode_str = g_hash_table_lookup (source_configuration, "sync"); mode = syncevo_sync_mode_from_string (mode_str); if (mode == SYNCEVO_SYNC_NONE) { return; } if (*common_mode == SYNCEVO_SYNC_NONE) { *common_mode = mode; } else if (mode != *common_mode) { *common_mode = SYNCEVO_SYNC_UNKNOWN; } } void sync_config_widget_expand_id (SyncConfigWidget *self, const char *id) { if (id && self->config) { char *sync_url; if (syncevo_config_get_value (self->config, NULL, "syncURL", &sync_url) && strncmp (sync_url, id, strlen (id)) == 0) { sync_config_widget_set_expanded (self, TRUE); } else if (self->config_name && g_ascii_strcasecmp (self->config_name, id) == 0) { sync_config_widget_set_expanded (self, TRUE); } } } static void sync_config_widget_update_expander (SyncConfigWidget *self) { char *username = ""; char *password = ""; char *sync_url = ""; const char *descr; char *str; GtkWidget *label, *align; SyncevoSyncMode mode = SYNCEVO_SYNC_NONE; gboolean send, receive; gboolean client; gtk_container_foreach (GTK_CONTAINER (self->server_settings_table), (GtkCallback)remove_child, self->server_settings_table); gtk_table_resize (GTK_TABLE (self->server_settings_table), 2, 1); gtk_container_foreach (GTK_CONTAINER (self->mode_table), (GtkCallback)remove_child, self->mode_table); gtk_table_resize (GTK_TABLE (self->mode_table), 2, 1); client = peer_is_client (self->config); if (client) { if (!self->device_template_selected) { gtk_widget_hide (self->settings_box); gtk_widget_show (self->device_selector_box); /* temporary solution for device template selection: * show list of templates only */ } else { gtk_widget_show (self->settings_box); gtk_widget_hide (self->device_selector_box); gtk_widget_hide (self->userinfo_table); gtk_widget_hide (self->fake_expander); } } else { gtk_widget_show (self->settings_box); gtk_widget_hide (self->device_selector_box); gtk_widget_show (self->userinfo_table); gtk_widget_show (self->fake_expander); } syncevo_config_foreach_source (self->config, (ConfigFunc)get_common_mode, &mode); switch (mode) { case SYNCEVO_SYNC_TWO_WAY: send = receive = TRUE; break; case SYNCEVO_SYNC_ONE_WAY_FROM_CLIENT: if (client) { send = FALSE; receive = TRUE; } else { send = TRUE; receive = FALSE; } break; case SYNCEVO_SYNC_ONE_WAY_FROM_SERVER: if (client) { send = TRUE; receive = FALSE; } else { send = FALSE; receive = TRUE; } break; default: gtk_widget_show (self->complex_config_info_bar); send = FALSE; receive = FALSE; } self->mode_changed = FALSE; if (self->pretty_name) { gtk_entry_set_text (GTK_ENTRY (self->entry), self->pretty_name); } if (!self->config_name || strlen (self->config_name) == 0) { gtk_expander_set_expanded (GTK_EXPANDER (self->expander), TRUE); } descr = get_service_description (self->config_name); if (descr) { gtk_label_set_text (GTK_LABEL (self->description_label), get_service_description (self->config_name)); gtk_widget_show (self->description_label); } else { gtk_widget_hide (self->description_label); } update_buttons (self); /* TRANSLATORS: toggles in service configuration form, placeholder is service * or device name */ str = g_strdup_printf (_("Send changes to %s"), self->pretty_name); self->send_check = add_toggle_widget (self, str, send, 0, 0); gtk_widget_show (self->send_check); g_free (str); str = g_strdup_printf (_("Receive changes from %s"), self->pretty_name); self->receive_check = add_toggle_widget (self, str, receive, 0, 1); gtk_widget_show (self->receive_check); g_free (str); align = gtk_alignment_new (0.0, 1.0, 0.0, 0.0); gtk_alignment_set_padding (GTK_ALIGNMENT (align), 10, 0, 0, 0); gtk_widget_show (align); gtk_table_attach (GTK_TABLE (self->mode_table), align, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); self->source_toggle_label = gtk_label_new (""); /* TRANSLATORS: Label for the source toggles in configuration form. This is a verb, as in "Sync Calendar". */ gtk_label_set_markup (GTK_LABEL (self->source_toggle_label), _("Sync")); gtk_widget_show (self->source_toggle_label); gtk_container_add (GTK_CONTAINER (align), self->source_toggle_label); syncevo_config_get_value (self->config, NULL, "username", &username); syncevo_config_get_value (self->config, NULL, "password", &password); syncevo_config_get_value (self->config, NULL, "syncURL", &sync_url); if (username) { gtk_entry_set_text (GTK_ENTRY (self->username_entry), username); } if (password) { gtk_entry_set_text (GTK_ENTRY (self->password_entry), password); } // TRANSLATORS: label of a entry in service configuration label = gtk_label_new (_("Server address")); gtk_misc_set_alignment (GTK_MISC (label), 9.0, 0.5); gtk_widget_show (label); gtk_table_attach (GTK_TABLE (self->server_settings_table), label, 0, 1, 0, 1, GTK_FILL, GTK_EXPAND, 0, 0); self->baseurl_entry = gtk_entry_new (); gtk_entry_set_max_length (GTK_ENTRY (self->baseurl_entry), 99); gtk_entry_set_width_chars (GTK_ENTRY (self->baseurl_entry), 80); if (sync_url) { gtk_entry_set_text (GTK_ENTRY (self->baseurl_entry), sync_url); } gtk_widget_show (self->baseurl_entry); gtk_table_attach_defaults (GTK_TABLE (self->server_settings_table), self->baseurl_entry, 1, 2, 0, 1); /* update source widgets */ if (self->sources) { g_hash_table_destroy (self->sources); } self->sources = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)source_widgets_unref); self->no_source_toggles = TRUE; syncevo_config_foreach_source (self->config, (ConfigFunc)init_source, self); } /* only adds config to hashtable and combo */ static void sync_config_widget_add_config (SyncConfigWidget *self, const char *name, SyncevoConfig *config) { GtkListStore *store; GtkTreeIter iter; const char *guess_name; SyncevoConfig *guess_config; int score = 1; int guess_score, second_guess_score = -1; char *str; store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (self->combo))); if (syncevo_config_get_value (config, NULL, "score", &str)) { score = (int)strtol (str, NULL, 10); } gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, name, 1, config, 2, score, -1); /* make an educated guess if possible */ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &guess_name, 1, &guess_config, 2, &guess_score, -1); if (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)) { gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 2, &second_guess_score, -1); } if (guess_score > 1 && guess_score > second_guess_score) { gtk_combo_box_set_active (GTK_COMBO_BOX (self->combo), 0); /* TRANSLATORS: explanation before a device template combobox. * Placeholder is a device name like 'Nokia N85' or 'Syncevolution * Client' */ str = g_strdup_printf (_("This device looks like it might be a '%s'. " "If this is not correct, please take a look at " "the list of supported devices and pick yours " "if it is listed"), guess_name); } else { gtk_combo_box_set_active (GTK_COMBO_BOX (self->combo), -1); str = g_strdup (_("We don't know what this device is exactly. " "Please take a look at the list of " "supported devices and pick yours if it " "is listed")); } gtk_label_set_text (GTK_LABEL (self->device_text), str); g_free (str); } static void sync_config_widget_update_pretty_name (SyncConfigWidget *self) { self->pretty_name = NULL; if (self->config) { syncevo_config_get_value (self->config, NULL, "PeerName", &self->pretty_name); if (!self->pretty_name) { syncevo_config_get_value (self->config, NULL, "deviceName", &self->pretty_name); } } if (!self->pretty_name) { self->pretty_name = self->config_name; } } static void sync_config_widget_set_config (SyncConfigWidget *self, SyncevoConfig *config) { self->config = config; sync_config_widget_update_pretty_name (self); } static void setup_service_clicked (GtkButton *btn, SyncConfigWidget *self) { sync_config_widget_set_expanded (self, TRUE); } static void sync_config_widget_set_name (SyncConfigWidget *self, const char *name) { g_free (self->config_name); self->config_name = g_strdup (name); sync_config_widget_update_pretty_name (self); } static void device_selection_btn_clicked_cb (GtkButton *btn, SyncConfigWidget *self) { GtkTreeIter iter; if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self->combo), &iter)) { const char *name; SyncevoConfig *config; GtkTreeModel *model; self->device_template_selected = TRUE; model = gtk_combo_box_get_model(GTK_COMBO_BOX (self->combo)); gtk_tree_model_get (model, &iter, 0, &name, -1 ); gtk_tree_model_get (model, &iter, 1, &config, -1 ); sync_config_widget_set_config (self, config); sync_config_widget_update_expander (self); } } static void server_settings_notify_expand_cb (GtkExpander *expander, GParamSpec *pspec, SyncConfigWidget *self) { /* NOTE: expander can be the fake or real one... */ if (gtk_expander_get_expanded (GTK_EXPANDER (self->fake_expander))) { g_signal_handlers_disconnect_by_func (self->fake_expander, server_settings_notify_expand_cb, self); gtk_widget_hide (self->fake_expander); gtk_expander_set_expanded (GTK_EXPANDER (self->fake_expander), FALSE); gtk_expander_set_expanded (GTK_EXPANDER (self->expander), TRUE); gtk_widget_show (self->expander); g_signal_connect (self->expander, "notify::expanded", G_CALLBACK (server_settings_notify_expand_cb), self); } else { g_signal_handlers_disconnect_by_func (self->expander, server_settings_notify_expand_cb, self); gtk_widget_hide (self->expander); gtk_widget_show (self->fake_expander); g_signal_connect (self->fake_expander, "notify::expanded", G_CALLBACK (server_settings_notify_expand_cb), self); } } static GdkPixbuf* load_icon (const char *uri, guint icon_size) { GError *error = NULL; GdkPixbuf *pixbuf; const char *filename; if (uri && strlen (uri) > 0) { if (g_str_has_prefix (uri, "file://")) { filename = uri+7; } else { g_warning ("only file:// icon uri is supported: %s", uri); filename = THEMEDIR "sync-generic.png"; } } else { filename = THEMEDIR "sync-generic.png"; } pixbuf = gdk_pixbuf_new_from_file_at_scale (filename, icon_size, icon_size, TRUE, &error); if (!pixbuf) { g_warning ("Failed to load service icon: %s", error->message); g_error_free (error); return NULL; } return pixbuf; } static void sync_config_widget_update_label (SyncConfigWidget *self) { if (self->config && self->pretty_name) { char *url, *sync_url; char *str; syncevo_config_get_value (self->config, NULL, "WebURL", &url); syncevo_config_get_value (self->config, NULL, "syncURL", &sync_url); if (self->current) { str = g_strdup_printf ("%s", self->pretty_name); } else { str = g_strdup_printf ("%s", self->pretty_name); } if (g_str_has_prefix (sync_url, "obex-bt://")) { char *tmp = g_strdup_printf (_("%s - Bluetooth device"), str); g_free (str); str = tmp; } else if (!self->has_template) { /* TRANSLATORS: service title for services that are not based on a * template in service list, the placeholder is the name of the service */ char *tmp = g_strdup_printf (_("%s - manually setup"), str); g_free (str); str = tmp; } else if (url && strlen (url) > 0) { char *tmp = g_strdup_printf ("%s -",str); g_free (str); str = tmp; } gtk_label_set_markup (GTK_LABEL (self->label), str); g_free (str); } } void sync_config_widget_set_current_service_name (SyncConfigWidget *self, const char *name) { g_free (self->current_service_name); self->current_service_name = g_strdup (name); update_buttons (self); } void sync_config_widget_set_current (SyncConfigWidget *self, gboolean current) { if (self->current != current) { self->current = current; sync_config_widget_update_label (self); } } static void set_session (SyncConfigWidget *self, const char *path) { g_free (self->running_session); self->running_session = g_strdup (path); gtk_widget_set_sensitive (GTK_WIDGET (self->reset_delete_button), !self->running_session); gtk_widget_set_sensitive (GTK_WIDGET (self->use_button), !self->running_session); /* TODO: maybe add a explanation text somewhere: * "Configuration changes are not possible while a sync is in progress" */ } static void session_changed_cb (SyncevoServer *server, char *path, gboolean started, SyncConfigWidget *self) { if (started) { set_session (self, path); } else if (g_strcmp0 (self->running_session, path) == 0 ) { set_session (self, NULL); } } static void get_sessions_cb (SyncevoServer *server, SyncevoSessions *sessions, GError *error, SyncConfigWidget *self) { if (error) { g_warning ("Server.GetSessions failed: %s", error->message); g_error_free (error); /* non-fatal, ignore in UI */ g_object_unref (self); return; } set_session (self, syncevo_sessions_index (sessions, 0)); syncevo_sessions_free (sessions); g_object_unref (self); } void sync_config_widget_set_server (SyncConfigWidget *self, SyncevoServer *server) { if (self->server) { g_signal_handlers_disconnect_by_func (self->server, session_changed_cb, self); g_object_unref (self->server); self->server = NULL; } if (!server && !self->server) { return; } self->server = g_object_ref (server); /* monitor sessions so we can set editing buttons insensitive */ g_signal_connect (self->server, "session-changed", G_CALLBACK (session_changed_cb), self); /* reference is released in callback */ g_object_ref (self); syncevo_server_get_sessions (self->server, (SyncevoServerGetSessionsCb)get_sessions_cb, self); } static void sync_config_widget_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (object); switch (property_id) { case PROP_SERVER: sync_config_widget_set_server (self, g_value_get_pointer (value)); break; case PROP_NAME: sync_config_widget_set_name (self, g_value_get_string (value)); break; case PROP_CONFIG: sync_config_widget_set_config (self, g_value_get_pointer (value)); break; case PROP_CURRENT: sync_config_widget_set_current (self, g_value_get_boolean (value)); break; case PROP_HAS_TEMPLATE: sync_config_widget_set_has_template (self, g_value_get_boolean (value)); break; case PROP_CONFIGURED: sync_config_widget_set_configured (self, g_value_get_boolean (value)); break; case PROP_CURRENT_SERVICE_NAME: sync_config_widget_set_current_service_name (self, g_value_get_string (value)); break; case PROP_EXPANDED: sync_config_widget_set_expanded (self, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void sync_config_widget_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (object); switch (property_id) { case PROP_SERVER: g_value_set_pointer (value, self->server); case PROP_NAME: g_value_set_string (value, self->config_name); case PROP_CONFIG: g_value_set_pointer (value, self->config); case PROP_CURRENT: g_value_set_boolean (value, self->current); case PROP_HAS_TEMPLATE: g_value_set_boolean (value, self->has_template); case PROP_CONFIGURED: g_value_set_boolean (value, self->configured); case PROP_CURRENT_SERVICE_NAME: g_value_set_string (value, self->current_service_name); case PROP_EXPANDED: g_value_set_boolean (value, self->expanded); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } } static void sync_config_widget_dispose (GObject *object) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (object); sync_config_widget_set_server (self, NULL); if (self->config) { syncevo_config_free (self->config); } self->config = NULL; g_free (self->config_name); self->config_name = NULL; g_free (self->current_service_name); self->current_service_name = NULL; g_free (self->running_session); self->running_session = NULL; if (self->sources) { g_hash_table_destroy (self->sources); self->sources = NULL; } G_OBJECT_CLASS (sync_config_widget_parent_class)->dispose (object); } static void init_default_config (SyncConfigWidget *self) { sync_config_widget_set_name (self, ""); self->has_template = FALSE; syncevo_config_set_value (self->config, NULL, "username", ""); syncevo_config_set_value (self->config, NULL, "password", ""); syncevo_config_set_value (self->config, NULL, "syncURL", ""); syncevo_config_set_value (self->config, NULL, "WebURL", ""); syncevo_config_set_value (self->config, "memo", "uri", ""); syncevo_config_set_value (self->config, "todo", "uri", ""); syncevo_config_set_value (self->config, "addressbook", "uri", ""); syncevo_config_set_value (self->config, "calendar", "uri", ""); } static gboolean label_button_draw_cb (GtkWidget *widget, cairo_t *cr, SyncConfigWidget *self) { GtkExpanderStyle style; gint indicator_x, indicator_y; GtkAllocation alloc; gtk_widget_get_allocation (widget, &alloc); indicator_x = gtk_widget_get_style (widget)->xthickness + INDICATOR_SIZE / 2; indicator_y = gtk_widget_get_style (widget)->ythickness + alloc.height / 2; if (self->expanded) { style = GTK_EXPANDER_EXPANDED; } else { style = GTK_EXPANDER_COLLAPSED; } gtk_paint_expander (gtk_widget_get_style (widget), cr, gtk_widget_get_state (widget), GTK_WIDGET (self), NULL, indicator_x, indicator_y, style); return FALSE; } static gboolean sync_config_widget_draw (GtkWidget *widget, cairo_t *cr) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GtkAllocation alloc; gtk_widget_get_allocation (widget, &alloc); /* should really use _render_frame() ... */ gtk_paint_box (gtk_widget_get_style (widget), cr, gtk_widget_get_state (widget), GTK_SHADOW_OUT, widget, NULL, 0, 0, alloc.width, alloc.height); gtk_container_propagate_draw (GTK_CONTAINER (self), self->label_box, cr); gtk_container_propagate_draw (GTK_CONTAINER (self), self->expando_box, cr); return FALSE; } static void sync_config_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkRequisition req; GtkAllocation alloc; SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GTK_WIDGET_CLASS (sync_config_widget_parent_class)->size_allocate (widget, allocation); gtk_widget_size_request (self->label_box, &req); alloc.x = allocation->x + gtk_widget_get_style (widget)->xthickness; alloc.y = allocation->y + gtk_widget_get_style (widget)->ythickness; alloc.width = allocation->width - 2 * gtk_widget_get_style (widget)->xthickness; alloc.height = req.height; gtk_widget_size_allocate (self->label_box, &alloc); if (self->expanded) { gtk_widget_size_request (self->expando_box, &req); alloc.x = allocation->x + 2 * gtk_widget_get_style (widget)->xthickness; alloc.y = allocation->y + gtk_widget_get_style (widget)->ythickness + alloc.height + CHILD_PADDING; alloc.width = allocation->width - 4 * gtk_widget_get_style (widget)->xthickness; alloc.height = req.height; gtk_widget_size_allocate (self->expando_box, &alloc); } } static void sync_config_widget_size_request (GtkWidget *widget, GtkRequisition *requisition) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GtkRequisition req; requisition->width = gtk_widget_get_style (widget)->xthickness * 2; requisition->height = gtk_widget_get_style (widget)->ythickness * 2; gtk_widget_size_request (self->label_box, &req); requisition->width += req.width; requisition->height = MAX (req.height, INDICATOR_SIZE) + gtk_widget_get_style (widget)->ythickness * 2; if (self->expanded) { gtk_widget_size_request (self->expando_box, &req); requisition->width = MAX (requisition->width, req.width + gtk_widget_get_style (widget)->xthickness * 4); requisition->height += req.height + 2 * gtk_widget_get_style (widget)->ythickness; } } static void sync_config_widget_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width) { GtkRequisition requisition; sync_config_widget_size_request (widget, &requisition); *minimal_width = *natural_width = requisition.width; } static void sync_config_widget_get_preferred_height (GtkWidget *widget, gint *minimal_height, gint *natural_height) { GtkRequisition requisition; sync_config_widget_size_request (widget, &requisition); *minimal_height = *natural_height = requisition.height; } static GObject * sync_config_widget_constructor (GType gtype, guint n_properties, GObjectConstructParam *properties) { SyncConfigWidget *self; GObjectClass *parent_class; char *url, *icon; GdkPixbuf *buf; parent_class = G_OBJECT_CLASS (sync_config_widget_parent_class); self = SYNC_CONFIG_WIDGET (parent_class->constructor (gtype, n_properties, properties)); if (!self->config || !self->server) { g_warning ("No SyncevoServer or Syncevoconfig set for SyncConfigWidget"); return G_OBJECT (self); } if (g_strcmp0 (self->config_name, "default") == 0) { init_default_config (self); gtk_widget_show (self->entry); gtk_widget_hide (self->label); } else { gtk_widget_hide (self->entry); gtk_widget_show (self->label); } syncevo_config_get_value (self->config, NULL, "WebURL", &url); syncevo_config_get_value (self->config, NULL, "IconURI", &icon); buf = load_icon (icon, SYNC_UI_LIST_ICON_SIZE); gtk_image_set_from_pixbuf (GTK_IMAGE (self->image), buf); g_object_unref (buf); if (url && strlen (url) > 0) { gtk_link_button_set_uri (GTK_LINK_BUTTON (self->link), url); gtk_widget_show (self->link); } else { gtk_widget_hide (self->link); } sync_config_widget_update_label (self); sync_config_widget_update_expander (self); /* hack to get focus in the right place on "Setup new service" */ if (gtk_widget_get_visible (self->entry)) { gtk_widget_grab_focus (self->entry); } return G_OBJECT (self); } static void sync_config_widget_map (GtkWidget *widget) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); if (self->label_box && gtk_widget_get_visible (self->expando_box)) { gtk_widget_map (self->label_box); } if (self->expando_box && gtk_widget_get_visible (self->expando_box)) { gtk_widget_map (self->expando_box); } GTK_WIDGET_CLASS (sync_config_widget_parent_class)->map (widget); } static void sync_config_widget_unmap (GtkWidget *widget) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (widget); GTK_WIDGET_CLASS (sync_config_widget_parent_class)->unmap (widget); if (self->label_box) { gtk_widget_unmap (self->label_box); } if (self->expando_box) { gtk_widget_unmap (self->expando_box); } } static void sync_config_widget_add (GtkContainer *container, GtkWidget *widget) { g_warning ("Can't add widgets in to SyncConfigWidget!"); } static void sync_config_widget_remove (GtkContainer *container, GtkWidget *widget) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (container); if (self->label_box == widget) { gtk_widget_unparent (widget); self->label_box = NULL; } if (self->expando_box == widget) { gtk_widget_unparent (widget); self->expando_box = NULL; } } static void sync_config_widget_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { SyncConfigWidget *self = SYNC_CONFIG_WIDGET (container); if (self->label_box) { (* callback) (self->label_box, callback_data); } if (self->expando_box) { (* callback) (self->expando_box, callback_data); } } static void sync_config_widget_class_init (SyncConfigWidgetClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *w_class = GTK_WIDGET_CLASS (klass); GtkContainerClass *c_class = GTK_CONTAINER_CLASS (klass); GParamSpec *pspec; object_class->set_property = sync_config_widget_set_property; object_class->get_property = sync_config_widget_get_property; object_class->dispose = sync_config_widget_dispose; object_class->constructor = sync_config_widget_constructor; w_class->draw = sync_config_widget_draw; w_class->get_preferred_width = sync_config_widget_get_preferred_width; w_class->get_preferred_height = sync_config_widget_get_preferred_height; w_class->size_allocate = sync_config_widget_size_allocate; w_class->map = sync_config_widget_map; w_class->unmap = sync_config_widget_unmap; c_class->add = sync_config_widget_add; c_class->remove = sync_config_widget_remove; c_class->forall = sync_config_widget_forall; pspec = g_param_spec_pointer ("server", "SyncevoServer", "The SyncevoServer to use in Syncevolution DBus calls", G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_SERVER, pspec); pspec = g_param_spec_string ("name", "Configuration name", "The name of the Syncevolution service configuration", NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_NAME, pspec); pspec = g_param_spec_pointer ("config", "SyncevoConfig", "The SyncevoConfig struct this widget represents. Takes ownership.", G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CONFIG, pspec); pspec = g_param_spec_boolean ("current", "Current", "Whether the service is currently used", FALSE, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CURRENT, pspec); pspec = g_param_spec_boolean ("has-template", "has template", "Whether the service has a matching template", FALSE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_HAS_TEMPLATE, pspec); pspec = g_param_spec_boolean ("configured", "Configured", "Whether the service has a configuration already", FALSE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CONFIGURED, pspec); pspec = g_param_spec_string ("current-service-name", "Current service name", "The name of the currently used service or NULL", NULL, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_CURRENT_SERVICE_NAME, pspec); pspec = g_param_spec_boolean ("expanded", "Expanded", "Whether the expander is open or closed", FALSE, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_EXPANDED, pspec); signals[SIGNAL_CHANGED] = g_signal_new ("changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE, G_STRUCT_OFFSET (SyncConfigWidgetClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void label_enter_notify_cb (GtkWidget *widget, GdkEventCrossing *event, SyncConfigWidget *self) { if (!self->expanded) { gtk_widget_show (self->button); } gtk_widget_set_state (self->label_box, GTK_STATE_PRELIGHT); } static void label_leave_notify_cb (GtkWidget *widget, GdkEventCrossing *event, SyncConfigWidget *self) { if (event->detail != GDK_NOTIFY_INFERIOR) { gtk_widget_hide (self->button); gtk_widget_set_state (self->label_box, GTK_STATE_NORMAL); } } static void device_combo_changed (GtkComboBox *combo, SyncConfigWidget *self) { int active; active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo)); gtk_widget_set_sensitive (self->device_select_btn, active > -1); } static void label_button_release_cb (GtkWidget *widget, GdkEventButton *event, SyncConfigWidget *self) { if (event->button == 1) { sync_config_widget_set_expanded (self, !sync_config_widget_get_expanded (self)); } } static gint compare_list_items (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, SyncConfigWidget *self) { int score_a, score_b; gtk_tree_model_get(model, a, 2, &score_a, -1); gtk_tree_model_get(model, b, 2, &score_b, -1); return score_a - score_b; } static void sync_config_widget_init (SyncConfigWidget *self) { GtkWidget *tmp_box, *hbox, *cont, *vbox, *label; GtkListStore *store; GtkCellRenderer *renderer; gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); self->label_box = gtk_event_box_new (); gtk_widget_set_app_paintable (self->label_box, TRUE); gtk_widget_show (self->label_box); gtk_widget_set_parent (self->label_box, GTK_WIDGET (self)); gtk_widget_set_size_request (self->label_box, -1, SYNC_UI_LIST_ICON_SIZE + 6); g_signal_connect (self->label_box, "enter-notify-event", G_CALLBACK (label_enter_notify_cb), self); g_signal_connect (self->label_box, "leave-notify-event", G_CALLBACK (label_leave_notify_cb), self); g_signal_connect (self->label_box, "button-release-event", G_CALLBACK (label_button_release_cb), self); g_signal_connect (self->label_box, "draw", G_CALLBACK (label_button_draw_cb), self); hbox = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox); gtk_container_add (GTK_CONTAINER (self->label_box), hbox); self->image = gtk_image_new (); /* leave room for drawing the expander indicator in expose handler */ gtk_widget_set_size_request (self->image, SYNC_UI_LIST_ICON_SIZE + INDICATOR_SIZE, SYNC_UI_LIST_ICON_SIZE); gtk_misc_set_alignment (GTK_MISC (self->image), 1.0, 0.5); gtk_widget_show (self->image); gtk_box_pack_start (GTK_BOX (hbox), self->image, FALSE, FALSE, 8); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (hbox), tmp_box, FALSE, FALSE, 8); self->label = gtk_label_new (""); gtk_label_set_max_width_chars (GTK_LABEL (self->label), 60); gtk_label_set_ellipsize (GTK_LABEL (self->label), PANGO_ELLIPSIZE_END); gtk_misc_set_alignment (GTK_MISC (self->label), 0.0, 0.5); gtk_widget_show (self->label); gtk_box_pack_start (GTK_BOX (tmp_box), self->label, FALSE, FALSE, 0); self->entry = gtk_entry_new (); gtk_widget_set_no_show_all (self->entry, TRUE); gtk_box_pack_start (GTK_BOX (tmp_box), self->entry, FALSE, FALSE, 4); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (tmp_box), vbox, FALSE, FALSE, 0); /* TRANSLATORS: link button in service configuration form */ self->link = gtk_link_button_new_with_label ("", _("Launch website")); gtk_widget_set_no_show_all (self->link, TRUE); gtk_box_pack_start (GTK_BOX (vbox), self->link, TRUE, FALSE, 0); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); gtk_box_pack_end (GTK_BOX (hbox), vbox, FALSE, FALSE, 32); /* TRANSLATORS: button in service configuration form */ self->button = gtk_button_new_with_label (_("Set up now")); gtk_widget_set_size_request (self->button, SYNC_UI_LIST_BTN_WIDTH, -1); g_signal_connect (self->button, "clicked", G_CALLBACK (setup_service_clicked), self); gtk_box_pack_start (GTK_BOX (vbox), self->button, TRUE, FALSE, 0); /* label_box built, now build expando_box */ self->expando_box = gtk_hbox_new (FALSE, 0); gtk_widget_set_no_show_all (self->expando_box, TRUE); gtk_widget_set_parent (self->expando_box, GTK_WIDGET (self)); self->device_selector_box = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (self->expando_box), self->device_selector_box, TRUE, TRUE, 16); hbox = gtk_hbox_new (FALSE, 8); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (self->device_selector_box), hbox, FALSE, TRUE, 8); self->device_text = gtk_label_new (_("We don't know what this device is exactly. " "Please take a look at the list of " "supported devices and pick yours if it " "is listed")); gtk_widget_show (self->device_text); gtk_label_set_line_wrap (GTK_LABEL (self->device_text), TRUE); gtk_widget_set_size_request (self->device_text, 600, -1); gtk_box_pack_start (GTK_BOX (hbox), self->device_text, FALSE, TRUE, 0); hbox = gtk_hbox_new (FALSE, 16); gtk_widget_show (hbox); gtk_box_pack_start (GTK_BOX (self->device_selector_box), hbox, FALSE, TRUE, 16); store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store), 2, GTK_SORT_DESCENDING); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (store), 2, (GtkTreeIterCompareFunc)compare_list_items, NULL, NULL); self->combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); g_object_unref (G_OBJECT (store)); gtk_widget_set_size_request (self->combo, 200, -1); gtk_widget_show (self->combo); gtk_box_pack_start (GTK_BOX (hbox), self->combo, FALSE, TRUE, 0); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(self->combo), renderer, TRUE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(self->combo), renderer, "text", 0, NULL); g_signal_connect (self->combo, "changed", G_CALLBACK (device_combo_changed), self); self->device_select_btn = gtk_button_new_with_label (_("Use these settings")); gtk_widget_set_sensitive (self->device_select_btn, FALSE); gtk_widget_show (self->device_select_btn); gtk_box_pack_start (GTK_BOX (hbox), self->device_select_btn, FALSE, TRUE, 0); g_signal_connect (self->device_select_btn, "clicked", G_CALLBACK (device_selection_btn_clicked_cb), self); /* settings_box has normal expander contents */ self->settings_box = gtk_vbox_new (FALSE, 0); gtk_widget_show (self->settings_box); gtk_box_pack_start (GTK_BOX (self->expando_box), self->settings_box, TRUE, TRUE, 16); vbox = gtk_vbox_new (FALSE, 8); gtk_widget_show (vbox); gtk_box_pack_start (GTK_BOX (self->settings_box), vbox, TRUE, TRUE, 0); tmp_box = gtk_vbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (vbox), tmp_box, FALSE, FALSE, 8); self->description_label = gtk_label_new (""); gtk_misc_set_alignment (GTK_MISC (self->description_label), 0.0, 0.5); gtk_widget_set_size_request (self->description_label, 700, -1); gtk_label_set_line_wrap (GTK_LABEL (self->description_label), TRUE); gtk_box_pack_start (GTK_BOX (tmp_box), self->description_label, FALSE, FALSE, 0); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (vbox), tmp_box, FALSE, FALSE, 0); self->userinfo_table = gtk_table_new (4, 2, FALSE); gtk_table_set_row_spacings (GTK_TABLE (self->userinfo_table), 2); gtk_table_set_col_spacings (GTK_TABLE (self->userinfo_table), 5); gtk_widget_show (self->userinfo_table); gtk_box_pack_start (GTK_BOX (tmp_box), self->userinfo_table, FALSE, FALSE, 0); /* TRANSLATORS: labels of entries in service configuration form */ label = gtk_label_new (_("Username")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), label, 0, 1, 0, 1); self->username_entry = gtk_entry_new (); gtk_widget_show (self->username_entry); gtk_entry_set_width_chars (GTK_ENTRY (self->username_entry), 40); gtk_entry_set_max_length (GTK_ENTRY (self->username_entry), 99); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), self->username_entry, 1, 2, 0, 1); label = gtk_label_new (_("Password")); gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); gtk_widget_show (label); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), label, 0, 1, 1, 2); self->password_entry = gtk_entry_new (); gtk_widget_show (self->password_entry); gtk_entry_set_width_chars (GTK_ENTRY (self->password_entry), 40); gtk_entry_set_visibility (GTK_ENTRY (self->password_entry), FALSE); gtk_entry_set_max_length (GTK_ENTRY (self->password_entry), 99); gtk_table_attach_defaults (GTK_TABLE (self->userinfo_table), self->password_entry, 1, 2, 1, 2); self->complex_config_info_bar = gtk_info_bar_new (); gtk_info_bar_set_message_type (GTK_INFO_BAR (self->complex_config_info_bar), GTK_MESSAGE_WARNING); gtk_box_pack_start (GTK_BOX (vbox), self->complex_config_info_bar, FALSE, FALSE, 0); /* TRANSLATORS: warning in service configuration form for people who have modified the configuration via other means. */ label = gtk_label_new (_("Current configuration is more complex " "than what can be shown here. Changes to sync " "mode or synced data types will overwrite that " "configuration.")); gtk_widget_set_size_request (label, 600, -1); gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_widget_show (label); cont = gtk_info_bar_get_content_area ( GTK_INFO_BAR (self->complex_config_info_bar)); gtk_container_add (GTK_CONTAINER (cont), label); self->mode_table = gtk_table_new (4, 1, FALSE); gtk_table_set_row_spacings (GTK_TABLE (self->mode_table), 2); gtk_table_set_col_spacings (GTK_TABLE (self->mode_table), 5); gtk_widget_show (self->mode_table); gtk_box_pack_start (GTK_BOX (vbox), self->mode_table, FALSE, FALSE, 0); /* TRANSLATORS: this is the epander label for server settings in service configuration form */ self->expander = gtk_expander_new (_("Hide server settings")); gtk_box_pack_start (GTK_BOX (vbox), self->expander, FALSE, FALSE, 8); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_container_add (GTK_CONTAINER (self->expander), tmp_box); self->server_settings_table = gtk_table_new (1, 1, FALSE); gtk_table_set_row_spacings (GTK_TABLE (self->server_settings_table), 2); gtk_table_set_col_spacings (GTK_TABLE (self->server_settings_table), 5); gtk_widget_show (self->server_settings_table); gtk_box_pack_start (GTK_BOX (tmp_box), self->server_settings_table, FALSE, FALSE, 0); tmp_box = gtk_hbox_new (FALSE, 0); gtk_widget_show (tmp_box); gtk_box_pack_start (GTK_BOX (vbox), tmp_box, FALSE, FALSE, 8); /* TRANSLATORS: this is the epander label for server settings in service configuration form */ self->fake_expander = gtk_expander_new (_("Show server settings")); gtk_widget_show (self->fake_expander); gtk_box_pack_start (GTK_BOX (tmp_box), self->fake_expander, FALSE, FALSE, 0); g_signal_connect (self->fake_expander, "notify::expanded", G_CALLBACK (server_settings_notify_expand_cb), self); self->use_button = gtk_button_new (); gtk_widget_show (self->use_button); gtk_box_pack_end (GTK_BOX (tmp_box), self->use_button, FALSE, FALSE, 8); g_signal_connect (self->use_button, "clicked", G_CALLBACK (use_clicked_cb), self); self->stop_button = gtk_button_new (); gtk_box_pack_end (GTK_BOX (tmp_box), self->stop_button, FALSE, FALSE, 8); g_signal_connect (self->stop_button, "clicked", G_CALLBACK (stop_clicked_cb), self); self->reset_delete_button = gtk_button_new (); gtk_widget_show (self->reset_delete_button); gtk_box_pack_end (GTK_BOX (tmp_box), self->reset_delete_button, FALSE, FALSE, 8); g_signal_connect (self->reset_delete_button, "clicked", G_CALLBACK (reset_delete_clicked_cb), self); } GtkWidget* sync_config_widget_new (SyncevoServer *server, const char *name, SyncevoConfig *config, gboolean current, const char *current_service_name, gboolean configured, gboolean has_template) { return g_object_new (SYNC_TYPE_CONFIG_WIDGET, "server", server, "name", name, "config", config, "current", current, "current-service-name", current_service_name, "configured", configured, "has-template", has_template, NULL); } void sync_config_widget_set_expanded (SyncConfigWidget *self, gboolean expanded) { g_return_if_fail (SYNC_IS_CONFIG_WIDGET (self)); if (self->expanded != expanded) { self->expanded = expanded; if (self->expanded) { gtk_widget_hide (self->button); gtk_widget_show (self->expando_box); if (gtk_widget_get_visible (self->entry)) { gtk_widget_grab_focus (self->entry); } else { gtk_widget_grab_focus (self->username_entry); } } else { gtk_widget_show (self->button); gtk_widget_hide (self->expando_box); } g_object_notify (G_OBJECT (self), "expanded"); } } gboolean sync_config_widget_get_expanded (SyncConfigWidget *self) { return self->expanded; } void sync_config_widget_set_has_template (SyncConfigWidget *self, gboolean has_template) { if (self->has_template != has_template) { self->has_template = has_template; update_buttons (self); sync_config_widget_update_label (self); } } gboolean sync_config_widget_get_has_template (SyncConfigWidget *self) { return self->has_template; } void sync_config_widget_set_configured (SyncConfigWidget *self, gboolean configured) { if (self->configured != configured) { self->configured = configured; self->device_template_selected = configured; update_buttons (self); } } gboolean sync_config_widget_get_configured (SyncConfigWidget *self) { return self->configured; } gboolean sync_config_widget_get_current (SyncConfigWidget *widget) { return widget->current; } const char* sync_config_widget_get_name (SyncConfigWidget *widget) { return widget->config_name; } void sync_config_widget_add_alternative_config (SyncConfigWidget *self, const char *template_name, SyncevoConfig *config, gboolean configured) { sync_config_widget_add_config (self, template_name, config); if (configured) { sync_config_widget_set_config (self, config); sync_config_widget_set_configured (self, TRUE); } sync_config_widget_update_expander (self); } syncevolution-1.5/src/gtk3-ui/sync-config-widget.h0000644000373300001540000000763412326412403023450 0ustar00nightlynightly00000000000000#ifndef _SYNC_CONFIG_WIDGET #define _SYNC_CONFIG_WIDGET #include #include #include "syncevo-server.h" G_BEGIN_DECLS #define SYNC_TYPE_CONFIG_WIDGET sync_config_widget_get_type() #define SYNC_CONFIG_WIDGET(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidget)) #define SYNC_CONFIG_WIDGET_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidgetClass)) #define SYNC_IS_CONFIG_WIDGET(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SYNC_TYPE_CONFIG_WIDGET)) #define SYNC_IS_CONFIG_WIDGET_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), SYNC_TYPE_CONFIG_WIDGET)) #define SYNC_CONFIG_WIDGET_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), SYNC_TYPE_CONFIG_WIDGET, SyncConfigWidgetClass)) typedef struct { GtkContainer parent; GtkWidget *expando_box; GtkWidget *label_box; GtkWidget *device_selector_box; GtkWidget *device_text; GtkWidget *combo; GtkWidget *device_select_btn; GtkWidget *settings_box; gboolean current; /* is this currently used config */ char *current_service_name; /* name of the current service */ gboolean configured; /* actual service configuration exists on server */ gboolean device_template_selected; gboolean has_template; /* this service configuration has a matching template */ gboolean expanded; SyncevoServer *server; SyncevoConfig *config; GHashTable *configs; /* possible configs. config above is one of these */ char *config_name; char *pretty_name; char *running_session; char *expand_id; /* label */ GtkWidget *image; GtkWidget *label; GtkWidget *entry; GtkWidget *link; GtkWidget *button; /* content */ GtkWidget *description_label; GtkWidget *userinfo_table; GtkWidget *name_label; GtkWidget *name_entry; GtkWidget *complex_config_info_bar; GtkWidget *mode_table; GtkWidget *send_check; GtkWidget *receive_check; GtkWidget *username_entry; GtkWidget *password_entry; GtkWidget *source_toggle_label; GtkWidget *baseurl_entry; GtkWidget *expander; GtkWidget *fake_expander; GtkWidget *server_settings_table; GtkWidget *reset_delete_button; GtkWidget *stop_button; GtkWidget *use_button; GHashTable *sources; /* key is source name, value is source_widgets */ gboolean mode_changed; gboolean no_source_toggles; } SyncConfigWidget; typedef struct { GtkContainerClass parent_class; void (*changed) (SyncConfigWidget *widget); } SyncConfigWidgetClass; GType sync_config_widget_get_type (void); GtkWidget *sync_config_widget_new (SyncevoServer *server, const char *name, SyncevoConfig *config, gboolean current, const char *current_service_name, gboolean configured, gboolean has_template); void sync_config_widget_set_expanded (SyncConfigWidget *widget, gboolean expanded); gboolean sync_config_widget_get_expanded (SyncConfigWidget *widget); gboolean sync_config_widget_get_current (SyncConfigWidget *widget); void sync_config_widget_set_current (SyncConfigWidget *self, gboolean current); void sync_config_widget_set_has_template (SyncConfigWidget *self, gboolean has_template); gboolean sync_config_widget_get_has_template (SyncConfigWidget *self); void sync_config_widget_set_configured (SyncConfigWidget *self, gboolean configured); gboolean sync_config_widget_get_configured (SyncConfigWidget *self); const char *sync_config_widget_get_name (SyncConfigWidget *widget); void sync_config_widget_expand_id (SyncConfigWidget *self, const char *id); void sync_config_widget_add_alternative_config (SyncConfigWidget *self, const char *name, SyncevoConfig *config, gboolean configured); G_END_DECLS #endif syncevolution-1.5/src/gtk3-ui/ui.xml0000644000373300001540000030203712326412403020731 0ustar00nightlynightly00000000000000 1024 False 5 Sync Emergency True 800 550 True sync_win True False 4 True False 0 none True True never True False queue True False True False 8 True False 8 800 True False 0 If something has gone horribly wrong you can try a slow sync, start from scratch or restore from backup. True False True 0 True True True False 0 20 True False 2 Calendar False True True False False True Tasks False True True False False True 1 2 True False Affected data: False True 1 False True 8 0 True False 5 True False 0 <big>Slow sync</big> True False True 0 True False 0 0 0 40 40 True False 6 False True True True False True False 16 Slow sync True True 0 True False 8 A slow sync compares items from both sides and tries to merge them. This may fail in some cases, leading to duplicates or lost information. True True 1 False True 1 False True 8 1 True False 5 True False 0 <big>Start from scratch</big> True False True 0 True False 0 0 0 40 40 True False False True True True False True False 16 Delete all your local information and replace with data from Zyb False True 0 True False 15 <b>or</b> True False False 1 False True True True False True False 16 Delete all data on Zyb and replace with your local information False True 2 False True 1 False True 8 2 True False 5 True False 0 <big>Restore from backup</big> True False True 0 True False queue 40 40 True False 800 True False 0 Backups are made before every time we Sync. Choose a backup to restore. Any changes you have made since then will be lost. True False False 0 True True True False queue True False 10 2 16 True False 0 5 Backup before syncing Dec 5th 2009 16:35 2 3 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 5th 2009 13:35 3 4 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 5th 2009 11:35 4 5 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 3rd 5 6 GTK_FILL GTK_FILL True False 0 5 Backup before syncing Dec 1st 6 7 GTK_FILL GTK_FILL True False 0 5 Backup before syncing yesterday 1 2 GTK_FILL GTK_FILL True False 0 5 Backup before syncing two hours ago GTK_FILL Restore False True True True False 1 2 GTK_FILL GTK_FILL 16 True True 1 True True 1 True True 8 3 False True 40 0 True False True True True 0 True False Close False True True True False False True 12 end 0 False True 1 1024 False 5 Settings True 800 550 True sync_win True False 4 True False 0 none True True never True False queue True False True False 12 36 12 True False 12 True False 5 True False 0 <big>Network sync</big> True False True 0 True False True False To sync you'll need a network connection and an account with a sync service. We support the following services: False True 0 False True 1 300 True True in True False queue True False True True 2 True False True False 0 If you don't see your service above but know that your sync provider uses SyncML you can setup a service manually. True True 0 Add new service False 150 True True True False False True 8 1 False False 3 True True 8 0 400 True False 5 True False 0 <big>Direct sync</big> True False True 0 True False True False Use Bluetooth to Sync your data from one device to another. False True 0 False True 1 300 True True in True False queue True False True True 2 True False True False 0 You will need to add Bluetooth devices before they can be synced. True True 0 Add new device False 150 True True False False True 8 1 False False 3 True True 1 True True 0 True False True True True 6 0 True False Close False True True True False False True 12 end 0 False True 1 1024 False Sync 800 550 True False True False 4 4 True False True False 0 none True False True False 48 48 True False True False gtk-missing-image 6 True True 0 False True 10 0 True False 0 0.20000000298023224 True end 42 False True 5 1 True False 6 4 False False 8 end 2 False True 16 0 True False True False True False True False True False True False False True 0 False True False 0 none True False 5 12 True False False False 0 False True 1 True True 55 0 False False 6 0 False True 0 False True 1 True False True True True 0 True True 0 250 True False 5 True False True False 0 in True False True False True False True False 0 False False 6 0 24 True False True False gtk-missing-image False True 0 False True 1 False True 0 False True 10 0 True False True False 10 True False 0 <b>Actions</b> True False True 0 Sync now False True True True False False False 1 False True True True False True False Change or edit sync service center False False 2 Fix a sync emergency False True True True False False False 3 True True 30 0 False False 20 1 True False True False False False True 0 False True 5 0 False False 5 2 25 True False False end True True 5 end 0 False False 3 True False True True True 0 True True 0 False False end 1 True True 0 syncevolution-1.5/src/syncevo/0000755000373300037200000000000012424707642020161 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/0000755000373300037200000000000012424707641021610 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/datatypes/0000755000373300037200000000000012424707641023606 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/datatypes/server/0000755000373300037200000000000012424707641025114 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/datatypes/server/40email-fieldlist.xml0000644000373300001540000000262412326412403030662 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/server/41email-profile.xml0000644000373300001540000000553612326412403030351 0ustar00nightlynightly00000000000000 true 100 ATT_COUNT ATT_MIMETYPES ATT_CONTENTS ATT_SIZES ATT_NAMES LIMIT From: rfc2047 true FROM To: rfc2047 true TO Cc: rfc2047 true CC Bcc: rfc2047 true BCC Reply-To: rfc2047 true Subject: rfc2047 true SUBJECT X-Priority: true date Date: true Status: true X-Sync-Parent-Folder: true X-Sync-Message-Read: true X-Sync-Lastmodified: true body 0 false true syncevolution-1.5/src/syncevo/configs/datatypes/server/42email-type-zipped.xml0000644000373300001540000000273112326412403031156 0ustar00nightlynightly00000000000000 application/x-zip-message 1.1 yes yes 9 syncevolution-1.5/src/syncevo/configs/datatypes/server/42email-type.xml0000644000373300001540000000135412326412403027665 0ustar00nightlynightly00000000000000 text/message 1.0 syncevolution-1.5/src/syncevo/configs/datatypes/server/43email-sonyericsson.xml0000644000373300001540000000140112326412403031434 0ustar00nightlynightly00000000000000 message/rfc822 1.0 syncevolution-1.5/src/syncevo/configs/datatypes/server/44email-nokia9500.xml0000644000373300001540000001172012326412403030323 0ustar00nightlynightly00000000000000 message/x-rfc822 1.0 SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); } // make sure we never overwrite a body in the inbox BODY = UNASSIGNED; // delete always wins over replace in inbox (to avoid adds to inbox) DELETEWINS(); } } } else if (UPPERCASE(FOLDER)=="OUTBOX") { // never try to change something in outbox IGNOREUPDATE(); if (SYNCOP()!="delete") { // - date of mail is NOW, set it such that a correct date is written to the DB MAILDATE = DBNOW(); // MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted // - echo item as delete (this causes that it is moved to the "sent" folder in the 9500) ECHOITEM("delete"); } CONFLICTSTRATEGY("client-wins"); } else { // Other folder // - silently discard incoming item for other folder than the above // except if it is a delete if (SYNCOP()!="delete") REJECTITEM(0); } ]]> =STARTDATE(); RETURN PASSES; ]]> syncevolution-1.5/src/syncevo/configs/datatypes/00vcard-fieldlist.xml0000664000373300001540000002072112336456617027400 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/01vcard-profile.xml0000664000373300001540000005305012336456617027063 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/02vcard-types.xml0000644000373300001540000000550712360740724026562 0ustar00nightlynightly00000000000000 2.1 3.0 2.1 3.0 syncevolution-1.5/src/syncevo/configs/datatypes/10calendar-fieldlist.xml0000644000373300001540000001103012326412403030022 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/11calendar-profile.xml0000644000373300001540000007575212326412403027531 0ustar00nightlynightly00000000000000 current olson 1 false true SUMMARY 0 false true syncevolution-1.5/src/syncevo/configs/datatypes/12calendar-types.xml0000664000373300001540000000327412405555067027242 0ustar00nightlynightly00000000000000 1.0 2.0 text/plain 1.0 text/plain 1.1 syncevolution-1.5/src/syncevo/configs/datatypes/20note-fieldlist.xml0000644000373300001540000000047712326412403027234 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/21note-profile.xml0000644000373300001540000000064112326412403026707 0ustar00nightlynightly00000000000000 1 false true SUBJECT 0 false true syncevolution-1.5/src/syncevo/configs/datatypes/22notes-types.xml0000644000373300001540000000053212326412403026576 0ustar00nightlynightly00000000000000 text/plain 1.0 text/plain 1.1 syncevolution-1.5/src/syncevo/configs/datatypes/30bookmark-fieldlist.xml0000644000373300001540000000134212326412403030065 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/31bookmark-profile.xml0000644000373300001540000000176012326412403027553 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/32bookmark-type.xml0000644000373300001540000000040712326412403027072 0ustar00nightlynightly00000000000000 text/x-vbookmark 1.0 syncevolution-1.5/src/syncevo/configs/datatypes/40raw-fieldlist.xml0000664000373300001540000000026212405555067027070 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/datatypes/42-raw-types.xml0000664000373300001540000000054512405555067026340 0ustar00nightlynightly00000000000000 text/vcard 3.0 text/calendar 2.0 syncevolution-1.5/src/syncevo/configs/debug/0000755000373300037200000000000012424707641022676 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/debug/00default.xml0000644000373300001540000000631412326412403025020 0ustar00nightlynightly00000000000000 buffered yes html auto yes no yes separate no no no no syncevolution-1.5/src/syncevo/configs/remoterules/0000755000373300037200000000000012424707641024156 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/remoterules/client/0000755000373300037200000000000012424707641025434 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/remoterules/client/00zyb.xml0000644000373300001540000000033712326412403026735 0ustar00nightlynightly00000000000000 ZYB ZYB yes syncevolution-1.5/src/syncevo/configs/remoterules/client/01mobical.xml0000644000373300001540000000037112326412403027536 0ustar00nightlynightly00000000000000 Tactel AB Mobical Sync Server syncevolution-1.5/src/syncevo/configs/remoterules/client/02google-contacts.xml0000644000373300001540000001547512326412403031234 0ustar00nightlynightly00000000000000 Google sync 1.2 Google Sync - 0.01 - Google server contacts contacts 32 text/x-vcard 2.1 text/x-vcard 2.1 text/x-vcard 2.1 BEGINVCARD ENDVCARD VERSION 2.1 1 REV1 N1 FN1 TITLE1 ORG1 TEL TYPE HOME WORK VOICE CELL FAX PAGER PREF CAR EMAIL TYPE HOME WORK INTERNET ADR TYPE HOME WORK NOTE1 PHOTO 1 TYPE JPEG 1 2 ]]> syncevolution-1.5/src/syncevo/configs/remoterules/client/03funambol.xml0000644000373300001540000000034412326412403027735 0ustar00nightlynightly00000000000000 Funambol DS Server* syncevolution-1.5/src/syncevo/configs/remoterules/server/0000755000373300037200000000000012424707641025464 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/remoterules/server/00_nokia.xml0000644000373300001540000000173712326412403027426 0ustar00nightlynightly00000000000000 NOKIA no yes syncevolution-1.5/src/syncevo/configs/remoterules/server/00_sony_ericsson.xml0000644000373300001540000000106512326412403031214 0ustar00nightlynightly00000000000000 SonyEricsson no ISO-8859-1 ISO-8859-1 syncevolution-1.5/src/syncevo/configs/remoterules/server/00_t39m.xml0000644000373300001540000000047612326412403027120 0ustar00nightlynightly00000000000000 Ericsson R1A yes ANSI Ericsson T39m syncevolution-1.5/src/syncevo/configs/remoterules/server/01_t68.xml0000644000373300001540000000047312326412403026743 0ustar00nightlynightly00000000000000 Ericsson R1B yes ANSI Ericsson T68 syncevolution-1.5/src/syncevo/configs/remoterules/server/02_V3.xml0000644000373300001540000000066312326412403026614 0ustar00nightlynightly00000000000000 Motorola* V3 yes yes yes ANSI ANSI Motorola V3 syncevolution-1.5/src/syncevo/configs/remoterules/server/03_V3i.xml0000644000373300001540000000061712326412403026765 0ustar00nightlynightly00000000000000 Motorola* V3i yes yes yes ANSI Motorola V3i syncevolution-1.5/src/syncevo/configs/remoterules/server/04_6230.xml0000644000373300001540000000041112326412403026707 0ustar00nightlynightly00000000000000 NOKIA 6230 yes yes Nokia 6230 syncevolution-1.5/src/syncevo/configs/remoterules/server/05_9210.xml0000644000373300001540000000052712326412403026721 0ustar00nightlynightly00000000000000 NOKIA 9210 yes Nokia 9210 syncevolution-1.5/src/syncevo/configs/remoterules/server/06_9210i.xml0000644000373300001540000000053112326412403027066 0ustar00nightlynightly00000000000000 NOKIA 9210i yes Nokia 9210 syncevolution-1.5/src/syncevo/configs/remoterules/server/07_3220.xml0000644000373300001540000000061412326412403026713 0ustar00nightlynightly00000000000000 NOKIA 3220 yes yes Nokia 3220 syncevolution-1.5/src/syncevo/configs/remoterules/server/08_3230.xml0000644000373300001540000000061412326412403026715 0ustar00nightlynightly00000000000000 NOKIA 3230 yes yes Nokia 3230 syncevolution-1.5/src/syncevo/configs/remoterules/server/09_3600.xml0000644000373300001540000000061412326412403026717 0ustar00nightlynightly00000000000000 NOKIA 3600 yes yes Nokia 3600 syncevolution-1.5/src/syncevo/configs/remoterules/server/10_3620.xml0000644000373300001540000000061412326412403026711 0ustar00nightlynightly00000000000000 NOKIA 3620 yes yes Nokia 3620 syncevolution-1.5/src/syncevo/configs/remoterules/server/11_3650.xml0000644000373300001540000000061412326412403026715 0ustar00nightlynightly00000000000000 NOKIA 3650 yes yes Nokia 3650 syncevolution-1.5/src/syncevo/configs/remoterules/server/12_3660.xml0000644000373300001540000000061412326412403026717 0ustar00nightlynightly00000000000000 NOKIA 3660 yes yes Nokia 3660 syncevolution-1.5/src/syncevo/configs/remoterules/server/13_6260.xml0000644000373300001540000000061412326412403026717 0ustar00nightlynightly00000000000000 NOKIA 6260 yes yes Nokia 6260 syncevolution-1.5/src/syncevo/configs/remoterules/server/14_6600.xml0000644000373300001540000000061412326412403026716 0ustar00nightlynightly00000000000000 NOKIA 6600 yes yes Nokia 6600 syncevolution-1.5/src/syncevo/configs/remoterules/server/15_6620.xml0000644000373300001540000000061412326412403026721 0ustar00nightlynightly00000000000000 NOKIA 6620 yes yes Nokia 6620 syncevolution-1.5/src/syncevo/configs/remoterules/server/16_6630.xml0000644000373300001540000000061412326412403026723 0ustar00nightlynightly00000000000000 NOKIA 6630 yes yes Nokia 6630 syncevolution-1.5/src/syncevo/configs/remoterules/server/17_6670.xml0000644000373300001540000000061412326412403026730 0ustar00nightlynightly00000000000000 NOKIA 6670 yes yes Nokia 6670 syncevolution-1.5/src/syncevo/configs/remoterules/server/18_7250.xml0000644000373300001540000000061412326412403026724 0ustar00nightlynightly00000000000000 NOKIA 7250 yes yes Nokia 7250 syncevolution-1.5/src/syncevo/configs/remoterules/server/19_7250i.xml0000644000373300001540000000061712326412403027101 0ustar00nightlynightly00000000000000 NOKIA 7250i yes yes Nokia 7250i syncevolution-1.5/src/syncevo/configs/remoterules/server/20_7260.xml0000644000373300001540000000061412326412403026716 0ustar00nightlynightly00000000000000 NOKIA 7260 yes yes Nokia 7260 syncevolution-1.5/src/syncevo/configs/remoterules/server/21_7610.xml0000644000373300001540000000061412326412403026716 0ustar00nightlynightly00000000000000 NOKIA 7610 yes yes Nokia 7610 syncevolution-1.5/src/syncevo/configs/remoterules/server/22_7650.xml0000644000373300001540000000061412326412403026723 0ustar00nightlynightly00000000000000 NOKIA 7650 yes yes Nokia 7650 syncevolution-1.5/src/syncevo/configs/remoterules/server/23_N-Gage.xml0000644000373300001540000000062212326412403027360 0ustar00nightlynightly00000000000000 NOKIA N-Gage yes yes Nokia N-Gage syncevolution-1.5/src/syncevo/configs/remoterules/server/24_N-Gage_QD.xml0000644000373300001540000000063312326412403027747 0ustar00nightlynightly00000000000000 NOKIA N-Gage QD yes yes Nokia N-Gage QD syncevolution-1.5/src/syncevo/configs/remoterules/server/25_9300.xml0000644000373300001540000000065112326412403026721 0ustar00nightlynightly00000000000000 NOKIA 9300 yes yes Nokia 9300 syncevolution-1.5/src/syncevo/configs/remoterules/server/26_9500.xml0000644000373300001540000000065112326412403026724 0ustar00nightlynightly00000000000000 NOKIA 9500 yes yes Nokia 9500 syncevolution-1.5/src/syncevo/configs/remoterules/server/27_E90.xml0000644000373300001540000000053612326412403026667 0ustar00nightlynightly00000000000000 NOKIA E90 yes Nokia E90 syncevolution-1.5/src/syncevo/configs/remoterules/server/28_X.xml0000644000373300001540000000060312326412403026535 0ustar00nightlynightly00000000000000 Sendo X yes yes Sendo X syncevolution-1.5/src/syncevo/configs/remoterules/server/29_SX1.xml0000644000373300001540000000100112326412403026733 0ustar00nightlynightly00000000000000 SIEMENS SX1 yes yes yes Siemens SX1 syncevolution-1.5/src/syncevo/configs/remoterules/server/30_M55.xml0000644000373300001540000000041212326412403026663 0ustar00nightlynightly00000000000000 SIEMENS M55 yes yes Siemens M55 syncevolution-1.5/src/syncevo/configs/remoterules/server/31_SL55.xml0000644000373300001540000000041512326412403027011 0ustar00nightlynightly00000000000000 SIEMENS SL55 yes yes Siemens SL55 syncevolution-1.5/src/syncevo/configs/remoterules/server/32_S55.xml0000644000373300001540000000041212326412403026673 0ustar00nightlynightly00000000000000 SIEMENS S55 yes yes Siemens S55 syncevolution-1.5/src/syncevo/configs/remoterules/server/33_S65.xml0000644000373300001540000000041212326412403026675 0ustar00nightlynightly00000000000000 SIEMENS S65 yes yes Siemens S65 syncevolution-1.5/src/syncevo/configs/remoterules/server/34_SL65.xml0000644000373300001540000000041512326412403027015 0ustar00nightlynightly00000000000000 SIEMENS SL65 yes yes Siemens SL65 syncevolution-1.5/src/syncevo/configs/remoterules/server/35_K700.xml0000644000373300001540000000072712326412403026754 0ustar00nightlynightly00000000000000 SonyEricsson SEMC Phone R3B yes SonyEricsson K700 syncevolution-1.5/src/syncevo/configs/remoterules/server/36_T610_T630.xml0000644000373300001540000000210712326412403027474 0ustar00nightlynightly00000000000000 SonyEricsson R2B yes SonyEricsson T610/T630 syncevolution-1.5/src/syncevo/configs/remoterules/server/37_M600i.xml0000644000373300001540000000255312326412403027127 0ustar00nightlynightly00000000000000 Sony Ericsson M600i no yes SonyEricsson M600i syncevolution-1.5/src/syncevo/configs/remoterules/server/38_P800.xml0000644000373300001540000000255012326412403026761 0ustar00nightlynightly00000000000000 Sony Ericsson P800 no yes SonyEricsson P800 syncevolution-1.5/src/syncevo/configs/remoterules/server/39_P900.xml0000644000373300001540000000255012326412403026763 0ustar00nightlynightly00000000000000 Sony Ericsson P900 no yes SonyEricsson P900 syncevolution-1.5/src/syncevo/configs/remoterules/server/40_P910.xml0000644000373300001540000000255512326412403026761 0ustar00nightlynightly00000000000000 Sony Ericsson P910 no yes SonyEricsson P910 syncevolution-1.5/src/syncevo/configs/remoterules/server/41_P910i.xml0000644000373300001540000000256012326412403027127 0ustar00nightlynightly00000000000000 Sony Ericsson P910i no yes SonyEricsson P910i syncevolution-1.5/src/syncevo/configs/remoterules/server/42_P990i.xml0000644000373300001540000000113212326412403027132 0ustar00nightlynightly00000000000000 Sony Ericsson P990i no yes SonyEricsson P990i syncevolution-1.5/src/syncevo/configs/remoterules/server/43_t68i.xml0000644000373300001540000000051212326412403027114 0ustar00nightlynightly00000000000000 SonyEricsson R2A yes ANSI SonyEricsson T68i syncevolution-1.5/src/syncevo/configs/remoterules/server/44_Funambol_Outlook.xml0000644000373300001540000000051412326412403031604 0ustar00nightlynightly00000000000000 Funambol Outlook Sync Client yes Funambol Outlook Sync Client syncevolution-1.5/src/syncevo/configs/remoterules/server/45_N7210c.xml0000644000373300001540000000043212326412403027177 0ustar00nightlynightly00000000000000 NOKIA Nokia 7210c Nokia 7210c yes yes syncevolution-1.5/src/syncevo/configs/remoterules/server/45_SyncJe_Outlook.xml0000644000373300001540000000051112326412403031232 0ustar00nightlynightly00000000000000 SyncJe Outlook Edition yes NextHaus SyncJe Outlook Client syncevolution-1.5/src/syncevo/configs/remoterules/00_have_ablabel.xml0000664000373300001540000000054112336456617027416 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/00_have_evolution_ui_slot.xml0000664000373300001540000000036412336456617031621 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/00_have_exdate_detached.xml0000644000373300001540000000013612326412403031105 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/00_have_syncevolution_exdate_detached.xml0000644000373300001540000000007112326412403034104 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/00_need_tz_in_event.xml0000644000373300001540000000005312326412403030324 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/00_simple_exdate.xml0000644000373300001540000000005112326412403027626 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/00_syncevolution.xml0000644000373300001540000000267212360740724027747 0ustar00nightlynightly00000000000000 Patrick Ohly SyncEvolution no yes yes yes yes syncevolution-1.5/src/syncevo/configs/remoterules/10_maemo_calendar.xml0000644000373300001540000000040512326412403027736 0ustar00nightlynightly00000000000000 none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls syncevolution-1.5/src/syncevo/configs/remoterules/all.xml0000664000373300001540000000062612336456617025306 0ustar00nightlynightly00000000000000 none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls syncevolution-1.5/src/syncevo/configs/remoterules/evolution.xml0000664000373300001540000000062112336456617026555 0ustar00nightlynightly00000000000000 none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls yes syncevolution-1.5/src/syncevo/configs/remoterules/extended-date-format.xml0000644000373300001540000000022312326412403030506 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/remoterules/kde.xml0000644000373300001540000000023712326412403025255 0ustar00nightlynightly00000000000000 none - this rule is activated via its name in MAKE/PARSETEXTWITHPROFILE() macro calls syncevolution-1.5/src/syncevo/configs/remoterules/local-storage.xml0000664000373300001540000000221512336456617027266 0ustar00nightlynightly00000000000000 none - this rule is activated by default via its name in MAKE/PARSETEXTWITHPROFILE() macro calls yes none - this rule is activated by default via its name in MAKE/PARSETEXTWITHPROFILE() macro calls yes syncevolution-1.5/src/syncevo/configs/scripting/0000755000373300037200000000000012424707641023612 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/scripting/server/0000755000373300037200000000000012424707641025120 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/syncevo/configs/scripting/server/12email.xml0000644000373300001540000001414612326412403026712 0ustar00nightlynightly00000000000000 SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); } // make sure we never overwrite a body in the inbox BODY = UNASSIGNED; // delete always wins over replace in inbox (to avoid adds to inbox) DELETEWINS(); } } } else if (UPPERCASE(FOLDER)=="OUTBOX") { // never try to change something in outbox IGNOREUPDATE(); if (SYNCOP()!="delete") { // - date of mail is NOW, set it such that a correct date is written to the DB MAILDATE = DBNOW(); // MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted // - echo item as replace (to force-move it to the sent folder) ECHOITEM("replace"); } CONFLICTSTRATEGY("client-wins"); } else if (UPPERCASE(FOLDER)=="SENT") { // never try to change something in sent folder IGNOREUPDATE(); // Server has precedence in case of conflicts CONFLICTSTRATEGY("server-wins"); // Implement reload capability for sent items as well if (SLOWSYNC()) { // do not add new sent items to the server in slowsync PREVENTADD(); // causes extra sent items on the client to be deleted } else { // make sure that existing server item will conflict with this item if (SYNCOP()=="replace") { if (LIMIT!=EMPTY && (LIMIT<0 || LIMIT>SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); REJECTITEM(200); // but do not process the item further } else { // silently ignore other types of changes REJECTITEM(200); } // make sure we never overwrite a body in the sent folder BODY = UNASSIGNED; } } } else { // Other folder // - silently discard incoming item for other folder than the above // except if it is a delete if (SYNCOP()!="delete") REJECTITEM(0); } ]]> =V1.0.8.21 IF (LIMIT==EMPTY) LIMIT = SIZELIMIT(); // if none set already, use default for this item (=default of datastore, if not SETSIZELIMIT() called before for this item generation) } // set limit for item generator if (LIMIT!=EMPTY) SETSIZELIMIT(LIMIT); ]]> =STARTDATE(); RETURN PASSES; ]]> syncevolution-1.5/src/syncevo/configs/scripting/00looptimeout.xml0000664000373300001540000000016512424466461026704 0ustar00nightlynightly00000000000000 0 syncevolution-1.5/src/syncevo/configs/scripting/04vcard-photo-inlining.xml0000644000373300001540000000070312326412403030343 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/scripting/04vcard-photo-value.xml0000644000373300001540000000207212326412403027651 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/scripting/05vcard-evolution.xml0000644000373300001540000000767612326412403027452 0ustar00nightlynightly00000000000000 = startmiddle) { N_MIDDLE = words[startmiddle]; startmiddle = startmiddle + 1; while (endmiddle >= startmiddle) { N_MIDDLE = N_MIDDLE + " " + words[startmiddle]; startmiddle = startmiddle + 1; } } } } // Ensure that FILE-AS is set. Some EDS versions will set it, // so we need to do the same to ensure that incoming items // match DB items during a slow sync. if (FILE_AS == EMPTY) { FILE_AS = N_LAST; if (N_FIRST != EMPTY) { if (FILE_AS != EMPTY) { FILE_AS = FILE_AS + ", "; } FILE_AS = FILE_AS + N_FIRST; } } $VCARD_OUTGOING_PHOTO_VALUE_SCRIPT; ]]> syncevolution-1.5/src/syncevo/configs/scripting/05vcard-merge.xml0000664000373300001540000003763312424466461026537 0ustar00nightlynightly00000000000000 = 0) { tel = LOOSING.TEL[i]; if (tel != EMPTY && !CONTAINS(WINNING.TEL, tel)) { num = SIZE(WINNING.LABEL); WINNING.TEL[num] = tel; WINNING.TEL_FLAGS[num] = LOOSING.TEL_FLAGS[i]; WINNING.TEL_SLOT[num] = LOOSING.TEL_SLOT[i]; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.XDATE) - 1; while (i >= 0) { xdate = LOOSING.XDATE[i]; if (xdate != EMPTY && !CONTAINS(WINNING.XDATE, xdate)) { num = SIZE(WINNING.LABEL); WINNING.XDATE[num] = xdate; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.EMAIL) - 1; while (i >= 0) { val = LOOSING.EMAIL[i]; if (val != EMPTY && !CONTAINS(WINNING.EMAIL, val)) { num = SIZE(WINNING.LABEL); WINNING.EMAIL[num] = val; WINNING.EMAIL_FLAGS[num] = LOOSING.EMAIL_FLAGS[i]; WINNING.EMAIL_SLOT[num] = LOOSING.EMAIL_SLOT[i]; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.WEB) - 1; while (i >= 0) { val = LOOSING.WEB[i]; if (val != EMPTY && !CONTAINS(WINNING.WEB, val)) { num = SIZE(WINNING.LABEL); WINNING.WEB[num] = val; WINNING.WEB_FLAGS[num] = LOOSING.WEB_FLAGS[i]; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.CALURI) - 1; while (i >= 0) { val = LOOSING.CALURI[i]; if (val != EMPTY && !CONTAINS(WINNING.CALURI, val)) { num = SIZE(WINNING.CALURI); WINNING.CALURI[num] = val; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.FBURL) - 1; while (i >= 0) { val = LOOSING.FBURL[i]; if (val != EMPTY && !CONTAINS(WINNING.FBURL, val)) { num = SIZE(WINNING.FBURL); WINNING.FBURL[num] = val; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.BLOGURL) - 1; while (i >= 0) { val = LOOSING.BLOGURL[i]; if (val != EMPTY && !CONTAINS(WINNING.BLOGURL, val)) { num = SIZE(WINNING.BLOGURL); WINNING.BLOGURL[num] = val; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.VIDEOURL) - 1; while (i >= 0) { val = LOOSING.VIDEOURL[i]; if (val != EMPTY && !CONTAINS(WINNING.VIDEOURL, val)) { num = SIZE(WINNING.VIDEOURL); WINNING.VIDEOURL[num] = val; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.RELATEDNAMES) - 1; while (i >= 0) { val = LOOSING.RELATEDNAMES[i]; if (val != EMPTY && !CONTAINS(WINNING.RELATEDNAMES, val)) { num = SIZE(WINNING.LABEL); WINNING.RELATEDNAMES[num] = val; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.IMPP) - 1; while (i >= 0) { val = LOOSING.IMPP[i]; if (val != EMPTY && !CONTAINS(WINNING.IMPP, val)) { num = SIZE(WINNING.LABEL); WINNING.IMPP[num] = val; WINNING.IMPP_SERVICE[num] = LOOSING.IMPP_SERVICE[i]; WINNING.IMPP_SLOT[num] = LOOSING.IMPP_SLOT[i]; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.AIM_HANDLE) - 1; while (i >= 0) { val = LOOSING.AIM_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.AIM_HANDLE, val)) { num = SIZE(WINNING.AIM_HANDLE); WINNING.AIM_HANDLE[num] = val; WINNING.AIM_SLOT[num] = LOOSING.AIM_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.GADUGADU_HANDLE) - 1; while (i >= 0) { val = LOOSING.GADUGADU_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.GADUGADU_HANDLE, val)) { num = SIZE(WINNING.GADUGADU_HANDLE); WINNING.GADUGADU_HANDLE[num] = val; WINNING.GADUGADU_SLOT[num] = LOOSING.GADUGADU_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.GROUPWISE_HANDLE) - 1; while (i >= 0) { val = LOOSING.GROUPWISE_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.GROUPWISE_HANDLE, val)) { num = SIZE(WINNING.GROUPWISE_HANDLE); WINNING.GROUPWISE_HANDLE[num] = val; WINNING.GROUPWISE_SLOT[num] = LOOSING.GROUPWISE_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.ICQ_HANDLE) - 1; while (i >= 0) { val = LOOSING.ICQ_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.ICQ_HANDLE, val)) { num = SIZE(WINNING.ICQ_HANDLE); WINNING.ICQ_HANDLE[num] = val; WINNING.ICQ_SLOT[num] = LOOSING.ICQ_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.JABBER_HANDLE) - 1; while (i >= 0) { val = LOOSING.JABBER_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.JABBER_HANDLE, val)) { num = SIZE(WINNING.JABBER_HANDLE); WINNING.JABBER_HANDLE[num] = val; WINNING.JABBER_SLOT[num] = LOOSING.JABBER_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.MSN_HANDLE) - 1; while (i >= 0) { val = LOOSING.MSN_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.MSN_HANDLE, val)) { num = SIZE(WINNING.MSN_HANDLE); WINNING.MSN_HANDLE[num] = val; WINNING.MSN_SLOT[num] = LOOSING.MSN_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.YAHOO_HANDLE) - 1; while (i >= 0) { val = LOOSING.YAHOO_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.YAHOO_HANDLE, val)) { num = SIZE(WINNING.YAHOO_HANDLE); WINNING.YAHOO_HANDLE[num] = val; WINNING.YAHOO_SLOT[num] = LOOSING.YAHOO_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.SKYPE_HANDLE) - 1; while (i >= 0) { val = LOOSING.SKYPE_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.SKYPE_HANDLE, val)) { num = SIZE(WINNING.SKYPE_HANDLE); WINNING.SKYPE_HANDLE[num] = val; WINNING.SKYPE_SLOT[num] = LOOSING.SKYPE_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.SIP_HANDLE) - 1; while (i >= 0) { val = LOOSING.SIP_HANDLE[i]; if (val != EMPTY && !CONTAINS(WINNING.SIP_HANDLE, val)) { num = SIZE(WINNING.SIP_HANDLE); WINNING.SIP_HANDLE[num] = val; WINNING.SIP_SLOT[num] = LOOSING.SIP_SLOT[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.EMAIL) - 1; while (i >= 0) { val = LOOSING.EMAIL[i]; if (val != EMPTY && !CONTAINS(WINNING.EMAIL, val)) { num = SIZE(WINNING.LABEL); WINNING.EMAIL[num] = val; WINNING.EMAIL_FLAGS[num] = LOOSING.EMAIL_FLAGS[i]; WINNING.EMAIL_SLOT[num] = LOOSING.EMAIL_SLOT[i]; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } i = i - 1; } i = SIZE(LOOSING.ADR_STREET) - 1; INTEGER e; INTEGER contained; while (i >= 0) { if (LOOSING.ADR_STREET[i] != EMPTY || LOOSING.ADR_ADDTL[i] != EMPTY || LOOSING.ADR_STREET_FLAGS[i] != EMPTY || LOOSING.ADR_POBOX[i] != EMPTY || LOOSING.ADR_CITY[i] != EMPTY || LOOSING.ADR_REG[i] != EMPTY || LOOSING.ADR_ZIP[i] != EMPTY || LOOSING.ADR_COUNTRY[i] != EMPTY) { contained = 0; e = SIZE(WINNING.ADR_STREET) - 1; while (e >= 0) { if (LOOSING.ADR_STREET[i] == WINNING.ADR_STREET[e] && LOOSING.ADR_ADDTL[i] == WINNING.ADR_ADDTL[e] && LOOSING.ADR_STREET_FLAGS[i] == WINNING.ADR_STREET_FLAGS[e] && LOOSING.ADR_POBOX[i] == WINNING.ADR_POBOX[e] && LOOSING.ADR_CITY[i] == WINNING.ADR_CITY[e] && LOOSING.ADR_REG[i] == WINNING.ADR_REG[e] && LOOSING.ADR_ZIP[i] == WINNING.ADR_ZIP[e] && LOOSING.ADR_COUNTRY[i] == WINNING.ADR_COUNTRY[e]) { contained = 1; break; } e = e - 1; } if (!contained) { num = SIZE(WINNING.LABEL); WINNING.ADR_STREET[num] = LOOSING.ADR_STREET[i]; WINNING.ADR_ADDTL[num] = LOOSING.ADR_ADDTL[i]; WINNING.ADR_STREET_FLAGS[num] = LOOSING.ADR_STREET_FLAGS[i]; WINNING.ADR_POBOX[num] = LOOSING.ADR_POBOX[i]; WINNING.ADR_CITY[num] = LOOSING.ADR_CITY[i]; WINNING.ADR_REG[num] = LOOSING.ADR_REG[i]; WINNING.ADR_ZIP[num] = LOOSING.ADR_ZIP[i]; WINNING.ADR_COUNTRY[num] = LOOSING.ADR_COUNTRY[i]; WINNING.LABEL[num] = LOOSING.LABEL[i]; winningchanged = 1; } } i = i - 1; } } // Never tell the engine to update the winning client item // in a caching sync. The engine would send an update to the // client, which is not what we want when caching! if (!CACHEDATA() && winningchanged) { SETWINNINGCHANGED(1); } if (loosingchanged) { SETLOOSINGCHANGED(1); } // Continue merge. MERGEFIELDS(mode, ignorefields); ]]> syncevolution-1.5/src/syncevo/configs/scripting/06todo-priorities.xml0000644000373300001540000000204112326412403027443 0ustar00nightlynightly00000000000000 0) { PRIORITY=1; }else if(PRIORITY==5){ PRIORITY=2; }else if(PRIORITY>5){ PRIORITY=3; } // 0 is undefined and remains unchanged ]]> syncevolution-1.5/src/syncevo/configs/scripting/06vcard-fullname.xml0000644000373300001540000000074012326412403027213 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/scripting/07vcard-addrev.xml0000644000373300001540000000021412326412403026652 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/scripting/08vcard-email-type.xml0000644000373300001540000000061212326412403027456 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/scripting/10newuid.xml0000644000373300001540000000030212326412403025573 0ustar00nightlynightly00000000000000 syncevolution-1.5/src/syncevo/configs/scripting/11calendar.xml0000664000373300001540000002653112405555067026104 0ustar00nightlynightly00000000000000 0) { // DTSTART and DTEND represent allday event, make them date-only values // - convert start to user zone (or floating) so it represents midnight DTSTART = CONVERTTOUSERZONE(DTSTART); MAKEALLDAY(DTSTART,DTEND,i); if (RR_END != EMPTY) { RR_END = DATEONLY(CONVERTTOUSERZONE(RR_END)); } } else { // iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday if (ISDATEONLY(DTSTART)) { // reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers) MAKEALLDAY(DTSTART,DTEND,i); } } // Make sure that all EXDATE times are in the same timezone as the start // time. Some servers send them as UTC, which is all fine and well, but // only if the timezone definition doesn't change. Also, libical does not // handle such UTC EXDATEs, so let's convert it while the UTC and // time zone definition (hopefully) are in sync. if (TIMEZONE(DTSTART) != "UTC" && !ISFLOATING(DTSTART)) { i = 0; timestamp exdate; while (i0) { DUE = CONVERTTOUSERZONE(DUE); DUE = DATEONLY(DUE); } if (ITEMDATATYPE()=="vCalendar10") { $VCALENDAR_10TO20_PRIORITY_CONVERSION; } } // a workaround for funambol: adding 'action' for 'alarm' // if item data type is vCalendar1.0, also add 'action' for 'alarm'. // This is a workaround for Mobical.net, which uses vCalendar1.0. if (ALARM_TIME!=EMPTY && ALARM_ACTION==EMPTY) { ALARM_ACTION = "DISPLAY"; } ]]> = lensummary && SUBSTR(DESCRIPTION, 0, lensummary) == SUMMARY && (lensummary == lendescr || SUBSTR(DESCRIPTION, lensummary, 1) == "\n")) { DESCRIPTION = SUBSTR(DESCRIPTION, lensummary + 1, lendescr - lensummary - 1); } ]]> syncevolution-1.5/src/syncevo/configs/scripting/11vcard.xml0000664000373300001540000002202312336456617025426 0ustar00nightlynightly00000000000000 X-ANNIVERSARY. i = SIZE(XDATE) - 1; while (i >= 0) { if (GROUP_TAG[i] != EMPTY && XDATE[i] != UNASSIGNED && LABEL[i] == "Anniversary") { SWAP(ANNIVERSARY, XDATE[i]); // XDATE[i] = UNASSIGNED; break; } i = i - 1; } // Special X-ABRELATEDNAMES -> X-SPOUSE/MANAGER/ASSISTANT i = SIZE(RELATEDNAMES) - 1; while (i >= 0) { if (GROUP_TAG[i] != EMPTY && RELATEDNAMES[i] != UNASSIGNED) { s = LABEL[i]; if (s == "Spouse") { if (SPOUSE == EMPTY) { SWAP(SPOUSE, RELATEDNAMES[i]); // RELATEDNAMES[i] = UNASSIGNED; } } else if (s == "Manager") { if (MANAGER == EMPTY) { SWAP(MANAGER, RELATEDNAMES[i]); // RELATEDNAMES[i] = UNASSIGNED; } } else if (s == "Assistant") { if (ASSISTANT == EMPTY) { SWAP(ASSISTANT, RELATEDNAMES[i]); // RELATEDNAMES[i] = UNASSIGNED; } } } i = i - 1; } // IMPP -> X-JABBER/AIM/... depending on service type. Protocol must match. i = SIZE(IMPP) - 1; INTEGER offset; STRING service; STRING protocol; STRING value; while (i >= 0) { service = IMPP_SERVICE[i]; if (service != UNASSIGNED) { offset = FIND(IMPP[i], ":"); if (offset != UNASSIGNED) { protocol = SUBSTR(IMPP[i], 0, offset); value = URLDECODE(SUBSTR(IMPP[i], offset + 1)); if (service == "AIM" && protocol == "aim") { $VCARD_MODERN_TO_LEGACY_IMPP(value, AIM_HANDLE, AIM_SLOT, i); } else if (service == "Gadugadu") { $VCARD_MODERN_TO_LEGACY_IMPP(value, GADUGADU_HANDLE, GADUGADU_SLOT, i); } else if (service == "Groupwise") { $VCARD_MODERN_TO_LEGACY_IMPP(value, GROUPWISE_HANDLE, GROUPWISE_SLOT, i); } else if (service == "ICQ" && protocol == "aim") { $VCARD_MODERN_TO_LEGACY_IMPP(value, ICQ_HANDLE, ICQ_SLOT, i); } else if (service == "Jabber" && protocol == "xmpp") { $VCARD_MODERN_TO_LEGACY_IMPP(value, JABBER_HANDLE, JABBER_SLOT, i); } else if (service == "MSN" && protocol == "msnim") { $VCARD_MODERN_TO_LEGACY_IMPP(value, MSN_HANDLE, MSN_SLOT, i); } else if (service == "Yahoo" && protocol == "ymsgr") { $VCARD_MODERN_TO_LEGACY_IMPP(value, YAHOO_HANDLE, YAHOO_SLOT, i); } else if (service == "Skype" && protocol == "skype") { $VCARD_MODERN_TO_LEGACY_IMPP(value, SKYPE_HANDLE, SKYPE_SLOT, i); } else if (service == "Sip") { $VCARD_MODERN_TO_LEGACY_IMPP(value, SIP_HANDLE, SIP_SLOT, i); } } } i = i - 1; } // Remove labels which are no longer needed (valued moved above, // stored for a group which has no other properties (Google // CardDAV server sometimes sends that, editing in Evolution // might cause it, etc.) or provide no information ("Other"). i = SIZE(LABEL) - 1; while (i >= 0) { if (LABEL[i] == "Other" || LABEL[i] != UNASSIGNED && (GROUP_TAG[i] == EMPTY || RELATEDNAMES[i] == UNASSIGNED && XDATE[i] == UNASSIGNED && TEL[i] == UNASSIGNED && EMAIL[i] == UNASSIGNED && WEB[i] == UNASSIGNED && XDATE[i] == UNASSIGNED && IMPP[i] == UNASSIGNED && ADR_POBOX[i] == UNASSIGNED && ADR_ADDTL[i] == UNASSIGNED && ADR_STREET[i] == UNASSIGNED && ADR_CITY[i] == UNASSIGNED && ADR_REG[i] == UNASSIGNED && ADR_ZIP[i] == UNASSIGNED && ADR_COUNTRY[i] == UNASSIGNED && ADR_STREET_FLAGS[i] == UNASSIGNED)) { LABEL[i] = UNASSIGNED; } i = i - 1; } // Remove all group tags. Not used for legacy formats. GROUP_TAG = UNASSIGNED; ]]> = 0) { if ($3[impp_index] != EMPTY) { INTEGER num; num = SIZE(LABEL); IMPP[num] = $2 + ":" + URLENCODE($3[impp_index]); $3[impp_index] = UNASSIGNED; SWAP($4[impp_index], IMPP_SLOT[num]); IMPP_SERVICE[num] = $1; LABEL[num] = "Other"; } impp_index = impp_index - 1; } ]]> = 0) { if (LABEL[i] != EMPTY) { GROUP_TAG[i] = "item" + tagnum; tagnum = tagnum + 1; } i = i - 1; } ]]> syncevolution-1.5/src/syncevo/configs/README0000644000373300001540000000227112326412403022302 0ustar00nightlynightly00000000000000The sample configs contain common elements (datatypes, scripts, remote rules, debug settings) which are maintained as separate files in the corresponding directories. When modifying those common elements, run "update-samples.pl" in this directory to update the sample configs. The complete samples are under version control for several reasons: 1. avoid dependency on Perl unless common elements need to be updated 2. effect of changes on complete config show up in patches 3. the file layout and unshared parts ( and ) are determined by the sample configs The naming of common elements determines the order in which they get inserted. Files not ending in .xml are ignored. Elements that only apply to a client or server are stored in the corresponding sub directories, while the shared elements are in the "debug/scripting/datatypes/remoterules". It is a somewhat subjective choice which elements are stored in one file and which ones are split up. The three elements of a datatype definition (field list, profile, datatype) where split up because there might be multiple different profiles using the same field list and some users of these files might want to replace the default one. syncevolution-1.5/src/syncevo/configs/syncevolution.xml0000644000373300001540000000151712326412403025067 0ustar00nightlynightly00000000000000 SyncEvolution client config true syncevolution-1.5/src/syncevo/configs/update-samples.pl0000755000373300001540000000442212326412403024706 0ustar00nightlynightly00000000000000#! /usr/bin/env perl sub basename { $_ = shift; s;.*/;;; return $_; } # Concatenate all files ending in .xml in the given directory # plus those in a specific subdirectory for client or server. # Order lexicographic ascending of the base filename. sub readfragments { my $dir = shift; my $subdir = shift; my @res = (); my @files = (); if (opendir(my $dh, $dir)) { foreach (grep (/.*\.xml$/, readdir($dh))) { push @files, "$dir/$_"; } closedir($dh); if (opendir(my $dh, "$dir/$subdir")) { foreach (grep (/.*\.xml$/, readdir($dh))) { push @files, "$dir/$subdir/$_"; } closedir($dh); } } @files = sort { basename($a) <=> basename($b) } @files; foreach (@files) { open(IN, "<$_") || die "cannot read $_: $!"; push @res, ; close(IN); } return join("", @res); } # replace content of , , and all s # with the corresponding shared and/or client/server .xml fragments sub update { my $file = shift; my $subdir = shift; my $write = shift; open(IN, "<$file") || die "cannot read $file: $!"; $_ = join("", ); close(IN) || die "closing $file: $!"; s;(\n).*(\n *);$1 . readfragments("debug", $subdir) . $2;se; s;(\n).*(\n *);$1 . readfragments("scripting", $subdir) . $2;se || s;(\n *);$1 . "\n" . readfragments("scripting", $subdir) . $1 . "";se; s;(\n).*(\n *);$1 . readfragments("datatypes", $subdir) . $2;se || s;(\n *);$1 . "\n" . readfragments("datatypes", $subdir) . $1 . "";se; s;(\n *).*;$1 . readfragments("remoterules", $subdir);se || s;(\n *);readfragments("remoterules", $subdir);se; if ($write) { open(OUT, ">$file") || die "cannot write $file: $!"; print OUT; close(OUT) || die "closing $file: $!"; } else { print; } } if ($#ARGV == -1) { update("syncclient_sample_config.xml", "client", 1); update("syncserv_sample_config.xml", "server", 1); } else { update($ARGV[0], $ARGV[1], 0); } syncevolution-1.5/src/syncevo/configs/configs.am0000644000373300001540000000036512326412403023373 0ustar00nightlynightly00000000000000src_syncevo_configs_xmldir = $(datadir)/syncevolution/xml dist_src_syncevo_configs_xml_SCRIPTS = src/syncevo/configs/update-samples.pl dist_noinst_DATA += \ src/syncevo/configs/README include $(top_srcdir)/src/syncevo/configs/configs_xml.am syncevolution-1.5/src/syncevo/configs/configs_xml.am0000644000373300001540000000443212326412403024252 0ustar00nightlynightly00000000000000# TODO: preferably generate this list instead #./*.xml src_syncevo_configsdir = $(datadir)/syncevolution/xml dist_src_syncevo_configs_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/*.xml)) # ./datatypes/*.xml src_syncevo_configs_datatypesdir = $(datadir)/syncevolution/xml/datatypes dist_src_syncevo_configs_datatypes_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/datatypes/*.xml)) # ./datatypes/server/*.xml src_syncevo_configs_datatypes_serverdir = $(datadir)/syncevolution/xml/datatypes/server dist_src_syncevo_configs_datatypes_server_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/datatypes/server/*.xml)) # ./debug/*.xml src_syncevo_configs_debugdir = $(datadir)/syncevolution/xml/debug dist_src_syncevo_configs_debug_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/debug/*.xml)) # ./remoterules/*.xml src_syncevo_configs_remoterulesdir = $(datadir)/syncevolution/xml/remoterules dist_src_syncevo_configs_remoterules_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/remoterules/*.xml)) # ./remoterules/client/*.xml src_syncevo_configs_remoterules_clientdir = $(datadir)/syncevolution/xml/remoterules/client dist_src_syncevo_configs_remoterules_client_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/remoterules/client/*.xml)) # ./remoterules/server/*.xml src_syncevo_configs_remoterules_serverdir = $(datadir)/syncevolution/xml/remoterules/server dist_src_syncevo_configs_remoterules_server_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/remoterules/server/*.xml)) # ./scripting/*.xml src_syncevo_configs_scriptingdir = $(datadir)/syncevolution/xml/scripting dist_src_syncevo_configs_scripting_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/scripting/*.xml)) # ./scripting/client/*.xml src_syncevo_configs_scripting_clientdir = $(datadir)/syncevolution/xml/scripting/client dist_src_syncevo_configs_scripting_client_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/scripting/client/*.xml)) # ./scripting/server/*.xml src_syncevo_configs_scripting_serverdir = $(datadir)/syncevolution/xml/scripting/server dist_src_syncevo_configs_scripting_server_DATA = $(subst $(srcdir)/,,$(wildcard $(srcdir)/src/syncevo/configs/scripting/server/*.xml)) syncevolution-1.5/src/syncevo/syncevolution.pc.in0000644000373300001540000000063512326412403023646 0ustar00nightlynightly00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ backenddir=@libdir@/syncevolution/backends datarootdir=@datarootdir@ templatedir=@datadir@/syncevolution/templates Name: libsyncevolution Description: SyncEvolution Library Version: @VERSION@ Cflags: -I${includedir} Requires: synthesis Libs: -L${libdir} -lsyncevolution -lrt Libs.private: -L${libdir}/syncevolution -lgdbussyncevo syncevolution-1.5/src/syncevo/readme2c.pl0000644000373300001540000000154512326412403022014 0ustar00nightlynightly00000000000000#!/usr/bin/perl # # Turn reStructuredText README.rst into C file with # static const char *synopsis, *options; $_ = join("", <>); # trailing :: is only needed for reST s/ :://g; # simplify colon s/::/:/g; # avoid special \-- which was necessary for some options s/^\\--/--/gm; # remove escape sequence s/\\\*/*/g; # extract parts /SYNOPSIS\n===+\n\n(.*?)\nDESCRIPTION/s || die "no synopsis"; my $synopsis = $1; /OPTIONS\n===+\n\n.*?(^--.*?)\nEXAMPLES/ms || die "no options"; my $options = $1; # condense synopsis $synopsis =~ s/\n\n/\n/g; sub text2c { my $text = shift; foreach $_ (split ('\n', $text)) { s/\\/\\\\/g; s/"/\\"/g; print " \"", $_, "\\n\"\n"; } } # now print as C code print "static const char synopsis[] =\n"; text2c($synopsis); print ";\nstatic const char options[] =\n"; text2c($options); print ";\n"; syncevolution-1.5/src/syncevo/installcheck-local.sh0000755000373300001540000000250612326412403024066 0ustar00nightlynightly00000000000000#!/bin/sh # # usage: PKG_CONFIG_PATH=... installcheck-local.sh set -ex DIR=`mktemp -d` TMPFILE_CXX=$DIR/installcheck-local.cpp TMPFILE_O=$DIR/installcheck-local.o TMPFILE=$DIR/installcheck-local rmtmp () { rm -f $TMPFILE $TMPFILE_CXX $TMPFILE_O rmdir $DIR } trap rmtmp EXIT # check that c++ works, whatever it is cat >$TMPFILE_CXX < int main(int argc, char **argv) { std::cout << "hello world\n"; return 0; } EOF for CXX in "c++ -Wall -Werror" "g++ -Wall -Werror" "c++" "g++" ""; do if [ ! "$CXX" ]; then echo "no usable compiler, skipping tests" exit 0 fi if $CXX $TMPFILE_CXX -o $TMPFILE; then break fi done for header in `cd $1 && echo *`; do cat >$TMPFILE_CXX < int main(int argc, char **argv) { return 0; } EOF # header must be usable stand-alone $CXX "-I$2" $TMPFILE_CXX -c -o $TMPFILE_O done # link once to check that the libs are found; # must take DESTDIR into account by adding -L (skipped when equal to /usr/lib) # and modifying any additional paths including that pkg-config --libs syncevolution env LD_LIBRARY_PATH=$3:$3/syncevolution:$LD_LIBRARY_PATH $CXX -v $TMPFILE_O -o $TMPFILE "-L$3" `pkg-config --libs syncevolution | sed -e "s;/usr/lib;$3;g"` syncevolution-1.5/src/syncevo/declarations.h0000644000373300001540000000334612326412403022617 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Header file that is included by all SyncEvolution files. * Sets up the "SyncEvo" namespace. */ #ifndef INCL_DECLARATIONS #define INCL_DECLARATIONS #define SE_BEGIN_CXX namespace SyncEvo { #define SE_END_CXX } #ifdef __GNUC__ # define SE_NORETURN __attribute__((noreturn)) #else # define SE_NORETURN #endif SE_BEGIN_CXX /* * SyncEvolution should never use standard IO directly. Either use the * logging facilities or use variables that point towards the real * output channels. In particular the command line code then can be * run as pointing towards real std::cout, a string stream, or redirected * via D-Bus. * * These dummy declarations trip up code inside SyncEvo namespace or using it * which use plain "cout << something" after a "using namespace std". * They don't help catching code which references std::cout. */ struct DontUseStandardIO; extern DontUseStandardIO *cout; extern DontUseStandardIO *cerr; SE_END_CXX #endif /** INCL_DECLARATIONS */ syncevolution-1.5/src/syncevo/Cmdline.h0000644000373300001540000002650312326412403021522 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_CMDLINE # define INCL_SYNC_EVOLUTION_CMDLINE #include #include #include #include #include #include #include SE_BEGIN_CXX class SyncSource; class SyncSourceRaw; class SyncContext; class CmdlineTest; /** * encodes a locally unique ID (LUID) in such a * way that it is treated as a plain word by shells */ class CmdlineLUID { std::string m_encodedLUID; public: /** fill with encoded LUID */ void setEncoded(const std::string &encodedLUID) { m_encodedLUID = encodedLUID; } /** return encoded LUID as string */ std::string getEncoded() const { return m_encodedLUID; } /** return original LUID */ std::string toLUID() const { return toLUID(m_encodedLUID); } static std::string toLUID(const std::string &encoded) { return StringEscape::unescape(encoded, '%'); } /** fill with unencoded LUID */ void setLUID(const std::string &luid) { m_encodedLUID = fromLUID(luid); } /** convert from unencoded LUID */ static std::string fromLUID(const std::string &luid) { return StringEscape::escape(luid, '%', StringEscape::STRICT); } }; class Cmdline { public: Cmdline(int argc, const char * const *argv); Cmdline(const std::vector &args); Cmdline(const char *arg, ...); virtual ~Cmdline() {} /** * parse the command line options * * @retval true if command line was okay */ bool parse(); /** * parse the command line options * relative paths in the arguments are converted to absolute paths * if it returns false, then the content of args is undefined. * * @retval true if command line was okay */ bool parse(std::vector &args); /** * @return false if run() still needs to be invoked, true when parse() already did * the job (like --sync-property ?) */ bool dontRun() const; bool run(); /** * sync report as owned by this instance, not filled in unless * run() executed a sync */ const SyncReport &getReport() const { return m_report; } /** the run() call modified configurations (added, updated, removed) */ bool configWasModified() const { return m_configModified; } Bool useDaemon() { return m_useDaemon; } /** whether '--monitor' is set */ bool monitor() { return m_monitor; } /** whether 'status' is set */ bool status() { return m_status; } /* server name */ std::string getConfigName() { return m_server; } /* check whether command line runs sync. It should be called after parsing. */ bool isSync(); /** same as isSync() for --restore */ bool isRestore() const; protected: // vector to store strings for arguments std::vector m_args; int m_argc; const char * const * m_argv; //array to store pointers of arguments boost::scoped_array m_argvArray; /** result of sync, if one was executed */ SyncReport m_report; Bool m_quiet; Bool m_dryrun; Bool m_status; Bool m_version; Bool m_usage; Bool m_configure; Bool m_remove; Bool m_run; Bool m_migrate; Bool m_printDatabases; Bool m_createDatabase; Bool m_removeDatabase; Bool m_printServers; Bool m_printTemplates; Bool m_printConfig; Bool m_printSessions; Bool m_dontrun; Bool m_monitor; Bool m_useDaemon; FullProps m_props; const ConfigPropertyRegistry &m_validSyncProps; const ConfigPropertyRegistry &m_validSourceProps; std::string m_restore; Bool m_before, m_after; Bool m_accessItems; std::string m_itemPath; std::string m_delimiter; std::list m_luids; Bool m_printItems, m_update, m_import, m_export, m_deleteItems; std::string m_server; std::string m_template; std::set m_sources; /** running the command line modified configuration settings (add, update, remove) */ Bool m_configModified; /** compose description of cmd line option with optional parameter */ static std::string cmdOpt(const char *opt, const char *param = NULL); /** * rename file or directory by appending .old or (if that already * exists) .old.x for x >= 1; updates config to point to the renamed directory */ void makeObsolete(boost::shared_ptr &from); /** * Copy from one config into another, with filters * applied for the target. All sources are copied * if selectedSources is empty, otherwise only * those. */ void copyConfig(const boost::shared_ptr &from, const boost::shared_ptr &to, const std::set &selectedSources); /** * flush, move .synthesis dir, set ConsumerReady, ... */ void finishCopy(const boost::shared_ptr &from, const boost::shared_ptr &to); /** * migrate peer config; target context must be ready */ void migratePeer(const std::string &fromPeer, const std::string &toPeer); /** * parse sync or source property * * @param propertyType sync, source, or unknown (in which case the property name must be given and must be unique) * @param opt command line option as it appeard in argv (e.g. --sync|--sync-property|-z) * @param param the parameter following the opt, may be NULL if none given (error!) * @param propname if given, then this is the property name and param contains the param value (--sync ) */ bool parseProp(PropertyType propertyType, const char *opt, const char *param, const char *propname = NULL); /** * parse keyword which sets a certain property, * like --sync=two-way, --sync two-way, ... for the "sync" property * * If a default value is give, then the format is like: * --keyring[=], --keyring=, ... * but not * --keyring */ bool parseAssignment(int &opt, std::vector &parsed, PropertyType propertyType, const char *propname, const char *def); bool listPropValues(const ConfigPropertyRegistry &validProps, const std::string &propName, const std::string &opt); bool listProperties(const ConfigPropertyRegistry &validProps, const std::string &opt); /** * check that m_props don't contain * properties which only apply to peers, throw error * if found */ void checkForPeerProps(); /** * list all known data sources of a certain type */ void listDatabases(SyncSource *source, const std::string &header); void createDatabase(SyncSource *source, const std::string &header); void removeDatabase(SyncSource *source, const std::string &header); void dumpConfigs(const std::string &preamble, const SyncConfig::ConfigList &servers); void dumpConfigTemplates(const std::string &preamble, const SyncConfig::TemplateList &templates, bool printRank = false, Logger::Level level = Logger::SHOW); enum DumpPropertiesFlags { DUMP_PROPS_NORMAL = 0, HIDE_LEGEND = 1<<0, /**< * do not show the explanation which properties are shared, * used while dumping any source which is not the last one */ HIDE_PER_PEER = 1<<1 /**< * config is for a context, not a peer, so do not show those * properties which are only per-peer */ }; void dumpProperties(const ConfigNode &configuredProps, const ConfigPropertyRegistry &allProps, int flags); void copyProperties(const ConfigNode &fromProps, ConfigNode &toProps, bool hidden, const ConfigPropertyRegistry &allProps); void dumpComment(std::ostream &stream, const std::string &prefix, const std::string &comment); /** ensure that m_server was set, false if error message was necessary */ bool needConfigName(); /** print usage information */ void usage(bool full, const std::string &error = std::string(""), const std::string ¶m = std::string("")); /** * This is a factory method used to delay sync client creation to its * subclass. The motivation is to let user implement their own * clients to avoid dependency. * @return the created sync client */ virtual SyncContext* createSyncClient(); friend class CmdlineTest; private: /** * Utility function to check m_argv[opt] against a specific boolean * parameter of the form "[=yes/1/t/true/no/0/f/false]. * * @param opt current index in m_argv * @param longName long form of the parameter, including --, may be NULL * @param shortName short form, including -, may be NULL * @param def default value if m_argv[opt] contains no explicit value * @retval value if and only if m_argv[opt] matches, then this is set to to true or false * @retval ok true if parsing succeeded, false if not and error message was printed */ bool parseBool(int opt, const char *longName, const char *shortName, bool def, Bool &value, bool &ok); /** * Fill list with all local IDs of the given source, as used by the source. */ void readLUIDs(SyncSource *source, std::list &luids); /** * Invoke a callback for each local ID. */ void processLUIDs(SyncSource *source, const boost::function &callback); /** * Add or update one item. * @param source SyncSource in write mode (startWriteData must have been called) * @param luid local ID, empty if item is to be added * @param data the item data to insert * @return encoded luid of inserted item */ CmdlineLUID insertItem(SyncSourceRaw *source, const std::string &luid, const std::string &data); }; SE_END_CXX #endif // INCL_SYNC_EVOLUTION_CMDLINE syncevolution-1.5/src/syncevo/ConfigFilter.h0000644000373300001540000001140312326412403022513 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_CONFIG_FILTER # define INCL_SYNC_EVOLUTION_CONFIG_FILTER #include #include #include #include #include SE_BEGIN_CXX /** a case-insensitive string to InitStateString mapping */ class ConfigProps : public std::map > { public: /** format as = lines */ operator std::string () const; /** * Add all entries from the second set of properties, * overwriting existing ones (in contrast to map::insert(), * which does not overwrite). */ void add(const ConfigProps &other); /** * Return value in map or the given default, marked as unset. */ InitStateString get(const std::string &key, const std::string &def = "") const; }; /** * Properties for different sources. * * Source and property names are case-insensitive. */ class SourceProps : public std::map > { public: /** * Combine per-source property filters with filter for * all sources: per-source filter values always win. */ ConfigProps createSourceFilter(const std::string &source) const; }; /** * A pair of sync and source properties. Source properties are * reached via "" for "all sources", and "" for a * specific source. */ struct ContextProps { ConfigProps m_syncProps; SourceProps m_sourceProps; }; /** * A collection of sync and source settings, including different contexts. * * Primary index is by configuration: * "" for unset, "@" for explicit context, "foo@bar" for peer config * * Index is case-insensitive. */ class FullProps : public std::map > { public: enum PropCheckMode { CHECK_ALL, IGNORE_GLOBAL_PROPS }; /** any of the contained ConfigProps has entries */ bool hasProperties(PropCheckMode mode) const; /** * Combines sync properties into one filter, giving "config" * priority over "context of config" and over "no specific context". * Contexts which do not apply to the config are silently ignored. * Error checking for invalid contexts in the FullProps instance * must be done separately. * * @param config empty string (unknown config) or valid peer or context name */ ConfigProps createSyncFilter(const std::string &config) const; /** * Combines source properties into one filter. Same priority rules * as for sync properties apply. Priorities inside each context * are resolved via SourceProps::createSourceFilter(). The context * is checked first, so "sync@foo@default" overrides "addressbook/sync". * * @param config valid peer or context name * @param source empty string (only pick properties applying to all sources) or source name */ ConfigProps createSourceFilter(const std::string &config, const std::string &source) const; /** * read properties from context, then update with command line * properties for a) that context and b) the given config * * @param context context name, including @ sign, empty if not needed * @param config possibly non-normalized configuration name which determines * additional filters, can be empty * @param sources additional sources for which sourceFilters need to be set * @retval syncFilter global sync properties * @retval sourceFilters entries for sources known in either context, config, or * listed explicitly, * key "" as fallback for unknown sources */ void createFilters(const std::string &context, const std::string &config, const std::set *sources, ConfigProps &syncFilter, SourceProps &sourceFilters); }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/GLibSupport.h0000664000373300001540000011734512424466461022404 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_GLIB_SUPPORT # define INCL_GLIB_SUPPORT #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #ifdef HAVE_GLIB # include # include #else typedef void *GMainLoop; #endif #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX enum { GLIB_SELECT_NONE = 0, GLIB_SELECT_READ = 1, GLIB_SELECT_WRITE = 2 }; enum GLibSelectResult { GLIB_SELECT_TIMEOUT, /**< returned because not ready after given amount of time */ GLIB_SELECT_READY, /**< fd is ready */ GLIB_SELECT_QUIT /**< something else caused the loop to quit, return to caller immediately */ }; /** * Waits for one particular file descriptor to become ready for reading * and/or writing. Keeps the given loop running while waiting. * * @param loop loop to keep running; must not be NULL * @param fd file descriptor to watch, -1 for none * @param direction read, write, both, or none (then fd is ignored) * @param timeout timeout in seconds + nanoseconds from now, NULL for no timeout, empty value for immediate return * @return see GLibSelectResult */ GLibSelectResult GLibSelect(GMainLoop *loop, int fd, int direction, Timespec *timeout); #ifdef HAVE_GLIB // Signal callback. Specializations will handle varying number of parameters. template struct GObjectSignalHandler { // static void handler(); // No specialization defined for the requested function prototype. }; template<> struct GObjectSignalHandler { static void handler(gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, A4 a4, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3, a4); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3, a4, a5); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3, a4, a5, a6); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3, a4, a5, a6, a7); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3, a4, a5, a6, a7, a8); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; template struct GObjectSignalHandler { static void handler(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, gpointer data) throw () { try { (*reinterpret_cast< boost::function *>(data))(a1, a2, a3, a4, a5, a6, a7, a8, a9); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; enum RefOwnership { TRANSFER_REF = false, /**< * Create new smart pointer which steals an existing reference without * increasing the reference count of the object. */ ADD_REF = true /**< * Create new smart pointer which increases the reference count when * storing the pointer to the object. */ }; template class TrackGObject : public boost::intrusive_ptr { typedef boost::intrusive_ptr Base_t; // Frees the instance of boost::function which was allocated // by connectSignal. template static void signalDestroy(gpointer data, GClosure *closure) throw () { try { delete reinterpret_cast< boost::function *>(data); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } public: TrackGObject(C *ptr, RefOwnership ownership) : Base_t(ptr, (bool)ownership) {} TrackGObject() {} TrackGObject(const TrackGObject &other) : Base_t(other) {} operator C * () const { return Base_t::get(); } operator bool () const { return Base_t::get() != NULL; } C * ref() const { return static_cast(g_object_ref(Base_t::get())); } static TrackGObject steal(C *ptr) { return TrackGObject(ptr, TRANSFER_REF); } template guint connectSignal(const char *signal, const boost::function &callback) { return g_signal_connect_data(Base_t::get(), signal, G_CALLBACK(&GObjectSignalHandler::handler), new boost::function(callback), &signalDestroy, GConnectFlags(0)); } void disconnectSignal(guint handlerID) { g_signal_handler_disconnect(static_cast(Base_t::get()), handlerID); } }; template class StealGObject : public TrackGObject { public: StealGObject(C *ptr) : TrackGObject(ptr, TRANSFER_REF) {} StealGObject() {} StealGObject(const StealGObject &other) : TrackGObject(other) {} }; template class TrackGLib : public boost::intrusive_ptr { typedef boost::intrusive_ptr Base_t; public: TrackGLib(C *ptr, RefOwnership ownership) : Base_t(ptr, (bool)ownership) {} TrackGLib() {} TrackGLib(const TrackGLib &other) : Base_t(other) {} operator C * () const { return Base_t::get(); } operator bool () const { return Base_t::get() != NULL; } C * ref() const { return static_cast(g_object_ref(Base_t::get())); } static TrackGLib steal(C *ptr) { return TrackGLib(ptr, TRANSFER_REF); } }; template class StealGLib : public TrackGLib { public: StealGLib(C *ptr) : TrackGLib(ptr, TRANSFER_REF) {} StealGLib() {} StealGLib(const StealGLib &other) : TrackGLib(other) {} }; /** * Defines a shared pointer for a GObject-based type, with intrusive * reference counting. Use *outside* of SyncEvolution namespace * (i.e. outside of SE_BEGIN/END_CXX. This is necessary because some * functions must be put into the boost namespace. The type itself is * *inside* the SyncEvolution namespace. * * connectSignal() connects a GObject signal to a boost::function with * the function signature S. Returns the handler ID, which can be * passed to g_signal_handler_disconnect() to remove the connection. * * Example: * SE_GOBJECT_TYPE(GFile) * SE_GOBJECT_TYPE(GObject) * SE_BEGIN_CXX * { * // reference normally increased during construction, * // steal() avoids that * GFileCXX filecxx = GFileCXX::steal(g_file_new_for_path("foo")); * GFile *filec = filecxx.get(); // does not increase reference count * // file freed here as filecxx gets destroyed * } * * GObjectCXX object(...); * // Define signature explicitly because it cannot be guessed from * // boost::bind() result. * object.connectSignal("notify", * boost::bind(...)); * // Signature is taken from boost::function parameter. * guint handlerID = * object.connectSignal("notify", * boost::function(boost::bind(...))); * object.disconnectSignal(handlerID); * SE_END_CXX */ #define SE_GOBJECT_TYPE(_x) \ void inline intrusive_ptr_add_ref(_x *ptr) { g_object_ref(ptr); } \ void inline intrusive_ptr_release(_x *ptr) { g_object_unref(ptr); } \ SE_BEGIN_CXX \ typedef TrackGObject<_x> _x ## CXX; \ typedef StealGObject<_x> _x ## StealCXX; \ SE_END_CXX \ /** * Defines a CXX smart pointer similar to SE_GOBJECT_TYPE, * but for types which have their own _ref and _unref * calls. * * Example: * SE_GLIB_TYPE(GMainLoop, g_main_loop) */ #define SE_GLIB_TYPE(_x, _func_prefix) \ void inline intrusive_ptr_add_ref(_x *ptr) { _func_prefix ## _ref(ptr); } \ void inline intrusive_ptr_release(_x *ptr) { _func_prefix ## _unref(ptr); } \ SE_BEGIN_CXX \ typedef TrackGLib<_x> _x ## CXX; \ typedef StealGLib<_x> _x ## StealCXX; \ SE_END_CXX SE_END_CXX SE_GOBJECT_TYPE(GFile) SE_GOBJECT_TYPE(GFileMonitor) SE_GLIB_TYPE(GMainLoop, g_main_loop) SE_GLIB_TYPE(GAsyncQueue, g_async_queue) SE_GLIB_TYPE(GHashTable, g_hash_table) SE_GLIB_TYPE(GIOChannel, g_io_channel) SE_BEGIN_CXX /** * Wrapper around g_file_monitor_file(). * Not copyable because monitor is tied to specific callback * via memory address. */ class GLibNotify : public boost::noncopyable { public: typedef boost::function callback_t; GLibNotify(const char *file, const callback_t &callback); private: GFileMonitorCXX m_monitor; callback_t m_callback; }; class SourceLocation; // Exception.h /** * Wraps GError. Where a GError** is expected, simply pass * a GErrorCXX instance. */ struct GErrorCXX { GError *m_gerror; /** empty error, NULL pointer */ GErrorCXX() : m_gerror(NULL) {} /** copies error content */ GErrorCXX(const GErrorCXX &other) : m_gerror(g_error_copy(other.m_gerror)) {} GErrorCXX &operator =(const GErrorCXX &other) { if (m_gerror != other.m_gerror) { if (m_gerror) { g_clear_error(&m_gerror); } if (other.m_gerror) { m_gerror = g_error_copy(other.m_gerror); } } return *this; } GErrorCXX &operator =(const GError* err) { if (err != m_gerror) { if (m_gerror) { g_clear_error(&m_gerror); } if (err) { m_gerror = g_error_copy(err); } } return *this; } /** takes over ownership */ void take (GError *err) { if (err != m_gerror) { if (m_gerror) { g_clear_error(&m_gerror); } m_gerror = err; } } /** For convenient access to GError members (message, domain, ...) */ const GError * operator-> () const { return m_gerror; } /** * For passing to C functions. They must not free the GError, * because GErrorCXX retains ownership. */ operator const GError * () const { return m_gerror; } /** error description, with fallback if not set (not expected, so not localized) */ operator const char * () { return m_gerror ? m_gerror->message : "<>"; } /** clear error */ ~GErrorCXX() { g_clear_error(&m_gerror); } /** clear error if any is set */ void clear() { g_clear_error(&m_gerror); } /** transfer ownership of error back to caller */ GError *release() { GError *gerror = m_gerror; m_gerror = NULL; return gerror; } /** checks whether the current error is the one passed as parameters */ bool matches(GQuark domain, gint code) { return g_error_matches(m_gerror, domain, code); } /** * Use this when passing GErrorCXX instance to C functions which need to set it. * Make sure the pointer isn't set yet (new GErrorCXX instance, reset if * an error was encountered before) or the GNOME functions will complain * when overwriting the existing error. */ operator GError ** () { return &m_gerror; } /** true if error set */ operator bool () { return m_gerror != NULL; } /** * always throws an exception, including information from GError if available: * : |failure */ void throwError(const SourceLocation &where, const std::string &action); static void throwError(const SourceLocation &where, const std::string &action, const GError *err); }; template void NoopDestructor(T *) {} template void GObjectDestructor(T *ptr) { g_object_unref(ptr); } template void GFreeDestructor(T *ptr) { g_free(static_cast(ptr)); } /** * Copies strings from a collection into a newly allocated, NULL * terminated array. Copying the strings is optional. Suggested * usage is: * * C collection; * collection.push_back(...); * boost::scoped_array array(AllocStringArray(collection)); * */ template char **AllocStringArray(const T &strings, const char **(*allocArray)(size_t) = NULL, void (*freeArray)(const char **) = NULL, const char *(*copyString)(const char *) = NULL, const void (*freeString)(char *) = NULL) { size_t arraySize = strings.size() + 1; const char **array = NULL; array = allocArray ? allocArray(arraySize) : new const char *[arraySize]; if (!array) { throw std::bad_alloc(); } try { memset(array, 0, sizeof(*array) * arraySize); size_t i = 0; BOOST_FOREACH(const std::string &str, strings) { array[i] = copyString ? copyString(str.c_str()) : str.c_str(); if (!array[i]) { throw std::bad_alloc(); } i++; } } catch (...) { if (freeString) { for (const char **ptr = array; *ptr; ptr++) { freeString(const_cast(*ptr)); } } if (freeArray) { freeArray(array); } throw; } return const_cast(array); } /** * Wraps a G[S]List of pointers to a specific type. * Can be used with boost::FOREACH and provides forward iterators * (two-way iterators and reverse iterators also possible, but not implemented). * Frees the list and optionally (not turned on by default) also frees * the data contained in it, using the provided destructor class. * Use GObjectDestructor for GObject instances. * * @param T the type of the instances pointed to inside the list * @param L GList or GSList * @param D destructor function freeing a T instance */ template< class T, class L, void (*D)(T*) = NoopDestructor > struct GListCXX : boost::noncopyable { L *m_list; static void listFree(GSList *l) { g_slist_free(l); } static void listFree(GList *l) { g_list_free(l); } static GSList *listPrepend(GSList *list, T *entry) { return g_slist_prepend(list, (gpointer)entry); } static GList *listPrepend(GList *list, T *entry) { return g_list_prepend(list, (gpointer)entry); } static GSList *listAppend(GSList *list, T *entry) { return g_slist_append(list, (gpointer)entry); } static GList *listAppend(GList *list, T *entry) { return g_list_append(list, (gpointer)entry); } public: typedef T * value_type; /** by default initialize an empty list; if parameter is not NULL, owership is transferred to the new instance of GListCXX */ GListCXX(L *list = NULL) : m_list(list) {} /** free list */ ~GListCXX() { clear(); } /** free old content, take owership of new one */ void reset(L *list = NULL) { clear(); m_list = list; } bool empty() { return m_list == NULL; } /** clear error if any is set */ void clear() { #if 1 BOOST_FOREACH(T *entry, *this) { D(entry); } #else for (iterator it = begin(); it != end(); ++it) { D(*it); } #endif listFree(m_list); m_list = NULL; } /** * Use this when passing GListCXX instance to C functions which need to set it. * Make sure the pointer isn't set yet (new GListCXX instance or cleared). */ operator L ** () { return &m_list; } /** * Cast to plain G[S]List, for use in functions which do not modify the list. */ operator L * () { return m_list; } class iterator : public std::iterator { L *m_entry; public: iterator(L *list) : m_entry(list) {} iterator(const iterator &other) : m_entry(other.m_entry) {} /** * boost::foreach needs a reference as return code here, * which forces us to do type casting on the address of the void * pointer, * then dereference the pointer. The reason is that typecasting the * pointer value directly yields an rvalue, which can't be used to initialize * the reference return value. */ T * &operator -> () const { return *getEntryPtr(); } T * &operator * () const { return *getEntryPtr(); } iterator & operator ++ () { m_entry = m_entry->next; return *this; } iterator operator ++ (int) { return iterator(m_entry->next); } bool operator == (const iterator &other) { return m_entry == other.m_entry; } bool operator != (const iterator &other) { return m_entry != other.m_entry; } private: /** * Used above, necessary to hide the fact that we do type * casting tricks. Otherwise the compiler will complain about * *(T **)&m_entry->data with "dereferencing type-punned * pointer will break strict-aliasing rules". * * That warning is about breaking assumptions that the compiler * uses for optimizations. The hope is that those optimzations * aren't done here, and/or are disabled by using a function. */ T** getEntryPtr() const { return (T **)&m_entry->data; } }; iterator begin() { return iterator(m_list); } iterator end() { return iterator(NULL); } class const_iterator : public std::iterator { L *m_entry; T *m_value; public: const_iterator(L *list) : m_entry(list) {} const_iterator(const const_iterator &other) : m_entry(other.m_entry) {} T * &operator -> () const { return *getEntryPtr(); } T * &operator * () const { return *getEntryPtr(); } const_iterator & operator ++ () { m_entry = m_entry->next; return *this; } const_iterator operator ++ (int) { return iterator(m_entry->next); } bool operator == (const const_iterator &other) { return m_entry == other.m_entry; } bool operator != (const const_iterator &other) { return m_entry != other.m_entry; } private: T** getEntryPtr() const { return (T **)&m_entry->data; } }; const_iterator begin() const { return const_iterator(m_list); } const_iterator end() const { return const_iterator(NULL); } void push_back(T *entry) { m_list = listAppend(m_list, entry); } void push_front(T *entry) { m_list = listPrepend(m_list, entry); } }; /** use this for a list which owns the strings it points to */ typedef GListCXX > GStringListFreeCXX; /** use this for a list which does not own the strings it points to */ typedef GListCXX GStringListNoFreeCXX; /** * Wraps a C gchar array and takes care of freeing the memory. */ class PlainGStr : public boost::shared_ptr { public: PlainGStr() {} PlainGStr(gchar *str) : boost::shared_ptr(str, g_free) {} PlainGStr(const PlainGStr &other) : boost::shared_ptr(other) {} operator const gchar *() const { return &**this; } const gchar *c_str() const { return &**this; } }; /** * Wraps a glib string array, frees with g_strfreev(). */ class PlainGStrArray : public boost::shared_ptr { public: PlainGStrArray() {} PlainGStrArray(gchar **array) : boost::shared_ptr(array, g_strfreev) {} PlainGStrArray(const PlainGStrArray &other) : boost::shared_ptr(other) {} operator gchar * const *() const { return &**this; } gchar * &at(size_t index) { return get()[index]; } private: // Hide this operator because boost::shared_ptr has problems with it, // probably because of missing traits for a pointer type. Instead use // at(). gchar * operator[] (size_t index); }; // empty template, need specialization based on parameter and return types template struct GAsyncReady5 {}; template struct GAsyncReady4 {}; template struct GAsyncReady3 {}; template struct GAsyncReady2 {}; template struct GAsyncReady1 {}; // empty template, need specializations based on arity template struct GAsyncReadyCXX {}; // five parameters of finish function template struct GAsyncReadyCXX : public GAsyncReady5::result_type, F, finish, typename boost::function_traits::arg1_type, typename boost::function_traits::arg2_type, typename boost::function_traits::arg3_type, typename boost::function_traits::arg4_type, typename boost::function_traits::arg5_type> { }; // four parameters template struct GAsyncReadyCXX : public GAsyncReady4::result_type, F, finish, typename boost::function_traits::arg1_type, typename boost::function_traits::arg2_type, typename boost::function_traits::arg3_type, typename boost::function_traits::arg4_type> { }; // three parameters template struct GAsyncReadyCXX : public GAsyncReady3::result_type, F, finish, typename boost::function_traits::arg1_type, typename boost::function_traits::arg2_type, typename boost::function_traits::arg3_type> { }; // two parameters template struct GAsyncReadyCXX : public GAsyncReady2::result_type, F, finish, typename boost::function_traits::arg1_type, typename boost::function_traits::arg2_type> { }; // one parameter template struct GAsyncReadyCXX : public GAsyncReady1::result_type, F, finish, typename boost::function_traits::arg1_type> { }; // For finish functions with return parameters the assumption is that // they have a non-void return value. Otherwise there would be no need // for the return parameters. // // result = GObject, GAsyncResult, A3, A4, A5 template struct GAsyncReady5 { typedef typename boost::remove_pointer::type A3_t; typedef typename boost::remove_pointer::type A4_t; typedef typename boost::remove_pointer::type A5_t; typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { A3_t retval1 = boost::value_initialized(); A4_t retval2 = boost::value_initialized(); A5_t retval3 = boost::value_initialized(); T t = finish(reinterpret_cast(sourceObject), result, &retval1, &retval2, &retval3); std::auto_ptr cb(static_cast(userData)); (*cb)(t, retval1, retval2, retval3); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // result = GObject, GAsyncResult, A3, A4, GError template struct GAsyncReady5 { typedef typename boost::remove_pointer::type A3_t; typedef typename boost::remove_pointer::type A4_t; typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { GErrorCXX gerror; A3_t retval1 = boost::value_initialized(); A4_t retval2 = boost::value_initialized(); T t = finish(reinterpret_cast(sourceObject), result, &retval1, &retval2, gerror); std::auto_ptr cb(static_cast(userData)); (*cb)(t, retval1, retval2, gerror); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // result = GObject, GAsyncResult, A3, A4 template struct GAsyncReady4 { typedef typename boost::remove_pointer::type A3_t; typedef typename boost::remove_pointer::type A4_t; typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { A3_t retval1 = boost::value_initialized(); A4_t retval2 = boost::value_initialized(); T t = finish(reinterpret_cast(sourceObject), result, &retval1, &retval2); std::auto_ptr cb(static_cast(userData)); (*cb)(t, retval1, retval2); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // result = GObject, GAsyncResult, A3, GError template struct GAsyncReady4 { typedef typename boost::remove_pointer::type A3_t; typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { GErrorCXX gerror; A3_t retval = boost::value_initialized(); T t = finish(reinterpret_cast(sourceObject), result, &retval, gerror); std::auto_ptr cb(static_cast(userData)); (*cb)(t, retval, gerror); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // res = GObject, GAsyncResult, GError template struct GAsyncReady3{ typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { GErrorCXX gerror; T t = finish(reinterpret_cast(sourceObject), result, gerror); std::auto_ptr cb(static_cast(userData)); (*cb)(t, gerror); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // void = GObject, GAsyncResult, GError template struct GAsyncReady3 { typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { GErrorCXX gerror; finish(reinterpret_cast(sourceObject), result, gerror); std::auto_ptr cb(static_cast(userData)); (*cb)(gerror); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // result = GObject, GAsyncResult template struct GAsyncReady2 { typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { T t = finish(reinterpret_cast(sourceObject), result); std::auto_ptr cb(static_cast(userData)); (*cb)(t); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // result = GAsyncResult, GError template struct GAsyncReady2 { public: typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { GErrorCXX gerror; T t = finish(result, gerror); std::auto_ptr cb(static_cast(userData)); (*cb)(t, gerror); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // void = GObject, GAsyncResult template struct GAsyncReady2 { typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { finish(reinterpret_cast(sourceObject), result); std::auto_ptr cb(static_cast(userData)); (*cb)(); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; // void = GAsyncResult, GError template struct GAsyncReady2 { typedef boost::function CXXFunctionCB_t; static void handleGLibResult(GObject *sourceObject, GAsyncResult *result, gpointer userData) throw () { try { GErrorCXX gerror; finish(result, gerror); std::auto_ptr cb(static_cast(userData)); (*cb)(gerror); } catch (...) { // called from C, must not let exception escape Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; /** * convenience macro for picking the GAsyncReadyCXX that matches the _prepare call: * first switch based on arity of the finish function, then on its type */ #define SYNCEVO_GLIB_CALL_ASYNC_CXX(_prepare) \ GAsyncReadyCXX< boost::remove_pointer::type, \ & _prepare ## _finish, \ boost::function_traits::type>::arity > /** * Macro for asynchronous methods which use a GAsyncReadyCallback to * indicate completion. The assumption is that there is a matching * _finish function for the function which starts the operation. * * The boost::function callback will be called exactly once, with the * following parameters: * - return value of the _finish call, if non-void * - all return parameters of the _finish call, in the order * in which they appear there * - a GError is passed as "const GError *", with NULL if the * _finish function did not set an error; it does not have to * be freed. * * Other parameters must be freed if required by the _finish semantic. * * Use boost::bind() with a boost::weak_ptr as second * parameter when the callback belongs to an instance which is * not guaranteed to be around when the operation completes. * * Example: * * static void asyncCB(const GError *gerror, const char *func, bool &failed, bool &done) { * done = true; * if (gerror) { * failed = true; * // log gerror->message or store in GErrorCXX * } * } * * bool done = false, failed = false; * SYNCEVO_GLIB_CALL_ASYNC(folks_individual_aggregator_prepare, * boost::bind(asyncCB, _1, * "folks_individual_aggregator_prepare", * boost::ref(failed), boost::ref(done)), * aggregator); * * // Don't continue unless finished, because the callback will write * // into "done" and possibly "failed". * while (!done) { * g_main_context_iteration(NULL, true); * } * * @param _prepare name of the function which starts the operation * @param _cb boost::function with GError pointer and optional result value; * exceptions are considered fatal * @param _args parameters of _prepare, without the final GAsyncReadyCallback + user_data pair; * usually at least a GCancellable pointer is part of the arguments */ #define SYNCEVO_GLIB_CALL_ASYNC(_prepare, _cb, _args...) \ _prepare(_args, \ SYNCEVO_GLIB_CALL_ASYNC_CXX(_prepare)::handleGLibResult, \ new SYNCEVO_GLIB_CALL_ASYNC_CXX(_prepare)::CXXFunctionCB_t(_cb)) // helper class for finish method with some kind of result other than void template class GAsyncReadyDoneCXX { public: template static void storeResult(GErrorCXX &gerrorStorage, R &resultStorage, bool &done, T result, const GError *gerror) { done = true; gerrorStorage = gerror; resultStorage = result; } template static boost::function createCB(R &result, GErrorCXX &gerror, bool &done) { return boost::bind(storeResult, boost::ref(gerror), boost::ref(result), boost::ref(done), _1, _2); } }; // helper class for finish method with void result template<> class GAsyncReadyDoneCXX { public: static void storeResult(GErrorCXX &gerrorStorage, bool &done, const GError *gerror) { done = true; gerrorStorage = gerror; } static boost::function createCB(const int *dummy, GErrorCXX &gerror, bool &done) { return boost::bind(storeResult, boost::ref(gerror), boost::ref(done), _1); } }; /** * Like SYNCEVO_GLIB_CALL_ASYNC, but blocks until the operation * has finished. * * @param _res an instance which will hold the result when done, NULL when result is void * @param _gerror a GErrorCXX instance which will hold an error * pointer afterwards in case of a failure */ #define SYNCEVO_GLIB_CALL_SYNC(_res, _gerror, _prepare, _args...) \ do { \ bool done = false; \ SYNCEVO_GLIB_CALL_ASYNC(_prepare, \ GAsyncReadyDoneCXX::result_type>::createCB(_res, _gerror, done), \ _args); \ GRunWhile(! boost::lambda::var(done)); \ } while (false); \ #endif // HAVE_GLIB SE_END_CXX #endif // INCL_GLIB_SUPPORT syncevolution-1.5/src/syncevo/ThreadSupport.h0000644000373300001540000000752112415726307022764 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_THREAD_SUPPORT # define INCL_THREAD_SUPPORT #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_GLIB # include #else # define GLIB_CHECK_VERSION(major, minor, revision) 0 #endif #include #include SE_BEGIN_CXX // The revised threading API we use below was introduced in glib 2.3.2 // The fallback for older glib is to not offer thread support. // The classes are still defined, they just don't do anything. #if GLIB_CHECK_VERSION(2, 32, 0) # define HAVE_THREAD_SUPPORT /** * Core building block for mutices. */ template class MutexTemplate { protected: M m_mutex; public: /** * Created when locking the mutex. When the last copy of it * gets destroyed, the mutex gets unlocked again. */ class Guard : private boost::shared_ptr { Guard(M *mutex) throw () : boost::shared_ptr(mutex, _unlock) {} friend class MutexTemplate; public: Guard() throw() {} void unlock() throw() { boost::shared_ptr::reset(); } }; /** * Lock the mutex and return a handle that'll automatically * unlock the mutex when the last copy gets destroyed. */ Guard lock() throw () { _lock(&m_mutex); return Guard(&m_mutex); } M *get() { return &m_mutex; } operator M * () { return &m_mutex; } }; /** * Initializes a mutex which was allocated dynamically * on the heap or stack and frees allocated resources * when done. It's an error to free a locked mutex. */ template class DynMutexTemplate : public MutexTemplate { public: DynMutexTemplate() { _init(MutexTemplate::get()); } ~DynMutexTemplate() { _clear(MutexTemplate::get()); } }; typedef MutexTemplate Mutex; typedef DynMutexTemplate DynMutex; typedef MutexTemplate RecMutex; typedef DynMutexTemplate DynRecMutex; class Cond { GCond m_cond; public: Cond() { g_cond_init(&m_cond); } ~Cond() { g_cond_clear(&m_cond); } void signal() { g_cond_signal(&m_cond); } template void wait(M &m) { g_cond_wait(&m_cond, m); } }; #else # undef HAVE_THREAD_SUPPORT /** * Fallback just to get code compiled. */ class DummyMutex { public: class Guard { public: void unlock() throw() {} }; Guard lock() throw() { return Guard(); } }; typedef DummyMutex Mutex; typedef DummyMutex DynMutex; typedef DummyMutex RecMutex; typedef DummyMutex RecDynMutex; class Cond { public: void signal() {} template void wait(M &m) {} }; #endif SE_END_CXX #endif // INCL_THREAD_SUPPORT syncevolution-1.5/src/syncevo/TrackingSyncSource.h0000664000373300001540000002615412405555067023747 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_TRACKINGSYNCSOURCE #define INCL_TRACKINGSYNCSOURCE #include #include #include #include #include #include SE_BEGIN_CXX /** * This class implements change tracking. Data sources which want to use * this functionality have to provide the following functionality * by implementing the pure virtual functions below: * - open() the data * - enumerate all existing items * - provide LUID and "revision string": * The LUID must remain *constant* when the user edits an item (it * may change when SyncEvolution changes an item), whereas the * revision string must *change* each time the item is changed * by anyone. * Both can be arbitrary strings, but keeping them simple (printable * ASCII, no white spaces, no equal sign) makes debugging simpler * because they can be stored as they are as key/value pairs in the * sync source's change tracking config node (the .other.ini files when * using file-based configuration). More complex strings use escape * sequences introduced with an exclamation mark for unsafe characters. * - import/export/update single items * - persistently store all changes in flush() * - clean up in close() * * A derived class may (but doesn't have to) override additional * functions to modify or replace the default implementations, e.g.: * - dumping the complete database (export()) * * Potential implementations of the revision string are: * - a modification time stamp * - a hash value of a textual representation of the item * (beware, such a hash might change as the textual representation * changes even though the item is unchanged) */ class TrackingSyncSource : public TestingSyncSource, virtual public SyncSourceRevisions, virtual public SyncSourceBlob, virtual public SyncSourceAdmin { public: /** * Creates a new tracking sync source. * * @param granularity sync sources whose revision string * is based on time should specify the number * of seconds which has to pass before changes * are detected reliably (see SyncSourceRevisions * for details), otherwise pass 0 */ TrackingSyncSource(const SyncSourceParams ¶ms, int granularitySeconds = 1); ~TrackingSyncSource() {} /** * ConfigNode used for change tracking in SyncSourceRevisions. * Derived classes might need that when implementing operations * which have side effects on other items (for example, * EvolutionCalendarSource::removeItem()). */ ConfigNode &getTrackingNode() { return *m_trackingNode; } /** * returns a list of all know sources for the kind of items * supported by this sync source */ virtual Databases getDatabases() = 0; /** * Actually opens the data source specified in the constructor, * will throw the normal exceptions if that fails. Should * not modify the state of the sync source. * * The expectation is that this call is fairly light-weight, but * does enough checking to determine whether the source is * usable. More expensive operations (like determining changes) * should be done in the beginSync() callback. * * In clients, it will be called for all sources before * the sync starts. In servers, it is called for each source once * the client asks for it, but not sooner. */ virtual void open() = 0; /** * A quick check whether the source currently has data. Currently * used as part of the "allow slow sync" checking after open() and * before beginSync(). Returning false is acceptable when it is * uncertain and too expensive to check. */ virtual bool isEmpty() = 0; /** * A unique identifier for the current state of the complete database. * The semantic is the following: * - empty string implies "state unknown" or "identifier not supported" (the default implementation) * - id not empty and id_1 == id_2 implies "nothing has changed"; * the inverse is not true (ids may be different although nothing has changed) */ virtual std::string databaseRevision() { return ""; } /** * fills the complete mapping from LUID to revision string of all * currently existing items * * Usually both LUID and revision string must be non-empty. The * only exception is a refresh-from-client: in that case the * revision string may be empty. The implementor of this call * cannot know whether empty strings are allowed, therefore it * should not throw errors when it cannot create a non-empty * string. The caller of this method will detect situations where * a non-empty string is necessary and none was provided. */ virtual void listAllItems(SyncSourceRevisions::RevisionMap_t &revisions) = 0; /** * Called at the start of the sync session to tell * the derived class about the cached information if (and only * if) listAllItems() and updateAllItems() were not called. The derived class * might not need this information, so the default implementation * simply ignores. * * A more complex API could have been defined to only prepare the * information when needed, but that seemed unnecessarily complex. */ virtual void setAllItems(const RevisionMap_t &revisions) {} /** * updates the revision map to reflect the current state * * May be called instead of listAllItems() if the caller has * a valid list to start from. If the implementor * cannot update the list, it must start from scratch by * reseting the list and calling listAllItems(). The default * implementation of this method does that. */ virtual void updateAllItems(SyncSourceRevisions::RevisionMap_t &revisions) { revisions.clear(); listAllItems(revisions); } /** * Create or modify an item. * * The sync source should be flexible: if the LUID is non-empty, it * shall modify the item referenced by the LUID. If the LUID is * empty, the normal operation is to add it. But if the item * already exists (e.g., a calendar event which was imported * by the user manually), then the existing item should be * updated also in the second case. * * Passing a LUID of an item which does not exist is an error. * This error should be reported instead of covering it up by * (re)creating the item. * * Errors are signaled by throwing an exception. Returning empty * strings in the result is an error which triggers an "item could * not be stored" error. * * @param luid identifies the item to be modified, empty for creating * @param item contains the new content of the item * @param raw item has internal format instead of engine format; * testing and backup/restore might use such an internal format * which may be different (more complete!) than the * format when talking to the sync engine * @return the result of inserting the item */ virtual InsertItemResult insertItem(const std::string &luid, const std::string &item, bool raw) = 0; /** * Return item data in engine format. * * Must throw a STATUS_NOT_FOUND (= 404) StatusException when the * item does not exist. * * @param luid identifies the item * @param raw return item in internal format instead of engine format * @retval item item data */ virtual void readItem(const std::string &luid, std::string &item, bool raw) = 0; /** * delete the item (renamed so that it can be wrapped by deleteItem()) * * Must throw a STATUS_NOT_FOUND (= 404) StatusException when the * item does not exist. */ virtual void removeItem(const string &luid) = 0; /** * optional: write all changes, throw error if that fails * * This is called while the sync is still active whereas * close() is called afterwards. Reporting problems * as early as possible may be useful at some point, * but currently doesn't make a relevant difference. */ virtual void flush() {} /** * closes the data source so that it can be reopened * * Just as open() it should not affect the state of * the database unless some previous action requires * it. */ virtual void close() = 0; /** * Returns the preferred mime type of the items handled by the sync source. * Example: "text/x-vcard" */ virtual std::string getMimeType() const = 0; /** * Returns the version of the mime type used by client. * Example: "2.1" */ virtual std::string getMimeVersion() const = 0; using SyncSource::getName; private: void checkStatus(SyncSourceReport &changes); boost::shared_ptr m_trackingNode; /** * Stores meta information besides the item list: * - "databaseRevision" = result of databaseRevision() at end of last sync * * Shares the same key/value store as m_trackingNode, * which uses the "item-" prefix in its keys to * avoid name clashes. */ boost::shared_ptr m_metaNode; protected: /* implementations of SyncSource callbacks */ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); virtual void deleteItem(const string &luid); virtual InsertItemResult insertItem(const std::string &luid, const std::string &item); virtual void readItem(const std::string &luid, std::string &item); virtual InsertItemResult insertItemRaw(const std::string &luid, const std::string &item); virtual void readItemRaw(const std::string &luid, std::string &item); virtual void enableServerMode(); virtual bool serverModeEnabled() const; virtual std::string getPeerMimeType() const; private: InsertItemResult doInsertItem(const std::string &luid, const std::string &item, bool raw); InsertItemResult continueInsertItem(const boost::function &check, const std::string &luid); void resetDatabaseRevision(); }; SE_END_CXX #endif // INCL_TRACKINGSYNCSOURCE syncevolution-1.5/src/syncevo/MapSyncSource.h0000664000373300001540000003123612405555067022717 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_MAPSYNCSOURCE #define INCL_MAPSYNCSOURCE #include #include #include SE_BEGIN_CXX class MapSyncSource; /** * rev + uid + list of subid; mainid is part of the context */ struct SubRevisionEntry { std::string m_revision; std::string m_uid; set m_subids; }; /** * mainid to rev + uid + list of subid * * List must contain an empty entry for the main item, if and only * if one exists. */ typedef map SubRevisionMap_t; /** * This is the API that must be implemented in addition to * TrackingSyncSource and SyncSourceLogging by a source to * be wrapped by MapSyncSource. * * The original interface will only be used in "raw" mode, which * should bypass any kind of cache used by the implementation. * They are guaranteed to be passed merged items. * * The new methods with mainid and subid are using during a sync * and should use the cache. They work on single items but modify * merged items. Thus the revision string of all sub items in * the same merged item will get modified when manipulating * one of its sub items. */ class SubSyncSource : virtual public SyncSourceBase { public: class SubItemResult { public: SubItemResult() : m_state(ITEM_OKAY) {} /** * @param mainid the ID used to access a set of items; may be different * from a (iCalendar 2.0) UID; during an update the mainid must * not be changed, so return the original one here * @param subid optional subid, same rules as for mainid * @param revision the revision string of the merged item after the operation; leave empty if not used * @param uid an arbitrary string, stored, but not used by MapSyncSource; * used in the CalDAV backend to associate mainid (= resource path) * with UID (= part of the item content, but with special semantic) * @param state report about what was done with the data */ SubItemResult(const string &mainid, const string &subid, const string &revision, const string &uid, InsertItemResultState state) : m_mainid(mainid), m_subid(subid), m_revision(revision), m_uid(uid), m_state(state) {} string m_mainid; string m_subid; string m_revision; string m_uid; InsertItemResultState m_state; }; SubSyncSource() : m_parent(NULL) {} /** * tells SubSyncSource about MapSyncSource which wraps it, * for getSynthesisAPI() */ void setParent(MapSyncSource *parent) { m_parent = parent; } MapSyncSource *getParent() const { return m_parent; } virtual SDKInterface *getSynthesisAPI() const; /** called after open() and before any of the following methods */ virtual void begin() = 0; /** called after a sync */ virtual void endSubSync(bool success) = 0; /** * A unique identifier for the current state of the complete database. * The semantic is the following: * - empty string implies "state unknown" or "identifier not supported" * - id not empty and ID1 == ID2 implies "nothing has changed"; * the inverse is not true (ids may be different although nothing has changed) * * Matches TrackingSyncSource::databaseRevision(). */ virtual std::string subDatabaseRevision() { return ""; } /** * Either listAllSubItems(), setAllSubItems(), or updateAllSubitems() * will be called after begin(). * * In the first case, the sub source is expected to provide a full list * of its items. In the second case, the caller was able to determine * that its cached copy of that list is still correct and provides it * the the source. In the third case, some revision information is know, * but it may be obsolete (revision string and/or subids changed or removed) * or incomplete (new items missing). The callee then must update the * information, possibly by falling back to listAllSubItems(). */ virtual void listAllSubItems(SubRevisionMap_t &revisions) = 0; /** * Called instead of listAllSubItems(). */ virtual void updateAllSubItems(SubRevisionMap_t &revisions) { revisions.clear(); listAllSubItems(revisions); } /** * Called instead of listAllSubItems(). */ virtual void setAllSubItems(const SubRevisionMap_t &revisions) = 0; virtual SubItemResult insertSubItem(const std::string &mainid, const std::string &subid, const std::string &item) = 0; virtual void readSubItem(const std::string &mainid, const std::string &subid, std::string &item) = 0; /** * Ensure that the sub-item does not exist. It is not an error to be called * for a non-existent sub-item or item. * * @return empty string if item is empty after removal, otherwise new revision string */ virtual std::string removeSubItem(const string &mainid, const std::string &subid) = 0; /** * Remove all sub-items belonging to mainid. */ virtual void removeMergedItem(const std::string &mainid) = 0; /** * Called whenever this class thinks that the item may no longer be * needed. Might be wrong... */ virtual void flushItem(const string &mainid) = 0; /** * Describe sub-item. Might be called for item which does not exist and * must not throw an error in that case. Providing a description is optional * and should only be done when it is reasonably cheap. */ virtual std::string getSubDescription(const string &mainid, const string &subid) = 0; /** * Called after MapSyncSource already populated the info structure. */ virtual void updateSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) {} private: MapSyncSource *m_parent; }; /** * This class wraps an underlying SyncSource and maps each of the * underlying items into one or more items in this class. The main use case * are CalDAV and Exchange Web Services, where each item is a set * of all events with the same UID, whereas SyncEvolution and SyncML * treat each individual event as one item. * * Terminology: * - single item = item as presented by this class (VEVENT) * - merged item = combination of all items sharing the same luid/uid (VCALENDAR) * - luid = SyncEvolution locally unique ID (VEVENT), mapped to mainid+subid * - mainid = ID for accessing the set of items (WebDAV resource path) * - subid = unique ID (RECURRENCE-ID) for sub-items (VEVENT) inside underlying item (VCALENDAR) * - uid = another unique ID shared by underlying items (iCalendar 2.0 UID), * not used by this class * * "luid" is composed from "mainid" and "subid" by backslash-escaping a * slash (/), then concatenating the results with a slash as * separator. If the subid is empty, no slash is added. The main * advantage of this scheme is that it works well with sub sources * which use URI escaping. * * This class expects an extended TrackingSyncSource (= * SubSyncSource) merely because that interface is the most convenient * to work with. If necessary, the logic may be refactored later on. * * This class uses much of the same infrastructure as the TrackingSyncSource, * except for change detection. This used to be done with TrackingSyncSource * as base class, but there are some key differences which made this very * awkward, primarily the fact that all merged items share the same revision * string. Now the tracking node is used to store one entry per merged item, in * the format "ref- = ////..." * * The following rules apply: * - A single item is added if its luid is new, updated if it exists and * the merged item's revision string is different, deleted if the luid is * gone (same logic as in normal TrackingSyncSource). * - A mainid is assigned to a new merged item by creating the merged item. * - Changes for an existing merged item may be applied to a cache, * which is explicitly flushed by this class. This implies that * such local changes must keep the mainid stable and have control * over the subid. * - Item logging is offered by this class (LoggingSyncSource), but * entirely depends on the sub source to implement the functionality. */ class MapSyncSource : public TestingSyncSource, // == SyncSourceSession, SyncSourceChanges, SyncSourceDelete, SyncSourceSerialize virtual public SyncSourceAdmin, virtual public SyncSourceBlob, virtual public SyncSourceLogging { public: /** * @param sub must also implement TrackingSyncSource and SyncSourceLogging interfaces! */ MapSyncSource(const SyncSourceParams ¶ms, const boost::shared_ptr &sub); ~MapSyncSource() {} /** compose luid from mainid and subid */ static std::string createLUID(const std::string &mainid, const std::string &subid); /** split luid into mainid (first) and subid (second) */ static StringPair splitLUID(const std::string &luid); virtual void enableServerMode(); virtual bool serverModeEnabled() const; virtual std::string getPeerMimeType() const { return getMimeType(); } virtual Databases getDatabases() { return dynamic_cast(*m_sub).getDatabases(); } virtual void open() { dynamic_cast(*m_sub).open(); } virtual void beginSync(const std::string &lastToken, const std::string &resumeToken); virtual std::string endSync(bool success); virtual bool isEmpty() { return dynamic_cast(*m_sub).getOperations().m_isEmpty(); } virtual bool isUsable() { return dynamic_cast(*m_sub).isUsable(); } virtual InsertItemResult insertItem(const std::string &luid, const std::string &item); virtual void readItem(const std::string &luid, std::string &item); virtual void deleteItem(const string &luid); virtual void close() { dynamic_cast(*m_sub).close(); } virtual std::string getMimeType() const { return dynamic_cast(*m_sub).getMimeType(); } virtual std::string getMimeVersion() const { return dynamic_cast(*m_sub).getMimeVersion(); } virtual std::string getDescription(sysync::KeyH aItemKey) { return dynamic_cast(*m_sub).getDescription(aItemKey); } virtual std::string getDescription(const string &luid); /* TestingSyncSource */ virtual void removeAllItems(); protected: virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { TestingSyncSource::getSynthesisInfo(info, fragments); m_sub->updateSynthesisInfo(info, fragments); } private: boost::shared_ptr m_sub; /** escape / in uid with %2F, so that splitMainIDValue() and splitLUID() can use / as separator */ static StringEscape m_escape; std::string m_oldLUID; /** * information about the current set of items: * initialized as part of beginSync(), * updated as items are modified, * stored in endSync() */ SubRevisionMap_t m_revisions; /** on-disk representation of m_revisions */ boost::shared_ptr m_trackingNode; /** * Stores meta information besides the item list: * - "databaseRevision" = result of databaseRevision() at end of last sync * * Shares the same key/value store as m_trackingNode, * which uses the "item-" prefix in its keys to * avoid name clashes. */ boost::shared_ptr m_metaNode; /** mirrors SyncSourceRevisions::detectChanges() */ void detectChanges(SyncSourceRevisions::ChangeMode mode); }; SE_END_CXX #endif // INCL_MAPSYNCSOURCE syncevolution-1.5/src/syncevo/LogRedirect.h0000644000373300001540000002010612326412403022343 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOGREDIRECT #define INCL_LOGREDIRECT #include #include #include #include #include SE_BEGIN_CXX /** * Intercepts all text written to stdout or stderr and passes it * through the currently active logger, which may or may not be * this instance itself. In addition, it catches SIGSEGV, SIGABRT, * SIGBUS and processes pending output before shutting down * by raising these signals again. * * The interception is done by replacing the file descriptors * 1 and 2. The original file descriptors are preserved; the * original FD 1 is used for writing log messages that are * intended to reach the user. * * This class tries to be simple and therefore avoids threads * and forking. It intentionally doesn't protect against multiple * threads accessing it. This is something that has to be avoided * by the user. The redirected output has to be read whenever * possible, ideally before producing other log output (process()). * * Because the same thread that produces the output also reads it, * there can be a deadlock if more output is produced than the * in-kernel buffers allow. Pipes and stream sockets therefore cannot * be used. Unreliable datagram sockets work: * - normal write() calls produce packets * - if the sender always writes complete lines, the reader * will not split them because it can receive the complete packet * * Unix Domain datagram sockets would be nice: * - socketpair() creates an anonymous connection, no-one else * can send us unwanted data (in contrast to, say, UDP) * - unlimited chunk size * - *but* packets are *not* dropped if too much output is produced * (found with LogRedirectTest::overload test and confirmed by * "man unix") * * To avoid deadlocks, UDP sockets have to be used. It has drawbacks: * - chunk size limited by maximum size of IP4 packets * - more complex to set up (currently assumes that 127.0.0.1 is the * local interface) * - anyone running locally can send us log data * * The implementation contains code for both; UDP is active by default * because the potential deadlock is considered more severe than UDP's * disadvantages. * * Because this class is to be used early in the startup * of the application and in low-level error scenarios, it * must not throw exceptions or return errors. If something * doesn't work, it stops redirecting output. * * Redirection and signal handlers are disabled if the environment * variable SYNCEVOLUTION_DEBUG is set (regardless of its value). * * In contrast to stderr, stdout is only passed into the logging * system as complete lines. That's because it may include data (like * synccompare output) which is not printed line-oriented and * inserting line breaks (as the logging system does) is undesirable. * If an output packet does not end in a line break, that last line * is buffered and written together with the next packet, or in flush(). */ class LogRedirect : public LoggerStdout { public: struct FDs { int m_original; /** the original output FD, 2 for stderr */ int m_copy; /** a duplicate of the original output file descriptor */ int m_write; /** the write end of the replacement */ int m_read; /** the read end of the replacement */ }; /** ignore any error output containing "error" */ static void addIgnoreError(const std::string &error); /** * Messages containing text listed in * SYNCEVOLUTION_SUPPRESS_ERRORS env variable (new-line separated) * or registered via addIgnoreError() are not real errors and * should only be logged for developers. */ static bool ignoreError(const std::string &text); private: FDs m_stdout, m_stderr; bool m_streams; /**< using reliable streams instead of UDP */ FILE *m_out; /** a stream for Logger::SHOW output which isn't redirected */ FILE *m_err; /** corresponding stream for any other output */ char *m_buffer; /** typically fairly small buffer for reading */ std::string m_stdoutData; /**< incomplete stdout line */ size_t m_len; /** total length of buffer */ bool m_processing; /** flag to detect recursive process() calls */ static LogRedirect *m_redirect; /**< single active instance, for signal handler */ static std::set m_knownErrors; /** texts contained in errors which are to be ignored */ // non-virtual helper functions which can always be called, // including the constructor and destructor void redirect(int original, FDs &fds) throw(); void restore(FDs &fds) throw(); void restore() throw(); /** @return true if data was available */ bool process(FDs &fds) throw(); static void abortHandler(int sig) throw(); void init(); public: enum Mode { STDERR_AND_STDOUT, STDERR }; /** * Redirect both stderr and stdout or just stderr, * using UDP so that we don't block when not reading * redirected output. * * messagev() only writes messages to the previous stdout * or the optional file which pass the filtering (relevant, * suppress known errors, ...). * * May only be called when there is no other active LogRedirect * instance. Not thread-safe, in contrast to the actual logging * method and redirect handling. * * Does not add or remove the logger from the logger stack. * That must be done by the caller. */ LogRedirect(Mode mode, const char *filename = NULL); ~LogRedirect() throw(); virtual void remove() throw(); /** * Remove redirection (if any) after a fork and before an exec. */ static void removeRedirect() throw(); /** * Meant to be used for redirecting output of a specific command * via fork()/exec(). Prepares reliable streams, as determined by * ExecuteFlags, without touch file descriptor 1 and 2 and without * installing itself as logger. In such an instance, process() * will block until both streams get closed on the writing end. */ LogRedirect(ExecuteFlags flags); /** true if stdout is redirected */ static bool redirectingStdout() { return m_redirect && m_redirect->m_stdout.m_read > 0; } /** true if stderr is redirected */ static bool redirectingStderr() { return m_redirect && m_redirect->m_stderr.m_read > 0; } /** reset any redirection, if active */ static void reset() { if (m_redirect) { m_redirect->flush(); m_redirect->restore(); } } const FDs &getStdout() { return m_stdout; } const FDs &getStderr() { return m_stderr; } /** * Read currently available redirected output and handle it. * * When using unreliable output redirection, it will always * keep going without throwing exceptions. When using reliable * redirection and a fatal error occurs, then and exception * is thrown. */ void process(); /** same as process(), but also dump all cached output */ void flush() throw(); /** format log messages via normal LogStdout and print to a valid stream owned by us */ virtual void messagev(const MessageOptions &options, const char *format, va_list args); }; SE_END_CXX #endif // INCL_LOGREDIRECT syncevolution-1.5/src/syncevo/LogStdout.h0000644000373300001540000000365712326412403022100 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOGSTDOUT #define INCL_LOGSTDOUT #include #include #include #include #include SE_BEGIN_CXX /** * A logger which writes to stdout or a file. */ class LoggerStdout : public Logger { FILE *m_file; bool m_closeFile; public: /** * write to stdout by default * * @param file override default file; NULL disables printing */ LoggerStdout(FILE *file = stdout); /** * open and own the given log file * * @param filename will be opened relative to current directory */ LoggerStdout(const std::string &filename); ~LoggerStdout(); void write(FILE *file, Level msglevel, Level filelevel, const std::string *prefix, const std::string *procname, const char *format, va_list args); virtual void messagev(const MessageOptions &options, const char *format, va_list args); }; SE_END_CXX #endif // INCL_LOGSTDOUT syncevolution-1.5/src/syncevo/LogSyslog.h0000644000373300001540000000272312326412403022067 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOGSYSLOG #define INCL_LOGSYSLOG #include #include #include #include #include SE_BEGIN_CXX /** * A logger which writes to syslog. */ class LoggerSyslog : public Logger { const std::string m_processName; Handle m_parentLogger; public: /** * Write to syslog by default. */ LoggerSyslog(const std::string &processName); ~LoggerSyslog(); virtual void messagev(const MessageOptions &options, const char *format, va_list args); private: static int getSyslogLevel(Level level); }; SE_END_CXX #endif // INCL_LOGSYSLOG syncevolution-1.5/src/syncevo/Exception.h0000664000373300001540000001767312330727742022131 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ #ifndef INCL_SYNCEVOLUTION_EXCEPTION # define INCL_SYNCEVOLUTION_EXCEPTION #include #include #include #include SE_BEGIN_CXX /** Encapsulates source information. */ class SourceLocation { public: const char *m_file; int m_line; SourceLocation(const char *file, int line) : m_file(file), m_line(line) {} }; /** Convenience macro to create a SourceLocation for the current location. */ #define SE_HERE SyncEvo::SourceLocation(__FILE__, __LINE__) enum HandleExceptionFlags { HANDLE_EXCEPTION_FLAGS_NONE = 0, /** * a 404 status error is possible and must not be logged as ERROR */ HANDLE_EXCEPTION_404_IS_OKAY = 1 << 0, HANDLE_EXCEPTION_FATAL = 1 << 1, /** * don't log exception as ERROR */ HANDLE_EXCEPTION_NO_ERROR = 1 << 2, HANDLE_EXCEPTION_MAX = 1 << 3, }; /** * an exception which records the source file and line * where it was thrown * * @TODO add function name */ class Exception : public std::runtime_error { public: Exception(const std::string &file, int line, const std::string &what) : std::runtime_error(what), m_file(file), m_line(line) {} ~Exception() throw() {} const std::string m_file; const int m_line; /** * Convenience function, to be called inside a catch(..) block. * * Rethrows the exception to determine what it is, then logs it * at the chosen level (error by default). * * Turns certain known exceptions into the corresponding * status code if status still was STATUS_OK when called. * Returns updated status code. * * @param logPrefix passed to SE_LOG* messages * @retval explanation set to explanation for problem, if non-NULL * @param level level to be used for logging */ static SyncMLStatus handle(SyncMLStatus *status = NULL, const std::string *logPrefix = NULL, std::string *explanation = NULL, Logger::Level = Logger::ERROR, HandleExceptionFlags flags = HANDLE_EXCEPTION_FLAGS_NONE); static SyncMLStatus handle(const std::string &logPrefix, HandleExceptionFlags flags = HANDLE_EXCEPTION_FLAGS_NONE) { return handle(NULL, &logPrefix, NULL, Logger::ERROR, flags); } static SyncMLStatus handle(std::string &explanation, HandleExceptionFlags flags = HANDLE_EXCEPTION_FLAGS_NONE) { return handle(NULL, NULL, &explanation, Logger::ERROR, flags); } static void handle(HandleExceptionFlags flags) { handle(NULL, NULL, NULL, Logger::ERROR, flags); } static void log() { handle(NULL, NULL, NULL, Logger::DEBUG); } /** * Tries to identify exception class based on explanation string created by * handle(). If successful, that exception is throw with the same * attributes as in the original exception. * * If not, tryRethrow() returns (mustThrow false) or throws a std::runtime_error * with the explanation as text. */ static void tryRethrow(const std::string &explanation, bool mustThrow = false); /** * Same as tryRethrow() for strings with a 'org.syncevolution.xxxx:' prefix, * as passed as D-Bus error strings. */ static void tryRethrowDBus(const std::string &error); /** * throws a StatusException with a local, fatal error with the given string * or (on the iPhone, where exception handling is not * supported by the toolchain) prints an error directly * and aborts * * output format: * * @param error a string describing the error */ static void throwError(const SourceLocation &where, const std::string &error) SE_NORETURN; /** * throw an exception with a specific status code after an operation failed and * remember that this instance has failed * * output format: * * @param status a more specific status code; other throwError() variants * use STATUS_FATAL + sysync::LOCAL_STATUS_CODE, which is interpreted * as a fatal local error * @param action a string describing what was attempted *and* how it failed */ static void throwError(const SourceLocation &where, SyncMLStatus status, const std::string &failure) SE_NORETURN; /** * throw an exception after an operation failed and * remember that this instance has failed * * output format: : * * @Param action a string describing the operation or object involved * @param error the errno error code for the failure */ static void throwError(const SourceLocation &where, const std::string &action, int error) SE_NORETURN; /** * An error handler which prints the error message and then * stops the program. Never returns. * * The API was chosen so that it can be used as libebook/libecal * "backend-dies" signal handler. */ static void fatalError(void *object, const char *error) SE_NORETURN; }; /** * StatusException by wrapping a SyncML status */ class StatusException : public Exception { public: StatusException(const std::string &file, int line, const std::string &what, SyncMLStatus status) : Exception(file, line, what), m_status(status) {} SyncMLStatus syncMLStatus() const { return m_status; } protected: SyncMLStatus m_status; }; class TransportException : public Exception { public: TransportException(const std::string &file, int line, const std::string &what) : Exception(file, line, what) {} ~TransportException() throw() {} }; class TransportStatusException : public StatusException { public: TransportStatusException(const std::string &file, int line, const std::string &what, SyncMLStatus status) : StatusException(file, line, what, status) {} ~TransportStatusException() throw() {} }; /** throw a normal SyncEvolution Exception, including source information */ #define SE_THROW(_what) \ SE_THROW_EXCEPTION(Exception, _what) /** throw a class which accepts file, line, what parameters */ #define SE_THROW_EXCEPTION(_class, _what) \ throw _class(__FILE__, __LINE__, _what) /** throw a class which accepts file, line, what plus 1 additional parameter */ #define SE_THROW_EXCEPTION_1(_class, _what, _x1) \ throw _class(__FILE__, __LINE__, (_what), (_x1)) /** throw a class which accepts file, line, what plus 2 additional parameters */ #define SE_THROW_EXCEPTION_2(_class, _what, _x1, _x2) \ throw _class(__FILE__, __LINE__, (_what), (_x1), (_x2)) /** throw a class which accepts file, line, what plus 2 additional parameters */ #define SE_THROW_EXCEPTION_3(_class, _what, _x1, _x2, _x3) \ throw _class(__FILE__, __LINE__, (_what), (_x1), (_x2), (_x3)) /** throw a class which accepts file, line, what plus 2 additional parameters */ #define SE_THROW_EXCEPTION_4(_class, _what, _x1, _x2, _x3, _x4) \ throw _class(__FILE__, __LINE__, (_what), (_x1), (_x2), (_x3), (_x4)) /** throw a class which accepts file, line, what parameters and status parameters*/ #define SE_THROW_EXCEPTION_STATUS(_class, _what, _status) \ throw _class(__FILE__, __LINE__, _what, _status) SE_END_CXX #endif // INCL_SYNCEVOLUTION_EXCEPTION syncevolution-1.5/src/syncevo/FilterConfigNode.h0000644000373300001540000000652512326412403023332 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_FILTER_CONFIG_NODE # define INCL_EVOLUTION_FILTER_CONFIG_NODE #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX /** * This class acts as filter between a real config node and its user: * reads which match properties which are set in the filter will * return the value set in the filter. Writes will go to the underlying * node and future reads will return the written value. * * The purpose of this class is temporarily overriding saved values * during one run without having to modify the saved values. */ class FilterConfigNode : public ConfigNode { public: /** config filters are the same case-insensitive string to string mapping as property sets */ typedef ConfigProps ConfigFilter; /** read-write access to underlying node */ FilterConfigNode(const boost::shared_ptr &node, const ConfigFilter &filter = ConfigFilter()); /** read-only access to underlying node */ FilterConfigNode(const boost::shared_ptr &node, const ConfigFilter &filter = ConfigFilter()); virtual std::string getName() const { return m_readOnlyNode->getName(); } virtual bool isVolatile() const { return m_readOnlyNode->isVolatile(); } /** add another entry to the list of filter properties */ virtual void addFilter(const std::string &property, const InitStateString &value); /** replace current filter list with new one */ virtual void setFilter(const ConfigFilter &filter); virtual const ConfigFilter &getFilter() const { return m_filter; } /* ConfigNode API */ virtual void flush(); virtual InitStateString readProperty(const std::string &property) const; virtual void writeProperty(const std::string &property, const InitStateString &value, const std::string &comment = ""); virtual void readProperties(ConfigProps &props) const; virtual void removeProperty(const std::string &property); virtual bool exists() const { return m_readOnlyNode->exists(); } virtual bool isReadOnly() const { return !m_node || m_readOnlyNode->isReadOnly(); } virtual void clear(); private: ConfigFilter m_filter; boost::shared_ptr m_node; boost::shared_ptr m_readOnlyNode; }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/PrefixConfigNode.h0000644000373300001540000000530012326412403023330 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_PREFIX_CONFIG_NODE # define INCL_EVOLUTION_PREFIX_CONFIG_NODE #include #include #include #include #include #include #include SE_BEGIN_CXX /** * This class acts as filter between a real config node and its user: * a fixed prefix is added to each key when setting/getting a property. * The list of properties only includes the key/value pairs with * a matching prefix. * * The purpose is to have multiple users accessing the same underlying * node without running into namespace conflicts. */ class PrefixConfigNode : public ConfigNode { public: /** read-write access to underlying node */ PrefixConfigNode(const std::string prefix, const boost::shared_ptr &node); /** read-only access to underlying node */ PrefixConfigNode(const std::string prefix, const boost::shared_ptr &node); virtual std::string getName() const { return m_readOnlyNode->getName(); } virtual bool isVolatile() const { return m_readOnlyNode->isVolatile(); } /* ConfigNode API */ virtual void flush(); virtual InitStateString readProperty(const std::string &property) const; virtual void writeProperty(const std::string &property, const InitStateString &value, const std::string &comment = ""); virtual void readProperties(ConfigProps &props) const; virtual void removeProperty(const std::string &property); virtual bool exists() const { return m_readOnlyNode->exists(); } virtual bool isReadOnly() const { return !m_node || m_readOnlyNode->isReadOnly(); } virtual void clear(); private: std::string m_prefix; boost::shared_ptr m_node; boost::shared_ptr m_readOnlyNode; }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/SafeConfigNode.h0000644000373300001540000000663712326412403022767 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_SAFE_CONFIG_NODE # define INCL_EVOLUTION_SAFE_CONFIG_NODE #include #include #include #include #include #include #include SE_BEGIN_CXX /** * This class acts as filter between a real config node and its user: * key/value strings which normally wouldn't be valid are escaped * before passing them into the underlying node. When reading, they * are unescaped again. * * Unsafe characters are replaced by ! followed by two characters * giving the character value in hex notation. */ class SafeConfigNode : public ConfigNode { public: /** read-write access to underlying node */ SafeConfigNode(const boost::shared_ptr &node); /** read-only access to underlying node */ SafeConfigNode(const boost::shared_ptr &node); /** * chooses which characters are accepted by underlying node: * in strict mode, only alphanumeric and -_ are supported; * in non-strict mode, only line breaks, = and spaces at start and end are escaped */ void setMode(bool strict) { m_strictMode = strict; } bool getMode() { return m_strictMode; } virtual std::string getName() const { return m_readOnlyNode->getName(); } virtual bool isVolatile() const { return m_readOnlyNode->isVolatile(); } /* keep underlying methods visible; our own setProperty() would hide them */ using ConfigNode::setProperty; /* ConfigNode API */ virtual void flush(); virtual InitStateString readProperty(const std::string &property) const; virtual void writeProperty(const std::string &property, const InitStateString &value, const std::string &comment = ""); virtual void readProperties(ConfigProps &props) const; virtual void removeProperty(const std::string &property); virtual bool exists() const { return m_readOnlyNode->exists(); } virtual bool isReadOnly() const { return !m_node || m_readOnlyNode->isReadOnly(); } virtual void clear() { m_node->clear(); } private: boost::shared_ptr m_node; boost::shared_ptr m_readOnlyNode; bool m_strictMode; /** * turn str into something which can be used as key or value in ConfigNode */ std::string escape(const std::string &str) const { return StringEscape::escape(str, '!', m_strictMode ? StringEscape::STRICT : StringEscape::INI_VALUE); } static std::string unescape(const std::string &str) { return StringEscape::unescape(str, '!'); } }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/SyncConfig.h0000664000373300001540000023353612405555067022235 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_CONFIG # define INCL_SYNC_EVOLUTION_CONFIG #include #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX class FileConfigTree; /** * @defgroup ConfigHandling Configuration Handling * @{ */ /** * The SyncEvolution configuration is versioned, so that incompatible * changes to the on-disk config and files can be made more reliably. * * The on-disk configuration is versioned at three levels: * - root level * - context * - peer * * This granularity allows migrating individual peers, contexts or * everything to a new format. * * For each of these levels, two numbers are stored on disk and * hard-coded in the binary: * - current version = incremented each time the format is extended * - minimum version = set to current version each time a backwards * incompatible change is made * * This mirrors the libtool library versioning. * * Reading must check that the on-disk minimum version is <= the * binary's current version. Otherwise the config is too recent to * be used. * * Writing will bump minimum and current version on disk to the * versions in the binary. It will never decrease versions. This * works when the more recent format adds information that can * be safely ignored by older releases. If that is not possible, * then the "minimum" version must be increased to prevent older * releases from using the config. * * If bumping the versions increases the minimum version * beyond the version supported by the release which wrote the config, * that release will no longer work. Experimental releases will throw * an error and users must explicitly migrate to the current * format. Stable releases will migrate automatically. * * The on-disks current version can be checked to determine how to * handle it. It may be more obvious to simple check for the existence * of certain properties (that's how this was handled before the * introduction of versioning). * * Here are some simple rules for handling the versions: * - increase CUR version when adding new properties or files * - set MIN to CUR when it is not safe that older releases * read and write a config with the current format * * SyncEvolution < 1.2 had no versioning. It's format is 0. * SyncEvolution 1.2: * - config peer min/cur version 1, because * of modified libsynthesis binfiles and * - context min/cur version 1, because * evolutionsource->database, evolutionuser/password->databaseUser/Password */ static const int CONFIG_ROOT_MIN_VERSION = 0; static const int CONFIG_ROOT_CUR_VERSION = 0; static const int CONFIG_CONTEXT_MIN_VERSION = 1; static const int CONFIG_CONTEXT_CUR_VERSION = 1; static const int CONFIG_PEER_MIN_VERSION = 1; static const int CONFIG_PEER_CUR_VERSION = 1; enum ConfigLevel { CONFIG_LEVEL_ROOT, /**< = GLOBAL_SHARING */ CONFIG_LEVEL_CONTEXT, /**< = SOURCE_SET_SHARING */ CONFIG_LEVEL_PEER, /**< = NO_SHARING */ CONFIG_LEVEL_MAX }; std::string ConfigLevel2String(ConfigLevel level); enum ConfigLimit { CONFIG_MIN_VERSION, CONFIG_CUR_VERSION, CONFIG_VERSION_MAX }; extern int ConfigVersions[CONFIG_LEVEL_MAX][CONFIG_VERSION_MAX]; class SyncSourceConfig; typedef SyncSourceConfig PersistentSyncSourceConfig; class ConfigTree; class UserInterface; class SyncSourceNodes; class ConstSyncSourceNodes; class SyncConfig; struct ConfigPasswordKey; /** name of the per-source admin data property */ extern const char *const SourceAdminDataName; /** name of the sync property for set/getMaxMsgSize */ extern const char *const SyncMaxMsgSize; struct UserIdentity { /** * Defines how information about the user and the * corresponding authentication method is stored. * * The config level itself handles USER_IDENTITY_PLAIN_TEXT (= * "user", the traditional username/password authentication * with the password being stored in the config, in a keyring * or retrieved at runtime) and USER_IDENTITY_SYNC_CONFIG (= * "id", an indirect lookup mechanism which uses the * username/password from a different sync config). * * Other string values are also allowed in the config. When * needed, one of the plugable identity providers must * recognize the string and provide credentials. * * Never empty. However, it may be marked as "unset", in which * case the actual string in the config didn't have a prefix * and the traditional USER_IDENTITY_PLAIN_TEXT is used as * fallback. */ InitStateString m_provider; /** * The actual username (USER_IDENTITY_PLAIN_TEXT) or config name * (USER_IDENTITY_SYNC_CONFIG). * * It is unset if and only if the config had no value for the "username" * property. */ InitStateString m_identity; /** * Returns concatenation of provider prefix (only if set) and idendity. */ InitStateString toString() const; /** * Splits the string as generated by toString(). */ static UserIdentity fromString(const InitStateString &idString); /** unset, empty identity */ UserIdentity(); /** * true iff the config had a value. */ bool wasSet() const { return m_identity.wasSet(); } }; /** simplified creation of string lists: InitList("foo") + "bar" + ... */ template class InitList : public std::list { public: InitList() {} InitList(const T &initialValue) { std::list::push_back(initialValue); } InitList &operator + (const T &rhs) { std::list::push_back(rhs); return *this; } InitList &operator += (const T &rhs) { std::list::push_back(rhs); return *this; } }; typedef InitList Aliases; typedef InitList Values; enum PropertyType { /** sync properties occur once per config */ SYNC_PROPERTY_TYPE, /** source properties occur once per source in each config */ SOURCE_PROPERTY_TYPE, /** exact type is unknown */ UNKNOWN_PROPERTY_TYPE }; /** * A property name with optional source and context. * String format is [/][@|@@] * * Note that the part after the @ sign without another @ is always * a context. The normal shorthand of just without context * does not work here. */ class PropertySpecifier { public: std::string m_source; /**< source name, empty if applicable to all or sync property */ std::string m_property; /**< property name, must not be empty */ std::string m_config; /**< config name, empty if none, otherwise @ or @ */ enum { NO_NORMALIZATION = 0, NORMALIZE_SOURCE = 1, NORMALIZE_CONFIG = 2 }; /** parse, optionally also normalize source and config */ static PropertySpecifier StringToPropSpec(const std::string &spec, int flags = NORMALIZE_SOURCE|NORMALIZE_CONFIG); std::string toString(); }; /** * A property has a name and a comment. Derived classes might have * additional code to read and write the property from/to a * ConfigNode. They might also one or more of the properties * on the fly, therefore the virtual get methods which return a * string value and not just a reference. * * In addition to the name, it may also have aliases. When reading * from a ConfigNode, all specified names are checked in the order in * which they are listed, and the first one found is used. When * writing, an existing key is overwritten, otherwise the main name is * created as a new key. * * A default value is returned if the ConfigNode doesn't have * a value set (= empty string). Invalid values in the configuration * trigger an exception. Setting invalid values does not because * it is not known where the value comes from - the caller should * check it himself. * * Properties are either registered as source properties or * source-independent sync properties. In each of these two sets of * properties, the names must be unique. * * Properties can be either user-visible (and editable) or * internal. Internal properties are used to cache some information * and may get lost when copying configurations. Therefore it * must be possible to recreate them somehow, if necessary with * an expensive operation like a slow sync. * * Starting with SyncEvolution 1.0, the internal storage of * property values was reorganized so that some properties * can be shared between peers. The concept of two property * sets (source and sync properties) was preserved because of * the simplicity that it brings to the APIs. Now this concept * is implemented by mapping properties into "views" that * contain the properties relevant for a particular peer. * Setting a shared value in one view updates the value in * another. For details, see: * http://syncevolution.org/development/configuration-handling * * As in the migration from the Sync4j config layout (internal and * user-visible properties in the same file), the code is written so * that properties are mapped to config nodes according to the most * recent layout. Older layouts are accessed by using the same config * node instance multiple times. */ class ConfigProperty { public: ConfigProperty(const std::string &name, const std::string &comment, const std::string &def = std::string(""), const std::string &descr = std::string("")) : m_obligatory(false), m_hidden(false), m_sharing(NO_SHARING), m_names(name), m_comment(boost::trim_right_copy(comment)), m_defValue(def), m_descr(descr) {} ConfigProperty(const Aliases &names, const std::string &comment, const std::string &def = std::string(""), const std::string &descr = std::string("")) : m_obligatory(false), m_hidden(false), m_sharing(NO_SHARING), m_names(names), m_comment(boost::trim_right_copy(comment)), m_defValue(def), m_descr(descr) {} virtual ~ConfigProperty() {} /** name to be used for a specific node: first name if not in node, otherwise existing key */ std::string getName(const ConfigNode &node) const; /** primary name */ std::string getMainName() const { return m_names.front(); } /* virtual so that derived classes like SourceBackendConfigProperty can generate the result dynamically */ virtual const Aliases &getNames() const { return m_names; } virtual std::string getComment() const { return m_comment; } virtual std::string getDefValue() const { return m_defValue; } virtual std::string getDescr() const { return m_descr; } /** * Check whether the given value is okay. * If not, then set an error string (one line, no punctuation). * * @return true if value is okay */ virtual bool checkValue(const std::string &value, std::string &error) const { return true; } /** * Only useful when a config property wants to check itself whether to retrieve password * Check the password and cache the result in the filter node on the fly if a property needs. * sourceName and sourceConfigNode might be not set by caller. They only affect * when checking password for syncsourceconfig * @param ui user interface * @param config the peer config in which we are checking the password * @param flags see PasswordConfigProperty * @param sourceName the source name for which we need the password, empty if checking a peer password */ virtual void checkPassword(UserInterface &ui, SyncConfig &config, int flags, const std::string &sourceName = std::string()) const {} /** * Try to save password if a config property wants. * It firstly check password and then invoke ui's savePassword * function to save the password if necessary */ virtual void savePassword(UserInterface &ui, SyncConfig &config, const std::string &sourceName = std::string()) const {} /** * This is used to generate description dynamically according to the context information * Default implmenentation is to return value set in the constructor, otherwise the server name. * Derived classes can override this function. Used by 'checkPassword' and 'savePassword' * to generate description for user interface. */ virtual const std::string getDescr(const std::string &serverName, FilterConfigNode &globalConfigNode, const std::string &sourceName = std::string(), const boost::shared_ptr &sourceConfigNode=boost::shared_ptr()) const { return m_descr.empty() ? serverName : m_descr; } /** split \n separated comment into lines without \n, appending them to commentLines */ static void splitComment(const std::string &comment, std::list &commentLines); /** internal property? */ bool isHidden() const { return m_hidden; } void setHidden(bool hidden) { m_hidden = hidden; } /** config is invalid without setting this property? */ bool isObligatory() const { return m_obligatory; } void setObligatory(bool obligatory) { m_obligatory = obligatory; } /** * determines how a property is shared between different views */ enum Sharing { GLOBAL_SHARING, /**< shared between all views, for example the "default peer" property */ SOURCE_SET_SHARING, /**< shared between all peers accessing the same source set, for example the logdir property */ NO_SHARING /**< each peer has his own values */ }; /** "global", "shared", "unshared" */ static std::string sharing2str(Sharing sharing); Sharing getSharing() const { return m_sharing; } void setSharing(Sharing sharing) { m_sharing = sharing; } /** set value unconditionally, even if it is not valid */ void setProperty(ConfigNode &node, const InitStateString &value) const { node.setProperty(getName(node), value, getComment()); } void setProperty(ConfigNode &node, const std::string &value) const { setProperty(node, InitStateString(value, true)); } void setProperty(FilterConfigNode &node, const InitStateString &value, bool temporarily = false) const { std::string name = getName(node); if (temporarily) { node.addFilter(name, value); } else { node.setProperty(name, value, getComment()); } } void setProperty(FilterConfigNode &node, const std::string &value, bool temporarily = false) const { setProperty(node, InitStateString(value, true), temporarily); } /** set default value of a property, marked as unset unless "force" is true */ void setDefaultProperty(ConfigNode &node, bool force) const { setProperty(node, InitStateString(m_defValue, force)); } /** * String representation of property value. getPropertyValue() in * some derived classes returns the value in some other, class specific * representation. */ virtual InitStateString getProperty(const ConfigNode &node) const { std::string name = getName(node); InitStateString value = node.readProperty(name); if (value.wasSet()) { std::string error; if (!checkValue(value, error)) { throwValueError(node, name, value, error); } return value; } else { // default return InitStateString(getDefValue(), false); } } protected: void throwValueError(const ConfigNode &node, const std::string &name, const std::string &value, const std::string &error) const; private: bool m_obligatory; bool m_hidden; Sharing m_sharing; const Aliases m_names; const std::string m_comment, m_defValue, m_descr; }; /** * A string property which maps multiple different possible value * strings to one generic value, ignoring the case. Values not listed * are passed through unchanged. The first value in the list of * aliases is the generic one. * * The addition operator is defined for the aliases so that they * can be constructed more easily. */ class StringConfigProperty : public ConfigProperty { public: StringConfigProperty(const std::string &name, const std::string &comment, const std::string &def = std::string(""), const std::string &descr = std::string(""), const Values &values = Values()) : ConfigProperty(name, comment, def, descr), m_values(values) {} /** * @return false if aliases are defined and the string is not one of them */ bool normalizeValue(std::string &res) const { Values values = getValues(); BOOST_FOREACH(const Values::value_type &value, values) { BOOST_FOREACH(const std::string &alias, value) { if (boost::iequals(res, alias)) { res = *value.begin(); return true; } } } return values.empty(); } /** * This implementation accepts all values if no aliases * are given, otherwise the value must be part of the aliases. */ virtual bool checkValue(const std::string &propValue, std::string &error) const { Values values = getValues(); if (values.empty()) { return true; } std::ostringstream err; err << "not one of the valid values ("; bool firstval = true; BOOST_FOREACH(const Values::value_type &value, values) { if (!firstval) { err << ", "; } else { firstval = false; } bool firstalias = true; BOOST_FOREACH(const std::string &alias, value) { if (!firstalias) { err << " = "; } else { firstalias = false; } if (alias.empty()) { err << "\"\""; } else { err << alias; } if (boost::iequals(propValue, alias)) { return true; } } } err << ")"; error = err.str(); return false; } virtual InitStateString getProperty(const ConfigNode &node) const { InitStateString res = ConfigProperty::getProperty(node); normalizeValue(res); return res; } protected: virtual Values getValues() const { return m_values; } private: const Values m_values; }; /** * Instead of reading and writing strings, this class interprets the content * as a specific type. */ template class TypedConfigProperty : public ConfigProperty { public: TypedConfigProperty(const std::string &name, const std::string &comment, const std::string &defValue = std::string("0"), const std::string &descr = std::string("")) : ConfigProperty(name, comment, defValue, descr) {} /** * This implementation accepts all values that can be converted * to the required type. */ virtual bool checkValue(const std::string &value, std::string &error) const { std::istringstream in(value); T res; if (in >> res) { return true; } else { error = "cannot parse value"; return false; } } void setProperty(ConfigNode &node, const T &value) const { std::ostringstream out; out << value; node.setProperty(getName(node), out.str(), getComment()); } void setProperty(FilterConfigNode &node, const T &value, bool temporarily = false) const { std::ostringstream out; std::string name = getName(node); out << value; InitStateString res(out.str(), true); if (temporarily) { node.addFilter(name, res); } else { node.setProperty(name, res, getComment()); } } InitState getPropertyValue(const ConfigNode &node) const { std::string name = getName(node); std::string value = node.readProperty(name); std::istringstream in(value); T res; if (value.empty()) { // use default std::istringstream defStream(getDefValue()); defStream >> res; return InitState(res, false); } else { // use explicitly set value if (!(in >> res)) { throwValueError(node, name, value, "cannot parse value"); } return InitState(res, true); } } }; /** * The "in >> res" check in TypedConfigProperty::checkValue * is to loose. For example, the standard library accepts * -1 for an unsigned type. * * This class accepts a function pointer to strtoul() or * strtol() and uses that function to do strict value checking. * * @param T type to be converted to and from (like int) * @param Tmin minimum value of T for range checking * @param Tmax maximum value of T for range checking * @param C intermediate type for conversion (like long) * @param Cmin minimum value of C for range checking * @param Cmax maximum value of C for range checking * @param strto conversion function */ template class ScalarConfigProperty : public TypedConfigProperty { public: ScalarConfigProperty(const std::string &name, const std::string &comment, const std::string &defValue = std::string("0"), const std::string &descr = std::string("")) : TypedConfigProperty(name, comment, defValue, descr) {} virtual bool checkValue(const std::string &value, std::string &error) const { errno = 0; const char *nptr = value.c_str(); char *endptr; // use base 10 because not specifying a base // would interpret 077 as octal value, which // could be confusing for users C val = strto(nptr, &endptr, 10); if ((errno == ERANGE && (val == Cmin || val == Cmax))) { error = "range error"; return false; } if (errno != 0 && val == 0) { error = "cannot parse"; return false; } if (endptr == nptr) { error = "decimal value expected"; return false; } while (isspace(*endptr)) { endptr++; } if (*endptr != '\0') { error = "unexpected trailing non-whitespace characters: "; error += endptr; return false; } // comparison might be always true for some types #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif if (val > Tmax || val < Tmin) { error = "range error"; return false; } #ifdef __clang__ #pragma clang diagnostic pop #endif if (Tmin == 0) { // check that we didn't accidentally accept a negative value, // strtoul() does that const char *start = nptr; while (*start && isspace(*start)) { start++; } if (*start == '-') { error = "range error"; return false; } } return true; } }; typedef ScalarConfigProperty IntConfigProperty; typedef ScalarConfigProperty UIntConfigProperty; typedef ScalarConfigProperty LongConfigProperty; typedef ScalarConfigProperty ULongConfigProperty; /** * Time interval >= 0. Values are formatted as number of seconds * and accepted in a variety of formats, following ISO 8601: * - x = x seconds * - d = x[YyWwDdHhMmSs] = x years/weeks/days/hours/minutes/seconds * - d[+]d... = combination of the previous durations * * As an extension of ISO 8601, white spaces are silently ignored, * suffix checks are case-insensitive and s (or S) for seconds * can be omitted. */ class SecondsConfigProperty : public UIntConfigProperty { public: SecondsConfigProperty(const std::string &name, const std::string &comment, const std::string &defValue = std::string("0"), const std::string &descr = "") : UIntConfigProperty(name, comment, defValue, descr) {} virtual bool checkValue(const std::string &value, std::string &error) const; InitState getPropertyValue(const ConfigNode &node) const; static bool parseDuration(const std::string &value, std::string &error, unsigned int &seconds); }; /** * Supports lookup of password via env variable, interactively, and * keyring. The keys for the keyring are derived from other properties * in derived classes. */ class PasswordConfigProperty : public ConfigProperty { public: PasswordConfigProperty(const std::string &name, const std::string &comment, const std::string &def = std::string(""),const std::string &descr = std::string("")) : ConfigProperty(name, comment, def, descr) {} PasswordConfigProperty(const Aliases &names, const std::string &comment, const std::string &def = std::string(""),const std::string &descr = std::string("")) : ConfigProperty(names, comment, def, descr) {} /** * Check the password and cache the result. Accessed via base * ConfigProperty class, must be implemented in derived classes. */ virtual void checkPassword(UserInterface &ui, SyncConfig &config, int flags, const std::string &sourceName = std::string()) const = 0; /** * Move password to storage. Accessed via base ConfigProperty * class, must be implemented in derived classes. */ virtual void savePassword(UserInterface &ui, SyncConfig &config, const std::string &sourceName = std::string()) const = 0; /** * Utility method, invokes checkPassword() on the properties selected * via flags and sourceNames array. Optionally updates the properties * to reflect the actual values which need to be used. */ static void checkPasswords(UserInterface &ui, SyncConfig &config, int flags, const std::list &sourceNames = std::list()); enum { CHECK_PASSWORD_RESOLVE_USERNAME = 1<<0, ///< temporarily replace username that corresponds to the password CHECK_PASSWORD_RESOLVE_PASSWORD = 1<<1, ///< temporarily replace password with actual value CHECK_PASSWORD_SYNC = 1<<2, ///< check sync properties CHECK_PASSWORD_SOURCE = 1<<3, ///< check source properties /** Alias for the "check and resolve" everything. */ CHECK_PASSWORD_ALL = CHECK_PASSWORD_RESOLVE_USERNAME|CHECK_PASSWORD_RESOLVE_PASSWORD|CHECK_PASSWORD_SYNC|CHECK_PASSWORD_SOURCE, CHECK_PASSWORD_FLAG_NONE = 0 }; protected: /** * The actual implementation, with additional information * provided by derived classes. */ void checkPassword(UserInterface &ui, SyncConfig &config, int flags, const ConfigProperty &usernameProperty, const std::string &sourceName = std::string()) const; void savePassword(UserInterface &ui, SyncConfig &config, const ConfigProperty &usernameProperty, const std::string &sourceName = std::string()) const; /** * Get password lookup key for storing or retrieving passwords. * * @param descr decription for password * @param globalConfigNode the global config node * @param sourceConfigNode the source config node. It might be empty */ virtual ConfigPasswordKey getPasswordKey(const std::string &descr, const std::string &serverName, FilterConfigNode &globalConfigNode, const std::string &sourceName = std::string(), const boost::shared_ptr &sourceConfigNode = boost::shared_ptr()) const = 0; static std::string getUsername(const ConfigProperty &usernameProperty, const FilterConfigNode &node); }; /** * Instead of reading and writing strings, this class interprets the content * as boolean with T/F or 1/0 (default format). */ class BoolConfigProperty : public StringConfigProperty { public: BoolConfigProperty(const std::string &name, const std::string &comment, const std::string &defValue = std::string("F"),const std::string &descr = std::string("")) : StringConfigProperty(name, comment, defValue,descr, Values() + (Aliases("1") + "T" + "TRUE") + (Aliases("0") + "F" + "FALSE")) {} void setProperty(ConfigNode &node, bool value) { StringConfigProperty::setProperty(node, InitStateString(value ? "1" : "0", true)); } void setProperty(FilterConfigNode &node, bool value, bool temporarily = false) { StringConfigProperty::setProperty(node, InitStateString(value ? "1" : "0", true), temporarily); } InitState getPropertyValue(const ConfigNode &node) const { InitStateString res = ConfigProperty::getProperty(node); return InitState(boost::iequals(res, "T") || boost::iequals(res, "TRUE") || atoi(res.c_str()) != 0, res.wasSet()); } }; /** * A property for arbitrary strings. */ class SafeConfigProperty : public ConfigProperty { public: SafeConfigProperty(const std::string &name, const std::string &comment) : ConfigProperty(name, comment) {} void setProperty(ConfigNode &node, const InitStateString &value) { ConfigProperty::setProperty(node, InitStateString(StringEscape::escape(value, '!', StringEscape::INI_WORD), value.wasSet())); } void setProperty(ConfigNode &node, const std::string &value) { ConfigProperty::setProperty(node, InitStateString(StringEscape::escape(value, '!', StringEscape::INI_WORD), true)); } virtual InitStateString getProperty(const ConfigNode &node) const { InitStateString res = ConfigProperty::getProperty(node); return InitStateString(StringEscape::unescape(res, '!'), res.wasSet()); } }; /** * A registry for all properties which might be saved in the same ConfigNode. * Currently the same as a simple list. Someone else owns the instances. */ class ConfigPropertyRegistry : public std::list { public: /** case-insensitive search for property */ const ConfigProperty *find(const std::string &propName) const { BOOST_FOREACH(const ConfigProperty *prop, *this) { BOOST_FOREACH(const std::string &name, prop->getNames()) { if (boost::iequals(name, propName)) { return prop; } } } return NULL; } }; /** * This class implements the client library configuration interface * by mapping values to properties to entries in a ConfigTree. The * mapping is either the traditional one used by SyncEvolution <= 0.7 * and client library <= 6.5 or the new layout introduced with * SyncEvolution >= 0.8. If for a given server name the old config * exists, then it is used. Otherwise the new layout is used. * * This class can be instantiated on its own and then provides access * to properties actually stored in files. SyncContext * inherits from this class so that a derived client has the chance to * override every single property (although it doesn't have to). * Likewise SyncSource is derived from * SyncSourceConfig. * * Properties can be set permanently (this changes the underlying * ConfigNode) and temporarily (this modifies the FilterConfigNode * which wraps the ConfigNode). * * The old layout is: * - $HOME/.sync4j/evolution//spds/syncml/config.txt * -- spds/sources//config.txt * --- changes_/config.txt * * The new layout is: * - ${XDG_CONFIG:-${HOME}/.config}/syncevolution/foo - base directory for server foo * -- config.ini - constant per-server settings * -- .internal.ini - read/write server properties - hidden from users because of the leading dot * -- sources/bar - base directory for source bar * --- config.ini - constant per-source settings * --- .internal.ini - read/write source properties * --- .changes_.ini - change tracking node (content under control of sync source) * * Because this class needs to handle different file layouts it always * uses a FileConfigTree instance. Other implementations would be * possible. */ class SyncConfig { public: /** * Opens the configuration for a specific server, * searching for the config files in the usual * places. Will succeed even if config does not * yet exist: flushing such a config creates it. * * Does a version check to ensure that the config can be * read. Users of the instance must to an explicit * prepareConfigForWrite() if the config or the files associated * with it (Synthesis bin files) are going to be written. * * @param peer string that identifies the peer, * matching regex (.*)(@([^@]*))? * where the $1 (the first part) is * the peer name and the optional $2 * (the part after the last @) is the * context, "default" if not given. * For example "scheduleworld" = * "ScheduleWorld" = * "scheduleworld@default", but not the same as * "scheduleworld@other_context" * * @param tree if non-NULL, then this is used * as configuration tree instead of * searching for it; always uses the * current layout in that tree * * @param redirectPeerRootPath * Can be used to redirect the per-peer * files into a different directory. Only works * in non-peer context configs. * Used by SyncContext for local sync. */ SyncConfig(const std::string &peer, boost::shared_ptr tree = boost::shared_ptr(), const std::string &redirectPeerRootPath = ""); /** * Creates a temporary configuration. * Can be copied around, but not flushed. */ SyncConfig(); virtual ~SyncConfig() {} /** * Discard all changes made to config files. * Makes it impossible to do incremental syncs! * * Not 100% reliable, but works in practice: * - Source nodes for change tracking are replaced * with volatile nodes (reliable). * - Flushing nodes is skipped, which covers peer and global * nodes. They need to provide the real content and therefore * cannot be replaced. Could be circumvented by flushing them * directly. */ void makeEphemeral(); bool isEphemeral() const { return m_ephemeral; } /** * determines whether the need to migrate a config causes a * STATUS_MIGRATION_NEEDED error or does the migration * automatically; default is to migrate automatically in * stable releases and to ask in development releases */ enum ConfigWriteMode { MIGRATE_AUTOMATICALLY, ASK_USER_TO_MIGRATE }; ConfigWriteMode getConfigWriteMode() const { return m_configWriteMode; } void setConfigWriteMode(ConfigWriteMode mode) { m_configWriteMode = mode; } /** * This does another version check which ensures that the config * is not unintentionally altered so that it cannot be read by * older SyncEvolution releases. If the config cannot be written * without breaking older releases, then either the call will fail * (development releases) or migrate the config (stable releases). * Can be controlled via setConfigWriteMode(); * * Also writes the current config versions into the config. */ void prepareConfigForWrite(); /** absolute directory name of the configuration root, empty if unknown or not available */ std::string getRootPath() const; typedef std::list< std::pair > ConfigList; /** A simple description of the template or the configuration based on a * template. The rank field is used to indicate how good it matches the * user input */ struct TemplateDescription { // The unique identifier of the template std::string m_templateId; // The description of the template (eg. the web server URL for a // SyncML server. This is not used for UI, only CMD line used this. std::string m_description; // The matched percentage of the template, larger the better. int m_rank; // This can be either the user-modifiable device name, vendor // name, or product name (vendor + model). This depends on // whether the device supports the Bluetooth Device ID profile // and, if so, whether we have the model in the lookup table. std::string m_hardwareName; //a unique identity of the device that the template is for, used by caller std::string m_deviceId; // This is always the user-modifiable device name. std::string m_deviceName; // A unique string identify the template path, so that a later operation // fetching this config will be much easier std::string m_path; // A string indicates the original fingerprint in the matched template, this // will not necessarily be the same as m_deviceName std::string m_matchedModel; // The template name (device class) presented std::string m_templateName; TemplateDescription (const std::string &templateId, const std::string &description, const int rank, const std::string &hardwareName, const std::string &deviceId, const std::string &fingerprint, const std::string &path, const std::string &model, const std::string &templateName) : m_templateId (templateId), m_description (description), m_rank (rank), m_hardwareName (hardwareName), m_deviceId (deviceId), m_deviceName (fingerprint), m_path (path), m_matchedModel(model), m_templateName (templateName) { } TemplateDescription (const std::string &name, const std::string &description); static bool compare_op (boost::shared_ptr &left, boost::shared_ptr &right); }; enum MatchMode { /*Match templates when we work as SyncML server, i.e. the peer is the client*/ MATCH_FOR_SERVER_MODE, /*Match templates when work as SyncML client, i.e. the peer is the server*/ MATCH_FOR_CLIENT_MODE, /*Match templates for both SyncML server and SyncML client*/ MATCH_ALL, INVALID }; typedef std::list > TemplateList; /* This information is available if the device supports the * Device Id Profile. */ struct PnpInformation { const std::string m_vendor; const std::string m_product; bool isKnownProduct() const {return !m_product.empty();} PnpInformation(const std::string &vendor, const std::string &product) :m_vendor(vendor), m_product(product) {} }; struct DeviceDescription { /** the id of the device */ std::string m_deviceId; /* The user-modifiable name of the device. This will be used * as the fingerprint if the PnpInformation is not * available. */ std::string m_deviceName; /* For bluetooth devices, we use PnpInformation's immutable * product id which provides a more reliable fingerprint than * the user-modifiable device string. The fingerprint of the * device is used for matching templates. */ std::string getFingerprint() const; /** match mode used for matching templates */ MatchMode m_matchMode; /** the PnPInformation for the device if available */ boost::shared_ptr m_pnpInformation; DeviceDescription(const std::string &deviceId, const std::string &deviceName, MatchMode mode) :m_deviceId(deviceId), m_deviceName(deviceName), m_matchMode(mode) {} DeviceDescription() : m_matchMode(INVALID) {} }; typedef std::list DeviceList; /** * returns list of servers in either the old (.sync4j) or * new config directory (.config), given as server name * and absolute root of config * * Guaranteed to be sorted by the (context, peer name, path) tuple, * in increasing order (foo@bar < abc@xyz < abc.old@xyz). */ static ConfigList getConfigs(); /** * TODO: fix description of matchPeerTemplates() and remove getPeerTemplates() * * returns list of available config templates: * for each peer listed in @peers, matching against the fingerprint information * from the peer (deviceName likely), sorted by the matching score, * templates failed to match(as long as it's for SyncML server) will also * be returned as a fallback mechanism so that user can select a configuration * template manually. * Any templates for SyncMl Client is also returned, with a default rank. * The assumption currently is only work for SyncML client peers. * DeviceList is a list of matching tuples . */ static TemplateList getPeerTemplates(const DeviceList &peers) { return matchPeerTemplates(peers, true); } /** * match the built-in templates against @param fingerprint, return a list of * servers sorted by the matching rank. * */ static TemplateList matchPeerTemplates(const DeviceList &peers, bool fuzzyMatch = true); /** * Creates a new instance of a configuration template. * The result can be modified to set filters, but it * cannot be flushed. * * @param peer a configuration name, *without* a context (scheduleworld, not scheduleworld@default), * or a configuration path in the system directory which can avoid another fuzzy match process. * "none" returns an empty template (default sync properties and dev ID set). * @return NULL if no such template */ static boost::shared_ptr createPeerTemplate(const std::string &peer); /** * true if the main configuration file already exists; * "main" here means the per-peer config or context config, * depending on what the config refers to */ bool exists() const; /** * true if the config files for the selected level exist; * false is returned for CONFIG_LEVEL_PEER and a config * which refers to a context */ bool exists(ConfigLevel level) const; /** * The normalized, unique config name used by this instance. * Empty if not backed up by a real config. */ std::string getConfigName() const { return m_peer; } /** * The normalized context used by this instance. * Includes @ sign. */ std::string getContextName() const; /** * the normalized peer name, empty if not a peer config */ std::string getPeerName() const; /** * true if the config is for a peer, false if a context config */ bool hasPeerProperties() const { return !m_peerPath.empty(); } /** * returns names of peers inside this config; * empty if not a context */ std::list getPeers() const; /** * Do something before doing flush to files. This is particularly * useful when user interface wants to do preparation jobs, such * as savePassword and others. */ virtual void preFlush(UserInterface &ui); void flush(); /** * Remove the configuration. Config directories are removed if * empty. * * When the configuration is peer-specific, only the peer's * properties and config nodes are removed. Otherwise the complete * configuration is removed, including all peers. * * Does *not* remove logs associated with the configuration. * For that use the logdir handling in SyncContext * before removing the configuration. */ void remove(); /** * A list of all properties. Can be extended by derived clients. */ static ConfigPropertyRegistry &getRegistry(); enum NormalizeFlags { NORMALIZE_LONG_FORMAT = 0, /**< include context in normal form */ NORMALIZE_SHORTHAND = 1, /**< keep normal form shorter by not specifying @default */ NORMALIZE_IS_NEW = 2, /**< does not refer to an existing config, do not search for it among existing configs */ NORMALIZE_MAX = 0xFFFF }; /** * Normalize a config string: * - lower case * - non-printable and unsafe characters (colon, slash, backslash) * replaced by underscore * - when no context specified and NORMALIZE_IS_NEW not set: * search for peer config first in @default, then also in other contexts * in alphabetical order * - NORMALIZE_SHORTHAND set: @default stripped (dangerous: result "foo" * may incorrectly be mapped to "foo@bar" if the "foo@default" config gets removed), * otherwise added if missing * - empty string replaced with "@default" */ static std::string normalizeConfigString(const std::string &config, NormalizeFlags flags = NORMALIZE_SHORTHAND); /** * Split a config string (normalized or not) into the peer part * (before final @) and the context (after that @, not including * it), return "default" as context if not specified otherwise. * * @return true when the context was specified explicitly */ static bool splitConfigString(const std::string &config, std::string &peer, std::string &context); /** * Replaces the property filter of either the sync properties or * all sources. This can be used to e.g. temporarily override * the active sync mode. * * All future calls of getSyncSourceNodes() will have these * filters applied. * * @param sync true if the filter applies to sync properties, * false if it applies to sources * @param source empty string if filter applies to all sources, * otherwise the source name to which it applies * @param filter key (case insensitive)/value pairs of properties * which are to be overridden */ void setConfigFilter(bool sync, const std::string &source, const FilterConfigNode::ConfigFilter &filter); /** * Read-write access to all configurable properties of the server. * The visible properties are passed through the config filter, * which can be modified. */ boost::shared_ptr getProperties(bool hidden = false) { return m_props[hidden]; } boost::shared_ptr getProperties(bool hidden = false) const { return const_cast(this)->getProperties(hidden); } /** * Returns the right config node for a certain property, * depending on visibility and sharing. */ boost::shared_ptr getNode(const ConfigProperty &prop); boost::shared_ptr getNode(const ConfigProperty &prop) const { return const_cast(this)->getNode(prop); } /** * Returns the right config node for a certain registered property, * looked up by name. NULL if not found. */ boost::shared_ptr getNode(const std::string &propName); boost::shared_ptr getNode(const std::string &propName) const { return const_cast(this)->getNode(propName); } /** * Returns a wrapper around all properties of the given source * which are saved in the config tree. Note that this is different * from the set of sync source configs used by the SyncManager: * the SyncManger uses the AbstractSyncSourceConfig. In * SyncEvolution those are implemented by the * SyncSource's actually instantiated by * SyncContext. Those are complete whereas * PersistentSyncSourceConfig only provides access to a * subset of the properties. * * Can be called for sources which do not exist yet. */ virtual boost::shared_ptr getSyncSourceConfig(const std::string &name); virtual boost::shared_ptr getSyncSourceConfig(const std::string &name) const { return const_cast(this)->getSyncSourceConfig(name); } /** * Returns list of all configured (not active!) sync sources. */ virtual std::list getSyncSources() const; /** * Creates config nodes for a certain node. The nodes are not * yet created in the backend if they do not yet exist. * * Calling this for the same name repeatedly will return the * same set of node instances. This allows to set properties * temporarily in one place and have them used elsewhere. * * setConfigFilter() resets this cache of nodes. Requesting nodes * after that call will create a new set of nodes with properties * modified temporarily according to these filters. * * @param name the name of the sync source * @param trackName additional part of the tracking node name (used for unit testing) */ SyncSourceNodes getSyncSourceNodes(const std::string &name, const std::string &trackName = ""); ConstSyncSourceNodes getSyncSourceNodes(const std::string &name, const std::string &trackName = "") const; /** * Creates config nodes for a certain node. The nodes are not * yet created in the backend if they do not yet exist. * In contrast to the normal set of nodes, the tracking node * is empty and discards all changes. This is useful when * trying to initialize a SyncSource without a peer (normally * has a tracking node which rejects writes with an exception) * or with a peer without interfering with normal change tracking * (normally SyncSource might overwrite change tracking). * * @param name the name of the sync source */ SyncSourceNodes getSyncSourceNodesNoTracking(const std::string &name); /** * initialize all properties with their default value */ void setDefaults(bool force = true); /** * create a new sync source configuration with default values */ void setSourceDefaults(const std::string &name, bool force = true); /** * Remove sync source configuration. And remove the directory * if it has no other files. * * When the configuration is peer-specific, only the peer's * properties are removed. Otherwise the complete source * configuration is removed, including properties stored * for in any of the peers. */ void removeSyncSource(const std::string &name); /** * clear existing visible source properties selected by the * configuration: with or without peer-specific properties, * depending on the current view */ void clearSyncSourceProperties(const std::string &name); /** * clear all global sync properties, with or without * peer-specific properties, depending on the current view */ void clearSyncProperties(); /** * Copy all registered properties (hidden and visible) and the * tracking node into the current config. This is done by reading * all properties from the source config, which implies the unset * properties will be set to their default values. The current * config is not cleared so additional, unregistered properties * (should they exist) will continue to exist unchanged. * * The current config still needs to be flushed to make the * changes permanent. * * @param sources if NULL, then copy all sources; if not NULL, * then copy exactly the sources listed here * (regardless whether they exist or not) */ void copy(const SyncConfig &other, const std::set *sources); /** * @name Settings specific to SyncEvolution * * See the property definitions in SyncConfig.cpp * for the user-visible explanations of * these settings. */ /**@{*/ virtual InitStateString getDefaultPeer() const; virtual void setDefaultPeer(const std::string &value); virtual InitStateTri getKeyring() const; virtual void setKeyring(const std::string &value); virtual InitStateString getLogDir() const; virtual void setLogDir(const std::string &value, bool temporarily = false); virtual InitState getMaxLogDirs() const; virtual void setMaxLogDirs(unsigned int value, bool temporarily = false); virtual InitState getLogLevel() const; virtual void setLogLevel(unsigned int value, bool temporarily = false); enum NotifyLevel { NOTIFY_NONE, /**< suppress all notifications */ NOTIFY_ERROR, /**< show only errors */ NOTIFY_CHANGES, /**< show information about changes and errors */ NOTIFY_ALL /**< show all notifications, including starting a sync */ }; virtual InitState getNotifyLevel() const; virtual void setNotifyLevel(NotifyLevel value, bool temporarily = false); virtual InitState getPrintChanges() const; virtual void setPrintChanges(bool value, bool temporarily = false); virtual InitState getDumpData() const; virtual void setDumpData(bool value, bool temporarily = false); virtual InitStateString getWebURL() const; virtual void setWebURL(const std::string &url, bool temporarily = false); virtual InitStateString getIconURI() const; virtual void setIconURI(const std::string &uri, bool temporarily = false); /** * A property of server template configs. True if the server is * ready for use by "normal" users (everyone can get an account * and some kind of support, we have tested the server well * enough, ...). */ virtual InitState getConsumerReady() const; virtual void setConsumerReady(bool ready); virtual InitState getHashCode() const; virtual void setHashCode(unsigned long hashCode); virtual InitStateString getConfigDate() const; virtual void setConfigDate(); /* set current time always */ /**@}*/ /** * @name SyncML Settings * * These settings are required by the Synthesis engine. * Some of them are hard-coded in this class. A derived class could * make them configurable again, should that be desired. */ /**@{*/ virtual UserIdentity getSyncUser() const; virtual void setSyncUsername(const std::string &value, bool temporarily = false); virtual InitStateString getSyncPassword() const; virtual void setSyncPassword(const std::string &value, bool temporarily = false); virtual InitState getPreventSlowSync() const; virtual void setPreventSlowSync(bool value, bool temporarily = false); virtual InitState getUseProxy() const; virtual void setUseProxy(bool value, bool temporarily = false); virtual InitStateString getProxyHost() const; virtual void setProxyHost(const std::string &value, bool temporarily = false); virtual UserIdentity getProxyUser() const; virtual void setProxyUsername(const std::string &value, bool temporarily = false); virtual InitStateString getProxyPassword() const; virtual void setProxyPassword(const std::string &value, bool temporarily = false); virtual InitState< std::vector > getSyncURL() const; virtual void setSyncURL(const std::string &value, bool temporarily = false); virtual void setSyncURL(const std::vector &value, bool temporarily = false); virtual InitStateString getClientAuthType() const; virtual void setClientAuthType(const std::string &value, bool temporarily = false); virtual InitState getMaxMsgSize() const; virtual void setMaxMsgSize(unsigned long value, bool temporarily = false); virtual InitState getMaxObjSize() const; virtual void setMaxObjSize(unsigned int value, bool temporarily = false); virtual InitStateString getSSLServerCertificates() const; /** * iterate over files mentioned in getSSLServerCertificates() * and return name of first one which is found, empty string * if none */ std::string findSSLServerCertificate(); virtual void setSSLServerCertificates(const std::string &value, bool temporarily = false); virtual InitState getSSLVerifyServer() const; virtual void setSSLVerifyServer(bool value, bool temporarily = false); virtual InitState getSSLVerifyHost() const; virtual void setSSLVerifyHost(bool value, bool temporarily = false); virtual InitState getRetryInterval() const; virtual void setRetryInterval(unsigned int value, bool temporarily = false); virtual InitState getRetryDuration() const; virtual void setRetryDuration(unsigned int value, bool temporarily = false); virtual InitStateString getDevID() const; virtual void setDevID(const std::string &value, bool temporarily = false); /*Used for Server Alerted Sync*/ virtual InitStateString getRemoteIdentifier() const; virtual void setRemoteIdentifier (const std::string &value, bool temporaritly = false); virtual InitState getPeerIsClient () const; virtual void setPeerIsClient (bool value, bool temporarily = false); /** the 1.0/1.1/1.2 part of the SyncMLVersion property */ virtual InitStateString getSyncMLVersion() const; /** all flags that are set in the SyncMLVersion property, including the 1.0/1.1/1.2 versions */ virtual InitState< std::set > getSyncMLFlags() const; virtual InitState getRequestMaxTime() const; /** * An arbitrary name assigned to the peer configuration, * not necessarily unique. Can be used by a GUI instead * of the config name. Unsetting it is supported. */ virtual InitStateString getUserPeerName() const; virtual void setUserPeerName(const InitStateString &name); /** * The Device ID of our peer. Typically only relevant when the * peer is a client. Servers don't have a Device ID, just some * unique way of contacting them. */ virtual InitStateString getRemoteDevID() const; virtual void setRemoteDevID(const std::string &value); /** * The opaque nonce value stored for a peer, required for MD5 * authentication. Only used when acting as server. */ virtual InitStateString getNonce() const; virtual void setNonce(const std::string &value); /** * The opaque per-peer admin data managed by the Synthesis * engine. Only used when acting as server. */ virtual InitStateString getDeviceData() const; virtual void setDeviceData(const std::string &value); /** * Automatic sync related properties, used to control its behaviors */ virtual InitStateString getAutoSync() const; virtual void setAutoSync(const std::string &value, bool temporarily = false); virtual InitState getAutoSyncInterval() const; virtual void setAutoSyncInterval(unsigned int value, bool temporarily = false); virtual InitState getAutoSyncDelay() const; virtual void setAutoSyncDelay(unsigned int value, bool temporarily = false); /** * Specifies whether WBXML is to be used (default). * Otherwise XML is used. */ virtual InitState getWBXML() const; virtual void setWBXML(bool isWBXML, bool temporarily = false); virtual InitState getRefreshSync() const; virtual void setRefreshSync(bool enableRefreshSync, bool temporarily = false); virtual InitStateString getUserAgent() const { return "SyncEvolution"; } virtual InitStateString getMan() const { return "Patrick Ohly"; } virtual InitStateString getMod() const { return "SyncEvolution"; } virtual InitStateString getOem() const { return "Open Source"; } virtual InitStateString getHwv() const { return "unknown"; } virtual InitStateString getSwv() const; virtual InitStateString getDevType() const; /**@}*/ enum Layout { SYNC4J_LAYOUT, /**< .syncj4/evolution/, SyncEvolution <= 0.7.x */ HTTP_SERVER_LAYOUT, /**< .config/syncevolution/ with sources underneath, SyncEvolution <= 0.9.x */ SHARED_LAYOUT /**< .config/syncevolution/ containing sources and peers, with source settings shared by peers, SyncEvolution >= 1.0 */ }; /** config versioning; setting is done internally */ int getConfigVersion(ConfigLevel level, ConfigLimit limit) const; /** file layout used by config */ Layout getLayout() const { return m_layout; } private: /** * scans for peer configurations * @param root absolute directory path * @param configname expected name of config files (config.ini or config.txt) * @retval res filled with new peer configurations found */ static void addPeers(const std::string &root, const std::string &configname, SyncConfig::ConfigList &res); /* internal access to configuration versioning */ void setConfigVersion(ConfigLevel level, ConfigLimit limit, int version); /** * migrate root (""), context or peer config and everything contained in them to * the current config format */ void migrate(const std::string &config); /** * set tree and nodes to VolatileConfigTree/Node */ void makeVolatile(); /** * String that identifies the peer, see constructor. * This is a normalized string (normalizePeerString()). * The name is a bit of a misnomer, because the config * might also reference just a context without any * peer-specific properties ("@some-context", or "@default"). */ std::string m_peer; /** * Lower case path to peer configuration, * relative to configuration tree root. * For example "scheduleworld" for "ScheduleWorld" when * using the old config layouts, "default/peers/scheduleworld" * in the new layout. * * Empty if configuration view has no peer-specific properties. */ std::string m_peerPath; /** * lower case path to source set properties, * unused for old layouts, else something like * "default" or "other_context" */ std::string m_contextPath; Layout m_layout; std::string m_redirectPeerRootPath; ConfigWriteMode m_configWriteMode; Bool m_ephemeral; /** holds all config nodes relative to the root that we found */ boost::shared_ptr m_tree; /** * Same instance as m_tree, except that we know that it is a FileConfigTree. */ boost::shared_ptr m_fileTree; /** access to global sync properties, independent of the context (for example, "defaultPeer") */ boost::shared_ptr m_globalNode; boost::shared_ptr m_globalHiddenNode; /** access to properties shared between peers */ boost::shared_ptr m_contextNode; boost::shared_ptr m_contextHiddenNode; /** access to properties specific to a peer */ boost::shared_ptr m_peerNode; boost::shared_ptr m_hiddenPeerNode; /** multiplexer for the other config nodes */ boost::shared_ptr m_props[2]; /** * temporary override for all sync source settings * ("" as key) or specific sources (source name as key) */ SourceProps m_sourceFilters; static std::string getOldRoot() { return getHome() + "/.sync4j/evolution"; } static std::string getNewRoot() { const char *xdg_root_str = getenv("XDG_CONFIG_HOME"); return xdg_root_str ? std::string(xdg_root_str) + "/syncevolution" : getHome() + "/.config/syncevolution"; } /** remember all SyncSourceNodes so that temporary changes survive */ std::map m_nodeCache; }; /** * This set of config nodes is to be used by SyncSourceConfig * to accesss properties. Note that "const SyncSourceNodes" * only implies that the nodes cannot be changed; the properties * are still read- and writable. ConstSyncSourceNodes grants * only read access to properties. */ class SyncSourceNodes { public: SyncSourceNodes() : m_havePeerNode(false) {} /** * @param havePeerNode false when peerNode is a dummy instance which has to * be ignored for properties which may exist there as * well as in the shared node (for example, "type") * @param sharedNode node for user-visible properties, shared between peers * @param peerNode node for user-visible, per-peer properties (the same * as sharedNode in SYNC4J_LAYOUT and HTTP_SERVER_LAYOUT) * @param hiddenPeerNode node for internal, per-peer properties (the same as * sharedNode in SYNC4J_LAYOUT) * @param trackingNode node for tracking changes (always different than the * other nodes) * @param serverNode node for tracking items in a server (always different * than the other nodes) * @param cacheDir a per-peer, per-source directory for exclusive use by * the SyncSource, must be created if needed; not available * when source is accessed independently of peer */ SyncSourceNodes(bool havePeerNode, const boost::shared_ptr &sharedNode, const boost::shared_ptr &peerNode, const boost::shared_ptr &hiddenPeerNode, const boost::shared_ptr &trackingNode, const boost::shared_ptr &serverNode, const std::string &cacheDir); friend class SyncConfig; /** true if the peer-specific config node exists */ bool exists() const { return m_peerNode->exists(); } /** true if the context-specific config node exists */ bool dataConfigExists() const { return m_sharedNode->exists(); } /** * Returns the right config node for a certain property, * depending on visibility and sharing. */ boost::shared_ptr getNode(const ConfigProperty &prop) const; /** * Read-write access to all configurable properties of the source. * The visible properties are passed through the config filter, * which can be modified. */ boost::shared_ptr getProperties(bool hidden = false) const { return m_props[hidden]; } /** read-write access to SyncML server specific config node */ boost::shared_ptr getServerNode() const { return m_serverNode; } /** read-write access to backend specific tracking node */ boost::shared_ptr getTrackingNode() const { return m_trackingNode; } std::string getCacheDir() const { return m_cacheDir; } protected: const bool m_havePeerNode; const boost::shared_ptr m_sharedNode; const boost::shared_ptr m_peerNode; const boost::shared_ptr m_hiddenPeerNode; const boost::shared_ptr m_trackingNode; const boost::shared_ptr m_serverNode; const std::string m_cacheDir; /** multiplexer for the other nodes */ boost::shared_ptr m_props[2]; }; /** * nop deleter for boost::shared_ptr */ struct SyncConfigNOP { void operator() (SyncConfig *) {} }; /** * same as SyncSourceNodes, but with only read access to properties */ class ConstSyncSourceNodes : private SyncSourceNodes { public: ConstSyncSourceNodes(const SyncSourceNodes &other) : SyncSourceNodes(other) {} boost::shared_ptr getProperties(bool hidden = false) const { return const_cast(static_cast(this))->getProperties(hidden); } boost::shared_ptr getServerNode() const { return m_serverNode; } boost::shared_ptr getTrackingNode() const { return m_trackingNode; } }; struct SourceType { SourceType():m_forceFormat(false) {} /** * Parses the SyncEvolution <= 1.1 type specifier: * [:[:][!]] * * The part is not stored anymore (was required by file * backend, but not actually used). */ SourceType(const std::string &type); /** * converts back to SyncEvolution <= 1.1 type specifier */ std::string toString() const; std::string m_backend; /**< identifies the SyncEvolution backend (either via a generic term like "addressbook" or a specific one like "Evolution Contacts") */ std::string m_localFormat; /**< the format to be used inside the backend for storing items; typically hard-coded and not configurable */ std::string m_format; /**< the format to be used (typically a MIME type) when talking to our peer */ bool m_forceFormat; /**< force to use the client's preferred format instead giving the engine and server a choice */ }; /** * This class maps per-source properties to ConfigNode properties. * Some properties are not configurable and have to be provided * by derived classes. */ class SyncSourceConfig { public: SyncSourceConfig(const std::string &name, const SyncSourceNodes &nodes); static ConfigPropertyRegistry &getRegistry(); /** * Read-write access to all configurable properties of the source. * The visible properties are passed through the config filter, * which can be modified. */ boost::shared_ptr getProperties(bool hidden = false) { return m_nodes.getProperties(hidden); } boost::shared_ptr getProperties(bool hidden = false) const { return const_cast(this)->getProperties(hidden); } virtual std::string getName() const { return m_name; } /** * Directory to be used by source when it needs to store * something per-peer in the file system. Currently not * configurable, set via SyncSourceNodes. */ std::string getCacheDir() const { return m_nodes.getCacheDir(); } /** * Returns the right config node for a certain property, * depending on visibility and sharing. */ boost::shared_ptr getNode(const ConfigProperty &prop) { return m_nodes.getNode(prop); } boost::shared_ptr getNode(const ConfigProperty &prop) const { return m_nodes.getNode(prop); } /** access to SyncML server specific config node */ boost::shared_ptr getServerNode() { return m_nodes.getServerNode(); } boost::shared_ptr getServerNode() const { return m_nodes.getServerNode(); } /** access to backend specific tracking node */ boost::shared_ptr getTrackingNode() { return m_nodes.getTrackingNode(); } boost::shared_ptr getTrackingNode() const { return m_nodes.getTrackingNode(); } /** sync mode for sync sources */ static StringConfigProperty m_sourcePropSync; /** true if the source config exists with view-specific properties (not just default or shared ones) */ bool exists() const { return m_nodes.exists(); } virtual UserIdentity getUser() const; virtual void setUsername(const std::string &value, bool temporarily = false); virtual InitStateString getPassword() const; virtual void setPassword(const std::string &value, bool temporarily = false); /** selects the backend database to use */ virtual InitStateString getDatabaseID() const; virtual void setDatabaseID(const std::string &value, bool temporarily = false); /** * internal property: unique integer ID for the source, needed by Synthesis XML , * zero if unset */ virtual InitState getSynthesisID() const; virtual void setSynthesisID(int value, bool temporarily = false); /** * Returns the data source type configured as part of the given * configuration; different SyncSources then check whether * they support that type. This call has to work before instantiating * a source and thus gets passed a node to read from. */ static InitState getSourceType(const SyncSourceNodes &nodes); virtual InitState getSourceType() const; /** set source backend and formats in one step */ virtual void setSourceType(const SourceType &type, bool temporarily = false); virtual void setBackend(const std::string &value, bool temporarily = false); virtual InitStateString getBackend() const; virtual void setDatabaseFormat(const std::string &value, bool temporarily = false); virtual InitStateString getDatabaseFormat() const; virtual void setSyncFormat(const InitStateString &value, bool temporarily = false); virtual InitStateString getSyncFormat() const; virtual void setForceSyncFormat(bool value, bool temporarily = false); virtual InitState getForceSyncFormat() const; /** * Returns the SyncSource URI: used in SyncML to address the data * on the server. * * Each URI has to be unique during a sync session, i.e. * two different sync sources cannot access the same data at * the same time. */ virtual InitStateString getURI() const; virtual void setURI(const std::string &value, bool temporarily = false); /** * like getURI(), but instead of returning an empty string when * not configured, return the source name */ virtual InitStateString getURINonEmpty() const; /** * Gets the default syncMode. * * Sync modes can be one of: * - disabled * - slow * - two-way * - one-way-from-server * - one-way-from-client * - refresh-from-server * - refresh-from-client */ virtual InitStateString getSync() const; virtual void setSync(const std::string &value, bool temporarily = false); /** shortcut for checking sync mode against "disabled" */ bool isDisabled() { return getSync() == "disabled"; } private: // This can be called quite often, cache it. InitState m_synthesisID; std::string m_name; SyncSourceNodes m_nodes; }; class SingleFileConfigTree; /** * Representing a configuration template node used for fuzzy matching. */ class TemplateConfig { boost::shared_ptr m_template; ConfigProps m_metaProps; std::string m_id; std::string m_templateName; public: TemplateConfig (const std::string &path); enum { NO_MATCH = 0, LEVEL1_MATCH = 1, LEVEL2_MATCH = 2, LEVEL3_MATCH = 3, LEVEL4_MATCH = 4, BEST_MATCH=5 }; static bool isTemplateConfig (const std::string &path); bool isTemplateConfig() const; virtual int metaMatch (const std::string &fingerprint, SyncConfig::MatchMode mode); virtual int serverModeMatch (SyncConfig::MatchMode mode); virtual int fingerprintMatch (const std::string &fingerprint); virtual std::string getTemplateId (); virtual std::string getDescription(); virtual std::string getFingerprint(); virtual std::string getTemplateName(); }; /**@}*/ SE_END_CXX #endif syncevolution-1.5/src/syncevo/SyncSource.h0000664000373300001540000035371312405555067022270 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCSOURCE #define INCL_SYNCSOURCE #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX class SyncSource; struct SDKInterface; /** * This set of parameters always has to be passed when constructing * SyncSource instances. */ struct SyncSourceParams { /** * @param name the name needed by SyncSource * @param nodes a set of config nodes to be used by this source * @param context Additional non-source config settings. * When running as part of a normal sync, these are the * settings for the peer. When running in a local sync, * these settings come from the "target-config" peer * config inside the config context of the source. * Testing uses "target-config@client-test". On the * command line, this is the config chosen by the * user, which may or may not have peer-specific settings! * @param contextName optional name of context in which the source is defined, * needed to disambiguates "name" when sources from * different contexts are active in a sync */ SyncSourceParams(const string &name, const SyncSourceNodes &nodes, const boost::shared_ptr &context, const string &contextName = "") : m_name(name), m_nodes(nodes), m_context(context), m_contextName(contextName) {} std::string getDisplayName() const { return m_contextName.empty() ? m_name : m_contextName + "/" + m_name; } string m_name; SyncSourceNodes m_nodes; boost::shared_ptr m_context; string m_contextName; }; /** * The SyncEvolution core has no knowledge of existing SyncSource * implementations. Implementations have to register themselves * by instantiating this class exactly once with information * about themselves. * * It is also possible to add configuration options. For that define a * derived class. In its constructor use * SyncSourceConfig::getRegistry() resp. SyncConfig::getRegistry() to * define new configuration properties. The advantage of registering * them is that the user interface will automatically handle them like * the predefined ones. The namespace of these configuration options * is shared by all sources and the core. * * For properties with arbitrary names use the * SyncSourceNodes::m_trackingNode. */ class RegisterSyncSource { public: /** * Users select a SyncSource and its data format via the "type" * config property. Backends have to add this kind of function to * the SourceRegistry_t in order to be considered by the * SyncSource creation mechanism. * * The function will be called to check whether the backend was * meant by the user. It should return a new instance which will * be freed by the caller or NULL if it does not support the * selected type. * * Inactive sources should return the special InactiveSource * instance (created with InactiveSource() below) if they * recognize without a doubt that the user wanted to instantiate * them: for example, an inactive EvolutionContactSource will * return NULL for "addressbook" but InactiveSource for * "evolution-contacts". */ typedef SyncSource *(*Create_t)(const SyncSourceParams ¶ms); /** create special result of Create_t: a source which just throws errors when used */ static SyncSource *InactiveSource(const SyncSourceParams ¶ms); /** * @param shortDescr a few words identifying the data to be synchronized, * e.g. "Evolution Calendar" * @param enabled true if the sync source can be instantiated, * false if it was not enabled during compilation or is * otherwise not functional * @param create factory function for sync sources of this type * @param typeDescr multiple lines separated by \n which get appended to * the the description of the type property, e.g. * "Evolution Memos = memo = evolution-memo\n" * " plain text in UTF-8 (default) = text/plain\n" * " iCalendar 2.0 = text/calendar\n" * " The later format is not tested because none of the\n" * " supported SyncML servers accepts it.\n" * @param typeValues the config accepts multiple names for the same internal * type string; this list here is added to that list of * aliases. It should contain at least one unique string * the can be used to pick this sync source among all * SyncEvolution sync sources (testing, listing backends, ...). * Example: Values() + (Aliases("Evolution Memos") + "evolution-memo") */ RegisterSyncSource(const string &shortDescr, bool enabled, Create_t create, const string &typeDescr, const Values &typeValues); public: const string m_shortDescr; const bool m_enabled; const Create_t m_create; const string m_typeDescr; const Values m_typeValues; }; typedef list SourceRegistry; class ClientTest; class TestingSyncSource; /** * Information about a data source. For the sake of simplicity all * items pointed to are owned by the ClientTest and must * remain valid throughout a test session. Not setting a pointer * is okay, but it will disable all tests that need the * information. */ struct ClientTestConfig { /** * The name is used in test names and has to be set. */ std::string m_sourceName; /** * A default URI to be used when creating a client config. */ std::string m_uri; /** * A corresponding source name in the default server template, * this is used to copy corresponding uri set in the server template * instead of the uri field above (which is the same for all servers). */ std::string m_sourceNameServerTemplate; /** * A member function of a subclass which is called to create a * sync source referencing the data. This is used in tests of * the SyncSource API itself as well as in tests which need to * modify or check the data sources used during synchronization. * * The test framework will call beginSync() and then some of * the functions it wants to test. After a successful test it * will call endSync() which is then expected to store all * changes persistently. Creating a sync source again * with the same call should not report any * new/updated/deleted items until such changes are made via * another sync source. * * The instance will be deleted by the caller. Because this * may be in the error case or in an exception handler, * the sync source's desctructor should not thow exceptions. * * @param client the same instance to which this config belongs * @param clientID the unique ID of the client, "1" resp. "2" in practice (can also be obtained as * client->getClientID(), but not all implementers have (or want) access to the * class definition) * @param source index of the data source (from 0 to ClientTest::getNumSources() - 1) * @param isSourceA true if the requested SyncSource is the first one accessing that * data, otherwise the second */ typedef boost::function createsource_t; /** * Creates a sync source which references the primary database; * it may report the same changes as the sync source used during * sync tests. */ createsource_t m_createSourceA; /** * A second sync source also referencing the primary data * source, but configured so that it tracks changes * independently from the the primary sync source. * * In local tests the usage is like this: * - add item via first SyncSource * - iterate over new items in second SyncSource * - check that it lists the added item * * In tests with a server the usage is: * - do a synchronization with the server * - iterate over items in second SyncSource * - check that the total number and number of * added/updated/deleted items is as expected */ createsource_t m_createSourceB; /** * The framework can generate vCard and vCalendar/iCalendar items * automatically by copying a template item and modifying certain * properties. * * This is the template for these automatically generated items. * It must contain the string <> which will be replaced * with the revision parameter of the createItem() method. */ std::string m_templateItem; /** * This is a colon (:) separated list of properties which need * to be modified in templateItem. */ std::string m_uniqueProperties; /** * This is a single property in templateItem which can be extended * to increase the size of generated items. */ std::string m_sizeProperty; /** * Type to be set when importing any of the items into the * corresponding sync sources. Use "" if sync source doesn't * need this information. * * Not currently used! All items are assumed to be in the raw, * internal format (see SyncSourceRaw and SyncSourceSerialize). */ std::string m_itemType; /** * callback which is invoked with a specific item as paramter * to do data type specific conversions before actually * using the test item; default is a NOP function * * @param update modify item content so that it can be * used as an update of the old data * @param uniqueUIDSuffix beyond not reusing UIDs between tests, also embed this suffix * in test items inside the running test to avoid reuse * if necessary (Google CalDAV + UID/SEQUENCE => 409 error) */ boost::function m_mangleItem; /** * Items have a UID which really has to be unique among all items * in the database. True for iCalendar 2.0, false for vCard 3.0 * (there is a UID, but its uniqueness is not enforced). */ bool m_uniqueID; /** * A very simple item that is inserted during basic tests. Ideally * it only contains properties supported by all servers. */ std::string m_insertItem; /** * A slightly modified version of insertItem. If the source has UIDs * embedded into the item data, then both must have the same UID. * Again all servers should better support these modified properties. */ std::string m_updateItem; /** * A more heavily modified version of insertItem. Same UID if necessary, * but can test changes to items only supported by more advanced * servers. */ std::string m_complexUpdateItem; /** * To test merge conflicts two different updates of insertItem are * needed. This is the first such update. */ std::string m_mergeItem1; /** * The second merge update item. To avoid true conflicts it should * update different properties than mergeItem1, but even then servers * usually have problems perfectly merging items. Therefore the * test is run without expecting a certain merge result. */ std::string m_mergeItem2; /** * The items in the inner vector are related: the first one the is * main one, the other(s) is/are a subordinate ones. The semantic * is that the main item is complete on it its own, while the * other normally should only be used in combination with the main * one. * * Because SyncML cannot express such dependencies between items, * a SyncSource has to be able to insert, updated and remove * both items independently. However, operations which violate * the semantic of the related items (like deleting the parent, but * not the child) may have unspecified results (like also deleting * the child). See linkedItemsRelaxedSemantic and sourceKnowsItemSemantic. * * One example for main and subordinate items are a recurring * iCalendar 2.0 event and a detached recurrence. */ typedef class LinkedItems : public std::vector { public: std::string m_name; /**< used as Client::Source::LinkedItems */ StringMap m_options; /**< used to pass additional parameters to the test */ /** for testLinkedItemsSubset: create the additional VEVENT that is added when talking to Exchange; parameters are start, skip, index and total number of items in that test */ boost::function m_testLinkedItemsSubsetAdditional; } LinkedItems_t; /** * The linked items may exist in different variations (outer vector). */ typedef std::vector MultipleLinkedItems_t; MultipleLinkedItems_t m_linkedItems; /** * Another set of linked items for the LinkedItems*::testItemsAll/Second/Third/... tests. */ MultipleLinkedItems_t m_linkedItemsSubset; /** * Backends atomic modification tests */ Bool m_atomicModification; /** * set to false to disable tests which slightly violate the * semantic of linked items by inserting children * before/without their parent */ Bool m_linkedItemsRelaxedSemantic; /** * setting this to false disables tests which depend * on the source's support for linked item semantic * (testLinkedItemsInsertParentTwice, testLinkedItemsInsertChildTwice) * * Matches SynthesisInfo::m_globalIDs. */ Bool m_sourceKnowsItemSemantic; /** * Set this to true if the backend does not have IDs which are the * same for all clients and across slow syncs. For example, when * testing the ActiveSync backend this field needs to be true, * because items are renumbered as 1:x with x = 1, 2, ... for each * clients when a sync anchor is assigned to it. */ Bool m_sourceLUIDsAreVolatile; /** * Set this to true if the backend supports * X-SYNCEVOLUTION-EXDATE-DETACHED, see CalDAVSource.cpp * CalDAVSource::readSubItem(). */ Bool m_supportsReccurenceEXDates; /** * called to dump all items into a file, required by tests which need * to compare items * * ClientTest::dump can be used: it will simply dump all items of the source * with a blank line as separator. * * @param source sync source A already created and with beginSync() called * @param file a file name * @return error code, 0 for success */ boost::function m_dump; /** * import test items: which these are is determined entirely by * the implementor, but tests work best if several complex items are * imported * * ClientTest::import can be used if the file contains items separated by * empty lines. * * @param source sync source A already created and with beginSync() called * @param file the name of the file to import * @retval realfile the name of the file that was really imported; * this may depend on the current server that is being tested * @param luids optional; if empty, then fill with luids (empty string for failed items); * if not empty, then update instead of adding the items * @return error string, empty for success */ boost::function *)> m_import; /** * a function which compares two files with items in the format used by "dump" * * @param fileA first file name * @param fileB second file name * @return true if the content of the files is considered equal */ boost::function m_compare; /** * A file with test cases in the format expected by import and compare. * The file should contain data as supported by the local storage. * * It is used in "Source::*::testImport" test, which verifies that * the backend can import and export that data. * * It is also used in "Sync::*::testItems", which verifies that * the peer can store and export it. Often local extensions are * not supported by peers. This can be handled in different ways: * - Patch synccompare to ignore such changes on a per-peer basis. * - Create a ..tem file in the src/testcases * build directory where is the string here ("eds_event.ics"), * and the value of CLIENT_TEST_SERVER ("funambol"). * That file then will be used in testItems instead of the base * version. See the src/Makefile.am for rules that maintain such files. */ std::string m_testcases; /** * the item type normally used by the source (not used by the tests * themselves; client-test.cpp uses it to initialize source configs) */ std::string m_type; /** * a list of sub configs separated via , if this is a super datastore */ std::string m_subConfigs; /** * TRUE if the source supports recovery from an interrupted * synchronization. Enables the Client::Sync::*::Retry group * of tests. */ Bool m_retrySync; Bool m_suspendSync; Bool m_resendSync; /** * Set this to a list of properties which must *not* be removed * from the test items. Leave empty to disable the testRemoveProperties * test. Test items must be in vCard 3.0/iCalendar 2.0 format. */ std::set m_essentialProperties; /** * Set this to test if the source supports preserving local data extensions. * Uses the "testcases" data. See Sync::*::testExtensions. * * The function must modify a single item such that re-importing * it locally will be seen as updating it. It is empty by default * because not all backends necessarily pass this test. * * genericUpdate works for vCard and iCalendar by updating FN, N, resp. SUMMARY * and can be used as implementation of update. */ boost::function m_update; boost::function m_genericUpdate; /** * A list of m_sourceName values of other ClientTestConfigs * which share the same database. Normally, sources are tested in * isolation, but for such linked sources we also need to test * interdependencies, in particular regarding change tracking and * item listing. */ std::list m_linkedSources; }; /** * In addition to registering the sync source itself by creating an * instance of RegisterSyncSource, configurations for testing it can * also be registered. A sync source which supports more than one data * exchange format can register one configuration for each format, but * not registering any configuration is also okay. * * *Using* the registered tests depends on the CPPUnit test framework. * *Registering* does not. Therefore backends should always register * * *themselves for testing and leave it to the test runner * "client-test" whether tests are really executed. * * Unit tests are different. They create hard dependencies on CPPUnit * inside the code that contains them, and thus should be encapsulated * inside #ifdef ENABLE_UNIT_TESTS checks. * * Sync sources have to work stand-alone without a full SyncClient * configuration for all local tests. The minimal configuration prepared * for the source includes: * - a tracking node (as used f.i. by TrackingSyncSource) which * points towards "~/.config/syncevolution/client-test-changes" * - a unique change ID (as used f.i. by EvolutionContactSource) * - a valid "evolutionsource" property in the config node, starting * with the CLIENT_TEST_EVOLUTION_PREFIX env variable or (if that * wasn't set) the "SyncEvolution_Test_" prefix * - "evolutionuser/password" if CLIENT_TEST_EVOLUTION_USER/PASSWORD * are set * * No other properties are set, which implies that currently sync sources * which require further parameters cannot be tested. * * @warning There is a potential problem with the registration * mechanism. Both the sync source tests as well as the CPPUnit tests * derived from them are registrered when global class instances are * initialized. If the RegisterTestEvolution instance in * client-test-app.cpp is initialized *before* the sync source tests, * then those won't show up in the test list. Currently the right * order seems to be used, so everything works as expected. */ class RegisterSyncSourceTest { public: /** * Invoked after all global constructors are run. * May add further RegisterSyncSourceTests to the * global registry. */ virtual void init() const {} /** * This call is invoked after setting up the config with default * values for the test cases selected via the constructor's * testCaseName parameter (one of eds_contact, eds_contact, eds_event, eds_task; * see ClientTest in the Funambol client library for the current * list). * * This call can then override any of the values or (if there * are no predefined test cases) add them. * * The "type" property must select your sync source and the * data format for the test. * * @retval config change any field whose default is not suitable */ virtual void updateConfig(ClientTestConfig &config) const = 0; /** * @param configName a unique string: the predefined names known by * ClientTest::getTestData() are already used for the initial * set of Evolution sync sources, for new sync sources * build a string by combining them with the sync source name * (e.g., "sqlite_eds_contact") * @param testCaseName a string recognized by ClientTest::getTestData() or an * empty string if there are no predefined test cases */ RegisterSyncSourceTest(const string &configName, const string &testCaseName); virtual ~RegisterSyncSourceTest() {} const string m_configName; const string m_testCaseName; /** * A list of m_configName values of other RegisterSyncSourceTest * which share the same database. Normally, sources are tested in * isolation, but for such linked sources we also need to test * interdependencies, in particular regarding change tracking and * item listing. */ std::list m_linkedSources; }; class TestRegistry : public vector { public: // TODO: using const RegisterSyncSourceTest * operator [] (int); const RegisterSyncSourceTest * operator [] (const string &configName) const { BOOST_FOREACH(const RegisterSyncSourceTest *test, *this) { if (test->m_configName == configName) { return test; } } throw out_of_range(string("test config registry: ") + configName); return NULL; } }; /** * a container for Synthesis XML config fragments * * Backends can define their own field lists, profiles, datatypes and * remote rules. The name of each of these entities have to be unique: * either prefix each name with the name of the backend or coordinate * with other developers (e.g. regarding shared field lists). * * To add new items, add them to the respective hash in your backend's * getDatastoreXML() or getSynthesisInfo() implementation. Both * methods have default implementations: getSynthesisInfo() is called * by the default getDatastoreXML() to provide some details and * provides them based on the "type" configuration option. * * The default config XML contains several predefined items: * - field lists: contacts, calendar, Note, bookmarks * - profiles: vCard, vCalendar, Note, vBookmark * - datatypes: vCard21, vCard30, vCalendar10, iCalendar20, * note10/11 (no difference except the versioning!), * vBookmark10 * - remote rule: EVOLUTION * * These items do not appear in the hashes, so avoid picking the same * names. The entries of each hash has to be a well-formed XML * element, their keys the name encoded in each XML element. */ struct XMLConfigFragments { class mapping : public std::map { public: string join() { string res; size_t len = 0; BOOST_FOREACH(const value_type &entry, *this) { len += entry.second.size() + 1; } res.reserve(len); BOOST_FOREACH(const value_type &entry, *this) { res += entry.second; res += "\n"; } return res; } } m_fieldlists, m_profiles, m_datatypes, m_remoterules; }; /** * used in SyncSource::Operations post-operation signal */ enum OperationExecution { OPERATION_SKIPPED, /**< operation was skipped because pre-operation slot threw an exception */ OPERATION_EXCEPTION, /**< operation itself failed with an exception (may also return error code) */ OPERATION_FINISHED, /**< operation finished normally (but might have returned an error code) */ OPERATION_EMPTY /**< operation not implemented */ }; /** * Helper class for looking up a pending operation by a Synthesis parameter. * KeyH (add, replace) and item ID (delete) are supported. */ template struct KeyConverter; /** * For KeyH we make the assumption that the key exists as long * as the pending operation, and thus its address can be used as * unique identifier for the operation. */ template<> struct KeyConverter { typedef void * key_type; static key_type toKey(sysync::KeyH key) { return static_cast(key); } }; /** * For cItemID we just use the item ID as string. */ template<> struct KeyConverter { typedef std::string key_type; static key_type toKey(sysync::cItemID id) { return id->item; } }; /** * To be returned by a function wrapped by OperationWrapper * when the function is not done yet and wants to be called again * for the same item. */ template class ContinueOperation : public boost::function { public: ContinueOperation() {} ContinueOperation(const boost::function &callback) : boost::function(callback) {} }; /** * Interface expected by SyncSourceBase helper class. * Needed to break a cyclic dependency. */ class SyncSourceName { public: /** * the name of the sync source (for example, "addressbook"), * unique in the context of its own configuration **/ virtual std::string getName() const { return "uninitialized SyncSourceBase"; } /** * the name of the sync source as it should be displayed to users * in debug messages; typically the same as getName(), but may * also include a context ("@foobar/addressbook") to disambiguate * the name when "addressbook" is used multiple times in a sync (as * with local sync) */ virtual std::string getDisplayName() const { return "uninitialized SyncSourceBase"; } }; /** * Implements the "call all slots, error if any failed" semantic of * the pre- and post-signals described below. */ class OperationSlotInvoker { SyncSourceName &m_source; public: OperationSlotInvoker(SyncSourceName &source) : m_source(source) {} typedef sysync::TSyError result_type; template result_type operator() (InputIterator first, InputIterator last) const { result_type res = sysync::LOCERR_OK; while (first != last) { SyncMLStatus status; try { status = *first; } catch (...) { status = Exception::handle(m_source.getDisplayName()); } if (res == sysync::LOCERR_OK) { res = static_cast(status); } ++first; } return res; } }; /** * Helper class, needs to be specialized based on number of parameters * and return type. */ template class OperationWrapperSwitch; /** one parameter, sysync::TSyError type */ template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; /** * The pre-signal is invoked with the same parameters as * the operations, plus a reference to the sync source as * initial parameter. Slots may return something other than * STATUS_OK or throw exceptions, which * will skip the actual implementation. However, all slots * will be invoked exactly once even if one of them throws * an exception. The result of the operation then is the * error code extracted from the first exception (see * OperationSlotInvoker). */ typedef boost::signals2::signal PreSignal; /** * The post-signal is invoked exactly once, regardless * whether the implementation was skipped, executed or * doesn't exist at all. This information is passed as the * second parameter, followed by the result of the * operation or the pre-signals, followed by the * parameters of the operation. * * As with the pre-signal, any slot may return something other * than STATUS_OK or throw an exception * to override the final result, but this won't interrupt * calling the rest of the slots. */ typedef boost::signals2::signal PostSignal; /** * invokes signals and implementation of operation, * combines all return codes into one */ sysync::TSyError operator () () const throw () { sysync::TSyError res; OperationExecution exec; res = m_pre(dynamic_cast(m_source)); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (m_operation) { try { res = m_operation(); exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res); if (newres != sysync::LOCERR_OK) { res = newres; } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } /** * Anyone may connect code to the signals via * getOperations().getPre/PostSignal(), although strictly * speaking this modifies the behavior of the * implementation. */ PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; }; template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; typedef typename boost::function::arg1_type arg1_type; typedef boost::signals2::signal PreSignal; typedef boost::signals2::signal PostSignal; sysync::TSyError operator () (arg1_type a1) const throw () { sysync::TSyError res; OperationExecution exec; res = m_pre(dynamic_cast(m_source), a1); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (m_operation) { try { res = m_operation(a1); exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res, a1); if (newres != sysync::LOCERR_OK) { res = newres; } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; }; template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; typedef typename boost::function::arg1_type arg1_type; typedef boost::signals2::signal PreSignal; typedef boost::signals2::signal PostSignal; typedef KeyConverter Converter; typedef ContinueOperation Continue; typedef std::map Pending; sysync::TSyError operator () (arg1_type a1) const throw () { sysync::TSyError res; OperationExecution exec; // Marking m_pending "volatile" didn't work, find() not defined for that. typename Pending::iterator it = const_cast(m_pending).find(Converter::toKey(a1)); bool continuing = it != m_pending.end(); res = continuing ? sysync::LOCERR_OK : m_pre(dynamic_cast(m_source), a1); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (continuing) { res = it->second(a1); if (res != sysync::LOCERR_AGAIN) { const_cast(m_pending).erase(it); } } else if (m_operation) { try { V newres = m_operation(a1); sysync::TSyError *completed = boost::get(&newres); if (completed) { res = *completed; } else { res = sysync::LOCERR_AGAIN; Continue cont = boost::get(newres); const_cast(m_pending).insert(std::make_pair(Converter::toKey(a1), cont)); } exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } if (res != sysync::LOCERR_AGAIN) { sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res, a1); if (newres != sysync::LOCERR_OK) { res = newres; } } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; Pending m_pending; }; template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; typedef typename boost::function::arg1_type arg1_type; typedef typename boost::function::arg2_type arg2_type; typedef boost::signals2::signal PreSignal; typedef boost::signals2::signal PostSignal; sysync::TSyError operator () (arg1_type a1, arg2_type a2) const throw () { sysync::TSyError res; OperationExecution exec; res = m_pre(dynamic_cast(m_source), a1, a2); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (m_operation) { try { res = m_operation(a1, a2); exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res, a1, a2); if (newres != sysync::LOCERR_OK) { res = newres; } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; }; template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; typedef typename boost::function::arg1_type arg1_type; typedef typename boost::function::arg2_type arg2_type; typedef boost::signals2::signal PreSignal; typedef boost::signals2::signal PostSignal; typedef KeyConverter Converter; typedef ContinueOperation Continue; typedef std::map Pending; sysync::TSyError operator () (arg1_type a1, arg2_type a2) const throw () { sysync::TSyError res; OperationExecution exec; // Marking m_pending "volatile" didn't work, find() not defined for that. typename Pending::iterator it = const_cast(m_pending).find(Converter::toKey(a1)); bool continuing = it != m_pending.end(); res = continuing ? sysync::LOCERR_OK : m_pre(dynamic_cast(m_source), a1, a2); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (continuing) { res = it->second(a1, a2); if (res != sysync::LOCERR_AGAIN) { const_cast(m_pending).erase(it); } } else if (m_operation) { try { V newres = m_operation(a1, a2); sysync::TSyError *completed = boost::get(&newres); if (completed) { res = *completed; } else { res = sysync::LOCERR_AGAIN; Continue cont = boost::get(newres); const_cast(m_pending).insert(std::make_pair(Converter::toKey(a1), cont)); } exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } if (res != sysync::LOCERR_AGAIN) { sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res, a1, a2); if (newres != sysync::LOCERR_OK) { res = newres; } } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; Pending m_pending; }; template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; typedef typename boost::function::arg1_type arg1_type; typedef typename boost::function::arg2_type arg2_type; typedef typename boost::function::arg3_type arg3_type; typedef boost::signals2::signal PreSignal; typedef boost::signals2::signal PostSignal; sysync::TSyError operator () (arg1_type a1, arg2_type a2, arg3_type a3) const throw () { sysync::TSyError res; OperationExecution exec; res = m_pre(dynamic_cast(m_source), a1, a2, a3); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (m_operation) { try { res = m_operation(a1, a2, a3); exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res, a1, a2, a3); if (newres != sysync::LOCERR_OK) { res = newres; } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; }; template class OperationWrapperSwitch { public: typedef sysync::TSyError result_type; typedef boost::function OperationType; typedef typename boost::function::arg1_type arg1_type; typedef typename boost::function::arg2_type arg2_type; typedef typename boost::function::arg3_type arg3_type; typedef boost::signals2::signal PreSignal; typedef boost::signals2::signal PostSignal; typedef KeyConverter Converter; typedef ContinueOperation Continue; typedef std::map Pending; sysync::TSyError operator () (arg1_type a1, arg2_type a2, arg3_type a3) const throw () { sysync::TSyError res; OperationExecution exec; // Marking m_pending "volatile" didn't work, find() not defined for that. typename Pending::iterator it = const_cast(m_pending).find(Converter::toKey(a1)); bool continuing = it != m_pending.end(); res = continuing ? sysync::LOCERR_OK : m_pre(dynamic_cast(m_source), a1, a2, a3); if (res != sysync::LOCERR_OK) { exec = OPERATION_SKIPPED; } else { if (continuing) { res = it->second(a1, a2, a3); if (res != sysync::LOCERR_AGAIN) { const_cast(m_pending).erase(it); } } else if (m_operation) { try { V newres = m_operation(a1, a2, a3); sysync::TSyError *completed = boost::get(&newres); if (completed) { res = *completed; } else { res = sysync::LOCERR_AGAIN; Continue cont = boost::get(newres); const_cast(m_pending).insert(std::make_pair(Converter::toKey(a1), cont)); } exec = OPERATION_FINISHED; } catch (...) { res = Exception::handle(m_source.getDisplayName()); exec = OPERATION_EXCEPTION; } } else { res = sysync::LOCERR_NOTIMP; exec = OPERATION_EMPTY; } } if (res != sysync::LOCERR_AGAIN) { sysync::TSyError newres = m_post(dynamic_cast(m_source), exec, res, a1, a2, a3); if (newres != sysync::LOCERR_OK) { res = newres; } } return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } PreSignal &getPreSignal() const { return const_cast(m_pre); } PostSignal &getPostSignal() const { return const_cast(m_post); } OperationWrapperSwitch(SyncSourceName &source) : m_source(source), m_pre(OperationSlotInvoker(source)), m_post(OperationSlotInvoker(source)) { } protected: OperationType m_operation; private: SyncSourceName &m_source; PreSignal m_pre; PostSignal m_post; Pending m_pending; }; /** * This mimics a boost::function with the same signature. The function * signature F must have a sysync::TSyError error return code, as in most * of the Synthesis DB API, or a boost::variant of sysync::TSyError and * ContinueOperation. * * Specializations of this class for operations with different number * of parameters provide a call operator which invokes a pre- and * post-signal around the actual implementation. See * OperationWrapperSwitch for details. * * If the function returns a variant with a ContinueOperation inside, * the OperationWrapper will store that callback for the current * set of parameters (currently using only the first one as key), * then when called again, skip the pre-signal and invoke the callback * instead of the original operation. That callback may return LOCERR_AGAIN * to request being called again the same way. The post-signal is * called when the operation finally completes. * * Additional operations could be wrapped by providing more * specializations (different return code, more parameters). The * number or parameters in the operation cannot exceed six, because * adding three more parameters in the post-signal would push the * total number of parameters in that signal beyond the limit of nine * supported arguments in boost::signals2/boost::function. */ template class OperationWrapper : public OperationWrapperSwitch::arity, typename boost::function::result_type> { typedef OperationWrapperSwitch::arity, typename boost::function::result_type> inherited; public: OperationWrapper(SyncSourceName &source): inherited(source) {} /** operation implemented? */ operator bool () const { return inherited::m_operation; } /** * Only usable by derived classes via read/write m_operations: * sets the actual implementation of the operation. */ void operator = (const boost::function &operation) { inherited::m_operation = operation; } }; /** * abstract base class for SyncSource with some common functionality * and no data * * Used to implement and call that functionality in multiple derived * classes, including situations where a derived class is derived from * this base via different intermediate classes, therefore the * need to keep it abstract. */ class SyncSourceBase : public SyncSourceName { public: virtual ~SyncSourceBase() {} /** * Convenience function, to be called inside a catch() block of * (or for) the sync source. * * Rethrows the exception to determine what it is, then logs it * as an error and returns a suitable error code (usually a general * STATUS_DATASTORE_FAILURE). * * @param flags influence behavior of the method */ SyncMLStatus handleException(HandleExceptionFlags flags = HANDLE_EXCEPTION_FLAGS_NONE); /** * throw an exception after an operation failed * * output format: : : * * @param action a string describing the operation or object involved * @param error the errno error code for the failure */ void throwError(const SourceLocation &where, const string &action, int error) SE_NORETURN; /** * throw an exception after an operation failed and * remember that this instance has failed * * output format: : * * @param action a string describing what was attempted *and* how it failed */ void throwError(const SourceLocation &where, const string &failure) SE_NORETURN; /** * throw an exception with a specific status code after an operation failed and * remember that this instance has failed * * output format: : * * @param status a more specific status code; other throwError() variants use STATUS_FATAL * @param action a string describing what was attempted *and* how it failed */ void throwError(const SourceLocation &where, SyncMLStatus status, const string &failure) SE_NORETURN; /** * The Synthesis engine only counts items which are deleted by the * peer. Items deleted locally at the start of a * refresh-from-server sync are not counted (and cannot be counted * in all cases). * * Sync sources which want to have those items included in the * sync statistics should count *all* deleted items using these * methods. SyncContext will use this number for * refresh-from-server syncs. */ /**@{*/ virtual long getNumDeleted() const = 0; virtual void setNumDeleted(long num) = 0; virtual void incrementNumDeleted() = 0; /**@}*/ /** * Return Synthesis XML fragment for this sync source. * Must *not* include the element; it is created by * the caller. * * The default implementation returns a configuration for the * SynthesisDBPlugin, which invokes SyncSource::Operations. Items * are exchanged with the SyncsSource in the format defined by * getSynthesisInfo(). The format used with the SyncML side is * negotiated via the peer's capabilities, with the type defined * in the configuration being the preferred one of the data store. * * See SyncContext::getConfigXML() for details about * predefined entries that can be referenced here. * * @retval xml put content of ... here * @retval fragments the necessary definitions for the datastore have to be added here */ virtual void getDatastoreXML(string &xml, XMLConfigFragments &fragments); /** * Synthesis name which matches the format used * for importing and exporting items (exportData()). * This is not necessarily the same format that is given * to the Synthesis engine. If this internal format doesn't * have a in the engine, then an empty string is * returned. */ virtual string getNativeDatatypeName(); /** * return Synthesis API pointer, if one currently is available * (between SyncEvolution_Module_CreateContext() and * SyncEvolution_Module_DeleteContext()) */ virtual SDKInterface *getSynthesisAPI() const = 0; /** * Prepare the sync source for usage inside a SyncML server. To * be called directly after creating the source, if at all. */ virtual void enableServerMode() = 0; virtual bool serverModeEnabled() const = 0; /** * The optional operations. * * All of them are guaranteed to happen between open() and * close(). * * They are all allowed to throw exceptions: the operations called * by SyncEvolution then abort whatever SyncEvolution was doing * and end in the normal exception handling. For the Synthesis * operations, the bridge code in SynthesisDBPlugin code catches * exceptions, logs them and translates them into Synthesis error * codes, which are returned to the Synthesis engine. * * Monitoring of most DB operations is possible via the pre- and * post-signals managed by OperationWrapper. */ struct Operations { Operations(SyncSourceName &source); /** * The caller determines where item data is stored (m_dirname) * and where meta information about them (m_node). The callee * then can use both arbitrarily. As an additional hint, * m_mode specifies why and when the backup is made, which * is useful to determine whether information can be reused. */ struct BackupInfo { enum Mode { BACKUP_BEFORE, /**< directly at start of sync */ BACKUP_AFTER, /**< directly after sync */ BACKUP_OTHER } m_mode; string m_dirname; boost::shared_ptr m_node; BackupInfo() {} BackupInfo(Mode mode, const string &dirname, const boost::shared_ptr &node) : m_mode(mode), m_dirname(dirname), m_node(node) {} }; struct ConstBackupInfo { BackupInfo::Mode m_mode; string m_dirname; boost::shared_ptr m_node; ConstBackupInfo() {} ConstBackupInfo(BackupInfo::Mode mode, const string &dirname, const boost::shared_ptr &node) : m_mode(mode), m_dirname(dirname), m_node(node) {} }; /** * Dump all data from source unmodified into the given backup location. * Information about the created backup is added to the * report. * * Required for the backup/restore functionality in * SyncEvolution, not for syncing itself. But typically it is * called before syncing (can be turned off by users), so * implementations can reuse the information gathered while * making a backup in later operations. * * @param previous the most recent backup, empty m_dirname if none * @param next the backup which is to be created, directory and node are empty * @param report to be filled with information about backup (number of items, etc.) */ typedef void (BackupData_t)(const ConstBackupInfo &oldBackup, const BackupInfo &newBackup, BackupReport &report); boost::function m_backupData; /** * Restore database from data stored in backupData(). * If possible don't touch items which are the same as in the * backup, to mimimize impact on future incremental syncs. * * @param oldBackup the backup which is to be restored * @param dryrun pretend to restore and fill in report, without * actually touching backend data * @param report to be filled with information about restore * (number of total items and changes) */ typedef void (RestoreData_t)(const ConstBackupInfo &oldBackup, bool dryrun, SyncSourceReport &report); boost::function m_restoreData; /** * initialize information about local changes and items * as in beginSync() with all parameters set to true, * but without changing the state of the underlying database * * This method will be called to check for local changes without * actually running a sync, so there is no matching end call. * * There might be sources which don't support non-destructive * change tracking (in other words, checking changes permanently * modifies the state of the source and cannot be repeated). * Such sources should leave the functor empty. */ typedef void (CheckStatus_t)(SyncSourceReport &local); boost::function m_checkStatus; /** * A quick check whether the source currently has data. * * If this cannot be determined easily, don't provide the * operation. The information is currently only used to * determine whether a slow sync should be allowed. If * the operation is not provided, the assumption is that * there is local data, which disables the "allow slow * sync for empty databases" heuristic and forces the user * to choose. */ typedef bool (IsEmpty_t)(); boost::function m_isEmpty; /** * Synthesis DB API callbacks. For documentation see the * Synthesis API specification (PDF and/or sync_dbapi.h). * * Implementing this is necessary for SyncSources which want * to be part of a sync session. */ /**@{*/ typedef OperationWrapper StartDataRead_t; StartDataRead_t m_startDataRead; typedef OperationWrapper EndDataRead_t; EndDataRead_t m_endDataRead; typedef OperationWrapper StartDataWrite_t; StartDataWrite_t m_startDataWrite; typedef OperationWrapper FinalizeLocalID_t; FinalizeLocalID_t m_finalizeLocalID; typedef OperationWrapper EndDataWrite_t; EndDataWrite_t m_endDataWrite; /** the SynthesisDBPlugin is configured so that this operation doesn't have to (and cannot) return the item data */ typedef OperationWrapper ReadNextItem_t; ReadNextItem_t m_readNextItem; typedef OperationWrapper ReadItemAsKey_t; ReadItemAsKey_t m_readItemAsKey; typedef ContinueOperation InsertItemAsKeyContinue_t; typedef boost::variant InsertItemAsKeyResult_t; typedef OperationWrapper InsertItemAsKey_t; InsertItemAsKey_t m_insertItemAsKey; typedef ContinueOperation UpdateItemAsKeyContinue_t; typedef boost::variant UpdateItemAsKeyResult_t; typedef OperationWrapper UpdateItemAsKey_t; UpdateItemAsKey_t m_updateItemAsKey; typedef ContinueOperation DeleteItemContinue_t; typedef boost::variant DeleteItemResult_t; typedef OperationWrapper DeleteItem_t; DeleteItem_t m_deleteItem; /**@}*/ /** * Synthesis administration callbacks. For documentation see the * Synthesis API specification (PDF and/or sync_dbapi.h). * * Implementing this is *optional* in clients. In the Synthesis client * engine, the "binfiles" module provides these calls without SyncEvolution * doing anything. * * In the Synthesis server engine, the * SyncSource::enableServerMode() call must install an * implementation, like the one from SyncSourceAdmin. */ /**@{*/ typedef OperationWrapper LoadAdminData_t; LoadAdminData_t m_loadAdminData; typedef OperationWrapper SaveAdminData_t; SaveAdminData_t m_saveAdminData; // not currently wrapped because it has a different return type; // templates could be adapted to handle that typedef bool (ReadNextMapItem_t)(sysync::MapID mID, bool aFirst); boost::function m_readNextMapItem; typedef OperationWrapper InsertMapItem_t; InsertMapItem_t m_insertMapItem; typedef OperationWrapper UpdateMapItem_t; UpdateMapItem_t m_updateMapItem; typedef OperationWrapper DeleteMapItem_t; DeleteMapItem_t m_deleteMapItem; // not wrapped, too many parameters typedef boost::function ReadBlob_t; ReadBlob_t m_readBlob; typedef boost::function WriteBlob_t; WriteBlob_t m_writeBlob; typedef OperationWrapper DeleteBlob_t; DeleteBlob_t m_deleteBlob; /**@}*/ }; /** * Read-only access to operations. */ virtual const Operations &getOperations() const = 0; /** * Start flushing item modifications which were not executed right * away. Item modifications (add/update/delete) can be delayed by * returning LOCERR_AGAIN or, when using for example * SyncSourceSerialize aka TrackingSyncSource, by returning a "check" * function instead of the final result. * * The sync engine calls this method after processing each incoming * SyncML message. */ virtual void flushItemChanges() {} /** * Called after flush() to ensure that all pending modifications * have completed. Called when the engine needs the results. * * Called by the sync engine when the SyncML peer ran out of new * item changes. At that time we would start sending back and forth * empty messages, unless we can provide results. */ virtual void finishItemChanges() {} /** * In some usage scenarios, change tracking is not necessary. * This includes local caching (where local data is not expected * to changed outside of sync) or item manipulation. * * The user of a source must explicitly disable change tracking, * see SyncSource. */ virtual bool needChanges() { return true; } enum ReadAheadOrder { READ_ALL_ITEMS, /** all items as reported by the ReadNextItem operation */ READ_CHANGED_ITEMS, /** read updated or added items as reported by the ReadNextItem operation */ READ_SELECTED_ITEMS, /** read items as given in an explicit list */ READ_NONE /** remove previous hint */ }; typedef std::vector ReadAheadItems; /** * Provides a hint to the source which items are going to be read * next. A source may use this to implement read-ahead. This * is just a hint, the source must also work if reads turn out to * ask for other items. */ virtual void setReadAheadOrder(ReadAheadOrder order, const ReadAheadItems &luids = ReadAheadItems()) { } virtual void getReadAheadOrder(ReadAheadOrder &order, ReadAheadItems &luids) { order = READ_NONE; luids.clear(); } protected: struct SynthesisInfo { /** * name to use for MAKE/PARSETEXTWITHPROFILE, * leave empty when acessing the field list directly */ std::string m_profile; /** * the second parameter for MAKE/PARSETEXTWITHPROFILE * which specifies a remote rule to be applied when * converting to and from the backend */ std::string m_backendRule; /** list of supported datatypes in "" format */ std::string m_datatypes; /** native datatype (see getNativeDatatypeName()) */ std::string m_native; /** name of the field list used by the datatypes */ std::string m_fieldlist; /** * One or more Synthesis script statements, separated * and terminated with a semicolon. Can be left empty. * * If not empty, then these statements are executed directly * before converting the current item fields into * a single string with MAKETEXTWITHPROFILE() in the sync source's * (see SyncSourceBase::getDatastoreXML()). * * This value is currently only used by sync sources which * set m_profile. */ std::string m_beforeWriteScript; /** * Same as m_beforeWriteScript, but used directly after * converting a string into fields with PARSETEXTWITHPROFILE() * in . */ std::string m_afterReadScript; /** * Arbitrary configuration options, can override the ones above * because they are added to the * XML configuration directly before the closing element. * * One example is adding : this is necessary * in backends which depend on getting complete items (= for example, * vCard 3.0 strings) from the engine. Note that any source * derived from SyncSourceSerialize (= the majority of the backends) * have this set by default. */ std::string m_datastoreOptions; /** * If true, then the StartDataRead call (aka SyncSourceSession::beginSync) * is invoked before the first message exchange with the peer. Otherwise * it is invoked only if the peer could be reached and accepts the credentials. * * See SyncSourceSession::beginSync for further comments. */ Bool m_earlyStartDataRead; /** * If true, then the storage is considered read-only by the * engine. All write requests by the peer will be silently * discarded. This is necessary for slow syncs, where the peer * might send back modified items. */ Bool m_readOnly; /** * If true, then the storage preserves and supports UID and * (in iCalendar 2.0) RECURRENCE-ID with the "globally unique" * semantic from iCalendar 2.0 (id assigned once when item is * created). If both sides in a sync support this, then the * engine can rely on these properties to find matching items * during a slow sync. * * Matches ClientTestConfig::m_sourceKnowsItemSemantic. */ Bool m_globalIDs; }; /** * helper function for getDatastoreXML(): fill in information * as necessary * * @retval fragments the necessary definitions for the other * return values have to be added here */ virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) = 0; /** * utility code: creates Synthesis * statements, using the predefined vCard21/vCard30/vcalendar10/icalendar20 * types. Throws an error if no suitable result can be returned (empty or invalid type) * * @param type the format specifier as used in SyncEvolution configs, with and without version * (text/x-vcard:2.1, text/x-vcard, text/x-vcalendar, text/calendar, text/plain, ...); * see SourceType::m_format * @param forceFormat if true, then don't allow alternative formats (like vCard 3.0 in addition to 2.1); * see SourceType::m_force * @return generated XML fragment */ std::string getDataTypeSupport(const std::string &type, bool forceFormat); }; /** * SyncEvolution accesses all sources through this interface. * * Certain functionality is optional or can be implemented in * different ways. These methods are accessed through functors * (function objects) which may be unset. The expected usage is that * derived classes fill in the pieces that they provide by binding the * functors to normal methods. For example, TrackingSyncSource * provides a normal base class with pure virtual functions which have * to be provided by users of that class. * * Error reporting is done via the Log class. */ class SyncSource : virtual public SyncSourceBase, public SyncSourceConfig, public SyncSourceReport { public: SyncSource(const SyncSourceParams ¶ms); virtual ~SyncSource() {} /** true in sources which are not meant to be used, see RegisterSyncSource::InactiveSource() */ virtual bool isInactive() const { return false; } /** * SyncSource implementations must register themselves here via * RegisterSyncSource */ static SourceRegistry &getSourceRegistry(); /** * SyncSource tests are registered here by the constructor of * RegisterSyncSourceTest */ static TestRegistry &getTestRegistry(); struct Database { Database(const string &name, const string &uri, bool isDefault = false, bool isReadOnly = false) : m_name( name ), m_uri( uri ), m_isDefault(isDefault), m_isReadOnly(isReadOnly) {} string m_name; string m_uri; bool m_isDefault; bool m_isReadOnly; }; typedef vector Databases; /** * returns a list of all know data sources for the kind of items * supported by this sync source */ virtual Databases getDatabases() = 0; /** * Creates a new database. * The default implementation just throws an error. * * @param database At least the name should be set. Some backends * may also be able to create the database with * a specific URI. * @return description of the new database */ virtual Database createDatabase(const Database &database) { throwError(SE_HERE, "creating databases is not supported by backend " + getBackend()); return Database("", ""); } /** * Removing a database primarily removes the meta data about the * database. The data itself may still exist in a trash folder. * The enum tells the deleteDatabase() call what the intention of * the caller is. */ enum RemoveData { REMOVE_DATA_DEFAULT, /**< do whatever makes most sense for the backend */ REMOVE_DATA_FORCE, /**< force immediate purging of the data, fail if not possible */ REMOVE_DATA_KEEP /**< keep data, only remove access to it */ }; /** * Removes a database. To map a "database" property to a uri, * instantiate the source with the desired config, open() it and * then call getDatabase(). * * @param uri unique identifier for the database * @param removeData describes what to do about the database content */ virtual void deleteDatabase(const std::string &uri, RemoveData removeData) { throwError(SE_HERE, "deleting databases is not supported by backend " + getBackend()); } /** * Actually opens the data source specified in the constructor, * will throw the normal exceptions if that fails. Should * not modify the state of the sync source. * * The expectation is that this call is fairly light-weight, but * does enough checking to determine whether the source is * usable. More expensive operations (like determining changes) * should be done in the m_startDataRead callback (bound to * beginSync() in some of the utility classes). * * In clients, it will be called for all sources before * the sync starts. In servers, it is called for each source once * the client asks for it, but not sooner. */ virtual void open() = 0; /** * Checks whether the source as currently configured can access * data. open() must have been called first. * * The default implementation calls Operations::m_isEmpty; this * assumes that m_isEmpty really does something with the * database. Derived classes which neither check their config in * open() nor during m_isEmpty() should provide their own * implementation of isUsable(). It might also be possible to * check usability more efficiently. * * It is also possible to suppress the usability check by * providing an implementation which always returns true, for * example when checking would be too expensive or lead to * unexpected operations (like accessing a remote server). * * If unusable, the implementation should print an INFO message * explaining why the source is unusable. Whether that is an * error will be determined by the caller. * * @return false if the source is definitely unusable, true if it * is usable or might be */ virtual bool isUsable(); /** * Returns the actual database that is in use. open() must * have been called first. * * Useful because the "database" property might be empty or * be interpreted in different ways by different backends. * * Needed for deleting databases. Not implemented in all * backends. The default implementation returns an empty * structure. * * @return Database structure with at least m_uri set if * the actual database is known. */ Database getDatabase() const { return m_database; } /** * To be called by derived implementation of open(). */ void setDatabase(const Database &database) { m_database = database; } /** * Read-only access to operations. Derived classes can modify * them via m_operations. */ virtual const Operations &getOperations() const { return m_operations; } /** * closes the data source so that it can be reopened * * Just as open() it should not affect the state of * the database unless some previous action requires * it. */ virtual void close() = 0; /** * A hint to the source that syncing will stop processing data * for a while (freeze = true) or resume processing (freeze = * false). * * If the source needs to change its own state to accomodate * the new freeze state of the sync and that change fails, then * the source must throw an error in setFreeze(). The caller will * not interact with the source while frozen and thus would not * notice the failure if no error was thrown. */ virtual void setFreeze(bool freeze) {} /** * Number of InsertItem operations, regardless whether the * operation succeeded or failed. Operations which get suspended * are counted again each time they are resumed. */ int32_t getAdded() const { return m_added; } int32_t getUpdated() const { return m_updated; } int32_t getDeleted() const { return m_deleted; } /** * return Synthesis API pointer, if one currently is available * (between SyncEvolution_Module_CreateContext() and * SyncEvolution_Module_DeleteContext()) */ virtual SDKInterface *getSynthesisAPI() const; /** * change the Synthesis API that is used by the source */ void pushSynthesisAPI(sysync::SDK_InterfaceType *synthesisAPI); /** * remove latest Synthesis API and return to previous one (if any) */ void popSynthesisAPI(); /** * If called while a sync session runs (i.e. after m_startDataRead * (aka beginSync()) and before m_endDataWrite (aka endSync())), * the engine will finish the session and then immediately try to * run another session where any source in which requestAnotherSync() * was called is active again. There is no guarantee that this * will be possible. * * The source must be prepared to correctly handle another sync * session. m_endDataWrite will be called and then the sequence * of calls starts again at m_startDataRead. * * The sync mode will switch to an incremental sync in the same * direction as the initial sync (one-way to client or server, * two-way). * * Does nothing when called at the wrong time. There's no * guarantee either that restarting is possible. * * Currently only supported when a single source is active in * the initial sync. */ void requestAnotherSync(); /** * factory function for a SyncSource that provides the * source type specified in the params.m_nodes.m_configNode * * @param error throw a runtime error describing what the problem is if no matching source is found * @param config optional, needed for intantiating virtual sources * @return valid instance, NULL if no source can handle the given type (only when error==false) */ static SyncSource *createSource(const SyncSourceParams ¶ms, bool error = true, SyncConfig *config = NULL); /** * Factory function for a SyncSource with the given name * and handling the kind of data specified by "type" (e.g. * "Evolution Contacts:text/x-vcard"). * * The source is instantiated with dummy configuration nodes under * the pseudo server name "testing". This function is used for * testing sync sources, not for real syncs. If the prefix is set, * then __1 is used as database, just as in the * Client::Sync and Client::Source tests. Otherwise the default * database is used. * * @param error throw a runtime error describing what the problem is if no matching source is found * @return NULL if no source can handle the given type */ static SyncSource *createTestingSource(const string &name, const string &type, bool error, const char *prefix = getenv("CLIENT_TEST_EVOLUTION_PREFIX")); /** * Some information about available backends. * Multiple lines, formatted for users of the * command line. */ static string backendsInfo(); /** * Debug information about backends. */ static string backendsDebug(); /** * Mime type a backend communicates with the remote peer by default, * this is used to alert the remote peer in SAN during server alerted sync. */ virtual std::string getPeerMimeType() const =0; /* implementation of SyncSourceBase */ virtual std::string getName() const { return SyncSourceConfig::getName(); } virtual std::string getDisplayName() const { return m_name.c_str(); } virtual void setDisplayName(const std::string &name) { m_name = name; } virtual long getNumDeleted() const { return m_numDeleted; } virtual void setNumDeleted(long num) { m_numDeleted = num; } virtual void incrementNumDeleted() { m_numDeleted++; } virtual bool needChanges() { return m_needChanges; } void setNeedChanges(bool needChanges) { m_needChanges = needChanges; } /** * Set to true in SyncContext::initSAN() when a SyncML server has * to force a client into slow sync mode. This is necessary because * the server cannot request that mode (missing in the standard). * Forcing the slow sync mode is done via a FORCESLOWSYNC() macro * call in an . */ void setForceSlowSync(bool forceSlowSync) { m_forceSlowSync = forceSlowSync; } bool getForceSlowSync() const { return m_forceSlowSync; } protected: Operations m_operations; private: /** * Counter for items deleted in the source. Has to be incremented * by RemoveAllItems() and DeleteItem(). This counter is used to * update the Synthesis engine counter in those cases where the * engine does not (refresh from server) or cannot * (RemoveAllItems()) count the removals itself. */ long m_numDeleted; /** * Counter for InsertItem operations. Updated by hooking into the operation. */ int32_t m_added, m_updated, m_deleted; bool m_forceSlowSync; /** * Interface pointer for this sync source, allocated for us by the * Synthesis engine and registered here by * SyncEvolution_Module_CreateContext(). Only valid until * SyncEvolution_Module_DeleteContext(), in other words, while * the engine is running. */ std::vector m_synthesisAPI; /** database in use after open(), to be set via setDatabase() by derived class */ Database m_database; /** actual name of the source */ std::string m_name; /** change tracking enabled? */ bool m_needChanges; }; /** * A SyncSource with no pure virtual functions. */ class DummySyncSource : public SyncSource { public: DummySyncSource(const SyncSourceParams ¶ms) : SyncSource(params) {} DummySyncSource(const std::string &name, const std::string &contextName) : SyncSource(SyncSourceParams(name, SyncSourceNodes(), boost::shared_ptr(), contextName)) {} virtual Databases getDatabases() { return Databases(); } virtual void open() {} virtual void close() {} virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) {} virtual void enableServerMode() {} virtual bool serverModeEnabled() const { return false; } virtual std::string getPeerMimeType() const {return "";} }; /** * A special source which combines one or more real sources. * Most of the special handling for that is in SyncContext.cpp. * * This class can be instantiated, opened and closed if and only if * the underlying sources also support that. */ class VirtualSyncSource : public DummySyncSource { std::vector< boost::shared_ptr > m_sources; bool isEmpty(); public: /** * @param config optional: when given, the constructor will instantiate the * referenced underlying sources and check them in open() */ VirtualSyncSource(const SyncSourceParams ¶ms, SyncConfig *config = NULL); /** opens underlying sources and checks config by calling getDataTypeSupport() */ virtual void open(); virtual void close(); /** * returns array with source names that are referenced by this * virtual source */ std::vector getMappedSources(); /** * returns statements for XML config, * throws error if not configured correctly */ std::string getDataTypeSupport(); using SyncSourceBase::getDataTypeSupport; /* * If any of the sub datasource has no databases associated, return an empty * database list to indicate a possibly error condition; otherwise return a * dummy database to identify "calendar+todo" combined datasource. **/ virtual Databases getDatabases(); }; /** * Hooks up the Synthesis DB Interface start sync (BeginDataRead) and * end sync (EndDataWrite) calls with virtual methods. Ensures that * sleepSinceModification() is called. * * Inherit from this class in your sync source and call the init() * method to use it. */ class SyncSourceSession : virtual public SyncSourceBase { public: /** * called before Synthesis engine starts to ask for changes and item data * * If SynthesisInfo::m_earlyStartDataRead is true, then this call is * invoked before the first message exchange with a peer and it * may throw a STATUS_SLOW_SYNC_508 StatusException if an * incremental sync is not possible. In that case, preparations * for a slow sync must have completed successfully inside the * beginSync() call. It is not going to get called again. * * If SynthesisInfo::m_earlyStartDataRead is false (the default), * then this is called only if the peer was reachable and accepted * the credentials. This mode of operation is preferred if a fallback * to slow sync is not needed, because it allows deferring expensive * operations until really needed. For example, the engine does * database dumps at the time when StartDataRead is called. * * See StartDataRead for details. * * @param lastToken identifies the last completed sync * @param resumeToken identifies a more recent sync which needs to be resumed; * if not empty, then report changes made after that sync * instead of the last completed sync */ virtual void beginSync(const std::string &lastToken, const std::string &resumeToken) = 0; /** * called after completing or suspending the current sync * * See EndDataWrite for details. * * @return a token identifying this sync session for a future beginSync() */ virtual std::string endSync(bool success) = 0; /** set Synthesis DB Interface operations */ void init(SyncSource::Operations &ops); private: sysync::TSyError startDataRead(const char *lastToken, const char *resumeToken); sysync::TSyError endDataWrite(bool success, char **newToken); }; /** * Implements the Synthesis DB Interface for reporting item changes * (ReadNextItemAsKey) *without* actually delivering the item data. */ class SyncSourceChanges : virtual public SyncSourceBase { public: SyncSourceChanges(); enum State { ANY, NEW, UPDATED, DELETED, MAX }; /** * Add the LUID of a NEW/UPDATED/DELETED item. * If unspecified, the luid is added to the list of * all items. This must be done *in addition* to adding * the luid with a specific state. * * For example, the luid of an updated item should be added with * addItem(luid [, ANY]) and again with addItem(luid, DELETED). * * The Synthesis engine does not need the list of deleted items * and does not distinguish between added and updated items, so * for syncing, adding DELETED items is optional and all items * which are different from the last sync can be added as * UPDATED. The client-test program expects that the informationb * is provided precisely. * * @return true if the luid was already listed */ bool addItem(const string &luid, State state = ANY); /** * Wipe out all added items, returning true if any were found. */ bool reset(); typedef std::set Items_t; const Items_t &getItems(State state) { return m_items[state]; } const Items_t &getAllItems() const { return m_items[ANY]; } const Items_t &getNewItems() const { return m_items[NEW]; } const Items_t &getUpdatedItems() const { return m_items[UPDATED]; } const Items_t &getDeletedItems() const { return m_items[DELETED]; } /** set Synthesis DB Interface operations */ void init(SyncSource::Operations &ops); private: Items_t m_items[MAX]; bool m_first; Items_t::const_iterator m_it; sysync::TSyError iterate(sysync::ItemID aID, sysync::sInt32 *aStatus, bool aFirst); }; /** * Implements the Synthesis DB Interface for deleting an item * (DeleteItem). Increments number of deleted items in * SyncSourceBase. */ class SyncSourceDelete : virtual public SyncSourceBase { public: virtual void deleteItem(const string &luid) = 0; /** set Synthesis DB Interface operations */ void init(SyncSource::Operations &ops); private: sysync::TSyError deleteItemSynthesis(sysync::cItemID aID); }; enum InsertItemResultState { /** * Operation not complete, invoke callback in ItemResult to check * for progress. */ ITEM_AGAIN, /** * item added or updated as requested */ ITEM_OKAY, /** * When a backend is asked to add an item and recognizes * that the item matches an already existing item, it may * replace that item instead of creating a duplicate. In this * case it must return ITEM_REPLACED and set the luid/revision * of that updated item. * * This can happen when such an item was added concurrently to * the running sync or, more likely, was reported as new by * the backend and the engine failed to find the match because * it doesn't know about some special semantic, like iCalendar * 2.0 UID). * * Note that depending on the age of the items, the older data * will replace the more recent one when always using item * replacement. */ ITEM_REPLACED, /** * Same as ITEM_REPLACED, except that the backend did some * modifications to the data that was sent to it before * storing it, like merging it with the existing item. The * engine will treat the updated item as modified and send * back the update to the peer as soon as possible. In server * mode that will be in the same sync session, in a client in * the next session (client cannot send changes after having * received data from the server). */ ITEM_MERGED, /** * As before, a match against an existing item was detected. * By returning this state and the luid of the matched item * (revision not needed) the engine is instructed to do the * necessary data comparison and merging itself. Useful when a * backend can't do the necessary merging itself. */ ITEM_NEEDS_MERGE }; /** * an interface for reading and writing items in the internal * format; see SyncSourceSerialize for an explanation */ class SyncSourceRaw : virtual public SyncSourceBase { public: class InsertItemResult { public: InsertItemResult() : m_state(ITEM_OKAY) {} /** * @param luid the LUID after the operation; during an update the LUID must * not be changed, so return the original one here * @param revision the revision string after the operation; leave empty if not used * @param state report about what was done with the data */ InsertItemResult(const string &luid, const string &revision, InsertItemResultState state) : m_luid(luid), m_revision(revision), m_state(state) {} /** * Constructor for the case where the final result is not available yet. * * @param check will be called again later to poll for completion */ InsertItemResult(const boost::function &check) : m_state(ITEM_AGAIN), m_continue(check) {} string m_luid; string m_revision; InsertItemResultState m_state; typedef ContinueOperation Continue_t; Continue_t m_continue; }; /** same as SyncSourceSerialize::insertItem(), but with internal format */ virtual InsertItemResult insertItemRaw(const std::string &luid, const std::string &item) = 0; /** same as SyncSourceSerialize::readItem(), but with internal format */ virtual void readItemRaw(const std::string &luid, std::string &item) = 0; }; /** * Implements the Synthesis DB Interface for importing/exporting item * data (ReadItemAsKey, InsertItemAsKey, UpdateItemAsKey) in such a * way that the sync source only has to deal with a text * representation of an item. * * There may be two such representations: * - "engine format" is the one exchanged with the Synthesis engine * - "internal or raw format" is a format that might better capture * the internal representation and can be used for backup/restore * and testing * * To give an example, the EvolutionMemoSource uses plain text as * engine format and iCalendar 2.0 as raw format. * * The BackupData_t and RestoreData_t operations are implemented by * this class using the internal format. * * The engine format must be something that the Synthesis engine can * parse and generate, in other words, there must be a corresponding * profile in the XML configuration. This class uses information * provided by the sync source (mime type and version) and from the * configuration (format selected by user) to generate the required * XML configuration parts for common configurations (vCard, * vCalendar, iCalendar, text). Special representations can be added * to the global XML configuration by overriding default * implementations provided in this class. * * InsertItemAsKey and UpdateItemAsKey are mapped to the same * insertItem() call because in practice it can happen that a request * to add an item must be turned into an update. For example, a * meeting was imported both into the server and the client. A request * to add the item again should be treated as an update, based on the * unique iCalendar 2.0 LUID. */ class SyncSourceSerialize : virtual public SyncSourceBase, virtual public SyncSourceRaw { public: /** * Returns the preferred mime type of the items handled by the sync source. * Example: "text/x-vcard" */ virtual std::string getMimeType() const = 0; /** * Returns the version of the mime type used by client. * Example: "2.1" */ virtual std::string getMimeVersion() const = 0; /** * returns the backend selection and configuration */ virtual InitState getSourceType() const = 0; /** * Create or modify an item. * * The sync source should be flexible: if the LUID is non-empty, it * shall modify the item referenced by the LUID. If the LUID is * empty, the normal operation is to add it. But if the item * already exists (e.g., a calendar event which was imported * by the user manually), then the existing item should be * updated also in the second case. * * Passing a LUID of an item which does not exist is an error. * This error should be reported instead of covering it up by * (re)creating the item. * * Errors are signaled by throwing an exception. Returning empty * strings in the result is an error which triggers an "item could * not be stored" error. * * @param luid identifies the item to be modified, empty for creating * @param item contains the new content of the item, using the engine format * @return the result of inserting the item */ virtual InsertItemResult insertItem(const std::string &luid, const std::string &item) = 0; /** * Return item data in engine format. * * @param luid identifies the item * @retval item item data */ virtual void readItem(const std::string &luid, std::string &item) = 0; /* implement SyncSourceRaw under the assumption that the internal and engine format are identical */ virtual InsertItemResult insertItemRaw(const std::string &luid, const std::string &item); virtual void readItemRaw(const std::string &luid, std::string &item); /** set Synthesis DB Interface operations */ void init(SyncSource::Operations &ops); protected: /** * used getMimeType(), getMimeVersion() and getSourceType() * to provide the information necessary for automatic * conversion to the sync source's internal item representation */ virtual void getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments); private: sysync::TSyError readItemAsKey(sysync::cItemID aID, sysync::KeyH aItemKey); SyncSource::Operations::InsertItemAsKeyResult_t insertItemAsKey(sysync::KeyH aItemKey, sysync::ItemID newID); SyncSource::Operations::UpdateItemAsKeyResult_t updateItemAsKey(sysync::KeyH aItemKey, sysync::cItemID aID, sysync::ItemID newID); sysync::TSyError insertContinue(sysync::ItemID newID, const InsertItemResult::Continue_t &cont); }; /** * Mapping from Hash() value to file. * Used by SyncSourceRevisions, but may be of use for * other backup implementations. */ class ItemCache { public: #ifdef USE_SHA256 typedef std::string Hash_t; Hash_t hashFunc(const std::string &data) { return SHA_256(data); } #else typedef unsigned long Hash_t; Hash_t hashFunc(const std::string &data) { return Hash(data); } #endif typedef unsigned long Counter_t; /** mark the algorithm used for the hash via different suffices */ static const char *m_hashSuffix; /** * Collect information about stored hashes. Provides * access to file name via hash. * * If no hashes were written (as in an old SyncEvoltion * version), we could read the files to recreate the * hashes. This is not done because it won't occur * often enough. * * Hashes are also not verified. Users should better * not edit them or file contents... * * @param oldBackup existing backup to read; may be empty * @param newBackup new backup to be created * @param legacy legacy mode includes a bug * which cannot be fixed without breaking on-disk format */ void init(const SyncSource::Operations::ConstBackupInfo &oldBackup, const SyncSource::Operations::BackupInfo &newBackup, bool legacy); /** * create file name for a specific hash, empty if no such hash */ string getFilename(Hash_t hash); /** * add a new item, reusing old one if possible * * @param item new item data * @param uid its unique ID * @param rev revision string */ void backupItem(const std::string &item, const std::string &uid, const std::string &rev); /** to be called after init() and all backupItem() calls */ void finalize(BackupReport &report); /** can be used to restart creating the backup after an intermediate failure */ void reset(); private: typedef std::map Map_t; Map_t m_hash2counter; string m_dirname; SyncSource::Operations::BackupInfo m_backup; bool m_legacy; unsigned long m_counter; }; /** * Implements change tracking based on a "revision" string, a string * which is guaranteed to change automatically each time an item is * modified. Backup/restore is optionally implemented by this class if * pointers to SyncSourceRaw and SyncSourceDelete interfaces are * passed to init(). For backup only the former is needed, for restore * both. * * Potential implementations of the revision string are: * - a modification time stamp * - a hash value of a textual representation of the item * (beware, such a hash might change as the textual representation * changes even though the item is unchanged) * * Sync sources which want to use this functionality have to provide * the following functionality by implementing the pure virtual * functions below: * - enumerate all existing items * - provide LUID and the revision string * The LUID must remain *constant* when making changes to an item, * whereas the revision string must *change* each time the item is * changed by anyone. * Both can be arbitrary strings, but keeping them simple (printable * ASCII, no white spaces, no equal sign) makes debugging simpler * because they can be stored as they are as key/value pairs in the * sync source's change tracking config node (the .other.ini files when * using file-based configuration). More complex strings use escape * sequences introduced with an exclamation mark for unsafe characters. * * Most of the functionality of this class must be activated * explicitly as part of the life cycle of the sync source instance by * calling detectChanges(), updateRevision() and deleteRevision(). * * If the required interfaces are provided to init(), then backup/restore * operations are set. init() also hooks into the session life cycle * with an end callback that ensures that enough time passes at the end * of the sync. This is important for sync sources which use time stamps * as revision string. "enough time" is defined by a parameter to the * init call. */ class SyncSourceRevisions : virtual public SyncSourceChanges, virtual public SyncSourceBase { public: typedef map RevisionMap_t; /** * Fills the complete mapping from UID to revision string of all * currently existing items. * * Usually both UID and revision string must be non-empty. The * only exception is a refresh-from-client: in that case the * revision string may be empty. The implementor of this call * cannot know whether empty strings are allowed, therefore it * should not throw errors when it cannot create a non-empty * string. The caller of this method will detect situations where * a non-empty string is necessary and none was provided. * * An source must set the revision string for all items or * none at all. * * This call is typically only invoked only once during the * lifetime of a source, at the time when detectChanges() needs * the information. The result returned in that invocation is * used throught the session. * * When detectChanges() is called with CHANGES_NONE, listAllItems() * is avoided. Instead the cached information is used. Sources * may need to know that information, so in this case setAllItems() * is called as part of detectChanges(). */ virtual void listAllItems(RevisionMap_t &revisions) = 0; /** * Called by SyncSourceRevisions::detectChanges() to tell * the derived class about the cached information if (and only * if) listAllItems() and updateAllItems() were not called. The derived class * might not need this information, so the default implementation * simply ignores. * * A more complex API could have been defined to only prepare the * information when needed, but that seemed unnecessarily complex. */ virtual void setAllItems(const RevisionMap_t &revisions) {} /** * updates the revision map to reflect the current state * * May be called instead of listAllItems() if the caller has * a valid list to start from. If the implementor * cannot update the list, it must start from scratch by * reseting the list and calling listAllItems(). The default * implementation of this method does that. */ virtual void updateAllItems(SyncSourceRevisions::RevisionMap_t &revisions) { revisions.clear(); listAllItems(revisions); } /** * Tells detectChanges() how to do its job. */ enum ChangeMode { /** * Call listAllItems() and use the list of previous items * to calculate changes. */ CHANGES_FULL, /** * Don't rely on previous information. Will call * listAllItems() and generate a full list of items based on * the result. */ CHANGES_SLOW, /** * Caller has already determined that a) no items have changed * and that b) the list of previous items is valid. For example, * some backends have a way of getting a revision string for * the whole database and can compare that against the value * from the end of the previous sync. * * In this mode, listAllItems() doesn't have to be called. * A list of all items will be created, with no items marked * as added/updated/deleted. */ CHANGES_NONE }; /** * calculate changes, call when sync source is ready for * listAllItems() and before changes are needed * * The trackingNode must be provided by the caller. It will * be updated by each of the calls and must be stored by * the caller. * * @param trackingNode a config node for exclusive use by this class * @param mode determines how changes are detected; if unsure, * use CHANGES_FULL, which will always produce * the required information, albeit more slowly * than the other modes * @return true if change detection could only provide a list of currently * existing items, but not the list of added/updated/deleted items */ bool detectChanges(ConfigNode &trackingNode, ChangeMode mode); /** * record that an item was added or updated * * @param old_luid empty for add, old LUID otherwise * @param new_luid normally LUIDs must not change, but this call allows it * @param revision revision string after change */ void updateRevision(ConfigNode &trackingNode, const std::string &old_luid, const std::string &new_luid, const std::string &revision); /** * record that we deleted an item * * @param luid the obsolete LUID */ void deleteRevision(ConfigNode &trackingNode, const std::string &luid); /** * set Synthesis DB Interface and backup/restore operations * @param raw needed for backups; if NULL, no backups are made * @param del needed for restores; if NULL, only backups are possible * @param granularity time that has to pass between making a modification * and checking for changes; this class ensures that * at least this amount of time has passed before letting * the session terminate. Delays in different source do * not add up. */ void init(SyncSourceRaw *raw, SyncSourceDelete *del, int granularity, SyncSource::Operations &ops); private: SyncSourceRaw *m_raw; SyncSourceDelete *m_del; int m_revisionAccuracySeconds; /** buffers the result of the initial listAllItems() call */ RevisionMap_t m_revisions; bool m_revisionsSet; bool m_firstCycle; void initRevisions(); /** * Dump all data from source unmodified into the given directory. * The ConfigNode can be used to store meta information needed for * restoring that state. Both directory and node are empty. */ void backupData(const SyncSource::Operations::ConstBackupInfo &oldBackup, const SyncSource::Operations::BackupInfo &newBackup, BackupReport &report); /** * Restore database from data stored in backupData(). Will be * called inside open()/close() pair. beginSync() is *not* called. */ void restoreData(const SyncSource::Operations::ConstBackupInfo &oldBackup, bool dryrun, SyncSourceReport &report); /** * Increments the time stamp of the latest database modification, * called automatically whenever revisions change. */ void databaseModified(); /** time stamp of latest database modification, for sleepSinceModification() */ Timespec m_modTimeStamp; SyncMLStatus sleepSinceModification(); }; /** * Common logging for sync sources. * * This class wraps the Synthesis DB functors that were set before * calling its init() method. The wrappers then log a single line * describing what is happening (adding/updating/removing) * to which item (with a short item specific description extracted * from the incoming item data or the backend). */ class SyncSourceLogging : public virtual SyncSourceBase { public: /** * wrap Synthesis DB Interface operations * * @param fields list of fields to read in getDescription() * @param sep separator between non-empty fields */ void init(const std::list &fields, const std::string &sep, SyncSource::Operations &ops); /** * Extract short description from Synthesis item data. * The default implementation reads a list of fields * as strings and concatenates the non-empty ones * with a separator. * * @param aItemKey key for reading fields * @return description, empty string will cause the ID of the item to be printed */ virtual std::string getDescription(sysync::KeyH aItemKey); /** * Extract short description from backend. * Necessary for deleted items. The default implementation * returns an empty string, so that implementing this * is optional. * * @param luid LUID of the item to be deleted in the backend * @return description, empty string will cause the ID of the item to be printed */ virtual std::string getDescription(const string &luid); private: std::list m_fields; std::string m_sep; SyncMLStatus insertItemAsKey(sysync::KeyH aItemKey, sysync::ItemID newID); SyncMLStatus updateItemAsKey(sysync::KeyH aItemKey, sysync::cItemID aID, sysync::ItemID newID); SyncMLStatus deleteItem(sysync::cItemID aID); }; /** * Implements Load/SaveAdminData and MapItem handling in a SyncML * server. Uses a single property for the admin data in the "internal" * node and a complete node for the map items. */ class SyncSourceAdmin : public virtual SyncSourceBase { boost::shared_ptr m_configNode; std::string m_adminPropertyName; boost::shared_ptr m_mappingNode; bool m_mappingLoaded; ConfigProps m_mapping; ConfigProps::const_iterator m_mappingIterator; sysync::TSyError loadAdminData(const char *aLocDB, const char *aRemDB, char **adminData); sysync::TSyError saveAdminData(const char *adminData); bool readNextMapItem(sysync::MapID mID, bool aFirst); sysync::TSyError insertMapItem(sysync::cMapID mID); sysync::TSyError updateMapItem(sysync::cMapID mID); sysync::TSyError deleteMapItem(sysync::cMapID mID); SyncMLStatus flush(); void resetMap(); void mapid2entry(sysync::cMapID mID, string &key, string &value); void entry2mapid(const string &key, const string &value, sysync::MapID mID); public: /** flexible initialization */ void init(SyncSource::Operations &ops, const boost::shared_ptr &config, const std::string adminPropertyName, const boost::shared_ptr &mapping); /** * simpler initialization, using the default placement of data * inside the SyncSourceConfig base class */ void init(SyncSource::Operations &ops, SyncSource *source); }; /** * Implements Read/Write/DeleteBlob. Blobs are stored inside a * configurable directory, which has to be unique for the current * peer. */ class SyncSourceBlob : public virtual SyncSourceBase { /** * Only one blob is active at a time. * This utility class provides the actual implementation. */ sysync::TBlob m_blob; sysync::TSyError readBlob(sysync::cItemID aID, const char *aBlobID, void **aBlkPtr, size_t *aBlkSize, size_t *aTotSize, bool aFirst, bool *aLast) { // Translate between sysync::memSize and size_t, which // is different on s390 (or at least the compiler complains...). sysync::memSize blksize = aBlkSize ? static_cast(*aBlkSize) : 0, totsize = aTotSize ? static_cast(*aTotSize) : 0; sysync::TSyError err = m_blob.ReadBlob(aID, aBlobID, aBlkPtr, &blksize, &totsize, aFirst, aLast); if (aBlkSize) { *aBlkSize = blksize; } if (aTotSize) { *aTotSize = totsize; } return err; } sysync::TSyError writeBlob(sysync::cItemID aID, const char *aBlobID, void *aBlkPtr, size_t aBlkSize, size_t aTotSize, bool aFirst, bool aLast) { mkdir_p(m_blob.getBlobPath()); return m_blob.WriteBlob(aID, aBlobID, aBlkPtr, aBlkSize, aTotSize, aFirst, aLast); } sysync::TSyError deleteBlob(sysync::cItemID aID, const char *aBlobID) { return m_blob.DeleteBlob(aID, aBlobID); } sysync::TSyError loadAdminData(sysync::cItemID aID, const char *aBlobID, void **aBlkPtr, size_t *aBlkSize, size_t *aTotSize, bool aFirst, bool *aLast); public: void init(SyncSource::Operations &ops, const std::string &dir); }; /** * This is an interface definition that is expected by the client-test * program. Part of the reason for this requirement is that the test * program was originally written for the Funambol SyncSource API. * The other reason is that the testing is based on importing/exporting * items in the internal format of the sync source, which has to be * text based or even MIMEDIR based (for tests involving synccompare). */ class TestingSyncSource : public SyncSource, virtual public SyncSourceSession, virtual public SyncSourceChanges, virtual public SyncSourceDelete, virtual public SyncSourceSerialize { public: TestingSyncSource(const SyncSourceParams ¶ms) : SyncSource(params) { SyncSourceSession::init(m_operations); SyncSourceChanges::init(m_operations); SyncSourceDelete::init(m_operations); SyncSourceSerialize::init(m_operations); } ~TestingSyncSource() {} virtual InitState getSourceType() const { return SyncSourceConfig::getSourceType(); } virtual void removeAllItems(); }; SE_END_CXX #endif // INCL_SYNCSOURCE syncevolution-1.5/src/syncevo/IdentityProvider.h0000664000373300001540000001317012405555067023465 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNC_EVOLUTION_IDENTITY_PROVIDER # define INCL_SYNC_EVOLUTION_IDENTITY_PROVIDER #include #include #include SE_BEGIN_CXX extern const char USER_IDENTITY_PLAIN_TEXT[]; extern const char USER_IDENTITY_SYNC_CONFIG[]; struct UserIdentity; // from SyncConfig.h struct Credentials { std::string m_username; std::string m_password; }; /** * Returns username/password for an identity. The password is the * string configured for it inside SyncEvolution. It may be empty and/or unset if * the plain text password comes from the identity provider. * * If the credentials cannot be retrieved, an error is thrown, so don't use this * in cases where a different authentication method might also work. */ Credentials IdentityProviderCredentials(const UserIdentity &identity, const InitStateString &password); /** * Supports multiple different ways of authorizing the user. * Actual implementations are IdentityProvider specific. */ class AuthProvider { public: /** * Creates an AuthProvider matching the identity.m_provider value * or throws an exception if that fails. Never returns NULL. */ static boost::shared_ptr create(const UserIdentity &identity, const InitStateString &password); enum AuthMethod { AUTH_METHOD_NONE, AUTH_METHOD_CREDENTIALS, AUTH_METHOD_OAUTH2, AUTH_METHOD_MAX }; /** * Return true if some kind of credentials were configured by the user. * They don't have to be usable. */ virtual bool wasConfigured() const { return true; } /** * Returns true if the given method is supported and currently possible. */ virtual bool methodIsSupported(AuthMethod method) const = 0; /** * Returns username/password credentials. Throws an error if not supported. */ virtual Credentials getCredentials() const = 0; /** * Returns the 'Bearer b64token' string required for logging into * services supporting OAuth2 or throws an exception when we don't * have a valid token. Internally this will refresh tokens * automatically. * * See http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-20#section-2.1 * * An application should: * - request a token and try to use it * - in case of failure try to request a token again, and try to use it * again (in case the first token has expired just before using it) * - if the second token also fails, request a third token with full * re-authentication as above. * - if that fails, then give up. * * To achieve that, the caller must count how often he got a token that * did not work. * * @param failedTokens zero when asking for initial token, one for refresh, two for full re-authorization * @param passwordUpdateCallback callback function to be called when stored refresh token need to be updated. * Only parameter of this callback function is new value of refresh token. * * @return a base64 encoded token, ready to be used in "Authorization: Bearer %s" */ typedef boost::function PasswordUpdateCallback; virtual std::string getOAuth2Bearer(int failedTokens, const PasswordUpdateCallback &passwordUpdateCallback) const = 0; /** * Returns username at the remote service. Works for * username/password credentials and may be made to work for * OAuth2. At the moment, code should not depend on it when using * OAuth2. */ virtual std::string getUsername() const = 0; }; /** * Instantiating this class adds a new provider. * Deleting it removes it. */ class IdentityProvider { public: /** returns NULL if disabled, valid AuthProvider if possible, and throws error if something goes wrong */ virtual boost::shared_ptr create(const InitStateString &username, const InitStateString &password) = 0; /** * All known providers. */ static std::list &getRegistry(); /** * @param key short, unique word without colons used to select this provider * in an identity string, for example "gsso" * @param descr one or more lines describing the provider and its syntax, * for example * "gsso:\n" * " authentication using libgsignond + libaccounts\n" */ IdentityProvider(const std::string &key, const std::string &descr); virtual ~IdentityProvider(); const std::string m_key; const std::string m_descr; }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/GuardFD.h0000644000373300001540000000305212326412403021415 0ustar00nightlynightly00000000000000/* * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVOLUTION_GUARD_FD # define INCL_SYNCEVOLUTION_GUARD_FD #include #include /** * Takes over ownership of a file descriptor and ensures that close() * is called on it. * * To copy it around, use a smart pointer pointing to a GuardFD. * * Examples: * GuardFD fd(open("foo", O_RDONLY)); * write(fd, ...); * return; */ class GuardFD : private boost::noncopyable { int m_fd; public: GuardFD(int fd) : m_fd(fd) {} ~GuardFD() throw () { if (m_fd >= 0) close(m_fd); } operator int () const { return m_fd; } int get() const { return m_fd; } int release() { int fd = m_fd; m_fd = -1; return fd; } void reset(int fd = -1) { if (m_fd >= 0) close(m_fd); m_fd = fd; } }; #endif // INCL_SYNCEVOLUTION_GUARD_FD syncevolution-1.5/src/syncevo/util.h0000664000373300001540000004551112363142310021124 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVOLUTION_UTIL # define INCL_SYNCEVOLUTION_UTIL #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // definitions used to be included in util.h, // include it to avoid changing code using the time things #include // same for Exception and SE_THROW* #include SE_BEGIN_CXX /** case-insensitive less than for assoziative containers */ template class Nocase : public std::binary_function { public: bool operator()(const T &x, const T &y) const { return boost::ilexicographical_compare(x, y); } }; /** case-insensitive equals */ template class Iequals : public std::binary_function { public: bool operator()(const T &x, const T &y) const { return boost::iequals(x, y); } }; /** shorthand, primarily useful for BOOST_FOREACH macro */ typedef std::pair StringPair; typedef std::map StringMap; /** * remove multiple slashes in a row and dots directly after a slash if not followed by filename, * remove trailing / */ std::string normalizePath(const std::string &path); /** * Returns last component of path. Trailing slash is ignored. * Empty if path is empty. */ std::string getBasename(const std::string &path); /** * Returns path without the last component. Empty if nothing left. */ std::string getDirname(const std::string &path); /** * Splits path into directory and file part. Trailing slashes * are stripped first. */ void splitPath(const std::string &path, std::string &dir, std::string &file); /** * convert relative path to canonicalized absolute path * @param path will be turned into absolute path if possible, otherwise left unchanged * @return true if conversion is successful, false otherwise(errno will be set) */ bool relToAbs(std::string &path); /** ensure that m_path is writable, otherwise throw error */ void mkdir_p(const std::string &path); inline bool rm_r_all(const std::string &path, bool isDir) { return true; } /** * remove a complete directory hierarchy; invoking on non-existant directory is okay * @param path relative or absolute path to be removed * @param filter an optional callback which determines whether an entry really is * to be deleted (return true in that case); called with full path * to entry and true if known to be a directory */ void rm_r(const std::string &path, boost::function filter = rm_r_all); /** * copy complete directory hierarchy * * If the source is a directory, then the target * also has to be a directory name. It will be * created if necessary. * * Alternatively, both names may refer to files. * In that case the directory which is going to * contain the target file must exist. * * @param from source directory or file * @param to target directory or file (must have same type as from) */ void cp_r(const std::string &from, const std::string &to); /** true if the path refers to a directory */ bool isDir(const std::string &path); /** * try to read a file into the given string, throw exception if fails * * @param filename absolute or relative file name * @retval content filled with file content * @return true if file could be read */ bool ReadFile(const std::string &filename, std::string &content); bool ReadFile(std::istream &in, std::string &content); enum ExecuteFlags { EXECUTE_NO_STDERR = 1<<0, /**< suppress stderr of command */ EXECUTE_NO_STDOUT = 1<<1 /**< suppress stdout of command */ }; /** * system() replacement * * If called without output redirection active (see LogRedirect), * then it will simply call system(). If output redirection is * active, the command is executed in a forked process without * blocking the parent process and the parent reads the output, * passing it through LogRedirect for processing. * * This is necessary to capture all output reliably: LogRedirect * ensures that we don't deadlock, but to achieve that, it drops * data when the child prints too much of it. * * @param cmd command including parameters, without output redirection * @param flags see ExecuteFlags * @return same as in system(): use WEXITSTATUS() et.al. to decode it */ int Execute(const std::string &cmd, ExecuteFlags flags) throw(); /** * Simple string hash function, derived from Dan Bernstein's algorithm. */ unsigned long Hash(const char *str); unsigned long Hash(const std::string &str); /** * SHA-256 implementation, returning hash as lowercase hex string (like sha256sum). * Might not be available, in which case it raises an exception. */ std::string SHA_256(const std::string &in); /** * escape/unescape code * * Escaping is done URL-like, with a configurable escape * character. The exact set of characters to replace (besides the * special escape character) is configurable, too. * * The code used to be in SafeConfigNode, but is of general value. */ class StringEscape { public: enum Mode { SET, /**< explicit list of characters to be escaped */ INI_VALUE, /**< right hand side of .ini assignment: escape all spaces at start and end (but not in the middle) and the equal sign */ INI_WORD, /**< same as before, but keep it one word: escape all spaces and the equal sign = */ STRICT /**< general purpose: escape all characters besides alphanumeric and -_ */ }; private: char m_escapeChar; Mode m_mode; std::set m_forbidden; public: /** * default constructor, using % as escape character, escaping all spaces (including * leading and trailing ones), and all characters besides alphanumeric and -_ */ StringEscape(char escapeChar = '%', Mode mode = STRICT) : m_escapeChar(escapeChar), m_mode(mode) {} /** * @param escapeChar character used to introduce escape sequence * @param forbidden explicit list of characters which are to be escaped */ StringEscape(char escapeChar, const char *forbidden); /** special character which introduces two-char hex encoded original character */ char getEscapeChar() const { return m_escapeChar; } void setEscapeChar(char escapeChar) { m_escapeChar = escapeChar; } Mode getMode() const { return m_mode; } void setMode(Mode mode) { m_mode = mode; } /** * escape string according to current settings */ std::string escape(const std::string &str) const; /** escape string with the given settings */ static std::string escape(const std::string &str, char escapeChar, Mode mode); /** * unescape string, with escape character as currently set */ std::string unescape(const std::string &str) const { return unescape(str, m_escapeChar); } /** * unescape string, with escape character as given */ static std::string unescape(const std::string &str, char escapeChar); }; /** * This is a simplified implementation of a class representing and calculating * UUIDs v4 inspired from RFC 4122. We do not use cryptographic pseudo-random * numbers, instead we rely on rand/srand. * * We initialize the random generation with the system time given by time(), but * only once. * * Instantiating this class will generate a new unique UUID, available afterwards * in the base string class. */ class UUID : public std::string { public: UUID(); }; /** * Safety check for string pointer. * Returns pointer if valid, otherwise the default string. */ inline const char *NullPtrCheck(const char *ptr, const char *def = "(null)") { return ptr ? ptr : def; } /** * A C++ wrapper around readir() which provides the names of all * directory entries, excluding . and .. * * In contrast to the underlying readdir(), this class sorts * the result by name before granting access to it. */ class ReadDir { public: ReadDir(const std::string &path, bool throwError = true); typedef std::vector::const_iterator const_iterator; typedef std::vector::iterator iterator; iterator begin() { return m_entries.begin(); } iterator end() { return m_entries.end(); } const_iterator begin() const { return m_entries.begin(); } const_iterator end() const { return m_entries.end(); } /** * check whether directory contains entry, returns full path * @param caseInsensitive ignore case, pick first entry which matches randomly */ std::string find(const std::string &entry, bool caseSensitive); private: std::string m_path; std::vector m_entries; }; /** * Using this macro ensures that tests, even if defined in * object files which are not normally linked into the test * binary, are included in the test suite under the group * "SyncEvolution". * * Use it like this: * @verbatim #include "config.h" #ifdef ENABLE_UNIT_TESTS # include "test.h" class Foo : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(foo); CPPUNIT_TEST(testBar); CPPUNIT_TEST_SUITE_END(); public: void testBar(); }; # SYNCEVOLUTION_TEST_SUITE_REGISTRATION(classname) #endif @endverbatim */ #define SYNCEVOLUTION_TEST_SUITE_REGISTRATION( ATestFixtureType ) \ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ATestFixtureType, "SyncEvolution" ); \ extern "C" { int funambolAutoRegisterRegistry ## ATestFixtureType = 12345; } std::string StringPrintf(const char *format, ...) #ifdef __GNUC__ __attribute__((format(printf, 1, 2))) #endif ; std::string StringPrintfV(const char *format, va_list ap); /** * Turns a value of arbitrary type into a std::string, * using the << operator. */ template std::string ToString(const T &value) { std::stringstream s; s << value; return s.str(); } /** * strncpy() which inserts adds 0 byte */ char *Strncpy(char *dest, const char *src, size_t n); /** * sleep() with sub-second resolution. Might be interrupted by signals * or SuspendFlags abort/suspend requests before the time has elapsed. * * @return seconds not elapsed yet, 0 if not interrupted */ double Sleep(double seconds); /** * Acts like the underlying type. In addition ensures that plain types * are not left uninitialized. */ template class Init { public: Init(const T &val) : m_value(val) {} Init() : m_value(boost::value_initialized()) {} Init(const Init &other) : m_value(other.m_value) {} Init & operator = (const T &val) { m_value = val; return *this; } operator const T & () const { return m_value; } operator T & () { return m_value; } private: T m_value; }; /** * Version of InitState for scalar values (can't derive from them): * acts like the underlying type. In addition ensures that plain types * are not left uninitialized and tracks whether a value was every * assigned explicitly. */ template class InitStateBase { T m_value; protected: InitStateBase() : m_value(boost::value_initialized()) {} InitStateBase(const InitStateBase &other) : m_value(other.m_value) {} template InitStateBase(const V &val) : m_value(val) {} public: operator const T & () const { return m_value; } operator T & () { return m_value; } const T & get() const { return m_value; } T & get() { return m_value; } }; /** version of InitState for classes: can call methods directly */ template class InitStateBase : public T { protected: InitStateBase() {} template InitStateBase(const V &val) : T(val) {} InitStateBase(const InitStateBase &other) : T(other) {} public: const T & get() const { return *this; } T & get() { return *this; } }; template class InitState : public InitStateBase::value> { typedef InitStateBase::value> parent_type; bool m_wasSet; public: typedef T value_type; InitState() : m_wasSet(false) {} InitState(const InitState &other) : parent_type(other.get()), m_wasSet(other.m_wasSet) {} template InitState(const V &val, bool wasSet = false) : parent_type(val), m_wasSet(wasSet) {} InitState & operator = (const InitState &val) { this->get() = val; m_wasSet = val.m_wasSet; return *this; } template InitState & operator = (const V &val) { this->get() = val; m_wasSet = true; return *this; } /** * Only tracks modifications done through this class. * Modifications of the contained value after obtaining * direct access to it (for example, via get()) are not * noticed. */ bool wasSet() const { return m_wasSet; } }; /** * Retrieve value if found in map, otherwise the * default. wasSet() returns true only in the first case. */ template InitState GetWithDef(const C &map, const typename C::key_type &key, const typename C::mapped_type &def = boost::value_initialized()) { typename C::const_iterator it = map.find(key); if (it != map.end()) { return InitState(it->second, true); } else { return InitState(def, false); } } /** * a nop destructor which doesn't do anything, for boost::shared_ptr */ struct NopDestructor { template void operator () (T *) {} }; /** * Acts like a boolean, but in addition, can also tell whether the * value was explicitly set. Defaults to false for both. */ typedef InitState Bool; /** * Acts like a string, but in addition, can also tell whether the * value was explicitly set. */ typedef InitState InitStateString; /** * Version of InitState where the value can true, false, or a string. * Recognizes 0/1/false/true/no/yes case-insensitively as special * booleans, everything else is considered a string. */ class InitStateTri : public InitStateString { public: InitStateTri(const std::string &val, bool wasSet) : InitStateString(val, wasSet) {} InitStateTri() {} InitStateTri(const char *val) : InitStateString(val, false) {} InitStateTri(const InitStateTri &other) : InitStateString(other) {} InitStateTri(const InitStateString &other) : InitStateString(other) {} enum Value { VALUE_TRUE, VALUE_FALSE, VALUE_STRING }; // quick check for true/false, use get() for string case Value getValue() const; }; /** * replace ${} with environment variables, with * XDG_DATA_HOME, XDG_CACHE_HOME and XDG_CONFIG_HOME having their normal * defaults */ std::string SubstEnvironment(const std::string &str); /** getenv() with default value */ inline const char *getEnv(const char *var, const char *def) { const char *res = getenv(var); return res ? res : def; } inline std::string getHome() { return getEnv("HOME", "."); } /** * Parse a separator splitted set of strings src, the separator itself is * escaped by a backslash. Spaces around the separator is also stripped. * */ std::vector unescapeJoinedString (const std::string &src, char separator); /** * mapping from int flag to explanation */ struct Flag { int m_flag; const char *m_description; }; /** * turn flags into comma separated list of explanations * * @param flags bit mask * @param descr array with zero m_flag as end marker * @param sep used to join m_description strings */ std::string Flags2String(int flags, const Flag *descr, const std::string &sep = ", "); /** * Returns the path to the data directory. This is generally * /usr/share/syncevolution/ but can be overridden by setting the * SYNCEVOLUTION_DATA_DIR environment variable. * * @retval dataDir the path to the data directory */ std::string SyncEvolutionDataDir(); /** * Temporarily set env variable, restore old value on destruction. * Useful for unit tests which depend on the environment. */ class ScopedEnvChange { public: ScopedEnvChange(const std::string &var, const std::string &value); ~ScopedEnvChange(); private: std::string m_var, m_oldval; bool m_oldvalset; }; std::string getCurrentTime(); // GRunWhile(), GRunInMain(), GRunIsMain() depend on glib support, // which pretty much is a hard requirement of SyncEvolution these days. // Different implementations would be possible and the APIs do not depend // on glib types, therefore they are defined here. The glib implemention // is in GLibSupport.cpp. /** * Process events in the default context while the callback returns * true. * * This must be used instead of g_main_context_iterate() by code which * may get called in other threads. In that case the check is * transferred to the main thread which does the actual event * processing. g_main_context_iterate() would just block because we * register the main thread as permanent owner of the default context, * or would suffer from race conditions if we didn't. * * The main thread must also be running GRunWhile(). * * Exceptions in the check code are fatal and should be avoided. * * The check code will be called in the current thread once if checkFirst * is true, otherwise it will only be invoked in the main thread. Use that * latter mode for code which must run in the main thread. */ void GRunWhile(const boost::function &check, bool checkFirst = true); /** * Runs the action in the main thread once, then returns. Any * exception thrown by the action will be caught and rethrown in the * calling thread. */ void GRunInMain(const boost::function &action); /** * True iff the calling thread is handling the main event loop. Can * be used to avoid GRunInMain(). */ bool GRunIsMain(); SE_END_CXX #endif // INCL_SYNCEVOLUTION_UTIL syncevolution-1.5/src/syncevo/BoostHelper.h0000644000373300001540000001206612326412403022374 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * Including this header file allows to use boost::bind() with * a class member as first parameter and a boost::weak_ptr * as second parameter. * * When the functor is invoked, it will lock the instance * and only call the member if that succeeds. Otherwise it * will silently return to the caller. * * The member function must have "void" as return value. * * This behavior makes sense in particular with asynchronous method * calls where the result is only relevant while the caller still * exists. * * The code is inspired by * http://permalink.gmane.org/gmane.comp.lib.boost.user/70276 and was * adapted to the SyncEvolution namespace and coding style. In contrast * to that code, the shared_ptr is kept until the invoker gets freed. * Seems a bit safer that way. Instead of duplicating the ->* operator * in WeakPtrAdapter it uses the type of the member as template parameter * to cover all kinds of members. */ #ifndef INCL_SYNCEVOLUTION_BOOST_HELPER # define INCL_SYNCEVOLUTION_BOOST_HELPER #include #include #include SE_BEGIN_CXX template class WeakPtrInvoker { public: WeakPtrInvoker(const P &ptr, const M &member) : m_ptr(ptr), m_member(member) {} void operator()() const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(); } } template void operator()(A1 a1) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1); } } template void operator()(A1 a1, A2 a2) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2); } } template void operator()(A1 a1, A2 a2, A3 a3) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3); } } template void operator()(A1 a1, A2 a2, A3 a3, A4 a4) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3, a4); } } template void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3, a4, a5); } } template void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3, a4, a5, a6); } } template void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3, a4, a5, a6, a7); } } template void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3, a4, a5, a6, a7, a8); } } template void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) const { if (m_ptr) { (boost::get_pointer(m_ptr)->*m_member)(a1, a2, a3, a4, a5, a6, a7, a8, a9); } } private: P m_ptr; M m_member; }; template class WeakPtrAdapter { public: WeakPtrAdapter(const boost::shared_ptr &ptr) : m_ptr(ptr) {} template WeakPtrInvoker, M> operator->*(M member) const { return WeakPtrInvoker, M>(m_ptr, member); } private: boost::shared_ptr m_ptr; }; SE_END_CXX namespace boost { template SyncEvo::WeakPtrAdapter get_pointer(const boost::weak_ptr &ptr) { return SyncEvo::WeakPtrAdapter(ptr.lock()); } } #endif // INCL_SYNCEVOLUTION_BOOST_HELPER syncevolution-1.5/src/syncevo/SuspendFlags.h0000644000373300001540000001553712326412403022552 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SUSPENDFLAGS #define INCL_SUSPENDFLAGS #include #include #include #include #include #include #include SE_BEGIN_CXX /** * A singleton which is responsible for signal handling. Supports * "SIGINT = suspend sync" and "two quick successive SIGINT = abort" * semantic. SIGTERM is always aborting. * * Can be polled and in addition, flags state changes by writing to a * file descriptor for integration into an event loop. * * All methods are thread-safe. activate() and deactivate() need to * modify global process state and should only be used when it is safe * to do so. */ class SuspendFlags { public: /** SIGINT twice within this amount of seconds aborts the sync */ static const time_t ABORT_INTERVAL = 2; enum State { /** keep sync running */ NORMAL, /** suspend sync */ SUSPEND, /** abort sync */ ABORT, /** suspend sync request received again (only written to event FD, not returned by getState()) */ SUSPEND_AGAIN, /** abort sync request received again (only written to event FD, not returned by getState()) */ ABORT_AGAIN, ABORT_MAX }; /** access to singleton */ static SuspendFlags &getSuspendFlags(); /** * Current status. It is a combination of several indicators: * - state set via signals (cannot be reset) * - "suspend" while requested with suspend() (resets when no longer needed) * - "abort" while requested with aborted() (also resets) * * The overall state is the maximum (NORMAL < SUSPEND < ABORT). */ State getState() const; /** * Returns or-ed mask of all signals handled so far. * See activate(). */ uint32_t getReceivedSignals() const; /** * Checks for status changes and returns true iff status is ABORT. */ bool isAborted(); /** * Checks for status changes and returns true iff status is SUSPEND. */ bool isSuspended(); /** * Checks for status changes and returns true iff status is NORMAL. */ bool isNormal(); /** * Checks for status changes and throws a "aborting as requested by user" StatusException with * LOCERR_USERABORT as status code if the current state is not * NORMAL. In other words, suspend and abort are both * treated like an abort request. */ void checkForNormal(); /** * Users of this class can read a single char for each received * signal from this file descriptor. The char is the State that * was entered by that signal. This can be used to be notified * immediately about changes, without having to poll. * * -1 if not activated. */ int getEventFD() const { return m_receiverFD; } class Guard { public: virtual ~Guard() { getSuspendFlags().deactivate(); } }; /** * Allocate file descriptors, set signal handlers for the chosen * signals (SIGINT and SIGTERM by default). Once the returned * guard is freed, it will automatically deactivate signal * handling. * * Additional signals like SIGURG or SIGIO may also be used. It is * unlikely that any library used by SyncEvolution occupies these * signals for its own use. * * Only SIGINT and SIGTERM influence the overall State. All * received signals, including SIGINT and SIGTERM, are recorded * and can be retrieved via getReceivedSignals(). * * It is possible to call activate multiple times. All following * calls do nothing except creating a new reference to the same * guard. In particular they cannot add or remove handled * signals. */ boost::shared_ptr activate(uint32_t sigmask = (1< StateChanged_t; StateChanged_t m_stateChanged; /** * React to a SIGINT or SIGTERM. * * Installed as signal handler by activate() if no other signal * handler was set. May also be called by other signal handlers, * regardless whether activated or not. */ static void handleSignal(int sig); class StateBlocker {}; /** * Requests a state change to "suspend". The request * remains active and affects getState() until * the returned StateBlocker is destructed, i.e., * the last reference is dropped. * * A state change will be pushed into the pipe if it really * changed as part of taking the suspend lock. */ boost::shared_ptr suspend(); /** * Same as suspend(), except that it asks for an abort. */ boost::shared_ptr abort(); /** log level of the "aborting" messages */ Logger::Level getLevel() const; void setLevel(Logger::Level level); private: SuspendFlags(); ~SuspendFlags(); Logger::Level m_level; /** free file descriptors, restore signal handlers */ void deactivate(); /** state as observed by signal handler */ State m_state; /** or-ed bit mask of all received signals */ uint32_t m_receivedSignals; /** time is measured inside signal handler */ time_t m_lastSuspend; int m_senderFD, m_receiverFD; // For the sake of simplicity we only support signals in the 1-31 range. uint32_t m_activeSignals; struct sigaction m_oldSignalHandlers[32]; boost::weak_ptr m_guard; boost::weak_ptr m_suspendBlocker, m_abortBlocker; boost::shared_ptr block(boost::weak_ptr &blocker); }; SE_END_CXX #endif // INCL_SUSPENDFLAGS syncevolution-1.5/src/syncevo/SyncContext.h0000664000373300001540000006165012414474252022444 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTIONSYNCCLIENT #define INCL_EVOLUTIONSYNCCLIENT #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX class TransportAgent; class SourceList; class SyncSource; class SyncSourceEvent; /** * This is the main class inside SyncEvolution which * looks at the configuration, activates all enabled * sources and executes the synchronization. * * All interaction with the user (reporting progress, asking for * passwords, ...) is done via virtual methods. The default * implementation of those uses stdin/out. * */ class SyncContext : public SyncConfig { /** * the string used to request a config, * *not* the normalized config name itself; * for that use SyncConfig::getConfigName() */ const string m_server; bool m_doLogging; bool m_quiet; bool m_dryrun; enum SyncFreeze { SYNC_FREEZE_NONE, SYNC_FREEZE_RUNNING, SYNC_FREEZE_FROZEN } m_syncFreeze; static const char *SyncFreezeName(SyncFreeze syncFreeze); bool m_localSync; string m_localPeerContext; /**< context name (including @) if doing local sync */ string m_localClientRootPath; bool m_serverMode; bool m_serverAlerted; /**< sync was initiated by server (applies to client and server mode) */ bool m_configNeeded; std::string m_sessionID; SharedBuffer m_initialMessage; string m_initialMessageType; string m_syncDeviceID; FullProps m_configFilters; boost::shared_ptr m_agent; boost::shared_ptr m_userInterface; /** * a pointer to the active SourceList instance for this context if one exists */ SourceList *m_sourceListPtr; /** * a pointer to the active SyncContext instance if one exists; * set by sync() and/or SwapContext */ static SyncContext *m_activeContext; class SwapContext { SyncContext *m_oldContext; public: SwapContext(SyncContext *newContext) : m_oldContext(SyncContext::m_activeContext) { SyncContext::m_activeContext = newContext; } ~SwapContext() { SyncContext::m_activeContext = m_oldContext; } }; /** * Connection to the Synthesis engine. Always valid in a * constructed SyncContext. Use getEngine() to reference * it. */ SharedEngine m_engine; /** * Synthesis session handle. Only valid while sync is running. */ SharedSession m_session; /** Set to true in displaySourceProgress() when doSync() is expected to stop the sync early. */ bool m_quitSync; /** * installs session in SyncContext and removes it again * when going out of scope */ class SessionSentinel { SyncContext &m_client; public: SessionSentinel(SyncContext &client, SharedSession &session) : m_client(client) { m_client.m_session = session; } ~SessionSentinel() { m_client.m_session.reset(); } }; /* * The URL this SyncContext is actually using, since we may support multiple * urls in the configuration. * */ string m_usedSyncURL; /* True iff current sync session was triggered by us * (such as in server alerted sync). */ bool m_remoteInitiated; public: /** * Common initialization code which needs to be done once * at the start of main() in any application using SyncEvolution. * For example, initializes (if applicable) glib and EDS. * * @param appname static string, must remain valid, defines name of executable (see g_set_prgname()) */ static void initMain(const char *appname); /** * A signal invoked as part of initMain(). * Backends can connect to it to extend initMain(). */ typedef boost::signals2::signal InitMainSignal; static InitMainSignal &GetInitMainSignal(); /** * A signal invoked each time a source has gone through a sync cycle. */ typedef boost::signals2::signal SourceSyncedSignal; SourceSyncedSignal m_sourceSyncedSignal; /** * true if binary was compiled as stable release * (see gen-autotools.sh) */ static bool isStableRelease(); /** * override stable release mode (for testing purposes) */ static void setStableRelease(bool isStableRelease); /** * SyncContext using a volatile config * and no logging. */ SyncContext(); /** * Constructor for syncing with a SyncML peer. * * @param peer identifies the client or server config to be used * @param doLogging write additional log and datatbase files about the sync; * true for regular syncs, false for debugging */ SyncContext(const string &server, bool doLogging = false); /** * Constructor for client in a local sync. * * @param client identifies the client context to be used (@foobar) * @param server identifies the server peer (foo@bar) * @param rootPath use this directory as config directory for the * peer-specific files (located inside peer directory * of server config) * @param agent transport agent, ready for communication with server * @param doLogging write additional log and datatbase files about the sync */ SyncContext(const string &client, const string &server, const string &rootPath, const boost::shared_ptr &agent, bool doLogging = false); virtual ~SyncContext(); bool getQuiet() { return m_quiet; } void setQuiet(bool quiet) { m_quiet = quiet; } bool getDryRun() { return m_dryrun; } void setDryRun(bool dryrun) { m_dryrun = dryrun; } bool isLocalSync() const { return m_localSync; } bool isServerAlerted() const { return m_serverAlerted; } void setServerAlerted(bool serverAlerted) { m_serverAlerted = serverAlerted; } boost::shared_ptr getUserInterface() { return m_userInterface; } void setUserInterface(const boost::shared_ptr &userInterface) { m_userInterface = userInterface; } /** use config UI owned by caller, without reference counting */ void setUserInterface(UserInterface *userInterface) { m_userInterface = boost::shared_ptr(userInterface, NopDestructor()); } /** * In contrast to getUserInterface(), this call here never returns NULL. * If no UserInterface is currently set, then it returns * a reference to a dummy instance which doesn't do anything. */ UserInterface &getUserInterfaceNonNull(); /** * Running operations typically checks that a config really exists * on disk. Setting false disables the check. */ bool isConfigNeeded() const { return m_configNeeded; } void setConfigNeeded(bool configNeeded) { m_configNeeded = configNeeded; } /** * throws error if config is needed and not available * * @param operation a noun describing what is to be done next ("proceed with %s", operation) */ void checkConfig(const std::string &operation) const; /** * Sets configuration filters. Currently only used in local sync * to configure the sync client. */ void setConfigProps(const FullProps &props) { m_configFilters = props; } const FullProps &getConfigProps() const { return m_configFilters; } /** only for server: device ID of peer */ void setSyncDeviceID(const std::string &deviceID) { m_syncDeviceID = deviceID; } std::string getSyncDeviceID() const { return m_syncDeviceID; } /* * Use sendSAN as the first step is sync() if this is a server alerted sync. * Prepare the san package and send the SAN request to the peer. * Returns false if failed to get a valid client sync request * otherwise put the client sync request into m_initialMessage which will * be used to initalze the server via initServer(), then continue sync() to * start the real sync serssion. * @version indicates the SAN protocal version used (1.2 or 1.1/1.0) */ bool sendSAN(uint16_t version); /** * Initializes the session so that it runs as SyncML server once * sync() is called. For this to work the first client message * must be available already. * * @param sessionID session ID to be used by server * @param data content of initial message sent by the client * @param messageType content type set by the client */ void initServer(const std::string &sessionID, SharedBuffer data, const std::string &messageType); /** * Executes the sync, throws an exception in case of failure. * Handles automatic backups and report generation. * * @retval complete sync report, skipped if NULL * @return overall sync status, for individual sources see report */ SyncMLStatus sync(SyncReport *report = NULL); /** result of analyzeSyncMLMessage() */ struct SyncMLMessageInfo { std::string m_deviceID; /** a string representation of the whole structure for debugging */ std::string toString() { return std::string("deviceID ") + m_deviceID; } }; /** * Instead or executing a sync, analyze the initial message * without changing any local data. Returns once the LocURI = * device ID of the client is known. * * @return device ID, empty if not in data */ static SyncMLMessageInfo analyzeSyncMLMessage(const char *data, size_t len, const std::string &messageType); /** * Convenience function, to be called inside a catch() block of * (or for) the sync. * * Rethrows the exception to determine what it is, then logs it * as an error and returns a suitable error code (usually a general * STATUS_DATASTORE_FAILURE). */ SyncMLStatus handleException(); /** * Determines the log directory of the previous sync (either in * temp or logdir) and shows changes since then. */ void status(); enum RestoreDatabase { DATABASE_BEFORE_SYNC, DATABASE_AFTER_SYNC }; /** * Restore data of selected sources from before or after the given * sync session, identified by absolute path to the log dir. */ void restore(const string &dirname, RestoreDatabase database); /** * fills vector with absolute path to information about previous * sync sessions, oldest one first */ void getSessions(vector &dirs); /** * fills report with information about previous session * @return the peer name from the dir. */ string readSessionInfo(const string &dir, SyncReport &report); /** * fills report with information about local changes * * Only sync sources selected in the SyncContext * constructor are checked. The local item changes will be set in * the SyncReport's ITEM_LOCAL ITEM_ADDED/UPDATED/REMOVED. * * Some sync sources might not be able to report this * information outside of a regular sync, in which case * these fields are set to -1. * * Start and end times of the check are also reported. */ void checkStatus(SyncReport &report); /** * When using Evolution this function starts a background thread * which drives the default event loop. Without that loop * "backend-died" signals are not delivered. The problem with * the thread is that it seems to interfere with gconf startup * when added to the main() function of syncevolution. Therefore * it is started by SyncSource::beginSync() (for unit * testing of sync sources) and SyncContext::sync() (for * normal operation). */ static void startLoopThread(); /** * Finds activated sync source by name. May return NULL * if no such sync source was defined or is not currently * instantiated. Pointer remains valid throughout the sync * session. Called by Synthesis DB plugin to find active * sources. * * @param name can be both as well as _ * (necessary when renaming sources in the Synthesis XML config) * * @TODO: roll SourceList into SyncContext and * make this non-static */ static SyncSource *findSource(const std::string &name); static const char m_findSourceSeparator = '@'; /** * Find the active sync context for the given session. * * @param sessionName chosen by SyncEvolution and passed to * Synthesis engine, which calls us back * with it in SyncEvolution_Session_CreateContext() * @return context or NULL if not found */ static SyncContext *findContext(const char *sessionName); SharedEngine getEngine() { return m_engine; } const SharedEngine getEngine() const { return m_engine; } bool getDoLogging() { return m_doLogging; } /** * Returns the string used to select the peer config * used by this instance. * * Note that this is not the same as a valid configuration * name. For example "foo" might be matched against a * "foo@bar" config by SyncConfig. Use SyncConfig::getConfigName() * to get the underlying config. */ std::string getPeer() { return m_server; } /** * Handle for active session, may be NULL. */ SharedSession getSession() { return m_session; } bool getRemoteInitiated() {return m_remoteInitiated;} void setRemoteInitiated(bool remote) {m_remoteInitiated = remote;} /** * If called while a sync session runs, * the engine will finish the session and then * immediately try to run another one with * the same sources. * * Does nothing when called at the wrong time. * There's no guarantee either that restarting is * possible. */ static void requestAnotherSync(); /** * If called while a sync runs, it will change the state of that * sync. A frozen sync can only be unfrozen (via setFreeze(false)) * or suspended/aborted (via signals). * * @return true if there was a running sync, false otherwise */ bool setFreeze(bool freeze); /** * access to current set of sync sources, NULL if not instantiated yet */ const std::vector *getSources() const; protected: /** exchange active Synthesis engine */ SharedEngine swapEngine(SharedEngine newengine) { SharedEngine oldengine = m_engine; m_engine = newengine; return oldengine; } /** sentinel class which creates, installs and removes a new Synthesis engine for the duration of its own life time */ class SwapEngine { SyncContext &m_client; SharedEngine m_oldengine; public: SwapEngine(SyncContext &client) : m_client(client) { SharedEngine syncengine(m_client.createEngine()); m_oldengine = m_client.swapEngine(syncengine); } ~SwapEngine() { m_client.swapEngine(m_oldengine); } }; /** * Create a Synthesis engine for the currently active * sources (might be empty!) and settings. */ SharedEngine createEngine(); /** * Return skeleton Synthesis client XML configuration. * * The , , elements (if * present) are replaced by the caller with fragments found in the * file system. When already has content, that content * may contain , , , which * will be replaced by definitions gathered from backends. * * The default implementation of this function takes the configuration from * (in this order): * - $(XDG_CONFIG_HOME)/syncevolution-xml * - $(datadir)/syncevolution/xml * Files with identical names are read from the first location where they * are found. If $(SYNCEVOLUTION_XML_CONFIG_DIR) is set, then it overrides * the previous two locations. * * The syncevolution.xml file is read from the first place where it is found. * In addition, further .xml files in sub-directories are gathered and get * inserted into the syncevolution.xml template. * * If none of these locations has XML configs, then builtin strings are * used as fallback. This only works for mode == "client". Otherwise an * error is thrown. * * @param mode "client" or "server" * @retval xml is filled with Synthesis client config which may hav * @retval rules remote rules which the caller needs for * @retval configname a string describing where the config came from */ virtual void getConfigTemplateXML(const string &mode, string &xml, string &rules, string &configname); /** * Return complete Synthesis XML configuration. * * Calls getConfigTemplateXML(), then fills in * sync source XML fragments if necessary. * * @param isSync the XML config will be used for the final engine used for syncing, not just logging * @retval xml is filled with complete Synthesis client config * @retval configname a string describing where the config came from */ virtual void getConfigXML(bool isSync, string &xml, string &configname); /** * Callback for derived classes: called after initializing the * client, but before doing anything with its configuration. * Can be used to override the client configuration. */ virtual void prepare() {} /** * instantiate transport agent * * Called by engine when it needs to exchange messages. The * transport agent will be used throughout the sync session and * unref'ed when no longer needed. At most one agent will be * requested at a time. The transport agent is intentionally * returned as a Boost shared pointer so that a pointer to a * class with a different life cycle is possible, either by * keeping a reference or by returning a shared_ptr where the * destructor doesn't do anything. * * The agent must be ready for use: * - HTTP specific settings must have been applied * - the current SyncContext's timeout must have been * installed via TransportAgent::setTimeout() * * The default implementation instantiates one of the builtin * transport agents, depending on how it was compiled. * * @param gmainloop the GMainLoop to be used by transports, if not NULL; * transports not supporting that should not be created; * transports will increase the reference count for the loop * @return transport agent */ virtual boost::shared_ptr createTransportAgent(void *gmainloop); virtual boost::shared_ptr createTransportAgent() { return createTransportAgent(NULL); } /** * display a text message from the server * * Not really used by SyncML servers. Could be displayed in a * modal dialog. * * @param message string with local encoding, possibly with line breaks */ virtual void displayServerMessage(const string &message); /** * display general sync session progress * * @param type PEV_*, see * @param extra1 extra information depending on type * @param extra2 extra information depending on type * @param extra3 extra information depending on type */ virtual void displaySyncProgress(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3); /** * An event plus its parameters, see Synthesis engine. */ class SyncSourceEvent { public: sysync::TProgressEventEnum m_type; int32_t m_extra1, m_extra2, m_extra3; SyncSourceEvent() : m_type(sysync::PEV_NOP) {} SyncSourceEvent(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3) { m_type = type; m_extra1 = extra1; m_extra2 = extra2; m_extra3 = extra3; } }; /** * display sync source specific progress * * @param source source which is the target of the event * @param event contains PEV_* and extra parameters, see * @param flush if true, then bypass caching events and print directly * @return true if the event was cached */ virtual bool displaySourceProgress(SyncSource &source, const SyncSourceEvent &event, bool flush); /** * report step command info * * Will be called after each step in step loop in SyncContext::doSync(). * This reports step command info. * @param stepCmd step command enum value */ virtual void reportStepCmd(sysync::uInt16 stepCmd) {} private: /** initialize members as part of constructors */ void init(); /** * generate XML configuration and (re)initialize engine with it * * @param isSync the XML config will be used for the final engine used for syncing, not just logging */ void initEngine(bool isSync); /** * the code common to init() and status(): * populate source list with active sources and open */ void initSources(SourceList &sourceList); /** * set m_localSync and m_localPeerContext * @param config config name of peer */ void initLocalSync(const string &config); /** * called via pre-signal of m_saveAdminData */ SyncMLStatus preSaveAdminData(SyncSource &source); /** * called via pre-signal of m_startDataRead */ SyncMLStatus startSourceAccess(SyncSource *source); /** * utility function for status() and getChanges(): * iterate over sources, check for changes and copy result */ void checkSourceChanges(SourceList &sourceList, SyncReport &changes); /** * A method to report sync is really successfully started. * It happens at the same time SynthesDBPlugin starts to access source. * For each sync, it is only called at most one time. * The default action is nothing. */ virtual void syncSuccessStart() { } /** * sets up Synthesis session and executes it */ SyncMLStatus doSync(); /** * directory for Synthesis client binfiles or * Synthesis server textdb files, unique for each * peer */ string getSynthesisDatadir(); /** * return true if "delayedabort" session variable is true */ bool checkForScriptAbort(SharedSession session); // total retry duration int m_retryDuration; // message resend interval int m_retryInterval; // Current retry count int m_retries; //a flag indicating whether it is the first time to start source access. //It can be used to report infomation about a sync is successfully started. bool m_firstSourceAccess; // Cache for use in displaySourceProgress(). SyncSource *m_sourceProgress; SyncSourceEvent m_sourceEvent; std::set m_sourceStarted; public: /** * Returns the URL in the getSyncURL() list which is to be used * for sync. The long term goal is to pick the first URL which * uses a currently available transport; right now it simply picks * the first supported one. */ string getUsedSyncURL(); }; SE_END_CXX #endif // INCL_EVOLUTIONSYNCCLIENT syncevolution-1.5/src/syncevo/Timespec.h0000644000373300001540000000624012326412403021714 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVOLUTION_TIME # define INCL_SYNCEVOLUTION_TIME #include #include #include #include #include SE_BEGIN_CXX /** * Sub-second time stamps. Thin wrapper around timespec * and clock_gettime() (for monotonic time). Comparisons * assume normalized values (tv_nsec >= 0, < 1e9). Addition * and substraction produce normalized values, as long * as the result is positive. Substracting a - b where a < b * leads to an undefined result. */ class Timespec : public timespec { public: Timespec() { tv_sec = 0; tv_nsec = 0; } Timespec(time_t sec, long nsec) { tv_sec = sec; tv_nsec = nsec; } bool operator < (const Timespec &other) const { return tv_sec < other.tv_sec || (tv_sec == other.tv_sec && tv_nsec < other.tv_nsec); } bool operator > (const Timespec &other) const { return tv_sec > other.tv_sec || (tv_sec == other.tv_sec && tv_nsec > other.tv_nsec); } bool operator <= (const Timespec &other) const { return !(*this > other); } bool operator >= (const Timespec &other) const { return !(*this < other); } operator bool () const { return tv_sec || tv_nsec; } Timespec operator + (int seconds) const { return Timespec(tv_sec + seconds, tv_nsec); } Timespec operator - (int seconds) const { return Timespec(tv_sec - seconds, tv_nsec); } Timespec operator + (unsigned seconds) const { return Timespec(tv_sec + seconds, tv_nsec); } Timespec operator - (unsigned seconds) const { return Timespec(tv_sec - seconds, tv_nsec); } Timespec operator + (const Timespec &other) const; Timespec operator - (const Timespec &other) const; operator timeval () const { timeval res; res.tv_sec = tv_sec; res.tv_usec = tv_nsec / 1000; return res; } time_t seconds() const { return tv_sec; } long nsecs() const { return tv_nsec; } double duration() const { return (double)tv_sec + ((double)tv_nsec) / 1e9; } static Timespec monotonic() { Timespec res; clock_gettime(CLOCK_MONOTONIC, &res); return res; } static Timespec system() { Timespec res; clock_gettime(CLOCK_REALTIME, &res); return res; } void resetMonotonic() { clock_gettime(CLOCK_MONOTONIC, this); } void resetSystem() { clock_gettime(CLOCK_REALTIME, this); } }; SE_END_CXX #endif // INCL_SYNCEVOLUTION_TIME syncevolution-1.5/src/syncevo/UserInterface.h0000644000373300001540000002110112326412403022673 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009-12 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_USERINTERFACE # define INCL_USERINTERFACE #include #include #include #include SE_BEGIN_CXX /** * This struct wraps keys for storing passwords * in configuration system. Some fields might be empty * for some passwords. Each field might have different * meaning for each password. Fields using depends on * what user actually wants. */ struct ConfigPasswordKey { public: ConfigPasswordKey() : port(0) {} std::string toString() const; /** the user for the password */ std::string user; /** the server for the password */ std::string server; /** the domain name */ std::string domain; /** the remote object */ std::string object; /** the network protocol */ std::string protocol; /** the authentication type */ std::string authtype; /** the network port */ unsigned int port; /** a description of the password, for error messages */ std::string description; }; /** * This interface has to be provided to let SyncEvolution interact * with the user. Possible implementations are: * - command line: use platform secret storage, ask for password via stdin * - D-Bus server: use platform secret storage, relay password requests via D-Bus to UIs */ class UserInterface { public: virtual ~UserInterface() {} /** * A helper function which interactively asks the user for * a certain password. May throw errors. * * @param passwordName the name of the password in the config file, such as 'proxyPassword' * @param descr A simple string explaining what the password is needed for, * e.g. "SyncML server". This string alone has to be enough * for the user to know what the password is for, i.e. the * string has to be unique. * @param key the key used to retrieve password. Using this instead of ConfigNode is * to make user interface independent on Configuration Tree * @return entered password */ virtual std::string askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key) = 0; /** * A helper function which interactively asks the user for * a certain password. May throw errors. Final result will * be returned via callbacks. Use this function in code which * is currently inside glib event processing, because askPassword() * might only work when it is allowed to invoke glib. * * @param passwordName the name of the password in the config file, such as 'proxyPassword' * @param descr A simple string explaining what the password is needed for, * e.g. "SyncML server". This string alone has to be enough * for the user to know what the password is for, i.e. the * string has to be unique. * @param key the key used to retrieve password. Using this instead of ConfigNode is * to make user interface independent on Configuration Tree */ virtual void askPasswordAsync(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, const boost::function &success, const boost::function &failureException); /** * A helper function which is used for user interface to save * a certain password. Currently possibly syncml server. May * throw errors. * @param passwordName the name of the password in the config file, such as 'proxyPassword' * @param password password to be saved * @param key the key used to store password * @return true if ui saves the password and false if not */ virtual bool savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) = 0; /** * Read from stdin until end of stream. Must be connected to * stdin as seen by user (different in command line client * and D-Bus server). */ virtual void readStdin(std::string &content) = 0; }; /** * Some ConfigUserInterface implementations check in the system's * password manager before asking the user. Backends provide optional * access to GNOME keyring (maps to freedesktop.org Secrets D-Bus API) * and KWallet (custom protocol in KDE < 4.8, same Secrets API >= * 4.8). * * The following signals are to be invoked by ConfigUserInterface * implementations which want to use these extensions. They return * true if some backend implemented the request, false otherwise. */ /** * call one slot after the other, return as soon as the first one * returns true */ struct TrySlots { typedef bool result_type; template bool operator()(InputIterator first, InputIterator last) const { while (first != last) { if (*first) { return true; } ++first; } return false; } }; /** * Same as ConfigUserInterface::askPassword(), except that the * password is returned as retval. If it was set, then the * password was found in the keyring. The return value indicates * whether any slot matched the configured keyring. * * Backends need to be sure that the user wants them to handle * the request before doing the work and returning true. They * should check the first parameter, the value of the "keyring" * configuration option, to determine that. * * GNOME keyring and KWallet add themselves here and in * SavePasswordSignal. KWallet adds itself with priority 0 * and GNOME keyring with 1, which means that KWallet is called * first. It checks whether KDE really is the preferred * storage, otherwise defers to GNOME keyring (or any other * slot) by returning false. */ typedef boost::signals2::signal LoadPasswordSignal; LoadPasswordSignal &GetLoadPasswordSignal(); static const int INTERNAL_LOAD_PASSWORD_SLOTS = 1; /** * Same as AskPasswordSignal for saving. */ typedef boost::signals2::signal SavePasswordSignal; SavePasswordSignal &GetSavePasswordSignal(); static const int INTERNAL_SAVE_PASSWORD_SLOTS = 2; class SimpleUserInterface : public UserInterface { InitStateTri m_useKeyring; public: SimpleUserInterface(InitStateTri useKeyring) : m_useKeyring(useKeyring) {} virtual std::string askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key) { InitStateString password; // Try to use keyring, if allowed. GetLoadPasswordSignal()(m_useKeyring, passwordName, descr, key, password); return password; } virtual bool savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { return false; } virtual void readStdin(std::string &content) { content.clear(); } }; SE_END_CXX #endif // INCL_USERINTERFACE syncevolution-1.5/src/syncevo/SynthesisEngine.h0000644000373300001540000001314712326412403023266 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2008 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNTHESISENGINE #define INCL_SYNTHESISENGINE #include #include #include #include #include // TODO: remove dependency on header file. // Currently required because shared_ptr // checks that type is completely defined. #include #include #include #include #include #include #include SE_BEGIN_CXX typedef boost::shared_ptr SharedSession; typedef boost::shared_ptr SharedKey; class SharedBuffer : public boost::shared_array { size_t m_size; public: SharedBuffer() : m_size(0) {} /** transfers ownership */ explicit SharedBuffer(char *p, size_t size): boost::shared_array(p), m_size(size) {} /** transfers ownership with custom destructor */ template SharedBuffer(char *p, size_t size, const D &d) : boost::shared_array(p, d), m_size(size) {} /** copies memory */ explicit SharedBuffer(const char *p, size_t size): boost::shared_array(new char [size]), m_size(size) { memcpy(get(), p, size); } size_t size() const { return m_size; } }; /** * Wrapper around a class which is derived from * TEngineModuleBase. Provides a C++ * interface which uses Boost smart pointers and * exceptions derived from std::runtime_error to track * resources/report errors. */ class SharedEngine { boost::shared_ptr m_engine; public: SharedEngine(sysync::TEngineModuleBase *engine = NULL): m_engine(engine) {} sysync::TEngineModuleBase *get() { return m_engine.get(); } void Connect(const string &aEngineName, sysync::CVersion aPrgVersion = 0, sysync::uInt16 aDebugFlags = 0); void Disconnect(); void InitEngineXML(const string &aConfigXML); SharedSession OpenSession(const string &aSessionID); SharedKey OpenSessionKey(SharedSession &aSessionH); void SessionStep(const SharedSession &aSessionH, sysync::uInt16 &aStepCmd, sysync::TEngineProgressInfo *aInfoP = NULL); SharedBuffer GetSyncMLBuffer(const SharedSession &aSessionH, bool aForSend); void WriteSyncMLBuffer(const SharedSession &aSessionH, const char *data, size_t len); SharedKey OpenKeyByPath(const SharedKey &aParentKeyH, const string &aPath, bool noThrow = false); SharedKey OpenSubkey(const SharedKey &aParentKeyH, sysync::sInt32 aID, bool noThrow = false); string GetStrValue(const SharedKey &aKeyH, const string &aValName); void SetStrValue(const SharedKey &aKeyH, const string &aValName, const string &aValue); sysync::sInt32 GetInt32Value(const SharedKey &aKeyH, const string &aValName); void SetInt32Value(const SharedKey &aKeyH, const string &aValName, sysync::sInt32 aValue); void doDebug(Logger::Level level, const char *prefix, const char *file, int line, const char *function, const char *format, va_list args); }; /** * thrown when a function returns a non-okay error code */ class BadSynthesisResult : public StatusException { public: BadSynthesisResult(const std::string &file, int line, const string &what, sysync::TSyErrorEnum result) : StatusException(file, line, what, SyncMLStatus(result)) {} sysync::TSyErrorEnum result() const { return sysync::TSyErrorEnum(syncMLStatus()); } }; /** * thrown when a key cannot be opened because it doesn't exist */ class NoSuchKey : public BadSynthesisResult { public: NoSuchKey(const std::string &file, int line, const string &what) : BadSynthesisResult(file, line, what, sysync::DB_NoContent) {} }; /** * A class which wraps the underlying sysync::SDK_InterfaceType * methods. Any sysync::SDK_InterfaceType pointer can be casted * into this class because this class doesn't add any virtual * functions or data. */ struct SDKInterface : public sysync::SDK_InterfaceType { sysync::TSyError setValue(sysync::KeyH aItemKey, const std::string &field, const char *data, size_t datalen); sysync::TSyError getValue(sysync::KeyH aItemKey, const std::string &field, SharedBuffer &data); }; SE_END_CXX #endif // INCL_SYNTHESISENGINE syncevolution-1.5/src/syncevo/Logging.h0000644000373300001540000003615212326412403021536 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOGGING #define INCL_LOGGING #include #include #include #ifdef HAVE_CONFIG_H # include #endif #ifdef HAVE_GLIB # include #endif #include #include #include #include #include #include SE_BEGIN_CXX /** * Abstract interface for logging in SyncEvolution. Can be * implemented by other classes to add information (like a certain * prefix) before passing the message on to a global instance for the * actual processing. * * The static methods provide some common utility code and manage a * global stack of loggers. The one pushed latest is called first to * handle a new message. It can find its parent logger (= the one * added just before it) and optionally pass the message up the chain * before or after processing it itself. * * All methods must be thread-safe. */ class Logger { public: /** * Which of these levels is the right one for a certain message * is a somewhat subjective choice. Here is a definition how they * are supposed to be used: * - error: severe problem which the user and developer have to * know about * - warning: a problem that was handled, but users and developers * probably will want to know about * - info: information about a sync session which the user * will want to read during/after each sync session * - developer: information about a sync session that is not * interesting for a user (for example, because it * is constant and already known) but which should * be in each log because developers need to know * it. Messages logged with this calls will be included * at LOG_LEVEL_INFO, therefore messages should be small and * not recur so that the log file size remains small. * - debug: most detailed logging, messages may be arbitrarily large * * Here is a decision tree which helps to pick the right level: * - an error: => ERROR * - a non-fatal error: => WARNING * - it changes during each sync or marks important steps * in the sync: INFO * - same as before, but without the [INFO] prefix added to each line: => SHOW * - small, non-recurring message which is important for developers * who read a log produced at LOG_LEVEL_INFO: DEVELOPER * - everything else: DEBUG */ typedef enum { /** * no error messages printed */ NONE = -1, /** * only error messages printed */ ERROR, /** * error and warning messages printed */ WARNING, /** * "Normal" stdout output which is meant to be seen by a * user. */ SHOW, /** * errors and info messages for users and developers will be * printed: use this to keep the output consise and small */ INFO, /** * important messages to developers */ DEV, /** * all messages will be printed, including detailed debug * messages */ DEBUG } Level; static const char *levelToStr(Level level); /** always returns a valid level, also for NULL, by falling back to DEBUG */ static Level strToLevel(const char *str); /** * additional, short string identifying the SyncEvolution process; * empty if master process * * Included by LoggerStdout in the [INFO/DEBUG/...] tag. */ static void setProcessName(const std::string &name); static std::string getProcessName(); /** * Obtains the recursive logging mutex. * * All calls offered by the Logger class already lock that mutex * internally, but sometimes it may be necessary to protect a larger * region of logging related activity. */ static RecMutex::Guard lock(); #ifdef HAVE_GLIB /** * can be used in g_log_set_handler() to redirect log messages * into our own logging; must be called for each log domain * that may be relevant */ static void glogFunc(const gchar *logDomain, GLogLevelFlags logLevel, const gchar *message, gpointer userData); #endif /** * can be used as replacement for libsynthesis console printf function, * logs at DEBUG level * * @param stream is ignored * @param format guaranteed to start with "SYSYNC " * @return always 0 */ static int sysyncPrintf(FILE *stream, const char *format, ...); Logger(); virtual ~Logger(); /** * Prepare logger for removal from logging stack. May be called * multiple times. * * The logger should stop doing anything right away and just pass * on messages until it gets deleted eventually. */ virtual void remove() throw () {} /** * Collects all the parameters which may get passed to * messagev. */ class MessageOptions { public: /** level for current message */ Level m_level; /** inserted at beginning of each line, if non-NULL */ const std::string *m_prefix; /** source file where message comes from, if non-NULL */ const char *m_file; /** source line number, if file is non-NULL */ int m_line; /** surrounding function name, if non-NULL */ const char *m_function; /** name of the process which originally created the message, if different from current one */ const std::string *m_processName; /** additional flags */ int m_flags; enum { /** * The message was written into a global log (syslog, dlt, ...) * already. Such a message must not be logged again. */ ALREADY_LOGGED = 1<<0, /** * The message must be written into a global log, * but not to stdout. */ ONLY_GLOBAL_LOG = 1<<1 }; MessageOptions(Level level); MessageOptions(Level level, const std::string *prefix, const char *file, int line, const char *function, int flags = 0); }; /** * output a single message * * @param options carries additional information about the message * @param format sprintf format * @param args parameters for sprintf: consumed by this function, * make copy with va_copy() if necessary! */ virtual void messagev(const MessageOptions &options, const char *format, va_list args) = 0; /** * A convenience and backwards-compatibility class which allows * calling some methods of the underlying pointer directly similar * to the Logger reference returned in previous SyncEvolution * releases. */ class Handle { boost::shared_ptr m_logger; public: Handle() throw (); Handle(Logger *logger) throw (); template Handle(const boost::shared_ptr &logger) throw () : m_logger(logger) {} template Handle(const boost::weak_ptr &logger) throw () : m_logger(logger.lock()) {} Handle(const Handle &other) throw (); Handle &operator = (const Handle &other) throw (); ~Handle() throw (); operator bool () const { return m_logger; } bool operator == (Logger *logger) const { return m_logger.get() == logger; } Logger *get() const { return m_logger.get(); } void messagev(const MessageOptions &options, const char *format, va_list args) { m_logger->messagev(options, format, args); } void message(Level level, const std::string *prefix, const char *file, int line, const char *function, const char *format, ...) #ifdef __GNUC__ __attribute__((format(printf, 7, 8))) #endif ; void message(Level level, const std::string &prefix, const char *file, int line, const char *function, const char *format, ...) #ifdef __GNUC__ __attribute__((format(printf, 7, 8))) #endif ; void messageWithOptions(const MessageOptions &options, const char *format, ...) #ifdef __GNUC__ __attribute__((format(printf, 3, 4))) #endif ; void setLevel(Level level) { m_logger->setLevel(level); } Level getLevel() { return m_logger->getLevel(); } void remove() throw () { m_logger->remove(); } }; /** * Grants access to the singleton which implements logging. * The implementation of this function and thus the Log * class itself is platform specific: if no Log instance * has been set yet, then this call has to create one. */ static Handle instance(); /** * Overrides the current default Logger implementation. * * @param logger will be used for all future logging activities */ static void addLogger(const Handle &logger); /** * Remove the specified logger. * * Note that the logger might still be in use afterwards, for * example when a different thread currently uses it. Therefore * loggers should be small stub classes. If they need access to * more expensive classes to do their work, they shold hold weak * reference to those and only lock them when logging. */ static void removeLogger(Logger *logger); virtual void setLevel(Level level) { m_level = level; } virtual Level getLevel() { return m_level; } protected: /** * Prepares the output. The result is passed back to the caller * line-by-line (expectedTotal > 0) and/or as full chunk * (expectedTotal = 0). The expected size is just a guess, be * prepared to handle more output. * * Each chunk already includes the necessary line breaks (in * particular after the last line when it contains the entire * output). It may be modified by the callback. * * @param processName NULL means use the current process' name, * empty means use none */ void formatLines(Level msglevel, Level outputlevel, const std::string *processName, const std::string *prefix, const char *format, va_list args, boost::function print); private: Level m_level; /** * Set by formatLines() before writing the first message if log * level is debugging, together with printing a message that gives * the local time. */ Timespec m_startTime; }; /** * Takes a logger and adds it to the stack * as long as the instance exists. */ template class PushLogger : boost::noncopyable { Logger::Handle m_logger; public: PushLogger() {} /** * Can use Handle directly here. */ PushLogger(const Logger::Handle &logger) : m_logger(logger) { if (m_logger) { Logger::addLogger(m_logger); } } /** * Take any type that a Handle constructor accepts, then use it as * Handle. */ template PushLogger(M logger) : m_logger(Logger::Handle(logger)) { if (m_logger) { Logger::addLogger(m_logger); } } ~PushLogger() throw () { if (m_logger) { Logger::removeLogger(m_logger.get()); } } operator bool () const { return m_logger; } void reset(const Logger::Handle &logger) { if (m_logger) { Logger::removeLogger(m_logger.get()); } m_logger = logger; if (m_logger) { Logger::addLogger(m_logger); } } template void reset(M logger) { if (m_logger) { Logger::removeLogger(m_logger.get()); } m_logger = Logger::Handle(logger); if (m_logger) { Logger::addLogger(m_logger); } } void reset() { if (m_logger) { Logger::removeLogger(m_logger.get()); } m_logger = Logger::Handle(); } L *get() { return static_cast(m_logger.get()); } L * operator -> () { return get(); } }; /** * Wraps Logger::message() in the current default logger. * and adds file and line where the message comes from. * * This macro reverses _prefix and _level to avoid the situation where * the compiler mistakes a NULL _prefix with the _format parameter * (happened once while doing code refactoring). * * @TODO make source and line info optional for release * @TODO add function name (GCC extension) */ #define SE_LOG(_prefix, _level, _format, _args...) \ SyncEvo::Logger::instance().message(_level, \ _prefix, \ __FILE__, \ __LINE__, \ NULL, \ _format, \ ##_args); #define SE_LOG_SHOW(_prefix, _format, _args...) SE_LOG(_prefix, SyncEvo::Logger::SHOW, _format, ##_args) #define SE_LOG_ERROR(_prefix, _format, _args...) SE_LOG(_prefix, SyncEvo::Logger::ERROR, _format, ##_args) #define SE_LOG_WARNING(_prefix, _format, _args...) SE_LOG(_prefix, SyncEvo::Logger::WARNING, _format, ##_args) #define SE_LOG_INFO(_prefix, _format, _args...) SE_LOG(_prefix, SyncEvo::Logger::INFO, _format, ##_args) #define SE_LOG_DEV(_prefix, _format, _args...) SE_LOG(_prefix, SyncEvo::Logger::DEV, _format, ##_args) #define SE_LOG_DEBUG(_prefix, _format, _args...) SE_LOG(_prefix, SyncEvo::Logger::DEBUG, _format, ##_args) SE_END_CXX #endif // INCL_LOGGING syncevolution-1.5/src/syncevo/SyncML.h0000664000373300001540000004413112405555067021327 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCML #define INCL_SYNCML #include #include #include #include #include #include #include SE_BEGIN_CXX /** * only the codes which are valid for a server alerted sync (SAN) message */ enum SANSyncMode { SA_SLOW = 201, SA_FIRST = SA_SLOW, SA_TWO_WAY = 206, SA_ONE_WAY_FROM_CLIENT = 207, SA_REFRESH_FROM_CLIENT = 208, SA_ONE_WAY_FROM_SERVER = 209, SA_REFRESH_FROM_SERVER = 210, SA_LAST = SA_REFRESH_FROM_SERVER, SA_INVALID = 255 }; /** * unambiguous sync modes: * - data direction is independent of client/server role * - no server alerted variants */ enum SimpleSyncMode { SIMPLE_SYNC_NONE, SIMPLE_SYNC_TWO_WAY = 200, SIMPLE_SYNC_SLOW = 201, SIMPLE_SYNC_RESTORE_FROM_BACKUP = 211, SIMPLE_SYNC_ONE_WAY_FROM_LOCAL = 212, SIMPLE_SYNC_REFRESH_FROM_LOCAL = 213, SIMPLE_SYNC_ONE_WAY_FROM_REMOTE = 214, SIMPLE_SYNC_REFRESH_FROM_REMOTE = 215, // custom modes in SyncEvolution /** mirror data on server side, slow variant (client sends all items) */ SIMPLE_SYNC_LOCAL_CACHE_SLOW = 218, /** mirror data on server side, incremental variant (client sends only changes) */ SIMPLE_SYNC_LOCAL_CACHE_INCREMENTAL = 219, SIMPLE_SYNC_INVALID = 255 }; /** all kinds of sync modes */ enum SyncMode { /** unset or disabled */ SYNC_NONE, SYNC_FIRST = 200, SYNC_TWO_WAY = 200, SYNC_SLOW = 201, SYNC_ONE_WAY_FROM_CLIENT = 202, SYNC_REFRESH_FROM_CLIENT = 203, SYNC_ONE_WAY_FROM_SERVER = 204, SYNC_REFRESH_FROM_SERVER = 205, // used by Server Alerted Sync, same as SA_ in SANSyncMode SA_SYNC_TWO_WAY = 206, SA_SYNC_ONE_WAY_FROM_CLIENT = 207, SA_SYNC_REFRESH_FROM_CLIENT = 208, SA_SYNC_ONE_WAY_FROM_SERVER = 209, SA_SYNC_REFRESH_FROM_SERVER = 210, // used by restore backend with backup data, a pseudo mode SYNC_RESTORE_FROM_BACKUP = 211, // modes which always transfer in the same direction, // regardless which side acts as client or server SYNC_ONE_WAY_FROM_LOCAL = 212, SYNC_REFRESH_FROM_LOCAL = 213, SYNC_ONE_WAY_FROM_REMOTE = 214, SYNC_REFRESH_FROM_REMOTE = 215, // custom mode SYNC_LOCAL_CACHE_SLOW = 218, SYNC_LOCAL_CACHE_INCREMENTAL = 219, SYNC_LAST = 220, /** error situation (in contrast to SYNC_NONE) */ SYNC_INVALID = 255 }; /** * maps to normal SYNC_ variants (no SA_*) and unambiguous direction * (LOCAL/REMOTE instead of CLIENT/SERVER) */ SimpleSyncMode SimplifySyncMode(SyncMode mode, bool peerIsClient); /** * maps to the server alerted variants */ SANSyncMode AlertSyncMode(SyncMode mode, bool peerIsClient); /* According to OMNA WSP Content Type Numbers*/ enum ContentType { WSPCTC_TEXT_PLAIN = 0x03, WSPCTC_XVCALENDAR = 0x06, WSPCTC_XVCARD = 0x07, WSPCTC_ICALENDAR = 0x0305, WSPCTC_VCARD = 0x0309, WSPCTC_UNKNOWN =0xFFFFFF }; /** * Return string for sync mode. User-visible strings are the ones used * in a sync source config ("two-way", "refresh-from-server", etc.). * Otherwise the constants above are returned ("SYNC_NONE"). */ std::string PrettyPrintSyncMode(SyncMode mode, bool userVisible = true); /** * Parse user-visible mode names. */ SyncMode StringToSyncMode(const std::string &str, bool serverAlerted = false); /* * Parse string based content type to WSPCTC encoded binary code * Always use older type unless forceType is true. */ ContentType StringToContentType (const std::string &str, bool forceType); /* * return string based MIME Type for PIM, always use legacy type unless * forceType is set. * */ std::string GetLegacyMIMEType (const std::string &str, bool forceType); /** * result of SyncML operations, same codes as in HTTP and the Synthesis engine */ enum SyncMLStatus { /** ok */ STATUS_OK = 0, /** more explicit ok status in cases where 0 might mean "unknown" (SyncReport) */ STATUS_HTTP_OK = 200, /** no content / end of file / end of iteration / empty/NULL value */ STATUS_NO_CONTENT = 204, /** external data has been merged */ STATUS_DATA_MERGED = 207, /** The request requires user authentication. */ STATUS_UNAUTHORIZED = 401, /** forbidden / access denied */ STATUS_FORBIDDEN = 403, /** object not found / unassigned field */ STATUS_NOT_FOUND = 404, /** command not allowed */ STATUS_COMMAND_NOT_ALLOWED = 405, STATUS_OPTIONAL_FEATURE_NOT_SUPPORTED = 406, STATUS_AUTHORIZATION_REQUIRED = 407, /** * "If the specified remote procedure call no longer exists on * the recipient, then the (410) Gone exception condition is * created by the command." */ STATUS_COMMAND_GONE = 410, /** * "If the Put command did not include the size of the data item * to be transferred (i.e., in the Meta element type), then the * (411) Size required exception condition is created by the * command. */ STATUS_SIZE_REQUIRED = 411, /** * "If the Alert command didn’t include all the correct parameters * in the Item element type, then the (412) Incomplete command * exception condition is created by the command." */ STATUS_INCOMPLETE_COMMAND = 412, /** * "If the requested data item is too large to be transferred at * this time, then the (413) Request entity too large exception * condition is created by the command. */ STATUS_REQUEST_ENTITY_TOO_LARGE = 413, STATUS_UNSUPPORTED_MEDIA_TYPE_OR_FORMAT = 415, /** * "If the Size specified in the Meta element type was too large * for the recipient (e.g., the recipient does not have sufficient * input buffer for the data), then the (416) Requested size too * big exception condition is created by the command." */ STATUS_REQUESTED_SIZE_TOO_BIG = 416, STATUS_RETRY_LATER = 417, /** object exists already */ STATUS_ALREADY_EXISTS = 418, /** database / memory full error */ STATUS_FULL = 420, STATUS_UNKNOWN_SEARCH_GRAMMAR = 421, STATUS_BAD_CGI_OR_FILTER_QUERY = 422, /** * "In a two-way synchronization, if the OMA DS client specifies a * "Soft Delete" for an item that has already been "Hard Deleted" * on the OMA DS server, then a (423) Soft-delete conflict MUST be * returned in the Status command." */ STATUS_SOFT_DELETE_CONFLICT = 423, STATUS_PARTIAL_ITEM_NOT_ACCEPTED = 426, STATUS_ITEM_NOT_EMPTY = 427, STATUS_MOVE_FAILED = 428, /** command failed / fatal DB error */ STATUS_FATAL = 500, /** in Synthesis StartDataRead: slow sync forced by backend */ STATUS_SLOW_SYNC_508 = 508, /** general DB error */ STATUS_DATASTORE_FAILURE = 510, /* sysync error codes also used by SyncEvolution */ /** transport failure, sysync::LOCERR_TRANSPFAIL */ STATUS_TRANSPORT_FAILURE = 20043, /* error codes in the range reserved by Synthesis for the application follow */ /** ran into an unexpected slow sync, refused to execute it */ STATUS_UNEXPECTED_SLOW_SYNC = 22000, /** no error at the SyncML level, but some items did not transfer correctly */ STATUS_PARTIAL_FAILURE = 22001, /** * Set by SyncEvolution in status.ini before starting an sync. * Replaced with the final status code if the sync completes. * Finding this code here in a session report implies that * the process responsible for the session died unexpectedly, * for unknown reasons. */ STATUS_DIED_PREMATURELY = 22002, /** * Set by dbus server when it asks password from dbus clients * and no responsble is gotten in a specific time. */ STATUS_PASSWORD_TIMEOUT = 22003, /** * On-disk files (config, Synthesis binfiles) are too recent * to be read and/or used by this SyncEvolution release. * User must upgrade. */ STATUS_RELEASE_TOO_OLD = 22004, /** * On-disk files would be changed in such a way that downgrading * becomes impossible. User must explicitly migrate config if * he wants to proceed. */ STATUS_MIGRATION_NEEDED = 22005, /** * Skip writing of admin data after a sync did not change * anything. */ STATUS_SYNC_END_SHORTCUT = 22006, STATUS_MAX = 0x7FFFFFF }; /** * short (in the range of 80 characters or less) description of the status code, * followed by "(status xxxx)" because the mapping of description to code * might be ambiguous */ std::string Status2String(SyncMLStatus status); /** * Information about a database dump. * Currently only records the number of items. * A negative number of items means no backup * available. */ class BackupReport { public: BackupReport() { clear(); } bool isAvailable() const { return m_numItems >= 0; } long getNumItems() const { return m_numItems; } void setNumItems(long numItems) { m_numItems = numItems; } void clear() { m_numItems = -1; } private: long m_numItems; }; class SyncSourceReport { public: SyncSourceReport() { memset(m_stat, 0, sizeof(m_stat)); m_received = 0; m_sent = 0; m_first = m_resume = false; m_mode = SYNC_NONE; m_status = STATUS_OK; m_restarts = 0; } enum ItemLocation { ITEM_LOCAL, ITEM_REMOTE, ITEM_LOCATION_MAX }; static std::string LocationToString(ItemLocation location); static ItemLocation StringToLocation(const std::string &location); enum ItemState { ITEM_ADDED, ITEM_UPDATED, ITEM_REMOVED, ITEM_ANY, ITEM_STATE_MAX }; static std::string StateToString(ItemState state); static ItemState StringToState(const std::string &state); enum ItemResult { ITEM_TOTAL, /**< total number ADDED/UPDATED/REMOVED */ ITEM_REJECT, /**< number of rejected items, ANY state */ ITEM_MATCH, /**< number of matched items, ANY state, REMOTE */ ITEM_CONFLICT_SERVER_WON, /**< conflicts resolved by using server item, ANY state, REMOTE */ ITEM_CONFLICT_CLIENT_WON, /**< conflicts resolved by using client item, ANY state, REMOTE */ ITEM_CONFLICT_DUPLICATED, /**< conflicts resolved by duplicating item, ANY state, REMOTE */ ITEM_SENT_BYTES, /**< number of sent bytes, ANY, LOCAL */ ITEM_RECEIVED_BYTES, /**< number of received bytes, ANY, LOCAL */ ITEM_RESULT_MAX }; static std::string ResultToString(ItemResult result); static ItemResult StringToResult(const std::string &result); static std::string StatTupleToString(ItemLocation location, ItemState state, ItemResult result); static void StringToStatTuple(const std::string &str, ItemLocation &location, ItemState &state, ItemResult &result); /** * get item statistics * * @param location either local or remote * @param state added, updated or removed * @param success either okay or failed */ int getItemStat(ItemLocation location, ItemState state, ItemResult success) const { return m_stat[location][state][success]; } void setItemStat(ItemLocation location, ItemState state, ItemResult success, int count) { m_stat[location][state][success] = count; } void incrementItemStat(ItemLocation location, ItemState state, ItemResult success) { m_stat[location][state][success]++; } /** true if statistics indicate that peer or local was modified during sync */ bool wasChanged(ItemLocation location); void recordFinalSyncMode(SyncMode mode) { m_mode = mode; } SyncMode getFinalSyncMode() const { return m_mode; } void recordRestart() { m_restarts++; } void setRestarts(int restarts) { m_restarts = restarts; } /** * number of times that the sync session was restarted * involving the source, usually zero */ int getRestarts() const { return m_restarts; } void recordFirstSync(bool isFirstSync) { m_first = isFirstSync; } bool isFirstSync() const { return m_first; } void recordResumeSync(bool isResumeSync) { m_resume = isResumeSync; } bool isResumeSync() const { return m_resume; } void recordStatus(SyncMLStatus status ) { m_status = status; } SyncMLStatus getStatus() const { return m_status; } /** counts each received add/update/delete */ void recordTotalNumItemsReceived(int received) { m_received = received; } int getTotalNumItemsReceived() const { return m_received; } /** counts each sent add/update/delete */ void recordTotalNumItemsSent(int sent) { m_sent = sent; } int getTotalNumItemsSent() const { return m_sent; } /** * if not empty, then this was the virtual source which cause the * current one to be included in the sync */ void recordVirtualSource(const std::string &virtualsource) { m_virtualSource = virtualsource; } std::string getVirtualSource() const { return m_virtualSource; } /** information about database dump before and after session */ BackupReport m_backupBefore, m_backupAfter; private: /** storage for getItemStat(): allow access with _MAX as index */ int m_stat[ITEM_LOCATION_MAX + 1][ITEM_STATE_MAX + 1][ITEM_RESULT_MAX + 1]; int m_received, m_sent; SyncMode m_mode; int m_restarts; bool m_first; bool m_resume; SyncMLStatus m_status; std::string m_virtualSource; }; class SyncReport : public std::map { time_t m_start, m_end; SyncMLStatus m_status; std::string m_error; std::string m_localName, m_remoteName; public: SyncReport() : m_start(0), m_end(0), m_status(STATUS_OK), m_localName("LOCAL"), m_remoteName("REMOTE") {} /** construct from text dump */ SyncReport(const std::string &dump); /** convert to text dump */ std::string toString() const; void setLocalName(const std::string &name) { m_localName = name; } void setRemoteName(const std::string &name) { m_remoteName = name; } typedef std::pair SourceReport_t; void addSyncSourceReport(const std::string &name, const SyncSourceReport &report) { (*this)[name] = report; } SyncSourceReport &getSyncSourceReport(const std::string &name) { return (*this)[name]; } const SyncSourceReport *findSyncSourceReport(const std::string &name) const { const_iterator it = find(name); return it == end() ? NULL : &it->second; } /** start time of sync, 0 if unknown */ time_t getStart() const { return m_start; } void setStart(time_t start) { m_start = start; } /** end time of sync, 0 if unknown (indicates a crash) */ time_t getEnd() const { return m_end; } void setEnd(time_t end) { m_end = end; } /** * overall sync result * * STATUS_OK = 0 means unknown status (might have aborted prematurely), * STATUS_HTTP_OK = 200 means successful completion */ SyncMLStatus getStatus() const { return m_status; } void setStatus(SyncMLStatus status) { m_status = status; } /** * Initial ERROR description as seen by SyncEvolution, * typically via the logging infrastructure. Not localized. */ std::string getError() const { return m_error; } void setError(const std::string &error) { m_error = error; } void clear() { std::map::clear(); m_start = m_end = 0; m_error = ""; m_status = STATUS_OK; } /** generate short string representing start and duration of sync */ std::string formatSyncTimes() const; /** pretty-print with options */ void prettyPrint(std::ostream &out, int flags) const; enum { WITHOUT_CLIENT = 1 << 1, WITHOUT_SERVER = 1 << 2, WITHOUT_CONFLICTS = 1 << 3, WITHOUT_REJECTS = 1 << 4, WITH_TOTAL = 1 << 5 }; /** * Produces a non-localized explanation for recovering from unexpected * slow syncs, targeted towards command line users. * * @param peer config name used to select the affected peer (nor necessarily normalized) * @param sources list of affected sources * @return explanation, empty string if list of sources is empty */ static std::string slowSyncExplanation(const std::string &peer, const std::set &sources); /** * Produces a non-localized explanation for recovering from unexpected * slow syncs, targeted towards command line users. Uses the information * about sources stored in the report. * * @param peer config name used to select the affected peer (nor necessarily normalized) * @return explanation, empty string if list of sources is empty */ std::string slowSyncExplanation(const std::string &peer) const; }; /** pretty-print the report as an ASCII table */ std::ostream &operator << (std::ostream &out, const SyncReport &report); class ConfigNode; /** write report into a ConfigNode */ ConfigNode &operator << (ConfigNode &node, const SyncReport &report); /** read report from a ConfigNode */ ConfigNode &operator >> (ConfigNode &node, SyncReport &report); SE_END_CXX #endif // INCL_SYNCML syncevolution-1.5/src/syncevo/eds_abi_wrapper.h0000644000373300001540000013452712326412403023303 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * The main purpose of this file is to separate SyncEvolution from * Evolution Dataserver ABI changes by never depending directly * on any symbol in its libraries. Instead all functions are * called via function pointers found via dlopen/dlsym. * * This is more flexible than linking against a specific revision of * the libs, but circumvents the usual lib versioning and therefore * may fail when the functions needed by SyncEvolution change. * * History shows that this has not happened for a long time whereas * the versions of EDS libs had to be bumped quite a few times due to other * changes. * * A similar problem came up with an API and ABI change in * libbluetooth.so.3: the sdp_extract_seqtype() and sdp_extract_pdu() * gained one more parameter (a buffer size for the buffer being * written into). When compatibility mode is enabled, this header * file provides the extended version and maps it back to the older * version if necessary. * * To use the wrappers, include this header file. It overrides * the normal C API functions with the function pointers via * defines. */ #ifndef INCL_EDS_ABI_WRAPPER #define INCL_EDS_ABI_WRAPPER #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_EDS #include #if defined(USE_EDS_CLIENT) #include #else #ifdef HAVE_LIBEDATASERVER_EDS_VERSION_H #include #endif #include #include #endif #ifdef ENABLE_EBOOK #ifdef USE_EDS_CLIENT #include #else #include #include #include #endif #endif #ifdef ENABLE_ECAL # define HANDLE_LIBICAL_MEMORY 1 #ifdef USE_EDS_CLIENT #include #else #include #endif #endif #endif #ifdef ENABLE_BLUETOOTH #include #include #endif #if !defined(ENABLE_ECAL) && defined(ENABLE_ICAL) # define HANDLE_LIBICAL_MEMORY 1 # include #endif #ifdef __cplusplus extern "C" { #endif #if defined(EVOLUTION_COMPATIBILITY) || defined(EVOLUTION_ICAL_COMPATIBILITY) extern int EDSAbiHaveIcal1; // 1 for libical.so.1, 0 for libical.so.0; numeric value matters, see defines below. /** initialize pointers to EDS functions, if necessary; can be called multiple times */ void EDSAbiWrapperInit(); #else # define EDSAbiWrapperInit() #endif #ifdef EVOLUTION_COMPATIBILITY /** libebook, libecal, libedataserver available (currently checks for e_book_new/e_cal_new/e_source_group_peek_sources) */ extern int EDSAbiHaveEbook, EDSAbiHaveEcal, EDSAbiHaveEdataserver; extern int EDSAbiHaveIcal; /** libbluetooth available (checks sdp_connect()) */ extern int SyncEvoHaveLibbluetooth; /** * This is a struct instead of a namespace because that allows * printing it in a debugger. This code also has to be usable * in plain C. */ struct EDSAbiWrapper { # ifdef HAVE_EDS GType (*e_source_get_type) (void); char *(*e_source_get_uri) (ESource *source); GType (*e_source_group_get_type) (void); GSList *(*e_source_group_peek_sources) (ESourceGroup *group); GSList *(*e_source_list_peek_groups) (ESourceList *list); const char *(*e_source_peek_name) (ESource *source); # endif /* HAVE_EDS */ # ifdef ENABLE_EBOOK gboolean (*e_book_add_contact) (EBook *book, EContact *contact, GError **error); gboolean (*e_book_authenticate_user) (EBook *book, const char *user, const char *passwd, const char *auth_method, GError **error); gboolean (*e_book_commit_contact) (EBook *book, EContact *contact, GError **error); EContact* (*e_contact_duplicate) (EContact *contact); gconstpointer (*e_contact_get_const) (EContact *contact, EContactField field_id); gpointer (*e_contact_get) (EContact *contact, EContactField field_id); void (*e_contact_name_free)(EContactName *name); GType (*e_contact_get_type) (void); EContact* (*e_contact_new_from_vcard) (const char *vcard); void (*e_contact_set) (EContact *contact, EContactField field_id, const gpointer value); gboolean (*e_book_get_addressbooks) (ESourceList** addressbook_sources, GError **error); gboolean (*e_book_get_changes) (EBook *book, char *changeid, GList **changes, GError **error); gboolean (*e_book_get_contact) (EBook *book, const char *id, EContact **contact, GError **error); gboolean (*e_book_get_contacts) (EBook *book, EBookQuery *query, GList **contacts, GError **error); gboolean (*e_book_get_supported_auth_methods) (EBook *book, GList **auth_methods, GError **error); const char *(*e_book_get_uri) (EBook *book); EBook *(*e_book_new) (ESource *source, GError **error); EBook *(*e_book_new_default_addressbook) (GError **error); EBook *(*e_book_new_from_uri) (const char *uri, GError **error); EBook *(*e_book_new_system_addressbook) (GError **error); gboolean (*e_book_open) (EBook *book, gboolean only_if_exists, GError **error); EBookQuery* (*e_book_query_any_field_contains) (const char *value); void (*e_book_query_unref) (EBookQuery *q); GQuark (*e_book_error_quark) (void); gboolean (*e_book_remove_contact) (EBook *book, const char *id, GError **error); char* (*e_vcard_to_string) (EVCard *evc, EVCardFormat format); gboolean (*e_contact_inline_local_photos) (EContact *contact, GError **error); # endif /* ENABLE_EBOOK */ # ifdef ENABLE_ECAL gboolean (*e_cal_add_timezone) (ECal *ecal, icaltimezone *izone, GError **error); icalcomponent *(*e_cal_component_get_icalcomponent) (ECalComponent *comp); void (*e_cal_component_get_last_modified) (ECalComponent *comp, struct icaltimetype **t); GType (*e_cal_component_get_type) (void); gboolean (*e_cal_create_object) (ECal *ecal, icalcomponent *icalcomp, char **uid, GError **error); GQuark (*e_calendar_error_quark) (void) G_GNUC_CONST; char* (*e_cal_get_component_as_string) (ECal *ecal, icalcomponent *icalcomp); gboolean (*e_cal_get_object) (ECal *ecal, const char *uid, const char *rid, icalcomponent **icalcomp, GError **error); gboolean (*e_cal_get_object_list_as_comp) (ECal *ecal, const char *query, GList **objects, GError **error); gboolean (*e_cal_get_sources) (ESourceList **sources, ECalSourceType type, GError **error); gboolean (*e_cal_get_timezone) (ECal *ecal, const char *tzid, icaltimezone **zone, GError **error); gboolean (*e_cal_modify_object) (ECal *ecal, icalcomponent *icalcomp, CalObjModType mod, GError **error); ECal *(*e_cal_new) (ESource *source, ECalSourceType type); ECal *(*e_cal_new_from_uri) (const gchar *uri, ECalSourceType type); ECal *(*e_cal_new_system_calendar) (void); ECal *(*e_cal_new_system_tasks) (void); const gchar *(*e_cal_get_uri)(ECal *); gboolean (*e_cal_open) (ECal *ecal, gboolean only_if_exists, GError **error); gboolean (*e_cal_remove_object) (ECal *ecal, const char *uid, GError **error); gboolean (*e_cal_remove_object_with_mod) (ECal *ecal, const char *uid, const char *rid, CalObjModType mod, GError **error); void (*e_cal_set_auth_func) (ECal *ecal, ECalAuthFunc func, gpointer data); #endif /* ENABLE_ECAL */ #ifdef ENABLE_ICAL void (*icalcomponent_add_component) (icalcomponent* parent, icalcomponent* child); void (*icalcomponent_add_property) (icalcomponent* comp, icalproperty* prop); char* (*icalcomponent_as_ical_string) (icalcomponent* component); void (*icalcomponent_free) (icalcomponent* component); icalcomponent* (*icalcomponent_get_first_component) (icalcomponent* component, icalcomponent_kind kind); icalproperty* (*icalcomponent_get_first_property) (icalcomponent* component, icalproperty_kind kind); icalcomponent* (*icalcomponent_get_next_component) (icalcomponent* component, icalcomponent_kind kind); icalproperty* (*icalcomponent_get_next_property) (icalcomponent* component, icalproperty_kind kind); struct icaltimetype (*icalcomponent_get_recurrenceid) (icalcomponent* comp); icaltimezone* (*icalcomponent_get_timezone) (icalcomponent* comp, const char *tzid); const char* (*icalcomponent_get_location) (icalcomponent* comp); const char* (*icalcomponent_get_summary) (icalcomponent* comp); const char* (*icalcomponent_get_uid) (icalcomponent* comp); struct icaltimetype (*icalcomponent_get_dtstart)(icalcomponent* comp); void (*icalcomponent_set_dtstart)(icalcomponent* comp, struct icaltimetype v); icalcomponent_kind (*icalcomponent_isa) (const icalcomponent* component); icalcomponent* (*icalcomponent_new_clone) (icalcomponent* component); icalcomponent* (*icalcomponent_new_from_string) (char* str); icalcomponent* (*icalcomponent_new) (icalcomponent_kind kind); void (*icalcomponent_merge_component) (icalcomponent* component, icalcomponent *comp_to_merge); void (*icalcomponent_remove_component) (icalcomponent* component, icalcomponent *comp_to_remove); void (*icalcomponent_remove_property) (icalcomponent* component, icalproperty* property); void (*icalcomponent_set_uid) (icalcomponent* comp, const char* v); void (*icalcomponent_set_recurrenceid)(icalcomponent* comp, struct icaltimetype v); icalcomponent* (*icalcomponent_vanew) (icalcomponent_kind kind, ...); const char* (*icalparameter_get_tzid) (const icalparameter* value); void (*icalparameter_set_tzid) (icalparameter* value, const char* v); icalparameter *(*icalparameter_new_from_value_string)(icalparameter_kind kind, const char *value); icalparameter *(*icalparameter_new_clone)(icalparameter *param); icalproperty *(*icalproperty_new_clone)(icalproperty *prop); void (*icalproperty_free)(icalproperty *prop); const char* (*icalproperty_get_description) (const icalproperty* prop); const char* (*icalproperty_get_property_name) (const icalproperty* prop); const char* (*icalproperty_get_uid) (const icalproperty* prop); struct icaltimetype (*icalproperty_get_recurrenceid) (const icalproperty* prop); void (*icalproperty_set_recurrenceid) (const icalproperty* prop, icaltimetype rid); int (*icalproperty_get_sequence) (const icalproperty* prop); icalparameter* (*icalproperty_get_first_parameter) (icalproperty* prop, icalparameter_kind kind); struct icaltimetype (*icalproperty_get_lastmodified) (const icalproperty* prop); icalparameter* (*icalproperty_get_next_parameter) (icalproperty* prop, icalparameter_kind kind); void (*icalproperty_set_parameter)(icalproperty *prop, icalparameter *param); const char* (*icalproperty_get_summary) (const icalproperty* prop); icalproperty* (*icalproperty_new_description) (const char* v); icalproperty* (*icalproperty_new_summary) (const char* v); icalproperty* (*icalproperty_new_sequence) (int v); icalproperty* (*icalproperty_new_uid) (const char* v); icalproperty* (*icalproperty_new_recurrenceid) (icaltimetype v); void (*icalproperty_set_value_from_string) (icalproperty* prop,const char* value, const char* kind); void (*icalproperty_set_dtstamp) (icalproperty* prop, struct icaltimetype v); void (*icalproperty_set_lastmodified) (icalproperty* prop, struct icaltimetype v); void (*icalproperty_set_sequence) (icalproperty* prop, int v); void (*icalproperty_set_uid) (icalproperty* prop, const char *v); void (*icalproperty_remove_parameter_by_kind)(icalproperty* prop, icalparameter_kind kind); void (*icalproperty_add_parameter)(icalproperty* prop,icalparameter* parameter); const char* (*icalproperty_get_value_as_string)(const icalproperty* prop); const char* (*icalproperty_get_x_name)(icalproperty* prop); icalproperty* (*icalproperty_new_from_string)(const char* str); icalproperty* (*icalproperty_new_dtstart)(struct icaltimetype v); icalproperty* (*icalproperty_new_rrule)(struct icalrecurrencetype v); icalproperty* (*icalproperty_new_tzid)(const char* v); icalproperty* (*icalproperty_new_tzname)(const char* v); icalproperty* (*icalproperty_new_tzoffsetfrom)(int v); icalproperty* (*icalproperty_new_tzoffsetto)(int v); icalproperty* (*icalproperty_new_x)(const char* v); void (*icalproperty_set_x_name)(icalproperty* prop, const char* name); void (*icalrecur_iterator_free)(icalrecur_iterator*); icalrecur_iterator* (*icalrecur_iterator_new)(struct icalrecurrencetype rule, struct icaltimetype dtstart); struct icaltimetype (*icalrecur_iterator_next)(icalrecur_iterator*); void (*icalrecurrencetype_clear)(struct icalrecurrencetype *r); int (*icaltime_day_of_week)(const struct icaltimetype t); int (*icaltime_days_in_month)(const int month, const int year); int (*icaltime_is_null_time)(const struct icaltimetype t); int (*icaltime_is_utc)(const struct icaltimetype t); const char* (*icaltime_as_ical_string) (const struct icaltimetype tt); icaltimetype (*icaltime_from_string)(const char* str); icaltimetype (*icaltime_from_timet)(const time_t v, const int is_date); icaltimetype (*icaltime_null_time)(); time_t (*icaltime_as_timet)(const struct icaltimetype); void (*icaltime_set_timezone)(icaltimetype *tt, const icaltimezone *zone); struct icaltimetype (*icaltime_convert_to_zone)(const struct icaltimetype tt, icaltimezone *zone); const icaltimezone *(*icaltime_get_timezone)(const struct icaltimetype t); void (*icaltimezone_free) (icaltimezone *zone, int free_struct); icaltimezone* (*icaltimezone_get_builtin_timezone) (const char *location); icaltimezone* (*icaltimezone_get_builtin_timezone_from_tzid) (const char *tzid); icalcomponent* (*icaltimezone_get_component) (icaltimezone *zone); char* (*icaltimezone_get_tzid) (icaltimezone *zone); icaltimezone *(*icaltimezone_new) (void); int (*icaltimezone_set_component) (icaltimezone *zone, icalcomponent *comp); const char* (*icaltimezone_get_location) (icaltimezone *zone); void (*icalerror_set_errno)(icalerrorenum x); const char *(*icaltzutil_get_zone_directory)(void); const char **ical_tzid_prefix; // Optional, added in libical.so.1. Can't be called be like this, // we merely check for the method to detect the ABI. void (*icalparameter_new_scheduleagent)(void); // optional variants which allocate the returned string for us const char* (*icaltime_as_ical_string_r) (const struct icaltimetype tt); char* (*icalcomponent_as_ical_string_r) (icalcomponent* component); char* (*icalproperty_get_value_as_string_r) (const icalproperty* prop); # endif /* ENABLE_ICAL */ # ifdef ENABLE_BLUETOOTH int (*sdp_close)(sdp_session_t *session); sdp_session_t *(*sdp_connect)(const bdaddr_t *src, const bdaddr_t *dst, uint32_t flags); /** libbluetooth.so.2 version of sdp_extract_pdu() */ sdp_record_t *(*sdp_extract_pdu)(const uint8_t *pdata, int *scanned); /** alternate version of sdp_extract_pdu() only found in some releases of libbluetooth.so.2 */ sdp_record_t *(*sdp_extract_pdu_safe)(const uint8_t *pdata, int bufsize, int *scanned); /** libbluetooth.so.2 version of sdp_extract_seqtype() */ int (*sdp_extract_seqtype)(const uint8_t *buf, uint8_t *dtdp, int *size); /** alternate version of sdp_extract_seqtype() only found in some releases of libbluetooth.so.2 */ int (*sdp_extract_seqtype_safe)(const uint8_t *buf, int bufsize, uint8_t *dtdp, int *size); int (*sdp_get_access_protos)(const sdp_record_t *rec, sdp_list_t **protos); int (*sdp_get_proto_port)(const sdp_list_t *list, int proto); int (*sdp_get_socket)(const sdp_session_t *session); sdp_list_t *(*sdp_list_append)(sdp_list_t *list, void *d); void (*sdp_list_free)(sdp_list_t *list, sdp_free_func_t f); int (*sdp_process)(sdp_session_t *session); void (*sdp_record_free)(sdp_record_t *rec); int (*sdp_service_search_attr_async)(sdp_session_t *session, const sdp_list_t *search, sdp_attrreq_type_t reqtype, const sdp_list_t *attrid_list); int (*sdp_set_notify)(sdp_session_t *session, sdp_callback_t *func, void *udata); uuid_t *(*sdp_uuid128_create)(uuid_t *uuid, const void *data); int (*str2ba)(const char *str, bdaddr_t *ba); # endif /* ENABLE_BLUETOOTH */ int initialized; }; extern struct EDSAbiWrapper EDSAbiWrapperSingleton; # ifndef EDS_ABI_WRAPPER_NO_REDEFINE # ifdef HAVE_EDS # define e_source_get_type EDSAbiWrapperSingleton.e_source_get_type # define e_source_get_uri EDSAbiWrapperSingleton.e_source_get_uri # define e_source_group_get_type EDSAbiWrapperSingleton.e_source_group_get_type # define e_source_group_peek_sources EDSAbiWrapperSingleton.e_source_group_peek_sources # define e_source_list_peek_groups EDSAbiWrapperSingleton.e_source_list_peek_groups # define e_source_peek_name EDSAbiWrapperSingleton.e_source_peek_name # endif /* HAVE_EDS */ # ifdef ENABLE_EBOOK # define e_book_add_contact EDSAbiWrapperSingleton.e_book_add_contact # define e_book_authenticate_user EDSAbiWrapperSingleton.e_book_authenticate_user # define e_book_commit_contact EDSAbiWrapperSingleton.e_book_commit_contact # define e_contact_duplicate EDSAbiWrapperSingleton.e_contact_duplicate # define e_contact_get_const EDSAbiWrapperSingleton.e_contact_get_const # define e_contact_get EDSAbiWrapperSingleton.e_contact_get # define e_contact_name_free EDSAbiWrapperSingleton.e_contact_name_free # define e_contact_get_type EDSAbiWrapperSingleton.e_contact_get_type # define e_contact_new_from_vcard EDSAbiWrapperSingleton.e_contact_new_from_vcard # define e_contact_set EDSAbiWrapperSingleton.e_contact_set # define e_book_error_quark EDSAbiWrapperSingleton.e_book_error_quark # define e_book_get_addressbooks EDSAbiWrapperSingleton.e_book_get_addressbooks # define e_book_get_changes EDSAbiWrapperSingleton.e_book_get_changes # define e_book_get_contact EDSAbiWrapperSingleton.e_book_get_contact # define e_book_get_contacts EDSAbiWrapperSingleton.e_book_get_contacts # define e_book_get_supported_auth_methods EDSAbiWrapperSingleton.e_book_get_supported_auth_methods # define e_book_get_uri EDSAbiWrapperSingleton.e_book_get_uri # define e_book_new EDSAbiWrapperSingleton.e_book_new # define e_book_new_default_addressbook EDSAbiWrapperSingleton.e_book_new_default_addressbook # define e_book_new_from_uri EDSAbiWrapperSingleton.e_book_new_from_uri # define e_book_new_system_addressbook EDSAbiWrapperSingleton.e_book_new_system_addressbook # define e_book_open EDSAbiWrapperSingleton.e_book_open # define e_book_query_any_field_contains EDSAbiWrapperSingleton.e_book_query_any_field_contains # define e_book_query_unref EDSAbiWrapperSingleton.e_book_query_unref # define e_book_remove_contact EDSAbiWrapperSingleton.e_book_remove_contact # define e_vcard_to_string EDSAbiWrapperSingleton.e_vcard_to_string # define e_contact_inline_local_photos EDSAbiWrapperSingleton.e_contact_inline_local_photos # endif /* ENABLE_EBOOK */ # ifdef ENABLE_ECAL # define e_cal_add_timezone EDSAbiWrapperSingleton.e_cal_add_timezone # define e_cal_component_get_icalcomponent EDSAbiWrapperSingleton.e_cal_component_get_icalcomponent # define e_cal_component_get_last_modified EDSAbiWrapperSingleton.e_cal_component_get_last_modified # define e_cal_component_get_type EDSAbiWrapperSingleton.e_cal_component_get_type # define e_cal_create_object EDSAbiWrapperSingleton.e_cal_create_object # define e_calendar_error_quark EDSAbiWrapperSingleton.e_calendar_error_quark # define e_cal_get_component_as_string EDSAbiWrapperSingleton.e_cal_get_component_as_string # define e_cal_get_object EDSAbiWrapperSingleton.e_cal_get_object # define e_cal_get_object_list_as_comp EDSAbiWrapperSingleton.e_cal_get_object_list_as_comp # define e_cal_get_sources EDSAbiWrapperSingleton.e_cal_get_sources # define e_cal_get_timezone EDSAbiWrapperSingleton.e_cal_get_timezone # define e_cal_modify_object EDSAbiWrapperSingleton.e_cal_modify_object # define e_cal_new EDSAbiWrapperSingleton.e_cal_new # define e_cal_new_from_uri EDSAbiWrapperSingleton.e_cal_new_from_uri # define e_cal_new_system_calendar EDSAbiWrapperSingleton.e_cal_new_system_calendar # define e_cal_new_system_tasks EDSAbiWrapperSingleton.e_cal_new_system_tasks # define e_cal_get_uri EDSAbiWrapperSingleton.e_cal_get_uri # define e_cal_open EDSAbiWrapperSingleton.e_cal_open # define e_cal_remove_object EDSAbiWrapperSingleton.e_cal_remove_object # define e_cal_remove_object_with_mod EDSAbiWrapperSingleton.e_cal_remove_object_with_mod # define e_cal_set_auth_func EDSAbiWrapperSingleton.e_cal_set_auth_func # endif /* ENABLE_ECAL */ # ifdef ENABLE_ICAL # define icalcomponent_add_component EDSAbiWrapperSingleton.icalcomponent_add_component # define icalcomponent_add_property EDSAbiWrapperSingleton.icalcomponent_add_property # define icalcomponent_as_ical_string (EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r ? EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r : EDSAbiWrapperSingleton.icalcomponent_as_ical_string) # define icalcomponent_free EDSAbiWrapperSingleton.icalcomponent_free # define icalcomponent_get_first_component EDSAbiWrapperSingleton.icalcomponent_get_first_component # define icalcomponent_get_first_property EDSAbiWrapperSingleton.icalcomponent_get_first_property # define icalcomponent_get_next_component EDSAbiWrapperSingleton.icalcomponent_get_next_component # define icalcomponent_get_next_property EDSAbiWrapperSingleton.icalcomponent_get_next_property # define icalcomponent_get_recurrenceid EDSAbiWrapperSingleton.icalcomponent_get_recurrenceid # define icalcomponent_get_timezone EDSAbiWrapperSingleton.icalcomponent_get_timezone # define icalcomponent_get_location EDSAbiWrapperSingleton.icalcomponent_get_location # define icalcomponent_get_summary EDSAbiWrapperSingleton.icalcomponent_get_summary # define icalcomponent_get_uid EDSAbiWrapperSingleton.icalcomponent_get_uid # define icalcomponent_get_dtstart EDSAbiWrapperSingleton.icalcomponent_get_dtstart # define icalcomponent_set_dtstart EDSAbiWrapperSingleton.icalcomponent_set_dtstart # define icalcomponent_isa EDSAbiWrapperSingleton.icalcomponent_isa # define icalcomponent_new_clone EDSAbiWrapperSingleton.icalcomponent_new_clone # define icalcomponent_new_from_string EDSAbiWrapperSingleton.icalcomponent_new_from_string # define icalcomponent_new EDSAbiWrapperSingleton.icalcomponent_new # define icalcomponent_merge_component EDSAbiWrapperSingleton.icalcomponent_merge_component # define icalcomponent_remove_component EDSAbiWrapperSingleton.icalcomponent_remove_component # define icalcomponent_remove_property EDSAbiWrapperSingleton.icalcomponent_remove_property # define icalcomponent_set_uid EDSAbiWrapperSingleton.icalcomponent_set_uid # define icalcomponent_set_recurrenceid EDSAbiWrapperSingleton.icalcomponent_set_recurrenceid # define icalcomponent_vanew EDSAbiWrapperSingleton.icalcomponent_vanew # define icalparameter_get_tzid EDSAbiWrapperSingleton.icalparameter_get_tzid # define icalparameter_set_tzid EDSAbiWrapperSingleton.icalparameter_set_tzid # define icalparameter_new_from_value_string EDSAbiWrapperSingleton.icalparameter_new_from_value_string # define icalparameter_new_clone EDSAbiWrapperSingleton.icalparameter_new_clone # define icalproperty_new_clone EDSAbiWrapperSingleton.icalproperty_new_clone # define icalproperty_free EDSAbiWrapperSingleton.icalproperty_free # define icalproperty_get_description EDSAbiWrapperSingleton.icalproperty_get_description # define icalproperty_get_uid EDSAbiWrapperSingleton.icalproperty_get_uid # define icalproperty_get_recurrenceid EDSAbiWrapperSingleton.icalproperty_get_recurrenceid # define icalproperty_set_recurrenceid EDSAbiWrapperSingleton.icalproperty_set_recurrenceid # define icalproperty_get_sequence EDSAbiWrapperSingleton.icalproperty_get_sequence # define icalproperty_get_property_name EDSAbiWrapperSingleton.icalproperty_get_property_name # define icalproperty_get_first_parameter EDSAbiWrapperSingleton.icalproperty_get_first_parameter # define icalproperty_get_lastmodified EDSAbiWrapperSingleton.icalproperty_get_lastmodified # define icalproperty_get_next_parameter EDSAbiWrapperSingleton.icalproperty_get_next_parameter # define icalproperty_set_parameter EDSAbiWrapperSingleton.icalproperty_set_parameter # define icalproperty_get_summary EDSAbiWrapperSingleton.icalproperty_get_summary # define icalproperty_new_description EDSAbiWrapperSingleton.icalproperty_new_description # define icalproperty_new_summary EDSAbiWrapperSingleton.icalproperty_new_summary # define icalproperty_new_uid EDSAbiWrapperSingleton.icalproperty_new_uid # define icalproperty_new_sequence EDSAbiWrapperSingleton.icalproperty_new_sequence # define icalproperty_new_recurrenceid EDSAbiWrapperSingleton.icalproperty_new_recurrenceid # define icalproperty_set_value_from_string EDSAbiWrapperSingleton.icalproperty_set_value_from_string # define icalproperty_set_dtstamp EDSAbiWrapperSingleton.icalproperty_set_dtstamp # define icalproperty_set_lastmodified EDSAbiWrapperSingleton.icalproperty_set_lastmodified # define icalproperty_set_sequence EDSAbiWrapperSingleton.icalproperty_set_sequence # define icalproperty_set_uid EDSAbiWrapperSingleton.icalproperty_set_uid # define icalproperty_remove_parameter_by_kind EDSAbiWrapperSingleton.icalproperty_remove_parameter_by_kind # define icalproperty_add_parameter EDSAbiWrapperSingleton.icalproperty_add_parameter # define icalproperty_get_value_as_string (EDSAbiWrapperSingleton.icalproperty_get_value_as_string_r ? EDSAbiWrapperSingleton.icalproperty_get_value_as_string_r : (char *(*)(const icalproperty*))EDSAbiWrapperSingleton.icalproperty_get_value_as_string) # define icalproperty_get_x_name EDSAbiWrapperSingleton.icalproperty_get_x_name # define icalproperty_new_from_string EDSAbiWrapperSingleton.icalproperty_new_from_string # define icaltime_is_null_time EDSAbiWrapperSingleton.icaltime_is_null_time # define icaltime_is_utc EDSAbiWrapperSingleton.icaltime_is_utc # define icaltime_as_ical_string (EDSAbiWrapperSingleton.icaltime_as_ical_string_r ? EDSAbiWrapperSingleton.icaltime_as_ical_string_r : EDSAbiWrapperSingleton.icaltime_as_ical_string) # define icaltime_from_string EDSAbiWrapperSingleton.icaltime_from_string # define icaltime_from_timet EDSAbiWrapperSingleton.icaltime_from_timet # define icaltime_null_time EDSAbiWrapperSingleton.icaltime_null_time # define icaltime_as_timet EDSAbiWrapperSingleton.icaltime_as_timet # define icaltime_set_timezone EDSAbiWrapperSingleton.icaltime_set_timezone # define icaltime_convert_to_zone EDSAbiWrapperSingleton.icaltime_convert_to_zone # define icaltime_get_timezone EDSAbiWrapperSingleton.icaltime_get_timezone # define icaltimezone_free EDSAbiWrapperSingleton.icaltimezone_free # define icaltimezone_get_builtin_timezone EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone # define icaltimezone_get_builtin_timezone_from_tzid EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone_from_tzid # define icaltimezone_get_component EDSAbiWrapperSingleton.icaltimezone_get_component # define icaltimezone_get_tzid EDSAbiWrapperSingleton.icaltimezone_get_tzid # define icaltimezone_new EDSAbiWrapperSingleton.icaltimezone_new # define icaltimezone_set_component EDSAbiWrapperSingleton.icaltimezone_set_component # define icaltimezone_get_location EDSAbiWrapperSingleton.icaltimezone_get_location # define ical_tzid_prefix (*EDSAbiWrapperSingleton.ical_tzid_prefix) # define icalerror_set_errno EDSAbiWrapperSingleton.icalerror_set_errno # define icalproperty_new_dtstart EDSAbiWrapperSingleton.icalproperty_new_dtstart # define icalproperty_new_rrule EDSAbiWrapperSingleton.icalproperty_new_rrule # define icalproperty_new_tzid EDSAbiWrapperSingleton.icalproperty_new_tzid # define icalproperty_new_tzname EDSAbiWrapperSingleton.icalproperty_new_tzname # define icalproperty_new_tzoffsetfrom EDSAbiWrapperSingleton.icalproperty_new_tzoffsetfrom # define icalproperty_new_tzoffsetto EDSAbiWrapperSingleton.icalproperty_new_tzoffsetto # define icalproperty_new_x EDSAbiWrapperSingleton.icalproperty_new_x # define icalproperty_set_x_name EDSAbiWrapperSingleton.icalproperty_set_x_name # define icalrecur_iterator_free EDSAbiWrapperSingleton.icalrecur_iterator_free # define icalrecur_iterator_new EDSAbiWrapperSingleton.icalrecur_iterator_new # define icalrecur_iterator_next EDSAbiWrapperSingleton.icalrecur_iterator_next # define icalrecurrencetype_clear EDSAbiWrapperSingleton.icalrecurrencetype_clear # define icaltime_day_of_week EDSAbiWrapperSingleton.icaltime_day_of_week # define icaltime_days_in_month EDSAbiWrapperSingleton.icaltime_days_in_month # define icaltzutil_get_zone_directory EDSAbiWrapperSingleton.icaltzutil_get_zone_directory # endif /* ENABLE_ICAL */ # ifdef ENABLE_BLUETOOTH # define sdp_close EDSAbiWrapperSingleton.sdp_close # define sdp_connect EDSAbiWrapperSingleton.sdp_connect # define sdp_extract_pdu do_not_use_sdp_extract_pdu # define sdp_extract_pdu_safe EDSAbiWrapperSingleton.sdp_extract_pdu_safe # define sdp_extract_seqtype do_not_use_sdp_extract_seqtype # define sdp_extract_seqtype_safe EDSAbiWrapperSingleton.sdp_extract_seqtype_safe # define sdp_get_access_protos EDSAbiWrapperSingleton.sdp_get_access_protos # define sdp_get_proto_port EDSAbiWrapperSingleton.sdp_get_proto_port # define sdp_get_socket EDSAbiWrapperSingleton.sdp_get_socket # define sdp_list_append EDSAbiWrapperSingleton.sdp_list_append # define sdp_list_free EDSAbiWrapperSingleton.sdp_list_free # define sdp_process EDSAbiWrapperSingleton.sdp_process # define sdp_record_free EDSAbiWrapperSingleton.sdp_record_free # define sdp_service_search_attr_async EDSAbiWrapperSingleton.sdp_service_search_attr_async # define sdp_set_notify EDSAbiWrapperSingleton.sdp_set_notify # define sdp_uuid128_create EDSAbiWrapperSingleton.sdp_uuid128_create # define str2ba EDSAbiWrapperSingleton.str2ba # endif /* ENABLE_BLUETOOTH */ # endif /* EDS_ABI_WRAPPER_NO_REDEFINE */ #else /* EVOLUTION_COMPATIBILITY */ // This is necessary because in C++, 1 && 1 triggers // a warning with some gcc versions. #ifdef __cplusplus # define EDS_ABI_HACK_TRUE true #else # define EDS_ABI_HACK_TRUE 1 #endif # define EDSAbiHaveEbook EDS_ABI_HACK_TRUE # define EDSAbiHaveEcal EDS_ABI_HACK_TRUE # define EDSAbiHaveEdataserver EDS_ABI_HACK_TRUE # define EDSAbiHaveIcal EDS_ABI_HACK_TRUE # define SyncEvoHaveLibbluetooth EDS_ABI_HACK_TRUE # if !defined(EDS_ABI_WRAPPER_NO_REDEFINE) && defined(HAVE_LIBICAL_R) # ifdef ENABLE_ICAL # ifndef LIBICAL_MEMFIXES /* This changes the semantic of the normal functions the same way as libecal did. */ # define LIBICAL_MEMFIXES 1 # define icaltime_as_ical_string icaltime_as_ical_string_r # define icalcomponent_as_ical_string icalcomponent_as_ical_string_r # define icalproperty_get_value_as_string icalproperty_get_value_as_string_r # endif /* LIBICAL_MEMFIXES */ # endif /* ENABLE_ICAL */ # endif /* EDS_ABI_WRAPPER_NO_REDEFINE */ #endif /* EVOLUTION_COMPATIBILITY */ #if defined(EVOLUTION_ICAL_COMPATIBILITY) && defined(ENABLE_ICAL) /* * libical.so.1 inserted a new ICAL_ACKNOWLEDGED_PROPERTY at the start of the enum, * causing a renumbering of the constants. We need to map the names to the right constants * at runtime. * * Opening libical.so.1 instead of libical.so.0 is orthogonal to this: * it can be done either via dlopen() with EVOLUTION_COMPATIBILITY, or * by patching a shared library which was originally linked against * libical.so.0. * * unchanged: ICAL_ANY_PROPERTY = 0, * new, cannot depend on it: ICAL_ACKNOWLEDGED_PROPERTY, * * These are the original enum values from libical.so.0: */ enum { EDSABI_ICAL_ACTION_PROPERTY = 1, EDSABI_ICAL_ALLOWCONFLICT_PROPERTY, EDSABI_ICAL_ATTACH_PROPERTY, EDSABI_ICAL_ATTENDEE_PROPERTY, EDSABI_ICAL_CALID_PROPERTY, EDSABI_ICAL_CALMASTER_PROPERTY, EDSABI_ICAL_CALSCALE_PROPERTY, EDSABI_ICAL_CAPVERSION_PROPERTY, EDSABI_ICAL_CARLEVEL_PROPERTY, EDSABI_ICAL_CARID_PROPERTY, EDSABI_ICAL_CATEGORIES_PROPERTY, EDSABI_ICAL_CLASS_PROPERTY, EDSABI_ICAL_CMD_PROPERTY, EDSABI_ICAL_COMMENT_PROPERTY, EDSABI_ICAL_COMPLETED_PROPERTY, EDSABI_ICAL_COMPONENTS_PROPERTY, EDSABI_ICAL_CONTACT_PROPERTY, EDSABI_ICAL_CREATED_PROPERTY, EDSABI_ICAL_CSID_PROPERTY, EDSABI_ICAL_DATEMAX_PROPERTY, EDSABI_ICAL_DATEMIN_PROPERTY, EDSABI_ICAL_DECREED_PROPERTY, EDSABI_ICAL_DEFAULTCHARSET_PROPERTY, EDSABI_ICAL_DEFAULTLOCALE_PROPERTY, EDSABI_ICAL_DEFAULTTZID_PROPERTY, EDSABI_ICAL_DEFAULTVCARS_PROPERTY, EDSABI_ICAL_DENY_PROPERTY, EDSABI_ICAL_DESCRIPTION_PROPERTY, EDSABI_ICAL_DTEND_PROPERTY, EDSABI_ICAL_DTSTAMP_PROPERTY, EDSABI_ICAL_DTSTART_PROPERTY, EDSABI_ICAL_DUE_PROPERTY, EDSABI_ICAL_DURATION_PROPERTY, EDSABI_ICAL_EXDATE_PROPERTY, EDSABI_ICAL_EXPAND_PROPERTY, EDSABI_ICAL_EXRULE_PROPERTY, EDSABI_ICAL_FREEBUSY_PROPERTY, EDSABI_ICAL_GEO_PROPERTY, EDSABI_ICAL_GRANT_PROPERTY, EDSABI_ICAL_ITIPVERSION_PROPERTY, EDSABI_ICAL_LASTMODIFIED_PROPERTY, EDSABI_ICAL_LOCATION_PROPERTY, EDSABI_ICAL_MAXCOMPONENTSIZE_PROPERTY, EDSABI_ICAL_MAXDATE_PROPERTY, EDSABI_ICAL_MAXRESULTS_PROPERTY, EDSABI_ICAL_MAXRESULTSSIZE_PROPERTY, EDSABI_ICAL_METHOD_PROPERTY, EDSABI_ICAL_MINDATE_PROPERTY, EDSABI_ICAL_MULTIPART_PROPERTY, EDSABI_ICAL_NAME_PROPERTY, EDSABI_ICAL_ORGANIZER_PROPERTY, EDSABI_ICAL_OWNER_PROPERTY, EDSABI_ICAL_PERCENTCOMPLETE_PROPERTY, EDSABI_ICAL_PERMISSION_PROPERTY, EDSABI_ICAL_PRIORITY_PROPERTY, EDSABI_ICAL_PRODID_PROPERTY, EDSABI_ICAL_QUERY_PROPERTY, EDSABI_ICAL_QUERYLEVEL_PROPERTY, EDSABI_ICAL_QUERYID_PROPERTY, EDSABI_ICAL_QUERYNAME_PROPERTY, EDSABI_ICAL_RDATE_PROPERTY, EDSABI_ICAL_RECURACCEPTED_PROPERTY, EDSABI_ICAL_RECUREXPAND_PROPERTY, EDSABI_ICAL_RECURLIMIT_PROPERTY, EDSABI_ICAL_RECURRENCEID_PROPERTY, EDSABI_ICAL_RELATEDTO_PROPERTY, EDSABI_ICAL_RELCALID_PROPERTY, EDSABI_ICAL_REPEAT_PROPERTY, EDSABI_ICAL_REQUESTSTATUS_PROPERTY, EDSABI_ICAL_RESOURCES_PROPERTY, EDSABI_ICAL_RESTRICTION_PROPERTY, EDSABI_ICAL_RRULE_PROPERTY, EDSABI_ICAL_SCOPE_PROPERTY, EDSABI_ICAL_SEQUENCE_PROPERTY, EDSABI_ICAL_STATUS_PROPERTY, EDSABI_ICAL_STORESEXPANDED_PROPERTY, EDSABI_ICAL_SUMMARY_PROPERTY, EDSABI_ICAL_TARGET_PROPERTY, EDSABI_ICAL_TRANSP_PROPERTY, EDSABI_ICAL_TRIGGER_PROPERTY, EDSABI_ICAL_TZID_PROPERTY, EDSABI_ICAL_TZNAME_PROPERTY, EDSABI_ICAL_TZOFFSETFROM_PROPERTY, EDSABI_ICAL_TZOFFSETTO_PROPERTY, EDSABI_ICAL_TZURL_PROPERTY, EDSABI_ICAL_UID_PROPERTY, EDSABI_ICAL_URL_PROPERTY, EDSABI_ICAL_VERSION_PROPERTY, EDSABI_ICAL_X_PROPERTY, EDSABI_ICAL_XLICCLASS_PROPERTY, EDSABI_ICAL_XLICCLUSTERCOUNT_PROPERTY, EDSABI_ICAL_XLICERROR_PROPERTY, EDSABI_ICAL_XLICMIMECHARSET_PROPERTY, EDSABI_ICAL_XLICMIMECID_PROPERTY, EDSABI_ICAL_XLICMIMECONTENTTYPE_PROPERTY, EDSABI_ICAL_XLICMIMEENCODING_PROPERTY, EDSABI_ICAL_XLICMIMEFILENAME_PROPERTY, EDSABI_ICAL_XLICMIMEOPTINFO_PROPERTY, EDSABI_ICAL_NO_PROPERTY }; /* * The defines rely on EDSAbiHaveIcal1 == 0 for libical.so.0 (= original enum value used * unchanged) and EDSAbiHaveIcal1 == 1 for libical.so.1 (original value has to be incremented * by one). */ # define ICAL_ACTION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_ACTION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_ALLOWCONFLICT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_ALLOWCONFLICT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_ATTACH_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_ATTACH_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_ATTENDEE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_ATTENDEE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CALID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CALID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CALMASTER_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CALMASTER_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CALSCALE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CALSCALE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CAPVERSION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CAPVERSION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CARLEVEL_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CARLEVEL_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CARID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CARID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CATEGORIES_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CATEGORIES_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CLASS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CLASS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CMD_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CMD_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_COMMENT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_COMMENT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_COMPLETED_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_COMPLETED_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_COMPONENTS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_COMPONENTS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CONTACT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CONTACT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CREATED_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CREATED_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_CSID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_CSID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DATEMAX_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DATEMAX_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DATEMIN_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DATEMIN_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DECREED_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DECREED_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DEFAULTCHARSET_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DEFAULTCHARSET_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DEFAULTLOCALE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DEFAULTLOCALE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DEFAULTTZID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DEFAULTTZID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DEFAULTVCARS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DEFAULTVCARS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DENY_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DENY_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DESCRIPTION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DESCRIPTION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DTEND_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DTEND_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DTSTAMP_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DTSTAMP_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DTSTART_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DTSTART_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DUE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DUE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_DURATION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_DURATION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_EXDATE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_EXDATE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_EXPAND_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_EXPAND_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_EXRULE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_EXRULE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_FREEBUSY_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_FREEBUSY_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_GEO_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_GEO_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_GRANT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_GRANT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_ITIPVERSION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_ITIPVERSION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_LASTMODIFIED_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_LASTMODIFIED_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_LOCATION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_LOCATION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_MAXCOMPONENTSIZE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_MAXCOMPONENTSIZE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_MAXDATE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_MAXDATE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_MAXRESULTS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_MAXRESULTS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_MAXRESULTSSIZE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_MAXRESULTSSIZE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_METHOD_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_METHOD_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_MINDATE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_MINDATE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_MULTIPART_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_MULTIPART_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_NAME_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_NAME_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_ORGANIZER_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_ORGANIZER_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_OWNER_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_OWNER_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_PERCENTCOMPLETE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_PERCENTCOMPLETE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_PERMISSION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_PERMISSION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_PRIORITY_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_PRIORITY_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_PRODID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_PRODID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_QUERY_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_QUERY_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_QUERYLEVEL_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_QUERYLEVEL_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_QUERYID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_QUERYID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_QUERYNAME_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_QUERYNAME_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RDATE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RDATE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RECURACCEPTED_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RECURACCEPTED_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RECUREXPAND_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RECUREXPAND_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RECURLIMIT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RECURLIMIT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RECURRENCEID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RECURRENCEID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RELATEDTO_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RELATEDTO_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RELCALID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RELCALID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_REPEAT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_REPEAT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_REQUESTSTATUS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_REQUESTSTATUS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RESOURCES_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RESOURCES_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RESTRICTION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RESTRICTION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_RRULE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_RRULE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_SCOPE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_SCOPE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_SEQUENCE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_SEQUENCE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_STATUS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_STATUS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_STORESEXPANDED_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_STORESEXPANDED_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_SUMMARY_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_SUMMARY_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TARGET_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TARGET_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TRANSP_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TRANSP_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TRIGGER_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TRIGGER_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TZID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TZID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TZNAME_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TZNAME_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TZOFFSETFROM_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TZOFFSETFROM_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TZOFFSETTO_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TZOFFSETTO_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_TZURL_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_TZURL_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_UID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_UID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_URL_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_URL_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_VERSION_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_VERSION_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_X_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_X_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICCLASS_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICCLASS_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICCLUSTERCOUNT_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICCLUSTERCOUNT_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICERROR_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICERROR_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICMIMECHARSET_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICMIMECHARSET_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICMIMECID_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICMIMECID_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICMIMECONTENTTYPE_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICMIMECONTENTTYPE_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICMIMEENCODING_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICMIMEENCODING_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICMIMEFILENAME_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICMIMEFILENAME_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_XLICMIMEOPTINFO_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_XLICMIMEOPTINFO_PROPERTY + EDSAbiHaveIcal1)) # define ICAL_NO_PROPERTY ((icalproperty_kind)(EDSABI_ICAL_NO_PROPERTY + EDSAbiHaveIcal1)) #endif /* EVOLUTION_ICAL_COMPATIBILITY && ENABLE_ICAL */ const char *EDSAbiWrapperInfo(); const char *EDSAbiWrapperDebug(); #ifdef __cplusplus } #endif #endif /* INCL_EDS_ABI_WRAPPER */ syncevolution-1.5/src/syncevo/icalstrdup.h0000644000373300001540000000721612326412403022321 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef ICALSTRDUP_H #define ICALSTRDUP_H #ifdef HAVE_CONFIG_H # include #endif #ifdef ENABLE_ICAL #ifndef HANDLE_LIBICAL_MEMORY # define HANDLE_LIBICAL_MEMORY 1 #endif #include #include #ifdef __cplusplus extern "C" { #pragma } #endif /* __cplusplus */ #if !defined(LIBICAL_MEMFIXES) || defined(EVOLUTION_COMPATIBILITY) /** * The patch in http://bugzilla.gnome.org/show_bug.cgi?id=516408 * changes the ownership of strings returned by some libical and libecal * functions: previously, the memory was owned by the library. * After the patch the caller owns the copied string and must free it. * * The upstream SourceForge libical has incorporated the patch, but * without changing the semantic of the existing calls. Instead they * added _r variants which return memory that the caller must free. * As soon as Evolution switches to upstream libical (planned for 2.25), * it probably will have to bump the libecal version because the API * is reverted so that binaries which free strings will crash. * When EVOLUTION_COMPATIBILITY is defined, SyncEvolution deals with * this by always checking at runtime what the memory handling is. * * This utility function ensures that the caller *always* owns the * returned string. When compiled against a current Evolution * Dataserver, the function becomes a NOP macro, unless compatibility * mode is on (in which case the current binary might later run with * an older Evolution release!). If not a NOP macro, then the function * duplicates the string; it handles NULL by passing it through. * * When compiled against an old Evolution Dataserver, then a runtime * check can be enabled to to determine whether the string needs to be * duplicated. If uncertain, it always duplicates the string. If the * check fails, then memory is leaked, which also happens when running * programs which do not know about the patch. * * To enable the runtime check, compile the .c file with -D_GNU_SOURCE * and -DHAVE_DLFCN_H. If HAVE_CONFIG_H is set, then config.h is included * and can be set to set some of these defines. If enabled, then link with * -ldl. * * ical_strdup() must be wrapped around the following functions: * - icalreqstattype_as_string * - icalproperty_as_ical_string * - icalproperty_get_parameter_as_string * - icalproperty_get_value_as_string * - icallangbind_property_eval_string * - icalperiodtype_as_ical_string * - icaltime_as_ical_string * - icalvalue_as_ical_string * - icalcomponent_as_ical_string * - e_cal_component_get_recurid_as_string * * @param x result of one of the functions above * @return string which has to be freed by caller, may be NULL if x was NULL */ extern char *ical_strdup(const char *x); #else # define ical_strdup(_x) (_x) #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* ENABLE_ICAL */ #endif /* ICALSTRDUP_H */ syncevolution-1.5/src/syncevo/SmartPtr.h0000644000373300001540000001451612326412403021724 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_SMART_POINTER #define INCL_EVOLUTION_SMART_POINTER #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #ifdef HAVE_GLIB # include #endif #include #include #include #include #include #include #include SE_BEGIN_CXX template class UnrefFree { public: static void unref(T *pointer) { free(pointer); } }; class Unref { public: /** * C character string - beware, Funambol C++ client library strings must * be returned with delete [], use boost::scoped_array */ static void unref(char *pointer) { free(pointer); } #ifdef HAVE_GLIB static void unref(GObject *pointer) { g_object_unref(pointer); } /** free a list of GObject and the objects */ static void unref(GList *pointer) { if (pointer) { GList *next = pointer; do { g_object_unref(G_OBJECT(next->data)); next = next->next; } while (next); g_list_free(pointer); } } #ifdef ENABLE_EBOOK static void unref(EBookQuery *pointer) { e_book_query_unref(pointer); } #endif // ENABLE_EBOOK #endif // HAVE_GLIB #ifdef ENABLE_ICAL static void unref(icalcomponent *pointer) { icalcomponent_free(pointer); } static void unref(icalproperty *pointer) { icalproperty_free(pointer); } static void unref(icalparameter *pointer) { icalparameter_free(pointer); } static void unref(icaltimezone *pointer) { icaltimezone_free(pointer, 1); } #endif // ENABLE_ICAL }; #ifdef HAVE_GLIB class UnrefGLibEvent { public: static void unref(guint event) { g_source_remove(event); } }; class UnrefGString { public: static void unref(gchar *ptr) { g_free(ptr); } }; #endif // HAVE_GLIB /** * a smart pointer implementation for objects for which * a unref() function exists inside R; * trying to store a NULL object raises an exception, * unreferencing valid objects is done automatically */ template class SmartPtr { protected: T m_pointer; public: /** * create a smart pointer that owns the given object; * passing a NULL pointer and a name for the object raises an error */ SmartPtr(T pointer = 0, const char *objectName = NULL) : m_pointer( pointer ) { if (!pointer && objectName ) { throw std::runtime_error(std::string("Error allocating ") + objectName); } }; ~SmartPtr() { set(0); } /** assignment and copy construction transfer ownership to the copy */ SmartPtr(SmartPtr &other) { m_pointer = other.m_pointer; other.m_pointer = 0; } SmartPtr & operator = (SmartPtr &other) { if (this != &other) { set (other.m_pointer); other.m_pointer = 0; } return *this; } /** * store another object in this pointer, replacing any which was * referenced there before; * passing a NULL pointer and a name for the object raises an error */ void set( T pointer, const char *objectName = NULL ) { if (m_pointer) { R::unref((base)m_pointer); } if (!pointer && objectName) { throw std::runtime_error(std::string("Error allocating ") + objectName); } m_pointer = pointer; } void reset( T pointer = NULL ) { set(pointer, NULL); } /** * transfer ownership over the pointer to caller and stop tracking it: * pointer tracked by smart pointer is set to NULL and the original * pointer is returned */ T release() { T res = m_pointer; m_pointer = 0; return res; } SmartPtr &operator = ( T pointer ) { set( pointer ); return *this; } T get() { return m_pointer; } T operator-> () { return m_pointer; } // T &operator* () { return *m_pointer; } operator T () { return m_pointer; } operator void * () { return (void *)m_pointer; } operator bool () { return m_pointer != 0; } }; template class eptr : public SmartPtr { typedef SmartPtr base_t; public: eptr(T *pointer = NULL, const char *objectName = NULL) : base_t(pointer, objectName) { } eptr &operator = ( T *pointer ) { base_t::set(pointer); return *this; } void reset(T *pointer = NULL) { base_t::set(pointer); } }; template class CxxUnref { public: static void unref(T *pointer) { delete pointer; } }; /** eptr for normal C++ objects */ template class cxxptr : public eptr > { public: cxxptr(T *pointer = NULL, const char *objectName = NULL) : eptr > (pointer, objectName) { }; }; template class ArrayUnref { public: static void unref(T *pointer) { delete [] pointer; } }; /** eptr for array of objects or types */ template class arrayptr : public eptr > { public: arrayptr(T *pointer = NULL, const char *objectName = NULL) : eptr > (pointer, objectName) { }; }; #ifdef HAVE_GLIB /** eptr for glib event handle - not reference counted, owned by at most one instance */ typedef SmartPtr GLibEvent; typedef SmartPtr GStringPtr; // for GMainLoop see GLibSupport.h #endif SE_END_CXX #endif syncevolution-1.5/src/syncevo/ConfigNode.h0000644000373300001540000001747712326412403022174 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_ABSTRACT_CONFIG_NODE # define INCL_EVOLUTION_ABSTRACT_CONFIG_NODE #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX // see ConfigFilter.h class ConfigProps; /** * This class corresponds to the Funambol C++ client * DeviceManagementNode, but offers a slightly different API. See * ConfigTree for details. */ class ConfigNode { public: /** free resources without saving */ virtual ~ConfigNode() {} /** creates a file-backed config node which accepts arbitrary key/value pairs */ static boost::shared_ptr createFileNode(const std::string &filename); /** a name for the node that the user can understand */ virtual std::string getName() const = 0; /** * True if the config node has no persistent storage behind it. * In that case, flush() and setProperty() may as well be skipped. */ virtual bool isVolatile() const = 0; /** * save all changes persistently */ virtual void flush() = 0; /** reload from background storage, discarding in-memory changes */ virtual void reload() {} /** * Returns the value of the given property * * @param property - the property name * @return value of the property or empty string if not set; * also includes whether the property was set */ virtual InitStateString readProperty(const std::string &property) const = 0; /** * Sets a property value. Overloaded, with variations providing * convenience wrappers around it. * * @param property the property name * @param value the property value and whether it is considered * "explicitly set"; if it is not, then the property * shall be removed from the list of properties * @param comment a comment explaining what the property is about, with * \n separating lines; might be used by the backend * when adding a new property * @param defValue Default value in case that value isn't set. * Can be be used by an implementation to annotate * unset properties. */ void setProperty(const std::string &property, const InitStateString &value, const std::string &comment = std::string("")) { writeProperty(property, value, comment); } void setProperty(const std::string &property, const char *value) { setProperty(property, InitStateString(value, true)); } void setProperty(const std::string &property, char *value) { setProperty(property, InitStateString(value, true)); } /** * Sets a boolean property, using "true/false". */ void setProperty(const std::string &property, const InitState &value) { setProperty(property, InitStateString(value ? "true" : "false", value.wasSet())); } void setProperty(const std::string &property, bool value) { setProperty(property, InitState(value, true)); } /** * Sets a property value with automatic conversion to the underlying string, * using stream formatting. */ template void setProperty(const std::string &property, const InitState &value) { std::stringstream strval; strval << value.get(); setProperty(property, InitStateString(strval.str(), value.wasSet())); } template void setProperty(const std::string &property, const T &value) { setProperty(property, InitState(value, true)); } bool getProperty(const std::string &property, std::string &value) const { InitStateString str = readProperty(property); if (str.wasSet()) { value = str; return true; } else { return false; } } bool getProperty(const std::string &property, bool &value) const { InitStateString str = readProperty(property); if (!str.wasSet() || str.empty()) { return false; } /* accept keywords */ if (boost::iequals(str, "true") || boost::iequals(str, "yes") || boost::iequals(str, "on")) { value = true; return true; } if (boost::iequals(str, "false") || boost::iequals(str, "no") || boost::iequals(str, "off")) { value = false; return true; } /* zero means false */ double number; if (getProperty(property, number)) { value = number != 0; return true; } return false; } template bool getProperty(const std::string &property, T &value) const { InitStateString str = readProperty(property); if (!str.wasSet() || str.empty()) { return false; } else { std::stringstream strval(str); strval >> value; return !strval.bad(); } } // defined here for source code backwards compatibility typedef ConfigProps PropsType; /** * Actual implementation of setProperty(). Uses different * different name, to avoid shadowing the setProperty() * variations in derived classes. */ virtual void writeProperty(const std::string &property, const InitStateString &value, const std::string &comment = std::string("")) = 0; /** * Extract all list of all currently defined properties * and their values. Does not include values which were * initialized with their defaults, if the implementation * remembers that. * * @retval props to be filled with key/value pairs; guaranteed * to be empty before the call */ virtual void readProperties(ConfigProps &props) const = 0; /** * Add the given properties. To replace the content of the * node, call clear() first. */ virtual void writeProperties(const ConfigProps &props); /** * Remove a certain property. * * @param property the name of the property which is to be removed */ virtual void removeProperty(const std::string &property) = 0; /** * Remove all properties. */ virtual void clear() = 0; /** * Node exists in backend storage. */ virtual bool exists() const = 0; /** * Node is read-only. Otherwise read-write. */ virtual bool isReadOnly() const = 0; }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/syncevo.am0000664000373300001540000002343612405555067022023 0ustar00nightlynightly00000000000000include $(top_srcdir)/src/syncevo/configs/configs.am # applies to sources in SyncEvolution repository, but not # the Funambol C++ client library src_syncevo_cxxflags = @SYNCEVOLUTION_CXXFLAGS@ src_syncevo_cppflags = @BACKEND_CPPFLAGS@ @GLIB_CFLAGS@ -I$(top_srcdir)/test -I$(gdbus_dir) $(DBUS_CFLAGS) -I$(top_builddir)/src/syncevo -I$(top_srcdir)/src -DSYNCEVO_LIBEXEC=\"$(libexecdir)\" -DSYNCEVO_BACKEND=\"$(BACKENDS_SEARCH_DIRECTORY)\" src_syncevo_ldadd = @SYNCEVOLUTION_LDADD@ # needed in all cases src_syncevo_ldadd += $(gdbus_build_dir)/libgdbussyncevo.la if ENABLE_UNIT_TESTS src_syncevo_cxxflags += $(CPPUNIT_CXXFLAGS) src_syncevo_ldadd += $(CPPUNIT_LDFLAGS) endif lib_LTLIBRARIES += src/syncevo/libsyncevolution.la src_syncevo_sources = \ src/syncevo/GeeSupport.h \ src/syncevo/GValueSupport.h \ src/syncevo/EDSClient.h \ src/syncevo/EDSClient.cpp \ \ src/syncevo/IdentityProvider.h \ src/syncevo/IdentityProvider.cpp \ \ src/syncevo/ConfigTree.h \ src/syncevo/ConfigFilter.h \ src/syncevo/ConfigFilter.cpp \ src/syncevo/ConfigNode.h \ src/syncevo/ConfigNode.cpp \ src/syncevo/DBusTraits.h \ src/syncevo/HashConfigNode.h \ src/syncevo/VolatileConfigNode.h \ src/syncevo/VolatileConfigTree.h \ src/syncevo/SmartPtr.h \ src/syncevo/eds_abi_wrapper.h \ src/syncevo/eds_abi_wrapper.cpp \ src/syncevo/GLibSupport.h \ src/syncevo/GLibSupport.cpp \ src/syncevo/GVariantSupport.h \ src/syncevo/GVariantSupport.cpp \ src/syncevo/ThreadSupport.h \ \ src/syncevo/SyncML.h \ src/syncevo/SyncML.cpp \ \ src/syncevo/SynthesisEngine.h \ src/syncevo/SynthesisEngine.cpp \ \ src/syncevo/Logging.h \ src/syncevo/Logging.cpp \ src/syncevo/LogDLT.h \ src/syncevo/LogDLT.cpp \ src/syncevo/LogStdout.h \ src/syncevo/LogStdout.cpp \ src/syncevo/LogRedirect.h \ src/syncevo/LogRedirect.cpp \ src/syncevo/LogSyslog.h \ src/syncevo/LogSyslog.cpp \ \ src/syncevo/TransportAgent.h \ src/syncevo/TransportAgent.cpp \ src/syncevo/CurlTransportAgent.h \ src/syncevo/CurlTransportAgent.cpp \ \ src/syncevo/SoupTransportAgent.h \ src/syncevo/SoupTransportAgent.cpp \ \ src/syncevo/LocalTransportAgent.h \ src/syncevo/LocalTransportAgent.cpp \ \ src/syncevo/Exception.h \ src/syncevo/Exception.cpp \ \ src/syncevo/util.cpp \ src/syncevo/util.h \ src/syncevo/BoostHelper.h \ src/syncevo/GuardFD.h \ \ src/syncevo/TmpFile.cpp \ src/syncevo/TmpFile.h \ \ src/syncevo/Timespec.h \ \ src/syncevo/lcs.h \ src/syncevo/lcs.cpp \ \ src/syncevo/ForkExec.cpp \ src/syncevo/ForkExec.h \ \ src/syncevo/Cmdline.cpp \ src/syncevo/Cmdline.h \ src/syncevo/CmdlineSyncClient.h \ src/syncevo/CmdlineSyncClient.cpp \ \ src/syncevo/SyncSource.h \ src/syncevo/SyncSource.cpp \ \ src/syncevo/SynthesisDBPlugin.cpp \ \ src/syncevo/SuspendFlags.h \ src/syncevo/SuspendFlags.cpp \ \ src/syncevo/SyncContext.h \ src/syncevo/SyncContext.cpp \ \ src/syncevo/UserInterface.h \ src/syncevo/UserInterface.cpp \ \ src/syncevo/SyncConfig.h \ src/syncevo/SyncConfig.cpp \ \ src/syncevo/DevNullConfigNode.h \ src/syncevo/MultiplexConfigNode.h \ src/syncevo/MultiplexConfigNode.cpp \ \ src/syncevo/FilterConfigNode.h \ src/syncevo/FilterConfigNode.cpp \ \ src/syncevo/SafeConfigNode.h \ src/syncevo/SafeConfigNode.cpp \ \ src/syncevo/PrefixConfigNode.h \ src/syncevo/PrefixConfigNode.cpp \ \ src/syncevo/IniConfigNode.h \ src/syncevo/IniConfigNode.cpp \ src/syncevo/SingleFileConfigTree.h \ src/syncevo/SingleFileConfigTree.cpp \ \ src/syncevo/DataBlob.h \ src/syncevo/FileDataBlob.h \ src/syncevo/FileDataBlob.cpp \ src/syncevo/StringDataBlob.h \ src/syncevo/StringDataBlob.cpp \ \ src/syncevo/SafeOstream.h \ src/syncevo/SafeOstream.cpp \ \ src/syncevo/FileConfigTree.h \ src/syncevo/FileConfigTree.cpp \ \ src/syncevo/MapSyncSource.h \ src/syncevo/MapSyncSource.cpp \ \ src/syncevo/TrackingSyncSource.h \ src/syncevo/TrackingSyncSource.cpp if COND_GIO_GDBUS # Only useful in combination with GDBus GIO. src_syncevo_sources += \ src/syncevo/gsignond-pipe-stream.h \ src/syncevo/gsignond-pipe-stream.cpp endif if ENABLE_ICAL src_syncevo_sources += \ src/syncevo/icalstrdup.c \ src/syncevo/icalstrdup.h endif if ENABLE_ICALTZ_UTIL src_syncevo_sources += \ src/syncevo/icaltz-util.c \ src/syncevo/icaltz-util.h if !ENABLE_EVOLUTION_COMPATIBILITY src_syncevo_ldadd += $(LIBICAL_LIBS) endif endif src_syncevo_libsyncevolution_includedir= $(includedir)/syncevo src_syncevo_libsyncevolution_include_HEADERS = \ src/syncevo/declarations.h \ src/syncevo/Cmdline.h \ src/syncevo/ConfigFilter.h \ src/syncevo/GLibSupport.h \ src/syncevo/ThreadSupport.h \ src/syncevo/TrackingSyncSource.h \ src/syncevo/MapSyncSource.h \ src/syncevo/LogRedirect.h \ src/syncevo/LogStdout.h \ src/syncevo/LogSyslog.h \ \ src/syncevo/Exception.h \ src/syncevo/FilterConfigNode.h \ src/syncevo/PrefixConfigNode.h \ src/syncevo/SafeConfigNode.h \ src/syncevo/SyncConfig.h \ src/syncevo/SyncSource.h \ src/syncevo/IdentityProvider.h \ src/syncevo/GuardFD.h \ src/syncevo/util.h \ src/syncevo/BoostHelper.h \ src/syncevo/SuspendFlags.h \ src/syncevo/SyncContext.h \ src/syncevo/Timespec.h \ src/syncevo/UserInterface.h \ src/syncevo/SynthesisEngine.h \ src/syncevo/Logging.h \ src/syncevo/SyncML.h \ src/syncevo/eds_abi_wrapper.h \ src/syncevo/icalstrdup.h \ src/syncevo/SmartPtr.h \ src/syncevo/ConfigNode.h if ENABLE_OBEX src_syncevo_sources += \ src/syncevo/ObexTransportAgent.h \ src/syncevo/ObexTransportAgent.cpp src_syncevo_ldadd += $(LIBOPENOBEX_LIBS) src_syncevo_cxxflags += $(LIBOPENOBEX_CFLAGS) if ENABLE_BLUETOOTH src_syncevo_ldadd += $(BLUEZ_LIBS) src_syncevo_cxxflags += $(BLUEZ_CFLAGS) endif endif #pkgconfigdir is defined in $(top_srcdir)/setup-variables.am pkgconfig_DATA += src/syncevo/syncevolution.pc DISTCLEANFILES += src/syncevo/syncevolution.pc dist_noinst_DATA += src/syncevo/syncevolution.pc.in src_syncevo_libsyncevolution_la_SOURCES = $(src_syncevo_sources) nodist_src_syncevo_libsyncevolution_la_SOURCES = src/syncevo/SyncEvolutionXML.c CLEANFILES += src/syncevo/SyncEvolutionXML.c src_syncevo_libsyncevolution_la_LIBADD = \ @GIO_LIBS@ \ $(GIOUNIX_LIBS) \ @GTHREAD_LIBS@ \ @GLIB_LIBS@ \ $(SYNTHESIS_LIBS) \ $(PCRECPP_LIBS) \ $(TRANSPORT_LIBS) \ @LIBS@ \ $(src_syncevo_ldadd) \ $(DLT_LIBS) \ $(DBUS_LIBS) \ $(NSS_LIBS) if ENABLE_MODULES src_syncevo_libsyncevolution_la_LIBADD += -ldl endif src_syncevo_libsyncevolution_la_CXXFLAGS = \ $(GIOUNIX_CFLAGS) \ $(PCRECPP_CFLAGS) \ $(TRANSPORT_CFLAGS) \ $(src_syncevo_cxxflags) \ $(SYNTHESIS_CFLAGS) \ $(NSS_CFLAGS) \ $(SYNCEVO_WFLAGS) src_syncevo_libsyncevolution_la_CFLAGS = \ $(SYNCEVO_WFLAGS) src_syncevo_libsyncevolution_la_CPPFLAGS = \ $(src_syncevo_cppflags) \ $(DLT_CFLAGS) \ $(DBUS_CFLAGS) \ -DDATA_DIR=\""$(pkgdatadir)"\" \ -DXML_CONFIG_DIR=\""$(datadir)/syncevolution/xml"\" \ -DTEMPLATE_DIR=\""$(datadir)/syncevolution/templates"\" \ -DLIBDIR=\""$(libdir)"\" src_syncevo_libsyncevolution_la_DEPENDENCIES = $(SYNTHESIS_DEP) $(filter %.la, $(src_syncevo_ldadd)) # rule which is only relevant when compiling Synthesis in subdirectory src/build-synthesis/libsynthesissdk.la: $(SYNTHESIS_SUBDIR)/all $(SYNTHESIS_SUBDIR)/% : [ ! "$(SYNTHESIS_SUBDIR)" ] || ( cd ${dir $@} && $(MAKE) ${notdir $@} ) if ENABLE_MODULES src_syncevo_libsyncevolution_la_LDFLAGS = else src_syncevo_libsyncevolution_la_LDFLAGS = -static endif # command which embeds its input lines into a C-style string that runs across multiple lines TO_C_STRING = sed -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/\(.*\)/"\1\\n"/' # Don't depend on specific XML files. Instead recreate # SyncEvolutionXML.c each time make is invoked (allows including new # fragments in the binary without rerunning configure). src/syncevo/SyncEvolutionXML.c: src/syncevo/GenSyncEvolutionXML $(AM_V_GEN) @true all_phonies += src/syncevo/GenSyncEvolutionXML src/syncevo/GenSyncEvolutionXML: $(AM_V_at)echo "const char *SyncEvolutionXMLClient =" >src/syncevo/SyncEvolutionXML.c.new \ && (cd $(top_srcdir)/src/syncevo/configs && perl update-samples.pl syncevolution.xml client ) | \ perl -p -e 's;; \n \n \n ;' | \ $(TO_C_STRING) >>src/syncevo/SyncEvolutionXML.c.new \ && echo ";" >>src/syncevo/SyncEvolutionXML.c.new \ && echo "const char *SyncEvolutionXMLClientRules =" >>src/syncevo/SyncEvolutionXML.c.new \ && (cd $(top_srcdir)/src/syncevo/configs && cat remoterules/*.xml remoterules/client/*.xml) | $(TO_C_STRING) >>src/syncevo/SyncEvolutionXML.c.new \ && echo ";" >>src/syncevo/SyncEvolutionXML.c.new \ && if cmp -s src/syncevo/SyncEvolutionXML.c src/syncevo/SyncEvolutionXML.c.new; \ then \ rm src/syncevo/SyncEvolutionXML.c.new; \ else \ mv src/syncevo/SyncEvolutionXML.c.new src/syncevo/SyncEvolutionXML.c; \ fi; # turn README.rst into a file with plain text strings for # "Synopsis" and "Usage" CLEANFILES += src/syncevo/CmdlineHelp.c BUILT_SOURCES += src/syncevo/CmdlineHelp.c dist_noinst_SCRIPTS += src/syncevo/readme2c.pl src/syncevo/CmdlineHelp.c: src/syncevo/readme2c.pl $(top_srcdir)/README.rst $(AM_V_GEN)perl $+ >$@ # include boost in distribution #dist-hook: # cp -r $(srcdir)/boost $(distdir) # find $(distdir) -name .libs -o -name "*~" -o -name ".*" -o -name "*.o" -o -name "*.lo" -o -name CVS -o -name autom4te.cache | xargs rm -rf # make sure that the installed development files are usable src_syncevo_install_check_local: $(top_srcdir)/src/syncevo/installcheck-local.sh env PKG_CONFIG_PATH=$(DESTDIR)/$(pkgconfigdir):$$PKG_CONFIG_PATH $< "$(DESTDIR)/$(src_syncevo_libsyncevolution_includedir)" "$(DESTDIR)/$(includedir)" "$(DESTDIR)/$(libdir)" all_local_installchecks += src_syncevo_install_check_local dist_noinst_SCRIPTS += src/syncevo/installcheck-local.sh syncevolution-1.5/src/syncevo/GeeSupport.h0000644000373300001540000001552412326412403022245 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_GEE_SUPPORT #define INCL_GEE_SUPPORT #include #include #include SE_GOBJECT_TYPE(GeeMap) SE_GOBJECT_TYPE(GeeMapEntry) SE_GOBJECT_TYPE(GeeMapIterator) SE_GOBJECT_TYPE(GeeIterable) SE_GOBJECT_TYPE(GeeIterator) SE_GOBJECT_TYPE(GeeMultiMap) SE_GOBJECT_TYPE(GeeCollection) #include SE_BEGIN_CXX namespace GeeSupport { /** Used for GeeMapEntryWrapper. */ template struct traits { typedef E Wrapper_t; typedef typename E::Cast_t Cast_t; static E get(Wrapper_t &wrapper) { return wrapper; } }; /** Default is for types which have a corresponding SE_GOBJECT_TYPE. */ template struct traits { typedef StealGObject Wrapper_t; typedef E * Cast_t; static E * get(Wrapper_t &wrapper) { return wrapper.get(); } }; /** Dynamically allocated plain C strings also work. */ template<> struct traits { typedef PlainGStr Wrapper_t; typedef gchar * Cast_t; static const gchar * get(Wrapper_t &wrapper) { return wrapper; } }; } /** * A wrapper class for some kind of Gee collection (like List or Map) * which provides standard const forward iterators. Main use case * is read-only access via BOOST_FOREACH. * * Example: * GeeMap *individuals = folks_individual_aggregator_get_individuals(aggregator); * typedef GeeCollCXX< GeeMapEntryWrapper > Coll; * BOOST_FOREACH (Coll::value_type &entry, Coll(individuals)) { * const gchar *id = entry.key(); * FolksIndividual *individual(entry.value()); * GeeSet *emails = folks_email_details_get_email_addresses(FOLKS_EMAIL_DETAILS(individual)); * typedef GeeCollCXX EmailColl; * BOOST_FOREACH (FolksEmailFieldDetails *email, EmailColl(emails)) { * const gchar *value = * reinterpret_cast(folks_abstract_field_details_get_value(FOLKS_ABSTRACT_FIELD_DETAILS(email))); * } * } * * @param Entry The C++ type that corresponds to the entries in the collection, * must be copyable and constructable from a gpointer (default) or * intermediate type Cast (when given). Must own the content * pointed to by the gpointer. Plain pointers are not good enough, * they lead to memory leaks! * @param Cast Used to cast gpointer into something that Entry's constructor accepts. */ template class GeeCollCXX { GeeIterableCXX m_collection; public: template GeeCollCXX(Collection *collection, RefOwnership ownership) : m_collection(GEE_ITERABLE(collection), ownership) {} GeeCollCXX(GeeCollectionCXX &collection) : m_collection(GEE_ITERABLE(collection.get()), ADD_REF) {} GeeIterable *get() const { return m_collection.get(); } class Iterator { /** Defines how to handle the gpointer result of gee_iterator_get(). */ typedef GeeSupport::traits Traits_t; mutable GeeIteratorCXX m_it; bool m_valid; /** A smart pointer which owns the value returned by gee_iterator_get(). */ typename Traits_t::Wrapper_t m_wrapper; /** A copy of the wrapped value, needed because the * operator must return a reference to it. */ Entry m_entry; public: /** * Takes ownership of iterator, which may be NULL for the end Iterator. */ Iterator(GeeIterator *iterator) : m_it(iterator, TRANSFER_REF), m_valid(false) {} Iterator & operator ++ () { m_valid = gee_iterator_next(m_it); if (m_valid) { // First cast gpointer into something which is accepted by the wrapper. */ m_wrapper = typename Traits_t::Wrapper_t(static_cast((gee_iterator_get(m_it)))); m_entry = Traits_t::get(m_wrapper); } else { m_wrapper = typename Traits_t::Wrapper_t(NULL); m_entry = NULL; } return *this; } bool operator == (const Iterator &other) { if (other.m_it.get() == NULL) { // Comparison against end Iterator. return !m_valid; } else { // Cannot check for "point to same element"; // at least detect when compared against ourselves. return this == &other; } } bool operator != (const Iterator &other) { return !(*this == other); } Entry & operator * () { return m_entry; } typedef Entry value_type; typedef ptrdiff_t difference_type; typedef std::forward_iterator_tag iterator_category; typedef Entry *pointer; typedef Entry &reference; }; Iterator begin() const { Iterator it(gee_iterable_iterator(m_collection.get())); // advance to first element, if any ++it; return it; } Iterator end() const { return Iterator(NULL); } typedef Iterator const_iterator; typedef Iterator iterator; typedef Entry value_type; }; /** A collection of gchar * strings. */ typedef GeeCollCXX GeeStringCollection; template std::forward_iterator_tag iterator_category(const typename GeeCollCXX::Iterator &) { return std::forward_iterator_tag(); } template class GeeMapEntryWrapper { mutable GeeMapEntryCXX m_entry; public: typedef GeeMapEntry *Cast_t; /** take ownership of entry instance */ GeeMapEntryWrapper(GeeMapEntry *entry = NULL) : m_entry(entry, TRANSFER_REF) {} GeeMapEntryWrapper(const GeeMapEntryWrapper &other): m_entry(other.m_entry) {} Key key() const { return reinterpret_cast(const_cast(gee_map_entry_get_key(m_entry))); } Value value() const { return reinterpret_cast(const_cast(gee_map_entry_get_value(m_entry))); } }; SE_END_CXX #endif // INCL_GEE_SUPPORT syncevolution-1.5/src/syncevo/GValueSupport.h0000664000373300001540000002051512363672170022740 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_GVALUE_SUPPORT #define INCL_GVALUE_SUPPORT #include #include #include SE_BEGIN_CXX /** * Base C++ wrapper for GValue. Owns the data stored in it. * init() must be called before using it. */ class GValueCXX : public GValue { public: GValueCXX() { memset(static_cast(this), 0, sizeof(GValue)); } GValueCXX(const GValue &other) { memset(static_cast(this), 0, sizeof(GValue)); *this = other; } ~GValueCXX() { g_value_unset(this); } void init(GType gType) { g_value_init(this, gType); } GValueCXX &operator = (const GValue &other) { if (&other != this) { g_value_copy(&other, this); } return *this; } /** text representation, for debugging */ PlainGStr toString() const { PlainGStr str(g_strdup_value_contents(this)); return str; } /** * A GDestroyNotify for dynamically allocated GValueCXX instances, * for use in containers like GHashTable. */ static void destroy(gpointer gvaluecxx) { delete static_cast(gvaluecxx); } }; template void dummyTake(GValue *, C) {} template void dummySetStatic(GValue *, const C) {} /** * Declares a C++ wrapper for a GValue containing a specific * GType. */ template< class nativeType, class constNativeType, GType gType, void (*setGValue)(GValue *, constNativeType), constNativeType (*getFromGValue)(const GValue *), void (*takeIntoGValue)(GValue *, nativeType) = dummyTake, void (*setStaticInGValue)(GValue *, constNativeType) = dummySetStatic > class GValueTypedCXX : public GValueCXX { public: typedef GValueTypedCXX value_type; /** * prepare value, without setting it (isSet() will return false) */ GValueTypedCXX() { init(gType); } /** * copy other value, referencing (GObject) or duplicating (string) it */ GValueTypedCXX(const value_type &other) { init(gType); *this = other; } /** * copy value, referencing (GObject) or duplicating (string) it */ GValueTypedCXX(constNativeType value) { init(gType); set(value); } /** * copy (addRef = true) or take ownership of value during construction */ GValueTypedCXX(nativeType value, bool addRef) { init(gType); if (addRef) { set(value); } else { take(value); } } /** copy other value */ GValueCXX &operator = (const value_type &other) { if (&other != this) { g_value_copy(&other, this); } return *this; } /** copy other value */ GValueCXX &operator = (constNativeType other) { set(other); return *this; } /** * set value, copying (string) or referencing (GObject) it if necessary */ void set(constNativeType other) { setGValue(this, other); } /** * store pointer to static instance which does not have to be copied or freed * (like a const char * string) */ void setStatic(constNativeType other) { setStaticInGValue(this, other); } /** transfer ownership of complex object (string, GObject) to GValue */ void take(nativeType other) { takeIntoGValue(this, other); } /** access content without transfering ownership */ constNativeType get() const { return getFromGValue(this); } }; /** * Declares a C++ wrapper for a GValue containing a dynamically * created GType. Uses g_value_set/get/take_boxed() with the necessary * type casting. * * Example: * typedef GValueDynTypedCXX GValueDateTimeCXX; */ template< class nativeType, GType (*gTypeFactory)() > class GValueDynTypedCXX : public GValueCXX { public: typedef GValueDynTypedCXX value_type; /** * prepare value, without setting it (isSet() will return false) */ GValueDynTypedCXX() { init(gTypeFactory()); } /** * copy other value */ GValueDynTypedCXX(const value_type &other) { init(gTypeFactory()); *this = other; } /** * copy value, referencing (GObject) or duplicating (string) it */ GValueDynTypedCXX(const nativeType value) { init(gTypeFactory()); set(value); } /** * copy (addRef = true) or take ownership of value during construction */ GValueDynTypedCXX(nativeType value, bool addRef) { init(gTypeFactory()); if (addRef) { set(value); } else { take(value); } } /** copy other value */ value_type &operator = (const value_type &other) { if (&other != this) { g_value_copy(&other, this); } return *this; } /** copy other value, referencing (GObject) or duplicating (string) it */ value_type &operator = (const nativeType other) { set(other); return *this; } /** * set value, copying (string) or referencing (GObject) it if necessary */ void set(const nativeType other) { g_value_set_boxed(this, other); } /** * store pointer to static instance which does not have to be copied or freed * (like a const char * string) */ void setStatic(const nativeType other) { g_value_set_static_boxed(this, other); } /** transfer ownership of complex object (string, GObject) to GValue */ void take(nativeType other) { g_value_take_boxed(this, other); } /** access content without transfering ownership */ const nativeType get() const { return static_cast(g_value_get_boxed(this)); } }; typedef GValueTypedCXX GValueBooleanCXX; typedef GValueTypedCXX GValueCharCXX; typedef GValueTypedCXX GValueUCharCXX; typedef GValueTypedCXX GValueIntCXX; typedef GValueTypedCXX GValueUIntCXX; typedef GValueTypedCXX GValueLongCXX; typedef GValueTypedCXX GValueULongCXX; typedef GValueTypedCXX GValueInt64CXX; typedef GValueTypedCXX GValueUInt64CXX; typedef GValueTypedCXX GValueFloatCXX; typedef GValueTypedCXX GValueDoubleCXX; typedef GValueTypedCXX GValueEnumCXX; typedef GValueTypedCXX GValueBooleanCXX; typedef GValueTypedCXX GValueStringCXX; typedef GValueTypedCXX GValueObjectCXX; SE_END_CXX #endif // INCL_GVALUE_SUPPORT syncevolution-1.5/src/syncevo/EDSClient.h0000664000373300001540000001205112330727742021726 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVO_EDS_CLIENT #define INCL_SYNCEVO_EDS_CLIENT #include #include #if defined(HAVE_EDS) && defined(USE_EDS_CLIENT) #include #include #include #include #include #include #include typedef SyncEvo::GListCXX ESourceListCXX; SE_GOBJECT_TYPE(ESourceRegistry) SE_GOBJECT_TYPE(ESource) SE_GOBJECT_TYPE(EClient) #endif // HAVE_EDS && USE_EDS_CLIENT #include SE_BEGIN_CXX // This code must always be compiled into libsyncevolution. // It may get used by backends which were compiled against // EDS >= 3.6 even when the libsyncevolution itself wasn't. class EDSRegistryLoader; EDSRegistryLoader &EDSRegistryLoaderSingleton(const boost::shared_ptr &loader); // The following code implements EDSRegistryLoader. // For the sake of simplicity, its all in the header file, // so all users of it end up with a copy of the code and // then they can activate that code when instantiating the object // and passing it to EDSRegistryLoaderSingleton(). #if defined(HAVE_EDS) && defined(USE_EDS_CLIENT) /** * Creates ESourceRegistry on demand and shares it inside * SyncEvolution. It's never freed once used. */ class EDSRegistryLoader : private boost::noncopyable { public: typedef boost::function Callback_t; /** * Callback gets invoked exactly once. If the registry pointer is empty, * then the error will explain why. */ static void getESourceRegistryAsync(const Callback_t &cb) { EDSRegistryLoaderSingleton(boost::shared_ptr(new EDSRegistryLoader)).async(cb); } /** * Returns shared ESourceRegistry, throws error if creation failed. */ static ESourceRegistryCXX getESourceRegistry() { return EDSRegistryLoaderSingleton(boost::shared_ptr(new EDSRegistryLoader)).sync(); } private: Bool m_loading; ESourceRegistryCXX m_registry; GErrorCXX m_gerror; std::list m_pending; void async(const Callback_t &cb) { if (m_registry || m_gerror) { cb(m_registry, m_gerror); } else { m_pending.push_back(cb); #if 0 m_loading = true; SYNCEVO_GLIB_CALL_ASYNC(e_source_registry_new, boost::bind(&EDSRegistryLoader::created, this, _1, _2), NULL); #else ESourceRegistry *registry; GErrorCXX gerror; registry = e_source_registry_new_sync(NULL, gerror); created(registry, gerror); #endif } } ESourceRegistryCXX sync() { #if 0 if (!m_loading) { m_loading = true; SYNCEVO_GLIB_CALL_ASYNC(e_source_registry_new, boost::bind(&EDSRegistryLoader::created, this, _1, _2), NULL); } GRunWhile(!boost::lambda::var(m_registry) && !boost::lambda::var(m_gerror)); #else if (!m_registry) { ESourceRegistry *registry; GErrorCXX gerror; registry = e_source_registry_new_sync(NULL, gerror); created(registry, gerror); } #endif if (m_registry) { return m_registry; } if (m_gerror) { m_gerror.throwError(SE_HERE, "creating source registry"); } return m_registry; } void created(ESourceRegistry *registry, const GError *gerror) throw () { try { m_registry = ESourceRegistryCXX::steal(registry); m_gerror = gerror; BOOST_FOREACH (const Callback_t &cb, m_pending) { cb(m_registry, m_gerror); } } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } } }; #endif // HAVE_EDS && USE_EDS_CLIENT SE_END_CXX #endif // INCL_SYNCEVO_EDS_CLIENT syncevolution-1.5/src/syncevo/EDSClient.cpp0000644000373300001540000000216412326412403022251 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include SE_BEGIN_CXX EDSRegistryLoader &EDSRegistryLoaderSingleton(const boost::shared_ptr &loader) { static boost::shared_ptr singleton; if (!singleton) { singleton = loader; } return *singleton; } SE_END_CXX syncevolution-1.5/src/syncevo/IdentityProvider.cpp0000664000373300001540000001046212405555067024021 0ustar00nightlynightly00000000000000/* * Copyright (C) 2013 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include SE_BEGIN_CXX const char USER_IDENTITY_PLAIN_TEXT[] = "user"; const char USER_IDENTITY_SYNC_CONFIG[] = "id"; Credentials IdentityProviderCredentials(const UserIdentity &identity, const InitStateString &password) { Credentials cred; if (identity.m_provider == USER_IDENTITY_PLAIN_TEXT) { cred.m_username = identity.m_identity; cred.m_password = password; } else { // We could use the gSSO password plugin to request // username/password. But it is uncertain whether that is useful, // therefore that is not implemented at the moment. SE_THROW(StringPrintf("%s: need username+password as credentials", identity.toString().c_str())); } return cred; } class CredentialsProvider : public AuthProvider { Credentials m_creds; public: CredentialsProvider(const std::string &username, const std::string &password) { m_creds.m_username = username; m_creds.m_password = password; } virtual bool wasConfigured() const { return !m_creds.m_username.empty() || !m_creds.m_password.empty(); } virtual bool methodIsSupported(AuthMethod method) const { return method == AUTH_METHOD_CREDENTIALS; } virtual Credentials getCredentials() const { return m_creds; } virtual std::string getOAuth2Bearer(int failedTokens, const PasswordUpdateCallback &passwordUpdateCallback) const { SE_THROW("OAuth2 not supported"); return ""; } virtual std::string getUsername() const { return m_creds.m_username; } }; boost::shared_ptr AuthProvider::create(const UserIdentity &identity, const InitStateString &password) { boost::shared_ptr authProvider; if (identity.m_provider == USER_IDENTITY_PLAIN_TEXT) { SE_LOG_DEBUG(NULL, "using plain username/password for %s", identity.toString().c_str()); authProvider.reset(new CredentialsProvider(identity.m_identity, password)); } else { SE_LOG_DEBUG(NULL, "looking for identity provider for %s", identity.toString().c_str()); BOOST_FOREACH (IdentityProvider *idProvider, IdentityProvider::getRegistry()) { if (boost::iequals(idProvider->m_key, identity.m_provider)) { authProvider = idProvider->create(identity.m_identity, password); if (!authProvider) { SE_THROW(StringPrintf("identity provider for '%s' is disabled in this installation", identity.m_provider.c_str())); } break; } } if (!authProvider) { SE_THROW(StringPrintf("unknown identity provider '%s' in '%s'", identity.m_provider.c_str(), identity.toString().c_str())); } } return authProvider; } std::list &IdentityProvider::getRegistry() { static std::list providers; return providers; } IdentityProvider::IdentityProvider(const std::string &key, const std::string &descr) : m_key(key), m_descr(descr) { getRegistry().push_back(this); } IdentityProvider::~IdentityProvider() { getRegistry().erase(std::find(getRegistry().begin(), getRegistry().end(), this)); } SE_END_CXX syncevolution-1.5/src/syncevo/ConfigTree.h0000644000373300001540000001253212326412403022171 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_CONFIG_TREE # define INCL_EVOLUTION_CONFIG_TREE #include #include #include #include #include SE_BEGIN_CXX class ConfigNode; /** * This class organizes the access to config nodes in a tree. Nodes * are identified by a relative path name, using a slash / as * separator between levels. Each node can have user-visible and * hidden properties. The two sets might be stored in the same * ConfigNode, i.e. properties should have unique names per node. For * each path there's also a second, separate namespace of key/value * pairs. The intented use for that is saving state by sync sources * close to, but without interfering with their configuration and the * state maintained by the client library itself. * * A ConfigNode can list all its properties while the tree lists nodes * at a specific level and creates nodes. * * This model is similar to the Funambol C++ DeviceManagementTree. * Besides being implemented differently, it also provides additional * functionality: * - the same node can be opened more than once; in the client library * the content of multiple instances is not synchronized and changes * can get lost * - nodes and the whole tree can be explicitly flushed * - it distinguishes between user visible configuration options and * hidden read/write properties attached to the same path * - in addition to these visible or hidden properties under well-known * names there can be nodes attached to each path which can * be used for arbitrary key/value pairs; different "other" nodes can * be selected via an additional string * - temporarily override values without saving them (see FilterConfigNode * decorator) * - improved access to properties inside nodes (iterating, deleting) */ class ConfigTree { public: /** frees all resources *without* flushing changed nodes */ virtual ~ConfigTree() {} /** ensure that all changes are saved persistently */ virtual void flush() = 0; /** tell all nodes to reload from background storage, discarding in-memory changes */ virtual void reload() = 0; /** * Remove all configuration nodes below and including a certain * path and (if based on files) directories created for them, if * empty after file removal. * * The nodes must not be in use for this to work. */ virtual void remove(const std::string &path) = 0; /** * Selects which node attached to a path name is to be used. * This is similar in concept to multiple data forks in a file. */ enum PropertyType { visible, /**< visible configuration properties */ hidden, /**< hidden read/write properties */ other, /**< additional node selected via otherID */ server, /**< yet another additional node, similar to other */ }; /** * Open the specified node. Opening it multiple * times will return the same instance, so the content * is always synchronized. * * @param path a relative path with / as separator * @param type selects which fork of that path is to be opened * (visible, hidden, change tracking, server) * @param otherId an additional string to be attached to the 'other' or 'server' * node's name (allows having multiple different such * nodes); an empty string is allowed */ virtual boost::shared_ptr open(const std::string &path, PropertyType type, const std::string &otherId = std::string("")) = 0; /** * Use the specified node, with type determined * by caller. The reason for adding the instance is * twofold: * - ensure that flush() is called on the node * as part of flushing the tree * - an existing instance is reused and shared between * different users of the tree * * @param path a relative or absolute path, may be outside of normal tree * @param node default instance if not opened before, discarded if a * node was registered or opened under the given path before */ virtual boost::shared_ptr add(const std::string &path, const boost::shared_ptr &node) = 0; /** * returns names of all existing nodes beneath the given path */ virtual std::list getChildren(const std::string &path) = 0; }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/ConfigFilter.cpp0000644000373300001540000001620012326412403023046 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #include #include using namespace std; SE_BEGIN_CXX void ConfigProps::add(const ConfigProps &other) { BOOST_FOREACH(const ConfigProps::value_type &entry, other) { std::pair res = insert(entry); if (!res.second) { res.first->second = entry.second; } } } InitStateString ConfigProps::get(const string &key, const string &def) const { const_iterator it = find(key); if (it == end()) { return InitStateString(def, false); } else { return it->second; } } ConfigProps::operator string () const { vector res; BOOST_FOREACH(const StringPair &filter, *this) { res.push_back(filter.first + " = " + filter.second); } sort(res.begin(), res.end()); return boost::join(res, "\n"); } ConfigProps SourceProps::createSourceFilter(const std::string &source) const { const_iterator it = find(""); ConfigProps filter; if (it != end()) { filter = it->second; } if (!source.empty()) { it = find(source); if (it != end()) { filter.add(it->second); } } return filter; } ConfigProps FullProps::createSyncFilter(const std::string &config) const { const_iterator it = find(""); ConfigProps filter; if (it != end()) { // first unset context filter = it->second.m_syncProps; } if (!config.empty()) { std::string normal = SyncConfig::normalizeConfigString(config, SyncConfig::NORMALIZE_LONG_FORMAT); std::string peer, context; SyncConfig::splitConfigString(normal, peer, context); // then overwrite with context config it = find(std::string("@") + context); if (it != end()) { filter.add(it->second.m_syncProps); } // finally peer config, if we have one if (!peer.empty()) { it = find(normal); if (it != end()) { filter.add(it->second.m_syncProps); } } } return filter; } ConfigProps FullProps::createSourceFilter(const std::string &config, const std::string &source) const { const_iterator it = find(""); ConfigProps filter; if (it != end()) { // first unset context filter = it->second.m_sourceProps.createSourceFilter(source); } if (!config.empty()) { std::string normal = SyncConfig::normalizeConfigString(config, SyncConfig::NORMALIZE_LONG_FORMAT); std::string peer, context; SyncConfig::splitConfigString(normal, peer, context); // then overwrite with context config it = find(std::string("@") + context); if (it != end()) { filter.add(it->second.m_sourceProps.createSourceFilter(source)); } // finally peer config, if we have one if (!peer.empty()) { it = find(normal); if (it != end()) { filter.add(it->second.m_sourceProps.createSourceFilter(source)); } } } return filter; } bool FullProps::hasProperties(PropCheckMode mode) const { BOOST_FOREACH(const value_type &context, *this) { if (mode == CHECK_ALL && !context.second.m_syncProps.empty()) { return true; } if (mode == IGNORE_GLOBAL_PROPS) { const ConfigPropertyRegistry ®istry = SyncConfig::getRegistry(); BOOST_FOREACH(const StringPair &entry, context.second.m_syncProps) { const ConfigProperty *prop = registry.find(entry.first); if (!prop || prop->getSharing() != ConfigProperty::GLOBAL_SHARING) { return true; } } } BOOST_FOREACH(const SourceProps::value_type &source, context.second.m_sourceProps) { if (!source.second.empty()) { return true; } } } return false; } void FullProps::createFilters(const string &context, const string &config, const set *sources, ConfigProps &syncFilter, SourceProps &sourceFilters) { boost::shared_ptr shared; if (!context.empty()) { // Read from context. If it does not exist, we simply set no properties // as filter. Previously there was a check for existance, but that was // flawed because it ignored the global property "defaultPeer". shared.reset(new SyncConfig(context)); shared->getProperties()->readProperties(syncFilter); } // add command line filters for context or config? if (!context.empty()) { syncFilter.add(createSyncFilter(context)); // default for (so far) unknown sources which might be created sourceFilters[""].add(createSourceFilter(context, "")); } if (!config.empty()) { syncFilter.add(createSyncFilter(config)); sourceFilters[""].add(createSourceFilter(config, "")); } // build full set of all sources set allSources; if (sources) { allSources = *sources; } if (shared) { std::list tmp = shared->getSyncSources(); allSources.insert(tmp.begin(), tmp.end()); } if (!config.empty()) { std::list tmp = SyncConfig(config).getSyncSources(); allSources.insert(tmp.begin(), tmp.end()); } // explicit filter for all known sources BOOST_FOREACH(std::string source, allSources) { ConfigProps &props = sourceFilters[source]; if (shared) { // combine existing properties from context and command line // filter SyncSourceNodes nodes = shared->getSyncSourceNodes(source, ""); nodes.getProperties()->readProperties(props); // Special case "type" property: the value in the context // is not preserved. Every new peer must ensure that // its own value is compatible (= same backend) with // the other peers. props.erase("type"); props.add(createSourceFilter(context, source)); } if (!config.empty()) { props.add(createSourceFilter(config, source)); } } } SE_END_CXX syncevolution-1.5/src/syncevo/ConfigNode.cpp0000644000373300001540000000342012326412403022506 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include using namespace std; SE_BEGIN_CXX boost::shared_ptr ConfigNode::createFileNode(const string &filename) { string::size_type off = filename.rfind('/'); boost::shared_ptr filenode; if (off != filename.npos) { filenode.reset(new IniFileConfigNode(filename.substr(0, off), filename.substr(off + 1), false)); } else { filenode.reset(new IniFileConfigNode(".", filename, false)); } boost::shared_ptr savenode(new SafeConfigNode(filenode)); savenode->setMode(false); return savenode; } void ConfigNode::writeProperties(const ConfigProps &props) { BOOST_FOREACH(const ConfigProps::value_type &entry, props) { setProperty(entry.first, entry.second); } } SE_END_CXX syncevolution-1.5/src/syncevo/DBusTraits.h0000644000373300001540000001335112326412403022170 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011-12 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * GDBus traits for sending some common structs over D-Bus. * Needed by by syncevo-local-sync and syncevo-dbus-helper. */ #ifndef INCL_SYNCEVO_DBUS_TRAITS # define INCL_SYNCEVO_DBUS_TRAITS #include #include #include #include #include #include namespace GDBusCXX { template <> struct dbus_traits : dbus_enum_traits {}; template <> struct dbus_traits : dbus_enum_traits {}; /** like a pair of two values, but with different storage class on the host */ template struct dbus_traits< SyncEvo::InitState > : public dbus_traits< std::pair > { typedef dbus_traits< std::pair > base_traits; typedef SyncEvo::InitState host_type; typedef const host_type &arg_type; #ifdef GDBUS_CXX_GIO static void get(ExtractArgs &context, reader_type &reader, host_type &value) { typename base_traits::host_type tmp; base_traits::get(context, reader, tmp); value = host_type(tmp.first, tmp.second); } #else static void get(connection_type *conn, message_type *msg, reader_type &reader, host_type &value) { typename base_traits::host_type tmp; base_traits::get(conn, msg, reader, tmp); value = host_type(tmp.first, tmp.second); } #endif static void append(builder_type &builder, arg_type value) { base_traits::append(builder, typename base_traits::host_type(value.get(), value.wasSet())); } }; /** * Actual content is a std::map, so serialization can be done using that. * We only have to ensure that instances and parameters use FullProps. */ template <> struct dbus_traits : public dbus_traits < std::map > > { typedef SyncEvo::FullProps host_type; typedef const SyncEvo::FullProps &arg_type; }; /** * Similar to SyncEvo::FullProps. */ template <> struct dbus_traits : public dbus_traits < std::map > > { typedef SyncEvo::SourceProps host_type; typedef const SyncEvo::SourceProps &arg_type; }; template <> struct dbus_traits : public dbus_traits < std::map > > { typedef SyncEvo::ConfigProps host_type; typedef const SyncEvo::ConfigProps &arg_type; }; /** * a struct containing ConfigProps + SourceProps */ template <> struct dbus_traits : public dbus_struct_traits > > {}; /** * a struct containing various strings and an integer */ template <> struct dbus_traits : public dbus_struct_traits > > > > > > > {}; template <> struct dbus_traits : public dbus_struct_traits > > {}; } #endif // INCL_SYNCEVO_DBUS_TRAITS syncevolution-1.5/src/syncevo/HashConfigNode.h0000644000373300001540000000335112326412403022762 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly */ #ifndef INCL_EVOLUTION_HASH_CONFIG_NODE # define INCL_EVOLUTION_HASH_CONFIG_NODE #include #include #include #include SE_BEGIN_CXX /** * Implements a ConfigNode with an in-memory hash table. */ class HashConfigNode : public ConfigNode { std::map m_props; const std::string m_name; public: /** * @param name a string for debugging and error reporting */ HashConfigNode(const std::string &name = "hash config node") : m_name(name) {} /* keep underlying methods visible; our own setProperty() would hide them */ using ConfigNode::setProperty; virtual string getName() const { return m_name; } virtual void flush() {} virtual string readProperty(const string &property) const { std::map::const_iterator it = m_props.find(property); if (it == m_props.end()) { return ""; } else { return it->second; } } virtual void setProperty(const string &property, const string &value, const string &comment = "", const string *defValue = NULL) { m_props[property] = value; } virtual void readProperties(std::map &props) const { props = m_props; } virtual void writeProperties(const PropsType &props) { m_props.insert(props.begin(), props.end()); } virtual void removeProperty(const std::string &property) { m_props.erase(property); } virtual bool exists() const { return true; } virtual void clear() { m_props.clear(); } }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/VolatileConfigNode.h0000644000373300001540000000320212326412403023651 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_VOLATILE_CONFIG_NODE # define INCL_EVOLUTION_VOLATILE_CONFIG_NODE #include #include #include SE_BEGIN_CXX /** * This class can store properties while in memory, but will never * save them persistently. Implemented by instantiating an IniHashConfigNode * (because order of entries doesn't matter) * with invalid path and never calling its flush() method. */ class VolatileConfigNode : public FilterConfigNode { public: VolatileConfigNode() : FilterConfigNode(boost::shared_ptr(new IniHashConfigNode("/dev/null", "dummy.ini", true))) {} virtual std::string getName() const { return "intermediate configuration"; } virtual bool isVolatile() const { return true; } virtual void flush() {} }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/VolatileConfigTree.h0000644000373300001540000000256312326412403023674 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_EVOLUTION_VOLATILE_CONFIG_TREE # define INCL_EVOLUTION_VOLATILE_CONFIG_TREE #include #include SE_BEGIN_CXX /** * This class can store properties while in memory, but will never * save them persistently. Implemented by instantiating a FileConfigTree * with invalid path and intercepting its flush() method. */ class VolatileConfigTree : public FileConfigTree { public: VolatileConfigTree() : FileConfigTree("/dev/null", SyncConfig::SHARED_LAYOUT) {} virtual void flush() {} }; SE_END_CXX #endif syncevolution-1.5/src/syncevo/eds_abi_wrapper.cpp0000664000373300001540000007021312330727742023641 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #define EDS_ABI_WRAPPER_NO_REDEFINE 1 #include #include #include #include #include #include #include using namespace std; namespace { static std::string &getLookupDebug() { static std::string lookupDebug; return lookupDebug; } static std::string &getLookupInfo() { static std::string lookupInfo; return lookupInfo; } } #ifdef EVOLUTION_COMPATIBILITY struct EDSAbiWrapper EDSAbiWrapperSingleton; namespace { enum { FIND_SYMBOLS_NEED_ALL = 1<<0, /**< all symbols must be present for findSymbols() to succeed */ FIND_SYMBOLS_LENIENT_MAX_VERSION = 1<<1 /**< also allow libs with higher version, with extra warning */ }; /** * Opens a . shared object with coming from a * range of known compatible versions, falling back to even more * recent ones only after warning about it. Then searches for * function pointers. * * Either all or none of the function pointers are set. * * End user information and debug information are added to * lookupDebug and lookupInfo. * * @param libname full name including .so suffix; . gets appended * @param minver first known compatible version * @param maxver last known compatible version * @param flags controls specific features * @retval realver found version * @return dlhandle which must be kept or freed by caller */ void *findSymbols(const char *libname, int minver, int maxver, int flags, int *realver, ... /* function pointer address, name, ..., (void *)0 */) { void *dlhandle = NULL; std::ostringstream debug, info; int ver; if (!dlhandle) { for (ver = maxver; ver >= minver; --ver) { std::ostringstream soname; soname << libname << "." << ver; dlhandle = dlopen(soname.str().c_str(), RTLD_GLOBAL|RTLD_LAZY); if (dlhandle) { info << "using " << soname.str() << std::endl; break; } } } if (!dlhandle && (flags & FIND_SYMBOLS_LENIENT_MAX_VERSION)) { for (ver = maxver + 1; ver < maxver + 50; ++ver) { std::ostringstream soname; soname << libname << "." << ver; dlhandle = dlopen(soname.str().c_str(), RTLD_GLOBAL|RTLD_LAZY); if (dlhandle) { info << "using " << soname.str() << " - might not be compatible!" << std::endl; break; } } } if (realver) { *realver = ver; } if (!dlhandle) { debug << libname << " not found (tried major versions " << minver << " to " << maxver + 49 << ")" << std::endl; } else { bool allfound = true; va_list ap; va_start(ap, realver); void **funcptr = va_arg(ap, void **); const char *symname = NULL; while (funcptr) { symname = va_arg(ap, const char *); // Don't overwrite address already found earlier. Needed // for icaltimezone_get_component(), which may be // overridden by ourselves. if (!*funcptr) { *funcptr = dlsym(dlhandle, symname); if (!*funcptr) { debug << symname << " not found" << std::endl; allfound = false; } } funcptr = va_arg(ap, void **); } va_end(ap); if (!allfound && (flags & FIND_SYMBOLS_NEED_ALL)) { /* unusable, clear symbols and free handle */ va_start(ap, realver); funcptr = va_arg(ap, void **); while (funcptr) { va_arg(ap, const char *); *funcptr = NULL; funcptr = va_arg(ap, void **); } va_end(ap); info << libname << " unusable, required function no longer available" << std::endl; dlclose(dlhandle); dlhandle = NULL; } } getLookupInfo() += info.str(); getLookupDebug() += info.str(); getLookupDebug() += debug.str(); return dlhandle; } # ifdef HAVE_EDS void *edshandle; # endif # ifdef ENABLE_EBOOK void *ebookhandle; # endif # ifdef ENABLE_ECAL void *ecalhandle; # endif # ifdef ENABLE_BLUETOOTH void *libbluetoothhandle; sdp_record_t *wrap_sdp_extract_pdu(const uint8_t *pdata, int bufsize, int *scanned) { return EDSAbiWrapperSingleton.sdp_extract_pdu(pdata, scanned); } int wrap_sdp_extract_seqtype(const uint8_t *buf, int bufsize, uint8_t *dtdp, int *size) { return EDSAbiWrapperSingleton.sdp_extract_seqtype(buf, dtdp, size); } # endif } int EDSAbiHaveEbook, EDSAbiHaveEcal, EDSAbiHaveEdataserver; int EDSAbiHaveIcal; int EDSAbiHaveIcal1; int SyncEvoHaveLibbluetooth; extern "C" void EDSAbiWrapperInit() { static bool initialized; if (initialized) { return; } else { initialized = true; } // Bind icaltimezone_get_component() to the version found (or not found, // if internal-icaltz not configured) in our own executable. void *get = dlsym(RTLD_DEFAULT, "icaltimezone_get_component"); getLookupDebug() += SyncEvo::StringPrintf("icaltimezone_get_component = %p", get); #if defined(ENABLE_ECAL) || defined(ENABLE_ICAL) EDSAbiWrapperSingleton.icaltimezone_get_component = (icalcomponent *(*)(icaltimezone *))get; #endif # ifdef HAVE_EDS edshandle = findSymbols("libedataserver-1.2.so", 7, 16, FIND_SYMBOLS_NEED_ALL, NULL, &EDSAbiWrapperSingleton.e_source_get_type, "e_source_get_type", &EDSAbiWrapperSingleton.e_source_get_uri, "e_source_get_uri", &EDSAbiWrapperSingleton.e_source_group_get_type, "e_source_group_get_type", &EDSAbiWrapperSingleton.e_source_group_peek_sources, "e_source_group_peek_sources", &EDSAbiWrapperSingleton.e_source_list_peek_groups, "e_source_list_peek_groups", &EDSAbiWrapperSingleton.e_source_peek_name, "e_source_peek_name", (void *)0); EDSAbiHaveEdataserver = EDSAbiWrapperSingleton.e_source_group_peek_sources != 0; # endif // HAVE_EDS # ifdef ENABLE_EBOOK static const int libebookMinVersion = 5, libebookMaxVersion = 13; // EDS 3.4 ebookhandle = findSymbols("libebook-1.2.so", libebookMinVersion, libebookMaxVersion, FIND_SYMBOLS_NEED_ALL, NULL, &EDSAbiWrapperSingleton.e_book_add_contact, "e_book_add_contact", &EDSAbiWrapperSingleton.e_book_authenticate_user, "e_book_authenticate_user", &EDSAbiWrapperSingleton.e_book_commit_contact, "e_book_commit_contact", &EDSAbiWrapperSingleton.e_contact_duplicate, "e_contact_duplicate", &EDSAbiWrapperSingleton.e_contact_get_const, "e_contact_get_const", &EDSAbiWrapperSingleton.e_contact_get, "e_contact_get", &EDSAbiWrapperSingleton.e_contact_name_free, "e_contact_name_free", &EDSAbiWrapperSingleton.e_contact_get_type, "e_contact_get_type", &EDSAbiWrapperSingleton.e_contact_new_from_vcard, "e_contact_new_from_vcard", &EDSAbiWrapperSingleton.e_contact_set, "e_contact_set", &EDSAbiWrapperSingleton.e_book_error_quark, "e_book_error_quark", &EDSAbiWrapperSingleton.e_book_get_addressbooks, "e_book_get_addressbooks", &EDSAbiWrapperSingleton.e_book_get_changes, "e_book_get_changes", &EDSAbiWrapperSingleton.e_book_get_contact, "e_book_get_contact", &EDSAbiWrapperSingleton.e_book_get_contacts, "e_book_get_contacts", &EDSAbiWrapperSingleton.e_book_get_supported_auth_methods, "e_book_get_supported_auth_methods", &EDSAbiWrapperSingleton.e_book_get_uri, "e_book_get_uri", &EDSAbiWrapperSingleton.e_book_new, "e_book_new", &EDSAbiWrapperSingleton.e_book_new_default_addressbook, "e_book_new_default_addressbook", &EDSAbiWrapperSingleton.e_book_new_from_uri, "e_book_new_from_uri", &EDSAbiWrapperSingleton.e_book_new_system_addressbook, "e_book_new_system_addressbook", &EDSAbiWrapperSingleton.e_book_open, "e_book_open", &EDSAbiWrapperSingleton.e_book_query_any_field_contains, "e_book_query_any_field_contains", &EDSAbiWrapperSingleton.e_book_query_unref, "e_book_query_unref", &EDSAbiWrapperSingleton.e_book_remove_contact, "e_book_remove_contact", &EDSAbiWrapperSingleton.e_vcard_to_string, "e_vcard_to_string", (void *)0); EDSAbiHaveEbook = EDSAbiWrapperSingleton.e_book_new != 0; findSymbols("libebook-1.2.so", libebookMinVersion, libebookMaxVersion, 0, NULL, &EDSAbiWrapperSingleton.e_contact_inline_local_photos, "e_contact_inline_local_photos", (void *)0); # endif // ENABLE_EBOOK #define EDS_ABI_WRAPPER_ICAL_BASE \ &EDSAbiWrapperSingleton.icalcomponent_add_component, "icalcomponent_add_component", \ &EDSAbiWrapperSingleton.icalcomponent_add_property, "icalcomponent_add_property", \ &EDSAbiWrapperSingleton.icalcomponent_as_ical_string, "icalcomponent_as_ical_string", \ &EDSAbiWrapperSingleton.icalcomponent_free, "icalcomponent_free", \ &EDSAbiWrapperSingleton.icalcomponent_get_first_component, "icalcomponent_get_first_component", \ &EDSAbiWrapperSingleton.icalcomponent_get_first_property, "icalcomponent_get_first_property", \ &EDSAbiWrapperSingleton.icalcomponent_get_next_component, "icalcomponent_get_next_component", \ &EDSAbiWrapperSingleton.icalcomponent_get_next_property, "icalcomponent_get_next_property", \ &EDSAbiWrapperSingleton.icalcomponent_get_recurrenceid, "icalcomponent_get_recurrenceid", \ &EDSAbiWrapperSingleton.icalcomponent_get_timezone, "icalcomponent_get_timezone", \ &EDSAbiWrapperSingleton.icalcomponent_get_location, "icalcomponent_get_location", \ &EDSAbiWrapperSingleton.icalcomponent_get_summary, "icalcomponent_get_summary", \ &EDSAbiWrapperSingleton.icalcomponent_get_uid, "icalcomponent_get_uid", \ &EDSAbiWrapperSingleton.icalcomponent_get_dtstart, "icalcomponent_get_dtstart", \ &EDSAbiWrapperSingleton.icalcomponent_set_dtstart, "icalcomponent_set_dtstart", \ &EDSAbiWrapperSingleton.icalcomponent_isa, "icalcomponent_isa", \ &EDSAbiWrapperSingleton.icalcomponent_new_clone, "icalcomponent_new_clone", \ &EDSAbiWrapperSingleton.icalcomponent_new_from_string, "icalcomponent_new_from_string", \ &EDSAbiWrapperSingleton.icalcomponent_new, "icalcomponent_new", \ &EDSAbiWrapperSingleton.icalcomponent_merge_component, "icalcomponent_merge_component", \ &EDSAbiWrapperSingleton.icalcomponent_remove_component, "icalcomponent_remove_component", \ &EDSAbiWrapperSingleton.icalcomponent_remove_property, "icalcomponent_remove_property", \ &EDSAbiWrapperSingleton.icalcomponent_set_uid, "icalcomponent_set_uid", \ &EDSAbiWrapperSingleton.icalcomponent_set_recurrenceid, "icalcomponent_set_recurrenceid", \ &EDSAbiWrapperSingleton.icalcomponent_vanew, "icalcomponent_vanew", \ &EDSAbiWrapperSingleton.icalparameter_get_tzid, "icalparameter_get_tzid", \ &EDSAbiWrapperSingleton.icalparameter_set_tzid, "icalparameter_set_tzid", \ &EDSAbiWrapperSingleton.icalparameter_new_from_value_string, "icalparameter_new_from_value_string", \ &EDSAbiWrapperSingleton.icalparameter_new_clone, "icalparameter_new_clone", \ &EDSAbiWrapperSingleton.icalproperty_new_clone, "icalproperty_new_clone", \ &EDSAbiWrapperSingleton.icalproperty_free, "icalproperty_free", \ &EDSAbiWrapperSingleton.icalproperty_get_description, "icalproperty_get_description", \ &EDSAbiWrapperSingleton.icalproperty_get_uid, "icalproperty_get_uid", \ &EDSAbiWrapperSingleton.icalproperty_get_recurrenceid, "icalproperty_get_recurrenceid", \ &EDSAbiWrapperSingleton.icalproperty_set_recurrenceid, "icalproperty_set_recurrenceid", \ &EDSAbiWrapperSingleton.icalproperty_get_sequence, "icalproperty_get_sequence", \ &EDSAbiWrapperSingleton.icalproperty_get_property_name, "icalproperty_get_property_name", \ &EDSAbiWrapperSingleton.icalproperty_get_first_parameter, "icalproperty_get_first_parameter", \ &EDSAbiWrapperSingleton.icalproperty_get_lastmodified, "icalproperty_get_lastmodified", \ &EDSAbiWrapperSingleton.icalproperty_get_next_parameter, "icalproperty_get_next_parameter", \ &EDSAbiWrapperSingleton.icalproperty_set_parameter, "icalproperty_set_parameter", \ &EDSAbiWrapperSingleton.icalproperty_get_summary, "icalproperty_get_summary", \ &EDSAbiWrapperSingleton.icalproperty_new_description, "icalproperty_new_description", \ &EDSAbiWrapperSingleton.icalproperty_new_summary, "icalproperty_new_summary", \ &EDSAbiWrapperSingleton.icalproperty_new_uid, "icalproperty_new_uid", \ &EDSAbiWrapperSingleton.icalproperty_new_sequence, "icalproperty_new_sequence", \ &EDSAbiWrapperSingleton.icalproperty_new_recurrenceid, "icalproperty_new_recurrenceid", \ &EDSAbiWrapperSingleton.icalproperty_set_value_from_string, "icalproperty_set_value_from_string", \ &EDSAbiWrapperSingleton.icalproperty_set_dtstamp, "icalproperty_set_dtstamp", \ &EDSAbiWrapperSingleton.icalproperty_set_lastmodified, "icalproperty_set_lastmodified", \ &EDSAbiWrapperSingleton.icalproperty_set_sequence, "icalproperty_set_sequence", \ &EDSAbiWrapperSingleton.icalproperty_set_uid, "icalproperty_set_uid", \ &EDSAbiWrapperSingleton.icalproperty_remove_parameter_by_kind, "icalproperty_remove_parameter_by_kind", \ &EDSAbiWrapperSingleton.icalproperty_add_parameter, "icalproperty_add_parameter", \ &EDSAbiWrapperSingleton.icalproperty_get_value_as_string, "icalproperty_get_value_as_string", \ &EDSAbiWrapperSingleton.icalproperty_get_x_name, "icalproperty_get_x_name", \ &EDSAbiWrapperSingleton.icalproperty_new_from_string, "icalproperty_new_from_string", \ &EDSAbiWrapperSingleton.icaltime_is_null_time, "icaltime_is_null_time", \ &EDSAbiWrapperSingleton.icaltime_is_utc, "icaltime_is_utc", \ &EDSAbiWrapperSingleton.icaltime_as_ical_string, "icaltime_as_ical_string", \ &EDSAbiWrapperSingleton.icaltime_from_string, "icaltime_from_string", \ &EDSAbiWrapperSingleton.icaltime_from_timet, "icaltime_from_timet", \ &EDSAbiWrapperSingleton.icaltime_null_time, "icaltime_null_time", \ &EDSAbiWrapperSingleton.icaltime_as_timet, "icaltime_as_timet", \ &EDSAbiWrapperSingleton.icaltime_set_timezone, "icaltime_set_timezone", \ &EDSAbiWrapperSingleton.icaltime_convert_to_zone, "icaltime_convert_to_zone", \ &EDSAbiWrapperSingleton.icaltime_get_timezone, "icaltime_get_timezone", \ &EDSAbiWrapperSingleton.icaltimezone_free, "icaltimezone_free", \ &EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone, "icaltimezone_get_builtin_timezone", \ &EDSAbiWrapperSingleton.icaltimezone_get_builtin_timezone_from_tzid, "icaltimezone_get_builtin_timezone_from_tzid", \ &EDSAbiWrapperSingleton.icaltimezone_get_component, "icaltimezone_get_component", \ &EDSAbiWrapperSingleton.icaltimezone_get_tzid, "icaltimezone_get_tzid", \ &EDSAbiWrapperSingleton.icaltimezone_new, "icaltimezone_new", \ &EDSAbiWrapperSingleton.icaltimezone_set_component, "icaltimezone_set_component", \ &EDSAbiWrapperSingleton.icaltimezone_get_location, "icaltimezone_get_location", \ &EDSAbiWrapperSingleton.ical_tzid_prefix, "ical_tzid_prefix", \ &EDSAbiWrapperSingleton.icalerror_set_errno, "icalerror_set_errno", \ &EDSAbiWrapperSingleton.icalproperty_new_dtstart, "icalproperty_new_dtstart", \ &EDSAbiWrapperSingleton.icalproperty_new_rrule, "icalproperty_new_rrule", \ &EDSAbiWrapperSingleton.icalproperty_new_tzid, "icalproperty_new_tzid", \ &EDSAbiWrapperSingleton.icalproperty_new_tzname, "icalproperty_new_tzname", \ &EDSAbiWrapperSingleton.icalproperty_new_tzoffsetfrom, "icalproperty_new_tzoffsetfrom", \ &EDSAbiWrapperSingleton.icalproperty_new_tzoffsetto, "icalproperty_new_tzoffsetto", \ &EDSAbiWrapperSingleton.icalproperty_new_x, "icalproperty_new_x", \ &EDSAbiWrapperSingleton.icalproperty_set_x_name, "icalproperty_set_x_name", \ &EDSAbiWrapperSingleton.icalrecur_iterator_free, "icalrecur_iterator_free", \ &EDSAbiWrapperSingleton.icalrecur_iterator_new, "icalrecur_iterator_new", \ &EDSAbiWrapperSingleton.icalrecur_iterator_next, "icalrecur_iterator_next", \ &EDSAbiWrapperSingleton.icalrecurrencetype_clear, "icalrecurrencetype_clear", \ &EDSAbiWrapperSingleton.icaltime_day_of_week, "icaltime_day_of_week", \ &EDSAbiWrapperSingleton.icaltime_days_in_month, "icaltime_days_in_month", \ &EDSAbiWrapperSingleton.icaltzutil_get_zone_directory, "icaltzutil_get_zone_directory", \ // icalparameter_new_scheduleagent was added in libical.so.1. We // use it only to detect the libical 1.0 ABI. This works because // all methods in EDS_ABI_WRAPPER_ICAL_R are considered optional. #define EDS_ABI_WRAPPER_ICAL_R \ &EDSAbiWrapperSingleton.icalparameter_new_scheduleagent, "icalparameter_new_scheduleagent", \ &EDSAbiWrapperSingleton.icalcomponent_as_ical_string_r, "icalcomponent_as_ical_string_r", \ &EDSAbiWrapperSingleton.icaltime_as_ical_string_r, "icaltime_as_ical_string_r", \ &EDSAbiWrapperSingleton.icalproperty_get_value_as_string_r, "icalproperty_get_value_as_string_r", # ifdef ENABLE_ECAL static const int libecalMinVersion = 3, libecalMaxVersion = 11; // EDS 3.4 ecalhandle = findSymbols("libecal-1.2.so", libecalMinVersion, libecalMaxVersion, FIND_SYMBOLS_NEED_ALL, NULL, &EDSAbiWrapperSingleton.e_cal_add_timezone, "e_cal_add_timezone", &EDSAbiWrapperSingleton.e_cal_component_get_icalcomponent, "e_cal_component_get_icalcomponent", &EDSAbiWrapperSingleton.e_cal_component_get_last_modified, "e_cal_component_get_last_modified", &EDSAbiWrapperSingleton.e_cal_component_get_type, "e_cal_component_get_type", &EDSAbiWrapperSingleton.e_cal_create_object, "e_cal_create_object", &EDSAbiWrapperSingleton.e_calendar_error_quark, "e_calendar_error_quark", &EDSAbiWrapperSingleton.e_cal_get_component_as_string, "e_cal_get_component_as_string", &EDSAbiWrapperSingleton.e_cal_get_object, "e_cal_get_object", &EDSAbiWrapperSingleton.e_cal_get_object_list_as_comp, "e_cal_get_object_list_as_comp", &EDSAbiWrapperSingleton.e_cal_get_sources, "e_cal_get_sources", &EDSAbiWrapperSingleton.e_cal_get_timezone, "e_cal_get_timezone", &EDSAbiWrapperSingleton.e_cal_modify_object, "e_cal_modify_object", &EDSAbiWrapperSingleton.e_cal_new, "e_cal_new", &EDSAbiWrapperSingleton.e_cal_new_from_uri, "e_cal_new_from_uri", &EDSAbiWrapperSingleton.e_cal_new_system_calendar, "e_cal_new_system_calendar", &EDSAbiWrapperSingleton.e_cal_new_system_tasks, "e_cal_new_system_tasks", &EDSAbiWrapperSingleton.e_cal_get_uri, "e_cal_get_uri", &EDSAbiWrapperSingleton.e_cal_open, "e_cal_open", &EDSAbiWrapperSingleton.e_cal_remove_object, "e_cal_remove_object", &EDSAbiWrapperSingleton.e_cal_remove_object_with_mod, "e_cal_remove_object_with_mod", &EDSAbiWrapperSingleton.e_cal_set_auth_func, "e_cal_set_auth_func", EDS_ABI_WRAPPER_ICAL_BASE (void *)0); EDSAbiHaveEcal = EDSAbiWrapperSingleton.e_cal_new != 0; ecalhandle = findSymbols("libecal-1.2.so", libecalMinVersion, libecalMaxVersion, 0, NULL, EDS_ABI_WRAPPER_ICAL_R (void *)0); # endif // ENABLE_ECAL # ifdef ENABLE_ICAL if (!EDSAbiWrapperSingleton.icalcomponent_add_component) { // libecal not found above (or not enabled), but libical // might still be available, so check for it separately ecalhandle = findSymbols("libical.so", 0, 1, FIND_SYMBOLS_NEED_ALL, NULL, EDS_ABI_WRAPPER_ICAL_BASE (void *)0); ecalhandle = findSymbols("libical.so", 0, 1, 0, NULL, EDS_ABI_WRAPPER_ICAL_R (void *)0); } EDSAbiHaveIcal = EDSAbiWrapperSingleton.icalcomponent_add_component != 0; EDSAbiHaveIcal1 = EDSAbiWrapperSingleton.icalparameter_new_scheduleagent != 0; # endif // ENABLE_ICAL # ifdef ENABLE_BLUETOOTH int bluetooth_version; libbluetoothhandle = findSymbols("libbluetooth.so", 2, 3, 0, &bluetooth_version, &EDSAbiWrapperSingleton.sdp_close, "sdp_close", &EDSAbiWrapperSingleton.sdp_connect, "sdp_connect", &EDSAbiWrapperSingleton.sdp_extract_pdu, "sdp_extract_pdu", &EDSAbiWrapperSingleton.sdp_extract_pdu_safe, "sdp_extract_pdu_safe", &EDSAbiWrapperSingleton.sdp_extract_seqtype, "sdp_extract_seqtype", &EDSAbiWrapperSingleton.sdp_extract_seqtype_safe, "sdp_extract_seqtype_safe", &EDSAbiWrapperSingleton.sdp_get_access_protos, "sdp_get_access_protos", &EDSAbiWrapperSingleton.sdp_get_proto_port, "sdp_get_proto_port", &EDSAbiWrapperSingleton.sdp_get_socket, "sdp_get_socket", &EDSAbiWrapperSingleton.sdp_list_append, "sdp_list_append", &EDSAbiWrapperSingleton.sdp_list_free, "sdp_list_free", &EDSAbiWrapperSingleton.sdp_process, "sdp_process", &EDSAbiWrapperSingleton.sdp_record_free, "sdp_record_free", &EDSAbiWrapperSingleton.sdp_service_search_attr_async, "sdp_service_search_attr_async", &EDSAbiWrapperSingleton.sdp_set_notify, "sdp_set_notify", &EDSAbiWrapperSingleton.sdp_uuid128_create, "sdp_uuid128_create", &EDSAbiWrapperSingleton.str2ba, "str2ba", (void *)0); if (bluetooth_version == 2) { // libbluetooth.so.2's sdp_extract_pdu() and // sdp_extract_seqtype() do not match our prototype (have no // bufsize). Some versions have a _safe variant. If not, use // wrappers which accept the bufsize parameter and drop it. if (!EDSAbiWrapperSingleton.sdp_extract_pdu_safe) { EDSAbiWrapperSingleton.sdp_extract_pdu_safe = wrap_sdp_extract_pdu; } if (!EDSAbiWrapperSingleton.sdp_extract_seqtype_safe) { EDSAbiWrapperSingleton.sdp_extract_seqtype_safe = wrap_sdp_extract_seqtype; } } else { // _safe variants were removed in favor of an API/ABI change. Redirect // into normal versions. We know they have the right prototype because // of that change. EDSAbiWrapperSingleton.sdp_extract_pdu_safe = reinterpret_cast(EDSAbiWrapperSingleton.sdp_extract_pdu); EDSAbiWrapperSingleton.sdp_extract_seqtype_safe = reinterpret_cast(EDSAbiWrapperSingleton.sdp_extract_seqtype); } SyncEvoHaveLibbluetooth = EDSAbiWrapperSingleton.sdp_connect != 0; # endif } #elif defined(EVOLUTION_ICAL_COMPATIBILITY) // Simpler version of the ABI wrapper which only checks for // libical.so.1. To be used with normal linking against libical.so.0 // and then patching the resulting files to be used with libical.so.1 // instead. int EDSAbiHaveIcal1; void EDSAbiWrapperInit() { static bool initialized; if (initialized) { return; } else { initialized = true; } // Bind icaltimezone_get_component() and // icaltzutil_fetch_timezone() to the version found (or not found, // if not enabled) in our own executable. Without this, the // dynamic linker on Ubuntu Saucy and Trusty prefers the versions // from libical once it is loaded. void *fetch = dlsym(RTLD_DEFAULT, "icaltzutil_fetch_timezone"); void *get = dlsym(RTLD_DEFAULT, "icaltimezone_get_component"); getLookupDebug() += SyncEvo::StringPrintf("icaltzutil_fetch_timezone = %p\n", fetch); getLookupDebug() += SyncEvo::StringPrintf("icaltimezone_get_component = %p", get); static const char *soname = "libical.so.1"; void *dlhandle = dlopen(soname, RTLD_GLOBAL|RTLD_LAZY); if (dlhandle) { getLookupInfo() += "using "; getLookupInfo() += soname; getLookupInfo() += "\n"; EDSAbiHaveIcal1 = 1; dlclose(dlhandle); } } #endif // EVOLUTION_COMPATIBILITY extern "C" const char *EDSAbiWrapperInfo() { EDSAbiWrapperInit(); return getLookupInfo().c_str(); } extern "C" const char *EDSAbiWrapperDebug() { EDSAbiWrapperInit(); return getLookupDebug().c_str(); } #ifdef ENABLE_DBUS_TIMEOUT_HACK /** * There are valid use cases where the (previously hard-coded) default * timeout was too short. For example, libecal and libebook >= 2.30 * implement their synchronous API with synchronous D-Bus method calls, * which inevitably suffers from timeouts on slow hardware with large * amount of data (MBC #4026). * * This function replaces _DBUS_DEFAULT_TIMEOUT_VALUE and - if set - * interprets the content of SYNCEVOLUTION_DBUS_TIMEOUT as number of * milliseconds. 0 disables timeouts, which is also the default if the * env variable is not set. */ static int _dbus_connection_default_timeout(void) { const char *def = getenv("SYNCEVOLUTION_DBUS_TIMEOUT"); int timeout = 0; if (def) { timeout = atoi(def); } if (timeout == 0) { timeout = INT_MAX - 1; // not infinite, but very long; // INT_MAX led to a valgrind report in poll()/libdbus, // avoid it } return timeout; } extern "C" int dbus_connection_send_with_reply (void *connection, void *message, void **pending_return, int timeout_milliseconds) { static typeof(dbus_connection_send_with_reply) *real_func; if (!real_func) { real_func = (typeof(dbus_connection_send_with_reply) *)dlsym(RTLD_NEXT, "dbus_connection_send_with_reply"); } return real_func ? real_func(connection, message, pending_return, timeout_milliseconds == -1 ? _dbus_connection_default_timeout() : timeout_milliseconds) : 0; } #endif // ENABLE_DBUS_TIMEOUT_HACK syncevolution-1.5/src/syncevo/GLibSupport.cpp0000664000373300001540000002664012330727742022732 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #ifdef ENABLE_UNIT_TESTS #include "test.h" #endif #include #include #include #include #ifdef HAVE_GLIB #include #include #endif using namespace std; SE_BEGIN_CXX #ifdef HAVE_GLIB class Select { GMainLoop *m_loop; GMainContext *m_context; struct FDSource; FDSource *m_source; Timespec m_deadline; GPollFD m_pollfd; GLibSelectResult m_result; struct FDSource { GSource m_source; Select *m_select; static gboolean prepare(GSource *source, gint *timeout) { FDSource *fdsource = (FDSource *)source; if (!fdsource->m_select->m_deadline) { *timeout = -1; return FALSE; } Timespec now = Timespec::monotonic(); if (now < fdsource->m_select->m_deadline) { Timespec delta = fdsource->m_select->m_deadline - now; *timeout = delta.tv_sec * 1000 + delta.tv_nsec / 1000000; return FALSE; } else { fdsource->m_select->m_result = GLIB_SELECT_TIMEOUT; *timeout = 0; return TRUE; } } static gboolean check(GSource *source) { FDSource *fdsource = (FDSource *)source; if (fdsource->m_select->m_pollfd.revents) { fdsource->m_select->m_result = GLIB_SELECT_READY; return TRUE; } else { return FALSE; } } static gboolean dispatch(GSource *source, GSourceFunc callback, gpointer user_data) { FDSource *fdsource = (FDSource *)source; g_main_loop_quit(fdsource->m_select->m_loop); return FALSE; } static GSourceFuncs m_funcs; }; public: Select(GMainLoop *loop, int fd, int direction, Timespec *timeout) : m_loop(loop), m_context(g_main_loop_get_context(loop)), m_result(GLIB_SELECT_QUIT) { if (timeout) { m_deadline = Timespec::monotonic() + *timeout; } memset(&m_pollfd, 0, sizeof(m_pollfd)); m_source = (FDSource *)g_source_new(&FDSource::m_funcs, sizeof(FDSource)); if (!m_source) { SE_THROW("no FDSource"); } m_source->m_select = this; m_pollfd.fd = fd; if (fd >= 0 && direction != GLIB_SELECT_NONE) { if (direction & GLIB_SELECT_READ) { m_pollfd.events |= G_IO_IN | G_IO_HUP | G_IO_ERR; } if (direction & GLIB_SELECT_WRITE) { m_pollfd.events |= G_IO_OUT | G_IO_ERR; } g_source_add_poll(&m_source->m_source, &m_pollfd); } g_source_attach(&m_source->m_source, m_context); } ~Select() { if (m_source) { g_source_destroy(&m_source->m_source); } } GLibSelectResult run() { g_main_loop_run(m_loop); return m_result; } }; GSourceFuncs Select::FDSource::m_funcs = { Select::FDSource::prepare, Select::FDSource::check, Select::FDSource::dispatch }; GLibSelectResult GLibSelect(GMainLoop *loop, int fd, int direction, Timespec *timeout) { Select instance(loop, fd, direction, timeout); return instance.run(); } void GErrorCXX::throwError(const SourceLocation &where, const string &action) { throwError(where, action, m_gerror); } void GErrorCXX::throwError(const SourceLocation &where, const string &action, const GError *err) { string gerrorstr = action; if (!gerrorstr.empty()) { gerrorstr += ": "; } if (err) { gerrorstr += err->message; // No need to clear m_error! Will be done as part of // destructing the GErrorCCXX. } else { gerrorstr = "failure"; } throw Exception(where.m_file, where.m_line, gerrorstr); } static void changed(GFileMonitor *monitor, GFile *file1, GFile *file2, GFileMonitorEvent event, gpointer userdata) { GLibNotify::callback_t *callback = static_cast(userdata); if (!callback->empty()) { (*callback)(file1, file2, event); } } GLibNotify::GLibNotify(const char *file, const callback_t &callback) : m_callback(callback) { GFileCXX filecxx(g_file_new_for_path(file), TRANSFER_REF); GErrorCXX gerror; GFileMonitorCXX monitor(g_file_monitor_file(filecxx.get(), G_FILE_MONITOR_NONE, NULL, gerror), TRANSFER_REF); m_monitor.swap(monitor); if (!m_monitor) { gerror.throwError(SE_HERE, std::string("monitoring ") + file); } g_signal_connect_after(m_monitor.get(), "changed", G_CALLBACK(changed), (void *)&m_callback); } class PendingChecks { typedef std::set *> Checks; Checks m_checks; DynMutex m_mutex; Cond m_cond; public: /** * Called by main thread before and after sleeping. * Runs all registered checks and removes the ones * which are done. */ void runChecks(); /** * Called by additional threads. Returns when check() * returned false. */ void blockOnCheck(const boost::function &check, bool checkFirst); }; void PendingChecks::runChecks() { DynMutex::Guard guard = m_mutex.lock(); Checks::iterator it = m_checks.begin(); bool removed = false; while (it != m_checks.end()) { bool cont; try { cont = (**it)(); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); // keep compiler happy cont = false; } if (!cont) { // Done with this check Checks::iterator next = it; ++next; m_checks.erase(it); it = next; removed = true; } else { ++it; } } // Tell blockOnCheck() calls that they may have completed. if (removed) { m_cond.signal(); } } void PendingChecks::blockOnCheck(const boost::function &check, bool checkFirst) { DynMutex::Guard guard = m_mutex.lock(); // When we get here, the conditions for returning may already have // been met. Check before sleeping. If we need to continue, then // holding the mutex ensures that the main thread will run the // check on the next iteration. if (!checkFirst || check()) { m_checks.insert(&check); if (!checkFirst) { // Must wake up the main thread from its g_main_context_iteration. g_main_context_wakeup(g_main_context_default()); } do { m_cond.wait(m_mutex); } while (m_checks.find(&check) != m_checks.end()); } } void GRunWhile(const boost::function &check, bool checkFirst) { static PendingChecks checks; if (g_main_context_is_owner(g_main_context_default())) { // Check once before sleeping, conditions may already be met // for some checks. checks.runChecks(); // Drive event loop. while (check()) { g_main_context_iteration(NULL, true); checks.runChecks(); } } else { // Transfer check into main thread. checks.blockOnCheck(check, checkFirst); } } static std::string NoThrow(const boost::function &action) throw () { try { action(); } catch (...) { // std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); return explanation; } return ""; } void GRunInMain(const boost::function &action) { std::string explanation; // Wrap in NoThrow, then rethrow exception in current thread if there was a problem. GRunWhile((boost::lambda::var(explanation) = boost::lambda::bind(NoThrow, action), false), false); if (!explanation.empty()) { Exception::tryRethrow(explanation, true); } } bool GRunIsMain() { // This works because SyncContext::initMain() permanently acquires // the main context in the main thread. return g_main_context_is_owner(g_main_context_default()); } #ifdef ENABLE_UNIT_TESTS class GLibTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(GLibTest); CPPUNIT_TEST(notify); CPPUNIT_TEST_SUITE_END(); struct Event { GFileCXX m_file1; GFileCXX m_file2; GFileMonitorEvent m_event; }; static void notifyCallback(list &events, GFile *file1, GFile *file2, GFileMonitorEvent event) { Event tmp; tmp.m_file1.reset(file1); tmp.m_file2.reset(file2); tmp.m_event = event; events.push_back(tmp); } static gboolean timeout(gpointer data) { g_main_loop_quit(static_cast(data)); return false; } void notify() { list events; static const char *name = "GLibTest.out"; unlink(name); GMainLoopCXX loop(g_main_loop_new(NULL, FALSE), TRANSFER_REF); if (!loop) { SE_THROW("could not allocate main loop"); } GLibNotify notify(name, boost::bind(notifyCallback, boost::ref(events), _1, _2, _3)); { events.clear(); GLibEvent id(g_timeout_add_seconds(5, timeout, loop.get()), "timeout"); ofstream out(name); out << "hello"; out.close(); g_main_loop_run(loop.get()); CPPUNIT_ASSERT(!events.empty()); } { events.clear(); ofstream out(name); out.close(); GLibEvent id(g_timeout_add_seconds(5, timeout, loop.get()), "timeout"); g_main_loop_run(loop.get()); CPPUNIT_ASSERT(!events.empty()); } { events.clear(); unlink(name); GLibEvent id(g_timeout_add_seconds(5, timeout, loop.get()), "timeout"); g_main_loop_run(loop.get()); CPPUNIT_ASSERT(!events.empty()); } } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(GLibTest); #endif // ENABLE_UNIT_TESTS #else // HAVE_GLIB GLibSelectResult GLibSelect(GMainLoop *loop, int fd, int direction, Timespec *timeout) { SE_THROW("GLibSelect() not implemented without glib support"); return GLIB_SELECT_QUIT; } #endif // HAVE_GLIB SE_END_CXX syncevolution-1.5/src/syncevo/GVariantSupport.h0000664000373300001540000000346312405555067023275 0ustar00nightlynightly00000000000000/* * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_GVARIANT_SUPPORT #define INCL_GVARIANT_SUPPORT #include #ifdef HAVE_GLIB SE_GLIB_TYPE(GVariant, g_variant) #endif #include SE_BEGIN_CXX #ifdef HAVE_GLIB // G_VARIANT_TYPE_VARDICT was introduced in glib 2.32 #if GLIB_CHECK_VERSION(2,32,0) // Originally from google-oauth2-example.c, which is also under LGPL // 2.1, or any later version. GVariantCXX HashTable2Variant(const GHashTable *hashTable) throw (); /** * The created GHashTable maps strings to GVariants which are * reference counted, so when adding or setting values, use g_variant_ref_sink(g_variant_new_...()). */ GHashTableCXX Variant2HashTable(GVariant *variant) throw (); #endif // GLIB_CHECK_VERSION /** * The created GHashTable maps strings to strings. Both key and values * are owned by the hash table. Will throw errors if the variant * has entries with a different kind of key or value. */ GHashTableCXX Variant2StrHashTable(GVariant *variant); #endif // HAVE_GLIB SE_END_CXX #endif // INCL_GVARIANT_SUPPORT syncevolution-1.5/src/syncevo/GVariantSupport.cpp0000664000373300001540000000546512424700450023621 0ustar00nightlynightly00000000000000/* * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include SE_BEGIN_CXX #ifdef HAVE_GLIB #if GLIB_CHECK_VERSION(2,32,0) GVariantCXX HashTable2Variant(const GHashTable *hashTable) throw () { GVariantBuilder builder; GHashTableIter iter; const gchar *key; GVariant *value; if (!hashTable) { return GVariantCXX(); } g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT); g_hash_table_iter_init(&iter, (GHashTable *)hashTable); while (g_hash_table_iter_next(&iter, (gpointer *)&key, (gpointer *)&value)) { g_variant_builder_add(&builder, "{sv}", key, g_variant_ref(value)); } GVariantStealCXX variant(g_variant_ref_sink(g_variant_builder_end(&builder))); return variant; } GHashTableCXX Variant2HashTable(GVariant *variant) throw () { if (!variant) { return GHashTableCXX(); } GVariantIter iter; GVariant *value; gchar *key; GHashTableStealCXX hashTable(g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref)); g_variant_iter_init(&iter, variant); while (g_variant_iter_next(&iter, "{sv}", &key, &value)) { g_hash_table_insert(hashTable, g_strdup(key), g_variant_ref(value)); } return hashTable; } #endif // GLIB_CHECK_VERSION GHashTableCXX Variant2StrHashTable(GVariant *variant) { GVariantIter iter; gchar *value; gchar *key; GHashTableStealCXX hashTable(g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free)); g_variant_iter_init(&iter, variant); while (g_variant_iter_next(&iter, "{ss}", &key, &value)) { g_hash_table_insert(hashTable, g_strdup(key), g_strdup(value)); } return hashTable; } #endif // HAVE_GLIB SE_END_CXX syncevolution-1.5/src/syncevo/SyncML.cpp0000664000373300001540000012714212405555067021666 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; SE_BEGIN_CXX SimpleSyncMode SimplifySyncMode(SyncMode mode, bool peerIsClient) { switch (mode) { case SYNC_NONE: case SYNC_TWO_WAY: case SYNC_SLOW: case SYNC_RESTORE_FROM_BACKUP: case SYNC_ONE_WAY_FROM_LOCAL: case SYNC_REFRESH_FROM_LOCAL: case SYNC_ONE_WAY_FROM_REMOTE: case SYNC_REFRESH_FROM_REMOTE: return static_cast(mode); case SA_SYNC_ONE_WAY_FROM_CLIENT: case SYNC_ONE_WAY_FROM_CLIENT: return peerIsClient ? SIMPLE_SYNC_ONE_WAY_FROM_REMOTE : SIMPLE_SYNC_ONE_WAY_FROM_LOCAL; case SA_SYNC_REFRESH_FROM_CLIENT: case SYNC_REFRESH_FROM_CLIENT: return peerIsClient ? SIMPLE_SYNC_REFRESH_FROM_REMOTE : SIMPLE_SYNC_REFRESH_FROM_LOCAL; case SA_SYNC_ONE_WAY_FROM_SERVER: case SYNC_ONE_WAY_FROM_SERVER: return peerIsClient ? SIMPLE_SYNC_ONE_WAY_FROM_LOCAL : SIMPLE_SYNC_ONE_WAY_FROM_REMOTE; case SA_SYNC_REFRESH_FROM_SERVER: case SYNC_REFRESH_FROM_SERVER: return peerIsClient ? SIMPLE_SYNC_REFRESH_FROM_LOCAL : SIMPLE_SYNC_REFRESH_FROM_REMOTE; case SA_SYNC_TWO_WAY: return SIMPLE_SYNC_TWO_WAY; case SYNC_LOCAL_CACHE_SLOW: return SIMPLE_SYNC_LOCAL_CACHE_SLOW; case SYNC_LOCAL_CACHE_INCREMENTAL: return SIMPLE_SYNC_LOCAL_CACHE_INCREMENTAL; case SYNC_LAST: case SYNC_INVALID: return SIMPLE_SYNC_INVALID; } return SIMPLE_SYNC_INVALID; } SANSyncMode AlertSyncMode(SyncMode mode, bool peerIsClient) { switch(mode) { case SYNC_RESTORE_FROM_BACKUP: case SYNC_NONE: case SYNC_LAST: case SYNC_INVALID: return SA_INVALID; case SYNC_SLOW: case SYNC_LOCAL_CACHE_SLOW: return SA_SLOW; case SYNC_TWO_WAY: case SA_SYNC_TWO_WAY: case SYNC_LOCAL_CACHE_INCREMENTAL: // use two-way because it is more likely to be implemented return SA_TWO_WAY; case SYNC_ONE_WAY_FROM_CLIENT: case SA_SYNC_ONE_WAY_FROM_CLIENT: return SA_ONE_WAY_FROM_CLIENT; case SYNC_REFRESH_FROM_CLIENT: case SA_SYNC_REFRESH_FROM_CLIENT: return SA_REFRESH_FROM_CLIENT; case SYNC_ONE_WAY_FROM_SERVER: case SA_SYNC_ONE_WAY_FROM_SERVER: return SA_ONE_WAY_FROM_SERVER; case SYNC_REFRESH_FROM_SERVER: case SA_SYNC_REFRESH_FROM_SERVER: return SA_REFRESH_FROM_SERVER; case SYNC_ONE_WAY_FROM_LOCAL: return peerIsClient ? SA_ONE_WAY_FROM_SERVER : SA_ONE_WAY_FROM_CLIENT; case SYNC_REFRESH_FROM_LOCAL: return peerIsClient ? SA_REFRESH_FROM_SERVER : SA_REFRESH_FROM_CLIENT; case SYNC_ONE_WAY_FROM_REMOTE: return peerIsClient ? SA_ONE_WAY_FROM_CLIENT : SA_ONE_WAY_FROM_SERVER; case SYNC_REFRESH_FROM_REMOTE: return peerIsClient ? SA_REFRESH_FROM_CLIENT : SA_REFRESH_FROM_SERVER; } return SA_INVALID; } std::string PrettyPrintSyncMode(SyncMode mode, bool userVisible) { switch (mode) { case SYNC_NONE: return userVisible ? "disabled" : "SYNC_NONE"; case SYNC_TWO_WAY: case SA_SYNC_TWO_WAY: return userVisible ? "two-way" : "SYNC_TWO_WAY"; case SYNC_SLOW: return userVisible ? "slow" : "SYNC_SLOW"; case SYNC_ONE_WAY_FROM_CLIENT: case SA_SYNC_ONE_WAY_FROM_CLIENT: return userVisible ? "one-way-from-client" : "SYNC_ONE_WAY_FROM_CLIENT"; case SYNC_REFRESH_FROM_CLIENT: case SA_SYNC_REFRESH_FROM_CLIENT: return userVisible ? "refresh-from-client" : "SYNC_REFRESH_FROM_CLIENT"; case SYNC_ONE_WAY_FROM_SERVER: case SA_SYNC_ONE_WAY_FROM_SERVER: return userVisible ? "one-way-from-server" : "SYNC_ONE_WAY_FROM_SERVER"; case SYNC_REFRESH_FROM_SERVER: case SA_SYNC_REFRESH_FROM_SERVER: return userVisible ? "refresh-from-server" : "SYNC_REFRESH_FROM_SERVER"; case SYNC_RESTORE_FROM_BACKUP: return userVisible ? "restore-from-backup" : "SYNC_RESTORE_FROM_BACKUP"; case SYNC_ONE_WAY_FROM_LOCAL: return userVisible ? "one-way-from-local" : "SYNC_REFRESH_FROM_LOCAL"; case SYNC_REFRESH_FROM_LOCAL: return userVisible ? "refresh-from-local" : "SYNC_REFRESH_FROM_LOCAL"; case SYNC_ONE_WAY_FROM_REMOTE: return userVisible ? "one-way-from-remote" : "SYNC_ONE_WAY_FROM_REMOTE"; case SYNC_REFRESH_FROM_REMOTE: return userVisible ? "refresh-from-remote" : "SYNC_REFRESH_FROM_REMOTE"; case SYNC_LOCAL_CACHE_SLOW: return userVisible ? "local-cache-slow" : "SYNC_LOCAL_CACHE_SLOW"; case SYNC_LOCAL_CACHE_INCREMENTAL: return userVisible ? "local-cache-incremental" : "SYNC_LOCAL_CACHE_INCREMENTAL"; default: std::stringstream res; res << (userVisible ? "sync-mode-" : "SYNC_") << int(mode); return res.str(); } } SyncMode StringToSyncMode(const std::string &mode, bool serverAlerted) { if (boost::iequals(mode, "slow") || boost::iequals(mode, "SYNC_SLOW")) { return SYNC_SLOW; } else if (boost::iequals(mode, "two-way") || boost::iequals(mode, "SYNC_TWO_WAY")) { return serverAlerted ?SA_SYNC_TWO_WAY: SYNC_TWO_WAY; } else if (boost::iequals(mode, "refresh-from-server") || boost::iequals(mode, "SYNC_REFRESH_FROM_SERVER")) { return serverAlerted? SA_SYNC_REFRESH_FROM_SERVER: SYNC_REFRESH_FROM_SERVER; } else if (boost::iequals(mode, "refresh-from-client") || boost::iequals(mode, "SYNC_REFRESH_FROM_CLIENT")) { return serverAlerted? SA_SYNC_REFRESH_FROM_CLIENT: SYNC_REFRESH_FROM_CLIENT; } else if (boost::iequals(mode, "one-way-from-server") || boost::iequals(mode, "SYNC_ONE_WAY_FROM_SERVER")) { return serverAlerted? SA_SYNC_ONE_WAY_FROM_SERVER: SYNC_ONE_WAY_FROM_SERVER; } else if (boost::iequals(mode, "one-way-from-client") || boost::iequals(mode, "SYNC_ONE_WAY_FROM_CLIENT")) { return serverAlerted? SA_SYNC_ONE_WAY_FROM_CLIENT: SYNC_ONE_WAY_FROM_CLIENT; } else if (boost::iequals(mode, "refresh-from-remote") || boost::iequals(mode, "SYNC_REFRESH_FROM_REMOTE")) { return SYNC_REFRESH_FROM_REMOTE; } else if (boost::iequals(mode, "refresh-from-local") || boost::iequals(mode, "SYNC_REFRESH_FROM_LOCAL")) { return SYNC_REFRESH_FROM_LOCAL; } else if (boost::iequals(mode, "one-way-from-remote") || boost::iequals(mode, "SYNC_ONE_WAY_FROM_REMOTE")) { return SYNC_ONE_WAY_FROM_REMOTE; } else if (boost::iequals(mode, "one-way-from-local") || boost::iequals(mode, "SYNC_ONE_WAY_FROM_LOCAL")) { return SYNC_ONE_WAY_FROM_LOCAL; } else if (boost::iequals(mode, "disabled") || boost::iequals(mode, "SYNC_NONE")) { return SYNC_NONE; } else if (boost::iequals(mode, "local-cache-slow") || boost::iequals(mode, "SYNC_LOCAL_CACHE_SLOW")) { return SYNC_LOCAL_CACHE_SLOW; } else if (boost::iequals(mode, "local-cache-incremental") || boost::iequals(mode, "SYNC_LOCAL_CACHE_INCREMENTAL")) { return SYNC_LOCAL_CACHE_INCREMENTAL; } else { return SYNC_INVALID; } } ContentType StringToContentType(const std::string &type, bool force) { if (boost::iequals (type, "text/x-vcard") || boost::iequals (type, "text/x-vcard:2.1")) { return WSPCTC_XVCARD; } else if (boost::iequals (type, "text/vcard") ||boost::iequals (type, "text/vcard:3.0")) { return force ? WSPCTC_VCARD : WSPCTC_XVCARD; } else if (boost::iequals (type, "text/x-vcalendar") ||boost::iequals (type, "text/x-vcalendar:1.0") ||boost::iequals (type, "text/x-calendar") || boost::iequals (type, "text/x-calendar:1.0")) { return WSPCTC_XVCALENDAR; } else if (boost::iequals (type, "text/calendar") ||boost::iequals (type, "text/calendar:2.0")) { return force ? WSPCTC_ICALENDAR : WSPCTC_XVCALENDAR; } else if (boost::iequals (type, "text/plain") ||boost::iequals (type, "text/plain:1.0")) { return WSPCTC_TEXT_PLAIN; } else { return WSPCTC_UNKNOWN; } } std::string GetLegacyMIMEType (const std::string &type, bool force) { if (boost::iequals (type, "text/x-vcard") || boost::iequals (type, "text/x-vcard:2.1")) { return "text/x-vcard"; } else if (boost::iequals (type, "text/vcard") ||boost::iequals (type, "text/vcard:3.0")) { return force ? "text/vcard" : "text/x-vcard"; } else if (boost::iequals (type, "text/x-vcalendar") ||boost::iequals (type, "text/x-vcalendar:1.0") ||boost::iequals (type, "text/x-calendar") || boost::iequals (type, "text/x-calendar:1.0")) { return "text/x-vcalendar"; } else if (boost::iequals (type, "text/calendar") ||boost::iequals (type, "text/calendar:2.0")) { return force ? "text/vcalendar" : "text/x-vcalendar"; } else if (boost::iequals (type, "text/plain") ||boost::iequals (type, "text/plain:1.0")) { return "text/plain"; } else { return ""; } } std::string Status2String(SyncMLStatus status) { string error; bool local; int code = status; local = status >= static_cast(sysync::LOCAL_STATUS_CODE); if (local && status <= static_cast(sysync::LOCAL_STATUS_CODE_END)) { code = status - static_cast(sysync::LOCAL_STATUS_CODE); } else { code = status; } switch (code) { case STATUS_OK: case STATUS_HTTP_OK: error = "no error"; break; case STATUS_NO_CONTENT: error = "no content/end of data"; break; case STATUS_DATA_MERGED: error = "data merged"; break; case STATUS_UNAUTHORIZED: error = "authorization failed"; break; case STATUS_FORBIDDEN: error = "access denied"; break; case STATUS_NOT_FOUND: error = "object not found"; break; case STATUS_COMMAND_NOT_ALLOWED: error = "operation not allowed"; break; case STATUS_OPTIONAL_FEATURE_NOT_SUPPORTED: error = "optional feature not supported"; break; case STATUS_AUTHORIZATION_REQUIRED: error = "authorization required"; break; case STATUS_COMMAND_GONE: error = "command gone"; break; case STATUS_SIZE_REQUIRED: error = "size required"; break; case STATUS_INCOMPLETE_COMMAND: error = "incomplete command"; break; case STATUS_REQUEST_ENTITY_TOO_LARGE: error = "request entity too large"; break; case STATUS_UNSUPPORTED_MEDIA_TYPE_OR_FORMAT: error = "unsupported media type or format"; break; case STATUS_REQUESTED_SIZE_TOO_BIG: error = "requested size too big"; break; case STATUS_RETRY_LATER: error = "retry later"; break; case STATUS_ALREADY_EXISTS: error = "object exists already"; break; case STATUS_UNKNOWN_SEARCH_GRAMMAR: error = "unknown search grammar"; break; case STATUS_BAD_CGI_OR_FILTER_QUERY: error = "bad CGI or filter query"; break; case STATUS_SOFT_DELETE_CONFLICT: error = "soft-delete conflict"; break; case STATUS_PARTIAL_ITEM_NOT_ACCEPTED: error = "partial item not accepted"; break; case STATUS_ITEM_NOT_EMPTY: error = "item not empty"; break; case STATUS_MOVE_FAILED: error = "move failed"; break; case STATUS_FATAL: error = "fatal error"; break; case STATUS_DATASTORE_FAILURE: error = "database failure"; break; case STATUS_FULL: error = "out of space"; break; case STATUS_UNEXPECTED_SLOW_SYNC: error = "unexpected slow sync"; break; case STATUS_PARTIAL_FAILURE: error = "some changes could not be transferred"; break; case STATUS_PASSWORD_TIMEOUT: error = "password request timed out"; break; case STATUS_RELEASE_TOO_OLD: error = "SyncEvolution binary V" VERSION " too old to use configuration"; break; case STATUS_MIGRATION_NEEDED: error = "proceeding would make backward incompatible changes, aborted"; break; case STATUS_SYNC_END_SHORTCUT: error = "intentionally skip sync session shutdown"; break; case sysync::LOCERR_BADPROTO: error = "bad or unknown protocol"; break; case sysync::LOCERR_SMLFATAL: error = "fatal problem with SML"; break; case sysync::LOCERR_COMMOPEN: error = "cannot open communication"; break; case sysync::LOCERR_SENDDATA: error = "cannot send data"; break; case sysync::LOCERR_RECVDATA: error = "cannot receive data"; break; case sysync::LOCERR_BADCONTENT: error = "bad content in response"; break; case sysync::LOCERR_PROCESSMSG: error = "SML (or SAN) error processing incoming message"; break; case sysync::LOCERR_COMMCLOSE: error = "cannot close communication"; break; case sysync::LOCERR_AUTHFAIL: error = "transport layer authorisation failed"; break; case sysync::LOCERR_CFGPARSE: error = "error parsing config file"; break; case sysync::LOCERR_CFGREAD: error = "error reading config file"; break; case sysync::LOCERR_NOCFG: error = "no config found"; break; case sysync::LOCERR_NOCFGFILE: error = "config file could not be found"; break; case sysync::LOCERR_EXPIRED: error = "expired"; break; case sysync::LOCERR_WRONGUSAGE: error = "bad usage"; break; case sysync::LOCERR_BADHANDLE: error = "bad handle"; break; case sysync::LOCERR_USERABORT: error = "aborted on behalf of user"; break; case sysync::LOCERR_BADREG: error = "bad registration"; break; case sysync::LOCERR_LIMITED: error = "limited trial version"; break; case sysync::LOCERR_TIMEOUT: error = "connection timeout"; break; case sysync::LOCERR_CERT_EXPIRED: error = "connection SSL certificate expired"; break; case sysync::LOCERR_CERT_INVALID: error = "connection SSL certificate invalid"; break; case sysync::LOCERR_INCOMPLETE: error = "incomplete sync session"; break; case sysync::LOCERR_RETRYMSG: error = "retry sending message"; break; case sysync::LOCERR_OUTOFMEM: error = "out of memory"; break; case sysync::LOCERR_NOCONN: error = "no means to open a connection"; break; case sysync::LOCERR_CONN: error = "connection cannot be established"; break; case sysync::LOCERR_ALREADY: error = "element is already installed"; break; case sysync::LOCERR_TOONEW: error = "this build is too new for this license"; break; case sysync::LOCERR_NOTIMP: error = "function not implemented"; break; case sysync::LOCERR_WRONGPROD: error = "this license code is valid, but not for this product"; break; case sysync::LOCERR_USERSUSPEND: error = "explicitly suspended on behalf of user"; break; case sysync::LOCERR_TOOOLD: error = "this build is too old for this SDK/plugin"; break; case sysync::LOCERR_UNKSUBSYSTEM: error = "unknown subsystem"; break; case sysync::LOCERR_SESSIONRST: error = "next message will be a session restart"; break; case sysync::LOCERR_LOCDBNOTRDY: error = "local datastore is not ready"; break; case sysync::LOCERR_RESTART: error = "session should be restarted from scratch"; break; case sysync::LOCERR_PIPECOMM: error = "internal pipe communication problem"; break; case sysync::LOCERR_BUFTOOSMALL: error = "buffer too small for requested value"; break; case sysync::LOCERR_TRUNCATED: error = "value truncated to fit into field or buffer"; break; case sysync::LOCERR_BADPARAM: error = "bad parameter"; break; case sysync::LOCERR_OUTOFRANGE: error = "out of range"; break; case sysync::LOCERR_TRANSPFAIL: error = "external transport failure"; break; case sysync::LOCERR_CLASSNOTREG: error = "class not registered"; break; case sysync::LOCERR_IIDNOTREG: error = "interface not registered"; break; case sysync::LOCERR_BADURL: error = "bad URL"; break; case sysync::LOCERR_SRVNOTFOUND: error = "server not found"; break; case STATUS_MAX: break; } string statusstr = StringPrintf("%s, status %d", local ? "local" : "remote", status); string description; if (error.empty()) { description = statusstr; } else { description = StringPrintf("%s (%s)", error.c_str(), statusstr.c_str()); } return description; } namespace { const char * const locNames[] = { "local", "remote", NULL }; const char * const stateNames[] = { "added", "updated", "removed", "any", NULL }; const char * const resultNames[] = { "total", "reject", "match", "conflict_server_won", "conflict_client_won", "conflict_duplicated", "sent", "received", NULL }; int toIndex(const char * const names[], const std::string &name) { int i; for (i = 0; names[i] && name != names[i]; i++) {} return i; } std::string toString(const char * const names[], int index) { for (int i = 0; names[i]; i++) { if (i == index) { return names[i]; } } return "unknown"; } } std::string SyncSourceReport::LocationToString(ItemLocation location) { return toString(locNames, location); } SyncSourceReport::ItemLocation SyncSourceReport::StringToLocation(const std::string &location) { return static_cast(toIndex(locNames, location)); } std::string SyncSourceReport::StateToString(ItemState state) { return toString(stateNames, state); } SyncSourceReport::ItemState SyncSourceReport::StringToState(const std::string &state) { return static_cast(toIndex(stateNames, state)); } std::string SyncSourceReport::ResultToString(ItemResult result) { return toString(resultNames, result); } SyncSourceReport::ItemResult SyncSourceReport::StringToResult(const std::string &result) { return static_cast(toIndex(resultNames, result)); } std::string SyncSourceReport::StatTupleToString(ItemLocation location, ItemState state, ItemResult result) { return std::string("") + LocationToString(location) + "-" + StateToString(state) + "-" + ResultToString(result); } void SyncSourceReport::StringToStatTuple(const std::string &str, ItemLocation &location, ItemState &state, ItemResult &result) { std::vector< std::string > tokens; boost::split(tokens, str, boost::is_any_of("-")); location = tokens.size() > 0 ? StringToLocation(tokens[0]) : ITEM_LOCATION_MAX; state = tokens.size() > 1 ? StringToState(tokens[1]) : ITEM_STATE_MAX; result = tokens.size() > 2 ? StringToResult(tokens[2]) : ITEM_RESULT_MAX; } bool SyncSourceReport::wasChanged(ItemLocation location) { for (int i = ITEM_ADDED; i < ITEM_ANY; i++) { if (getItemStat(location, (ItemState)i, ITEM_TOTAL) > 0) { return true; } } return false; } std::ostream &operator << (std::ostream &out, const SyncReport &report) { report.prettyPrint(out, 0); return out; } namespace { string fill(char sep, size_t width) { string res; res.resize(width - 1, sep); return res; } string center(char sep, const string &str, size_t width) { if (str.size() + 1 >= width) { return str; } else { string res; res.resize(width - 1, sep); res.replace((width - 1 - str.size()) / 2, str.size(), str); return res; } } string right(char sep, const string &str, size_t width) { if (str.size() + 1 >= width) { return str; } else { string res; res.resize(width - 1, sep); res.replace(width - 2 - str.size(), str.size(), str); return res; } } #if 0 string left(char sep, const string &str, size_t width) { if (str.size() + 1 >= width) { return str; } else { string res; res.resize(width - 1, sep); res.replace(1, str.size(), str); return res; } } #endif // insert string at column if it fits, otherwise flush right string align(char sep, const string &str, size_t width, size_t column) { if (column + str.size() + 1 >= width) { return right(sep, str, width); } else { string res; res.resize(width - 1, sep); res.replace(column, str.size(), str); return res; } } } SyncReport::SyncReport(const std::string &dump) { boost::shared_ptr data(new std::string(dump)); boost::shared_ptr blob(new StringDataBlob("sync report", data, true)); IniHashConfigNode node(blob); node >> *this; } std::string SyncReport::toString() const { boost::shared_ptr data(new std::string); boost::shared_ptr blob(new StringDataBlob("sync report", data, false)); IniHashConfigNode node(blob); node << *this; node.flush(); return *data; } void SyncReport::prettyPrint(std::ostream &out, int flags) const { // table looks like this: // +-------------------+-------------------------------+-------------------------------|-CON-+ // | | LOCAL | REMOTE | FLI | // | Source | NEW | MOD | DEL | ERR | TOTAL | NEW | MOD | DEL | ERR | TOTAL | CTS | // +-------------------+-----+-----+-----+-----+-------+-----+-----+-----+-----+-------+-----+ // // Most of the columns can be turned on or off dynamically. // Their width is calculated once (including right separators and spaces): // | name_width |count_width| | |conflict_width| // |client_width | server_width | // | text_width | // name column is sized dynamically based on column header and actual names size_t name_width = strlen("Source"); BOOST_FOREACH(const SyncReport::value_type &entry, *this) { const std::string &name = entry.first; if (name_width < name.size()) { name_width = name.size(); } } name_width += 1; // separator if (name_width < 20) { // enough room for spaces name_width += 2; } int count_width = 6; int num_counts = 3; if (flags & WITH_TOTAL) { num_counts++; } if (!(flags & WITHOUT_REJECTS)) { num_counts++; } int client_width = (flags & WITHOUT_CLIENT) ? 0 : num_counts * count_width; int server_width = (flags & WITHOUT_SERVER) ? 0 : num_counts * count_width; int conflict_width = (flags & WITHOUT_CONFLICTS) ? 0 : 6; int text_width = name_width + client_width + server_width + conflict_width; if (text_width < 70) { // enlarge name column to make room for long lines of text name_width += 70 - text_width; text_width = 70; } out << "+" << fill('-', name_width); if (!(flags & WITHOUT_CLIENT)) { out << '|' << center('-', "", client_width); } if (!(flags & WITHOUT_SERVER)) { out << '|' << center('-', "", server_width); } if (!(flags & WITHOUT_CONFLICTS)) { out << '|' << center('-', "CON", conflict_width); } out << "+\n"; if (!(flags & WITHOUT_REJECTS) || !(flags & WITHOUT_CONFLICTS)) { out << "|" << fill(' ', name_width); if (!(flags & WITHOUT_CLIENT)) { out << '|' << center(' ', m_localName, client_width); } if (!(flags & WITHOUT_SERVER)) { out << '|' << center(' ', m_remoteName, server_width); } if (!(flags & WITHOUT_CONFLICTS)) { out << '|' << center(' ', "FLI", conflict_width); } out << "|\n"; } out << '|' << right(' ', "Source", name_width); if (!(flags & WITHOUT_CLIENT)) { out << '|' << center(' ', "NEW", count_width); out << '|' << center(' ', "MOD", count_width); out << '|' << center(' ', "DEL", count_width); if (!(flags & WITHOUT_REJECTS)) { out << '|' << center(' ', "ERR", count_width); } if (flags & WITH_TOTAL) { out << '|' << center(' ', "TOTAL", count_width); } } if (!(flags & WITHOUT_SERVER)) { out << '|' << center(' ', "NEW", count_width); out << '|' << center(' ', "MOD", count_width); out << '|' << center(' ', "DEL", count_width); if (!(flags & WITHOUT_REJECTS)) { out << '|' << center(' ', "ERR", count_width); } if (flags & WITH_TOTAL) { out << '|' << center(' ', "TOTAL", count_width); } } if (!(flags & WITHOUT_CONFLICTS)) { out << '|' << center(' ', "CTS", conflict_width); } out << "|\n"; stringstream sepstream; sepstream << '+' << fill('-', name_width); if (!(flags & WITHOUT_CLIENT)) { sepstream << '+' << fill('-', count_width); sepstream << '+' << fill('-', count_width); sepstream << '+' << fill('-', count_width); if (!(flags & WITHOUT_REJECTS)) { sepstream << '+' << fill('-', count_width); } if (flags & WITH_TOTAL) { sepstream << '+' << fill('-', count_width); } } if (!(flags & WITHOUT_SERVER)) { sepstream << '+' << fill('-', count_width); sepstream << '+' << fill('-', count_width); sepstream << '+' << fill('-', count_width); if (!(flags & WITHOUT_REJECTS)) { sepstream << '+' << fill('-', count_width); } if (flags & WITH_TOTAL) { sepstream << '+' << fill('-', count_width); } } if (!(flags & WITHOUT_CONFLICTS)) { sepstream << '+' << fill('-', conflict_width); } sepstream << "+\n"; string sep = sepstream.str(); out << sep; BOOST_FOREACH(const SyncReport::value_type &entry, *this) { const std::string &name = entry.first; const SyncSourceReport &source = entry.second; out << '|' << right(' ', name, name_width); ssize_t name_column = name_width - 2 - name.size(); if (name_column < 0) { name_column = 0; } for (SyncSourceReport::ItemLocation location = ((flags & WITHOUT_CLIENT) ? SyncSourceReport::ITEM_REMOTE : SyncSourceReport::ITEM_LOCAL); location <= ((flags & WITHOUT_SERVER) ? SyncSourceReport::ITEM_LOCAL : SyncSourceReport::ITEM_REMOTE); location = SyncSourceReport::ItemLocation(int(location) + 1)) { for (SyncSourceReport::ItemState state = SyncSourceReport::ITEM_ADDED; state <= SyncSourceReport::ITEM_REMOVED; state = SyncSourceReport::ItemState(int(state) + 1)) { stringstream count; count << source.getItemStat(location, state, SyncSourceReport::ITEM_TOTAL); out << '|' << center(' ', count.str(), count_width); } if (!(flags & WITHOUT_REJECTS)) { stringstream count; count << source.getItemStat(location, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_REJECT); out << '|' << center(' ', count.str(), count_width); } if (flags & WITH_TOTAL) { stringstream count; count << source.getItemStat(location, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_TOTAL); out << '|' << center(' ', count.str(), count_width); } } int total_conflicts = 0; if (!(flags & WITHOUT_CONFLICTS)) { total_conflicts = source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_CONFLICT_SERVER_WON) + source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_CONFLICT_CLIENT_WON) + source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_CONFLICT_DUPLICATED); stringstream conflicts; conflicts << total_conflicts; out << '|' << center(' ', conflicts.str(), conflict_width); } out << "|\n"; std::stringstream line; if (source.getFinalSyncMode() != SYNC_NONE || source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_SENT_BYTES) || source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_RECEIVED_BYTES)) { line << PrettyPrintSyncMode(source.getFinalSyncMode()) << ", "; if (source.getRestarts()) { line << source.getRestarts() + 1 << " cycles, "; } line << source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_SENT_BYTES) / 1024 << " KB sent by client, " << source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_RECEIVED_BYTES) / 1024 << " KB received"; out << '|' << align(' ', line.str(), text_width, name_column) << "|\n"; } if (total_conflicts > 0) { for (SyncSourceReport::ItemResult result = SyncSourceReport::ITEM_CONFLICT_SERVER_WON; result <= SyncSourceReport::ITEM_CONFLICT_DUPLICATED; result = SyncSourceReport::ItemResult(int(result) + 1)) { int count; if ((count = source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, result)) != 0 || true) { std::stringstream line; line << count << " " << (result == SyncSourceReport::ITEM_CONFLICT_SERVER_WON ? "client item(s) discarded" : result == SyncSourceReport::ITEM_CONFLICT_CLIENT_WON ? "server item(s) discarded" : "item(s) duplicated"); out << '|' << align(' ', line.str(), text_width, name_column) << "|\n"; } } } int total_matched = source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_MATCH); if (total_matched) { stringstream line; line << total_matched << " item(s) matched"; out << '|' << align(' ', line.str(), text_width, name_column) << "|\n"; } if (source.m_backupBefore.isAvailable() || source.m_backupAfter.isAvailable()) { std::stringstream backup; backup << "item(s) in database backup: "; if (source.m_backupBefore.isAvailable()) { backup << source.m_backupBefore.getNumItems() << " before sync, "; } else { backup << "no backup before sync, "; } if (source.m_backupAfter.isAvailable()) { backup << source.m_backupAfter.getNumItems() << " after it"; } else { backup << "no backup after it"; } out << '|' << align(' ', backup.str(), text_width, name_column) << "|\n"; } if (source.getStatus()) { out << '|' << align(' ', Status2String(source.getStatus()), text_width, name_column) << "|\n"; } out << sep; } if (getStart()) { out << '|' << center(' ', formatSyncTimes(), text_width) << "|\n"; } if (getStatus()) { out << '|' << center(' ', getStatus() != STATUS_HTTP_OK ? Status2String(getStatus()) : "synchronization completed successfully", text_width) << "|\n"; } if (getStatus() || getStart()) { out << sep; } if (!getError().empty()) { out << "First ERROR encountered: " << getError() << endl; } } std::string SyncReport::formatSyncTimes() const { std::stringstream out; time_t duration = m_end - m_start; out << "start "; if (!m_start) { out << "unknown"; } else { struct tm tmbuffer, *tm = localtime_r(&m_start, &tmbuffer); if (tm) { char buffer[160]; strftime(buffer, sizeof(buffer), "%c", tm); out << buffer; } else { out << "???"; } if (!m_end) { out << ", unknown duration (crashed?!)"; } else { out << ", duration " << duration / 60 << ":" << std::setw(2) << std::setfill('0') << duration % 60 << "min"; } } return out.str(); } std::string SyncReport::slowSyncExplanation(const std::string &peer, const std::set &sources) { if (sources.empty()) { return ""; } string sourceparam = boost::join(sources, " "); std::string explanation = StringPrintf("Doing a slow synchronization may lead to duplicated items or\n" "lost data when the server merges items incorrectly. Choosing\n" "a different synchronization mode may be the better alternative.\n" "Restart synchronization of affected source(s) with one of the\n" "following sync modes to recover from this problem:\n" " slow, refresh-from-server, refresh-from-client\n\n" "Analyzing the current state:\n" " syncevolution --status %s %s\n\n" "Running with one of the three modes:\n" " syncevolution --sync [slow|refresh-from-remote|refresh-from-local] %s %s\n", peer.c_str(), sourceparam.c_str(), peer.c_str(), sourceparam.c_str()); return explanation; } std::string SyncReport::slowSyncExplanation(const std::string &peer) const { std::set sources; BOOST_FOREACH(const SyncReport::value_type &entry, *this) { const std::string &name = entry.first; const SyncSourceReport &source = entry.second; if (source.getStatus() == STATUS_UNEXPECTED_SLOW_SYNC) { string virtualsource = source.getVirtualSource(); sources.insert(virtualsource.empty() ? name : virtualsource); } } return slowSyncExplanation(peer, sources); } ConfigNode &operator << (ConfigNode &node, const SyncReport &report) { node.setProperty("start", static_cast(report.getStart())); node.setProperty("end", static_cast(report.getEnd())); node.setProperty("status", static_cast(report.getStatus())); string error = report.getError(); if (!error.empty()) { node.setProperty("error", error); } else { node.removeProperty("error"); } BOOST_FOREACH(const SyncReport::value_type &entry, report) { const std::string &name = entry.first; const SyncSourceReport &source = entry.second; string prefix = name; boost::replace_all(prefix, "_", "__"); boost::replace_all(prefix, "-", "_+"); prefix = "source-" + prefix; string key; key = prefix + "-mode"; node.setProperty(key, PrettyPrintSyncMode(source.getFinalSyncMode())); if (source.getRestarts()) { key = prefix + "-restarts"; node.setProperty(key, source.getRestarts()); } key = prefix + "-first"; node.setProperty(key, source.isFirstSync()); key = prefix + "-resume"; node.setProperty(key, source.isResumeSync()); key = prefix + "-status"; node.setProperty(key, static_cast(source.getStatus())); string virtualsource = source.getVirtualSource(); if (!virtualsource.empty()) { key = prefix + "-virtualsource"; node.setProperty(key, virtualsource); } key = prefix + "-backup-before"; node.setProperty(key, source.m_backupBefore.getNumItems()); key = prefix + "-backup-after"; node.setProperty(key, source.m_backupAfter.getNumItems()); for (int location = 0; location < SyncSourceReport::ITEM_LOCATION_MAX; location++) { for (int state = 0; state < SyncSourceReport::ITEM_STATE_MAX; state++) { for (int result = 0; result < SyncSourceReport::ITEM_RESULT_MAX; result++) { int intval = source.getItemStat(SyncSourceReport::ItemLocation(location), SyncSourceReport::ItemState(state), SyncSourceReport::ItemResult(result)); if (intval) { key = prefix + "-stat-" + SyncSourceReport::StatTupleToString(SyncSourceReport::ItemLocation(location), SyncSourceReport::ItemState(state), SyncSourceReport::ItemResult(result)); node.setProperty(key, intval); } } } } } return node; } ConfigNode &operator >> (ConfigNode &node, SyncReport &report) { long ts; if (node.getProperty("start", ts)) { report.setStart(ts); } if (node.getProperty("end", ts)) { report.setEnd(ts); } int status; if (node.getProperty("status", status)) { report.setStatus(static_cast(status)); } string error; if (node.getProperty("error", error)) { report.setError(error); } ConfigNode::PropsType props; node.readProperties(props); BOOST_FOREACH(const ConfigNode::PropsType::value_type &prop, props) { string key = prop.first; if (boost::starts_with(key, "source-")) { key.erase(0, strlen("source-")); size_t off = key.find('-'); if (off != key.npos) { string sourcename = key.substr(0, off); boost::replace_all(sourcename, "_+", "-"); boost::replace_all(sourcename, "__", "_"); SyncSourceReport &source = report.getSyncSourceReport(sourcename); key.erase(0, off + 1); if (boost::starts_with(key, "stat-")) { key.erase(0, strlen("stat-")); SyncSourceReport::ItemLocation location; SyncSourceReport::ItemState state; SyncSourceReport::ItemResult result; SyncSourceReport::StringToStatTuple(key, location, state, result); stringstream in(prop.second); int intval; in >> intval; source.setItemStat(location, state, result, intval); } else if (key == "mode") { source.recordFinalSyncMode(StringToSyncMode(prop.second)); } else if (key == "restarts") { int value; if (node.getProperty(prop.first, value)) { source.setRestarts(value); } } else if (key == "first") { bool value = false; if (node.getProperty(prop.first, value)) { source.recordFirstSync(value); } } else if (key == "resume") { bool value = false; if (node.getProperty(prop.first, value)) { source.recordResumeSync(value); } } else if (key == "status") { long value; if (node.getProperty(prop.first, value)) { source.recordStatus(static_cast(value)); } } else if (key == "virtualsource") { source.recordVirtualSource(node.readProperty(prop.first)); } else if (key == "backup-before") { long value; if (node.getProperty(prop.first, value)) { source.m_backupBefore.setNumItems(value); } } else if (key == "backup-after") { long value; if (node.getProperty(prop.first, value)) { source.m_backupAfter.setNumItems(value); } } } } } return node; } SE_END_CXX syncevolution-1.5/src/syncevo/SynthesisEngine.cpp0000644000373300001540000002331312326412403023615 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include SE_BEGIN_CXX void SharedEngine::Connect(const string &aEngineName, sysync::CVersion aPrgVersion, sysync::uInt16 aDebugFlags) { sysync::TSyError err = m_engine->Connect(aEngineName, aPrgVersion, aDebugFlags); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, std::string("cannot connect to engine '") + aEngineName + "'", static_cast(err)); } } void SharedEngine::Disconnect() { sysync::TSyError err = m_engine->Disconnect(); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "cannot disconnect engine", static_cast(err)); } } void SharedEngine::InitEngineXML(const string &aConfigXML) { sysync::TSyError err = m_engine->InitEngineXML(aConfigXML.c_str()); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "Synthesis XML config parser error", static_cast(err)); } } class FreeEngineItem { SharedEngine m_engine; public: FreeEngineItem(const SharedEngine &engine) : m_engine(engine) {} void operator () (sysync::KeyH key) { m_engine.get()->CloseKey(key); } void operator () (sysync::SessionH session) { m_engine.get()->CloseSession(session); } }; SharedSession SharedEngine::OpenSession(const string &aSessionID) { sysync::SessionH sessionH = NULL; sysync::TSyError err = m_engine->OpenSession(sessionH, 0, aSessionID.empty() ? NULL : aSessionID.c_str()); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "opening session failed", static_cast(err)); } return SharedSession(sessionH, FreeEngineItem(*this)); } SharedKey SharedEngine::OpenSessionKey(SharedSession &aSessionH) { sysync::KeyH key; sysync::TSyError err = m_engine->OpenSessionKey(aSessionH.get(), key, 0); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "opening session key failed", static_cast(err)); } return SharedKey(key, FreeEngineItem(*this)); } void SharedEngine::SessionStep(const SharedSession &aSessionH, sysync::uInt16 &aStepCmd, sysync::TEngineProgressInfo *aInfoP) { sysync::TSyError err = m_engine->SessionStep(aSessionH.get(), aStepCmd, aInfoP); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "proceeding with session failed", static_cast(err)); } } class FreeSyncMLBuffer { SharedEngine m_engine; SharedSession m_session; bool m_forSend; size_t m_size; public: FreeSyncMLBuffer(const SharedEngine &engine, const SharedSession &session, bool forSend, size_t size) : m_engine(engine), m_session(session), m_forSend(forSend), m_size(size) {} void operator () (char *buffer) { m_engine.get()->RetSyncMLBuffer(m_session.get(), m_forSend, m_size); } }; SharedBuffer SharedEngine::GetSyncMLBuffer(const SharedSession &aSessionH, bool aForSend) { sysync::appPointer buffer; sysync::memSize bufSize; sysync::TSyError err = m_engine->GetSyncMLBuffer(aSessionH.get(), aForSend, buffer, bufSize); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult,"acquiring SyncML buffer failed", static_cast(err)); } return SharedBuffer((char *)buffer, (size_t)bufSize, FreeSyncMLBuffer(*this, aSessionH, aForSend, bufSize)); } void SharedEngine::WriteSyncMLBuffer(const SharedSession &aSessionH, const char *data, size_t len) { sysync::TSyError err = m_engine->WriteSyncMLBuffer(aSessionH.get(), const_cast(data), len); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "writing SyncML buffer failed", static_cast(err)); } } SharedKey SharedEngine::OpenKeyByPath(const SharedKey &aParentKeyH, const string &aPath, bool noThrow) { sysync::KeyH key = NULL; sysync::TSyError err = m_engine->OpenKeyByPath(key, aParentKeyH.get(), aPath.c_str(), 0); if (err && noThrow) { return SharedKey(); } if (err) { string what = "opening key "; what += aPath; if (err == sysync::DB_NoContent) { SE_THROW_EXCEPTION(NoSuchKey, what); } else { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, what, static_cast(err)); } } return SharedKey(key, FreeEngineItem(*this)); } SharedKey SharedEngine::OpenSubkey(const SharedKey &aParentKeyH, sysync::sInt32 aID, bool noThrow) { sysync::KeyH key = NULL; sysync::TSyError err = m_engine->OpenSubkey(key, aParentKeyH.get(), aID, 0); if (err && noThrow) { return SharedKey(); } if (err) { string what = "opening sub key"; if (err == sysync::DB_NoContent) { SE_THROW_EXCEPTION(NoSuchKey, what); } else { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, what, static_cast(err)); } } return SharedKey(key, FreeEngineItem(*this)); } string SharedEngine::GetStrValue(const SharedKey &aKeyH, const string &aValName) { std::string s; sysync::TSyError err = m_engine->GetStrValue(aKeyH.get(), aValName.c_str(), s); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error reading value ") + aValName, static_cast(err)); } return s; } void SharedEngine::SetStrValue(const SharedKey &aKeyH, const string &aValName, const string &aValue) { sysync::TSyError err = m_engine->SetStrValue(aKeyH.get(), aValName.c_str(), aValue); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error writing value ") + aValName, static_cast(err)); } } sysync::sInt32 SharedEngine::GetInt32Value(const SharedKey &aKeyH, const string &aValName) { sysync::sInt32 v; sysync::TSyError err = m_engine->GetInt32Value(aKeyH.get(), aValName.c_str(), v); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error reading value ") + aValName, static_cast(err)); } return v; } void SharedEngine::SetInt32Value(const SharedKey &aKeyH, const string &aValName, sysync::sInt32 aValue) { sysync::TSyError err = m_engine->SetInt32Value(aKeyH.get(), aValName.c_str(), aValue); if (err) { SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, string("error writing value ") + aValName, static_cast(err)); } } void SharedEngine::doDebug(Logger::Level level, const char *prefix, const char *file, int line, const char *function, const char *format, va_list args) { std::string str = StringPrintfV(format, args); SySyncDebugPuts(m_engine->fCI, file, line, function, level <= Logger::ERROR ? DBG_ERROR : level <= Logger::INFO ? DBG_HOT : 0, prefix, str.c_str()); } sysync::TSyError SDKInterface::setValue(sysync::KeyH aItemKey, const std::string &field, const char *data, size_t datalen) { return this->ui.SetValue(this, aItemKey, field.c_str(), sysync::VALTYPE_TEXT, data, datalen); } sysync::TSyError SDKInterface::getValue(sysync::KeyH aItemKey, const std::string &field, SharedBuffer &data) { sysync::memSize len; TSyError res = this->ui.GetValue(this, aItemKey, field.c_str(), sysync::VALTYPE_TEXT, NULL, 0, &len); if (!res) { data = SharedBuffer(new char[len + 1], len); data[len] = 0; res = this->ui.GetValue(this, aItemKey, field.c_str(), sysync::VALTYPE_TEXT, data.get(), len + 1, &len); } return res; } SE_END_CXX syncevolution-1.5/src/syncevo/Logging.cpp0000664000373300001540000003114612330727742022103 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include SE_BEGIN_CXX static RecMutex logMutex; /** * POD to have it initialized without relying on a constructor to run. */ static std::string *logProcessName; void Logger::setProcessName(const std::string &name) { RecMutex::Guard guard = logMutex.lock(); if (!logProcessName) { logProcessName = new std::string(name); } else { *logProcessName = name; } } std::string Logger::getProcessName() { RecMutex::Guard guard = logMutex.lock(); return logProcessName ? *logProcessName : ""; } RecMutex::Guard Logger::lock() { return logMutex.lock(); } Logger::Logger() : m_level(INFO) { } Logger::~Logger() { } /** * Create (if necessary) and return the logger stack. * It has at least one entry. * * logMutex must be locked when calling this. */ static std::vector &LoggersSingleton() { // allocate array once and never free it because it might be needed till // the very end of the application life cycle static std::vector *loggers; if (!loggers) { loggers = new std::vector; // Ensure that the array is never empty. boost::shared_ptr logger(new LoggerStdout); loggers->push_back(logger); } return *loggers; } Logger::Handle Logger::instance() { RecMutex::Guard guard = logMutex.lock(); std::vector &loggers = LoggersSingleton(); return loggers.back(); } void Logger::addLogger(const Handle &logger) { RecMutex::Guard guard = logMutex.lock(); std::vector &loggers = LoggersSingleton(); loggers.push_back(logger); } void Logger::removeLogger(Logger *logger) { RecMutex::Guard guard = logMutex.lock(); std::vector &loggers = LoggersSingleton(); for (ssize_t i = loggers.size() - 1; i >= 0; --i) { if (loggers[i] == logger) { loggers[i].remove(); loggers.erase(loggers.begin() + i); break; } } } void Logger::formatLines(Level msglevel, Level outputlevel, const std::string *processName, const std::string *prefix, const char *format, va_list args, boost::function print) { std::string tag; // in case of 'SHOW' level, don't print level and prefix information if (msglevel != SHOW) { std::string reltime; std::string procname; std::string firstLine; // Run non-blocking operations on shared data while // holding the mutex. { RecMutex::Guard guard = logMutex.lock(); const std::string *realProcname; if (processName) { realProcname = processName; } else { if (!logProcessName) { logProcessName = new std::string; } realProcname = logProcessName; } if (!realProcname->empty()) { procname.reserve(realProcname->size() + 1); procname += " "; procname += *realProcname; } if (outputlevel >= DEBUG) { // add relative time stamp Timespec now = Timespec::monotonic(); if (!m_startTime) { // first message, start counting time m_startTime = now; time_t nowt = time(NULL); struct tm tm_gm, tm_local; char buffer[2][80]; gmtime_r(&nowt, &tm_gm); localtime_r(&nowt, &tm_local); reltime = " 00:00:00"; strftime(buffer[0], sizeof(buffer[0]), "%a %Y-%m-%d %H:%M:%S", &tm_gm); strftime(buffer[1], sizeof(buffer[1]), "%H:%M %z %Z", &tm_local); std::string line = StringPrintf("[DEBUG%s%s] %s UTC = %s\n", procname.c_str(), reltime.c_str(), buffer[0], buffer[1]); } else { if (now >= m_startTime) { Timespec delta = now - m_startTime; reltime = StringPrintf(" %02ld:%02ld:%02ld", delta.tv_sec / (60 * 60), (delta.tv_sec % (60 * 60)) / 60, delta.tv_sec % 60); } else { reltime = " ??:??:??"; } } } } if (!firstLine.empty()) { print(firstLine, 1); } if (prefix && prefix->empty()) { prefix = NULL; } tag = StringPrintf("[%s%s%s] %s%s", levelToStr(msglevel), procname.c_str(), reltime.c_str(), prefix ? prefix->c_str() : "", prefix ? ": " : ""); } std::string output = StringPrintfV(format, args); if (!tag.empty()) { // Print individual lines. // // Total size is guessed by assuming an average line length of // around 40 characters to predict number of lines. size_t expectedTotal = (output.size() / 40 + 1) * tag.size() + output.size(); size_t pos = 0; while (true) { size_t next = output.find('\n', pos); if (next != output.npos) { std::string line; line.reserve(tag.size() + next + 1 - pos); line.append(tag); line.append(output, pos, next + 1 - pos); print(line, expectedTotal); pos = next + 1; } else { break; } } if (pos < output.size() || output.empty()) { // handle dangling last line or empty chunk (don't // want empty line for that, print at least the tag) std::string line; line.reserve(tag.size() + output.size() - pos + 1); line.append(tag); line.append(output, pos, output.size() - pos); line += '\n'; print(line, expectedTotal); } } else { if (!boost::ends_with(output, "\n")) { // append newline if necessary output += '\n'; } print(output, 0); } } Logger::MessageOptions::MessageOptions(Level level) : m_level(level), m_prefix(NULL), m_file(NULL), m_line(0), m_function(NULL), m_processName(NULL), m_flags(0) { } Logger::MessageOptions::MessageOptions(Level level, const std::string *prefix, const char *file, int line, const char *function, int flags) : m_level(level), m_prefix((!prefix || prefix->empty()) ? NULL : prefix), m_file(file), m_line(line), m_function(function), m_processName(NULL), m_flags(flags) { } Logger::Handle::Handle() throw () { } Logger::Handle::Handle(Logger *logger) throw () { m_logger.reset(logger); } Logger::Handle::Handle(const Handle &other) throw () { m_logger = other.m_logger; } Logger::Handle & Logger::Handle::operator = (const Handle &other) throw () { if (this != &other) { m_logger = other.m_logger; } return *this; } Logger::Handle::~Handle() throw () { m_logger.reset(); } void Logger::Handle::message(Level level, const std::string *prefix, const char *file, int line, const char *function, const char *format, ...) { va_list args; va_start(args, format); m_logger->messagev(MessageOptions(level, prefix, file, line, function), format, args); va_end(args); } void Logger::Handle::message(Level level, const std::string &prefix, const char *file, int line, const char *function, const char *format, ...) { va_list args; va_start(args, format); m_logger->messagev(MessageOptions(level, &prefix, file, line, function), format, args); va_end(args); } void Logger::Handle::messageWithOptions(const MessageOptions &options, const char *format, ...) { va_list args; va_start(args, format); m_logger->messagev(options, format, args); va_end(args); } const char *Logger::levelToStr(Level level) { switch (level) { case SHOW: return "SHOW"; case ERROR: return "ERROR"; case WARNING: return "WARNING"; case INFO: return "INFO"; case DEV: return "DEVELOPER"; case DEBUG: return "DEBUG"; default: return "???"; } } Logger::Level Logger::strToLevel(const char *str) { // order is based on a rough estimate of message frequency of the // corresponding type if (!str || !strcmp(str, "DEBUG")) { return DEBUG; } else if (!strcmp(str, "INFO")) { return INFO; } else if (!strcmp(str, "SHOW")) { return SHOW; } else if (!strcmp(str, "ERROR")) { return ERROR; } else if (!strcmp(str, "WARNING")) { return WARNING; } else if (!strcmp(str, "DEV")) { return DEV; } else { return DEBUG; } } #ifdef HAVE_GLIB void Logger::glogFunc(const gchar *logDomain, GLogLevelFlags logLevel, const gchar *message, gpointer userData) { Level level = (logLevel & (G_LOG_LEVEL_ERROR|G_LOG_LEVEL_CRITICAL)) ? ERROR : // glib warnings are usually not relevant for users, only for developers. (logLevel & G_LOG_LEVEL_WARNING) ? DEV : (logLevel & (G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_INFO)) ? SHOW : DEBUG; // Downgrade some know error messages as registered with // the LogRedirect helper class. That messages are registered // there is a historic artifact. if (level != DEBUG && LogRedirect::ignoreError(message)) { level = DEBUG; } Logger::instance().message(level, NULL, NULL, 0, NULL, "%s%s%s", logDomain ? logDomain : "", logDomain ? ": " : "", message); } #endif int Logger::sysyncPrintf(FILE *stream, const char *format, ...) { va_list args; va_start(args, format); static const std::string prefix("SYSYNC"); if (boost::starts_with(format, prefix) && format[prefix.size()] == ' ') { // Skip initial "SYSYNC " prefix, because it will get re-added // in a better way (= to each line) via the prefix parameter. format += prefix.size() + 1; } Logger::instance().messagev(MessageOptions(DEBUG, &prefix, NULL, 0, NULL), format, args); va_end(args); return 0; } SE_END_CXX syncevolution-1.5/src/syncevo/LogDLT.h0000644000373300001540000000316512326412403021233 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOGDLT #define INCL_LOGDLT #include #ifdef USE_DLT #include #include #include SE_BEGIN_CXX /** * A logger which writes to DLT and passes log messages * through to its parent. */ class LoggerDLT : public Logger { Handle m_parentLogger; // avoid dependency on dlt.h here void *m_dltContext; public: LoggerDLT(const char *appid, const char *description); ~LoggerDLT(); virtual void messagev(const MessageOptions &options, const char *format, va_list args); /** * Extracts current log level from the LoggerDLT which was * pushed onto the stack, DLT_LOG_DEFAULT if none active. */ static int getCurrentDLTLogLevel(); }; SE_END_CXX #endif // USE_DLT #endif // INCL_LOGSYSLOG syncevolution-1.5/src/syncevo/LogDLT.cpp0000644000373300001540000000742712326412403021573 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef USE_DLT #include #include SE_BEGIN_CXX static DltLogLevelType SyncEvoLevel2DLTLevel(Logger::Level level) { switch (level) { case Logger::NONE: return DLT_LOG_OFF; case Logger::ERROR: return DLT_LOG_ERROR; case Logger::WARNING: return DLT_LOG_WARN; case Logger::SHOW: case Logger::INFO: return DLT_LOG_INFO; case Logger::DEV: case Logger::DEBUG: return DLT_LOG_DEBUG; } return DLT_LOG_OFF; } static LoggerDLT *LoggerDLTInstance; LoggerDLT::LoggerDLT(const char *appid, const char *description) : m_parentLogger(Logger::instance()), m_dltContext(calloc(1, sizeof(DltContext))) { DLT_REGISTER_APP(appid, description); int level = atoi(getEnv("SYNCEVOLUTION_USE_DLT", "-1")); if (level > 0) { DLT_REGISTER_CONTEXT_LL_TS(*(DltContext *)m_dltContext, "SYNC", "SyncEvolution messages", (DltLogLevelType)level, DLT_TRACE_STATUS_OFF); } else { DLT_REGISTER_CONTEXT(*(DltContext *)m_dltContext, "SYNC", "SyncEvolution messages"); } LoggerDLTInstance = this; } LoggerDLT::~LoggerDLT() { DLT_UNREGISTER_CONTEXT(*(DltContext *)m_dltContext); free(m_dltContext); DLT_UNREGISTER_APP(); LoggerDLTInstance = NULL; } void LoggerDLT::messagev(const MessageOptions &options, const char *format, va_list args) { // always to parent first (usually stdout): // if the parent is a LogRedirect instance, then // it'll flush its own output first, which ensures // that the new output comes later (as desired) { va_list argscopy; va_copy(argscopy, args); m_parentLogger.messagev(options, format, argscopy); va_end(argscopy); } DltContextData log; if (!(options.m_flags & MessageOptions::ALREADY_LOGGED) && dlt_user_log_write_start((DltContext *)m_dltContext, &log, SyncEvoLevel2DLTLevel(options.m_level)) > 0) { std::string buffer = StringPrintfV(format, args); // Avoid almost empty messages. They are triggered by // SyncEvolution to format the INFO output and don't add any // valuable information to the DLT log. if (!buffer.empty() && buffer != "\n") { dlt_user_log_write_string(&log, buffer.c_str()); dlt_user_log_write_finish(&log); } } } int LoggerDLT::getCurrentDLTLogLevel() { if (LoggerDLTInstance) { for (int level = DLT_LOG_VERBOSE; level > DLT_LOG_DEFAULT; --level) { DltContextData log; // Emulates DLT_LOG(): logging active if dlt_user_log_write_start() returns something > 0. // Otherwise discard the DltContextData without doing anything. if (dlt_user_log_write_start((DltContext *)LoggerDLTInstance->m_dltContext, &log, (DltLogLevelType)level) > 0) { return level; } } } return DLT_LOG_DEFAULT; } SE_END_CXX #endif // USE_DLT syncevolution-1.5/src/syncevo/LogStdout.cpp0000644000373300001540000000525012326412403022422 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include using namespace std; SE_BEGIN_CXX LoggerStdout::LoggerStdout(FILE *file) : m_file(file), m_closeFile(false) {} LoggerStdout::LoggerStdout(const std::string &filename) : m_file(fopen(filename.c_str(), "w")), m_closeFile(true) { if (!m_file) { throw std::string(filename + ": " + strerror(errno)); } } LoggerStdout::~LoggerStdout() { if (m_closeFile) { fclose(m_file); } } static void appendOutput(std::string &output, std::string &chunk, size_t expectedTotal) { if (expectedTotal) { output.reserve(expectedTotal); } output.append(chunk); } void LoggerStdout::write(FILE *file, Level msglevel, Level filelevel, const std::string *prefix, const std::string *procname, const char *format, va_list args) { if (file && msglevel <= filelevel) { // TODO: print debugging information, perhaps only in log file std::string output; formatLines(msglevel, filelevel, procname, prefix, format, args, boost::bind(appendOutput, boost::ref(output), _1, _2)); fwrite(output.c_str(), 1, output.size(), file); fflush(file); } } void LoggerStdout::messagev(const MessageOptions &options, const char *format, va_list args) { if (!(options.m_flags & MessageOptions::ONLY_GLOBAL_LOG)) { write(m_file, options.m_level, getLevel(), options.m_prefix, options.m_processName, format, args); } } SE_END_CXX syncevolution-1.5/src/syncevo/LogRedirect.cpp0000664000373300001540000007064512330727742022727 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #include #include #include "test.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GLIB # include #endif #include using namespace std; SE_BEGIN_CXX LogRedirect *LogRedirect::m_redirect; std::set LogRedirect::m_knownErrors; void LogRedirect::abortHandler(int sig) throw() { // Don't know state of logging system, don't log here! // SE_LOG_ERROR(NULL, "caught signal %d, shutting down", sig); // Shut down redirection, also flushes to log. This involves // unsafe calls. For example, we may have to allocate new memory, // which deadlocks if glib detected memory corruption and // called abort() (see FDO #76375). // // But flushing the log is the whole point of the abortHandler, so // we can't just skip this. To handle cases where the work that we // need to do fails, we set a timeout and let the process be // killed that way. alarm() and sigaction() are async-signal-safe. { struct sigaction new_action, old_action; memset(&new_action, 0, sizeof(new_action)); new_action.sa_handler = SIG_DFL; // Terminates the process. sigemptyset(&new_action.sa_mask); sigaction(SIGALRM, &new_action, &old_action); alarm(5); RecMutex::Guard guard = lock(); if (m_redirect) { m_redirect->restore(); } } // Raise same signal again. Because our handler // is automatically removed, this will abort // for real now. raise(sig); } void LogRedirect::init() { m_processing = false; m_buffer = NULL; m_len = 0; m_out = NULL; m_err = NULL; m_streams = false; m_stderr.m_original = m_stderr.m_read = m_stderr.m_write = m_stderr.m_copy = -1; m_stdout.m_original = m_stdout.m_read = m_stdout.m_write = m_stdout.m_copy = -1; const char *lines = getenv("SYNCEVOLUTION_SUPPRESS_ERRORS"); if (lines) { typedef boost::split_iterator string_split_iterator; string_split_iterator it = boost::make_split_iterator(lines, boost::first_finder("\n", boost::is_iequal())); while (it != string_split_iterator()) { m_knownErrors.insert(std::string(it->begin(), it->end())); ++it; } } // CONSOLEPRINTF in libsynthesis. m_knownErrors.insert("SYSYNC Rejected with error:"); // libneon 'Request ends, status 207 class 2xx, error line:' m_knownErrors.insert("xx, error line:\n"); // some internal Qt warning (?) m_knownErrors.insert("Qt: Session management error: None of the authentication protocols specified are supported"); } LogRedirect::LogRedirect(Mode mode, const char *filename) { init(); m_processing = true; if (!getenv("SYNCEVOLUTION_DEBUG")) { redirect(STDERR_FILENO, m_stderr); if (mode == STDERR_AND_STDOUT) { redirect(STDOUT_FILENO, m_stdout); m_out = filename ? fopen(filename, "w") : fdopen(dup(m_stdout.m_copy), "w"); if (!m_out) { restore(m_stdout); restore(m_stderr); perror(filename ? filename : "LogRedirect fdopen"); } } else if (filename) { m_out = fopen(filename, "w"); if (!m_out) { perror(filename); } } // Separate FILE, will write into same file as normal output // if a filename was given (for testing), otherwise to original // stderr. m_err = fdopen(dup((filename && m_out) ? fileno(m_out) : m_stderr.m_copy), "w"); } // Modify process state while holding the Logger mutex. RecMutex::Guard guard = lock(); if (m_redirect) { SE_LOG_WARNING(NULL, "LogRedirect already instantiated?!"); } m_redirect = this; if (!getenv("SYNCEVOLUTION_DEBUG")) { struct sigaction new_action, old_action; memset(&new_action, 0, sizeof(new_action)); new_action.sa_handler = abortHandler; sigemptyset(&new_action.sa_mask); // disable handler after it was called once new_action.sa_flags = SA_RESETHAND; // block signals while we handler is active // to prevent recursive calls sigaddset(&new_action.sa_mask, SIGABRT); sigaddset(&new_action.sa_mask, SIGSEGV); sigaddset(&new_action.sa_mask, SIGBUS); sigaction(SIGABRT, &new_action, &old_action); sigaction(SIGSEGV, &new_action, &old_action); sigaction(SIGBUS, &new_action, &old_action); } m_processing = false; } LogRedirect::LogRedirect(ExecuteFlags flags) { init(); // This instance does not modify process state and // doesn't have to be thread-safe. m_streams = true; if (!(flags & EXECUTE_NO_STDERR)) { redirect(STDERR_FILENO, m_stderr); } if (!(flags & EXECUTE_NO_STDOUT)) { redirect(STDOUT_FILENO, m_stdout); } } LogRedirect::~LogRedirect() throw() { RecMutex::Guard guard; if (!m_streams) { guard = lock(); } if (m_redirect == this) { m_redirect = NULL; } process(); restore(); m_processing = true; if (m_out) { fclose(m_out); } if (m_err) { fclose(m_err); } if (m_buffer) { free(m_buffer); } } void LogRedirect::remove() throw() { restore(); } void LogRedirect::removeRedirect() throw() { if (m_redirect) { // We were forked. Ignore mutex (might be held by thread which was not // forked) and restore the forked process' state to the one it was // before setting up redirection. // // Do the minimal amount of work possible in restore(), i.e., // suppress the processing of streams. m_redirect->m_streams = false; m_redirect->restore(m_redirect->m_stdout); m_redirect->restore(m_redirect->m_stderr); } } void LogRedirect::restore() throw() { RecMutex::Guard guard; if (!m_streams) { guard = lock(); } if (m_processing) { return; } m_processing = true; restore(m_stdout); restore(m_stderr); m_processing = false; } void LogRedirect::messagev(const MessageOptions &options, const char *format, va_list args) { RecMutex::Guard guard = lock(); // check for other output first process(); if (!(options.m_flags & MessageOptions::ONLY_GLOBAL_LOG)) { // Choose output channel: SHOW goes to original stdout, // everything else to stderr. LoggerStdout::write(options.m_level == SHOW ? (m_out ? m_out : stdout) : (m_err ? m_err : stderr), options.m_level, getLevel(), options.m_prefix, options.m_processName, format, args); } } void LogRedirect::redirect(int original, FDs &fds) throw() { fds.m_original = original; fds.m_write = fds.m_read = -1; fds.m_copy = dup(fds.m_original); if (fds.m_copy >= 0) { if (m_streams) { // According to Stevens, Unix Network Programming, "Unix // domain datagram sockets are similar to UDP sockets: the // provide an *unreliable* datagram service that preserves // record boundaries." (14.4 Socket Functions, // p. 378). But unit tests showed that they do block on // Linux and thus seem reliable. Not sure what the official // spec is. // // To avoid the deadlock risk, we must use UDP. But when we // want "reliable" behavior *and* detect that all output was // processed, we have to use streams despite loosing // the write() boundaries, because Unix domain datagram sockets // do not flag "end of data". int sockets[2]; #define USE_UNIX_DOMAIN_DGRAM 0 if (!socketpair(AF_LOCAL, USE_UNIX_DOMAIN_DGRAM ? SOCK_DGRAM : SOCK_STREAM, 0, sockets)) { // success fds.m_write = sockets[0]; fds.m_read = sockets[1]; return; } else { perror("LogRedirect::redirect() socketpair"); } } else { int write = socket(AF_INET, SOCK_DGRAM, 0); if (write >= 0) { int read = socket(AF_INET, SOCK_DGRAM, 0); if (read >= 0) { struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); bool bound = false; for (int port = 1025; !bound && port < 10000; port++) { addr.sin_port = htons(port); if (!bind(read, (struct sockaddr *)&addr, sizeof(addr))) { bound = true; } } if (bound) { if (!connect(write, (struct sockaddr *)&addr, sizeof(addr))) { if (dup2(write, fds.m_original) >= 0) { // success fds.m_write = write; fds.m_read = read; return; } perror("LogRedirect::redirect() dup2"); } perror("LogRedirect::redirect connect"); } close(read); } close(write); } } close(fds.m_copy); fds.m_copy = -1; } else { perror("LogRedirect::redirect() dup"); } } void LogRedirect::restore(FDs &fds) throw() { if (!m_streams && fds.m_copy >= 0) { // flush our own redirected output and process what they might have written if (fds.m_original == STDOUT_FILENO) { fflush(stdout); std::cout << std::flush; } else { fflush(stderr); std::cerr << std::flush; } process(fds); dup2(fds.m_copy, fds.m_original); } if (fds.m_copy >= 0) { close(fds.m_copy); } if (fds.m_write >= 0) { close(fds.m_write); } if (fds.m_read >= 0) { close(fds.m_read); } fds.m_copy = fds.m_write = fds.m_read = -1; } bool LogRedirect::process(FDs &fds) throw() { bool have_message; bool data_read = false; if (fds.m_read <= 0) { return data_read; } ssize_t available = 0; do { have_message = false; // keep peeking at the data with increasing buffer sizes until // we are sure that we don't truncate it size_t newlen = std::max((size_t)1024, m_len); while (true) { // increase buffer? if (newlen > m_len) { void *buffer = realloc(m_buffer, newlen); if (!buffer) { // Nothing changed. if (available) { // We already read some data of a // datagram. Give up on the rest of the data, // process what we have below. if ((size_t)available == m_len) { // Need the byte for nul termination. available--; } have_message = true; break; } else { // Give up. Exception::throwError(SE_HERE, "out of memory"); return false; } } else { m_buffer = (char *)buffer; m_len = newlen; } } // read, but leave space for nul byte; // when using datagrams, we only peek here and remove the // datagram below, without rereading the data if (!USE_UNIX_DOMAIN_DGRAM && m_streams) { available = recv(fds.m_read, m_buffer, m_len - 1, MSG_DONTWAIT); if (available == 0) { return data_read; } else if (available == -1) { if (errno == EAGAIN) { // pretend that data was read, so that caller invokes us again return true; } else { Exception::throwError(SE_HERE, "reading output", errno); return false; } } else { // data read, process it data_read = true; break; } } else { available = recv(fds.m_read, m_buffer, m_len - 1, MSG_DONTWAIT|MSG_PEEK); have_message = available >= 0; } if (available < (ssize_t)m_len - 1) { break; } else { // try again with twice the buffer newlen *= 2; } } if (have_message) { if (USE_UNIX_DOMAIN_DGRAM || !m_streams) { // swallow packet, even if empty or we couldn't receive it recv(fds.m_read, NULL, 0, MSG_DONTWAIT); } data_read = true; } if (available > 0) { m_buffer[available] = 0; // Now pass it to logger, with a level determined by // the channel. This is the point where we can filter // out known noise. std::string prefix; Logger::Level level = Logger::DEV; char *text = m_buffer; if (fds.m_original == STDOUT_FILENO) { // stdout: not sure what this could be, so show it level = Logger::SHOW; char *eol = strchr(text, '\n'); if (!m_stdoutData.empty()) { // try to complete previous line, can be done // if text contains a line break if (eol) { m_stdoutData.append(text, eol - text); text = eol + 1; Logger::instance().message(level, prefix.empty() ? NULL : &prefix, NULL, 0, NULL, "%s", m_stdoutData.c_str()); m_stdoutData.clear(); } } // avoid sending incomplete line at end of text, // must be done when there is no line break or // it is not at the end of the buffer eol = strrchr(text, '\n'); if (eol != m_buffer + available - 1) { if (eol) { m_stdoutData.append(eol + 1); *eol = 0; } else { m_stdoutData.append(text); *text = 0; } } // output might have been processed as part of m_stdoutData, // don't log empty string below if (!*text) { continue; } } else if (fds.m_original == STDERR_FILENO) { // stderr: not normally useful for users, so we // can filter it more aggressively. For example, // swallow extra line breaks, glib inserts those. while (*text == '\n') { text++; } const char *glib_debug_prefix = "** ("; // ** (client-test:875): WARNING **: const char *glib_msg_prefix = "** Message:"; prefix = "stderr"; if ((!strncmp(text, glib_debug_prefix, strlen(glib_debug_prefix)) && strstr(text, " **:")) || !strncmp(text, glib_msg_prefix, strlen(glib_msg_prefix))) { level = Logger::DEBUG; prefix = "glib"; } else { level = Logger::DEV; } // If the text contains the word "error", it probably // is severe enough to show to the user, regardless of // who produced it... except for errors suppressed // explicitly. if (strcasestr(text, "error") && !ignoreError(text)) { level = Logger::ERROR; } } // avoid explicit newline at end of output, // logging will add it for each message() // invocation size_t len = strlen(text); if (len > 0 && text[len - 1] == '\n') { text[len - 1] = 0; } Logger::instance().message(level, prefix.empty() ? NULL : &prefix, NULL, 0, NULL, "%s", text); available = 0; } } while(have_message); return data_read; } void LogRedirect::addIgnoreError(const std::string &error) { RecMutex::Guard guard = Logger::lock(); m_knownErrors.insert(error); } bool LogRedirect::ignoreError(const std::string &text) { RecMutex::Guard guard = Logger::lock(); BOOST_FOREACH(const std::string &entry, m_knownErrors) { if (text.find(entry) != text.npos) { return true; } } return false; } void LogRedirect::process() { RecMutex::Guard guard; if (m_streams) { // iterate until both sockets are closed by peer while (true) { fd_set readfds; fd_set errfds; int maxfd = 0; FD_ZERO(&readfds); FD_ZERO(&errfds); if (m_stdout.m_read >= 0) { FD_SET(m_stdout.m_read, &readfds); FD_SET(m_stdout.m_read, &errfds); maxfd = m_stdout.m_read; } if (m_stderr.m_read >= 0) { FD_SET(m_stderr.m_read, &readfds); FD_SET(m_stderr.m_read, &errfds); if (m_stderr.m_read > maxfd) { maxfd = m_stderr.m_read; } } if (maxfd == 0) { // both closed return; } int res = select(maxfd + 1, &readfds, NULL, &errfds, NULL); switch (res) { case -1: // fatal, cannot continue Exception::throwError(SE_HERE, "waiting for output", errno); return; break; case 0: // None ready? Try again. break; default: if (m_stdout.m_read >= 0 && FD_ISSET(m_stdout.m_read, &readfds)) { if (!process(m_stdout)) { // Exact status of a Unix domain datagram socket upon close // of the remote end is a bit uncertain. For TCP, we would end // up here: marked by select as "ready for read", but no data -> EOF. close(m_stdout.m_read); m_stdout.m_read = -1; } } if (m_stdout.m_read >= 0 && FD_ISSET(m_stdout.m_read, &errfds)) { // But in practice, Unix domain sockets don't mark the stream // as "closed". This is an attempt to detect that situation // via the FDs exception status, but that also doesn't work. close(m_stdout.m_read); m_stdout.m_read = -1; } if (m_stderr.m_read >= 0 && FD_ISSET(m_stderr.m_read, &readfds)) { if (!process(m_stderr)) { close(m_stderr.m_read); m_stderr.m_read = -1; } } if (m_stderr.m_read >= 0 && FD_ISSET(m_stderr.m_read, &errfds)) { close(m_stderr.m_read); m_stderr.m_read = -1; } break; } } } else { guard = lock(); } if (m_processing) { return; } m_processing = true; process(m_stdout); process(m_stderr); // avoid hanging onto excessive amounts of memory m_len = std::min((size_t)(4 * 1024), m_len); m_buffer = (char *)realloc(m_buffer, m_len); if (!m_buffer) { m_len = 0; } m_processing = false; } void LogRedirect::flush() throw() { RecMutex::Guard guard = lock(); process(); if (!m_stdoutData.empty()) { std::string buffer; std::swap(buffer, m_stdoutData); Logger::instance().message(Logger::SHOW, NULL, NULL, 0, NULL, "%s", buffer.c_str()); } } #ifdef ENABLE_UNIT_TESTS class LogRedirectTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(LogRedirectTest); CPPUNIT_TEST(simple); CPPUNIT_TEST(largeChunk); CPPUNIT_TEST(streams); CPPUNIT_TEST(overload); #ifdef HAVE_GLIB CPPUNIT_TEST(glib); #endif CPPUNIT_TEST_SUITE_END(); /** * redirect stdout/stderr, then intercept the log messages and * store them for inspection */ class LogBuffer : public Logger, private boost::noncopyable { public: std::stringstream m_streams[DEBUG + 1]; PushLogger m_redirect; LogBuffer(LogRedirect::Mode mode = LogRedirect::STDERR_AND_STDOUT) { m_redirect.reset(new LogRedirect(mode)); addLogger(boost::shared_ptr(this, NopDestructor())); } ~LogBuffer() { removeLogger(this); m_redirect.reset(); } virtual void messagev(const MessageOptions &options, const char *format, va_list args) { CPPUNIT_ASSERT(options.m_level <= DEBUG && options.m_level >= 0); m_streams[options.m_level] << StringPrintfV(format, args); } }; public: void simple() { LogBuffer buffer; static const char *simpleMessage = "hello world"; CPPUNIT_ASSERT_EQUAL((ssize_t)strlen(simpleMessage), write(STDOUT_FILENO, simpleMessage, strlen(simpleMessage))); buffer.m_redirect->flush(); CPPUNIT_ASSERT_EQUAL(buffer.m_streams[Logger::SHOW].str(), std::string(simpleMessage)); } void largeChunk() { LogBuffer buffer; std::string large; large.append(60 * 1024, 'h'); CPPUNIT_ASSERT_EQUAL((ssize_t)large.size(), write(STDOUT_FILENO, large.c_str(), large.size())); buffer.m_redirect->flush(); CPPUNIT_ASSERT_EQUAL(large.size(), buffer.m_streams[Logger::SHOW].str().size()); CPPUNIT_ASSERT_EQUAL(large, buffer.m_streams[Logger::SHOW].str()); } void streams() { LogBuffer buffer; static const char *simpleMessage = "hello world"; CPPUNIT_ASSERT_EQUAL((ssize_t)strlen(simpleMessage), write(STDOUT_FILENO, simpleMessage, strlen(simpleMessage))); static const char *errorMessage = "such a cruel place"; CPPUNIT_ASSERT_EQUAL((ssize_t)strlen(errorMessage), write(STDERR_FILENO, errorMessage, strlen(errorMessage))); // process() keeps unfinished STDOUT lines buffered buffer.m_redirect->process(); CPPUNIT_ASSERT_EQUAL(std::string(errorMessage), buffer.m_streams[Logger::DEV].str()); CPPUNIT_ASSERT_EQUAL(string(""), buffer.m_streams[Logger::SHOW].str()); // flush() makes them available buffer.m_redirect->flush(); CPPUNIT_ASSERT_EQUAL(std::string(errorMessage), buffer.m_streams[Logger::DEV].str()); CPPUNIT_ASSERT_EQUAL(std::string(simpleMessage), buffer.m_streams[Logger::SHOW].str()); } void overload() { LogBuffer buffer; std::string large; large.append(1024, 'h'); for (int i = 0; i < 4000; i++) { CPPUNIT_ASSERT_EQUAL((ssize_t)large.size(), write(STDOUT_FILENO, large.c_str(), large.size())); } buffer.m_redirect->flush(); CPPUNIT_ASSERT(buffer.m_streams[Logger::SHOW].str().size() > large.size()); } #ifdef HAVE_GLIB void glib() { fflush(stdout); fflush(stderr); static const char *filename = "LogRedirectTest_glib.out"; int new_stdout = open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IRWXU); // check that intercept all glib message and don't print anything to stdout int orig_stdout = -1; try { // need to restore the current state below; would be nice // to query it instead of assuming that Logger::glogFunc // is the current log handler g_log_set_default_handler(g_log_default_handler, NULL); orig_stdout = dup(STDOUT_FILENO); dup2(new_stdout, STDOUT_FILENO); LogBuffer buffer(LogRedirect::STDERR); fprintf(stdout, "normal message stdout\n"); fflush(stdout); fprintf(stderr, "normal message stderr\n"); fflush(stderr); // ** (process:13552): WARNING **: test warning g_warning("test warning"); // ** Message: test message g_message("test message"); // ** (process:13552): CRITICAL **: test critical g_critical("test critical"); // would abort: // g_error("error") // ** (process:13552): DEBUG: test debug g_debug("test debug"); buffer.m_redirect->process(); std::string error = buffer.m_streams[Logger::ERROR].str(); std::string warning = buffer.m_streams[Logger::WARNING].str(); std::string show = buffer.m_streams[Logger::SHOW].str(); std::string info = buffer.m_streams[Logger::INFO].str(); std::string dev = buffer.m_streams[Logger::DEV].str(); std::string debug = buffer.m_streams[Logger::DEBUG].str(); CPPUNIT_ASSERT_EQUAL(string(""), error); CPPUNIT_ASSERT_EQUAL(string(""), warning); CPPUNIT_ASSERT_EQUAL(string(""), show); CPPUNIT_ASSERT_EQUAL(string(""), info); CPPUNIT_ASSERT_EQUAL(string(""), error); CPPUNIT_ASSERT(dev.find("normal message stderr") != dev.npos); CPPUNIT_ASSERT(debug.find("test warning") != debug.npos); } catch(...) { g_log_set_default_handler(Logger::glogFunc, NULL); dup2(orig_stdout, STDOUT_FILENO); throw; } g_log_set_default_handler(Logger::glogFunc, NULL); dup2(orig_stdout, STDOUT_FILENO); lseek(new_stdout, 0, SEEK_SET); char out[128]; ssize_t l = read(new_stdout, out, sizeof(out) - 1); CPPUNIT_ASSERT(l > 0); out[l] = 0; CPPUNIT_ASSERT(boost::starts_with(std::string(out), "normal message stdout")); } #endif }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(LogRedirectTest); #endif // ENABLE_UNIT_TESTS SE_END_CXX syncevolution-1.5/src/syncevo/LogSyslog.cpp0000644000373300001540000000635612326412403022430 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include using namespace std; SE_BEGIN_CXX LoggerSyslog::LoggerSyslog(const std::string &processName) : m_processName(processName), m_parentLogger(Logger::instance()) { // valgrind tells us that openlog() does not copy the string. // Must provide pointer to a permanent copy. openlog(m_processName.c_str(), LOG_CONS | LOG_NDELAY | LOG_PID, LOG_USER); } LoggerSyslog::~LoggerSyslog() { closelog(); } static void printToSyslog(int sysloglevel, std::string &chunk, size_t expectedTotal) { if (!expectedTotal) { // Might contain line breaks in the middle, split it. size_t pos = 0; while(true) { size_t next = chunk.find('\n', pos); if (next == chunk.npos) { // Line break is guaranteed to be last character, // so we have printed everything now. return; } chunk[next] = 0; syslog(sysloglevel, "%s", chunk.c_str() + pos); pos = next + 1; } } else { // Single line. We can print the trailing line break. syslog(sysloglevel, "%s", chunk.c_str()); } } void LoggerSyslog::messagev(const MessageOptions &options, const char *format, va_list args) { // always to parent first (usually stdout): // if the parent is a LogRedirect instance, then // it'll flush its own output first, which ensures // that the new output comes later (as desired) { va_list argscopy; va_copy(argscopy, args); m_parentLogger.messagev(options, format, argscopy); va_end(argscopy); } if (options.m_level <= getLevel()) { const std::string none; formatLines(options.m_level, getLevel(), &none, // Process name is set when opening the syslog, don't repeat it. options.m_prefix, format, args, boost::bind(printToSyslog, getSyslogLevel(options.m_level), _1, _2)); } } int LoggerSyslog::getSyslogLevel(Level level) { switch (level) { case ERROR: return LOG_ERR; case WARNING: return LOG_WARNING; case SHOW: return LOG_NOTICE; case INFO: case DEV: return LOG_INFO; case DEBUG: default: return LOG_DEBUG; } } SE_END_CXX syncevolution-1.5/src/syncevo/TransportAgent.h0000644000373300001540000001477312326412403023130 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_TRANSPORTAGENT #define INCL_TRANSPORTAGENT #include #include #include SE_BEGIN_CXX class SyncConfig; /** * Abstract API for a message send/receive agent. * * The calling sequence is as follows: * - set parameters for next message * - start message send * - optional: cancel transmission * - wait for completion and the optional reply * - close * - wait for completion of the shutdown * * Data to be sent is owned by caller. Data received as reply is * allocated and owned by agent. Errors are reported via * TransportAgentException. */ class TransportAgent { public: virtual ~TransportAgent() {} /** * set transport specific URL of next message */ virtual void setURL(const std::string &url) = 0; /** * define content type for post, see content type constants */ virtual void setContentType(const std::string &type) = 0; /** * Requests an normal shutdown of the transport. This can take a * while, for example if communication is still pending. * Therefore wait() has to be called to ensure that the * shutdown is complete and that no error occurred. * * Simply deleting the transport is an *unnormal* shutdown that * does not communicate with the peer. */ virtual void shutdown() = 0; /** * A hint to the transport that syncing will stop processing data * for a while (freeze = true) or resume processing (freeze = * false). * * If the transport needs to change its own state to accomodate * the new freeze state of the sync and that change fails, then * the transport must throw an error in setFreeze() and enter an * error state. The caller will not check for a failed transport * while frozen. */ virtual void setFreeze(bool freeze) {} /** * start sending message * * Memory must remain valid until reply is received or * message transmission is canceled. * * @param data start address of data to send * @param len number of bytes */ virtual void send(const char *data, size_t len) = 0; /** * cancel an active message transmission * * Blocks until send buffer is no longer in use. * Returns immediately if nothing pending. */ virtual void cancel() = 0; enum Status { /** * operation is on-going, check again with wait() */ ACTIVE, /** * received and buffered complete reply, * get access to it with getReponse() */ GOT_REPLY, /** * message wasn't sent, try again with send() */ CANCELED, /** * sending message has failed, transport should not throw an exception * if the error is recoverable (such as a temporary network error) */ FAILED, /** * transport was closed normally without error */ CLOSED, /** * transport timeout */ TIME_OUT, /** * unused transport, configure and use send() */ INACTIVE }; /** * Wait for completion of an operation initiated earlier. * The operation can be a send with optional reply or * a close request. * * Returns immediately if no operations is pending. * * @param noReply true if no reply is required for a running send; * only relevant for transports used by a SyncML server */ virtual Status wait(bool noReply = false) = 0; /** * Tells the transport agent to stop the transmission the given * amount of seconds after send() was called. The transport agent * will then stop the message transmission and return a TIME_OUT * status in wait(). * * @param seconds number of seconds to wait before timing out, zero for no timeout */ virtual void setTimeout(int seconds) = 0; /** * provides access to reply data * * Memory pointer remains valid as long as * transport agent is not deleted and no other * message is sent. */ virtual void getReply(const char *&data, size_t &len, std::string &contentType) = 0; /** SyncML in XML format */ static const char * const m_contentTypeSyncML; /** SyncML in WBXML format */ static const char * const m_contentTypeSyncWBXML; /** normal HTTP URL encoded */ static const char * const m_contentTypeURLEncoded; /** binary Server Alerted Notification (SAN) for data sync */ static const char * const m_contentTypeServerAlertedNotificationDS; }; class HTTPTransportAgent : public TransportAgent { public: /** * set proxy for transport, in protocol://[user@]host[:port] format */ virtual void setProxy(const std::string &proxy) = 0; /** * set proxy user name (if not specified in proxy string) * and password */ virtual void setProxyAuth(const std::string &user, const std::string &password) = 0; /** * control how SSL certificates are checked * * @param cacerts path to a single CA certificate file * @param verifyServer enable server verification (should always be on) * @param verifyHost do strict hostname checking in the certificate */ virtual void setSSL(const std::string &cacerts, bool verifyServer, bool verifyHost) = 0; /** * override default user agent string */ virtual void setUserAgent(const std::string &agent) = 0; /** * convenience method which copies the HTTP settings from * SyncConfig */ void setConfig(SyncConfig &config); }; SE_END_CXX #endif // INCL_TRANSPORTAGENT syncevolution-1.5/src/syncevo/TransportAgent.cpp0000644000373300001540000000350312326412403023450 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include SE_BEGIN_CXX const char * const TransportAgent::m_contentTypeSyncML = "application/vnd.syncml+xml"; const char * const TransportAgent::m_contentTypeSyncWBXML = "application/vnd.syncml+wbxml"; const char * const TransportAgent::m_contentTypeURLEncoded = "application/x-www-form-urlencoded"; const char * const TransportAgent::m_contentTypeServerAlertedNotificationDS = "application/vnd.syncml.ds.notification"; void HTTPTransportAgent::setConfig(SyncConfig &config) { if (config.getUseProxy()) { setProxy(config.getProxyHost()); UserIdentity identity = config.getProxyUser(); Credentials cred = IdentityProviderCredentials(identity, config.getProxyPassword()); setProxyAuth(cred.m_username, cred.m_password); } setUserAgent(config.getUserAgent()); setSSL(config.findSSLServerCertificate(), config.getSSLVerifyServer(), config.getSSLVerifyHost()); } SE_END_CXX syncevolution-1.5/src/syncevo/CurlTransportAgent.h0000644000373300001540000000753012326412403023747 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_CURLTRANSPORTAGENT #define INCL_CURLTRANSPORTAGENT #include "config.h" #ifdef ENABLE_LIBCURL #include #include #include SE_BEGIN_CXX /** * message send/receive with curl * * The simple curl API is used, so sending blocks until the * reply is ready. */ class CurlTransportAgent : public HTTPTransportAgent { public: CurlTransportAgent(); ~CurlTransportAgent(); virtual void setURL(const std::string &url); virtual void setProxy(const std::string &proxy); virtual void setProxyAuth(const std::string &user, const std::string &password); virtual void setSSL(const std::string &cacerts, bool verifyServer, bool verifyHost); virtual void setContentType(const std::string &type); virtual void setUserAgent(const std::string &agent); virtual void shutdown(); virtual void send(const char *data, size_t len); virtual void cancel(); virtual Status wait(bool noReply = false); virtual void getReply(const char *&data, size_t &len, std::string &contentType); virtual void setTimeout(int seconds); int processCallback(); void setAborting(bool aborting) {m_aborting = aborting;} private: CURL *m_easyHandle; curl_slist *m_slist; std::string m_contentType; Status m_status; bool m_aborting; Timespec m_sendStartTime; int m_timeoutSeconds; /** * libcurl < 7.17.0 does not copy strings passed into curl_easy_setopt(). * These are local copies that remain valid as long as needed. */ std::string m_url, m_proxy, m_auth, m_agent, m_cacerts; /** message buffer (owned by caller) */ const char *m_message; /** number of valid bytes in m_message */ size_t m_messageLen; /** number of sent bytes in m_message */ size_t m_messageSent; /** reply buffer */ char *m_reply; /** number of valid bytes in m_reply */ size_t m_replyLen; /** total buffer size */ size_t m_replySize; /** error text from curl, set via CURLOPT_ERRORBUFFER */ char m_curlErrorText[CURL_ERROR_SIZE]; /** CURLOPT_READFUNCTION, stream == CurlTransportAgent */ static size_t readDataCallback(void *buffer, size_t size, size_t nmemb, void *stream) throw(); size_t readData(void *buffer, size_t size) throw(); /** CURLOPT_WRITEFUNCTION, stream == CurlTransportAgent */ static size_t writeDataCallback(void *ptr, size_t size, size_t nmemb, void *stream) throw(); size_t writeData(void *buffer, size_t size) throw(); /** CURLOPT_PROGRESS callback, use this function to detect user abort */ static int progressCallback (void *ptr, double dltotal, double dlnow, double uptotal, double upnow); /** check curl error code and turn into exception */ void checkCurl(CURLcode code, bool exception = true); /** * initialize curl if necessary, return new handle * * Never returns NULL, instead throws exceptions. */ static CURL *easyInit(); }; SE_END_CXX #endif // ENABLE_LIBCURL #endif // INCL_TRANSPORTAGENT syncevolution-1.5/src/syncevo/CurlTransportAgent.cpp0000644000373300001540000002251012326412403024275 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #ifdef ENABLE_LIBCURL #include #include #include #include SE_BEGIN_CXX CurlTransportAgent::CurlTransportAgent() : m_easyHandle(easyInit()), m_slist(NULL), m_status(INACTIVE), m_timeoutSeconds(0), m_reply(NULL), m_replyLen(0), m_replySize(0) { #ifdef ENABLE_MAEMO /* hack because Maemo doesn't support IPv6 yet */ curl_easy_setopt(m_easyHandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); #endif /* * set up for post where message is pushed into curl via * its read callback and reply is stored in write callback */ CURLcode code; if ((code = curl_easy_setopt(m_easyHandle, CURLOPT_NOPROGRESS, false)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_PROGRESSFUNCTION, progressCallback)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_WRITEFUNCTION, writeDataCallback)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_WRITEDATA, (void *)this)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_READFUNCTION, readDataCallback)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_READDATA, (void *)this)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_ERRORBUFFER, this->m_curlErrorText )) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_AUTOREFERER, true)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_POST, true)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_FOLLOWLOCATION, true))) { /* error encountered, throw exception */ curl_easy_cleanup(m_easyHandle); checkCurl(code); } } CURL *CurlTransportAgent::easyInit() { static bool initialized = false; static CURLcode initres; if (!initialized) { initres = curl_global_init(CURL_GLOBAL_ALL); initialized = true; } if (initres) { SE_THROW_EXCEPTION(TransportException, "global curl initialization failed"); } CURL *handle = curl_easy_init(); if (!handle) { SE_THROW_EXCEPTION(TransportException, "no curl handle"); } return handle; } CurlTransportAgent::~CurlTransportAgent() { if (m_reply) { free(m_reply); } curl_easy_cleanup(m_easyHandle); curl_slist_free_all(m_slist); } void CurlTransportAgent::setURL(const std::string &url) { m_url = url; CURLcode code = curl_easy_setopt(m_easyHandle, CURLOPT_URL, m_url.c_str()); checkCurl(code); } void CurlTransportAgent::setProxy(const std::string &proxy) { m_proxy = proxy; CURLcode code = curl_easy_setopt(m_easyHandle, CURLOPT_PROXY, m_proxy.c_str()); checkCurl(code); } void CurlTransportAgent::setProxyAuth(const std::string &user, const std::string &password) { m_auth = user + ":" + password; CURLcode code = curl_easy_setopt(m_easyHandle, CURLOPT_PROXYUSERPWD, m_auth.c_str()); checkCurl(code); } void CurlTransportAgent::setContentType(const std::string &type) { m_contentType = type; } void CurlTransportAgent::setUserAgent(const std::string &agent) { m_agent = agent; CURLcode code = curl_easy_setopt(m_easyHandle, CURLOPT_USERAGENT, m_agent.c_str()); checkCurl(code); } void CurlTransportAgent::setSSL(const std::string &cacerts, bool verifyServer, bool verifyHost) { m_cacerts = cacerts; CURLcode code = CURLE_OK; if (!m_cacerts.empty()) { if (isDir(m_cacerts)) { // libcurl + OpenSSL does not work with a directory set in CURLOPT_CAINFO. // Must set the directory name as CURLOPT_CAPATH. // // Hopefully libcurl NSS also finds the directory name // here ("NSS-powered libcurl provides the option only for // backward compatibility. "). code = curl_easy_setopt(m_easyHandle, CURLOPT_CAPATH, m_cacerts.c_str()); } else { code = curl_easy_setopt(m_easyHandle, CURLOPT_CAINFO, m_cacerts.c_str()); } } if (!code) { code = curl_easy_setopt(m_easyHandle, CURLOPT_SSL_VERIFYPEER, (long)verifyServer); } if (!code) { code = curl_easy_setopt(m_easyHandle, CURLOPT_SSL_VERIFYHOST, (long)(verifyHost ? 2 : 0)); } checkCurl(code); } void CurlTransportAgent::setTimeout(int seconds) { m_timeoutSeconds = seconds; } void CurlTransportAgent::shutdown() { } void CurlTransportAgent::send(const char *data, size_t len) { CURLcode code; m_replyLen = 0; m_message = data; m_messageSent = 0; m_messageLen = len; curl_slist_free_all(m_slist); m_slist = NULL; // Setting Expect explicitly prevents problems with certain // proxies: if curl is allowed to depend on Expect, then it will // send the POST header and wait for the servers reply that it is // allowed to continue. This will always be the case with a correctly // configured SyncML and because some proxies reject unknown Expect // requests, it is better not used. m_slist = curl_slist_append(m_slist, "Expect:"); std::string contentHeader("Content-Type: "); contentHeader += m_contentType; m_slist = curl_slist_append(m_slist, contentHeader.c_str()); m_status = ACTIVE; if (m_timeoutSeconds) { m_sendStartTime = Timespec::monotonic(); } m_aborting = false; if ((code = curl_easy_setopt(m_easyHandle, CURLOPT_PROGRESSDATA, static_cast (this)))|| (code = curl_easy_setopt(m_easyHandle, CURLOPT_HTTPHEADER, m_slist)) || (code = curl_easy_setopt(m_easyHandle, CURLOPT_POSTFIELDSIZE, len)) ){ m_status = CANCELED; checkCurl(code); } if ((code = curl_easy_perform(m_easyHandle))) { m_status = FAILED; checkCurl(code, false); } else { m_status = GOT_REPLY; } } void CurlTransportAgent::cancel() { /* nothing to do */ } TransportAgent::Status CurlTransportAgent::wait(bool noReply) { return m_status; } void CurlTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType) { data = m_reply; len = m_replyLen; const char *curlContentType; if (!curl_easy_getinfo(m_easyHandle, CURLINFO_CONTENT_TYPE, &curlContentType) && curlContentType) { contentType = curlContentType; } else { // unknown contentType = ""; } } size_t CurlTransportAgent::writeDataCallback(void *buffer, size_t size, size_t nmemb, void *stream) throw() { return static_cast(stream)->writeData(buffer, size * nmemb); } size_t CurlTransportAgent::writeData(void *buffer, size_t size) throw() { bool increase = false; while (m_replyLen + size > m_replySize) { m_replySize = m_replySize ? m_replySize * 2 : 64 * 1024; increase = true; } if (increase) { m_reply = (char *)realloc(m_reply, m_replySize); if (!m_reply) { m_replySize = 0; m_replyLen = 0; return 0; } } memcpy(m_reply + m_replyLen, buffer, size); m_replyLen += size; return size; } size_t CurlTransportAgent::readDataCallback(void *buffer, size_t size, size_t nmemb, void *stream) throw() { return static_cast(stream)->readData(buffer, size * nmemb); } size_t CurlTransportAgent::readData(void *buffer, size_t size) throw() { size_t curr = std::min(size, m_messageLen - m_messageSent); memcpy(buffer, m_message + m_messageSent, curr); m_messageSent += curr; return curr; } void CurlTransportAgent::checkCurl(CURLcode code, bool exception) { if (code) { if(exception){ SE_THROW_EXCEPTION(TransportException, m_curlErrorText); }else { SE_LOG_INFO(NULL, "CurlTransport Failure: %s", m_curlErrorText); } } } int CurlTransportAgent::progressCallback(void* transport, double, double, double, double) { CurlTransportAgent *agent = static_cast (transport); SuspendFlags &flags = SuspendFlags::getSuspendFlags(); // check signals and abort transfer? flags.printSignals(); if (flags.getState() == SuspendFlags::ABORT) { agent->setAborting (true); return -1; } return agent->processCallback(); } int CurlTransportAgent::processCallback() { if (m_timeoutSeconds) { Timespec curTime = Timespec::monotonic(); if (curTime > m_sendStartTime + m_timeoutSeconds) { m_status = TIME_OUT; return -1; } } return 0; } SE_END_CXX #endif // ENABLE_LIBCURL syncevolution-1.5/src/syncevo/SoupTransportAgent.h0000644000373300001540000000726612326412403023776 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SOUPTRANSPORTAGENT #define INCL_SOUPTRANSPORTAGENT #include "config.h" #ifdef ENABLE_LIBSOUP #include #include #include #include #include SE_BEGIN_CXX class GLibUnref { public: static void unref(GMainLoop *pointer) { g_main_loop_unref(pointer); } static void unref(SoupMessageBody *pointer) { soup_message_body_free(pointer); } static void unref(SoupBuffer *pointer) { soup_buffer_free(pointer); } static void unref(SoupURI *pointer) { soup_uri_free(pointer); } }; /** * message send/receive with libsoup * * An asynchronous soup session is used and the main loop * is invoked in the wait() method to make progress. */ class SoupTransportAgent : public HTTPTransportAgent { public: /** * @param loop the glib loop to use when waiting for IO; * transport will increase the reference count; * if NULL a new loop in the default context is used */ SoupTransportAgent(GMainLoop *loop = NULL); ~SoupTransportAgent(); virtual void setURL(const std::string &url); virtual void setProxy(const std::string &proxy); virtual void setProxyAuth(const std::string &user, const std::string &password); virtual void setSSL(const std::string &cacerts, bool verifyServer, bool verifyHost); virtual void setContentType(const std::string &type); virtual void setUserAgent(const std::string &agent); virtual void shutdown() { m_status = CLOSED; } virtual void send(const char *data, size_t len); virtual void cancel(); virtual Status wait(bool noReply = false); virtual void getReply(const char *&data, size_t &len, std::string &contentType); virtual void setTimeout(int seconds); gboolean processCallback(); private: std::string m_proxyUser; std::string m_proxyPassword; std::string m_cacerts; bool m_verifySSL; std::string m_URL; std::string m_contentType; eptr m_session; eptr m_loop; Status m_status; std::string m_failure; SoupMessage *m_message; GLibEvent m_timeoutEventSource; int m_timeoutSeconds; /** This function is called regularly to detect timeout */ static gboolean TimeoutCallback (gpointer data); /** response, copied from SoupMessage */ eptr m_response; std::string m_responseContentType; /** SoupSessionCallback, redirected into user_data->HandleSessionCallback() */ static void SessionCallback(SoupSession *session, SoupMessage *msg, gpointer user_data); void HandleSessionCallback(SoupSession *session, SoupMessage *msg); }; SE_END_CXX #endif // ENABLE_LIBSOUP #endif // INCL_TRANSPORTAGENT syncevolution-1.5/src/syncevo/SoupTransportAgent.cpp0000664000373300001540000002023312405555067024334 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #ifdef ENABLE_LIBSOUP #include #include #include #ifdef HAVE_LIBSOUP_SOUP_GNOME_FEATURES_H #include #endif #include SE_BEGIN_CXX SoupTransportAgent::SoupTransportAgent(GMainLoop *loop) : m_verifySSL(false), m_session(soup_session_async_new()), m_loop(loop ? g_main_loop_ref(loop) : g_main_loop_new(NULL, TRUE), "Soup main loop"), m_status(INACTIVE), m_timeoutSeconds(0), m_response(0) { #ifdef HAVE_LIBSOUP_SOUP_GNOME_FEATURES_H // use default GNOME proxy settings soup_session_add_feature_by_type(m_session.get(), SOUP_TYPE_PROXY_RESOLVER_GNOME); #endif } SoupTransportAgent::~SoupTransportAgent() { if (m_session.get()) { // ensure that no callbacks for this session will be triggered // in the future, they would use a stale pointer to this agent // instance soup_session_abort(m_session.get()); } } void SoupTransportAgent::setURL(const std::string &url) { m_URL = url; } void SoupTransportAgent::setProxy(const std::string &proxy) { if (!proxy.empty()) { eptr uri(soup_uri_new(proxy.c_str()), "Proxy URI"); g_object_set(m_session.get(), SOUP_SESSION_PROXY_URI, uri.get(), NULL); } else { g_object_set(m_session.get(), SOUP_SESSION_PROXY_URI, NULL, NULL); } } void SoupTransportAgent::setProxyAuth(const std::string &user, const std::string &password) { /** * @TODO: handle "authenticate" signal for both proxy and HTTP server * (https://sourceforge.net/tracker/index.php?func=detail&aid=2056162&group_id=146288&atid=764733). * * Proxy authentication is available, but still needs to be hooked up * with libsoup. Should we make this interactive? Needs an additional * API for TransportAgent into caller. * * HTTP authentication is not available. */ m_proxyUser = user; m_proxyPassword = password; } void SoupTransportAgent::setSSL(const std::string &cacerts, bool verifyServer, bool verifyHost) { m_verifySSL = verifyServer || verifyHost; m_cacerts = cacerts; } void SoupTransportAgent::setContentType(const std::string &type) { m_contentType = type; } void SoupTransportAgent::setUserAgent(const std::string &agent) { g_object_set(m_session.get(), SOUP_SESSION_USER_AGENT, agent.c_str(), NULL); } void SoupTransportAgent::setTimeout(int seconds) { m_timeoutSeconds = seconds; } void SoupTransportAgent::send(const char *data, size_t len) { // ownership is transferred to libsoup in soup_session_queue_message() eptr message(soup_message_new("POST", m_URL.c_str())); if (!message.get()) { SE_THROW_EXCEPTION(TransportException, "could not allocate SoupMessage"); } // use CA certificates if available and needed, // otherwise let soup use system default certificates if (m_verifySSL) { if (!m_cacerts.empty()) { g_object_set(m_session.get(), SOUP_SESSION_SSL_CA_FILE, m_cacerts.c_str(), NULL); } } soup_message_set_request(message.get(), m_contentType.c_str(), SOUP_MEMORY_TEMPORARY, data, len); m_status = ACTIVE; if (m_timeoutSeconds) { m_message = message.get(); m_timeoutEventSource = g_timeout_add_seconds(m_timeoutSeconds, TimeoutCallback, static_cast (this)); } soup_session_queue_message(m_session.get(), message.release(), SessionCallback, static_cast(this)); } void SoupTransportAgent::cancel() { m_status = CANCELED; soup_session_abort(m_session.get()); if(g_main_loop_is_running(m_loop.get())) g_main_loop_quit(m_loop.get()); } TransportAgent::Status SoupTransportAgent::wait(bool noReply) { if (!m_failure.empty()) { std::string failure; std::swap(failure, m_failure); SE_THROW_EXCEPTION(TransportException, failure); } switch (m_status) { case CLOSED: return CLOSED; break; case ACTIVE: // block in main loop until our HandleSessionCallback() stops the loop g_main_loop_run(m_loop.get()); break; default: break; } /** For a canceled message, does not throw exception, just print a warning, the * upper layer may decide to retry */ if(m_status == TIME_OUT || m_status == FAILED){ std::string failure; std::swap(failure, m_failure); SE_LOG_INFO(NULL, "SoupTransport Failure: %s", failure.c_str()); } if (!m_failure.empty()) { std::string failure; std::swap(failure, m_failure); SE_THROW_EXCEPTION(TransportException, failure); } m_timeoutEventSource.set(0); return m_status; } void SoupTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType) { if (m_response) { data = m_response->data; len = m_response->length; contentType = m_responseContentType; } else { data = NULL; len = 0; } } void SoupTransportAgent::SessionCallback(SoupSession *session, SoupMessage *msg, gpointer user_data) { static_cast(user_data)->HandleSessionCallback(session, msg); } void SoupTransportAgent::HandleSessionCallback(SoupSession *session, SoupMessage *msg) { // keep a reference to the data m_responseContentType = ""; if (msg->response_body) { m_response = soup_message_body_flatten(msg->response_body); const char *soupContentType = soup_message_headers_get(msg->response_headers, "Content-Type"); if (soupContentType) { m_responseContentType = soupContentType; } } else { m_response = NULL; } if (msg->status_code != 200) { m_failure = m_URL; m_failure += " via libsoup: "; m_failure += msg->reason_phrase ? msg->reason_phrase : "failed"; m_status = FAILED; if (m_responseContentType.find("text") != std::string::npos) { SE_LOG_DEBUG(NULL, "unexpected HTTP response: status %d/%s, content type %s, body:\n%.*s", msg->status_code, msg->reason_phrase ? msg->reason_phrase : "", m_responseContentType.c_str(), m_response ? (int)m_response->length : 0, m_response ? m_response->data : ""); } } else { m_status = GOT_REPLY; } g_main_loop_quit(m_loop.get()); } gboolean SoupTransportAgent::processCallback() { //stop the message processing and mark status as timeout guint message_status = SOUP_STATUS_CANCELLED; soup_session_cancel_message(m_session.get(), m_message, message_status); m_status = TIME_OUT; return FALSE; } gboolean SoupTransportAgent::TimeoutCallback(gpointer transport) { SoupTransportAgent * sTransport = static_cast(transport); return sTransport->processCallback(); } SE_END_CXX #endif // ENABLE_LIBSOUP syncevolution-1.5/src/syncevo/LocalTransportAgent.h0000664000373300001540000001317212405555067024111 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_LOCALTRANSPORTAGENT #define INCL_LOCALTRANSPORTAGENT #include "config.h" #include #include #include #include #include #include // This needs to be defined before including gdbus-cxx-bridge.h! #define DBUS_CXX_EXCEPTION_HANDLER SyncEvo::SyncEvoHandleException #include "gdbus-cxx-bridge.h" #include #include #include #include SE_BEGIN_CXX class SyncContext; /** * The main() function of the local transport helper. * Implements the child side of local sync. */ int LocalTransportMain(int argc, char **argv); // internal in LocalTransportAgent.cpp class LocalTransportChild; /** * message send/receive with a forked process as peer * * Uses pipes to send a message and then get the response. * Limited to server forking the client. Because the client * has access to the full server setup after the fork, * no SAN message is needed and the first message goes * from client to server. * * Most messages will be SyncML message and response. In addition, * password requests also need to be passed through the server via * dedicated messages, because it is the one with a UI. */ class LocalTransportAgent : public TransportAgent { private: LocalTransportAgent(SyncContext *server, const std::string &clientConfig, void *loop = NULL); boost::weak_ptr m_self; public: /** * @param server the server side of the sync; * must remain valid while transport exists * @param clientConfig name of the target sync config or context (in which case * the target-config in that context is used) * @param loop optional glib loop to use when waiting for IO; * transport will *not* increase the reference count */ static boost::shared_ptr create(SyncContext *server, const std::string &clientConfig, void *loop = NULL); ~LocalTransportAgent(); /** * Set up message passing and fork the client. */ void start(); /** * Copies the client's sync report. If the client terminated * unexpectedly or shutdown() hasn't completed yet, the * STATUS_DIED_PREMATURELY sync result code will be set. */ void getClientSyncReport(SyncReport &report); // TransportAgent implementation virtual void setURL(const std::string &url) {} virtual void setContentType(const std::string &type); virtual void shutdown(); virtual void setFreeze(bool freeze); virtual void send(const char *data, size_t len); virtual void cancel(); virtual Status wait(bool noReply = false); virtual void getReply(const char *&data, size_t &len, std::string &contentType); virtual void setTimeout(int seconds); private: SyncContext *m_server; std::string m_clientConfig; Status m_status; SyncReport m_clientReport; GMainLoopCXX m_loop; boost::shared_ptr m_forkexec; std::string m_contentType; std::string m_replyContentType; pcrecpp::StringPiece m_replyMsg; /** * provides the D-Bus API expected by the forked process: * - password requests * - store the child's sync report */ boost::shared_ptr m_parent; /** * provides access to the forked process' D-Bus API * - start sync (returns child's first message) * - send server reply (returns child's next message or empty when done) * - emits output via signal * * Only non-NULL when child is running and connected. */ boost::shared_ptr m_child; void logChildOutput(const std::string &level, const std::string &message); void onChildConnect(const GDBusCXX::DBusConnectionPtr &conn); void onFailure(const std::string &error); void onChildQuit(int status); void askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, const boost::shared_ptr< GDBusCXX::Result1 > &reply); void storeSyncReport(const std::string &report); void storeReplyMsg(const std::string &contentType, size_t offset, size_t len, const std::string &error); /** * utility function: calculate deadline for operation starting now * * @param seconds timeout in seconds, 0 for the default */ Timespec deadline(unsigned seconds) { return seconds ? (Timespec::monotonic() + seconds) : Timespec(); } }; SE_END_CXX #endif // INCL_LOCALTRANSPORTAGENT syncevolution-1.5/src/syncevo/LocalTransportAgent.cpp0000664000373300001540000014716612405555067024457 0ustar00nightlynightly00000000000000/* * Copyright (C) 2010 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX // // It would be better to make these officially part of the libsynthesis API... // extern "C" { extern void *(*smlLibMalloc)(size_t size); extern void (*smlLibFree)(void *ptr); } /** * This class intercepts libsmltk memory functions and redirects the * buffer allocated for SyncML messages into shared memory. * * This works because: * - each side allocates exactly one such buffer * - the size of the buffer is twice the configured maximum message size * - we don't need to clean up or worry about the singleton because * each process in SyncEvolution only runs one sync session */ class SMLTKSharedMemory { public: static SMLTKSharedMemory &singleton() { static SMLTKSharedMemory instance; return instance; } void initParent(size_t msgSize) { m_messageBufferSize = msgSize * 2; prepareBuffer(m_localBuffer, m_messageBufferSize); prepareBuffer(m_remoteBuffer, m_messageBufferSize); setenv("SYNCEVOLUTION_LOCAL_SYNC_PARENT_FD", StringPrintf("%d", m_localBuffer.getFD()).c_str(), true); setenv("SYNCEVOLUTION_LOCAL_SYNC_CHILD_FD", StringPrintf("%d", m_remoteBuffer.getFD()).c_str(), true); m_remoteBuffer.map(NULL, NULL); } void initChild(size_t msgSize) { m_messageBufferSize = msgSize * 2; m_remoteBuffer.create(atoi(getEnv("SYNCEVOLUTION_LOCAL_SYNC_PARENT_FD", "-1"))); m_localBuffer.create(atoi(getEnv("SYNCEVOLUTION_LOCAL_SYNC_CHILD_FD", "-1"))); m_remoteBuffer.map(NULL, NULL); pcrecpp::StringPiece remote = m_remoteBuffer.stringPiece(); if ((size_t)remote.size() != m_messageBufferSize) { SE_THROW(StringPrintf("local and remote side do not agree on shared buffer size: %ld != %ld", (long)m_messageBufferSize, (long)remote.size())); } } pcrecpp::StringPiece getLocalBuffer() { return m_localBuffer.stringPiece(); } pcrecpp::StringPiece getRemoteBuffer() { return m_remoteBuffer.stringPiece(); } size_t toLocalOffset(const char *data, size_t len) { if (!len) { return 0; } pcrecpp::StringPiece localBuffer = getLocalBuffer(); if (data < localBuffer.data() || data + len > localBuffer.data() + localBuffer.size()) { SE_THROW("unexpected send buffer"); } return data - localBuffer.data(); } private: SMLTKSharedMemory() { smlLibMalloc = sshalloc; smlLibFree = sshfree; } size_t m_messageBufferSize; void *m_messageBuffer; TmpFile m_localBuffer, m_remoteBuffer; static void *sshalloc(size_t size) { return singleton().shalloc(size); } void *shalloc(size_t size) { if (size == m_messageBufferSize) { try { m_localBuffer.map(&m_messageBuffer, NULL); return m_messageBuffer; } catch (...) { Exception::handle(); return NULL; } } else { return malloc(size); } } static void sshfree(void *ptr) { return singleton().shfree(ptr); } void shfree(void *ptr) { if (ptr == m_messageBuffer) { m_messageBuffer = NULL; } else { free(ptr); } } void prepareBuffer(TmpFile &tmpfile, size_t bufferSize) { // Reset buffer, in case it was used before (happens in client-test). tmpfile.close(); tmpfile.unmap(); tmpfile.create(); if (ftruncate(tmpfile.getFD(), bufferSize)) { SE_THROW(StringPrintf("resizing message buffer file to %ld bytes failed: %s", (long)bufferSize, strerror(errno))); } tmpfile.remove(); } }; class NoopAgentDestructor { public: void operator () (TransportAgent *agent) throw() {} }; LocalTransportAgent::LocalTransportAgent(SyncContext *server, const std::string &clientConfig, void *loop) : m_server(server), m_clientConfig(SyncConfig::normalizeConfigString(clientConfig)), m_status(INACTIVE), m_loop(loop ? GMainLoopCXX(static_cast(loop), ADD_REF) : GMainLoopCXX(g_main_loop_new(NULL, false), TRANSFER_REF)) { SMLTKSharedMemory::singleton().initParent(server->getMaxMsgSize()); } boost::shared_ptr LocalTransportAgent::create(SyncContext *server, const std::string &clientConfig, void *loop) { boost::shared_ptr self(new LocalTransportAgent(server, clientConfig, loop)); self->m_self = self; return self; } LocalTransportAgent::~LocalTransportAgent() { } void LocalTransportAgent::start() { // TODO (?): check that there are no conflicts between the active // sources. The old "contexts must be different" check achieved that // via brute force (because by definition, databases from different // contexts are meant to be independent), but it was too coarse // and ruled out valid configurations. // if (m_clientContext == m_server->getContextName()) { // SE_THROW(StringPrintf("invalid local sync inside context '%s', need second context with different databases", context.c_str())); // } if (m_forkexec) { SE_THROW("local transport already started"); } m_status = ACTIVE; m_forkexec = ForkExecParent::create("syncevo-local-sync"); #ifdef USE_DLT if (getenv("SYNCEVOLUTION_USE_DLT")) { m_forkexec->addEnvVar("SYNCEVOLUTION_USE_DLT", StringPrintf("%d", LoggerDLT::getCurrentDLTLogLevel())); } #endif m_forkexec->m_onConnect.connect(boost::bind(&LocalTransportAgent::onChildConnect, this, _1)); // fatal problems, including quitting child with non-zero status m_forkexec->m_onFailure.connect(boost::bind(&LocalTransportAgent::onFailure, this, _2)); // watch onQuit and remember whether the child is still running, // because it might quit prematurely with a zero return code (for // example, when an unexpected slow sync is detected) m_forkexec->m_onQuit.connect(boost::bind(&LocalTransportAgent::onChildQuit, this, _1)); m_forkexec->start(); } /** * Uses the D-Bus API provided by LocalTransportParent. */ class LocalTransportParent : private GDBusCXX::DBusRemoteObject { public: static const char *path() { return "/"; } static const char *interface() { return "org.syncevolution.localtransport.parent"; } static const char *destination() { return "local.destination"; } static const char *askPasswordName() { return "AskPassword"; } static const char *storeSyncReportName() { return "StoreSyncReport"; } LocalTransportParent(const GDBusCXX::DBusConnectionPtr &conn) : GDBusCXX::DBusRemoteObject(conn, path(), interface(), destination()), m_askPassword(*this, askPasswordName()), m_storeSyncReport(*this, storeSyncReportName()) {} /** LocalTransportAgent::askPassword() */ GDBusCXX::DBusClientCall1 m_askPassword; /** LocalTransportAgent::storeSyncReport() */ GDBusCXX::DBusClientCall0 m_storeSyncReport; }; /** * Uses the D-Bus API provided by LocalTransportAgentChild. */ class LocalTransportChild : public GDBusCXX::DBusRemoteObject { public: static const char *path() { return "/"; } static const char *interface() { return "org.syncevolution.localtransport.child"; } static const char *destination() { return "local.destination"; } static const char *logOutputName() { return "LogOutput"; } static const char *setFreezeName() { return "SetFreeze"; } static const char *startSyncName() { return "StartSync"; } static const char *sendMsgName() { return "SendMsg"; } LocalTransportChild(const GDBusCXX::DBusConnectionPtr &conn) : GDBusCXX::DBusRemoteObject(conn, path(), interface(), destination()), m_logOutput(*this, logOutputName(), false), m_setFreeze(*this, setFreezeName()), m_startSync(*this, startSyncName()), m_sendMsg(*this, sendMsgName()) {} /** * information from server config about active sources: * mapping is from server source names to child source name + sync mode * (again as set on the server side!) */ typedef std::map ActiveSources_t; /** use this to send a message back from child to parent */ typedef boost::shared_ptr< GDBusCXX::Result3< std::string, size_t, size_t > > ReplyPtr; /** log output with level and message; process name will be added by parent */ GDBusCXX::SignalWatch2 m_logOutput; /** LocalTransportAgentChild::setFreeze() */ GDBusCXX::DBusClientCall0 m_setFreeze; /** LocalTransportAgentChild::startSync() */ GDBusCXX::DBusClientCall3 m_startSync; /** LocalTransportAgentChild::sendMsg() */ GDBusCXX::DBusClientCall3 m_sendMsg; }; void LocalTransportAgent::logChildOutput(const std::string &level, const std::string &message) { Logger::MessageOptions options(Logger::strToLevel(level.c_str())); options.m_processName = &m_clientConfig; // Child should have written this into its own log file and/or syslog/dlt already. // Only pass it on to a user of the command line interface. options.m_flags = Logger::MessageOptions::ALREADY_LOGGED; SyncEvo::Logger::instance().messageWithOptions(options, "%s", message.c_str()); } void LocalTransportAgent::onChildConnect(const GDBusCXX::DBusConnectionPtr &conn) { SE_LOG_DEBUG(NULL, "child is ready"); m_parent.reset(new GDBusCXX::DBusObjectHelper(conn, LocalTransportParent::path(), LocalTransportParent::interface(), GDBusCXX::DBusObjectHelper::Callback_t(), true)); m_parent->add(this, &LocalTransportAgent::askPassword, LocalTransportParent::askPasswordName()); m_parent->add(this, &LocalTransportAgent::storeSyncReport, LocalTransportParent::storeSyncReportName()); m_parent->activate(); m_child.reset(new LocalTransportChild(conn)); m_child->m_logOutput.activate(boost::bind(&LocalTransportAgent::logChildOutput, this, _1, _2)); // now tell child what to do LocalTransportChild::ActiveSources_t sources; BOOST_FOREACH(const string &sourceName, m_server->getSyncSources()) { SyncSourceNodes nodes = m_server->getSyncSourceNodesNoTracking(sourceName); SyncSourceConfig source(sourceName, nodes); std::string sync = source.getSync(); if (sync != "disabled") { string targetName = source.getURINonEmpty(); sources[sourceName] = std::make_pair(targetName, sync); } } // Some sync properties come from the originating sync config. // They might have been set temporarily, so we have to read them // here. We must ensure that this value is used, even if unset. FullProps props = m_server->getConfigProps(); props[""].m_syncProps[SyncMaxMsgSize] = StringPrintf("%lu", m_server->getMaxMsgSize().get()); // TODO: also handle "preventSlowSync" like this. Currently it must // be set in the target sync config. For backward compatibility we // must disable slow sync when it is set on either side. m_child->m_startSync.start(m_clientConfig, StringPair(m_server->getConfigName(), m_server->isEphemeral() ? "ephemeral" : m_server->getRootPath()), static_cast(m_server->getLogDir()), m_server->getDoLogging(), std::make_pair(m_server->getSyncUser(), m_server->getSyncPassword()), props, sources, boost::bind(&LocalTransportAgent::storeReplyMsg, m_self, _1, _2, _3, _4)); } void LocalTransportAgent::onFailure(const std::string &error) { m_status = FAILED; g_main_loop_quit(m_loop.get()); SE_LOG_ERROR(NULL, "local transport failed: %s", error.c_str()); m_parent.reset(); m_child.reset(); } void LocalTransportAgent::onChildQuit(int status) { SE_LOG_DEBUG(NULL, "child process has quit with status %d", status); g_main_loop_quit(m_loop.get()); } static void GotPassword(const boost::shared_ptr< GDBusCXX::Result1 > &reply, const std::string &password) { reply->done(password); } static void PasswordException(const boost::shared_ptr< GDBusCXX::Result1 > &reply) { // TODO: refactor, this is the same as dbusErrorCallback try { // If there is no pending exception, the process will abort // with "terminate called without an active exception"; // dbusErrorCallback() should only be called when there is // a pending exception. // TODO: catch this misuse in a better way throw; } catch (...) { // let D-Bus parent log the error std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); reply->failed(GDBusCXX::dbus_error("org.syncevolution.localtransport.error", explanation)); } } void LocalTransportAgent::askPassword(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, const boost::shared_ptr< GDBusCXX::Result1 > &reply) { // pass that work to our own SyncContext and its UI - currently blocks SE_LOG_DEBUG(NULL, "local sync parent: asked for password %s, %s", passwordName.c_str(), descr.c_str()); try { if (m_server) { m_server->getUserInterfaceNonNull().askPasswordAsync(passwordName, descr, key, // TODO refactor: use dbus-callbacks.h boost::bind(GotPassword, reply, _1), boost::bind(PasswordException, reply)); } else { SE_LOG_DEBUG(NULL, "local sync parent: password request failed because no m_server"); reply->failed(GDBusCXX::dbus_error("org.syncevolution.localtransport.error", "not connected to UI")); } } catch (...) { PasswordException(reply); } } void LocalTransportAgent::storeSyncReport(const std::string &report) { SE_LOG_DEBUG(NULL, "got child sync report:\n%s", report.c_str()); m_clientReport = SyncReport(report); } void LocalTransportAgent::getClientSyncReport(SyncReport &report) { report = m_clientReport; } void LocalTransportAgent::setContentType(const std::string &type) { m_contentType = type; } // workaround for limitations of bind+signals when used together with plain GMainLoop pointer // (pointer to undefined struct) static void gMainLoopQuit(GMainLoopCXX *loop) { g_main_loop_quit(loop->get()); } void LocalTransportAgent::shutdown() { SE_LOG_DEBUG(NULL, "parent is shutting down"); if (m_forkexec) { // block until child is done boost::signals2::scoped_connection c(m_forkexec->m_onQuit.connect(boost::bind(gMainLoopQuit, &m_loop))); // don't kill the child here - we expect it to complete by // itself at some point // TODO: how do we detect a child which gets stuck after its last // communication with the parent? // m_forkexec->stop(); while (m_forkexec->getState() != ForkExecParent::TERMINATED) { SE_LOG_DEBUG(NULL, "waiting for child to stop"); g_main_loop_run(m_loop.get()); } m_forkexec.reset(); m_parent.reset(); m_child.reset(); } } void LocalTransportAgent::setFreeze(bool freeze) { // Relay to other side, check for error exception synchronously. if (m_child) { m_child->m_setFreeze(freeze); } } void LocalTransportAgent::send(const char *data, size_t len) { if (m_child) { size_t offset = SMLTKSharedMemory::singleton().toLocalOffset(data, len); m_status = ACTIVE; m_child->m_sendMsg.start(m_contentType, offset, len, boost::bind(&LocalTransportAgent::storeReplyMsg, m_self, _1, _2, _3, _4)); } else { m_status = FAILED; SE_THROW_EXCEPTION(TransportException, "cannot send message because child process is gone"); } } void LocalTransportAgent::storeReplyMsg(const std::string &contentType, size_t offset, size_t len, const std::string &error) { pcrecpp::StringPiece remoteBuffer = SMLTKSharedMemory::singleton().getRemoteBuffer(); m_replyMsg.set(remoteBuffer.data() + offset, len); m_replyContentType = contentType; if (error.empty()) { m_status = GOT_REPLY; } else { // Only an error if the client hasn't shut down normally. if (m_clientReport.empty()) { SE_LOG_ERROR(NULL, "sending message to child failed: %s", error.c_str()); m_status = FAILED; } } g_main_loop_quit(m_loop.get()); } void LocalTransportAgent::cancel() { if (m_forkexec) { SE_LOG_DEBUG(NULL, "killing local transport child in cancel()"); m_forkexec->stop(); } m_status = CANCELED; } TransportAgent::Status LocalTransportAgent::wait(bool noReply) { if (m_status == ACTIVE) { // need next message; for noReply == true we are done if (noReply) { m_status = INACTIVE; } else { while (m_status == ACTIVE) { SE_LOG_DEBUG(NULL, "waiting for child to send message"); if (m_forkexec && m_forkexec->getState() == ForkExecParent::TERMINATED) { m_status = FAILED; if (m_clientReport.getStatus() != STATUS_OK && m_clientReport.getStatus() != STATUS_HTTP_OK) { // Report that status, with an error message which contains the explanation // added to the client's error. We are a bit fuzzy about matching the status: // 10xxx matches xxx and vice versa. int status = m_clientReport.getStatus(); if (status >= sysync::LOCAL_STATUS_CODE && status <= sysync::LOCAL_STATUS_CODE_END) { status -= sysync::LOCAL_STATUS_CODE; } std::string explanation = StringPrintf("failure on target side %s of local sync", m_clientConfig.c_str()); static const pcrecpp::RE re("\\((?:local|remote), status (\\d+)\\): (.*)"); int clientStatus; std::string clientExplanation; if (re.PartialMatch(m_clientReport.getError(), &clientStatus, &clientExplanation) && (status == clientStatus || status == clientStatus - sysync::LOCAL_STATUS_CODE)) { explanation += ": "; explanation += clientExplanation; } SE_THROW_EXCEPTION_STATUS(StatusException, explanation, m_clientReport.getStatus()); } else { SE_THROW_EXCEPTION(TransportException, "child process quit without sending its message"); } } g_main_loop_run(m_loop.get()); } } } return m_status; } void LocalTransportAgent::getReply(const char *&data, size_t &len, std::string &contentType) { if (m_status != GOT_REPLY) { SE_THROW("internal error, no reply available"); } contentType = m_replyContentType; data = m_replyMsg.data(); len = m_replyMsg.size(); } void LocalTransportAgent::setTimeout(int seconds) { // setTimeout() was meant for unreliable transports like HTTP // which cannot determine whether the peer is still alive. The // LocalTransportAgent uses sockets and will notice when a peer // dies unexpectedly, so timeouts should never be necessary. // // Quite the opposite, because the "client" in a local sync // with WebDAV on the client side can be quite slow, incorrect // timeouts were seen where the client side took longer than // the default timeout of 5 minutes to process a message and // send a reply. // // Therefore we ignore the request to set a timeout here and thus // local send/receive operations are allowed to continue for as // long as they like. // // m_timeoutSeconds = seconds; } class LocalTransportUI : public UserInterface { boost::shared_ptr m_parent; public: LocalTransportUI(const boost::shared_ptr &parent) : m_parent(parent) {} /** implements password request by asking the parent via D-Bus */ virtual string askPassword(const string &passwordName, const string &descr, const ConfigPasswordKey &key) { SE_LOG_DEBUG(NULL, "local transport child: requesting password %s, %s via D-Bus", passwordName.c_str(), descr.c_str()); std::string password; std::string error; bool havePassword = false; m_parent->m_askPassword.start(passwordName, descr, key, boost::bind(&LocalTransportUI::storePassword, this, boost::ref(password), boost::ref(error), boost::ref(havePassword), _1, _2)); SuspendFlags &s = SuspendFlags::getSuspendFlags(); while (!havePassword) { if (s.getState() != SuspendFlags::NORMAL) { SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("User did not provide the '%s' password.", passwordName.c_str()), SyncMLStatus(sysync::LOCERR_USERABORT)); } g_main_context_iteration(NULL, true); } if (!error.empty()) { Exception::tryRethrowDBus(error); SE_THROW(StringPrintf("retrieving password failed: %s", error.c_str())); } return password; } virtual bool savePassword(const std::string &passwordName, const std::string &password, const ConfigPasswordKey &key) { SE_THROW("not implemented"); return false; } virtual void readStdin(std::string &content) { SE_THROW("not implemented"); } private: void storePassword(std::string &res, std::string &errorRes, bool &haveRes, const std::string &password, const std::string &error) { if (!error.empty()) { SE_LOG_DEBUG(NULL, "local transport child: D-Bus password request failed: %s", error.c_str()); errorRes = error; } else { SE_LOG_DEBUG(NULL, "local transport child: D-Bus password request succeeded"); res = password; } haveRes = true; } }; static void abortLocalSync(int sigterm) { // logging anything here is not safe (our own logging system might // have been interrupted by the SIGTERM and thus be in an inconsistent // state), but let's try it anyway SE_LOG_INFO(NULL, "local sync child shutting down due to SIGTERM"); // raise the signal again after disabling the handler, to ensure that // the exit status is "killed by signal xxx" - good because then // the whoever killed used gets the information that we didn't die for // some other reason signal(sigterm, SIG_DFL); raise(sigterm); } /** * Provides the "LogOutput" signal. * LocalTransportAgentChild adds the method implementations * before activating it. */ class LocalTransportChildImpl : public GDBusCXX::DBusObjectHelper { public: LocalTransportChildImpl(const GDBusCXX::DBusConnectionPtr &conn) : GDBusCXX::DBusObjectHelper(conn, LocalTransportChild::path(), LocalTransportChild::interface(), GDBusCXX::DBusObjectHelper::Callback_t(), true), m_logOutput(*this, LocalTransportChild::logOutputName()) { add(m_logOutput); }; GDBusCXX::EmitSignal2 m_logOutput; }; class ChildLogger : public Logger { std::auto_ptr m_parentLogger; boost::weak_ptr m_child; public: ChildLogger(const boost::shared_ptr &child) : m_parentLogger(new LogRedirect(LogRedirect::STDERR_AND_STDOUT)), m_child(child) {} ~ChildLogger() { m_parentLogger.reset(); } /** * Write message into our own log and send to parent. */ virtual void messagev(const MessageOptions &options, const char *format, va_list args) { if (options.m_level <= m_parentLogger->getLevel()) { m_parentLogger->process(); boost::shared_ptr child = m_child.lock(); if (child) { // prefix is used to set session path // for general server output, the object path field is dbus server // the object path can't be empty for object paths prevent using empty string. string strLevel = Logger::levelToStr(options.m_level); string log = StringPrintfV(format, args); child->m_logOutput(strLevel, log); } } } }; class LocalTransportAgentChild : public TransportAgent { /** final return code of our main(): non-zero indicates that we need to shut down */ int m_ret; /** * sync report for client side of the local sync */ SyncReport m_clientReport; /** used to capture libneon output */ boost::scoped_ptr m_parentLogger; /** * provides connection to parent, created in constructor */ boost::shared_ptr m_forkexec; /** * proxy for the parent's D-Bus API in onConnect() */ boost::shared_ptr m_parent; /** * our D-Bus interface, created in onConnect() */ boost::shared_ptr m_child; /** * sync context, created in Sync() D-Bus call */ boost::scoped_ptr m_client; /** * use this D-Bus result handle to send a message from child to parent * in response to sync() or (later) sendMsg() */ LocalTransportChild::ReplyPtr m_msgToParent; void setMsgToParent(const LocalTransportChild::ReplyPtr &reply, const std::string &reason) { if (m_msgToParent) { m_msgToParent->failed(GDBusCXX::dbus_error("org.syncevolution.localtransport.error", "cancelling message: " + reason)); } m_msgToParent = reply; } /** content type for message to parent */ std::string m_contentType; /** * message from parent in the shared memory buffer */ pcrecpp::StringPiece m_message; /** * content type of message from parent */ std::string m_messageType; /** * true after parent has received sync report, or sending failed */ bool m_reportSent; /** * INACTIVE when idle, * ACTIVE after having sent and while waiting for next message, * GOT_REPLY when we have a message to be processed, * FAILED when permanently broken */ Status m_status; /** * one loop run + error checking */ void step(const std::string &status) { SE_LOG_DEBUG(NULL, "local transport: %s", status.c_str()); if (!m_forkexec || m_forkexec->getState() == ForkExecChild::DISCONNECTED) { SE_THROW("local transport child no longer has a parent, terminating"); } g_main_context_iteration(NULL, true); if (m_ret) { SE_THROW("local transport child encountered a problem, terminating"); } } static void onParentQuit() { // Never free this state blocker. We can only abort and // quit from now on. static boost::shared_ptr abortGuard; SE_LOG_ERROR(NULL, "sync parent quit unexpectedly"); abortGuard = SuspendFlags::getSuspendFlags().abort(); } void onConnect(const GDBusCXX::DBusConnectionPtr &conn) { SE_LOG_DEBUG(NULL, "child connected to parent"); // provide our own API m_child.reset(new LocalTransportChildImpl(conn)); m_child->add(this, &LocalTransportAgentChild::setFreezeLocalSync, LocalTransportChild::setFreezeName()); m_child->add(this, &LocalTransportAgentChild::startSync, LocalTransportChild::startSyncName()); m_child->add(this, &LocalTransportAgentChild::sendMsg, LocalTransportChild::sendMsgName()); m_child->activate(); // set up connection to parent m_parent.reset(new LocalTransportParent(conn)); } void onFailure(SyncMLStatus status, const std::string &reason) { SE_LOG_DEBUG(NULL, "child fork/exec failed: %s", reason.c_str()); // record failure for parent if (!m_clientReport.getStatus()) { m_clientReport.setStatus(status); } if (!reason.empty() && m_clientReport.getError().empty()) { m_clientReport.setError(reason); } // return to step() m_ret = 1; } // D-Bus API, see LocalTransportChild; // must keep number of parameters < 9, the maximum supported by // our D-Bus binding void startSync(const std::string &clientConfig, const StringPair &serverConfig, // config name + root path const std::string &serverLogDir, bool serverDoLogging, const std::pair &serverSyncCredentials, const FullProps &serverConfigProps, const LocalTransportChild::ActiveSources_t &sources, const LocalTransportChild::ReplyPtr &reply) { setMsgToParent(reply, "sync() was called"); string peer, context, normalConfig; normalConfig = SyncConfig::normalizeConfigString(clientConfig); SyncConfig::splitConfigString(normalConfig, peer, context); if (peer.empty()) { peer = "target-config"; } // Keep the process name short in debug output if it is the // normal "target-config", be more verbose if it is something // else because it may be relevant. if (peer != "target-config") { Logger::setProcessName(peer + "@" + context); } else { Logger::setProcessName("@" + context); } SE_LOG_DEBUG(NULL, "Sync() called, starting the sync"); const char *delay = getenv("SYNCEVOLUTION_LOCAL_CHILD_DELAY2"); if (delay) { Sleep(atoi(delay)); } // initialize sync context m_client.reset(new SyncContext(peer + "@" + context, serverConfig.first, serverConfig.second == "ephemeral" ? serverConfig.second : serverConfig.second + "/." + normalConfig, boost::shared_ptr(this, NoopAgentDestructor()), serverDoLogging)); if (serverConfig.second == "ephemeral") { m_client->makeEphemeral(); } boost::shared_ptr ui(new LocalTransportUI(m_parent)); m_client->setUserInterface(ui); // allow proceeding with sync even if no "target-config" was created, // because information about username/password (for WebDAV) or the // sources (for file backends) might be enough m_client->setConfigNeeded(false); // apply temporary config filters m_client->setConfigFilter(true, "", serverConfigProps.createSyncFilter(m_client->getConfigName())); BOOST_FOREACH(const string &sourceName, m_client->getSyncSources()) { m_client->setConfigFilter(false, sourceName, serverConfigProps.createSourceFilter(m_client->getConfigName(), sourceName)); } // With the config in place, initialize message passing. SMLTKSharedMemory::singleton().initChild(m_client->getMaxMsgSize()); // Copy non-empty credentials from main config, because // that is where the GUI knows how to store them. A better // solution would be to require that credentials are in the // "target-config" config. // // Interactive password requests later in SyncContext::sync() // will end up in our LocalTransportContext::askPassword() // implementation above, which will pass the question to // the local sync parent. if (!serverSyncCredentials.first.toString().empty()) { m_client->setSyncUsername(serverSyncCredentials.first.toString(), true); } if (!serverSyncCredentials.second.empty()) { m_client->setSyncPassword(serverSyncCredentials.second, true); } // debugging mode: write logs inside sub-directory of parent, // otherwise use normal log settings if (!serverDoLogging) { m_client->setLogDir(std::string(serverLogDir) + "/child", true); } // disable all sources temporarily, will be enabled by next loop BOOST_FOREACH(const string &targetName, m_client->getSyncSources()) { SyncSourceNodes targetNodes = m_client->getSyncSourceNodes(targetName); SyncSourceConfig targetSource(targetName, targetNodes); targetSource.setSync("disabled", true); } // activate all sources in client targeted by main config, // with right uri BOOST_FOREACH(const LocalTransportChild::ActiveSources_t::value_type &entry, sources) { // mapping is from server (source) to child (target) const std::string &sourceName = entry.first; const std::string &targetName = entry.second.first; std::string sync = entry.second.second; SyncMode mode = StringToSyncMode(sync); if (mode != SYNC_NONE) { SyncSourceNodes targetNodes = m_client->getSyncSourceNodes(targetName); SyncSourceConfig targetSource(targetName, targetNodes); string fullTargetName = normalConfig + "/" + targetName; if (!targetNodes.dataConfigExists()) { if (targetName.empty()) { Exception::throwError(SE_HERE, "missing URI for one of the datastores"); } else { Exception::throwError(SE_HERE, StringPrintf("%s: datastore not configured", fullTargetName.c_str())); } } // All of the config setting is done as volatile, // so none of the regular config nodes have to // be written. If a sync mode was set, it must have been // done before in this loop => error in original config. if (!targetSource.isDisabled()) { Exception::throwError(SE_HERE, StringPrintf("%s: datastore targetted twice by %s", fullTargetName.c_str(), serverConfig.first.c_str())); } // invert data direction if (mode == SYNC_REFRESH_FROM_LOCAL) { mode = SYNC_REFRESH_FROM_REMOTE; } else if (mode == SYNC_REFRESH_FROM_REMOTE) { mode = SYNC_REFRESH_FROM_LOCAL; } else if (mode == SYNC_ONE_WAY_FROM_LOCAL) { mode = SYNC_ONE_WAY_FROM_REMOTE; } else if (mode == SYNC_ONE_WAY_FROM_REMOTE) { mode = SYNC_ONE_WAY_FROM_LOCAL; } else if (mode == SYNC_LOCAL_CACHE_SLOW) { // Remote side is running in caching mode and // asking for refresh. Send all our data. mode = SYNC_SLOW; } else if (mode == SYNC_LOCAL_CACHE_INCREMENTAL) { // Remote side is running in caching mode and // asking for an update. Use two-way mode although // nothing is going to come back (simpler that way // than using one-way, which has special code // paths in libsynthesis). mode = SYNC_TWO_WAY; } targetSource.setSync(PrettyPrintSyncMode(mode, true), true); targetSource.setURI(sourceName, true); } } // ready for m_client->sync() m_status = ACTIVE; } void sendMsg(const std::string &contentType, size_t offset, size_t len, const LocalTransportChild::ReplyPtr &reply) { SE_LOG_DEBUG(NULL, "child got message of %ld bytes", (long)len); setMsgToParent(LocalTransportChild::ReplyPtr(), "sendMsg() was called"); if (m_status == ACTIVE) { m_msgToParent = reply; pcrecpp::StringPiece remoteBuffer = SMLTKSharedMemory::singleton().getRemoteBuffer(); m_message.set(remoteBuffer.data() + offset, len); m_messageType = contentType; m_status = GOT_REPLY; } else { reply->failed(GDBusCXX::dbus_error("org.syncevolution.localtransport.error", "child not expecting any message")); } } // Must not be named setFreeze(), that is a virtual method in // TransportAgent that we don't want to override! void setFreezeLocalSync(bool freeze) { SE_LOG_DEBUG(NULL, "local transport child: setFreeze(%s)", freeze ? "true" : "false"); if (m_client) { m_client->setFreeze(freeze); } } public: LocalTransportAgentChild() : m_ret(0), m_forkexec(SyncEvo::ForkExecChild::create()), m_reportSent(false), m_status(INACTIVE) { m_forkexec->m_onConnect.connect(boost::bind(&LocalTransportAgentChild::onConnect, this, _1)); m_forkexec->m_onFailure.connect(boost::bind(&LocalTransportAgentChild::onFailure, this, _1, _2)); // When parent quits, we need to abort whatever we do and shut // down. There's no way how we can complete our work without it. // // Note that another way how this process can detect the // death of the parent is when it currently is waiting for // completion of a method call to the parent, like a request // for a password. However, that does not cover failures // like the parent not asking us to sync in the first place // and also does not work with libdbus (https://bugs.freedesktop.org/show_bug.cgi?id=49728). m_forkexec->m_onQuit.connect(&onParentQuit); m_forkexec->connect(); } boost::shared_ptr createLogger() { return boost::shared_ptr(new ChildLogger(m_child)); } void run() { SuspendFlags &s = SuspendFlags::getSuspendFlags(); while (!m_parent) { if (s.getState() != SuspendFlags::NORMAL) { SE_LOG_DEBUG(NULL, "aborted, returning while waiting for parent"); return; } step("waiting for parent"); } while (!m_client) { if (s.getState() != SuspendFlags::NORMAL) { SE_LOG_DEBUG(NULL, "aborted, returning while waiting for Sync() call from parent"); } step("waiting for Sync() call from parent"); } try { // ignore SIGINT signal in local sync helper from now on: // the parent process will handle those and tell us when // we are expected to abort by sending a SIGTERM struct sigaction new_action; memset(&new_action, 0, sizeof(new_action)); new_action.sa_handler = SIG_IGN; sigemptyset(&new_action.sa_mask); sigaction(SIGINT, &new_action, NULL); // SIGTERM would be caught by SuspendFlags and set the "abort" // state. But a lot of code running in this process cannot // check that flag in a timely manner (blocking calls in // libneon, activesync client libraries, ...). Therefore // it is better to abort inside the signal handler. new_action.sa_handler = abortLocalSync; sigaction(SIGTERM, &new_action, NULL); SE_LOG_DEBUG(NULL, "LocalTransportChild: ignore SIGINT, die in SIGTERM"); SE_LOG_INFO(NULL, "target side of local sync ready"); m_client->sync(&m_clientReport); } catch (...) { string explanation; SyncMLStatus status = Exception::handle(explanation); m_clientReport.setStatus(status); if (!explanation.empty() && m_clientReport.getError().empty()) { m_clientReport.setError(explanation); } if (m_parent) { std::string report = m_clientReport.toString(); SE_LOG_DEBUG(NULL, "child sending sync report after failure:\n%s", report.c_str()); m_parent->m_storeSyncReport.start(report, boost::bind(&LocalTransportAgentChild::syncReportReceived, this, _1)); // wait for acknowledgement for report once: // we are in some kind of error state, better // do not wait too long if (m_parent) { SE_LOG_DEBUG(NULL, "waiting for parent's ACK for sync report"); g_main_context_iteration(NULL, true); } } throw; } if (m_parent) { // send final report, ignore result std::string report = m_clientReport.toString(); SE_LOG_DEBUG(NULL, "child sending sync report:\n%s", report.c_str()); m_parent->m_storeSyncReport.start(report, boost::bind(&LocalTransportAgentChild::syncReportReceived, this, _1)); while (!m_reportSent && m_parent && s.getState() == SuspendFlags::NORMAL) { step("waiting for parent's ACK for sync report"); } } } void syncReportReceived(const std::string &error) { SE_LOG_DEBUG(NULL, "sending sync report to parent: %s", error.empty() ? "done" : error.c_str()); m_reportSent = true; } int getReturnCode() const { return m_ret; } /** * set transport specific URL of next message */ virtual void setURL(const std::string &url) {} /** * define content type for post, see content type constants */ virtual void setContentType(const std::string &type) { m_contentType = type; } /** * Requests an normal shutdown of the transport. This can take a * while, for example if communication is still pending. * Therefore wait() has to be called to ensure that the * shutdown is complete and that no error occurred. * * Simply deleting the transport is an *unnormal* shutdown that * does not communicate with the peer. */ virtual void shutdown() { SE_LOG_DEBUG(NULL, "child local transport shutting down"); if (m_msgToParent) { // Must send non-zero message, empty messages cause an // error during D-Bus message decoding on the receiving // side. Content doesn't matter, ignored by parent. m_msgToParent->done("shutdown-message", (size_t)0, (size_t)0); m_msgToParent.reset(); } if (m_status != FAILED) { m_status = CLOSED; } } /** * start sending message * * Memory must remain valid until reply is received or * message transmission is canceled. * * @param data start address of data to send * @param len number of bytes */ virtual void send(const char *data, size_t len) { SE_LOG_DEBUG(NULL, "child local transport sending %ld bytes", (long)len); if (m_msgToParent) { size_t offset = SMLTKSharedMemory::singleton().toLocalOffset(data, len); m_status = ACTIVE; m_msgToParent->done(m_contentType, offset, len); m_msgToParent.reset(); } else { m_status = FAILED; SE_THROW("cannot send data to parent because parent is not waiting for message"); } } /** * cancel an active message transmission * * Blocks until send buffer is no longer in use. * Returns immediately if nothing pending. */ virtual void cancel() {} /** * Wait for completion of an operation initiated earlier. * The operation can be a send with optional reply or * a close request. * * Returns immediately if no operations is pending. * * @param noReply true if no reply is required for a running send; * only relevant for transports used by a SyncML server */ virtual Status wait(bool noReply = false) { SuspendFlags &s = SuspendFlags::getSuspendFlags(); while (m_status == ACTIVE && s.getState() == SuspendFlags::NORMAL) { step("waiting for next message"); } return m_status; } /** * Tells the transport agent to stop the transmission the given * amount of seconds after send() was called. The transport agent * will then stop the message transmission and return a TIME_OUT * status in wait(). * * @param seconds number of seconds to wait before timing out, zero for no timeout */ virtual void setTimeout(int seconds) {} /** * provides access to reply data * * Memory pointer remains valid as long as * transport agent is not deleted and no other * message is sent. */ virtual void getReply(const char *&data, size_t &len, std::string &contentType) { SE_LOG_DEBUG(NULL, "processing %ld bytes in child", (long)m_message.size()); if (m_status != GOT_REPLY) { SE_THROW("getReply() called in child when no reply available"); } data = m_message.data(); len = m_message.size(); contentType = m_messageType; } }; int LocalTransportMain(int argc, char **argv) { // delay the client for debugging purposes const char *delay = getenv("SYNCEVOLUTION_LOCAL_CHILD_DELAY"); if (delay) { Sleep(atoi(delay)); } SyncContext::initMain("syncevo-local-sync"); // Our stderr is either connected to the original stderr (when // SYNCEVOLUTION_DEBUG is set) or the local sync's parent // LogRedirect. However, that stderr is not normally used. // Instead we install our own LogRedirect for both stdout (for // Execute() and synccompare, which then knows that it needs to // capture the output) and stderr (to get output like the one from // libneon into the child log) in LocalTransportAgentChild and // send all logging output to the local sync parent via D-Bus, to // be forwarded to the user as part of the normal message stream // of the sync session. setvbuf(stderr, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); // SIGPIPE must be ignored, some system libs (glib GIO?) trigger // it. SIGINT/TERM will be handled via SuspendFlags once the sync // runs. struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, NULL); try { if (getenv("SYNCEVOLUTION_DEBUG")) { Logger::instance().setLevel(Logger::DEBUG); } // process name will be set to target config name once it is known Logger::setProcessName("syncevo-local-sync"); boost::shared_ptr child(new LocalTransportAgentChild); PushLogger logger; // Temporary handle is necessary to avoid compiler issue with // clang (ambiguous brackets). { Logger::Handle handle(child->createLogger()); logger.reset(handle); } #ifdef USE_DLT // Set by syncevo-dbus-server for us. bool useDLT = getenv("SYNCEVOLUTION_USE_DLT") != NULL; PushLogger loggerdlt; if (useDLT) { loggerdlt.reset(new LoggerDLT(DLT_SYNCEVO_LOCAL_HELPER_ID, "SyncEvolution local sync helper")); } #endif child->run(); int ret = child->getReturnCode(); logger.reset(); child.reset(); return ret; } catch ( const std::exception &ex ) { SE_LOG_ERROR(NULL, "%s", ex.what()); } catch (...) { SE_LOG_ERROR(NULL, "unknown error"); } return 1; } SE_END_CXX syncevolution-1.5/src/syncevo/Exception.cpp0000664000373300001540000001364712330727742022461 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2014 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ #include #include #include #include "gdbus-cxx-bridge.h" #include #include SE_BEGIN_CXX static const char * const TRANSPORT_PROBLEM = "transport problem: "; static const char * const SYNTHESIS_PROBLEM = "error code from Synthesis engine "; static const char * const SYNCEVOLUTION_PROBLEM = "error code from SyncEvolution "; SyncMLStatus Exception::handle(SyncMLStatus *status, const std::string *logPrefix, std::string *explanation, Logger::Level level, HandleExceptionFlags flags) { // any problem here is a fatal local problem, unless set otherwise // by the specific exception SyncMLStatus new_status = SyncMLStatus(STATUS_FATAL + sysync::LOCAL_STATUS_CODE); std::string error; try { throw; } catch (const TransportException &ex) { SE_LOG_DEBUG(logPrefix, "TransportException thrown at %s:%d", ex.m_file.c_str(), ex.m_line); error = std::string(TRANSPORT_PROBLEM) + ex.what(); new_status = SyncMLStatus(sysync::LOCERR_TRANSPFAIL); } catch (const BadSynthesisResult &ex) { new_status = SyncMLStatus(ex.result()); error = StringPrintf("%s%s", SYNTHESIS_PROBLEM, Status2String(new_status).c_str()); } catch (const StatusException &ex) { new_status = ex.syncMLStatus(); SE_LOG_DEBUG(logPrefix, "exception thrown at %s:%d", ex.m_file.c_str(), ex.m_line); error = StringPrintf("%s%s: %s", SYNCEVOLUTION_PROBLEM, Status2String(new_status).c_str(), ex.what()); if (new_status == STATUS_NOT_FOUND && (flags & HANDLE_EXCEPTION_404_IS_OKAY)) { level = Logger::DEBUG; } } catch (const Exception &ex) { SE_LOG_DEBUG(logPrefix, "exception thrown at %s:%d", ex.m_file.c_str(), ex.m_line); error = ex.what(); } catch (const std::exception &ex) { error = ex.what(); } catch (...) { error = "unknown error"; } if (flags & HANDLE_EXCEPTION_FATAL) { level = Logger::ERROR; } if (flags & HANDLE_EXCEPTION_NO_ERROR) { level = Logger::DEBUG; } SE_LOG(logPrefix, level, "%s", error.c_str()); if (flags & HANDLE_EXCEPTION_FATAL) { // Something unexpected went wrong, can only shut down. ::abort(); } if (explanation) { *explanation = error; } if (status && *status == STATUS_OK) { *status = new_status; } return status ? *status : new_status; } void Exception::tryRethrow(const std::string &explanation, bool mustThrow) { static const std::string statusre = ".* \\((?:local|remote), status (\\d+)\\)"; int status; if (boost::starts_with(explanation, TRANSPORT_PROBLEM)) { SE_THROW_EXCEPTION(TransportException, explanation.substr(strlen(TRANSPORT_PROBLEM))); } else if (boost::starts_with(explanation, SYNTHESIS_PROBLEM)) { static const pcrecpp::RE re(statusre); if (re.FullMatch(explanation.substr(strlen(SYNTHESIS_PROBLEM)), &status)) { SE_THROW_EXCEPTION_1(BadSynthesisResult, "Synthesis engine failure", (sysync::TSyErrorEnum)status); } } else if (boost::starts_with(explanation, SYNCEVOLUTION_PROBLEM)) { static const pcrecpp::RE re(statusre + ": (.*)", pcrecpp::RE_Options().set_dotall(true)); std::string details; if (re.FullMatch(explanation.substr(strlen(SYNCEVOLUTION_PROBLEM)), &status, &details)) { SE_THROW_EXCEPTION_STATUS(StatusException, details, (SyncMLStatus)status); } } if (mustThrow) { throw std::runtime_error(explanation); } } void Exception::tryRethrowDBus(const std::string &error) { static const pcrecpp::RE re("(org\\.syncevolution(?:\\.\\w+)+): (.*)", pcrecpp::RE_Options().set_dotall(true)); std::string exName, explanation; if (re.FullMatch(error, &exName, &explanation)) { // found SyncEvolution exception explanation, parse it tryRethrow(explanation); // explanation not parsed, fall back to D-Bus exception throw GDBusCXX::dbus_error(exName, explanation); } } void Exception::throwError(const SourceLocation &where, const std::string &error) { throwError(where, SyncMLStatus(STATUS_FATAL + sysync::LOCAL_STATUS_CODE), error); } void Exception::throwError(const SourceLocation &where, SyncMLStatus status, const std::string &error) { throw StatusException(where.m_file, where.m_line, error, status); } void Exception::throwError(const SourceLocation &where, const std::string &action, int error) { std::string what = action + ": " + strerror(error); // be as specific if we can be: relevant for the file backend, // which is expected to return STATUS_NOT_FOUND == 404 for "file // not found" if (error == ENOENT) { throwError(where, STATUS_NOT_FOUND, what); } else { throwError(where, what); } } void Exception::fatalError(void *object, const char *error) { SE_LOG_ERROR(NULL, "%s", error); exit(1); } SE_END_CXX syncevolution-1.5/src/syncevo/util.cpp0000664000373300001540000006540712355040516021473 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_GLIB # include #endif #if USE_SHA256 == 1 # ifndef HAVE_GLIB # error need glib.h # endif #elif USE_SHA256 == 2 # include # include # include #endif #ifdef ENABLE_UNIT_TESTS #include "test.h" CPPUNIT_REGISTRY_ADD_TO_DEFAULT("SyncEvolution"); #endif #include SE_BEGIN_CXX string normalizePath(const string &path) { string res; res.reserve(path.size()); size_t index = 0; while (index < path.size()) { char curr = path[index]; res += curr; index++; if (curr == '/') { while (index < path.size() && (path[index] == '/' || (path[index] == '.' && index + 1 < path.size() && path[index + 1] == '/'))) { index++; } } } if (!res.empty() && res[res.size() - 1] == '/') { res.resize(res.size() - 1); } return res; } string getBasename(const string &path) { string dir; string file; splitPath(path, dir, file); return file; } string getDirname(const string &path) { string dir; string file; splitPath(path, dir, file); return dir; } void splitPath(const string &path, string &dir, string &file) { string normal = normalizePath(path); size_t offset = normal.rfind('/'); if (offset != normal.npos) { dir = normal.substr(0, offset); file = normal.substr(offset + 1); } else { dir = ""; file = normal; } } bool relToAbs(string &path) { char *buffer; if ((buffer = realpath(path.c_str(), NULL)) != NULL) { path = buffer; free(buffer); return true; } else { return false; } } void mkdir_p(const string &path) { boost::scoped_array dirs(new char[path.size() + 1]); char *curr = dirs.get(); strcpy(curr, path.c_str()); do { char *nextdir = strchr(curr, '/'); if (nextdir) { *nextdir = 0; nextdir++; } if (*curr) { if (access(dirs.get(), nextdir ? (R_OK|X_OK) : (R_OK|X_OK|W_OK)) && (errno != ENOENT || mkdir(dirs.get(), 0700))) { Exception::throwError(SE_HERE, string(dirs.get()), errno); } } if (nextdir) { nextdir[-1] = '/'; } curr = nextdir; } while (curr); } void rm_r(const string &path, boost::function filter) { struct stat buffer; if (lstat(path.c_str(), &buffer)) { if (errno == ENOENT) { return; } else { Exception::throwError(SE_HERE, path, errno); } } if (!S_ISDIR(buffer.st_mode)) { if (!filter(path, false) || !unlink(path.c_str())) { return; } else { Exception::throwError(SE_HERE, path, errno); } } ReadDir dir(path); BOOST_FOREACH(const string &entry, dir) { rm_r(path + "/" + entry, filter); } if (filter(path, true) && rmdir(path.c_str())) { Exception::throwError(SE_HERE, path, errno); } } void cp_r(const string &from, const string &to) { if (isDir(from)) { mkdir_p(to); ReadDir dir(from); BOOST_FOREACH(const string &entry, dir) { cp_r(from + "/" + entry, to + "/" + entry); } } else { ofstream out; ifstream in; out.open(to.c_str()); in.open(from.c_str()); char buf[8192]; do { in.read(buf, sizeof(buf)); out.write(buf, in.gcount()); } while(in); in.close(); out.close(); if (out.bad() || in.bad()) { SE_THROW(string("failed copying ") + from + " to " + to); } } } bool isDir(const string &path) { DIR *dir = opendir(path.c_str()); if (dir) { closedir(dir); return true; } else if (errno != ENOTDIR && errno != ENOENT) { Exception::throwError(SE_HERE, path, errno); } return false; } int Execute(const std::string &cmd, ExecuteFlags flags) throw() { int ret = -1; try { // use simpler system() calls whenever we don't want to capture // output, because it means that output is sent to the user // directly if (((flags & EXECUTE_NO_STDERR) || !LogRedirect::redirectingStderr()) && ((flags & EXECUTE_NO_STDOUT) || !LogRedirect::redirectingStdout())) { string fullcmd = cmd; if (flags & EXECUTE_NO_STDERR) { fullcmd += " 2>/dev/null"; } if (flags & EXECUTE_NO_STDOUT) { fullcmd += " >/dev/null"; } SE_LOG_DEBUG(NULL, "running command via system(): %s", cmd.c_str()); ret = system(fullcmd.c_str()); } else { // Need to catch at least one of stdout or stderr. A // low-tech solution would be to use temporary files which // are read after system() returns. But we want true // streaming of the output, so use fork()/exec() plus // reliable output redirection. SE_LOG_DEBUG(NULL, "running command via fork/exec with output redirection: %s", cmd.c_str()); LogRedirect io(flags); pid_t child = fork(); switch (child) { case 0: { // child process: // - close unused end of the pipes if (io.getStdout().m_read >= 0) { close(io.getStdout().m_read); } if (io.getStderr().m_read >= 0) { close(io.getStderr().m_read); } // - replace file descriptors 1 and 2 with the ones // prepared for us or /dev/null int fd; int fd_null = open("/dev/null", O_WRONLY); fd = io.getStdout().m_write; if (fd <= 0) { fd = fd_null; } dup2(fd, STDOUT_FILENO); fd = io.getStderr().m_write; if (fd <= 0) { fd = fd_null; } dup2(fd, STDERR_FILENO); // - run command execl("/bin/sh", "sh", "-c", cmd.c_str(), NULL); // - error handling if execl() failed (= returned) std::cerr << cmd << ": execl() failed: " << strerror(errno); exit(1); break; } case -1: // error handling in parent when fork() fails SE_LOG_ERROR(NULL, "%s: fork() failed: %s", cmd.c_str(), strerror(errno)); break; default: // parent: // - close write side so that we can detect "end of data" if (io.getStdout().m_write >= 0) { close(io.getStdout().m_write); } if (io.getStderr().m_write >= 0) { close(io.getStderr().m_write); } // - read until no more data or error triggers exception io.process(); // - wait for child, without caring about errors waitpid(child, &ret, 0); break; } } } catch (...) { Exception::handle(); } return ret; } UUID::UUID() { #ifdef USE_SRAND static class InitSRand { public: InitSRand() { ifstream seedsource("/dev/urandom"); unsigned int seed; if (!seedsource.get((char *)&seed, sizeof(seed))) { seed = time(NULL); } srand(seed); } int operator () () { return rand(); } } myrand; #else static class InitSRand { unsigned int m_seed; public: InitSRand() { ifstream seedsource("/dev/urandom"); if (!seedsource.get((char *)&m_seed, sizeof(m_seed))) { m_seed = time(NULL); } } int operator () () { return rand_r(&m_seed); } } myrand; #endif char buffer[16 * 4 + 5]; sprintf(buffer, "%08x-%04x-%04x-%02x%02x-%08x%04x", myrand() & 0xFFFFFFFF, myrand() & 0xFFFF, (myrand() & 0x0FFF) | 0x4000 /* RFC 4122 time_hi_and_version */, (myrand() & 0xBF) | 0x80 /* clock_seq_hi_and_reserved */, myrand() & 0xFF, myrand() & 0xFFFFFFFF, myrand() & 0xFFFF ); this->assign(buffer); } ReadDir::ReadDir(const string &path, bool throwError) : m_path(path) { DIR *dir = NULL; try { dir = opendir(path.c_str()); if (!dir) { Exception::throwError(SE_HERE, path, errno); } errno = 0; struct dirent *entry = readdir(dir); while (entry) { if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { m_entries.push_back(entry->d_name); } entry = readdir(dir); } if (errno) { Exception::throwError(SE_HERE, path, errno); } std::sort(m_entries.begin(), m_entries.end()); } catch(...) { if (dir) { closedir(dir); } if (throwError) { throw; } else { return; } } closedir(dir); } std::string ReadDir::find(const string &entry, bool caseSensitive) { BOOST_FOREACH(const string &e, *this) { if (caseSensitive ? e == entry : boost::iequals(e, entry)) { return m_path + "/" + e; } } return ""; } bool ReadFile(const string &filename, string &content) { ifstream in; in.open(filename.c_str()); return ReadFile(in, content); } bool ReadFile(istream &in, string &content) { ostringstream out; char buf[8192]; do { in.read(buf, sizeof(buf)); out.write(buf, in.gcount()); } while(in); content = out.str(); return in.eof(); } unsigned long Hash(const char *str) { unsigned long hashval = 5381; int c; while ((c = *str++) != 0) { hashval = ((hashval << 5) + hashval) + c; } return hashval; } unsigned long Hash(const std::string &str) { unsigned long hashval = 5381; BOOST_FOREACH(int c, str) { hashval = ((hashval << 5) + hashval) + c; } return hashval; } std::string SHA_256(const std::string &data) { #if USE_SHA256 == 1 GStringPtr hash(g_compute_checksum_for_data(G_CHECKSUM_SHA256, (guchar *)data.c_str(), data.size()), "g_compute_checksum_for_data() failed"); return std::string(hash.get()); #elif USE_SHA256 == 2 std::string res; unsigned char hash[SHA256_LENGTH]; static bool initialized; if (!initialized) { // https://wiki.mozilla.org/NSS_Shared_DB_And_LINUX has // some comments which indicate that calling init multiple // times works, but http://www.mozilla.org/projects/security/pki/nss/ref/ssl/sslfnc.html#1234224 // says it must only be called once. How that is supposed // to work when multiple, independent libraries have to // use NSS is beyond me. Bad design. At least let's do the // best we can here. NSS_NoDB_Init(NULL); initialized = true; } if (HASH_HashBuf(HASH_AlgSHA256, hash, (unsigned char *)data.c_str(), data.size()) != SECSuccess) { SE_THROW("NSS HASH_HashBuf() failed"); } res.reserve(SHA256_LENGTH * 2); BOOST_FOREACH(unsigned char value, hash) { res += StringPrintf("%02x", value); } return res; #else SE_THROW("Hash256() not implemented"); return ""; #endif } StringEscape::StringEscape(char escapeChar, const char *forbidden) : m_escapeChar(escapeChar) { while (*forbidden) { m_forbidden.insert(*forbidden); ++forbidden; } } string StringEscape::escape(const string &str) const { if (m_mode != SET) { return escape(str, m_escapeChar, m_mode); } string res; char buffer[4]; res.reserve(str.size() * 3); BOOST_FOREACH(char c, str) { if(c != m_escapeChar && m_forbidden.find(c) == m_forbidden.end()) { res += c; } else { sprintf(buffer, "%c%02x", m_escapeChar, (unsigned int)(unsigned char)c); res += buffer; } } return res; } string StringEscape::escape(const string &str, char escapeChar, Mode mode) { string res; char buffer[4]; bool isLeadingSpace = true; res.reserve(str.size() * 3); BOOST_FOREACH(char c, str) { if(c != escapeChar && (mode == STRICT ? (isalnum(c) || c == '-' || c == '_') : !(((isLeadingSpace || mode == INI_WORD) && isspace(c)) || c == '=' || c == '\r' || c == '\n'))) { res += c; if (!isspace(c)) { isLeadingSpace = false; } } else { sprintf(buffer, "%c%02x", escapeChar, (unsigned int)(unsigned char)c); res += buffer; } } // also encode trailing space? if (mode == INI_VALUE) { size_t numspaces = 0; ssize_t off = res.size() - 1; while (off >= 0 && isspace(res[off])) { off--; numspaces++; } res.resize(res.size() - numspaces); BOOST_FOREACH(char c, str.substr(str.size() - numspaces)) { sprintf(buffer, "%c%02x", escapeChar, (unsigned int)(unsigned char)c); res += buffer; } } return res; } string StringEscape::unescape(const string &str, char escapeChar) { string res; size_t curr; res.reserve(str.size()); curr = 0; while (curr < str.size()) { if (str[curr] == escapeChar) { string hex = str.substr(curr + 1, 2); res += (char)strtol(hex.c_str(), NULL, 16); curr += 3; } else { res += str[curr]; curr++; } } return res; } #ifdef ENABLE_UNIT_TESTS class StringEscapeTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(StringEscapeTest); CPPUNIT_TEST(escape); CPPUNIT_TEST(unescape); CPPUNIT_TEST_SUITE_END(); void escape() { const string test = " _-%\rfoo bar?! \n "; StringEscape def; CPPUNIT_ASSERT_EQUAL(string("%20_-%25%0dfoo%20bar%3f%21%20%0a%20"), def.escape(test)); CPPUNIT_ASSERT_EQUAL(string("%20_-%25%0dfoo%20bar%3f%21%20%0a%20"), StringEscape::escape(test, '%', StringEscape::STRICT)); StringEscape word('%', StringEscape::INI_WORD); CPPUNIT_ASSERT_EQUAL(string("%20_-%25%0dfoo%20bar?!%20%0a%20"), word.escape(test)); CPPUNIT_ASSERT_EQUAL(string("%20_-%25%0dfoo%20bar?!%20%0a%20"), StringEscape::escape(test, '%', StringEscape::INI_WORD)); StringEscape ini('%', StringEscape::INI_VALUE); CPPUNIT_ASSERT_EQUAL(string("%20_-%25%0dfoo bar?! %0a%20"), ini.escape(test)); CPPUNIT_ASSERT_EQUAL(string("%20_-%25%0dfoo bar?! %0a%20"), StringEscape::escape(test, '%', StringEscape::INI_VALUE)); StringEscape alt('!', StringEscape::INI_VALUE); CPPUNIT_ASSERT_EQUAL(string("!20_-%!0dfoo bar?!21 !0a!20"), alt.escape(test)); CPPUNIT_ASSERT_EQUAL(string("!20_-%!0dfoo bar?!21 !0a!20"), StringEscape::escape(test, '!', StringEscape::INI_VALUE)); } void unescape() { const string escaped = "%20_-%25foo%20bar%3F%21%20%0A"; const string plain = " _-%foo bar?! \n"; StringEscape def; CPPUNIT_ASSERT_EQUAL(plain, def.unescape(escaped)); CPPUNIT_ASSERT_EQUAL(plain, StringEscape::unescape(escaped, '%')); CPPUNIT_ASSERT_EQUAL(string("%41B"), StringEscape::unescape("%41!42", '!')); CPPUNIT_ASSERT_EQUAL(string("A!42"), StringEscape::unescape("%41!42", '%')); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(StringEscapeTest); #endif // ENABLE_UNIT_TESTS Timespec Timespec::operator + (const Timespec &other) const { Timespec res(tv_sec + other.tv_sec, tv_nsec + other.tv_nsec); if (res.tv_nsec > 1000000000) { res.tv_sec++; res.tv_nsec -= 1000000000; } return res; } Timespec Timespec::operator - (const Timespec &other) const { Timespec res(tv_sec - other.tv_sec, 0); if (other.tv_nsec > tv_nsec) { res.tv_sec--; res.tv_nsec = tv_nsec + 1000000000 - other.tv_nsec; } else { res.tv_nsec = tv_nsec - other.tv_nsec; } return res; } #ifdef ENABLE_UNIT_TESTS class TimespecTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TimespecTest); CPPUNIT_TEST(add); CPPUNIT_TEST(substract); CPPUNIT_TEST_SUITE_END(); void add() { CPPUNIT_ASSERT_EQUAL(Timespec(1, 0), Timespec(0, 0) + 1); CPPUNIT_ASSERT_EQUAL(Timespec(1, 0), Timespec(0, 0) + Timespec(1, 0)); CPPUNIT_ASSERT_EQUAL(Timespec(1, 0), Timespec(0, 500000000) + Timespec(0, 500000000)); CPPUNIT_ASSERT_EQUAL(Timespec(1, 999999998), Timespec(0, 999999999) + Timespec(0, 999999999)); } void substract() { CPPUNIT_ASSERT_EQUAL(Timespec(1, 0), Timespec(2, 0) - 1); CPPUNIT_ASSERT_EQUAL(Timespec(1, 0), Timespec(2, 0) - Timespec(1, 0)); CPPUNIT_ASSERT_EQUAL(Timespec(1, 0), Timespec(1, 500000000) - Timespec(0, 500000000)); CPPUNIT_ASSERT_EQUAL(Timespec(0, 999999999), Timespec(1, 999999998) - Timespec(0, 999999999)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(TimespecTest); #endif // ENABLE_UNIT_TESTS std::string StringPrintf(const char *format, ...) { va_list ap; va_start(ap, format); std::string res = StringPrintfV(format, ap); va_end(ap); return res; } std::string StringPrintfV(const char *format, va_list ap) { va_list aq; char *buffer = NULL, *nbuffer = NULL; ssize_t size = 0; ssize_t realsize = 255; do { // vsnprintf() destroys ap, so make a copy first va_copy(aq, ap); if (size < realsize) { nbuffer = (char *)realloc(buffer, realsize + 1); if (!nbuffer) { if (buffer) { free(buffer); } return ""; } size = realsize; buffer = nbuffer; } // We never get here with buffer == NULL because of the size check. // cppcheck-suppress nullPointer realsize = vsnprintf(buffer, size + 1, format, aq); if (realsize == -1) { // old-style vnsprintf: exact len unknown, try again with doubled size realsize = size * 2; } va_end(aq); } while(realsize > size); std::string res = buffer; free(buffer); return res; } char *Strncpy(char *dest, const char *src, size_t n) { strncpy(dest, src, n); if (n) { dest[n - 1] = 0; } return dest; } static gboolean SleepTimeout(gpointer triggered) { *static_cast(triggered) = true; return false; } double Sleep(double seconds) { Timespec start = Timespec::monotonic(); SuspendFlags &s = SuspendFlags::getSuspendFlags(); if (s.getState() == SuspendFlags::NORMAL) { #ifdef HAVE_GLIB // Only use glib if we are the owner of the main context. // Otherwise we would interfere (?) with that owner or // depend on it to drive the context (?). The glib docs // don't say anything about this; in practice, it was // observed that with some versions of glib, a second // thread just blocked here when the main thread was not // processing glib events. if (g_main_context_is_owner(g_main_context_default())) { bool triggered = false; GLibEvent timeout(g_timeout_add(seconds * 1000, SleepTimeout, &triggered), "glib timeout"); GRunWhile(! boost::lambda::var(triggered) && boost::lambda::bind(&SuspendFlags::getState, boost::ref(s)) == SuspendFlags::NORMAL); // SleepTimeout already removed the source if it was triggered // and returned false. No need to auto-destruct it again. if (triggered) { timeout.release(); } // done return 0; } #endif // Fallback when glib is not available or unusable (= outside the main thread). // Busy loop to detect abort requests. Timespec deadline = start + Timespec(floor(seconds), (seconds - floor(seconds)) * 1e9); while (deadline > Timespec::monotonic()) { timeval delay; delay.tv_sec = 0; delay.tv_usec = 1e5; select(0, NULL, NULL, NULL, &delay); // s.getState() will eventually return a different value than it did before. // cppcheck-suppress oppositeInnerCondition if (s.getState() != SuspendFlags::NORMAL) { break; } } } // not done normally, calculate remaining time Timespec end = Timespec::monotonic(); double left = (end - start).duration() - seconds; return std::max((double)0, left); } InitStateTri::Value InitStateTri::getValue() const { const std::string &val = get(); if (val == "1" || boost::iequals(val, "true") || boost::iequals(val, "yes")) { return VALUE_TRUE; } else if (val == "0" || boost::iequals(val, "false") || boost::iequals(val, "no")) { return VALUE_FALSE; } else { return VALUE_STRING; } } std::string SubstEnvironment(const std::string &str) { std::stringstream res; size_t envstart = std::string::npos; size_t off; for(off = 0; off < str.size(); off++) { if (envstart != std::string::npos) { if (str[off] == '}') { std::string envname = str.substr(envstart, off - envstart); envstart = std::string::npos; const char *val = getenv(envname.c_str()); if (val) { res << val; } else if (envname == "XDG_CONFIG_HOME") { res << getHome() << "/.config"; } else if (envname == "XDG_DATA_HOME") { res << getHome() << "/.local/share"; } else if (envname == "XDG_CACHE_HOME") { res << getHome() << "/.cache"; } } } else { if (str[off] == '$' && off + 1 < str.size() && str[off + 1] == '{') { envstart = off + 2; off++; } else { res << str[off]; } } } return res.str(); } std::vector unescapeJoinedString (const std::string& src, char sep) { std::vector splitStrings; size_t pos1 = 0, pos2 = 0, pos3 = 0; std::string s1, s2; while (pos3 != src.npos) { pos2 = src.find (sep, pos3); s1 = src.substr (pos1, (pos2 == std::string::npos) ? std::string::npos : pos2-pos1); size_t pos = s1.find_last_not_of ("\\"); pos3 = (pos2 == std::string::npos) ?pos2 : pos2+1; // A matching delimiter is a comma with even trailing '\' // characters if (!((s1.length() - ((pos == s1.npos) ? 0: pos-1)) &1 )) { s2=""; boost::trim (s1); for (std::string::iterator i = s1.begin(); i != s1.end(); ++i) { //unescape characters if (*i == '\\') { if(++i == s1.end()) { break; } } s2+=*i; } splitStrings.push_back (s2); pos1 = pos3; } } return splitStrings; } std::string Flags2String(int flags, const Flag *descr, const std::string &sep) { std::list tmp; while (descr->m_flag) { if (flags & descr->m_flag) { tmp.push_back(descr->m_description); } ++descr; } return boost::join(tmp, ", "); } std::string SyncEvolutionDataDir() { std::string dataDir(DATA_DIR); const char *envvar = getenv("SYNCEVOLUTION_DATA_DIR"); if (envvar) { dataDir = envvar; } return dataDir; } ScopedEnvChange::ScopedEnvChange(const std::string &var, const std::string &value) : m_var(var) { const char *oldval = getenv(var.c_str()); if (oldval) { m_oldvalset = true; m_oldval = oldval; } else { m_oldvalset = false; } setenv(var.c_str(), value.c_str(), 1); } ScopedEnvChange::~ScopedEnvChange() { if (m_oldvalset) { setenv(m_var.c_str(), m_oldval.c_str(), 1); } else { unsetenv(m_var.c_str()); } } std::string getCurrentTime() { time_t seconds = time (NULL); tm tmbuffer; tm *data = localtime_r(&seconds, &tmbuffer); if (!data) { return "???"; } arrayptr buffer (new char [13]); strftime (buffer.get(), 13, "%y%m%d%H%M%S", data); return buffer.get(); } SE_END_CXX syncevolution-1.5/src/syncevo/TmpFile.cpp0000664000373300001540000001301612405555067022053 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include "TmpFile.h" #include "util.h" TmpFile::TmpFile() : m_type(FILE), m_fd(-1), m_mapptr(0), m_mapsize(0) { } TmpFile::~TmpFile() { try { unmap(); close(); if (m_type == PIPE && !m_filename.empty()) { unlink(m_filename.c_str()); } } catch (std::exception &x) { fprintf(stderr, "TmpFile::~TmpFile(): %s\n", x.what()); } catch (...) { fputs("TmpFile::~TmpFile(): unknown exception\n", stderr); } } void TmpFile::create(Type type) { gchar *filename = NULL; GError *error = NULL; if (m_fd >= 0 || m_mapptr || m_mapsize) { throw TmpFileException("TmpFile::create(): busy"); } m_fd = g_file_open_tmp(NULL, &filename, &error); if (error != NULL) { throw TmpFileException( std::string("TmpFile::create(): g_file_open_tmp(): ") + std::string(error->message)); } m_filename = filename; g_free(filename); m_type = type; if (type == PIPE) { // We merely use the normal file to get a temporary file name which // is guaranteed to be unique. There's a slight chance for a denial-of-service // attack when someone creates a link or normal file directly after we remove // the file, but because mknod neither overwrites an existing entry nor follows // symlinks, the effect is smaller compared to opening a file. unlink(m_filename.c_str()); if (mknod(m_filename.c_str(), S_IFIFO|S_IRWXU, 0)) { m_filename = ""; throw TmpFileException(SyncEvo::StringPrintf("mknod(%s): %s", m_filename.c_str(), strerror(errno))); } // Open without blocking. Necessary because otherwise we end up // waiting here. Opening later also does not work, because then // obexd gets stuck in its open() call while we wait for it to // acknowledge the start of the transfer. m_fd = open(m_filename.c_str(), O_RDONLY|O_NONBLOCK, 0); if (m_fd < 0) { throw TmpFileException(SyncEvo::StringPrintf("open(%s): %s", m_filename.c_str(), strerror(errno))); } // From now on, block on the pipe. fcntl(m_fd, F_SETFL, fcntl(m_fd, F_GETFL) & ~O_NONBLOCK); } } void TmpFile::create(int fd) { if (m_fd >= 0 || m_mapptr || m_mapsize) { throw TmpFileException("TmpFile::create(): busy"); } m_fd = fd; m_filename.clear(); m_type = FILE; } void TmpFile::map(void **mapptr, size_t *mapsize) { struct stat sb; if (m_mapptr || m_mapsize) { throw TmpFileException("TmpFile::map(): busy"); } if (m_fd < 0) { throw TmpFileException("TmpFile::map(): m_fd < 0"); } if (fstat(m_fd, &sb) != 0) { throw TmpFileException("TmpFile::map(): fstat()"); } // TODO (?): make this configurable. // // At the moment, SyncEvolution either only reads from a file // (and thus MAP_SHARED vs. MAP_PRIVATE doesn't matter, and // PROT_WRITE doesn't hurt), or writes for some other process // to read the data (hence needing MAP_SHARED). m_mapptr = mmap(NULL, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, m_fd, 0); if (m_mapptr == MAP_FAILED) { m_mapptr = 0; throw TmpFileException("TmpFile::map(): mmap()"); } m_mapsize = sb.st_size; if (mapptr != NULL) { *mapptr = m_mapptr; } if (mapsize != NULL) { *mapsize = m_mapsize; } } void TmpFile::unmap() { if (m_mapptr && m_mapsize) { munmap(m_mapptr, m_mapsize); } m_mapsize = 0; m_mapptr = 0; } size_t TmpFile::moreData() const { if (m_fd >= 0) { struct stat sb; if (fstat(m_fd, &sb) != 0) { throw TmpFileException("TmpFile::map(): fstat()"); } if ((!m_mapptr && sb.st_size) || (sb.st_size > 0 && m_mapsize < (size_t)sb.st_size)) { return sb.st_size - m_mapsize; } } return 0; } void TmpFile::remove() { if (!m_filename.empty()) { unlink(m_filename.c_str()); m_filename.clear(); } } void TmpFile::close() { remove(); if (m_fd >= 0) { ::close(m_fd); m_fd = -1; } } pcrecpp::StringPiece TmpFile::stringPiece() { pcrecpp::StringPiece sp; if (!(m_mapptr && m_mapsize)) { map(); } sp.set(m_mapptr, static_cast (m_mapsize)); return sp; } syncevolution-1.5/src/syncevo/TmpFile.h0000664000373300001540000001060312405555067021517 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVOLUTION_TMPFILE #define INCL_SYNCEVOLUTION_TMPFILE #include #include #include /** * Exception class for TmpFile. */ class TmpFileException : public std::runtime_error { public: TmpFileException(const std::string &what) : std::runtime_error(what) { } }; /** * Class for handling temporary files, either read/write access * or memory mapped. Optionally creates a pipe instead of a plain file. * * Reading is done mapping the plain file into memory (file) or simply * reading from the file descriptor (file or pipe). * * Closing and removing a mapped file is supported by calling close() * after map(). */ class TmpFile { public: enum Type { FILE, PIPE }; TmpFile(); virtual ~TmpFile(); /** * Create a temporary file or pipe. */ void create(Type type = FILE); /** * Create a temporary file with an already existing * file descriptor. New instance owns the FD. */ void create(int fd); /** * Map a view of file and optionally return pointer and/or size. * * File should already have a correct size. * * @param mapptr Pointer to variable for mapped pointer. (can be NULL) * @param mapsize Pointer to variable for mapped size. (can be NULL) */ void map(void **mapptr = 0, size_t *mapsize = 0); /** * Unmap a view of file. */ void unmap(); /** * File descriptor, ready for reading from start of file or pipe * after create(). */ int getFD() const { return m_fd; } /** * FILE by default, otherwise the value given to create(). */ Type getType() const { return m_type; } /** * Returns amount of bytes not mapped into memory yet, zero if none. */ size_t moreData() const; /** * Remove the file. If the process crashes, the file will be removed, * but the process itself can still map and use the file content. */ void remove(); /** * Remove and close the file. * * Calling this after map() will make the file disappear from * filesystem but the mapping will be valid until unmapped or * instance of this class is destroyed. */ void close(); /** * Retrieve file name of the file. * * @return file name */ const std::string & filename() const { return m_filename; } /** * Retrieve descriptor of the file. * * @return descriptor */ int fd() { return m_fd; } /** * Size of the mapping. * * @return mapped size */ size_t size() const { return m_mapsize; } /** * Pointer to the mapping. * * @return pointer to the mapping */ operator void *() { return m_mapptr; } /** * @overload */ operator const void *() const { return m_mapptr; } /** * Retrieve pcrecpp::StringPiece object for the mapped view. * * @return pcrecpp::StringPiece of the mapped view */ pcrecpp::StringPiece stringPiece(); protected: Type m_type; int m_fd; void *m_mapptr; size_t m_mapsize; std::string m_filename; }; #endif // INCL_SYNCEVOLUTION_TMPFILE syncevolution-1.5/src/syncevo/lcs.h0000644000373300001540000002120712326412403020724 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2010 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_SYNCEVOLUTION_LCS # define INCL_SYNCEVOLUTION_LCS #include #include #include // for size_t and ssize_t #include #include SE_BEGIN_CXX namespace LCS { enum Choice { /** default value for empty subsequences */ NONE, /** i,j pair matches in both subsequences */ MATCH, /** entry j is skipped in second sequence */ LEFT, /** entry i is skipped in first sequence */ UP }; /** * utility struct for the lcs algorithm: describes the optimal * solution for a subset of the full problem */ template struct Sub { /** how the algorithm decided for the last entries of each subsequence */ Choice choice; /** number of matched entries in subsequences */ size_t length; /** total cost for gaps */ C cost; }; template struct Entry { Entry(size_t i, size_t j, T e) : index_a(i), index_b(j), element(e) {} size_t index_a; size_t index_b; T element; }; template std::ostream &operator<<(std::ostream &out, const Entry &entry) { out << entry.index_a << ", " << entry.index_b << ": " << entry.element << std::endl; return out; } /** * accessor which reads from std::vector< std:pair< entry, cost > > */ template class accessor { public: typedef typename T::value_type::first_type F; typedef typename T::value_type::second_type C; /** * @param a container holding sequence of items as passed to lcs() * @param start index of first item in the gap, may be -1 * @param end index of the last item in the gap, may be one beyond end of sequence, always >= start * @return cost 0 for start == end, > 0 for start < end */ static C cost(const T &a, ssize_t start, size_t end) { return a.empty() ? 0 : ((end >= a.size() ? a[a.size() - 1].second : a[end].second) - (start < 0 ? a[0].second : a[start].second)); } /** * @param index valid index (>= 0, < a.size()) * @return entry at index */ static const F &entry_at(const T &a, size_t index) { return a[index].first; } }; /** * accessor which reads from an arbitrary random-access sequence, * using a zero cost function (to be used for original LCS) */ template class accessor_sequence { public: typedef typename T::value_type F; typedef unsigned char C; static C cost(const T &a, ssize_t start, size_t end) { return 0; } static const F &entry_at(const T &a, size_t index) { return a[index]; } }; /** * Calculates the longest common subsequence (LCS) of two * sequences stored in vectors. The result specifies the common * elements of that type and their positions in the two input * sequences and is stored in a output sequence. * * In contrast to the generic LCS algorithm from "Introduction * to Algorithms" (Cormen, Leiserson, Rivest), this extended * algorithm tries to pick "better" LCSes when more than one * exists. * * When the two sequences contain chunks of related entries, then * a "better" LCS is one where gaps go across less chunks. For * example, when "begin b end" is inserted in front of "begin a * end", then this LCS: * * begin | begin * > b * > end * > begin * a | a * end | end * * is worse than: * * > begin * > b * > end * begin | begin * a | a * end | end * * A monotonically increasing cost number has to be assigned to each * entry by the caller. The "cost" of a gap is calculated by * "substracting" the cost number at the beginning of the gap from the * cost number at the end. Both cost number and substraction are * template parameters. */ template void lcs(const T &a, const T &b, ITO out, A access) { // reserve two-dimensonal array for sub-problem solutions, // adding rows as we go typedef typename A::C C; std::vector< std::vector< Sub > > sub; sub.resize(a.size() + 1); for (size_t i = 0; i <= a.size(); i++) { sub[i].resize(b.size() + 1); for (size_t j = 0; j <= b.size(); j++) { if (i == 0 || j == 0) { sub[i][j].choice = NONE; sub[i][j].length = 0; sub[i][j].cost = 0; } else if (access.entry_at(a, i - 1) == access.entry_at(b, j - 1)) { Choice choice = MATCH; size_t length = sub[i-1][j-1].length + 1; C cost = sub[i-1][j-1].cost; C cost_left = sub[i][j-1].cost += access.cost(b, j-1, j); C cost_up = sub[i-1][j].cost += access.cost(a, i-1, i); /* * We may decide to not match at i,j if the * alternatives have the same length but lower * cost. Matching is the default. */ if (sub[i][j-1].length > sub[i-1][j].length && length == sub[i][j-1].length && cost > cost_left) { /* skipping j is cheaper */ choice = LEFT; cost = cost_left; } else if (sub[i][j-1].length < sub[i-1][j].length && length == sub[i-1][j].length && cost > cost_up) { /* skipping i is cheaper */ choice = UP; cost = cost_up; } else if (sub[i][j-1].length == sub[i-1][j].length && length == sub[i-1][j].length) { if (cost_left < cost_up) { choice = LEFT; cost = cost_left; } else { choice = UP; cost = cost_up; } } sub[i][j].choice = choice; sub[i][j].length = length; sub[i][j].cost = cost; } else if (sub[i][j-1].length > sub[i-1][j].length) { sub[i][j].choice = LEFT; sub[i][j].length = sub[i][j-1].length; sub[i][j].cost = sub[i][j-1].cost + access.cost(b, j-1, j); } else if (sub[i][j-1].length < sub[i-1][j].length) { sub[i][j].choice = UP; sub[i][j].length = sub[i-1][j].length; sub[i][j].cost = sub[i-1][j].cost + access.cost(a, i-1, i); } else { // tie: decide based on cost C cost_left = sub[i][j-1].cost += access.cost(b, j-1, j); C cost_up = sub[i-1][j].cost += access.cost(a, i-1, i); if (cost_left < cost_up) { sub[i][j].choice = LEFT; sub[i][j].length = sub[i][j-1].length; sub[i][j].cost = cost_left; } else { sub[i][j].choice = UP; sub[i][j].length = sub[i-1][j].length; sub[i][j].cost = cost_up; } } } } // copy result (using intermediate list instead of recursive function call) typedef std::list< std::pair > indexlist; std::list< std::pair > indices; size_t i = a.size(), j = b.size(); while (i > 0 && j > 0) { switch (sub[i][j].choice) { case MATCH: indices.push_front(std::make_pair(i, j)); i--; j--; break; case LEFT: j--; break; case UP: i--; break; case NONE: // not reached break; } } for (indexlist::iterator it = indices.begin(); it != indices.end(); it++) { *out++ = Entry(it->first, it->second, access.entry_at(a, it->first - 1)); } } } // namespace lcs SE_END_CXX #endif // INCL_SYNCEVOLUTION_LCS syncevolution-1.5/src/syncevo/lcs.cpp0000644000373300001540000001143412326412403021260 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX #ifdef ENABLE_UNIT_TESTS template void readlines(std::istream &in, IT out) { std::string line; while (std::getline(in, line)) { *out++ = line; } } /** * implements the assignment of EnumerateChunks */ template class EnumerateChunksProxy { public: EnumerateChunksProxy(const std::string &keyword, const IT &out, const C count) : m_keyword(keyword), m_out(out), m_count(count) {} EnumerateChunksProxy &operator=(const std::string &rhs) { if (!rhs.compare(0, m_keyword.size(), m_keyword)) { m_count++; } m_out = std::make_pair(rhs, m_count); return *this; } protected: std::string m_keyword; IT m_out; C m_count; }; /** * Output iterator which identifies related chunks * by incrementing a running count each time a certain * keyword is found at the beginning of the line. * Writes the line,count pair to another output * iterator. */ template class EnumerateChunks : private EnumerateChunksProxy { public: EnumerateChunks(const std::string &keyword, const IT &out, const C count) : EnumerateChunksProxy(keyword, out, count) {} EnumerateChunksProxy &operator*() { return *this; } EnumerateChunks &operator++() { this->m_out++; return *this; } EnumerateChunks &operator++(int) { ++this->m_out; return *this; } }; template class EnumerateChunks make_enumerate_chunks(const std::string &keyword, IT out, C count) { return EnumerateChunks(keyword, out, count); } class LCSTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(LCSTest); CPPUNIT_TEST(lcs); CPPUNIT_TEST_SUITE_END(); public: void lcs() { std::ifstream file1("testcases/lcs/file1.txt"); std::ifstream file2("testcases/lcs/file2.txt"); typedef std::vector< std::pair > content; content content1, content2; readlines(file1, make_enumerate_chunks("begin", std::back_inserter(content1), 0)); readlines(file2, make_enumerate_chunks("begin", std::back_inserter(content2), 0)); std::vector< LCS::Entry > result; LCS::lcs(content1, content2, std::back_inserter(result), LCS::accessor()); std::ostringstream out; std::copy(result.begin(), result.end(), std::ostream_iterator< LCS::Entry >(out)); CPPUNIT_ASSERT_EQUAL(std::string("1, 4: begin\n" "2, 5: item1\n" "3, 6: end\n"), out.str()); CPPUNIT_ASSERT_EQUAL((size_t)3, result.size()); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(LCSTest); #ifdef MAIN int main(int argc, char **argv) { if (argc != 3) { std::cerr << "Usage: lcs file1 file2" << std::endl; return 1; } std::ifstream file1(argv[1]); std::ifstream file2(argv[2]); typedef std::vector< std::pair > content; content content1, content2; readlines(file1, make_enumerate_chunks("begin", std::back_inserter(content1), 0)); readlines(file2, make_enumerate_chunks("begin", std::back_inserter(content2), 0)); std::vector< LCS::Entry > result; LCS::lcs(content1, content2, std::back_inserter(result), LCS::accessor()); std::copy(result.begin(), result.end(), std::ostream_iterator< LCS::Entry >(std::cout)); std::cout << "Length: " << result.size() << std::endl; return 0; } #endif // MAIN #endif // ENABLE_UNIT_TESTS SE_END_CXX syncevolution-1.5/src/syncevo/ForkExec.cpp0000664000373300001540000006411012330727742022220 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "ForkExec.h" #include #include #if defined(HAVE_GLIB) #include #include #include #include #include "test.h" SE_BEGIN_CXX static const std::string ForkExecEnvVar("SYNCEVOLUTION_FORK_EXEC="); static const std::string ForkExecInstanceEnvVar("SYNCEVOLUTION_FORK_EXEC_INSTANCE="); #ifndef GDBUS_CXX_HAVE_DISCONNECT // internal D-Bus API: only used to monitor parent by having one method call pending static const std::string FORKEXEC_PARENT_PATH("/org/syncevolution/forkexec/parent"); static const std::string FORKEXEC_PARENT_IFACE("org.syncevolution.forkexec.parent"); static const std::string FORKEXEC_PARENT_DESTINATION = "direct.peer"; // doesn't matter, routing is off /** * The only purpose is to accept method calls and never reply. * When the parent destructs or gets killed, the caller (= child) * will notice because the method call fails, which ForkExecChild * translates into a "parent died" signal. */ class ForkExecParentDBusAPI : public GDBusCXX::DBusObjectHelper { public: /** * @param instance a unique string to distinguish multiple different ForkExecParent * instances; necessary because otherwise GIO GDBus may route messages from * one connection to older instances on other connections */ ForkExecParentDBusAPI(const GDBusCXX::DBusConnectionPtr &conn, const std::string &instance) : GDBusCXX::DBusObjectHelper(conn, FORKEXEC_PARENT_PATH + "/" + instance, FORKEXEC_PARENT_IFACE) { add(this, &ForkExecParentDBusAPI::watch, "Watch"); activate(); } ~ForkExecParentDBusAPI() { SE_LOG_DEBUG(NULL, "ForkExecParentDBusAPI %s: destroying with %ld active watches", getPath(), (long)m_watches.size()); } bool hasWatches() const { return !m_watches.empty(); } private: void watch(const boost::shared_ptr< GDBusCXX::Result0> &result) { SE_LOG_DEBUG(NULL, "ForkExecParentDBusAPI %s: received 'Watch' method call from child", getPath()); m_watches.push_back(result); } std::list< boost::shared_ptr< GDBusCXX::Result0> > m_watches; }; #endif // GDBUS_CXX_HAVE_DISCONNECT ForkExec::ForkExec() { } static Mutex ForkExecMutex; static unsigned int ForkExecCount; ForkExecParent::ForkExecParent(const std::string &helper, const std::vector &args) : m_helper(helper), m_args(args), m_childPid(0), m_hasConnected(false), m_hasQuit(false), m_status(0), m_sigIntSent(false), m_sigTermSent(false), m_mergedStdoutStderr(false), m_out(NULL), m_err(NULL), m_outID(0), m_errID(0), m_watchChild(NULL) { Mutex::Guard guard = ForkExecMutex.lock(); ForkExecCount++; m_instance = StringPrintf("forkexec%u", ForkExecCount); } boost::shared_ptr ForkExecParent::create(const std::string &helper, const std::vector &args) { boost::shared_ptr forkexec(new ForkExecParent(helper, args)); return forkexec; } ForkExecParent::~ForkExecParent() { if (m_outID) { g_source_remove(m_outID); } if (m_errID) { g_source_remove(m_errID); } if (m_out) { g_io_channel_unref(m_out); } if (m_err) { g_io_channel_unref(m_err); } if (m_watchChild) { // stop watching g_source_destroy(m_watchChild); g_source_unref(m_watchChild); } if (m_childPid) { g_spawn_close_pid(m_childPid); } #ifndef GDBUS_CXX_HAVE_DISCONNECT if (m_api) { SE_LOG_DEBUG(NULL, "ForkExecParent: shutting down, telling %s %ld that it lost the connection, it %s", m_helper.c_str(), (long)m_childPid, m_api->hasWatches() ? "is watching" : "is not watching"); m_api.reset(); } #endif } /** * Redirect stdout to stderr. * * Child setup function, called insided forked process before exec(). * only async-signal-safe functions allowed according to http://developer.gnome.org/glib/2.30/glib-Spawning-Processes.html#GSpawnChildSetupFunc */ void ForkExecParent::forked(gpointer data) throw() { ForkExecParent *me = static_cast(data); // When debugging, undo the LogRedirect output redirection that // we inherited from the parent process. That ensures that // any output is printed directly, instead of going through // the parent's output processing in LogRedirect. if (getenv("SYNCEVOLUTION_DEBUG")) { LogRedirect::removeRedirect(); } if (me->m_mergedStdoutStderr) { dup2(STDERR_FILENO, STDOUT_FILENO); } } void ForkExecParent::start() { if (m_watchChild) { SE_THROW("child already started"); } // boost::shared_ptr me = ...; GDBusCXX::DBusErrorCXX dbusError; SE_LOG_DEBUG(NULL, "ForkExecParent: preparing for child process %s", m_helper.c_str()); m_server = GDBusCXX::DBusServerCXX::listen(boost::bind(&ForkExecParent::newClientConnection, this, _2), &dbusError); if (!m_server) { dbusError.throwFailure("starting server"); } // look for helper binary std::string helper; GSpawnFlags flags = G_SPAWN_DO_NOT_REAP_CHILD; if (m_helper.find('/') == m_helper.npos) { helper = getEnv("SYNCEVOLUTION_LIBEXEC_DIR", ""); if (helper.empty()) { // env variable not set, look in libexec dir helper = SYNCEVO_LIBEXEC; helper += "/"; helper += m_helper; if (access(helper.c_str(), R_OK)) { // some error, try PATH flags = (GSpawnFlags)(flags | G_SPAWN_SEARCH_PATH); helper = m_helper; } } else { // use env variable without further checks, must work helper += "/"; helper += m_helper; } } else { // absolute path, use it helper = m_helper; } m_argvStrings.push_back(helper); m_argvStrings.insert(m_argvStrings.end(), m_args.begin(), m_args.end()); m_argv.reset(AllocStringArray(m_argvStrings)); for (char **env = environ; *env; env++) { if (!boost::starts_with(*env, ForkExecEnvVar) && !boost::starts_with(*env, ForkExecInstanceEnvVar)) { m_envStrings.push_back(*env); } } // pass D-Bus address via env variable m_envStrings.push_back(ForkExecEnvVar + m_server->getAddress()); m_envStrings.push_back(ForkExecInstanceEnvVar + getInstance()); m_env.reset(AllocStringArray(m_envStrings)); SE_LOG_DEBUG(NULL, "ForkExecParent: running %s with D-Bus address %s", helper.c_str(), m_server->getAddress().c_str()); // Check which kind of output redirection is wanted. m_mergedStdoutStderr = !m_onOutput.empty(); if (!m_onOutput.empty()) { m_mergedStdoutStderr = true; } GErrorCXX gerror; int err = -1, out = -1; if (!g_spawn_async_with_pipes(NULL, // working directory static_cast(m_argv.get()), static_cast(m_env.get()), (GSpawnFlags)(flags | G_SPAWN_LEAVE_DESCRIPTORS_OPEN), // child setup function: redirect stdout to stderr, undo LogRedirect forked, this, &m_childPid, NULL, // set stdin to /dev/null (m_mergedStdoutStderr || m_onStdout.empty()) ? NULL : &out, (m_mergedStdoutStderr || !m_onStderr.empty()) ? &err : NULL, gerror)) { m_childPid = 0; gerror.throwError(SE_HERE, "spawning child"); } // set up output redirection, ignoring failures setupPipe(m_err, m_errID, err); setupPipe(m_out, m_outID, out); SE_LOG_DEBUG(NULL, "ForkExecParent: child process for %s has pid %ld", helper.c_str(), (long)m_childPid); // TODO: introduce C++ wrapper around GSource m_watchChild = g_child_watch_source_new(m_childPid); g_source_set_callback(m_watchChild, (GSourceFunc)watchChildCallback, this, NULL); g_source_attach(m_watchChild, NULL); } void ForkExecParent::setupPipe(GIOChannel *&channel, guint &sourceID, int fd) { if (fd == -1) { // nop return; } // Other program executed by us shall not inherit a copy of this // file descriptor. fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); channel = g_io_channel_unix_new(fd); if (!channel) { // failure SE_LOG_DEBUG(NULL, "g_io_channel_unix_new() returned NULL"); close(fd); return; } // Close fd when freeing the channel (done by caller). g_io_channel_set_close_on_unref(channel, true); // Don't block in outputReady(). GErrorCXX error; g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, error); // We assume that the helper is writing data in the same encoding // and thus avoid any kind of conversion. Necessary to avoid // buffering. error.clear(); g_io_channel_set_encoding(channel, NULL, error); g_io_channel_set_buffered(channel, true); sourceID = g_io_add_watch(channel, (GIOCondition)(G_IO_IN|G_IO_ERR|G_IO_HUP), outputReady, this); } gboolean ForkExecParent::outputReady(GIOChannel *source, GIOCondition condition, gpointer data) throw () { bool cont = true; try { ForkExecParent *me = static_cast(data); gchar *buffer = NULL; gsize length = 0; GErrorCXX error; // Try reading, even if the condition wasn't G_IO_IN. GIOStatus status = g_io_channel_read_to_end(source, &buffer, &length, error); if (buffer && length) { if (source == me->m_out) { me->m_onStdout(buffer, length); } else if (me->m_mergedStdoutStderr) { me->m_onOutput(buffer, length); } else { me->m_onStderr(buffer, length); } } if (status == G_IO_STATUS_EOF || (condition & (G_IO_HUP|G_IO_ERR)) || error) { SE_LOG_DEBUG(NULL, "reading helper %s %ld done: %s", source == me->m_out ? "stdout" : me->m_mergedStdoutStderr ? "combined stdout/stderr" : "stderr", (long)me->m_childPid, (const char *)error); // Will remove event source from main loop. cont = false; // Free channel and forget source tag (source will be freed // by caller when we return false). if (source == me->m_out) { me->m_out = NULL; me->m_outID = 0; } else { me->m_err = NULL; me->m_errID = 0; } g_io_channel_unref(source); // Send delayed OnQuit signal now? me->checkCompletion(); } // If an exception skips this, we are going to die, in // which case we don't care about the leak. g_free(buffer); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } return cont; } void ForkExecParent::watchChildCallback(GPid pid, gint status, gpointer data) throw() { ForkExecParent *me = static_cast(data); me->m_hasQuit = true; me->m_status = status; me->checkCompletion(); } void ForkExecParent::checkCompletion() throw () { if (m_hasQuit && !m_out && !m_err) { try { m_onQuit(m_status); if (!m_hasConnected || m_status != 0) { SE_LOG_DEBUG(NULL, "ForkExecParent: child %ld was signaled %s, signal %d (SIGINT=%d, SIGTERM=%d), int sent %s, term sent %s", (long)m_childPid, WIFSIGNALED(m_status) ? "yes" : "no", WTERMSIG(m_status), SIGINT, SIGTERM, m_sigIntSent ? "yes" : "no", m_sigTermSent ? "yes" : "no"); if (WIFSIGNALED(m_status) && ((WTERMSIG(m_status) == SIGINT && m_sigIntSent) || (WTERMSIG(m_status) == SIGTERM && m_sigTermSent))) { // not an error when the child dies because we killed it return; } if (WIFSIGNALED(m_status) && WTERMSIG(m_status) == SIGKILL && m_sigTermSent) { // This started to happen on Debian Testing after the Wheezy release: // everything seems to shut down normally, and yet the exit status // of the helper shows SIGKILL instead of SIGTERM as the reason for // quitting. valgrind is involved, too. Not sure where this new (?) // behavior comes from. It seems to be harmless, so accept that // additional exit code without complaining (which would break unit // testing). SE_LOG_DEBUG(NULL, "ForkExecParent: ignoring unexpected exit signal SIGKILL of child %ld", (long)m_childPid); return; } std::string error = "child process quit"; if (!m_hasConnected) { error += " unexpectedly"; } if (WIFEXITED(m_status)) { error += StringPrintf(" with return code %d", WEXITSTATUS(m_status)); } else if (WIFSIGNALED(m_status)) { error += StringPrintf(" because of signal %d", WTERMSIG(m_status)); } else { error += " for unknown reasons"; } SE_LOG_ERROR(NULL, "%s", error.c_str()); m_onFailure(STATUS_FATAL, error); } } catch (...) { std::string explanation; SyncMLStatus status = Exception::handle(explanation); try { m_onFailure(status, explanation); } catch (...) { Exception::handle(); } } } } void ForkExecParent::newClientConnection(GDBusCXX::DBusConnectionPtr &conn) throw() { try { SE_LOG_DEBUG(NULL, "ForkExecParent: child %s %ld has connected", m_helper.c_str(), (long)m_childPid); m_hasConnected = true; #ifndef GDBUS_CXX_HAVE_DISCONNECT m_api.reset(new ForkExecParentDBusAPI(conn, getInstance())); #endif m_onConnect(conn); dbus_bus_connection_undelay(conn); } catch (...) { std::string explanation; SyncMLStatus status = Exception::handle(explanation); try { m_onFailure(status, explanation); } catch (...) { Exception::handle(); } } } void ForkExecParent::addEnvVar(const std::string &name, const std::string &value) { if(!name.empty()) { m_envStrings.push_back(name + "=" + value); } } void ForkExecParent::stop(int signal) { if (!m_childPid || m_hasQuit) { // not running, nop return; } SE_LOG_DEBUG(NULL, "ForkExecParent: killing %s %ld with signal %d (%s %s)", m_helper.c_str(), (long)m_childPid, signal, (!signal || signal == SIGINT) ? "SIGINT" : "", (!signal || signal == SIGTERM) ? "SIGTERM" : ""); if (!signal || signal == SIGINT) { ::kill(m_childPid, SIGINT); m_sigIntSent = true; } if (!signal || signal == SIGTERM) { ::kill(m_childPid, SIGTERM); m_sigTermSent = true; } if (signal && signal != SIGINT && signal != SIGTERM) { ::kill(m_childPid, signal); } } void ForkExecParent::kill() { if (!m_childPid || m_hasQuit) { // not running, nop return; } SE_LOG_DEBUG(NULL, "ForkExecParent: killing %s %ld with SIGKILL", m_helper.c_str(), (long)m_childPid); ::kill(m_childPid, SIGKILL); #ifndef GDBUS_CXX_HAVE_DISCONNECT // Cancel the pending method call from the child to us. This will // send an error reply to the child, which it'll treat as // "connection lost". if (m_api) { SE_LOG_DEBUG(NULL, "ForkExecParent: telling %s %ld that it lost the connection, it %s", m_helper.c_str(), (long)m_childPid, m_api->hasWatches() ? "is watching" : "is not watching"); m_api.reset(); } #endif } ForkExecChild::ForkExecChild() : m_state(IDLE) { m_instance = getEnv(ForkExecInstanceEnvVar.substr(0, ForkExecInstanceEnvVar.size() - 1).c_str(), ""); } boost::shared_ptr ForkExecChild::create() { boost::shared_ptr forkexec(new ForkExecChild); return forkexec; } void ForkExecChild::connect() { // set error state, clear it later m_state = DISCONNECTED; const char *address = getParentDBusAddress(); if (!address) { SE_THROW("cannot connect to parent, was not forked"); } SE_LOG_DEBUG(NULL, "ForkExecChild: connecting to parent with D-Bus address %s", address); GDBusCXX::DBusErrorCXX dbusError; GDBusCXX::DBusConnectionPtr conn = dbus_get_bus_connection(address, &dbusError); if (!conn) { dbusError.throwFailure("connecting to server"); } m_state = CONNECTED; // start watching connection #ifdef GDBUS_CXX_HAVE_DISCONNECT conn.setDisconnect(boost::bind(&ForkExecChild::connectionLost, this)); #else // emulate disconnect with a pending method call class Parent : public GDBusCXX::DBusRemoteObject { public: Parent(const GDBusCXX::DBusConnectionPtr &conn, const std::string &instance) : GDBusCXX::DBusRemoteObject(conn, FORKEXEC_PARENT_PATH + "/" + instance, FORKEXEC_PARENT_IFACE, FORKEXEC_PARENT_DESTINATION), m_watch(*this, "Watch") {} GDBusCXX::DBusClientCall0 m_watch; } parent(conn, getInstance()); parent.m_watch.start(boost::bind(&ForkExecChild::connectionLost, this)); #endif m_onConnect(conn); dbus_bus_connection_undelay(conn); } void ForkExecChild::connectionLost() { SE_LOG_DEBUG(NULL, "lost connection to parent"); m_state = DISCONNECTED; m_onQuit(); } bool ForkExecChild::wasForked() { return getParentDBusAddress() != NULL; } const char *ForkExecChild::getParentDBusAddress() { return getenv(ForkExecEnvVar.substr(0, ForkExecEnvVar.size() - 1).c_str()); } #ifdef ENABLE_UNIT_TESTS /** * Assumes that /bin/[false/true/echo] exist and that "env" is in the * path. Currently this does not cover actual D-Bus connection * handling and usage. */ class ForkExecTest : public CppUnit::TestFixture { public: void setUp() { m_statusValid = false; m_status = 0; } private: CPPUNIT_TEST_SUITE(ForkExecTest); CPPUNIT_TEST(testTrue); CPPUNIT_TEST(testFalse); CPPUNIT_TEST(testPath); CPPUNIT_TEST(testNotFound); CPPUNIT_TEST(testEnv1); CPPUNIT_TEST(testEnv2); CPPUNIT_TEST(testOutErr); CPPUNIT_TEST(testMerged); CPPUNIT_TEST_SUITE_END(); bool m_statusValid; int m_status; void hasQuit(int status) { m_status = status; m_statusValid = true; } static void append(const char *buffer, size_t length, std::string &all) { all.append(buffer, length); } boost::shared_ptr create(const std::string &helper) { boost::shared_ptr parent(ForkExecParent::create(helper)); parent->m_onQuit.connect(boost::bind(&ForkExecTest::hasQuit, this, _1)); return parent; } void testTrue() { boost::shared_ptr parent(create("/bin/true")); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(0, WEXITSTATUS(m_status)); } void testFalse() { boost::shared_ptr parent(create("/bin/false")); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(1, WEXITSTATUS(m_status)); } void testPath() { boost::shared_ptr parent(create("true")); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(0, WEXITSTATUS(m_status)); } void testNotFound() { boost::shared_ptr parent(create("no-such-binary")); std::string out; std::string err; parent->m_onStdout.connect(boost::bind(append, _1, _2, boost::ref(out))); parent->m_onStderr.connect(boost::bind(append, _1, _2, boost::ref(err))); try { parent->start(); } catch (const SyncEvo::Exception &ex) { if (strstr(ex.what(), "spawning child: ")) { // glib itself detected that binary wasn't found. This // is what normally happens, but there's no guarantee, // thus the code below... return; } throw; } while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(1, WEXITSTATUS(m_status)); CPPUNIT_ASSERT_EQUAL(std::string(""), out); CPPUNIT_ASSERT_MESSAGE(err, err.find("no-such-binary") != err.npos); } void testEnv1() { boost::shared_ptr parent(create("env")); parent->addEnvVar("FORK_EXEC_TEST_ENV", "foobar"); std::string out; parent->m_onStdout.connect(boost::bind(append, _1, _2, boost::ref(out))); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(0, WEXITSTATUS(m_status)); CPPUNIT_ASSERT_MESSAGE(out, out.find("FORK_EXEC_TEST_ENV=foobar\n") != out.npos); } void testEnv2() { boost::shared_ptr parent(create("env")); parent->addEnvVar("FORK_EXEC_TEST_ENV1", "foo"); parent->addEnvVar("FORK_EXEC_TEST_ENV2", "bar"); std::string out; parent->m_onStdout.connect(boost::bind(append, _1, _2, boost::ref(out))); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(0, WEXITSTATUS(m_status)); CPPUNIT_ASSERT_MESSAGE(out, out.find("FORK_EXEC_TEST_ENV1=foo\n") != out.npos); CPPUNIT_ASSERT_MESSAGE(out, out.find("FORK_EXEC_TEST_ENV2=bar\n") != out.npos); } void testOutErr() { // This tests uses a trick to get output via stdout (normal // env output) and stderr (from ld.so). boost::shared_ptr parent(create("env")); parent->addEnvVar("FORK_EXEC_TEST_ENV", "foobar"); parent->addEnvVar("LD_DEBUG", "files"); std::string out; std::string err; parent->m_onStdout.connect(boost::bind(append, _1, _2, boost::ref(out))); parent->m_onStderr.connect(boost::bind(append, _1, _2, boost::ref(err))); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(0, WEXITSTATUS(m_status)); CPPUNIT_ASSERT_MESSAGE(out, out.find("FORK_EXEC_TEST_ENV=foobar\n") != out.npos); CPPUNIT_ASSERT_MESSAGE(err, err.find("transferring control: ") != err.npos); } void testMerged() { // This tests uses a trick to get output via stdout (normal // env output) and stderr (from ld.so). boost::shared_ptr parent(create("env")); parent->addEnvVar("FORK_EXEC_TEST_ENV", "foobar"); parent->addEnvVar("LD_DEBUG", "files"); std::string output; parent->m_onOutput.connect(boost::bind(append, _1, _2, boost::ref(output))); parent->start(); while (!m_statusValid) { g_main_context_iteration(NULL, true); } CPPUNIT_ASSERT(WIFEXITED(m_status)); CPPUNIT_ASSERT_EQUAL(0, WEXITSTATUS(m_status)); // output from ld.so directly followed by env output CPPUNIT_ASSERT_MESSAGE(output, pcrecpp::RE("transferring control:.*\\n(\\s+\\d+:.*\\n)*[A-Za-z0-9_]+=.*\\n").PartialMatch(output)); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(ForkExecTest); #endif SE_END_CXX #endif // HAVE_GLIB syncevolution-1.5/src/syncevo/ForkExec.h0000644000373300001540000002364012326412403021654 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_FORK_EXEC # define INCL_FORK_EXEC #ifdef HAVE_CONFIG_H # include "config.h" #endif #if defined(HAVE_GLIB) #include #include #include #include "gdbus-cxx-bridge.h" #include SE_BEGIN_CXX #ifndef GDBUS_CXX_HAVE_DISCONNECT class ForkExecParentDBusAPI; #endif /** * Utility class which starts a specific helper binary in a second * process. The helper binary is identified via its base name like * "syncevo-dbus-helper", exact location is then determined * automatically, or via an absolute path. * * Direct D-Bus communication is set up automatically. For this to * work, the helper must use ForkExecChild::connect(). To debug this * when using GIO DBus, set G_DBUS_DEBUG=message. * * There are more options mentioned here: * http://developer.gnome.org/gio/unstable/ch03.html * * Progress (like "client connected") and failures ("client disconnected") * are reported via boost::signal2 signals. To make progess, the user of * this class must run a glib event loop in the default context. * * Note that failures encountered inside the class methods themselves * will be reported via exceptions. Only asynchronous errors encountered * inside the event loop are reported via the failure signal. * * Slots connected to the signals may throw exceptions. They will be * propagated up to the caller when ForkExec methods were called directly. * When thrown inside the event loop, the exception will be logged and * then reported via the onFailure signal. */ class ForkExec : private boost::noncopyable { public: /** * Called when the D-Bus connection is up and running. It is ready * to register objects that the peer might need. It is * guaranteed that any objects registered now will be ready before * the helper gets a chance to make D-Bus calls. */ typedef boost::signals2::signal OnConnect; OnConnect m_onConnect; /** * Called when an exception cannot be propagated up to the caller * because it was thrown inside the event loop, or when some other * kind of failure is encountered which cannot be reported via some * other means. The original problem is already logged when * onFailure is invoked, so further logging should not be done unless * it adds new information. * * Bad results of asynchronous method calls are reported via the * result callback of the method, not via onFailure. * * When a failure occurs, the peer should be considered dead and * the connection to it should be shut down (if any had been * established at all). * * When the child quits before establishing a connection or quits * with a non-zero return code, onFailure will be called. That way * a user of ForkExecParent doesn't have to connect to onQuit. */ typedef boost::signals2::signal OnFailure; OnFailure m_onFailure; /** * A unique string for the ForkExecParent/Child pair which can be used * as D-Bus path component. */ std::string getInstance() const { return m_instance; } protected: ForkExec(); std::string m_instance; }; /** * The parent side of a fork/exec. */ class ForkExecParent : public ForkExec { public: ~ForkExecParent(); /** * A ForkExecParent instance must be created via this factory * method and then be tracked in a shared pointer. This method * will not start the helper yet: first connect your slots, then * call start(). */ static boost::shared_ptr create(const std::string &helper, const std::vector &args = std::vector()); /** * the helper string passed to create() */ std::string getHelper() const { return m_helper; } /** * run the helper executable in the parent process */ void start(); /** * request that the child process terminates by sending it a * SIGINT and/or SIGTERM * @param signal if zero (default), send both signals, otherwise * the specified one */ void stop(int signal = 0); /** * kill the child process without giving it a chance to shut down * by sending it a SIGKILL */ void kill(); /** * Called when the helper has quit. The parameter of the signal is * the return status of the helper (see waitpid()). If output * redirection is active, then this signal will only be invoked * after processing all output. */ typedef boost::signals2::signal OnQuit; OnQuit m_onQuit; /** * Called when output from the helper is available. The buffer is * guaranteed to be nul-terminated with a byte that is not * included in the size. * * Register slots *before* calling start(), because output * redirection of the helper will only be done if someone is * waiting for it. If m_onOutput has a slot, then both stderr and * stdout are redirected into the same stream and only m_onOutput * will be invoked. */ typedef boost::signals2::signal OnOutput; OnOutput m_onOutput; OnOutput m_onStdout; OnOutput m_onStderr; enum State { IDLE, /**< instance constructed, but start() not called yet */ STARTING, /**< start() called */ CONNECTED, /**< child has connected, D-Bus connection established */ TERMINATED /**< child has quit */ }; State getState() { return m_hasQuit ? TERMINATED : m_hasConnected ? CONNECTED : m_watchChild ? STARTING : IDLE; } /** * Get the childs pid. This can be used as a unique id common to * both parent and child. */ int getChildPid() { return static_cast(m_childPid); } /** * Simply pushes a new environment variable onto m_envStrings. */ void addEnvVar(const std::string &name, const std::string &value); private: ForkExecParent(const std::string &helper, const std::vector &args); std::string m_helper; std::vector m_args; boost::shared_ptr m_server; boost::scoped_array m_argv; std::list m_argvStrings; boost::scoped_array m_env; std::list m_envStrings; GPid m_childPid; bool m_hasConnected; bool m_hasQuit; gint m_status; bool m_sigIntSent; bool m_sigTermSent; #ifndef GDBUS_CXX_HAVE_DISCONNECT boost::scoped_ptr m_api; #endif /** invoke m_onOutput while reading from a single stream */ bool m_mergedStdoutStderr; GIOChannel *m_out, *m_err; guint m_outID, m_errID; GSource *m_watchChild; static void watchChildCallback(GPid pid, gint status, gpointer data) throw(); void newClientConnection(GDBusCXX::DBusConnectionPtr &conn) throw(); void setupPipe(GIOChannel *&channel, guint &sourceID, int fd); static gboolean outputReady(GIOChannel *source, GIOCondition condition, gpointer data) throw (); void checkCompletion() throw (); static void forked(gpointer me) throw(); }; /** * The child side of a fork/exec. * * At the moment, the child cannot monitor the parent or kill it. * Might be added (if needed), in which case the corresponding * ForkExecParent members should be moved to the common ForkExec. */ class ForkExecChild : public ForkExec { public: /** * A ForkExecChild instance must be created via this factory * method and then be tracked in a shared pointer. The process * must have been started by ForkExecParent (directly or indirectly) * and any environment variables set by ForkExecParent must still * be set. */ static boost::shared_ptr create(); /** * Initiates connection to parent, connect to ForkExec::m_onConnect * before calling this function to be notified of success and * ForkExec::m_onFailure for failures. * * m_onConnect is guaranteed to be called before message processing * starts. It's the right place to add objects to the bus that are * expected by the parent. */ void connect(); /** * Called when the parent has quit. */ typedef boost::signals2::signal OnQuit; OnQuit m_onQuit; enum State { IDLE, /**< created, connect() not called yet */ CONNECTING, /**< connect() called but no connection yet */ CONNECTED, /**< connection established */ DISCONNECTED /**< lost connection or failed to establish it */ }; State getState() const { return m_state; } /** * true if the current process was created by ForkExecParent */ static bool wasForked(); private: ForkExecChild(); static const char *getParentDBusAddress(); void connectionLost(); State m_state; }; SE_END_CXX #endif // HAVE_GLIB #endif // INCL_FORK_EXEC syncevolution-1.5/src/syncevo/Cmdline.cpp0000664000373300001540000066270612405555067022106 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include "test.h" #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include #include #include #include #include #include #include #include #include #include using namespace std; SE_BEGIN_CXX // synopsis and options char strings #include "CmdlineHelp.c" Cmdline::Cmdline(int argc, const char * const * argv) : m_argc(argc), m_argv(argv), m_validSyncProps(SyncConfig::getRegistry()), m_validSourceProps(SyncSourceConfig::getRegistry()) {} Cmdline::Cmdline(const vector &args) : m_args(args), m_validSyncProps(SyncConfig::getRegistry()), m_validSourceProps(SyncSourceConfig::getRegistry()) { m_argc = args.size(); m_argvArray.reset(new const char *[args.size()]); for(int i = 0; i < m_argc; i++) { m_argvArray[i] = m_args[i].c_str(); } m_argv = m_argvArray.get(); } Cmdline::Cmdline(const char *arg, ...) : m_validSyncProps(SyncConfig::getRegistry()), m_validSourceProps(SyncSourceConfig::getRegistry()) { va_list argList; va_start(argList, arg); for (const char *curr = arg; curr; curr = va_arg(argList, const char *)) { m_args.push_back(curr); } va_end(argList); m_argc = m_args.size(); m_argvArray.reset(new const char *[m_args.size()]); for (int i = 0; i < m_argc; i++) { m_argvArray[i] = m_args[i].c_str(); } m_argv = m_argvArray.get(); } bool Cmdline::parse() { vector parsed; return parse(parsed); } /** * Detects "--sync foo", "--sync=foo", "-s foo". */ static bool IsKeyword(const std::string &arg, const char *longWord, const char *shortWord) { return boost::istarts_with(arg, std::string(longWord) + "=") || boost::iequals(arg, longWord) || boost::iequals(arg, shortWord); } bool Cmdline::parse(vector &parsed) { parsed.clear(); if (m_argc) { parsed.push_back(m_argv[0]); } m_delimiter = "\n\n"; // All command line options which ask for a specific operation, // like --restore, --print-config, ... Used to detect conflicting // operations. vector operations; int opt = 1; bool ok; while (opt < m_argc) { parsed.push_back(m_argv[opt]); if (boost::iequals(m_argv[opt], "--")) { // separator between options and : // swallow it and leave option parsing opt++; break; } if (m_argv[opt][0] != '-') { if (strchr(m_argv[opt], '=')) { // property assignment if (!parseProp(UNKNOWN_PROPERTY_TYPE, NULL, m_argv[opt], NULL)) { return false; } else { opt++; continue; } } else { break; } } if (IsKeyword(m_argv[opt], "--sync", "-s")) { if (!parseAssignment(opt, parsed, SOURCE_PROPERTY_TYPE, "sync", NULL)) { return false; } // disable requirement to add --run explicitly in order to // be compatible with traditional command lines m_run = true; } else if (IsKeyword(m_argv[opt], "--keyring", "-k")) { if (!parseAssignment(opt, parsed, SYNC_PROPERTY_TYPE, "keyring", "true")) { return false; } } else if(boost::iequals(m_argv[opt], "--sync-property") || boost::iequals(m_argv[opt], "-y")) { opt++; if (!parseProp(SYNC_PROPERTY_TYPE, m_argv[opt - 1], opt == m_argc ? NULL : m_argv[opt])) { return false; } parsed.push_back(m_argv[opt]); } else if(boost::iequals(m_argv[opt], "--source-property") || boost::iequals(m_argv[opt], "--datastore-property") || boost::iequals(m_argv[opt], "-z")) { opt++; if (!parseProp(SOURCE_PROPERTY_TYPE, m_argv[opt - 1], opt == m_argc ? NULL : m_argv[opt])) { return false; } parsed.push_back(m_argv[opt]); }else if(boost::iequals(m_argv[opt], "--template") || boost::iequals(m_argv[opt], "-l")) { opt++; if (opt >= m_argc) { usage(false, string("missing parameter for ") + cmdOpt(m_argv[opt - 1])); return false; } parsed.push_back(m_argv[opt]); m_template = m_argv[opt]; m_configure = true; string temp = boost::trim_copy (m_template); if (temp.find ("?") == 0){ m_printTemplates = true; m_dontrun = true; m_template = temp.substr (1); } } else if(boost::iequals(m_argv[opt], "--print-databases")) { operations.push_back(m_argv[opt]); m_printDatabases = true; } else if(boost::iequals(m_argv[opt], "--create-database")) { operations.push_back(m_argv[opt]); m_createDatabase = true; } else if(boost::iequals(m_argv[opt], "--remove-database")) { operations.push_back(m_argv[opt]); m_removeDatabase = true; } else if(boost::iequals(m_argv[opt], "--print-servers") || boost::iequals(m_argv[opt], "--print-peers") || boost::iequals(m_argv[opt], "--print-configs")) { operations.push_back(m_argv[opt]); m_printServers = true; } else if(boost::iequals(m_argv[opt], "--print-config") || boost::iequals(m_argv[opt], "-p")) { operations.push_back(m_argv[opt]); m_printConfig = true; } else if(boost::iequals(m_argv[opt], "--print-sessions")) { operations.push_back(m_argv[opt]); m_printSessions = true; } else if(boost::iequals(m_argv[opt], "--configure") || boost::iequals(m_argv[opt], "-c")) { operations.push_back(m_argv[opt]); m_configure = true; } else if(boost::iequals(m_argv[opt], "--remove")) { operations.push_back(m_argv[opt]); m_remove = true; } else if(boost::iequals(m_argv[opt], "--run") || boost::iequals(m_argv[opt], "-r")) { operations.push_back(m_argv[opt]); m_run = true; } else if(boost::iequals(m_argv[opt], "--restore")) { operations.push_back(m_argv[opt]); opt++; if (opt >= m_argc) { usage(false, string("missing parameter for ") + cmdOpt(m_argv[opt - 1])); return false; } m_restore = m_argv[opt]; if (m_restore.empty()) { usage(false, string("missing parameter for ") + cmdOpt(m_argv[opt - 1])); return false; } //if can't convert it successfully, it's an invalid path if (!relToAbs(m_restore)) { usage(false, string("parameter '") + m_restore + "' for " + cmdOpt(m_argv[opt - 1]) + " must be log directory"); return false; } parsed.push_back(m_restore); } else if(boost::iequals(m_argv[opt], "--before")) { m_before = true; } else if(boost::iequals(m_argv[opt], "--after")) { m_after = true; } else if (boost::iequals(m_argv[opt], "--print-items")) { operations.push_back(m_argv[opt]); m_printItems = m_accessItems = true; } else if ((boost::iequals(m_argv[opt], "--export") && (m_export = true)) || (boost::iequals(m_argv[opt], "--import") && (m_import = true)) || (boost::iequals(m_argv[opt], "--update") && (m_update = true))) { operations.push_back(m_argv[opt]); m_accessItems = true; opt++; if (opt >= m_argc || !m_argv[opt][0]) { usage(false, string("missing parameter for ") + cmdOpt(m_argv[opt - 1])); return false; } m_itemPath = m_argv[opt]; if (m_itemPath != "-") { string dir, file; splitPath(m_itemPath, dir, file); if (dir.empty()) { dir = "."; } if (!relToAbs(dir)) { Exception::throwError(SE_HERE, dir, errno); } m_itemPath = dir + "/" + file; } parsed.push_back(m_itemPath); } else if (boost::iequals(m_argv[opt], "--delimiter")) { opt++; if (opt >= m_argc) { usage(false, string("missing parameter for ") + cmdOpt(m_argv[opt - 1])); return false; } m_delimiter = m_argv[opt]; parsed.push_back(m_delimiter); } else if (boost::iequals(m_argv[opt], "--delete-items")) { operations.push_back(m_argv[opt]); m_deleteItems = m_accessItems = true; } else if(boost::iequals(m_argv[opt], "--dry-run")) { m_dryrun = true; } else if(boost::iequals(m_argv[opt], "--migrate")) { operations.push_back(m_argv[opt]); m_migrate = true; } else if(boost::iequals(m_argv[opt], "--status") || boost::iequals(m_argv[opt], "-t")) { operations.push_back(m_argv[opt]); m_status = true; } else if(boost::iequals(m_argv[opt], "--quiet") || boost::iequals(m_argv[opt], "-q")) { m_quiet = true; } else if(boost::iequals(m_argv[opt], "--help") || boost::iequals(m_argv[opt], "-h")) { m_usage = true; } else if(boost::iequals(m_argv[opt], "--version")) { operations.push_back(m_argv[opt]); m_version = true; } else if (parseBool(opt, "--daemon", NULL, true, m_useDaemon, ok)) { if (!ok) { return false; } } else if(boost::iequals(m_argv[opt], "--monitor")|| boost::iequals(m_argv[opt], "-m")) { operations.push_back(m_argv[opt]); m_monitor = true; } else if (boost::iequals(m_argv[opt], "--luids")) { // all following parameters are luids; can't be combined // with setting config and source name while (++opt < m_argc) { parsed.push_back(m_argv[opt]); m_luids.push_back(CmdlineLUID::toLUID(m_argv[opt])); } } else { usage(false, string(m_argv[opt]) + ": unknown parameter"); return false; } opt++; } if (opt < m_argc) { m_server = m_argv[opt++]; while (opt < m_argc) { parsed.push_back(m_argv[opt]); if (m_sources.empty() || !m_accessItems) { m_sources.insert(m_argv[opt++]); } else { // first additional parameter was source, rest are luids m_luids.push_back(CmdlineLUID::toLUID(m_argv[opt++])); } } } // check whether we have conflicting operations requested by user if (operations.size() > 1) { usage(false, boost::join(operations, " ") + ": mutually exclusive operations"); return false; } // common sanity checking for item listing/import/export/update if (m_accessItems) { if ((m_import || m_update) && m_dryrun) { usage(false, operations[0] + ": --dry-run not supported"); return false; } } return true; } bool Cmdline::parseBool(int opt, const char *longName, const char *shortName, bool def, Bool &value, bool &ok) { string option = m_argv[opt]; string param; size_t pos = option.find('='); if (pos != option.npos) { param = option.substr(pos + 1); option.resize(pos); } if ((longName && boost::iequals(option, longName)) || (shortName && boost::iequals(option, shortName))) { ok = true; if (param.empty()) { value = def; } else if (boost::iequals(param, "t") || boost::iequals(param, "1") || boost::iequals(param, "true") || boost::iequals(param, "yes")) { value = true; } else if (boost::iequals(param, "f") || boost::iequals(param, "0") || boost::iequals(param, "false") || boost::iequals(param, "no")) { value = false; } else { usage(false, string("parameter in '") + m_argv[opt] + "' must be 1/t/true/yes or 0/f/false/no"); ok = false; } // was our option return true; } else { // keep searching for match return false; } } bool Cmdline::isSync() { // make sure command line arguments really try to run sync if (m_usage || m_version || m_printServers || boost::trim_copy(m_server) == "?" || m_printTemplates || m_dontrun || m_argc == 1 || (m_useDaemon.wasSet() && m_argc == 2) || m_printDatabases || m_createDatabase || m_removeDatabase || m_printConfig || m_remove || (m_server == "" && m_argc > 1) || m_configure || m_migrate || m_status || m_printSessions || !m_restore.empty() || m_accessItems || m_dryrun || (!m_run && m_props.hasProperties(FullProps::IGNORE_GLOBAL_PROPS))) { return false; } else { return true; } } bool Cmdline::isRestore() const { return !m_restore.empty(); } bool Cmdline::dontRun() const { // this mimics the if() checks in run() if (m_usage || m_version || m_printServers || boost::trim_copy(m_server) == "?" || m_printTemplates) { return false; } else { return m_dontrun; } } void Cmdline::makeObsolete(boost::shared_ptr &from) { string oldname = from->getRootPath(); string newname, suffix; for (int counter = 0; true; counter++) { ostringstream newsuffix; newsuffix << ".old"; if (counter) { newsuffix << "." << counter; } suffix = newsuffix.str(); newname = oldname + suffix; if (from->hasPeerProperties()) { boost::shared_ptr renamed(new SyncConfig(from->getPeerName() + suffix)); if (renamed->exists()) { // don't pick a config name which has the same peer name // as some other, existing config continue; } } // now renaming should succeed, but let's check anyway if (!rename(oldname.c_str(), newname.c_str())) { break; } else if (errno != EEXIST && errno != ENOTEMPTY) { SE_THROW(StringPrintf("renaming %s to %s: %s", oldname.c_str(), newname.c_str(), strerror(errno))); } } string newConfigName; string oldContext = from->getContextName(); if (from->hasPeerProperties()) { newConfigName = from->getPeerName() + suffix + oldContext; } else { newConfigName = oldContext + suffix; } // Clear old pointer first. That frees cached data in SyncConfig, // which otherwise fails to notice that we moved files on disk // around. from.reset(); from.reset(new SyncConfig(newConfigName)); } void Cmdline::copyConfig(const boost::shared_ptr &from, const boost::shared_ptr &to, const set &selectedSources) { const set *sources = NULL; set allSources; if (!selectedSources.empty()) { // use explicitly selected sources sources = &selectedSources; } else { // need an explicit list of all sources which will be copied, // for the createFilters() call below BOOST_FOREACH(const std::string &source, from->getSyncSources()) { allSources.insert(source); } sources = &allSources; } // Apply config changes on-the-fly. Regardless what we do // (changing an existing config, migrating, creating from // a template), existing shared properties in the desired // context must be preserved unless explicitly overwritten. // Therefore read those, update with command line properties, // then set as filter. ConfigProps syncFilter; SourceProps sourceFilters; m_props.createFilters(to->getContextName(), to->getConfigName(), sources, syncFilter, sourceFilters); from->setConfigFilter(true, "", syncFilter); BOOST_FOREACH(const SourceProps::value_type &entry, sourceFilters) { from->setConfigFilter(false, entry.first, entry.second); } // Modify behavior of target UI before using it: set keyring // property separately. InitStateTri keyring = from->getKeyring(); if (keyring.wasSet()) { to->setKeyring(keyring); } // Write into the requested configuration, creating it if necessary. to->prepareConfigForWrite(); to->copy(*from, sources); } void Cmdline::finishCopy(const boost::shared_ptr &from, const boost::shared_ptr &to) { // give a change to do something before flushing configs to files to->preFlush(to->getUserInterfaceNonNull()); // done, now write it m_configModified = true; to->flush(); // migrating peer? if (m_migrate && from->hasPeerProperties()) { // also copy .synthesis dir string fromDir, toDir; fromDir = from->getRootPath() + "/.synthesis"; toDir = to->getRootPath() + "/.synthesis"; if (isDir(fromDir)) { cp_r(fromDir, toDir); } // Succeeded so far, remove "ConsumerReady" flag from migrated // config to hide that old config from normal UI users. Must // do this without going through SyncConfig, because that // would bump the version. BoolConfigProperty ready("ConsumerReady", "", "0"); // Also disable auto-syncing in the migrated config. StringConfigProperty autosync("autoSync", "", ""); { IniFileConfigNode node(from->getRootPath(), "config.ini", false); if (ready.getPropertyValue(node)) { ready.setProperty(node, false); } if (!autosync.getProperty(node).empty()) { autosync.setProperty(node, InitStateString("0", true)); } node.flush(); } // same for very old configs { IniFileConfigNode node(from->getRootPath() + "/spds/syncml", "config.txt", false); if (!autosync.getProperty(node).empty()) { autosync.setProperty(node, InitStateString("0", true)); } node.flush(); } // Set ConsumerReady for migrated SyncEvolution < 1.2 // configs, because in older releases all existing // configurations where shown. SyncEvolution 1.2 is more // strict and assumes that ConsumerReady must be set // explicitly. The sync-ui always has set the flag for // configs created or modified with it, but the command // line did not. Matches similar code in // syncevo-dbus-server. if (from->getConfigVersion(CONFIG_LEVEL_PEER, CONFIG_CUR_VERSION) == 0 /* SyncEvolution < 1.2 */) { to->setConsumerReady(true); to->flush(); } } } void Cmdline::migratePeer(const std::string &fromPeer, const std::string &toPeer) { boost::shared_ptr from(new SyncConfig(fromPeer)); makeObsolete(from); // hack: move to different target config for createSyncClient() m_server = toPeer; boost::shared_ptr to(createSyncClient()); // Special case for Memotoo: explicitly set preferred sync format // to vCard 3.0 as part of the SyncEvolution 1.1.x -> 1.2 migration, // because it works better. Template was also updated in 1.2, but // that alone wouldn't improve existing configs. if (from->getConfigVersion(CONFIG_LEVEL_PEER, CONFIG_CUR_VERSION) == 0) { vector urls = from->getSyncURL(); if (urls.size() == 1 && urls[0] == "http://sync.memotoo.com/syncML") { boost::shared_ptr to(createSyncClient()); m_props[to->getContextName()].m_sourceProps["addressbook"].insert(make_pair("syncFormat", "text/vcard")); } } copyConfig(from, to, set()); finishCopy(from, to); } /** * Finds first instance of delimiter string in other string. In * addition, it treats "\n\n" in a special way: that delimiter also * matches "\n\r\n". */ class FindDelimiter { const string m_delimiter; public: FindDelimiter(const string &delimiter) : m_delimiter(delimiter) {} boost::iterator_range operator()(string::iterator begin, string::iterator end) { if (m_delimiter == "\n\n") { // match both "\n\n" and "\n\r\n" while (end - begin >= 2) { if (*begin == '\n') { if (*(begin + 1) == '\n') { return boost::iterator_range(begin, begin + 2); } else if (end - begin >= 3 && *(begin + 1) == '\r' && *(begin + 2) == '\n') { return boost::iterator_range(begin, begin + 3); } } ++begin; } return boost::iterator_range(end, end); } else { boost::sub_range range(begin, end); return boost::find_first(range, m_delimiter); } } }; static void ShowLUID(SyncSourceLogging *logging, const std::string &luid) { string description; if (logging) { description = logging->getDescription(luid); } SE_LOG_SHOW(NULL, "%s%s%s", CmdlineLUID::fromLUID(luid).c_str(), description.empty() ? "" : ": ", description.c_str()); } static void ExportLUID(SyncSourceRaw *raw, ostream *out, const std::string &defDelimiter, const std::string &itemPath, bool &haveItem, bool &haveNewline, const std::string &luid) { string item; raw->readItemRaw(luid, item); if (!out) { // write into directory string fullPath = itemPath + "/" + CmdlineLUID::fromLUID(luid); ofstream file(fullPath.c_str()); file << item; file.close(); if (file.bad()) { Exception::throwError(SE_HERE, fullPath, errno); } } else { std::string delimiter; if (haveItem) { if (defDelimiter.size() > 1 && haveNewline && defDelimiter[0] == '\n') { // already wrote initial newline, skip it delimiter = defDelimiter.substr(1); } else { delimiter = defDelimiter; } } if (out == &std::cout) { // special case, use logging infrastructure SE_LOG_SHOW(NULL, "%s%s", delimiter.c_str(), item.c_str()); // always prints newline haveNewline = true; } else { // write to file *out << delimiter << item; haveNewline = boost::ends_with(item, "\n"); } haveItem = true; } } bool Cmdline::run() { // --dry-run is only supported by some operations. // Be very strict about it and make sure it is off in all // potentially harmful operations, otherwise users might // expect it to have an effect when it doesn't. // TODO: check filter properties for invalid config and source // names if (m_usage) { usage(true); } else if (m_version) { SE_LOG_SHOW(NULL, "SyncEvolution %s%s\n%s%s", VERSION, SyncContext::isStableRelease() ? "" : " (pre-release)", EDSAbiWrapperInfo(), SyncSource::backendsInfo().c_str()); } else if (m_printServers || boost::trim_copy(m_server) == "?") { dumpConfigs("Configured servers:", SyncConfig::getConfigs()); } else if (m_printTemplates) { SyncConfig::DeviceList devices; if (m_template.empty()){ devices.push_back (SyncConfig::DeviceDescription("", "", SyncConfig::MATCH_FOR_CLIENT_MODE)); dumpConfigTemplates("Available configuration templates (servers):", SyncConfig::getPeerTemplates(devices), false); } else { //limiting at templates for syncml clients only. devices.push_back (SyncConfig::DeviceDescription("", m_template, SyncConfig::MATCH_FOR_SERVER_MODE)); dumpConfigTemplates("Available configuration templates (clients):", SyncConfig::matchPeerTemplates(devices), true); } } else if (m_dontrun) { // user asked for information } else if (m_printDatabases || m_createDatabase || m_removeDatabase) { // manipulate databases const SourceRegistry ®istry(SyncSource::getSourceRegistry()); boost::shared_ptr nodes; std::string header; boost::shared_ptr context; FilterConfigNode::ConfigFilter sourceFilter; std::string sourceName; FilterConfigNode::ConfigFilter::const_iterator backend; void (Cmdline::*operation)(SyncSource *, const std::string &) = m_printDatabases ? &Cmdline::listDatabases : m_createDatabase ? &Cmdline::createDatabase : &Cmdline::removeDatabase; if (!m_server.empty()) { // list for specific backend chosen via config if (m_sources.size() != 1) { SE_THROW(StringPrintf("must specify exactly one datastore after the config name '%s'", m_server.c_str())); } sourceName = *m_sources.begin(); sourceFilter = m_props.createSourceFilter(m_server, sourceName); backend = sourceFilter.find("backend"); context.reset(createSyncClient()); if (!context->exists()) { SE_THROW(StringPrintf("config '%s' does not exist", m_server.c_str())); } nodes.reset(new SyncSourceNodes(context->getSyncSourceNodesNoTracking(sourceName))); header = StringPrintf("%s/%s", m_server.c_str(), sourceName.c_str()); if (!nodes->dataConfigExists()) { SE_THROW(StringPrintf("%s does not exist", header.c_str())); } } else { sourceFilter = m_props.createSourceFilter(m_server, ""); backend = sourceFilter.find("backend"); context.reset(createSyncClient()); boost::shared_ptr sharedNode(new VolatileConfigNode()); boost::shared_ptr configNode(new VolatileConfigNode()); boost::shared_ptr hiddenNode(new VolatileConfigNode()); boost::shared_ptr trackingNode(new VolatileConfigNode()); boost::shared_ptr serverNode(new VolatileConfigNode()); nodes.reset(new SyncSourceNodes(true, sharedNode, configNode, hiddenNode, trackingNode, serverNode, "")); header = backend != sourceFilter.end() ? backend->second : "???"; } nodes->getProperties()->setFilter(sourceFilter); FilterConfigNode::ConfigFilter syncFilter = m_props.createSyncFilter(m_server); context->setConfigFilter(true, "", syncFilter); SyncSourceParams params("list", *nodes, context); if (!m_server.empty() || backend != sourceFilter.end()) { // list for specific backend params.m_name = sourceName; auto_ptr source(SyncSource::createSource(params, false, NULL)); if (source.get() != NULL) { if (!m_server.empty() && nodes) { // ensure that we have passwords for this config PasswordConfigProperty::checkPasswords(context->getUserInterfaceNonNull(), *context, PasswordConfigProperty::CHECK_PASSWORD_ALL, boost::assign::list_of(sourceName)); } (this->*operation)(source.get(), header); } else { SE_LOG_SHOW(NULL, "%s:\n cannot access databases", header.c_str()); } } else { // list for all backends BOOST_FOREACH(const RegisterSyncSource *source, registry) { BOOST_FOREACH(const Values::value_type &alias, source->m_typeValues) { if (!alias.empty() && source->m_enabled) { SourceType type(*alias.begin()); nodes->getProperties()->setProperty("backend", type.m_backend); std::string header = boost::join(alias, " = "); try { // The name is used in error messages. We // don't have a source name, so let's fall // back to the backend instead. params.m_name = type.m_backend; auto_ptr source(SyncSource::createSource(params, false)); (this->*operation)(source.get(), header); } catch (...) { SE_LOG_ERROR(NULL, "%s:\naccessing databases failed", header.c_str()); Exception::handle(); } } } } } } else if (m_printConfig) { boost::shared_ptr config; ConfigProps syncFilter; SourceProps sourceFilters; if (m_template.empty()) { if (m_server.empty()) { usage(false, "--print-config requires either a --template or a server name."); return false; } config.reset(new SyncConfig(m_server)); if (!config->exists()) { SE_LOG_ERROR(NULL, "Server '%s' has not been configured yet.", m_server.c_str()); return false; } // No need to include a context or additional sources, // because reading the m_server config already includes // the right information. m_props.createFilters("", m_server, NULL, syncFilter, sourceFilters); } else { string peer, context; SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(m_template, SyncConfig::NormalizeFlags(SyncConfig::NORMALIZE_SHORTHAND|SyncConfig::NORMALIZE_IS_NEW)), peer, context); config = SyncConfig::createPeerTemplate(peer); if (!config.get()) { SE_LOG_ERROR(NULL, "No configuration template for '%s' available.", m_template.c_str()); return false; } // When instantiating a template, include the properties // of the target context as filter to preserve shared // properties, the final name inside that context as // peer config name, and the sources defined in the template. list sourcelist = config->getSyncSources(); set sourceset(sourcelist.begin(), sourcelist.end()); m_props.createFilters(std::string("@") + context, "", &sourceset, syncFilter, sourceFilters); } // determine whether we dump a peer or a context int flags = DUMP_PROPS_NORMAL; string peer, context; SyncConfig::splitConfigString(config->getConfigName(), peer, context); if (peer.empty()) { flags |= HIDE_PER_PEER; checkForPeerProps(); } if (m_sources.empty() || m_sources.find("main") != m_sources.end()) { boost::shared_ptr syncProps(config->getProperties()); syncProps->setFilter(syncFilter); dumpProperties(*syncProps, config->getRegistry(), flags); } list sources = config->getSyncSources(); sources.sort(); BOOST_FOREACH(const string &name, sources) { if (m_sources.empty() || m_sources.find(name) != m_sources.end()) { SE_LOG_SHOW(NULL, "[%s]", name.c_str()); SyncSourceNodes nodes = config->getSyncSourceNodes(name); boost::shared_ptr sourceProps = nodes.getProperties(); sourceProps->setFilter(sourceFilters.createSourceFilter(name)); dumpProperties(*sourceProps, SyncSourceConfig::getRegistry(), flags | ((name != *(--sources.end())) ? HIDE_LEGEND : DUMP_PROPS_NORMAL)); } } } else if (m_configure || m_migrate) { if (!needConfigName()) { return false; } if (m_dryrun) { Exception::throwError(SE_HERE, "--dry-run not supported for configuration changes"); } // name of renamed config ("foo.old") after migration string newname; // True if the target configuration is a context like @default // or @foobar. Relevant in several places in the following // code. bool configureContext = false; bool fromScratch = false; string peer, context; SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(m_server), peer, context); if (peer.empty()) { configureContext = true; checkForPeerProps(); } // Make m_server a fully-qualified name. Useful in error // messages and essential for migrating "foo" where "foo" // happens to map to "foo@bar". Otherwise "foo" will be // mapped incorrectly to "foo@default" after renaming // "foo@bar" to "foo.old@bar". // // The inverse problem can occur for "foo@default": after // renaming, "foo" without "@default" would be mapped to // "foo@somewhere-else" if such a config exists. m_server = peer + "@" + context; // Both config changes and migration are implemented as copying from // another config (template resp. old one). Migration also moves // the old config. The target configuration is determined by m_server, // but the exact semantic of it depends on the operation. boost::shared_ptr from; boost::shared_ptr to; string origPeer; if (m_migrate) { if (!m_sources.empty()) { SE_LOG_ERROR(NULL, "cannot migrate individual datastores"); return false; } string oldContext = context; from.reset(new SyncConfig(m_server)); if (!from->exists()) { // for migration into a different context, search for config without context oldContext = ""; from.reset(new SyncConfig(peer)); if (!from->exists()) { SE_LOG_ERROR(NULL, "Server '%s' has not been configured yet.", m_server.c_str()); return false; } } // Check if we are migrating an individual peer inside // a context which itself is too old. In that case, // the whole context and everything inside it needs to // be migrated. if (!configureContext) { bool obsoleteContext = false; if (from->getLayout() < SyncConfig::SHARED_LAYOUT) { // check whether @default context exists and is too old; // in that case migrate it first SyncConfig target("@default"); if (target.exists() && target.getConfigVersion(CONFIG_LEVEL_CONTEXT, CONFIG_CUR_VERSION) < CONFIG_CONTEXT_MIN_VERSION) { // migrate all peers inside @default *and* the one outside origPeer = m_server; m_server = "@default"; obsoleteContext = true; } } else { // config already is inside a context; need to check that context if (from->getConfigVersion(CONFIG_LEVEL_CONTEXT, CONFIG_CUR_VERSION) < CONFIG_CONTEXT_MIN_VERSION) { m_server = string("@") + context; obsoleteContext = true; } } if (obsoleteContext) { // hack: move to different config and back later from.reset(new SyncConfig(m_server)); peer = ""; configureContext = true; } } // rename on disk and point "from" to it makeObsolete(from); // modify the config referenced by the (possibly modified) m_server to.reset(createSyncClient()); } else { from.reset(new SyncConfig(m_server)); // m_server known, modify it to.reset(createSyncClient()); if (!from->exists()) { // creating from scratch, look for template fromScratch = true; string configTemplate; if (m_template.empty()) { if (configureContext) { // configuring a context, template doesn't matter => // use default "SyncEvolution" template configTemplate = peer = "SyncEvolution"; from = SyncConfig::createPeerTemplate(peer); } else if (peer == "target-config") { // Configuring the source context for local sync // => determine template based on context name. configTemplate = context; from = SyncConfig::createPeerTemplate(context); } else { // template is the peer name configTemplate = m_server; from = SyncConfig::createPeerTemplate(peer); } } else { // Template is specified explicitly. It must not contain a context, // because the context comes from the config name. configTemplate = m_template; if (SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(configTemplate, SyncConfig::NormalizeFlags(SyncConfig::NORMALIZE_SHORTHAND|SyncConfig::NORMALIZE_IS_NEW)), peer, context)) { SE_LOG_ERROR(NULL, "Template %s must not specify a context.", configTemplate.c_str()); return false; } string tmp; SyncConfig::splitConfigString(SyncConfig::normalizeConfigString(m_server), tmp, context); from = SyncConfig::createPeerTemplate(peer); } list missing; if (!from.get()) { // check if all obligatory sync properties are specified; needed // for both the "is complete" check and the error message below ConfigProps syncProps = m_props.createSyncFilter(to->getContextName()); bool complete = true; BOOST_FOREACH(const ConfigProperty *prop, SyncConfig::getRegistry()) { if (prop->isObligatory() && syncProps.find(prop->getMainName()) == syncProps.end()) { missing.push_back(prop->getMainName()); complete = false; } } // if everything was specified and no invalid template name was given, allow user // to proceed with "none" template; if a template was specified, we skip // this and go directly to the code below which prints an error message if (complete && m_template.empty()) { from = SyncConfig::createPeerTemplate("none"); } } if (!from.get()) { SE_LOG_ERROR(NULL, "No configuration template for '%s' available.", configTemplate.c_str()); if (m_template.empty()) { SE_LOG_INFO(NULL, "Use '--template none' and/or specify relevant properties on the command line to create a configuration without a template. Need values for: %s", boost::join(missing, ", ").c_str()); } else if (missing.empty()) { SE_LOG_INFO(NULL, "All relevant properties seem to be set, omit the --template parameter to proceed."); } SE_LOG_INFO(NULL, "\n"); SyncConfig::DeviceList devices; devices.push_back(SyncConfig::DeviceDescription("", "", SyncConfig::MATCH_ALL)); dumpConfigTemplates("Available configuration templates (clients and servers):", SyncConfig::getPeerTemplates(devices), false, Logger::INFO); return false; } } } // Which sources are configured is determined as follows: // - all sources in the template by default (empty set), except when // - sources are listed explicitly, and either // - updating an existing config or // - configuring a context. // // This implies that when configuring a peer from scratch, all // sources in the template will be created, with command line // source properties applied to all of them. This might not be // what we want, but because this is how we have done it // traditionally, I keep this behavior for now. // // When migrating, m_sources is empty and thus the whole set of // sources will be migrated. Checking it here for clarity's sake. set sources; if (!m_migrate && !m_sources.empty() && (!fromScratch || configureContext)) { sources = m_sources; } // Also copy (aka create) sources listed on the command line if // creating from scratch and // - "--template none" enables the "do what I want" mode or // - source properties apply to it. // Creating from scratch with other sources is a possible typo // and will trigger an error below. if (fromScratch) { BOOST_FOREACH(const string &source, m_sources) { if (m_template == "none" || !m_props.createSourceFilter(to->getContextName(), source).empty()) { sources.insert(source); } } } // Special case for migration away from "type": older // SyncEvolution could cope with "type" only set correctly for // peers. Real-world case: Memotoo config, context had "type = // calendar" set for address book. // // Setting "backend" based on an incorrect "type" from the // context would lead to a broken, unusable config. Solution: // take "backend" and "databaseFormat" from a peer config when // migrating a context. // // Note that peers are assumed to be consistent. Not attempt is // made to detect a config which has inconsistent peer configs. if (m_migrate && configureContext && from->getConfigVersion(CONFIG_LEVEL_CONTEXT, CONFIG_CUR_VERSION) == 0) { list peers = from->getPeers(); peers.sort(); // make code below deterministic BOOST_FOREACH(const std::string source, from->getSyncSources()) { BOOST_FOREACH(const string &peer, peers) { IniFileConfigNode node(from->getRootPath() + "/peers/" + peer + "/sources/" + source, "config.ini", true); string sync = node.readProperty("sync"); if (sync.empty() || boost::iequals(sync, "none") || boost::iequals(sync, "disabled")) { // ignore this peer, it doesn't use the source continue; } SourceType type(node.readProperty("type")); if (!type.m_backend.empty()) { // found some "type": use "backend" and // "dataFormat" in filter, unless the user // already set a value there ConfigProps syncFilter; SourceProps sourceFilters; set set; set.insert(source); m_props.createFilters(to->getContextName(), "", &set, syncFilter, sourceFilters); const ConfigProps &sourceFilter = sourceFilters[source]; if (sourceFilter.find("backend") == sourceFilter.end()) { m_props[to->getContextName()].m_sourceProps[source]["backend"] = type.m_backend; } if (!type.m_localFormat.empty() && sourceFilter.find("databaseFormat") == sourceFilter.end()) { m_props[to->getContextName()].m_sourceProps[source]["databaseFormat"] = type.m_localFormat; } // use it without bothering to keep looking // (no consistenty check!) break; } } } } // TODO: update complete --configure output to be more informative. // This is a first step, but shouldn't be done in isolation. // SE_LOG_INFO(NULL, "%s configuration %s", // fromScratch ? "creating" : "updating", // to->getConfigName().c_str()); // copy and filter into the target config: createSyncClient() // creates a SyncContext for m_server, with propert // implementation of the password handling methods in derived // classes (D-Bus server, real command line) copyConfig(from, to, sources); // Sources are active now according to the server default. // Disable all sources not selected by user (if any selected) // and those which have no database. if (fromScratch) { list configuredSources = to->getSyncSources(); set sources = m_sources; SuspendFlags &s = SuspendFlags::getSuspendFlags(); BOOST_FOREACH(const string &source, configuredSources) { boost::shared_ptr sourceConfig(to->getSyncSourceConfig(source)); string disable = ""; set::iterator entry = sources.find(source); bool selected = entry != sources.end(); if (!m_sources.empty() && !selected) { disable = "not selected"; } else { if (entry != sources.end()) { // The command line parameter matched a valid source. // All entries left afterwards must have been typos. sources.erase(entry); } // Only check the source if it is not already disabled. if (selected || sourceConfig->getSync() != "disabled") { // Even if the peer config does not exist yet // (fromScratch == true), the source config itself // may already exist with a username/password // using the keyring. Need to retrieve that // password before using the source. // // We need to check for databases again here, // because otherwise we don't know whether the // source is usable. The "database" property can // be empty in a usable source, and the "sync" // property in some potential other peer config // is not accessible. PasswordConfigProperty::checkPasswords(to->getUserInterfaceNonNull(), *to, PasswordConfigProperty::CHECK_PASSWORD_SOURCE| PasswordConfigProperty::CHECK_PASSWORD_RESOLVE_PASSWORD| PasswordConfigProperty::CHECK_PASSWORD_RESOLVE_USERNAME, boost::assign::list_of(source)); SyncSourceParams params(source, to->getSyncSourceNodes(source), to); auto_ptr syncSource(SyncSource::createSource(params, false, to.get())); if (syncSource.get() == NULL) { disable = "no backend available"; } else { try { syncSource->open(); if (!syncSource->isUsable()) { disable = "unusable"; } } catch (...) { std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); disable = "backend failed: " + explanation; } } } else { disable = "inactive"; } // Checking can take some time, so allow the user to abort. s.checkForNormal(); } // Verify usability of source (can it be enabled?). // Only set the sync mode if configuring a peer. // A context-only config doesn't have the "sync" // property. string syncMode; if (!disable.empty()) { // abort if the user explicitly asked for the sync source // and it cannot be enabled, otherwise disable it silently if (selected) { Exception::throwError(SE_HERE, source + ": " + disable); } else if (disable == "unusable") { // More detailed INFO message must have been // printed by isUsable(). } else { // Print out own check result. SE_LOG_INFO(NULL, "%s: %s", source.c_str(), disable.c_str()); } if (sourceConfig->getSync() != "disabled") { syncMode = "disabled"; } } else { if (selected) { // user absolutely wants it: enable even if off by default ConfigProps filter = m_props.createSourceFilter(m_server, source); ConfigProps::const_iterator sync = filter.find("sync"); syncMode = sync == filter.end() ? "two-way" : sync->second; } if (configureContext) { SE_LOG_INFO(NULL, "%s: configuring datastore", source.c_str()); } else { SE_LOG_INFO(NULL, "%s: configuring datastore with sync mode '%s'", source.c_str(), syncMode.empty() ? sourceConfig->getSync().c_str() : syncMode.c_str()); } } if (!syncMode.empty() && !configureContext) { sourceConfig->setSync(syncMode); } } if (!sources.empty()) { Exception::throwError(SE_HERE, string("no such datastore(s): ") + boost::join(sources, " ")); } } // flush, move .synthesis dir, set ConsumerReady, ... finishCopy(from, to); // Now also migrate all peers inside context? if (configureContext && m_migrate) { BOOST_FOREACH(const string &peer, from->getPeers()) { migratePeer(peer + from->getContextName(), peer + to->getContextName()); } if (!origPeer.empty()) { migratePeer(origPeer, origPeer + to->getContextName()); } } } else if (m_remove) { if (!needConfigName()) { return false; } if (m_dryrun) { Exception::throwError(SE_HERE, "--dry-run not supported for removing configurations"); } // extra sanity check if (!m_sources.empty() || m_props.hasProperties(FullProps::IGNORE_GLOBAL_PROPS)) { usage(false, "too many parameters for --remove"); return false; } else { boost::shared_ptr config; config.reset(new SyncConfig(m_server)); if (!config->exists()) { Exception::throwError(SE_HERE, string("no such configuration: ") + m_server); } config->remove(); m_configModified = true; return true; } } else if (m_accessItems) { // need access to specific source boost::shared_ptr context; context.reset(createSyncClient()); // operating on exactly one source (can be optional) string sourceName; bool haveSourceName = !m_sources.empty(); if (haveSourceName) { sourceName = *m_sources.begin(); } // apply filters context->setConfigFilter(true, "", m_props.createSyncFilter(m_server)); context->setConfigFilter(false, "", m_props.createSourceFilter(m_server, sourceName)); SyncSourceNodes sourceNodes = context->getSyncSourceNodesNoTracking(sourceName); SyncSourceParams params(sourceName, sourceNodes, context); cxxptr source; try { source.set(SyncSource::createSource(params, true)); } catch (const StatusException &ex) { // Creating the source failed. Detect some common reasons for this // and log those instead. None of these situations are fatal by themselves, // but in combination they are a problem. if (ex.syncMLStatus() == SyncMLStatus(sysync::LOCERR_CFGPARSE)) { std::list explanation; explanation.push_back(ex.what()); if (!m_server.empty() && !context->exists()) { explanation.push_back(StringPrintf("configuration '%s' does not exist", m_server.c_str())); } if (haveSourceName && !sourceNodes.exists()) { explanation.push_back(StringPrintf("datastore '%s' does not exist", sourceName.c_str())); } else if (!haveSourceName) { explanation.push_back("no datastore selected"); } SyncSourceConfig sourceConfig(sourceName, sourceNodes); if (!sourceConfig.getBackend().wasSet()) { explanation.push_back("backend property not set"); } Exception::throwError(SE_HERE, SyncMLStatus(sysync::LOCERR_CFGPARSE), boost::join(explanation, "\n")); } else { throw; } } sysync::TSyError err; #define CHECK_ERROR(_op) if (err) { SE_THROW_EXCEPTION_STATUS(StatusException, string(source->getName()) + ": " + (_op), SyncMLStatus(err)); } PasswordConfigProperty::checkPasswords(context->getUserInterfaceNonNull(), *context, PasswordConfigProperty::CHECK_PASSWORD_ALL, boost::assign::list_of(source->getName())); source->setNeedChanges(false); source->open(); const SyncSource::Operations &ops = source->getOperations(); if (m_printItems) { SyncSourceLogging *logging = dynamic_cast(source.get()); if (!ops.m_startDataRead || !ops.m_readNextItem) { source->throwError(SE_HERE, "reading items not supported"); } err = ops.m_startDataRead("", ""); CHECK_ERROR("reading items"); source->setReadAheadOrder(SyncSourceBase::READ_ALL_ITEMS); processLUIDs(source, boost::bind(ShowLUID, logging, _1)); } else if (m_deleteItems) { if (!ops.m_deleteItem) { source->throwError(SE_HERE, "deleting items not supported"); } list luids; bool deleteAll = std::find(m_luids.begin(), m_luids.end(), "*") != m_luids.end(); err = ops.m_startDataRead("", ""); CHECK_ERROR("reading items"); if (deleteAll) { readLUIDs(source, luids); } else { luids = m_luids; } if (ops.m_endDataRead) { err = ops.m_endDataRead(); CHECK_ERROR("stop reading items"); } if (ops.m_startDataWrite) { err = ops.m_startDataWrite(); CHECK_ERROR("writing items"); } BOOST_FOREACH(const string &luid, luids) { sysync::ItemIDType id; id.item = (char *)luid.c_str(); err = ops.m_deleteItem(&id); CHECK_ERROR("deleting item"); } char *token; err = ops.m_endDataWrite(true, &token); if (token) { free(token); } CHECK_ERROR("stop writing items"); } else { SyncSourceRaw *raw = dynamic_cast(source.get()); if (!raw) { source->throwError(SE_HERE, "reading/writing items directly not supported"); } if (m_import || m_update) { err = ops.m_startDataRead("", ""); CHECK_ERROR("reading items"); if (ops.m_endDataRead) { err = ops.m_endDataRead(); CHECK_ERROR("stop reading items"); } if (ops.m_startDataWrite) { err = ops.m_startDataWrite(); CHECK_ERROR("writing items"); } cxxptr inFile; if (m_itemPath =="-" || !isDir(m_itemPath)) { string content; string luid; if (m_itemPath == "-") { context->getUserInterfaceNonNull().readStdin(content); } else if (!ReadFile(m_itemPath, content)) { Exception::throwError(SE_HERE, m_itemPath, errno); } if (m_delimiter == "none") { if (m_update) { if (m_luids.size() != 1) { Exception::throwError(SE_HERE, "need exactly one LUID parameter"); } else { luid = *m_luids.begin(); } } SE_LOG_SHOW(NULL, "#0: %s", insertItem(raw, luid, content).getEncoded().c_str()); } else { typedef boost::split_iterator string_split_iterator; int count = 0; FindDelimiter finder(m_delimiter); // when updating, check number of luids in advance if (m_update) { unsigned long total = 0; for (string_split_iterator it = boost::make_split_iterator(content, finder); it != string_split_iterator(); ++it) { total++; } if (total != m_luids.size()) { Exception::throwError(SE_HERE, StringPrintf("%lu items != %lu luids, must match => aborting", total, (unsigned long)m_luids.size())); } } list::const_iterator luidit = m_luids.begin(); for (string_split_iterator it = boost::make_split_iterator(content, finder); it != string_split_iterator(); ++it) { string luid; if (m_update) { if (luidit == m_luids.end()) { // was checked above Exception::throwError(SE_HERE, "internal error, not enough luids"); } luid = *luidit; ++luidit; } SE_LOG_SHOW(NULL, "#%d: %s", count, insertItem(raw, luid, string(it->begin(), it->end())).getEncoded().c_str()); count++; } } } else { ReadDir dir(m_itemPath); int count = 0; BOOST_FOREACH(const string &entry, dir) { string content; string path = m_itemPath + "/" + entry; if (!ReadFile(path, content)) { Exception::throwError(SE_HERE, path, errno); } std::string luid; if (m_update) { luid = CmdlineLUID::toLUID(entry); } SE_LOG_SHOW(NULL, "#%d: %s: %s", count, entry.c_str(), insertItem(raw, luid, content).getEncoded().c_str()); count++; } } char *token = NULL; err = ops.m_endDataWrite(true, &token); if (token) { free(token); } CHECK_ERROR("stop writing items"); } else if (m_export) { err = ops.m_startDataRead("", ""); CHECK_ERROR("reading items"); ostream *out = NULL; cxxptr outFile; if (m_itemPath == "-") { // not actually used, falls back to SE_LOG_SHOW() out = &std::cout; } else if(!isDir(m_itemPath)) { outFile.set(new ofstream(m_itemPath.c_str())); out = outFile; } bool haveItem = false; // have written one item bool haveNewline = false; // that item had a newline at the end if (m_luids.empty()) { // Read all items. raw->setReadAheadOrder(SyncSourceBase::READ_ALL_ITEMS); processLUIDs(source, boost::bind(ExportLUID, raw, out, boost::ref(m_delimiter), boost::ref(m_itemPath), boost::ref(haveItem), boost::ref(haveNewline), _1)); } else { SyncSourceBase::ReadAheadItems luids; luids.reserve(m_luids.size()); luids.insert(luids.begin(), m_luids.begin(), m_luids.end()); raw->setReadAheadOrder(SyncSourceBase::READ_SELECTED_ITEMS, luids); BOOST_FOREACH(const string &luid, m_luids) { ExportLUID(raw, out, m_delimiter, m_itemPath, haveItem, haveNewline, luid); } } raw->setReadAheadOrder(SyncSourceBase::READ_NONE); if (outFile) { outFile->close(); if (outFile->bad()) { Exception::throwError(SE_HERE, m_itemPath, errno); } } } } source->close(); } else { if (!needConfigName()) { return false; } std::set unmatchedSources; boost::shared_ptr context; context.reset(createSyncClient()); context->setConfigProps(m_props); context->setQuiet(m_quiet); context->setDryRun(m_dryrun); context->setConfigFilter(true, "", m_props.createSyncFilter(m_server)); if (m_sources.empty()) { // Special semantic of 'no source selected': apply // filter (if any exists) only to sources which are // *active*. Configuration of inactive sources is left // unchanged. This way we don't activate sync sources // accidentally when the sync mode is modified // temporarily. BOOST_FOREACH(const std::string &source, context->getSyncSources()) { boost::shared_ptr source_config = context->getSyncSourceConfig(source); if (!source_config->isDisabled()) { context->setConfigFilter(false, source, m_props.createSourceFilter(m_server, source)); } } } else { // apply (possibly empty) source filter to selected sources BOOST_FOREACH(const std::string &source, m_sources) { boost::shared_ptr source_config = context->getSyncSourceConfig(source); ConfigProps filter = m_props.createSourceFilter(m_server, source); if (!source_config || !source_config->exists()) { // invalid source name in m_sources, remember and // report this below unmatchedSources.insert(source); } else if (filter.find("sync") == filter.end()) { // Sync mode is not set, must override the // "sync=disabled" set below with the original // sync mode for the source or (if that is also // "disabled") with "two-way". The latter is part // of the command line semantic that listing a // source activates it. string sync = source_config->getSync(); filter["sync"] = sync == "disabled" ? "two-way" : sync; context->setConfigFilter(false, source, filter); } else { // sync mode is set, can use m_sourceProps // directly to apply it context->setConfigFilter(false, source, filter); } } // temporarily disable the rest FilterConfigNode::ConfigFilter disabled; disabled["sync"] = InitStateString("disabled", true); context->setConfigFilter(false, "", disabled); } // check whether there were any sources specified which do not exist if (!unmatchedSources.empty()) { Exception::throwError(SE_HERE, string("no such datastore(s): ") + boost::join(unmatchedSources, " ")); } if (m_status) { context->status(); } else if (m_printSessions) { vector dirs; context->getSessions(dirs); bool first = true; BOOST_FOREACH(const string &dir, dirs) { if (first) { first = false; } else if(!m_quiet) { SE_LOG_SHOW(NULL, "\n"); } SE_LOG_SHOW(NULL, "%s", dir.c_str()); if (!m_quiet) { SyncReport report; context->readSessionInfo(dir, report); ostringstream out; out << report; SE_LOG_SHOW(NULL, "%s", out.str().c_str()); } } } else if (!m_restore.empty()) { // sanity checks: either --after or --before must be given, sources must be selected if ((!m_after && !m_before) || (m_after && m_before)) { usage(false, "--restore must be used with either --after (restore database as it was after that sync) or --before (restore data from before sync)"); return false; } if (m_sources.empty()) { usage(false, "Datastores must be selected explicitly for --restore to prevent accidental restore."); return false; } context->restore(m_restore, m_after ? SyncContext::DATABASE_AFTER_SYNC : SyncContext::DATABASE_BEFORE_SYNC); } else { if (m_dryrun) { usage(false, "--dry-run not supported for running a synchronization"); return false; } // safety catch: if props are given, then --run // is required if (!m_run && (m_props.hasProperties(FullProps::IGNORE_GLOBAL_PROPS))) { usage(false, "Properties specified, but neither '--configure' nor '--run' - what did you want?"); return false; } return (context->sync(&m_report) == STATUS_OK); } } return true; } void Cmdline::readLUIDs(SyncSource *source, list &luids) { processLUIDs(source, boost::bind(&list::push_back, boost::ref(luids), _1)); } void Cmdline::processLUIDs(SyncSource *source, const boost::function &process) { const SyncSource::Operations &ops = source->getOperations(); sysync::ItemIDType id; sysync::sInt32 status; sysync::TSyError err = ops.m_readNextItem(&id, &status, true); CHECK_ERROR("next item"); while (status != sysync::ReadNextItem_EOF) { process(id.item); StrDispose(id.item); StrDispose(id.parent); err = ops.m_readNextItem(&id, &status, false); CHECK_ERROR("next item"); } } CmdlineLUID Cmdline::insertItem(SyncSourceRaw *source, const string &luid, const string &data) { SyncSourceRaw::InsertItemResult res = source->insertItemRaw(luid, data); CmdlineLUID cluid; cluid.setLUID(res.m_luid); return cluid; } string Cmdline::cmdOpt(const char *opt, const char *param) { string res = "'"; if (opt) { res += opt; } // parameter was provided as part of option bool included = opt && param && boost::ends_with(std::string(opt), std::string("=") + param); if (!included && opt && param) { res += " "; } if (!included && param) { res += param; } res += "'"; return res; } bool Cmdline::parseProp(PropertyType propertyType, const char *opt, const char *param, const char *propname) { std::string args = cmdOpt(opt, param); if (!param) { usage(false, string("missing parameter for ") + args); return false; } // determine property name and parameter for it string propstr; string paramstr; if (propname) { propstr = propname; paramstr = param; } else if (boost::trim_copy(string(param)) == "?") { paramstr = param; } else { const char *equal = strchr(param, '='); if (!equal) { usage(false, string("the '=' part is missing in: ") + args); return false; } propstr.assign(param, equal - param); paramstr.assign(equal + 1); } boost::trim(propstr); boost::trim_left(paramstr); // parse full property string PropertySpecifier spec = PropertySpecifier::StringToPropSpec(propstr); // determine property type and registry const ConfigPropertyRegistry *validProps = NULL; switch (propertyType) { case SYNC_PROPERTY_TYPE: validProps = &m_validSyncProps; break; case SOURCE_PROPERTY_TYPE: validProps = &m_validSourceProps; break; case UNKNOWN_PROPERTY_TYPE: // must guess based on both registries if (!propstr.empty()) { bool isSyncProp = m_validSyncProps.find(spec.m_property) != NULL; bool isSourceProp = m_validSourceProps.find(spec.m_property) != NULL; if (isSyncProp) { if (isSourceProp) { usage(false, StringPrintf("property '%s' in %s could be both a sync and a datastore property, use --sync-property or --datastore-property to disambiguate it", propname, args.c_str())); return false; } else { validProps = &m_validSyncProps; } } else if (isSourceProp || boost::iequals(spec.m_property, "type")) { validProps = &m_validSourceProps; } else { if (propname) { usage(false, StringPrintf("unrecognized property '%s' in %s", propname, args.c_str())); } else { usage(false, StringPrintf("unrecognized property in %s", args.c_str())); } return false; } } else { usage(false, StringPrintf("a property name must be given in %s", args.c_str())); return false; } } if (boost::trim_copy(string(param)) == "?") { m_dontrun = true; if (propname) { return listPropValues(*validProps, spec.m_property, opt ? opt : ""); } else { return listProperties(*validProps, opt ? opt : ""); } } else { if (boost::trim_copy(paramstr) == "?") { m_dontrun = true; return listPropValues(*validProps, spec.m_property, args); } else { const ConfigProperty *prop = validProps->find(spec.m_property); if (!prop && boost::iequals(spec.m_property, "type")) { // compatiblity mode for "type": map to the properties which // replaced it prop = validProps->find("backend"); if (!prop) { SE_LOG_ERROR(NULL, "backend: no such property"); return false; } SourceType sourceType(paramstr); string error; if (!prop->checkValue(sourceType.m_backend, error)) { SE_LOG_ERROR(NULL, "%s: %s", args.c_str(), error.c_str()); return false; } ContextProps &props = m_props[spec.m_config]; props.m_sourceProps[spec.m_source]["backend"] = InitStateString(sourceType.m_backend, !sourceType.m_backend.empty()); props.m_sourceProps[spec.m_source]["databaseFormat"] = InitStateString(sourceType.m_localFormat, !sourceType.m_localFormat.empty()); props.m_sourceProps[spec.m_source]["syncFormat"] = InitStateString(sourceType.m_format, !sourceType.m_format.empty()); props.m_sourceProps[spec.m_source]["forceSyncFormat"] = sourceType.m_forceFormat ? InitStateString("1", true) : InitStateString("0", false); return true; } else if (!prop) { SE_LOG_ERROR(NULL, "%s: no such property", args.c_str()); return false; } else { string error; if (!prop->checkValue(paramstr, error)) { SE_LOG_ERROR(NULL, "%s: %s", args.c_str(), error.c_str()); return false; } else { ContextProps &props = m_props[spec.m_config]; if (validProps == &m_validSyncProps) { // complain if sync property includes source prefix if (!spec.m_source.empty()) { SE_LOG_ERROR(NULL, "%s: datastore name '%s' not allowed in sync property", args.c_str(), spec.m_source.c_str()); return false; } props.m_syncProps[spec.m_property] = paramstr; } else { props.m_sourceProps[spec.m_source][spec.m_property] = paramstr; } return true; } } } } } bool Cmdline::parseAssignment(int &opt, vector &parsed, PropertyType propertyType, const char *propname, const char *def) { string param; bool haveParam = false; string cmdopt(m_argv[opt]); size_t off = cmdopt.find('='); if (off != cmdopt.npos) { // value embedded in option param = cmdopt.substr(off + 1); haveParam = true; } else if (!def && ++opt < m_argc) { // assume next entry is parameter param = m_argv[opt]; parsed.push_back(m_argv[opt]); haveParam = true; } else if (def) { // use default param = def; haveParam = true; } return parseProp(propertyType, cmdopt.c_str(), haveParam ? param.c_str() : NULL, propname); } bool Cmdline::listPropValues(const ConfigPropertyRegistry &validProps, const string &propName, const string &opt) { const ConfigProperty *prop = validProps.find(propName); if (!prop && boost::iequals(propName, "type")) { SE_LOG_SHOW(NULL, "%s\n" " [:[:getComment(); if (comment != "") { list commentLines; ConfigProperty::splitComment(comment, commentLines); BOOST_FOREACH(const string &line, commentLines) { out << " " << line << endl; } } else { out << " no documentation available" << endl; } SE_LOG_SHOW(NULL, "%s", out.str().c_str()); return true; } } bool Cmdline::listProperties(const ConfigPropertyRegistry &validProps, const string &opt) { // The first of several related properties has a comment. // Remember that comment and print it as late as possible, // that way related properties preceed their comment. string comment; bool needComma = false; ostringstream out; BOOST_FOREACH(const ConfigProperty *prop, validProps) { if (!prop->isHidden()) { string newComment = prop->getComment(); if (newComment != "") { if (!comment.empty()) { out << endl; dumpComment(out, " ", comment); out << endl; needComma = false; } comment = newComment; } std::string def = prop->getDefValue(); if (def.empty()) { def = "no default"; } ConfigProperty::Sharing sharing = prop->getSharing(); if (needComma) { out << ", "; } out << boost::join(prop->getNames(), " = ") << " (" << def << ", " << ConfigProperty::sharing2str(sharing) << (prop->isObligatory() ? ", required" : "") << ")"; needComma = true; } } out << endl; dumpComment(out, " ", comment); SE_LOG_SHOW(NULL, "%s", out.str().c_str()); return true; } static void findPeerProps(FilterConfigNode::ConfigFilter &filter, ConfigPropertyRegistry ®istry, set &peerProps) { BOOST_FOREACH(StringPair entry, filter) { const ConfigProperty *prop = registry.find(entry.first); if (prop && prop->getSharing() == ConfigProperty::NO_SHARING) { peerProps.insert(entry.first); } } } void Cmdline::checkForPeerProps() { set peerProps; BOOST_FOREACH(FullProps::value_type &entry, m_props) { ContextProps &props = entry.second; findPeerProps(props.m_syncProps, SyncConfig::getRegistry(), peerProps); BOOST_FOREACH(SourceProps::value_type &entry, props.m_sourceProps) { findPeerProps(entry.second, SyncSourceConfig::getRegistry(), peerProps); } } if (!peerProps.empty()) { string props = boost::join(peerProps, ", "); if (props == "forceSyncFormat, syncFormat") { // special case: these two properties might have been added by the // legacy "sync" property, which applies to both shared and unshared // properties => cannot determine that here anymore, so ignore it } else { Exception::throwError(SE_HERE, string("per-peer (unshared) properties not allowed: ") + props); } } } void Cmdline::listDatabases(SyncSource *source, const string &header) { if (!source) { // silently skip backends like the "file" backend which do not support // listing databases and return NULL unless configured properly return; } ostringstream out; out << header << ":\n"; if (source->isInactive()) { out << source->getBackend() << ": not enabled during compilation or not usable in the current environment\n"; } else { SyncSource::Databases databases = source->getDatabases(); BOOST_FOREACH(const SyncSource::Database &database, databases) { out << " " << database.m_name << " (" << database.m_uri << ")"; if (database.m_isDefault) { out << " "; } if (database.m_isReadOnly) { out << " "; } out << endl; } } SE_LOG_SHOW(NULL, "%s", out.str().c_str()); SE_LOG_SHOW(NULL, "\n"); } void Cmdline::createDatabase(SyncSource *source, const string &header) { if (!source) { SE_THROW(StringPrintf("%s:\ncannot access databases", header.c_str())); return; } // Only the name can be set via the command line. URI is chosen by backend. InitStateString databaseID = source->getDatabaseID(); if (!databaseID.wasSet()) { SE_THROW("The 'database' property must be set to the name of the new database"); } SyncSource::Database database = source->createDatabase(SyncSource::Database(databaseID, "")); SE_LOG_SHOW(NULL, "%s: database '%s' (%s) was created.", header.c_str(), database.m_name.c_str(), database.m_uri.c_str()); } void Cmdline::removeDatabase(SyncSource *source, const string &header) { if (!source) { SE_THROW(StringPrintf("%s:\ncannot access databases", header.c_str())); return; } InitStateString databaseID = source->getDatabaseID(); if (!databaseID.wasSet()) { SE_THROW("The 'database' property was not set. Cowardly refusing to remove the default database. Set it to the empty string and try again if that was the intention."); } // determine URI source->open(); SyncSource::Database database = source->getDatabase(); if (database.m_uri.empty()) { SE_THROW(StringPrintf("Cannot determine database from 'database' property value '%s'.", databaseID.c_str())); } source->deleteDatabase(database.m_uri, SyncSource::REMOVE_DATA_DEFAULT); SE_LOG_SHOW(NULL, "%s: database '%s' (%s) was removed.", header.c_str(), database.m_name.c_str(), database.m_uri.c_str()); } void Cmdline::dumpConfigs(const string &preamble, const SyncConfig::ConfigList &servers) { ostringstream out; out << preamble << endl; BOOST_FOREACH(const SyncConfig::ConfigList::value_type &server,servers) { out << " " << server.first << " = " << server.second <m_templateId << " = " << server->m_description; if (printRank){ out << " " << server->m_rank *20 << "%"; } out << endl; } if (!templates.size()) { out << " none" << endl; } SE_LOG(NULL, level, "%s", out.str().c_str()); } void Cmdline::dumpProperties(const ConfigNode &configuredProps, const ConfigPropertyRegistry &allProps, int flags) { list perPeer, perContext, global; ostringstream out; BOOST_FOREACH(const ConfigProperty *prop, allProps) { if (prop->isHidden() || ((flags & HIDE_PER_PEER) && prop->getSharing() == ConfigProperty::NO_SHARING)) { continue; } if (!m_quiet) { string comment = prop->getComment(); if (!comment.empty()) { out << endl; dumpComment(out, "# ", comment); } } InitStateString value = prop->getProperty(configuredProps); if (!value.wasSet()) { out << "# "; } out << prop->getMainName() << " = " << value.get() << endl; list *type = NULL; switch (prop->getSharing()) { case ConfigProperty::GLOBAL_SHARING: type = &global; break; case ConfigProperty::SOURCE_SET_SHARING: type = &perContext; break; case ConfigProperty::NO_SHARING: type = &perPeer; break; } if (type) { type->push_back(prop->getMainName()); } } if (!m_quiet && !(flags & HIDE_LEGEND)) { if (!perPeer.empty() || !perContext.empty() || !global.empty()) { out << endl; } if (!perPeer.empty()) { out << "# per-peer (unshared) properties: " << boost::join(perPeer, ", ") << endl; } if (!perContext.empty()) { out << "# shared by peers in same context: " << boost::join(perContext, ", ") << endl; } if (!global.empty()) { out << "# global properties: " << boost::join(global, ", ") << endl; } } SE_LOG_SHOW(NULL, "%s", out.str().c_str()); } void Cmdline::dumpComment(ostream &stream, const string &prefix, const string &comment) { list commentLines; ConfigProperty::splitComment(comment, commentLines); BOOST_FOREACH(const string &line, commentLines) { stream << prefix << line << endl; } } void Cmdline::usage(bool full, const string &error, const string ¶m) { SE_LOG_SHOW(NULL, "%s", synopsis); if (full) { SE_LOG_SHOW(NULL, "\nOptions:\n%s", options); } if (error != "") { SE_LOG_SHOW(NULL, "\n"); SE_LOG_ERROR(NULL, "%s", error.c_str()); } if (param != "") { SE_LOG_INFO(NULL, "use '%s%s?' to get a list of valid parameters", param.c_str(), boost::ends_with(param, "=") ? "" : " "); } } bool Cmdline::needConfigName() { if (m_server.empty()) { usage(false, "No configuration name specified."); return false; } else { return true; } } SyncContext* Cmdline::createSyncClient() { return new SyncContext(m_server, true); } #ifdef ENABLE_UNIT_TESTS /** simple line-by-line diff */ static string diffStrings(const string &lhs, const string &rhs) { ostringstream res; typedef boost::split_iterator string_split_iterator; string_split_iterator lit = boost::make_split_iterator(lhs, boost::first_finder("\n", boost::is_iequal())); string_split_iterator rit = boost::make_split_iterator(rhs, boost::first_finder("\n", boost::is_iequal())); while (lit != string_split_iterator() && rit != string_split_iterator()) { if (*lit != *rit) { res << "< " << *lit << endl; res << "> " << *rit << endl; } ++lit; ++rit; } while (lit != string_split_iterator()) { res << "< " << *lit << endl; ++lit; } while (rit != string_split_iterator()) { res << "> " << *rit << endl; ++rit; } return res.str(); } # define CPPUNIT_ASSERT_EQUAL_DIFF( expected, actual ) \ do { \ string expected_ = (expected); \ string actual_ = (actual); \ if (expected_ != actual_) { \ CPPUNIT_NS::Message cpputMsg_(string("expected:\n") + \ expected_); \ cpputMsg_.addDetail(string("actual:\n") + \ actual_); \ cpputMsg_.addDetail(string("diff:\n") + \ diffStrings(expected_, actual_)); \ CPPUNIT_NS::Asserter::fail( cpputMsg_, \ CPPUNIT_SOURCELINE() ); \ } \ } while ( false ) // true if = static bool isPropAssignment(const string &buffer) { // ignore these comments (occur in type description) if (boost::starts_with(buffer, "KCalExtended = ") || boost::starts_with(buffer, "mkcal = ") || boost::starts_with(buffer, "QtContacts = ")) { return false; } size_t start = 0; while (start < buffer.size() && !isspace(buffer[start])) { start++; } if (start + 3 <= buffer.size() && buffer.substr(start, 3) == " = ") { return true; } else { return false; } } // remove pure comment lines from buffer, // also empty lines, // also defaultPeer and keyring (because reference properties do not include global props) static string filterConfig(const string &buffer) { ostringstream res; typedef boost::split_iterator string_split_iterator; for (string_split_iterator it = boost::make_split_iterator(buffer, boost::first_finder("\n", boost::is_iequal())); it != string_split_iterator(); ++it) { string line = boost::copy_range(*it); if (!line.empty() && line.find("defaultPeer =") == line.npos && line.find("keyring =") == line.npos && (!boost::starts_with(line, "# ") || isPropAssignment(line.substr(2)))) { res << line << endl; } } return res.str(); } static string removeComments(const string &buffer) { ostringstream res; typedef boost::split_iterator string_split_iterator; for (string_split_iterator it = boost::make_split_iterator(buffer, boost::first_finder("\n", boost::is_iequal())); it != string_split_iterator(); ++it) { string line = boost::copy_range(*it); if (!line.empty() && !boost::starts_with(line, "#")) { res << line << endl; } } return res.str(); } static string injectValues(const string &buffer) { string res = buffer; #if 0 // username/password not set in templates, only in configs created // via the command line - not anymore, but if it ever comes back, // here's the place for it boost::replace_first(res, "# username = ", "username = your SyncML server account name"); boost::replace_first(res, "# password = ", "password = your SyncML server password"); #endif return res; } // remove lines indented with spaces static string filterIndented(const string &buffer) { ostringstream res; bool first = true; typedef boost::split_iterator string_split_iterator; for (string_split_iterator it = boost::make_split_iterator(buffer, boost::first_finder("\n", boost::is_iequal())); it != string_split_iterator(); ++it) { if (!boost::starts_with(*it, " ")) { if (!first) { res << endl; } else { first = false; } res << *it; } } return res.str(); } // sort lines by file, preserving order inside each line static void sortConfig(string &config) { // file name, line number, property typedef pair > line_t; vector lines; typedef boost::split_iterator string_split_iterator; int linenr = 0; for (string_split_iterator it = boost::make_split_iterator(config, boost::first_finder("\n", boost::is_iequal())); it != string_split_iterator(); ++it, ++linenr) { string line(it->begin(), it->end()); if (line.empty()) { continue; } size_t colon = line.find(':'); string prefix = line.substr(0, colon); lines.push_back(make_pair(prefix, make_pair(linenr, line.substr(colon)))); } // stable sort because of line number sort(lines.begin(), lines.end()); size_t len = config.size(); config.resize(0); config.reserve(len); BOOST_FOREACH(const line_t &line, lines) { config += line.first; config += line.second.second; config += "\n"; } } // convert the internal config dump to .ini style (--print-config) static string internalToIni(const string &config) { ostringstream res; string section; typedef boost::split_iterator string_split_iterator; for (string_split_iterator it = boost::make_split_iterator(config, boost::first_finder("\n", boost::is_iequal())); it != string_split_iterator(); ++it) { string line(it->begin(), it->end()); if (line.empty()) { continue; } size_t colon = line.find(':'); string prefix = line.substr(0, colon); // internal values are not part of the --print-config output if (boost::contains(prefix, ".internal.ini") || boost::contains(line, "= internal value")) { continue; } // --print-config also doesn't duplicate the "type" property // => remove the shared property if (boost::contains(line, ":type = ") && boost::starts_with(line, "sources/")) { continue; } // sources//config.ini or // spds/sources//config.ini size_t endslash = prefix.rfind('/'); if (endslash != line.npos && endslash > 1) { size_t slash = prefix.rfind('/', endslash - 1); if (slash != line.npos) { string newsource = prefix.substr(slash + 1, endslash - slash - 1); if (newsource != section && prefix.find("/sources/") != prefix.npos && newsource != "syncml") { res << "[" << newsource << "]" << endl; section = newsource; } } } string assignment = line.substr(colon + 1); // substitude aliases with generic values boost::replace_first(assignment, "= syncml:auth-md5", "= md5"); boost::replace_first(assignment, "= syncml:auth-basix", "= basic"); res << assignment << endl; } return res.str(); } /** result of removeComments(filterRandomUUID(filterConfig())) for Google Calendar template/config */ static const std::string google = "syncURL = https://apidata.googleusercontent.com/caldav/v2 https://www.googleapis.com/.well-known/carddav https://www.google.com/calendar/dav\n" "printChanges = 0\n" "dumpData = 0\n" "deviceId = fixed-devid\n" "IconURI = image://themedimage/icons/services/google\n" "ConsumerReady = 1\n" "peerType = WebDAV\n" "[addressbook]\n" "sync = two-way\n" "backend = CardDAV\n" "[calendar]\n" "sync = two-way\n" "backend = CalDAV\n"; /** result of removeComments(filterRandomUUID(filterConfig())) for Yahoo Calendar + Contacts */ static const std::string yahoo = "printChanges = 0\n" "dumpData = 0\n" "deviceId = fixed-devid\n" "IconURI = image://themedimage/icons/services/yahoo\n" "ConsumerReady = 1\n" "peerType = WebDAV\n" "[addressbook]\n" "sync = disabled\n" "backend = CardDAV\n" "[calendar]\n" "sync = two-way\n" "backend = CalDAV\n"; // Expected content of config.ini file depends on whether // a keyring is enabled or not. static const char DATABASE_PASSWORD_BAR[] = #ifdef HAVE_KEYRING // In keyring. "databasePassword = -" #else // In file. "databasePassword = bar" #endif ; /** * Testing is based on a text representation of a directory * hierarchy where each line is of the format * : * * The order of files is alphabetical, of lines in the file as * in the file. Lines in the file without line break cannot * be represented. * * The root of the hierarchy is not part of the representation * itself. */ class CmdlineTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(CmdlineTest); CPPUNIT_TEST(testFramework); CPPUNIT_TEST(testSetupScheduleWorld); CPPUNIT_TEST(testFutureConfig); CPPUNIT_TEST(testPeerConfigMigration); CPPUNIT_TEST(testContextConfigMigration); CPPUNIT_TEST(testSetupDefault); CPPUNIT_TEST(testSetupRenamed); CPPUNIT_TEST(testSetupFunambol); CPPUNIT_TEST(testSetupSynthesis); CPPUNIT_TEST(testPrintServers); CPPUNIT_TEST(testPrintFileTemplates); CPPUNIT_TEST(testPrintFileTemplatesConfig); CPPUNIT_TEST(testTemplate); CPPUNIT_TEST(testMatchTemplate); CPPUNIT_TEST(testAddSource); CPPUNIT_TEST(testSync); CPPUNIT_TEST(testKeyring); CPPUNIT_TEST(testWebDAV); CPPUNIT_TEST(testConfigure); CPPUNIT_TEST(testConfigureSources); CPPUNIT_TEST(testOldConfigure); CPPUNIT_TEST(testMigrate); CPPUNIT_TEST(testMigrateContext); CPPUNIT_TEST(testMigrateAutoSync); CPPUNIT_TEST_SUITE_END(); public: CmdlineTest() : m_testDir("CmdlineTest") { } void setUp() { rm_r(m_testDir); mkdir_p(m_testDir); } protected: /** verify that createFiles/scanFiles themselves work */ void testFramework() { const string root(m_testDir); const string content("baz:line\n" "caz/subdir:booh\n" "caz/subdir2/sub:# comment\n" "caz/subdir2/sub:# foo = bar\n" "caz/subdir2/sub:# empty = \n" "caz/subdir2/sub:# another comment\n" "foo:bar1\n" "foo:\n" "foo: \n" "foo:bar2\n"); const string filtered("baz:line\n" "caz/subdir:booh\n" "caz/subdir2/sub:# foo = bar\n" "caz/subdir2/sub:# empty = \n" "foo:bar1\n" "foo: \n" "foo:bar2\n"); createFiles(root, content); string res = scanFiles(root); CPPUNIT_ASSERT_EQUAL_DIFF(filtered, res); } void removeRandomUUID(string &buffer) { string uuidstr = "deviceId = syncevolution-"; size_t uuid = buffer.find(uuidstr); CPPUNIT_ASSERT(uuid != buffer.npos); size_t end = buffer.find("\n", uuid + uuidstr.size()); CPPUNIT_ASSERT(end != buffer.npos); buffer.replace(uuid, end - uuid, "deviceId = fixed-devid"); } string filterRandomUUID(const string &buffer) { string copy = buffer; removeRandomUUID(copy); return copy; } /** create new configurations */ void testSetupScheduleWorld() { doSetupScheduleWorld(false); } void doSetupScheduleWorld(bool shared) { string root; ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); root = m_testDir; root += "/syncevolution/default"; string peer; if (shared) { peer = root + "/peers/scheduleworld"; } else { peer = root; } { rm_r(peer); TestCmdline cmdline("--configure", "--sync-property", "proxyHost = proxy", "scheduleworld", "addressbook", NULL); cmdline.doit(); string res = scanFiles(root); removeRandomUUID(res); string expected = ScheduleWorldConfig(); sortConfig(expected); boost::replace_first(expected, "# proxyHost = ", "proxyHost = proxy"); boost::replace_all(expected, "sync = two-way", "sync = disabled"); boost::replace_first(expected, "addressbook/config.ini:sync = disabled", "addressbook/config.ini:sync = two-way"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } { rm_r(peer); TestCmdline cmdline("--configure", "--sync-property", "deviceID = fixed-devid", "scheduleworld", NULL); cmdline.doit(); string res = scanFiles(root); string expected = ScheduleWorldConfig(); sortConfig(expected); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } } void expectTooOld() { bool caught = false; try { SyncConfig config("scheduleworld"); } catch (const StatusException &ex) { caught = true; if (ex.syncMLStatus() != STATUS_RELEASE_TOO_OLD) { throw; } else { CPPUNIT_ASSERT_EQUAL(StringPrintf("SyncEvolution %s is too old to read configuration 'scheduleworld', please upgrade SyncEvolution.", VERSION), string(ex.what())); } } CPPUNIT_ASSERT(caught); } void testFutureConfig() { ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); doSetupScheduleWorld(false); // bump min/cur version to something not supported, then // try to read => should fail IniFileConfigNode root(m_testDir, "/syncevolution/.internal.ini", false); IniFileConfigNode context(m_testDir + "/syncevolution/default", ".internal.ini", false); IniFileConfigNode peer(m_testDir + "/syncevolution/default/peers/scheduleworld", ".internal.ini", false); root.setProperty("rootMinVersion", StringPrintf("%d", CONFIG_ROOT_MIN_VERSION + 1)); root.setProperty("rootCurVersion", StringPrintf("%d", CONFIG_ROOT_CUR_VERSION + 1)); root.flush(); context.setProperty("contextMinVersion", StringPrintf("%d", CONFIG_CONTEXT_MIN_VERSION + 1)); context.setProperty("contextCurVersion", StringPrintf("%d", CONFIG_CONTEXT_CUR_VERSION + 1)); context.flush(); peer.setProperty("peerMinVersion", StringPrintf("%d", CONFIG_PEER_MIN_VERSION + 1)); peer.setProperty("peerCurVersion", StringPrintf("%d", CONFIG_PEER_CUR_VERSION + 1)); peer.flush(); expectTooOld(); root.setProperty("rootMinVersion", StringPrintf("%d", CONFIG_ROOT_MIN_VERSION)); root.flush(); expectTooOld(); context.setProperty("contextMinVersion", StringPrintf("%d", CONFIG_CONTEXT_MIN_VERSION)); context.flush(); expectTooOld(); // okay now peer.setProperty("peerMinVersion", StringPrintf("%d", CONFIG_PEER_MIN_VERSION)); peer.flush(); SyncConfig config("scheduleworld"); } void expectMigration(const std::string &config) { bool caught = false; try { SyncConfig c(config); c.prepareConfigForWrite(); } catch (const StatusException &ex) { caught = true; if (ex.syncMLStatus() != STATUS_MIGRATION_NEEDED) { throw; } else { CPPUNIT_ASSERT_EQUAL(StringPrintf("Proceeding would modify config '%s' such that the " "previous SyncEvolution release will not be able to use it. " "Stopping now. Please explicitly acknowledge this step by " "running the following command on the command line: " "syncevolution --migrate '%s'", config.c_str(), config.c_str()), string(ex.what())); } } CPPUNIT_ASSERT(caught); } void testPeerConfigMigration() { ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); doSetupScheduleWorld(false); // decrease min/cur version to something no longer supported, // then try to write => should migrate in release mode and fail otherwise IniFileConfigNode peer(m_testDir + "/syncevolution/default/peers/scheduleworld", ".internal.ini", false); peer.setProperty("peerMinVersion", StringPrintf("%d", CONFIG_PEER_CUR_VERSION - 1)); peer.setProperty("peerCurVersion", StringPrintf("%d", CONFIG_PEER_CUR_VERSION - 1)); peer.flush(); SyncContext::setStableRelease(false); expectMigration("scheduleworld"); SyncContext::setStableRelease(true); { SyncConfig config("scheduleworld"); config.prepareConfigForWrite(); } { TestCmdline cmdline("--print-servers", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Configured servers:\n" " scheduleworld = CmdlineTest/syncevolution/default/peers/scheduleworld\n" " scheduleworld.old = CmdlineTest/syncevolution/default/peers/scheduleworld.old\n", cmdline.m_out.str()); } // should be okay now SyncContext::setStableRelease(false); { SyncConfig config("scheduleworld"); config.prepareConfigForWrite(); } // do the same migration with command line SyncContext::setStableRelease(false); rm_r(m_testDir + "/syncevolution/default/peers/scheduleworld"); CPPUNIT_ASSERT_EQUAL(0, rename((m_testDir + "/syncevolution/default/peers/scheduleworld.old").c_str(), (m_testDir + "/syncevolution/default/peers/scheduleworld").c_str())); { TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); } { SyncConfig config("scheduleworld"); config.prepareConfigForWrite(); } { TestCmdline cmdline("--print-servers", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Configured servers:\n" " scheduleworld = CmdlineTest/syncevolution/default/peers/scheduleworld\n" " scheduleworld.old = CmdlineTest/syncevolution/default/peers/scheduleworld.old\n", cmdline.m_out.str()); } } void testContextConfigMigration() { ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); doSetupScheduleWorld(false); // decrease min/cur version to something no longer supported, // then try to write => should migrate in release mode and fail otherwise IniFileConfigNode context(m_testDir + "/syncevolution/default", ".internal.ini", false); context.setProperty("contextMinVersion", StringPrintf("%d", CONFIG_CONTEXT_CUR_VERSION - 1)); context.setProperty("contextCurVersion", StringPrintf("%d", CONFIG_CONTEXT_CUR_VERSION - 1)); context.flush(); SyncContext::setStableRelease(false); expectMigration("@default"); SyncContext::setStableRelease(true); { SyncConfig config("@default"); config.prepareConfigForWrite(); } { TestCmdline cmdline("--print-servers", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Configured servers:\n" " scheduleworld = CmdlineTest/syncevolution/default/peers/scheduleworld\n" " scheduleworld.old@default.old = CmdlineTest/syncevolution/default.old/peers/scheduleworld.old\n", cmdline.m_out.str()); } // should be okay now SyncContext::setStableRelease(false); { SyncConfig config("@default"); config.prepareConfigForWrite(); } // do the same migration with command line SyncContext::setStableRelease(false); rm_r(m_testDir + "/syncevolution/default"); CPPUNIT_ASSERT_EQUAL(0, rename((m_testDir + "/syncevolution/default.old/peers/scheduleworld.old").c_str(), (m_testDir + "/syncevolution/default.old/peers/scheduleworld").c_str())); CPPUNIT_ASSERT_EQUAL(0, rename((m_testDir + "/syncevolution/default.old").c_str(), (m_testDir + "/syncevolution/default").c_str())); { TestCmdline cmdline("--migrate", "@default", NULL); cmdline.doit(); } { SyncConfig config("@default"); config.prepareConfigForWrite(); } { TestCmdline cmdline("--print-servers", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Configured servers:\n" " scheduleworld = CmdlineTest/syncevolution/default/peers/scheduleworld\n" " scheduleworld.old@default.old = CmdlineTest/syncevolution/default.old/peers/scheduleworld.old\n", cmdline.m_out.str()); } } void testSetupDefault() { string root; ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); root = m_testDir; root += "/syncevolution/default"; TestCmdline cmdline("--configure", "--template", "default", "--sync-property", "deviceID = fixed-devid", "some-other-server", NULL); cmdline.doit(); string res = scanFiles(root, "some-other-server"); string expected = DefaultConfig(); sortConfig(expected); boost::replace_all(expected, "/syncevolution/", "/some-other-server/"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } void testSetupRenamed() { string root; ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); root = m_testDir; root += "/syncevolution/default"; TestCmdline cmdline("--configure", "--template", "scheduleworld", "--sync-property", "deviceID = fixed-devid", "scheduleworld2", NULL); cmdline.doit(); string res = scanFiles(root, "scheduleworld2"); string expected = ScheduleWorldConfig(); sortConfig(expected); boost::replace_all(expected, "/scheduleworld/", "/scheduleworld2/"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } void testSetupFunambol() { doSetupFunambol(false); } void doSetupFunambol(bool shared) { string root; ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); root = m_testDir; root += "/syncevolution/default"; string peer; if (shared) { peer = root + "/peers/funambol"; } else { peer = root; } rm_r(peer); const char * const argv_fixed[] = { "--configure", "--sync-property", "deviceID = fixed-devid", // templates are case-insensitive "FunamBOL", NULL }, * const argv_shared[] = { "--configure", "FunamBOL", NULL }; TestCmdline cmdline(shared ? argv_shared : argv_fixed); cmdline.doit(); string res = scanFiles(root, "funambol"); string expected = FunambolConfig(); sortConfig(expected); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } void testSetupSynthesis() { doSetupSynthesis(false); } void doSetupSynthesis(bool shared) { string root; ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); root = m_testDir; root += "/syncevolution/default"; string peer; if (shared) { peer = root + "/peers/synthesis"; } else { peer = root; } rm_r(peer); const char * const argv_fixed[] = { "--configure", "--sync-property", "deviceID = fixed-devid", "synthesis", NULL }, * const argv_shared[] = { "--configure", "synthesis", NULL }; TestCmdline cmdline(shared ? argv_shared : argv_fixed); cmdline.doit(); string res = scanFiles(root, "synthesis"); string expected = SynthesisConfig(); sortConfig(expected); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } void testTemplate() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); TestCmdline failure("--template", NULL); CPPUNIT_ASSERT(!failure.m_cmdline->parse()); CPPUNIT_ASSERT_NO_THROW(failure.expectUsageError("[ERROR] missing parameter for '--template'\n")); TestCmdline help("--template", "? ", NULL); help.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates (servers):\n" " template name = template description\n" " eGroupware = http://www.egroupware.org\n" " Funambol = https://onemediahub.com\n" " Google = event and contact sync via CalDAV/CardDAV, use for the 'target-config@google' config\n" " Goosync = http://www.goosync.com/\n" " Memotoo = http://www.memotoo.com\n" " Mobical = https://www.everdroid.com\n" " Oracle = http://www.oracle.com/technology/products/beehive/index.html\n" " Ovi = http://www.ovi.com\n" " ScheduleWorld = server no longer in operation\n" " SyncEvolution = http://www.syncevolution.org\n" " Synthesis = http://www.synthesis.ch\n" " WebDAV = contact and event sync using WebDAV, use for the 'target-config@' config\n" " Yahoo = contact and event sync using WebDAV, use for the 'target-config@yahoo' config\n", help.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", help.m_err.str()); } void testMatchTemplate() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "testcases/templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", "/dev/null"); TestCmdline help1("--template", "?nokia 7210c", NULL); help1.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates (clients):\n" " template name = template description matching score in percent (100% = exact match)\n" " Nokia_7210c = Template for Nokia S40 series Phone 100%\n" " SyncEvolution_Client = SyncEvolution server side template 40%\n", help1.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", help1.m_err.str()); TestCmdline help2("--template", "?nokia", NULL); help2.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates (clients):\n" " template name = template description matching score in percent (100% = exact match)\n" " Nokia_7210c = Template for Nokia S40 series Phone 100%\n" " SyncEvolution_Client = SyncEvolution server side template 40%\n", help2.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", help2.m_err.str()); TestCmdline help3("--template", "?7210c", NULL); help3.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates (clients):\n" " template name = template description matching score in percent (100% = exact match)\n" " Nokia_7210c = Template for Nokia S40 series Phone 60%\n" " SyncEvolution_Client = SyncEvolution server side template 20%\n", help3.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", help3.m_err.str()); TestCmdline help4("--template", "?syncevolution client", NULL); help4.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Available configuration templates (clients):\n" " template name = template description matching score in percent (100% = exact match)\n" " SyncEvolution_Client = SyncEvolution server side template 100%\n" " Nokia_7210c = Template for Nokia S40 series Phone 40%\n", help4.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", help4.m_err.str()); } void testPrintServers() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); doSetupScheduleWorld(false); doSetupSynthesis(true); doSetupFunambol(true); TestCmdline cmdline("--print-servers", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("Configured servers:\n" " funambol = CmdlineTest/syncevolution/default/peers/funambol\n" " scheduleworld = CmdlineTest/syncevolution/default/peers/scheduleworld\n" " synthesis = CmdlineTest/syncevolution/default/peers/synthesis\n", cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); } void testPrintFileTemplates() { // use local copy of templates in build dir (no need to install) ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "./templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); doPrintFileTemplates(); } void testPrintFileTemplatesConfig() { // simulate reading templates from user's XDG HOME CPPUNIT_ASSERT(!symlink("../templates", (m_testDir + "/syncevolution-templates").c_str())); ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "/dev/null"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); doPrintFileTemplates(); } void doPrintFileTemplates() { // Compare only the properties which are really set. // // note that "backend" will be take from the @default context if one // exists, so run this before setting up Funambol below { TestCmdline cmdline("--print-config", "--template", "google", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF(google, removeComments(filterRandomUUID(filterConfig(cmdline.m_out.str())))); } { TestCmdline cmdline("--print-config", "--template", "yahoo", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF(yahoo, removeComments(filterRandomUUID(filterConfig(cmdline.m_out.str())))); } testSetupFunambol(); { TestCmdline cmdline("--print-config", "--template", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); string actual = cmdline.m_out.str(); // deviceId must be the one from Funambol CPPUNIT_ASSERT(boost::contains(actual, "deviceId = fixed-devid")); string filtered = injectValues(filterConfig(actual)); CPPUNIT_ASSERT_EQUAL_DIFF(filterConfig(internalToIni(ScheduleWorldConfig())), filtered); // there should have been comments CPPUNIT_ASSERT(actual.size() > filtered.size()); } { TestCmdline cmdline("--print-config", "funambol", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF(filterConfig(internalToIni(FunambolConfig())), injectValues(filterConfig(cmdline.m_out.str()))); } } void testAddSource() { string root; ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); testSetupScheduleWorld(); root = m_testDir; root += "/syncevolution/default"; { TestCmdline cmdline("--configure", // Intentionally use legacy parameter name here. "--datastore-property", "uri = dummy", "scheduleworld", "xyz", NULL); cmdline.doit(); string res = scanFiles(root); string expected = ScheduleWorldConfig(); expected += "\n" "peers/scheduleworld/sources/xyz/.internal.ini:# adminData = \n" "peers/scheduleworld/sources/xyz/.internal.ini:# synthesisID = 0\n" "peers/scheduleworld/sources/xyz/config.ini:# sync = disabled\n" "peers/scheduleworld/sources/xyz/config.ini:uri = dummy\n" "peers/scheduleworld/sources/xyz/config.ini:# syncFormat = \n" "peers/scheduleworld/sources/xyz/config.ini:# forceSyncFormat = 0\n" "sources/xyz/config.ini:# backend = select backend\n" "sources/xyz/config.ini:# database = \n" "sources/xyz/config.ini:# databaseFormat = \n" "sources/xyz/config.ini:# databaseUser = \n" "sources/xyz/config.ini:# databasePassword = "; sortConfig(expected); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); } } void testSync() { TestCmdline failure("--sync", NULL); CPPUNIT_ASSERT(!failure.m_cmdline->parse()); CPPUNIT_ASSERT_NO_THROW(failure.expectUsageError("[ERROR] missing parameter for '--sync'\n")); TestCmdline failure2("--sync", "foo", NULL); CPPUNIT_ASSERT(!failure2.m_cmdline->parse()); CPPUNIT_ASSERT_EQUAL_DIFF("", failure2.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("[ERROR] '--sync foo': not one of the valid values (two-way, slow, refresh-from-local, refresh-from-remote = refresh, one-way-from-local, one-way-from-remote = one-way, refresh-from-client = refresh-client, refresh-from-server = refresh-server, one-way-from-client = one-way-client, one-way-from-server = one-way-server, local-cache-slow, local-cache-incremental = local-cache, disabled = none)\n", failure2.m_err.str()); TestCmdline failure3("--sync=foo", NULL); CPPUNIT_ASSERT(!failure3.m_cmdline->parse()); CPPUNIT_ASSERT_EQUAL_DIFF("", failure3.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("[ERROR] '--sync=foo': not one of the valid values (two-way, slow, refresh-from-local, refresh-from-remote = refresh, one-way-from-local, one-way-from-remote = one-way, refresh-from-client = refresh-client, refresh-from-server = refresh-server, one-way-from-client = one-way-client, one-way-from-server = one-way-server, local-cache-slow, local-cache-incremental = local-cache, disabled = none)\n", failure3.m_err.str()); TestCmdline help("--sync", " ?", NULL); help.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("--sync\n" " Requests a certain synchronization mode when initiating a sync:\n" " \n" " two-way\n" " only send/receive changes since last sync\n" " slow\n" " exchange all items\n" " refresh-from-remote\n" " discard all local items and replace with\n" " the items on the peer\n" " refresh-from-local\n" " discard all items on the peer and replace\n" " with the local items\n" " one-way-from-remote\n" " transmit changes from peer\n" " one-way-from-local\n" " transmit local changes\n" " local-cache-slow (server only)\n" " mirror remote data locally, transferring all data\n" " local-cache-incremental (server only)\n" " mirror remote data locally, transferring only changes;\n" " falls back to local-cache-slow automatically if necessary\n" " disabled (or none)\n" " synchronization disabled\n" " \n" " refresh/one-way-from-server/client are also supported. Their use is\n" " discouraged because the direction of the data transfer depends\n" " on the role of the local side (can be server or client), which is\n" " not always obvious.\n" " \n" " When accepting a sync session in a SyncML server (HTTP server), only\n" " datastores with sync != disabled are made available to the client,\n" " which chooses the final sync mode based on its own configuration.\n" " When accepting a sync session in a SyncML client (local sync with\n" " the server contacting SyncEvolution on a device), the sync mode\n" " specified in the client is typically overriden by the server.\n", help.m_out.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", help.m_err.str()); TestCmdline filter("--sync", "refresh-from-server", NULL); CPPUNIT_ASSERT(filter.m_cmdline->parse()); CPPUNIT_ASSERT(!filter.m_cmdline->run()); CPPUNIT_ASSERT_NO_THROW(filter.expectUsageError("[ERROR] No configuration name specified.\n")); CPPUNIT_ASSERT_EQUAL_DIFF("sync = refresh-from-server", string(filter.m_cmdline->m_props[""].m_sourceProps[""])); CPPUNIT_ASSERT_EQUAL_DIFF("", string(filter.m_cmdline->m_props[""].m_syncProps)); TestCmdline filter2("--datastore-property", "sync=refresh", NULL); CPPUNIT_ASSERT(filter2.m_cmdline->parse()); CPPUNIT_ASSERT(!filter2.m_cmdline->run()); CPPUNIT_ASSERT_NO_THROW(filter2.expectUsageError("[ERROR] No configuration name specified.\n")); CPPUNIT_ASSERT_EQUAL_DIFF("sync = refresh", string(filter2.m_cmdline->m_props[""].m_sourceProps[""])); CPPUNIT_ASSERT_EQUAL_DIFF("", string(filter2.m_cmdline->m_props[""].m_syncProps)); TestCmdline filter3("--datastore-property", "xyz=1", NULL); CPPUNIT_ASSERT(!filter3.m_cmdline->parse()); CPPUNIT_ASSERT_EQUAL(string(""), filter3.m_out.str()); CPPUNIT_ASSERT_EQUAL(string("[ERROR] '--datastore-property xyz=1': no such property\n"), filter3.m_err.str()); TestCmdline filter4("xyz=1", NULL); CPPUNIT_ASSERT(!filter4.m_cmdline->parse()); CPPUNIT_ASSERT_NO_THROW(filter4.expectUsageError("[ERROR] unrecognized property in 'xyz=1'\n")); TestCmdline filter5("=1", NULL); CPPUNIT_ASSERT(!filter5.m_cmdline->parse()); CPPUNIT_ASSERT_NO_THROW(filter5.expectUsageError("[ERROR] a property name must be given in '=1'\n")); } void testKeyring() { ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); rm_r(m_testDir); { TestCmdline cmdline(NULL, NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(false, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--keyring", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--sync-property", "keyring=True", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("keyring=True", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--keyring=true", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--keyring=1", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--keyring=Yes", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--keyring=false", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_FALSE, keyring.getValue()); } { TestCmdline cmdline("--keyring=0", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_FALSE, keyring.getValue()); } { TestCmdline cmdline("--keyring=NO", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_FALSE, keyring.getValue()); } { TestCmdline cmdline("--keyring=GNOME", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_STRING, keyring.getValue()); CPPUNIT_ASSERT_EQUAL(std::string("GNOME"), keyring.get()); } // Broken command line: treated like a sync, but config doesn't exist. { TestCmdline cmdline("keyring=KDE", "@foobar", NULL); cmdline.doit(false); CPPUNIT_ASSERT_EQUAL(std::string(""), cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL(std::string("[INFO] Configuration \"@foobar\" does not refer to a sync peer.\n[ERROR] Cannot proceed with sync without a configuration."), cmdline.m_err.str()); } { TestCmdline cmdline("keyring=KDE", "nosuchpeer@foobar", NULL); cmdline.doit(false); CPPUNIT_ASSERT_EQUAL(std::string(""), cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL(std::string("[INFO] Configuration \"nosuchpeer@foobar\" does not exist.\n[ERROR] Cannot proceed with sync without a configuration."), cmdline.m_err.str()); } // empty config prop { TestCmdline cmdline("--configure", "@default", NULL); cmdline.doit(); } // Try broken command line again. { TestCmdline cmdline("keyring=KDE", "@foobar", NULL); cmdline.doit(false); CPPUNIT_ASSERT_EQUAL(std::string(""), cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL(std::string("[INFO] Configuration \"@foobar\" does not refer to a sync peer.\n[ERROR] Cannot proceed with sync without a configuration."), cmdline.m_err.str()); } { TestCmdline cmdline("keyring=KDE", "nosuchpeer@foobar", NULL); cmdline.doit(false); CPPUNIT_ASSERT_EQUAL(std::string(""), cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL(std::string("[INFO] Configuration \"nosuchpeer@foobar\" does not exist.\n[ERROR] Cannot proceed with sync without a configuration."), cmdline.m_err.str()); } { TestCmdline cmdline("@foobar", NULL); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(false, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } // now set the value permanently { TestCmdline cmdline("--keyring", "--configure", "@default", NULL); cmdline.doit(); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } { TestCmdline cmdline("--keyring=KDE", "--configure", "@default", NULL); cmdline.doit(); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_STRING, keyring.getValue()); CPPUNIT_ASSERT_EQUAL(std::string("KDE"), keyring.get()); } // create by setting keyring in @default, then update; // @default not strictly needed rm_r(m_testDir); { TestCmdline cmdline("keyring=KDE", "--configure", "@default", NULL); cmdline.doit(); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_STRING, keyring.getValue()); } { TestCmdline cmdline("keyring=yes", "--configure", "@default", NULL); cmdline.doit(); boost::shared_ptr context = cmdline.parse(); CPPUNIT_ASSERT(context); InitStateTri keyring = context->getKeyring(); CPPUNIT_ASSERT_EQUAL(true, keyring.wasSet()); CPPUNIT_ASSERT_EQUAL(InitStateTri::VALUE_TRUE, keyring.getValue()); } // allow sync operation although --keyring was set { TestCmdline cmdline("keyring=GNOME", "foobar@default", NULL); cmdline.doit(false); CPPUNIT_ASSERT_EQUAL(std::string(""), cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL(std::string("[INFO] Configuration \"foobar@default\" does not exist.\n[ERROR] Cannot proceed with sync without a configuration."), cmdline.m_err.str()); } // catch invalid "keyring" value { TestCmdline cmdline("--configure", "username=foo", "password=bar", "syncURL=http://no.such.server", "keyring=no-such-keyring", "foobar@default", NULL); cmdline.doit(false); CPPUNIT_ASSERT_EQUAL(std::string(""), cmdline.m_out.str()); CPPUNIT_ASSERT_EQUAL(std::string("[INFO] addressbook: inactive\n" "[INFO] calendar: inactive\n" "[INFO] memo: inactive\n" "[INFO] todo: inactive\n" "[ERROR] Unsupported value for the \"keyring\" property, no such keyring found: no-such-keyring"), cmdline.m_err.str()); } } void testWebDAV() { #ifdef ENABLE_DAV ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); // configure Yahoo under a different name, with explicit template selection { TestCmdline cmdline("--configure", "--template", "yahoo", "target-config@my-yahoo", NULL); cmdline.doit(); } { TestCmdline cmdline("--print-config", "target-config@my-yahoo", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF(yahoo, removeComments(filterRandomUUID(filterConfig(cmdline.m_out.str())))); } // configure Google Calendar/Contacts with template derived from config name { TestCmdline cmdline("--configure", "target-config@google", NULL); cmdline.doit(); } { TestCmdline cmdline("--print-config", "target-config@google", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF(google, removeComments(filterRandomUUID(filterConfig(cmdline.m_out.str())))); } // test "template not found" error cases { TestCmdline cmdline("--configure", "--template", "yahooxyz", "target-config@my-yahoo-xyz", NULL); CPPUNIT_ASSERT(cmdline.m_cmdline->parse()); CPPUNIT_ASSERT(!cmdline.m_cmdline->run()); static const char error[] = "[ERROR] No configuration template for 'yahooxyz' available.\n" "[INFO] \n" "[INFO] Available configuration templates (clients and servers):\n"; std::string out = cmdline.m_out.str(); std::string err = cmdline.m_err.str(); std::string all = cmdline.m_all.str(); CPPUNIT_ASSERT(boost::starts_with(err, error)); CPPUNIT_ASSERT(boost::ends_with(err, "\n")); CPPUNIT_ASSERT(!boost::ends_with(err, "\n\n")); CPPUNIT_ASSERT_EQUAL(string(""), out); CPPUNIT_ASSERT_EQUAL(all, err); } { TestCmdline cmdline("--configure", "target-config@foobar", NULL); CPPUNIT_ASSERT(cmdline.m_cmdline->parse()); CPPUNIT_ASSERT(!cmdline.m_cmdline->run()); static const char error[] = "[ERROR] No configuration template for 'foobar' available.\n" "[INFO] Use '--template none' and/or specify relevant properties on the command line to create a configuration without a template. Need values for: syncURL\n" "[INFO] \n" "[INFO] Available configuration templates (clients and servers):\n"; std::string out = cmdline.m_out.str(); std::string err = cmdline.m_err.str(); std::string all = cmdline.m_all.str(); CPPUNIT_ASSERT(boost::starts_with(err, error)); CPPUNIT_ASSERT(boost::ends_with(err, "\n")); CPPUNIT_ASSERT(!boost::ends_with(err, "\n\n")); CPPUNIT_ASSERT_EQUAL(string(""), out); CPPUNIT_ASSERT_EQUAL(err, all); } #endif } void testConfigure() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); testSetupScheduleWorld(); string expected = doConfigure(ScheduleWorldConfig(), "sources/addressbook/config.ini:"); { // updating "type" for peer is mapped to updating "backend", // "databaseFormat", "syncFormat", "forceSyncFormat" TestCmdline cmdline("--configure", "--datastore-property", "addressbook/type=file:text/vcard:3.0", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); boost::replace_first(expected, "backend = addressbook", "backend = file"); boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, filterConfig(printConfig("scheduleworld"))); string shared = filterConfig(printConfig("@default")); CPPUNIT_ASSERT(shared.find("backend = file") != shared.npos); CPPUNIT_ASSERT(shared.find("databaseFormat = text/vcard") != shared.npos); } { // updating type for context must not affect peer TestCmdline cmdline("--configure", "--datastore-property", "type=file:text/x-vcard:2.1", "@default", "addressbook", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); boost::replace_first(expected, "databaseFormat = text/vcard", "databaseFormat = text/x-vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, filterConfig(printConfig("scheduleworld"))); string shared = filterConfig(printConfig("@default")); CPPUNIT_ASSERT(shared.find("backend = file") != shared.npos); CPPUNIT_ASSERT(shared.find("databaseFormat = text/x-vcard") != shared.npos); } string syncProperties("syncURL (no default, unshared, required)\n" "\n" "username (no default, unshared)\n" "\n" "password (no default, unshared)\n" "\n" "logdir (no default, shared)\n" "\n" "loglevel (0, unshared)\n" "\n" "notifyLevel (3, unshared)\n" "\n" "printChanges (TRUE, unshared)\n" "\n" "dumpData (TRUE, unshared)\n" "\n" "maxlogdirs (10, shared)\n" "\n" "autoSync (0, unshared)\n" "\n" "autoSyncInterval (30M, unshared)\n" "\n" "autoSyncDelay (5M, unshared)\n" "\n" "preventSlowSync (TRUE, unshared)\n" "\n" "useProxy (FALSE, unshared)\n" "\n" "proxyHost (no default, unshared)\n" "\n" "proxyUsername (no default, unshared)\n" "\n" "proxyPassword (no default, unshared)\n" "\n" "clientAuthType (md5, unshared)\n" "\n" "RetryDuration (5M, unshared)\n" "\n" "RetryInterval (2M, unshared)\n" "\n" "remoteIdentifier (no default, unshared)\n" "\n" "PeerIsClient (FALSE, unshared)\n" "\n" "SyncMLVersion (no default, unshared)\n" "\n" "PeerName (no default, unshared)\n" "\n" "deviceId (no default, shared)\n" "\n" "remoteDeviceId (no default, unshared)\n" "\n" "enableWBXML (TRUE, unshared)\n" "\n" "enableRefreshSync (FALSE, unshared)\n" "\n" "maxMsgSize (150000, unshared), maxObjSize (4000000, unshared)\n" "\n" "SSLServerCertificates (" SYNCEVOLUTION_SSL_SERVER_CERTIFICATES ", unshared)\n" "\n" "SSLVerifyServer (TRUE, unshared)\n" "\n" "SSLVerifyHost (TRUE, unshared)\n" "\n" "WebURL (no default, unshared)\n" "\n" "IconURI (no default, unshared)\n" "\n" "ConsumerReady (FALSE, unshared)\n" "\n" "peerType (no default, unshared)\n" "\n" "defaultPeer (no default, global)\n" "\n" "keyring (yes, global)\n"); string sourceProperties("sync (disabled, unshared, required)\n" "\n" "uri (no default, unshared)\n" "\n" "backend (select backend, shared)\n" "\n" "syncFormat (no default, unshared)\n" "\n" "forceSyncFormat (FALSE, unshared)\n" "\n" "database = evolutionsource (no default, shared)\n" "\n" "databaseFormat (no default, shared)\n" "\n" "databaseUser = evolutionuser (no default, shared), databasePassword = evolutionpassword (no default, shared)\n"); { TestCmdline cmdline("--sync-property", "?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF(syncProperties, filterIndented(cmdline.m_out.str())); } { TestCmdline cmdline("--datastore-property", "?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF(sourceProperties, filterIndented(cmdline.m_out.str())); } { TestCmdline cmdline("--datastore-property", "?", "--sync-property", "?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF(sourceProperties + syncProperties, filterIndented(cmdline.m_out.str())); } { TestCmdline cmdline("--sync-property", "?", "--datastore-property", "?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF(syncProperties + sourceProperties, filterIndented(cmdline.m_out.str())); } { TestCmdline cmdline("--datastore-property", "sync=?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("'--datastore-property sync=?'\n", filterIndented(cmdline.m_out.str())); } { TestCmdline cmdline("sync=?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("'sync=?'\n", filterIndented(cmdline.m_out.str())); } { TestCmdline cmdline("syncURL=?", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("'syncURL=?'\n", filterIndented(cmdline.m_out.str())); } } void testConfigureSources() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); // create from scratch with only addressbook configured { TestCmdline cmdline("--configure", "--datastore-property", "database = file://tmp/test", "--datastore-property", "type = file:text/x-vcard", "@foobar", "addressbook", NULL); cmdline.doit(); } string root = m_testDir; root += "/syncevolution/foobar"; string res = scanFiles(root); removeRandomUUID(res); string expected = StringPrintf(".internal.ini:contextMinVersion = %d\n" ".internal.ini:contextCurVersion = %d\n" "config.ini:# logdir = \n" "config.ini:# maxlogdirs = 10\n" "config.ini:deviceId = fixed-devid\n" "sources/addressbook/config.ini:backend = file\n" "sources/addressbook/config.ini:database = file://tmp/test\n" "sources/addressbook/config.ini:databaseFormat = text/x-vcard\n" "sources/addressbook/config.ini:# databaseUser = \n" "sources/addressbook/config.ini:# databasePassword = \n", CONFIG_CONTEXT_MIN_VERSION, CONFIG_CONTEXT_CUR_VERSION); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); // add unusable calendar: it is unusable because the file backend // cannot create the directory { TestCmdline cmdline("--configure", "--datastore-property", "database@foobar = file:///no-such-dir/test2", "--datastore-property", "backend = file", "@foobar", "calendar", NULL); cmdline.doit(); } res = scanFiles(root); removeRandomUUID(res); expected += "sources/calendar/config.ini:backend = file\n" "sources/calendar/config.ini:database = file:///no-such-dir/test2\n" "sources/calendar/config.ini:# databaseFormat = \n" "sources/calendar/config.ini:# databaseUser = \n" "sources/calendar/config.ini:# databasePassword = \n"; CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); // add ScheduleWorld peer: must reuse existing backend settings { TestCmdline cmdline("--configure", "scheduleworld@foobar", NULL); cmdline.doit(); } res = scanFiles(root); removeRandomUUID(res); expected = ScheduleWorldConfig(); boost::replace_all(expected, "addressbook/config.ini:backend = addressbook", "addressbook/config.ini:backend = file"); boost::replace_all(expected, "addressbook/config.ini:# database = ", "addressbook/config.ini:database = file://tmp/test"); boost::replace_all(expected, "addressbook/config.ini:# databaseFormat = ", "addressbook/config.ini:databaseFormat = text/x-vcard"); boost::replace_all(expected, "calendar/config.ini:backend = calendar", "calendar/config.ini:backend = file"); boost::replace_all(expected, "calendar/config.ini:# database = ", "calendar/config.ini:database = file:///no-such-dir/test2"); boost::replace_all(expected, "calendar/config.ini:sync = two-way", "calendar/config.ini:sync = disabled"); sortConfig(expected); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); // disable all sources except for addressbook { TestCmdline cmdline("--configure", "--datastore-property", "addressbook/sync=two-way", "--datastore-property", "sync=none", "scheduleworld@foobar", NULL); cmdline.doit(); } res = scanFiles(root); removeRandomUUID(res); boost::replace_all(expected, "sync = two-way", "sync = disabled"); boost::replace_first(expected, "sync = disabled", "sync = two-way"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, res); // override type in template while creating from scratch { TestCmdline cmdline("--configure", "--template", "SyncEvolution", "--datastore-property", "addressbook/type=file:text/vcard:3.0", "--datastore-property", "calendar/type=file:text/calendar:2.0", "syncevo@syncevo", NULL); cmdline.doit(); } string syncevoroot = m_testDir + "/syncevolution/syncevo"; res = scanFiles(syncevoroot + "/sources/addressbook"); CPPUNIT_ASSERT(res.find("backend = file\n") != res.npos); CPPUNIT_ASSERT(res.find("databaseFormat = text/vcard\n") != res.npos); res = scanFiles(syncevoroot + "/sources/calendar"); CPPUNIT_ASSERT(res.find("backend = file\n") != res.npos); CPPUNIT_ASSERT(res.find("databaseFormat = text/calendar\n") != res.npos); } void testOldConfigure() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); string oldConfig = OldScheduleWorldConfig(); InitList props = InitList("serverNonce") + "clientNonce" + "devInfoHash" + "HashCode" + "ConfigDate" + "deviceData" + "adminData" + "synthesisID" + "rootMinVersion" + "rootCurVersion" + "contextMinVersion" + "contextCurVersion" + "peerMinVersion" + "peerCurVersion" + "lastNonce" + "last"; BOOST_FOREACH(string &prop, props) { boost::replace_all(oldConfig, prop + " = ", prop + " = internal value"); } rm_r(m_testDir); createFiles(m_testDir + "/.sync4j/evolution/scheduleworld", oldConfig); // Cannot read/and write old format anymore. SyncContext::setStableRelease(false); expectMigration("scheduleworld"); // Migrate explicitly. { TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); } // now test with new format string expected = ScheduleWorldConfig(); boost::replace_first(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); // migrating "type" sets forceSyncFormat if not the default, // and databaseFormat (if format was part of type, as for addressbook) boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); doConfigure(expected, "sources/addressbook/config.ini:"); } string doConfigure(const string &SWConfig, const string &addressbookPrefix) { string expected; { TestCmdline cmdline("--configure", "--datastore-property", "sync = disabled", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); expected = filterConfig(internalToIni(SWConfig)); boost::replace_all(expected, "sync = two-way", "sync = disabled"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, filterConfig(printConfig("scheduleworld"))); } { TestCmdline cmdline("--configure", "--datastore-property", "sync = one-way-from-server", "scheduleworld", "addressbook", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); expected = SWConfig; boost::replace_all(expected, "sync = two-way", "sync = disabled"); boost::replace_first(expected, addressbookPrefix + "sync = disabled", addressbookPrefix + "sync = one-way-from-server"); expected = filterConfig(internalToIni(expected)); CPPUNIT_ASSERT_EQUAL_DIFF(expected, filterConfig(printConfig("scheduleworld"))); } { TestCmdline cmdline("--configure", "--sync", "two-way", "-z", "database=datastore", // note priority of suffix: most specific wins "--sync-property", "maxlogdirs@scheduleworld@default=20", "--sync-property", "maxlogdirs@default=10", "--sync-property", "maxlogdirs=5", "-y", "LOGDIR@default=logdir", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); boost::replace_all(expected, "sync = one-way-from-server", "sync = two-way"); boost::replace_all(expected, "sync = disabled", "sync = two-way"); boost::replace_all(expected, "# database = ", "database = datastore"); boost::replace_all(expected, "database = xyz", "database = datastore"); boost::replace_all(expected, "# maxlogdirs = 10", "maxlogdirs = 20"); boost::replace_all(expected, "# logdir = ", "logdir = logdir"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, filterConfig(printConfig("scheduleworld"))); } return expected; } void testMigrate() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); string oldRoot = m_testDir + "/.sync4j/evolution/scheduleworld"; string newRoot = m_testDir + "/syncevolution/default"; string oldConfig = OldScheduleWorldConfig(); { // migrate old config createFiles(oldRoot, oldConfig); string createdConfig = scanFiles(oldRoot); TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); string migratedConfig = scanFiles(newRoot); string expected = ScheduleWorldConfig(); sortConfig(expected); // migrating SyncEvolution < 1.2 configs sets // ConsumerReady, to keep config visible in the updated // sync-ui boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); // migrating "type" sets forceSyncFormat if different from the "false" default // and databaseFormat (if format was part of type, as for addressbook) boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); string renamedConfig = scanFiles(oldRoot + ".old"); CPPUNIT_ASSERT_EQUAL_DIFF(createdConfig, renamedConfig); } { // rewrite existing config with obsolete properties // => these properties should get removed // // There is one limitation: shared nodes are not rewritten. // This is acceptable. createFiles(newRoot + "/peers/scheduleworld", "config.ini:# obsolete comment\n" "config.ini:obsoleteprop = foo\n", true); string createdConfig = scanFiles(newRoot, "scheduleworld"); TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); string migratedConfig = scanFiles(newRoot, "scheduleworld"); string expected = ScheduleWorldConfig(); sortConfig(expected); boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); string renamedConfig = scanFiles(newRoot, "scheduleworld.old.1"); boost::replace_first(createdConfig, "ConsumerReady = 1", "ConsumerReady = 0"); boost::replace_all(createdConfig, "/scheduleworld/", "/scheduleworld.old.1/"); CPPUNIT_ASSERT_EQUAL_DIFF(createdConfig, renamedConfig); } { // migrate old config with changes and .synthesis directory, a second time createFiles(oldRoot, oldConfig); createFiles(oldRoot, ".synthesis/dummy-file.bfi:dummy = foobar\n" "spds/sources/addressbook/changes/config.txt:foo = bar\n" "spds/sources/addressbook/changes/config.txt:foo2 = bar2\n", true); string createdConfig = scanFiles(oldRoot); rm_r(newRoot); TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); string migratedConfig = scanFiles(newRoot); string expected = ScheduleWorldConfig(); sortConfig(expected); boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); boost::replace_first(expected, "peers/scheduleworld/sources/addressbook/config.ini", "peers/scheduleworld/sources/addressbook/.other.ini:foo = bar\n" "peers/scheduleworld/sources/addressbook/.other.ini:foo2 = bar2\n" "peers/scheduleworld/sources/addressbook/config.ini"); boost::replace_first(expected, "peers/scheduleworld/config.ini", "peers/scheduleworld/.synthesis/dummy-file.bfi:dummy = foobar\n" "peers/scheduleworld/config.ini"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); string renamedConfig = scanFiles(oldRoot + ".old.1"); boost::replace_first(createdConfig, "ConsumerReady = 1", "ConsumerReady = 0"); CPPUNIT_ASSERT_EQUAL_DIFF(createdConfig, renamedConfig); } { string otherRoot = m_testDir + "/syncevolution/other"; rm_r(otherRoot); // migrate old config into non-default context createFiles(oldRoot, oldConfig); string createdConfig = scanFiles(oldRoot); { TestCmdline cmdline("--migrate", "scheduleworld@other", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); } string migratedConfig = scanFiles(otherRoot); string expected = ScheduleWorldConfig(); sortConfig(expected); boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); string renamedConfig = scanFiles(oldRoot + ".old"); CPPUNIT_ASSERT_EQUAL_DIFF(createdConfig, renamedConfig); // migrate the migrated config again inside the "other" context, // with no "default" context which might interfere with the tests // // ConsumerReady was set as part of previous migration, // must be removed during migration to hide the migrated // config from average users. rm_r(newRoot); { TestCmdline cmdline("--migrate", "scheduleworld@other", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); } migratedConfig = scanFiles(otherRoot, "scheduleworld"); expected = ScheduleWorldConfig(); sortConfig(expected); boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); renamedConfig = scanFiles(otherRoot, "scheduleworld.old.3"); boost::replace_all(expected, "/scheduleworld/", "/scheduleworld.old.3/"); boost::replace_all(expected, "ConsumerReady = 1", "ConsumerReady = 0"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, renamedConfig); // migrate once more, this time without the explicit context in // the config name => must not change the context, need second .old dir { TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); } migratedConfig = scanFiles(otherRoot, "scheduleworld"); boost::replace_all(expected, "/scheduleworld.old.3/", "/scheduleworld/"); boost::replace_all(expected, "ConsumerReady = 0", "ConsumerReady = 1"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); renamedConfig = scanFiles(otherRoot, "scheduleworld.old.4"); boost::replace_all(expected, "/scheduleworld/", "/scheduleworld.old.4/"); boost::replace_all(expected, "ConsumerReady = 1", "ConsumerReady = 0"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, renamedConfig); // remove ConsumerReady: must be remain unset when migrating // hidden SyncEvolution >= 1.2 configs { TestCmdline cmdline("--configure", "--sync-property", "ConsumerReady=0", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); } // migrate once more => keep ConsumerReady unset { TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); } migratedConfig = scanFiles(otherRoot, "scheduleworld"); boost::replace_all(expected, "/scheduleworld.old.4/", "/scheduleworld/"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); renamedConfig = scanFiles(otherRoot, "scheduleworld.old.5"); boost::replace_all(expected, "/scheduleworld/", "/scheduleworld.old.5/"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, renamedConfig); } } void testMigrateContext() { // Migrate context containing a peer. Must also migrate peer. // Covers special case of inconsistent "type". ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); string root = m_testDir + "/syncevolution/default"; string oldConfig = "config.ini:logDir = none\n" "peers/scheduleworld/config.ini:syncURL = http://sync.scheduleworld.com/funambol/ds\n" "peers/scheduleworld/config.ini:# username = \n" "peers/scheduleworld/config.ini:# password = \n" "peers/scheduleworld/sources/addressbook/config.ini:sync = two-way\n" "peers/scheduleworld/sources/addressbook/config.ini:uri = card3\n" "peers/scheduleworld/sources/addressbook/config.ini:type = addressbook:text/vcard\n" // correct! "sources/addressbook/config.ini:type = calendar\n" // wrong! "peers/funambol/config.ini:syncURL = http://sync.funambol.com/funambol/ds\n" "peers/funambol/config.ini:# username = \n" "peers/funambol/config.ini:# password = \n" "peers/funambol/sources/calendar/config.ini:sync = refresh-from-server\n" "peers/funambol/sources/calendar/config.ini:uri = cal\n" "peers/funambol/sources/calendar/config.ini:type = calendar\n" // correct! "peers/funambol/sources/addressbook/config.ini:# sync = disabled\n" "peers/funambol/sources/addressbook/config.ini:type = file\n" // not used for context because source disabled "sources/calendar/config.ini:type = memos\n" // wrong! "peers/memotoo/config.ini:syncURL = http://sync.memotoo.com/memotoo/ds\n" "peers/memotoo/config.ini:# username = \n" "peers/memotoo/config.ini:# password = \n" "peers/memotoo/sources/memo/config.ini:sync = refresh-from-client\n" "peers/memotoo/sources/memo/config.ini:uri = cal\n" "peers/memotoo/sources/memo/config.ini:type = memo:text/plain\n" // correct! "sources/memo/config.ini:type = todo\n" // wrong! ; { createFiles(root, oldConfig); TestCmdline cmdline("--migrate", "memo/backend=file", // override memo "backend" during migration "@default", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); string migratedConfig = scanFiles(root); CPPUNIT_ASSERT(migratedConfig.find("peers/scheduleworld/") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("sources/addressbook/config.ini:backend = addressbook") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("sources/addressbook/config.ini:databaseFormat = text/vcard") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/scheduleworld/sources/addressbook/config.ini:syncFormat = text/vcard") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/scheduleworld/sources/addressbook/config.ini:sync = two-way") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/scheduleworld/sources/calendar/config.ini:# sync = disabled") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/scheduleworld/sources/memo/config.ini:# sync = disabled") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("sources/calendar/config.ini:backend = calendar") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("sources/calendar/config.ini:# databaseFormat = ") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/funambol/sources/calendar/config.ini:# syncFormat = ") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/funambol/sources/addressbook/config.ini:# sync = disabled") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/funambol/sources/calendar/config.ini:sync = refresh-from-server") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/funambol/sources/memo/config.ini:# sync = disabled") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("sources/memo/config.ini:backend = file") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("sources/memo/config.ini:databaseFormat = text/plain") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/memotoo/sources/memo/config.ini:syncFormat = text/plain") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/memotoo/sources/addressbook/config.ini:# sync = disabled") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/memotoo/sources/calendar/config.ini:# sync = disabled") != migratedConfig.npos); CPPUNIT_ASSERT(migratedConfig.find("peers/memotoo/sources/memo/config.ini:sync = refresh-from-client") != migratedConfig.npos); } } void testMigrateAutoSync() { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); string oldRoot = m_testDir + "/.sync4j/evolution/scheduleworld"; string newRoot = m_testDir + "/syncevolution/default"; string oldConfig = "spds/syncml/config.txt:autoSync = 1\n"; oldConfig += OldScheduleWorldConfig(); { // migrate old config createFiles(oldRoot, oldConfig); string createdConfig = scanFiles(oldRoot); TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); string migratedConfig = scanFiles(newRoot); string expected = ScheduleWorldConfig(); boost::replace_first(expected, "# autoSync = 0", "autoSync = 1"); sortConfig(expected); // migrating SyncEvolution < 1.2 configs sets // ConsumerReady, to keep config visible in the updated // sync-ui boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); // migrating "type" sets forceSyncFormat if not already the default, // and databaseFormat (if format was part of type, as for addressbook) boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); string renamedConfig = scanFiles(oldRoot + ".old"); // autoSync must have been unset boost::replace_first(createdConfig, ":autoSync = 1", ":autoSync = 0"); CPPUNIT_ASSERT_EQUAL_DIFF(createdConfig, renamedConfig); } { // rewrite existing config with autoSync set string createdConfig = scanFiles(newRoot, "scheduleworld"); TestCmdline cmdline("--migrate", "scheduleworld", NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_out.str()); string migratedConfig = scanFiles(newRoot, "scheduleworld"); string expected = ScheduleWorldConfig(); boost::replace_first(expected, "# autoSync = 0", "autoSync = 1"); sortConfig(expected); boost::replace_all(expected, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(expected, "# database = ", "database = xyz"); boost::replace_first(expected, "# databaseUser = ", "databaseUser = foo"); boost::replace_first(expected, "# databasePassword = ", DATABASE_PASSWORD_BAR); boost::replace_first(expected, "# databaseFormat = ", "databaseFormat = text/vcard"); CPPUNIT_ASSERT_EQUAL_DIFF(expected, migratedConfig); string renamedConfig = scanFiles(newRoot, "scheduleworld.old.1"); // autoSync must have been unset boost::replace_first(createdConfig, ":autoSync = 1", ":autoSync = 0"); // the scheduleworld config was consumer ready, the migrated one isn't boost::replace_all(createdConfig, "ConsumerReady = 1", "ConsumerReady = 0"); boost::replace_all(createdConfig, "/scheduleworld/", "/scheduleworld.old.1/"); CPPUNIT_ASSERT_EQUAL_DIFF(createdConfig, renamedConfig); } } const string m_testDir; private: /** * vararg constructor with NULL termination, * out and error stream into stringstream members */ class TestCmdline : public Logger { void init() { addLogger(boost::shared_ptr(this, NopDestructor())); m_argv.reset(new const char *[m_argvstr.size() + 1]); m_argv[0] = "client-test"; for (size_t index = 0; index < m_argvstr.size(); ++index) { m_argv[index + 1] = m_argvstr[index].c_str(); } m_cmdline.set(new KeyringSyncCmdline(m_argvstr.size() + 1, m_argv.get()), "cmdline"); } public: TestCmdline(const char *arg, ...) { va_list argList; va_start (argList, arg); for (const char *curr = arg; curr; curr = va_arg(argList, const char *)) { m_argvstr.push_back(curr); } va_end(argList); init(); } TestCmdline(const char * const argv[]) { for (int i = 0; argv[i]; i++) { m_argvstr.push_back(argv[i]); } init(); } ~TestCmdline() { removeLogger(this); } boost::shared_ptr parse() { if (!m_cmdline->parse()) { return boost::shared_ptr(); } boost::shared_ptr context(new SyncContext(m_cmdline->m_server)); context->setConfigFilter(true, "", m_cmdline->m_props.createSyncFilter(m_cmdline->m_server)); return context; } void doit(bool expectSuccess = true) { bool success = false; m_out.str(""); m_err.str(""); // emulates syncevolution.cpp exception handling try { success = m_cmdline->parse() && m_cmdline->run(); } catch (const std::exception &ex) { m_err << "[ERROR] " << ex.what(); } catch (...) { std::string explanation; Exception::handle(explanation); m_err << "[ERROR] " << explanation; } if (expectSuccess && m_err.str().size()) { m_out << endl << m_err.str(); } CPPUNIT_ASSERT_MESSAGE(m_out.str(), success == expectSuccess); } /** verify that Cmdline::usage() produced a short usage info followed by a specific error message */ void expectUsageError(const std::string &error) { // expect short usage info as normal output std::string out = m_out.str(); std::string err = m_err.str(); std::string all = m_all.str(); CPPUNIT_ASSERT(boost::starts_with(out, "List and manipulate databases:\n")); CPPUNIT_ASSERT(out.find("\nOptions:\n") == std::string::npos); CPPUNIT_ASSERT(boost::ends_with(out, "Remove item(s):\n" " syncevolution --delete-items [--] ( ... | '*')\n\n")); // exact error message CPPUNIT_ASSERT_EQUAL(error, err); // also check order CPPUNIT_ASSERT_EQUAL_DIFF(out + err, all); } // separate streams for normal messages and error messages ostringstream m_out, m_err; // combined stream with all messages ostringstream m_all; cxxptr m_cmdline; private: vector m_argvstr; boost::scoped_array m_argv; /** capture output produced while test ran */ void messagev(const MessageOptions &options, const char *format, va_list args) { Level level = options.m_level; if (level <= INFO) { ostringstream &out = level != SHOW ? m_err : m_out; std::string str = StringPrintfV(format, args); if (level != SHOW) { out << "[" << levelToStr(level) << "] "; m_all << "[" << levelToStr(level) << "] "; } if (options.m_prefix) { out << options.m_prefix << " :"; } out << str; m_all << str; if (!boost::ends_with(str, "\n")) { out << std::endl; m_all << std::endl; } } } }; string DefaultConfig() { string config = ScheduleWorldConfig(); boost::replace_first(config, "syncURL = http://sync.scheduleworld.com/funambol/ds", "syncURL = http://yourserver:port"); boost::replace_first(config, "http://www.scheduleworld.com", "http://www.syncevolution.org"); boost::replace_all(config, "ScheduleWorld", "SyncEvolution"); boost::replace_all(config, "scheduleworld", "syncevolution"); boost::replace_first(config, "PeerName = SyncEvolution", "# PeerName = "); boost::replace_first(config, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(config, "uri = card3", "uri = addressbook"); boost::replace_first(config, "uri = cal2", "uri = calendar"); boost::replace_first(config, "uri = task2", "uri = todo"); boost::replace_first(config, "uri = note", "uri = memo"); boost::replace_first(config, "syncFormat = text/vcard", "# syncFormat = "); return config; } string ScheduleWorldConfig(int contextMinVersion = CONFIG_CONTEXT_MIN_VERSION, int contextCurVersion = CONFIG_CONTEXT_CUR_VERSION, int peerMinVersion = CONFIG_PEER_MIN_VERSION, int peerCurVersion = CONFIG_PEER_CUR_VERSION) { // properties sorted by the order in which they are defined // in the sync and sync source property registry string config = StringPrintf("peers/scheduleworld/.internal.ini:peerMinVersion = %d\n" "peers/scheduleworld/.internal.ini:peerCurVersion = %d\n" "peers/scheduleworld/.internal.ini:# HashCode = 0\n" "peers/scheduleworld/.internal.ini:# ConfigDate = \n" "peers/scheduleworld/.internal.ini:# lastNonce = \n" "peers/scheduleworld/.internal.ini:# deviceData = \n" "peers/scheduleworld/.internal.ini:# webDAVCredentialsOkay = 0\n" "peers/scheduleworld/config.ini:syncURL = http://sync.scheduleworld.com/funambol/ds\n" "peers/scheduleworld/config.ini:# username = \n" "peers/scheduleworld/config.ini:# password = \n" ".internal.ini:contextMinVersion = %d\n" ".internal.ini:contextCurVersion = %d\n" "config.ini:# logdir = \n" "peers/scheduleworld/config.ini:# loglevel = 0\n" "peers/scheduleworld/config.ini:# notifyLevel = 3\n" "peers/scheduleworld/config.ini:# printChanges = 1\n" "peers/scheduleworld/config.ini:# dumpData = 1\n" "config.ini:# maxlogdirs = 10\n" "peers/scheduleworld/config.ini:# autoSync = 0\n" "peers/scheduleworld/config.ini:# autoSyncInterval = 30M\n" "peers/scheduleworld/config.ini:# autoSyncDelay = 5M\n" "peers/scheduleworld/config.ini:# preventSlowSync = 1\n" "peers/scheduleworld/config.ini:# useProxy = 0\n" "peers/scheduleworld/config.ini:# proxyHost = \n" "peers/scheduleworld/config.ini:# proxyUsername = \n" "peers/scheduleworld/config.ini:# proxyPassword = \n" "peers/scheduleworld/config.ini:# clientAuthType = md5\n" "peers/scheduleworld/config.ini:# RetryDuration = 5M\n" "peers/scheduleworld/config.ini:# RetryInterval = 2M\n" "peers/scheduleworld/config.ini:# remoteIdentifier = \n" "peers/scheduleworld/config.ini:# PeerIsClient = 0\n" "peers/scheduleworld/config.ini:# SyncMLVersion = \n" "peers/scheduleworld/config.ini:PeerName = ScheduleWorld\n" "config.ini:deviceId = fixed-devid\n" /* this is not the default! */ "peers/scheduleworld/config.ini:# remoteDeviceId = \n" "peers/scheduleworld/config.ini:# enableWBXML = 1\n" "peers/scheduleworld/config.ini:# enableRefreshSync = 0\n" "peers/scheduleworld/config.ini:# maxMsgSize = 150000\n" "peers/scheduleworld/config.ini:# maxObjSize = 4000000\n" "peers/scheduleworld/config.ini:# SSLServerCertificates = \n" "peers/scheduleworld/config.ini:# SSLVerifyServer = 1\n" "peers/scheduleworld/config.ini:# SSLVerifyHost = 1\n" "peers/scheduleworld/config.ini:WebURL = http://www.scheduleworld.com\n" "peers/scheduleworld/config.ini:IconURI = image://themedimage/icons/services/scheduleworld\n" "peers/scheduleworld/config.ini:# ConsumerReady = 0\n" "peers/scheduleworld/config.ini:# peerType = \n" "peers/scheduleworld/sources/addressbook/.internal.ini:# adminData = \n" "peers/scheduleworld/sources/addressbook/.internal.ini:# synthesisID = 0\n" "peers/scheduleworld/sources/addressbook/config.ini:sync = two-way\n" "peers/scheduleworld/sources/addressbook/config.ini:uri = card3\n" "sources/addressbook/config.ini:backend = addressbook\n" "peers/scheduleworld/sources/addressbook/config.ini:syncFormat = text/vcard\n" "peers/scheduleworld/sources/addressbook/config.ini:# forceSyncFormat = 0\n" "sources/addressbook/config.ini:# database = \n" "sources/addressbook/config.ini:# databaseFormat = \n" "sources/addressbook/config.ini:# databaseUser = \n" "sources/addressbook/config.ini:# databasePassword = \n" "peers/scheduleworld/sources/calendar/.internal.ini:# adminData = \n" "peers/scheduleworld/sources/calendar/.internal.ini:# synthesisID = 0\n" "peers/scheduleworld/sources/calendar/config.ini:sync = two-way\n" "peers/scheduleworld/sources/calendar/config.ini:uri = cal2\n" "sources/calendar/config.ini:backend = calendar\n" "peers/scheduleworld/sources/calendar/config.ini:# syncFormat = \n" "peers/scheduleworld/sources/calendar/config.ini:# forceSyncFormat = 0\n" "sources/calendar/config.ini:# database = \n" "sources/calendar/config.ini:# databaseFormat = \n" "sources/calendar/config.ini:# databaseUser = \n" "sources/calendar/config.ini:# databasePassword = \n" "peers/scheduleworld/sources/memo/.internal.ini:# adminData = \n" "peers/scheduleworld/sources/memo/.internal.ini:# synthesisID = 0\n" "peers/scheduleworld/sources/memo/config.ini:sync = two-way\n" "peers/scheduleworld/sources/memo/config.ini:uri = note\n" "sources/memo/config.ini:backend = memo\n" "peers/scheduleworld/sources/memo/config.ini:# syncFormat = \n" "peers/scheduleworld/sources/memo/config.ini:# forceSyncFormat = 0\n" "sources/memo/config.ini:# database = \n" "sources/memo/config.ini:# databaseFormat = \n" "sources/memo/config.ini:# databaseUser = \n" "sources/memo/config.ini:# databasePassword = \n" "peers/scheduleworld/sources/todo/.internal.ini:# adminData = \n" "peers/scheduleworld/sources/todo/.internal.ini:# synthesisID = 0\n" "peers/scheduleworld/sources/todo/config.ini:sync = two-way\n" "peers/scheduleworld/sources/todo/config.ini:uri = task2\n" "sources/todo/config.ini:backend = todo\n" "peers/scheduleworld/sources/todo/config.ini:# syncFormat = \n" "peers/scheduleworld/sources/todo/config.ini:# forceSyncFormat = 0\n" "sources/todo/config.ini:# database = \n" "sources/todo/config.ini:# databaseFormat = \n" "sources/todo/config.ini:# databaseUser = \n" "sources/todo/config.ini:# databasePassword = ", peerMinVersion, peerCurVersion, contextMinVersion, contextCurVersion); #ifdef ENABLE_LIBSOUP // path to SSL certificates has to be set only for libsoup boost::replace_first(config, "SSLServerCertificates = ", "SSLServerCertificates = /etc/ssl/certs/ca-certificates.crt:/etc/pki/tls/certs/ca-bundle.crt:/usr/share/ssl/certs/ca-bundle.crt"); #endif #if 0 // Currently we don't have an icon for ScheduleWorld. If we // had (MB #2062) one, then this code would ensure that the // reference config also has the right path for it. const char *templateDir = getenv("SYNCEVOLUTION_TEMPLATE_DIR"); if (!templateDir) { templateDir = TEMPLATE_DIR; } if (isDir(string(templateDir) + "/ScheduleWorld")) { boost::replace_all(config, "# IconURI = ", string("IconURI = file://") + templateDir + "/ScheduleWorld/icon.png"); } #endif return config; } string OldScheduleWorldConfig() { // old style paths string oldConfig = "spds/syncml/config.txt:syncURL = http://sync.scheduleworld.com/funambol/ds\n" "spds/syncml/config.txt:# username = \n" "spds/syncml/config.txt:# password = \n" "spds/syncml/config.txt:# logdir = \n" "spds/syncml/config.txt:# loglevel = 0\n" "spds/syncml/config.txt:# notifyLevel = 3\n" "spds/syncml/config.txt:# printChanges = 1\n" "spds/syncml/config.txt:# dumpData = 1\n" "spds/syncml/config.txt:# maxlogdirs = 10\n" "spds/syncml/config.txt:# autoSync = 0\n" "spds/syncml/config.txt:# autoSyncInterval = 30M\n" "spds/syncml/config.txt:# autoSyncDelay = 5M\n" "spds/syncml/config.txt:# preventSlowSync = 1\n" "spds/syncml/config.txt:# useProxy = 0\n" "spds/syncml/config.txt:# proxyHost = \n" "spds/syncml/config.txt:# proxyUsername = \n" "spds/syncml/config.txt:# proxyPassword = \n" "spds/syncml/config.txt:# clientAuthType = md5\n" "spds/syncml/config.txt:# RetryDuration = 5M\n" "spds/syncml/config.txt:# RetryInterval = 2M\n" "spds/syncml/config.txt:# remoteIdentifier = \n" "spds/syncml/config.txt:# PeerIsClient = 0\n" "spds/syncml/config.txt:# SyncMLVersion = \n" "spds/syncml/config.txt:PeerName = ScheduleWorld\n" "spds/syncml/config.txt:deviceId = fixed-devid\n" /* this is not the default! */ "spds/syncml/config.txt:# remoteDeviceId = \n" "spds/syncml/config.txt:# enableWBXML = 1\n" "spds/syncml/config.txt:# enableRefreshSync = 0\n" "spds/syncml/config.txt:# maxMsgSize = 150000\n" "spds/syncml/config.txt:# maxObjSize = 4000000\n" #ifdef ENABLE_LIBSOUP // path to SSL certificates is only set for libsoup "spds/syncml/config.txt:# SSLServerCertificates = /etc/ssl/certs/ca-certificates.crt:/etc/pki/tls/certs/ca-bundle.crt:/usr/share/ssl/certs/ca-bundle.crt\n" #else "spds/syncml/config.txt:# SSLServerCertificates = \n" #endif "spds/syncml/config.txt:# SSLVerifyServer = 1\n" "spds/syncml/config.txt:# SSLVerifyHost = 1\n" "spds/syncml/config.txt:WebURL = http://www.scheduleworld.com\n" "spds/syncml/config.txt:IconURI = image://themedimage/icons/services/scheduleworld\n" "spds/syncml/config.txt:# ConsumerReady = 0\n" "spds/sources/addressbook/config.txt:sync = two-way\n" "spds/sources/addressbook/config.txt:type = addressbook:text/vcard\n" "spds/sources/addressbook/config.txt:evolutionsource = xyz\n" "spds/sources/addressbook/config.txt:uri = card3\n" "spds/sources/addressbook/config.txt:evolutionuser = foo\n" "spds/sources/addressbook/config.txt:evolutionpassword = bar\n" "spds/sources/calendar/config.txt:sync = two-way\n" "spds/sources/calendar/config.txt:type = calendar\n" "spds/sources/calendar/config.txt:# database = \n" "spds/sources/calendar/config.txt:uri = cal2\n" "spds/sources/calendar/config.txt:# evolutionuser = \n" "spds/sources/calendar/config.txt:# evolutionpassword = \n" "spds/sources/memo/config.txt:sync = two-way\n" "spds/sources/memo/config.txt:type = memo\n" "spds/sources/memo/config.txt:# database = \n" "spds/sources/memo/config.txt:uri = note\n" "spds/sources/memo/config.txt:# evolutionuser = \n" "spds/sources/memo/config.txt:# evolutionpassword = \n" "spds/sources/todo/config.txt:sync = two-way\n" "spds/sources/todo/config.txt:type = todo\n" "spds/sources/todo/config.txt:# database = \n" "spds/sources/todo/config.txt:uri = task2\n" "spds/sources/todo/config.txt:# evolutionuser = \n" "spds/sources/todo/config.txt:# evolutionpassword = \n"; return oldConfig; } string FunambolConfig() { string config = ScheduleWorldConfig(); boost::replace_all(config, "/scheduleworld/", "/funambol/"); boost::replace_all(config, "PeerName = ScheduleWorld", "PeerName = Funambol"); boost::replace_first(config, "syncURL = http://sync.scheduleworld.com/funambol/ds", "syncURL = https://onemediahub.com/sync"); boost::replace_first(config, "WebURL = http://www.scheduleworld.com", "WebURL = https://onemediahub.com"); boost::replace_first(config, "IconURI = image://themedimage/icons/services/scheduleworld", "IconURI = image://themedimage/icons/services/funambol"); boost::replace_first(config, "# ConsumerReady = 0", "ConsumerReady = 1"); boost::replace_first(config, "# enableWBXML = 1", "enableWBXML = 0"); boost::replace_first(config, "# enableRefreshSync = 0", "enableRefreshSync = 1"); boost::replace_first(config, "# RetryInterval = 2M", "RetryInterval = 0"); boost::replace_first(config, "addressbook/config.ini:uri = card3", "addressbook/config.ini:uri = card"); boost::replace_all(config, "addressbook/config.ini:syncFormat = text/vcard", "addressbook/config.ini:# syncFormat = "); boost::replace_first(config, "calendar/config.ini:uri = cal2", "calendar/config.ini:uri = event"); boost::replace_all(config, "calendar/config.ini:# syncFormat = ", "calendar/config.ini:syncFormat = text/calendar"); boost::replace_all(config, "calendar/config.ini:# forceSyncFormat = 0", "calendar/config.ini:forceSyncFormat = 1"); boost::replace_first(config, "todo/config.ini:uri = task2", "todo/config.ini:uri = task"); boost::replace_all(config, "todo/config.ini:# syncFormat = ", "todo/config.ini:syncFormat = text/calendar"); boost::replace_all(config, "todo/config.ini:# forceSyncFormat = 0", "todo/config.ini:forceSyncFormat = 1"); return config; } string SynthesisConfig() { string config = ScheduleWorldConfig(); boost::replace_all(config, "/scheduleworld/", "/synthesis/"); boost::replace_all(config, "PeerName = ScheduleWorld", "PeerName = Synthesis"); boost::replace_first(config, "syncURL = http://sync.scheduleworld.com/funambol/ds", "syncURL = http://www.synthesis.ch/sync"); boost::replace_first(config, "WebURL = http://www.scheduleworld.com", "WebURL = http://www.synthesis.ch"); boost::replace_first(config, "IconURI = image://themedimage/icons/services/scheduleworld", "IconURI = image://themedimage/icons/services/synthesis"); boost::replace_first(config, "addressbook/config.ini:uri = card3", "addressbook/config.ini:uri = contacts"); boost::replace_all(config, "addressbook/config.ini:syncFormat = text/vcard", "addressbook/config.ini:# syncFormat = "); boost::replace_first(config, "calendar/config.ini:uri = cal2", "calendar/config.ini:uri = events"); boost::replace_first(config, "calendar/config.ini:sync = two-way", "calendar/config.ini:sync = disabled"); boost::replace_first(config, "memo/config.ini:uri = note", "memo/config.ini:uri = notes"); boost::replace_first(config, "todo/config.ini:uri = task2", "todo/config.ini:uri = tasks"); boost::replace_first(config, "todo/config.ini:sync = two-way", "todo/config.ini:sync = disabled"); return config; } /** create directory hierarchy, overwriting previous content */ void createFiles(const string &root, const string &content, bool append = false) { if (!append) { rm_r(root); } size_t start = 0; ofstream out; string outname; out.exceptions(ios_base::badbit|ios_base::failbit); while (start < content.size()) { size_t delim = content.find(':', start); size_t end = content.find('\n', start); if (delim == content.npos || end == content.npos) { // invalid content ?! break; } string newname = content.substr(start, delim - start); string line = content.substr(delim + 1, end - delim - 1); if (newname != outname) { if (out.is_open()) { out.close(); } string fullpath = root + "/" + newname; size_t fileoff = fullpath.rfind('/'); mkdir_p(fullpath.substr(0, fileoff)); out.open(fullpath.c_str(), append ? (ios_base::out|ios_base::ate|ios_base::app) : (ios_base::out|ios_base::trunc)); outname = newname; } out << line << endl; start = end + 1; } } /** turn directory hierarchy into string * * @param root root path in file system * @param peer if non-empty, then ignore all /peers/ directories * where != peer * @param onlyProps ignore lines which are comments */ string scanFiles(const string &root, const string &peer = "", bool onlyProps = true) { ostringstream out; scanFiles(root, "", peer, out, onlyProps); return out.str(); } void scanFiles(const string &root, const string &dir, const string &peer, ostringstream &out, bool onlyProps) { string newroot = root; newroot += "/"; newroot += dir; ReadDir readDir(newroot); sort(readDir.begin(), readDir.end()); BOOST_FOREACH(const string &entry, readDir) { if (isDir(newroot + "/" + entry)) { if (boost::ends_with(newroot, "/peers") && !peer.empty() && entry != peer) { // skip different peer directory continue; } else { scanFiles(root, dir + (dir.empty() ? "" : "/") + entry, peer, out, onlyProps); } } else { ifstream in; in.exceptions(ios_base::badbit /* failbit must not trigger exception because is set when reaching eof ?! */); in.open((newroot + "/" + entry).c_str()); string line; while (!in.eof()) { getline(in, line); if ((line.size() || !in.eof()) && (!onlyProps || (boost::starts_with(line, "# ") ? isPropAssignment(line.substr(2)) : !line.empty()))) { if (dir.size()) { out << dir << "/"; } out << entry << ":"; out << line << '\n'; } } } } } string printConfig(const string &server) { ScopedEnvChange templates("SYNCEVOLUTION_TEMPLATE_DIR", "templates"); ScopedEnvChange xdg("XDG_CONFIG_HOME", m_testDir); ScopedEnvChange home("HOME", m_testDir); TestCmdline cmdline("--print-config", server.c_str(), NULL); cmdline.doit(); CPPUNIT_ASSERT_EQUAL_DIFF("", cmdline.m_err.str()); return cmdline.m_out.str(); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(CmdlineTest); #endif // ENABLE_UNIT_TESTS SE_END_CXX syncevolution-1.5/src/syncevo/CmdlineSyncClient.h0000644000373300001540000000433412326412403023514 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_CMDLINESYNCCLIENT #define INCL_CMDLINESYNCCLIENT #include #include #include SE_BEGIN_CXX /** * a command line sync client for the purpose of * supporting a mechanism to save and retrieve password * in keyring. */ class CmdlineSyncClient : public SyncContext, private UserInterface { public: CmdlineSyncClient(const string &server, bool doLogging = false); /** * These 2 functions are from UserInterface and implement it * to use keyring to retrieve and save password in the keyring, * if enabled. */ virtual string askPassword(const string &passwordName, const string &descr, const ConfigPasswordKey &key); virtual bool savePassword(const string &passwordName, const string &password, const ConfigPasswordKey &key); /** read from real stdin */ virtual void readStdin(string &content); }; /** * This is a class derived from Cmdline. The purpose * is to implement the factory method 'createSyncClient' to create * new implemented 'CmdlineSyncClient' objects. */ class KeyringSyncCmdline : public Cmdline { public: KeyringSyncCmdline(int argc, const char * const * argv) : Cmdline(argc, argv) {} /** * create a user implemented sync client. */ SyncContext* createSyncClient() { return new CmdlineSyncClient(m_server, true); } }; SE_END_CXX #endif // INCL_CMDLINESYNCCLIENT syncevolution-1.5/src/syncevo/CmdlineSyncClient.cpp0000664000373300001540000000516412330727742024065 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "CmdlineSyncClient.h" #include #include SE_BEGIN_CXX using namespace std; CmdlineSyncClient::CmdlineSyncClient(const string &server, bool doLogging): SyncContext(server, doLogging) { setUserInterface(this); } string CmdlineSyncClient::askPassword(const string &passwordName, const string &descr, const ConfigPasswordKey &key) { InitStateString password; // try to use keyring, if allowed if (GetLoadPasswordSignal()(getKeyring(), passwordName, descr, key, password) && password.wasSet()) { // succcess return password; } /** * if not built with secrets support or that support failed, * directly ask user to input password */ char buffer[256]; printf("Enter password for %s: ", descr.c_str()); fflush(stdout); if (fgets(buffer, sizeof(buffer), stdin) && strcmp(buffer, "\n")) { size_t len = strlen(buffer); if (len && buffer[len - 1] == '\n') { buffer[len - 1] = 0; } password = std::string(buffer); } else { Exception::throwError(SE_HERE, string("could not read password for ") + descr); } return password; } bool CmdlineSyncClient::savePassword(const string &passwordName, const string &password, const ConfigPasswordKey &key) { if (GetSavePasswordSignal()(getKeyring(), passwordName, password, key)) { // saved! return true; } // let config code store the password return false; } void CmdlineSyncClient::readStdin(string &content) { if (!ReadFile(cin, content)) { Exception::throwError(SE_HERE, "stdin", errno); } } SE_END_CXX syncevolution-1.5/src/syncevo/SyncSource.cpp0000664000373300001540000017102012405555067022610 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef ENABLE_UNIT_TESTS #include "test.h" #endif #include SE_BEGIN_CXX void SyncSourceBase::throwError(const SourceLocation &where, const string &action, int error) { std::string what = action + ": " + strerror(error); // be as specific if we can be: relevant for the file backend, // which is expected to return STATUS_NOT_FOUND == 404 for "file // not found" if (error == ENOENT) { throwError(where, STATUS_NOT_FOUND, what); } else { throwError(where, what); } } void SyncSourceBase::throwError(const SourceLocation &where, const string &failure) { Exception::throwError(where, string(getDisplayName()) + ": " + failure); } void SyncSourceBase::throwError(const SourceLocation &where, SyncMLStatus status, const string &failure) { Exception::throwError(where, status, getDisplayName() + ": " + failure); } SyncMLStatus SyncSourceBase::handleException(HandleExceptionFlags flags) { SyncMLStatus res = Exception::handle(getDisplayName(), flags); return res == STATUS_FATAL ? STATUS_DATASTORE_FAILURE : res; } void SyncSourceBase::getDatastoreXML(string &xml, XMLConfigFragments &fragments) { stringstream xmlstream; SynthesisInfo info; getSynthesisInfo(info, fragments); xmlstream << " SyncEvolution\n"; if (info.m_earlyStartDataRead) { xmlstream << " yes\n"; } if (info.m_readOnly) { xmlstream << " \n" " yes\n"; } xmlstream << " " << (serverModeEnabled() ? "yes" : "no") << "\n" " yes \n" " yes\n"; if (info.m_globalIDs) { xmlstream << " 1122583000"; } xmlstream << "\n" " \n" " newer-wins\n" "\n" " \n" " newer-wins\n" "\n" " \n" " UTF-8\n" " \n" " unix\n" "\n" " \n" " SYSTEM\n" "\n" " \n" " yes\n" "\n"; xmlstream << " \n" " \n"; if (!info.m_profile.empty()) { xmlstream << " \n" " \n" " \n" " \n"; } xmlstream << " \n" " \n" "\n"; xmlstream << " \n" " \n" << info.m_datatypes << " \n"; // arbitrary configuration options, can override the ones above xmlstream << info.m_datastoreOptions; xml = xmlstream.str(); } string SyncSourceBase::getNativeDatatypeName() { SynthesisInfo info; XMLConfigFragments fragments; getSynthesisInfo(info, fragments); return info.m_native; } SyncSourceBase::Operations::Operations(SyncSourceName &source) : m_startDataRead(source), m_endDataRead(source), m_startDataWrite(source), m_finalizeLocalID(source), m_endDataWrite(source), m_readNextItem(source), m_readItemAsKey(source), m_insertItemAsKey(source), m_updateItemAsKey(source), m_deleteItem(source), m_loadAdminData(source), m_saveAdminData(source), m_insertMapItem(source), m_updateMapItem(source), m_deleteMapItem(source), m_deleteBlob(source) { } static SyncMLStatus BumpCounter(int32_t &counter) { counter++; return STATUS_OK; } SyncSource::SyncSource(const SyncSourceParams ¶ms) : SyncSourceConfig(params.m_name, params.m_nodes), m_operations(*this), m_numDeleted(0), m_added(0), m_updated(0), m_deleted(0), m_forceSlowSync(false), m_database("", ""), m_name(params.getDisplayName()), m_needChanges(true) { m_operations.m_insertItemAsKey.getPreSignal().connect(boost::bind(BumpCounter, boost::ref(m_added))); m_operations.m_updateItemAsKey.getPreSignal().connect(boost::bind(BumpCounter, boost::ref(m_updated))); m_operations.m_deleteItem.getPreSignal().connect(boost::bind(BumpCounter, boost::ref(m_deleted))); } SDKInterface *SyncSource::getSynthesisAPI() const { return m_synthesisAPI.empty() ? NULL : static_cast(m_synthesisAPI[m_synthesisAPI.size() - 1]); } void SyncSource::pushSynthesisAPI(sysync::SDK_InterfaceType *synthesisAPI) { m_synthesisAPI.push_back(synthesisAPI); } void SyncSource::popSynthesisAPI() { m_synthesisAPI.pop_back(); } bool SyncSource::isUsable() { if (getOperations().m_isEmpty) { try { SE_LOG_INFO(getDisplayName(), "checking usability..."); getOperations().m_isEmpty(); return true; } catch (...) { std::string explanation; Exception::handle(explanation, HANDLE_EXCEPTION_NO_ERROR); SE_LOG_INFO(getDisplayName(), "%s", explanation.c_str()); return false; } } else { // Cannot check, assume it is usable. return true; } } SourceRegistry &SyncSource::getSourceRegistry() { static SourceRegistry sourceRegistry; return sourceRegistry; } RegisterSyncSource::RegisterSyncSource(const string &shortDescr, bool enabled, Create_t create, const string &typeDescr, const Values &typeValues) : m_shortDescr(shortDescr), m_enabled(enabled), m_create(create), m_typeDescr(typeDescr), m_typeValues(typeValues) { SourceRegistry ®istry(SyncSource::getSourceRegistry()); // insert sorted by description to have deterministic ordering for(SourceRegistry::iterator it = registry.begin(); it != registry.end(); ++it) { if ((*it)->m_shortDescr > shortDescr) { registry.insert(it, this); return; } } registry.push_back(this); } class InactiveSyncSource : public DummySyncSource { public: InactiveSyncSource(const SyncSourceParams ¶ms) : DummySyncSource(params) {} virtual bool isInactive() const { return true; } virtual Databases getDatabases() { throwError(SE_HERE, "inactive"); return Databases(); } virtual void open() { throwError(SE_HERE, "inactive"); } }; SyncSource *RegisterSyncSource::InactiveSource(const SyncSourceParams ¶ms) { return new InactiveSyncSource(params); } TestRegistry &SyncSource::getTestRegistry() { static TestRegistry testRegistry; return testRegistry; } RegisterSyncSourceTest::RegisterSyncSourceTest(const string &configName, const string &testCaseName) : m_configName(configName), m_testCaseName(testCaseName) { SyncSource::getTestRegistry().push_back(this); } static class ScannedModules { public: ScannedModules() { #ifdef ENABLE_MODULES list > > dirs; /* If enviroment variable SYNCEVOLUTION_BACKEND_DIR is set, will search backends from this path instead. */ string backend_dir (SYNCEVO_BACKEND); char *backend_env = getenv("SYNCEVOLUTION_BACKEND_DIR"); if (backend_env && strlen(backend_env)){ backend_dir = backend_env; } boost::shared_ptr dir (new ReadDir (backend_dir, false)); string dirpath (backend_dir); // Base name (= no dir, no .so suffix) mapping to full file // name (including .so). std::map candidates; // scan directories for matching module names do { debug<<"Scanning backend libraries in " < subdir (new ReadDir (path, false)); dirs.push_back (make_pair(path, subdir)); } continue; } if (boost::ends_with(entry, ".so")) { string fullpath = dirpath + '/' + entry; fullpath = normalizePath(fullpath); candidates[entry.substr(0, entry.size() - 3)] = fullpath; } } if (!dirs.empty()){ dirpath = dirs.front().first; dir = dirs.front().second; dirs.pop_front(); } else { break; } } while (true); // Look at foo- before foo. If there is more than // one version and the version sorts lexically, the "highest" // one will be checked first, too. // // The intention is to try loading syncebook-2 (with explicit // library dependencies) first, then skip syncebook if loading // of syncebook-2 succeeded. If loading of syncebook-2 fails // due to missing libraries, we proceed to use syncebook. BOOST_REVERSE_FOREACH (const StringPair &entry, candidates) { const std::string &basename = entry.first; const std::string &fullpath = entry.second; std::string replacement; std::string modname; size_t offset = basename.rfind('-'); if (offset != basename.npos) { modname = basename.substr(0, offset); } else { modname = basename; } BOOST_FOREACH (const std::string &l, m_available) { if (boost::starts_with(l, modname)) { replacement = l; break; } } if (!replacement.empty()) { debug << "Skipping " << basename << " = " << fullpath << " because a more recent version of it was already loaded: " << replacement; continue; } // Open the shared object so that backend can register // itself. We keep that pointer, so never close the // module! // RTLD_LAZY is needed for the WebDAV backend, which // needs to do an explicit dlopen() of libneon in compatibility // mode before any of the neon functions can be resolved. void *dlhandle = dlopen(fullpath.c_str(), RTLD_LAZY|RTLD_GLOBAL); // remember which modules were found and which were not if (dlhandle) { debug<<"Loading backend library "< m_available; std::ostringstream debug, info; } scannedModules; string SyncSource::backendsInfo() { return scannedModules.info.str(); } string SyncSource::backendsDebug() { return scannedModules.debug.str(); } void SyncSource::requestAnotherSync() { // At the moment the per-source request to restart cannot be // stored; instead only a per-session request is set. That's okay // for now because restarting is limited to sessions with only // one source active (intentional simplification). SE_LOG_DEBUG(getDisplayName(), "requesting another sync"); SyncContext::requestAnotherSync(); } SyncSource *SyncSource::createSource(const SyncSourceParams ¶ms, bool error, SyncConfig *config) { SourceType sourceType = getSourceType(params.m_nodes); if (sourceType.m_backend == "virtual") { SyncSource *source = NULL; source = new VirtualSyncSource(params, config); if (error && !source) { Exception::throwError(SE_HERE, params.getDisplayName() + ": virtual datastore cannot be instantiated"); } return source; } const SourceRegistry ®istry(getSourceRegistry()); auto_ptr source; BOOST_FOREACH(const RegisterSyncSource *sourceInfos, registry) { auto_ptr nextSource(sourceInfos->m_create(params)); if (nextSource.get()) { if (source.get()) { Exception::throwError(SE_HERE, params.getDisplayName() + ": backend " + sourceType.m_backend + " is ambiguous, avoid the alias and pick a specific backend instead directly"); } source = nextSource; } } if (source.get()) { return source.release(); } if (error) { string backends; if (!scannedModules.m_available.empty()) { backends += "by any of the backend modules ("; backends += boost::join(scannedModules.m_available, ", "); backends += ") "; } string problem = StringPrintf("%s%sbackend not supported %sor not correctly configured (backend=%s databaseFormat=%s syncFormat=%s)", params.m_name.c_str(), params.m_name.empty() ? "" : ": ", backends.c_str(), sourceType.m_backend.c_str(), sourceType.m_localFormat.c_str(), sourceType.m_format.c_str()); Exception::throwError(SE_HERE, SyncMLStatus(sysync::LOCERR_CFGPARSE), problem); } return NULL; } SyncSource *SyncSource::createTestingSource(const string &name, const string &type, bool error, const char *prefix) { std::string config = "target-config@client-test"; const char *server = getenv("CLIENT_TEST_SERVER"); if (server) { config += "-"; config += server; } boost::shared_ptr context(new SyncConfig(config)); SyncSourceNodes nodes = context->getSyncSourceNodes(name); SyncSourceParams params(name, nodes, context); PersistentSyncSourceConfig sourceconfig(name, nodes); sourceconfig.setSourceType(type); if (prefix) { sourceconfig.setDatabaseID(string(prefix) + name + "_1"); } return createSource(params, error); } VirtualSyncSource::VirtualSyncSource(const SyncSourceParams ¶ms, SyncConfig *config) : DummySyncSource(params) { if (config) { std::string evoSyncSource = getDatabaseID(); BOOST_FOREACH(std::string name, getMappedSources()) { if (name.empty()) { throwError(SE_HERE, StringPrintf("configuration of underlying datastores contains empty datastore name: database = '%s'", evoSyncSource.c_str())); } SyncSourceNodes source = config->getSyncSourceNodes(name); SyncSourceParams params(name, source, boost::shared_ptr(config, SyncConfigNOP())); boost::shared_ptr syncSource(createSource(params, true, config)); m_sources.push_back(syncSource); } if (m_sources.size() != 2) { throwError(SE_HERE, StringPrintf("configuration of underlying datastores must contain exactly one calendar and one todo datastore (like calendar+todo): database = '%s'", evoSyncSource.c_str())); } } m_operations.m_isEmpty = boost::bind(&VirtualSyncSource::isEmpty, this); } void VirtualSyncSource::open() { getDataTypeSupport(); BOOST_FOREACH(boost::shared_ptr &source, m_sources) { source->open(); } } bool VirtualSyncSource::isEmpty() { bool empty = true; SuspendFlags &s = SuspendFlags::getSuspendFlags(); BOOST_FOREACH(boost::shared_ptr &source, m_sources) { // Operation might not be implemented, in which case we have to // assume "not empty". if (!source->getOperations().m_isEmpty || !source->getOperations().m_isEmpty()) { empty = false; // Keep checking, because isEmpty() is also used for // isUsable() and we have to touch all sources for that. } // Operation might have been aborted by user, need to check. s.checkForNormal(); } return empty; } void VirtualSyncSource::close() { BOOST_FOREACH(boost::shared_ptr &source, m_sources) { source->close(); } } std::vector VirtualSyncSource::getMappedSources() { std::string evoSyncSource = getDatabaseID(); std::vector mappedSources = unescapeJoinedString (evoSyncSource, ','); return mappedSources; } std::string VirtualSyncSource::getDataTypeSupport() { string datatypes; SourceType sourceType = getSourceType(); string type = sourceType.m_format; datatypes = getDataTypeSupport(type, sourceType.m_forceFormat); return datatypes; } SyncSource::Databases VirtualSyncSource::getDatabases() { SyncSource::Databases dbs; BOOST_FOREACH (boost::shared_ptr &source, m_sources) { SyncSource::Databases sub = source->getDatabases(); if (sub.empty()) { return dbs; } } Database db ("calendar+todo", ""); dbs.push_back (db); return dbs; } void SyncSourceSession::init(SyncSource::Operations &ops) { ops.m_startDataRead = boost::bind(&SyncSourceSession::startDataRead, this, _1, _2); ops.m_endDataRead = boost::lambda::constant(sysync::LOCERR_OK); ops.m_startDataWrite = boost::lambda::constant(sysync::LOCERR_OK); ops.m_endDataWrite = boost::bind(&SyncSourceSession::endDataWrite, this, _1, _2); } sysync::TSyError SyncSourceSession::startDataRead(const char *lastToken, const char *resumeToken) { try { beginSync(lastToken ? lastToken : "", resumeToken ? resumeToken : ""); } catch (const StatusException &ex) { SyncMLStatus status = ex.syncMLStatus(); if (status == STATUS_SLOW_SYNC_508) { // Not an error. Return it normally, without ERROR logging // in our caller. return status; } else { throw; } } return sysync::LOCERR_OK; } sysync::TSyError SyncSourceSession::endDataWrite(bool success, char **newToken) { std::string token = endSync(success); *newToken = StrAlloc(token.c_str()); return sysync::LOCERR_OK; } void SyncSourceChanges::init(SyncSource::Operations &ops) { ops.m_readNextItem = boost::bind(&SyncSourceChanges::iterate, this, _1, _2, _3); } SyncSourceChanges::SyncSourceChanges() : m_first(true) { } bool SyncSourceChanges::addItem(const string &luid, State state) { pair res = m_items[state].insert(luid); return res.second; } bool SyncSourceChanges::reset() { bool removed = false; for (int i = 0; i < MAX; i++) { if (!m_items[i].empty()) { m_items[i].clear(); removed = true; } } m_first = true; return removed; } sysync::TSyError SyncSourceChanges::iterate(sysync::ItemID aID, sysync::sInt32 *aStatus, bool aFirst) { aID->item = NULL; aID->parent = NULL; if (m_first || aFirst) { m_it = m_items[ANY].begin(); m_first = false; } if (m_it == m_items[ANY].end()) { *aStatus = sysync::ReadNextItem_EOF; } else { const string &luid = *m_it; if (m_items[NEW].find(luid) != m_items[NEW].end() || m_items[UPDATED].find(luid) != m_items[UPDATED].end()) { *aStatus = sysync::ReadNextItem_Changed; } else { *aStatus = sysync::ReadNextItem_Unchanged; } aID->item = StrAlloc(luid.c_str()); ++m_it; } return sysync::LOCERR_OK; } void SyncSourceDelete::init(SyncSource::Operations &ops) { ops.m_deleteItem = boost::bind(&SyncSourceDelete::deleteItemSynthesis, this, _1); } sysync::TSyError SyncSourceDelete::deleteItemSynthesis(sysync::cItemID aID) { deleteItem(aID->item); incrementNumDeleted(); return sysync::LOCERR_OK; } void SyncSourceSerialize::getSynthesisInfo(SynthesisInfo &info, XMLConfigFragments &fragments) { string type = getMimeType(); // default remote rule (local-storage.xml): suppresses empty properties info.m_backendRule = "LOCALSTORAGE"; // We store entire items locally and thus have to make sure that // they are complete by having the engine merge incoming and local // data. info.m_datastoreOptions += " true\n"; if (type == "text/x-vcard") { info.m_native = "vCard21"; info.m_fieldlist = "contacts"; info.m_profile = "\"vCard\", 1"; info.m_datatypes = " \n" " \n"; } else if (type == "text/vcard") { info.m_native = "vCard30"; info.m_fieldlist = "contacts"; info.m_profile = "\"vCard\", 2"; info.m_datatypes = " \n" " \n"; // If a backend overwrites the m_beforeWriteScript, then it must // include $VCARD_OUTGOING_PHOTO_VALUE_SCRIPT in its own script, // otherwise it will be sent invalid, empty PHOTO;TYPE=unknown;VALUE=binary: // properties. info.m_beforeWriteScript = "$VCARD_BEFOREWRITE_SCRIPT;\n"; // Likewise for reading. This is needed to ensure proper merging // of contact data. info.m_afterReadScript = "$VCARD_AFTERREAD_SCRIPT;\n"; } else if (type == "text/x-calendar" || type == "text/x-vcalendar") { info.m_native = "vCalendar10"; info.m_fieldlist = "calendar"; info.m_profile = "\"vCalendar\", 1"; info.m_datatypes = " \n" " \n"; /** * here are two default implementations. If user wants to reset it, * just implement its own getSynthesisInfo. If user wants to use this default * implementations and its new scripts, it is possible to append its implementations * to info.m_afterReadScript and info.m_beforeWriteScript. */ info.m_afterReadScript = "$VCALENDAR10_AFTERREAD_SCRIPT;\n"; info.m_beforeWriteScript = "$VCALENDAR10_BEFOREWRITE_SCRIPT;\n" "$CALENDAR_BEFOREWRITE_SCRIPT;\n"; } else if (type == "text/calendar" || boost::starts_with(type, "text/calendar+")) { info.m_native = "iCalendar20"; info.m_fieldlist = "calendar"; info.m_profile = "\"vCalendar\", 2"; info.m_datatypes = " \n" " \n"; info.m_beforeWriteScript = "$CALENDAR_BEFOREWRITE_SCRIPT;\n"; } else if (type == "text/plain") { info.m_fieldlist = "Note"; info.m_profile = "\"Note\", 2"; } else if (type == "raw/text/vcard") { info.m_native = "vCard30"; info.m_fieldlist = "Raw"; info.m_datatypes = " \n"; } else if (type == "raw/text/calendar") { info.m_native = "iCalendar20"; info.m_fieldlist = "Raw"; info.m_datatypes = " \n"; } else { throwError(SE_HERE, string("default MIME type not supported: ") + type); } SourceType sourceType = getSourceType(); if (!sourceType.m_format.empty()) { type = sourceType.m_format; } info.m_datatypes = getDataTypeSupport(type, sourceType.m_forceFormat); } std::string SyncSourceBase::getDataTypeSupport(const std::string &type, bool forceFormat) { std::string datatypes; if (type == "text/x-vcard:2.1" || type == "text/x-vcard") { datatypes = " \n"; if (!forceFormat) { datatypes += " \n"; } } else if (type == "text/vcard:3.0" || type == "text/vcard") { datatypes = " \n"; if (!forceFormat) { datatypes += " \n"; } } else if (type == "text/x-vcalendar:1.0" || type == "text/x-vcalendar" || type == "text/x-calendar:1.0" || type == "text/x-calendar") { datatypes = " \n"; if (!forceFormat) { datatypes += " \n"; } } else if (type == "text/calendar:2.0" || type == "text/calendar") { datatypes = " \n"; if (!forceFormat) { datatypes += " \n"; } } else if (type == "text/calendar+plain") { datatypes = " \n" " \n" " \n"; } else if (type == "text/plain:1.0" || type == "text/plain") { // note10 are the same as note11, so ignore force format datatypes = " \n" " \n"; } else if (type == "raw/text/vcard") { datatypes = " \n"; } else if (type == "raw/text/calendar") { datatypes = " \n"; } else if (type.empty()) { throwError(SE_HERE, "no MIME type configured"); } else { throwError(SE_HERE, string("configured MIME type not supported: ") + type); } return datatypes; } sysync::TSyError SyncSourceSerialize::readItemAsKey(sysync::cItemID aID, sysync::KeyH aItemKey) { std::string item; readItem(aID->item, item); TSyError res = getSynthesisAPI()->setValue(aItemKey, "itemdata", item.c_str(), item.size()); return res; } SyncSource::Operations::InsertItemAsKeyResult_t SyncSourceSerialize::insertItemAsKey(sysync::KeyH aItemKey, sysync::ItemID newID) { SharedBuffer data; TSyError res = getSynthesisAPI()->getValue(aItemKey, "itemdata", data); if (!res) { InsertItemResult inserted = insertItem("", data.get()); switch (inserted.m_state) { case ITEM_OKAY: break; case ITEM_AGAIN: // Skip setting the newID. return Operations::InsertItemAsKeyContinue_t(boost::bind(&SyncSourceSerialize::insertContinue, this, _2, inserted.m_continue)); break; case ITEM_REPLACED: res = sysync::DB_DataReplaced; break; case ITEM_MERGED: res = sysync::DB_DataMerged; break; case ITEM_NEEDS_MERGE: res = sysync::DB_Conflict; break; } newID->item = StrAlloc(inserted.m_luid.c_str()); } return res; } SyncSource::Operations::UpdateItemAsKeyResult_t SyncSourceSerialize::updateItemAsKey(sysync::KeyH aItemKey, sysync::cItemID aID, sysync::ItemID newID) { SharedBuffer data; TSyError res = getSynthesisAPI()->getValue(aItemKey, "itemdata", data); if (!res) { InsertItemResult inserted = insertItem(aID->item, data.get()); switch (inserted.m_state) { case ITEM_OKAY: break; case ITEM_AGAIN: // Skip setting the newID. return Operations::UpdateItemAsKeyContinue_t(boost::bind(&SyncSourceSerialize::insertContinue, this, _3, inserted.m_continue)); break; case ITEM_REPLACED: res = sysync::DB_DataReplaced; break; case ITEM_MERGED: res = sysync::DB_DataMerged; break; case ITEM_NEEDS_MERGE: res = sysync::DB_Conflict; break; } newID->item = StrAlloc(inserted.m_luid.c_str()); } return res; } sysync::TSyError SyncSourceSerialize::insertContinue(sysync::ItemID newID, const InsertItemResult::Continue_t &cont) { // The engine cannot tell us when it needs results (for example, // in the "final message received from peer" case in // TSyncSession::EndMessage(), so assume that it does whenever it // calls us again => flush and wait. flushItemChanges(); finishItemChanges(); InsertItemResult inserted = cont(); TSyError res = sysync::LOCERR_OK; switch (inserted.m_state) { case ITEM_OKAY: break; case ITEM_AGAIN: // Skip setting the newID. return sysync::LOCERR_AGAIN; break; case ITEM_REPLACED: res = sysync::DB_DataReplaced; break; case ITEM_MERGED: res = sysync::DB_DataMerged; break; case ITEM_NEEDS_MERGE: res = sysync::DB_Conflict; break; } newID->item = StrAlloc(inserted.m_luid.c_str()); return res; } SyncSourceSerialize::InsertItemResult SyncSourceSerialize::insertItemRaw(const std::string &luid, const std::string &item) { InsertItemResult result = insertItem(luid, item); while (result.m_state == ITEM_AGAIN) { // Flush and wait, because caller (command line, restore) is // not prepared to deal with asynchronous execution. flushItemChanges(); finishItemChanges(); result = result.m_continue(); } return result; } void SyncSourceSerialize::readItemRaw(const std::string &luid, std::string &item) { return readItem(luid, item); } void SyncSourceSerialize::init(SyncSource::Operations &ops) { ops.m_readItemAsKey = boost::bind(&SyncSourceSerialize::readItemAsKey, this, _1, _2); ops.m_insertItemAsKey = boost::bind(&SyncSourceSerialize::insertItemAsKey, this, _1, _2); ops.m_updateItemAsKey = boost::bind(&SyncSourceSerialize::updateItemAsKey, this, _1, _2, _3); } void ItemCache::init(const SyncSource::Operations::ConstBackupInfo &oldBackup, const SyncSource::Operations::BackupInfo &newBackup, bool legacy) { m_counter = 1; m_legacy = legacy; m_backup = newBackup; m_hash2counter.clear(); m_dirname = oldBackup.m_dirname; if (m_dirname.empty() || !oldBackup.m_node) { return; } long numitems; if (!oldBackup.m_node->getProperty("numitems", numitems)) { return; } for (long counter = 1; counter <= numitems; counter++) { stringstream key; key << counter << m_hashSuffix; Hash_t hash; if (oldBackup.m_node->getProperty(key.str(), hash)) { m_hash2counter[hash] = counter; } } } void ItemCache::reset() { // clean directory and start counting at 1 again m_counter = 1; rm_r(m_backup.m_dirname); mkdir_p(m_backup.m_dirname); m_backup.m_node->clear(); } string ItemCache::getFilename(Hash_t hash) { Map_t::const_iterator it = m_hash2counter.find(hash); if (it != m_hash2counter.end()) { stringstream dirname; dirname << m_dirname << "/" << it->second; return dirname.str(); } else { return ""; } } const char *ItemCache::m_hashSuffix = #ifdef USE_SHA256 "-sha256" #else "-hash" #endif ; void ItemCache::backupItem(const std::string &item, const std::string &uid, const std::string &rev) { stringstream filename; filename << m_backup.m_dirname << "/" << m_counter; ItemCache::Hash_t hash = hashFunc(item); string oldfilename = getFilename(hash); if (!oldfilename.empty()) { // found old file with same content, reuse it via hardlink if (link(oldfilename.c_str(), filename.str().c_str())) { // Hard linking failed. Record this, then continue // by ignoring the old file. SE_LOG_DEBUG(NULL, "hard linking old %s new %s: %s", oldfilename.c_str(), filename.str().c_str(), strerror(errno)); oldfilename.clear(); } } if (oldfilename.empty()) { // write new file instead of reusing old one ofstream out(filename.str().c_str()); out.write(item.c_str(), item.size()); out.close(); if (out.fail()) { SE_THROW(string("error writing ") + filename.str() + ": " + strerror(errno)); } } stringstream key; key << m_counter << "-uid"; m_backup.m_node->setProperty(key.str(), uid); if (m_legacy) { // clear() does not remove the existing content, which was // intended here. This should have been key.str(""). As a // result, keys for -rev are longer than intended because they // start with the -uid part. We cannot change it now, because // that would break compatibility with nodes that use the // older, longer keys for -rev. // key.clear(); } else { key.str(""); } key << m_counter << "-rev"; m_backup.m_node->setProperty(key.str(), rev); key.str(""); key << m_counter << ItemCache::m_hashSuffix; m_backup.m_node->setProperty(key.str(), hash); m_counter++; } void ItemCache::finalize(BackupReport &report) { stringstream value; value << m_counter - 1; m_backup.m_node->setProperty("numitems", value.str()); m_backup.m_node->flush(); report.setNumItems(m_counter - 1); } void SyncSourceRevisions::initRevisions() { if (!m_revisionsSet) { // might still be filled with garbage from previous run m_revisions.clear(); listAllItems(m_revisions); m_revisionsSet = true; } } void SyncSourceRevisions::backupData(const SyncSource::Operations::ConstBackupInfo &oldBackup, const SyncSource::Operations::BackupInfo &newBackup, BackupReport &report) { ItemCache cache; cache.init(oldBackup, newBackup, true); bool startOfSync = newBackup.m_mode == SyncSource::Operations::BackupInfo::BACKUP_BEFORE; RevisionMap_t buffer; RevisionMap_t *revisions; if (startOfSync) { initRevisions(); revisions = &m_revisions; } else { listAllItems(buffer); revisions = &buffer; } // Ensure that source knows what we are going to read. std::vector uids; uids.reserve(revisions->size()); BOOST_FOREACH(const StringPair &mapping, *revisions) { uids.push_back(mapping.first); } // We may dump after a hint was already set when starting the // sync. Remember that and restore it when done. If we fail, we // don't need to restore, because then syncing will abort or skip // the source. ReadAheadOrder oldOrder; ReadAheadItems oldLUIDs; getReadAheadOrder(oldOrder, oldLUIDs); setReadAheadOrder(READ_SELECTED_ITEMS, uids); string item; errno = 0; BOOST_FOREACH(const StringPair &mapping, *revisions) { const string &uid = mapping.first; const string &rev = mapping.second; m_raw->readItemRaw(uid, item); cache.backupItem(item, uid, rev); } setReadAheadOrder(oldOrder, oldLUIDs); cache.finalize(report); } void SyncSourceRevisions::restoreData(const SyncSource::Operations::ConstBackupInfo &oldBackup, bool dryrun, SyncSourceReport &report) { RevisionMap_t revisions; listAllItems(revisions); long numitems; string strval; strval = oldBackup.m_node->readProperty("numitems"); stringstream stream(strval); stream >> numitems; for (long counter = 1; counter <= numitems; counter++) { stringstream key; key << counter << "-uid"; string uid = oldBackup.m_node->readProperty(key.str()); key.clear(); key << counter << "-rev"; string rev = oldBackup.m_node->readProperty(key.str()); RevisionMap_t::iterator it = revisions.find(uid); report.incrementItemStat(report.ITEM_LOCAL, report.ITEM_ANY, report.ITEM_TOTAL); if (it != revisions.end() && it->second == rev) { // item exists in backup and database with same revision: // nothing to do } else { // add or update, so need item stringstream filename; filename << oldBackup.m_dirname << "/" << counter; string data; if (!ReadFile(filename.str(), data)) { throwError(SE_HERE, StringPrintf("restoring %s from %s failed: could not read file", uid.c_str(), filename.str().c_str())); } // TODO: it would be nicer to recreate the item // with the original revision. If multiple peers // synchronize against us, then some of them // might still be in sync with that revision. By // updating the revision here we force them to // needlessly receive an update. // // For the current peer for which we restore this is // avoided by the revision check above: unchanged // items aren't touched. SyncSourceReport::ItemState state = it == revisions.end() ? SyncSourceReport::ITEM_ADDED : // not found in database, create anew SyncSourceReport::ITEM_UPDATED; // found, update existing item try { report.incrementItemStat(report.ITEM_LOCAL, state, report.ITEM_TOTAL); if (!dryrun) { m_raw->insertItemRaw(it == revisions.end() ? "" : uid, data); } } catch (...) { report.incrementItemStat(report.ITEM_LOCAL, state, report.ITEM_REJECT); throw; } } // remove handled item from revision list so // that when we are done, the only remaining // items listed there are the ones which did // no exist in the backup if (it != revisions.end()) { revisions.erase(it); } } // now remove items that were not in the backup BOOST_FOREACH(const StringPair &mapping, revisions) { try { report.incrementItemStat(report.ITEM_LOCAL, report.ITEM_REMOVED, report.ITEM_TOTAL); if (!dryrun) { m_del->deleteItem(mapping.first); } } catch(...) { report.incrementItemStat(report.ITEM_LOCAL, report.ITEM_REMOVED, report.ITEM_REJECT); throw; } } } bool SyncSourceRevisions::detectChanges(ConfigNode &trackingNode, ChangeMode mode) { bool forceSlowSync = false; // erase content which might have been set in a previous call reset(); if (!m_firstCycle) { // detectChanges() must have been called before; // don't trust our cached revisions in that case (not updated during sync!) // TODO: keep the revision map up-to-date as part of a sync and reuse it m_revisionsSet = false; } else { m_firstCycle = false; } if (mode == CHANGES_NONE) { // shortcut because nothing changed: just copy our known item list ConfigProps props; trackingNode.readProperties(props); RevisionMap_t revisions; BOOST_FOREACH(const StringPair &mapping, props) { const string &uid = mapping.first; const string &revision = mapping.second; addItem(uid); revisions[uid] = revision; } setAllItems(revisions); return false; } if (!m_revisionsSet && mode == CHANGES_FULL) { ConfigProps props; trackingNode.readProperties(props); if (!props.empty()) { // We were not asked to throw away all old information and // there is some that may be worth salvaging, so let's give // our derived class a chance to update it instead of having // to reread everything. // // The exact number of items at which the update method is // more efficient depends on the derived class; here we assume // that even a single item makes it worthwhile. The derived // class can always ignore the information if it has different // tradeoffs. // // TODO (?): an API which only provides the information // on demand... m_revisions.clear(); m_revisions.insert(props.begin(), props.end()); updateAllItems(m_revisions); // continue with m_revisions initialized below m_revisionsSet = true; } } // traditional, slow fallback follows... initRevisions(); // Check whether we have valid revision information. If not, then // we need to do a slow sync. The assumption here is that an empty // revision string marks missing information. When we don't need // change information, not having a revision string is okay. if (needChanges() && !m_revisions.empty() && m_revisions.begin()->second.empty()) { forceSlowSync = true; mode = CHANGES_SLOW; } // If we don't need changes, then override the mode so that // we don't compute them below. if (!needChanges()) { mode = CHANGES_SLOW; } // Delay setProperty calls until after checking all uids. // Necessary for MapSyncSource, which shares the revision among // several uids. Another advantage is that we can do the "find // deleted items" check with less entries (new items not added // yet). StringMap revUpdates; if (mode == CHANGES_SLOW) { // Make tracking node identical to current set of items // by re-adding them below. trackingNode.clear(); } BOOST_FOREACH(const StringPair &mapping, m_revisions) { const string &uid = mapping.first; const string &revision = mapping.second; // always remember the item, need full list addItem(uid); // avoid unnecessary work in CHANGES_SLOW mode if (mode == CHANGES_SLOW) { trackingNode.setProperty(uid, revision); } else { // detect changes string serverRevision(trackingNode.readProperty(uid)); if (!serverRevision.size()) { addItem(uid, NEW); revUpdates[uid] = revision; } else { if (revision != serverRevision) { addItem(uid, UPDATED); revUpdates[uid] = revision; } } } } if (mode != CHANGES_SLOW) { // clear information about all items that we recognized as deleted ConfigProps props; trackingNode.readProperties(props); BOOST_FOREACH(const StringPair &mapping, props) { const string &uid(mapping.first); if (getAllItems().find(uid) == getAllItems().end()) { addItem(uid, DELETED); trackingNode.removeProperty(uid); } } // now update tracking node BOOST_FOREACH(const StringPair &update, revUpdates) { trackingNode.setProperty(update.first, update.second); } } return forceSlowSync; } void SyncSourceRevisions::updateRevision(ConfigNode &trackingNode, const std::string &old_luid, const std::string &new_luid, const std::string &revision) { if (!needChanges()) { return; } databaseModified(); if (old_luid != new_luid) { trackingNode.removeProperty(old_luid); } if (new_luid.empty() || revision.empty()) { throwError(SE_HERE, "need non-empty LUID and revision string"); } trackingNode.setProperty(new_luid, revision); } void SyncSourceRevisions::deleteRevision(ConfigNode &trackingNode, const std::string &luid) { if (!needChanges()) { return; } databaseModified(); trackingNode.removeProperty(luid); } SyncMLStatus SyncSourceRevisions::sleepSinceModification() { Timespec current = Timespec::monotonic(); // Don't let this get interrupted by user abort. // It is needed for correct change tracking. while ((current - m_modTimeStamp).duration() < m_revisionAccuracySeconds) { Sleep(m_revisionAccuracySeconds - (current - m_modTimeStamp).duration()); current = Timespec::monotonic(); } return STATUS_OK; } void SyncSourceRevisions::databaseModified() { m_modTimeStamp = Timespec::monotonic(); } void SyncSourceRevisions::init(SyncSourceRaw *raw, SyncSourceDelete *del, int granularity, SyncSource::Operations &ops) { m_raw = raw; m_del = del; m_revisionAccuracySeconds = granularity; m_revisionsSet = false; m_firstCycle = false; if (raw) { ops.m_backupData = boost::bind(&SyncSourceRevisions::backupData, this, _1, _2, _3); } if (raw && del) { ops.m_restoreData = boost::bind(&SyncSourceRevisions::restoreData, this, _1, _2, _3); } ops.m_endDataWrite.getPostSignal().connect(boost::bind(&SyncSourceRevisions::sleepSinceModification, this)); } std::string SyncSourceLogging::getDescription(sysync::KeyH aItemKey) { try { std::list values; BOOST_FOREACH(const std::string &field, m_fields) { SharedBuffer value; if (!getSynthesisAPI()->getValue(aItemKey, field, value) && value.size()) { values.push_back(std::string(value.get())); } } std::string description = boost::join(values, m_sep); return description; } catch (...) { // Instead of failing we log the error and ask // the caller to log the UID. That way transient // errors or errors in the logging code don't // prevent syncs. handleException(); return ""; } } std::string SyncSourceLogging::getDescription(const string &luid) { return ""; } SyncMLStatus SyncSourceLogging::insertItemAsKey(sysync::KeyH aItemKey, sysync::ItemID newID) { std::string description = getDescription(aItemKey); SE_LOG_INFO(getDisplayName(), description.empty() ? "%s <%s>" : "%s \"%s\"", "adding", !description.empty() ? description.c_str() : "???"); return STATUS_OK; } SyncMLStatus SyncSourceLogging::updateItemAsKey(sysync::KeyH aItemKey, sysync::cItemID aID, sysync::ItemID newID) { std::string description = getDescription(aItemKey); SE_LOG_INFO(getDisplayName(), description.empty() ? "%s <%s>" : "%s \"%s\"", "updating", !description.empty() ? description.c_str() : aID ? aID->item : "???"); return STATUS_OK; } SyncMLStatus SyncSourceLogging::deleteItem(sysync::cItemID aID) { std::string description = getDescription(aID->item); SE_LOG_INFO(getDisplayName(), description.empty() ? "%s <%s>" : "%s \"%s\"", "deleting", !description.empty() ? description.c_str() : aID->item); return STATUS_OK; } void SyncSourceLogging::init(const std::list &fields, const std::string &sep, SyncSource::Operations &ops) { m_fields = fields; m_sep = sep; ops.m_insertItemAsKey.getPreSignal().connect(boost::bind(&SyncSourceLogging::insertItemAsKey, this, _2, _3)); ops.m_updateItemAsKey.getPreSignal().connect(boost::bind(&SyncSourceLogging::updateItemAsKey, this, _2, _3, _4)); ops.m_deleteItem.getPreSignal().connect(boost::bind(&SyncSourceLogging::deleteItem, this, _2)); } sysync::TSyError SyncSourceAdmin::loadAdminData(const char *aLocDB, const char *aRemDB, char **adminData) { std::string data = m_configNode->readProperty(m_adminPropertyName); *adminData = StrAlloc(StringEscape::unescape(data, '!').c_str()); resetMap(); return sysync::LOCERR_OK; } sysync::TSyError SyncSourceAdmin::saveAdminData(const char *adminData) { m_configNode->setProperty(m_adminPropertyName, StringEscape::escape(adminData, '!', StringEscape::INI_VALUE)); // The exact ordering of API calls is not defined. In practice, EndDataWrite is // followed by Insert/Update/DeleteMapItem, finished by saveAdminData. Therefore // we flush here. flush(); return sysync::LOCERR_OK; } bool SyncSourceAdmin::readNextMapItem(sysync::MapID mID, bool aFirst) { if (aFirst) { resetMap(); } if (m_mappingIterator != m_mapping.end()) { entry2mapid(m_mappingIterator->first, m_mappingIterator->second, mID); ++m_mappingIterator; return true; } else { return false; } } sysync::TSyError SyncSourceAdmin::insertMapItem(sysync::cMapID mID) { string key, value; mapid2entry(mID, key, value); #if 0 StringMap::iterator it = m_mapping.find(key); if (it != m_mapping.end()) { // error, exists already return sysync::DB_Forbidden; } else { m_mapping[key] = value; return sysync::LOCERR_OK; } #else m_mapping[key] = value; return sysync::LOCERR_OK; #endif } sysync::TSyError SyncSourceAdmin::updateMapItem(sysync::cMapID mID) { string key, value; mapid2entry(mID, key, value); ConfigProps::iterator it = m_mapping.find(key); if (it == m_mapping.end()) { // error, does not exist return sysync::DB_Forbidden; } else { m_mapping[key] = value; return sysync::LOCERR_OK; } } sysync::TSyError SyncSourceAdmin::deleteMapItem(sysync::cMapID mID) { string key, value; mapid2entry(mID, key, value); ConfigProps::iterator it = m_mapping.find(key); if (it == m_mapping.end()) { // error, does not exist return sysync::DB_Forbidden; } else { m_mapping.erase(it); return sysync::LOCERR_OK; } } SyncMLStatus SyncSourceAdmin::flush() { m_configNode->flush(); if (m_mappingLoaded) { m_mappingNode->clear(); m_mappingNode->writeProperties(m_mapping); m_mappingNode->flush(); } return STATUS_OK; } void SyncSourceAdmin::resetMap() { m_mapping.clear(); m_mappingNode->readProperties(m_mapping); m_mappingIterator = m_mapping.begin(); m_mappingLoaded = true; } void SyncSourceAdmin::mapid2entry(sysync::cMapID mID, string &key, string &value) { key = StringPrintf("%s-%x", StringEscape::escape(mID->localID ? mID->localID : "", '!', StringEscape::INI_WORD).c_str(), mID->ident); if (mID->remoteID && mID->remoteID[0]) { value = StringPrintf("%s %x", StringEscape::escape(mID->remoteID ? mID->remoteID : "", '!', StringEscape::INI_WORD).c_str(), mID->flags); } else { value = StringPrintf("%x", mID->flags); } } void SyncSourceAdmin::entry2mapid(const string &key, const string &value, sysync::MapID mID) { size_t found = key.rfind('-'); mID->localID = StrAlloc(StringEscape::unescape(key.substr(0,found), '!').c_str()); if (found != key.npos) { mID->ident = strtol(key.substr(found+1).c_str(), NULL, 16); } else { mID->ident = 0; } std::vector< std::string > tokens; boost::split(tokens, value, boost::is_from_range(' ', ' ')); if (tokens.size() >= 2) { // if branch from mapid2entry above mID->remoteID = StrAlloc(StringEscape::unescape(tokens[0], '!').c_str()); mID->flags = strtol(tokens[1].c_str(), NULL, 16); } else { // else branch from above mID->remoteID = NULL; mID->flags = strtol(tokens[0].c_str(), NULL, 16); } } void SyncSourceAdmin::init(SyncSource::Operations &ops, const boost::shared_ptr &config, const std::string adminPropertyName, const boost::shared_ptr &mapping) { m_configNode = config; m_adminPropertyName = adminPropertyName; m_mappingNode = mapping; m_mappingLoaded = false; ops.m_loadAdminData = boost::bind(&SyncSourceAdmin::loadAdminData, this, _1, _2, _3); ops.m_saveAdminData = boost::bind(&SyncSourceAdmin::saveAdminData, this, _1); if (mapping->isVolatile()) { // Don't provide map item operations. SynthesisDBPlugin will // tell the Synthesis engine not to call these (normally needed // for suspend/resume, which we don't support in volatile mode // because we don't store any meta data persistently). // // ops.m_readNextMapItem = boost::lambda::constant(false); // ops.m_insertMapItem = boost::lambda::constant(sysync::LOCERR_OK); // ops.m_updateMapItem = boost::lambda::constant(sysync::LOCERR_OK); // ops.m_deleteMapItem = boost::lambda::constant(sysync::LOCERR_OK); } else { ops.m_readNextMapItem = boost::bind(&SyncSourceAdmin::readNextMapItem, this, _1, _2); ops.m_insertMapItem = boost::bind(&SyncSourceAdmin::insertMapItem, this, _1); ops.m_updateMapItem = boost::bind(&SyncSourceAdmin::updateMapItem, this, _1); ops.m_deleteMapItem = boost::bind(&SyncSourceAdmin::deleteMapItem, this, _1); } } void SyncSourceAdmin::init(SyncSource::Operations &ops, SyncSource *source) { init(ops, source->getProperties(true), SourceAdminDataName, source->getServerNode()); } void SyncSourceBlob::init(SyncSource::Operations &ops, const std::string &dir) { m_blob.Init(getSynthesisAPI(), getName().c_str(), dir, "", "", ""); ops.m_readBlob = boost::bind(&SyncSourceBlob::readBlob, this, _1, _2, _3, _4, _5, _6, _7); ops.m_writeBlob = boost::bind(&SyncSourceBlob::writeBlob, this, _1, _2, _3, _4, _5, _6, _7); ops.m_deleteBlob = boost::bind(&SyncSourceBlob::deleteBlob, this, _1, _2); } void TestingSyncSource::removeAllItems() { // remove longest luids first: // for luid=UID[+RECURRENCE-ID] that will // remove children from a merged event first, // which is better supported by certain servers Items_t items = getAllItems(); for (Items_t::reverse_iterator it = items.rbegin(); it != items.rend(); ++it) { deleteItem(*it); } } #ifdef ENABLE_UNIT_TESTS class SyncSourceTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(SyncSourceTest); CPPUNIT_TEST(backendsAvailable); CPPUNIT_TEST_SUITE_END(); void backendsAvailable() { //We expect backendsInfo() to be empty if !ENABLE_MODULES //Otherwise, there should be at least some backends. #ifdef ENABLE_MODULES CPPUNIT_ASSERT( !SyncSource::backendsInfo().empty() ); #endif } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(SyncSourceTest); #endif // ENABLE_UNIT_TESTS SE_END_CXX syncevolution-1.5/src/syncevo/SynthesisDBPlugin.cpp0000664000373300001540000006357712330727742024110 0ustar00nightlynightly00000000000000/* * This file implements the Synthesis DB API and maps it to * EvolutionSyncSources. It was derived from the Synthesis * sync_dbapi_demo.c file. * * The external API of this file are the globally visible * C functions defined by sync_dbapidef.h. * * Copyright (c) 2004-2008 by Synthesis AG * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include /* include general SDK definitions */ #include /* include the interface file and utilities */ #include /* include SDK utilities */ using namespace sysync; #include #include #include #include #include SE_BEGIN_CXX #define BuildNumber 0 /* User defined build number, can be 0..255 */ #define MyDB "SyncEvolution" /* example debug name */ #define MY_ID 42 /* example datastore context */ #define STRLEN 80 /* Max length of local string copies */ /* -- MODULE -------------------------------------------------------------------- */ /* will be casted to the SyncSource * structure */ static SyncSource *MoC(CContext mContext) { return (SyncSource *)mContext; } /** * looks up datasource and uses pointer to it as context * * @param mContextName name of previously instantiated SyncSource, "" when used as session module * @retval mContext the corresponding SyncSource */ extern "C" TSyError SyncEvolution_Module_CreateContext( CContext *mContext, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB ) { TSyError err = LOCERR_WRONGUSAGE; if (!mContextName[0]) { *mContext = NULL; err = LOCERR_OK; } else { SyncSource *source = SyncContext::findSource(mContextName); if (source) { source->pushSynthesisAPI(mCB); *mContext = (CContext)source; err = LOCERR_OK; } } SE_LOG_DEBUG(NULL, "CreateContext %s/%s/%s => %d", moduleName, subName, mContextName, err); return err; } /** * @TODO: introduce and return some kind of SyncEvolution build number */ extern "C" CVersion SyncEvolution_Module_Version(CContext mContext) { CVersion v = Plugin_Version(BuildNumber); if (mContext) { SE_LOG_DEBUG(NULL, "Module_Version = %08lx", (long)v); } return v; } /* Get the plug-in's capabilities */ extern "C" TSyError SyncEvolution_Module_Capabilities( CContext mContext, appCharP *mCapabilities ) { SyncSource *source = MoC(mContext); std::stringstream s; s << MyPlatform() << "\n" << DLL_Info << "\n" << CA_MinVersion << ":V1.0.6.0\n" /* must not be changed */ << CA_Manufacturer << ":SyncEvolution\n" << CA_Description << ":SyncEvolution Synthesis DB Plugin\n" << Plugin_DS_Data_Str << ":no\n" << Plugin_DS_Data_Key << ":yes\n" << CA_ItemAsKey << ":yes\n" << Plugin_DS_Blob << ((source && source->getOperations().m_readBlob) ? ":yes\n" : ":no\n"); if (source && source->getOperations().m_loadAdminData) { s << Plugin_DS_Admin << ":yes\n"; if (source && !source->getOperations().m_readNextMapItem) { s << CA_ResumeSupported << ":no\n"; } } *mCapabilities= StrAlloc(s.str().c_str()); SE_LOG_DEBUG(NULL, "Module_Capabilities:\n%s", *mCapabilities); return LOCERR_OK; } /* Module_Capabilities */ extern "C" TSyError SyncEvolution_Module_PluginParams( CContext mContext, cAppCharP mConfigParams, CVersion engineVersion ) { SyncSource *source = MoC(mContext); SE_LOG_DEBUG(source ? source->getDisplayName() : "", "Module_PluginParams\n Engine=%08lX\n %s", (long)engineVersion, mConfigParams); /*return LOCERR_CFGPARSE;*/ /* if there are unsupported params */ return LOCERR_OK; } /* Module_PluginParams */ /* Dispose the memory of the module context */ extern "C" void SyncEvolution_Module_DisposeObj( CContext mContext, void* memory ) { StrDispose(memory); } extern "C" TSyError SyncEvolution_Module_DeleteContext( CContext mContext ) { SyncSource *source = MoC(mContext); SE_LOG_DEBUG(NULL, "Module_DeleteContext %s", source ? source->getName().c_str() : "'session'"); if (source) { source->popSynthesisAPI(); } return LOCERR_OK; } /* will be casted to the SyncContext* structure */ static SyncContext* SeC( CContext sContext ) { return (SyncContext*)sContext; } /* Create a context for a new session. Maps to the existing SyncContext. */ extern "C" TSyError SyncEvolution_Session_CreateContext( CContext *sContext, cAppCharP sessionName, DB_Callback sCB ) { *sContext = (CContext)SyncContext::findContext(sessionName); SE_LOG_DEBUG(NULL, "Session_CreateContext '%s' %s", sessionName, *sContext ? "found" : "not found"); if (*sContext) { return LOCERR_OK; } else { return DB_NotFound; } } /* Session_CreateContext */ /* ----- "script-like" ADAPT --------- */ extern "C" TSyError SyncEvolution_Session_AdaptItem( CContext sContext, appCharP *sItemData1, appCharP *sItemData2, appCharP *sLocalVars, uInt32 sIdentifier ) { /**** CAN BE ADAPTED BY USER ****/ // SyncContext* sc= SeC( sContext ); SE_LOG_DEBUG(NULL, "Session_AdaptItem '%s' '%s' '%s' id=%d", *sItemData1,*sItemData2,*sLocalVars, sIdentifier); return LOCERR_OK; } /* Session_AdaptItem */ /* Check the database entry of and return its nonce string */ extern "C" TSyError SyncEvolution_Session_CheckDevice( CContext sContext, cAppCharP aDeviceID, appCharP *sDevKey, appCharP *nonce ) { SyncContext *sc = SeC(sContext); if (!sc) { return LOCERR_WRONGUSAGE; } TSyError res = LOCERR_OK; sc->setSyncDeviceID(aDeviceID); string id = sc->getRemoteDevID(); if (id.empty()) { sc->setRemoteDevID(aDeviceID); sc->flush(); } else if (id != aDeviceID) { // We are using the wrong configuration?! Refuse to continue. SE_LOG_ERROR(NULL, "remote device ID '%s' in config does not match the one from the peer '%s' - incorrect configuration?!", id.c_str(), aDeviceID); res = DB_Forbidden; } *sDevKey= StrAlloc(aDeviceID); *nonce = StrAlloc(sc->getNonce().c_str()); SE_LOG_DEBUG(NULL, "Session_CheckDevice dev='%s' nonce='%s' res=%d", *sDevKey, *nonce, res); return res; } /* Session_CheckDevice */ /* Get a new nonce from the database. If this returns an error, the SyncML engine * will create its own nonce. */ extern "C" TSyError SyncEvolution_Session_GetNonce( CContext sContext, appCharP *nonce ) { return DB_NotFound; } /* Session_GetNonce */ /* Save the new nonce (which will be expected to be returned * in the next session for this device */ extern "C" TSyError SyncEvolution_Session_SaveNonce( CContext sContext, cAppCharP nonce ) { SyncContext *sc = SeC(sContext); if (!sc) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(NULL, "Session_SaveNonce nonce='%s'", nonce); sc->setNonce(nonce); sc->flush(); return LOCERR_OK; } /* Session_SaveNonce */ /* Save the device info of */ extern "C" TSyError SyncEvolution_Session_SaveDeviceInfo( CContext sContext, cAppCharP aDeviceInfo ) { SyncContext *sc = SeC(sContext); if (!sc) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(NULL, "Session_SaveDeviceInfo info='%s'", aDeviceInfo ); sc->setDeviceData(aDeviceInfo); sc->flush(); return LOCERR_OK; } /* Session_SaveDeviceInfo */ /* Get the plugin's DB time */ extern "C" TSyError SyncEvolution_Session_GetDBTime( CContext sContext, appCharP *currentDBTime ) { return DB_NotFound; } /* Session_GetDBTime */ /* Return: Password_ClrText_IN 'SessionLogin' will get clear text password * Password_ClrText_OUT " must return clear text password * Password_MD5_OUT " must return MD5 coded password * Password_MD5_Nonce_IN " will get MD5B64(MD5B64(user:pwd):nonce) */ extern "C" sInt32 SyncEvolution_Session_PasswordMode( CContext sContext ) { return Password_ClrText_OUT; } /* Session_PasswordMode */ /* Make login */ extern "C" TSyError SyncEvolution_Session_Login( CContext sContext, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey ) { SyncContext *sc = SeC(sContext); if (!sc) { return LOCERR_WRONGUSAGE; } TSyError res = DB_Forbidden; UserIdentity id = sc->getSyncUser(); Credentials cred = IdentityProviderCredentials(id, sc->getSyncPassword()); const std::string &user = cred.m_username; const std::string &password = cred.m_password; if (user.empty() && password.empty()) { // nothing to check, accept peer res = LOCERR_OK; } else if (user == sUsername) { *sPassword=StrAlloc(password.c_str()); res = LOCERR_OK; } SE_LOG_DEBUG(NULL, "Session_Login usr='%s' expected user='%s' res=%d", sUsername, user.c_str(), res); return res; } /* Session_Login */ /* Make logout */ extern "C" TSyError SyncEvolution_Session_Logout( CContext sContext ) { return LOCERR_OK; } /* Session_Logout */ extern "C" void SyncEvolution_Session_DisposeObj( CContext sContext, void* memory ) { StrDispose ( memory ); } /* Session_DisposeObj */ /* Can be implemented empty, if no action is required */ extern "C" void SyncEvolution_Session_ThreadMayChangeNow( CContext sContext ) { } /* Session_ThreadMayChangeNow */ /* This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. Can be implemented empty, if not needed */ extern "C" void SyncEvolution_Session_DispItems( CContext sContext, bool allFields, cAppCharP specificItem ) { } /* Session_DispItems */ /* Delete a session context */ extern "C" TSyError SyncEvolution_Session_DeleteContext( CContext sContext ) { return LOCERR_OK; } /* Session_DeleteContext */ /* ----------------------------------------------------------------- */ /* This is an example, how a context could be structured */ /* will be casted to the SyncSource structure */ static SyncSource *DBC( CContext aContext ) { return (SyncSource *)aContext; } /* -- OPEN ----------------------------------------------------------------------- */ /** * looks up datasource and uses pointer to it as context * * @param aContextName name of previously instantiated SyncSource * @retval aContext the corresponding SyncSource */ extern "C" TSyError SyncEvolution_CreateContext( CContext *aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ) { TSyError err = LOCERR_WRONGUSAGE; SyncSource *source = SyncContext::findSource(aContextName); if (source) { source->pushSynthesisAPI(aCB); *aContext = (CContext)source; err = LOCERR_OK; } SE_LOG_DEBUG(source ? source->getDisplayName() : "", "'%s' dev='%s' usr='%s' err=%d", aContextName, sDevKey, sUsrKey, err); return err; } extern "C" uInt32 SyncEvolution_ContextSupport( CContext aContext, cAppCharP aContextRules ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "ContextSupport %s", aContextRules); return 0; } extern "C" uInt32 SyncEvolution_FilterSupport( CContext aContext, cAppCharP aFilterRules ) { /**** CAN BE ADAPTED BY USER ****/ SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "FilterSupport %s", aFilterRules); return 0; } /* FilterSupport */ /* -- ADMINISTRATION ------------------------------------------------------------ */ extern "C" TSyError SyncEvolution_LoadAdminData( CContext aContext, cAppCharP aLocDB, cAppCharP aRemDB, appCharP *adminData ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_loadAdminData(aLocDB, aRemDB, adminData); SE_LOG_DEBUG(source->getDisplayName(), "LoadAdminData '%s' '%s', '%s' res=%d", aLocDB, aRemDB, *adminData ? *adminData : "", res); return res; } /* LoadAdminData */ extern "C" TSyError SyncEvolution_SaveAdminData( CContext aContext, cAppCharP adminData ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_saveAdminData(adminData); SE_LOG_DEBUG(source->getDisplayName(), "SaveAdminData '%s' res=%d", adminData, res); return res; } /* SaveAdminData */ extern "C" bool SyncEvolution_ReadNextMapItem( CContext aContext, MapID mID, bool aFirst ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } bool res = false; try { // always reset mID, just in case that caller expects it or // operation doesn't do it correctly mID->localID = NULL; mID->remoteID = NULL; mID->ident = 0; mID->flags = 0; if (source->getOperations().m_readNextMapItem) { res = source->getOperations().m_readNextMapItem(mID, aFirst); } } catch (...) { res = source->handleException(); } SE_LOG_DEBUG(source->getDisplayName(), "ReadNextMapItem '%s' + %x = '%s' + %d first=%s res=%d", res ? NullPtrCheck(mID->localID) : "(none)", res ? mID->ident : 0, res ? NullPtrCheck(mID->remoteID) : "(none)", res ? mID->flags : 0, aFirst ? "yes" : "no", res); return res; } /* ReadNextMapItem */ extern "C" TSyError SyncEvolution_InsertMapItem( CContext aContext, cMapID mID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_insertMapItem(mID); SE_LOG_DEBUG(source->getDisplayName(), "InsertMapItem '%s' + %x = '%s' + %x res=%d", NullPtrCheck(mID->localID), mID->ident, NullPtrCheck(mID->remoteID), mID->flags, res); return res; } /* InsertMapItem */ extern "C" TSyError SyncEvolution_UpdateMapItem( CContext aContext, cMapID mID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_updateMapItem(mID); SE_LOG_DEBUG(source->getDisplayName(), "UpdateMapItem '%s' + %x = '%s' + %x, res=%d", mID->localID, mID->ident, mID->remoteID, mID->flags, res); return res; } /* UpdateMapItem */ extern "C" TSyError SyncEvolution_DeleteMapItem( CContext aContext, cMapID mID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_deleteMapItem(mID); SE_LOG_DEBUG(source->getDisplayName(), "DeleteMapItem '%s' + %x = '%s' + %x res=%d", mID->localID, mID->ident, mID->remoteID, mID->flags, res); return res; } /* DeleteMapItem */ /* -- GENERAL -------------------------------------------------------------------- */ extern "C" void SyncEvolution_DisposeObj( CContext aContext, void* memory ) { free( memory ); } /* DisposeObj */ extern "C" void SyncEvolution_ThreadMayChangeNow( CContext aContext ) { } /* ThreadMayChangeNow */ extern "C" void SyncEvolution_WriteLogData( CContext aContext, cAppCharP logData ) { } /* WriteLogData */ /* This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. Can be implemented empty, if not needed */ extern "C" void SyncEvolution_DispItems( CContext aContext, bool allFields, cAppCharP specificItem ) { } /* DispItems */ /* ----- "script-like" ADAPT --------- */ extern "C" TSyError SyncEvolution_AdaptItem( CContext aContext, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, uInt32 aIdentifier ) { /**** CAN BE ADAPTED BY USER ****/ SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "AdaptItem '%s' '%s' '%s' id=%d", *aItemData1, *aItemData2, *aLocalVars, aIdentifier); return LOCERR_OK; } /* AdaptItem */ /* -- READ ---------------------------------------------------------------------- */ /** * Start data access here and complete it in SyncEvolution_EndDataWrite(). */ extern "C" TSyError SyncEvolution_StartDataRead( CContext aContext, cAppCharP lastToken, cAppCharP resumeToken ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_startDataRead(lastToken, resumeToken); SE_LOG_DEBUG(source->getDisplayName(), "StartDataRead last='%s' resume='%s' res=%d", lastToken, resumeToken, res); return res; } extern "C" TSyError SyncEvolution_ReadNextItemAsKey( CContext aContext, ItemID aID, KeyH aItemKey, sInt32* aStatus, bool aFirst ) { /**** CAN BE ADAPTED BY USER ****/ SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } *aStatus = 0; memset(aID, 0, sizeof(*aID)); TSyError res = source->getOperations().m_readNextItem(aID, aStatus, aFirst); SE_LOG_DEBUG(source->getDisplayName(), "ReadNextItemAsKey aStatus=%d aID=(%s,%s) res=%d", *aStatus, aID->item, aID->parent, res); return res; } extern "C" TSyError SyncEvolution_ReadItemAsKey( CContext aContext, cItemID aID, KeyH aItemKey ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_readItemAsKey(aID, aItemKey); SE_LOG_DEBUG(source->getDisplayName(), "ReadItemAsKey aID=(%s,%s) res=%d", aID->item, aID->parent, res); return res; } extern "C" sysync::TSyError SyncEvolution_ReadBlob(CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer *aBlkPtr, memSize *aBlkSize, memSize *aTotSize, bool aFirst, bool *aLast) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res; if (source->getOperations().m_readBlob) { try { size_t blksize = aBlkSize ? static_cast(*aBlkSize) : 0, totsize = aTotSize ? static_cast(*aTotSize) : 0; /* Another conversion between memSize and size_t to make s390 happy */ res = source->getOperations().m_readBlob(aID, aBlobID, (void **)aBlkPtr, aBlkSize ? &blksize : NULL, aTotSize ? &totsize : NULL, aFirst, aLast); if (aBlkSize) { *aBlkSize = blksize; } if (aTotSize) { *aTotSize = totsize; } } catch (...) { res = source->handleException(); } } else { res = LOCERR_NOTIMP; } SE_LOG_DEBUG(source->getDisplayName(), "ReadBlob aID=(%s,%s) aBlobID=(%s) aBlkPtr=%p aBlkSize=%lu aTotSize=%lu aFirst=%s aLast=%s res=%d", aID->item,aID->parent, aBlobID, aBlkPtr, aBlkSize ? (unsigned long)*aBlkSize : 0, aTotSize ? (unsigned long)*aTotSize : 0, aFirst? "true" : "false", *aLast ? "true" : "false", res); return res; } /* ReadBlob */ extern "C" TSyError SyncEvolution_EndDataRead( CContext aContext ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_endDataRead(); SE_LOG_DEBUG(source->getDisplayName(), "EndDataRead res=%d", res); return res; } /* -- WRITE --------------------------------------------------------------------- */ extern "C" TSyError SyncEvolution_StartDataWrite( CContext aContext ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "StartDataWrite"); return LOCERR_OK; } extern "C" TSyError SyncEvolution_InsertItemAsKey( CContext aContext, KeyH aItemKey, ItemID newID ) { /**** CAN BE ADAPTED BY USER ****/ SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_insertItemAsKey(aItemKey, newID); SE_LOG_DEBUG(source->getDisplayName(), "InsertItemAsKey res=%d\n", res); return res; } extern "C" TSyError SyncEvolution_UpdateItemAsKey( CContext aContext, KeyH aItemKey, cItemID aID, ItemID updID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_updateItemAsKey(aItemKey, aID, updID); SE_LOG_DEBUG(source->getDisplayName(), "aID=(%s,%s) res=%d", aID->item,aID->parent, res); return res; } extern "C" TSyError SyncEvolution_MoveItem( CContext aContext, cItemID aID, cAppCharP newParID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "MoveItem aID=(%s,%s) => (%s,%s)", aID->item,aID->parent, aID->item,newParID); return LOCERR_NOTIMP; } extern "C" TSyError SyncEvolution_DeleteItem( CContext aContext, cItemID aID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_deleteItem(aID); SE_LOG_DEBUG(source->getDisplayName(), "DeleteItem aID=(%s,%s) res=%d", aID->item, aID->parent, res); return res; } extern "C" TSyError SyncEvolution_FinalizeLocalID( CContext aContext, cItemID aID, ItemID updID ) { return LOCERR_NOTIMP; } extern "C" TSyError SyncEvolution_DeleteSyncSet( CContext aContext ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "DeleteSyncSet not implemented"); return LOCERR_NOTIMP; } extern "C" TSyError SyncEvolution_WriteBlob(CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res; if (source->getOperations().m_writeBlob) { try { res = source->getOperations().m_writeBlob(aID, aBlobID, aBlkPtr, aBlkSize, aTotSize, aFirst, aLast); } catch (...) { res = source->handleException(); } } else { res = LOCERR_NOTIMP; } SE_LOG_DEBUG(source->getDisplayName(), "WriteBlob aID=(%s,%s) aBlobID=(%s) aBlkPtr=%p aBlkSize=%lu aTotSize=%lu aFirst=%s aLast=%s res=%d", aID->item,aID->parent, aBlobID, aBlkPtr, (unsigned long)aBlkSize, (unsigned long)aTotSize, aFirst ? "true" : "false", aLast ? "true" : "false", res); return res; } /* WriteBlob */ extern "C" TSyError SyncEvolution_DeleteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_deleteBlob(aID, aBlobID); SE_LOG_DEBUG(source->getDisplayName(), "DeleteBlob aID=(%s,%s) aBlobID=(%s) res=%d", aID->item,aID->parent, aBlobID, res); return res; } /* DeleteBlob */ extern "C" TSyError SyncEvolution_EndDataWrite( CContext aContext, bool success, appCharP *newToken ) { SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } TSyError res = source->getOperations().m_endDataWrite(success, newToken); SE_LOG_DEBUG(source->getDisplayName(), "EndDataWrite %s '%s' res=%d", success ? "COMMIT":"ROLLBACK", *newToken, res); return res; } /* ----------------------------------- */ extern "C" TSyError SyncEvolution_DeleteContext( CContext aContext ) { /**** CAN BE ADAPTED BY USER ****/ SyncSource *source = DBC( aContext ); if (!source) { return LOCERR_WRONGUSAGE; } SE_LOG_DEBUG(source->getDisplayName(), "DeleteContext"); source->popSynthesisAPI(); return LOCERR_OK; } SE_END_CXX syncevolution-1.5/src/syncevo/SuspendFlags.cpp0000644000373300001540000002555612415726307023121 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include #include #include #include SE_BEGIN_CXX static RecMutex suspendRecMutex; SuspendFlags::SuspendFlags() : m_level(Logger::INFO), m_state(NORMAL), m_receivedSignals(0), m_lastSuspend(0), m_senderFD(-1), m_receiverFD(-1), m_activeSignals(0) { } SuspendFlags::~SuspendFlags() { deactivate(); } SuspendFlags &SuspendFlags::getSuspendFlags() { // never free the instance, other singletons might depend on it RecMutex::Guard guard = suspendRecMutex.lock(); static SuspendFlags *flags; if (!flags) { flags = new SuspendFlags; } return *flags; } static gboolean SignalChannelReadyCB(GIOChannel *source, GIOCondition condition, gpointer data) throw() { try { RecMutex::Guard guard = suspendRecMutex.lock(); SuspendFlags &me = SuspendFlags::getSuspendFlags(); me.printSignals(); } catch (...) { Exception::handle(); } return TRUE; } /** * Own glib IO watch for file descriptor * which calls printSignals() */ class GLibGuard : public SuspendFlags::Guard { GIOChannel *m_channel; guint m_channelReady; public: GLibGuard(int fd) { // glib watch which calls printSignals() m_channel = g_io_channel_unix_new(fd); m_channelReady = g_io_add_watch(m_channel, G_IO_IN, SignalChannelReadyCB, NULL); } ~GLibGuard() { if (m_channelReady) { g_source_remove(m_channelReady); m_channelReady = 0; } if (m_channel) { g_io_channel_unref(m_channel); m_channel = NULL; } } }; SuspendFlags::State SuspendFlags::getState() const { RecMutex::Guard guard = suspendRecMutex.lock(); if (m_abortBlocker.lock()) { // active abort blocker return ABORT; } else if (m_suspendBlocker.lock()) { // active suspend blocker return SUSPEND; } else { return m_state; } } uint32_t SuspendFlags::getReceivedSignals() const { RecMutex::Guard guard = suspendRecMutex.lock(); return m_receivedSignals; } Logger::Level SuspendFlags::getLevel() const { RecMutex::Guard guard = suspendRecMutex.lock(); return m_level; } void SuspendFlags::setLevel(Logger::Level level) { RecMutex::Guard guard = suspendRecMutex.lock(); m_level = level; } bool SuspendFlags::isAborted() { RecMutex::Guard guard = suspendRecMutex.lock(); printSignals(); return getState() == ABORT; } bool SuspendFlags::isSuspended() { RecMutex::Guard guard = suspendRecMutex.lock(); printSignals(); return getState() == SUSPEND; } bool SuspendFlags::isNormal() { RecMutex::Guard guard = suspendRecMutex.lock(); printSignals(); return getState() == NORMAL; } void SuspendFlags::checkForNormal() { RecMutex::Guard guard = suspendRecMutex.lock(); printSignals(); if (getState() != NORMAL) { SE_THROW_EXCEPTION_STATUS(StatusException, "aborting as requested by user", (SyncMLStatus)sysync::LOCERR_USERABORT); } } boost::shared_ptr SuspendFlags::suspend() { return block(m_suspendBlocker); } boost::shared_ptr SuspendFlags::abort() { return block(m_abortBlocker); } boost::shared_ptr SuspendFlags::block(boost::weak_ptr &blocker) { RecMutex::Guard guard = suspendRecMutex.lock(); State oldState = getState(); boost::shared_ptr res = blocker.lock(); if (!res) { res.reset(new StateBlocker); blocker = res; } State newState = getState(); // only alert receiving side if going from normal -> suspend // or suspend -> abort if (newState > oldState && m_senderFD >= 0) { unsigned char msg = newState; // Retry on some errors, ignore others. while (write(m_senderFD, &msg, 1) != 1 && (errno == EAGAIN || errno==EINTR)) {} } // don't depend on pipes or detecting that change, alert // listeners directly if (newState != oldState) { m_stateChanged(*this); } return res; } boost::shared_ptr SuspendFlags::activate(uint32_t sigmask) { SE_LOG_DEBUG(NULL, "SuspendFlags: (re)activating, currently %s", m_senderFD > 0 ? "active" : "inactive"); if (m_senderFD > 0) { return m_guard.lock(); } int fds[2]; if (pipe(fds)) { SE_THROW(StringPrintf("allocating pipe for signals failed: %s", strerror(errno))); } // nonblocking, to avoid deadlocks when the pipe's buffer overflows fcntl(fds[0], F_SETFL, fcntl(fds[0], F_GETFL) | O_NONBLOCK); fcntl(fds[1], F_SETFL, fcntl(fds[1], F_GETFL) | O_NONBLOCK); m_senderFD = fds[1]; m_receiverFD = fds[0]; SE_LOG_DEBUG(NULL, "SuspendFlags: activating signal handler(s) with fds %d->%d", m_senderFD, m_receiverFD); for (int sig = 0; sig < 32; sig++) { if (sigmask & (1< guard(new GLibGuard(m_receiverFD)); m_guard = guard; return guard; } void SuspendFlags::deactivate() { SE_LOG_DEBUG(NULL, "SuspendFlags: deactivating fds %d->%d", m_senderFD, m_receiverFD); if (m_receiverFD >= 0) { for (int sig = 0; sig < 32; sig++) { if (m_activeSignals & (1<= 0) { msg[0] = (unsigned char)(ABORT_MAX + sig); size_t left = msg[1] == ABORT_MAX ? 1 : 2; while (left) { ssize_t written = write(me.m_senderFD, msg, left); if (written > 0) { left -= written; } else { if (errno != EAGAIN && errno != EINTR) { break; } } } } } void SuspendFlags::printSignals() { RecMutex::Guard guard = suspendRecMutex.lock(); if (m_receiverFD >= 0) { unsigned char msg; while (read(m_receiverFD, &msg, 1) == 1) { SE_LOG_DEBUG(NULL, "SuspendFlags: read %d from fd %d", msg, m_receiverFD); const char *str = NULL; switch (msg) { case SUSPEND: str = "Asking to suspend...\nPress CTRL-C again quickly (within 2s) to stop immediately (can cause problems in the future!)"; break; case SUSPEND_AGAIN: str = "Suspend in progress...\nPress CTRL-C again quickly (within 2s) to stop immediately (can cause problems in the future!)"; break; case ABORT: str = "Aborting immediately ..."; break; case ABORT_AGAIN: str = "Already aborting as requested earlier ..."; break; default: { int sig = msg - ABORT_MAX; SE_LOG_DEBUG(NULL, "reveived signal %d", sig); m_receivedSignals |= 1< * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _GNU_SOURCE # define _GNU_SOURCE 1 #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef USE_DLT # include #endif #include "test.h" #include SE_BEGIN_CXX SyncContext *SyncContext::m_activeContext; static const char *LogfileBasename = "syncevolution-log"; static std::string RealPath(const std::string &path) { std::string buffer; char *newPath = realpath(path.c_str(), NULL); if (newPath) { buffer = newPath; free(newPath); return buffer; } else { return path; } } SyncContext::SyncContext() { init(); } SyncContext::SyncContext(const string &server, bool doLogging) : SyncConfig(server), m_server(server) { init(); m_doLogging = doLogging; } SyncContext::SyncContext(const string &client, const string &server, const string &rootPath, const boost::shared_ptr &agent, bool doLogging) : SyncConfig(client, boost::shared_ptr(), rootPath), m_server(client), m_localClientRootPath(rootPath), m_agent(agent) { init(); initLocalSync(server); m_doLogging = doLogging; } void SyncContext::initLocalSync(const string &config) { m_localSync = true; string tmp; splitConfigString(config, tmp, m_localPeerContext); m_localPeerContext.insert(0, "@"); } void SyncContext::init() { m_doLogging = false; m_quiet = false; m_dryrun = false; m_localSync = false; m_serverMode = false; m_serverAlerted = false; m_configNeeded = true; m_firstSourceAccess = true; m_quitSync = false; m_remoteInitiated = false; m_sourceListPtr = NULL; m_syncFreeze = SYNC_FREEZE_NONE; } SyncContext::~SyncContext() { } /** * Utility code for parsing and comparing * log dir names. Also a binary predicate for * sorting them. */ class LogDirNames { public: // internal prefix for backup directory name: "SyncEvolution-" static const char* const DIR_PREFIX; /** * Compare two directory by its creation time encoded * in the directory name sort them in ascending order */ bool operator() (const string &str1, const string &str2) { string iDirPath1, iStr1; string iDirPath2, iStr2; parseLogDir(str1, iDirPath1, iStr1); parseLogDir(str2, iDirPath2, iStr2); string dirPrefix1, peerName1, dateTime1; parseDirName(iStr1, dirPrefix1, peerName1, dateTime1); string dirPrefix2, peerName2, dateTime2; parseDirName(iStr2, dirPrefix2, peerName2, dateTime2); return dateTime1 < dateTime2; } /** * extract backup directory name from a full backup path * for example, a full path "/home/xxx/.cache/syncevolution/default/funambol-2009-12-08-14-05" * is parsed as "/home/xxx/.cache/syncevolution/default" and "funambol-2009-12-08-14-05" */ static void parseLogDir(const string &fullpath, string &dirPath, string &dirName) { string iFullpath = boost::trim_right_copy_if(fullpath, boost::is_any_of("/")); size_t off = iFullpath.find_last_of('/'); if(off != iFullpath.npos) { dirPath = iFullpath.substr(0, off); dirName = iFullpath.substr(off+1); } else { dirPath = ""; dirName = iFullpath; } } // escape '-' and '_' for peer name static string escapePeer(const string &prefix) { string escaped = prefix; boost::replace_all(escaped, "_", "__"); boost::replace_all(escaped, "-", "_+"); return escaped; } // un-escape '_+' and '__' for peer name static string unescapePeer(const string &escaped) { string prefix = escaped; boost::replace_all(prefix, "_+", "-"); boost::replace_all(prefix, "__", "_"); return prefix; } /** * parse a directory name into dirPrefix(empty or DIR_PREFIX), peerName, dateTime. * peerName must be unescaped by the caller to get the real string. * If directory name is in the format of '[DIR_PREFIX]-peer[@context]-year-month-day-hour-min' * then parsing is sucessful and these 3 strings are correctly set and true is returned. * Otherwise, false is returned. * Here we don't check whether the dir name is matching peer name */ static bool parseDirName(const string &dir, string &dirPrefix, string &config, string &dateTime) { string iDir = dir; if (!boost::starts_with(iDir, DIR_PREFIX)) { dirPrefix = ""; } else { dirPrefix = DIR_PREFIX; boost::erase_first(iDir, DIR_PREFIX); } size_t off = iDir.find('-'); if (off != iDir.npos) { config = iDir.substr(0, off); dateTime = iDir.substr(off); // m_prefix doesn't contain peer name or it equals with dirPrefix plus peerName return checkDirName(dateTime); } return false; } // check the dir name is conforming to what format we write static bool checkDirName(const string& value) { const char* str = value.c_str(); /** need check whether string after prefix is a valid date-time we wrote, format * should be -YYYY-MM-DD-HH-MM and optional sequence number */ static char table[] = {'-','9','9','9','9', //year '-','1','9', //month '-','3','9', //date '-','2','9', //hour '-','5','9' //minute }; for(size_t i = 0; i < sizeof(table)/sizeof(table[0]) && *str; i++,str++) { switch(table[i]) { case '-': if(*str != '-') return false; break; case '1': if(*str < '0' || *str > '1') return false; break; case '2': if(*str < '0' || *str > '2') return false; break; case '3': if(*str < '0' || *str > '3') return false; break; case '5': if(*str < '0' || *str > '5') return false; break; case '9': if(*str < '0' || *str > '9') return false; break; default: return false; }; } return true; } }; class LogDir; /** * Helper class for LogDir: acts as proxy for logging into * the LogDir's reports and log file. */ class LogDirLogger : public Logger { Logger::Handle m_parentLogger; /**< the logger which was active before we started to intercept messages */ boost::weak_ptr m_logdir; /**< grants access to report and Synthesis engine */ #ifdef USE_DLT bool m_useDLT; /**< SyncEvolution and libsynthesis are logging to DLT */ #endif public: LogDirLogger(const boost::weak_ptr &logdir); virtual void remove() throw (); virtual void messagev(const MessageOptions &options, const char *format, va_list args); }; // This class owns the logging directory. It is responsible // for redirecting output at the start and end of sync (even // in case of exceptions thrown!). class LogDir : private boost::noncopyable, private LogDirNames { SyncContext &m_client; string m_logdir; /**< configured backup root dir */ int m_maxlogdirs; /**< number of backup dirs to preserve, 0 if unlimited */ string m_prefix; /**< common prefix of backup dirs */ string m_path; /**< path to current logging and backup dir */ string m_logfile; /**< Path to log file there, empty if not writing one. The file is no longer written by this class, nor does it control the basename of it. Writing the log file is enabled by the XML configuration that we prepare for the Synthesis engine; the base name of the file is hard-coded in the engine. Despite that this class still is the central point to ask for the name of the log file. */ boost::scoped_ptr m_info; /**< key/value representation of sync information */ // Access to m_report and m_client must be thread-safe as soon as // LogDirLogger is active, because they are shared between main // thread and any thread which might log errors. friend class LogDirLogger; bool m_readonly; /**< m_info is not to be written to */ SyncReport *m_report; /**< record start/end times here */ boost::weak_ptr m_self; PushLogger m_logger; /**< active logger */ LogDir(SyncContext &client) : m_client(client), m_info(NULL), m_readonly(false), m_report(NULL) { // Set default log directory. This will be overwritten with a user-specified // location later on, if one was selected by the user. SyncEvolution >= 0.9 alpha // and < 0.9 beta 2 used XDG_DATA_HOME because the logs and data base dumps // were not considered "non-essential data files". Because XDG_DATA_HOME is // searched for .desktop files and creating large amounts of other files there // slows down that search, the default was changed to XDG_CACHE_DIR. // // To migrate old installations seamlessly, this code here renames the old // default directory to the new one. Errors (like not found) are silently ignored. mkdir_p(SubstEnvironment("${XDG_CACHE_HOME}").c_str()); rename(SubstEnvironment("${XDG_DATA_HOME}/applications/syncevolution").c_str(), SubstEnvironment("${XDG_CACHE_HOME}/syncevolution").c_str()); string path = m_client.getLogDir(); if (path.empty()) { path = "${XDG_CACHE_HOME}/syncevolution"; } setLogdir(path); } public: static boost::shared_ptr create(SyncContext &client) { boost::shared_ptr logdir(new LogDir(client)); logdir->m_self = logdir; return logdir; } /** * Finds previous log directories for context. Reports errors via exceptions. * * @retval dirs vector of full path names, oldest first */ void previousLogdirs(vector &dirs) { dirs.clear(); getLogdirs(dirs); } /** * Finds previous log directory. Returns empty string if anything went wrong. * * @param path path to configured backup directy, NULL if defaulting to /tmp, "none" if not creating log file * @return full path of previous log directory, empty string if not found */ string previousLogdir() throw() { try { vector dirs; previousLogdirs(dirs); return dirs.empty() ? "" : dirs.back(); } catch (...) { Exception::handle(); return ""; } } /** * Set log dir and base name used for searching and creating sessions. * Default if not called is the getLogDir() value of the context. * * @param logdir "none" to disable sessions, "" for default, may contain ${} * for environment variables */ void setLogdir(const string &logdir) { if (logdir.empty()) { return; } m_logdir = SubstEnvironment(logdir); m_logdir = boost::trim_right_copy_if(m_logdir, boost::is_any_of("/")); if (m_logdir == "none") { return; } // Resolve symbolic links in path now, in case that they change later // while the session runs. Relies on being allowed to pass NULL. If that's // not allowed, we ignore the error and continue to use the known path. errno = 0; m_logdir = RealPath(m_logdir); SE_LOG_DEBUG(NULL, "log path -> %s, %s", m_logdir.c_str(), errno ? strerror(errno) : ""); // the config name has been normalized string peer = m_client.getConfigName(); // escape "_" and "-" the peer name peer = escapePeer(peer); if (boost::iends_with(m_logdir, "syncevolution")) { // use just the server name as prefix m_prefix = peer; } else { // SyncEvolution----

-- m_prefix = DIR_PREFIX; m_prefix += peer; } } /** * access existing log directory to extract status information */ void openLogdir(const string &dir) { boost::shared_ptr filenode(new IniFileConfigNode(dir, "status.ini", true)); m_info.reset(new SafeConfigNode(filenode)); m_info->setMode(false); m_readonly = true; } /* * get the corresponding peer name encoded in the logging dir name. * The dir name must match the format(see startSession). Otherwise, * empty string is returned. */ string getPeerNameFromLogdir(const string &dir) { // extract the dir name from the fullpath string iDirPath, iDirName; parseLogDir(dir, iDirPath, iDirName); // extract the peer name from the dir name string dirPrefix, peerName, dateTime; if(parseDirName(iDirName, dirPrefix, peerName, dateTime)) { return unescapePeer(peerName); } return ""; } /** * read sync report for session selected with openLogdir() */ void readReport(SyncReport &report) { report.clear(); if (!m_info) { return; } *m_info >> report; } /** * write sync report for current session */ void writeReport(SyncReport &report) { if (m_info) { *m_info << report; /* write in slightly different format and flush at the end */ writeTimestamp("start", report.getStart(), false); writeTimestamp("end", report.getEnd(), true); } } enum SessionMode { SESSION_USE_PATH, /**< write directly into path, don't create and manage subdirectories */ SESSION_READ_ONLY, /**< access an existing session directory identified with path */ SESSION_CREATE /**< create a new session directory inside the given path */ }; // setup log directory and redirect logging into it // @param path path to configured backup directy, empty for using default, "none" if not creating log file // @param mode determines how path is interpreted and which session is accessed // @param maxlogdirs number of backup dirs to preserve in path, 0 if unlimited // @param logLevel 0 = default, 1 = ERROR, 2 = INFO, 3 = DEBUG // @param report record information about session here (may be NULL) void startSession(const string &path, SessionMode mode, int maxlogdirs, int logLevel, SyncReport *report) { m_maxlogdirs = maxlogdirs; m_report = report; m_logfile = ""; if (boost::iequals(path, "none")) { m_path = ""; } else { setLogdir(path); SE_LOG_DEBUG(NULL, "checking log dir %s", m_logdir.c_str()); if (mode == SESSION_CREATE) { // create unique directory name in the given directory time_t ts = time(NULL); struct tm tmbuffer; struct tm *tm = localtime_r(&ts, &tmbuffer); if (!tm) { SE_THROW("localtime_r() failed"); } stringstream base; base << "-" << setfill('0') << setw(4) << tm->tm_year + 1900 << "-" << setw(2) << tm->tm_mon + 1 << "-" << setw(2) << tm->tm_mday << "-" << setw(2) << tm->tm_hour << "-" << setw(2) << tm->tm_min; // If other sessions, regardless of which peer, have // the same date and time, then append a sequence // number to ensure correct sorting. Solve this by // finding the maximum sequence number for any kind of // date time. Backwards running clocks or changing the // local time will still screw our ordering, though. typedef std::map SeqMap_t; SeqMap_t dateTimes2Seq; if (isDir(m_logdir)) { ReadDir dir(m_logdir); BOOST_FOREACH(const string &entry, dir) { string dirPrefix, peerName, dateTime; if (parseDirName(entry, dirPrefix, peerName, dateTime)) { // dateTime = -2010-01-31-12-00[-rev] size_t off = 0; for (int i = 0; off != dateTime.npos && i < 5; i++) { off = dateTime.find('-', off + 1); } int sequence; if (off != dateTime.npos) { sequence = dateTime[off + 1] - 'a'; dateTime.resize(off); } else { sequence = -1; } pair entry = dateTimes2Seq.insert(make_pair(dateTime, sequence)); if (sequence > entry.first->second) { entry.first->second = sequence; } } } } stringstream path; path << base.str(); SeqMap_t::iterator it = dateTimes2Seq.find(path.str()); if (it != dateTimes2Seq.end()) { path << "-" << (char)('a' + it->second + 1); } m_path = m_logdir + "/"; m_path += m_prefix; m_path += path.str(); mkdir_p(m_path); } else { m_path = m_logdir; if (mkdir(m_path.c_str(), S_IRWXU) && errno != EEXIST) { SE_LOG_DEBUG(NULL, "%s: %s", m_path.c_str(), strerror(errno)); Exception::throwError(SE_HERE, m_path, errno); } } m_logfile = m_path + "/" + LogfileBasename + ".html"; SE_LOG_DEBUG(NULL, "logfile: %s", m_logfile.c_str()); } // update log level of default logger and our own replacement Logger::Level level; switch (logLevel) { case 0: // default for console output level = Logger::INFO; break; case 1: level = Logger::ERROR; break; case 2: level = Logger::INFO; break; default: if (m_logfile.empty() || getenv("SYNCEVOLUTION_DEBUG")) { // no log file or user wants to see everything: // print all information to the console level = Logger::DEBUG; } else { // have log file: avoid excessive output to the console, // full information is in the log file level = Logger::INFO; } break; } if (mode != SESSION_USE_PATH) { Logger::instance().setLevel(level); } boost::shared_ptr logger(new LogDirLogger(m_self)); logger->setLevel(level); m_logger.reset(logger); time_t start = time(NULL); if (m_report) { m_report->setStart(start); } m_readonly = mode == SESSION_READ_ONLY; if (!m_path.empty()) { boost::shared_ptr filenode(new IniFileConfigNode(m_path, "status.ini", m_readonly)); m_info.reset(new SafeConfigNode(filenode)); m_info->setMode(false); if (mode != SESSION_READ_ONLY) { // Create a status.ini which contains an error. // Will be overwritten later on, unless we crash. m_info->setProperty("status", STATUS_DIED_PREMATURELY); m_info->setProperty("error", InitStateString("synchronization process died prematurely", true)); writeTimestamp("start", start); } } } /** sets a fixed directory for database files without redirecting logging */ void setPath(const string &path) { m_path = RealPath(path); SE_LOG_DEBUG(NULL, "setPath(%s) -> %s", path.c_str(), m_path.c_str()); } // return log directory, empty if not enabled const string &getLogdir() { return m_path; } // return log file, empty if not enabled const string &getLogfile() { return m_logfile; } /** * remove backup dir(s) if exceeding limit * * Assign a priority to each session dir, with lower * meaning "less important". Then sort by priority and (if * equal) creation time (aka index) in ascending * order. The sessions at the beginning of the sorted * vector are then removed first. * * DUMPS = any kind of database dump was made * ERROR = session failed * CHANGES = local data modified since previous dump (based on dumps * of the current peer, for simplicity reasons), * dump created for the first time, * changes made during sync (detected with dumps and statistics) * * The goal is to preserve as many database dumps as possible * and ideally those where something happened. * * Some criteria veto the removal of a session: * - it is the only one holding a dump of a specific source * - it is the last session */ void expire() { if (m_logdir.size() && m_maxlogdirs > 0 ) { vector dirs; getLogdirs(dirs); /** stores priority and index in "dirs"; after sorting, delete from the start */ vector< pair > victims; /** maps from source name to list of information about dump, oldest first */ typedef map< string, list > Dumps_t; Dumps_t dumps; for (size_t i = 0; i < dirs.size(); i++) { bool changes = false; bool havedumps = false; bool errors = false; LogDir logdir(m_client); logdir.openLogdir(dirs[i]); SyncReport report; logdir.readReport(report); SyncMLStatus status = report.getStatus(); if (status != STATUS_OK && status != STATUS_HTTP_OK) { errors = true; } BOOST_FOREACH(SyncReport::SourceReport_t source, report) { string &sourcename = source.first; SyncSourceReport &sourcereport = source.second; list &dumplist = dumps[sourcename]; if (sourcereport.m_backupBefore.isAvailable() || sourcereport.m_backupAfter.isAvailable()) { // yes, we have backup dumps havedumps = true; DumpInfo info(i, sourcereport.m_backupBefore.getNumItems(), sourcereport.m_backupAfter.getNumItems()); // now check for changes, if none found yet if (!changes) { if (dumplist.empty()) { // new backup dump changes = true; } else { DumpInfo &previous = dumplist.back(); changes = // item count changed -> items changed previous.m_itemsDumpedAfter != info.m_itemsDumpedBefore || sourcereport.wasChanged(SyncSourceReport::ITEM_LOCAL) || sourcereport.wasChanged(SyncSourceReport::ITEM_REMOTE) || haveDifferentContent(sourcename, dirs[previous.m_dirIndex], "after", dirs[i], "before"); } } dumplist.push_back(info); } } Priority pri = havedumps ? (changes ? HAS_DUMPS_WITH_CHANGES : errors ? HAS_DUMPS_NO_CHANGES_WITH_ERRORS : HAS_DUMPS_NO_CHANGES) : (changes ? NO_DUMPS_WITH_CHANGES : errors ? NO_DUMPS_WITH_ERRORS : NO_DUMPS_NO_ERRORS); victims.push_back(make_pair(pri, i)); } sort(victims.begin(), victims.end()); int deleted = 0; for (size_t e = 0; e < victims.size() && (int)dirs.size() - deleted > m_maxlogdirs; ++e) { size_t index = victims[e].second; string &path = dirs[index]; // preserve latest session if (index != dirs.size() - 1) { bool mustkeep = false; // also check whether it holds the only backup of a source BOOST_FOREACH(Dumps_t::value_type dump, dumps) { if (dump.second.size() == 1 && dump.second.front().m_dirIndex == index) { mustkeep = true; break; } } if (!mustkeep) { SE_LOG_DEBUG(NULL, "removing %s", path.c_str()); rm_r(path); ++deleted; } } } } } // finalize session void endSession() { time_t end = time(NULL); if (m_report) { m_report->setEnd(end); } if (m_info) { if (!m_readonly) { writeTimestamp("end", end); if (m_report) { RecMutex::Guard guard = Logger::lock(); writeReport(*m_report); } m_info->flush(); } m_info.reset(); } } // Remove redirection of logging. void restore() { m_logger.reset(); } ~LogDir() { restore(); } #if 0 /** * A quick check for level = SHOW text dumps whether the text dump * starts with the [ERROR] prefix; used to detect error messages * from forked process which go through this instance but are not * already tagged as error messages and thus would not show up as * "first error" in sync reports. * * Example for the problem: * [ERROR] onConnect not implemented [from child process] * [ERROR] child process quit with return code 1 [from parent] * ... * Changes applied during synchronization: * ... * First ERROR encountered: child process quit with return code 1 */ static bool isErrorString(const char *format, va_list args) { const char *text; if (!strcmp(format, "%s")) { va_list argscopy; va_copy(argscopy, args); text = va_arg(argscopy, const char *); va_end(argscopy); } else { text = format; } return boost::starts_with(text, "[ERROR"); } #endif /** * Compare two database dumps just based on their inodes. * @return true if inodes differ */ static bool haveDifferentContent(const string &sourceName, const string &firstDir, const string &firstSuffix, const string &secondDir, const string &secondSuffix) { string first = firstDir + "/" + sourceName + "." + firstSuffix; string second = secondDir + "/" + sourceName + "." + secondSuffix; ReadDir firstContent(first); ReadDir secondContent(second); set firstInodes; BOOST_FOREACH(const string &name, firstContent) { struct stat buf; string fullpath = first + "/" + name; if (stat(fullpath.c_str(), &buf)) { Exception::throwError(SE_HERE, fullpath, errno); } firstInodes.insert(buf.st_ino); } BOOST_FOREACH(const string &name, secondContent) { struct stat buf; string fullpath = second + "/" + name; if (stat(fullpath.c_str(), &buf)) { Exception::throwError(SE_HERE, fullpath, errno); } set::iterator it = firstInodes.find(buf.st_ino); if (it == firstInodes.end()) { // second dir has different file return true; } else { firstInodes.erase(it); } } if (!firstInodes.empty()) { // first dir has different file return true; } // exact match of inodes return false; } private: enum Priority { NO_DUMPS_NO_ERRORS, NO_DUMPS_WITH_ERRORS, NO_DUMPS_WITH_CHANGES, HAS_DUMPS_NO_CHANGES, HAS_DUMPS_NO_CHANGES_WITH_ERRORS, HAS_DUMPS_WITH_CHANGES }; struct DumpInfo { size_t m_dirIndex; int m_itemsDumpedBefore; int m_itemsDumpedAfter; DumpInfo(size_t dirIndex, int itemsDumpedBefore, int itemsDumpedAfter) : m_dirIndex(dirIndex), m_itemsDumpedBefore(itemsDumpedBefore), m_itemsDumpedAfter(itemsDumpedAfter) {} }; /** * Find all entries in a given directory, return as sorted array of full paths in ascending order. * If m_prefix doesn't contain peer name information, then all log dirs for different peers in the * logdir are returned. */ void getLogdirs(vector &dirs) { if (m_logdir != "none" && !isDir(m_logdir)) { return; } string peer = m_client.getConfigName(); string peerName, context; SyncConfig::splitConfigString(peer, peerName, context); ReadDir dir(m_logdir); BOOST_FOREACH(const string &entry, dir) { string tmpDirPrefix, tmpPeer, tmpDateTime; // if directory name could not be parsed, ignore it if(parseDirName(entry, tmpDirPrefix, tmpPeer, tmpDateTime)) { if(!peerName.empty() && (m_prefix == (tmpDirPrefix + tmpPeer))) { // if peer name exists, match the logs for the given peer dirs.push_back(m_logdir + "/" + entry); } else if(peerName.empty()) { // if no peer name and only context, match for all logs under the given context string tmpName, tmpContext; SyncConfig::splitConfigString(unescapePeer(tmpPeer), tmpName, tmpContext); if( context == tmpContext && boost::starts_with(m_prefix, tmpDirPrefix)) { dirs.push_back(m_logdir + "/" + entry); } } } } // sort vector in ascending order // if no peer name if(peerName.empty()){ sort(dirs.begin(), dirs.end(), LogDirNames()); } else { sort(dirs.begin(), dirs.end()); } } // store time stamp in session info void writeTimestamp(const string &key, time_t val, bool flush = true) { if (m_info) { char buffer[160]; struct tm tmbuffer, *tm; // be nice and store a human-readable date in addition the seconds since the epoch tm = localtime_r(&val, &tmbuffer); if (tm) { strftime(buffer, sizeof(buffer), "%s, %Y-%m-%d %H:%M:%S %z", tm); } else { // Less suitable fallback. Won't work correctly for 32 // bit long beyond 2038. sprintf(buffer, "%lu", (long unsigned)val); } m_info->setProperty(key, buffer); if (flush) { m_info->flush(); } } } }; LogDirLogger::LogDirLogger(const boost::weak_ptr &logdir) : m_parentLogger(Logger::instance()), m_logdir(logdir) #ifdef USE_DLT , m_useDLT(getenv("SYNCEVOLUTION_USE_DLT") != NULL) #endif { } void LogDirLogger::remove() throw () { // Forget reference to LogDir. This prevents accessing it in // future messagev() calls. RecMutex::Guard guard = Logger::lock(); m_logdir.reset(); } void LogDirLogger::messagev(const MessageOptions &options, const char *format, va_list args) { // Protects ordering of log messages and access to shared // variables like m_report and m_engine. RecMutex::Guard guard = Logger::lock(); // always to parent first (usually stdout): // if the parent is a LogRedirect instance, then // it'll flush its own output first, which ensures // that the new output comes later (as desired) va_list argscopy; va_copy(argscopy, args); m_parentLogger.messagev(options, format, argscopy); va_end(argscopy); // Special handling of our own messages: include in sync report // (always, because that is how we did it traditionally) and write // to our own syncevolution-log.html (if not already logged). // // The TestLocalSync.testServerFailure and some others check that // we record the child's error message in our sync report. If we // don't then it shows up later marked as an "error on the target // side", which is probably not what we want. boost::shared_ptr logdir; if ((bool)(logdir = m_logdir.lock())) { if (logdir->m_report && options.m_level <= ERROR && logdir->m_report->getError().empty()) { va_list argscopy; va_copy(argscopy, args); string error = StringPrintfV(format, argscopy); va_end(argscopy); logdir->m_report->setError(error); } if (!(options.m_flags & MessageOptions::ALREADY_LOGGED) && #ifdef USE_DLT // Don't send to libsynthesis if using DLT, // because then it would end up getting logged // in DLT twice. !m_useDLT && #endif logdir->m_client.getEngine().get()) { va_list argscopy; va_copy(argscopy, args); // Once to Synthesis log, with full debugging. // The API does not support a process name, so // put it into the prefix as " ". std::string prefix; if (options.m_processName) { prefix += *options.m_processName; } if (options.m_prefix) { if (!prefix.empty()) { prefix += " "; } prefix += *options.m_prefix; } logdir->m_client.getEngine().doDebug(options.m_level, prefix.empty() ? NULL : prefix.c_str(), options.m_file, options.m_line, options.m_function, format, argscopy); va_end(argscopy); } } } const char* const LogDirNames::DIR_PREFIX = "SyncEvolution-"; /** * This class owns the sync sources. For historic reasons (required * by Funambol) SyncSource instances are stored as plain pointers * deleted by this class. Virtual sync sources were added later * and are stored as shared pointers which are freed automatically. * It is possible to iterate over the two classes of sources * separately. * * The SourceList ensures that all sources (normal and virtual) have * a valid and unique integer ID as needed for Synthesis. Traditionally * this used to be a simple hash of the source name (which is unique * by design), without checking for hash collisions. Now the ID is assigned * the first time a source is added here and doesn't have one yet. * For backward compatibility (the ID is stored in the .synthesis dir), * the same Hash() value is tested first. Assuming that there were no * hash conflicts, the same IDs will be generated as before. * * Together with a logdir, the SourceList * handles writing of per-sync files as well as the final report. * It is not stateless. The expectation is that it is instantiated * together with a SyncContext for one particular operation (sync * session, status check, restore). In contrast to a SyncContext, * this class has to be recreated for another operation. * * When running as client, only the active sources get added. They can * be dumped one after the other before running a sync. * * As a server, all sources get added, regardless whether they are * active. This implies that at least their "type" must be valid. Then * later when a client really starts using them, they are opened() and * database dumps are made. * * Virtual datastores are stored here when they get initialized * together with the normal sources by the user of SourceList. * * */ class SourceList : private vector { typedef vector inherited; public: enum LogLevel { LOGGING_QUIET, /**< avoid all extra output */ LOGGING_SUMMARY, /**< sync report, but no database comparison */ LOGGING_FULL /**< everything */ }; typedef std::vector< boost::shared_ptr > VirtualSyncSources_t; /** reading our set of virtual sources is okay, modifying it is not */ const VirtualSyncSources_t &getVirtualSources() { return m_virtualSources; } void addSource(const boost::shared_ptr &source) { checkSource(source.get()); m_virtualSources.push_back(source); } using inherited::iterator; using inherited::const_iterator; using inherited::empty; using inherited::begin; using inherited::end; using inherited::rbegin; using inherited::rend; using inherited::size; /** transfers ownership (historic reasons for storing plain pointer...) */ void addSource(cxxptr &source) { checkSource(source); push_back(source.release()); } private: VirtualSyncSources_t m_virtualSources; /**< all configured virtual data sources (aka Synthesis ) */ boost::shared_ptr m_logdir; /**< our logging directory */ SyncContext &m_client; /**< the context in which we were instantiated */ set m_prepared; /**< remember for which source we dumped databases successfully */ string m_intro; /**< remembers the dumpLocalChanges() intro and only prints it again when different from last dumpLocalChanges() call */ bool m_doLogging; /**< true iff the normal logdir handling is enabled (creating and expiring directoties, before/after comparison) */ bool m_reportTodo; /**< true if syncDone() shall print a final report */ LogLevel m_logLevel; /**< chooses how much information is printed */ string m_previousLogdir; /**< remember previous log dir before creating the new one */ /** create name in current (if set) or previous logdir */ string databaseName(SyncSource &source, const string &suffix, string logdir = "") { if (!logdir.size()) { logdir = m_logdir->getLogdir(); } return logdir + "/" + source.getName() + "." + suffix; } /** ensure that Synthesis ID is set and unique */ void checkSource(SyncSource *source) { if (source->getSynthesisID()) { return; } int id = Hash(source->getName()) % INT_MAX; while (true) { // avoid negative values if (id < 0) { id = -id; } // avoid zero, it means unset if (!id) { id = 1; } // check for collisions bool collision = false; BOOST_FOREACH(const string &other, m_client.getSyncSources()) { boost::shared_ptr sc(m_client.getSyncSourceConfig(other)); int other_id = sc->getSynthesisID(); if (other_id == id) { ++id; collision = true; break; } } if (!collision) { source->setSynthesisID(id); return; } } } public: /** allow iterating over sources */ const inherited *getSourceSet() const { return this; } LogLevel getLogLevel() const { return m_logLevel; } void setLogLevel(LogLevel logLevel) { m_logLevel = logLevel; } /** * Dump into files with a certain suffix, optionally store report * in member of SyncSourceReport. Remembers which sources were * dumped before a sync and only dumps those again afterward. * * @param suffix "before/after/current" - before sync, after sync, during status check * @param excludeSource when not empty, only dump that source */ void dumpDatabases(const string &suffix, BackupReport SyncSourceReport::*report, const string &excludeSource = "") { // Identify all logdirs of current context, of any peer. Used // to search for previous backups of each source, if // necessary. SyncContext context(m_client.getContextName()); boost::shared_ptr logdir(LogDir::create(context)); vector dirs; logdir->previousLogdirs(dirs); BOOST_FOREACH(SyncSource *source, *this) { if ((!excludeSource.empty() && excludeSource != source->getName()) || (suffix == "after" && m_prepared.find(source->getName()) == m_prepared.end())) { continue; } string dir = databaseName(*source, suffix); boost::shared_ptr node = ConfigNode::createFileNode(dir + ".ini"); SE_LOG_DEBUG(NULL, "creating %s", dir.c_str()); rm_r(dir); BackupReport dummy; if (source->getOperations().m_backupData) { SyncSource::Operations::ConstBackupInfo oldBackup; // Now look for a backup of the current source, // starting with the most recent one. for (vector::const_reverse_iterator it = dirs.rbegin(); it != dirs.rend(); ++it) { const string &sessiondir = *it; string oldBackupDir; SyncSource::Operations::BackupInfo::Mode mode = SyncSource::Operations::BackupInfo::BACKUP_AFTER; oldBackupDir = databaseName(*source, "after", sessiondir); if (!isDir(oldBackupDir)) { mode = SyncSource::Operations::BackupInfo::BACKUP_BEFORE; oldBackupDir = databaseName(*source, "before", sessiondir); if (!isDir(oldBackupDir)) { // try next session continue; } } oldBackup.m_mode = mode; oldBackup.m_dirname = oldBackupDir; oldBackup.m_node = ConfigNode::createFileNode(oldBackupDir + ".ini"); break; } mkdir_p(dir); SyncSource::Operations::BackupInfo newBackup(suffix == "before" ? SyncSource::Operations::BackupInfo::BACKUP_BEFORE : suffix == "after" ? SyncSource::Operations::BackupInfo::BACKUP_AFTER : SyncSource::Operations::BackupInfo::BACKUP_OTHER, dir, node); source->getOperations().m_backupData(oldBackup, newBackup, report ? source->*report : dummy); SE_LOG_DEBUG(NULL, "%s created", dir.c_str()); // remember that we have dumped at the beginning of a sync if (suffix == "before") { m_prepared.insert(source->getName()); } } } } void restoreDatabase(SyncSource &source, const string &suffix, bool dryrun, SyncSourceReport &report) { string dir = databaseName(source, suffix); boost::shared_ptr node = ConfigNode::createFileNode(dir + ".ini"); if (!node->exists()) { Exception::throwError(SE_HERE, dir + ": no such database backup found"); } if (source.getOperations().m_restoreData) { source.getOperations().m_restoreData(SyncSource::Operations::ConstBackupInfo(SyncSource::Operations::BackupInfo::BACKUP_OTHER, dir, node), dryrun, report); } } SourceList(SyncContext &client, bool doLogging) : m_logdir(LogDir::create(client)), m_client(client), m_doLogging(doLogging), m_reportTodo(true), m_logLevel(LOGGING_FULL) { } // call as soon as logdir settings are known void startSession(const string &logDirPath, int maxlogdirs, int logLevel, SyncReport *report) { m_logdir->setLogdir(logDirPath); m_previousLogdir = m_logdir->previousLogdir(); if (m_doLogging) { m_logdir->startSession(logDirPath, LogDir::SESSION_CREATE, maxlogdirs, logLevel, report); } else { // Run debug session without paying attention to // the normal logdir handling. The log level here // refers to stdout. The log file will be as complete // as possible. m_logdir->startSession(logDirPath, LogDir::SESSION_USE_PATH, 0, 1, report); } } /** read-only access to existing session, identified in logDirPath */ void accessSession(const string &logDirPath) { m_logdir->setLogdir(logDirPath); m_previousLogdir = m_logdir->previousLogdir(); m_logdir->startSession(logDirPath, LogDir::SESSION_READ_ONLY, 0, 0, NULL); } /** return log directory, empty if not enabled */ const string &getLogdir() { return m_logdir->getLogdir(); } /** return previous log dir found in startSession() */ const string &getPrevLogdir() const { return m_previousLogdir; } /** set directory for database files without actually redirecting the logging */ void setPath(const string &path) { m_logdir->setPath(path); } /** * If possible (directory to compare against available) and enabled, * then dump changes applied locally. * * @param oldSession directory to compare against; "" searches in sessions of current peer * as selected by context for the lastest one involving each source * @param oldSuffix suffix of old database dump: usually "after" * @param currentSuffix the current database dump suffix: "current" * when not doing a sync, otherwise "before" * @param excludeSource when not empty, only dump that source */ bool dumpLocalChanges(const string &oldSession, const string &oldSuffix, const string &newSuffix, const string &excludeSource, const string &intro = "Local data changes to be applied remotely during synchronization:\n", const string &config = "CLIENT_TEST_LEFT_NAME='after last sync' CLIENT_TEST_RIGHT_NAME='current data' CLIENT_TEST_REMOVED='removed since last sync' CLIENT_TEST_ADDED='added since last sync'") { if (m_logLevel <= LOGGING_SUMMARY) { return false; } vector dirs; if (oldSession.empty()) { m_logdir->previousLogdirs(dirs); } BOOST_FOREACH(SyncSource *source, *this) { if ((!excludeSource.empty() && excludeSource != source->getName()) || (newSuffix == "after" && m_prepared.find(source->getName()) == m_prepared.end())) { continue; } // dump only if not done before or changed if (m_intro != intro) { SE_LOG_SHOW(NULL, "%s", intro.c_str()); m_intro = intro; } string oldDir; if (oldSession.empty()) { // Now look for the latest session involving the current source, // starting with the most recent one. for (vector::const_reverse_iterator it = dirs.rbegin(); it != dirs.rend(); ++it) { const string &sessiondir = *it; boost::shared_ptr oldsession(LogDir::create(m_client)); oldsession->openLogdir(sessiondir); SyncReport report; oldsession->readReport(report); if (report.find(source->getName()) != report.end()) { // source was active in that session, use dump // made there oldDir = databaseName(*source, oldSuffix, sessiondir); break; } } } else { oldDir = databaseName(*source, oldSuffix, oldSession); } string newDir = databaseName(*source, newSuffix); SE_LOG_SHOW(NULL, "*** %s ***", source->getDisplayName().c_str()); string cmd = string("env CLIENT_TEST_COMPARISON_FAILED=10 " + config + " synccompare '" ) + oldDir + "' '" + newDir + "'"; int ret = Execute(cmd, EXECUTE_NO_STDERR); switch (ret == -1 ? ret : WIFEXITED(ret) ? WEXITSTATUS(ret) : -1) { case 0: SE_LOG_SHOW(NULL, "no changes"); break; case 10: break; default: SE_LOG_SHOW(NULL, "Comparison was impossible."); break; } } SE_LOG_SHOW(NULL, "\n"); return true; } // call when all sync sources are ready to dump // pre-sync databases // @param sourceName limit preparation to that source void syncPrepare(const string &sourceName) { if (m_prepared.find(sourceName) != m_prepared.end()) { // data dump was already done (can happen when running multiple // SyncML sessions) return; } if (m_logdir->getLogfile().size() && m_doLogging && (m_client.getDumpData() || m_client.getPrintChanges())) { // dump initial databases SE_LOG_INFO(NULL, "creating complete data backup of datastore %s before sync (%s)", sourceName.c_str(), (m_client.getDumpData() && m_client.getPrintChanges()) ? "enabled with dumpData and needed for printChanges" : m_client.getDumpData() ? "because it was enabled with dumpData" : m_client.getPrintChanges() ? "needed for printChanges" : "???"); dumpDatabases("before", &SyncSourceReport::m_backupBefore, sourceName); if (m_client.getPrintChanges()) { // compare against the old "after" database dump dumpLocalChanges("", "after", "before", sourceName, StringPrintf("%s data changes to be applied during synchronization:\n", m_client.isLocalSync() ? m_client.getContextName().c_str() : "Local")); } } } // call at the end of a sync with success == true // if all went well to print report void syncDone(SyncMLStatus status, SyncReport *report) { // record status - failures from now only affect post-processing // and thus do no longer change that result if (report) { report->setStatus(status == 0 ? STATUS_HTTP_OK : status); } // dump database after sync if explicitly enabled or // needed for comparison; // in the latter case only if dumping it at the beginning completed if (m_doLogging && (m_client.getDumpData() || (m_client.getPrintChanges() && m_reportTodo && !m_prepared.empty()))) { try { SE_LOG_INFO(NULL, "creating complete data backup after sync (%s)", (m_client.getDumpData() && m_client.getPrintChanges()) ? "enabled with dumpData and needed for printChanges" : m_client.getDumpData() ? "because it was enabled with dumpData" : m_client.getPrintChanges() ? "needed for printChanges" : "???"); dumpDatabases("after", &SyncSourceReport::m_backupAfter); } catch (...) { Exception::handle(); // not exactly sure what the problem was, but don't // try it again m_prepared.clear(); } } if (m_doLogging) { if (m_reportTodo && !m_prepared.empty() && report) { // update report with more recent information about m_backupAfter updateSyncReport(*report); } // ensure that stderr is seen again m_logdir->restore(); // write out session status m_logdir->endSession(); if (m_reportTodo) { // haven't looked at result of sync yet; // don't do it again m_reportTodo = false; string logfile = m_logdir->getLogfile(); if (status == STATUS_OK) { SE_LOG_SHOW(NULL, "\nSynchronization successful."); } else if (logfile.size()) { SE_LOG_SHOW(NULL, "\nSynchronization failed, see %s for details.", logfile.c_str()); } else { SE_LOG_SHOW(NULL, "\nSynchronization failed."); } // pretty-print report if (m_logLevel > LOGGING_QUIET) { std::string procname = Logger::getProcessName(); SE_LOG_SHOW(NULL, "\nChanges applied during synchronization%s%s%s:", procname.empty() ? "" : " (", procname.c_str(), procname.empty() ? "" : ")"); } if (m_logLevel > LOGGING_QUIET && report) { ostringstream out; out << *report; std::string slowSync = report->slowSyncExplanation(m_client.getPeer()); if (!slowSync.empty()) { out << endl << slowSync; } SE_LOG_SHOW(NULL, "%s", out.str().c_str()); } // compare databases? if (m_client.getPrintChanges()) { dumpLocalChanges(m_logdir->getLogdir(), "before", "after", "", StringPrintf("\nData modified %s during synchronization:\n", m_client.isLocalSync() ? m_client.getContextName().c_str() : "locally"), "CLIENT_TEST_LEFT_NAME='before sync' CLIENT_TEST_RIGHT_NAME='after sync' CLIENT_TEST_REMOVED='removed during sync' CLIENT_TEST_ADDED='added during sync'"); } // now remove some old logdirs m_logdir->expire(); } } else { // finish debug session m_logdir->restore(); m_logdir->endSession(); } } /** copies information about sources into sync report */ void updateSyncReport(SyncReport &report) { BOOST_FOREACH(SyncSource *source, *this) { report.addSyncSourceReport(source->getName(), *source); } } /** returns names of active sources */ set getSources() { set res; BOOST_FOREACH(SyncSource *source, *this) { res.insert(source->getName()); } return res; } ~SourceList() { // free sync sources BOOST_FOREACH(SyncSource *source, *this) { delete source; } } /** find sync source by name (both normal and virtual sources) */ SyncSource *operator [] (const string &name) { BOOST_FOREACH(SyncSource *source, *this) { if (name == source->getName()) { return source; } } BOOST_FOREACH(boost::shared_ptr &source, m_virtualSources) { if (name == source->getName()) { return source.get(); } } return NULL; } /** find by XML (the ID used by Synthesis to identify sources in progress events) */ SyncSource *lookupBySynthesisID(int synthesisid) { BOOST_FOREACH(SyncSource *source, *this) { if (source->getSynthesisID() == synthesisid) { return source; } } BOOST_FOREACH(boost::shared_ptr &source, m_virtualSources) { if (source->getSynthesisID() == synthesisid) { return source.get(); } } return NULL; } std::list getSourceNames() const; }; std::list SourceList::getSourceNames() const { std::list sourceNames; BOOST_FOREACH (SyncSource *source, *this) { sourceNames.push_back(source->getName()); } return sourceNames; } void unref(SourceList *sourceList) { delete sourceList; } UserInterface &SyncContext::getUserInterfaceNonNull() { if (m_userInterface) { return *m_userInterface; } else { // Doesn't use keyring. static SimpleUserInterface dummy("0"); return dummy; } } void SyncContext::requestAnotherSync() { if (m_activeContext && m_activeContext->m_engine.get() && m_activeContext->m_session) { SharedKey sessionKey = m_activeContext->m_engine.OpenSessionKey(m_activeContext->m_session); m_activeContext->m_engine.SetInt32Value(sessionKey, "restartsync", true); } } const std::vector *SyncContext::getSources() const { return m_sourceListPtr ? m_sourceListPtr->getSourceSet() : NULL; } string SyncContext::getUsedSyncURL() { vector urls = getSyncURL(); BOOST_FOREACH (string url, urls) { if (boost::starts_with(url, "http://") || boost::starts_with(url, "https://")) { #ifdef ENABLE_LIBSOUP return url; #elif defined(ENABLE_LIBCURL) return url; #endif } else if (url.find("obex-bt://") ==0) { #ifdef ENABLE_BLUETOOTH return url; #endif } else if (boost::starts_with(url, "local://")) { return url; } } return ""; } static void CancelTransport(TransportAgent *agent, SuspendFlags &flags) { if (flags.getState() == SuspendFlags::ABORT) { SE_LOG_DEBUG(NULL, "CancelTransport: cancelling because of SuspendFlags::ABORT"); agent->cancel(); } } /** * common initialization for all kinds of transports, to be called * before using them */ static void InitializeTransport(const boost::shared_ptr &agent, int timeout) { agent->setTimeout(timeout); // Automatically call cancel() when we an abort request // is detected. Relies of automatic connection management // to disconnect when agent is deconstructed. SuspendFlags &flags(SuspendFlags::getSuspendFlags()); flags.m_stateChanged.connect(SuspendFlags::StateChanged_t::slot_type(CancelTransport, agent.get(), _1).track(agent)); } boost::shared_ptr SyncContext::createTransportAgent(void *gmainloop) { string url = getUsedSyncURL(); m_retryInterval = getRetryInterval(); m_retryDuration = getRetryDuration(); int timeout = m_serverMode ? m_retryDuration : min(m_retryInterval, m_retryDuration); if (m_localSync) { string peer = url.substr(strlen("local://")); boost::shared_ptr agent(LocalTransportAgent::create(this, peer, gmainloop)); InitializeTransport(agent, timeout); agent->start(); return agent; } else if (boost::starts_with(url, "http://") || boost::starts_with(url, "https://")) { #ifdef ENABLE_LIBSOUP boost::shared_ptr agent(new SoupTransportAgent(static_cast(gmainloop))); agent->setConfig(*this); InitializeTransport(agent, timeout); return agent; #elif defined(ENABLE_LIBCURL) boost::shared_ptr agent(new CurlTransportAgent()); agent->setConfig(*this); InitializeTransport(agent, timeout); return agent; #endif } else if (url.find("obex-bt://") ==0) { #ifdef ENABLE_BLUETOOTH std::string btUrl = url.substr (strlen ("obex-bt://"), std::string::npos); boost::shared_ptr agent(new ObexTransportAgent(ObexTransportAgent::OBEX_BLUETOOTH, static_cast(gmainloop))); agent->setURL (btUrl); InitializeTransport(agent, timeout); // this will block already agent->connect(); return agent; #endif } SE_THROW("unsupported transport type is specified in the configuration"); } void SyncContext::displayServerMessage(const string &message) { SE_LOG_INFO(NULL, "message from server: %s", message.c_str()); } void SyncContext::displaySyncProgress(sysync::TProgressEventEnum type, int32_t extra1, int32_t extra2, int32_t extra3) { } bool SyncContext::displaySourceProgress(SyncSource &source, const SyncSourceEvent &event, bool flush) { if (!flush) { // Certain events do not need to be printed immediately. // For example, instead of multiple PEV_ITEMRECEIVED events // foo: received 1/100 // foo: received 2/100 // foo: ... // foo: received 100/100 // it is better to just print one: // foo: received 100/100 switch (event.m_type) { case sysync::PEV_ITEMPROCESSED: // Ignore this one completely. There is one such event // after each PEV_ITEMRECEIVED, so processing // PEV_ITEMPROCESSED would break the merging of // PEV_ITEMRECEIVED, at least the way it is implemented // now. PEV_ITEMPROCESSED also doesn't add much // information. return true; case sysync::PEV_DELETING: case sysync::PEV_ITEMRECEIVED: case sysync::PEV_ITEMSENT: // Flush when switching to a different event type or source. if (m_sourceEvent.m_type != sysync::PEV_NOP && (m_sourceEvent.m_type != event.m_type || m_sourceProgress != &source)) { displaySourceProgress(*m_sourceProgress, m_sourceEvent, true); } m_sourceEvent.m_type = event.m_type; m_sourceEvent.m_extra1 = event.m_extra1; m_sourceEvent.m_extra2 = event.m_extra2; m_sourceEvent.m_extra3 = event.m_extra3; m_sourceProgress = &source; return true; break; default: if (m_sourceEvent.m_type != sysync::PEV_NOP) { displaySourceProgress(*m_sourceProgress, m_sourceEvent, true); m_sourceEvent.m_type = sysync::PEV_NOP; } break; } } switch(event.m_type) { case sysync::PEV_PREPARING: /* preparing (e.g. preflight in some clients), extra1=progress, extra2=total */ /* extra2 might be zero */ /* * At the moment, preparing items doesn't do any real work. * Printing this progress just increases the output and slows * us down. Disabled. */ if (true || source.getFinalSyncMode() == SYNC_NONE) { // not active, suppress output } else if (event.m_extra2) { SE_LOG_INFO(NULL, "%s: preparing %d/%d", source.getDisplayName().c_str(), event.m_extra1, event.m_extra2); } else { SE_LOG_INFO(NULL, "%s: preparing %d", source.getDisplayName().c_str(), event.m_extra1); } break; case sysync::PEV_DELETING: /* deleting (zapping datastore), extra1=progress, extra2=total */ if (event.m_extra2) { SE_LOG_INFO(NULL, "%s: deleting %d/%d", source.getDisplayName().c_str(), event.m_extra1, event.m_extra2); } else { SE_LOG_INFO(NULL, "%s: deleting %d", source.getDisplayName().c_str(), event.m_extra1); } break; case sysync::PEV_ALERTED: { /* datastore alerted (extra1=0 for normal, 1 for slow, 2 for first time slow, extra2=1 for resumed session, extra3 0=twoway, 1=fromserver, 2=fromclient */ // -1 is used for alerting a restore from backup. Synthesis won't use this bool peerIsClient = getPeerIsClient(); if (event.m_extra1 != -1) { SE_LOG_INFO(NULL, "%s: %s %s sync%s (%s)", source.getDisplayName().c_str(), event.m_extra2 ? "resuming" : "starting", event.m_extra1 == 0 ? "normal" : event.m_extra1 == 1 ? "slow" : event.m_extra1 == 2 ? "first time" : "unknown", event.m_extra3 == 0 ? ", two-way" : event.m_extra3 == 1 ? " from server" : event.m_extra3 == 2 ? " from client" : ", unknown direction", peerIsClient ? "peer is client" : "peer is server"); SimpleSyncMode mode = SIMPLE_SYNC_NONE; SyncMode sync = StringToSyncMode(source.getSync()); switch (event.m_extra1) { case 0: switch (event.m_extra3) { case 0: mode = SIMPLE_SYNC_TWO_WAY; if (m_serverMode && m_serverAlerted) { if (sync == SYNC_ONE_WAY_FROM_SERVER || sync == SYNC_ONE_WAY_FROM_LOCAL) { // As in the slow/refresh-from-server case below, // pretending to do a two-way incremental sync // is a correct way of executing the requested // one-way sync, as long as the client doesn't // send any of its own changes. The Synthesis // engine does that. mode = SIMPLE_SYNC_ONE_WAY_FROM_LOCAL; } else if (sync == SYNC_LOCAL_CACHE_SLOW || sync == SYNC_LOCAL_CACHE_INCREMENTAL) { mode = SIMPLE_SYNC_LOCAL_CACHE_INCREMENTAL; } } break; case 1: mode = peerIsClient ? SIMPLE_SYNC_ONE_WAY_FROM_LOCAL : SIMPLE_SYNC_ONE_WAY_FROM_REMOTE; break; case 2: mode = peerIsClient ? SIMPLE_SYNC_ONE_WAY_FROM_REMOTE : SIMPLE_SYNC_ONE_WAY_FROM_LOCAL; break; } break; case 1: case 2: switch (event.m_extra3) { case 0: mode = SIMPLE_SYNC_SLOW; if (m_serverMode && m_serverAlerted) { if (sync == SYNC_REFRESH_FROM_SERVER || sync == SYNC_REFRESH_FROM_LOCAL) { // We run as server and told the client to refresh // its data. A slow sync is how some clients (the // Synthesis engine included) execute that sync mode; // let's be optimistic and assume that the client // did as it was told and deleted its data. mode = SIMPLE_SYNC_REFRESH_FROM_LOCAL; } else if (sync == SYNC_LOCAL_CACHE_SLOW || sync == SYNC_LOCAL_CACHE_INCREMENTAL) { mode = SIMPLE_SYNC_LOCAL_CACHE_SLOW; } } break; case 1: mode = peerIsClient ? SIMPLE_SYNC_REFRESH_FROM_LOCAL : SIMPLE_SYNC_REFRESH_FROM_REMOTE; break; case 2: mode = peerIsClient ? SIMPLE_SYNC_REFRESH_FROM_REMOTE : SIMPLE_SYNC_REFRESH_FROM_LOCAL; break; } break; } if (SyncMode(mode) != SYNC_NONE) { SE_LOG_DEBUG(NULL, "reading: set read-ahead based on sync mode %s", PrettyPrintSyncMode(SyncMode(mode)).c_str()); switch (mode) { case SIMPLE_SYNC_NONE: case SIMPLE_SYNC_INVALID: case SIMPLE_SYNC_RESTORE_FROM_BACKUP: case SIMPLE_SYNC_ONE_WAY_FROM_REMOTE: case SIMPLE_SYNC_REFRESH_FROM_REMOTE: case SIMPLE_SYNC_LOCAL_CACHE_INCREMENTAL: source.setReadAheadOrder(SyncSourceBase::READ_NONE); break; case SIMPLE_SYNC_TWO_WAY: case SIMPLE_SYNC_ONE_WAY_FROM_LOCAL: source.setReadAheadOrder(SyncSourceBase::READ_CHANGED_ITEMS); break; case SIMPLE_SYNC_SLOW: case SIMPLE_SYNC_REFRESH_FROM_LOCAL: case SIMPLE_SYNC_LOCAL_CACHE_SLOW: source.setReadAheadOrder(SyncSourceBase::READ_ALL_ITEMS); break; } } if (source.getFinalSyncMode() == SYNC_NONE) { source.recordFinalSyncMode(SyncMode(mode)); source.recordFirstSync(event.m_extra1 == 2); source.recordResumeSync(event.m_extra2 == 1); } else if (SyncMode(mode) != SYNC_NONE) { // Broadcast statistics before moving into next cycle. m_sourceSyncedSignal(source.getName(), source); // may happen when the source is used in multiple // SyncML sessions; only remember the initial sync // mode in that case and count all following syncs // (they should only finish the work of the initial // one) source.recordRestart(); if (m_serverMode) { // Done with first cycle, revert to normal photo // handling if it was disabled. SharedKey sessionKey = m_engine.OpenSessionKey(m_session); SharedKey contextKey = m_engine.OpenKeyByPath(sessionKey, "/sessionvars"); m_engine.SetInt32Value(contextKey, "keepPhotoData", false); } // Reset "started" flags for PEV_SYNCSTART. m_sourceStarted.clear(); } } else { SE_LOG_INFO(NULL, "%s: restore from backup", source.getDisplayName().c_str()); source.recordFinalSyncMode(SYNC_RESTORE_FROM_BACKUP); } break; } case sysync::PEV_SYNCSTART: /* sync started */ /* Get's triggered by libsynthesis frequently. Limit it to once per sync cycle. */ if (m_sourceStarted.find(source.getName()) == m_sourceStarted.end()) { SE_LOG_INFO(NULL, "%s: started", source.getDisplayName().c_str()); m_sourceStarted.insert(source.getName()); } break; case sysync::PEV_ITEMRECEIVED: /* item received, extra1=current item count, extra2=number of expected changes (if >= 0) */ if (source.getFinalSyncMode() == SYNC_NONE) { } else if (event.m_extra2 > 0) { SE_LOG_INFO(NULL, "%s: received %d/%d", source.getDisplayName().c_str(), event.m_extra1, event.m_extra2); } else { SE_LOG_INFO(NULL, "%s: received %d", source.getDisplayName().c_str(), event.m_extra1); } source.recordTotalNumItemsReceived(event.m_extra1); break; case sysync::PEV_ITEMSENT: /* item sent, extra1=current item count, extra2=number of expected items to be sent (if >=0) */ if (source.getFinalSyncMode() == SYNC_NONE) { } else if (event.m_extra2 > 0) { SE_LOG_INFO(NULL, "%s: sent %d/%d", source.getDisplayName().c_str(), event.m_extra1, event.m_extra2); } else { SE_LOG_INFO(NULL, "%s: sent %d", source.getDisplayName().c_str(), event.m_extra1); } source.recordTotalNumItemsSent(event.m_extra1); break; // Not reached, see above. case sysync::PEV_ITEMPROCESSED: /* item locally processed, extra1=# added, extra2=# updated, extra3=# deleted */ if (source.getFinalSyncMode() == SYNC_NONE) { } else if (source.getFinalSyncMode() != SYNC_NONE) { SE_LOG_INFO(NULL, "%s: added %d, updated %d, removed %d", source.getDisplayName().c_str(), event.m_extra1, event.m_extra2, event.m_extra3); } break; case sysync::PEV_SYNCEND: { /* sync finished, probably with error in extra1 (0=ok), syncmode in extra2 (0=normal, 1=slow, 2=first time), extra3=1 for resumed session) */ if (source.getFinalSyncMode() == SYNC_NONE) { SE_LOG_INFO(NULL, "%s: inactive", source.getDisplayName().c_str()); } else if(source.getFinalSyncMode() == SYNC_RESTORE_FROM_BACKUP) { SE_LOG_INFO(NULL, "%s: restore done %s", source.getDisplayName().c_str(), event.m_extra1 ? "unsuccessfully" : "successfully" ); } else { SE_LOG_INFO(NULL, "%s: %s%s sync done %s", source.getDisplayName().c_str(), event.m_extra3 ? "resumed " : "", event.m_extra2 == 0 ? "normal" : event.m_extra2 == 1 ? "slow" : event.m_extra2 == 2 ? "first time" : "unknown", event.m_extra1 ? "unsuccessfully" : "successfully"); } int32_t extra1 = event.m_extra1; switch (extra1) { case 401: // TODO: reset cached password SE_LOG_INFO(NULL, "authorization failed, check username '%s' and password", getSyncUser().toString().c_str()); break; case 403: SE_LOG_INFO(source.getDisplayName(), "log in succeeded, but server refuses access - contact server operator"); break; case 407: SE_LOG_INFO(NULL, "proxy authorization failed, check proxy username and password"); break; case 404: SE_LOG_INFO(source.getDisplayName(), "server database not found, check URI '%s'", source.getURINonEmpty().c_str()); break; case 0: break; case sysync::LOCERR_DATASTORE_ABORT: // this can mean only one thing in SyncEvolution: unexpected slow sync extra1 = STATUS_UNEXPECTED_SLOW_SYNC; // no break! default: // Printing unknown status codes here is of somewhat questionable value, // because even "good" sources will get a bad status when the overall // session turns bad. We also don't have good explanations for the // status here. SE_LOG_ERROR(source.getDisplayName(), "%s", Status2String(SyncMLStatus(event.m_extra1)).c_str()); break; } source.recordStatus(SyncMLStatus(extra1)); break; } case sysync::PEV_DSSTATS_L: /* datastore statistics for local (extra1=# added, extra2=# updated, extra3=# deleted) */ source.setItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_ADDED, SyncSource::ITEM_TOTAL, event.m_extra1); source.setItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_UPDATED, SyncSource::ITEM_TOTAL, event.m_extra2); source.setItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_REMOVED, SyncSource::ITEM_TOTAL, // Synthesis engine doesn't count locally // deleted items during // refresh-from-server/client. That's a matter of // taste. In SyncEvolution we'd like these // items to show up, so add it here. (source.getFinalSyncMode() == (m_serverMode ? SYNC_REFRESH_FROM_CLIENT : SYNC_REFRESH_FROM_SERVER) || source.getFinalSyncMode() == SYNC_REFRESH_FROM_REMOTE) ? source.getNumDeleted() : event.m_extra3); break; case sysync::PEV_DSSTATS_R: /* datastore statistics for remote (extra1=# added, extra2=# updated, extra3=# deleted) */ source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ADDED, SyncSource::ITEM_TOTAL, event.m_extra1); source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_UPDATED, SyncSource::ITEM_TOTAL, event.m_extra2); source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_REMOVED, SyncSource::ITEM_TOTAL, event.m_extra3); break; case sysync::PEV_DSSTATS_E: /* datastore statistics for local/remote rejects (extra1=# locally rejected, extra2=# remotely rejected) */ source.setItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_ANY, SyncSource::ITEM_REJECT, event.m_extra1); source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ANY, SyncSource::ITEM_REJECT, event.m_extra2); break; case sysync::PEV_DSSTATS_S: /* datastore statistics for server slowsync (extra1=# slowsync matches) */ source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ANY, SyncSource::ITEM_MATCH, event.m_extra1); break; case sysync::PEV_DSSTATS_C: /* datastore statistics for server conflicts (extra1=# server won, extra2=# client won, extra3=# duplicated) */ source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ANY, SyncSource::ITEM_CONFLICT_SERVER_WON, event.m_extra1); source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ANY, SyncSource::ITEM_CONFLICT_CLIENT_WON, event.m_extra2); source.setItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ANY, SyncSource::ITEM_CONFLICT_DUPLICATED, event.m_extra3); break; case sysync::PEV_DSSTATS_D: /* datastore statistics for data volume (extra1=outgoing bytes, extra2=incoming bytes) */ source.setItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_ANY, SyncSource::ITEM_SENT_BYTES, event.m_extra1); source.setItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_ANY, SyncSource::ITEM_RECEIVED_BYTES, event.m_extra2); break; case sysync::PEV_NOP: // Handled, do not process further. return true; break; default: SE_LOG_DEBUG(NULL, "%s: progress event %d, extra %d/%d/%d", source.getDisplayName().c_str(), event.m_type, event.m_extra1, event.m_extra2, event.m_extra3); } return false; } /* * There have been segfaults inside glib in the background * thread which ran the second event loop. Disabled it again, * even though the synchronous EDS API calls will block then * when EDS dies. */ #if 0 && defined(HAVE_GLIB) && defined(HAVE_EDS) # define RUN_GLIB_LOOP #endif #ifdef RUN_GLIB_LOOP static void *mainLoopThread(void *) { // The test framework uses SIGALRM for timeouts. // Block the signal here because a) the signal handler // prints a stack back trace when called and we are not // interessted in the background thread's stack and b) // it seems to have confused glib/libebook enough to // access invalid memory and segfault when it gets the SIGALRM. sigset_t blocked; sigemptyset(&blocked); sigaddset(&blocked, SIGALRM); pthread_sigmask(SIG_BLOCK, &blocked, NULL); GMainLoop *mainloop = g_main_loop_new(NULL, TRUE); if (mainloop) { g_main_loop_run(mainloop); g_main_loop_unref(mainloop); } return NULL; } #endif void SyncContext::startLoopThread() { #ifdef RUN_GLIB_LOOP // when using Evolution we must have a running main loop, // otherwise loss of connection won't be reported to us static pthread_t loopthread; static bool loopthreadrunning; if (!loopthreadrunning) { loopthreadrunning = !pthread_create(&loopthread, NULL, mainLoopThread, NULL); } #endif } SyncSource *SyncContext::findSource(const std::string &name) { if (!m_activeContext || !m_activeContext->m_sourceListPtr) { return NULL; } const char *realname = strrchr(name.c_str(), m_findSourceSeparator); if (realname) { realname++; } else { realname = name.c_str(); } return (*m_activeContext->m_sourceListPtr)[realname]; } SyncContext *SyncContext::findContext(const char *sessionName) { return m_activeContext; } void SyncContext::initSources(SourceList &sourceList) { list configuredSources = getSyncSources(); map subSources; // Disambiguate source names because we have multiple with the same // name active? string contextName; if (m_localSync) { contextName = getContextName(); } // Phase 1, check all virtual sync soruces BOOST_FOREACH(const string &name, configuredSources) { boost::shared_ptr sc(getSyncSourceConfig(name)); SyncSourceNodes source = getSyncSourceNodes (name); std::string sync = sc->getSync(); SyncMode mode = StringToSyncMode(sync); if (mode != SYNC_NONE) { SourceType sourceType = SyncSource::getSourceType(source); if (sourceType.m_backend == "virtual") { //This is a virtual sync source, check and enable the referenced //sub syncsources here SyncSourceParams params(name, source, boost::shared_ptr(this, SyncConfigNOP()), contextName); boost::shared_ptr vSource = boost::shared_ptr (new VirtualSyncSource (params)); std::vector mappedSources = vSource->getMappedSources(); BOOST_FOREACH (std::string source, mappedSources) { //check whether the mapped source is really available boost::shared_ptr source_config = getSyncSourceConfig(source); if (!source_config || !source_config->exists()) { Exception::throwError(SE_HERE, StringPrintf("Virtual datastore \"%s\" references a nonexistent datasource \"%s\".", name.c_str(), source.c_str())); } pair< map::iterator, bool > res = subSources.insert(make_pair(source, name)); if (!res.second) { Exception::throwError(SE_HERE, StringPrintf("Datastore \"%s\" included in the virtual datastores \"%s\" and \"%s\". It can only be included in one virtual datastore at a time.", source.c_str(), res.first->second.c_str(), name.c_str())); } } FilterConfigNode::ConfigFilter vFilter; vFilter["sync"] = sync; if (!m_serverMode) { // must set special URI for clients so that // engine knows about superdatastore and its // URI vFilter["uri"] = string("<") + vSource->getName() + ">" + vSource->getURINonEmpty(); } BOOST_FOREACH (std::string source, mappedSources) { setConfigFilter (false, source, vFilter); } sourceList.addSource(vSource); } } } BOOST_FOREACH(const string &name, configuredSources) { boost::shared_ptr sc(getSyncSourceConfig(name)); SyncSourceNodes source = getSyncSourceNodes (name); if (!sc->isDisabled()) { SourceType sourceType = SyncSource::getSourceType(source); if (sourceType.m_backend != "virtual") { SyncSourceParams params(name, source, boost::shared_ptr(this, SyncConfigNOP()), contextName); cxxptr syncSource(SyncSource::createSource(params)); if (!syncSource) { Exception::throwError(SE_HERE, name + ": type unknown" ); } if (subSources.find(name) != subSources.end()) { syncSource->recordVirtualSource(subSources[name]); } sourceList.addSource(syncSource); } } else { // the Synthesis engine is never going to see this source, // therefore we have to mark it as 100% complete and // "done" class DummySyncSource source(name, contextName); source.recordFinalSyncMode(SYNC_NONE); displaySourceProgress(source, SyncSourceEvent(sysync::PEV_PREPARING, 0, 0, 0), true); displaySourceProgress(source, SyncSourceEvent(sysync::PEV_ITEMPROCESSED, 0, 0, 0), true); displaySourceProgress(source, SyncSourceEvent(sysync::PEV_ITEMRECEIVED, 0, 0, 0), true); displaySourceProgress(source, SyncSourceEvent(sysync::PEV_ITEMSENT, 0, 0, 0), true); displaySourceProgress(source, SyncSourceEvent(sysync::PEV_SYNCEND, 0, 0, 0), true); } } } SyncMLStatus SyncContext::startSourceAccess(SyncSource *source) { if(m_firstSourceAccess) { syncSuccessStart(); m_firstSourceAccess = false; } if (m_serverMode) { // When using the source as cache, change tracking // is not required. Disabling it can make item // changes faster. SyncMode mode = StringToSyncMode(source->getSync()); if (mode == SYNC_LOCAL_CACHE_SLOW || mode == SYNC_LOCAL_CACHE_INCREMENTAL) { source->setNeedChanges(false); } // source is active in sync, now open it source->open(); } // database dumping is delayed in both client and server m_sourceListPtr->syncPrepare(source->getName()); return STATUS_OK; } // XML configuration converted to C string constants extern "C" { // including all known fragments for a client extern const char *SyncEvolutionXMLClient; // the remote rules for a client extern const char *SyncEvolutionXMLClientRules; } /** * helper class which scans directories for * XML config files */ class XMLFiles { public: enum Category { MAIN, /**< files directly under searched directories */ DATATYPES, /**< inside datatypes and datatypes/ */ SCRIPTING, /**< inside scripting and scripting/ */ REMOTERULES, /**< inside remoterules and remoterules/ */ MAX_CATEGORY }; /** search file system for XML config fragments */ void scan(const string &mode); /** datatypes, scripts and rules concatenated, empty if none found */ string get(Category category); /** main file, typically "syncevolution.xml", empty if not found */ string get(const string &file); static const string m_syncevolutionXML; private: /* base name as sort key + full file path, iterating is done in lexical order */ StringMap m_files[MAX_CATEGORY]; /** * scan a specific directory for main files directly inside it * and inside datatypes, scripting, remoterules; * it is not an error when it does not exist or is not a directory */ void scanRoot(const string &mode, const string &dir); /** * scan a datatypes/scripting/remoterules sub directory, * including the sub-directory */ void scanFragments(const string &mode, const string &dir, Category category); /** * add all .xml files to the right hash, overwriting old entries */ void addFragments(const string &dir, Category category); }; const string XMLFiles::m_syncevolutionXML("syncevolution.xml"); void XMLFiles::scan(const string &mode) { const char *dir = getenv("SYNCEVOLUTION_XML_CONFIG_DIR"); /* * read either one or the other, so that testing can run without * accidentally reading installed files */ if (dir) { scanRoot(mode, dir); } else { scanRoot(mode, XML_CONFIG_DIR); scanRoot(mode, SubstEnvironment("${XDG_CONFIG_HOME}/syncevolution-xml")); } } void XMLFiles::scanRoot(const string &mode, const string &dir) { addFragments(dir, MAIN); scanFragments(mode, dir + "/scripting", SCRIPTING); scanFragments(mode, dir + "/datatypes", DATATYPES); scanFragments(mode, dir + "/remoterules", REMOTERULES); } void XMLFiles::scanFragments(const string &mode, const string &dir, Category category) { addFragments(dir, category); addFragments(dir + "/" + mode, category); } void XMLFiles::addFragments(const string &dir, Category category) { if (!isDir(dir)) { return; } ReadDir content(dir); BOOST_FOREACH(const string &file, content) { if (boost::ends_with(file, ".xml")) { m_files[category][file] = dir + "/" + file; } } } string XMLFiles::get(Category category) { string res; BOOST_FOREACH(const StringPair &entry, m_files[category]) { string content; ReadFile(entry.second, content); res += content; } return res; } string XMLFiles::get(const string &file) { string res; StringMap::const_iterator entry = m_files[MAIN].find(file); if (entry != m_files[MAIN].end()) { ReadFile(entry->second, res); } return res; } static void substTag(string &xml, const string &tagname, const string &replacement, bool replaceElement = false) { string tag; size_t index; tag.reserve(tagname.size() + 3); tag += "<"; tag += tagname; tag += "/>"; index = xml.find(tag); if (index != xml.npos) { string tmp; tmp.reserve(tagname.size() * 2 + 2 + 3 + replacement.size()); if (!replaceElement) { tmp += "<"; tmp += tagname; tmp += ">"; } tmp += replacement; if (!replaceElement) { tmp += ""; } xml.replace(index, tag.size(), tmp); } } static void substTag(string &xml, const string &tagname, const char *replacement, bool replaceElement = false) { substTag(xml, tagname, std::string(replacement), replaceElement); } template void substTag(string &xml, const string &tagname, const T replacement, bool replaceElement = false) { stringstream str; str << replacement; substTag(xml, tagname, str.str(), replaceElement); } void SyncContext::getConfigTemplateXML(const string &mode, string &xml, string &rules, string &configname) { XMLFiles files; files.scan(mode); xml = files.get(files.m_syncevolutionXML); if (xml.empty()) { if (mode != "client") { SE_THROW(files.m_syncevolutionXML + " not found"); } configname = "builtin XML configuration"; xml = SyncEvolutionXMLClient; rules = SyncEvolutionXMLClientRules; } else { configname = "XML configuration files"; rules = files.get(XMLFiles::REMOTERULES); substTag(xml, "datatypes", files.get(XMLFiles::DATATYPES) + " \n \n \n"); substTag(xml, "scripting", files.get(XMLFiles::SCRIPTING)); } } void SyncContext::getConfigXML(bool isSync, string &xml, string &configname) { string rules; getConfigTemplateXML(m_serverMode ? "server" : "client", xml, rules, configname); string tag; size_t index; unsigned long hash = 0; std::set flags = getSyncMLFlags(); bool noctcap = flags.find("noctcap") != flags.end(); bool norestart = flags.find("norestart") != flags.end(); const char *PBAPSyncMode = getenv("SYNCEVOLUTION_PBAP_SYNC"); bool keepPhotoData = PBAPSyncMode && (boost::iequals(PBAPSyncMode, "incremental") || boost::iequals(PBAPSyncMode, "text")); std::string sessioninitscript = " \n"; ostringstream clientorserver; if (m_serverMode) { clientorserver << " \n" " SyncEvolution\n" " yes\n" " yes\n"; InitState configrequestmaxtime = getRequestMaxTime(); unsigned int requestmaxtime; if (configrequestmaxtime.wasSet()) { // Explicitly set, use it regardless of the kind of sync. // We allow this even if thread support was not available, // because if a user enables it explicitly, it's probably // for a good reason (= failing client), in which case // risking multithreading issues is preferable. requestmaxtime = configrequestmaxtime.get(); } else if (m_remoteInitiated || m_localSync) { // We initiated the sync (local sync, Bluetooth). The client // should not time out, so there is no need for intermediate // message sending. // // To avoid potential problems and get a single log file, // avoid it and multithreading by default. requestmaxtime = 0; } else { // We were contacted by an HTTP client. Reply to client // not later than 120 seconds while storage initializes // in a background thread. #ifdef HAVE_THREAD_SUPPORT requestmaxtime = 120; // default in seconds #else requestmaxtime = 0; #endif } if (requestmaxtime) { clientorserver << " yes\n" " " << requestmaxtime << "\n"; } else { clientorserver << " no\n"; } clientorserver << "\n" << sessioninitscript << " 300\n" "\n"; //do not send respuri if over bluetooth if (boost::starts_with (getUsedSyncURL(), "obex-bt://")) { clientorserver << " no\n" "\n"; } clientorserver << " " << (norestart ? "no" : "yes" ) << "\n"; if (noctcap) { clientorserver << " no\n" "\n"; } clientorserver<<" \n" "\n" " \n" "\n" " \n" " \n"; } else { clientorserver << " \n" " $(binfilepath)\n" " no\n" " \n"; if (getRefreshSync()) { clientorserver << " no\n"; } clientorserver << "\n" ; string syncMLVersion (getSyncMLVersion()); if (!syncMLVersion.empty()) { clientorserver << "" <\n"; } clientorserver << " " << (norestart ? "no" : "yes" ) << "\n"; if (noctcap) { clientorserver << " no\n" "\n"; } clientorserver << sessioninitscript << // SyncEvolution has traditionally not folded long lines in // vCard. Testing showed that servers still have problems with // it, so avoid it by default " yes\n" "\n" " \n" "\n" " \n" "\n" " \n" " \n"; } substTag(xml, "clientorserver", clientorserver.str(), true); tag = ""; index = xml.find(tag); if (index != xml.npos) { stringstream debug; bool logging = !m_sourceListPtr->getLogdir().empty(); int loglevel = getLogLevel(); #ifdef USE_DLT const char *useDLT = getenv("SYNCEVOLUTION_USE_DLT"); #else static const char *useDLT = NULL; #endif debug << " \n" // logpath is a config variable set by SyncContext::doSync() " $(logpath)\n" " " << (useDLT ? "" : LogfileBasename) << "" << " flush\n" " " << (useDLT ? "dlt" : "html") << "\n" " auto\n" << (useDLT ? " no\n" " no\n" : " yes\n" " yes\n") << " no\n" " separate\n" " yes\n" " yes\n"; #ifdef USE_DLT if (useDLT) { const char *contexts[] = { "PROT", "SESS", "ADMN", "DATA", "REMI", "PARS", "GEN", "TRNS", "SMLT", "SYS" }; BOOST_FOREACH (const char *context, contexts) { // Help libsynthesis debuglogger.cpp set default log levels, // based on our own one. SE_LOG_DEBUG(NULL, "default libsynthesis DLT logging of %s = %s", context, useDLT); setenv((std::string("LIBSYNTHESIS_") + context).c_str(), useDLT, false); } debug << // We have to enable all logging inside libsynthesis. // The actual filtering then takes place inside DLT. // Message logging is not supported. " \n" // Allow logging outside of sessions. " yes\n" // Don't try per-session logging, it all goes to DLT anyway. " yes\n" ; // Be extra verbose if currently enabled. Cannot be changed later on. if (atoi(useDLT) > DLT_LOG_DEBUG) { debug << " \n" " \n"; } if (atoi(useDLT) > DLT_LOG_DEBUG) { debug << " \n"; } } else #endif // USE_DLT if (logging) { debug << " yes\n" " yes\n"; debug << "" << (loglevel >= 5 ? "yes" : "no") << "\n"; debug << "" << (loglevel >= 4 ? "yes" : "no") << "\n"; if (loglevel >= 3) { debug << " doxygen\n" " \n" " \n" " \n" " \n"; } } else { debug << " no\n" " no\n" " no\n" " no\n" " "; } debug << " \n"; xml.replace(index, tag.size(), debug.str()); } XMLConfigFragments fragments; tag = ""; index = xml.find(tag); if (index != xml.npos) { stringstream datastores; BOOST_FOREACH(SyncSource *source, *m_sourceListPtr) { string fragment; source->getDatastoreXML(fragment, fragments); string name; // Make sure that sub-datastores do not interfere with the global URI namespace // by adding a / prefix. That way we can have a "calendar" // alias for "calendar+todo" without conflicting with the underlying // "calendar", which will be called "calendar+todo/calendar" in the XML config. name = source->getVirtualSource(); if (!name.empty()) { name += m_findSourceSeparator; } name += source->getName(); datastores << " \n" << " " << source->getSynthesisID() << "\n" << fragment; datastores << " on\n"; if (source->getOperations().m_writeBlob) { // BLOB support is essential for caching partially received items. datastores << " on\n"; } SyncMode mode = StringToSyncMode(source->getSync()); if (source->getForceSlowSync()) { // we *want* a slow sync, but couldn't tell the client -> force it server-side datastores << " FORCESLOWSYNC(); \n"; } else if (mode == SYNC_LOCAL_CACHE_SLOW || mode == SYNC_LOCAL_CACHE_INCREMENTAL) { if (!m_serverMode) { SE_THROW("sync modes 'local-cache-*' are only supported on the server side"); } datastores << " SETREFRESHONLY(1); SETCACHEDATA(1);\n"; // datastores << " REFRESHONLY(); CACHEDATA(); SLOWSYNC(); ALERTCODE();\n"; } else if (mode != SYNC_SLOW && // slow-sync detection not implemented when running as server, // not even when initiating the sync (direct sync with phone) !m_serverMode && // is implemented as "delete local data" + "slow sync", // so a slow sync is acceptable in this case mode != SYNC_REFRESH_FROM_SERVER && mode != SYNC_REFRESH_FROM_REMOTE && // The forceSlow should be disabled if the sync session is // initiated by a remote peer (eg. Server Alerted Sync) !m_remoteInitiated && getPreventSlowSync() && (!source->getOperations().m_isEmpty || // check is only relevant if we have local data; !source->getOperations().m_isEmpty())) { // if we cannot check, assume we have data // We are not expecting a slow sync => refuse to execute one. // This is the client check for this, server must be handled // differently (TODO, MB #2416). datastores << " \n"; } if (m_serverMode && !m_localSync) { string uri = source->getURI(); if (!uri.empty()) { datastores << " "; } } datastores << " \n\n"; } /*If there is super datastore, add it here*/ //TODO generate specific superdatastore contents (MB #8753) //Now only works for synthesis built-in events+tasks BOOST_FOREACH (boost::shared_ptr vSource, m_sourceListPtr->getVirtualSources()) { std::string superType = vSource->getSourceType().m_format; std::string evoSyncSource = vSource->getDatabaseID(); std::vector mappedSources = unescapeJoinedString (evoSyncSource, ','); // always check for a consistent config SourceType sourceType = vSource->getSourceType(); BOOST_FOREACH (std::string source, mappedSources) { //check the data type SyncSource *subSource = (*m_sourceListPtr)[source]; SourceType subType = subSource->getSourceType(); //If there is no format explictly selected in sub SyncSource, we //have no way to determine whether it works with the format //specific in the virtual SyncSource, thus no warning in this //case. if (!subType.m_format.empty() && ( sourceType.m_format != subType.m_format || sourceType.m_forceFormat != subType.m_forceFormat)) { SE_LOG_WARNING(NULL, "Virtual datastore \"%s\" and sub datastore \"%s\" have different data format. Will use the format in virtual datastore.", vSource->getDisplayName().c_str(), source.c_str()); } } if (mappedSources.size() !=2) { vSource->throwError(SE_HERE, "virtual datastore currently only supports events+tasks combinations"); } string name = vSource->getName(); datastores << " \n"; datastores << " \n" << " F.ISEVENT:=1\n" << " e\n" << " \n" << "\n \n" << " F.ISEVENT:=0\n" << " t\n" <<" \n" ; if (m_serverMode && !m_localSync) { string uri = vSource->getURI(); if (!uri.empty()) { datastores << " "; } } if (vSource->getForceSlowSync()) { // we *want* a slow sync, but couldn't tell the client -> force it server-side datastores << " FORCESLOWSYNC(); \n"; } std::string typesupport; typesupport = vSource->getDataTypeSupport(); datastores << " \n" << typesupport << " \n"; datastores <<"\n "; } if (datastores.str().empty()) { // Add dummy datastore, the engine needs it. sync() // checks that we have a valid configuration if it is // really needed. #if 0 datastores << "" "SyncEvolution" "" "" "" "" ""; #endif } xml.replace(index, tag.size(), datastores.str()); } substTag(xml, "fieldlists", fragments.m_fieldlists.join(), true); substTag(xml, "profiles", fragments.m_profiles.join(), true); substTag(xml, "datatypedefs", fragments.m_datatypes.join(), true); substTag(xml, "remoterules", rules + fragments.m_remoterules.join(), true); if (m_serverMode) { // TODO: set the device ID for an OBEX server } else { substTag(xml, "fakedeviceid", getDevID()); } substTag(xml, "model", getMod()); substTag(xml, "manufacturer", getMan()); substTag(xml, "hardwareversion", getHwv()); // abuse (?) the firmware version to store the SyncEvolution version number substTag(xml, "firmwareversion", getSwv()); substTag(xml, "devicetype", getDevType()); substTag(xml, "maxmsgsize", getMaxMsgSize().get()); substTag(xml, "maxobjsize", getMaxObjSize().get()); if (m_serverMode) { UserIdentity id = getSyncUser(); /* * Do not check username/pwd if this local sync or over * bluetooth transport. Need credentials for checking, * and IdentityProviderCredentials() throws an error when * called for a provider which does not support plain * credentials. */ bool withauth = !m_localSync && !boost::starts_with(getUsedSyncURL(), "obex-bt"); if (withauth) { Credentials cred = IdentityProviderCredentials(id, getSyncPassword()); const string &user = cred.m_username; const string &password = cred.m_password; if (user.empty() && password.empty()) { withauth = false; } } if (withauth) { // require authentication with the configured password substTag(xml, "defaultauth", "md5\n" "basic\n" "yes\n", true); } else { if (id.wasSet()) { SE_LOG_WARNING(getConfigName(), "ignoring username %s, it is not needed", id.toString().c_str()); } // no authentication required substTag(xml, "defaultauth", "return TRUE\n" "none\n" "none\n" "yes\n", true); } } else { substTag(xml, "defaultauth", getClientAuthType()); } if (isSync || !getConfigDate().wasSet()) { // If the hash code of the main sync XML config is changed, that // means the content of the config has changed. Save the new hash // and regen the configdate. Also necessary when no config data // has ever been set. hash = Hash(xml.c_str()); if (getHashCode() != hash) { setConfigDate(); setHashCode(hash); flush(); } } substTag(xml, "configdate", getConfigDate().c_str()); } SharedEngine SyncContext::createEngine() { SharedEngine engine(new sysync::TEngineModuleBridge); // This instance of the engine is used outside of the sync session // itself for logging. doSync() then reinitializes it with a full // datastore configuration. engine.Connect(m_serverMode ? #ifdef ENABLE_SYNCML_LINKED // use Synthesis client or server engine that we were linked against "[server:]" : "[]", #else // load engine dynamically "server:libsynthesis.so.0" : "libsynthesis.so.0", #endif 0, sysync::DBG_PLUGIN_NONE| sysync::DBG_PLUGIN_INT| sysync::DBG_PLUGIN_DB| sysync::DBG_PLUGIN_EXOT); SharedKey configvars = engine.OpenKeyByPath(SharedKey(), "/configvars"); string logdir; if (m_sourceListPtr) { logdir = m_sourceListPtr->getLogdir(); } engine.SetStrValue(configvars, "defout_path", logdir.size() ? logdir : "/dev/null"); engine.SetStrValue(configvars, "conferrpath", "console"); engine.SetStrValue(configvars, "binfilepath", getSynthesisDatadir().c_str()); configvars.reset(); return engine; } namespace { void GnutlsLogFunction(int level, const char *str) { SE_LOG_DEBUG("GNUTLS", "level %d: %s", level, str); } } void SyncContext::initServer(const std::string &sessionID, SharedBuffer data, const std::string &messageType) { m_serverMode = true; m_sessionID = sessionID; m_initialMessage = data; m_initialMessageType = messageType; } struct SyncContext::SyncMLMessageInfo SyncContext::analyzeSyncMLMessage(const char *data, size_t len, const std::string &messageType) { SyncContext sync; SourceList sourceList(sync, false); sourceList.setLogLevel(SourceList::LOGGING_SUMMARY); sync.m_sourceListPtr = &sourceList; SwapContext syncSentinel(&sync); sync.initServer("", SharedBuffer(), ""); SwapEngine swapengine(sync); sync.initEngine(false); sysync::TEngineProgressInfo progressInfo; sysync::uInt16 stepCmd = sysync::STEPCMD_GOTDATA; SharedSession session = sync.m_engine.OpenSession(sync.m_sessionID); SessionSentinel sessionSentinel(sync, session); sync.m_engine.WriteSyncMLBuffer(session, data, len); SharedKey sessionKey = sync.m_engine.OpenSessionKey(session); sync.m_engine.SetStrValue(sessionKey, "contenttype", messageType); // analyze main loop: runs until SessionStep() signals reply or error. // Will call our SynthesisDBPlugin callbacks, most importantly // SyncEvolution_Session_CheckDevice(), which records the device ID // for us. do { sync.m_engine.SessionStep(session, stepCmd, &progressInfo); switch (stepCmd) { case sysync::STEPCMD_OK: case sysync::STEPCMD_PROGRESS: stepCmd = sysync::STEPCMD_STEP; break; default: // whatever it is, cannot proceed break; } } while (stepCmd == sysync::STEPCMD_STEP); SyncMLMessageInfo info; info.m_deviceID = sync.getSyncDeviceID(); return info; } void SyncContext::initEngine(bool isSync) { string xml, configname; getConfigXML(isSync, xml, configname); try { m_engine.InitEngineXML(xml.c_str()); } catch (const BadSynthesisResult &ex) { SE_LOG_ERROR(NULL, "internal error, invalid XML configuration (%s):\n%s", m_sourceListPtr && !m_sourceListPtr->empty() ? "with datastores" : "without datastores", xml.c_str()); throw; } if (isSync && getLogLevel() >= 5) { SE_LOG_DEV(NULL, "Full XML configuration:\n%s", xml.c_str()); } } // This is just the declaration. The actual function pointer instance // is inside libsynthesis, which, for historic purposes, doesn't define // it in its header files (yet). extern "C" int (*SySync_ConsolePrintf)(FILE *stream, const char *format, ...); static int nopPrintf(FILE *stream, const char *format, ...) { return 0; } extern "C" { extern int (*SySync_CondTimedWait)(pthread_cond_t *cond, pthread_mutex_t *mutex, bool &aTerminated, long aMilliSecondsToWait); } #ifdef HAVE_GLIB static gboolean timeout(gpointer data) { // Call me again... return true; } static bool CondTimedWaitContinue(pthread_mutex_t *mutex, bool &terminated, long milliSecondsToWait, Timespec &deadline, SuspendFlags &flags, int &result) { // Thread has terminated? pthread_mutex_lock(mutex); if (terminated) { pthread_mutex_unlock(mutex); SE_LOG_DEBUG(NULL, "background thread completed"); return false; } pthread_mutex_unlock(mutex); // Abort? Ignore when waiting for final thread shutdown, because // in that case we just get called again. if (milliSecondsToWait > 0 && flags.isAborted()) { SE_LOG_DEBUG(NULL, "give up waiting for background thread, aborted"); // Signal error. libsynthesis then assumes that the thread still // runs and enters its parallel message sending, which eventually // returns control to us. result = 1; return false; } // Timeout? if (!milliSecondsToWait || (milliSecondsToWait > 0 && deadline <= Timespec::system())) { SE_LOG_DEBUG(NULL, "give up waiting for background thread, timeout"); result = 1; return false; } return true; } static int CondTimedWaitGLib(pthread_cond_t * /* cond */, pthread_mutex_t *mutex, bool &terminated, long milliSecondsToWait) { int result = 0; // return abstime ? pthread_cond_timedwait(cond, mutex, abstime) : pthread_cond_wait(cond, mutex); try { pthread_mutex_unlock(mutex); SE_LOG_DEBUG(NULL, "wait for background thread: %lds", milliSecondsToWait); SuspendFlags &flags = SuspendFlags::getSuspendFlags(); Timespec now = Timespec::system(); Timespec wait(milliSecondsToWait / 1000, milliSecondsToWait % 1000); Timespec deadline = now + wait; // We don't need to react to thread shutdown immediately (only // called once per sync), so a relatively long check interval of // one second is okay. GLibEvent id(g_timeout_add_seconds(1, timeout, NULL), "timeout"); GRunWhile(boost::bind(CondTimedWaitContinue, mutex, boost::ref(terminated), milliSecondsToWait, boost::ref(deadline), boost::ref(flags), boost::ref(result))); } catch (...) { Exception::handle(HANDLE_EXCEPTION_FATAL); } pthread_mutex_lock(mutex); return result; } #endif void SyncContext::initMain(const char *appname) { #if defined(HAVE_GLIB) // this is required when using glib directly or indirectly #if !GLIB_CHECK_VERSION(2,36,0) g_type_init(); #endif #if !GLIB_CHECK_VERSION(2,32,0) g_thread_init(NULL); #endif g_set_prgname(appname); // redirect glib logging into our own logging g_log_set_default_handler(Logger::glogFunc, NULL); // Only the main thread may use the default GMainContext. // Anything else is unsafe, see https://mail.gnome.org/archives/gtk-list/2013-April/msg00040.html // util.cpp:Sleep() checks this and uses the default context // when called by the main thread, otherwise falls back to // select(). GRunWhile() is always safe to use. g_main_context_acquire(NULL); SySync_CondTimedWait = CondTimedWaitGLib; #endif if (atoi(getEnv("SYNCEVOLUTION_DEBUG", "0")) > 3) { SySync_ConsolePrintf = Logger::sysyncPrintf; } else { SySync_ConsolePrintf = nopPrintf; } // invoke optional init parts, for example KDE KApplication init // in KDE backend GetInitMainSignal()(appname); struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; sigaction(SIGPIPE, &sa, NULL); // Initializing a potential use of EDS early is necessary for // libsynthesis when compiled with // --enable-evolution-compatibility: in that mode libical will // only be found by libsynthesis after EDSAbiWrapperInit() // pulls it into the process by loading libecal. EDSAbiWrapperInit(); if (const char *gnutlsdbg = getenv("SYNCEVOLUTION_GNUTLS_DEBUG")) { // Enable libgnutls debugging without creating a hard dependency on it, // because we don't call it directly and might not even be linked against // it. Therefore check for the relevant symbols via dlsym(). void (*set_log_level)(int); typedef void (*LogFunc_t)(int level, const char *str); void (*set_log_function)(LogFunc_t func); set_log_level = (typeof(set_log_level))dlsym(RTLD_DEFAULT, "gnutls_global_set_log_level"); set_log_function = (typeof(set_log_function))dlsym(RTLD_DEFAULT, "gnutls_global_set_log_function"); if (set_log_level && set_log_function) { set_log_level(atoi(gnutlsdbg)); set_log_function(GnutlsLogFunction); } else { SE_LOG_ERROR(NULL, "SYNCEVOLUTION_GNUTLS_DEBUG debugging not possible, log functions not found"); } } } SyncContext::InitMainSignal &SyncContext::GetInitMainSignal() { static InitMainSignal initMainSignal; return initMainSignal; } static bool IsStableRelease = #ifdef SYNCEVOLUTION_STABLE_RELEASE true #else false #endif ; bool SyncContext::isStableRelease() { return IsStableRelease; } void SyncContext::setStableRelease(bool isStableRelease) { IsStableRelease = isStableRelease; } void SyncContext::checkConfig(const std::string &operation) const { std::string peer, context; splitConfigString(m_server, peer, context); if (isConfigNeeded() && (!exists() || peer.empty())) { if (peer.empty()) { SE_LOG_INFO(NULL, "Configuration \"%s\" does not refer to a sync peer.", m_server.c_str()); } else { SE_LOG_INFO(NULL, "Configuration \"%s\" does not exist.", m_server.c_str()); } Exception::throwError(SE_HERE, StringPrintf("Cannot proceed with %s without a configuration.", operation.c_str())); } } SyncMLStatus SyncContext::sync(SyncReport *report) { SyncMLStatus status = STATUS_OK; checkConfig("sync"); if (getenv("SYNCEVOLUTION_EPHEMERAL")) { SE_LOG_INFO(NULL, "turning on ephemeral sync mode as requested by SYNCEVOLUTION_EPHEMERAL variable"); makeEphemeral(); } // redirect logging as soon as possible SourceList sourceList(*this, m_doLogging); sourceList.setLogLevel(m_quiet ? SourceList::LOGGING_QUIET : getPrintChanges() ? SourceList::LOGGING_FULL : SourceList::LOGGING_SUMMARY); // careful about scope, this is needed for writing the // report below SyncReport buffer; SwapContext syncSentinel(this); try { m_sourceListPtr = &sourceList; string url = getUsedSyncURL(); if (boost::starts_with(url, "local://")) { initLocalSync(url.substr(strlen("local://"))); } if (!report) { report = &buffer; } report->clear(); if (m_localSync) { report->setRemoteName(m_localPeerContext); report->setLocalName(getContextName()); } // let derived classes override settings, like the log dir prepare(); // choose log directory sourceList.startSession(getLogDir(), getMaxLogDirs(), getLogLevel(), report); /* Must detect server or client session before creating the * underlying SynthesisEngine * */ if ( getPeerIsClient()) { m_serverMode = true; } else if (m_localSync && !m_agent) { Exception::throwError(SE_HERE, "configuration error, syncURL = local can only be used in combination with peerIsClient = 1"); } // create a Synthesis engine, used purely for logging purposes // at this time SwapEngine swapengine(*this); initEngine(false); try { // dump some summary information at the beginning of the log SE_LOG_DEV(NULL, "SyncML server account: %s", getSyncUser().toString().c_str()); SE_LOG_DEV(NULL, "client: SyncEvolution %s for %s", getSwv().c_str(), getDevType().c_str()); SE_LOG_DEV(NULL, "device ID: %s", getDevID().c_str()); SE_LOG_DEV(NULL, "%s", EDSAbiWrapperDebug()); SE_LOG_DEV(NULL, "%s", SyncSource::backendsDebug().c_str()); // ensure that config can be modified (might have to be migrated first) prepareConfigForWrite(); // instantiate backends, but do not open them yet initSources(sourceList); if (sourceList.empty()) { Exception::throwError(SE_HERE, "no datastores active, check configuration"); } // request all config properties once: throwing exceptions // now is okay, whereas later it would lead to leaks in the // not exception safe client library SyncConfig dummy; set activeSources = sourceList.getSources(); dummy.copy(*this, &activeSources); // start background thread if not running yet: // necessary to catch problems with Evolution backend startLoopThread(); // ask for passwords now PasswordConfigProperty::checkPasswords(getUserInterfaceNonNull(), *this, PasswordConfigProperty::CHECK_PASSWORD_ALL, sourceList.getSourceNames()); // open each source - failing now is still safe // in clients; in servers we wait until the source // is really needed BOOST_FOREACH(SyncSource *source, sourceList) { if (m_serverMode) { source->enableServerMode(); } else { source->open(); } // request callback when starting to use source source->getOperations().m_startDataRead.getPreSignal().connect(boost::bind(&SyncContext::startSourceAccess, this, source)); } // ready to go status = doSync(); } catch (...) { // handle the exception here while the engine (and logging!) is still alive Exception::handle(&status); goto report; } } catch (...) { Exception::handle(&status); } report: if (status == SyncMLStatus(sysync::LOCERR_DATASTORE_ABORT)) { // this can mean only one thing in SyncEvolution: unexpected slow sync status = STATUS_UNEXPECTED_SLOW_SYNC; } try { // Print final report before cleaning up. // Status was okay only if all sources succeeded. // When a source or the overall sync was successful, // but some items failed, we report a "partial failure" // status. BOOST_FOREACH(SyncSource *source, sourceList) { m_sourceSyncedSignal(source->getName(), *source); if (source->getStatus() == STATUS_OK && (source->getItemStat(SyncSource::ITEM_LOCAL, SyncSource::ITEM_ANY, SyncSource::ITEM_REJECT) || source->getItemStat(SyncSource::ITEM_REMOTE, SyncSource::ITEM_ANY, SyncSource::ITEM_REJECT))) { source->recordStatus(STATUS_PARTIAL_FAILURE); } if (source->getStatus() != STATUS_OK && status == STATUS_OK) { status = source->getStatus(); break; } } // Also take into account result of client side in local sync, // if any existed. A non-success status code in the client's report // was already propagated to the parent via a TransportStatusException // in LocalTransportAgent::checkChildReport(). What we can do here // is updating the individual's sources status. if (m_localSync && m_agent && getPeerIsClient()) { boost::shared_ptr agent = boost::static_pointer_cast(m_agent); SyncReport childReport; agent->getClientSyncReport(childReport); BOOST_FOREACH(SyncSource *source, sourceList) { const SyncSourceReport *childSourceReport = childReport.findSyncSourceReport(source->getURINonEmpty()); if (childSourceReport) { SyncMLStatus parentSourceStatus = source->getStatus(); SyncMLStatus childSourceStatus = childSourceReport->getStatus(); // child source had an error *and* // parent error is either unspecific (USERABORT) or // is a remote error (HTTP error range) if (childSourceStatus != STATUS_OK && childSourceStatus != STATUS_HTTP_OK && (parentSourceStatus == SyncMLStatus(sysync::LOCERR_USERABORT) || parentSourceStatus < SyncMLStatus(sysync::LOCAL_STATUS_CODE))) { source->recordStatus(childSourceStatus); } } } } sourceList.updateSyncReport(*report); sourceList.syncDone(status, report); } catch(...) { Exception::handle(&status); } m_agent.reset(); m_sourceListPtr = NULL; return status; } bool SyncContext::sendSAN(uint16_t version) { sysync::SanPackage san; bool legacy = version < 12; /* Should be nonce sent by the server in the preceeding sync session */ string nonce = "SyncEvolution"; UserIdentity id = getSyncUser(); Credentials cred = IdentityProviderCredentials(id, getSyncPassword()); const std::string &user = cred.m_username; const std::string &password = cred.m_password; string uauthb64 = san.B64_H(user, password); /* Client is expected to conduct the sync in the backgroud */ sysync::UI_Mode mode = sysync::UI_not_specified; uint16_t sessionId = 1; string serverId = getRemoteIdentifier(); if(serverId.empty()) { serverId = getDevID(); } SE_LOG_DEBUG(NULL, "starting SAN %u auth %s nonce %s session %u server %s", version, uauthb64.c_str(), nonce.c_str(), sessionId, serverId.c_str()); san.PreparePackage( uauthb64, nonce, version, mode, sysync::Initiator_Server, sessionId, serverId); san.CreateEmptyNotificationBody(); bool hasSource = false; std::set dataSources = m_sourceListPtr->getSources(); /* For each virtual datasoruce, generate the SAN accoring to it and ignoring * sub datasource in the later phase*/ BOOST_FOREACH (boost::shared_ptr vSource, m_sourceListPtr->getVirtualSources()) { std::string evoSyncSource = vSource->getDatabaseID(); std::string sync = vSource->getSync(); SANSyncMode mode = AlertSyncMode(StringToSyncMode(sync, true), getPeerIsClient()); std::vector mappedSources = unescapeJoinedString (evoSyncSource, ','); BOOST_FOREACH (std::string source, mappedSources) { dataSources.erase (source); if (mode == SA_SLOW) { // We force a source which the client is not expected to use into slow mode. // Shouldn't we rather reject attempts to synchronize it? (*m_sourceListPtr)[source]->setForceSlowSync(true); } } dataSources.insert (vSource->getName()); } SANSyncMode syncMode = SA_INVALID; vector > alertedSources; /* For each source to be notified do the following: */ BOOST_FOREACH (string name, dataSources) { boost::shared_ptr sc(getSyncSourceConfig(name)); string sync = sc->getSync(); SANSyncMode mode = AlertSyncMode(StringToSyncMode(sync, true), getPeerIsClient()); if (mode == SA_SLOW) { (*m_sourceListPtr)[name]->setForceSlowSync(true); mode = SA_TWO_WAY; } if (mode < SA_FIRST || mode > SA_LAST) { SE_LOG_DEV(NULL, "Ignoring datastore %s with an invalid sync mode", name.c_str()); continue; } syncMode = mode; hasSource = true; string uri = sc->getURINonEmpty(); SourceType sourceType = sc->getSourceType(); /*If the type is not set by user explictly, let's use backend default * value*/ if(sourceType.m_format.empty()) { sourceType.m_format = (*m_sourceListPtr)[name]->getPeerMimeType(); } if (!legacy) { /*If user did not use force type, we will always use the older type as * this is what most phones support*/ int contentTypeB = StringToContentType (sourceType.m_format, sourceType.m_forceFormat); if (contentTypeB == WSPCTC_UNKNOWN) { contentTypeB = 0; SE_LOG_DEBUG(NULL, "Unknown datasource mimetype, use 0 as default"); } SE_LOG_DEBUG(NULL, "SAN datastore %s uri %s type %u mode %d", name.c_str(), uri.c_str(), contentTypeB, mode); if ( san.AddSync(mode, (uInt32) contentTypeB, uri.c_str())) { SE_LOG_ERROR(NULL, "SAN: adding server alerted sync element failed"); }; } else { string mimetype = GetLegacyMIMEType(sourceType.m_format, sourceType.m_forceFormat); SE_LOG_DEBUG(NULL, "SAN datastore %s uri %s type %s", name.c_str(), uri.c_str(), mimetype.c_str()); alertedSources.push_back(std::make_pair(mimetype, uri)); } } if (!hasSource) { SE_THROW ("No datastore enabled for server alerted sync!"); } /* Generate the SAN Package */ void *buffer; size_t sanSize; if (!legacy) { if (san.GetPackage(buffer, sanSize)){ SE_LOG_ERROR(NULL, "SAN package generating failed"); return false; } //TODO log the binary SAN content } else { SE_LOG_DEBUG(NULL, "SAN with overall sync mode %d", syncMode); if (san.GetPackageLegacy(buffer, sanSize, alertedSources, syncMode, getWBXML())){ SE_LOG_ERROR(NULL, "SAN package generating failed"); return false; } //SE_LOG_DEBUG(NULL, "SAN package content: %s", (char*)buffer); } m_agent = createTransportAgent(); SE_LOG_INFO(NULL, "Server sending SAN"); m_serverAlerted = true; m_agent->setContentType(!legacy ? TransportAgent::m_contentTypeServerAlertedNotificationDS : (getWBXML() ? TransportAgent::m_contentTypeSyncWBXML : TransportAgent::m_contentTypeSyncML)); m_agent->send(reinterpret_cast (buffer), sanSize); //change content type m_agent->setContentType(getWBXML() ? TransportAgent::m_contentTypeSyncWBXML : TransportAgent::m_contentTypeSyncML); TransportAgent::Status status; do { status = m_agent->wait(); } while(status == TransportAgent::ACTIVE); if (status == TransportAgent::GOT_REPLY) { const char *reply; size_t replyLen; string contentType; m_agent->getReply (reply, replyLen, contentType); //sanity check for the reply if (contentType.empty() || contentType.find(TransportAgent::m_contentTypeSyncML) != contentType.npos || contentType.find(TransportAgent::m_contentTypeSyncWBXML) != contentType.npos) { SharedBuffer request (reply, replyLen); //TODO should generate more reasonable sessionId here string sessionId =""; initServer (sessionId, request, contentType); return true; } } return false; } static string Step2String(sysync::uInt16 stepcmd) { switch (stepcmd) { case sysync::STEPCMD_CLIENTSTART: return "STEPCMD_CLIENTSTART"; case sysync::STEPCMD_CLIENTAUTOSTART: return "STEPCMD_CLIENTAUTOSTART"; case sysync::STEPCMD_STEP: return "STEPCMD_STEP"; case sysync::STEPCMD_GOTDATA: return "STEPCMD_GOTDATA"; case sysync::STEPCMD_SENTDATA: return "STEPCMD_SENTDATA"; case sysync::STEPCMD_SUSPEND: return "STEPCMD_SUSPEND"; case sysync::STEPCMD_ABORT: return "STEPCMD_ABORT"; case sysync::STEPCMD_TRANSPFAIL: return "STEPCMD_TRANSPFAIL"; case sysync::STEPCMD_TIMEOUT: return "STEPCMD_TIMEOUT"; case sysync::STEPCMD_SAN_CHECK: return "STEPCMD_SAN_CHECK"; case sysync::STEPCMD_AUTOSYNC_CHECK: return "STEPCMD_AUTOSYNC_CHECK"; case sysync::STEPCMD_OK: return "STEPCMD_OK"; case sysync::STEPCMD_PROGRESS: return "STEPCMD_PROGRESS"; case sysync::STEPCMD_ERROR: return "STEPCMD_ERROR"; case sysync::STEPCMD_SENDDATA: return "STEPCMD_SENDDATA"; case sysync::STEPCMD_NEEDDATA: return "STEPCMD_NEEDDATA"; case sysync::STEPCMD_RESENDDATA: return "STEPCMD_RESENDDATA"; case sysync::STEPCMD_DONE: return "STEPCMD_DONE"; case sysync::STEPCMD_RESTART: return "STEPCMD_RESTART"; case sysync::STEPCMD_NEEDSYNC: return "STEPCMD_NEEDSYNC"; default: return StringPrintf("STEPCMD %d", stepcmd); } } const char *SyncContext::SyncFreezeName(SyncFreeze syncFreeze) { switch (syncFreeze) { case SYNC_FREEZE_NONE: return "none"; case SYNC_FREEZE_RUNNING: return "running"; case SYNC_FREEZE_FROZEN: return "frozen"; } return "???"; } bool SyncContext::setFreeze(bool freeze) { SyncFreeze newSyncFreeze = freeze ? SYNC_FREEZE_FROZEN : SYNC_FREEZE_RUNNING; if (m_syncFreeze == SYNC_FREEZE_NONE || newSyncFreeze == m_syncFreeze) { SE_LOG_DEBUG(NULL, "SyncContext::setFreeze(%s): not changing freeze state: %s", freeze ? "freeze" : "thaw", SyncFreezeName(m_syncFreeze)); return false; } else { SE_LOG_DEBUG(NULL, "SyncContext::setFreeze(%s): changing freeze state: %s -> %s", freeze ? "freeze" : "thaw", SyncFreezeName(m_syncFreeze), SyncFreezeName(newSyncFreeze)); if (m_agent) { SE_LOG_DEBUG(NULL, "SyncContext::setFreeze(): transport agent"); m_agent->setFreeze(freeze); } if (m_sourceListPtr) { BOOST_FOREACH (SyncSource *source, *m_sourceListPtr) { SE_LOG_DEBUG(NULL, "SyncContext::setFreeze(): datastore %s", source->getDisplayName().c_str()); source->setFreeze(freeze); } } m_syncFreeze = newSyncFreeze; return true; } } SyncMLStatus SyncContext::preSaveAdminData(SyncSource &source) { if (!source.getTotalNumItemsReceived() && !source.getTotalNumItemsSent() && source.getFinalSyncMode() == SYNC_TWO_WAY && !source.isFirstSync()) { SE_LOG_DEBUG(NULL, "requesting end of two-way sync with one source early because nothing changed"); m_quitSync = true; return STATUS_SYNC_END_SHORTCUT; } else { return STATUS_OK; } } SharedSession *keepSession; SyncMLStatus SyncContext::doSync() { boost::shared_ptr signalGuard; // install signal handlers unless this was explicitly disabled bool catchSignals = getenv("SYNCEVOLUTION_NO_SYNC_SIGNALS") == NULL; if (catchSignals) { SE_LOG_DEBUG(NULL, "sync is starting, catch signals"); signalGuard = SuspendFlags::getSuspendFlags().activate(); } // From now on it is possible to freeze the sync. m_syncFreeze = SYNC_FREEZE_RUNNING; // delay the sync for debugging purposes SE_LOG_DEBUG(NULL, "ready to sync"); const char *delay = getenv("SYNCEVOLUTION_SYNC_DELAY"); if (delay) { Sleep(atoi(delay)); } SuspendFlags &flags = SuspendFlags::getSuspendFlags(); if (!flags.isNormal()) { return (SyncMLStatus)sysync::LOCERR_USERABORT; } SyncMLStatus status = STATUS_OK; std::string s; if (m_serverMode && !m_initialMessage.size() && !m_localSync) { //This is a server alerted sync ! string sanFormat (getSyncMLVersion()); uint16_t version = 12; if (boost::iequals (sanFormat, "1.2") || sanFormat == "") { version = 12; } else if (boost::iequals (sanFormat, "1.1")) { version = 11; } else { version = 10; } bool status = true; try { status = sendSAN (version); } catch (TransportException e) { if (!sanFormat.empty()){ throw; } status = false; //by pass the exception if we will try again with legacy SANFormat } if (!flags.isNormal()) { return (SyncMLStatus)sysync::LOCERR_USERABORT; } if (! status) { if (sanFormat.empty()) { SE_LOG_DEBUG(NULL, "Server Alerted Sync init with SANFormat %d failed, trying with legacy format", version); version = 11; if (!sendSAN (version)) { // return a proper error code Exception::throwError(SE_HERE, "Server Alerted Sync init failed"); } } else { // return a proper error code Exception::throwError(SE_HERE, "Server Alerted Sync init failed"); } } } if (!flags.isNormal()) { return (SyncMLStatus)sysync::LOCERR_USERABORT; } // re-init engine with all sources configured string xml, configname; initEngine(true); SharedKey targets; SharedKey target; if (m_serverMode) { // Server engine has no profiles. All settings have be done // via the XML configuration or function parameters (session ID // in OpenSession()). } else { // check the settings status (MUST BE DONE TO MAKE SETTINGS READY) SharedKey profiles = m_engine.OpenKeyByPath(SharedKey(), "/profiles"); m_engine.GetStrValue(profiles, "settingsstatus"); // allow creating new settings when existing settings are not up/downgradeable m_engine.SetStrValue(profiles, "overwrite", "1"); // check status again m_engine.GetStrValue(profiles, "settingsstatus"); // open first profile SharedKey profile; profile = m_engine.OpenSubkey(profiles, sysync::KEYVAL_ID_FIRST, true); if (!profile) { // no profile exists yet, create default profile profile = m_engine.OpenSubkey(profiles, sysync::KEYVAL_ID_NEW_DEFAULT); } if (!m_localSync) { // Not needed for local sync and might even be // impossible/wrong because username could refer to an // identity provider which cannot return a plain string. SE_LOG_DEBUG(NULL, "copying syncURL, username, password to Synthesis engine"); m_engine.SetStrValue(profile, "serverURI", getUsedSyncURL()); UserIdentity syncUser = getSyncUser(); InitStateString syncPassword = getSyncPassword(); boost::shared_ptr provider = AuthProvider::create(syncUser, syncPassword); Credentials cred = provider->getCredentials(); const std::string &user = cred.m_username; const std::string &password = cred.m_password; m_engine.SetStrValue(profile, "serverUser", user); m_engine.SetStrValue(profile, "serverPassword", password); } m_engine.SetInt32Value(profile, "encoding", getWBXML() ? 1 /* WBXML */ : 2 /* XML */); // Iterate over all data stores in the XML config // and match them with sync sources. // TODO: let sync sources provide their own // XML snippets (inside and inside ). targets = m_engine.OpenKeyByPath(profile, "targets"); for(target = m_engine.OpenSubkey(targets, sysync::KEYVAL_ID_FIRST, true); target; target = m_engine.OpenSubkey(targets, sysync::KEYVAL_ID_NEXT, true)) { s = m_engine.GetStrValue(target, "dbname"); SyncSource *source = findSource(s); if (source) { m_engine.SetInt32Value(target, "enabled", 1); int slow = 0; int direction = 0; string sync = source->getSync(); // this code only runs when we are the client, // take that into account for the "from-local/remote" modes SimpleSyncMode mode = SimplifySyncMode(StringToSyncMode(sync), false); if (mode == SIMPLE_SYNC_SLOW) { slow = 1; direction = 0; } else if (mode == SIMPLE_SYNC_TWO_WAY) { slow = 0; direction = 0; } else if (mode == SIMPLE_SYNC_REFRESH_FROM_REMOTE) { slow = 1; direction = 1; } else if (mode == SIMPLE_SYNC_REFRESH_FROM_LOCAL) { slow = 1; direction = 2; } else if (mode == SIMPLE_SYNC_ONE_WAY_FROM_REMOTE) { slow = 0; direction = 1; } else if (mode == SIMPLE_SYNC_ONE_WAY_FROM_LOCAL) { slow = 0; direction = 2; } else { source->throwError(SE_HERE, string("invalid sync mode: ") + sync); } m_engine.SetInt32Value(target, "forceslow", slow); m_engine.SetInt32Value(target, "syncmode", direction); string uri = source->getURINonEmpty(); m_engine.SetStrValue(target, "remotepath", uri); } else { m_engine.SetInt32Value(target, "enabled", 0); } } // Close all keys so that engine can flush the modified config. // Otherwise the session reads the unmodified values from the // created files while the updated values are still in memory. target.reset(); targets.reset(); profile.reset(); profiles.reset(); // reopen profile keys profiles = m_engine.OpenKeyByPath(SharedKey(), "/profiles"); m_engine.GetStrValue(profiles, "settingsstatus"); profile = m_engine.OpenSubkey(profiles, sysync::KEYVAL_ID_FIRST); targets = m_engine.OpenKeyByPath(profile, "targets"); } m_retries = 0; //Create the transport agent if not already created if(!m_agent) { m_agent = createTransportAgent(); } // server in local sync initiates sync by passing data to forked process if (m_serverMode && m_localSync) { m_serverAlerted = true; } sysync::TEngineProgressInfo progressInfo; sysync::uInt16 stepCmd = (m_localSync && m_serverMode) ? sysync::STEPCMD_NEEDDATA : m_serverMode ? sysync::STEPCMD_GOTDATA : sysync::STEPCMD_CLIENTSTART; SharedSession session = m_engine.OpenSession(m_sessionID); SharedBuffer sendBuffer; std::auto_ptr sessionSentinel(new SessionSentinel(*this, session)); if (m_serverMode && !m_localSync) { m_engine.WriteSyncMLBuffer(session, m_initialMessage.get(), m_initialMessage.size()); SharedKey sessionKey = m_engine.OpenSessionKey(session); m_engine.SetStrValue(sessionKey, "contenttype", m_initialMessageType); m_initialMessage.reset(); // TODO: set "sendrespuri" session key to control // whether the generated messages contain a respURI // (not needed for OBEX) } // Special case local sync when nothing changed: we can be sure // that we can do another sync from exactly the same state (nonce, // source change tracking meta data, etc.) and be successful // again. In such a case we can avoid unnecessary updates of the // .ini and .bfi files. // // To detect this, the server side hooks into the SaveAdminData // operation and replaces it with just returning an "aborted by // user" error. if (m_serverMode && m_localSync && m_sourceListPtr->size() == 1) { SyncSource *source = *(*m_sourceListPtr).begin(); source->getOperations().m_saveAdminData.getPreSignal().connect(boost::bind(&SyncContext::preSaveAdminData, this, _1)); } // Sync main loop: runs until SessionStep() signals end or error. // Exceptions are caught and lead to a call of SessionStep() with // parameter STEPCMD_ABORT -> abort session as soon as possible. bool aborting = false; int suspending = 0; Timespec sendStart, resendStart; int requestNum = 0; sysync::uInt16 previousStepCmd = stepCmd; std::vector numItemsReceived; // source->getTotalNumItemsReceived() for each source, see STEPCMD_SENDDATA m_quitSync = false; do { try { if (m_quitSync && !m_serverMode) { SE_LOG_DEBUG(NULL, "ending sync early as requested"); // Intentionally prevent destructing the Synthesis // engine and session destruction by keeping a // reference to it around forever, because destroying // the session would cause undesired disk writes. keepSession = new SharedSession(session); break; } // check for suspend, if so, modify step command for next step // Since the suspend will actually be committed until it is // sending out a message, we can safely delay the suspend to // GOTDATA state. // After exception occurs, stepCmd will be set to abort to force // aborting, must avoid to change it back to suspend cmd. if (flags.isSuspended() && stepCmd == sysync::STEPCMD_GOTDATA) { SE_LOG_DEBUG(NULL, "suspending before SessionStep() in STEPCMD_GOTDATA as requested by user"); stepCmd = sysync::STEPCMD_SUSPEND; } // Aborting is useful while waiting for a reply and before // sending a message (which will just lead to us waiting // for the reply, but possibly after doing some slow network // IO for setting up the message send). // // While processing a message we let the engine run, because // that is a) likely to be done soon and b) may reduce the // breakage caused by aborting a running sync. // // This check here covers the "waiting for reply" case. if ((stepCmd == sysync::STEPCMD_RESENDDATA || stepCmd == sysync::STEPCMD_SENTDATA || stepCmd == sysync::STEPCMD_NEEDDATA) && flags.isAborted()) { SE_LOG_DEBUG(NULL, "aborting before SessionStep() in %s as requested by script", Step2String(stepCmd).c_str()); stepCmd = sysync::STEPCMD_ABORT; } // take next step, but don't abort twice: instead // let engine contine with its shutdown if (stepCmd == sysync::STEPCMD_ABORT) { if (aborting) { SE_LOG_DEBUG(NULL, "engine already notified of abort request, reverting to %s", Step2String(previousStepCmd).c_str()); stepCmd = previousStepCmd; } else { aborting = true; } } // same for suspending if (stepCmd == sysync::STEPCMD_SUSPEND) { if (suspending) { SE_LOG_DEBUG(NULL, "engine already notified of suspend request, reverting to %s", Step2String(previousStepCmd).c_str()); stepCmd = previousStepCmd; suspending++; } else { suspending++; } } // Need to wait for setFrozen(false) or suspend/abort request. // Such a call can come in via a D-Bus interface that we keep // active by servicing the event loop inside GRunWhile(). // // We freeze without notifying our peer. It will freeze itself // eventually because we stop exchanging SyncML messages. if (!aborting && !suspending && m_syncFreeze == SYNC_FREEZE_FROZEN) { SE_LOG_DEBUG(NULL, "freezing sync"); GRunWhile(boost::lambda::var(m_syncFreeze) == SYNC_FREEZE_FROZEN && boost::lambda::bind(&SuspendFlags::isNormal, &flags)); } if (stepCmd == sysync::STEPCMD_NEEDDATA) { // Engine already notified. Don't call it twice // with this state, because it doesn't know how // to handle this. Skip the SessionStep() call // and wait for response. } else { if (getLogLevel() > 4) { SE_LOG_DEBUG(NULL, "before SessionStep: %s", Step2String(stepCmd).c_str()); } m_engine.SessionStep(session, stepCmd, &progressInfo); if (getLogLevel() > 4) { SE_LOG_DEBUG(NULL, "after SessionStep: %s", Step2String(stepCmd).c_str()); } reportStepCmd(stepCmd); } if (stepCmd == sysync::STEPCMD_SENDDATA && checkForScriptAbort(session)) { SE_LOG_DEBUG(NULL, "aborting after SessionStep() in STEPCMD_SENDDATA as requested by script"); // Catch outgoing message and abort if requested by script. // Report which sources are affected, based on their status code. set sources; BOOST_FOREACH(SyncSource *source, *m_sourceListPtr) { if (source->getStatus() == STATUS_UNEXPECTED_SLOW_SYNC) { string name = source->getVirtualSource(); if (name.empty()) { name = source->getName(); } sources.insert(name); } } string explanation = SyncReport::slowSyncExplanation(m_server, sources); if (!explanation.empty()) { string sourceparam = boost::join(sources, " "); SE_LOG_ERROR(NULL, "Aborting because of unexpected slow sync for datastore(s): %s", sourceparam.c_str()); SE_LOG_INFO(NULL, "%s", explanation.c_str()); } else { // we should not get here, but if we do, at least log something SE_LOG_ERROR(NULL, "aborting as requested by script"); } stepCmd = sysync::STEPCMD_ABORT; continue; } else if (stepCmd == sysync::STEPCMD_SENDDATA && flags.isAborted()) { // Catch outgoing message and abort if requested by user. SE_LOG_DEBUG(NULL, "aborting after SessionStep() in STEPCMD_SENDDATA as requested by user"); stepCmd = sysync::STEPCMD_ABORT; continue; } else if (suspending == 1) { //During suspention we actually insert a STEPCMD_SUSPEND cmd //Should restore to the original step here stepCmd = previousStepCmd; continue; } switch (stepCmd) { case sysync::STEPCMD_OK: // no progress info, call step again stepCmd = sysync::STEPCMD_STEP; break; case sysync::STEPCMD_PROGRESS: // new progress info to show // Check special case of interactive display alert if (progressInfo.eventtype == sysync::PEV_DISPLAY100) { // alert 100 received from remote, message text is in // SessionKey's "displayalert" field SharedKey sessionKey = m_engine.OpenSessionKey(session); // get message from server to display s = m_engine.GetStrValue(sessionKey, "displayalert"); displayServerMessage(s); } else { switch (progressInfo.targetID) { case sysync::KEYVAL_ID_UNKNOWN: case 0 /* used with PEV_SESSIONSTART?! */: displaySyncProgress(sysync::TProgressEventEnum(progressInfo.eventtype), progressInfo.extra1, progressInfo.extra2, progressInfo.extra3); if (progressInfo.eventtype == sysync::PEV_SESSIONEND && !status) { // remember sync result status = SyncMLStatus(progressInfo.extra1); } break; default: { // specific for a certain sync source: // find it... SyncSource *source = m_sourceListPtr->lookupBySynthesisID(progressInfo.targetID); if (source) { displaySourceProgress(*source, SyncSourceEvent(sysync::TProgressEventEnum(progressInfo.eventtype), progressInfo.extra1, progressInfo.extra2, progressInfo.extra3), false); } else { Exception::throwError(SE_HERE, std::string("unknown target ") + s); } target.reset(); break; } } } stepCmd = sysync::STEPCMD_STEP; break; case sysync::STEPCMD_ERROR: // error, terminate (should not happen, as status is // already checked above) break; case sysync::STEPCMD_RESTART: // make sure connection is closed and will be re-opened for next request // tbd: close communication channel if still open to make sure it is // re-opened for the next request stepCmd = sysync::STEPCMD_STEP; m_retries = 0; break; case sysync::STEPCMD_SENDDATA: { // We'll be busy for a while with network IO, so give // sources a chance to do some work in parallel and // flush pending progress notifications. if (m_sourceListPtr) { bool needResults = true; if (numItemsReceived.size() < m_sourceListPtr->size()) { numItemsReceived.insert(numItemsReceived.end(), m_sourceListPtr->size() - numItemsReceived.size(), 0); } for (size_t i = 0; i < numItemsReceived.size(); i++) { SyncSource *source = (*m_sourceListPtr->getSourceSet())[i]; int received = source->getTotalNumItemsReceived(); SE_LOG_DEBUG(source->getDisplayName(), "total number of items received %d", received); if (numItemsReceived[i] != received) { numItemsReceived[i] = received; needResults = false; } } BOOST_FOREACH (SyncSource *source, *m_sourceListPtr) { source->flushItemChanges(); if (needResults) { source->finishItemChanges(); } displaySourceProgress(*source, SyncSourceEvent(), false); } } // send data to remote SharedKey sessionKey = m_engine.OpenSessionKey(session); if (m_serverMode) { m_agent->setURL(""); } else { // use OpenSessionKey() and GetValue() to retrieve "connectURI" // and "contenttype" to be used to send data to the server s = m_engine.GetStrValue(sessionKey, "connectURI"); m_agent->setURL(s); } s = m_engine.GetStrValue(sessionKey, "contenttype"); m_agent->setContentType(s); sessionKey.reset(); sendStart = resendStart = Timespec::monotonic(); requestNum ++; // use GetSyncMLBuffer()/RetSyncMLBuffer() to access the data to be // sent or have it copied into caller's buffer using // ReadSyncMLBuffer(), then send it to the server sendBuffer = m_engine.GetSyncMLBuffer(session, true); if (m_serverMode && m_quitSync) { // When aborting prematurely, skip the server's // last reply message and instead tell the client // to quit. m_agent->setContentType("quitsync"); m_agent->send(NULL, 0); } else { m_agent->send(sendBuffer.get(), sendBuffer.size()); } stepCmd = sysync::STEPCMD_SENTDATA; // we have sent the data break; } case sysync::STEPCMD_RESENDDATA: { SE_LOG_INFO(NULL, "resend previous message, retry #%d", m_retries); resendStart = Timespec::monotonic(); /* We are resending previous message, just read from the * previous buffer */ m_agent->send(sendBuffer.get(), sendBuffer.size()); stepCmd = sysync::STEPCMD_SENTDATA; // we have sent the data break; } case sysync::STEPCMD_NEEDDATA: if (!sendStart) { // no message sent yet, record start of wait for data sendStart = Timespec::monotonic(); } switch (m_agent->wait()) { case TransportAgent::ACTIVE: // Still sending the data?! Don't change anything, // skip SessionStep() above. break; case TransportAgent::TIME_OUT: { double duration = (Timespec::monotonic() - sendStart).duration(); // HTTP SyncML servers cannot resend a HTTP POST // reply. Other server transports could in theory // resend, but don't have the necessary D-Bus APIs // (MB #6370). // Same if() as below for FAILED. if (m_serverMode || !m_retryInterval || duration + 0.9 >= m_retryDuration || requestNum == 1) { SE_LOG_INFO(NULL, "Transport giving up after %d retries and %ld:%02ldmin", m_retries, (long)duration / 60, (long)duration % 60); SE_THROW_EXCEPTION(TransportException, "timeout, retry period exceeded"); }else { // Timeout must have been due to retryInterval having passed, resend // immediately. m_retries ++; stepCmd = sysync::STEPCMD_RESENDDATA; } break; } case TransportAgent::GOT_REPLY: { const char *reply; size_t replylen; string contentType; m_agent->getReply(reply, replylen, contentType); // sanity check for reply: if known at all, it must be either XML or WBXML if (contentType.empty() || contentType.find("application/vnd.syncml+wbxml") != contentType.npos || contentType.find("application/vnd.syncml+xml") != contentType.npos) { // put answer received earlier into SyncML engine's buffer m_retries = 0; sendBuffer.reset(); m_engine.WriteSyncMLBuffer(session, reply, replylen); if (m_serverMode) { SharedKey sessionKey = m_engine.OpenSessionKey(session); m_engine.SetStrValue(sessionKey, "contenttype", contentType); } stepCmd = sysync::STEPCMD_GOTDATA; // we have received response data break; } else if (contentType == "quitsync") { SE_LOG_DEBUG(NULL, "server is asking us to quit the sync session"); // Fake "done" events for each active source. BOOST_FOREACH(SyncSource *source, *m_sourceListPtr) { if (source->getFinalSyncMode() != SYNC_NONE) { displaySourceProgress(*source, SyncSourceEvent(sysync::PEV_SYNCEND, 0, 0, 0), true); } } m_quitSync = true; break; } else { SE_LOG_DEBUG(NULL, "unexpected content type '%s' in reply, %d bytes:\n%.*s", contentType.c_str(), (int)replylen, (int)replylen, reply); SE_LOG_ERROR(NULL, "unexpected reply from peer; might be a temporary problem, try again later"); } //fall through to network failure case } /* If this is a network error, it usually failed quickly, retry * immediately has likely no effect. Manually sleep here to wait a while * before retry. Sleep time will be calculated so that the * message sending interval equals m_retryInterval. */ case TransportAgent::FAILED: { // Send might have failed because of abort or // suspend request. if (flags.isSuspended()) { SE_LOG_DEBUG(NULL, "suspending after TransportAgent::FAILED as requested by user"); stepCmd = sysync::STEPCMD_SUSPEND; break; } else if (flags.isAborted()) { SE_LOG_DEBUG(NULL, "aborting after TransportAgent::FAILED as requested by user"); stepCmd = sysync::STEPCMD_ABORT; break; } Timespec curTime = Timespec::monotonic(); double duration = (curTime - sendStart).duration(); double resendDelay = m_retryInterval - (curTime - resendStart).duration(); if (resendDelay < 0) { resendDelay = 0; } // Similar if() as above for TIME_OUT. In addition, we must check that // the next resend won't happen after the retryDuration, because then // we might as well give up now immediately. Include some fuzz factor // in case we woke up slightly too early. if (m_serverMode || !m_retryInterval || duration + resendDelay + 0.9 >= m_retryDuration || requestNum == 1) { SE_LOG_INFO(NULL, "Transport giving up after %d retries and %ld:%02ldmin", m_retries, (long)duration / 60, (long)duration % 60); SE_THROW_EXCEPTION(TransportException, "transport failed, retry period exceeded"); } else { // Resend after having ensured that the retryInterval is over. if (resendDelay > 0) { if (Sleep(resendDelay) > 0) { if (flags.isSuspended()) { SE_LOG_DEBUG(NULL, "suspending after premature exit from sleep() caused by user suspend"); stepCmd = sysync::STEPCMD_SUSPEND; } else { SE_LOG_DEBUG(NULL, "aborting after premature exit from sleep() caused by user abort"); stepCmd = sysync::STEPCMD_ABORT; } break; } } m_retries ++; stepCmd = sysync::STEPCMD_RESENDDATA; } break; } case TransportAgent::CANCELED: // Send might have failed because of abort or // suspend request. if (flags.isSuspended()) { SE_LOG_DEBUG(NULL, "suspending after TransportAgent::CANCELED as requested by user"); stepCmd = sysync::STEPCMD_SUSPEND; break; } else if (flags.isAborted()) { SE_LOG_DEBUG(NULL, "aborting after TransportAgent::CANCELED as requested by user"); stepCmd = sysync::STEPCMD_ABORT; break; } // not sure exactly why it is canceled SE_THROW_EXCEPTION_STATUS(BadSynthesisResult, "transport canceled", sysync::LOCERR_USERABORT); break; default: stepCmd = sysync::STEPCMD_TRANSPFAIL; // communication with server failed break; } } // Don't tell engine to abort when it already did. if (aborting && stepCmd == sysync::STEPCMD_ABORT) { stepCmd = sysync::STEPCMD_DONE; } previousStepCmd = stepCmd; // loop until session done or aborted with error } catch (const BadSynthesisResult &result) { if (result.result() == sysync::LOCERR_USERABORT && aborting) { SE_LOG_INFO(NULL, "Aborted as requested."); stepCmd = sysync::STEPCMD_DONE; } else if (result.result() == sysync::LOCERR_USERSUSPEND && suspending) { SE_LOG_INFO(NULL, "Suspended as requested."); stepCmd = sysync::STEPCMD_DONE; } else if (aborting) { // aborting very early can lead to results different from LOCERR_USERABORT // => don't treat this as error SE_LOG_INFO(NULL, "Aborted with unexpected result (%d)", static_cast(result.result())); stepCmd = sysync::STEPCMD_DONE; } else { Exception::handle(&status); SE_LOG_DEBUG(NULL, "aborting after catching fatal error"); // Don't tell engine to abort when it already did. stepCmd = aborting ? sysync::STEPCMD_DONE : sysync::STEPCMD_ABORT; } } catch (...) { Exception::handle(&status); SE_LOG_DEBUG(NULL, "aborting after catching fatal error"); // Don't tell engine to abort when it already did. stepCmd = aborting ? sysync::STEPCMD_DONE : sysync::STEPCMD_ABORT; } } while (stepCmd != sysync::STEPCMD_DONE && stepCmd != sysync::STEPCMD_ERROR); // If we get here without error, then close down connection normally. // Otherwise destruct the agent without further communication. if (!status && !flags.isAborted()) { try { m_agent->shutdown(); // TODO: implement timeout for peers which fail to respond while (!flags.isAborted() && m_agent->wait(true) == TransportAgent::ACTIVE) { // TODO: allow aborting the sync here } } catch (...) { status = handleException(); } } // Let session shut down before auto-destructing anything else // (like our signal blocker). This may take a while, because it // may involve shutting down the helper background thread which // opened our local datastore. SE_LOG_DEBUG(NULL, "closing session"); // setFreeze() no longer has an effect and returns false from now on. m_syncFreeze = SYNC_FREEZE_NONE; m_initialMessage.reset(); sessionSentinel.reset(); sendBuffer.reset(); session.reset(); SE_LOG_DEBUG(NULL, "session closed"); return status; } string SyncContext::getSynthesisDatadir() { if (isEphemeral() && m_sourceListPtr) { // Suppress writing in libsynthesis binfile client. return "/dev/null"; } else if (m_localSync && !m_serverMode) { return m_localClientRootPath + "/.synthesis"; } else { return getRootPath() + "/.synthesis"; } } SyncMLStatus SyncContext::handleException() { SyncMLStatus res = Exception::handle(); return res; } void SyncContext::status() { checkConfig("status check"); SourceList sourceList(*this, false); initSources(sourceList); PasswordConfigProperty::checkPasswords(getUserInterfaceNonNull(), *this, // Don't need sync passwords. PasswordConfigProperty::CHECK_PASSWORD_ALL & ~PasswordConfigProperty::CHECK_PASSWORD_SYNC, sourceList.getSourceNames()); BOOST_FOREACH(SyncSource *source, sourceList) { source->open(); } SyncReport changes; checkSourceChanges(sourceList, changes); stringstream out; changes.prettyPrint(out, SyncReport::WITHOUT_SERVER| SyncReport::WITHOUT_CONFLICTS| SyncReport::WITHOUT_REJECTS| SyncReport::WITH_TOTAL); SE_LOG_INFO(NULL, "Local item changes:\n%s", out.str().c_str()); sourceList.accessSession(getLogDir()); Logger::instance().setLevel(Logger::INFO); string prevLogdir = sourceList.getPrevLogdir(); bool found = access(prevLogdir.c_str(), R_OK|X_OK) == 0; if (found) { if (!m_quiet && getPrintChanges()) { try { sourceList.setPath(prevLogdir); sourceList.dumpDatabases("current", NULL); sourceList.dumpLocalChanges("", "after", "current", ""); } catch(...) { Exception::handle(); } } } else { SE_LOG_SHOW(NULL, "Previous log directory not found."); if (getLogDir().empty()) { SE_LOG_SHOW(NULL, "Enable the 'logdir' option and synchronize to use this feature."); } } } void SyncContext::checkStatus(SyncReport &report) { checkConfig("status check"); SourceList sourceList(*this, false); initSources(sourceList); PasswordConfigProperty::checkPasswords(getUserInterfaceNonNull(), *this, // Don't need sync passwords. PasswordConfigProperty::CHECK_PASSWORD_ALL & ~PasswordConfigProperty::CHECK_PASSWORD_SYNC, sourceList.getSourceNames()); BOOST_FOREACH(SyncSource *source, sourceList) { source->open(); } checkSourceChanges(sourceList, report); } static void logRestoreReport(const SyncReport &report, bool dryrun) { if (!report.empty()) { stringstream out; report.prettyPrint(out, SyncReport::WITHOUT_SERVER|SyncReport::WITHOUT_CONFLICTS|SyncReport::WITH_TOTAL); SE_LOG_INFO(NULL, "Item changes %s applied locally during restore:\n%s", dryrun ? "to be" : "that were", out.str().c_str()); SE_LOG_INFO(NULL, "The same incremental changes will be applied to the server during the next sync."); SE_LOG_INFO(NULL, "Use -sync refresh-from-client to replace the complete data on the server."); } } void SyncContext::checkSourceChanges(SourceList &sourceList, SyncReport &changes) { changes.setStart(time(NULL)); BOOST_FOREACH(SyncSource *source, sourceList) { SyncSourceReport local; if (source->getOperations().m_checkStatus) { source->getOperations().m_checkStatus(local); } else { // no information available local.setItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ADDED, SyncSourceReport::ITEM_TOTAL, -1); local.setItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_UPDATED, SyncSourceReport::ITEM_TOTAL, -1); local.setItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_REMOVED, SyncSourceReport::ITEM_TOTAL, -1); local.setItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_TOTAL, -1); } changes.addSyncSourceReport(source->getName(), local); } changes.setEnd(time(NULL)); } bool SyncContext::checkForScriptAbort(SharedSession session) { try { SharedKey sessionKey = m_engine.OpenSessionKey(session); SharedKey contextKey = m_engine.OpenKeyByPath(sessionKey, "/sessionvars"); bool abort = m_engine.GetInt32Value(contextKey, "delayedabort"); return abort; } catch (NoSuchKey) { // this is necessary because the session might already have // been closed, which removes the variable return false; } catch (BadSynthesisResult) { return false; } } void SyncContext::restore(const string &dirname, RestoreDatabase database) { checkConfig("restore"); SourceList sourceList(*this, false); sourceList.accessSession(dirname.c_str()); Logger::instance().setLevel(Logger::INFO); initSources(sourceList); PasswordConfigProperty::checkPasswords(getUserInterfaceNonNull(), *this, // Don't need sync passwords. PasswordConfigProperty::CHECK_PASSWORD_ALL & ~PasswordConfigProperty::CHECK_PASSWORD_SYNC, sourceList.getSourceNames()); string datadump = database == DATABASE_BEFORE_SYNC ? "before" : "after"; BOOST_FOREACH(SyncSource *source, sourceList) { // fake a source alert event displaySourceProgress(*source, SyncSourceEvent(sysync::PEV_ALERTED, -1, 0, 0), true); source->open(); } if (!m_quiet && getPrintChanges()) { sourceList.dumpDatabases("current", NULL); sourceList.dumpLocalChanges(dirname, "current", datadump, "", "Data changes to be applied locally during restore:\n", "CLIENT_TEST_LEFT_NAME='current data' " "CLIENT_TEST_REMOVED='after restore' " "CLIENT_TEST_REMOVED='to be removed' " "CLIENT_TEST_ADDED='to be added'"); } SyncReport report; try { BOOST_FOREACH(SyncSource *source, sourceList) { SyncSourceReport sourcereport; try { displaySourceProgress(*source, SyncSourceEvent(sysync::PEV_SYNCSTART, 0, 0, 0), true); sourceList.restoreDatabase(*source, datadump, m_dryrun, sourcereport); displaySourceProgress(*source, SyncSourceEvent(sysync::PEV_SYNCEND, 0, 0, 0), true); report.addSyncSourceReport(source->getName(), sourcereport); } catch (...) { sourcereport.recordStatus(STATUS_FATAL); report.addSyncSourceReport(source->getName(), sourcereport); throw; } } } catch (...) { logRestoreReport(report, m_dryrun); throw; } logRestoreReport(report, m_dryrun); } void SyncContext::getSessions(vector &dirs) { LogDir::create(*this)->previousLogdirs(dirs); } string SyncContext::readSessionInfo(const string &dir, SyncReport &report) { boost::shared_ptr logging(LogDir::create(*this)); logging->openLogdir(dir); logging->readReport(report); return logging->getPeerNameFromLogdir(dir); } #ifdef ENABLE_UNIT_TESTS /** * This class works LogDirTest as scratch directory. * LogDirTest/[file_event|file_contact]_[one|two|empty] contain different * sets of items for use in a FileSyncSource. * * With that setup and a fake SyncContext it is possible to simulate * sessions and test the resulting logdirs. */ class LogDirTest : public CppUnit::TestFixture { class LogContext : public SyncContext, public Logger { public: LogContext() : SyncContext("nosuchconfig@nosuchcontext") {} ostringstream m_out; /** capture output produced while test ran */ void messagev(const MessageOptions &options, const char *format, va_list args) { std::string str = StringPrintfV(format, args); m_out << '[' << levelToStr(options.m_level) << ']' << str; if (!boost::ends_with(str, "\n")) { m_out << std::endl; } } }; boost::shared_ptr m_logContext; public: LogDirTest() : m_maxLogDirs(10) { } ~LogDirTest() { } void setUp() { static const char *vcard_1 = "BEGIN:VCARD\n" "VERSION:2.1\n" "TITLE:tester\n" "FN:John Doe\n" "N:Doe;John;;;\n" "X-MOZILLA-HTML:FALSE\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "EMAIL:john.doe@work.com\n" "X-AIM:AIM JOHN\n" "END:VCARD\n"; static const char *vcard_2 = "BEGIN:VCARD\n" "VERSION:2.1\n" "TITLE:developer\n" "FN:John Doe\n" "N:Doe;John;;;\n" "X-MOZILLA-HTML:TRUE\n" "BDAY:2006-01-08\n" "END:VCARD\n"; static const char *ical_1 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "METHOD:PUBLISH\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "UID:1234567890!@#$%^&*()<>@dummy\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201\n" "CREATED:20060409T213201\n" "LOCATION:calling from home\n" "DESCRIPTION:let's talk\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "SEQUENCE:1\n" "BEGIN:VALARM\n" "DESCRIPTION:alarm\n" "ACTION:DISPLAY\n" "TRIGGER;VALUE=DURATION;RELATED=START:-PT15M\n" "END:VALARM\n" "END:VEVENT\n" "END:VCALENDAR\n"; static const char *ical_2 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "METHOD:PUBLISH\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "UID:1234567890!@#$%^&*()<>@dummy\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201\n" "CREATED:20060409T213201\n" "LOCATION:my office\n" "CATEGORIES:WORK\n" "DESCRIPTION:what the heck\\, let's even shout a bit\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "SEQUENCE:1\n" "END:VEVENT\n" "END:VCALENDAR\n"; rm_r("LogDirTest"); dump("file_event.one", "1", ical_1); dump("file_event.two", "1", ical_1); dump("file_event.two", "2", ical_2); mkdir_p(getLogData() + "/file_event.empty"); dump("file_contact.one", "1", vcard_1); dump("file_contact.two", "1", vcard_1); dump("file_contact.two", "2", vcard_2); mkdir_p(getLogData() + "/file_contact.empty"); mkdir_p(getLogDir()); m_maxLogDirs = 0; // Suppress output by redirecting into LogContext::m_out. // It's not tested at the moment. m_logContext.reset(new LogContext); Logger::addLogger(m_logContext); } void tearDown() { Logger::removeLogger(m_logContext.get()); m_logContext.reset(); } private: string getLogData() { return "LogDirTest/data"; } virtual InitStateString getLogDir() const { return "LogDirTest/cache/syncevolution"; } int m_maxLogDirs; void dump(const char *dir, const char *file, const char *data) { string name = getLogData(); name += "/"; name += dir; mkdir_p(name); name += "/"; name += file; ofstream out(name.c_str()); out << data; } CPPUNIT_TEST_SUITE(LogDirTest); CPPUNIT_TEST(testQuickCompare); CPPUNIT_TEST(testSessionNoChanges); CPPUNIT_TEST(testSessionChanges); CPPUNIT_TEST(testMultipleSessions); CPPUNIT_TEST(testExpire); CPPUNIT_TEST_SUITE_END(); /** * Simulate a session involving one or more sources. * * @param changeServer pretend that peer got changed * @param status result of session * @param varargs sourcename ("file_event"), * statebefore (NULL for no dump, or suffix like "_one"), * stateafter (NULL for same as before), ..., NULL * @return logdir created for the session */ string session(bool changeServer, SyncMLStatus status, ...) { Logger::Level level = Logger::instance().getLevel(); SourceList list(*m_logContext, true); list.setLogLevel(SourceList::LOGGING_QUIET); SyncReport report; list.startSession("", m_maxLogDirs, 0, &report); va_list ap; va_start(ap, status); while (true) { const char *sourcename = va_arg(ap, const char *); if (!sourcename) { break; } const char *type = NULL; if (!strcmp(sourcename, "file_event")) { type = "file:text/calendar:2.0"; } else if (!strcmp(sourcename, "file_contact")) { type = "file:text/vcard:3.0"; } CPPUNIT_ASSERT(type); string datadir = getLogData() + "/"; cxxptr source(SyncSource::createTestingSource(sourcename, type, true, (string("file://") + datadir).c_str())); datadir += sourcename; datadir += "_1"; source->open(); if (changeServer) { // fake one added item on server source->setItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ADDED, SyncSourceReport::ITEM_TOTAL, 1); } list.addSource(source); const char *before = va_arg(ap, const char *); const char *after = va_arg(ap, const char *); if (before) { // do a "before" dump after directing the source towards the desired data rm_r(datadir); CPPUNIT_ASSERT_EQUAL(0, symlink((string(sourcename) + before).c_str(), datadir.c_str())); list.syncPrepare(sourcename); if (after) { rm_r(datadir); CPPUNIT_ASSERT_EQUAL(0, symlink((string(sourcename) + after).c_str(), datadir.c_str())); } } } list.syncDone(status, &report); Logger::instance().setLevel(level); return list.getLogdir(); } typedef vector Sessions_t; // full paths to all sessions, sorted Sessions_t listSessions() { Sessions_t sessions; string logdir = getLogDir(); ReadDir dirs(logdir); BOOST_FOREACH(const string &dir, dirs) { sessions.push_back(RealPath(logdir + "/" + dir)); } sort(sessions.begin(), sessions.end()); return sessions; } void testQuickCompare() { // identical dirs => identical files CPPUNIT_ASSERT(!LogDir::haveDifferentContent("file_event", getLogData(), "empty", getLogData(), "empty")); CPPUNIT_ASSERT(!LogDir::haveDifferentContent("file_event", getLogData(), "one", getLogData(), "one")); CPPUNIT_ASSERT(!LogDir::haveDifferentContent("file_event", getLogData(), "two", getLogData(), "two")); // some files shared CPPUNIT_ASSERT(!system("cp -l -r LogDirTest/data/file_event.two LogDirTest/data/file_event.copy && rm LogDirTest/data/file_event.copy/2")); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_event", getLogData(), "two", getLogData(), "copy")); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_event", getLogData(), "copy", getLogData(), "one")); } void testSessionNoChanges() { ScopedEnvChange config("XDG_CONFIG_HOME", "LogDirTest/config"); ScopedEnvChange cache("XDG_CACHE_HOME", "LogDirTest/cache"); // simple session with no changes string dir = session(false, STATUS_OK, "file_event", ".one", ".one", (char *)0); Sessions_t sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)1, sessions.size()); CPPUNIT_ASSERT_EQUAL(dir, sessions[0]); IniFileConfigNode status(dir, "status.ini", true); CPPUNIT_ASSERT(status.exists()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__event-backup-before").get()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__event-backup-after").get()); CPPUNIT_ASSERT_EQUAL(string("200"), status.readProperty("status").get()); CPPUNIT_ASSERT(!LogDir::haveDifferentContent("file_event", dir, "before", dir, "after")); } void testSessionChanges() { ScopedEnvChange config("XDG_CONFIG_HOME", "LogDirTest/config"); ScopedEnvChange cache("XDG_CACHE_HOME", "LogDirTest/cache"); // session with local changes string dir = session(false, STATUS_OK, "file_event", ".one", ".two", (char *)0); Sessions_t sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)1, sessions.size()); CPPUNIT_ASSERT_EQUAL(dir, sessions[0]); IniFileConfigNode status(dir, "status.ini", true); CPPUNIT_ASSERT(status.exists()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__event-backup-before").get()); CPPUNIT_ASSERT_EQUAL(string("2"), status.readProperty("source-file__event-backup-after").get()); CPPUNIT_ASSERT_EQUAL(string("200"), status.readProperty("status").get()); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_event", dir, "before", dir, "after")); } void testMultipleSessions() { ScopedEnvChange config("XDG_CONFIG_HOME", "LogDirTest/config"); ScopedEnvChange cache("XDG_CACHE_HOME", "LogDirTest/cache"); // two sessions, starting with 1 item, adding 1 during the sync, then // removing it again during the second string dir = session(false, STATUS_OK, "file_event", ".one", ".two", "file_contact", ".one", ".two", (char *)0); { Sessions_t sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)1, sessions.size()); CPPUNIT_ASSERT_EQUAL(dir, sessions[0]); IniFileConfigNode status(dir, "status.ini", true); CPPUNIT_ASSERT(status.exists()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__event-backup-before").get()); CPPUNIT_ASSERT_EQUAL(string("2"), status.readProperty("source-file__event-backup-after").get()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__contact-backup-before").get()); CPPUNIT_ASSERT_EQUAL(string("2"), status.readProperty("source-file__contact-backup-after").get()); CPPUNIT_ASSERT_EQUAL(string("200"), status.readProperty("status").get()); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_event", dir, "before", dir, "after")); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_contact", dir, "before", dir, "after")); } string seconddir = session(false, STATUS_OK, "file_event", ".two", ".one", "file_contact", ".two", ".one", (char *)0); { Sessions_t sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dir, sessions[0]); CPPUNIT_ASSERT_EQUAL(seconddir, sessions[1]); IniFileConfigNode status(seconddir, "status.ini", true); CPPUNIT_ASSERT(status.exists()); CPPUNIT_ASSERT_EQUAL(string("2"), status.readProperty("source-file__event-backup-before").get()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__event-backup-after").get()); CPPUNIT_ASSERT_EQUAL(string("2"), status.readProperty("source-file__contact-backup-before").get()); CPPUNIT_ASSERT_EQUAL(string("1"), status.readProperty("source-file__contact-backup-after").get()); CPPUNIT_ASSERT_EQUAL(string("200"), status.readProperty("status").get()); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_event", seconddir, "before", seconddir, "after")); CPPUNIT_ASSERT(LogDir::haveDifferentContent("file_contact", seconddir, "before", seconddir, "after")); } CPPUNIT_ASSERT(!LogDir::haveDifferentContent("file_event", dir, "after", seconddir, "before")); CPPUNIT_ASSERT(!LogDir::haveDifferentContent("file_contact", dir, "after", seconddir, "before")); } void testExpire() { ScopedEnvChange config("XDG_CONFIG_HOME", "LogDirTest/config"); ScopedEnvChange cache("XDG_CACHE_HOME", "LogDirTest/cache"); string dirs[5]; Sessions_t sessions; m_maxLogDirs = 1; // The latest session always must be preserved, even if it // is normally considered less important (no error in this case). dirs[0] = session(false, STATUS_FATAL, (char *)0); dirs[0] = session(false, STATUS_OK, (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)1, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); // all things being equal, then expire the oldest session, // leaving us with two here m_maxLogDirs = 2; dirs[0] = session(false, STATUS_OK, (char *)0); dirs[1] = session(false, STATUS_OK, (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); CPPUNIT_ASSERT_EQUAL(dirs[1], sessions[1]); // When syncing first file_event, then file_contact, both sessions // must be preserved despite m_maxLogDirs = 1, otherwise // we would loose the only existent backup of file_event. dirs[0] = session(false, STATUS_OK, "file_event", ".two", ".one", (char *)0); dirs[1] = session(false, STATUS_OK, "file_contact", ".two", ".one", (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); CPPUNIT_ASSERT_EQUAL(dirs[1], sessions[1]); // after synchronizing both, we can expire both the old sessions m_maxLogDirs = 1; dirs[0] = session(false, STATUS_OK, "file_event", ".two", ".one", "file_contact", ".two", ".one", (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)1, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); // when doing multiple failed syncs without dumps, keep the sessions // which have database dumps m_maxLogDirs = 2; dirs[1] = session(false, STATUS_FATAL, (char *)0); dirs[1] = session(false, STATUS_FATAL, (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); CPPUNIT_ASSERT_EQUAL(dirs[1], sessions[1]); // when doing syncs which don't change data, keep the sessions which // did change something: keep oldest backup because it created the // backups for the first time dirs[1] = session(false, STATUS_OK, "file_event", ".one", ".one", "file_contact", ".one", ".one", (char *)0); dirs[1] = session(false, STATUS_OK, "file_event", ".one", ".one", "file_contact", ".one", ".one", (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); CPPUNIT_ASSERT_EQUAL(dirs[1], sessions[1]); // when making a change in each sync, we end up with the two // most recent sessions eventually: first change server, // then local dirs[1] = session(true, STATUS_OK, "file_event", ".one", ".one", "file_contact", ".one", ".one", (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); CPPUNIT_ASSERT_EQUAL(dirs[1], sessions[1]); dirs[0] = dirs[1]; dirs[1] = session(false, STATUS_OK, "file_event", ".one", ".two", "file_contact", ".one", ".two", (char *)0); sessions = listSessions(); CPPUNIT_ASSERT_EQUAL((size_t)2, sessions.size()); CPPUNIT_ASSERT_EQUAL(dirs[0], sessions[0]); CPPUNIT_ASSERT_EQUAL(dirs[1], sessions[1]); } }; SYNCEVOLUTION_TEST_SUITE_REGISTRATION(LogDirTest); #endif // ENABLE_UNIT_TESTS SE_END_CXX syncevolution-1.5/src/syncevo/UserInterface.cpp0000644000373300001540000001032012326412403023227 0ustar00nightlynightly00000000000000/* * Copyright (C) 2012 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include SE_BEGIN_CXX std::string ConfigPasswordKey::toString() const { std::vector props; props.reserve(7); #define PUSH_PROP(_x) if (!_x.empty()) { props.push_back(StringPrintf("%s=%s", #_x, _x.c_str())); } PUSH_PROP(user); PUSH_PROP(server); PUSH_PROP(domain); PUSH_PROP(object); PUSH_PROP(protocol); PUSH_PROP(authtype); #undef PUSH_PROP if (port) { props.push_back(StringPrintf("port=%d", port)); } return boost::join(props, " "); } static bool CheckKeyring(const InitStateTri &keyring) { // Default slot, registered with higher priority // than any other keyring backend. If we get here // no other backend was chosen by the keyring // property. If it is a string, then the string // must have been invalid or unsupported. if (keyring.wasSet() && keyring.getValue() == InitStateTri::VALUE_STRING && !keyring.get().empty()) { SE_THROW("Unsupported value for the \"keyring\" property, no such keyring found: " + keyring.get()); } return false; } static bool PreventPlainText(const InitStateTri &keyring, const std::string &passwordName) { // Another slot, called after CheckKeyring when saving. // Ensures that if keyring was meant to be used and // couldn't be used, an error is throw instead of // silently storing as plain text password. if (keyring.getValue() != InitStateTri::VALUE_FALSE && !keyring.get().empty()) { SE_THROW(StringPrintf("Cannot save %s as requested in %s." "This SyncEvolution binary was compiled without support for storing " "passwords in a keyring or wallet, or none of the backends providing that " "functionality were usable. Either store passwords in your configuration " "files or enter them interactively on each program run.\n", passwordName.c_str(), (keyring.getValue() == InitStateTri::VALUE_TRUE || keyring.get().empty()) ? "a secure keyring" : keyring.get().c_str())); } return false; } LoadPasswordSignal &GetLoadPasswordSignal() { static class Signal : public LoadPasswordSignal { public: Signal() { connect(100, boost::bind(CheckKeyring, _1)); } } loadPasswordSignal; return loadPasswordSignal; } SavePasswordSignal &GetSavePasswordSignal() { static class Signal : public SavePasswordSignal { public: Signal() { connect(100, boost::bind(CheckKeyring, _1)); connect(101, boost::bind(PreventPlainText, _1, _2)); } } savePasswordSignal; return savePasswordSignal; } void UserInterface::askPasswordAsync(const std::string &passwordName, const std::string &descr, const ConfigPasswordKey &key, const boost::function &success, const boost::function &failureException) { try { success(askPassword(passwordName, descr, key)); } catch (...) { failureException(); } } SE_END_CXX syncevolution-1.5/src/syncevo/SyncConfig.cpp0000664000373300001540000051220712405555067022563 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include SE_BEGIN_CXX const char *const SourceAdminDataName = "adminData"; const char *const SyncMaxMsgSize = "maxMsgSize"; int ConfigVersions[CONFIG_LEVEL_MAX][CONFIG_VERSION_MAX] = { { CONFIG_ROOT_MIN_VERSION, CONFIG_ROOT_CUR_VERSION }, { CONFIG_CONTEXT_MIN_VERSION, CONFIG_CONTEXT_CUR_VERSION }, { CONFIG_PEER_MIN_VERSION, CONFIG_PEER_CUR_VERSION }, }; std::string ConfigLevel2String(ConfigLevel level) { switch (level) { case CONFIG_LEVEL_ROOT: return "config root"; break; case CONFIG_LEVEL_CONTEXT: return "context config"; break; case CONFIG_LEVEL_PEER: return "peer config"; break; default: return StringPrintf("config level %d (?)", level); break; } } PropertySpecifier PropertySpecifier::StringToPropSpec(const std::string &spec, int flags) { PropertySpecifier res; size_t slash = spec.find('/'); if (slash != spec.npos) { // no normalization needed at the moment res.m_source = spec.substr(0, slash); slash++; } else { slash = 0; } size_t at = spec.find('@', slash); if (at != spec.npos) { // Context or config? if (spec.find('@', at + 1) != spec.npos) { // has a second @ sign, must be config name res.m_config = spec.substr(at + 1); } else { // context, include leading @ sign res.m_config = spec.substr(at); } if (flags & NORMALIZE_CONFIG) { res.m_config = SyncConfig::normalizeConfigString(res.m_config, SyncConfig::NORMALIZE_LONG_FORMAT); } } else { at = spec.size(); } res.m_property = spec.substr(slash, at - slash); return res; } UserIdentity::UserIdentity() : m_provider(InitStateString(USER_IDENTITY_PLAIN_TEXT, false)) { } UserIdentity UserIdentity::fromString(const InitStateString &idString) { UserIdentity id; if (idString.wasSet()) { size_t off = idString.find(':'); if (off != idString.npos) { id.m_provider = off ? idString.substr(0, off) : InitStateString(USER_IDENTITY_PLAIN_TEXT, false); id.m_identity = idString.substr(off + 1); } else { id.m_provider = InitStateString(USER_IDENTITY_PLAIN_TEXT, false); id.m_identity = idString; } } return id; } InitStateString UserIdentity::toString() const { std::string str; if (m_provider.wasSet()) { str += m_provider; str += ':'; } str += m_identity; return InitStateString(str, m_provider.wasSet() || m_identity.wasSet()); } std::string PropertySpecifier::toString() { std::string res; res.reserve(m_source.size() + 1 + m_property.size() + 1 + m_config.size()); res += m_source; if (!m_source.empty()) { res += '/'; } res += m_property; if (!m_config.empty()) { if (m_config[0] != '@') { res += '@'; } res += m_config; } return res; } string ConfigProperty::getName(const ConfigNode &node) const { if (m_names.empty()) { // shouldn't happen return "???"; } if (m_names.size() == 1) { // typical case for most properties return m_names.front(); } // pick the name already used in the node BOOST_FOREACH(const std::string &name, m_names) { string value; if (node.getProperty(name, value)) { return name; } } // main name as fallback return m_names.front(); } void ConfigProperty::splitComment(const string &comment, list &commentLines) { size_t start = 0; while (true) { size_t end = comment.find('\n', start); if (end == comment.npos) { commentLines.push_back(comment.substr(start)); break; } else { commentLines.push_back(comment.substr(start, end - start)); start = end + 1; } } } void ConfigProperty::throwValueError(const ConfigNode &node, const string &name, const string &value, const string &error) const { Exception::throwError(SE_HERE, node.getName() + ": " + name + " = " + value + ": " + error); } std::string ConfigProperty::sharing2str(Sharing sharing) { switch (sharing) { case GLOBAL_SHARING: return "global"; break; case SOURCE_SET_SHARING: return "shared"; break; case NO_SHARING: return "unshared"; break; } return "???"; } string SyncConfig::normalizeConfigString(const string &config, NormalizeFlags flags) { string normal = config; boost::to_lower(normal); BOOST_FOREACH(char &character, normal) { if (!isprint(character) || character == '/' || character == '\\' || character == ':') { character = '_'; } } if (boost::ends_with(normal, "@default")) { if (flags & NORMALIZE_SHORTHAND) { normal.resize(normal.size() - strlen("@default")); } } else if (boost::ends_with(normal, "@")) { normal.resize(normal.size() - 1); } else { size_t at = normal.rfind('@'); if (at == normal.npos && !(flags & NORMALIZE_IS_NEW)) { // No explicit context. Pick the first server which matches // when ignoring their context. Peer list is sorted by name, // therefore shorter config names (= without context) are // found first, as intended. BOOST_FOREACH(const StringPair &entry, getConfigs()) { string entry_peer, entry_context; splitConfigString(entry.first, entry_peer, entry_context); if (normal == entry_peer) { // found a matching, existing config, use it normal = entry.first; break; } } } if (!(flags & NORMALIZE_SHORTHAND) && normal.find('@') == normal.npos) { // explicitly include @default context specifier normal += "@default"; } } if (normal.empty()) { // default context is meant with the empty string, // better make that explicit normal = "@default"; } return normal; } std::string SyncConfig::DeviceDescription::getFingerprint() const { std::string fingerprint; /** In the case that we have the PnpInformation we prefer it over * the mutable device name. The is true even if we only found the * vendor component of the PnpInformation. */ if (m_pnpInformation) { if(m_pnpInformation->isKnownProduct()) fingerprint = m_pnpInformation->m_product; else fingerprint = m_pnpInformation->m_vendor; } else { fingerprint = m_deviceName; } return fingerprint; } bool SyncConfig::splitConfigString(const string &config, string &peer, string &context) { string::size_type at = config.rfind('@'); if (at != config.npos) { peer = config.substr(0, at); context = config.substr(at + 1); return true; } else { peer = config; context = "default"; return false; } } static SyncConfig::ConfigWriteMode defaultConfigWriteMode() { return SyncContext::isStableRelease() ? SyncConfig::MIGRATE_AUTOMATICALLY : SyncConfig::ASK_USER_TO_MIGRATE; } SyncConfig::SyncConfig() : m_layout(HTTP_SERVER_LAYOUT), // use more compact layout with shorter paths and less source nodes m_configWriteMode(defaultConfigWriteMode()) { // initialize properties SyncConfig::getRegistry(); SyncSourceConfig::getRegistry(); m_peerPath = m_contextPath = "volatile"; makeVolatile(); } void SyncConfig::makeVolatile() { m_tree.reset(new VolatileConfigTree()); m_fileTree.reset(); m_peerNode.reset(new VolatileConfigNode()); m_hiddenPeerNode = m_peerNode; m_globalNode = m_peerNode; m_contextNode = m_peerNode; m_contextHiddenNode = m_peerNode; m_props[false] = m_peerNode; m_props[true] = m_peerNode; } void SyncConfig::makeEphemeral() { m_ephemeral = true; // m_hiddenPeerNode.reset(new VolatileConfigNode()); // m_contextHiddenNode = m_hiddenPeerNode; } /** * The goal is to have only one FileConfigTree instance per file system * location. This ensures that in-memory representations remain in sync * when instantiating a SyncConfig is created multiple times. In addition, * FilterConfigNodes also must only exit once per underlying node. This * allows sharing cached passwords between configs when using indirect * password lookup. * * The implementation in both cases is the same: keep a cache with * weak pointers. When asked for an instance, consult the cache first. * If the instance still exists, we can return that shared pointer. If * not, we create a new one. * * It is necessary to garbage-collect obsolete entries, because the * lookup parameters might never be used again. */ class ConfigCache { typedef std::map< std::pair, boost::weak_ptr > TreeMap; TreeMap m_trees; typedef std::map< ConfigNode *, boost::weak_ptr > NodeMap; NodeMap m_nodes; template void purge(M &map) { typename M::iterator it = map.begin(); while (it != map.end()) { if (!it->second.lock()) { typename M::iterator next = it; ++next; map.erase(it); it = next; } else { ++it; } } } void purge(); public: boost::shared_ptr createTree(const std::string &root, SyncConfig::Layout layout); /** * The filter is only installed when creating a new node. It is * assumed to be the same when reusing the node. */ boost::shared_ptr createNode(const boost::shared_ptr &node, const FilterConfigNode::ConfigFilter &filter = FilterConfigNode::ConfigFilter()); static ConfigCache &singleton(); }; ConfigCache &ConfigCache::singleton() { static ConfigCache instance; return instance; } void ConfigCache::purge() { purge(m_trees); purge(m_nodes); } boost::shared_ptr ConfigCache::createTree(const std::string &root, SyncConfig::Layout layout) { TreeMap::mapped_type &entry = m_trees[TreeMap::key_type(root, layout)]; boost::shared_ptr result; result = entry.lock(); if (!result) { result.reset(new FileConfigTree(root, layout)); entry = result; } purge(); return result; } boost::shared_ptr ConfigCache::createNode(const boost::shared_ptr &node, const FilterConfigNode::ConfigFilter &filter) { NodeMap::mapped_type &entry = m_nodes[node.get()]; boost::shared_ptr result; result = entry.lock(); if (!result) { result.reset(new FilterConfigNode(node, filter)); entry = result; } purge(); return result; } SyncConfig::SyncConfig(const string &peer, boost::shared_ptr tree, const string &redirectPeerRootPath) : m_layout(SHARED_LAYOUT), m_redirectPeerRootPath(redirectPeerRootPath), m_configWriteMode(defaultConfigWriteMode()) { // initialize properties SyncConfig::getRegistry(); SyncSourceConfig::getRegistry(); string root; m_peer = normalizeConfigString(peer); // except for SHARED_LAYOUT (set below), // everything is below the directory called like // the peer m_peerPath = m_contextPath = m_peer; if (tree.get() != NULL) { // existing tree points into simple configuration m_tree = tree; m_layout = HTTP_SERVER_LAYOUT; m_peerPath = m_contextPath = ""; } else { // search for configuration in various places... root = getOldRoot(); string path = root + "/" + m_peerPath; if (!access((path + "/spds/syncml/config.txt").c_str(), F_OK)) { m_layout = SYNC4J_LAYOUT; } else { m_layout = SHARED_LAYOUT; root = getNewRoot(); path = root + "/" + m_peerPath; if (!access((path + "/config.ini").c_str(), F_OK) && !access((path + "/sources").c_str(), F_OK) && access((path + "/peers").c_str(), F_OK)) { m_layout = HTTP_SERVER_LAYOUT; } else { // check whether config name specifies a context, // otherwise use "default" splitConfigString(m_peer, m_peerPath, m_contextPath); if (!m_peerPath.empty()) { m_peerPath = m_contextPath + "/peers/" + m_peerPath; } } } m_fileTree = ConfigCache::singleton().createTree(root, m_layout); m_tree = m_fileTree; } string path; boost::shared_ptr node; switch (m_layout) { case SYNC4J_LAYOUT: // all properties reside in the same node path = m_peerPath + "/spds/syncml"; node = m_tree->open(path, ConfigTree::visible); m_peerNode = ConfigCache::singleton().createNode(node); m_globalNode = m_contextNode = m_peerNode; m_hiddenPeerNode = m_contextHiddenNode = m_globalHiddenNode = node; m_props[false] = m_peerNode; m_props[true] = ConfigCache::singleton().createNode(m_hiddenPeerNode); break; case HTTP_SERVER_LAYOUT: { // properties which are normally considered shared are // stored in the same nodes as the per-peer properties, // except for global ones path = ""; node = m_tree->open(path, ConfigTree::visible); m_globalNode = ConfigCache::singleton().createNode(node); node = m_tree->open(path, ConfigTree::hidden); m_globalHiddenNode = node; path = m_peerPath; node = m_tree->open(path, ConfigTree::visible); m_peerNode = ConfigCache::singleton().createNode(node); m_contextNode = m_peerNode; m_hiddenPeerNode = m_contextHiddenNode = m_tree->open(path, ConfigTree::hidden); // similar multiplexing as for SHARED_LAYOUT, // with two nodes underneath boost::shared_ptr mnode; mnode.reset(new MultiplexConfigNode(m_peerNode->getName(), getRegistry(), false)); m_props[false] = mnode; mnode->setNode(false, ConfigProperty::GLOBAL_SHARING, m_globalNode); mnode->setNode(false, ConfigProperty::SOURCE_SET_SHARING, m_peerNode); mnode->setNode(false, ConfigProperty::NO_SHARING, m_peerNode); mnode.reset(new MultiplexConfigNode(m_peerNode->getName(), getRegistry(), true)); m_props[true] = mnode; mnode->setNode(true, ConfigProperty::GLOBAL_SHARING, m_globalHiddenNode); mnode->setNode(true, ConfigProperty::SOURCE_SET_SHARING, m_peerNode); mnode->setNode(true, ConfigProperty::NO_SHARING, m_peerNode); break; } case SHARED_LAYOUT: // really use different nodes for everything path = ""; node = m_tree->open(path, ConfigTree::visible); m_globalNode = ConfigCache::singleton().createNode(node); node = m_tree->open(path, ConfigTree::hidden); m_globalHiddenNode = node; path = m_peerPath; if (path.empty()) { if (!m_redirectPeerRootPath.empty()) { node.reset(new IniFileConfigNode(m_redirectPeerRootPath, ".internal.ini", false)); node = m_tree->add(m_redirectPeerRootPath + "/.internal.ini", node); } else { node.reset(new DevNullConfigNode(m_contextPath + " without peer config")); } } else { node = m_tree->open(path, ConfigTree::visible); } m_peerNode = ConfigCache::singleton().createNode(node); if (path.empty()) { m_hiddenPeerNode = m_peerNode; } else { m_hiddenPeerNode = m_tree->open(path, ConfigTree::hidden); } path = m_contextPath; node = m_tree->open(path, ConfigTree::visible); m_contextNode = ConfigCache::singleton().createNode(node); m_contextHiddenNode = m_tree->open(path, ConfigTree::hidden); // Instantiate multiplexer with the most specific node name in // the set, the peer node's name. This is slightly inaccurate: // error messages generated for this node in will reference // the wrong config.ini file for shared properties. But // there no shared properties which can trigger such an error // at the moment, so this is good enough for now (MB#8037). boost::shared_ptr mnode; mnode.reset(new MultiplexConfigNode(m_peerNode->getName(), getRegistry(), false)); mnode->setHavePeerNodes(!m_peerPath.empty()); m_props[false] = mnode; mnode->setNode(false, ConfigProperty::GLOBAL_SHARING, m_globalNode); mnode->setNode(false, ConfigProperty::SOURCE_SET_SHARING, m_contextNode); mnode->setNode(false, ConfigProperty::NO_SHARING, m_peerNode); mnode.reset(new MultiplexConfigNode(m_hiddenPeerNode->getName(), getRegistry(), true)); mnode->setHavePeerNodes(!m_peerPath.empty()); m_props[true] = mnode; mnode->setNode(true, ConfigProperty::SOURCE_SET_SHARING, m_contextHiddenNode); mnode->setNode(true, ConfigProperty::NO_SHARING, m_hiddenPeerNode); mnode->setNode(true, ConfigProperty::GLOBAL_SHARING, m_globalHiddenNode); break; } // read version check for (ConfigLevel level = CONFIG_LEVEL_ROOT; level < CONFIG_LEVEL_MAX; level = (ConfigLevel)(level + 1)) { if (exists(level)) { if (getConfigVersion(level, CONFIG_MIN_VERSION) > ConfigVersions[level][CONFIG_CUR_VERSION]) { SE_LOG_INFO(NULL, "config version check failed: %s has format %d, but this SyncEvolution release only supports format %d", ConfigLevel2String(level).c_str(), getConfigVersion(level, CONFIG_MIN_VERSION), ConfigVersions[level][CONFIG_CUR_VERSION]); // our code is too old to read the config, reject it SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("SyncEvolution %s is too old to read configuration '%s', please upgrade SyncEvolution.", VERSION, peer.c_str()), STATUS_RELEASE_TOO_OLD); } } } // Note that the version check does not reject old configs because // they are too old; so far, any release must be able to read any // older config. } void SyncConfig::prepareConfigForWrite() { // check versions before bumping to something incompatible with the // previous user of the config for (ConfigLevel level = CONFIG_LEVEL_ROOT; level < CONFIG_LEVEL_MAX; level = (ConfigLevel)(level + 1)) { if (getLayout() < SHARED_LAYOUT && level < CONFIG_LEVEL_PEER) { // old configs do not have explicit root or context, // only check peer config itself continue; } if (exists(level)) { if (getConfigVersion(level, CONFIG_CUR_VERSION) < ConfigVersions[level][CONFIG_MIN_VERSION]) { // release which created config will no longer be able to read // updated config; either alert user or migrate automatically string config; switch (level) { case CONFIG_LEVEL_CONTEXT: config = getContextName(); break; case CONFIG_LEVEL_PEER: config = getConfigName(); break; case CONFIG_LEVEL_ROOT: case CONFIG_LEVEL_MAX: // keep compiler happy, not reached for _MAX break; } SE_LOG_INFO(NULL, "must change format of %s '%s' in backward-incompatible way", ConfigLevel2String(level).c_str(), config.c_str()); if (m_configWriteMode == MIGRATE_AUTOMATICALLY) { // migrate config and anything beneath it, // so no further checking needed migrate(config); break; } else { SE_THROW_EXCEPTION_STATUS(StatusException, StringPrintf("Proceeding would modify config '%s' such " "that the previous SyncEvolution release " "will not be able to use it. Stopping now. " "Please explicitly acknowledge this step by " "running the following command on the command " "line: syncevolution --migrate '%s'", config.c_str(), config.c_str()), STATUS_MIGRATION_NEEDED); } } } } // now set current versions at all levels, // but without reducing versions: if a config has format // "cur = 10", then properties or features added in that // format remain even if the config is (temporarily?) used // by a SyncEvolution binary which has "cur = 5". for (ConfigLevel level = CONFIG_LEVEL_ROOT; level < CONFIG_LEVEL_MAX; level = (ConfigLevel)(level + 1)) { if (level == CONFIG_LEVEL_PEER && m_peerPath.empty()) { // no need (and no possibility) to set per-peer version) break; } for (ConfigLimit limit = CONFIG_MIN_VERSION; limit < CONFIG_VERSION_MAX; limit = (ConfigLimit)(limit + 1)) { // set if equal to ensure that version == 0 (the default) // is set explicitly if (getConfigVersion(level, limit) <= ConfigVersions[level][limit]) { setConfigVersion(level, limit, ConfigVersions[level][limit]); } } } flush(); } void SyncConfig::migrate(const std::string &config) { if (config.empty()) { // migrating root not yet supported SE_THROW("internal error, migrating config root not implemented"); } else { // migrate using the higher-level logic in the Cmdline class Cmdline migrate(m_peer.c_str(), "--migrate", config.c_str(), NULL); bool res = migrate.parse() && migrate.run(); if (!res) { SE_THROW(StringPrintf("migration of config '%s' failed", config.c_str())); } // files that our tree access may have changed, refresh our // in-memory copy m_tree->reload(); } } string SyncConfig::getRootPath() const { return m_fileTree ? normalizePath(m_fileTree->getRoot() + "/" + ((m_layout == SYNC4J_LAYOUT || hasPeerProperties()) ? m_peerPath : m_contextPath)) : ""; } void SyncConfig::addPeers(const string &root, const std::string &configname, SyncConfig::ConfigList &res) { FileConfigTree tree(root, SyncConfig::HTTP_SERVER_LAYOUT); list servers = tree.getChildren(""); BOOST_FOREACH(const string &server, servers) { // sanity check: only list server directories which actually // contain a configuration. To distinguish between a context // (~/.config/syncevolution/default) and an HTTP server config // (~/.config/syncevolution/scheduleworld), we check for the // "peer" subdirectory that is only in the former. // // Contexts which don't have a peer are therefore incorrectly // listed as a peer. Short of adding a special hidden file // this can't be fixed. This is probably overkill and thus not // done yet. string peerPath = server + "/peers"; if (!access((root + "/" + peerPath).c_str(), F_OK)) { // not a real HTTP server, search for peers BOOST_FOREACH(const string &peer, tree.getChildren(peerPath)) { res.push_back(pair (normalizeConfigString(peer + "@" + server), root + "/" + peerPath + "/" + peer)); } } else if (!access((root + "/" + server + "/" + configname).c_str(), F_OK)) { res.push_back(pair (server, root + "/" + server)); } } } /** returns true if a precedes b (strict weak ordering) */ static bool cmpConfigEntries(const StringPair &a, const StringPair &b) { string peerA, contextA, peerB, contextB; SyncConfig::splitConfigString(a.first, peerA, contextA); SyncConfig::splitConfigString(b.first, peerB, contextB); int res; res = contextA.compare(contextB); if (res == 0) { res = peerA.compare(peerB); if (res == 0) { res = a.second.compare(b.second); } } return res < 0; } SyncConfig::ConfigList SyncConfig::getConfigs() { ConfigList res; addPeers(getOldRoot(), "config.txt", res); addPeers(getNewRoot(), "config.ini", res); // Sort the list by (context, peer name, path); // better than returning it in random order. // This sort order (compared to simple lexical // sorting based on the full config name) has // the advantage that peer names or contexts with // suffix (foo.old vs. foo) come later. res.sort(cmpConfigEntries); return res; } static string SyncEvolutionTemplateDir() { string templateDir(TEMPLATE_DIR); const char *envvar = getenv("SYNCEVOLUTION_TEMPLATE_DIR"); if (envvar) { templateDir = envvar; } return templateDir; } SyncConfig::TemplateList SyncConfig::matchPeerTemplates(const DeviceList &peers, bool fuzzyMatch) { TemplateList result; // match against all possible templates without any assumption on directory // layout, the match is entirely based on the metadata template.ini string templateDir(SyncEvolutionTemplateDir()); std::queue > directories; directories.push(templateDir); templateDir = SubstEnvironment("${XDG_CONFIG_HOME}/syncevolution-templates"); directories.push(templateDir); while (!directories.empty()) { string sDir = directories.front(); directories.pop(); if (isDir(sDir)) { // check all sub directories ReadDir dir(sDir); BOOST_FOREACH(const string &entry, dir) { // ignore hidden files, . and .. if (!boost::starts_with(entry, ".")) { directories.push(sDir + "/" + entry); } } } else { TemplateConfig templateConf (sDir); if (boost::ends_with(sDir, "~") || !templateConf.isTemplateConfig()) { // ignore temporary files and files which do // not contain a valid template continue; } BOOST_FOREACH (const DeviceList::value_type &entry, peers){ std::string fingerprint(entry.getFingerprint()); // peerName should be empty if no reliable device info is on hand. std::string peerName = entry.m_pnpInformation ? fingerprint : ""; int rank = templateConf.metaMatch (entry.getFingerprint(), entry.m_matchMode); if (fuzzyMatch){ if (rank > TemplateConfig::NO_MATCH) { result.push_back (boost::shared_ptr( new TemplateDescription(templateConf.getTemplateId(), templateConf.getDescription(), rank, peerName, entry.m_deviceId, entry.m_deviceName, sDir, templateConf.getFingerprint(), templateConf.getTemplateName() ) )); } } else if (rank == TemplateConfig::BEST_MATCH){ result.push_back (boost::shared_ptr( new TemplateDescription(templateConf.getTemplateId(), templateConf.getDescription(), rank, peerName, entry.m_deviceId, entry.m_deviceName, sDir, templateConf.getFingerprint(), templateConf.getTemplateName()) )); break; } } } } result.sort (TemplateDescription::compare_op); return result; } boost::shared_ptr SyncConfig::createPeerTemplate(const string &server) { if (server.empty()) { // Empty template name => no such template. This check is // necessary because otherwise we end up with SyncConfig(""), // which is a configuration where peer-specific properties // cannot be set, triggering an errror in config->setDevID(). return boost::shared_ptr(); } // case insensitive search for read-only file template config string templateConfig(SyncEvolutionTemplateDir()); // before starting another fuzzy match process, first try to load the // template directly taking the parameter as the path if (server == "none") { // nothing to read from, just set some defaults below } else if (TemplateConfig::isTemplateConfig(server)) { templateConfig = server; } else { SyncConfig::DeviceList devices; devices.push_back (DeviceDescription("", server, MATCH_ALL)); templateConfig = ""; TemplateList templates = matchPeerTemplates (devices, false); if (!templates.empty()) { templateConfig = templates.front()->m_path; } if (templateConfig.empty()) { // return "not found" return boost::shared_ptr(); } } boost::shared_ptr tree(new SingleFileConfigTree(templateConfig)); boost::shared_ptr config(new SyncConfig(server, tree)); boost::shared_ptr source; config->setDefaults(false); config->setDevID(string("syncevolution-") + UUID()); // leave the rest empty for special "none" template if (server == "none") { return config; } // check for icon if (config->getIconURI().empty()) { string dirname, filename; splitPath(templateConfig, dirname, filename); ReadDir dir(getDirname(dirname)); // remove last suffix, regardless what it is size_t pos = filename.rfind('.'); if (pos != filename.npos) { filename.resize(pos); } filename += "-icon"; BOOST_FOREACH(const string &entry, dir) { if (boost::istarts_with(entry, filename)) { config->setIconURI("file://" + dirname + "/" + entry); break; } } } // "default" maps to SyncEvolution server template, which is not // consumer ready. When used as "default" by the GTK sync UI, // the UI expects the "consumer ready" flag to be set. Do that // here. Also unset the peer name, because otherwise it shows // up in the UI. if (server == "default") { config->setConsumerReady(true); config->setUserPeerName(InitStateString()); } return config; } bool SyncConfig::exists() const { return m_peerPath.empty() ? m_contextNode->exists() : m_peerNode->exists(); } bool SyncConfig::exists(ConfigLevel level) const { switch (level) { case CONFIG_LEVEL_ROOT: return m_globalNode->exists(); break; case CONFIG_LEVEL_CONTEXT: return m_contextNode->exists(); break; case CONFIG_LEVEL_PEER: return m_peerNode->exists(); break; default: return false; } } string SyncConfig::getContextName() const { string peer, context; splitConfigString(getConfigName(), peer, context); return string("@") + context; } string SyncConfig::getPeerName() const { string peer, context; splitConfigString(getConfigName(), peer, context); return peer; } list SyncConfig::getPeers() const { list res; if (!hasPeerProperties()) { std::string rootPath = getRootPath(); if (!rootPath.empty()) { FileConfigTree tree(getRootPath(), SHARED_LAYOUT); res = tree.getChildren("peers"); } } return res; } void SyncConfig::preFlush(UserInterface &ui) { /* Iterator over all sync global and source properties * one by one and check whether they need to save password */ /* save password in the global config node */ ConfigPropertyRegistry& registry = getRegistry(); BOOST_FOREACH(const ConfigProperty *prop, registry) { prop->savePassword(ui, *this); } /** grep each source and save their password */ list configuredSources = getSyncSources(); BOOST_FOREACH(const string &sourceName, configuredSources) { //boost::shared_ptr sc = getSyncSourceConfig(sourceName); ConfigPropertyRegistry& registry = SyncSourceConfig::getRegistry(); SyncSourceNodes sourceNodes = getSyncSourceNodes(sourceName); BOOST_FOREACH(const ConfigProperty *prop, registry) { prop->savePassword(ui, *this, sourceName); } } } void SyncConfig::flush() { if (!isEphemeral()) { if (m_fileTree && m_layout == SHARED_LAYOUT && !hasPeerProperties()) { // Ensure that "peers" directory exists for new-style // configs. It would not get created when flushing nodes // for pure context configs otherwise (it's empty), and we // need it to detect new-syle configs. mkdir_p(m_fileTree->getRoot() + "/" + m_contextPath + "/peers"); } m_tree->flush(); } } void SyncConfig::remove() { boost::shared_ptr tree = m_tree; // stop using the config nodes, they might get removed now makeVolatile(); tree->remove(m_peerPath.empty() ? m_contextPath : m_peerPath); } boost::shared_ptr SyncConfig::getSyncSourceConfig(const string &name) { SyncSourceNodes nodes = getSyncSourceNodes(name); return boost::shared_ptr(new PersistentSyncSourceConfig(name, nodes)); } list SyncConfig::getSyncSources() const { // Return *all* sources configured in this context, // not just those configured for the peer. This // is necessary so that sources created for some other peer // show up for the current one, to prevent overwriting // existing properties unintentionally. // Returned sources are an union of: // 1. contextpath/sources // 2. peers/[one-peer]/sources // 3. sources in source filter set sources; list sourceList; if (m_layout == SHARED_LAYOUT) { // get sources in context sourceList = m_tree->getChildren(m_contextPath + "/sources"); sources.insert(sourceList.begin(), sourceList.end()); // get sources from peer if it's not empty and merge into // full set of sources if (!m_peerPath.empty()) { sourceList = m_tree->getChildren(m_peerPath + "/sources"); sources.insert(sourceList.begin(), sourceList.end()); } } else { // get sources from peer sourceList = m_tree->getChildren(m_peerPath + (m_layout == SYNC4J_LAYOUT ? "/spds/sources" : "/sources")); sources.insert(sourceList.begin(), sourceList.end()); } // get sources from filter and union them into returned sources BOOST_FOREACH(const SourceProps::value_type &value, m_sourceFilters) { if (value.first.empty()) { // ignore filter for all sources continue; } sources.insert(value.first); } // Convert back to simple list. As a nice side-effect of // temporarily using a set, the final list is sorted. return list(sources.begin(), sources.end()); } SyncSourceNodes SyncConfig::getSyncSourceNodes(const string &name, const string &changeId) { if (m_nodeCache.find(name) != m_nodeCache.end()) { // reuse existing set of nodes return m_nodeCache[name]; } /** shared source properties */ boost::shared_ptr sharedNode; /** per-peer source properties */ boost::shared_ptr peerNode; /** per-peer internal properties and meta data */ boost::shared_ptr hiddenPeerNode, serverNode, trackingNode; string cacheDir; // store configs lower case even if the UI uses mixed case string lower = name; boost::to_lower(lower); boost::shared_ptr node; string sharedPath, peerPath; switch (m_layout) { case SYNC4J_LAYOUT: peerPath = m_peerPath + "/spds/sources/" + lower; break; case HTTP_SERVER_LAYOUT: peerPath = m_peerPath + "/sources/" + lower; break; case SHARED_LAYOUT: if (!m_peerPath.empty()) { peerPath = m_peerPath + "/sources/" + lower; } sharedPath = m_contextPath + string("/sources/") + lower; break; } // Compatibility mode for reading configs which have "type" instead // of "backend/databaseFormat/syncFormat/forceSyncFormat": determine // the new values based on the old property, then inject the new // values into the SyncSourceNodes by adding an intermediate layer // of FilterConfigNodes. The top FilterConfigNode layer is the one // which might get modified, the one underneath remains hidden and // thus preserves the new values even if the caller does a setFilter(). bool compatMode = getConfigVersion(CONFIG_LEVEL_CONTEXT, CONFIG_CUR_VERSION) < 1; SourceType sourceType; if (compatMode) { node = m_tree->open(peerPath.empty() ? sharedPath : peerPath, ConfigTree::visible); string type; if (node->getProperty("type", type)) { sourceType = SourceType(type); } else { // not set: avoid compatibility mode compatMode = false; } } if (peerPath.empty()) { node.reset(new DevNullConfigNode(m_contextPath + " without peer configuration")); peerNode = ConfigCache::singleton().createNode(node); hiddenPeerNode = trackingNode = serverNode = node; } else { // Here we assume that m_tree is a FileConfigTree. Otherwise getRootPath() // will not point into a normal file system. We fall back to not allowing // the usage of a cache dir by using /dev/null in that case. std::string rootPath = getRootPath(); if (rootPath.empty()) { cacheDir = "/dev/null"; } else { cacheDir = rootPath + "/" + peerPath + "/.cache"; } node = m_tree->open(peerPath, ConfigTree::visible); if (compatMode) { boost::shared_ptr compat(new FilterConfigNode(node)); compat->addFilter("syncFormat", InitStateString(sourceType.m_format, !sourceType.m_format.empty())); compat->addFilter("forceSyncFormat", sourceType.m_forceFormat ? InitStateString("1", true) : InitStateString("0", false)); if (sharedPath.empty()) { compat->addFilter("databaseFormat", InitStateString(sourceType.m_localFormat, !sourceType.m_localFormat.empty())); compat->addFilter("backend", InitStateString(sourceType.m_backend, !sourceType.m_backend.empty())); } node = compat; } peerNode = ConfigCache::singleton().createNode(node, m_sourceFilters.createSourceFilter(name)); hiddenPeerNode = m_tree->open(peerPath, ConfigTree::hidden); trackingNode = m_tree->open(peerPath, ConfigTree::other, changeId); serverNode = m_tree->open(peerPath, ConfigTree::server, changeId); } if (isEphemeral()) { // Throw away meta data. trackingNode.reset(new VolatileConfigNode); hiddenPeerNode.reset(new VolatileConfigNode); serverNode.reset(new VolatileConfigNode); } else if (!m_redirectPeerRootPath.empty()) { // Local sync: overwrite per-peer nodes with nodes inside the // parents tree. Otherwise different configs syncing locally // against the same context end up sharing .internal.ini and // .other.ini files inside that context. string path = m_redirectPeerRootPath + "/sources/" + lower; trackingNode.reset(new IniHashConfigNode(path, ".other.ini", false)); trackingNode = m_tree->add(path + "/.other.ini", trackingNode); if (peerPath.empty()) { hiddenPeerNode = peerNode; } else { hiddenPeerNode = boost::static_pointer_cast(m_tree->add(path + "/.internal.ini", peerNode)); } } if (sharedPath.empty()) { sharedNode = peerNode; } else { node = m_tree->open(sharedPath, ConfigTree::visible); if (compatMode) { boost::shared_ptr compat(new FilterConfigNode(node)); compat->addFilter("databaseFormat", InitStateString(sourceType.m_localFormat, !sourceType.m_localFormat.empty())); compat->addFilter("backend", InitStateString(sourceType.m_backend, !sourceType.m_backend.empty())); node = compat; } sharedNode = ConfigCache::singleton().createNode(node, m_sourceFilters.createSourceFilter(name)); } SyncSourceNodes nodes(!peerPath.empty(), sharedNode, peerNode, hiddenPeerNode, trackingNode, serverNode, cacheDir); m_nodeCache.insert(make_pair(name, nodes)); return nodes; } ConstSyncSourceNodes SyncConfig::getSyncSourceNodes(const string &name, const string &changeId) const { return const_cast(this)->getSyncSourceNodes(name, changeId); } SyncSourceNodes SyncConfig::getSyncSourceNodesNoTracking(const string &name) { SyncSourceNodes nodes = getSyncSourceNodes(name); boost::shared_ptr dummy(new VolatileConfigNode()); return SyncSourceNodes(nodes.m_havePeerNode, nodes.m_sharedNode, nodes.m_peerNode, nodes.m_hiddenPeerNode, dummy, nodes.m_serverNode, nodes.m_cacheDir); } static ConfigProperty syncPropSyncURL("syncURL", "Identifies how to contact the peer,\n" "best explained with some examples.\n\n" "HTTP(S) SyncML servers::\n\n" " http://example.com/sync\n\n" "OBEX over Bluetooth uses the MAC address, with\n" "the channel chosen automatically::\n\n" " obex-bt://00:0A:94:03:F3:7E\n\n" "If the automatism fails, the channel can also be specified::\n\n" " obex-bt://00:0A:94:03:F3:7E+16\n\n" "For peers contacting us via Bluetooth, the MAC address is\n" "used to identify it before the sync starts. Multiple\n" "urls can be specified in one syncURL property::\n\n" " obex-bt://00:0A:94:03:F3:7E obex-bt://00:01:02:03:04:05\n\n" "In the future this might be used to contact the peer\n" "via one of several transports; right now, only the first\n" "one is tried." // MB #9446 ); static ConfigProperty syncPropDevID("deviceId", "The SyncML server gets this string and will use it to keep track of\n" "changes that still need to be synchronized with this particular\n" "client; it must be set to something unique (like the pseudo-random\n" "string created automatically for new configurations) among all clients\n" "accessing the same server.\n" "myFUNAMBOL also requires that the string starts with sc-pim-"); static ConfigProperty syncPropUsername("username", "user name used for authorization with the SyncML server", ""); static BoolConfigProperty syncPropPeerIsClient("PeerIsClient", "Indicates whether this configuration is about a\n" "client peer or server peer.\n", "FALSE"); static SafeConfigProperty syncPropRemoteDevID("remoteDeviceId", "SyncML ID of our peer, empty if unknown; must be set only when\n" "the peer is a SyncML client contacting us via HTTP.\n" "Clients contacting us via OBEX/Bluetooth can be identified\n" "either via this remoteDeviceId property or by their MAC\n" "address, if that was set in the syncURL property.\n" "\n" "If this property is empty and the peer synchronizes with\n" "this configuration chosen by some other means, then its ID\n" "is recorded here automatically and later used to verify that\n" "the configuration is not accidentally used by a different\n" "peer."); static class SyncPasswordConfigProperty : public PasswordConfigProperty { public: SyncPasswordConfigProperty() : PasswordConfigProperty("password", "password used for authorization with the peer;\n" "in addition to specifying it directly as plain text, it can\n" "also be read from the standard input or from an environment\n" "variable of your choice::\n\n" " plain text : password = \n" " ask : password = -\n" " env variable: password = ${}\n") {} virtual void checkPassword(UserInterface &ui, SyncConfig &config, int flags, const std::string &sourceName = "") const { PasswordConfigProperty::checkPassword(ui, config, flags, syncPropUsername, sourceName); } virtual void savePassword(UserInterface &ui, SyncConfig &config, const std::string &sourceName = "") const { PasswordConfigProperty::savePassword(ui, config, syncPropUsername, sourceName); } ConfigPasswordKey getPasswordKey(const string &descr, const string &serverName, FilterConfigNode &globalConfigNode, const string &sourceName, const boost::shared_ptr &sourceConfigNode) const { ConfigPasswordKey key; bool peerIsClient = syncPropPeerIsClient.getPropertyValue(globalConfigNode); key.server = syncPropSyncURL.getProperty(globalConfigNode); key.description = StringPrintf("sync password for %s", descr.c_str()); if (peerIsClient && key.server.empty()) { /** * Fall back to username/remoteDeviceId as key. */ key.server = syncPropRemoteDevID.getProperty(globalConfigNode); } else { /** * Here we use server sync url without protocol prefix and * user account name as the key in the keyring. * The URL must not be empty, otherwise we end up * overwriting the password of some other service just * because it happens to have the same username. */ size_t start = key.server.find("://"); /* we don't preserve protocol prefix for it may change */ if (start != key.server.npos) { key.server = key.server.substr(start + 3); } } key.user = getUsername(syncPropUsername, globalConfigNode); // User domain part of a username which looks like an email address // as server name if we don't have something better. Needed for // WebDAV configs using just an email address to locate the server. if (key.server.empty()) { size_t offset = key.user.find('@'); if (offset != key.user.npos && offset != key.user.size() - 1) { key.server = key.user.substr(offset + 1); key.user.resize(offset); } } return key; } } syncPropPassword; static BoolConfigProperty syncPropPreventSlowSync("preventSlowSync", "During a slow sync, the SyncML server must match all items\n" "of the client with its own items and detect which ones it\n" "already has based on properties of the items. This is slow\n" "(client must send all its data) and can lead to duplicates\n" "(when the server fails to match correctly).\n" "It is therefore sometimes desirable to wipe out data on one\n" "side with a refresh-from-client/server sync instead of doing\n" "a slow sync.\n" "When this option is enabled, slow syncs that could cause problems\n" "are not allowed to proceed. Instead, the affected datastores are\n" "skipped, allowing the user to choose a suitable sync mode in\n" "the next run (slow sync selected explicitly, refresh sync).\n" "The following situations are handled:\n\n" "- running as client with no local data => unproblematic,\n" " slow sync is allowed to proceed automatically\n" "- running as client with local data => client has no\n" " information about server, so slow sync might be problematic\n" " and is prevented\n" "- client has data, server asks for slow sync because all its data\n" " was deleted (done by Memotoo and Mobical, because they treat\n" " this as 'user wants to start from scratch') => the sync would\n" " recreate all the client's data, even if the user really wanted\n" " to have it deleted, therefore slow sync is prevented\n", "TRUE"); static BoolConfigProperty syncPropUseProxy("useProxy", "set to T to choose an HTTP proxy explicitly; otherwise the default\n" "proxy settings of the underlying HTTP transport mechanism are used;\n" "only relevant when contacting the peer via HTTP", "FALSE"); static ConfigProperty syncPropProxyHost("proxyHost", "proxy URL (``http://:``)"); static ConfigProperty syncPropProxyUsername("proxyUsername", "authentication for proxy: username"); static class ProxyPasswordConfigProperty : public PasswordConfigProperty { public: ProxyPasswordConfigProperty() : PasswordConfigProperty("proxyPassword", "proxy password, can be specified in different ways,\n" "see SyncML server password for details\n", "", "proxy") {} /** * re-implement this function for it is necessary to do a check * before retrieving proxy password */ virtual void checkPassword(UserInterface &ui, SyncConfig &config, int flags, const std::string &sourceName = std::string()) const { /* if useProxy is set 'true', then check proxypassword */ if (config.getUseProxy()) { PasswordConfigProperty::checkPassword(ui, config, flags, syncPropProxyUsername, sourceName); } } virtual void savePassword(UserInterface &ui, SyncConfig &config, const std::string &sourceName = std::string()) const { PasswordConfigProperty::savePassword(ui, config, syncPropProxyUsername, sourceName); } virtual ConfigPasswordKey getPasswordKey(const std::string &descr, const std::string &serverName, FilterConfigNode &globalConfigNode, const std::string &sourceName, const boost::shared_ptr &sourceConfigNode) const { ConfigPasswordKey key; key.server = syncPropProxyHost.getProperty(globalConfigNode); key.user = getUsername(syncPropProxyUsername, globalConfigNode); key.description = StringPrintf("proxy password for %s", descr.c_str()); return key; } } syncPropProxyPassword; static StringConfigProperty syncPropClientAuthType("clientAuthType", "- empty or \"md5\" for secure method (recommended)\n" "- \"basic\" for insecure method\n" "\n" "This setting is only for debugging purpose and only\n" "has an effect during the initial sync of a client.\n" "Later it remembers the method that was supported by\n" "the server and uses that. When acting as server,\n" "clients contacting us can use both basic and md5\n" "authentication.\n", "md5", "", Values() + (Aliases("basic") + "syncml:auth-basic") + (Aliases("md5") + "syncml:auth-md5" + "")); static ULongConfigProperty syncPropMaxMsgSize(SyncMaxMsgSize, "The maximum size of each message can be set (maxMsgSize) and the\n" "peer can be told to never sent items larger than a certain\n" "threshold (maxObjSize). Presumably the peer has to truncate or\n" "skip larger items. Sizes are specified as number of bytes.", "150000"); static UIntConfigProperty syncPropMaxObjSize("maxObjSize", "", "4000000"); static BoolConfigProperty syncPropWBXML("enableWBXML", "use the more compact binary XML (WBXML) for messages between client and server;\n" "not applicable when the peer is a SyncML client, because then the client\n" "chooses the encoding", "TRUE"); static BoolConfigProperty syncPropRefreshSync("enableRefreshSync", "Use the more advanced refresh-from-server sync mode to\n" "implement the refresh-from-remote operation. Some SyncML\n" "servers do not support this. Therefore the default is to\n" "delete local data before doing a slow sync, which has the\n" "same effect. However, some servers work better when they\n" "are told explicitly that the sync is a refresh sync. For\n" "example, Funambol's One Media server rejects too many slow\n" "syncs in a row with a 417 'retry later' error.\n", "FALSE"); static ConfigProperty syncPropLogDir("logdir", "full path to directory where automatic backups and logs\n" "are stored for all synchronizations; if unset, then\n" "\"${XDG_CACHE_HOME}/syncevolution/\" (which\n" "usually expands to ${HOME}/.cache/...) will be used;\n" "if \"none\", then no backups of the databases are made and any\n" "output is printed directly to the screen"); static UIntConfigProperty syncPropMaxLogDirs("maxlogdirs", "Controls how many session directories are kept at most in the logdir.\n" "Unless set to zero, SyncEvolution will remove old directories and\n" "all their content to prevent the number of log directories from\n" "growing beyond the given limit. It tries to be intelligent and will\n" "remove sessions in which nothing interesting happened (no errors,\n" "no data changes) in favor of keeping sessions where something\n" "happened, even if those sessions are older.", "10"); static UIntConfigProperty syncPropLogLevel("loglevel", "level of detail for log messages:\n" "- 0 (or unset) = INFO messages without log file, DEBUG with log file\n" "- 1 = only ERROR messages\n" "- 2 = also INFO messages\n" "- 3 = also DEBUG messages\n" "> 3 = increasing amounts of debug messages for developers"); static UIntConfigProperty syncPropNotifyLevel("notifyLevel", "Level of detail for desktop notifications. Currently such\n" "notifications are generated only for automatically started\n" "sync sessions.\n" "\n" "0 - suppress all notifications\n" "1 - show only errors\n" "2 - show information about changes and errors (in practice currently the same as level 3)\n" "3 - show all notifications, including starting a sync\n", "3"); static BoolConfigProperty syncPropPrintChanges("printChanges", "enables or disables the detailed (and sometimes slow) comparison\n" "of database content before and after a sync session", "TRUE"); static BoolConfigProperty syncPropDumpData("dumpData", "enables or disables the automatic backup of database content\n" "before and after a sync session (always enabled if printChanges is enabled)", "TRUE"); static SecondsConfigProperty syncPropRetryDuration("RetryDuration", "The total amount of time in seconds in which the SyncML\n" "client tries to get a response from the server.\n" "During this time, the client will resend messages\n" "in regular intervals (RetryInterval) if no response\n" "is received or the message could not be delivered due\n" "to transport problems. When this time is exceeded\n" "without a response, the synchronization aborts without\n" "sending further messages to the server.\n" "\n" "When acting as server, this setting controls how long\n" "a client is allowed to not send a message before the\n" "synchronization is aborted." ,"5M"); static SecondsConfigProperty syncPropRetryInterval("RetryInterval", "The number of seconds between the start of SyncML message sending\n" "and the start of the retransmission. If the interval has\n" "already passed when a message send returns, the\n" "message is resent immediately. Resending without\n" "any delay will never succeed and therefore specifying 0\n" "disables retries.\n" "\n" "Servers cannot resend messages, so this setting has no\n" "effect in that case.\n" "\n" "The WebDAV backend also resends messages after a temporary\n" "network error. It uses exponential backoff to determine when\n" "the server is available again. This setting is divided by 24\n" "to obtain the initial delay (default: 2m => 5s), which is then\n" "doubled for each retry." ,"2M"); static SafeConfigProperty syncPropPeerName("PeerName", "An arbitrary name for the peer referenced by this config.\n" "Might be used by a GUI. The command line tool always uses the\n" "the configuration name."); static ConfigProperty syncPropSyncMLVersion("SyncMLVersion", "On a client, the latest commonly supported SyncML version\n" "is used when contacting a server. One of '1.0/1.1/1.2' can\n" "be used to pick a specific version explicitly.\n" "\n" "On a server, this option controls what kind of Server Alerted\n" "Notification is sent to the client to start a synchronization.\n" "By default, first the format from 1.2 is tried, then in case\n" "of failure, the older one from 1.1. 1.2/1.1 can be set\n" "explicitly, which disables the automatism.\n" "\n" "Instead or in adddition to the version, several keywords can\n" "be set in this property (separated by spaces or commas):\n" "\n" "- NOCTCAP - avoid sending CtCap meta information\n" "- NORESTART - disable the sync mode extension that SyncEvolution\n" " client and server use to negotiate whether both sides support\n" " running multiple sync iterations in the same session\n" "- REQUESTMAXTIME=
the data fields: The field separator generated by the engine is = \r\n = 0x0d 0x0a.. ( The engine is able to handle only, as well as only as separator ) aa:bbcc:dd[] The identifiers are either assigned to the fieldmap names, or just numbered by an index, if automap indexasname is true: Example: : 0:Joe1:Smith2:New York with XML config file entry: The „SDK_textdb“ sample is expecting indexasname=“true“, because the fieldmap names will not be stored, so the ordering of the config file’s fieldmap determines the index assignment. NOTE: Adding fields in-between or changing the ordering of fields will make the system incompatible to already existing TDB_*.txt files, when indexasname is true. The data fields can be multiline, so carriage returns must be escaped using „\r“, linefeeds must be escaped using „\n“. To allow this, also backslashes themselves must be escaped (using „\\“). Double quotes and ctrl characters must be escaped as well. For details see the string conversion routines at „stringutil.cpp“, which is part of the SDK package. There are two extensions to this syntax: BLOBs: For binary large object blocks the field contains only a reference to the BLOB identifier which will be read and written with ReadBlob/WriteBlob. Syntax: aa;BLOBID=xyz where is the name of the BLOB. Arrays: For array fields a syntax with index will be used Syntax: aa[index]:bb „ReadNextItemAsKey“ and „ReadItemAsKey“ are equivalent to „ReadNextItem“/ „ReadItem“, but they are using an appPointer instead of transferring the . They will be used instead by the SyncML engine, if „ITEM_AS_KEY:true“ is returned with Module_Capabilities and at least SDK 1.4.0 is used. These keys are completely opaque for the plugin module. Their attached context must be read or written with the GetValue/SetValue callback functions. The “update” section The „update“ section starts with „StartDataWrite“ and ends with „EndDataWrite“. Read commands ( ReadItem / ReadBlob ) can appear here as well. - StartDataWrite - InsertItem *) - InsertItemAsKey *) - FinalizeLocalID - UpdateItem *) - UpdateItemAsKey *) - MoveItem - DeleteItem - DeleteSyncSet - WriteBlob **) - DeleteBlob **) - EndDataWrite *) Needn’t to be implemented with „plugin_datastore:no“ at Module_Capabilities **) Needn’t to be implemented with „plugin_datablob:no“ at Module_Capabilities „InsertItemAsKey“ and „UpdateItemAsKey“ are equivalent to „InsertItem“/ „UpdateItem“, but they are using an appPointer instead of transferring the . They will be used instead by the SyncML engine, if „ITEM_AS_KEY:true“ is returned with Module_Capabilities and at least SDK 1.4.0 is used. These keys are completely opaque for the plugin module. Their attached context must be read or written with the GetValue/SetValue callback functions. NOTE: „MoveItem“ is prepared for handling hierarchical datastores. In the current version the SyncML engine has not yet implemented this feature. Therefore this function will not yet be called. For current plugin implementations LOCERR_NOTIMP (20030) can be returned. The “admin write” section The „admin write“ section allows to handle the map tables. Detailed description can be found at „sync_dbapi.h“. All routines of this section can be implemented with return code DB_Forbidden = 403, if the admin tables will be handled by the SyncML engine itself. - SaveAdminData - InsertMapItem - UpdateMapItem - DeleteMapItem These routines will be called only, if is set to yes in the config. Needn’t to be implemented with „plugin_datastoreadmin:no“ at Module_Capabilities NOTE: Some of the Synthesis SyncML (client) engines have the admin part built-in, so it cannot be redirected to a plugin module for these cases. The “general” section Some general routines are part of this section: - ThreadMayChangeNow - WriteLogData - AdaptItem *) - DisposeObj **) - DispItems ***) *) Is not yet implemented in the SyncML engine, so it will never be called. Needn’t to be implemented with „plugin_dataadapt:no“ at Module_Capabilities **) Not implemented for JNI and C#, because Java and C# run their own garbage collection ***) Will never be called by the SyncML engine; for debug purposes only. As the name says, the thread may change after „ThreadMayChangeNow“ (but it must not). If this information is not needed for the plugin module, it can be implemented empty. The “close” section The „close“ section releases the data store. The plug-in must release here all allocated memory for this datastore. All objects returned to the SyncML engine will be released with ‚DisposeObj’ prior this call. - DeleteContext No access to this context will be done after „DeleteContext“. Callback calls The Synthesis SyncML engine supports a callback mechanism, which can be used at the plug-in modules for writing comments to the log files. Logging will be done on module, session and datastore level. The user should NEVER use „printf“ or „cout“ calls, as this kind of output is not supported by all versions of the Synthesis SyncML server and will not be logged in an appropriate way. The SDK_util file provides the DEBUG_Call and the DEBUG_DB call: void DEBUG_Call( void* aCB, unsigned short debugFlags, const char* ident, const char* routine, const char* text, ... ); void DEBUG_DB ( void* aCB, const char* ident, const char* routine, const char* text, ... ); DEBUG_DB is a DEBUG_Call with = DBG_PLUGIN_DB The variable will be passed with the creation of each context (and must be stored within the context object for subsequent use). The SyncML engine will write the text to the context assigned log file. For more details see descriptions at „sync_dbapi.h“. Sometimes, very extensive logging is requested, which should not be visible in normal log files. The SyncML engine supports a flag called . Calls of DEBUG_Exotic_Call or DEBUG_Exotic_DB will be shown only, if the global "exotic" debug flag is set: void DEBUG_Exotic_Call( void* aCB, unsigned short debugFlags, const char* ident, const char* routine, const char* text, ... ); void DEBUG_Exotic_DB ( void* aCB, const char* ident, const char* routine, const char* text, ... ); DEBUG_Exotic_DB is a DEBUG_Exotic_Call with = DBG_PLUGIN_DB The log file can be structured using logical blocks. To add these structures, use DEBUG_Block / DEBUG_EndBlock as pairs. identifies such a pair. void DEBUG_Block ( void* aCB, const char* aTag, const char* aDesc, const char* aAttrText ); void DEBUG_EndBlock( void* aCB, const char* aTag ); The end of a thread can be signalled with. This information helps to create more structured logs. void DEBUG_EndThread( void* aCB ); NOTE: The underlying debug callback calls are using cb->callbackRef as first parameter, not directly. If you are using these calls directly (e.g. on language platforms where SDK_util is not available), please be aware that debug callback calls and UI callin calls are treated differently concerning this first parameter. The global context There are two main reasons to have a global context: Either 1) for some reasons no global variables are allowed within the plugin module or 2) there is a need to share some variables between different plugin modules. For both cases the SyncML engine provides a mechanism to get such a global context without the need of global variables. A structure „GlobContext“ (defined at „sysync_dbapidef.h“) will be provided at „Module_CreateContext“ thru mCB->gContext. /*! Structure of GlobContext */ typedef struct { void* ref; /* reference field */ void* next; /* reference to the next GlobContext structure */ uInt32 cnt; /* link count */ char refName[ 80 ]; /* the reference's name, length restricted */ } GlobContext; which is initially empty can be assigned any specific name of this context and should point to the desired global structure. The must be incremented by 1. The field needn’t to be handled, this will be done by the SyncML engine. mCB->gContext actually points to a linked list of GlobContext, where points to next element, as long as not NULL. In subsequent calls of „Module_CreateContext“ it can be searched for the specific name at this linked list. If available, is the desired reference. Don’t forget to increment for each assigned reference. Each module context with such a reference must decrement at „Module_DeleteContext“ again. When reaches 0, the reference structure should be deleted, then set to NULL and to „“. The SyncML engine will automatically remove such empty elements. Each plugin module can use up to 3 such GlobContexts with a different . The function „GlobContextFound“ can be used to search/assign such a GlobContext. An example for a global structure which will be used by different plugin modules is a reference to a virtual machine which only exists once per system. The Java Bridge „JNI“ is built with such a reference to the JavaVM. The OceanBlue / SnowWhite adapter For C++ an example implementation with a base class ( „OceanBlue“ ) and a derived class („SnowWhite“ ) is part of the package. „OceanBlue“ contains all interface function as virtual methods which can be overriden by the „SnowWhite“ classes. The given example implements version and capablity feedback for the module level, login for the session level and the data handling methods readnext/read/insert/update/delete with some example code. The intension is that „OceanBlue“ must not be changed, all adaptions will be done at the „SnowWhite“ module. Here is a step-by-step tutorial how to create your own database adapter. Make a copy of „snowwhite.h“ and „snowwhite.cpp“ for creating your own database adapter. Adapt the name „snowwhite“ at „myadapter.h“ to your own plugin’s name. The snowwhite sources do not contain „SnowWhite“ directly, they use MyAdapter. Adapt the build number 0..255 to return it at the Version method. The build number is a part of the version number which is completely user defined. The rest of the version number must not be changed, as it will be used for upwards/downwards compability checks of the engine. Change the name and description at the Capabilities method The SnowWhite adapter is using methods for ReadNext / Read / Insert and Update, and for Delete. The example shows in a simple way how to do this operations with static elements. Replace them by your real database access. Adapt the Login for different users. The SnowWhite login example just expects username= super and password=user (MD5 encoded) and returns the = „5678“. If you’re using the database adapter for the client side with only one user, you can implement it as dummy. Please note thate CreateContext is currently checking the returned For the client engine you don’t need an admin data implementation. For the server side, you can either configure an ODBC implementation use the INTERNAL_ADMIN implementation (using textdb way of using it) implement your own admin part by overriding the virtual admin methods For the BLOB implementation use the INTERNAL_BLOB implementation (using textdb way of using it) implement your own BLOB part by overriding the virtual BLOB methods NOTE: Suspend/Resume is using the BLOB implementation for partial items, so running the datastore with OMA DS 1.2 requires a BLOB implementation. Optionally implement now other things you need like filter support, e.g. for date ranges. The SDK contains a lot of utiltiy functions ( SDK_util / SDK_support ) which can be used by the database adapter. SySync UIApi SDK description The SySync UIApi provides core SyncML functionality in form of a library (.dll, .so, .dlib etc. depending on the platform) to create SyncML applications not only with custom specific UI but also custom specific SyncML communication layers. This is because network communication is, especially on mobile devices, tightly coupled with the UI (asking user for network to use, connection to establish, certificates to accept or deny etc.). In addition, modern operating systems all provide built-in support libraries for common communication layers like HTTP or OBEX which match platform specifics optimally. Connecting the SyncML core library via UIApi The UI Api interface is based on an interface structure with several methods in it. So as the first step, the UI application must get this UI_Call_In interface structure and the engine’s version number from the SyncML engine. There is a unified function call „ConnectEngine“: /* Main entry point when connecting engine from outside */ ENGINE_ENTRY TSyError ConnectEngine ( UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR; NOTE: For C# „ConnectEngineS“ must be used instead. That’s beause the interface structure must be allocated within the managed environment. is the current version of this structure, as it might increase for future versions. It is allowed to use „ConnectEngineS“ (as replacement for „ConnectEngine“) also in the C/C++ environment. ENGINE_ENTRY TSyError ConnectEngineS( UI_Call_In aCI, uInt16 aCallbackVersion, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR; The UI_Call_In structure allows now to access to all the UI application functions (through its function pointer members). The UI_Call_In interface structure is based on the same SDK_Interface_Structure (defined at sync_dbapidef.h), which is also used by the DBApi SDK. The DBApi and UIApi share some of the functions – for example the DB_DebugXXXX functions can be called in both APIs for creating log file entries. Likewise, the GetValueXXX and SetValueXXX routines are available in both APIs. For C++, there is a wrapper class named TEngineModuleBridge is provided as part of the SDK to facilitate access; likewise, for Borland/Codegear Delphi a similar Delphi wrapper class (Delphi\sdk_sources_delphi\sysync_engine.pas) in Pascal exists. The engine version can be used for compatibility check or action. The engine itself makes some checks for compatibility with versus , so is strongly recommended to take „Plugin_Version( )“ as or the version definitions of Java or C#. The UI Api contains 3 sections: Engine Init Running Sync Sessions Settings Access For detailed information see method descriptions in „enginemodulebase.h“ The UI application must disconnect the engine at the end to make sure that all settings are stored correctly: /* Entry point for disconnecting the engine at the end */ ENGINE_ENTRY TSyError DisconnectEngine( UI_Call_In aCB ) ENTRY_ATTR; Using a SyncML Client Library via UIApi The following paragraphs describe the basic steps to take to create a SyncML client application. Details may differ depending on your actual setup. Please also refer to the fully functional sample clients provided as part of the SDK (SyncML clients for Mozilla Sunbird/Lightning as GUI applications for Windows (in Codegear Delphi Pascal), MacOSX (in XCode Cocoa/Objective C) and Linux (Glide/Gtk C++). Preparation for initialisation First, the engine library must be connected as described in  REF _Ref185308797 \r \h 5.1. Then, before actually initializing the engine with a XML configuration file, some preparations might be needed. The Synthesis SyncML engine version 3.1 and later support so-called "config variables", which can be used to embed dynamic data from the runtime environment in a config file. For example, command line arguments can be used to define path specifications in the config file (debug logs, data files...) without actually modifying the config file. Assume the config file contains a debug log directory specification as follows: $(mylogpath) To make this work, the config variable "mylogpath" must be defined before actually reading the XML config (see  HYPERLINK "SySync_config_reference.pdf" SySync_config_reference.pdf chapter "Configuration variables and conditional configuration"). In C, this will look as follows: // Assume that UI_Call_In *callInP contains the call-in structure // as returned by ConnectEngine() TSyError sta; // open the settings key that provides access to config variables appPointer keyH = NULL; // will receive the opened key's handle sta = callInP->OpenKeyByPath(callInP, &keyH, NULL, "/configvars",0); if (sta==LOCERR_OK) { // config variable settings key opened successfully // - define text mode callInP->SetTextMode(callInP, keyH, CHS_UTF8, LEM_CSTR, false); // - set the config variable's value callInP->SetValue( callInP, keyH, "mylogpath", VALTYPE_TEXT, "C:\\syncml\\logfiles", // the config var value to set -1 // automatically calculate length from null-terminated string ); // done with config variables, close settings key callInP->CloseKey(callInP,keyH); keyH=NULL; } When all config variables are defined, the engine can be initialized. Engine Init As the next step, the configuration must be provided to the SyncML engine. This can be done on three different ways. One of these ways must be chosen: the file name must be provided to the engine, so the engine can read the file directly (using InitEngineFile). the whole configuration must be presented as one contiguous data block in memory (using InitEngineXML). a callback for config reading must be given, so the engine can read it step by step (using InitEngineCB). The string mode can be chosen (using SetStringMode) prior to the engine initialisation, if default settings are not fitting, e.g. a charset which is not UTF-8 Acessing Settings There are several SyncML engine settings which can be configured from the UI application side. The settings are embedded within a tree, comparable to a directory or Windows registry tree. Setting values have therefore a path name, which must be opened first (with „OpenKeyByPath“). Then values can be read („GetValue“ / „GetValueByID“) or written ( „SetValue“ / „SetValueByID“ ). Multiple settings paths can be opened at the same time. „SetTextMode“ and „SetTimeMode“ can be defined for each context. The UI Application interface does not provide any undo functionality, so changes will usually take effect immediately (or after calling „CloseKey“). If undo is required, the UI application itself must provide this functionality. An example program „UI_app_settings.cpp“ shows how these settings can be read and written. A list of common path and key names supported for the SyncML client engine can be found in  REF _Ref207680839 \r \h 9.3. Depending on the version, special functionality and platform of the client library the available path and key names might be different from the standard set in  REF _Ref207680839 \r \h 9.3 – please refer to separate manuals for specific products. Examples for key paths are: - „/profiles“ - „/engineinfo“ Examples for „/profile“ sub entries are: - „serverURI“ - „serverPassword“ Example for „/engineinfo“ entries is: - „version“ The policy should be to close keys immediately after use, this will avoid consistency and locking problems in some cases. Some values will be stored persistently, others must be set up each time the UI application is starting. Preparations before accessing settings profiles At least one client settings profile should be present after initialisation. So it is recommended to check for an existing profile at startup of a client application and create a profile if none already exists. The following code sample shows the steps: // Still assume that UI_Call_In *callInP contains the call-in structure // as returned by ConnectEngine() // access settings to make sure a profile exists appPointer profilesKeyH=NULL, profileKeyH=NULL; // - open the profiles container sta = callInP->OpenKeyByPath(callInP,&profilesKeyH,NULL,"/profiles",0); if (sta==LOCERR_OK) { // - first check settings status. This returns an error code if // configuration data was found, but is not compatible with current // version of the engine. If so, the "overwrite" flag must be // explicitly set to force overwriting the old config with a new, // empty copy. short settingsstatus; memSize sz; sta = callInP->GetValue( callInP, profilesKeyH, "settingsstatus", VALTYPE_INT16, // we want the value as 16-bit integer (appPointer)&settingsstatus, // put value here sizeof(settingsstatus), // size of variable &sz ); if (sta!=LOCERR_OK || settingsstatus==LOCERR_CFGPARSE) { // problem with current config. // We could ask user here to preserve old config and // exit the application. For now, we just force // creation of a new config // - set "overwrite" flag to force creation of new config uInt8 overwrite=1; sta = callInP->SetValue( callInP, profilesKeyH, "overwrite", VALTYPE_INT8, &overwrite, // the config var value to set sizeof(overwrite) // size ); // - now check status again (will create new settings in the engine) sta = callInP->GetValue( callInP, profilesKeyH, "settingsstatus", VALTYPE_INT16, // we want the value as 16-bit integer (appPointer)&settingsstatus, // put value here sizeof(settingsstatus), // size of variable &sz ); } // see if at least one profile exists - if not, create default profile sta = callInP->OpenSubkey( callInP, &profileKeyH, profilesKeyH, KEYVAL_ID_FIRST, 0 ); if (sta==DB_NoContent) { // no profile exists, create default profile now sta = callInP->OpenSubkey( callInP, &profileKeyH, profilesKeyH, KEYVAL_ID_NEW_DEFAULT, 0 ); if (sta!=LOCERR_OK) { // Error, cannot create settings // You could show an user alert here exit(1); // terminate } } if (sta==LOCERR_OK && profileKeyH!=NULL) { // profile exists now callInP->CloseKey(callInP,profileKeyH); // close for now } // done with profiles for now callInP->CloseKey(callInP,profilesKeyH); } Editing Settings To provide editing of client settings, the applications must open the "/profiles" key as show above, then open one of the contained profiles. This profile contains some session-level configuration like Server URL, username, password. As a session can target more than a single datastore for synchronisation, each profile contains a "targets" container which in turn contains a key for each datastore the client supports. To identify the targets, the XML configuration file must include a numeric identifier in the tag in each section (see  HYPERLINK "SySync_config_reference.pdf" SySync_config_reference.pdf). Within the "targets" key, this identifier can be used to open the individual targets by id using OpenSubkey(). So the settings hierarchy for SyncML clients is as follows (details see  REF _Ref207680839 \r \h 9.3): "/profiles" is the container of all client settings profiles. At least one profile is required, multiple profiles can be used to maintain settings for synchronizing with more than one SyncML server. "/profiles" contains the special "settingstatus" and "overwrite" values used to check "health" of current settings, as described in  REF _Ref185318147 \r \h 5.2.3.1. Profiles within "/profiles" must be opened by using OpenSubkey(), usually by iterating over available profiles using the special KEYVAL_ID_FIRST and KEYVAL_ID_NEXT values as id. Each profile contains a number of session level settings values, like "serverURI", "serverUser" etc. - these are accessed using GetValueXXX and SetValueXXX routines. Each profile contains a "targets" container key which can be opened by OpenKeyByPath(). "targets" contains a target key for each datastore supported by the SyncML client engine (that is, those defined in the XML configuration). Each target must be opened using OpenSubKey(), using the numeric identifier specified with in the XML config for each datastore. It is also possible to iterate over all targets using the special KEYVAL_ID_FIRST and KEYVAL_ID_NEXT values as id. Each target contains a number of datastore level settings values, like "syncmode", "remotepath" etc. - these are accessed using GetValueXXX and SetValueXXX routines. When accessing these settings, make sure you don't close container keys as long as subkeys contained are still open. So usually, keys are opened in the order "/profiles", profile, "targets", target and closed in the reverse order. It is allowed to have multiple profiles or targets open at the same time, as long as the parent key remains open as well. Running Sync Sessions Running a sync session consists of three basic steps: creating a sync session using OpenSession() calling SessionStep() repeatedly in a loop until it returns STEPCMD_DONE. The return value in aStepCmd (see "engine_defs.h" for SESSIONSTEP_xxx definitions) must be checked to see when the engine has SyncML data ready to send to the SyncML server or needs an answer from the SyncML server. If so, the needed comminication with the server (http, OBEX) must take place using GetSyncMLBuffer()/RetSyncMLBuffer() or ReadSyncMLBuffer()/WriteSyncMLBuffer() routines to get or put SyncML data. For Java applications, only Read/WriteSyncMLBuffer are available. To send data to the SyncML server, the application must query the SyncML engine for the URL and content type to use by opening the session-local session key using OpenSessionKey() and querying its "connectURI" and "contenttype" values. The communication channel can be held open between calls to SessionStep() until STEPCMD_RESTART is returned in aStepCmd. Each call to SessionStep() returns a record of TEngineProgressInfo type, which indicates progress of the sync session. The information in this record is useful to show progress in the UI of the application. See "engine_defs.h" for progress event PEV_XXX definitions. closing the sync session using CloseSession() The following C code skeleton shows the basic implementation required to run a sync session: // Assume that UI_Call_In *callInP contains the call-in structure // as returned by ConnectEngine() // run a sync session // - variables TEngineProgressInfo progressInfo; appPointer sessionH = NULL; TSyError sta; uInt16 stepCmd = STEPCMD_CLIENTSTART; // first step const memSize textbuffersize = 300; memSize textsize; char textbuffer[textbuffersize]; // - create a session sta = callInP->OpenSession(callInP,&sessionH,0,"mySyncSession"); if (sta!=LOCERR_OK) { // error, exit exit(1); } // sync main loop do { // take next step sta = callInP->SessionStep(callInP,sessionH,&stepCmd,&progressInfo); if (sta!=LOCERR_OK) { // error, terminate with error stepCmd=STEPCMD_ERROR; } else { // step ran ok, evaluate step command switch (stepCmd) { case STEPCMD_OK: // no progress info, call step again stepCmd = STEPCMD_STEP; break; case STEPCMD_PROGRESS: // new progress info to show // Check special case of interactive display alert if (progressInfo.eventtype==PEV_DISPLAY100) { // alert 100 received from remote, message text is in // SessionKey's "displayalert" field appPointer sessionKeyH; sta = callInP->OpenSessionKey(callInP,sessionH,&sessionKeyH,0); if (sta==LOCERR_OK) { // get message from server to display callInP->GetValue( callInP, sessionKeyH, "displayalert", VALTYPE_TEXT, // we want the value as 16-bit integer (appPointer)&textbuffer, // put value here textbuffersize, // size of variable &textsize ); // tbd: display message to user callInP->CloseKey(callInP,sessionH); } } else { // normal progress info // tbd: show progress in the UI } stepCmd = STEPCMD_STEP; break; case STEPCMD_ERROR: // error, terminate (should not happen, as status is // already checked above) break; case STEPCMD_RESTART: // make sure connection is closed and will be re-opened for next request // tbd: close communication channel if still open to make sure it is // re-opened for the next request stepCmd = STEPCMD_STEP; break; case STEPCMD_SENDDATA: // send data to remote // tbd: use OpenSessionKey() and GetValue() to retrieve "connectURI" // and "contenttype" to be used to send data to the server // tbd: use GetSyncMLBuffer()/RetSyncMLBuffer() to access the data to be // sent or have it copied into caller's buffer using // ReadSyncMLBuffer(), then send it to the server // status for next step if (true) /* tbd: check if communication with server successful */ stepCmd = STEPCMD_SENTDATA; // we have sent the request data else stepCmd = STEPCMD_TRANSPFAIL; // communication with server failed break; case STEPCMD_NEEDDATA: // tbd: wait for receiving answer from server // tbd: put answer received into SyncML engine's buffer, either by // directly accessing it using GetSyncMLBuffer()/RetSyncMLBuffer() // or by copying it with WriteSyncMLBuffer(). // status for next step if (true) /* tbd: check if communication with server successful */ stepCmd = STEPCMD_GOTDATA; // we have received response data else stepCmd = STEPCMD_TRANSPFAIL; // communication with server failed break; } // switch stepcmd } // check for suspend or abort, if so, modify step command for next step if (false /* tdb: check if user requests suspending the session */) { stepCmd = STEPCMD_SUSPEND; } if (false /* tdb: check if user requests aborting the session */) { stepCmd = STEPCMD_ABORT; } // loop until session done or aborted with error } while (stepCmd!=STEPCMD_DONE && stepCmd!=STEPCMD_ERROR); // done, now close the SyncML session sta = callInP->CloseSession(callInP,sessionH); SessionStep() is designed to keep execution time as short as possible, such that implementing a responsive SyncML client is possible without using a separate thread. The code skeleton above can be integrated in a GUI application main loop to allow processing SyncML, showing progress in the UI and responding to user's requests (like pressing an abort button) in parallel. NOTE: It’s recommend (on Windows systems) to initialize the network access before opening the session for the first time. That’s because the information will be taken from network information, if available. Setup Guide This setup guide consists of two main sections: Section  REF _Ref43725462 \r \h  \* FORMATVERBINDEN 6.1 describes the installation of the C/C++ interface, Section  REF _Ref150068798 \r \h 6.2 describes the usage of the JNI interface for Java. We recommend, that if you are new to Synthesis SyncML Server/Client, start testing with the standalone version as you have immediate visible feedback on the console screen. If everything is working fine, then you can easily switch to the ISAPI or Apache version. For installation of the ISAPI or Apache version see the description of „SySync_Server_manual“. Plug-in System for C/C++ Metrowerks CodeWarrior project files ( .mcp) are part of the SDK delivery for Windows, Linux and MacOSX, as well as the compiled shared libraries. The examples are based on CodeWarrior V8.X for Windows and V9.X for MacOSX. For Windows alternatively Visual Studio 2005 can be used. Ready-to-use *.vcproj files are part of the SDK package. For Linux, a generated makefile „Sysync_SDK_linux.mk“ is part of delivery as well and can be used directly by calling „make“: make –f Sysync_SDK_linux.mk. For MacOSX XCode can be used to create Universal Binaries which are working on PPC and X86 architectures. Three plug-in modules (a simple demo module in pure „C“ , a text DB module in „C++“ and a module for adapting items) can be compiled and linked directly. Result will be the three shared library modules „SDK_demodb“ , „SDK_textdb“ and „adaptitem“. .dll for Windows, .so for Linux, .dylib for MacOSX Standard C example: The „SDK_demodb“ is just printing a debug message for each routine. This can be a good and helpful starting point to implement routine by routine. Writing debug messages is done thru the callback mechanism of the SyncML engine, using the „Debug_DB“ call. The debug messages will be stored in the SyncML engine’s log files. Don’t use „printf“ calls, as not all versions of the Synthesis SyncML server are able to create such kind of output. C++ example: The „SDK_textdb“ is a text DB interface, which acts the same way as the so called Synthesis SyncML demo server. This module can be a starting point when it’s easier to adapt from an already running system. Plugin parameters , and are supported. NOTE: The CurrentTime() function used at „Session_GetDBtime“ and „StartDataRead“ is implemented very rudimentary. For a good implementation, this function should be replaced by an enhanced version. The example configuration „syncserv_odbc.xml“ is set up to access the „SDK_textdb“ directly by default. is configured for „SDK_textdb“ on session and datastore level. The admin tables of the „SDK_textdb“ will be used. For Linux and MacOSX „LD_LIBRARY_PATH“ must be set in order to access these plugin library modules. Plug-in System for Java The Java Virtual Machine V1.4 or higher must be correctly installed. For Linux and MacOSX „LD_LIBRARY_PATH“ must be set to access the JavaVM, e.g. at “/usr/java/jre/lib/i386/client“ or „/usr/java/jre/lib/i386/server“. For MacOSX this is normally „/system/Library/Frameworks/JavaVM.frameworks/Libraries“. There is a Java example „SDK_javadb.java“ and its compiled classes (which have been created with „javac SDK_javadb.java“). The SDK class can also be within a Java package: A package example (named „sysync“) can be found in the subdirectory „sysync“. The functionality of the package sample is identical to the one on the top level. A package can be accessed by adding the package name, separated by a space. JavaVM options can be added after the class and package name. Examples: [JNI!SDK_javadb sysync] [JNI!SDK_javadb sysync –verbose:jni] The SyncML engine (PRO version only) has a built-in plug-in module for the JNI handling. The identical plug-in is also available in compiled form as shared library „JNI.dll“ for test purposes (but not as part of the SDK). For an operative environment, this external plug-in will not be used, because the internal JNI is the preferred solution. For UI applications, written in Java, the engine connection will be done with a „ConnectEngine“ call, which then provides access to all the UI application specific functions. A simple sample program how to use the interface is part of the SDK: uiapp.java Example: java –cp . uiapp.java Plug-in System for C# Will be accessed via GUID. There is a common GUID for the interface (which shouldn’t be changed and a class specific GUID. The class specific GUID will be expected as subname at the config file. GUIDs must be registered to the system using „regasm“. regasm dbapi_csharp.dll /tlb: dbapi_csharp.tlb Example: CSHARP!348330a6-c7ee-4ba4-888b-39250cb31db1" Plug-in module XML configuration Plug-in modules must be activated at the XML configuration file. This can be done for the session and/or each datastore separately. It is even possible to use different plug-ins for the session and each datastore. For the session, must be set. The must be set to the plug-in name, e.g. SDK_textdb As there are built-in modules and external modules, the syntax for internal plug-ins is using brackets. Example: - Internal demo plug-in: [SDK_demodb] - Shared library for demo plug-in: SDK_demodb Built-in means, that the plug-in is compiled and statically linked to the SyncML engine. Only Synthesis can create built-in modules; the SDK user can only create external modules as shared libraries. „SDK_demodb“ and „SDK_textdb“ are available both as built-in and as external modules. The PRO version of the Synthesis server contains the JNI as built-in plug-in module. For system performance, there is no measurable difference between internal / external modules. By default, the SyncML engine doesn’t use authentification and device administration of the plug-in module. They must be switched on in the configuration. To use the login part of the plug-in, yes must be set. To use the admin part of the plug-in, yes is required. For the datastore access, must be set, where the NAME is e.g. „contacts“. The must be set the same way as for the session. If is active on session level, it will be used for each datastore as well. Module naming convention The Synthesis SyncML plug-in modules will used with the following naming convention: name A shared library „name.dll“ ( or „name.so“ for Linux ) must exist in the search path of the system. The SyncML engine will create an error 20010, if the library does not exist. „name“ can consist of a main module name and sub module names, e.g. „aaa!bbb“, where ‚aaa’ is the name of the library ( „aaa.dll“ ) and ‚bbb’ is a local name for the plug-in module. This concept allows to build cascades or hierarchies of plug-ins, where the sub module name is given to the next plug-in module. „aaa!bbb!ccc“ is an example for a plug-in with a two level sub system. Example: The bridge to Java The Java plug-in is an example of such a sub system: The syntax for the SDK sample must be: JNI!SDK_javadb Here we have a plug-in called „JNI.dll“ which is the bridge between the SyncML engine (written in C++) and the the Java plug-in (SDK_javadb) with the static class „SDK_javadb“. Error 20034 will be returned, if the sub system is not available. For Java, the CLASSPATH can be included directly as well. As an example for a classpath at „C:\java_files“, the Java Virtual Machine will be attached correctly with: [JNI!C:\java_files\SDK_javadb] NOTE: SDK V1.3.8.X and later allow to connect more than one Java class with a given class-path and package name for different plugin sections, however the VM options are the same and will be shared among all Java plugins. The options of the first connecting context (usually the session context) will considered, options of other sections will be ignored. NOTE: The plugin module names are case sensitive in some cases, e.g. in Java environment. C# database adapters are using a GUID as sub system name: Example: C# bridge CSHARP!348330a6-c7ee-4ba4-888b-39250cb31db1" Plugin_Info program A utility program for testing plugin modules independently is part of the SDK. It returns some version and identification info about a plugin: Example: plugin_info –p SDK_textdb Synthesis Plugin_Info Tool V1.5.2.0 Name : SDK_textdb Version : V1.5.2.0 ... at least : V1.5.1.0 required as engine's SDK version Version : V1.5.2.0 Manufacturer : Synthesis AG Description : Text database module. Writes data directly to TDB_*.txt file Platform : Windows (CodeWarrior) (DLL) GlobContext : 0014AAB0 (00159868 'TextDB') plugin_sessionauth : yes plugin_deviceadmin : yes plugin_datastoreadmin : yes plugin_datastore : yes plugin_dataadapt : yes ADMIN_Info : yes Session context : available (0015C1F0) Datastore context (admin) : available (0015C280) Datastore context (data) : available (0015CF58) Example: plugin_info –p “[JNI!SDK-javadb sysync]“ Synthesis Plugin_Info Tool V1.5.2.0 Name : [JNI!SDK_javadb sysync] Version : V1.5.2.0 ... at least : V1.5.1.0 required as engine's SDK version Name : JNI Version : V1.5.2.0 Manufacturer : Synthesis AG Description : JNI bridge to Java Platform : Windows (CodeWarrior) (LIB) GlobContext : 0014B130 (00145158 'JNI') sub system ---------- Name : SDK_javadb sysync Version : V1.5.2.0 Manufacturer : Synthesis AG Description : Java Example Module (package) Platform : Java plugin_sessionauth : yes plugin_deviceadmin : yes plugin_datastoreadmin : yes plugin_datastore : yes plugin_dataadapt : yes ADMIN_Info : yes Session context : available (0014C1B8) Datastore context (admin) : available (0014C430) Datastore context (data) : available (0014C6B8) The program allows to get some debug information (with options –d and –e) as well as forcing any desired engine SDK version other than the current version for test (option –v). For Linux and MacOSX „LD_LIBRARY_PATH“ must be set in order to access these plugin library modules. UIApi C# interface For C# there exists an equivalent SDK interface to the UI functions of the engine. The usage of the functions is identical, they are implemented via delegate marshal calls. The interface definition can be found in the program.cs example of the SDK package. „ConnectEngineS“ and „DisconnectEngine“ are implemented as DLL calls. The difference to the function „ConnectEngine“ is, that the SDK_Interface_Struct will allocated on the C# side; will be needed additionally. class Program { const String DllName = "syncclient_test.dll"; static debug_calls d = new debug_calls(); static uiapp_calls u = new uiapp_calls(); // ... // ---------------------------------------------------------------------------------- [DllImport(DllName)] public static extern TSyError ConnectEngineS ( ref SDK_Interface_Struct aCB, UInt16 aCallbackVersion, ref UInt32 aEngVersion, UInt32 aPrgVersion, UInt16 aDebugFlags ); [DllImport(DllName)] public static extern TSyError DisconnectEngine( ref SDK_Interface_Struct aCB ); // ... } As an example, the „InitEngineXML“ call is shown below. The whole UI call in is implemented as class „uiapp_calls“ at „sysync_uiapp_calls“ as part of the SDK package. public class uiapp_calls { // The method prototype definitions ... delegate TSyError InitEngineXML_Func ( ref SDK_Interface_Struct aCB, String aConfigXML ); // ... and the marshal calls public TSyError InitEngineXML( ref SDK_Interface_Struct aCB, String aConfigXML ) { IntPtr ip= aCB.InitEngineXML; InitEngineXML_Func v= (InitEngineXML_Func)Marshal.GetDelegateForFunctionPointer( ip, typeof(InitEngineXML_Func) ); return v( ref aCB, aConfigXML ); } // InitEngineXML // ... } Change History Changes since SDK V1.0.0.2 For customers who have started to implement a plug-in with SDK V1.0.0.2, some adaptions must be made to make it conformant to SDK V1.3.8.X. Best way to do this, is to install this new SDK package and adapt the plug-in’s c/cpp or java files. The SyncML engine is written to be downwards compatible for all these features, so it will run correctly with all versions, as long as the „Plugin_Version“ of SDK_util will return the correct version number, so this version number MUST NOT be changed ( except for the customer defined build number, which represents the last digit 0..255 of the version number ). Upwards compatibility ( SDK version newer than engine ) are covered partly, because an older engine cannot handle cases of changed parameter lists or no longer existing functions or methods. However the engine informs the plugin about its version (NOTE: this is not SyncML server’s / client’s version, e.g. V2.1.1.28, but the plugin interface version, e.g. V1.5.2.0). Additionally the plugin returns (with „Module_Capabilities“ ) the minimum required version. The server automatically stops then with an error 20033 if the this build is too old for this SDK/plugin. The following things MUST BE CHANGED: Module_PluginParams: Has now a new additional parameter (to inform the plug-in about its version) Callback calls: Up to callbackVersion = 5 is now supported, see structure definition at „sync_dbapidef.h“. Hierarchical logs and exotic output are supported now. Boolean alignment problems are fixed. DeleteBlob: New function added ( allows consistent BLOB handling now ) Session_AdaptItem, New functions added, these function will allow the manipulation AdaptItem: of variables of the script context ( They are not yet supported by the SyncML engine, but the implementation is prepared now ). InsertMapItem: New function added, no longer combined with „UpdateMapItem“ MapID: The MapID struct contains a new element uInt8 ident.. It will be used to store the status of Suspend/Resume of OMA DS 1.2. Build numbers: System has changed from V1.0.N.2, where „N“ was the platform identifier, to V1.3.8.X, where „X“ is a customer defined build number. StartDataRead: Has now a new additional parameter for OMA DS 1.2 support ( Suspend/Resume ). Session_GetDBTime: New function added ( returns the database’s time, if available ) DB_Full: Definition has been changed from 520 to 420. DBG_PLUGIN_XXX: A separate flag system (with 16 flags) for the plugin debug logging has been introduced. Bits 0 and 1 are defined and reserved. DEBUG_Exotic: Has been separated into DEBUG_Exotic_Call and DEBUG_Exotic_DB. Session_Login (Java only): Parameter „String sPwd“ has been changed to „VAR_String sPwd“, to allow the usage of all password modes. Changes since SDK V1.3.0 JCallback (Java only): The callback functions are now using as 1st return parameter. This solves a problem with using Java packages. Example: public native void DebugDB( int thisCB, String aTxt ); Module_Capabilites: „ADMIN_Info“ will be considered now, it adds the identifier „ADMIN“ to at admin’s „CreateContext“. FilterContext: Is supported by the SyncML engine for SDK version >= V1.3.8. Callback calls: Up to callbackVersion = 8 is now supported, see structure definition at „sync_dbapidef.h“. UI Api: Is supported by the SyncML engine for SDK version >= V1.4.0 callbackVersion = 8 with the UI interface functions will be used. DatastoreContext: 4 additional functions „*AsKey“ have been added. They allow an handling instead of using . Is supported by the SyncML engine for SDK version >= V1.4.0 SDK_Interface_Structure: is the new name of the former „DB_Callback_Structure“. Two (equivalent) pointer types for this structure are defined now: The already existing „DB_Callback“ for the DBApi SDK and „UI_Call_In“ for the UIApi SDK. Changes since SDK V1.4.0 C# (dbapi) DebugDB and other callback calls can log now to the engine’s log file directly: „sysync_debug_calls.cs“ is part of the SDK now. [MarshalAs(UnmanagedType.LPWStr)] will be used now for all string parameters (instead of LPStr), the SyncML engine will make the conversion from/to UTF-8 internally. The new files „dbapi_interface.cs“ and „sysync_debug_calls.cs“ (with the LPWStr defs) must be used. C# (uiapp) The UI call in methods have changed from direct DLL calls to marshalled delegate calls: „sysync_uiapp_calls.cs“ is part of the SDK now. C# ConnectEngineS Must be used instead of „ConnectEngine“ now. InsertItem DB Plugin may return a DB_DataMerged (207) error which informs the engine about an already existing item which has been updated now. The engine will read this item again to keep track of this update (either in the same or the next session). NOTE: This feature is supported for server only. Callback calls: Up to callbackVersion = 9 is now supported, see structure definition at „sync_dbapidef.h“. FinalizeLocalID: New function has been added to replace a temporary ID sion by its final ID at the end of the session. The function can return LOCERR_NOTIMP, if not needed. DeleteSyncSet:: All elements of the sync set will be removed. If the function returns LOCERR_NOTIMP, the engine will remove element by element. Changes since SDK V1.5.0 GlobContext „GlobContext“ extended for multi module usage SDK_textdb example Adapted for GlobContext use Callback calls: Up to callbackVersion = 11 is now supported, see structure definition at „sync_dbapidef.h“. OceanBlue/SnowWhite C++ example added SDK_textdb example NID_* file has been added, containing a persistent new ID for inserted items. For more details of the SDK change history see „sync_dbapidef.h“. DBApi Interface description Function overview TSyError Module_CreateContext (CContext *mContext, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB) CVersion Module_Version (CContext mContext) TSyError Module_Capabilities (CContext mContext, appCharP *mCapabilities) TSyError Module_PluginParams (CContext mContext, cAppCharP mConfigParams, CVersion engineVersion) void Module_DisposeObj (CContext mContext, void *memory) TSyError Module_DeleteContext (CContext mContext) TSyError Session_CreateContext (CContext *sContext, cAppCharP sessionName, DB_Callback sCB) TSyError Session_AdaptItem (CContext sContext, appCharP *sItemData1, appCharP *sItemData2, appCharP *sLocalVars, uInt32 sIdentifier) TSyError Session_CheckDevice (CContext sContext, cAppCharP aDeviceID, appCharP *sDevKey, appCharP *nonce) TSyError Session_GetNonce (CContext sContext, appCharP *nonce) TSyError Session_SaveNonce (CContext sContext, cAppCharP nonce) TSyError Session_SaveDeviceInfo (CContext sContext, cAppCharP aDeviceInfo) TSyError Session_GetDBTime (CContext sContext, appCharP *currentDBTime) sInt32 Session_PasswordMode (CContext sContext) TSyError Session_Login (CContext sContext, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey) TSyError Session_Logout (CContext sContext) void Session_DisposeObj (CContext sContext, void *memory) void Session_ThreadMayChangeNow (CContext sContext) void Session_DispItems (CContext sContext, bool allFields, cAppCharP specificItem) TSyError Session_DeleteContext (CContext sContext) TSyError CreateContext (CContext *aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey) uInt32 ContextSupport (CContext aContext, cAppCharP aContextRules) uInt32 FilterSupport (CContext aContext, cAppCharP aFilterRules) TSyError LoadAdminData (CContext aContext, cAppCharP aLocalDB, cAppCharP aRemoteDB, appCharP *adminData) TSyError SaveAdminData (CContext aContext, cAppCharP adminData) bool ReadNextMapItem (CContext aContext, MapID mID, bool aFirst) TSyError InsertMapItem (CContext aContext, MapID mID) TSyError UpdateMapItem (CContext aContext, MapID mID) TSyError DeleteMapItem (CContext aContext, MapID mID) void DisposeObj (CContext aContext, void *memory) void ThreadMayChangeNow (CContext aContext) void WriteLogData (CContext aContext, cAppCharP logData) void DispItems (CContext aContext, bool allFields, cAppCharP specificItem) TSyError AdaptItem (CContext aContext, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, uInt32 aIdentifier) TSyError StartDataRead (CContext aContext, cAppCharP lastToken, cAppCharP resumeToken) TSyError ReadNextItem (CContext aContext, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst) TSyError ReadNextItemAsKey (CContext aContext, ItemID aID, appPointer aItemKey, sInt32 *aStatus, bool aFirst) TSyError ReadItem (CContext aContext, ItemID aID, appCharP *aItemData) TSyError ReadItemAsKey (CContext aContext, const ItemID aID, appPointer aItemKey) TSyError ReadBlob (CContext aContext, const ItemID aID, cAppCharP aBlobID, void **aBlkPtr, unsigned long *aBlkSize, unsigned long *aTotSize, bool aFirst, bool *aLast) TSyError EndDataRead (CContext aContext) TSyError StartDataWrite (CContext aContext) TSyError InsertItem (CContext aContext, cAppCharP aItemData, ItemID newID) TSyError InsertItemAsKey (CContext aContext, appPointer aItemKey, ItemID newID) TSyError FinalizeLocalID (CContext aContext, const ItemID aID, ItemID updID) TSyError UpdateItem (CContext aContext, cAppCharP aItemData, const ItemID aID, ItemID updID) TSyError UpdateItemAsKey (CContext aContext, appPointer aItemKey, const ItemID aID, ItemID updID) TSyError MoveItem (CContext aContext, const ItemID aID, cAppCharP newParentID) TSyError DeleteItem (CContext aContext, const ItemID aID) TSyError DeleteSyncSet (CContext aContext) TSyError WriteBlob (CContext aContext, const ItemID aID, cAppCharP aBlobID, void *aBlkPtr, unsigned long aBlkSize, unsigned long aTotSize, bool aFirst, bool aLast) TSyError DeleteBlob (CContext aContext, const ItemID aID, cAppCharP aBlobID) TSyError EndDataWrite (CContext aContext, bool success, appCharP *newToken) TSyError DeleteContext (CContext aContext) Function Documentation XE "AdaptItem:sync_dbapi.h"XE "sync_dbapi.h:AdaptItem"_ENTRY_ TSyError AdaptItem (CContext aContext, appCharP * aItemData1, appCharP * aItemData2, appCharP * aLocalVars, uInt32 aIdentifier) This function adapts aItemData Parameters: The datastore context The 1st item's data The 2nd item's data The local vars To identify, where it is called Returns: error code NOTE: The memory for adapted strings must be allocated locally. The SyncML engine will call 'DisposeObj' later, to release again its memory. One or more strings can be returned unchanged as well. XE "ContextSupport:sync_dbapi.h"XE "sync_dbapi.h:ContextSupport"_ENTRY_ uInt32 ContextSupport (CContext aContext, cAppCharP aSupportRules) This function asks for specific context configurations Parameters: The datastore context The SyncML sends a list of support rules. This function has to reply, up to which rule, contexts are supported (and switched on now). Data is formatted as multiline aa:bbcc:dd[] Returns: Up to fields are supported (and switched on) for this context. If 0 will be returned, no field of is supported. XE "CreateContext:sync_dbapi.h"XE "sync_dbapi.h:CreateContext"_ENTRY_ TSyError CreateContext (CContext * aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey) This routine is called to create a new context for a datastore access. It must allocate all resources for this context and initialize the parameter with a value that allows re-identifying the context. can either be a pointer to the local context structure or any key value which allows to re-identify the context later. Subsequent calls related to this context will pass the value as returned from CreateContext. The context must be valid until 'DeleteContext' is called. can be defined individually. NOTE: The SyncML engine treats simply as a key. The only condition is uniqueness for all datastore contexts. Even = 0 can be used. Parameters: Returns a value, which allows to identify this datastore context. Allows to identify the context, if more than one must be handled. is defined at the XML configuration. DB_Callback structure for datatstore logging. The result of 'Session_CheckDevice' comes in here. The result of 'Session_Login' comes in here. Returns: error code, if context could not be created (e.g. not enough memory), 0 if context successfully created. XE "DeleteBlob:sync_dbapi.h"XE "sync_dbapi.h:DeleteBlob"_ENTRY_ TSyError DeleteBlob (CContext aContext, const ItemID aID, cAppCharP aBlobID) This routine deletes the specific binary logic block at the database. Parameters: The datastore context. ItemID ( with , ). The assigned ID of the blob. Returns: error code, if not ok ( e.g. invalid , ) XE "DeleteContext:sync_dbapi.h"XE "sync_dbapi.h:DeleteContext"_ENTRY_ TSyError DeleteContext (CContext aContext) This routine is called to delete a context, that was previously created with 'CreateContext'. The DB Module must free all resources related to this context. No calls with will be done after calling this routine, so the assigned structure, allocated at 'CreateContext' can be released here. Parameters: The datastore context. Returns: error code, if context could not be deleted ( e.g. not existing ). XE "DeleteItem:sync_dbapi.h"XE "sync_dbapi.h:DeleteItem"_ENTRY_ TSyError DeleteItem (CContext aContext, const ItemID aID) This routine deletes a dataset from the database Parameters: The datastore context. ItemID ( with , ) to be deleted. Returns: error code LOCERR_OK ( =0 ), if successful DB_NotFound ( =404 ), if unknown ... or any other SyncML error code, see Reference Manual XE "DeleteMapItem:sync_dbapi.h"XE "sync_dbapi.h:DeleteMapItem"_ENTRY_ TSyError DeleteMapItem (CContext aContext, MapID mID) Map table handling: Delete a map item of this context Parameters: The datastore context MapID ( with , and ). Returns: error code, if this MapID can't be deleted, or if this MapID does not exist. USED ONLY WITH XE "DeleteSyncSet:sync_dbapi.h"XE "sync_dbapi.h:DeleteSyncSet"_ENTRY_ TSyError DeleteSyncSet (CContext aContext) This routine deletes all datasets from the database Parameters: The datastore context. Returns: error code LOCERR_OK ( =0 ), if successful LOCERR_NOTIMP ( =20030 ). For this case, the engine removes all items directly ... or any other SyncML error code, see Reference Manual XE "DispItems:sync_dbapi.h"XE "sync_dbapi.h:DispItems"_ENTRY_ void DispItems (CContext aContext, bool allFields, cAppCharP specificItem) Writes the context of all items to dbg output path This routine is implemented for debug purposes only and will NOT BE CALLED by the SyncML engine. Can be implemented empty, if not needed. Parameters: The datastore context. true : all fields, also empty ones, will be displayed; false: only fields <> "" will be shown "" : all items will be shown; else : shows the Returns: - XE "DisposeObj:sync_dbapi.h"XE "sync_dbapi.h:DisposeObj"_ENTRY_ void DisposeObj (CContext aContext, void * memory) Disposes memory, which has been allocated within the datastore context. 'DisposeObj' can occur at any time within . Parameters: The datastore context. Dispose allocated memory. Returns: - XE "EndDataRead:sync_dbapi.h"XE "sync_dbapi.h:EndDataRead"_ENTRY_ TSyError EndDataRead (CContext aContext) This routine terminates the read from database phase It can be used e.g. for termination of a transaction. In standard case it can be implemented empty, returning simply a value LOCERR_OK = 0. Parameters: The datastore context. Returns: error code XE "EndDataWrite:sync_dbapi.h"XE "sync_dbapi.h:EndDataWrite"_ENTRY_ TSyError EndDataWrite (CContext aContext, bool success, appCharP * newToken) Advises the database to finsish the running transaction Parameters: The datastore context. true: All former actions were successful, so the database can commit false: The transaction was not successful, so the database may rollback or ignore the transaction. An internally generated string value, which will be used to identify changed database records. It is normally an ISO8601 formatted string, which represents the module's current time (at the time the 'StartDataRead' of this context has been called). All changed records of the currrent context must get this token as timestamp as as well. The SyncML engine will return this value with the 'StartDataRead' call within the next session. It must return NULL in case of no . Returns: error code, if operation can't be performed. No is not an error. NOTE: By default, the SyncML engine expects an ISO8601 string for . But the SyncML engine can be configured to treat this value completely opaque, if implemented in a different way. The must be allocated locally and will be disposed with a 'DisposeObj' call later by the SyncML engine. XE "FilterSupport:sync_dbapi.h"XE "sync_dbapi.h:FilterSupport"_ENTRY_ uInt32 FilterSupport (CContext aContext, cAppCharP aFilterRules) This function asks for filter support. Parameters: The datastore context The SyncML sends a list of filter rules. This function has to reply, up to which rule, filters are supported (and switched on now). Data is formatted as multiline aa:bbcc:dd[] Returns: Up to filters are supported (and switched on) for this context If 0 will be returned, no field of are supported. XE "FinalizeLocalID:sync_dbapi.h"XE "sync_dbapi.h:FinalizeLocalID"_ENTRY_ TSyError FinalizeLocalID (CContext aContext, const ItemID aID, ItemID updID) This routine updates a temporary to an at the end For cached systems which assign IDs at the end of a run. Parameters: The datastore context. Database key of dataset to be updated Input: NULL is assigned as default value to and . Output: The updated database key for . Can be NULL, if the same as Returns: error code LOCERR_OK ( =0 ), if successful DB_Forbidden ( =403 ), if can't be resolved DB_NotFound ( =404 ), if unknown LOCERR_NOTIMP ( =20030 ), if no finalizing is needed at all ... or any other SyncML error code, see Reference Manual NOTE: must either contain NULL references ( if the same as ), or the memory for must be allocated locally. The SyncML engine will call 'DisposeObj' later for to release the memory. should be always NULL. XE "InsertItem:sync_dbapi.h"XE "sync_dbapi.h:InsertItem"_ENTRY_ TSyError InsertItem (CContext aContext, cAppCharP aItemData, ItemID aID) This routine inserts a new dataset to the database. The assigned new ItemID will be returned. Parameters: The datastore context. The data, formatted as multiline aa:bbcc:dd[] Database key of the new dataset. Returns: error code LOCERR_OK ( =0 ), if successful DB_DataMerged ( =207 ), if successful, but "ReadItem" requested to inform about updates DB_Forbidden ( =403 ), if can't be resolved DB_Full ( =420 ), if not enough space in the DB ... or any other SyncML error code, see Reference Manual NOTE: The memory for must be allocated locally. The SyncML engine will call 'DisposeObj' later for , to release the memory XE "InsertItemAsKey:sync_dbapi.h"XE "sync_dbapi.h:InsertItemAsKey"_ENTRY_ TSyError InsertItemAsKey (CContext aContext, appPointer aItemKey, ItemID aID) XE "InsertMapItem:sync_dbapi.h"XE "sync_dbapi.h:InsertMapItem"_ENTRY_ TSyError InsertMapItem (CContext aContext, MapID mID) Map table handling: Insert a map item of this context Parameters: The datastore context MapID ( with , and ). A new item with will be added. Returns: error code, if this MapID can't be inserted, or if already existing USED ONLY WITH XE "LoadAdminData:sync_dbapi.h"XE "sync_dbapi.h:LoadAdminData"_ENTRY_ TSyError LoadAdminData (CContext aContext, cAppCharP aLocalDB, cAppCharP aRemoteDB, appCharP * adminData) This function gets the stored information about the record with the four paramters: , , , . yes: Admin/Map routines will be used. Parameters: The datastore context Name of the local DB Name of the remote DB The data, saved with the last 'SaveAdminData' call Returns: error code 404 (NotFound), if record is not (yet) available, 0 (no error) if admin data found NOTE: and have been passed with 'CreateContext' already. The plug-in module must have stored them within the datastore context. USED ONLY WITH XE "Module_Capabilities:sync_dbapi.h"XE "sync_dbapi.h:Module_Capabilities"_ENTRY_ TSyError Module_Capabilities (CContext mContext, appCharP * mCapabilities) Get the module's capabilities Currently the SyncML engine currently understands and supports: "plugin_sessionauth" "plugin_deviceadmin" "plugin_datastoreadmin" "plugin_datastore" If one of these identifiers will be defined as "no" ( e.g. "plugin_sessionauth:no" ), the according routines will not be connected and used. NOTE: The can be allocated with "StrAlloc" (SDK_util.h) for C/C++ Parameters: The module context. Returns the module's capabilities as multiline aa:bbcc:dd[] Returns: error code XE "Module_CreateContext:sync_dbapi.h"XE "sync_dbapi.h:Module_CreateContext"_ENTRY_ TSyError Module_CreateContext (CContext * mContext, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB) Create a module context This routine will be called as the 1st or 2nd call, when this module will be connected. (The 1st call is usually a 'Module_Version( 0 )' call outside any context). It will be called not only once, but for each session and datastore context, as defined at the XML config file. This routine can return error 20028 (LOCERR_ALREADY), if already created. This will be treated not as an error. For this case, it must return the same as for the former call(s). NOTE: The module context can exist once and can be shared for all plug-in accesses. Please note, that write access to such a common module context structure must be thread-safe, when accessed from the session or datastore context. All the 'Module_CreateContext' calls for this module will be called sequentially by one thread. The plug-in programmer is responsible not to re-initialize the context for subsequent calls. If the module name at the XML config file is defined as "aaa!bbb!ccc" it will be passed as "aaa" to and "bbb!ccc" to . This mechanism can be used to cascade plug-in modules, where the next module gets "bbb" as and "ccc" as . The JNI plug-in for Java is using this structure to address the JNI plug-in and its assigned Java class. Parameters: Returns a value, which allows to identify this module context. Allowed values: Anything except 0, which is reserved for no context. Name of this plug-in Name of sub module (if available) Name of the (datastore) context, e.g. "contacts"; this string is empty for calll concerning the session. DB_Callback structure for module logging Returns: error code, if context could not be created (e.g. not enough memory), 0 if context successfully created. XE "Module_DeleteContext:sync_dbapi.h"XE "sync_dbapi.h:Module_DeleteContext"_ENTRY_ TSyError Module_DeleteContext (CContext mContext) This routine will be called as the last call, before this module is disconnected. The SyncML engine will call 'Module_DisposeObj' (if required) before this call NOTE: This routine will be called ONLY, if the server stops in a controlled way. Its good programming practice not to wait for this 'DeleteContext' call. Parameters: The module context. Returns: error code XE "Module_DisposeObj:sync_dbapi.h"XE "sync_dbapi.h:Module_DisposeObj"_ENTRY_ void Module_DisposeObj (CContext mContext, void * memory) Disposes memory, which has been allocated within the module context. (At the moment this is only the capabilities string). 'Module_DisposeObj' can occur at any time within . NOTE: - If has been allocated with "StrAlloc", use "Str_Dispose" (SDK_util.h) to release the memory again. If it is defined as const within the plugin module (the module itself knows about !), this routine can be implemented empty. Parameters: The module context. Dispose allocated memory. Returns: - XE "Module_PluginParams:sync_dbapi.h"XE "sync_dbapi.h:Module_PluginParams"_ENTRY_ TSyError Module_PluginParams (CContext mContext, cAppCharP mConfigParams, CVersion engineVersion) The module's config params will be sent to the plug-in. It can be used for access path definitions or other things. The can be defined individually for each session and datastore. The SyncML engine checks the syntax, but not the content. This routine should return an error 20010 (LOCERR_CFGPARSE), if one of these parameters is not supported. EXAMPLE: Definition at XML config file: /var/log/sysync 42 will be passed as: "datapath:/var/log/sysync ultimate_answer:42" NOTE: Module_PluginParams will be called ALWAYS for each module context, even if no plug-in parameter is defined. This allows to react consistently on parameters, which are not always available. Parameters: The module context. The plugin params as multiline aa:bbcc:dd[] The SyncML engine's version Returns: error code XE "Module_Version:sync_dbapi.h"XE "sync_dbapi.h:Module_Version"_ENTRY_ CVersion Module_Version (CContext mContext) Get the module's version. NOTE: The SyncML will take decisions depending on this version number, so the plug-in developer should not change the values at the delivered sample code. Plugin_Version( short buildNumber ) of 'SDK_util' should be used. The can be defined by the user. NOTE: This function can be called by the engine outside any context with = 0. For this case, any callback is not permitted (as no DB_Callback is available). Parameters: The module context ( 0, if none ). Returns: current version as SDK_VERSION_MAJOR | SDK_VERSION_MINOR) | SDK_SUBVERSION | buildNumber XE "MoveItem:sync_dbapi.h"XE "sync_dbapi.h:MoveItem"_ENTRY_ TSyError MoveItem (CContext aContext, const ItemID aID, cAppCharP newParentID) This routine moves from to Parameters: The datastore context. ItemID ( with , ) to be moved. New parent ID for Returns: error code LOCERR_OK ( =0 ), if successful DB_NotFound ( =404 ), if unknown DB_Full ( =420 ), if not enough space in the DB ... or any other SyncML error code, see Reference Manual XE "ReadBlob:sync_dbapi.h"XE "sync_dbapi.h:ReadBlob"_ENTRY_ TSyError ReadBlob (CContext aContext, const ItemID aID, cAppCharP aBlobID, void ** aBlkPtr, ulong * aBlkSize, ulong * aTotSize, bool aFirst, bool * aLast) This routine reads the specific binary logic block , from the database. Parameters: The datastore context. ItemID ( with , ). The assigned ID of the blob. Position and size (in bytes) of the blob block. Input: Maximum size (in bytes) of the blob block to be read. If is 0, the result size is not limited. Output: Size (in bytes) of the blob block. must not be larger than its input value. Total size of the blob (in bytes), can be also 0, if not available, e.g. for a stream. (Input) true : Engine asks for the first block of this blob. false: Engine asks for the next block of this blob. (Output) true : This is the last part (or the whole) blob. false: More blocks will follow. Returns: error code, if not ok ( e.g. invalid , ) NOTE 1) The memory at , must be allocated locally. The SyncML engine will call 'DisposeObj' later for , to release the memory. NOTE 2) Empty blobs are allowed, and must be set to 0, can be undefined, must be true. No 'DisposeObj' call is required for this case. NOTE 3) The SyncML engine can change to read another blob before having read the whole blob. It will never resume reading of this incomplete blob, but start reading again with = true. XE "ReadItem:sync_dbapi.h"XE "sync_dbapi.h:ReadItem"_ENTRY_ TSyError ReadItem (CContext aContext, const ItemID aID, appCharP * aItemData) This routine reads the contents of a specific ItemID from the database. Parameters: The datastore context. The assigned ItemID in the database Returns the data, formatted as multiline aa:bbcc:dd[] Returns: error code, if not ok ( e.g. invalid ) NOTE: The memory for must be allocated locally. The SyncML engine will call 'DisposeObj' later for , to release again its memory. XE "ReadItemAsKey:sync_dbapi.h"XE "sync_dbapi.h:ReadItemAsKey"_ENTRY_ TSyError ReadItemAsKey (CContext aContext, const ItemID aID, appPointer aItemKey) XE "ReadNextItem:sync_dbapi.h"XE "sync_dbapi.h:ReadNextItem"_ENTRY_ TSyError ReadNextItem (CContext aContext, ItemID aID, appCharP * aItemData, sInt32 * aStatus, bool aFirst) This routine reads the next ItemID from the database. of 'ContextSupport' ( "ReadNextItem:allfields" ) and of 'FilterSupport' must be considered. If is true, the routine must return the first element (again). Parameters: The datastore context. The assigned ItemID in the database; will be ignored by the SyncML engine, if = 0 The data, formatted as multiline aa:bbcc:dd[]; will be ignored by the SyncML engine, if = 0 ReadItem_EOF ( =0 ) for none ( =eof ), ReadItem_Changed ( =1 ) for a changed item, ReadItem_Unchanged ( =2 ) for unchanged item. ReadItem_Resumed ( =3 ) for a changed item (since resumed) true: the routine must return the first element false: the routine must return the next element Returns: error code, if not ok. No datasets found is a success as well ! NOTE: The memory for and must be allocated locally. The SyncML engine will call 'DisposeObj' later for these objects to release the memory again. It needn't to be allocated, if is ReadItem_EOF. NOTE: By default, the SyncML engine asks for only. can be returned, if anyway available or must be returned, if the engine asks for it (when calling "ReadNextItem:allfields" at 'ContextSupport' with ). XE "ReadNextItemAsKey:sync_dbapi.h"XE "sync_dbapi.h:ReadNextItemAsKey"_ENTRY_ TSyError ReadNextItemAsKey (CContext aContext, ItemID aID, appPointer aItemKey, sInt32 * aStatus, bool aFirst) XE "ReadNextMapItem:sync_dbapi.h"XE "sync_dbapi.h:ReadNextMapItem"_ENTRY_ bool ReadNextMapItem (CContext aContext, MapID mID, bool aFirst) Map table handling: Get the next map item of this context. If is true, the routine must start to return the first element Parameters: The datastore context MapID ( with , and ). Starting with the first MapID. When creating a context, the first call will get the first MapID, even if is false. Returns: true: as long as there is a MapID available, which must be assigned to false: if there is no more MapID. Nothing must be assigned to USED ONLY WITH XE "SaveAdminData:sync_dbapi.h"XE "sync_dbapi.h:SaveAdminData"_ENTRY_ TSyError SaveAdminData (CContext aContext, cAppCharP adminData) This functions stores the new for this context Parameters: The datastore context The new set of admin data to be stored, will be loaded again with the next 'LoadAdminData' call. Returns: error code, if data could not be saved (e.g. not enough memory); 0 if successfully created. USED ONLY WITH XE "Session_AdaptItem:sync_dbapi.h"XE "sync_dbapi.h:Session_AdaptItem"_ENTRY_ TSyError Session_AdaptItem (CContext sContext, appCharP * sItemData1, appCharP * sItemData2, appCharP * sLocalVars, uInt32 sIdentifier) This function adapts itemData Parameters: The session context The 1st item's data The 2nd item's data The local vars To identify, where it is called Returns: error code NOTE: The memory for adapted strings must be allocated locally. The SyncML engine will call 'DisposeObj' later, to release again its memory. One or more strings can be returned unchanged as well. XE "Session_CheckDevice:sync_dbapi.h"XE "sync_dbapi.h:Session_CheckDevice"_ENTRY_ TSyError Session_CheckDevice (CContext sContext, cAppCharP aDeviceID, appCharP * sDevKey, appCharP * nonce) Check the database entry of and return its string. If is not yet available at the plug-in, return "" for Parameters: The session context The assigned device ID string The device key string (will be used for datastore accesses later) The nonce string of the last session If is not yet available, return "" for and error code 0. Returns: error code 403 (Forbidden), if plugin_deviceadmin is not supported; 0, if successful USED ONLY WITH XE "Session_CreateContext:sync_dbapi.h"XE "sync_dbapi.h:Session_CreateContext"_ENTRY_ TSyError Session_CreateContext (CContext * sContext, cAppCharP sessionName, DB_Callback sCB) By default the session context will be handled by the ODBC interface. The session context of this plug-in module will be used only, if and is defined ( name_of_the_plugin ). can be defined individually. Parameters: Returns a value, which allows to identify this session context. Name of this session DB_Callback structure for session logging Returns: error code, if context could not be created (e.g. not enough memory) 0 if context successfully created, Flags (at the XML config file): yes: "Session_CheckDevice", "Session_GetNonce" "Session_SaveNonce" and "Session_SaveDeviceInfo" will be used. yes: "Session_PasswordMode", "Session_Login" and "Session_Logout" will be used. XE "Session_DeleteContext:sync_dbapi.h"XE "sync_dbapi.h:Session_DeleteContext"_ENTRY_ TSyError Session_DeleteContext (CContext sContext) Delete a session context. No access to will be done after this call Parameters: The session context Returns: error code, if context could not be deleted. XE "Session_DispItems:sync_dbapi.h"XE "sync_dbapi.h:Session_DispItems"_ENTRY_ void Session_DispItems (CContext sContext, bool allFields, cAppCharP specificItem) Writes the context of all items to dbg output path This routine is implemented for debug purposes only and will NOT BE CALLED by the SyncML engine. Can be implemented empty Parameters: The session context true : all fields, also empty ones, will be displayed; false: only fields <> "" will be shown "" : all items will be shown; else shows the Returns: - XE "Session_DisposeObj:sync_dbapi.h"XE "sync_dbapi.h:Session_DisposeObj"_ENTRY_ void Session_DisposeObj (CContext sContext, void * memory) Disposes memory, which has been allocated within the session context. 'Session_DisposeObj' can occur at any time within . Parameters: The session context. Dispose allocated memory. Returns: - XE "Session_GetDBTime:sync_dbapi.h"XE "sync_dbapi.h:Session_GetDBTime"_ENTRY_ TSyError Session_GetDBTime (CContext sContext, appCharP * currentDBTime) Get the current DB time of Parameters: The session context The current time of the plugin's DB (as ISO8601 format). Returns: error code 403 (Forbidden), if plugin_deviceadmin is not supported; 404 (NotFound), if not available -> the engine creates its own time 0, if successful XE "Session_GetNonce:sync_dbapi.h"XE "sync_dbapi.h:Session_GetNonce"_ENTRY_ TSyError Session_GetNonce (CContext sContext, appCharP * nonce) Get a new nonce from the database. If this routine returns an error, the SyncML engine will create its own nonce. Parameters: The session context A valid new nonce value (for the assigned device ID). Returns: error code 404 (NotFound), if no has been generated; 0, if a valid has been generated USED ONLY WITH XE "Session_Login:sync_dbapi.h"XE "sync_dbapi.h:Session_Login"_ENTRY_ TSyError Session_Login (CContext sContext, cAppCharP sUsername, appCharP * sPassword, appCharP * sUsrKey) Get of , in the session context. Parameters: The session context The user name ... ... and the password. is an input parameter for 'Password_ClrTxt_IN' mode and an output parameter for 'Password_ClrText_OUT' and 'Password_MD5_OUT' modes. Returns the internal reference key, which will be passed to to the datastore contexts later. Returns: error code 403 (Forbidden), if plugin_sessionauth is not supported; 0, if successful USED ONLY WITH XE "Session_Logout:sync_dbapi.h"XE "sync_dbapi.h:Session_Logout"_ENTRY_ TSyError Session_Logout (CContext sContext) Logout for this session context Parameters: The session context Returns: error code 403 (Forbidden), if plugin_sessionauth is not supported; 0, if successful USED ONLY WITH XE "Session_PasswordMode:sync_dbapi.h"XE "sync_dbapi.h:Session_PasswordMode"_ENTRY_ sInt32 Session_PasswordMode (CContext sContext) Get the password mode. There are currently 4 different password modes supported. Parameters: The session context Returns: Password_ClrText_IN : 'SessionLogin' will get clear text password Password_ClrText_OUT : " must return clear text password Password_MD5_OUT : " must return MD5 coded password Password_MD5_Nonce_IN: " will get MD5B64(MD5B64(user:pwd):nonce) USED ONLY WITH XE "Session_SaveDeviceInfo:sync_dbapi.h"XE "sync_dbapi.h:Session_SaveDeviceInfo"_ENTRY_ TSyError Session_SaveDeviceInfo (CContext sContext, cAppCharP aDeviceInfo) Save the device info for Parameters: The session context More information about the assigned device (for DB and logging) Returns: error code 403 (Forbidden), if plugin_deviceadmin is not supported; 0, if successful USED ONLY WITH XE "Session_SaveNonce:sync_dbapi.h"XE "sync_dbapi.h:Session_SaveNonce"_ENTRY_ TSyError Session_SaveNonce (CContext sContext, cAppCharP nonce) Save the new nonce (which will be expected to be returned in the next session for this device ID. Parameters: The session context New for the next session (of the assigned device ID) Returns: error code 403 (Forbidden), if plugin_deviceadmin is not supported; 0, if successful USED ONLY WITH XE "Session_ThreadMayChangeNow:sync_dbapi.h"XE "sync_dbapi.h:Session_ThreadMayChangeNow"_ENTRY_ void Session_ThreadMayChangeNow (CContext sContext) Due to the architecture of the SyncML engine, the system may run in a multithread environment. The consequence is that each routine of this plugin module can be called by a different thread. Normally this is not a problem, nevertheless this routine notifies about thread changes in . It can be ignored ( =implemented empty), if not really needed. Parameters: The session context Returns: - XE "StartDataRead:sync_dbapi.h"XE "sync_dbapi.h:StartDataRead"_ENTRY_ TSyError StartDataRead (CContext aContext, cAppCharP lastToken, cAppCharP resumeToken) This routine initializes reading from the database StartDataRead must prepare the database to return the objects of this context. Parameters: The datastore context. The value which has been returned by this module at the last "EndDataWrite" call will be given. It will be "", when called the first time. Normally this token is an ISO8601 formatted string which represents the module's current time (at the beginning of a session). It will be used to decide at 'ReadNextItem' whether a record has been changed. Token for Suspend/Resume mode. Returns: error code XE "StartDataWrite:sync_dbapi.h"XE "sync_dbapi.h:StartDataWrite"_ENTRY_ TSyError StartDataWrite (CContext aContext) This routine initializes writing to the database Parameters: The datastore context. Returns: error code, if not ok (e.g. invalid select options) XE "ThreadMayChangeNow:sync_dbapi.h"XE "sync_dbapi.h:ThreadMayChangeNow"_ENTRY_ void ThreadMayChangeNow (CContext aContext) Due to the architecture of the SyncML engine, the system may run in a multithread environment. The consequence is that each routine of this API module can be called by a different thread. Normally this is not a problem, nevertheless this routine notifies about thread changes in . It can be ignored ( =implemented empty), if not really needed. Parameters: The datastore context. Returns: - XE "UpdateItem:sync_dbapi.h"XE "sync_dbapi.h:UpdateItem"_ENTRY_ TSyError UpdateItem (CContext aContext, cAppCharP aItemData, const ItemID aID, ItemID updID) This routine updates an existing dataset of the database Parameters: The datastore context. The data, formatted as multiline aa:bbcc:dd[] Database key of dataset to be updated Input: NULL is assigned as default value to and . Output: The updated database key for . Can be NULL, if the same as Returns: error code LOCERR_OK ( =0 ), if successful DB_Forbidden ( =403 ), if can't be resolved DB_NotFound ( =404 ), if unknown DB_Full ( =420 ), if not enough space in the DB ... or any other SyncML error code, see Reference Manual NOTE: must either contain NULL references ( if the same as ), or the memory for , must be allocated locally. The SyncML engine will call 'DisposeObj' later for and to release the memory. can be NULL, if the hierarchical model is not supported. XE "UpdateItemAsKey:sync_dbapi.h"XE "sync_dbapi.h:UpdateItemAsKey"_ENTRY_ TSyError UpdateItemAsKey (CContext aContext, appPointer aItemKey, const ItemID aID, ItemID updID) XE "UpdateMapItem:sync_dbapi.h"XE "sync_dbapi.h:UpdateMapItem"_ENTRY_ TSyError UpdateMapItem (CContext aContext, MapID mID) Map table handling: Update a map item of this context Parameters: The datastore context MapID ( with , and ). If there is already a MapID element with localID, it will be update, else created. Returns: error code, if this MapID can't be updated (e.g. not yet existing). USED ONLY WITH XE "WriteBlob:sync_dbapi.h"XE "sync_dbapi.h:WriteBlob"_ENTRY_ TSyError WriteBlob (CContext aContext, const ItemID aID, cAppCharP aBlobID, void * aBlkPtr, ulong aBlkSize, ulong aTotSize, bool aFirst, bool aLast) This routine writes the specific binary logic block to the database. Parameters: The datastore context. ItemID ( with , ). The assigned ID of the blob. Position and size (in bytes) of the blob block. Total size of the blob (in bytes), Can be also 0, if not available, e.g. for a stream. true : this is the first block of the blob. false: this is the next block. true : this is the last block. false: more blocks will follow. Returns: error code, if not ok ( e.g. invalid , ) NOTE: Empty blobs are possible, and will be set to 0, will be NULL, and will be true. XE "WriteLogData:sync_dbapi.h"XE "sync_dbapi.h:WriteLogData"_ENTRY_ void WriteLogData (CContext aContext, cAppCharP logData) This functions writes for this context Can be implemented empty, if not needed. Parameters: The datastore context. Logging information, formatted as multiline aa:bbcc:dd[] Returns: - UIApi Interface description Functions in the UI_Call_In call-in structure The following list only shows the function prototypes. These are required when accessing the UIApi from plain C. See documentation of the TEngineModuleBase class members for details. The routines shown here are all also implemented as methods of TEngineModuleBase (and are available in the wrapper class TEngineModuleBridge which facilitates access from C++ code and is part of the SDK), and have similar signatures (but no aCB first argument because the callback structure is a class member and using by-reference arguments instead of plain pointers where appropriate). void DebugDB (void *aCB, cAppCharP aParams) void DebugExotic (void *aCB, cAppCharP aParams) void DebugBlock (void *aCB, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText) void DebugEndBlock (void *aCB, cAppCharP aTag) void DebugEndThread (void *aCB) TSyError SetStringMode (void *aCB, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian) TSyError InitEngineXML (void *aCB, cAppCharP aConfigXML) TSyError InitEngineFile (void *aCB, cAppCharP aConfigFilePath) TSyError InitEngineCB (void *aCB, TXMLConfigReadFunc aReaderFunc, void *aContext) TSyError OpenSession (void *aCB, appPointer *aSessionH, uInt32 aSelector, cAppCharP aSessionName) TSyError OpenSessionKey (void *aCB, appPointer aSessionH, appPointer *aKeyH, uInt16 aMode) TSyError SessionStep (void *aCB, appPointer aSessionH, uInt16 *aStepCmd, TEngineProgressInfo *aInfoP) TSyError GetSyncMLBuffer (void *aCB, appPointer aSessionH, bool aForSend, appPointer *aBuffer, memSize *aBufSize) TSyError RetSyncMLBuffer (void *aCB, appPointer aSessionH, bool aForSend, memSize aRetSize) TSyError ReadSyncMLBuffer (void *aCB, appPointer aSessionH, appPointer aBuffer, memSize aBufSize, memSize *aValSize) TSyError WriteSyncMLBuffer (void *aCB, appPointer aSessionH, appPointer aBuffer, memSize aValSize) TSyError CloseSession (void *aCB, appPointer aSessionH) TSyError OpenKeyByPath (void *aCB, appPointer *aKeyH, appPointer aParentKeyH, cAppCharP aPath, uInt16 aMode) TSyError OpenSubkey (void *aCB, appPointer *aKeyH, appPointer aParentKeyH, sInt32 aID, uInt16 aMode) TSyError DeleteSubkey (void *aCB, appPointer aParentKeyH, sInt32 aID) TSyError GetKeyID (void *aCB, appPointer aKeyH, sInt32 *aID) TSyError SetTextMode (void *aCB, appPointer aKeyH, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian) TSyError SetTimeMode (void *aCB, appPointer aKeyH, uInt16 aTimeMode) TSyError CloseKey (void *aCB, appPointer aKeyH) TSyError GetValue (void *aCB, appPointer aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize) TSyError GetValueByID (void *aCB, appPointer aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize) sInt32 GetValueID (void *aCB, appPointer aKeyH, cAppCharP aName) TSyError SetValue (void *aCB, appPointer aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize) TSyError SetValueByID (void *aCB, appPointer aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize) TEngineModuleBase Class Reference Public Member Function Overview TEngineModuleBase () virtual ~TEngineModuleBase () TSyError Connect (string aEngineName, unsigned long aPrgVersion=0, unsigned short aDebugFlags=DBG_PLUGIN_NONE) virtual TSyError Init ()=0 virtual TSyError SetStringMode (uInt16 aCharSet, uInt16 aLineEndMode=LEM_CSTR, bool aBigEndian=false)=0 Set the global mode for string paramaters (when never called, default params are UTF-8 with C-style line ends). virtual TSyError InitEngineXML (cAppCharP aConfigXML)=0 init object, optionally passing XML config text in memory virtual TSyError InitEngineFile (cAppCharP aConfigFilePath)=0 init object, optionally passing a open FILE for reading config virtual TSyError InitEngineCB (TXMLConfigReadFunc aReaderFunc, void *aContext)=0 init object, optionally passing a callback for reading config virtual TSyError OpenSession (appPointer &aNewSessionH, uInt32 aSelector=0, cAppCharP aSessionName=NULL)=0 Open a session. virtual TSyError OpenSessionKey (appPointer aSessionH, appPointer &aNewKeyH, uInt16 aMode)=0 open session specific runtime parameter/settings key virtual TSyError SessionStep (appPointer aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP=NULL)=0 Executes sync session or other sync related activity step by step. virtual TSyError GetSyncMLBuffer (appPointer aSessionH, bool aForSend, appPointer &aBuffer, memSize &aBufSize)=0 Get access to SyncML message buffer. virtual TSyError RetSyncMLBuffer (appPointer aSessionH, bool aForSend, memSize aProcessed)=0 Return SyncML message buffer to engine. virtual TSyError ReadSyncMLBuffer (appPointer aSessionH, appPointer aBuffer, memSize aBufSize, memSize &aMsgSize)=0 Read data from SyncML message buffer. virtual TSyError WriteSyncMLBuffer (appPointer aSessionH, appPointer aBuffer, memSize aMsgSize)=0 Write data to SyncML message buffer. virtual TSyError CloseSession (appPointer aSessionH)=0 Close a session. virtual TSyError OpenKeyByPath (appPointer &aNewKeyH, appPointer aParentKeyH, cAppCharP aPath, uInt16 aMode)=0 open Settings key by path specification virtual TSyError OpenSubkey (appPointer &aNewKeyH, appPointer aParentKeyH, sInt32 aID, uInt16 aMode)=0 open Settings subkey key by ID or iterating over all subkeys virtual TSyError DeleteSubkey (appPointer aParentKeyH, sInt32 aID)=0 delete Settings subkey key by ID virtual TSyError GetKeyID (appPointer aKeyH, sInt32 &aID)=0 Get key ID of currently open key. Note that the Key ID is only locally unique within the parent key. virtual TSyError SetTextMode (appPointer aKeyH, uInt16 aCharSet, uInt16 aLineEndMode=LEM_CSTR, bool aBigEndian=false)=0 Set text format parameters (when never called, default params are those set with global SetStringMode()). virtual TSyError SetTimeMode (appPointer aKeyH, uInt16 aTimeMode)=0 Set time format parameters. virtual TSyError CloseKey (appPointer aKeyH)=0 Closes a key opened by OpenKeyByPath() or OpenSubKey(). virtual TSyError GetValue (appPointer aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize)=0 Reads a named value in specified format into passed memory buffer. virtual sInt32 GetValueID (appPointer aKeyH, cAppCharP aName)=0 get value's ID for use with Get/SetValueByID() virtual TSyError GetValueByID (appPointer aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize)=0 Reads a named value in specified format into passed memory buffer. virtual TSyError SetValue (appPointer aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize)=0 Writes a named value in specified format passed in memory buffer. virtual TSyError SetValueByID (appPointer aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize)=0 Writes a named value in specified format passed in memory buffer. TSyError CloseKeyAndNULL (appPointer &aKeyH) Closes a key and nulls the handle. TSyError CloseSessionAndNULL (appPointer &aSessionH) Closes a session and nulls the handle. Member Function Documentation XE "Connect:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:Connect"TSyError sysync::TEngineModuleBase::Connect (string aEngineName, unsigned long aPrgVersion = 0, unsigned short aDebugFlags = DBG_PLUGIN_NONE) XE "SetStringMode:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:SetStringMode"virtual TSyError sysync::TEngineModuleBase::SetStringMode (uInt16 aCharSet, uInt16 aLineEndMode = LEM_CSTR, bool aBigEndian = false) [pure virtual] Set the global mode for string paramaters (when never called, default params are UTF-8 with C-style line ends). Parameters: aCharSet[in] charset aLineEndMode[in] line end mode (default is C-lineends of the platform (almost always LF)) aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "InitEngineXML:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:InitEngineXML"virtual TSyError sysync::TEngineModuleBase::InitEngineXML (cAppCharP aConfigXML) [pure virtual] init object, optionally passing XML config text in memory Parameters: aConfigXML[in] NULL or empty string if no external config needed, config text otherwise Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "InitEngineFile:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:InitEngineFile"virtual TSyError sysync::TEngineModuleBase::InitEngineFile (cAppCharP aConfigFilePath) [pure virtual] init object, optionally passing a open FILE for reading config Parameters: aConfigFilePath[in] path to config file Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "InitEngineCB:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:InitEngineCB"virtual TSyError sysync::TEngineModuleBase::InitEngineCB (TXMLConfigReadFunc aReaderFunc, void * aContext) [pure virtual] init object, optionally passing a callback for reading config Parameters: aReaderFunc[in] callback function which can deliver next chunk of XML config data aContext[in] free context pointer passed back with callback Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "OpenSession:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:OpenSession"virtual TSyError sysync::TEngineModuleBase::OpenSession (appPointer & aNewSessionH, uInt32 aSelector = 0, cAppCharP aSessionName = NULL) [pure virtual] Open a session. Parameters: aNewSessionH[out] receives session handle for all session execution calls aSelector[in] selector, depending on session type. For multi-profile clients: profile ID to use aSessionName[in] a text name/id to identify a session, useage depending on session type. Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "OpenSessionKey:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:OpenSessionKey"virtual TSyError sysync::TEngineModuleBase::OpenSessionKey (appPointer aSessionH, appPointer & aNewKeyH, uInt16 aMode) [pure virtual] open session specific runtime parameter/settings key Note: key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! Parameters: aSessionH[in] session handle obtained with OpenSession aNewKeyH[out] receives the opened key's handle on success aMode[in] the open mode Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "SessionStep:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:SessionStep"virtual TSyError sysync::TEngineModuleBase::SessionStep (appPointer aSessionH, uInt16 & aStepCmd, TEngineProgressInfo * aInfoP = NULL) [pure virtual] Executes sync session or other sync related activity step by step. Parameters: aSessionH[in] session handle obtained with OpenSession aStepCmd[in/out] step command (STEPCMD_xxx): tells caller to send or receive data or end the session etc. instructs engine to suspend or abort the session etc. aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "GetSyncMLBuffer:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:GetSyncMLBuffer"virtual TSyError sysync::TEngineModuleBase::GetSyncMLBuffer (appPointer aSessionH, bool aForSend, appPointer & aBuffer, memSize & aBufSize) [pure virtual] Get access to SyncML message buffer. Parameters: aSessionH[in] session handle obtained with OpenSession aForSend[in] direction send/receive aBuffer[out] receives pointer to buffer (empty for receive, full for send) aBufSize[out] receives size of empty or full buffer Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "RetSyncMLBuffer:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:RetSyncMLBuffer"virtual TSyError sysync::TEngineModuleBase::RetSyncMLBuffer (appPointer aSessionH, bool aForSend, memSize aProcessed) [pure virtual] Return SyncML message buffer to engine. Parameters: aSessionH[in] session handle obtained with OpenSession aForSend[in] direction send/receive aProcessed[in] number of bytes put into or read from the buffer Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "ReadSyncMLBuffer:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:ReadSyncMLBuffer"virtual TSyError sysync::TEngineModuleBase::ReadSyncMLBuffer (appPointer aSessionH, appPointer aBuffer, memSize aBufSize, memSize & aMsgSize) [pure virtual] Read data from SyncML message buffer. Parameters: aSessionH[in] session handle obtained with OpenSession aBuffer[in] pointer to buffer aBufSize[in] size of buffer, maximum to be read aMsgSize[out] size of data available in the buffer for read INCLUDING just returned data. Note: If the aBufSize is too small to return all available data LOCERR_TRUNCATED will be returned, and the caller can repeat calls to ReadSyncMLBuffer to get the next chunk. Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "WriteSyncMLBuffer:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:WriteSyncMLBuffer"virtual TSyError sysync::TEngineModuleBase::WriteSyncMLBuffer (appPointer aSessionH, appPointer aBuffer, memSize aMsgSize) [pure virtual] Write data to SyncML message buffer. Parameters: aSessionH[in] session handle obtained with OpenSession aBuffer[in] pointer to buffer aMsgSize[in] size of message to write to the buffer Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "CloseSession:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:CloseSession"virtual TSyError sysync::TEngineModuleBase::CloseSession (appPointer aSessionH) [pure virtual] Close a session. Note: It depends on session type if this also destroys the session or if it may persist and can be re-opened. Parameters: aSessionH[in] session handle obtained with OpenSession Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "OpenKeyByPath:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:OpenKeyByPath"virtual TSyError sysync::TEngineModuleBase::OpenKeyByPath (appPointer & aNewKeyH, appPointer aParentKeyH, cAppCharP aPath, uInt16 aMode) [pure virtual] open Settings key by path specification Parameters: aNewKeyH[out] receives the opened key's handle on success aParentKeyH[in] NULL if path is absolute from root, handle to an open key for relative access aPath[in] the path specification as null terminated string aMode[in] the open mode Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "OpenSubkey:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:OpenSubkey"virtual TSyError sysync::TEngineModuleBase::OpenSubkey (appPointer & aNewKeyH, appPointer aParentKeyH, sInt32 aID, uInt16 aMode) [pure virtual] open Settings subkey key by ID or iterating over all subkeys Parameters: aNewKeyH[out] receives the opened key's handle on success aParentKeyH[in] handle to the parent key aID[in] the ID of the subkey to open, or KEYVAL_ID_FIRST/KEYVAL_ID_NEXT to iterate over existing subkeys or KEYVAL_ID_NEW to create a new subkey aMode[in] the open mode Returns: LOCERR_OK on success, DB_NoContent when no more subkeys are found with KEYVAL_ID_FIRST/KEYVAL_ID_NEXT or any other SyncML or LOCERR_xxx error code on failure XE "DeleteSubkey:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:DeleteSubkey"virtual TSyError sysync::TEngineModuleBase::DeleteSubkey (appPointer aParentKeyH, sInt32 aID) [pure virtual] delete Settings subkey key by ID Parameters: aParentKeyH[in] handle to the parent key aID[in] the ID of the subkey to delete Returns: LOCERR_OK on success or any other SyncML or LOCERR_xxx error code on failure XE "GetKeyID:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:GetKeyID"virtual TSyError sysync::TEngineModuleBase::GetKeyID (appPointer aKeyH, sInt32 & aID) [pure virtual] Get key ID of currently open key. Note that the Key ID is only locally unique within the parent key. Parameters: aKeyH[in] an open key handle aID[out] receives the ID of the open key, which can be used to re-access the key within its parent using OpenSubkey() Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "SetTextMode:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:SetTextMode"virtual TSyError sysync::TEngineModuleBase::SetTextMode (appPointer aKeyH, uInt16 aCharSet, uInt16 aLineEndMode = LEM_CSTR, bool aBigEndian = false) [pure virtual] Set text format parameters (when never called, default params are those set with global SetStringMode()). Parameters: aKeyH[in] an open key handle aCharSet[in] charset aLineEndMode[in] line end mode (defaults to C-lineends of the platform (almost always LF)) aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "SetTimeMode:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:SetTimeMode"virtual TSyError sysync::TEngineModuleBase::SetTimeMode (appPointer aKeyH, uInt16 aTimeMode) [pure virtual] Set time format parameters. Parameters: aKeyH[in] an open key handle aTimeMode[in] time mode, see TMODE_xxx (default is platform's lineratime_t when SetTimeMode() is not used) Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "CloseKey:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:CloseKey"virtual TSyError sysync::TEngineModuleBase::CloseKey (appPointer aKeyH) [pure virtual] Closes a key opened by OpenKeyByPath() or OpenSubKey(). Parameters: aKeyH[in] an open key handle. Will be invalid when call returns with LOCERR_OK. Do not re-use! Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "GetValue:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:GetValue"virtual TSyError sysync::TEngineModuleBase::GetValue (appPointer aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize & aValSize) [pure virtual] Reads a named value in specified format into passed memory buffer. Parameters: aKeyH[in] an open key handle aValName[in] name of the value to read aValType[in] desired return type, see VALTYPE_xxxx aBuffer[in/out] buffer where to store the data aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) aValSize[out] actual size of value. For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator Note that this will be set also when return value is LOCERR_BUFTOOSMALL, to indicate the required buffer size Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "GetValueID:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:GetValueID"virtual sInt32 sysync::TEngineModuleBase::GetValueID (appPointer aKeyH, cAppCharP aName) [pure virtual] get value's ID for use with Get/SetValueByID() Returns: KEYVAL_ID_UNKNOWN when no ID available for name, ID of value otherwise XE "GetValueByID:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:GetValueByID"virtual TSyError sysync::TEngineModuleBase::GetValueByID (appPointer aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize & aValSize) [pure virtual] Reads a named value in specified format into passed memory buffer. Parameters: aKeyH[in] an open key handle aID[in] ID of the value to read aArrayIndex[in] 0-based array element index for array values. aValType[in] desired return type, see VALTYPE_xxxx aBuffer[in/out] buffer where to store the data aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) aValSize[out] actual size of value. For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator Note that this will be set also when return value is LOCERR_BUFTOOSMALL, to indicate the required buffer size Returns: LOCERR_OK on success, LOCERR_OUTOFRANGE when array index is out of range SyncML or LOCERR_xxx error code on other failure XE "SetValue:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:SetValue"virtual TSyError sysync::TEngineModuleBase::SetValue (appPointer aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize) [pure virtual] Writes a named value in specified format passed in memory buffer. Parameters: aKeyH[in] an open key handle aValName[in] name of the value to write aValType[in] type of value passed in, see VALTYPE_xxxx aBuffer[in] buffer containing the data aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "SetValueByID:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:SetValueByID"virtual TSyError sysync::TEngineModuleBase::SetValueByID (appPointer aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize) [pure virtual] Writes a named value in specified format passed in memory buffer. Parameters: aKeyH[in] an open key handle aID[in] ID of the value to read aArrayIndex[in] 0-based array element index for array values. aValType[in] type of value passed in, see VALTYPE_xxxx aBuffer[in] buffer containing the data aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "CloseKeyAndNULL:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:CloseKeyAndNULL"TSyError sysync::TEngineModuleBase::CloseKeyAndNULL (appPointer & aKeyH) [inline] Closes a key and nulls the handle. Parameters: aKeyH[in/out] an open key handle. Will be set to NULL on exit (to make sure it is not re-used) Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure XE "CloseSessionAndNULL:sysync\:\:TEngineModuleBase"XE "sysync\:\:TEngineModuleBase:CloseSessionAndNULL"TSyError sysync::TEngineModuleBase::CloseSessionAndNULL (appPointer & aSessionH) [inline] Closes a session and nulls the handle. Parameters: aSessionH[in] session handle obtained with OpenSession Returns: LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure Settings keys supported in SyncML Client Engine The settings keys and values accessible trough the OpenKeyXXXX, GetValueXXX, SetValueXXX etc. block of routines (see  REF _Ref185314626 \r \h 5.2.3) may vary depending on the version and type of client library. The standard client library supports the following settings keys and values: Global settings keys - accessed using OpenKeyByPath() /engineinfo general info about engine (read-only) version - SySync full version string platform - name of the platform name - name of the Synthesis SyncML engine product manufacturer - returns Synthesis AG comment - returns special release comment string, which might indicate special builds like expiring demo versions etc. variantcode - returns variant classification code of the engine: 0=unknown, 1=STD, 2=PRO, 3=custom variant, 10=DEMO /configvars configuration variables (predefined, volatile when written) platformname - name of the current platform platformvers - version string of the current platform globcfg_path - global system-wide config path (such as C:\Windows or /etc) loccfg_path - local config path (such as exedir or user's dir) defout_path - default path to writable directory to write logs and other output by default temp_path - path where we can write temp files exedir_path - path to directory where executable resides userdir_path - path to the user's home directory for user-visible documents and files appdata_path - path to the user's preference directory for this application prefs_path - path to directory where all application prefs reside (not just mine) device_uri - URI of the device (some unique ID, usually a hardware serial number or network derived system name) device_name - Name of the device hardware (such as a model name) user_name - name of the currently logged-in user on the host platform conferrpath - not defined by default, can be set to a file path where XML config parsing error messages will be written to. Can be set to "console" to output XML config parsing errors to the system stdout path (if such a path exists on the platform) xxxx - user-defined variables (can also set to override default value of one of the above) /licensing license (volatile, text/code must be set every time app ist started) licensetext - license text licensecode - Writeonly: license code (setting it will recalculate all the following status variables) regStatus - Readonly: TSyError status code of currently set license regOK - Readonly: if true, license is ok productCode - Readonly: product code from license productFlags - Readonly: product flags from license quantity - Readonly: licensed quantity licenseType - Readonly: license type daysleft - Readonly: number of days left of expiring license or demo mode (-1 = not expiring) /profiles Client settings profiles (persistent) settingsstatus - TSyError status of the settings. MUST BE CALLED AT LEAST ONCE before opening subkeys overwrite - (volatile) boolean flag. In case opening settings would cause deleting incompatible settings, this is done only if overwrite is set to 1. provisioningstring - Writeonly: Allows creating and modifying settings using so-called provisioning strings. These are strings which can be created using our free ClientConfigurator tool to package settings in a form that can be easily delivered in various forms. One of them is writing them into the provisioningstring value. checkForFeature - Writeonly. When written with a feature code (see APP_FTR_xxx in engine_defs.h), the write operation either succeeds (=feature available) or returns 204/ DB_NoContent (=feature not available). Note that checkForFeature is also available in the profile to check for features affecting only a specific profile and on the target level for features specific to a single target. / Profile ID (as assigned by engine when profile is created) profileName - display name of the profile protocol - transport protocol: 0=included in URI, 1=http, 2=https, 3=wsp, 4=obex_irda, 5=obex_bt, 6=obex_tcp serverURI - SyncML Server URI URIpath - Path element appended to SyncML Server URI (e.g. in case URI is hardcoded) serverUser - SyncML Server user serverPassword - SyncML Server password (stored in disguised form) transportUser - user for login at the transport level (e.g. HTTP auth) transportPassword - password for transport level login (stored in disguised form) socksHost - SOCKS proxy address proxyHost - HTTP proxy address proxyUser - user for login at the proxy proxyPassword - password for proxy login (stored in disguised form) encoding - SyncML encoding (1=WBXML, 2=XML - note that not some client builds only support WBXML) syncmlvers - SyncML version to use to start session (0=automatic, 1=1.0, 2=1.1, 3=1.2) useProxy - If set to 1, this indicates that configured proxy server(s) should be used useConnectionProxy - if set to 1, this indicates that OS-defined, connection specific proxies should be used timedSyncMobile - Number of minutes for mobile timed autosync (0=none) timedSyncCradled - Number of minutes for cradled timed autosync (0=none) dangerFlags - Readonly: returns the "danger" status of the next sync, i.e. indication when either server (DANGERFLAG_WILLZAPSERVER) or client (DANGERFLAG_WILLZAPCLIENT) side data will be cleared completely and replaced with the other side's content in any of the datastores currently enabled for sync. Client implementations should check these before starting a sync and warn users appropriately. Note that each target has also a dangerFlag which can be queried to get each datastore's flags separately. checkForFeature - Writeonly. When written with a feature code (see APP_FTR_xxx in engine_defs.h), the write operation either succeeds (=feature available) or returns 204/ DB_NoContent (=feature not available). Note that checkForFeature is also available in each target to check for features specific to one target and on the profiles container level for global-level features. checkForReadOnly - Writeonly. When written with a readonly flag value (see RDONLY_xxx in engine_defs.h), the write operation either succeeds (=queried settings should be made readonly in the UI) or returns 204/ DB_NoContent (=queried settings should be editable in the UI). Note that actual profile and target fields may still be technically writable using SetValue() – checkForReadOnly is indended to give the UI implementation the needed information to make some fields not editable for the end user. checkForReadOnly is also available in each target to check for readonly fields at the target level. readOnlyFlags - These flags can be set (usually by provisioning, see "provisioningstring") to make certain aspects of a settings profile read-only. See RDONLY_xxx constants in engine_defs.h. Note that these flags don't actually prohibit writing to settings fields, but should be queried by UI code to using checkForReadOnly (see above). UI code should never check readOnlyFlags directly, because depending on the engine build some readonly conditions might exist without the corresponding flag explicitly set in readOnlyFlags. transpFlags - 32 bit Flagword reserved for transport related settings flags. profileFlags - 32 bit Flagword reserved for general profile related settings flags. profileExtra1 - 32 bit Integer reserved for general profile related settings value. profileExtra2 - 32 bit Integer reserved for general profile related settings value. profileData - 256 bytes general purpose BLOB reserved for general profile related persistent storage. /autosynclevels / Autosync level ID, 0..2, 0=first priority, 2=least priority mode - Autosync mode for this level (0=IPP, 1=timed, 2=off, 3=server alerted) startDayTime - minute of the day when autosync starts in this level endDayTime - minute of the day when autosync ends in this level weekdayMask - weekdays where autosync is enabled in this level (Bit 0=Sun, 1=Mon .. 6=Sat chargeLevel - percentage of battery charge needed to enable autosync (0..100, 100=with AC supply only) memLevel - percentage of memory free needed to enable autosync (0..100) flags - flags reserved for future use /targets Targets (databases available for sync in this profile) / Target ID is the as defined in the config enabled - if set to 1, this datastore will be included in next sync forceslow - if set to 1, next sync will be a slow sync syncmode - sync mode: 0=twoway, 1=from server only, 2=from client only limit1 - sync range limit (such as number of days in the past, depends on datastore) limit2 - sync range limit (such as number of days in the future, depends on datastore) extras - flags for sync range limist (depends on datastore) localpath - local database path (if any), to differentiate multiple instances of the same database type remotepath - remote (server) database path localcontainer - local container name, if any (usage depends on datastore implementation) dbname - Readonly: name of the related (in the XML config) lastSync - Readonly: time of last successful sync lastToRemoteSync - Readonly: time of last sync that sent data to the remote party (server) dangerFlags - Readonly: returns the "danger" status of the next sync, i.e. indication when either server (DANGERFLAG_WILLZAPSERVER) or client (DANGERFLAG_WILLZAPCLIENT) side data will be cleared completely and replaced with the other side's content. Client implementations should check these before starting a sync and warn users appropriately. Note that the profile has also a dangerFlag which represents all target's dangerFlags combined. checkForFeature - Writeonly. When written with a feature code (see APP_FTR_xxx in engine_defs.h), the write operation either succeeds (=feature available) or returns 204/ DB_NoContent (=feature not available). Note that checkForFeature is also available in the profile to check for features affecting all targets and on the profiles level for global-level features. checkForReadOnly - Writeonly. When written with a readonly flag value (see RDONLY_xxx in engine_defs.h), the write operation either succeeds (=queried settings should be made readonly in the UI) or returns 204/ DB_NoContent (=queried settings should be editable in the UI). Note that actual profile and target fields may still be technically writable using SetValue() – checkForReadOnly is indended to give the UI implementation the needed information to make some fields not editable for the end user. checkForReadOnly is also available at the profile level. isAvailable - Readonly. Returns non-zero if the datastore is available for being used (vs. only implemented, but currently blocked, e.g. because the server side does not support the type). The UI implementation should visually show the datastore related UI in a disabled state or completely hide it when isAvailable returns zero. dispName - Readonly. Returns the display name of the datastore as specified in the XML config with . If is not set, the technical name of the datastore is returned. lastSyncIdentifer - Readonly: Returns the identifier used by the datastore implementation (possibly a plugin) to identify the time of last sync. remoteDispName - Readonly: Returns the display name of the datastore as transmitted in the remote party's devInf (if at all contained in the devInf). remoteFilters - Filter expression to be passed to server (in TAF/CGI syntax format). localFilters - Filter expression to be used locally to synchonize only a subset of the local data set (in TAF/CGI syntax format). Not active yet, reserved for future use. filterCapDesc - Readonly. Reserved for future use (will contain a description of filter capabilities of the server for creating UI like popup menus for filter creation). Session local settings/values, accessed using OpenSessionKey() Session key unnamed implicit per-session key obtained by OpenSessionKey() connectURI - URI to use to connect to SyncML server. Note that this might be different from the original Server URI in profile's "serverURI" as the SyncML server might request sending requests to another URI during a sync session. connectHost - This is the host (server address) part of the connectURI. This is what is normally required to create a connection at the network level. connectDoc - This is the document part of the connect URI, which is normally required to prepare a HTTP POST request. contenttype - content type string to use for the HTTP "Content-Type:" header. localSessionID - local identification string of the current sync session. sessionPassword - this is a write-only value. It can be used to provide the session password from a secure storage (like Mac OS X keychain) rather than actually storing it in the profile settings (from where it could be extracted by unauthorized parties). To provide the session password via this value, it must be set immediately after the initial STEPCMD_CLIENTSTART or STEPCMD_CLIENTAUTOSTART has been successfully executed. /sessionvars Session context script variables (for PRO engines with scripting only) - access (read and write) to any script variable defined in session context scripts (like ). This is useful to pass extra data back and forth between engine and database plugins or UI. /profile Access to current session's profile record. See / above for description of profile values and subkeys. This is useful for example for database plugins to make use of profile flags and settings configured for the current session. Error codes This section lists the error codes that can occur (normally visible in the logs or on the console). SyncML Status Codes These codes are defined by the SyncML standard. For details, see HYPERLINK "http://www.openmobilealliance.org/release_program/ds_v12.html" http://www.openmobilealliance.org/release_program/ds_v12.html. Note that this list is not complete, but only contains the codes that are important for the SyncML engine. 0 No error 101 Server is busy (session limit reached) 200 OK, successful operation 201 Item added 207 Conflict resolved with merge 208 Conflict resolved - client wins 209 Conflict resolved by duplicating item 210 Deleted without archive 211 Item not deleted 212 Authentication accepted for entire session 213 Chunked item accepted and buffered (this status is sent for each non-final part of a data item that has been split across multiple SyncML messages) 400 Bad request 401 Unauthorized (bad credentials) 403 Forbidden (e.g. attempt to write to a read-only database) 404 Object not found 405 Command not allowed 406 Optional feature not supported 407 Authentication required (no credentials found) 408 Timeout 409 Conflict, operation failed 410 Gone, requested object not here any more 412 Incomplete command 415 Unsupported media type or format 418 Object already exists 419 Conflict resolved with server data 420 Device full 500 Command failed 501 Command not implemented 503 Service unavailable 505 DTD version not supported 508 Slow sync required 509 Authentication required 510 Database error 511 Server error 512 Synchronisation failed 513 SyncML Version not supported Cancelled Internal Error Codes 0 No error 10000..10999 These have the same meaning as the SyncML Status Codes (see  REF _Ref47451048 \r \h 10.1), but they are offset by 10000 to make clear that they were generated internally, and not sent or received via SyncML. 20001 Bad or unknown transport protocol 20002 Fatal problem with SyncML encoder/decoder 20003 Cannot open communication 20004 Cannot send data 20005 Cannot receive data 20006 Bad content type (message received with an unknown MIME-type) 20007 Error processing incoming SyncML message (for example invalid XML or WBXML formatting) 20008 Cannot close communication 20009 Transport layer authorisation (e.g. HTTP auth) failed 20010 Error parsing XML config file 20011 Error reading config file 20012 No configuration found at all, or not enough for requested operation (client) 20013 Config file could not be found 20014 License expired or no license found 20015 Internal fatal error 20016 Bad handle 20017 Session aborted by user 20018 Invalid license 20019 Limited trial version 20020 Connection timeout 20021 Connection SSL certificate expired 20022 Connection SSL certificate invalid 20023 incomplete sync session (some datastores failed, some completed) 20025 Out of memory 20026 Connection impossible (e.g. no network available) 20027 Establishing connection failed (e.g. network layer login failure) 20028 element is already installed 20029 this build is too new for this license (need upgrading license) 20030 function not implemented 20031 this license code is valid, but not for this product (e.g. STD license used in PRO product, or client license in server product) 20032 Explicitly suspended by user 20033 this build is too old for this SDK/plugin 20034 unknown subsystem 20036 local datastore not ready 20037 session should be restarted from scratch 20038 internal pipe communication problem 20039 buffer too small for requested value 20040 value truncated to fit into field 20041 bad parameter 20042 out of range 20043 external transport failure (no details known in engine) 20044 class not registered 20500..20599 These represent SIG_xxx codes in Linux versions of the server. Unexpected SIG_xxx will generate a error code of 20500+signal_code. 20998 Internal unkown exception 20999 Unknown error 21000...21999 Database plugin module specific error codes Page  SEITE 70 © 2004 - 2009 by Synthesis AG, Zürich, Switzerland -  HYPERLINK "www.synthesis.ch" www.synthesis.ch SDK_javadb.java SDK_javadb.class uiapp.java uiapp.class VAR_boolean.class VAR_byteArray.class VAR_short.class VAR_int.class VAR_String.class DB_Callback.class ItemID.class MapID.class ModuleContext.class SessionContext.class DStoreContext.class JCallback.class JCallback.h Java SySync SDK for Java oceanblue.h / .cpp snowwhite.h / .cpp myadapter.h SySync SDK C / C++ package DLL core Example plug-in modules UI application example sysync_SDK_linux.mcp sysync_SDK_linux.mk sysync_SDK_win.mcp *_visual.vcproj sysync_SDK_mac.mcp (some of these files, depending on the platform) .... sync_dbapi_text.cpp DLL/target_options.h sync_dbapi_demo.c DLL/target_options.h DB_Interfaces UI_app_setting.cpp UI_util.h / .cpp UI_Appli-cations SDK.def dbapi_DLL.lib DLL engine_defs.h generic_types.h syerror.h sync_include.h sync_dbapidef.h sync_dbapi.h admindata.h / .cpp blobs.h / .cpp dbitem.h / .cpp SDK_util.h / .c SDK_support.h / .cpp stringutil.h / .cpp timeutil.h / .cpp enginemodulebase.h / .cpp enginemodulebridge.h / .cpp Sources CodeWarrior, Visual Studio project files / makefile UIApi DBApi Synthesis SySync Engine Customer‘s DB Plugin A Synthesis SySync Engine Customer‘s application with user interface Customer‘s DB Plugin B ()*+,-.CdÉÊÕÖ×ûüýþÿ$%lvwš›ÁÂÃÛÜ234efgŒŽÒâãúòúíúêçãçÞçÙÑÙÌÙÉ¿¼¹ú±ú®ú©ž—ˆž—ž…©CJjÞ„>*B*OJQJU 0JOJQJj0JOJQJUOJQJ0Jj;„UNHCJmH  j¥§UmH CJ j•Uje”U j°UCJmH >*CJ(CJ(CJ j£UjU jU0-.CdÉÊÖ$lßàŽÒT—< Õ - ýú÷õõõúúõõúïëéýýýéäáäÝáäá„Ä@&„Ä@&„ „ „Å$$-.CdÉÊÖ$lßàŽÒT—< Õ - ½ ¾  È  W ½ õ €®æ)q¨àVüüüüùöüüóðíèåâßÚØÕØÒÕØÕÕØÏÌÇØÂ¿º·²¯¬§¢˜“މ„zíýÿÿ'þÿÿ_þÿÿ–þÿÿÞþÿÿ!ÿÿÿYÿÿÿ‡ÿÿÿöÿÿÿ÷ÿÿÿþÿÿŒþÿÿÄþÿÿ*ÿÿÿgÿÿÿ¹ÿÿÿyÿÿÿÏÿÿÿÐÿÿÿ½ÿÿÿâýÿÿ þÿÿ!þÿÿ”ÿÿÿÜÿÿÿüÿÿÿýÿÿÿÿÿÿÿšÿÿÿ›ÿÿÿ0ãä !"RST€‘—ªòó% < W X x y z Ž ‘ µ Å Ê Õ ð ñ    + , < = j k l ‹ Œ ¥ ¼ ¾  5 6 = > d e f  öñåöÞöÛ×Ñ×Û×Ñ×ÛöñÅöÞöÛ×Û×öñ¹öÞööñ­öÞöÛ×ÛªªŸÞŸÞjш>*B*OJQJUj0JOJQJUNHjˆOJQJUjQ‡OJQJUjž†OJQJU 5CJNH5CJCJ 0JOJQJj³…OJQJUOJQJjOJQJU8- ½ ¾  È  W ½ õ €®æ)q¨àV˜Ôü÷óñï÷ïóïóïñêäääääââââàààà Æd#  & F„Ä„Ä@&@& € È Ø Ù þ ÿ   W _ ` “ ” • » ¼ õ W X ¤¥ñò@AefMN^_{|}~Œ©ª«¬­ÄÅáâãäå#$%ôñôêÛôêôñôêÌôêôññÇñÂñÂñÂñÇñÂñ½½½µ½½½­½½½¥½½½½jŒUj ŒUj£‹Uj&‹U jUCJNHCJNHjMŠ>*B*OJQJUj‰>*B*OJQJU 0JOJQJCJj0JOJQJU>%'(NOklmop…†¢£¤¦§½¾ÚÛÜÞß÷ø34PQRTUuv’“”–—±²ÎÏÐÒÓïð  23OPQSTqrŽúúòúúúêúúúâúúúÚúúúÒúúúÊúúúÂúúúºúúú²úúúj‘Uj…UjUj‹UjUj‘ŽUjŽUj—UjU jUDV˜ÔU”ÑAŠÍ!p¸í(ƒ¿þ0p¯ì4t¯é` à b›ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[¥õÿÿçõÿÿ'öÿÿgöÿÿ§öÿÿéöÿÿ÷ÿÿX÷ÿÿ“÷ÿÿÓ÷ÿÿøÿÿXøÿÿ—øÿÿ×øÿÿ ùÿÿHùÿÿ„ùÿÿßùÿÿúÿÿOúÿÿ—úÿÿæúÿÿ:ûÿÿ}ûÿÿÆûÿÿüÿÿ6üÿÿsüÿÿ²üÿÿõüÿÿ3ýÿÿoýÿÿ±ýÿÿ!U”ÑAŠÍ!p¸í(ƒ¿þ0p¯ì4t¯é` à ýýýûûûõûûýýýóóýõûûûûûûûõûûûû Æd# Ž’“®¯ËÌÍÏÐäå;<=?@gh„…†ˆ‰ª«ÇÈÉËÌþÿ MNjklno•–²³´¶·ÊËçèéëì÷òòòêòòòâòòòÚòòòÒòòòÊòòòÂòòòºòòò²òòòªòòjä•Ujg•Ujê”Ujm”Ujð“Ujs“Ujö’Ujy’Ujü‘U jUj‘UCì"#$&'`a}~‚œ¹º»½¾ÛÜøùúüý *+,./MNjklnoŒ©ª«­®ÉÊæçèêë./023QRnoúòúúúêúúúâúúúÚúúúÒúúúÊúúúÂúúúºúúú²úúúªjÆšUjIšUjÌ™UjO™UjÒ˜UjU˜UjØ—Uj[—UjÞ–Uja–U jUCoprsŒ©ª«­®ÆÇãäåçèûü=>Z[\^_}~š›œžŸ½¾ÚÛÜÞßýþ?@\]^`axy•–—™š¶·ÓúúúòúúúêúúúâúúúÚúúúÒúúúÊúúúÂúúúºúúú²úúúj+ŸUj®žUj1žUj´Uj7UjºœUj=œUjÀ›UjC›U jUE b›ÙÚÛr»K¢iœØ$%óôQ R ³!a"b"ï"ù÷÷ùùù÷÷õõ÷õõù÷÷óñëóóóóóóóó Æ_¾$ Æd# ÓÔÕרúûOPlmnpq˜™µ¶·¹ºáâþÿ()EFGIJ€œž ¡ÞßûüýÿFGcdeghyz–—˜š›÷òòòêòòòâòòòÚòòòÒòòòÊòòòÂòòòºòòò²òòòªòòj ¤Uj£Uj£Uj–¢Uj¢Ujœ¡Uj¡Uj¢ Uj% U jUj¨ŸUC›ÙÚÛr»K¢iœØ$%óôQ R ³!a"b"ï"ð"Þ#ß#è#é#¶&J'K'v'æ'P(Q(ûöñìçâÝØÓÎÉÄ¿º·±¬©¦£ š—”‘Ž‹ƒ€}zwtnfcûÿÿùûÿÿ‚   iüÿÿ‚ ”üÿÿ•üÿÿ)ýÿÿöÿÿÿ÷ÿÿÿY  9ûÿÿ'üÿÿ(üÿÿµüÿÿ¶üÿÿdýÿÿÅþÿÿÆþÿÿ#ÿÿÿ$ÿÿÿòÿÿÿóÿÿÿ Y òñÿÿ/òÿÿkòÿÿžòÿÿóÿÿeóÿÿ¼óÿÿôÿÿLôÿÿ•ôÿÿêôÿÿ,õÿÿ-õÿÿ.õÿÿlõÿÿ%›µ¶ÒÓÔÖ×òó#$%<EFXèé¼  ! !©!¯!å!î!ó!ø! " "§"ª"K#L#u#v#w#’#“#q$t$£$¤$%%x&y& &¡&''z''’'˜'Å'Æ'ß'à'á'â'ã'ê'ù'ü'(/(úòúúúêúúÝØÓÑÑÎÑÎÑÑÑÎÑúÆúÃúÑÎÎÎÎÎÑÑú»úúÑÑj\¦U0Jj„¥UNH5OJQJmH nHjOJPJQJUmHj¥UjФU jUJï"ð"Þ#ß#è#é#¶&J'K'v'æ'P(Q(­(°(Ñ(")h)³)ä)Ø*ù+-~-.J.ýýýúýýýýýììææàÛÛÛÛÛÛÛÛÛÛÛ & Fx Æ_¾$ ƨ € & F‚„Ð Æ hШ €$/(0(I(J(K(L(M(§(¨(­(®(°(Ê(Ï(é(í(î(?)A)…)‹)*+++s+t+ù+,,, ,,G,H,œ,,--Ú-Û-Ž//(0-0.010r0s0Z1`1f1m1v11M2N222d4m45-5/56585P5S5c5Ý5Þ5e6f6´6µ6Þ6ß6j8p8v8}8†88Ç:È:Ó;Ü;ò;ù;þ;úòúúïèãßßÝßßïïßßßïïïïïÝÝïÝÝÝïÝÝÝÝÝÝïïèèÝÝÝïÝÝ55B*OJQJ jUmHNHjÙ¦U jUWQ(­(°(Ñ(")h)³)ä)Ø*ù+-~-.J.©.á.­/00s2t2S4T4÷5 6 6Z6³6´6Ü6Ý6Þ6ü÷ñéáÙÑÉÁ¹±©¡™‘‰~{xurogda^[XURÿÿÿÿÿÿCÿÿÿDÿÿÿÿÿÿìÿÿÿíÿÿÿY  ‹ïÿÿŒïÿÿkñÿÿlñÿÿÇóÿÿÈóÿÿ2ôÿÿx  þôÿÿx  6õÿÿx  •õÿÿx  Ñõÿÿx  aöÿÿx  Ëöÿÿx  æ÷ÿÿx  ùÿÿx  ûùÿÿx  ,úÿÿx  wúÿÿx  ½úÿÿx  ûÿÿx   /ûÿÿx 2ûÿÿŽûÿÿJ.©.á.­/00s2t2S4T4÷5 6 6Z6³6´6Ü6Ý6Þ6à6á6â6ã6ä6å6æ6ç6è6é6úúúúøøøøøøöøøøøøøøøøøøøøøøøø & FxÞ6à6á6â6ã6ä6å6æ6ç6è6é6ê6ë6ì6í6î6ï6ð6ñ6ò6ó6ô6õ6ö6÷6ø6ù6ú6û6ü6ý6þ6ÿ677777‹7Œ78888å9æ9üùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´±®«¨¥¢Ÿœ™–“Ї„|yvsþÿÿâÿÿÿãÿÿÿY  ÷ýÿÿkþÿÿlþÿÿóþÿÿôþÿÿõþÿÿöþÿÿ÷þÿÿøþÿÿùþÿÿúþÿÿûþÿÿüþÿÿýþÿÿþþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-é6ê6ë6ì6í6î6ï6ð6ñ6ò6ó6ô6õ6ö6÷6ø6ù6ú6û6ü6ý6þ6ÿ677777‹7Œ7ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýŒ78888å9æ9:<<»<¼<s=t=H>I>Ï>Ð>ð?ñ?E@F@G@W@n@@•@«@Ä@Û@ýýûýýýùýýýýýýýýýýýýýýùýóýýýý Æ_¾$æ9:<<»<¼<s=t=H>I>Ï>Ð>ð?ñ?E@F@G@W@n@@•@«@Ä@Û@Ü@4A5A6A7A¡B8C9C%DMENE¤F¥FÁFùF;GwG³GòGôñîëèåâßÜÙÖÓÐÍʼ¹´±®«¨¥¢Ÿœ™–“Ї„|yvspm”øÿÿÐøÿÿ ùÿÿNùÿÿ†ùÿÿ¢ùÿÿ£ùÿÿùúÿÿúúÿÿ"üÿÿýÿÿýÿÿ¦ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿkÿÿÿlÿÿÿƒÿÿÿœÿÿÿ²ÿÿÿÈÿÿÿÙÿÿÿðÿÿÿº÷ÿÿY   º÷ÿÿ ùÿÿ¡ùÿÿõùÿÿöùÿÿûÿÿûÿÿûÿÿžûÿÿrüÿÿsüÿÿ*ýÿÿ+ýÿÿªýÿÿßÿÿÿþÿÿY  þÿÿ)þ;<n<‹<”<•<™<š<³<´<µ<¸<¹<´=º=*>+>_>f>ï>ø>Y@n@@Æ@Ú@µAÉAõA BCCpExE_F`FbFcF¤F¥F¿FòFóFI.I/I0IwIxII†I×IØIKK”K™KòKóKÓLèLýLMMM1OFOP–PðRñRUU2U7U@UDU_VmV«V¬VW#WhWvWˆWšW›W¡WWXýûøóëóóýøýýûæûûûøýøøæýøýýøýøøýøûûâûûûøýýýýøûûææýB*NHOJQJjV§U jUNHB*5YÛ@Ü@4A5A6A7A¡B8C9C%DMENE¤F¥FÁFùF;GwG³GòGóG/HkH¡HÙHIII€Iýýýýýýýýýýýý÷ýýýýýýýýýýýýýýý Æ_¾$òGóG/HkH¡HÙHIII€IIJJ“J”J¥J“K”KûKüKM±M²M.O/OGO`OaO{O“O¬OÉOÊOãOäOÿOP*P+PHPcPP—P˜P™PüùöóðíêçäáÞÛØÕÇÄÁ¾»¸µ²¯¬©¦£ š—”‘Ž‹ˆ…‚|yvspüùÿÿýùÿÿúÿÿ1úÿÿLúÿÿiúÿÿjúÿÿ€úÿÿ•úÿÿ°úÿÿ±úÿÿÊúÿÿËúÿÿèúÿÿûÿÿûÿÿ3ûÿÿ4ûÿÿMûÿÿeûÿÿfûÿÿâüÿÿãüÿÿ~ýÿÿ˜þÿÿ™þÿÿÿÿÿÿÿÿïÿÿÿmíÿÿY   míÿÿ´õÿÿ5öÿÿ6öÿÿÆöÿÿÇöÿÿ0÷ÿÿ1÷ÿÿ2÷ÿÿn÷ÿÿ¦÷ÿÿÜ÷ÿÿøÿÿTøÿÿUøÿÿ,€IIJJ“J”J¥J“K”KûKüKM±M²M.O/OGO`OaO{O“O¬OÉOÊOãOäOÿOP*P+Pýýýýýûýýýýýýýýýýýýýýýýýýýýýýý+PHPcPP—P˜P™PéPêPEQšQ›QëQìQIR R¡RöR:S;S*OJQJOJQJNH[^[_[3\\Ž\\¨\³]ì]í]B^C^S^e^f^Ã^__ª_«_¬_¿_ ` ``/`F`V`j`{`‰`Š`Û`-a.a€aÇab`babzb{büùöóðâßÜÙÖÓÐÍÊÇÄÁ¾»¸ª§¤¡ž›–“Ї„~{xurol2ýÿÿKýÿÿLýÿÿšýÿÿåýÿÿ,þÿÿ~þÿÿþÿÿÑþÿÿ"ÿÿÿ#ÿÿÿ1ÿÿÿBÿÿÿVÿÿÿfÿÿÿ}ÿÿÿÿÿÿ ÿÿÿ¡ÿÿÿíÿÿÿ‘óÿÿY   ‘óÿÿäüÿÿåüÿÿvýÿÿwýÿÿÌýÿÿ)þÿÿ*þÿÿ<þÿÿLþÿÿMþÿÿ¢þÿÿ£þÿÿÜþÿÿçÿÿÿ®öÿÿY   ®öÿÿ[úÿÿ\úÿÿ¶úÿÿŠûÿÿ‹ûÿÿ)í]B^C^S^e^f^Ã^__ª_«_¬_¿_ ` ``/`F`V`j`{`‰`Š`Û`-a.a€aÇabýýýýýýýýýýýûýýýýýõýýýýýýýýýý Æ_¾$b`babzb{bÔbôbõbþb c4c5cQcqc•c¡c¢cYdüdýdifjf”f-gkglg¦gýýùýýýýýýñýýñýíýýýýýýýèääß & FÙ„h & F؄ńŠÆ_¾$„Å{bÔbôbõbþb c4c5cQcqc•c¡c¢cYdüdýdifjf”f-gkglg¦g»g¼gˆi‰iŠiŸi.j/j@jRjhjzjŒj¢j­jºjÊjÜjïjþjüùöóðëèåàÝÚ×ÔÑÎËÈÅ¿¼¹³°­ª§¤–“Ї„~{xurol›þÿÿ®þÿÿÀþÿÿÐþÿÿÝþÿÿèþÿÿþþÿÿÿÿÿ"ÿÿÿ8ÿÿÿJÿÿÿ[ÿÿÿ\ÿÿÿëÿÿÿ³éÿÿY   ³éÿÿ#öÿÿ$öÿÿð÷ÿÿñ÷ÿÿøÿÿ @øÿÿÙ Aøÿÿøÿÿ ùÿÿØ BùÿÿCùÿÿ¯úÿÿ°úÿÿSûÿÿ üÿÿ üÿÿüÿÿ;üÿÿ[üÿÿwüÿÿxüÿÿ¡üÿÿ®üÿÿ·üÿÿ¸üÿÿØüÿÿ1ýÿÿ*¦g»g¼gˆi‰iŠiŸi.j/j@jRjhjzjŒj¢j­jºjÊjÜjïjþjÿjPk¢k£kNlompm|nûùùùù÷ùùùùùùùùùùùùùùùùùùùùùù„hþjÿjPk¢k£kNlompm|n}n—nožo®o¾oÎoÞoßo¯u¯Ž¯¯Â¯Ã¯¦°§°¨°üùöóðëæáÜÎËÈÁ¹±®«¨š—”‘Ž‹ˆ…‚|yvspmjgd’ùÿÿ“ùÿÿvúÿÿwúÿÿªúÿÿ«úÿÿÄúÿÿûúÿÿüúÿÿûÿÿ>ûÿÿ?ûÿÿ·üÿÿýÿÿýÿÿøýÿÿùýÿÿîÿÿÿCôÿÿY   Côÿÿ{ýÿÿþÿÿþÿÿ…þÿÿ„  íþÿÿ„   b\ÿÿÿ„ ]ÿÿÿôÿÿÿÉöÿÿY   Éöÿÿˆøÿÿ‰øÿÿÏøÿÿÐøÿÿÒøÿÿßøÿÿùÿÿ6ùÿÿ;ùÿÿ%Kª@¬A¬&­'­‚­ú®û®'¯=¯>¯u¯Ž¯¯Â¯Ã¯¦°§°¨°Ø°Ö±×±²A²B²s²£²Ä² ³ýýýýýýýýýýýýýýýýýýûýýóóóóóóó„hH$7$8$Ÿ® ®¹®º®»®¾®¿®Ü®Ý®×±s²£²Ä²ü²³ ³³$³d³f³¬³®³î³ð³4´6´G´I´N´ª´º´Ï´ö´µ)µ-µ3µEµYµhµjµ¥µÅµÉµþµ¶2¶6¶R¶V¶¶í¶ø¶ ·?·E·K·W·_·j·¯·ó·¸¸A¸d¸v¸|¸‚¸”¸¨¸¿¸¹h¹j¹…¹¶¹úòúúïãØãØÌØÀØãØãØãØãØãØÀØÌØãØãØÀØãØÀØãØãØãØãØãØÌØãØÀØãØãØÌØãØãØÀØãØãØÀØãB*CJOJPJQJmHB* CJOJPJQJmHCJOJPJQJmHB* CJOJPJQJmHNHj¥©U jUL¨°Ø°Ö±×±²A²B²s²£²Ä² ³"³d³¬³î³4´G´_´m´‡´”´¦´¼´ö´)µYµaµfµ¡µÅµþµ2¶R¶¶§¶Ä¶Ó¶ç¶ú¶·?·_·f·¯·Ê·ôñîëèåâßÜÙÖÓÐÍÊÇÄÁ¾»¸µ²¯¬©¦£ š—”‘Ž‹ˆ…‚|yvsùøÿÿBùÿÿIùÿÿiùÿÿšùÿÿ®ùÿÿÁùÿÿÕùÿÿäùÿÿúÿÿúÿÿVúÿÿvúÿÿªúÿÿãúÿÿûÿÿBûÿÿGûÿÿOûÿÿûÿÿ²ûÿÿìûÿÿüÿÿüÿÿ!üÿÿ;üÿÿIüÿÿaüÿÿtüÿÿºüÿÿüüÿÿDýÿÿ†ýÿÿœýÿÿäýÿÿþÿÿ5þÿÿfþÿÿgþÿÿ‰þÿÿÑþÿÿÒþÿÿÐÿÿÿ‘ùÿÿY  ‘ùÿÿ, ³"³d³¬³î³4´G´_´m´‡´”´¦´¼´ö´)µYµaµfµ¡µÅµþµ2¶R¶¶§¶Ä¶Ó¶ç¶ú¶÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷„hH$7$8$ú¶·?·_·f·¯·Ê·Ù·í·¸A¸v¸¨¸²¸¹¸½¸¹%¹a¹f¹¹¶¹Ó¹ºº6º]ºˆº¤º÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷„hH$7$8$Ê·Ù·í·¸A¸v¸¨¸²¸¹¸½¸¹%¹a¹f¹¹¶¹Ó¹ºº6º]ºˆº¤ºªº®ºÛºõº2»6»V»»ƒ»„»…»–»ƒ¾î¾ï¾¶¿`ÀÁüùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´±®«¨¥¢ŸœŽ‹ˆ…wo%ûÿÿ…  Ïûÿÿ…   –üÿÿ… —üÿÿýÿÿïÿÿÿ´îÿÿY   ´îÿÿ$õÿÿ%õÿÿ'õÿÿRõÿÿrõÿÿvõÿÿ³õÿÿÍõÿÿúõÿÿþõÿÿöÿÿ öÿÿKöÿÿröÿÿŠöÿÿ‘öÿÿÕöÿÿòöÿÿ'÷ÿÿB÷ÿÿG÷ÿÿƒ÷ÿÿ ÷ÿÿë÷ÿÿï÷ÿÿö÷ÿÿøÿÿ2øÿÿgøÿÿ£øÿÿ»øÿÿÏøÿÿÞøÿÿ(¶¹ º"º<º]ºcºˆº—º¤º°º²ºßºõº!»2»8»V»…»–»ö»÷»W¼X¼‘¼˜¼É½Ê½ó½ô½õ½¾¾Ë¾Ì¾å¾æ¾ç¾ê¾ë¾î¾°¿±¿¶¿:À;ÀTÀUÀVÀ]À^À_ÀÁ·Á¸Á›œÂ^ßĠģťÅƸÊ=Ë>ËõéõÝõÝõÝõéõÝõÝõÝõÚÕÚÕÚÑÚÌÄÌÁÌ̹ÌÌÚÕÚ̱ÌÌÚÚÚÚÚÕÚ¬¬©NHOJQJjw«UjúªU0Jj"ªU jU6mHNHmHmHB* CJOJPJQJmHB*CJOJPJQJmHCJOJPJQJmHB¤ºªº®ºÛºõº2»6»V»»ƒ»„»…»–»ƒ¾î¾ï¾¶¿`ÀÁ¸Áœ›ÃAÄBÄ÷÷÷÷÷÷÷÷÷÷÷õóóóêêêááÚÚÓó & F…*$ & F…*$ & F…*$„›þ & F…*$„›þ„hH$7$8$Á¸Áœ›ÃAÄBģŤťŻÅñÅÆgÆGÈ3É­É¸ÊæÊçÊDËEˇ˩˪ËÀËÏËñËöêáÕÌÉÆÁ¼®«¥›ƒvia^[XUROLIFÖùÿÿåùÿÿûùÿÿüùÿÿúÿÿ`úÿÿaúÿÿ¾úÿÿ¿úÿÿíúÿÿ†  øûÿÿ†   püÿÿrüÿÿ†   êüÿÿ^ýÿÿ†   Öýÿÿ>ÿÿÿ†  ¶ÿÿÿˆÿÿÿ†   ´ÿÿÿ† êÿÿÿרÿÿY   רÿÿáõÿÿâõÿÿC÷ÿÿD÷ÿÿê÷ÿÿ…  ÿÿÿéøÿÿ…   ÿÿÿuùÿÿ…  ¨ÿÿÿÍùÿÿ…   ¨þÿÿsúÿÿ…  NÿÿÿBģŤťŻÅñÅÆgÆGÈ3É­É¸ÊæÊçÊDËEˇ˩˪ËÀËÏËñËý÷÷õýæ×ÌÌÌÌÃýýý»»»»»»„hH$7$8$ & F†¤<¤<  & F†*$¤<¤< & F†*$„Ê„›þ¤<¤< & F†*$„Ê„›þ¤<¤< Æ_¾$>ËEËÏËAÌOÌTÌsÌxÌ‹Ì̬ÌÂÌñÌÍÍÍÍ)Í5ÍGÍIÍNÍ`ͩͫÍÂÍáÍÎÎ Î1Î5Î;ÎNÎRÎgΌδιÎÁÎÅÎàÎýÎÏ8Ï@ÏBÏxÏÝÏSÐUÐuЛÐúÐÑ&ÑMÑtцѤѸÑëÑÒZÒ^Òj҂ҌҬÒÞÒãÒëÒïÒÓ^ÓfÓkÓsÓwÓ‘ÓÚÓâÓ'ÔóèóÜèÜèÜèóèÐèÜèóèóÜèóèÜèóèÜèóèÜèÜèóèÜèÜèóèóèÜèóèÜèóèÐèóèóèóèóèÜèóèóèÜèÜèóèÜèÜèóèóB* CJOJPJQJmHB*CJOJPJQJmHCJOJPJQJmHB* CJOJPJQJmHRñË ÌÌOÌs̬̋ÌÂÌÍÍ)Í3Í5ÍGÍLÍ`ͧͿÍáÍûÍÿÍÎ1ÎHÎ_ÎŒÎ¬Î»ÎØÎýÎ8ÏnÏ®ÏÝÏÿÏIÐiЛкÐÑÐìÐ ÑMцѸÑÐÑßÑüùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´±®«¨¥¢Ÿœ™–“Ї„~{xuÕóÿÿíóÿÿôÿÿXôÿÿ›ôÿÿ¹ôÿÿÔôÿÿëôÿÿ õÿÿ<õÿÿ\õÿÿ¦õÿÿÈõÿÿ÷õÿÿ7öÿÿmöÿÿ¨öÿÿÍöÿÿêöÿÿùöÿÿ÷ÿÿF÷ÿÿ]÷ÿÿt÷ÿÿ÷ÿÿ¦÷ÿÿª÷ÿÿÄ÷ÿÿæ÷ÿÿþ÷ÿÿEøÿÿYøÿÿ^øÿÿpøÿÿrøÿÿ|øÿÿŒøÿÿ¢øÿÿãøÿÿùøÿÿùÿÿ2ùÿÿVùÿÿŠùÿÿ˜ùÿÿ´ùÿÿ.ñË ÌÌOÌs̬̋ÌÂÌÍÍ)Í3Í5ÍGÍLÍ`ͧͿÍáÍûÍÿÍÎ1ÎHÎ_ÎŒÎ¬Î»ÎØÎ÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷„hH$7$8$ØÎýÎ8ÏnÏ®ÏÝÏÿÏIÐiЛкÐÑÐìÐ ÑMцѸÑÐÑßÑ Ò<ÒHÒRÒaÒ‚Ò¬Ò¶ÒÖÒåÒ÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷„hH$7$8$ßÑ Ò<ÒHÒRÒaÒ‚Ò¬Ò¶ÒÖÒåÒÿÒ<Ó^ÓmÓ‰ÓÚÓ'ÔVÔvÔ„Ô¡ÔÀÔÁÔÕVÕ§ÕêÕ)Ö*ÖJÖ•ÖÜÖéÖ5×C×`×–×—×â×2ØmØnØŽØÙØ Ù-ÙüùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´±®«¨¥¢Ÿœ™–“Ї„~{xu…ìÿÿÌìÿÿíÿÿ7íÿÿ8íÿÿsíÿÿÃíÿÿîÿÿîÿÿEîÿÿbîÿÿpîÿÿ¼îÿÿÉîÿÿïÿÿ[ïÿÿ{ïÿÿ|ïÿÿ»ïÿÿþïÿÿOðÿÿ—ðÿÿäðÿÿåðÿÿñÿÿ!ñÿÿ/ñÿÿOñÿÿ~ñÿÿËñÿÿòÿÿ8òÿÿGòÿÿiòÿÿ¦òÿÿÀòÿÿÏòÿÿïòÿÿùòÿÿ#óÿÿDóÿÿSóÿÿ]óÿÿióÿÿšóÿÿÆóÿÿ.åÒÿÒ<Ó^ÓmÓ‰ÓÚÓ'ÔVÔvÔ„Ô¡ÔÀÔÁÔÕVÕ§ÕêÕ)Ö*ÖJÖ•ÖÜÖéÖ5×C×`×–×—×÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷„hH$7$8$'Ô/ÔVÔ}Ô‚ÔŠÔŽÔ©ÔÁÔÉÔVÕ^Õ§Õ¯Õ*Ö2ÖJÖRÖTÖVÖ[Ö\Ö”Ö»ÖÜÖäÖéÖ×5×<×A×I×M×hחן×nØvØŽØ–Ø˜ØšØŸØ ØØØþØ Ù(Ù-ÙUÙyÙنَ٠٦ÙîÙðÙòÙôÙùÙúÙ2ÚZÚ\Ú^ÚcÚdÚšÚÁÚòÚôÚùÚ-ÛSÛ‚ÛùÜúÜÿܱÝõéõÝõÝõéõéõéõéõéõÝõÝõéõéõÝõéõÝõÝõéõéõéõÝõÝõéõéõÝõéõÝõéõéõÝõÝõéõÝõÝõéõéõÝõÑõÎÌ5mHB* CJOJPJQJmHB*CJOJPJQJmHB* CJOJPJQJmHCJOJPJQJmHO—×â×2ØmØnØŽØÙØ Ù-Ùyو٠٤ÙîÙ6ÚUÚXÚžÚ»Ú¿ÚòÚ-ÛSÛ‚ÛƒÛùÜúÜÒÝÞÝ÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷õõõõó„hH$7$8$-Ùyو٠٤ÙîÙ6ÚUÚXÚžÚ»Ú¿ÚòÚ-ÛSÛ‚ÛƒÛùÜúÜÒÝÞÝßÝÞÞÛÞÜÞBàCàDà]à=á>á²á³áPâQâ»â¼â´ãµãÊãüùöóðíêçäáÞÛØÕÒÏÌÉÆ¾»¸±¬§˜“‡„~{xurolifüÿÿüÿÿˆýÿÿ‰ýÿÿóýÿÿôýÿÿ‘þÿÿ’þÿÿÿÿÿÿÿÿçÿÿÿŽýÿÿY  Žýÿÿbýÿÿbýÿÿböþÿÿk  b÷þÿÿbSÿÿÿ bÃÿÿÿk óÿÿÿôÿÿÿY  «èÿÿ¬èÿÿ"êÿÿ#êÿÿRêÿÿxêÿÿ³êÿÿæêÿÿêêÿÿëÿÿMëÿÿPëÿÿoëÿÿ·ëÿÿìÿÿìÿÿìÿÿ,ìÿÿxìÿÿ(±Ý²ÝÞÞÞ0Þ1ÞEÞFÞIÞJÞmÞrÞÞ‡ÞˆÞ¡Þ¢Þ£Þ¦Þ§Þ¨ÞÕÞÙÞàÞáÞŽßßèßéß,à-à]àsà«à²à´à¹à¾àÄàBáIáXáfá·á¼á*â.âUâ[â\âaâzã{ãÛãîãïãä½åÉåìæòæ6ç7çç‚ç’ç“ç\è]èíêùêçëõëì ì&ì/ìƒì†ìÁíýûôûêûôûôæûôûÜôûôûæÙýýý×ææææ×æ×æ×ýÒÐÐ×ýýýý××××Ì5B*>*OJQJ5NHjo¬6U5B*jô«6U j6U6NHPÞÝßÝÞÞÛÞÜÞBàCàDà]à=á>á²á³áPâQâ»â¼â´ãµãÊãÛãîãïã¼å½åýýûôïûïïíýýýýýýýýýýééáýÜØ„h & Fy„Å Æ_¾$„Åb & Fb & F„hbÊãÛãîãïã¼å½åëæìæ²ç³çjèŸèééébé÷éMêNêÉêÊê%ì&ìIìoìpìÈíÉíyîÉîÊîëîìîíîïýïþï-ð.ð/ðü÷ôîëãàÝÚ×ÔÑÎÀ½º·´±®«¨¥¢Ÿœ™–“Їyvsnkh¿þÿÿÀþÿÿ`ïþÿÿðþÿÿêÿÿÿåîÿÿY   åîÿÿúÿÿúÿÿ:úÿÿ;úÿÿ‹úÿÿ;ûÿÿ<ûÿÿ”üÿÿ•üÿÿ»üÿÿÞüÿÿßüÿÿ:þÿÿ;þÿÿ¶þÿÿ·þÿÿ ÿÿÿ¢ÿÿÿèÿÿÿÎôÿÿY   ÎôÿÿA÷ÿÿ¥÷ÿÿÚ÷ÿÿ‘øÿÿ’øÿÿXùÿÿYùÿÿ‡úÿÿy  ˆúÿÿ Uüÿÿy Vüÿÿiüÿÿzüÿÿ'½åëæìæ²ç³çjèŸèééébé÷éMêNêÉêÊê%ì&ìIìoìpìÈíÉíyîÉîÊîëîìîúøòøøøøøðøøøøøøøøøêøøøøøøøø„ńńT„qü & FyÁíÂíÍíÜí$î%îÊîÒîþï-ð.ð9ðJñKñ†ññò‚òOôRô™ôšôùôúôdömö÷÷Ò÷Ó÷_ø`ø´ø ù3ú;úÞûçûhüiü¶ü¼üäüüü+þ0þMþ[þ~þþ‡þ›þÂþÊþÉÿÑÿíÿžŸ¦Ñ%DUŽ 34:;6 = > F J O P ýûýûöûýûóïýýûýýýöíûýûûûûýûííæöíãûûýÝÓËÁËÓËB* CJOJQJhCJOJQJhB*CJOJQJh OJQJhCJ CJOJQJ>*5B*NHkOJQJ5NHLìîíîïýïþï-ð.ð/ð9ð…ð†ð§ðèð}ñ~ñ³ñíñò ò’òÛò,ó-ó†ó ôÿôõ›õ[öýûýý÷ýýýýýûýýýýýýóýýýýýýýýýý„Ä`¤/ð9ð…ð†ð§ðèð}ñ~ñ³ñíñò ò’òÛò,ó-ó†ó ôÿôõ›õ[ö\ö ÷m÷n÷‡÷Ü÷Ý÷øø³ø´ø ùjù2ú3úOú¬ú­úÛúÜúüùöèåâßÜÙÖÓÐÍÊÇÄÁ¾»¸µ²¯¬©›˜•’Œ‰„~{xurol“üÿÿÁüÿÿÂüÿÿýÿÿ;ýÿÿ<ýÿÿþÿÿeþÿÿºþÿÿ»þÿÿlÿÿÿmÿÿÿ‘ÿÿÿ’ÿÿÿçÿÿÿdæÿÿY   dæÿÿùÿÿyùÿÿ*úÿÿ+úÿÿëúÿÿ†ûÿÿ‡ûÿÿæûÿÿýÿÿYýÿÿZýÿÿ«ýÿÿôýÿÿfþÿÿgþÿÿ™þÿÿÓþÿÿÿÿÿ ÿÿÿžÿÿÿßÿÿÿLíÿÿY   Líÿÿhþÿÿ´þÿÿ¾þÿÿ)[ö\ö ÷m÷n÷‡÷Ü÷Ý÷øø³ø´ø ùjù2ú3úOú¬ú­úÛúÜúûÏûÐû üvüwüµü¶üýýýýûýýýýýýõýýýýýýýýýýýýýýýý Æ_¾$ÜúûÏûÐû üvüwüµü¶ü*þ+þ…þ†þ‡þÁþÂþÖþ×þ#ÿ$ÿ9ÿÈÿÉÿìÿíÿ,D}~–²þ)UVrŽüùöóðíêçäáÞÛØÕÒÏÌÉÆ¸µ²¯¬§¢˜“މ„zupkf²ýÿÿÎýÿÿÏýÿÿûýÿÿ&þÿÿrþÿÿŽþÿÿ¦þÿÿ§þÿÿàþÿÿøþÿÿÿÿÿÿÿÿ7ÿÿÿ8ÿÿÿ[ÿÿÿ\ÿÿÿëÿÿÿ®ÞÿÿY   ®ÞÿÿKøÿÿ—øÿÿ˜øÿÿ¬øÿÿ­øÿÿçøÿÿèøÿÿéøÿÿCùÿÿDùÿÿ¸úÿÿ¹úÿÿ÷úÿÿøúÿÿdûÿÿžûÿÿŸûÿÿáûÿÿ’üÿÿ&¶ü*þ+þ…þ†þ‡þÁþÂþÖþ×þ#ÿ$ÿ9ÿÈÿÉÿìÿíÿ,D}~–²þ)UVýýýýýýýýýýýûøýýýöööööööööööö*$VrŽªÆâþÿ4ižŸÑÒö÷6opƒ›·Ù-.9Dýýýýýýýýýý÷õóóóóóóóóóóóóóóóóU Æ_¾$ŽªÆâþÿ4ižŸÑÒö÷6opƒ›·Ù-.9De}™ÆÚÛÜøûöñìçâÝØÓÐËÆÁ¼·²­¨£ž™”Š…€{vqlgb]XUHúÿÿUIúÿÿUJúÿÿU^úÿÿU‹úÿÿU§úÿÿU¿úÿÿUàúÿÿUëúÿÿUöúÿÿU÷úÿÿU ûÿÿUKûÿÿUmûÿÿU‰ûÿÿU¡ûÿÿU´ûÿÿUµûÿÿUîûÿÿUüÿÿU-üÿÿU.üÿÿURüÿÿUSüÿÿ…üÿÿ†üÿÿ»üÿÿðüÿÿ%ýÿÿ&ýÿÿBýÿÿ^ýÿÿzýÿÿ–ýÿÿ"De}™ÆÚÛÜø0Lh„…ºï$%×;NûO•–6 7 8 F ýýýýýýýýýýýýýýýýýýûûùûûûûûûûûUø0Lh„…ºï$%×;NûO•–6 7 8 F H x y ¥ Ñ Ò Û Ü 4 `   è + „ ° í ð ù û ûöñìçâÝØÓÎËȺ·´±®«¨¥¢Ÿœ™–“Ї„~{xuroliBûÿÿKûÿÿNûÿÿ‹ûÿÿ·ûÿÿüÿÿSüÿÿ›üÿÿÛüÿÿýÿÿ_ýÿÿ`ýÿÿiýÿÿjýÿÿ–ýÿÿÂýÿÿÃýÿÿóýÿÿõýÿÿþÿÿþÿÿþÿÿ¥þÿÿ¦þÿÿìþÿÿ@ÿÿÿíÿÿÿ—ÖÿÿY   —ÖÿÿMøÿÿÿøÿÿUùÿÿU5ùÿÿUjùÿÿUŸùÿÿU ùÿÿU¼ùÿÿUØùÿÿUôùÿÿUúÿÿU,úÿÿ(F H x y ¥ Ñ Ò Û Ü 4 `   è + „ ° í ð ù û ü ý þ ¥ ¦ ¿ Á ë ì H ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýP V a v {  ‚ ƒ „  ’ • – ¡ § ­ ® ¹ ¾ Á  Í Ô Ü Þ 6 7 @ K Q R X Y ` b j } €  • Ï Õ     Z ` n t ‡  › ¡ ¢ ¨ © ° ² º Í Ð Ñ å ì í ù ú þ ¥ ¦ ¬ ­ ² ³ öîäîÚîöÎöîÚîöîÚîöîÚîöîÄîÄîöîÚîÚîÚîöîÚîöîöîÚîöîöîöîöîÚîÚîÚîöîÚîöîÁÄî»»ÚîÚî OJQJhCJB* CJOJQJhB* CJNHOJQJhB*CJOJQJhB* CJOJQJhCJOJQJhB* CJOJQJhJû ü ý þ ¥ ¦ ¿ Á ë ì H I o  Æ è c޳ÈÉÒÔÕäå^_•–¼½56IJž)üùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´¬§›˜•’Œ‰†ƒ€}zwtqnGùÿÿ›ùÿÿœùÿÿãùÿÿäùÿÿ¯úÿÿ°úÿÿÞúÿÿ(ûÿÿ)ûÿÿOûÿÿPûÿÿ†ýÿÿ‡ýÿÿåÿÿÿðÿÿÿY  ðÿÿÿUñÿÿÿY  gøÿÿiøÿÿrøÿÿsøÿÿˆøÿÿ­øÿÿ®øÿÿØøÿÿ)ùÿÿSùÿÿuùÿÿyùÿÿÌùÿÿòùÿÿóùÿÿOúÿÿPúÿÿzúÿÿ|úÿÿ•úÿÿ–úÿÿ=ûÿÿ>ûÿÿ?ûÿÿ@ûÿÿ+³ ¿ à ì ö ÷ ÿ      - 3 9 I o w x €  “ ” ¨ ® ´ Ê Ð û  %,-78?ouvˆ’˜œŸ·ÇÈÒÓÔÕäåÔÕ_grs78]cij«º½ÐMaöîäÚîöîöîÚîöîöîäÚîöîÚîöîöîöîöîöÎöîöîÚîöîÚîÚîäîäîÈîÅÃÀÃÀÀÀÃüÃÃ5B*NH5CJ OJQJhB* CJNHOJQJhB*CJOJQJhB* CJOJQJhCJOJQJhB* CJOJQJhJH I o  Æ è c޳ÈÉÒÔÕäå^_•–¼½56ýýýýýýýýýýýýýýýûù÷ýýýýýýýýññ„ „íôUa†‡ I\–—§*7hiv|§²úûœû QYƒ†ˆ‰@QYZ[hkxðó WYbcœžª«ãõabiwÎál®¯Úß:;o†ÄÎ$=G\]­ » -!.!Þ!ß!æ!ð!ýûûýûûýûûûûûûûûýûûû÷ûûûûõýûûíæûýûûýûûûýûûûûûûýýû CJOJQJ5CJOJQJH*5NH5NH[IJž)*vwúûŽûüQRˆ‰jkðñòó  ùùùùùùùùùùùùùùùùùùùùùùùùùù÷õ„ „íô)*vwúûŽûüQRˆ‰jkðñòó  œ«âãij¶·%&k®¯no\]^_`üùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ²¯¬©¦£ š—”‘Ž‹ˆ…‚|yvsp”ûÿÿ•ûÿÿ–ûÿÿ—ûÿÿ„üÿÿ…üÿÿDýÿÿEýÿÿˆýÿÿÍýÿÿÎýÿÿ<þÿÿ=þÿÿ‰þÿÿŠþÿÿÿÿÿÿÿÿHÿÿÿVÿÿÿWÿÿÿæÿÿÿçÿÿÿâôÿÿY   âôÿÿóôÿÿôôÿÿõôÿÿzõÿÿ{õÿÿËõÿÿÌõÿÿ\öÿÿ]öÿÿ“öÿÿ”öÿÿéöÿÿêöÿÿV÷ÿÿW÷ÿÿê÷ÿÿë÷ÿÿnøÿÿoøÿÿ»øÿÿ¼øÿÿ, œ«âãij¶·%&k®¯no\]^_`abcde~ ùùùõõùùùùùùùùùùùùùùùùùùùùùóù„ „ „íô`abcde~    © ª é ê æ!""Š"‹"9#:#Ê#Ë#ä#$$N$O$½$¾$ä$å$F%G%H%Š%¦%§%¹%º%üùöóðâßÜÙÖÓÐÍÊÇÄÁ¾»¸µ²¯¡ßž›˜•’Œ‰†ƒ€xuifîÿÿÿãÿÿÿY  ãÿÿÿäÿÿÿY  ƒþÿÿ„þÿÿ…þÿÿæþÿÿçþÿÿ ÿÿÿÿÿÿ|ÿÿÿ}ÿÿÿ¬ÿÿÿ­ÿÿÿ ëÿÿY   ëÿÿ›úÿÿ+ûÿÿ,ûÿÿÚûÿÿÛûÿÿIüÿÿJüÿÿüÿÿ{ýÿÿ|ýÿÿ»ýÿÿ¼ýÿÿOþÿÿPþÿÿZÿÿÿ\ÿÿÿçÿÿÿpðÿÿY   pðÿÿûÿÿûÿÿ‘ûÿÿ’ûÿÿ“ûÿÿ(    © ª é ê æ!""Š"‹"9#:#Ê#Ë#ä#$$N$O$½$¾$ä$å$F%G%H%ùõùùùùùùóùùóùùùùñùùùùùóùùùùù„ „ „íôð!3"F"k"l"‹"š"9#G#‰#Š#ñ#ü#$*$N$O$f$z$ž$Ÿ$½$¾$å$ï$º%Â%Ã%×%Ù%á%í%ö%& &&&&&.&9&?&G&H&V&X&`&k&s&t&‡&‰&‘&œ&¤&µ&½&¾&Ñ&Ó&Û&æ&ï&ÿ&' ' ''-'/'7'P'X'Y'm'o'w'ƒ'‹'Œ'¡'£'«'·'À'Î'Ù'ß'ç'è'ù'û'((($(,(:(B(P(ýúýýúýýýýúýýýýýýýúýýýýýýýýýýýýýýúýýýýýýýýýýýýýýýýNH5cH%Š%¦%§%¹%º%?&k&µ&'P'‚'ƒ'ß'd(Î( )M)˜)à)*x*¤*Þ*+e+˜+™+,ýûýùý÷÷÷÷÷÷ò÷÷÷÷÷÷÷÷÷÷÷÷÷÷ò÷‘ & F‘º%?&k&µ&'P'‚'ƒ'ß'd(Î( )M)˜)à)*x*¤*Þ*+e+øîäÚÐÆÁ·­£™…{qg]SI?‘•úÿÿˆ  ‘Éúÿÿˆ  ‘ûÿÿˆ  ‘/ûÿÿˆ  ‘—ûÿÿˆ  ‘Çûÿÿˆ  ‘üÿÿˆ  ‘Züÿÿˆ  ‘šüÿÿˆ  ‘Ùüÿÿˆ  ‘Cýÿÿˆ  ‘Èýÿÿˆ  ‘$þÿÿˆ  ‘%þÿÿ‘Wþÿÿˆ  ‘þÿÿˆ  ‘òþÿÿˆ  ‘<ÿÿÿˆ  ‘hÿÿÿˆ   ‘íÿÿÿˆ P(V(d(l(m(€(‚(Š(•(ž(ª(²(½(Å(Î(Ö(×(ç(é(ñ(ü() )))')))1)<)E)M)U)V)l)n)v))Š)˜) )¡)²)´)¼)Ç)Ï)à)æ)ç)û)ý)****&*(*0*;*D*P*X*e*m*x*€***‘*™*©*»*½*Å*ã*ý*ÿ*++(+*+2+=+A+M+V+e+m+n+ƒ+…++™+¡+¢+¯+±+¹+Å+Î+Ý+ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý5de+˜+™+,W,˜,-A-‚-¸-î-$.V.‚.»./ƒ/Ú/C0±0ø0öñçÝÓÉ¿µ«¡—ƒyoe[QG=‘öôÿÿˆ  %‘dõÿÿˆ  $‘Íõÿÿˆ  #‘$öÿÿˆ  "‘¡öÿÿˆ  !‘ìöÿÿˆ  ‘%÷ÿÿˆ  ‘Q÷ÿÿˆ  ‘ƒ÷ÿÿˆ  ‘¹÷ÿÿˆ  ‘ï÷ÿÿˆ  ‘%øÿÿˆ  ‘føÿÿˆ  ‘¦øÿÿˆ  ‘ùÿÿˆ  ‘Pùÿÿˆ  ‘“ùÿÿˆ  ‘úÿÿˆ  ‘úÿÿ‘Búÿÿˆ  Ý+è+î+÷+, ,,,,),+,3,>,G,W,],^,k,m,u,€,‰,˜, ,¡,®,°,¸,Ã,Ì,×,à,ì,ô,- - ---!-,-5-A-E-F-U-W-_-j-o-u-y-‚-Š-‹-˜-š-¢-­-²-¸-À-Á-Î-Ð-Ø-ã-è-î-ö-÷-.....).3.5.=.[.m.o.w.‡.“.•..¨.±.À.É.Ë.Ó.Þ.â.î.÷.///ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýý5d,W,˜,-A-‚-¸-î-$.V.‚.»./ƒ/Ú/C0±0ø0J1ñ12F2‘2á2.3‹3í3<4v4¡4ýýýýýýýýýýýýýýýýýýýýýýýýýýýýý‘///"/-/5/C/K/Y/a/o/u/ƒ/‹/Œ/™/›/£/®/·/Ã/Ì/Ú/â/ã/ï/ñ/ù/0 000%0+060:0C0K0L0]0_0g0r0x0~0ˆ0“0™0¤0¨0±0¹0º0Â0Ä0Ì0×0Ý0ã0ë0ø011111)1/151?1J1R1S1[1]1e1v1|1‚1‹1¦1§1×1Û1ä1è1ñ1ù1ú12222"2#21232;2F2N2ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýúýýýýýýýýýNH5cø0J1ñ12F2‘2á2.3‹3í3<4v4¡4E5’5Þ5 6 6 6"6ä677öìâØÎĺ°¦œ’ˆ~tj`[VHC@;BáÿÿÿeœéÿÿÿïÿÿY   ïÿÿ‘ïÿÿƒžïÿÿ‘Éïÿÿˆ  5‘ðÿÿˆ  4‘bðÿÿˆ  3‘ñÿÿˆ  2‘1ñÿÿˆ  1‘kñÿÿˆ  0‘ºñÿÿˆ  /‘òÿÿˆ  .‘yòÿÿˆ  -‘Æòÿÿˆ  ,‘óÿÿˆ  +‘aóÿÿˆ  *‘óÿÿˆ  )‘¶óÿÿˆ  (‘]ôÿÿˆ  '‘¯ôÿÿˆ  &N2O2Y2[2c2n2w2ƒ2‰2‘2™2š2©2«2³2¾2È2Ó2Ù2á2é2ê2ù2û2333 3&3.36373A3C3K3V3_3q3w3}3ƒ3‹3“3”3£3¥3­3¸3Â3Ó3Ù3ß3å3í3õ3ö3þ34444%4.46474<4D4E4O4Q4Y4j4p4v4~44Œ4Ž4–4¡4©4ª4³4µ4½4Î4Ô4Ú4ã4ý4þ4,50595=5E5M5N5X5Z5ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýúýýýýýýýýýýýýúýýýýNH5c¡4E5’5Þ5 6 6 6"6ä67717S7u7’7À7É7Ô7™8(9_9k99[:d:é:¯;ýýýýöñïíèæäääääæäàíèæääæäíe„hzBe„h@&œ‘ & Fƒ & F„‘Z5b5s5y55ˆ5’5š5›5§5©5±5¼5À5Ê5Ò5Þ5æ5ç5ô5ö5þ5"6#6>6@6[6\66‰6–6 6­6·6Ä6Î6×6â67717=7S7_7u77’7Ÿ7™8š8º8¼8Ü8Ý89 9999&9k9u99œ9é:ê: ; ;*;+;V;^;j;v;„;‡;“;š;¦;¨;©;­;>=?=z>„>È>Ö>M?ýýýýýýýýýýýôðôðôîîîîîîîîîîçåçåçîîáîîîçåçåçîîîîîáîÞîîNH6NH jU6CJjCJU5X717S7u7’7À7É7Ô7™8(9_9k99[:d:é:¯;Õ=n>z>È>M?‚?À?÷?@j@û@JAVAyA¡AÈAÑA BûöñìçâÝØÓÐËÆÁ¼·²­¨£ž™”Š…€{vqlgb]XzW÷ÿÿB`÷ÿÿz‡÷ÿÿz¯÷ÿÿzÒ÷ÿÿBÞ÷ÿÿe-øÿÿœ¾øÿÿz(ùÿÿB1ùÿÿzhùÿÿz¦ùÿÿzÛùÿÿz`úÿÿz®úÿÿBºúÿÿeSûÿÿeyýÿÿœ?þÿÿzÄþÿÿBÍþÿÿz›ÿÿÿz½ÿÿÿBÉÿÿÿeœKþÿÿeÿÿÿzÿÿÿB$ÿÿÿzRÿÿÿzoÿÿÿz‘ÿÿÿz³ÿÿÿzÕÿÿÿ"¯;Õ=n>z>È>M?‚?À?÷?@j@û@JAVAyA¡AÈAÑA B~B«C·CÙCâC1D¯DàDìDEûûù÷÷÷÷÷ù÷õûù÷÷÷ù÷õûù÷ù÷õðù÷e„h@&œzBe„hM?R?S?^?‚?‹?À?É?U@V@j@k@‡@‰@¥@¦@Ì@Ô@ã@æ@ò@ù@VA`AyA~AA…A¡AªA B B)B+BJBKBtB|B·CÁC1D2DNDPDlDmD“D›DªD­DìDöDEEEEÝEÞEýEÿEFFHFPFXF[FŸF©FÁFÆFÇFÌFGG8G=GwGxG—G™G¸G¹GâGêG,H6HÉHÊH I I'I)IDIEIfIýûýýøñïñïñýýýýýûýñïñïñýýñïñïñýýýýûñïñïñýýýýûûûñïñïñýýøñïñïñ jUNH56^ B~B«C·CÙCâC1D¯DàDìDEDEMEXExE£EÝE]F“FŸFÁFøFGNGwGìG H,HNHWHbH‚HÑHûöñìçâÝÚÕÐËÆÁº°¦¡Úœ—’ˆƒ~Úytoj`V.jÿÿÿ€  .Šÿÿÿ€  z•ÿÿÿBžÿÿÿzÀÿÿÿBÌÿÿÿœæþÿÿeÿÿÿz\ÿÿÿBeÿÿÿzœÿÿÿz¾ÿÿÿBÊÿÿÿœÒþÿÿ. ÿÿÿ€  .7ÿÿÿ€   .Wÿÿÿ€ zbÿÿÿBkÿÿÿz ÿÿÿzÃÿÿÿBÏÿÿÿeœ÷ôÿÿzFõÿÿBOõÿÿzqõÿÿB}õÿÿeªöÿÿœ÷ÿÿ EDEMEXExE£EÝE]F“FŸFÁFøFGNGwGìG H,HNHWHbH‚HÑH I˜IUJaJ„Jýûýùùù÷òûýýûýî÷òûýûýùùù÷îûýe„he„h@&œ.BzÑH I˜IUJaJ„J‘JÈJðJñJKK?K@KIKLKÃKALMLpL“LœLŸLMÏMÛMþMNN¨NàNöñìçâÝÓÉÄ¿µ«¦¡œ—’ˆƒ~ytoje`[VSeœÙùÿÿzåùÿÿBîùÿÿzúÿÿBúÿÿeÞúÿÿœMûÿÿzPûÿÿBYûÿÿz|ûÿÿzŸûÿÿB«ûÿÿe)üÿÿœ üÿÿz£üÿÿB¬üÿÿz­üÿÿ.Íüÿÿ€  .ëüÿÿ€  zûüÿÿzüüÿÿ.$ýÿÿ€  .[ýÿÿ€  zhýÿÿz‹ýÿÿB—ýÿÿeTþÿÿœáþÿÿ.ÿÿÿ€  fInIuI~IŠI–IaJkJ„JJñJÿJLKMKiKkK‡KˆKªK²K»KÁKMLWLpLxLŸL L½L¿LÜLÝLM MpMqMÁMÂMÛMåMNN2N4NRNSN{NƒNŠN‘NžN¦NìNöNOO­O®OÃOÍO&P'PWQXQ´RµR5S6SUSWSvSwSžS¦S²SµS¶S¾SóSýST#TnUoUU’U³U´UßUçUöUùUVýýýýýýöôöôöýýýýöôöôöýññýöôöôöýýýýýñýîññöôöôöýýêýýýöôöôöýý6NHNHcNH jU6\„J‘JÈJðJñJKK?K@KIKLKÃKALMLpL“LœLŸLMÏMÛMþMNN¨NàNìNOýûûýýûûýùý÷óùýýùý÷óùýùý÷îùýe„h@&e„hœB.zàNìNOO_OÂOÃO­Q¶QRÁR5SÀSçSóSTàTéTnU V‚VŽV±VÞVçV4W‚WƒWŒW—W·WûöñçÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~tje`[Q.÷ÿÿ€  z÷ÿÿB%÷ÿÿz&÷ÿÿ.t÷ÿÿ€  .Á÷ÿÿ€  zÊ÷ÿÿz÷÷ÿÿzøÿÿB&øÿÿeŸøÿÿœ:ùÿÿz¿ùÿÿBÈùÿÿz“úÿÿzµúÿÿBÁúÿÿeèúÿÿœsûÿÿeçûÿÿe§üÿÿzòüÿÿBûüÿÿzåþÿÿzæþÿÿ.Iÿÿÿ€  .Žÿÿÿ€  z™ÿÿÿz¼ÿÿÿBÈÿÿÿOO_OÂOÃO­Q¶QRÁR5SÀSçSóSTàTéTnU V‚VŽV±VÞVçV4W‚WƒWŒW—W·Wýûûýýùýõõóõùýýùýóõùýýýûûýùýûœe„hB.zVVŽV˜V±V¶VÞVåV&W'WŽYY«Y­YÉYÊYðYøYZ ZZZ`ZfZvZwZ‹Z•Z®Z¹ZõZúZ¢\£\Ø\Ù\ú\ü\]]I]Q]^]f]o]r]u]v]•]—]¶]·]à]è]ð]ó]7^A^Y^^^_^d^¢^£^Ö^Û^/_0_O_Q_p_q_š_¢_®_¶_Â_Ë_Ø_á_Ã`Í`å`ï`aa)a4aŒbb²b´bÙbÚb cýýýýúóñóñóýýýïúýýýúóñóñóýýýóñóñóýýýýïúïóñóñóýýýýýýýýóñóñó5 jUNH6^·WïWXRX‹XŽYZZ‹Z®ZõZ[%[0[P[¨[à[\I\Ø\t]u]õ]+^7^Y^¹^Â^_öìâØÓÎÉÄ¿ºµ°«¡—ƒytojeb]XSNIz3ÿÿÿB<ÿÿÿzœÿÿÿz¾ÿÿÿBÊÿÿÿeœ3ñÿÿe4ñÿÿœÐñÿÿe_òÿÿ.˜òÿÿ€  .Èòÿÿ€  .óÿÿ€  .Xóÿÿ€  .xóÿÿ€  zƒóÿÿBŒóÿÿz³óÿÿzúóÿÿzôÿÿB)ôÿÿeôÿÿœõÿÿeöÿÿ.Vöÿÿ€  .’öÿÿ€  .¹öÿÿ€  .ñöÿÿ€  ·WïWXRX‹XŽYZZ‹Z®ZõZ[%[0[P[¨[à[\I\Ø\t]u]õ]+^7^Y^¹^Â^ýýýýù÷ùõóóóõóýýýýýù÷ñ÷ìõóóõe„h@&ezBœe„h.Â^_/_ã_f`g`¶`·`Ã`å`a)ahaqaÏacbŒb-c‹c cµcÍcàcácndÀdÌdìdEeýù÷ùùõùóýýýýóýùù÷ùõõõõùùùóýýBƒœe„hz_/_ã_f`g`¶`·`Ã`å`a)ahaqaÏacbŒb-c‹c cµcÍcàcácndÀdÌdìdEeNeZe8fûöñìåàÛÖÑÌǽ¸³®©Ÿ•‹|wrmhc^YTœ›øÿÿz§øÿÿB°øÿÿz ùÿÿz)ùÿÿB5ùÿÿe‡ùÿÿeúÿÿeúÿÿƒ(úÿÿ{  ƒ@úÿÿ{  ƒUúÿÿ{  ƒjúÿÿ{  eÈúÿÿœiûÿÿe’ûÿÿe&üÿÿz„üÿÿBüÿÿzÌüÿÿzïüÿÿzýÿÿz2ýÿÿB>ýÿÿe?ýÿÿ ƒŽýÿÿ{ eýÿÿeþÿÿœÆþÿÿeïþÿÿ ccc+cƒc„cÌdÖdìdûdZe[eeƒe©eªeÜeäeðeúef ffff%f3f6f÷føfRk\kâkîkll2l@l”l•l«l°l±l¼l8m9mMmNmtmvmœmmÍmÕmÔnÕno(oSoTowoyoœooÆoÎo×oÝoppœq¦q¼qÄqìqíqrr9r:rirqr}rŠr•r¢r¶uÀuÖuåuv.vavbvýýúýýóñóñóýýýýíýýúýýýýúýëúóñóñóýúýóñóñóýýúýýóñóñóýýýýýýó56NH jUNH6]EeNeZe8fÿf,hÐiFkRkâkl2l«lÚlãlMm×mxnoo>oGoSoßo—pqqqœqýûùõõõõýûûûûûýûùõõýûýûùõõóõýƒe„hœzB8fÿf,hÐiFkRkâkl2l«lÚlãlMm×mxnoo>oGoSoßo—pqqqœq¼qàqéqìq¤r t4tEtûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[VeÁéÿÿeééÿÿeQëÿÿœ ìÿÿz ìÿÿBìÿÿz9ìÿÿzYìÿÿBeìÿÿefìÿÿƒãìÿÿ{  e^íÿÿeîÿÿœ¢îÿÿz®îÿÿB·îÿÿz×îÿÿBãîÿÿe}ïÿÿeðÿÿœ¨ðÿÿzñÿÿBñÿÿzJñÿÿzÃñÿÿzðñÿÿzòÿÿz£òÿÿB¯òÿÿe%ôÿÿeÉõÿÿeööÿÿe½÷ÿÿ!œq¼qàqéqìq¤r t4tEtkt’t¤t·tÒtçtªu¶uÖuvLvUvavÙvóvþw¦x²xáxêxýýûýùõõõõõõõõõõûýýýûýùõõõûýûe„hœBzEtkt’t¤t·tÒtçtªu¶uÖuvLvUvavÙvóvþw¦x²xáxêxDyÓyz zCzwzz¦z±zÑz{ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoe[.$ãÿÿ€  .Dãÿÿ€  zOãÿÿBXãÿÿz~ãÿÿz²ãÿÿzÕãÿÿBáãÿÿe"äÿÿœ±äÿÿz åÿÿBåÿÿzCåÿÿBOåÿÿe÷åÿÿeçÿÿeçÿÿœ”çÿÿz çÿÿB©çÿÿzÖçÿÿzèÿÿz?èÿÿBKèÿÿeéÿÿe#éÿÿe>éÿÿeQéÿÿecéÿÿeŠéÿÿe°éÿÿbv‚v„v¤v¥vÏv×vMwNwŽw¨w©w±w‹x–x²x¼xDyEy_yay{y|y y¨y·yºyÆyÍyÎyÑy z*zCzHzIzOzwz„zj{k{…{‡{¡{¢{Æ{Î{Ý{à{ì{ó{ý{||| |(|/|5|>|C|§|±|Ê|Ï|Ð|Ö|ò|û|}"}T}^}È}É}0~:~’~š~ »¼ÖØòó‚‚.‚1‚>‚ýöýöôñïëïïôöýöýöôôôçôôôïôöýöýöôôôôôôôôôôïôôôñôôôöýöýöôô6NH5NH5NH6 jU[êxDyÓyz zCzwzz¦z±zÑz{0{j{E|›|§|Ê|ò|}T}`}Ð}/~0~’~£~Ø~ ýû÷õýýýõýóóóóû÷õýýýýýóóýýýóó.Be„hœz{0{j{E|›|§|Ê|ò|}T}`}Ð}/~0~’~£~Ø~  PpqzµM€ù€»I‚öìçâÝØÓÎÉĺ°«¦¡—ˆƒyoje`[VQLœ:ÜÿÿeüÜÿÿe¨Ýÿÿe@Þÿÿz{ÞÿÿB„Þÿÿz…Þÿÿ.¥Þÿÿ€  !.×Þÿÿ€  zèÞÿÿzéÞÿÿ.ßÿÿ€  .Rßÿÿ€  zcßÿÿzÅßÿÿzÆßÿÿ.%àÿÿ€  .•àÿÿ€  z¡àÿÿzÜàÿÿzáÿÿz+áÿÿzNáÿÿBZáÿÿe°áÿÿœ‹âÿÿ.Åâÿÿ€  .õâÿÿ€    PpqzµM€ù€»I‚—‚£‚Æ‚ñ‚?ƒHƒyƒ„¯„°„c…X†d†‡†ê†i‡ýýûûýùýõõõóõùýýýùýõóñóõùýýýeœe„hB.z>‚G‚w‚}‚£‚­‚Ƃ˂ق߂ñ‚ü‚„„3„5„T„U„~„†„•„˜„¥„©„ª„­„°„±„τфï„ð„… …)…,…9…B…M…T…[…a…………¿…À…d†n†‡†Œ†š† †ê†õ†i‡r‡2ˆ:ˆ{Š|ЏйŠÜŠÞŠ‹‹/‹7‹@‹C‹P‹T‹U‹X‹c‹j‹q‹w‹z‹{‹œ‹ž‹¿‹À‹ç‹ï‹÷‹ú‹ŒŒ˜Œ¢ŒºŒ¿ŒýûýýûýôòôòôýýýîýôòôòôýýýýýûëýýûýýýëôòôòôýýýîýýýôòôòôýýýýýNH6NH jU56]I‚—‚£‚Æ‚ñ‚?ƒHƒyƒ„¯„°„c…X†d†‡†ê†i‡t‡›‡LJõ‡1ˆ2ˆ<ˆlˆœˆˆ¦ˆæˆĉ¸ŠûöñìçâÝØÓÎÉÄ¿ºµ°­£™…€{qgb]XSNe¥ýÿÿeƒþÿÿzÃþÿÿBÌþÿÿzÍþÿÿ.ýþÿÿ€  '.-ÿÿÿ€  &z7ÿÿÿz8ÿÿÿ.tÿÿÿ€  %.¢ÿÿÿ€  $.Îÿÿÿ€  #.õÿÿÿ€  "zz ×ÿÿzn×ÿÿz‘×ÿÿB×ÿÿe’ØÿÿœEÙÿÿeFÙÿÿœâÙÿÿe|Úÿÿz­ÚÿÿB¶ÚÿÿzÛÿÿz/ÛÿÿzRÛÿÿB^Ûÿÿe¬Ûÿÿi‡t‡›‡LJõ‡1ˆ2ˆ<ˆlˆœˆˆ¦ˆæˆĉ¸Šy‹z‹ ŒŒŒ˜ŒºŒòŒw€ÎŽ;ŽÅŽüúúúúøøúúøöøòòðîðòöøøøöèúòð. ƃeœe„hBz.z@&¸Šy‹z‹ ŒŒŒ˜ŒºŒòŒw€ÎŽ;ŽÅŽ .›¤)‘!‘-‘M‘o‘‘‘®‘Ü‘å‘𑵒w“”ûöñìçâÝØÓÉ¿ºµ²­¨£ž™”²Š…€{vqlgb]XeŒýÿÿœNþÿÿeÿÿÿzÿÿÿB'ÿÿÿzUÿÿÿzrÿÿÿz”ÿÿÿz¶ÿÿÿzÖÿÿÿBâÿÿÿœœþÿÿeÅþÿÿz!ÿÿÿB*ÿÿÿz—ÿÿÿz¹ÿÿÿBÅÿÿÿeœ.ùÿÿeWùÿÿ.›ùÿÿ€  ).éùÿÿ€  (Bòùÿÿzwúÿÿz¯úÿÿzÑúÿÿBÝúÿÿe`ûÿÿœïûÿÿeðûÿÿœ±üÿÿ!¿ŒÀŒÅŒòŒúŒUZ¢éî;Ž<Ž[Ž]Ž|Ž}Ž¦Ž®ŽºŽ»Ž¼ŽÃŽ .9Žùú)*MOrs ¨µ¿ÌÖãíöúû‘-‘7‘M‘Y‘o‘{‘‘‘‘®‘»‘µ’¶’Û’Ý’““2“:“F“O“\“c“p“u“””4”?”_”h”¬”³”©•ª•ѕӕú•û•.–6–B–M–[–ýûýýýýôòôòôûûîûûûëëôòôòôûûûûûîûûûûûûôòôòôûûûûûûûûôòôòôûûNH6NH jU65]ÅŽ .›¤)‘!‘-‘M‘o‘‘‘®‘Ü‘å‘𑵒w“””4”_”¬”&•/•„•©•úøööøöòðúøöööööøöòðòøööööøöòœe„hzBe„h@&””4”_”¬”&•/•„•©•`–——Ù—ý—-˜6˜ž˜¾˜U™V™W™Ñ™^š­š¹šÙšâ𛵛bœnœŽœùœûöñìçâÝØÓÎÉÄ¿ºµ°«¡œ—ˆ…€{vqlgb]XzÐýÿÿzðýÿÿBüýÿÿe©þÿÿœNÿÿÿz|ÿÿÿB…ÿÿÿz¥ÿÿÿB±ÿÿÿeœ2÷ÿÿƒ¬÷ÿÿ{  e­÷ÿÿe®÷ÿÿƒEøÿÿ{  eeøÿÿzÍøÿÿBÖøÿÿzùÿÿz*ùÿÿzvùÿÿB‚ùÿÿe£úÿÿœZûÿÿeûÿÿzÔûÿÿBÝûÿÿzWüÿÿz¤üÿÿzÏüÿÿzïüÿÿBûüÿÿ [–^–v—w————Ù—æ—ý—˜˜˜Š˜‹˜Ñ™Ò™ù™û™"š#šTš\š¹šÚ››4›6›Y›Z›ƒ›‹›’›››§›«›¬›³›nœxœŽœ™œùœPQuw›œÆÎ×Ýožyžž˜ž¿žÀžãžåžŸ Ÿ6Ÿ>ŸKŸXŸŒŸ–Ÿ¬Ÿ»Ÿ˜ ™ » ½ ß à  ¡¡!¡&¡¦¡°¡Æ¡Í¡˜¢™¢¸¢º¢Ù¢Ú¢£ £ýúýýýøúñïñïñýýñïñïñýýýëýýýýñïñïñýýýýñïñïñýýýýñïñïñýýýýñïñïñý6NH jU5NH6]©•`–——Ù—ý—-˜6˜ž˜¾˜U™V™W™Ñ™^š­š¹šÙšâ𛵛bœnœŽœùœDMPýù÷õõõ÷õùóùùóýî÷õ÷õýù÷õõõ÷õe„h@&ƒzBe„hœùœDMPßcžožž³ž¼ž¿žZŸ€ŸŒŸ¬ŸõŸþŸ˜ (¡š¡¦¡Æ¡¢ ¢s¢˜¢L££™£¹£Ø£Œ¤ó¤ü¤ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[BkõÿÿzÒõÿÿz†öÿÿz¥öÿÿzÅöÿÿBÑöÿÿe÷ÿÿœÆ÷ÿÿeë÷ÿÿzQøÿÿBZøÿÿz˜øÿÿz¸øÿÿBÄøÿÿe6ùÿÿœÆùÿÿz`úÿÿBiúÿÿz²úÿÿzÒúÿÿBÞúÿÿeûÿÿœŸûÿÿz¢ûÿÿB«ûÿÿzÎûÿÿzïûÿÿBûûÿÿeüÿÿœýÿÿzýÿÿBýÿÿzeýÿÿ!Pßcžožž³ž¼ž¿žZŸ€ŸŒŸ¬ŸõŸþŸ˜ (¡š¡¦¡Æ¡¢ ¢s¢˜¢L££™£¹£Ø£Œ¤ýù÷õõ÷õýù÷õõ÷õýù÷õõ÷õùýù÷õõõzBe„hœ ££ £-£6£C£J£™£££¹£Ä£Ø£ã£Œ¤•¤v¥w¥—¥™¥¹¥º¥ä¥ì¥¦$¦¼¦½¦ã¦å¦ § §:§B§¡§«§ߨ਩ ©2©3©e©m©y©„©¶©À©Ö©ã©§ª¨ª˪ͪðªñª«&«2«7«‘«’«§«±«Ç«Ϋ¬¬¼¬¾¬ê¬ë¬­%­E®F®˜®¢®Ä®Å®ä®æ®¯¯/¯7¯C¯L¯X¯c¯įůó¯ý¯°!°|±ýýýýýýýöôöôöýýöôöôöýýöôöôöýýýýöôöôöýýñýýöôöôöýñýöôöôöýýýñýýNH jU6_Œ¤ó¤ü¤Q¥v¥î¥¦¦9¦B¦—¦¼¦D§•§¡§À§ɧʧ ¨E¨y¨º¨ߨ†©ª©¶©Ö©$ªýûý÷õðûýûý÷õ÷ûýûýîîîî÷õ÷ûýý.e„h@&œe„hBzü¤Q¥v¥î¥¦¦9¦B¦—¦¼¦D§•§¡§À§ɧʧ ¨E¨y¨º¨ߨ†©ª©¶©Ö©$ª-ª‚ª§ª9«›«§«ûöñîéäßÚÕÐËÆÁ¼·­£™Š…€{vqlgb]XSBSúÿÿeµúÿÿœGûÿÿelûÿÿzÁûÿÿBÊûÿÿzüÿÿz8üÿÿBDüÿÿehüÿÿœýÿÿe4ýÿÿ.uýÿÿ€  -.©ýÿÿ€  ,.âýÿÿ€  +.$þÿÿ€  *z%þÿÿB.þÿÿzMþÿÿBYþÿÿeªþÿÿœ2ÿÿÿeWÿÿÿz¬ÿÿÿBµÿÿÿzÔÿÿÿBàÿÿÿeœèôÿÿe õÿÿzbõÿÿ$ª-ª‚ª§ª9«›«§«Ç« ¬¬j¬¬'­Œ®˜®¸®Á®Ä®e¯ç¯ó¯°|±©±²±¾±6²g²s²ýû÷õ÷ýûûýû÷õ÷ýûýûõ÷ýûûûýûõðýe„h@&œe„hzB§«Ç« ¬¬j¬¬'­Œ®˜®¸®Á®Ä®e¯ç¯ó¯°|±©±²±¾±6²g²s²–²Ÿ²Ô²T³¶´´ä´í´ð´‘µʵÖµûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ™”Š…€{vqlgb™]BÇÿÿÿœFýÿÿzIýÿÿBRýÿÿztýÿÿB€ýÿÿeâþÿÿœbÿÿÿz—ÿÿÿB ÿÿÿzÃÿÿÿBÏÿÿÿeœ0ôÿÿz<ôÿÿBEôÿÿzrôÿÿzØõÿÿzûõÿÿBöÿÿe‰öÿÿœ*÷ÿÿz-÷ÿÿB6÷ÿÿzV÷ÿÿBb÷ÿÿeÇøÿÿœ_ùÿÿe„ùÿÿzÙùÿÿBâùÿÿz'úÿÿzGúÿÿ"|±‰±¾±¿±ß±á±²²,²4²s²}²Ô²Õ²ù²û²³ ³J³R³´´´Ì´ð´ñ´ µµ+µ,µRµZµfµoµ~µµеµÖµàµùµ¶@¶E¶m¶t¶µ¶¶¶¸øV¹W¹x¹z¹›¹œ¹ǹϹܹä¹ó¹ö¹ÿ¹ººº'º)ºHºIºrºzº‚º…ºɺÓºëºðºñºöº8»=»’»—»ë»ì»¼ ¼$¼%¼J¼R¼a¼d¼p¼ýöôöôöýýöôöôöýñýöôöôöýýýýýýýýññöôöôöýýýýöôöôöýýýýïïïöôöôöýý5NH jU6^s²–²Ÿ²Ô²T³¶´´ä´í´ð´‘µʵÖµùµ@¶m¶v¶ö···&·F·~·¥·Õ·¸V¹ýûýùõûýûýùðûýýýýîîýûýîîîîîõ.e„h@&e„hœBzÖµùµ@¶m¶v¶ö···&·F·~·¥·Õ·¸V¹ºº‡º½ºɺëºu»~»»ë»¼½½?½ûöñìâØÓÎÉ¿µ«¡—’ˆƒ€{vqlgb]XSNzkýÿÿBwýÿÿeÅýÿÿœœþÿÿeÅþÿÿz ÿÿÿBÿÿÿzœÿÿÿz¾ÿÿÿBÊÿÿÿeœŠûÿÿe‹ûÿÿœ;üÿÿeƒýÿÿ.¼ýÿÿ€  4.ìýÿÿ€  3.þÿÿ€  2.Kþÿÿ€  1.kþÿÿ€  0zvþÿÿBþÿÿz€þÿÿ.Îþÿÿ€  /.ÿÿÿ€  .z$ÿÿÿzQÿÿÿz˜ÿÿÿz»ÿÿÿV¹ºº‡º½ºɺëºu»~»»ë»¼½½?½g½޽™½Õ½7¾A¾m¾¾޾—¾¶¾Ö¾×¾ýûýöôòòôòîýîôòòòòòòëééòòééò.z@&e„hzBe„h@&eœp¼w¼€¼‡¼¼—¼Ÿ¼§¼®¼´¼»¼À¼½&½?½D½E½K½g½p½޽—½™½£½Õ½ß½7¾?¾޾•¾œ¿¿»¿½¿Û¿Ü¿ÀÀÀÀƒÀÀ¦À¯ÀÁÖÁçÁBÂTÂ{ˆÃÔùÃÄÃéÃóÃ-Ä.Ä;ÄHÄjÄxÄÄÄêÄ÷Ä#Å1ÅbÅnÅ´Å¿ÅÆÆÆ$ÆqÆ|ÆׯæÆIÇXÇŒÇǥǵÇÈ+ÈmÈnÈ}ÈýýýýýýýýûýýýýýýôòôòôýýýýïëïëïëïûûûèûûûûûûûèûûûûèûûèNH5mHmH jU56\?½g½޽™½Õ½7¾A¾m¾¾޾—¾¶¾Ö¾×¾à¾¿œ¿ÀwÀƒÀ¦ÀõÀþÀÁÁÁLÁ‡ÃˆÃ´ÃûöñìçäÚÐËÆ¼²­¨£ž™”Š…€{xpda^T‘–ýÿÿˆ  6—ýÿÿÒÿÿÿäÿÿÿY  äÿÿÿY  6ýÿÿz9ýÿÿBBýÿÿz‘ýÿÿz´ýÿÿBÀýÿÿeþÿÿœ›þÿÿe ÿÿÿzWÿÿÿB`ÿÿÿzaÿÿÿ.ÿÿÿ€  8. ÿÿÿ€  7z©ÿÿÿzªÿÿÿ.Êÿÿÿ€  6.öÿÿÿ€  5zz²üÿÿzîüÿÿzùüÿÿz ýÿÿzHýÿÿ׾྿œ¿ÀwÀƒÀ¦ÀõÀþÀÁÁÁLÁ‡ÃˆÃ´ÃäÃ6ÄeąĆćÄáÄÅYÅýû÷õ÷ýûûýûóñïììêêêêêãÜêêê. & F„„ƒ & F„‘*$œe„hzB´ÃäÃ6ÄeąĆćÄáÄÅYūŠÆhÆÎÆ@ÇœÇÈtȬÈÉ~ÉÄÉöìâØÓÎĺ°¦œ’ˆ~tj`VLB8‘ ÷ÿÿˆ  I‘øÿÿˆ  H‘røÿÿˆ  G‘ªøÿÿˆ  F‘ ùÿÿˆ  E‘‚ùÿÿˆ  D‘Þùÿÿˆ  C‘Púÿÿˆ  B‘¶úÿÿˆ  A‘ûÿÿˆ  @‘sûÿÿˆ  ?‘Åûÿÿˆ  >‘üÿÿˆ  =‘=üÿÿˆ  <‘—üÿÿˆ  ;.˜üÿÿƒ™üÿÿ‘¹üÿÿˆ  :‘èüÿÿˆ  9‘:ýÿÿˆ  8‘jýÿÿˆ  7YūŠÆhÆÎÆ@ÇœÇÈtȬÈÉ~ÉÄÉÊkʰÊàÊnË ÌMÌÉÌUÍVÍxͭ͘ÍËÍ:ÎUÎýýýýýýýýýýýýýýýýýýýýýöôòýýýýƒ & F„‘}ȉȵÈÂÈ"É,ɇɓÉÍÉÕÉ ÊÊtÊʹÊÁÊéÊñÊw˃ËÌÌVÌ^ÌÒÌÞ̘ͩ͵ÍÇÍÔÍÛÍ"Î#ÎKÎOÎfÎsήίνÎ.Ï?ÏLÏfϡϲÏÀÏßÏÐ0Ð<Ð>ÐPÐpЯÐÀÐËÐ Ñ ÑÑ+Ñ<ÑJшѾÑÏÑÚÑÒÒ(ÒlÒ}ÒŒÒÊÒËÒÝÒÓÓ#Ó`Ó‰ÓšÓªÓýÓ$Ô5ÔFÔtÔuÔ†Ô¬Ô½ÔÉÔãÔõÔÕÕdÕýýýýýýýýýýýýýýýýúýýúøýøýøýýøýúøýøýýøýúøýøýøýúøýøý6NH5bÄÉÊkʰÊàÊnË ÌMÌÉÌUÍVÍxͭ͘ÍËÍ:ÎUνÎ.ÏfÏ¡ÏßÏöìâØÎĺ°¦¡“‡}si_UPFA7‘×ýÿÿˆ  Yeþÿÿ‘Jþÿÿˆ  Xe»þÿÿ‘#ÿÿÿˆ  W‘>ÿÿÿˆ  V‘­ÿÿÿˆ  U‘Ëÿÿÿˆ  T‘àÿÿÿˆ  SÞÿÿÿY  Þÿÿÿ¬óÿÿY   ¬óÿÿƒÉóÿÿ‘Uôÿÿˆ  R‘Ñôÿÿˆ  Q‘õÿÿˆ  P‘°õÿÿˆ  O‘>öÿÿˆ  N‘nöÿÿˆ  M‘³öÿÿˆ  L‘÷ÿÿˆ  K‘Z÷ÿÿˆ  JUνÎ.ÏfÏ¡ÏßÏÐpЯÐÑ+шѾÑ(ÒlÒÝÒÓ`Ó‰ÓýÓ$Ô†Ô¬ÔãÔõÔdÕÕôÕ2ÖwÖýùýùýùýùýùýùýùýùýùýùýùýùýùýùýe„h‘ßÏÐpЯÐÑ+шѾÑ(ÒlÒÝÒÓ`Ó‰ÓýÓ$Ô†Ô¬ÔãÔõÔdÕÕôÕ2ÖwÖ™ÖûñìâÝÓÎÄ¿µ°¦¡—’ˆƒytje[VLGe÷ÿÿ‘F÷ÿÿˆ  ee„÷ÿÿ‘ë÷ÿÿˆ  deøÿÿ‘ƒøÿÿˆ  ce•øÿÿ‘Ìøÿÿˆ  beòøÿÿ‘Tùÿÿˆ  ae{ùÿÿ‘ïùÿÿˆ  `eúÿÿ‘uúÿÿˆ  _e›úÿÿ‘ ûÿÿˆ  ^ePûÿÿ‘ºûÿÿˆ  ]eðûÿÿ‘Müÿÿˆ  \e^üÿÿ‘Éüÿÿˆ  [eýÿÿ‘Yýÿÿˆ  Ze™ýÿÿdÕÕžÕ¨ÕôÕ2ÖCÖOÖwÖ™ÖªÖ²ÖÕÖ;×L×W×³× Ø ØØØØ/Ø:ØbØØØ˜Ø®ØÅØÔØçØøØÙGÙHÙtÙ¸ÙÇÙÑÙøÙ(Ú9ÚEÚÅÚ ÛÛ"Û„ÛÇÛØÛäÛRܕܞܭÜÂÜæÜïÜÝÝCÝaÝb݊݌ݑݒݴݵÝéÝôÝÞÞÞÞÞÞ$Þ/Þ2ÞAÞDÞEÞsÞuÞýûýûýûýûý÷ñ÷ýûýûý÷ýûîýûýûýûýûýûýûýçåçåáåçýýÝýØýØçåçOJQJ6NHNH jUNH 56NH5656UwÖ™ÖÕÖ;׳רbØØ®ØçØtÙ¸ÙøÙ(ÚÅÚ Û„ÛÇÛRÜ•ÜÂÜæÜÝCÝaÝCÞDÞ8ß©ßûùûùûùûùûùûùûùûùûùûùûùû÷õóõûœ‘e„h™ÖÕÖ;׳רbØØ®ØçØtÙ¸ÙøÙ(ÚÅÚ Û„ÛÇÛRÜ•ÜÂÜæÜÝCÝaÝCÞDÞöñçâØÓÉ嵫¦œ—ˆ~yoj`[MHEÿÿÿœâÿÿÿðÿÿY   ðÿÿe]ðÿÿ‘’ðÿÿˆ  pe¶ðÿÿ‘ãðÿÿˆ  oe&ñÿÿ‘±ñÿÿˆ  neôñÿÿ‘oòÿÿˆ  me³òÿÿ‘Póÿÿˆ  le€óÿÿ‘Àóÿÿˆ  keôÿÿ‘‘ôÿÿˆ  jeÊôÿÿ‘ùôÿÿˆ  ieõÿÿ‘Zõÿÿˆ  heÅõÿÿ‘=öÿÿˆ  ge£öÿÿ‘ßöÿÿˆ  fuÞzÞ{Þ£Þ¤ÞæÞîÞ÷Þßßßßß"ß'ß(ß7ßµßÁßËßÛß&à4àÏàÐàþàááá.á/átá~ááŽá×áåá'â(â{â|â«â­â²â³âÜâÝâ#ã2ã3ãBãã£ãää2ä4ä9ä:äaäbä¯äºäÃäÆäÇäËäÌäÛä(å7å{å‡åææ0æ2æ7æ8æ^æ_æ¥æ±æºæÃæÆæÇæÓæßæâæææýùýòððëðëëðððòýòýùýòðëðèòýòýùýòðëðòýòýùýòððäðëððòýòýùýòððëðë6NHNHOJQJ6 jUNHZDÞ8ߩߵßËß&à„ààÏàáÊáËá×á0â9â{âCãƒã„ãã¹ãÂãäÜäåå(å{å¸åÁåæ÷æç çûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[e;öÿÿeLöÿÿœ@÷ÿÿz‚÷ÿÿB‹÷ÿÿzÈ÷ÿÿzøÿÿB'øÿÿe(øÿÿegøÿÿœ?ùÿÿzùÿÿBŠùÿÿz³ùÿÿB¿ùÿÿeÀùÿÿeúÿÿœÈúÿÿz ûÿÿBûÿÿzlûÿÿBxûÿÿeyûÿÿe´ûÿÿœtüÿÿz¶üÿÿB¿üÿÿzýÿÿzxýÿÿzŽýÿÿBšýÿÿe þÿÿœÿþÿÿ!©ßµßËß&à„ààÏàáÊáËá×á0â9â{âCãƒã„ãã¹ãÂãäÜäåå(å{å¸åÁåæýûûûýûùõõýûýûùõõýûýûùõõýûûýûe„hœzBææçæöæç&ç`çmçÁçÑçfègè–è˜èèžèÇèÈèéé'é/é8é=é>éMéäéñéê)êWê`ê»ê¼êèêêêïêðêëë[ëdëoëwëë•ë˜ëœëë¬ëþë ì6ìFìØìâìðìí{í|í¬í®í³í´íÞíßí'î0î7î?îNîUîaîiîjîyî­îºîåîñî ïïVïcïÖï×ïð ððð9ð:ð‚ð‹ðûùùùòðòðìðòùùùûùùùòðòðìðòùùùûûùùùêòðòðìðòùùùùûùùùùòðòðìðòù5NH jU6OJQJ\æ÷æç çç`çÁçè$èfèNé„é…é‹éØéäéêWêpêyê»ê­ëñëòëþë6ìcì ì×ìýùù÷õõõ÷õýùù÷õ÷õõõ÷õýùù÷õõóó.zBe„hœ çç`çÁçè$èfèNé„é…é‹éØéäéêWêpêyê»ê­ëñëòëþë6ìcì ì×ìØì0í9í{ízî î¡îûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ƒytoje`[Ve£îÿÿeÉîÿÿœÈïÿÿz ðÿÿBðÿÿzkðÿÿzlðÿÿ.£ðÿÿ€  :.àðÿÿ€  9z ñÿÿzEñÿÿBQñÿÿeRñÿÿe–ñÿÿœˆòÿÿzÊòÿÿBÓòÿÿzìòÿÿz'óÿÿz_óÿÿBkóÿÿz¸óÿÿB¾óÿÿe¿óÿÿeõóÿÿœÝôÿÿzõÿÿB(õÿÿz‚õÿÿzãõÿÿz.öÿÿB:öÿÿ ×ìØì0í9í{ízî î¡î­îåî ïVï‹ï”ïÖï¿ðèðéðõð-ñRñ“ñœñÞñáòó óóMóýýûýùõõûýýýýûýùõõûýýýûýùõõûýe„hœBz¡î­îåî ïVï‹ï”ïÖï¿ðèðéðõð-ñRñ“ñœñÞñáòó óóMólóóøóþó§ô°ôòôäõ ö ööOöûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[z,çÿÿB8çÿÿe9çÿÿe_çÿÿœQèÿÿz“èÿÿBœèÿÿzEéÿÿBKéÿÿz¦éÿÿz×éÿÿzöéÿÿz.êÿÿB:êÿÿe;êÿÿebêÿÿœeëÿÿz§ëÿÿB°ëÿÿzñëÿÿzìÿÿzNìÿÿBZìÿÿe[ìÿÿe„ìÿÿœmíÿÿz¯íÿÿB¸íÿÿzííÿÿz9îÿÿz^îÿÿz–îÿÿB¢îÿÿ!‹ð’ðšð¤ð®ð¯ð¾ðõðñ-ñ9ñRñ`ñÞñßñòòòòCòDòò–ò£òªò´ò¼òÈòÐòÑòàòó"óMóXólóxóóªóòôóô%õ'õ,õ-õYõZõ¤õ­õºõÁõËõÓõÔõãõö$öOöZönözöîöïö÷÷#÷$÷K÷L÷‘÷š÷›÷ª÷9øFø¼ø½øëøíøòøóøùùdùlùyù„ùù•ùžù£ù¤ù³ùêùýýøýýýñïñïëïñýýýýøýýýýñïñïëïñýýýøýýýñïñïëïñýøýñïñïëïñýýýýøNH jUOJQJ6]Mólóóøóþó§ô°ôòôäõ ö ööOönö£ö¬öîö«÷½÷¾÷Ä÷-ø9øqøzø¼ø´ùÝùÞùýýýûýûýùõõûýýýûýùõõûýûýûýùõõe„hœBzOönö£ö¬öîö«÷½÷¾÷Ä÷-ø9øqøzø¼ø´ùÝùÞùêù%ú„úÀúÙúâú$ûüLüMüYü”ü¾üPýiýrýþûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[zÑßÿÿBÚßÿÿzóßÿÿz…àÿÿz¯àÿÿzêàÿÿBöàÿÿe÷àÿÿe5áÿÿœâÿÿzaâÿÿBjâÿÿzƒâÿÿz¿âÿÿzãÿÿzYãÿÿBeãÿÿefãÿÿeãÿÿœ‡äÿÿzÉäÿÿBÒäÿÿz åÿÿBåÿÿzåÿÿB…åÿÿe†åÿÿe˜åÿÿœUæÿÿz—æÿÿB æÿÿzÕæÿÿzôæÿÿ!Þùêù%ú„úÀúÙúâú$ûüLüMüYü”ü¾üPýiýrýþÜþþþÿþ ÿ5ÿ]ÿfÿ´ÿoÕÖýûûûûýûùõõýûûûûýûùõõýûûýûùõõe„hœzBêù÷ù%ú4úvúwú„úúÀúÉú$û%ûPûRûWûXû}û~ûÃûËûØûãûìûïûøûýûþû üYüfü”ü£ü¾üÅü,ý-ýPýYý»ý¼ýþþ?þAþFþGþnþoþ´þ¿þÈþËþÌþÛþ ÿÿ5ÿ<ÿ®ÿ¯ÿ´ÿµÿÞÿàÿåÿæÿ  KP[^_nâëiuÂÃïñö÷bgpxýýúýýóñóñíñóýýýýèýýýúýúóñóñíñóýýèýýúóñóñíñóýýèýýæóñóñíñóýý5OJQJNH jUNH6[þÜþþþÿþ ÿ5ÿ]ÿfÿ´ÿoÕÖâw€ÂÂ-.:XnÊ(1s;XYeƒïøûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[BT×ÿÿzÀ×ÿÿzÞ×ÿÿBê×ÿÿeë×ÿÿeØÿÿœÐØÿÿzÙÿÿBÙÿÿzyÙÿÿzÕÙÿÿzëÙÿÿz ÚÿÿBÚÿÿeÚÿÿeÚÿÿœÛÿÿzÃÛÿÿBÌÛÿÿzCÜÿÿzaÜÿÿBmÜÿÿenÜÿÿeÔÜÿÿœÝÿÿzÝÝÿÿBæÝÿÿzÞÿÿz8ÞÿÿBDÞÿÿeEÞÿÿegÞÿÿœ2ßÿÿ!Öâw€ÂÂ-.:XnÊ(1s;XYeƒïø:ç !-ýûûýûùõõýûûûûýûùõõýûûýûùõõýûe„hœzBx˜Ÿ¤¥©¬±²Á):CXdn~¾¿ÊØst ¢§¨ÎÏ!*+:enƒÓà:;dfklÑÖ×àáæþ -6ØÙ  -.ot€ˆ‘™¦­·¿ËÓÔýøýôýøøòîòýýýëýäâäâÞâäýýøýýòäâäâÞâäýø×øòýäâäâÞâäýýýýýý NHOJQJNH jUNH5NH56NHOJQJ6Uø:ç !-–Øä( ) 5 S { ¯ ß 8  ! c % U V _ § Ë :[šÎûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[z©ÎÿÿzèÎÿÿz Ïÿÿz'ÏÿÿB3Ïÿÿe4ÏÿÿexÏÿÿœœÐÿÿzäÐÿÿBíÐÿÿeîÐÿÿeÑÿÿœàÑÿÿz"ÒÿÿB+Òÿÿz ÓÿÿzdÓÿÿz”ÓÿÿzÈÓÿÿzðÓÿÿzÔÿÿBÔÿÿeÔÿÿe_ÔÿÿœkÕÿÿz­ÕÿÿB¶ÕÿÿzÖÿÿB"Öÿÿe#Öÿÿe\Öÿÿœ ×ÿÿzK×ÿÿ!–Øä( ) 5 S { ¯ ß 8  ! c % U V _ § Ë :[šÎþýûùõõýûûûûûûýûùõõýûùõõýûûûûûe„hœzBÔã5 > S _ { ‡ ¯ ¾ ß ë 8 E c d  ‘ – — ¼ ½ þ     $ § ¨ Õ × Ü Ý   J O X [ d o x €  ” ž ¦ ² º » Ä Å Ê %:A[jš¦ÎÝþ Wd»¼åçìíRWckt|Š‘›£¤³ "ûùùùùùùòðòðìðòùùûòðòðìðòùùùùùùùûåûùùùùùùùòðòðìðòùùùùùûù NHOJQJNH jU6OJQJZÎþW7@»´÷ø"Kƒ«[l¯°¼Úû:ršÿJ$%1‘ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[zÆÿÿBÆÿÿeÆÿÿeCÆÿÿœùÆÿÿz;ÇÿÿBDÇÿÿz©ÇÿÿzÑÇÿÿz ÈÿÿzHÈÿÿziÈÿÿz‡ÈÿÿB“Èÿÿe”Èÿÿe×ÈÿÿœèÉÿÿz*ÊÿÿB3Êÿÿz˜ÊÿÿzÀÊÿÿzøÊÿÿz!Ëÿÿz?ËÿÿBKËÿÿeLËÿÿeËÿÿœˆÌÿÿzÍÿÿB ÍÿÿzìÍÿÿzEÎÿÿzuÎÿÿ!þW7@»´÷ø"Kƒ«[l¯°¼Úû:ršÿJýýûýùõõûýýýýýûýùõõûýýýýýýûýùe„hœBz".KWƒŽ«·[\‰‹‘¸¹þ #,4BIS[\efk¼ÅÚáû :Fr}š¦JK{}‚ƒ­®ðõöÿ1>ÜÝGHŽ—˜¡×äZÞß!ýýýýöôöôðôöýýýýýýëäëýýýýýýöôöôðôöýëýöôöôðôöýëýáÜáÕáËÕájì¬UmH jUmHNHmHmH NHOJQJOJQJNH jU6P$%1‘šÜ¢ÊË×Z‹¯°æç@b—½6¬­ûûù÷ù÷õûûù÷ù÷óññïßßßßßßßßß1$„ü „öH$7$8$ Æn œzBe„h‘šÜ¢ÊË×Z‹¯°æç@b—½6¬­õ#[¨éFw² X­ c « §!""ûöñìçâÝØÓÅ¿³°­ª§¤¡ž›˜•’Œ‰†ƒ€}zwtqnkhe¬øÿÿ ùÿÿúÿÿMúÿÿúÿÿûÿÿXûÿÿ¦ûÿÿþûÿÿ9üÿÿjüÿÿÇüÿÿýÿÿUýÿÿýÿÿ»ýÿÿþÿÿþÿÿzþÿÿóþÿÿÿÿÿNÿÿÿpÿÿÿ—ÿÿÿÉÿÿÿÊÿÿÿªþÿÿY  ªþÿÿ«þÿÿÏÿÿÿ¨§ÿÿY   ¨§ÿÿz+ÄÿÿB4ÄÿÿzlÄÿÿBxÄÿÿeyÄÿÿe¡ÄÿÿœgÅÿÿz©ÅÿÿB²Åÿÿ'!"°æç­õ§¨  "U"Õ"Ö"_$`$g$—$ð%&Æ&Ø&w'x'þ'ÿ'G(H(j(´(È)É)k/u/N0O0•0¤0*1+1„1…1¨2¸2-3=3ç3è3È4Ø4ö4÷455x5y5•5—5˜5¢5g7Ä7ï9‚:ƒ:‡:¬;­;<<¸<¹<M=N=E?F?º?Ä?Ï?Ð?ã?í?”@•@AAÁAøõíëëèèëèèëææèèèëèæèæèèææèæèæèæâæëëÞëèèèèèæèæèè5NH6NH6NH55CJOJQJmH jUmHX­õ#[¨éFw² X­ c « §!""U"r"Û"!#L#€#¶#ß#$f$ïïïïïïïïïïïïïïïïïïïïïïïïïïï1$„ü „öH$7$8$ Æn "U"r"Û"!#L#€#¶#ß#$f$g$—$ÿ$—%à&i(j(´(â(S)u)Î)ò)9*„*Ú*þ*!+M+•+û+V,°,!-l-¹-µ/21‘3¤5õ5M6¥6ý6g7h7üùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´±®«¨¥¢Ÿœ™–“Ї„~{xuIãÿÿ³ãÿÿ äÿÿcäÿÿ»äÿÿ åÿÿçÿÿ~éÿÿûêÿÿ÷ìÿÿDíÿÿíÿÿîÿÿZîÿÿµîÿÿïÿÿcïÿÿïÿÿ²ïÿÿÖïÿÿ,ðÿÿwðÿÿ¾ðÿÿâðÿÿ;ñÿÿ]ñÿÿÎñÿÿüñÿÿFòÿÿGòÿÿÐóÿÿõÿÿ±õÿÿöÿÿIöÿÿJöÿÿªöÿÿÑöÿÿúöÿÿ0÷ÿÿd÷ÿÿ÷ÿÿÕ÷ÿÿ>øÿÿ[øÿÿ«øÿÿ.f$g$—$ÿ$—%à&i(j(´(â(S)u)Î)ò)9*„*Ú*þ*!+M+•+û+V,°,!-l-¹-µ/ïïïïïïïïïïïïïïïïïïïïïïïïïïï1$„ü „öH$7$8$ Æn µ/21‘3¤5õ5M6¥6ý6g7h7|7Ä78b8¨89u9Ã9ï9ð94:‡:Ñ:;[;¶;<U<ïïïïïïïïïïïïïïïïïïïïïïïïïïï1$„ü „öH$7$8$ Æn h7|7Ä78b8¨89u9Ã9ï9ð94:‡:Ñ:;[;¶;<U<Ã<ô<T=¡=Ù=:>ù?mA£CóD¹EPFìFGGøG¨H©HèHéH4I5IJ·J/KKËKüùöóðíêçäáÞÛØÕÒÏÌÉÆÃÀ½º·´±®«¨¥¢Ÿœ™–ˆ…‚|yvsp*ýÿÿzýÿÿòýÿÿ‹þÿÿtÿÿÿuÿÿÿÀÿÿÿÁÿÿÿ±ÐÿÿY   ±ÐÿÿÒÿÿ¸ÒÿÿiÓÿÿÄÓÿÿ`Ôÿÿ÷Ôÿÿ½Õÿÿ ×ÿÿCÙÿÿ·ÚÿÿvÜÿÿ×ÜÿÿÝÿÿ\Ýÿÿ¼ÝÿÿíÝÿÿ[ÞÿÿÞÿÿúÞÿÿUßÿÿ¢ßÿÿßßÿÿ)àÿÿ|àÿÿÀàÿÿÁàÿÿíàÿÿ;áÿÿ¨áÿÿâÿÿNâÿÿ˜âÿÿìâÿÿ4ãÿÿHãÿÿ,U<Ã<ô<T=¡=Ù=:>ù?mA£CóD¹EPFìFGGøG¨H©HèHéH4I5IJ·J/KKËKÍLïïïïïïïïïïïïïïïïïíïïïïïïïïï1$„ü „öH$7$8$ Æn ÁAÂAåBõBjCzC–C—C„D…DîDïDäFåFèHéH,I-I5IJ JMMuMvM|MÑMÒMN+N¬N­N+OlOmO©OªO«OPPqPrP»P¼P½PûPüPjQlQuQyQ Q¤QªQ«Q½QÁQÌQÐQíQñQRR.R/R;R?RWR[RlRpR•R–RýûûýýýýóíåíàÙàÙàÙàíÑàËàíàÙàÈýûøö¶¶ý¶¶¶¶ý¶¶¶ý50Jji­U jUmH 6OJQJ5OJQJmH NHOJQJOJQJ5NHOJQJ 5OJQJ5CJOJQJ6NHHËKÍL{M|MÒM¬N­N*O©OªO«O·OPP0PiQjQuQ Q½QÌQíQR;RWRlR›R3SCSfS¤S¹SÑSôS'T3TRTüùöóðíêçäáÙÖÓÇÄÁ¼·²­¨£ž™”Š…€{vqlgb]déûÿÿdõûÿÿd(üÿÿdKüÿÿdcüÿÿdxüÿÿd¶üÿÿdÙüÿÿdéüÿÿdýÿÿd°ýÿÿdÅýÿÿdáýÿÿd þÿÿd/þÿÿdPþÿÿd_þÿÿd|þÿÿd§þÿÿd²þÿÿ³þÿÿìÿÿÿÿÿÿY  ÿÿÿÿÿÿôÿÿÿY  ÿøÿÿùÿÿùÿÿüùÿÿýùÿÿ×úÿÿ-ûÿÿ.ûÿÿÜûÿÿÞüÿÿ$ÍL{M|MÒM¬N­N*O©OªO«O·OPP0PiQjQuQ Q½QÌQíQR;RWRlR›R3Sïïïïïïïïïíëëéëëçççççççççççd1$„ü „öH$7$8$ Æn –R›RžR3S7SWYWZWhWnW€WWˆWŽWŸW¥W¹W¿WÅWÆWþWXTXUX[XaXtXuX|X‚XšX›X¸X¾XÒXÓXÜXâXüXYJYKYPYVYuY{YŸY¥YºYÀYÆYÇYËYÑYéYïYÿYZZZZ!Z/Z0Z4Z:Z?Z@Z]ZcZhZiZ†ZŒZÄZÅZÍZÒZáZæZóZôZ[[.[/[a[f[{[|[…[Š[Â[Ã[É[Ð[Þ[ß[è[ð[ýûûýûýûûûýûýûýûýûýûûýûûûûýûûûýûýûýûýûýûûýûýûýûýûýû5NHcüXPYuYŸYºYËYéYÿYZ4Z]Z†ZÍZáZ[a[„[Ê[é[q\”\Ä\Ü\ü\+]U]€]¨]¼]Ï] ^(^)^¹^ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[dæ÷ÿÿdç÷ÿÿdøÿÿd@øÿÿdSøÿÿdgøÿÿdøÿÿdºøÿÿdäøÿÿdùÿÿd3ùÿÿdKùÿÿd{ùÿÿdžùÿÿd&úÿÿdEúÿÿd‹úÿÿd®úÿÿdöúÿÿd.ûÿÿdBûÿÿd‰ûÿÿd²ûÿÿdÛûÿÿdôûÿÿdüÿÿd&üÿÿdDüÿÿdUüÿÿdpüÿÿdšüÿÿd¿üÿÿdýÿÿ!„[Ê[é[q\”\Ä\Ü\ü\+]U]€]¨]¼]Ï] ^(^)^¹^º^Ú^î^ï^*_+_=_>_¦_§_¨_ýýýýýýýýýýýýýýý÷ýýýýýýýôòòòò$d„„dð[q\w\“\š\Ã\Ê\Ü\â\û\]+]1]P]Q]T][]€]†]¨]®]¼]Â]Ï]Õ] ^^)^5^_^`^™^š^º^À^Ú^à^ï^ý^+_0_1_8_9_;_<_=_>_s_t_’_“_”_¤_¥_¦_¨_·_¸_Ê_Õ_á_¿`À`Å`Æ`Ú`Û` aýýýýýýúýýýýýýýúúýýý÷ð÷ðëð÷èáè×áÒáèËÆÂËÆÂ¼µ­B*CJhmH 5B*CJ$h B*CJhB*h >*B*h 5>*B*h0JCJjé®CJU jCJUCJ0JmH j0JU0JNH5D¹^º^Ú^î^ï^*_+_0_9_;_<_=_>_¦_§_¨_¸_É_Ê_Õ_á_â_ô_``&`7`I`V`b`c`w`Œ` `¡`±`½`¾`¿`À`Å`Æ`Ñ`Ú`Û`î`a aaa)a*a3a4aOaPa_akalaa•a¨a¸aËaÌaäaÿabbbb0b1bEbZb[bibjbkb~bbb‘b¢b£b¤b¬b­b»bûöñìçâààààààÞààààààààààààààààà dåöÿÿd ÷ÿÿd!÷ÿÿd5÷ÿÿdU÷ÿÿdV÷ÿÿX¨_¸_É_Ê_Õ_á_â_ô_``&`7`I`V`b`c`w`Œ` `¡`±`½`¾`¿`À`Å`Æ`Ñ`Ú`Û`ýýýýýýýýýýýýýýýýýýýýýýýýúýýýý$Û`î`a aaa)a*a3a4aOaPa_akalaa•a¨a¸aËaÌaäaÿabbbb0b1bEbüüüúúúúúúúúúúúúúúúúúúúúüúúüúú$ aa)a*a3a4aJaKaOaPakalaøaùaþaÿabbb/b0b1bZb[bhbibjbkbbb‘b¢b£b»b¼b½bÁbÂbcc”c•c¢c£cºc»cÊcËcÌcÔcÕc d ddøòòêòâÜÔÜÐÈÜÐܼȶȮÜÐÂܨܨ¢š¢š¢Ü– 5B*CJhB* hB*CJNHh B*CJh B*CJhB*CJhmH CJhmH B*CJ(h B*CJhB*CJhmHB*hB*CJNHh B*CJhB* CJhmHB* CJNHh B* CJh 5B*CJ$h5EbZb[bibjbkb~bbb‘b¢b£b¤b¬b­b»b¼b½bÁbÂbÐbàbêbùb ccc*c9cIcüúüúúúúúúüúúúúúúúüúúúúúúúúúúú$»b¼b½bÁbÂbÐbàbêbùb ccc*c9cIcYcnc‚c”c•c¯cËcÌcÔcÕcðc d ddddd"d*d1d2d=dIdJdUd]dddedfdrdd“d”dŸd«d­d®dþþþþþþþþþþþþùdåöÿÿ3IcYcnc‚c”c•c¯cËcÌcÔcÕcðc d ddddd"d*d1d2d=dIdJdUd]dddedfdýýýýýýýýúýýýýýýýýúúúýúúýúúúýú$dddddddd#d$d1d2dHdIdJdVdWdddedfdzd{d’d“d”dªd«d®døñèñøáØáÑááØáËÑÂѼѵ >*B*CJh B*CJ(h5B*CJ$NHh B*CJ$h 5B*CJ$h5B*CJ$NHh 5B*CJ$h5B*CJNHh 5B*CJh >*B*CJhfdrdd“d”dŸd«d¬d­d®düüüúüüúúød$ + 0€1h°‚. °ÆA!°Š"°Š#Š$n%° Ä£DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© 2http://www.synthesis.ch/“Ddõ*e c èèðˆ² ð c ðdAÁ@¿ÿLogo-Quadrat, alleinstehen .jpgð€Rðæ’O91ÍîÐü¹»s"œµ!ÿÂ’ç Fðº’O91ÍîÐü¹»s"œµ!ÿÿØÿàJFIF,,ÿîAdobedÿÛ„         ÿÀ*õÿÝ?ÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?ôjþoÔ/õô´ÓÒÚÆá­¿Ò½b䨿»øw®*­ÿ!þÔÿôõŠ»þB/ý©ÿéëwü„_ûSÿÓÖ*™èÿâ2þ™ú§*Gê~¥)¿.^§ÑJb©†*—ëâ1~†ú§*Ÿ[랥)·>ŸÓZâ©gü„_ûSÿÓÖ*ïù¿ö§ÿ§¬UßòíOÿOXª+Mÿ}mIþŽú?«zþ­iðÓŸÃ×®*œâªÿ_ú¤Ÿ£ý/®Pz>¿/JµåÃâéኤòíOÿOX«¿ä"ÿÚŸþž±WÈEÿµ?ý=b­¯ü¬>C—èŽ5ø©õšÓÛdX«±V:ßò°ù?¢8×á¯ÖkO|U¯ù¿ö§ÿ§¬UßòíOÿOX«¿ä"ÿÚŸþž±TòÃëÿTô‡¥õÊ[ÐåéV¦œyü]¿«Z|Uáðõ銡ä"ÿÚŸþž±WÈEÿµ?ý=b®ÿ‹ÿjúzÅS=üAÆ_Ó?TåQèýOÔ¥7åËÔú)LU0ÅRýcüAÆ/ÐßTåSë}sÔ¥6ãÇÓúk\U,ÿ‹ÿjúzÅ]ÿ!þÔÿôõŠ»þB/ý©ÿéëEi¿ã/­¯é?ÑßS¡çõo_Õ­>søzõÅSœUBÿëÿT“ô¥õÊG×åéV¢¼¸|]<1TþB/ý©ÿéëwü„_ûSÿÓÖ*ïù¿ö§ÿ§¬Uµÿ•‡ÈrýÆ¿>³Z{b¬‹v*Ç[þV#ÇôGü5úÍiÿ!þÔÿôõŠ»þB/ý©ÿéëwü„_ûSÿÓÖ*éߤ~§é/Gë»ú¿Wåé}£Ç?‹ìÒµý¬UŠ¤Ú—øËëmú3ôwÔè8}g×õkOм>½1T/ü„_ûSÿÓÖ*ïù¿ö§ÿ§¬UßòíOÿOXªe£ÿˆÿ}úgê³è}OÕ÷åÏÔÿcÇŽ*˜â©~±þ ãèoªr©õ¾¹êR›qãéý5®*–ÈEÿµ?ý=b®ÿ‹ÿjúzÅ]ÿ!þÔÿôõŠ¢tïñ§×#ý%ú7ê[ú¿Wõý_²xñçðýªV¿³Š§X«±WÿÐô7”ÞÏ0ÛJOøŠâ¬v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت_­k ¥Ão#DeúÅÄvÀƆSN]LU0Å_ÿÑô¦‰¤M§Ï©É#«‹ë§¸Œ-vVPÔuÛMqWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]бÏ<¼zoý´­¿âGdx«ÿÒõN*ìUت”—v±7 &ùY€?q8ªßÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×S¸Ö4‹hZk‹ëxaZr’IQTTÐT’SЍ[y›ËwRzVº­œòÓ—®"v ïEcŠ¢ÿHXËL_ðkýqW~°ÿ–˜¿à×úâªZþ…fª×z­º±¢´³F€ŸɆ*Õ§˜t ÎTÔ­n}:sô§øÖ´¯4­1TGé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*º+«Y[ŒS$׊°&ŸAÅUqWb¬sÏï›ÿm+oø‘ÅY*ÿÿÓôÚßIwƒYÌÖórøÔi¹Û|UŠ»xçç¯æ™äxQºO¬]L«…˜Zþ`_i֚Εg¦²%¬Ò4!Ô¢¿©'=^|«ñ|ù9*ú«v*ðïùÊŸùGô?ù‹—þMâ©üâý5?ôaÿc8«èUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU<òüuüboÖ1VkŠ»cžxÿxôßûi[ÄŽ*ÈñWÿÔô7”ÞÏ0ÛJOøŠâ¬v*øÛþsY®ÿÆú*°?T,a=½C'ï?áDXªEÿ8ݬyÂ{ôÖÞÛ_’D67|Tz\wH¤…ŸÚVƒíqÅ^÷­y?Êšü–÷®™o{-»¤°Lè UM@ä7dñFýÛ~Òâ©ÐØtÅ^;cÿ97å+»Û{DÒ¯Õî$H•˜C@]‚‚i'¾*õùåÃ$¬ XÔ¹­Wy•ÿ9-åMGS³ÓâÒïÒ[Éã·ØCÄ4®I ¥N*ôÏ1ù—Dòæ—&©¬Ý-¥œd/6©,Ƥ"(«;š}•Å^E{ÿ9Qåèî8Ùh—Wýì²G |Â/üKeÞCüïò›ïSM‡ÖÓõY+éZ\I8ŽGÓ‘ ) e¸7ù8«Ì¿:¿8´?0hº‡•m¬®¢¼¶½óÉéúDÛHÊÔâÅ·§Ãðâ¬òÏÚo’<Ís«jó\Ã=“Ú¬vüyyb̨ãHŽ*úoòëó'JóÕ•åÞk=ªYȱ:Üp©,¼ª83b©›¿ç <‡åû©,¡yu{ØÌ)‰uV•Š©ÿž~¦*Æm?ç*tœ-Þ…u ÞH¥ŽW§úŒ"ðø«Öü­æÍ ÍJjš-ȹµbQ¶*èãª:Õ…ãeøqW—~g~dþXYy¶m'̾Y}[QÒÄ@] qÆXÖeP]Õ™©öáåËgéç½*?ËåóŠZʺjÚ‹•´P‚QVeÅQmóÇ–<¥d.õËÕ·_B Í)’5ø»}…ý¦Å^Y{ÿ9S $¤YhwSÅSGšXáoøÿıVYäoÏO'y²ú=1Ún§)¤÷AxÊi^1Ȥ©oò_ƒ7ìòÅU???òRë¿ôiÿQâ¯ü‰ó&åÏ7ÝêÚ½À·²ƒN›“Ù˜ÉTE³·e«Ó.¿ç*|¾—%mt;©­«OVIcéãÀ ü>*ô"~ey_ζ²I¤LÉsæÆpxÁØ5edÿ-±WœÎTÿÊ?¡ÿÌ\¿òoKÿçÿé©ÿ£ûÅ^Õæ6yËiÔu»Ä´·¯Á©y•á ³·ú¸«É¯ç*<»ül´K»ˆA§©,‘ÂÔñ =_ø–*Í<…ùÏäÿ8Ü W’ÇU •±ºYøŠ·¤êY$ ýŸ†OÚáÇg˜«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O<Ÿÿcÿ›õŒUšâ®ÅRo4i·wöÖIj¡ÚØ'2KñTçÿÕô7”ÞÏ0ÛJOøŠâ¬v*òÎïËíÎêÚv£Ê)¢U’Êö0 ÈE ý¤oÛOÚÿ[‹*¯–<Ïÿ8õùƒ£´’Y@šÍšÔ¬¶ûÞ>ð½—ù1ú¸«Ð<íç'_ì/nl^¤Ú|ܽ*Ž«$|5ÿcÏ}cùcçÈ<íåhµeŒAw›{ûu©T™'wàÊÊëÿû8«ã.ÿÊA¦Ì\òqqWÝzüsîãÿÄN*øwÉŸò˜h_öеÿ“銽—þr²MC×òôdŸÑånY@­ À <¾IN?ìñVùWwù8–wvÞzµ•¯¥—ýìú愨inÜÖN|‰~ËŠ½ÃòÉ¿–z\—º§•/ãÕ§ˆ³«Ëm n! ³§»:ó|U‚~x~RyWBòí÷™ìžèêW7ªÒ $VŠ·Yè¡ê~‹`_’žFÑ|çæ«­/Wi–Ú.Û¸Fæ³D‚¤«|ä ý¨Ãpž&§Šò\Uîó•/hDƒu!Æ,Uÿ8ŸÿMOýØÎ*óOÎ/7^y“Ïz“É!6VIga j‹,P²Y}Fÿ›WzƒÿBÅc¡Åcxº…ëFÝô–úˆvˆÇÆ5ôÖ¿c‡û.MмV›OÑüÕ4þV¿’{+;6•Å£’ŠC¡!Õ’„ü ËŽ*ûcËz°Ö<½¦jÀúý¬7%FáL±‡+þÄšb©Ž*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©ç“ÿã¬ã~±Š³\UØ«±Wb¯ÿÖô7”ÞÏ0ÛJOøŠâ¬v*ñ_ϯ̽+ÈÁ®f qª\F«§Ør¡vwjn±'í7û UˆùsóóòëV°Žk»ñ¥^q{;¥o…»ñ‘T¤‹_³û_ä.*ñÏŸ;yWÍ~c´Ÿ@_Um`1\ê ~±-U0W+ÿÚþ\Uê_ó‹úmÝ¿“/ïea½½?V£,H¨Î=‹òOù犾nŒË¤ëJ]yK§Ü‚Èv«C&àøn¸«êýó·òú/*\ꚬW72Û¿Õl¾»Jèx#ÇNQü_m›á\Uòß“?å0пí¡kÿ'Ó}ù™þ_)ÜÉç(Ò]&2 ©¯ªf¡ âCú§zq?g—/ÝóÅ^;©~E~_êZ;ë^WódqZÌ©õÇŠH†ÕâÃNÍÓö±W–þ]kZ–çmïOwYšîd =X¥‘QâaÜ88«èÿùÈå'òÊà€HVäûDb¯ÿœ{ó.‰ yêiõ{¨ì­îìeµŽâb1!–)7? ‚±7ÄØ«ßüéçÝ=<‡æ WËZŒ×:|Dö’$뒪ܲrN\ÿØüX«æ/Ë?*XùÏÎéš¾ öÑÜ '–^@Í3Ê#=xõåȇý¬U꿚_•ß•OòeÕÊ$‰¬ºpÓ—ÒÉ)a¿§P¥QwsÇû,U‰ÿÎ3䯗þÙóÿÉȱTŸóóÿ&Ö»ÿFŸõ*öývoûtÿÌÌUãßù6´/ú;ÿ¨9±WÑ_ßù+5ÿøÅüŸ|ûÿ8óÿ“OMÿŒW?òañU_ùÈo0êzæ%æ›<Œ,´¥ŽKrh«êD’;ÓùŸí' UèžAü…ü¼ºò¥†³ªÜÉ©=åº\M"Ïé[ÆYy2Nû¿²üßí/ì}œUáÞƒËþpÔ­ü°yhpºÇhÜÚ@JÆ¢B®Ä–S(“‹Wì⯢2¿õý³ô¯ù=mмSòSÏ–Nóy»Ôê4ÛØÖæURÆ*²ºÉÄ|L’Œö[}¬þv~\iº[ß&± ëñ&Kb^gjT/?w_8ñÅ_&C ÿ™üÒ#‰?Óu›ÃEQPâJŸö+Ëþ{Ïüå$k–´“ì¥Ìеð1Tüâý5?ôaÿc8«Èÿ2´ ÏZÖŸ:êI`'ö¡™Œ‘0?ê0¯ùX«Ö|«ù7ù3æ-VÓ^¾@Ñ«]@÷VŠð=*É 0¼OÚûXªFü·ü…ÕüÉ?—ì¼Ã©½ôL Ö†#âX$ô8ÈÊ~òÿÝ|×} hÖº&‹e¤Z3½µ„)o ÊAr±ŠÅB¯/’â¨üUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSÏ'ÿÇXÿÆ&ýcf¸«±U ËûK$î¤,²,1’ «¿Ù]늫â¯ÿ×ôg–-.­îõ¶ž&g¿’HK rBxŒU=Å]оüýü”Ò|ïæ©Çw%†²GÌk,.‹Rªñ’8Ò¿j6_ò•ñWÝÿÎ4~cC)HZÆê:í$s²Š{‰*È|­ÿ8»¨µÊMæ}N(íTÕ­,y;¸²euAû“}¦é¶e„}„ mej‚8 AEU^ƒûqW‹þfÎ;O®kw:ß–ï ¶šõÌ×v7\Ö?U·wŽDYïâ(Éö¿oI<¥ÿ8Á«~’Š4_[®Ÿ{[6w’Z°]–1Ÿæ^mþ¯ÚÅ[Ðç|×§kšv¡.©`ñYÝCpè¾·"±HT¥h1W£þm~S7Ÿ"µ’VK› Â(-[–ä”JÉÛÔ¾‡†*ñçÿœaüÁp[½5£®ÒúÓOqèòü1W¢~ZÎ>YykTƒ[Ö¯QÔ­;X"R¶ñH:=[â‘—ö>ãü¸«Ó|ÏåÍ;Ìš 拨©kKØø9_´¬$u¯í#…uÅ_;j¿ó‹Þq†å†™¨XÞZ×÷o+I´ÿ)H¿t˜«Óÿ*?)¯<³å}cEóÛ^Ǭ5&†Ü» ŒÆP©gXÏ-û/ʼçÌó‹¾c†õÛ@Ô­®l‹V5»/ Ê;ÁŸÍ𩊣ôÏùÆ-M´ûÙµVõwˆ¥Œq™ !Ø<²2‰ˆû(©ö¿›d”Ÿ’Zÿ’üÒúÅýý¥Ì k%¸ŽSŸ'd`~4QOƒ@þe~Aù“Í^uÔuû=FÎ kÏGÓŠoW˜ô Ž#^(Ëö£¯\Uœÿ€u/ùTŸà¿¬Cõÿ©}Wë?£Ë—*ôçÇýŽ*Á¿- üÉå_:éÚýæ£g=µŸ­êE«Ìú°I§$UûRW®*õÌ-Ýy›ÉÚž‡i,pÜ^¢$rË^¬Šûñô_ Uæ–‘bòœm5ËÝBÎâÞÝ&FŠW™2FÈ)Éu>8ªuùµùoç;ÅÖ4Û¤°Ö‚æõT˜gTÙ •ø‘Ô|<èÿ㊼ãLÿœcóÄ“úú¥•­aê´/,Ì@î±”[ý›¦*™kß󋺤š¤¡ê6Ðé"XRèÊf,±*ÈÏÁ Õåÿób¯Tóg‘µ gò»ü!Ä1ÞýVÎßëËÒåjñ3j7¤xü8«ÌtùÅë…[صíJ²ÃKìù—ŠpÀ†e‘Q^><•’¿ð?kHgÿœ_óÒݘá¿Ó¤¶¯ÃpÒL†Ÿå'¤Ä7°-þ¶*õ_ÊßÉ#Ésþ”»œjZáR±Üpã…D¤“ÉâÒ7ìý•O’¨ŸÎOËmWÏZfi§]Ajös<®×èC' تò_ò³XòéÒ7v÷_¤¾­é}_ŸÃèz¼¹sUëêŠb©Ïæ?å_—¼ói× ZjVà­®£Ôø:šz‘×~5_òy6*ñ;ßùÅÿ<Å?Ký>æ~剩âÉéµ?Ø»â¬ÃÈóVzeì:š/P–…°a%Ü‘‚¼‚¿±Â?ò¹}œUWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O<Ÿÿcÿ›õŒUšâ®ÅXçž?Þ=7þÚVßñ#в™uúÄÄv,ÍHþü*‚Òÿç%?1mf yõMB*üI,>™§ù-Jš¶*úòóΫç.E¬®Ÿ6œŠ¦¡V+Õ¢}½Hëðóâ¿,U“b®Å]Š»|«ùÓù«æ]CÍš†‹§ÞÍc¤i“=§£ní–HVZ3|a‚¯ØãþV*»òƒÊŸ˜)ç-W¸´Ô"Ñf“Ô{¦õ=6ŒÆÌ¥…»}¾&~,Uôž§æÏ*éW"×TÖll.J‡]\à ñ5¸»+q4늣4íOMÔíVóN»†öÑÉ qo"Ë*h@t,¦‡lUŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]а/ÌÎ/-y'ýP×ú˨tÓ¡ ì´Îj#Sògÿ#Ž*ñ-Sþr[óêV6Kg§Å_c‡Ôj”Ò—ü•qUMþrgÏ–s/é(m5;züjSÐò^?…~˜›}ä?èžuÑŽ£¦sâaݬ£ãŠJV†›2ŸÙuû_ð¸«&Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZfURÌBªŠ³€¹ÅR8|ûäiæŽ<Å¥Ë4¬(’öÝ™™UCÔ±=*žâ®Å]ЧžOÿޱÿŒMúÆ*ÍqWb¬sÏï›ÿm+oø‘ÅY*ÿÿÒô7”ÞÏ0ÛJOøŠâ¬v*øçþs[Pºo8èºy¨´ŽÍ®~ËI#ð?JªøXó_—üѧKB»–k#BÒ„’:H ¥dT~Œ§ìâ©wš2¼“å[ȬµíHYÝO­^Œò“b¼¿t’ñ+uÅS/-y§Bó6›úOD¸7V%Ú!1ŽXªÉN@ UÒ¿jœqV;¯þtþ[蓵µÖ°“Ü¡!¡´W¸ Ž ¼`Æù%ñT6ùïùeª\­²j¿T™Ïq¼(~ré/û7\UŸ«”ÕNàŽ„b¬ßó×ò®æâ+xu¾sLëkõ[ÁVc@*a©ÅQjüâò–/ÛNÔoËßÇOVÚÞ6™£®ÿQÁ[üŽ\ÿÉÅY^›©ZjZe®§jŬï`Žæ`T˜å@êH=>аÍoóÇòÏHíåÕ…Ôèhéh8´þñG¥ÿŠ£¼­ùµä/3Ü­¦—©¯×_ìZN­Œ|8 !öFlU—â®ÅR=ùž?+ùGS×C½œ5F™ÈŽ%>ÆF^_ä⯌ôû-sÍþhŠÕÝjú½ÇÅ,‡«¹äî粨«7òªâ¯©<§ùä Â8ïlW¿â>±wv9†joÂ"}4OåÛŸó;b¨o3ÿÎ=yYž ìámÒ@×"ÓìKtàĤmü®ƒýƒb¯@Ðô-'BÓ!Ó4›d´²·Ž(ÇÞÌz³·í;|MŠ­×<áè6F÷Y¾†ÆØ &`¼›¯iÛü•±V ÿó‘?•Ë?¤/§d­=qm/ ‡ÿ„ÅY§—<Ûå¿2Z›P†ú%§¨#4t¯Nq·¿åªâª¾aóåÝ*]WY¸ú­„%VI¸<”.ÁWá]÷cü¸ªC¢þnþ]kR\ǧë1¹³®®žX§·D…P¹yã>Ôˆ´åËâÅRgÿœ†ü­K£é™¡¸[iŒñð˜«=Ò5+Y°PÒ²›û¹â`Ê|AðaÝOĸª&Yb†'–WXâŒy…UQ¹$€«Õ¿>ÿ,4éÚªÉѤO*”€Ûýƒ¶*œyWóCÈÞh˜[èú¤r^_ªJ7[òη§ú*8à–S¡õнÀŒ:WÔ†ž“ÂÉû\±WËÚÎú7X¾Ó½OWêWÛú´ãËÒrœ¸Õ¸òãZW{µ—üâ×;Bÿâz}f%Ûê?f¬¯ÿ-ýšb¯*üÌòø#Ìk£}{ô‡+t¸õý/Cí³/<åéï,U˜~^~@ÿŒ<«m¯~žúÖTú·Õ=n>”…+ÏÖŽµã_±Š£ÿç"¼úß˺¬'ÕHícÒnæ À4–Éû§+SF‘ŸµþëÅY_üâÿ™Ï–u- gýæ™8žÇaÀÜe•›þ2b¯óf¥uæ8kZ­º4Ââk‹• ¯hªTŸd…WzÏüâǘ==CYòü´ñ¥õº“ûQNZ{°xÿà1Vù˯?˜?2õW„™b·”XZ(©ÚÝ¿ëK͇úØ«éÝÈVV¿—ÞO¹/FÏм’ÝÌoêÉñÌêËã+1þV_…¹.*ò}3òÉ:%ÅÃùÛÌ$bCõ(â+@b­å2ü\Ú¿b?…ߊ°/Ío(ùF{k¿'ë‘j6ó³Gqd&I䉀¨udëtø¾Ë~ÓrøU{güã˜îµo ›K© ’é7-kcVô ,‘ƒßáäè¿ä¦*ùV e†h慊͇PÊjúqW¸i?óŒ~`ÕlÆ£®k«e¨Ýþþ[A®\<Ÿõd2EûÊŸŽþ/ÚÅZüðó^¥åí Cüº±º Zi¶é«ÜEUõDh"HüUÓ2:þ×(ÿÊÅR¯ËÊ¿!ë:jþjóV’\3}_OŠêÞTRW”¾§&«UJ/Ãþ¶*Ä¿2¼£¥yOÌ1C¡jñêš|È'¶¸ŠXÞX˜1$h9­9+˜«éïÉÿ7\ù«Èvãs¿ˆµ­ãÿ4šsùºvÿ)±Viм«þrQæ_Ëb#¯½·ÓùhçöAqW’Î6Çnÿ™q´´çÃA_çøTÓýƒ>*úÃv*£yu¤÷w  xÚYœöD˜ýb¯ŠüÛæ0yÿÍßXpóMw0·ÒìÔFŽÜc‰JšŽmûoñb¯LƒþqWYm4K6½Z‰ZýU`w„5:¹«}>†*òëk¯4~^ùÉø1´Õô¹¸M$Ç"ìJ·NqJ›ÿªÜ±WпœzÕ¶¹ùÚۤ7ëe:¯R¼åBTû¡øN*ù×ÈþTÕ|׿t-6A —jÞ¼®Hb÷Œ\/Úªñ_çኲßÌÿÉCÈÚU¾ªº’jvRJ ˜ˆL²–SÇœ¡ñ#—/µŠ²¿ùÅnáumgCg&ÞKu½Ž2vWÄNT–%N_ê.*…ÿœüÀ¿º×O”,¦1éÖ*¨*zÓÈ¢EV#ªDŒ¿ûó—/°¼UJ¿/¿çu¯5è±k7zŠi6W µ¢˜LòÈ ‘̧8‚¡§ÁñüX«;üµÿœy} ÌÒj¾až+ج$VÒRÁdqFJ¤|<ÙŽ¿oüŽ<Õb?ó‘˜ú‡™%ò­¤Í“¦ðúÒ! šå”9-N«`Š¿ÏÍ¿—EyòwòÚóË–×Þdó4QêW‘ ~­oyk€8ª«sÍ"µû*ßUæþgÓÉ~sx´]U/Œ‘Üiú³«TjP²óSðºÿƸ«êï01~Jj:ß}¡]É*‹(¶‘dQì$ LUòO—´­[XÕíô%Yï¯ÛиÔ6íÈÿ QÉÿÉÅ^Ç/üâ®®ºq’=~ÔB×ê¦XKxzÜË}>†*ò+Tó‘¼ÙëÃÊÓUÓ&1\ÀNÍÁ©$OMš7§ün¿³Š¾…üÄü¨ƒó"K7Ûë&ÂÝ´¸}smëCÎá[Ÿ«*&ãN8«æ}Ný%¬XéÞ§¥õÛˆ­ýZrãê¸N\j¼¸ò­+оšü¼üÿy¦Û^ý=õ﫤©õoªz<½XÊWŸ­%)Ê¿gx'æž±¨ê¿˜:ì÷ÌÆHo&µŠ6ÿuÅo!|•à¾,UèzäŸåç˜tËmYµçEf†âH¸#t0*­Ä_O©Š¾Œüòä»q¥éõ’G¤¼»qGš_„#öTtDý•ÿ+“2¯ZÅ]Š»v*ÿÿÔô7”ÞÏ0ÛJOøŠâ¬v*ò¿Î9h¾QŽ}_Vˆ‘!…(d–Bã•cÿ ¿*‘ùwÏ^Róž—ºf¥¨ëÊHYÕfÅeŒžHGýsоmÿœ‚HÿÛ·–¹¸h˜êßS*`õy|càõiËÔãþO/g_óŽúeýçå§™­”ñŠúi µ'oÞ5ª£0?ì£ÿÅ^å=J=Î:V¡}ôÛèeºŠŸH €?™hÙb¯¶¬õÍ÷M­ôiÅyýmdS_Õ¢ûòÅ_"~uy—Lóæýö˜âk(Ö;xîìÈb@Ô÷^U ß´¸«é_É6çMü±Ð-®AYL ?êâWü‹Š¾IóŸü¦ïý´.¿äû⯸´ïøçÛÆ$ÿˆŒUòïüäÏþLh¿íŸüœ—zçüã¥Õ¼ß–6pÅ"¼¶ÓÜ$èèÍ)p÷VVÅY柖™ü…ªiÑw>—ÖlˆÞ³CûÄ ÿ)éÿ³Å_%y/ΞW¼Ô.-«[ý>æÁ¸š3'îÜÆ9B6*ôùÆÏ(Ûk^a½¾§ÔΛB6?\¯©Ou)ÿ=1VåÝgRü¾óÛ\²s»Òe¹µž.„õýž_*œ~HyqüÇù“d÷Õ‚À¶¥v[z˜ˆ)Zõå;G_òyb¯vüûóÆ©åo(D4™ †§7Õ’å~ÔQ„-#!ìÿeTþÏ.Kñ.*ðÏËÊKóâúö}HZZÚº‹›—S<òK%ZK/‡Äîÿðxª7ó{ò“Eò&›a=¶«-ååìÌŸW•QO¦ˆK8ã¾ÍÁÙb¯@ÿœVÿ”\ÿ˜¸¿äÞ*ùóËê­¯iªÀ2µÔ!”î2.Ç}銾Rÿœ“Ónm¿1šî@} ûXd»~ì™~‚•ÿeЬü¼ü_;y}uk?0Eo*»EufÐx]NÁˆ‘kÍ8ºšb©­çüãµ–«i¤ÝùÆÒ Jø3ZZ¼<( +/¿Ãüÿ±ö[{GåOåüÞFòíÆ‘5êß´÷ov&XÌ`Ž8øñ,ÿïªÿ²ÅYž*Åÿ3<¬þhò>«£ÂÖ¥ˆIi_÷ô,$ŒW·6^ÿ+|åO1j>RóM¦¯d]iò‘-»Õy- Kw^JYÉÅ_aù[óÊg±K­3Q„» Éi+¬wžáã'—û!ð7ì¶*“ùçóŸÉ¾SÇ%ÂêWÏ"«ÙYº;Æ•øÝÍx¡Uû(Ç“ÿ«ñª©œú¾•ço!êå륺MBÆæÚ"§‹¤²ÂÈÔîŽ tlUò/‘5›mκF©|¤[Ù]Æ÷"•e@hçó <©Š¾Öƒ[Ñ®4Ñ©Ã}šq^\YÑãJÔ½xŒUñçç˜ôï0þa꺖šÂK&há†aÒA KqþK2žäqÅ^·æý6çMÿœf²´¹gX¬äun«ë\,¡Oú¡éа¯ùÆoü˜ÒÿÛ>ù9*õŸùÈÿü–sÿÌ]¿üHâ¯.ÿœ]ÿ”ÿPÿ¶Lßõoб¿Ï=6æÇó?YõãtÑÜÀçö£’5ܪÁ“ý†*ú/òkÍš.·äMÚÒâ?®éÖÚ]ÚrThGȧ^2qæ­Š²Í7_Ñu9îíôëØnæ°qäq8s‘PŸçË’ý¥lUòç6›s§þfk©8#׸úÌLz4s¨‘HùWûU–ùGþqçüOåë-nÃÌú7q†x¾®ÌÑH6x›÷ƒâ¾UXÎ;Xq´!çOÓ œØúÔôØ =_jñû\~/²Ø«Ö[Ê’yOòCWòü—"ñì´N· ¥z«<£á%©ÇÔã×|áùAæM7Ë¿˜ZV§©7§b¦H¦š•ôÄÑ4aÏù*Ì9‘Ë}‹.³¤E§NKØN Ïë†Dôxøó¯Ç|[ù‘¯YkþyÖu{÷Žæàú E9"(Œ=N|y⯮¼«§O¦þ]év­Å¶—s)ê²5ÿbÛb¯|«q·š4{‰ÜG7ÖÒK#tTIT±? 1WÝ‚D!H`Cý‚Çjíã¶*òÌßÉo(ù“Ìk5¶¬š7™55iE«t¹ô€ë$uz}¶CþW\ÛxÇæäïš¼‘kýü–÷:|²ˆRæÙØñr (tuF‚·Ùæ¿åb¯pÿœ:óηªjº——µ;‡»ŽÊÔ\XË),èœÂ ä¸ªi¯~Fþkêzbkœ«y†yV6³{˜™¡· Ä—–WXëÏáfUÿˆ*ô¿È$ùŸÊš>«o¯Ù}Jk›„’õb—’ªPšÄò¿Ž*ñíò+óRÛX±¸›Dá 7I#}jÌÑUÁ&‚bz Uõ¶*Ä¿2?.4<è¢Êñ½í¹/a|£“DíN@­G8ÞƒšWþ|õqù7ùÇåk÷—FŽvê¢ûJ¹àY|(9‡Ò˜ª¶‡ùùŸæ-P]k¥´ärmBúQ4æŸÊŠÍ#8ÿ‹?õñWÔ>ú7KµÓþ±5ßÕbX¾³rÞ¤ÒqäíÝŽ*ŒÅ]мŸóKòMó]ÌšÆ2iºÛŠÎÑîùŸˆä’xÈ¡¹~Òrø±W†jŸ’Ÿ™Út¬’hs\(? ¶¥'V FKöJ¸ª¦‹ùù™ªÌ¨4w²Œý©ïX@‹Ú¥Md?ìclUôwågåfäM6UYæ«yÇë·t*´_³iSDZõûOÿª«üÖÿœ|—YÔg×|ªñCwrÆKÍ6SÁFݤ‰ú+9Ý‘þ_5û8«ÈßòWóEgô—ççZT©dlå„KëÛËñ³¡ŒR;tSÛzçg–5Ï2ù]/E¶úÝó\C"ÃÎ8þ$±å+"íþ¶*Àÿ!,|ñå_8^jö›õ;9tù-ã—×·–²4ð¸^1HíöQ·§UŸ~j~Uiž{Óâ&Ag¬Z,ïxòNæ)@ûQ“Óö£o‰m]WÎÚ¯äOæ~;Gú ÞF {I#•Ü ¬€®‹Š³ŸÉßÊoÍ ÌkºèvJiw ¬²½Ä5©Òˆßù¤dhþÚb¯Kü×ü¤Ó¼õiñʶZ媕¶¼ ²ºTŸJP7áÈÕX|Qÿ•öqW„ÿÊ«üíòÌòÅ¥Áyrü/6—uÅ$â7G§üdEÅS%ÿÎ?yÿPÖ"ÔµéßD%=Ϭ$½vµƒ?ÿ‹$‡íp|Uï~~Óü»ó|™øi«ÉÏ&4¶qR{œUñß’|µþ'ó=–„&ú»_zˆ“È+¬NëQü¼”rÅY§ùùŸarÐþ†k´‰=¬‘Éñ_öh˜«?ü«ÿœzÕbÕmõŸ7Æ–ðZ²Ëo¥†YIÕLÅK"Æ:ðäÌÿ·Çö•}@ ‚*ÄUò·ž?ç¼ã¦ê·ù~×ô¦#³ÛzN¢hКˆÝ«1_³É9òÿ'ìâ©×ä—å¿æ“ç›SWÓ&´Ó-#YçtL‘2¨XùsÜŸÙ\UKó;òó^ÿÍ7:ì.¶$pÖÓ[ȰK jv‚'eáéþϤò¿â励¹-?<|ÄÑ[êVÚ…Ìq‘Àê7UŽ>Õ´‡þb¯¤?ç*G‘fº–òtºÖoâ¥Ì‘WÓ‚±ÆZŒß,ÏÅy|?ʽçv*Ç|ì̶zwEu`i¶ÜŽ*ȱWÿÖõ4pCsj†Fç!P&=Í:œU~*ìUƒù·þ; þ¢~¬U&Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUþaÿÊæoûdßÔ3⯕$òièñ–_ù1&*û+v*ìUØ«±Wb®ÅSÏ'ÿÇXÿÆ&ýcf¸«±V9ç÷Mÿ¶•·üHâ¬ÿ×õN*ìUØ«óoüvýDýXªMŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت•Õ­µÝ¬Ö—Q¬Ö×ÑO Š«£‚¬¬Ue48ªK§~_ù#M½ŠûOÐì­o $Ãq(®¤‚  ¶8ªŠ»v*ìUØ«±Wb©ç“ÿã¬ã~±Š³\UØ«óÇûǦÿÛJÛþ$qVGŠ¿ÿÐôg–.î®.õµžV‘`¿’8Cñ@x U=Å]а6ÿÇa¿ÔOÕŠ¤Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O<Ÿÿcÿ›õŒUšâ®ÅXçž?Þ=7þÚVßñ#в·Ö.b¶§.<}RG.Zxb©Ž*ÿÿÓô¦‰¤M§Ï©É#«‹ë§¸Œ-vVPÔuÛMqWb¬Í¿ñØoõõb©6*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSÏ'ÿÇXÿÆ&ýcf¸«±V9ç÷Mÿ¶•·üHâ¬ÿÔõN*ìUØ«ó{*êÎÌBªÆ¥˜ì©Å^+æ¯ùÈŸ"h³ÉkdeÖnc%XÚ;zÎ@oœk"â¬R?ùÊëc5$òÓ¬5ûkx©þ©…Gü>*Î|Ÿùíä?2ͧÖKÔ$!c¶½ ØöIT´g}”3#·òbªþ{üãòÿ’µHôýcNÔ]¦ŒKͼp<2/F Ï27$;:•ÿ…eÅRþr;ÈZ®­i¦¥¾¡j÷’¬)qs ³š/6Yœª×jñÅ^©Š´Ìª¥˜…Uf;sм–ïþroòúÞîkuµÔ®dÅŽ@¦œÐ´êܪòUÅYw?2´ŸW×<ͪ¦•¢Û«ÇÊ‚QÙˆUE¨ßzßüã?æ4†xßO¹ ýV)ÜHO…dŽ8ëÿ=1Uÿ”ÿ’¦¹®Kqæ[Yl´2cͼ¡’K‰“ýÔ½?v?Ý’/ú±ÿ2*÷OÍ/ËËO8ùIôØ‘"Ô,Ç«¥I@H«ON½£‘~ÿbÿ±Š¾5¹¶¹´º–Úæ6†æÝÚ9¢qFGCFR;F*ú÷òOÏÃ;Pˆ]KÏXÓ8Ûj?Ð~êoùê£âÿ‹LU"ÿœˆüÂýåñåÛ 8êšÂ;)£Ei^.~sÆ?ÈõqW;Zòö¥æ-rÏFÓcõ.ï$¿Ê«Õ¼oòqWÛRòÆå/YèšxýŪQ¤ ’C»ÈÔý§mÿáqW˜ª¤ÍÑÏ ´sDÁâ‘MYMU8«ìÏÊ>Ãç?)Á|ì£S¶¥¾§Ú“(û`$£ã_öIû«3Å_Ÿ˜«êÿ$é7šÇüãäUSw{§]AsÅK¼²SÛyý ‡ægûâÓþ’úb¬?ΞE×üŽ´‘¤÷zñˆœH8r+¹늭òg’uß8j’éš*F÷PÀ×.%qújè‡sß”‹Š³/úÌÏ÷ŧý$/ôÅ^±æÍûCÿœw¸Ò/­å”1ι/!p‡cß®*ù[~â®Å_*ÿÎLÿ䯋þÙðÉÉqTãþq[þR sþa"ÿ“˜«Òç!¿òVj_ñ–ÛþO¦*ù&ÞÞk›ˆ­á^sLëkP*ÌhMSгßùP›_õbÿ§»?ú­Š»þTæ×ýX¿éîÏþ«b¯gÿœ~ò/š¼§g­Gæ ©=Ü5¸õa—EpßÝ<”§!ö±T«þr[Ïwºm§•´ùL2jQ´úƒ¡£~E=·ã++óÿ%8þÓb¯Ÿü»å½kÌz¬ZVl×W²Ôª >Ó31 ª?™±W£\Î3~cEhgI4ùå¿UŽwV*ñ¤Uÿž˜ªÏÊïÈýk]óßâ+Yl4.P—±H I4ƒF3ü´¡yý†ø>×,UõÔÁ¤Í(#†+vHãQ@ª©@ð|оÓüŸÿÉgåßù„_ø‘Å_?~ùî÷]ó…΋¤i,†„…îá–F«+r•Wü¶ÅX·’?-|×ç9e]Ý~¯ =äíéÂŒw M 3’ŠØ«$óüãÇæ.d÷‹¶§kÊD°‘Þ@£© "DÏò›b¬óòòuí ¿›üÁ[’=M"ÅÁ0zO þb?ºOÙþóíqâ«Þ±Wb®Å]о|ÿœ¡ó}_Nò¥³ì¿éÚ€&©ÏGeÿŒmоÅ_b~GùÀy—ÈVfi9êgú å~Ñ1鿉ç ·óóÅYþ*£yymei5åÔ‹ µ´m,ò¶Êˆ€³1öb¯¿5?55_;j®ˆïo [¹úiP6ÊÚ‘¿ä—ÙOÚfU"òŸ‘|Õæ»–ƒB°{¯Nž´Ä„†:ÿ<ŽUÿ&¼¿ÉÅYúÿÎ0þaD†ïLJú&i¹|¶‡‡ü6*ÀüÛù}æß)αëvr0Ü©BçÁdZ¯/òÇþN*ú‡þqGòÏUòÄ“ë:´³A{©Ûº_"#Ž ÊÊò§C9í_î“áûLüU}#Š»cžxÿxôßûi[ÄŽ*ÈñWÿÖô7”ÞÏ0ÛJOøŠâ¬v*ø‡þsNº·ü׎ñÁ6÷º|§ÃX‹# >+ð±ÿ_a“_˜¶^Hó÷Z…»Ía}¡;D’:0euŽCo‰kо¢ò÷æ’¼ÄiŵįömËúsïÿIÂOø\U‘b®Å_<ÎH~[zR4È¿w!Xõ˜Ôl®h±Ü³Ú9?Êàß¶ø«Ì¿+|û7’¼Õ¦Cɧʦ FÝ)W…·ª‚@çëÿûXªQæï3êgóî·|}w!e޵Xã$kþJ-}ÿ8ùùmúDÿj1qÕõhÇ Œ7†ÔÑ”{4Û;“é¯ób¯^Å_Ÿ˜«4ó/e±ò/—|Ýh¬öz”MøÜúw +ª7²J‹ÿü늯ü¢óüžLód7R¹ýyK}N1¸ôÉÚJ4-ñÿ«Í?o}•±ËKŽE ަ ©Øâ¯ÏìUö_äþJÍþ1Iÿ'äÅYÆ*ù—þr›þRý'þÙãþOÉŠ¡ÿçå?Ô?í“7ýDÛ⯨±VùÝÿ’³_ÿŒQÿÉøñWƘ«ë/úÿË?÷ýßý#·õÅ]ÿCùgþÿ»ÿ¤vþ¸«Âÿ:|ã¢ù·Î ªèí#Ú-¤P*Ûš3“±ÿXb¬Ïþq[þR sþa"ÿ“˜«Òç!¿òVj_ñ–ÛþO¦*ùGF¸†ÛX±¸™¸C ÄRHÔ&Š® 4=*úÛþWçå/ý_éÒóþ¨â®ÿ•ùùKÿWßút¼ÿª8«-òß™ô?2鋪h·?[±ghÖnGñ&Ì8ʨÛ«Š¾uÿœ¡Ó®¢ó®Ÿ~À›[«Ž'¦Üá•ù ù ¿Ùâ¬SòóÓÉi}BöÝ籺­n=*YÕà$¡MÖ¸«ê_.þcùÌAF“¬[Í3Ò–ÎÞ”õ=½)8H~…ÅY&*‡ÔãŸsÿŸþ"qWÀ˜«í?Éÿü–~]ÿ˜Eÿ‰Uò‡æFu§yûÌ· ‰üòÂ…’Y ‘¿û4ulUèß‘_œ_ò®›>¯+ÛÛMp×0j©‘Tº*²Ê«WýÅ•_} ¢yŸËºä^®©[_­*D+²ÿ¬ ò_öCLñWb®Å]Ѝ_ÞÚØXÜ_]¸ŠÖÖ7šyEHÔ³  Uð×›|ÅuæO2êÝÍD—Ó4Їö# iþÂ0©Š²>þYÜygÊ>WÖ™[ÔÕ a¨©éîLÑf07Í b©·ü㿜?ByÝt¹ßޏ¢Ø‚hÂ’`o¤–‹þz⯫ñW”ÿÎHëòé¿—âÆã&­r–ïCCè 2¿ÞQ¿É|Uóƒ£ÜëZ݆‘m´÷óÇo™/#ìµäqWÜ>Zòî—åÍ×GÓ"ZZ UþgoÚw=ÝÏÄÇDjz¾“¥[ ­Rö bÁ÷R¤)ÈÔ…äåW‘§LU$¹óÇåµÔb;Ÿ0hÓÆ®²*IyjÀ¼…]|Oò—|»æÏ,ê>Yó扨-.-ˆp(²!Ý$_ò]lUôüãæ'éM!¼§¨K[ý19iìÇy-A§ ú´Óþ1qÿ}¶*ù›}—ù#ÿ’³@ÿŒRÉù1Vqоeÿœ¦ÿ”¿Iÿ¶xÿ“òb¨ùÅßùOõûdÍÿQ6ø«ê,Uƒþwä¬×ÿãò~Ü£Fãæ¬Å^‹ùcùÝæ/-jözµÔš‡—Ý‚MÄÉ$M9Âæ­ðuô¾Ã“ö±WÕw²$šdòFÁ‘àvV‚ Å_b¯´ÿ'ÿòYùwþaþ$qT»ó?òwDóÂ-ØéúÜ)Â+å^Jê7 2TrÊÀó_ò—àÅ_=y—òCóAæï¦6¡j•ÿI°>¸ îP2õ£ÅXD3^XÝ a’K[¸át-ˆÃcB(ÊÃ}ùùÑ«jº¤^Vó$ßZšuoѺƒPH]c§öù(<$û|¾çÏáUïX«±Wb¯ ÿœ“óè¿(Å¡[¿½ié-:‹hHgùs~ þRú˜«À?.4MwΚ^Ÿ{$qX„·¯+*§£æêKmñ…ôÇúØ«ê/Ío/ùŸÈÚž•¡h×b?^Ä £¯¯Æ€|_·OOýž*øò æ‚hç…ÌsDÁã‘M ²š‚ˆ8«íÿ ù¦4ùGMÖÒ‚K˜€¹Aû3§Á*ü¹ƒÇüœUå_ó•qÊt/È+é-Äêþ™¯à­Š¼—òjh"üÏòóÍNä ­>ÛÆÈËeÅ_gâ¯&ÿœ™ÿÉsý´ ÿˆIоUÅ^—ÿ8Ýÿ“·Êßñžoú†—~„â®Å]Š»ÿÐô7”ÞÏ0ÛJOøŠâ¬v*ó_Í1i>]z¾«0†ÊÚ$.z³²¢Úw;(ÅR_.ù“Eó—§£Ý%Õ¤£í)ø‘©R޽Q׺¶*Å;tï,Üþ_j—ÚD%¶ÛMÀ-ѺHÛí~ñ«¨ýµŠ¾9Å_yym.S˺Z]Wë+gž½yˆ”7ü6*˜â¯“ç#ÿòfOÿ0–ÿñвŸùÅ?øèyþ1ZÿÄ¥Å_Dâ®Å_Ÿ˜«ì¿Éü•šüb“þOÉŠ±ŸùÈ˿ӺóŸ-WHBgU¶ƒâaþ´;È¿äzŸä⯛<»¯j>_Öìõ9ý;Ë)‘žÄtdjuGRQÿÉlU-Å_eþHÿä¬Ð?ãŸò~LUœb¯™ç)¿å/Òíž?äü˜ªþqwþSýCþÙ3ÔM¾*ú‹`ÿßù+5ÿøÅüŸ|iŠ¿@ñWb¯•ç&òcEÿlø?ä个qÿ8­ÿ)¹ÿ0‘ÉÌUé?óßù+5/øËmÿ'Ó|«åßùH4Ïù‹ƒþN.*ûÏv*ìU¯kº^ƒ¤ÜêÚ¤âÞÊÕ9Ë!ÜøQûLÇáUý¦ÅT<±æÌÚTZžr·6ÒÈ9ÆÄT¤‹Õ”â©ç囿 êÒëÉ[{yÊwÔKž'Ñô›írgâ¼GÛû-ð⯌qWÜ^[K”ü½Ò’ê¿Y]&=zóÊþ|;оÓüŸÿÉgåßù„_ø‘ÅQþmóç–<¦¶m­Ýý_ëÒˆ`P 7ùR0ˆã¯Æøªykumwoͬ©=¼Ê)£`èÊwXTм;þr‡NòÊi}ñH£ó—,¶ÁŸ©O´¨þŸo³öWí6*ñŸË¹Ì_-‹zúƒQ¶-OäY“þI†Å_nb®Å]о0üßó‡ø«Ïw÷Ñ?; cõ; ê=I‡´Ž^_öx«ŽÎîT:Œ¨Ä}àb«¿GjòË/üLUNX'„4m;€êV¿~*÷/ùÆ8z÷•.‘Þy` ÿwF J£ýx¿üòlU韞žT›Ì—׉j†KÝ5ÖþÝ©oH"Žõ1;ñ´ÜqWÈvwwwp]Û9ŠæÞE–ªº0eaò#}ùiù¥¡yÓKˆ¤ÑÛëh€^é¬B¸p>'ˆWˆõ ¿göñVmмgþrŽîÔy+N´3Gõ¶Ô£•mùPƶó«8Jòâ”ÿ+yoüãwþNß+Æy¿ê\UúŠ»Cßj6v)ÝIé¬Ò,1š3VGÙGÂ\UŠ¿ÿÑôg–-.­îõ¶ž&g¿’HK rBxŒU=Å]о+ÿœº_Ì)¼æ_U¶áåkp£I’سÂy(çj7 Ó‹Ž*¿ <þ7u^¦ë¶—1ŸL½¸±œìe¶•áz¬…N*»T×u½YÖMWP¹Ô>ÃÝM$Ä|Œ…±W þN~Qê~iÕíµMFÝ¡òݬ‹,²J¤ ’†¢(ÁûjÄRGû*¿å⯭1Wb¯“ç#ÿòfOÿ0–ÿñвŸùÅ?øèyþ1ZÿÄ¥Å_Dâ®Å_Ÿ˜«ì¿Éü•šüb“þOÉŠ³vPÀ« ©ØƒÐŒUñ÷çWåéòšÜÚÇÇEÔËO§>ß÷ÿÏ&?üVÉŠ¼û}—ù#ÿ’³@ÿŒRÉù1Vqоeÿœ¦ÿ”¿Iÿ¶xÿ“òb¨ùÅßùOõûdÍÿQ6ø«ê,Uƒþwä¬×ÿãò~¦8+µZ€ ÑŠ¾bü×O=7›®n<áC{)"߈?WôTü+nße¢ð\¿¼ýç,Ué~fó&“G¥jך|ljÉkq, Ÿq.*„»½¾¿¹3ÞO-ÝËÐ4³;HíáVbXâ¯ÿœü¤Ô¬/—ÍÚõ»[H¨Ë¥YÊ Ê ƒ‹Nê~ÇÀYcVø¾.ÉÉW¾b®ÅXçW›ÿÃ>B¾–㨩Yo¸iãþ1ÅÍ«üü1WǶÖÓÝ\Åmn†K‰Ýb†5êÎ犨ù“оæòw—mü·å7D‚…l Tw·!ø¥örlU8Å^Aÿ9)å/ÒžP‡\‚>WZ,•”ަÚj+üø8¿É_S|ÙåÝróA×lu›3þ‘a2LŠMq;¡§ìºÕüœU÷>‘ªYêÚU¦§füíoaIánüdP´î+ñb¯Ÿ7¿!/Ἰ×ü£nn,æc%Ö‘þò&=Zn6?î¥ø£ýŽIöxq·<ฅ½ÑÑÔýXU8|óÀ‹ÑbÔÄ4§¦/.8Óœ銤ÓÏ=Ä­4ò4³9«ÈìY‰ñ$îqW°Î1y7ÍŸšš·›1Ò,^i®oÙxBÀñü,üD‡›ªñ“b¯¼1Wb¬sÏï›ÿm+oø‘ÅY*ÿÿÒõN*ìUتÿBÒoË›ÛdŸÔ^¤2Ò”"´#a§üã¿ä¶§!’çʶ¨Í¹ú³Ïj>ëy"ª¦“ÿ8ýù7¤È²YùZÐÈŸa® ·$ô‡—|U—¯–´5P«hªª(ª ì7Å[ÿh¿òÊ¿{\UßáÍþYWïo능—åwåΩtnõ?-é÷×D3ÜÛÇ4…W æášƒUÒ.|‡£´¤h6ZsL™­!X …­zayR»WL¿Ãš/ü²¯Þß×wøsEÿ–UûÛúâ¬{þTÏå/ýIúGý!Ãÿ4â©Í“¼¯akŽ› ¥¤@ˆ­à_N4Ô…E¢®ç¶*ˆÿh¿òÊ¿{\UªùÉz¼)­£ZêÆÜãŠê1:«Rœ‚Éȡ능Ÿò¦)êOÒ?éù§Nl|å{ XììtØm-"Eoúq &¤*-w=±TGøsEÿ–UûÛúâ©^«ùiù«Ì“êÞ_±Ô&xG-Ô ;*Ö¼CH…©éе¥þY~^é s¥yvÃO¸t1¼Ö°$.PÅKFñª©ãþN*šÿ‡4_ùe_½¿®*‡¾òw•ïíd³¾Óa»´”-¼ëêFà€ÈÕVÜwÅRoùS?”¿õ'éô‡üÓŠ²ðæ‹ÿ,«÷·õÅ]þÑå•~öþ¸ªS©þX~]ê·"ëTòæŸr žêÝ&~"¤/' ÜEzb«ô¯Ëo éI&“ XéÒJÊö¤ Ê @cZŒU¨ù'Êz«Yê:U½í£^Þá}XÉSPJ?%4;â©Gü©ŸÊ_ú“ôúC‡þiÅ]ÿ*gò—þ¤ý#þáÿšqWÊ™ü¥ÿ©?Hÿ¤8æœU¥~Z~_é<úO—ìtù¤^Kk@̵¯Ñ…%j:b©“ùgB‘ÍebÄv ‚qVªÿÎ<þLjŽ^ëʶªÍÔÛ4Ö¾ÿñîñb­é_óŸ“:T‹%§•­K¡ªµÃMtA­kþòòÎ…*%š*( ª¥€lâ­·–´6R­h¬¬(ÊKAìwÅXÿü©ŸÊ_ú“ôúC‡þiÅS«?(yfÊÖ;K-:kXG „ãEðTRGËY¨ù'Êz•«Zj:\–¯»Ap¾¬dzŒU†ÞÎ4þGÝËêKåx•M!¸»wÿ&)‘ U9п&+t)DÚW–ìí®Õ.8³Ê»×á’BÎ>†ÅYøsEÿ–UûÛúâ®ÿh¿òÊ¿{\UßáÍþYWïo능ú·åï‘õ…u}ÏQXI0­ÜK8BÔ©_S—Ó¶*ƒ¶ü¢ü®µ¸Šæ×Êš\0°’ⵉMU••C+ÐŒU<ÿh¿òÊ¿{\UßáÍþYWïo늩\ùOË—VòÛ]XE=´Êcš AttaFVV%YHê*‘ÿÊ™ü¥ÿ©?Hÿ¤8æœU9±òw•ì-c³±Óa´´ˆ¼ 鯀š¨´UÜöÅQáÍþYWïo늤ºïåG导yk_³½’”JŸ½v$ðX«?󌑆oXùa9Ô »à›'áÿ ЧZWäå.”Áì¼­`’.ë+Æep}žRì>üU•Ùèúmœž¥´'§‚zxnqTf*ìUŽyãýãÓí¥mÿ8«#Å_ÿÓõ,76Ó4‹ ©#DÅ%ÁŠ8ê­O²ÞÇTÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Ç<ñþñé¿öÒ¶ÿ‰U‘â¯ÿÔîÚ¿£iºŽ»õÜvò>¡#*¹5+@+øb©ÏøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓGéÚ¾›©#½…Â\$g‹²v'|UŠ u-sIÓ5¿ºKs(&0õÜ´ûñTøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓDXy“B¿¸öw±Ï9„jMh:öÅS,UFööÖÊÙî®åÛÇNr7AÈ…‰ÅR¿ñ§•êåÞ¦*ïñ§•êåÞ¦*ïñ§•êåÞ¦*ÚyÇË:¢j0³¹ ª ܇lU9Å]Ф¿ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU5µº·º·K‹wÁ(å‹ÐŒUWJï|Ï Y\½­ÝôpÜGNq±5€aÛÀâª?ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU§jún¤Žö p‘ž.ÉØñT^*‚Ôµ­+Lôþ¿r–þ·/OŸíq¥iòä1TøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓDXy“B¿¸öw±Ï9„jMh:öÅS,UFööÖÊÙî®åÛÇNr7AÈ…‰ÅR¿ñ§•êåÞ¦*ïñ§•êåÞ¦*ïñ§•êåÞ¦*ÚyÇË:¢j0³¹ ª ܇lU9Å]Ф¿ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU5µº·º·K‹wÁ(å‹ÐŒUWJï|Ï Y\½­ÝôpÜGNq±5€aÛÀâª?ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU§jún¤Žö p‘ž.ÉØñT^*‚Ôµ­+Lôþ¿r–þ·/OŸíq¥iòä1TøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓDXy“B¿¸öw±Ï9„jMh:öÅS,UŽùÙY¬ôî šj6ÄÓ}¹U‘b¯ÿÕõéöÅÞÚ&f5f(¤“îHÅZý§Ë,?ò-¦*ïѺwü²Ãÿ"×úbªÛÛ†$ˆÈE _»TÅTæµ¶œƒ4))_³ÍCR¾ÅTÿFéßòËü‹_銻ônÿ,°ÿȵþ˜«¿FéßòËü‹_銮ŠÊÎ'çÆý9**Ÿ¼ U[[$QÊ…$@èz«A¦ý*£ú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅ]ú7Nÿ–XäZÿLUÃNÓÁZÂÜÿLUŠ»CþÓ¿å–ù¿ÓwèÝ;þYaÿ‘ký1W~Ó¿å–ù¿ÓwèÝ;þYaÿ‘ký1UtD"„EØ*Šô U¼UFK)\¼–ñ»ž¬È¤šmÔŒUoèÝ;þYaÿ‘ký1W~Ó¿å–ù¿ÓwèÝ;þYaÿ‘ký1UHmíáCDä"…¯ÝŠªbªs[[OOZ$—xóPÔ¯ZWSý§Ë,?ò-¦*ïѺwü²Ãÿ"×úb®ý§Ë,?ò-¦*º++8ŸœPGô䨪~ð1UlUl‘G*‘¡ê¬›ô8ªèÝ;þYaÿ‘ký1W~Ó¿å–ù¿ÓwèÝ;þYaÿ‘ký1W ;Ok#pDký1TF*ìUú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅ]ú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅUÑ4Š`ª(Ð1VñU,l¥rò[Æîz³"’i·R1U¿£tïùe‡þE¯ôÅ]ú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅU!··„ I;Š¿v*©Š©Ímm==h’^5ãÍCR½i\UOônÿ,°ÿȵþ˜«¿FéßòËü‹_銻ônÿ,°ÿȵþ˜ªè¬¬â~qAoÓ’¢©ûÀÅU±Wb®Å_ÿÖõN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©µço/hÞ`Ñt ùÙ5O04ɦ@‘»ó6áZBÌ ˆÀ7|U=Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتEªyÛËÚgš4+ÝÎË­k‹3éÖë¸u·BòeP*‚~_Ýâ©güägæ/›tKKo/ù"F‹ÌR[\k:…Ê*9¶Ó,QšG!Ã/ï\p]¿a“ö×zo’¼Ã»ä­_gj÷s1 gˆ4€öø[8«Ç!ó¯æ˜ÿ/2<ý¥êÓYé´£ÉЬqÒ;M4†žärB_ë+¯Æ_ÓoWzÇ埘fóå×—u˹=K«Ý:Þ[ÉH þ˜5:ÞÅ^Gä?Î/6ëÿ° ‰Z?!y’=BÛÊÐ2 I[MãÊä7R²zRìÏþìãû8«Ð?<¼íªùcÉÉ€ÔóV¿u• ª€Íõ‹†¡p¤7÷iË~<}Fcëæ8èžÞVò†¡¬Ë¨èú¶‚ÜıÆ=MBÙdi¦ªª]açÄ«"üëóž³åÿ,A§ùoâów˜îSKÐJË)øæ½,|G›¹É¬rMýç¡ÀªÿÅŠ­ü¿×<ûå_Íéÿ-<Ñ­7™4ëÍ3ô®‹©ÎŠ·(ªå JA$×Ó˜LÿaxóeÅROùÊ]Ï^T×5Ôó”©åËÆµµÊ‹eÌÆŽ ß?Sâeyÿ»ÿбVmùuùeù“å»Í%õ_?˪hš}¸€ùôt'Š8ýu’GãâƒãôñW›ÜêÞsÔ?ç&üáiä¸aý*tûm7ô½Ðçoal±Ã-Ä̃ûÉ}`±Ãí?Ûødwòæç•|·©y¿KüÊÔ5KH‚Kû›+Èb[9¢}I•a£÷jÅW‹'ÃË–*õËß57š|‹¢yŽhÖ u+8î.#a$+IÔŸƒ˜n5ýœUç6þdüÄüÖÔ¯“5Uò¯¬&{U×Öž÷R–3Gke’‰º·Â$ ÏýŽ(•J|á¡þq~Vé­æý#Î^mÒ4ò²kZ.®™­êɵf^=O>ßï”x«=üÁüÙ³òçå)óí„?Y–¶Ói0IPïB˜}JPñ@üäZþÇU‹EùQù˪i‹ªê?™—¶^c™=e²²‰N…Èä°ðR¾ª/Ù2qÿbÿ¶«Ð¿-OŸÿ‹çÅ·_1§%íX0tàyÊGÛX¹GûKö¸"¬_ò?ÍžaóMÇõJñ®tÛo0]iú,EQDVöô`£ˆ j²ÇRØ«ÓuÌ/Íß0kï£ùšO)ù/A¾—K·z+_]Ü@y^V ÅĬœe¸påñ⬗È^YüâòלçÓõmy|Ïäy-½Hu î)} ÅH¨^O'OÔoOƒr‹«ÆÊ½CcÞ~óÆ‹ä+^y‹WcõkPp%=I¦sH⌮íÿ¼¾Å^o§yCó¿ÏãXóšæò]¥ÐXùwG‰DÐÆÛ¯ÖnŒž­)Í>/ùåýÞ*žy Ë¿œ~[ó\šfµ®Eæ%¼àÔ®À‹P†jü1ÑC¿Êi]÷L«Ì-5O;êßó‘ž~¶òZC£4v¶3k—J%ƒOµ¶Ž4Äîéä™A|<¹óøáU?óç’?6ü•å«ï9i?˜ú†©}¤'Öîôûø£ú¤Ñ% ¡c«$& Çü•dozGü¬Cÿ*üõaê~…ý+õ:ž>¯ÕýONµ¯Sáåü¸«ÿÑõN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»x–½=¯–ÿç(´ÝV᎖½å«˜ngr†²f¹‘‰=a·ŒœUùI¡Ÿ7¯š?0õ¸˜ÿŒýK&  :\¡‰)û-qOROæâ’~Þ*óÍ Î:ÅüãÌ~F±~~n¹Õî¼™h ÊÏ1i\Ò¥V+i¸sÝü о€Ó<‘¥é¾@Évš|zsi¥ºŽIŸµ!fwÿ)±WϾNón«'üãÖƒä=&OKÍšþ¡wåÈ:†]¥¼¸Ÿ³ok7añ/%|U™þpy{NòF‘ùi«éiéYy7X´³v?hXÝ(Šá˜ÿ4žšs?´ïËL,óßçíÖ yåÿ˘ •§t“W»¿aQCèF=7±"Fت—çœcNüÄüªó58¬ÑÒç“jqÔ å_å !ÿ‚ÅQ^P_ñßæþ¯çGoW@ò‡©¡yoùñ€ý!t¿*ý]\|2Gþ¦*Äü¿ç8,¢üãÓäâFÔÆ©£ÚŸÚ}eÕâQ½P8‡—ò¯&þlUê’ÞJŸÊ—Ú}…í[Y¼å¨ëR¿Û{Ûª<¼ÎÕdb¯üWгœUã¿óWúV¥{ª~[ùÆûÊM)¹›L ·6 #,D QáËÖãöWáøqTwäÿŸ<÷yæ¿3y Ï?Vº×|¶ ”j¶KÂ9â¹PëÍUÅãeà‰ö¸²rOT«óÃ?ó‘¾Dó(ø-<Ém>{MÁSâòMÿžXª¦ˆ¿ò³?:®¼ÀçÖò‡¬t~ñÏ«µ óŽÍè…Õ‚Dý¬U¿ùÊŽ‹äÿ+ÿÔÁæKYWz¾%`wµ$x«ÚUT*€ª¢Š£`ì1WŒÙ«ÎXj3Tò÷–b¶ä;Kq2Ê íÞ;‰1WÎK§ÁäO,¯]kÌÖK ñ†>JõØì ¨Äÿ“нŸx¯üã¬I¨kŸ™^j§&ÔüÉqi‡¯£iVŒTšý›Š²ÿÏmPi¿“Þm¸&‚M:k]ünÀ¶û÷HÒóAÿœ^x-¹GwmåFv*$‘ìùÊGqijŸòqVùUùOçKïËŸ/^èŸ™š†›¦ÝYÇ4Z}½¬M'Å,j}O‹„ÆE-ö¹b©þ¯ùçÝKN¸ÓuOÍ]J{ Ô6÷òÚÅÆEP¡ýèûX«:“ò¿Ë—–vŸ—Ú°kÍ*ÞÊ &˜~îRöê¼gMÛÓ“šz |Kûb¯8Ô?+ÿ8|‡£Ïyä?ͨiº\-,z· L 0!oI'<øü#Š*$ þZ®*ô/Ë¿ÌFóGå]îí–Ñ嵸žê'€{G’9 דf…+ɸ6*Åÿç,%ƒòsO½š¾¶«uy{)"„“;EÊŸåyb«u¿ùÇùbó¡æ? ù²ÿÊŽ©!¸½¶„ ‹e$±chþÓo‰¤TäÞšqø1W~Uùßó?Ì=còÛÏrÚêzŽ›bºž·f‚!,ãN2 ¼Ï¬´ãqá'Ûø{*ñOùÈy o4þWZj Mo0Æ÷Ç˜Ä<ê@§Ç ßöyâ¯kÅ]мWþqš$¾‡Ï^j"³k¾e¼!û˜!!â&¼U§”*þÎ*Éç"5A¦þKùªrw–Õm@ñ7R¤ýùŠ®ÿ ùPá®Öÿ }S }o¨ñ­:×Ôø©Š¿ÿÒõN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ygçoäÅ׿=Ç—åµÔÆ”ÚSÜÅw(V2Iiz©ñ¡SÔÆŒ¿Ãñâ¯KÓ´û=7O¶ÓìbX,ìâH-¡_²‘Æ¡QGúª1W–ywò!tÏÎMOÏ—ëq§M-Åî—¥aè^Þ¢%Äí_€– ø~/îÿ“zÞ*òOËÈ…ò§æ½æË»ä½Šîâêm ÅU‚Ù­ô¥æ?§¨cXá䟱Ïf?š^Hxò­åYmä¿= ‡R˱H²£7§$ÞŸ³Š¨þT~_#yB-[Ÿ¯êsM-æ­¨šò¹º¹<„·Ä~ ñ|_*…üåüº½ó÷”cÒ4ûåÓu[Ø/ì¯\1Ë!Èp£âíÄâ©×<›aäß'éž[²ø£°„,³R†Y›âšSï$ŒÏÿ аO8þD/™?7tÏ:K~©£@¶ÒjšG­ÍÅ‘‘­Ùˆø(ƒ+¯ÙGþ|U—~iùgÍžeòuΑåmhè:¬ÒFEð.‡ÒV«Æ$‹÷‘ò´Ÿê}—ÅWßyõoË‘äíkUº¹š[¬¯5ˆœÅs$¨Šjƒûn¼™¿¨¿¾§&Å^w£ùþrW˺|z“æÍÿG¶Q –¡¨Á?×b…G7à>Ï«,¿ëqÅYÇååœ^L·Ônï5 5¯3k“ sZ™B4Ò-x" $G|›‚Wö¿—Š"¬þr¶½òŸ—´Ë |Õw­Û‡#„ÒS:†V`ÃtDõ³þËúX«Ò.<‘aäŸ&iž\³£}N!õ©Àþúåþ)¥5ßãž5û)ÅgJ¼õùuyæ;y+]qÃaåk›‹»‹VR^i$ú\HÙ}6‹¿ób¬ë`¾Pü»½Ñ1|åç Û¸®[Ì­h¶‘"°h!µŒÇÅËËô¾Ïòb¨?ÎOËMwÎ1è:——5(tß1ùjóëÚl—H^ݘñªÉ@äoðåãñb©×í?3`·½“Ï7ÚeÝÜ¥>¥•©ACsäò#—%{|Ïôèæ‰^ËÑú»@À1qáÀŽ„ÛxÖùKù·äInlÿ-<Ëa'–§•æ·Ñ5øåeµ2°ŠhVI ×ýEþegå#*™éŸ”žw×uë oó3Ì˪&•2]iº”kaÄg’K#|2ÎPýŽkËü¾“Mÿ6+õ_7¾“«hôú™4m6à’Ù‹Ž$I xò¥WÔ ß¼r$‰öUc7ÞAÿœ„óM‹è^jó^‘§h7 bÔ%Ñ`•¯.aaGŒ™’4‹Ô_´cÿtø1W j>G·‡òÚóÉ^])§ÀúdÚe„É„BXZ/Q©Ffø¹³}¦‹Cùoòî 7ò¶ÓÈ—WRpOúÍå›´sp}I"añ)æÅ–¿ìùb¯?п.ÿç"|¡`º–üÕ¢ê>_·„º¼­Õ¼#eD$ŠÜ?dI#/û‡fŸ––ùVëS×u½Qõÿ8k¥««È‚%á¢C k´q'·Ûø~àˆªµkä=/æõß›.|Ï#ùQ­Dž[Bâ5MTóB}-¤7¬?}ñzÝâ©·æ?åî‡çï+Í jüф֗QKop€„•+µG&VSö‘™qVgå?ùÉÝ.Ýt«O6èZ„kéÅ«jó õ@( DGŠG2É#7í»b¬ÇÈ@Õü­¥jfûÌ7z÷˜5w7š…Û ÏÂú0Ë (â>ÙEý”DUZüœü½—òÿÈV^[¸¹K˨$ž[‹˜”ª;K+2Ð6ûGÁqUŸœŸ—×þòiòå¥äv+5Ô]K*³†.È‘ñãLU›úqú~ŸéÓ É&[Ž—‚”P)¢; %ü?d ^’xIâ%ˆ—d ^’xI⥶¥ÑÓ½ãCTÝf®¢kÄqÿì>ý­¥0¦‡@À±.üXû»‡´‰AŸÞ±=ºD8® • ç·Å˜ËSêüðvCÕ(%”?ÜËÿv)Œ0 ŠÃÚr@›¸–ÍT—0T‘~G˜íBaÄí<„B( !àº2ü–Q•€ `¨Z[iÛ: Às©"#ÂoÉ À ¶m;ŽÓ–CÚ4¡Œ1B(Dø¹ÀFÀUUMh“Ïs*^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâÕŽã´åiŒ1|u]߀mÛ¸bÇÄǯÎ?¢ ¸oØžÿ„ïÇá-ƒÏÙ‰j7Çq(¥Š¢`·8>އŸo‡RUà¯xà£ëºØÉà9ÅÇGîBcØÆ²,×u)¥Ðú`Ê@ `Y!„Rl7ئsÕnŠ¢0ÆLÓ좢(¶my(ŠB‚lzÊŸÿÀG¼:´ZRçÛ¶#""’’’úôé£ë:PJ-ËâãéÜü_"„ {–––ææfJill,¥”¯HJ)wPŽãà ÐuÝëõ¶´´PJ{÷îmšæÍ›7ãããÑtâ@ÚÍ@Q”æææˆˆˆ»wïnݺu÷îÝÕÕÕÜÌy›ÐÐÐaÆåääLž<9<<\Ó4à>ƒJgá7ºŠ«RªªªëºW®\;v,¥tÕªUsæÌA@@×uœSnï¶m뺞——wàÀQ£F}ùå—ß|óÍܹs?þøãI“&¯›?®Ž¬ƒˆˆ¯×»xñâ;v@«3E‹Ãå¯(ʯ¿þúõ×_—––644,X° ** Zý!ä/ˆÜTy^@ñz½PPPðòË/GGGcÿ¹Qó•ªëzyyyaa!!äöíÛ”R¿ßãÆ 4¦Nˆ8¤}ûö!°,kÆŒÅÅŇ:|øðêÕ«SRRø¨Þ}÷ÝS§Naèã]ÿ <®K ]ПFFÆñãÇ> (Zà+Û¶ÿñÄÅÅõïßO†C°m»s£ZG|c¬¤¤DQô§¯¾úê_|¿Z–5bĈìììÌÌ̆†¶}ûö°°0˲lÛVUuРAQQQ<}¢”ÖÕÕ]ºtÉ0 ÆXRRR ¨­­UUUQ”¬¬,Ó4/\¸PYYùóÏ?wéÒ¥OŸ>Œ÷ûý¯ë8ÎÍ›7:tïÞ½ëׯ;Ž–œœÜ·oߌŒ ]×¹ës]wæÌ™¶m/_¾|̘1š¦á@xÂöqôèÑâââÏ>ûl×®]~¿ßu]L@0’wnXîÈšr]÷—_~]×Ç1MÓçó…„„¸®‹Kµoß¾………MMM˜bGGGïß¿ݺuxø¶mÛæÍ›­YŠßïŸ7o^yy9†îªªª¯¾újõêÕ]TTôÑG•””ð@¢(JŸ>}Ö®]›Pïܹ³fÍšuëÖiš†É Zë3Ï<³uëÖ””tâ”Ò¸¸¸üüü1cÆìÛ·oöìÙØm<ÆØ† G޹sçÎà|ïÏXÁa@)MII)++3MSUÕÝ»wß¹sçÙgŸMHHxì±Çúõë×½{÷¬¬,´SÌG{öì‰ EY¿~ýÔ©SCCCÑ \¼xñøñãÕ§M›6`À€àÎÈëõΚ5«®®ZÎìõë×óòò’’’žxâ ŸÏ7þüýû÷€iš”Ò°°0EQ¼^/æ6§OŸž4iÒ®]»† bš¦ã8>Ÿo̘1ÉÉÉ7nÌÎÎ6 CQtY¸Ž=ZZZúÉ'ŸÄÆÆZ–å8ßåà t.‰Žì“`öìÙ½{÷Û¶ !eee«V­ÊÍÍ:thrrrZZÚôéÓóóó8à÷û)¥IIIo¾ù&²¦¦¦¼¼}¥tçÎÜ_{í5àöèóùêêê²²²¶lÙ²wïÞüüüÈÈHÜ666–––Ú¶½bÅ @)Y\\¼téÒS§Nùý~œPÛ¶Eijjjnn¾xñ"躞‘‘±~ýúΚ5kË–- Fíºî­[·öìÙ¶m=:==4Mã9åÈ‘#qš4M³,«gÏž¹¹¹8 ÍÍÍÛ¶mÃŽuíÚuóæÍƒÆXïÞ½SSS¯_¿~äÈ˲***®^½Š¶Œ»–qãÆ=ÿüók×®2eJHHˆeYš¦©ªZ^^~îܹ‚‚‚ˆˆɹáót'.…ŽÔ*¥4--íàÁƒG-,,\¶lYNNNRRRxx8oi†išeee¹¹¹MMM©©©Ó¦MÃÅ^RRRUU¥ªê¾}ûÑM¿ÿþûh§ý Ãp'//àÖé…^À6À»qãÆ½{÷°®0lØ0„ôK555W¯^­®®ŽÇ¹Ãꪪ‹/®®®Þ³gªªÉ|ø•W^ñù|+W®0`ÀôéÓùx9ƒà¼Hp­ë0~ø¡ã8º®›¦yðàÁ§Ÿ~:66‹w8<¯×Ë(ŠÒ­[7LnnîÎ;ïß¿_WW—››‹ç2dÈøñãyUU×u´èà +/bî–eõë×/..®¡¡ÁuÝ'N”——gff¬Ê½þúëçϟdzýðÃÈØ², 0a„ôôô+VŒ;öرc§OŸ.**òx<Áµ¦à”‰GˆG0`^gÛ6híßrµûE‰ŠŠZ¸p!˜¦©iÚ¥K—^zé¥;vTVVÖÖÖ^¹reíÚµ|ð¶gŒõêÕ+##ç.%%eâĉ®ëâ½Øœ9s µìŠ•p¹ÏçÃ=ÿk8)Œ±°°°œœƘÇãiiiY°`Á¦M›|>_KKË·ß~;yòd (ÊÌ™3cccÑkáÕ±{¡¡¡ .¼|ùòš5kÖ¯_Ÿžž>jÔ(x¸ômš&‰ Ã@x¥MÓÄóàÂå{òöªƒûƒ·ß~»¢¢âرcX„¨¨¨˜={vxx8º¿ßÏ`¬W¯^ØWMÓæÌ™STTäóù°²Ý¯_¿)S¦`Ä£‚Ý:‚Â#„`ÖûÞ{ïUTT OûþûïóòòòóóCBBêëëMÓÄyŒ‰‰yë­·pGé8ŽÇãAçÆ7%›6mZ¹r%!¤°°044”/œ\<ægÏž5 í »­µÛ¶GŒí÷QaÀ‹ß¾}ûÖ­[?ÿüó;wî躎[*Ã0Ð_£ýfff.Z´ÓPì( >|äÈ‘EEEØû¹sçvïÞZ—3´ºÓ4£¢¢0—çLÓìÖ­[cc#îª!QQQ7nܶm[ss3–Ø8BÃ0FŒ±téÒAƒáù5MÃ;&c¸I^¸pá™3g233srr‚»Šö…YV8ÐCë†Ð'ÇÄÄ|÷ÝwQ=£Û;ŸdËñÒßm4婌]º AvjšfSSSUUUmm-zÛ¶ ÈŒŒìÞ½{ÿþýSSSqHÁÅêŸ~úiâĉgΜÑu=::úôéÓqqq8)ØàÚµkwïÞUÅçó 4(44Zc£ëº'OžìÒ¥ DFF&$$`$gŒ]½zµ²²²¾¾¾¥¥7111‰‰‰Äí:!¤¹¹¹ªª*999** ïÕ`ÑÔ4ÍÊÊÊ®]»&&&â÷˜V)ŠR[[{ÿþýÔÔT¯×[]]m&c¸:yµ&44Ôçó 2„©Tc€?ýÚ\üÝÉÎgÇ"ì(ÚŸDì%Ÿz|­¯¯¯¯¯wg×®]6lÀ–o¼ñ¾.Àñûì<üâªç>š»#Jip¢òŸ·¯¡õ7Z6ý=¿oÛa‘Û ¯ñ‹ò°Œ=q]ã?¿:!ÄÖ^É‹ÐôpÖøX¼I“BhM!0M€'NL:5xŽbbbæÏŸGy<¼)ýÈÝ0§‹¤¹wbŒÜ â¬Ùw†{mžÅ—}¸çá=7)~,æ'ÐTUE»áç±,ë¯È‹c<æÜ-òB<´¥Wkp\Ål5!!aåÊ•)))¸ñ† ¿,ð” Å<÷€VÒtïƒaXRÆz^‚ß´À3óEƒã}æ·0Gðx-ûßÎü‘ y(@Æ\ŠÒ¶©M \Æ\` aí.ÛRò¯îcýëŸÈ¿ºªs†öÈ _!FhÛî¶µiÀ.Ä!ÄQÚü²‡ÿg÷¯º.àá?jüÝ ´¯º×¦uÐÔÒlY–J…æ´ïV*O-8 œk^²ç  úKáßWÁ»¿æûÞ¶Ò&ÇþYõÇ:&õ[úoXûwIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ×ÿ3 ïÉH8öIEND®B`‚–ÜDdÆ*‰+rq𢲠ð c ð~AÁZ¿ÿ..\Sync Server Manual\sysync_diagram_big.jpgð€Rð ÛTª(†D»NCTœZÌ2ÿ|Ûé§ FðtÛTª(†D»NCTœZÌ2ÿÿØÿàJFIFddÿìDuckyGÿîAdobedÀÿÛ„   ÿÀçÚÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?÷ö*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¥ú–»¢hñúº¾¥k§Å¿Çwq ·]ä`2“¨Æ šh°½Oóçò_H¨½óÞ‹É~ÒA ËÀ¡HÛ¿†?˜ŸÈþ¤ð–'ÿ9{ÿ8ûaÉÅŸYnÛOÔ%®ôÙ½Ÿ{câž‘?gé!xXåßüçä}¹"ÕîèH<( ~×ï¥Mßí‰/柳õ¯ Mqÿ9õùMqo¡y†gRBo`ˆÔ;ýlú¸ñO¸|ÿbð üüòï·•õ£ó6cþga”§ÐŸüuxP­ÿ?òw6 äíLÆ àÆêØ;7§ß’‰—QøùáFùÏÿËz ùc\¯z /ú¯“^TóŸ”­nt1G-OöŸ"Ó·Ä׈ QœÛÿÎr~GÎXJu‹jR†]=O*øzR¿ãŠð²ùËÿùÇËÒù°ÛHIn4ÝI­y‹r€|Û¦Y¦þ~JjÔž}Ñ‚ÜßÃhIÛ`.Lg¾+LÓKó®/-U³Ô–•ågs À§bfÅ –*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUŽù“ϾIòt~§š¼Å§hâ• {y ß꣰fúTsDm{ùn~A4^1æùÍoÈýœzuí÷˜n£†™f꜇üYv`R=Ö¹G”OÇoÛö'…å÷¿óœÞoóïeùkùq-ìÀÑy./ä$ýšÛÙD¤ùèr¬¹ŒÎQ€óýd¹Š\þ|ÿœáó¿Å§éÑùfÒJòãkceÀmE¥œ}¹©ÏÛš8}YL½ß® }íƒîB·äGü䯚èÞrüÎ’œ­ÓSÔ.x×­aAU§ƒf¯7µ:AËŸ¾¿I%˜ÂQó„z37«¯ùÊöúfÝÚÚÒ;rMûSI9=¿Ï¦ý³ŸðcÞoõ2ð<ÙnŸÿ8wù?eO¬þ•Ôi×ëWªµÜþ­9ƒ“Úí\¹ppýd²bÉìç$l(bòœ2°¥Zâêö⦔©ÌÃð¦aÏÚ=l¿Ê|„GèeáG¹>´ü—ü¥³Cä¨8þûO·Ÿj×ýÜ­¿¿\Æ—ljåÏ,¾d}ÉàÉ´—¾A¶áõo*èðúTôý=2Ñ8S§1ŠS(–¿9ç’_éŠxGr3ü'å_ú±éÿô…üÑ•þk/óÌ­ËŸ’Ö6Mÿ9Qù“jÖÑX­µq5ôÐ.©h¥™ÙöÄåü—„Þ÷÷2h€õ—Ôá?*ÿÕOÿ¤(?æŒã?5—ùÇæ[è!¦ò‘®\Éqå&Yfi4ëV$R›“ÉvqÊrÿLW„%7?“Ÿ”÷@,¾IÑ éi–°úÔÄ‹—ǵõCü¬ÿÓpäŠóþq¿òJûûÿ(Û§Oî./-úÆ “2aí¶<²?xG…æ3¨Î ~N^‚- Ôtê­ñjmJ¬¤ß=ó3µºÈó1>ñú©‰Ã%¨ÿÎùa›ž…æÍFÅÔò‰®­àº*A$Äm÷t§ôÎÅí¦QõcÜHýlNÞ…OùÇ¿ùÈO*Êù§1‚=’ÞKýJÅTl=3Æ}Û68½³Â~¸H{¨þ¦NQ1ù£þs—ÉKYÒ/3XB¢Ó¯ §ü`0Ý1ù×6˜}¥ÑÏøèù‚?c„÷# ÿœÙüÈò¬‹æwå“ÚµB¼°Í.‡Åc¼ŽpÕì=AóͶV,¿D„½Ä³‘åŸùÎÉMo„zÄš——'4 oìÌÐò>dÓš{².d1§´y_ó3ò÷ÎG•<ϦjÒ°¯Õío!{ß⇗¨¿JâŠeX«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«D…˜ÑFä€i^SçùÉ?É ´kh·»Ô£¨:v—]Bà0ß‹}_’!ÿŒŽ¹_Š:oøï䞀ëóœ~cóãé”BŸP¼'÷S߬·r•&€›;Ÿò<Œ§6ns”`?M}ÅŠC6‰ÿ9“ù¬9y‹ÌÊZ<Ûý].NýÙê¾–œsþ¬Ì>ìçõ^Ñèñõ9ÙöÔ~MÑÂ}ÉŽÿ8[åÅ—ë¾uó5þ³xçœËh©jŒÝü¾¼óªœÒgöÇ',P{þ¦Á€uzÏ—¿ ¿'ü³Å´ÿ)ÙM2ÐúÚ‚¶ ü‡í­´€õ@Í£·uyyä?OÝMƒGG¢[Û[ÚB–ö¤ñŠ$Q"¢(ð  š©HÈÙ6Yª`Wb®Å]Š»v*ìUØ«äÏÉ_ýjÿÌÏù‡Ö?î«i¿lÿÆ^|ÜÉ¢Y}gœC{ãÿÎmR÷Sÿœ„_-OçëŸ#h0ip<ÚŒÒÛÅÂ'•j‹4KÍË*õ”Îï±ñè8Æ!–FGj¿Ð\yŸW:ezE­ß•?-üé­Ï6ó&žÖ¶[ëàËzÚ5ijñ–+›É+/¨©·Æ½@Û0²ÈfÔbåx ŸO.!^è«ÜÈlïVò¯š4Ÿ+þXhçœ|Û í¬¶pH|Ç|Ì^úêe•' !b‡áy°"¹¤Õi§—S8bÆA¿¤o_-¿C`47,‹ËÞuòŸ›4ùµ_-kº¥…µE̶²¬ž‰ Ê’(ø”Óz˜º\2œLIïH/6ÿœlóÿ›¿2|¡ªùÍw 9MRk=?„ÂVáŠMÄj ï%+í›h´´¹£ b½6}öS R$nÈ7ÿ5àü§Ò´Eô¶Ö'Õ¯ÓOŠÊ+…·‰ÜÈ¥‘ÃQ•ŽßjµÚ‡²{,ë%(ñpˆ‹º´Î|/EÍS6ThäPñ°£#A±iX˜$¿)üÑÌêþRÓÚWÝ絇êS1ñ2ÚœŸ™ÍžŸ¶uX¾œ’øï÷ÛŒ%óüáw‘¯Y®<«­jÕyF’ð½n8ƒéJ>™No4þØçŽÙ"$>Gô±¬àX<‡ÿ9uù[Y<‘çó™ø,d»[ŠF:¨¶ÕDÛ´O_ ó Ó{[¥É´®ÌXû?ST°ßLÿœÓüÆò]Äzoçåô¹×"8Wо\òŸ–|¡d4ï,i6ºU˜”v¬eÈèd`99ÿ)‰9Êj5Y3K‹$Œ›prN2„»v*ìUØ«±Wb®Å]Š»v*–j¾dòö‡u§Øë:­¥…î«(·Òí®n#Šk¹‹¤| G!œò‘ 9»Ÿ&@LbHŽæ‡/r 3ÊRìUØ«äoÉÛ»[OùÊïÌ–»ž8Hu„ŒÊêŸô«qˆ©¢“OÏkÀ˲ðP½ãþæN<>²ú»ô¶•ÿ-Öÿò:?ëœO….âäZ,EFàô9v*£ygg¨[IgoÕ¤£Œ¶óƲÆãÁ‘Á|òP™‰°hª^þVòÛèÓùté‹ Ü‚·lvñÇm b ¦´Û-¬œb|Gˆu½ÑAŽy«òƒÈ>oò§’õ=-bÑ4ê-mÃ%›EaqZlMCq™z^Öχ)Ëz¥ÎúûÐ`¦%åOùÆŸ#ù3Îz74kÝBKÍ9“н™.VáåŠX}WbŠC*Éð…¢ü#jÔœíW´y³á–)Ô»¶®_©ˆÄ·¤ùÛËŸâÿ(k¾WýYµ{›$¸§!ÍEr;€H$f£E¨ðsC%_ œ…Šx¿ä¥ÿæÇ‘?BþSùŸÈŽ4;º‹üUep²[ä–”5v¥y†¡û΃¶a¥Ôqj1åõô¿wãïkÇcjy_”?5tËï6þtë>my¬¼ÿ¨Ïs…dmæ—îYb"•URaøœÁAÍÖ¯²ç©Å¦Ž:8â±åû~-q|ÑÞ^˜?—_ó‹š~»ä¥Y×u9u^ò–{›k‘Õª Á,â¬NÛ°¯Qù}Oi˜fúa2ü‘b3ï!ù÷óËŸ2ù¿Kó&›ù‘¤éQG6˜×1þŠÔ¡ôxIz—êÄ"áæÉWvb TšÍv‡NuÇ(K —:õGú<=ök¹”djù¡?çÿ5üËæýCZ²ósê·SêÒϪhÓMnL¶´ŠB&Ž+“FÚI¡Uâ¦ã'í'eãÜ|#†£-ýDô±îÝqLžo¡´ï1yWž[m'V³¿¹‚¾¼6·PÎñÐÐóXØ‘¿Žr¹4ù .Q ðÜL²¥@ë&æ 'ÓuÝ>ßSÓäûv·¤ñãÆ@E}òÌ9§Ž\P&'Ëe"ß?ùßþpûÉZ¼‡Rò5ôþVÕú‘D¥îlýE< ì%Œ×ö–J/eΧCív|{ecäWÙñi–y1‹OÌOùÊùDz#óU±ó¿’mÍ ÔÏ%ê¤KZ•½Qõˆ¶éõ…*:–ƒ·tÚ£*—óNÇöüyâ!ïß–ó–ߔߘޅÕéò¿˜¥!›«²ÇŽ{Ct?tÛì”rz.nˆ{À €A¨=(v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUãÿšÿó’¿–”¾­Ž«~u_3 4Ðt³\+v½DpïÔ;r¦áN)ó ÷Ÿÿç&ç%eh<±y3òþf*g‚I-!’"hD—”õî *aP‡ö—¾j;G¶ôú]¦n_ÍŸÙñm†"^‰ùwÿ8£ùyäÿFÿÌH|Õ®¡d½@¶HÿäZ‚U‡üe/ãAœ/h{S¨Íb»—?Ÿê§&8@{´PÅoAk1€±ÆŠU@  €ÍI²Ú¿»v*ìUØ«±Wb®Å]а¿$~gùÏÚ¿™ô] ¸®¼«x,5º„G’‘9DUš£”Oö¸ž†›æÃ[Ù¹4ð„¤Ed+ôüØÆ`²ë‹ËKCºž8 αB%uNr9 ª¼ˆ©$€ÌÀžA’AæïÌ%ù gó~µm¥-Á"Ý&bÒËJR(Ã;QRƒ¾dé4µŒq2¤J@sBÏù£äX¼‘uù‰± ß•-´·¶ÕóäEÃf32¨FÔŠÓ'ÌÎs &$Lô?¹b­òwç?ç^•çÙ|‡ækVÑÓCÕÅåî¥n±ÛÝ[—ŠFheBÀ•hWïíÛö?cKN2ã3Œ¸ãD¸;ó‰Îé÷yÓ’ìUØ«óþëòòÇó/þróB¿¼–Æ+{Jõ&Q˜¼w±EćڄHs¼í>ÞŸfvf °ˆ‘<1£çÐÝÙºêsJÕ ûGëeÿô)ž]ÿ©Š÷þDCœüGúŒ~eÞÿ¡|Ï(aÿ8IaçíçzŸPñ=GÁp‡ñˇü¤~­8#úÿñÂÖ}—2}ŸµzÿÎ=þbé¿ñÅüƹ‹U(×–¿jî§zn:e£þúIÿy¦ûb~ø†©{31Ë ù+¯‘ç'ôz¾›ù„×ÀV‹6©y3ŸÚéw/QAñeÑöϱr}x%ócþö_¡¦^ÎêG)DüOêD'šç14 åôu«téÊ-.ZÒ§¤^”¦´ï™í?g³ÿ<~°ãO²5qþø„Ló“ž^_ßÍ¿—‰, ^SCifßÕcjsû9¬Çüî£ûY ±/KÒµÍ]·úÞ‰©ZêV¿ïû+ˆ®#ÿ‚‰˜fŸ.ã58˜Ÿ1M€Úž©åÝ\Šxu.ÓPŠæ?Bán­â›Ô‹~ ÍM@` ­ökS†dF<` ±ú»ü·Lr‚ô>~aykòãËÃÌÞešDÒÚhm£kxÌÎòMR¼Bö⥫^ƒ5zMNOz½ÙÊ@Egwo¨ÙÁ}jÞ¥¥ÜI4/B9G*†SC¾à÷ÌYÄÄy„¼óþq£òÓÏÞµìV_áýz@Oé1V5wñšßhŸ´@V?Í›ÞÏöS§¡|qî—è<ÿG“\±ò fÿœ›ÿœeSI¹>pü½·ûVÌ%½µŠñ„Ÿ^Öƒ¼méƒÔ¶w]íŸSBø%ÜAä~ÿ'xH} ùMÿ9qùcù—õm3QŸü-橸§èÝE×êóJ{[ÝÑQªv áöS›æ’ýŠŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Vù•ù»äÊ}0j>sÕRÖI6šlT–úê›~æ<ˆ®ÅÍwaŠÓä-wóËóçþr.ö/þRiÒù[ÉÜŒWZ¢Êb”¡ÿ–‹ð> ý+qϵXf»_Ú¸4¢òK~î§àÛ d³Ë/ùÅ?#y5¢Õ|ÓO5yO>WIKœïð[’y‘üÒ–ñ §8Òö§>{Ž?ÝÇËêùþ§*8@æ÷ÄD8Ô*( ª¢€° æ ¶ÖñWb®Å]Š»v*ìUتԒ9 Ü1CÅøx°¡§C¾$R¼3Ìÿó•Ÿ—z*Κ¶¡æ+»9fŽþKY ©Uyfk•B«É¸©ã¹´Ú½&›Ù}DëŒÆò³w}ÔÔs#¬ÎOùÖÔiÞ{°òz/äÍåêØ Né¿Ü”®•X§+G Ê6V+Nu9‡Ù¬'‹ Éûð.‡ÓåÓ~~ NSζMÿÄ:ýÿçÿš-µræ*y§Ëï7—ä³e·’ÚI­¢¬A$j§šñœ«5zÛe—Ç<ñ€ãÇ?Uï{Ø›õñÊ—:çæâßXùª[_"ùFh¦Ô|ׯ갛RöÞOQb´g©^k±U'Z¿ è3jµô”qÞLƒhB&¢?ÇŬO=™'çÖ§¢þ}GæûíZ×Kò¶½¦[Gåß3_é_¦l­áFαEÅÇ3 sÈ –Z칉Ù1Œô>‰”á#Å.wëðû“?ª×ù/òµ|ïù;çý+ÈúÍæ®úŽ¡mwa%æ–º.Ÿuue+HæÍG^¡ B#*T(è5§àjðË,DxbA©qÈüíº|o~iŒ.&•<Ùoùçù§ùi§~\ËwÒŸËëbn5 ©ã€^=¢‹HÖÒ9–$CF.äHʰ#K-“S,þ7ìÕï½_ܧŠB©õÖ†/F‹¦J?GQ¶âòÊÅ'ô—Ô^HYM¢¡ˆ÷Î7¸yY§ #²µv*øÃòûÿZó#ý][þêVÙ¾ö×þ1tÿÖ‡û‰»Og?ÆeýS÷Åô.xëÛ»v*ìUØ«±T·Sòö­¯ gK´Ôö»¶Š~Ôÿv)̽6¿>îòJÕ‘sNLŸÕ}á‚ë•zÀvý õ Þ¿¾±žX8×Â>F?øLèôžÝvžò¼cº@·êû]v^ÃÓOøkÝø¦}ÿ8´–7_ò_šîôÛ¸êa7 Wµ'¶h™~„9Óé¿à"8u#!ý_ìeÅ÷ºÌÞÌGø&G¿öSp7üå‡å埫ŠtèúÅ,©¨ÕGM®Â\}Ù¶ÅÛÝ…¬úÃ/1Ãþæãóuy»Uâ_·tóIÿœÅÖô;„Ó¿3¼“=Èþòk/RÞM¶%mozÿÈìÍ>ËáÏ=6a1ð?ì£útå8œH/eò—üä7圌pØyŠ÷§ú¨ Œ•=4Ô²;f“Wؼ˜;ã¿Ý¿Ø‘¦:AwG"¤öÓ¡WFã’7 ƒPA4à|Ù±Mò¯òãËš¿éíË}†® º‚Ý£/³zc¢T|m™¹»SQ–œŒ{­ˆ€5·ü©ó7å—•2uï,ÜIæŸÌO6<²ÚܤqÚMÎMJ‰%#”m,’ìßk¶måÚ˜õYpà ðñcçחíóaÀ@5Íãzò5—‘¿%<•ùr4x%üÏó¶¡ ÄÍ$(o vuýØzR¦H`ãZ}¿|è4:Ùj5™sq øÆçä×(Ô@ê^—«­ë?œXü–òýÚ]y/ÈÚM´^mÑ]AxÖÐÄ8ȳ¤ƒ•D(¬%fz³PqBIê¦*ydx(ÕY=ß~ÌïÕ]ÌŠOùÈsäï0?—7¼³uå$žY¿Ejñ}a=²¹³4ˆ`¥yðçCÔ/Aˆ=Ÿñññé¦2wŽDìø§Ä£»Ûí® ¼·†îÙÄ–Ó¢K ƒ£#€ÊE|AÎvQ1$aµS¼oó;þq¯ò÷óM¿ø̯R5M>5T•Ï{‹}’Ov\ÿ6oû7Ú=FšÕ[›«‰(bEYÝÜ€ ¤œUòæ—üæ-þ¯©Ÿ"ÿÎ?éÒkZíþmÚU ZglÃ㯭0?•‡Å•fÏ Q2™¥”clgÉŸóŠz™.§óo玵sªùƒPVw°Šé¤twZqtjY’»GÀ(>&]³‡í/kÍðéÆßÎ? ~¿“• éOä˜5OÉÏÍ-cò;ͲŸÑ÷÷´{†$FnÙA…Ò»¹‹É¯Rr]»‚:Ý,uxùê÷uÿJ~ÅÆxMØÁ¹Å]Š»v*ìUØ«ó§æW‘¿/ †9kPibâ¿W…„“O(H W¨îÁh37GÙÙõ$ŒQ2¯—Ìì‰HoÿœüËón}ä¯5ù%5DòÕš[ëjO¨%ã«Û[ÜÇð7:FÜ£ ýŽtþÎön)Ç.<¼ªŸ—¦VKÏ,]Ïlîn #‚<Å}:Ñ—ï¾:>Ɇ9 <¼,†ý]2 î=kšÊw¾áè¾iÿœ”¸ògåÇ–õ½[BüÛæM/ìœ@ÃJlUUdºµ “7¦„°Z ŽA³S¥ötgÔN1˜à„¨ÿ:¿[3–ƒ?—óFп+ôŸÌŸ8Æ,íõ­L–ºlƒP =Îâ4‘8© µOÃB*O]`ì™äÔË-Ⱦ~ƒ.:YÝ­ÆŸ®ép]ÂëKÔ I£'Ã, eä’Œ§pÃ5’Œ±Èƒ±‰ûC>ož¿2ÿçtRèùŸò²ïü-æˆ_׎Ö7’+'™O д»×¡J¯J*õγ²ý«ÉŠ£›×ÿâ¯ïóižy!/ÿç+¼õùc«Gä?ùÈ*ä¬TH|‘v±•åXþ ˜ÿâØ.µæÙßéuxóÇ„ƒ‰(û'ËþbмפÛkÞ[Ô Õ4{µåoyk ’6ÅGB̧pv9’Á3Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯4üÝüóò'äÖ™õŸ2ÝúúÌè_OЭJ½íÏP‰ $u2=Zr;b!HŸÿó—:Šßk³Ÿ*þUÅ';{XËg ÛzHxµÔ¢›Êä"šñãöN‡µ»pýSþhý=ß{v“UfÇ—Vz•³Ë _;~wþRùËÊþw¼úÞ‘q2ÛùSÌRÙ­±ŸÑc"J°ªFLHñÆA¥~&Jü;kûJXt¼y1 zãw_÷ç÷³…ÈY‡å§å7žì¼»såÍýgNó?”Ê;NÐá…¤H£ùG!¸xà“’¨ »(¤0¦ø£Ú¸%dÓFPÙ—¿ÊÈüre¢Ë|—ù%ùcù}¨6¯å};mT†T¼šY_b"k‡~mU¡#bNak;gS©IØîØ}Ì£ŒLÿ5lŠ»v*ìUØ«±Wb®Å]о0ü¾ÿÖŸüÈÿWVÿº•¶o½µÿŒ]?õ¡þânÓÙÏñ™Týñ} ž:öîÅ]Š»v*ìUl’G m,α³»ªª7$“°(ÄÈÐÜ šæ–iþhòÖ­pmt½fÆúékÊ k¸&Pj±±=eçìÝFñdÇ8ŽóÚa©Ç3Q'È„×0›ÝŠ»v*ìU ©é:^µhö½”öR}»{˜’hÏûW/Ój²`—9HuØ×“f*@æñ6Î1ùKSs}å;¹¼½¨©çjZâטܬÂD5î¯AÙs¿ì¯ø#ê°úucþ–_¨ü¾.‡Uìæ)ïŒð˜Ilü÷ÿ9ù#Æ=v/ñ” ØÍ3=â¤b•+t \EA°õ”¨ì3®Óê{#µ¿»—…ÿ ôŸ—Ó/óM¼î§³µ¨Xïþ>/lü»ÿœ ü´óߥe{uþ×\ Ùjn©¿qÖÑ··> {.`v‡³Z>àqǾ?¤sûÜHåì—6Öº…¤Ö—Q¥Å•ÔoÑ8 ±H¥YXt!¡ÍdbAØðo2Î+ù{PƒNÒ¼¿®êzg•aÔ÷PòÔ×—:|—D·¤'#•$!ÎùÒéý§Ée8FSá¡*_ÿvÍGaÿ˜ÐXùþrcÊþNóô gä.ÞòÍÞÓR¸’4nUYB™©íN14å\ÏìùKfäË„ÞIQ½â?³‹o %Þ]¿Ó¯5oüŸäÆ·Ñ¿"¼ƒ äÞiŽeIôûÛ‡Ë1˜Ý RU Õ"bŒê1Ê:Q“-ËQ˜Ž’¥W—?3ºƒ½Aë^Xÿœˆü¢óVºžZÑõÕ]BWY ›y­a¹sEU…æEZ±4Uj;sE©öW†r†Ýhƒ^öÁ’%êy¦fǼåäo*ùÿI}ÍšlZ‘©Œ¸+,.nVŽî§~‡lÊÑëréçÅŽTÑ(ƒÍòî¥äÎ/ùÆZ8~Sê3kžHf2êZ\Èf¤Kÿ-–É@à/ü|Cņõà:ú/d{MQPÉèŸØ}ߨý®.L4úoòGþrWÈÿœ¶ñéñ8Ñ|ê‰Êç@¹“ˆ%žÒRL  uî´Üõ9iÅÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUòŸçüåÌûùòr%ó窾¥ }jÖÖføx[¢róE=yn¹ 䌔ÈFØWåüã-7æç•Ëëžf½¬¶q/Ö9¥òJ‘!Kð(Ûâà{cÚ£+†Ÿaüî¿ï?s—{é袊’Qc†5 hªªŠP6ƒ8’I6[×b®ÅVÉsFñJ‚H¤]VV ƒ±b nñ…³Mÿ8Áùôö²–òÓÍ”âÌO¥´²|-]Ç+I‰ïéþÐÏA«¡¿ò¸þÿøðû}Î7Ñ/'Ú Êêd` °5„óç%¼UØ«å:jÏù%ÿ9/'æ'˜mä“Éžo²[GÔ6”ÛÈ*K#Û£•]ý6økÓ;m/ÏvoƒëÆn»ùý÷óh‘ᕳo6ÎOyr-CEп,-‡ž<ê\$oeng·D…ÔÓ÷Ïù_„…PÅ©šý/³Y e<çÂŒG=ÙŽŒŽQÓt£[ÿœpótžp×õ'ù¼yoÊr!üͦÀŽóVBÍÐâ`2cãž?¤ý×ø¡¿_.'GÛÆqÃÇbbzŸÛIGœ7uã¦ùFò!Šo8ù¦ ;Éв¤1K]H4äüªß²³;²}•Áâj²êìaÀeë ô÷ Û©hÕö¬øqG×0ãñÑ‹þe]y‹ó'ó;KüŸR0éÖ1Âu›˜‡î'âêyŒ`ÐñZ,q’@nù¹öwŸ³;6}¢ar‘<ó‹†1¿3¼Pâv„²ju1Óql>¯3VOê —Vÿœ\ò©³·>XÕ/t½fÝãe¾šA8`¬91Dàn¥wÍF—þ Z®3ãÂ3Ò}»íß`¹Y}›ÅC‚F2y½§L¶“IҬ쯯Þökh£†Kû’‹$î /7ãAÉŽpœƒ6YJ$ðŽCÈ;üqàˆÝu(ìÆmv*ìUØ«±Wb®Å^cçÈ!ùÌIr¶Ÿ¡µ‡«}OUŒ3òÃö§© cüÙ×ö7¶ÚíG‹Ä‡óg¿Èów“¨Öv. Û× »Çêy½¬ŸŸ¿ó”}ëüQäXNö®²\ÁcÆúÖûTÖ&1Ú¯Lô='löWlí?Üæ=û_º\¥ñ©w–ÕöN}>ãÕñúGO¹îß–_ó“Ÿ—¿˜>†}7øsÌ’¿P¿‘DÈ{Asð£o°WàDzœÂí/fõkqï¤hp#”²\YÚÝðúÌ)#DKBì8Ù”¡dnªx±Rh#29džùÿò2ÃEü–ó_“+ìäK½Jxµ7¶yšY®LÇ)dsÈ€‘Ò5bw÷$çG í¹OY.s´GºÁßõµK¤€ð6y§Ë>~ò/•?)¼‹ä‹»/Ì› ­"¸SfÉe$ éÜ9™ªy¹ í"­Äô gK¥ÒäÓçɨ˔D¼ï–ܶò÷¢A»×µùÉKÏ/yþo+Ùh÷>hò¿–l½?6êÚe»Ü\¥ä+Ig‰¬hãƒú¥Ey|Bƒ–‹³£&ÈcœÏ HЮƒ¾ý͇-{’¼ëåïÌ/[yŸË&çL¹ä¿˜åŠT4x¥Cº²ž½»‚A9Íf&›!ÇQ ±"Ùb¥óÇæÿüã—æißÍß—/—<ë ýdE0ZÝέÌ81ÐÁ5w&Äý¡SÈu}í<ðT2Ü¡ßÔ~±øòiž+ä§ùCÿ9c®y[W–Ÿó¶òéÚ½«-¼>cš0¬; ½TYHû71Ô»w|ôm>¢ 'Ä ‰(Óìˆ'‚ê®­eI­¦E’£`é"8䬬µj˘*b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅP:γ¤ù{KºÖõËØtý&Ê3-ÝíÌ‹Q ڬͷ]‡‰Û|9ù•ùñùÿ9®Ü~XþI[Ïcå姬žvòÝÛ“Åžy)X-ÛzGöä¹0µÝ¡‹K<†‡Ú}Í/[üžüˆò§å-žŸ›&N7ºäÈ€zÇn¦¾”~4<›ö‰Ø/í~Üˬ•L:Gõ÷—6Ä^«šVnÅ]Š»v*òßÏßÊèÿ4|…u§ÚƧ̚g+íR>/Yゾ(ááË‹³›žÂí3¤Î úe´¿_Á†HXaÿóŠšy·Êry'\‘‡™ü¬«Yj%›OSéÄÄëýÓø|5Üæµ™àåñaôdÿuûyüØáŠ}œ»k±T¯¢èþ`°“K×l-õ-6jz¶—p¤ñ1‚R@EGcÛ,ÅšxåÅb{ÆÊE¥ž\ò’¼ òIåÃIšPD³ZZÅ®§~&@9·Ù­2íF»6oï&eï(“!ÌT»v*Ðt,ÈZrPwéQ+ϼ©ù©cù‹'šlülòOåÆ[T¾ÔWѲº½oRˆ†2òp_Oâr üBŠsiªìÉi¼3”ý{Ðæß"wtòtÿœ˜×4|ßåŸÍ=?,ùëN´»¸Ð 'ÕnÜDÂÕ¤g©.*²(â´¡máör<šyqã‘]ã¿û9†¿®ù³ßùÆí3]·ü²²×¼Ñw¨ëÞd‘õYî/ç’âQ”KeV’Ä¢@?Ë9¬ö‹$¤ÃŒ=; ߯۷Á–!¶éü凗¼ÙæË™Dk?Ð:X—S×c¹}h‹bž‰µ(¨ )“•>þ9>Ëj1cÔzïŠ^˜×-ùßÙHÌ {ʾCóæwüã÷­qç+½K[Õ!Šû@"¶BÊk%{sdï”’7*Q™€¡ø¨HÌ­V»—_CŒbj]n÷âò?Øc̓èvÔ9¿0(¼¯¯C"yƒÉ÷òù•&Vîtþ¤’räßVÇó³”Í–}t:}FHN@8}Òþß“."§ó‘ÿ,?ç#ÿ0n¼õ¢¶¥§]D—V·+f—¿U{¸á¸wá'@æCqÐü= ÈÇ}Wga¥ÂFÜêêÇèº[FÕÿ+.uOÌO'þoÊO/ySÎ7¿”ínU¡Œµ­Ô·qÑV¼cǪî@¯ ‡iö„tÙ´üGŽxÇ®¼À>gûSØ>i?—?)|Ѩþ„òŸ™¿-u‹ûëI£‹UÔ5O0ˬcÓkèªP(C% V¨ã‘¨í\QâÉ<@#az¯Îÿb*}º«ÅBÔš*MI§‰Ï:r[Å_~_ëOþd««ÝJÛ7ÞÚÿÆ.ŸúÐÿq7iìçøÌ¿ª~ø¾…Ï{wb®Å]Ф>vòâù»ÊZÇ–Ë*>£m$PÈõ(“S”NÔ©¢¸Ri›>ÆíÉê±çþd>î£ån6³Oãb”;ÃÌ&?%u?"ê·ž`óeŽö°‘-ž’mä’hà·ãG`eD ‘DQM–¿ÍµþØc×âŽ81…ñNÀžœ‰÷žó]Σ²;"X$g‚ysüÑÒ<Çùqù¥oùâØ>¥¡Îª5xb÷<`ò‰8ƒÅYu“ µÛ–ÓÙ­VŸ´»0önYðdA=}\B»È;ÿ7—–/ibɦÔLGzü«ð{ÙFÿ9%äÿ1ù‡KÐ,tÝF6ÔŸÑk‰¢Ž‘LßaxBò3z¶Üzô­4úïøêôØ2fœàx7 Nã®ä ÷us0{A‹&HÀ z˜×æ'™|±ù‹æÙ¼½’õO5¿•x®f°º6Ș$£Š)f ÉDø”’ 6Í·`vv§³t£1ÔãÁãÑQâóë} êâkõõ9L9dðï‘¥È2ÜØjþtÓÞ[Ø|•¢B×QÙêŒ^ãO1;ŒöR\0û=:å¾ÜötrbÓLœùO ÃéÖþ{‘^ö=‡¨1–A¿EÔ¹…þRÿœŽóV¡§Þ^jO¸Õá‚tn´˜fXaªH¸‘„‹Ïuâ>w;d{Sþúly#j#Œ‘ÊdY?ÑçÞº^ßË(’q™oü?§›Ùï1¼¦j‹¡êzõ•ž±ð¬–’Ü h€<$o²§~ŒFp}ŸÖåÅâãÅ)C¼~c©ø;ùö†ˆS]ÖÁõ¯Ì¿17çf•ù{å¿«Ë¥¬Q¶¶&Œ¹Z£\ÈQÕ”©ñã¹›ps¢Ñû;§“YžÄìðQóá?­wä9ºìÝ£“ó‘à ¯âûþç°g ï]Š»v*ìUå¾ü†òWž=[Øaý ¯>ÿ¤,Б¼f‚¡ÜŽ,›;.ÂößY¡¨“âcþlºV\ÇÚ<6»±0çÜzeÞ?HxÏ‘??0)5{Ï-Ïv¾rò–“3[Ï<ޱGú|ín™K"ÖC†Oå×=wQØú}~(eáðgXå{‹¢:Ÿvýï0qÈÆø„O7Ø¿–ßœ>GüÓ²õ¼·}ÇRC]è÷4ŠòR¤:ÿ—e÷®ÙÃödgÒJ¦6é!Èþ<Û#1&a«XK¨é·öv—Ri×—–ò[ǨۅõíÙÑ•$N`‚P·%¯|ÀÅF@‘ĺ<‹"6ù£Éú§ä?äôÞOò5¥Ö¿ç9Þ>û]†Õ¶úÙôT¹½2Q„P«?Ûfz×:Ý6®=¡«2‘b#}Ûü{ϦƒÐêöoÊËØ,|ƒ¦yT:Í}kNá>Ì·“žR•ÿ%vE=ÕFh;[^uYå“§!î‹m„hRa{ù‘äm3ÍQù'RÖà²ó<ɰXÜóƒÕY‰ˆå‘DLÌE«“]©•C³³Ï‹“ñø´ñ ¦S˜I`Ÿ™ÿ”žPüÖÒ?GùŠÛ…ü*Gêð·v¬•ÚB~ÔmðŸf¡.Íí\ºIÜÝGCøïc8 >xòŸææ§üâ6½•<ë ¾bü«»•…Œ±V5-ÉžÉÜÒ7ý§¶sÄÅ+Ìúfv¶-d.XõŽ÷&2sy?Î^Yóömæo)j1jz5ÐýÜñÑÀ£‘ŒŽµø‘À#6)î*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»c^|ó÷•¿-¼·sæ¯7ß-Ž•mð¯íK<ÄÁÝäjl£æh «á½SVüÑÿœÇóAŽ?SË”:UÇÀ´&0V´gÜ ‹¢§ <"µjú^×í¬z8ï¼Ï(þ“Üñâ·Ô~Fò–?.´|½åk1kgiZ=Ì´¡–y( 9û‡EPg–ëuÙu33ÈlýƒÈ9‘ˆ™.b%Ø«±Wb®Å]Š»|wùߢê_‘ß›šOçO•¡? õ‹‚5‹DшÓg¨}2rû¾ãÜÂq1Ü"¿ç|ëå=Eºü»Õ¥“JóÝÅô·³[j èµá™c³š³U>›Qy-ErÕhòÎc4}XÀ­º{ÿZáåÕùý¦X~f~s~_~T˜ÇIõjê%Q:Z8.bJ|9§Jºûd{ $´º<Úpˆé~ïØS\€Fþ\[~pþOyÅ-ïô»Ï8þ[Lk¤kpËO…3ÈÁ-(ð3 }¨ê6jûFZMnHcËüQþwã¿æ±â‰®¡u}.Ï\Ò¯´]E=M?R·šÎî:Óœ7˜¤Zû«åqe8æ%q6> Ä[È<‡ù9'ä•¶±æ ;_Ö¼Ïka§ß7Êž‹K£0/0g‘â ­­Ièk›íwkþ|Æ„`I?³sÜ/«\aÂÇÿ&ü­æ-óƒÍ_œ~`ò¬þR±¿µKM+M½_NáåD&Ъ0b!«A¼›r¡9•Úú¬xô˜ôÐÈ2l‘Ë­·ìcL‰¦e?ånº??m¿5l®­@m,Øj6¬ò‹É&ôÝU”*)æ@v;xëãÚpüÓx¸¬w}þþŒ¸=VõœÒ6;v*ìUñ‡å÷þ´ÿæGúº·ýÔ­³}í¯übéÿ­÷vžÎŒËú§ï‹è\ñ×·v*ìUØ«±Wb®ÅPvÚF•e;ÜÙØ[ÛÜÉ_RhaŽ7jø²€NddÕeœxe2@èI-qÅ›óÍSòSKŸÌמjòþ»ªùnÿSf}R=2àGÃ9äç§ Y¾&øˆ¯@3¨Ó{c–:héóbÇš0ú8Ř÷|†ß}º¼ä„¥.ty°áù9æÏ'~Xù³Ëþ_š=oÌžb¸ˆIpŒ-™¬PJ}v¡sYú?\ßktºÞÒÓæÌ,Xbvú½ËééÑÁþIˇM’õJgÝ·ÇãófÞSòö£ùyù4ÖVPÓÌvšUåûÆ3FH^p†• UøÇþÇ9îÔ×ãí×â‘ýÔ²F?æ#~V7ø» . iô”¨DŸóªÿcÅ(<£ùQæo'k:ÏŸob“]k‰Úêk‹×·šÚ ĨŽLÌY‹Õ? :×Ð=«í^ÔÒêñâÒDŒt(Ø‘åGm«a[W7AÙZ].\R–Sê¾ú¤÷þqg˯su¯yÖížržž“§ÜMñ9U $¿h’(‚; ŒÖÿÁ/^#ZXÐç9òoû\f´öe”ïü#ñò}/žHõ®Å]Š»v*òŸÏ¯ÌOð7”ÏO—‡˜u°ö¶%OÇ TýôþÜAâ§ù˜Ç;Ob;óú¾)ÝâõKÌÿ ~<Ït½·¯ð1Pú¥°ý%gägå¤OòQ}bÕY×ÑgÔá™p”úV̬)²±.ûLGl—¶žÑKY¬ýÔ-¢GY|ùyv7g 8}CÕ>~îæ=çùÇx¾º<Ïù]xÞ_ó »úñY¤¯A½`•([­ëÛá¸ì/ø Ê#ÁÖn/âÿ8ßïpûCÙèËÕ‡Ò{º|;¿“/Ë¿ùÊ-kËZ’ù+óÊÆ[+è8ĺ臋èê(ÅOi¡?Êwlêu~ÏâÔãñôR‰éqè|ìyyqc— Åú§OÔ,5k(5-.æ+Í>åD–÷Vò,±H‡£+¡ –qÙ1Ê1¢-Œ~j7œò÷Ìä Ç͂ںpŒ/Û_WÒ ZÉésôÇóR›æoeŒ?˜‡ô^ÿŽëæÆw[>.ó>¯æ _˺7‘â×®|éæ3ˆ!»Ð¼Á¤Ï±¢êI"–’Úöo‹eh÷r¡yæ§ é±c†Ie0¡ ©BC†qóˆùûÜbMW7Ðw?óþWü»ó'—ÿ,<Átuôë,üÏæQ%b¶¿†SÉ@%É*ÆZn¤¹ä-ÀË©Ç<ð6I„{Åþ)»ÄÓÜ´­WL×4ëm_G»ŠûL»A-µÝ»‰"‘ueÛ®ÇÀç7—±ÈÆBˆèÚ ¡üÅåÍÍš=΃æ+õ &íxÏm0¨> ¤P«º²AÜžŸQ<3¢E¾JÕ¼·ù™ÿ8•æy<ëù}<š×åµÜŠ5; ù4b2HX¯U>ɤW*űñoMìOh!«ôäîè}ß©ÄÉŠ½Ï³?)¿7¼¡ùÅåµ×ü¯qIâàš¦•1êÆvá*ŽªhxH¿ p@égءث±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]аÍOÍ(þPùfO1ùªç>QéÚtTk«ë€µB¿ñ'? ÷=*¨‹4/,þaÎZù´yûóWÒ¿.¬¢Ótè "4`ÔÃfÔëܶäì½(œßn{A à†ùÊ>ÿÔäbÅ~çך6‹¤ùwKµÑt;8¬4«4[ZÀ¡Q{w$îIÜÎùæ³O,Œ¦lž®`ŽÊÕØ«±Wb®$S°N*ñ̿ϟðíÝ®…ùo¤¯ž¼É4sÝ]Á¦Íõ˜¬­­˜$7ÕDË‘ãÇjwìAÙ݇âƒ<ò𣰵“Ýt×,•Ëv]ùQù¡¢~lyV/1i*m®coCSÓ]ÃÉip%K9)’=!Ø@ÀíNÌž/·xe ñsšæLoÏþKÓ?0|£ªyKU[ꕎjh'_Š)–½ÑÀ>ý;æ^ƒY-6Xä1öŽ¡Š|çÿ8»çMSÊcÖ?!üæLŒ÷£; c«Ü@„õW_ßÄFÄr=Æu~Óhã›ux¹8¿AýàÓŠTxKë â[ÝŠ¸ ³(Ü“°b¬GTüÄÐ!òŸ™|ÓåÛ«o0§–mîç½·²»‰‡©iâi˜SÄxÎÅÙùXc˜0ã"¬wš¶&[[Ïu›o&~v~HGç¿âhVn@ >2$J…ý´âΣµN“W”é² Ãé==@ýŸ"Õ ˆ°ǫ̈üÅÿ9äß'ÙyCF½±Ñ.õ}æ5DúÕb·A…2Ó×Võ‘ æ>ø³CÙÇfæÈrHÔxw»û¹u®m’¹OKüÀüü¿üɸÓïµë) Ôtâ‚í>Am;ƒhdp§’ ¸þÒþË šéôµŸJ±.‡qïg,`²]'ÈþUÑu6×,´ØÛ_’­¥ÖnKÝj1,*­up^R8¢òø¾*TÔæ&]nYÇ€ËÓwÂ6ÈlÈD2 ÅK±Wb®Å]Š»v*ìUØ«ã/ËÏýiïÌ¿õ5oû©ÚçAí§übàþ´?ÜMÙ{=þ2ª~ðú–§ ƒ£\[»cÐ’ üI_³"íãCP4¥Ù9´’©ºHr?ŽçL¼Çä-+U½ºó.“gŸ…ÆŸ§ù—ÐÏl'^!ø’•¥¶à¡ Õ§×J•Ë‚c|ÔÇæùÇÍ>^Ñÿ!?-¦òd6‹æ¯Í¿ÌQ-”÷&¸2zçƒ …Ǧ§âyO3° ë4º‰ö†¤e'ÃÇ~î_û†Í$pŠêQ¾QüÓòÿüã×—,+®,¯¼Ñæû1%ÿ˜¡ÒÂÉo§ËqI^äLjT?Ƶ$‚i•êû3'id:€F8£ÅÎU×â‘1LûÍ?ó“^PÓ<¥ kÞX·—^Ö|Ë,qézNî‚q ÂU^eX0hÒ¹½8ÕjF¯KìÞYåœ2ܺr±_frŠÙ쪑êºj¦£eÆ+غÓî–9(²§Ç ª £R¥XTûŒÐY„½'‘ؼ6>MüÅü¦ó‡ä?™?åo~HÍ$Z]¹-©èÊo«Äæ²+Gþíµ;rSñGöÛ’ú`ûF3V,ƧÒ]ÿ·ïqrâ­ÃêoÈÏÏ+~vh?YÓȱóE’!Öt9²@ÇoV"¼…›ì¸éÑ€={‡«â‡b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мóó‡ó‡Êß“>V“Ì`“Ö¾›”zF‘q}px­kÅ É!QâÅT©ñÿ’¼ƒçoùɯ5¯æÇæä­”‘øéZDAâŽâØ‘²–&;pßnJòÖ†µaÊvÿ´#Oxñï“¿ù¿µÈÅŠ÷èúöÖÖÚÆÚ+(RÞÎÝ+{x”$qÆƒŠ¢*Р<ÒR2$“d¹j¸Ø«±Wb¨ g\Ñ|»`ú¦¿¨[ištd»¼š8" zr*{ùfÉ.#Ü7Rió÷üäüѨ~\þžü­Ö¬µ?%KëØy¢m8Çs2Gs¤+*3pOŠŽ Zž$çSìö‹uˆ˜äØÂöåø÷4å‘­¹0‹_(Êý[Éÿœ¿‘P]ù‹ÉšÔQiºÖ•¹»e¸uWJ(¨,é¸;G2 ü'ˆØËWù¸dÓjÈ„ã¼eÈmøøÄ±áª!ïÞPüÑ<çýsÏÚÕÍŒ^a…Ç—"YÇ37©$Œ*ž[ àK€Jµ1«íyæÁ 3ð«¯ãïÙ¶0£oIÍC7b¯–ÿç+¿/ïì&Òÿ:ü£Êß]Ð¥·]VHWãáƒmtiÔÆÔëZ©_Ù\ìý–ׯBZ\›Æw_¤|yÿkFhõtü®óþŸù™ä7Í–4InÓÔ-—þ=ï"Mõ4 ºWª{ç7Úz isKéËÌtm„¬[0ÌN C¸=F*ù‡óGòSÌžK¼Õ|ïù+ú®±kqgæ'Ä£º‚éYíb^¤s,#¡û™ØöglãÎ#‹UÎ$O¸ŽóúzõïhœÜ3oËïËmzóþqâÃò×ÍO.‡ªÝ[Ý[_”ô¥šyµ &81J¼/SÆ»Š‚3]¯íG´|~°#ßÂÞÎ1ôÑzg“|©¦yËo•4v‘´Ý./F•¥`X»3•U–bMÍ>³U,ùe’\äÎ"…'™Ž—b®Å]Š»IµÏ7ùSË*[ÌZ冔åKÛ¸mØe‘5íLÈä˗艗¸ƒ i­ÿÎRþKhÅ‘5×ÔçZÖ->Òâ^‘Õ#5ö|ÛáögY?àá÷‘ý¬X° [þssÊ–]Ë•ûtO­ÍofÓoîÍÁÜûLÙâö3)úòD{¬þ¦8è)¿ç-45jŸ,~]€¦¼ ‰}A½*`H+ÛüúX}Ñbþ÷PÆ1ûÉr!‡<þœr?P’~wÎRju6žZ³±¤±1Ð ©þ—pß?ìÊΟ±qóÍÿr¨öN¶\±Ÿ»ïC·ç0.¨EÜ6A{t3ο5“§Ñ:¾ÁS/ùYûˆû=¯?Á_þµ/Ò_󖲓+ù•ßâd®ž´'zQ â>°*öÛ€ü¥úÛ³:ß/˜bV@üøÓ<Ǩy¶Æþ|Ū‰F¡|&·-0šEšJ«FTUÑNÊ:eÚ¾ßì}FáÉ(F¨Qé°ëæÙƒÙí~)qB÷„ô'üå©å±Ŷ#ýƽ)ÿ¢§ÝšžfçÏò³ôIÌükG”ÿKúBåóüå5 °Cz«QȦ”yס¤,‡oÀ{;Ù©ò&?Ÿ¦Ñáv¼yÆÿÒ~µëù³ÿ9 ¦m}äøoP1K ™Ójƒm1þÎ@û+ØY~Aùñÿ}ÒÄêûJðßù§ôEÿœžó.–iæO#É3‰¦µ§OÙšÿ‰dü ôù¹Ôƒðû¤h2ãþó1÷„ÿMÿœªò-É ©iº•‹ž¬±Ãíp¨¿sS9íW±½§‡žêÔ¿Ü’]†.ØÓO”À÷í÷³‹-BÃR„\i×PÝÛž’ÛÈ’¡ÿd„Œçs`ž#Ã8˜žâ)ØBq°l"2¦nÅ]Š»v*ìUØ«±Wb®Å_?ÿÎGyÖîD°ü®òç)µ­má7ÑÄ~?IÜ,ûw•÷oòGƒg§Àÿ±à õù¶† xo¼T¿Ío˜yžßÖX!õKŸèªþ\ù&ÓÈR±òõ¿¸}]BáÝ÷rd}÷¥~ÿ$ âý í‰ö†ªY¥ÈíÝÈ~“çnç³ôcOˆ@sëïey¥s]Š»[$qËÅ*‡ŠE(èÀ2²°¡ˆ#%A¢@"‹çÿ>þFjZ¦¾{ü¸“J×mÎt«wôÁ?´mXš Ž°·ÂÃaO²}SÙßnã’?—×ú¢vã?ïÿâ¾}ï'Ú}^¼?éWêz?ä¯ü䵇œ'Éߘºžbo«¬’)‚ÞöTŠÿœ~ÿœÐ?;4-ééþvÓã_Ó:7-ˆÙ~³mÈÕ¡cô¡ø[öY»—‡²â‡b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬ócóWË?”R¸óW™$.kèéÚtD ﮈ%a޽:UÜì«¿€*€ø×ÈGóOüäÏfüßü×äžSÄzN’¡ÒˆâbVÞwèkê?Y»×‘§´=¿ùqác>³Ìÿ7ö¹8±^åõüAkvÖѬ6ÐªÇ 1¨DDAÅUUhPži)lór×àWb®Å]мƒÍÿó‘ÞCò7šu*ùŽûk½*Ò+¨¥Ä­ô²‘H- “FR¨‡âø‡÷ºOg³ê1G$"F¹òó?‹ä×, yWç«åÝ[ó·É‡óHÜCùQu¤‹Í2”¸··úܪ䛨¬ŠÁ½5‘z¨áÊŠNnû#Hh²~^¼a*5D×—Núø°™Bù*~Jé^TÔ?;<óeùs]þP\é"ÛT…ħËu1}$|Lïørýž|~8;g.Xè±ûf±üêø|>Ϋ8r}ùsùkåßÊí}ËMrÖ72Þ8»¦!ä   ÑT*…]–¦•jó—íÑÉ«˜œêÀ­ƒlb0ÌNÅ]Š¡µ>ËWÓî´½J¹Óïb’ÞêÞAT’)T£©ö Ó'$¡!(š#p¤>=ü³Ôo?ç;µË-~vÿyŽHÿG^LH@e$Y\× ©­¼Æ€r¯Î󴱎ÒÑ ð¸sî‡ûáû\xž Sì¼à‡b®Å]Š»v*¥uukco%ÝìñÛZÄ9K<αƋâÌÄ>xc#@YWy¿þr‡ò‡ÊlðG«6½|•ßFŒ\­GOß±H¯òÈs}¤ökW›~ý-¾Îc\²Ä<ƒPÿœ²üÉódkùk䵊2Jýnáf¿uÿ(úb(£?ë–¸>Îèô¢õ9€òÚ?¬Ÿƒf Y³Ç/ƒºÒç$üøKù§ÍÒérÿyi ×Õ×ý“œ6§ùmóß1çídivÅÄ=õúg¿È;¬Ëjò}d@{÷û?[Z_üãfzÚö³y¨NÇ“ú –ÊÌMO"þ«ø!šýOü3±cŒGËþ%Üàö;úæeîÛõ³M3òsòßKâbТ¸‘z½ÛÉsËæ²³'ܹ¡Ô{U¯ËÏ)Õ¨ýÛ»|>ÏèñòƾÏß³,°Ñt},Ó4ûk%€[A ”øf—6¯._®r—¼“÷»xÐ<Çåû¯3i²Iú&ÌÍëÉ$LŽ>®‚G!w&Šs;[ØùôÙã‚`qÊ«~óAÅÒö–,øŽX“Â.þ±¸¿=¿,¤n-«¬~¦ÒëþrWÉ1Ü2éñu c¾åOPGt~ƒ–gµÜãàÈûá÷\yi{SOË÷ƒý7ê’o¤ÿÎQËa8°óç•î4û¥ –KNJñ­µ×ÿŒ‡5ú¯øŒ‘ãÒgÒÿŠÿ¹ahŒlf'ñÐþ·«ùcókò÷Í¥#Ò5ÈãÐ +¢mn ÙT›#þ¥sŠí/eµú=òb«S8ÌåÈ<+òË:‡›üɪþqy z·7LšXaðú­ðK"û1§îcú—=#ÛžÑÇ£ÓãìÜ» >r>©|;Þs°ôòÍ’ZœœÉÛñåÈ>Ï'z´–ÿ;^Òõë-j7ñÛkš4–0JxúÜX'c·"Oµ©í› —¨Ë‚Yá(@Ôˆéû;ÏN®<õXã1jRäf½Èv*ìUث˿5¿%´OÌHQ´á¦ù²5Ž¢¢‰?@—!waMƒ‰}Çç²þÙfìâ1Îç‡ù½cçÕÈù:NÔìhj}3ûýÿ­ ü©ÿœóåþ²Ÿ–_ÂH–±Xy‚r]âBx§Ö$ßÕ…©ðÎ7_Ú¨Ý}]Øøu¸¿3¢"@ÿýǾ?ƒÆLO¸2 !õŒ°éÚŧ4pßé—h­ÅÕ'‚hÚŽ¦†ªÀìFq ÊÚÁÍ.ówšt¯$ùoQóN´df™šqm,¸UUUîÌ@© I|·I¥–|‘ÇrD |›uæ_ο0Gwÿ9%寗|µ¡Å(òï—µn Ë9HRžœF?PÊxÑÜQÂñBÓ·Ž›GŽ´Tg)}R±ýö6‹‘õ>Žü¥üÓÑ4<«§êö÷°ëòÂÏ©èÝG-Å£Ç+@Ìñõ¯(˲Ã9>ÕìÉé2˜xoiVǯö·Bvök>QüêüžÖ¿.uøÿ;ÿ&Ùôûí2_®êº]ªž1ïY'Š5ØÂ¢âðñ$ýšß{9í`Ìwþ~ƒú —PúWòóÛ@üîòѼ¶U±óNœ±¦»£ÔŸIÚ¡f„Ú ñ=Tü-ØžåÄ!ëX¡Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Æ0<ûåÏËO*ßy¿Í7?WÒì–Tr–âfÚ8!_Úw;Ó¹¢‚qWÃ~Vòÿ›¿ç,0eüÈüÀY,¿/4Ù}-7KFoEѩۓJƒJÜÎXì)·kÚÝXðC|‡ýŸêr1b¿sìK[[khl¬¡K{;tX­íâP‘Ç*ˆ«@€ òéHÈ’M’æ*àWb®Å]аÍoÌûoËM*ÂH¬Xó·tšvƒ£Dâ6ºº€99Š‚Ê ¡ÜÞ£gÙ}šuR;ðÆ"å.àÆs§ˆy»È~[ü溗RO4Ágùó …¬±y~×TŽâÎÂêË”o F’›·Æcðp^Ÿk:=&»&„pødéìúŒhzŸÚ75‰{Ù/åüÿ™ÿšsÛywó“ÈKåm&ÖH¯ïõkb—7Z€¢Å=²8Ø•›DîHað¦aëã¦Ò=6cÇ#°‰ØG¸þß—TÆåÌ=ãDÐtO-ié¥yN·Ó4ØÉdµ´…!Œ1êÜPI¦äîsšÍžyeÅ2d{Ëp˜eJìUØ«±Wb¯ÿœžü«?˜>HmgI‡Ÿš|¶$»³àµ’âÚ•žÜSrh9 þe ûG:?f»SòÙ¸d}Øù…«,,#¿ç¿5?åeù(u)½O4è>–­Í’eãû‹“ß÷ŠcüêÙ_´]—ù\÷èžãô‡ÜœS°ö<Ð6;v*Áüõù¿ùyùs4kPÃ|SL‚·¯µGîc«(=™ø¯¾lt=“¨Ôÿw]ü‡ÍŒ¦7ÎÚÿüåž¼ás.•ùEåg‰~ÏéÈþ·p¡º9¡¯ûñä\é£ìæ—K=^P<®‡ë?ƒ\æ±DÈþ>LNoʯÌÿÌ;”Ô4¼×3¯"âÈJnZ2z„xÛÅÿ<Á‰›Û ”pé1_™ôø£ñ§£Òû%š{æˆîŸÕ÷³/~Lþ_yx+¦–ºÒÒ·‰$‘ßÓ`"ä™Ëk½¬×j9Ï€wCÓöý_kÓi=žÒaþ#ß-þÎ_c0Ô5=ËÖ[Ô®`Ӵ訂IYaIû*µ ¯€¤Á§Ë¨Ÿ œvåÚåÍ nDF#àƒòç›ü¹æØîeòíú_%œ‚+‚ŠèQ˜rHªH=˜lh|2ýeê4†#4xx…Ž_¡§I¯Ã¨ã—syOæg熳å/3^ykFÓ­¬„[»“$œŒÐ¤ß !@( ÉÎÇÙïcñjôñÍ’rõ^º9ïÜó]³í.M>cŠšÜù‹òïdŸ›¾`Õ­ÿ."ó'–/d²/%Ážk•âH;èvÍW²úRל9â%´…çGû °ííVHèÆ\R1úMŽãý¡åú” ó‹g­ùÓóCÑŽþœéóÝs•CõJM8ÜR”ç]Ÿ´å§Í,Zm˜šâÛìéyÌZ›gŸU\BèŸ×/ÐúKJx$ÒìžÖqulÖð´7#¤Ñ˜ÁYúÃ|òÍHÉ!!ÂlØîß—Áïða6(oßæñÏùÉx ycF¹Þ‘ߘÎÛ~òmÏÁÇü§þwÃî#õ¼§¶QýÌô¿C$“ò{ò÷^òô –776ÑÉå»:˼`†û\Z•èÀŒÕÇÚ­v æò#±äwû>Àû?¤Íˆz8IÇ7Ÿ~Pkïä=ybòS,M¥Ä–§—%A4¤ˆ§ùkeÄçKíN’Y¥ÏG$…ü kã¿ÜèûQ#¦ÏŠFįˆ•ýÈÏÊ‹‰äoœh¯n5uÜiѸ&¾ç(ö–ùcOçáÿÓB{gù37—û€À¼—ç/!è^TŸMó/•XÔ¦–vŠõ­í÷VE ¸Þ-?g¥vε»+[ŸR'‡?‡¦åóáä~.“³»CK‡Ž\\r$ïCå|Þ¯ÿ8ï ëš?—µ+VÞ[[kùã’Ê”£ˆUåÛ€ÕPzxS8ßnõ¸sg„q‘#xˆ÷ò¿/ÒôÞÉirãÅ#0@‘Úþ÷¨ù[ƒËzþ»sK „/;Ä„~=ܳ‘ÐhΧ41DÑ™§¤ÖjF RÈwóhç"üˆñÚ4ðßE-À&tXŵ¨õ1ZËà ±ñÛ:™û­Tb@å¿ÕîÛá½<ü}­Òб-ü¹{÷û­éöšÆ—}¥Å­ZÝÆúTщ£»,?LþÑ-J{צrYt¹!ã”O5]mè±ê!8 ‚8H»kO×4]\¸Òµ+[⛸µ¸Šb´‰ {ˆ(üÆnv*ƒÔ´/X·6ºµ”ÖÇýÕsJ»÷Áß/Óêra—9Ÿ#MY°C ©ÄHy‹y§˜¿ç|«‡—Kh·F¤w2ÁÈ÷h¥'odeίCíÆ³Ù+ óØüÇéçµ~Êé²o òÜ|è¦/—¿>?,¨ÞVÕ›^ÑbéeË×P‹_‡ê×eù@Õͬõ‹ÚŸßã𦋗û(óÿ<:iöWhi?»—‰ïøéÿzÊ|³ÿ9A§zÿ£<ÿ£M¢_ÆxKqn$JÝýH Sä9œÒvü ²pñé2 ±è ðôŸö)Áí‡4Lã§1ö½¿Bóƒæk1åýF FÓ`Ò[ȯÀžÎê}˜žy­ìüúYðfówÁè0ê!”\!3Ì6çb®Å_1þpë‡æ§æ.™ùMå¹èû ëª\'Ä‚áGï¤qÒ–ñÔR»¹+Ö™ëþÉé1öOgÏ´3TÇ Gø@þ¹ÿcG½ä{[,µzˆéáÈýý~_{èÝF°òö‘e¢iqz:}„)ºm^()V"•cÕs¾yN³W=NYeÈnS6sÔáÅp Ìf×̾nó‡/üäPÕ<Åx–Ú“l‘ÝÜ“ÎXâõQcQ»?¯p¿ Šž9ëÝ• Ì;ÃÃrjeöFû‡ :÷¼Ž«<¿Šf£Œ~>ÒͼŸùÑ«ù«SÔµ™4%Ó?,,crÞ`½˜ÂèÑV¤ìË!m—Ò재jsÝ­ì†-&8bxõR?ÝÄ_?º¿.}ÎÃIÚóË#.CøãpJ¯?ç+<•ù‚×JÔn¬¸›À°ÆXö’7pH=¹>Ã3qÀÇY(\²B2îÜüÍ}ÖÓ?i°‰P‰#½ë^PóŸ—|ó¥.±å˱sm^!%†JT¤¨wSøÄŒâ;W²5 ¾hðžÄw‚îôº¼yãÅa?Íc’ìUˆþ`~]y{óH:nµ ¨ƒ F ={Y *Tžªiñ!Øû¾ìh³ön^cÒb¼³–KEÔ¡å‹Æh. ™iÞ¡•¡8©Âx§Fã(Ÿˆ+Íã_šß”7>uó>“æ}r+É.Y½Ýæ‡6¾œ–«¿"ƒ¦cýº‚ˆ ¨¹fÿ²ûX`Å!Ž7žf„¹óý7ó;–©ÂÎüžqùe¥Ûþe~x[~`þ]hQùWòÛÊѵ‰»¶„Z~”uÐ)œ:óªÆ£‘äTfß´².ˆáÍ?.MèïÃøûùlÂåc“é*þcy7Ηڞ—åíR;WFš[}NÁ•⸅âÄÇ„K/!NiU÷ÎGUÙù°F2œhHX=Äe$(w¨Ì4¾FüÞü´ó'ä§›¢üñüž­­•¼¾®³¤À„Ãn¬A—”hG+YiûÔÿuÖ‚œ=Ù¾ßñ@Ôú¿„÷ù{þÿdÑH‚þ.0ë:S7)ln¸Ô¡4‘ºÇ%(ÃÁƒÙ¸¤=;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T·­é^[Ò/uírî;#O…î/.æn)h*Iý@ ÉØoоÔu4Îd~ho_Jü¤òÜ„B›+¬NÔ¯B¦êà-OU|iñé{o¶#£Ç|ç/¤~“äß‹¾½Ñ´}3Ëú]¦‹£ZÇe¥ØÆ°ÚÚ¼Q{âz’w's¾y6lÒÉ#)%Í‘¹Z»v*ìUŒjÞyòÍ—˜í¼ˆÚͽŸœµKi¦ÓmeS!E™AQRjÊ…”¸V¦fbÑd–3›„˜Dïøý=d.Ÿ1K0ó'˜òCþrbi—S†ñ¯<¥æëvKo\\;¡FÓ—¤|“á#Ó4eZv xXÿ5¡ª§u_mŽ¿6Žf¤Ë?,"/ôïÌÛo6Ï Aå/,ùTÝÛh–±\«íaÜÉ ÝÝHÌÅAGåÇá¦À-+˜=¥Û‘–˜ã9'’Œ¶¡[Pǽ¾˜ÎA¹ØªÅޤÝ]ÊZÀ­$ÓÊÁ#U™™¨rNÄÈÐܪO¢ùÏÊžb·±ºÑ5›Kص?_ô¥2ò¸ú«˜Æ„†n|T}9~m\D‰ÄŽ¿+ä SÌÇK±Wb®Å_ùÊÖçþq£óÖÓÎz\L¿—Þhi>·k%)]MÜzr‰ÊÏÚ‹Ó–zŽCµ4'¿¼ÇËô#óq¥è•ô}“kum}k휫=¥Ìi5¼ÑÉ$r(de#¨ Ôg(˜’Ä9/8üÊüøü¼ü±G·Ö/þ»®€xhº®«ÛÕÜ$C÷cGÙ6ÝØzVñç_·àÂY|ß«þs~z~s»Ùù&ÐùWË YZîÞFÊÖ”{æPäŽâÝTøçE=/föX¼òñ'üÞì✽fêuÝÇnó°ùþ¥O+ÿÎ>ywOqæ«™5ÝI©$d´VÜÉäIós^ìÔ=×9îÒöçQ—Ó€ QùËõ€ø½~‡Ù<8÷ÊxÏÈ~³øÙë6:}Ž™l–Zm´V–qŠG¬q¯ÉPœ^lóË#)ÈÈž¤ÙzŒX£Ž<1àÂÿ244ÿ˨­R{o¯ï–Fµ‰cŠ‘P7©!©°è§7ÝìäûDȉÆ5}NýÃöºžØí¨h€¸™rîÛÏö%ú·š5/8~OÜù§ËW/§j¢Õ®$ú»|q½«ÿ¤Æ 9 ª·±ès'MÙØô}«€œ8«~¼_Iû¯âÑŸ[=Ogœ¸ ªöòú‡ÞÇ´ëé1!oṑ®u}>ÞXæw%äiôò.#%𤳯¤õ$æÏ>ÙݵP™wTý'à ¸roeÈå~qÜ|Å<¿Èµ÷‘"Ó|ýcÎ}[™t1ZƒÐí20ñ°1ŸæB+ñg]ÛzhkŒô’Úb"xÏØ~Ñ¿‘£ÎvVyiuÞÁ1öýܼǚmªÙ[ùßUüÐÖì\CkoÕœëN,HŽXwÞ(ZŸŽai³KEEŠ{÷ƒþúAÊÏŒj§ªœw>~€YΑsþ,ÿœv¼·sÎ}:Êxdht×Ä?äZ&sú¬”íØž“?éö?i.çO?ÌvIc?Òn>Êy¯’-ÿ%ãÐb½óµÅÔšï©(–Â?¬p(­ð`E¥E:É×:®×Ÿkæ:aއ«ÓñæCÏöl;8bÎOûoúé{%­†‡ù­å[|£«jZ…¢JúxŠ&tyR(# YX•Ueâ^§®pÙ3æì­LΣ2äÈ8·édïË©îz¸bÅÚ"0ÎXáÃö?½)üÓò%íåvŸå½ oõÉìu¸SÀÜÝ0”NÎXDµ OlÌös¶¡>Ñžl¼„¡_ÍŽÜ5Ìù8Ý·Ù’†Š8±ñLÆWÞ‹»Þ”[yóËRÑ­<·¢ù`é1Çm §×ç‰á™Q#órʪh*h„ŽÛævMccË,Ù3x„ÈË„ïøA'çN,5}§iòõöŸ%¾·%ñ´µõ#-"Íg KFV+ñeÜæË¶{[M›µ0fŒÁ„lïµNG¹ÂìÎÎÏA—£S—|@Bé–Z¾¥ù-7—5;&µó ­ÍÅþŸ œyú¨v]‰þñy ߸9n£ÚXû\f„¸±ÈÈù~ÃE«cdŸgRL!øóäο)/üÇqå8tß4é÷V:¦—ÆÙdº‰£úÄ~éÁn¤žUïœ÷´ø4ñÔ™àœeïé7G¯ë±Ýv\ÇŽX˜Ê;n9ŽŸ© ùë}õ/Ë]Q£ÞIkl‡ç:ÈÃC—{‡´ š$~Â>òÕí6^¼è}¯.‹óȶÿ”å ¬]uãhÐýM­ÈSu ª]ú?hH kÛ¦uòì-d»Só_»â»¿áá_gsÍǵ´ÑìÿÇ×UU×ù×ö£mµ§òwåW—ü£¬h¿¦55=Á¶Ó'‘ Xà–e1òañfud¡­jÊ2i³´²ê1äðã‚®@]7ølAçîn† é´8ðÎg-ÔNÛ^ß}„—P±Õ4?ù:¼±•u‰o èÂæ;¨$òŒ3qrV$ü[øfv Øõ-A9ŽxŸª<&$yí}îq2âžV1 R2L®ÅŽ?K4óožüûÿ+hùgÉ4»KKxÒ}2OH[Ë'¤gg’I*¨¡¸º“N5®h{3±´_Éž>§ÓÄMK{øhÏ‘æ;vúþÓÕ~ÂÁ½§jå{Ÿ“!—ó3UòO—í¦ü̲ æ;Û™â²ÓôµG/a>6&V^­Ù¼6­s[g±ks‘¢—îãe)÷›Ûé¿ÁÝΗlÏKˆT}r&„{¶ódJüÊò÷ž$¸´ÓÄöšµ ås§^GéΊRÂ…”Ššu¨îk;_Ùüú%:”%ÊQ6îÎíŒZ¢DlHs‰æÌsFí]Ф¾aò—–üÕoõ}M†õ@!$u¤©_ä•hëôÏÐöž£K+Å3»â9W Ã¨’"_Ï›ÈuoÈkË׿§?,uÙì¯cÝ-f”Å%:•KˆèíÁÖž-®›Û,:˜xZìBQ=@±þ”ýàûƒÊj½–ž3Ǧ™¸þ¿×óFè?óžmò}Úh?›:$¦E¢JÖ)ÙA¡s¤Rò¢e<Ä×{¥ÖDåìü£ú¤Ø÷_Õt¯àáãí¬Úypj`o¿ñ±ø=óË>oòלl¿HyoR‡P·õmIb' ’&£¡öeæ}£ÙZø3ÀÀùò>ãÈü‹OªÇ˜\$ üßóü_—¾N¹Ô¢uý5w[]"#½no!ËÕϽ|Úû)ØG´uqú#ꟻ»üî_oGµuÃOˆËøŽÃßûwüãŸåüš'5”-¯ùˆz‘< ™#²fæµ'zÌxÞ#Žo¿àÛ£Qœi±ÿw‡m¹rÿcôüÜÀÐøpñeõOîý¼þOnÏ|óõN Uî}\\Gßéâ뽤‘Œ!í~꯽ì¾Xò7–|«åø¼»¦ØBÖ˜K––$v»jO9#ã,wßnÃjgÚ]µ©Õç9§3Å{Q>Ÿ(÷S¾Óh±âÇÁ+ï÷±#þPAä/9k>cÑõRº.¬®£@[nCY‰I}F¨CÈ'À(™¸í¯jåÚLxrcõãÿ)ŹڎÕ×kÜî=e >iN2ôËøkö½/9nìUتCç'è~yÐçÐ5ø=[I~(äZ,°J ,LAâË_‘‚Fm;#¶3è3 ¸£¤‡qü{œMfŽˆpÌ~ǃùKÎ~qÿœaójùgÌ.¯ùc¨ÈÏm*B+7Å=¸$ð‘kûè+Fê:«g´cž›·´þ.Nhó}Ǽ6_´<¯I“K>rè{ßhéz¦æ]ßTÒî"Ôt]F/R ã£Å4N(Aé ¤mÐç—ñLÆC†Qb ¾xüóü½“O»ò|¶qj“] sNò¹ϧÈÜå[уÉC]¸±P»ïÔö&¿ˆd¾žuÂgÊ_ÑüsÛ¹§$yw0_ÊÝgZó?æ-§ŸïµE!~^ÅmçËØZÊçU²’"¶ð]Õ«"òZw¥ |ek²í<0ŧ8DyšˆÆ7=HîŽL lß@ú³È¾{ò÷æ.€žeòIJK¦<³[†š…ÃÂÜ[á~Çbññ¨V»C“M“ƒ'7"22à‚ê -®cY­¦VŽhdPèèã‹++TA¡1c" Ži|uç//y£þqSóßó?òö6¹ò§!ƒRÒÙ¤‰#{9ˆŠ9[KBTŠþß§û=ÛƒU ŸÞGýï÷÷üÜL¸ëÜû›Èžyòïæ?•¬<ßå{Ÿ¬iZ‚r¨%‚A´Ì ž2!Ù…~U9Ó¸Ìv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«‰MêqWÁž?˜úïüä—æ·äÇå¤Õò^9“UÕ­ËÀÀKu#)Á i×÷Žk½R˜=¡¯†—É>œ‡yîl„,¾‘ò7’t/Ëß,Ùy[ËÐúvkñHÔ2Ï3y4¬«¹Üý€žA­ÖÏSä™ÜýžN|cB™b¥Ø«±Wb¯/üýüÉÔ+ü‚ÚÎ>¹¨]Ã¥i²MÄÅ ó¤’z®€…Hš•Û•+µssØ]^~} qpéö°É* óò³OÕüåÈ?2<Ýigù¹o$‹¤y¹Ü[}bîK—¸Ž×á ÌŠQ8HG%Tì»?´å ó81“„ýPçBªÿù†ÛÕü…ù/ç{Ì‘ù¯óúêËÌ3鱨è:p *#G2Íõ™Li3UiF _‘åÐwl`ÇÃу#r? ¡ÏötL`I¹>…ÎYµØ«±WžyÓó[òÛGÔ.<‡­yŠÂÏÌ—ð< g} ·±µÌDF/ «’I’Ÿpsk£ì½Dâ3FÄcc·ózüa)ŽO—¼»åWÿœ`üÍÐõ¿Ì‹}S@Ôí¤KmnÅ'–=*ñÇïDHô,P&©ÈÆÜ“pË–£Uü«¦”0Dý&½CÏñÏŸ{@w×¾AóÞùåØüÏ¡Gq›,×Eõ¸L.â sPj °c¸ pšý ôÙ<9ÕÐåæäÆV-“æ]Š»`¿›ß—6šFÔ<³?¿+õ&å¿Ý±bb{+T£ÿ’Ç6]“ÚIœd¹sÆÅ>)ò׿'ç…î•ä–ƒyú*])îmî$åõkèaŽB²A%Ã1eX˜@=6Ü gwÚ:} ÖeBUæ éCÏÏdè´¹u3±ógþNü…òÞˆËæVý=«“Í„À‹Es¹¤d’çÄÈH?Ê3†íomuî8u/«çÓáó{ÎÎö[VOÞKý˯Çäõ˜ãŽÖ(‘c‰TDUTl`3Œ”‰6y½8 J®ñ:Fæ)HI Qˆ j=ñ‰‚E¬#gÉVžuüÊÐüé¨êW÷ÓjwúJº®Ÿ,„C%¢J#›„J*ƒÅª‹·Ú¥ÏhËÙŸŸIB"Ë\q*±góæ|¹ÓæûGY‹Q)JFGÔ:Uï·ê÷³ÌoËÞyÕ-5K9ºf§y5¥ôMÇœHóZ$±H»ñ`$oÀ¨sEØLúzÈHT¡(ùí:#ËoÐí{cS‹W=4ân2‘ËxØ?4_äÔ¾\ó'™?+µŸ‹Œ’Íj®> cÓ–ƒÂH¸8ö)ö¿Ôéðë±÷|¯qþ–V}›™Á›.’}û~Ÿ˜¢·òr¾Sóÿš¿.ow·”¼–‹&áÄñÛÆHd ÕÉ{Uþ¢Á¬1Ïãú¤+âgÿÁõYtÒåÓáúâW~Wùþ¼ñä0i· 勯1Û^K$nÖò¼k$.Â…ˆ*êE~ÈÈûEÛ#MªÃ1âÇrßÔ¢>câžÅìÉŸHŸ\¸óaø2_ÊʽCÉPyŠÛ^šÞê\Eo€±oB/YX¿5æ$¯LÕ{Mí$5²ÂqŽÎýç‡î§aØ]‡=(È2DöÛ»¾Ù/’¿.4¯%è7Þ_†ê{û=E®ÅÁ@¤É‰ø*( eµ'5]¯ÛÙu¹£”ÄDÕy~nó»"\RÆ —;÷S¬?*?.tÚ}_˶OùiV»ÿ¨–“þÓkòsÍ/‡§ýÍ..ÂÒC–1ñßï¶Ugac§EèiöÑZAZúPF±%zWŠ3O—4òœŒ™·g`* äˆÊ™»v*ìUØ«±Wþqy;_ó¿–ít Cv·S¬ò4|Õ"‘© Àîýé?²½«ƒC¨–L·F<"…õ©Ñ{AÙùuXD1ÖÆ÷÷Q”¼¼!°7šU•Õí„Á ÜÖÑK*ˆP"ñ‘×¥6ÍDûS=ˆrŒdI H¿•»è1Tx¡b²íæ¡æÿ#ywÏqZkÖìæÝ™í®"sЖ7ØÐTFÃÃ,ì¾ØÏ¡™–#Ϙ;‚ô;3ª d¹¡Œéÿ’þ^Ó<Ï¥ùšÖöòIôÐk Ô¿Xõ˜+…vwÜXtÛnNm³ûYŸ.žx%>±\º|>×]‹ÙÜXóC(”®=ûß5¾Hü½Öt/=ù›ÍúäÖó¶ª\X˜ؤsLdd`ê´*5®ØíÌYôXtøU÷][+Ù½““«.l„>Uæoõ1OÎOËWúݦ‰æHoô9ìciô4E–+ñb‚8Ï&@@«Xt¦çsì–ŸQ ²á0Ê$jx‰£[ïg‘òäC¬ö‹6äÊ%qÉÒýÝßh)•ÿ3|ÇkùeæO2ÝÃÚ½¬ÖövZÇ ª÷2Ja§!@v…hAa¾ÀæOhû=§—háÃD$ ¥ ú@ßÓÝÄ{¼ÈhÑvÎhè²å •s½·ïáa+æZÇFý9wæŸ0XùÝŠÝÛ[^,§O½‚GDU, úd8.¡;JßžÎÅ“/…¥ƒé&5Ç;þ;lo«§ÜÇâ¹#—˜ød<¾ï³èüʱÒ/tŸ;yŠ'C¨{kuÞi¾×¦®@¥8«}‘žl=ŸžmvM6ô™n{‡Ø=ïp{b8ôÏ}@l;ÏwÞŸh^sòǘý$Ò5Kyîå….>¤%ArˆëË㊼î)¶ku“¨ÓYÉ5Å^ŸŸ'7MÚ8s×$]^ÿ%Þjóv…äÍ0êºõÇ£`‘F£”²¹ý˜Ó©#©ð;7²ók2xx…Ÿ°{ÊuÚüZhqä4>ÓîW»°Ð¼Û¤Dº…¤Z†•yM\DwY’°+PõØŒ¯|ÚL§‚F‰­w»ŸÜÏ&,ZŒcˆ F[î=¯þFêº÷ø‹ò³UšÃPŠ­‹Ìcz«Åwù%Ø÷líô^ØbÔCÁ×ã‰þ*¿œL~O'­ö^XåâidAþmýÇõüØ«æWÍ^~Ð-¿:¤’ÇMÒJCyÕž:ÇÈÈÎÑ'ûø…WxÇÙÝFÃ:=7fbÒhržÌRɼ}@ïË™þnä×›ÍçÏ<šˆÇUqç·ãŸxèû[KÔ4ÝV ýâ­6eÞ{wW‰”l8•Ûn”íŸ>êpdÅ3 €ÆC˜<Þ÷HÎ ÄØòEå ŽÅ]аÿ̯Ëí7ó#ËRhW²}ZåO§ß*ókyÔŽJA*Ë]Ǹ7¾ÎöîNÌÔ ±C”£Þ?_qýhhc©ÇÀv=qyß-ÿ;ü™¬Ûi¾t’ßËÍ: ÖçUõíЂ£““¸eR KÐûgSÛ™;[†SÒƒLȨT÷&[ްÞún³Cfˆåß}»¾h]gó·Gó̶Ú?’<Í7”uˆ®‰‚ÿU³êWà+(ˆ·)$5eAò®]¤ö;6€K&«Ô@ÇxÂGŠ}/üÒXeíˆg"8§á›ç!±òëö³ŸÊ?ÌKï<Øj–:å´vÞeòõÏÔµAnko+U•dŽ¤Ò¥SÒ£cAÎûUØÐNÄL±f/˜å±ùÀv—¯–xÈHT h÷"-?6ü¯ù‚ÿ—–>µÎ£?;ØSÔ¶Y⤄²Ô‚ª>&û ü5®U—ÙmN=ÖJ£~“´¨ò—Ç»oÉœ{S³ø#sßÒû™îsNÉØªKæ¿*hžtÑ.4 ~ÜOc8ª° ’«ÒÏK“†\º÷Ø—¾aòôÞS¹ó3HšŸ–Ê[ÉÞ3x—ž‘gãæj8Óçœ|4ùQéÖûQabŸù—Ì7^v‹Ëz¾±£Kå_ùÆ»fÛLµÓm¡õc~RIq0†¥Íóuû$…Ÿ“DÓiÆ8Æ^&¨ÄÈ“÷ üwíN17îf¾Y»ò]üä_–¬¿!efÐ.¬Ý|×ohÓ¾œÑª9,}S¹QÀòû!øñ®ÔÃ4»>gWõèºâü~†B¸½/®mo¬¯LâÊæ+ƒm+[Üú2,ž”èh߉lO!ƒÿ9,ôýv-6é¡ÒEÊÇêÙÛž0<«*²Ôoé´œ¨FrÝ©¬Åãøšc(q ëmÏ:ý>mЉª/U··‚Öí­bH-¡UŽbPˆˆ¢Šª«@Í,¤I³Íš¦v*ìUØ«ãÿùÊ?#_y'Íš_çg•#ôÄ“E¶ˆQr«Â9Øž0b“¦àw|íýŸÔCW§ž/"=>ï׸ýˆÇšX2Ç,9ƒøù³o.kÖ>gÑ,µÝ9«k{‘Vµ(ÝÕSòÏ3×è§¥Í,Sçø?Öôš¨çÇ‘å šf’ìUóïæÕ±ò?æF‡ù\ôëò Õ#ãÉdྌÊÀíûÈ€êNz_³?=Ùùt„ú¡¼|ºÇå/½áûz•ÖCP¦[Kî?8¥þbü¡Ö4¯:hú¯’­ÛPòÅÕä:„0£NЬ‰#,@àT| ZÓáê9:j1eÒdÇ©<czËb>}ããîÇÕöLz˜OâÆd%ý^_gwÉëŸåŽ£ùcçè拾»³HÄ–Ð"ÿ¤I$ îÕØÆ}6wÎ3Oí ñèe¤1'sÐáïÜy½>nÆŒõQÔqGA×ð6déåÍ 5™<ºt§%[P1«OEOLsR¿÷lÔ~cˆaã<øonwËÞìF“ÉâpŽ>þ½Éžb9Å]Š u kGÒW–«¨[X¯^W3Çûäa™4™rÿw KÜ ûšrê1ãúä#ï 1kïÍÿË}>¾·˜ ŽÖË-Í~Fqøæã²Ý¡“–"=õ¼‡[—·ôpç|,ýÌzïþròöÞ¾×®éÓѶ¿ò9ãÍž/auÒçÃ|¿P.Ok4‘åÄ}Ãõ”Ïÿ91å•?èÚ5ü‚§y íØü.ù›øj:äˆùŸÐY{e‡¤%ö~´ÎNiá.LW±7h ãÓ9xÿäÿÕ‡ú_ÚÔ}³‡ú™ùþÅ¿ô3¶]ü·/ý&¯ýRÂàw/õaþ—þ<¿èÎêgý7ìT‹þroK$úÞ^¸AØ¥Ôn\„¿ày“¦Qþ”þ´ÇÛ8uÆ~i…¿ü䯔ŸZÒõ(‰¾š[ÈúeM³ð?Õ¦p?é‡ûÒßltçœd>_­:³üÿü·¹§­ysg_÷ý¤­Où$̾ÄëãÊ1—ºCôÓ—Ú¹’=àþ‹dzæoåþ§Akæ+ ÍÑg˜[±Þ”~¹ªÏìö»Õ†_Å÷[Ÿ‹¶t¹9dÄ×ßLžÞêÚî!5¤É<'¤‘:ºŸ¥I©ÉŽP5 Aóv0˜°l*ä;Q¹µµ½…­ï ŽâݾÔS"ȇæ¬ÉãÉ(‰ ù1œ#!RÝkË:6» \ùnîÙSJ¹Ó1B«§CÉZ0V†Ýs/IÚpg¢}`õÞýþ÷Q¢Ç—ÄG¤÷<çIü¯ó¾›qc¤]y–ÛVò5“ÿÇ2þÍei ©ˆ«Ø)¢þòŠw¶u¯h´yc,‘Ã,yä>¨Ê·ïý~ûÝÅÔÀÆ(ž(ÿ £{w~ üÁÓeó§æO—ÿ-,­ÞÏËš4 $Áchã„Vs¥8¬j‘!è‘›>ÃÔ gåÖȉdÈvë¿KøÜ“ƒÚ¸N«YKP€û<¾›4Ö,ÿ-?(Q¼ÓŸ¦¨ð=¥¬.æ[ª•n(®ÍCP9IØëÓ4:\½¡ÚçÀ32ñyGŸ:û¶ÔcÑöoïDjU@gñÞ“ùGÉš¯šuSù“ùž¡$@dÒtYÇ, _ˆ<¨û ·úÍ¿LîÔílZ\_“ÐÿŸ1ÎG¸ú=ÃgAÙÓÔOóZ¯óbyDyþ<ËÑt:ùK^½};GÖm/o`†eg`½JÚ¹Zç/ªìVqäÇ(ǼÅ|]öÑÁš\0˜‘÷§Ù®sR/3ù?˾p²6:ý’\ Ò˜|3Â|c‘~!òè{ƒ›Îí\ú9ñb•yt>ðáë{?¦<9#x÷ŠÜùSó+òNö]sÈ—²j¾Y¯©wdêdþZ-Ԋлb¡øŒîãÚ=ŸÛpµQËÒ\¿ÒËýì¶÷¼V§²µ]žLðž8u¬~‘ö=›òÓó·Êÿ˜h–$+Ì”øôÉÜTRmäØH=¨xS|óÿh½ŽÔöq2þóó‡OëŸw›²ìîØÇ¨Ûé—wêïznrÝØ«±T6£akªé÷z]òz¶W°ËmsØybÉ5(G¼nd€œLO")ó7¼‡ùƒä*'4;[_4ùSX»d²šK×ÚtÓ8ãY„BÄí)SM÷]†zçcöÞƒ]ªüÞYKlqõ?DÀò«5üßw7’Öh³àÅàÀ ÂGm·ã¿îCjòþUè0þQùŽ¥ù®º¶½kG6òJ¼}i¸e^çì-_bß Ø0ÖÎ{GWèÓbþî2êñ+ùš!¼'3¤€Óáß$¾¢:yÆÜÞ¹ùKùw ~XØ-ÍݼþtÔU[Q—Õ_Põe†b‚øÒ¬w=€áý©íüý©>(ÆC>‘[{äyYû9w“»ì½4±¢GçúƒÓówÅ]Ф>pò~…ç}_·õ­%ø¢•h&‚PYbbZüB$f×±ûc7gçqúŽ’ÅÄÖèᨄ¿±â?•ÿ˜>aÿœwó‰ü·üÀ•§òôœôý@1Zú­µÌ5©ôÉ?¿ˆ}–« šóöŒøðvÖ˜jtÿÞc¯õOŸqê>Ï>Ï‚zl†üy¾¿¿Ò|³«yuôÍBÒÎëʲۯ+i&²6Ê¡ö¨”Ž”g ¹!“Š$‰ßÆÔOüåù­åæo!Î=iÖºýݶŸ®yÞŠF­s'¦‹Å —ïXô cµÞ²òL ÚÉ Ž?w—èù÷8ò˜åC§ézßüã'Ÿ¼¡åÝ;]_0ùÏ·‰o¬XMk^-Ñ’+qs©i)Ê`UKhÃry L™aÚ¸2NPà–!é7µnk»£ 8ó}=«y›ËÚ Îe­jvÖz¼ßVÓ!¹™#{™¶ø# ENà|ÈHÎ;›&A#’",×Fâ@H¿3¿.´_Í)]ù_Xÿ{az4–—HŽdéâC üJHÌžÍí é2Œ‘øŽñ܉ÆÅ<_þqwó[Zü³óuÏüãÇæ{›sÁ‡ËWr±áć’Û+µ+ À!íÏó?¶û“U øÆHÀœh¾Ú̆Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^]ù÷ùŦþLyã_—„úýákO/éìkëÝ•¯6ƒéÄ>9Éz°Å >uÿœdü­Ô§šãó¯ÏÅï<ׯ´—:[Ýo*EsS%ÛW£Ì ƒhúlÛyçµ]±Ç/aõyžï‡ßîs0ã­ßMgÞìUتòöÖÆ5{™â„Êë i!$Òl‘©n¬Ç`ù(@ËW…ySþr VƒÌÚŸåÿæ~–üê%›ô–f‡M½W,má{’²q®Ê³(*þ¾Òê»s`‘ž?âþpï5ú:{š†Mè¼ãówÌ›z—“uO*þo~_ìù5Ö•æo/òš++ˆjb–EV•xLmÍ£< Ú¹¶ì>’9£“Mš#õ{½ýwa2jˆ{_üã¯æOü¬Ë‹+‹Ù½O0èôÓu~F®òD£Òœ×sêÇF'ùùÙÏ{AÙߕԦ[Çõ|ÙM¸åaë9£fìU%ó™ ò–5O3ÜÚÜ^Á¥Û½ËÚÙÆež@•GnìÇec°Ì&œæÉ`ÄktHз˜ùó¿LüÜÓµ/þ^Zߦ¾ú ÍÒjCÂ×OÔ¦£‚ÚYIÔñ+„±ëMÆ~Å–ŽQžb8xÀ®²S]ÌN.O’t­CËsiñyͺ4ß”c–/ÊÐiwj^a×ff¡ÔnQUÄ(üCÂ%V+ð§lîrãÈ%ÇŽDÇ'9ñCú#¿Î½î8#«î-ù2Û^·ò¯¿04;#ù§YßE"Ù¼ÇÔô• 0¬U¢–åŹ"¹ç:aÆrbÃ#áHüüþ?ÚåÝÍŸf±“±Wb®Å]Š»J¼ÏåÍ/ÍÞ_Ô|µ­Eëiz¤mp‚œ€q³©5£)£)ì@9v›Q,9#8ó‰´añ/彯©ùWù…«þPù¡éÜ1Óg5ò N•è·q vj¤çQíVŠ:í,u¸†ñ¯wütýEì·ixY ¥Ëúß·ï{ÎyƒèNÅRígAѼÃo¦·eý¬2¬ñÃ:óA"‚¡¸ŽÌEei5¹tò2Å#EXîhÔiqædˆ÷GEpF‹1¨Hã@UTP*°t);’Ý€(r_‘JQÕtÍÜÝê×°XÚŽ³\Ê‘%|*ä åø4Ù3K‡LpÕ›<1‹œ„G™§škßó^DÒ¹G§5Ʊp*Õ£ôá¨ñ’n;{ª¶uz/aõ¹wcfÏÈ_ÚCÏj½«ÒãÚ73åËækÎ/Í?4íäÿ,‹[Y>ÅËE%Á¾“Ó‡ï\ßãöC³ôÿßå2=Ö#ö —ÚëÇmö†«ûŒ4;蟴ÔPíäïί3ü^bó+X@ÿÞ@—,½â«0±ø,̆£²ôßÝa=õúee¶=ƒÚšïrðëýÛíDXÿÎ>èêÞ¦¯¬Ý]¹5A#‚§Ü¿ªry=©ÉÊß¿êrðû ˆo“$¥î¡÷ñ2[/ɯËûJÓžéÇG¸¸˜û}”eS÷f¿'´©{€v¸}’ÐÜ ½äþ‚{mä_&ZSÐÐ,íb‘…<Á9‡>ÓÔKžI|Ë²ÇØºHrÅô ýé¤:F“l)oao¥)¦Þ˜òÔd—9ñrá¥Å¦|-UQB  £` Pòʉ¶ð)¼ Y$0ÍA4k 9¨j}ù!"91”æ-?—´  EΕg05¨’Ú¯.¿iO\º:¼±å9‰q§ Á?«O¾!(ºü¸ò-å}mÑkþùÐÿ“%s&¯©,‡ã¿ÞáeöE>x£ð÷S¾üŽòØ?WŠêÄžŸW¹f§üfv?i5QæD½ãõS¬ÍìnŠ|„£î—üU±éÿ!®leúÏ–üÉ5¤ãìz‘²7·ïau#þ3G´±˜¬¸„‡ã¡¯'±ðæ ùÒè\¶ßóVÞÏRý7j›²¼±Ý–Çëaeÿ5ÌyéûSõCÃ>W÷>Ÿ›D´±¦úeâx—ûª?$]§ü䘴YVÓÏWx$èÒÀ%¶jâ+€Á¶ðp37°¸rŽ-6o©}±ýL#íF|'‡Q„ƒñØ[ÐtÎËÝŒiª >å¿ÝŠýXŠÿÅ„˜¾çÎc[ìž»O¹‡ìú¾Çu¥ö‹I›øøOt¶ûy}¬ö9#š5–'Y"qTu!•îØç;(hów@‚,.È¥®*X5  MÀ4¨¯Ñ†Ö˜*þYÙÝyê:ë·²jÎ?DØÜ*ˆ¬ŠÔìÍÄî› “Vø³¡>ÐÎ:1¦Åùòåøëò6tñ£-IÏ’FÍ”?^ìwþr&ÿS´ò<YKKËÈá¿t¯÷B7uF§ì³(¯Êógì&sÖ.q‰1÷Øßäà{[–qÓFTX›<¿ùyå_$hÞiòn¤©æÈ^ÒkK¨î̳\ɱ¼™WŽä€ ²zçGÙšív«Y“¦º"@Ž*]oÞ{ä×i4š}42à—ïosß·ìòz瑵{ý È:v«ù‰¬F—7 %®‘2G(å Lƅ߈äkñoNÙÅvÆ–õ³Ç£ÆhmQ³¸æ|…ü§³3Ë–3ÔÏsÖ[{‡™ûYf¯èž`€Üèš…¾¡ š;[ʲp'³5SìsMªÑfÓˇ, ˜§g§ÕcÌ/„‡‘Ls½äÿ˜_’zW™õ¯-2èþdSꆎ©oq Ü º=wõuê ß;.Ãö¿.˜xy¿y—˜¤yƒÌö·³xóúñz'öÕï ‘<õï(jCÉ›ÐËÄDpë.¥¥Eè¦~5õPö•*|yuöß±X5˜ÿ3ÙÄoÎ?Íþiþ‰øS¤Òö¶]<ü-H Ž¿¯¼y¾µº¶½¶ŠòÎd¸´VHg‰ƒÇ"0¨ee¨ Žã<£&)c‘Œs˜zxÈHX6r Š»yDß—šå~Ÿç??yvnüÇ%­í圗lnÔúFFT-RÀ½Y™ªÄlOR{Xvö~ÕɦÒf"8Ä£píŽoðØV×½:S †–92ÃyQ"÷§Î:^ƒi„>süÅŠëQÑ|Ïíiæ[+‰d¸Óµ(¤‘i˜¨4jíöz0ÏVÔë¥)6ŒÆÀEâN§¸oÓãÌ<®<DeÍf3º;Æ^o¥¿!üɬkÿ–¶:‡˜åi'†il὜üWÆá#fcNG‘ôëÔ•Þ§<“ÛnÎŧíC @‘ˆþEŸø¯+îzÎÅÔO&œ÷Õ÷þ9=?8÷pìUØ«üÆü¾Ò?1¼».©Üu“M¿ Y-gÛâ*ÔâëÜxßû;Ûù{38Éâv”œ?XèEºîÒìøêqðžc‘ütyßä接är_ÈŸÍ:, íi¢]\Ñ¡_V¼m™¤”û†>!:Öû_EY„kt¦Ákïòþ'1–)sCßo¿%¿.®ü‹yùyo¤%‡—oÎÂÐð.yr[+rbêvRõ~qÛ9ÈvÆ gŒ®C¿•w{¿·›.TùÛÌ>\ò?äšlN’º§ææýÌkþ°¾ ööJü¢ŠfX—”Œ(ÁXôý›:½>£?hâ<\8p¨Žg¼y~9´"{Ë3òݾ—¯åÍ;þr3Z²Ö?3ouA¨ù_H þ¦‹,ꌱÊöαð‘âŒG©NcáçRF¿Q)NZ(˜â©Ÿçü÷ÚÍžuÜÈK›é\ä[žÿ9+ù40¼¼¾fòì$yãAC%±‹i/-P—kzË©øá÷ªþÖÝ/³}±ùlœ>‰}‡¿õþƬ°°Î?ç¿=Gæß”¯ÎŸ|¼‰¦€÷¶ÿb;À½Éû3S£ï°uêN ÅÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T.§©ØhÚuÞ¯ªÜ%¦™a —7—Rš$PÂ¥ÝØø Å_i‹¨ÿÎZþvÝù·YŽH¿,<°Ëœ‚Šöêå¡·#qêNÃÕ¸ð_†¿c9ÿh{_ò˜ª?\¹yyþ¯7#;/±Q$XãP‘  ˆ U€:žPM¹â®Å]мßó¯òïÊÿ˜~Rú§™µS¡>U¸Óµ†œE ­ÓÒ(ÚEvXÜÁhÔ;ü,¤æÛ±»C.›-ãósãvˆ#wκÝô‰èþOÿÎLÛ1©_)~d@9¼B€+I1¼Œü"B~.ž¨¯ï«Ãz þ¾/ÙÐ÷}Í'ºOlü‹Ó¿6|¶Ú‡”|ë5¶³å 6(_Ë^fŽs$·PK¼hŸh´jƒöÈ)²‚èT¯=Ûy4¹k& c9}Q®GõýþE·#bïÉï˯4ùÎþ}ó×™­­ôñ5ç=Êo^/J ‹—`%ùUv »«ZcÚý¡‹&X±“.¼Žß‡êæ°‰—³g>ØìUóïæçüäO•¼»¬j¿—÷Z>§¨éÉÚùYÓ&ú»X-üC‡ à|OÅÅ tØWqGe{?—$#˜J17qŒ·ºïü©äfiùeæ$ó;þqz÷üA¢ê6©oªé³£%ÑPÔ‘]à©çS$|‘âzñøIUØÏ´±çâÁ¯b/¿àw0à#x¾‡ü¼ÑüÏ—ìoÿ1–ÆïÏl$k»Ë[xÕ¡IºAê.ÌcSÄ”¢üþÓr½¡›ÈF ú~ß‹tA­ù³,ÀdìUFòòÏO¶–öþâ;[8G)®'‘bŠ5ñgr3’„ eVØê¥ª^é—PÞÙK_NæÚDš'¡¡âèH?~3Ç( ù­¢2*ìUØ«±WÎó––3kþ^ƒó@—Ì~X®ÚIdÓÕ½BõÖ¬ƒÁKçWì¿hˆLàŸÑ“¿¿þ=ËäÕRÂOùgçX¼óå[mM™F§ú>¥ý›„­Oqó§lãý¡ìƒ¡Ô˜ Þ>ïÙÉõ>Æí«À'üCi{ÿo6cš7jìU‚y³ó{ÉRõ ¹¾Ú’mõM oj„OpÍ_lè»3Ù}f®ˆ -‡Ã©øK®íý6Ÿc.)wGØaqù§ù©ç×k#é¢ôâJ›Ú,JÐÖâp±ƒNȼ‡c–e»?G¾¦~$»¹ô£™§D;W´5Æ´Øøcßÿ;|·[cù#©k¤¼÷¯Íyvô/.Ò¿ÈÏ=~T ò9›?hqៈ÷WØ?[™§ö2y§)‘îÿ²?©è:/åç“t-§é0™Ö”¸œ}bZŽá¥åÄÿ«LÒê;WQ›ê™®á°û£GØ:M?ÑŒ_yÜý¿¡“ôØtÍs·v*ìUØ«±Wb®Å]Š»v*ìUØ«±WbªsÛÛÝDÐ]D“Àû4r(t?0Õ(ÌÄØ4XOf*@æÁµßÉï#ë\ž;#¦\µi-ƒzK^ߺ ÇO’ŒÜi»S‹œ¸‡ô·ûy¼ö·ÙM}Äxôvû9}Œ;þU¿æW’Üù_k‹u<¾§ÌBXûÃ1hæHùfÇ'ihu¢µ8…÷óûEH<îOfuÚCzlœC»—Ø}%5Ò?u­åt¿ÌMX']Õ´fr0JxµzòGÀf£Yì>,£IÝ-ÇúaËâ>,q{O—¸5XÌOxöÐ^¿å¿9ùcͰzÚ¥ÛÊHá<ëÄôqó¥3‡íÉÔi eŸCî<žŸGÚ8uñÈ¿åÍ>Íkšñ?=¯Ÿü½æ-CR¼±9ùTÒŸHãQknj=8Ô•d=%âj>ÑåB;îÆ:FB2ü¾¢Äÿœ}ç˜?ͱ嵼‡iVÒ”£ãaú{¾»¿ç»òG"óÇ!Õ­¼¹&ä›I¥‚wšapñžB1$û¹sNAvT÷5nƒ¶;lèt‡³ ¹åµŠçQå]/r|¹i»7²†«R&1øx£ÐÙ¿+<ïìiÇæîªù—óJÃËòÜÛÚÛÇd’èñß3-¤ònîŒE22”÷ …ì¾|znÍ–Q"eSáú€è~ßĹ]¿†yõ±ÆH‡ÓÅôŸíä§äÑ«Aù¿¤AiåïðÍÀµš=zÎÙ‰²¸HÖ@ÓFWnP‘Ì ë\ŸjøR켆Y|aÄ2~¡ué>|û¶Ggøƒ´ ?Ñãé<÷\¾/`±üÎòÿšoü¥É[ëyÜ8ÙÝ"ÉZU âyR§a\áó{=©Ç¦Ž ÇÓ.ŸÅäkÍê±vÖ ç–w^ž{ù3Ñ»V;æÿ$èwÓŽŸ­Û‡eÛ]¥xþÔoúÔì{ŒÚv_kçÑdãÄ}ã¡÷þ-À×ön-T8rqê=ÏÓ5¿>α廞SXp‘*Y Ž4>jLîµz½tqá8”x2§·ëëÈw‡Iü•‹”øˆÇFây<¢dó‡ç¬‰åï!Z'—-t"´3EIèÒ˜•‹Ê~Ð@ ÔššžÒIØ#ÆÕËÆÕeÜÖæ:¾Qé{qt(iˆË¯ôb¡Ëñß÷=_òsó;VóN¡«ù'ÌÖÑ'˜|¸)/-dy!¹Ky>¬ìÍ#9/ÈË—ÇZÐgío³x´˜ñê°áæß†@!Ä9VÕÒ¶ów=“Ú2Ë)b˜õC¨ë[~;Þ»œ3¼v*ìUåß_•P~bh\ÓÔGæ½1´é¶_]Ämœø1Ýì·±lí}ö övn ‡÷3>¯èŸçÓåît}³Ù˜‡~¸ý¾_©8ÿœiüê›Îvy Î4^zÐÐÆ­qU–úÞÁ‹rßÖˆü2ƒ¹ÿ;h»a#6-ñÏ»¡? ôþÇ‹Ç>‡›Õüý k:ž‡yäÓieçèí%·Ñu‹«t’HŒ­$jì Pái]À4$f“Cž˜lã¿TAæÎC»›äßÌ/ þ]þTùnå|Í®^ù—óïU+qcwewp.-.ä ¬´W…jj¼Ÿ°ö{»Q«È<8ˆiãÌ(ÇvëD¢"<ßU~QŸ77å·—žùÿЍú÷¬IžœÛÑ3rßÕô¸zµßk¾q]­á~b~Ñ{~šò¾^MðºÝšf½“ä?Î.ë¿™Úgç·"¦—wrFµ`µ‹‰ªfŽN#h®–»Óá“~¼3Ò=–í Ϫ#o8þϹÅÍ«íß#ùËDüÁò¦•ç.ÍëiZ¬"h«Nq¸%dŠ@:ü¾Ñ|íy£]ü‚ó¡ùùe¤pÌ&@³hâX ¶Ïo8õ~±ˆj@*À Àí5ù±ãÅ d/Yó·ÞÆÞûý," ðó¬4 KòÆ‹cåým¥iÐ¥½¬ –âˆ;“RIêIêsˆÏžYfg#fGw Lr¥v*ò>~}~SygQºòn¿¯M£"5µóé©pïdeR¤´öàð‘k_€–SÛ7zÃÕeˆË æ.·øŸc dg‰y=5Èß0 þØyãò_óã‹OÕ­ úä’“Ó‰$D›<^-ù/Åá“:-YŽ¿>|<ÁÛñïù÷µGÓæ è_Ë?Ê.~U>¶<·sxözÅÂΖW3´Z"-q/C¹?UŠñíSËv—kdÕðñqÀæÝ½5lŠ õ=_JÑmþ·¬_[éö…‚ îæŽù‹ÊB¢§Ã'æj “庒ùþr‹ÍÖÞhòY׬Ÿ_ü¶šÖîò.¾¯g¨j|Y õ®#`=4åT6ÊÍJԌ콙Ó‹/àË`]YŒzÐïæÑ”î;›ÿœl{/)yÆïÉš5ÂkÓjöŸ¥õÛPúƃ¡ÏéZÂi/­.è'­Óo‹%öˆØFYÃ!SŸy<¨yWÞ¸¶4ú¯8¦÷b®Å]Ьš®"’ ãY`•Y%‰Ô2:0£+)Ø‚6 áƒa_ kLßóœóinY<…æ:Ii#r)´ŽxTšÕ­œ”mÉày~ÐÎã[„vÇgñï±}ýGùÃí÷;ÃíÊj7>‰ìAø}ÌÛοœ~Qòp’ØOúSY^–Œð–]Õ>[·ù9ÅöG²š­eJ¸!üé~ÌýÞomÚ>ÐéôÛ_»‡é=>ÿ'–Mù»ù·¼múÊòý¥íâ’3î+,Õì+á¾ÏìÞËéâäûŸÕ½ÑÃiv¦ã÷xÏÀÓ/¹–ùgògÊZIï¢:ÅúЙnÀôCå€|4ÿ_–bë=¡Ï—hžåÏçú©é;;Ù-.žŒÇ‰/érÿKËçoCDHÑcBF E@Í7¹z€À—b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅP𖕦ëÍgªÚEyjÛ˜§Eu¯JŽCcî2Ü9çŒñ@|š5ly£Ã’"CÍåšÿäuªÏúOÉZ„šN£ç /#˜Õ»zs)õçñgG¦öŒ‘Áž"q<ÿhä~Ç×û ãÓHÂC¡åð<ÇÚ†Ó6¿0|u—ù‹¦É¨iäðŽøYˆÒeýÜ»vj7‹f.¯ÙM¶&zIpK»§Ëœ~y:ÈöγC. T ÿ¨ò—Þö¿+yÛË^rµúÎ|“²€f¶o‚âß¼‰¾!¿~‡±Ï>í.ÇÔhåÖ5Üzqü«ÑvŽLo¯Ë¨÷†AšÇ5y³É[ó­¢Zy‚ÐMè’mîŒsÂ[¯]è{©¨>³ìÎ×Ôh¤eŠU|Ç0}ãð\wfáÕF² ®G¨a~o±Ô-.ΑäKKËé™ä·†èÒy¬bºnR:ð·o³E cSÐfû²ócí-‰ª”b*Èä$cËŸ—?-F¿ô:N 8”+æc|ÞwæOË¿*y òÈÜùž3?ž5>?T++††v!Š*«q+ÿxÄž‡uΟAÛºhpà5‚öæ;ûìžC»âèu“ƒI¢¼»å—-ùÙ×û¥ùg¨?–ÿ.ôVó¾§ „Ó+µ©Ô.#……»1hP´¬*B@ìÈ{C€juù?- 9ð‚wêvóû^“±²øHxò'—­ºsòzíž¡n—v]ZH+ðH²ÆÃü–BAÎk.㑌Á‰¢ï1äŒÅÄ‚;ÂÍKM°Ö,gÓuKt»°¹^A*òV~ðwnã%§ÔO ÄàLd9ŒØa’&3GÏúÇ—¼Ýù®7›ü•+ÞyNfQ}e)fUBM"¸Uꢿ»˜nÇü¯HÓkt½½‡òú‘Ô}2||ûã×îàuÝ››³gâáßQÝäAüE~_þah˜º0ÕtY8Ͼ°ZÖR+Å€ê§~.6o@òžÝìý››ÃÊ6?LºH~9ŽŽ÷C¯†¦QøŽæYšG5ت×D•9žÂì/z†uèɹæO¬{ í rÃòľ‚Ü~˜ü»žC·û2ó¿_ë}!ùCùŸ¥þky>ÛÌ6a`Ô£¥¾¯§†©¶»P ]ø7Ú»ppv·fËG˜ÀòþÞ?Ý 'Äwù‡}ùcå­SÏÞ{ò­µïç.…§G5ÊI²›&>œécuô¹• ²îBïJµv½Ÿ NXáÅ‘‚rùõ®þŸ˜J…‘Íä3è¾yò—å¶“ÿ9æ5Þ¡¯Ï5¥ÕΕ<ò=µÌw3¬fÒ¦R¨þò>X8›ØæÁ›Q-‚E‹­Å|¾GõµÑŠß`ù7Ο<»gæŸ.LÓé7¡ý&t1º´ncut;‚¬¤g¬ÒOO㘢ˆÊÅ¢|ËåÝ'ͺ¡å­r¬iZœ-osCÅ· §³)‘»0!¦ÔOA81*E¾fÿœwóŽ­ùù·¨þFùÚà-kw´[É’îZ iГ@—*ni QÙ³Ù;;]Vä_°õHQ}Ý™­nÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUçß?šååî§ç ¾_"ý[G³riu¨L£ƒÄP»Ðý…nø¤Ì_óŠß—šÑÔ:¼ä^ëÌžc’vÓfŸy=)¤&âèÔlÓ=Uz|ÓgÏ<ö·µxåà@í«ßÝðûýÎfu};œ[{±Wb¨ ròÿOѯﴫÔõ;{ye³Ó‘Ò6¹™”ˆ<„*òj “–a„e0$xA;žå/‡<•ù±aäëÏ=ùçÍÖ÷WŸZ„Íc¥é×v²,VÂj%µ+é£`§‚ª'Újz>³²¥œbÅŒ§ÉŸö÷÷Ù.,gVO7Òº_å|ÿ˜Ÿ•ú>‘ùáj¾húÍ{km{bdÝK¼Uâ%Û‹7PÔ©ärö˜Óje-/¦ÜÁøww7XÝ”þZ~VySò§F—Fò´s¹“Ö¼½»‘e¹¸p(¾£"¢ÑFʪ ™'0»G´òêçÅ’¶ä Ê0äÍ3^ÉØ«Ö?2¼££ùÃJòΡO5ëA¥œhdô”Fî¯1 n(&§Â›ævÎË<2Ì¢<Ïêbd.Ÿ ùSÍ~Tü¶òÿ?.ÿ5¢Ó ŽO!(õH’F yr_‹¯wªÒåÕdÅ›OG­p×=¹rÚ»“Ž‚7}/ÿ8íåkÊ”ú&“æHÚ-L´÷¢ÒPyÚ-ÌŒé º°SV‹œ‡´¸fÕJPå°¾úoÆ(=W4¬ÝŠ u=kIÑÍšjw°ÚI¨\Ge`“HÜ]Kö"ŒËtf<3ð‚hYòêKäkë­+ó?ó«SÐ?ç!?-Zh6RÅ¡é^k[)KNd§(š&áψØq+Ô#-&Ž3ÑúÌϪUg—*÷ûëíqùËÔœÎ;è:/˜o0|ƒ,+æ¯Ê-6ý@ŸQŒM Nd&J32S³mÏ|h3ÏØ4‡ª»¶çøû“Œ]Ž¥<³äï+y2ÎK*éºM¬­êL–±,fG‘‡ÄÄ ‡"s‘Ôêòç7’FG͸DIÞc¥Ø«±Wb¬SÏŸ™Oü¶ÒŽ«æÍE-Uƒ}ZÑh÷WL¿³ òos²Ú#3t=›U.q¿>ƒÞXÊ@s|]ù“ù…çùÉF×NÑ4(´ï*éS<–·SŽR©qÁškŠPrZF }ùPÞè´˜;&&SÎCýôŸ±ÊÐv^£]*Ç¿œyè§ÞOüŸòß–‚]ß ÕµaCëNƒÑ¿â¸FÇöš§Â™§×öþlûGÑ.ú7e{)§ÓT§ûÉ÷žCÜ?[Ñ:l:f‰ê]Š»v*ìUØ«±Wb¬ÍŸ›š”uI´kËKÉïáÍé$B"$@âŒÒßùsw¡ì,ºˆ ‚>ûûžgµ=©Á£ÊqJ22Õ[üCoÏ›ë÷ht,Ks îfyV´¬qDâY³ÌFòeáúItÇÛYä5‹—ÆþÀ?KÖô+ë­KF°¿¾¶kKÛˆ#’æÕÑ‘¢•”s^/ñ Ò¹ÌjqÆ%›ì|ž×EšYpÂs2 Xî=y¦C”ìUØ«±Wb®Å]Š»v*ìUØ«±Wbª–Vz´–wðGsi(ã$2¨taîlž<’≢òá†H˜Ì м—Ì“ÙÝ~ü½½“MÔá&Hì̬ƒ—„3ÉkàÕÄ é´¾Ð ÇÃÔÄN'­}ã«Äv²2ñ4’àþûOÌ"ü©ùåªh·£ËŸšrZÝFB~“X¸°MŠ?ïÈ¿à{æ§µ=ŒÇ–>.ŠV?›îOè—ÍÃÑûG“ ü-\LHþ*ûÇé'¹XßYjv‘_i÷ÝYΡážާ¸eÛ<ï6 â‘„ÁŒ‡0^ÃHÎ"Q6PˆÊ™°o3þXi>kó^•æmRæibÓ—‹éoG¶—.”ìüF®7ä(6·³½¢Ë¤ÓO"Ÿñï÷í˹Ók{£<2Ìšðô?޽ïóF‘æ8þgyŠC :•×—d­|½tïÖ¬#?f¬¿²C‘Q^]úó³µX4}„Y€Ì äxf{þï*ø¼–·]N·!¡#”Xù}ÿEù-¨¬Ÿ˜:õ——,®tß)½¢Íq¥Ý3?Õ/TÆ…AbH<Œk¹Q¿MµžÖà#CŠY¥åâ¡(ÿwý?{ìîkÕäŽ(˜ã«1=%·íø=ÃIÖôv)§Ñï"¼ŠÞi-¦h[Ib4e?ÃÄn6Ï>Ôèòà d‰‰ }ÅìpjqåÂB@ø£eŠ9ãxfE’¤‘¸ ¬¬(UØ‚:Œ¢2166!ºQQäù÷Î>I×ÿ)u¥üÂü¸‘ÓK¹j¤1“VG_Û€÷®éÖ½ô®Ëíl¯‡òzÐ8Ó.óÞ;§÷ý‡‚í^ÈÉ¡Ÿ§úzŽïøïÜ÷ïËoÌó'DŽœDŒSRÓ]’ÚB>ŽHÔ<›û@òÿh}žÍÙ™¸'¼OÓ.’¯¼~‡oÙý¡ L8£Ï¨îfy sÝŠ»|ãæk{ïÊ¿ÎkïÌÍgHŸVò†§©[Æ&}>IR8ªj@R p^D@IÛ=[³²Cµ»":Y<Ð?I5ÆŸ;ëêí»Êê#-&¬ç”L¡.½Ü¿âÄïôÝ_þr ó óVò…¬º'•ͼ¦©0áëEú„ʱµ$ÑxÇÈì©È޹»Á¨Åìî‚8õ2rÙ” 7¢vÚþ˜ó¹WYU¸SÇ>ÐÎeŒp¨ŸÇ3åî}%äO(yWÉz9Ñü®‘”‰ý;ëË$ó\G³Ýh~‹ÐžOÛ}«ª×eñ3ÞÿHäOóGwŸW«Ñiq`‡?}ù²ŒÓ9ŽÅVÉsFñL‹$R²Fà2²°¡ ÄÔ”&bAˆc(‚(ò|Íëê?󌟛ëšzI/åǘ›Ó»¶NL©:¼B§ymÉç?iîÔ÷^É×÷t2¡Ÿ?º]{ÁóîÓÐ.]¾™rý_²~cþ]y®ûÌð~q~L¾Ÿª]ëZrÙëš5ñF±Ö¬fDly²#‡Œ"°ieRZâvhbŽ#¦Õ\Deqçý¾E”MØb–¿ó‰òO¨·˜¿5…ºBfk‹_(iŽÂÊ&cQ꺱øGûí ®Üœî¹Ú>ÔÔx4÷Ëë—?Ç™ù1Ž÷Ôö––¶ÑYXÁµœ ±Áo ,qFŠ(@М\ædl›%½["¯ÿœ¡ü©o=y?üM¢ÂO›<²¯si.,—ãšMË-=HýÁvΗٞÕü¾n DþÃÐþƒû²ÂÃÒÿç8ÇæçåÔ-ªMÏΧa®‚~9è]ü¦U<¿ËWíLõ'‡·b‡b®Å]Š»v*ìUØ«±Wb®Å]Š»~mÎP~`jŸŸšsyGÊ­ëyoÊ+qmmñ…Š{¤!n® èAp°ÄzPrۑʲæŽ1eÆÖkqé¡Çкd•ÿó•W^U[?%þki&ÎÞÆ8­mµk(=3 1(=kTJ€>ܺ!ëœWj{,2Þ]<¬øIûëù¹Ú]t2ÄJ$J=áõ†…æ Ìúl:Ç—µ5-2îî­dYž¥I^Œ+ºÇ|áóàž)pÌŸ78HIŽT—b®Å^kù­ù!äßÍ‹>Z¤FÃÌQ/-vÕGÖ#¦ê² „©_ÙnŸ²W®mû/¶³hϧxõ‰åû ãUü›òßæ?•|½u£~bëQks[\˜´{”å$¿REZYžŒÅEaU§ÚjŠGµõ|ٰdžǫßä»ÑsTÍØ«±WÊ~aÖ5É?Ï2yïÌ^X»ó—üÑ I¥jö1‰fµ))…y|*~K)*†ÕÚéðÃ]¡†(LBXÎàõóh'†VõÉSóÍjþpüÀ´ýc¨\†òž=¼QÜØØƒ'&w¤„Èãê6úNØÅ§Âc â zå{÷måÞÙNåꙥfìU(ԼͤiöWËqãÛHö«ik,Oq5ê)ag—ÎÝ2AËñé§)U{Ùå_Î÷y —ÈŸœ_œ^^üÄòÙÓ5ý'Pò'æ–.SÐ’þ9 ´‘µ•Q]Âò^q*óUøúçuÙ‘“M“ŠŽ\S2¯¾¿o"vqç0Gqz†¹äÿ/ÿÎQþRhÞgƒÒ°óŠ[Ÿ«__Bò*¥Å¬ÜjƽÔàu ¦Á«ÉÙ:¹c;Âùyt#Ïû DŲïùÇÿñ…¿‘Fç/.Cåëý"æk¾­ 6±^Ç ân…U%Ôq“í®Ç0{{Á9ø±LÌH^ökÊÏàreŽëwªf•›±Wb®Å_:þrÎQi>Qš_*þ_¢kÞpfôáA–ÎÒBxñ f”¸.Àõ5sªìf¥˜x™½ûOêÚÖfIሲ^¤~Zy‹Îz³yÇó^þ{íFä‡úŒ’!^ª’²ÐF‚»E)íÓ6ú®ÛÇ‚”_Õßï/kØÞÇ™VMOúOø£úÍë––v–ÑÙØÀ–Ö°Ž1C„EV€g-“$¦L¤l—бbŽ8ˆÄ@­lv*ìUØ«±Wb®ùuÅ^Kå¯Î«;›½V7ˆ4„³*¶«šfv Ë"’¡‹BÒŠ3§Ö{;(Æ ÎùòçŠìÿká)äŠÇÃʬ÷ß➯ ÑÜCð·(¥UxØt* ýÙÍJ$=ÎŽE .¤Oto§°¶’ô€¦åà¥!zdrÛ¶ùduxDw^Í2Òb”¸Ì"eßBþoü•ÿq^yó€ßæP§oŠÒäGM÷­ç]íï4Øò{¿Ù |ÿÙÝksbò?ìe_¥2Ô<Çæ$~iÅk¬j3Üù[VoÜ,îZ(c¸4k°1H({ðùæ>-&-Vˆ˜D îë_¬}®^}~}iä™8²r¾@ø“ö{Û–êûÍ£O†æa¤hj²K r8Œ›t y(4Þg |F1„pvwЧþ:²É=Wlp  \Åíéÿ@þgÜk×?š6• ^Igy%µ´p°‘„bFšcê2ßcÓ.ìhbŽŠsÉ~á³íLòí,xñHĘƷÚî[¥¾lÑ<íù]%—™-üË>¥Äâ+TÊ¡¥*d $o$Õ‚¶õ®_¡ÔéµâXŽ1råähS‹Úz=ge˜æŒÁ4nùó¢ 6ïIóæD^\ò~æ X[ýf(d°·ž êÄ%fzP ‡RFh;?²mD±“´ ³î4õ]­íÓi!š"å|Åïî`“yëó/EÓíüÕy©éZ¦•3FgÓ-Þ’“p®bPÊM@¯7¡¥suÌÑå™ÅÎ2ÄoŸê;>ÚíÆyOàjâ*Å÷×ë/jÑu[}sI²Ö-÷°¤è­ö—˜©SîÇ9F‹$ yÄÓßhõ1ÏŠ9#ÊBÝ­jqhºEö¯:—ŠÆ n«zh[ˆùÒ˜éðœ¹#üF—W©1K!åOÉàú6³ùÁçÁ}­hZŠÃom'µGŠäG1jÊk@FîwñÎÏQ§Ði8a’6Hç¹øŸØùÆ“WÚºþ,¸§B'–Ãà?kÓ¿-µß9k6 æý1­f¶NÖA ¸*HpbÚ…HûJ8Ÿ£9î×ÓiñHx2°zs¯à½³úÝ^hÌC„Ç”¹_~Þ]ãbÎ3Nô.Å]Š»v*ìU&ó'•4?5Ù-jÕfQ_JaðÍ ?µÇË¡îeé5Ùtò⯸ûÜÐìÌ:¸på÷£Ü^?&™çÿÉkÇÕ<¿;j¾SfåsÑ…ÿ‹££SýÚ›t¯òçGhû^GN‡¯Àõþ©ý¯¨ìýgdHÏãÅ×öŽŸÖçµùó+ËÞ}´å§Éõ}V5åu¦LÃÖÄ©Ø:Wö—é¦yÇm{?ŸA/Xâå!Ëö/•½/fvÆ\}&¥Ö=hófY¢v¬'Ο•¾Xó¼ñß߉¬õx”"jN#” ­ÃV¾÷ÍÿdûG¨ÐÄÂ(á–ãáø§QÚ=‰‡Tx¥q—ó‡6ù•­êV—Ð~Xù"ÍÿÄzÄ6é«j¾ˆ†[˜–1ŸUB†øõd袪;Ó£öGŽp:ÝT‡‡Œž]ˆ›¾^ÿ¦<Éߺô±©œd4¸#ë˜Rª$WÞzrEy_òÎ~F¼Ó%òß™!ú´ó#y‚ -T#"­HJÕœuE©ò©¥=£í>“] ŒØMû³Åø¼óîîmÑv£I(œYëø¾îïRÐüÑåÿ2Ç,š¡ è¸N‘µ$º|hÔaíQœ†³³³éˆ`c|¼þ<žM­ÅœŽBTšº$ˆÑÈ¡ãpU•…Ab=³  ‡(‹|ùç_'k_”ž`ó#òø˜ô´~ÓÇ#(ì £¨ëô§ìS±•Ù=©‡µð³yW¦]O˜þ˜û~wÀö·eOC“ó>ž£»þ:~Çп—¿˜7æ.µ¥Nu¤wö.ÀËk5*U©ÕOTj|CÞ ygovnÍÎqdÜ ºH~9ŽŽçA®†¦QøŽæYšG5تWæ/.éjÑî´rÜ\é×kÆHÎĺº7Ue;©™ ×åÒfŽ\G†QüQò-:ŒË á¾eÕ¼ý¥~aYþV~VÉaåÝ/M°K»+kˆã Dæà¼‘ÈÌÄò]¨I ÌÕÜz/git9t×ëÄóNsá‘ú7¡°#Èü@¿ÔeÏ ã €ˆ±æÅ´8®—ù› Üè6—:_šµíJm?óË.ÒËlnu uµ*d’P|iöOŹ×vIËÙ¹cšQž,PÓåØJ¸O ×º1å½ß>Xx5|˜ÊU’=.ùýçËÜú¿¯Î1±Ø« üÃüØòGå…Ö¼Ó¨¬wn…ít¸)-íÍ6ýÜUÛ›•_|ØöefÕʱºžƒâÆS›ä¯9~y~iþsK6“åHÛËLbc™â¬ÓFv>½ÈGX¡oFå×;þÍös–¥?ÞOÏ÷Ò\­fê5†±ÇnóËçúIùaæ‹ÿùÇ/Í=\šwºò®§²Öʧ%¬Œ¢R§ã…¸Ê›ïök¹Î’2´ößbÏC(‚x„‡?>¡ú‡oqݼWV²,ÖÓ¢Ë Ñ°d’7••†ÄjMÑ*b®Å]Š»v*ìUØ«±Wb®Å]мCþr›ókþUWåÛi·/5ùƒž™¢i$|×ý"åG_ÝFvnÎÉãŠ@|aùcåŸÐZ ÝÜ'GRã4µê‘S÷I÷GÜûf‡[ŸŽt9Í}£íÌgáL6þ¥’ë:“¯Ú›MVÙ.#߃GŒžèãu?,ÆÇ–P6 ©ÒkréåÅŽT~ÿ{±Ò?0ÿ*u&×ÿ-5iÌ‹˜Èƒöe€þîaïNC·Žefð5qàÍïýG£Ývgµ8òTrú%ßü'õ|vó} ù_ÿ9iå2´Z/Ÿã_,ù‚¢3tÄ:gèjïñB}¤øGóöÎG´ý•ˋՇ×ïâý¿“ØcÔ‚7åÞú.)bž4šY!‘CÇ"ÊÊ ‚6 Œå ÑrAµØØ«±Wb®Å]Š»v*ìUØ«â=~RyßòëÎz§æ]¿—#Õÿ/4­h꟠_QšïÔˆ ®È´Ef5.¡xÁfô]jáÔáŽ>’æþ9ô£³(o£Ü¼§ù“ä/ùÈ;OD“Éój^]ÓlṓPÔía’4»–¡íU™d BŒSFû4RÜæ«³³öpŒüAHÕDž]þï{h—D§þqkEÕt¸¼ïwu¤yQÕÌÞTÓõhî¥I˜«’Ôà!J’jTïPrÿi³Bg2È#ë#—Jý'âŒCŸsè<å›]Š»BêZ–Ÿ£Ø\jš­Ìvzu¢4×7S¸Ž(£QRÌÍ@O9NB1OE|kù£ùýæ¯ÍJ_!þS$Ö~]jÇ}«|PÏuFf~°À|>Ûý<3¼ìþÅᇩ Ë ç_¬ýƒílÒi2êòxx…Ÿ°{×ùòÏEò\KqA{®2Ò[ùìTn°©¯ïÔ÷ðÍoiöÆMQ¯¦ß­õ.Åöwˆ_Õ“ùß«»ïfù§zb®Å]Š»v*Ó*XÄxŠTÓ°®‚^=}ùÇ©ëÒÈZ<ÒkNìºE%"@99@ÜTÔÓâjùÔãö~G¢c‡Ë½á³{Y“P|=&2gÅÝßW÷•žMóv§çŸÓ_—¾v_GR– ‘&HÄ2‚‡ŒˆÈ>HhË·c\=¡ †—ƒQƒx‚<ÿDz{S&»ÄÑê¶‘z£æ+¼s Dù[Còw潎…©Ä/<½?¥é}{‹rVz]¦µ)›OÎåÔèe’&¦?›äS¤þMãí8â˜âÆj¸¼ÅoÓê}jm^…‘ŒCmHPñã)Ùh)ðç>+¹]÷êúž3 ¨Õ ¶éä­lxž‰¤jº_熡s…ÁÒîd¹3^,2ë6ÿX¤QÄUÈž¹×jsÃ'fÄ![^ûåî|ÿG¥Ë‹¶g!ÀL¬Ñ¯Tx¹òæË?8¼·»äû‹ÂU/tp×HÆ•E½Ž¿å(¨Ø Öö°âÔôžÇôÇGuí_gÇ>Ëø±ú‡é¼;ù ¥LÖZ¿™ï Is8%’̱þòF©ëÉßsâ¹í>qÅ Qå©Õû¦&3Ës3WîÜüÉûÿæL:ž¡ù¹§Úhó‹]UbµW öVUç*–Øí]ºÎìyB ‹›\g´É“µ!g†uç¹Dê~PüÙóæ¡i§ù±c³Òm“Îoéï³:¤LÌîWe®ÃÛ|¯¿C¤‰–2>ÿÓÈ6ê;+µ5óŒ5Dóô×¾Üþ6e?›^D»Öüµ¦¦K>† Cf»´–슄-z²ðZû÷Íoavœqf—ˆhO¯Ÿà»Ÿj;YôðEœ\£ßnÁæ±Aå VæËM_$j–ú³º¦¢–“Íû¾Ìñ¤Áûšñn ý󠔵ĥãÀÇøl¶«ô¼œa¤Ë(ÃòÙïÕÂNÞ`ûkÞú/CÒ-t&ÏG².Ö¶qˆ¢iHiب¿!œ&§<³d3—9Ô´zXéñGn¢+~j:þ¥ XY<ÃsWßè¦;‡ %õ¾€u"‡¹Û%¥Ã–r¼`“öéMzíF p¬Ò2ôïÖöx˜´1~Nj æ,^™¼½w(ŠKy~ «,S/FÆE¡Ýúý&«iCÃ˘ÿHýOŸkô:ŽÆÉã`•㑪?t»üˆßôõ›;ZÃä3çc¦h.#·s_ß?À‘’)Pd!ká¾s0ìéW}jü»þOk“¶"4_šªôÝyô5#yÒ3yZO2jö‰¦ÁJEvhÞ8“ÊU¢•=O´»8`Ì1@ñ_oF¾Æíyj´Ç6Hð~êÏâù2=/WÒõ«Qy¤ÞE{jvõ pàVMÁö;ælÅ.ƒæítÚ¬yãÅŽBCÉ”¹Å]Š»v*æUe*À"„Á±Â ·ùÓò–h.ÿÅ—Ò6Ÿ¬@Þ±²…ý%fò·aN þGÙ>ÝM í¸Ê>¤q@ígŸ¿›ÃöDzÄKÆÒzf7á¥î÷r÷2/ËOÎxµ¹“Ë>rQ§yÑI}(®]vâÊiéËþOBzPü9ÍûCì‘Àm?«:æcúãö޽ì;Ú”øYý9Ý×ú—ö=ƒ8g¨Xa…¦[†L謉)QÍUÈ,¡º€JŠa’5W²8EßW‡ùë[óµ×æŠybÏÌ+åm1m’ãK¸˜‚îOL1XQ‰“’Qª>•4>ØÚ={8ç–/\U 9Ä_Ní¨í¾ýÏÚzLµ¾rxQ«‰èoƒòö©¨ß~hhÚ6›maæ;)¥·óEÎ’éú>úÑ]KÍÆ/€¹W«ñèvv›;;,²NRÇ !?®Þ†ûó¯óo¦î·IžsÖ㈌âHÈaôÊ=û~.žÁuùÇùylÑ/éˆåi.Í‹>›)£Jõ¥"ïÁP{V‡8|~Êk¥»"£Å¿_!ý//›ÕOÚ$k×{ðþßw›9t†æŽEYmåR®Œ#£ A¨ ƒœø&&ÆÄ;’…Á|ïæ#\ü‡ó|^uòŠ´ÞS½Jòı(ªÇ“[Êhh§¬2ucþW¦hµ{{JtÚ²ÇxËýðÿ|:ýÞ}ÚZönoøåÌwyÐÓÞUóFç-×ÌÞµÒÖ†‚Hœ}¨äPMNÄ}ÛgŽöŸfåÑf–¢¥‘óEè´Ú˜f€œNÅ9Ì!Ø«üÎü½¶óîƒ,6Âo3[)mUu!íä ¯¨Ÿ«Ò„ŠÓíQ³}½.ÏÎ ®X¥õü{¹Xûy:îÑÐ D(m!ôžçE¢~QjysÉV¯æßÎ ¢Öך¬¼‘YÍ «Åmìî?h÷ý£J¦z\°fíŒc6ªCO£Žñ…€d##Ðw}ƒøžhN9pb&c±=ÞïÇêf_•ÞpóÇ”<È<¥ù«¥&§æ™ÅÆ“<‹ÌQ¹^.=H]¸©øC"ŠE±!Ch}¥ì³Où€ŽSÄžíˆó¢wŸ™fêóaÉáê®gn¿wà>ƒÏ0zwb®Å^ ÿ9 ä{Ô[/Í?+3[y‡Ëï—’Á´†_œWƒv…º“ûËž¡ÿîÝGC›xd¾ïëó¾ÿ{Ë{EÙöUóG坿·¨[i1@>­­‰¤–÷ñ¨2F ’O=ž5b¬;æf¿±òâÔœ0]cæ?Þj3[Ã?0¿ç,µÏ1]Iå¯É­>D.xvæ Ó°­ AÕ#_ø²nß²§|é»3Ù(Ƨ¨7ýúOêù²Ã&ypb‰‘y~“ùs5íëëÞy¾“XÖnXË:Ë+ÊÉ­e•Ï)áóξ"0ˆŒGÏoÙ~ÇÆ5=Aâ?;'¯ÝïzQEi (±Ã ‘  ª£`‹ÚãÇDF"€è/9yy<Ë¡Obúâ~úÍÎÜfA°¯ƒ ©ùä¢hºÎÛìÑ«ÓÊÄ7¿öò}ÿ8Où®þjò]Çåη9>bòˆ f’m$šI!#;ŸAÿt|Æ3!ñiăEõ6,Š»v*ìUØ«±Wb®Å]Š»~i~pùÇþW¿ç¥Ô–ÒzÞIòÅl´þ&±K¼Ÿ¼”v?Xš¤¾˜_åÌ]^oeÔöçh~WNHú¥°ý½’ç<ùc±C±V5æ_#h>gV{¸} ú|7°QeÛ§.Ì?Öú)™8uSÇË“¶ìîÙÏ¥5qþiåûo,yßósò"P4ÛÓ~LVå&Ÿ?9mBÖ¬BÔ½»wä‡zò鎯³ôºñê3ïÿkßvgoáÔmÁ/æŸÑß÷¾«ü®ÿœ‡òæjÃc Çè38´[çUw~âÞ]–QàÅFpݧìþ}-šâ‡ó‡é>ï7¢† ŽÅëY£rŠ»v*ìUØ«±Wb®Å\@"‡pzŒU a¦éÚTUÒí!²¶äÏèÛDÇÍ·f†žç'“$¦nD“æ´‰È+±Wb©G™üÑ¡y7Dºó™/RÃI³^RÏ!êOÙDQ»;•Wrrý6šyæ!d­¾!ó¯Ÿ|ëÿ9#¯¶›¦‰4oË› AXXÔµã-Ç“0û1ƒÅ>öo@Óé°vN>)z²Ëñ·póëö9Ý•Ù9{BuLÕ/Ç3äô?-ycGòžššf¥¡–V¡–g¥ ÈÛTþ¶sÍnMDø¦P÷>µÙý‹Iƒ¡öŸ2œf#žìUØ«±T‹ÍpÐ|ŸkÖ·pcõÉX!KË!Zr⣰®ä홺-]Lˆ€åÍÖö—jàÑÄK)«ä:”ÂßWÒ®îÒÚön¤nÒ‘ZCnôã'kÄò9Dôóˆ³×ǹÊǪÅ9Æ@’8ª÷®ÿsÊüóæíOUól¾JÓu¤òÞ—c­ªjìá’‹'nJvä *°$×zgIÙºcÀ3Ê$¤}1xÞÙíL™uGM ƒ b.sûvåÞ6ZMùmæo2[ùÁ´;BëÍ>Vwá-óÅ5! *&¬ÕhÀm™KPö©¦eö¾ Óø’ˆÅ“»mü¶æà{?Ú:ˆêü(ÎYñ:ŽÞ{ò÷[\ÈŸë°MÖ^ªNÀ%þÛW YÇÜ1¿Íöoô¡þ÷þ:´4±ÝŸïÿãÉßš|©æ+?Í]/Í^[°{¨'ô¥¾hÊÆŠS÷«3£”DR½MsE®Å- ±e•u÷µØv—fg‡iÃ>F_îeó‹+óß宕ç©-n®n$³¾µSÏ«sˆž\[À’FýÎk{3¶'¤?{¹í¯g±kÌe"c(íc¹3òg“tÿ$érištóOÒ›‰^vRL…U P (£1ûC´'ªŸ€+g/²;'‡„ 6o~öE˜ÕØ«Ì|ñù{æÿ6j×Wó´òÝÈ„6žÍ3(1ªÔúbˆj×\è{7µpiñ‹Çs¾ß{ÈöÏajµyMeáÅ*ôïÓË—=ÙÏ–´ O,hvz‘- ¢q20¤v%ÈÌÄœÓë5RÏä—2ô=Ÿ¡Ž— qG”Gϼ±íCòî-CÏ6¾v}A’KS !*DHWwå]ɯÙÌì]¬a¦88yÞöë3öɭލÏé¯MwyÛ6ÍCÐ;v*ìU‡yóòïJóÕ´FyÓT¶m¯QCQNå –»õ‡­v½™ÚÓÒBây‡EÛ}ƒ‹_g†qå/ÐGPóÁù%æûé-ì5¿2,Ú ³VÄ·2/OÝÃ(„¶lÞÿ¢=<”1Ôϸ|Èܼ¸ö?UˆeÍxãËy;š/óÆѼ£ èZlf=9}6§Aõx¸Ä¬ÝÉ«6ýH®Uìܼ\ù2K꯼îßí”<.,P~á·éJü×ç¯.Ú~YéÞUò½Ð–ææ`ºEVV†0ÏΠNûÞ§2t=™–ZÉeÊ(Hóîù´ûkOΆ ³ òå~dþ–W§ËåOåTwR(ÅÊz¢6-}vµE#¿¦ rsY–'´5Ô>‘þä~¿ÒîpHvOf ¬ïþ|¿PçîI¼³ùâm´ëeó…•ÃÏ+•]BÚHž1AÈ‚ã“^\ö—¬öoŠgÁ®âwü{ÜÎöˇ1gø€Ú¾{ù×Éì–7¶š•¤7ö,öw$†d5VVÜœ¦Lr„Œd(‡»Ãš9`'q<оAµØ«±Wb®ÅXæ厛ç8Zöן˜£_Ý]D›ˆÙ& 7ƒS÷fë²»fzcÂ}Pîî÷~§›íßgqëG}9#ßå/×Ì}‰'å׿¾©åÝE|‹ù“Î ˆYa´ÔîéÙVw?iÜ%ûÍ7ûAì¼3Àêt{Þæ#¯õ|ûãòÝç;/¶²iò~_W`„éòî—ö½ì@ Ô‡<؇³I¼Ñå}'ͺTúV­:ÈŽÜ¢’[vqOR#*°V÷ÙÝ£—I”dÆNÇqdäj¬8šÝ=F3 ŽÖ<żÇQ] þqûÉÀéþ‘ó6¨Æ$¼•8ú²(äYÀ'ŒQ×hÁÜž»–ηÍí¯Öx1Cz—|ö<îa‹±ôþ‘Å’}{ÿ`îþÖ+åßÊ=Ë¥ùòóêRë7WÂòóK¿‰U)Iv–EQÄ5Mx*ÕMÚwµ! écÄ!ðÆQ=GAåæNþçY¤ì Q”5áâ2³çÏ˧½ô–y[è]KM±Ö,.4½J¹°»FŠx_£+|·¸#pwvŸQ<3©DØ-y°Ç$ $,oŸô=SWÿœyóëi÷Í%×5§¯3V¢A2Óa,5¤Š>Òöû4ô}~—´Z.8ÔuÿýYtî?óÉF}•¨á;âŸãæ:÷üŸXÚÝ[^ÛCyg*Ïip‹,FÁ’HÜrVR6 ƒQž%—±ÈÆBˆ4GqzØÈH9\ƒ'b©d]Ðíu›¯1A§ÀšåêGÕøAëH‘*¥ºJN´è32züÒÃ&gÉ$G ¿ÇâÚc‚f`#Õ0hbiRfLцXä* *½9z€h+òÌQ2^Ŷ…ÚüŠ]Š´î‘£I#E™˜Ð7$“Ûš%៙ó‘XÒb¸Ð<­o™uIÕíå$ÓטâUˆÞjÖœScüÙèÞÎ{ªÍ(åÎN‚þÃù¾ó¿“Ïv‡nãÃã'o/ÛðxG–ÿ+u=H-ƼͦéÌޢء&c_f$&Û|UožÞd½£²½‘Ë–¥ŸÑïâýŸ“ÖtKÐíE¦—l–ðíˈ«9ÝŽì~yY6úC‹MqŽ}èü[±Wb¬ÏÌwŸ’ß›ºæN˜Œt©æ+«[GÒXeø.â§JºQ+ûb½²ìeòßk»3ÁÍâÄzrºëóçó~Ÿi÷öZ­…®©§L·:}ô1\Ú\Fj’Ã2 #u> ¤–2ü²òðÐü¹ÄËKíKÌÕ*„~é>…5ù“š nn9×@ù§´zÿP@úa°ý'ñÜÍ3 çÝŠ»v*â;ƒÔb–æoÊÝ#W-y£‘¥êhzc÷ÃqTdû§Üs;ºQÚ[‡¤ìïiráôäõÇíùõøüÓß$ÿÎCþfþS\C¡þ`[Kæ-©Ãq+òºD´€Ø—~Õ\×뽞ÓêÁ–#Á/³â?SÞviãÏÅ+Í<ÇêûGsë þhy'ó*Ãë¾TÔÒæTPnl$ýÕݽ{I |@Wö…Tö9Âkû36–U’5çÐü]¾<ñ–Üwãô3 Ànv*ìUØ«±Wb®Å]Š»v*ìU&óWš´/%h7ždóÚÙéVIÎYí3~Ìq¯Vv;*ާ/ÒégžbJ’7Ã^có/›ÿç%<Øn.Ìš_åþ—)ú­¢š¬`þ\:ý¦è€í·Úô(Cdá¡êË/ÇÂ#íû¶}ØÓí ŸÍÇrýÏîûú¾“¤éÚ„:f•n¶ÖP©¼±êIîNç9ùç–FS6Këš].<Æ8b¹KìUØ«±T©«éš-©½Õ®â³´/«3„Eê}†]‡òˆÈù8úV<âÉ!æóÏÌ› ÿÌMƒÉÂÏU°–ä´×bAÊÝ‘ R­Ê€P²¸#—M³yÙc£Ë#›Š]ÿŽ1íöŽ 7 âe¹¾_޽y0ïÈÈ4{1jš¤/šíƒ­¯¨ì F¿»š0›kï]ºR‡6¾ÒË!ÅxÏ?Ð}΋ØÈbŽyÇ #,y_w) ïütL¿2/5 _]O9ùZÞb ™ õˆy-ϤH£/%!8º«r­~Œ~ÈíhcÅàå&r>ýÿ±Ëöƒ°rfÍùœdêõŽÞV6£Fí¢ùÏþcÕtÉ5Eò‡–´£É,ôç6Í5YK§Ÿ—ÅÆœš€•9^£U¥Ã pŸsë-ëæ´šv§, ãù|Xÿ†›ïäo~òõ;ÝDÔo Ôµ .¯­T¥¼ÓF²Åy|!ª®àç9U’1Œˆ=Žm“œ¥D‹¤Ç1ܧb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¡{ce©[=ž¡oÕ¤›IȲ#SqU`FOY@ñD|š³a†X˜Ì ÐîÂ5/Ê'Þߨ_[[›bèÍknAp©'¨VE ±'¥ytÛ7{QÊ$ñqu<ǹçõÊé'8J#‡„òŽ÷¿ö¼«ókÌWjóDºf]i>^I Ë4fB>±#Ð)¢WÚ½ó¤ì- Óá‘©düD~—ö£_-^¤ÂŠnÿßÑý¬Ïÿ™IÖ¼„t z——·±04Rô™X’JñT ­|+˜—ÙœZ®9òfþ¯Ç=ݧn{A£Í¢ðñîMTj¸kìÛ–ßs ò®¦ß—¿”Öºž¶¬Im-áfk™áˆwÜmà+á˜Zì?œ××SîæC³ìÍOòweÆyyî@þ±ôÓä¥äßέS³Š4Ï›«=*¢Ëè8 £³+I¦î|vÉv‡³¹1Èœ@Ê? ý¿&“í~°9×Z÷ù|Þ¨¬®¡Ð†F«PAèAÎlŠ{ m¼ v*ìUØ«ó×´¯;éþ•Àj)ú•úŠ2wâãöž£îÍŸfv¤ô²±¼O1øêé{k±1k¡RÚcé—wë #òçóVò&¬?/¿0 GjŒ#°¿–4@\ý¨[ö[ö:¾ÎG´>ÏcÖãüÖ—êþ(ÿ;þ=Þ:ûùñÝ—Ú™tY+ªÚ¹îíÿšzŸw¡TnCž^CÛ±Ï;ù+IóÞŠÚ>«Ê2­êÚ]GOR € 0®ÄhÊzz´ì~×Ë¡Íâc÷ÐÇW_Ú]W‚Ü^Oùˆšíÿš|±ùA¦êÓÙérÙÄ×7óÈL×Tõ20*^‹ ⵜӗa8ôÙ»BxĤ$j m\»¾­Ï@ó=¬2Ï>-fDLw'™çÏ¿—.ô<Ÿä§ž¼½¤Ùkj^Zó ‚Þ{¶hÙ¤XŒž˜$ «+-+B¹lócí­\’Æ!“±!×bjþŽ›Å>ËÔã„fe ›ñ«ûCèLó7¹c¾vò~›ç}ãDÔVoÞZ\Ò­o:ƒÂEûèø$fÓ²;W&‡8ˈïߎ®iv|5XŽ9|qïyÏä_žµ/(ëÓþPùͽ)"•“FšC²JÇ— õIkÎâiû@Û^ÄÇ«À;GM½Xòþw¾<¥óè^3²5SÓå:l»vý^ãÌ>”Ï%z§b®Å]Š»y÷æç“¿/cx/®>½®R±é6Œ­5i·ªzF?ÖßÀéû Ù-_h`8qÿ>\¾Îø|HušîÖŧ؛—pülùã\óGæwç4…n$ý åj­¬e’Pk£Î~tJôãžÓØ~Éèû4Ç“ùòçðé†þeÔaÒk{Oîñ}Ÿ®_w¹‘yoÉ:–P=¤^µõ(÷³Q¥5ê²—Ó\è̉{NÌì->Œ\EËùÇŸìø2<‹¹v*ìUØ«±T‹Íú ù@ºÓ€X§«jÇ´Ñî¿~ê}ŽJ&‹«ížÏüÞžXúó¼rý_пó„™§ÌÞAºü¾Õ$ÿs^Pz[,„ú’i·.Í͹ô¤åþUà3!ñ9 /©±bìUØ«±Wb®Å]Š»v*üçÿœ‘ó[~nþ~/•­dõ¼¯äÐö$)ª4Ѱ{÷ö-([öæ>«/ êë»_[ùm<¦9‡¼þ®i€ €è3œ|ءث±Wb©FæM7]¹¿µ±õ=]6f‚ãœeT°bµVÜxŸl»&@z¹Ú¾ÏÉ‚0”ª¦,n›å. …Ý­ý»ÚÞ—Ò Ì ÔÐä ‹äÃ!‰áÜô|ïaqyù£çhô>NÚy±Kµ†Îܘή+çÈr å¹!sºËè4Þ&œqqVç}»ÿï—áÉ>ÕÖ Z³ÁÃÅQoÝ×ðôÉïÿ%üðÚmô?•µ>?¾#fˆš,Ôsˆš8GÍr£ÓÓqGl‘üW¸ôþÖÍ<çØºÎ ’qO¯—¾=±™ùÓò†×ͺÂy‡HÔ—N–éTÝ‹ÕI~ P«- ^½_ê{?·¥§ÇáÎúvOnñÿ"}äÖ…?Ÿš¤†¶þV<Æ·29¯ÌB2Ñì´<¿gí@öÃQ/§LkÞOû×Êø×?êV?ò:_ú¥úÇþ«ö~ÕÿEš¯ùF?ì¿âW/üäÔ;^ùa’›³ ¶ZõZã€û*,¿gíAöÓ$>½9>ø£í?ç ü¼ä Ý*ò õ1¦þ £Ê'ì®QôÎ'æ?[v/n°«‡ºêdVœ¾@¾!_P{I€-̯ÞÈGÒÙ—ÙýT?†ýÄ;<Öègüf>ðheºn½¢kºV£m{µH‚d‘‡Ì)$}9¬Í¥É뉼;½>·oîç{ˆ)†På;v*§qOo, +ÂÒ£ š2ÆXS’–Tu(Jˆ5l2GŠ$]Xæ:0¯ þ[Yy'ô“¼ãP¹¾n ;ÇÄ‹PôÙIaRÄòñÛ6ý©ÚòÕpíÂ#÷÷ºÃö~2O—Zþï×ß².Ë!Zj¥bÑ¡ yª³ÈЫ šˆYŒcþƒ¶U.ÙÕJf¾óæÝg4PÉâ bþ5òºû'ù“çüãædŽ?RO)hò"HÑVŽ­"¤³Ô7ÙŽ½¾g:îÈìó¦Ãf¼IѰýoík f¢…œ8ÏO~òøòµ•~ißþ\Mä¸!ÐÚÆ]EšÑ‚ÈGêĊÙ'Ä«À£þÕ<3[ظµcPNN.ø¯¯»ötw>Òçìó¤–Ü<5c¾ú]ýY÷å̳éÿ—º,ºìÂÝ’ÆK‡•Œf 锦i;^"z¹Œb÷éß[ý¶ô#AŒå5·^ëO/÷y;ù rùGàóÒöWŇ×´~±Ì3¿ÉOÌ´üÃòºývAþ$ÒÂAª&ÀÉQû»€ißÁíLåý±ötöv§Ò?u=áå߇ÝN?cö‡æqïõGŸëø½/9nìU"óOœ|·ä½<ê^dÔ#²ƒIÖY˜³kVsòwÍ—fvN£]“ƒ Ø=çqµ:¼x#Å3Oœ<ÕùççÌ™t?Ë›It$ž2êí÷iGÃöB_Á»g°öütújÉ©#,ÿ›üáü_¼žtëõZéxzh;ÿYä>ô¯Ë–:fšâÿ\Òš£mêTÀ®MIâÛ¹¯í?ÝžÅB†Áè»/ÙLX}yy?ö#õü~LðP €¬¼UØ«±Wb®Å]Š»b>Oó[~J~{hÞr©‹Ëš»›}` —ê·L#º®ÛúoÂàä—ÀØ|ŸÚ¾Ïð5&CéÉ¿Ç¯ëø¿NÕ•”2TŠ‚7ã&ò­â®Å]Š»v*ìUØ«üçüÀ‹òÇòÏÌ>qfQyglcÓQ·õ/®†ÙiÜ 3’ Å!ùßùM¤Ë™uæ;âÒ_êÒ³ d©vÕ‹êîXŸ ÒöŽ[—sçþÕëxó C”9ûÏìz&kžQØ«±Wb¨MR+Û:ê :U‚úX-æzÒ7a@Ûo·\œ_&ý4¡‘3wï$Òõo4þ[]]/˜4æ»Óo¥õf¼ˆ†¬§bë Ø–þW¡>ÙµÉp8Möú.›´ã|2ˆ wu~‘oYÒ5;}kM·Õ-ÖÞåyƲ¯¤n7ðÍVHHƒÑâuZi`ÈqÊ®=È܃ŽìU+Öü½¤y†ÛêÚ­²Î£û¹>Ì‘Ÿq¸Ëqf” ‚æhõùtòâÇ*û¼0KMóò§RmòçU­Áå5ª|Lè»ñš±(ù û ËÊpj£Áš#ñÜz=¿gûG‹1'îçüîŸ?Ðv} ù]ÿ9oåŸ2´?D¾]× ýsâ6?MÉ«DIìÿùYÈöŸ²™1ܰúãÝ×ö½\5f?^ãùÃôÒ/àú> ຅.-¥I­åPñËGS¸*ËPAÎJQ ÑØ¹ñ°l/À—b®Å]Š»i™QK¹ Š f&€¹$œ@WÃß™z§ç§œcü¼òTå<“¦Ê^êõkéݼFrôë†ý£ñw} ²ô0ìÜ>aûÃÈwy{ûûœ‡&·0Åâ{‡ã™f¾^Ð4ß,é0hú\~´rwyý©÷f?çLæõz©ç™œÎåö=‡—ÇŒPo™LóÌv*ìUØ«Ï3¼û}åd±ÑôDþbÕ[·%æ"RÁ ûLÌh€íÖ¾yØÝ™A”ò„9þ>÷˜ö¶ç¥Lj^Lœ¼ºrï'“Õu/Î/ o0kw«}aøò?±éˢíØirù®ÂÚãU³ ;-=H¢¹áÅÊT Šö5§ZœñÔRÃ""vø=pÑŒðÔB&qß¼ uü~¤ë¦Ã¦a»b®Å]б1þfù?Ë%á¼¾7ÉPlìé< ŽÍBO³0ͦ“±µ÷Œhw‡ãÜèûCÚ-&—iJåüØîPø—›ß~ty·]f·ò†Š-ã$¯ÖeáÇ­4?ër·³xqï–wåËöýÏ:=¢×ëO ÷×Û´GÆÒ; Ͼfø¼Í®È!µoê3¨ÿžQðˆ}²Ç-6îà/¿öósqûÚzÍõY¸Guñ±µgùm ÁCró]7pÏÁЀøl2í žTþ“þ Þd>f‡û?jumå/Z!Ó`¨è]‡ï“‘Ìyjrd½ŸÙŽÏÃôà‡Äq}²´Î( €R’1àŠõeFDów°CÓp¥L ®Å]Š¡§Óì.kõ›Xf¯_R4z×ý`rBr‹‰ŸAƒ/׎2÷Ľ*¹òo–n«ÏOŒ%¢§Ð„Ã.ޝ êé5>Çvnnx@þ­ÇýÉ#»ü³°-êi·ÓZÊ W˜GJÀ¿2#Úø€/5¬ÿ¦ž[áË(:ÿz~Ò­kuù¯åj;SmJÍ?Ý8¸Gnÿžg1òétyþ¨ðŸ-¾ïÒê2vnhwÅ?#¥ßÙ-ÿÒ²]óäÁ(³ó~%¤âæµ ±ñ0LCòsš­G³/ ïÈþ±úšp{c,RðõXŒ$;¯ýÌ·û^£¡y«ËÞf‹ÖÑ5®è*ñ©ã*ò£z8úFsš\²D»æõº.ÒÁ©Šb_Ëšo˜®s±T¿]ÒÛ[Ñït•º’ÈÞDÐýfs@ÛrìFÇÛ¡|¿M›ÂÉЕEÅÖé¼|RÇÄcÄ*Ãòwåž“åÏ.^hzŠÇ¨É©ý#)R«"}%QZ€£q½CTצl»C¶2fÌ2GÓÃôþŸÇs§ìŸgqi´òÅ:ŸÕçÝòûÐw䇒l5¿eº¼DnqÙÜÊ ÔT"+0 Äõ˲ûI©œ8v`o÷¸Ø=ŽÑãÉÇê—‘;}Âþ'Þ¼Óo}ù‡ù¦ÞO¹ºk=Nøc…GDŽ ò2¯BîME§†û}ã£ÑxÀqJ_¯o€ûÝicŸhö—å¥.C§¸YøŸ¹C_Òäü—óF‘ êÜiz‰aue;ï,¢EL*µCÖ3Æ äô¹ÇiáœrD G‘Ù»V»L{SŽx¦L'Î'¸UÝ{öÛbú8gÓÝŠ»v*ìU~g~^Áç-7ëvJ±ùŠÍI´—eõnasà`ö>Äæë±»Té§Rú?/?Öó^ÑvÖãâŽÙ#ËÏú'ôwÿ&?2æ×bo'y•Ì~gÓƒ$-0ã%ÌQlÊÕÿvÇOˆu#~Íšk}žæ0ÝË ?ïOØvîuÏvÁÊ< »dZý#¯Ï½ìÃ=C óåw•<Óæ[O3k0<óÛEé=©zA?å‘zž5;FïQ±ßh}£ÔétòÌБ»ê;ëßötu:¾ÅÁ¨Ì2ÌY—CÝiî¯å/kÖ¶¶Z¾ Õ”‰5¬”HÞ1E¢­lW¡î3]¥íø%)c™‰¢{ïñÏ›™¨ÑbÍÄ`&À€lÌ7)¼ ùßÌö÷Ÿ’™v~wÐâcå}YÙ/m#Ù(ä5Å¿€è%‡ÜS¢ç¦è%ÜìéirŸÞãúOû™½—í|ûµ4dzµC4¢|ÇÞ?Hý©#×ti4hüÂ/¡MXRéoä‘c‡ÑW.ä7ïž3-a˜áá> << Y±Òžg‡Ž»x?žÿç%§mòÊѵ=FJÆ5Ibf[¥`‚œœŽ¼ž‹ìÃ=/°?àq9ÖMaáÌÿÎ==Ã0óÚ®Ý3—‡§Zû‡WœÙù[ó6 ÞaüÄÔf½¾˜†kc/7§P®ãeQÙ#Øv#=_I¥Ã¦Æ1ሄGAøÜù—7Aì¬òËÄÕÈ“üÛûÏè7¡ÙXÙéÖéic[ÛG²E…Q÷w÷Ë­íð`†(ˆÀÐ"06»R¹¹·³‚K›©Vxi%‘‚ªÜ“‹ ¹cŽ&R4RÁçüËK©ÞÛË=Ö´Sfš5hâ¯Ùf§úÀdø;Þ_'µr1Óâ–Zê6qûi8ò潯ê·s[kš\qÇÍ'g,®Õ€ø@­ zà ;Ìí Fi˜åÂq€9ßÙÉ’ä]Ó±Wb®ÅX‡æF‡úkË3¼KÊîÃý* ÈAûÅúV¦ž dàh¼÷´úÌiIT=Côý²ÿç1å`þNéKw(“Zòáý ¨ÔüL-Q~­!®ç”*ÝØ6^øù{–(v*ìUØ«±Wb®Å_ÎtyÊmoÌTü¡Ò¤«†]WSU5Q=Ák{Ujt(ž«°=NBsžy³ Xå9rˆ¶!aeeoal8ÛÛFÆ?ÉE +ï¶s3‘‘$õ|{>c’frç#hŒ‹S±Wb®Å^Cç»ù5]sY°¼Ô¤°Ó4+D–+Xº¸”!Z‚Ewp+½N§6ÚXpÆ$ 2?'¹ì\sŒ¥–Ugø@¿Ô˜ùGRÔ4¹ô?'ê1›¿Ò¶²ß]Éq#LУ£˜áàÕ   ­{·L¯Q!)¨Ó‰Úš|yc—SÃáÈDP«6,ß^cÒ¢Š("HaEŽÔ$q  ªª(`Íq6òr‘‘$îJü ]Š»v*Æ<Íä=ÌêÒÜEõmD†öëÛ˜èãç¿“ƒU<|¹;ŽÎí¼ú]âóOèîH¼µçͯȉÇèûƒ«yD5^ÎnrÙñ'ÃíÀÇÅvùäµz .¸z‡ ûúþ׸ìî×è7Ž\þiëðä}â¤ú·ò¿þr/È_™K¯úÌŒm*õÕ}FïèK²¸öÙ½³†í?gséw®8÷Ò‚Ð d'¿øOǧ¸×•½{4.s±Wb®Å_.ÎRþoÞBSòƒÉR4šöª=rXÇ3ÂÑHèÒƒY<oÚ4ì}šì¨×ærý1ú~~<ýÈ”ä!r—&;ùä«O$è‰f¡dÔî8ɨݲIM”¼´_¤÷ÌnÔíj²qúGã©}{°û:<<äw‘ï?¨tý¬¯5ŽéØ«±WþgyÏ^¸×­ÿ/üœÍ©qÀ^\DxÈ «ÍcWý€ãwì;õΣ±»?Äu¾‘È~Ÿ=öáý¢í|òÎ4šo¬ó#žý/¦Û’Ì¿/<­¨yGB“OÕ/íô÷2]K2³°DDâ ›Ÿ±×5]«­†£(”¾÷}Ø=›= ’â‘‘‘>ð;ýÌOóƒÊzíõÞ—æï-Æ÷†“Ä</9@ŽOZ)z·­ToÓß6}®ÅË]„ÿ°‡Ií_e朡¨Â.Xú{wîÅõmÏÿšvÖÞXƒBm:ݤGÔ.ÙeXIN…šET‹‡ÄÆ›fÇ—K ')ÉÄz ¯ñæê5ZíwjÄ`¸Ž#½}¼‡ZܽÃAÒaÐtkÝ‹Åe p‰ÅÊŠ#Üïœ~§9Ë’S?Ämô-”iðÇåI†På;v*Áüáù©åŸ)sµ2~‘Õ×o¨Û0<ÂY7TùnÞÙ¸Ðv&mFõÃóú_¹ç{WÚ]>’ã|sþhý'§ßäòCÌ_˜ß˜d¯©úA~‘DZt>'ûÉ*?Øü³©Óö~—IÓŽ]çØ>÷IƒGÚݳ¸ýÎïˆ#ýÔ¿Üû‘:Oåþ‡§…{¥7÷rÓ G_hÆÔÿZ¹n]tåË`ö]“ì‡MG ñ¥ý/§ý//²¨ãŽ$Ä¡#]•Tö0É·¶†8ÀÄ@»NÅ]Š»v*ìUØ«±Wb®Å]Š¡¯tûF/FúÞ;ˆ»,Šžàõå’„ÌMƒN&³AƒS Ðcîîø0ûÿËÄŠa}åËÉ,/c<âRíEaÓ„‹ñ¯Ï|͆ºÇ Ç|û´ÿàuŽüMÎ9@“_ }Cý’i¤~kùÇÊ3Çaç;FÔlI¢ÝŽ"p¾+"üPvjšíO``Î8°žÝÓö~6yãÛ¡Ù“õ°2I~© ¥î;÷½“ËžmÐ<×kõñg*–ðÍ{ño#íkiŽ)aúä{¿„÷ßèø<¯AòŸ|ϤØéšÖ¡sgåK"^ÎÊgjl\´pIcñ¿ŽÕé°ÑàÇ–YcâOœ«sñu™ìî«Uø„Ãå|þôŸµé:^‡åÿ'éòÉk[C¹¼”ÖFUÜ—~¿@ÛÀeä’÷šM›AŒ˜ò<þ%ˆy—ó2ÖëMÞS¹?¤ç-ùÉB±¸?z‚›OJü²Q‡{Îö§µ0ž.4½f@n:w‹üôoÌÞYó ·—|ßp.­õÒï—>2± ^d) Ÿ„ƒÐÒ›b@"Â{?]ªÑêcƒU.!“é—=ýÿgË£Òò·µv*Â|ËåýcÌúý½•ó}_ʨ'Ç q(ê¬:Švð Ôí0hy¼Ïjvvmf¢0Ÿ§Eì~£ÝøéæºÿÏ>Mò­¸°±t˜Â8¥¥‚«*üÜQñÞ¸ˆ’ËQÛú-x A¯á‡ëåöÛ¼æýgÌ÷ӵƒlôoO•µÍ5 —j¨?²»SDv/lçÖd&XøqÖÇ~~þ¿Í2JìUØ«±Vˆ °ªˆ=ÅHµ_ùį4ËŸÏ=OòþîOOEó\M ¨cEVá®lÚ¤÷¥‹Ý˜ ȉ°ølh-¨ž>€íî;‡èVIÕ»v*ìUØ«±U“M¼RO;ˆá‰Yä‘UEI$ôb¯ËË}~oÍ?Î?5~e\†kG¸éÁÁªBÃêö©½7Ktí×5Ý£’£ÃÞóÕêø0 cœÏØ?m3ìÒ¾xìUØ«±Tµwua¤ÞÞXÀno …ÞT»ðŠ êþ7ûº‘›^ÇìëÌ!ü#y/ÚÆr¡o”?)<©{q-Ïæ'™ÙîuíaäžÞI÷“ŒìZK†¯íJNßäÿ­?oëã¶ŸÑ?‡O‡ßî{ÿd;‚?™È=Rú|‡Çî÷½g9‡ºv*ìUØ«çÏ0Þ·‘¿:?OjˆÏ§\°™e§ÐžA™ãWoïÆ—æ»;ÇÔ>ðoí|Ç]›ò=¯âä™oð1áû鷣˦þ˜ŽþÒøó7‚Tô‚Ò»µh>YÇ6A>ÅÝ[¾‹f#Ä÷³Ë<…ç2yÇó Qh¯¤—ÊvBåá„Æ‘§¦ïÂÜTÄ|C‘®Ç:>ÓÐaÓi#q$«ö¼wbv®£Y¯Hœ1â¡@mÊ=>;÷=‹9Wºv*ìU¬ëzW—¬$Ôõ‹”µ³«¹Ýš• Š7f4Ù@®_§ÓO4¸`,¸º½f-< òK„ÇÅá¾aüËóOž®%Ò<švöfº'„Χ¼’ ˆÁþT<‰éž‹±0逞oT»º~ß‹ÄO´µÝ¯áÑÄÆeËý4¿‡Ü7>k4"izO‹À/¯úó~íù(Yü336¶SØlß°}†Òèêy?{“¼ý#ÝÒoÊ™^a½»±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUJ{x.¡h.cYaqGÀe#Ü1‘ÃV}<3@Âq‰æá…jI¼Ón—Xò}Ô–wОi©ùFõÿ…mŽgGU‘àÊ,ÌûcØc— ‘Œ‡ð_û™~‰mæÌ|™ùÎuÐüõÔu"1¨á7Oß'ìò‡Ãþ¨Íhû;C¨7õwýþ÷YÙ¾ÔÊð5‘ðæ6²+ý0éïåî{ :J‹$l7‘Ô‚¬¤TGPs•"¶/l"Ç&ð%Ø«ó÷“Ït3¥%ëÙJ²,ÈëV‰Êþ̨ä7¨ßcC›.Ë×þW/ߊtý·Ù_Ãቛ¿/ˆëúÑþVò¶•å*=+JŽŠ>)çjz“ÉMÝÏ€íÐe:ÝlõãŸö9›Ù¸´x†}¸ò—ö>g¯Ó˲5ƒ$î²tûÇÜ~]ï¥l¯mu8/ìeYìîcI ™ UãqÉX|ÁÏ!͆Xæa!R‰¢ÛHÎ"Q6%|©›ó‡æ•ü‘oêëWcëL9Ca $¹—‰QAþSP{æß²»S®•bŽÝd~‘ñýw]Ú«‡J.g~áÍá:Çžÿ1?5d’ÇBˆèžYbRVGe½–p?ºF)â\õ>ÇöOM£©O÷™;Ï!î¤ïîyC©×v¡áÄ<<}ÿ¬õ÷ŠqåËÍ˼.~½©­Ö¦QDoø­7 óÜûçO)’ôÝ•ìÞ -HúçÞ@é÷ù²üƒÐ¥gÒäÖ¼¿¨išMhµ™©,p€ÆŽIi$ØÐ©ãJ“UéLº¾e“U¥:ŒÆ³DóÏ©÷mï ìzGŸ|ü¶j\,ll˜.eÓrh‘Fò35êÀí#¢íÓà9*"Ey'à;žÅ ÈÆ“?«*ª‰$ãÇ›BÜw¥Ol¥ôx"6{Õ1dÆ<û¡^yƒËÒÚiõ7ѺK A hhÈÄ)BNýÀÉDÑt~Ðö|õZcP u~O9Ѽ™çM)„ÉåûgMÄ·’G1ù…õŠ xñË êñº.Ä×a60@žùßW؈ӼëçýKYH±6÷3FãÖG‡‚Ÿ‹”¢ (éÉ~ŒLE7i»s´rç¡Ã"ôyïÝæ>dÊ_Hov*ìUØ«Î?1Í÷—µ/ù÷Gc§¤]BÉ0¯Ã$ ˆjlZ¿<·x/m´V!˜Týãô¿O<¥æ;/8y_FóVœkc¬Ù[_B+R«q“÷RxŸq–¾tœâ®Å]Š»v*ñoùÊ¿<ÿ$üÁ<úz–¶«¡ØQ¸±{ðVb§¨+•…;ŒRþYi¢¼§jî¼n/ɼ“mé%ðOÓœþ·'C峿^Ñê¼]T€åOËŸÚÌsлv*ìUˆy·Ì^gÒ®à¶òöŒÚ’ËÜLc‘ÑXš*„oASó—§Ã ”©Þv^ƒM–&Y²po°±ú^{q§yîÿ_·×,4#£êLÃÕžÜËÞUv#¿Å¶ýóRøÑó,/Í~a¹ÿœ†üÚ’÷ãBòÿî¬âj€m•º‘µåבîSös"—£¯ò³ûÿT~ÿ{Ööf~P,~îËõ|~ëzò"F‹j4UTP6Û8âmö0À—b®Å]Ф>kò~‰ç+a¬DIŒ–·¹ˆ…š"„£z÷s7C¯É¦—¼t.·´û+¶.Dsç—Gÿ8ﺬºû*׊Ú)Œ…GΟFtgڳö=ýû}Ï`Çù}?Õßïz¿–¼¯£ùOM]3FƒÒ†¼¥‘)fzP¼µOà;œÖ³[“Q>)þÁî{>ÏìÜZL|Å´ù”ã1÷b¬OÏÑü‘gÎé¾±ªJ¤ÚièÀHý¹?ò¥hýÍŸfö^MT¶Ú#™üut½³Û˜´0¹o3Ê=`óx²óæ6 º÷š§h´î¶¶©T^~1!¯=ÜîÞýsµÇZHpbõ?­ÐvO³z®Ù˜ÔjɆ/á¬DtÒæz_6qgei§Û¥­”+º}”AAó=É÷9‡9™/®èôX´ØÆÐëûS³á«Á,RëÈ÷‡ñÑç”ɧTò/îVÆ=)¥–Îy‰âœZ²ÂRžqÐoSN£3½«ì#«àÔé£ÄgB@}‡ô‡›ÂviþPÏM¨<<WöÒ;ÝæÏ-wÌ—/¡~ZØÈ¼ê­©H€ÌTíɾ×ü·ßýS–v?°Ð…OTxóG/‰ëðÛÞO´9õRð´‘?Öëú‡¼ý‰>‡ùb¯pu8\¶©ªJÞ¤‘4Žè_ÆIâþ<ï #ˆÀÐ9ÝìœAñ5'ŽG§O‰æ~ï{ÐâŠ(#XaEŽ$R4U@ìØ`{@DPüY;v*ĵMÊþWRóséé-â“pYþ/Þ»Pª³Ÿ´wÉ‚N΃W¢ÒhÆMQ€2çñ=ÝÖz°Í>/ÌŸ;Æux5/Ñ– ÍõeYd·FâiE‚Ì%òFƒÍiáÚ}¢Ÿ‡NRò­†·¦é k¯Ý‹Ëðîþ°frÏ ¥ž„Iú6í•ȇºì>|XDsËŽVwçÏ̧yfìUØ«±T—ÍzOé¿/jp^RÉh7õcøÒŸ6a‰¢ë{_Gù4ñõ#oxÜ}¯¡ÿç|ñþ!ü¬ºò•Ìœ¯ü§xñF„Õ…ñkˆI®ÿÞzÊ<ŒÉ|BAõ(v*ìUØ«±W¿óœÞc“Ì>xògå}œŸ¼gP½ ½&¾“З¼qÄíò|†IðÄžæNq‡¦„Ç¢Š8"Hb^1Fªˆ£ UîÎ`›|vR2$že~.Å]Š»¼k@ó¶‰iç­cUÔLÖ¶×ãÒ¤ â6B«ñªŠÐ…ø~žù¸Ë¦‘Å7§¼×v>iè±ã…HÇ}÷|þ<Þ·c©iú¤?XÓ®¢º‡ùáupâv>Ç53‰¢)â3iòb58˜Ÿ4VE¥¢BŠ“A°ßÄš SI˜ñ4-M´úýxZÎmøý¯SÓÕÙÖàÔÔr~îìO¸þ¿µé=w3ŸzÇb®Å]Š»v*ìUØ«üÅüɱòU¯ÕmÂÝy‚áI·µ­V vKMé^‹Õ¿ÝvOdKU+;@s=þAç;{Úh£ÃVCÈwyŸÕÕäú–/õ‹×ó7œÔH&5'ÀÈ;û1ôîο&h㇈PÁaìϱóÍ?Íë®R;ˆ¾_¢=:÷3ž›™€ú›x«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¡ïl­ug´½‰f·Q‘¿X=AˆÉBf&Ë­ÑbÔã8òÄJ2éøëæÂ,ï5ÿÊ\_é¬×~]ºp.m›ì¸ì¯ü®ÙqýFej4ØõÐá–Óã§“ã£ÙºŸgóø˜Éž ŸÀ—t»¥×æBy{Ì:_™ô¸u}"oVÚ]™Nϵ‹Ù‡ö³‚Õig‚fCÚh5øõXÆLfÁû<ši˜Îc±WH'sîiLQNÅ.Å]Š»iÝ"F’F Îì@UP*I' @½‚ Yäò¿7~uišt¥ùR!¬jÌ}5™C5²¹ØqáñJkÙvÿ+:^Ïös&J–_L{¿‹ö~6xÞÕöÃ+†âK¿øãߛʼÙåo;ÝØÏç3g•ãYá ,ÑÆGfDUG´­|Fvº}<0ÀB€x |u‰Ï—r^«ä–Ѧòí¥Î‹l–°J£Ö‰7a*|.Yˆ=ØôÁ+·Ô{X%¦Œ°ÄDcÏ­õ?E‘wÅ]Š»v*Ç|ó¦I«yWR³€rœF&‰GRа–ƒÜ…¦J&‹§íí)ϤÉά|7ý ;ËŸ™:å;{¯RMJÙZinB±âÅï_l™%ç;3Ú}>ŸGÊÌã·ûï’U*ù¿ÏúÍ–·a¦¦‘_ªÞHYVŠüÁgmÞ†¿a0ì1­í<ðÍ c‡)}óþ/€{2òâ9Ð= 7ïJå/¤‹­×b–#ç8ü¯¦¼Ë¯i¦úh¸ÚÅE žN¼‘˜-+]Ødã|ž¶ã¤ÃZŒØøÈô޽çqËæÅ‡¼íæ ò–õK?²—…m¤,CåC’ᛡþ]×j½:\\1ïçöš‹ ò—–|Õ§êo¬y‡WúÔ’ÄÑ5 g•@bQ›Š­è«‘”‡GoØý•«Å”åÏ—ˆ‘\;ŸØ>›äØ«±Wb®ÅVÿÎ.ëÿàùÈÛÏ,JÞž•æÈ.-c P‚R¿^·#ÜxWýlȉ°ø¿oé< VHô»ã¿ÙÉú!’t®Å]Š»v*üÆÖõ³ù‹ÿ9 ç/82ØYÜÜAc'UôméamAÐrŠ2ÿ<Àí Ô+½ç=©Ôpi„:ÌýƒÔÌsFùñWb®ÅR?5ùŽ/+é-¨¼Fâwt‚ÖÝM ’½H¡ì é—éðø’§cÙžuYx.…Y=Á€'˜àÖ.õ(?04+H-ôèRI¦T¬£KÇÒˆ2±nLù–”ß3¼<9Þ˜ö|°ÆI–DÌì6áÛ™îÛâÏü¯åí@±q¢r6·Ì.C»s%YP ââ¾9ƒŸ4¦}\ÃÌö–¿6¢cÅç¿iæPë’3è+æ]]%®¤´YJ1’0¥ OQP *:u˰eðåÅVçöv»òÙFN*ï`£4<¾p5Ý1:BÕ•‚öø‰Ê69ǃ/1Â^—ó›¬úÇ….þ_o/˜Ah÷¾Eó¹¶µåÙ,uÙäâÑÆÒú)ÜóJ•ñ? Ì øšŽÐìL:þ™wÒ:ýï¯{3íô£QŒ¸‡ó%ÏüÓý£ÉëþQüÃòßœc §\z:ˆ“O¸¢N´êTVŽ=ÔŸzg¯ì¬ÚcêñËö>ÃÙ}½§ÖA©4óý¿Uš×tìUØ«±Wb¬7ó϶žHÒ¹¯µ« Ëajwï,€oÁ·‰nÉìÉj§ÝÌþ{¡íîÛ†‡󜾑úOû^Aå/ÞêwæÏ3»\ê7L&eÜ‚zHàڜ¢¢–|±Ç À5û!ì¼òKóºÏTå¼ÿtÞŽŸ*œf éîÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U+›h.à’Úæ1,‚²F ƒ†2 ØiÔiáš@% °[+Í_ò£_]JÃ×—nÈK‹rM•@ëÕ¿Þ3/S§†» ¶˜ä;ßí.ÎÏìþ§ÄÇsÁ?Ç þþ׿ú/GÕôý{M·Õ´¹„öW+Ê7¬àƒ±çúŒÅ3 Š!î4º¨gÆ2@ÜdÊ\‡b®Å]Š»ažpüÍòדÕàžo®êÃìéöì ƒÿ7D=üÍ·gö6mNàpǼþŽ÷CÚ¾Ñiô{Å?æÓÝ÷ù<ºAù‰ù²áïô?•˜Õc’'ZÔ• 1÷b™Üh;#›x‹—ó?Øùþ³´u}¢}Gƒpåÿøíîz•ü‹åÿ*F „­ñ’új4ÍãÄôQì¿MsfÏO£†.C~ôúöÎßP´žÆí–×1¼S!îŽ8‘øâäN"@ƒÈ¼cÉRÜy7·’õ&Þáëi!Ø4yFðõ#ëîÈd ý–Ö6¢Zy§ËßûGÛOWÊ_Gv*ìUØ«±Wb¬cNò•ôÛÉo’ÌOq$*ŠH‘rnAcJ~É¥}òFeÒi½Òa™˜…’o}ëÜ9{ºù²l‹»kšòáÈs§.5Þ+LQbév)R¸¶¶»Ñº…'„Þœ¨®µSPhÀŠƒÓ1Fb¤{¼tjÞó<Úž©£]ýVÇKfág„øV¤"¨SÌñ<¾ º€|çó£¬92b— qÿÛáçñýBò¿š­u-Á¬êEjëÊ+ÆwXãYS®ìh*(ßNW(ÑzþÉíxgÒŒ³"=%ÐXüZ}iwm}oÝœ«=´¢±Ê†ªÀl~c"í°æŽH‰@Ø=Uñlv*ìUØ«Î<ûywå?6yWÏúpÿKÒ®à”°2YÌ·1)?åQöËq—Ï}·Òú±ån'ï¥ú—¦êº¶iªØÈ%±¾†+«iGGŠd#šr×ÏÑX«±Wb¬;ócÍ_àËO5y©_Ó¸Ó4Ë©m´ÿJhÌv⽫+ ÅCó‹òsMú·—®u{éÈSãˆÿ†/šNÑÌçÏý¬ÔqgþhûOì§£f½å]Š»Q¹º¶³‹Ö»•!‹’§9*òrEOrM0Æ$òlÇŽS5eŽyó@¿×tˆN’ÁuM>â;Ë@HÞ0G¶ÀïQ]ª3'K”B[ò"¯bk¡ƒ)ñ>‰ƒñy½ž“çgôžq¥=«kWqÜjš”ñ²"¤mÍU+@B¶ã‰>°–LQ©|#`õyuZ,<A/$B ÷í¿í{]¥´vv°ZC_JÞ4Š:îx¢…úi¥+6ùþ\†r2<ɵl mcE’v RÎ5Ÿ,ùößSºÖüµ­úñÜ»L¶LÜ)û*©'8šƒnF™±ÇŸˆŒâõzNÑÐËqgÅD âý¢¤>Ô_u½WÍMy®é–ë6û»}Ebã'ªy# -Z+ˉFÛä5x£h“¿FŽÜÑâÒS5>q½«¡ýL÷0^iØ«±Wb®Å]мïóo^k-ÔŸ­êGUû^‚Q¶ÿP{ï›ÏÅÅ.#Ñê}–Ñqå9eÊìýIß”ô5òö…k§P Ž>¥ÓÚ™÷mûÓìa›—UÚºÓ©Ï)ôä=×ëNñuÎÅZeWRŽ#H¨ õbkpÀüÃùecy'é/Iú/RBU — Ž;Æ}×ol(òzžËö£.Kˆ|zýþmhŸš¾kòmÄzGŸ,ä¼´û1ß }`(îìJ>d7‰íœßh{7'«¤÷tý¶{=íÿ@™ñcßücßßñù—³h^bÑ|Éf/´[Èî 4äÑã'ö] O±Æêt™0K†b‹ê-~L8±HH}ÞñÑ3Ìg1تQæ1éþTÑ®5­E¿s¤qñÍ+}ˆÖ½Éû†ý³+G¤ž£ „yŸ³ÍÁíÐǤÂrÏûOsçíÓPóƹ?œ|ÉñÂÏþ‹¯¦x*¨?î´éîz÷ÎþBlc?Çí/5ì¯bO´óv¨\ôÇ¡#ýì~ÓÏ«?ÌØŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¡ï¬­µYl¯#[Ì¥]OàAìGPrP™‰°âëtXµX¥‹(⌆ÿŽþâÅ<›æ;ÏÊÿ2¶ªÈÒy_QpÞ©é? Σ±,€vßz Ÿjhc­ÅÇ®?o—ê|g‹Ø:Ã)¼3ÜKý÷¼rý¢ÑÒDY#`ñ¸ ¬¦ ƒ¸ ŽÙÀ‘O¡°Þ»J<ÃæÊÖ]ÖïÚ3_J?µ,¤vÄÇðó+K¢Ëž\0÷{ƒ®í,:Xqe•}çÜ;©þaùßó æM'Èö’iÚ]xÍ{^2ñ=ä˜|1í¿ø½ÏLí;?ÙÜx½Y=rÿcû~?'Ï{CÚ}N¬˜iÁ„{ÿ‹çÓῚwåOÊ}Ee¾ÖHÕuZ‡&AþõøPý£_Ú¸gFë4ýo/Qz €è1vNÅ]м«ó“C‘!±ó~ŸT½Ó¤Ž9ä^¡9ò‰ÿؾßì±u=¥ŒÇ‡,v1?Ùö²¿/êñkº5ž«¸ŒQû2…×è`Fc‘EõÍÖNåÄ>Þ¿jgÍv*ìUØ«±Wb¯6óž³æk¿4ÚùCB¹x¸ˆIõ‚x3Ô3Î…€M8îNY*Þ3¶õº©êã¥Ã.!wÊùõøtDywËz”5a}«ù„\k7€[úê¦C3-YÛâ‡lI¾½›Ù˜ô9¸òçâÉ/Mwß¾Éß®ÏAÊ޹ثÈî4/<é^dÖmü§Ea¨J³5Ë,kW¢´µ v_„W-±[¾}“A¯ÃªË0¨ÌÝí]ý{¬·TÒ¿' ú棵Ik{5ØÖ’H?ãLNFzObºæÉðë?©é:>‘e¡iñišz²ÚÃÈ wg5bY[Äší•“oi¢ÑãÓcáôŠ?”ìUØ«±V%ù“¦þ‘òíe´áw·¤~3ÿ['»ÏûO¦ñtsï«åÏì·Ú_óŠjÿþDùZYÞ‘š5È­x}BC+ÿ"=#ôåï´â‡b®Å_0ÿÎuyŸô?äý¾Òo1j–ÐIiÊÚÐ5ÛŸzHýø¤>|òžú+ËZ]‰^/¼m*øI õþŽsZ‰ñLŸ7ÈûS?‹¨œûÉù ‡Øœå.±Wb¯-üÛ”K}åí6öVƒFžv{¹G@¢3|ÑÓ›>ÏHŽocì´j§so´ý¤,×|ŪyŸW¶ò—‘o;h#ås¨Ç+€B7”Uø¨ ¨?8°ÇLòƒ-ƒ—µ¨Ù'hÐû¹Yûcùw®kªj¾V×n>¹q¦ÔÇtX»|é²—;°$‚¤ï•ë1G„N"­Åíí‹|C„O§ÂþDÍ{Ë õ]F #MºÔîj`´‰åuZrn"¡Ev©; ž8HÕ¿M§–l‘„yÈÓ_Ì/&ùŽÂãMšþM5®âx_Ö_IÕdR¤‰(ñƒCÜæ_å2c ÕÓ¼=…«ÓLL@O„ÞÛòòرø<‡æKŒ¾Jó:Ïbÿ°&dJ‘ ÷ ËΪûÈnìçÛz|†µX*^ï×GïfžFòÄÞVÑ•ÔË=ìòµÅË¡bØ¢–¡;/Zf«8É+mvˆÕæâˆ¨A“f3¨v*ìUØ«±Wb¯²?ã_Ì©õýæ—¤ŸÜžªDŒtÿZJÉò΋K‹‚u{­GøgržN!³Õr÷ˆv*ìUØ«±T=í…–¥nö—ð%ųý¨äPÃæ<·aÏÇ®[ÝÚÝÛ%å¬ñÏi"óŽxÝ^6_ÊH#9iã”O ^÷XΖ;8@DPñdìUØ«±T&©§[êÚuÖ™t+owÃ'ˆ)Qî:ŒXd€œLOW‘þVÞ\iz†­äí@ñ¸µ•å‰MiÊ6ôå½ÂÃé9^AÕÍö;Xa)éåýa÷Ð~oPÊžùØ«±Wb®Å]мïóvÍßD¶Ô-íÃOmp¢K¥_ÞCVý¡¸RÔúrÌ|Þ?Û,$àŒãã/«¨ªÒK/þ^h‘AªkZàÔnÈY•!”ý¯´H+%kÝ› $º½?gvnœ ™³qËžÇôGÕó/SÓ5+]^ JÉ‹Zܯ8É4­#ÄC•‘Oy¥ÔÃ>8ä‡)#09Å]бíCÏXÒ¯åÓ5ï«ÞÂToCÿœó°ÛyãÈwOÆK+›mNÊ‘ZÒäÓÛÒ„fSàÙ±˜HÄóŸibÔìUØ«áùÎMUµßÌß"y[”6¶¦îUjwBåO¶¯°>ù^YpÄžàÑ«Íáaœÿš ûlæv(v*ìU,×4 +ÌVQÕ õ¡šJº5)ÉXn2ÌYeqs4zìºiñc4Pz'”tŸ-Ù\Ûh¡ žåHkǤ“¡ ~!O„š…¥2yuÈA“~³µrêf%—qáä?-ò“î|´·×š¤âçW¿™eRXV$|M¹,O&ú2ÝV d 9/¶ûZ:žã0€ÛñåÈ3Ãt-2«©W”ìA{âi䟘V‰?™´_/Ago§öY.¯âŒFÅ]Ê¢×á=k½>®“$„%"nº=·aj³GM—1‘Ÿ(“}/ßø(2y.ÏËZþ‡i¡ê—6«Kè3s¬±HŠàÇÀñ%»þ=2Ì:“’2Ó•Ùý¯=V ²ËËÃäy÷ßsÚ”qP¢¦‚•&§osLùù-â‡b®Å]Š»cÞxÖAybþõÃ'¡mãêÍð=ÔßFdiqñÌiØÚOSô»>áø¦7ù[¤~òདiq¨¹˜žþ’|ÖßNt%Ù{O«ñ5#”|zþ¯ƒ7Å犻v*ìUØ«±T§\òÞæ=NÜ;Hç_†hÿÕ~¿AÛ;EÚ9´Ò¼gáÐüM¯ÛkÞA–]IÖd}?X‰ÕíÆ7<8÷P[ì‡]Îý36“I J ˜ò/©û;í£QŠQÇÅ/Iq+îóû|Ù§•4Ðt¨à`>»5$»oòÈÙkà£lÔêsx’¾Ó>Êöìí(¼—ª~þïty|ÏT÷1Þ•Ø«±TªãÌš ¬†)õA³(1Àñ­2ØéæyéuÑè0ˆy ¾þä]ž¥§ê*ZÆê+€>ЉՈù€j>œ„ñÊ<Å9º>ÒÓêEáÉÿT‚ŠÈ¹®Å]Š»v*ìUØ«±Wb¬Yüý¡¥ëXŸ×YLúkǘnyt®eêöx¹ûy¡Žc„‰ñ pý"®ë½”æ#Ú;v*ìUØ«±Wb®ÅP#XÒïèáy¾ž‡1Σµ<}ºäü)Wlë‡liNoĉüÛßÝïòæŽÈ;b®Å]Š»`žv°ºÒ¯m<㣓휑™ÙGB§àr;ØoLÏÒÊ9"qOp_-öû±åŠQ×áÚQ#ýì¿ÞŸ‚/NѼßù¶é¬ù‹Rú ÈÂ(!"€©£,P‚BžÜ䫬3/GÙø´Â >=Kçù³ê{Dñå—§ ¾ôÞ«åÿ+èžY¶ú¶‘j±–sñM/»¹Üüºx ÍspéáŒTBq‹{±Wb®Å]Š»v*ñÌH›Ê¾}Ò¼ÙãmyÄ]S»EH¥xÄËOzà"ì–c¥ÕÃ0å{ýÇìzz°`H*EA‚q˜ï­{†ñK±Wb®Å]Š u8jÚ]Þ˜eh>µÄ&JÕ ¡ê+¿L Ó­Óxø¥ŽëˆU÷<²çJü¶òeеÕÍÆ±©¥ °€ ÇPª‹Ð׋3e–KÁåÒv_gχ/YŽc»á°ø^“å­WCÕtÄ“ËüÆ"Sêè‚/I¾ÑR‚”ë_|®@õ{NËÕéóbŽ•UðN0;b®Å^mç4yE5(ìcÒ­µ]åŽ9å0£ú`7¼À,ÌÁGOÃ,ŒKÅö×jèÆQŽ9r4 y_2|¿±è–öðZAµ´k¼J8ÐQUG@†Vö8ñƈ 9\Y»v*ìUOþq£To*ÎQK¥rámæ[[ëS]”™!Šý<àâ?·2 v|kÚM?…¬È;Ïúmþ÷è–IÑ;v*üÝüßÔÅó•¾aœQítN±€kÇêviÔø‰Ù¶aëåXÏ›£ö“7’CùĶÿBušÌ]Š»v*‚Õµ};C²}CTmíP€\Ô’Ç¢ªŠ’O€ÉãÆfh9:].LóàÆ,±ý#ó#ʺÍâØÁrðÜÈÜ![ˆÌbF;­¸©ì ~MH !Ùj½ŸÔá‡:7L·1]#±Wb¯;üøò¢ñéºî mõKjúrÛ£Êð‡¡+ EaC±âwð͆ŒeŽñ=O`ãÖãx¡p—~×îý|–ù7È:47Py‘ufÖø ÙÉÇ‚!Ag$¯`iO u:¹a\)í~ÜÍ(œ>…üïÅoFÍ{Ê»v*ìUØ«±W”~m]K©jZ/•mïgLã¨å+z1T{|y¶ìÜ|åð{OeñŒXòê%È ùnCÐí-¢²µ‚ÎÆ xÒ(×ÁQBÀfÍä²ä3‘‘æM«bÖìUØ«±Wb®Å]Š©Ï“‡”®¸«ùüÞ•š§×Þqÿ)4¿óßò:ÿwðýÌúøÒ—ü8ÿ»{¶sÏÓÅ]Š»v*ìUØ«±W“Ãä?0¦¶€ú²L$úÿ5ÝCråJòåíN¾Ûæäëqðy÷>‡Ø^ÐŽ´_Ò%~%ŽWw\ø¼«Ÿ–ïXÍ3îNÅ]Š»v*¥so ݼ¶³¯8fFŽE=Õ…ȃa§S§†lrÇ1q û‹ü³Ôåò¯šï||çê—­ÊÑÛaë(ªÛ÷‰±÷gE‹ œA~yɤ—gë'¦Ÿ v=ýÇâ>Ýž×–9ÎÅ]Š»v*ìUØ«±Vù±£ [É÷3"ÖãNe¼ÇŠ|2}Ÿ£´±qb>[¨þ_jߥü©c+·)íÔÚÍãÊ…kîS‰Ê&(½ß³š¿GyÇÒ~²™>EÞ;v*ìUØ«±Wh·~_ÐüÝæ5ó|h.䤴žâ&™}7vsÄqjVR :mó´ÙŸ;ÐæÓiµ™ÿ47!{Y=ÝE&–Í Ï™¼Åy£Äbòü…DKÇŠóæJPvÛ‘§`F òg³3Õgž!X/žß§Üôü­îмgÍ^}¿Öõ<¿c8Ñ´Ñ#Ásu1!Û‰*ÜÌaŠ­E(½{šeÑnù¿kûC“Q”àð¡tIçñ«¡ä>+|Ÿåÿ>Aki}¡gqhËé)E˜§6§^&¨@­ 1•DZaƒKÚ1˜œe«n|þ«âöpAƒPwe/¥Þ*ìUØ«±Vu©)~uy͵á7öå«@b†íVmûV))—c;>ií¶ Ï ÿ:5ò?´?Q²Çˆv*ìUùeäÝ@ù£óÏ>rcÌê7×W 曋û¹.6#jQFÃlÕöœ¶ä}°ËXñü“òþ×¢æ¡àÝŠ»I<Ó¯·–ô£©%£Þ°‘#ô•4j’Õ Ô v ^$ªéØvn„jrðpíÏñO'ó‡žô6Ã¥ÆÐ\A­È’òݸ•’ n.­^@:¹µÓéeŽùnײ{.ÌØ.Ÿ·Ï•i¿LÜê¼A^*è÷ý³ù°q5øt+‡ôùUy2Êao®5±ÐÆì u®Á¹W߉޹Úã|ëwYíQõbâúø}_}½/5Ï$ìUØ«±Wb®Å^A¥ñ殡¨ŸŠÛMõ}×÷ [->d—ÑiaÃŒ·Öƒvd!Öuöú¿cÔr÷‹v*ìUH\[›ƒh%_­* L<‡1¡¸õ¥AÅŸ‡.*ÚêüÕq`ìUØ«±Vù©­=&ÿIÔß‹ÔCº1â¾â¸½G²Ú?CýÑåø÷"<µ¤F¶² éê\ÞWݾï³ôg?¨ËÇ2_¶½›ì‘ ÑÃzªåýcÏåËÜ|¥Þ»v*óÌmíoƵ fKIQVvPO¦è8‚ÞŠo›maÃÂy¾3ÿNÄÊ3þj ˜H/è‘¶þDVýè/ùö÷E¶ŽÂ⻳‹hþ."“Zr¡ÕNYŸD&l.³Ùÿnóèq 3€ÉòÞ¤>;ßËâÏô?7ióz6îÐÞR¿W˜cN¼H$£5¹´³Ç¹äú—aû[¤íÃc?æËcðè~ÿ&7ùƒ>µ¥Ý[ÞØÞÏ •ÂðhÒF ²§°éÈ~£™zÂ@‚‡öÿ>·I–påœa1T ¡!úÇÜSß#ë2k*›™ —–Îb™ØÕ˜}¥cóŸFck1pOnE齈í™ktCÄÖ³ù¿Ãá?QÚìWé`:Œ¾†½w8ŒWr¿•ã)4Í”À'Ë»C/‡®É?æä‘ùL¦Z÷œæôÅÛÞCjä2H†H¢PßgˆR¿ŽSއ¤U»ŽÐ×vÌãùœ‡,`wqF"ùP‡qëÞYG<Ñ}¨\I¤êR™Ø!–ÞgÝþ+ýj ÌMvš1Q{O`½§Ï©É-6yqšâŒ=¹‚z÷޼ü“/9y½´–6!_R•y–aU‰ @$w'°ûò­&—ÄÜòvþØûZ{8 Xhå½ùDwûû‡ÄùÄá°óö¯j5T¸¸1°õ"X1(€€=ºW¶f™àá¡òx\:ÞÖâüÀœèî=|7çØør¾ˆÿ'ùËP„z>³#MÍéE4¿ÞG/@¬zš·Þ¹V«I(»Od=±Ô~`iµR2<"Rú£.€÷ÙÛ}í7óßšnô_GOÓ˜Gw:$˜€JG^#ˆ;TwÊtZa=Ï'}íϵt<8pœÅ™wB¼Îûôû¢6öÞz½³ý3o=Ü–ä®·-̪“^)ΤW°›)a‰á |žO¦íÌø5 ä”{ÆCt;£ÅuåODò—éæÒÖMyÃLä4 ËIV:» ©ùWÇÛWªàâô>±ìŸçΔKXnGéÛÔô¿²ÇSÐs¨<î7˜#·:„æx±˜ýFãÃÖ§xS6‡8.‡'ɰ{A®=¡Óáñ@®#UÇTËü÷曽ÑÓôæÝΆI& ‘׈âÕ$ó E¦Üò{ßn}¨Ë¡áÃ€Ôæ,˸ræwß§Ý·¶óÕíŸé›yîä· •u¹neTšñNu"½€ÌÙK O äðz}7ngÃù¨O$£Þ2¡Ý+¯*z'”¿O6–²kÎg! VZJ±ÓýØEOʾ>Ú½W¡õdÿ>t¢ZÃr?NÞ ?¥ý–:ž€û1ÞØ«±V ù‡a4Ë̶$Çwc"+ȽTåÿ±}¾œÙv~Z&/—ÿÁ#²®ÕÜ ½Çé?·ùÏdòö±¿¢XëÐ-ÜJH>_ö,Í«Æ`Ê2@K½3ŵث±Wb®Å]Š»R¹·ŠòÚkIÇ('GŠUñGR¬>ã‹DEã•SK¦jšï•îOïm¤2*ÿ• ˜e?OÁ•ä_±™Ìg— þ·Ëcú¥•=û±Wb®Å]Š»a~k¸ò¬šö›¤ù‹OŽCu²j2¸‰"Uäx³‚¨ñ¦ù8Ýló]¯—Huñg€<@úÎÀsëøæ—ÝyËJÑõ}Aò¡³—M¹b½ŽÙ z~£ª)WF IäIذðß7/máÁ› 7„¥Rᬱ}üž‰•½ƒ±T¢ÿÊþ]Õ¤¾Ó-å•É//¦«#¹%Öøá.¿QÙ:lÆçŽ$÷Öÿ>l>ûòëÈ73›kkß©]Ö‹WhíËÀ¤¼Ûñɉ—Ïì×gÎ\1Ÿ»„û –_å ü7¤Ç¤­ÉºŠ‘¢vNVFçÄ€OrwÈHÛÐöWgþSÅÅÄ5ñÝ8Àì]Š»v*ó_ÎKRúF|£â·¹hê:,e«_œc,Æñ^Ûa¼0Ÿt«æ?cô÷Éº×ø“Ê_ó<†¯¦Øßò¥+õ«tš´þl¹ó$ïcŸ˜:·è!y§]‰Ó4JôÔ{Y%Øÿ/Å_š?“Þž}vE{²Ÿ5Š4§âÇ4½¥/XOívKÏ÷Gï'õ='5Ï&ìUØ«±VçO4y'I»ú†±§&¥~T<‘¬HцÜry)BFà ó;Mƒ,…ÄÐzNÈìÝfhñ㙄}ä_À,Ñ<½ä BÿO¾Ó­¾©«¬Pê‘Ù‰_’!!‘ 2Êšl9sfˆ ›™k5úìpœ'.(Y…×Î6˜2ìUç7œEž¡ucuaqÂÚiaBÑÉÌFåCqb”­+JæÀvtˆõPöS,ñÆQ˜õhØçóJ¯5Ê?1]›íJ)m®ä Êæ9ãõ l@Yj{·_|¶8õ7f-'jé¡Á$œM{¸ž—¡¦’šU·è5EÒŠr¶‚©=~-êOZïšì¼\G‹›ÉëS–^-ñõ´Ã+q]Š»v*ìU«^7K½ÔZ”µ‚Y·îcBÀ}4Éã€ïr4¸|\±‡óˆ7šþPÙ0ÓµV]åºb z‘ò&¾åÿ 鞣ÚÌß¼†1Ê"þØôŒ^IØ«±W—~eéWúmì^r°¿0ʆ+qêèhiÀˆ;òVüp‡³ösU,šp±¹þßÐS_'þcZk\4íc¦«²£ý˜§=©_²ÇùO^Þ)Âíg¥‚ç‹Õ´~±çóg˜¼Ë±Wb¯!¼“üUùûó°Ò~E-ŽþƲŸ»1µy8qŸ7ßàUØ>&lBCaûÙ½ÿ{ö½4OÔNÅ]Š»CÝÞÙÙ"5ìÉ JÂ$20™¶|”`eÈ8º½f²<"ú“Ñ'Ôü—åýL1kQm;tšß÷d£á?HËñêç¶è;OØÞÏÕ‚N> :Ÿ³é?òêiz±² %³¸")S£˜ž‡±¦nþ¨ïÔ> x´š¿ÝˈãžÄuá–Ä{ÞÍæ}$kZ-͘œRÜøJ›¯ßö~œÐéòðLè_i»'óÚ)âUqGúÃ—Ï—ÅæžG×DÕ&MÂÒxœK]¨ñê~{úsm¬Ãǹ¾;ìOmÇAªÈj‰¿|nCôŠ—–­$óšRkÉL¯yuá@Ü©ò,BáÔKÃÇ·¹§Ù½$»Oµ§¸â9'ó¿´ÐfŸ™ßñÁ·ÿ˜ÈÿäÔ¹ƒÙßY÷~§Ðÿà™þ!øhÿq4åb'¥©ÉO” ˽(æ™gi¥ÕÿÀ¾‡<ºÜ?ß%ß™ê£X´`>#l>4‘é–öwÐ}î«þ ±œÆÚÿßI˜ù“åM>»ÿøNù­þôþ:>ì1¾ÊÃþû¹<²ãþRiæ9¿äþn#ýßÃô>'¨ÿ)Ãû·»g<ý0ð‹´Y<ǸûÃô´1Aœõ9ÿ¹/.ü¿$yžÚÒjÿȳ›}w÷eño`úçt¿Ü•?=ú¿â›ïWþ*ááÇÒZS%¢¯ 4ûsÅü©—‹ú5îàŠikiùö°½£ÊmZ40¸·Ó*8ÓãéL¦RÓÙ¾~âîôºOhåŠ'—†§•mü]È(üŸæö¾²YòŸÖÉ'¯nO>\É4~µß,:¬\5{®Çì‡kœã,±Ü¸¸‰ãÇÎîþ¦cç_)O¯olEì+é4nx‰¥…±ž¾9£Õ {Oí§²™;G‡.ü×êô£ã“é>Æ{Y>ÑâŘìåË¡|Þqoÿ)4_ó¿ò6’þïáú#ÓÿÆ”áÃýÛѼëå)õã íƒ(½…}&Ï"T°£v “×Ç5z=PDZäú×¶žÊdí¸Hñ"8híÄ.ù÷‚OÍ„ÎçåXÿãâÒÕO´°'ý’n~üØ~ë/q?kçëÏcÇøñÀëCýôwûYÇ’¼Û>¿ëYߢ‹ØH²  ‘+Ä’;Hûó_«ÒŒ{ŽO¤ûídûG‹`ÜávŽŠ:¬Ã.S~ßÝ.ü•ÕeHuO,]šOe!ž$=@céÊ£ÙXþË:Pl[ó×gñc”ðÏi@þÃö½chìUØ«±Wb®Å]Š»xƨ¿áÿÎH¥¾¬¨iãõˆÌ_Œ©\ŒÆÎ/feð;J¤öùŠûÞ¡”>¤ìUØ«±Wb®Å^O¯~Vÿ¦®£ ¯ Åß+±râŽdøUó%·â2Ñ7ídý~ ‰KÕŵy¾ý)Gå¿õX!’ ýb$¸0†Ø3TÑOú¢¸7.dÇfvnhƒ_~ò¯?/€·¡Ç$sF“DÁâ‘C£©ª²°¨ ŽÄeoa Fà¯Å“Ïÿ4uBÒÓOÑt·1ÝjÒ´lÈÜ_‚•^õ™ÆþÔË KÚÍnHBqš–S_ ¶ø’€“:wÔ8¶£?éN?ÞŸWçOäãÊ•ÿ/ÄÄâðþ³ÇðáùsûS/Ë=oPº·¿Ð5w/£ÉésV1Ô¡RNçƒ)=ˆÁ1ÕÍö[]’qž ¦åˆ×Õ|g¹«v*ìUØ«ü϶M½zU­Þ WþFªÁŽNÞwÚ¬\Z)Ÿæ~Úý/¸ÿçõÓ¾H»-É¡²{íõ ‰m;ÑŒ½òõÌPòOùÉíOôOä'ž.«ORÅ-+ÿ1·1ZS¡ë굊CâÊÛCÉv.E ï<§þG2ÁFh5Æò—̽¥ÉŬ—•±™f¡v*ìUo4#,=B9¨©jÓ 2£Vño=µß—õo1úÖ†X<úÙêï°…}HëNàE{.n4µ8ǧ£ßv(†£•$Ü{ùÑüy¦þCW×|Ìž`³³kMOÓâÓÒGLòF¡+¶Æ€oC°*Õz!ÂM’mÁí²0iÎKŠs™Ÿ¸ÿªf­ã]мÛÌ–QE4ÚÏ–ïEÝZI-ÙÉ5 ™ '³†,ØáÖíÃ!aë4>Ñ<ÑâñÚ_gè¢Æ,5ÿ*}e´¿:hpÜ!â÷úr§¦NÛ¸¶?yB~Y“>³ÿ#7¥¯·sxš¹žã_-™..¡ØªÕÌVV³ÞNxÁoË+x$jYÜ1lÅŒÎB#™5óx·Ÿ|ñcæˆ-,ôøfŽÚ Y½`Š]¸ñ^!YºÝp‡Ð» ±'¤”¥2 "…~’\Õ›½#¦ùq¡¹ˆ*,ö¾¤ÎÈ£ˆWà€7M‰ÅÉÑi%|y¬’¡ò²ôÿËÑæ5Ñž?0¬ŠñIéÚ-‘7¤ˆÈ© ®ø ÆöÿåÎ`pÖãzål»D€ÖõÒt‹ÝHõ¶…äP{¸úM.V‹OãeŒ?œ@y¿å¥‰[ ½V]æ»—‚±êV=ÉúYÝšžÑÈG¹û'þ}œ1é§š¾³Â?«Ú~Æsš÷ÓŠ»v*ó=èc¿½úä Þéè)ŠêI'ö…~ŒÚh³ãˆ£±|ÛžÁíFo?½Æ>˜Çœ{ý=o¼_Ãf$­æÔT߈©ÇêÃ×ãO? Íýß=¾Ç…‰íAxÕ˃×^îIå/#_½ä:ޱ·µ„‰í$Ž»­W°­wöÌ]V²5Qܽ²žÄg–hçÔÇ‚6"~©ÊÇAß{žUÕê¨}ãyÒ†—¯LÑ€-ïÖ#±rCø Notyx¡î~{ö㲆“_#§'¬|yý·ðeÿ–ºWմɵI’^7Éÿ}DHÛæÕû†av†K—sÞÀß²ü-4µå4?«Öo䟘6º†‹60=Ä«tŽÉ–!DRh;TŒ¯C1’MlçÿÁC›S£„q@ÎC 4íÃ?Ö„ü¹Óu :Aoí¤¶24EªW«Jüòzü‘‘mÁÿßfê4°Ì3BP³âRóHÕ5NÖ[In#H8³F…€nlhi–èrÆ16kwYÿÈÕju8処+Ò/ø‹(òm­ÅŸ–ì­®âhnÖ炬+3°¨>Ç0õrÈHülöžÇi²`ìÜXòDÆCŠÁØýr,Í>QÕíu[›»+i.¬î$i£xT»!rX«*Õ…|ÙiµP1š!òßj=’ÕâÕO&(K$'# b,‹7D öïîêŸy*ëÍW:Ÿ_ë_PŽ g‘KÕ@øˆ+˜ú¸âôÕÛÓ{ªí\ºšÔøž‰ú¢@½«zy÷±¹ü½®7˜$¸|æxÒ =6ãÃÖ¯*øS2†xpUŽO#ŸÙýqí LaŸŠMðš®;·ªkqI>‹¨Ã —–K[„T³4LÄœÓá50|Ãí½µŠY4y£r–9€;ɉ§œù'CÖ,¼Ãoqyc4*ÊI#ePLd Îm5™¡,d%ö+±5˜;BÉŠQˆÜ‚ÒY?œü¢Úò¥í‰UÔ¡^[e•áIìAè~üÄÒj¼='²öÇÙ#Ú eÅC,EoÊC»Þ:}¾PëkŸ>èþ‚¤„Uc_«úÁkÙ‹~3¥¾!Ë·N»žŒJêûÏz¥©Ò®`º– ‘M©V G&à_|ÍŒ0Äñ>o ©Ööî¯ÓÎ%Ìxt~'‡ñÕ•ùÊ·š)›PÔ@ŽêtG!Š%CDmR@Øf·R'@r{a½–Í 2ÍŸiÈpˆó¡voÌÐf¹€ú#±Wb®ÅX=´ßáŸÍ;+ xZj¥c“²Ÿ¬þèÔûHœÞhgÅÜø_µúOÊö©Ú9@—ÏcþÈ_Åî¹–â»v*ìUØ«±Wb®Å^?ùÓ Ù_ù_„~òt'ü¨&þ6ÅÔvŒŽ9à ç÷nôhäIcIc<£pXwTÆ}v2ŽE~,Š»v*ìU‹þ`é7šÏ•îílÉt†9’ݤµJÜÒ´ÎJ‹£öG=F’Q€³±®úyþ£ëk¹×õY´EÞÁ,ì­îUYÑcŒÚEjÒ¹a4ò:mml³e8«ÑÃ/çzFÖ9ì~tõ*Ú]ØùsL³¾R—PÛÆ’!5*@ÙOÈm•K›ÜöFãÓcŒþ¡œ`v/8üÕµ¼/ êV<÷wQ#Bä“ÁÖ¡A=S,ƒÆ{]Šw‡$‘Œ/ý?ñOæ–£µŽ‚¶ª~ËI£}óºÃ Z?•»[/ч‡ß?Ýo‘<¹æ­;ÌúÖ¿q‹øŸÖ $eŒÍ"¸¿ù-+_ÑzÆ¡gOkÝ:÷ÿ¾d¾ _Jb‡Îßó›:‡Ôÿ!õ zÓô†£¦ÛS}øÍõšmÿ{þ¼R0ù"«ùGFŽ”­¬Rt§÷£Ôÿ³›ÕÉ/{äý³>-VCý#ölŸå±Ø«±V#ç%?™æµ¾´ÔdÓõ 5e…Ô»šõR¬ {ƒôf^›Sá‚°]çdöÀÒ‰BPŒ¹°Û¿2yÛÉGêž`’Ï[Óê4fb<;Ió/f\pâ˼n%ßbìý»Õ„K½Æ¿WȆ{å7iþl´–[$¶{R‰42¢—Ž%Não˜:9Æwêó]«ÙY4’D.E‘æ;ªK|Ã-ä:¥&ž’=ø¶˜[, ´ž©B¨PI šå˜@3Êܽa,Ю!wʺ¾z—ë«7©æûMVä)­dáaã_^)+÷ŒßНA§Ç€ŠÓË÷ ÿs Êt Kò¹î`µmèÝÏ"EÜ7®…‚€G¨Sü™–êø…:}vŸ´„L¼Xжߣô½´ *Š(ذf•óâ[ÅÅ]Š»v*òÿΛ–n“§®æââIBޤÂüÍŸfGÔKØ{!÷™'ÜùŸØÎ¬m–ÎÊÚÑ~ͼQÄ)àŠøfÙåód㜥ÞIù¢1j[$‹o+š"Ì|8²ŒI4[~aù#V¶’Îúáã‚u)$SC(䧨& ߯zØÜ2€Ž Ò‹Òî?.×è×ÓM¸“褧þFQ±hÔãíõø„|kìÙ”E$2 h^>€¡ ]4âAßšüX»`¿š÷æ×Ë"ÕOÅ{¢ Ÿ|½Gí)®Tv*ìUØ«±V#æ:Ÿ.ê1Ù- º•©é•,Ì }–ðÌÝ>“ÄÝ<'´ÞÙžÌÔ C‰qâú¸jÉǹ緷zœ5ÄeŒ}br±CÔ¬q»1ùæÎŽ{Ÿ)Öêõ·®Tê1”Gê’}ïh²´ŠÂÎ ("·E>J)SîsC9OWè’|0ŦðDd\—b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUþf[2Úéú¤GŒ¶Óù£˜æ§è)›Ο¨‡Ì?à›¤¼8³q‘úaï~×¶é7ɪivZ”bî§ÃÔ@Ôú+›gÇ>(ƒÞ˜³v*ìUØ«±Wb®Å^{ùÍgõŸ'}` ìî –½ÀnPþ·ºÞÕâ¾â˜ùFëë¾XÒn «XQ‹F¡íî¹D¹¾‘ØÙ¼M&)D}›'YdìUØ«±Wb¨=P_6ìilRôdú¡!Hõ¸žå·_!ÇÕŒž¼?®¿£Î.4Í«˜dš}f8Ù·¥Þ“µ*h¾ŒAkó#,¸¼fNÏí‰Ä“” kýÌi’þ[jO©ùZ &»’òê)%ŽâYË4ùsâY‹@†½>ìŒÆîïÙQͤÈÈ‚A'óøóeÙ H¼á­Íåï/^j–Êæ0‰aU#„j×%eÕöÖºZ]4²G˜åñ4ó›o1ù÷AŸJÖuùý}TxùFÂ2rA¢Q¸žJ†ù:ãqvŸhi¥.sxòÝÈû¹Ü=*}Ø«±Wb®ÅP÷Ð}fÊæÚ•õ¢’:u¯5+ßçˆjÏŽx!ê¿óïËÿSÉ^oÒùômRÞç£ë6Â:צþmü{fSà’}ƒ‹ÊŸóŸ7†/Êm ÍKsæ vb>ÉH¬nê§ý“)ú1L^% ÅèhzdNÒÝ(:|1(Û9Œ¦ä}ïkeÅšg¾RûÓ ­Åv*ìUæ?™Zœõ¿­èÒK6’±*=•¼ì­ÈYŒU«QÒ§6Z,¸â*\Þ¿Ùív“xr€'Q§§ØÆ<±mùle¾b†î×SR‘ßÈË?õ¡XÊÿÏ@3'9ÍÎ4G“·í¡\XLeèþÛûÉ£éº.Ÿj?AÁ6“Q¹Û+%6º×—ι¨É9Hú¹¼&¯Q›$¿zI#¿§Ã¢c•¸ŽÅ]Š äÒt©fK‰lmÞâ6Y#•¡ŒººU•ˆ¨ ŽLdeÈŽ«( >eqÝŠ»v*ìUثɿ3?Ó|çå­/¨&"G]¦¸ILÜvhô“æö¾Ïz4y²{þÈþ×¥æÅã]Š­tI£GYOB¡¦2 ØyoæN‡å½IŠk-28ïî¥ôã•E¨™‚«'`G|!í=œÖêså"s&1Ó²ÔõË}ÃÊ’jÝJo €\‹)ŠR@ª·ÖQ=%€C_âÞ£ úp´êûF&5mêz×7.›qz ÞKko%Àn¢V‰Kƒô“Ûá$À΂?Çb¬cóØ]y'Yˆþ̯ü‰u—þ5ÅÄ×FñKÜÇ+î=&Ù¡50<ñùÎ?ÊgÍì=”ÉÅ¢ˆî2mþ–ez7b®Å]Š»Y ,ŒŠÜ]”…=Á¥+ôbÆBÅ<ż…çÍELz¯™ˆ‰Å$Ž)gt ö)HÔåœC¹â³ý¡”V]FǸÈýž–]ä­KÐôo«iWbþ)%y&»R¤<¢ˆ@âMãJW##eè;C‹Mƒ‡¸Á$™wž_¡‘ä]Ëóî™u«yVúÊÆ#5ãz- kÕŠLŒiþÄ”MKí–yô“„ËjçÐó›ï/~eëº]ž‘{`‚ÂÄF äöèߺÓZžeÂrÀb7?gv¦§qN†[Ç ®ûdú>—ùžuKKcQˆØG*µÌÐrö€X£å¾D˜»Í“µ|XË.AÂãn_ô0Á…T‚7ôØåo` ·Š»v*ìU˜ÿÎLmõ?Ì(Ô¢¶“"~1=ìm@{žK÷fH|Q‘ÜKíÜ-Žçà· ¾Ròe¡r]FòQôaº©cÛncïÅ”^ojž•¬1qãÂ4^>P)œ¬Žï‹å•ÈŸ5l nÅ]мóÌ7ß™³ëwv~\µX´¸Š,7NŽ@Æ¥)ÍÄOE͆àGw¨ÐaìèጳJæyûÿ£ä“Ü~ZùÇÌRG?™uˆ9/Ù*†W@zŠ*Æ¿@l´kqÃ苟Ú&˜ƒû¿[>ò—–aò¦”tÈg7!¥išV@„³*¯@Oòøæ£?‰+y®Ôí«ËÆEmIîPë]Š»v*ìUØ«±Wb®Å]м›Ì¿é_›zLMÒà¥Oò &Ûé9¼ìñû¿‹Úè=•÷“úÒó5ã]Š»I¼ÍåËO3é§Ý1ƒ ELr@4î(hF.ó{Bz\œqß¡áçßò¬|×*®q­¡Ñ•‡½[† £¡¿ì°ÛÔÿ¢](Òè5RáÅ–$ž†âO¸J‰M²—xìUØ«±Wb®Å]Š»v*¥qs¤/qs"Å{¼Žhª ¦äáŒI4uŒx`g’B1Éä—‰ü½ÿW;où¿×-ü¾Oæ—Sþ‰»?ý^é‚g±ÍM ŠE ަ¡•…Axå$VÎçX䈔M‚,Ô:Y#†7šV j]ÝªŠ’O€k“$a)Y=À%Ÿâ/ÕÎÛþF¯õË¿/“ù¥Ó¢nÏÿW‡ú`˜ÛÜÁw \[H²Á&é"«i±T¢A¢í´úŒy 'ŽBQ<ˆäÿh^¯£úFßÕåǨµåZRž5Ë< ÕÑu¿è‡CÅÃãCŠê¸‡4Ï*wÅ]Š»v*ìUØ«±T«Öt»Û~¾­¼Éÿ„dñ>njáñt¹aüèH|âT#î}O-ßZ“S ë0öY"J~*s¤~{ì‰~ì7§âí]мSÎß—¾SÐL’;ß© ‰ßÕK‘<Þº‚¤¢ xÈR+MéóÂèµz,xëz³çú•eäO'éî²[hÖÂD5G‘=RèA”¶ø¤4x£Ê!âä»v*–y’¬ywW·¦[+¨è Å §¬âá!ä^qù=/?-]DzÇ{%³Er¬œÝ÷±s½,‡tÏÝ¡åo^ìUØ«±Wb¯6ó5ÝÙüÍòý™¹{kUY 5N@×cÏ‚¡d~’ñ}©šʸ!ÄcûîþtÑ. Žæ m¥¯¥24oÅŠ·4e¡Üeoc“œLO")æß”å­ï|Ã¥Á)›M¶=­TžR'!ÛâUvY“£Åû L'Ÿ7¾Ñ•½ºU´¸¿Ó®l­nšÊât(—Qмd÷éàp‡W†YqJ—#êRÊÖÑÀ‚4³×!]–gaœ{T³E¿Ï—Ï'é/2?•ðz@†aßÈýñý+d±üÏó ›{û‹m Éö”[S=@*Îá׈D´ý«ªôÎQü<þóþè3 D¶òö—•hòI\9[“sÉ€=@›z.ÏÐÇKˆc‰$ôÏšìUØ«±VCÿ89"Áù©ù‡`O ÙœD>Í!¿(zm·1LÉŸ í8ðê2éËï/»p¸‹?çá$+È1‚=F¹ÕЧí#¶ƒé¤0¬åv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»y-Ïï:ŽþŒ{VÀÿÍC7úîƒÚÇnÇ÷Ÿ÷ïĻv*’y¯LÕum!­4[¯©ßú‘ºNd’*;ŽQØ»ËÔâ׋,x£Gjïyf¯eç½öÆÆ]~[‹û÷áooåËÈP[ÕUP*i× Úi3hu”ÆÙ1ˆû¬«ë~byb(.ïõ—kiÜDfIä•bfÞŽ+ÐÔZôSìýY1†=Æõ@_»w¯iâQaj'M8†/VU<•߀äÀíPNøQ^$¨P³²'—b¯&Öü×¾sÕÒ>dMþŒÄ×Ý¿DÿÀñðùFgïýlï4ÒÎÅ]Š»v*ìUØ«üÆÖî,,àÓ­Ç%ç&™ÔÑ„IAÄò‰ü3?A„H™œÁ¶òi°Ã3Âr_øGO讬7ËÞNÔ<à —Pɨޟ©%IgG…zœÏϪŽ3G›çÞÏ{!¨í8‘„«=O ¤–úªêqAs*~Ž5y.¢;€¿²¨CÝ¿VS.Ð Žnïü5CSNCÂæg.”ˆüG_'©EÃB•)„RÌY¨¢‚¤Ô“óÍ96möœXÆ8ˆŽ@Vûý§šü[Š»v*ìUØ«±Wb©åÔÔOù8¹‘¤þð<Ƕñ™›Ü?ÝŠ*3e„œŽÂ¡j~’3oΑ ‘ÓŸÝú^»ùy©ýwB®k5‹˜¦ßįњMv>ß{ïð>í/C៫áøãúGÁߘZŸÔtµF¤×Î"¿¦>'?©~œt8ø§}Éÿ‚i~_BqƒêÊx~åú¾/"de Ì9!=ÅJÔ} æîß”ž¼¾ïÐö¿%Ê/§¨ÿòq³A«þð¿Eûÿ˜}ÇýÑy'ý/¿èóþfæïø>„Èÿù+þýïYÎ?O;v*ìUØ«±Wb®ÅZ Ab*EìXÿä[M~ÔïéIjkÚ¬%^Ÿìs§ù§²‡ œ{ëzö.áØ«Ï¿7ìg¾òÝ´vzsj†í1rI,A£r]D[þÈSQMüi‹­í8c,Û´óOç·ŠÝ4‰Y”õç±t‘¸Ž®\¨©ùaq#¨ÕUpýRò¤úÝÎi?˜£ôu—õMÌ|BqýëðÙvûp;m1™€3æœâÞìU~‹%Ìmº¼R+b¤XÌl^Gù2ÌtI+ð‹„ {˜÷ýYVGiìAýÎAý/Ðôܭ튻v*ìU‰ùßÉ«æ«hd¶”[jÖ„›iÍx°;”b»QPGL”eNƒ·{kb O ãÈþƒøÙ‰I¡~mÞÂt»AVɇ˜Íª'}RñÉÜ^~]ŸÛ#áÊ~žûxLëÊ>V¶ò¦™õ(_Ö¸•½K«‚8ózP7¢Ð\„¥oSØÝ“ .lÉïý‰þEÛ;v*ìUØ«±Wb®Å]Ч?ó…Ž©ùëçèÒgÓï¤T=J RŸøeûó&<ŸíZ¬¿×—û¢û× ¬|Eÿ? gY-1ÉÃkÅW­H:}¤ ¾~ÿþjÔ·ý!ÝÕ\Ôþ[ó¾Ðñ?É™þ¬ÓGþ%ßã?ÍOú–ãÿ¤;¯ú«å°;í ü‘ÙŸêÇý4â]þ3üÔÿ©n?úCºÿª¸þ[ó¾Ð¿É™þ¬ÓGþ%ßã?ÍOú–ãÿ¤;¯ú«å°;í ü‘ÙŸêÇý4â]þ3üÔÿ©n?úCºÿª¸þ[ó¾Ð¿É™þ¬ÓGþ%ßã?ÍOú–ãÿ¤;¯ú«å°;í ü‘ÙŸêÇý4â]þ3üÔÿ©n?úCºÿª¸þ[ó¾Ð¿É™þ¬ÓGþ%ßâÿÍi~òìhÇ£}VàS¿W–˜þ_ó¾Ð¿É]˜7ñúhÿÄ»üIù¹ÿVHÿäAÿª¸ø:ç/òeªŸŸìwø“ósþ¬‘ÿȃÿUqðtÿÎ_äþÊÿU??Øïñ'æçýY#ÿ‘þªãàéÿœ¿Éý•þª~±ßâOÍÏú²Gÿ"ýUÇÁÓÿ9“û+ýTüÿc¿ÄŸ›ŸõdþDú«ƒ§þrÿ'öWú©ùþlj?7?êÉüˆ?õWOüåþOì¯õSóýŽÿ~nÕ’?ùê®>ŸùËüŸÙ_ê§çûþ$üÜÿ«$ò ÿÕ\|?ó—ù?²¿ÕOÏö;üIù¹ÿVHÿäAÿª¸ø:ç/òeªŸŸìI¼·s«Þ~g vmª¼oõˆUx…¥ TÚ§ª€zæÇ b y9½¥;7‡¸^ÇüïÖö±à]Š»yçæƒ­K¨iþfБ§¹° ¯ n¾›™Õ?krC¿L!꽟×açƒ)¡>¾ñD_O&9ªj>sóè·ÑŽ–m`IÌâ)Q€W“¼ü=~x»}6ŸGÙ÷—Äâ5¶àŸ€{×ì­–ÊÎÞͲÛÅJÇ©¨P ›'Ì»É?5|Zм—Nÿɬ«7ë0õÿÝü_¥à=ýô?áRûÃ<Í+ôS±Wb®Å]Š»v*¿0|½wªÛÛßX!–{Nk$**ÍPÕGréï™úâƒÕó¿oýŸË¬Ç ØG±ÝÄs1=Þîï6 ¡y§Uòáx-½»7)-¦S@Ý Pƒ¶l3i£“sÍó^Âö£UÙwQ‰;Æ]ÿx?Šgº/晩J–·±›‡¢«3„±Úœ¶"¾âžù®Í¡”EÃéý‹ÿ6ªCXœR>w÷í_^m~aÛß.›§cq,-jÜgX¤d9 !Of§ßކC‹„Žhÿ‚Ÿ8ÓÇQ†r†j\$LºíÜ~ô'对=â]é—“4ÓFDð´Œ]Š+бè >üž¿ øvÜó ˜2ÈÊCÕ6k‘÷ù¡ÿ25»‹{‹M6Êw…ÕZyÌNÈO#Å*G9.ÏÂ2!Æÿ‚7mdÇ“ S1 qK„‘Ïhò÷±VÚ=BÏòúîþ{™íÐYÒF•ˤfET I¨¨ßéÁ#œ6 ºhj0{?“4ç.<• LÅ(ô±¿Å‡ézÇ™%•ì´û›‰î®×ÓÔwp+È•ä~·Úì3;&,`YƒÀögkö”äqaœå<‚¹’{ö³·¿ S¾‡Ìz Ò5ëÜZܿƒz¤ò§Z:1÷à ڈj×aíÎÊS)shžs´ }èÝÆÒ2…‘%&NL@‚±a¹ý¬´fÄvÙÔ˱{g eáÈ ˆÜKÕg•Ñâg:Ì¥¿‘nãÖ'â428PŠHûD6k±œÃ„P}+¶0ê±öHêgÇ’…Ÿó£·™ý~Ö äëÕ/ol¬öSªW³òB‡è`luSáù¾i솀jóeÂÀ÷Ükäiù}¨?_ú”¤¬wªae;RTø’£Çb¿NW®ÇÅ îvð?í¦×øRØe?ç Çéÿ05Ô|À,`«¥š¬(£zÊæ­O}Âýèaà =Síþ¼êµã 7Àˆþ±ÜþðAyËOM.úËOO÷E”*Äw~NXý,IË4“ã‰=å×ûa Lø°àÅñ¹Yø›/JòWü¢úwúÿ'5:¿ï ìÆÆfqÿt^IÿKïú<ÿ™¹»þƒáò?þJÿ¿{ÖsÓÎÅ]Š»v*ìUØ«±Wb¬sò;ýèó/‡;=þ™ó¦'æ¾Îþó'¿õ½ƒ ¶v*‘ù·ÌÖÞSÑeÕ®PÊÁ–+xâd•êUk½'Øbãêu8‹ËÿåfþbZšå d*Aú¼ÑÇÁŽÄJX‘ZìÄpº¯ÏçˆÇÓîz懫ÚëúM¦±e_«Ý§5ª°%YOº°*p;Œ9FH‰©†-®ÅVº,ˆÈâªÀ«v8 ‡ÍžHóF· Ay•¥¶¥Î!T‘½6ýØ=}ü22ˆ.»°{[>–2ñø€‘ß·É•ÿÊÈó‡ýKÈ«Ÿù§!À;Ýÿú'ÖÿÊ9ùKõ;þVžå·ò´…FÌ~­tûÿ±ï_ôGÚútçý,˿ǟ˜Ÿõ+IÿHw˜ðŽõÿD¥ÿ(çý$Ýþ<üÄÿ©ZOúC¼Ç„w¯ú í/ùG?é&ïñçæ'ýJÒÒæ<#½ÑiÊ9ÿI7?1?êV“þï1áëþˆ;KþQÏúI»üyù‰ÿR´Ÿô‡yï_ôAÚ_òŽÒMßãÏÌOú•¤ÿ¤;ÌxGzÿ¢Òÿ”sþ’nÿ~bÔ­'ý!ÞcÂ;×ýv—ü£Ÿô“wøóóþ¥i?éó޿胴¿åÿ¤›¿ÇŸ˜Ÿõ+IÿHw˜ðŽõÿD¥ÿ(çý$Ýþ<üÄÿ©ZOúC¼Ç„w¯ú í/ùG?é&ïñçæ'ýJÒÒæ<#½ÑiÊ9ÿI7?3ŸâËJ¨z´ºåôÖAú±ázÿ.v©åƒýŒÿâþ1üÑÿ©r?úDºÿª¸ðǽ–»[ý@¥ŸüS¿Æ?š?õ.GÿH—_õW÷¯ò×k¨ô³ÿŠwøÇóGþ¥ÈÿéëþªãÃõþZíoõþ–ñOXÿœ ¸½ºüøóEΣ‚þ]P{ˆB• !ÔìK/$Š–…í “žiË á‘&Çq~„ápŸÿÏÁãU±ü½½ßÁq«¬gµmÔ|Ð`!5`†œ«âŽÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯%›÷_-ß×AíJX͹¿Ñt?^ÔoØþãþÿö½32ž5Ø«±V!ç=sÍZDÖ±ù{NúôS£™œ[Í;FêE7Œ€*|]÷cè´¹„Žið‘ËÔüØÉó?期èü èÂÑÇâÍL.ãù7²Æþ'û!úú_órR,xµô"ù—4Å)Ù#œïâCÕp«1†ãÁ¢o…›î<†nr—ÝCáÝ™ž}‘Úcüœ¸eýS±?/Pø*]ó_›™#$Çuqé£ øÁ܇É–þë¸6ꌻcµˆ,“¡åµÿ¥ôŸ8FùNú(׌qÇ¢ŽVEf«Ho(}Úüq‡eeŒEþš,#òÍTëó’*VÒB¾ÇÕŒ~£›Ñú½óøÄ|ü±ËýÔ¯Í>£§šn%pÍ3³~¢ôðO¸Â¤~åž@Y_Ë:²Aýó<¢?õÌǺ¼Hßãv¯`c9vn Cê&UïàÄ<£-´dÓä¼ B$"­Ð9FOÉÈÌíP'§‚öK.,}¥†Y~ž.½ôDÙSÛ™•\…¤ÐTšôœçߤ% 7&’/:ÿÊ/¨ÿ¨Ÿòqs#IýàyŸlÿã37¸º òÛþRÿ˜iâI›.Ðþïâù‡ü?ã@ÿR_|P¾m´“CóL³Ûü/mØmBÇ‘§ÉÁÉéeÇŽ¹Áö³K-jJpÚÈɉ¿÷@¯òu¬ºßšRêçãôÝïnŃTуW. t=ÍžÈie¯íA’{ð“’^ûÛý‘ ÿ™?ò¯üÃEÿ|gÿwñr¿àÿú‘ûäÏ|•ÿ(¾þ£ÿÉÆÍn¯ûÂú±Ÿñ™‡ÜÝ’tתz}oþfæïø>„Èÿù)þýî¿X·ÿ~§üÎw„¿Lþcó‡ÍrI•àêÔëăú°Ê#.Dø³v*ìUØ«±Wb®ÅXçä`,ÞbœÝÈöœ|võÏñÓŽOÍ]™.)d#‘?­ì»wb¯=üâÑï5O+$öQ™M„ëq®•X¡ Xÿ’8Œ.^ÒŒ±p¹äô_Ë­"ïEò~e|†;²$šH˜Q“Ö‘œ) QãÙèqbóe8¹nÅTo6´¸ÿŒoÿ8±—"òÉøæjŸñž?ø†U‘ÙûýÖOë¹éÙ[Û»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Цÿó…ñ ¿?<÷xM-3P€(èCê–ÛÿÉ1™äølÊõY¯/¼¾÷É:·Æ¿óðkuo,ù&ï‘åýüA{,±?G YEçй’ä;Ub¸®r¤nø¬ÅàbìUØ«óž¥æ=&ÎÚ÷˶Ÿ^t”‹»oI¥&"§p†ØŽÙ“¦„$H‘§oÙ}>i˜æ—Û­þæ;¤~ph·$C­[K§\ÅÜZ A¡­qòâs#'gH}&ݦ«ÙLÑß„ÇÈþ¯µéÚ¶™«Eëé—q]ÅÜÄáŠ×³¸>Ç0gŽQæ)ç3éra58˜Ÿ4fAÇv*ìUØ«±Wb®Å]Š»v*ò]sýóƒO—§­{Žü¡x¿†ot÷Ok¤õvLÇq?x/LÌÇv*ìUŠùÏ\óŒ¶CËÚw×Ús/¯û™g)À/ˆ"µ=|1w}¢Óçâñ§ÁU[|ûؘ׿6.éèé¦ ÿ˲§¿û¸œ.ïò=•s¿ó¯îOo!üÁž÷AšÒA°‚ßô²1…@œßnAtöÀëpÏAen\ù ~Ös‹Í»yF®>©ù¯§eºD'ß•±ˆu÷^Ù¬ˆ¾ïÿ=O£¾qù‰~’ÎsBýPìUØ«±Wb®Å]аß<ùwYÖÖ4ù„À7±$%_Œ1Øšm¿Ñ™Ú<ð‡?›çþÛû=¬×ˆË ®1ÿ'ËçÈž›Õtæ^~4/4Ú“v7¨í£¡í¹JŒÙxØÎö+‡Ú˜I€Å”_óD«ìÙ9Ð?/õ;ˈæÕ£6–*C:1¬€~ÈQÒ½ÉÊ3ë¢Grô]ƒì§>A-HðñŽ`ýRò®žóòzº"ÆŠˆ¢€ª£`Øšb_p„@P3üÍÓ»]V:r¦)‡rÑ…½þO£6Ý’ÁsãŸðKìÁ Øõþ1Ã/|y–ß©ùe¥sšëX|1«ÀOó5ÏÐ(>œ£“aïøv_òjd>ŸD}çy}”>%™y¦Îæÿ@½´´ŒËq*¨Ž0@$‡SÞƒ Ì 4„f äúµLš\xǤóƒò—µ'XžçQ´h!kg\²±’6á'°9›­Ï Àz¼7°žÏë4zÉO63œd]Ž|Q=‘M<ÿ¤j:½œztwŽVg TP¥~"2XÀ›.ïÛÞÉÔkpãŽq˜È“Ë»ÍSÈ:V¡¤é·0ê0%yù¢’¦«ÁE~{Œܱœ£g°}•¨Ñé§ ðà&v9ráÉ™ÿ/îd¹—PкJKÉfHFV&§4ö$S¶diµÀ —Íç=¦ö$²Ë6’ˆ–æ¨õáé^[WDƒônxY¼mDzi$„D„t*Y¸Š{fO„oaå»k-b0ÈDy#Â=ÖxYõ\ù:}>ûÖ®èªgvÔ€ÌÔ€œÖÂpAÔµ½Ÿ®ËØóÖ²f rëêÉØšæµ ò7—5­+ZkBÑ €Á",„r,¤„Ÿ ÉÖg„á@õyaýÖèõ§&lf1à"ìs±ÜSO?ùz÷XŽÎçM„Íu 4r * ÅAøˆèGã”èsˆX—'síï³Ùµ±Ç“x§A}'~½Ä}ªžAòýÖku>¡£ypáB  Ûì’7$àÖç A·Ø>ÀˡŒy£Ã9š¯èwy'ä<ùsZÕu¥¹Óíx¡pÈ ÌHøˆñËôyáQ=]·ÎëušÑ“3(ðv9Ùï,ÃÊÖw6•¥Üf+ˆ•„‘’ »Õ`êd%2G'½ö_I“O Å á”A±þqyË-åĉ§¹G–FSÎ=ÁbAûY·†¯wƵžÇö”óNC £"yǿޡþ óGý[Ÿþ?ù«%ù¼}î7ú í?õóëf—ú«¤M~Ú•³@²¬B2̧‘RÕû$øæ»4f ·Ð½€ìMVŠyNxq×.—ÜK:Í{énÅ]Š»v*ìU}7Õì®gééE#×ýU'%d]—ÃÁ9ÿ62? €üŒ·ã¡êwTþöíb­?ßQ+uÿg3ó§dGÐO›Õ0;wb©/™¼Ó¤ùNÀ_êŽÔvá€ÒÊÝHPH¤šbѨÔGnO>Ñ2/§ÕRI´8ô»§oƒQ6Öç‹7w‘uùïůÀeôðžúZVVPÊC+A ƒÜbîÅ.ÅRí~Q…ªNiH­.\ÔÐ|11ÜâÕ˜Ô ò/4üœŒ.ÞÊz=ë¨êÃÿŽU“›¼ö*?àÓ?Óýz.Vö.Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©÷üá ^¿æ÷æýxñ´™=:V¾¶¢µöááß2cÉðÞÕ•êréËýÑ}á…×¾Nÿœýµ/ù]åÛÝ©¿?å~úÆé¶öýÞø²‹Æ´Yº>Ÿ(èöÐ0ÿeœåò ‘÷¾9¬e˜þ‘ûÑÙØ«±T=íõž›l÷—󥵬nYX*¿sØd£#A·åŒ$÷<NÕÐÜk^™£E­Í©]<–O4F_J0Ì9ªÕiß7³Ç´I— Ó3éO<“ÈqGÕF¬íµòûÙÏ?.µ=R^Õ¦HgU%Œ_¢•<Ü W¢×ç˜Z½dgóyÞÜíüyñœXÁ#oQòîNÍkÈ;cÞmó†å+4žíL×SÔ[Z¡œ¯RI袢§ðÌ>žYNܧeöVMdÈŽÀs?ެþV—šâA¨\yp Ðú¼.JŸ ˆ)ôñÌßÈãä%»Ñ¡­)<7¯»Ó÷sz7—õû2i‘êz{Ud¶x¤ixŠæ¿6#ŽT^W]¡ž›!„ùýã½4Êœ7b®Å]Š»y7æú'æ–ïÎÈßVFù%ËrðìùºìÓè#Íí{ × Íë¹ýKÌ÷v*ìU'ó>»—4kQÓÔt¢CiÎG4PO‡s틟ٺ©Ì1¯Ÿ¹ç\üÒ{3æE_÷Õô½88~× ‡÷œiûU­;Ó Öf øÇËœ¹ûù[Ѽ­¯ÇæM MSÓ•«ñP’¦Ì±ê=Ž“í= Òæ8îÇOrs‹¯v*ò¿Ìuú‡›ô[¢0øˆf«¾C,ny>£ÿwƒšù™c/«û‹6Îqû9Ø«±Wb®Å]Š»v*ìUØ«ó‡™çòÚÙ›x’g¸i9,œ¾ÊèTжeétã%ßGö¿Úl–1DHÌËc|…w{Þo­kšŸ›/ Vˆs»¶¶„»úÔ’{æ×â‰|‡¶{oSÛà wåFúþ“ú¹åý(hÚE®Ÿ·©ò˜Žò?ÄûüͶi3äã™/»û?ÙcC¤Ç‡¨¯ëÏÛö&yS¹v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T“Í÷?UòÖ¥%iÊ#üŽ"?øÛ/ÒÆòö·QàönywLJý7§ô§ß”VUòE¤„PÝËq9ÿ‘†!ø Îñ>Ìalë`ìUãÿ›ò髿/-~’˜=¤.úÏ‹ú³Ì¼ÜPPòËJ×a…Òö™/—Qä£ù}ä‹ý ÎßA6sêÍ4bÔY*HèC+ú`qïÛ=¡<2€«òz‡–!k_/ivrL“Ímk2¼ny¤aHV´éÛiÅB#¸&Ø·;c¾|¸ú¯“u¹+NV’Åÿ#‡¥ÿbãk%X¥îbŸ•0|Ÿ”§Ö&žAïGôÿãL¦|Þ¯Ù|: œd~Úý Û ôÎÅ]Š»v*ìUØ«±Wb®ÅXך¼ë¥ùSÑŠé^âöqÊ+hiË…iɉ; ìžÿFd‡ÁµrâÉ#ÞOÞû‡ ŒùÇþs~ÀÞ~EÜ\H°Õ4ë’Ag·Þ¿ñ—¶)š|™7¯å=ü,àOîÐ'ðÎoR+$½ï’ö¼8uYôÚm<Ês±Wb¬Íúÿ‘u[)4]_VôÕ&S2Û¬ h[uøQ€ßc™Ú|Ybx¢²´:ÜSqã½¶º­þ!+°üÁü¼òÕ¿Õt[Iý?Úh`ä>.ó:³}9dô™²‘s3ö¿S.,²æy{€=GÕ Ö´»]VÙY!ºA"#ÓÞ”4$vÌ 0‘£ÌêôÒÁ’XåÎ%qм§ÎMgæv‡&·OÑèd§¤œ¼KWj 8ò¯n»fÓM~¸y½§d‰žÎÊ1}vysþÑtõGHå’E‚®Œ9+) ŽàŒÖƒc›Ì¿)RH¯¼ËQ¼Zr\F!ŠE*ÈÁ¥H=^<‡Ë6=¡Ê=ôõÞÔa„“r£uðý<žŸš×v*ìUØ«±W•þsÂñ&‰©Ç³A,É]ú°G_øÍ¯fKêgìŒ9`zúGéz2¤ðÇ<{¤ª®¿&´y)ÀÄz*bÁØ«óÎ…qæ/OegCy$ð!4ÉZ­NÛ‚iï‹·ìMttÚ)}'cñFiÚ]Úùf Q˜ ¯ª}Vi¡q¬|U¨ïÜïL\}F¦RrÀmÅÄ÷ÚÉÞ[>WÒåÓšqpïq$Í"Ž#â ª(kCÅA8·v¿hþo(pìãâY.©Ø«Ï?7¬}mÒùEZÖã‹™H?ðʸCÕ{'Ÿ‡<¡üá÷~ q¤^ CK³½­LðÆíþ±QÈ}¹Íå‡ ˆ~åì_æt¸²ÿ: ükµvÅ]Š»v*ìUØ«±Wbª7–·kÂêçAÑeEq÷08c"9Œú\Y…dˆþïYm§iöD›;HmÉØ˜bHöÿbd”¹›jÓv~Ÿ÷Xãêĸ"r.c±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»a?™—žŽof æ`HñH–§þ®gö|.d÷Îà•¬àÑÃç’_dGë1zÿ–ôó¥hfšÃŒ–ÖÐÇ ÿ‹ðÕÍÃÀà‡ î ¦-ÎÅXœ4 ^ÜÅqæ×‚+ÓŽ–éà“Ó H¢«­EIÞ˜¸Z¬XI¼•~ö:¿”IÕíÅæ¨Ü¼%‚xgŠ£ý;­…ÆþLÅ1q%åÏÊHü¹æMjU® ¶2lðpfå*üjälH?g¶X;7Ø—'¥bíа?Î ±m䛘kCw=¼Þë̼]iʱ:Uò=¯Ôü¥¤CJr·Y©ÿ‰—þ6Ê%ÍôÁÅáèñèßÏÒÈ2.ÝØ«±Wb®Å]Š»v*ìUØ«Ìüü—Ú&º¾gŽÐÝØËa-ƒ¸6Ò¸p²t4û_¬eÜSÄûCš}Gæx¢`aýS¾ÿoÞ?%¥×˜oü¹ ­£CaåÕ™îoŽÂG‘Ìœ}ªmZîÇ%-­ÕögªÉ€F5rï$Ý~<ËÚ2—ÒŠ»v*¥q(‚ g="Fs_òEqa’|1'¸='þ}óbÉå¯;j„mscoËSo’‹¿÷Ý;}9”øŸebÅã¿ó•:oé_È:ÛVŠÚÚìÔ}RöƒØöC_lR~XÜ ü•§ Õ¢3ÄÞÜfr?áHÎ\+)|ÃÚ8pë'çGì ¿1±Wb¬Í>GòôZN³«Yi‹&®ñÜ\‰¥sê5]™P±ZŠ’\ÎÁª™”bNÏGÙ½³œåÇŽS¨X9{ù°í?]ò^A“N¹‚3­eFŒÛ“3Üž\$ñ ±¯-†ÞÙ—ÛÈH" :ÔøÚƒ2t¦wî㱥¨9<&¸ÅwÁŽXþnÃ%Ô+ªéXi×-HoK—Z¹QAÏiï™2ìó[J˵Íì©>A9qüö½"8âBí*™[œŒ m@9:š+šâ^RR'ŸEø»v*ìUØ«üÚ²ú×”%œ ›9áŸÜL'þNfwgʲ{ÞÙ|ܰ?œý?¡äËϯyWIžµ"Ý"'ÄÃû£ø®nÜ.ØÅáê²;ùïúSÜ]c±U“4‹ ó•UŠ!Ø3°úN, "ù¬¯@ÔŸžç±´º{­7\·]AQØ1ŠYÕ6ûŠøbé5ú~=œ¢#,Rà÷€kïûmè¸MتMæ½4êþ]Ôlr–HY¢2GûÄK(ÅØv^§ÁÔB}ßÜv,'òâÿë:Y±¬–R²þDŸŸ¼¶iõð©ß{ö‡üµþ.„â<ñH„½Cíâù3Á{÷b®Å]Š»v*ìUJæâH$¹¸N”¼ŽjB¨Ü°Æ$š :D0ã–IšŒE“ä’ÿ|¯ÿWÿ€“þiËÿ)“¹ç¿ÑŸf«”¿S¿Æ¾Wÿ«ŠÀIÿ4ãùLËþŒû3ýX|¥ú‘ún¹¥jí"é·+;D*°â´û@xey0ÊP§eÙ½·¥Ö™ áçϯ¼Ã+v®Å]Š»v*ìUkºF$Œ4˜ÐI$ⱜÄA”¹)6›æÍV¼66W<®J+# .ç`+—äÓNÈÙçû7Ú½³1ÅŠw.–â®ëþÔï(z'b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÀõHĘº>†(-Z6zŠô‰~ôP3sÙð¨_{â~Þjÿ1ÚPÂ9cýçÔ~Ê{Îg:×b®$S°N*ðï.ùJ?yŸÌwÞc¹—•¥Ç¦±BêògU܆øP§_è0i†|“3<Н”ì®|Ÿù¥'•ôË—¸ÒæSõ…r+Ãêæt.ƒ’š Ó¿¾,´Ð8µ6?e½³½v*ìU俞M%¾‹£ÅñIs<“p(4ûýC‹¨íReÃÌ–{in¶–°Z§Ø‚4‰~H¡GêÌgÖð〈èù+bØìUØ«±Wb®Å]Š»v*ìUç—_˜7Vw~g’D„Ùi&;kXÒY.™™7vRC3t wË89<~_hçŽz‚@áÇQˆêe¸øŽdùo#ù³]Õ59ôO0[$7)l—°2/é1@($nHî;à”GFÞÁí}Fl§x€xx‡M¶ýcô³ÜƒÕ»v*ìU)ó4ÿUòæ­84d³¸*Êô˜/O|1æàv®N 6IwF_sè_ùÁ 7ê“W׬£–£®ÞL­µJGmm‘ºøæKá²}?ŠŸæŽuÿË_8hмäÔ4]NÞ 'Ô’ÒEB®á¨F*›ß“W^¯–î­‰ø­îÞƒÁdüCf“´cëÉóÿkqÖ¢2ïÜKÑs^ò®Å]Ф:çœü»åÙ…¶«vbºd,+ŽÌ¬HR;§/ŦœÅ³³ÑöF£R8±ÆÇ+°ó›ß6þY5ã]ÛyuîîÉ,O¤‘ÄÄnINd{š¦l#§ÏTeAêpö_hðpË7÷’~uúYç’¼Ùþ,´¹¹[c´‹C‘uqÆ»7Àé˜:?†@»y¾Øì¿ÊN1ãâ2øÜ²ŒÆtîÅX7æ®{«yi^Æ6šK)ÖâHTZ0ŒŒ@’9Wå\ÍÐdžý^‹Ù\0ê*F„…_žÌ;ÌÞxµó®‘kåÝJ›ô”ÒÄBB±¤\ '¤-f`ÒœR2‘ÙßvwcKE–Y²d ¿ðw{o%žŸii+s–b‰ßù™);ø‘š‰›$¼.£ žIHr$”NE¥Ø«±Wb®ÅR¿2iÿ¥4 KO¯=¼«ÿ‹8’ŸðÀe¸'Ã0|ÜÎÏÏág„û¤>]X/å%÷¯åû‹&5{;† ðŽU ?áƒgH]ÿµx8uÎhü bòîÅ]мÃUü¾ó&¥­ê’Û_Çe¤_HÑY“ÕZ9E Ô5ÝO\6öZ^ÞÓâÃŒJS€ù|Nãà­“¡~W¤:­ç¯¨^Ý7Õ–áQR8øšŠX‘P:üGnصÏWŸµ‰Ç„c½u?ƒ5ÒüãkS\A¥Ý-ËÚð3 Äs­(Hôíçµ]Ÿ›$xx¹&˜¸NÅ^?¥'ø_Ï÷ú3wŽÑhß½ŠŸ J|ó]ŠÜý+ÿ~Ýýô##¶XðŸëÇ—ÏôÏBÍ+ôS±Wb®Å]Š»v*”ùŸþQíOþa¥ÿˆœ»Oýä}îÚoøÏÏýI}ÏÑt™µ½B=:ÝÖ9dCÉ^#‚–==³{›(„l¿=ö7dÏ_¨ DL¯sËa}Gü« _þ[-¿ä§üÓ˜Ê1î/kÿ&ËWþ©ö_ñ,ŸÉÞU¼òä—ou4R‹…Œ/¥Ën‰¯ _£$OÄ_É"üÅó%ÿ–ô‹iôÇ y=ÂÆ *¸ôÂ36Ìzd -Õ{KÚy4˜c,f¤e_ ?±•ÚúÿV‡ë$ž ëøŽT<ƒ¿ÅÅÂ8¹Öþõl[мw[—òÂóÌ’êWw&OT¨¡Œµ´®Mx–¡#âã×¶Z8©ó­tû+&¨ä”¥w¸ÒOÊýõÍ—ùFßC½Öõ2éZ›j2]zqñdt6è@<>0¤Š¨ã¶ÀS#+ªzÇǧɟ.£Oʇ"8Gvþí»€fy¤v*ìUØ«üȹú·“u#Z4¢(—ßœªü-rPæè}§ËÁ¢ÉçCæCìÿùÄÍ$éPÖ“]Çy{!ñ7³IêÝe3!ñÂö¬PÓ*º²:†F2‘PAØ‚*ü®ü»².y»Î>Q–¢M6òK~,(ÀÙ\Knõë¿LÕvœv‰xÿl1zqÏÞ>ïÔô¬Ô¼+±Wb©V£å­W»KÝNÂ+«¨ÐD(-D X VIí–Ã<â(stý£Ÿ La3MìóÌg‘|Ñæ+mnÉ iæ-i%¼*¬Åq¢²•"žæË.f„LK×ët95úl2Å+¡½ž»_Änš~YI6¡¯y‡Z´ít+·¬10¢™K–j…'•:W*ÖF'r/hâ1àÊG‹$Fþêü|žŸš×v*†Ô.šÆÂêõ"3µ´RL!SBþš–â æ”ÉB6@nÁ‹ÄœcuÄ@¿{Ë¿Çq½\ùwÊ‚Ý{ƒo,¬Ã®Î¢0Oß›?ÊãJoaü¤…G6{ò°?[3ò»wæ/G{,s_,’Ç9Œ¡ ÉU”Bøæ¯„èrt=·¢ŽŸ9Œ¡LŸ1;±Wb®Å]Š»xÿ“‡ø{óZòó|0Ü Ò¼­ßñŽt¸gÅ^ß¶?Â4óu_ÜÙ©eìUØ« üÉó© i6í¥·£-̦7¸â¢…-E¨ ãˆzgtµO‰¸ˆºb?—>fÔ4éõWQ7Wë š P^âG4åÑ NAÃnû´:ly•ìWmçí <瘋Œ«a[P/8ódó/˜õY1  @è3i¥Ã‘ûWšc´s#õw¢/´5êÖÏæ ÈšXÝLÓŽb.µXɨP: Œ3bà^·°»WYŒërÄÈÅÏ~(ôû¢7òû\»¶ÕâÒ¤•žÆè2¬lIXÝT¸e¯JÒ†™^»1âê°·›®:s"qä±GøHîå_&Cçÿ3Üék•§¹Šêtõ&™M#&€)ìI~Ù¡Ó‰z'ªö÷ÚlšA>Ã9‹”‡1B»‰ß~ƒÞÂ4¿-yƒ[F¿³‰™*H¸’@œÜuâXÔš÷͆MD!±|ß²ý›í x9±D‘Q5gÈÏ¿íQÖ/5Ô’=?WyVæÌ^dóâÛŠ°?ð8qFãÈ´v¾¯\%:“!,[oÎŽüúùµéz±òrÄ¿Õ.O"wÿvwÍVaûÿˆ}‡±$Oa{øy?ß0O"Í3ù¦ÁZFe>½AbG÷›`üu|ËØ|Ó=©„¯û\‘˜SJžcuIWÑ‹`ć!¡Ãrÿàƒ–qí#Ó4z'š¼ÇcðFšÒÖ+eyÕbPŸ±öÜ÷93›3]\<}‹Ú½©‚9¨ÊˆŒlÖÑéùnz›Yåj÷HÖm­ÄŒ-'•a¸·bxümÇ—Щ5êÂ'zµû%ÛY´ZÈBÏä#(ôÜÕ×xùôz?›üÆ|½§«À_\’–áº-YÈïJ¼Nj´¸»íw´_ɺpa¾Ií.ù|6øÀt¿.ëþqY5+›¿Ý*²Ü37&îFÀ xfË&xaô€ùf{=¯í°sÏ&×W2MŸèŽáðÈx®õ¿#ëÙÞª„4&£nàÆ•#g…¸˜µZÞÀÖxdì9Æý‰ëú0~!ìv×]ÛÃu å è²F|UÇ!øÑÊ$/ÐmDscŽH}2CÜwUÀÜìUØ«±Wb®ÅXwæ&­õ=!tèúEûp u!¾óEûó;A‹ŠwÜððCíoH0Äú²šÿ4sùì>oLò6ƒþòÅŽœëÆè§­wãëËñ0?êì¿Fn_7ÒaðñÕ‘bä»cqòÕ—œ¬—D—PkYàu¹ G5âȦHͮ曌\MV˜pÝ<³TÓ<ÿùdmä±Õ}}*yE¼nQzŒ Txf¨R@;©úpºœ˜óiª¥·ã£Ùü½>«u¢XÜëq¬:¬±+ÜÄŠÈ›p ±$)ÈW®y€ÈÀsLñmv*Ó2ª–bTI4çäËŽ,ú¥gñÜçËGÙ¸äÊr}ÿ¹ýlɶ^lµ¿¼o2êðß3F£êqËÍàzÔ@ª«Q^™©–2§UÚù´³„| f;ó#ŸÆÍ³<ÃtÅ^g}æ/Ìûû»«-E[X¢’H’éã¡`¬T:½Ã*µvS›(aÁ ¥o]‡AÙ¸ãdÉÄH¯ôGµ:ü¼ò®¡å›¶ÕeW¾¾•e’4nJœAêÝØ’kL§Yœd"¹_ÛݧU8øcÓ_&e˜n…Ø«±Wb®Å]м“ó!@󆋿˜IÅg+ÜÀÔzÿ­ñú3sÙÓ¸˜÷=·³çóL¸>Ÿ_"˜¬®¡Ð†V©=l4ŠÙ¼PìU/Ö´í?R°’-JÓë°Eûõ·iž0H ºîzuÅÊÑê2bÈ %ÂN×ïy«yûÌÚÝ4ï'i_W‚0#GTõ]l*H §ˆúp½xì-6^§%“ð¿÷Å:Ñü›®_éš…ŸœoZd¿h¥EIŒ“A$DïÈ‚‚µ§Q×jûc<–š5Ác•Ûñf:6“k¡i–úU—#mn)òrY‹±$¹$âè5š©j2’æQø¸ÈMSNƒVÓ®tÛŸînchØõ+Q³pw¹]D°äŒãÎ&Þ[ä[Éô­FûÊzÃ<2;@B˳…¯b(Ëôæ·´0ò~´ÿ´É§'iŽ8¾éøIŸæ­ö7b®Å]Š»v*”ùŸþQíOþa¥ÿˆœ»Oýä}îÚoøÏÏýI}Ï(òjØ>¿êB´ã/1pÇ^•ç·^™¹Õñpo‡{×Àg0©_pý&¾­žõ%¾´¿ølÔqfþ—Úû7åûùº–4~œÚ,|­ô“jµýãÅjbè9èÊòqó•ü]§gKE†›ÃHÇÃîºÞñï7ÊK©Æcú†o4¿Ý‡À=­ÿ,ÿÖ{8iü@}Sµ8f‡ø¾/ÐÔ?/]8CÆ<£ÿ).›ÿ‡ê9¾Õv_ž}’ÿ,ÖL¿1b‘<ÈîÿbXbhÿÕ‰üAÊ´÷nßþx¥Ò$ò”bG»—Þ Ð|Ÿey Y%«¯;x’)ârIQ‰åQšÍT fo«êžÈk°çÐbȸDFC¨#c~þl óþÊóY‰-d{x½9äBäXž5Í–‚0ß«æðD×aϬˆÆDŒ#R#¾É¯‡é¦_¡ÿÊ¿óuÿ337÷ÿ÷݇ÿ#þ“ýóò'ü¥zü÷ÿ¨y3e­þèþ:¾aì/üjáÿ?þ™Éù‰ÿ),Ÿñ†/ÔrîÜ¿ø!ÿÆ‘þ¬^“åp—tÀÕâ;{­sU©þò^÷×ý˜Ùø?©¹äy–P:}y¿äþo#ýßÃô> Ÿþ4¥ÿ?îÙoæ”RúÚlÛ˜J̃À0*ú³ ³NÄ=×ü1K¿†¤>;}ÿ¡%Ð<³®kV&çLÔ"ŠvF…¦™®êˆFõ®_ŸQJ¤w°=š×k°qàÍÄá2˜ û„HÝ/5¹®¾¯6£g%ïþ›Ï+IéÔ€hc­+è`sr{­É—‚Y±Õќ̫¿èºzN‡e>›¤ÚX\²¼öñˆÝ’¦ž€ Õf˜”‰__ìMôºLxfA”#F¹}´˜enÑØ«±Wb®ÅZ$I4rN*MnXG•¬ÛÏ~~mN@[EÑÊÈ•û-é±ôWý“‚çØS: 6.Õù÷¶;DöŸhK'ù8mpåó>§ºåíŽÅXÍžtMGÌóùZÑ™î G->Þ“KâNäROMŽ.,5–CÍŽyËò¾ï_Õ¥ó—«µ¾¦á8E0!‚…$ŠŒ¢ƒù[ ‹ªìó’\q•0þBüË×n­4¯2]´º,k‰.RPF*+ê3R¡yø¸§G¨™™ÛÞ÷ ùØ«±V-ù‹¬ Éú•·îêoC΀‘î“}¸šì¼‰ø1ßÊí/ôw•!Å&¿w¹o'àAÿµúr™Þ»ÙM'…¤ó™âýì Ó ô®Å]Š»v*óŸÌGQ¼Ô4Ï&i’ú/©Ñîž´¬lå?gábý2ȯí>§&L˜ô˜Íœý×Cá±µ;ÉÍØíon¤ášB†&zw@µû5G¾>#žÅaðê3—yª¿urø¤ß—çSÖ|Ý êìd—Ëö’[†mÏ í†=ÈÛÿ“†{YìÖ—s‚&?i¤üžÇ•>ŽìUŽùÏÌÿá]#ëÉžîi±5x™«Sz;uÉF6éûoµ%‡Œ ‘4›ºówœô•‚9h°Í¢]:ƒF•Zî(90 EW'Â:<¾nØ×`£«Ä9áúÎþRz¥©·6е UµdV„ ¡ªÐ PS*{Ì\<#‡•mîVűث±Wb¯=ónœ|×ù‹ä%¨-úJöÖÝÔ-õÜväŸS¿l·ç>Üg¼˜áÜ ùšýÕ µàÝŠ»|ÿ9«¥ÿ‡¿9¼•çDNú•œpNãnrX])¯¥š¬K\ú\SƒùåMûfÇÊ YâßÜõÙ¸òéñÌGŠ^ þ­ïcº©ùßPÒ5/.j–ÒÏ-¾¿õ¨õʱˆä‘–èOÃÏÇcØæF¨‰F@ÿ S¶í¬˜ócÍŽ@‹„Ç¿p?]=·4Ïž»v*ìUØ«±Vù™£þ—òÓFµ¸°"ò/FÀ9—¢ÉÃyìï}Õø:¨ß)ú~|¾ÕËÝ_ô¿•í ·+‹:ÚMãX€à~”+›â½¿¤ðu2®Rõ?¶ÙN.•Ø«±Vç¿1ËåM2Ú×G…#½½gK~(8Æ©NL¨ U€¡ì>ÎÌ’–RLcÏÏãðb—ù—å{t×õ £qh¬¿Xµ’_T(s@hšUØ]Þ1Ùº¹0„ ù~רé:”:Æ›k©ÛŠEsÈîTžª}Á¨Àñz½<°ä–9s‰Fâã»y—æn‹=ͯœ4ÁÆâÝ‘nÈÔÒ9·ì7Ñ‚Q^÷خ۞Ÿ(ˆ5(ž({úÇ› ѵH5: BßìÊ¿V¥lÊ~G9ì¸Ì$A~Ïì~Ô†»O Ðþ!¸î=GÁ•»7b®Å]Š»KõËY¯t{ë;qÊyá’8ÔfZ ÎY†B3÷º¾ÛÒÏ>.8 ”¢@÷ò¿ùWþhÿ–Tÿ‘Ñÿ\Ü~{{â_è´ÿÔÇúhþ·Ê¿óGü²§üŽúãùì}ëþ€{OýL¦ëd¾Gò¾³¢jÓ]j0¬p½»Ä¬$GøŒˆÀQIì§1uš˜N Õì=‰öcY ÕË&h¨ø¢z{ŠYæ%ùƒPÖ¯ommÕ­æ´leI‰®[ƒWÀ]?´Æv†§[—.8JǪ?­é~›}SÒ§Çéñ§¿f¦÷}‡Ã>^ûiåï%ùƒOÖ¬¯n­Õmá4Œ%ˆ=®m³êá( ãÞÏûÚmn,¹ c+>¨þ¶gæŸ,[ùŽÙ1 ì5ô'¥FýU½á˜:mAÆ|ŸAö£Ùœ}§ˆoÃ’?L¿Aòû¾ÃÏòÿÍËé¤(Èj É2§û"Ÿìsgùìds|¦^ÀöœgB ç ûhý‰g˜47Ð.¡²–ešá Yfá^(ìì8‚w;–àÍâ|Ý7oö!ìì±Å) HÀJUÈe·È§yzÚY|‘ ²-fšÖeI¥Lœøî|kšœò5ù¾ÍìþžsìHãÕ,süî*ûØß•<Ÿ¯izý¥ýì –Ñz¼ØJŒG(Àש•©ÕBp Þ?Ù_d5ÚM~<Ù`#Å~¨žpè{Ê·œ|§­ëÓÞØ@²[˜ãPÆDSUìÄŽ“SB‰r=°öS[­Öœ¸b xb> 9{Ë5Ðíf²Ñìlîà†8äPA•hwšBS$w¾‹ØšYàÑâÇ1RŒ@>ðu7’|ÂúÜ—«n¿Wk¦˜7«xyV•¯LÚ f> ½éòlÞÅv„µ§(€á9 ¾¨òâ¾þç¢kZ5¦»`ö`…?r/ÚÇF«Ã”㕇Ö;k±ñv†‡'¼±=ãñÉçäß7è³»é4ˆvõm¦^Ü•ŠŸ£|Ú^)WÚùýŽí}BtÄ‘ß pØóÒ‰Ñüæ+A5VåìÝX;L%õ.Xó'èÈeÖc¨‹ûœÎÈö#´rê}DÎ2 ñqqd?iø§ …:ûæ¥ö`Þ*ìUØ«±Wb¬?ÏÚãXØ.“hK_êUÝ–ð‡v?ús;CƒŠ\Gxo»wòÚËÀþó/Ù¿é¹|Þ‰ùåuò¯—¡´”Ò7éÍÿ°|Q~u=órù®‹OáBºžl§- ©µÊi·d+x°JmÀêex~4ņKá5Ξ ùwæÏ-ùNÇT¾Ô¡y¼ÂÌ¢ð%8ý‘!'ÅöÉíN¸^{C©ÇˆHŸ©»…üÉÖtÛŸ>ɨIigï!g’ ÄÜÄ¿þQø¿ÊÅeãÎ'-Ðürzç<Ásæo,ZêW }p†vPvŒÓ˜¥E ÷ÀîtYÎL`žlŸ-Ø«±W~nÝˬëš/“¬š²;¬³ <ÇÓŒŸõW“c‰.§[Ÿ40Ç™?{Ñ-mâ³¶†ÒÆ"‰|*¸f3ëX± q(Šl[Š»v*ìUç?™F« þç  ×`Už0 ˆåÕ¸ÊÕ˜=;e=7Ú}h䆫³Ÿ¸ Í ¥üå·{*Zé’~”e¢£:˜UÎÕ¨ø˜{q|7~ÛDãôã<~ý¯ï?$ïòÓË÷ºNu©êˆSRÕdº8£¬kR¼‡bK1#å‘™·gì¿gO)dÈ*y ü?³ŒƒÔ%>dÓõ-SHšËI¼6²)r ©PŽ€ÈA¥0‚ëûOM—6 Rà‘­÷ïòy–¹åŸÌéí¢µ¼‘5k{yVxY&tt õé¾X%ˆ×öWjÊ"2# ‰±¸»øÑS×µÏ3ù•´Ï.ëºLºm¼×0‹‰R•‹p=J(oü0€ì{C_ªÕœx3b8Á³G~›^Ïc†(íᎇ¢UD_Q@>ì¥ôx@F"#TÅ“±Wb®ÅRÿÈÍ,y·þr«Jf¥——ãžòOcihUµ.$\¾gÈ=©ÔxšÉ÷F£òý¶ýɼã±Wb¯•?ç<ü²u?Êí#Ì‘')´UV§Ø¶¾‰¢s_yRŠbðÿ.j¥t7P&¯qoÈâÎ ?ü09Ìæ‡ Èó|ƒ´0xYçâ~]<©Ãv*ìU+óüú^ƒ¨ê6ËÊâÚÞY"î*š<S–နÀ=îggàsÂå"O£ùùƒËRy²ãV™õ™V{ˆÈ<èð–;nå‰^£§¾m2jø'ÀÏkªí¿Ëêœc‡Ï»£Ð¿.õ›ÍoÊö×7ìd»‰¤·’f¯)=3³zš ñÌ f1 „O1ÛÚH`ÔÊ0Ø5Ýl«1]+±V=æÍËzµ‘¾ó_¹°F—ë ÌŽˆ>&MÈ4é÷fFŸ,âj=]§eëµgÄï=©‚Ú~fÏcl‡IòÌ‹å[2!YðPiS'·èIß¾fËD õKÔ^/³±É#âf,·­¾ë¿Ç'§éz•¦±§Ûêv/ÎÖåÆH¡ˆ#ÄAÍnH’ ÇêtòÃÂ\âŒÈ4;v*ìUت×D‘94n ²ÁPƒ„@l<É…ü§çmOÊ—‹k’~ªOr€Éÿeûí&œp{~ÙW¢† s?¸ü‹Õ2ljv*ìU†~bùn÷\Óí®ôÀ[RÓ]¤Š54gWãÈ-hR>X‡ ö´a§É(äúf(þ>,;TóGœ<×eþHh®%(·Œ±È¬ÜHmù€#šŸ§ ¿Óvf“I?ä°>Çèúž™åÝ>=FÓ´i¦Cp‘•¥@ç!¬’pr'èÀñý¡œê3O(_ÙÈZq‹€ìUFêÖ Ûi¬îIo:4r¡èU…ųYc”M»È4é.<…æi´=Aè{¶ íöhÛG/üjÿÙ˜šÌq±Ì?GÿÀ×Û(ã5&Òþ„ûýÝþTz=4ÑŽÅ]Š»v*ìUØ«±Wb®Å]Š»`_˜“kœmⱂUÓ£"i.a©>ªŸ†¼7P½j{ü³c ÞÎï˜ÿÁ 6º¡QÅQ”œ9rÜó÷û˜Ì˜>e†Dͤ dˆH ?H̳¡ÆO'ŽÁíÿiB&Q—™ˆ¿Ñö„&Ÿ¤k~lÔLîOU¹½Qt;ì6~¬žL°ÅûÏìolê8Íž#êÈyÑîˆûÚ-m¢³¶†ÒH`Eù((3C)Kô>—M£ŽLˆ÷ •°7»v*ìUØ«±Wb®Å]Š»v*ìU ©j6ÚUŒ×÷mÆV§Å@£Ü†O33AÂí.ÐÇ£Á,Ù F#ûó,{òÛ@¹óV½7µ”­­¼Ÿè1Õ¦_³Æ¿³éþWÈçC‹„@ÏòÔä×êe©ËÔì;»€òiɹîÅ]б{Ï˯'_êGU¹Ó®™½Iy9µ«F¬ÔõÛ~ø¸’Ð┸ˆÝ üÏÓ|٪ǧh^ˆ6‘{ð],iÄFb ¯«%h±Ò„:¯}†´1ä•FãäÌ|³¡Ãå½ÏF…¹‹d¤’Rœär]ÛébiíÍÓáà#Ü›bÜìUdóEm —°HbV’G=TT“òBËÅ|вù«Îš·œnTú13-°nÍ áêD(~c!³öSLsêgœò/yýCïz¶Rú3±Wb®Å]Š u@i:Uî¦ËÏêÉ0NœŠ) }'l [­Ôøg“ù –äÿ0ßÚyR÷Íg¼õ­fšImW¬›L¢ïJE:ôé9 è<×bö–Hhç©ÔJâI1ïî¡ñä:%Ú'æ.›u­@u ;½~º‚ª—«7ÉŠ-ENìØL6p´>ÒâžqÇ„CŒí/ÛCâ^§•=Û±Wb¯ó&¿æ«ÛOSÒõ³Ó4ëÕÓ-m¢4i¦¯vôåñ}hó¾Óí^IdÉŽ|0„ü8Ôþ7Ý‘ùGUó«ù‚ëAóA<61†¸¸Pë .% Ô0=Jvß|Œ€­ÇcjõÇS,9øH€Üí{òª®~æ}zÇb®Å]Š­‘Ò$i$ÞCÜÞÎ×s¨?äú1Wæ3$ÁõyÎ\’™þ"O̾äÂã;v*óïÏ?*·(|ãåÈÓÕ¹¹ÓgšÒ *^æÎ—vê¼±(Å!ùóùC©}oÊídÍY,'’0½Är~õOÞ[îÍhB§}ï{U§àÔñ<˜Ûõ3üÀy—b®ÅVMSÅ$ ’U’DaPÊ„àFi”$bAÃ˓͖žI½ºòö…¢Ë>¦ËÏS¼ Í"™H«->ñ^Gz}9³:s” J[žOb{.zèG6\ NcÒ:mø³\­“hþh–o2K¢\AvW°CE¹€ü3À­ϧÄM[¦ÛûÆÉ‚¡Ä9‹¨ÕöhŽœe™DðL‡õteÙˆèÝŠ¥>fÒäÖ´ CK…¸Ís ,DšP|J ð$rÜ8& ›ÙÚ‘ƒ<2@ý)¶óÍΕå‡ò]Æ/镊[%B(¤KÈr)NDü]Úñͤ´¢Sñ¶æö™;9u#Sƒ‚ľ^Šz‘4Ùü¹å+huvòRy„¬a1`¬NÃjWß05S2˜í­@Ôê¤qî6ºÒ{¦êÚn±“i—QÝC†)$ˆòPà"½ÄtÊ'ŽQæ)Öê4¹0'EîÈ8îÅ]Š»v*òßÍ­*kY4ï7Ø76r$S°(Üásòj©ùŒÚvv^q/c쾦3ÓÏ”…¸Ç›6Ñõ85.×S·þîæ0ük^-Ñ”û«TfÕæµši`Ë,rçŽÅÆv*ìU„ù×Ï^_¸IÓlžmNáE+©1щQÁWwjŽ›}8½cv,u19'*„y÷ü{ƒ ºÑüí`bóβޤ–’G+Âó™P°qQÅTÖ…GL/C‹W¢ÉzL[ .¶ýdùý¯Xòö·oæ&ßU·R‹(!âcRާ‹)?>žØ#_¢–›)Ç-ëí ¦.±V7çO+Eæ(”MFÞ²YÊzr¦èÇù[ú]¿cö™Òe¿á?Pý>ðÃü“æ)\·—5zÇ©ZV8}M™–=ŠþÒÓé,ÔëtÔx‡'ë¯`=«Ž§tÙ%rÑ/çG»Þ>ÑîfÙ¯}9Ø«±Wb®Å]Š»v*ìUØ«±Wbª/km#ú lãpÌŠOÞF#ÞÑ-.)1û‚¨ €è07Mâ®Å]Š»v*ìUØ«±Wb®Å]Š»i™QK¹ ª f&€Ô“Š%!g`{*Þþey’-LfC´nwØ(4iO‰?f1ý´Þi4þ³Ì¾íOoKµu#ûœgý1þwèí{¶§ÚiV6úu„b+Kdă°ω=Iîs-Ä„@EbÍØªI®y¿Ë~\‘!Öu¶šAÉbã$²q­*V%b¹¸ùµXñýF‘Ú^¯¦kVÂóJ»ŽîÞ´/Äø0ê±Å³XÌ\M£qlv*ìUØ«Îÿ8<Åú+Ë£I·z_jÌb!~зZû-“Ü…Ööž~pŽrFy+BÿyvÒÉ×Û^ïÇÖ“rú¢‹ôf<—Ðû ³ÿ+¦ŒÔw—¼þ®_C‘vîÅ]Š»v*†¿²ƒQ²¸°¹ÛÝFðÈÇ‹©SCã¾Zu#—¡.R‹Ì­¿)µ/­Ei«úÞ\‚C*[«H“ÔÏÀ„‹rÏâ1{—ŒFyo7[ý܇½WÍ–š÷›t+ZX}/KT™¦Qð}]¸†"›¡8(þl4-³¶4óÔë1i£c£ÑÛìCÍê9[Ü»Ku=wJÒ_®ÝEñB÷"ÝVW'‚’ èFØ@·UÚpÇ U{;˜”Þ^ÒüÛåi¯´}6}Jçô–à°&xÝÔ– ÍÄnÔ+óÉ]žŸfâ×i ð^3’\w/çy󮼓%ùsQÓ÷XÖ¯“PÕuL4Ñ1tF(´bµùSld\ÎÃì̘Lò昜òVã•=¿—d…Ø«±Wb¬sÏzèÏ)êsƒI$ˆÛÇãÊr"Û䜔Fî›Ú Oƒ£É.¤WúmŸVÿÎyTùsò7N¾•8\ùŽòóV´¸´‹è1À®?Ö̇ÅËèLPìUØ«±WåÜ'ü«¯Î¿:y¯¥f—WÁÄÀŽn-v÷·’¹®í\îyk4üx#“ù§ì?¶™æi_ŠWçwùÞþIv‹¢\y.çM󯸋qõ 2Ö ÒˆŒ¡«ÍÅ@V}·ùíLž\£(1Æ<Ë•¬ÖG[áÒÇŸªDíu\‡>ç§éú¾™« ›L»Ší`NV…ƒªµ+JŽÞ­ž9G˜§Ï¥É†¸âc}è܃ŽìU‚y³Ìžn¶Õ΋å­טƎºƒ)‘xIׯJ2‘ñ1Ìí>fßÓé£Zl_çÅŸ‰ ÿ@òÞ“å«gµÒb1¤„4¬îÎÎÀPSO¸ ÀËšY ÉæµÝ¡—U.,†ë’m•8.Å]Š»v*‚Õ´Û}cLºÒº£b:©={ƒB2xæc GG#K¨–‘Éq6óËmFãGÔõ%ꇄðÈïl غm"­z†:ûTçI GW­öOØáªÇÈÿGê?§dž5Ø«±T-âÇ5úÚ‹›Ëhä0*ªú¦¢¥NTì$“ÁÅÃ}Þóîy<’ùÏó*Siõ 6õªÃðšüMö¤aà6à ÜF:>ËOO·þ:>ß{Óü¿¢[y{J‡KµbéKÊßiÝYˆíòÀñÚýlµ9NIuLñpŠ»`?˜L—Q§˜4E)¬Ûqi=šeMÃ-?m{x¼1«Ø½o³]¿-,Ä%*q—óOêûŽêQóTzí¿Õ®ˆV€RXúz€mÍGüHvÍ&«Lq›Ÿ¯ý‘öª£‚d ÑççÒ:{™>b=›±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÏüìßyŸRO(ùeL­3úw3)øZŸhr¢/Voó;m–½Ræøÿ¶~ÕLŽL}<§!ü^Cú#©ëîç×¼¡åK/(é)§Úþòáè÷—$|RËMÏ²ŽŠ<=뛘Òé†(Ðø§ø¹.Å]оr¼¾Ó®ï|Îúµ›ên½¼ú–—láȈ3´|”)  ªù>ø^fS‰3â2h2ï,Éwå2hÞGÒþ¯4—H.¼Á:¯9DÅ]Œ\Á *(^;w¯íbæiÉÅ’8£[ï'¯àwNÅ]Š´HPYˆ I;*ñ 'oÌOÌIµW«èzA_@²R6>ÿfõûm‘™ ãö&“óºÎ3ôcßõ|ÎïYÊPv*ìUØ«±Wb®Å]езл`™O‡Y5;N+¬<æ¸Fa“á­Ojdá*y/i»:ˆŒ‘þóa¼¨Výû}É3ù#ÏÚ5»ZhкӥS¢\ÇD}‰T“’¯^ªÕÉqÍÖžÁíY /YØýŸùMt4Ñî®çÔõImõoÑñjÚF¡”YäaÉ£$Õ‹3*C•>¶ñx€¡µÑuùÚ1€0ã8ç9þêÏÉí¾UÔçÖ|»§jw+ÆââeÚ€º’¥€ðb*3Mž3 >}ÚzháÔNä q”¸Å]Š»v*ìUå_ššLÚeítÂ#º†Hã¹÷uÞ'#¾Ãƒ{S6Ý›ø Ùû5ªa=.MÁ¿Oë ÛCÖ-µí.ßTµ?»jÉÝlÈ~G6o5­ÒKO–XåÓíéŽ.#±Wb­¢€t’¡{{i§[Iy}2Ák«Êæ€R{ [0ážYÀY/*Ö¼ã®yÎðè>S†HìÞ¢YGÃ$‰Ð³·DOÄý4ÂöÚ>ÈÁ¡‡¨ Ë» ÷wŸÇ›Ó´KKë*ÖÓR¹w° In#‘:îh6äzõÀñÚܰɖR„xbO/Çà#ñq]мßÎþGœN|Ëå€ÑjQ7«qmÅÈë$`~×ó/í|ú‚y=¿³>ÓÏM8ÆR11>‰ÿ7ÈùaÙ•|Ýo®Æ-.©­ýäGa%:²Wñ^Ù¥ÔéN3c“õ¯²¾×cíN£˜ ÇIyÇôŽžæO˜fìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZ$S°N*M0-oÌWþb¿_+ùMLòÜÜÆiÈ~ÐVì€}§þvºMz¥ò|‹Ú¿l¥œ.Œìv”Ç^ñ.ùué·>¡äo$Yù;O)UŸV¸Þ]×þ+Jî~'sà6o%£Ò 1óêÊð9ŽÅ\H§`:œUæš_æ¡«ë·z˜1YùL2Cqw'RÉÄúl ø‰&”Tûáuxõ²œÌ¹c uΉä/Í J{­ú[e;…q( z†7¥O@J°÷µKL‰‰¢Ìü¡ä-Éë$–eîu ‡o&§>5¯QV¢§Ç¹Àçi´pÃËsÞÊqrÝŠ»y×æçš¿Bè¡í$¦£ª†F¡ø£¶HÞܾÀú|0ºÎÓÔðC„s—ܯä//Çåÿ/[Äh×w@\Ý:À»¨¢‚6!EÞsFËßû=ÙÃK¦ˆþ)zÇõ2|‹¼v*ìUØ«±Wb®Å]Š»v*ìUãþwHõmcÌsê/Õ´XO·SÅL·A@s±iÁ=ȧ†[öôF|ÙåšÃð9Vÿ3÷/ò¶‹ªèþfÒtÛeþ§=”Zå°cé•&_‰MIÙ¶Ûñdl2ìl¬xá”𘠒<Årøí³×r§ÐŠ»v*ìU*üÐåbÿÎOiœÓÖÒ¼©ÏQž¢¡?FÝöÚòDËà6|ƒÚ_¬r§åÏí·éM犻v*ìUóÿüæ?‘¿Æ’º–¡o=KÊóG¬ÁAñb¬WB¿Ê!vÿ¨1H|¡ù}«þ™ò¥„Ìܧ·_ªÏã΄WܯúsÕãáÈ_,íÝ/ƒª˜è}Cãûm“æ3§v*ìUNx!º†K{˜ÖkyT¤‘:†VS±ˆÂ Ã8LăD<·R°üÂÔêÕî-¼¹å›7’5–"¶°˜Uˆ 8ô#ĪœÙÂxcFŒ¤~/c§Ï Æ# %›,«cê7÷}å1ò‡—¼—%•Ί5Hõ÷žD¹ž* I+êF€ò1är½Fl–%\./jëõ‚qËÀqP |By{¶zqÇ i J(Ô""€UEtf6òò‘‘³Ì®ÀÅ ¨XZê–Sé÷©êZÜ¡ŽT>¸ð#¨9(LÄØnÁžX¦'D1ü¯Ðä³±±¾žâê>Yž"_‰hå ˆ˜Šü#ìÓ¿Jæ_ç¥dŠï´™„å(0>c¯¿ßlÖb·†;xc‚%TŽ4UUИdÞåÐNfD’l•ø;v*ìU¦eU,Ĥ€¹Å [ϼÍù«¦i¬ÖZ OQ'€‘jmÑŽÃuÝϲýù°Á ”·–Áéû7Ùœ¹}Y}ÿeû>?$·Hü¶óžîSWóµÔ¶6òŠÙ€ð=£‹ìÄ=Ørñ®l¢!ŒTCÓÃ. $x0Ä_ë=P^[–ïÈo»òn®ÿè72i9ÙK7÷Ri¼å—bÜÝÑVšÕ~î¿.oSÂð.Å]Š»y–¿å?6y«Ì’[ê7݃ÛÊ¿ÝúmÐ"V¦JlÄôùPa{jétša( ÈyŽ·æ›ÜŠÖµÝ òïN:6ƒ >¬àòe$m$íÜï²þ¡‹FCŸ´²x¹Cñ´_ÞSŸ%ù¾×ÌvEq4k­"Ÿ¬[©!›ŽÜÀ úµ¦¶;&Zl„€|>‡ôk*ÅÒ;v*À|åù~5)ZÐÕu¥>£¢·™†üâþýNû¬ìig¥”c2h}2ãû>ÑÑ(ò÷›ÖýæU6š”GÓõä^ Ì6¤€Ó‹{ô>ÙªÔèˆÞ<»Ÿ¨ý“ÿ‚=LcS $~œŸÃ/qóåîfù®}AØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wbªw–¶ïuy*Ão«Èæ€Sà0ÆFƒ«ÕâÓã92ÈF#™, }G^üÁ¿:–¡h´ÑO¬Ü5Tp¯Ú•‡Ù_ŸÃ7:m†çrø¿´^×fí){†.§¬½ýÃ˯^á×|Ÿä½+Éö^ õ¯¥ëW® I!ðʵ迬æk§Òéc„PçÞÉ1rŠ»b³þaù-5ÑæÕ#õëé»qsc±S0>g•=ñq»¾ü£´Ò>·ªÝêS\ùbÌ=ëXÀ¿¿tKqäX%Bþ߇†]>͹qÒ+ò¿C7¾`¾ó½‡è½ Ñ Ó-A?x©`Nä¿èXíÓ}Ÿ‡Šg 1èõÜ娫±T6¡k¥Ù\j²­-‘¥•ÏeQ]¼Iì1a9ˆ‚O ùîÚÞïó3ÍÚ¥û<6 ?dŠÅ ÃÔ^í·Žei´þ!òyÈÄêr_ŠG"yÏòñÌ–R~‘ÐA,ñÍ­w,•¬gÝM$)r3cÙÿÄG:Ùë}–âÊ"æ#éûM$>sÓ<µåWÑõ(L«¬$êÂ(®s,|jf¥MjæFšsÉÄ'ÉÙvF£Q«!¨Šê*wã•=§4ÏìUØ«±Wb®Å]Š»cfóÞ…å…hî%úΡO†Ê ×·3ÑÏs'–y9rwØ™õ[QþqýìÞ×óóZO€~ŒòÑmÜòH ƒÿ3Â×ùsm‹1y—³ÓhtºcÕ>þ¿³ï÷½[Ê–¾\ò‚¤öñ}sUâÔ..Mz ùoâNL–N¶yyì;™ŽEÃyçæÇ’š4oÒ:|u×4Åg€(ø¦‡«Åîi=öï–c•aÙú¯T~’Çüæ±æ-/ê÷Mþ嬀Kšõ‘z,¿OF÷ùŒ¼¼Çov_å²Ü~‰ròòý^L¿BìUتÜSMk46Ó{‡FX§ ÆäP5ƇÌRŒd …€yw¼û@òM§—ÅÇ™<ãq÷q3ÉYÉo´ŒXUÝ¿gúô/S¯í©êk˜Àû¼‡ã’A¦¼žlüÁ‹WÐí¥…¬‘K< qýÔ{ôØ4€qâ;}'i©ˆÑè<²â”yžï(óüe¨~gùfÒ'{yîTŸÐôcZQNR)mŠÓ§‰ûðSÏàökS2"®ÿG¿îeÖ—PÞÚÃynKA:,‘–R¤« ƒFŒ]\GŒeÌl­‹[±V;æ&é^h†· èj) ì`sÇí/±úÅÛvgleÒ·Xþ®âóžó?åüéc¬Âo4bxÁ2’VŸñ[ž‡ü†úŽ3Ül_zö7þ RÅ|Lcø×êùyr÷3}'[Óu¨=}>q%)Î3´ˆOfS¸ýY¨Ë†P4Cï]•ÛZm|8ðÊûÇñxüäÃ+v®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬sÌsÒ´0ІúÕøémû'ü¶Ü/˯¶e`ÒJ~Aä»Û/gƒ|LŸÍ?¬z}þI^ä¿4~`\G©ùŽGÓô0yCYÔïû˜Û¥Gû±þŠæãã>G¯×jûS'yTzDráúNïeÑô]3A±M?J·[{TÞ‹ö™»³±Ý‰ñ9k~,Q€¨Šü[Š»Hüßm¬ÞùzöË@!u;•#³ð ŽÀHCv<*.>¦3”2ò7ò•†³ªÚyI‚It«qq¯ë %iøh¦¢ª©Où§réΚ3Å\#ÔYåÿ™%Žmòwå¨Uþ­|çá;GéÆMy¡*Û~ÏÜ1r;2y¤ï÷«€P@ÀÜ7Š»v*ñ?Ío4Ï®jqy/E&Xã•EÙCýíÅ~ê?e:·ù_êä£MEÚ:ƒ9xqüIåÝ K‡OŠ øî%ûÉ[í7˰öÍþB§/Ž4šå­Ì?Ì—ú^¬ZæÂ–«rŒ~éۯă¡÷_Ç0óhã=ÆÅÂÏ¢Œ÷ªÇÎ>lòTÉaæxÿM¯î9rz‘)Ù¿Õ}þY§Í¦”áÚv´º!Ì8áß×ç×ãózn‰æ-#Ì6ÿXÒ®V`)êD~c'³¡Ü|úxf)÷úÒê9_—Qï ¦9Ø«±Wb®Å]Ф¾m»¾²òíüúdO~c1«;©“á.Ôü òú0Ç›­íŒÙ1é¦q‚eT+žý~Þuùoæß,è6¦j%ìõ ¥gžæD¬l~Ê/%«#ù…*NY8’ñÞÌvÆ—MŒãÉq‘;’6ò4OæÅ–­/—íô¹c¸¾¸•½ ¡eÙ~%4¡nŸ,a³wµy1ç8#Œ‰JGb7çCïz¶T÷®Å]Š»v*ó¯ÍF_ÑÖ^^³V–óT™r€³:FG 7«HVŸ,³xÏlõ¼cˆs™³î¶¾OÒ/ÊŸ$ÃùuùuåÏ&D I¥YD—eiG»’³]8§f™Ý†\ùf8«±Wb®Å]Š»|ÿ9§åI<—ù£å¿Í}:-5¤[}L ëwb¢3ÈÒ€ËlÊ‹þ£ey±ñÄŽ÷Y¦ðËþ!ýŸjU±ÏO ŠEWÇFV|Æs$Sãò‰‰ ó ð1v*ìU¬húv»a&©Â&¶’†•!•‡FV‚2Ìy ‡'I«É§˜œ òéí¿-|‰õ¤–}_V·$ÃkêG*Ã"‹TPAþbHð®l͘WÒÆ;G_8fˆ±ó'î÷²¿"yæO6½ôwPÅk,,­m HÚ"7¨'‘âz°P7Ì]V—ªÝÒößc ‰‰2™®¿Ž–Ís çÝŠ»v*ìU-Öuý'ËößZÕ®’Þ3^ w’B;" ÏÑ–cÅ)šˆrôšº‰pãýÃÞ^guç?7ùêí´$ÙKokÒK• ”)?iåû1‘¯¿lÛaÐÆËröº/g°i‡r%.îŸ.¿™—”%ô)—Pó+_T¯3 ©µF&»†ÞCîû“ß2%“¹ÌÔv”¥´=#íýQUTUDP¨ P(ÊÝcx¡Ø«±WƒþcyróÈÞb‹Ï^ŽšmÌŸé°-BG+ŸX‰'Qàßìrür½¾! ^‡'>‡ôûÃ5ѵ{=sNƒR±~PÌ*Tý¤aö‘‡bXùî³I=>C ó‹Gââ»v*‘ù§Ë¾iÓÖÊâW£q$R¡¯ÐÕkCQ_–.˳;JZLœQØ¢€Ôï´oË¿/*ÚAµJ[A_Šiˆ©gn½¾#ôع:l9»KQê>óÜ<¿CÎ,<æo0ÛMæÄX¾·$ÂâÞÖDU&`­D ^¾ÖÿIzÜý¯¦ÓHiÍÐOóMû¹}ݲÓë?U‡ëßõÄUôÄ”ø¸×zW¦Îòðñ«ÚùÒ¶-nÅ]Š©\Û[Þ@ö×Q,Öò2E"†VàâÏIBBQ4CÎu¿Ë-æ:Ÿ”.ZÖå!hÎ@ùG'QòjüðH(½¿bûg—O0fLd9N;~’Wkç}[EœiÞm±‘&]½u@®GNEvVå)Í~nÏx—ß½žÿ‚ˆœ@Αšì˜¥aõ^Îí6²¯ê;l¿IÌŒZYÏÙæ»_Ú݆ÄçÅ?æÇsñè>%Ž[Üùãϲ5¾…ll4¢xÉtID§~SRÉŒW6xtP†çrù‡iûc¯í †Ýcòçñ—üM=Ê•Z—Ê^jÕ5U£ e_ÜÆßäFj öš§Â™˜étýn}Ežâ슻yÇæ¥‡šV?0h²¬Qõf³ˆP« þÿañ€V¨ضYÚ0ÉBq?OOÒÇï?2µÏ7Yiz•Úù‚øº_²>Ÿ¦+XÜôVbz­)‹-|òˆÆHóB¾±çïËMVÓüGzÚ®‘v~>S=ʲ­9ðy€uu´Ø|X¹´Ògˆ‹#×*ε­M®iÃYZjƒäjŒÅ–@ q*ËU~¼[û09Y»;Ž|Q• sz¤ÙèZe¶“`¥m-S„|X’K31ñf$Ÿ|]Ž,b‚;Çb®ÅX7æW×ÊÚgÕ,œ~œ½R s }R?÷ùauúý_…Q`ÿ—žXkHÄ‚“{r ¶WÝ’6êæ½ßõ|óm¢ÓÐâ<Ü-ž‡æYög»b®ÅT®-­îá{{¨–hQã‘C)àà”AQ(‚(°=WòþæÊàj¾Q¹{K¸Ï%·õ ýÉ^ÿÊÛ{æ»>‚÷ÉÁ:iâ—È#4?Ìû›Æ•ç;g·¹J)¼XÊŸœ‘æM½³S“ ‰§§ìßkˆ<‘GùÃôÕòzU­Ý­ô ug2\[H*’ÆÁ”ý#({Œ9¡’"P"@õ ø¶;v*ìUتK¬ùS@×Ôþ’²I&=.zsökB~Gl"D:Ýwdiõ?Þ@ßÈüØÞ‰ùae¡ù†^¶žÒí¼È ¬¤qR]h“öFôÉØtºeqéµ#(•Ä]Îýÿ±Ÿd±Ø«±Wb®ÅR¿È,ŸÍ_ùÈëKÉSÖòÿ”+¨ÊiT&ÁÀ·èy]2½;¨=³"ƒãžÒk¿1ª‘£éÛoÒ,“ v*ìUØ«±Wb®Å^Kÿ9'ùwÿ+/ò‡^Ñ­âõu›ÿKhàNnì~ §¨I$°¯-d.SŸÀ›š“×}³; Ë”pƒ°z] µºØ PFÓo>§îH<¼šÿœ<ímçaú3Kxú»V0¬ r!}BܨX òܱ̌]—g¯84z9i¸øæ~Ãú=Ï\ÍKûv*¥qsoiÜÝJ[Æ9I,Œä†MxñÊdF"Éîy™?6ÓÔýå8¾±räF·²)ãɶ(ÎìkзÜsgƒ³úÏäöì©>¬æ‡óGé?«æŒòïäö­­ÜkóòF’CËê+')XuIÈ?ÈO¼fwˆ¨‡y-n<1àÃãñ»ØtÍ+NÑ­ÃJµŽÒÒ?³JW¹=É=ÉÜådÛ«žILÜ”f,Ÿž|ù¦y&Áe¸XÔ§êv*Ôg§Vc¿4ùd¡ rôºIf;rïAyGòþrgózÉ<Áe,VÐnG«a%ü¯§¤¨EAŽ8cšá”ƒUw^-ØÓ20î=(WïBùÇÈÿó‘_‘ñ~—ó<ùʨ@¹Ô-dkÛhêiY$)Ä^Ï"p©¦çl,rö~)…&Gå8i>rÓ¡¦· R‹uhäz°9ìÔêì·FcÊ4èuib•ßPÓìõ[)ôëø„öw(cš&èÊQð=°M0™‰sŸ^-Gò“ͧޟË7íΩZ¥iÌûiPwFeFVþÐÑG´0ÜvÉÅ{G©Ã470¤ð:˪9‚¬¤TFÏ'AB¦,Š»c¾rò´~jÓ¨Cyz–³0%CR…Z›Ñ»âí»#´Î“/\NÄ%zþ¯äß"FnæŽ}^%KXdEø¶Ë×ípQÖ›‘‹™§Á‹]®< ˆ‘óýV^y¥¥ÍåÄókÝÞ—¯¼BçO–veŠddõz…»vùôÂõz“D X£“ðÈc§/Çézåÿ˜n¼Å ýbûâ¼¶•­å” 8ª°j «FÞ˜ Æöö‚:lü0úd,y2AƒPwbé[ÅÅ]Š¡oôë Rm¨ÛGsý‰T5ˆ®àûŒ[°j2b—$b|˜«ùOkê}kË—¯ap§’E#3 =¸È¿ý<±;ózÎÎöÇ6)1¸þ(úeøù$ò]~bùcáÔlÎ¥dŸîྰâ;ú‘|Cç ÌLš,rå³ë}‡ÿŒÂ¢rG îÉ´¿Ómì‘–™Z4ô[èe³“ö=XÇÒ¿ü.aϳæ9núvƒþ :<›eŒ±ŸôÑùÿز;=E¿ê—ðÈÇ¢s ÿð-Fü3x'`½v“·´ZîòÀù]‘ßìL²§lìUØ«±Wb®ÅV¼‘Ä¥ä`ˆ:³úN [äŒÈ€<ÒkÏ7yrƾ¶¡°ýˆI˜×Ã÷uürøirK£Ïë=­ìí?Õš$÷GÕþæØíÏæ?Ö%º›-ÕÃí0jO´qò'ï—Î?Ä^?]ÿÈ}:|FG¾[±0ˆƒÊ™žlßQisõI¥Uî=$¬‡å!Kr#®í®Ó×í’|?ÃHû7?çgåïÊ/,hå'¿VÕo~Wö„mÿ[2 ™ŽŸQg¨‰,q¨HÔTPt À ]Š]Š»BjZ•Ž‘e6£¨Ì¶öp/)$nÞ¹$ìÜâÃ&Ag“²üåòõÞ¤–w—–3ßL©¥]A4_zŸ|.º©* ÞÇüãåkß#k0ùãÊH> Î{`¼£€È8¶Àÿtà‘·Ù=;QqµZs‚^.>_±cÁæ¯Íù,.&‚ ;ËV²8yc•]¹íê|5çÊŸd~¸©5th‡´ÅACãj¨‹àª(ÝÞB—â—b®ÅR?5ùžÃÊzLšéäÿbÖÜŠiHÙG·v=†.>§P1Gˆ¼S˺]ÿž5ÉüͯŸRÔIÈ©Ž¿f%öR¿wŽfé4üfÏ èôøåžfsäõ03rîÏ)yWVó¦½kåí^]Y‘1®ï$„B¨ëµ{ šd2dZòåwš|£æ&j¤y†Íín–¦6?S%vxœlÊ}ºt4;c ˜°¸²ÆbâRL›c±Wb©~­¢išÜWÔ­ÖUaúH‡ÅXn2¼˜£1D5eÊ!Üh>gò,²jžZ»k5k$ð=½}HþË?iwùf§Q¡1Ün4ùµ)qá–ÝGOˆý<Ù§“ÿ0ôÿ2‘gt«cª€)8ôæ=?tM ?äõùæ¶P§»ì_i1êýôO»¡÷~¯½šd•Ø«±Wb®Å]Š»v*ìUتAç-lh]½¿VãrWѵއ֗áR?ÕݾŒ”E—UÛzïÊé§>¼£ï?«ŸÁô—üáåÑò§å|¾o¾‹Ž­ç þ²„ƒÍtûRÑ[)¯ó1’]º«.d>'"úo;v*ìUØ«±Wb®Å_š™þT?“ózž•zVó+}wLê#X/œ²¢íJC8x†û.ç®aëqqÃÌ:_h4^>˜‘õCÔ?OØÉó@ù{±Wb®ÅP·šu†¡èýzÚ;ŸAýXD¨#ÐŽ@ûä£3E»¢xï‚DX£H¬‹S±C±VæÌÝBçi`F¥ª ¯¥~ê6éñÈ*+þJÔøÓ3phe=ÎÁè»7ÙÌÚŠ”½óæ}Ãõý¬»òóþqócóžk}{ó âO*ù=ˆ– yb+w2ÇÕíœîÙ·î ÜaÁc`÷zÎÃ¥c÷õ/_üíÿœJòU·äü°~Zi™ü·ÏRŠà“5î© úÌ3Hwv(¼âE^(£‘Ëœà^+ùSçñW—+¹9júg{Êš´‹OÝJküÀPÿ”bä›í 7‡=¹wpnî ²µžöå¸[[FóL碤jYÐ,£M?ÿ8Áù^Ÿÿ˜¯æ­Åוt’;-6aÊ ‹Ês†8"þÓ2Ö °9q­Ãˆb€ˆ~„ Ðd™©ÏPKmsMm24sC"‡IÇVV¨ ƒB*üýÿœ‹ü”Ô?"¼ËæŸåÄE<‘}8QÓ‘ŽÂiML,Ñå?ݟ؇o‚±”m†l1Ë&:¹eæ="×YÓÚ¶×IÈ)ûHÀÑ‘©ÝH æ)^W6#ŽF'¢Í^XÓ|Û¤K¤ê+EoŽ ÔUà”EùWqÜmŒeE–Ÿ<±KˆÐÀ­¼¯æKï«ùcÌöQÏ£Û#¥ž±_Z*}>-È;âÉáóÂôÙ;OOŽóà‘‘õ@ò=ÿ¶ ß2ÞÁä.Áå C&«v¤ÜN¢ŽCFz ÑžœTvåŠ{7 µúƒ©Ê*ä=Ý=ÙókËמxò¤6}ö™ëi“¾òÍ5LG"9+0QAb|qOhbÑk ç ÔÀä?ø¢NÛOš2í­m<£/­xÔi=2Z=øªqö˜ûtùãM=™ì锵"£>~v:ûÉ×^sy.m<Õnª°ª4W_wgýŸÝ| êE)ïØ:Î×Å£2Óž|Æÿ§vY‹£v*ìUتW¨ùoAÕªu>än²” 'üÑ¿\Ý?hçÃôL»åÉ‹_~Rùrâ­g-Å›vUq"¡ÁoølmÝ`ö«Q¨F_aû?RRß•Úýüqõò }}[ù6Ï‘”"y€ô/ø eÃô™ãþ¤ÏüuaòßæŸ÷„wéIQëÿ#ÐeGKŒôzm7ü5ÿ/1ýh‰Å-ú·æÜU­ºH«VËâØ0?†CòX»®?ø0gÚóƒïÇú¢–iz¿æ6­©Ýézz‹‹ûbâ{r–È!(üân#fÛv8þGs½Ò{wÚ¹½PÈ$$,zc°=Û¶Ó±¡þrM±‰ <ìw¯È·L#E¹Ê—µ=µ/ãüܨª¯å÷æ…ïûÕ¬El§­.dSô#§ã– 61ü!ÃÉÚ}«—êÏ!î—ûšEAù#qpâMg^y›ºÇcô<Žâ9hˆtû?&Sy2;?ydšwå“,hÓÁ5üƒ~W35+þ¬\ÞÜ}™Š<ų /MÒãôtÛ8m"î°D‘ƒóâqsaŽ1ä)‹7b®Å]Š»xÞ¡ù¡æ.y³V°ÕaŠúÚ:ÃgklB*¸5¹|MV÷€÷éÓ ¤ŸhOI n:2½KLrò–¡æØ®4³dúòÂ"¡_ÒžJÕj‹P»âåäÇãc%Æ·§œjSÅç= Só>·¨Çai§s¶ÐtH¢•zšŠAﲊbë2r4Ó£~Z'˜dòäšOšl8-É·¶7 rš dhÛ~+г)Û¦.Ï@&qðÌrfvVVšu¬VV0¥½¤#ŒPÆ¡UGÈ`s¡C’¾,Š»Kõ½kOòþ›6©©J#¶„V›rvý”@z±ì1jË–8âdy<I5Í/1µÝÑh4›s@ Õmá&¡Ò…Ú›ŸàÌ>ù<ÿ«U’Ï õ+KK{h­-#[B¡#z3{ˆŠÞ19"a†[‰£·YåeŽ(Ðgv4UP7$ž˜II4úËóúíµ­®¥7šCóO­YÙÀœÞ)ö¥I«¿(¤ò³]“\ÕaÕäí“\7â×óEó·_•¿ž–PÁ¬ÙÈmãÖ#…¥á—˜Ñfe‘hŒáFÆ ¯&³§”yˆíÜò_ÍÊ{¿ËkÈ&Žö;ýPg|åÑn¬‘×zöÓá?ä’fiõ ós´º¡”r¢s™[±Wb¬#Îz–»©XùËP½æ·«M Þsw™€ŠáÈXšPuØœ×k³× |]_hj(p‹ê[þpKÉ·¾EÒtý/S—Kóý²‹ÝdžÎúèürz°9T1+FT…§ ç5nŸ‰ó‡™´¯ÍŸÈ½F=#óJ’ïEvôìõh˜Ío0ƛúr…zvQ•Êõ•í^lŸ¼û!ñëñù†G¡ù“Fó¾—r²0É|3Gþ²Çϧʈ§Ñt§ƒWÇ+òê=ãðl{±Wb®Å]Š»v*ìU€jZ-÷æŸæ‡–ÿ+´–n3Ü"ÞÊ‚¾’°õ'”ìºY¾ñ—cš{eÚyFÊŸëÔ>÷ꙦÙhÚmž‘§D Óôø"´´~ÌpÀ‚8Ð{eŠÅ]Š»v*ìUØ«±Wb¯™¿ç5ÿ,œ?-ÎZl<õÏ';]9E«É¦ÍÅn—o÷ÝjžŠ­ãŠCæï$y€y˶·Îܯ#…àî&ŒIÿXQ¾œç5X¸&GGÊ{gCùmD¢9Ǹþ®L‹1ÝS±Wb®Å]Ф>có†‡åˆ«¨Ï[¢9Gggðø{v Ëðéå““²ÐvVmQô »Ï/ǹ)ò’?8ÿç ®LV±:7“y¸Õî ÃiÄ03S”Ì;ǧóS®n0hã ù—½ìÞÀÁ¦õ\ûÏè‚û/òwþqkòãò˜Aª4â8FoPH…üm-þ$‹ÙªÒuøèi™ŽòÞ㊊¿;?ç ¿.ï¿ ?4£óï—m‰òš&½´`íçú—t/ûöß ¥W¢Œ£a§Q€e‡ æÊ4ûûMVÆßQ°”Mgr‹,2/B¬?_ˆÌB)ågAæGç.±ú/É70#qŸR’;4§^$ú’}P¯Ó“Æ,¹Ý›‹(=Û¾Åÿœcò`òG䟕´ù#ôïõÓÕX˨Ÿ¬(qüÉG¯òæSÑ—®â‡b©O™ü¹¥y¿ËºŸ•õ¸DúN­m-¥Ü{W„ªW’“Z2Ÿ‰[±â¯ÍÉÑ{¡kkò=ëú£Þ:>È–^Úb7;Šz僧í|cÓ'®e.•ŒùÛÉzw4¦³º+èkÚU¡øø©ý¥þ4ÉFTäéuRÅ+º¼ËždÔ¼—©7“ü⦠>«¨ïý¿ßÔU•Ô2ÊÀ`j=8¼1Þ(v*ìUØ«ƒÈ–©æ¹|Ísr÷\« €Ls¨Øª°)·Ñ‹½ŸnHéFÄG¡#¨ýgª{®ê–š6“u¨ßÐD†±~ñ›e@óL]n‡K<ùcs'åçðxÿ•¼¡«ùëb±4Éc¸çgÅ ¡~\Ÿ€_²«PÇà ÞvŸkbÒÖƒ0G«•÷’ô}oζ^Y¼‹NÔmîç>ŠH÷‘GB )È€ËMÆû|°<ž‹±§ªœ Fäp’SÍ+WÓµ»E¾Ó'YíÉâH¨*겚~xºÝV“& ðdQظÎÅ]Š»v*ìUØ«±Wž~ZäÆóWúןõ0¾éì¯÷Pÿ…ÇîbÅë]Š»v*ìUتK¬ù»Ë~_ªêÚŒPJ}L’ÿȸÃ7á‹F]N<QK4ßÌ¿%ê—Igo©¸…ŒO«°ÝB׿qjǯÅ#@§bó‡–t©µmE£#]ÞI좃Üÿn-ÙóGx‹Íu̯=iki®j¾]»` ‰ß÷î„rëÏ$t&0=°º¹ëóF¤bOãñ³¼Ëù{ ë~Z›ÌþRÚò厠‰È‘$l+$*ƒe Ô…ëËáù+¨ÑBxøñó;þÅ?+~j]_Á¥ynëK“Q¿•ÖÒö`yz–çà/Æ›°SñòÛbk¾Ê4ý¢d#<¹”éß”žQÓµAª"O7¦þ¤6“ȯ05q Àv ÇÞ¸¸vn(ˉb슻v*€Öu;@Ó¦Ôõ9„6°ÏVv=v=†-yrÇx¥Éàš†¡¯~iëÔ¶ÑíÀc·Œ÷=9HÔÿh ¿ÐyéÎz©÷ö~×¥iZ]žcŸbœ Œu;³1êÌ{“›ÌxÄk€ É¶=ò_ÌþRòŸœ¡Õ<ÙlÒB…•èøÒÊf4õž m¶ä7^ Øú¬r”j.&³ç ‹èWò-–Ÿç»¿Î½GÌ2j~_µ³–úÊ8«+"´L¼#1UZ‰Œ/R~*î[]ã .¯Ç&mò¯¼Ï?œ¼×ªyšxý&Ô&çU©Ž$QHOr¨ª Ͷ,|ÝaÇÁäªëRÔ/¡µ·½º–â ý 8å‘a‹‘~ ØT“A’˜ˆ¸Y;J|Ç®Cåý*[ù(Òý‹xíÊÃá.çÛ*Ï”B6ÓŸ0Ç{¿üágäİÃ/çg›"õ5mSÕËqÊ( rR{ÊÃK¼qô¢r;‡ ”‰6^js$Ù}“‚UÒt½wO¸Òu«(5.éLw6Wq$ðJ‡³Ç *GÌb¯5ÿçáËæÉ;öÒµ8ë òõÔÌ!fî-n˜–ŒŸä”²’~Ú®ØÓvóÇ!(’ê;ÿŒ¼Íä­^O+~hi^­nB¼²Bc’£:ž¢H¶# 9T±÷=ße{dEGP?Τ~¯“<²¾³ÔmÒîÂt¸¶³,lO¶Ýý²²óxeˆ”=B#k±Wb®Å]Š¥úÖ«‰¥]ê·Çm~5§&èª=Ùˆ@·]«ŽŸ ²K”Gö‰zwüà¿åä÷§ÿ95Èù]êRK¦èÎàׇ1%äË]¨ÏÆ%=Gó >¨Í,“3—9/´0´»v*ìUØ«±Wb®Å]Š©][[ÞÛMgwÏip ðÈ$‘È¥YXˆ ÐŒUù…©ybëòKó—Zü»¾fý { }"âN’ÛÊKÙÉ^ç‰1=?l À×áâ…Žaç}¦ÐøØoÖ¿-üϨAs¥Ø]K¾§m*Ïl² Ã+F\‘hJõFÙ€<²¬½Ã®í È8¢7Gjöñ~s~kyCòï@˜^iÓ\F/nm›š¬r-Ô– úVñ–¯F8£IìÝ9Çd(—éô0Åop@‚8bUHãQEUQ@k°_Š»yOç×çf‰ù-äùµ;‡K3ß,ùJ¨/5Çï]zˆc$4òQ» Râ?ÉQ¶Óõ4ë›P×ä+IýãFœÊÞò3–ùP÷Ì|²²è{S8”„Gð½C*uNÅX×<—¥ùÓL6W£Ò¼Š­gz«W…ÏÝU?´½þt9(Êœ6ªX¥c—sÇ4Ís[üºÕ?Âþn›L–·@ vxÍ*ñžëÕ ÉíNdž²>.§Ôwþ£÷ý¯P‚xn¡K‹iX$£‘e`{‚1xIÂP&2B¦,Š»v*‘ù§Ë¾i°[+™ä€Æþ¤RFjÒ•d;6ÇeÙ¥-&N(€ocýªëÉå_'Ü~ƒŠa%¸§. ²£HGr.kôâÙ¡W«)úÎÿ«ô07Tóá÷~×¥iZU–‹e…„|!MÉ;³±êÌ{“›¼xÄk€ ŽÉ¶=Kò7ÈžVóö¿¨iždžUh- Öv°·¦e<Â;ú›ïT…¦õ¯A¾.¯, ·<±Ä²ýwþqœÝ$÷~@ó ¾©.ñ=Û(–9#4xÌÐÕyƒ±VD¡ë”Ã]_P¦ˆv•}b’¯)ù—ó7ò2ïêfÑ®¤òœûûY©;½µÂrŒ6õ+ÊܸžHcÌ,ÙåÇP.'v ù«ù;[ó]ơ䛰Ò%D.¤zk$är‘Ò‘Šž‰Ù^ÖáÍQËè—ðŸOÍž+”‚¤T¸ ÷[×mâ®Å]м÷ͶگŸ|á þVùpzšŽ¥s MJ•W—ì—¦üc”¯í¿l·êùç¶}¥rxž[ËßÐ~Ÿˆ~šy7ʺW‘ü«¤yGDNfm¤3ðOÚv«¹îÄ寞b®Å]Š»v*ìUØ«±Wb®Å_-ÿÎl~TIæÏ#Áù‡£E_0y<4—e*$—Kv )oX÷£Á}Cמ{Ï^Jóy—@·¾fò1èÞ¨í2SOaóÎsS‡Ã™(íÒç0þ¼}ß³’$‰4’°HÐwb¨’Iè2€lbI¡ÍçÚßælmvš/“mZÖnE¥È#l4Œs•¼íîsaƒ³ÉÞ[«ìßeòdõfôïâýYü²ÿœ8óŸžn óOçn£6™`Ôx´Müˆ~.20;t;UTêC¾m±ãŒOm¦ÒãÁq›í/(y'Ê~@Ñ£Ð|¡¥[éTB¦(ŒìÛ–F«ÈÞ.ìO¾XÞðÿÎùÌO ~^ýcEò™O6ùµ9Fbµ“ýÇ[IÓ÷×+Pä÷\<ºfCŠiâ”ó•?˜q~p[7æÕñËiHìÅ«Çõk=1ȶžÿeyŸNVsÈ©äìx ³&)B¸…[¦ÖaÎ Å!.F·Ý÷þVÞìU¦eU,Ĥ€¹Å_žÿó?ó¾düÜó×å×å­ÛÙyÍžýF 3ªq<IhE½vŽ1öþÓV .F›M,Òá‹®í^ÕáÅâe>áÔžàòÛ/Ë/AKÃ-Üä|r—1Šÿ’©Ð|ÉÎbâ{%òÍW·ºÙÎñðÂ=Õ2E(A£y§òÓXƒÎ¿—Å®¥aWâ¤}3öÔŠq•ûQ²îTó—üæÏ|Û<º7äÇ–ÑOÂ5mB5º»PNÎ ZÁO÷cÈ0Î0#O0Ó?.¼Çæ}xùËó_U“ZÖd!ͬҙêA%VW?E'h£ø>²™eîu:®Ô±Ãçúž¦PEØÐ ¥Ò·Š»v*“y—ÊúG›4×Óuxy¦æ—iazPpòä‘yhúB3‹új>)V3W4I$¹¦-‘Úë¼L‡ë¿…òýH?"ù§Ë—zE‡–%ONñÑà’ÚHëÆŒÌKn§˜ì{í…ÈíÎÌÔC,óƒq»»ÜbYù•®^ǨÚùcM2Ad‘¤— j¤;†¯ÂÓáU§O˜‡3ÙÍ9g]/ÇRÆLiž\¸²Ô<£¨^ä~¿axÔ 7†Üw#®.ßò™51”50ôeÛ»ß0>bìUØ«±Wb¯<ü´ÿÉæ¯õ¯?ê0a}ÓÙ_î¡ÿ Üŋֻv*ìUØ«±Wˆùî7ò_æ6Ÿæ«u"Òñ–iBŽ¥@ŠåG¹BæØ]°x9ÄÇ#ø+¼Õù…yçxÛʾPÓæ’;²iœRDV€ªHE¨ø™›§†)ÔëNoF1Íé~Iò×øSËÖúS¸’ê­5Ü‹öLÒuã^À£åÚi0xPê·òß—í/›S¶Ó-¢¿rXÜ,(‘êA¦Ä÷¦,ã‚ñ-4Źث±Wb®ÅX?0tŸ(ÂÐÔ]ë +’7Ù¯F”Šñ‰üqpµZØâÌ÷<–ÇHóæ¤u½~gKh¯N  5ôíÐôQü߬×34úS=ÎÁÓÃõâŸ/Ç'§XØÚi¶±ÙØÄ°ÛÆ(¨¿¬ž¤žäæâ¼ "(rDä™;dGóEÇ“|×¥ùŽÞ¤YL­8Õ›L_SyËPòwåqÔ¿5´øû\óJC˜‰ÈZ—hCú•‘‰øìõcš¼BY*t¸c<µŒì"ð=ó×óÌž[ŸËZÔ& ¦X¼‚Ä‘nL,c!8«D‰ œÏ†’•‡i 8ˈ<×2\·b®Å]Š¥Zöaæ?ª_)O(fJ¼A>=ÆU›È(´æÁ‚Š Ë:çç‡åŠˆ<æÉ×KBZ==¤I-Æõ?è·‚HVµÜ®kg ˜å»ªÉÙÓ·z^•ÿ9£ùå pO4ù[OÕíþòt¶¸µ™¼G«ÿ‘Y,0\Ié§`½[É_óß–ÚÜñYyÃI¾òµÄ„+]5 (ÏCÍâT˜oá÷¦TÒbúwGÖt0é¶úÎ…}¥¤Ý¯©m{i*Í «ZU] „PûâÅ^ÚòÒóÕú¥Äw„þ“«úsGöã~$Ñ—ºÆ*¯Š¼›óoþq×òÛó~.5»ÑþeãH|Á§…Šì(¢mŠÌ»R’@û%qH/Š|÷ù7ùÉÿ8úò^zâo ÆIý#jŽðÅ=g‹â’ØûÔÇ_Úc‘”Aw½•í}&ÀñGù§—ûñ²–¼÷¡y”,PKõmDŠÊr“ßèã忈L¢Cé=—Ûú}^ÀðÏù§ôwþ6dùv—kš½¾…¥]j·G÷vèX/ws² ÷f aÜM~²:l2É.Q3Ð|^“ÿ8?ùiuu«þvùŽ>w5†€Î:Õ©ypƒ°¨ôø°f@ˆjuË3926_kaqÝŠ»v*ìUØ«±Wb®Å]Š»R¹¶·¼·šÒî$žÖá)à‘C¤‘¸*ÈÊv ƒB*ü½üÇòåÿüã—æ®·åñÝy_QC{¢‚Ü}[IK>#_Š& “Ö…©ºæ.«L2Þê»c²F²_ ¢yùud>Aüˆüãüý’OW'ÊÞA‡Žîæ7Q4}µ±*ót‘ʧ^-Û%‡M |¹÷³ìþÉÁ¥rþqçû>¶¿*!¿.'íycNëLœ.uëÞ3_Í_´”5?ÉUñ©ß2’—æ¿üäåÇ峯˜µu¯åo X•šöBETºÔ”ÿ<„{W¦)ñæçÇççÃϧY1òÇå,†ÂÕÝhúsq@ó“Ý,~+]ó7K É›¡Þè{_ÚM.€TÏÿš9ü{¾?ËÞIѼ¾dO­j­ÜÀù Ñ_¾tÚNÍLJ~g¼¾OÛ>Õjµ×x!üØþ“×îòRóç—¿NhÍ$ ]BË”ÖôêËO>*=ÀÈv¦“ÅÇcœy6û!Û?“Õ#èÉé——qø}ľÑÿœKüá™ÿ—0éZµÏ«ç+¬v:—6¬·àRÖèÔ’K"𑺗ROÚǾâCß±CÁ¿ç/?0çò俣Ÿ)‡Xó,©¢ZH†s«=ËŠn?rŽ€ŽŒÀâø¯Èz"húËKËÐ.'nôqT_¡çcÙšaï–åðÏk»Têõ’ú1úcðæ~'ì¦Q›—v*óß0¦»ù®ÛùÿÈ÷Òé„lé$ö¤+Bó!˜ ÅÁ!~yÌö¾„@ø‘äy¾µìG´'4-”Ü¢='¼w{ÇO/s!ò7å®›ækX¼éæËùµëýTµÌ‚Id ÈX‡3ÈÇÔ‘ÃËp+ãœäò§¨Öö„ã#íO\²±²Ó­ÖÓO¶ŠÖÙ>Ì0"ƃäªÊItò™‘²m‹b¨Í3HÔõ«¥²Òm%¼ºn‘Â…ˆ&›îvÄ g r‘ -êþZü‹¸‘à—Í×éd&?ºÓ­Zw re2¨ H@Ûwlqw»<=˜Œ×“Ï|ñ¢XysÍ:†¦N×–®¡Àä¥9BGRµâNÙ Š.§„ÌG&=‘hCÞØÙêV²ØßÀ—6“/a•C+pq”dblsx™¿,µï&Þ7˜|‡,³Y­ZkWš4­Jñÿv§·Úýrøä¾nÔgŪ‡‡œã‘FùSóM×BYêluc·4†Vÿ!B”ýË)å{SÙìš{”=pûG¿õýÌ×v*ìUØ«±Wb©[yoAkåÔŽ¿F,ëVæ CmJš÷ÅÍ£œCƒŒðò«Hüáå ­bê×\Ñn×]²§¦Ï²HªK($B 4Ú‡¡ÅÙvGkG e‹(âÇ/±¥h>aÕu'›Îšu„¶¡Ó‘B –D5 ­XƒûA˜ÔW#U®ÓáÆ–süê¾?e{‹Ì;v*ìUØ«Ï?-?òcy«ýkÏúŒ_töWû¨Âã÷±bõ®Å]Š»v*ìU'ó–4o4Co³š+i}h»!'‰R¥–‡‰®àZ3éã”.ˆ½7HÒôx¶—i¤;Ua@¼©ÝˆÜŸs‹¨ì\³^S6õ?ä×çá›=>‹¬þM:} ž)þ=ïDUTUDP¨ P(Í“´JµÏ2i>_ˆI¨MûÖŽÞ1ÊWù/aîh2¬¹ã»NmDqÒ?ÌþvóKwå'_jz|D‡žÚÚêéVŸÌÐFT|³ö‰èt»Lô úŸlu+¯Ñº” ¦êaŒ~”§à2Ä¥HR­]¸°öÌŒ:ÈÌÑØ¹85Ñ™£±eÙ˜ç= RüÔ¼Ô¿+ôÿË«‹D•ìç,u ~&[x›œ ìÓ!?Èîi8 ÜXé@ÊfóÜÈrŠ»bžkó\ºTé·ä‚žPóSV@¶ñÿ¸Ë‰ãÔ·JzD‘öá¥:”c‹!"&y‚Í?ÉMM4?ÌÝitæb–š¢ŸV)ÕEkÐø$ÛrŽCÚãÓ+”¿²½­Í†£—÷‘ÿd?_Çæ‚ß~vùãË¿—~Qg6×Ò£ÜÜ20-9Í4Šfƒ7¹ØvƤ{OÛ±ÕpÃô Ï™ýÔ,ysJò‡—tÏ+èˆ4&Ú+KHö¯”/&"•f?7rIË=6Å]Š»v*ìUØ«±Wb®Å]Š»v*Ç|Åä/&ù·QÒuo3è–šµþ†ÒÉ¥Ky˜[¼ÜyU5à¤r„7ÅVù×ÏÞNüºÑÛ\óž¯o¤iËQ™«$Ì¢¥ …’F§ì¢“ŠÓâÌïùÌo<ùúâ-þMØÍ¡é ðK­JêR)¨,¦¦;e=¨Yû†S¶]ƒO<¦¢-Ã×öŽ $8óHD}§Ü9—èÿ—ð‹—Õ¼ÏpÚ¾¯;™¦i]¤C#³;?Å#Ô·Ý“±á çê?gí|»¶½¹Ížá§ýÜ{ÿˆÿÄü7ófŠŠŠ*(¢¨À ÜO);•ءثÑ|Ë­~F~céÿ˜ž[RúTÎaÔìãðJAžÙ»ÀsŒþ˨4øs”í]‡.8ý2û ìþÆöÿæðø9ï1ôÑï÷ŽGà_§>SóV‰ç-é¾kòåȺѵXVâÖQJ€Û28ñt`U×öXš‡³|Aÿ9½æ#æÍ)þ][¿+m&ßë7Š»qŸQĬ£õ²í>/$cÞ\.ÒÕþ[M“/óbOǧÚÄ@ ¨¢€wÎD’l·Š»I¼Ö°·–µQqOOê³˧0¤§ÓÊ”Ì]p ︻gŒÆ»>8ü¯²ÓÈÉŒžJhËòôo'UZ‚QJ£RªI9çÙy¾ÅÚ£÷¿¥ånµØ«±W®hÿvú—ca¦ynÚÝããú@ÂÞ”rñز*­y0ß““Cã–ŒµÑÚãí!€"<Þ£Ÿ,]\_~kY_Ïumõ)VKiÜ·Õ0$•P1< mþŽX+êsñðs{|Ÿ6ÉúSÌz­ÕÌPÉw¨]¼÷r¤(Ò1©2Èh š ó›Ïž)Èžd¥øÝŠ»yÿ¿*4?5ú—ÖtÓu¶©7¯î¦n¿¾AÔŸæø×'„; /hOÇpóD×<éùstš_š­^ïL¯'åÈáš”m¿a÷äåàƒÉ†³±túÀgˆðKìøÒ>×¢hž`Ò¼Ál.´ÉÄ€yøeŒø:Çϧ†ŠÖè2é¥ÃWŸCî)ž.±Wb®Å]Š»v*ìUØ«±Wb®Å^yùiÿ“Í_ë^Ô`Âû§²¿ÝCþ¸=‹­v*ìUØ«±Wb®Å]Š»v*ìUØ«ó_æ7—¼¬ $úÆÜ‚ÊâÇÜ'Ó¿¶.§] [s=Ï(º½ó¯æmÅe?TѾ’Ùh~ù3#šY9ru–]IîÙûY¯—¼¥¥yu[§­zEî@ šõ ÙG°úk›|:hãåÍÏÁ¥Ž>\ûÓì½Éc>oód^]¶X`]Và«ÅÔ é͇…zç1µ:Œy¸š­HÆ6æ÷ùÇßùÄc«?1?:á{›‹¾7–'ªü'u’ülw+n(û}Ðie##eÐO!‘³Íö••žk ŽŸo¥ºˆà¶‚5Š(Ñz*" 2-o ÿœŠÿœlòÿæî‘s®hÐG§~bÙÄïe¬k¨_†Þî€rœRCñ'ºÕqH/ˆ|‰®Ýß[ÜhÚ·%ÕôÆ1ʲ‚%(§ù#-ôW|Üh³ñŠ<þÐê8ãG˜fšç»v*Çü׿{-Ø6“P˜kî{»’?™¨Î17S¨ãæúþqþqæâÑ¡üåüÄ·2k·¿é[ÓîWâ·ŽAµìªÝ$pr´øâêWŽŽR$ÙyÙÌÈÙ}ƒukm}k=•äI=Ìo Ä(d’9«£)Ø‚ ÀÁùyæß(Éù5ùÕ®y ƒ.…{ ›Gw$†µ¸¬¶¦§©Z´ {°9™¢ËÃ:è]gæát)þn]ë±U®é4’0XÐv&€*I8“H&˜W”ô9¿7<õÊpËå="’OԗóLFþ €Îo´5vl|;;FuÚþˆóý_¹õ\qÇkJ$QUU°fô€_ÿ+<©ç˜Ú[ûªêô¤z¥° 5@ØH:H=›2Üy¥UÚ=‡T.B¥üáÏãÞÃ<³çïÏùÆ™VŸüSùsPÙÌd{h£&¿»oŠKVûã©èÇ6óÆ^÷í.Ãͦ܎(ÿ8~žçØ”ó‘–ÿœÇo£^þŽó/Íåí@¬Wu¬a5ã2÷ŒÔ´«—:RµŠýoBѼɦ\hÞ`°·Ôô›¥áqgwM upEGP{b¬cÊÿ”–þJó-ï›|©åë]#[Ô-ťĶŠc‹Ñçê0ŽxGÈ…åÁEx YJDófø±v*ìUØ«±Wb®Å]Š»v*ìUتPÔ,4«)õ-Rê+->Õ ·7w,PÅîYÝÈP‰8«äÍ¿ùÍÍ2ÂY|·ù9gú{Ycé~œ¸‰Í’7Cõx™‡fn)ßã(ÄÈÐXåÉ q2™ˆæNÁó%Þ‡æÿÌ a¼Ñù¡¬ÜêZŒ»úRKÉÂÖ¼$IÿÄùfóIؤï“o'ÎûkÛØÂá¥Gùç—Àuøü‹-²°²ÓmÖÖ··N‰ ¯‰ñ>ç:x£Q3Õk2ê&g–FR=OãìDäÜu9æŠÚ.'`Ĭò9誢¤ŸÁ)‹<ƒ€}šìíÖæ#$‡(ôùFGâh'ÞXóIÖ¤ŸN¿·6ZÕŸûÑlkB+NK]éR6÷-oŠLd8d9‡AÛÝù1¸¥âaŸÓ/Ðü“KOµÕlfÓï¼ëŇqÜ|AÜf^lQÉr.—C­É¦Ë¸ÍJ'ñóDþG~}ë?óŽšÿ•|Õgs¬yõšâÚ;b¢[yéOZÜJBà,e…Ä kËŠÕie†\'û_}ìŽ×ůÂ2c;ÿzÄ÷~£Õˆiú¾­ù‘ùƒæÍ=r?N]JâW¶Ž¥„a€#F4ªÃ ¬@÷ͧb鉑ÈyOí÷kF8†š'Õ#rò>ó¿Ã͘çJùC±U »ËKZâöd·zÉ#_¼ä'’0#A»O¦ÉšBâe#Ð b:n™æoÏ/6ZyÈ–ìönë%õó«,Q@Œ9ÜNvãW`wf 9~ÒíÓ§ï}ƒÙOe¿$‘‹Éj´YpÉÇ$ÃØ«±Wb®Å]Š»v*ìUØ«Ï?-?òcy«ýkÏúŒ_töWû¨Âã÷±bõ®Å]Š»v*ìUØ«±Wb®ÅX·˜ÿ0|±å®QÝÝ ï–¿èvÔ–ZŽÍCÅÙ‹‰Ÿ[3¿sËõ=ùßÏ2=—àm?N? ˜ZÄÿ¿. )òZ}9n<2™Ø:™ë3gÚ‡ãª3Aü¶°²+s¬¸¾»ëèŠú zîïôíí›<:Çyn[pè#å¹g‰ª"…E*¨ t ÎØ»v*žÿÎ ùÏó7óOZüÀ×ãZ_• 2Ø[H*{rÎ-MÄB‘3Óùøç²äã‘/1¨Êg"_¡¹[C±Wb¯ÎOùÊ/'ÊïÏh¼Õi£åß8«_¹.Y„wËSÔ‡)9ÿ\eÚ|œÊÒåà˜)x ŠŽ™¿zFñT›Ì~c²ò呸¸<î¢ÚØ4Œ?RŽç)ÏœcZ3çÅ—¥Î1ÿÎ<_þbêÐþmþgÚ“åÈÝ&Ðt™’‰¨º¤²FÕÿFJ|*½=~óÑäÈfl¼öl¦fËï@: ƒK±WÈßó_—2ê¾VÒ?3ô˜é/,Ê-5)#_ê. RÖ‘O@üXǶ Ó(š/žô Z=oI¶Ôc#”ªÊ?fUÙ×ïéíœqéðåãˆ)žXÚÂ?25;˜lmtk*›MÊ0O´È¤ýf`? À×åáw¸ü†„G9>„ü¾òe§‘¼³k£@®ÈjýÝràs5ðe}†rYrq}²ôÒáúžòÊr·`ìU¦Uu(à2°!”Š‚PF*CÈüéù£jÓgÉó‡õèØK‡’Z´Šj*|Q5z4{å̬z’9îó¥ìÎ,×,^‰±?«áòO<…ÿ9Wù›ùI{•?:ôÙõ;²œMúF»sYvŽèM–OænÙ ‚Cg„Öh2éåÃ’5÷q}äÌ?&~dhé®y3WƒT±4ˆÉY cûBôxÛÙÔ{m“p™>*ìUØ«±Wb®Å]Š»v*ìUØ«±W€~qÎZþ]~W›#Ky£ÍñU›c*‹kw®®€eR;¢zìÁzâyÃΛŸž÷«}çM´ÿ-«ú–š< ÐZF+QéÛV¬Â»K33S¡#lÚi;+&]åé#Û>Ùi´— ¼Ÿ—Ò=çô±¢yoHÐ"ôôøÈE$¸ŠWù·ðgK¦ÑãÂ=#ãÕòŽÕí½NºW–[tˆÚ#áúNé¶dº—b®ÅRÏ1YM¨èwöVÿßÍ ¬cÅ©P>šS1õxÌñJ#™ϱuQÓêñd—Ó ÷~ăò÷YÓî4˜tDNÅdúų!SA&ïZSr£­s ²µ0ùJ<ÃÐ{gÙy¡¨– ú±ä#†WåËä6éI¿èm,y›ôÂÎWV0{`éF‹dæRœ¼kLÊü¼F—¢$h±Æ¡#Pª€°$¹LÈÙ6JRÕ,4‹V¼ÔgX-×nMÕ‚¹>Ã*Íš8ãÅ#AÊÐè3j² x¢e/Ç>æ/¥ë>{üÂÔ·ùcåÛ­Jë`ó$&SmƒÈº‰kûRµ3A¨í¹±Šó/¥ö_üñÄ jeÄ›‡Ï™øSÜ<‘ÿ89æ¿0Í­ù¿æSh„†m#MassÄîQ®÷1hÒAïš\¹§Ü½Þ“E‡MPCïïø¾¾ò寒,tq¢y+H‡L´j5Ä«W¸¹qûsÌä»öäh:(l­ÉNõÍHó.‘y ëÖqj>¡Ayg:òŽXÛ¨#±Aƒ¸ß~x~l~Pù»þq£Ìïæo,¬Ú·å~¡"©w%ŒÛá¶»*>ZÒ)©FéÖ«‘”m§S¦ŽhÑæÉ<µæ#ÍšjjZDÜÓa4-´°½*REìÛ1eg> b•I9ÀÒìU—þ[êþZмɧæh¤’šÑ‘y¬sÕÙ:š~Í:þRîåèòB¹2ËoÍû^÷S´ó®™õï-_ȯkl€;ÚTJÖ£v`ÀÖ´ëLŸ‰|ܘö€‘"bâ~Åú¯š#óðÓÿ.<‡§7C’E3<Š÷q·¨Y‘ Š~2Krf§~©—Á93øÕ‹ È¼Ãÿ*±n´ÏËmF)ãšÄÇ WÖéúRÊ6Y&5z±~MEãÈïÓiMù| G’ù÷Ê/ä¿0ɤz¦{gn-&aFh\•€Ú¡•”Ó­+í•N4]f«OáO…Œä\gb®ÅRícBÑõûoªk6Q^A¿*Õ‰Fe>êFHlÇ–P7O(×#d·›ô‡“57¶¸CÉ-®”¯ücž1È{_öYlr÷»Hv˜áËŽŒy¼Õçÿ&:Ûy³L{‹`B‰ä^5ö[ˆ¹FßMNZ<œþÏéuâ—û>GvO¤~dy_Tâ’\ ƒAéÝ‹_i)O™ÓÎêýÔâÜ1ýÕÍ•Ç,s"Ë ¬‘0ªºÊG±bé%DQ_‹b®Å]Š»v*ìU矖Ÿù1¼ÕþµçýF /º{+ýÔ?áqûƒØ±z×b®Å]Š»v*ìU ¨jºf•¯©ÞCifžEŽ¿.DWèÅ„òF"äiçÚççO—¬CG£C.§?g ÁüŽGþéÂësv¬#ôîÃnuÏ̯<Õaå§érTR.VЕ>.k#=²üziÏp¥—QŸ–Ãä˜èß–ze¡Yµi ôý}1T„<›é?Fl1h">­Û±v|FòÝ›C6Ñ,ñ¬P ¢FŠTx6ÌÐØ9à°T—b®Å]вùÃ=iþ@üÈó寽2ÚGæCésÊB£^Ú Qr= ÑÊxW«Q»g;’2!åóã1‘ÏÐ<ƒK±Wb¯ÿœ¬ü¬—ó?òªñt»s?™¼¾ß¥t”QñËé­. _ñTª÷u\R á¯!y…5%-&÷!b«ŠNïÙßm¿Ï7Z<Üq®¡è4Yøã]B7Ìþj±òÝ·)šþAû‹PÔcþSx/¾YŸP16ÍF¤coTÿœtÿœbÔ0oaüÏüß·qåù8O£hSU úý¤–dê–À}ˆúÉÔüoI“!™²è2å36_yEPD‹1¨Hã@UTP*°t•ø«±T·£i¾bÑïô fÝn´NÞ[KÛw­$†d(ëQ¸¨=Fã~gþh~UùÇþqÇ͇Š][òïQ”?SQð0?f9HŽáÆ»HGù9}AÆ|œÍ.¨ã>It~ò«À&kïL‘SE'0|(ªGÜsh5˜ë›·ÜuvÇ^ÏÍ›šý¶ùy ÞêWújÉ8{u«ªŠ775á>͹ØoAšÝ^qŠn«T' cµ='Jüÿ»Ðæ:æNy§k–„GtñÃéIËÆ[Yý6CãB}€éšyé;‹Õh½­h›ïêgz_ç徫ÄE®Ão#uKÅ’Û‰÷iUSîl à˜èïpöö“')ïÛïfVwö:Œ"ãO¹ŠîÜô– T?ì‘•C´Ç–3òD`fìUªéf¹c&›«ÚE{c(øà™­{^„v#q†2 ØjÍ‚bc0=ïÔ)|ßä `y¿òcZ¹Óõj~¢&á/ ÔÆ®ÿ¨i¼S å³7«¤ž/´½•"倨þiýõüÞÏùSÿ9­g5ÒyWó¯Oo/k±0…µ¨¡‘-Yº­[µd…v^IÞˆ30x옥c!Dt/­´ýBÃU²ƒRÒÓîKmwo"Ë ±¶á‘Е øƒ…©Š»v*ìUØ«±Wb®Å]оÿœ¬üÝüáÿ•…wùRn×ÊþV›ÓrY;ÆÚÇØ–{9ñ$2…Ây뺊ÐýbUPÿÅi¸=ϾušNÌÇ‹sê—ê|[¶½®Ôën øxÿš:ÿXõ÷l<™VlžU-ÖµÍ;@´7šŒ¼ík¼’7òª÷ýYF£S 1â‘v]—Ù9õ¹<|ùæ$ Ûøù=GiöwgvvžX¤N]D‡1üô}²>@³œÜ<+±Wb¬gÍO§Þù‹M³ô¹E…®B „‘Ôz}ªPuýY¯×†É8¹[Ó{?k³cÒæÈ|+âá¾ ‡w_·«Òît_-Z§šu[ãªy†þ>qEœ™yÔïµ:1nñÖàž<ñg.9ÉêûC«´2 ~ f‰#»¯ésç#ÝÑtë³coxa{vÌ2©WBz‚o±d㈕U¾o­ÓxeˆK„ÕŽE–8ÎÅRoË!Yþu~yÃäß0Þ½¯—ôøf¹šß„³ÅlªÍDÖ#0,ÝBMÀÎ?µsæ òŽÏ¸û¡† 'êÉê'îú_¤ÞXò§–ü™£Á yWL·Òt‹qH­mcµîÌz³Úv%RsZõ)Æ*ìUتRÓtýbÂçJÕ­b½Óo#hn­.dŠXÜQ•ÑUð_ç_üãgš?&µ;ÌÊZóÊ Ê]GG«O>ŸjÁ”’Ó[æÝã·BùFØeÅ‘á’_äo>i~v±2[ÿ£êpõËj²WöÐþÒßïÌižoU¤–¿.öY‘qŠ»{‘µo.ùÈ·ÞjŽæÏ4ßk ¨`d„Ôúq²Âíê9èhZe°""ú»]6HaÄgw"˜Aæ/Ê-jþ;kM-Ÿ˜¢ô¥¹ÓøÌѽÌ@p¨¬p)ñŸ뇊'vÁ›O#âKiw<ÓÏžl9yŠ}_ŠÔ*ÁgnÉd•åMªI,~y\åe×j³ø³âcYØ«LʪYˆ I;sŠ¡bÕ4Ù¤Cy’‚$ÈÌOÈãLÎ9ˆ¼X,–(¦¢™HœQÑÀe`{v8¤`úçå’µ®r%™Ónš§Ö±oHTøÆAîQ“sqvŽXu±æÁn¿&üá¡H×SÖĨ }"ïk#xhÛý‘`Ê:¹SÖ`Ì+,ûjO0þhùdñ×ôW¹~ÔÆFßñuµcûòb@¸9;E›û¹pŸè;¢ì7ôi¨5 )íX÷Œ¬È>gà?ð¹*u™ý’Í¢B^ý¿["³ó甯iéê‘FǨŸ”úe ?§7aêñóÆO»¹<·½²¼­.b|b‘\“‹®É†pú¢G¼+âÔìUØ«Ï?-?òcy«ýkÏúŒ_töWû¨Âã÷±bõ®Å]Š¥×šþ…§Wëú­±V[ˆÐü¨Mqj–hG™Ž_þky"Æ _›©ì[E#ÿëÿ ‹>ÑöÅ5Ï8*cÑ´‡‘ŽÉ%Ôwíû¸¹Wþ ‡>×ÚM7š?5¼Ì8ÚFú}³÷‚1j´ñJKÿÀ¶] 4åÈ4F§'-‡ÉJÛòÎþö_­yƒT2LÛÈ#-,ó–^ÿìNeóÏñG³å#s“-ÒüŸåí#‹[Ù¬“¯û¾Þ½|G-‡û37šäÜzXCOr÷!Ø«±W·yCò[A¶ò̘™ÚYùbHãž+["d’E—dY$Ujv)³{ƒ˜Y5G‹†w]—Y#. ÑŸ˜MüªÔ,Ï¿—ÑIaõ˜íY%{ŠÜ‘chÊ\3ü@82ž€ý× ÉÃ&83ex'½¼3Ý›±V-æï(¦¾‰yfâßX·Ñš¤Ô+¸¡û-Û1u:aXæáê´£ ±Íë¿•ÿóšiò<0y_ó‹I¹Ö-­•cƒ[¶à5M>ꬅc¸ ÿvVþbä×4ó‰¢LR‰¢)õ“ç#&<ò"FóeœÒÐ IŽŸqÌþ­Ð@íÿÙ² tõ%euWF ŒV ƒ¸ ŒPÞ*øcóëò+òŠO9]ëžRüÌÐü•æ[™]KB½½"Žw$É$fõ`äMLe­iÄm„HÃ8ÌÃ%üŠÿœJòÖ ó×™üÓcù‰,N }:E¸Ò–u¡i9»NW¨F ¿Ì­‰$óYLžo°€è00v*ìUØ«±V5çýoÉ^_ò–¥©~aIhžRHøê ϪÄÑeoQ˜ÓŠ$žƒ|æüáMÿ™È¼ü±Ôí4¹fîP^]¬Hyͬ`½â±÷*?`ôÅ–ï¼<‰¤ùKòå›þ^YéöžY¼.mJŽ4‚tqU“”`s$uf©ñÅŠ3Ì>Qò¯›m¾§æÃZ¶‹¡i Ð_uõU¸Ÿ1Wù‡þpóò_äñy~]á«Yô»ÛˆºøE+K§´x¦Þ3æßùÁsËË&µù?ç ÒPüQiÚ‹ i¤WŠÞ[qNG W‰T÷a€ÄmØuÆn$Äù0/&þiùƒFó ~^~lØÉ¥yš Ù.§Ñ-!ÙuÇ· Sà`GúÇ6š·‹Ûö7´ž!ós<¥úÿ[Ù³ ì]Š»c^nò–<ïkèk¶jóªñ‚ú*%Ì=þ éþKU}²Èe1äàk»7¤TÆýýGÅæZ;~uÿÎ:^ɪyQ}sÉ¥ý[Í&Ti *7&kZòCN³@Àíñ6ÌüZ‘.{ƒí/g3`¹G×.cÞ?Õ_“Ÿó–—šWÒu –|á%ô]ô«è\Hv¥­É ®Od`¯à\ÈyÂùŠŠ»v*ìUØ«±Wb¯ž?ç.¿&Oæg[Ì,§œ|¬²]Ùª-dº²§+›m·-AêG×â^#íœRùÌc_Ògjê6|b¹¯Wø$ÿdþõÎdz5~6=þ¡Ïõ¾ígb~GRLGîç¼|»ãðû©”fÅåÞùÕõMZ¼…®tkY8]D ¤¸jvø¿S¾i;V58NBâ9¾ìn^=>£OŽ\f.'¿jû>Ë¾Šš‡æ ]2iÞQ¶{ýBQDs,qûñjOz(Éeí^/NÄK^‹ØÓŒºéŒpKŸŸ•’˜ùzâçG‘tß2êés­j/êÃk^F/‡uä6Óa@+ök—é',g‡,îRéøüw:þÚÃV]& 8…wïμºÍ}TÊódònÅVº$ˆÑÈ¡ã`C+A¨ âEóLdbAˆ`Í ùkÉú”z­ìR\ë¡£pг2Š‚T oF¦Àl3Lt¸tÓã¾#·t^î=¯®í\9øp¹nx²WÀóîêNå+òí×›Tžsw-õŵé¶Õ´çaéÇ l%“(CP(íá˜ÚIçã&̈•J>]áÚvÖŸ³†ž1àŽ8Ï,ƒ™þPóÏ^÷¢G©éÒÏ´WQI<Êïk"±uCň¡Þ‡øøføf ,¾s=xÀÎPŒHv'qø÷w¢òdžëMæ/$ù§OüÏòdÆ gJ‘&—ˆ,>àK¨§(Ý+«ü§çœ÷lhI>$~?­ôïaý ŒcùL¦¿˜}ÿÃóÜ|»Ÿ¡‘ÿ~^üëò¢ë:w=vÓŒZÞŒ\4–³³/v‰èLoM÷âg<úiOÅÅ]Š»q‚¨=F*üÖüÍ´òv‰ÿ9<Öß•’ÄÚlä~™µ³§Ôíï$I ä0ðªðPB£e’ª)Çhdäãk€8M½1^YØ«±Wb®Å]Š»KµíjË˺EÞ³¨5-m»NNݽوQ„ -˜±ÈDub–’ߘ¿ó“Oæ=kS>^ü¾†fŠàÒ‰ñÚÁTS£Ì涨Ur££š†Ã~÷±^Ï¿<öœ4ÿ7j°_P~úx-gŠ´ß÷H"n¿ñfIÈây·˜ÿçÿç"?,‘ï¼›ª§›tx7ú­«±¸àõ²º¨ú!‘Û"` “K'0Ç<¡ù­©¨.yªÌè¾dÌ ŠñÆó©âb)'Ç×nß½vÊ'Ž6¯³N1ÅÃÒ²·XìUتS©yc˺Ác©éV·NÛ™$ Ÿðtåøá!¶çD†)}ù1ä;ʘ­&²cûV×÷7¨? Ê\¸vžQÖØíßüãþ˜Æº~·qnAª™¡IÈßü†‹$39íyuˆ(6üšó¦ÚgšhÙ¬—0v§ìÉx¡„µzyýXø¦/7ík°Ì®×rµHíû؆5˜h%Ïù~¢Ñò·çlCš^E#ˆ$¶5úÇÄ‹Éöqþ÷_­ƒhÒyêËÌšÂhÏÇ_ËÈÖ¶žMÑg{]E刲ÃBVeeãsVä«3ƒ×|„±3-Ë\ðÄcã3õÏߜڗô¿Ì}jËËA#ÓãxËÁ PÜ4jf)°ë°û&«Û6S#nÓG)`Ë›ËÜ—bª76–·‘náIá=c•¯ÜÀà”AæÆQb¶¡ùqåËÚµºIe!Þ°½V¾êü…=…3z[8“Ðc—-•´4þn~JÕ<™æiŸC·eiôÉ™¤³e,*$´”´{ô/ÀŒÀÏ£”ó»Q¡”ó ûÍó¿œó¦*y:ßü- ¬ vk9¤Q,¬€Jf¹ uˆž\ O‰‡Úçû82ÓÙý›—U>yèôoùÇ'ÚZ*ëWWZñ¼’7ñþB(-÷±Ì)jåÑí´þÊ`Œ}dÈü‚Oså>~@k çÿʽRâm2 RÆ_Œ5ºµLwQ'šÍXÉö…ä/éâØót]±ìä°êü“üÞÑ9ü•™ôÔšŒMõmgKçÍí.”V´£Ê6¦ãn ”òÄ=;v*…Ôõ=?FÓ®µ}Vå-4ˤ¸»º™¸Ç1)gv'°~u~cyç^ÿœ©üÆkKaù[å÷&ÙHàÌ„•7ZÏ0Nȫȵ9²ˆqÙ•-^JåõÇVy©þYùCPò³yN=:[”¶–(Ç­ Áh³ûEë»?C×5ã4„­ôLÝ‘‚x|.Nð{ýÿz3þp·ÏúŸ–üÇ®þCù¢pÙç¼ÐØÐKåu Uê²!ú º;~Öm#+ù^«O,9 %Î&Ÿkäœwb®Å_7ÿÎc~Si^tü¶½ó­¼ šü¥ ¼†ñ@WšÁ·HÝÕT´©àÃjrj©ä”~d¸óGôÍBõÌ—ð‡³º‘K½»pIêY8³{œÔç‡ ‹ë‡«9ôÑ”¹ÁœeNÙØ«±Wb¯ üßüµò=Ɖ¨ù²çýÃj6±´­uj«ÆæC²$’ªÌì@ šÎdàÍ+›ÌöïdéÎ9e>‚:Ž¿7´ÿÎj¿šZï“õ-GÍÚ¬×ÞJ†E³òâ_-É–/ïÚ9ßã0 ã«rªÉórú«;v*ìUØ«±Wb®Å_œ_ó’¿–~HþfÅç_/[ò/™äw0Æ´ŽÚå;›@ûØÛUFÈs+G©8r ]}Ϋ¶û&:ý4±|â{¥Óõ$µÌ–ñ][8’ÞeY#qÑ•…AÎÚŽEùÿ> ♄ÅJ&ˆ],QÍE2,‘8âèà2°=ˆ;& Š,1ä””Iu V¾¿³Ô¤òד4t´¼uW¸¾XR4û† S·&ï°Í6|²ŒÎ,£ÔÓÞvv“\WÚÌà ‡&ÇNÿ€÷“I—¼g¥KúGRê:Ëmq-YQúÕnOùG–di;68ϽRïu½µí^]L|,#ÂÂ6áGtò{ÙflžMØ«±T.£§Yê¶rXßÄ%¶”Q”ö=ˆ#pGc•åÅ‘1°\­·.› ÉŒðÈ0ÝF=/òóMxô»w»Ô5Wô£ŸS‘QѨ rû o\ÕfÑ .Sï{=õ»œÒÇ„YáÚ½Þf¹ô¤–|§yåÍV×UÖE ‚Hœ»Ë(Ck1?  ¯$xl7ö­= °LNuUò.nûE´4óçãâU ãRzöòï5Ò••”2TŠ‚7ã:_3 ƒEÄ" ìAÅA¦kyæ_É¿6Úþcy SÀÿé–G‘ár ÌŠG(^?dЊåûO³¼?\>ž¾_±öd½©üÈ3ŸÞ¤ÿ;þ=÷¿E¿'¿8|­ùÍåhüÁåù=èxÇ«é077W‹Rœ‘¨LrF F•îÈz(Zî‘£I#gv *¨$“Ð Uà_™?ó˜”~A3Xé׿½v*g¤2½²½iI/§ÌŽëŠ@|ÍæßÏ/ÏïÏ$“OÑ£Oò]ÍUÒÑžV&¨¤·ŒÒ‚ aUFý¥ÈJ`8Ùµ˜ñs6{—yòãIòLM:9¼Ö&^^ºñ¢Ö¼#Zž+ã½Oá”NvèµzÙfòÌ‹]×´¿-é²êº¼ÂH¨+J³¹û(Š7,|?†D qñb–IpǛέ¿>ü³-Ï¥qayolMôèEÅw]‡\UÄ%XPˆ=AÅ]Š»v*ìUØ«ç¯.ÿäÉóoüÄßÿÔiÍ×fóø>ØŸHþ¨ý ÷7@ìUتœ³CòšE|]‚Ç@A sYݤÍÂã‘ÿ•XýÀàªäUð²v*ìUØ«±WÒ“·Vÿ™–:÷åf§ 7ÖQ´º[¾åc‘½H˜w¤SÿÉ`½3[©A0êucÂÊ2%ù'ùqæû>Xk3YO§iz%˽íäècVxy#Ao¶K|-Çe¯jݪÏ9’ß­ÔC€‹²P?š}Où\Sù³ÊÓ#*[hí®“t¸{hÂHI_´Œy%Aø—%§Ãû®ue¦ÁûžuLüõÿ9æ¿2$–\ü?¦>Ï$OÎöAJÍ@¨ÿ(ä1h£Îå†ÏŒw–åã ÌÌY‰,MI;’Os™®Á¬UØ«±T«¬iú-©»ÔfGÑW«»*/Rr2ÆË^L±€²À,›YüÜó5§–´ðl´º´Ó7ÛôàJsšZ ¢¯J+ß4zÍiòptøç®Ì1Çaú;ßUùgË:G”tˆ4] ¤"¬Æ†Id#â’Fîǹú4™‘²úVGOŒB€û|Êq‘rVº$¨ÑÈ¡ãpUÑ€*ÊE õ{–~Cë¯ù'ÿ97“g—Ðòœ¸Ú®Ԍ4ÅžÁÅz•—•·û#›l3â¾OÛ:Ëg”.cÜý Ë]K±U’Ë<Ó:Ç j^I…UU,ÄìN*øó÷ó§YüþóBþSþZHËä‹I‰Ôõ O¥¨<.?#-io Ä¿¶Ôn¼†Iˆ‹.vƒC=NAsû‡{0ò‡”ô¯%èphzJR¾9¦`=Iæ`9Êäu&Ÿ@ è3U’fFËêÚ4ØÄ!ý§½=È9o üÜ:‡åçŸü­ù¿ ¥.lî¡`l²Kly*¹¦‡œMþJæ~’{SÂ{Y¢©G0þ-¿§Ù÷?Eü¿®i¾gдß1èòúÚV­m휴¡hn#%GcC¸ìs1âÓUØ«Âç-¿14ï#þNëZl“­ù¦4m2Ô5D¸.¤ oÁ!-SÓ‘Uý¬R?~Ihsè_—zj]!ŽæøÉ~èEYÛ÷uùÆæ¯Q+™}OÙí1Å¥ó—«çËìzPîÝŠ»v*ðŸ6Ǭ~y~hé?”R:ÚàRõAh£h«õ‰Þ†…`Jª¹9ãÝsc¦ÅBÏWÏ=¦íO'…é‡?9~ÏÖýò¿–´'ywMò¶ƒ·Ñô›xím"Ú¼S“YYÛ»s)äÓ|UØ«±Wb®Å]Š»v*Ä?3¿/4_Í/$êžK×½üu¶º ÊKK¨þ(n#éº7Q_‰j§bqWæž‘o®~]y³Sü¯óŒWÔ¬'hà©% Ÿ‰}64ªJ¤I÷ñ9¾ì}m\º~§Î½¹ì8þkÜ}~î’ør>^æm#åMb¬oRó¶a.fã~ƒˆ‘Ôý]%eª,Ž7´©¦Ù¯ÍÚ8á# ßì¿7¦Ðû+ªÍ†9ø} >³¦#îïDy^—T{« Bk¬X0«rFW’D?ÊFY¥Õ— ”yþ·¶{":a ¸¥Ç‹%ð“±ÛœeæÜÌtNÅ]Š¥ºÎ‡§ëÖ«k¨!dGFèÜ]w ·ì¿µã=`ÔŸIt—‘þ—ßïçï_É/ùÈß&~phRÎfEó>›O­h×éEøî!‘¸ó„u-Õ:7bt~CåÎ/ο7ÿÎBùªçÉ>Dº—Lü³²b—©xÅú§Ö.©Ä”j~æÜüÛ³Jšuˆá•/,~VyOËJ’‹a¨j+Bo/†Ñ>Âûm_|Ç–B^>¿&N´<™¶AÂv*ò­D¸üÔüçò§å\´vRÍך?´ˆènnd¡)lœ–¾ù‘ˆmoAÙX¸`eÞýÔ(?,5o,Eäëÿ*éÒùzÞomkõtVB…åËIQöÞEpÇ©9k²·Ç™ÿóŠÞü£»ŸÎ“Ww:ß—V¯w¤0ßÁîCD -Ê èQD‹ü§vÈÊ °Ë†H1Ÿ$~khþhá§ê\tÍ{ì›y‘LÃcé3w¯ì6þÌyã!Ðj»>X÷‡ ä{±Wb¯üøY­ÓËz¼`0²¹œP׉wH Óþ1» ¹ìyo!îFhÿ^ÿœ‚üÇ×2¼ëÎ}"„Z~œì}8ãµ½¨ãAÂ$ ¸æÍÈדW{Ùz!–FRä>ö}¯¯8b#ª_`{m­­­” mgvöÑŠG (±¢ªÔF <|¤dl›)»ä/'ù‘[ô¾o,ÍÖåÑŸþFÅÅþó”fÑâÉõD985Ùq}2?¡ãvü›Öü«a©j>HÔnfÑî!)ªi~£$¯l¬%*ÞdVPÜYj(ç4ZÎÈ0PÜwuz-mŒ„G £ßÓö2¿ÉVÂ÷É6Ö„‹5åŠî6¥CK#L’ymò>Íå´vž22’z½ ëÞùSåIÚ;ùŒü»£r–?P|3OåZªžÚƒÄe˜ãÔ»œÞKéŠeùëm Ûù{Ìö«ûFÕµAó]—˜àC4PóŠîØ7^ÞUâé_Œ¾àeY±qÆšuFH˜²¿=~~y×Îpͧ[ºhº$À¤––d™eB(VY̓Ѕ êU‹GoÌ´`ÐÂó/,̧5Ø«±Wb­3*©f ($ìÎ*Ã5ŸÌ X&o—á:®©+âxýF4U^¹'²ýùƒ›]í˯ϯŒvŽçì{_äïüáÿš<í}œ;ž};Jø^Û˽;ë…ûAgãþóÇãýáÞ¼çW<†f˧˚S6Kü•²´Ñ2¼û¡E­Ý”óÛÁl~ÔQ[^Ɉ+¿Âx˜ÎAë}ñ&:Ðû÷ý{̼v*ìUã_óž[žãD°ó–™Ê=O@™KÍC¬8âàëHð©9•¥ïy_j´\x†QÎýÇõÛŸ“˜ÖŸšŸ—œ t7·0¬:´)OÜj—T}‘Ëã@a”÷Í‹çe›^^Ziö“ßßÏ­¬o5ÍÌαÅQ©gwv T“Šþx~yó×^ÊÏÊI$‡ÉF©ªj”xN €Žo! 4vËÐ&Í'q¸\„æ",¹ºMFA þï2È|‹ä]ÈZ:éšbú—Qﯜ-Ì u> ?e{|êN¯&C3eõ.ÍìÜz\|1çÔ÷²Œ­Ø;H<ëå{o8ùgPòýÅ®c­¼¬?º¸OŠ'Ûz´ê*2xçÂmÃí Ôa–3×—¿¢þq+óÖÛÉþ§äæLߢ®¬®dO/Þ]0H•årÏe$Œhµr^û-È­~Åvñ ‹‘gÃ,r1¢9¾ÜÂÒóÎ?Ï_$~Lèïu®Ü­×˜&›Lòý»©»¹nŠXoéÅ_µ+ uâ¾RâM:ÇÎ?ó^t?™ß™U_/!¦—¦ ¬bRÞ;ˆTï#ä5ëRF.|ü;oSØ=„s‘“ ôö_±îÀ€lÍsè®Å]Š»y·ç/æòG—Mµ„”ó¨+.'â:I9äÖ‰þWÈåú|\GÉÑv÷j~[DúåËËÏõy½Óþq'òI¿,|–|Ëæ~xó:$÷bAûÛ;#G†Ø×pÇûɇóQOØÍ£åÒ6ú';v*ìUØ«±Wb®Å]Š»|Íÿ9wùÿ˜~\_>yVÜŸ<ùr&gŽ}]BÂ2dh”.æX^*n~%Ü•¢ )Š;‚ù/É>hO1i¼g`5;Påzs¤À÷ð?Fv=­ñ¡¿Ô9þ·Ã}©ì ÏqþîO—ô~<¾,£6/.ÁüÏ êVÓ]_y~º:Ç}FÊThBÌ *VŸ¯|Óët³‰2Æ/iÒ÷ƒÚø2FõR0ð.Xæ 8ò7± ¶Ômü޲ÚZ7é4\[¢¥ž!A#r@íR™… £K`zò}º=}ûd‰ÌxhÙ!)p¿Åݽ#HÕìu»$¾°•e‰¶p+Tp*T‚¨ùfÿxåKæ½¥Ù¹tyN<¢Þ;Ñùs‚ìUت[ªè:F¸¨º¥ªÜza‰du¯Pj{W(ϥǗëì{;µõ:2N˜ß>D|†¨iú¦ þSÒ­Nå«>2^OOïë¸nUø«O†§µ[¥£. dŸƒÁÏÏñý¯o£í,:l#]š~>£&ÐÍò®ž{u¨ó²ËÞkµÐ5[½"kæºòŰÚÝ«é½FÕ‰wòïJŒ¯I®Ž˜^1È×êr{gÙìší<3dž¢{Ê<\ÆÿÎ<ù{®‹Ó!š+ˆ’xI Š9ÕYH¨ Œèc EŽO˜åÅ,r1¢6!S žù³ÈnZ]cËE­ï È.-"%©"GƔ䤫'FŸ=hvOÏ>ïÔú?³>Ùœu‡Rn<„û¿­Þ<úuò—~EjºTº ΋>†¯i+MzNæuÑ$@àWµ+ûYÉæÞÛµa.!+°y=_*uNÅ]Š¥óˆúió7üäG›¼Ù"ó¶Ñm/Þ^´–yÒÒ¾—2à(=nš8¢<Ÿ|ä›]м ó·þqOÈß›¾·¦òçØý)mô.Ü …Ü+@ÄŸ÷jÑüyR˜¤Ⱥì_œ—ñèÿ˜ÚTš—KzVz´le‚EoBê”&Ÿî©@Ê¥ŒQÙÐɼv,çË~nÐ<×mõíeeÍlßñ¯Ü|ÆÞ(”HtYôóÄjA<ÀÐÀÿ8tÁ©yùè ¶/äUñFàßðŽÙM,Î×’ý~hß?þq~kÿÎMÌžZÐtÖò¿åáukÕò$üX×7%cõ(G$‚5»µh™DFí]Ù9µ2¨ºË z’¼“¢ùGM+HŽ®h×wŽ­q-7g#·ò¯@3Y“!‘²úggö~=.>|ORÈòs±W›ùûó]Ñõ[o-ùJMs_’/.Г"A-ÅXÙO2vÝ…6Ù‹S/ňr4iö¦LsðGŽugÈwTÏòóó#Jóí‹úkõ-vÖ«¥HÕ’2 9¥@,•ïMŽÇÞ9q'#²ûZ¸ÿ6Cœ1?*ô/ÌYÏÔu¸W¾¥j$«QÍ|7v=pâÌaîaÚV,úd?‹õ÷±+ +þrƒËö åÍϲG§ Bba‰EQ剥Œ°XÍe\^F^ÉêA bG¿ö*ùcò"Ùu'óæ¥'™uÉŸÖ™%y$…äþi¤˜™&;~Õˆ9NMQ<¶w}Ÿì¶rÒ4Ç×<Ó%äʶд”’àU#—öX”5 ™àƪ¶&ƒÁdÇž33#$#Ç;;èîø>ò.³®ëþY³Õ<ŧ7R˜P«Ë(Sº‡ê“·}ó $@4Ó³säË„K$xdñLµísNòÞw­ê²zV6q™$?´Ç¢¢ƒÕ˜ªTÕg?¦,¢ZEcy3|@…û0ÎOÃÙ$Ûj Ëôú‰b˜”\ÓììzÜÓ‘ëÜzîýŒ?HÕ­5½>FÉ«£u?i}¤opsµÓçŽX EðÒììš<ÒÅn>ÑÐz8€À©ÜB=Ž\àƒ[°mBo#–Þ[Ó$ºÕõGt†v@»òâ[®Ã¢íÒ¤íšl±QX£r“Ýèòäí™êóbÂ1å~uçÔùС¼¿y¤y)íõÝAN±zâk˜!VC¶ÊÞ˜ É?†CK“’^©nk£“ÛmOlÊ3Ób>1Ã"˜³Ëo×¾ÌÖMcL‡O]VK¨×Np¬·¾aOlÛD8Éô÷¼D;7Q<Ç9ðõF++¨t!‘€*ÀÔw–ƒn¢A£Ív(v*—ëzgé.çMõÞÛ×^>¬}Fõ¡ÁèøÊu8|XÝ[°ì­å5ÍÂ'ÂyÇ>ãа}fÒkd‡òûËv…MÂ,·×²­%E\±ë¸Üöû#4ÚŒf iñ|ÏãñÑî{3S†]©«ŸÒH„ä{«î~¢Î´6=#LµÓbbél9·V=I§j“Ó7Z|#GGƒí-tµY瘊37HìµÂHõï5èþ_¾·0{ªU-#!¥cÚ£öG¹ÌMV»¹ß»«¼ìgµ:é5²?Oí÷9ù5ªYÏç½NòòEµ¼Ô ˜ZÛRˆí$É3Op£Ç|áõy É•s6û.£HpéaŒ\„îú 0Ý3±T§ÌÚÌ>^Ðu fb´…Þ0jZR5ÿdÄ 1[pb3˜{Ðÿç|¥6›ä0yÎé—ÌZ‚[Û»T™-´Ôeæ ìešU>ë™\_Zâ‡b®Å^Sª~s~Lk>pÕ¿'¼É¨ÙɪEéÛ]Øê‘ÆÚ}Ü’ sn²IÊ&u¨VG¡å°©Šiâ™ßó„RÝËæOÉ]¼¿ª©2¦‹u,ŸUåÜ[Ý%eн•ÊŸ´«€„$(‹ÔüËù¯ùK|š?æÏ–îÆ8u ¢Z þêâ*ÛÍAÙX•Kèësö\%¼ ±:½óÏ’üÙåmZÚßV†¸²¸F‚å„#4D…ÈäAþZŒ¬@‚룥ˋ$IP¿óŽz¨¹òÎ¥¤1¬¶b`<"¹ŒqðQ¾v‰’ñ˜÷½§Ú U’2ïsÙstèб_Ì8Úù'Ëw:¬Œ óƒë-Çoå_´ÞÃÆ™‰¬ÔŒ02ëÑÍÐi|‚=:ûžuùåû7Ë÷ZÝ╟Y‘^>_hÁ Œk¿ÄÌÇÜPç–V]ïjf˜ˆþ©eN­ØªomæzÓGŸËðÞ¸Ñn+êÙ°GŒÔ†$r©¨¯ÂF#TÚ3ÌG†öFÞyßY¾òµ·”&XF•hé$L‘•—àä@f B jŸ‡®#TÎZ™t o"ã³ï1yïMÕ¿/ôo(YÛO Þœð=įÃÒGŠÜhÅ·g®ã')ا;.¨K`á€äb¯¼¾Oü¬ÿ5-v3jDq|¿×7=›õ|?Sßö'!ýQúƒ›—¡cº?™SòÛó¿Ê}¹%4Èn"Ò€j°8kK¢8îH‚ZÓ¿LÔkáS¾÷IÚP©ßx~¤Å,SÄ“Bë$2(xäBYXT2‘±t9‚ësùñùž¿”–𝛢U—V,´h$G¾¹ªÆXmU@FÜ)¤Å–?”²yð¿æoæÄÚΣ­9»·¶žFý걨šr´$7û®5¢…§cAËö·lÊ8ñí\Ïê{Æì8Î&]ïý%ïún•¥èöËg¤ÙAch´ ´I ’€ å²d”ÍÈ’|Þ·(ÀT@Élxüäg,µo,Éç->Ýc×trs4kÅç´,ƒ‘ÔÆHpOE 3 ìt¡“Ã'Ó/°¼ß´:ÏŠª?hýŒÊš«k: ìÊã§9îdŒñb~tåôç©éòqÀQ¦ÉÇS¬¹½Ø«±Wb©f»®Yù~Áïï "¼b‰~ÔŽEBâr¼ÙD–¬Ù†8ÙTü¿üŸüåüú y§D¾_òDŒUµ[²ñ[È Â%Õ¸;ðN¢„®iòê§? èóë'? ûò³þq+ò«òÙa¾¼²ió"Qާ«F’EŽöö‡”I¾ê[›ƒÑóÃ%ï€t¡Ø«Ëÿ5?ÿ-¿(`dó&¥õp¯(43ßIQPY*5?Í+(=ªvÅ 3O+y“Dóß•´ß3hÎ.´=jÕ.!æ¬r­9pMQ×±b‡Ï¿™Ÿó„ß—¾n»›Zò]ÜžMÖdc)†Ú!>šÒ}ª­¿$hªßN{&,„ˆxΩù%ÿ9_ùkÈèÓÇæýÀ¶/€è=ÁÅÉŠ¹L°DôvúnÞÕbØL‘Ý-ÿk±üúÔ´=DhŸ™žYºÐµ!gu†X] hKÚÜ Ù˜ûf<ôÅèô~Öƒ¶XלWí{6©Xêö0jzeÂ]X\¨’ ã5WSáôìGlà ƒEëñeŽH‰DØ(¬ ŽÅ]Š»`ÿ›ï˜ü½å »ï.Y©HhîÎB 諹*{þÏÚ;—`ˆ2ÝÔöÖ§.Xã}çù£¿ñÉãš”®´½IüËü¨¾—SÕ­£T×ô©©$’HÀã  JþÆäŠ2šÓ2e;&3y}6†PÇ N–FR\~ñû>!íÚ”ôI5H¼ùq¢ /ÍwÖÊ.á2ôd~óìÑK‘ð³R>g1%3\7³Öi´XÌÆs’ù~ß6[•»'b®ÅPº–£e¤X\êz”ËociMq3ôTARvÜŸ78@³A¯.X㉔ðŸ>y÷Ëúúèþ{ò^´¹å© ²è·.öí5´¤ BÄô ÔÙý2~wøFfbÄEÆCbò¥ÚX²ðgÃ?V?á;Xë·ß]=̾_ËŸ"þf]Ù~az—-§ \ÚÅ*¬7>T 0âXà°Ýr¯Pô»9vV›[!¨ßÔ‹Ø×Ü^ F€4lÃ1Þƒ“Â/`Öÿç#ÿ3l?-|¡#'•4ù ú¦¦£”KL{¶èP}8¿7Z6Û->g›æÞÐö¿æ'ÁèÚ{ÿSôOÊ~UÑ<‘å½7Êž\¶º6• ÛÚÄ)Rvw NìK;~Ós%æSœUØ«±Wb®Å]Š»v*ìUØ«±Wb©~¹¢i^eÑït rÖ;í#Q…í¯-eI"PƒÜàÁÜoŠ¿33?/5ÏùÇÌ 4»ŸRïÈzË4ÚMñó€5(Ä ¡¨Yí â›Ï×ßé<ÿ[Î{Mìü{C§l±úOûÓä~ÃñNaš+ˆ’xI Š9ÕYH¨ Œìc EŽO…åÅ,r1¢6!}ÝÓ –Û3ËZ¦´|ݧµÃÝJïivðúÉ21f*…¶Ôwö4¦sàÁ9øÑ»;»}S8ÏÚ}?ärˆˆ%.¶æ·¡ûEÛ¼­äûÝn{lÉn]ì4âH.$bõ=S^½[åƒE –P ö€åûAí.-¥=K<¨O'u ùùr÷¨GpƱD¡"@@ ªt:0,œÌÉ”“̯ÂÅØ«±V¨+ZoÒ½éŠÛóœtŸ.Jv3ß‘U´Šœ¨z'e¶`êûCŽç¹è»ÙN¿xŽ8òøwýÞhŸ'~\þ{þsúsy[HmË3Ÿ‡X»-gjPþÒÎàÉ(íXûç=¨íl¹6‘åúßMìÏc4Zj3,»åËý//¾™ü¯ÿœ#ò•¤‹VüÀºo8k`‰>ªêÐi‘¿SX¹š‡¼Å»¦k ·« ‚¯üäßüã*yîÎ/;þ\@–zÑ¡Eú°&£ol D‰ÇˆI¢‘6Õè¥Tóؾ?›ó‡Î/a— ÓÍ¿›ÒSku<‘|uO†ž„‚‹%kêré¿ÃiÌ¥C{u´8pñdÉ*„Eû¿7/ž?5|¦âó[EÕ4ÍŒªé ^¿¼€SîÕ\ËÔv^LbÈÛÉÕè»K³µ§ƒê]ÆÁ>ëçðÝ6ÓÌŸó’>sÒ|ƒåxÆ™¥Ð]êÜ:ŸJ8è&À#ŸÔŽ5݉ޟ³‡S¾Ñè†'rý0ò•´$ùgKòž¡¤iékj„ÕˆA»¹Ú¬ìK9îÄœ±ÌN±Wb¯3üøüÕ´ü üºÔ|Î̬Ê>¥ Û>þµüÊ}2WºÆ‘ý–HÅ ??¼¡ù<þyòåך<Ï}q˜5¹žòÖì䉳K2¶ïê³ê (k¾nô}”2bâ‘¢y:wlœYxbŸãÉ›ù7ó·ó§þqÞâ 'Í7›?/•„q,Ò»úHNÂÚì‚ñÚ)A^ÊÚÍ~§E“ õ »Ý–“]‹8ôûº¾¹ò/çoä×瞘Ú=µÝ­ÅÍÚñºò¶¹IrÕܯ¡7(æÆ"àw¦b9”Ä<Ëÿ8Kù!æ æ½´ƒSòÿ6äöÚMâ =h—‘\qÈ@ðÅmóåÈ¿+?ç!<ÝùujÒ-}T±YO)=±ÞÚ—j ‘Кo›~ÆÉYHï›·qñaî/fÎ¥ãÐÚ†¡g¥XÜjZ„Ë•ª4³ÌýTŸ`:äg1IäãÆg!¹/mWQüìó›êº‚¼OÒÛ„PO‚µT~Ü”å!Õû9Äö†¸å•ôèõ¢1Ñbá\¿gG¹ÇpÆÄ¡"B"(UTP@j16¿;v*ìUØ«±Wb®Å_:ùÿ&š¿ã6§ÿQË›žÍú¾©ïû”ª?Cгrô)'štüÅ¥=BÝ!õ-e?³ ±§Q‡Äuqõ8´ßÃ2´WãB¿œ>÷_^Kþl¾çÊÿ•Á‡—f,j Ü…}‡§ýuÏbÐ}‡ìïîþ,Û3\ô£¬izJzšÜvâ• íñ·úª*Çè åŒy–¼™cf˜÷ü¬¯,zÂ?Rn§­èžÞ•åÿ ˜ÿžÇn7ò†;êÊ­î »‚;›iX%PÑȦ¡î3*2Xs# E† ù£† .ù£3Y[LëqH êq* ]ÅB‘_|ÀíšÖö”MýBüºó_–<ëä½Ì>Oh†qmÚÛBE§¦¡ ³"Ð#DG´Ú›mš§HÊ1Wžþfþvþ\þRZ ¼á«,z„ˆ^×GµX¿¸§TŽ öy §ùX¤É>gÿœ™üîü踟Dü¢ÒdòÇ— æÕU»âz™/X„ÓâáõflÄÕk±`3^]\í'geÎj¿>Ÿ4¯Ëÿó:?Õo.üë©Í¬yŠý%çq¸Š æSYƒ9ç+†<¹I@{®s:Ÿh§) PüÏêünõš_fqÆ'Ä7":r¯ñ³.ÿœ:üÃÔ<‘æícòÎúlgšã@g?Ý"óš'~3Æñt Ýó«Áš9`'Eã5Zyb™„¹‡ÛÙsŽìUòoüæ'ç奷•¯¿.ZÎÏÌÞz¹”1qYBHâŸXiWtœðF¦»ü̲ˆy÷ä×—u_-yÊÇYVŠòi%ºú³ý«t˜Õc#± äGbNjµ–Ϫv–xtÂ3æl×u³ü¥Ü»BÞjzvŸ%¬7×Q[Ë{(·´I]PÍ1„@z’L ד4 @‘ˆÐó/7üâóµÞ‘å›DòÕúC.§ú6}V'V[@œ„ÚŸ…Á=À Ðåø1ÙÝÑv÷hKáʸ¥ÃÅÝßñý¬>ûIÔÿ+|ßåC¤yŽç[·óÂ[jZ}Üž§ÖÙ#2ª‚A?ÂNàŽ¬+–‰ ‘6*fLÐçÅÁÌd4AëË·û^¥åŸË/ùK̦½¢™ šª=\‹XwäÅ#ž•¯ÂÐf<ò™ Ðé;'Ÿ,²BÇNƒñötfS³v*ìU/°×t}RòûOÓïb¹½Ó$ßÁ†x\ŠÑ‡áóu$bCN=N9ÊQŒ1çäñ:ùãÏ7÷÷³y^ý4û =It='LÉ=Ʊz¥}b}U D ýªñ¥;œÊÇŽ oÝ~ç•íÑÔÎDâ—àŒjÌåןEo)iÞBü׊ûOó•ÓIó~–Æ=PÙFöËê(XFÃ--6¼J91päÕ[}ßq{…¡é¾[ÒmtM" …šp‰:“½Y˜÷f$³ç1¥##eéôÚxa€„òÍïèþÒ>LÄ€À« ©Øƒ¸ çNù$ 'Xò+Áy»äû—Ò5»WYà0HÐ…‘ CDèA‡jmòÍ&·±ã?V=wOØú`ûq“ cÔÜãüïâÿç}þ÷½þQÎijzÐyKóÂÒRbãyš¿|«Ð5Ü?x?âØw?ÊÆ­œÞLR© /ªiuXµÅ!(ž¡ö†‡¯h¾fÒ­µÏ/_Á©é‹ÎÚöÖE–)CFRwfAØïnLqWç?ç/œ%ÿœŠüíML˜Éùyå3$K~îeGêåH¨&wQD°ªÔûY™¡ÒøÙéÕÄ×êÆ F]O/{Ô"Š8"HaA1¨HãPª¨ € ìÀ§ƒ$“e©à†æ·¹f‚PVH¤Pèêv!•ª8¢¢D,óWäG–õiÿ˲¶…©ƒÍ5kbàÔN §û.ju=Ž{ÇÒ~Çu¥íÌÚ~¡ö£¼µùÙÿ9%ù3ÇMÖ >uòÄ_ mv%¼dAþû»÷éØ8`:š<ýŸ—1c¼=Ÿ´°åJqÙ#Òu4~m~wÞ~ljšèVB%V€óôù%ˆ±HÕäD26;„cÿ=Žbêtà ±ÍÃÕiFAc›Ú¿-¿1î¿ç",¼Áÿ8ûç뀿˜ÐÚ´¾ZÔî¾½—O"hÒfëë!JHÀUâ䯥X¶”Š4]¢bXÏüãçf¶Šëò³Ìêö^dÑ&¸ŽÒÞàp¤n}krüâpÛ/O²síýŒ¼Xò<ýÿµí½œí(x2;Ž^ïØ÷œæž¥Ø«Ïÿ;õÑ¿•žc˜4°Gl£jŸ¬Î7˜œÙvD8µ0wòê»k'–gʾfŸ)ykÎðhº-¾“ga-æ¤Ï!*U/#ž!iÉŽÔÛˆÏPëáU»Ã`ÖŒpª²ôß-þQÎFþfm3@“˺D»}{QMŒ)èÃ×á‡ùQFFW“Y9y5d×Î]kÜ÷_"ÿÎyfÎDÔ2¼Ás¯^’[ >¶–¤íU’wå4ƒÝ}#˜¤Û„fKÖ<ãÿ8ãù?/åæ¹¡hþMÓ,®¾¡tl5m£úü7) h]n䬯Ž£ICѶ'[àOÊë§—C¸¶v$[Ü7¦쬊ƒý•Nmô¸Ü]ïgJàGqf7¶VÚ…¬¶W‘‰m¦^2!î?ŽfÊ"B‹8 <–šžtÿœoó= }_ò÷R˜6¡¥»Q\Ó8Ø‚"GíÅÀôtz9Æ|«JqŸ'ÜúÇç—oÿ%uÿÍ!ÝG©Ç§é÷A Š=½ê¯Šê*òR®ÊY{®êH æ;‡O‹(ÿ-m¿2¾³ù£ùy.½¨êWS:Á3’²Iqi.¡;Š$bŠt"€s=³Ú³Ç/wŸÔõ½…ØøòÃÅɸ½‡ë}kikco”ÛZB¡!‚XãEª€ùg')&ËÙF"€ ­‘dðùÈ?)êo¦~kyYžÛ_òü°5Ôðm"¤R‚àS¼RlOòö\é}Ÿ×pË—#ËÞò¾Òh8¢3G˜Øû»þ®¼ùéäÏ5~TX~gëz®‹eÃÐÖEÄʉk¨Âš ,I?J>&FSMó¯xŠ|Íù©ÿ9_çÌÝBo!þDZÜÚi²ƒטJ˜¯fŒü,ÑÚÚ/ø±¨v§±Œæ",¹ZMLóဳøæ“~]þKéRtÖu·¿š õ ÂÐ[¹Ü˜•÷-_÷coà5Ùu[O¡öO³øôÕ)ú§öwëûž£˜ïBìUNyൂK›™xU¤–Y*"(«31Ø:œ@D¤",ìƼéggùÝan|,6zÑMªÝ$ÐVˆ½ `*A`¼ªžw̬gÂ>®¯-ÚãÚq‰}FÇNŒ7Aó•t+Ý~VyÛËW[Kå‰íì¼·HáEÊ»1"E_³Çáe§„Ó-”$eų«Ój°ãÂt¹ñž..œÉþw¿ï÷=sÊ“ÞOòv¢º½¹¾ÔcR¶ÓꤦÝH¡ª$j *A#¶cdÏ) z]a`ÓÏŽ7#Ó‹§»`Ïò—rìUØ«“Ît>r‡ÉSE,ZÍ›_[NáD3*±45$° Ìvè2~áâp޾P0l‹Åç~}ü¹Ö4=Y¿0ÿ,Ù­õ´f—RÒãþîí !DØÒ¯íuZ7[ñepË“¤í.ÊÉŠ˜Óm/âã¨ëÓuo9¬4?8ùGS™ü½,Ð\ÛϪ‘I:'2¤ƒP@øj¦£cB0ÿvH"Áaêí(Ã6pO ƒæôï(yb)èii3]Ýò^_È Ks<²4²;nNìíASLÇÉ>#nÿC£|b7g©ï<ØŸæßælEÒþ£§2Ëæ‹ô"Î-›êè~]רý€~Ó{–`ÃÆ|wnvÀÒÆ?\¹yyþ§®Î(Î=Ïäk3ù™ç¸L¿˜:Ò3ÚÃsV—M¶¸ÝËrÜ\LïU_ƒj¸;00œÌ‰$Ù/¨p°v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]м£óçò;Büìò©Ó®xYùžÀ<º±Â­ ¤o”ÜÃ%uí³ Æ)ùõ¤Þë¾I×®¿.¼ûnúv³¦Éõxý~ªzªÜ20!¢phTŠS:ËíXæ}Çô~§Í=°öZïS€yÎ#ýÐÿ}óïfùÑ>^Ǽßå×óš±[È"¿¶ZÕÏÙä “ØÁ×é§¥ÏÇ”)4ªà׉fPTPôVÍnÄðÄô²ú?ürDe˦1?Mýáú³ jšn·¡išÎŒÈúF¡kou`ÑÐ!·š5xø…Ø$tÎmõ4Çv*Â?8üÆ<¥ùUç0úž”ÖzMïÕ^´¥Ì±m÷÷•Ôb¡ù³ù[ièy~[¦ÕòŸBÄ6u]‰Ž±Þ_öÿSǬÁó6~êg¸xgb¬UÒu?ÌÏ=h–žZeÔn®$œ¯! aÊGb7 ažJ~±œÏmjD¤ :s}oØ.É–,RÔJÿy´Gëñ<¼½ïÓï$y?Gò”ôŸ'húz^‘n¶ñVœ¤oµ$¯OÛ‘Ë;û“š7¿x§üå÷çü«ËæòÞqéù»Ík%¥±CûËkq¹¸ÛpH>”g¯&ä>Æ)àß”žIMò¼Z޵©q¹Ô ûIQû¸Ø¿ùE³°ìÝ/ƒ~g›Äö®³ÆË·Ó‡ëgÙ°uŽÅ]Š»v*ìUãZö»¨~Q~zh›²éÍ©h‘|2F‡Û´{£äAÄnd–Äü9~ØÁ!“¡zþÃÏbàêmyþr#ò{ó8F‡æ‹[}FP£ô^¤âÂð;~ÀŽr¢B;úLãß4îê“/7þIþSùû”žhòžŸ{s.í}_U»jøÜÚ˜å?Kâ¶ñ?1ÿÎ~VjNóy{WÕ´)¼a2C{lžYQeûæÅxž}ÿ8Aù©¡>Iü·|\ýwLå¿Ù¤ r½Œv¶ïÊa,€q,GÒT©&¾Ív£(œ¬ uz¬Ã$¬ }1ÿ9Aÿ8Ûwçæåªµ·æž©-í•¿îßRXRX™hEÊþpû@WQwÇÇÄ‚ ó¿ÉßÍÛ=Ùþ„Ö©kç+¥Ô,8 µái£]¨Õþñ;ÆÝ8nÕì³§—~ƒöy>‡Øý®51á–ÓoŸëz¶iãÈÿç$]—ò¾éTÐ=Ýš¸ñ§*}àfë°ø@÷Eíÿ>ðúGþq¿Ê~TÒ(ü™¬i:5¦­}¤ÚO}¨Ám \ÜM,`ÈÒ̫͉$ƒÉ½³º|콃;y?çç7å·’ü©æ ?Vó-‚kòi÷ÐZi1L'»{—·u~nœœÉÀQÜâ™>M×µ»Ky4_.éRjz­Ô¦UXã’f WhâC½rèk†¡æ]Ž“4Àá„x‰zV›ù9ù׿Hþ¹©jèJÛ¤\´RR›|jôÿfkíš]OµÁØ™{¿Ücì}f]äx>?©!Ò$ÖlµýSò÷Îanîm¹¡g> n 59 +)ŒwþfëF¢¨ÙÄÇÇ’×rØêzßå¥&œ^÷Ⱦd·—Kóî};›;„dx˜ïÆTVf‚aº·· ÑÕi¼3c“«ÒxfÇ&Oä5ß~JëÚ^ºï{ùg愎…­"‚áT£-=;¨7hÜw§ÇÌö¿eøñâÖ>ß/Ôì{µ¿/.ýì=ÿ­õ¥Ý­ý¬7¶S%ÅÂ,°OIÅU•†ÄœD¢bhìCßÂb@ll‹% ËKmBÒ{Ø–{;˜Þˆ\UdŽE*ÊÃÀƒL”dbAÃÀHwñf¥ùycå¿Í(<‰æ›Ë‹,\\l.Q€Èã UU,ʱHüz¯€ÏBÒk|l"cŸ_{çßɰǬ²’ NÇÈòýEõ/—¼±¡yVÁtÝÊ;;aBü^Fœ¤sVcîÇ1§3#eô}.ðãÛ"䡯u?LˆO¨ÝÃg#¼!ßû;ÑŸó‹ÚŸšõxÿ=4ãiæ¸]ùkN¸ZzŒ c½tíR–ñÓü¾k´Œ@+Ôêgšfs6K팓ŽìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUá¿ó‘¿ó:Gç>€×ÚrEgù¦ÄF“©n_U¹ ¡ßƒuFÜlX ¾Ðuí_CÕî<ç‹ytÿ0éò›R.‡=EÛÓ’½ÿ‘ú0¦ý é;3´øª;ô/•û[ì—‡z8ôó”GO1åÞ:{¹Mó|ùÂSæ].]gB½Ó``“NƒÓ$ÐrF>­ck0œ¸¥Ì»nÂ×ÇI«ÇšBÄNþâû.Þ{–uMVÖM>ÆÞm!y[&­gp¡#/û¾Ü‘¹ø*ÀýsGòG† ×<½áô<ݽ§ÓdrJ9ö™Å8ýCúùì|¹#µß;ê–:ËhvÚÇ3@‚ñ˸EP¬¦”ëö©Ó¥kÒÝOiN<8‘@ÿ[ƒÙÊéóiF§,fe(Èð zþ‹ç±ªçÑÕÔðRêdeä?h TS¶ù¿óy@îhÕ¥Þ`ѡ״›6SÄÈ+‡ö$]Õ¾þ¾ÙF«N3c1.ñ»NZ-DsG§1Þ:ÇW¬Î þ{.Î?$¿0.>ªRf_,^Ü0’HÜšÅÜöv< =É+]Ðg“¡#sÐ:mN=F8äÆn2päо@ÿœçüϵ´òÝå“/­®k“[ÞjÐFjb³‚NpFà~Ô³*²¯q„MJbÊF€Ýáš4}ËMÛ•¼J²ÐÈ~'#æÄçu¥ÃáãŒ{ƒó¿kë¿5©É—ùÇow!öRc—ºä›Íì~^Ñæ¾jƒû»XÏíJÃáúÚ>Ã1uº‘‡—^ž÷sØ“-v¦8ÿ‡œtG?Ÿ!æ_DÿÎ~PÉ¡ù~ëókÌQ¯ù™Z=#ÕZi~M6û†¸q_õHÙŽq‘&Ï7èB0ˆŒE(>©Õµ]?CÒïu­Zá-t½> n¯.d4H¡… »±ð À—æõ¶¯¨~þqꟙzÌN¾[ÒäHô›9hV8¢'êS¡#y¥§íŸͯdéÜòüãÏä×—ü«¥Z'é:¼íkn÷Ž©co¨Oq+Fä/r²S‘5â”QØfC½´Îãþqãò>éUdòŽ¡MG¥h°Ÿ¤ÅÄŸ§´©¿ç? ™Ï’-AbI¥Åêüœôb¶?óˆ?óŽÄ“þ ëÿkm`ØÞ+mРÎ:ÿÔ›ÿsmcþÊñ[GXÿÎ*ÿÎ?éßï?’mŸ¯ûÓu}u×þb'|VÙE‡ä·å™Ceä=7‘!ÒlÞAQCGxÙ©NÕÅmšZÚZXÀ–¶0Gmk¤pB‹j<¨b…lUñüæGå=Ÿ“®¬=<‘"húÀ¾Š-f™c\ÉVŽî4;b ΣíƒÈ¶MyqÆq1°[°æ–9 DÑ ³ÉúðóG•´0„ôÛQµ†y#¢HËûÅì g›j°øY%âúž“?‹Š3þp@þcyOüoäÍWËhâ+›¨Õ­do²·¸–.G²–P­ìNY Ôøc>ƒîkí /†Pêy{Þiùeÿ9=ùƒùåˆ.|×äYµ”ÒZDÓfk©,dŽs!Œ¸·¸IT3´øvÞƒ= §Aq!óLÚ<˜åR‰;½ÿœ¨ÿœ‘óµcò'’ Ñ¬å¨Šñí%¸q^”¹¼híÍ=ãʳv†TÃnÌÏ“é?`ù–7äÏùÉÌe#óÏ“YØMýõ„wOéŸõ­,DVÆŸëf¯7´Xcôƒ/³ñòw=˜Í/¨ˆý§ññLü¹ÿ8ÍäM$¤ÚÜ×:åÂД•þ­lHéHá<þƒ!©ÏíiíˆùŸÇÁÝiý›Á æLÏÈ}Ÿ­ëZ>…¢ù~ÔYhz}¾k±1ZÄ‘)#»p§Üïš\¹§Ü‰'ÍÞaÁ b G’a•¶¾Ióã$¿óº¡†€"@%e<¹‘¦F |)P>ŒôŸeÁð¡þwÞ^´ ëå^_îBi«éÑjÚmÎ0.#eþËuVú u¹!ÅåÆ'W¤Î)ùsË¿œÿ•mü¡óÌ{}úý"åX-݃j "³[1œd™… žd5AÎuåå±aš…—æü⚓˾gWÖ.5]´ýB%"9 ´O¥2ƒY f¡ìMC棴û*:ci÷÷ûÝ×döÄ´ÆŽðîîó 4[N×tÛm_I¸K­:ñ¶óÆ~SóÜv îÇ8\¸¥ ÈQ¡bË‘‰°Q¹Ç“~~þ_Ÿ8ùIµM>.Zþ„æÛˆ«ÍoJϦäÐsOqAö³sغï/ úe·Ç¡t}» ññqGê†ÿ¡ ù9ç¯ñ¯•"rs×4¾6º~Ô”º˜ÿ®£òƒgOŸ ¼œîÁíÌáõGcúÇï·¡åíó×’|½iùÙ«k^póŒóOamqõM3JŽV‰ ‹ˆq^& q+öH«TœÍÉ/+³ô±í9Ï6bH£ç£þhù×Î:6Ös%Ÿ˜´Óëhró‘  ô«P@~*ìhÓ„ù;ÎØìèê1€ N?Oêy{é>~üںѴ_1hòè>_Y¾»æIau’Y(¡=5>˜©e x1ø‡¶dqGnú<ùÁ©ídÆqÝο³ì÷ìúÊ×ê–ñÆò5ÅÂÇMw" –vxó“€QS×aLÂ%í±Ã„Ì÷÷¢03v*ìUثȿ:5‹ß-]ùÌ.³$Zìz6Þ^¤‹PŽVJÄ›ø-O·53'O+mÞó]¿žXe$'Sh;áøòÝù9©^yªÃZ×5Ýdꎡ9ŠûB#Œr'$XÄN*9/q±ïVàÎ8H3ì²ÏÎsâ2;Ǥ~›)ü¿ò…Ç’4›­ß}sNúåÄúdekki[’ÄÌIäkñA¹9^\œFÝfhNšV,˜ùå€\xÌÍ]£ÚÒãã—Àw–?ÿ8ýù­þwy—þV÷æ´ þÕ´}-ÁHõ‰¾T;‹XÈßýøÝÏÇ]¤ "(>Y®ÖÏQÎgsöyß ªŠ¨Šª`7 ¼UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WƒÿÎGÎ8éœÚAÕôŸù…§ÄFŸ¨Æ;È×qktGìÿ¾äê‡üšŒR á½^Ö<½«Oä>[M¦ù‚ÂO«v¥0è’W¹(ãf5îz>ÍíK¨d;ô?­òßjý0½F˜zyʧœ|»ÇN›r›æýód.£ ÅÅ…Ôrú7RÅ"A/ò;) Ûx¯,I‰4iÉÑe†<ЖAÅ Hï¸`ú •‡—<­}/™tÿFQ+ ƒ/ Ó+V/Lô=;WâÍ>—p`‘Ëß>êüy½×kê³v‡hcL¼C‡ÓV8/êâý=…(òµ¦®š—˜õX®G 9·ž[÷ž*ç'*„áËð8º,yã–`ðïFù{üÇ´4°dÒ`”[D~¹r¨×ñrïáåæ'ºN©ªj•âÉkÑ«é÷Ñ¿/X¤ƒQì)Ó7x3Îs6CÞð£Ùú|!S>5‘8\?óAù¿Éðy’< Õ †~Îá«ÐöÊuýž3‹H9¾Í{M>ÏŸ ½X¤wÞcõuzwåŸüæO?.m ò¯æ¶>¿ij¾®¯5l—ýÝÀòVþfcœžlÆjBŸfÐëðjádžBCî÷ŽcâË<íÿ9ïcubö•þW¼“Y¸!¼ÖDJ!b>ÒÚÚÉ1ø"ôÊãMnVIÆ2‘§`ùëAÐu½O[ºó¿îd¾ó-ôpÍpÜäõ¬’•¦Ê£e@/fvaãŸ>ƒ¹òŸk=­Ž¢'O§>â—󼇗»œÏ7ž;H.¼‘sùûù½c嘹ÿƒôrnu‹”¯iRŒ6 3Ò(ý¾.Ç8þÓÕø¹(}1äû—²=‹ù-7‡ï2o/.èü:ù—éí­­µ¬Vq$vѤ6ðF¡R8ãP¨Š£`5¯Pøûþs_óRîUÓ#ü©!—WÖ^ ybaÈBÎ>«hOc#UÁ¥Sö\ä¡"æQ)ˆƒ#È$^Lò½§“¼¹g¡ZÑšåu0ß\>ò>ûîvƒ;m.œb€ˆx-f¤æÈf?̇åßœÞ\Öu+m̺òóËw-tÖJ 4‘³FäªÛ‰‰j£zš®ÔÁ)Î"Ì/ǹÜöF¢2„Í Š¿ŸëL|Ÿù»å¯8jpè–Ñ\ÙêòDò.QsˆUãWV$*ÃáÓ¦[¦í,yeÂ,_edÃ#Dy%¾Mó¶­æ?4ù«X–íbòŽ­*È”/ø¥ÊœQ…ir­.ªY2NWè‹v¯G x±Æ¿y/Å2-~dhz÷–ÿÄ÷ßîOõÚÔ=ü±";¨÷mËâÓ 5Ã20k¡<|gÒ/«‹¨ìùãÉáQ«Ù”Øj6¥²^é—Q^Z=xOo"˧Z26̸LHX69ã” HQT‚æÞê?ZÖTš"HFÁ֠Њ©#l"@òD¢FÅW b®Å]Š¥:•ü·«ÔêšEã7WžÚ'zø†e¨?NS=<'õDƒ~=NH}2#âõŸÈÿËýR'ÖO¦\°n“Ìÿóšú‚úWeŽÝ@$2&‹ 5Ú•··å„öö›¼üгº“ü#æry_þr§U%µÌë‹E'qo¬j·Â((-¢ACóÊ%íÈHü¿[|}—Îy˜ŸêB[ÿÎ8êÚÝüWÿ˜^r»Ö½"¤YdeÚ«õ‹©¨4dÌLÞÒôG?Ôç`öXsžÝÀ~ŸØ÷>ÂÏJ±¶Ótø– 8’ hWì¤q¨UQò9‰ÌÈ™eêñ㈈ØNE›±Wb®Å]Š»v*øî[Òßn¿¯%‚{ÈUº×Ñ™m–›ôâ¹êžÏcáÇêýïŸÎ\ż¸ŸÔɯï­ôÛ9ï®›„!w?.€{“°ÎŽs\™ÌD^Éÿ8 _ ŽF¼`ð¹ ²BøçqÙš¯Ìà£õGð Çä'³µ‚cû¹óý?.cäú)cž$šC"‡ŽE «+ ‚êÂ÷€‚,qŸQQáúbÁ˜¯NìUتÙ$Ž(ÚYX$H ;± ªª*I'`Å€,¥ú?˜t?0,í¢jj jâ)ÞÚA"«‘ÈK±ÛÃ%(‘ͧ«[à•w<Ï?š^güºóf§avmu‹J›D€:ÀÖöœ ±S»·ÅÔÜ œxDâ:<×höÎmyDÔąǧ¿ñ¿“Ñ<³¡\ÜØhúלb³¿ó…¤.Q†%ýÚÎyqV_„6ä»u§SZ'-ÈÞ“LeO0È1æœØè6™¨_ê¶QA¨êl¯p‹G™PTþ;wߩș)ÊÇ¦Ç JQs=éo|ë£yF}[Vz¹ªYÙ¡­Ì´¨D·ó7@>‡3#A£´;C—þ½ˆ~HþIy“þrÌ«ù›ù˜¯oä i)a`9F5M¿¸€uXŠK/W5U5äɵnjDP|·´5ù59 æ}àÐ+{{{Kx­-"H-`EŠ"P‘Ç*ˆ«@€ ›€©Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Å?ç ç¼½ùÙ¤ ¨Šižy°‰—KÖü2(« k  –ˆ±Ø‰ ªÔrVR àèu2~^ë÷AüÉ´“OÕlXF%œ†*t%Á*ñ°Ý%RE=ºoû;µkÑíÐþ·Î=¨ö;Žóé†ÿÅ×Î>~]zoÎl`MTîÜs£|¬‚ §Ìš ¿˜ôÇÓ§sä$†Uá"‚#¸¡ ŒÆÖiFhp—oد=q–"ö¢;Ábz¾Ÿæ ZâÏÊR³Ç¤ÙÃºŽ¦Ê±¤ê¿ËÇj QT÷ÜôÍ^|Yr„ý z¥Þõ½›¬Ñéa“]YÈŒxîÌo¿®ýOvÚÛÍw¶×R‡tó7“ôˆÌsP y¶õÚ½öÜõÚ×J2ýÜoà¹ýžÅ“üÞ^^sbúF¾Î›ì9o<Ñõk]oO‡R³åèL ÅJš WpFn´ùã–Qä^´»;&4°äçî^ô\°Ã:çeŒõGPË÷¶QbâcË(‰ ùl§oegi_ª[Å/µéF©_Ÿ20Çò6fÕeËõÈËÞIûÑ6‡b¬?óÌIÒ¾¡jÇôŽ£X£ »,ggaNæ¼Wû3UÚº¿ ç/¹ì}Œì_Íê”m^àÇÝ©Û8l’²ì{GQâN‡ ʼÑl÷¾YÖlâ–âÆî$¯Äð2¾g#n. Tâ|Ãÿœu¼†_'ßY.ÓÛ_»ÈŒìû@â#¸§·àFP{ÃØ3r芼‹ÌÿúÑ_•öÖÐî²¹Ìöß÷‘÷~—­öû©{ÿCô‹4®íñ'üç?ü§?•¿ëÝÿÔU®UŸè—¸¹_ï#ï{ѳÌZv*ìUØ«±Wb®Å]Š»XóC"I"£ÈxƬÀ>¸@%€ÆtßÌ#êúüžWÓu»{r>`Û':1Ž¥•%+é¹5Tbv̼š Ї¢D\<}£‚y<8È~> §0Ü×ÂVzΫ¦yËÌ1Xi’êšÅííÌijí'1på¿w³1©è)ž«ÙùüÇ$jq×{×3ΟOv*Ã?4|æ”/4Z(Ô£YÒæm½;¨Áà ì® Fö5í™Ý¬:|¢]:ûi膧 ^cÞòïÈO9O}¦\yY-µ òH#–¢Cj¯À¡zÂÿðGlí5Hr.³= g†T9{¿gê{.c=K±Wb®ÅRÏ0ëúo–4{sWwO´ fhãi[ã`Š 'v`<´O$i‚v  [‰Ú¼|3'O]CÍööc–xpƒPÈEžñcñòznƒå¿-yIžßH4ý59\ÝHò3T¤`4’<„•wí˜ò™‘Ýßé´˜t°"†<Ïëcšo‘-¼Ë¹¬ÙG±˜du»½iLüHä¶ò6èŽ_ ëÞ@™É8ÐåN.ÍÒfœ}~'3Ïäz2ß.èvÞZÑ,´+IfžÚÆ1rÜÈd•€ßv?=€Ø †Ù\åÄmÙitã8ÀD{Òo>þ`èž@ÒÍî¢ÂkùA:r0ÎÞ=ø ý§#osA’ňÌìâöŸjcÒCŠ[žƒ©ýži'äwä™?<õøÿ5?6ã’%TI¥iD´_¤MQ#ZòKaݾԎå³iŠ—ëµÙ5 æwû¼ƒï[;;M>Ò #µ±µ!¶¶…8¢Š5 ˆˆ   2n¾*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мËó£ò;ÊZèír?ªk–ªß¡õØP‹7mèEG©·£‹Q‚_žúþçÈŸ1Ÿ&þ`Ú3iVÓõ¹I°Ö‚Ki“ù£4eðß³ûLâôËxýÏí/²0Ö^\5¿d½ýÇÏçÞ%V×V÷°Gui*Ío(åˆj¤gS ‰ Ãã¹ðO Ì& d9‚²úÊ FÎkÆÞá rb‡‰ð+¾ ¸ÄâbyzMTôùc’TM‹ÃõýQ´Òì|©å«fK ¶)y|H4[Ô¦ÿ*ÆŸä Õj´óŒ#‡Øó?¯ñäö]Ú˜2ê2kusp}Ü>îƒüãÊÒûKí}n%ò×’â‰l´OÝÜ\N)¥äyזÓ†¥>ü£\¶q`¡Ìž¥Øjtš3êû@ÈÏQ¼cáŽÕòsùKåŸ5Ûë€ØÜC[[ëvÀ!‘Ê7¿¶Õïß6=pËé;Ls3Û¾ÏOGûÈz°Èúe×qbÿ:2LÏy·bªWÚ[Ëupâ8!V’G=TTœŒæ" <ƒf 2Ë1 ”æ›ÿÎ+þ[Mù»ù£?æ6¿n[Ê^U–9-¢qXæ¿_ŠÖ ö"1ûé)û\A|â5zƒ›!‘üè>ÆìÈètÑÅcê=ò<Ïêò§èžc;7À¿ó•^}»üÜüÐÓ¿&¼±qË@Ð''W¸ŒÕPU"áÛ±ÑÖ0?߅dž_¦ÀrÌDuiÔêfg¢c¨êÞZü¹òõ½©èöæp¨d5"‚¡ENÀ³xça<˜ôð°äññdÔä5¼ŽéÆ™ªéºÍšjUÔW–R}‰ápêOpHèGpwv<‘˜¸› 1J¤(£2mnÅ]Š»B_éšn«ÕµK8/­ë_Fæ$™+ãÆ@FBxã!R³†I@ÜIÉyãÈv¾kò§øfÆDÒ¢†Hæ´Ä¢hëD1§Äò=:óW£qðK™¢×9xÏ«½„y÷ɾs¹ò‰祭êZÒÍwefŒ©ql€ÇUâ 0Jrø?hÓ¦øÍ.S† úŒO!Üì4:¼#<ˆô‰ ‰èR«ÝJÌï8ùPù{A»ÒãЧYµ+ë˜>ŠFñ¿¤ P„ $OA¾U<‡S–#„î[áŒipä㘗؇?§|Ùç>ù‹L×î4]/D…âõíÉ+'Õ…âÐgfïï‘õåË–bF"?£ûz0âÅ @HËôÿkZgæoæv™ä«5^Ae}¢Gpmd¸º./.¾"*8P…yPšŠqǯÏBfˆºß™NNÍÓK1Æ «Û{å…Ø¿±µ¾T1­Ô1Ì#o´¢DCî+%Äïy™Ç†Dw ¼Ëæ?ʺ%Þ¹©µ-­R¡ø¥ì‘§»¿³+Ïš8 dz6iôòË1ó/ ò.‰©~cyšÌ/5v1KK R?vïøAÿuÅÿ Ýk8mfªY$Iæ^§S8éñŒPç×ñÞ^ݘ.•Ø«Åÿ-¦KüÜÖ|¤ÌÇRæ–ëØ2¯Ö­ëò™~g:ÄÏY+ùÃíÓ´áãic“¬°ý¯¡s¬yWb¯"ó?þ´WåGýµ´û¬®s=·ýä}ߥë}Ÿþê^ÿÐý"Í+»|Iÿ9Ïÿ)Ïåoú÷õk•gú%î.F—ûÈûÇÞôlóÖŠ¼ËÍŸŸBò–©.4—Zž£nJ]E¦D“]kÉä’5ä´ø‚“N‡|Ûi»6Xñ ˆ=î›UÛ˜0˄܈þoà2Ï&yËGóÞˆšöˆ'[&wˆ­Ì&”ä;« ú£Úµ0µzIàŸªüœý²ˆqÂëÍæ3”’ëoò¯—§ŽÛ]Ö¬´ë™@1ÃusNTíË‹°4÷é—âÒäÈ.1$y6¯3S‰ó/)üÀüñTüÁÒ´]>O¯è±¢nÒÚÙžèÉ:s„A$…ù+ÆëÀÐøï›cø¸%#´¿„ÞÞwöºMmø:ˆÄoâo¿*ûÏ6~nÝé¶~\³òæ…5ß›|мìt‹ïôg¶PxÖà)½h9@I`øúnË33‡27¿s‘ªíc<œ¢v¯z@üÅóï˜çüµüÀÓ"Ð|˪YO&‘¨i²HÖ)aY%¡«ûKJe¹ô£ŒfÅ.(Äîà5àí ÒÈpfä=$~ Æôß+^yÛòûÍ^i×5]BóÏ^R™–¸¸i°<•åW©&c^[ÍæMHÞŒ@†AÝ×—êyüzSŸO“$äNLg¿þ´ïRѬ­¼‡ùgùä½#ýËi÷0C©%Œ%§»š&>£ÊbdÅOg§Jf><¤æÍ‡$¶#kéøìr2aˆÁƒ>(îºæ}ÿö¾ªFŠâ 0Mû†¡#œy{`^¦ù~@ÎJÇæÛôh¼›æ•–=BeR@‚õ‘®S©ŠåVf~?<ï{R2`¬vý_cç}¿¤8µô–ãôý¯Ð­7RÓµ‹ }SI»†ûM»A-­Ý´‹,2ÆÝ lÛº$K2¢³»E³@Ü’N*ñ¿ÌïùÉïÊËK9Ö]bwÌA¢i2¥ÌÆ@6Y¥Œ´pŠ‘^g•7 Ý1H”,l|Ñù¥ù“©þzyÒ/Cëÿ¢`âV2Z/« ˆ6æ(aø¿i·­AÎg·õñð¢w<üž³ÙÎΑŸ!°åçæ÷ìä^ÕØ«±WÍš ÷åïôÏÍ.ÇK{™•58WdúÏ5:,ñÔ¾Ð'©×ö¬eÆp˘åîý#Úø¥¤ÔGS¿üx=§EÕìuý&ÏZÓdõlobY¡nôaº°ìÊvaØí™r‰‹ÚéóÇ,ãÊA¹Ø«óÏæ/—¼…o ê¬óßÜ×êº}° <€mÊ„€«]¹¢¹fŒ~‰{”ÎiÄÇŒãâó}ʱþkþTi’Ïõ/3ùqå±¶º`O£-± "~& 4b*‘¸ éC‘)øs=ÅÑiôC_¢€&§ŽÀ=ÕÓåKŸÊŸŸ`±o*ëÚµ¶‡"ˆ/5(óÏF_CµG^\9~ÑÜàãÄ ºN‹´²ÇÂÉ0#Èž¤}ÿuõzç•ü¹aå=ËËúh?U²N!ÛíÈìKÿœsÕdÔ-¹ëß—2¤ªBÇÌÑcºU¯£/`ÿaûoð®n]<mÇs£íÏg°v„=^™ŽRþ=ãËä³C×ôß0Z‹>^DSÕ…¶’2{2ÿ™ÖéµP͉|Wµ{>‡'Qî=¸þ ^b—Y‡IšmRMA(Â7Rå“ö‚ ‹¸® \² dãæžÅÇ¥ž¢1Ô’ zƒ[ô¿'—Ï®ˆ¯$Ô¼±sqi®jlûIú¸‘}rO"¬õý¢HøIß¶s²ÔÔ¸±'.q®¯©aìž,C²ž"á—Š½=,*½ÀÛ¯6DÖ7~PòÕÓØJ’ùªà-ÅóÕd™c­\ª’»šw'3Ž9i°žyç¿ðpjñö®º(1ÓGÓb$ô³ÐË»Üo&ê:ýêr¿–=GK–!$’pÖN Æ(j w§ëÛ+³òå—Ôx¢FÒýê}¦ÑhðšÆ,€Ô±›"ºLK–ý×ðÛynlÞEƒyÂ]W̚ƙùy娚ëYÕç† }Yå`"ŒžÂ¿“Ðzg?ÛZºýØøþ§Òý‚ì['U1°Ú¦_ |{Ÿ¥_”ÿ—:_åWôŸ%é|\ÙGÎúì/uy/Å<íßâm–½íœëéå‹ÿÎFþnÅù?ùo{¬ZÈ¿â}K–ŸåèO~µ"šÎTÖ« ÕÎÔ-ÅOÚÅ >@üòtÚF‹/šu`Ï®kß½õ%«J¶Ìy­Y·¬§÷Œk¿ÃÜgSÙNqžrûžG¶õž$ø(ýÿ±–þbëšg—¼¡¨ßê¶ñ^BSцÊáHçžM£FV¨"¿{s3[–8ñ!~Ngá–L±5çÜ9äÿ$jYÐô_7Ëæ¯ðÅî«s’ÚãŠÛKm!äŠÀü<Ìaœswáëšm6’Xáœ|GáN÷W­ŽYˇÆ">7ý¯¢úî:gHò­â®Å]Š»v*ìUØ«Ÿòó@O/k]ÑÑô»}m‹ÝÍ4¯Í¸†#Ö-± B½74Ì3¢‡¡¸œèëòx‘œ½\<˜Çš¿+õ CÊÞXòv‘<'GÒ®#}Qå-“(Ù¤T0©ç#[îcj4–8c‰Ú'ÇÍËÓv”c–y$=R~>OSUUPªª€€ØfÕÓ>yÿœƒ×–ã^Ñü±,Ï—n‰y}éG”Îc‰"¬‘©+þ¶s}·˜™‚Þ§°pT%’·;§ù[Pòåîm–."›M¶"Ž8Ũ ¦Œ­ãÈW9y{¸zˆLHñÊw¡Böò×N´šúöU†ÒÝY¥c@¨¢¤â(ÄÈÐæùfûVÖ®|Ã'æl²¦˜š´kËlž´cÖŽ ×v än½Fgá‘ÆAª:aáxgºŸcÅ"MMåŠа¨9ÞƒoŸF—áCȼÏÿ­ùQÿmmþë+œÏmÿywézßgÿº—¿ô?H³JîßÎsÿÊsù[þ½ßýEZåYþ‰{‹‘¥þò>ñ÷½<Áõ¤¹%äZ&¥.œ ÔÖá­Ü™„Lc§û*e˜@3ÊÃVrD%ÃΫ߿ɒþvÜ]iÿ•ú¥ß–odÓæÓ¦·,úlÍ k•ŠHÉ€‚?¼«/ߘ‘-DDÅØ<ýÞngmHÇM#Œ× ¶ëäóÏÌO1CyÏŠ±|2çðùw§þyƒÌ˜¿–>RüÁÑôV_3Ù]­ì¶6q3HÑ#´BH—yŠ'UÜ…=M+˜ú3O¨É†Rô‘VeÉ×G&§M4cëè~<‡Á7Ö|»çÌø4?é|žLó¶q$Vvz¯".mø¤˜úa”rgP­û×(ÅŸ”ˉ ÌzÇ›~m>mXŽh $Â]GËßÑ4ò§åÇœ¯<ñææN£isªØBÖúVŸ§+z«+©f.«Ð;>#S^[S*Ôëñ >@'r[ô½šYÆlò@LËBü½òß—µ0j6QHòùšG—U†w ógb¢:÷ã×0sk²dŒþNÃgãÇ)È?ÇÅiÚf¤ZGa¥ZCcc};kh’(–»š*7Ìl™%3r6\¬xãQ$VA›ó’ô=hï£y‚ßÕ€žpL‡ŒÖòR‚Hž†‡ð=#2tº¹à—íqušA@ð/ÖíôÞÏéñ› Èùòù~»zÂ"F‹jUQ@Øi‰w`.Å.Å]Š¥iòæŸæß/ßùwSZÙßÄbfþÒHµý¤`}Æ_¦Ï,S0ãê´ñÍŒÂ\‹ç¿É}sPò‡™uOÊ2· ˆ&•ôÒÄñõTrtBfT¤±ý=Û;¹Ê9`2G‘t>Îꥃ,´¹;ý?>cö½ó1žÍØ«ÂÕ­üä]Ìžiâ±Így~Yè#Gh£P¶Â¤LŸë“™•x¶ø¼‡cÚ§Åê=îñï‹Ó<õçÍ#È:dZ–¨¯;O(† H zÒ ,¡ÈÙ@Üü³33Aßö—icÒ@J[ÙªÒ_ËíZÑ|Çæ©å³ko.kS[ꚨñòK‹ˆùÜÆcRH!˜/J|;dòÈ;ÉÙzl˜²å$T&D‡¼óøäô<¡Ý¼{óóŠKkåòwåäGXómÔ‚Õd¶ŒÜ,39â#‰VZö¡PzÔÕs+š÷<žW¶}£Ž+LJyu=ë?cÙ¿çç£òõÌ?˜›¡u;ÊßYµÒ§qqŒ¸–v$‰§º¢v«Ë°Ÿ>É–S$“d¾¯ÂÖìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T=õ–§g>©[Ey§Ý#Cskp‹,RÆâŒŽŽ`GPF*øƒó»þqWòÅÜþzüŽõd·BÒÝù\1yá^¬lË{Œ/VþRÛ(³ic—MY£Å©Æq刔Oãà^#å¯=Úê’~ŒÕÓô~µÞ)DwSB-Õ«±Fú3¨Ðö¬rúe´¾Âù´ÇeÑÞLW<ì£ïïcãL¨ZZ‰ÍЂ1tE ÜÔ§‡*W6žnëw‘:Œ†G‡ºÍ|’m{Êðë3Eos&Ÿ«@¥#¼‡rP×áu¨ä7=óU¢H<2C¹ìŽß–’2Å( ¸¥¹„»ûÁèU¼³åø|µ¦~Šfœ´,²°ãÉØÙjh(£jäôzQ‚ ÛOnöÌ»C?‹(ðí@sÛ~½y¢5Í^ K¸Ô®7X—àNï!ÙT|ÎOSœb‘èãöOgOY¨ŽÿßÈu/`ÿœ%ü¦žöâûóÃÌ𗺺yí|¶$Z}¢cº»_Æý¹ûg“!œŒ2ý §ÓÃ8〨ÄP}ªÌ¨¬îÁQA,ÄÐ7$“m~j~hyþÇþr óÞg¾Ž?"hlöš4RHná…ë# b*÷2ÓL/u̽äÊŽßœNÐÏ,XL¢,ýÞofUUPªª€€ØgjðLϾ@¼ó¾± ½Åê/–ôùL·úqV1ëPÀjJ8‚ÄéšýfŒæ”lúG0ìô:á‚¡ê<‹ó>—qù•ùŸ•¦Y­<±å˜·%ˆÈòSxÉ´x¢štV#0õΣQÁÊ0s´Ù—Mâ 3™L//4¯ËuŸË¾Uó%ŒzíÕâ]O˜çžX¡…â© 7ǹsÐå’”t÷LqüVÕKSSÉÂz+ô²/$þbGæ=dkqçßùuøê’Å(’ÌÆC‘4rÙ>›w?=ó'K­ñ¸¶1çÜâë4 ‘>]þækmsmywVs%Å´£”SDë$nt>õ•â›þ rq'ÙøeÒ‘z?üâ÷üä7æmì~bÜÃå-¬¦I&·šBƒzÅkdì‡Aë:ÓõÊ0·›?¤n›ÿÎ`ù_Ê¿––—ÿ•žSƒÓ‡ë÷wüZupð°¼ó2Ó“ÈÓõãÚ‹@´É9²->ÜÙØZÚ1«A QâQÿ ï¡>q’W"{Ê'$Áä^gÿÖŠü¨ÿ¶¶ƒÿu•Îg¶ÿ¼»ô½o³ÿÝKßú¤Y¥woˆç5¥üÚü¬µ“â·[Ó R²j+}áFcêÏî¥î?s•¢½‡õ‡Þôœó7Öм^ü„´ŸZº×¼™æ;ï(Þß×qØ—11fäÜDrBÊ ß"µèLÝáí¢ !’ ¯ð]~Âfx¦q“ο´'žOüòß•´=[Eºš}gôò•Õç»rÀƒöOÀjKr©zïËaL}WjäË8ÈTxyWãö9:NÈdž‰&\Uþ?jKÿœü°Ó#dm2KÖ2¤ë-ÍÔÞ¢4|¸…0´Äj;íZÐdòvÞ¢_Å^àÃ`é¡ü7ï'ôS4Ô<¡åMZøjz¦‡§Þê* »›8&–‹ö~7Rv¦Þ³¬° d@÷—c“IŠrâ”=äåUQB ŠU€Ð”7€Þ)v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ž?ç%|¹žúGæ&•u–¿g4PH¼Ñ%˜#s†XÔY¢mš€ü$v\éýžÔ’N",s÷kÊûEƒ€ÇM­ÐfÒä8òÄÆ_Ž]ÿfZâ1='ËŸçg掓ùo¢»&›¦MRñ7X ‹{™Ïj¢ü׫š~Ör¯«ñ'À9Gï}—ØžÅü¶cדìOŸ?“õ CÑtÏ.hö‹n¶šN™V–VÉöc†‚§s°ÜÏ|Ô=ª?|ùùÃÿ8ùyù˜n5•¼ß') ý”cê·2ësl ©$õxø·s˦)ò¾»kùßÿ8÷r–|ÓZòˆJÛW‰Ú{vPh=;°9!?³ƒàß6z^ÕÉcê«WØø²ïL¾Ï“;òæ/•|éMØKêVM>â‘\®Õ4ZÀx¡#:-6·o¤ïÝÕæ5]Ÿ—Ô6ïèʨ+Znv'å™nË|Áùo«Ã®ë^gòÓX_I«ÀÂãJÕíáLÊ»zNÌ Tö¶ê6¬Ú Êp£ÅÒBÝÎЄqÎÇ ç_7Ÿjš§å i¾JX‚y»Î·Êׂ>cuTˆ”¨Nž,3]“±aÿ!ÝÚcÍÙå—ø1 ¿_ãÉ5òo懕<·åJñçh¢}n9&/@„³‚›(5cÇ·ÂFùoƒàê! dù´øþ6›$òDGÞÉ¡ü潺յ켯u} é×BÎâòÖQ%Ò–s¿Õ‚T†#a_¦»fPíBdjıÏäážÈ"戺<¾oKΕúE4ƒyê²Ä.#±w ;Dj9ÚO„×m³gâÇ‹†÷îu ¸x«nWÑ–5»v*ìUØ«±Vù‘ùyeçí)a.-µ‹NM§ÞU©Ê9Ü£PtÜÇÁ×h†x÷ÉØv~¼éå|ây…!ÎRþiþL-¿•?5ti|Å AHlµ#'Ô‰{%É À¢ÉGÞ”ÊgÓO© {->§ap6ú_Êó•ÿ‘žo8y–=ñéÊÏ\C`É_æ™É·ÿ”å ôžy›þrò[ÊškêWÞtÒï¯(ít»¸u™j*¡"´iÅ]™¨¾ôÅiñÿ™uŸùÉÍÿñî£hö~Lн8tË9 ‘ÀÆH¢$|-#»z³R´ iÇ6}™¤92 ¦.¯µµƒ3}Rü[Ùs­x§b¯"ó?þ´WåGýµ´û¬®s=·ýä}ߥë}Ÿþê^ÿÐý"Í+»|?ÿ9¡ÿ“‹ò·þyÝF<ÇÕÿu?ꟹËÐÿ}ë½éyæo«»v*ìUØ«±Wb®Å]Š»v*ìUØ«Ö<ÍåhÞ ÷XŠ Íi¤°³HeýóÊÀ#)Ë‹csБ™8´ù7ŽÑܸ¹µ8¶•lOå]}ü§ yÓÈL3ù—ÊK5õ»ëe7Kê~üà ,(@1ü_8$nFnu8ÙµÓv¾Hm/Pû~n£Uظ²oIû>LÓÊŸšNó´ûáo¨7ý+ï) õðZ’¯þÁŽo´úüYyû‹Îj»76bÇxeòC ¥ ±«˜Øiœ†‡MéÉÈ3i´ðãg®Ö™þ]ùâ?'ùkÍ—Wͨù_I¾Ko.óaÎc#JjÄP«µÃR@í–èµ~9“¼b}-:ý“Fr/³ö²+?ÍÍO¸Óeó·–[HÐõvU³Ô£—˜Bû¯¨¤m±©¯Mès"=¥8‘âC†2êâϲ±ÈKŸ£Ì=ëÍ>^±ÕB^ê0ÛêžÖ} [‡î~"[“Qv Iß6RÔB2á'wU6IGˆD‘t£«ùÇËzVú%¾©'£c,Jó¬®EGm½ú`É©„$óäË“&BDFñçÓïOr÷ u=9o?Gµäþ€ýTÊžµ¡á^[öÛ!âFê÷gáÊ®"²l®m­¯ {kÈRâÚAI!•чVˆ"‹(ÈÄØ4X­ù-ù{«9—ôi±™·/e+¿Dcè\×äì¼2é^çe‹¶5þ+÷þ-cùä 9ÄÓ%Ýò‚XCsp8u¨ÑXÉçóÊáØøAê~-“íÌò({‡ëz=…–™i†o­”#ŒPBG]‚í×6p€ˆ (:©ÎS7#e’`ìUäú¢¬ÿó“¿–J9D—Z4ª¾º”¬Þê¹ËöÙýèþ¯é/]Ø÷2þ·èÑÜÓ»§Ãÿóšù8¿+ç—ýÔcÌ}_÷Sþ©ûœ½÷Ðþ°ûÞ—žfú»±Wb®Å]Š»i™UK1@©'`îqT¶½¡ÞÝ =NÒâùjZÚ˜¤”¹ª+Ûå–Ë â,ÄîjŽxHÐ'Þ­©ÞþŽÓo5Eî>©·„tç'¤…ø-h*iA\Ž8qHVYdŸ L¹Ðxdž˜~bÒ¯|Åäß$Ç'—tßTÞ^]]‰PHôE1… •^yÐÇÁŽB2z ö¼Ðí½FXâÅé2Oö~”žïóãUó‡å¿æ™ Þèrö†lº\¢_\MþoâØWšmÿ+4&ùcYò Û¿žá–Úæä¬³I00Æe™ç‰ÉHøH¢œÿd7Ìí4µ3Ë8å»Ü~ªø:íTt°ÃŽXOï6=~6:Q{ zµ­þbù?ógÊ6É&“®iñ1©•FÆÜƒÌÁY@Uâ‹|ÒІ š|‡xŸOãñÍߌɨǨÆ6œ}_Ç&Uä¯Ê?Ê6¾eÒžìßùÌSJãIx½8­ ”:ƒ%‰F [áû#0õ}¥,ƪ”>÷7GÙqÂ'¸Ìòî ×JÒtÍ O‡JÑíc²Ó­ÁÛ@¡91f É$“Üï˜rÊr2‘²]Ž,QÇŠæO8ycÊ¿[ó©Ÿ‘$jË ︖®ÿìTåº}.LÆ¡Zµ¼XEÎ@~;ž/©~}yŸÎZŸøgòwËwZž¥-U.¤·iæ´æ–ñÕUG^rµ?™FtzOgzå?úÞ_[í?LCâWãÜÎ|•ÿ8iç;_Eæ_ÏŸ1Mêº%œÉquƵàóüPBµ¤*õþe9ÑáÓèËj5Y2ÊæL‹ë$~]y'òãLG’´[m"Ðê´)Yç+ѦËI!÷v9sŽÆ¿>*m?8?.u,«­D>» Üµ£ ŸL=@LOþKW¨¤Æ‘nºšÎïòÿ_ ½åæx¢†m¥ô#sÄÀïÊøHð íšýV:7Þú²ý¥âcðdw/êþϹë:ž«¦è¶Rj:µÔVv0ŠÉ<΀©êO`79Š"NÁéóf†8™L€{ŵ/Í/9~cëCÉ_’ÚMÍíìõVÔR/Þð¨S"‡¢A®òÌE+û'3qizÉâ{SÚƒ+Ž ‡óºü;¿Ÿ@~KÎh>Už?5þiËš|ÜÍë­‹—N¶”ž\ŸÕ®$ñ2ä›3@xÙÌÈÙæúUUB¨@ `ì1`Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wœy÷ò#ò¿ó#V±×¼Ñ¡E6µa<‹ès-Ê@á„¶<Ý~§²ðåÞ¸OxüR—–¿?<§«·Öã“D½;-f·-Ò‚Dì|Ý`íŒsÚ^“ö:Oaå†ñõµèW²/˜4 ÄÐ5K^[Ë®¡ ãG‘ ‡6Þ•¯\ØÈø<'˜æêà<<ƒŒ& ~NyjßÊvz™m!Ôo –k‰.âi"oRV§ÀèQéÁPvÛ0°öf1ŒFbËŸŸµ²¦p4;‘þjü²Ñõ%(è±Ç¥Å‹sbTE¸@Ed&¬Üƒf$žûôË5χ»šô½£8fñ%ê½¹†_ù3óKÏ¥h^t¾]Ó&I®.mœ´·~šð­7ÄT° Èšt…=.£7 rPˆû>Í6)â³)wôü|Tt/.i¿˜ß™þoÕuûcu¤én–6öîÒF¥×÷JßRE"f§ù@äpàŽ£Q9HX~>L³ê%¦ÓcŒ oøù¤Þgò&qù©¤yGË7iɬwSÏͧlc(¬A¯ãêÛ–Êsé"uÇ[_¹ÈÓkd4²É½{ïûKß´{;» .ÖÊþñµ ØcTžõÔ#Lã«•_ çAŠ&1›=ï1–bR$ Ïœ5ûß$ëšÞe=]Ko¤B £@²±[‹oNþé\þÄTŠœæóKõñNܾOY‚±éaá <ϸïú•|¹æ=JÇÉŽÆþæëÊöb;mêå™eCs9…Bˆ%3(¥:ÐW òŽ,´Iˆåñc¨ÓÆY±XgyW{åö©ecåO-iZ®¦‡\¿²Žî(.®¹g&PT9äÔ‚‡¶ntyqÂ2>¢/~n‹_ŒË,åúA­†Û3E’7fTpÌ›8§ßÃ3m×Òì(c>jó¥”î´{[ËK›–Ön~« ÛFcj¨«Ô޼…n@>‹¨Õ F ‚x9z]³ @á»&̧Ø«Ê/¿õ¨¿,¿ã>‘ÿuó—í¿ïGõIzþÀþàÿXýÁú9šwrøþsCÿ'åoüòÿºŒy«þêÕ?s—¡þúÖ{ÒóÌßWv*ìUØ«Î;<׿/&y+ôç–¤Ž+Ä»†)žX–`!•]Ml>ÐæÓ²4ØófáŸ*u=µªÉƒ9ÛÎFXè1ùÊ1iÚ½¯Õ’ý´¨í¢ ö잨 >­$)Ü Ø¶lä%? ÀÄÝ]õù—X”cÅŒ…]WOcÿš¾iÿ•“ù9£yÊý ›-Kêš­š3ÑÚ6 Þ´$DÊ@Ýs'³tß–ÕKäc`þ>./jj¿5£ŽQ±¢?)6£ùgšü¥¬y.ËPòæ§^Ç.¯®Þ ™â£«„EV˜“Ee4ãZî´ÌÁ AÅ’9™#hŠýŽ É¦qË0ŒOªFÏë}oqm}kÕ´‰=¥Ìk,2¡ ’G"òVR6 ƒQœD¢bhó ‚ùKÉ>G×õ?5ùÇòÂËÌ÷‡cq<ÓÙÛÇͯ i¨t ý0Õ$zga«ÖB8±ç0‘û?¾Þ#E¢É<¹0 †íÞ9}ÔôÍoËòzËË,¾_¹†úÝ·’êg–CÌJV>¯-‡ìŠt­ìÞÑ”õ\S?X¯//¹Úö§fFNcè7çç÷»Ì¾Nóç˜u)~iy/Ó°óZéÐêÙ_©€†hÏ.I"ïý㣦ÁHötú¬8ã“Má{N>YcÔbÚ|;ƒ³ ü¼ü¨Õ<¯®j¾g󴚦¡æ$]fÁ-•m^y¤õ]ƒ*¢¬ pãA®í(å„aðˆîåveKå’râ3¡[_ãÉ‚j~IóÖ£w­ù{ÊÞBÒ<µ¦j2ÜY¿˜]£õNžÒ8ªÈåy¨ø„h~Cc›zÌ1œòÊdQáóu¹tYäe xclqGñÜ÷)è6ÞLò¦› ý`<]ºÇ-Ô‡€fiÔü ±&•Øg?©Ìsd3¯¨½&—ÁŠ0¿¤0ï5~}þ]y`±n R“àñF¹f<²¸škËŠHómSÍž•Ž-ÿ4<Ÿ;Ù#p:‘‹ÓiðÝÛ -œû.mpöÖHýC‹ìuû·1ûB} þxyZãÅÔšMËPzwÉÁ+Þ’¡dýb3k‡µ°Ï™á÷º|ýž‡òz¥õ–¡¹°¹ŠêݾÌÐH²¡ù23a‰ Ý\àbhŠ*ô’ç©îi’bÃ|Åùk¢ùƒ^¶ó0º¼Óu˜8+ÜXM虣M¸¾Äôøj¤m˜Yô0É1; ù; ?hÏ (J'½™æk¯y§åÏåíÞŠºüþn¶´»½Õï=r1ž¿¼QûR7QšÍˆÃˆä™{·í xŸÆHäç”ËÈ–úFf#Žîþh-£ ¢«ÈIÌ'\¯µ…aˆæ[;\Y̤y©¹w¦y{ó£ËCZlô­#IŽÞ åÚ*ˆgE$ÒƒâjWmÆQ–QǪ‡¡þ·' %“G>fRý!å¿0Êo?4¼ÿ¤ŸVHTG¦ÌV¿ I(âª#Ðåx3o›,~ šŒ°a—Å,:~­§þ[·æ·¯—Z½øf·MÂC$¾›B>"Þª‚^½¼Úʸ%(Èlùþ7nñ!-G‚qåöû™]÷˜üÇosùOc§:ɪÅm6¬L…šéf6îD¡ªNÜ…}ÎeÏ<ÁÂ/ê«óäáCOŒAᛯ.|ãZüÊóš<é¥hzìvZ,’÷¥ç™¾®ìUØ«±WŸ~wéÿ¤¿+<Çh`ŽéOqõiÒb{öS›.ÈŸ¦ξaÕvÖ>-,Ç•ü¼³Aü÷µ‡È:W“ü½¤_krNNŽ¡xãô¾Îô_Ñ­ü½¡éº«´–úm´6‘ÈÿiÄ(‘÷4®s¹òœ“2=M½6ŸÅÀrˆ¤º×Èþ]³óuïž ·qæ+ø– çõ\'¦¨‰A!w­jã-–³!Ä1é QÑcŽS”QdyŠå¨ÝÞZX@×W×Û[&ï4α¢vbÉF&F€²ÆSMœy‹óóòÓËáÑ5C«]/û£LO^¿)IX¿áóiƒ±u?‡„yíû]N£·tØÿ‹ˆÿG·—ÚÁ¡üèüÓü¹m?òŸÉ7*[Ó7† oZ=«ÉÙAüôf¹Óû9¼äO»oÇØèu>ÔLíŽ {÷ü}¬³HÿœHüñüÈ™/7<Øš6žä;é±ÉõéÔõ ··1Ú'‡%vùm›Ìä’Ûþr ;“aæï-Ýé—±3,f®§ÞÄL¿*œØãíÈÿ~N·/³Òþ ïf:_çåæ«@šÂZJzÇxoO›¸á÷6gcí<2þ*÷ºì½“¨‡ðß»v_c©éºœ~¶›yä]}KyRUûБ™Ér ¸Ç(í B/&Á.Ôô Zh›XÓmoÚXZææ)Üñ. +Mò¼˜a?¨Û<áôÈ‹î)6§£Xùk@ÖçòÆÝåê;ͦÇ@·r8*y«F%•w#a¾Q“Ç FÉéÞäcÍ,¹"':¯sçíCÊÐëÂ=3Ë>EÕt­zêUÞ4æÎÕ+ñ…iPVŸôùÏON'´1Ê2=üƒÓãÔœ~©åŒ¢;ªËÞçü½Ónu?-jòÜÌ·^Z‚;{hÓ‡¥ E W ¥»vlèŠ&P•ïšùÎ4*en‘ù}k¤j^hÔÒúI¦ó9s*º(ü̆‹ÇíSÔ¦þ1èÄe3ZåיƯ£íäò/”"òF€šWFñVY&õÚ1&B 8‚Ý)ã“Òi¼pݵëug<øê˜m÷þµå—ügÒ?î£>h{oûÑý_Ò^“°?¸?Ö?p~ŽfܾÿœÐÿÉÅù[ÿ<¿î£cêÿºŸõOÜå辇õ‡Þô¼ó7ÕÝŠ»v*§<]C%µÌi5¼ÊÑË ŠQ••ª#¨8A ØD¢£Ée­•Œ~••¼VÑ$1¬k÷(¾LË™´F;JùI&§ç)輿Kk–L½R{¸czÒ´ ÍR}€ËñérÏé‰?.¯>©ñ #Vÿœ…ü®Òõ9uV Åem+ôðyDh~†Í†.ÃÔËøkÞ]v^ßÒÃø¸½Á†Oÿ93w«Üþò?“îõ;ÇþìHÌòõ ÿGµI ÿƒÍŽ/fñÏä?s«ÍíHþ|Ïèý©­—?ç0¿0ÿÞ- ùSN—f’ê(t€ø­á{¡óEͦÂÓØâ÷—SŸÚLùpþÖW£Î ùŸ^¸ŽÿóOÏïu(ÞK}]Dò‘$ù—·ù;þq;ò7ɦ9£òâëwñÓý/\ß§s·¯}¡Ë­ì¶–––ñÙØÁµ¤#ŒPB‹h½hª >X¡[v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»JµÏ,yoÌÖÿTó&e¬ZСk ÒzÑfV«ÈüÉÿ8‰ù æ3$ƒËgHº“¬úUÔöÜÕ„³@?ä^)·”k_óïÿ/ú‚(yÛPÓeJ˜Æ¡k ãW°õ-Úԯωùa”›æÄîÿç?ç$ü¸9ykÎvz­º GßÝ#õíÜMìó"ܱå"âäÐàŸ8’CuåùËÿ-÷!åOÒѦááK+Î`ÛO˜6ôé@s*¯˜s ü?S‰>ÅÓË#ãúí&¹üÊüÞÐ+þ)ü·¾¶á»³ØêKABH3G §\ÉnO¬GãæâÏÙøR?êBÃÿ9§£˜µ//\ÛJ§Œˆ— #)îtŒÔeñíÈõ‰ù´KÙét˜ù&ÎDù&Aûë=J¥Ma–¾¬Õü2ÑÛX»ãâÑ.ÀÌ9ý¿©0‹óçòîCGº¹‹jÕíd;ø|²ÁÚø;Ïɨö& t4\ߖ޵ma£?ÊÖw„ÿÂÄFLv®ç}‡õ0=©þoÚ?[Ҽѡy·þrSòÛQòýß×,¢¼Òmä—Ò–*J·Ò9^3*ަ´¦h»SQ ¹‰±_¤½di§‡ŒÅýúgš×døOþsŸPM#ó3òïU‘ ‘ØÛ›§H Ë òÈTÜÓ*Í8÷‚ôù8'wXŸý o—¿ê^¼ÿ‘Ðç+þ†çüðö_è§ó؆oùË€ b‹zŽ™¤i:-°³Ñ¬-ôëAÒÞÒàŒvû…¡Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*”ëáŸKþv?¨zéaèpã_ø»jWyαÿB¿êÓÿà/W›Wëß ùzŸµýöõñÅ;±{þpºì,¾BZG¥©ipõñô¦\Wtº"ÎÜIêIuäàÔ‘ùŽ—oòc¼Qøb»¦~Tò?üâ ™t«Ï(]ya¼ÓÔ2i g游7jÀÄ"ˆ]¿6åÑxšâ»¾‚Å ~¡úš~•ú¯©CéýkÒ寻ñõ;b¨?ùÓ¿íYÿNتs£èÇõ~?Wâ¾—§N)ðñ¦Ô§Jb«ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÙ£DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© 2http://www.synthesis.ch/ÕDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© dhttp://sourceforge.net/projects/expatyXô;H¯,‚]Ä…'c¥«ëDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© zhttp://sourceforge.net/projects/syncml-ctoolkit/yXô;H¯,‚]Ä…'c¥«³DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Bhttp://www.zlib.net/yXô;H¯,‚]Ä…'c¥«·DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Fhttp://www.sqlite.org/yXô;H¯,‚]Ä…'c¥«ÉDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Xhttp://www.pcre.org/license.txtyXô;H¯,‚]Ä…'c¥«¿DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Nhttp://www.metrowerks.com/yXô;H¯,‚]Ä…'c¥«½DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Lhttp://www.microsoft.com/yXô;H¯,‚]Ä…'c¥«ÙDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© hhttp://developer.apple.com/tools/xcode/yXô;H¯,‚]Ä…'c¥«}DÐÉêyùºÎŒ‚ªK© _Toc216071380}DÐÉêyùºÎŒ‚ªK© _Toc216071381}DÐÉêyùºÎŒ‚ªK© _Toc216071382}DÐÉêyùºÎŒ‚ªK© _Toc216071383}DÐÉêyùºÎŒ‚ªK© _Toc216071384}DÐÉêyùºÎŒ‚ªK© _Toc216071385}DÐÉêyùºÎŒ‚ªK© _Toc216071386}DÐÉêyùºÎŒ‚ªK© _Toc216071387}DÐÉêyùºÎŒ‚ªK© _Toc216071388}DÐÉêyùºÎŒ‚ªK© _Toc216071389}DÐÉêyùºÎŒ‚ªK© _Toc216071390}DÐÉêyùºÎŒ‚ªK© _Toc216071391}DÐÉêyùºÎŒ‚ªK© _Toc216071392}DÐÉêyùºÎŒ‚ªK© _Toc216071393}DÐÉêyùºÎŒ‚ªK© _Toc216071394}DÐÉêyùºÎŒ‚ªK© _Toc216071395}DÐÉêyùºÎŒ‚ªK© _Toc216071396}DÐÉêyùºÎŒ‚ªK© _Toc216071397}DÐÉêyùºÎŒ‚ªK© _Toc216071398}DÐÉêyùºÎŒ‚ªK© _Toc216071399}DÐÉêyùºÎŒ‚ªK© _Toc216071400}DÐÉêyùºÎŒ‚ªK© _Toc216071401}DÐÉêyùºÎŒ‚ªK© _Toc216071402}DÐÉêyùºÎŒ‚ªK© _Toc216071403}DÐÉêyùºÎŒ‚ªK© _Toc216071404}DÐÉêyùºÎŒ‚ªK© _Toc216071405}DÐÉêyùºÎŒ‚ªK© _Toc216071406}DÐÉêyùºÎŒ‚ªK© _Toc216071407}DÐÉêyùºÎŒ‚ªK© _Toc216071408}DÐÉêyùºÎŒ‚ªK© _Toc216071409}DÐÉêyùºÎŒ‚ªK© _Toc216071410}DÐÉêyùºÎŒ‚ªK© _Toc216071411}DÐÉêyùºÎŒ‚ªK© _Toc216071412}DÐÉêyùºÎŒ‚ªK© _Toc216071413}DÐÉêyùºÎŒ‚ªK© _Toc216071414}DÐÉêyùºÎŒ‚ªK© _Toc216071415}DÐÉêyùºÎŒ‚ªK© _Toc216071416}DÐÉêyùºÎŒ‚ªK© _Toc216071417}DÐÉêyùºÎŒ‚ªK© _Toc216071418}DÐÉêyùºÎŒ‚ªK© _Toc216071419}DÐÉêyùºÎŒ‚ªK© _Toc216071420}DÐÉêyùºÎŒ‚ªK© _Toc216071421}DÐÉêyùºÎŒ‚ªK© _Toc216071422}DÐÉêyùºÎŒ‚ªK© _Toc216071423}DÐÉêyùºÎŒ‚ªK© _Toc216071424}DÐÉêyùºÎŒ‚ªK© _Toc216071425}DÐÉêyùºÎŒ‚ªK© _Toc216071426}DÐÉêyùºÎŒ‚ªK© _Toc216071427}DÐÉêyùºÎŒ‚ªK© _Toc216071428}DÐÉêyùºÎŒ‚ªK© _Toc216071429}DÐÉêyùºÎŒ‚ªK© _Toc216071430}DÐÉêyùºÎŒ‚ªK© _Toc216071431}DÐÉêyùºÎŒ‚ªK© _Toc216071432}DÐÉêyùºÎŒ‚ªK© _Toc216071433ØDÐÉêyùºÎŒ‚ªK© ÀF SDGZNJ~Z.PDFÿÿ­Þ<6SySync_config_reference.pdf}DÐÉêyùºÎŒ‚ªK© _Ref185328417}DÐÉêyùºÎŒ‚ªK© _Ref216070495}DÐÉêyùºÎŒ‚ªK© _Ref216070116}DÐÉêyùºÎŒ‚ªK© _Ref185308797ØDÐÉêyùºÎŒ‚ªK© ÀF SDGZNJ~Z.PDFÿÿ­Þ<6SySync_config_reference.pdf}DÐÉêyùºÎŒ‚ªK© _Ref207680839}DÐÉêyùºÎŒ‚ªK© _Ref207680839ØDÐÉêyùºÎŒ‚ªK© ÀF SDGZNJ~Z.PDFÿÿ­Þ<6SySync_config_reference.pdf}DÐÉêyùºÎŒ‚ªK© _Ref207680839}DÐÉêyùºÎŒ‚ªK© _Ref185318147{DÐÉêyùºÎŒ‚ªK©  _Ref43725462}DÐÉêyùºÎŒ‚ªK© _Ref150068798}DÐÉêyùºÎŒ‚ªK© _Ref185314626DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© ”http://www.openmobilealliance.org/release_program/ds_v12.htmlyXô;H¯,‚]Ä…'c¥«{DÐÉêyùºÎŒ‚ªK©  _Ref47451048 DÐÉêyùºÎŒ‚ªK© ÀFwww.synthesis.chÿÿ­Þ¥ [D@ñÿD Standard CJOJPJQJ_HmHsHtHR@ñR Überschrift 1$$ & FY*$¤ð¤<@&CJ$KHV@ñV Überschrift 2$$ & FY¤h¤ð@&PJmHsHuJ@ñJ Überschrift 3$$ & FY¤ð¤x@&6N@ñN Überschrift 4$$ & FY¤ð¤<@&6CJDñD Überschrift 5 & FY¤ð¤<@&CJPP Überschrift 6 & FY¤ð¤<@&6CJOJQJLL Überschrift 7 & FY¤ð¤<@& CJOJQJPP Überschrift 8 & FY¤ð¤<@&6CJOJQJR R Überschrift 9 & FY¤ð¤<@&56CJOJQJBA@òÿ¡B Absatz-StandardschriftartLþOñÿòL Font_titel#CJOJQJ_HmHnHsHtHut0t Aufzählungszeichen! & F„e„›þ¤P¤P^„e`„›þCJOJ PJQJ mHsHuL @L Fußzeile  Æ_¾$CJOJ PJQJ mHsHuN"N Kopfzeile  Æ_¾$CJOJ PJQJ mHsHufþO2f List *+ & F ÆhЄʄ›þ¤x¤x^„Ê`„›þCJOJ PJQJ mHsHu$)@¢A$ SeitenzahlD>@ñRD Titel$¤ð¤<@&a$CJ0KHmH sH u(U@¢a( Hyperlink>*B*RþOrR console*„°„h$d%d&d'd]„°^„hOJQJLþOñ‚L Zwischentitel$$¤ð¤xCJmH sH u>V@¢‘> GesichteterHyperlink>*B* >C¢> Textkörper-Einzug „h^„h2@ñ2 Verzeichnis 1CJJ@J Verzeichnis 4„8„˜þ Æd# OJQJmHF@F Verzeichnis 2„ð Æd# OJQJmHF@F Verzeichnis 3„à Æd# OJQJmH22 Verzeichnis 5„À22 Verzeichnis 6 „°22 Verzeichnis 7!„ 22 Verzeichnis 8"„22 Verzeichnis 9#„€@Y@B@ Dokumentstruktur$-D OJ QJ .BR. Textkörper%$a$JþñÿbJ Font_text&#CJOJQJ_HmHnHsHtHu<þ< Tagheader'$$„V„ªù^„V`„ªù0þO¢0 tagheadertitle5hþñÿ’h TbT.TblTxtLft)1$d$ÿ¤´¤x ÆB*CJOJQJ_HmH sH tHNþ¢N Normal (Web) *¤d¤dB*OJPJQJmH sH uN#N Abbildungsverzeichnis+„à„ þ^„à`„ þ>%Â> Absenderadresse, CJOJQJ K Anrede-^6@â^ Aufzählungszeichen 2 . & F€ ƃ„8„Lÿ^„8`„LÿCJD7òD Aufzählungszeichen 3 / & FD8D Aufzählungszeichen 4 0 & FD9D Aufzählungszeichen 5 1 & F 8"8 Beschriftung 2¤x¤x5:T2: Blocktext3„ „ ¤x]„ ^„ L Datum40+R0 Endnotentext5CJDOD Fuß/-Endnotenüberschrift60r0 Fußnotentext7CJ0?‚0 Grußformel 8„œ^„œ2 2 Index 19„ð„ÿ^„ð`„ÿ2 2 Index 2:„à„ÿ^„à`„ÿ2 2 Index 3;„Єÿ^„Ð`„ÿ2 2 Index 4<„À„ÿ^„À`„ÿ22 Index 5=„°„ÿ^„°`„ÿ22 Index 6>„ „ÿ^„ `„ÿ22 Index 7?„„ÿ^„`„ÿ22 Index 8@„€„ÿ^„€`„ÿ22 Index 9A„p„ÿ^„p`„ÿL!@’L Indexüberschrift B„h^„h5CJOJQJ222 KommentartextCCJ./B. ListeD„„åþ^„`„åþ22R2 Liste 2E„6„åþ^„6`„åþ23b2 Liste 3F„Q„åþ^„Q`„åþ24r2 Liste 4G„l„åþ^„l`„åþ25‚2 Liste 5H„‡„åþ^„‡`„åþBD’B ListenfortsetzungI„¤x^„FE¢F Listenfortsetzung 2J„6¤x^„6FF²F Listenfortsetzung 3K„Q¤x^„QFGÂF Listenfortsetzung 4L„l¤x^„lFHÒF Listenfortsetzung 5M„‡¤x^„‡41â4 Listennummer N & F 8:ò8 Listennummer 2 O & F 8;8 Listennummer 3 P & F 8<8 Listennummer 4 Q & F 8="8 Listennummer 5 R & Fb-ñÿ2b Makrotext"S Æ àÀ €` @ àOJPJQJ_HmHsHtHfIBf Nachrichtenkopf.T„n„’û$d%d&d'd-D^„n`„’ûOJQJ0Z@R0 Nur TextU CJOJQJ8b8 Standardeinzug V„Ä^„Ä6Pr6 Textkörper 2 Wdà¤x4Q‚4 Textkörper 3X¤xCJLR’L Textkörper-Einzug 2Y„dà¤x^„JS¢J Textkörper-Einzug 3Z„¤x^„CJ\MQ²\ Textkörper-Erstzeileneinzug[$„Ò¤x`„Òa$bN¡Âb Textkörper-Erstzeileneinzug 2\„„Ò¤x^„`„ÒZ$ÒZ Umschlagadresse!]„„üÿ„ôÿ„à&€+Dp/„^„OJQJ4@â4 Unterschrift ^„œ^„œ>Jò> Untertitel_$¤<@&a$OJQJ4.@4 Zusatz 1`¤x 5OJQJ4,4 Zusatz 2a„ð„ÿ^„ð`„ÿ:þO": Simple Bullet 1 b & Fk:þ2: FeatureItemc„ª„Vþ^„ª`„VþTþOBT Errorcode_descd„„éù¤¤^„`„éù PJtHuRþORR BodyTexte$¤¤<a$CJOJPJQJmH sH tHuFþbF DenseTextfCJOJPJQJmH sH tHu`þr` GroupHeaderg$„h¤x¤<^„h"5CJOJPJQJmH sH tHuTþ’T Code Example 0h-D CJOJPJQJmH sH tHu\þ¢\ Code Example 1i„h-D ^„hCJOJPJQJmH sH tHu\þ²\ Code Example 2j„Ð-D ^„ÐCJOJPJQJmH sH tHu\þÂ\ Code Example 3k„8-D ^„8CJOJPJQJmH sH tHu\þÒ\ Code Example 4l„ -D ^„ CJOJPJQJmH sH tHu\þâ\ Code Example 5m„-D ^„CJOJPJQJmH sH tHu\þò\ Code Example 6n„p-D ^„pCJOJPJQJmH sH tHu\þ\ Code Example 7o„Ø -D ^„Ø CJOJPJQJmH sH tHu\þ\ Code Example 8p„@ -D ^„@ CJOJPJQJmH sH tHu\þ\ Code Example 9q„¨ -D ^„¨ CJOJPJQJmH sH tHu`þ2` List Continue 0r$¤¤<a$CJOJPJQJmH sH tHuhþ¢h List Continue 1s$„h¤¤<^„ha$CJOJPJQJmH sH tHuhþRh List Continue 6t$„p¤¤<^„pa$CJOJPJQJmH sH tHuhþbh List Continue 7u$„Ø ¤¤<^„Ø a$CJOJPJQJmH sH tHuhþrh List Continue 8v$„@ ¤¤<^„@ a$CJOJPJQJmH sH tHuhþrh List Continue 9w$„¨ ¤¤<^„¨ a$CJOJPJQJmH sH tHuPþ’P DescContinue 0xCJOJPJQJmH sH tHuXþ¢X DescContinue 1 y„h^„hCJOJPJQJmH sH tHuVþO²V DescContinue 2 z„Ð^„ÐCJOJPJQJ]mH sH uXþÂX DescContinue 3 {„8^„8CJOJPJQJmH sH tHuXþÒX DescContinue 4 |„ ^„ CJOJPJQJmH sH tHuXþâX DescContinue 5 }„^„CJOJPJQJmH sH tHuXþòX DescContinue 6 ~„p^„pCJOJPJQJmH sH tHuXþX DescContinue 7 „Ø ^„Ø CJOJPJQJmH sH tHuXþX DescContinue 8 €„@ ^„@ CJOJPJQJmH sH tHuXþX DescContinue 9 „¨ ^„¨ CJOJPJQJmH sH tHuXþ2X LatexTOC 0‚¤¤ ÆÀ! CJOJPJQJmH sH tHudþOâd List Bullet 1ƒ & F{ Æh„„„^„„CJOJPJQJmH sH u`þâ` LatexTOC 1„ ÆÀ! „h¤¤^„hCJOJPJQJmH sH tHu`þò` LatexTOC 2… ÆÀ! „Ф¤^„ÐCJOJPJQJmH sH tHu`þ` LatexTOC 3† ÆÀ! „8¤¤^„8CJOJPJQJmH sH tHu`þ` LatexTOC 4‡ ÆÀ! „ ¤¤^„ CJOJPJQJmH sH tHu`þ’` LatexTOC 5ˆ ÆÀ! „¤¤^„CJOJPJQJmH sH tHupþ¢p List Bullet 6#‰ & F ÆhØ „Ø „˜þ^„Ø `„˜þCJOJPJQJmH sH tHupþ²p List Bullet 7#Š & F Æh@ „@ „˜þ^„@ `„˜þCJOJPJQJmH sH tHupþÂp List Bullet 8#‹ & F Æh¨ „¨ „˜þ^„¨ `„˜þCJOJPJQJmH sH tHupþÂp List Bullet 9#Œ & F Æh„„˜þ^„`„˜þCJOJPJQJmH sH tHu`þ¢` LatexTOC 6 ÆÀ! „p¤ ¤ ^„pCJOJPJQJmH sH tHu`þ²` LatexTOC 7Ž ÆÀ! „Ø ¤ ¤ ^„Ø CJOJPJQJmH sH tHu`þÂ` LatexTOC 8 ÆÀ! „@ ¤¤^„@ CJOJPJQJmH sH tHu`þÂ` LatexTOC 9 ÆÀ! „¨ ¤¤^„¨ CJOJPJQJmH sH tHujþO2j List Bullet 0!‘ & Fˆ„e„›þ¤(¤(^„e`„›þCJOJPJQJmH sH uZþ2 Z List Enum 0’„h„˜þ^„h`„˜þCJOJPJQJmH sH tHuZþB Z List Enum 1“„Є˜þ^„Ð`„˜þCJOJPJQJmH sH tHuZþR Z List Enum 2”„8„˜þ^„8`„˜þCJOJPJQJmH sH tHuZþb Z List Enum 3•„ „˜þ^„ `„˜þCJOJPJQJmH sH tHuZþr Z List Enum 4–„„˜þ^„`„˜þCJOJPJQJmH sH tHuZþ‚ Z List Enum 5—„p„˜þ^„p`„˜þCJOJPJQJmH sH tHu\þ‚ \ List Enum 51˜„Ø „˜þ^„Ø `„˜þCJOJPJQJmH sH tHuZþ¢ Z List Enum 7™„@ „˜þ^„@ `„˜þCJOJPJQJmH sH tHuZþ² Z List Enum 8š„¨ „˜þ^„¨ `„˜þCJOJPJQJmH sH tHuZþ² Z List Enum 9›„„˜þ^„`„˜þCJOJPJQJmH sH tHu„þO! „ bfo1Yœ$„µ¤à¤<$d%d&d'dNÆÿOÆÿPÆÿQÆÿ^„µPJmH sH u W@¢Ñ Strong5Zþâ Z Simple invisible bullet ž & F«PJmH sH u6þò 6 new i Ÿ & F–PJmH sH u4þ 4 list   & FÐPJmH sH u2þ 2 E-Mail-Signatur¡2þ" 2 HTML Adresse¢6]Hþ2 H HTML Vorformatiert£CJOJQJ^J<þB < Standard (Web)¤ OJQJaJ3f‚Œ¨ÄX^‰³Âéû$-bipŠ¢½ì®`ÿÿÿÿ9ÿÿÿÿ7ÿÿÿÿ4ÿÿÿÿõÿÿÿÿóÿÿÿÿòÿÿÿÿðÿÿÿÿïÿÿÿÿíÿÿÿÿëÿÿÿÿèÿÿÿÿæÿÿÿÿãÿÿÿÿÜÿÿÿÿÚÿÿÿÿÕÿÿÿÿÓÿÿÿÿÏÿÿÿÿÍÿÿÿÿËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ3f‚Œ¨ÄX^‰³Âéû$-bipŠ¢½ì     ÿÿ®`4ÿÿÿÿ|||ã %ŽìoÓ›/(þ;WXêp‚ŒŒ¤Ÿ®¶¹>Ë'Ô±ÝÁíP ³ að!P(Ý+/N2Z5M?fIV cbv>‚¿Œ[– £|±p¼}ÈdÕuÞææ‹ðêùxÔ"!ÁA–RüVð[ ad®d?BDEHIJLNPW^hntx}‡ŠŽ™›£¦¨ª¬®±µ¹¾ÃÇËÎÒ×Ûàäçêïóöùüÿ  -  ï"J.é6Œ7Û@€I+PéVí]b¦g|nhsâyò†\Þ˜: E¦Kª ³ú¶¤ºBÄñËØÎåÒ—×Þݽåìî[ö¶üVDF H   H%,¡4¯;E„JO·WÂ^Eeœqêx i‡ÅŽ©•PŒ¤$ªs²V¹×¾YÅUÎwÖ©ßæ×ìMóÞùÖþ­f$µ/U<ÍL3S$V„[¨_Û`EbIcfd®d@CGKORTUXZ[]`acefikloqsuwz{~€ƒ„†ˆ‹‘“”–˜œž ¢¤©­°³¶¸»¼¿ÁÄÆÉÌÏÑÓÕØÚÝßâåéëíðòõøûý  V›Q(Þ6æ9òG™P^[{bþjÂs2}͈¦“{žÿ¦¨°Ê·ÁñËßÑ-ÙÊã/ðÜúŽøû )`º%e+ø07 BÑHàN·W_8fEt{I‚¸Š”ùœü¤§«Öµ?½´ÃÄÉßÏ™ÖDÞ ç¡îOöþøÎ‘"h7ËKRTüX¹^»b®dAFMQSVY\_bdgjmprvy|‚…‰Œ’•—šŸ¡¥§«¯²´·º½ÀÂÅÈÊÍÐÔÖÙÜÞáãæèìîñô÷úþ )+ÖüþšÂÛ3fŒã!RWyŽð+<k‹=eØÿ_”» M ^ | ~ Œ ª ¬ Ä â ä $'Nlo…£¦½ÛÞ÷3QTu“–±ÏÒï 2PSq’®ÌÏä<?g…ˆªÈËþMkn•³¶Êèë#&`~œº½Ûùü +.MknŒª­Éçê/2QorŒª­Æäçû=[^}›ž½ÛÞý?]`x–™¶Ô×úOmp˜¶¹áÿ(FI ÞüÿFdgy—šµÓÖòKv’Å#à#â#/$J$L$™8´8¸8–œ±œµœzŸ¥ŸÁŸÝ©ø©ü©Ÿªºª¾ªÉ¹ô¹ºËºæºêº:¼U¼]¼ÚEÚIÚ‡Ú¢Ú¦Ú!qL¼LûLxR’R—R®`Xÿ„Xÿ„Xÿ„X”ÿ•€X”ÿ•„Xÿ€XÿŒXÿŒXÿŒXÿŒXÿŒ Tÿ%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À•ŒXÔÿ€´ÿ•€Tÿ•€Tÿ•€Ôÿ•€XÔÿ€Tÿ•€Tÿ•€XÔÿ€Tÿ•€Tÿ•€Tÿ•€4ÿ•€Tÿ•€XÿŒtÿ•€ Hhy!ÿ•€Xÿ„ð˜ð/ðXRð$šˆ2IJý8[w¶×¢æ¥÷-ÿoøÿÿÿÿ2ð$:ëd¼>o4Àb3šI>©[ÿ ÿÿÿÿ@ñÿÿÿ€€€÷ðxðCðð( ð²±°¯ ðððn ðÅOÌ 8 ð3# ð ˆðð3"ñ’¿€ðx¢ ð4 ƒ ð0€…‡Š4¿»àã¿ÿðÅOuãð  ðð”ð` ð"!  ð5# ð ˆð×ÒÌ 8ðð` ð6 c ð$…‡–––¿Ëÿð¾"7ð ðr ð7 s ð*€…‡Š7ÿ™¿ÿð(ï^ð  ðð` ð8 c ð$…‡–––¿ËÿðÄ…! ð ðl ð9 c ð$€…‡Š9¿ÿð¯ïú ð  ððfB ð: s ð*…‡D¿Ë¨)ÿð?^?«ð ðfB ð; s ð*…‡D¿Ë¨)ÿð0‡0ð ð:ðn ð•&9 ðÈ# ð ˆðð3"ñ’¿€ðfB ðÉ s ð*…‡D¿Ë¨)ÿðrtQ ððfB ðÊ s ð*…‡D¿Ë¨)ÿðj~|s ððl¢ ðË c ð$€ŠË¿»àã¿ÿ𶬠Vð ðð` ðÌ c ð$…‡–––¿ËÿðêæPððr ðÍ s ð*€…‡ŠÍÿÿ¿ÿð_Â~ð ðð` ðÎ c ð$…‡–––¿Ëÿð“«æÒ ððl ðÏ c ð$€…‡ŠÏ¿ÿð_ÛÂþ ð ððfB ðÐ s ð*…‡D¿Ë¨)ÿð~×ððfB ðÑ‚ s ð*…‡D¿Ë¨)ÿð?ðð` ðÒ c ð$…‡–––¿ËÿðOê Pððr ðÓ s ð*€…‡ŠÓÿÿ¿ÿð,ë~ð ðð` ðÔ c ð$…‡–––¿ËÿðO« ëððl ðÕ c ð$€…‡ŠÕ¿ÿð,Ùë/ ð ððfB ðÖ s ð*…‡D¿Ë¨)ÿð®~®×ððfB ðׂ s ð*…‡D¿Ë¨)ÿð®7®ððð` ð` €°à  ðØ# ð ˆðT 7~ ) ðð` ðÙ c ð$…‡–––¿Ëÿð @°Àððr ðÚ s ð*€…‡ŠÚÿÿ¿ÿð` p€ðð ðð` ðÛ c ð$…‡–––¿Ëÿð °° ððl ðÜ c ð$€…‡ŠÜ¿ÿð` P€à ð ððfB ðÝ s ð*…‡D¿Ë¨)ÿð@ð@PððfB ðÞ‚ s ð*…‡D¿Ë¨)ÿð@€@pððfB ðß‚ s ð*…‡D¿Ë¨)ÿðb7bððfB ðà‚ s ð*…‡D¿Ë¨)ÿð[-|0ððJð` ð Ð@ ðá# ð ˆðÄ ê3~ðð` ðâ c ð$…‡–––¿ËÿðPÐððr ðã s ð*€ …‡Šãÿÿ¿ÿð À @ð ð ðDð` ð  pPð ðä# ð ˆðÄ «3:ðð` ðå c ð$…‡–––¿ËÿðÐ pPÀððl ðæ c ð$€ …‡Šæ¿ÿð    ðð ð ð` ðç c ð$…‡–––¿Ëÿðí Œ9 ððl ðè c ð$€ …‡Šè¿ÿðÊ «8 ð ð ðDð` ð  pPð ðé# ð ˆð¾ š -ÿ ðð` ðê c ð$…‡–––¿ËÿðÐ pPÀððl ðë c ð$€ …‡Šë¿ÿð    ðð ð ð` ðì c ð$…‡–––¿Ëÿð¦ Íâððl ðí c ð$€ …‡Ší¿ÿð•: £ð ð ðfB ðî s ð*…‡D¿Ë¨)ÿðC &C (ððx¢ ðï ƒ ð0€…‡Šï¿»àã¿ÿðM 4 l z ð ððx¢ ðð ƒ ð0€…‡Šð¿»àã¿ÿð³  Ùð ððrr ðñ “ ð6Tñ¥ÿ…‡Hn,»àã¿À33™Ë8cÿðöŽ ÏÍ ððx¢ ðò ƒ ð0€…‡Šò¿»àã¿ÿð½ =} ð ððl¢ ðó c ð$€Šó¿»àã¿ÿð -¼Áð ðð` ðô c ð$…‡–––¿Ëÿðç Š 3 ððl ðõ c ð$€…‡Šõ¿ÿðÄ µ B ð ðð”ðn ðþŽ Z  ð # ð ˆðð3"ñ’¿€ðŠ ð ³ ðB€…‡Š»àã¿ÿ?…àó ¿ÿðð ø:2ð¦ ððŠ ð ³ ðB€…‡Šÿ™Ì¿ÿ?…àó ¿ÿðþî¶Z ð¦ ððr2 ð s ð*€…‡ŠÿÌ¿ÿð¾>ì ð¦ ððfB ð‚ s ð*…‡D¿ÑÿðÎ’ r ’ ð¦ðfB ð s ð*…‡D¿Ñÿðþ²ð $ð¦ðŠ ð ³ ðB€…‡Š»àã¿ÿ?…àó ¿ÿðê Ž4Èð¦ ððfB ð‚ s ð*…‡D¿ÑÿðŒ¨ê Îð¦ðœ2 ð ã ðT€…‡ŠÿÌ¿ÿ?…àó ¿Ó°<ÿÿÔPÃ×PÃÿðr    ð¦ ððx¢ ð ƒ ð0€…‡Š¿»àã¿ÿðš=X ýð¦ ððx¢ ð ƒ ð0€…‡Š¿»àã¿ÿðÜI { ð¦ ððB ðS ð¿Ëÿ ?ð­$´2Þ2®` Æ©[!'tÈfþÿÿ¶%f$t3L'’%tÿÿ× _Ref216070074 _Hlt108492520 _Hlt13986753 _Hlt182821983 _Hlt182821972 _Hlt182821980 _Hlt182821935 _Hlt182821922contents _Toc17726654 _Toc75752647 _Toc127099644 _Toc127102463 _Toc128370874 _Toc216070194 _Toc216071379 _Hlt44132049 _Ref216070128 _Toc216071380 _Toc216071381 _Hlt216070424 _Hlt216070500 _Toc216071382 _Ref185328417 _Toc216071383 _Toc216071384 _Hlt216070155 _Toc216071385 _Toc216071386 _Toc216071387 _Toc216071388 _Toc216071389 _Toc216071390 _Toc216071391 _Toc216071392 _Toc216071393 _Toc216071394 _Toc216071395 _Toc216071396 _Ref216070116 _Toc216071397 _Ref185328437 _Hlt207680726 _Ref216070495 _Toc216071398 _Ref185308797 _Toc216071399 _Toc216071400 _Toc216071401 _Hlt185308943 _Ref184460226 _Toc184484618 _Toc216071402 _Ref185314626 _Toc216071403 _Ref185318147 _Hlt207681000 _Toc216071404 _Toc216071405 _Toc216071406 _Toc216071407 _Hlt108498210 _Hlt150068855 _Toc17726659 _Ref43725462 _Hlt43725468 _Toc216071408 _Ref108498418 _Ref150068798 _Toc216071409 _Toc216071410 _Toc216071411 _Toc216071412 _Ref150147280 _Toc216071413 _Toc216071414 _Toc216071415 _Toc216071416 _Toc216071417 _Toc216071418 _Toc216071419 _Toc216071420 _Toc216071421 _Toc216071422 AAAAAAABKN AAAAAAABKO AAAAAAABKP AAAAAAABKQ AAAAAAABKR AAAAAAABKS AAAAAAABKT AAAAAAABKU AAAAAAABKV AAAAAAABKW AAAAAAABKX AAAAAAABKY AAAAAAABKZ AAAAAAABLA AAAAAAABLB AAAAAAABLC AAAAAAABLD AAAAAAABLE AAAAAAABLF AAAAAAABLG AAAAAAABLH AAAAAAABLI AAAAAAABLJ AAAAAAABLK AAAAAAABLL AAAAAAABLM AAAAAAABLN AAAAAAABLO AAAAAAABLP AAAAAAABLQ AAAAAAABLR AAAAAAABLS AAAAAAABLT AAAAAAABLU AAAAAAABLV AAAAAAABLW AAAAAAABLX AAAAAAABLY AAAAAAABLZ AAAAAAABMA AAAAAAABMB AAAAAAABMC AAAAAAABMD AAAAAAABME AAAAAAABMF AAAAAAABMG AAAAAAABMH AAAAAAABMI AAAAAAABMJ AAAAAAABMK AAAAAAABML AAAAAAABMM AAAAAAABMN AAAAAAABMO _Toc216071423 _Toc216071424 AAAAAAAAAC AAAAAAAAAD AAAAAAAAAE AAAAAAAAAF AAAAAAAAAG AAAAAAAAAH AAAAAAAAAI AAAAAAAAAJ AAAAAAAAAK AAAAAAAAAL AAAAAAAAAM AAAAAAAAAN AAAAAAAAAO AAAAAAAAAP AAAAAAAAAQ AAAAAAAAAR AAAAAAAAAS AAAAAAAAAT AAAAAAAAAU AAAAAAAAAV AAAAAAAAAW AAAAAAAAAX AAAAAAAAAY AAAAAAAAAZ AAAAAAAABA AAAAAAAABB AAAAAAAABC AAAAAAAABD AAAAAAAABE _Toc216071425 _Toc216071426 _Toc216071427 AAAAAAAAFU AAAAAAAAFW _Ref185314205 AAAAAAAAFX AAAAAAAAFY AAAAAAAAFZ AAAAAAAAGA AAAAAAAAGB AAAAAAAAGC AAAAAAAAGD AAAAAAAAGE AAAAAAAAGF AAAAAAAAGG AAAAAAAAGH AAAAAAAAGI AAAAAAAAGJ AAAAAAAAGK AAAAAAAAGL AAAAAAAAGM AAAAAAAAGN AAAAAAAAGO AAAAAAAAGP AAAAAAAAGQ AAAAAAAAGR AAAAAAAAGS AAAAAAAAGT AAAAAAAAGU AAAAAAAAGV _Ref207680839 _Toc216071428 _Toc216071429 _Toc216071430 _Toc184484920 _Toc216071431 _Ref47451048 _Hlt47451059 _Toc184484921 _Toc216071432 _Hlt153795123 _Hlt153795208 _Hlt153795243 _Toc184484922 _Toc216071433ýZ?ƒƒ!        ßÅ#/$÷144æ5™8G<”F=OéRX¬[Še}j"mÂoq{ò‚ò‚]Œ]Œ**¦¦|š:œµŸÌŸÌŸ³£9¦9¦¨¬¨¬¨¬…·¥ÁÒÙÚ†ÚDÜDÜDÜDÜœäååíê†ìnó$û%û;Õ å óeËŠ!§! 2ä2(5¯7û<~>¯@]BìC˜EÃGI¨JÀO RVuYõYã[-_8b×ißk¤nÙrÓuExI~°€cz‡ ˆÅŠw`’^–µ—ß™Z›(LŸî¡D£†¥9§'©e«6®T¯‘±¶‡¶¸¼½½³¿ã¿5ÀdÀ„ÀàÀÁXÁªÁ ÂgÂÍÂ?ÛÃÄsÄ«ÄÅ}ÅÃÅÆjƯÆ߯mÇ ÈLÈÈÈTÉVÉxÉCÙCÚ8Û8ÛÝCßÜà÷âNå­çzê¿ìáîäñ«ó´õøÜúoüÂþ;çä%Ë ´ l¢[[°©D«K«KLLLLÜLêLîLRR¯`@@@@@  !"#$%&'(*)@+,-./01@2345687@9:;<=>@A?BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­Ç®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÈÉÊËÌÍÏÎÐÑÒ@Ó@Ô@ÕÖþZ@„„"€        ##çã#M$ 2446¹8V<¤FOOûR§X¾[že–j7mÕo&q{ƒƒ]ŒFFFÒÒ£šXœ¶ŸãŸ ¾£J¦J¦¨¬×¬×¬•·ºÁÝÙJÚ§ÚDÜSÜSÜ\Üåååë¦ì†ó8û8ûMã ÿ  }ã¥!¸!!2ä2(5¯7û<~>¯@]BìC˜EÃGI¨JÀO RVuYõYã[-_8b×ißk¤nÙrÓuExI~°€cz‡ ˆÅŠw`’^–µ—ß™Z›(LŸî¡D£†¥9§'©e«6®T¯‘±¶‡¶¸¼½K½³¿ã¿5ÀdÀ„ÀàÀÁXÁªÁ ÂgÂÍÂ?ÛÃÄsÄ«ÄÅ}ÅÃÅÆjƯÆ߯mÇ ÈLÈÈÈTÉwÉ—É`ÙCÚ8ÛÝCßÜà÷âNå­çzê¿ìáîäñ«ó´õøÜúoüÂþ;çä%Ë ´ l¢ŠŠŠåçD¶K¶KL/L/L/LÝLëLïL#R#R¯`bcÊÌÍÐÔÕ3W    N N ^  Œ ­ Ä å (Np…§½ß÷3Uu—±Óï2Tq“®Ðä@g‰ªÌþ Mo•·Êì'`‚œ¾Ûý /MoŒ®Éë3QsŒ®Æèû=_}Ÿ½ßý?axš¶ØÙÛúOq˜ºá(J¡ÞFhy›µ×ò##K“Å#ã#/$M$5&f&õ(ö(k3k3Š3Š3D8Q8™8¹8µ†ˆ‡‰‰‰‰¶Œ)–œ¶œzŸÂŸÝ©ý©Ÿª¿ªÉ¹ºËºëº:¼^¼ Î;ÎÚJÚ‡Ú§Úœäå.ì/ìfûtû üü@üAüDüDüYüYü’ü“üžþžþòþóþ2ÿ3ÿ6ÿ6ÿKÿKÿ—ÿ˜ÿyz%%Õ:ÉÊËËå E!F!G!H!H!"xR˜R*[+[+[0[<[=[=[?[G[J[K[¨[¿\À\¬`¯`ÿÿ Beat ForsterFD:\projects\SySync\Docs\Manuals\SySyncAPI Specification\SDK_manual.doc Beat ForsterFD:\projects\SySync\Docs\Manuals\SySyncAPI Specification\SDK_manual.doc Beat ForsterFD:\projects\SySync\Docs\Manuals\SySyncAPI Specification\SDK_manual.doc Beat ForsterFD:\projects\SySync\Docs\Manuals\SySyncAPI Specification\SDK_manual.doc Beat ForsterFD:\projects\SySync\Docs\Manuals\SySyncAPI Specification\SDK_manual.doc Beat ForsterFD:\projects\SySync\Docs\Manuals\SySyncAPI Specification\SDK_manual.doc Beat ForsterVC:\DOKUME~1\BEATFO~1\LOKALE~1\Temp\AutoWiederherstellen-Speicherung von SDK_manual.asd Beat ForsterVC:\DOKUME~1\BEATFO~1\LOKALE~1\Temp\AutoWiederherstellen-Speicherung von SDK_manual.asd Beat ForsterVC:\DOKUME~1\BEATFO~1\LOKALE~1\Temp\AutoWiederherstellen-Speicherung von SDK_manual.asd Beat ForsterVC:\DOKUME~1\BEATFO~1\LOKALE~1\Temp\AutoWiederherstellen-Speicherung von SDK_manual.asd×|ÿÿÿÔè,kRÿÿÿÿÿÿÿÿ}ÿÿÿª°˜Qÿÿÿÿÿÿÿÿ~ÿÿÿ Ú¢¾PÿÿÿÿÿÿÿÿÿÿÿZüNOÿÿÿÿÿÿÿÿ€ÿÿÿìÄf­1ÿÿÿÿÿÿÿÿÿÿÿ¨­F 0ÿÿÿÿÿÿÿÿ‚ÿÿÿA>/ÿÿÿÿÿÿÿÿƒÿÿÿ(`¨Ð.ÿÿÿÿÿÿÿÿˆÿÿÿŽÂ–?Nÿÿÿÿÿÿÿÿ‰ÿÿÿÔi´äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿbÆ‚ÿÿÿÿÿ„{êÿ€~ÆP˜>kÿÿÿÿÿÿÿÿÿõ>ôJQlWÿBûÿ D¢‰Ì\ÿÏCÀÿ³ÙÿyÔÿX@Æî\ÿX Vÿ¦­V†&ÿO ”õnJÿÿÿÿÿÿÿÿÿ8¶ cÆÿvEâ ÿ7B rHä¯ÿÆ'` †нÿN* ÿÿÿÿÿÿÿÿÿó6í ÿžLþ ÿ5DG ÿÎP© ÿør@ ÿ>¸ ÿ‰W(òC^Ðÿÿÿÿÿÿÿÿÿ &>ÿKÿÂ~í¶ÿ-z2âšÿ=8èŠNàÿ›`âš•ÿ£Vv–Sæ£ÿ8 ܪ°ÿÿÿÿÿÿÿÿÿTedÿ zRæ¿ÿØ]‚vü>íÿ¿ÿÕpÉÿ[plˆf¤FÿÌ)Æî\ÿØH„ÿG=¢ KŠÿÿÿÿÿÿÿÿÿ®\âÿ`tmÿyQ¼ÿ[3ÿPEÿ¥u¡ÿMIÕÿ•ÿ—Vê”wÿTK3!2ž‘ÿÜ+¾!ˆf¤FbMî!ÿt7#n âÿâ$@J\ÿð2+$ˆf¤FÿŠoÀ%ÿ¹Wz&,ZlRÿÿÿÿÿÿÿÿÿzU„&ÿ Ö&¢f¢‹ÿÿÿÿÿÿÿÿÿ)&'ˆ&^Ÿ±]]'ÿ½sô'ÿA(5(ÿ}1þ)2à<ÿt#ž*ÿ@+ÿÃ7C,pعÿ=³,ÿšB- ,ŒÿÎ-ÿF>A.üw²¦ÿÿÿÿÿÿÿÿÿEr.Ê¡ ºÿ%./ÿ¾c|/ÿùkž/Æî\ÿT î/ÿünû/ÿÁYÍ0àXP/ÿÖ1ÿOo<2ÿAä2ÿe"3ˆf¤Fÿ"£4ä2þÿ[t"6{¾;ÿÿÿÿÿÿÿÿÿ¿#6"O²ÿˆ[6¤ú9ÿ¿$•6ÿàÁ7ÿ(C8Ü(ŽÿAZ£9ÿK¿9ÿÔ$z:ÿrn*;ÿŠ+±;òÐðž‘ÿÿÿÿÿÿÿÿþs/=ÿŸu¥>Þ{Šÿÿÿÿÿÿÿÿÿ¿-B|:ø‘ÿGÿ§jæHõ¢ÿÿÿÿÿÿÿÿÿ–z-IÞ{Šÿÿÿÿÿÿÿÿÿg1K@âT÷ÿR2oK®°tªÿ[¥N~Ôvÿ¾DäN|g…ÿÿÿÿÿÿÿÿÿL;KOˆf¤Fÿ¹A˜Oÿ|lTPÿ·)\PÿûPx ôUÿÿÿÿÿÿÿÿÿ¬VQœ–FÿÛ/eRÿ y¾Rÿ SÿÏfS¢Ëü´ÿÿÿÿÿÿÿÿÿ2×S–ýžÿ†FUÚ’8§ÿÿÿÿÿÿÿÿÿz:%Uÿû=MUˆ1ôÿ°ÎUÿ‹%ÖVÿ+HÞVâæ®…ÿ¨OWÿðQnW¸—"ÿ?D~Wÿ:¶Wÿ˜MúWÿ¢VaXÿYÿ.Y*¶&ÿÿÿÿÿÿÿÿÿt~ÎYÿm )Z‰þ$ÿv<ÀZÿWU[tIŽÿv[ÿQv«[`âš•ÿŽRÜ[Ü(Žÿ³è\ÿÿÿÿÿÿÿÿÿóK ]ø¦#ÿbi]ècFFÿÿÿÿÿÿÿÿÿïu1]ÿ%K^Û,pÿ·V”`ÿ%ª`è`”Oƒ{u!a®°Lÿÿh5#aÿÿÿÿÿÿÿÿÿ~%aÿ¯2saÿ*]æbÿ·dÿLKQdÿïd*ðŒÊÿÿÿÿÿÿÿÿÿ YeàØˆËÿp8¹eÿHfÿIfÿ¸]§fÿS7½fÿ´!hÿŒJiŠ ­ÿ£!wjÔNÿÏ|ájÿü.–k £ˆËÿüuèk;œ0ÿÿÿÿÿÿÿÿÿÊ#ýk"NFÿÿÿÿÿÿÿÿÿQúlÿZD nÿ«M®nÿâI6oÿéZoÿåCçoÿ†~Ëpÿy5ëpÿâF£qô¨—ÿzFÈq¾ˆ£žØäqÜ(ŽÿÜdtä2þÿÈ @tv¼½ÿÿÿÿÿÿÿÿÿphvÿ_µv”)|â ÿÿÿÿÿÿÿÿɾw@J\ÿiD1xâëšÿÄõxÿØw&yÿ¨D·yÿøKãyÿ×Xäz*/JL %ùzÿ½w´{ÿú4~ÿô/~ÿÅn~ÿõ/¡~@J\ÿ‘ÿÁK ÿä^?ÿ²q{:1ÿÿÿÿÿÿÿÿÿÐ:Êvˆ^vÿ„Ô„˜þÆÔ^„Ô`„˜þ.„¹„˜þƹ^„¹`„˜þ.„ž„˜þÆž^„ž`„˜þ.„ƒ„˜þƃ^„ƒ`„˜þ. „Ô„˜þÆÔ^„Ô`„˜þOJQJo(·ð „¹„˜þƹ^„¹`„˜þOJQJo(·ð „ž„˜þÆž^„ž`„˜þOJQJo(·ð „ƒ„˜þƃ^„ƒ`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.„„PþÆ8^„`„Pþ..„È„þÆ^„È`„þ...„À„xýÆØ ^„À`„xý.... „¸„èüƨ ^„¸`„èü ..... „° „XüÆx^„° `„Xü ...... „¨ „ÈûÆà^„¨ `„Èû....... „ „8ûư^„ `„8û........ „à„`úÆ€^„à`„`ú......... „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þ.h„ „˜þÆ ^„ `„˜þ.’h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.’h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.’h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆhOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þOJQJo(‡hˆH·ðh„ „˜þÆ ^„ `„˜þOJQJo(‡hˆHoh„p„˜þÆp^„p`„˜þOJ QJ o(‡hˆH§ðh„@ „˜þÆ@ ^„@ `„˜þOJQJo(‡hˆH·ðh„„˜þÆ^„`„˜þOJQJo(‡hˆHoh„à„˜þÆà^„à`„˜þOJ QJ o(‡hˆH§ðh„°„˜þư^„°`„˜þOJQJo(‡hˆH·ðh„€„˜þÆ€^„€`„˜þOJQJo(‡hˆHoh„P„˜þÆP^„P`„˜þOJ QJ o(‡hˆH§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þo() „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.„h„˜þÆh^„h`„˜þ.„„èùÆ^„`„èù5o( „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ðh „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJ QJ o(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJ QJ o(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJ QJ o(§ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJ QJ o(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJ QJ o(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJ QJ o(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„¹„˜þƹ^„¹`„˜þB*CJOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJ QJ o(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJ QJ o(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJ QJ o(§ð„h„˜þÆh^„h`„˜þ.„„ÈûÆ^„`„Èû5o( „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(- „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „„˜þÆ^„`„˜þOJQJo(-„w„‰þÆw^„w`„‰þo() „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þB*CJOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh„ „˜þÆ ^„ `„˜þ.’h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.’h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.’h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „-„˜þÆ-^„-`„˜þOJQJo(·ð„ý„˜þÆý^„ý`„˜þ.‚„Í „LÿÆÍ ^„Í `„Lÿ.€„ „˜þÆ ^„ `„˜þ.€„m„˜þÆm^„m`„˜þ.‚„=„LÿÆ=^„=`„Lÿ.€„ „˜þÆ ^„ `„˜þ.€„Ý„˜þÆÝ^„Ý`„˜þ.‚„­„LÿÆ­^„­`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJ QJ o(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJ QJ o(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJ QJ o(§ð„Є˜þÆÐ^„Ð`„˜þ.„ „˜þÆ ^„ `„˜þ.‚„p„LÿÆp^„p`„Lÿ.€„@ „˜þÆ@ ^„@ `„˜þ.€„„˜þÆ^„`„˜þ.‚„à„LÿÆà^„à`„Lÿ.€„°„˜þư^„°`„˜þ.€„€„˜þÆ€^„€`„˜þ.‚„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þ.h„ „˜þÆ ^„ `„˜þ.’h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.’h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.’h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þOJQJo(‡hˆH·ðh„ „˜þÆ ^„ `„˜þOJQJo(‡hˆHoh„p„˜þÆp^„p`„˜þOJ QJ o(‡hˆH§ðh„@ „˜þÆ@ ^„@ `„˜þOJQJo(‡hˆH·ðh„„˜þÆ^„`„˜þOJQJo(‡hˆHoh„à„˜þÆà^„à`„˜þOJ QJ o(‡hˆH§ðh„°„˜þư^„°`„˜þOJQJo(‡hˆH·ðh„€„˜þÆ€^„€`„˜þOJQJo(‡hˆHoh„P„˜þÆP^„P`„˜þOJ QJ o(‡hˆH§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆhOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„Á„?ýÆÁ^„Á`„?ýo() „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(- „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJ QJ o(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJ QJ o(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJ QJ o(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þB*CJOJQJo(·ð„h„˜þÆh^„h`„˜þo() „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þ.h„ „˜þÆ ^„ `„˜þ.’h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.’h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.’h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆho() „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJ QJ o(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJ QJ o(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJ QJ o(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJ QJ o(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJ QJ o(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJ QJ o(§ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJ QJ o(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJ QJ o(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJ QJ o(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þB*CJOJQJo(·ð „„˜þÆ^„`„˜þOJQJo(-h„h„˜þÆh^„h`„˜þ.h„8„˜þÆ8^„8`„˜þ.’h„„LÿÆ^„`„Lÿ.h„Ø „˜þÆØ ^„Ø `„˜þ.h„¨ „˜þƨ ^„¨ `„˜þ.’h„x„LÿÆx^„x`„Lÿ.h„H„˜þÆH^„H`„˜þ.h„„˜þÆ^„`„˜þ.’h„è„LÿÆè^„è`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ðh „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJ QJ o(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJ QJ o(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJ QJ o(§ð„¹„˜þƹ^„¹`„˜þB*CJOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.„„^„`„.„„^„`„.„„^„`„..„„^„`„... „„^„`„ .... „€„€ûÆ€^„€`„€û ..... „„ðúÆØ ^„`„ðú ...... „ „`úÆ ^„ `„`ú....... „0„ÐùÆ0^„0`„Ðù........ „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„¹„˜þƹ^„¹`„˜þB*CJOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJ QJ o(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJ QJ o(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJ QJ o(§ð „h„˜þÆh^„h`„˜þOJQJo(·ðß¾DäNbi]‰ÿÿÿ‰ÿÿÿƒÿÿÿ‚ÿÿÿÿÿÿ€ÿÿÿˆÿÿÿÿÿÿ~ÿÿÿ}ÿÿÿ|ÿÿÿ?D~WYA(5(ú4~³Ùrn*;‹%ÖVÏCÀ5DG ¨OWØH„G‘ó6í |lTPyQ¼´!hÔ$z:yÔ SÏ|ájâI6oŠoÀ%·)\PŠoÀ%¿$•6þs/=àÁ7¥u¡S7½fåCço¯2sa¿%./½sô'Øw&yLKQd«M®nz:%U=³,Äõx:¶Wt#ž*¹A˜O &>Ån~PEZD nô/~¨D·yOo<2Bû%ùzünû/°ÎUéZoÖ1K>¸ Ifør@ y5ëpÛ/eR[3p8¹e~%a±]]'žLþ ÎP© ¢VaXïu1]Mî!×Xäzõ>ô DiD1xWU[7B Er.g1K—VðQnWÁYÍ0ŒJiÂâF£q[¥NÃ7C,¬VQR2oKÜ+¾!AZ£9½w´{†~Ëp†~Ëp˜MúWÕpÉ·V”`ŽRÜ[HfØäq(C8â$O ûP Ye%ª`ƒÿÿÿƒÿÿÿƒÿÿÿƒÿÿÿƒÿÿÿ Ö&ä^?vEâ phvÊ#ýkïdŠ+±;Š+±;ÁK Qúl¸]§fT î/@+`tmð2+$L;KO-ze"3û=MU zóK ])&'v<ÀZÎ-®\âv[¾c|/¿-B=8£Vv}1þ)Æ'` šB-{u!aùkž/2×S+HÞVÌ)X@Qv«[›Ø]‚zFÈq£!wjTK3!ü.–k¿#6%K^•m )Z¦­t7#8¶ Ð:ʈ[6Ted[plõ/¡~ɾwzU„&"£4K¿9„{êt~ÎYÜdt.YÈ @t–z-IŸu¥>€~ƧjæH8 üuèkG=¢²q{_µv¹Wz&‰W(ÏfS³è\N* [t"6†FU·d*]æbF>A.×Xäzh5#aX VMIÕ y¾Rÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ÿ@€ËË<›_ËË®`P@ G‡z€ÿTimes New Roman5€Symbol3& ‡z€ÿArial?&„ ‡ŸArial Black9‡ŸGaramond71Courier?5 ‡z€ÿCourier NewA MArial-BoldMT3Times]9T?hêt?pâüBk Avenir BookCourier NewA"GenevaArial;€Wingdings"1ˆðÅ©‰KgFí¢ÑFÄãȆ•AWYñþ%PWÈéÍ!ðŠŠ´´0dÇbf+[ÿÿSDK and Plugin InterfaceReference ManualSyncML Beat Forster Beat Forsterþÿà…ŸòùOh«‘+'³Ù0¤˜¼Øð   8D ` l x„Œ”œäSDK and Plugin Interface0Reference Manualter Beat ForsterualSyncMLrync Normal.dotr Beat Forsterual149Microsoft Word 8.0r@ˆeë É@þMÊI'Â@Þ$ìzÉAWYñþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®t0x€Œ¤¬´¼Ä ÌÔÜä ì än Synthesis AGvn %þÇbj SDK and Plugin Interface Titelt (RZ² _PID_GUID _PID_HLINKSäAN{DED6954A-ABE7-4381-8D7F-64BF75104089}A¸ra{ð>http://www.openmobilealliance.org/release_program/ds_v12.htmlBÞSySync_config_reference.pdfBÕSySync_config_reference.pdfBÆSySync_config_reference.pdft7(http://developer.apple.com/tools/xcode/_http://www.microsoft.com/?=http://www.metrowerks.com/.s http://www.pcre.org/license.txt%3http://www.sqlite.org/D\http://www.zlib.net/LT 1http://sourceforge.net/projects/syncml-ctoolkit/ &http://sourceforge.net/projects/expathttp://www.synthesis.ch/.(http://www.syncml.org/http://www.synthesis.ch/www.synthesis.ch'}* Logo-Quadrat, alleinstehen .jpg.ý*D:\Lukas\SySync\Docs\Materials\SyncML.tifb=-..\Sync Server Manual\sysync_diagram_big.jpg  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     þÿÿÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòþÿÿÿôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚þÿÿÿ„…†‡ˆ‰ŠþÿÿÿŒŽ‘’þÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿžþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF`Üò•CÜÈ<Å1ìzÉ €Data ÿÿÿÿÿÿÿÿÿÿÿÿ‰¯1TableÿÿÿÿÿÿÿÿóâWordDocumentÿÿÿÿ-4SummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿƒDocumentSummaryInformation8ÿÿÿÿÿÿÿÿ‹CompObjÿÿÿÿjObjectPoolÿÿÿÿÿÿÿÿÿÿÿÿ<Å1ìzÉ<Å1ìzÉþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word-Dokument MSWordDocWord.Document.8ô9²qsyncevolution-1.5/src/synthesis/doc/SDK_manual.pdf0000644000373300037200000441522312424517753023757 0ustar00nightlyallusers00000000000000%PDF-1.3 %âãÏÓ 355 0 obj << /Linearized 1 /O 357 /H [ 2110 2226 ] /L 1186451 /E 662831 /N 70 /T 1179232 >> endobj xref 355 79 0000000016 00000 n 0000001931 00000 n 0000004336 00000 n 0000004494 00000 n 0000004561 00000 n 0000004674 00000 n 0000004832 00000 n 0000005021 00000 n 0000005146 00000 n 0000005272 00000 n 0000005461 00000 n 0000005612 00000 n 0000005806 00000 n 0000006001 00000 n 0000006162 00000 n 0000006332 00000 n 0000006469 00000 n 0000006604 00000 n 0000006780 00000 n 0000006903 00000 n 0000007031 00000 n 0000007204 00000 n 0000007336 00000 n 0000007466 00000 n 0000007611 00000 n 0000007756 00000 n 0000007946 00000 n 0000008076 00000 n 0000008200 00000 n 0000008340 00000 n 0000008485 00000 n 0000008638 00000 n 0000008780 00000 n 0000008924 00000 n 0000009114 00000 n 0000009264 00000 n 0000009450 00000 n 0000009586 00000 n 0000009713 00000 n 0000009892 00000 n 0000010024 00000 n 0000010177 00000 n 0000010299 00000 n 0000010437 00000 n 0000010574 00000 n 0000010713 00000 n 0000010852 00000 n 0000010987 00000 n 0000011167 00000 n 0000011303 00000 n 0000011433 00000 n 0000011564 00000 n 0000011712 00000 n 0000011864 00000 n 0000012011 00000 n 0000012156 00000 n 0000012307 00000 n 0000012442 00000 n 0000012570 00000 n 0000012702 00000 n 0000012953 00000 n 0000013005 00000 n 0000013046 00000 n 0000013612 00000 n 0000013664 00000 n 0000013878 00000 n 0000014457 00000 n 0000015274 00000 n 0000015483 00000 n 0000048443 00000 n 0000061683 00000 n 0000064127 00000 n 0000064267 00000 n 0000065077 00000 n 0000065827 00000 n 0000096798 00000 n 0000098629 00000 n 0000002110 00000 n 0000004313 00000 n trailer << /Size 434 /Info 354 0 R /Root 356 0 R /Prev 1179221 /ID[<249cf20073e979528f301d5873119c5c><249cf20073e979528f301d5873119c5c>] >> startxref 0 %%EOF 356 0 obj << /Type /Catalog /Pages 337 0 R /Outlines 358 0 R /OpenAction [ 357 0 R /XYZ null null null ] /PageMode /UseOutlines /JT 353 0 R /PageLabels 335 0 R >> endobj 432 0 obj << /S 2443 /O 2782 /L 2798 /Filter /FlateDecode /Length 433 0 R >> stream H‰ÔV{PSWÿȃ‡!‚‹õ‘fw!†b5*vÃn:Š"+b AÐ%ò Q 2ƒWj,<Óx\…;®ÜtÐ)Ÿã uR׃ÐÑN> ˜»G§â‰ —“#¡°Š|Rc T,™p_ÅÛà?Ñ»éç¾Äšì›Áôã>¡¯£Cÿq,ž Jé?+{0ï‹ógSúOçofÄl:Â9±¯zojÊãÕòùõ~:¼FqÜ;޳-4?hˆ/½Q€3v?HºVìãͧ=iÛW8Ô+­^£<îÕ›y®#¿hGÛÝŒŸ[(t~é®=øtß<ÑPÓQ1«4ñÏùl·ÑrQo·«?·%8ìÐ+¿›ªêgÿåìîãô(i~lG¹™â»kAÄ­ÃÎM{ã?/ùXðf'OIùH-¸”T€Ïiê îµfVT­»avo ɉËùéòðS¥×’ÀãØê&«µFqŠýÅ[Q{îk÷VîsQ_øÑ’¨ñˆÛ´7|†ÙPlìþÁòðl΢ÚòêÎB'÷¦>L_qì;cždÍ­ÃühKGîk§–ò¢«”€uQÕCclçdžŒá=S…ǃûzIJZAõõ[”7,/uGöª‰Þ¦€=§3Õ­\¯Xég¨Z½gâ÷?N¨‹]ÙɪO‡ÌÊÑŠ£¦¬¡ÇÍIƒ z²nAdAѶ”þýÆÜ£wÞú¶}'ój›/‡+(ÎcÑ ‚îíÛŸ°²âè¢Zóv'ÛiT•÷Ò|¤wŸ©³‹P"îÈ6Ž–'u)(ô@Õ¢ŽÜ ·–òa^±O‹*© yÇýÕ6ƒ>äüŽ+¶Ú¯½}æ+\¡nÄÖzûÜgwð5…½.*aeîkqè§Ö²ªÃʽìç; i~qåç‡Ëp7WéÆ.D>ººlÁÓû—üY—,÷ÖîhŸÜ6{<Ø8?s$¾‰•ËLW~K2¾¼Wà? «¯©ÙÄr³”ú¼­*llЬ=•'íiÉlš;‘˜þwú's¶4eÔE»Ï™zÔßx#3-O’Xæ“ÍþM0¯°­žO•™²…êÖeAã¦xÉ)©6KéU¤jï_ ‘ŒE–ë{öîxØSô¢tWø…Ø8òJÑÀÈù³¿$ · =.Ptnºÿ»±|Ršî]vÿÝ l¥ð´ÛNÖEnj—n[òŠ—‘»ët– qcl^êþJŒAùgÍùï}›÷MYñËÏhS‡uôu™¯ê¢çåˆÝÊÊæ¤!“$=èLõõá:ºIÿru~C£lŒWxùä‹Ö¥6ž²I}ý`F[:×ú²9åÕá´jÆÜGãƒ)Ú©¡N6Û·t»ÂµaÊ€™²£+ÏÊ&{:3ëïÜæ²®ì(Úw©Þ-Ñå}iDW¤ѵìÊriBâÝþ‘«² tlεL å³¶V%Ö°çÜÑ>s·ëQž,p÷C¯¿ÅU?ÍoS¿Ó§‰²Ãݺ_ÆŽP‚^¨šÒo÷éNHÚ ÖH¦îL˜{wKRj:¿ä·6¦v]¢ëN$ˆ¾&eìÌ™(¤/2Y–U'”LRÌ_7œ;°"å±Â•]?´4+ÿûŒ­wÐçÔPyêÄä5åþ³Ÿ6u ZíöfR¿B̪¯_½\dŽ’Ý“›ëÝôi™7×ZÒ‡uDÆâʵÙ',W¡;ät@ ëÍþc(_°$"¿RÙÌ}Î+ôùŸ*ý†æ-¢Æ‡í™Ê Õ¥¦¡r¾´Eüð[çæÅ•‰Ù!~,ÕÓg]Å~¤>¬gЬ¾©–tùø“Ù㽈`ºïù%%è÷ô,))A7½qž ›ŽcØBL&Ë¡ÙâÄd«Í´éV—BÄba‹½Ôk ÂµÕØñL&“dz»˜L{/Íl×=½¸Ó11[íB.¦-´!Ú † ±HçÚRx<žX,NžÎ·â…pméd«G<í·Ñ-ûŒ6— †åèügÇxz2§y8ˆƒ£ÎItt¶Ûž<ÇH¨‡Ufˆ4wÆ@b›x6sÆ ùólKåÈDëÆã—Ìvö´­Ÿ'“â@nþA2yZÁ½ÿQLLÌ̲{zÐ cv2m!÷½Î2kàí[gO´¶Øòž=;=ù½!3õx–=õcÎpaØ·†1sìû‚rføNïš}ùQŸÿ³?4 8HY‹ž½¶Y~‹~ÃHQ0œå —0Ø„(ø ˆO \ªP™ @xÅ@À Èa ‚ ’(‡VíO@ä ýà%QŠ|D”Á›\…’Q`#­(D ¶[¡”Ö¨UD ¤Z¡$Ö@,4ð€1à à®ü\àÈ¡–ì" 9'9°8T|é/ñߊÞ 0 ¢Ëª‚“À¶àJŒáîÁü(\'øb¸ûàƒáCqhÔ+@{‚; ?µC#¸FA-Q›¤š0ÐàâÃà¢s¡ZˆÝ¸ä¢Õ@#áP4|¨ '°@‡ÓzÌ >†_ N à2)\Äø&²×ƒ§é°õ”¡gý©Fàó endstream endobj 433 0 obj 2099 endobj 357 0 obj << /Type /Page /Parent 336 0 R /Resources 414 0 R /Contents 420 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 358 0 obj << /Count 55 /First 359 0 R /Last 360 0 R >> endobj 359 0 obj << /Title (Contents) /Dest [ 13 0 R /XYZ null null null ] /Parent 358 0 R /Next 413 0 R >> endobj 360 0 obj << /Title (Error codes) /Dest [ 277 0 R /XYZ null null null ] /Parent 358 0 R /Prev 361 0 R /First 362 0 R /Last 363 0 R /Count 2 >> endobj 361 0 obj << /Title (UIApi Interface description) /Dest [ 231 0 R /XYZ null null null ] /Parent 358 0 R /Prev 364 0 R /Next 360 0 R /First 365 0 R /Last 366 0 R /Count 7 >> endobj 362 0 obj << /Title (SyncML Status Codes) /Dest [ 277 0 R /XYZ null null null ] /Parent 360 0 R /Next 363 0 R >> endobj 363 0 obj << /Title (Internal Error Codes) /Dest [ 282 0 R /XYZ null null null ] /Parent 360 0 R /Prev 362 0 R >> endobj 364 0 obj << /Title (DBApi Interface description) /Dest [ 183 0 R /XYZ null null null ] /Parent 358 0 R /Prev 372 0 R /Next 361 0 R /First 373 0 R /Last 374 0 R /Count 2 >> endobj 365 0 obj << /Title (Functions in the UI_Call_In call-in structure) /Dest [ 231 0 R /XYZ null null null ] /Parent 361 0 R /Next 367 0 R >> endobj 366 0 obj << /Title (Settings keys supported in SyncML Client Engine) /Dest [ 261 0 R /XYZ null null null ] /Parent 361 0 R /Prev 367 0 R /First 368 0 R /Last 369 0 R /Count 2 >> endobj 367 0 obj << /Title (TEngineModuleBase Class Reference) /Dest [ 234 0 R /XYZ null null null ] /Parent 361 0 R /Prev 365 0 R /Next 366 0 R /First 370 0 R /Last 371 0 R /Count 2 >> endobj 368 0 obj << /Title (Global settings keys - accessed using OpenKeyByPath\(\)) /Dest [ 261 0 R /XYZ null null null ] /Parent 366 0 R /Next 369 0 R >> endobj 369 0 obj << /Title (Session local settings/values, accessed using OpenSessionKey\(\)) /Dest [ 274 0 R /XYZ null null null ] /Parent 366 0 R /Prev 368 0 R >> endobj 370 0 obj << /Title (Public Member Function Overview) /Dest [ 234 0 R /XYZ null null null ] /Parent 367 0 R /Next 371 0 R >> endobj 371 0 obj << /Title (Member Function Documentation) /Dest [ 240 0 R /XYZ null null null ] /Parent 367 0 R /Prev 370 0 R >> endobj 372 0 obj << /Title (Change History) /Dest [ 174 0 R /XYZ null null null ] /Parent 358 0 R /Prev 375 0 R /Next 364 0 R /First 376 0 R /Last 377 0 R /Count 4 >> endobj 373 0 obj << /Title (Function overview) /Dest [ 183 0 R /XYZ null null null ] /Parent 364 0 R /Next 374 0 R >> endobj 374 0 obj << /Title (Function Documentation) /Dest [ 186 0 R /XYZ null null null ] /Parent 364 0 R /Prev 373 0 R >> endobj 375 0 obj << /Title (Setup Guide) /Dest [ 154 0 R /XYZ null null null ] /Parent 358 0 R /Prev 380 0 R /Next 372 0 R /First 381 0 R /Last 382 0 R /Count 7 >> endobj 376 0 obj << /Title (Changes since SDK V1.0.0.2) /Dest [ 174 0 R /XYZ null null null ] /Parent 372 0 R /Next 379 0 R >> endobj 377 0 obj << /Title (Changes since SDK V1.5.0) /Dest [ 180 0 R /XYZ null null null ] /Parent 372 0 R /Prev 378 0 R >> endobj 378 0 obj << /Title (Changes since SDK V1.4.0) /Dest [ 180 0 R /XYZ null null null ] /Parent 372 0 R /Prev 379 0 R /Next 377 0 R >> endobj 379 0 obj << /Title (Changes since SDK V1.3.0) /Dest [ 177 0 R /XYZ null null null ] /Parent 372 0 R /Prev 376 0 R /Next 378 0 R >> endobj 380 0 obj << /Title (SySync UIApi SDK description) /Dest [ 123 0 R /XYZ null null null ] /Parent 358 0 R /Prev 388 0 R /Next 375 0 R /First 389 0 R /Last 390 0 R /Count 8 >> endobj 381 0 obj << /Title (Plug-in System for C/C++) /Dest [ 154 0 R /XYZ null null null ] /Parent 375 0 R /Next 387 0 R >> endobj 382 0 obj << /Title (UIApi C# interface) /Dest [ 171 0 R /XYZ null null null ] /Parent 375 0 R /Prev 383 0 R >> endobj 383 0 obj << /Title (Plugin_Info program) /Dest [ 168 0 R /XYZ null null null ] /Parent 375 0 R /Prev 384 0 R /Next 382 0 R >> endobj 384 0 obj << /Title (Module naming convention) /Dest [ 162 0 R /XYZ null null null ] /Parent 375 0 R /Prev 385 0 R /Next 383 0 R >> endobj 385 0 obj << /Title (Plug-in module XML configuration) /Dest [ 162 0 R /XYZ null null null ] /Parent 375 0 R /Prev 386 0 R /Next 384 0 R >> endobj 386 0 obj << /Title (Plug-in System for C#) /Dest [ 159 0 R /XYZ null null null ] /Parent 375 0 R /Prev 387 0 R /Next 385 0 R >> endobj 387 0 obj << /Title (Plug-in System for Java) /Dest [ 159 0 R /XYZ null null null ] /Parent 375 0 R /Prev 381 0 R /Next 386 0 R >> endobj 388 0 obj << /Title (SySync DBApi SDK description) /Dest [ 92 0 R /XYZ null null null ] /Parent 358 0 R /Prev 397 0 R /Next 380 0 R /First 398 0 R /Last 399 0 R /Count 14 >> endobj 389 0 obj << /Title (Connecting the SyncML core library via UIApi) /Dest [ 123 0 R /XYZ null null null ] /Parent 380 0 R /Next 390 0 R >> endobj 390 0 obj << /Title (Using a SyncML Client Library via UIApi) /Dest [ 126 0 R /XYZ null null null ] /Parent 380 0 R /Prev 389 0 R /First 391 0 R /Last 392 0 R /Count 6 >> endobj 391 0 obj << /Title (Preparation for initialisation) /Dest [ 126 0 R /XYZ null null null ] /Parent 390 0 R /Next 394 0 R >> endobj 392 0 obj << /Title (Running Sync Sessions) /Dest [ 145 0 R /XYZ null null null ] /Parent 390 0 R /Prev 393 0 R >> endobj 393 0 obj << /Title (Acessing Settings) /Dest [ 131 0 R /XYZ null null null ] /Parent 390 0 R /Prev 394 0 R /Next 392 0 R /First 395 0 R /Last 396 0 R /Count 2 >> endobj 394 0 obj << /Title (Engine Init) /Dest [ 131 0 R /XYZ null null null ] /Parent 390 0 R /Prev 391 0 R /Next 393 0 R >> endobj 395 0 obj << /Title (Preparations before accessing settings profiles) /Dest [ 134 0 R /XYZ null null null ] /Parent 393 0 R /Next 396 0 R >> endobj 396 0 obj << /Title (Editing Settings) /Dest [ 139 0 R /XYZ null null null ] /Parent 393 0 R /Prev 395 0 R >> endobj 397 0 obj << /Title (Distribution Files) /Dest [ 86 0 R /XYZ null null null ] /Parent 358 0 R /Prev 412 0 R /Next 388 0 R >> endobj 398 0 obj << /Title (How to write a database plugin ?) /Dest [ 92 0 R /XYZ null null null ] /Parent 388 0 R /Next 411 0 R >> endobj 399 0 obj << /Title (The OceanBlue / SnowWhite adapter) /Dest [ 120 0 R /XYZ null null null ] /Parent 388 0 R /Prev 400 0 R >> endobj 400 0 obj << /Title (The global context) /Dest [ 117 0 R /XYZ null null null ] /Parent 388 0 R /Prev 401 0 R /Next 399 0 R >> endobj 401 0 obj << /Title (Callback calls) /Dest [ 114 0 R /XYZ null null null ] /Parent 388 0 R /Prev 402 0 R /Next 400 0 R >> endobj 402 0 obj << /Title (Datastore Handling) /Dest [ 102 0 R /XYZ null null null ] /Parent 388 0 R /Prev 403 0 R /Next 401 0 R /First 404 0 R /Last 405 0 R /Count 7 >> endobj 403 0 obj << /Title (Session Handling) /Dest [ 96 0 R /XYZ null null null ] /Parent 388 0 R /Prev 411 0 R /Next 402 0 R >> endobj 404 0 obj << /Title (The \215open\216 section) /Dest [ 102 0 R /XYZ null null null ] /Parent 402 0 R /Next 410 0 R >> endobj 405 0 obj << /Title (The \215close\216 section) /Dest [ 114 0 R /XYZ null null null ] /Parent 402 0 R /Prev 406 0 R >> endobj 406 0 obj << /Title (The \215general\216 section) /Dest [ 111 0 R /XYZ null null null ] /Parent 402 0 R /Prev 407 0 R /Next 405 0 R >> endobj 407 0 obj << /Title (The \215admin write\216 section) /Dest [ 111 0 R /XYZ null null null ] /Parent 402 0 R /Prev 408 0 R /Next 406 0 R >> endobj 408 0 obj << /Title (The \215update\216 section) /Dest [ 108 0 R /XYZ null null null ] /Parent 402 0 R /Prev 409 0 R /Next 407 0 R >> endobj 409 0 obj << /Title (The \215read\216 section) /Dest [ 105 0 R /XYZ null null null ] /Parent 402 0 R /Prev 410 0 R /Next 408 0 R >> endobj 410 0 obj << /Title (The \215admin read\216 section) /Dest [ 105 0 R /XYZ null null null ] /Parent 402 0 R /Prev 404 0 R /Next 409 0 R >> endobj 411 0 obj << /Title (Module Handling) /Dest [ 92 0 R /XYZ null null null ] /Parent 388 0 R /Prev 398 0 R /Next 403 0 R >> endobj 412 0 obj << /Title (Overview) /Dest [ 78 0 R /XYZ null null null ] /Parent 358 0 R /Prev 413 0 R /Next 397 0 R >> endobj 413 0 obj << /Title (Introduction) /Dest [ 73 0 R /XYZ null null null ] /Parent 358 0 R /Prev 359 0 R /Next 412 0 R >> endobj 414 0 obj << /ProcSet [ /PDF /Text /ImageC /ImageI ] /Font << /TT2 417 0 R /TT4 421 0 R >> /XObject << /Im1 429 0 R /Im2 430 0 R /Im3 431 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R /Cs10 415 0 R /Cs11 418 0 R >> >> endobj 415 0 obj [ /Indexed 416 0 R 219 428 0 R ] endobj 416 0 obj [ /ICCBased 425 0 R ] endobj 417 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 148 /Widths [ 333 0 0 660 0 0 0 0 389 389 0 660 333 333 333 278 667 667 667 667 667 667 667 667 667 667 0 0 0 0 0 611 0 778 778 778 778 722 667 833 833 389 667 833 667 944 0 833 722 833 778 722 722 833 778 1000 778 0 0 0 0 0 0 500 0 667 667 667 667 667 389 667 667 333 0 667 333 1000 667 667 667 0 444 611 444 667 611 944 667 611 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 ] /Encoding /WinAnsiEncoding /BaseFont /BAALCP+Arial-Black /FontDescriptor 419 0 R >> endobj 418 0 obj [ /Indexed 416 0 R 239 427 0 R ] endobj 419 0 obj << /Type /FontDescriptor /Ascent 1100 /CapHeight 0 /Descent -309 /Flags 32 /FontBBox [ -194 -307 1688 1083 ] /FontName /BAALCP+Arial-Black /ItalicAngle 0 /StemV 0 /FontFile2 424 0 R >> endobj 420 0 obj << /Length 504 /Filter /FlateDecode >> stream H‰lSËnÛ0¼ó+ö(´æ."mIQ m_ŠTUN $2l%(òIýË.Eù¢0@-áÝÙÑÌhuû@ð8©ƒ"6ÈŒüÈ2¦lôlv¢qÐ?«ÕÝ3Áz¯¾¨÷­Zµ-A»U2lÊp©(l‚ÌúFîÑXheöáŸæ6S?ªZþ4ÄÐö*WÒõ[}«¾jf¤jÐ$çVSÀf¹uM]5ŒýŸºñµ{‚¥a¿4|oïUmÑŸ ïh×Ë&:mâTV=¬?B7þøüôú¸án|Ž‚h0VìØn+ôÈ3òM«v ˆZ&ð" `}© &d8j›ÅùW’èe¯(â¢ÍjΊd*&žHQá:œÏËq]Îÿuí·ºöI”€—_Ìœ=Z"—É9ÓðYŒË^‹o£ M» ¤ê3ÜÍ(¢ 3ŠÁ\¸F1gÞ±ÌoDvXÁÆêˆ¶Bºª‹z’Wò"žÏIcàÐç¤8c‘] A;/(ØlêûN×®µ©j6&ü8¨¦A 3^#6Hp³9¸òÞ2N .—àÄÎ}Å/n¥ >ÊH è.Q·ç¨_&ÆhæÏ¾ò1dºõ©,Nþ‘‚VçG‚o0kœó•$Ò’ÏTMZ ªvZ&Ýrw·§·û+ÀUùÆo endstream endobj 421 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 252 /Widths [ 250 219 406 667 0 0 729 177 292 292 427 667 219 313 219 500 469 469 469 469 469 469 469 469 469 469 219 219 667 667 667 0 0 677 615 635 771 656 563 771 760 354 333 740 573 833 771 781 563 771 625 479 615 708 677 885 698 656 656 271 500 271 0 500 0 406 510 417 500 417 323 448 510 229 229 469 229 771 510 510 510 490 333 365 292 490 469 667 458 417 427 0 0 0 0 0 0 0 219 0 448 0 0 0 0 0 0 0 0 0 0 0 0 0 219 448 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 ] /Encoding /WinAnsiEncoding /BaseFont /BAALMN+Garamond /FontDescriptor 422 0 R >> endobj 422 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 34 /FontBBox [ -139 -307 1063 986 ] /FontName /BAALMN+Garamond /ItalicAngle 0 /StemV 0 /FontFile2 423 0 R >> endobj 423 0 obj << /Filter /FlateDecode /Length 32868 /Length1 44520 >> stream H‰|V PT×þÎ9÷Þå!¸V°Èª¹ë$î®ø‘˜ ì"  »jÌ.EY­X“®M-í§†N¢mó0m2ÁNîªmˆ¦ é´M›š×Œt:mm31f2>&¡Q'µÂíqÀ&=‡Ÿû¿Î¿ÿqf/€D!P¹bUÞìÚŠÀYà!Ò.¯kG^¿^¼X °Wëv·ªû·®~‹l¤ÐÆÈ¦æ›7¼È…$WlÚÚ¶1«}ÖB ³8ànl׿‘é/ x™ßHŠÔe  ñ{$g56·îé¬<þ’IÕ[[êÂláárà©+$¯oï‰Ø’®Òy/ù«ÛÂÍ ŸµtŽgž‰‘–­„›ÖqɲGv4Dr¿ysF¢òë8ª›Ð,ã æùa¸fÞ"ý÷³¡Pc𿫃èÍ!ÖüŠõ%§îZ#üŽ|¥“ ý:ö!Óð8íylÜX‰Ã,÷a=~Eº\ìÀÓ˜‹× #•tãIHÈ&ý ÌÁ:Šä\ã¡o‚‹xš˜„,âæ¡ kð°•š-æóuSz;&b ¦R§QT/|”C u³›wöâ[„ùÛ´¿G}”0Ÿ@~ƒ·ñÞǸ€'¤SY.[Ì`e´«Ù¶ŽÕ³&ªý7Ø£ìëbGسì${ŸýÙBÎn°4hœ ®P™<—ßÇ—ò0e²™:õ(×i¿ÀÿÂÏó/D–˜&f‹|á‹ghâeñ Rå8GÚ'–ÎJç¤JýÒ ¬ÈºÜA{P±)ë”Ê>åiå[®m~‚†x–r½Ž"iÒ-šnðc+_Šu°ás–ÊÄE8PÁ籟Aáy4ÿ‹å2þ;\ÇY¼KÞ¥Š ;Ù ü›Õ¬šªÙÏ® À>¬HÊSöá§„:Êw‚Q§vâ5Y§»q£ Éæ‰âO8IÓßAw}›yͼJó±¦0™îk9 ¦ºƒØFÝH“_FÓz†n5Þü…ù æÎ™=kfÞ Û5ýÞÜi9ÙYÚT§zϔɓ™3¾>!=müׯÙǦ¦ŒINJL°)²$8ƒÛ¯•„T#'dH9Zi©Ç’µ0)Â#!C%UÉhC ÅÝÔÑž^òÜx—§wÈÓ{Ç“ÙÕBzܪ_S·}šÚÃÖVˆ?èÓ‚ªq5Î/‹óRN\H!Á餪?£Ñ§,¤ú’ݺ?ä£x±ä¤b­¸!ÉãF,)™ØdâŒ-c%‹Yœá%þ‚GB ¡2Ê5Ÿß(Ó|CdûÃõFeUÀïs8AÛ`ÅuZ­­È늻 8þC)6lñר›­tСÆÜ½zgµ!טz­>¼>`ˆpÐzÇ8—±DóKö~”áq÷°ŸWŒÄâ†êÀ+(7£±²¨Ï$O]øu½}´»Ç]±2à$<š¿Sµ® ı‘;ËÈ£×[:+¡T4¿¥ mQD­HkÔ·„¨ ™º•mΙåÞWÌPîWõê€æ4îwhÁ°oR, úʶ“e^µl´ÅãŽÙÇ Õ0–:ö63&e$ÓpÇçâîG¨‡‹È,DZ5ßPëTBÐ žoýkȇ^—On´‚Œjµ™*ÒíV‰ål»¦ê×A-Ö®^­ ßÖ(Ùöë°Xkî Ù‡yÃå2¦O·fÀVLM#d‹ãò<{·Q¡EìªQA%Ce€ ò¨äN§Õ¿Ž/jI0¢U!YE­ã¼y® ÁC–¥wØ’^cY¢Ã–;ÇC ê)Xß3éFBο±ö ãý›ðÌ Cvº~5&ÉÙze '¬w8rBzgZSB—L×K4µDéá3Z«©vMUTèh8¥ót‡Ã(é öP#£ºs† bŒ/qÜ!ˆ«X¥UT­ äÇû ˜rq€¾¥. ~4øŸ„ýq¨#\ænëÅË2ýZˆ.Ô(](—û°€5¡Š×à'¼Æ<'š°ˆì‘o5b)=÷ÐÇR«èE)Ñ"Ñ ¢D›‰ê‰6Y>kÉÑŠqx˜øem5ËMf¿t9AÅ… ²³¤(ÿ’Ži¼.Þm®’/£@êB²ÒT²e*^l ¿âÃ20]ôa™tÙ¼%w#›b~jK7¯È]H’½ôô¢”»ðaÞÎ]f=‹$˜×x7ޤ܋¤tL5XNúbëÉ»¢Z¤~ ë£õQü^Ì¥g½/‹ôQQ†¸ŒŠ“Mùl§zå“ì½æ5¹Æ¼$º1‰âÙ¨~óEsH`çgŒòÿ‘•wœ(o+çáœ,ü¦/%Âv7±>s`ÝmÅq¤&ú`t¡–b¬ º’ÜJµŽˆ.ó_T‡±T{¿E¶>L¡ü¬ZY3rXé3÷߯9Ëš ¢Cq¢:Ó¹<Š](Ÿ‚‹æh†ä…›ê=ÀÿËy•ÀFu]ÑûþnlmÖ*m4V¾…uÀï¼&Ñ}ç}uýF¢Ñ€Wi¤f`%ök²Ž•6B´Àžgq—[÷€×…­µ ØÿØã  xŠý%Að»€~œ*çɇ8ZÅšeݰ>Y#¬èÀ­„h¯÷Àgeüü6Æu•À| eØ?lÌâ˜aÝò:ïÚ†¾X'Yfs ;ú—Ü(Ïäý²¾îrcú†Í#ÆÚñ¢Ù¼FöÝö8»¦û±Íñåpúo¼føð½ ’áÛCݼ'öqz Þ‹8pLAÎ ›÷2þÒÙ,½bÇl!ÇÅH†?[Ô4rÕÔq>AœŒdÎ-¶vGpÖ¿YæÜÃñÏ WgÞKíx†Öÿ[¶órGöü³ÚȲ´‡gωc‘ã)³ÖEЛ‚µMávιêÛé­#= o[éueú³8—þ^6ï²TŽ1Gïóù<Øû}lÇ]&çª_EN`íó™A—êxšeï7†{g;âùVË#—ö0­ãñ\/ÿ z»C òUªçà¯Fjä:¼ï“'—|ž´Û]Nù;Ô`÷û>rëj*PÂôœ¬ÑD»ý:òØY䪴@º„òïÁÿÀ;Û¼†÷*W$仃¸£Î¥?¶ëy ˜ëì<›‹õ>ASmMóÙecºÒ˜¾®„ýçáy {·°w gȾú ¾bñØYé³lËÈ'RÓTø£ŠaÉú+ãGoû óÙ÷lªïg|¥Ãv=në6*5f£ ‘æ¹ÐžñÚ)=˜¹£Ê›‘7.šwÙ1¦Ã¿ù8ƒ&ò1䈇ëÈ?'—]ǹßáû¾X€»šÒÆCK¸›ì¶1XÇrò1”/¦ÿ®Ü±íøä/Q­VÆúì±·ñ½Às7Ú¹{›s/òtA§?Áxúò8oñz.#ïÿšl.cÎËT ,V[=€!®X…?8cVQŸHõ ô õ ÷)ÔWÞ'qIzK|(Þ¡0±ñÍÖJsÚ6³*)|Ç#‡™½o‚«_;Pˆ“²òÀÌ#æ‘È,sC¤Â¬Þ9ƒ–\+\u8RhV'¥Ë·f²¹¦­Ô¬Ú‹Õí±ylÊoMÁÉW·ò#‡bž˜T½‹ÇR±˜ÚkuÇ¢1%A{R¨‰ÍÂòXë¡H›¹ ¨ÊqGÜ›¥Ç6ó´ñH*2Š GÔ[f¡j£gãPØ%.à€/à€ O!.@%yØÛk:m䎞O®'/È äi¦^¦Kº6Õ¬rkeÚjmöSmPKkz™¶X“% :a’T`ªŠ Sa²‚f•)—É’,a`­´UzE:-]“Tš7AèóÖü@Rt$æW€¶8´Þ¡u­u¨Ð¡±ùò9äuÈåP®CšCеüg ¼ü8Ä€×€ÃÀAàð° ØlÚÍÀ ˆM¶ÝŽù6‡ZçPCcr;4Ê!Õ!Ù ‚‡€AàÀià—ÀëÀžùÞoN4­GWëÑeúD£ÄãB£Àðc Ÿá1F.c”aš¡’AHiõñÔÓT߈º$ˆ¥=±<®ëDÜWOõKë Dü¹^ª_R¯Õ㿯 ÕÇs"MÇ„øv3jãÒ·’‚–6aË\µ¯(î›Ýt*zfßóEÌÑ}Ï77ûC÷ÿ î}õ ;OBs›NèæEÝ\«£®~ ª¢\½¨Gíª‘h£¶ú§ö·L û Š1ÉÈ.s7,©Ã\MÇ ªkž½ÂáãRî(¬º¥¨¸¹ÎïiÔÞBMqÁî¢Sø³ñ冚ã®`]<à¦iáianBÀpÓhT»3M»kŠ‹N‰72MT{áOê…¨Ë^uÚeûEpYtt†B«:VeVØÕy·üï·ÑÑÙÙeSWgGúƒ:ºØXˆ:×ÙeÑIqyîú¤4vîú¸µ¿%Ήë\Q©( Î×:;ß³bs[p¿ÌÝGpν3"D‰ÿdbÏø–!¿ åVn’~SHø qƒÔòI‘À_Û;x> ÚZ<§—O÷{'{‹ú< §>·TúŒJ –v¥? Ô"ʧbjH¸dJŠ?ZÓÆ½næºç4ú‰üŠ2þ°Ûoù%ò{œGÀÖ?è¿æOûu¿?XâõÍ,[ù̶+»f–}Ý;³¬Àsë ÕÞ¾Z;½ü-XR*O.<ãáG*+üùctÉ-4=ó‚ÆÉ7G©úè€<úŸ\W}lçß{}gŸÏ¹øì‹ü•Kì|ú;±ãÄÁ‡ 8e„˜'8! *… HGICT£ ­D—ŽM¨)ˆUý¶¡–¯uUǤHÒ¤²©üQMUÙÈZukš*V&Åì9¶nwzï½÷Þç¤çžç÷û=ÏÉÑÚP\Q<ÓÝܘÌj×á(=5ò|<žHDÃ?+]¿gùScwW0Ø»<‘¨ÔôndCnÔ¡û+Œ>bÜŠdCì)¢œ’¤UˆˆÄO>&Ÿšh#àæ’¸”L‚¿I¤-¥ÄxHþë ïxJþp¶·4u¹ãxmÜIu„›’ö$QqýL³ÞÙ¥5ž(}ŠkŸs¹ÒÚÐxéàÑèÃß›þ ]Z5ò¡è/Y8› ŠfÚç­”$Æ´Êc—e‚Ý.§ÃAñV–5‹â‰‘a“Èò%Ãç[å¶VŸµÐ&Ì P å°y‹žÓ®Šª³B¥ÝÉ+ %J²ÃÌJdÌ$"ÍIÔM ‹–$™"ÄÝsµ®ä”1…(JÀ_ÎN*•ŠiJ,©MíQbHƒµ1`+e˩ԋ©Ç–å5³t¸é°¸0®2&­2ŒÍby ,<^¬\!–{Œ#æPIÀ ªÝj{ÌÞ€ac÷† ø£¡BáÖyÜUz/?¿¹®ÅD=£¢LëÇoôyªkMÄÏÓ6§}ã¶ŽmÞl Ÿ ­ûéä çûš{»±Ï:ôBO÷Æú$Þ`!Ÿ7ì=üB`ðX~çê·ÓS±Â±£Û·Nk­CéÖØ|£§Ñf¥YŽ6±6†óöýmü'ëB.Ó¨Vëœëšm9O¬sÏ…M©½ý|ƒkCÕ”¾}×±ötaù ΄­±íç;ªwŽ´õÿ6åÝe•QuŒ!.:Éêc‚ y¡ˆÁ©¥²¢üŸœ¼WÚZZ@@ Õ8Ôª®Ÿ+} Íš/Y©Úš«êvÊ.#$ 2¢ˆýŽõàÕj\­,/ÙOC¢[#ØiD²±ÄJ9Cfˆ?e¨U¥xjŒ¸æŒºm0Ú09JZ]¼c(3uÄY³~ 1™¡=Õn®~uì‡WïžÛ{󯇒QÖÅGbý³Íüjà8®=9þL/Â?)ÙðÚêÕ§'‘à‘Wp) Êqå[ÅdQ°r½ˆ°wpT˜. &$ˆ‚_ˆ9a –×…›+žÁw¦ý'ñÿ #Œ7 ø„JbÍ+œÁfŸ£§e´FkÊØÈ›×Mw2ù5ÏÆ²Ö’îµw­}å‰]?vú/†¤­‘þçJ÷f>(þ ôÙég§Û‚.ˆgþšÔÑ<ÊbF?à¤*B!.B$ÁFC=¡5€Ð|V•³Y•å"‘ù(+G£,Šô$HÈSÁªÖl Èqrw´˜ÍvÿN„"Q“šJxª:zª]R…hO›а\–FÎÔš¼Ð‘Oå]ó‚ !hÙBïVÍK0éþ9tÝD·Ñ=DGŽ(JÔCû±cFb¾Yáûò⢸(¦ Ò+å´2 ÷ÚrR+›,Âj–7Íò‡¹ ÆÆ êæ ëÿ•$V äöx¯4ÑŽ·‡m¡¸â¡ü9l¬`ª &¸À¢œ30×a® »qóØÜÕR²9‚Ì“â+’|·cŠn¨eÌ”I¶^±Û+¯N²Þ@„}ªÞÊ»Å*î¤ÜÁfÚ#ú1MÕ¿3Nݪyžå¤Õº!è?çñ2»Çc$aâuÉRáâlkÇü*7gì¢B'í4[é©eŠ|B^u#UãÅŒ,TÕ"¿2üÚeZ0½8ÔÿKDáÈ%>o¶^ý…eN˜,/cöâü\„ãns÷8ÆÏíåÎp¿à.r×¹›ðÀáæ8Š+Ç Ü"ÒÊ“Q¶¤˜åJR¥Àkøë¾[’ %™zgåFÁ_ŒÝRzC' \ƈ}[·_ï^¹Ž˜ƒNøÑ›tiÎyÎhö9:眷´óžÖ¥}6¢?¢cШQ‚ ͽì^’Œl=bG¨œ`ubECx¼Ûl“Yè«`µ×7mÜ—;WzÓÇÐÑÝ«cvMRº_-~nÄcTþú¹^=l¢)³ _”è")¢óRÑjG²9où2'Éûä£òYù¢ÌˆrN¦dm TG2”ì›2, HVÞÅ”„’ˆú°ÑÍUCÿ5Ü6Àozig,[C­ªµkc¥ë°Fá÷1M(¶Ÿ&cÎ#M?¼ƒ{ѯ!su—ÈÛ¬•?GGP¯ýˆÜ5Zœ ›sPQ(w­‘ÄwÚÃé5MÝM«ÿÍsÕÀ6qžáû¾ï~ìó]|¶cŸqì8N.±ãàØ±ÇÁ>Àÿ$Å@ÊŸø+„1 Y!I¡c0Ä€TtL£P˜ û l¢ÙÔI©Š†*´Ih¥ª´À–!4­šê&’ìýάút¾OwgË÷¼Ïû<Ï»lfk67òðøþ©gäw²@Ò(cÆ=„)%î@ËÌ cvˆ| Ë½¦*ÇzÔ¾RšBU¤qídn wî?]ÙÚ§ÿF8/àfösË¿€ ÅU n³|ƒ™bÂÆJf33$¼ÂÜbî3O™3ÌlÐÐØ /¹Ž´Á OJ† ûÝ T1Ô,-VK[%V/Lz×`í3_\½/‹À\‘i£5Ä< . Ýê^— AŠÌÓ&ö²­‰]™M7u\¼ó³–Èyäð÷¯ZÐï­íï_ÓߌðÁm'oÄ뎡ğ?@‘«íÞ<8übíÙýë^¿4õ‡©Ñé]¨ú6üÃ3Î9™FfÙ­Ë=‚ú ¹ŠKvq]Hòz妯ä¾ÍB>ª¹J`k8íò°Œ9!ò˜ÌÊrºÉÌŠ½ã“zÁÔ((¤ªõÕ!ê€Tïç  ±«9ÜØL+I9m²¼Hmõ¥)Á7~0•F%Õ³4hƒ1þ»ÇâJš,szºÅR›O°•ΛɊpvÈ‚ä𸲶îJÄ>;Q~éŠÃ"òr9›\¶ŽGަ—שּׂÈÛ5›`+±±Ve` ˜ñ}xß9Ì_Œ†±Ú±(¾ EÈÅðÅÈÅZ⎸kÝQⲺD—جÖãÑpi4öùÂ6€ÁÝ®·ÖG‰Pÿ1â=€ß|p K öœÑâ¬Q[˜-± 3„fa°AØ#ô ?,‚È2σú°Žu½åÍT2dh{µË򬮾´í]ºÑþ©*‰€`qÊ‘‰‚#tÑM„‹07þdzQ•×ã¯âd·BíÛ·¯Z2,P¡‡å,0ÓW‹°›”¢Éxæ13œšsHR‡gÈöó/¿èY"©NÿŠËNŸÙž; ©5n–·Xì¯ÝüÎ…?z¹¢mÇ…Ãe³Å¨‰Z/'rØÂ³˜ç¡ÇÙhÕÖ#Ô»ãÌìX`M‚rì{ïžÜýøéâöC<ÆdæV„DÎXƒJ,'[ Û˜£†+\£ùP‚a6éá! iš+ˆÞb9ß²Måƒ.ÙVß ‡RcCK&Ô:"¡¡G b´Q9£ +Ÿ)¬rÏPGU< TdfÑÉDiÈÌ45Ói/79ž£!›âJ¯9Ì\â SpTæd9øCÎLp*í;L¡ˆ¬¹¿Êýjÿ®|Ϧ·¼ß:»rê_^[ZWå Å÷,ktpÓ¢No2Ò×R·÷µóä+ç…Éöî…ï®CK¯oüdj"1£Æ]©­ºéØÏÚ"uå]«³ñ¥»a¼ƒ‰æ)¹˜d™EÌc[[k[Ûñ SšÉ0­L{&÷PzØÐçñ}íc±Ãdg‰ÂZèõ±ÂTn†Ÿ%F( ·’Ÿñdj2$ÞL5fÚ„ê4!B>W}:$œÎ] ]}dA˰‚”ôsÃÞŸþaz4Mré=°!i0€‰i %€Í…b2Ï‚9s˜xæè¬fŸ˜¤w))Y`%SO5–w«‚ê†ÁAë Y˜¯ ²¼ÊÛQe 4=®h'€/]Epe1i;({Ó).‰/Õ#\Ãîó2g¹dD©Ã˜²¥µ ð8ªJö-²œÚ–©IX1öw|ÚþúÆBËÏ]Îô g9ç òCdžö¿_Ý´ۃáÓÏ€—ø@*V=OtÖpˆƒ.àEÁc³yª{QÙÎ#g_þë§o£¥»¾üo#fàíÓc¤‹+c Ìec‰"qá‚¶¹yQ’Žç;JóùŽüì,‘2T ¤öïÙß³»½¼ƒ2kÐê[ËØðú«QŸøº\–Ä’ÏkLwwWÓHnb¼£^ìõnP´ -©µ‚$pVFC9-Nͤ,”„²VM™*;>¡‰¬&_)A‰ÒrçN E¦¹ÿƒJ[»Èn•Î %ˆ`Æ “ÝÅÌÏâ¢`@.¬2k]ä;}¨¹(°ƒûøÅÞù)=È÷YYDÔØÊù ® ÑY ƒž:ãÈÀÙ–n»5²;—–Exï,γ£;{@ïqØ%N"¢AáûW×®×ýv^!±o[ †œ¢LÝP]|p†¶®Ëh[|tí†$’Ř[v+5Ö”×MX‹¶æeg?®QyŽ8­–Ò†íÑDuå“J#ÄÉ>,Eç Tí7ƒÆìäÊ!qò;fÎôWF™êÕÏó7ŠÌI8‰Y gÃiÅãÕ#¨ÓØã ú+ײÛÙ“,a¿f*+Ò®r ¾™>‘Æi9TìøZ 8£ 15Žm‰‹ ÇFcBÜ<‘ 1»—VÚ”U Q†*ô„nè›õô»ú纰Qß«ègôË:÷kÓ Ì±0 Ÿñ êž4 èqe¢ L€Ì7$êPo/ÌOu¯&?súCT©”Ö ™5£­D+üª–°„otS¦^ ¦Æòrt¹«§nΊv¿…÷zgokéï*s[äß"›°2˜Q¯9˱Ĺ]þÖÊôâUW¯\Òø›ÎÝ\¹ÝicmqqEùò7~y*²¥z`ºý}×.YpÀá±—ØK«3.~ùæn­9ryqâùÖùïÏœEë°~ú ù6ûœÉ3oüÖëõˆÖÇ )â/Dü™Œ/"ÖÓŽ‰aÖïñÉß/6>ï7ŠÃ" Šý"fD$Þ«È&²Fv4ËÆ³{²8KC"E: íJå ã9¾ñD”ôÆéìcÊwsÊTX„/Ž=´7LX\EEªÂ•T™Â5¯`i¢y%½û»÷7ô-R{T‹j[s$&«%)êrðÒ,ÿ¾†zÅò?ÂË>¦óŽãÏÛÝùl>Ûœ_ð+cŒÁ¼p|@èhœšA°A¦Bh «CH–—-]h£&tiGÂ’lm³‰EU¤uY»lt¬mÔ¥i«h[«IY§N+ÓÒMQC“JÑ^”@öÜ™TÝ_Óéñs¶Oºçå÷|¿Ÿ¯$è³m¦ÂÍõ.9£3A„ "·öÕpúòüw)u9P‘)5¼¢Ø0àû];¬9œ-1”Ø !AW£!kìzwm›]Kyv7­Ü,cPEµÿoò©„˜hFlyÚŒëÅzS¼÷€}Q„ êÍQÞ˜°j&5?ÔУ4ßGñ ›íiÛ)¶ Åè ô•GåXè,ÃÄÅgu:ù¬F”¦¤ Ò%‰R…$«_è­,õS8»;kpÀ Ç”‰¯£Â!;0áp¬mQÈD§]c‹J/*VkR?¨E(µœ¡M¹‡É ŽÔ«Æpx.\DÍù5Q7*­ÐËÌ@t«¿šGΑ Ý¢ÕxU–òWÊ\= ;æ >9à«lyç{g]W[Ò3YP³îO/ÿä·5±2(vÖÈ£k•ØRB¥¡£ÍUVÞøÄøôIô¨'tôkß~ÿüµ;W{Ê–‚Ïtžùèï¶O”û&Ë# wŒW¬ßPh‰iŒÌ~¿+¸{Ûh|èÄøÁJm÷ÐÔÐO¡<+tAtU(,÷ðM”—ëRŽÿ8câ›Ñ#QeÄ×êÒ4z @€‚à‰ƒ*$ÄJV‘:²Ž ‘ä¹Dø°ÚarÕ3]‘#Û"§"d*2A?Àˆ*K´W¦º±!ýXº®â ˨4òP>Àp• •äØÜ¢­°Ÿš9rK®®ó†ú'OýyF¯•JRû£ÛÛÇ;ê6´U¥½y­F¯³Ä|ߺòÉ -ÛÈ|ÇÆÇÏÞóû·ò‚A q¨±íŒ¾õÒ•Ôú‘÷~Ô+³Xky­váü+7ü áì¹ÿ)Lâ 6“yí,æÄY‹_]f5Š‚(x|‹®ÒëpØÅŽev-ÞQR¡’ Í+e¢r­ù+!qO¢´¬Ùo”Õ3M¡Ò†x¨²ýÜ/7‡"§¼ôq.9&é8º—ß‚Oá"šD}`äuàƒÏÉÅ—³f-; ¸—õPÑjØ;åžuÿÒ{§û{ʽàfÜspßkVk1VZx™?Äßæ àE)^~~gø°r"èÖ(»$ÞÌ(Ã^*Pþ` tµ±"ÞÔ ¹\"ú²î?[Cñ†‘Ýyq=àV¬íli à¢x0Ø•6Þ½¼v8fETV((I÷lÚõ•jœSäm2X0*» òæÓ?Fh€!ù CÂøWð9ÀÐië½€a Ä„Ö&™p¢!•Ø{"½h™p}‰ÎI¾#å¶Ð‘ƒ—W:šô`5”xHÞ¾û! ßkÅóSðÝvxùÑåñå]Ê®OÃíä7ø8Õ5dždp"‡8Ä~N\àÐ 9ú¾Æ¥F@‰&¬¬U¡Th¤mšTÜý@iøxjy2ý¿³ü†ìb„ K§Æ":»Œò1F,ˆ`ð`–‚S¾` ÐGPnšx£ 1}íMu–ÿwžf(ÁjN“ðÝñü½V2²k_nì‡ÇèkºÿL/“[Á^ˆäÖÔŽkÖ#T§øT^×¶wh|ŒM6oÝñ8“Md“‰1§%ßIÏ?™Ìæ'“Ù¬4œ­bkG+nmí‘0N÷ÏÁk¯õlJ§æiØìAxMޕե#EéÈæ2M¾dÁ~MÖ– dñ\f³[ì΀³ÚÙæL9÷9ì䜉G£“Ñ—¢W£Gš_+/Nùßð#ÿl•­G’§“(É»:7wnëÄçú·@︅ê ÍMOKJg§u<¦ÆO%NqQ¼¾³(ÞYT¸?³dŒ­®²HÅx­J> ”ɬªi€•µ5_^Š×& *ÝfEÝê}î‡!=TªÏM@UëUF¥¶HõmE±(ßäžÎq-í«£PSÿ*©h„8]žÎÊ7äùìÑ&Æní³tJn—/Th*ýÁ#rÀÈ4 å&‚½BÕÄÖýz;oÑñŒ^»½Tb LŽL©çZ¢¨T ©:^òÕáÕ¶Ž‘ˆ$E‹ 6?üëè䯭ÐÄõjY¿ìœçÕ@Ž3‡·Í§ÍÍ[ó—º>»¶D‡—‡>y³;ˆDàu,Cµ‘¦Èä ,äoâMÉÊž»‚Œ[X^<#òËèyŽ>ÇP£Æ,‡¶²Ìª¢WLÿ0é{_ì^µÁ#ÒÓ㸿LŽ1&I0~&ïEÙ`ÿ^û¯ZT»ÇÛ »» XÆèyÊiûÒçÖ_Ym=^Ÿ."¼MÞ(úêw!, anÜ´H›¥ai¯ôt[b½*tPçg*( I $3}½à´ûXEVä¢}@ñ ë×—®+þ£2l,¦µ£%1‹Ԩõ«,@‹ˆú’RDôüTçö–B™âí˜Ë#$W6³6‡ªŠ.Æ¡Ft_aÎÜÕZX1.‰ó@ZKJ`)GêVNr#‡QÛ·çxýÁóíãc`vB4XǺ¼ÅØmaY·Û¢KWcK:À›æhf©Ê·ÐÝ./}®˜˜¼^u h ÝBÌ ‚èc’LÝÿå¹êc›8ïð½w÷Þ‡ï|¾³Ï>;ŽcÇÁv‡Ø‰“7 q€Ø! $¸(R)R’”ÑQB 7‚­Aë7“”1&(K:©¬¢ëþXµ©+ªú´ÙÚj‹@Bê6œ½ïÙáξ÷¾|g½ÏïùøY)ëP´öl-ùV-¨mÅH¦>‚¸ˆ`É„ çD@àÈ€NY Š.±ÉÈeW­(+ã‰ÅÁàIQK56¬$ ‡¢ßÄ2Bõ‡¹ÎXÿ‰lüèW"=žµÛ|"ª]Pm“c·Þ|c.·yÍÔGã½3ûnÑ\·AvS䨋ŠwïÙ;û?Ï÷<0ñöÄ`;Í8Ù‹+i®2<𳿟¸yë¨ÛÚ„ý±x~ í(Sõ_ν‹®)®Dïìâ·×TW"gEÓ\ ½ædÍÅšes5ŸÔ|’ú¢†z Éåú„^YjÐîûõœ¬;Ê> ½„)ghEê‹Ôw©ïS´)u"E¦ô2éCJú´±ÙÐÆ,'è×T»1&ý¨ˆûÀ”üy’L9¾@2°?@h˜|¸€Y0wcѳæ˜9ð±I~4?o´L&l,hò1]ä…Ö‡,™0šü0.èb ˆ‡â*y,xH2ã¸e©7æ[+#í*Ò´%Ƀ¡`c÷}dQ —áò_bjcué 7VYÛYe%5>,ߺ£´á•æÝy.=½®oæõ·W½7’.õA&?H’`±ký®ßOoWKãÁ›ùÿ¬g" Ê+‰ß{s[êh+.;o±CÀ1m«úõ_&Çþq±Ï+²4`9È1ÂuŒwÍ‚;ÉÐÆq_w´;Ù½½›îîÞU5î÷û|ϳC¹æÌ®iš˜N²`? ©s¤ƒ—ìÏð¿Xdá0®¤ŒÑ ²ÑüŽÿØùp¹¹.ªÅ ÖRqdZÅÒA•[b¸ÜÅdSXQTàäãA"M©^I Ù'.9͆®ïÃ…cܨj”ª•a © 8ö„̼Dy9(³d©-•ÚN/ˆºÃV y!OÊfr$í6—5O­5¯zQêd<+nX^fªYd @#øyAö‹–’ÏV¹šES™™$gßWWÊ™6žY·¹©ËâEª9@™ŽT–¹dôL•’L2[yMPexÃk|¢Æ‰÷[b+ó*—!‘lG/µHþ4J< •BÒɰ]Ü’_²+‚Ý,³"¥H H˜uïÉ‹©Yéã'{Í¢õ‘Aºõ Ç­Ì»b¨DÚÝðT£ÒPL“E×0¯ ÊH)Ôa‚/t KJnò]ŒDØm=X YP[‚@¶Ã¢óŒk˜Eñ†V$Û¨ãxõƒóOˆþåé '¡PÇ0œ£%b…ÀiÎþp|É “HÃÃ~æ§;òÃÒ&æÅýüª­M'lôk6€5"#mhÖ(¹½³Ý‡IÒ»ºÞcC"LqîûQ§ó\[…³j r 4óíµN†fÎá‹uÕ“¯º-ämJ¹¿+µ1v¥í¬gs©iJ`9MñœI …ð–w/gi%PWοQª0”™¤,6ô_Mªl¡I^ ›ÄeÂŽÌ•_Ô _ã‘«ÅfFa\elf†­,t[+N·1}ç%Š7S«3¥\®ÐN.·sŒÅÄ› > Ð_¨BÃ("ÎЋÄÿ©.ÿ˜6Î;ŒßûÞï³ï|öÙœmLlÃa6`À8$Ø5ž )DNHnÔ!MK–t]‹N,!ŠH£h˯VQ•NÝþ˜4µRÖ5éöG&!mkÑj˪¨­ˆT”i™²ílÓªaö¾g“n:™×öÝé½çûyžg‘KòPoÖ;¸ ݉%çöê,¹ÍnèKŒ&N%HÏ|t¾~ȉô$3>¦‰!ef‘¹Î˜QæC2L¢«\a 5å ~ÿ‰è±aú] -ˆuƒ^¥gi'J·ÄìlY  8˜ `]`ˆ³ÁšP…úÆf@¡§|ŽbklâÀnÀú)´G†"#@š‚¦JoØÝa!‡B®äÜ_…¶‡G^=þlÿóõ­6g"#‰ŠÈ1.†‘%4¹m¶5Ÿ.v¿—Ý4ÚUÉ™”DžCÍ É]Ï®}ãh_v/$‘‘óS=•ºÖëñŽHô œX¸>@‡n‚{IjÈ;/÷õõûä&ZP3l’_—¯Ë·e†ÀEq ¿¼3ÖhDF›SڛǑµÔäHƼF93v)Ö$cíh"xÚ62,<%è9X¼9örâQX´Hû][ëyÅîhÚéô©Þ*d-ÈšÆ[µ½M…¯«Ó®‘~èÕà`ØÄbŠ¡=5Àç Gwñ¢ØÆS´½5œ¼>víÛßùýµ[d”?,œ $U‘’%Þ}Øe‹ÖÕTÖq|ÀÄÝéÆÌ½þMŽšÜ:¶¬ÿ•±Óè#@eòÙ•º/¾‘+ +¡•Í+ÔrÝ݆»!r¹a9´¼y¹‘j ¦‰ŒhDF f½o$˜€Æ‡3q‚8…äF<¡w⧠ĹMº{ÐaÖm•8¦¿Œ1z@?ôy|éùïégñ¥žó\€ ŽkŒô“½žqÏeéñ g@¦qeØv¼™T俦æÑf²¹yñØÄñ3—ŽíÙrÌû/Yö€=‘üÄH<¶¢Ç—_Ë¡ˆ²ÈãxâPùäktºÊþ†Êá,v†¨iyéédzy"o¼0ÝjñÜ ‹¶”‚ÉÆTЬ1 D rOë Ò¾­%†) ÌɶJEÁÿ‹ÕÊQC+qUP6FÌaG¬5RuüÊìé8lù0OÛÂ/)¬è t¼è4]sŠf'õJ´J×(Žq##Ïø$«Íá\L[¼E1ؾU´*Þr샡µÏhad‹Á&›9”–¨Ž…T ½Ïßh‚fÿ^¯i‰‚©¦ÇfeÌ>ûÕZï«Ã’ž6Y«=ØßnQ`Û @N‹h7·×GîŸdYZ=XüòÀ‚…’L¨ÐQf‰åÌ‚¡ì £Ãoöi𕶆ƒî¿|«Íî0¡Ë‰PrA¤âÐ6P|•½C)ž+®×']¬ƒ…ˆÝ$ sÑ´þõêYxþ…)Jõºku¿FEWÑúÆô^Xòåª^®§ç™£–”7I ¤†St*5P{¥iˆ¸â˜ç#˜‡H:H2Ã_Ë1˜€Lµ\ˆbJ0ÖÖ^#zr-^ˆF©·cìí¬Cu(¤Š-/j±qDKB©õ!q˜Û¿½Y ‹ OÖ]s%tuŸ›vvò;wùcúPR c\“韥·¤ëUÚ¬øü […PWœ+nú¦ÇËXÌ–²‰YÀÝxÔõûVÁfæ\&£Ý Òæ€,'vËÍ[o%ŠïvmBÿ‘j‡àdw¿æûþ~»ÕÄCœƒ¤õ1×Pš‹Éþßò w&Ïß>›üüçܓ:ÁÈš\ë {#òkò¨œ—ÇäïÊãr¡}ô[£ÇF/Y2£Ã ï-Ü^ ¦¸šj¿×«Ý\ŸKVj…qqV> Ï^™ŠŸÑ"vM‹x' ¨Ÿ¨É æE½âÄÔÔ 'Ú9N,pâ„÷ˆFïvE:õØ`ó`Vá§ë²èÌÌéû ÎìîÓ³ÙÝ(1åÜ}Ý{Ž‹dŽä,CÞ!8téÅ¡Žù¾ùÌxÁï¥8BKjÓê´¸Ö«íÓkÚUÓ´dæ@f1ó÷ •Ì gò™w3+™&sÜJZ8«•˜ŸšÉîcr‘œ]Gäµ\Þ…P“GqÊXE¹'Öøq¶Ê¸YM¬>Á1['VgéphVš^B«34‹ÖÒÐý9|B^ZZ"Âa„ \ŒåcâkWlÛÀSd”§äK@±•c>ÊçJ8AÓ‡R›‚úV™&ìÓtü:ºá”d,(É¬Ó $‚hµ«Å¸«¶ÿ˜wWÂÌQ–·Ë=×ÖÊs•̓žt#;ºT.ì Y^Ž«R\P$ÙÕq²¿’¾F½ID‘†@ò·O² Ü9Gßí®GáŠôÇU<ÉrÖ ¼ØöFŸÄ«ùâoœ JTËá:¥‹¿«î©{Nuð$ÇðµïÜÔí¶X--¢¬A‘´Àï_[(þ(”EkÃ…Žºë* Ih¢Y³Ò6O¸érñ­¥“Û+Í6…æxd«$…X"ÑV%PøÈÿó;ogk ¦ø£Ùwò{ëT¶Ã_¼ZþOñ“ácÕ~ÈXXÚl¢IÌ÷ú'ôç4CL"Ùõ'ùÏ; ‘ž³¾n;•>µóô.æÓôÃô?Òd/Û›žK“î4øƒv* ­°ìt6mÏfÓ² «€‘Ö’Y†5=„Õ*‡!±°ƒô €iþÃ)oŒ<¯¿€OšG8»’î¦Nï ²ÖO“|"xÅÉ:g¢8Û4%;Pü8ñ ÁÈèÄß¼›¸‹¾¡+dwö_œ9NÌ¿<» ”ÿâk«Èü~Çò«­qyÕÀúT» d©KùQ0ž3T;½DŒå‘&sØsJ°¬@¤Aˆ”¢T¨1dzHWå>HÙ^6MœÊС >aXº&J_ËÚ+A…QKÔ ý/ÙåÛÄ}ÇñûÿïÎwg'~±øüHlâ<ζljãè¦\_hXUagÆg¥õ vÞõÇô‰ô;>/Ë餇†,  =‡AgS½x"ú›= ÿ}—^mSã¬Ö?þ;Cäâ™Xá»ÒG$B€)`‹áÁbP-„K¬×7*–È-¨Æ°ó£‘MÊ03;ßyë^™Ã‰AZÞÖàÝs ÿ0›kj¤Jg‹sÈ9î<á¤CqÍ„fJCvj€æwà8‘ |ÐF”CÛ[R²oZc¦ÔÔ’ýDŸˆ%N'¨« àHt&`"Û¹péÒ>@»šB¹",â]ýíð£HŠãF¦p©þ¡g¢¦ FÆN~([6P ` 0f¿¯×wÀwÑGû0%‹µß¦F0%#©þTÿ\J‡ÃºánÍ4KMæÍÜîò’‡Õ"…E¥070cˆYУđÒYG,„Á€>Û:Cú‡La÷4èÍ&pûÈì ô®~ól PW|qË úÍœ5P €ƒYþõ_¶vO¥¿Ø?vWø‡OW–Ù'§Fwßë6®P7—ÛsâO;Ó_žêUÐÜÂ#%dŽÕÀ•IÍÑ9z°x󊺨å÷ ÿ)°òþAec¨À?¼üÓ¾Ó]“o8¾Ò_TòÍß§(7&ˆ'ˆc67j‰RÐ IAOPrWV‘î9¶µrƯµ^nƘµ²>¹\b;fÁ ¢QèheuòŸÀ€lƒAwuÒ“'-‘diôéŠtGb¤°+fÒø€ON®Oþ-I&‡j… ¼ aÜ9¢4ìïJU'õ“ñI?bàDŒ".•END²„ñ(#jçRsµwïÖVÿvsH ôžr2É(C·T3aIB#¬(C# Í);Ì„£Ì¤ò’ˆFÆ«0ê(6¡fTgÏ—0@ð´-·¥¿>QQâ<:l+¡h`×1´Ee9RêÛºûþ™Í’Q©bT Éú£ƒ3ƒºÜ–5Ÿ=Y³@¯T(8÷ü¨}FthV¥ßà]¼Ù¬Tê2‚¤”<t¹‘-ÑÆ¶ªv2~i;òÛ¥ówÈíˆÍ:âæ[¼N‡üx(h…‚æ ƒ ¤ãƒTôß,`YkÔ^~Õ{× ½^ë¤ ¨F£ä®rP>jåBº OIjª|S |cn·À±à>úÍØqœ8KÑ“ÉdتêóšHGäBäJ„ŠDé·ö±u­^)‡µœÜ±£§.êZ÷lÏß[QbuèUº±6‘erõO Öo‹ÄÞ.nh­Zº÷³µ¸ùïç¿ >¡+‰¯c¼Ò§X—/ï.*ªëî-»-5@Lì–9MXŽ—ÇñÒ‡—¼tá¥/íxiÍKäÌm]DŽâiÙVÇ*ÆX6¶bE|•ylÁ!h…MÂaZ8-\>X‡à Âêš))Ù4Õ•’’D\ÅIGÜŸŽŸŽSq¯^…7MÅ9Ì(–+5—‰ôC%¥âëÿ_s÷´Õ„¶ºº:c´a›*Úzä¥ÂÉ.ߨ&Î;ŽûyîÏswþsçó9vœä.±c;Ä11ÄÆ˜Ä±C‚cáJ³,°&t¡%62DÉ(+ •ÈŠè**Út…¢%bêÂ`ë´©ŠV^µ¼˜¦M“&4uãE‹Ê‹©Ó^$ÙóœMµiqä;?~îdÝï÷ý}¿àïˆW©Q˜€¡ÔJ|4$èPUÓ‰—¨‰1ªBRI@)ƒ•H#ØÕ¼Ž¶ñ²Ë^ãB_WáAì“DžR­΂ —•ã,¼¢*;.•ã£pÇž×–K';ß Ø}ÔÖ²,ЕC)~9>_‹Ó?Œƒø=ð÷´œ…WŃ…«²O³p<{. ³d ¯àØcÔ#nÅŸTg/.\È ê5·ˆyV…UUa=Ũ* T"QÜ…“¦SÑ)©2ÄɆŠú·R«Nï€ÛÊ#¡&a}L ðæßÝy{i7…Ö!_bðu-m[Ùë8¡ ÌRçø¯^N¿èñQ”dvvn•)Ö,yz¯3´g-ˆ’ÍryÕ¾úôBqó¡…;ÌŽiÚ£Öú›ˆY”ÍRh‹väó‘åìáƒ]Šo|sÿ¥mÀý···¸$`ãÏp˜$×¾^û33É ÓNÓ­ôsðìÍdκUÅíV{:;ÏûUÅïWý·Êô„6ë!=s9»ÎÁÞbßÛ“WÁ ¨ª‰ó»ýAÿ~ÿ7~¦Ó¿þS´&‰¦£ôxôrF?;åîLÞzÕzÃJYïkEp[´ã"`ª[,­àC-€%lîÔ¤4O ¬šáÔz÷³ÜBaQul|6ø#¸††â›§É$™bªÃ(èïØ¨Å@ ˆ#Â`•÷ìhÏž&Qî¹íM«,îy7WN±6½ØÁ¡Þhlä‡ëTËÖ~ž}c›Àº•½-5«ÿ>m°òfëÄŽÕÏššûhDÿÓŽÝ Š•`Írp×êÜÉ_}â´¿ÿÊôǬðQhŽG!޳rP¨k[9µú—w÷sDoÁ»Ýµ.2¸*_­=@^z #ÐÇ÷Mo­½ö‘¶¸Ðxoíµôly~®qQs:Ï.-*KK‹ ##c9MÉå´+sscåÓJ¹|z><ÛWVúúÊÙ£¾›e]¸¯[t¶ê±”¾¥ƒ—õWõ7à!ýàÁy½X<‹ ü\qž'ûim~.^årøôí¸ðSÓÌì ŒÌ¤gÎá“3OgØïΌ㓇ø”™!ÑÔ×ÜÓ˜Œ$û’û’ãÉsÉÙääï’“O“fþ¥$HÞÓé@{8>^ Ó—Ã ^\Ð4°.FrbA+ Ž~[ø¼ÀpÎZz8ôh‘›[œKi!/Ì ”ðÐNúe7Lµ] ·1´±¬eòE©L6”H‹%­ôy—ô¤*wrü¿¾ú¯ÃÔÙåP›vºiôèÑc7F²ÙŒOóùµœßwsþæíù`&›Í-—û¦lÒ2·l[žâ$üÞEÜò³E}C„ÂÃBÄœ î;£Iq`sÔT‰ø7žîxtF%&áŠwĉiÄ7³¨:c vÂÝL–﻾Å]Ö¸¯H®ÄÍï 0ÚÏ Ê=IÿÛ ª\YDUÓ" 7Ûñ/q[Ïà&÷êFšåPê-_Þßgç~æu›89ˆ­©Æø†èwxY²Ùhi]§c`¤}×n ;eÀœøJ_k†“8»º3P«äJ¬rX×±4þø‹aè&²05©Ÿ'Þižâ2z—¾u/Y¯—õZ²>Xs±ô/g&2733ÿÊ0(ãÊ<ÊP™LC±µ‹%ñE€ÿ_|`Ò¥7êi}ŸNëú%S¿¢)L© <¨©a˜@¦IÇdd2=ycòá$;y\3™ e&H¶M$JF–-­óA"Ð<•8Uá7ßRÏÿ(k(¯¹=²qC~/~ V«ùD©$îÜ•Ïï=q¢| ?èF+N#(FtFþ ½uÅU¥÷ì ¢@PrURrõ0Ÿé¢“àQÅGH2#ò¨ÈsSœx~ º1:4X1¶Â[ †Ä»'jÄa*RŠE±öâø4Tf¤uCö¿¼d“@;ûŠYëòŠ©ë»¯­~Ùl ØY˜µ×õÞŠì«muÛ,È'7 S?¶ÐÙ{Uª÷ç±Wspù7#"<“–o ˆmµµþ9­C­žÌa¼¢7}ä{?ïæÃ$ŽÙ9– Ì×®ÙMâ|àcMƒ.iòïPDNx¶Ùö ÅÅ+b‹/ä°T±¢Œg®7Íž£?v2”=°‹7ñ8ýëœJóf7'9L?ø}«ÊÊ"'x~Á¯¢3ß“Ý Íóßê4˜h,©‡î´Eí ‡£ÀÓˆ&ŒÍ¢I’ –Pca›¼o_ý"d1’CÀ”ÉÀñ˜¥qmÙ"Œo•þ>†$,]j©æ$›ÉdXTsXvLŠ 3;¢Ù‹¸{Ä'ñP³wõŸÌ¶€v¢?ä³)œ°Õ™Ì6›56èu‚MÀ¶±º„\W—R…Â,È Ïx| $Æ £c#¿Á7€¿7Ð8ªÅŸþ‡Ñ,EÁHñÝãFª—ZGZ^Ò&µ«Ú?4nNÃ×4¬iùRºJÝ?²‚¼áQ¤tt¤9• (TJè*ÀŽg#ʈF¡`À£ 1¬„cp —ÐLÇl¶8€¯ÄJßÄ61f~µÆñÉHQÅ]ãü.‘ùX§0³G.ô×î´š{f1ù׳ùÙó 67Žb9´7¾«¿J[ϘjrüòF«wëLÐ`%ÁJ_}´ŠÓê TÔ|Ý„v þr¼JS‚:‚&ÆýÕƒ“3PÉÂê:E7¡Ælþµ *>æ<î¢.Kú/3ïôsü²Ÿ>Ùwrø}R:é:ž ûý}ßi¢o÷Ý‰þØyËu»óV/s©óJß•þ61—L—íWômÓírÐåLƒ=q­C£®jwÀMi±žY³Pâ =¡ìUÞWèƒÊUeU¡Í V”–ÜNƒ8¸LóšUôOÇøÐÔ¢~B§t}4±Ù´”îQ–N¥ï¤)s:Ÿ¦ÒËøAÞøÐnê Œåø¾â¿@ô„Uå¶RÇJYÅbeWÈ,kJ y²Ɇöáùp%TbBåºX x#“'W3éN%ËŽˆH <ÉRI˜DaÒz±5nÑœ; ¹õ^Õiœ[HnL­;ýÆŒ‹ê)t·‡íœ5êqÚ„½§;F7çy¦¶Û=š×Ä–>ãéÎã 5™º@CÛ‰3kI—¹ÁÓ¹)d”Ö'ºÏ¯š‚‘ƒÛ²¡íµÄ=çÆ›bÎÅS/º,¾ª ,k:x0í¹§ò±úHÚ郎‡V¯ÓØn”E=èJ¾þv;6w¨tóúéü.ù%ù¦ü©ü™å¡<š­¡Ïñ¨y:(j¢wyõa>êVZ?dY]RU©°„vë½m[Û–Û>lcÚ¦f¼ ÞEï ï5ï}/ç=¬-ã§óñ£ú»:5¤Oêsú+:9ùD¨nÑkô„ž×Ÿ\2‘޳ú±VƒÁ°Ü}Üþ2LÒA°Ægë#©˜ni‡m,Š: <ÊŠ»c¾èyluµ‚¹(Ú3唘r:¬À4¹ìÁo”DR 4ÚG,0@­9ÓœŽd² '×úJ'1!Ãîý¼E K}EóôPÓ¤«®*4õî³ãKB ác@BLÛ|xÿ›§ÎžÜ1 ÖÆ毬`³G°…-ݘxn”õ§¹F.¦'ºwëÓ/w ãΩÜÒwmUÅöŸx£_ 9ýÖÿˆ®úØ&Î;ü¾÷ÞÙw>œí³ÇŸ‰ãØNâ$Æñ_>Hb(Ž)äB $‚ X·ú£lÀÔvt+ÊØVÐÖº0iRª1íI7BQ&…•iІ4T••½ï90ÙÒ½w~Oçûýžçù=Ï´Óìºú/Ê ÉH©¥¿# 7xíÙ ÍS•ù‚!ìSpÿȹgÎ ÛY~… ß»áq‚·ÍÞm¶j§íS”K®•…´Ð/ì^Þf5  ¸„°0&ÐÂE€ªÌ¦Yú> eö{—Eì#ðe‹+iBVáH`.?ÈJ‰ÅyRäR›z=•0~E 1*¡×³ ÷(rÂÔ鑱ßn›øð‡Ç“åwM¼4^Ú[ÿìÛc©ƒ—76MÜ¿>¶‡\_q2wfrºà7k^º¾`ZÀJÐÞ•ce‚µPbsü%ð€ü{Ôƒšâ…¹âKn¾iûßAßQßiß-ß?}_ùÔ,–n>ÞW£¾æ!À[#ow3€Ø 36Y8:k‚¦—ÚÝ *1@à— ™À#2œª@"0¸P­É »ˆõÿÁ|V¸K°'èfS{DJpqù—ÅG¬ 1¢”ä”7£V 2« šjˆM%vÅ»RQ R¸¨bkHñÌz¤tË•£>ÃÜ÷oS¨£µ46±E_îS.³±ä§/vœëYUåØ]Òë8Ò½Â@»_zvïÙß^û-êFñÄ癚"Šæ5Z½¶lzüüãÔmœ)“šU«ìª~ÆÐ42Õßu&âiæl~Ýâ©æOÞÏn¼øÎ›¿÷“Ú§–þJP„@=øDެ±ÀOµ7ô7¬xðÒdèp¦"h™ž¦‘‹ã¢éÂ2£Ë6ÊFÆH€9ð™ê¶sXÆùX_y4]Áp‘_Œ‰mb—8,2¢¸Z¥Cý¡±Ðlˆ¡ÏC”r…Âøœ]æöqw¹ÿp47‚Cv¤ô}”G§Èñ(þ¤?¢Øcf…Ì~¥) J—Ý'‘ÿù#úï\¹Bô= ž6‹ZÄjÐÄ$êó6ß‘èS±°”*Vs¹3j*x¼ç™Ê0áú»¤–†v¬8ÖæIµ­žp‹ñŠÆ®l}ºcñ/Uµ‹~ÎäßX·¯5J ˆvðMõê÷³Yýõ~5+u‰\qèO¯†Ž¥VzÂæžŠÔ[Je68;‚ÝM˜ûýKKHbêAø…ìŠDb|µªâBLuÊÄT³ëàºu¶ÿ¸åB Õ‹zWäç*íõä·Ò¥¹ÖÞÞh8†î)ztšL“ÁšÏh¬s,ÓÁþàXðNÁtðdƒ=ÝOŒÎ©J !ï)è8ŠóƒQäekªÆÉz'¿B¼˵V™–A¸ä,èIšÃŽG1µ·l¹¶+ʪ`¤.úô£üÿ‹ˆØu¢Âpì¡@¡Â"ß·Ãd(3ï0'ëÌH^¿ö‘Ô]…šbŠ¢bÒÐi§Ní§Vmꌇö´m 9N_h#oë6 ^eåuE4gÓ2š3îÇK’Ϫã8YxˆMëD” ²í,¾ÀbúhYÚ§·ð^¡l¤ ùåš’§Åm÷›Ýˆi¾(c7¥[¼ÞCÐ:Á°$wŸë:¿åfz³á®_v UßñcƒÇ‡hìtÁÐÀŽÄ~ûU ÅbråŒwÎKyg}CöÌ ìvæ Qq;Æ)ÍuÍMÍ=ÍC Ö¬ïsUÂÙJX9"KûŒê‘žý=¿ëA=}²Áo HX“Næ&[Zv2Ó®Yåreöƒ8ŒÇw]OÃ4Ö¶9씦àm¹`&9—¤’®éáŒêõ‘iÎ1ÁÞg l“ÆH¨_¨­'XXP<‘òÅŒÊ&ÉVI ~ãØ+›²‹™¶ã˜VYƧЇ4ÒGü"jäƒÅìi_ÉlÅ+26Ê–aÂ8¨ü…eò!LËÚå9¬BøîHè—G¹êµÏø Ö:ûë|­9æJøÕ‚h|Qk3h‚ý°žÑû~¶AeϬ/-Ù ¹½‡wß9uödú»¥EÑ-áî½:·¸7¿:øçÍ®º WýÛ¾]››T+ªÃÅE‚- rÆÌÏ_¹lÖø cäÄ*AðR]mm§Ó°Ò&ZÄZ–^5ßp¬+•©(›ÍTsßÁú—~ïÄѯÿÚš˜ˆ¸åZŽÖµÇRí˜ÇŽ¥‡è¿LŒ€K²ÿòÚ=¯Cç=ç×]ö þ‡vP·Zá꜔‰Ôäj3!gº„U~jéŽ,¦œIÌ ôæ¶d4Éí%êø¼%ó-“5£o•ùrX>ëå“ÙéÜ4)ŒŽŒb`˜‘™4ÓÏŒ1'™;Ì}†ŒÀ„ñ¥“ Ã\†»ANø’[ªyaQ‰6D2^“žÇð2F:›Ù¬BÙ²:DlÒòX#C«®VÉ‹¢-ú„¹ø ÷Ç ­65énâH‚`”LÁhÞ(N˜Ü„£ÞèÄÖRå-Sô!â›0ñØiáð£+ø¥/ÒîVãÜGS‰âÈ7ŸKU ,g”$9áßLéjÖÊè}q- mÕ6FÃîŒI )<¥ õ}ÞŠ˜bCêׇ5",°ðê¦ ØÓ±m¾—·2j¥‚—ýõçÏ}d²& Õ¹ÕcÃÒàs¶¢N«qªhŠSq&•^ÃÝ[;±~eÂfÜä+[“Ü>¹Õ ö ŽgÈÅÎOÍ’™ –¾†WàALË+Ž«u5 mÎuÁ9ƒ¥ÃBEß²@ƒÎXæ,ÿ¶,Yh‹º¶·’(w¹»·/–k¸)(Êæ÷Ð4šEwÐ}Ä 8£šÃIp Zå˜8É£ª%ƒ×‰õc§}rF;§¥´£Õ$HcÒ!‰–¥´Ô—´ …¥³’¤Fù‰¶ÏãQø?ÆË7¶‰ûŒã÷ûÝÿó}þsvâÄ>;vÎqbÇvâ†ü±àHJÁ€Qð M²dØŒh¥,”J0&N­Ä&±å í‹ntší+4¡iS4…¾˜º2UáE¨´nnyÁ¦•dÏïœ4{9}qΗ“ò<ßïóý<…óÕT¬”©Ly£Ñ™òÜÐvíÓ²—LÙIÌ»aX:½(&8kNš3M Ÿ7 É›ÛÏÆ`ï´§ Ï?M†_x¡±11†úÙðHÌËÀÉ4òf›\4é}©NyË_ÏZX'S HvØs[˜?㺞N¬5øœ´:Å(îf›:Ö­-7úg91<‹šg­Ö8«Ö¶åí2)JóóǨ›uR2ÕNý&ÛæŸ Xô:/éÓÿ¡ÿGgtèAx$ =#[-‡WÂ_‡×ÃL˜Û$RtÅF#:º¨m•»o…B:ø¼5EIØt]ÇËúŠþµ¾œUµ’†³Ú(ü¸§=ÐiO4žÒT-®Ñš–Llýiyâñ¼½«LP¤RV+l¥™­’Ï‘šoVœ¯–œÖÆ´ƒL=8Ò¦…§š‰(q²ÞiLÚ[§s"ø„¥çNPö¥nEåY‘æ#Æî¨Ud>6’‰¦¨îîø÷L¡åøà÷Çk·Ý@;‡ܯªˆY{{íRðÞ‡z²‚ÿpj}þ„í¡~„š³ñ]Ãhjtp°43åš™™êœ0¢.ÈýQ&Ý835JŸlÌ7žF§OMÈM9™/M‘æï¢‡YûÙ<Ê_ì“®;5T"ß—ï ¨âMs®™ðLjfç 38cÐåþ¨-©'G’tò.ú{²gtJ.֛Й"ã/¢â]ÔšÝqyìúØ­±;cÆØ…±å±•1zì –šWçóñùìüè<7?Ûp°¼t¹€fK,Êšãð ËQˆYöâÂfs 5êóU@{„ðêê‚àƒ3`$ØcµBü‘©TV¿Ž±BHŸÐþek[ óšzÿ2ÛVÓrùµûdJFúèg$eŽËT•ÿÉœä|F£‡'³1‘&yVí«I@ÉêZP=l0;ÉŽºuh¼Ñ‚X‰zQ•R$i[IOó^Ó†¡†N,XÇÝ“}T?ŽºZ=ÇuDVAYB¿UüÅ!cö³ì-ÐØw =fD¦FŸIÙµýJ}ÚëdÐnݱö¥ÊIšc¿£ŠÂö3C-†Á¸,d÷DöÇê\>Žæ‚óè'»ÄíuƯ~žÖ™³È)åaÇ[FÎýáÙ^+MéE‡Å®r˜f±Ä+­ððLÉjõë¼ÄÔçú\5ã’Cb™—8€.ãE,°X´ï½x .|q¾Á)Iœø 4)­?GŸ°íÔ6êÃ¬ë æƒ}4RhDM¢;²ç=Dwµ¼—HK©•ÞÝŒa›Sw??ÌŠvuäê›WéXo¦÷NžV1hï|¨k.Ôt"â8txWnèÚKG¿Œj´ „e±qð‘dÙ¹‚"±áƒ™LÍ/Îý.áFRÁV&ceV°œ¹”{µ¼«»Þ³vû{S ' LYTZÎPô05AU²Íy?Ê-y—rÌÜûÞ÷sôUïÕÜ /½dù}OŠøñð³aÌ #¡ãŽaÏÑ=­“±cíéÉÔ±vj²pìÐd6ä¨2°‚R#Pª9ø=§^ñŸó_÷Ó~¾ÃÄçìbëì»Z1AÄcO;®9÷/R³ËkÿCŸ¨24,B=•-Š.T¶dS{¼ ¯ØW— $#ȪT0™ 4ÑA¹™£Áãö!Ïj%üȇ\ævDG4ÄsfXl’üQ:ÙБ‡ÜçÇp‚º#)£6˜© Vër¹HW¤F²Ús¡]øA¦º6¡rÎ7^ßÓËñuí>·*hN¥Æw,ôYÍ ñŒäâÑÔ_‡]µ8ó¤¦% Ñ•ìsÔ[®À¶}(æpò¶.‹pøÜ‡×¹­»œŠ¢8Ɇ0¦5Nàä•×Úî¤F/¶·wwÇ>ÿ ¢r‚äÀ¬ÍEc…'Üœ[L/Ñ)J´-f®ÁøO ª=Âñö#²eJ{Ù‡ÿ¨}¦á=Ú¼†µ»8µÜWD,ÞúÔ‡|äwW‰BËÔBÆ*§F)†ú& ®A*é•òÆ0·gªZ`à("µ ¡õ2Ô`G»s]gþËt¹À6qßqüþ÷ôù|öÙ>|Îű'~ėĉç˜8ñ;Á! N iëCx?FhŒ*2 ÙJ—BW‘µ*ÛÊ$P&öìÔ° ”­hEÐ^Z3ú@˜`¨›¦lL£¥J²ÿÿF­³ï“ï÷ø~?¿Ž /¼ýpáóß>·oÝð«/½òDÇĆUÇ6¯æNv‡±_œyØÑ|iá“uçÇÖþqgûôÔ…·Ñ›8çÿßä–ÄòØEM ¸TîjI·µ‡i­Ë¶Ëk‡E)õ´$¦kûNϘç†çcÏÅx€‡Ñ\³E?WÉb‘“jvÌ€~-눿U?žâº³ÅìLö7Y2»e‡ï€oÂ÷-߬ïcí;ŠØF¦90Ês“Ü4w£š8ëã†9´DsKô?‚TòÎÜ#{‚äÿ…šEZkÔeHÚq,óg;@ø K © T,3@@¤WËœÂûòY, ïD¥YðmN e p–2VôÐ{»«M Àš3O¾ñþØŸö >k·àV6Ò'[¨­ƒ'_Às¸ãàóo^x=³gþSŽeŒ¢Éj³½Î}OI&ÆÎ»c÷µ$?úÉ‘ßmk6Ð}í ¿÷‹$me+q‡Ì¦…SJÁûéñï_®Cyéš¿O̽p.ëþ§¹¯­ŽÁíF7®¦O¦¯¥‰U i¢³à/z¤¢¹]Àc¾P¸VÀ Û›¬+`PG V1«[˜šƒÊ@¶r„Lg1”›@vj–äQÈ=[úàÄ»‰[ “È$J‰-‰ý‰ñÄßL"R*Xš›·BkîßA‰¢ŽŒ fâQä¡:”Ê &1vÑ0J"³¤ËN1Ï¿ä6ÌŠFä×Kq$ }R% ÇènuÃtký8² ‚h'Ð4Wkv@ý¯ î®ì$É—+)„Èñ-ÅwFN÷ïè®á æ“©?ôädokÿz²Doí‡ è÷V†:ž}ñ9[˜g"Tq–d#k„¨b¤(¶’bå䯿sqd†.î~ëßgßë´]»üÕ¡±ÁñâÉM0ŽþÅyü‡Äf¬ û‘•#ÍD§r)B!ŲË+À " ¸D¦IÑ”>…¯‚Cù®‚ßT€2ƒû4c5ÓVìê$Šj”N£“qË<3hUQ¬ÔÖæ¥è8heÿÅâ}ì$T 6¿ZgÔwàA¢Âãv(ï/—·CÌ)/ñŒgpp¡,cI”z§<žÝPØaà=à‹/2ój˜:’m]o$iƒk¥O$w×Fa<’Ì|—¯¾E¬¬6Z\œ+ä¡  “Â^ÑÌ(VÖðL¸mG³Ùd¡X^Oìv(ƒ[ñ4tƒè›Všï\) l¸UñÙ+|¬#SÎ^ó#KÂts”‘6¢Üc0öåÅÛøkDk@ûÙûÙàõÐGõäåà•ÐUåO^6]ᯈ÷¸÷LøËüU3êàëFy“Èó&>` ’Èr£†Íb·1øL±‰lä$ï È\0xÁò5BÕ2x ]f±’PUµK%U5%ü—F°cãáÅ0Þ‡ !<ÆÃçjÆ0A¼B“Ð/ ¦IмO˜p@Vø%ØŒ¥„O—°{T÷¥©Lÿ-£ÝÒì6—‚ÛópÑY‚lX‚‹ ×P“•±2ü$QW¡†AvZ«38Ò6ÉáÐCuC Nü_ìâèõ›~{`O{ª%‰,|ÞаækÉÕå:8±ð¬Ù}8^ãvÿe{Ó†cê‘/¡ÿ6¹R™fsGRÝÚÒ’ÏíJ8¤ØV/X¿¹»µ¡¦f°w_´ó+̓ƒ'*L˜£–Åà%â&Ô«mš)ÚÜDƬp"ý1,õ*ÍÁÐ'¼Àë­ÜäjkG!®ðÄ€®E6ÇT½ªjZ=­¯Çëë;´¥ ØÏ¡b/Å"Xf>)ÁÑ.ÞG¥ <€ÑuéB ež—Ä$‰*›A€“„mX€ÅA'‘¤ Ü·SrwDC8m=Õkƒz_)Çå¼ÃϲPžêp’·®3pœ% w:M¸ 6$Dï¢p¼¢úäÂg»|5傺QÒëŽÿuoÈå‚ÓŽ‘1Y®Í/¶ÔÁèT/η+6„]ׄm°F5úªúzWýD%-ecdca#amÏ ÎŠTN0YRæ™ÅÏ4§CJ™]Åêê¡"A_ŠÎFoGïEÉè.軘æJqæí9®}ÀâöÀ‰ð ǘÓÁÛAüV(ÆŒSï¿0r:&)Oxó£ùñü¤~B7åµ|_~xy‰™Î˃•y4¢ì×Qqn‰KºøßŸ+gæÒœMQ”Tj¹(Kö˜”Œz€øH¹u‰G_Ý…!/Æ$˜&XŸÝZ¡%Cj„zÃÚ€îHƒ‚¥›ôrEƒ¤e«º§ZÞYc. ¤»_ŒPðî© „\qz€âŒ8p’eL~–o___-Q€·žnMî^•…À M!´VÇí¯]ËM?h«4¾÷HSaŽ„ÅÐhº¿}»ÿ% hžæªª8ªÆÐO9àCÃUk×^4ÊMvÆg“ oå.·R4ï/~H\'d¬û§f´µ¹ò¸K²¹ñ™ÅcZœËzó¹Ü¨¼B”åmÙì°ì†Gîy¹ÍMåzÔb ØDóE±Þ£[‚æÇéìlä¸ÓËÊr¯»Í*„v†ÆB'BBt$t$„‡fÀß5ß‹X\ˆ÷ŇãgâÔdÄgÀ9M^‘Ç >áç…0u–û€» j¼|^ëïÅ{#å¹Òþr*µ¬F©Tl´Tª„93åô#_Ñ ~‚Òh¢Ñ‰v Jz‰pH¨õtŸ™ÿQ]þ1m\¿w¿Ùw>Ûçó°1á̃l W8 „Ž Ã!;v c„TáL–¤Ý’ŠMjÓ©R–jÚ”fÓ²vš2Ek›ªC•&å´ªöCcÚ2‰öe¬lBê¦jË&öî mz¶yO÷žÐIïsßÎÚ~oÛGýýÚ9û„}¤¸×® 0õ½ökVS³}©‡[šê{ +à& Ò#ÊPðXOj‰C±pŒz†"Â]à;oÆàŽ(O}BLhÈr®42®Ãwsòy æøÆ2,GZ ÖOx?}£vðG·Óãn–o`€§ aÃPX ih‘+u޽ŽmÝPB??ùº/&Rðdÿ¾ý⫘©W uAZØ;Ûýù™Ç0½1O~8¿áÝðmìÅ%I¬VgO”¼kÛ7îŠó³±µí³%=æ-•¬lʗͦú¦ffªÙ>8íãæç-‘ó‰"W­ŠœI3YqóÂmR•+¬—@©4Ãͮσy®`šcdÀl3£$iž52z.unèÜÒ9|¦ÌfóÁùYKU«oJÃkà[†ÍåGó«ù{yÂÊ?Ì£bä×ÀCº$oJªâBðp°ü}®¤AÔ!uU}S½§iÕRWàd]}¨’¢S4ï nÁ¿‹ßÂ߯âþb‰–a¬ªE Ö5 µ¬ëS ³R¨Ír©Çe˜ ¶l´lA‡Urg°ÛÜÜùÚ°Õ<_¢ìÊå'›¹Ž+îû4üØ]¨VÆ'¶ØÅ'àø^®7Ñ…9=3ÈôBÚ '|eÀ+rO0 ‘ÌôvÛ6‘iÎÿ¡0’r£ŽYª ÔÑ¢ÝwûÁ G ûã(Š¿8?4ÀF=‹, ·vYý†ÀzHšGš9÷œIÛ‡;âƒ-Á O“‰ÆD7I`{ûÒwƒƒ0@[ˆTCòë7E¹~uGb=Š `>@Ó^†Pü,Ã÷}ë_o¿¶*O 4Er¤-b #«Ä3r›Ýúä…î#î?9 ÄÜ4ÚT0’â\dÓÁ­IýR(Æâ½FS[?ÏCe{LF)ŽÂQ&ì4ÙÞÆ¾Ù¾næ¡ã§'¦°±àèôÜñ¯,=²ˆßùHÙÐ>>òqá£ÙRíéI«¶¼\è,s!ki)¬, –¦ø4M çŠÅêRØï´¥â²’ Óˆ>a°emD7 8¾3ž1ìseó$9Çv›­1s½ØJ"&a/Ò’ÉÛ"xƒ&OçžÏ};wF¯pâÑx%þ^gâ þþjèêBåP´ mZ{Oõ‚p z=ð7DuUOë+ú5}U¿§?Ô™‚>«MÞø‹þ‰N=Ю?¿¬ ‚(\0á}®¸„T¼•Be¾r¡òRåû•ŸVþSaÈ ¨¼ÿh«‹ÖâÊ"..^[DS»j I~\Ø5­V¾d§¶\…äï&s»$}1ý÷çzúânñ¾îü¡Ü¢/{î€K•úc®8‘þº‚:Pç»ßÚÕÕYÞU×@#ê„¢x"îм[»R`ç­ØÍ÷vÝuœ·× F©:õ¨èm)ÊcãIV¡paÂK+çÛO´ìÙ]— vtÈÏFº\¨M]m¹úê©Îl7À¥×Ùb8ˆc‚”‘]/÷·g¤¸òTBÄÐ#¥)–á¨Û?ºp÷Å«$#†ÛÐMãÂa³sSƒRA‹ÑëÉÆ}(ËÓ0ùcÉ4ŽÓÑ@÷½w¯¤]<´yúy#†³Î%ßo?Ò)·†¯‹&\é ÔM¹(”*~¶z›$ÂÎ¥Ô…Õ0™ƒÝ ¤ÁM –µH‚-/#Ó3 †E“›Z¬¡N¸3f_3h6ÛHÞŸ&4HÿC,¯³À`WØï±?cï³ë,c-em»f9€ÌUçÐ9;î×ʶóÖÁ±}"£À¸8š¸ C­€½ÙZ˜6|å™K}ð5è#>øØ_veÓ¦†ÖÝ÷u¤ ^>^ÈDoÀv^ ßN±«w?è¾0*vv}îÏn  Øuêæ¸̆ †6$0 a*¦¦Pµ‡—…ôð±±Þ$üÉÁ0 ­UžèéŒì9ÈPbœ$=8zÊ)‘e|OE=<Î^·/ñ¢J5ÊÁÓÙeY—)ûÙ½ûCKeŠÛç÷`>ÅPŠ%i'<ë㕃zí¬^ÚÌ磒b$F€A^(Œ€4F˼ê–ù>5Bl[¿¶ŒS-‚Œ'â±FÀ$L¼Uý>6ˆS.ÈEnûX6‹Œ!oMGÇIg³`|0 öe°:Úey¤ÁÚ#é$_j'³ #¥}lºk(Ë$e¥ñBÃÆeZYPžS^V®+¤¢$ÁHÿ…¡!$y4YMZÉkÉõ$™LŽß„›*ÃÓ®i©MÇ ËŸmÂÞg«ˆ†Àj›Ÿf×»øÕàºT—ŠŽËŽì#pŽNmN¨ÔN’¢Ô„¸2;ºðD#‚g‡u2²½^7Ä–æx\L\§fN0|ÛÄù©Î¦P›Äø8o`›Â{P@HÁWš:ßM{÷A‡Ó»íëúgûÔ¨DÓ<åg\o J˜ÿ¥Áy÷¹ÓÑFoÌÇÚöH<`¸cÍKÃ.²Að3n”Á9Úôçÿ»õk´V ‚½Zðd{»Þ„ðß¡qdš‰\=‹ ²ÁY*Ó @—ãÈPOèèéA0dlû¯Ä:q(2Œ¼e0{Ó]¶ q»VŠ-3Ã%M»Ne2 'ñÿìW{L[×ÿ{¯àËÅ66~ÄÀ¿ƒ@  #†<Ü4$¡ "[Òæ6ɲf+I›JUÓ ejÔ?º$J§4)ËHBœ¥Z--“Ö.ÓPUmR¥mÖ–?ªiHUÇ:m³ïÚÎkÕšuû§pìß½Ÿ¿s|Îw¾×9ßÙ,Mú“«‚u••³&Ølt™VWç« .rÁ £¼½Â'w——;º}C>ΗàähaCƒã ‰™N‹GLÌqZH°dÔÒ/ŽŠcâYñ’˜SâÇ¢6&Ž‹œˆ÷.Ìöêz Jö§Çœ!{©!«Rì*Ä$›”‚É)B‚Ñlâg…‹«]– 3›ŒB8ä2ÖG8—¥Èé§*U¹Í(Ö³P¼¡>*`3y½‘Ͽ̶¼óvz2‘HÿðíwØ–©7ÒïM^`‘‰ Va2ýÞ “×õÝý›ÇªJ+§_ýé÷Ks?OÿY?ô·n´‰úbjïµô…ë‰ôälsâ:ë¾Ö:‘~÷üDúÖÅ‹4ËyÖ8‘Ltè@g“ï•M¼{®èŒ¿žd…¢]kpŽ 2÷¢ðKè`çG|a‚Y¯šÍyê“T²x¯OŠ¢ÍªhavnýB m;B.GN¨$÷}4ûmÈå …\Îpz"ätFÂNgXxÚKW8Tá …•^(•ëD6M ¿‚ßðÿ­À‘€Ù`_n.ë??bÓ½$]ïäW™!£ £Qƒ[0"8\›j4K©hã09A0*&Û†Á»ËÛxgœJ¤ò©Ê‘æ;qÕ!€‹›‰5çÔ9¢Ž˜ã’#éP¥×Œƒwè´_˜'›£—E Rû‚òÕ/ܦ +æ½{èÞ ¾ìVý”()˺ïÜT‹ìödzÃìˆVØn«·ôù’ʯR»ëZ«ª7…×5õs%LíE½FU,JUµM¾µ»žX=àP™y*]¹ÚW*—™$žÜÞ¦êþŽÍF1_[‰õ%*ïs׬ØÝÛùree»!ÞÃN¨,dÁ¾)¦ƒ¢1©ÎOyõHFAICÝX|T—f$>*JcDž•.IIbhõ’,ÕIQ)&õK#QšŠÏ7Q@Ì¢ô¢_0JŠ2 ‰N S“=9²{Þ«Š®õJz½¾Í°UyÖïû=ïñ—µ¬²ÚËL&>(»ÌÎ=|ã&ÉÚ›~=‡—QŒîk yÃÚTTO_IB)R$­ïJJa:ž ÔQ3#2Y¬£bLì'žZTJ’œ„ûYŸ‘O£Þ¥Úµã>ñoO¿î<*1qAÙivíézv¨K‰‡öôi>ŠïÀŒZ \¶Ð…:ÁlSÎaí fC N'‹‡a©"a¯ÈÅ–¸LÎvY§ÊJoБàQ]L7ªKê„_阎Ül¾‰dÔÏe^Ù)š2¤È›9¬½~ÊJWjµª>£aoÆË&%r¯p‡ËÂÃ3e þˆÜR7΂7ËŒQ_YC½Ãän®\ÕP•>ã\é\á§My]²'dr6ÅÞð;û¾Ve“ ó*Jj#š‚À¶pó˜‹B?ÓÖ=&N‘þqª=„$ Þ hô€ö /äÛ  ó€Žþ+® ü€” oJýE´Žé{€ù×€e °N¶À.ˆoŸ–¸‡’?eÓ€üPqp¥ÏŸ€ÊPMëÖäµ´V½ƒtÂDŽ ŸË‹&·bh}h+Ú)Õt»€µQ «ØpØDˆÑc$û£oæð~ݺ­OÛ>zúÐ[ ô‘Ìý¯¿iÿ»i/_íö¬ö’^žœö/F®_§ùã´ÎÓëƒà0ÍñÌÇÀ·µÀ³c_2Lþw8ºßÿ’a&‹cŸÞÃsç¾8žïŽ×,a KX–°„ÿÊõ=s¿4QG£»"Sã¡T4*/_'H…zƒ±Èd.¶XmöeŽ’Ò2¹œ.„n·²ªÚWSëÔCáH}Cãò¦æ-­+Û¢è@çªÕkÖ>²®ký†›bn~lK÷ÖmÛ{ß±³7·ÂMüì¯Ñmm곂¼ôpY¿h;ª<Ð-.ªgú8±½èÃ7q Ïã$U§pór‘l“í²C.]\¤Ñ2”£ÕD¿ÚÑÞNô­ˆìÙ?øù?3[nÇzlÀFø°†'ìÃöc›±Ã8€'3üÏûÿôf5ÁÂ'hÁûPÑnõ ™TÓÌý-Ø8õhã#ãÙ7†8#ýýnûw•·Q£âSƼ–¦Å-Ímþ©œæ9ÛkÙ²ób_aË_±L›ý–t&3Ã[‡:BéÛ '´G5·é§b‹ ÿ_w©Mh endstream endobj 424 0 obj << /Filter /FlateDecode /Length 13148 /Length1 20080 >> stream H‰œVlÓÇgûk›¨I ˜6_B N0A`Õ±IH d³vâP“%#%a6@ª®C8°Ž©€Ù¨TµûоahÍØ4e+-Ó¤°i-ë?«¶ieE*S§‰N¬-ñ>ï|_×ÉØªÎÊçûÞÝ»{÷îsïÞ…M¡>²Rã¦ÇüË›ë#>¢Go¡wcKG¬sÕ݆_mx‹H|¯åkÝžÐԆͰýí}»;Ÿèø`럂D–F"-ï‰öƒ»Wÿ¨è*ÑÒ·­±øõ•îµpU‰9+è(º:y‘ãq´$:ºÜ«¾A»(¯»}oKliõZÌ ¦àoMGì@§öŠígˆçWïùj¬£uò‘öR¢ØÅ’ν]݈¿†lïÜ×Úùj÷Ë¢iwÓuí ͤêœï¸Ÿm!•PQú=n¥oÉ/ô±öôM¬Žñc{Ò·´7áé_餼™¾MŸëçTø¬Ÿ(gÄâŒÒ›D¡ÔÐ#ây¨Iª#-Ý“~5ý1 ÐèMé—Ó[.XçŒstzåÌ×7DfïÌÕ±Sßë™7wÎl÷¬™%Å3¦Ls=0uÊäü¼IN‡]³Y-‚Ê„QÍtøÜ^¯7R®Ú³Æ· k©ë^ƒ Ü^}ZEv”{¬ÙÚs&´çfÛ *2Bz †=Qè¯¢È ^F>Š¥Ô¤`¼Mî1fâÑ(fÔè.ú»_Æ¢|åçô@k^y ååC͇†±C"´VHÅ ®²sJy™Qà3,¥AF›QÝ…¢×À,…ŸZ†Ó#ÇsM„i¦V˜Ñ„a¹®gQ3¨ß3T6’<>ì¢æ¨or\Çu1Ä8DÖÒ`¢‰‰ 2¢ aƒsùq£ÇLx’:ÓLDñÕk0ë¾ýèžõޏÈ 1Íg¬ÇˆõO½ë¶&ƒ%{<ÜL&zŒ—6‡s­^þF"‘œ êpgÁ¶G°•yYfOŠ€x´×l‹qœÁ6O²¿UÆz\Æ ‡|0Õý±Ï˜Lãz0‹?’Y `T7IAMÛÃr`¯&¢ºÔXlÒ­‰x3|×o 86=VãΜ|¶'ªzÐ4Ž  O‹Ç -aC+ùÓZIÉ–J™?ÞˆÀ¬ÆOgZ©K÷$?$CDõ¿ÝßS=öRׇÄjHE“Éî %£ÉØpº¯Y÷¸ôäP}}²3ŪaÌN_éw¡ãÃMˆU Ÿ“ ´%¼Îí1›f“UÈ­|¹°€¿:%À25…½µ5qƒ§0ëMÐ3’s ¹[‰cV´1G­•YzJõz9Aû‡«© £os8ÓöP³ûUû}8([FLËô­lé3-ÙéQ«\&~ѦÎ…Ù¿\3 ƒ‰U†˜ñ?Ì­»Q[Ý–HF³¸­¬åùpÙ×Å>èù’8„ßê†Ëghðˆ{MÄ㚆*ÀÇ÷˜^¿y{8³1.èþ×ï}ìµ±®±î)}rñœŸåE»© (\ ^O­–ÖhÛh%^Ç:k©¢­¨õ@£­‹†`?Âcr)«H`|ðCžÔ‹° ø²²¯Wózáã+Àa ÝöªÓn§?²W‘8Ä€sÚ5:…9)ûÚ ¤°þy´uÖ!O;NÐIègûK5o=àG›}iNJ§!­ìýóá稥*ý¤ë²Qúbâ=Ô‡€ jµãRýOcLÒr!}NéÇÀÏaÖsæÕZOÐì§²íèÄi…ž]¥ð9 œ½YŒõ[Ô¾1Þ³¹'Ž_ù¾²1šÈÄG1¾ ŒåÄ6=pÂZ!%û|øòà²}”Ž²Ý¾›V1ß¡ðÿŠô]KÍàõ2bÔmTÈ9Á}Àm›\û|lÕ.“Ï~Š–h}Tañ¥ïa/Pl¿AßAއÏ_åÄa[\æI)ób»I³ ïbl/çh–+ðƒ¾õÀj>?Ärë=Ì·!Çd½C~æçˆmc]ðU€µŠÙЋN¨<ñ|þ¯IåÊ)S28ÿ€¹@%°ZÑûVŒWçeBå ŸÃmè¼&ß±aȸj/R<|¥ÙÎy˹Ã9ÊyÂ9"×ßFõ,yœç2×2|—|v3€yˆûE…}€¾Ë÷†ù•÷Fù–9†s6%çÌÿêµúh‘Z¯.Gž³Pm–Î5%UtQ Ó1¾‹|X‚¿Œ Ñ1ÎcÎÁ¬|‡VÈ»ªüò]1eÎÞýòî@jD•êô˜Òä&ËÑ@Nýú/ûÛ‹{¾ ÷ñ8;D¡)à<5Û†„râ>;A¦Ž¢M¡Û(îõ ú¶å÷ô,ú%ÈNìûzWã¹À—)Ís¹L)¾ 8/qneÈ»9g ×pž@^T|ë\Ìy |YΟ…­KÖÐjqüçð¾íùΑ¼F×R®gf>ZçÁ¦öÏõ€ï4×n‹çÈεBŽ%¶¿NvÇy²Û,ÅÀ/€R²[çdÆpíçøíU¨™;7Ÿ×e~8‡¥^%멬û°T÷.%ïÅ5)ýrL\žƒÕq’¶¨ù•2ÎÚhk–y/ë¹Ì)ôir­–ukÛ­ƒèËðÙ¤Æ= û'fMWö:í¼¬‡lUh‚¹.Ùîq¸qÞ~šêh‚~’k³ôÝcÖ_îã=:´Bîy'rg¡j ¿ú¤A²)Ço0æm:­Ei²ÉÊòuïû2ß3².ÉÄsì{³|¥r¹RoŸ}š\ÙÿŒ1{é¨r’›RNU8Ï£o°“ÖMªü"ÙÌ÷Çvœ¸‡ 4•ó~œà²Aûú:ø»Bnœû1¼ÇrÞùÆ2WœCN7æà}Ôž£ýðÕåHÑ~Ç%Úo÷‘Ó:b»+ç®sŒB“¹V«%p?8ÙòWÕÛ1¾Îbr;ý˜ƒ1ƒ¬›|nOÒiëÏùÝÎäðDiæ´ë…| Òw0/‘÷jÁ(mWµu° ø:úÎÊ7kÔ2×6*„6˜~ßöOqU´ô±þŸr"Ä/36–Œ\Ûçíÿ`y[¤„†‰\!ìç›üö9ÞK)Ñ?ô ‹Äç¿ù®úØ&Î3þ~܇}±}>Ÿï|±ã\ŒIh8Â_p0Ͱ…‚²AøLøpi I¡d„¯ØHí…4e4tÐA@•¦jkTi($+hÅ4ª‰† •©­6*u[™Ô 4±ª¢ä²çœ²?6iýü>÷Þ{ïó{~Ïó¾¹·_ä7 ™iGÍìôó=”g† JsÕ¨Ô…pmqϲPЈ:ß™òò}jt¯Zö‚y^ ïQKw«£ÛG;Iÿö|'Ù¡»P&íèTCe¡HgG®ƒtt–nÛ®F¶mÏí ?tFLDÛ·•²ö­J¤¿·o-mÛŒT\jº”¿T¸ôù%VoÃm[zv†<ˆ¼ 88 èôzÝ€  øñþÍú™ž„>Xðèg } ð[½ ýhwBïä‡ñé A}p"+鯎môWo÷L×/æ¦ëGš]úáæÞèm é=€ƒ€|W>—ï¦ÝÍ’žtF[n·Ög$} ‘]/é-kz3 ½?³Ú«? H¬‡Ÿ5€ÌÁH½¢%e¶¨SDKñ$÷,…«U¨© ™ÊŒqºá{¬Z¬šæ›Z)N‰û*bb¹î‹”E½ZiØ«¨!o@zE¿äñx}·Pâáx—‡2¬¾=¢ˆÓâF1'ž™eh]ÆÑÈã.]œëÒiÊ¥£9.½ÉÂ…@#j\5¿ chWÎ/XF#$gE!a4ÜMë[†0~e-ôÈKÃδÌKÚÀ‚uë[†q©ó¸'·-#ã|Ï‘ÈwíÚµF´°¯qeKaGtm¡Á1ŽF×"®Ý»÷ÿçÂçVçW/Üzø cr46&¢eì~4l²¯x¿ûæ€YÀÍäíѨÝ­€' ¹7¯˜ïžœƒà[…"¡YRLªŒI1=¬ WfXô-ª`®8ã&î°,{EŽS™cUüsýM~ØE£}A ÈBXe!âW‚î° º#~5Ä…¥²ñ—jlXBñûdxKdzʃnâuÝÔ£‡8âåCõ`%^Fc©Ç ÊBP–.ÔØ ¦±^2è©N t”2” nŽeü‘A)Æáá‰+çE)é´™î’äè ËÁ&û=AÙí‘©.`QX&QÐ…´@Ï £HñÅ+&à ³Ô¯a¤UhyjfvWÈ2-Óh0³Ù“vJ744XfÖ0v6Œ7|wV/;Óèò_í©9ø_׬ZœÍfåú¸“á á@Šó–£19î@ŠYõññºáOâè’Ïã²E}ïY÷ퟴ¿Xôébû¯K~ŠÿôYݧdÃ8âvû”û«qû+ûøi88ŽF;ìåä:dÊ‹j3å'½oRREÚé^w¯›qÅŽ\ç0ϳù¦\bfÇ&PGét‘¶Ï)~9.àÙu3J•‰Üsc7!,rs%÷À#ÇQW”܆n3kë„if‘Ù`MZ³je(¿G9œÃ p·³ßµ»é‹Eë²Ýsà倽™˜ø8 Ê'°eèŒ`Ý'¸Ý¤G<=[\%B1 s,eJ–H¡ôX:*ºrü´y¸>~Ÿ?õ›{šÙø¸=4rkŹä¶%0{ ÞOºÈXÁŒ€†(A4C 5wšÈŸ$YCšÆ ä‚ý;'æ°DL|ÆG2~t†H¥,P`è$ð=ùx´ˆOÚ[à-ÌKVz×Þ¼ù#7þö}Ч†~ôƒ§ ¼tÁå—L%a¿{Þ¢hÛ L|+ß—¤aeÊ|^¯0àËNcMÓdz>¼ŸÅe4Ìj¬Šáë¢OTÓj¿JU]í$Þ>Ÿ—cG7kR9 ¥²Y£(¡e¦¤P ÈUãd $«s$ã+ç+QލB`c~;WùWžßÜÚ¸´U²·hù¿øÇ»}¯þdåràmœþ¤çåy 6n:ûõ{ÏnúˇîÿlõõN4‹!‰>A,p³ì‚¦Îªâ‘*gS 6Síö$«2±¦X>v4Vˆ]‰}ãc±„µ—Á3>¤i‘¹Tžøæ29|ÛÎA1<À:F[¶®®Y²üÐÃë×¾|í1|Bk[ºâG[×Õ®R¦ÈMÛš-^Ç_½õÆÆSsÿMwµ5u¥á{ιÉÍÍÍ‹›ðˆH‚.H ‘–ʵº`”*,#ÖG‹¢%WAA­¸±UL]Ѝ­vw:}l»vëú¨ÛµîŒhkÛÕÝ麭³²Ñ:->»În˽ìn‚ÒÎtÂäf2CÎùÿïû¿ïûã“'ïmèú²³æXØÛ^Û¶¬!”„Ò4 ¥3*À|eCÆÌQ9jdÚ¤ƒÑ¸ Æ„CŒàÍ22N/&ÄÇòÏBúK`/´WŽäo—~þŒþ¶žuêCðµÞ(a”‹;U27{`ƪäƒR€×ž4¨87ê*,ø ¹âàl#ÎeGˆXäqøª?yRyQiC"šGZ†Û•³ÊM<}¢x€3€ZØa&0a)×͸ nàÖs˜å&¸ÖÄ:²Ù¯÷:úCÜUsIì7ÙÉFk¥gäX2[¼?T‹tP Â@D &ØÂÖ4k ZjŽ1tUòËQ$é;…ðT…j 7 câm˜ ñw€„áø9/7§ÍÜ>ý w)ò…ÈÅÈ¢tÐÜT>? <ê›8EyEsJùݧS¹a·òÍNßš+&ׯØÒµm£#Þ—xUCå&À+™ÉbÖHe=î×í¸Uè°Np3H‚A@ˆuÓÒÝý‚àdû휳_´;ÒtAtà “6›JL=&bÊ6±.œ01á:qQ;‚ò†r¨Á7Z¡æGH­#V#%k:ŽSE!ÛCž²·”FË_½/Ëêß¿ü,2‡ï¸¢Ü?„梬#uË…m *V‡ªæ¯eCùóK—Íújv™òÅ_#·Û_@~dF»PsåÁa¹uÇÆ ›¶n¦Z°8ÊÚF¦HJÇ‘Oj7|nÀ¸?Ï͸÷`‚Í„Ëd¤åäPlr)J99jZ¸»–¸Æ!«k1ûÊ•›ýØ”Uy¼*O‚®=÷Ës÷~¯(hº†âÁ¹FÇÁLd ™_K‚Ö‰Ö;Ûh1}J9 B®~ r·çŒgÐCœÉSáéòìñh<žÌÉý‰öÌ~—‰Ñ›M¹ç…m㯳Ø,æeAuÙãÓÃW…[„¼°Y,{D"úÄ N ²ˆe³Ãã½ãcT Ä` P™¡PÆP2Ð òRTD¹ØŒÀÎ |^U^ nU]0U—ÂïX°È˜ÏÈ_7©ø­GndŸš½¨uÝò½Ÿoºq¿« ÔÎ+]TãŸHX_îÿéº'Ê›‰ÍSR:¹nÑàõÕRqÑ{-MﯜÒtù™-GQey`‰¿¼6 —,mï¨[º© x[6r‰ñv£$v¹Q›°XkIT© ­<c/íê”1 ¶ƒ9ð+ ñ“Ê“:3ÊhÓDÓ¨ hƒTØ¿ÏáJb«:’>¯²—), \fEJbh R»¯v¤õZÊ}Où²lÀáåÎλ'® ý!åå³#ºñ…¶êÊÆ`Uu ò{æ—Öû¿šSŠ’.?»½O9ia­ÒSyàðÆvÊaÌøÁ÷G· ˜[ëB™kMÈdúDÖ u dÊ)1ÁKŸ'x³7ù­TÑD¿‹OðÒ§”h0zÛâ6³n[BBÊvs]êáTœ ! ²îP.¥D¥ƒœ““Ÿ ÎP•ÉEËôyG-Ú  ™Gµh h‰Sž™´`_åôÇËFe“ F0éoÝÇk"Ë •VÔ§<>v/ݰlóã>ßc5ëò.#ÍâöOæ¿ÔR±ô¨Ò•Á¦¥ÓɇüJÊósè²ùuÕ¨Zß­gu ÇñzH€¼†ç¸-ZM › $ç-„…DÈò´´"‹Í˳ú½¾¢¨aI7 k1Fz–GÐ2~ þSÒ"ˆÚâÏð„·CõØf šÀ$RÜÕÅ%:ü9±`I7ú°œ-Þa)>¼Ì&ËÃeÊœ‰nâLÅýê/^¾{Wsê›Rœ‹ÍòºAöýj´3˜•Ò,7šZðz-Ôg³Ø°-bÉ¨ÈØ“A,RÆ¥ „7œ‘áHŽ0ıŠ!]+p=©ƒe]B¦Ä6G§ÕmmÒÊÅ*q凔…}l(Pµ”ü„ã«ÊWš+æ(9(nôC©øô_•Þ•/õ®ZR´¶?ø.úp`UUÕŠ®¯««m½¦9õç[ÓÒÝï>×r¼Ðe¶‘vÿ¥YÃoT•NŸGõuéÈ5Í=àf 3Kšü3ÍHœY,ñ‹ò˜: qrDcµt˜ÍLr¢ ¶wð©|Ì7èØ1Qº=$†ªMÔœl¢Æ5èp± hWÖ›#·”?]AÛÐS(=ö„ŠOt7ÍÜÿ“i?ïÞº/h{u°åYTƒâÐj´cð‹…3R ¦nZ2ðõ±çé<Dþ¡zB"3Q²› ÑæˆQÌÔ"[‡Ö® bs§1ÉØ»a´·ÔÀ«Dðçh+ãÔ´sq¿|þ?‡g5ž^Ó»A®EÁÝm3÷½­9µú‚òõ _*òGÛ4|µäÅ·o¼I;Ö §? § L•4•a-,f#®‚ÛÆËã$îÇá ‚‡ŽÀÕtA:kõFȬ®S0£ØCBÊýòÑm*>¶)ö²§eþƒ\BLßR›:Cù‹rUù-½Å>ДÿÂ-xf¶”ÿ·¸Ä!@z^„5C@êù¼žp>œþýã¯}l¼O•?PŠààFùL~ž[3r]뾸 ú<'0\ËH¼àe"9¬¼"fÖÑZr޳uX­ÎN’F‚x\‡~‚~ ehPÝ%D*Ôq4ME×-›æLÇ…"8 –¨Fy|…¤¿÷¡òѧʷʉcçÞï¾wçP–2gü–e½¿9z¸|çBlESäžpý;¨îß·Qý’²'ßÝ=·êÉ‹ƒ7?žT¸3Ú9­Uů@JÁ{ƒ<ây‚'ˆ,ש5j›@zÆ¢$«ÂB³ýÐØA—к…Î+EJœò¨æ”<‚(G¥|„vê5 jœC·”Ô£¹¨Á !"îì%h:›t,¢‹iÉhˆ| S¡úC!mä{ZUž4ɪ 4–!ÖN›°Ð¡W»I„.R­‹fÏÿS]-@Q]gøœsïÙûØu½{ï²@ØuÙ%°ò¶‹4×G *Òj,RT¦êøH‚¤Õ`t»M¤ Xð&Ñ•T àÙ àYg¥£É±NÑ,”¨©µÉàÜ\oÈ~Èh6á^¼?‡÷c§ïÜcïý_<ôòOÞúeÏž_‚ïe/°7Ù8;uêMüôøÐù³_]9wž³þ~¨âf¨‚ óP`¦­ÚU¸MÕ§ÆÅ4(§¡$T·ú@WSÔ6Áü ¥b"æÝOþûÕ]v—ݺÇ*𥖮ßKtÐ37ÿ>tlXXØXóäjd!ÓhÛ È¤¡|ô‚Y+ŠxCx[˜Tg6„× ×Ââ¾ðž yÂ1C ªIÌH ÚíÆ2¢`±C¾pV$’%о¸{†¬}Üu~Í…p‹ºU]ËÀÀp×P^þ1åU<^W‚©¶…¹W Øp N‹Ë#¹å|äéÑeé¹ó~´êL¸ïûõûŸã¼?‹÷1;”Ü}ø`Oa^ÅöšªùÍÞ«•S=ÓXa"0÷íËx Þˆ“¬½ÂÞ 7¿?töüåÿœWÊK~n,ÐRzk¹”“Ä‚KGú.kv—á×.W n‹@¿äø`¡r>P èê&kô-ú‡Âjmg|sI(sqÝž°@/œÒ p¢ØÏͼ%áQüŽ{i}ããkŸ ûWiŸ0ô¿Âœ’9Ën(¨X±ã=óÍ {_}옰ޭ,*®©å,)…nƒZÏ@¿3c;§ÿ6½ëÍ - í Ñì—BdJЩwª¯ÎG®ø°Ï—‘t‹°ÕĤ`‚-oðñ0UÕ†&óO~­ýÍg‚›÷Ž^9)Œ´XÛL¾ÃqdžBYq­@K¥š(; ª(o‹¨Õ"|Ê'üVkªQ`ê Þ(V{çFrsxŒå”qÿ•ÒOè"æÞôÕàwœÑêÎæ ¥¥'ÙÕD{–®¢¹™l™ëÙÕuõÁ@ÎÃxËìÆßØÙ0¾ž±¡¼¡±ª¢ à±ù--G[?üÁ_?÷ÅüâPæ4¿Ùu¾mß­í8Àq,‚9íµ2Á4ÓI$˜PªK„ˆ ‰ñ´Â=ÇXÕ×BZD›Y)«d¥`4úFŽ‹õpWÇ¿°¹á>ThN>² ÕIKÊÒ_‚¤ƒþ鉩þ©›pôOkÓ„:1¼é… €ëOPXŸ:¶jçéMcGö¥çãÁî­[º û:¿<*Éj8¸|ï3ÂÆÑŽ¶ÝÝ/Âÿ§Ðñ ÃȆºÌº“`ÿ!ÂØl~걉T´D-壠|ÔF0î@67ì 6QÀp\›.P"Ú0Y…pú)ú7x$n&½d€d2¶<£_ñ µ<ÊèxÒAe-µ Rü¼?‰ÿ46ÌÒ@œ>³-Ÿ0>ŽŒ¹>á¢ÓÈÍf@*¼ì’÷8@©œ®˜+U,r䨒c:ÄFa©¸IX#Š3I%]@Sq€ Pžéh;iO}ŠÐãä8(ïìIA› NÑÖ+Én0¹@xŠê„U ¤Ó®ºíÛU8ˆoÈÐ8ÔwÇÿb~C3b„ª‚CšJVì]¶Y¶B¯*ØUì,FõИøX!U£¶6­m£m©5Ø™Èà´›>LÚ$ÕI3Ik': £Ó$5mØCç®NóÇrî°{Îï÷ý}¿ŸÓO6ÿ¾}Ý¢i³I u7Í®^µbÆ\¸°NUÉ]òõò V˜·êvìoÛþrÇÖ6Pt dŸzíaæ«åå|™´_ qÏ3H–ƒ RWB¡ëLV‚w„™r!¬°JL–¡cQ3Έ 9ÂÚ‘Û]Šc*Š´„‚y¥¾Ì[0õdèô)4:—èöÙ£(æ9ò÷‹ç?ùÎÒòq‡fm»‚8$•‘ݶåukÚw6Öm@§'lÿéÊðKo:·¡nWöÄ+=%Óg>ÛWOk_5t‡» µ—˜1LÔž[Âa–Ö^¤µ×Ì ›%FI˜ÅŒ„ÞÁ‘,ˆVkH m7[BØ&ÅQ6ŠbWLÈzt¢$Õeàÿ{p]ªÉ—Š6*KÉ>Bd!î&‰ÕM]¸þæ?’×–Ÿ¨d[æ<Õ¸ªº6Jïv§V碚ϹT .moÛzà…í;žDë„ zQÜø—=ÈsX"S…ÙÊLÈ"µcmù„ÙQ.!c‚àŽ1c™fŒb{£Ú¦y4U­0VE4*5^€Éá Æú 7LN1gS¼´10B¼cð†iüË+C9>tx)üüOÿ:ÂÈ}:ÉÊ´¦y+&{taepF–=è=s`b/þMê$ÿ}7±uí3Aˆ?’]Tåb–©^Éj3\”‘¬-!9aEXß V^ÑÛ°„¡9\\ÐkQãt…´¼C[Žx ž@Ie²²Ž 7p&-à8%ð=¼JJ'=‰KŠzÚ ½«ýý$ÚÝùÌ=ë~WP]PxÎGÞOrx~ëäª)î§yýêyd÷!T? 2ª¥)çÖçbUP•R}` þt‹Å¬íТë/Œ€wætmÌ8è’-aÈô'Ò 9"cmÎÚŸ…™€ÇÅ8Š-1“ÉËš˜5b~IÃEá$íQ e{)¥¥¨Æ)Ãy¨Óñ)Ì›‚4ñQÎÓÔ7ÚØe¨5¼tó 黇ÑkvÁô… *+—mx/¹ß¿óìL²{eÝÓMëkk#œoP)Z}icqßYylA™’½lËÙ§<ÅW^¼ùâæ­ ßÞôì¦Í›ÛZiîµÅ|Sfgæô2üÐýð}jn=é©ÕéL™Ý£ÂŒ¥‹‡î vEˆc#[Ü.Û׌ÜÏ*%:\ags(ÐÃÔI9m¨k_%M5Ój–ð°äíù5¿}'ÁU«çn˜/ÓÒËà¡=ÎLÊ™÷{ fÚ úà©·À¼0¯Lõt™@V1Ýk³ÆEƒ;.^NGyñô˳½W½÷¼¬×祧ܨ(º¬ÐDB¼m«Š’¢€¹ä?Ô <¥2EÊé@;ë¿¿u×±¢Æ×6ÿ¨D3ÇM©ZH¢³˜¹˜D9߉õ‹Eg½ý—ä©Ê-‹nJ~ˆ«gºý[¶'ÿ6¬v8yºç2ø7G úPè–GB·~“Ð*zddÿ ½­áBûùa¡s¾7Z–\÷qS3Ã~ÌŒ›)V=!Ó—±åv&XQJ9¦ÏÐ7ƒ¿0éÌÚዤuˆÜÝã„û,ù¾ÑnQª…¿#¿$Ÿ 1¯õ£îM ¶>7oÑf,~ŽžèMÜú’üæ…³Hwhßžc{÷k´CÖóØ MÜÕ4‰Ç¦h‡¥uqД!*fd…´!uLäìW=4t©&\4xE]ÈÚl¡CÄœFðçC×c~(¶)"…/_bãŸöÙS­ï.é_vbŠ–¹««j£°Õ+§Vå‘+÷ÉrW ž=×±cËÁÝ4s³  Î"2³zÚ›jsŸš>¦ÇŒA´‹Ê¯2ôÁME@¾"%Q“ë@E1€µðð€vM%T'«A)tyj/Û2ñºŽªñu¤‰ó]hm('eM ‘“°’¡O¹“°Bæ‹^&oè {>º#<˜]&}w_Í!krM^Žs¹Üª(†Üª „Üî1ªE 9"Ã#M²#¤­VQ[// ¤]E&ÃrG&8ܢâÎ+Ä}®n‘Õ>Ö/ºUÅ Ÿ*Ùà‡ÉrÇ\.CÌô[Є_j+üž®ªþÅÆ‹ÄáT †$j[ BJhŒS4Ôž æœÝÃÅ,`÷f!Ê#¥0Ðùiù²“÷¥\vúcE¶ Ât̽xV}AnaΡ?¯uÇû?ëÒv?é°æ§Ïûý{Þþuó³÷þ@þúù|UOæ¦çOpInoøxcs÷¬É;¢¾—gbn¾,‹Îúî%K/4½N•P>t‡mt2 ªï:ƒœŒb’ÓŒ ‹ƒ•»±Þ-›ÒX6áãN¹ÏvƵÄ7ZÝ!Æ„wE‘@ë#Ha…0ÊŒ”Rd»ìÞ…¨T#¼öãÍrqÁœ¬®X÷+3އ8ZO> {§;Ʀ“OsjOÿ mEã®Ñ=nÖ½ÅùÀ—JÔlì¡„ÀH±­`=ŒÂD±)n kì°M ŽC¥P?¸2ý¤&GÊán‘ÞèøÁUôjÍ´êêúqËâëïàsÉ7WÏÛx Ño âîÀ·ê˜.µ±úíWklTE>3ssì«»í*»…RKYBik±È¶ -Ï(–ZšÆšÒ*P0>B54%J ƒDª‘ÚTƒ ˆF,Š¢1"M° µ| îÅ3÷nªˆ&þÑ0'wï¹3ÓÓùΜ9çvT¡§”sä ÆRåd…j²¢”@H²¤P±6K2AY¡„4ƒâÇ¢G‰pËJ€ÉÔ#•JTR ÁÛvÅÚ£XL%šŠ…/;;Ej‡×§úa!(ðå‹Ú×¼úH3V>|‘÷ÃàZ‘”>ˆ¤“tJvø yÊšhm“2ã•ô,ê¸~†µj®ß„s‚»tíÕÎ÷¡"QC.aÍ\ÒFiQºŽÇP‘„Ó®r¿ªrI–×iºj:£t¡û J ÊH;˜ˆÐlÔ •ufªR®f€+H d9¬.QU¦2C'&¥z–!p±¨°ӗ躤#êh„íÈŠ(‚6þ‚+õŸ‹úÏÑ r?ßb=‚ÙÏ”íÛ-’òxÇI²¬§ƒ4[[[Ot[[ÐCÕt‡x.}J×Äž2ÿLGOp_l²Ÿ®¢Ç(ã’ÝF…xtd/wÄ…œ4… v ïåܺi´-ë`›Ö56é ÛºmÛ›m‹æÛÌÚ¯¨Ão'yC§’½Û_«\µPî–?¶ö<1×6Í|Ý'd0‰²˜ ܰ!Ÿ±g&¸Ü¯/ÉHN ¦”fŒa™ÃGŒ5&:ÆeÏÉÍ»5ÂmΟÁ”;¦—L›>c&Ì.3wÞ0Á²Ew•/®¸Þ¿Ü÷Ê—õï5 6âï`ð T„a(Œ,J0 ¹|%ÔÂrx¶„Ó·`ý{|Dp¼Jq¼ ê 6;ã—Ïü™@zOkOkÂûÕØ gp¨IØaàHè꾄® –!vXÒ°'ˆLÁÑ)b›ÐÎXœÐ%Ôº‚ú³E……3'ω6ÔVÕgÕWU×ýÜçB”™0æ w Ñ'µè›z˜÷À½ðjUØw½YY8"fTÃõ-ýÓ9¶wèø  dô€QÈþµl¢s$ q„K¨‰¯¾7ÔPô.¹Ò~¿ “°A ca ·x[™Ø ZSÓ–Z°£Ò]ð âöìçævý(ÞoÞÝi­Œ¯ÐÈ;ðÓ苈ß´}= endstream endobj 425 0 obj << /N 3 /Alternate /DeviceRGB /Length 2341 /Filter /FlateDecode >> stream H‰ìTwTÓY~¿’žP’ ´PÐK©¡…"Eº(`J¨AD)Š""MDPP±!Ett±ŒefÔ90FY—)ˆmt3®»Ç³»ÿÌü»ûó½{Ͻ÷ûîûãw]Ê„U1Dºš'Ò°ŒdŸþÿYkeÂÆ²È‘ÑDF.ø?þ×€~–ßœS…ƒèhâç}äÿ(¶•0aaòÓ$ˆr„ŸRS'Ÿekaok˵4µ`yˆã¥i¹¬ow–0#-CšÍÊÉŒŠX\Vެö™ÇŸþ÷{˜„ˆEÙ"‰L.å‹%I,~†$Aœ+ΰÄ–lÛ¿–}æð'eÿ†<™ôcBëz豦@á ½ P 1m²Íú8ãOA²¡õ4]ŸóÉúOW¸ö÷#GœôQÇ e ¥Ùyÿè}| @ò€T&І²oÁØGà d YB<Èò„ü¡( Šƒ’ $…Š¡íP5T5CPt:]®Cw o 9húz#0¦Ã°ló`7Ø…7ÀIp\—Ã{àF¸>ÁWàð}x~¯ !! Dá"<„"ÑH"’lEª¤éGF‘iä+dYB^£X”†²P.êˆú a¨ÍB·¢5h3zB'ѯÐ9t}¡`Ô1ÆŒ‰IÂäc*0 ˜nÌYÌæ>fó‹Å2°l¬Ö…MÁak°‡°Ø1ìì9†,%ï!#‘¿!ÿB¡P (®”hJ.e¥‡2AùŽòJŽ&g*'K+‘k‘’»+÷Bž ¯/ï&¿Q¾P¾AþŒü-ù%‚‚_!^a«B‹Â9…‡ +Š4E Å@ÅtÅÅ^ÅëŠÏ¨8ªÕ“š@-§¡NPçiM—Ƨ iÛi]´)ÚKgÓôz5ý$}†¾¬DU²V W*PjQº¨4Ë@ #QËd<`¼QÖPvS)W*÷+ßU^UQSqU©T© ¨ÜWy£ÊRõTMUݧ:¬ú„‰29Ì`f>³9Å\R£«9ª ÕªÔÕ¾U‡Õ9ê!êEêGÔoª¯hhjxkdj4iLh,i24]5S4ë5/i.jÑ´œµÄZõZ—µ~d)±ÜXi¬FÖ$kY[]ÛG[ªÝ¡=£ýV‡­¦S¦3 óD—¨ËÓMÔ­××]ÖÓÒ Ð+ÖëÓûVŸ ÏÓOÖ?¨?­¿jÀ6ˆ0Øi0lðŒ­Â° Ù}ìdžCÃ,ÃNÃ{FX#žQªÑ!£Û˜cÃIæ´pnÃÆ¶ÆbãCÆwL0&ö&“N“‡\2×›ÇíãΙ2LýMËL‡M_˜é™E›í3›6{oncžfÞeþÈ‚jákQf1jñ³%ÇRhÙbyÏŠbåeUb5bõ“µ±µÈºÍúkšM€ÍN›q›ßlíl³mûmíôìâìZíòè¼ ^ ïš=ÆÞݾÄþ‚ýk[‡\‡A‡¿9rS{Ÿ­a¯­éZ3ï¤ãïÔá4ëÌrŽs>ì<ë¢íïÒéò½«®k‚k·ëS7#··n/ÜÍݳÝϺ¯òø[øcˆ‡·G•ÇŒ'Õ3̳Ùó;/¯$¯>¯eoï"ï1ŒŸÏ>Ÿ‡ PÐ#XöµóÝâ;éGö[ç×ì÷½?Ç?Û4ð Øðx­þZÉÚá@(Üø$ˆ”t>ÜüCˆEHqÈô:ÚºØu½ë^†º‡Ö†> 3 “†‡Ë‡Ç„÷„¯FxDÔEÌFšEn‰¼ÅŒGDã¢Ã£»£WÖ{®?°~!Æ&¦"æÁö†‚ ×727¦m¼+{&×÷.>0¾3~e“`Së¦e!_xPø<Á5¡>aQä$ª=MtJ¬K|–ä”´?i1Ù%¹!yIÌ7‹JñIiOYM L=–ú!-"m Ÿ—~NB•¤J&343 2îdgVdÎf9dÈZÎöËîÎr6äŒäÒs3soJ ¥;¤syÎy-y¯òÃóÏ(H nnæl®Üü´Ð«ðhZ$,/Ö..-žÛâ¶¥c+´uÓÖñÝ’ò’…mÞÛŽ—KSKÿRf^VWöëöˆí£ååÛÊçwxïè««È®x¸Óqgû.t—x×L¥UeSåûª„ª/«Í«ªßÕk¾Üm±»q÷‡=‰{fjmkÛöb÷Jö>Øç²ïxb]aÝüþ€ýCõ¬úªú_ĸÞ`ÝÐ~xPzp¶Ñ¿q¤I¯ioÓ»æäæû-î-­ê­•­«‡Ýmsmëo×h¯nsX|øëNƒÎ†#Ø#yG~è ïš>Ê;ÚÓÍì®îþí˜äØìñã“=v==½ê½µ}pŸ´oñD̉Û'=NŽôsû;Õ§À)é©OÇ~0è78~†w¦ÿ ý/ZÏÒÎV AC›‡–‡“‡gG¢Fîœó=7>ê8zö¼éùc´/´\TºX{‰x©ü҇˅—WÆ2Ç–®$]™49qo2xrfÊoêÚU¯«ÓnÓ—¯9]û{Ñ.ÿ¼É:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿX‹–X endstream endobj 426 0 obj << /Type /ExtGState /SA false /SM 0.02 /OP false /op false /OPM 1 /BG2 /Default /UCR2 /Default /TR2 /Default >> endobj 427 0 obj << /Length 735 /Filter /FlateDecode >> stream H‰Ð/ýŽÂ¸ÉÜ×ÓàÝÎßÛÏåàÑâÞÔáÞÒãßÎä߯àÚæôñüÿÿùýüøÿÿûÿÿúþý÷ÿÿä÷óîøöÿÿÿÿþÿþÿÿþþþçõòíóòþýýÿüýþüüûýüéóñîôóÿþþþþýð÷öëõóüþýýÿþüüûêôòúÿþýýüûûúùùùúúù÷÷÷ÆÆÆªªª‘‘‘ˆˆˆ„„„“““¶¶¶ÝÝÝòòòãããæææóóóåååèèèÞÞÞñññììì………'''JJJ¢¢¢ÍÍÍ    ]]]WWW¾¾¾°°°___‡‡‡ïïïÀÀÀ999ëëëÂÂÂ<<<µµµ£££\\\²²²‰‰‰...···ÁÁÁ888¨¨¨OOO¹¹¹RRRºººîîî¼¼¼»»»âââÛÛÛ½½½¿¿¿ÉÉÉœœœ”””àààøøøáááiiifffsssžžžššš333¡¡¡EEE´´´???®®®===ÕÕÕ{{{NNN­­­ttt444ÒÒÒÄÄÄLLLAAA:::ooo@@@|||ŸŸŸççç$$$ôôôÊÊÊYYYpppÔÔÔMMMÌÌ̬¬¬)))///•••;;;666ÑÑÑ***lll ŠŠŠxxxÈÈȧ§§000ÏÏÏSSSGGGHHHööö›››íííTTT%%%¥¥¥!!!222```’’’nnnÐÐÐêêêØØØ³³³yyyÙÙÙvvv×××ËËËjjjqqqÎÎÎÜÜÜwwwééé©©©õõõ,,,ÚÚÚðððmmmŒŒŒ^^^"""———}}}hhh¦¦¦ƒƒƒ†††¤¤¤€€€‹‹‹ÇÇÇéöóÚÜÛ¦¨¨Ž”–•¨ªªêìëùûúéõòåõòÔçãàñíäòïçóðæðîèòðçñïåïí×äá 0ðÎE endstream endobj 428 0 obj << /Length 675 /Filter /FlateDecode >> stream H‰”kýÿÿÿþþþþþýýýüûûúüüûùùùúúùøøøßßß°°°¢¢¢•••“““”””———ššš³³³›››’’’¸¸¸¶¶¶‘‘‘¬¬¬œœœ™™™»»»‡‡‡²²²çççµµµæææ´´´ÌÌÌååå±±±èèèâââäääÉÉɺººêêê÷÷÷òòòõõõÙÙÙÑÑÑÐÐÐÓÓÓ×××ÒÒÒÕÕÕÔÔÔÄÄÄ}}}pppnnnssslll~~~®®®ÊÊʦ¦¦yyyjjjtttqqqmmmÖÖÖÛÛÛðððëëë¿¿¿ÁÁÁÈÈÈÆÆÆ¾¾¾ÀÀÀÂÂÂÇÇǽ½½bbbïïïžžžaaa... +++RRR­­­ÍÍÍwww EEE©©©"""‰‰‰¼¼¼ËËËàààÏÏψˆˆ444NNNôôôÜÜÜ···ÚÚÚ{{{JJJŒŒŒeeeÞÞÞLLL………&&&éééDDD@@@¹¹¹ccc†††ãããááက€'''```ŽŽŽªªªOOO‹‹‹§§§000%%%BBB^^^ŠŠŠ222$$$***iii£££???///HHHŸŸŸTTT)))¥¥¥dddAAA===WWW¤¤¤ÎÎΨ¨¨]]]<<<YYY VVVSSSxxxPPP¡¡¡ööövvv   íííZZZ888GGG333[[[666ooo555,,,!!!:::\\\gggkkk|||„„„___IIIfff;;;ƒƒƒÝÝÝhhh999MMM‚‚‚KKKìììóóóîîîñññØØØ óf‹ endstream endobj 429 0 obj << /Type /XObject /Subtype /Image /Width 501 /Height 554 /BitsPerComponent 8 /ColorSpace 415 0 R /Length 30799 /Filter /FlateDecode >> stream H‰ìWÅß·á~$$á$]jÛ$¥ ¢u±Ô¶îÌìÌÜ)ÔP#wE°TE­µV VQ¬øƒªP„þ°€µÅjým}³»w¹»Ý»½Óæ.Ù/IØy³3o¾ï}ç¢*ŠªjºÒª¿Š¢•ßýWµ‘½RkOzÕ[¸qƒ~Í›«!j?aܱ~¨r‰*ë?IÕ]Q~hÒÂ~RmæŒë©Ö´¡nQÒÇÚ 2”†1¥x.ª]Uš{¯Ãg«_5wwèT?䘪e´â‡ªTûá‡%uËÒ”%=ªìjCK¸+© Е„f44—1«is³ÈÕ‘\]TŠz“MNÈïÎmŽî%Zã‰:Õ¥0GÕ°(?T) ÕËŽðèD}Ý´ly2•J' “ìí«û¤Ñ× Í °"™Êô,©‘XÙÈ<™Édz“ƒ«n®_ëÍ«“½ÐÙpàʺ}Y2ПIÁô]æGfµîKv‹~dW-©ç¦~$W¤Ö¤VÔÇPvíŠdzMãEuèfŤÒ{†V¯kZ;tª,ÆòîáKÉûúÔ°ª59Ó;µŠ ¹¹†v 9edÃp°±jP§^uâ+[•y»W¶¾ôpD(ÆX0´ªŽI_4Ð+µBLú¢œí²Üók˜ôEÃ-(ËWИôEMíÉlôžcÒ àö1öžcÒ4-¡›F‡½·˜ôEcer³û ¥ÖÁõ­gž×ãFC“\ûò®%7êqª/|T“® ¥oÑTMŸ×Ÿñ¨&]ê½u~WãkA5é sË7T-‘˜ßŸᨑwã6¿)Æ‚FM!%\“¾àQ“é@º×î 5¤7²qAíÞª^S NÑ5U5Ô07dK9ØÕ…¥sá)Üé€.ÃuTR»>Óª¢ÝÜuP6U7Œ@G+¤w;\+9ÞT±Vžë Üi…tÃÐ57Û»^±¢T®¢õý ¹722TWéýÝ E34-ã-fzWë»*UÝg>ìÌ®¸&ÍT%(‡ ­îmJw—8’KïtSCHÕ{tØ`¢,iPüt!t×í+œéjW_æ€ÓoÊ 5–*ÁLvÃ9!›Õo}í+»áJ„ÊVK¤/Ýüí±ñ‰ïLt)¶nýîØ6´ýöwÜqç÷îÛ0Ûjí¼ûû»výàžíæ'Ææa‰7àéØ~’«Õ¤C]«ê!w;Ý¸×Æc„Lê Ë&Øaˆ"DA˜"ŽÚæÁ†ñ˜ã(kš‡©À„!ıÉÚ#?Éé é>¿»Ýow88º?*Ó Ix€tC™0¹ä–ewïùÉ“…ÂÞ©}wï4óÛöC»h›têÿ/Œ™i+Ê>?F,Lúé¸(® oÃó˜ô(yêAÏp(2ÑŽ s˜yèp1ÇwÚ&ٜ۹òÜ݈ nß+gœZVÂYÔ¾²Ä¤7!})ðÝ£IW{~†:òð…:]-d›m/› iˑɢ‡ç23Þ|ÇàTá8ÎôÖÑJ¦?šéšòsBñŽzÊ “…™Xäòí®Äb˜u¤,±)$}ðå 1#Tˆö=IoHúm¥ã÷ëZˆ‘ò D ^(<–7#) Yöx2ÕŸJ?œ‘™‹O”ç+1ÙöŒ1éMHׇ’ëÔ _WžÈíž áüÉBݾ¼C 7àïòLŽ,ä̧üù~Y´¦íbt ð<&½±¼/|ZS•@®«Ê:ç™Îu²$òpýj{)ŠðgýèBŽÓç<Ûç…ä'–÷ÖÑé}éá°â]U½³Âô± ;»Ÿ„rú Ã8¢Tîã¸çÀ‰ ˜ÈMÄ\@—…áÍ}áEf1‹"lqC³U&½„0—*‡Ù\Žv#‰coB;"[^¦¿ÉRv åuï}PÈÉM3²iùìJ0| S –ò>ÉkHOË¡œËv&6"õ¤Ã5T^`=1†L/ªÛ¯%:á¤ëð»)ÕœtE{ñ%O&w;ˆTD}‡^a~’c"·ÑMØ&¸ÁÁ ¿ˆÛPjS‡Ë-BÊ ªˆ,àÏú_Ä6±XŒ  ¯²bâî ñ<¶-ûÔìŽWŠãPôƒ±-0Tþ&„A9CEl1X…œR¾ ŽI80OjHïÇ»+$ȶü?$Ý]mƒ!rÅE^.Û¾4tÂI—gøÊ5÷F‘þ[Ož%˜@~MmÇ‘Ü [¦]ŽI;•ûD½ –û&Ï|.ÃƒÉ µd!iØS&BÇsAÀ* aSRBa»„Pɦ@ïIËMb\™ÀÔÌC2| ì²dAˆ1)%SØ š(\ñžk2º›ãgp¸Àlu¤[K 9&!hxDq©„k¼·‹PÒUE7”¡þ¨L¿uÊß“W‘L08¤\ 7÷yçXd!9侘xÐhæ9rdx`fs™Ã2N€*aQ–w\¢Šr‚±{”dLÉLu˜@ë!L9T08-NJõ²„雌K'žäR©0ph€¤P; Kä^ܺ€~°ÒS4nH‚ÁR=é8Ÿ%%ˆ2,,8cÇÙ'²àì@„’®)P¹mJoŽ ý–‡ü=ÙŠ‹¹¤oDÝ#=ÓŸÎ ¦O ¸IÇéúdþ¥Oa“¨g…%^{tßé×O¿qæð…4Æ[^Mަó¿øæàhêðþ#R (ÀÈÚÙg~÷ÖÙ7Þ^íFŒ ç:2ÓéÌ;éw7ì/á"Ú?8š„“É-û½³ç~?ûJ¤"çHѦØ·í÷|pôé©û¶Ÿ'4OÌZy§ˆe.üaêå‹]r.ã,%, ï ûPu óúó{gOš}â„ñ¶o €py—”.[óbéOüÅß“÷#Ú)ò±]ÒáË~ß_AmÆÎjïuæy[“¦ål¸2wÝÛwÞžFïLæàõÍÀ‰Ž/;Û?¬êºp·£ý†3NɲýbàhiÓÔU¿ý\*G²j®iÄr¯]«º]žÍ ž¯!ýü¦{Êà SO¡ <0]Oºã|zºï¥O*뼺ã\7ê IWEö鿤+7ÝYvÿoÓ†cŽØÙÊ&”9âò¼FlÔO"ÁŠ—>£6qæ#›ô¸‚ާÿþÚÖG ›Îbnùï'äé}Æ{¾8ºwÎðúlø±­‘Ok?Q8–/Õ¾ö³êå\[?W6в9ôøÅšÏ¼õÏñüüq÷¥~¦Ã•Myäs¥)éš²1=çþÕ}—ò²†¦•+Œß1K-Èu‹¤ü÷5”¡Ë+ÏÕ‘0³§ ÌÊù³™úæÞ7%•N—é¹~¥Úð“å9Y^[£>}ÖþzmïÙ’8Ó¡Žü¢nÕ…ëÿZ0gº¢«=ð×hžéŸÿ;ºz ®z3[p¶CÂCYë·îñ¦ÁåI ‘ÿÔQ0¹ ‰d€˜Â (œŠW‚í-÷ªT™ØÛ´‚Ïþ÷2È2Á_Lû’B–ø<Øáâ²\û?ùåþ[ÅqÅñkElü|e¸Ø¥ã_b*¤áX¡€"í™Ù™ÙE ¶Áƒ.Ù­KT¥*17µë„´˜‚ƒ‘b ŠëÐÔ†— ÐBÓÇßÓ3wgïþ°ù^uòìÌÜÙÙó™sÎ÷Èó¨?âÕ© ?çÀ•)LK¦ ïÙVzYìUÕ%ßmÃ×:G}ŠÜ)Ï I¿& ]Já^6—{õŸÔIHBÕT‹Ž &§nKzɹ£å §OUj¹ÿdèÞåXXÒÔ¯oŘ!ªË®hoR8¹ôK.y>tN/D‹†únÜÌœQéë¡Z:mæÐc±Ÿu:umùÆòÆþTÓL5‘âž.iéßêvI×Ï=oo¨Û?¸s0ÚîöĉÁh\Ý…㢲ìÀoþøD8}.]YÞ;4–é×@ZÝíyw^Ðò›ËõÆíë™vÏœ£z;vº8˃.zÌÔ2Ë ‚cæ¶Tc)hJÔRi3‡>7¶Úï„þ듨{Ÿž'ºJÅ S'C¨á%ˆ[°uð&tW*e¬œj`Ô!I ¶ æÿî‚%%°€Žî oÅ>¢Dè{ꡉ¾…’ ”ú$î'›ü­†r)°Ô³LniĘ̳ž~¼_ B·DU¨wm ôñ°åü($ýjÞ^Úê­Ã¸JÕ~ž§ÙžÅÓHýµÊ>õÕ$êï€àMŠAçBÞ5ýZ #¬vÑjTÚ•ʈpOa•‡~ˆ‘9A‰ 6Þ"ËÇëÂö„ˆðR†Þ±Hp: Íã°­•%‘@\åhEîP¹ ôç{•9D‡Þ_h.dÊ9©(ä 9z$ì¯#$N*Äûáó Œ¯h µgþ}´a¼SÁùûyÔw£ÎQAõzøš,t4Ϧßúéß73£®t´Õ€AÄ)é,*ÐݸŸ –´êk+ïo?~Ã0Ù EÂûËÍÄ%XnõibÂw™JÒ„ýZå×îm¿N}Cå¶ùÙE•TLc¦+Lâî‘–ÊGBé;T6&qº2|GŠ[¶Œ?ÎÊÿcmæÐg•­–ŒñnÁ¹í4Ü2"[¢½T ïc7çܶÛÎsÊ“.“¶r"OwQ©éD©•±rÎ<Œü/JºK´Z.ý¼ÂBšø¾ƒ‚ ’XbÅî=“´Ú~DÌ¢SÎ×qD}óv™¡8χ^ º[ÆQRòýY<}•.‡‘Iüäeßf̰Øâ¬¨zWN²i(ßl§ÏèÐÊ€ñŒ•¡Ë ˜ˆ¯MZ­[•Þ´tÆh£-?R’áñ‘Ô”-ˆHnvHôU|£#üÄÌ7Øùá}}1èKtsõÿý{±Ÿrê*.)øŠÄ»ë"3ž‘H‡¹ƒ2™Cä(ÓuûdÑ¿>¡••Ì3fXî¨@R›Œ2ôÂbžžþ(<“>¨eõš¥¶˜ ºÔ ûC6 Eª#´$&j{UøÓ\è}‰ãâF.­HJ§„>+›=ÿ?ÞÓç¼è@Ð͘¬q|ÚŠŸ3–8‰HT:p]e  öîË·]Ë-:ƒG–U$­¦ ú¨ ­§/¿]h‹\è½ c W6µÜr3¿òw.€×š¿WnÅ…6dé´g ïÿÀ¤¸† îú(¶1‹7ŒþŠ~A`[à€PtI$!9p(ÏxG0 ¼Ž,KA] ½§!ŠËm_>XY~ªâiCçô»è%c76.[v°u ôV?À Èñvn5‹—ð¾œ]Uèæ`K (Ê,VúὬ,ôõÇAŸû1£¤f{u’¡pSTçׯ[1äKÓÿJ‚\K]ú0‚îhæàzylÃíKÆèž÷1óðº u.„³Þá8ï‡o›6t WÂþ`¯Á-˜7ºw4±,©(4C^é9»î5ývaa*À6h Ë–w¯¼zž§Ù CŸ•˸ôÙ³VŹ¿ËÛ÷Y³$ÌÔêÿ§±ËÌÛrÌ8‚Býo†–:ײŽqnÇÑȵwÌønCTF®Õe50úM¸ÉH<€ÇiâÆ´¡Ã|s~¼£~œ9vègý¥˜l²Ä32¡Åýñœ]m£CŽ[¬;ÀBP+°˜T4M˜…{é´ÂÐg—Íšý¤œ^VöjÂÖZNv3[%èµCÆD^E¿4÷+~HÍîh®_iSY¨ž ÊdƒߎÑ2ryKw'H[8\>ÐlÛ<á7/›>ôFÓeć àdcèÞ'Ç["éo‰ÒÉ6ŽW3:ûm•£–r€¼9´u¦~½´ä==MûIá½ sºAÙ:qñðpOd?ï}$ìÍèñ/Vd«® ])·Ã»s,a´z‘? ¡ÓûæéÊÕ.‹V”ƒØ>¯w©Íýλ¼iC§µawLX4ÙÍ ¢g*t¼V©C›*kG2ÑöஹÐÕ5“&n/”pˆ_Çû¾‰hµj µ"BnnlžªYõXè±9« VSžwFC篞¬@÷–ðÝýòè¯_ŽŠ·T2°Æ#u—þ{Xä^GuAu&sw¦½ÉLތɸfkôÂ|OŸÜ~‹_@e.tšØM~r°âàpÞ$Ô¦h)é¸bÐçÄbó+_ û •ïVï{'/aû.Ž™Î¡]S‹ݪˆÿçÜ‘ôª³ $ñƒö¼µw‰x+³jp0•©óiz‚euvºô“½áãYý=ÑA.Oü>»EoZ·üÏ»´«š© ÑLlùP•CÏàLZ!‡”ë3З¼XùÜ6ð¼?E/êþ¢àôBËï礴<"Rèð¯Ü©×!¨ÞŸÿsã§‹%“Ü §œg1—œ ­ÈÓ'´ 6æ_¾ÏÃ?;¨ä¦Æhm›tASou2m›Ãæ?ˆs‡¶wLùœ¶ƒÏ›à ÚS@o¯|7VÈÕçþ`Óå©Fø¶†XÂ[ûYOŽ%Sÿ6*Jœs“•Z/9WhW†?ʶ>ÊF—å-¼nÂ}8™Ðܧ³IÖ'QY—; Y,(ü'o“”zG½ö'6äD<õIý @G̈vtŒ¶8éàÕ–T27í© ¯.KM^ô­îKåáã‰ZÜðøKUw2ã—t ìàà•|”µŠ­$Pè8’ Ýç¼îDvàn¿Á°’på›Áíz$û}¥$—Ê5t&ôfJod·hk4—åm®Š‡ýðBN࿹٧.*7&"O (A…®œK¹·ãpµž7Á´§^·*ªÞòÚ¼wÁ&õWd¸§öÔb¾NoKˆ-Ĩ3šò¿ìWýœUÞÝÒênWÚe è¶ ­õnøa›/Ĥûã=÷ãÜw ,eÒ jÃû²6M£jt##4$¡jÖ²š”ü 5ZL ÒR6ÑØùw|Ι¶t‡Õ6Û6»§ÍìÌûÞsÎóœ¯}çF(mÌ.¼8uv¸Dö5qóÉÓí4ðƒ7)<`DRPEÓÏl¿™Úi¸Š~äÙ÷[§üç›/ÿx®ÑX8¸IÇT^\hÌM5¦$çèA|™k,\,AÔ–òÜìTc¡1{Ò’£bÚ>üòc-R>F¾?7;ûâÜ;Q'_ûgcaaöø«ÍšË+μz‚R¥w:Ç™?œ=Þ˜}¯F8ÔÕš1ýì3í³p¾¦7o©®-ËLï‹Q_ß· 4'==sÏs{?øà«/ü$"Æ1ËHài‡« ¦××·îç`›Á²Äàá /c-2A}üáá¡Mû£/¹¢à¢ù(Ø#A‡=[Fwn·ššÚRx}px;³wEaP²ÓxÝDšÓúqL€%˜Ò˜JM:é (¬Ó xɺÒ`X³ñ®Mßù…õƒ)­‘Z*4öó³©Í—E"UÕ¶¼pb&BÁ’¢Èi·.T‚‹îšü®ª ´OµOnÜoÆ£sþVÄ| ¯«×>ÆÏE5½¿ï¸‚•œB’ýWÔÞêìˆMÄU8«IÕ hY;ìHâô Ø”B4Ê’šHëœÐ¢œö¥KœP¢1 D!Š.üD-FÊHˆXa³sÚp–Íy¹ cTÀÑä¡DeuHUbÆ}hq÷ªà+:*ä;^pŠõàF*ϸc$®s1è”Fì´‚ibfNÃÒèʇÝÿ-ˈôþÛ»f÷u}O%é“÷ÓG­ yè%´I^[/Ïà@¬„{-Š#I0 29f‹}(¼±Šð%ÈÃÒ4i]/¢‘U @ÖÔ>•f9©ý8=tðÈ ™:`nxÈ4…whó\tÝš„­…v"ÕyÙ¦ Ž(œ°ÓdYm5Öhè§s+òlÁZê:(”“„E‚½mÍn9YèŸ"ˆtìF°&ÿ»¬¾ e ôU(k ¯BY}Êè«PÖ@_…²ú*”Þ äõ‹Ýö´#Ö¤Ÿ^³×Þs¤De²ò¢—xÒZíxòù¿66Þ}þn&O^GÏÚh|¡°}y’|Ɇ¡ŬÔ%Óˆ’ã›GO…ðiµv©¥ËŠtù¹îê5·÷í*’'À“#ªÁ+ÀÝšèIùžJFRwÿîñɶ<ÊätR¤ó?•®›7®Q8º¨UQi§¼O ’|eJ~œëÔÛЕ㘡›çž!Óôu}· ™/^ó´ÒAÚªòØ…·§f§.¾sähä ëRõÒ14¿~prò2èxR Ò² QZFªX!áºÕ¾H¤ãŽÑ _;;{ü½So¼6‚Ÿ:T®–nr’K’qçBVK-]fMX¼èþmˆÈZÕüì3o]肋ÛÇçÇA·žJVáìåm“ç5'£•öÁ± àkOÒ¬”$‹æìöGW¨û‡¢Y]•KæÑ•BœKî2ïRÁÞôþå‹C½o›öfbÿ÷÷M~Böý}̹ÂôT’¿59yàÒ®Íx`"IAI åxýÜqmâ5*úÈÞW™9yj{âÄÕM£gŽsÁÚ’þÓe\÷@ïëÿWÔã›ÏL.’'A¼övÆo®Ü3êS-il‘¢inšZ)Ú¼ñÖb+'~î“å%óèŠ âœÈ5;²u?¾ÔÊÞéýþC(ìÝÒûj»ïùmo¼ttZsÏP§“­àyå—žûîG¾9’"7¦ª€LuÝqMR›8üï«£¼%gM™j7Z¿ŽÌQ.•¤›è§ÇXbioÐ׫âó˜Ïº¬ºc~Ï»øbn‡.RïY†ÚËÛ€^¨¨“NßlùöÀ‘¤U¸Žî¸613ow…r*ÔãRit¥%êfmkKµ}Ç–X·ŒH¿sã¶®%}ý}éÛ]<ñÊžªDUŽšE“´t%HI«!tôàƒc?Ü^>0(Švïm?ÙŒv.r•Á¼„½Øè0b ƤœoƒóÚ×r% ”82>’wžÐÿ¡1`­ä<Æ€u`ŒYdñž~’Ô¿<Óâd9ßwëÁcŠ2CÐ'ËЕò7—j&9KXf¥žJ~•y3›ì£cTW-EÖ”¾^3ºk M¢%%þ²bçP͈Ú0׎/®ñ¢¤ƒ¾Ê0,%]x<—õIœKñŽJ*þvÜ:Ìc;ñ^þ/GBAèÉ}Ü­^å±­÷- zß®ýßèØÿ§—‡F/ü^ât¨Âõâ,œïæáîv#¾%ª²»ñ¶ñh%s†‡ÂC'x‹þßIgëØ F‡¦è¥[NlYxM@[ê‚–ë©(XcÞÃ3ï[ÎDS˜ $ÐÆ j:êéÒ°oØøÅ¥AøÑ¯Û|ä¦CŒ |sìÏ\ÎTˆ%\•Ü3w%th4Êä:‘>,ɨP쀾Aµ±BO$¸,¨[rÎvš“uì¢åš Q¨^âà¢båcÌ8¶‚€[éN£œu’=ƒNᇸLçò“ÃíjÐU€ýÝäo­ÆS‘¶íÄç>úÞØD(”P V ¢\ÒnNïxÐÑœ]ˆq¸8S ’ñ ò ;Å QGªT4ðRP˜X%‰ûìÃ(µƒaÄW…ªÄƒ©eÐ9¯úç(Š4@´äÃÀ%|$ —Š[ ×)¹JªÔ>„cà𮮦{ºgf£À³ˆì¸ðCJå„ò^AR‚LJñDd ŠÜÔ¡|‰‘¥Ñ»¿æžw§g³ÙY Š©ýa§»§ûí÷ãyž7<ˆÈ¬ âàë$†‹•fQ²žÁSœë /ÀrÒÓsªÆVÄ÷Y~ýà ýÛes@Oð³µã)Jë‘ÓFhr¹eNÛ«ŽNz¶9ùõ˜kÀÁÈÚ¨ö=l$y· u‡”G‚²Æ®„!®‹åäÛB>ƒƒ0À¨p…¢7ÜáPÑ lK\èÀ!I#4Ó’r‚²ßÁt­D,êV`û¢˜ŸšÆÅÊÃPE$¡ v…]0ÃCÊ!HÚnÏ=Â$h¢×Œ¥ªE~åT‚b¤C´…¢¢(Ø‹AÚ¥ÉU–ìž9:ENÖa'' ˜Ç¥’Dß´#»‰PàJt¸×cì­gðÊ#Ó¨è2¨ ‹Ñ÷Q®ó±ˆñäúgï[Í×Xó-›(P) é!D’y¾øøè¦Á%‹f Bð‚7Us@zm›±5‘ÈØŒe·„Hš^=æøöŸºÀå@?7Ÿ èˆôp6Ó"—@?*D®‰2^謄cI9åÕ£­·¿4± Q–!àãábÝÕLð{xþþ°"Y0ÂEf%v¼½~ðÆOGšÀ¹v\ÊYHÙO£ ÏplÀ¢ë6ùåƒòˆD™'mÆT¶nE뱡ëãéX<$xK·g~`ùÎÂk­ÛçM˜••Do†­Í vß>Özv’Ï U`êÅ–äÀ‘-C»Z¯ï@#Lbˆ©»‰ ¼n¸o¬þþäKOÓ 9"’YñBcàq mk Šîe¢`N¢vÍüc».õ­’:7þòxx5zÌäêgôÑUoD•~Ç<2Ü™ÇIq[¹" ©¬'~Y¤ÄC[-ÇöÜ@ÖRtÓ©’çõÒ—pfù-óö rá ìu&)þª1€ן…w¦€7dsïÙþâŸ/â”t³Ë—<¹a3ýëlÀ°vl¾ö3æ°Õ{¥:V-3®l!ÀÇ‚ÀsßöÀГL•?ý±‘ÔRmþ|EýÁ›†Ô2twÜ5Ùž‡ƒÅà™ŸŸ8Ò$=Nó¾É›k¼î@]gÁ?KW/{ÙŠ×hLBßÒ†B›%Gñ–#Éz¯¾­#Îþ¦.I<ã*'’UâÓË3+[ éƒ#¿H’¾äìÕ‹¥Ãm‹)}5Ï…;Å¥’éŽ @YdDÜ‰Ë -`MÇÏ ‰ÌÏqxº®â½ÿ}`ÐGU½±wx§•3Œ^—r;—Õ¬5&Ö)(¨O&v››ô¡ Båå>óÉ÷ }ÍÚ’3^&47üÿ#â¡mŦ_:+¯¡©¹5Ó…ëá w¾5AXÙs¹ø!ع/ÏEÒJ\3 ÆQoç•¶ö"µW]!èÜÑ çõGû=Qd¦üîNôºž”WOô¶ìX‚Ožk°)uˆtÙ0 ?Ý«Znu¤¾êe —ç—„£f"ƒÞ0bÉ^8ɾNÿ¼Y?÷Z1ú“‚æZ.ìzsÙµ0Pêl‹9q ßæìËï Ûzå!…~¿ ?öÄÏ îäW,û&Ÿ´ kE{]Ž'fDêzÄ©p‹tW#¤„`•šGJ L ü*7†Žg'ïþ†w¼Ì%×…“ïY¨NêzhKqQ¡ŸNMWΰ—Ú¦1 ¹ E!LºÍ€öÖÂÎe·…ïGu Ýb¥Þ…¸b>ž‡wÈ hg¼Y‘È¢qt5ß œj TP”º5"‹lÜbÞöPÖŒúG;˜'ýdí`mª/sM3×ÊA‹hxíM‹tF´á…ŽP0µp³8&²^F85æµ÷ôÚ¿H]S¹¬²Ѭµäs1èc«š3hT[Xû¢þAïÜ$˜®1!ú aµÜ *ý]À\7Б° ©½q\ÇŽÌ«!^Ó®ïx‹ÍȾ¤à…þ¬ó“ðˆ™ÑÆ¿ù³ ‰„x攘^ývݦð³ÙTº‘Y‹Wu–Ñ9{In \†[Ý# ZÂéXýwóñé è^Xâ4+†”'™ëcû•fd"Bï,ž Ï+Sê§‚ž7s[?~‘'2ZóLÖ«e.3æmÌ ÿyRùÖwa®¿E "ʈ¯k±Ú .~eF¾àšÄeôÙPvÀCáõšô…M"±Îþö!:î¾ðþø3Ns¨wµf¾w¨$êë²yíŒJõ‘RØÜ³-SûHN5QLIíir¡ãGµ?Eäˆÿs^õ¿qgØN •ö986!GëÚ×P:–Za©Ò"e“’”vgfgæ6Šsð%ƒ]"!hª|¶ !|؆$¤©M€cJn !u+ €èiÿ™>s;³wöäýÁÞ›¯}ç}Þ÷yŸ×“:ìÈ¡Û?¶§•Ñç“·ç@ÔqO25òÒè¾°úÙFV—ÊQ†¹P¶*õÍŽÍ;y|Ì–ø$ÐÕ°2¦/ÙÝ—k[6m<®ƒ¾dÁ{Ä ‰à*Íý/#â»+ý Í÷"õ¤ý i¯µïwöt3ÃT:ŸC]Ò)™ž=8Û7ÛçÌ; b¾\[DËX~¸ LÃEܯ(î Ç2R)ÿýÿîÍ(O¡ÑüEÝzýí _×ð}_û†ZYR4útGzø:$¯ÕŒïid1*4²Â MrC¢Ù.nfÖŸiËx‘'©`«G“‘wbözù劕s£µ§=* *7t¨òýtÓxÙ÷ci†Š=5 “§Ò¥QrpÿëvêÍAÈ„4ä€ðA9L!/c[´¾@R!üAAl ÙÃ4²odej .ŒaNJ ˜ õQz¼€p©˜3o¾V+ ÇµeïiTô]; ×>¥¶¦‡í€V›ÀôŸ{Ìôìûó·$ú‚™Þø#Û Ï#E¤ˆ»yÛ´;·euï>$9.h¨F²Óa0haÐÛ©ÏÀœÒgú {ß3ê/ÉÅDRÉŸñiâí)CÙà›Ž¾:(Vƒ~.•_é5ÿAùœ<>, ÷Ù™R³a4nRMpž÷О”¹5pÇ"7qBiqx6ƒz_t''CE”TZæ‰ïa‰V-hž Èäµ/Ê “êTkíêdr[(W#o4ñ"IÇWYùîžgî"úÚRÕûŠ_çÁɨ‚Š ( 8¢ù|sˆ£ÏJ›ÕjÐÏWd÷§ÉÈÔmÍ]7µggºº¶ß|¸©å¶v’r»1^Sžû~Øÿ]4O*Èr-ëÑãÌ—4°i}%‹yE”ÏrP¸ûÝ•êÕtwô”µaJf{"’NfÍ{ðÆg[7gššßÔÒÔÚÞô215ÒnÚtW¦]Š>ëÎ$gÂ}ñibÐp§ƒ¾7qàêdõ'®5¬Xb¦OòhkáÔ}?…”B™Óü{f;øÙÅøS`j4 s[íÈÓ&ô" ¿ìA!‰É®ýx2–Dû*ÔÒ-aÕóî%¼ì£É’ýGz”wòöZÐ{+h:Ó¶ß±Ú8’9 p°O}paªß•ap»;…ûºàôDNé‘wÂÒæ¶Ax®¯°˜ª Âö§ìH†V¨z™>lßÿ¸é aêQ©Æ RÎ13?7{˜’´ªœií1/mÙžêÆe\»,Oí&Úç½ FA *öU7hVJ ýÍNî½ÖpýÒ@_þüz5÷ìE0>Ì™kY ëà;×’†Ÿ ŒÇÆÕ·ZÖ+Ì0tY‹eútD<%|c´"®)û‘«ÎTƒ¾ÆH?¶ž?³­ç_ª}[ôá’¡Ç!œÐžÕJ~%!Ës¦ud•uø%ã‹%÷­Â'ŒøZñH¬ï718=¦#Gìl&k¶ä¢O–@°.&äԯ췎˜Gvž@–lØ2â:s ôŒNð• (öŠ óœ5—ºI"Úd/n¥†QS·NÜ4â*òâè@›P‚øˆ-Fÿò[:¶…@ol¸'ג謟ten=×ïìÙ3ÃÝ/üø«B·~á~¾0ÈLz-z)cú‘Ó ’ìº*ˆO@< }¡20…%ø9Ÿü¼šÒäÆL©ôªL/º6cƒù™;ÑÔœo3ꉑf:ú‡€vó/+Ÿ+jÍ<”^tçZ5}ÚÍîmÍ{m_Ÿt?/ƒŠZ­ºp(œÚ¼†Ñß^÷uzR=çìðÝÊ÷Pç£ÇÃÂùNDX¦˜‚ÛÕÁ馷ÒÊ¿‘ùˆZåh¬´=Ïâî ÒÕCáîNM9mãéÿ.U½/¿}mŠóœçJ;ö× 'º¹†I­kEMV>$H×Lö/6õˆPú÷ÊÖßë8»\j¾Yc[Õ©ÃÈF¿î·Õài³T^;0½¨g£+o}_ç½[ï7¯û·£H!F$ÿ(ùîä Î`lþ÷|HMÀÓüªtdòؾÒAÅýø7e_ܧÔÅ·mˆœø¦V½_ߨ°¬¹¶(è+I}Ì÷tÍèÉçëµá¶nVîgSÕ×ÌYR»ˆž³ð4Aû"™XŸŽ”òÅqÁr†’ƒ kŒ'ê¯I7õöÞ[,‡üŠòIAW,;¾¡J⊑ ³5s­þ´£K7åu¢Î-QS„bôVÄ4¨ƒ>mƒ˜…à5Ü+%_ݳ¥4ߺµÍQ;Sþüä€2¥‰Ó|©Úëc¨ê-µ§Ýð~c½L_Þ8|Ëí‹gzãKu=qòƒJ&Kïª3{Õ牦T®½ì@¼œËæ_«^ùÖi%ÕªÔæß‹lÎów¤WHLaœ;Z×”Ç6.5>¯ÒåÛ\Çw!‘KóA—4µîé᎛!°¼¢ÚSgn3ä+¾”Ötª!6¤ÿÃû›Nú÷©ê ¯y›²¾xôä½;€4wŽlºÑ¾5 l_쾋øœïö\ø¥ÿÂs¨ïdljÿý“¾}Z<úúæµ;µ\æQ¨ ¹ÃWŸ½çÅ÷÷‚q©ë„x-é²=6ÁosøÇëoþU Z?´±èl÷È#ýͺ5óäRM…P8ÆË¼¶ëÒú2üó+íºy1ôdµspmz×gåæŽïݳ®çf›^¤§8µÙx#PÊÒ­ž¼\\ö*­:ÃÞóÿ¸ç¥«‚Ë‚W¢ +}’0†KÕM:‡¤ïèÚÄ[>·xôÙ7ë\T¹ð¯üëž3ž+Á*ÁÆ·;½/¾öïŸ;tŒÃò…Kë¯\‡"úò¦ ¿5tX|™51?<}éäg*¬?ÿ— §ûÛÍ+W5{á6/V!v¯A×?eÑ^T{¼½eÜ£‹=ìÍ$÷kõÓ«k³ù»ÅVöårçÐ;úÃB®4fÛ÷òâáƒa5ô› Þä¥[?ì|ð…}j¤ý׉%Xüκüs­§7à>¼×~¹ÖROÁuGU˜}u>7áéÏ(1qã¹ ßôÒ§?€,G¹ñÕ‚.“¢‡ô,ÕèK³RByÅ&Œ²Vœ‡ÍbݯîºóÙíÕ¯fK‡á}!Ñãr!+Ë_®úJß0O,A÷€{DÔ¡ÉAQ¹_ñ!!o~kõÆÓ“Q3Òƒ!¼¥¨šZaa´px­£ŸiÈ2Œ0ÖvÜùö_ݹ²Ð*BÝx`7° ¡|8ŠÐròïÿæã·¯¾õÞ‡5˜™`þæÂÊB¬(ŒïyúØê/~W6êBG®T#¶|ú¶Y^©Ô`*V"_Uà¥ÚW ØÃÖµêGp¿úC×>»}âç»al-/p}s„~¤¤¨¾zçÄíO²KxžW«xzÝ‚®ôW*!/îøÏ‰cÏŒ,ŸJŸ¦Õ6¡2B©îxñÖÍ_c÷¬8¼ }6µ×ö^¼½úÍk,Ô+"ªxÛz“Nhêc£3÷•îP=¹\½jjz¼Hx2€Q0…\R°œ°1‹@8lán„pÞú0qª*¬KJåêJؾx/P5}Þ,Â!øŒðªn“¢Ù$oÙ¬Âgtë„ãžõE'2„'P¦¥z`DT¢5ß·|¶#ÐM…Þ yº(Œìz³¦§_¨8=Òazø„[´5èA! Rz‘®Ï+­êëè[Ú6lÅ„îúºjºùºkÀ]—)D9Ò/Â×VÐÖuÙkýS=äH&”Z¹Â׆›[Ïú­hÃDMª"Á¦þöézHh ú”z½`Ñeg×V†µ×7Šðë°îBgGèÁ)!\³>‹;¡û¦æZ¸^ ê|ホ’‡ÚåzÄét«£…­,¼äÇ Æ!û´ÔMú¡óëÞ¾ÒÍ¥3Ýà ³J4”Nm;Fé˜A–÷Ö,ïžJwË1ÃôŽÒÍ`“®Ÿ:(ýA3ÈA®õàbÒ8ƒîéPú` yr¯Ñv¾¸¥gÖ:ˆšg ^ó½-œ ¥§‡@T²Â#¥* åoáD(=-ÈjÐPJpy…R[9JO Q3ž'¸ ý ”Ñ΄ÒÓB !Ý‚·†ø ·r*”ž¤ïsO å©‹H[9JO !ä\p!eyJ*±…S%N·¥ÛDéN¹xžR”n ’~zô%Âz³ŽÒSKéSs¦úŽÒSK¢¤ ­C(Ý–wí¥ÛBéóÏô*Gé)&‰ôш £ôô’@úXa¥[…Y:É2„Òm%FºKòjb¥Û‰QºÓzp J·sÒÊœŽ{”n1ƒÜFÇ(Ý6ÌÒ)Åòn11ƒÜFPºm¥³vα§[ &=ƒ ô ‚Ò3JÏ (=ƒ ô ‚Ò3JÏ féÍã‹ÒíÄ(2x8ÿ&ÝRbË;UÅ (ÝNb¥³¡©Ë(ÝNŒÒa”Ìö£t;1÷t⸤´{¥Û‰¹¼Sp<1u¥ÛIÌ– ~çG:Iš¼Õž¡tk0Kô4ږ§ioÐQzzé/ýPsé¸Ó“s”žbúK'ä|Û1J·…þÒ·ƒÞV˜1´t”ž^ÌÒøAé–b–®{øÄÔ”n'Fé”8.)íÆ¤[ŠQ:#0¹Íö£t;1—w-~hê2J·“XéT/ t;1÷tز‘ó”n'1[6š‡G¥ÛIly_¥ÛJÏ (=ƒ ô ‚Ò3JÏ (=ƒ ô b”Îq\øEév‚IÏ fé”¶³ŽÒ­Ä,mtŒÒmÃ,Ý¡ÌÁžn-Fé-ÛXÞ­%fsI^MÌ¡t;‰‘ž#dht¦ý÷üèe”n1ƒ8-­IxÆà¥§—ÒO¾D QGé©%‘ô´u¥[BéSsÝÝJ·‚„åõZGé©¥¿t§\¼ O±§ÛC‚¤Óí¦êŽÒÓKé1 ôÔ‚Ò3JÏ (=ƒ ô ‚Ò3JÏ (=ƒ$î2â8(Ý"Hg´s¥[BéŒ0s¥[CžN)–w{è/ºyCGGé)¦¿t]×sXÞm"Ay߯H>I·ˆÒŸüýÿ Ã;JO/ÿg¿lã8ʾ/·v;GÚØòK8›$kŒHø2U£tQù;;;3g ªµHi/D¡Ò’J!© E¨”¤‘RU"nK!*B¡ªÄ›T!•@…ÂÃ3s¹=Û·ë]åÛÍ<¿ÖŽwgvvf~ó<3[Czs|N)FéÆP,]9œGéfR(Ýõ]×kb¤›Jq¤ƒbo÷øQ”n&¥éÝY›AéfR,=ÇÍÉÃ(ÝLJÒ»ëù͉#(ÝLÊÒ»ï^:ˆÒ ¥P:dwÏ!ëÿCéfR~ËAé¦Ò-¥[J·”n!(ÝBPº… t Aé‚Ò-¥[J·”n!(ÝBPº… t )–îÓé‰9”n&(ÝBPº… t Aé‚Ò-¥[Hµô lÏ8N¥›CH_:ï8¾‡ÒÍ¡Zº™ÝtŽÒ‡—jé®çv£tS¨‘Þõ LïQ-Ýw¼†‡§w“¨éêÒGéÆPã §éæPsO/¥-(ÝBPº… t Aé‚Ò-¥[J·jéž3➺…Ò ¡ZzcÿäCðO€Ò¡Fzêú'ð1½›C é³_Ÿq}LïQcOdü² Y¥CH_˜œóFë ô¡¥ZºÛœ¼â né(}x©!}vïÓ»IÔHïÍñ9¥¥C±t×»Qº©”HœQy`¥›I¡t}ló¥›Iq¤û®:¯û(ÝLJr›£tÓ(–îº˜Þ ¦ä ·”n…Ò½nœãžn(é‚Ò-¥[J·”n!(ÝBPº… t )“Þ€Ÿ”n&…Ò¥øÞ=ŒtC)‰ô`täÂíï¢t3)‘Ž&fPº™J÷¼Àq{¥›Iq¤»®ã-LEéfRúÉæØ;Òͤ8½C û‡z‘¾ûSÏ©(ÝŠ# »ÓsúozlÆ t”>¼TK_ê\øš?ç(}ˆ©–î8绎Qº)TKßzG]”nu"ÝÁH7‹Ò ¥Eµt×Wÿ£tƒ¨Þ@éC J·”n!(ÝBPº… t Aé‚Ò-¤†tÏ÷õ”n ÕÒ=-Ø Pº1Ôˆô¥%ÇuC¥-ÕÒw5oñ=Ó»9Ôˆôõë—u‚Gé¦P-ÝÞ{ØØÑQúS-½qhbÞÜIÔHï³{朂üŽÒ‡–Ò›ãs¸§E±t 80v¥›I¡tÏk8ÁÂg0Ò ¥$Ò}ÇÛéÝTJ¤{îhëÐÄÔ^‚ïþž§„3F)ƒ?˜jMÿ*ˆd4me42¸Õ{#%”Ju‹IJƈ„;v§W­©FhQouy3(–U#c‚‡ g;Œt[€AÚmž%,‘œp.á5S-Æ9…J}IQsuSªúD)‡ùÉ¢4/—e‘ˆÊÅÕºH¯œ¥D/,ŸH&°à(c¼MU³LÛ,dœCMª×7“ú‡ê~ÀxàU°v;J>WÝËß+ºO¨U¢–×}ÙDÏ œ“,……D+Ç®L ´EIBÓòzz•)àžÇ!#ÝåÌT7T,Àª¥ç4Ò•t¢GΩdíP]Árbc‡¿ŽO© å,#!ã|:©ZÙ*+„ `&“„Š´#zPÅcê•¡š’ùu)älœ?·½=sx›P.U“*)妨F¥TÉ¡;pI9íz(Ú°Ôõ|Ç*Øûãa˜oA:Dtmtû"¤%QºÖIáb‡åÖe&F­2È!R°H¿·0E$Iªqt’XD,VN¡DèõëkŠÈóé¾÷=ÕQÎÚ 4Qšc‡j]1µF’©œ„¤æýƒ™†Õ.øb+lÃìHX"-˜¿N¿×œ„bSzÜFÄâêô)[ÍÌFY9K mÁ{ã4‚õšIBv&YRV?•aJ.‘n‚0¥*U†²­ÿ%*Õ©X‚8R{ óþ'qÜ™^Ê0XåZewW"–¦z»Ó2*h)Ã,Žà9™…Q[K/´ÎSNÌ ;кNf°£rø£Ý…mFòÏ9ÁIw܇¡²ä~ûÄóß:½¼¼üäŸn}ؤíò=I.Ð–Ì˜Š ºioÕqã\Û±.¸žœlƒæé0¥­˜®Òò´Ü>¶O/VMOVi¶–•î—\›…¥H×Y¤Â.ŽÃc³¥‹) éâç!w÷ÒsȤL×ßúÝÕg`Üwožùé›Ä ÷0:Xo2ïM¾ù†FDƒŠ{ÁøÓo½tñIxêôÅÿœ‡Íö³N\5žæ$NŽ]’i +jZI¡t•¼ #©´Â²‡ûǫß}õå÷xpÈX*È—דî]I8[ùñ)5‚>wN,BžlËçû·ÎžêïÑB-¼duý7ýâß.òhKß ô¼ì—d'~qe¹Š¿§![ü ¿ÜÞž¤?ꭜʠS,Lèõ³;µøí ¤ÕͪúL4ûì϶¯üj]ª~«˜¦ç·ÿ˜‘ˆÆz“åQ‹f»ºå©³oߦmWf.ÒMNÞïàOÐÒ/'ÉÒ)­6OþeûÎ~ðï6_ƒ³ÖGLºïƒhI¦fo ÎÎÊ/ÖCÙY¿Û¿sqª×¥n2“ÙGP­[yù•©5oiàîíHÏËn‚/1¹“œ.BÀ‘WòËíí¥Éx^v-‚ìšò˜ì۱śjïÒGð„´åwk|ÿàqgL‘Ðó{/„°ÁðÎ0\´ Ý×nlT;‡t?gzÏ|¤ÎÅõ §·È­g Çpö__ Yºä,=X¤;ç„èd“Cîž$1ûAï ìžÚÔ/NV§6Y»óûc°Ð·>ÿòÀ`ò¢‹p†  ߺ…·aîÉOòËííQòé¼ì‹Õ÷˜÷ìØâÕP}‡èãp»yµ°ÊÊû \ĉì/ŸS ×ç{u¬|ïLáSËoTµÁó,|³ÿ¢”ë#ùð)Ëöcå)ëÎ_éêÇUé=Ð׸sp^ûRiÛÏ‚ï'×å•Cú›h”ÅIÖy§_ôg5lÛä=ª„p<Ê?eò¢o€¶sHj® 8¸¼ž_ÎâØ¦ªú@MèÎÒoÂv Û"ìØÑ'K·——ö'*KõWÔ ú«>3y²·ô©_–\{Øõù¦¬úsõùÈE~Ôé®Ý§_/{æê##UéÝë_ ýr|ü‰ÒõN³%Éã§û7¾ª³MªŽq2[ûj¿àµÙ]·Eúò¯ÿO|µ?IU\áIPX0¼‡aK´zR”K~iqSÜH^æžî{»gˆ»Ì$+{k‰)J%‘ JT\_ø Å †€S˜Š eÊu#$‚–1†Xùkòõ°Ó}çÞ;;F6¡Ù¥öö»ÏwÎw¾3/,hò-ïÙ‘¸ƒø _2ÕŸ‹ÇIý%()T|Ðo[Ÿ=£Rî¿)2¶çn§qБ¿“½ ë†ÃÔý¡<(ÄÌ}ŠTŸßÁ­døÜ@jvo³sÆ[ÿß3àl=?=ŸËöi¹t,îjªí‡:LU/ĺ‰Ð ¨˜’¢=vû‡Q ¡àIî0†GÊëÙ&K¬­Å³ÐþjN{Å~Nè=`Ó@†^i^ÓHª´Õ„¸äómW=Òýí/7[Õ?»y‰j¯ á¿)¾h (3 mP@ž…¦ ù¶"·R~õù4yÇA?‹_Àžž4õ1ñ|æ–h'~+ŒÜ)†¸D!=‚&ôpÝ»¡|Ä€H^¾×(>–¦÷ó娉ßeÚ:x=?o?'ô„’ÀL½£é”GLˆÂ(& ë‘κ›®úgUµŒt$Œ/zEtzŒÞE€ºÈ¯Þز°yWü«e¤¯¬ýŸš3å¶åM·=ÓG¨n˜>cš%}aÍ1¥xÑu¾xŒ$ü3µÇ9>`¤~tcöØq¢‰¿wwù~Þ~NF¤C>øœl³VÊ•ïÂQ…æ¾àŽŠÆA—3š‚q'o^Ù&´ŸP¯ÃXæ‚83wÓ [q{¹Gg[¹©ÅåÓ˜ƒÞ¿~0¶Ó}r¹tÅçF̯_àkÈ0BœÊ»Ü”ÓÐex<2Æ󵯌IGz¹kX?Ó7("±ñH÷x{cŸK•û.½Qïïnà øˆú/AÏBè¹vÄ+D±7Už|ðuŠnüh¯ùz"èÐ÷ПnóqÐu}•Ùù¹‹Ã>…¯ï®­êbÒT-¨à÷×¹ŒuQ#:JìÛ»ëø‚¢f4<lçx×ýË»'ƒ¹"}ÍŠ›sÓ2ôû”;œaŽn„‡÷øHìSîü”"Rï;3~Ïá «IÇ:H(O~ÚÆ½U¬&±Ýj…h©Þ¯eágvÌ×Ö %£ÄW½r8etIÔ Ó+&ÏÙ…§.jÞ€‘¿©R>ìwâSSJ½‹b« ^èI¿$¨«¿ß†³Ä"TÞŒx9õ9¼"ÄÖÊXŸ6õ–{‡µ–üß¹t9Öú¬[2R:æ8 Â&m…$S—õbªç°‘9r¿ëhóÒB-Ö–3cg(?ÍD tÕpŠjèB盃Î]0f€¾O%[Ü} }ºÆN:)3¥0S4+ º‹ÓwÔ2­5Ø&I™#h{*ãôÊRŸ‡?¾ûŠ¡ÐM¨„°‰™›Q?ùñô æÆï­3'=—;n·ÿHÃB)?yé°´ÙΫ¼QçƒÎ‰0³cBä4ù‘± „^xµ §@Ô.3@¿”ÂAC¡Ð‚/¶“6›ÓÀ):N³M@wÊî5øœGòh™Ëw˜u—u»ÓEP¡»꼘¾ÿ¤X3$†¤ƒÜ+$÷ÎTÉì·2Ð<ºæ-þQ ÐWÛýGeÕ¯=ÀäѤ±úf»‹ìç¡¿Ó~íYCÏöŽìró×E„DAÄújAOÞ+Ð a½;é#¢Æh®rxs`U # xÎ6Ï}‰íØ;4ˆ{¢ð$±Öª]ò—T8]_Áî´“9¡‹ëqµÂ™îýâ· «¸@úDdèBY„3™÷¤ÑÌç¦L˵£E¤OßfX?Óƒh…ª¦„Ç›»øÞ>w•­}kÝÇŠEˆííYËK[ u-Ö'tîÍŸôR Ãù +!´ïu×;îGL“ÞF†Ë=¶ê¢d$l)̰WªáíRÈZ»?¸Ïî´¸Ã=¬H¹Cnð5«”˜vG@RA£2iúbêõI8¯Ë]—ÏÝ:ë¶ AÏç—ºέÐ&¹‰ôv¿8²Å±÷á(¨Ú”•ÅJ¢]Pyj`§I¶NzJÈ™÷]A ä®·ùnD8N6ÒtèNþ•÷~ZªEÓsDºO#Y¸´ÿ1ƒK™ZÉÌ€ˆ˜´ï#Ku¨âYÌ àg,~¼½¯rÏ(÷þnÆGѦé ÕŠËgå7Ý_˸¢t¤ ˆ—ÝüG’ÒÙUGzw¢íÞáÂ" zÿÛÉH‡á"å“\¸7ඇæúM`—:kXµ…]dÿRùœúÎØµ‡(\_ÿ»òëlˆ·p£;a§ˆðƒBÇ 8õðxä¥/HÍ}- ô¼.üªè?üS9Þž¼ð*–qg_í¿cÙ¹bÿ8`àà³÷ 刷|zc²ZÀ] |EÐ'j‘ž’Ê@¯ ¤6bú³†î=Ç–û¬µ£Oâ‹*½Gž‚¬Vér'Ñ 0‡Þµæa$]ñö‚åwÐ=jûO)#ìà-ðUM« àù@t@¢T¾`¿HšGÉ–ûùÙÜÄ O½ùÅr¢üåÃaòÒJ„Ü£õÉ©å]ƒ¾ÉliõþJwݼµC ùR\u¤OÔ2@Ïhë´ ´áøö¤G¼sôÎB+ÐE{bÕ‰ƒ¿ž—#IСjp¤]õaI(Ñ'73Ô®`; QTä–PÑÜ÷Ë­w{Ð)ySÇM›ôé·¦-SùÉF©™ÁÒxh­Ž øfÊš•™@f©÷ ’÷-‹™õY®2»ý¾f 2("FŸeŒŽÎÊ—a°¥"—wÇAçjm{¼:“±¢hNóPßœï°+† 'ƒÑúWg%\œAêqqÙÎú~,ø0<’<—²Ø=Öš~ÝíÕöž,ãŒ. =süÑçFÊÍ}#1éo o³#ç.èr3ÿ¢‹ðv鯝èݨpý€¨Ð9ô@ÖøÎg˜¹˜|B¤@GÐ]ÎZÕób¤ê7]EBöT}úe2´wÜ.ÿ3^¿âÊôÖèúõ¹;4ß2šÜ­Ö.´k¥í•¤èŽöS±ñJy?NÐG°ŠË!m Q²øöóšþA£k5HäµïΚPùxá`ÁO¨VØÞz¤3Õ˜Öm»¼Ýh–¦‘n@v‰ô‰&æž´3¥áKø̶ÓöΊÙa2#}úí®*ü&ƒ³Êå·€y£¶‘Æ'ö®ñk1{ªëa¤KÞ!7ùÄ\ÅþïB.£ÑZ˜Tª“oKfèZû`¤$tð§l_]È…>_žÖ6h{Š}Aóäî{œ,£¾†¡ ˆ½eïòxÉ«•Z?o{Å,;© ?ŽTËdáHoÆ;ž®Û]ú ;ÁKœŽ ?Q e3Ð7(bªXýƒ›} Õ&Ù¯kGïT ¯&×T]?ýñÕþÕq…ךÒÈÁ<ê -èÖRs·‘²ÆÆCEà†4éž™;3w-/®PÝîí’(†Š\!/ ¤ P RP;%Bš– (‰€òŠB[ñÏôÌÚž¹¾%† l ß™9sÎ|s¾óØŠba;ž)$áÔXkٰ슒X|<ÁòQa•Ó0¨Š†Œ*, Ìtp…ÃïR ºÁvÖý½1ó,áÎ V’Ö%çãáϺVex ªÅ–¡o»ž=íZ=œžìEå‚:°u¯±6«â݇L7Ô=‘¾ºP£pÆ%`yvAØÙ]c?‚­ ¦5¡?eºG˜ë2×ÿO÷Nj¢ ÆéN½p·"Q8>{E:F,ä uÓ°VüÅ}¢÷Éóx …µ:Œ4mx'r™ç},E¨Õ±¥ZAxÞ¸>Í…X Ó“ð)óÀ³ÝÂÊVhþ®@žg¹¿ÑÐ&dzì݃ÒR­-a#¥~€å^Üá¹âëÈ8«éJ×»$p9Ù˧#¸¯Ê¥‚N\Ù§9à++¿mÐ{{v[œBUJtéÏX÷ô†©Èî.#UÀk¾Ô;Îl“?Òµ¹UM‡3û…žû>…XlzróJ9¼ÛÒEcìf‰ëÿC  0ɽønt½íJ»ŒLŠ«|DŦàæëÞ÷@¾*cp ™NlÎP7B–ž[;nשôš.ä“zÙ¡«Wº¯^é:{õˆÁ·pKÁ%¡"ôöÞŸLoÈLU×ê¢RêAyë™ÙEލjJst·žû^óp¦WAå¥!“êýƒ2:¯ 0]UB¦w§aÀq1@J¤+¬ïÔ›y%÷-›`=Óô‡±šŽOÁFq‰:6w6´ë´L;OB%Q3šÑ# JñS鋇©…ÑW…352 ô)ªf×}RÃ6¬½ eZµœ(³Ny‰qåóêS0 LtüÝh¬mŽÍ× tnûÄñHÀP—¨#æÃÓOê{@)1K=+iV1"²3B/°è±Ù«B»ÒÏ ]jòxŽ ®¸‡yÇìÀËa®«­¡Ë8è ôIc°§Ñ{f‡PK‰ ŽãÙƒa×¼ÞâCÀWq× «"µ&X|¾> «#¤$YÀÒê‡Û*|0‰]Ä<ƪ¨›âŒ©õ„q¼ƒŠ©  çPmÈ …÷µ(»üšþÖß*ž2¬µuxÍLoÁ¸á ß’»¡ w™ðlð@ÎÑfU9Ú”ª g:Û ]X¯èI°È3ÄžIÆž“¤'t §wE·Ìò¥R€J’fáô‡v¥ gemÄÕx› CêˆçÍ·œ&I}m' œš™XÓ0Í'×½¡ñ·¶ÇiVž‡jaSVv2p÷ «ÊáÜJˆ°Î »ª=b :¾o ×7¶ã©D#\ãc-›ØYeTLp¤A ¯ážât:Øcã)]p€TC½ÄÇA*éøHIYê¦$Þ3Sª…½V¦OyXBgÓ/WC'”‚ÄT÷KCúÌ[Õ®ŒÝ5½c6YnÓñx„õ®éH°Ÿ}8w@•6’¥Ø™ê¢~­¦qL½ó l±sï–%õPj3¦šwûØ¢_ñ´óúšÇèèŸËò‡Ç„é Å'”pÔv)*»a=™:æù#™;Ðû6n{XÛiß&¾#òÍoj³«UI·ï^ÈA•FÇ#¬3èЦ—qÓë#L&…ø9½ñän \ — …}–íª§BÑÌ~½hmjM©Ù´Q,ìGiè$ó¾p–œõÏÒ—¥Ò]N’è½±ñ¿åÃëk‚>%³ƒÛË”§wۮ饿Pï2ÛfÄ ´Ž˜0è"ð™-m‰…Xo!V.xPÑèÑ×((}†-ë_{OP*=bôN\§EÑÁÖuÊ}t w™$ÞÏÒŽÓRü ÷ÀS½ûzGÇ…[ŒŽ8¾ÛY)*ðXøªzž$†AØà©íz&ú$ü×0wÚOGþj¾# ôÆÌ³lÙ¨‰·V÷¡føA÷Qs^1êü„AgDHš{¯N 'Ž}¸Æ¥~ÛôQ´ÖÜÉ?÷ThÍî¬Ê~fÔûFÅ„@Ì‹£»\F¿ûqoh׃NÔ=‰"‰úss£óírh|‘Ùÿ<±=%5ùhœÇý>4T}3n¾þN&'Š OŸ7 úìy‰%=3u¨>6Þ3èŠá 亢–ë º•¥'Ò—¼‘Ã:ŠNЯx{;´~’¾ë×A9êž+ ëdÀïPKÈPØ‚ ñÿJÕ.¾tU‚ýØ ì½oú¶LBªOÊ”S ªçÜ?÷5îÀóõÍz¯a×áŠ0蟣KÜa3kíša»qÿPÒP¿ÖJŒÇ’1ü73ûž§B§LØ»jÇ02¼;‚þ“†ê§ÈšŽþFoGc˜(è¸ &Hº$bºÎ —¥ÆŠ7ñPtš‰“ÔYº¦Æ®‹Ã~ŒÞο²V¯Ù#$—"ÔƒáA¡Ú÷ïEƒK× ^ªDu°îzË1­ããÓ6ÆuÉDAÇ«R}rq¼í:ƒî/«±`ÍÐa¡ð˜¦¿]A1Åš^NÛ‚¼xauO€¾Ô¬;¸Èè¡e.ò/3ßg ü@ŰÇÿ~g†_ƒÞã¨7ü£;ÕäÎ\)ÄA§àUW1ºr<¥Ôt Qê ¹ö¢ª.ï" k ý­ìiµKƒq÷$)·…®x&&:ÐP7Ä8c!WºmŠe0Û…Ýw¨FÕê›Ð²…AŸdeÿƒ&H¹M—‹Éfóe4ˆ‰‚®hR(̳¥WÇßl}A¸Xy2yúTjnTêÂdz7>‚ATwooMÞõYÖ•¹ v_ŠêŒ?HUµc†À*ƒôÍ‚­Mj…/d/Ž©•ìý›íÌ·jgz÷ÙýÌT{þŸL^hÁÎUÞs¦#Ü%ªøãÔrAç½™p§]%¾”•635ýUP…Iî\MPAÇ_DÝ Äê!Örɬ›å ‡£Z0÷ªP>ü)G]b#àRØR ¦Â~ô¥™þ#qÌǃž:6 }OŒ·}òbK¹„“*^ááxºù*îbD絉kÍÃnho#X¾­È¼( |© çÂç‚;Ü|Mo‹ž'ØCš¨º<¼@3år-qZ(|90R¶8¼~bÍŸ¾>X {dºTnÑS]~‘PUÛÉmØ;Þà™ ±{„”æ¦~âÇýĵBê>zo¹¯ÎÄXuí‹&eë p~Чd~¸<ß¹ž.lþãÎ÷ Áž3Ÿ.²¦ZËÛóù|gd”Öçíå·ÛòùövÒž_ÐÏŽ…ö|ÛŠGõþ £­³“,\6ßVÚ4\éh»½¾TYÀ®´i{®hËß°Ží‹ž×¶`…\Xiko¿ÝÉܰþÏ~õ¿Hu]ñ{ν÷½‰u]mRWª˜Q¢¦ëº;1*MëR’NÅ]¿å&ùa ™faa'C0‰…¥EU’64RJ¿I‰ÂR(i)%ͦQKÓšBjDHLügzνïͼ/sßîŽt6£»ûÞ}÷œs?çûm‚ÚžêñꨇîŒímÌÏÕÀh¥Q›¬Î~ùÛÓvúí÷ß߸éæä\µá¹oïè#ÕrÌרTæç+û£Zåå}ã»~ñáuËueú‰Õ±ì±ZTŸ?_®ìÝ7úhãÑщ=9{Uƪc•³M=Y»Ôî¼\9ñú÷þxùçoÿìÌ_{`¶\ÙS«ìýÎ!™/ÞKËtàÏ»ÁÚ®(EùIªÒB2O¿6)%Q'¯ü<ìý^’(ä°¤.$’}(Ô(´)cM>úQî´OZ@ˆmF—ˆHͳ%÷¬ù—TÒa—Š mµƒŒd¶€Ç•"¡é¸H‹=ˆ°]çŒHYà$µ=i–h5H°gí¶¬~Ý:  lã¥9]Šå9%@‘#5Xàó'm%°ÀålôÜÈb·‡Ü÷ØÚd ÖF»§Íµ#€âPQ|¢{µ2Û·ÅÑ4$2™DÊ’‰à)±D©"Ä Oœ% gäHÓ.Ãiã$ìྜ]ø‘,£‘ƒK Ñfë¥6Xb¦C$"Œ´:F—“év³ƒB ¼.ÂtøS0AÁ÷(´%Ú4MŰ “õ"{—‚9ŒÁ*@•‚¢‰ÔVÖÉ@d“鯶ˆUìP‘ kª·Y_DvWR"$º  \vO»’éÂæÊ4¤YJtZº¥8"q'Çq”G#m!ü¹Dú›l–Ñ÷Ý–—kô¯•9;ÕKä4„%„7É 0œ`gh§àûÎO!ºBBÂk@åüÁe=®©Ç[ È B¡m±q×äÚb§LÚf„É®•C!]0òWÔ*ÐñºHÑ®$¨”ãrvK˜ÑúÄZÀ£u)N·Q ®@EYå乚’“Ì߬Gš5ÇC’mrC˜î|ÙïV˜vGÐ)§«¢–n?ý–v”c+ɯƒŽt…ŽD#Ú!G7Ù‚H‚=„¶F;°ñ©¤ß6¤\5–í £ …–i²vA«Œ{Hìáâ š•'£0átž6‹ZOŸzƒRNwªhòêS/PÒé(¢òÔ§Þ¦\O/lÂ}ê J:ÆÕ~G_ ”t:×uÕ/ï½O©ò Ã=NŸºA)§¼t³?¼¯J9ýþm<ÆA†D`Ë~“ì¬'…Ìîkî‡øö—dÊË …Bú˜›'|û[ŒV fyÏ•Á!ìmW%Ø2´Í>”¶œÅv©îšë mß÷—Ò@8jp‘K}•¢³kCB0‹¯þsepPØËîQ@áâéýþµg²z’\8åƒÔ˜†®…Dÿ€ÈÉ#;¹7X»$)þ_ )‹ƒNDéé5nÏâàÌ_³n§{Ù>¸”Ê… ±H8ʼnÄ0,hþÙO’ex÷G—?Lh•_*H´,Ö(CX…8ˆ¶¯Ýì^[»Ã•°LO¶$äDx{”ݤ÷°éámiš;ŽÎÝ º`¤†{Y | )?ڜ߇#f]u84­lŠªúšKç¶©^X‚ì$€¿Ä£HÇ0q²¸ñÀòïŠ!CIeÞ‚E-5‡C‹ávio½‰Ã–ê ƒ;Üǯ®?ܨÍÏ—34Z+§z=Í*OÏïÊî‹©>Þ¨oK–¶ñšo¹V«7voÎÖ»?ÖóH•[“¤¤îÝŸÅÁHêc5ï¹z~¯lŒœ¾õÁÁµƒƒYX_S*Äó<8”ÛÓк¡¡z&ð‚gÖúößK†6ŽgåUSÝžªòá_½Zò8¸®XëÒ«84—¬ý¯}æ^æ&'µñz-Cã»ÆÎ.¤qªod÷5©1©ì­+„:Òݧ®Y]Ëî':»\©•ê,«0àA­Ô}½6к¯·ODt!{ø•m+ W¼7ñp¿º¯…B|:cÖuÝúTÞŸ2µ‚KgŸþw¤Â93µ©ûz!¼dÌŠ\Vñ˜Îó ÉS”¦_›ŒÙÜùô.wÿ`}gœ§Ì¹þ ×Bö»’ìræwõcnwnýà93õäòcF†ò#óBÿÊÖ ÉéŸÓм; ¿n~ع89iŒÙ*:ø©y¿s½}Z.iqRiÊq„0(‰_›_ÝÅÕió?ÌSŒcJ‚1ËÎÛJŸ–Näkú=2}å+'㥷̷îF"H¡:ȶÓ¿²u‹Brûœ1Ô‡;KÆ v. –¨¶/›1˜0SÕÎõöi¤íü~Ô˜;¡}ÜcÌ„¼‹A.X~¦¼jLØŸÞ»D Ep¯1š‡/jÆŠ&±±N±Hše]¾Ó‘nlS*ý¢ÒmÉ Tþ$¥‚Î2ôjÛ*EÆ húÐ;¥ °ý$/‹èÁu¼áˆ•2=‘V@ OC2°‹ÖwäΔ‚Kå ’š<Í:¨ÿÚ=›?‘šÞ(Åÿm3ŽŽ%I``g2%†%m&N´gµ¬øL*ò1FÇÀH(‰( ‹&™úöøte`m€Œ‘ÒâæF,ZZØ=@‰cb¡Ä QŒl9ñ)g™xDÙµKLÌÖÈ‹l™’8»é°ePìž—îÛ|óØþÝÃì:¶ÿì–dW27½¼xüxË6JHµé_\>sªjM^:zxN”ÈÀ1&íßú4UÞ½ûÇD(÷]8}æò—ì>”óO{ÁüsvöH™–„|×üžØ+ßœž¾vaÖ–k|Ã,túÖµwÊ(ÞFn Q}õêµÓWßùŒ¢ ‘çîµ.#¨£ë®Þº~ñ™“.äpæzbÇ—ãÊ•c¼€âäßÌSôwû7þ>ýÉ{üÿòxÑÌÜf( øÏt••l5Jàª1¯ËçÌoJ6C!oóm®‡•˱¬ÍV'¯¿û³ÑÏ9Kä4ž{"Ú8³Ý&qÜšúψM×÷‹¥®I%n((>Ä=WãÏ7Ê6üÌÔýlŒáT·¾/ }lLcÁ–Ûÿr_íÏU]etŸ½Ï¾çbÂCÛ‘¢VÆJi¹¤ 0IªÔ¡<‚‚¬Ê ¯@¯<†WÒ$¼’"¥ja – ï´ÍPˆ„ ¦À`iÄ ˆ”þ3®ï;—¼øÉg4ìdî=÷œ}öÙç[ß·Öúò;æsŒç—¡±ÝìòN gÆÀ"bÎ*M™ÝØcŠ€ MI…„K€ {ûk`J·õ2Tÿ\¼ã(1<&¿÷á´p¸—š ¦0и5§g÷Ü­¹Îy r€ë†ù|¹ñ L~ì·”·í!ÈçEÈIi3j5Ðx´pÇ„FÎ<"3©d†–•/k}—§Šš4mcÔë~¦]ÎÝj[|ÒŠu&§ÕÿÀ,dòœ»6¬þ'ò½‚l?X8‰[X|aÃ%žû! ¢ÏÛ:Ë"}Ú¨¨›‰ŒC­ÄŒ²™:‡áÆÕSeƒvœ7xÑFc~ÆD1`’*§fJIåËDbù&êLØY·–ש®¾_@švåÀ˜ aNk.¡Zj>Í¥âxpŠ|b¶»ÛòÖç3 ¸°L>§F1Ö +M[è+Ï&‰%O™RŠø¤”©ˆ¯K‹‡8 ¬ÒËÃr©–šì’GF[8q/mÀ’n•.T—1ƒÓsä…æ ¬ufˆ:l-°ÌC;éÕÍ®ôÝqŸçûFÆß+ÅyÄk #_ìhȘô÷%ëƒ4¬Æ#«ÄÌE#º'"ltÿÆ© ß¾eº"ó%NW'ù¢ ­[ 1"¡vdŸšŒíäiø¥2Š÷ßG*ѳÀl­ÀvcGJb}È’ ‚AÀÐPmVûaìíH© Í@`‚Qš*ŒZÊðøÝÑ¡Ê ¾ ÷nWòÎ(1›KZïG]q°âÜ>бs”øDYîîßÒ‘7CùÜ‹÷DI¸½ ÀxkÿóàÿmD ‚¥•c÷Xi‹¤~šÞÃu~þVjÀÖâV”ÍSÀ·Y3gPJú# ÓQz¿yF “ŒÃD³u¼Š z¤•t &øJ"ÌѾ-^"8›Ý,gBQÔH)Ò.¬¬U'î˜uâ!¼ºnáþzåŸà”ÞVè"úˆô!¶W´à””ÑbðÓt‡N³&“Ç¥|:‘<¯~/ìÖÃ9©ó{ó°©™W­ž D*§GÉÞüæ³û¼0îŵú³˜å²Øoå¸q¥€Oë"³Ü[È63#žñ’m˜'àH¥K£ÕÜÀu''Û³˜Ó s.PL÷̈ÉÔH4øMæJ¢ŸtEz¶ôQ®Ÿrò̤³«AV;Bi§Þ–9Fí9ÃÜUðÉ+ƒˆ—," -X”nÐ/xàÒt[†d®»ªF SóîÈô jΣ©šËÝ‹|ÃúkÈdݱïûfÎÒçŠ[6ð;gjñ‰áuœÑ&v>n†¢÷Ÿa±3`ãyB„Ü‹À¯‰h;°–ø¼"¾ÊD¶G(¯ïë h¥;?T @Böhá=6aÍL"ÑFò¤UN³ü‹XŒÜøe\sÉ >@›v}“q€Ùä2Š’3ÏQ¨édÿWú)°FÅŠåvâÝ)XW%!’v­ >qSaÅçb§+É@º)êó6ŽÃ³ÌJäµöá¯Bñ”ÒkžŒÜ% «™~Œx䎡F"õt’üxQ‚]‡ k ½\@L‚Ë(LðÍ…4W[ò1ÆòÇ¢§¨0"«»´lˆnøNe’´pêêòT9€ÖY{e´ŠaV¼-R©Æ{­“Ú–•ÖÖ—×ìa² = }|±µ€r.¸J®\F¸¢ÃâV —7˦.#G®³CÅBöð“&÷>›—z7f0ƒ–7§‚À2•­šÞ2ÕN³Ú~sPã牟k¥×¡}ß@ÉüX§*; : ÙçMZ˜Õ®«ñ:'eËtë¹dTcg”s£,/ê+¶þu—Rºf=ïè\g#NÊ—Ø­TÈgQ+dnïA“˜í›’µsšøä êÁ'*M¦ùxréâÒLh¦öˆÄì{(:ÀÏ2}Hg2}¿e ÄY-åA#šÈ“áf„f­ü ²ó$Õ1r,ôJÍw4Æ䤫½‚bÞ¿S  ²×™ n*èZ¿}ÐÜSæ'Ä…ö5˜'ùĺZÉÊvÖå ¸Š¹ÜÆjj6*ÈJ%É`ýo3>YÖ™åÀSަŽ{éóÝw.Ý9^»¤¥¥eoËî*aõ|“þѰcúÐÏsW)Ó.}B vÌðZ½t¹Ävå'6áF¦w|Ø`<›YÒ_…t3À`œç¡5 >+N*šß›h)ЊÚíÈ~OìQ Ë(J¯wGQåTÚír¿+É¢Ò°¼&ã|ÆU c‹Ýï*†” 5åH£¼N>b7ˆ±Þùjån!Nvc¯É,:>çm…¤–¸¯ˆ´3ãÁ2ìž{pœq«ç ![",­š,ÏTùuJRAûØ/_e‘Ý-ûÀIo ;wfæOK-ÞôàêMLâÞã›Ã»üz,ùï†ÿ4œ«E•uU8(Åkwâ3Ã-Ñ_1¬àሬôR´ÕœTR*–Û eÞ 8 ×Ë`?Å\4ªÇf.8uëß§K²‚¥¥ã~ܘ']$Κˆ|md’Ö÷Kø8wï~ ³òXÓãSiç¬ Âµø É:qÂ:-Y¹rÅÑ!K‰+h®BI¬×€¨YÓÞ‘:cKÊèBº{ÎuõCá©a¯‘jò>é;ã±ö¡Y}l0­Øj¦3Ò£¥éy ¿ ?$›«¦2&µñ ™m¨SöeFÃñ®cÐD VÉ´#5À”€Û©8Þ/}Y'ätÛõÞä Ù–áÏæ^#êIöªÀKïg÷¶à$ÆÁb4t®Ò?—$ÖÜl ¤w[x©e»¤Å ™b|÷Rì\e‡ä¥•l̪5ÔÖÑë¹\êÞúà Nç÷ŽÏ;¸’;¢”0q£Gt­Q4Õ²•aé­§þ Å ¨Ìýßq³)ÆË)‰—ÏÃUw }.!X²P'æ82>‹Aát`U8;qoæï@|} ÇZ=wÙ`²Ó”…ÿ‰~'¤0²[Q®4c¢“¸ÓßBÄFÚ8…ПÅD';¢}šLöŽáœTôˆŽ„¼êëV홬fº½c‰ýì®A,îâëXû?k‡¾Õ"QnÍÑ~Õ1!/êát,J+ØÒû£’ êmÌ."ïCª§t 5?D¤C/ÔýWPûYãè{8軨¹^ís6•}–îŒ{õ庥ô Dpv¿ö÷a€cÿÃ6»ïÝ,áoA* &)5©îy<ðCïa†‘–û³ªw¤$€™QíYFØðRÐ#])ùãÙxO/ÅÐÄ9tÓ§<Ú;ªƒK%§äs@³ïš\ƒÖÑ=b?5#¿Õ·â„L;󫱸Y ù}á<ìFÓ#’á㦠=­§®,Ï8¬úKKû™¼†×³%É8' $‹s&ÎR]jã×gTO,¸ûÀ*–”êˆI ëv‰ÅiœÌ3pÔÑãåò¼ÕÈõJ®†Ïñî¼%›vU¨‘Ph˜ÉT_=‡¥õ/—ŸYÓ‰lë?ŸPBÅßñpì£rù8DÝຂ'ÜnsÁÇÚSnþNÇtgQÇîÒäyÕ}é$ûN·he–ÑÍ9´Â7–¹‘¿9Œ¨ ¯jØÎØ¢*'0²ïïGp£ýuŸ32D þ>ˆàw'‹´òuý:ÙˆVjÌ8Ŧ­öÍËhôqíüB$Ÿ§£(L”'‡»¸{ê´— ·CÇø„Œë–uæ‚‚\`„¢õÊÄæÁÏ ’fÔñ°©6{µ~ØO}¨„ѹªÍ§€÷µ+z.L‡™NÛVÙLÇ î¾t›¹}ø™›—eÕîg£x L×#ÝÕ•ÖEVÂWÝK,—~<؇QŽäIûÌˈ~Go›Dç(ÓšØKöOëÉáæIO_Zh+Œóö/;õÛâfÍkmO0Õ%å7ç‹Mm¾êºóà^Õ­ç=%ìêûsï~Õþ‹MíuUtéÕ“ChI[/€­óâ–:Ç‹Ÿ=³W‡t%)-¾í7̤OÖ”q¸Ë¤\];q1ôúìá¹ÿi"¦Ê°øÄÈs>3ÑýÅú:Y4ƒE3Ô•b¸ØjÌ ÇadÕÛ“+>¤]"q0—Y‰q´W11H¯AÓP:.­]Ó>$R%ƒÓ”Û¡äôx?nߌ§§À6Xݤæ&°—Éîbé…lb©¥Â2Ý%ù¥.xɰô ü¢Æ²€)—O‡èœ†—Io~ɆT#!©—8µˆ†µÔb7aI°€$¤ST;YÌEœ}@k!y‰)(Sv™ŒÆp{oÞ“S1ö!?ux˜s±•r’t±”<µAM¬öK`™Ø•ÄÙcÏÎ.ÂüÂKÅžÇ ±…è:'þxèb eöÙ̳ýŠRþ_òâ08ÃåáÚJó7Nš0dÆÑm´_·l0àd®Æv‹¯pvŒD¸öñ , _´”x{Ï & tÚ£#|s_"]êþ˜¶ÔòÌú1ÄÖÿ¸åÇEçÒ<³(żCÜËV$róöñÙÔ5p¦ÌÄ$d!WŠbÎc¤6ÃéŠY§ª™>EæbÁ5 ‘Þ¸Ñ×iØTXÊF-˜Üݧçoôm6UÕNxEõõi1öoÈþ^RýŽ ®aÓßHÏÂÉŠVT{%”nôu6%–¦2vZUïà~‹˜I¿âŠmOšŠk û­a‰ø,¥l+P·5¤nÃÖ°ÿ»ý3t7Êý endstream endobj 430 0 obj << /Type /XObject /Subtype /Image /Width 129 /Height 128 /BitsPerComponent 8 /ColorSpace 418 0 R /Length 1660 /Filter /FlateDecode >> stream H‰ì—ù_UEÀm³µåðF­Ð)½9—û TTÔ1E4AACy¸‚%h …"à¥db¨)¦ER¢fšbRRZf‹íû¾ö/tÎÜ' }žï½úðùôù4ç‡{gî›å{–9s^—.Z´hÑ¢¥M.»üŠ+¯êdéÚõêk®õÐ- {ž,×uïyý žn„@t²2G@/O½ûÜÄ;Yàæ>·yèÛ/x' ™øVO·1èßÙ.F_O·tz D/tÓ@h  4€Ð@h  4€Ð@h  4€Ð@h  4€Ð@ü·o7œã ÀðaeA£i c@s¶°'°G¿ù @c¹ 9 I8£õè“·ý9sOà ÛT‚Móâ¹^³À­3sƒ“J>˜w'nj˜ `´W“óç«©hESÑœ{P–2©%LœNá&X Ón¾WN;;CBï¸3ì®ðZÀæaÓ‹Õ4tÐà!¶¿”9DÖpÞ¶„÷ Œ‚#GI[Fß=&T| Ï;·Ú€Â&:&v,¶ƒ)þ8`\Üx?ab[ûà‚È{d;™”€ª0ïFÀ!´I¢”“§´Ål’”É.§¶óÁÓhß{S§Ï Vª >ù€)S¹dšœL-Z³fÏIÆosÖ ðî6wäЈXlÎKŠOÏ`‘çοïþs3³ÀZ¸hú)ÙC».^2ýÁ‡r—f:ÑO.¹,oN;3åòüd>_ø¢wïTÇ)kEhhb.ö—ÒÜœ•ØZµZʘ‡•{&¡–S¹à­â¥rê|¹'”I3ä±5<]ଥÅÊ_Wú„…2± »O–ãa®ÀÆzØ€ÏJ÷–1Áù5ââèYYYrß¼¥ÜT>I”OÃÖm,Þ¯P½Ý½|Ü3ëW8AQ*®·ß.P —-+ Û‰ïgçð¹eÚ‚aUô=ßY#Ÿ‡hTß(ßUiþ¦…íNAa5«Å× Ü#å‹N@ÈÝu&˜{°±v/bÄE“ºbßθí% e˜“_Š4Щr,ˆ´4ˆ÷/0 šû_Þw Î&8˜¯à«á³€B"ÜD#°q¸³ha Ê÷ÉT#gr–¢b¦nÔCLNÃPô à‘Š|õè±D.^CÝÜeR®Ä|×€Ÿª(D£òDZ·AeZb²0B1ZÎ<\®Ã8N#€p?DÆêÜ܆P÷Q(,áðº”o,Åf ö&È&Ê­oŽ–ò­&rˆxjL<"7aúž)OÁÛÅïà!5¶mC¤‚ïy€ M7Á,XBíJlwcvåuõ´ÞiüxâÝÙI€¡šsÈnÄ Dë爜*'¢½Ø¶­x À}©3Ó‡Ä@v²}¶ƒp,¹×Eʽt%¡ d57l€YB ÚN¨rv=fÂ"LÜÌ“òº 5»0.>u•&%º\I®xîC*†ˆ†˜ÖS˜?èRÊÏŸ©ú-WEö<Ž£v,np¹»¸K~ny¦Éd‹ÅÚ•o¹ÚuìïÒÖ‘¬E‡Â¾˜t6´Ö]Ð,Fý†ªK5;º6¤Ž QZ[;œ’þé¢Ca#¿Ü_i¢B€[¸qÓ|ƒ)N×BäÂúƦªŠú诪k ®c:RBíeru« m¬9Œôg@Ý=\P¹iP•ÅMƒ©‹Ø>dLÕ¥†PgNE .ÔVXh9U‘æÝ&mÃÝWº–û0ÊØ®*u»ªË·`,CÝ]Hˉ;®9öAE&7l燎ȅªdÝuà§ÔEƒY%˜tU¥ŸÊÓv²¿š¶lt¦”¶À]K0n?н—ø: 0ÐÑAú;ß|ûÝ÷?üø“c@Çßþ‰8¸ãgO½²~«tÜ9,XÕ¶Ì·úüRØz{ø¥GÏ€Žã™ÑúǤ]uÿ/„]à×ß~ÿ£¹ƒµkn>ÔÜ|¾¹%¨¥¥ãïþJ˹óÍzТE‹-ÿOùk·ÑÐ* endstream endobj 431 0 obj << /Type /XObject /Subtype /Image /Width 730 /Height 743 /BitsPerComponent 8 /ColorSpace 416 0 R /Length 563807 /Filter /FlateDecode >> stream H‰ì–mlÇÇ?TªdÉÒi5Zvµ«Ý;ñ‘i¡EªPòRŠ1ØË ¡¼„&¡ -XwÅ€¨AC0ØP"E”HÒòÑD¸©1/D¢¢ ”V¨äà󽃹—ݙ鳳·çµkú¥¤TÑüõ÷è™gŸ™Û±ôüú¿eÔvFŸ)µ-FJSjÓò#jAÖ¦Ô¢Ô}Ì7 Žy@¼Œ#7ã+¦nàMmÏå{qXnùÞEÙHn8S‘Ø!Øü®Ý ñ•AÂwH2ü|‡÷%©¯xXOæË •Tô\ä­2E¯;¢¼‰{€áÃÊHZ†‹ ·×µ©[F‰MJ±”’Ñ^ðøeôæÿ®Qø1¦Ÿçû=£xã?lîþ±òH„„„„„„ž˜Fôâ9pÆ`¶ßTnálà…¿¥R,7èò†Ðÿa´¬‚K/<ïŒqž±9üäËq1–f,ümcÆ’aÚñøÇ Ü—–kÊUžºe¶mbÿV~EYc|4!!!!!!¡ÿN„z¶Eˆ3@,â˜x5Eâ<*M¨k € ‡µ ®°µ¹ËAiJIÑ L:¥ FövÁ‚Óx¯à(g³`ùˆdɰ‡m•ŽKUFÓKé÷úpâòZ}y6T¨`„„„„„„„ž” Áe‡5ò|´LlÞ‡Ë&ÃÓ%±Gá]& »˜sãÜP–²Û©ìCù›ý;ŒÉÌç_Ýîì¾xèÂ¥ß_è9Ò}ñ£s>ìºðÁgÝû;»÷užk?qjßšvìZó^[dwÛæ½í­û÷îéØÝvñüùË—zú®ô‚{/_Cpµ·’×ú®Þûç»X,Ð¥Œ1Ô¶}ìÄ“À ^±÷¨WæÔø¶?€[– =AhØE=™ñžìõh·/»&¹¡‡N¶ ¼;'m«ŸÒ»–ý·\á‹Xâ/W??pæÏ[Oºowû›[Z~Ú¶çç‘_×.lxnîüP}¸jîìYãLU‘†Š0ª„@SŒº¬5¬ª²¢ÊXA”À!Ã@€¨€XÇ’*Wj8#F²‚°†0¯w ¡éXÆ*VtMS0vcp¸¾¡~a}ý‚…+—¯Ø²ù7û::~Û±|¥ç2øÖ—7óre)cUiê åß…ã‡C ®žò… }ûíׂ¿"cC”¤ðÈ3’'öM«pãaöÚÀýî¾Þßžnß³û-Íá·ßª ‡_xõ•©ÇcHÖ4¤ÕñÀ*–0 ©#¨cˆCFP–ƒ©ÀX’Á°ÊÅ —(8c`ϺRij’©!¾¼Öê^Y‰FüvA¥<-—é0 ÞîN!†ÑÔ €$Iº Ù4̹sªW,[¾±©ig뎃~×ÝuîË7ÒÉ”U(0z¸LRŽŸÎe };õµU¸•Ï]¿ÿÌÅK퇬ÙÞºð«g.¬~iæ´gCªdÈ•Jà»uY“*`êv§ÑKK’®@—Gª < jX7°¡!Í1ÖÁ„Ưc2qÕAÈ[–ùrT‚ÉÔå†L,iºlÀ†ðf0ÊHØP]óŒê>õ³ le¨p · Ž !MQE4Xe€:†)8q)p¦ðH×´iS¿‡×®]ÛÑÑqìØ±ëׯ§R©§}_BBBBBBߘ(å&|dމc7íLKežK‹ˆ—$ÄÊ3jÊŠÄYÇXžÐ!B1f;e´ÈèÛºgoݹ{ò³®ÖC¯jÝ9ûµÚŸ¼úüô "d 9ˆUSV4` hÜ0JNûvz7’¡GC_‡/I•pú¹Œ€G ë’¢Pë°œoôR Û†ðwæÌš´¨î‡áÚ©¯-¨ ×=óæòïµ,Þ³íå1}ðýçç¼P…eÞ¨Ô®®pçéúîÎe«oßÞ¶qþ[?›¶dÁ¤Eµ“ÏŸ²¤ö{ófMŽ$…uœª«l }‚:A Â*ñ3*6124%¸äZ€‘Z`ÃWÐeÙ• Ö8©ºlΟS¿$¼¤£­ýOÇ÷]éͤÒÞuX6-Ý›Emîƒ1‹2›ùn͹QHùä÷ï›X„~yüþÜ[úE‡1ƒBS£´#súïaÐãt$‹PÀŒG6É9O)aÂñˆÄbN¡É¾ºs÷Ý[¶noxgÍìêêª)“4;6¨ª€X®«Ðee Sª„ŽÄ’¡@k–ä nêC±ŽV )Øhãdý]}iÆäú¹Ó—†g45VïÚ¶¨cgÍÑCËΞZsò“×ÏŸ_ÙßßœH7÷Dñæl¦%•lŽÇ7$“â‰ÆØ/“©H"¾iLÇû·- ÏÄXΈ%6§â[cý›W[e4Å× FàñÁ™ô–Áä·Æâ[À·ÿ±þJ 'NÖ=úò®Õ­-Õ‘_½¸lñŒºÙ“TeNPåÿã4ø28¨hAE×°TM,)à—$— @¥¡©H2ªPpÀÀ!øP²¤b ¦?¾®n~4Úøþž{º¯dRqƆ{@í!Ë*:—ë\¥Í/®‘8<©Ż}žuî·š!ãU úˆ°cy*(g gÊ2œL†±òenq;µ)± Œ¡ýåõ§3gû®í?|èíMM?®«™0u"22ІLS Ð9‘¤!ÉU]2ui¼Š¡õBi Æ2ÀI@Ó¦I¦„žÓÕy³ª–6Loj|qß®¹8ÒpæÔÊ¿^}#voS:¶95°!‹d’‘¡l$[ƸÿîÃd4dbÑì`Sêþú‰MCÉhêëµàì`ãÃD$—Ž‚3±w3€ c9›n®ŸR5$〤R³™ÙDôqõƒ±u™ôúd"’NE“‰hl 1•\ŸˆG“«Óƒï ¥&Ó±uéX#,=cgãp~8|4›Ø‰GSð(íéYu®kÕGkÚvÌnZ÷Êëõ?¨™5åY= £€"‚†Ÿ>4EÖ±¤+¨BLj,Á'(1 ¾¡‰+CªlÈÚ”àÔ†š¥m-í'ŽÒÛsž_"åLáÜ&eΓE ÿ¿C%#3¾Gÿb¿ìbå¨ 8þ`br“&›ÉÉäd&3ÙÝ›B¥• ¡¨@нb(¥­" Ûr{ÙwØÙ¬·¥ (!¶€‘M|¿µ ^Œ£iùHûíÝ9_ó±{»½wï®ÿÙ­•˜Ö·ÆæŸ&çœ=çÌ9gNòÿíðâ_Ã\¹råÊõ±ÖÊhÕÊ^¢ ÷—FQV:Ëg†+ý AK8³áÚÕe›êj³DM£0E4J‰aQ6ujЏ´‰‘ !k,ískµm_v«×<½ÿæCw½÷ölûC_²=±Ü+Ù¼ }Å[Jø ¢¤!ïˆiÜ.š××°èÔbî¦Ò‹˜#Y5â|Áš‘ô‘ãÀ˜(r”ª(µ;â•XTaô‰…ØÀD¸ ¯žß¢~ǶË(ѱ‘2-Iá‹N6Ã…ú§¢ƒ(Â9€P*+*Ü%ƒ2øN¤Ü P¦â¨É&˜*Ã*6;YL˜áÙ6c€ ß›0 Ô,˜ sb¶(\eëìIÀL èÒUT6cLdxvìØCÝ}`ÿ¦úw7ܶeÝ•Ÿ¢%‚ý,jàÌ'¶^,e Ô§–i™T£ºfRb”bPóÆ3õ‡š¿þå¯Þç]ðÇäÿËg±Ÿ»$ËËKÿ£ë™+W®\¹>&êFÈaF!g³h0,ŽFQ¿âä©7^yí©‡½có­W\±¼±Ê2t›"Ý4‹¬²I¡DiÙ°ŠºYDêh$6ÑŠÆÔgÖNmߺæ¡Ú ÏþxæåÃ÷½ÿ^£z"vET ØNÏ1æ º¾X˜=“Ôù®ӑ‡³‰h y‘ÅÈú®t‘ΩÈ,ÂV¢öD²Å—3GÉZUR¹aè0ðŸÚ­ =σG„h*å3æ…©–Â@ÀÌÎkx·oYg‚¦ŒbYŸfak̵ õW¼‡u  l8-FÃy]OÊžXœ•È à$yà$…#%Öïô£–jc*Ou¼”·úñ#vÊ÷ö˜wæ–b/ø`ÇRâ«veQÕ£N5Nê Æ]ì®ÃüNà?á}íëžÚÞlnÚ†Ït)1É%Ë ¶¡•ˆi¬ÒlÀ¡ifLb’’Mˆ>Eu _2½zÛ–­Oï?ð—?ýYr °´tæÜÍø&É•+W®\¹.–VÆ0²<£ÈéÓýão¿ó›ÃG¯º_ºa#-ÚŸ°hÁBFSÃÐ ™2課©Ùºn£l”ŠÄ0 ;mÃUô¾»®zæÉ͇}óÍ·vuX#Žæ‘þ€‡n²'QÈp_Â÷Ŭ•ˆz,œTÔ‘àbÁIX3›ýøá”Ï'lž‡#µ;uñè—ï½ó’M_\wå´^"S6H’h–¦[Ä‚±MƒRË0mËBA+¦Kå™7=þýÇÿáPûÔBv†¤N ¹råÊ•+×EÔ Y>ýÁ‰ã‡Ÿû…·cǵ׬7Ë&5 V‘^Fµb–\H-M3uZ¤¨Ú%½dÛ&æúÏ®yàþMžÞúâÑ»OŠ&¹/Äh+å-„f«qø¢9æ5¾0‹jW:²S„$a3G ‹•«¤‹Â¸êFÊ“qUȪ”UΪqTGcÆ!¡…sÙ„¬¢‚JÂk‹ª žAX÷„Ÿ€7¯'š0fN9r<«Æ7j)‡žD£‡s’{çuú·ßz¹ ð¢dZצeh¬_¨ÿ„:ÆF¹‘ ?cÖ\Bt² b)ó&ëɶŒòYgô…×M,:µ®ò¥ÈÆÆãÄ ù,Zxè áEQ‹ó L¶:Ìïu¼3§ ›mÈ1­u¥sÀ{£ Ö•nð“0ÌWÉü‡'GŽÜûÔþ›gw]·áê²EÀ"å ‡€I`–iá› ª2•/\½þÁÝs¿ÿíï@&“äÊ•+W®±†ÃÁäïêø‰Ö‰Ãá`”ýƒ]^É2cyØà¥áž2X^® &C–ÏŒb4:)Ú¯¿|ð^ãö7^fSH%“–¨a! ¨I¨id“®# ‹¦¦“O~z ýÚ–ëžyìÚW_¸ûÔ àGC±¹ˆWÈYð!Ðÿ¯Íšß¸år“šâ’N…¬EÌý/ýUǓٷþñí—W_:TyåÅ»Þ=¶+ |ïn²ÉÚ/ªJ_x]Ñâ ÞRÁ?Ù/û)Î;Ž ƒƒƒexf™af—»kmK•öšÔj½j5Æ«4JMÔ­Õ3ž{{·ÓÞín7{žö. š¶ -%Ö@þÒÆ$W*V’V!ÒÚjÁT´5˜D½›·çyffwïu_ú›ÙÓÚR…üsZ˜/Ã3ÏÎÌÎóìwßÏ“ò¬þ)+7cðŒ¾Òóþ¿=òìö-;¾ÐÚ,á&IÚä1‚¹ƒ FàŒbÉ<‡â ¿vMÇþüN½w²ìxußj ;ÎÖëSÕj-ðdÕ÷%\XT­V|ú®ÝnæÛNkÿÃä¡B… ê~”ë àû%¿Qÿçj•B©5°Äo>¨ÌÕ«³yÀ…~:T‚¤¨OOëå™óç?8rèÅî®õËD c¾YÄàƒ—1'‰H1H4‰¶‹âò±û»_>òËïœ;·ïú¸êzš£?W¦£“N2ÎGš†¤ƒŒ»÷8±°4R¦û)Mývlk\\$¢ˆ"p1Å'EPLà6t}vûæO¿»Þ±ŸùëŸ;ŸþL÷¶•gßO”Ê)ýúîi7ǬDÉUqXºT‰ªpô˜Ï Ž5àcÉ8ìEsâ ½q¸hJT+H00ÕG#S¢˜QðÇf¬»L- ni̱Ìò%š·Æ5æ$˜£éãùsgµ×^ÝÞ»çáÎQD("Â("ðØ#&Á™È7c )2^ öÀêZ¿ú§?~þÂ… ¾ÓfoÚ³6[©LÖêSµêdÃÓ•Ê<²“Üêÿ§¥}Á§U“C… *Ôý.ÃY™›ß?@ì=§jõ™ùÍh iB âVŸ™×ͳ¯I¦ú6,]¬Dy¡ˆ$‰QAŠ ŠÈaq n‘Ñ­ÑE]ßP²© ÇÇýÇÅD‘ {vÁ³òz%;W´²Ž¥2S¥f?³’Ž­ÂéÝSûÿ¦}Jq&rñ'Žïp‹$ưCbµ‰ãB”S¢tæt·91²cóJ a%Ú¼m«¬[û)Sõq¹Qjç ²ÇµÔ2Í0]cú#=é 2#õ}mÅÛzwvžÛL”ke4ú7ús¡†Fõ˜i‘䣷LUàø.f¦šµÍÁëŸô{sûÐ;íŒÆqDâp\cQNšdì#Š"Êþ,±,FåÅ‹ÛwíÚqìØ±®~ܰ_ƒ“k ‹Î#´¯†LìÑ@ë[ãss³ ý *T¨PŸ^ê}ÛiPÆ«PØ¡~*h•y Kç`êÌT.ÿùo¯Œ¼°uõêvÈG@Xv ÏV»ïq$.DýÆFJTÏ‚7Ì9À²»$eZ{(,;5õ!âäïL# ŽG2p»cf •©V"i`Ò€wÐüçb™ªçU<'÷á•䛿ٔÓ^»òs ŠÆ€@8f!ñ¢è¯ÐW“,7#ÔçëÖ­;|è'—/~¬€3kõ[°q;xT}<þ·«ÿÛÒ¡B… ê¾Uƒ1nÕæ‚2^»ÉA·E6˜åzÝ›®ž}ûw£Ý{W?ÔÑÔ¹8愘„^Ĉ—¢8& jiÅM«Âê3¼þú·ÎOYÖ(± –1à‡•õ̬cæ\+ïÙ¹"ɉ¦BPN¹ƒxhÌ¤Æ ¤j#ïüT½ç8±°4â0íù­i¢2×´íI *T¨P÷¯ümæ<ÜD(à•Z¥\«ÎÖ«ó@b›Ÿ¼õÖ¯’}›Z¥v·Ç„ÏK¼ÅHÁ(Ê! )’Тˆ| £M-ùÅK›þr¦Û;EI‡ØšeõB‰êg"Ñl£@Ì<5s~NÙ±U›¨„¦3 ˆâÙyÀ•F‚’èý÷'–F\'c™¹nŒ#¥ ó}»¿8Å^vôAÛØM¬Û(‡ÊÖAëú®+—únèfüµ²ÔI¦ÒñäËÑ µäjz‚ÒL±˜g4mŒï$æÞ2Í»úAIÆBm¢|ízÆqT—¨Ž^€Û#㺰sÔKã&¡%Ú& wzOj¨Eê3 Ð4Ÿ$Í4 ºžO°­”¡'m+ ÂHÎÔµ2K”h/óýë)pÍÀK4GIÎ2 §Oïç/¯ß±åK­8¢p¢Œ°¸‹Ç0'a$`°-]²¤w_bìíwÊæ9 ‘ÀÆÕÀÆ KWƒcíNö*T¨P÷ƒ NW«~µ®ûÊŠÌÍ•©LÜøàèÑC›ŸX¡HÍq"’Q„FÌqÂ2/Ä¢Ü×:äô¾eoÝbXyˆ!È 2¢î>BŒ¤Ç´Éb¦H5)@Èej º¬×%I—¤€Cɸ,ï‚¥ç¨>à¸8 ¹×3Ól¹÷8±°4BôLÑyn¸Kâø˜ØÜÓ³ä½w÷<ùÔNU5šõ¹˜+· £Ñ¨5 ™i6oD~‡£ÍÙzÕßi^›ïkõêÕã¿þÁà–g£\ FÄ…yN a,!Flc¢HìæõoZüö_üû_ÀJrEð/¯Ø‰{o÷÷yÜ%xæ€eª};B¼#FQT"á°„‰áÞ>ô¼aå f"³<ÃE9¬Õrâ?TV=Ù%â…|›°ö©ÏlùòƒÇ:PÛÂȾóóÏ'FþÀ¾g$A™¨’h'ÿ«Ú@’Š6½ïøém{_[}úÔÐ¥ ²IÔ±ü"õcfÿ®5Ž9왣Ž1jéñ¢7D8£I‡á=M]¥VʱJF©¾ÇÖUÓ’][µ4¹ìæm#^tÛ‰ž)˜²k%=Û§80S´òw¦²|xÉ”)IÚzæÂß¾~ø`ÏH?Fí Cg ŸNB/JH?ÐßÿûS'µ*Ì€z­î·Íf­³ZÈüf£þ1ˆr›[n“L @údjÌAÔÕÿYÎú1ëWæÙZíº$³u¿4ûE×m6µ§¾¿c°·³ƒåñH”8QäÁ7Y0>‘ÅÃ/î¾úС­»8©}̱Gm+ëYiGÏØšZ&÷Þîïó¸[1r¦1ö¥µK0b£‚$,ûFâ‘Í–oÞôÈúÞðŠщw·ºze:F‚ˆ#QŽ!Tuìþñn21ÛcWôœ®¥Ïþi[ÉJ+—¡‚ÞÄW"Epøõ}Wìq—Èþ@ùb#âx¾ÈsÙ¢–_ý"ÞÛ+D„˜„ð™3 j ­Q[Ï;D.:)RHÙ:$i–d×HW]µL³¶&»šR¡yÛ–© °º‡Níuµ W5 JÙU=S¨ :ÀI :Â6îØ––öq…*®Ü’.ÑQ¼F û'/úq÷–"-@N’PØÏ[^Œ¬ÄµaÄHŽE#å•÷ß{¿6S«Ïúù^¾^ä¯ÕŠÍfõFÀTùïéóщ(P @>‘ÊÕêíí›K¼YŸQ ×ë§Ñ¬Uæ¨e¶ü?ȧw|®+&qTïH1커‘*MZ®ºäáâx ¿=µž”KÞÔ´ ‡ŽSû+žêº©c'Wól«$±}k3¨bè#[6,î»|öXÉŒíZý=‡ºá‰'±ˆ˜yö›¦1ú•u=¢’8ô³w^òÜÌåIeqG«Äâ×Åc.Ê-Šñââùáù"æ$‘çÞ;÷"ÀÀ(>‚9[ßí™cðŠ–Z±!²æT’’לLÅN•IÂ52=T.Ê–Þ_q“æôÎZi”dªÃµªc¨.É—h¾d«þ MùNýàÿЈ¥Â0<´ìæ;ãØŠëæ¦®fÞý妡í=Ú%H ” cÁ"f±È‡8Äò˜Yº|ážÝ¯NN^Òh4®ÏQø¬ÿ©}ü$ú¢ (P »Ö¬°¼±1~áõ—P‰g Ϙօƒwu?½HÚBh„¤FÏ"ð5(âˆ0ÛÿÂgß:Ô÷¯+×K$Iô´i(ž-=c[*Øk‘æ\3Eµ8Õ‡î½Ýßçq—4R1ÓFcŽp˜_xòäfÏH— ®š)+®žuõ8û©ß Fp±mÏõ>꺪® wEZ˜¦]\$ ya&f[#àÎü¡uy1çÿ0P «VD9ìóÉ™Óý¦©äÕ¥.Ì·vv-Òéeoìëë¾ÎcEàÒÍRŠ4CuÙ6ä¹L™Nx¦J„VP ,S¶¬DÑQ¨®WG\*­l‰*¤ Cέ¼g¦-}fRü´!ª­gjæþì¿Ù/ûØ&Î;ŽOBŠdÉ’uzt:ÝéN¶#‡R Ñ¡PÒ²©)o­2^¬á=$ñì›O~9Yyƒ •Á€vÐAK«mj»©Û:ñ²nÓÖþC5UlC°JKbßËóÜ›Ä1ûÙ°nš–I¬“@Û}óÓùN¾»çñïùåù~~1xpêTÀÏq.ç0´%SZØP"–Hðø§{¬ð¡O3g²b˦E5þ*ÖWÅS·å¡X„xž¢áÈ2+žk8óÆIÛ4J“e$)Súß ¥8ñÿw]¹råêFãcãw!ú»R±X‚¶T¹(Þ)NØ.þp[ËóÞÇ ÄUšG 0”@{˜GvÛÆº7O¯¼ž&8fAßj¥ÀhLÒn›aS‰YjÜzUp"èm+‘ÊÉQG~ðvÿÇ}ÒȨ3Hšc}ˆõ0ˆþðw›FtqB— %j©mUr4ÙT÷ýàõ-U-ðÌÆ5 4XS^Q?ÇöËxN½¹¶¿¯¾3±zý×këëkªéš™\•2Ôk8’Ÿ¦XžÏ2; Ò9»ÆÃP~?Sý‹ u-6bf€"¾µ·>H bV>;GU"0Cã(ð@ÎE f"‹ãÿqk_ßÂæ¦'[·>êäºkƒßÄŽÓÓnÁý½‰éjÒ2:-e I*À'ðÇ+4›0à—ªâ”©À`@AÀ9 À(?˜€­&ÍP™xÛN™ä>Û“'ÀH2¶2W®$ß:Ó²}óRyƒ dy¡¤¡‘ÏËÒ¾ ÀDÂ{.œ{ÿNiâ«í§wW®\¹rõŸë^£WºS»R*NŒç‡?¿Þß®ª–òRÐ0Ò>Ø™9qœ÷Ã'åil˜þʱ¦7d%m [pœ‹%eª²©H$µ€CÄJÄ*–$µÜ«>x»Èã>i$¯Ä45ÍSt€}Œ©¢Æò}6Þ6¢Iy#Žs{Æ„‘•ò$½¿k1Ü#ðžo÷®TðÛˆJ­Ïp>†gأdzš¬[7TégÖã‚<ð—Ó _¾¡(ßü|.·ûó›)0ë` šA^%¿+O:ðPlÄiÿõùMóSÝÍË ¤\‘€ €ISÄên˜?Évõöod)¯@ù¬WÓGµ³Cþ“ßß`k©£ûòÇ)be0éÌ*›l-1ªÉ@ DdL \ $V¡‹)ó@´¨Cy£\„@¿¶^C‘¡D!lÈ¡*9ÑÁñCÆYIͦ Iê¤C5¢W¯EN¼²º±>¢ï£È¤«ƒL ò²øcèEusùîÀµk÷~rò.º»4âÊ•+W_Z¥É‰±JÓW¼=j?÷Ó—¶®e¯À²`7í­£òyýŒO`¦-]Ìv¦žú䲪gL+®*‘‚‘&Šä`ÉÒ`·— œˆ¦ L’!ÙNGï 21•0 p‹…£¦ヷû‡<î“FÆqÏ¥vPU5MÕ ^3×4˜'½*ð!I;º\À}Úpìåþgƒ ÏÒT_ÏBÃiÕsíþ$Q7ÁRûiïÎ-ó{z¿öä€Oþµ«òvÚ1c??»áY¾yõ£väæ È3 …¼D7ÒµÏPï¼óTK€ îïjì´q@ÈPcP‰½µ@úÏkòS³ü( ‘€<9~Ä‘wÞ ÏÐg/©·¨i³§Oki^hZ½¦š¶51¯ÆÃÝ@#¶ 4X4bëòTy¨°ŠTW„£]ád˜ž‰3ºš$zªBÅÀÆ1øŠsÄŽJGÞm3C´ Ñ{®ü)œI®\ºÀ'ÐUA† ÐÕ`ä-/‡à߸nÃÅóî2Éøí1—F\¹råêKªT‚þ®xcàjÿ®Euµ,ò0´ÇÏû® ìF@!Îrt{Û3?úñæ!Ü °¯ Û»wˆ”˶ÛVBÓ6bÐuBïi¨eê3´0€G^¿×B7 Ö`ªÐ±vÙZσ·û‡<î“FFõ8!QŒ{³Z‡A$Sm+žUãª%†HHXŠæGÚOŸZ¶áņ5«—œy}Öe#×MHòƒßHKê8?¨FÆïG5 \í€õ:qb™ŸA,â¥Öev® ñ±GÄ0A¦ú{‡×èz›¡ï»9(¯]Ï!41èݳM M `@ pp*¡\CG†¾b«ª‘/ÚúôõO7n¦;vÕmnzdàÚ>Ël½øþöélGžçf)z—šMÚ8|¨kÉÇ—_ú}‹©&mC"Z´SÒˆ¡$ µÂê0 —ªÞ®é¢aÈZNÖ•´­Eᆂ’´r’‘GLx6¥ ÷Ãä³8¬‘ž÷ÞÛ±{çâW%p ƒÊ8ÂÐsœŸ`]ž˜÷øá— ßriÄ•+W®þI“•Ÿ,Þ½+”›8 Žœ”ŠÅ»=Ýb9>úðb[ë.žXZøEQ l¸'P¡—£ãGŸ f‚äÂyüï ñÿ*°Æf‡e'´\šè²¢ì±¨¥eþ[ï7ÕTóÚyˆB‚À ÈK¬¨¡µƒ­[Zò_ÇjñŒ)‡Ðd‡¤ÀyÁ”ó$}ëºüöé•­[¨æU³önóÖ©•ª’2-pÿ‡º×Ì ½Äíï^`£ w;°JðQ5c_õ¿¸jÑÜÇ)Õr<ï¿ÚŽq € @tHUƒDµýò\ pÅ2 çsY€ -R02À 83 Éɉ¯læ|P„ÓäÄ ‹ìµµtÍLäªBŒïÒo÷r-¼µ`¤u,ZjxÔܧKÀÃ<û°ù ¢eLE¶nÉ ãfÈ!p/Q#IØfFSE‚E¬ª¥à%ŽdÇTù5¦öظmÔ‘¯&^;ÚôBC(D{ÆÇ Š$©²5ˆ¢xžÅÝ—þÊ~¹ÇHuÕqœ„d“I6™ÜÜܜܛ{3ìÁ ”Vh!K¬Xºˆ¥B)•ÇÎ.3Ã\çqgw»ZmmHmb+­®¥k£¨Ñ6é…mÁØû8û˜Yö5ëïÎDÃò•¦Ì7¿œ=;÷ÞsÏýs~¿Ïï¯Çªã#>ÜŽÂážøè”AlÔ?‚Õêäñ¼822~ãâC]uÕU×ÿG膆‡¯ü¥êsÈÄøHµǪc~´*;¯üjÿ]ËZÀK"‡„€Œ×`k4Ü–’ñ[x%OÚ¬Ë4â6Nº8ëZSÖ¤7›c‡QRM]­8ߣzÁ„ht\ÇñKk»w†,Ê!ÏfÂLTXÁÅ©«Úÿà‡ƒ}>¹Ýo]¢Ú$e[ª‹ ®µÛÖ÷«×Ò{R±ìÀàLoÿæáßnx|÷=Gÿ¼…`µlgÏœÖ6®ûŒ"4ˆ…9”°ˆˆse„"ˆ+^Øé¹1ËS£ƒÉ‹V vppë¡C["bvZÛʦ¹³â%€UX)=Dw’Á´GÓm_šÝ$5…Pð/m¤† 0óΑM’ùð¼&ÉŽޕ 8vòíï¼°Õ®ž/úÍV“hÄŽÁþdFÞ£®U¸p>ù•¥Á½]+Žiw|¤¨€­›·ŒŒe¦à-àRÒ¨ÞeÃ#dÊýLû»³3$FŒà¥üù oO$6¯œÓ̇QcX ˆ\ "EeÔ‚xñè w,<ÐwÀeî%Ö/WÇÇ/ÃêèèÈÄ¥baNꪫ®º>­‚X7>>6Qk';~ƒN¹Z…Úm¢¿ÿüÎݹ–ÖFIš.KY ‰(¼ŸS¢·ìsü¾~ùü¹.(!m¦2ÖIñVHÌJ2#ëX…ŽŸcFÎ%9ð .¥ªzvŒèí¶‘»^ã¬^9SC<ÇGãüþgfr û@Â…¹A{ )3 ®B¦΄ÅÅ¥85Rð17Áçœ8VÞ¶RžÔ‹1jƒF†ÔX”‰7?ðaþ§ûl»?r÷íòÃkn;øª:#PдEsä!ö,)Å,31d˜®ÚzÆ1s€moþi;hh–Â+î’-£›šÆ…Ža7NKíeœ×IF"J8ÂÎÉUìN§Ÿyj¹„D)Þ²þN` F7¿ðüý2?FšA˜7kÚ«¿~ˆZ;±±…é)VRôãå­€/AeÙí<.í1K›†˜fÁ?*|)¬ÌÍöQ'ëYšge§ô¿ÑU&yÇJYúfÓÚìzqÇU-œ4t­ÿ\ágϯ¿gñÌ ˆ,U$¤È²À¡[fÍÜûxï¿>8íŸÁj LªÉÉSY­ ´Õšn\¨¨«®ºêúر®ögÂçZ<„Êìï§ŽvÄ×Ërñ‚$„C(,ò¼"ðb#×" ±G½þÚFËPËvÖ*f*êÖ8Õ]R ÑfŽâ)kɛͨ¿èdËT…Žã£ZÂÅZ?výÆÏ¬m›Ù A¢a$ÌbªÆ$W3ì'ÖË4rå¿W5H÷0fÍ2MÛ8õ˜cª¸K ¡¹8ëÁÒw™ÝŒh¸”ò7Ü6Øa[*ÁšóDïöœ]zçÑ¿tüòÀê¾çÖ1½ÇÅ*¶’Éô”¤¥´çjgßïZ2?¨pr’íŸ?uRýÇÉío¿ùˆ?²õàëß’/›Í“‡¼Œ9<“ztÝB„Z•ðÓ{¿æÚ…þþÎ3İ0ñͲȇPZlœ¶§w¥Ë~Г^öìÓKøÆBìjÒ¾½Ô$cI«Ø>Ä2ð9“tá‘d…¦l£Ó1“¶ž˜Ê?bIú:ì%m’Â¥,Ј‹S@>”Æ»ðò‹kC|H ú ,yÀ’{ïæ‹Å.buwÇÂ,Š‚¼æ¾VB7W […[[‚ ¢‚pìH¦TTÿø‡ÕQ^æ£M­áófæè±íKæ¶.žþÉsËÏ~˜qa…»‰’)Øwàa¾ˆuÃ$™žaFÎ15à"¦«@\®¥–q>äK0‰yàxP˜Ì5a¨MžÞë¿ »ë½÷sßbñ’Hä¦GÌ!ªð¬‚pDzðµ¯:<622I#—u£ãD]uÕU×Ç­ŠŒCì;ðó¾;ÌWDòš$ h("%…£(°ze¨ïÅuE#Nˆu.…ÄÁRŽAÍ!·LT¨p!û@2bF–*Á*£7>!VfÉ]´»Ìb‡ë¦IfÜ'ºëõ 3·æ«³dQ渠 ÚNš˜ j¤€¯nWÈe»Öø$£Á²BÂõHÁ±òÌЈž£f§mÁ6Äò¯Â=ÌÆPËn’>¬ÚFà¤LòÜ¡NpÌ‚gõºV¨£âf¡%¥4€ èÏw:T%V»Ë’Dïé{yíÜÙÓ[”°ÌÉMè³ xfßf§wí\ ‚„Æù³ù'²ý{ö=¹&$.4f##;(Ž>µ© 5D,ɼ–^xælþô©mÄ,;ñî‰ö¥‹›e¹Aà‘,ùF¥YæV,_yiìj×| Óµ9¨.QÁ“ÌKÚÆ”tǬ8¸ns¬³_î1nuT©ÒI–¬Õj5ÚÕ®lŸ|ò Dy BÛ´*BÉ£äAI[¸$Çù{åÅ­å»KBò†)¥R(B‚¨„„ª$HQBZ$ª’VÐ AI®wöîìÿǵ‘ª‡+œ¦Eé*tDÇ„$,ôˆ˜”˜Ä3=œó° ®åî9|Rï¡n¤<ô«£ïÚ7®ï9sfæöÝz?xû‰¯wÇõ¸"«ób]Ã7Ì&Ýë»û¨gß¶áš8ÄÅô£hDà¥cf„~ZÀ¤nµzÊ€Ü-¥„¤ Ïb°×ÛôK ZñÜRkÍÃ3èdÆißÏRšƒ£÷r˜  ‚ñ,F-ÎMâ¤ÇxÁ<­¯É³¤ÞÓdŠsbº—NW€p êßÒî‚ïÚ `'X'«ÔqOÀm^Û:ýx_ˆ‹ÕòRU!%®Eµ•ˆҡËúóÇžäl ÀÅ+oíxýBqÓºEŠ~Ÿ.¥:•޳¿éaµjÂ¥.ëRèܘ=uú±/lÜñíׯ÷Sš¾¾ûøµÛ7uoYïÛžzùŵ׮V±ánßÑE¸ ëÚÀIJ.n)Ä6õ«N½@H‘Ñ<8¡A­›~‰Õ2¡3@k…€™Œ÷b¿ÿ¯—û8øÄ¢¤×c³@4¢k:’•ÔÂÏ>|x||€äƒ°2iIÛÚÖ¶O²AùôÞÔÔT«zšÍWâ¾§g&oMÍ>LOÞš™¹ÉùèÁƒƒ‰n i‚2SQcŠf§"­|`þ/^\qõJ,uLP:£kqQçÞ{eÿ8 Bm䩆_`8Ýð7hÕ-ƒ¼ ñ- 0Ƭ–’§%¦‰yÚÒMÏ-bšwq®Iö0džP§fqZ`"Nlîõ4H!ð*‹âñ˜ôÈ«¯>}îÜÖ×_{Ô–9îV`w¤^ãU\Ë5XvŒ"ŠKZöÜuíX[¬^hR˜eCó;àU2Va´Àýf—ë¤DgA… t·c/ç¼`3ôÌÀË…4 W ÿ¦oãaûêÛöϺêØþoýù¹­$•û)±7.e O_º¸û[¯Xóåä;ÿ 3éâW‘ÕQdûÚG½áÝ jŸ~ePwéËDB¿âXc¬ ¸p1³¨ 0`ž†À?)¢ÅŒøò%Ñ˯ „x‹Ow1§¿éíçN>àѼÔtʰxŸäZ+,À^àºý Vr]+ðˤn6©MëyŸ˜ž— .wËÌ)¶n”ØÜÀ‘k™Ÿݰú‹†• Š¢kª®jÉÝIý衵áQáÓ“¿$³á<55)ž[‘>ûS÷8 µ­mmkÛÌl.ú tj=LMOMML4ff k‰ò rZ®?«#]\]`h†¦D’:T™ê—–è'_ÚäÒªsÃnÒ½>¶![‚̪À=dž«áʸ_õFª §>)ir ÄÔDô¿?”…>’<­gCZl PÎÃyÐßµ|š xzÄ\ñ†wŠ,bÛ©÷o|<ÞÖ¤ûÏžÛ~·Ö̳ncÊââT£S‘%inRM)švÛ†dYEŽ^WcH†)0 $%‘žQ7Ò“Šš¤…šJ] ŠÁ`ùÂmíšä¶­ÉÁ‡\ýÒ‰ çÎ>uùrm´@™ÉxŸGzˆ»s¬a\oPAY ºf+å81C’ãNÚ÷ú™“¥5øiƒó›L0Ðw†¼Ÿ{û8¢¸Òð†B<àŠï‚âZ((Z€Óã~‰;%€d×ÉLL WÞüËNy\ d˜Þ™0¢‘.Up¹V*®zøÑ…†7”H滩1RmÒj®o¹Ž 5*W+âºÝ`iêÿõŒ×QTC*ZCz)uñʼn؛ŠM8D„ÃXháš)ΚYâ&8âb@Œ:PS–‘ôx×i؃{ÙP`UhœÔݺ˜ ÛKS€â  ¤„~Z­•_>¹á‘ÝFÔˆ‰2A‚U¨(ŠdXXgÞÌ^ýÏßgf&DY!BýýÀŸ÷™V·i¤mmkÛ=7ÈE³Ù¨U1µ|B5=3qkâÆð¿ Ŭ")ª‡ä†dÅ%Š ¸"o^ŸúýoŸ©;6e”¥M6ÀÝ’¨é‚"ä[ȱÿe¿üc›8Ï8>)R¤H–N§W§Óîä³'…Péªý€®kG66:Ú´Y%…ĉ[Žmy4X·²NE“¨ªµ¨ªö«´š:~ÿêZ(•:íŸ1º‰ª[ˆí»{ïî=Ÿí„@ñ¾l¡ý¢øÕ«Øyõ&öóÜó¾ŸÏS Ø{í wmjhN}QÇa̬3t4ð13[sÑÉfœrÄ=ae ,Œ¥ÎRÀ¨[Ö=3=ëìR –R¡Éª“rá¿&¡Š•²Ý!׊3#ï±t_Ïý /EDéÀOܱÌôÓ½š’¢N|ô¾6©­e>ß&ä¶S%œÌ‡T ‹œÌ%*I!D /«"/òD&¼ÄEP•áÛ4Eˆ‰SÚ¥hTb’$V”®NíÉÇJ .Û3ñƒ×_ëûðäóÿ¼rŒl¥=spÖIT Ý/&}kŒ•Sž‘œs³³4[7³W¬B­˜wËÙŠ…<ã)Ä=ºÕ1]# *TG};ý?†ø6†iq¹õYÒees«è&ö»:À(¥.ý}b<½"*´ªÅ‚i+œÚ¡´y¯ïŠ7i\]ÜÁK"ø®9µ¾d¦k³ë¤÷¿Ò§" ’øà}܉£ý¨‡_Ê$G—HDV‰´qýÃtjdÎÏÃ^Þùíº7¬´íÓæ›Îé8/ɺãÊÛSôr¾Æ`&IfÜŠÚ·²n9‡ŽÕ¼ àO¼ ð< ’c˜]˜W(›‰wÞíýQÏ킦EC½ðŒª©Hš®ëŸÿëâ ÆM!¹qÞƒäêÕ¹¦4Gs4Ç—kàzºz5¸¬®7>Ÿú,µ-+’¨HYâ1$ð¤]ꊉâÚÞyG¯3Œ”MsŽU°ŒT…ÅCÇUÉÀ7嘣ÐP\¾çÚp·&ÄÃŽ[¥ZeLDëuÏ8xauÈÀ´JPŽ<!iNIŸõò3ËÊiX£Ã®1^µ&Y9a«v çÐA·–)—Ç³ÝøîÝOÉW´ŸN.»Sߟ©µO>¤òaQ Edîw…È/«ÛÈþañ¶sý÷ä5ÝÒ3Ýr_wø‡Kµ¯Å„(ᢼä0GTµ‚^–EM4…ÄxE—d^‚‡ˆ‹¦>*QAÖx©3P-B”(dGä°-Ö.u/[´aÃ’=»¾ÿöÖ|ôñfÇɹv†šˆihIÍLaV1ßÎ fŒUì «9zÍI0:Š"„À1‘óJ`&©ÙJîWg…€æ¶Îà„vÎ1_À~XA­²«Z·Œñ³ïoÛ‘ûn_º¡·cÓêozwġ٪=nNÇ¡d"éTÄè·ž†TÔý‰²Ùß¿~±"Š0ݵ†|–¤¥8žŠÖ6âÌJŠ<Ž<5 ÔJ8NÂcæLk˜™q¨‚_ËVXƒGüõ’ÀÍ—ˆ¶0ÆíÈ®8}lµËôÕO,ðEA>~hì¨ZÌV¬Q×Þ'ðmj¸“ˆ¡ª3l•ôsçF$>–•®Îöõ«ÑHÛÑÖÝK/]¨Í¤(²¡ºŸÆÙÁ·…TiÎ.mbÖàœ¿{곬aTÝ Îä„áZ¹@tQf U̬8‰X`¶”VýŒMõ£Ç׬Z¡iDVyAäZeA‘Zˆ"^zñgF©Ü¸á 7Udnîʽ¼}š£9š£9k×®/7<Ķè/~þÒÂû»žÀEÂhsy^æø ­é]pä½~êæÁVZÂÝ^«Œá>§E´oiÏÒ]vëgªÆ²à.al¸çÚp—æÅdV-׿«­ñ‹k•2œ„êàzX$ »¹Ù.'«vÄ¡Æ&ϦæsvRs»M ÔËO•Ÿ«Ö¾£EÝuGËå?É<ÓZb¢(µ ]ªðTÏc¢ÀÉ<÷lï²;‚_ûx—(‚PRÏ7Ž«l 5à·'¸ÿ¾á§Iã”Ð8.5N¨“bãß8‚u‹¬¿uÒ8jü’Ãá×úÕ‹û„¿¼¨þ~Û3"õ¶ö}«uI{ËB%BŠ"q¡‘¢DŒ rLÖe ňÜ%q ) iDR×U¹žßÈ-}ýµ¾óç·MOow¼qÇÉYF ~BÙVË ö‹nA•¢2I°ó¨Æ¿`u0½x ߨ:A­Âg°âÐ-7áXùâeÝ÷õš÷¢éô[¥BëÆæc‡ÎkQ•Vha.dMç™]ݼTâ”°"½¼÷1ÇÌÍþ‡ý2âºãx$$K+­4žžÞèvײ± ¡N8 N(TΚr˜#ˆ{×µ‡ÝxnmlLŽr$MªŠªŠ¨¨RPƒD ¾ ©J!4ŠZ®ûرq0öN³HüST©J"WÕþô“öÍì›§wý~ßÏ/›PÕÈÉîu”Nºz¼[™¤­ÿ< )°¬B(ÁìdÄó¬¿\àW-ÊZ§éÄåLZ¹“†Ówìˆ|3ìèQǪƒûóÙ­?‰=·³sÙß/o6Ût ðCÔ=”mÍê'õVtÄJç°p H.¸¢ˆ¶ì:¾aíóÏ”ØRˆp„)" ™RVñö¾ýYËÎß¿?:ÑI¨`+XÁò–sG¿º·w÷žŠÉe4Ÿ¬BCŠSRJé‹ÕS»On´³qU­‡ÚÍÑ L‹[Mêízȇ#v›r»Ù±Dh?p¯P•=1䨰šplø–¼§ åŠBìä ÁwõZãÍ[u†Ñl« -€%°|(f¡€½kvܸ½?ü GØ1Ý“Œm—/µÿú—5««ÉêUBõJ|øðéNÛ‘¶¨”I¦SUös S‚i GJ ŠY!€ÈÜißÔüAïÖ/«d)O( ÞƒŠ~` hpöäõyà€$§Y6ÌìQJç1I?ïö·{=Ð?߆ÏAÛïž"n7rÏÜ~a¤»øËƒèÂüáVb=Ù´”Y4¥¨’øxH' <&~c„¼@96FÆ€/TÀ%H@þгbqq26ÿwï¿rfPTÕCo5͸mƒ ŠˆY5fËq8ït´4°‡%'îe[-9j)ͦœò.­6Z 4è0dtÂÁeUÑÔZAÓ59ö6#~õš¸sžh.1¤ˆþ`@,‹fO™¹£}Ñ™³5Gެ]°0 P ±ÓX;ÛÒê¤û·X r ‘'»?Šm΃C¾’z]üñô–ÍúitñÅK[LS„)ydkÔÊ™Xcítâ,ˆýïí™+ßHèfMÀÝ8¬âËÒšàÑPëm½9w€%)¸x«@–¬EmG<Ñõòª%e!ÄÁ8Ph@€…Çrïïì?`f.—›èT°‚¬`î‘>øîsó }€"<‚Ê”Øâ-âã?Õ)FܲšÕ;(0RzbØHC>ÏzXÒªK-޳Íä@[M:º—FêÍCnžplø–ü³Ëáie¬À–̯PÍvÝNiFÄ4Zò›[‘6åÖ‹Ÿmþð÷ vo/VntØrÂÑA/Ý]ž™1‰²>ÂxÂlP`±X_ÒcgÃׯí,|<¤˜ß°¾²§g]׉¯¬/¨§Ë%c4¢&_[>ÓOY6àÃè‚ñ€áTÐíCöAÆíg=éÃlÀ›~Î{3H<êÞ`ܳœ7N¯ßDἑÛ͸ðžõè>t‡¡ÿ'ð-LWNçÇ@£}äÊatj}¯'—3 æ”ã"¿ æxÀÌÌ`ìǰ{!Ž ð ³ìO£Y¥tÍÒÊÝÛVôžÜ|ëzÌÑ[€»L) ª­fl]„ëšUã¦6∵é2@¾S¦Ô’Õšm£ÞÑcŠ³í´¦5B·y»%§ 3𱓥MÓÂpÊYk‹šik¬›ä‹[ä!LTŒ&˜­ ±W?O;VìÀî¥e´qܬ§XIëÔÕÄ!"ˆRÊ,\ÎSøäÓ³5YmŸ.µézØ2:¸˜Â˜ðû›Ó,é- "Ú¬ë‚ Ïš1 .íNlHßáèm†p3ääW†hI@bi=“Ò´„ewœø¨nÍÊrˆnØ4Âa˜d€ ,ÃÌ=çèÑ£œƒ V°‚ýßÙýññq×}èÝ1×͹¹ñQ77–»Ÿo]8ß?ûéJJ9‚XIJ €<Ô¡˜]½bѹ祛"0†ùYO@Šóê,Ï'ž¾Ž[ªŒùÜÅ!3¡K¢¥¶ ÛiÇ{Ó`Ë­¶Ò šeªùlßlšØËÜ*¦K [Ý¥êaÓLB’ÿâÊËÝýÕ»ÚhŽVÔȹ³ñƒ¿­NÅ«jªç— ¦Ób(C‘ïxÏC  jâü…fı„pS˸m˾»¤´PàQðÇ^’Ô-]G7ÊóÌŠù¥¶™¶´ˆc4ò¶,œÌúYä¾øë&Ãl€éYJ ŽÃÒšò2ú_‰/®œ à›zÊÛuég¶ @žòFáý°ÙšùgâݽS¦NöcF`‚SÈŒÃ-~–û¤/  )éy³)âü®µÐƼòy“À–óϰë^šš¿?« œª€e ‹a†uì´d¤OŸÙôÆÆé-›Ÿ’®C06Ãô,# Ð ×ÚY5i) €dþ2ˆºÔd*±ü }îwÕÖ¬®6ÈQJ†Ûˆ½úãés.œÿÔÍåò™ÁËð3î:^#o¹¼=L,+XÁ öŸmüß|,—ƒ¬2zoÔƒ’܈ëÞ½|é/×½Êð!‚9 ù¼\ø*Bß« vu½~SEFì6(A‹ó"õ£h*â„ãÄ×t€ p 5Ó 4’Õ½ÕéRÔ”Z†­&KŽZrÊë•¯Ö Zofb÷ìõvÀÌ[>°Zg)­÷Fb_^{íø±7÷½µöÐoVÀ_§7†8&„AV˜RêÇ~–°“¶LÀ¾}V¢¦$"µUE„>ÖwA”µMÞñ‡ck(á|µæIUïéœ÷/öË56ŠëŠãH–,­´Òht5ºšÑíìÊ»®qSJP B åÑàòpR 0^[Þ•·ëÝÕb\p &Ð’ ´• i‹Bó0 ¢Q;6 Ò‚D¢&‚ò0öî¼îÌìÃ6öô̺¥ùBT‰¨Ö®V+í™=çþÿ¿ãXÄTíO<ò6ûþþX5/s-­`+.C|#*ñbž°f‘c²„0„¸ÁE$Gª+·,xýèš›W·šr#þ4öè©HFMòn€ Mib¡FxÀRàCßáï¢ ô}' =à+\`ZZ û«ƒ$×oìyùå•¿hŸ¿oïâ×NÔ~ôa³•mÕg{zê$À&†}ôÛ3¯œÈjоöøð‰-ùéº*UÙ¯¦Ÿ:YÔJxRÆ òpÇXæ œnlÛU}þR}:Õ™Õc@GÙ\SZn4µNšNŽ˜QKfºïÐ5 3$”ç¾+ó㭿>½z©»ˆ°—ð<'Š¢KÀè©•þ~ñª"wF ‹=1«‹ƒ"SòГñ‰"£Åø_cäk‡;¶1aŠ ÝJ'ãQ„\ˆE\ [›q æðøýfSïÒÍæÜÈNaÐ4C‰‚N ˜øljûL=+õÔ˜;O5fÈy1’êp#0XVßkȉ 3¡ÞJZ™¨i$å¡¶QÚe©uÊ`øwÖ‹,ö0↙fXW:½¨ÔÇ–Ï›C–ÿèáí Ë<¢Äs¬ˆgtŸÜ@•:“Ægû}ù0vïýåʯÀ5O|×ǹx¦Ô‡ª*ˆ *áWŽ­!¬›xJV- º[Wê 5¨·íØô˜ˆÜ"ï:ýêVª&©„w1 +Ç1³zË´¥‘^Ö©ê]Æ~u²ŒÝã¶üvgŸcì ¬ö6wþ7âá ¸ýI6à«”x¯Èy"`µ¼‚ qèaŽ)ç¡ ‹Þƒ=áßÕöxwwÍ—ƒÏéz³¥‡3Z8o8C®«Q% °±Ô0`^Fmµ”(LиÔÍÒÖÂuˆ)CêVb0Õlåg"šÚbÐ5Õ³ÂMõs=ˆ—ª¯† e‘!=ø­ÊуE¾ätw­. yõµåa0"+VeóñÔPË©îMTâJ·=¢z›a$ÒrrXŽQ« †A¥é:‹†3†ST8ugÕ¬ ÷œ‡Lf«’ޤÕÄñã+ÏQ)ןcæ0xÂãh4:øÅ è€ɱ±)%¹sg|rÒá±ÿhK1ŠQŒb|C|m‘™ø/“Ø£ºE}ðHE`b8‰ˆ"Û˜‘Xå/=òÂ’´’©ÔRMŽ€C:{®ÈT>pœ¸ÿœ2Ø(á¥àw´= z¦£ÓzÃl¿6iÂß·šÓž\XÅ»Èìr×WkèÁQcßWB~> 2eå+§›(mê=S÷ùÍ L[?jûÁ FaùºÖééö#ž¦ÔÏÏØ@Àãñ .[ôsÄÇ1O¯¬ÙòŒ÷Ög±kÿŒù0ƒ /sìèZYÛcZÿjQ_Ê»%0Ù»–g}#T(>gÔDÎM[àì³Øî‡vŠìƒ§`÷ öYÀ·Ýï¶Ï±ödŸ‡/ðöà÷­ãLïn®£†]QÎÌä8‰“0’8Ì#$bàù I"â}–ÈúÉŠY/v-¿Ô¿Yù²iT‹æÔdNë é„©ÄsF,k¶P¥Q‡{¡Æ²p`#UšÁúÔÒcÀ·àþTIz‚j­0QΕђFª-#w†w.™)AÓÙ¼¿sÔèL¥êŽýi#â½ r-šçÓS‰Œœ„_Ù²ñ;<ïÂȳ+´@Õd-^ûÔ\?Ï{Ü{¢K³zòúµd¸Yº|¥A6ÂÔÜ›L/eõ¥‡ Õ˜CŽÁ7Ì{ÒHކõt`Tkq ¨£¿]ý½ñbÁ¼Db=¥²bÖ¡C‡hF)ääØW·§”˜äÁèZ1ŠQŒÿø«ããÎ^XrâÏo=Zý8!ö ìv•wWç¢O®ï¦4¡(õ°Êåõø¨Ñf AÇ@»¦Pô ä×Ò"…|ð8q_©‚S$ÀÇ Xëm¼€$%oÊå›eµ>-7éJÇ©7Ö>¿ïû/>¿êÓ/"'OþLäÝ—BÀÒü„9ùæzšÚ¡iÑ ë%ØÃ¢Ë ‚¿+jȤ›-õ@CÝ\‘%¶ÖVŠl7•d&_¶Áç^¬_;÷ø‰%ïõ?wãf䃮ßlµrÊðSi_·ºsH༄ç|WF ¶V–ó år··,Ì™ûu¹:¬¨ GŒ4´©yÚÒHPG!ûY{ ç}Ù}œC&‚Ýï±{±Ý•³NìxƾÈM\ÀÊii KxiãŒÕs¤GD¶œeÿD„Ápyxy ÂaAÄÈëa¥ùUàÖǺ_Yÿù8¥1UmÕ”V RËHÂE€!¡2¸?à+ð†ónGÈ1w>Œ˜ðÔ#9 ¦ÏÓdFM¦ÒÉa9öæ_Öš´ÁR‚¦¬Yµe+y,ìo_“ÕZnëÉkþÜˉë‚–úQ“,·œ¿¸à˜Ÿ™"{åòM è¨ñr3׸mÉ™ž ºÏ»©º3o&€…HrFTwp: —4ó tª¡°œÞó“Ñ#mSRÉÏn6w´/(P"a°Dâ½B0ìóæÍë~ý‰ññ3‰mß¾í0ÉݧÅ(F1îw9DcrròÒ¥KµµµDð`䘬Š"+øWãöê«—ÛM3¤*!ðhØ-%j©a:Ü”wÄ6ò b O._8OÅÎI‡Iô˜šg‰äM0šð¿Ø/óØ(î+Ž#!YZi¥Ñh4úiF3šÝÕÚŽjHK 8 Vâ$&ÔP»¸â$„ƒ÷èzÙÍÃjmŒº)4MD*Â%µ‰*õ9€ø‚ÜBTš¶‚cïÎõ›c½6‡ñôÍRÔþƒÚþQŸžvóÛߎ~×{ßÏÓÍŸüñdàÝ÷êΟ}£áéY Ë”ŸöUø˜š^žqUø(ŽáXÚÃÐ|íþkfÈ´’+šAÐ]I½»oV2ªÕ´ÐÏ·7WRú(rÉSžË—€vÚ‹jP‘’†ßÞSϹi¹—<ôŅĈ"ž:ÓÒP_ýèæ»Z %JôÊWbÝÂjŠžÉ"V`y’pù„»v…|ŒËÇR/7»F‡cã…ø˜.Â@Œ®šZ.tßÒLiœ¶‘ƒ½ŒÝÇ:>Pš-@È'¤}„°{Içñhi00   ` ô÷ߦ—£þ 1ðÙ½Žª¯¡}, ÈÇ À„ (q+P'N¸xε²qÖΟ-ÿóé×rr\Åmжk1;Z_âÀ8DÄ­¸€¶ZÐP‚-f©1e$çÄhà @B.€‹¥tA œû¼ÕC–ñ,òpîÓ'7•PÑX»ms"=^5-©Â¹¶B1 <áåI×pkµ…·ZFfã†g}´ûÎÃîrƽr¹÷ÃVjz·ôUfÂ,i·ô8Î' Z×PïH§cªh)Iœéy ¦Œ!§´|Ä4#ŠžúË™D{ ÆC•y(A UÔ³% ‰b9RÂu`xq Ç )BïH¼’·JG£Eõ\ÂÄM›zÆÒ× Ÿíz{çñµ00ÕP£óæ «dȲ÷ö6]W·œ9à(‹ÊYÒ}äÈ ]ÍJ¹(VÓ¹‘ÎlêéoUyIBi_ÏÔÎþäw/šr–ÚM- q ïF2¹ãýW’ÚhPº„H‡ûóYKæFƒº¶éÐk›Ê+x‚!Ü"ΈؘN›ºáÐÈÔÝNqÓ6mÓv/ØÔÍ›·2ÆžwvWUÎB4âXŽy%xž¢ŸOïÝÝ$«ºÚ Tx\‹R†!Â#ä=]±&B²ÕåÑ8h÷øÿ®zÿo®Kâß>yèØ²üpdLAM`ÕàÛzžçi’!¼,"çÏ'w¼µbÕ+Õˆ¢x†ô#÷¡ ™RêûÍó8ª Qå¿ÞÝ„p࣎ƒÖ¿t‘Gɧ‡/‡Ë«I’ð"’õ•GÂëëëj«€LxÒÓºjžª‹y-pùrWÓó³ýœ[ } (ˆ¤¾ñ ñÆ› š0r¡r¶(mÁ¸]Sãr.E«E]ê0¥d1·y<ŸV¥Œ¢®3qÐÑÑ 5•”)'î[è¿í}äm®º(aÉñÏ_Nú(ûÐ rá§£îÒhÓöaÁîgK B:ÃàÍ€7Дþë~jJhY„*)Œäüb(ŠC<¸—b}´»®Æ“þaÃÉOW8¡„ 5Šh*Y8‚"•\´€“À*š’P¤¸®‰¹î‚U”.Em7¥Î±\vBMèrÐÐ;ñhtB<°š"BÕ³Ë邼e\ŽìøÑ|šD,Ã5-]`™2nÑq‡¡FòÒj},ýñáØ#sÊyZà‡Hæ§›k´‘n'NqÐù”ÓZ>nâØiD 8“W²Néá TælæÅkVV¤i!Iɼÿ«WkçÂÂ+8A@Qùdßž½ö”cw;ÏMÛ´MÛ]°© ÿÉÉ·z€7nõÝœº:eÝ´‹“öÄM{Ò¶¯?ñÌ¢ÅKŰˆãY/M²<í(ïw*±Þ¥qMÎBâ‚2ê®ãÁéx4^ÄYKÞd©]†Ö¡(q ÇT-bé]Zc©¥üofNnûl¨Õ”¢‡ 9eIÝúHÒæ:{Nܶ­á›5~„/]ÁSÄK/ÕY]Û/ïï[äŸõs7Øÿ‚œé8»ð¡Y‹y’í?ÔŠó1(?·w7òŽT”Úl¾¸Þ›ËV2ÂLYÞ|Mmc€ÿ†§8†æ¢ÂËpu fH—ß,ݲ€¹ÿ{à—{–ìèzîÃßÖ^:×ZÔAÄÒqõµƒ¬|ÝûyÏÐÈ×íƒNúh±òý;¼±åîÚY3 x ;ãP lâ´ œŠäç×ø£ÉÇúޝ–èþ„"^ËuÒ5Q•Ä‚™-h#Ÿœ3XíT•Œ®f€L¼WÛ 8b)A-ß¡*í–Õ>|1ýöëK/,Û¸¡.öùK©9•UpqDì{§›á¼”½0œØ¹ÿ…õ¡'ý>Ž¡|À!r34Yå¯T/¦ ¹U͇L+¡iq]JAYQÉ*Rr âE(Wãz¢ …q.UÄ)Km5åø Ó?Ø/»Ø(®+ŽçÉÒJ#­F£ÑÕŒîh?äÅà¨8»„‚ Ò¦!.ÅÔØ^{»“õîvµÆCiš&ŠÔ$M¢R(„´¥-uÆÈCdŠÔÄ öî|ß™Ù]ü¹žž±Ý”¼ñ@­öìÑèîµguï̹ÿóû«áœ‘°”¦”¶U1X®F ¹¶@¤¦Ù~årýovU¯ÜÏÓ¢Y º¦†§V<ºäü§_‚þ‹® ;“S9#IßˆÕøøØ¬xçe³¥(ÅwÓøáÜtƧ'''aÞUWÆâ„›9kt{K+æ¡"D#?8º 3žY>̳åˆõøXê·×Kr ÑÒÐûL%r×1ãsØ×lÈ6i7Ôv¢ˆ6éR³ ¥9%Uл?ûlcÍbn¶P¹ùÇÕ¶µMRê ¹´šm/ä@–¯|•zrU¹À”A‹ pÌ,ÎÏyiÄЋÐçÎ× {³ÙH¦xš °þ3ŸÔJÌìöÆEÐŒ|,ÿ«®•9«M—ÚþòáÏgá æqÍÂªÌ ¨}deu%FUàOö4OèâSëŠózfû„åK+›—¾öÚšã=›”Lª`w]k±­YjUe”¡tiñ†é¢ˆš‰šj \ê´]-ÑÈÊ“¼s’s°÷Ó'\ñ㔯ÿ]á·užU!jí÷³—LDŠ'À  #Ìfqu——œ;·MR; 9ah„DtÒ,)[eµÁÎGUµE'[L+lÑR¦’4帥0$,à¡E’uLÁKÙ«ÝׯĈ!|oëñbohy5¯]’Yó0Ôª7€) è Ïúè²çy®vþÑÃOçôpNgb…Ÿña†Y¶\ؽ÷ñ¯¯¦u#¢)q8£VšdE[é±R†ÚdHÉœÞÐ2œKf¯7çI’È-¦ö‘"9WÚ¡M% ÌlÛÆ/Ù¿½~Ó}å<‡(#Ñ~Œ‚Qbôy˲œiOTt&§óÛ¾ bllôÎJf)JQŠÛÅâÄ·-ÆÈøøðŒ]krôǪ*« QBgß$ /ïõ>´°ªçÏ;wt…Ãbä  àòñÕ« Cn/)Sßu̸Å4¤XÁLN™»(˜8ȼ›™'q"5)Ùß_´Áx}~ޏœ¼6Øuø½FËj#z“&§²ú>?ÃcÄÏ ¡Î_Ö$ÚVÿ Š“É1eϬ›« …‚¸nå\ãhß»û±ô=Я÷¿óÃ0çjõýšÑž×"»ƒ,ËQ(Àx/^hÊçÂÛ·Í÷ñ6Ô«{WæӇ߯ãw+?:^74¸Ó0_ FJ׆/äÚ4) ˜Q°RÊP»¥EsfÔ4š-5 }ŠÈÀWàUFˆ%·ŸK42“}”›½´s‚qzç#Ú÷ÁÕë|âuβ×à}¾v13Ÿçƒ´ñÐ’yDc?¸W˜`øÃüpAÕ+{—ô.ªÙ4¼Ð¼‘„r…'¬“0”+$`?‘ÛMÆIH"' QÀ²hÑ‚µŒˆ.·ž>¾åéµÁª jwwµJbö­›- ÅA…8fÝc³ºSÕ}oÐwÛj Žá‚ÿã‘͘b‚8„1Ã2xÖ½÷ô}¼ÕÐá˜$l5ðc뢢4õÛÜ%É­†Ñª*‘a+Ó“F6VÐQDwÙÙ”à1Ü›É4“ëjÀéøßj—-äƒl û¦) káPeeèýCûAˆ&&F@FÁM‘ÉøøØ´HMKÖÍNª¥(Åÿh„|ã2&gÂ=àS“…‚³Wj7> *X‹Äc?BsCüÞÖg3»ˆº*.\ì ð!ášßÝõø²¤sĸí]ï»Jðk®»ÔÀÁ‡ˆ–$šRÌVâj&–3ÂyÒª);–×Ì‚½cÌ/[~öž TÞÿE›¦Å?? ²0cÁì¿ û§rzúÌ™Í>†XåÏ­—3á_ïz"Èû×Ü0ÛPS&é¸ðEC³¡=Ž–µ8L*rdzkjæ`ì§ËŽùpÅÉã[>8úÓ ýÏ«rl˜„á.)Ûfª€pÕ¥¨ž‰ h@°…øT÷‰Ax(C‘)‡?Á<ÌXš·Àî-ÑÈÊSÈ9źïc§9'Óƒœ>Î| Ï„rÎ1g½ýøƒ)¼b®¯ 3~–£iŽA> *„2ñ–#jmµÿÐï7ª—ã£fÌVESNÝÐÓ¦Ôa©ñ+oYÍDTàÃ+&±µ)PÛ•Ì6(ŒéÌëQ]ÿtìÉk° />ô}8ĵ´§3±¦ÿâvËÝJ`È´ltLï$YÑÈÆÏœ¨øç/Ž~°¡f>Ò¾yAÏÅþFƒl#zXÓšÞxñbËüçí·6(FÚÎ'ä¬<µÈטh.‡äàdé5 %š€É[1Kn×3",Ò4S{vÝ_¢ nÉ0˜‡uQÏl\÷Õ׊ÎHѹ‰C&KRŠRüŸÅÍò߯Egêà¼üR7ϲ ‹˜f<ò±OÓ7Ì»t©Ã´[ Ò ~Ç”Å7÷­æ½X;?ô_ä½ÔßjªK¾û˜q‹ Ê r b®\åõÔh®ÃÔ¶‚8ƒ»øGÃÁ·~öÈüšÆxIp°Ï¯n0¬ðžÎÇýŒ‡§;_\ ½þ† ?Ødhý¦¥<õ`/Ûÿf-@Noo­×SæÃhÅâ E ƒÃ#Zð@F(Ȳ½=uºSyèÀÚ=é%§zZ†[s¦Hô¤¤FT+ ½f˜$Mµ±@¢S–3™×;ݹÉÖ F7t~Am/Ø.~YjWÁLºcw3(bë1è %¹CyRpz9ç4ãœö:}”ÓWÚe’ÓhN áÉôÁ?ÐN/å|Ê^?H¿c]âAÍ`?ð´~RÁ”¨4PhB ÈRë‚\(…lüX/ëÍ®÷Õ•í»¶¡´*©¢V­ÚôCUjZ؆Å"J‰’>"šiÖÞÙ™¹óÚ]Û<ìé[D|©Ä‡ªhŽG;gvFë¹çžÿï/Öd&a­W!<ô< ©³Ü ýEà9¥L¥Šù4^NJë…Äí›±7~¾ÿ›;° ^žái]•g(óõþ#žË…LÈ<ó»ÓûZ÷UwíÛø³S;>¼Ñ:Sì;÷‡ÕŒP¸‘Ì‹–Õ——RÎ~Û ?=°g½È`¹z_Y5Íê1Mî.Z=–—Õô!œêJ dE± š3e¨!k:v_ïÓ$g÷fôÆû­mj¼,òpD³nìF ª©©º·Pš·ga@ÍÍ͇ZœTóŸËQŽr|1biwC7a:nXÍ]šèUôD^éP”nKó䄤¦w7­örfhƒ‡7Èr˜äÒO33 ÊÌsU !”¬£0ç§²1Bâ²–ÖÔø«‡«Œ¨e¢Às%²žxxËä_’ªr\³Ú‡ú7ú0対püEYŠj7XQbÆ·?#p¼›[ñ«_6ÕÔt.éܬËã¥k?øë!SN[j¸ãðF¿lOÓš‰³‡´|à¼UCK’Ü茕ºP%ç%Z§¥@1Pa©=¦(ê’.iÑ"qÀÆT#@SpÔå0<ªdÄ¡¨äz`Î~À]Î$@•2<¡¼H?$ÆGök_ÀöyÎgìóPPqÛØ[¼:Æ}™±/Sö­½%¾þŠÐ¸šP-fE`,bøãù „Кµ•©ÞUï]ï-Z£D ËJ+Ñ:L-DòAXw“ôXF@S:•é´ lA‹—r CÈ+]pjä#f!|öOÁæ¦zËyYŸ@ñ•<è«×¬ô_]E ±@A_âh—_ÀßÚYwòä./æ½ü†"œ:¾ÇÃ,ß¾µ‚§i/özÙgÞ>¨‘>K6ßù÷@WÛÊ`÷Êý=^,$UÒ-ꀓÚý¯çC³F´!?h©†…¶ÑÉà¹3‡6®ó‹ˆr³àn|ŒKtó•Ûw\½òç»wï>:¸îÝsNÁ<=ñ‘YŽr”ãsŽGÅg›Ú0Œ¾þ!޲ |n/ L¹ªÝˆ2;¦³ai*Y²†@Ñ4¥gÖHk¹XQKšZdòr ’§0B^!.êgZM3ùÔ1ã1³¤ Âl´Ì6«|÷Ýöè‘gWù)¦+Üˉš&¹è¶µ¾›ëê°cÑoO¿lÙ\›i$ÆÎ5WpŒÈ¢ê*áö§K?¦äcß ×ú+žñ ô‡5³I€]ÍÏ †tùý[ù;éY£ïÖÍni*^Td*‰Å—y¬¨ (Si@]{D¤¨ÅgH™ŠÓ£E’ÖIŠ( 8‚ÛÕó)à=K=Z"C §[îv¾¯'M%¬NwY$ŠóP˜d‰CÀ¨–iä åeÎó‹r·Çð",òð \º€ìó´=Ä‚í‹n{|¥ýŽh_€‘C,ãxþ¬[z9ö±±j¹ßµÂÇñ4³BðÒ˜ç1Såf¹ 7ÕÔÈþæÝ’”Æ€Uv–[›JÈP†´€B•8Tt9`)ÒLðÓ\»¬tÏ©‚¦••1#/í©«ä?¦ß|³)›^ë¯Áh5Ë2{÷­íêØ¸¡~%¦˜j¿ÀÒþ Ž>}ºYRS[h/rûyQÄ Ëàpç×1Œ°*uuD_¿È{{Újþs;dš!€"SIêü¤äœƒ¹‘φ ™‰3d¸”.ItÞþøäÈà6õJõqˆxìæ0VÅ^ôMö#6ªå(Ç#–˜d‰F®]»ÖÐÐ"œûŸAæ/QöÆchGö¸—¶¯ÒsüØ)w¤E¬B.ã®`/rq°M±Wd¼†[_ÉôG6|ô~zÀ”cÎê+iÈ’–vü‚.|ÈffaDÎ¥ jdŽùŒ&ìh3ôû·÷zRk²R˜ß÷"ÆG [¿LAŸÒH߉ëµLDµk*]·>Iå´®[ŸÄÛö?ËÓ"Æ4æè5^ñÇ6OÝŽõ`’®Öz®…hmùŠ&F2•°ThÎ0t{ ‰jzTÊu¬„I Ø£I¡--ë/©zjòJ¼ygµ›¥ºx–àAmÚ´irrÒ~$ú©r”£ÿÿ;öþüüüÃÍ»ä)œÂì‚=c/<€oµ»ƒýŒh7Ï`$pÈÃѨ¾šzíÕˆ3õnG.ÿ‡úÀL3õÀG7[ê«O{ìç×ð[ÀæÜ³Ž+Ùà=«† èr'è£ãèsR=+;P"ɂե’vCK‘©”%'æ@I`ÖŒ’\°¨&À…Á$J’¨éBn¸H"Vn @¢ºÐÔvEú/ûeµyÇq¤H‘N:ɲYlÙºå c%¬ÉDy[5mˆteCám I”x9.wÞq„d… ÄFAC­hµj´Nk¥NQóB^†èZ*JÙ²#ÜýøÝw $ÞÏIµíf¡¥î§G–eŸìßYÏ÷ûû|%UYd¯™Mܾ) Ía´¬¼²÷ðÆ_ŸÚ<Ü·ò¦¦¤L}ב®}Ð$àE Ø{Økè±¼–4r±k—›+#¥dËsåB|E€*ÙVÇÞ¹upž¸þ—ë+C#ý¬Û=$€Þ) O`€aì3Þ9áÖrG°;@/XŸÀ*^{«¨@¿K1ÛWS?…±ß[<Ã`]96ÂùöÔ¯í{{›‘ë6Œ„ªÆqLÜ”;3êè `WÀaA?b*]º ›³ÃÒÛ´œ¨ç€"b ‹¼!‘ô±Ý?ôó4# üÊéc–x+ݸ³ae€ãx¶ôøËëMùȤ–WŽ®­âX ý‘ €[ÁÓ¾dsMT“•Ò¢bseÓ¶U¿¹‹dZ€F¡%&çb¶-eåÆùöÏ„Öc䢶•sÒ©Ÿ¯_¾´”…D—Ñ4Ï»u9Ž3ýØžq§Àͼ å™Ûœ¿=™™™³»b«X_¶šÓæãÇSîɬ„=0™q?¼6\[³<Ä…yÄ3¾0ÃÒ¾}»¾yõj›¢%UâŒæ0ïÇÓš íȹW7 4‹ižã¨eË}é»I塸ÈNͤ³XŸFâOkêåIÒ!Z¢_R–›òù¨Ib&M½;7©°×È-ˆiõlP†€…5i) ÀŒ¿^?y¼gãššÒÌX`É/O»Œ"¾D”ÖgMßÿÓK„tÛfó„ÓÆNl¨ý:Ïb–öŸ=û]9›úðâö{·,;vqDüÁ p‹ bá©ÚJêäѺìƒã¦´gÁñ H#_¼.qi ¢ÏÛ¹ÇÁ9@îEô9¢ Ã_à¬Ïax5ëu5D{-]âì>aô·ÂO¶Gž —iÇÒˆõ³…¦œ¦©WU‡^;Q§¦cšÖl˜ÑGvÂy¸ÇTEPJ^;f«]j®hÜ6ÚA2œIGKé2Pz«.·O˜½ÀÞ««¹ Í T0Àø\ÂX åB(=µtÑT÷þ¬k•@ùƒlhÅ×üC#mõ;«V.Fwoýøö'ëÖ ï½s@V p‰, ^D²" Ž¡Å‰Ü9îôÌ·UÙ>²+¹˜nô~üÑ¡õ‹Ì"††Œ ×֭ÞpåjŸë:îlÊú·×ͺÜ\þZ³-V±Šõ_ d95593«YCÜYýÎx×'&';cÃ,—ðÈÂK«Ëýož«ÏŒ%'S›(í¬ e^Éë`5¢¥½<š7¬bC8Œ1…êŽ}ǶSj¶uÂêÔåy- ¼èiM=CkÌ«Glå<Ö±¥±\Ûg·ÚOzñÀKÏîØRÑÑT5ðÇð@Ël´Œ†2‘Ö‚Ýa*q•$VWÓ`°A&töÌÖ‡¹®_½¹Q>€S,ò-áaL…0_[å¿q£E'Û ê±„¸F€4Êà¦6­[F%¯žÜD2)3ÏšûFG“çûên|º_W»²™˜o%Õù¿ÛÿëúÊÐÈ0å^ f9šÄîãöÓœÀп@{·†à~wÄï^ô»WÙëó’ߦ½“~ÆchøÚ Üóìdÿ²¾ž²új_MóX`à“sÁûê4f¨åtèÀsûKKŽÄÓV!Kãf ØCWZòzà†~€9'šŠäh £Ø¸WsM ö‚Þs/ÝøÚ™Í»¶¬Þÿ£o=¿jéb6bPo÷VÓŒç²-þÑ\]Îh)Cá®TcvÈ$uó³zÕlêhÚfxŽBRl \7åxAOj`!ÑVÛMœ°¢òƒ¦yiD!û€o>©¤Ý2SJæè{¿ß±$ˆ"‚Ó [`°$™H?ÊÌxÌ̹šG “““pœš3ºb«X_Ê* žlK¦§gž<¹rmè5µ‚|¢PˆÃe¼¯aÛÚ»ŸJ“Öqp-UÞæ`*)Ë4cÏ|îA²ÍŽÖckqÓŠìæ(:ȇ0 …ßÕ+ÍDmÏÛí6ä2EÒe¨àiM=¢´ú>èlöþ½¶½ëy¦”ì@ƒmYÿ¢w³;¯'um/¼×È»w;uîÌ‹0+ i±ìدoA~–çø55AEë¾s'ºòŠ£Ëy ¢Š0`Ç1eƒÛ[ju²ßQ¥.wD0óƒJË0Š vg]H'©œ¼GUãð–q;¡“vSmóì”tx,'/<idžE¹Ã³(28×íŽ =¼éÝÁí¹"îû¬;´p4â‘v/pîHÀæ¼yaŽ Ç$ƒ~÷2sý NÜŒ*C˜F ÆÏp˜ HÀ4åc|`k}åùó šÖ¦È¢ªÀ¸O:šd“„Eâ6‘òFLÏÅ,’ÒåDÁLÀîÕAYJ‡JD]•€dYü©´&LÑ•Á’t:©ÊIS;,uV ˆçÙŠ•ÕŒc ­é6Œ†?_ncéL  Á+—šäŒ¤eãFÊ&ãºdÉq#Ï«’w>Ïþ1ä8pˆe4çíV=× 3aÅcî§ã õ+Ê0†ŒÀR¬À²¡z¶ªö“¯ÏÚÚlÈš­Ç§Öi‹U¬b}aMO?™þWR˜qC@¶§qŠe!gP^ ý´€¸êÅøí·öÉj÷#K4sm†Ü^Ðã`\`S€:™7Ëäó1Sé2ÕĶ-íÞ¶‚£‚†Œ¶å…ˆn¥2™F[MšrGÞˆ›$ö´¦^Þ‰›F'!MéÑÎï?/4Â4Ë£¥a.ˆý¾ï­çÉÃW ZsA?Þ}°ªB( P¾·^ßdÙ-9eÿý±Îÿd¿Üc£8î8Ž„„tÒI«Õj5ÚÕ®öîdìƒ!&”ŠP·iJiKHDÌÓ i áá;c·½—®g\¢4•Z)B MU)E"UI1¶±y¥Q n!MJ ç}Íìãö‚±·¿5Í?þ Éz?Vs³ºßÎÎï;Ÿo½D33Dšë=ú$ÿñßÓí- W?#fv|ëå®Ç3?YJ™p(4'¨…T¹´+‰ß¾¹¢¾Z ±Ü£ gîÙùøÕu¸¤¬e‰ìv´ ˆm ¤ÞȺ>t%°uíø”ãA…FîÝüõú™/úŒ×Oùmpâ'Œ…>ç÷‡ÐÔ¥:‘Ò HƒöŽÓ>,dü…õû”ÿÇï´d©=”a~%8Nk ñ"$qAØösÔ8?ðÖ¯×jJ ‚®Å‹8oii(¢'j»­g#kj²¥ûP•¸¥e ü¡`KVJ)$ΟÛòΖ)×sJØÎÍÍP§ÙÀÞƒÍ&Þzk$V*ô`En^Ù(¡Àˆ«›j._Ùv¶ŸÇÚfK‡''ñHì¦-ã‘V[‘'ÝBzލ²cÆB´lfo;ʧ/¸¤Í²Šçíí U(‚"`\˜«ãʦ2w„nü &©D%*ñ¿!c££P°çÎ~°ü‰'Y0Q4’x^ Ù‹65?rå“nÓ’ ¼µˆE+™²¥fÁ=Ù¤ +mEc÷¤^†Èz!nkrÙIè#í^H…XF@TH”Àœ<¸²\ê±´<¸›"mrºÏf*Y]YæÏ–/áxŠšÉÕK,ݲ¥áào6îß»êÈᵺš´Ì-6‰ëŸ½¸;õuDÏ ±‘¦ï.0Á:ra$³më#/ˆl0¹}1¼ìMK.ÜhùôÚvÍŒÃRì;°*,Rˆ¡×¯«-ZúuÐÆ.¢vk$§á܈–Ô5‡ }CÙÝJ 9—´|̤¥¦\œ¿ew\íÑ×—¥}ih¤ŸóŽMtNrÞÐ~„œà¼w‘Ï!ý´÷÷Aoˆò“ŸÂüý‚Þ Ê_FÈy@òúy¯—ñ9ä„äHø€Ä‡– w~ ýð1¦Ž™U¬°4Ï_f«",×ø0ÿòžÇ.]‰Ë­šÖBôœÛ-#njPõ€Ð) ’•…«©ÆÀ’¸vÒÔ£ÀàJ 7¢vq#Áqm$[ÃÑa.„Xñ•_®ÑÕÔ’/™ÑÁ¾çXjbÂ"-œ:µÝ2óv1®‘ÎþÞ^ÚõC¿{öÂù- 0¶…'Û?àY\’s´Ž²ÙA”QÚn;-%ï財Ä,;zõJêÙU Õ<†éiA@œÀñO/_ñ·sÃ>ŒŽÞ¹3:Õr[‰JTâÞq—CàºïW{ëëfƒ©ó”È †jî?9ËŠ08¸Õ2e]Éq‡eÄtec§]£ËÖ²“©‡¦Å][¶””«‚áÊÚföÅß š¦CBÕ7q—.vû~ÊHÛ8p}@§^·:Úž½¯­Ø"3K ‡ÿ#—äu=EŒŒkf-­°Ê& w}x®áÀ³ÕT#ᣲ qE;æT\dhNšºòQÖ&Û Mnnª_8‡^Ú༓µ^ïLŸI†Ð­wiïtd¬w"ó´×œ:XBÞ òŽ!¯Wôú$oy”w 2JVá¼þˆ?ÞÇúƒ>¨Ð@/Ÿ½Ívl4„y‘–$D ˆG´f«Š­¯ öt/½üI[°iÓ~±è²_ÐÁi ×ÙŒ•´£wøƒ“ŽÞc» i‡ï‹•]ÉGsD¦ŽG3b›«¯_Šƒ+iœ_Ã!Fäg´o^fâ´aDÞ²èá‰åتC3mGë‚‹wó§“íày\H%Y$²cÊXÏè#yËe3­€C*N¾ñêŠyµ”ÈNçpU ›EÞÜWëFGoOµèV¢•øïƒò$^¿v‡/ ˆ_ÂtdåS³Ï ïÀvcðAm®‘-têp¤’,ˆ x] Ð¸5™z˜–ì;E.«.NjJòÚìÂyaNxÄó”г뛦…G9z€çAz7ñ&KéùÞ˜F`˜À+/­1•%ãy·–̤©$KFÞRÓ¶!c܆Íè’¦¹,ÃEP`—Üø¹&êfläbh1( Ùo¼ºPäò"]%ñŒ€P -6=YýÞÙökj”¨]¶špµNÇÞæ([oš@Qx˜ÑR»=eâa@ ÎÄQ×l-›q —¢!O9ThäÞ­o"«AÊo´7± ƒÙàêo£e_cæKÓ›s‰§¨#Ý|éO’wœš²<ûy?UÀ€¢¡»9ÓÞÖ ùw!ùãAÿ-|²‚&a}tbǨÂù×,-dYš‡ïA³"аa .šÃD75^¼°M/$KxÂÒãE’"jÄTó.É9X6õ¨E¢~éI¢çˆ5ÔœeG3ñe< bÂ7¯zHÓäûÖ„QGÕ7ÔñçÏo°ŒMgÏÄj8žcBÏH‚(ÂÔ‹4š?{Ú?/æ&¥ TÒ€I[N`œÑ!3åŽÞçKþ˜ÐqÔ°ÓÃÃùgžž €šùk‚Iš×­Çº1Õ¢[‰JüÇ8ÄØø¸76üáý§ÃøçÇþ|xNm„¡˜ˆ$qôt*´ÿÕ¯7òe«S/´Ù$DÈÔîûô½²q«­EK6µDç´ë™Co524Š„G1 jꆇc˜lƒ‡Õÿ 8/¸ÞkbÌWú¾>=år›4Á„a–¿¼ßj*©Û$:fkÙ’Ùa(±¢“VGdÛÌaœú7ûåÇu†a@°00†á0à ;;Hò-Xmì(Ôvlrñ…¶‡:Më€ã¦­l"í®w·»¬v·Û•,+v7u‰K -n’_-v¡¡!ÖÝ’#×­©Cœ&Τƕµ—9sÝ›¬ëé7»iÉìb×tt3:×ùÎû>ß¹³û}œGÄÜúµMS×3<'¯ì~j•Ì32’6oÄÙ‰ÉKû2‰-/íûú/ûŸøàò³$•†º(eÀü?ТHÒ%#ebf.R2âF> ¦`RËž‰XùHÅLìAGØWÙÈiZWÉȘùŒM—%#Q1áyÒÐcE;¥ë CO-ej©¢ž†£+Ú™Ü4d¾±²å"|J‡$m-ó ÐÈÒ¦Y:–Í\=Ý<ûŽXSè8³äZ9¦£²ëÚ`Ù¼ëæÃ èEDÏq®}¢3™µ)ˆx™—dŽ‘9™¼žpÒ&½\57Z:މô‚°ô>rǹÀܬº½z¶WÝóµ•eEq#H¼ˆ©¼#%vh×Õ˜VWÙˆU§Ã‹fÜ.t›ù”]VðÞ!©’ÞWÛ†[ W˜$’.ê½W/ÿèD¿ïã¿û³ÿÌ´4ËVeä;Þ³½l…KFÏ7ÚÚ$YDvë&é¯>qú­çvî\ƒy7zö™‡!C±È0[tš….»-æN–M7ö Dµ| øÇ±áÞEê‘ÿ•õׯíñr "Ë*œäƒ=±BÛšCçÞ]œé1¤ósóÐp“2º@é-PÊÅEhÐ……ù/TÓ}µRVÊJ¹keav¾öøc¡RqéÂ"u¯ÙÑ—{‹ ƒð Ç0*¿f÷Îõ“—:E*æ#Ö-Z`maH‹l펩F0ò!ÀÐ «[¥#$Ïï}”õxdÞ‹QcÇþvÃqAÅ̇ÀCÁÁLë._×™ÿÅèÍÈð{/¨b“"("âˆÕ^ìäƒz!e 6bFu²¿â¤ì\Ÿ£Åu-³éFÁ = :pà‡m ]`9^¤¶H ÃÃûˆÏgÓŽñ²­‡ê(˨m3áÚúòªx÷j d†Êf¤bEðà»ÀÔË[ÅL´Ýd6|«+ Aµ‰¿dGà­YHÎØ™:Û¹@Éð$Y§®wÙN§etÂP%Ò«å£E'Y¶â6‰‘\Øýš<%ò Ð}Ÿ´XS_øÖHž¶)Æ…ŠôQjj!€Ÿ’áJ™õÈD»{³áåâ­@2—þØóÍVÁãiåf c®²¯¯wii¾F K‹‹sui„dÖ„Ö˜¤Þ¨=Y’•²Rî^©]¬ÙÙÊ©¥ SS7víÚÅ!I‘|ò4KŠÖ½ãú˜®'ªv/ ˆ‘”8·M"e+"p§îYóJÈ_ºË$2`‹Ý~•gI`!Ϲwƒ`ñEqsõMï©û;Thßé¼–yð³Oú}¸QÁ¼*zÏO|ß2c3NB×czö¨Ÿc†@Ð\D1;ÒQ é£Ç· `’¢* ãñ(>1ÿÎö-ìÉã;n\‡c Vl˜EÖQä¿î__ð½G‘nfÌ» NÀ"þJiÙsXw(™1=„•ÛzÎP­p#uË9 ù& hä‚s儞;X2]ñ¯Ñc¢lfHÖEHK‚Ó3ë8‘T‹©Š“Öá­}`hä½ÚˆNðO b=Hâ%eòUŽN`:ÀÐ1xžãbÏxNù7{Ñt¹€N‡%IQŒ[1R‘ºÙט|ŽûmŸø±çÛxÎȵJmLãÈIyiŒ¥ƒˆc:Žé(‰|ÿ1ã6ëE–Žrt˜§ãü•×ùΧšVqŒÈcVTܲŽãeÃO ðèµk‡n2x ¶€H¨šGg¬þ¢†B®“lxí W®Äã¡'ßþÝóÙÜ‹T“#~ÈxQj1ò=szzÖ ÝÈѾí>^V0{êØ®üM7qøô£CW¯t¬4dðŸ–!«ó‰‘9$,]µ–Í,Û_(D³ÙLßOŸæ< >‰‘°$`^Àì¶­íŸ~ò!]Z¨SHµ<"ùe277KÿÃ'+e¥¬”»RÜ‹× PdiaþìþØâ[+ ŠÌ¯ƒË)qlûCèÌï÷ÚxP´jÇÀ‰À•E,4 Áš¶€C¥ïÔ}ÀîÝ,†ÄAF€Fj@vQOGýí^^D, ·{ç6-+_8{ý7  t¬·ï˜F ¿6}xC+Ë3M2'gÒ[‰™"Z¶VÛNÂM¬Hßk'ÚÇ;¦n¥Ä 9úäcèE‘¼ˆmôyÙàO¶þYÐ4Ò ŠÚ´€JŸŽUŒ¾b®·nô_F‘z½×4ââ“–,’tÉèqH¾à^£¸¯<78üš€Gk}!-í±5·×l1miU'hB3­OÇgì^xUȇa›·œ´]è®À·#IÀŠè-#e“¼‹pÚt€¤>ìƒA#ƒ˜‰t”¡ã,I»*4sæø_u5rÐ…ž÷çø«±Ì 5þÁ·éªüYj_'6a†SQ+ÛÜû=dzy:ê¥8kŒ}#Ûø¦Õ÷ÖK‚ñ'=s‰.óŒ3tÑ1áþcÆíÕÅÁ]üGxwåè/¿Á‡žnhÆÈ+ydžQy¥EhåpC8°ùÚG~’Oít é3e3ébmÖM: €I@4fJ~Èe ÉM÷šä˜óoöË>¶‰óŽã‘*E²tÒéôèôèNw²}rP feˆAWV±n”·uРvÙFËËP(NRÛØ²ã9@ÈFé «Zuê¤þ5TÑjÊkÈ Ô–¢¶«*^‹ ‰}ïÏí$Àíwv—ÿ"‘„:å§'§ØÉ=÷»çy~¿ïçk7mó‰Ã¿`&ÁûrËÏ eGQiºåö„H¸y¾@Íã±çõK¬œ–ì¶ÈêÇ$ê­}+,`k1“–-™1åæK·í,É'‡ 8«“Ö‘SH²+¯¦lš%±K‹Pâp±¬ ~ðþ—FîÞqQdü»n øq翦Qd:¦ã>ÇÝÊÏmË4[3, RÃ!e¸žÆFÿåoÃ*´œ¹SÛ»Å2b¶‡kEÊMÚEzªê¢ô«,Ö±‚wg#q[I\½´eN_ûYýÖÞ¢Æï—Ê—Œ´¡%#›Ÿ¨÷ <å›%ѧûâIÚC±’UB²³çÄÖZÁÖVàÈ¥F>ž»Þo×°ŠßðûÇnUMpmj.T´â¶‡¦W4’f.^ÒÚï5My=ÕÑ\P4å¤ V—š5µÌdëVÁØÊ<á– Ü[b©QØ\wÍ央¦l«M‘[ ’y°é–ÕfåÓ$ŸuwÐŒVælOëÞ]Ïì{eù;{êë 1C͘$ôƒ¡‘>4ÖËŠôЫð3@ yþÅ%È9néNjkĵ4fF¤ÑÐûõÎI¶ã¦ñ³}\5Íl|;=¢‹.@ÝØ9Šœ~~ìÃÙŸ´3ö!ÆéÂÎiì¨ôPîèG.ùŒn.lŸÄò³ýÔ®íOܸ™$$ϵ¨ê·Xä”:•’©`‰æž¢ô0 éù¸iÄ5(4c¯žk~ó/KDL "â´fypíoõ›Ð‚(zž}f¡]h½v¥cA’LSÕófç‚Bþà»z¥ÓÐÒ†2rÍ£$“k“×]A‡Æ*YÓˆiú&ËŽ &_í\V+>ÂÑÕH¸QhÙÒÅÿþú|H\ü¨0É™LÇtLÇýŒ»Î‘#çëŠöcŸÈ²"®ZôÓê³}ë e¨3ô’‘*QKN‚)«^¤ D°d¹º6Uõ)Z K‹%ek.ÀGKŽ4¥¬¥žœxäñqÄx¶¥W‚Ÿªk…|l·™¸Z?ÕçŽZie0JÚѾXâ<~ì@IŪÆç~¼=ÛÐØ°P¡°ÄÎÙê>Z_²RÚ@lX¹¨ªBã[×\Ê…`ª+[ª˜¡F*“ƒ¿3dB&Ô¿’!|ù i¤ w%S~ntt$“ŒÈN=¿}²uÓ””¡G iµHÂPvòîÁëm¶Ùn’èñÃ/|t`Óßßyü›o2/þöQhÎ>‹\Õs«çz·ºodnÔõðµ+^öœ?ã©^þ‹º5«gû9$PuuõñÇ›04ðÀÐË;§8¸~öPˆãgñ¸Z=„ÇŽ1;6Ò,Çr´ï×A¤Ä09Âw ffÕBìô#ç$çt!çëôb`§›rÎÐÎ9윢\ 9ÿ†]Aï8½Þ‡÷8ú+|Å•! ¹dÒîÂZõ¸¿8'à¨ë2kWx8®gp4<‹k½‚Ȱ?ªaþúÚÊ\n')ì j¼D Üêp›I–0Øj ÑÛu#BH´0´çv1ª ¤;þø3Œ‰ë%Ãv Y–æÔ OúCpNvï\pù‹‚1”À [ƒhÏÜà#_}ž„iG­$Tk~(JŠéÉÎØÛŒZä%HèH“7 ·vúû"¿\\ò`SHÜÙ )AOαõ¸žO “¬"‡»Žoò1^ëã Íqô…O×T„µ¢ò0¾ŸÄë¹Ö‘b›¢†½³yË“ã1âY?è(ÂŒƒ(?˜#yßûGc^åÔ° Kùd©VÕ?i<]t\ÝN´¨)—ç4ÂD ƒ×3å´i$\0(ˆYöep…xfü—½9TIC.Ðä"\CúxçbᦠˆEű…sÌå£ÒwV»8ˆ%s¬(2²—¾þ}ìÍ&Ðá)…Š’>àÄTœZÆV"ºÑ  ¾?§täµ]y#žNÿxv÷ ÕåÊ$Á?{&3é°n‡FÔ–6SѼ³ÕVÅŠ]¹Úø›cÕï¾óŠ©O'Zls_Jm½cF2‰–œÞh´³­›Ö-ó@ºä™_­1­z[k0G:’×ã'O<÷ÃÎÕ;טê>CÝ•1›¥ý%`#xYùýáZHë×ú0#ó¬,±ÔòÅøÐ¾š´¬ZìeDL ²°aÃ#Zâ@F®~Ò‹y‘æüîd¤mïʃ]ÕþU±4ºƒ®&ß(g:àt²Ïæ‘Lzqq@‘TèÁ[+] özYÔ¶]þöÓJEj\^B†ðäy‡.}­¼Bà9„½˜jÙQ1ÕÙ0SFºiÎ2ΡzYrZ"C ‡ #øêÆe+æS¬æe¼^,¢ðFzøH™s¥¹Â;,¹€É è…)ôBÒ÷’s”€Á"cÎóx@MÀøÐØ¢pxÒG‘Ë9‡ŠË Š¾ÂJ/° U%°¡ò`à¦$ÄÊŒ¸aÍ‚¾î¹Tx,éÏg·Ø[éȘÎi­Pïd´&Ûh6õVKëZ\ScY½>Úd¸‡‘ÞoÙ †Ukè¡åU¥ˆc<›^|̸Ù2n´èZ,}ÆyrXaýs `seT¿™l3 ðvXM·ZÄ)vTØû[êJÌ6:¾ >@}P9òú3¥œ b%qbž­Znª)2IîŒBH%SNP-Ø{"mánìm³íÿ¼9ð(¶Éɉ{A'&Àö“Κ —/])óBiKc–’ø Ž–,t Fs!˜©³ÆWÝõTóh&ª§šÒzõr{¹àöàRc%¾ä÷omÓ´+Õ4iÅìD Š,U¹o-äRF2šƒÒ L°ã#7ãºTêÔ–'jzz¶Ü갌Μƒ5ä­ûÖÎÌ=”Ñá®:%áÝo³ ¼qÆJ­uÔò0-`j±|º¨Pí\›¥³jÔLÆ?þÇÖ§+ËæKn/r õ-# I(ô¬dô6 G«‰fÅØùÚÁ0ó¬kó¦%§Nm>ÔYÝßýòµ¿5>¾€ÙQ‡÷¯´4ÞŽÞü,´ìQJ¾RZW;Hß]¿Lâ‘ÀÉ/=ÿˆnìM§CªÞÑwî{#"Ö% .%Õœ¸öyÜ G“dŒËy –ä“™ÁsÎË»n|\«&‚E†µdôVi¸öÐC§‘óÐp®ARü­n a˜'äòRynò]{S$ƒ0€}´‡æ°¢À¾¸I‘nLúeG ï!2ÌÎdÃx ä00ßÂ7rR\$»Áý2Wʸ9Ìó ãò îõî‰м/³˜ôp¤‡'ƒEl K€,ìWÔÀ+”H¿DÎstNó¼Ë~°ŠäL õÐJ#¤O"Þ3]ì·|nÖ-Ól˱#ŽæE¼}ãSŸ^‰é‰°bîÕí¶QØ€jZ+Ùa+QSmH+[áI0‚LÆ *Ÿ‡,#ßVŠ?Ë YÐï_âs!žÖÃc»o®ïÒ{B'ÆÈÔ$DZãÞ;M‘ôgÛl{(Û´Ìï:Lƒ±±±‰ÂØ”rg¬pü×Çb)Ïд…Em¨)¿ñI\Q›Œt“•gõ¦Kk„4ÑâN¡dÆö·¯h(…hu­~ÊwãzsÎl2Sõ9- iÎ4ï[ Y- %Ò¨…³$ Ç3¹Æ´^gM Xø¤EI7BR†Ô §ø52 ’i“Üíy5˜·U³ÎÒö*#Á¼…;T"ãÇŸ¼þÉÍP*Õ4nµj¼Ùò³UIXÆSé+5Ô}–É›!-Ñ3rÆ-å7ÓaÀÉ™Óvׯ°G€ÒN yÆ##¹kïrÕlûÅÑMQ<'>æu}z=®H¥ÚXfŽÌzÖ=ÿoöË=6ŠãŽã–,´Òj4Zvµ«Ý³ló¬Ý ’ á• ˜¶@ó¬9[ç«·ç»ëÅ6ïš´D V‚R©U)ÒVûüÄ<Ú´UCú@áÀ¾½}ßÞŸÛßúT*EâH¨F*£Ñiçî4ó›ù}Ÿ¯_×¢º¹ãØÁj0µ˜Fo]ï'Sß©òòÅ/J°/qñµ¬[¾hÏŠÅ<^¶`Nýž•ÇT=0ûw¿ÙÙziWkbÃýÛ{?2¦gK½“Reæ±äÙ¢‘Îí(èPâÛ·ub§bÉï§i$ŽiêØVÁ£…NìUùkh¼}­—°4ƒ)†žjŸ§Ý¨þ¬{…¸m” ¸réà§¹]’{˜~¥NײǷ ?ž¢þy¶l÷Z,bãò2Þ×s‚š€"–¸ûS±ÿ\Ñh‡ä&„׃ÜNÚíÜ` Êc€ †a+Û½ŸoÞHuŸ(6:æx‘L°nq¯¢±ú·G˜å„ö±ŒÀÓ|™O &3ñæ¥wî7èvÔV¾Ve°¤›v€€ZÕZ˨K’6êt%³c•ªÿºq Œ›"âR–‡›«œŒ¬>¨Í8‘ƒ^V`ÐÜ™èÎ-˜¡!”>E‹›Fƒ¥Ä`˜ÖB¶pŒ@Z¯u€vúŸìbRfKçU÷±õ{¬À“$ÿÏÛóö̵Ï!ú²¸–5ƦPh‚X‘)/e¸æÈËš±¬Úœ ²Ð8`…=ƒ0I4’I¡léý1Ç€"¸÷ÞÝCeÅ…~³˜ûƒƒ«ÒN­cתØj“c¾èüVª6cL`0‰Ý¤«É¾zÛšðD©ù’µdÈÑci+nê±§µ/€àèy˜gPCHжËI·˜j ­†?¼^}òDÕ–Íþ²éUlßàõ00”®×S±í›æ1Œ¯H$'ß]çdC©¾=Ž^“5½A×ê³™h2Y£(ò—$š¥8°r3 "~Rô•RêÍÈ<#ûL l¨òƒ®3Bþ¯šF<Ѷ‡E>‰àc‡ÖÝVõ/ÎÖ0 „>ôæZGo«h›ûúŒÚÊWüÃLe¥ö¾åXrsx©€DO©.Jêû“éÍ8Ø]ñãã¯iöxÃY 1§ ÏyyiViCnô"oØKú/2óIË Z¢°€+§¡d‚ë™ ‹q;h÷OÂám¸œÃˆ”%RõKôhûÄ< Ú#‡VäPD»PÞ.þ ¸md¸—¸×·¹ÑPûŒØ^ i‚I|37ÚZâ¡N/]·ÅWÄV–áw·º½œÛ%xÅ0 ç*çvz¼äE óC݇©<@‚UŠªr,KüØ·bFÇ'“E#°YˆH ¶ßAeøtŒý2WXŒ$Âp¼ÃÍ,Á%3¡¦ozd5õïu@²I9oÌdhÀ†+íùt)Ïšq K=ú“wVÎ.Ek*]mRÕ@&Ýtíê.Œ}]püÈjÛŽåÈ娩ÔÆÀÿš I ÒmÀ‰ý¡´vZžt³©PFèýrÚëFÐÔÞ:ܼØÏðCqØÇŽ08X_­ÙýcãÿUZOcÇFóÏ##ÃÿkÅÞž·g¯=ÎŽÇ188è ÇÆû’Ê’Å•J ´Ó~–Ìòûÿ«­†ÒâX![ɺŒÎB¶“ÑÉ¢[¯ÍYq;ØÌÊJªî왯1ÈOÊ8„æÍþü—=†6'œ5š'ÌÎ\Bßµ`~Uγ¨ÔÍa3–UäŒ.?JÇìF#UõÑI‡ŸD (O,êõÇÚVê㇚ròÂ/·Üühó`&þÉšåK<<àh¥Ñº¥|ß­¸¥UæÑY%„`VÄâG˪vôúœYŸQã¹T¢M)uaËŠ-{az)‡ŠxÄ2¼ŸˆgNWê![Jèëï7ã%,í'3DTØÖº÷ÄÛ߀ÿð˜zïüNl£mK|Sä)£—-nÿ£)g5驦kʦK8‰ó‘Ïî‚ÁlùøÆîy3}<âį\:û{ò«/ÌASE¿È ­[æz¼§ç_² ;͘Ñü𙣑^ä1F7TyâözŸ#ÝøH•oæÊxª˜BçB¥îeÉí¡ÝË´ÛQ·g/‰ó%Ž""T)ÁÛ—ãÛçè¡.v쾡ø­õÔûQÆ£—nÚ½H-\9…#«ù+¦l_ÀîXˆƒ—ÓMëùr‰ ¿í<ÓKvâ ©˜üšùŽLßWY¸yqAK óð=j¼›xAvqn¹”Ç9=ĽÂ÷P}ïSå„ò~–—¾»w;¹É£Êä.ñ?HƺÙÑvîÀë/ò…£ 1S~Ž[¿¤âJgÒ߬ëuY§6›–̸•l°•¦Œy”Žkýa¸·†J› ¦Þøé­ÆÝ~rV×#Uo”°¦’ªV—>¸¿ß2t¥î[&ÑÀ³4Ždšôþ`ÎŽBvÀËZ “´òÄ{˜VƒV H¢™j4•xÖiþõùsgùDÌr4Ç1D‹V­Xûé»yÍsÈøøøçlàóö¼ý?·ÑÑ‘ÇÏùìúäo7§Ïðó<Í–GÂT‘[±„\¹Íe÷iÉzG‹9z HÖŒ©døœ,±Ôg‘Àž©I©; ¼½îÕ"–Dqk^R4ÙÒLDûdUyÒü©FpIŽ%;v0£a!°B¶Ê™9\UCZõ*)P ˆÞÓÚTgÐOèùÒœ'øþÞÀ÷åEåÅ´„ RŽÂ– #xû^tãëåÓ$(ô~ I–ß½-·%¶qsÅKNíSL­Ž,g…=å4ZL5,a¦ê«ùúå½ÉþÕI„ü›ýòâ:â¸%$K–VZ==­žvµ«Ý[mŒCRZ7)…¦-!-r*¡¤Œ >\ßÙ×ûÕË“¨(iPšH mS¢RZ¡Ò’ÿÀ6†ô*%TjÕPˆƾýõv÷öü 0ÛYŸ„”HTBBUV{wºÝ÷æÍÌ÷3‹^ݿҡ­ž½aui»1’}u÷ZÄ2µ!õ¹Æ†Ž¶gTAQEñÒ¥¤ÙZêÓ‘v‚pE+—pûºVw¶}}Q]…ÄV‡²©±:€4#縑óC[ëÃa©ð“€…Sx–i|FúldO‰¸J¿;÷€¦Ÿ‘‚›>à ⿇ýóÂxÏ7Ï„?ùƒð÷7‰?ÈÍB¬§—ø=L@/ƒÂ…w¸/“ Œê$,`¢.ÀÒ“*YSW±—‹lå#2sò`x g@=¹Ox„`‚Çã§Ê ÉücDde.Wòâ¡&!Øi?ºp„pRK•D$õ²X%0((Va¢™eèûûÄÂþ ¬ Ô€ü>UUƒY,ž†¿=0 Åù`ÿ4ò‡g½ÚgÉþ­aHHŒ5TÁóeÀqU¼"28þão^¹’°œˆ®GŠ4§}›r“ž™sXÁjõh; ¤ä6àãBí·ÑQ˜ö~m¥Ä†!çdÌ ÷$Ç‹ju ÄJŒÓnk,âY :’ò¬.›vif†º9Mëœô2Öè]§˜ ú’OŽÛ@Ñstפ“sõG£´?½¼j¾‘ õ!‰buµzñâÅR³žž.ÝÀX‚“9›³9ó?Ï$'Ožƈá1ÀûyM›ýôr·nìrŒ0ƒ¸FŠQ׊£€"YCxVÙk·2 ŽÅBTÏÇ{OmÅrE&ˆA!Bú{£ÚhÚÖ[ŠFö^Ÿoi­;JõˆkEyà4/ZYÏË«˜³ð¬Ü¤Ûmk÷Ê@ˆC¬|gi¬ ¡Z@#‡® ‹˜gñwW+–‘Я7OO¤õ|ÖÑ3;·/û}‚†ÿ~CXAºšoÔ¢™~àG#ÃÄïcïŸå8A`¼>Áê /“ljçCŒPÅÁjâPQ¥Ôb†*ãðz}¬pªÃ š€£G­üN èK³!Et=Ÿ,/M{Qs$Û¶c!ä§Êqû»¿s«øš6º­`ÅÆ#îè)WOÌXÁir¬ÜŸ=Y.Û¸®î诶Ž]ëž*¤ï–‡Úh—çÄ-½ r{ªÐe\@ŠŒlÑéZûµ+/oßÔPÉ# WH&; ìØ±c%)~s6gsvǦ¦¦à:99 ×7¦Óé4ÇqbP;Š„*UŽ=ðÊ:(|ËŠP·Ù3öŒ T®­¥`è(x;)mÓÇîYåï›9Ïê P¤ÓŠ‚>R#kÛÉæÖU„cT±FÑo/­t½˜G#E}Ͻ??íšåÝíêÐôRvÊÕb¦·i±㠋;nŒC™kîº_ûi¹üï-ŸüóycÆ·Ð\wE–Ä‹DØýâ*lj­¸S#7eÅ9Þøõ ‘Ôb4OâY‚Âa\uõZÌÔ2T‹¹úPyÇm1òiÏŠRºf¤h¾ Xb象Áf +KWè4 ÎÚÑÓÁùÚmìß*á:…#"ÆŠ(¶4/7Mxë8j©ÆuOqX”¥#¾dñcŠ ùÕbdûÓ¼“Ú1 &SOÌfìqµh‘Æ3FÍ´>X›)艳ÔÚþ${èhHts€ñ‡±ÿžìŸeý~₞²þYÉïeüsL ªg•€OÀ‡ÿ,e¸Ò?ÍN¾öv„$$ð‚¢bTƒ…pX©ä19°û§ÈõãüB‚¡˜'XD*8y^ˆàmë%PÖÿ h"9Hü!Åü.ࢠ¼(µ±¬Zè–n|œËE¹E5 ‡«1fd¢*¸RAÌ~Pyn`{‘æ\Ø52aC_ÊBkò¬DÑN@¬„n§ jl­Ù5bÔÝ{â/7®]Lõ `ƒK¡rcÆXW€"V¬hìuõVJ7›z÷ñw¢A`C*‡V4”4ôÓ»æ¡ÓnÅB` zÊÍYcñ‚uaf¡q×j³i×+Ý+„X1Dd2kÉdòæÍÐogfnùŸçlÎþïíöíÛ_¸/ÂÌ¿531>¹¡±‘‡Làa*á±øèöÝ£ë PkFÔ΃öÝU6¿|µ½6$PqI¼xä­ç -XŒ˜£Ç&Ý$բЩ@%ÿ‡êÝ/ €Yb;ŸèÂLS+ç9-ž•Õ®·ŽÛ‘›fl<³içð_·:´æ[ËÔ×ü—ý²Ú>ãx¤H'Y:ɲ~²~²e˾Ó]Ò„A(o+4͆( Œ­¥¥ƒ2^šÒK®çæræHH!F§M[+uºI]56´uƒBH›Öm¢£ë6Šxäί?Ÿï…¤Ä{œtü¹õÒHU=:ù¬óϾŸŸçû|¾ÌÀÀ‹º•rŒxÑØY¿dnÜ"8~ìy.wÓDó—5í Eg[Áèyç×kgE†‚©”X†gå×…¼MbÃÙä¨Ñ“×UÇÞZ"­®¡@‚Û–b»MÄÞF–Ìyç¹Ë×[~pe>§º-u{ûŒi ŠÊˆo¼þMM‹çœdÉIض²iã¸Pdgxs ±U_ïó~N|NÙÿ}ñP õ¬)¥úÝnèmÑ;%ú³¸W\*•hIkº×ÒÞícÏ{|ãã+É!ÄÔFYÿŸöâVòB@ˆðކ2ïDØ;._ÀÞ ÖùéI¢iQ Z޲1tHàØ*$,}$øZrVÇa.ˆu~òo10uûÖÇ÷2ÞyÖ;Ž|´ëgN>8ŒÆ#(a!Âá² dï9,½øD€*9ÌJL@d‘ÈWa.¤*ËÌ+/dIÊ4¡CoÕ¸Äk¤†5 øDÓù-Ÿ~B'º¯àÆòF—“MIœ/(ÅrÍl¼öõô±oz­¾®fF8R% žyÆtËÎQA1À‹ÉéÝ®Ùäh±éðû ZIkƒ¥à¦V¦­”SU #Žþö‚êò0Ërb¸ yãšu9ÝòÆ=Páâ¸ëMÈó=,™Ôä;ccS0*¦c:¾¨˜dòññ±O±| ÊJ7o^[¶tb€Aád°o_{ˆlÉ—vùsSOB ðO9f|Æ´¬Žý ^bdÌ`I k¢Ôп»m½dç¶“.Xª•IØZ|¸†iûЈk%ì hT16[ÌlŒØ !1’©T éÈÙ]7>Üwþä†Iÿëê³ß}2å‚C‰…0û³73œÍÄR1*iAµÚg“-TE²ÓÑ[ Îí†l`šJ÷Ε²Ì‰ˆ!^âE™åžošoééœú™TÈ[ @²¼é«tÞ8Qus‹¡u®[53$ "EFiæ¡\Ë$nçUxûÃFúú•—jçU Æê;¹4¬¨‰;9e{炊ƒhjïþ:]W\§iäÿäy4~ õIwNEÇz%¯‚1NÒwÏ2]ë²ÌP¸ZDs­Á«ëËÄ•,EC!KRû*Úëc¼³ì·PÊájNøëŒw†÷NH^/ï pä^ÅW^ÁÊ‹«©§¾8 1Aj8Ó‡g,y0è Vx}¢wšž²}x~L”×/yÁ»}\¬¾<ĉ¼À@¶=U6Ü‹ýÍ9qúfüù'ÜãsÊC|”A˜AÁ0 ¡²y‹ðoó=Çê*ŶS6évÌXÁlÊ›I¨yà×hoÏé ¿8 Å6;l½ÕÊÄF PÆ)]kqHzo÷òù³«jçÎŽmªûøR®µ~|%¾pË!jóÓ³Ü\§etäèÙ†R^™ tµDT¸…£)ÐMÐŒD®L„ö"RÆ7–ÏÙ{Îômt!™ˆÄ#€!W®xòÿýeÌñ…xÜ7‰÷€ddttšE¦ãK€ð ï«O&ã~#\ºtiæŒFA cÁ ãV-Å×®t™v³¦5=^°ßŸ_SŸ1‹n{&[<_Žð< „°œR–n3üGK:Ùôˆ»DÃÒZ€@aî÷ó”HºHâv¶uØÙmeÒ%WuŒÑÔQ«ÇÔRgÎn{®©âá¯àƒ¯.·2j>¯˜FzÏŽU•ÌV`P…Àvm¯?zlµ(ð¦7=]egӣíÆÐ3;MÌ4ÉvvÚÚV§\^ö©’ ¶<ûˆ@à EQ^ÞÜPwùZœÜn‚ʼnÒQ$Éœ±Í5SÀ?†Ñ þ‡#"¢*99ÌD¢˜:õî:GW]»µ ·Ø–²¤¶BÂL•€Mð}¶êh)Pc]ëøÅ[ 0::¼iýb½ä»ÑiùßÙG{½ŒwšõYCžÆ^/çŒzïsû×Ó5¨<ŒË8*\ÅW-žGU±`ÂA|{§à–ųËX#–]þö!¤€x†Vy¥ªDpe /7RwB97ÿ8c×Z Îà`XÄTìÚXæ "ï÷ÌÄ3LQös(Åz½!ïlðh7,1AÌ3 åòoqÞ9ì ÐãÀ-çhÿgÇ"?ÞŠjgà(‹9€¥cËZ¾~ër'€•QˆÙ™ÓwISÎè€ /úÝ—†GOæ@ÄH¢”óO–rqch1TÛU»w.ì‡bP•Ì¢‹v$¾zU]½bnãeouÚf;8‚R>áñ¼£@ûØCjц›Æ‰¹ 4DÒñÌN[ÁVXÜÐQ,«Å\²÷ÊåžµO~5ÌSÐD1f*+£—>¸èßõÝáO9¤T*MLÓÈt|Yctô“ɃI ùoŒ~û%ŒèÇIH”Q eë|4Ðk#y |æ­Å³5ÿ§Ì畎֜wâ§Þmä‚ ÀžD½ÿ÷f0/ D€y«ÓʤÍçb¤ïûódÔ’½»`wØF3•·;†Ýä°‘0õ®H$À @˜] ìW )×Mèfó…3ɺ¹Õaa( ¦Hí¢J–‘E\þú«+ò¦š½¾Áû¤Ë5U#›&F[)׋_¼¸š¥…Ç–F‡n©/´, ó†Â<',©G]MfK‘ìÎ]%ÒïtB®Ó0܉7³¿ú庭3¿óDho÷Š? *¦¦ öJ-ä?/ÿ‡ýrâ¸ã8’¥“NZV«Ñ®vu{§³ƒÁ&(âÑ(äQ7(”¶nS  Ÿ}¾Þ]îð=z=py4ä¦AjóÒ–(jŸß6QÒ¨¨ %-i`ßcß»ç³!榿=Ký£þ¡–*F«}ÌÎÎÌþæ÷ý|Ãnþµlk´ÌDþNpn&P*t]êÿ¾»jT_ú¶OʧM9²D#¨#.2AÛ2J‘qŠ\®žô»È“ ÷²µ£¯rgBöºzû€P(q‘Ù/Å7²>Æ!2¼çø÷@Íqå‚“LPdÀIÆØ'Wñ%ò˜ÆWC&¼d€"ç6xd¹w b±ÀR…n¼ ‹F‘ ðÖ"ÒgƒY–&Òïœëç¶6À]‚‹v!ñT†Í’ó°\”½bcN2€È?Zz‹k}fÊcN¸z׸Ù3}ßR¤³¦´›ÅC%­ËÞàÞ…쎅HrÐ !½fxPô€¬õ®oz¥“Z|es ã9Â. 7ozÌËc7+~½‘S ‡M3\ȧF.ù‹·VMþêFî²ô˜nÇ<ðIBš¶3 ÜœÑÒ³$™°¦uZV¤P )2ðÉ¡Î}kE–¢)̳"ƒx‘ß{çì‚+œ+ϒʦ륲TþÿJ¥ráxÿþ<œ,ßúÍ›,C ,â)ìe|^L½qúEÕÈÌšûÕé žKé…xY‡Ø»¸ZtÌxÈzWíÒriM´¼à®e ´û›;|`šd)¬(Z1ˆ5cE )dI=z<–b'@Iê„Ô'é!YŽI`ÓŠ‰²æ¿~-ŠiÌó«ÜÎKqXg£˜”raÈf ¹ŸžÜ³s=XZƒîÖp˜‡óãwª…£wK±é›~Û÷•ºà©9ȇÑS§žXޅ등¯YzTUSAÿZè™a< íjZ‰®Œ'Õ|ZËÔ£†´I©`TÊ,=¢YÅÜAÀ˜™™´Õå8ÐÈáäãÉWžj¨«Á´Èóü«'·åL©”¾oU 3Væú_Suœs­ïzh$e*K4òßëýÊVØqdCÂc|”&cÈžhîxõé°ÓëLF=Àßí°ùaøÁr–ªGb-F¾þš!“ö»•!L.QdÌ+ââ]‡G÷×A–ôÃWœ¤Ÿ…ãŽf7ñ^¶¦ye?š@U•_¼¥¢Éeª’E6\vöù1O7`LÑ »¥k—D?²\•Ù’…¿\G† ]0ò1aødí¾/¢Öà·TÞ¹sGÓµO÷ÉrP•Ût)¢ÊºÚn!rØq°ñµbdF‹™RZ/Dí]¦uÜšJ5Õc7nÜòĆ›Óy¶ãÏŸ¶µ|ÇËP¬(€SóôyNQBùB {¡ÍÇ/K·ÿão!ÓhìÉçý’Ô>£Ã>J@ÕSZ1 ³šaÀÍ¥a ù|‡¦F =aùRg~Ù"` £:EŒŠ>qü§ @R™Ÿ_ÈÌPæç¿Z©X*Kå—Yõr¹ Çx<Ži@‡À0+؆Õ"õûwvhJdH™Ï )QÒ 8%%#MÛ`Ñ1ãaÕj*6£ôªÒþ«9àãiÔÃ\ñû¿ÝièEõëZlFOïø-%bÉ™G>$)¹è³ÏRo¿¹wßÞÚþþ—gËG¤¤ÄÐÅ »İؽ}[C©”QrAS“Õ¨ ©û!©òG~þÚ.·‹F ³ÀNðTøå7oöhjL“ºRó9ý\n}VÄŒC ½ÙþÝ¦Ô tµ·½uK»D¼F@x}Ãò?œk®ö1”0Œ ì[YKjùˆ¥€ÐæÌnEÛ+«{àÓR¬åO<”ÃËxÔD#ÎW_s+—žºÓ¥iIEOëň Vi-æ»Ué¨\Ș^d‰FPA[B1éçÈE·]³\V†œd„³ñÐbˆ#£”-¾Ðr˜ªÀýQ/…Kôn»ãi£—7¯q@›ûƒ@#Un¶vaìÀ4ï¡Ý?zi9™àìAîÇ]ÐÏF Ѵ׉Oï¡§íGU¡_D¡È„Çé÷ð*šÁ®:àZ†úÓ±•d’'i2‰lN›¤lb +CŒ½&£¸”5Éç}'[ÅzÆéÅñˆf†_íæßèÛ.ºõÂA UjÓ?¼’©ù®²™„›z1YR#Òt DòÓx„j)þõ¾§$3xc*Ö{d+ÏÑ<ǯ[ïùâzL5Û®\ 6­tðÈáa˜SÇ[¤b*7•ºwï°í2d œŒ–OÎٷɹ`I8±ÅR€Ï´ð­’459wnÏc«(æydû ³¢1ÈÑÿf’Å‹¥²Tþh¤R©”J¥]»vQ ˜ $ zm­ã“¦VeIîUòÝr1nja¥è7•.e:ù•uHÍ3²Br ”M‹÷ö< säYrï³ëñô—Çt34u§ý®y$X/ÍbâQÇ”3éØº¦Zà"QŽÇ×P¯ÿ⪃Öwúye9§lԊѲ–RóQCJZFkIšVçÇ…Ý 0hÕj/p(²f7m¢?ø lH)£×¥K:tíjò$ÏŠnMOÅY7e¨'~ØÞ´yjßøÇ÷[nÝè1å´¡Ftbº(©qKNÏhÑ9#S¼+kiH׆¹ü &÷¬`(^Ö¼Ù}°wÛÇŸtr0ª¨)utƒÙ„ Q•¨"u©R7@K…»–häA•# ªƒ¨*Ç,åìñ;É8E†ëH“A˜‘ÀÃÆ mæ'i€ùóÐØI&]Ð@ù{% 6º\À6ºL r‘úî“5<¿Lä½›<ôå7ØÊUfÉþb„ån^¤}qV ㈠{àéb®p@”XÜÈé¥hìCÛ¿Ø/ûØ&Î;ŽGŠd)ÒI§Ó£ÓéNgÝùd'J)+PmÐu¬Ûxk/£-då%8ÁvmÙñÉs„·v/h0M•к A¥v[Ë:ÂKIÊ´VC *Ò*-Pˆí{{îÅvIÌíwöTªI¨cR!åÑO§ÜåüÜóÜ=Ï÷ûù.®«¼ß螤<0ƒùÂË9`Fzwq­¾ø!à\¿4uþð7ÖÌñ2(ÎB@ -Ñüºgærñ€‘¥äd0Ãâ4 d ¦¤#Û¿Œe[•!›äsÉ-­381€ˆ³ù5Ë—±ÅQt€õ8ù"Ëéï?%À>åXR`ÄUO/ܺiö¯· _ßGU@u âeƒè‘î(bxJ È‘­&!exÛ ÔÀŒ•Kéþs[ZfÔ7‰~!è–EÌúµk-lÖh¤2>>ÅV1ݦۤ5€ññ1øÃ²¬¥K—RÅqœ€‚~J\ötèêÕ¬iÅÀSÊ8k©Qg ³Sǰ muwg´áö2NL9füej%;¡äº-'ö¯«±–&F@ƒ‘`}ðª-—2ÊMæek‘¢ÿÜsðãÄ g3žìÌ0B€öŶþðók‰ƒ½Ëüˆ^:ñÇuÖ@ÐJ¸×Ñe’”Þe+@,‰c¯­2õ~ŠÛ·kõ¾­S‡XÑB'~Õ³ø¶ÖU6Ò€¿;´,Àˆ˜ÙÚ:×4zKyÛ„£y}—µ­¤ª¤UE6¬D6G,-á ¦¹"N¾5bÆ‹ĺnà =÷2 “¡g<À°37 ‘R9Z.ÈcÆöQµ½”ÏÚZ+@DÛ@Ÿ–¹Í‹°f¦iä+\˜óF;@zøáy1]=­’É)€„*„€ ÷WQ¸€.ž\™íÁ…a¾`å¬{‚r?d¼_Áͧ%¸íͱ‰j!èŠe—Ìäl¬ÿíNd¯™aާyò[ÍõÕwExÕß螦¦î=°îÉ}Ÿ¸tˆ шx |ö€®*«œ!<<ë—Ü>Á#·÷D÷ éÍ@n€ú¿’ÜóÌðÉàî0ïGGÍ p"¢êy†œª{õ7+ ·2Àº1tº´c…‹Ú ùÞa¹L=ûö_Ÿïì\°sÛs,ÙÐÈAÆ÷òîÕº³ŒîMÏA-9’É Zâíh‘ªëŠÍÏgK¥¤šÛ6V̘…¤]HhJ±Ó<ì,#Y„Î 1GÃ#Lï‰)õVøv1ûé§Ù§–° Šððu(ôÌŠ•†¦xLr·2Õ¦1ݦÛÿß*Õ¯Tà8q÷^uÇF'&`…}tyѼyégQ¢Z×6 vÁÞQraØMÚ­è×àÎàn_®{ÿRÁ‹S8Ÿ,ê²% ±3¢hÄí‚ì(ò(wî(Ö2޹/X I[M;úvo;v¤Õ¶UÝòÍ!æÊåv/­€iiìY[æiGùêòœWOqº6#8~(â0VÃŽ¶+=nw̨YHysÑ6—-ùOÇ7?þbÈ‘ú-á<1‹¡$‰k¸òI+@1Ÿ˜ÀÃè(éò-£çÚœù… ßô“!‰fûúÖëúÞ×~¿òÑ O¢›XBxjå³]½Ñ®áÞ¥Kˆ&$IôÈÕêè˜ìï8Ue©¯j ªK³î‡3_%.€±>Ñ Ü“ås‚ Hˆüåfß÷² Wÿ`/ ýô»À$ˆç†š8A ƒ?Y¹pð£¶V Ž“Í«=Al5YÂi¬v8f ë²’K[ffÄìÆÊžWö?)1¾%nøQÈЭã÷­`\à¯W~røzäð/ p45‹g޼º¦lvÛJÔRâ@;Š×°®e,5=b%Jêž’‡ëÛ}·i„«Äçwa%Q´#ùkÝ­+ýTA$Ïó$E/øvóà•¿{:>vI*•‰š¼U&¦eº=m¢ºvkõEƒkc¸268xa^s K0Až ð ì­ddáðõCîÕÔXÉ”Õ[±Q[.ãèd»I@jnn Nl£WÉ¥ŠŽŒõe+dbæ;oÛaC}’Åm3keœÀù0ûõ¯¨a{4dU±áÏ÷n\?Ÿ£AOh?b¢Û×õðÞëe"3ªÒ:þŠ“@ÕÆ_ã8Ka%fkY ¤{‹F®{ÇêÅ¡¡äÖ-¡@øQ Î$ˆ:‘ð¤ÿòå—4¸%k«a fw3=¢ÅÇŠ=7nÆæÎ%–øìZ›í$uSþàƒØc3ëAu¬è§Ñ\É×êçrWã[ÇÖêà4ÍØŽì”cÃ$Õ4|Eõù½D/’|" øIˆ&—Ì Ìæ(Žoa|CG9÷åž•ÜÚ=ãwO3“>ž³œÛOºg)·ßïö#÷,P[=Eî9âX—¿‰n@$ÍðÔ¢£þ9øÀý÷3î¹F÷]Áýàï›9!‚ |¢(0ˆ›# ïßzÇÞm’ØjsÔî2–-àð#áXá’UrIU٤뺚}ëøæï+)žÙ2’8Þ·f~ íƒ=ÓΖqù {Ñ—y&{¼æÇ¨s;³ "ÃÉ>‘%IB+—øúþøŠi lm½=w30æ$LÒoÐHÌ";œÈëíV6:êtýáċ͖$qÖ÷¡×;m¶q¸›Í›–ªæÍ÷‰—?ëÈ;Û¡ú,=BŒ°eµ•ír=V²£f—K€9þþ†}± $‚hA#ÛZ0A%0…{ð' šìake‰ɲ‚döÄñ@½¿«0Éäää}m/ÕQÓcccîM…Ÿ'éäÄćïàCHáyIðʨ^D³~p=ô2+Ä™–r!j-¶tŒˆ‘Qê+íuF£‚wî+SX·H^<(˜A-£<°©Aa‘C<ÿ€Vz@Óa­¦,Y}$P ‰»v«\kÑLØzØõЀ&‰\ºØò@ãý`@D–ûŽÏëÑ1#2ÝýWÑ,©ÐˆIâ–!Z–.[ÝÞ™J=ûäRÑ#ÖìÙ±Ú¶CúÈÖ/§8Á"íö®DŒèk^ûÕ“ë],Õ"?ò‰7w®°ÿÀ,c7@K.«nüébEÀ-ûÞxø HÃÔ‚ q%³‹haÓl…´ðÇs9 »¾ÌÈ49[ Þwl˜¡¨ÒÈ=¢O¢§y÷Úë§)/íC.™œEÎé::¼öq´Ÿ£§9šžº¦¤ßOKEÚS‰žá]êH3ÿ8\W/ÊË"EÙÆ‹¿áh/p…2íü)HȺÇIó“°Prì¦B-Xþ`£€|Hf ê½HBHìîXBðb5;ÐE´hÆ@Fq\‡âű²ÝV2¡~Û³7š°LGž{naÿÀf'óØ5J»º–3(b}½À;ô !±ìHbx õõîU{w­=ôöS7®tŒ9 œÝ¿ Ž’¦Ñ ºaåÚ,qô¶ÞjçTÈÿá{Ï/là9†ñx<<7O‘å LŒÓ)ƒI«LRßQA‘ññ[pu_àIzôðY’‘9¢Ñ_óé…±EG-h]cN—~3œ7"E' ]ÞÆ*ø+ÿJBî H%J¹X™t‚Åè?³eŽÂ µ²ˆX*…ó<<¿fx¸Õ²â[-Y* ”ì»S—LW:LÝýÑÚò–ºgç ™«•T9ÿ`#º|åç-ÅÜ´iÄù ª È D†l3í8ë•©©Úˆ:8ô¢Äp ߨòÊã9=0j'- 8*Œq$´uOf%Æûç“/Øöž„ú˜Âr^ÁxŸÂ5<½ÎwåR±â~á[Ëùãêòk×·˜Ù(XÑTó8Q4ãDß ÊÐ Qv“Çó8Y¶’Úõ–ñBç}džŠ*Ü«ûst@ g4˜)Ýç“fé ãâÇ)Þeƒ^Öe’>ž¦¿†-±ô 8DSÀ ŠË 焱”ÿ…åÐâÀõ‡œ‹Is.®L3ÿDDû}nZ8o?¢g!€,gôdÿ47¸ž¯C ’8°c 'û¸æ á“O·c#0O²-e3neÁï„ Ž@=ŒLФÆt¶fàf¦Û)´-hàð‰ã›|ˆ÷ ^…m|ºúçÕp`ËR[3[ôúyo½T»ljÒ&͆C êXø\aý/?L-áØM87ah¼Ý X’Çm® $CWÿ2ø‹‡¿Ã‘Qâ¡ýûÞ¬øJZåêø¦ À« ‡eQâ9^ÉæÑCs˜¡t !ç?ì—l×Ç‘"Y²d=N'Ÿît¶•R2‚šA5Ä@¶F€mUº²MIÙ qœäðÍŽ=Ë4)ЮڦI[™6­­Ôn]µª:BBþ‘²Š±MʤIí‚P ñý÷lj!qrû½³¦JS)ËTˆ¦åé'ûîÝóó{ïÞû}?_7¦Ä¢qôqÚ K;FÊn’ (ÿÆ! é â†)b£gjª'Õ¹‰±_¬[µ»©®®ºš¥£<öïâµÂäÉД­Jwë|§`FE3|5ãJê­D¹ø‚¥vrïÖõˆA(Ì:ÒÞª«ù¢±h‘W ¤À!°n0~÷\½ÚÖÿÎa}Jœq’¶%Ý,¤ õñ½×z×>©MKÄm-'ëùÛÖp¡©&âŠw­Þ·ÞøæÚšÏ£a´¥>øîÛ_»öAcpRÝE= 쀋¦"ÙF—©ª$©T'³¦œr°†ËÑEÞ£ò Þã’Ä2Ü+(² }!9(Äz(â“„¼>•i@rÑ’±Ð}ÏPØ"42Èx#Ao,v._Ã2\8T‰ðµÌŠ©7TXoŒòÛ,²ÿE´. d¾ƒþ Ãa²—Cç\¿iu„G‡ØƒÀŽpÖ£·ß:$Oålóyåc±6Ç”Œ©Œ£g ÎT¯¦¤]»ÓR–ÙêRɯ\y®îaÄÓµ<…vo‹(zæ–’}¼‰¢ øÑÍÁ£(Ã=º.4q3ùÑDªiëêZVˆ0hm-ý÷?Ã!ÍÂ!%©OËqÊÒ+ˆd)RÉNkZûØåd]u@àŽg…B(“NÏÞ¾LRž]buY.Ëå?+ Ðóe¸¸=Sʦ3€Ö€"^@¡ØæÍáË—–ÑãhYGMM «â´)Zr—£e ÒÖ2p.ôBÂ5ïªòŸcTtD¤nAÊ•ÉÎ/îXÿH¨©±~ÚHM¸êÊhv|l4AÓf„ ¾|â«:|µMÁá½[箞öpô^¬äÕBóì´ˆo¥]˜¦.žýí1ž—ÄÒašeÐøx'6Z;xb à_|©LÆýÖđ-u|¨:ˆÞyí ³ÂzNÃ=hD?ýdƒ¬qup@¢®§®OŠa1ó…XnwÙ¸ÍT2Ø’&&òû÷Ô>¶_øÕ«­ÊTït1.O%=_Ô»K…´ª*bHh¹'g(q¸¶Tò⠣݆\ª‹¶™VGX]4eý¯Ä2Ü#†}È'\ ü¸D¹ÕîG„ £Þïõßÿuëc½a€{(o8¨Ÿ­þúš+°|$€è3ǯ_ðäåÅ÷)ä÷Ïé\‚YS p ¬õÀ$À]£”üû†–]Ärx€Å£ ¦:6]ÿ0Yr³`Ðf´Öi8kfNVÚU#k™Y¬t•Ô¼«ô‚‰0&{~ý‹xíš*Ša¾¼!vóF›¢w¿|j'bbÌ:ž­j9º¡÷ŧöì¯gw˜È™×÷Ø».F­Š1+9¾ÒI¨Æ”À%ð@ú…p H=±WYK%Yz»nˆï_éjÜV ("°\„(„¾—ÉÌÏÍ,,,,µÎ,—åòI™÷¼Ùùò¼]ÙœB¼¹²W†»ïXgG˜®â¹• ¨†ƒMU×Çs%û8H¨'VºA­lC¼ßªášiSNa3å ´­$MÔìvS9eËÒœ}Ä•¿cë­ØüAã8Å!EÁYðfVªÎ ]íqeñ¥ž1v‹h±ç/¶*†h™m%5·Øñ`ýyÛMìÝÉ Å!F ªìn­”m…œ+S[ -Í^KIÒ|FWŸJS{¶×Çè€@q B¯¾Þ,;ͦ™zró ÷mÔiZ{+öôÑwϵ±t”§V=±·ÆI®s•ö¢–Ǥßÿ÷r·0µœ©gM=á×ï %Su°™Ôµ.Mí4 É4³†žUqV6º!'@`ŸÍ`Yî(bÙHMËIà^,K6ÎFÆ4²¦Ú ùl&ôéê’«¥²ŠrZ× 7ò×Ä0šY¨t4iF“À™tYñ’˜äjÀfò[ÅŠØû%–ábl` Zá\Û>?ôApo˜%êC–"* ŸC¾ ú•# Ô•§´7Êqñ%j@Πè× _I~Ká&ý A×ü–•[@ hÌþ ("¦¤+¨• †Q‰ÈÐdlОèchéq弑°7‚úÃÞûäuœî`XayÐmþñuaü" uA ëséó[Ÿ!ŸR.ÂÊ3¤Û1¾Ü_÷^w ×G:†‚5l5b·5Œ~W±Ú€íaçkZü6ÈVt•ø¬ÑfÊy S' ®¶ܽâO£-p(L»kµŠE¤Nÿd»[8y[ÍÕçâ‡7ÖrÁZ¡Fà‚…b4óÚ/ØÎg¹¼OÍ'»¿ã!Ó®b CK^(ßñæ<‚%¾÷¬d~ø*/,ÌÍÏ/¡$-—ÿÛ8¤\®lKŸ–}™›ïèè³HàxŽâx:и¹m¿d( oKÍÀ·Ûû­n–w¬œbÛHÜvº]´)U²ò˜8‚¼c$J8ë~øñ éÍßìŒr>)QÕÑ0ŇÑ+§›õ鿢™.zŸ}ê¡(½J "µšœ<޵øA#¦"Œ§b,æ b<³âÍßr°kbÈRi& I†›,ΰÝ+{|Â9ª ämj¨Ø(‹˜ ɾ›…îgšŽE¸ÆÍQ͈߱ çèzâû§ö±!.ŒR×&ÂHÚÑ’‘¬Ðˆa.`,b 6‰¹ö‰£¥Á»e³õ8°+ðVr€mXÏÁ2ê>$@æTºlM,𢩴ÍözrÒLY3y §,œÖ§ÚíŠ 4ÈBÂ×Õ´¡u[fN‘SÁ?` ±*ÐéM—°š”oø`ìÛÎ>Ówîƒ}-ƒhî?ÿìPß·.<½gÛ#€¬µrm8ØwfãÕŸÇþöʪ¿üŒúëi4þÓ²_î±QwÿÉÒI+­F£ÑhV³Ú½“_Z^ H´¢¥Ž˜gKhh^u€¤%øl|Ç]Ïöé8Ò@1TŠª¶Q«Ð§Ò¢”Dý'Û`lh”¦UT©mÂ#„‡íÛ½½}ÝùlÒØl³—´R¤ !‘ø0úy½Ù™½yü¾Ÿ¯|éy©ú2N2ÁÀ#XÈÜHÈ'!œ€H!ôK ‘‚€1c†X(aa5 ‘3á <…Êð Ä9&¨âT§kÒ)gñ‡ hâ)´|JmÖZú¨ÍYǃϚF¤`( Ë‚Äúñ¥ch %:Å„à™ÿávæHà ‘òÎõ{}H#0#’àҿΛz­ñìQ­õŒVÁþ`L)^°@þÍ/ôkàívxnzltWÅK›W{'ƒàP¬B;°1lß>~l]¹”óŒÛÿ~31ååŠV"³g…Š8å*ÅË—sÇÜo[™’•‚‘)^© ˜Á¿Ô²ÇÇrëèh~çöeŠ,G©åÒ/îÜþøR‚#1±ü8üö^¾bç¶}kn‹,]<çÈó­ Ë ÷ ×ÖhßófFübo¥”…([½¾H–ñÌtÕÉV­TíÌä„Ûé[]n1Yõsþxb¦"Žåb¦j÷:ãéI7ï™=“ÌN.+Ð<)/íŒöŒ_Μ|t¨ÿ‰—µõ^Ýwxsªû¾­›·lüÂÖM‹V¯œ_¯ƒL F¹Ba L1U`=3JàW…RãsPDUèbBë#-ªÖÅÈœfQ(ƒ:¢ePO¼C0%H“# ¸¼þ˱GVi·Dvo‘Çõg»´ßuâןmxë§Ìø=h–"@E† *ÁiU¨Ø HH, 9’C aâæY%¤ œ Á0 Î…²{R²{–CB!{«Œ Q .éìãÁgýr0¬'Q0äÆ2 )f‰*w¬åS‚Iðg"Pd‹‘¼c]Ë‚ûÃ?r#LÏ_°ñZ4óHÆuàÄt¬ÄOïúŠmõZÆe7Qus¥bº:•ºv-[vÓÄ*^ ZáZrfêm$­ÂSÿúÇsŠõ ˆéwKmà¼`;{u«F±†ëUD{p™çæŠfÛDéÀíæßË\¹”Ûp?ÖaKÐ,hiÛ¶oÛV)ø=j†´& wËÝ2+¥¶'''‘ÀÑsÜM«62Á8ÂY ˤu•výòÇJøNÊ+uŠ€Ãsê[€ú ×êü´ÕÍ+‚¨ ò-ìw&Ü,(¾{=9åu›füÈ «ÁZ ˆ®saåâÕï…îñë©–{4.«:×ZV(E'o»í–“}õ•¶ûWHÿÛnÇÎWœÞJ1w»ß3Yìv ñj9uñBîK lˆ „ïÐþ¯[NÎq^±§â­%!Aò¹EêøXø$ÓH8NÖrÓ]ñe*¸.™ê\ýêÊFH#a«kÂíñA” ™=O6¿ôâöóïôÙN_ÉJxV|Òíòž†~ £}¶hÄ5;åš]7Ê™ª è¯8]@#ÞXÂ7óe+¬dâUHÑ%A˜oðzÙË™FÆë~søáþ?=ô㾕û÷®ÙºeQkëÂæ&ªê*!’JNå‘b$Òˆ#@ž S< ‚?¸V óÖØŒ¡Baà š¢ªXÒ)œSàMÓ0‘˜¢SE Ú€Àõ"ø¯0Y¥2á\&@4€)œÉH'tžªêH¦˜4êõDß 5q©e]wÏ?T÷“]ò÷²·~®½¤|p‚ P9;¥*Š@ÐÍAL$C8<Õ£â8„‚AIܪ=ÈÁaÌ6ÌJŒDƒºøù#øÜsl.F*oDÏ¥sÞ<"nÃH ¦aMŒÕëÃ48Å‚“áÔPSðSôè¾/ÖÓˆFaIÄ(ÒִзÿÝîùªó´çîk/O¤l3îYIØæ²YÆk‡DZñÒårnùB™3kí¹Ÿ­5йòÄá »¿Ö¢ª|‰ðo®Y|õJÞ2vܨ´O>1_}R>©”r%kÇ•÷:X«Gi½Î£œ#Œå ëÖWüòn¼_c’šÌÌLϪ"Ý-ŸÓróæÍðâ0ÈôtÙó7®ß aµžkšHâ‘xûŠwßÍ{nºb'€üRÚ³Ò€"åRÎËnòÓW·P7ÑW);åïßaŒ§\»çýRÞ+&?ñöùü†ÖÅœÖËĽpy÷„6àpÿ.!Ó(ã}Ö9v²hä}¿·dåJvÒ÷“Es›7Þw»ßóóŒgt•íNßîûõ¯6‚™ShlI³táBÞvU¯·êd=3ëš=Ž»ëÖÙF5Øÿ_ºÎ÷ÀOYV€dOÇ*E®'¤Žs®-Jõ‚!ÀÌ.tVÝ´[è³ËÜôTsáI»óYn¶hdÒMWÝLÙJ‹1E2À“ž“+»O¹Å~ºêg­ñ´k‚[Üg½ŽÓs}4súô£¯ìG}kÛ¾³dóú… zÌè;G0CÅ¡ñÁ §É€QBUª.4p0Hœq(QªÄÔ£s)b#,б†pŒJë …KUÆM×ÔÈh³Šè‹2FAQDDK _Â)Ôl‰E‰ªaÇÕ5ÌM@w¢„ëˆhHpQ”ƒóŒ,ûP@H޹‚ìµÿ²_ç±Q\wÀ+Y²´ÒH£§ÑèiF3ÚËJs×€6N1¤IãìÖàlˆmìś킡”)&PÄŽR)-mÕÒ¤Á`lL[)=‰6ô€€½;»3³ëÝ5¸)¼~ßn„ú+!þÇ£ŸFs¼ã;ßïóHn>ÉYb/-п¶bî·«s»}Òèzý4½uð€Lt6”Ç}2¤²ó*̬‡(–ÙE)ƒÊ\ðòV2¥Vœy<â@ç\ ÈÝ êúå¢NŒÇ(õñ›•9ì}•É@nXäk4zpýÞ€‚#:¤lPúŠXãÛ]RùÆEùÊ[‹Ë©„äzU ”Õ5y~¾ö«Ÿo·Âþ”¸ð'­Ð„í·ÃHb¡ØXÛäDó;×â8±ÆÛzº*O“Ï\S"5Ï­ JW•R¯:Ð]¼@Ĭǎù&ãþ”[›F»Ï|öc<ò¹¤}°açbNyù]’Û“·îÞ¹“­³™]fpá É($¯[³ Y•e(ºäinø\,¶ßuü0¼=Þ€ÚŠ²À!n»Õ7=ìꆩD"Š1ÕæZ-‘pC<î›HùÂÖ6×Þé:­¶ã³\ß¹ó/™šÇÐ 1óÝx*öߊïK¸õ:ס‚çÉ(L¿špƒ‘qTê¼…coC~HÚûï÷y"×:>™l±Ç:2 ”­EE#ôåÝËÆo¸Ù"í©Øþ´ŠÙuÿ'{ W`òr/{d½k™Lú£–/jµ÷ô¬Ï×Q(Q‹sæzs]»3åp£kq~8±:oáø‘ÜR.ÿ-.èD|Øž)$£{ñ@Òáõ£‘V×íH¥‚áp³ã´Z–?‘Þ¸Ù12²õTOùÞÀʪ cYÉÜ<êør˜± èI¯*H˜Tˆn¢$)º&ˆ<‡Â}ù>#E@åT¼SŠ èh)zæèž²¥Ús«µ§K…gJsw,ýÌÁg¤£ÕÆá*­«RùáVãXµñjíª1m¡ßyžtUª]_÷©övÕxmû*„žM¤»J?ô¼Ñö$ÝVJ*—‘MËé“+%ó¡ŽJsM¨HÇ=e@¨Ð«AP$­Èº.áQ4Ñ zž¤ëD1¨.‰JXøS*†@H6ˆô¸*>½HhüŠð­:rù5áúÛdê‚ÂFQïÁ!ÔVœC„ïòš›9;ãðc¹Ø÷wŸ¬(ý<¯S“ˆº‡¯*‰[Ö>{<˜L4||½i÷®&–(N²$­[» AòÇ„ùtr:»Ì.vá†DþÃ× 7ž¥•!Çß´lÒ=Û™ˆpÀÇ]È<ýÃGÇqÄ—N¡ý‡]Ý&£Ý0ª[k*ÑêØ-v,xýŸ¡Ëïïzï×µùs›=`ÁE‰}¯u­Ñä]zܠ™3ÏÆÇ¾·š­H[UÅBUÈ©ÜXrí¯$$ ¤ì=†ò½3n’û~$' oI;"¬pËà{Õùš@‰¨H†.ç ¾»•ày#pkZ­Ý›¼ÜÛÍFdlÏÔdÀãœL7€[§Ê——?¨ÿÇÑðxö‚-éxÔEâ–ß?Ä6è˜N´Ç£x͇þ]¦ÕÒ¦å³ùó¢v(jïýèïþá‹›¿ZÑP÷…µ«´"CЈ`RjÂq„(ÔÔ¨)US S5x%‡9dªPuÀ@K/!E -R¤bE®^¥o]!í«(:´Yí¯!£¯ä_(îW¦Nxïô䱓õxYŸÁz½¬[e}:ë63Û ëSY¿ÂNʬGe&;¡±7 ÖWÀúŠX7e'ç°~‰uç³·ð[•õdÚ£eoæ"\¤ YOñ¿_Ÿùžy5¤ü-¨Þ½àDþƒ*½u#}aµ¼¡D]¨’bIK`T$|¬)¥*ƨá…j#¦¬c–J%¢H\(0˜F ¼æ¯çÅÕ¤k«8"7NQ6”71\85j²‹¢ gX2"ñÝçÁ#ŽK";K?~G^]LdJ5͘'*}/ö‰½  &„ÀãB–mè¾£*–9H€Ã‘Ì‘áld 8”Ê N Ÿü¶ð¸oÉ*ªbŽ—2æ4÷…š×®bJÕŽé[Êm·nÖONt¸`y´áDü±ëÛo§Q·õÊ•¦sgš^ñmÔp-/OñüèÔ‹`|:ÞæFšŠ¤ÝiG§eL—Oøt’'½`¹Îi²£õµ м$›íñÿ,ÿòúdb‚ׂ;³™]fn¹Ë#î¸Ö—gÿœ|~*›u +-«s"ꛊuLZ|Ô¸¨°¶ÏŽ4¦'€Æ ×g‡›@‘´»çaW7wÜ—v[œH-, ï*/Oòˆä•I¾L7•}ô§ú¸S³B5[ãtêù¬)\ý°9v#˜H¶ðûÇ_"jµ'í^$=Q·¦ŒÍ@Ü­sîÿyb¶/÷Ç"ÛRö„ÝìiؾŅʆN´ÍÏzíp{*pÚí˜ÏÁM§Ïÿ÷Ž;N3’U*LG;í›-ð’éˆÄöa>f$õN¤àAWØn},rðˆGÚø7­¦xÌ«¸_‰Ó…cû\;ðÁåÚcGžØµcéSk æT'V`•dEâi:[…uÕ”©GQEUeÉ㥢.Á*žEÅfí2)P¦Ûlþ¢ÞücÈkuiw „7• 2H8¥s3:;cP8Õ§q{¼AùYDo(à2ÁvÖ$:ßX/ލü ý„u°7 ;QÈâ·ü¢ñ–p·@Ë>…ŸÊÞ«7³ÛCX¯Ä·ù3À-pŽÎúóÿuÀøC@ýÙvéèfu×µòEÚ¯Œñe* ñ+2Ét§—F5%s ý£¢Ô*”FBµÐ^Z“{øÂ¥JâmÊΡ’ KfÚ>Îþ—ýº"½ã^ Ã0 à 3ÌβI<­o§mÅÖ´GëyÕ^*õô Å"¨çk²&{»»ËMôZm¡wåÐj^6‰w¥”Ò°1&&ñ¥öè‹P8Š×k-ÕdÞwg_bÞ6O¿ÏÄkKi®M°‡‡Ífv÷™g^žß÷óhäó̓ G¯aOÝÊZj~€„­\“ü¯±äF ˆdhñŽ{Å ®ùCn°¾ý[pU$£0OôºPZýç—7×-g&Œ›Ê‰A@´~«vçöž¢›rŒ/×s=V°éâtŸ¶39ó¨m¤âLœÄ¡ç! ðÒ¹3Û ;‰e`ÞHOåÛ0£óù(ªÜG­'¨W¶ÅšÅÕã(\6:y½ñàFwÂO8Vªo5õ¸c' ù×ÛŽá›XgYVÜpbF.Vt2®òò-àSÙKæõÖ›Wöo¯Ûµ}ã*“YFaE…S4QQ.$2Œ„2Vµ’ï^Ü>D-.Ú3r`ÇF1^úþ^e8¦ŒŸ ‘Î5Pño„ÐZpT*ÉBØ(!½2ÝŸõ-ti¤·–d –ôÉ” ÃJˆ.0£–\€+xÒ"8ÒƒNj?8´ß[·˜>pŸªôk]þ+,±ôÉ•^qÁqÎ7 c¾á'8b§x³Uûi³òÆWƒ Ÿ l{&°VªÒ¬¬Š«Á3‚ÂÉaAQX^bYÊ sl<ád¦îãlÓæÇ)å½ÎZš¹ÈÊa† 1q2ä'æ€JFT2ÈÑýë< ²rˆ£mdÞ3ŒßxúÍ'ÎŒm,ó€@†Bþ Ém +dÅ Ã5žYÅñ¿îˆÁà‚ýÀ#þ+Îú&K÷ @,Â’ÿ6óþOÖÕ×ÕÕ©F`5ªº2TÓ?¸;of&ôöI;e˜l/ –‚Ó‚Õ‡g'üuìÑÖóæ¿qh½g¶ØãQZ~½”mž(¹€¤ä&¦ôcFæý?}g×Κ۷žÏ®u²XÜçêMžž˜.¤òú‰ÉB2o&ªÑÃëU¡JÆs%áÉâë_Ü2Q° •™Ç ™—ÉìÜZ…<Ýžn‹°áAšš™ÁëL¥277‡=x™™Æ`øÀ,hR„gåˆ7}™-}×Kä­žóPm$\céSÒ9Ò̶Bîˆg7z8º•ví#P ÆPrÏ´%_Ðä*ÔíÕ­ùàóÇF–…dMáV|mçÚññÃ¥Ö+?{Iá„j>¢qËÞêû²ë¶ [ v{9·hšÂÇ5bt¨v:‡ë“‹Ùc¯]8·ñÊ1Œ&3ÏÖˆ÷Þ‹•rÉüxªdüÏiãÿà=nqÂÑq‹E']vÛpF«¢/8W²œ;YrZ=3SÔOMèmã­“ffÊN•Í„•Kè?zùtóç^ܼZà¤*E Ôp²Ì0L@$E®øÏ),²U”eV„×ÈÌÖUϲ{¿ËöëÊÜ%ĺêçµìç5 Ž…SfèáI¯@ÞžOyÅw…DíÑáKæ¢F.ª´ŸNêÀO4ÒQC:4r™£2¹¨Ðè§ ÕËe… SœizüÞh‡!Ò!Ù0åƒÞÞÄo%Šè…6ÐE®t,¬¦ E”ô¸gH ’¹8Õ·Ÿ-w®ùÃe¸™Ií]¾û9v]8  ¢ÊjD–4.(G]"ñ‚Œ+ɪ<惫ÂÜÞ/ ?Ì(Þ’ÈUÈ„#×Á_ß–Â>ôßã£y„\cH?KsyÐwȇ¤ùl L cÌA2(PY]çob– âJ$¾M…?¬œ{?zàÈ-–j ,¹ÅÑÓ_âÁÏaä£B©Cf$¢(ˆ|56"V¡J”ÍØ”“ñ¬6SÏxT¹$&& zV ü˜,§é”42ž™(åZPj«ëú¯Þ0aœÄ ½ÿç3/|>$²ËV…—¼šÏíw­Vý¯ ò­“^Ò}Ðâ<„RŽæô3 ÕÓ8Ûtl}ˆD&¤Èœ(°_¨ÛBÈ#„B¥2‹˜ áoÓ•ÙY?8žnO·ÿr›—-ž¨GSSäï¡Ût,•$cÙ¨i{üØêqóDÑiE äiÎD*AïÉr>½Ô)Yr”MÎX¬àD‹˜°Ncðì¸çÄ0ûî¾Óæ%T¢ÕµÌoîDKn£;–ùÕ;û.¨ðµÃÝ{7혌ß>wzç†Úõ^zŵ¾eYe/‰¨uõ袥¹“A‰ÀÀ\£qÜ£¥búáýÔ¦õŠ&T+|&ø¹ö—-§¡ì´^›<©†ê‡ñ»:ÕTÉmÅíΛ)´œ~"sštý ÒE–Ù‚ji8 õ-—0Ì×ÁþÌkǾ׶uwý:Mb^•ÅÇ ²,È"ˆ¼Õ0ÇÔ2MrÕ®uRÓ¶OüâóûLhòüJÒ·‚dUr‰'<æd´H:yÒ=ß8ÒËWz¸Ã~¸$’KÕK¯B…ТޠH´çndÑ”¹.qŸv±àÉ®¡P¡ý«¤#LzUÒçÓä語ÉV“¾•¤K£=ô‰¤[ð1„€7ÝßSMz«)x0l|Úí« ÿÂ*ÿQ#ó­[zܺü»|átŠT5èÄêSèx²rþ|è—™Ð{”¯o–7…9\^‰×D.„&PŽHœ"<+Š"s܆0s|+3Vs8‹aƧOFD2$P¥Üà¨CúE2¨ë!r]"C<{|stÉÓù#·k<ÔM†\e)®à(°ä{û,dÃ<§†yf½*ÞûGF¡ qaÐ_‘kÀŒO¯Aœ)3wS]úSøûåÅqÇñü…dé¤Õj´íjW»wò ¤›û¦ß¹#ýÕ­¢`ñG£ÕÜìÜo~3;óû~~>vQöÿ t¶VBè‰04B|êç49¾o}yVÚÄKF n̵kâJ%Žçv„ƒG:œwʱ‚׌þL².ŸkÌdöp{׳²X¡SaÕ’ªDG͇7[3é–©B{z´ÞMÕgSMÓñœ·3—1猷nÌJ7Õ×®õS¾© &*6ØSœ™aŸ °dfæ+¥´ e¡|ö‚ƒtwzúÞ,?P%0áG.| L9S•úeqQôåÕv²­,ý¸@Ü—óyâå¦#ó.”˜%›ÌÇ<ǹ³ÇËÊzM^¦ÎK5dSmï ¾`PQ•Õïµ?™÷"“£u÷2Q7Ù¶¯n=¢t@%gN=çXõ9Ë´íÆ¿]ÝåZ½LØu¾›Ù™Ï4Lyчægº9›‰æ½¨ CÙg6ùõÛ;ýDñS@¢ôÚ5Þ™³š9~‡“GÔs”Ó@ü‡Ïù@Swû7¯|”úd¥’øßÜ.²«êôIñÙ9㻿äó2;E9á KÅs¡y÷ÿ¬Î§¾DÙo}ìŠ6Ü÷¥U~¤|”j†$A÷Û¼Qú×­½§á䤠ŒÈn@¸¡n*ž3³¹^ª ÃpgÓéZÏ‹[ióöh|cµ3VjÄP¥Eª(UŸÙ¼&™2]ÖZ NÊ}Æ[¾ü,,$Ül_‰s8º¬äN¢= ~®_n©üÁVmkµ°D“‚2 H’&½_D5ˆ¡øÔÝ»Y{ÛTnØ™‹;$ò’Äùdr)”ÄZ~ôøñ@½ ±‹g’ ";C@&Å÷„·v‘ý* õ«K™‹‘çéœvÞÙE‘ý^aç@e>Þ>Mùs¾ýæ]¨äðSžñ‚týW¡-Õ† ,•Ç]U©±n¥~åò\@7½;göÒmˆ$üVÚ<ïË;ÑÉ\³m‡d,Ÿi™tͬvìÏ;|ýúÁêj`_HP¶Ö¬0ã_y|ISIÅ׿ÿ”1ÓÉä’¶YpŽd-s®80åEòÄüˆ•njŒ<)û¨NCH÷(‘„#ÐÔ™$åçBY(±LO\>c¯ÄDAä¹ Dyñù l-ä¸pçÓ¯ÃqDsvlÂEì$ô4Šžy§«mä£híÎ/ŠÇ¾öåÐH¦ýø;5kCÒÐÉçáÉå‹;ƒò2*†Å[µL¸ûq›nÞ¨]’(!~"¤n¿iÕá"] nkf¬yÒkqSö8D¶:û°üy)0I,oÇ ÜNÒÌeZ»ë‡U‹ç28ó”«Œ`™˜2ÁÔ€®‡$´D Ô¯D©ÝÆõýX(D7‚Ñáo™ŠcëåêèµN}Ô¨Wæ]à0Lp¿×ôz"kÙìJ,W)ÒîÅòÄѰH;.ÿLkXA1!˜¨ Q ¡*…^–„4%¤¡Cß–®´'ÓÕ¼ò.ì;†&R½'8¦ñ$¸h†(ˆðа,ñóv:4 ÅÉDx)Îȼ €bóUÌjÊRÀÓá¤~y¯¹w“öÜBRg¨v·B4¢UxŒBD ` Ûç鯡­ô3øR. ~ Üϸ~ÜØy,h~Ä O²•`I¢ QïZCøÄOaþ ÒrÖœvž+LËGød¯¯ Mè…ó 9áÿ‡Mý‘rq/Ì/Q!NðEiìò¢7_¬Y¬«ÍÒT° #È*ú2[nÞ¨›K€?¬zqðÚp°@¿Ð\p£ù¡–rñ€7X?âÔ_»}æ*@k a”9¶Í³:¼\óÐ`Ó‰þmR™BCjàÆõ7KîaÇJ‹;ó¹naú.ÌJÀ™_ÊÇÝlÌs®þ£aýjT­L  Àʯ¯­^Ü.—'ÆÇgš`ÇWjLL”ai½ûÎÏÁCˆBÀ~©d|ëmàjÂj¹å¶Ûƒu#Åf'-Ú ' Æ;"ZrA×aSDKNÛƒ¦¤“ß^p_I¼²J¥Â*…¡Ìžk†/]ª-£®=þû*¢„Hd ºB™¼žeíJ³XLä[½B­c„vòêl»¾èµYÙV;s¬ö|®ýþ¥Z *2’ßW´½üî/|‡ŽæË¡6Øà×¾ˆëÑX5U(t§Ö̸~Ün.6\ˆ¹v´cð-[ÿNœzSk­6φ3Eç%Ž#Æü$ŒE£ Ó5Üö=“0 ݆Àq´Aˆ‡×^*Üà8áý¾Hô1¡Ö^“§ ÁSÀhÊwÏF}Q¹_M„pMÀÄÞÜ£OKùî°ÀqŸYH>¾{iE•Ý&¬?0 ~ƒ2á0Eˆ!Ú½Îõ¸t$È3ár/LáGD†/.A„1 n]®òãAž’… ×¶,¢DU1…eEÕ4ETÂPÆ•K´Ùéíòp:Äû™ÿ8þsÝ«€nA€¥}éêžú/䆅Z€Å%ý2BU{AäÀ»ª…ì‰ )ÏøK™¼§Ê¿ÐýkÃ/¦"&ìR‹oE~»GiZ+- bŒTxF( UP%“u‚º1‰¾ºªâõm³ÿÞo̼~ÜÀn]@ü÷@sù/]¤R’$ØS(ÄèϰTÎbAü3„Œù‡túy(ÿþFïüÁ#DBÒ£k+øYíçóÓpÆ/Ë“à$àTç(? iËüúÛ‡ªÃ!™©”€?0zíå'ì½æYí¢;y°Ú Ùø°³×ÎG=+^Œß²›‡:kpoãž§4lB›sâÄ V¶¹dµ 5ÿõ£—5%°M±ú1Éçid_Ër8Ãá$/¦íÂì|˜O)+Zµ…lhɫ떓;6B Cövÿq †ˆ‡ãḗ19ù¿EsûöÄÔE¹<>ÊùØŸ,ß>uòW‚~©BSUnÞP1ðiû-¯ÃsšŠy@*@*¶ü i8ì´º€ï,Üt½d·»C ùín®Ñ²w \OÔDtÆ„’"«?}k£“«…]cgã¶Ûúî{›«2˜lè …²¨2pøÕÕÖÍŽ’ÛTÈý¨hG‹¹ØLQÞ±[ N‹ëļñt0.”âP¤r` æäÛ=w—›«‡ÄË6A3RrjïÛ­sµ%áMÐX9¹¸cuXÙ½ùÜþñBÛðÍæÑô> g­y/ææ¢£CõŽWë¢v6qålCtǪ¹AèÅ*W}"XÖ2)6P`E«æGÞÙ…Þ¨äé°Pp  gã}!Þ£øN¢òŒÉ(‚ž€ËþOEx¦†%<¢¢4»A!´IpÁMÌ3˜óõà{„ˆÿ¦Ã7_×>íÐÞß!ïßȶ¬P¿f>O(µð© ØMÎñµ‡Ši“Æ$|ª_ImÆ*10a‘U)4Ï”R%\ƒõAð8ÐGÖè²¼a©þÙ ÈV`Âç—UŠa }ï &Ü&å›Ò1ºqy(Œe¢†dÐu M¨Ah“‚ç! ˜¯HÚ§ùEE&`M½¾M%‘Üd©'È{|ñèÒyFåJG|{1…]¤æ‰:!QEà/ðÚæ)ƒ÷†xrjN“§TqµÎv¦ ¨R “ÝJšŸ$ô}ß•×ÎhJ@e°ipPÁ!!'Á:扟œ6÷ ~Z0ýñ‹tâ (ÄÏ ~†ñs²øõpQÂï%€kˆ_º4¿ ñKÿ…iGþÃ~¹ÇFqÜqÉÒI+­F«ÕhW³ÚÝ“Ï6.Æiy¥o ¥‰E¤iZ„†ú…}ºÓÙ>L$mš¶AJ›à~R…&ZQ(cΘÒÚ¢¨ŠZ‘()ƾÛ÷߯¾éoÖ­ÿ¨B%$"*•Ñè4·7û›ùÍýæ÷ýüz´gV- `EÅ|©w&Î"PyökRf[J¢»Ú¹¤2 HòϬ/9/­Z+Pð ܹÂÓ^ðN§=3íi8®Ò¾9ï|³—|®¿’íEô¼È¸ˆá²&÷L)3xEøsKéêAlJXƒ»'.ª*_1bÇÆœZ+nt0É„³Â屨éêL¶"5x°¾âñxùzÇÙ5…eÕ÷_Þ¹¤°™ !¤ ü–õ‹1Ê ‘ áå=;VÚVcÆ­qj<+ìà Ó¨…2Ís£ŽÅªKÏŒA‡ä?WlšÃáô`MÙ&MÁ 0QPÑÉSÇA;è c’\n6Çûœ… 7—›É=$•‡íó›#óã  îäè,>yò}‘ÇPC$A&úÆã!@‘ÉÌ!Î=«*cE=£"“…ý-ÜF4kÖ9ñ¬ ƒ¨#ÂY¯ è³OÃO¬+•8R$#ºÂjÅþ±ÊI%ÆÆkM³ÊËÄS5/~ÿÕNŸzñæG/Ûæ+7îY5£NÔKG'½ÆE#pÇ-3b™a'ýúÖ-A¨Å çË„ßWþˆaÇáù˜B°°U;½oKÊ©ˆŸµ,«8Û)·ì=ÙáÆÛéÚ¡‘Jc´Â1÷f‡kØÿ›I|t£îÕ†ukã K‡H"œ&qù"¯‹ ÁÒHŒwmPÞ«Ö­Ã}3emmÉ–}ÅÔi§Â Tµ¥˜v–Ò–í*ôE´@E` Ò$²ùG@Röz§L;ü× z 8dщjýíÒk[…gWêËtDP@‚€"iDàTNTøB¯·(þ ßW°ŒÙ¸K¡oÙ†€F°DT‘oX|ø; Zw/|k'Û¤-("yƒª„áGLÑØNØÎCÏ=Æ ˆÏñÖÇÀ¦Ì袤\)[©‡”®|ùZñNÛRðeº“üåPil£‚e9€AÔôÄf2Û¾@ë_lÃŽÅìÀ>,ÁC ºçV$lÂQŸ+€â]Z1C‘6@,‰1^'f,tLbxlÂqÚÁ¬ß+´øu`f ˜çhhìg%ƒ¯½ó]åÙå€ü( ˆ»(à/ÃÂC(H[ÖpïÇ~…˜à^uV˜ _VéE…©6({¿@@—A²%&Ö0稹Nû¦³÷‹F.`ÚçCÂþ—õª‚9…7æ/øû‰eô*ç´3vb{àî®þˆ™ÛUH!ò[å ™å$—ƒ÷(l¡~ÄÈêŒ"9ð €PŸæûë» 3“=/Ð>™±Y|ÕèÄìž]Shù?¨×º‹žYQ¨a¨å $¿ékÒ''f¼ÆIk·gìµì{¸Ê¯°"cîþ¬K¥wON$H\#ulŸ5Tå^ÆhÈ@У#K¹Æpý<Ìg׈|ró`ÙÆR4%Äs"!ø½ãÝ EfX…;W炸ÌÌ£ÐÙÏ¢‡íÿ½ÍÅ ´éé©ù¯SSSH×þô;Y%,CêÖq~i(pãFl"³ØÃ6öŒd@§¢Y+<–½*y—>b6DF¬¸“Š[CÑ1¯Îój§2“‰›f䧇ʊ弆ê§Ö-/†$ ¹hÕbqèÓWL#l›õ¿9õ´qû€ã–»na•;†(¶uëÇÝ„›ŠeÍøƒ¢ÇfˆëDL«¶çìt¼ã@ó=gw»Î~'rpSpÔ‘QçÐ}£ 3¬öŒjè#6OtØ«ôF㮕H EL3zëVcwëî'Öj’ "„Õ ÑxL*Šš"ð/nÖO‡ ¬ËL²»@jå\“â ®ÀıM§ÍmÓhè/Ÿë@´C`’×.Òf :#™vÁdž¶ùjØA¦ºBÖaõã× í‚¯!6³[™x[+[²‰Œ%1À«Ö% #Q @èÍ]*í±&´)è «Ï3`¶ÓV}Nô;v€§DLTŒ®§‡šŠhÛú®n¶-j®Ì/Dy‚ ©åŒ±ýáië¢V#ŒÅQ·¬¶ù6†=% ¯ð‚Z°mMÞL{!Ûm‹N›ôÙw€â‰‚­Éßûj±Ý¬°m´K³`°ÝÇ­•i…s@´±#‚ëh“DÛmåi‡¿t³ÊæŠ4Éôç¾#Gƒ´Yf4¸Ò¿*¬wø …¹|4Òd¾0lC´ÑN‰‘ÒÛþßת[? )øôr‚%D'h!)$T@ ü,(øª§}?’™t^âsIh‘^Ør$1eèL 1ë08ïkúý¢‘ßæÓ~Žö‹Î¯…µæ°Gš+¸;É à鎬˜”þ›èz³¨&€$ü_!bcΫô ؘ=?'ÌeMÁŠ0ÿ’L/È>lð-´‡c¸r %È|‡¥“¼ÿ«Â¿W¿zÁZ>ç˰mÞî)Ù¶F0R¤â ‘ɆUÊ?nî›4âÓnkWBñÙ3j¡ruã†Q@’ÉV@-34Xs±·by‰Š9¤ ä+AiàÊöŒ³Çs·2•›Ÿ„"ãÀû7^~rÂKxézÈŠH ^2Éš PÍÓÈ0‰m$?K,+â$”§H!Tƒ 7®ƒŽÌL³òvrrr^qfr¹£vÛÿ|ƒð˜ƒññqúo ùÛ‡×J —BñCˆ$‰äËÅ|²·:ë%2NijªE2vØʸ9\ëšÕ_´j»éÚQ§XȸÍ&††jóÏ–×ì]ÿ‹î­éÁªžY+quàùE‹DBRhÓ†¼N~ó…o—•HÒéžË˜ žQŸÍÄL¸ª&ÜÙ„›®‡O¸qN*ò hŠ;U3âÔ™f9¨ÿKÏ/—ye™‚Ôíßú'ûåÅuÅaKH–Vitu5ºº£ÍCû°M± ˜P¥¨­RD´•Ò¢7ÒšËÕ¿´}¡©)6 UÉ»§j Þº MG;c+TZd¦£““ÇÖä²U¯&—ŒæS-r”jÍŽ´`2˜K?ûïò© lYNŸ|f¶Ã,¦E£T++‹|pö¯ý˜ühî/÷—ÿ¸Lú vnݺ9µƒæÂ… ³#–ÂŒa¹%‘À;ï4á¡Í'°€,—j‚Š€þ°ì¼ègMí+¹æô¥Æô¥¦|nS:ýèÜæê§g9´Ø&î¾îµ^zó^À‹m^ºý­_¯´µ"ÀÆ0fH|ÃT•êsò¹çSɆì(Îl¿ìmõ’Mx[½d#ÞÖ ¯å󲿟ٱÖëÛFG×¾÷nÓœ0qXDV®êÝñÇò…Méx`}>³Á›¶¼éT#”  é6y“-—smè†÷Ióî‹<`ØÔ1Û¤”š4`SÛÀð"‡À¥ó´x5ýx{-‰~@¼[ Õ’8ó‰/WìôpÑË%m;ÁJˆU$\ÑãŠWTÑGÅëYëÚîPÕÃf9WK¨®rÄp¹~ñeM€Ä»ië×™Kí0-æ$оŒ‰òô!%òœ¤($Ý€Žù@ïÖ|)Bö ¬´M@Ü?´;¶Æ5,FÔ”Ýmq 0 ÞY*º,Ñ©Ï7ŒneÒ¯z$îW?9c”K#~UàxPì±t¢RŽjÕ¼ÀŸÚÊþ¼E?³E?¸!T5_‰œè–£•nYT$%"óñý ò€‚c®Ø3KÆéb©—Kv¯ ï×hg7iצ<'¯B*äùû]Ñ4ñ óZÂò5ÆqéHrq$á÷¿Ïñ½âm$1eGÿKé:7‰ŽuûRŸ’:Wö0NþÒÎ_û.Y:ÓÀmBO4¦0N(a%DãŠn0¶r9þc]üžI'bÒ@ça.Ž1ñ¶è~à»dÚlä4¯ß+–j1Æ-›QÅ<³;(g€J¦hbÈ‘"°îê2l}g!s€«•5,öjˆç§G—q£ ×,µxyeÑßp/ŽRé!Ãìƒtï²sÕ»ƒ;ìÔo#¢ß•ò0¬ˆAKôCɈ¿Oþ'Ë IÃÁhâ„9yHÃnó¼„0GÅ3\®P©à'N­ÉÉñ¡ÑóGé+…6If´é²÷üxf[!½®àmûûXS]]¥Í”7Ta¿–N¤Ðóú’n¬”óÀãËgæ½eF×g½õÉ‹ÑñÌVŒí…LmæÒ†+”£nJ?߸š?ý:ž‰Â^rÉÖ?ž¬-wxÐ`¶QJ YZvþ£ï‰ÜÜž‚Îç¼ûËÿý™ÚÁs2>>¾dÉ®RGÇ̇G,ú«O¥2µb!÷nÁ#7…0¬ÒI`×£ Ÿ5µsÉ Pìx¹èùOZž~ÂŒª©ÒˆYÜ?ðÔhr}*½ºPˆ¦’R©æ®W³ÍR¢¦Î,j/y$üá¹¶drS~¼y"Û–‰zcuy¯îÊDÔKÕgF£ÓHù{]‘úr¶ÔÅÍ^¶q||óO^ü†© ƒ)µTÐÏEa8-ç­ÁdºòJË6¦Ó5Ùl­çµfSÛ6|¿~&'Řá2¸r&? “:Œ¸_ )»žÔÏït$˜L¢0á‹GÌ–ÜìuDŸ)‰/ÑD§¯]ø=$Eãv}úííö^óF÷¼ì®Rñ˰èR¥<ÄsD$øüp€²€ 28Œ´ä7 Lt ]Xô¹€r÷ S'vÄ st¥ãlÑ]DìÓ¤Ø ûnGì¾ÍÉN@™Éਠ©;\YHÝ«‹çÌ Ì"D‡k1Úù¤zu/ÈÀªù2{q«C Xúƒ2/©ñpÕ—©Òj°œæÜ)>Á_.MB\H C™f™\Q !¥f—éôø6ýv̼Ž2@sl!o@—‹°¢CšÒ±¡¹¬H!î×Ì¢÷v–¿øÍâ S±Cú£³ŠßŠÒ$.¡*¥Ig@j´4¦Š^*:ÙýƒSÁ¾z¨èÓn¡™÷j#ÝþÁ¥³™bJBÐÜxH{¸”T޲q»{li}qrªU}nq ÄUÜ—-Q i°ŒYµW¨ñZ2ò Ôöq ¾+¯GAÛÐtÙÈäQ.”õË F5[³¬úŠ*Njÿ`¿Þc£8î8€[BZ餕V£Ñj4«]íC÷ðƒ@ ´ II I DJäb¨Š `ûðÕÆ§“ p UJƒ}¶Ï@ÔG J¤Œ1Hí_j¤†6lßkoïÎw8Æœ§¿Y«(jD%*Pÿñê8Ý—™ÙÙß÷3ìcщÂÎ꜃î2'Äýšº„&.E–GWË D>ØC çÌÏŽXËç ^ê ¥Ô_Iõ£õ*»l°äþCß­y|Ž×#šÊ\ÂEsÊei6Þ|EýcÅô#± ;\Õ<øÐ†ÜIã˜Alg°/Ð.}ÉÛY@–#Æ0a’3g_K§‚¹lht¤– !Óe3Ÿn¥ŒÛMñ¡ñÂîxâÍÍYØzÄ÷€bÑus•õ(°÷\õ”12Òš Oävþù–ËvÄo¼åØáŒ½%›®/f"N¼ ø1Óò=̼r©`6&Ph9ûᆠÍ@ÁàÞ—×<¿º8^˜.•þÃ$³ÇìñícjêsW¼òùüÚµk¡†º²ãUË¢ïÔdíÖâx0=ZKºà„gdj,˜MÂ›Š¹ü‘wª¹œË…Oö¬7±HDáöš‘d(“ßßÝýâ¡özc« …ÖÄX(Ÿ¶µ=ûôrõÉ…ö}kûv:áë$Zóé HÑiÌ&ë2Éz't¯¿ñÿ¥÷‰æ’¡‚Ý ÌËØÁë_†ŸYêÁ²Çox±€Ž®vÒ­0áP`ò^¿©±;µ;‘ØêDõó+‘F]ViU01‘æ—ôeTj\!~ªâÁÇ3TcÝ>5Ø1…{£×Çó‘ç ê¢ÂËz¼*kQ÷ë1ŸÙkNwù¿8`}Üh6­–_ð¢©s†[•º]<@÷iÓÑJ›O¡œIÃÈ¢¢…éc2þù‹Ðáíp±hŸE¼XVy&Hâéí^Ö§ƒFJ}Z©[ϼ¡ý¹ŽžÞ t ð“!IAMМÃCsA¾m\=L $Îh¤{¾ÃOÀ¼—^W#¼}å‘—MU¡ ª"X¼Áì”Îbå?^,ê9D24¥óôç‘uEõ+"X“q‘V%¬ª†ß+°¶D/ëyU›„):ù´tyÙq…Ç}ÔÅÒqx1ýw¯ya/)ÉFtžÏ€I p;0V¢Oð9áúA•ƒ¤SáÓsÞAnG‚Ó¦¬ÏϺtþ§“¦Û,}`tÖ£¸ ³||¬Ç7Xâì4ù4ÂMçœSáÊKüL< é{Œ/ƒn:yD;SkT/`ì:&>û±¨# ÒȤTÃxßtñ¨·pÑdÃЄõ+_‡@%É¢JÝ–§ÇS¿Ì§·ÚvKÖ‰¤’ Ùtp’OíC·ÓÁñth<ÕÑïÄa\{áuÛôšºï¸BöX]Á©s …ô^ØÚd2MgÞß @MDz‰ý–®þ¥!ãìÈ&€ýV¿ãvã­ëá#V?µ€X2Ѱ¡RC–e(¹°­¥­˜+ÛfŽvTñXï‘xA¦GÝäêrÃ’±ÛûÎÿ£î/3/™Åàr\+tT O2zÑ µ+dIß¼´¬Ø[Î-÷¸Zˆ** Uµ°j:vPÇÒ«ð¨ò6 ‡eÀUFØÚ¶uUãW—£åªFÀ2Q+W˜Âíè|/~pm}&D'— iðFÕHÔç§ :Å8V#°^‹Ã)êã]Ä\“t꛾ 0Ü™ŒT ѽxýRÀNˆ¤ËnjÃÁf]R  Ë’XPnýdZdŠ€^¢´¿¢ÿõW*‹iÜ!"‹-f]§ÝIub~p…½>¿]ƒ°^E‰h)ØBºDݾT•b Á*Pß݈J0Ïš{”k{èþÕÒ“ó«W<¿'…W ýµÊd×Bö®ò¿hî`̽0K@2'ø„“ÉpçÞÙ^÷.øY}À!™Eu—FÖ> ‹þE»ïÀÏE$Ø'©‰PC6T¬VÊâæ%B«R:o°?Q¬\I#Äeš†Ì5&‡vQΞ~†€"ÀÄ1@üóig€~°Ïð#¢é®¼q¥D$V€Æó $ß)Íôuû_ä§¢%ñ5§(ŠF)ww"Cý$D0t$ú~ ¡›¡wÊ.!6ˆ8Kt\ðÏ!.7ÔeCˆ›†ÐÏÇr÷ŠñÞáy– ‹¤’HB¦~„$PF`»á$ÂE§ÉÛ9‘iƒÍ×Dq»=ºc"Û’  á¯n¼>ÏÄDÑÁ?|†~õe3T!89Ÿ åR­Ûá%È¿cÉ⮺ò[ÿlÍgÃvfë=~̼îÕ;»3>V›K¶äS¨-©dð½Xµ%ù)†5¬€I^ßY7}÷.›f³™=¦ï³JÓ¬øõæ®’Æ`J:/€D±HÙ® â#û'Š{·ê¿Îµeâè:3©¶ÔX°kÊ%ÃÙÄÞt|{ÆÙædZsiXê! EÚnÝ\¥aŠ’‰ l¨º&` 9j]nàjzP¤÷d-¹T˿د÷Ø8Š;à–"´ÒJ«Ñh5šÕ®ö¡;?©H¨ój”*餀€&$MCš”ØN8|õÅ®1v šR 4ÁŽÏ¯J"Ñ¢––8/SšPy$„J 4gßcïáó9‰íóô;gµâß RU«ÕÉ^¯wggç~ßϯ‘wÉ&±·æR‘B¦_êÉtW&)ä»2~8nÉgv]îy¸ãv—Ó W¯wõ«6¬oðsÉDKVI CiÃB2…L;†KbxFÆìO„‹¹Œv*‹Ï°ŸB;Á‹›LwLÄ;‰îd¢ýo®oúA£gŒ˜U”Ù¶a0TQn×S^ažùIHô¹2†b€UBH!ú˜ÌÁä S{yl ÔžÖd< ÕŠ^„RÌ,U¾óôÕeŸèò }ö‰¨Á(ZFEµ4—1› F-Þ»Aý 2ýá!÷ýf¨Júí5zd¥E™Ê,FMsþ· ÕHÄBõ²óU=®RŽÈÓSÂñm£9t©Q©’7=@§¬ww{Ç¢¡§îÑߤn¾^‘‚êWÅþ‡™U¦ZGèæeÎ<8„1H™¢É«å÷UÕY5Õ,ÀÌÀÍ–23BÄ>„²³v¹… ‘_­F Ûâ ™ƒszC6s,ZG¸µk‡4þÒ£»šáéÆö;¨è‰2?\¦LÒOD¬V*³×W#eÒKÄsüG7Ôà ù¡øä~k~¸êèV÷š*x«–¹Ä¤öx@¾^:³/´¢ASÀ7SÖ{´ŸAS#×.©<õ(,áá‚’¡0¬¿LˆØÕ"† ¯D&ÕiœpˆÉ¹$òÙ‡ì2±`Wôr9!C_H5ƒVz¿w¸Ùºëj%¨«ÈtÈ/D.79ê 1nª¢½-<õ2¢âUì¶ÕÅ)UœT¥ON:’ '¨8ƒåD> ºèb´œÂ8ᘊDž9cš<ˆ#§Õ½-†AÄ2¥fƒWQ:ªŠ1C¼zÉé_s¢wkøV€·!:ZÈeAOW6]_ñIŒJÛœ¨ÁMû¢·HP±ƒDóV4—:Yñ0Çù™Ÿ±ð·h5pÊ,Ýaµ„½ÃÈmñŠ;’}iú:Få´œPÅëôƒá'æ(œØÔò˜24°&—ëL÷!òábü¡|²¥nÍ%Z§2á|¶Mådêá#C«,J–V-šøt;òÆ›÷®½kÅw.íÜuËGŸm'Úb¿\ùõJÇÐÈî=+'üö|nsd¼ã|lC•K…³™H6‡òÒ… ƒÊYœlÅgÁïJ|ÒÝù3HÁ—á­Û‘3ggÏÿ;‹fgg²i~¾ô_ ¯¶ÿ™mnnöó¯~fæ"4R’«ââ‘_v-}Ö'z™Èö%©sOãñ¦b®=o½ïÄz¾Ü)Œë9cµçý-ç§Ú“ñN?ÕöÆë÷>ôÀSù'â‰È‹‡›MðXªw¥î,®U:z–mظÂ5Bˆðc¿[ŸMµ\êM³ÉH1ß™OG‚ÏI'²¾à‡§2ÑÌ8">šøgs!É$›ütørOÂØX³gªR <$££[²þÎ b`ØñRÐþÀeœà×hz¼ez²]Ö‡d+'—Ü™K¶O%·³­~åâþ‹~ä­Ñ?üþ5e–YÉu⤒(!Êm¢_ç.úézçã§By$æ!.£³Ï,1@Òj‰çXi!Ra$~L—A„!ubÄùûÞêC[ø†Å[ŒŠ<Ž8ÓDÌÃÎ=í^a¢y 3B¦:n]Åï÷¸bòA@»ovyœ:×6]gÚìèT59CÂ¾ÕÆdJ¸ãPå7ë4£Ÿs«óˆÙ`PœfQ£† N¯øx˜dÏ÷:[yšz·‘&¦¬‡¦ÿä×ÄsHL—3LcÜÝt­ZƒÕ¢À0¦Ù·€˨ÑÖ½ ÏE̹3Ö]«¹„¸:õtO `<´ÔÇ'º)†cjpí™{TqОí­Ü´ŒÂ-}£½èƒG=9“‡Êó ì –ç ¸Òų€.÷ƒæW:ÈÆƒÝ«%XT †Üç·2‹œ–¦ž¼f¸ã/õ“³K©òð*òìZcëêÚz‡3U å¶›WˆÎ¼¦#ë”÷öX…ƒ|fµÔ,4lÍö9b¤¾4ÌÄpÃÜ -ù<þ/ïÚ„9ñZ!™KÔÈ Óg‹X¥Î=k¾ö ÙúVÙ6ƒœ*6Á“˜Ü¤UWUi¬#ÉéükDü‘Ï:bÌøùxÙ§ "áqB§¨ÔòW1“Çqð5±¥aNyçž·–‡–æ¬/î7»Ùüi.þ€?}ô§±6[¥x×^­¶è;Ì©ÓKË@Â`¬â¯ÕuŠ¢†ª ¡Ñû¾[‘zÙ§10œÀJ£ˆza—ÒðԀܼº¢t’Hba´_–F`6ÜsÈý¹òíÃËo¨@ð)Ñ”>Öqk¾¸m"Ñ”NµN¥;Š™ÎÌøÎ)¿k2Íg$ü‰6€dàÀÆwÞh÷ã»ÎžYãR5èP5 „xÍ K½³g¶ÅÏEŸ~òÛ•¶Í‰òÞ»Qð#“Ž¢ÍI~Ö\ð#þxËùüÎéÉŽT]Rš8yñT8ÌMý ¹¯i‰ËàDS/=Xš ñ³@dÐâiáÈWÛÿý& ‚uð¹maL_”Ÿ¯þþ·&×Q<f¹œÜ¼Üúôã®\¶+Ÿoõý¦B&2™jÏ%¢X—;…ýs‘b6RÈì(f¥½ó~Ët®û쉖«¼:—²û·Ý8žê˜ðwŽ ®k\¬Þ´Ô|ì‘~ÔÏõܽ®žªŠ§/úà¯÷ç/]M¹ôô ©x³ädÉQZ³r<Ø3;ðøø.OeÚ§2—}²éî£ßš.º=ƒ±e‹éd¶'7!”Kµ¥ÆÃ ‚Ê$ÂR6Õ4éoË%ÃåšÓ&‡— §Æ›pN2×%플eýš5•¨T¶j,á.á  «× £okPŽýØ™Í0ú¸Ø@}´L‘úûåÅqðHH–NZi4­F³ÚÑ>t{ç³GÀU@ H£ j!Ò$5Q§|vqý¸QD“–ÄMðëü8›5j…Ú@l(æÑ¤Ò - ”`|ï;Ÿ ÆÆž~³®úGÿ£ %«ÕjonßÌÎ|¿ß§Ë–¶˜€D•ü—‰CT¶wòI¸%"¡) Ç^¡¶VÀq±©°ÞP¡èÀS­–„o»³f6&H³ ‚=l] SÔСµß¡oƒiÀÓŒ÷^†p/Ï‹ Ð¥Z±¡Av…0÷¯ö¸ô‡Ë¼¡Ç±®ép%Æ|±•-š^MºË´Ë{yês·sŽˆð)ˆ°7Ðø=^„(ô‘^ÈøÅFÿd;ÈUb«ë”hcе(sûh©Ÿ[¶¸Á4=È|Ô WöÍQm¼‡¯Ÿ¢Ù*æØå57ZôÙv‚© ÌiAç‹Ñ ,ööUj!™š‡T¯òIUk5äõrÄLQD—{‹ktQýv›¾€Ay‹¨Æ?®³¤Kt3iGíxª#à—11uZ6@#Œ6ïH…»vp±oaé`Wv™ËlUECìê~Ÿh.†}Þ‚Š¸‚v;²Oõ_þ¹ùa£–鈷Ýç´‚>a×-mˆM 'XVÔ+¢>éB­ä~mDt<ø Ì èo·5Ñì¤Xo®õ/óª  ª†TjbÍTÀ÷3±'¼_—ˆ³Š8AÄ ð7'Iÿ“†8Ée‹Ü¾.ñÏRyÙihQÅ EœÂ;_°T¬å(-G +“g˜{ »oÊŸEw>ÀmµNÐÐmU/]òÐÅwÈ]P£KMêGݵªMj©„<3«àÖïŠDŸ"5é8}Tœ&b¢ò…–rLÒõb¢~Þ ñP·S_“À~¢2\sC#ï+Wø °ê³-â%†Yh˼X¾|0Îf+sqHà ÃñN!€0€@ÆËeö@y•¸Ù°yã¦Ø°ª–,ô- Z±‚úëß*þðÇ%Ø èø{?ËÕ¦Ó·ó²´®‘ù°:“Ép4v«¤È™#™:0’|ªñËkU+ž`áÔ TÑ5Üßwì?:âR Žw]MŸ»}6‘ÿžß»71}266&¦Ä§ÿ´ÈoXœèˆ²à’ùê{ÓÉú¡[å™Ì6À4ÌÞ\"œ¬º“{°†}"µ/-§q v8¹+9T"T¿ÕO=ºc¨ ‘PùÂôpc2Y“OíÌîûâÆ+‘¼üã I‘O÷ìßùý8”é†û}o>+ëXMùt}6^kJ*Mz{.RRÿªjl¸>3T3’ÜøêÛÈLÃ?®”;PŸ1Ô§éÀŠ‘tÒÈH®bƒµqæSªÓ‰-9È9ñÊ|:ß(5T—º¾s;KlHÅ÷F"kV®*2 (N4S÷Y†ÍÄÜÖȦï¢öP|`©Q ~@tx¥iJ"€'à”.š‰D^»%é ´êuD›>ÑbÅø#/™’>=ˆ68âX³®ÄX@×¼OÁ[¼“’ÚT´ÞX«ŽtYoúº_*Tu$(Ž|¯—¹¤ÉD7jTG”( ëü¢E+1±fꊠ2ãÚÀÑj~žªCf›gÓuAÑéRð׊$F[©hQÅaUü½»Õ -ÃûJg7ofŸí¦¿JE Fl嫹”Ö­ÂëJÌEšé(ÚLJMâgÿ\« s ¼Ñ+˜hÆ¢G_?¦  †š$z,Ùå.ï'µœÚ&·¡¤é,±ÞÆïvñ§ %8Ÿ­* s9ŒÝ\Ža¯*ÇvP¬6×.ºÍ[MæLø* bý©’‹^S:Lù×A È¢ªX£¬é9èBïn¼Éû«qG©)åo=‹.½Ê©>=ÓÔ9·Utág†xÛ‡½‡k­Y*PÕc1}׭žU(æOš÷šÑeKçiñI½lq]¢ÍýÐðêvIStY÷m#m–ü"½`St fK‹û³[™ìä÷"Zÿ6}•Ÿ2 ¢Æ4¬èÔÀªEH‰¦ïXÃc¿åâïc w)$ÔÅ.€«"TüZƒ~&µ¤_gœó¯#GÅôrôÉAGœ"òÆ>C|€ÿăù  ËÞ#uÊm0"xZ¿*ŽiB: çé³P!ÝÂ:ñ\:¤ŠsæT'T1 Jß “ÇUxÈÑÜQ瞥³ÑÙvm²ßükSÙ5è>(>&N+â|àú‘GV?Ι2Ãä6 "fÅO–'r•1·Îº“'«†“(êeJ‡ä– %‡¶ §*òÃáçV>jh ÕÊ_îM¥¶UoÓ&`ãå+ Xƒ&ÅçO•çc!ø++‡üV“¾ußq‚ÌCOîé!ÐûêÑlm:Q &µœ€¥Œæ@QÊ¡(€¥7šØó Ç!?T ÖñFÓcŒ˜AeAf™ôÚÕXõU.½ "ÌÄÀ»v“@bI׿âÕ©XE6J$BùáÝ7¯ï=]·¨D±t¤Ž- :‚°ê¡6Ù³ºàêGDtѪŠnCR 0á“ "]PáÂ9­`)ÀMKDl—ø†¤yÞîT=Å‚|]hT§ºf‰‘>!Ÿ %”¨”ÒLS‘|N¨ä|X FY iZXJIÓ&†âc Stq·WDé¯Ö2.Áêk¢‹=¿°O8Ø‹†s¿ö‹îÚˆyv»N¨©ÖQ ~_a‰.*)ÿoöë=6Šãޏ%K'­´Òj4v4«Ý=Ýù‰q ® &ÒÔ ( I¡¦•lIEê'â¾ñxuìn£i v}Ë AÚðð^Ç© ×55lb„ÂàØóô*oè‹ÀÌøÁPèH<ÔW˜qü‰Ñý©ˆoÆ $Æ šƒ­J9¨aý”Õ\Ü7™ª™·À:6|s{‘—q\°1_d[©TêÁƒû@pü!ÿo[:þòøåæ8ÎÓkž"Xq3Ëм¦2tuO2Q œKµ†ïøÆ£þyKO¥Èñð‡Â3‰šDä¥pè@"þ“óç*&œc±1ß„³w4ÜüLy®LUŒsL¥¿»"‚wªîò@•›¸/²Þ ¬‡Z§¦phh¡íÊ×Э‡÷îÞ,ÀÉLª9‘ð‡F›œT}4ö²ô@l¬j"îØã0ZTE6®+4ˆ¥c ’ØûJéx¬º'+š„/z·v<Öš û“xý}N ×:Ž?ké;ýìÊÍÐu#‡ÚjR­¡LŸxLRêtT2ômÑgg4Eç‚l×XW€à–ª¡˜Ù*6- Ýf%H lXtûX¡8S,zø¨A¸‹óÄ6lc¥»žd<}|‰‰“yõ—”¥ˆ(à¬;™Àn:×…î·}§XÑÈ"P¡¡ßï6£hDE—%zÍÌ™æü€ÿîË":ÅHÇ Æ¨i¾å7oÔ³c[l·Û͉‹kÖò¢lÑo‰Ÿ¯]¤å—Æ<œZ› Ñ–2u1ÆÅcŠ€ve}úíçsÝÆŽRZDáL›R¾Ò@JíÍ¥Ùåœvm÷Š>6p˜n+µÜØrÝÖQÊzõÛÊçï–JvNÓ™ ¾`c`ÚíŒcIf‡{Ì}èíñJzÁ7A+´ÿ|Øô­q¶mŠmJ`C&©µÔÂ{Öºâ¿ÖÓT\TÅ€&.q…ÊÌBòó5ø7=¿ è†Æ-“z°µ$%‰Å *sùì,0åÓ@‘ÁŒ@,qE7 9z"†±¸®‹kØPì<&ޱõI..`ŠÅyh‹³Ð+·¸ŠÄ$©pŽšü9ô~>ÂÄõ÷ç¿ís µ«LÚé<\ÙC–ì3´û,Y_´u%ܘ¹‰zзìîæéé–¤S J3nžˆ5%C5ɨo"HEj£ñ}Û^(±)ÄCû;·ÿæ·å« 9ÖîyÔ‹?Ù55é½[ÛÛYÕX»*x¨qvÜÝE¬œrý‘k¦O‚$á‡5*S7ùR!ÿx¼>®º^kÍ@,à6#ëׯO$™Hz0L÷îÍ}Áøõöló…ãüs‡oêëë¡\Â2劤ô÷lM$|±ðK“ñ–ðS ÿxÌï„ë2aW“ ><ìvBc¡½±d Øñ=7w½ydM$TëÄkâcuw>{ý™òB‹R¦LC}½›¢‘šÛ«8¿ó³Ôⱪ©Dc<ôòd¼a¡í‚¸â!À~HùØØøsÖ9:öÏ–Ÿ½½éÝ£›îŽú£Žoô_oþióôäÁèØ¾‡>‘艓œûc…M\½SåhäÒîÙÔ[NÌçÄöÃãHEÉpt;;26ZŸH¶ž}תR ÆÇÍLC…¤è”Qd”YZ[%K¾—#:¨èÌdtDí^™’˜$ãKw»[î¦<­[Æ«èiäŠ.ϵÆ7¡.\H¸f˜ªªÑå ¥Žˆ~h·A#_%D‡\Åð¹Ð¿ßND»Ím,f^f©ØU@ÑdùI£M°Vb# ãw¶àgËr ¬›˜ d¢}ôºÇ v¢—­›2œ8Ýàé÷xG{1²K ¾®˜æq…i8‡ÀÔàPËq¤¬pg‹3‹ÅIèy¤H[æ–ÁTà™>>Õn7­ÕË82j¾íx˲ìšjßóøŠO¾kH„œÒÅI"ŽÑ—'Iöoöë=6Šãޏ%K'­´Òj4f5«Ý=Ý_Åàð,8 4Pªª&Š !åU0oCí+WüÐùš†’6vQ°ÏöÙgŒB“´‘¢æ!l5€”V´Uª¶jj|w{{ç;Ÿ16öô7Fêÿ– ü“Õêd¯îvóÛÝù~¦‰ûË6ãÓãå×#öp¨RÄ‘„D‰z‡ÍßÔzãß+ýE@ôšù“³ö@ÐÜUmo_F÷V£77 ÉNh‚o"¾†xÃrPÐÞ^ý­çu®SΨ:`yˆZ´ñ2æ1 MѨ¡S›¢î#õdôg°ÆT€.¤tï7fb ,súM:´¿D_ÁéD{9pNô`赩ëðܬ®Ä“¿ô‹³|úœ1­š8Ef:}[«=6ÖA¬\G6,bйÎò¼» (R*¢HôÓykžéX"G'?ui&ì<–¦í`pÚ©>2 -êÑSmæo01T³a€™Jñ­@ž×¶£¿üŠŠkL\Xâc&Y™ŠËD\b·ß5×”j²~ªûzã *®2”/i3ƒs,˜Ð9Á?XüŽIÏ|Êå á8gK ³å&ò3„yái,.›âƒ  òrŸ@ hŽCL é!ƒT\4ŇLò Œô42ç4$Ø\7TYÀ )q2à…‹æ®¶VõTƒæp„BµÕ_üí5Éh¢æn¾9›»wóÎQÇ Ál9‘:šK…S©/·|k]u™…°e(ð*!ÕZ¶P¹~eO&QŸLk ¯·`BŠBucé“0OfRµy7ä$À!…l€v7Ì¥a:¥Ü͆G¿<49ÎfƒñîÍ^ Sà¥FPR(tÿþ4$ÑäääãŒÆ¯¶Ç±=¸õSS$ ÒÖÖVJ)cŠËlj5{2å6§`6Ñ0î6OdB¹T0› æÓG!ÝT=d߸~Ô)œwš³nó¯ßÛjñb›^‚ú;wŒ¹ÁñÑW3Ù-ÿüwpÅb“³E,åñØÆô $âfŽçê3‰º±D$çw~2ïëº ñéä‰ñ ›¨/¸?ý×瑺½È"ÔÂÊÀàžÏþP³é³å‡O&Fë³™GL§!L…ù±Èޭ˹…H7woV’·NÀêæ‰´@1cO¸µ¶oÞX⣺…m¸¡i:Ó(ó/åÅ;‰{ºdn¹ªË ì6dj0€=,â€C.c»á_"óâ>A,1%ý%5ì‹c .‚ÓrÇ*U~»GQ,ÏÐml\ˆ‰á)'œkeÉ7 y¼³ŽŸx–qŒ¨UBtåf˜A {ÖRŠ¡dºŠ-ð8†e®öù«êœ^‹uJ ,îØóËUÑaÌö?(ÒXéÅ]áTõâ#T¥„Yefs8Yd1õ~L]PLùÔ9*#[Fd©è‚¬¤¢ŸÜ;Í味Ht ƒ^{¬ÒƒÇ¡9±Å" ÛðpÞžéTE÷âT Z#¢ƒˆÈdèUEŸWv¦K&Å I;0OÎ#ÚáçpÜ?×Oè³UˆÂuáûªˆûäè ÿ}HD}²Ãýzd ÆTƒ÷q¡N<01P%¥p2lPª}Æq&:ý7,F‰¦Û%Ýlá²ø.Þa‡ŸR©r£/¬,—œõþ©E³I€Ëàž¾=†€c½TʳËwëçÐ: #ÃÇ鯝ÓÓÛðšREc~óMUÅ·OU‰¸%›3_Äæ>{Mh©ÜåÅ$Kàk·DO…ˆûåð»àÁ›f‡gæ§Hó·•Rx”ˆQÜ%¼«ú"ª¼¼Eùûy&®© àÁ4sÉ”BVÛv*”*”sÓ•‹1 fð‰‹ÎºŒfÈh`À|S~@WlqËK h2ô‡u 8(e˜Š ¸f³!M-{™Iòqƒ@1ò CTRä<÷e*yÅecö¢*®$.⇦y6]^`6€d@,†Tùï ýhá¦ÕðbpÂL—(ŒÜþñÄDcjäðX²©àÂJóȨ{8õŸðd"RH49©úD¾æÆÍýk–.ÂðžÒòòrzõê7±¯::´^'*G&Ñ^?þÝÄÈI'Ì烩dë4åÝ& ÌEù¬œ‘ Ùf7Ñs"©ÔáB¶Vˆy·Ðròø7MÝÀr‡ÁÓÞÖÖ6;;û¿„‚Tz\áøÕöÝfg§§§àf?Øß~û¬er‚§Tõü¨vYæN8—ªM3N$nzÔi›uÀ9‘Ì(Øc¼‘J×:¹Úñt(ïDnÝ:°a­å%–®!?ñÅb¦œÚÌHãX¾ö•ãëLjT1©²{Ûª‡UO:[ëŒÀžÈÔ¥÷¥Ò;ÓîÉ-ÏUaM³LO‰U0¿fËÆÊÐÇ{ÓéÃ9ç`Á %r¡Ô \:œ=ôðê©s`¦Lb÷_ÿx°ÊWì¥e[ÏÝí&Üæ‚óý‰dC&ј̈́~í¥¿³Äæ "H7üqÂ¥ŒZœ´£Èi3çb‘Ê0í]@ÊxeL@X´SOç ‘5‹qHm|Òíÿ,¬w¿„DÄ¥&Þª’«Ú˜ê=X*—8ìÔÄyëé*Ûk2D•½OOÅžøð[½˜zuRB”g—s³Ñg‰3x´kÕJ_‘jÀæ•=³½¾…ÿ`­p£ð^ ÝäQ[tØ'kÜJÍRŒ ­lòÌÑ7Ú/Ñk]m)«ÀU× Ã}5ÀÔÿ²_æ±Qg·di¥'=éi4æé=½C{øo¡i8LˆŒD‰Á½ÓJiƒ ‚¶±Á€mlùÊÊ8ÇÚ‚‹/l5mÕƒDI9Qš?H@Ž@R°½×Û]ÇWv§ß,UTå¿HN#UWãÝ÷æúæ½ßïÓç:ð¯–J7Ë©C†Ð й¿¶î…ך­·žC×›õôáE¼#£pÇ|¼OÇ| d¬³ ´…€A…Ec¢ÑÏD{2ž&„$c€àÀ}ïbBöà§^̃ö,˜I7½¿· ±XY`È Î7™#¦1[SèBšµï—®øßt>Ð ܵ‘Ïb¦¹˜fÑl›àŽÈ|ÈÍOþâç ~šñ“X0z¾èã¾IÅÐCÆwy,-‹jÄFôÅlîÐßËOed æ’pQáçiúuÄ/èB@†˜¸ œáLæKð¥·0¤eD‚ð‹²èÿ¬)¤ÌVZõ%ç™g;Ç2N¥LœÌÛPè"I†ab ¯rû¢ÑHMÌÙ‰ÌD´êÓÑæx¢&­t¢u“ñ¤œN¬*<ÚZ½5ÇFþâ"|í½²d<ðáÛÊ6-! Ó@v1Ö¨‡b–ç3[ZK"ñza c•ÉHC2^îDJÇ£"šp2Y’Ó<Û©œNî Ý+Ÿšª 6Õ”/ 6˜3¼Íä?ýù÷IižšÏI pê!²R©Ï>ÿü¦üßðÏôÄ\¨çgi~õúåüº"KËÚþ¤Ä¼wç…‰X#àu"VwjÑʯÚFß“‰†D¨z2Qy>l µ •íÝóXl¼îú­òïûu¬š'1ܵ¿d"±çöÝÚÕE¦*•=[XYúÝXxï|ÍÇ ïžJ´DGàÙÙ6“Ø?úIEÔÙvëI¦.D zð`‘Ú7i4>ˆ¶<ˆµ†îUM&8d¤þA|û¼ÙˆS ×'Ã5 =ÎXà¥Ö'‰ä‚ç—`mU¡rïvy2R·]ºT»eK¾Ž¼mT„’4 1ý[|àgRê>\Èü¼ÛâTpYX‹wPA€50À¹j_ /Þåج¯65/U|ŠñÒ/@ l>Z’?-ŒÅ¼þóh†BqÉš;VPF ¦"°ˆwÐpJôyg¿ÖéÂú%Š¥—ñãªs0ßC ¤5ÙúB ¼‚÷¢îJ7%(‡(c›0‹¸›@œÚ­þ-¦dj*U1&§|¼Ó,ëÀ=óm"/µÐSKð®áWJÙ¥fÕ9¤¥zô©¾¼Ùnw –ädàöµëÇjè™WP;ˆSV¡¦ç"ÃCÌÚµ.±Æ 1 cºÛæ}vpÁ {¬¿×Xk½Y>¤˜ŠF%´H× Íl¹%BAÏþºMÞem^)iHÙxÂ' úhâövPS™âOX+<ÌE}nØv,·ÿÔ¸wÈ?3Èx‡ÊƒŒÍáAØ4ܺ‘å+!Äf%L\QŒ¯¶A” ÐKÞOx'Ø&"Úeñ~XZ¾p¡^](Jè…ÀyxÄ„ÄÇ †h)¸ :Žâ@õt¯z¹,‘ "»©B™¤Ø™6“•5ù®Ý¥úÜ) 5JŸe¿^#™²'I^Íüa‘ƇA<à'0ÊÏfÚ *óf#B„0?ëO˜=ï}rQ6‘àYóø°«c§<ñ"1¬¦O#3"B0ÞÖ„TœSœ?˜ƒUÊÍ %zA'9D‡àN`2g‰øò å§~Æäç ¡Ã&RÄ7_zž0„Á/b~þµ£§}¦‚†P Ð;K—ŽD7„jÁ¦'ÖèD"£U‰PͤS¾_>5¹;<¶kïž5#¡šûcuÝÝQ²J˜ŒÅ¨È³›¼ee‹ ¼ºA ª¸ê«Š’În¸qrر '\1 8¡†qH*šD¸11V1•DGª?¨DKa¸W[üUË€¬„jnÛ÷î• 8ñ)øûïò¹–¾þçÌü¦ÌIÿ§¤2NÏÍÍLNÏ,[ö¨©cS3t”ûm¿ëÊ•À½û[â¡Ê©xèA"º-‘¬þªmÄkŠ…Ê'bU0îƒX[,Zõþõº-›—š­kY÷# ÑdàÚûëÖ*DÊSUÕ&JñÊeKqO»UíæÍ¦X¬<)›¯ùDGjýÓÉêÉXCènÓÌø^'ÚøÞåí«W/§4ÀfX 4=‰×†Ã[!³HFkb£MãÑfpªØXul¤n"VŸˆ”Ï›DêE–!l¤w>l[½’ê˜hš‰ÑËm%ß ´>ÿUÃL‡ôV£Äo›>•È~=ëwO³É#¹¼_Dîóé`‚P}–HN»Ô Y¦ ykñý¹³‡½ï”Êð¾òPÓ‡eE#âuOôàN]ÜÛN¢¥ƒ8ô·c‰(¶††wzÖL*ËW­Ã@ ïò•Ja/C÷˜2~D¬€qó¾çbʈš&1y'ð‘ÎÙÓgëˆfjZ.•€YaÞ®ÞÜCÁQü ùiöàIPl˜…>Þgñ>&ØkìÓKÑsÇÜ‚ãBŠV,À “²íúñ…*´Êæ½V{ÙÈDz¡™<°)—Íã°39¼‹ˆ0÷òvÊ›¢ýpQ¯,¼ÑâézÆÚ´­_%·üÜÿjýw–1lâ,Ÿß~ÑJå™{±æ¢ØFšX Ú“—9>àN¦¼+’uµÛ¥#¿Lü¹Jv‘—ü¥üvª™îÒK‘l¬ÛÈ–n2Têgçéè£ÝžŒ„è©£W„„lÀæw`!”vaD<¨‰ÞàöÚâ2˜<ÔnUX"œ@°2˜Øqð.ð^’9¥68mhŸXéV°Q&”˜ÖŠó¤­‹_ÁZH¢2õ‚ƒKÿ:øF`)Ç "Cˆ_$|X@Ÿ/ù‡Ê_Eü<´ß>æ[®+ÙÈ”<#ËÜúSã Åæk¿µÄCŒŸ)2ÎêݹKt¤)ÿf¿\`£8Î8nÉÒI'­´Z­V£]íjwO÷° ØI  mVU u·HDQ )Ø®}pµ}'×ØÆ i¨Zåeü>£TmªV* ¿¨KJ«*J[D›*‚Bì{í½|çw7ýÏ¥RÔVBr„Z1ÝÍíîÍ÷Í|³ßÿ÷9¾à!]znjtN ŒR`bŠÐ)‰¾Å³…*Î Å[wéç¸IÇ96ÕE~Ò1@òÔ›(zœš ór•ZÑT¿åVb_<îG¾J$¼@ˆË—·.D‰P+2["ѵÌG›þr­®zç&SádŽsûØùÆð-o"î{çrËZ—ÍÈZÓþî»ßZ‡¬¤©x˜H6Ñžˆ²i<˜0jIE|ñHhd!ÝšŒÿÛÕÖ eD8‘ ½bÃú‡3‹·(Íä—?|>wgpç3—»}OUô~[톰ò…ÂÊOì!¢LMæy—bŸž® GÛ³ÙæTÔ ‚ÍXTÜ4}Ú4’±Ž'"Þ¥T3*4}îVǾ'MSäy»Ó¡ñ1ëáyàtëõ¾í[ CåUYÒ¥5¹U4jvy‰À‚åÍÌ·­–?ËYo"ìÞjN†›3éÆph_lþDõ£Dœ{Yâ § ^{{ì°‚ŠÕŒφæ¼À+r0;š£48š¶VÖÂT @r4ñFç듉Î×G¿íKUÅ.s²Ê´›'*Òµ@ˆCES,=þM!ÛãdY½Gd`€ÜÞ/1E,Ê>"AV–²bƒÁbŒzòƒåW[ ¤T4œZ©ªº C.»à2J':tVðùA1÷šgÌ ÈEËÃî/Up ÑEM-3øåEpB›†@'ì( I;ë…6‰9XïSºv“ UP‰HåﵩôU óá å†lƒœªPÛÒP3Cä'5ü¤Ï¸öR%¬bŠ ýêwÑQ)5d‡ÅbÌìJì'ø ê†t!Ä`"Ø/ß{üøDÇ.õcç…•!éJN5Od•3ô‰fIyP»ô,õ“<‡UôD7RNûM†”}`¬0lfƒë² @D¶Gøƒ¿üZ¥s·ÝðÐQé7]ކ :ì2ÿË&Ì Ò~Žž“§"}•¬ ˜ù}ùyñØ5SäÜê6¢ºLr¶¾xN‚Bï~—$¨€:K»¿"¾÷}y²Ùõ ' *1v­åR¯b O`¡IBLGÁ'Øê"rœBt4¨³0=N™l]ý<} \j®`í§ ¯¡Ê"–M°Šêy` œÉ É×Ú¤C[SÄ«§”+ÄÄaâ]kx§ËÁËL8Òco•R©N Þn*‚á­ÛKˆ†[¬Híâ‚?i‰ÞlJGZm‘¹Ã‰xmH¿yÅS»ƒ{f›|§å§òT§ìPDS2xQþÎVlk!ȯÓDh=QS•¿žúL¾ÀD´ÇU¥«@t^2f:L é }Ø|×ï•E7/ ¸YŒÀ‡#®•`9³Ë`Ö%vê“E8ÉØÃA{HÑg¾È–å…^“­¸‚³Š“Œ'Y@Å?vh{7ÉNœ²!k‚È ál²ìÞ®+ô× ½È3ü8ÏÓóE9\3\WF. ômN*t &põ?«¶»¹‡ˆM'k¼2¢¶Q´Ñ7uú¡Ó}K¢“:ˆ"9A¦´3žÚ%o¸4uÏæ’¥q“y{I¡ÓN:ÅÑYC‹úÙ·Þ<©æ§yfFïÖÏiÂÜÇ„’‹2À‰Îðᱟþ¼à•†$”ëéýÑ+ŽTÖ˜Š¬Û­c)>sQZQÿìDÓzÍ)mÐ$UW}¼ÿÈ#ñ¸?~½u%å·âÞÝÕ2§€¯žëz,dùÓÉ:+\”•¶|ÉXC"Ú8‰Íûbsäùx×['°•I´„æžI%;Î÷Êv›K5‰È¢ÑÝÈ//?>&\îv¡Pø¯¢v¿ý´ÄÅ7~ös™H†®j’® ¤¡öaËjM&&#t´;›j‹Î×eãmÖÜ?Ù/óØ(®3€[²di¤‘FOO£§7šÑÚd‰¹œˆBi’†ª‘8ÒÖM)ŠDÌi°o}aÙ`Â’Ð(|¬íõÕµ**mRl0ØÔ4©”V¨¤©C)`ïÎÎìeã×ï­Û*­”?L)£§ÕÌhwö}ß{óý~_]Êž3ª~鈗&íF° @­ãŸ ^ê5)¹ò‡R×Þv'Q;eïO—ÇÆ_qbÁTâ`kdz‡<ßwbÝ›ÕédÃD¼Î¹Y9iï«ùÄÇꓱJ<$¶Ü©8Á›·êœèÏÿL¤>ûË¿‘í¡‘²^Xå¹xi뾦µK r†v%£Á»‰†4xˆSnGkæÌFìú…ƒðþB—aÛÛRñÆá­–lB%V)†Âbªâ•,Ìùè k†jï½ßfr‚CýC%·xý‡Ñ"g(QÀ‡åp‡šß–!#¼ÏÚ:é{›ÌE2ñ`Ø&žo¬"Ë ŒsüØÿ-6‡Z³Äz)– >%ž9BüØ DD”¾T€ÓšnÀ¢ÎÚ´ï,dŒU*û)Ž/Êcayâ¨4‘ˆG—ÕÏŠÀÙén° ° sd·wômpŒëQX³Â!žÇz}ü„Ü0±Äí¢ý=¸ß‘íÿ³¡ÁIXçIà4T2ÞõßÖþŒÖ ç÷}T3¿ãù^ÉN̲³‰…1—«ò¢€Ðà>døÎyMY«ÅÄOHÎ cú¸Èº½ °ÆSíÖõ£‹+½<½Çëòeòã½þ¶/_Î"Ä¢¸`m‘Ð_A>=l, KÐS\¤±6åÊë뢉è| +‹¼8ku@“ž:llZ) T"„´ \2ÁÃÞÑÃf‘š³2/+´Q˜nŸÏº®»\1W¦.OæÜäs;.³ð"ß©Ô´ŽŽ5Xü#âû"âÊêãÊ–Y äGãÛ5ŒXö“JïRŸ`©ØD²¢«‚WÍU„ÐN‘ Zì¼Ä†ë—X?\áÚÀ¹üð4ÿ²1ϧ\r.Λ9‡Ø‘ÁlX´ûq_•¼f™ªH¦¢æѬ¿¶’™óRï²Ü“eIæòy¸y—8u f‚ØrÉZˆc|t—ÌF·š3·‘3"8é&MԜܱ(<‡çYO” „äå'1Ô ,X¿ ^ÔCƒn”§®3TìºUN¬Â+ŸJî‚*’vÞénÞdÉ¢O~ŒJÂãyäð[kLŠ }꟮íHA׿”^½ºoA®hb,Go÷jÛÙîÚ›'uî8t²Õnl;ØH¦Å«ƒB ½-|Æ#pYŸŽÕEo”ÝŸ¬‡n\¨æµeà¼*–@H4lþì§'fY5+$`#³—÷îMý‡ÀùÕñŽ/ÚÈÌÌXÖ+Ÿü>P¯J0ÁBöºu;ú¦ëîLÆJ'Üj@lØ! ;xvÎxÅ£¶‘TbG"ZoߪH&ª’‰FUÉ»vÍ ÷VùTª16¶)møä·?:»ù̇%—?ÞB’pö‚]ƒxÇ£ðÛŠé©Ч¹šëTÆÓ[/ÿnsñº–,4î^1z}{Ò.s#AÇ©>}z³ŠK….hiéï|57>^«JD*“ɲ˜]?gv4œŒWMÄ«’vm,Z ͯM¥%Oƒ„(¦­lwõãé>À‡ƒ¦ $¥µÏ`ð U¡>I>õX< Ä€üx‹BÕ’e ¡“;@<œž=tCžðœ•½!Wh}Ù`!/;aÞ¶15ÖcpR‡$PîÑX‹Áº)'2XSØ‚éñ ·BD^Z翎Yõjó²f‹•…Œ |3öÕù?h#>Ö!óåëhǾa4+“ù„a½ ]­N(³F fíkÁô@ö.m†ãž°0 …µFvœ°÷•Ø}*Ï×0ïƒwýÜ6á'½:xé|¿C=ör®—JŠäñɹóD5 cM’5*z):òô‹ ÐK¢Jû šeb`E'’åekŠû¿ïû9ÜŽBž-ÚáõHTUQ iÎùúå7šŸî“]XXDØx- !°å<|ÛåévóÔvú”™%ŠtK@ˆ‚t!Ö’Q‘ŽÌVìR¸‡ðèhÆl ¾u!аÜ]¬.ÔÁ… EEA݈©+èëóóG ÷tÖ¹ ÊlH矿Æsf#ç,6$ò“ð̆¿ü@d,6€§ýäÞJÿŠ À…‚<)ªŠLC¤HxÒ/Ü­³a:Ò¦EÕün¹2ì¥agevQz‡,)dò¾DÎú¬SbÒ‡žçæÏÌ$üœdPgç(ëÇlDv†m\é÷ÐU•d$™Dîëúv4R71QÅD"2^ÞÿË’<-‡`dªÂâ€08òâÈÅZþ‹êŠ'ÔC¯?ðÐ ¹2ˆ×ÀþE~4úÇú´SÕ#öÖØè¾Ûñ&'Ò„Z êâFËRN¯Ûv-4ni§ên²Î róIÝxSñKóuÁ¢È×/_¾<Ë,–q’/‚ì«ãÿñ˜áǃ^‚ŠÜ¹sçkKžÆ`„LÅ¿è1|õjc"´£±ºDd[ÒÙVÞNìIº•Îø–I÷‘ÛH:Y¶|;]cGª¢ã&ÔCäÉÍ"×*ì›;‰š±XÅ›‡¾©Jª)g¿÷î÷R±Ê¤½5eó §ìàd¢úÖÍÒ„Û4WóqbÁÏGBi–ò ¢iD0±°ú©ÀÝHÓ¤[>>Væ&ßhÜ÷4!‚F=[ª‚ŸþæüÞx¤ôv¼Ê+@æ,EXŽj7R/r Ê…[KãF6^«÷›‚LˆLh€ÐÎWI;¦sëèäœbí:kÖ8‹s!‹n†2µ½'Ól¶RN1`t;€ª½Â ÒÔë2ËŸËûpîDΔ’Ÿ—竈`• ª±¦PùûåÅqð“,di¥Õh´íhWûÐÞ ÆÊ£” -„–W’HˆK8¨_‡'÷”@ZªV4PlŸïa;6%m¨”ˆ1ÄMK#µM“6U$§(¡ñïöÖ‡í€]Ÿ§ßì©ýƒJ #5RVŸÖ³{ÞÙï›ÙÝßo&O 2âµ° ¼+ù]þÔªaKå0±^·FàX¤vÓkÇt¢™:’}´´áË`J\n$ÐGÇ8'Õɘ5Ñãç,nY¬‚%¬Ëàòp P&S?dxÚ粉ºÌUYG+” ¨-F¬Eñ ÖP8 €pw,öÿg#1™ X F@ãuAu@á¸É+‹º ÝhÆ$“ŸÖN™÷Ðëz&\ªcÛ>&âÿè¡·œ,\Ø£q‰é7;°+Ÿ:Ÿ8yý] ,€1z50 Q s·ÏC¹SëU[§dD±HIúdÕÙ§Hí-…*KȇdýÏ0û0æêͨ¶DC0ʰ¢[â7–ÉS* e~õ¥×Fâëõñ¡äDyïn¹’zDåò¦õ(³3Òƒ¦»DždÌš§{ñ)†©„o‡ÂM˜ÜɨzÈ2‰— öÊpgY™ƒKB›JNÁ X?hfç%NùÙ²‘ó„—Ù[ˆõ‰ì¢V8få4DÖ'³ß@C`o™¬<^)™ð‚1e‰—«ªWð:nøºð‡g‘Ÿˆ‚ä¸ LÉÏ^{s ï'Œ P”¢ùEmÏc%¹¹Ü¬î8O‘ IŸÆ.C˜]0X?.€8Aœ‰òÛo®Ø°Jó †¬(–D{º¶ ‡rÙæl¦Vd©tdÍ(ÑW¯¬ê{£Ñ·³ùº-_+3ðýK*_Íxùa¯RÏ+/oIº‘mrRG5•5|[ºÚ6žê–H6”ÏÕÛ`&c+Aø†çÓÍã¹jÉf[>ø°yYµJ…€¡`£åË—;Žóß8+°Ï·Ïæ6ý/>ŒMºŒÏä4ûÖÎíD– ]„ǯŒ’ßõ5Žæ÷e‡jÆs‘{m#¹ÖL&hÛµðì;‘Üð¾ë<œ;טŠŒÙm#ÃOŒçÚ6¬–TQ¥¨bÓWµÁ«‘´S70\gGžûÑNx!t(°ªuE–EÁ=‹œ1îf£éƒðmzÀĨº ‡ëð‡;0îÌ GGêG²õ ÿ£öìÙÈmÂÚy*º#/%H sæ«Zê®_`vH¬§šuT`—ÑÖS2ÿþ=Ÿ"ë*p /ظT{‰î(‘ -ǪHKjÖkª°W‘)²þÚjºÎC7–cK ]×Qiú¸É’À|3yßC]ÄûTqÛBñW }ÖhÞ­pdÇè ‘¿œ¹ dÄ Ù•Å=o°.‹“½÷.Wº`Ï5LsYéjLQ~¢nÀBÏ€xP‚NÂÛI÷ò¨Ûmì?‚{‘Ü.ˆ{‰ÀPè™›!fI©økܽu—늀ò¸kY<[ÐH™KTÌý‰”Ì ˜†Ë!¢~µ¸gÍ*áf{ãÖEg²MêÓ÷ŸÖ{ó†WzŽ~¿º_ø2é@PòÇÇ«–H$ƒ ·Ûüü¦§¥|T%¨Ö>P®’Mò°„uJPÚÓø5Šd¥„J2%>U^É4z¶ÖàóÂ=Säwï#½ŘЅT<¶ÕàSu§¯XrqîbôöÎa¼6v-õTäh”$fE6ç[¥Ñz@0s(`Ö/±~Â.`î5vQeo¸Ú0[–rÉí¹î Â™›ýå¨Ô«Si/µ(àE£Ï+µë,B¼*%^cTUqÃR¸DYŸî”êôiå˜*"A¦‰É3ß´ 4.9oÞ¹Ü6d>—àvâ‰ùkýAà È/*Aý¿oI7OÚ{òvMÌ!nØ7ÿƒ¡ ¬RsN¶íê`ÛºÕ¥¦$©šWÅÔ’Ì•äâë»Fœ“k mtø‰Fæ5X˜Ù nã A9rN}Îìؑ\6œ³C 'ùL˜ŸL7_ÏÖÚÁ?ìõÉЭö+‰rpOpbbÀ5Y(LMs~ñø|û,nÓ\& °ø3'Nú‰a²†`Q3d”ht${„ãÕï¿×ô´ÓA.!©ðÄx$›Ú7æ„3Ÿ4Žæš³Y°ñÖë™VþÄ5ya[¥¯ ŠFt"•®Y9Ï”aÝC+4%|`ɵԬ哵wÃþz6âÀ»`7]wÙ©g¯ <õà*´v•®RïîšûÏÛÚ¿BÅ`%ªAJD´3-Ãÿ|bb´ÙjËŸøh¨6óñá‰üœtK.]~e§` Ðd§šîõxŽÚŸ\;´b |ÜŒU¿Œ¯•gà èLÒàqÀLâæÓ**ÚË7T{¾£WoêÇþ\WåÑõ¥¥!,’±)úeâ15ùÝ0¸Êœ©í|›X)‘ LЉ­‹ØóK*S§ñ¯ž”~¹½sÜŠ.d?£¬ý®z›öSƒ—™påbFlîJH .Qn?ð´ôX=£ÉÊñxE¡;àýËãÑyÏlõéXx•.¿¼ %´w¾K±£d¬«Êþ¾ñZ+Œ3hžŽU®›#Äô H!•Û—HÏmöüp½ð%ói'%DÑ4$œ¬drh1¨D‘n tæ;˜½¨sãê…*èt‡[oÒà&þ‡M©ót‡âNGõ™'É*ËöcaCÆX†¯œ l^Nß;‰¹rôPv°Ž\mp÷—$.'³EùP—î$}b¡_®ß„ A~ÙóêÁ@Ñ7ØeôB‹…EÅ Š$y}2ºú"eçAȧgÕ‡K:‚7ΧIô‘Å¥ö¯A¥ÀpD7ÿÙ²Âõ †âbWæý¥géʹ^òoöË4ŠìàB 0°0 á1à 3³ì&1IÏžõªÆÚúqÇÙRôl˜/™`ÎŽŽÞ=0<øB÷žoï ¯JnÔÓËè²íЕ‘­ßYÓ(#A²„…c±-ãf´ƒsn[ÁÛÀhY+Û>ì–pvs²Í¦Ù•w"¹3Þ>á*)¸#U@XÀüÑ_¼>C¦ga„Ü›œzl#_Ð TdVHà ìòý—pVÄË¢&qJûÎ&Ç çíÀd.jºÐôœÌ³c‘‚Ñ[²ƒ°>íqX“aÀ·®wœ@Éî*Œ÷äônËêÞ÷ÊrŸT §&UÕD,ʼ$#n×Îo¥Z¥–ùÊǰ£wÇwO”zl=èd[sù`*±ÉË3 /a·î›‹? '^2>í!9=î±ì¯†7çs!Kßèz³SÞZvöÚ:ø°œ çÁ¬ô@9ÒºŸà?ÓNï¹ßmǘ…Í‹çøº}ØKN`ÒÛ¸@¡ƒpÕ\RkNy ¸Ó»Èñ²$ÕsÜM9©ÞOÊ›¿ z¨Ô°5"s¤*Ì¢[}¤‘·¤ô/½ËD˜j>‰%$ÜÌ“nžT}B¡&Ý_ Ü·¤4žNkw˧QKŽÍªTÿúzMó2FÂŒ‡—9¬Ê‚¤ðáEÇ_fI’#Ið½Åps®c‰­V%­žÃÛ×J“COS¨’3Çê¯Ýx²º]I¨»Ÿd1ž†ŒÎ`¹j´dx´šæ ¸“(Óu›âþW }®ãA7úXr²vìȪמƒÜ˜'‚x,ùxNòóøð‹þÊ9•¼ëòâ:¢æpÙU‘«Â¼QÜæO.b2Â’+,uîIõ)…]¥FeÞ~M™8'·mÒà0¨"ÅÇ£}ÛUhb¢ý{nÃ*AÀ\‡°êï}M2ÏcrE ×<Ô .áyËsÖÄnJÔI®z&ßeÿ~fý /ƒMÆ0}’¿¾æòõÝ¥tW¥Ølè]9;l» V‡£w”PftÇÔ½h&°Òûõñ co·ÝÜyæÌ–MÑDQå5/fe„%Îóõ'峿î°õpÑnËp å@ErŽÑù¯B/  ä´›™HÞê´3ív&XÈv›FtÏOW ,=‹ÊXÜÍ›# $„ÂŒ<¶‘/ìõ`ú*$—5–4.žÊ¼W`ùï>£Þíݵ¶‚ Æ ‹-²Ðô„ÙéŽ|&X²ÃÆh+ÈI1ÔGÛòN4«·Àjt2‘ '’µ›³öÞw~Ûöƒ­M®’yfÛWþÍVà CoŸ¯|Æôîb)¤ßm)›û‹fäðÇ:—Öp2ïWacØ»GóÖ'ìèx:´þi™Š’žôKWßÛ‘·;Kö+ð_f›=¶ÙáB6”3C 6ÔŒNhé‚÷SÒ!ÛiÞ¶yœGl&‚ð£•̰xÐGâ9Ø:+XNÿà€»÷-$Š^$,W™™>JçÒ‘†&?öª Œ~VüXÞ.’7Q!î!©/í=WWujþÇÑZ—°ˆ’e°Ž¤jH¿@ú¥ê‰G·£ÏЏ—Ä´ Ră-a\¶ªÝ FÉIÁ¥§F>ឪ е„«!ñZšç€ É©ÐÇ5꾸äê€ËYI˜Sɵ7†ýÓƒÚtÊÀ:ä:L WbȰDÍ9J€Â©$¥þGlfÍd6’®Æ@C 5«¸P‰C òƒ4ú8-Á’Ô£Ûè™&rÇc¢+rþ9y ’i½!¶¬V}ˆñIOy–SVnhÒø[GϹî·a1BˆkTÑWy:×`¡1DÞ[B+: 6+zFòaÄ šF ½ÓìvlH¤N¢ƒLS  ai»½Ÿ™?¬¢&qD_1(ÓÁ2Kh’761bõ€DÐt?ZÔTËü¥OšºØ@®pä=¹Ì‘ ¹¤Ð›ù¢ü%D.‚á`r Qç¹ ÁM_ãÏw+_©W^êg¤Tåã—g± U_Z-‘÷1¤1sÿdõ"NA^ÄqH]S¯~rÎu†kÜ uŸ?kºŠÉ¹â$Òû«žû×ëîœ^ãŲ„«òx²bù’Oïìºg…sFwÞŒæH9-Á—¡Nr’ÏwN—`+~±l÷èéЯ®S)\ Ë+¿,>°qOë®–<>‰«¹ÈétÛ/f#Ål¨˜¥gO;ÝS0öÌhÖ Ãv t¸_ÜgŽ·ZvóíÛ¡çÖûeŽ9T«ÖÖøk-˘‘Êý™ÿ7U_ŸçŸœœœ¬¸6²åû/HT*²ò²zχÞ£›-SXZÅlT¬u¡éY´“¹PÁÜm¥[ï{­tôã;Ra¯­wå³@óö’ (ï´2m–Èç£+bØ]V6`­S 0-e;pÏ|rNІò­Î »-?¾ÞnûÞ~kƒ;%Çh¸±uÛ7œÑhÙ–óݻӲnm£Ìó Ë$cÏÚVØÎD f¸hî/8ŽÙžÍÌñt²äDÀF@´¼Ÿc g‘b®ùŸ¶Â•$AäüŸÝ ¬îst†]šÒPþ<6€è—{6iœ cŒ$A½ÜŒÈ1þ£ŸË+•êj³ŠÊ`9ù¼ŸúˆGR›8ZW²)à`«¦“!Äx ¸a 0¢*Ò‡çÍF 40.@*0qP™pvÐý|X@*nàÛ˜@#ù€b1Ñè«ýè|«WþSÔw¾Y<õoöË=6ŠãŽã–N²´Òj4f5«Ý=ÝùŒ]°°x:@¢@Û$%*’È-^!Á`lùâÇű1IåRˆRÊÃÆœÏö¡i…¢Ò–ð°y¸´Q›>©"E ãÇù{w~ÛÓ߬I•øƒÈ¨ª”ÕW«»½½ßüfö÷ýüÖáp! ­aU³w=gm]B¶,Â[ Èæ§È¦ Z;O—šÏAëLImX €¶¨¥Oãš´ÆÕYïæ\;ëÃW•ÎÆŸk¬Ök={Ùýq.N:– y6h›2eà&ÕL…%AÁ NÁ„ x pò]œY‡ô/­ù1ó&€Éœ5œ™RÅÔù%šDE?é¹×è ¯Åo.Õ¶-2Và¿ÕsÉ*­ø‹6rãFÌÁºÿE&wð'ÀÎq&Ÿ|Ø‘_ÿB03p‚ÓßlÏr†$#N½r¦@˜i‡{âÑûö>P¨ÜÞDŽÉª„‘8n>hæ¡­¹³x–›Ðl+LÖ°,¬Ô¯w%~ÍÅU*Ϋ¢[Uq^Ÿ6—¿„Å&äª.ùá¼C&—q%N¢p%~åÛyy&Ö0ö`MUW øKuü^+Zè^ѹÀ‡>wÀ x¦ B)®2‰7Óçeà%">†éSqƉ¬Ÿzo®)\':óYŒ/Zÿì´‡•éxõH¢Öî­ºo×Ùý•Ÿ§ê† „®p t,ùÎíªâÆÐäZlæ3ËÌÛwêÊz«N„WZ.âï-#P‡âÅ©HI:^,ú<]oG ZVŠ@7¸ëó§ãþX´,5¼çÓOKò=Ø¢”*Œaó‡…ëÀÆÆÇÇ$ùæøÿ;LŽO8‹wðý& » ¥–¦þòÄËétØe¬¯<-Ž×Ú‘z;QñÄÝ3^š”»ÑŸˆõ÷ÔVíœ_¶#w R—ŠVÚ»"Ý”ÞOÕ§ã•ÑÁ‰ÿp¼~$þãd ©OW –§z§Íåᵂx’‘ xीwA^Oìj>ø#KStŒ¹¢¶ìß¼”ÞÞÝ]ºl‘ÒzìyÛ®éëñ§mÿhºÂî/MDË€j fxIáÍMFrÊ“TO8Ÿ©Ê{ƒþD_™Høö¼ˆ9§2æ¹þ} Ça‰,YŸ¡\ƒsµoôàA¦8Äþ±7ßMn[¯ÎsIÓ̺ÿ¾[Ïá*ÒÔ\êúhƒKÍa"Ýó8&—÷´“à•’÷oqÎà›–ä„é¢pmP›ãJAÇÈ‚Sbr\(% ©ðŽâ±}äÕÆïvj­Õ†Uèõåäùy4σuªZ\eÈEP¦Æ¥cL(cœ{s…"l ¢c 2¤˜ÉW„ÿ+F5J€ÝäKŸºH…U„LF-ƒšÊg:‹ ¹-ÑYaÚ¶œíùÞ¶Yï*7o5˜ÃÜ¢Å+s%ƒ×%ÈÁ¤Nè5XÙ×W”LùSñÆ›×Kž[ü-®x,FuäÓðŒ»^ï¾66V<šÜÑ{Ï¿tQì /Soþ¥$+vê­?eïH&Ëb‘@4ê$6 Û¥àDCñZ¨Ÿ²•‹Õö÷–%“¥ª2H†[Óu 7Ä÷ïß/ÄøäÄøÿÚW¿9¾Î1‹'\»ÖɯWÇÐßf¼øNÒ®{M Fâ5‰¾’áD |=y÷„mœ ô÷§Ò•?Û·\W\^>ãúõwSƒþh¯}()Á`°·b,]—Š•ŒÚñ¾7î'ËìH™=Pë Ø‘êûCéŠ'Ò³«ïΞÝo?³r…gõKy7Ÿ½{§!‘(M î)Ù¾Pç.F‰‡¢Z·$ãõý%i»üî¿©¤ß¶Kõdžýýw·Ž$ªRÑ)©IÅüC‰*`{ð‰Ó]"R4­±kS=ý÷üsò©Î ”¨ ‡×äÊú ¥¾Ê5sjþcº¸!œÃšÐõs\qŒhŽŽ>k´D»[¶´Azº½õ]ýO ù£-¦[âˆ*Žuzå¯0bÐœÇ ÒìBÎEð5ø¬-ø5èè‚ †œ N±pL<¨ßjô^«1ŽoF»W¨› вlš­qMå&‘À-רÍŧüTŠj š2"Å.€% Ê9Ñ4 íÕtb‚8é_ÀÌ”¸†AðQmeò¬Å ªŽ2-¬@‡Ä2lèÄÐ1´ DGØÄÈ"øûyxÓÚøŠçÔÆ_æðÏ-¹"ít(4ûA{Žèp‹vXSâ‰-›·à—Ì <tžþ<Ðl9ÉåbÁcÛ°k¢¼I6€½Ô–-Ú³ò$$ÿ(K¾7k!ɰ0BˆlŸ!ŽaIòN¯hš%¼ç/_I¢çSô‹í0„.ÂX4©"ä ú`"7¸Oï`GÖàS¯™7~â›ìðÊq£GOÊ á¶ãYòi!™„‰ÃDòÉî°…µ³»ÌŦêAf¶æ!”+˜ùÚ·ž'O[â ™_ž6—WQÄE,º˜¸¬Š+º¸@%T\v®t¡ÎÝl¡;3OW®2Å$:Ùoß59#:É™c ÏøðmSÒ%ü:Oø礦 Ó'ÄÓeÈxº‘¤ ².'ÈKè‹kîýÅî™éšK#ÖØ/÷Ø(Ž3€[B²tÒI«Õh5šÕ®v÷tgû Ø<œPL^¤ ¶Ó„P‚hš¶clN¾«¯~\O‡14héü6ª&êS)Â1Ï@ÒW(i+„’ª à{ìónÏŒé7KET"rÊ?ŒG§½Ý»¹Ï3ß|¿ßÈ¢oSÓ"=ÍŽ®…6+Ýng:  º‰ôÕ䯷°#â Â^B3FG×;Öv8"Ý0Á:’sk%I!'ž:ƒ3Ú5'åZñ¼ÓþÁÅÔþŸ<ÿÞ_SÖµØÇù8x:9P‘ÎôxJ+«Ÿf‹mìêŒÏ#|$AØ‚ï¼sŽÒ[÷›«Úgi7§¨U0«ª¡Þ²Š§‰ÂÒ/úÇ3?v¬f'“*[ ¹ö¢Ül)8°ôÉÏ›žNf‡‘ëpÝØÕñd¤ñ‰P!#¾yS}A1N¸fÊÎvع؄ÝîdÚ'Œ”™Ž|ì$ë`J–Ýf»9+~Ôzšâ9ÿǦÚ`™Dv4™ÔÎøFßøz>5œ®Å‹çp$ÌÍ ð~{½•í²Óq׈¹™Wœ\wÁ‰˜iðÿŽ }«•à“ ¬ ¶­î”kÉÿ¼ç3gµ­˜elsôØõ\bpd5Â\­ ù¤Àr¹ÌÚ]E9ÏFT[÷n#CA”Ã~Ú/ü>Rä«eŒ€Â{Wi¯HqDÚ¢}xr¨’@žht¾Åy\@p@Ó7á©P:—óìc€<àÔtÙÈè–lîÑÞî ö½¤m^*-…¢O求ˆ ADh˜AÄÐo+‡„E Ã…À:Fl ÂlÃsx¤¢` Þö¢aÁs:ÜT1þä[ä?”ƒÇL98øQèLþÁ.$±.ƒl@’I"{rCDFAX…ƒ.c^ö„‘%xÀb¼™0}Ryûækü²úŠ}+}¿ZÞO)¥½æ]ÌÄðg±MÆk‘-ñ ñÄU¥ƒ°v¡[C!:Â)0é—¼ÁÚ7“¿/À¬r³%fÊb7@†Tþ<Z8 J 9› ÑutÇ1QD—ûÈ7ø‚¼àÕ:M~w‡Lƒ-pžð„ØëPx÷ê2 ‡éUT×ñåûžSݾZzÝ5þ‰YÓfò3„XTl(•åÓ3…Th/‰teoMôK3^Ð0’…rÐGó¯˜ïÿÃ4†ãé¢üiž¾Iè[`#@yBOÁÈ<=®ÒãzÒãþIáæÿ¥ay,á§`A'„×»Q%Â!H ¡\ãǶiÌ[N€-ˆë%¯EùÞoÉCQé=XˆÓhÚâ„ðŽ£ÒLÏ f>ð‹ Oð1˜oUE#FšŒXòþáö'­l·­·€H@·¬–LºkàÕ8û <ã –¸½/¬Z5;(¦–æôè «óúÕž_Œ¬W‡‚$“¶‘ÊëPá;m«müJbå—I‰óþ¿œoµÓm®‘€ƒª>+äÛ#õ³ wév£¡ïZþ†—Øž#••!×uï3V´ÿÙJ”NݺUúÔöî³È¦-~ΧªªÈ 5÷þß7Ͷi¢³ô¨•k-Ø Äf¦µ`¶çx>—ÌëV‡“Näs,» NÊ4ã™l2ïFõ+)Ðì>ˆÏ,öþþqqƒžíÎ[my=V0bù\—m5‚!ßk<.Ä“‚èÙv+—˜°·À€yk““»f»“‹Œ(è ˜˜™NŒÔX£¡fÔgêæÎò <à¦0tñ\s>÷âø‡±GˆˆS Â¶6Ísi³ éê py3êäb®‘‚ý›ÉD_\‹ŽÌ„* n^ÂÓ‘Ä` ô ÀÊþ½Ò ŠüpƒÎ!ô¯¾ÚºÀ á*Á7ÐPÆ0q8ÄJ=  XvPb,¸ëPïúңà áWWÌÙÕðð†…¯=X6/XMüÁÊmÁH"ø Áúx`w@`]E X “(ObˆS‚O©„<ÌmZ }Ÿû^›@˜Ì~‘Í!,¬xŸ7¥ý˜þLa™0àY{ªÑ^•=í‡é•èÂhÊÊÊ´Ca  dg7EÚKîž' B2{ÝÍí~xe&0äiLŸzmŸöüì20+ÐÀz¥ìÒö0í#ôŒ&ÐÞ*zÃáï®RD?h£_”à ÈG*|àv;—«t@cV‘ÀD¹1Xs“ ^Á| dÆ ÌŸúïîçoòSÁr ?ÆåÌ:ÑüJÄ÷|»’žàèI‘Ž!v1Æ{ ÁÑQDÇ0}Óc©O`ñS8>]Vpr]ï Š’†|³dßž£Æ¿ö_Ç8-Ì…E,'åa¬n|\¸8PIÏò¥=%ÐßbzV—˜U¦ÍRN!:Jè˜ê\US¨lwì 4}ðÀªL6qÍÞagÚÍ\£­÷ìyy1ì5þE³¤Óck‹…d2¾$(ù K×=عuÕÓÏÔ…câ'Ø¿5ñUÓH\Ï|ž¦¹ôáÈç€0SCâÑckîVß †»nüŸ" *Èy•mgüÌÊ5ÀµRiÊÃ@Ž^ŸœöÝ,•îÄÆíÿÝ&KSŸ¬Äíšœ¼KÖß7€á,H Ÿ8Uôýòµ5öøî‚Þ:ÍL´º½ÝÎÅ'œt=ƒ,*ÖyZ’(6Oâ¦Ùj1ÓmÖ3]v¼hG²ã-¯¼\Oü‚,TG6VF§mtƒN¸F² w¸˜Iò^#±³­ î,Œ–»ÒU0’€ì 3iŽÇŠVGÑêÊ\n.8KßòÓOˆ8§ÿóòδÙÒýd¥–x_KdN>›²ÒE»óôéæùµ¾XlI:*Z±û®ÿ½[³qÇhu²mEs Dkÿ›ýzâ¸ãn ÉÒI+­V£ÕhW»Ú‡î8ÛLí3ÇÙ†³± *I+¥¡"h]Ì#ØŽml°}½ÞÃw&¥ô¡V…úöÙI›HIþIÚ µM mÔF¥„D.J”‚Ͼ÷Áðô7k”ª•.•¥æœ~Z¯íÝÙÝÙ¹ù~&Ý:öN£E„ Á¬óœ™Éù“w-MÈqjù‘5B'&Q?·Ô£ö>›;t0ïF—Rdx1ùcU. ÝÉÚŽld“q$¬g42¸š„¬óÈ -Ðå-O3†4Yn|™aJ.âz­uj5üóNn“™1cVB¬À1¼Â±ËbI0cé˜SUN± MG²+2Ï‹<£àÜb5÷[6±¦Bx ¿±K»r ð“£Ž»î*â«"ž â­˜óU?>N‚ÕÄ_I|À Cî¢%O9ñ;IÐIÿèÝH½4È‘M#;ñ9@#$° ³äs>ðU.ù«IÀFÜ눯„ËèaJòâÖEó¾»mWX–•$¶HQ+*Ãó&N¾aÉy¾tcfò&"cË^âÈØŠÝe ’­&—äðïå][ó1iÀ^FÌ_ßu§"µs‰¶{É“ÉxG4ÖôÜsöÛ¤Œ7ÍeN¦"î>ØWdeé s ¬ˆ2æ «Û«äñ\3™Æh¤±û—•͇+Ò3§ª\îŽ-Òí©¬ój<Ö<5 +ÜŸ¼ö›Vi± £ªJoßça·¸¸;Œúêóeø,¿ˆû÷ }AÆoKäúµkª,Â÷N•dXpø¼ŽHâxbÒ5“8¾Ri8w%#méhG&֑޶'¦Z¡î¤\±tó…·jR‰`:Ù#0üÏïϦ Í[¯¾WóÖ뵱ɦD¸énÊ“Œø«šÌ♽v­qr¢ÎMNº2ÑÖé¸|dD[f3®èDÓlÊ @‚€†m<Ú>“¨ƒÈ¦s'bíñÌwSIÏåøÊœúYåD¶g¾²Jdr;ŽVÃàòhÛûWMÝjð·Ä§RIw*¶ÿÿÎÿªtªm:Õ:—qÇ'àI›c±çcÑ5)5a5g¬?cãfÎæÓÉÿŒJ†²k![AÁä§ws^z,¤Öž J‘DBÆ`²¾ìítk”+ØXÏb‹sÝÒ#Óø Ë[ž‚¤-Aû޽£ÀäŒò7åôÖ†<¬§RX9‰nH„!Ã`¢Â°æåÖnÕ¿cS‹5X£›D‘•À!X–yUäÁ`*t]#pš€4QT1oÓL‡ªØsô[]ü\·™¼l¥€Ž¥]H7”á=`Æ0ØC0Þ‹h(‚7¨)Q0ôê¡6 ~ ë]– 粻ˋʭB’]Soz%« ã°†ÁLH{¶L¹šÐ’‡ëés–…sâÛµ–ÇÌkX„ õU,4¹àض\Òg£W§#$„èEáö`¿Ï¸¸îÈ$û8ì3N¶þ®Avê¬ aè<)f^.ÕøÁ6Ž\ÉE ‡NsùŽ‚Bÿ2C·#àLþÀ‘Q´RéŸ:o޳ŔÇxw óc2¹ÀàzŒ$¬Â ee ÿtíå3ÜéY}¥Y˜}ƒ!£"½·K ¹¼š’i¥42 O­‹< '|¹ 7£JH0iv ÷—ÑšÙX}êV ¬ƒ2³GÆ?>õYø`2Ñ’Ž6%&ëîÍv^x{¯ãk’_Lž¥‹ñ ‡Š?o¾›öܾÙü½}• L C½»bSîLúøôtk4|"ë|žªOE\°ŒÍdÜ®V‡Èrª¤ Ž‘ñÆõë óËñ ÔûJ#_ª@ÑøAççãÑØS;žxN¢ŒÄíUê§·'& ^f“î•JÃT„‚ƒ 1›qÏ$Ûƒ½5:ŸÛÚ°m"Üž™i¿3 q…oü¢t½Uå$G¾Å×ºí½±ºH¼ý•W·k8GfÑñ¶Æ“uÓq°a.& ¤b ÿ“Žšg“í©HS:ydæÎáÛáÚTÒ;£ÿMDfÒíéd0š®§<:o9󡃕ǎ>aæ5…~~òñèí_Yñ*Y^µoÞÂô‰ttrêx,Ò–L6­`¿­TÅc-éxóL¢=nd¦ë’I×Íñ.½Ö2ªëáîý F,d˜dÀ$sûLz/­¦Š™@Å”"Ô$âÃ0‚ÀÊÖN¿F›êiBäA(@ÃKtkT?\B%ýf2  ÊûЯýz·¸Û!­‘%©Vy$!1 &Cê*‚9’1ìëC„ÎH–2›°d2lÉ$ô|Ÿ0¬mú‰e yA&ðãqu¦W­[!lpØ>ïµó=Lè™ÑB,Š®²ç ”Úó0²Ø˜ÃÆ1ïÕI€.íÝ"©v¸11¸¼42æäRA-K!hÎeó@‡´ˆ;üun˜ÃtãóƒE¯U E2A„ˆ2Ñì‚æ^‡gK¬|GlZ`çlR¶’%±IˆlmÉÒ ÝŸÂãM(ú¾Î¦8r¢…"ÃpJ° s^׼? @ö»¼¡fâÝŠ~Ý*<<#°U6-¥ÏÁ_té4B8HÎ Ü]Spù£®êBƒ›B”úÚåÿÔs?Ú|ÏôƒMñx›i6Y–m÷LO2²;™hù¬cp¤þàþ†£/߸¾#${®ýáû5ÏcL0ÌRC"¯Ö/KĶ%bÛ#_¢¦{Ñõ<懽°’ï¸c¦}­S'º,ÁíOËKKçîÏfæçÿéôü"ÁøÕëÿú‡ÌÏ?Ê~N?z ñ¿ÝE$¢Sx’"+ ûå˯Ãh¦æÝóÿ´ ˜ŠÂ„qß·ÆBîðí]@‘›×7»Ô•yT‘…Ü­ …i5;g>ÝÙP K¤n'H²þøFè7k]¿8¼ù¥Ú]RTQ¼ùçfÄ µÌÆ:bA_2Þô´ý‰FÚ£ÁÝ€™ØÝ=‰pKÄlLÝÿÙèÐ+Cïn5C±Ʈ½ùÞ©ÆÔ¬ÿ‹;{6Ö«²M%6xŠtR4Ô·%õÞø¸-Ö'¬÷i0o»SÁ]mIÓ†Ûánû3çÇ—¯¬nó®g.ÜpÛ‚šâ±®#G7ØrcEÕÖèÏ¥Þu²¯ÛO«È È&-=¤Ì ˬü—Q+t8EnŒA®‹Å÷Cùö@`É(xÃàzˇlõ$§w;Ýkñ U× 8ZA2$¾ˆé„À]„%‡DUL,+¶­.Ûázåƒm…÷Þ*ØrxuÇ}w5ó¯áAºtÃ_Uloë¬f¾ZÖõR¦«„u—qŸp“TZ¨äBàl(·ZYÕS±P6 á)çÕ]¹¨F8 *¬*g2ÖSÎöH*xqêüwÁ!'VÞ°šWW óÁ{©UeÖNVó‚ðÕ§c 'P•鬸Ksé¯ò;kpuäÒFD "P©@Rt %PL À[_vå¾+œñ¦áÊ«¼²œ$ Ã9ٰć Æ~±hV™xÂ<±ö3*/`fL]x?ÎÑæúK> Ë 8 ò-`C0!QV°§šD‡äí°ÓM_>o2 ±Álÿ±Ë ½–…ŠB½‘ù¹žÉ *0ùÌ·LèÜÄO¡“vî«lOëç˜ÁúEv"K,Ø2b»T@ŸÃ†Nd`E#ùßr 7ŽÉ<”!Ïa6 ¹l·ÂZdEv±ÈÒiD`—)» ² ‚uDù“¢òù®åº±&G¦Âþ-›,¸> "bS±¸}y"šÙ4bWèc/-E‡s”ù™ÂžáëEúà<¹Ðï’ÁºvîDJ”W7åÇïJ†;¢Ñf3ôÆ\|_Êô¤B³ÑŽ„ÙµÇ£;±NX‡cfc2ñãP°½ïÈ&ŠràŽF4‡ ‡¯£&êNDv¥‚‡R¦?~cÑõ–ñhK"ܑлSñîKS?Y®µaBÈn­Þ·2ixÍCü=Ëôýêõ?/( Èé÷~C°«¹ŒlyTüeC8Øš2}¡º“‘ÎTܳdu'ÌÝñ× 6mŸKøþv«Ñ½£Êr!AQ[ÿ ãÊï_‹G÷ݺ¾ç𑆵uH“m5¨¨R ÙeDÅ"C¶ÁæiªM¦¼±7ô¦âÞ„ÙüÔ1¡•;Úsf{¨3ö ö}G—ƒÇG7]½ÚTì‹umzêGñ„ç`×z*0·elÛ¶­ð‘¶ko_W#;PáÊBmf¦í^´e6ؾ½=•hIF|)s÷3çÇ—*öDÂ~åͶdÄ5Ç#-a`I¨k]5QTIÅ6ƽߦìDÞBX<]åóÈÀì$,Ý”6 ±¢ò¨‚çÐa»(S”sbhqíÀöܪ4·ö€™PçúÉ­^züu¥¡D†‡&‚‰]A˜Dìrì°&a™ÿƒ Tis™£oSÉŸvU>øi÷F6©!Ð!Í!ô»W±®¯1?Ôó¬§äQ $ã_źK™jƒ¯=«õ–²·×0_%Û[Éß}ü«¿ 0ß]‘|ïr¬Î@“îh•ö¹ŒZT=ÖÈjþy1dÉÁ)=,]ÀOO) T¤y‡+x[ð’ÿ^{«ÙÞ5VUr5Šü• òéªæjX N0í¯€þ L²¯žù묞—q®wfeØ[|凮wêK7ºŠ5ªÃESdUs$%—*„¸¨…Lª*вB•Þ¬SO79Sï¨\˜c˜‡ûˆ;99B”7Ž>qž@«¬jF-·dÇ ¦Ä¸ aØó<¨†CTaCŽ‚F$6áœö` ‚¢:eíL£À0æäؘ Ú5—"b$ÃÃÂïÁlYÆú0;]‚Ihõ ¦Óe dñlçÖ]´Ÿ…lÂà§9@Ù1ìg~ŒÌ ×¹Ä%Œ+‡„Œ9w´UÏL¯b—-$LB46MØ9k^²ôŸ¶´sVbt.Iá“#y–”[_̉½_ØTª aI÷lAýÍ’®æHÙX'¤/唿/ ¼oÓK§£sˆMâ PäC™…C쪃]F§Ž®Õ‘B•eÍåÒÝX u˜÷l¬3ÜeÞñ&Âî³_î±Q\WF²di¥•FWW£«ÍhfW»klcÀx1Æ5FI”H%ŠÜB€?d[Þ{»Ý‡×””*‘@ü„$M«ˆ%*1pKQ‰’’TjqhxØ;³³;»kl°Á·çÎ:U”ÖT–\ñ££Ñ™û8wæÌù}‡™æOë¾T,œŠUêŒá¿>Ô²}Ë2‰ø†Ø½0;q¢ñú­ú̶CþÎW×ß®‡œ?S~ƒRW¿í»—éõ±Û{ÌDGç¡ NÞ¯„ æN}Ê’799ñ¨øññcjÚqcÑ‚…,ñ`^!¶í[Ê㺠ÄÔk'2á´Ñ â5Wj˜Ðê`Bàœ13<šè¾Þ–Ö÷&ŒæW:V8 B}KÔ40ð#34â>#î¿r¥îõÏ?]E1Gä$‡#nYPúäbÃh:˜Š7 Ƴõ'ÑjÄjÇ“þÌ­àx2 öìº\Äpª:oa>lR©G9sê…¤YkÆ¢kWçÉÈ¡à|ã½lNêJ®·gMìv(¥ÕŒ› ì-ÖUÀÝxÛ#ÇÿÜo"¾g,Ý©`,Ù’Òàçm2Ìh§NnUÜl/ V xt)RÀ*ÇÙÒ°GŸÂô¥›gšÒ#0®€œ,+RNF#€"o8¦µæ¿Óh„Ì„£—0Áêr*Šý²ðÕï¹6-ÀN¤¡"Q€2P$HÅ¢„m‚€‘ ñD*Q¤Ý%êÛ_­¯¤í«h{% –Òà ñ H¾c¡B”HÐÐr¦ãá*©¢?c`0*›Š–Ó} ôKi– B^Öˆ2Þ`Ô-¥á¬°VL[¤’YÐÅKCK-òÉBÂò9dÚ–ÝÇj“°Hֹ̢â¬QFJVüÏÎõÁžˆµ;XØ#çRPi¤FËØÛ‡ƒðÔK÷–Z›]A£+h{ ß -ÿô¥Š¾u‹×,YT$ÉÄÎØÊ[ #'oóà· HbDÊåÍåbÏ6|󘾅&º‹hís°è&VäÈû¾ðM³¬ XrT`í~‹Fº$à ÚÅYaã¦ýÚí` }²PÑ)Æ8¼ÂgŸ3õ?SH(Nsô,¡ƒ2='^9Ì;!¼µ*—žQèI¹º°±@䉓³KÈžG\Ñm6æÏL/ÈÎa: Ι?ýc{<í¢ç8ú'•ž·Ó³hâ#5¼É#C"U1 °åüæÍjM‹¤u?$œ±L+XRk² ɶÑxôn¢)1Ütéb ÜË;% I^Æø‰•è󫛇o·h†ÿâÅÆÕó¥¿w݈˜1Åéx8¥7d@¿âu =0¢…vþ8OUÁ¼$J…ùi3•’©©ZƒÓÇý‰‰,ì|qCG"B—x×® d´nÜô%c»àûšš®Ô0mø’Zs2ÖšŽ㷂ݯ{ÚŒnþ½îõõo-È— 9äI\wçšq½)£×¤uÀ¿n6_ù¬þðÁ­ÏTñ‘e,9y¾µf­QmÔ#³õG×ZÓIß„ïN¬5¥ïŽ'¶_ûrïSO-f`7±;—à j“ ó£qÿ×ë7nd@b¡;yÕëUûß©N&ÒzÛX"`Æö$Œ`<Þ ”>¦=züø–iZKÚ„„P7fúXU¢µe øµ}ã±Ýl~“—ˆ.àU(Ü\i³JÈYÒ°ÞA† eæ¦GÆ™ŽôŠLk@q0Žò¬O×ü™ÕJeºÖC&{Õ¿ìsìûWU+";"ìÃ@µ%Š (vˆ‚‡èu÷?·h¨q ㇋‡3ˆZâš ª Í| ­ K¯#–|ƒ”Ãp)SóŽJÖ?”RÎÎ0.XÚ-Å•±;°DÔ"„vkÎ,WÀP#œiøþ”[}¬,­°¦‚* +i:TXó„üZʬU,^D }kN‹…UÑè“4²’†,ÈG Hà¬üÆ<ål§°D1 /¹(ÜQxƱ*wâÜ2ç$Äh"ŠâX ¼$àù )Í“ÏîȽµO` ÌÐÃ3 é’N<$T²Ââ!92ƒØcy õ,`ŽðìòHß.Å´M?“i'€‡«f$‹ª‹GÛ¾_¨Û(¿V-VÙɘA××Ü{D¸й¥‚E*D‰K­uÏë­¶é,ÚTî›9Îûx«Ð6;êu1|ŒHîq¾]CJ6‚=óaQ”+‰Juñ¼Ë]Eôc…1Ãyk…žãæLýaN˜y§, 9‹¦Î UE²Â Húô8GO£;ÜsUÐs°¬ˆ¼CÅ®¿ãéiŽè x*"Ð÷Мùó!ìÓAýO¡agó@;ö©?ïZ/rv™Ÿ/#ÛïOo25 …èKl¤’jÚ„š·ÅŒïHi#ÑôÇk=Ž`‡JHsmå?‡c±¦;FÛáO(8Ç)I2¹ðÐW¾‡f¹—€y ]§úD¢V…¯ ù \P7$‚¸å…ÍYy|<ªcbâ^¶1 „StrrÎýý½ˆ#ª$K|ŽÌ¹ÞÒiO…’1öeM¬x3 Ä\©!‹F³6iìÉþབྷU!W®Î¿ú×ÝÚH hú¥¼vH– &ÕŸì¬43¯Œh/¦“MÉ‘¦d¬‘5 ÿ—ëW-seۼϯS#{3þÑáàlý‰-©T[B«ŠHkCÛ —_[‹c$‚]$¹Ý];“I¿©Õiu™xS"VsùbÝþÈÓö¯|÷ÄwoüÃgj­³~º?“hcl¦×ÃæŠL<3æOŽ´¤4Æ? £•]þŸ)%­GáçýÛgÛdÞ&Ê*F’Wäº÷@µ‹ïw;YBþµó.”™Ç 9[B3kJéQ=êfuh7¦ý`¨4« ´O€;SL¡@”®_þÜù/öë=6Šãޏ¥“,´Òj4Zfµ«Ý=Ýñ9Æ ƒÃ#¦Æ4…”<Ê#$4@I›c;öÕc_Œ±ñƒÐ6B$ÆØøA‘ªD¤RKý;8Tý£JQ+AG& Ø÷ØÛ»ó°¹éoÎÊ?¦r ý§¬Æ«½óÝÜxïçù~~¿yNø‘Ç®É2B ‘Àp¹š)lW†‹*ku±~•Òû2Èánî/Ÿÿ6ýŽ{'¸UêsYSÞ­†•W|yïmq×®U¤kXW00„È„ÂÞN !JºCÆ;V 3%Fôˆƒçu'æÕr‚òÑ!óÑEf\‘J°Çw¿‡´¥t®úç¤èró¨ j¶(ÛÀ¢XÑ ¾»(Ù%Ý#`̓ÓÍrL£\5®Ë‡ÑR-)h¢§éé9TTÞåÞ”+&Z\|%m°*/ÖÆ?ËÉ‹Â$sÖ³›¿«‹þ³NÞ–gÃØŽeCÅ:Ô¥ Û>ÜŸÍ]<ýû S0ƒÑ ì¼Èú'*ë'üz¾éNNE6(ò·iÉão ð)R×dÐÓ•ÙŸ'>¢G^H×Ä,ø§yk;¸…²³»ˆëÊí "?]&%/Êìœ0“ a>Ï Ìgî¿jꥰÂo]›óuY”A°„ lcáç#bú¢QohÌ‹•›£{'£Í±7®ŽÇ+Æþî®m9δ÷;^އŒ›»ÿqÕ»óBª·$êQž]ç:óÁ/£á†hП0k¡ŒC(˜æXi,:çþ6Øû’‹:8G#"BÇÛN3ƒ ø™žžº›’³áøðx0G2u|ÿáwWütõ«+ngtÐdª¨Ùzø‡1ªaCÅî®­fÌŠ|åÛõâcb×äLuêðpÕØ5ß ë­ñÈËÜ‹U:½Î-Ž€}°0àʃÖHÐUÅ5_=¾ÔI‰¡`›[$oo£ì¤›Ë¡ vlÄwìN™çÈ|5ÒÍIþÆV…q@ÉÉoþ œ.rçòë;WKN$.¡…(‚ÌÕ¡åD™bús9ÆéÍîËå+YC>kXÄê0hB÷å²Úü”Còf5òpü÷£ak€û ´Ëeû—°º\VŸ—bÞXýbÖ¼b¢vÅÀϳ÷å+….hdŒ°LUUÑ"«ˆ˜DsP×ï6Ø®½Íº2X›¹ÔÑHœ nÖêàR…ç;ÁxÎúéÌXŸæ‘Y¢‹”ôÉV‰Y› l|ýªsI¢h@ô¤ ±6Ï6Ä:œ—j8ETqö,T•¦ç³Ù‘L¨Ãð»že‘õ,LÒ¿UÙñL^Ÿ-°0'ëS‚rÏ êº†Wv«¼¤Û¸ëƒ2×rGºˆu¸@BìWÚC)Ü}b²²!õaö1áĬD!ÿ'A?˜šá<æ“ô¤@2¤Ýº 6ï”3‰«"®z°Ð_Œé>tëŒÀ=·ÏªžW3©‚ ²Gõ+$>.¢l€²^õÃ…›Ã÷M#ýR–w^„uö¶æ"E¢’¨RTZ²°‘ˆÔÆB¯N˜pQ-ê„UõŽCçeU˜‘×LÓw°1?zBŒákU…ô¦7WŒì©Þ¾5W'ª"’ƒÍ«ÌXuÔªŒ…ª'"5ñˆÒj®ýÍ íýìó_m(ti#dSyëÖ-,yçÎé©©Û,¥‘dêøßgôÿÛ‘"ßì­žå_’µ·¶SI%0o¸è¿Ø¯÷Ø(Ž;àH–,tÒj4Zvµ«Û]Ý6Ô8Ä6l0ÏÒ„¦•UBì…‹Í]Ž»³ ÆUÿè+l0¤‰¢J©¢ª$ŒÉƒPµBET*!)/û»{oór=ýÍA¢ö«dÉj›ÓO§½ÓÝjvvv¾Ÿwá|‹eùâ‘(¸}Ù¤rЊèRñèŒi$õ…Ç›3IO<ÒfŒé Ñ3Û¸ 0"²H$ú®ÊñpÀ´ôt2ܽ”`A"œ“R]8·Õ {&ÌÞ„±ýïŸw=³Ü Ý™S"g>hM˜Ád¼ÅŒ¦;ž{‰Þè-F{Æ X1¿i¶F¦ˆá½zå¥xÂóå­ö5Ë…Wâ±›ŒÜüe©˜'Ñï&B‘qO86m-XÑV0^Úò¦ _2æƒwxaÂaòááÊá${÷Â#få7ÿLÕx¬¤—뉈gp°ž]© «Vº ®÷³Ît°„>D‘—ÎS÷Ö~Ь=ÂÓ~£ÜN~ßü©xèemq‘@ÃA4‘Ã2ÆN0*ሀDl[;õ5Ì¿¶»z*°˜+éþEtÿ–‰] rù¸˜v/Ïæ›`»_Û_¯6W|dž Ëež/›÷›—“Qo"ÚŽn?=¼A{(HEŠ6üfrG"êO[Í©˜7Û›oK$ôl642Ôèa[# ô:Xê?rôQ >JÉî—O*©ÿ·_ÿн©¯^p¾}£HÓ$¬(’ì”ìo]*åK[,U3q_"Öɘ¶: Rfû j$Ù“N2ßOöÜ5c-ÆøÎkWw¯ù®Ó!AøJý`µëúç¾è8Ä´÷è`½B ½Q\ª*±ÝúÂoŒí˜ˆölú~‰Æ 2š¶-‹¬=É$ ºuºã‰Ýn›È¶X¦þÞ;›žY&ÕU Þµ×ox,Óc†ƒf¢ùÖÍÞ§4 Ú Ev ÐðaeÍj ‚‡è^\‡MCOdóš<_¥LL,$Wí “¤Ùê0óp àÚQöpÁÇl⛥”‘Y3kÃa}ý!žˆám»Vpôx = 9¢²9 É¿Kç«·ë4û\ô …öËômWö°ë“v²¹Æ]Šg)¨H ˆñ<†©æ¥5.é+c» û–±p UÓ»ø1X2\J»êE‚—•L#Aò­Ff¢º2r°ãšÇÓ&éZHƒ¥4XF»–Ð}ÕÔ»€Ý”ž%ðÍdhNª³|´±´u?‰Eƒ[@%R±HQ’e¤¬pàÃÏ£ÛA¤ÚOè ™žT/8Ìé4ßú9)Ð×µÀ³kj¡ˆ=åÄþ|¹ò㥶"¹ó´½›ªítçÀ,>8†v×" Ù%"m^‹v­(pK¶YXTU9P3«Ì b’„Ú 4rÒ7UzBŠž}õ'®©_rôñ°ÚÕ¼ã9B˜ÌáB`U‡³ú >ösñµX#Å…ÒMt`·½ëGL#§ít˜§Šô„Ž"ú  búx€@Fx:BH ÎçN~ 4ÂÓóÒÿá¨HGrºvXïÛ××€Mr¹QáÆ§ _Y4˰[öÏ«¯šc½7›ýþÏN5C¡§!½ Ðíô¢êßR†ìŠ »Ý":µ9mîMÆôl<`†÷dRm)³9cz2a5®ÇÍΣ}\{Ãss¯^é4Ç}ÿ¿ÚÙR­Ài0QEñÖø^Ð4nI£ (’±|ùö·hdçÛÍw§ñ¢ˆxE‚Í\¸|ù2¤áÇžP>ÿß½&'~}üˆ"0ùÖ‹<M(¶ãukQ&} õ¦M…I‚X·":P>>:˜©Ô‹Ój<c{¬HãÝŒ'ï0¬æ¿]ëhÚ^¢Õ\*QJTÛÅ‹¦Õf¤<¤—¹HYqÁù‘mf¸k"Ñž6›?騜ÃuèË“Yo6î7ÃÛã±æD²kºãI§^„Ðïõ?[$ÈN^U0´r¸¶Ìõé§ëI ŒÝé¸tiÇºÕ ¥u}=ùâÆÞ¸¹7k…Œ;ÍÀx`C42m¥-oŽ|z*Î(e†[aÎA&Ý2vÄÍ&+ÖW”‰ávx¾i˜&lk2Ò–1@GžS¼R%°3Ù.úŠ(ë[¡“åét²Ó×È1'CÈ¡o ±Câñ­Üºyv)"Q1¯JDQ 54,B¹„[k|IˆVÒÐ*ê_Æ4„(¬š‚ˆ -È¥äB&®ê©ý5,.÷-þŠ"ßjd¦ª’Í3ÞRª¥û–° .¡=uŒ¡2Ú]A;Ë™FBu4°Šv.§Ü÷=Uã¯U¾0¯á)¬¢K‚¨‚Ä‹œ`ž(O‹xcþÓ«ªñ«Ùô]0¡‡íS!ú¹üëG¥¿&ÔÞM¶bža„‹œ†5;Od©pkÉ<(Ó¾¹´_e+í„Z¯¨¼,úÃð%]ø'ûuÛÄyÇ)’%K'NNît§óYv^JHx ! ÆA7 [E›ÊØX褉+/^°;¡];ºu°HBCX×uÿ´Ó6VÈ ï]‡TÔmH£c°1ûÎ>Ÿ}&á%Éo¿ êó¤L©öÇ8=²ÎçóÝ£çžû}?ÏúùNÂQ^<§P·Ê»×‹¡^2Õ§Ô”Ï+w;Þ©-°Ï¿ß+@/“µ?Ç ¦ðØìŽES!88DÑW÷¨‡«¸¶"„Eu;$J÷?sg¸F8ƒ–Pm‡ !Ϊ³Nyüû)ÎzÉ “èüÊ©\ø½ƒ˜û²Í<8(¿ònªp N‘ˆ´D(úÍ^¼»÷îÙÜ·ÛXÊæ8 Ž ûcŸ à \`'OÉs¦‘!†°êF¼ÏÜ>YþäãªÀò^É‹S¢Ä«^½Ú”¶ü‰Ä,€fÌojõßÖ¦ˆkþ±h`àøãºÖžH4àz-k½qÍ·sû|eyB†ï-bZ™­éx ¥µZÃ̲îß×·´ÙžJøt smߦµ¹#zÊsbuuµeYSrzzêÓÿ'ÛÔÔ$üË!3;Sýýýâʉº¥œ‹5mŒc¶Æ›,Ã-“ÄTjFŠ \1:ç*õÌt ^ÖÔM}w:ÔÇ‚Ÿ\«ÕH*QŸJFºCëU^¢Xhd¡ÀÅõ¬KÅë’Ñð•?6«J˜íz|§ó[f-NÚ¿|²[Ó"qÌîèž)+ŒvÅ¢YgcV$W.ó%‡È"•©, FT™ÐbÅ}áƒ-éTKJ #pΟ©þð¢ÏJ„PøÇ[7êîf:Q2F šõ8hmhmCÇ¡ðgŒ`&ñ½TìÕ”þŠ6Úž6ƒfÒÅHø tB|ÎÆ?«Fb»­TƒkÉ$šÒz v­–(+ð¡ô¹rF?¸z°>ó6Ez³¯a³µ7p¥™õ%¹ã)ÇR/²Cå¨Ki®@ÝϽ¥Ð¾Ìadþ4j$Xn?¤Gv-·[çª{ÁªI4d÷j讜®H¶®ˆ¬_¶ZaDŽ#²ÄINQš'SŽr….Îùl‰ãí$õCC庡ÇuïM5ëü9$! ŸB¿ëú>f{“O %…Báð³`‘Â~á-ªx“@oþP³¸HV,·i¡c¢9k½1ÿ3e$—¨Pn[…zðÖláÐV§K`œ óðVEö³õ§áñ˜íóŸp3ó±\ôýj _<Ý*KN/Ϫ |NÝQ5/úk/œ›±Ä) Î>åOÏA‚;gð+…‘™ãç™{'y!Ãx‚‚;©wåêÒ–Hyï‘\‹eéÒAäg ¢…ˆKâ\ª—2ä©J<®Ây×Ô7g9)Ày~utÆewø¬†Ù”>ætó9.RD9áKë<£ñV-V?žl3ÇÂXKµ˜/®·ñ,zI½kCÉX1<´cåÂBt•,9êÚ°†Þºõ‚…4Öz7LF–Ù„Õ2{‰kš©öí†VwébƒJ2ÏSž²,{àÀ‡Yù@#³òÑ6·Ûgò`çæÍ›yyy*•dNÅ*ÑÕ]‹î³ÌpJß•‰¶¤~œøì’šÝp2 E$s•zF41ÂÉhÛí´_×ëþ~m߯µüöçÊ¢WÛ3F[T¯ùÅ{_Í÷H"[ˆ TÁ+-e-‚ýÑõ-4ÍÀítKjôûiìa²ÁH5Zñ®‰¸?s /ë7R{fÛŸ+ï>Ñè¦Yà^l}âÅÀ:Âçà¾J]‹ÜÒÅÓÏß±|i­9­7ÑzËh7jÒ±@|´i|‡ïjívÊg"Wþ+ E°ÝI‡´›¡wŽnüVµs˹«­òò-Vò%|×q|=}fòó¥¶qÓŸÖÂÉX»1æ»lÆÇtýoþ…^"ð²HE–8¹\0b鯂?K¼ß©Ô¯uäó ϹyAyÆÅ1nŽQ)¹ÐéÏ %vð…Ê ˆŸ%й:*í4 .&]´!NVCçû"ž^3sÊdÅ#Ìq ­´¥Al” §;Ov.…ÐRˆ¬€ð*{äCö hÅ"•þ)†ÎEZ6óS¹ý4;‹î„*Ol[üÍJQ ÉåE‘$J\.Vªò°?x–ýëk* ÈГ=ýñЃѯBŸlõyá8U>Z“[S©¼¾™ü¬–Ÿº¡WºÛËA?}ʺ¥wôЧ‹‚¤ª„n©$îõN ×ôʾ¢/;]”»ʇ><3ïrWQžààx,InÊþhó‚÷¾>ïçuÙçùq¦·<öz<Ћ R¡G†>亂ûSGÅ?u©_)΃©çt¹$Vúv{ó¸ËÉ ä„§™Y§ü§!0ÄÚªÁ#¨š!~ËÁyNáóònØC$Ö-ÍcÙ‚r•¿2ÀÂY‰Ý†… E|ϱ‚Èí|I#ÃI óïO¶†ÐaáociP„!†x8ǼշÆÃ#'¨@EžÐï¶!a4¦¢Ý㉎”á3ÓuzÒ?¦ùu­aÂôÇüéx-®÷‡ŸtÓ…²ñ*Tyþ;åÿ¸Þª6[ñ ¥·£uêEûOuÒ4j­D§õ§ŒZ¼øk/o’9„ç!¥7nÜx•ò9o““wa¦îÛ_&'ïlþÚV‚“”J*ÉÝøE!¥·fŒÝÉXcÒhÖms¦£Q·çR eG¹¾ÉD@µXq¿9ÖfŒ0‹cz»¯¡X"ŒD–-Ë=÷»mÉXp<îûù*óTn!V×Þª±Q¿•n‰¶¼`J«ŸméMÛóOöË=¶©ëŽã‘"E²déêèèêè^Ý«{mÙŽ ¡Iž«ªP ݪ2Ø`el+/7M²˜$¶‚Ƀ@éVUÕ$vB)lë´ ¯VÚ:´nš`<âØ×k; üö;îû‹?2&®~ºº–ïyøøœï÷óEb1£ÛÇ3HÝ3é»w§aaÙ¬e•%šœ¿·yéh²1óüñZƒÛea¢ +ú¬B1Z?løÍtrÚÿ@ef´)óg~¾¹ÉÄ›Ðë£IÏHÚ;÷§Œ-·oµ¯\ÎTâT‰ŽÂ¥Ét†=úúpl;žÐLl?žµgM#©hƒiÔÇ#U#©úÄpíƒtKb(ðQ;NI+a̪;fÉd¼£+…›+pXƒ.Ôÿ\˜íÁl(b̶! Â2‰a‰çÇ ý¬×ö½Å‰QÜr*•UÂlLÔDü©¬ÐQüÕ:–Ø9Ú–pïkËÕî2hûüíøE=•j}œOöVþ­fAÛRe±Nn “eFt‰0f³ GÌ÷ùûÏÐK¹›wj9âÅÍÆ ì‚N7ß]]2·û Êù¡›@€㉴ÂVŽÈ_ùí+ ­A•mŪhuˆêB‰fqßvéï#º0èPGHó²]´0¢”H6 祪‘¹$}u…í·*ô:§boRnÃSèrBRGnŸÎÁyX. ‚ôÉ”àSàûÇÔá_ÎØ\š_,*2EbľÐ-þ5h‡+R-d@2aPƒóHôËœR§O$ü.À€Àû¹¬MõÛ®·Y-’€ ~§G‡³"✈Lr;¤Íqˆ µ9.¦õ"ÉPè×à²8…m/ äh¼Ã‹\$pî[òa0 ÁkŽg\²þwÐéÍSýØ3…)"SdJ >ÿõ:#ô^ƨ0Z¦¢?Kù#w›2„ÖÇ׫z>£ó%Îq°3'_Å<˜NTÝ»ÕþÉÇ+~±ÿõÖ]knüe[Ú¨ÍÆ¶˜QÏH¢ÎŒÖ™†Ã#ÆX|IÔ㷼Р_"áK%?zóUÙNl “QšÖ¾õ£É)˜s²S“È%ÏÕ±ÿ¯É©q¼?z8‰+üøñØáîL¤šìTE]eùW/xµ'‡jÒ1o,Zm¤ŸšÁ%«Ó‰ÚQÓªKùR±:¾1ŒZÜˆÒ fÚšv¾¦«J­²,ª¬àà'ëbÿƒ1Ïy7®-qëÖE/[/öo5ÓÞxYÝÇ››Ó¦¦Dìì!“ðd#mÉ»Mÿþf÷šJ‡Ì $¡\×ôCÖÆîùFSž´¸r©Êí”dAW­HË;wꇱHcÚð$vOwÜÑTÝHBu&^›E2á½NR»SÃõf¬ ¡hí›N]´é"[»F-t1FD›¨8;ý» œÙ†7áûÏšFpm³IþA™”׈Ôć¼Ìv’%åLE c¬Vо:g½…Ð:œ{Æ„väâ!FWi CkXàr}õÙyb»RYl±IdµÈ’jãqÈ*0*kÊÛ/ëg¿_mKG›ÁÞ•hUÐ<ZѼæAsxî6ú¢žJµ.¶W`W)4—Á¾%c{^»Q·ôWëK*íòL™2j™ JÄÁµºE¡~¥í›}.8†¼!= q ‹Ð%äØÃ|ƒ!ýªÐãâè‹Lò$AH8Ä;ã¶?·ÛÞWà°ä»DÙ¢ª¨3'vè“=Hn8XŒýøWʪR;Õ‹önyþ27s*yV"P‰¼S–wûàL!aÊ¡è0á\„drB§:ñ+™ÕË Kâ Ž'¢W‚}öûóö¼‘ï@¡ª]’5!¯Ôiý¢…Á P8KáªÈý½ŸÁ%Æàá@2]—?mEƒ$‡H.’¾m·º8##„À G¼R+¢ Ì?š(mX÷hÁ)–Cl.süà=P´C?Þñ#ƒ/|Xb‡KEp&Ç'2'œéÎó¢}|йq¥ © #….ézÞ××fÒ“÷½¨–Y£a4é5PuQ6“éÀªU¢Â,ß]5ëëk>TÑd¬uOs¥ ^ŠÝ¡eïw±&Ì›ÙDc.ôùQÄ2‰úì·(óŽ™ hC¨·ÑXU"î8çu+ùÕYéèìC ™„‡/hä]SSœC&ONM=º÷æŒ"]‰Â˜Lèû–¦Í€ó™Q?þûq£.•zjî–Fö&"U™€mH ÕŒg|Éáj´¬MÆw˜Ééh m4&­G¬“(Seu`°*3Rý›Ó›4©ÀFgÏÒÅߟܖ“•¶ÏE°ððšF}*V›4j²&þL/’tË…ÓÛ©FBE™ÙeË?ÚK dåRߣðlØÍàpNóQÿ»è”0?Nu¹?Û¢VÎ(Æ™)T…ÙDʧÔZ.KÍ‹_ºùþBhŸme(ƒ¶Jh]¹°kNοæå°dÁó·Ñõ4êq`´.„– ØU«¥œ£æ®Š-ËNþ t}©fW$*¡) s2òR)³8ËO³?ì<ÐÙƒ Gß >S9™tjÐ턠ȸ×þDé±Á‚:¾ö8l?½Sö¯¦o-°V-WŽo¦ð©‡¬p´¼¯Fh¨haËÝäz»'¿«þéK•<7Câ¸u?Xhè1èàôÉ e£5gÆèá¦A3 КÉm‡ìtí­‰í†Ö±¶ bƒ~Ç܆—_'Óð“'äþã­ÚOêkª°¿0Žû#f9‰õzy·Gp?Z£k‘´ (bjui#lkqpãênÙD¥H*0~³6—Ù ñèÍhQ]k‡4+j^{íjLr˜±ŒL«ÁmåŠÀb*^7œúì•´Öi©aønΊ™‰ÏTP¨K¯‘¼1&ë³é nlWµFSï08Ìž3Ûl’§š3–{Ê/]Ú©Ì´ÀíL;HÉVÃ9«ÙV£ÆDÞZÊŠ Â^r_¹Ñ¼sç’ç«Ê^{Áûc©uZ#£ÐSPò…$0ÒV’wÚ }±VÝ2†'ãu3ÌpÈKò¤§pÎCWç3¼é—ŽÕóÕO9<ò,ØFÀÑç$‰Åß“{Äç[“Ž5¤kÍt|i« Ý@‘å$¶‚t,"íKHÇRÒ¾ŒÄ—PŠtB©ZñøËèwãጔñ¥ÓqÐÈ*Òý}°èt|!ú¸«H'ÄÀÓW›fÇž•½ãüØ…+0_*ÊI¥ÛºÚyeô*d®@Lqò¾@ypˆ} Fú0-€XJ—/éqSEÓˆu‘ƒÀ m¿X³ˆáÙÇ Vöý|öý¼Ÿ|äËö ÍÏ1 öŠØÇ¢ç#~rH¦êî—þÓ 7)!–DS@¢? PœSðÔ °H˜ô@ (# Y@/µ=’‡sÈHB¢ rÄÌŠodsü´ÐŸÃä„‹|ŽÉÿÿhàr)H`œE0Ó@àİÿ¯=Ì\Žá$ò‚ˆý¡*GâKÆ`"”åß~C\?·¬‚sT`q4óÝç½3p+X &=ä¤@ï6(_îU&bò9GN0…¥¢×9Hg$g$rÿ¦ÕÛ€9Æ/ø%†ùìÓMV Õty«ÍÖb¦Z¯og¡@Ä3z(¯7ÂAºeóŒË=zýµ%ªÚ©&â–Û÷γ çXîßãm™|7´™fr ‰ G.ô}j:,Ûl‚_i—i‚‰²vû™“ÛË$—–E„ÐéSƒ@‘©{÷wÝ~2_S°·÷IÚÊÎSæ‰ñsΙñÈÚ\&ž˜[ÉÔz=¹…–3éaU·œðØlgë'&c¿ÜbQÛBD¥¬–Oú6y[Ê=³r¾gt¬&RÎ[Û’7[gKnŸ˜©^]~õÆn¥o£©dÔ˜ŒÛZ4m5æÒá´+v=‰›5·3»!_~øÃï7¼Õ¹ê`ÿú~MéõŸ—FëçûXïC,?Ç#?H«m q0L>Li”ͧâ¦(^#H.Ø^àM"Qkõ s]¦ÌÚ-šol*‘E7ω"šáçÄÆÚ… £ýò7 óæ ™õ…ê–éá¼}Ô‘6ZD< h+,5DZŒ›ó¹î=»Ö*<«`Qfðç@C:öƒÿe¿lc£8ÎŒdÉÒI+­F£ÕhW»Ú½•Ï_€Ýbclcük5i ¥„Bœ¸iLu×¾úŠá°Îwvlš6 JH[ü‰m ¶¢48ƒ1‰–¨MÔ †Ï÷}ç³Á÷ö£ê?~¸"BŠ8½ZíÞÌîŽvÞ™çyá¶ŒP/wJÏUŠh‘YÄ ’5‹,‰*Õ¾mÇ·­^è«Yì-„¾𔂠­£‚»ÇZ¹Š «ÜeÐ…±º+¸¥¸K7CŸÄ# jg9ôV¦çw tc‚;ŸŸ szÖCWzº{Öιªn8ªíµùź…LY"¥DÁ…{…ųQÿ´w9Öáƒ!Ì:+ s7x¨ [aDâN2Œòlã'㹋˜º¨mhÇ3Lj±&eÚ–FWqÛ9,â󽎙Xrd“YÈæU™‰þlxWâŽiOP`O ŠÐ/Á  #y|-ŒH©Ži¼{Ž+¼uH†£Ú~ƒ+Êôů•ºb1_I¦j¶&YÚ6eÄ?0¸\ 0Aà<… cɔǻΤoG!ñ"î œ%ÜjÐ"N‹0E'‹º‘1I°2ÖÖ h)h“úÕòÜŒ,U LTY¡EÍʤ+V{xÿ´ ‘´xè0Iþä*¨Î•;ê…»6¹¨xÙ—§—>ÎIÂ5æãÇ¿¯l@°lÂdÁ¨*c?jœK¢98!¬=íX¾%cíi×ÌMçBüW‘™f„Ô–&£V‰žùKSÈ×z/þF"ÜöïϺ¬T´²,OÏú“'!ך¡ÖèŒëG܉n3±Çí‘Ù 7ºä¬38íðûí»Vm“eRÌ´åy9i?¤7¶¿¦¿;_.à·õ¸zIP1ˆüt•|íš+äk¼;ßöu 1ÎÅÛ‘;HŸDhï£B[Ôß:7g÷‡<»vT•Z>ü`×íyOØ×ŒÉàly*[p*$˦’·ß® Ý‘ðŽ×=¦X˜Uü|}éß®¼ ØgýŽD¨#¶Ïwg»Ñoƒ¾¦DÌò9–:ž…d{ÈçêsoÈÖdÜ 4žº™«²µ±ß? 9’qûʼnW ME¥†¡-ÛPgÜKt…n9’Ñ=¡™íh‘°#´Çâ¯.õ½Ÿ+FÂÛŽÆv|ÎhÀЏqgà–ãÄøV·<‘˜šðãVá`núÛ››ªU‘z½;þÎ$>á+V‘hÀ>s¢Ä¼|ˆò"b>¶gÚѲÒÌ4˜„U•F-ï<§Æ±Þµ^ëÊÚQ¥Š©Û4 bJ‚&«5&ûCýrx½ºWƒ{ Æ}÷:#O1ô–BoPW)xÊÀ³šÓ ÙÔS•V‘5ÐUôø1ú$Iôàlb”¤§»^/ƒnÌbØ_›ê©¾íZ·èAW)‡nôOtÑZL‰«­ÅMuº†Ô¤r¾H³¨D¬ª@,erÆèÙƒù0hÀ F. µ‘1³ah%W—A[a\»?$ ÀˆÂUaÌ,Ü·‰™’´R§(ð;ŠÝRCjð-[•†xL–‘kXNu,G€ÃŒó‡t8\ƒZr° 5fƒ£ F%îEÃ&ê PÕ¸« «0€–Bt¸ßr¢¤†müãÒÌAýŲ’R*-S Ù$FCù²à‡6¸`…“"\$àÕ–Nù´ àÉy¼dpî­"oò²˜—ÖWŸÿ 3uI† ¦ØÕ¹N7TjR•ÊŒ™„DUŒL‘iVJ[®4“<Úh’aó²$Òßh N˜RþA;:oðQyIâ|YMÁÝXW²‰EhØf öGsÇ\Ä>uFÂ/]¹ÜXÿýÜžµ½åÞ´7lC±è’êÞBØáöÞ™H´ÝøÜUY,Le„(2ùeïþÅ»Û_Óß"¤.]ø˜QÕªSY´äjôø‘]áYûB¼-:³‰ ´Ä"Έߞˆ4?BIÆ\þ™ŽÇw˜ŠfÐ|SYöÉßwÏE:ÑN#aç{ï5åf š*H¢œ%™Ïo*ùíÍ ëLɦÐe‘Ø›ÓÓw㎻($HÉèk±`S<à@VÎFí¨¸Üo—jþÖŽæ SB!º*j¼äÒuI¤Œ;²=ìoNÆv_šÜ»ºPxº–]ÿ—;:³ëv¬3âÛ»0çB‰G\á +¼ôï3Û ´%â®ÏÿÙñÎ5 ßS_Þü–]EŸþcç|Ô tmýn¡¡J’Å0˜²‚©šiH²*šû\Õ7gìóÉÖ¨¯í«¶‘¹¨…„ŸDœh}X•ÌG;QK¾ˆôÜžm D›NŒ50bZËVÄ"]¼Ò­þb££ Xà²Á(/d5UÊSÙPýšEOô¥1Tî´it—§ÝñTšê)Iõ®Nsª„sª1´–ÈwF*CßšÇÑ'ñHýÓS}éù­OmÊU“êZ8ï¥Ð]®Bp—ñÖ®—¥éT©¼Þ¾~ßúå¨ ”â¢ÚC’ JØ:#ãØODŽþA n#Ã:Œ3!iý°B¿ ‡¸?ö*‹GñRƒ!†´©æ\¯ƒÂ0[v‹<í`2÷½˜§ª½]¯ˆ°+b\Õ;3îÞ9bBó;²Ž£íðŸÙÙ|ŽI°è–P<°ªz£ªÂâL&½¦qXWêI­yNxµØQ3ÞðÑ/^w ;fÓÐË£_>on/îãáã2;;ûï›Ùû›¿±UÀ‰SßÛS˜ŒÀŸÈd_B«n6zÌ äÕT¯&&c-·o½¾,+Ñ0©†*ÇõãzÔ­'+j½az¿øÜ½³Â)±Ï€ ÄÙìv#êÐÂH$45áI¨G&ä·G‘ëã&€7©aáÒûdÍ÷ó_VÛ‘ cjYo?~*¯$)ÆÏr/,oÜxC‹ÿ~p¿|·&©ú׌5'U_BñMšA¨ÃÃ2|ÿƒXXÔjfݵOÂ,Ê…ˆÆ"Ÿ‰ª»{{ÂGþzðЋËì0ϱà`s„DaɉŽõ±È[¦nPkeøÛì¬ÓSõ(Jaz´¸7"{Q÷ŒR3£×E£¡Í{í66]´ç8)AB¬¤¢KÑ[é¤Þݶ†Š-¬_B¥ÊsâÂèY~?XL Iù–/µ—‘àzÚH‚-˜ZִмUdq3¼zÆâfi[CÚÊI[ é(˜†o-¶n|þY¤Ò8_i/lÿ¹¾Ä_!ä²KÁÂ&ÀŽf¶¬`úë]¤+›t#Òë Ý"éq^ì‚tg‘®rN$]<éá¬ûç2ÉYð¨à'Û ÿ°/ƒœ{v[[6 Ù4ÚR”>ùO.:&’¹¥@d lŸ`ߘub†².Û'G VÆ#œ`/™sÑÑl7Kàg¡U½˜üL°\Ôå C.f&;óº¶-¡y§„—kcVV— {ä"—r‘A/"ŠÆ6‰–ö:fúE2À”êgöeHLV–€†{¹}k1ϧ Œ…—xgøÛ6r…³ZÕí¡÷úÜùœ±åH#ŽÔÀ² õÐ !ÇžÆ2ˆ“¸‘ÁïOÇZâzˆÄ¸Ùtûf£À¤‰(¯| Ži-êÙU΋œ†Ášüœ]/­/Îw ˜Ç Ïca÷ÖôÑß+!Sw[ôh#T ù‰¼Ó”F(ªì­y¥\dX‘𫪨ÚNf¤ç1 •™¹‹‡Ïì‹ò˜ÏÕýûÓ䱌CJ{NŸöÁ<.G¤¾úÊûG0©×<-Š™Ñ@Bõš[GÕý)£Q×k Ã\Ûµ¥”Ãi·r¥D‚ð°®íë< 'Õ7ÛäØIŸw­SLzéa瀷|ã?ØÈLÞ£ÿXžÍØÖn³‹EÙÜ;rI8}¿Y•î sÙ,SÁ²§ª©yi‚•ÕV‚è¡éË$}<é„ ,é„ vË|Î"+t’ôð–5urV„ìå ’ö*,rˆÁ1"²mÎaþÔ)’–\¦É0KFDKNhr ‘Ïæ„äiÙÈÕÓä8'ËÃΈùKš¤É "ý4¹.|݇³Ø4'“¾R”\”À! ã¥Ë…ôZÅÙ+2ÌXÞ-ÜŽ˲0â@fB×®¹îìÝ rtº d14³©Ä¹Û$ßmŒ~=Ú`j†Ú2'ý°ýôÝJÓôEný¡Õ[ª\4Cày†²ã´æ¦o)wNMÅß Ñ庄æ5dï¸é=iÝS•Óðª1ÿŸ» ]°ª1<ìQ9®óô™y’þËI&§§ÿo#ÿ剚™y0_Ÿšš²>fI*‘Ì–À-A”íGooRŒæ±{ Íý´(–RÃ@aS­3bMfPsƒ¨Jý;?ÞƒÄÎ ÙNztäÕ‰¤WSZ>úpŸ„œ;ªðÐÕ£J,Oz¹ùò¥ú{s²TYÎ\ªÑT¿i4Á¯é±–”¶`Ié>h¸(´ñ&T? È;7Â0“Xi÷NWBmŸŽuŒGÚ¹îWŸlv öŽÖJ]iS#M“¦/®ùl$®ÔM˜MIͯ«ÑSö›rKÂtËJý×·=Ã×[9†rñ®û /ýúÕK¾¼ã›’@ó‹óPä^ÓDªNOŽiÐwïXÄ7½šVsO&} Ÿ{æ6bÄšM¹Ùš¹ªO‰xhÓ¸îOjF´E5ƒ¹öËO_{¹r…ĹÀß\:ÆÄ NL+˼y¬‚בÖå$œ;‡ò’Ç@_Œe®ñRˬ‚€Åb.$ùVà*e¤} é˜7–Râ[=¨².9³ÿd¿Îc£¸î8€[BZi¥‘F£§ÑÓŒÞhfV»ÞØ;!`lÇ15W!¡ä(-%=$±¸öÊ+{½Y¼ÆØP5‰B8lc£ô R“T¸1$¤¥ôL5JÛ„ØxwggfàcýÍ’¨ýǪˆhUGO£=ç½ßÛÙ÷ý¼=µðBtÔä÷WNu,ºÓUܽ­ :rD×Äi¯pÈ×ö5ˆ­¼¼yÉ“¥n~©#ÈÍ<:õxDùÌ+ñõÌöèÓ‡$B¾—|‰é ™“òòœéG'(ˆxWÏãi±$k¾G r¯„8/S‘ðL-•ƒ›|vŸŽ×þôyVBId«b×2 jp„Áq¯3è®Å9ÑY‚÷$CòíÓˆt´…r’[—æ«Ô d¸tœÁî(üŠ;%Q⤲G¸w¡ìvËÚR¯ëÝCŠ3ŒÓ¼ l `¾šFN‹pžÀûx, TGÞ®«ºÇO(ñˆ~QPÂ-kpck$#ãV›iþøÁóŠèÒ„Ú{uïÁ×ÖŽ¤¶ÿìõÕUåÝIöRZsŸçÜé–kFcÎŒ£ÆèŽŒ…K±£‘¬¶“Ms­{VªÕ2qjZ^~DJ?¿¤tø³«³³3P0ÉÍóLáÁÿ{LOOýóI¦®ßÀóÖÍ[‘)„©DZ»RcÐ-7&ƒv¢ñ¶¥X#¸9ga#AÉk±Ìž+—åe Ç1¼º,cD‘Wÿ¹ßG^UxîÕ×YVØ0vŽg"ÉDÐÂ]Ý?™Þ“µ­ÔŽ1;b'¢é6´Í­Ž'Ø9aEpTx‘ñl“•t®ðñŸ¶©Œ×ˆy•÷z&–ù|ëõdÉÔ?¸AãÝ}‡7ZF–€3“¶˜Ë·ÞoKÖˆŒ™ÑqÇ38'Îl`i}\ûpéªe•?öHY*ÀéO?ûxïòj\Êx*°7ÞxÊ6Ö½1•ªÏ™öhýd&œI†ÌxN¬‘ š©àZ#¸;0ã Vj{ÆlÌ¥°ØR$±-c„Ÿ„öDW ÌÅT^ãEPÝ^7t[ÑK›Ë  S{‘³“Ý¿ b•…í¿Äú]‡“h…S® èÄ1?»A ëZ ‹¡­Ü‘I¬r¢µêÃÀýï|þÁu¬¡F™z¡:@çRˆ®‚؃³íåZîx!wiÛ]‰Þ›Ý]Çx_µ/œOl÷C{)ÄŸø–¿Lçˆ@ HœN© xktv>à~f}¾ßG}Nâ;ðC¯Ž*ÐG6'EÂøá˜/qPn)×\ÇÁq ºeèVö®ñºyMÁte*+~ÞÕõÍ"8Lá'âcå*Q¦}°[€AÄúu8$£If”Ù†úˆÓõ€â8^2XÒü¾ËNüB¨F)çQ¤¢ŠRáÓ=B_‚“¼’3< ·M#§…ácóÆ©óˆÒ; 8+ÀyÞ×4¯6ÏÅ8@îÄÚ{…¿öèðqÞ½XâЇ„ºu]*”€_<‡¸âÞà…s™ ÆÊž DÑ'×›'žJ˜A;ŽËi(™¼úÊãº,(„ˆn\|\ŒxdèTÔ ÷Ý eWÿÃ}œiî´ú¬ÌÚ¡›ù’"sj$gî6“Û1&ÒvKÊ ®[YŠë“Dçë;1C¯OLÞ‘@ÿ8ff¦§¦‡`ûÍû¿f’L¢‰º*ˆ§O~ÇHF1‚SñÀ¸uËi;WCfL¤[ìDØŒ7#G'raÌÙo<¬ ‚KQ”êJm4Ùž¶v$‡#Ï<µXÜx=ºBî2ÓÏåÒÁäçÍv[6™Ì²©mæè–ÉL(u-4™‰^«ÏåB·:ž »s)’H4Ùvk2šH·›#QM—¿;Sº/Ï-Ùè=WSUê}¥ê¼ß]ù¡‘l³ÃcVkÖ } ?ì’,šNFÓJ{{*V-‘c”áÞµw…mE3‰ö #”I‡[BR‚¯³ýûÖá8­x}Îh¿aF'’­™x$À}A4gµ& ÿØvþ‹sé&,ÿþÎ/‹ƒ4‚'~¾±¼ŒŠ¢Èó.™2Eòán´ÎGßÜäËí^]¸o-ÃmìtW t<»ª(ÿ$w§FÚ‹áÅšÙ¶%°ot,mzðÊöÊ·ž©xíq¨†}½LòËD$„ð¢È 5úqËZ誀ö%ÐV‡™mÃÜ\v§«¸k"$¶v-A×Ánd^ tUæ÷.η?äo_ tÖØáÚ—ž(.UÝ*'H„y‰¤Q?Ç‘MU®ø>48R}ôŠp˜AüЯAä´¹4rŒÀ1 íÇ¥Ùniæ° ýzÐ'ÊÓÕótZé¡bx½ku‰¨>EÖbkŠ>{Ù[WÊ©’[è‡{J ›wüsHpνD'xÁÁ› ¢Ð/Êh$ŽLd$="ô Øû‰F¦S&EÑã¢Þ¥ZÑŸu8'À9ÙÉ}LíK(ÛDlg=ù3³+\>‰#D[è%¿=ÎO_¸oì¢þË KŠyMàÝLÑØâõåÚôYïJpª€‹è‚x€sœÃ’[í÷bÁC\,€ä<)àDÊŸåà²ÒºaÂ<2#*‘Ê‹ùO>mÅp1;ì±­ÃÃ]ÁÀr/sû¤2¨*¡ªà¯˜/¿ýÖ;²+±Íg­D0m4§“­V¢uÌŠ:[‘@aM›cé3b«ÁŠ7§[$x5/â’Ê2•¨H/^rÂã4?[8çïl¾ß-NRä¦Cf¦¦f§§{t­D(“ˆ*h;·=`1 ýÙ¨G<4Þ¶Kì̦šP#ÎOo7ZɆ 'ŸWù"]öSAÕ÷ú5¾¿|:òÒ·eNcÿ`¿îc›8ï8€#!YŠdétztzôœîtgËy§ á%/Z mÝV„+4(1!ñâáÄ8ŽíPZ´i(b¤@ÞìÔ©£-¯!…6©•˜4 P¬Äï÷bǤ4ß~g6mÿäT i֣ȾØwÏýî¹û~~"«,,¸};`šíñq÷·þô8ê·ÝHzôhk&Ñ6©ãô¼˜æ©hÓDÖŸJÌZ#ÙD@‹·ÄÍÉôþ°Ï{ ôÁÝ`N?بÇ0¥”*"ùaC‘{oåÒJ„6Q¸‚ÃßÓÒdl÷„†¢¶²XOûg] ­9—AŠLF[Q™Œ ó?3ôv1SENfvÅݸ8–rëÉ.¬2Ѷsûr‰â5êî^‹êȦZñ£f¼ßdS^$–B‹{qŸXŸ—­œ|ôá3Ù®iM_GwLLþ|«u×ÖUÂG¾]’‹Ñ!„ðeŒýzý¢É@ tb»ZÁZ+8ŽÔZ=lÇb¯þ7EjçªFÂ+b¾×[j¥%.Á…OEÊÉ”sò<˜$º(u1©˜£*'Iœ„›¹›{×B'Rd–aMžFj £þÕŸÈX=‰eÚzè\g×ú$XáµX™_¡÷ZvÕ•¬ÛØÁ&•;xærîÄVN;¡_È3€@Ÿ#*ŒZègÔÈ'íp¶dºW¶ ¿`Ð+ÂYnK“9Þ)ü©ƒ$?tíYΉ¼òÎe…DfOdÊsÑ£8«Z?&SÇÏp'çp'œd–Cú]yuàY$2ô*pŠAI…a†.Òy7Yì(âÙ!”S¢4¸æßÁ Hn°©O1¬ÿÊî3ìS×Õ»gùj»4‰§6S·¯›÷f Wdge‚R@i©Hm¥“—PAü·Ö¡Ñ!vãá³þŽâ{:ëã^åá2oÈ(ƒ2\eð ҈˜…œoÆÖWŠœS@ÈxkíÙQ‡NÀd‰ÇZ2™`Ró|aã»»ª(ŽŸ½Yx¸³öë‡þGãû ÃH&iµoV ¥h =Àö³@Ox°ÍœùÑ×j$BØy%Ç=ÑGžL&ài\)Ù9|,3JW¯ª©ð†Ìæeá-ïç¥èëÇzŠ¥„,,+øû}– ¦ÆÝéqß„Önj­/*Å04Q#˜˜Häø~3íÑ‘Ÿ5Õ-äÌ)¹@Å{™:DŽ E'º7&b‹ © CÄzŒ”G×vg‘oŒ÷Œ¸µlpñè‰V h ÇYë(æÕ5oR;ÜÖ¶Ê%Ù]Ôvñ÷»3†ûþWß_'ªR1áT…Ú§TM8çO6ñ_~ñ‹ŒéÃEûXoOÇšÒÚwPYÒMû­i›û³FhôÓÆÏ>Þ©¥ÚǶŸ:þS'µ9EYì}§ßŠ%Ûôtxdp«J­ $Û¿þ܈ùŒdãcýVk˜5¼8pJXØœáÇÛêekšÓƒñ¨×4©TWw÷†ª2»Ì«Ø!óN'QEÆm]Hx×Bd™®%ÐQ Á:c»ººAp tþw ÏQ”<9´fßB·³vs^%Ž#”J F˜ÂÛ6,oª2{ª,!ôñЋ&Q`ÀCòŒé—`X!N¢pZ„3…ÐG —uo.uò¥£¾…>qMö:~»ÍQ)2W[€Pÿq©ÍÚó)¤Žë)ó¯žw¹£Î8àg]0Dá´bí· HNK#ƒNT`X²@rÊ}¥ÐCpËp#EP-ÂǶ¤"v$·‡Ó×0ô‹`L€ÑÙ§ÿLãs®ñp‹üítáÞM|9g'‚K%ªLT'³—Ñ"Ê«çý¸Hà÷亷”gcüôE´D\uÁ×y¸Îf¯ŸS%K¬-Ä:©17‘%¸E=QVAEÂìØ9º»x~w*È>ÔB6݉ÖD¬ÕH¿o5³¹®tÔŸÕ¼¹¬'w›I?º;Ù›šzÕ!?g^yLcѦŸ>Íæ‚¢RL:‰LÊ~Õ]­™>-Õ8©'õ@:Ú”Ó_˜FÌxÈLzL̓W_ûqÄãïêºçáƒoo[ˆGg £_tR™nóöZÓĵÖ¢ž ÓmÄ['ˆ÷êé6€–h6ÓMÝ‹Ðͦø÷»¨IÛ—Jµõôldd¾ÂWÊ<ýÝÐöTª1õýã+ßÁƒ Lä%Ê©Yàà×ïÝ šF0òfRA#îËè-¦ÖŒg{\dƒ=‚Èd÷]Ùµª\x£^Ò“‘œÑœxäõ5¯íŠJeEš·a­T¿XTé|™Èjç†÷¤csšÏLxÓi·¡‡Rq:Ù–LxÌ”o%œÕs¤½Ô1¡5ë ÷D¦óúåý?Z_Ä8â )¡v“˜²É%]ÚQa©#R !Ì‹jèZ¡%ð^M>ÖA¸Á"å?É275ª™êÚòN5^+J#‚€¨wñ*•¾DžTR²gyéo6¾öÇm_¼S•4ä"ë «:*­ ×Ãá<Ï^ý‰ÌÍÄåT ‘EÐU=ÝU‘üÇP%«àýÕ“‘U¹PÝôáйØúò‘5ÐU‘8Tsì¥K'sB S‚˜TÎtoqiÇŠ W°F¿ ýH:£FúÊ¡¯N)„F8kË€ gØ£ÔBf牳Êiû²ƒ‡aöì¤üQ“²Æi³Iv§ ^þ%þ\γ§²å &ñ¬ÖiûKX‚‘ÒÜIñÉ9fñ£·$( âG<¨ƒúEk ~†Ê`ß ZeCYqJ”zuÞýA\³ÃΊò¤‘i ÄÚç'üô?Ù¯ûØ&Î;àHH–,t:N§;e;ªšç…¼B€ÒRh©Ðm´t…„Ī›Ç9Çq ˆÑ–jŒ6/k;i“*—&$ÐRi[«­oSǺjM›øí|w¶“Äöo¿Ç콩™¨Ø½<:=Jž<Ï=÷ØÏ÷ó\g¾¸h­Í£Nâ8†—¤³õ½#ipƒ1F9äÇðn㛞<õ ÿO‡Œñ0j^¼F"\¥áM:Ÿ`ðžÅú5ŒSdšï–v7‹n[ȱ•vãäßd<å%c®¤"ëážhd‡®íKDñˆ{õp§t%cƒZ¸[מӢ­èlÙ¡ÅZ¢¡½¸‹"cîºõ)m‰XK"2 Eö©¡VMíRÿñc`zJ¼`AkÚì©™YLU’­˜°ß_ßâÊdæsI/ÌÍv½à´Š¢eÇòõ†é/ÏÆ=$îuÏב6Ũø5UMá›w‡ƒ®¸Ò–HÆÜIÅsÏNmAcüòÂŽ:/Ò¢E²2¬Ñ¾ÜråÒþPh@ײajJó„¿nÓµE§ÿÝJ4ÚòÅç¾’BÄ­¥ÐfiPCíéHÿ|HNEºñ#=9¹{ìÒž±+ÛxHâ/Ra =Ú¬±79Ù«Åö«QO,Ö ·é³žÉpÛæZYꎿôÛ] eoœX«¿e_…׃7ð% Ë쬱©vùèo~¬»fbÝñ¨¿A¨¸ïZ©h§¦º¦¢­ŠÖªGÚSª;rFtd˜sú+ùÅ#[D‘biÞ,špS§$©’]úÒ#Ö©®:Ôçò¢Žœ^‰Iîwlýgù&üøjÁ_𠬆>Bï*8´Üð­%ç_r#ô7‚#¯ ü•@â¯6"?|´iùj µa…åÀº‚¡&ó{OØ8Qàhµ &æ÷{KÁS¾z¨J0Ð}«õÀzð5@¯¼•dÜ èÃË.ïYû«- ‡7Ù=V—ê+"`Ãß÷×¾²±ð›Klr\ÞY“ö–^|¢âÍ «ŽmÍÿ]KQÆSfùàk„Þjì-‹Èñ¬„Cåà«oø·d½ óX?¸zKÀßžº,ÞÕ¹gƒUà-o9Y/"Æ*2;o ®‚> ýÜ‚Ê%¤â­!¡?P;ç¯ÉúkÀ‹S÷çÈ „Y—”W¦V€×ßïUþo½ÔC_j>j+ÿáJü~1¼h53gáDqm1õnw> Yᔕ€5r–‡a‘mpëœC¢wUÊ)jîgùCÏäqб˜Eû¦qwÍ’úèO[jÌRû£†… È ¼N½ð° ±F£`2JöÇ êOm9l°0ÂÁ°@øñÒHlúNÿh˜Ü}D ÏvJ€³¶ôqëÇm£ð0`fíFÎZ”oü#¶GŠ0ðÂÀc£sÅf˜  ®³0¨@0£~©ÜdÀï;/=°~™á>ÕUt‚@ÆÂ–—Py¢Ä°’T¾Â4uš#r@¥\¾74Â’¾AÃu:cTòJñÆ2‰òŸˆÙÖäˆF©J³ìÔÃûgÃ]©éEï{ñˆ3¡¸pÃ+.5Ö áѯKLqÏLwg¢>ÜÃ¿Š´Et×_>÷6(³3<î€y$C¹æç0Ÿ†¹l²¹¨Mã=^¸“¼ßå.B‘ìÜ\ê³Ïþ,Š"Ë0&Ñ„Ö==´u&rtfª}6¸7kÕ´Ž„ö¼qê1'P*Ù£EˆI-BÒP‹Ü3̪=ÁÉödbàƒ÷ÛŸÚáL™¸|‘7Û%£Ü½áÓ;ñ®™x—r'cžX¤ã^w¼q~§™£x†“å-ÓáþÛñž™)Ïmµ_zá'PÕ\‘`"8Ylÿ ¥[ :“z'"[ uÅ£r4äIDÝ)Íœn)žá“MfÆfø¦Í-Ô­„ÚÂ!wT ´ì¯hÁ$,#œÙÕ]¡`‡kG–'£þ„"#ò¿kÄ‚®("N%Ø~;ìÖ']súÀTdßøÍgš6™Dš51f³d⺄£wˆ¶?®õ>š;¢–§ ä\îËe÷?†¾F°x*A^ þõ™Ck²Óƒè¨rÒ£– d x1a‘¥à«Ê¥[1ø«‰4úÖÀÀlÄ6éÞê2‘yFâí¼Ä\ýQøêHñV|Ù^Ú¿ÊÞQ#´•°-U4sãÖ¦½«Ó¾†?<ç(1ŠÚ&¶S½õ¢‚šÙê|qig°0KvUJçŸ\ahZÂÝOdi:Ÿ·/+~cû DH&P •Dý«à0j§8Ê·!Û· |%¨‚ÞrlÈÊÕDhœréB&Uƒ5Ä!9Cúru”R-xqQMțҔ\ÿÉÚ_o—N6™^~¬èôvÇÍ=ˆqpí¼»„N~¼ä3pÿúß ÎUÙƒõÆùÀÆ ÛòëMžÃ<PV¡yþè¶"xÑD‚68³ ^ea˜!Ñ?b…³yÙWy8ÏÞU#'¸ÈOžý›–6šÁ€ùdåM…¯?‹„(‚WòŽÛ`˜…ÓÂK[iA’l."-rÔÁ§¥á]üeç `Ø §8‘<8—Gd2ÄÀ™?ðOCœä HŠ,p®Aò–K´2FŠ-\ž‰_Òh£>~Í7ix›F<H FÇß00aY4&Xò£\eáÆóNº„baévÇåÊ ¸N¡p’ãìŸ~ÎêØ!ô–¹XXRÈ,eŒ%µ ïã»!ÂÕÿAAw{Æxx+Böš0q¢¢P`YL2Þhá„sg¶ª1WRw)ÓòL¢-¡ø»ïi!W¶‰óŽx$$K–N:ÝéN¾;9N“焼J¡+]ÉV^Ú†®ÐR 3© ‰]ljóRÙ¦­Œ„@`[Ëh7­-퀦„²MÛ´­š¶ªªVÊk^|~·SÂ[~û=fÒ¤V•ˆ”Žý±ÓÉ:Û÷öÜsÏïûyÌó•záq×õx7¦B-“¡Àþ¯u¨<å$*ÒÆ•9çGwÄC~|+¢øžÄ[æ-mC­ßøfŽdÈ‚ðóã['LvòT¸mÂl ¼T´þNdEâþhÄ“4ÛSs>?>®XÈs=Áš–Žù’a_8Ô {Ñm©ñ½)Ó;ÜKm¯s:eQ£Šö·ßïH†ýééÖp´eüÚÀº5 5‚F²I–áág&Âñ8ÂÀ.bƒåk¦•8ãnÔ3f×ÍPÇl¢{ü¢ûÀ+fÛU•Zm¼U•ì<Õ5b=¸ƒo%XrõAo ‹¶ÞºL—ßÿºGœô!3Êgƒ'|5Ð[ ÙÐWq‚AŒéŒma»•AOYFYUЇI]ÁÅÐ[˜ø¸Ý_ =µœv]‘T¢ ÔºÿëØá=•ñŽeKtJˆˆ«Òמ^Ì¿«ŠíÐßplC¯òEÄâ\fƒ¾Ç¡³p»¿Þ*ó8©š¯j¹8R /‹a“$!G tËëËná=AW1³A°’ÝÞÀŠ î†Ÿ>ãØR(TKJ/nqjW‘º°j2Ä*‡žòŒ¸ª ·:£—ªLK+þýL[f³†‹þ%Ï–j1TA,­”X7r‰°ÊÓgÚ‘%±Czœ0P9¸ïÝú¥µ·­ý±†{saOÝG»–»Ê(%HA"r6Çc)¨+ væÜB EFtá¨#êÍv8–›QÊWhä¨È•Ÿ¡=ô?zsšB¡d%ê‚æR+ k0Ì£Cà|¢%¯€RU´©—œ’å1Ȳ ¨²¶8+ü}GÆB6Άa ©ì¨£2 Qv’!™ù¿¢F†2 ɾ3"¾Þ*-Ò²9º@ç³í’QŸ'„~)Á¼Ëè¿£pN…÷ É)yî@ÌÈ0FaT„798ÏÝ:£žxQŸ>Ià4Ûál/©‘¹<‰/ùîM…áSx!rb@«ÕuQ\äÐ,±ÓÞ#ó¦lúê6Äc<üÁØ×¬§ŠB”"C¼rÙ…µ+ L…\X6çZ÷b“Ý K–YœBîLš” n_ ¹°tßJxN¿õtUÁ ‡!ääð:¯R”HE‘«µiÃSwC–ùãÎíÿ¤nfûÿùâ2 ø\ÞþÍ)*P]ÒTÅFb§XòlXñ òùÁc.›ÝØ#aßÓ“÷ÞŠv_‘(ø ö—‰ý’˜·@¼‘ð¥Ã‘q î®hÄmšîÆZWʪ-ËFtƒhÏ>©%ãþdlg,Ô5wÎ×u“‘Ží}Ô †þæM‹§¢=f‰åþôÒËE!WίujÑpoÄô&BÞ4Jl®in¶ágdÂ7u¥#ÉTÓoÅ\¯mކ‚‰/6ᎌ{¿Ú¨ÈY„òžæ²T$89ùÄt—ˆù®\êXý Í X'³ ÏŒ¬I¤{Ì)ÎÖè¤k::çQ6×Çcèª7q'M_t¢ãÿ4?ñ­\™Zlr®Ê‹Š‚/ŒuSøG‹3“AåÐëdÞ_ ^Õwºª¡³Å÷?†îE#]£›*~°ÊÖ´6r ÿRèÇF­ÿ Ö´ÎR–ïÁ è-ƒþ% ]jöÙÙ½4ã®ZÀüõc{+vÕÚqÆD‰*ÄW§Bßr”B/z¦ö‡Š€)š.¨õv ú«?ïBÛA°ÄUbwHìÏlIúûwxÚfžàrœv©¼]å±Ë'pb‘¨H»@±ˆä u ÛÔ„g){øÈ¿<ªr¶ï‘Wõ‡s-<µSä®Í°¨'k<ÇU*–á¦å3ÁЇ ¹ÛA5ø˜=°ì¢•ì$ø{0í¾šñÝõß. ŠbàýpTY ç-Ï-„Ïeyc)ù¤µŒ‚-ê,AÜïnýòZÁºÑÈ YÅú®³üvWùȺª*E3/«*T‘D™,8¸QaŸÔaD†#„1à0ÊDAÇWjä'À)pP‚#Æ­#9W÷罤þyÀ€!ýæaFȯ[óPqøÜÊ ïÌ&îÇòk*„'ê‚xt“ ô ¡0$Àa‘ùç† ØÕ‡389Dá0…#3É 4;ŒXÒ_kæ%|ã4¢ò9”³¡ð>?çô?C`TƒQç8ƒžáà·”IàœçÈè>¾waÊŠ½ñ÷xå‚ë'%ß^á’ÝN-/¬åiæK#§8«Â˜á꬧¹Ø{ŽÆ*M”TPŸÿNñÔDN`§&<ѤgÎ¥ÏôÅC^œH&cxlKtj{*ìN™¾¤é½ð×]Ï­/).†N©$ ÄfÇý\Iå*)6ìG‚#ó­“'1d¿˜º™å¿õÿóË™7ªëêUK™ «›â(å EÉTQ•ãÅ%Ë´ï6ÅâžôÔÖë1–›áqW*²;eݵǣ¾y ¾©öèxk:êIGwQŠÁšÜÝHVy¾põ³½‘øó‘ð¦TÄŸŽì™¯ëF&=Ÿ~0¤,™Ã¹Ù¼±ð··ñ¬X‘-ó µ/ï©I§zÂææD¸5aºæzþt ㎛žé¸7Ý91±5ôöÉ‹55Ò²Zu_põÕ [f¾Ë—[jœT©]´~üQËt¼=t¥m&噼ºmüR÷šm²¨c…4DáÍ7^ø|ÚŸìN…hõ¯[#Ñ+ÀI/’pÿâWOååh"Ž?ïÔÊIr‘HޝÊo) ”Íî­¸X|{Oå,†uW)˵`-ô5 I è¼ßt¯QÃs’8Õ¶ºŠ €ñꄞ¶C°Œ­H‘Þ*æ±_÷±MœwÀ‘"E²tÒéôèÑ£;=§»³ì¼‰ƒónBCÞ…²´jêÔ@(ˆ! ‰g;v[»©•Öò–™ú²všÖjK€Á6µš˜Ö• FQ7 /Žßâ$Ф‰ûÙ&MÒ"QÑ?v:Y–}Ï=owÏ÷ót¯€Œé2óÞ è©‚` ¡Ïy¨!K%2¾Jœ³o:dÖCw‘…þòOn©ž™«à²¥k‚òîó9,†Þ%3Áå¥\²Š"æáÊ9eŽ[©‰:oÙõ'å¢Fð ±åR¥±„|ÞŽZ¨º½¯xàÉ,ÎEETíLS‰¥¿>×”B§à`õ©o9‹xF†,åPž/Šº„‚ ª,+XWmBÎ4¦B5Ðã4çË_ ÞáP”€×•f ŽÌ 8!˜ :¾.ËJ-V*â©‹™NìTRDI‘DIãVQÍ…eÙ–ÏÛ×€¿n&P‘.þõ:SÈÌ¥±·¿üÈæ<è®Ù•×èd̰[¨!VÈA²m(ÊüìãpH‡Ô´Á Ý”ƃ4r"MÄÒeP ôˈ8,ÀÛÆ•Š3ÈuÜ_®ð=kåù“Y©ÃXĶg…¨Rï™Ð™Yä¸ý’É~+ gö'ˆ’fVt„š Á*$xq?¶ŠÀöîn…ÑP™.X,¤ Ée Ÿ¶ÃCˆ .`Ž3øPXpúŸÃÐgp–Á >’á¼ ïËpQ@™|ùqKͪʸ¯µ“ ˰â+Äĵ%~IàqÚ0S,9K -¼Þ¶‡˜mø{$¤&ÀoåË?vÊ’ES윣I¤_¼³1îü"áÞ¼Ðuodtsr¢+öÅÇ<¸&"î»ñ·¯ûuLÍ$$K“¬V"hLàL¬++x»é;W6í|¥òq•H˜ŒQ—Ë5—JÍÍ}9??w?sS©ùþÿøcB?ú!¡l)ã ŸÛÅR‰ûiRÅ’i£ªZ­²U•³U6nÌ¿úçæ‘áÖÉä¾dÒH´Ž·$£íɈ'ëa¥^"²ín¼+>Úq7Ñ¡vÏLûâã-·†CgÏl{çõgbaO2Þ6ï4H×êw:á¾íîö8­ w%…ÌB³5\`3­Ì¶~uÙÍí±ÑŽdrkl¼ »¼à4õM$¶Ç'^ˆŒïm›m¿ñwC5áÄ)K¶¬ãNÓýB핃gÞsÛP¢º«9/<â¹—ðLŒ¹'ÂíS1ßßoúêªVfÏSµ7žNDp|ö"Û¤¯X#ɸI‘k×[v´”0.—:Ý`š…“ÍKÉ_·ÁÁÇ!P—ò­Jç—#é.ð=¾•Ðé\ Á²yÌôGCÿ“FüåÏ.Öm”‰©`ùUÓ²é 5í,‰u!3VB ÌDEð>]Ð&KzÒÅ-Èü+T>ÛSòþóÙ3 F \‚îz8P–ÖH=–iPqµTpÍ”xC6ž2ð9¯ì¬R9S%ô ëªÉ6-g6i «~¿Ã)"a‚D¤góØÍ®*ðÔ˜5ö9Á¿²ï©bY$6Êí²¥.ßnÂéûµà+t”Ö[-¨Ê—2ªþt½é¥YÙÏŸÉ)WÙnÕ%Ú˜%ÜòTA_x !XkEO© -DHoYš(HJÄX^´«úIâPJ´ÜLI¯ËÒÞÜÿñ6ç«OæÕØMÛP¦SâP…3àø/o壞Öÿ:‘ÇÝ¥)l^/ °ÔœŸ zqf‹SþeðÒŠ#k ‡Â4¢ÑÎ…‰–ŸnΓôkpTJ pL} FŽ0óÊAd 1er؇ñb,…r0~í#¼8GçDá†dùî:Nr”á˜Ç) ä½Õ$ͪæ÷cÆìk² A+Uá5–†ÇU''Ò @ö sŽ2$‡?ypœ a^ß±ØJ©L¸®Ëªhε(ñžn‚ä"ˆ™àµ§ÿEÔˆçT8§˜·B“ )pž  æ.K›*á"’ãý$q^~³C·ë¢Dv=!üí,q„fq’Y0sŠ=4\`ð”æ!†°_:\b}n‡&fàÓŽ[ g–|ëZûLÔ3_ð®-Å$òÜ1í{÷|‘±ÞC…v‹Ì9†&W4J©Áä ®¾¼®áJsóÕÍ“M{®mÚYE‰Ä$™Ë “û^zÒü¸’T*uÿ‰òH³ÿkwLE²ù¢$Ù)‘uQh­]ôê†EÇ6Èm«30'5]¹&r›bÃÅLרÁ¾ÊO¯úÇc¡;cm‘ØÎ©‰öè¨{*ºàt~Ð99±C¥»'b»'£‘;íÉñ}ɉ}áѽS1ïdÔ3ñŒÝê˜Jz£ñ–‡¸‘Hk<ô{VY™`˜¨· 5¨úZíæuo<º=6Úz7ˆâÿ‚û ÅÆ½ñˆw2ŠŒyÂ#×>éî[ã*aªœ¡Qn°Å*•4&®ªÕ—Ú0‰l;ýì†/Ù› w|‘ì»Ýµ}ò§=Û¢·N®›L¸cá¦éäŽé¸7íüª5éýÝ¥­kk•0ˆì¸Ž.¡‹ŠEòJ•>æ_®Ô÷*¡{E::!˜_ËÍ/ø‹¯ÂŒ3LðÞGAæÇ¿Îþî¯ÏG"ÈDg”=W½{eöúA3.7åÞ Ô™üØ_ =Ëç}刊t‘jðV˜]V¤ï³5à­þãö\MÒ "` qÎgºj¡¯,}} ªïz* 9î°(n£ ™zqK×Ë .Kœèª(|ôíRðUÁþRabVþ¡É!2¼j(bO¥bÖÒS>(žóçAÀ1ì®rÈ¢L–JbWÕ_¡ÙNÿc?Û`>Ίn—Ö·Zš ¬F)A›±öÅ:«Æ,:S A<½¥8¡{ôT§{QlN_ "…A–`3ÐQ¼O[W¢œ©¬‰„;˜xªéä×{lS×pKH‘,Yº::::ºW÷Ê÷Z¶§M‰“@$P^…eˆ­K m€ BâÂBb‚ÛI(µ[ËhBâ$t-RK·¿6¬hšúצ©Ý¦­0(įØNBh;’ß~Ç´“¶ iTT©4ëȺ¾/ŸÇ½çû9ØÄfzIâ;XæÌb› Õö"ÏŠ »:ÜÂ3ó?Ðÿ^°g‘¶žrºE=ƒåpx)`OÊ»¥<Å[²­VŽ2´¸¸NdM#Ê‘UòÄ«2¼“5;œo‘Gj$”à RAˆF 2úaæ´õõ.ff’&QEãûËž‡ú".aŒa ¼iˆóGÜpÊÞµ’t­±¼ßlÿôd¼ƒÒ ƒ90 Û< «øP _— –Ø ¤À0ztƒÃ‰›7lDo©Ypï7NåpÁuç¾^úK"ôǸD`L‚k Fø5…«äèóõæTøèqÆpå]¯ª)ZžœiÕ-OËV"éYÙÎ=9\á0jëÎãFšXc.ôRô¢»¶8Ã`œ‹äzygÅt ·>ö¼÷‡o{f¦}‰ÀÏßßT·Ñi¨Ä`N»,EVË’3½+k>|©>¶c÷­Íž;/ìNmiù¤vçÏÖ>—˘…HøÖç=F! ’¹¯>óü߯ÏÀ±×pvã wà"Í%Yú·™Îl4½·Þtv…éä&¶©BuJ6f¶Q<ÉF8•©¹¨€?¾>?–L¶Ý½Û0%ÌàyR©½Ó“LL¦Ò̈R‘ŽTÔs/åIŒ{î'['£ÍÓé¿›JˆDDã¾'õ¿‰pÛdªu<ÜžûUSCCi]]áöåCCkÂQ_2é¹ïNE'£¾xÌOí|ÜûOÄ‚«Û÷T߽ݚJ¶¶µäù”Å¢íñD÷{ïÖín,àLR¸cø1 .™S»Ê-¯y6Aƒ5OFñhŽE|±Xë­›ûRác‰ñvìyìŸdÄ;?ðMkddðûy¶vE•™Šn5$V­JgšVˆ•oOél§zÝ̇`‰pH°‚˜\ÅsþÅs¸‚ÁŒöÏwýñ—žXŸk£fÆeIS5bÍ”»ÅlÖsO¯‘&|+ €î*ÂüšChaŠu¡ÜàÏ?%}_ñCM+²S#fU‘-LùtW>øò Pþðaô/}»Æ¥Úˆ…P;eµÅtäo^Ë®¼rm:«fñ¿z 0"¡£äï»J8}ЇÂ3ÞØèÕèÊ…žeØÏà_]kÌD¸d¨f›Dçz ÁWþ•/f˜;%²Áq"U·ä; 2^«ÑÎm,øéô¥„9Ë×É;’F°…Äòc—á=,?}Ë¡·:s®7TPU·JH˜,*ßZ(÷púªà’;]ÏüöE ¨•sÝK¡#ºK§¥ó=ÊÿUP 8pH¬CUB†bDò!‡¨†n¤&¶½[ýygñëßu©2ç²E#TU¬Êײ} EâQD6¨0àHSBˆ *`°"> j™ U_,4§NÁ•Ód6¤Í8aqBa ]ŒÐŠ*»Ì$Ýbn*!ðÂ-§8ài#ª‰à‡§?: Z…INk‚"} Œp¼|6äl_C Ó(Ö]Ça6ûj \Ô1¯áŠ‚êøª¹¨Ì5ÉÔ±Êtv“idƒi¸ÖÔ_g®3ÙlúIåY’n¶JRÃ…Ej*DZ·Êñ‹³Û1_jÊ3žhLEZgÞ‰ñæÉ˜g&y0mMÄÛ0%'#mX’á¶©˜7û良Ñ;{¿éôü¶•¡Ð†,œò%ÚØ”ì^)J:úÊâX¬)•òŽ{þv³9ZÿìrÜ/æ]6¨….Ì”o|♊øRáýÉdËxò‰©#ñ$£žéDÛTÇ¥-9ŒyRñ¦X¹ë™ðÞ홸Û0™jÿø/Þ¦}%VŠC¸b@ëÄÜR¡Ýþ!Â#gþcå?Jçât’–ŠÎ%_nã~±ì-誄Îr⽋DŒúÝ‚]¥sè £#¥½k­H.…㔣ãòÇÆ$•ÛeÊu.Ù™¼ÇE‡Ö‘ŠYÉäá2è]&(Òµø‘õñ?ƒ¬ÄÞ³«N­cõ …+üÅà¯üÌW¯ä€·¼*“Ú0æÕÎè;ªm 5”l¦’Ö*+t/‡ÎL,‡`6øË·½Xc觪±]n‚E~=eО‘zµ~‰C6g¨ˆûê|éÁáJ8‚‡ª*œªSæfÅÀw7›IT–¸*ë7˜nVd"ó…ŒYIæÐºð–  C:Š„d‚eÈðW‹Þë\*¼(šð./T,h'é¸FY•'ýq_)tc¦c7b ãS±|3B eâg`5Âì0X ôV‚7zŠ U5×½ËÄpt¦ÇÈ$ÀazXæëZ’®FÙ—ÏOO僎ÅáÝG¶ÕÎq]Æ(·™¹žïÞÚJ`([0ÕqJ‡ oË0Ì¡Àˆþh¥ 쳃®ø#«MÓ¯#0ìB,gdècpÊýŒ0f¢Ð§þè9Z¬RJª¨ ô†?íŸþ¡š<_†!î9ÄBðÐX™!.ʰëË>ù=“2[ )˜ÏŽ“ÛÍp‘Â5Ls*²Óe2j…«øMÄ¡«­”Ï> pM¢\>¤»ÈEU+òÌ'ö²›2òe1b1þI~ÝÇDqæqß„d“M&™L&“'3™ÉÎlvADY+ÐeyU z=«ÜµP"¾ð¢ôÔ‚°„eaOãµ½\ªVD¬^ûÇ%—æ4g¨oÉ]/Æx¶‰w6iUXö•W) û»ß³˜K./11G“NžL†Ýyž}vöù~~¨îð¶8ªâšøôOÜý384’F€Ë Üä_Q°]Òà:Ù["á–k–iA‘š¡ÑÂ6ìŒ8ƃžÉȱ@À 7Ç\A'M¨À¡© s:äœ 5ŒáˆÓjžû­§=/y‡ß,J ÞŠpDýE‚i hÇÃʺ@Ym¨´f´¬f´¢v¤ôÀXYíwµÊª¦JkÿP°MaY³¤ˆDRxñù£Oç0‰£ó Ï¢ËH‚e<æþí°%¤áᨩEZ¬dÉ3ëºwéÎnÕ](Öõ½£û5ò¶®÷-ݹbýÇ%L[¼Ùj zÉ Zdc¼Q8ŽãÙâòœá›õ3áCÁÉ¿¿j&Ü4èœ~Ò6l8GüuÓáflS¡¦é°kÜßò5`"H–ÿç¶·4‰“Òqìšd"à ŽîŸ ×Lê"ÏX¤mðFUÁ†U ¬k ™¨<˥ʆî¢5³m?Oîâ‘_Í‹iBs$v°àõdÓsgÖ|WúÚÓ0Á›=’ LX´Dúl×Ï)Q:s›R¡Õ~¹ØÊ#‘M kBƒH’€Õ^N’0PdþºjÝDëF8¶Ü+¨m<8Þ0Žlzñ|6lNUpOTÇËì‰BߨŠYÑœnNæÒ;Ãó¸W›R¯',Ô×äòV%>bF΢ÊI¸3&­2Ô7äýå›w}Á£Ÿw6Ø8¬}ÿF[(ˆ©Ã†(EÎŒ7O†žƒä§Ö‚ÁFÇ{vMeXÖ ‰šª¿{¯aÔß<çûhv¬s2àD ΑîÁ‘<ß½Ó”¤E— Õ=4‡} Óa÷«šÚƒ Äß0‰µ@˜‚dÜïštÌ9æ']#Oœ¡ ×gŸV¼f29A%¨UcpG²øÕ¯rh1Û±ŽgÍc ,??þ³ÑIeŠþ‰¹Öë·¯¥yçÅTM…ÃÙ‹î7ïìÉêÉ“*Ò™ ›za;fèàÝ žôQgJ"Ñ[Ý/ã #‹HÖp\E†Fs¹+•Fg‡5–¹všž´ Ùð?¦Ô¸^Áz*ž“UYsçkÐË8|/žÝyðë h^Ÿ¿RB£j¯òz,Á$N]¡0àÚ­kÁûP×oU$› ‡#Ox=ï5ŠÕ›ÖœØšú~Í&1xUÄ“4ž¹S•-hTVnq2CdV䕜Þ_—9Ù™êH¾[©þ¹$åý73öešvÙø?KÁ†%t­Cs.¸³O%­&Œ‘% K4MXR’jüþ¸½ºMЛg$è ×ôBô‹Ð- :¢Ý~o‰áA„s2|l„~õ¾‡Ë5V‰hQF’9ü2WÈ==­Â9åójƬ:Ù||Kôp‹ŸˆÐƒ÷±@œÆû$!N _l‚> zNq$}ZèÃÕÅ6ƒJâ8]¬¨\ÜP§_Šp…ë&äa; £+8¸úò¹ÆÂunð1Û(ßœO³i g\ňF³ÀdÇs—Ž 7Xø‚…áø®2ƒI0È&=ÇÊï®ça˜À5®ˆ0$¾2 3€¶¹%4ãcªâSjâYÙ¨=¸w`2è öMO`05OO8}Êg#Þ±ÈA_ðàÜlGð‰ó‡ ÷ý»{K E“ Ê2áì$b–T±n]úÍ’m**}»¡rGpGU Üñ¸²îAYõ·¥Õþ ÇHyÍÈnÇ£íû¿Ûíðï©¿RXž( þØ1<<¼¾Ïž-`/“~®Àó^”ºdGÉvÂ#øþE~½ÇFqÜq_餓N:iµF»ÚÕî|6ÆÀacŸœmÌ+`06ÆÁ`c jš€pñóðÙªJ•*”„—ŸÚ4•‚’4Á¡ ”¤•š4m$ÔRbؾ‡ÏÆB€ýëo ù§* !üGN£ÕÝíæ7»³óýLŒ!I$žpº\èAŠlº „ÞÍBo¡Ð[ ôç §Ö Ýk„Þ|¡¿Xèß,¼»†þ|¹¡êv‘Ú‰Pc"NïÔ…¶#G6Ýi ÔŒ‡j=ðD†wO†Û&"õ¨MláÑÝhNI4Ø4hœu¼â†Ààà&CÙ)1“¡‹«—ª_}Y9Ú11V xïÜðLŒ5ECU"|""ã•Ë3™®2bU¯ÿçMô r%:ây‰%¡m°ª{áúh¸.®åo‚M# £#¡‡žæú¤ù”Í¥„QÉbHv*6¸mCµÙǦQ³¤ZÌ —|}žÍâw[À·ö'=èp”.n̾¹7ƒèfbH6‘¦Ë ÈSä©m¿mK¡Ã+'xëâç§›ëX¾Æ ƒ0Õ¢©¯¹T¾­nàµe!Àçú¬4^%ĆñnØ5¢‰ý,Mƒö®>Ž% |8„ÔÏË¢ í’Žû4\(¹‰É¢2E‰sà¿u;fl5¿¾"ÿUÖŸöÉ&'c¢9ì”y2å  øæC;¶œaD‹‹Œ xqìKgªJyÒšÎaÐîæ Òà°{Ê›2½ ZÍ)€¢Øï>º:ÉŠnReJ©SI D\Ÿlª_ÓÀqBÇST¤wæ«Õ‹Ì¿Ù’4Úœ;ݾü«·Î‡CN¼nS­8–ñ®Û—@[¿k¨ ¼D³5žN›ö î1¿ûH¸IÖ¢ëàðÊ¿íÊ^êQŒh‡jXKUõ¯›ìpF†œŒƒwtZŸ«‘ z5èÂ8J¸%z4.‡-r‚Ö®uU¢ »x禓Ɏü…–É“Îû¿ŽWEÃb·á„n ˆ™Î8xϽ1ð> GEè¶sñ2t8ŽòÑ9HNPŽ¥.ûí#¶¬DQ'2&3ΕŒ8òc|Iá>×à"™1É HÅNÿ Î[¹7.èpÁ:ù‘Xî62ׯØë¦‘^®Úžœ§×{Iq*qJb“e‹«Ùòâ´±%Žìô‹—§‘Ë\àRgnY‘¦‹t#q%y1‘À/øŠlŒŒàÐ3ñb0=óLšÆoï¾QýKŸË!›t#‹¦R&Q…ù ®òJ¾+ßy£¬r²Üs»l×èÖª`yõhyõ÷[+¿/Ûª¨Ø±çNùnÉ-üf[eø]¡õ»“Ý|‹À>&ëÖN<žšzšÂÓOßü´_O=úó•«2¿@ —>«]2.N }yBçZ¡¿HèÚ,t—Ý„S…Âéb¡¯Xè*âû „ß ]yæ_Æ®›Ç¨o°‚K!®Œ_CWæÚ>ø¬|øž÷n n|¤öÉXM(¸7ˆï#œ’hȃÁ:öÎ:^q»õïºÌ»"™cTf:1ß §A/U7ÿóÛÖ¬áÚÅ=¡p](„D9xóz몳Æ;t6õFFêñz¢î^V=‘ âÐiD ÇB»¢‘*ür,Ð|ó‡ÛJæÄ©²àP‰×˜*Ò çÜïȇCYà[€»ZImYÓm™³mÿ§Ì$“F(~÷t V»öïogö¬ÕϾ‘Ô²ÒóÕÌÔXjwÐX§Ȩ1áãm)Nt”%‰gKØ_¶;ßYÞ}8^'´¹¯Væd%8«…2‹ªËfY-OTØuk"ø]°ßÅù×±v™ÆPs¬ÂV;LßìˆÿRØ·&NûRŸÝ²–d~D7âŒòç€oçÕŒfqð‰äæ%¡lÑuÈÂö,>ü)÷Ú–½•Œ`¤” ™Q•X_aå0èL€“6è–Ÿ«‘Nz 8Æ Oƒ2ôÐeÀq ÞsÀiÜÞ¡@D;sìY¥\nÐ}¹~s5©ÀÉzËe›$Kºš IР%:eN‘nôÄqU8?ºîü‚¤k¦Ôžê‘‡©vjÒ©BdÜ„šR㬑³\ÖáÒ!~ŽÁy­/œþ_(pɘ ü¿ƒ\bÿ:£çÚL‡·[à¢Ràíkdª¦j%šUe«æ‰¥u»­§‘F>á5 ¼x¿Ï­G†ó HØõ·'I¬a¢Ì°Ëj Ñ?úÝÛ‘psd´æa´1<ì¹n¾õà®w"à?ݹ!ÃI“é B‹%’)æ_Up§¢f¸¢zd[M´¢i¨´ahGÝmþ±z¸¬êNY%ž TÔ Oî”UÝ-¯Æ³Áí5c¥;£Û÷ nu*ŠÊdMU1+¯\»öŒ Ó3í§üš†©ÇñXZ²5¢ û˜(mJºK…þ|¡o÷FÿF¡{ó3ôâ±X8¹‘k¤g£pªXx¿Hè/Nå g6mëbSãíñH4…áÅÆåÔJ¥M©WþZ{"£µã‘Öp¸ MÂA2¶7¬»nŒšf¯¸Ý{¯þ±:5ÁüɧÛúÎÛdÔˆè óçê55+Ò“ˆƒÆ8mÒ·Ú$ß}ÓP²ÊEÌ–9ڢƽّ±½÷õ÷ƒ Áƒ/­žñ:”a4èü/ùuÛÄyÇü$$K–,=:=ºÓîlÙy!ㄼ9¯RJBŒ(')òæ“PÀÇŽcš¡N}c¬4ä…PºMÓªM¼­tíTM­¶©ÀBºàÄ!ŽÉ Büì÷˜mlÊHhù£Öéä\ÎwÏ=÷<¿ïç‰x¡=ãÁÚé0¼/÷Õß5mÌO²ð"AŠšŠq±ˆ…›óž”¹@6«Ò‡m´j5,f×-¶=þgóý{aë-ic 7ZJÍ䩘K’Wd‹’€‘dU¤3 ¢ÈóP£ ªXú‚.zhõC˜¦VšˆeYAª‘×½½qÅ—M5)É&Y§¨:•_’¢éÜëP¨-‡5‰uE.íLSAž^ßYôJ‚ ÃHA`LAi$LYS– µËÌ‘C¶¨ÏF™ ^øyŒ5¬}éÔ“Íz¿Ó>Õ–A;Ó™H½q´+s¶¥ <¢Y/¨J<¯L~íˆuŒ{·§clÒ«²'æÈºûmysÌ´©¬½Å´#ƒì±Hf×½@Ït¬]¼!”NýÙ±ñ“{ä§ É¦ùÔo¥ì̲=ôf(Aì‚¢#ºxM±"s =zO£'Í´Š0( $Ý}Ÿ°ïÝ í5Ò^3펣=–´¥H&IRÎVèžT.5‹&=A³ú8Q1hú7׋ô„Æøó›Ú0L?šïVÚ‹‰ï%B?éI‘¾i7a ŸôiÌÐ2`¡ÇíÆ·ºŒf H¯|ùø]vÝ_¨ôªžEzÓA‰¢gNÿ+zQ —Íô x†ÄŽàY ÎE½ŠÆ~Ê;s…x¬aÙ S­2QT¢0g¶“€àx¦¬ÿS_ýäÙï»Ðv6 w§ƒ˜~¦¼Ûj$(Î""©Ù)hè–{fzw$Ô o*â…Z/œs¬/Ö/ê‘"¨²fV %¹sW}QñÚô®Ö £n´r×ÝÊÝ7+ë‡k\CUΡmu£'CHõžá*ç-GÃ7ŽÆàvgÐÑt»Ê9Q圬ráœê½³ Í[ÜAà–——ƒFææ—5Î?yÌz :?ã÷× †˜{”F–ÝÌõ–rg6r}¸3[vf&Z`BJHSUUãñÖÃ'ƒ¶Ãò0…¯Û>ïË dÅÒ$‡¶-âv¡-ó_9«Ú@€äÑ>«¥@Ñ0ÖŒB¢ªGEFýÑ"é¯Î‚×ò´x¼RQM‚áʈHë£#Vê+xÜ–õñ¶Î!—ŽË)¢Þ¤êõDȲ¡Ù«äùi„ЋzYbäžµ”¤ áüîê\;Ü3;°ë7Ú]iF#¬ƒ©E#LÖ^_eRójýt;›• C•õ@‹o«n¿ÚÜÑtì Õ¸F«šÆj\Áê¦Gãðö†ÛÛFv¶Ž:\wN8ôRÕxw[ÝøŽÖ?l­])ª&«˜ˆ„œ=ažE2>ž[l,Þ'Fp‰=#EO†·S¶œëwp¥\ 7°…¨àzʸÓeÜÀF®óÉé-܇ðç&örº„A¥¿,&–-l¨|°nŦ<’¨"›Ùˆy‰è1Tð¤Äžž¬;wXŒŽ‡\ÓáÖ§™ Xtü¿52Ñv?Ü}ýAÈ ûH¤ùúç»ãM²QÖ+«¨¹6# Ü¿×2=Ñ:5Þzìxi§óȸûþTã?&¦G^‡‹„"uÏ«=“cf'™m&Ǧ"Îð¨ç£I„3#^Ò°NF’`Ø_¨Þõ1Šø ÎVÅò==VŸWQo.«Û°Z\|~üWš0°¦Bºµ¥ÑöL¶¶õÚËí+–x^Ñâ°þç•iÑŽ<ê±ÑÎâ‰:M导©e… Ž‹¨ÏJ¦¹ò“°Öqñ¼F$ô³MËgty`F2-ïÎ.t̆ŽÅ_íô½Wù†›,óhÛ<ü—«²›¼b6Û|âjAœÖybØáÙÐéðÀ«pÃþìgíeg–Ùœ„4ÓêžÜç†PJ‘+©ÐÒÍN4j£<“ŽVû!h'$ÇàÞÒ_#ýŽSˆ¨Ñ }\ ¡Ÿ&O)!ox­œ©s(_“7£«Ò¹FÏ3]5âÖÑÎÙï÷hp Ç¯s&7;·Z CÁJ¨mÍjaôŸÝL¨£O] uNšEz9œÄN-“ïÙ¡ß4qÜvj}–sY•ŒºÅNŒ½oÊÉ >#pÂo)\§/œþ—U¸Bኗeø‚Áô€ðÝÜP­P"S+•¹”¥dDö2øŒÁÅYâ+×ÈßÎR›dsÍ’?êBº¨/M#¿1çh*.™à¼2ùâ]§‘[©ÂðÇD2n}høÉÁb·C±PŽë *º‰°…&ËñE«¾ÙÚˆù˺›ã›÷ 1°Ý]_{gýŽ{¶Ý­©½³©þ›ê¿Y·†¶üðÁú]Ñõ»îoh¸¿¡>º©áï[ê¾Ý¸kpcý­šÚá{Þ¬\š‹3„{"ÆÝi`O7 ¦é•šoãÉ'?=Î$s·j5(DµSa‰ÿÙN¿`;³2ãð"¶ï·!“23s¢ãí7š´ìJÓ™óoǻƆ[ÆîÔŽÅýñèLçD¢16Ôø0ê‰F¢{GcõÓΆ©kÃÑl#±}£ñV<ÞÇ[ÑjZT»Ùv6²">Ð9÷<¨N4'^Z§#ÑÖØ½Æ±DëãDËÃÁæÑX ‚pl¸9uÏO4Ý~X7ð?ºÛÓ³»d&cñ®ª¥…œ}-‚U¸›Üïjj[©ˆì.„Œ–˜ÝåÌ}‹sÓ¹\üïÈè(~Ü•ŸŽ6O²ƒÌõ¬}îèþê?l/½ùv.æ t¦ÚgA÷|bæ~¼V—4›Ž`®";¾ÞéaÝYíå×7Ï”¸â$º¦¨;‡På£P„ò!˜ê©ZjË@/JŠš©hv™Y¹,kêÅð ¸P ¬Ã—D'„ó_¸Þp~*œ mÞ‰îJùbMUù³eIËuH3nì.%`íÂ-¾ÞTÖþâHµËDEðsz`Y6ʦ~^p¸ž†KvûdN©Ê²IÅp|ÝɯÔä ìõT¾ÿj–•J”[ubUUþáz³X0¼»ni!º•‘Ù”V9%1_=Þ”…滸µˆSy&!F]Ãd…Ìú¼§‡0ú+Ò [í…郂q±* P$ø‡Tˆõ ÌY ¦ 8BÏ×àT·NûЪê]v+¥&U¥œê*ÏVÈŸšpÒ Ç‘Lxà„#uLƒˆNèÿ•‰ø\í$˜á˜ýúDoV߈×,Y¸ÙJxz«bÐf™~Õ`‡>%Ù›uûñ*W¢Ù¦ÈFͬé<ãç»ÏUÐ ûä1 èpL‡Óêx¯Z>cÓpÿ(›lš¦}ØÎ„C.Ép…'?gpM†«|Ná"GQÀ'¨ ÷WÊUià‚RáÈ°Èæ×‹f|ý‡«V¸Là^Ã5uâ’åb‹=§ñù‹^aƒ£ºÆàcQš@☊ƒK.+pÕWd¸.]pì^¨s,˜’L•V–ÌÉñÌ’4k·RÕˆá²WÕùªþZ³ëáÖ&TÇÍší÷6Õ¿”v{íǾðùÊTÎÏ;‡yœJ¦RßÁD¸$™L‡tú“ÿï—¨óÙ“q˜ôù|ªÌu™ZLLYç{iÁ¯ô®Îx¿&£õUZb#\2j&”¨L#ÄÌ¥êµÙç?Ýýhìàh¬1«?hj× 5bbŽ ù㱦è`ô›aª5òŸÓÄ`3‚$1xøþ·mñ!ÿÃá–h´.kLÄ[bÑ}/­ßÁ–±„?ñ M‚÷ùQ¼A2t¯!mK4?¾»5q»¶vK¥šÄŒ%Dæ+²ØGëæ${bÔ¦üp³`ê÷ªØ]š…ö%žîI»¼:caW c9X˜ å {´»Áñ”3vÁ‘*h®¸±½huž1‡LÕe¹ÂÂ-vMt­„NÌqJö–¸4ÎáTÅÔøõ&W:μXÝHGù;Õ©¦¢0Ãï6Ú¡§D )äƒÐ¢wVä¢aŒŠ.©fb²qÕb`V«lüc}©ÈâÎrè(lxaà¨U™–ÏÑ×½Â_{ÿW¨•ëgµníqÛbTt‰,…‡¼ή’w—gšUpÔðã™ÐU8åó‚3"zñÞ¨+-Ö ³B-Ž™Ë&YA½n¦ªE㊎ωpã|Í ¡Ó*¡»p´ÝëÅ‚¸Il<ú³iOKž¢I‚¾Ú|jQU‹¢¦·Ì³@—YÞxKvCpÁb å.µò„Cº<àw#cK‚>hG–xÄ):-4Mé(šD))ƒÀ‚ÎR«Ì°X¦ËDWÍYÜpî-ý "¶'}vˆèÕ“§ôªi„¨ßkä{DlpJ>l:DØD?ÿE›ÝãÿE~½ÇÄqÜq? 餕V£Ñj´«]íÞêð ÌÇûx;€Ó:%®©?°q§õ#@ÀØ>ÃÜ&ªš4ªRÛàØ±]'±ÛH­ëÄØøí¸ªª´•UnÚ:®k98 ˜úܯ¿Y7IÕ,¥«Ñivïnf´³;ßÏ$È!.*Šï¿7½Gƒ:tS8ª\Û“´"EÕÄùóE[¼®Pó§P’@ö×ÑHÀ Á²UnbJl‘,cÓ„ªDf.Évò74—ðPîÈ´˜m¥-&oI[¡ƒ2F5ÝEbßX¶ˆçò\ÏK¨ˆû{÷y?®-õj1¢,*ÌÐp”¹dªRQÆ 'U%;[¨¸Þ_é†ö2Ø• ~OÏsiN"ªº.‹B²Î†vfXr+†Ž¤ëõYI"EÕýðkNqº=ðrÆñÊŒ§]±çªŒN¼ ^~C‚^Ë®ÙüA eO·¤<.ð±5%Nù ½ø—•¦Š"SM¢Ø™"öŸTÓ58?Óá ojÐ¥pìÿ$ÿ1 "„ÁQØ'Ã> HïÖ˜‘Ä©3zòE üï¥ÝŽk,×dºHå¢ vfÌ“IÛröÔH7 „ñ–÷!Zœð†GÌŸ.(O`‰²$2Cg$ÕTÇ­Ãe gôèÐ#A¯}X°‚Y/sŸÌT =È .JÑ÷¸DáœÀÉqYæH8‡ìùé*—C¯%‡™¶pBŠp>Q^x ˆ( } ô ¼k¼xÖi]$c'e¥“t*™²ªQ'+©L-w˜¿YúìÕÕ[ÂÏ5¯« WÕ V½8PµuM2KùGuÝßWo*4t…QÜ áÜýâíã5òð@ƒXŸÑÿß߬#:5ñ/˜*NÍq1‡.Ѫ4Û‘5³¦‘Ÿ?kÛ÷¤íp…íx¥íÈS¶+Å-'ëÓ$‰h5˜" LWãqwêLŒ ì]û—6†o·Fü‘š±pÃDÄ?2ìŒÔM»³­&÷ʆ"ß(QRu“ª•6ç‹°7Ëðæ<袰_ý²|©$Ê|èr@7^Ñ­¯´èëqùéºø^ Þoqe ‡ÍOÚµ<ÃN%Ü@0Is9d’ k1òBÊ쯬•©‘Ct8¬@—“k+Ý"¼¥] šnCÄ R$|yì^zœ'V¾Ëpžq3ô¸`åþL©€å´ çø@âB8E¸FzYô¢EtÈEË$(ôˆp†rÌ´}dÌÆÉpBŠ xú¬ñŸÆ‘SÞ~/þF†ÓäÝ’c‡B>vHiÂa^G|gVÉ ucÕÛú«®­Ùü×Õ›FÖÕŒ®«½YµåêìiäVÕ–±uu{Ÿ¨ Œo@•J½w''§§§ô•ÿ‹#zïб·d™’î TH¥¶îÕ¤È×ÐH‚d…íh…í`™í@¹å“J$Šðã'i9Æш¬H²¢(²„Ë—êÎIzûÄóãõýá£Ãu#õßnò?v6Ì©FXþût|¸il‹ËÈàC3ì¸=T7{iDŠD¹p†·nj¸{;t¥oÓÂyÌP%Y¤‹£’=P?µ«ÄJ„ô ¿Ú !˜Æ7§­Kæ|U÷'CG´b¸ÏMƒŽ‚h pÌÿÏV+”[Ý“¡h˃vÔEn´3ë~«÷Xe’S¥”é†Ã~d¹š‹q¨]ß^Œï;ÑEÉH¡öKÕ9|Ûš>ÈÈÃe—ª25Ìs_ï±QwÀO:餓VZ­F«Ñ®vµ·§;›Ø®ÏgßùÎgcü„!‰¡M?ˆ j ÎñŒñùÞÆ†4­”ˆÄ`cŸyT•Ü U-U0o(IÚªRþà¨*)¤Û`ó àÇýú›3DU%þpd©§ÑÊ;^ÍÌþæn¿ŸèåÆñ2nu¸¦ÕN|iQ, µ9qèÍlèrCóÎ tèò>•=j¯dÙÎeý]¸ ˜ÁFû’ìÊYÞo$kª=ÿÀ ûºB[ƒSÜê“Vfÿuã6FùÞJˆBÌâ™—M‡2 ç0SÜyº^~´W‚HËš÷}‰û -ºÊ Ã Ñ<¶¤è’¿ï¬úUMö†®«M^¯Í(šU›h¶‹2'§o[¦ÀÏ5ØO¡µ Â¡Të}æ-E>Ö¡; $A0Бž¼‡‡ìÐO Ç ý‹8ÍQv’o'¯§-Ë7]HƒM •…,Dª„çjäp:¡°t«Pa@‚Ð'úñM‚“ðfQ"T©9´m ÁŽåûš }d§yæ“ïÄÆY’ü.¡Id„Í$Rq*eü/Ÿ2ùœ¤³|è™F"ØEP&ˆNJLP—ÄKÊu¥œN8J,féE0Ò%Ë&oõå7ßjÜ6ÖèG„|Uß|mÍ–­õ__ë¿ÚÐüφæoûçJ#7êšoÔo¾²f³Ç¢â“†âCK¤ƒƒ˜ÌSS“ÿÕÉä Âÿð3|\æòòT±KŠªpÆ&a`µáÈÜiäÈ }+ }Ë ‡_1}=5òJCï2CÛ†Àr±@SEb“UŒ¿4ªEæÿ£·\§?oüf¼edxבÝwF7¾p6ÌŸF˜=ÆZ¿ÓÈÓv«ùÞ¸ŸQáÖögJÙ>>²m®æöãŒcÃÛïßÙ>zc#âäÑø/‡Ž7¦ÛD•žhV«]0E‹-‹ ­Zó¡s‹Â¶,–Q÷“6¤Â¼kd"Zû Yæbø†ª¿ö/I¼šÑV!MF²!쀠“¡¨Ý‘‰ƒ‰¥-"Ëj¬f|´X‰ÜY®'#¥Æ5;þüNÑr›Yxª¥©¢²)GxÜY{¼˜§ï[ðI UÕ6x_ÐéIKwTå¼Ñ!ó9}¿‚ƒ b‹!âc9YMÂ…lQ\Fª'œE[Ad¶·] ´âK¦1â#¾ÇA7t8!æ…ö¼É wÑSà^`qöø œÁJs…2YèÇ‹¡Ó5ÿ‹•÷A ?pÀ›7˜A[jÄs?R9‰B•2ïŰ2^¶;Q'Ä]OB®ºLNm:V\ÖzÔû­ˆÌ‰öò}¯¹U"á[ šÐ¥š§Ú‹õËwßn-͵HV*š$«¦igL¹tIŸ/–f?Ø] {J ž ‘LV¶A¨å§‘xò.s)r:äœì(Þå©Í¶ØEŨÈD6©‚R“§ÞýP‡zSé{’žg é¶`O2¡A‡”'ý·ý$‰2ù˜ÂQeb?^FoþB/·›(µòTEU/qÇ>¡Wƒî‚_×ò}u( Ûs5ÒcÃa¡—@?Å?¦ÈlÇlS‡t8@ß{Ý”A3¨bÓp¯xî8þ /kL#CœÑXè_äà,æ;™µN ìˆ0¸`ƒüÓÓS*³Ç N¤ÄYÐ$8ø9möÔA ¥(r‘0Šàøˆ“s2[ü§Ê—ÇøŽzüþ&_MDdHh.¿™éøÓê #kw}YÛŒðxP×ôÆ–o[F×´ ®74ýÖ–› ›Çëç†"Øn®ÙòU]ÓµFwÅJ…i"åê*òÎPdzz B¦g2súüÔ‰,S KaÎã ýõ GçN#ÇVúk<Žþ„&^3®1ô¡RÞ`³Yaè¯6TR •%Þ¬™æ . ”Ⱥº¹uŧWZFï·Þ¼p6ÌŸFð8C‘ÿÔȃ1ÿ½[ïŒÝÜtï–ÿþííc7ü÷Fw=›³:ŒÝöß½óîíÑ#Ã-ãc;ÇGöþöðzÏ“˜*?¶ "÷Öd1„Š&ãÅÉhY2è‚`.ÄòÙK.¦a“bñ|?Õ“ñRs¸Œ÷–þ±®°á%Åέ¢éÒz쫆à¢kÛ–~Ñä….L®,z!žÝ_i—N´ ÿùO+§w¯<ÞPPd£Ê«ø®§I‚EòɦO²c>"$BÎ3ë:¥ø@£G—îËÙ=²,+ú¬Å·Ùaì[žö—­Kîv•CÀQ¼÷"ØS mè7ÄXþB¬Šu¢ÑEMU&>û4Œ-…h!\Œ4v–A´„á'—RJ1‹]̸°+É:Ë÷%V¥,ñÃ.”@ûü§0Ò+ZÈtÄIJ¡ âÃ&!èDZ ùäbkdC—o"TÐU,kÄ’&ɲ,bÚé²Pm•ØUÑDDQ—ÓU"Ä›!VÍDBä~´ª€#TÅFù,".m‚l¡‚ü’dS¨. –÷_ɸ²£ âˆ\ˆºØ¼Ø"o£n–¤¾ 9xãÉÈbˆ/†@ÖðßÊ<›*šª “­+ÊI· &ï4Ò;†tHÉ)tÛØe=ú¬ì²ýäaB­â2xÁÌgPÕTî º­ì²^;“‡R÷e>_#*”ᘠ2›tGÖà ÄŽG¬Én}ƒÇlç^V¬¢˜kãÿÖ“Óà‚„ x¸ÄÃ)ú½4‚HÐà<58ÇÁ'N#BxÆÉyΦNOÎôÌrü³h¦@Šà8ˆ“ó:œ&~/ï]/,ÌàdJ4^H“‰óŸWKUý7¯6Œ¬Ýz½ög×ë6Žÿ›ûzâ¸ã¾’¥•NZF«Ñ®vµ{§³Û`ÇÏÃ>ãg&@,H¡À üàZ°1÷4q›¦BUCKðùlih‰ÔV­ÔG@„€*òGÿj”¦( ÔöÏOž~ܯ¿9“6ÿð‡+[Ž8F{{{3{³sóýL]S¼®é³ºÆ{{ý»îð`]#"$VÛ¯k¬m¾»§q¡4‚¼¹[×4Tï¹SÓ¼A3tJQ#85.]ºI‡$ëÄsï¹—«°ÿâÙÄ"¾V*œÛÆ‘p~Ë‚i¤ûeáüv¡‡Þ.D$»øÉÞͼŽT ï¼"\Ü$ô¿,üt›²«RfúrUÁU09ô™¥å§7|m]r6,žF¾^þ{~"vŒGÛŒ´G[dž¾ÿp´}tðèBõ;2rd$Þ:?nñ÷½½!]Ò$MÅi@mE»ðŠºÖa@ B.9Á¿ e˜ŒÓ¾®‘@~Ÿ±è »#©CÿŸ?(ÞäEÆ$3Cfæ®ò˜¿úêÎôlMtÚS†Ú1¾óf¼[žø³?Þ_Æ1©Ýª‰Íâúå"¡ª¢š„2Ó«öËßvÂ*¹p準Ľ¥é|[Iuf±0ãf}*ÿ…pbªNv”Chø ΩÊátC ‚ãÇý€¶éÌåœ@3$“Ñ[0ÿ”Çà.à)X‹ÍÎâ˜cÖ²¸Ž0ß}åÐî|ôº‹ç»oÕì)TGYòÑ”pâ±ÇÕ‹ý\‚sυߘ¯ ük¸:yÉ©ââðfAG&—c/Ã;÷ç¯?ý[ãÆåŠa`3B Ó"«© CAG+2+•%S1è§-™½ Ñ•—ðgË)V5•j¦d%evË™ÍùonÊ.K—˜,â®èšnºw:Ÿœps›ù‹ø —N#øgðqtæp7Vs¯òûqÃëYS^—·4C— &ë¦B¬4Ž2;ñ39I"IœKÚµpÎ (Š>6¶sTô˜V÷"„ xÛ:^¹o½¨,i6ª<|Ü햡ŸÂ9syÓÏ ‘#?S#aúôç?€³ ?sA…>åÉ[2œ7Gß2ª²E ÑUS¢’T›# ýÆZxÖ_±Ãû|`+óׇ”××wÂûh#锉ôôä_P„Ÿ¹AøGóÖå†ù€òF°ýk*Räöi‹;‹¦)šI»¬*8é4-C‘Ž•W ×µ}Yãù²¶q¸þÐpýÁ/j|Vƒi¨=Œ ¨y-Zß2X×ü¯šÃwj›n×·,”F>¯çu|OÓ஦‹ë·K*FK—U—Ë…Á€žszdN&ÏÓkîÍNOCÐ[ïýú2.ÁU4¦Ò &t×ýÕBÿKB_õ¼Õ1ï²í+Þlã\Áƒpµpv£ÍiXTÔþUÔ´™i$£Äñãß×Þ|c&æx¯õQ¬}$Ö12Þ‹¶|kŒ{ßo™Œ8ü`¬}"~|4êYrf|SJôèÈgr¬u$vd8æmÆZFÇ<Ñû“wÛ§†:¢ñPwÏ«T³0ª-§Š…*ëlâow8À_¨¯ NaÖä,¾:VCh 0pÑ?%h.9¦s"ä†P!ø\7ö¯sJÊL*;lT,JÍcDÍ$šª§v”g€¯"ÑåÄþq €QI—M\ŸM î7˜ALYÒ¶ºŒ›ßÉåv¨×äŽyØ,öX<ZÛ¹V't™E£ÒÉ{; —,Åž×â-ÁqæJÁ\­¿ÕP¾¿€t™ILܦ:j—‰ªéV¦Éš´3Ó„@Ñ´·”_(l(ÉͱX4³*Ǽ¬” Mè­l+ÍÔ4‚Œ¤r:®ñI°ÀoåLwÎÍ¥2d*„²ð ²s éC,r¨„Šyí[Å{ñ'‚%‹?(ÉÜÄI×›ëM•Š¢®!¥l„ºW¤}âO‡° ½I„S¡/ º ôèУ~­(OKƒ0ƒãÝÃÎD¢­ ²yó{ " tkЭóF~!Ù­—1“‘|Ý[I®„¬Ð+AO*œ¡I}¦R°_lÙÓC>í²gR(¦FS5Ŷo£WV$Pô¦<ë¯ÒykaÁJRdð'®Ë\/W §Èu×Ð3¨~owÂ ÍÆ¨ÝPuEV˜ª™Ødêq®þèÕ†±= C‹ÿO#cµÍww7 u†÷4UZmDe:ašªýêÝKH ì™$K330óü€dŽ"ÓÓSsÁz­»RcŠCÕ)‘èÞ5Bx—pa‹Ð·Uè۲虣HïW Á:²•ƒ$R+z^täëL…i†!ËT×0*S ÷eþòFÃÄpûx܃Á::ào›ŠµŽ µÆÛâÃ퓱¶Ç±£c1|Ûºô øf‰øÑØÀ‘ñáÖ‡c1Ž<žꘈ7á^þùf¦1“­ «¶‹¿ûnù£®|ƒ9§/.×ù‹¾J‡’ûGL„P„’=úr!‡aÁ<Œí+§N¹áBU²jT¦’¦P¦IùTøÉ&‚nè(HŠ cÕJÃ"JŠC“4jÑYJceêß› àx6nTŽ­)³Šh‡Bk‹M–òÝkpõ­ûùMö¿6VÝ÷VA¨téãû9+Á5ÐY’ÀGéÏ‚ÎUÐé>^þÉÑÊÓ›²NËz«Ñ½÷M’ ¦æSšòÎn'œÌK28÷öAg®èD¶RÉF¥IOœª€“Å œ$§²Æ•Å6167UË>:TÞbøaŸ½^œ?E|FáõhÝ  üNð@—ûGKë/L"Ä¡> ðx±Ç{G!t­‹µ•_4m*µHršf:˜P¤IŸ´Ã9d€¤‚<Ó› aíyJ…¤IºQ+¡Ç„ˆ4ÙŸ^÷‚`§Š¢Yªtó˜ aôé7½yUÙb‘ Idª]$äBÒ Òù’ú/8oOôgj$b@Ø g噞œ‹‡l4…i¸ °X©%âep ®ÿ‡û:âºã>’%K+­4zz=ÍhF3»²½Ø‹Y¼>ÖÇâcZpªØjX΀9lÇØ!ØØ»k¯¤¦%5ààªJ‘ÚªR«…EI$©Bˆ¨åJS{½6>b ëã×ßµÿð',òú§ÑÓX»ûföÍû~~2\°Ê$V¹h… 8á åùŒ˜çøšÍž7½ôG¹{«ˆq")Qާ„R™éŒU¤¸þPZygsíw[ÜÞ^+ÜÛZ3¼åÀжš¡Íûïm­}oå:Bˆ&«ŒÐü:4>ôx¬y|¨ñI¸eb¸¡ÿ½vIN•(eŠ,Z²’”ûsxÿˆ[}0 :V`#9Ó‚øŠXnÞ±væafñFc"˜ÉM*škvCG!‚: ß)KT1U"D§Œ‰H‘mnz­Ö;ÕV¡Bðã'x1ŒÞÊ3ìºM¤ñŠ&åñÃåà_J¹{8½úu•RIÔœNÿÍžUÐŽ…I”MÙü[º³¡Õˆ}|/²j]Áã¾ ï° Nð»x‘«f: ™ÇKH†"%öšM˜h^iÊat¯lÎwبE§qÉŠQá¶C·gÞïþ× ×TGÑ[©I6Ê kO©šÓ „Ò(‚67t•\«vμܺGÜ|8‡¦ètòŸ[6§ j$´°ð^ô}À§©:r 3×äÀºtB-ŒŒâ_®Íø6hpi ÒÉÉ®‘Ó ôšéÓxá5rƩЯCºEýÀåK$Kª!Þ:æ˜ï¡ÿ8žcĉ’a ãäBã—©6']ÇÙ^æûpN~žFæ?N€>ôN£;ô%u­£D²âv¡+DUânö¢ÄéK \´ÃùjDä ù\„ 8_Xáž‘à€ÝÕø}ÅžXi$쫹ë;pGýˆ¯ö¶¯æÚ¦ýÙª¹l¨:‚äêÕ«s&Hæçç“Føå<{ÍF£x]åe庪¥PlIâév¯0° 7LT½$ ¬ÿŸCpŒ \+ô— çÊ„ßU ¿Z¯–¥3ƒJ²”);íTÖ¨ˆ>‘r½Ç7]ÿ·<²k<üöØpã£Ñæè”:\?1Tót²%2Òs¼"…j˜Œ4OŒžŠ4<küa¸þI¤i2ÜÞÛ¹BiªdPª: 5]f_íó@G>´™ lÐl-Û Ì¦2ë…ïÒÜ?ž Á|h/‚ŽbÌ)B›wþÝbh)~|0»zi|šNE‰1âPeª©úg; ­.hÏx*€¶ºnh-~ØP^b·ÆSÕM“STq‰aÙ–›p¨h©G³™á欩ƾ µÐê6ƒ/: xµ¤CÀEÒÄ<¾YÌÐïÌçôâÏÊW­ÛžÎåÙQ2â_ûùæå¿¯Ô¦E<¯©ßW´DFQZEժɎ ·¡Œ'hN”gW1ðËÕèÓd攘L˜øÉF4F´§q[v\öeiDß—¡ß¬Ë‚c?~ïl°d®s-´{¹Føçf.<\çm/áV ½fËÌy H>©ÌNR,fhj’Jd»*ßè²EOKÜ!§døX{’ÿ×âÄ} ”¹* &ÂIiü´Û_³;yîž×¶üD$*Å ÓI­EÉâû[ɇëõiV•Ä1CM–,WS ç¹3IЋÎ1 _ƒÓNËO$WåÄQšd“â 3V%[¦ÿL9E."EH¬4òô¢—5„|!Â+\F“è“oOØËó¬ØÉ2&Y)Mu—Ÿüc¹E—*wÝÝV7¼åÀÔŽ†‡›ªïlÜ1º»!VóÕÝÝV{sóÞÑõw6í o;Øæ-a„¨DÒdµª¢rvvÆÔȼ©‘E‘yóBލ‘o®þá®N¥%„InYø°RxS,úË„³åBoåËÐÈüØÀÇ}ÏÎü}²N|Cèÿ™Ð[& ø„örZlK5Ia( ÐDf$(²·DýõŸöÞjx0Ý24Ú81Ü07Ò}xx2RŽì‰9^‘©Ÿkšišmœ­Þ?>45èí^C IVQÑ(‘sdãfm.tåAKtxÌî÷|¤H!øs ÍóÂwéPwHÐd€ß­Y<¿0/.8ZG ÿã_¹f‰÷AbØ“$f4ª‰º1S–lèrE›Ñ$ùÑN×|‹E'+’D•RÍ&2Ü<)³â»t‘ª uQáh1‹4çA†`¶@>´šÓÀ” Cpmìã{‘U§‡çoe[­ÐZÈÍÉYRÌ÷6üé3 3Bi¸!´ünè.¬J³ÙˆF4‹U5¬ŠÃI-·ª³­èÏ€¶eЕùéî\D*ªJU-£‡ñ™s!ü„ŒK6:)¥º®++•¸+[²!ô´çâZ‚ŸIkGËH‚Ù|½q2½àû€æiÏáƒ@®ù¬e= ®úËÆ4ªË"‰S™-MYŽ ¹0 GƒÔ‚ö#Hzb±úe8eŠeÀ= úu8›øø”f€F;Ý’laVŰû–Z¦{\p.yºßøá}mo†|ž&Ã9í¹é3à#ƒèe|¿apÎ~=¨,3âm6ƒˆª&¥4”R¸Lá‚È+FK|ªÃœ NƒÀ_éõ~éÈ›DÄŽƒZ4F$ª'JŠƒr»ãrUÕ#_íðöúï¶×ÝÚ´ç~åîÉíu‘õ·|{c¥‘_Ý¿¶×ÿ³ªúᮺ¡MûøþK~ÝÇD‘ÞqŸ„Äd’M&“'“'3y&;³ÙÄå–wP{Þy'UêÖª°€J+‡€TÎ7Ö}a_ÒæÒæŒõeðÒÜ¥éåš6¹öì5íµ9LcÏË]½«žZE`Aðzžz°ûëïY¼öÆþ%®¹N~À“™yvxf¾Ÿ_ûùï´”†¡¨šL$£££÷<ˆÇc )ž\E<ÞmnîËXl•µ­y+v—LcDÕÆrax£0¼^XÃ0â®'ª |’µÂÐF.¢áµ|J§ë„Ó.ax‹à_!ªH+QÓѺ”ÈU£fGæÏ×öÏNuNOwFgö`òÞ‹îK:ž’š™ØuoÖóYtïé®è­îúfǹʦX²³PU$¢Ó¶ô£Ö\8” ñ]†¯Ê˜'ÁrðŽƒ¥‹ý–Žyª!´’_Ý›,èˇ^4I.ô•A_ì3ápÕèÖÂ<-eC.{£Î¤ÔD˜2»I(vñ·:„²ÁS‡ À“‰¡=5¶U䥧Ød‘Y%;Q 3)3r¨øò æý¾gxa>b ö8yö:c¾š!'ôä'?¾¿n•Ç}ë/N—S>§`ïr~È["ØŸèÉÃehÑ@ÉŸZK¬Äʈnh"U™jØ=úû-¹wC+ XóA[M£VÈ6 ÆÎ¶bÆ#þ B%ŽÖ¨Lu(Øk¢jy&ÓòÇÖUW^tþ¥-ý6§uôÕ@¨‚/òà4¸~_#ÞL8¼ü«ø­åÇ‘Uüž”¿¶y¹Î–8fS B¨Ó4.´A¿ á¯(‚uZãµ ‘°NˆÈœ%g¬ÐOá$Á“ç(æÃý¦.Š*Su+ýÈO!LŽÂˆ}4 ÛL9fjrôó‘‰ upjB>DÐEv8£¼Ö®I²ä`|™%í^Þ¥ð[’4ü†Àdx‹ÂÛÚø/¥cmb…©é!ªLµT]f†LÊŒ¬g]·[:Ç6u]«ß1în›¬ß9în¿¹µëZSdž¶‰ú¶didÜÝqÍÝ~½±ýJCëlcû¦Ž)÷z+¾éP™•P\ðßÛÞ’l5,îvù“OÐ!>á³,“ÅCuB£Ðÿ‚0¸!¡…uOH# 5X÷Ÿêÿnbç:ah½0X+üÌ%¼¾I8µFBºl”ÝËô BeÍP |"ˆ¬R›X¿¯è­vÝñNG÷D'ö"N’΀§¥&vÍŒwÍŒwßžÞ=;{àÖX_ä„ÛF]ÃG´)RÓ.¶ÁQ ñeà]óbãV}•è/¶´%<=­*¡)’ ¾l8\1é­>·½pðÛYÇÖ¦_z 'S"ç…­9³ž5àÏn,±éTÄ6Q£‰ÓÝ+ T<ßW¾“ÞÊ8— â ÿ檿o¯úq­~ü[äGkµß·`ޚ¹ž,b—Z ¡jC(ÃΘ?+~¨€ÿzòãûëU }\Z…L ͉b fò+J­ÒWŽ<ø"P‡ª`Þ¼§zK>³2»D•\"Ö窭™*eŒIÌF—¬4ÉóYærš²”P™TÖ¿¡‰Zp Ç‘¯¡²ÑÖ*U“ …0jJÑ4)GÁ÷„%Uµ4çZþÚ^2×Sü$‹ù ÇZ˜Û¢ß‡¬˜§è¾¿‚3ñƒ× ¡ÿ—#¼ßØTš¦.Q¤Ê¥N]ºX'48• HD>Æ0¨Àˆ §T8e@?ŽÑ*Ž/‡58®_ò)è¼[’¯ñ0†Â‰ øiÚÄ€’n5D‰¦ëò{Û#5rZ¡Œø) V8­ÂšÄ§eè·v­Ví4…IÓ§^:«ÂÛzÒ4òkÞ±ÅÏ)oþ¬-Ԩ̘¦j#UÅïR¡f_¹æV“{¦±õS·çjƒçzsçÍæÎ±®‘©æÝ·Ü×v"K’¥‘1w×?êÛ¢Í]7Zo6íowß°eSTU":c—/_ŽÌÏÏ%m‹Çã±ØüÂà¥ÝÝ*¥X !ä¹4!Ü(ô¯†ž†ê„ ÂÉu«OD#ÿ]è¡Za¤.1Ÿ ¼"µÂàzá¬Kqq,¸–üÄÅÖ¨ºÆˆ¬‹AL]å/+:^Y}~ì@ôN×Ý©ÉgÀÓQ÷ow}íþçô¾©ÉîÉ)_8¼ÖaMa²®*éz¾&]ÜYÁB8€½êêØ¡2Þ'r~‚·úœÐ‹dQLŸ¼…‹br¾¿7Ÿw¬FþèAœT€ÿ èëÿ¬‚,š÷Ä{K¸üå¨_š0Ž¡Üëä«Î—7çÏ?®Àš‹; ¬²$RÉTÕt"½·½øWÍ庢˜ÔfÑ4«"Û›È(ÕˆI3¨&î]•ÆÉ|p­KS‰d5*¦Þu‰²Â4;S ƒØ‚&Q?m²>‰¯äáš÷ås,ò}@îB(ü¹Ð㌪¹IPbüPxóÎ6dZLU’­vü€TX±< ŽQ’°ýúC„À@áŒ5Žàûãas.l@„ÁI+ ¢=šÅªàM}³%Î(0@¹^Nj¯7/“ ÍTD“ÐCÆ#5‚WDó„Q!¢$LB b¢L¾8n:Ó[Y"éL©/á)iyWzÿ¤ÜºZÁì&D¦Š¤êP©©)ßÏ-ýóæÎ ÷ž‰Í/Þnj½Qßx¥©r³¾í–»}¼±sÌÝ~£±ãjS×Ç ÉÒÈÆ„FÜ3ͺ['ëw^kêüܽëÙÒJ;ÕL•É’ÜÝÝ=/dw’ñ¸¶yø<ñ#:;¡Re)AŒʈpb®årq ü[‹­‘¡-B¤Nˆ$ÔƒôÆf¡ÿœïâgòAð/êë46ŠóŒøJ–,´ÒèÕhôjF³š™Õ®OìÅ»¾v½>À6â)×`åhZ'à€‹c°½÷Ú¸T¡‡cC“´h¾…€1©MÕ¦RZUU¥¤Jì½¼Æ8øØ§Ï;8Q+á)¸ëÑÈ;;×{ìüï`³)¸ŽlÒy%K8K”Tj#‚¸ºÑvüþHOîOuMLtÝŸè™û0‘Ó“騡tÌ—Œ÷$bÝÉ»‡§ã=÷b=ÉuÎÞõ=u6¼,ðvRè‘G˜S>ïƒnï†BI¡ZYf¡9$G#Joƒ8Z QF#„¿ò­-ÅvI0 lk„krØÖç³9½Zξ°#¢ ìú×b_9+V>pÝÿ]ßì¯0lƒÍ,cêC…K!è„H5ÓQ¨Šµ……u5Ûb&²@¬`[<¾G¤t‘ÖWÆB¿ÅcnV!£»úŒ¬`µ‘øµ_W5Ky¬ˆ‹]9\±€P5ËA,¼W_ë(„(>žÂ¾ªf·`GV,5!ìÂG‚¨ë‰õN<4!öC_ô•·¨Y5zl6]0S\éaW-É`ˆ‡Ë/îÌÓAA±rÔ*[ì*ÏUËÜÁº¼Ôl_#‹ àjÊå)¯ÈÅV1[%‚oƒë ²o}ÃÆ\Ø5‹Âå©ôf»ŽÕ± xàhÑb  ŽÖg Œ²ÑÖ½l,Üö°ÁZéùÆÑ)ÆiðîÎ]áp™èP4™ÚU«fŽ# (ÓÚcDHŸC$.«ˆS憵®ÍÙ‘ðÔVj5ýî˜Îà)äòë§šÅYñGcÝiàÃh 眴À+ ÉpF^^)œVÿ1 Þ*(ª…ç5óñWu¸a†k¼/ÂX\5ÃGŒ¸.|{`á²ãÜ0>Ž 0†y¸†ûø@€+x®Ð—̇Z¼N%[ œ h¢b³ŠZ¡› Vý½åÅ>×v‹Å}ûÍÖý·[÷?-oüoõ×–—sñÍF)«ˆHÓ·î FfaA²¸¸ð0Ò3Æ<‹JY€YÈÌÁ‰ãoHTV‰hÕÅ;£Èж%àv¸ùk¬´FšMç[L£ÛL¿j1 o3üƒ Ùµü);ØS m1n1½³aæ§-¦Î J¾]×5‘"Š’n5‹œ¨gÕï(øÍ_üòVàÞdàˉŽTìÀÔ݃±Ø‘Éd0ÄÚS©Žx¬ãîö©Ô‘™©žtüÈÓçÄckd:щÄB$ît%':gR݉»¸çH"öj&Þ5vq¯®ñšÌåJD”4¤Èû?¬ŸXÑ2–£0°ò©Ùz®ÖÈSK¡3¨üz&ê]Œ¬½ÐdAarj¡*çP¢ÉBeÙ.ÅÌ_Ü]4^Qç®(£ÕÍsÌ‚_CZž¨àtÖ1§H¡(‘ïç›æýÑ6˜ìóýŒ+Ý®å4‚îbôB{Ô0„j2á5–wF¸#N0g±Bˆ4œÆYx°×@B„Ö° ×Ïù‹3¡ˆ”²SiÜŒpÃr¬>Ïlðú¬\l”#eì,Ü,7ÎEº ºƒžL´f¾ßûUij5øá/¿‹á„%²1dáZ&tkÑ“š•K¸Bö S#Õ_E×½·GÃ…nžh£‚n£ÙÚ[Î0†X 5~ôŠëÇ®ìRÙÌ™ Òn—2þrù"Z.€MkÂõéAoɶS5‹<ÿ½Ýkfº0€s»öfûúm¹Ö|—å,JÕc ÊL ìíp!“XÐÅ ÅÀ†ádã4Ú®]ùùSÊ`òÌDßÞUéÄ%Y± \K©’ø™ §8#Á°ƒõeµpN‡³2œ•nÿ²Ò­˜e’ëiž˜õƒ ëwW“b‘Ïs$ªYEóðó:œáMÎÛÓ£8«Á Fäé! ¨”室 'åS­‚LUA2çÎ&q>a)ܰÂUˆWy¸A¾­F.S¦Žk<\ç™@®TŒQFtÈu ã$ó¡yþºøn·ê‘ñ'Ÿ­Ù9ªB‰Ès¤ÆVðóƦϞ߇A„|ñÂ’½ûn y†Lòië6G9U$ —c’åÄÑc°¸ˆñ ÿag!ßü-¢«â³ÓU«V‹‚¤H²*q¦Þ¦%{<¬áÿ£FF¶šÎãv›±ÝÊîxê;¦¡íË?¼jdd³éí-¦_#]ö˜÷˜†~D›Wé:Õ\Ih‚d©D%"hüöžšñOÚîMu~ž8ðYòðýT uó@:vp*Þ1êL&:cñ¬;±ö‰dûÓçÄcVâPj²#ïB~Lǃ© ߟ·ÏNû±Ã0¹ï<§+¼†Ý"i‚Ào°·¹EüÅ)‚ÊLoDëŒÚ ¿u1ûjæXÒáë×m¤aýƒè¦ù.ïéõ¹C[‹Zݹ”š9ª6ç‘–Î*ò„fñŠj-Eú[‡~R6-¿úëÆÛªÝ”£‚"ðDSTŽHøoT¹ß¿¶é¯‘¥9†]ÔÁ,~*Aà…ÐÇVGŒc0y}èõ0øaüaG« Z™ésÏGË2ýH…"—0³á3#|åÐà÷0ºàE°Ç˜1ÜìÊÑZˆ Wª]Á*Ööá&ŸR²Q ÙzC8uL;H µUìQQ8ÑJA´à”è/Ÿ0€yÍ ƒOR ýF;|˜'Öoe,ñýnÖDN¤áæëÕ‡ËL9²9›¢I´ðÆ\¯ƒˆz ³áöÕÞï­ºµß1篃H èÇo×Îö6|¯œšy±ˆZTEzÉÏÎe]Ä ã¼ô’Ó)g ¼&¹\µp´žõboƒt@Øex¯’õ îÄÞö—¯øüa3Ák´®| ¿Ø\¢(„RExÞ¢7—šá¤#VD–P•–ÓBæ¬E‘àdþ¥Wr½b–$Ø9ÁÁ+Ô*Ù5Êó"/˜Õ×j¥‰·lpA†Á<8-}ÒSp¨Â”<óoêë>¶‰óŽøI‘,Y:=ztzt§;ùΊnÞÄo„¤ Â[“Œ¥$Ò…ñ’wi€ÄvÛ! mÕT:6Ip …–®ûcBã­k'µÐ U•:u¬-ƒBÈ{¥â{ö{–NÑŠ œŸN§ÄÎ=ÏÝãçûù¥ÑNDÛeºjít2êШ2~F= ²a `Y6yW£'!<ý“‰žÂôϘž”X#g$ˆ}àq³š8¢Àñ=# çܯ¥…ÙF£‘˜d³&Š‚€yŒfKrÀîù|UõЋµ_WUB€"™tÈS¤‘¯ªjÿ°ô!™ˆX$éɳÆFGïÞûïH×õØNž6–¬týè±c‚‹X†Nå`îà®°ü{LžO·F/á:–q˹Cå Ý¥LGWO­gyœL’¥\t× €)ãºçso–q¯–¥,ÎÐD""H¢Æ¢†áå’WìYôé?wŒ 7 \ß4Òç°îõÝìó _ß>ÔËLÒ7ì½6°ùÉsâáêæPãP¯w¸ß{cpÇpoãHŸïæÐöÞ«‡{.¯M³òDB&Éb¤<ÕúYƒ¶ºi8‹Q$lc[qzOõçLû® ) »n+T.m‚KçÅÚŠÏmÌ.³™yžŸ¥IV³·`¡uðgYz¸àís’$ð¬ð&3V6dHz$Ÿúf±` gÞõ9ß~Þž$&`uÏsZŠÑç1öû±¸ßíb±qÑæ¼ïyð85Â(’¿·qÙÌ|$¡œŒCެrX±#„c‘îs2i´8ÙG~îÑ!²}sõ¦¹ƒ ŽlɸPz¾:í“ éª3Ïo°Ý·ÎU§~¶9írCÞ·ÍóôPˆßM›ÝqíAÓXL³ËÙ©ßδá8Y¾Ã¥›=Ô<˜K› ÇLDlŽ0`vÛi$óÑ¥p6ÝF00Ch.ݽäâ6Ïv·œ¬ñ™„ûz³#±³5t2&]4â¤;óÇ‚6½-.(Cdõ'ÒWÝGË’gˆÈ, ̧bñxeîw V€YÈs¦Öd½ž¯ fl³  »Æ}9lÙ³•ïbîòç3§=zÀ­\lâÀÅG©¯ûW,TÀC$‹6Á£qÝ úŸU5d0aÕH 2B¯!ý·fÚ™ëÐèA2•bâé ôY]ük뜹V.YNPÄA™Ÿ! ×Všz÷)4Šé^)Ö¥¶UÍPˆ!QÖšJíšE÷áXM©‘.LXô½pžxqgb¦‚ˆ¬Š2´‚«•ýXÖOéYÀƒHO zF|`üÑLÏhô8ŠÃ&þñøOÏ¢½¥½üc¤ÂmD z+Â~%¥jNæ©’Š[ÕõÃkk/­Šl„LÔd¾_[[ÛSUûÄ™ñëZÕÖËë_)Kš [¨K@øÝwÞaþˆOFºÎ^±øñ)Óˆ®ß¥ããó]žÈI¢Šˆ‘k(dÉ>Á®¸@@&“8™n¼Qƽ^’Ð^Ŭ`´8VÎ~ÓµdÊ÷³±-g'%Ì-]%\W)×QÊu/æŽi–±j-4yd“À+ð‘$‰)( “¼H +¿ÒÛ88äýv¸±÷ÊÖážúñQß­¾ú«[!ʇ¶?qN1RÐ^šÄÏ ˜­[3&¯'ÒpËS¦f÷ ·èìªÜ×;FëòY|øm´ÍFý–›s³Öã×È=8ÙÕy,jÙÄí÷Þ.d‰Áp²#äi‹²ø“Ÿf¼ÿ¢ípi⯊­^§¶òÓÂT‹ÐÕš$$ÉÖB`C6 ’DÈ…eÌ+˜×°ÑŠérY¤…6˺lÕëJÜUœrx…íƒõi_z³nEÚ\Œ0 .[á\–òÁþp‡¡*‰;éf° ¸Õ}»íg"¥a }x^mðxôÖÒ¿×¹·\¢‘"ŠËqÅMÛ´)Á à%õ;èÎÚZHýÂkwX fA%^É(ü~Í3t×öž}¤Ñê¸RãT1ÂbR m¡-¹ °ÌZílŽÁ46ñˆ#>egÜ?Î8)íÓ¾~@ApÝàÄ"É¢á¼mî𓉗Aã‚Ýæ_ÀëQ íÔôýSj„¶ÚB÷K´§B¬SºM{¯1yßÜZfݳÎtñ—ºO¥í˜v‘ž_˜¤ËˆÇðµ#熷Iô DÛÓ§üÿ *ú†A»ÉÑŸÌ2"¤ˆ¼*Ë3%|z¡"zÚHÏú>¦§Ðkä¤HÏ ôž%ô8àDdç§#Ç•½››hÀHÖDÑŒ fIÀ²èÖ£‹Ê{Ömªªùæ…ê«›®­ù‹Ê­—+·\©ØüMå–I‡\«¬zâÌøu}õÆ+UµGŠW!£Q–d"l{.‹ó#öÔñã^1ª_øè#ɈYV‘·.Zɵ/¸G(@ÈãÔÈþ• Ï R¡…«/æ¢\×R®}1÷æêÿ󩃥Ì!Ñ®»”;UÂ^ÉE˹}¥ìxäy®cUBÝÈLAÁ"ÁF^ä5bšƒÍDÃÉ/%Gޝ¾Ôß0xË××_ÓwuÃíÁº;CÛnô5Žöž8'²†{·C€Fêû6Kn 4õyò"«`LH4šÂKo­ ´5“¶¸Ù~ÌÓÙ6î`™ÈS¶íOwjÛÙr³M¾1 t»­èBM–x1sÊLAHÁøz£›“?cÜQ•ûR¶(CcÉ$BŸntÓ2kÚÉ iª¹èvÈEwÚX\2dÞßïö° md{ûôÏk œ4g°p¶8XAÀ]pÿïò¯z3ÿ²6õÀbK}¾úÜl &òÐñŠÄcl ‰¢HDIVT˜¸@( Gщ*bgÂÊ}ËŒMPañ«DJaWSÖÁ¬³Še úJŒm’ðoêë5¶©ëø•,Y²tutttt¯îÕ½¶'à`'Äy:8„„¶” ˆˆBIȃ®á•G¨Ð„øÇIYתH« oRµR?lûÐ׊P»iû0ië´ƒR @Bx„À%ŽÿûŸdÝ—5¬@4ë¯c+¹÷øú<þÿßÉr¨¯äX;JØèV×vgßx=8+Ô‘±l-‡® ˆ­†h¶¨×Ýón žØ@Ås…ÓİäÌvû ‘¹rÞ¹σ#žû=h‰€Ãx!„Š5{r '+Ñ™Ž-ÄÑ«¨”,ˆ¬«÷¥âÀ¹‰†ÅÕ¢1—¢UäjÉCèœ e"Eî† [ò»i£œr¢=ï1Å·tãy!’ady¦XNxK—¢™^ØO_³±Õ‰pQ2T‚@J„=bÅö”ÞåFŠRuE‘ˆáQ8‰Ç·/ƒ š‹ja„ÀCN1á=FUèSà„Fœ0`»D\0Ìa„||HñëRW5Í!sÞ²žÞ<®ÂIÜ‹k‡À¨2ß9we8éi p\o:—eE}Îc¹ó‘ g¾DŠÐÇÖÈW2|fƒÏð^gd8kÜþ$åÓ^\%Ûu˜©‘TSqªh'®ÆJ7£:.44¯Ù}­z÷D]Ó¹º–sumßÕîG‡,Vv¤ÈÕMWjöa»äÌxĘ®kþvǾoöu»‹k˜ ¥g?=½PÍÿßAò`vnwã.]Síx¬Â•³s4^#½·QÀã?Yˆg ‘Ø&Ù´š6«m•Â륡ÍÒÉ­Ò‰M‹^\©Nm±U:U! >/¿$Ú)õWK¨)4Õ6©¯’n÷[ýx>D´3]å:‘™Ê-¹Ë7µº~}öàµ{Ç®ßnŸºÞzgªmfêÐÌö%çÄOŽÿœM\n»{ëàÔDã½[G®óvS­›qîä2gÄiS>Ú‰ÀÔí†X‘8ibÕÆ3i<~Q7{óYýi—éÕâëB…âððdÎOv¿³y¹‹X5Ùa'šJ¬¿¬t'cQ PMÑì üYªm¥)[¨br¶Ñ£?l_s/Š…ûñ ·à•^è;ӵ:ñ–Bè L‡óDé?ºV”°gæüQ ÁçÜæÏE±˜–ε¯¿ÔüÍöU¥¼ÆoA\1.3†9†PÜ‘ªŠ-ãšÆu Oªhª8˜â``8‹&WÑ"aNÆS8¶ÔÁ†ÊéS(W¹Ñ(jß WâM‚KÌoâ:&þiâéÖà]C¯È.f)4-õ9Zצ¬¯2®¼Zð}x=DK TG²Å”u­~r#æ‰"~òæpÝXˆ‹¢óAo΃®‚ÙŽ|A£ž‚[Q?Ä ÄØâÔÇË »4Ùž?Ûü± ¯ÊStbª–&Ó‚ ÃA¬Tç œ[}ÐU /½)£Wˆœ®.s*Ƈ/ù6P\ع&R6/~!.\E¨ü™áLïl÷“Ó×bÑ• á\‡{G‡:â»}8k‹ÏŽçˆT…²Õ4±—-p»¸ F Mƒ>” þуð¾S(eÈyãm½{CšËêp3¢k)Ìf1öïrî6RZŸSï÷‘Eû?Îa”B¿žý¬‹ÇOÌ·Ñb‘„óDEç'¢YUÃILEq+&1‰å¯-AqB¢k-„ƒ_Ö®ÀœdhN7±Ù4m¬œ@¤Âè @<0òÀÑ´Cw¾(pÝXb0¥—@K&ùìgG‘…XÐHÈÿç]Å£åîZŸ5M“dÕBT¦q‡“ºœL·SÕ¤Â*cšÂ¸BTjDשn0M§ŠÁ¹Î¨Ne< V¹Ìmv½Ñn´¯p½±*ýMoꛫœoeºÞò¹4Že­:êõJwî´ëN½ÌafiªƒÊª*£7 .›œØW sP|-Ä)GÅù0d Á§"Šfh<è¤û²ùxeêùƒ¹‰à‰çøâyÂ9´1VäHðn$˜@$ üäBl]¢£¢kÅÒg^FæA‚ó‹U9Vx÷€w¥±LSñIFIm^Êûyi̪—Ñ&zu¡V»ÊLºÜ¦Ñ’tMTüòÛ GÖ^|=çD™ó —îñè=AûÇÕÞ‰×ò…|p›Dsæ ôtWÎ}ü-qD2Ä– Ìâ¨Ùèɸy(§Á¯Ùdj¨)2çiºü÷ÃÎEµ0d$$à éЯÁ¨27Àà~úè×½´*Ù(•MBUƒR»ÇemÞ(ï âôs+å+R™áZ´ÿ 1΀átaØþp” ÿŒ1J—ë.™ð…üå]NËð9´x\œfð¹ ~O§?t¼³Í–£X8Áü®+VªØß5n÷¯Ê+.6ì½]×z¯¾íRCë¹M—öOÖ´N×4ßÅ:^óÊåÚ—4‚1Q'4ruG¶“õ­KÎŒGM·j›¾ihûSMs&¦]SdªªêÄÄÄH„A~@‚d iñ(¯Dbð“L$°„:5ÅP˜†YH®pIÃ[9þÅ|½ÇÄqÜqÉÒI'­´Z­V£]íêöNwÀÊÃÀñ<08œy™`¸€lóÆuð„ó>ˆc7­Ú(±’0pø¡$jÕFÊÃo÷¿V©Õ?¢´qÒÚÃÝqO×``úÀò_þÉÈAÃj؃ٹn¾ŸßØÎ«c,—>e¬ •  v4jG—Å»Þ-ÆBGÛ`CîB4’Fà~)ºlGnèÑ¿-@î:OPÇvŸ;t¹KÑðÔi3á¤ÕJ g”‚b:Žƒã˜WKîM¶/šŸxkž¶Yï O nÆï\ò´.ø;3³¾êÅé¶Å©¦§¾æ¥)ç¢Çù$Ð63ÝúØÓòºÔ³õO5ÌMÃÜšÞÆy3tàþ’·Ép.O:–fšÆ}]çÏå„]fÞÀëDNÓ‘)À OzÓHì)ô0ßñhN%PÉög6+é‹'í Ì®(J…n3T‚Ä•FZãI_,éˆI|ÖŸà=i‰6ð ‡C “UcJD(iK¯¹’Ö;ÓHwNvëEþl¦žR ’ÞÈ ¼Êù¯¹"H¿…J†®U$HaÀ ® [Ïu¥bHg,M«®t¦.ëj‡å^MÔ{ogFª"­98ñ17à Y‚úQÄ‘D=†x[6|¸È'ëÄý&å\„áÃhÓÕĈ»é–²’fóRÖ Rˆ=uµ`ï+iÞü}ßÛ’®§ì‰ í 7ü*HÎÕ qX+`c*\UàUAÔñâF”KAœdaÎÞ0ŒAÐ$ê¹CÉ¡W Õûµ‰¤#ƒtS)º`e@›qtYz¬Ô={)€á%èô‚7àŽu½3y½ó9Û¢ÛÞšÒhÙ BÇn⊘ïÞç´b…‡UÖ12¶*»'°_‡cdNT"á]@a)Ë,»€ÍŽàX‹O5„niÍ ½I¿ËŽ3à`QD,–ªÃLˆÀFÉòõ£zÒs€b¸7bç?//iP,ôÅ>¨Ë Öªœ6ˆåEY Q¤w+ëÃz2(‘LrA¿0h¦üx©R‚ÉGÒåz"0˜Å‚ÊÁ·È^xK3ñ¡BF1ùÄôÅq£Aâ^N4iÖþÀ“D: 4àÍ€¼ÕÉøÇR ð4¼Ì+±©áZrÃ@¾áÈ_yr‡!×täø„!·rGGnrä&·1\×ïðä.Onsä&Knq´ׯõ# "øKåw«²‘c´’(s¬ÆbµåÿPV;Uå/­yTR¨>¹Ý”Ÿ«vú*ê'Ë“UõÕ *_eÃ+œ*ê–SÀxªê<ÕŽG•o?(?ö]¥Ã[Q7]QûceÍOUµ3å5 •5ãÇwZ#0ɇåµUõÐi‰Jô²Ä Áœ|²Á i¾º²”K~¶ÙôÌþ°¾ÙÖææ#ÂÂáDT±ÌÉŒtæ-Fyh¤`Ç52š‹F ÑÐ!4RB)r©/f«£[Q/Ì*rf¡+‡ÑØ4ƒÜ›°£;ºhGÃ…[3Þ¾FŠè8ÃE9ïÛw9ÒÅDƒÈjUAÏIX¹ VÐëÕˆªäž?•LùÚü3Î9oÓÂDóôtËøB‹Úù¿ÇNßlkÀßæ÷mÚ£iÞ¹ß8ã91?÷z( (X À”^hdÖ×ü8ÐF&AP¾™ö¿ …©»T8‡a»­#N~Ðüq¥Òÿ?…^]ñ;~ŠB0u@%ß$.·í!ïXÉé˜ù3oÞ¯Oüm^xEÒîŽýa_—ç à´@Ê¿óiÿª"RáL1’¨aX“¤=_Iº¡HL¦çŠ÷¶gý:\s·2…ôfRŠlj¤;ñ•Sd#²iŒöî!®hÒ w’7½µz®ÍG§‘¾ º°íQOÙþ\²çx¼¦c9‰$0»›Ób^EáeÈw…Ç’¯ðz© {8Hê4–ûŒTOî¾gù6bÏZ|sÿR~ærÁþ•Û³‚ŒµÂ4ªˆƒÖW¥hËù©Ëùi+3VîV³Z˜·|0g"'ûÛ}é—,1-fãAƒ¥Ð‡³B–Ie†W8¬ST,J<Ç+‰ëdkRu·Žýâ)¬®ÌRüÓË ­ÛBúa¡b©?{¢×»£H¯…ôY)K(EâIO éÞö¾ôlà°ÃBÎì…-xz:ù¿´AÙÈ F‹A¢øqž™îQ—õ§¦Œ23Ï`ÆŒU…7kqVCYV“®G·j3Ÿu%ÓÑÞÍr¥á=ÀYij¼¢WYIÃ`­*ë°ôþ¾ìkoU>¤–81Qæ˜8êôT;'Kk·›ò÷ËjþSÒ¨LUÖOVÔMm4ÓSV7]uÂ[í|¿VúöxÙqoUÝ£ª†™£'½eT)ãÐÊŽ?ªv|_¾ã™E`zÐù¼¨Ü(`Qõ‚l z²¸D)ò [Yÿsýz!¥-O¯^ÅTb²IÄ\²Š«Ñ`!³#wÑŽkä’zàãBª w>ú´T¶XÊñ§È:ªFk(w®}~]ÊFî\4Š(@ƒùh°THG¸¸áŠí>w žx]ÈA#yè³CÈ]Š\¹Bu"£êdQ6@Fðª JŽ3Z¤¸S™ÃÿtÞ÷õÏζÍûV= Gö9PŠÿ”×ß:å;5åkš›k Ì4ù'küu¯K#À! ÈÒl+ 4&ŠÀ}˜ä“©–Å@óßn×Ę /TX\­(ÔüØh#.M‡>Ëz…žo;_ëõA隺ÜEúÂI7¤Oú=Gb•…Ý-p:–5±ÿg¾Þcں΀_)’%K–®®Ž®ŽîÕ±üP01ø‰1”€øXBbÎÒ®å‘Ä ¥ð2$íªEjµªmB Ç¢n«´¶ªÚfMWmÓþ¨²©Í¤VJYÁ$ÆØgß1Y¥ý‘iHA™õùèÚ÷úžïÞs|¾ßUec#>5…üÊó (¥]…ô¤q©}{·ž†øTYÀ’R„o~êpÒŽt΢=F€×´73‰ÂGÙˆèÞÆ4v²ä¡žlcW.¡Ç¡Œn÷åÓp.T½[/[O×lwe• ’$aY%­„uÒC ‰½ô¶¼_KÎäl¹æ°ÍUWP_1õ:©×‘Hb#沬ºLÔWò(¼Î €$æq<)ŠPŸ•z-¬õÙW]Öo²÷—#ê)‰{J¾ç¢ÞòéêÒïJm_»2 {7«ód€” H‰ðÖ`Q«„§5,Ã0Y©Ä›ôDÑ”?Øù í„ê ÷ j}ã“›™!äµ¶w²/‹Ý:˜‡}VÚS´îqùE›½¯YæÛ3éIçB¸,˜¢°k³¯lHG‹á*6R0j橎²7ªž1j2R¨Ÿ/«Þ­Îë¨H $õÛ›õAÝÌ+$X °Zȳj”-)ó¯B*žd$%MÆc]r<%Àê¶³+°|¸Ï†e¥(‰Zx â Y~SMG²èpZâm‘Ž"zæñ•è™:$¿Ø½ÆBÕÌ COOap½p˜<7¬™?­¡g CPdDó?j„Žj.¿ J*œ¦ƒ‰Â§KÊpð€à L¯ ú…Àøí—Àý<¹ë~ŽèG*z•ÿá7iÁb•NáŠG/Š‚,ÁBÝ”žý—Ÿî¾íožm84׺ëo÷7ßh80 Ý­?¸Þ*ÿ}}Ë` Ј¿eÒß /ÇÍSA†FÓ| & † —Û7ëC7@)wC·ê[ÇÞhhÙhÜö7M‚¸-þæëûC~CÜF„._úõšFVWcÿç¡I,­r†ˆÇb?)¯Ð‰g°¨ä—sïíâF}L##L‘µ­å†“c;6B¥*ÄfÚfA›†ˆlÔrGÜhw¦†»°‡¡å<°¤œIæ|-7¶›«]w§çv0@;\É WsçÀEpž:|Ò‡*·"‚5«±RÄ ^ œ"[IÝ©š¿m™ Íʹߟ:îŒÜ ÍÝ ÍGÚfgŽNMµOMµÍFÚFÚ"¡§¥@HR m‘»,‡ùHÇÜÌQh£÷^¹1ýâÄõ¶ò|„IRé´˜7é„ïZòè‰Vº²è€‰ö[io>«­¼Š®B­éÏBõé·Ð^Ûûþì¬%Ô2^«SjeQÒˆâV^HÏ!ÒÁB‘¯ãN:`Ÿêȵëp*=,ËbFéfå½îZ¶Ò6Xiï¶•¾Ìå~(gæ÷UøŸñ„.a  Y1IJÙX=…]´¯œv9æÛÍ¿õg–çòJI¡’yZTKD‡5©H—&hÓy’‰Ä\mÓ ¯gê/³¯•Ú¸ÊèÎç¾¢y·yzGAÂm[uÙ¢nû’§h9é5„Üw™æ\¦yÆ˲Û~HšÄù¤4õX!V¼,–hl[ô‡¢C­‘ñ=MwÀ?þæÛæÛþ–‹µj„‘ˆLŠlö•å(M¬ÕúÄSÖÆ}Åb+?¶àH÷ï×þ&a¬a’ð8)O5pçws—긑*nȳáðŒÖpçvqg=Üh7â厕 é)·¨ÕjQ# B$Y# ²=…ëªåÞÚÃLò~-w¡Šó0Æ@¼W½Þ~7®aò¹TÃ]„¼Ü—ö0ƒ](g2isèLZX;yàĹkZÂ<©Ñ? üõVWäæÙ;­‹³G'›§F#í ‘ÎÈd;ÄüLçìdÛÓÒÈìÔ‘µ“€Cf§€%€“vHòÞô‘]•H‡7Ë¢D²EV^ÙŸÃ0Ðo\éÍe¥|ÀA»­´ÏBOX7| í†^òè@þJó“çC*BH†a­¤"’B/òÙXÒ *"°¿«vT@ª‰ã¶¯Ÿ/Ð#YÖ¥#þ|Š1_*íwÞïµ°ä™òýÅL#@²1 %ŽåÇ¡¢ØN›’Ô¼Òc|Ó›»+ J#ˆie‹h³ˆ©E€– YsduÀ`4f_/+ˆyL]v GÜmM¸-ÔcJ¸MqyÕkqY¸€Ž„¯²ê.^r=¨.Šy-q¯5îŠØâ@·ƒÅÒt÷¯²”ìÔk£^ÈÊL½&h,,q6–°ÇN=ö¨×<ç*x謊GÜ]©rþ‹ù:m"=ŽÿdtÏq›Q+èN2È¢AäþÞ¹ yâ¡_¿‘RïWa@„yõ tÈ„êeÐWñZ®#<,ðž#úÔ …"ä¹Fž#䛯id؃È!öýš =«*(sd[tOo <ø  p‹‡›„¶oë7Éçýê±RAÔAâdÇããð&#§m/,ýìpÃÔÑæ»áæ;‡Ú&Ãç&üà2àHÓl¸éAMÆÜ‘ÈL]ä~¸q³UþAÝ©;µ ›;Xñ«O<¬mš­‹Ü«;ùU}Ë»Åå“JpOʱŽå «Qpªsž(¸áà´oìØñÅ›oÏן¾ûýã[­‘‡1±f|Lt&9}$ÒåÚ«²œ"Ë’ bMÇÊžL&¾.ôßáO"±i2aÂ3SÓª¢—EIÕ‰:Ç\.gÆCÌÀëÌðæ: ¡|Ë5Bÿ¢’?ÄŒT1#!fÂÏŒ…˜ÑÃÌh-3\Í\ö“@&Ñkq3‚ÈV«KMš+~f´œfH5RÁL”mú'BÌH3„QÅ WÑ6Æhs­–«£' v>ô3? J‡D挼¬cµœJTU5p¢É»ÎØúÿÒøÅl|nñÒü£èüTdi¶yiîÌÂÜù¹Ù¶—¥‘Çs-çÎb BÍ´àqy¡ãÁdËèû‡p nKtªNÓ»w]ÄÚ­¸Lá>±Ï íø÷}ºÏêÈßêUt :.ìÑœÍA&:£h9èAr`>6è+ùøXÑ>3Ër§ßÁŠÒ?ê·a•A;A4o%æ;/üñæù´ÙhA‰æ®÷¹ –—®ßÎK4q/Ä<3oÛ*L¾‘^T Doä¿gâ9ƒ`$‚Q ¢[.YwÜöùž(]ñ—`¡ZñI¿c=èMU”B…BîdÀƒÕ ð%%© ‚Ä !W"ä\JÇjȾ´CȾp£ VBHO"èYK"ñâ4’ù’%k¡âµ R"Xœx’/&¹t¯ÝÏ!˜ýë@à ~ïj€ž¶îwAÐIŸ¨ÒŽ…r×Ãý% |–ªâÅ ë·®œs™jžHÌ„8Ž®9²—sžÓI2»Ó¼•+ÿ&¼kþ\tá(À‘™ˆ97Ý/è™ VÊŒž}t´tåA ÇRà­ð¶Øk8Ú{+Jw¢ úœµ­Äì+HÙ.'ü]6èDjº_7g ZÔ“,H?Ùo€v„J.=íBt»V[óÍ‚ “$IE{²/K#ôEµÒ'êÅùkO7œ“gû,Z«h!˜¿@r$ùñÏŒ0ªÀÕµ0a€+,EŸFЇ13\åÒQ`€£qÍW< è¿Æs<§Èµ nŽ1¢þ—úzi#¹¾’%K–V«Ñj´«µü 8Éa0ollž!MrÁØ”„‡\CB°MœD\BÀ<’{Uí—« ï$W©ûPÛôÔ^¯jtU®UÛ¨M¯ !`‘ƒ=ý{ú¡¨¢EµGÃx±=ÿõÎÎÿ÷'CZ2ŒbCêrJåe*‘ã‘ê]¯âÅ•äW¹'’{ˆüš%÷ø™Ÿé/Ö2Éà J^#aÄX”ÁrÇSŒ÷¿~ú‘Ëÿw—Êsi±¹s¹)öxÚä‹xƒ@‘p“zhOŸzÛw›åç<Ç.ßTb2 ¿yáwM­wOœ´Ij#¡”EZ ÆGµš–C¦žÂrh­FÓ›†C׳Ìyƒ3ûLhŸ×û]çA\S gæ\þ¹&ÿ'µ-…"XDBR«ÔÙ_54þûƒ"„z)NûXlblœGHÀ8i´¥i̤‹™ÖåUMë@”ë{—µwj×ÊIÀÃoCJ„dPвð[VF¯•r¢bøÚÛ‡µzAÆc™‹ïÙ\b!éô”а» ¼ÍßèÍ$ù¤×B·å·ƒUHï¿Ïµ/ù‹ß<`CÙP¹U±ój õPï‰z82 dè?=RðŒ&h3¤æ-gNÔ™»í0Ç…ñꢸü`ÙrD« ¢0pZ¢N #ê -/«*¶«*â´•Å«J€+À@©†D_BÅq Á‰:¬›ë^idÛ^@#„/´[⎢La·Å%/E/íÖM@”2‰TÛ V=¯¶¾pX6fz:ÎÂ*ózeþFUÁ¦£¸¯†sÉÚó!Ôx5@«8b/ýIQfKŠ¤Æ ¹ÈÁæ®æÕ¤aEü’Z¤p¸A{êTd|°q÷—ÆL®ç’¾œ„¨aIIHì‘¿ +$T¶ùÍÃÔº=)¤¯ŒtÃjÏ"}‰ÅÓm¦K|Ò_JB6Ò•ùqK¶BR ˜×a™¿"ƒ\-&}ÅtŠ~¸ýQÀÄJ2-ËaN™nP¿2tæÇoXâpÀàÞé*{Ùm%}šßû+ÓÅ$جô‚Äb¡*]"ƒÀ ¼“¢ÃÓaM| ¤É ¦ºÉ(OnéɈšŒJt0,‘Q`‰ø4ãQÕŽ¡oæÉM‘L w' HÔaVÉ«EVü툆|¢ ¿àÈ/ù)šô£L ì ‡t3å>;E_úçÝi—ï ·ï±'0ím‡ñ¬Ëw›å<íÀ˜¹FßrUÍgõ-¶²\Ä‚H9 ;¿è4‡Jì®kõ^øÂXqµÏyƒª;3ÛÒŸZq·C?»{í¶M{‚ó m3Mmó$3Þ ÞÌ<ŒøH¸ñÑ1ÈòÛÛ[‰t{¥èØñamE·èŸXœÄ¢9&,ÁS`yVq­š¹õ:sÛÉŒdn70“©î»FnŸdF*™1;3Ö û®›ó¤³ÉúœìÔòt¦ã8s«ŽþëûƒzæÝJÁ¡fÊdòoN1cÿú¬’i²rßã·tÚ¤B^D2/HX8IÄZVP++¶Xûà—"—æ"Á…ÈÅ—‹—) ƒ‹«Ÿ¬^ /]Y_¼²¾\\iÙoD–ÜÏÞ‰,wÍ/ŸƒÙ#‘ŽéǾ#Æl/*%^p©Ä‘ŽRÒ0Ö—IzK÷ncÌÚ åS\ËÚè/¦ef—õÉùÒ»•¦«¦"“%×Ëâ!# A}zœ–¨½™ñÖXOñ±ƒ´|àa,KÐèí»2h¦è+ÿ´Åœ*$±¼2ÕUºøµ4‚÷T"Ò“™(r÷*~ˆ­€†Ý›øNj¡Òg|Ùc£GB¹´ö YÈeËo<¦Ú</M± I:¤Òòxž“8…Jqã5þGÖ´ð‰â¸³Rù¦£0ê´AšÞ3-üŸ·5;¥`fþ¸e"7µFôˆxx"z‘–ÃZ¹(èùõBõ²ßIBô*_- ]pu@°*à%ðxîÏ&=y”¦Ý@ +éÝCEgoôÏÓ')YŽSkJÙš­tÝvÁ,æ™·Ž¹Š#¹29 6 >‰ÝÈuÈu@Tùçß0E»JiÌ!¥Q°‘P!î‘Þ\ºØÀÆ¡Ä\ :NˆbÏâ/ùAMš$©9@ŠX}õ(háåÄM™Ð‘ï d˜Þ@(²“"öª+ÉK†udP¹5ªï°£T¨AA‡óêr™íŸHðGƒº¼ì$%âÒy‰Çp{aØÒ”RõÈÃFÿª÷â¼+ðÄXsA`€ÕƶÙfÿÃÓWë|£oÍ|Ðxö™·}¦áÌãæ ¸"âÚµ Bï <óçÎ>lúLzIJ•ÀÊ« ›qWáús MUÏù¹¦sa·o¶áì"HÛ´«zx¹ß󀵾▷}¶9øèԙϪϜȧòRvV%ÈóÍç$¶M¶^1;vx|…¤xœlo?¸óHÄ‚{Iɽ_ÇL:™I;3äd&ê™Û5ÌèþkdDq‚¹S£è¯–id-â°BÉÑu(Wɹl¹ìý×™É:fü$óa£l°†{ÏÎÜö2ãµT#5Ì-;3ûþÇYM‘v³Iî+ãb%Ç& @P$Jœ–Uà.Éo:ý‘çñ|7 _ ‡/‘ùŽ¥•ÎpäÊ—áàúrÛâšoyéRd®s¿5òåŠe¹sa®s}5¸(šï8ûFf*–)9$Ç"m-{ éµ/±^5ïÙîÙá†)Q„H<»f:&f)“Ò‘LÎË’UrZZvý“ùºi"Oã> I“&“ÉdòË43™iC)- +´@¡´´T\•¾øRJAEÞÁE‘÷¶º»ÿÜímtÏ7ÐÔ\Ü÷r—MLö»=/—Ëå.1ž»º  ÝEÒçžéî¿÷Ç&pÚ<)”dú{˜þú|?¿l1ãùóa°P9ÆöÙŽY4<‘DA"‚ê«ÆmÉA]üaµ­œ)qµxD$-ËÞ©EŠäÀ0vî†þE#áÓÈ Cém$'yÆ,¤Zغ2Xá,å笸â­jƒ#KbE‰Fzðž(a‰@Wˆì¸9{ñýЇ»K•nð—ƒßð–$)âX÷½u¼#~ç:šÄk_ö9À_ö¢²üK»m(Û(Ê*Q£ÖÐh:AÔÈDÀÁ”*Ê©­Nݽ#xó“!¶Å¹±ˆ"EF÷âV±Cرҟ§¼<ï„þŠòBeoÛ«×ó©ÑÑHRºÜäïMò¸Go3Š´Èã„#B† ú²) {‹›á£b8³ý»–RïFTgÂY6Y²ÒƒŽrÂP1„ípf[ÞIàN~ ñy÷óPÁJØõáw)ŽT-!&Q}»1i+&¸¨†ŠL®IpŸÉ¦kä3öõX&Œ¢I£gcÌUŒFJåy‡L]8j8è¢2„4)ÇJzžWiØ÷hv Çv·ªé»ºÎùÐñÙš–GÁtÈý`ËTãÉ™š–Xmû«†®ÁÖ[îÝGr¬ž ãÍ ÿ_êZb‡:cŒéÙÐ/NùGuíóuÇŸZ¾kêiÍÊãyVE>K÷ü-pt¾¡k:Ðò$Øö²éÔlCç?Í3õA<µ}—ŽÍ6ž|XßñÐÈL¨kº¶uº®}º^iAb—e†c$ŽGßÿù¯÷0ï_­½Y‡øÛ4Çÿ~¬+•ˆ£—‰“2«ÁR²¿6ŸºRCÝôRã{¨Ë•ÔõýÔx•â„ÍNùÑjÜOýºBeáL4k ^ƒ£žHŒÌZ(ÓR·Û¨ ¨‹^ê&z`5zPé /œØO¡F¼ŠÆ6_#ÕÔm\×G¤? jöåÒr*ÎOÌ#š+ËjžOÐ;?þ¦yqaäY¬yy®seæôËùÞùgžÎw.Îv'æ†6[#±gÇ_ĺŸ?o{1Û³¾0x9²KRãÉHÅ ϓɪløgcÞf®2 Ë7lúE·Cß6r sfN™C¹‚Žc6UÒUD°é¨€¨Ã=Kà·z-µ8¥4N˦ªµãÏát. m[2À€õQ«Û¦OQq)ËìRÿqWAÌäA¤úò· mÜôŽâ‘®ÍÇ®` ú18¶ÂHôYïToµ˜$VÀ¡.°4«çŒ,GXš6¦;3í+gÑÒÞRða91aÁçŒ]¤ˆ·37×öÖðŽTl¯+Ž·èWð(…¿T•Å=®ØnǤ%Ý#3"~Ÿ8¢Å`Â*»5»Ï&|Ýl~Ó› Ã%0âˆ÷e)úq'?23|˜ æD/br÷†í‡ˆóu¸pí{g1Q©U:&“Ó3hµ–U"3XŒ^âp7œ(Ô.ì€Þ28· zM·¼–l‘ae—:¹ß¾I²}uAªÉïW¶½ÉHR Xø¥ÀÚHX œ½6\pØ,‹¼^ƒßEÂäØûQ>Ï€«\æ\âášWÅM×È•t5À n¨á3.é¾hfh^-q -ªN%Ò¬†IÓq™:NfxƯ×ÿ¾20u¨ûéÁc‹ÁŽåÃÝ ¡Ö' í3µÍ¯»îïo˜9Ü9lýãÆJƒÉÈ0jŽåEM6ÃU§›¾Þ×ômm¢ÑòKS~¹¾}¶®má`û'e>s{¤UW+|sûš~²Í³Ú6ȃPÛÃ`K,Ô1[r±¾ûyã©oªMíA5-Zž…ŽoºFB?òl*ÔöHž4tžwïxŽà¬g¸–öH`æ'Ö“?ÞÁÇZ²·8Ä—4È#§ÂÉêã=Ôx5uc'5QI"ª©ë˜þ¾MOùKÊZt}®Z %†åJ $hçòuÑ©Óêô.ê“ZfŸ™0Q—öP“~¥·±$EðZTÓh•¢¦ñMn oÎÕÝÊBxOöP·êÉy?W.dpÑjAd5z‘ÓÓ¬Z,cwü¶bòÛ#O{×^õÅæºœé]™~¹Ð»´Ð½ÙYšë~ë~µÔöÃ|ßÝ/³8NƉ©Ñ²7è” Z²2d„ˆó!Œiîܰéן¿®€óÖ©Sƒ…QÓ„æ ‚¤b1_˜Y†2ˆà΂~ÂÊ´Œ:aÄú‡&«‘¡eAkà¢ÊÌÜŸ–GÎÏ«ó\z6…NIK7èùÓrii°"žåB\1\¤DÒFõßW‘"ˆ*ï9P ‘âD´xmÀ>é±8³0‰ÈhP e‘%[ˆÆAØHö–ít¯zÊâ•¶UOáº×~Ǻ׵îq&¼®5ŸkÙïúÁS÷ƒßþÖðŽÔ¢·ü× >;øŠÞx¬Ë• O!š$î+Ÿëõ^×ÝÛ±tÙDXÄ_«½ÏJ,†)ÝT(Ü;š½v?ôÉøNîŒûp„*«ÈÚg á¼ Î9Ÿv•œp鵄exQä$51¥²D’„5H4iË"³]nˆXW•=i½”Òù¤”VD¶¦‹üj&D!Ðc„sù‰óù«ƒøÒÃÖŸ5‚‡,üwò7Ž"…ñ!¼3Ì{zv{©Ä‰9C£J!Bµ…Y» …+z¸A$°0¡…ßm2E°&4pQ×¥µQ®Ip[¼œ‘%ê4mOD^e9 ')!¢p¡ôýÿ[Žaì~øäãúŽéš£S#êZ›ž×w fëŽ?¬í¨ÙjN9Ç †çYß«4nùw õ¿Ì—kLÙÇGŠdÉÒH£ÑÕèjFcyla^q0ó06Æ&‚±ŒÍ+UbòÌÃ$M·ªÔÕF›fðHÒÝ®6ÝVí—¾¶U+5}­Ôn»ÛlºI „6!,)`ßž1©ú%_¢B²WGWwîŒï93>÷ü÷3oàž÷À˪üº¦Çí?ªjÉ`8AT%óâJ=Ÿ{÷ØÜñ¼í þËü¼þÀ´¿ýIóá/x9üþÎÚÆŒ=»e·| õ¡i_û+ ‘{ Ayÿk@r¯)ôëªÇ1‚2%‰ÒüÜ#ƒ¶òº¹ãÅm9Û2yvùƒ÷¡¶ê0Š·¥PcÕ²Î^*¡Æ]²øŽVo¸¾¯Ùu¡–6¼¨F9*j¬¯gMbX­]­:WÍ8šVl6pÔÕFêm§L€ãUÔPœš&âX2¶ñÔ4ä–ý^¾Œš(§ÆÝò'­SwY‚À"Š/Šö… àÚ%y¿_ûÛ;Ë3GÏœŸïXzpdzîÐHçâ—¡G3'nÝ8n1HjŽç†æT>¿pÂF"™$œ!×pY| H8mÝ à`æW=Ϻ;3yFÜŠi,¨À¯7Y)ÖüÄ—/kGWé7’> [É`’\ŠL"Û;ÌPxÄp¢:€Rj?'²*$iP*Ïñ®4y¼ˆœ…žAºÓãsåÞ»~êÓÒޱ@;Y°þ»Õiæ$¬ƒÈÄ`Zàè4ÌKH°ø|fòýŽ'®’϶•ÊüUgnÌm^q[* –<ögnۊ˶ê.‚Áb¥uÙUHv;^;|MŒxŠ¢Î‚¯*ÌQTo#n{Ôi[qÚc•–E§mÑc¹í«¶O¶[9¬`! X1'j°DͲ“ðéQ éω ºôØH—9η†õËHάÕØ,ÒSòaMJ¹^¡ç6% ´Ad9¥Â”€Ï—oY¿È]‰\“­‘RÅh¥†G©’ò¼ßúñ¼ÛÌÂ;É@1éË&½éð09iÁ›e{î.>î3¯[ü«ü ½° éW­ùI,¨iŒ†³\E†yrAEF0âd&Þx¢Fä’ŠŒ«Ö•§« ˜IàÕ°¿ÿ²ˆ¥CYŽ¿Ô´ÞmÜÿ°éðopÒ¸é ÞòfýgüÁÏêö=i>ô纖ÛM¡eß‘?íÞg€½)òZ„·"œ‰QTA¹•ô[–²É掅æC/«ò7›Üôö$&±˜ë4Ùî×î5&ÛîÔíŸò¶Ýmé¸ÝÜñw_ð£Ý%ž­R‚tžfÝ›Sþà?ø õħBM#íS@ mk4²6†ù©Æ?Ù J² !š½v퉂ìÇ^7w¼¸­@\±X”<Ë/¶éDm"+0vÓ¡8„\ñÄE˜Ä#Ë=èþXÕ†«üD)õf­&AÇÓXÚ›M½çÚÔn!¥xšn˦†«D6ð RPcuÔ¥zjÄ)Û%5ê¡.×ÈqÂåøÆSÓ‹šˆ÷ÃÔP…<~øÄI½ã¤Ú­ú$!UIkYcµVÔ«ˆ5XÙš^ûsÿ3]Ks¡/f[ž> m4ÌÏœ|úð䣩޶æ|–¾g4™˜û³È¹mÑÎ,Bz¤ÇNºmä\ÒúÇÒa念µ,fY}ª¥ªy ˆÞb)•%¾Ç…3,\öXÉ™-Ëa#é·Ã©ðî±¢Öd”À)(Òc^)bÀŽO-ÆtéÖMO;äì¶ø)êyös ›þWÌÿëI“9í¬˜äzã–º­pÈbÌj±NŲ‰<›Àñ…½gJ^vÛ–]RUD<âÊ‹¹ò¢î‚w!̯VÅÜÖX¥9V™O\V×_ ùÖëÆ€¯‰Å\1WaÔm{Vi[¨°-9íQW ñì îbâ²·e¥2w l·õK—m²,¯?9)W¤9N)"Ø[‰×›‘2³=vá¯Gd°˜œ†ŒÊ'g‹I$Øzåÿ#92 Ê‚n$Ýi¤/w!¼ýzÈñ–Sºè6\o³>éÊ‹v&“-dÐëÌùEu–éx>c q ´¨Ñ#”‚hx¿I{똓tYÈ`Ì•¡зßü¼_£‘õCk°¾LÒ“)÷álؘß-OcYIdz’hP1Ü/Jä"&#šÕQHWm8€—!‰Œ¢»ßáO8ðfQR0Œ#$½F£BŒ+%õg5­·¼í3Mí÷j›þY·¶©c¦!xÛ¸ ï ÎúàVÇGî†o;v„-Å?ÝÕðÃò†­œH ¸@¥»V^}½>ð ³ñj„µ¢ø»Jï´·íeUþ7ðIcðÊvA÷¤oï €ÊO5µÍûC³Í‡ú;fë¿ßå=e5ªD3€! pîâ81™û«nÖе{4Ý©?°!÷}²MûÛçü¡‘R@;áÒ²2Wü×Í/n«ñئ&oУb±Ä°Š –º°—sÊì1º—‰ÈDÜ^Ê_vRg+Ãè°:­"“z§F,–ôŒDjØC}XË% +aAI yâ€ôߨ.ÇãvÆÇ5' šÌ!nj¤šºT§5˜rsR£åÔUõF9vJy†f¥ñ€#jVb³ÔÔ€%òÇÀôLÏ“¹“M#Ó-ÍùV‰ž×)±¸ÎÎÓã{RHÄ´,×j‰XÈ@>($§rÈ™u«Þ¤ÏDìA#Í Véh†÷XrÎFÎØH8}%œCz·xÏ&ÝY>Ne‘7rb€%]äLþÜQǹ1E ´³™UèE„XœÍ(¿·S?uVpp&éΖÖñ›eY§øcýÅä›…ÿ÷剘Å<£Jägisœd¤«yºXu©6/V—c±Â´ìÌma}ê´=Þe^uZˆ§x¬ÿ!¿\c›È®8>’%KÖèjt5£ÍØrâ$@ ‰óò“Ø °IÀŽ "$~‘…Bâ<h ±ã<`wAh¥ª+–$ô]‰UUUªöC«ý°Ýí¨[ qB€<6Ǿ=Z´ª”HÉ‚ÔÑÑÕ•gæÞ3ã3çÿûË”ây5w$+ìñrÛ¼ÓòÖ1à‰„ÛºX±}¶Â1ív,¸Ëž¢%·}Þ§hÚe}î2/ÂÛ{ßB<&€º…rKò}ó‹=%çõI¤U¢È$b`^\¬Eý»SÇO™I¯%ÎM„-$Z¼fõÜ‘')@ïÝùså-uêe`ˆ¡ðæ`£s&Ò¡'=-$íæßútaçhÆh0‘ È=P‰¢Ô*fc‹A1±“néN€œmÉ3Àçùò.òŽ+XR°fùwå‘ö\r6[vQÓ|Ø^Ÿ ÆŽUXÅóF^û8DGndA–ô1ëN#Y˃êóU)6‰å¹ `7²¤­4­¯dä¹’²Xí¡1àa 8ì«{^{j¤¶e¸ºîi &kêcµÇnû?É+ÔÙƒ‹QÃ1XD¥^{‡­tÆ0ævå!Wj¦‚Å ‘©Ë1Ž›ÞTå'ýǦj›ÿXuèóŠì;lùÆ[?á?úêº;ö§¤BÎZiæ8Èü'üÕÅjõÅ|û}oèAMÝß‘õ¦ˆƒLJþ†Q_Ãk™4þ½úˆ™‡ƒË`x„ñ?>$ï(Œ$¶?mžÓ08•Ŭ'CÖ÷{©ËTß^êÊ>êfuÃC]u~4€Ñàx8 £8lQH*‘NG÷¨k{©‹–ç´JQ·SO ¹©¡=Ô “ºê’```àdõéžuÏóònjø§Š¬¢†j¨ë€m9«5Ô ¿œê‹úE%õáÆ®Ö0HË€„ç1Ç#Z,äÞûQéÅ{ëN#c3ù“·0<Â’¦ãŒQûmO)éL!ÝV¹†­ ðhÙ$ºDÊÖ®ûé'Âö4ÌŽBäÅl†ž8•CÚ,² ëA/ä~µÆų9¤³„t¥‘0üYGºs–ºŠž¶VÜpg]Ú½-ìN»åO_l·Íƒ(têèIç¶óôòj;èÛÐÉ׬{ÏþÐ~¾X“Á(ió ÂÓHÇ žþ™Í0ã,\vÏ8wÄ…€ónó\¹)î±ÇÝÅ .ÇByQÜS”¬°&Êñrã‚Û4ë¶¾tYf]¶År[Ò·¾u xWÂe&n qÛ’në’Ûºà6.» HEþL¹^ ©€Sæ¸Ëºè¶Ç=;îó®Ü• lwµ¥mŠ%X•Á<âx†V–ë¿©ÞB¢VÒÄ›µfõ F aÍ(°5 ô5’Ôa®|V.iS²Ã¢ÿKïŽÑªY•ƒøê7~R"‘Ó ÿßy'Ð<­å6üzß6]ä óHÔ‹ÏM_<±9° à:”·\ák”d;9»ƒD³HG&9ë&‘¬ÄiZHOa•<’»mФ"—DàÄåÒ¿î4òy+W’±‘Ç@úI™,ÍÑÊM"wÎb»<1å==å=9î«v°éIMýhMÛSÓ¨¿é¯aÄßøÂ챯éâN'ÜyAÌЃ$NCÓÍyÛïúkG¼‡¦´îX^)`=B_VÖ¾©Äß ÷·Ly›^úŸøëÿVsäÑ–¯Ë}µY9¹<‡hÃaš:Ë1âžwë6ÿ´lÿóX ù‘/4łߊŒ›þ+(2æm€õÕ›Í#-HËEÎ%ˉ·KÉdâ¿“äëñõ9ƒÁ ±˰ˆUR—R×K×]ͯ8¨›{¨›+ÌÓðÊî–içf){©šÛ•¡äYiZ-0¼ˆ1õ©í3y5F A©h-£k¨kÎuÏóMãz%uƽԵʕ€tR %£ä”*žãI ß Ð< eæ­¿ª¸u¯=‹NÄN?›ˆLއŸMœœ~Öø"Ö83yüÛ©Ó/'ÚFcÇcÏ[æ^4ÏÇ®Fs“áç±ÐìË“£­Ï§Z_N¶N·¾œ:<÷ô‚Í_*f$L3ª²Íx:癵ó\«DiÏ–3‰:Ã9¤'›œË—% Z?Sü{¿¨á‘³âY$ñ*¬¦•. ]ت}ûòýÿñòÂEy b%û]¶6½& oD,Öb^Çj0–$Ì… š¯B™-ôf’rI$GFß^iÐ'{¶Éà \5‘ˆ‰„M¤Ç"†LoXTÝÓ&yÒ¡'ë-¯QÃ(1’$¤Sò8]Úðó}ZÒk8'á,(¶ûMf+§pjIOîíÃÆ‹%Â,äÖmøÃ 6«•¥™h±u;é6‘3z¸€DóÖ®þáaÍr@‘ƒ#èݾܞ?^—±´šeÁù)há'8ÒÇ‘A Òä*&},àH?&×ÒÏ’+¯ÆÕC 30aÉ܈Ég,éçÉ@ éä úV–º©»Û»¥Á¤LA¢Ý„~,I§ÒtëÖü?W^MmLžCþº'µM“ÞÐ7œpnÞ*ÒÂ,_µYŸÂb•R)Bž yäkþàÌWÞP™6u#£Ô±\«içdðhÌÛ G°y8Ø´0â U×­¶ïÃ`Ó°/4¾UyàãbWF·q"x, ŽC<ϲl*ŠEéH®ù¯ûµÍÿò7ŽV7<®m¹l|ì¯{ ­7¬Ào5¡;ûëÕˆôõ]ñ‡#_‚1‘XNþωõ<`»Wû~C$I¾üâ ^„yšÁyõY5´{ý…Û-Cû©kû©ç¿É¯Û˜¶®3àWBBº’%ëêèêè^Ë×–m^ƒ›„WÇ€CHHÀFŽyYRA08 3 ¤Û"US_Ô•ðÚe]*mië¶hû²M]3MËš*MÖ¤ ƒM 4/ΞëDQÍ2‘ò!èèê ¸üÜçÿ{˜éýÌL3ZÁLîcÆí¨·Œ$0Âð¹ «8B`c±Šãö$ľu9]Í|dÛz~<³€"ãÌ„ãÉ–LVÊ ù NhÈÑ&ŠHÁBõhW0ÐñH£U°mîóu_ý§ëaÈ»¸è^zÌöÜ ÷ÌϽ߆»×ƒ]÷oy—æ¼ápw4„æZWA í+‹¾•;þù[-Ëaïò‚oÈkIP±ü1Ú!;ºcÑo¦Ã/\#4{Þ¡fy…H¤¶§k¨; Xè›Ú¿kÝ{,4Oûsä>€D°Pÿþ¥7JÿÕd,Ö}Z3cõ›7íî04|÷+‰W‹-wmÖ-ã—|ݷ寖[Vʳ–›¨Ã²a/úº¤èB¾¥D¯Ú&Â,¥„Œ1aQl¦>æÄ>Õª/‹/¤}EtpÛš?>âO¨´lH—I<±Ð9£{#R}îÒŠ”(hvp繆8 b$^Šçt¬È§ ±g«37úK¨ž•El§Ì \>’rw ÿŸ­ùFµ€T¯çÅ}R—ÄÇHF´§’Ð@ Î…âGݬú÷G`¯ °¬ÈD 9¹ü¦@X›¡æ´(öÒ$:ÍÑÑ0Æ4t\¢ïc:D`:ªŽª‘Ø ;9z ÑM¢ãZ:…#°ÑÒ÷TtZ¼ÿ®ÐWÆÆ6‰‹x¢Å*ù ÃÈ‘òÊoJ^sµ^©÷DKUPÄÕCͳ®–ë ÷—µîWã’‰Hx„Ê4† µ-_Ôy>¶Õäj4J–%XøÐj»\Óò°þõÙÆ.wªÄ¥B(E-}VóÚÕÏ7ΣsΖ`CûM—û›ºÖÛíÑž;ç’¯³‡=7\î?U6˜‘U "ôo^¡D^¨LH~ÛZú÷Ú¦Å#«Þ/œ-sõ+.ïõCm³ íK.Ï5gTe½è5W×lè¸t ©,>‰ç8D¼(þþÓ?@ô?¶ÇúúÚw<ð½jäéì'' žvŽç ‚¨òp>3]Ïœ.yá©=ZÅL;™ˆìJæL%óa)dwÌ{™ó±“ùÀÁ¸3 l¼K«| `VU¬²ÐÀ 9˜_‘ÉxÙÖóã‚dò;,LUÉ×™æd™ð#ÑCÈ)^ˆ+ð+P ¹"3îûóçúÖ;çƒM¡ÅãKAoxöø›ÞÕùî•ßâm_ð¶/šFï†zBs«aÿüÎpؽîºpγ üÎ)%5Á,?]º]îÀèKi/^#i3ûõàI=/.Κ(É &SŒû™2f™"ò°–þ 'Û“ƒ‰š!„•8îHž†öîY9Q¼yÝ8]~¬á<:˜K‡²å t8r8Øà® ÁOQˆAJ^Í'ÁÔ Ž~ Aý‚œòÝ÷ìZ™¿åqü’/ZQk­"4ò¨<‹VäRGuì½cÛ;± ¢I˜ˆFž^’”…:þófõDMt8C&q¿•öï–_(ÂÞt¹ü  Bä›çׯÌÓÆ TWÆÅs¡ž#HB¢>AŠ9[N{vËøíôšiìÌ¢F:˜þÈ¿«>%³X‰qœ ª°Rœ,b9 ñ'U”åX} wÓêòX#°ä?6’aËzvM†`å•0ç¡Òtþ\KGµô”šNèè´aã”H'Ù£ÕGÕȨ†ŽDöLéé¤DGŠÄÑIøqžŽŠ¿näÍZÄc,¬ ÂH”€‡Ñ|ÛåCm_6x®Ô6¯:£¦êmWëWΦùúÖ¯]ͳõm7œ­žä4^E´<¶%$]74ݬ÷´§¤I*cdÑé?«qOØSEá8‰Ç¼(hyág&Ëç­s‡;œ-á:™%Wµ\­sG{®¼çPËõºÖPý±kíe:-"8ŒI­>–š=Qì8¿ÿàË¿-¯=»·â SÞ©ðD^©ß´Ûk4—&&ÿ¥¢n«4r½¶9è:v¥¦éb;Fœ–„qG[ûS‡žºËû] òuˆCbblja±šS«Þ!r Ï2 Ô=-á© £ãɱ¬Ü­ÒȘü]…'üá/=uka0NIJž]×Ⱥ 6Í!?I,¶öýG`ɧ¿üšaÂPµ½0 øQ¯ÝÚ”àîs¢A7ú²\áMi=L8xÖkAÝUñsœhà𶣟ºÐeú B6Ìup t+÷[Îÿs_.yHâ+\×¼ßtË‚t¢+Q·5ýHÈ œ êG ¢ky‚E‡ÞtÇ÷ëo‚w§Ûfg[g&NLN7ÌnŸiX|Ò:5|rþYpbüÌÙp>Qª8!~Út»Ê¡Ñ"Úa¢m&ÚYüÚ5Ò‘=t¶(Y­ˆ/€ƒúp©H\‚ú*­e­5ÞF i»=ÞÚi¤ ß ‚º¡W Âõ¹wÑH ¾ºj ¡#ËÇB£ÐæÐæt Õ>j¥WœÉIä´=ZƒJµ~B®ìJüz_ÁŠkÏÒ!kÌe9-‹¥p°gËãø 3¥»çö•C¶˜Ë¶â¶/ºlK.Û²+oÞ•;wÈ"›¤âÀW{‹* Sªd^gà„$N`MžAû‡štØl+-YôR:mË‘lŒ‹yòƈäÐ »iäå5®î(¤ÍVY‘t-þk£å÷¾4j§­Y²p:ãïÌŒOW$»å\>ýIæ\»IÊt¬È©‚ ×==£ø­/÷E{íÌ¢­V±®FŒ¯xÿ÷wÐ ž¸kx»rú ϱ¼ÚÈ ,'|Ù¬£}<½¨À´;‘^M =„ö`Ú'n¨‘ÞøÉ=¢,–>Þà–{4ãïëÞ-Di¬ ƒ|},Ç·™Ã^]Úßý—|èMú‚SÕ#GBªF¼µ«š„ÇüÁ!©n¨ºþqÍ©/*ŽXx‚_#¾bǘ˜ ßõíÉÉ"ƒõ¼¨ j˜.“ƒVŒUcÆŸj¾ó¶ç+oÝÈѦoý¤tbÂßxßSûH ‚I6šwØ×0éß«j©91îkøÛѰI# AÅ@U…šÍÊéêsDMX%«6òšd,@ ´Z Š,NdÙ­ÒÈC_ý˜·~\ W‡=i:Œa©°à;wîÄ °XgÁ&kd}ö“½žgY5«ÀÇ­h°RFÂ&D6ˆâf9ê=€Ê ùE ®4óŒj'Ãñ£rí@×|r¦ßr¡Û.tÝú¨ß)û¤§õ– þR9Ö6e©/w_åò²{ßäz\#À’¾rÔ_!¯ÿ¦õ:W\¨ß‡úßÙæÏŒ,tp"Ã&AG4jAÃê ødzø¶÷óû­“³Í³¦–¦Î¬N´n¤‘Ùé O&ÃϦNÏN4--´|ú«€+ôœA J¬VÞpiD¿™všÖÚòi›õuk$vѾÒn«M‡ Är¼Zàˆ™UܨL¤­i4š+Kªâ¹,Úf¦²h»ñÏ^œ¦$ÚV›Â©&Oí£Ò—;^F¢ù4’M#&Úž)·„í«ÑƒÿÒ–L.˜é Ü•IÚÒ)E¾™GÚà í»E2SŽ9NJ ‹a£*f¤ÖD»ã\¹˜·Ñ¶õçÙ¬`‚=&ŠÎ1ƒj6&tk4[oH“uHŒ#©ª×¦ûÛÕ$2ˆH/Oú´d°!’+šM5Ò«&—bÉ öÑþQoÛÕJÕ*5ŽUJjV„9¾k>2ì­‰¸ÎFìo|î NVúì¾…ÊÀL4åǾÿª ‚EGí¶Ó ‘igí°ËЏ[vÚ ¨ã ƒ%/‰«`%‹"⌑VÀÉÆ_–¸ïUgªšºBãÕ£åg&ì¾EOh lSY;ê Ðqm5›Žë¬›u‡¦@M®Úçîú‡ŽÀˆ+x×^qG+ýðT#îИ§¨3áë}c§42î®…ïù¾½fÚ^ûÛŠêƒ*•À²*„õz}$ù7l|=yñY__ûÊ$+++·oß±ˆI/qù Ì (f†,̵òíîr:Ê€¹beú¢Ø¸da.Ê)ñÆ»¡3%Ž}m/Óç :ê-`ú@Je̹ádz!”"W‹wžÿR` ó¡Ò€d0zÙo¡Gp¨.©Uìt^׊™ž!7Aâx=ÏÉ|Ìn+(E%4ÖQmâ{¯¼s×o±y}¦z3,.æ¦[Î5=^h|§5G € )d]ä-Xyò8¤#ž¼m$ç¤çÀ¶k¤ °qpµ5ÿ”QÃb$aI–ô°ðª”8ÿ {"9*07úÖñäL‰ÓñJXUJÕnAq'p.ì°t‡¿¼ÕØD©¤c?dDä\N³AÇíRÂ3!è5ÇK^µ~äh>9™¿üjêúkÆGÖÌõózI8d¹èä¤ÞóbÓŽÇñÿx=+1=±˜›W‹ÍìaÍ#–ܧEæå"ãó’Üg–¼•âÌ ‹‘XÒ‰å09qŒœÈù^ê¾½h ¹Â’~™\—É5™\Þ½¹F82$ü&,†s$jXµ„e.r5§˜îØþû%îyoó¼cg(ߨ´Ë?鉚ʲ$ô’$²ˆã¸[·n}…ø¬­=ÿú)B¢O°±¾N6È)o,G2‹L{3TÈ\”27·?µJ™åL?Äq)s¥˜÷õRš{Ï“YÕ")käc©Ìw¬Ì‡G™þæš•!Áo–17JéÉÀ7´•ùÈMaÓƒ–Gñ°sz‰EzÓsøæ39#Fh—Œ0Ïa¯e%¬Á¸4¶èËÿ|áÙÌ©ÙÅÆ¹íKÓçŸN‡žÎžÌ4?š ÏÎ6Í/µ,Ïwÿúçn5æbd­+9Aþ¸Lñð|éÉ&m°"éB{ÀpÚvkdõmiI$]M¹Þ²R¡Ä’&%JsæaE†Â<ÆðûBI£Dü¬üÈšDºrIO ]ÌÛ󷮎ìh²¤À¶w½#“îéÖ/sýB*iÙCº³?vgR#’D)VÃq ¬ÈÙKɺ…ãfRš»f{7¬Ù;»ÿ¯—RÄj&ÖÜÏò3÷Z>†G¬«E^§TaO:^z3Ÿtå¯v¤-w$ šs¢¯P´S@)íÒ™FºÓV¨c·øvH8„ͤu?iM¡ïdÏáOê$ »t2Ï zVfeS±W½t.£S?P‘"²ŒY«üÝÙCô¿:rhu¥lwŸ’îTÒfж‰Úälâ'â8YàŽ$*ÈÕ}äG®ŠäŠLzÅõë˜ôÅ’^ œ“>>Zp¿Bs˜º¬¬Vbb —U™Ã*¼¤z+>á…Ö/ÝÁOˆ¼Ô´ý´ô”€K×A)‹:…öøä¤wÖcŒÚ|w€gÊÓ4YY7ïj|à ,zê†gÇÕ“Žš‰ªàˆ­zɵ¹F6©[í¬74\Y3ꮉØÏ®¸~Vä6iãT¢Ñ"îäÞDxŒ%wpÂøÌVõÐÕøûòêyOãreý_\þ?8}SÞàÿvkøµXéûÜ런Uÿ´°‚ã95E,8•`€‘¬®¯­mj‡mÑÈê골FhMON©$‹¢Kx/Þõ~1s£˜(£<¸^²í)Ü_Ä|h¥#Qü܈VŸ•*g¾må*’¼‚ç’*Ô2ïQB\ äHà ˆò­Ž{óu:ôÕb !ZÅL_!ÓtÇ4r­„ZhŒô*3`aŠwËЙu摒üR’8Œ$>FÂrµ©ûâýÕXøÑdÝÜRmäQóý馿³_®1Q¥g?É&$“LrròæäÍ9yOæÌdÔå6†»7¹†a€a€uA†‹£¬TE.¢n7éf­Eìš6ý°n»I“vÛ¤Úì¥Ù¤Æv×U‹»ÊmÞ>ïØ4ýÒФqòää“9çyÏ™çyþ¿ÿÂÜñ¥Ç‡µ/<:6{ÿ¨7w+"tD‡DMý•¡HíƒùSÎ6D;7Ôsý8ee¶ ¨à¬óo‡S[w Q£‘ ‘€•$€sƒ(FI²IbFFÆ:$ ¢¹Vd ½·ìÛJ»™žÉu¾5%Ðn;íË¢§Sh‡™v$±§Æ1cع÷'{"y‹W‘c–×ꥣò»}±(/T”½äJ H¡iϼ¡‘ÿ“øÞe}LRœ»°?ë¢Åœ Ç‰‡òÃDÐi4ÙíÐ6¨RV<ñ BzÂg‚ÚgcÍ'û×_ÿý‰´ÃF{íLè»RéiÇ\»£:&Bg0l×¢°È"¬¶räÒ®¸NØÆŠ¢~[c§ÝNÚÇüB0•·mzŸv™éé4Úig r*ñF ;^ЉA‰žGÃ^DGõt€ÐK&:$ПɡA‰ŽèaA/+¡ABÇÕï‡bë°EÏ™%‘-(r‹@$­ÆiPßÏ,ø‹÷Ð7µ­S¾–IÏ¡©Jÿý¶,Ù(µ®ð‹OŽEâ6$Ÿ—7Þ© |]í¿åmù²äí3ögGš$YÀŸf4µ$Vì¸[Ý|Ó}ˆeÆ×úy'¾{×ÓpÛçžY¬ |쪰ȊDˆ– ­‚N$:ï–û'jÛnVúïTù?Ý_šc'ògU³î†9ß‘ùšÀByôwsQ„íÞ|µÖë¿UÝ8Wøª¬>|*ÆHŒzÃüã9†¡Ðj(@²´²òjP2þg½²´Z]ýäãë"BÀH&‹y[¹a77âbŠ?\Â4z“UXsq?ë.îZ)7Ï ÿ@êr† WJ¥÷=‘ÅV¬Â_Ë+:,$îâ>n8 $Ãa‡*`Çõ¦xqU7Èc “K¯F€ˆFJŒæq¿ôpÕpÜÜùR\£S´ ¯U‘‰¢EPçX“®èJïÿý;“wO<ÿуùÀ“Ù¦•™¦¦Ž†þyâ|_ºAe¢*¢Ö"K“†é´×Áæ!ˆ2ÌÆ.àd¦Ô›>åRØ”;i¡fz.é~[B®Þ,F`$JCÕɲ,aQx=âM¢àŽÒ~՜Ŷڱm¯?“ݤ7ný©ã׺ìKÚ“L{Ì,{/LõÔ¹öÜz1 Î@@àß´ÑbDpGìlÞîåÂ}´8‡ÚW]IË…ŽÕÂôPóµËè›Ø EŽgù¶ç.Xd/»r~çH­‹R%EËz$—FŒçEÑŽtÚ— TØ@{mÐ#kÉ´ÛF”]´Ó²î:ìMd-ЕȘ¼PÇúy½Uá™'cÄü‘ÜèµÎ,Úof¿éþ1??Éô”‰v[h0%Œßô>íoϘƶg ¦ÿ´ Z`NЀ‰š¢“'ÎJt8žŽ*ôDÇ·¬ ô’H"鞎È|WÉÝ©•õZ£hÂ(š ­¢¨F*R¯5ùFYí”/0UÓ:]Ý2SÕÄthP¤jÃhäIõá?VŸÏØû©»þNEë¼7ðØã­,é´Ø,X d$²‚½„cà› œ¶¤}SÑ4ák]¬n©ôßð5®[åÝ 3uG€¯&jZßÏÚk&’$aá(AÎ,¼çiyX¸QüÎ9Çž]ªjày¢“ í³çÞõn{[§jÓÞ–ï6ŸFn3ðó?ðú¿õ\¨;z»:°Xy,ê¼á××?Y^^$x¾¼ 4²öjX„ÑÈ¥ ±¨«©…-©¢¤µÜÑLnÌÍ]ÎçÆŠ o¾:_.àF @‹ùs…Ú\¢d¨’(6õ­\‚œ˜ä˜P’Ð+E'+Ñâ~œöo )âÆJ¹ñRv|‰¼]ã$ýJ!»á˜‡»ê}m4r¥„ÅPx3Wá«‹Ìç†JÙz°”ß­³«‚¤Á"V‘)ÅÂ#$£ %ïýéí©é¶åùö¥™ö§sm÷ÿz$Ñ  IT$£FËäXh/È1ÌC‘îTÚ•ÌP†OwÒ¦O¹`,s[A°~i ‚–•¾Ü{m{íÑYFd@¼Œe㙯KV/xÒžw…„pÒ3™Ìž03ix‰i Þö,XÚ]`ôèX',vÚn6¤§›€yømcv ƒƒà_Ù-O ÓiIî³|Ç’ËJ‹ì´8í‰Ë¶˜o£…é¯]FßĆÄZHBö…<ërA:-Þý÷ÇñF£mFD‚$UÅvôüd&=í WT]£‚žðP§Ö]‡Àp9ÔpO˜jNÅ}Ñ`Ã’Á€µª(‹Ú§Ç³iôHBÒhßvÚu›îÍ8Ö³]N´o~Ÿ:kÁÃ;õ$Ò“Û—ƒûìˆ0b,!âÑa«¼à1 Ò˘^ÒÑ!™ŸÈ“gŒ~'¨¼&V'Kˆ±Š=Öy·%ü¡°tÊW§ºaÎ×ö ¢qºÒÿ ² ˜d²ºùÇæG5RÛ[Þ¦‡¾Ö/ËêžÔ_¨j½í9‰n”×»b̰Ƃ C¢¬È„× EƒÑñ¤œ™ŠÀ#ïáÞæo½‡Ö›÷aí‘;¾Ö wý5ç^³Œ5˜Bb<&×w—}]ÙòóýÏŽ][ÖcBà_—u,ˆ’X¡šþQ{ à–Ç¿¨V¾î¼ëïªEšïùüîƒ3Þ–)oó/ö”É2†],{+«B««/ `ieå•ÑÈ‹ÏÚÚ*Ã’}øH÷„D#¼£ž»Vö‘F#£¯F…óÃÇ:ìs"™7al‰^^‰…ù B[‰`…Gh»Ieô2&@2ZÂŽC맦ñð“^r…oRÆÐë ܶüµÑƒ+7;^v±7? €äbç?*áF ¸knn¸‚ dˆÿb¿\cÚ:Ï8~$$$K–ŽŽ^½:GÇòEæžÄ `ÌÅW.Išð-ÐllLIÛ˜‘ZÆæ’´S7µÛ¤‘K!$a“¶ª»è·U“"MûÐuSZµ% —„Ò„KÓ4 ¿{^“iŸöÁ„/‘ÇÇ~Þ÷œçùÿ^X6)$ª$µRƉ*”Ù®çéžüüÌÌÒÐÜâÙÎcEJ–•Á ÅøõÜ‚õ˜• í¦(¢ (2PBõgÔ”’mŽá}dPOÎCêjr¡šRЀžJ}̰5ß=cü[‡þ“PÙjÔF.ÀzöX.Hâã¨5Ño¡_ÑÓY5nM;ï‰Ã$Kù‡ “¨å£6‹YÍ*XžÇTâX§ ß>hK8*ŸÙK—ê+SÒezê6ç4¯9ŒËš«jÇmôUlIÖ–¡Ç°DÙUÃò¢ixI #KæjJÆf³Èc r½1åÚΔƒ7>´Ýÿ 3YK™ä}73fgÆF(ì M¸èŽ&]ôÜp2Sp^—ú¨ž¹VG¯®ü¬ù |Ž aQÅ J ¨kXç¡ÌH‰áƒc—®å°L-p@ãJ^ü‹”F<h™ÁRªrŒ©‰Ï¸í*“ݨ…Œ“½¿‚Ä,4ép4éz dÄD9d¸” ¥¢,/%C†ÔLZ$“ˆšH´:ݼO`ؼB¯xi¢¿úr]Q‘Èfr@o¼VRÁ„Ò»KóêHùºLªzÃmKº,I‡1a/_·W€U­;mO]¶·ÑW±%¯x¥Îø­½‚¸MÄ]‘t”?s˜×˜>6¹³³%¥Jd‘±{x6_âþ~¢ìÙðòVÈ#±ÂT—ÓrJ·þ)ÿñ˜F šQî,oBb~BQµÙW¿5? ü\‘ˆîƒ#íè…XmXqŠ«·¹OöSø‰å“Ñ’~X§y ¦†sôP–¦U€0r䢵÷82©}<–õÁiõ|¹‚± Êykn7’窟TÕÜnîZ:>0íï›i9{ÏwrÖ×½ œà ~å }@Ò™ów/ø#3ž®­rÛ•ÀÉùæÎù6Àƒ®‡Þм7|¹ºŒds(¤·`ïoœþ/|=ÚÎÞó†oÖ¸sÀõ”jNàžëÕ.à¥Å–Îtó.û{Þq6ªä²\Ž—@“9t¨ PdËcxh„´ÚƒE_aÙGu-·š»îNÃÌx‚ÓžÛͳ¾ðvÓÈœ?rßþÒÓñ8°5<×ú ìUðvyá?þþ‰µµäËåMþÙ¤‘䯯ñ7ÛEp43窙©:j…ãàŒ ÌÕÚ—áÂ×í0ÞªgkJ«V´¨UÙJ“Š=”'‘O/5‹-Fì1ÈÚ‹˜±ÆÿÑÈÄL|"}Šøõ1æbMFÄÄ;òÑ~5 ”1ñÃÌÏÎÑð•îkês¸ÈÍÜ„:™+NŠˆ¿jdÆô8nùqm¶}W†2“Gl– IXR@I‰¬Òš¯Û+± ªë¶¯,›¼ ª'1€Í˜ÂÊɨ‰¢Èyý‹¨kÚj\CúõTÏa6ŒUÐ)oØ´Ó“¡ÔèõëH´0µ0óF¬† ™ °D|.¡ÊlI ÐЧ%$ZLSCÀq»ûˆf/¦tÞŽÒ/ž«*e*Ìky0mþí7¤Oûó:m2I®Õbâ2@|´’mÚ[ò™7¸Ü~îvs÷tSx¥åÔ}ßÉ$zg›;¾ní™k̶õηFæ=Áûž \™oëÝ*·]ð„f½Á‡í'½ÁÕ–îø"®<á Õò8n~íÖÑKí}+-=š»Vý?;þ“Ý«PH¬œÍå›6û0LÚtäó×@جղeI* /Ÿ!–ÍÆ Èó¬À•iµïX_ûôŽ¥À©¹¦Ž•ŽN{‚ žià§€ V[¶ŒÊþoøºç½¡»ÞÎ_hÖœm ~xÐ…9$òX)J­>?I‘H2¹ñ2d3PÐÊÒ²$JìKû”¾ä¡J»mÓÍ®N—4Ù„@Àøô?ª••² ¡+ýXãññ93ãsÎÿý°çëI\¡ªÑX_.UÓ`íäUÇíÑ“¡‚…ÓÙžl%£TŠBŠšã1§:Às·Ê Œâµº¸¥bÕ\õÌ\úܪ[­5lXJÖ-%OkMËf¡™Ë«-Øõ4ú6^KÄkKWÍÆ§µ†'æÂe³>n)sÆ-&ðɆ¥~ë¯ëLç2“±$1X³Ÿå¹äBQ1i‘ÖÁÃ0iaH8÷Õ5’GÎÐu7 õ•n„›Ó>÷Å{ƃFâIJ‰œÏ"C¹$\D"FÒ§[¡\/$½ð‘!gz;½Ncç÷’~,%= ¦lr*Ý+zs~ÙtP ’,ç$§eˆ ˜ÑpôŒ$òiÛ¸gßgV×}wð¾3xHàò>ñœˆºÛæœmþ¦e?€ä±û䬽Àu9K2M‘weßëʶw]¡‡r`^öß–Û¹O~áéN…šL€+ÄG%Íï]ÛÎD›:œ]Snß·/êòÞs.çIÔ "—ÎâË+—d龜û7WpÆÙõ¡îð^VHä8jC†…ì®ä9Ìa¯ÖôY•#Úxä,¸wZBà[žÐRsçSOðž£mÊÕñPîØi,:‹®`ÔqÍ8;fZ_:¼³î`Ѝ–xjYIÁ ‚-¼1Œ<‡ÿXœÄȵOn0«a ž¤]ø#o|™Ü¯ZÐÄ14ZýúÔ±M\®F:%F8 NÆõ™›Í45T ÑJ4^ƒÆ-h¼Žž¥Œ~cÿ¶— &l/ÏWèk ½ÑF4Þ€Æ*Ñu[ÂéXœ&…¹“˜Åã}*Q)0B‹M6©`Cà hÆ­FãMh´‰êh×”²M oŠeÒ¦<ž+ VˆNcT¼ Q³¢$¨ZöY_ ”cñp&‰èh…E·µrr¾„ ö“A¿k$ï?c‡•òºbHO°½‘(`³É¨jºýdÀ4Û]Ú˜ƒU &‰Kâ.+Íjñ…¹p­¶hìQgÚŠ]O”oc#n1>­/~8©+Z1k÷ *FTå2œ’OS²8bI_1,"á­u‘Cúó(’áx°€DòI¯öÛ¨@Þ›»ÒýUú žæ}xíßùu×—Ia, NÔ)¬ƒøaè+ÜÿÐb!‹ 2-GŠHoêÊPE[“ áXŽç4¢„Yœ„&IЪÕWK*!©=vž|(‡þ ïlJý†˜•} ÿtsûÒñÓw¾_µK —ÄK<‹Œ•3rhÙŒÊþ)—Þü»3¸äêºãôýÉÞy$uO‚Z…1{4%õ¾;\~] &8€ngœþéíÕuù§][¶öTNPˆXÄB2ÃL’®Þ½ÙÐzß®,9|_9:]þ)¹sJöƒ n7w~\rô‡ù¥Z»£Žà=gp·ž[0³  ¸ö×~‰‘øààüml¬=§$!0 7äy^5#ƨ»]iBc h¤Ž&ña3Íþãæ×Èõ:e[¾´-ª…,}tM‚ˆšÐµôÓc›Ñ@¿œ®¡&Ù®ÿ‘º2¶é­óà+Ð¥E#±¢I MiËEVdULNT޹t_Ç{µ+ç!;ÜêÌÏOJešF£XnÉI®(Šli2Ñ[мõZ©3kÑŠ¥hÍZ¶R_ýi¡Þ*ª”‚˜Ê©V‘¦Û 9›G.å­÷è©ÂZ*ÞþÂÕ3YTïC×½òÔôçÅÏeS D ^šd`ç— P¤ç½`ü ‘D )¨r7ÀT’!x[º;… ¸+{¹ÿðo¼‡ßMÁ,U+ žÅJ%PdÃ~_Wüy“w¹åôœ'™}¦Ù»ì íVVsø3nʆ)g×MÛ‰dºèqЍþ ¤fÞsÜuu}áôÏn¶Ÿ¶wÎ9»ÖÝÝ‘lƒYeµ¢øé‘øtÚ8¼ÐaÔZð„à·wÚé…öóÎÐ÷d¥ò|ã¬Oª£Nú@¦=ÀŒ®yOh±åˆå®ìÿ‹Ã7~øXëÞ gEYrÒïíÏ<ݳr`·žÛXEƒ TI,à’k=ÑN(Dâ/b«oF#±x|uK#ÏVìÏÐ`AͲŒ`Acv4nÛLè  ±¼Î,¼FÆ S…‚ÄI+Z2Ј]W4£Q;M¸Ã h؆ÆlÔ$Ð~{FFÿy°*83 ĪA#Uhì½£ë6ôq»ü¥HÒKð)óc“£V+YUu6ºT–˜®d¥”/Ñ+Æ4¢ ÐQåîóã¿£ý¬]©D?·¡ë'Po˜JpŠÈ¢³+§¦±°m(²ÝfŸÙMÚîšÕꪻVQ»hVQTfÎþÎÀÚÆMlÄ,ä—›{É}œ{çžûýü¶OøÅ_5÷~å&…þìë8^áÙ˜”‘$c™)p-#ä#©U8/í¡Akê5`Ù¤0•(–¤$þàñŒÀAta4á|šG#ÓÓúä7X¦fãÀÄnF§|"ôA#B^Q'œèÌükäL}üÛ&ÅXÒo.B# è¬Oì?ˆ cDáDÃ5Â'ÝÏ=?Ø–c1M¸æ6á÷иgŽ£ .':ì6ËÐþ´åÀ]Ç…s59ÞL0:àAÇ×SBMIÐ(iDc šú™Ö-¶=þ÷yÖ‰á¬Cï®CÇ}êÚ•ñŠN“¡1é—™1ÆËeE‚ ¦ÐD"%Òø¥êÕ7*y1΋ôeGÁ$}éB#s y95²/ƒpð>»ˆ† ¾/ýóî‡&ë$-™LT¡LýAz:w—D<ÜSqÍÆÐS–,áäÿ¹¸»xÒé¸å´EÝ6î)xä´=ª-âÞÊ+k3jÍŒ0ÍJ˜Q‚$VéÒm9ü@ÉþŒÇb¤¿Þºé7Òù`þ‹¿·¹|Ð6G‘þoàd¾ç˸œ]PdÀ»\NlðÙ|WhR3añ=éÓ;3FiføªDÖË ³J2Ó˜QÕë"·ÉX™ëFsÏõ†ö/ƒÝS[ ·\i ý}ñRõf çJcÇå`øª¿}2¸õ¢?ä³&ê1Rܾ,å\ {¢9|+ºéïš „'6v]lè>ꨪ֖ɔÆÙh4ÊŒ˜úGWÓ%PMKϬ@„p6v|›‚|­“›¶Mµn‡ýïúC·;'=—¡©à¶ íck=m)Y*£2¦TaÌÀT#£LR¨Ža+–ŽØË.ºn6w/Ös›ôúRÒ ÁªªRLÿð‹_=|òˆGJ#3ŸèÌÞïíR)³@ßüï(A§ëDÖÅB|d$îó¯‘þõ,K³d§a)%æøÕ ©CgFN4Z…ƪŠÆbÞó=ÿu±ƒa`ünqØ„uÐÈÙ:¡± 't¢C³„U…)›JÐûã+”DŸ´Ò€ŽÕ¡Ýi ©ldŠFëÑ7õ¡!0ÌúÅçdzÏÓ+îtG)%:¬ÈËe ðFý]qe…ɪȦ2™aœ 3Cªª«Nâo–òÁ,¾/9Ö9þK‘—V#}™|·M¬ d‡ýCjŽ%ÅÈŒ N‹N÷“üdî­¸¿ÞÁ=%Ü ‘Y,id© îÕ8yŠÿíÌ¿W“©+ŠzìªsÔäóºŠÛU¶@"5Qj‘ÍV¬eð†T|kg6?èàû³øžU±7°€÷Û¾Ó|ÉýÚ!°„uÐÈÞœyŸ/{óù`!ß›+® 7"|’+j.ïÿŒæä·–[uXÆŒ ÕÓJ¦•¤¥Z‰¬1 ^f6}òJÛ½Öí·]7«o=ìºÞÒ³h©Ú ~è¾ ý3ØudÒÔ}xu)t¸:U.1i{[øÃPçƒáŸúÚŽØ+­fR‹^V™A¯1jd,—2ÃokÎ7¶_ †A7‚a(ÉÄóïënsèJ ó‹¦ö‹mbçÏ‚¡O[zÇ+<«ÒmFœSÎDWhé ̘NJ#Ì™r¤´ú×®fÐÑ¿Úzÿh_¬çvË«ò걺¶Âzzz" „…ÒÈÌ <^›ÇÍLY÷6=$¸[„>¤ö°[äø‰Øú¥ ~€ Û hØ'Ò(ËQ××Z™w•âÍ7IÔJ4ÌT«¤‹3Åc›m­{ÑP@x`¤rÍIé[42ë0 PVŽ­‹±¤v¢Sp¬ {ºÞóè*LfއÀbp] >F?lÕíªÖ’ˆ¢ÊTSÐëUh¼N@è¸ {……ÏÔñê Q¨+’ ?§¬è—ièPÛŠ¾ß…޾†ÞÝö¼ÊÊWSŠÍXÂT¦03¼z­YÚç¡âè€]tI³Òì—jñuñ‚µ?Öè.÷-Od:…XˆE’tŒ~lOžñ:îyÖL;K¢.[R¦¶üi -id© ¢nG¤6Ÿ»|CIÔSüÐUôØ]&¹WcãJ£µÜ]J5P0½¬š‰cý¦D½ÉAÇþ ~°ïN|Ì?m¾9õ )Èãp¹\>øÉ9\~ÿ?ì—L[×ǯ„„„ô¤§§«§§÷ô,?#;Bâð;`0à5#üplŠGûÙ&$üòHhš`À¤Ò’vé–¦Iæg—Iû½FYVµ›–iÚ“Öý.ReK×v øî<“?*mTÚ4âUÊÕÑÓÅ\Ÿ{Þõ=çû9ÁâzöË4Ï'b1UÔe°"›˜„9Ú²;ïwÛw/Þè þ »ïTMã6VMq©N÷îWš?9t $uÉå»}°%â ÄKUïÈþˆ;°d÷Ür´­È .ß]ÙëLËH¡p2ËeiuÅZÝvè4¡ò€R¢cCkQÞ™ý“jGÄî_u¦cïrÏáY„—’½@# ŠsÏfû.8«Î®GNÿÇM]¿w{õ:‰JJUªœJͰœ"ò fRo¾ñm‹Bºco¿ßܵìôÝ©oùœÛwËíqnJ;[mBÓ ­Öí©,Ãh–gù?üö½c”ð4Æ:yüÆÃ¯3ÊI‰æÔ ùh¿Z‘ì³"úS¶˜î×*ò½Å4’Ô˜™¡bU˜×²†áÕœšáX€4‘ãh‰Æe*ÔS„®l`DhÝ|‹Ú'¶A#ð¼`Bß´(ÿšŠ=GêP؆ÂhÌ‚z+`ZÄZV8 ‘âù$ C¢%¥ç¦ ‘Ch¼MU ‘Ze÷‰x³Ç¿ÚDŒGìÜ{oçu 0þÁýèµtÞƒ®E—¼è«Ýèk½èœ°I:‰cS ÜPXäD ‡sØ„i æ<¡¨‡wÀøl`ÏZÞd}jŽŠh¸6"OQùjíMÆÕå€ëÖü5hu­å¤¦ò³2ôŒFžØßÍùkCÔj||ÀøÈ\üW³ñSK ÀIÔZ¶f6¬[‹V—t§I"Ï%³–Ï qg%¬Ë&§KÉ‹Yd¨€ôgý··÷³—÷4²o(„²cg“`.9k¹^$Ij5䱜ó *†-Ö¥ölºúÂÐŽ þ,ºéøy÷™ïô •¥ìLfYIT 4**ŸuùçìóNßjÓñy‡/^ªz[ö/ɾåÆö9¹=âô€Â~ØÔýr¹™çNi†BCU,´›Xªâýy¿¬=iœ86cWfÁÙœH³ "{ïÁ‡ŽŽ»²çshdÕÙ3cL;} §_ÎÈÌá„LµöDAùõÚC3_ÄåÝ¿çìxàh[´·Ì¹Úæœónï¼³¶{(ÇíÜ8½³.߀á9-ç$оòêÅG@ OFÖ£$­®®LVk0˜„ÑK•h´rËÕs¼ [•çHš´¢°E!˜( T‡^0JÛT<Íq”¨ÊÀ’ŽRéY Äd݆mèÍ*4``ÛÔ?8çártµ ½Y“pYF{N#2õé(Xކëb{U ñ ® ¢Ž”Ñ:ÌÃÕTjšÏÄR*¨9Ç!SbÒy3­Gá%¶ÑžUÇ<ª”çp5šÜÀ-›rŒÀfá}hJ¦Ú¾”Ëòj'ÁeÚ& ‹>t!ðïíÝ”«’M“T4£%5YHšB3lÕ,#ƒÅ$d ¡"Œ5h§3H&é/&&Ò_¤”ÊP¬«Šu„ Io6ÌU¢€nÔ@ Ô|ÒW4ÝZš£¦ ÆˆÜ6ŽaŠEú7&cÜeî™}¡mÝRJ,b)üÔbX·”D*JÏéSY.AÂR2Ö`V]¥gWŽf’3%¤×ð$/ É@¡2éiý™ÂÇý9qË—,29»9yJÊ(¾R¥ûH'ƒÛÉPίeצI“Ìóóm«îÎ¥†¶‡®£[}>÷eßœÓw󀬋ɆöM$ª BTë“9¬ýïq$JVWW’ÕjLÑü:v  ó–«*ˆ;ˆéd¢ï€"`6tÕ†.ïCãVe>\—ðº,Çf I RÓŒDÓ§Ìhª…+bN>‡FjbnA»Í赦µ„™,,ÁK2É »WÅ4  @£"èo]¸QIU( b"–’x‘âS0]£WPdÂÂuJÀ ;™Ñx,æxÑN8öv Y”àG­Ê1ŽYÐE[R ­áE 'ZЇ-èï¦4òRºÔƒÎy› KGQ*kAÅS,Ã4ìÒÞ”w“þÝ „ô„EO•ÓÅä4´QzÒ¿—ô”"6´'nÕÊ{ÈHú äl¡ÒÙõ宜1þ®½D¯Aé˜Rcµ ó9<óëÒ½(‹»œ=³/´}b1EÖ#y~ߟž3ž×ƒ 1ZVb1Öq”%“‰tæ“!¸ù$B¿W¹ŸCEdÐð䯿Æ-_ ªS™$˜…`ò•äíË#½Â9$˜AΖÍyŠçðX 0CïÂhs©¬`Ë)úz[ç÷NœþþÑàõ®ÐO»ßêýð80Iè®ÁdžFý'ÍÙ" ^€n±%M¿ìê\tù6´OÿÿÑÈËå¶tާ8†ç°)Y;Zn{¿ÁwKl¶~Áé$¸ko_”=`ÊÄå[ØÜÿl“VîXvûKîÀê|¿±ívs`Iö„Ìl4YÜiϧíôåÇÊëîÉÞµ¦î» GfG–[#NÏ—oÖᙳ·óÒ(n ‘{;8Ùêó”Zl üÙî5IF`Õ‚¨¥å¥ÈXˆÑÈÖèÚÚ·¯½ÅQŒ–RàªØFh¤rËUuØ¢èé„E‘QÐÖ±:4Z.× 7jÑ¥j…7ÆmÊPÿ)ú–5Ák¤+´‰&.ñb£²8\“ãÍýOÔ¢1ë?Ù¯÷˜¦²4à'!iÒ¤ÉÍÉÉÍͽ¹7}¤uy(ˆ2‹XZ¦*´¥et”G)…*«ò,u³Ž‹ÏÌÊkAœd3ë®à0£;3™Ìû×f³»™dgtVðÑì8WÎ~§dÍÄlýK¶1‘|!çžôÞsîiÏù~k Ù4Gìꟙ°ˆ_ÕH2ÖÊXQ°¤%¼NÇK›L¨½yÑ)GÂ)'SÇ)+ ¢îBô®ƒõì ¯d|¶²öpü4N²£Q£,¼&˜d†&\¤:M"jNµDÔšôèph‰©‘c-è4@'BhŸO)^'kež`"ê âxóšÆÝÕ@z»3(äz@H;h Àµtÿº¨Iòãvº†sÿÝIWþÃ=«i$›FŠÿ\—––ÈéJÀ©¼œ*â¿¿^ôØ’÷Ȳ&îéìe¼Ðñƒµx¾¼àq¹ù»òœùòê(Ü*- %k ‚Ht² ù²4´ËL# ähàÃf†–ý³Ø¯4^û¥s=³”=Y‹áüy¶s×Ò^¨&2¿ÿù†Ã–4ƒ„NI“4°ý B /—¤¼v°jÛù¶¾é`÷…ÖÞ÷ü]sç§¡Èù–žß‡z¦vG.†"Ð?¹§ïg'!^ŸÄÄ󟿹}ò¦«á’«>îüx*þêx»X,&Ó'÷ŒsÇ%WÕš¦{¾Ö˜q7Ìy›~Ú—×–ð¿b‰.·½[îÆëÎwk÷¼Í׫v~ë ý¶Ä¾V–õ˜[¡ÈÁzŒSDùÝ ›¿©aº]¸æ®»ì©»ëö_­®¿ìiœõàQ7=~€ |`ÆÃ ²ÜëÓ¾á Îxm©k4e‘Sk¦§¦£Yü)H–:Ÿ+G¨+è7ðb²$+DƒZ7¡ÁJtzù³ê6F· ¡Í,·žÙ¦¨Rµ[pé œ.s+yœ¯åêÖ¡24Tu…“Mlp² ;X·¡_o‰­-Œ10Ä©Rtæ-ô Þ^œ&*°¾D‰Ì ŠF8™õD1`Um::°T¡Ó•è=‹ °G©`Á(R² Q;z,NaëV…†lF¬hÌÆ¾)˜$4N¸‰Am”dÂC]à µ&PL@œÜ…Ž @r¬U]W!d¦(2TE€b^/È^ÒQ¢Ÿï.¦«á£‘\†£u5;Öºsî+ˆÛéÚa^ìˤ=™´Îü(÷®ø×²^‘e5VýmÓÆËzjËùÁ¶6îéìe¼Ðñ£µxÁºaÁ–ßf¾·%›¤¢zVÊ¢,ˆAR“d‘oÛ`œïºgÓ® ÚNûrh86 í‹ ^û¶p_›läHÌêtöä½oÏ)Ö«EŽSD£ÎFUžo)µ;>Ü{`º¹ë³PßÇ-áɦŽöü¤µ÷ƒP42ÙÆXPùc[ÿÙ`׿ŒQ”ˆ¯eÞu7}U¼ã ÆOÅí»¯9wÌÖø¿ön{ü÷k[€³Õ;bÞâj˜xþK‘¥¶+¦FþåmÜŠx›€ÿôúg|ÙÚà”ãmVïÉb‚–¨Eœ(ËœHô¢œª(C­ý¿ñ6ƒF®¸êA/wj[gÝ ·QÁî²¢S•hÈ­ê*ÅI8JŒ¼h ¢–ˆ°‡´&"¹úBt܉Nofy hÌŽ~cg–LTF){Üe­ f0“a £È,#L¬RS­T(ðUÊ+Mèpiäèžgiä—MèP:ÖÂâ‹c­ò››°Q¿A­$¬Ñ²J” w®*m®s#í7ÓÎUì4ëdÒƒùq;]—&з†ö¤ÓöìoÛKË“T Á‰Ê Æ&ŸY—±hÝDß(úÞš÷°"/îéìe¼Ðñ |â5ŸVä?ª` ù®<ç‘5÷‘5o¡ÜL+ ƒ‰ ˆQÖé9­^º Ú“K÷çÐöWh8•öàsh¯™vÄO#0ö Ú“O#p Õ„ùO;Ìž ž“LF^2ID”8ÌaIT<…%Ÿö|°wÿÔîȹPø|( üøpWä£Ý}иОõžÛÍb*Ø ¹ØÚ{19¹=¹ÕÀ @’$ŒÿâÜù¥ÇËÝw~<7«ë!s¾ ¤þîú/k/{ê¨7f–\w50±Dp 1‡ðæÞ ^rÕƒC!_W×]uÕßöí¹`Óñ¢IƒMÉdÖ`{_Iño»á^x2H骫.ïyšîºý7=~pÈ%ºæY znán„wœsû¿ªjHE€uŠvuòŠ……ù'y’çN‘/þñpR˜žpêÖ°\?bYö¬ à´20@fw%ŠÄA«Q'Ô²NT±:•CƒÛÐñjlIACv4be´–@Fv°{Çc?ø„€‡ZÐhzˆeAÍh؆ŽV `!Ÿ§Ã« ¢Œ Ïò¸V ×z—lMEý%hÜÎn‡¼vZ¢ÈiûÿcqžLbÎh4ogEÃNr¨‚3‚¨$‘õeÓþì4ëJ¡ýkigZÜN×¾TÚ¹žvåÑðê; ¶® ¼Noµ‰œ˜D¸AsúByQ4}S[áƒ-渧³—ñBÇëú…rø9åHlùËÍÌ!Vö»‚ÿÀ]g2/)8B5*•VþƒÓt?\L€CVÑîtÚ•EÃæ¸m–%H£=«h‡ynWé®â•^µŠ' õln“’ÜÜ“ÞÆÏš{ÏF™ØLííŸÜÓw6Ø5ìºÐÚ;ÝÒ2™þûõUvÇü$&$“L2¹9¹9¹7wÂ@xˆºE@/EXƒ…gp,Çmâ„“Eú?VÚ›”y WÌ0YnZSs«JìøÈ(ö}dvÏÔ¸çÍŽ5ÀÏ-³lÇ¿X}|nuÜ…ëÖ6ß5ºvÅ%Èx,"gØ™™™`xA‘Uú :Íò ,XQ£DÃ@šÐ­zUHŒBIÕ sZt€säK9AŠÙ. ÍIˆDR‘ˆ3J/`dÏBÇthR‡> öÖˆ}'4!Ç šá¬Wˆ.A£Åhb:_&^q\-ÞæHµìN0l"˜V¦ 'Åqœ"A.ç¥kØ<"> ¸Ö„6(ØxA‘‰Š°idT/Îÿ,® M”‰â:majRc ‘¢ ‚ôGÑkÞw£4èA‡[Bjd¨ ü§=Ø„½h°Yì2àB?iAC]¨­g%‚I8 B„@˜!QXâLç?õdÓC[¨/ó™?|/X_2í˦om¦½;Ú¶È a¤2ŽgI*Á§”)OÕð%›ùL£‡¬”dÑ]…a/g¯óƒN@£ ¨³$@Ü€:¹w,ö;AMÍíï© 09ŒcYþøñãÿM‘••À÷«ó¾Ýo`^Žyž0èm=š4 X|W½°ÂUtèL)šÔJè9Ô;¹m+š0 CzÌJÖÁ|‹#œoʉLÎðÒ|…ô„ETÄx):Y,Îóƒ 4¢9þ„Z´ ã´M˜Ñi-š¬iqJ/ZBƱ ‹ØrT¡|Q<ᄲ‹,cÛ†FLâå6£eb—qÍ¿)r¬$lÓ£±R4¾M–Šs;W)2#¥$ž.ð„%œU-Rd¨½çBG;Bjä¨ 4¢ÁF4ÔŒŽ7‹#f4àEGœèð>‘%ÇšSC£×A¡ç H/2Œ’—½S¼þ‹Ž<Ú³)\o×€/‡v¯§½ªcEkcY²8:’Ãiˆ¨.¡šLºSù•&cY›÷\“»\–örö:?èP­ @òµ:÷ëòüÇꂯÔOÔõ–ge¹+Ú|ª)¢Úmó;Ò ±à ‰,‘bEY ó§=´'‡v¦R¿*Щ¤}aÓ=5mJÞù†ÀË0‹9pÁl ŸÑ eúŸ¹;®7÷L5õ]óô_nê¹Ø¶ÿЧûŠ»ë£–¾_·õCv'W¼¾Km½’k;éfÿ/;¯v¼ÐÜýËVÿe· Ó²à5NbA&iMß¼h ??^ÊíjÛ?ëZ,îY£M4ƒÙ µþ‘Ùê|'¸åw¥•hÜ  uþ,Äd,X\÷L(ë°;guÕ%¤Äq<ÁL{ÆÖ»f÷’¡~¶®i¼°Œc†ã¶FF͘ÝsUõÃ…%¶õ‰ñŒ4Ë<?±ØÍ.¨fÞhÇ\íçcnÌV5,Ôy¯ëjXNÔH4&z½þÛY^~Û@`ù»©ãy ðc^ EWèÊò²œÇrL¤ÀÆ1bá>_ŒÆ ˆ¾Wu”‰ê8E_‡†Õh ¡G£Eh¢ÑH z« Šœ £þRt¶8ª4=N¦``>g´ LÖ¹gcÙI³(0ÆH0 L8ÔuÏhЄN ´ÏO‰¥Cç´²ÞY].ê«@ìovl;šØ‚ΫÑp:¥‹Ø—»I!I  4Y6u„L5Ò‰÷>Z"Î|Ü(­ßêæ›€ ³1½»oCïºÑé– 0Bh$T=è}pH³è~´²!{©BÁÂÈYAÎ*0,)ŒÅ#†7igíÙL{T´'ƒv'S_rðcPõ¸'•ö(©/ƒv)iWõo¦½ðy˜óê/Ò|Ú§¢>häÒ® z0îO¤¾"Ú“HfÿT—Ï)¢±€‰Œ˜=1ò°—­×ù¿ Õæ®hr–ÊUÏÊ7S]Ñïó³¶Ë‰ Md`ÁÄ%ÆJ´P^ 3‰v'ÒÞ¬à¢H§}ðNÿÕ°.ºÄõòÊë¢'E\\¹ô@¾¸Fºaä4Ú›B;‹h˜'‰ö&QÖŠ¯0Ð]ðÄ“Tœœ‹9žÁ_‚œa×bnWvÁÇETxýS­}×ZzÁØ}Õ\lóÿ¼ÕwºÎ£`0Œ1Þ@„ߘ<ÿ¨¶Ý°8M¶{æú›ÛC“ó¾ÕsÏä;K^ÊýϬ©~n·ûnuý#³cÉì¾crÍY=¿-·z•¹¹pK<£Rð7jM¶Û–úWÿp^1PD.ð9Q1wwܨj˜³:þj¨]Ë ‘R¼–‹Lމã„H†f¹h–ÈÜ&†¹^Yÿ`OÇ¢Ñdš±ØfkWý9,™ÜsfçŒÅ¹huß4929!Ãû^8þÙ“§`ÉÊ·¶ßáfå_ì×{lÉð‘"Y²´ZV£]­µëÈ „@yÛI„“`ÙNá•;1I#ÇvÂ¥=¯ÜŽòzýçtºGSûOïÚª­ÚªêZmÂã*µ:r:Îô‡¢t'™‚R ¢/“Íjwf¼Þ™ï÷-DŸôùÕ¿”AþÈ¢Xb@ç«Ñ„]°¾H€C  XÆœè¢Àù-h¬²?š°¡þr §…o„Û]Cã,y9tåtÅŽÎÚy™ÓñЦL\6\†id4â@£µß9î"EÀ$‹a0ZÉ“gP‰€µ8UéèÍ*tŃÞu )@KÓÎXý²V4^ƒ¦Ê—ÚÏÄ9+›-<ÀKvf’a‡6—<†Ï£ã±°ÓþX'褊“"gb·C'ghȇN@§c 9¾[‹Ø6¦ÅЬ¤HDÕ.3È 2¸OwäÓÈ&Ú½–öfÒ£… A¨ó ¤A# Øoá¸×D{Œ±}2Î]·×|ÿpÀ¦EæhW}³˜vgÒ°ñÏ;Ìé†Ì'¨‚Y¹J¦-›–<=½ŽW*櫊lÅÔfž¯*øÚ¶~Á¾õ#³9CÔI/È8‘Ó4¬âiïFɦxÿai˜XÌef÷™è‘l’x×Ew.»«,¦yléÁ™ð†…£ù¬Û éQ7Œ˜ýí¡Ì›õ²D ²"Q‘d($9\™žªizï~ È‡¾'¨xnÄn _Þÿ†-+_À˜—E‡CfËmo¦ÑwËÓz³©õ†§å®ÇwÇí›öüßid¶fÏFÿ,LµÉÿ—ßÛê:MÅEŠ*KLnIáU’(àϪÜ÷ç ½uL„G$JϸæuhÒ±T¢ñê—@­Ìpp¾TÅ|­‰âr#`T “M"NÁ—ŒSÝÅ•רñ–,;e'uÆ Y%XÑìÉAïÖ¢ 'ë ºurÁù}~ÀˆÐÂ1N:†ëµf™x™¨z,¥ Ò  Ÿ"KÛ3¸^ wÖ‰ÎoE?†‹-ìúIËÒó㩸hC—è¬MêÈo& 5(w §–ýÐÏDŠx»K´Å­mèt Æ?ò3œéD'¼è\'êÝ­fÛÉË/òI˜° Øc§Û7У™ú dYõ;dTmE4l¦¡VÍÅ»ë2‡B•GÃé´'“7Ð.Ø„ÓïÊ+Vhˆ¨…z¯P'M—R{Ù’§§×ñJżmýü¶uQ«™n/º_U@e÷•S¹©XÆ*Ÿ ã%‘E< ÑPÞ#༠‘³zìß¾Xçºx8PÂ`ΦÝéôÐJ)¤ƒÀÒèZ å.ôçÑ£%ï;W› •**`µBJ%-oR“ºí®÷:‚?ýAÿÕŽÈSyn|Aov„†êvCuÀéeQËê _Ôìúª±í¦»ez‡oƽ²*仞ö%çÇSq£©ý–Ç7çÞÿ±ÍãZ™¦b^"¬¾#D”8PÑA%†ñAóæßW·ü­©3Þþo{ü&ENHg[VeV$§% $ ã$YÑÁ ˜ýBE© d¥(®•åSéeKõ=¾›ßW;;®×í&Ýnð¾ìç0ãòÎ5øÿêñÎÕ·Ì4úß.µÂÜI ……h”þ["ÿ‹I-*ä¿5â´;fÐ,jÑ€B²«zÁa*¨B£U à†“J4eeYu´MT£É Èû\i²ÂñÉLFæ$Y›H 5ùªÓH0ŸÂa­£ãV4Q÷Ø ‘Iëíâ÷ W.RdÜÉ®]Œ9а]käR8M–o˜ZÝ q¹(+Z‰ÇéDªYƒÂhÌ…Æ@&Kmgã |­hÒÎ 7ì$EªŽ`=fšæ]èT÷¢Óí,†ÚŸG#'Ú˜F  +0 ‰/擃è-@N':íOh±K©*/èDädN' ¢^Ö nIúGw ¯§Áu4œEù´/m¶Á|Ø~‚Ù÷#yqk¤/›€]94’C»Òh¨6öh0{WnªkAÑ`É,¢ûõúº=ŸZK–<=½ŽW*ØÖ»­h>¦j5>ªÌ`/¥¶Ò#éj²(ꉚ ƒJ~âH¥ÝLl-ô0œ÷iw{Ãû i(ÎE4ÝÀEzRho(¥=fzx5¤ÒH>8绲-)áu+$½¨ÕBÁ©âjIumºÐvä“®ÁÚƒŸuF~v &yB‘ÿ”I¼¹ ]Á‡>inÉ4jQY ûQñfHÄ3îÖë­sõ{oyößõø¯5ø–œÏjášÇÿsç,ÇcE”1Ö |U– zµ3§äcKý—îöovžõøŸcˆ@¶Qæ9Ìñ೨Bâ…2Rd¹^€Ý[OH™!©'¯äê6÷tSÇŸê½·›ÞijŸqµÞj\s·ÞlòϺZ_ös¸æöÎ5ú¦=Þ[®ÖÙFÿçÎf ’@$"ÚmvF‘¡‘h,b?‹g濾§êÌ€ñâJŒÎÕ£ V¦h_ FÀ­èüVt¥†Qb(RÁ„0ê@#64iASNtd+I“EN£`YÀ t˜ILÔ`’L4ûrÐÅÚÇžéÚØ-ã1i|׸ì★&b[5Ùü YqIXÅ+D£#¼F¢V’EUäˆ$ ¼} šlF—ªÑ¨uéùñTLYØ3œ²£‘Zt¸RPyx—õ¼È'ëÐÀ^t&€† ávf’“1“Ä«pðcÈÏÎxÜ穱“>t¬… úpM%Ñ/OÒ ²ªBíÄ¢ù\Usɹæ›àfÚk‚ýBC¹t  ¶ßÂqïºL5ApÀ¦ˆÙæH:´œ-ˆ´\Ä&I‚:‘µ–:7þ³ªðá¶ü±_/°MÜwÀÿ’%KÖét:u–+ %aM›%$çá$@'±M¼¼ì³~æâh<ä¬?ºYG:ŽoîúØ謨fY6†æ9W{ºÒ1*¸Ç×´Å1eqÌÚjÿ),ZÊÐÑ´2ør”€ë…i!£îKCò‚—§y®2gÐâ’t¼.çN±ærQ.ÍŠÜ,Ö„JÖÜÒåè¢ÑY9OIYCw½! weãÎLÜ–F@Ò™ÛR Hº"Wz—·dàŽòXµÅã­éco®Ù£KxU¯ $*…„f¤,ËEñ\J´ò-áõc Ä¿ÛG|'ëü€‡“-[ß[ÈÎpæ5rª± –O ‘cM÷;€7yýïÕ·kbãÕ4™NÂküÐÚ² VRO§­.ÐÈŒÍ;úÿ§‘»ç\•coÊ*3E†ÍÌ5œµ‹_ZœwªkǬΛ6Ï}{-ü„së¯Ø"nÿŠà¾`q%(/QŒ ¬Æ2…Kâ¶d¬ú[Yͳû’Õ3-xg, HpË.Θ]׫}ÓvqÂâ¼dq^6»fžýy»ΔÕyÅê"+‚è{e¥ÆK3 …3Ÿ}ö52ÿ™›# vÿlPECWÒEn- ž”øa(ÄOO#aê¯@ªPK.¿½‚ d”bBƒ•¨4¨d·U0¶D¹6Š£É$2Ó2$ =‹±ô‡)XŠô“ú‹ˆ"ó™PˆõN96÷ëÉ?)%ý0Jw•«T+‰Eµ8Z¼/DGLè`ÑÂóã±ôÂ5Ò¡riÀÀÂÅcà>a¥J„ ;kQ‡äí´³.,ŠH5â%í€Fvù¾ d»'¼SD{}h=aI· íp£ƒõ¨gÚlçÒ5 ~Š‘Jä–‡¿¨z‘?7î‚;·çã`Âë&q‘kæ}iÄ!m°©9]Ÿ•-¡X%°ç%šý‰Ju­@‹KWÞ5¤ÏfàÒU ^ž^ä¹ ^§ý¦D2h%7uš»Å騍ýšìÔbãʿ䦦*Y¨Ë*Å’X‰Ä‘Ãß~3sp ·§´¦;¼#5Òç"Ôº’À¦ ÚÑÞë\sBH\OÉ)™Œâ•Ê8FÎÑÌâDí]£;RÛþþOƒ 7o9UO(ä8^çÿU]ûÍ[ÕÈÒI'­V£ÕhW³º½OCæé;ã³qˆÁ˜ó¾3Ž;.cû`l7æ¸;À±c71~äaÃñ°Ó*©Ú´Må:uò¡í‡Ô­òÕµâG ~ЦVÜH5núŸs*EH®‹ˆ~ýµì²ËÌìjæÿÿÍÓQ俘™ÿÖ3I6ûpF¥”w!©j†Ê1:çD#.4±©Gã‹U=ÓÞmAïAƒµ¼Äy•÷ ³Å×£ó.ô¾ww@âAg tÆM\£ÑÄ&^y‰æ'v1 O:¸mÆíœ‰í¼„×óãèv4‘z©ó›PÂG,Fƒ$“\*ÙòÑçÑé>ªsp¬W+ ÖÒñ!x¾Øy³œgKÍZƒ<åÅyÄ$êT K£ïúÞêX´èàzê@§ºQ¿o«Æ¹‘°AÒË’R‰¸!¿ï*I¬f±5,RĬ3½kX¬’çáÈ*Öoa}pYÄúKçJY 2s9 ruvŽ}%<÷ÆW³èºŸØŸÕKÂ3ØD)ÍÆé´V2GÍCÛÚÛ×Ìm±<²[gìë–¼<-Çr@Ì:,læ”Oªd ´ iØ`TН„‹Y_‹å³^3¬b½0ÃW±hEjÚ—±Šd¼" '@”x‹•óãÁB¾â•,ba1 ë7³^Ëôþê×k²³¥t=(¡F ›$½*`[‰ùpëÎ_tF.õ þ¾{ìñëîïG‹§ˆÇù0¦+úÉžø/»úÂõ.xåLb0ÞYa¹î Þ‡¢ìkÿ²e÷¤÷ÿN#Sˆàt[x ¢2ƒ’$æŒ|óË•D#²"*„P™`± ã#U›&½¨×sï¼õR×-øG_çOû¤{Ñ´p¯5ø…'ðOH[H0íF¸;@/7Ýþo¼_µ†®ùÂpþµ·¾íbõ;é0€¾0œ\m U)äò E¥¢47÷hî[O°äüS‚ä»’™›½üÙŸk‡Uµjh´M8S&©GÃ64¶hAÃèœסá±Õl‚ê)CýÔË54ý´~}ÐŒÎ4‘–UäYØ?¤§=#èœyh`3iB£N4\ÏÑ2b{rN~÷¼Ù9!ι8¥Æ$5üuF›Ñ»ÅÒ ¼¾]ÔDUTL˜h ¥NÌå+¤m«DGžB(Õë“ÅmhÄÉ[ŒÖ/=?ÄhkÖ睊 b ¿\ñ,:ºTéD'ºùq(Ìãä^ÝÐ+¨Ç§ßjpŠ2ŲÑ$U €Hß±_p—³HEò@>€¬ke½ëY¤Š½Z:/d½ü볤IJþÈú` ;ÇbvIJæòŽ’L-Ý$IÙ‹‚8ð\öíº¬¡ú[åŒÃœÜb†0c¯Zò2´ËÁc‹eÆn™wTÎÛ7|¾ÞÜ”EÓeÁH &‰Ô—h³Ñb>áûK(gk¹À*8E"eœ(‘”ÏûV³^p\–³Á5)´T°Áµs°4¢æì…u¦4,¦…ª’‰` Ü¿RÑ¢M?zÇßýá¾þKû}¼'~¡3úQWôýÑZ#¿ëŠý¦+ ¹ØÝ1ùxÿ¡£;Ú³eJ°lÀ$›Ï·½t¯-t«iî©¶ð’ócAÜñ†¿hk¿ë A}«w•˜Œ˜ÊEX¡"1Z¨eäˆ A rqC~Á]Od5é Þôo4ï¾çë¼å@#‹¦_ç5ohÚºá Ý„/æ ]i N½Ø ¹æ Þó´Oµø¯Ã¥7tß¾¹x¹íp´︃×Rî¼+ó¨¬P¢È˜üõò_ÀßåÄSÿ$“ÉÇ¿NR|DÖˆ¢ßaá…;%Ø…&êy ]<@› ;§ÂI—”‹sʲ •ÈèävtÞÃñp µVf“FTBˆ¸JC]µèüËh̆&ìüø¤öÎ'ËDC õ(aCg(ñw ó-ü½@5gÐ+5zY—/I°€ ,aC6äbc–¤©"ÍÇš ˆb¦io8xk Þ’ócA × 17)¡F°Q€vº èd×’iäXï@§ö S`’vôV7:݃ŽÀ$jY©¨õ²A`ã&MØ[­^ï´¦ìQÀ¢³Ñ¢äa0I%ÈAH¿•,ºŽÅ¬<CÆŽÁ–°ˆõå³ýªV‚A¾;‘ôY¦;uØÖHûìæy‡…ÙÍIûºG[Ö/}ZŽå°¯MÚ­ó[@#f˜Ÿ`æO+W?g/`"éÒ±òfM7F´‚ÅÀf˜êó°âe, VÇZÖ»&…órvÈÊbë % !›EŠþä_íÌÕKŠ@Y&T¦™‚ æ(Y¶æ·C=¿ìü¤çÐÅE.ì‰>Úû¡5A/ÀžK=ƒC½Ÿîíg=±­¥ȵYJºpÚZ3ýb'Ôú¸·}KÎ…Õß¾ák¿Ù´“µu]mñ[UM„\#+ª,ë)N#z‚EÇŠol¨ýÃÖ6xøïžö»-~^µS€™ò…Á$p¾Xã™òø'½ûnÿWîÀ×Þˆ+Í»ÀK€„«n?ªÛÿ¥/|Û¾ëL.âwh ^k €v&[ ‘iwpÊQÖ¡®Ü §jÑÏ=¨k}ÅÛ«¹‚b€•tza•švÄ…ÞkDã›ÑHíÿê†=âH™§oB?mD£­ü-FáV3:ã@#6tÎÁñóf³ÞW,¬¥‚&È„H$‘ª¢!G6):¬d(¸µq¦¾@=z{3:×´ôüX‰:4hÇX—/k¦8׈ŽùÑqÿ’iäÄ4ÔÅAG8?à 9¾êvÔÉ+´LB(P"–6Í7âw6çþk_)ÌañL)d­ãÅóñTú}µŒ³$nfñÒù¾)†mãÀFM/JTJÕ,ƒá³ æ|žý‡ýzi*Ëã~’&Mš›››“{s›‚¢8kå!oÊCèCº@)-¡ÐÖÒFDmiAg7+øÄqðµnv>aÜì“Ì̺³³££8"àcЉ*µgÌ&kâ?;u™? ß47åÞsÎ==÷ü>W›3S’2ÑdÕAíÚ@É¢Fóˈ Vc:Ѥ^V¢%À™%ÁY$ÿ»F^š$ˆ‰^³ ™Š’ Êрѡa¨ã%h¨ êBW@uB›ðéÈ•8Xp²õ7†*@§tè½"n)ɰPhdŦÊÅ :‚Çà$ ±¦t´|®‘Â×·̨@G4Â-€FNl@njȵÔ¡¾R4P‰†ÊÑñ¹Ž¡Ã¥èX±pUVl};*7† (.–†‡ÉÅ´fê-G§+Ñ1 ™Õ†tB•r¬^)É,—S,Öä¢Ã.Ôk[0ìw é±£Ý6´Ïö¹^å° í®C½¨»V\ž—ðQ³B‚9†À2šÇÊeÔËbg}ydg*éJ ±¤+6gâ‡9™x’ˆ7‰xI—òKs2͇ñœLÎDÐf8Cù¼$h•³ªÔçªT H@•öLÐÈš꜅/C‹YŒ:ë'ÕÚ*X™ÉOÕ‰KRˆ.ïÁú܆¥¼ˆgVby$%Ëÿ·#1ØI x•d;˜<éÅŽtÁ$ÝI¤+Žøãˆ/øbÉŽÄi—r÷†Ø$™\ÎDJžÁbxˆX µô áÏÛ<çœ[GÛ½£ïv_hí:ÛêÿÄÝ !Œ¸|`ƒÿF.ÌÉGàÃ{ƱãL›?5r9…x¡XúŒÊxÝh½WÓ2nh\p~¼’ŒöICÓ:ÇwUMÇTRL3 %¸í†ËeucFë¤É>nhþ¾ÒòÐì|`°þÍÐ4fnÃLÃ…fû·†Æq³}Ê2Ü4š¾Ö7Üf MÓ&;ŒpÜhý±¦å¾¡iÒhª¶OTZ€(·MVB!êwÞ!p#ð963Z@ß, ¬ŒÃ,œUÑ1ä§g‰§ ’Ÿñ÷ܸvZ†ù†×U‰RІôh õ—½ÔÈ`‘€‡PUO¨é'4èÃÒ0K*ÍS 8ƒ£ž4¬AGu¸0 +Ca O‡ÛÖ  ú+hž…Lã¼(tX‡†t‚ ^×~Ö¡2á´ÁtRÖ£ Sˆy^D§ñXŸ"j/D‡ÊÑp¥p2´3¼  ÁÀtèýR´+mÉäv–‰úªÐé:a`ë… ó‡~y9XEEŠ¥uù.¹»>rxNµvvø>·g!µv~ìò~âòžsu q¾yЏ|g[¼#mÝçZ¼Z¼—Úºáó³Ö.‡Z5]FcVÊWǧÞ1»®™mS¦UÏPå¾ÉñÁò÷ÊÆûµÎ³Zƒœ’P^ÆÊ®h«Çë\ãfÇM£cÂìš2µ|Sa¹¯Û’ùç²w&«[¦*'«×Í@‚©*K¨Æó£Ñ>¥·üµX?fv@û7 Ö‰*ûw&Ç}ý#³cºÊ:Qm¯´Ü3Ù'Ì‚ BÕï-“unXU%8ŽçåóëhEæ$˜‰`ù±«ÿ Ìkägy„³Á`ðÔ‰“RžçYNÐHu .jú@© ‘5/ë{5rLµÈó6#£€Q ¦ÕÉ’¶b®Ø!æe2ЦÙü•h@Ž ?˜Y¥4šå4+RòhX/àhÉkÛVÏ9¤bN…èxYX[ÅH>XÎK1ÅS"I¤çDHê•@Ô_…† Â%CZ!00 À-÷£AÐ×ÉŠ—ÿP/;â›,$°1°ü(¡&Y·©M›@³4 b¢ªÓšnÙҥѤJë¦îŸ®tš¶¦KHI ¡jš„BøáÛsÀþ™–ª¢PoR¥ë˜×Ͻw~¿Ÿ×vþWÛrÇÛrÓ¼¹kߘ§qÅúñµ]sÕeQJàÜ)Êá2ƒq{†é9oĺï Þ€nëZîyƒŸÕÁG¯˜F>Y€â¸§yÜÛ bú‚0>š[–IxÌS‘ o Fg4¨êÌüò2?œQc1íß÷·wP&€'„¢ƒÏ¢¡4X¾ì5 \‰¢+ «ÐÀ³è‚‚ú=²¬yd•tCâ”P’ (yÉ@[Ðk.©0™£R*+rEé(êCg*Ðë_££­š Üè¬ ]ªBçØ½)“ˆiXæ™`Êò‚‘Ð4‚±ÀpID.Igš‹Ð‰JM —ª5\€k/AÑ24ìBgíhÐÎÛµ¥z²‚âT† I;Y—OµDXž2zJŒT²ŠèŒ+mâÈfµÛ¢íÌ‘œ¹®üÑàÓðdÒDd 4cè™ä/ÏÀö>kÏVë£ÊÂÇŽ¢¥ø+¥H…­Þ•÷å÷ù¾þGÊe}P™§ºJæìÅS•ðpڀʪ+û~¥­&$Žõœ@ ³-“ªóL$KlT#yj7”Y=n¹Ó™w¢Ô°‰$ÈD‘㠈ċ¥OeŸðì½Þ~ô·\ w¾ÛÑõ^{÷Õp×僑ßu>ÿnèÈõŽc×Û{~ßY¬kmàÁ¯¿\;ptteÏ•Îc—ÃG'ï´÷¼yøØÎM?H'"æyˆ›³…öq_ècOCÜùñ5Q†Là Þv7Œ7øc;­©&È'#fJÓӊפòJæ(œ¤ˆ.äj’Ó>ª ?ðïqïŒÔ&¼+¦‚ oLn%cQä‘)eD²–0z÷}­y›nÔ‡ÆG7ëÌŸu˜Ûs ñêGUl·ÊŠÖ ¬ê¬ž™Ÿ8 ês`µûiõùœ™HÅsS–Àrp^ã$,ÁaŠ—Yb5¤Fœž7;{®zá—mG¿]¬H]m}îôžá©Ìà$A´$'ßô‡Ç¼Á»Þ–Ow5ú‚£þ„騷~yÏŒ—FÀŸ{¡[>è'4^ßyÙé+IN8>‰Š2ÇcBÀ@‰À[íH5ýÙÓ2îë€æGêƒ#õMw½{WªŸ±ÚÀíúp‹i/`Q¦ËH§ÔBñù2í‹ÚháV}øŸ¾–O=U_Ÿí ZÃj˜­…êœ:©¡b¹Q§gç4òÕ¤,rð¨9^ÈW]#îv4P‰.Õ2§ªH]Éqb /bŽ[Ë3{òЀ ;Ñ%·î%»n“ÀPÖÄòœž cö…*PôÉó.€$º€Pp@rÖŽýè\-z¡œ´nÖoYo šÌEÌÁΔ£¦°!ÀqƒÅ:ƒ£­èÌÖ¥kŠ@­à",£®=ºØ†]TPÔOÜt#/Š„mÅèdê…ˆ¡“Áø3ãÖO›4>õ¶£¾ýè°—çYÔ3,+ÒL>9•»“àÚð—Ýùoo·>ÑÈéá+aä>°æÌlÛ2çÈh‡3¦e¥Ò!æ4Ï9Ì3öìYGNÌ™sYf¹Óöì˜Rs©®bÕ« ïtXbZ¨Å=^W'%]6Õ Ø³j—mÖQ¹©ºJâÞØ·¬‡•1¸‰N+ dÆ‘¤œsN: ãÕOL)x ØÎåf–ɤI³Ö”„¿…6«ÝYj÷æŠËÓ–$¬‘¨Ã^EE?%Éû¶(ƒ¡Ã¿úѱ·Z»®„»ß>p<îÌø†u}äö£ëSÒ`ç›Dñª£vÔÓ´’º Ôè^}ÛXü4rÛÛ˜ØÝþÚÆ;žàˆ;YŸgä€Q~8ž“E‘ç Ïai}´Ôõ^õÞ¿ºõ>ó4ׇG½Q÷î‡u+¦‚ѶR»ï®78â¼#ð¾«þ•žwÊwEÞ¯mó…>ߥ½ («7ák]õ%ò4g¯Iâ8’Ì‹’,OÞ8­id™‰Í/iäÃ?ý ™,jغaõ5²© Mî„Þ*ÔU®Ûc&…zÉnB¥¨ß^¯FîÄÓ.%qÜq‘_ËÞ,£þZÔ_†4\ýäùK©½¨ È`ºXƒ†kQÔŽ~Sιtårºd$ s’Ù´Qæ$‰#Ьœ"¦`Ì¢WË–Z…yWf^œ<.uAÑVl`Q#ŠÖÕ9/¥Á]£¢RÔ½õu —ƒ¨/üÿ¤‘SmZÛ0x%ˆNCÿm¸¡ŠZÖ1ÕSœ$ƒNxΔª0fN'Ò¿¸¯û˜6Î;à ÉÒét:Î:ËY›¦¼À0¶Á¼„|¾3¸Û±}7ð6„$UÒ4Í´’—†4 /iÖIk–,Í˦J[÷GÿªªMÛšµMhC–òŽ}ûé²ý±T,@O›ôºßÝÏOÌ}?Fcg7¤‹üÆiεÆ-9€„¥j‡).{šËŽr ƒÈe‹\–>[,+Žqgؼ sÜq‚Ïç¡Gô²×ë2e†Ë›´äM²° ùÓ\Þ4kšá À$²¶Èˆ\Á¤Ù4i6€`Ųœ)Ö8aqÉ6O™þqɆ)¾È– ›"ØV0–1®~ÐXÊÄ"A£NN¿o‚€¿#œëõ­;Â×¼y%|ðF}óGMoÞª?r@"73˜[õ‡®íiÞ¶±TC)q‚H¢È}™†Áª0À*uXÝwûïºj½AÉ °D& zý #‰FRÑG=õÍvÇ4°q…'—­Lï*äþj¯ÿæ¬},„‡]¾­þaÀ¹k´ªnD-ÝH¾Çîà/ ÷Fú=Á;ßîР‚u{äÀ´°býžÀÀV߈g ïûŸ3ì W®NW3Pš°Ôï>þƒç^X#sÓpúD4z¶å¸š‘ÐMB± †e×H»õUÄ)bFÝ,¨]ª”Jö‡Ú¨£õ”K¿êdW´;ñmë^" R‘@¦Qh/ðÀŽº­è24rÅ÷‚çâ ¹ÀKi-F7£>3v’S®Â –¨LÄkJ¤7\rbÇKñWÓ O%á€Ñ:•tî3ÒÌó¦çùúÿÝqtÂú°¨§íݤ¢ŠNÂIõ†UR§Ÿ‰ ÐÈÙz»N~f,0ïDâc‡Ð[~tªµ6H>9îÃ…Rì%µ–bT8|/U$x™¤v&8Ÿ¦/)Ë æÌ3À>Ú²d‰Z b\!¦ØÜqÖô”7=µBô³–œ˜5/fÍeõ3löŒE7óÿ«‘iKƤ5[´Âòê%ŒY ³Vã·¥²¶Ø°ù1¾ Êf9b|~lé¾?ÿm`aÇJ3IJ¼OòZš`”j"¾1Ôà+4 {'’”JNdªÓZvìý rèjøÐ͆#¿iwì"_Ú·?ªŠ|bßÞ°^÷>çzì¨ýzkœ"ñ™‡=A€dÙ×Ç:f,LR‚ñFóFK‹gÅÔˆŒ‰‰ãss¡]Õ4†i˜$L…¡EË®©L!<êáQ/´ªõKJÐex…Cm,jçÐ{6ÔQ‚:@NÂB¤á ; ¨¯]°JŒtV>÷úÒoyÔÁ¡îr‰=ݶïæÃtn+`¯þX+õš’Úô2êr n3ú‡z9t¦‚XIÂÖ$¹,ß,!äYà²p5ÈwÈ‘%¼4tÄYÒçÅŠµZ vL´Zãî’¸FBR¿Ÿ¡Öÿœ¨“( 9·GúÙâ“æ¿Ð„N5¡ŸÕ&:õ¸R±žVÂNJ©¤´¸‚f?ÒgÅʶˆVƒn Ú„3}Sš·Tíü˜´äM‚CJ3l.ðCäM³æì «n’Ëšã²cT³Q,Ë@&ò×ë2µ¤-wŒ5NYLÓ–|hp‘Ëšb£ìƒ-2ÓÖܧÃ8«‹C+{Ê¢gõ³|Ž\óL™bEÑŒ¾QÅûWkq c(Ei0õ£’”$É(´*ziůÂG>hh‡|9 „Hi|ýÚîׯ4– Ì­†ƒWïývÿOõÚ5MSJŠÁ±Þ-6(ÐùÌ—Ýý8E…\y(„¹y=Â÷ªÂŸº}cBýWŽš{.¼áŽË÷™ÛÿÇŠðâ—Žê'Û"O«ê†;TÕ8kÔ[·TóüIºud¤*òwoäF‰]Ÿ¢YKM†®øŠ ! ÈG <,„¾ò.ûú x·Ë…d S3*5A;„*q6º(DÅQ4d­Sád©Q$cè¼}Ù5<€~ï`ãõÊ£.8(E=ð³ýœGïU¢6]¢Äk··2ñ Š Ž­qÃpÒûß·|¯F.þ›ž½Øa–Îj·3¹+5¸JÍhhÇt îâBí¯ >jó¤f¼œD1d:ziÈ®ø‰p° d9ri¤æ/—`ƒ©Î¹0-žBÐE15jÞŽN†%´6¢Ô’Ÿ Ì[aÉQ­t2 ±æo­G§ü¨å5tº½HØï‚‡2ˆ+“4 †ð¯b&Ù¢ikQÔ’;Ê)‹ZrŽ/Z²æ²`» ؘ᠋õQi÷š'ZM"o9ƒÈÏJÙ8n1p¥á 8j7ïdpŠaØeԮͨK% ôé7}7è Ê¥‘{Ž]cÕõ#î ´ü=!´rÖN‘»ŽÚQ¡~Dˆ|j«>‘]h_µ&&S5ª}?Ñ÷[ÿlß yäò?tÁ߸–lžQOø¡Ë×g~¤VážH*¼ët`$°G¿'0ì E'¹»Â±nqÕh%A“ Nèt:ÈÜ‹kD<ûš"±T¥†QPøZ õU,»F@¬Ôªã—rtðèd“Ä’>‡Ä°J'Õîð€ µñ¨·µ½‚zËQ— µ[%«<÷åÿš€ $•è¼·êÄõÃ(Hµ=õò ç쨣Tºl[µ6%59`4øŠsÿTÙ°WÌhaÊcSÆWY퉯µ/[úלåS–ìGê©ò©5kÊ”ôÄ’ò½99hÏ=œ³˜c0ü.’Úœ?yûs¾æ M»û›¶}ØðÖù†]g•æsýtã|c+à䬲]ufÌ2—šû·ìè÷m;U¿m‰_l'$Aþ樄€F†]uw<>x…mµ42äª]tT‚FÀH×Ê6=Úà¿»fÃ`yí7k•=†ÜŒ¨Œ™pZB‚Ãûš$oKÎþ‹G¹íòÞƒ¬ÜðÌÙø˽_˜<Þ¸$=†GP(01óFI¹îª¥„s{Aq@‘Îê[åµó=?pu®;ª\ ãC±FGDÈȃû“/­‘Iš+_~& ¤Aäè‚xÔgšw7¡> uH1ÅÆ¯ÊÐÑt܆ŽÀž5¨ÏAqBœÐwQ Ñ{ùèt ê2££vºó×Ö™?:Ï ~è³ÿÄ’ÞRÔE’ƒ#9NÃa>‚A-Ù¨§1£÷óQ I`˜8"3rê*¡(Æü$Ï?êøÌÇïEú,è}3: Ü*fVˆñ^Ïñ¡-!í mðö:ÚéÐæõê3c–9HÉA7(¨SA j÷…µùÐá èP³§Gé ¢¸˜eÅ%íiã–Ô)³áqQÖHQvÐj ™“æªö'.«38M8Ö‘Ã"O8¢åÄÐp‚y&…0þHélZÂM“ñ™4’ªz½ÎS>3f.€Ç/ž…ÅV‰$€IÂÞS}`¯˜qËò¶8m, #„%˜}Cd¼´e©5žI«!hK‡é¾9qÊ’þ°0Ï XÀýŽIc¶ýœÒr©iû¹À–eÛïümÏÒ¿¹å#eû@î‹ »”–Ë­ª3c¶ñoý a+œÅ¥ÆÝ‹$^Xú%û´À ¹¹Nb*«¾ãòBþ­:SîV(WU7Ö*ÃïòÚÛîÚï‡Öy']ÊÇ«=q„cáñˆ°"ÆôÏ‹"Ôh"Kçíò9k†<µßºªçjYd7¿1Q”?Z ‚fzÿÿ«F²EÉÓ‡Y,ÁS-Žb™­‹bÕÏ„yùXQÆØš:fNÚò®älˆ°È½¦ã$Dzå ÍçßÜþ[ÿÛŸ4íV¯˜ Zú7·\ ìêÙˆ´ÇÁÕH—µ_9«Fܾۮšžš[îš[¾ÁòZÕùñ³\ùźÅ,–° ³ÜÎ%i×*¼WÝÞ‡®ÀVÇëZŒ…hÌ+(vÕüË]÷O× þeÐ]÷µ§úfYå“ ÿÇVQÍŠÑœÈj°Ž@ø4Aºêô®UF¦ÿ(¯ pȳ2üâÇ}‰Œº•þü5°@b–G±º²êéÄÄKjäüóó²yÂÁc (côž/œ÷Jí³£S¥¨x`E}P¯Ô]ˆú€(º³×J÷w™ÐqpËÔSÿ½òÚ‡%•÷½õÍk2à\1bFú½U}eusíÿ¾»æ®»ú¡Ïÿ•»jO¢I¯fŒ0¦¡X§È†Üˆ„þsñ_”×Þ÷TŠL þw†óÔ ,<ÅÁìîû-©RÁžRg–”´É—d‘`p2øß§ßCr@0ÑCš`d¨Ýƒz îªíVÔ᱇䇵£s!Võ¯mVÔî@=.tÞ¥þ²Ã>oã¶9Õn/LäB§ŠÑž\Á¶T0*ŠŒ™¢‘³ xgº—aôÜðãÇ ‡Ju@YBDÏó2X$cèÀ6t² µúÑ;þ4ªVÎv̘¥ Z€ÖFtb®WáÊ~t´Z2è!7Œ!"cäJÒš Ã´ÇÏ— ‹Óž„RÑÛf“j8ÊÅ0Y$"ÀÄD¸õ„`XaHFdx(o LæSdGKôԔǹa·×Yê×Éq±LË\„‚5X ’À_ixQûוFœzöšª' ˆb>Š’CFc¸â :2ž:3ž…hä™=9èHYž¦Ö,‰†ÀàÃæJÉü°©|üÓÆŸ…'^Q¿rÇÁ›Í‡¯ûß¼Ö|hÓ WN}Éh…qõ·e>Oõãòú{eU_ûê”Õ‡?fèÓu®hIfœeyì·>ÿ¨{ëßJ+†¶6~WZךéT_ÆœQQ`Ö0…!ïœiä?^ÿ°§îz‘¯ÈhÔS^G©Ž2³ÀŽæ9‹#£tŒ íÎ*ܾóQIå7ÞX±iôÕ zkA ½}žÊ>¨lÙeÑGÉ¡4ˆÊøøØKÒÈÄÔŸnßæ´<¶"ã¹,êô ³ëÞX]¨Ã‰º*ùœ-@g­¨{êòªdò5â´ê¶èlq(’BÔmÏqÛ Ô/¢ !ÈiÛ€N¹Ð™Rt®ulDí.ÔéB]ÔÑφ?f¨Ó©"Üi;Ú›ÇSM$¥2ÏdÓjB~Ñ€Zª››¶õzÔúá‘iö8Ѩ–­!8 }åJò°–%žãM‘Rб~Ê–<áH˜/±%Aj[·%RÂTk B4eމ¢Ä,NÏk£‰vå$^‹©& …ç#†«-’Ó«–Ž8ó!± »½ÎRHËŒ&”£’H%…JZ¦`BÞ_÷¢ö¯+|œš@Œ‰>•HA4 š妇+ž Ó2á0ÛS¦¦§Ó¨5IGÊ—9Ù‹E¬g‚V!í¸¸9ð«]~ç?vœxEõ6í ¹±ã T®6µtÔîŽc2°>•Å8Q¾SZ–úÈ]u¯¼önYíù»ùBë÷N¯–hE&*”~¶áa_u¿{Û?½•+šÊã“9Jc˜T`\~׳}¤Ü×S3×þGË»2¬É:G8YÇ©P¶$îËoùº¢©9Ö¤Á=Ov®Jzà®p«H0­ç=L3ÉB¯Ã¯önIå7°Õ˜Iø!þüÖ­—ƒ‘©‰É_^¹*†žF9ME’êÈçÞ…Ï€±:P‰]uØN¯æ¤í³â²UÚ\‘ÏSDo<Ú›«BÂ¥RÔž3oãvYQO1êq¡v'ú¹UÙ“«iÎûÑ©2ÔV‚:­è, ”‹.ATÑûŨsSøñc†á`ÑN;IQ,Q=à¨H¹ÍŪwƒƒ¿ >þœ@ü?0‚z'€Ž×£“ ¡¹4¡–m4JljÓbI&Ÿ¬eOÚLOìÉóåß[Fmæ[é ã° P†(P‘H”qš=µzÅìŒ뺇ëóúóó/­‰/ŠŒf¼ pûb—LÚ2ƒÎԧΔ°Ûë,õQZŠ[yJžŠL!Œ;nŋڿ®4ò¨0õ·é‰F^»ˆ§Ë˜˜(p·3’§©áŠ'*Çì&’ï©#6Ô'í)A{vÓbp<ŽpãÆÔÌ›;Þð·„'æA·zoÝÜ}äZC˵æC¶eq‚zÄÔxÙéòþ]²­s]EmiUØñc†þá­²Dêô˜ Þ»"á‹òÚOÍ_àƒë2ʘ$‰®%-§ß]9ì­˜;MÕ&˜E1•ÑtLl³ºû¼ ƒew]«¥®"¤¢‹ ÀZ©R^‚J¿·4ª,ô: VÔõy‡êŽ¥­1"(åâÅ—£‘àÔÔá#GQ‡1EíÍG`ÖŽwÕNçÿQD-½ô“æ/Ðid ˜£¬ÁŠ–äèÐn3êqÏÀ¸¥¨%OŸ³„#ŠVÍiiDD¾íËBç‹Q÷:ÔUˆº\¨-„LaÇ™4ZÑ{NÑþ ÛÆc½ˆöoWÙã¹³«â_0lX AÀ è ¨z¦ÐkÐlÊV8B¢¦Õl‹‘Ǭ槶äqGú¸Õi7ÛÓFm©Agú_2Ó–SR‰*Ó3µàÝág‰WSoÓþ› ‘{Ž\ohùx×á…€F(æ%Bë’ÒÁÁ‡Ý5}eÕƒ¾š{ÞʰãÇ }îÙòvjÎ"^ø÷åÅuÅá+!YZi¥Ñèjt5£;šÙÑîbƒÁ®Áج×^Ï®×/`w^ë-›e "€±1æQÔ„h©h“@ÄËæåŸVMQš¢¶HQ¥H}(j‰Ò4Jx°ãçîôŒER"H·¸êèhtguï9wÎÜ=¿ï¸ö.$‹«fέ‘|EP?ÆÏ‹%„~X}7Õ~¹eÝ­Öî'õÿÓzm¾Û-S‘ÔÇQ‘§eŠòl Ü«.>¯¯:µŠIbp‰$ÿ%ÝýÙŠŸ®X?ì1E#€_ÉS ‘ô†©Îë+;ÎÅZ0;UX$aÿs»¾3$’KyLy"@»‡ö'Ñ›ÍèÄâ§!¬€"'cèLÒÕÛÄÄž1‡Ãçey¯›xdì)%"ïÊË+cÐOŒÜ]Êm©¥Äåu³^NöYbˆ§³" hK3]¯k3Ž˜è´…Îæ.n®¬9ê[„^Z̳.™ó(˜pÅ :üƒ)éqÔü•MèÕ)éíF6M7c<¶ÁÎt9÷Ã=è¼Eþq'*• °HDöB $c…G­à=À >W*ÑÊíDC‹ŸW8{*ð"h´ŸãàqçœY×õ%v²Þ6Ê&²q³,c,ŒØÉjà"hZ³VmVÚVµmªÓ.¯i¿W€ å9‘R"ðeæµâ™ß4ÿÿ•Fl+šqä¾Â¶*²Vù¶pܨÊNßw3ƒY£60ª«Y8áV4kÖ>ÔUÛ ÞÖà( K„Ș…«ÏoÝ=í8ñÈovì{¯gÏ/{vŸëÚõë­{mÜ 4"c*q|¥$4·Ýní¾Ò¼îŸ+Û®´N?~©ÿ·bËçaŽ•)  ]'OyìüqÏä)´N¥’›Ù¹0ÚߘükÓjE€ž ‡|iŸ¬|æmÙøarH>xƦ­¦ïL#³KÌåб[ÎCG—£7“èD,gêyÜB}M¨ßBo,ð@G-t$‰ú Jõkè`OêªqË‚B)Gg@ —P:—%’›`N¦–âyu%ÎÂ~Xh9®Î.E§šÐñ8:õ-ª=eàüdÓWã¾);dy|¬ÈáÌr<+Qäàñs0±¨Èý,æpÈÉ$:µ Ö¦?±ÓèÄ Ÿ ËmkÞ¨µàž¼W+/„Š/FJ†4PáÆ -ÉÉZÕàÄ6*jA >ø¶±ð¡1Tˆî$-ù ?€90Ó¬?ô½ß…Jn/ êAX8fDm#d•v2|7^>dM˜Óʆµ;±hLƒïÊZ Ÿ/©¶“¹òŸ«ó9¡W‘ûs]¥ŸË+â¨K E‚çl×ßíÚõþ¶¦¿Ó½ûW;öëyáíÍÏ¿³mï´cÆcÚ[=/¼»u/ÐØùž=?ß¾ç{}…³@b1†š!¹æFKÇ­Tçµtû?RmÓŽØôÆË© —–=³4¿0óy”ƒó”ÂÀÏóÛBõWW´]^»ùfjõôú«éõOêÿrjSoYÔTü²(¸DÖ-Ê/æØÈT_ pDļˆ;4 2G>ZÑa·n¿ÚÒ>jHo¼šþ¯çízºýfKûÇ-mOuT ЬpãBÁYÀ•ù7ÐÈ>dˆ$óyŒG¢rHFG–¡þ8:Û”3õ<µO¢c¦ãÄý¬…ΘèLÌ¡”ãËÀ8±Ôµ¼ÔGgúÜ#»Ñóz=…޵ Ý³PXN„Üèp 1¿òÜg|| !_Ûpz°ôw¢à–—•£Ú±ˆi¤ uó  Î[]‚NhNØá‰ÿ=Ô[.•y€CàLA@Ï®F¯tå lr¼Üâ œñ“Èí|“½Ü…ŽnwX¢÷ütçË2!”(aN•>0 qPù³9íIê•Y½®ÅOYÎM!š z‰Àò,™UŠüIc½ly‚¾pbÂ`ðPÇõà 4B£VxÜkÕ·4õf,òR±·Eá>Úê—“2]-Ë[ äósA…3úBP7ƒaM5á-ÂcZ%ÜûÊò;Úâ“ ?Ÿò³f>5|ÂG5Á/âÃ1uãLÙôy¬|š–”f¿œò‘_K†ãµ‹ª;fû‚/ ˜gÝÐ4)S@ÜÏú®4ÔÙ Í6Mêá‘DÕ]M=,[/‹Íq¥Ÿ6+» j@Yƒ:æ!$'Ûß}ïÕü@#§{ûŽnÚzô{?Üર Ø\íÀ>oõ¸ÖuC‹^Ñ"cáÈ¢óã‘qµyýX¨ón[ï_;•Õ÷f¹ž3¥ùli¿tV¿¯¶] ÷Ì5Eok]W_€¼þT[ÿ¤ó´õ~ÔÐ>¢u]ԺΨá¡Rõ•U®–ÔÌT}6"Áå‘Ç’ U‹"þµþ<¿ÐÔ1ÖÒy †Öþô÷¡ý¦i]ië©K[ dHœœü!ÿm’Çÿœýó!6,‰/VÚ˜Áf椞’´ô®×p¤Žªf+™aŸÎý¸žÒ˜_hÌàZÖE—s¢ ‰Ü eµ ÿµ†9ÒȽ¬r"‚Œ`%Âìt3ojh1T§kä1Z€“þD¡èŸƒ 8Yð ÍHIÁ&‹(Ÿw2o= gaÞnbT«,l#¢\>a`µ~}…‡’§²¤ígéoà)«  ¢ÍÂü$y±³;ÂìŽ1¯Ç™]Q}r0ÉO™"Æî¨a°$¦k¤'ÄóœYýe&ᶯìn:Sô§ Å™DÌ)y³ÁÒÍÙÏ@;O(¼Õ)‚@dQb m¦óenH¥„êšQrg•ÕÿöÞS‹î f•¼Dm~B-˜òÞñ{gýÞ¹`ÍÁÕÙ<á8˜ˆdDˆJGØMLÔ–OûsuE ]ž™S fü… µ¢ÊN%#kÔ»*Q€ó,šÈµÊ5 µ4¡V ˜3ˆ”‡Ö‡7ñ‚µèÕ¹oç5XÌF ƈ¦Ñ^6 ( K * ®ÊŸ¬“Nù f”Ò=+²ô–E &"# ,/b -–Œ°•j!äô$ŠDþ üûƒ»øžR v:ãqÀ,ÀT;˜E¯„[²–¿““c¥ˆÅ\¶hA2,FHGê#+-„sXÐ_]9ó €Ä Û5p€Ä&ªa»Š¦jÝ_½Š]\‡e_kŽŒ†"ïš>|öù‘uñ'ÿ -ãËpÏ­–î+íWš;G ô[b£Züƒº¶ƒ¥JWNAEjzª¤—h(ìàžÛé,ûT‹Ž†»®·ÆÆCŸ­ë~Úûp]ëœhí Ç.µvŲ t D@äܹs ¯A2÷L¯‘_= å×F(Â,ÖV3‡“¬Èôƒª®@ȰÊP–¼®0‡BÌázfŸªc¸«)i¼Ñ(˜>øŽŸ.g†=Ì@¥ôÓõ˜Êü‚FÞôë\˜öFù¾ý¼_ƒd@}¨88¤X1È@Yf?p¬3õ…}¿T‚ÊÎQÞbdê™ÃUú V¿øüxdÀUl®DÄ(#A(-ÉÓµ°7y$èïaötëãÍÍLÿFð˽IÏ·)èµNfÏF0 Ó'Îå)˜€ æöe¦'ê*¡] Î+žDÐy7y I³ï\¿-t˜(–9bÑùK­Ë"…÷xj¡\»]ú“;oÒçžU½ Å;,žVògý+Êê98€‘JŠ#QWr¹ª4GÆB¸ŠDàLh‰‰d™È'e®iÅ9¥æÏ+ù3þ‚„ê½,HÝ£^»„%º‰;²,ç-éˆk_–>¯TNrçn–²T”Óõœ–8*¦ò¸Éžž-S†ŒJ$~à‘•PxMR¡AˆE¬™¢ãÎeÓõî…E:÷dÚ‰H¬zt"0¿L¡‚4}!Ê#³^þ% PœÇPFR1Ø€û»×•P\‰`дbp2ØX §ÚÌ©@&fŽYx²L€®ˆD ¤%ˆ-°ÑOŠ]’YHgÕqÇôrÂŒJŽå¬p˜ÄÃæ'8S,Y10Pd%Ë€•'È.ð[3ì7«J!ë¿ðåM+¸k÷rõ•§™%2Ïb#æ±A†íåqg "õþ‘ÂÕakš6ŠgÒȄϛðçÞ÷çÞS úWfĉ¢hÁ|†$2æþæq%kþ¤=Ÿªç~ÐP‹§|åUv(„œnNÄoñ7{i¤ù{½}§â[ßÝ´ÆÉøÖEgÆwÇ{wœX°Óéø¶÷zuPéDéÙ¶T6ËkÆÿhŠ@Æ…:![ŒµF/4µßjŽŽ·½øÏuñÖn˜ w·t\^i6l*©±Ãû†¸Î•Ž[k{žtþKÍÆÂ‘Ëáè¨Ö1¢E.?Œþ(_Õ¢7C±‰–øµpü|sÇIµe B¯Ì«·Û”ãþ¸¹c¾Š\_»þFKäiïÃxkt\‹] u^jîÜ客š1À6€Á‘a@xeØ>y5s?¦„FÿêÝ}¢Æò(×ó)âx]Å\¬"/ŸùgâáÙX0ƒ™1WÚÎi¬l󄬪¡”Ød% §H[Ê]s™£-ßxËï»\ÁTÍ6WN·†çÌP:˜n ~(‹•ÎECcËœA?*L"rWœnF÷xgU÷b%h`‰Õ\6ý–YuÔWXrY¼„kP]òçH…eFîG‹f›ÖpÅôqæ¡UˆDn•;Åâ,•õ,NrUîÐ 3ªÈLXA58Ø!UêYŸ7ú­æÀ”ÞWœO5¦r{Hš„3uræeL„(!;enO™s…q‰;.†³Q:QòQ¸\VáCÆ–‡SS –rÿ!Ùf~¦iP ¶f #F¶ìuR%K•öçyîÄêgâ,fŽ•[Í•·+Þ+-ö Ú¨¢hh¢lxe'ä5÷pLó$>¬Õ ¸_1|Ti¬8?‹X‰Pz!š±þ“µþÕn¢KàGQ½*VNQ@&F•V†+Ú2îtÀ\ö)ôbEù|¼ÚZWmÅKîÇK_(Ê&ЍªØ…D’=;Y„93Õæ´™5ÃéX™•¨}»|M–ìp/l?ër ßܾóÂ÷^Híº°m÷»Hö‘…“gÍŒïØÞC;JØIì“{V•q‚ÆN@úÙ}99x39x-ùÔSõIÛÍÞaïu Ÿ«Mì V¥JË>mïïÞx£³ÿZgÿ;Ñ:6Ãêx®BÙyã]ÛŸ´ÿ+=›¿èíOn¾ÞÝÿeïЂ+®õ A;=C]ýí'»n÷ŒÜ\?|¹}Óå ©K½ƒ—:7}Õ·c˜ìMÝZ?øyÇŸúRt÷_ëø"¹åÆúᷣݺácÉ÷ïßÿÐéôüüüZ:~¼FºÖµ£æ¢”q]"Ä[ì”?ÍXzž2…“Q[8÷Ó=´¥XRˆS6Dï15º$_âå^u+F±K8Ò*œ\ DZVÞP褒®Sýûk„³m6vk3ã±dÂg¾¡È"KNÛ#Aéu‹ªK1ö€¥·Ú…×ê¤&²Og*«qÙ$ûe¾Ý/Zÿ¯¹?<§z%fpå’Ê…ýýÂá­ÂÑm™ÓÈVÛ!h‡…ã;làüHæúT;š²åóʈpb‰E•åPî‘åç «¥ñAÓš930WÜŽ…f2§‘; ÿTÌoµ6¼,kpò,žE9AÁª+ªF—íÐÖñŠ¡FêâŸ.¥–º>¬þº1<“¨yÐ\9óß_ÈÊùXÅßk*X9²G• û‘¦º‹°*ß×[fÙ@búgãUV"x¯©ºÞ«b÷Dt>Ñ!’§Í«%dūݜêÄP¸¾ŒQ HâC*¤ŠNe‰3ŒÓ-:ì¯À QÐ £•> ø­Dõ?šª¸(²—x‡@d\ØWìu1{Rö¼ðeë‹SjpéƒHdƬ·U‡ý(.n¦*öe$–%I¤Ô Ã6*ÃÜ\Õ‘!’ Ehï²á”¨OãWjçÌJ+Qb5g›Ê°ÎŸ„JW+’$eåj†Ì4öRÜFAÜ£Yé;´jU“ÛÀà©=,e 繕 éo•ÀL­eúASˬ}Ù·Ü#2-`˜²šOT‰Ð7ÊZ·âS©Ka «JIPã+B³Íkçšk®×¯´ZÃV¼ìˆo9¾÷2ƒ@–Óa¼¿D™ê?c‰GæÌðL´ÄJ„4Õ­Àz{ƒ†ýã¾ ïþäÅó©ÝóûÔÎwFv½·cï3gÆwl{x“üqt÷ùmc¶ïùQ¼C%xÈð”‘çýUŸu ÜéI}ÖÕÿÌùñ­v»c#ÿFr(š-Köá¯ë~`õí˜LßJn½žL}œØàŃEˆ,IW;Fž´ÿ¯º7Ov÷wn¼Ú30Ñ»å*V kàVrÑ?±~ ¹²p¼Õ;‚õ¹›¶[ß(þ3µad²}¾ý²7µH¦§Ún$&ºÆ×Nö¤.µmvŠú‚RÙÞÞ¾ˆÿ)ÿþ4T×iŠ&;²KNv o¶gMá\Ós­ðF\8ÎÅ…c-bƒ“hð“dÔU÷2æÖE eVcºÂQÛ°û¢îØJ¹Í'Ý”HN…³ÚláµnáTÂngLál‹M¦Eœy4H`Åö$ r9‘Q-‘¼«DØc /$ŒŽe’&q¼2R!áì´p»Çƒç™´ƒmNî€?u¦ðå¹Â±á•­ÂáÌ©à¥!áè°p|»0Òe¼˜²OðgûTƒ| ¯Ž û¸¡â‘–)-æÊ§Uås‰*”÷éxÙŒ„F¦b¡ùÌiäA,øÏ&ÿt¢*¯þͪ¼zƒ¨TÌcr1×dÊcÈ_SÜ"ª#SÃáQœH”¬ÐÕ±Âü+ua«¥:/ÿ×Úšùxd¾9t׬Of{WEŠ˜ã θìUèû¡€•ˆLÙ LÇÂÐÈÅÊ 2Ç]8w"bmœ¾¼Òm™ w¢‘{fp&Z‡WÅAT5D³‚#‚›ª(qNÕ»øÑ¢üáœì|—ŠÁ­¦ŠGâ"Ák¥{‰‚ã‰Â‚™he:ù$R~Ì·ügË û s—º»°mcÜ@23=®CEV¯8°¢pOQþá"Ïx=¹z>ø0T†üsÙcwHX"ãU¡šª8Uštë óžË1Ü*ý7ñeÛÔuÆñ+UŠdÉ’utttt¯î•¯-;!’B€ÄNìØqLÈ»}¯”@;½7›h«(PŠ4mꊀ–ÑBx©ÖÛ$+[¥õ¬|™4mVFy'hx 4!±ïþ×lÓ„ÄT´°XGW'ñõ9ÏyÎó<ÿß:²¨ª xc#ù\F&ÜrÌ»2:óßo.5^¯½SªëH$ŸÉó© P˜µÜAOV•œÆê—ÐßXÝ/<ÅNÑ Ãp\7W‡¬o»ÇáíJC¯¼ÜXÛæÄ÷lœ)b2‘hÌOú<Ùf¼³l<>ì-ªóJË™ïQ´ÆÐƒFÄ3®®Fˆ¨] ŠÀ]`!"™8é™ o¦ÖŸ©øÌFk¢tOV[Öþta1gŠÈ\áÞö»u¦Žÿzý¶ß¬7Õ|Ö1ã[ØŒ‚:1¼–‚o?>´uÿša—¤H&$³¥î‚‹+ûï'Ö^èì›uüx–Fºú/uöKt”•#œ×·]N ^jYs4Öý_M؟Ǭv»Éø§£«_tý«‰ÞkÉ>hýmÐEWúz¢ÿFwúZWúV",¹ÑÙ?Ú5x-™º¸²ç‹•=_&S·Û{ǩˉþ‡ÝCw“é³=WÚ{F/Ý·ºÌ'éFGÿ…•©` Y´S^RRù7f`>==…ñßi%¿w »)â‘.“@##‘SÏíÂA A£p¤YYné)·ë‹¹GSH@øj!£¨H(±LQ¨Ðàár‰q«­ˆ«Tfyq·°¯IÁ:­&Š`̓OCÏçmü6ò¯q076jEY 2«lEc„B/J¤ é“íN.|Ð.ÂñsÛÁæYÇgFº*_²Ù •dž¬RØ_+¼»~ƨàñþð£>¡Xæõ>á'ÂÞuÿÁFï ﯵ®Š çÜmp-uwêËŒÖÀ7‘²,t<€XLÏzȈ/}Ü\năZø‹eáåsÝ¡@̼Aá™H"w2.Ùh!U¦Š’¯Ì±Ùz ”Ï˘7£7|õ­eãM‹OUùUNçP:‡ÙÀ ÜìôÈ–y™hõ­ÂÐýY-˜V|X¾ˆ«›©œLÊpPévS™ d =Z© #¬’¹ŽMŠ$ŒT(ôdÈoèa ¡kgë¢NÉ"Yœ2wsFe´'Ô*óö|ùF´Òh)ÏD=ÑДzñ|ZY5ŸÙ`N§PÓ2…Ûö/ÌF«§ÁHQßc¸7â5tï”^ñ0Rv&ä8€  n›$ãªÕ.69ØÝú£µn ®k­ùc ¬Z¦*E\Z%‘ðí8‰õoÉ“HhÂ$IèièˆwÑ|bÍö’‚Âi^ÉUF¼„i´€<+GqË¡½%¯1nA)¹½”«"<)ç5×~­•fcU_77y9ÁuH"Nˤ£.çÙ¦#¾l*¶ NF«OU—ÿ¥zÉW‘ \jèåS1œoÄ«q»8™lsâ–)qrf§ Dx:X:SëÏT|NkµïxÜ›Õ=‘Ð¥º&Ôz³vJ¼D´ÿ<ýƧw@Óoz@òÉà–YÇŒo9N®{ëÄÐÖcƒožØðöÑõ[Mã7íÀäØðö×ù T‰1'£—Vö?ìLÿ-Ù?ëøñ̸øþuR;½5ùLb”ú]¯zU·ó<;Ul„S[¾„¬&xžkO½ðý k}7»R××;úowAñOµ®z/PÛ5¯¨ºÐ]Sè^5·xoeÝçñÕïJ&Sç;zo¬ìùª+}vu‹Üí|ù®èì½ ;“£ý·’ÃþüBY•A#²,g2ÓÏ£ÀI6›ÍMþùÁüüùó(2 ³Û ³59Lr8Ô.ìo5™äe«êMøñRaƒŸ½þšêu¸T”¨€KD!ê"›käΣ(ú(†¯ìkq ª7¡â£VáCMØW/Ö„áH[ÞÏ:Is>Z-´fî"’ÝŠ²Ã¬…„’%\Ø>nFš…ý°‹ÌuÒ_ºÚBî÷iÂ-Â6a¤SØß%ìlÞXF:K,U^ç©2qJ}ªðîë56Šã€øH•N:iµF»ÚÕ=ä³±qc.øyw~œmüÜÛ=Û56gÀ6>ûbS"E R… %R ØøQÔªA‰B[%Š"…¨R¥´R>Tªš€i 6%qŒ}ö]ÿsI¥ ÉhìZªµ²V{»3³³3óÿÍDë—?¹Ø,ˆ5‘|£‘k%c9ßbë*Y“!Ë’-K器ùR›\–Jd´•Œd¤žŒo%#dtåûa©c¸I´|Äm %?¸ÎÖ¹0!p‡ËAí"'£äd9Y6œêƒmR¬Jì][#Kò:·ý™Frº¼ŠŸPÝ^áQéA—eÔÈk}äP›[Õ¹;RͧKŸ¥+­‘˜á›3Kà‡„éŸ ú€ŠDcÙC¤L¨ænMù¼ù}ëRÒ²M³É\òp&zž;0Ý$'õˆ¬TÒ4þAqÁ|²´YÅ ÿPNšFí*sºx­¦2ÆTÛÅœ¬DcÍ? ßb0ÿï[Ê2 6€ ÊS8½âÍ_J#H NU¦h9:¿Y]"â/X”0Kc†?fÎÖû4.+"æ*ª¤) ±Žö|«‘£lÎô>±Fü¹:oœ¨Û!Z‹×áÍn xC.Ç¡Ã3_¹ŸVnbªòFØwéHsÅ’‰‡|³FyÎ1Ut#GèT¸gr²e;OnL9½>õå¬Ô£Ù©³¯®_çQmN:à¬Qšœ¢¬Ú˜6Ü7a€Ú°-¢hj6Ê앪rrùôó( Dý™éÌáR”éN¬Ã+­‘8¢ß ÄÍò„˜©÷SïC¬ÄM_Ü,H„`’\ÿª®ü=_Qgº‹i6Îí\U\µ;E~é²&)ô…§<³¢(ï¢U¼hzg ïõš²BIœ»(—UîQ4™IAŸ Õ=úVÞÉM9L¶»Å †ŒcœÊ5N~¿¾b)èbÙCzê•ç7fUÌ*š1òfÙ‚·(ˆ[åUn‡Fw7ɧ<œÂEÐȼé…FâÁXò¤ù#4B%Ê W1êÜxDãÏe=5gΛeÀÛb}˜3ó¿¬÷c§†GÕžÐɶTç\°Y OVúuUBGà6M´UÓá&¦e0E•íMô’KTÄ™&§3fCã°Ö2ˆÏ‰ ‰)é÷‚…â#›2Á7îåº.Ô'# ]v¤Q—ŠâU9‡K™î·‹6Q]œøñ–GAȳiKid¹Ê_®ñù(˜í|]U–|mäÁ“SÕå5N…jªS¦èêá݃ïG^¼¼ÿðÛû_ÞwpÕ9ñ=·Lì@–a`â‹צMuDn·÷®:?;Þ ubf‹}¦›$ý3˜Ó`FÖáÂÀDE裆§'ýŸl뺶­ëNgôáöè­í½Èk€ämÝ8…„»tF—*ÿngôNGäoíÝ·Â=×;ú;Ó³0ï(•S%š†¹CQ›8°gÄôI—…“±¯é-ðÞÖ3¹m׵νwÚ{§Â=ÿས¶÷N·÷ž¨4ÜW!µs¿8_XXŒÅ€……Xb‰¿Xl>d9zô(v(X“ÉÁZ2báÐÈØÊ§íÄV2‘tÂù 2^M.™ä¢)Â÷|=ùUˆüº–\ª¿žE7 ´kz oÂ*]0½ˆŒDCÕKYvnÇü¢Ø,P áï`Ò‡Å^DUÜʯséŒÑtp+šJ™j;¾!5*_J#š"Ö;'Õ,+ªŠC#Á‚x¨,n"ûò •Vš[ù„0žÜŽÐÆ|¡;$‰¶£ýä8#GbYSÁq`cyy9°Ù±z%e,—‹ä¢â7…nÒ×BŽ¡íäØï:[ý‚U/´çSÑ¡òt¨Ré}sMÚÌ·FR\þFùÝ:öü´U‘ÐýÓøÈ "ÊÓf nTLÁ”J?[óNéRÜ”-à%ÑŠð,ÄDÂà‹JÒ*O™ÁV T2Î%Ê*U‘Ò@ÅÞX¢îÓðò<<³F*¹˜ËÉœO)9®ö§a¡Y4"3Š÷вíÕÒV8m•=°Ê“f(mW'ŒU` ”¢ŠÿÔÍÐ… S<00œ•ÐX2Wü±Ê— .1„0OÏn:¸´xÚ,›ÑHÒ¬LÕIö6Ï)Îhß|¬‘)½:aήQ“>‡Ód§;Ÿæ»© Ó+JØS¢*àŠÀD¥f®;“õ»F%¢ÿ|myÿSªG¡‹%0€PƒA¡À¡‰Ú"IÐhNK>»©×&Íš´šM#Ùj?[ë3i”%Ìà#„C –GÜTP©ÓÍXŽW)õ¼Ý÷Ëï½?ðÒÙþÿ{¼·kÿ¹þ—Ö•ú±’±ù(Tø©Õ~µ£wÁùñD¹Û=ð׿ç¿ìˆMvשּׁ¨=T8XûñÆèùŽ-:z®F¢—»bÀ ÊÝ}W0„¶-ëÚ~}CôÓÎÞϺ¢Ÿƒm[fkÿbgïµöžÏ»ûn´më)\¦ÊÌ)8eQ ­ûýúM—:zoGbw6lG/êìùa%;š* ‚cϪʫ±+‘mÀϵΞÿ™F®Á?Ñ?´nÎ(?PÚÒÜ ¤>üŠFROT¾Z‡ÃHŠ»îÉp ]GNe 0fÎ{Úž¶yÂŽEÈ·Ã, 1Æà ª 2'é ‘3ɫ͋Že®d¼žŒésmÑ`wŽâðØpòfŠ“É}F’«óXÛòœÍ>²'DŽšd½À'íd4K,rª™OˆMFN#:9±·òYYKN7‘]r‰=jXsn‰|¿‡“ൠ^É P^Ž’a€d+ê'ÇvKD*"JeUæVœkÉá('ÐkýYë÷•(]ç×bŠì–èPIQܬM«æ[#q¤ªáC¶&rX"¡WÞª/O7!îkâzèVcÕ=£ ,IH¨ò›fyÒ2—1QtâÔ&˲8³gb]!h œà§W»bªaeÚ^-PèQ”\|ke,¤ÐÉúu£¥…ª- Ù¯ä‘(íÌ¥ÓfU’è?k„1žã®õ±F0ÒŒFÌjÓ£¹2ñ"+Ež¯PÓ ªz¬‘¸áŸ«F>®ð2$5˜J‹—kdIÂ(Cò>Š]£sxß yœô±Fð9·rÔ@#I;x1\©ÊNEá|¦J%"Q·,g²UÔ &ᜇËË£n&yøEJH ¨Á£%í´p¿Ñoô§×7\ª ŒùJú =%Œ?ݲ¤äS·*¸ªäŠØÕ„B‘;ŠQl勿/MµàÙM½|6d«ýl­Ï´Uy‹Ê $°>-?LrK¦­Ú&MuS§Ó‹¸¦Ã›vþfàà{;öý¢ßÂsâë•ww8Û÷â.½+Ï+—;¶.8?ž(ŽôÞˆl¿¹aû•®ØïŒŽ‰ÕÖ» mŸmè»ÕÖ;Ù½ãâ·vœÓÛ÷ø‚VqÑ^_ðC«û@Ùz½½g2² ñýIdë¥1$ølí_Ê„ûµ ±ËÑRIÖ½TÔs þÒ¾Dd®à·c—Qéî~ž[²¼=JDöI¤_Xdëµ®yŸ·‘ØŒFPÿ²cÛ…ÎhQf»Rd¥&T ¤S3äH¦ÿý•zôzô~<>C%&ÊZ±FN¶7ëÈ„ÉSxlþÓöT=9!aZ¤9€¥¤©ZEÞ9ÉÁf2Ô,~ó¡s9ÑBÎ4‘‰¹·¿Ï¦.Z$ç2†ÝCÁÚÆq-O‹Á‹}• ’èô2§‡æ¨,'¯H^r“êÈé9YOFëÉD+Éèü«lV4’a›œ\OÆ›ÈIŒ›d¨ ‡H™ËQ‹s9Bࣙ(?–=î%oÀ!;È`” Æz@RÄê°g n\‚äuP¹¦ŒÚFDzÖ[ÃD)-bÂÇᚸz¨Ï»FšþiËŸ²« »zíÛ%?Xùô¥úµz8䶺c„^ hÎ×…— ë©¢!ÁdÁÃ-–¨ò´Y‘Fv€7V`Ê,ãÇX³ê·ÁÒBQr H,‰ AY)-kÎUÜ¢‚ˆåΘ«X”~ä+F²'ÍÐÑN.*YyZÚªK¾)î¨` !ëg4¢1UåÙÊ×7®|¼§ÿK#ˆ0$Ú\5òë`©Jš¨¡ehDshiQÊô'³r“cÖL›¾[z¥ßÉhg£´çºf4’²Szm™*º)ÅBˆ\ø/²CEÚÄxá·ò¿›•S:¿#i{uʬ5IcuÒ¨™j¬JUi;t¿± 3]ôEdáùñDùõeÛÄyÇñGŠdÉ’¥ÓéÑéÑîtç“_’À J^œÄy!o˜Äöùƒ!Ží$”ÛIlØXWµ[ǤҒ„Le£! ð×´u›ÖQþ©4V©Ú´I›ªMb$!@Øû=†iU¥LŠ– Íztº8?ÿ^žçî÷ýü¦€%Ú“ã¡ø—ÁèL{röбÏövNv$o·ÆîÕNªR[Ì˪ÄÏKLŽXi¯¬€Rd|δ·bÉç¼Úº¯jÆP_nÉ€IV®Dl™EVæÌy™‰XAäykÞMf5‘€ŸáÊͦ¤õÝO=E”y|•O¼˜,}ÅLd‘å$ÌÂd¬!ÓÈSp¨×-kåk¦‘êb 3QàÝÀ€LNn/Èø^ÐÈ’§| hÄç¸×ä´Ñ*!î ‘1´)KÞÚeÍA‘Iß­Ù%;ÌFW`¹ƒo6ºVôÚ ÝêŠy8~Øj_å]WÑx]Á} æ]%­WÐMÖËï{ËžyJ3-•³ž²¯ã0Ʊà)ÏžTìoõpá+yÔ¿bå(É$L½…gøÜϨeáj4²^þ×ëù\Ѫ¼eŸ#Óì¼£9—ྥbIsü¹®±”°òfåæM—'~qüįŽþßÓÈG}oÿæø;¿M¾ËB›ƒ.Ëdéf¤÷¥ãÇ×ÖÝ`ì/¡Øl¤wî@׳ȑ/ôÈ~»m´Æ=×yìû¿Qè´³,¦C‹=SeÉñ¼ü/ÂÑéŽ$ðÃ\{òf¸{~Û]Í?Î\ k<’üuÓ~3¬DŒó©»s2›G'Ú»o„c°¦:º'CÑ›áØd¨Wà‰Æ²,¿WR?NMEâ“ûnô>Ì»F  ‘¹Pb>|¤Ú–/ÀæŒg§g2éÌjŸçL’^^›kŸ]Íö7ÅÊc“ßFµoTC|èœo=UuX£×sMôzц=Ù¥¡K.É€ÈH߉³"½"2-5jW+vl5‚ް\.'*p@0Ûu£±þ°YħbNù\NÍg‰•7=ôº ¨‡>”…@9´(ÂAP&»^þ7ú¹l13èøöP¸êúèØ[Ÿ¼l–øï×Ç}߃*>N¾åÚ^ @ ££Ý„¯úA‚»ÇCñ‰¶¨0ÀíP÷x0:Ù‘|Y4r;Ÿi‹^ïìùÛþo.DR?Ù¥2PXó×Îcn[¥‘l²Z %³QÀ÷»½¯Ý‹$o´ž8˜¸ŠÞjl­æÿ^¨g*Ÿ ÆþØÜI0#lÇÜåÆÐ­¶èó5ìz¾n‡bÓ‘î;ád½E…‡Ù$° GåT¤ö @e£÷a:ÜæÚ{'B]·Â±[¡žïWbÚI~õÚWi$^ùêýs;°¹rù›ÍPmd:¯£1º £וFFÀg %ó4ê£7ð%|sÁÍD«UA‚f8¡¡³:Óœof9K©ŠFèÍ;À• ð¡W)#_3Øü[Å q& / F:qÞ"ônéè§~ãIún1êüEjI¾m«Ý°Eß©£ÙŽ5Q›pi¿$¡«‰âÐ0Ðìì^€oÈ—0Z €R²²žÈ‚DOHÖJ#½h(ëátK€IN§(À¿NeÿìOåt‚"€£¨}ð:úQñÀn“"ŠF&—…¡’8QêœäÃhè(Jf¹(ñóˆIŒ!ôàj|:Á(óv¬ØyüOâË56ŠëŠãWB²´ÒH£««««ÝÑÎŽÖv0Äk¶Yl¯½Þ]ÛØ†Ý™]Û`°½†Gñ+±Á¥UJPhDEÊÃy 5ÁjšªBmUª6m>µŠš¨•ªVÔF^y)Øl¯gûŸñ¡‘?àb­¯ÖwÎ=gî½çÿ;Œ× tõw–žFò™†¹Ló‡âO-·(-*2Øji¢¡š hF1ê!S JË…ÒÍ 7)B\/æ÷-Èx‘(Zë§›[ó±5–°„ÆèWh„&¥Ÿ ¿p!ñË”⑜uÓõóè|;өƼžMWçì¸ šÄÕÜ£Êi)£Ý–˜…,¦ëÝ žª÷éͧc½%&ކŸ2T¤€Ð¹g v|.…7Y³`W}fÇo:‘?DÃAî[A=¬‚˜–kTEL<0ÎT‡Þ„ÏÕÔ ­x/ºúfªa&™x?Z‡W )Þ º´(ê"›XUþqÓMnzý­Ôº›©F7ÓàfZŠ™.½S`F-ÂÁ1œ’ÀtªeÞYw+YßÒöq[¢Û’HE—b°˜ôQ¥L£c›ïÅ*A8ù®–k›â¿ŠTe -$¨Á|á_n^kå»ÚRu·:šÀ`Wnol›!Õð½]Yö·øú™tS¾£i>û]Cm«äh;TSHÍo’4+Ñœ–¼Ë!$‚t âD‚HÉ>,ÿK}ngí艪•¸o›k£ñösã/ü|üÀ#lj¯iç÷üz÷ltƒ`@¤ü'íYHsFîŠà•™\zD(»ÐóÌôÎÑ‹Ù]ú?Ý>zp]Ü@Ï ý“Íï÷Ç–Ÿ12Ïœˆ¥«Ñ PõtSújvøRÿÀ…þAh÷ÇÙ¡O³‹/Ñ;xyûȵcïöë(Ìú[í[ñÔåÂ{€®g½™Wzþ¹mpÛÊŠ”œÑΡ ½Ãú‡/ïZr*Ë{‰lÇŽ À@#ÇZ¡@ ØoóNÞý_ÁÏÂBŸ¹Ü< Ü\nâè1ЋÅ¨x乨§¿g v² ÄKUßJ‘ÓžóÉô=»ûýé }²ÖâJ'äD9µU‰š¨Nt“NÞΣ)?UAÆÚ¶ ï‘©ž^w*K¾7jeMו€,èy%K‡ÈË‘)ÄÖDδ’ÉvrÒá¯l!oV™LÒï*D›zd4rªÆiDUØ”7»y%ê¥ð„²Ø$/ Ü£(FÈÑ‘¯H# ŽÃÞ«W Þ&FÉ…Á±Q–j”RˆB-È÷‡Èë{ |“?µE†–Cû`1ÍD°>Döö‘×v“ã£äƒäõÝ‹®‹ Gžófz…u÷##äùÈ 4]Âåf˘±›ç °™Ú¥.é°ùtóGbÉ ¦¨EA®•sYdˆb¦Yœ{$E7ŒKïo‰ê}"ÒR*¡æ,רþU+ÝTûbþçœÖ#U&õ à‡.%åš!”~®a,5ž hùLr6ºhȧëò™ÆéTlÁÏ¥+ÝŽf¦™‚—qU 0ŸIMMÍ”ˆ›vbÖ‰ä zéX.wºy;¶¥Ä¯  •IEB•~I¾cC>‡8æÓáÿx3k>ßet™ Ajà~1îS4„ÀXld ¿n” k&nÙÍŽ58³¸_:Õ°A¦Îù±µ8ßÑ’ÏÔÌÙáv|åÄ,Š+f ¿Ÿ&÷®soÐr!Йp¾£þ‹M5ùLË_cõ!©R¥hf¢2µ Â´\§­sL½Þ 5@-êýGõsi°þù§hõœÓôÅÆêٮ؂»Ñ–hµü>F‘¦âí}Ì/Z-m³%" á[°bÀTT„@§¦˜ê¾ Œ1¬Ë§£H‰ $…Ô ÒD²ËÿRŸÛ;z±5.…‚CK¯¶JÏ}kÿÏöîä8ñ5í{HÞéùŽ>¿Ê€îPù}ë7\ë€ò~²ýY¨ðÅìì ȤoÉÕv1*|‘¾Ö7p}ç³õ ¼\×â *Îgv\Ý>®+ŠŸRæ×ûÆÏ¶n5…WIÕ&.õ\ybørß®ëýC{îÃÕ— aÇÈ•£ÿè*׸B}Rjß­i¹Ñ;öIïè¿zGÿ²mèÝ®§Î´wnhûNUCYEP÷𦉰U|9;öÙŽ±Ï{ÿ4R £¡kÙÁ»42ÕÖ…²Qõµ‰‰ùÙÙûâºîý±Ç!÷¾õìåƒß“šÀ}>òb» §Óžðz¨4M|Ù&»È¾6 ‚ ¨ô™è²7žešÁ¤?»†Lvûž ãú£*’±9…É_aéNò£2ÙO^hW®«Ï2ªC@uKÓ’!rùv‘©Nrf#9ÛN~¼Åc“)2é“ £nr*MΦ|݇G#“dªË£ ÑD'7U RF¹RY¶ìHA÷ÁE “cÏ>0Üe‰ÝÙí?ç à ,ñÚ^rxH©\N!ÁBŠòß¡Qòâ.2Ôå{:úÛY8Ä h—.¤´(§ŒmŽ“Ã÷<Zt]/à1òÆø½˜1ÿ•ek3: ¡ë&£ÇV•Cæfl¨a­ë4.uUŸ±OT–VŸjˆ ¤V•¦À9º¡>F=í“€[M‡vjF¹0%Kå¶X¾³y1ÿùtÓ‡M kuÕPUÜP?¼4è ¶Ò«QRùix­›ÞýšNB¬ësÉÚ™t|Á‰,ØUn¦…r“:g àºÅì*‘w즜]?ŸŠ¸˜i'€%·SÝŦ0<#RhgX*Ë¥š\;ŽÉnGĵ€‡ùdô¥†`ÌbÆriy\$„*x±n¢›ó15 êŠPÏ'êî85®SûûhXÓ¶dpªHð”®\Uz'™sy'œÏD¦Ó͹dØu¢èàT$Ź÷¶G?¸µX¿m7Þ¶×ÌØu³d:òïTü—ëW¯Ö”eBñÒ~ˆixÀ›Ï9èWhN©ÒÛƒj-`qmõ=®ûÞ¬þ/ñeEzÇñ!000<< à 3Ìì²›WíZã[“lö%»Ñ¨ÙÌîN’æe_’xVÍ‹‰ÆxmõŽV«–Êqµ½ëµ4sJ¹£Ð+íÕ”ÒÂQŽr\¥”íUŒQO£gÄl’Ýí÷Ù\¥ÿäÀÓ4á!Ì3Ïó|Ïo~ßÏo5âœo dã¾éH°Ý…'•RbºÔbFéDÅó"ºH§ªÊÀ' Öà!š[uà3ÉuiðnÔŸ±!ÃDQQa“ û¬æ_î¼ÍÇü¹è–°ƒ‚ÜXW ¨ã}Ï¿=òlj§§‘ß½pèøÏ¿qÀ-R”žUºöfjàVz€þIzãfÏÜY)™Ú5|»³÷N÷ Œør¢wlG«[$è8NnüÕÞ…¢’Ò5šv½kd|K ÈD4åÞðÇ ‘îÉdïôÎý× Lõ4S]C·{µ”•é„8µÃU‘Øäy6%Ys"<„Q1¥,! Š:LÙM¥ÚnôŒÜL-{ 4r5Ý{„ÖÕy×îB´À8yüD¾ óósÿ‹"¹\vñ÷ñ#•Hâ  ªñ¿êåVæÅoÄ 4ÒÊàY¹êÙ$gâŒ(ÆQ§p$ðj1ES$(ŽzKH¦"šÇÊ¿´«^òhcªîD#w¾ýˬ;†EmîgfåiîÈ6%äÔ"ˆJG‰H·©D7r/µqç:¸±îM¼$³Œw°ñz„;³eåhP±¹×ãl3ßm”e^“u¸ßð5îGNH“ìc×OJ#ìÅ!î•aÀ@a¶A$'ûWâ^ä^Ø%ôµÊ¦Ž„/©i¨©éEƒ¡"ÍÔ‚S#óU®ÀHõ9ä€j¾€Fö s?)ÐÔi<9¼êƒâ¦27ØÀ™øÃþ…h c×ÎF½Ù姘é-+x¸Â€ÍºC,“i°¡¨²ªMXYdöT,*¢ÃÔ©Êk4âÔ®n©Éw6>hZ·4€ýåŽr‘Ç熙7Øû'Ó¯âtcýý¦@>^÷tóÏF«Úab>^•ïplô¬T,j"àmÅæ‚µ5o³Qï#,aÕÍÙ¾«.åNhn g¤;¨WÖHä‘U—†2–o&V=c…æbÕù¶ú÷õí.‡Â‹€!è-UÜø0ˆ¤pâUr‰‹J TÍY›ó;¿}†$âhÊ$T<¢2+_­ôÌǃXtÞøçÀ9±êùæ0oŠzÜ&xôëÅÆ½¦ðg±êO#Þ|kÝÝHb2m…ßÜ\YãÒ¾ÈME—Dœ& *%ªlRu QÀ~Èv@ O‰í4Þóy3ñúY»6ÛìÏ5mþpKU­*€‚qX¦¬ šìB“Á²Pê©Dd‘¢RkD”I‘"lWèØ&OÞaŸYfåaH€È(Hƒ@È„Øg5ÿrçm.îgžª,‡!9qšñ|ƒ}aøÅlj§¿9ööÈÑwF¾÷«¡×#4©±Z3¯wNu N%ûñÿJ×¾ËÉ>`É®ewÛ¥@‚qª÷jbÏíÃïØ©õ’Dª[’‹ -’jÈ¾ŠŠ‹­»{×md¼úJ`û¿’ýWR{A#w»'{†¾€F>íÞ?™· ÜêÞëYOef/C5¦j1‘"5ˆT¨$øÐñÝÊ<ú( `*­“u‡,¿×¼ërjàÊòÇáfzð*Ž#±gºk@ëF×Ðí{@_Œ‘Mtt.ÌÍ=†lváñõÜ\æs Éd@,vÜfžBdÞ-r¯uŒx‘FZ<+W°¹316'\þÌâä6[h¼‰;›“5¬[MÍDÃ(î4Öƒ̉’d7Z ‚7âO¼î/;¹‰ss(pgÛ¹ÑNn¸–÷ «aýJ·Š •1YÁ0 O4qc ²î|’;$k\9±YÄ΂I,n¬SØíÓ©`ȰKµ¨'Â|,ñãE÷üR42Ìý°@ ˜êôpFŠ»mÓí N—‰ KŠHœ*AâUê@Õ š0˜²SB«(IªÂàU©àPÄvs£ßæ^î/lfh饇þ -ØÀ~†CGž¨¨2i0HÆÞöÀªÉ7ûD} ÑÐrWõl´ .™onø¨Îk²“ð¦ù°Eh¢éd Á6§(”hÕFT‰C!ã*ç­ís–?Ý7)rQ†[Ø4p.ítešÞ\<ð»Õ>h"hšBÿ FJt· EhÁgA(¦*;tÉÐEh=^^öI= qk¾9p/²ñ¾Å¨æ¾¸XWqk¥º\" ¢ÂE£šYB£Œ”1§ª«ëiQºØøsmí& œ&²1oû2±$@ä`§ ±ÏjþåÎÛ…XÍB<ø·W’xÐT ¥kÿtäÄŠãÄSŽ ýf䨝GŽâ¢±l-¾:¤þ.&öþt^Jö^KÜL-éæË=®`'=CWÓ½“©¾éžÿHôÚì#D†Å ™~ß·õÑÎo¾µ5VWâô)Úï#7Òƒ§z'»ú§’½ ©kKÓÈtš‰Lï›L8T *š2š ¹PŽP”Šª“É«i«ËÝVá9¼)ô­êð¥ÄÀ­$âÓ÷ 0Õ¥ÔÞ{éÐÈõî¡KýÅÌÊÑÙÛw€4r¹ìÂÂ|.—{Œ"¯q`”—àtÄ#qc n"ΰáÜ"-<;ùE+7ÑÆKp£6÷S‹ÍŒŸ¸9nqç;¸S1057s:]aÍ`Ø-PÞ”¿Á¶¸·’̎ϵ=ñºÐ2cü]g Î>ÖZØF;·ßG+¥JÖ4b¥’©éÜac’sR+¼¡­œie 7a±ý%h´Â,ùöË<¶‰ì àOBBŠɲFÖh¬±ìXŽs!$!‰ï#ŽsÙžÃIÈå3 ¡±“€Ô•*ËVKlKYHXVÕnÿ Ýª«=ø‡¶[õTµR»l96H€ÍA‚“ØÓïY«j¥*Û¢%*Õz½L<ßû¾7Ïï÷{è•Î ñè½h(†ÎƒQD_ØFN'ð³g3ý¡8€}bC±{°O˜È¡è\‰Ò!&áHºBL(ÁÏAÌI2»¬@bÙÝbCÇ£èL& ΉÿÎF2×a¢xV—KÌÅLÝ®šjX-Ð ˆœÚø3&&š1nhÃ/õ%!%Y¡˱ÀŸR´ç‹“TI-úAÙ¶¿Ú iøXè3ÏèÖ‹¿ÂÎ4ËØÝJ: ¡Hlt" _!ú}•^`õÀÙYl#Õ .}ÚmÁ-yæÖÏ8Í=jEwŽÂ«{UÒµ¬SIÞ©Xvj’n}Êmx+8Ã2[™fu#;ó¨s;TKÙª–’µlÆQ–äL`#«xJkSœnÙU™tCÚ5·kô£åÛ 1ÈW>‘•/¥d’­Yä)-jSÓŸÖÖøª/]¶ßYµmùrwžn6ª©Ž\eP­º¢Ù±ÄèÒœ9í6>g i®f‘Õ®²šï©m*Y‹’jΑtäÐ{UÊ׋ ¶Ôef¸Ñ ÉÌ»ô«œYp[’Œyš±~l´½V\b—c•=€s¥Rç¢NIí,|`7ÎsÕóðj88ÛdΙ¦š4å€C6Ü0hŽ—¹Tà³"lnp"½“¥R™E!ïQç]7•Üj° ¼CàmÏ\š9N9/0&( r (( ˜/‡b_Vü^·I^ K¼T'¦r E>%·ÿ»›®ß²]Oyoà軃õ¿Úe¬%ñŽ"(ògÎæÏüáI_ä‰/ ¿í a”¯7ÉFÆ1Ìbx ²ò†¾ìêûuëÞ.e ŽpÒðäþ±¥gÁßûȻѾ÷”Ùq§=<HŒ²;#ÁF|hëRÞž€N0þÈ?_åTKÉB1±ü™Ó4Y©Rµ—ª°ü¨Šû9ã½Ñ´÷VGè®?>ˆOúǃ‰ÅîExܳo£çá±/‚mÄzê Lø£“ÞØn…‚Ä'#B©ÈI¯­ý«„¤3Ÿ¯î`IÓp®%)`ЏœF£^tõk6réåÙÈ(lF›Ð÷-è°4d„¤½ œuáð W±hE‹Å˜ãã’¾Ù†-b¬µ ‹/>..„Á@iF£­h°*»{G‘½’Þ¥"d¼S™˜P‘xÄ…âVt©È%kBc<žËü¦ÙÈ›-ØCFX.¶fE)‘A¢$‰Nfˆ?’ÀL£øa:õ ô_§ g®ç±`9›@§â[h<¸\•bB,“‚%R2:— €0WEEE´f—ÈëD±ôJHàd†ûÑÉzãÎç~t*„Îö­;. ™Ã Ã½™z·°š¼ÍËÁý¯éJΈwZˆ`Lo¼Ì³¶5Ö˜N²»gyÍj£e™±,0¶ »öúÒ¡Ò‚ã; Nî,ê;z-qøýW¯'Ž|¼vhó5ã?m‰Áû:ñÃçzâ2 M¢”Ê:J5ý÷©`l²}ß½®Ä¸'4ˆo–ÜóG&<¡‡ž÷=¡ñ[+xHÜÆ?÷…áΔ'<ïÏüƒýzmâ¼þI•,Y:>>ÝéNv¢”GÓÆ›$$q^ !‰/çk"œøÓHìØ±ãЊvS›Ò* @0ï“G[©š[Û[Ŧ­´{¨Ú$´v´Mi¬d0 %‰íý¿³4ia´b²"ýuúrwßë¾ó÷ÿÓ ú3w`ĵý¢³eÜérx&]-#¶m@©q§oÎö¾Ï5®LBûÏù®¹ZnÕ{nºƒ£ÿ¸;ô±Ý3ì€F|ŸÖ5ÞtÏ©šÿ{¸@ÍcšI@P_Ù=w¶<·$S$Çbȹ#ÃWc33 ‘ÿ¤H4AZž™ùÓþH8 ÉàŒD} jY¸ÇŠ,X#§‘ؾFÅ¥Œ`üDÚ¼ë=y(¬¢4 ¢3:i¦ö象^E*PÄŒNÁy8£&½ñ_Ó¯¢7jQo-êƒr9íËšEDáuaŒ„ãXVÏ0:‚£ÝóKx–•6KàJ–`g¨¢‰hÞ<‹¤ˆ"³ªÁq¿•çõ  |nMè ‘ýAª@Å>?õÆ4r@»z0xÿÑ­Q$Ònð4˜ælÊb­˜­5è%7zÍC/ ÐÆ“æiÓª?°Çÿ~ÚorT­è•FÎ 9^bIùBñŽ™jäNuδœÐHê·ý‡Œ¸jº-çc1Eá»U-º£äÅTÓ?å츚vcײ¥¢€u"»~2€ + þ Ø¯)œ©Î¡™E.ºe¬KùDǼˆhµiJ)øF-þ¤$Ou"¼R,É{zùÙPÇ9M Px'Ô …ómgÚ;RÏŒ‡ÖÈ/Ûwž‡hëìõíXÄ‹ô×ÂñUK²FÝÛ¯;ý£ ¾/ë·~áöÕ7Û½©ÊÂ`!ÂõÍÁQ'ÈÄä¸Öú³½é†½õrí– Šó@Aùs =+ÖnÊ|º,#})Ãæ`üךçÇ\¾QGóضöa‡çKÇœãu†ü –Øš†MÀ›É-/üÍå¿lõ¾]eß“[r4¿üÝg—íž[¡¿Ø¶¥ê9\µo¶m…q‚²@#7œ¾¡Æ`hU6PÄ(J/þöâÅx,‰éé©YÜ/Çb—~ÿ>fYƒ(±ˆë—S€@z­¨ÿ‘kÄŒÞPÑ13ëXÆHì"½°‚3.¡‰K #z¡l!ê¬D½›Ð©*tr#ê­£$Aî± *eÒà²v=EH_%êQÐñJ4 3Çì¢ÄJ˜1`œÁá'9œÎa`IšgfIlÝu[rÑÊQz¬G'­4zêÐéÚ$EIDª(’ÐÈi¦CË;6œè(6« ¨(šF ›ƒ öi&™+û'ù™´Ñc‚‡´£«•^ knÙëE¼”:GÛБ6t¸MS‡uiÅd]?êòÑœì~Ðî‚hƦk”9IhaÂî^¹,Z]³äOUgE`³…rÊ·ý‡Œ¸ZxÓœÿ/KÑXEî¤9?VWó¾–ׯ-¥•ý@ÀA$¢˜ÁGV2¼œ™>!—Æk ïš×Ĕ¨Rz[6Å”ì”OäqÌ‹ˆYŠfä¼{jÑͪ’|#NÇ,!¼‘ˆ¯û_¦ =ðÊ»í;Ï„^üª}×<ÒȹPç;ÚñBhç[/t¬I_$^d¹UDøØ\ƒ$n§Ù™bÀÙšª, øÌåŠh‰Ø;bóüÎâPÓiö2,‰q¬˜âÂ.H#‡Ïʶa·ÌÞtͶuÂøÄ5§F&>ÐLvØãh‚Z—ìÍ{ 6¬–Œ°Ö"Ïeb¼³ÎÅ™9¼ãîPªžÃhƒw¤Á såøÜé½nk†aïÊ5  <òá¥bѨ†Žè,Eb±Øì¸:Ð×O0 ‰@¿5õ)¨WA§6iQÐéG§‘7­”7½•O„U¦¹ˆÍÎ`Œ„%LNKc@ à,»”èsP؆ŽÛPĆúkQ™VïŠÔ¢HÕœí÷ÛQDAýô6ÐË[µèäfŽçx3«ËÀØ”É4W¢Ÿ8ÐQêÛŒ"u]Ðø Œú*Pd#:½½^AÍ3Kèú=­R¦˜µŒúa]jÙ†lДÀ‹'²n™æôîV´?p"Üö Pø©Xš.j8ª5Bu¡)¥;!„p¾µGÚùn+”%³Ьò5B;õQ¼æE‡B¸t5'ðšFôïÄ- ‘õ3rî׊i~idª:4rW)ýMþªKk‡7Ü–Ë®W f¯¶eHð‹äoôx X¸6 †QÖÞ–×ÅkJ€awÍùÑêõ)ŸÈã˜UЦåœiJ÷’ÀbCfxQÄÙëj‚l~>ØGÐȹ`¤õ³¡y£‘ Ûwý¼@ÒŽ:óâ⬕/Bj[Äâ÷ë=_¹ZGìžQ§g¤ÁwÕéu¤ˆ".Š+ 68[†ìžNÿ{'f,æ%H¬„ç!0rØÙÒˆH§Àâ5,ùYUÝ[Ó¸;pÝå­oræÔˆ½åSg ¤ø1—w¢ÁÅåÛ_–Mx²Däa7a0“Îq˜eê—.Ÿ´Söœž« ž1—Ê_8½vï°Ëw¬¸³&,>ÏLMÅè_4ûIü‹wíÙ+ÂWG$è¥2Ô/£^ˆõYh|„Yõ¸ŒT4hAÔS‹Û˜Ý5úç³¹•É€‡ËI,/qI4 ‚€Y=#§£@±þ`=ŠØÑ›vê~¨n³}Ð x° õ©èH%ê3£Ý ¼½̧ñðŒ®Ñ3ÉbšŒLÃêÞ<´£uËèD :aE‡-¨ßšÔP¤O£<ÞGG²ï£U[EêIù¢4Ï, vÇ·9=Á -Å?@#ûÁmT NÔ°‘„G^¨¢ÃpÕ¯!nn£ç»üÔ‡Ú’uk>I”g5Òý)BåÇ:’}~Ô`³Òá%„ßìS¼~¼â™¸RUrcÊzÐȽj H^Ê·ý‡Œ¸šS‹'Íìé|&Ö8F!Cè²ü¤^·ˆXa¢‹±`àX“Dî)…q%gF^sO]Sá;·`ºÚ4S=oôõ8RQ¥ðž²^¡)KÑO×­±vr,ŠMϘñâ®_oßõvðU@ȹPç¹³_÷±MœwÀ)R¤H–NÝé,¿( Á¡ £¼„„¼’ ò‚cŸ Žíø%¤!Äö›Ķ®ä… Z ¼w…Së4­jµ®@Ó¦Nýoë´iR¥²’2ZV6–Ûû= «´t¡Šd!ÅúɺÜéîžçñ“çûyT™¤óÕˆj'ªH×{»{Ý¥Õz*B× y&{Ç=a¦‘feÌfñ*i׸bħ”KZ‹ —!'åòä³£‘[×NÉ•cµ59†ù–ÍKF"‰` ’Q5<†Ñ6€‹Ä+$¬U`­)è ½*)WNYB¶ŠE,Ö<+i­š‘×MÙÖÂ÷¿¬uÏæ‹ÀîJ(uÂ{?ˆv_íìy7Ö}9Ö{eWwÚ1ÿºí~{×¾_îÙÿë]=¿êì=Ôd»Q´âî5ãžð¸—Åß„'4ܼåMOªá;æW>y‚ÃM¡[žàí–Î?xvŒ{BþÈX 2äj‡óÃȧ͑ë .Gp™É4ä Þó?ó*c^å¯s·ÿ¶'ÚùÒþ›7ݼºÉ£å€eâÿÞÕ:Ù²÷cgÛΕ%’D Æ[—¤kîzƒ7ýL# Dh*häŽ'ôIclÃ$ì²mV#IöI<I"13{®6nuRÂCÁŽ õ{Ð3 â‹`†- ¬°GÜ‚]è‚ ÛŠ¨_f)w£uYí…‚5GZI©Ž)6ò<¥ª‡(”egžv¢·lè€dn@d_23ÞÀã ºèÊ<½æµZ´·*ëÅ2Þ²BWb2.Õ¶•3j´DcäE*éˆ gèêR52K‘Aµï³‰ÛÒ¦‘s³CgC>B3ad4’P°|ƒG_Óã˜j Á‰ÿg€>E%ïTdl7³ Süþ‚„‰„Ùd ¢ÈÙ$ªç)°Ö7j„ÕùâÆ¢Œ–z¶£ùБ{û‰È·ÔH_‰fb,Ñxë€BË ì{h|M>h䪑[åTC)h$e/Iû²?ßt°•|ÙPñIU¥†fÁä2ñ‚cQU %¢ˆ 'Ë´ÂȦš„µìŸ¶ŠÖª)Ëú¤u}Ê^ ]ž´§½‹õ¬TR®ž±Ý—W',…Ór]‰Q„ýUG˜¾Þ¹¼óåk{^y§³ëýΞb½ïw>3 ¹Ûÿv¬ë{z¯G»ÁTo„÷²,`ÇHZ—­œhR@#ŸzÚ>÷uÜö+Ã>%müu·ßñG<íÌžà¨'ôйլ yۡƼÁ¿ûÂwÜmwüá?;ü°¶‚Fòr¶MxÃ7|¡Ñ@dÂ3÷óþð?Ü;Füʈ¿ãò&†Jå¹ú»è0¼Ú¹Öà––õ9KÒ5÷¼!¦¿j ‚ÐX§ØåJT„Œq9ÓÓ™™é'Qkö“L$ì6;ÐnÁz ú± Bð9Ñ'Š,ìÏ…JUˆø³ftÉ‹ú›Ðq7Úg'®âÜB£NOðæ £ ­Æ<á Á,š4D—AtÊŒ~ Ji(™JËÆ¨8Ĩäy5Ç(Øh^%ç’D©l™¬©˜ôÈ~#9RI3ÒR#ÍV=‡KÈa=0⪣÷TG°EäXeäùñ\ÐÇ¡%ý¥d]±ÀÉå¼,l+/šv÷§ñ’nªÈd§—ìh&ë-òµ|Qb ÒUɉx*ì¼CdX•¤£åŒœá8‰åHKV9–eÉ‹(E éE6ÇŒ4â"Û¡#O¼J­ˆXf>/"ßk5ÐÈãðz;×42Y’ê×åL•å=(ʾQõi¦f`ùÏõZâg5iÍÏý{ñŠ ¾ X^€aµšˆü2æt|§Ï”i†ìIª‘ìáôe¬ kÄ–³êL[4ò±¯kØ×93À@å„·ýü†wŽ7m¼èëüÃ[[y6}Ô¢BKÇqß–ÍåæúÜâò×3{jÖbÆKžöß´užoé:×´S£€ÿE#aÿd(ãX=‚U¥µxn›w¬®»f:ì ³#‚¹msß6;½þËZ' pEoéÐ6%gV&.ÉP(0Œšc‰B…ÅÈEáZuÃÃú¶;VÇheý-Ë ëà‡Û¦$ÿÂìøD¿&–áDNH䙿T7Ü´y3\"HσkWmž+åu—KkŽVìÒäïL˽T´r£ZÝaà¾! ‘ñÏ;[‘¢Rã-Œe˜%êØ'~ÿd`ŠRäG™ „ÿü8È2,(B5’¢$ý&2¤# ¤ßøT#ý³ÖUO ›q{EŒB¾HàÃÅ㽑ey‘æq\–2úÒUJv™¢ö­%ûW“A ¬¡4:d ûJÈ¥dhöºü`>,$C0Iy¿˜®":ÒWy~ü§Fð  r{žÀ1¬ÀЭÅ0`»ÃE Ñë¡ ÙÕB¶¹Éî&²ÝI¶9ÉÞ…év‰ÙËyè›áXI Òx}Ÿ´ºBæ1<ÕÈüÆMO¤9›Én8Ç=ízvQ‡Pmµ+)†å9ŽÑÅÅÁ!aŠ<*Ëx¢Âé5:‘æ×§ ™ACN°|E@·â±6çQ¶8˜í7ä„/ŽÄuáê"_ð˘Ã1©Ïx¢ÕøCß%øö³ü¬‘Qp~§…¯&Z×uÁÓ>Òöö9_ÕÈ4IRA'2àÄ÷ë\=u®"CoUýˆcÓ™·º)E|íØz6/HRÊü«4y˜kسBÀŒ¹ØÚ=Ýy‘äR3ÝAhäLKgQ¼a¡ˆ„?WÛ¡4ñ ‹ö¦%2yª‘ZZ42f²Y]£6×ïVU°àyAɉj†‘s¨ŠˆÙW±miê=“s¼Æ~ÓâÀYk!VÅ *I¡^™M6ØBŒi¢Ù霉FÞóÞ&Š¢ ~¤È, ̦ʼnSúìS$´ÞRŠÌ®ЧûËRkS—¥=ѦMiÓ‚ºô pR® èR'K“”$?ļÒê3‚†¬ˆü2æt|«ÓàÇ2¥Õõéßë2ÿQšŸ¬äЇž_*ª~½®ó¼7¤oûðô)B1ÐÒy¹íí“îæÔ\ ï [—µrdýVxãrK×Hk7¬rnCO}öªE’Šçøä¸„Óz0Nñv|ÚÒý‘w 81cœmí¡È”’¥ =WÁ°#Æ5÷Ì.Hí}v¬Ö)Œ"VZø©ñ–É~Ûæ­u^)©‚D8ŽÃSˆ$µ¨€Ó@)Vt1óºÓ þø‹úïÞh¹QSÿ¥ÍK¸av¼(ÿ×&ç絎¯­M·¬£ÐN­‡çFâ¢xf'âQ«Ya1'q"ø‰Þ r–SJŒ$Hh*E4+7Í_ü¹µuÜâ@Ø"[Päÿ ‘ÒWAGðxü@-Báþ› žiäÁ7÷q ¸Q"Ç ¹±”ƒ¥¤}ßêûºÙÔÈ19 'žLÙßj|·ãX1Zú™X &¾\Ò«£68ª'CpB9X@ŠÉÑ r¸‚:M˜é×ÏZ=(æH½Rhä0,TOEäùñ\ †J…"'h¤â•Xò˵3Ô5€‡ìn&ï5=mt{ÀGözÉ–Ù<+gT*•¬NKÞuÒÁ{›É¾&œ"Øô,OŸÕÈ6Ùã%;À lÔ6Ó­‡†‹l·3¦ž¡o/;úz’_Ot˜"ØÿñÇ9²Ì€.+¨Ï„4ôˆæ‘Nó,)£ƒå9ÁŠÜ ÖJÿ¡,}R§‰xÁ/cNÇ?Ù¯Ø&î;à )R$KÖé¯ÓéNgÙŽ¡"[Fy8OBã»3q?i‰çر mY !¥eZxÖð !I¥i›ÖÂ(OM›º¢ncë¦iêÚ’%<â¤<ŠXQž¶÷ûÛcU‘ff!~:îîÿ»ãüÿ~^-¢dK^³¨PU› ©Ÿ—L6fúüÛ Ö/;Á$gCO ÀƯ·ìúE`Çæ•LÓXůÌ[6øþ¥—ßü¹¼íLËv¸ì`ëk¦%EdN&ƒfÞyeW‚[Úá\˜ôÝPÒó?j$1"¯y–ƒÏã½ù޽4’À¨-e¹nóŒ;ý‰p')ïGlžÍ›¬Ìâ™ü,íªE9Mßz±KWyz¥é¢ãj½÷úK¡û[!³48ä[ÎÀðã55f“ÿjóܱûFínϘÝÇó8Q(5<˲ Oq §$˲ŠbÔ˜UÁ>ÏÃv‘‚Ê¥™Ý”óâ_üÐg¢ $lóŽ;|OûùØôÈ1Ї'ggRäQÌÎÎüù£?qDl Ü ·> €=ô踉ä2`À—É¥j¯H²þDÚiàÌùÔbL±éœ>Ÿ_¨Å«T¨óTì¦Å>82n¡>ˆàuhÐHÚÐ „²i.uÔ—èJO &:)‘:¶6õüøZÁŸXƒŽ×dÁÛMèKF~˜|ôƒC¶’íþÔ 9l¤ï  ./:@?ò¡€EÁà…4GcŒ^®GÛÐ9$óVµ˜á¥‡ð| êÜDFˆmà:qÕ$M‘ ꆳ<ªÊ|«@#j6ý…³ñ¥uö_‰Ëaû i$"TÌ Ë'ÅŠ{†Ò/Ö•<*¦ŒåÓBå”°|Z\>)”}©/üRŸ?a(š SÞðóz¦kÂP‰ïĤ¢û†Â˜XÙñ0„"0 ˜ÝN÷©-;Ï:  ߟ@çZ;.…:A#[ fÈ8øn-ÍÉ=êugæí­úš KKŠ2²5fh>–21ó³`ûù¸".ø¶ÿ*ôúéпE‘¬F`v8÷½8¢^3YaùÑBìbܵB׿NDÑHj(B4bq9¿Êô°ÓÃî½fuÃv¸ö¥ÏmîÛ[ÂϰÝ=lsÝ´¹`dÚ¶Èw\ŸZ69Ü@ðÆÜÂã4âð wgqZ]cv8Ø[³0eÓŒcø<„ðΤ™bmÖÚìœ /ä†–è¶æ/ï*[óÓUµg ¶S††ß›'œ¡›ý0×(´êô€"‰zÚϧµ¨*›åX†“\¹rø™ŽÌ&4‰ƒv@%¼ÿ>y…0 a­h챆hBÐ/¡Þ¹ÓÈ@-ÑÎ ˜Ñ@:R—æ)Ññé+yžQkxF…)eºFI‰‹Ð:é@GëбtÔׂõ yÎú»ë3ê ŠhÀ€úבLµ=¾¡O#!bomv®0kY"ŠdÓ?n¸Fü_~ @ Æ÷µTtÉô†UC™Š· ˆŠAI¥1cY 4eÐM‰C¢b9Z_3•GE]Ê~^ÏtÁO#&–L‘ý¢ ¡ "TþdÙRÌ(Y–ÍÀ há¶çü; ÙA°Ÿ¬ Þp4o36ø«%sAùb^£¡Y6]™Ë©a•œðÎàTðI ø¡išã¸5yË`"PÄ™¶×ÏùÛ/¶W$;é£9ê„-ÔÖï©iàh:TPvÛâvÊý$RS§HvR9á(‡üü“C¾]ïºU×4n%€ >¨oên8äkå°Í‡|ÃáÜõÇmþQ›Ž`ó¹ÅÓSµn_Aå…Õæ_¬ öÏÀ9Þ[ÎÀ »üIƒ+l÷ [Ü×mÞ1;\ß{Íî…¹nXÝ#ÐRýfØ'dŠ?´p9Oùù¼¢«^€áíÀš¹|ùr‚ $429=Øÿ݇¿åYÀ âÅ–¥$šû×¢ÞÔ (’°>1géŸÖcFý&tr-4 £Õh nžÞnëjFŸ£Ð(i ÏgµZZÅbÌsXYHÏs¡ã5èméZ:—Ìœ=ôÓ€úͨGDǨτŽJ¤¥”óãëe ^:bâá—¯¤3X^—ºO¢‘}2ÑÀŒ±7. Âí  ½pL«r}¥F¥ž¯¤yžÇÕd°§í÷¡ž ˆF´,› lÀ zu#êò¢C-èPu·J¶Ÿ=2u·‹Õðj&ƒÅL&Ÿ[_…(„Àê*”ÌÙÐ8\ß #7-î«Vð*\sú‡ì2á¶ÝoÈÉ^ÂPgªÄ!kó}‡<îðÁaûc52Vï½çðƒ»þîp_³»î•~ d¸1x¦nl½îp‡­®q»gÌîµ4ÚÉ‘#¶fÐÎm»kÔÖd XXGÖØßsæÄ¾ç7)—5å4ŽØM)׊I»ix!.›’²}K9 S­ƒH„tHŠÔ(e ˜”cÅȺ’qÙ–tà}+F”,¯ü÷-!Ù&è‰!+•”+}°¶œR!ŠEß;½sÏgÑÎc]g¿ š»´TÀ~ÀPnŽ Îcyx™ËP•Hsƒ(ŸÃñZ«×æÕ–¯ý)žàǹÖ=›:>Šv òOZö‚RH$R»ÐšÂ»îPz”7`"gP#îCÞ øq­:dÈ**ô6]÷Öîàmwðª/|µfǽÚÈßý¡7¬å,eÐÒBuΟ+ëF·´À £ÞпÝÁ©Ö‡CnàÙ]up™<‘á@ìOU[¡kè¾Ð—žà-_ÃOQÇ ?xÃWÿemðf 4ä ÝÃù›[<áó«\Zµ¸’?­Ür/Ð:\SÇ‹ÊC@Ë‹îOÏ2#`žpù¼úƒ“§Faì‘ü_Äã“Éx¼¯÷0ǰ¼¢MÄ–“£Uä8Æ}zâC#ïU’£37ýû+ȉäù¥‹ôW’~äª%¿ð±•$º’óš´«‹t t@¸†EV­eøŒ^ƒHÞ©%ï§tT&'2mƒ—¸ä~;yËÁ°Ùy þ¯¶Eäàô§ÿTQ<1I_Œì ª–P†ÑQ¨ZµFä|CD†S#Tl.ÇcgbWéIO³Â |ö@„t7*®˜nÞC¤'Bvû±Ã@#¸®Ø<í„T–ñíý9c¬ÂŒa—Z_–”-%LFŒ?[Êay,[Ç$Ë„211©K“N Ä2žéj_\$%ý¸½8é°Ä1Ù’rZRŽÒ¸¢µgĸ¬O9 )giM“-èÛcÉø¨bÙ4"›KæQ|ÜiŽÛõìÅ#’qªu‰I‘  þ%¦„ÓÀ-W|Á[ÞÐ wý7|׻⟑Ý[‹–kU¶ÀdgõšVý£ºþVmdȬÅÉS*h¦âû&*r0þwGº?LL¤ ‘§C¾I2µÿÍŸ¥)Âã™ì¶’þjrìé„FBÌÜT=YNN¹IË U°œ¯YškÖqEœNPágÃRÊ ‚È‹¹TBD‡Úl6[Ì瘕šYGªÈ»éb’“®Ìóà%Ç{Nåò;Wq“OÁŽJÒ›94‘ ¤¼‰·ÛHÈż^À«TøÉã®÷D*ʱjQШñof-É#MnÒ×FzBäPŒŒ’Þy{úõà³Ýav©ªãD‘gßZ\_ù{U¨c!•bŒŽH%N«2åbLҔÜÄͬl™´›öôܬ|å¯wªH­·MJfð`Òa—M ET04ŸìË“N@½RZ{Œ8Ìæ8Da7¢“À[º¦G²ékÇ”ë E"nß¹ïÓÖ½—#í3¥‘Ë-{.ìü1žg[ ‘=6wªuZ* ]ªÑÜöF0‚= W}áLjÄò…üa}Ž.[ä޳‰êß»¼ÿ©ÞH€àÊUwýCôz zF®~]«Õ©XV–Šš¿xë¿òÖ ¹ë®y¦Z¹ëk¼hºç }åüË]ßb(™ÅÎ)]@… s1¯û[åöûžØ°'z½¦aØÛ|­:ô;Éw°tmÅ‚E¥*–Á€-¤Ô7¿ð܆À@ zÕ¹æ ¢uHý¢ûsNö0œ ßF Ë÷èþ:žÖH<žú¿G2 Àjßj¤³Œ«&ÇŸÌ}‡¢ı™›ª§\¤w#“¤±Ù©,;[G5,U³Z5§¡¬RCOsLÁ,•˜•eÒ°ó²¶-#ýUäDz…cÒ/gž/?Þw‘ees95LÂl*'=m3¦‘Þ(9$}-dŽ‘Cͳ\ÌÒy‹©Z“Íð¸•eX5ÚYá*²?ªœ Æàãû仑ôF¦Ÿ7FzUžï‹ Å£¡ªSú% ¹,ãÛûóNaÙ8!F0fŒ¼ û2eä9ÍßȆ1Ù4‘‘ §mr½mL.YgÈxÁ/(ÆœecƸݔ ã¨ÃøÈ®G’õ™1.—Œ;­àÀ–”Íö'z)IàMY¡È¤Ý˜”LpÎIHæ©ÖA $B:$Ej€2PÌ„lIÉ–¤½4µ¾¡È¼™ñF=gŒK¥O42!Û”¶8Œã’Í¯ÅÆä0ôxä‡Ǻ>ŠuB#ÃtUpº¥óW-o|Øþæ»»\KŠ5 §£ÂFË*üél´¼E.6u`}°áÒ QDÑH¬ Áúˆ3Í ÎÅì³a¯à)ÇÑ›¾Èõ´Fnú#ƒÞŒidؽ]³ý¯6³ŒŠÇ>©Õ¶ém×Ý;îni†"nx‚WÑk@EÕvÈd`Kt—Þ–Çã4 Ç2—6øî{ënyê‡|Ñ©Öÿ¾R³ã KîÕ6^©©Ûo´™´b&(¥ZQƒý™n(ÕçäKóåç犢À2,eñŸ5œr ™¯Ö³Vü¡¦np[+zuÃ]?èÜ D•ƒÜŸK›xÊŠ¼€}¾ï`Ïh*x(ñô‘HÄŸh¤÷çÝêÿr_ï1QewÀO² Éäæææfn.áDwm×Ç*@”¹sï,Â0  –ç ¬]PÔºiDÑí*Án›ÔfSmöî›&MÓ‚âw‰J•÷L¿gÄ´iäet²%¿sîÜ9¿ß=3sŸ«¥ÔDziÏš§Èi#4Ò®x­¥žÊðkÌa"¹àe\h(#øñ"ŽRE† ÓhÖrLz¨ÑR·ü:Gs¢PsÒFNd‘ßæ’.#éô8äL¦ïmðŽAw¦_it DZ,ËlO'Çj¼¦‘cU¤ÙAÚjH“Jš*IkuÂÞmþÛ¥€øVäÃ5lÃj—³[’IÃÏH‹Ó  Þ~ïr–Ê7ƒŸ/pøqŠ\ÀM},žï|~{_dLSuÄÌwCOLɺ'´“ƸÍqˆ)ú±3Nû,¦±>/ø-Å$€!ÅA 6a00Ƹ@÷Êp+‰3RüScÜ´9Á…©½š•tðŒ9Þm6@#S”% Ô$tŸZÇ€Dsž¤HPŠyªÄ=3Åcì 2­ SôùF-2¦@,9ÄõhD?¥DÏJ ¿øi84Âó|õmW„Kj=4òZ¸^{ø½cÏW5ûvoÎÚ±:%bÍnsîÕÏ«uXóÚ®_^ªm<_Ó<`à-\Q)B^ð +_«ÚwQ­O^±*ˆFø`–È+G—G‹¿k³XÊ}¥‘Q hKÑ×ÒÖ`7KÑŸe/KÖé‚ÊKÙ=KÙPnÉ@>õÒùŽQkÅ ¥ô’ =aÙsé™÷­%¬e÷ ÔÈm*Þ5b-ï·”åÛǶ9û-eÉ-®×¥%…j4¬(Ah,žÑÇÅf'.ñ¤`´lLpèѨ”-å@Èã"ç÷9erKZí÷±ië[ß·¾´ì@–¸HhýôÈ4Ü1 ~üG#³³3¸<$òZ- hI£tdP„tÈäT:éV¨F:¼§‘ž­¤QÑþ”m ]¤±n¹ÿŽH]ª[i·’Ž­ä”L:Œä @(›tBG䬙Óý‚IÞ«çÇí0X†&%>Ó`.XxR™åM! tѤ¾×TMŽT“ÕäÔ.Ò\EšìäX%9^CZ«ÉQŒ=iQé ©‚¾ŠsŽ;é9m¯_ÏÑ*ÒªéV ¼€ïªÀúlL˜5ýè»Ã´…Öéþ8ÑÖ f””9u*=Ñ-'c0.oü—DÛ®[‰wÉñãÆhŸü–ÂmNrɆ9³~Òå2aOônÙà6oš‘£^³¦$·’4$Ⱥ ª‘XwFâcI7i‚èâÜðŒ¢WèÖ™g•ä…ÖA O"=’"5 pÑi’Ë"Κè§c6`€)ú|£Øj…jdÊ”è’õr4®·eÕŠ åøC[‹ÐÐ!pâšóµµpɱ÷ÆîO/;êþ´ëð—jÝoö<£îù¢HÅR—ÕúÞª†+Õû¾ªj ~p6^Të¼¥‘>g#lsµö@oí‹;¯¨õç+÷¦¯Zp¸0–ù.k;À$w}§‘Û¶Ša[Y¯)'\ËkEÑeàrKî啨 ÔAk98qßRþ½­ øvK±(Ь†ýP+^Þœ9l+µ–ݶ.¸þPNñ˜Õþd[ÍÇß-e÷ó*žäÙŸZ£LjÕqÓ\t8v£iÙòÈ0QÄÃj„ Æç.ýɯ¢“¿VlVÇU°ØsбÚpnÉ£Â*Tu'§ävNñƒÇÛÞŸ[F‹ Ñà’ƒÅ úŸÌzà1÷_qyþæff m¬†E 5rdéÊ$gÐô¡£G#2{««~.‘Æ)„É_O>ÙHZ3IGȩ́À8›Ez0ÝLNo¦êè?ŒÔBˆü—æiԥΠßóà.ùLk‰ Ã4(Ú\Òì=±“…49æ—<Žz¦`Fs%µÒZEšÕù#-UóVi~yÆëkä¸ñn-ø®ŠŒÿ¸”:kŠõùí}‘á6§ÎH©MŠ;±z¹%TøHË„óš¥Zð[³TФ†p#ÞÿÆ;ž¾>qÉ|^ðÛÚ%qÚD]1)­sËñSJò·‰ºóºè›†¨WFoüÚçæHB{"ÇÌJ142¥Ä¸Ìñ.Sô¤¢"éqÂŒyã}äBë !’"5 @(flSìÍøob¾ÑÓÀSôùF-2ž™âÜ`˜7iÂ7*á™ ‰‹ZÄá)Ñ:Ó2.U ÞH#×Ô†?üüPß΃çÔ½Rä:üZuá˱ÔU¤z@‚¸^{àÆÎC×k^{ý…âzõ~ Aá?4r£z?Ê(JÚÊ ¬–rä–É2h³?Ì+Ê+»gµûJ#´†mê­Ì‚0†a´ZV?O6?°U ÑXËòí÷m´<Œa’®Ô¬PÜÄî}Žÿ³’7hÙ1f³ß.TZÿQú¤@É-ý§¥t(ß>fôjÄZ1j)Å‚ý–Ò~KÙ°µbØê¸muôÛÔd— ZÃ…êP §Ecy¥Ïòíw ʇ íý–bEhIVûÛ‚y½¦µ|u Ï ‚À³|avÞ´kî4ò%nÙ(ÐA‚È3,ù,“ôdS~ Úe €.‰âÄ[]µ{éÎ 'áŠlÒ-“ߥ“®Ò‘F:4pä,,”IN{¢#›t¤“ÎͤG&% u‘LOð9Þq´›¡>w%4Â3"˳¤:›szM#óÀPI[ ¥eVÓ—Z<ÿ)K<§Ñá9ˆ^m­!MäÄΗ编FªI›¼$ä…FY—9ýÿ@#Ýú˜Ò%b„ÆãýGŽþ ƒÙÃ8a)}~b4¢ß:ÑÿØÊð¡MÉ>/ø-Å´’0KÈ:—)Æýñ†¿mJT? åü‚Xþ•¡½÷]Šؘ¢Ÿšã\r´ïU'LQоÏ͆§é:wFòCcB¦HZ)é©QÊ@1 ‘+"¸V`–ð<LqÐçµÈÀÕ¹äõÓrü„”<7c·õWtëq§à¸`N[bH»TÛxÁÓÖ¯U¿¶ `Œ/í»¡À¸b ýµj…”•k)œû±roí^gãEµþ¢Zç-Š úœ´f ê|MÃ…Úý}jCŸóÀŽdc/2Šàn¤eÞɯx¡‘³_¦±MeWR¥J‘,==]]]ݧ÷d;2 Ã@6“­a'~6&‰ã8À4$qìØ± P4$N€¢N 4@é—Ù¤.S•i`’!0t>L?OÕöËŒÂ2{I™ÅîÿhçHcõŒÀ:z¾~ò9w;÷ü÷ÿ ªO3 ঻#ÉÑu2ªÐúéYg=Ãu „Џ}Ãî&´‡@R5}–Y&V¦¥kÚy »á¶Ç÷…÷©4…ÈÃ^ÿPMãÅúÀͺ୪ÆÿŸç< ÃÞ¦áºÆËž¦kõÁëÞÀ5·ï_nÿo+zªm>WÛx­vË­º¦ï–!oÃuOóUOó•Ú¦ëõÁáêFÜþi`§¼Ú¨œŒÅ“i$8OñÓe8‘²È.ü=õ²ûÊžhïWHïÕší¯a›¬ S•öû¥ÒêÒ Ñ*|’vÿTÚáì±? Š$Ð"a= ÐE›xö†¥ƒaÓ[ai_@¼?Ò.Io¤#h'€ä—-Òለy(yl#„iªfeÄ9ßs.‹?ù·£Òyבw×XtoõÂø†ågË‹|33Q(ÅÝ›"ÏáT§„*$¯—uªB:ƒR]¡*×i3OÛs¾^»2n®ÎùÚU0åÈ›pد:JR>Áç´)É£gá”Qx¿â'UÓÀœ¢«”™(!š:“­µ½·({Ü(þÆXüÀ™?^Qœˆ;‹â®¢QGqÜiÇËøº‚)£x0?—©ÂŽøB„B@„EptŽÐ:MtýhçÍ¡¸¹âî '±I~âeÊê9-öÈìS;¦ùÀXrkUÞ¥e 8!²ÆA#5…eÐñ?‡£'Ûº‚ÉRÁ©„K_p¨ ¹l —lšÎµ?´G?ÜÖ÷ÁÄÇ'}ÛºO·u Eýo‚|úÛw÷E¢À•Óáîdû wõ'€¨s²-z2Ò},Ò*Y]V”ÿveÕmohÄÓrÕÓrÁÓ”*ùÊÓ8Z× œhË+²È2RkÕ<Ù_yZ®yƒ·jÁ+ž–³›BŸyšöÌ[„jÀu-ÒÐÜÜ¡ºàÚÀíúà§1UãÑv©>Œû˜EàˆºÞU Ä&¦âßúé%Û/Æ<î:ž@ æøÖ®½•^̈¢pQzؾòŠÛwÙã»ân¾X—2¹ìiݨ \ÚÚ_¸ÔFÈ™¬Zu¤¨¦rQ±rŽê€ê­Ì” ʺòËÏ×G7†¿¨n8W×rݲñ¿h»àö›4™úF&ÿƒ‘G4255¹¡²’( DGe<õ²ûÊžh﯑ÞqÛò3q -D5©LHyO iõ?”…¤_µJG#Ò¡0_¿L#D3¡°ã:ÉÒ)Ëäš•° ®¡‘ŽëªE£ê2ÁO€ŠÅbá²2‡i¦œ×”íˆ FŽ$"ò¾¦äé( mórÊÍ„[Ù>7sÂQ3 R^Þ¿£MEc #÷^EÉ©Â\L€aÓ,¨6(>6ªê\S(•‰¬9ƒ+fM‘Ô4ì ÊÌ8˜”˜æk¦¿ÚsãÎò¸«l¼¢`Ô(ulìñµ¥÷%)ŸàsÚÓh„&Èù†¬KÄ™lK¥iïædÅ]åàP|Ç\ŰqGᘣ`²¢0æ,ÿ '‹²4à \à(ܹö0–Šd~¹hdÜY„T¼æÿµÙD!fZ4+ <Ðß¾ûTaW²T0°cï±¶ŽÓáîO¿÷m_šµÀb¶¸qCÑÛ@k,[€K‹(ºyºÂ~ׯ _P„ ‘Pg²ý†¢x¢úÃÑS‰}‘hOít„ýã„ìÏ-»ü= ‘‘𦻛#çj‡7…¾¬ñ½™—ɘ¢˜â±Ô-+XŸiš T„,BvdüÝí»Xëñø1øÛ›Ã)g†hõ!3. TpYõúªØdl"þd©t­Š@t4®¦^v_ÙMÐH­í?ì×}lçð“"Y²N§ÓéNwò9Š“%d #aäűㄼ±}\BbŒ“´¤q‚“sâd[»å…—2!  ­í¶j•èVÊ{×M›ÔiÿLHCê´u0Â[x+%ÀHbß¾#uüQ$ Bƒè—“}¾ç÷ÜËsÏïóä¥` (1¼ÁÄÇ(ÒwõÓˆCƺÉçlC k "‹· IbhNF,+`Ö&ËUQÀÔ-H4k6‡@&<Ï/ªXF wPã±<à b¬‡ï‰_#AJ[ϓ„זٖ“q­Œ¸ >½?npY§ÜV”¼i¥FI•qsŒŸË2M§È2ÃÐm´óüæô´Ù™?Í]º7+µÓbÀÜbƘ'Ò-)Ð=«nºKgÅ:AˆcÆiZ½2‰ºí ¿À§ŒGi„'cqà1†NÀüÃahñ­&sººæ¾Ë‘UìÓ ˆâÐUûŒ³0ê.ÑëœÍ2VN4þ‰`ÒIE°¤Âú‹ñ4 €Aö¸ì`[Äe·K2à‹°Ô$ÑPÖ!Šãq’q¸gðÃPÿïz·ý©wû‡½C&Ì!âÂtû/ˆ&2Qà‰x&PJ Í~ðævôxªg˱®~’î¡'ÓÈÑ^rÎèŠÆýíÐé‰e\Pvżx;.ú¦‘ëpÅÆÍ½ÐèbKè󆶟¯ª–$ QL¦ 2Oæm΂%Ãe‰òû5ž3ÞŽëÍ¡«~íܺMwšC“õ­Þ„ÿ³Ž«þfÂT<1šõ5lˆÌÎÏÇòF" Öy< ,©F ›ø²û2¾1Þ]MýÌkÊ4¤™c¥<õï"rÀvOúI˜â­v‚“ÝÔþ0u oÑî°¤Vq²ÄÐLú’%TgâÔH¬7æg&ÑF&#™iXC½Ñ‚ƒ©·»þ—vòį£ÑNªk½€— ZÖ°3;]w—E•¢„Oïs.û}w¡®Ø.­ªHc0=›dNbiZäDc²``·¦É,¶Í¨µWMÄYQkî®.¿TUõªÅ”Ì-þEþÒ¨«l¦6?ªGݶ¨»hÖe›qÚæÕÒh]Y¯îéãQAÁó†, M粨h¸iäS–Äþ^U1ë^9ë̸­÷cµUW‹fœùQ¥ü|Me6k4sfx‘”BÒI,1` -’¿hÁ8ÄÈyà²C#¸Rhf–T 8ã Ïÿ6ôÃßto9²§ €c}ÛŽk'ºú?èîÿ6¸ ðBì~“‹Œ§j¤9mæE,mÌ W$¥àȓ᭿ïÛN(Þo§œ-Ú.œ0|"A~(Ýï€Fš´‹¾Žk¾àåÄiäßþàåÆÀmׅƶsÚ¯7i—›´¿¼Òr°\ýÞw ë3²kÒ2ÔŒ¬¬pª^÷ycð†¯k’œpǤ8꺿ç³)”p6<£¸ì Ê W›c¸z÷Z=¢C#ÑHäkŠ|­‘UÕ5’(ÆBâËîËøæXClde#ª¶ÀòÂò,jì (¢Q{»HŒÆ@²/¶gg5Ž!j¼›ÑØ×<¢$ñIƤ,ó¢76QcabfD“ƒ%³ÌhÎ$rj5ÒNíÞLÚ⤋ÿ|F;ëYAHFUà ÃЈR>÷üh$ª8tÅŠ’w´hE¶Ñ¸ØbYÊŠI²Qddšc«$ætU©î©Ð×–¢XD••QWZéjåEgåŸK󿬱êõÕwkóu¥`N±ß­+¹§–Î’¶x¶Öšð |Êx”F’Y–ÁâG I6Òž” 1F¬S8†Ks³¢îÒY¥è®³UU'Í­€ß¬»l_NÏÑRl±‰&hˆæHb!ÁlG’¿hѱuÚ0Æp™ ÙI4R챤™pŸyVf¹{ôž õ_G´£½„Ÿ†·sG†þÍeÓ\šYÆI¶”ŒŠ¬„ó»ÖæÊÚ¶µ£Zp5|Ôõ£O´ÁS¡¡c¡ÁOª‘£ :íBž“ÝC‡{Ç|LƒxЂ@4‚ºÞ@A¿²±=QÕöü«Úu/¡ÅY_û­&mb}ëYoàNs貿s·ù’¿s²%4áïü¢1ð…·ýBK÷U ¤1p£94á \mÖίoÅg4O8žF–še¼¡xlÖÜ<=ÓH4ª?ôÌÏÏå.Ë¡4|›‘–žèšû2¿tB#F!iA#²5—Ú«Q#qW°­ö„büÐÈvD£`g!Êpu— F&“7-Î_BÛ×Cíí¦Æz¨}Ô°f(ÌÆ8Igc}%5¼™ðÀ›±tů‘€!à1rŒ—%G—eèu•3±’ý\ªì4­Øw夦`†äeŽf$ÑÀˆ©xó^7ó·Ý庚Ç™û¥3OW­ÔÂ{äêlºJÈñÀ]<]›7çʨ¶Yg~ÔUˆýÎŒ»xÊiŸ©s$üŸ2¥ Ëщˆ¢Àð¬Ad¥YÔ{Êsê]•ú•‡Têwê•:ˆ-v*ÿŸñþJê½u4·ØÂJ˜MM9Ôxm‹¿ú?:vuR»‚ôŠ N8žOÏʤö}Ÿí!Pî¤ÆÂÔž0e["˜ål#ËæeRãa¢üôvˆÚ"8Ù׿=Ì+%&Ž8Ç2Ÿ9 u·ýA¢çöǯjKçÖ¨bßž›"±(¯r†‘Ç@bd—™=Sm×ëQwþÚ¼¨Zü§õž e±L¯«ÐRAtOɬsùœ«h \©/ý[yá!ká§%•§ŽÓë)‡ã3‡m¢ªX_[Q–Ϲsæët­íŽò_öË-¶‰ìŒã#­É’¥ÑÑÑèèŒÎÈcË6 †„…@‚ãKlǹ’Œ/ å¢Äqh·+'¾$!A‚†„$ì>”Û êV»å©jWË.!ÜU¤ m)mÐö¡Ý]v)$\Z @ ÛÓo’Vâ}`•.£¿Ž>Ϝ˜ã3çÿû† ) ôx×Xù™ÔÀ©®þ¥‚ÑäÎ ½»OwžÙ ÈÑÁÙÞa`ƒ‘Þ¡Oã; >×5x¾{˜áDÏàñ"€Iާv‡±¶í>ßM@/:.49Ù50’êžÔ™'ŸCëßÁ €Ùzßíÿ&Òv3ûǦŸÝŠlt]W7ö?¨)žQ|‘\™`^;Üc e°›.yK—,‚»¢ ©$a uöç›vž*%{LG Wì/°˜ 6Œ0ø‡(Ùe3_ö9 1bHàÍ™WƒÙ8O#F"~Þ½kžFF»v¾(„|žø#Éç·½ÁgÛ5J‰÷‡\è>Û~aëйÎ]§}g“ýó¤úOuBNK¨¼è ÿ!h;×tå]·Ä)\D°PÒ]äü&kŠ}Ù2ÖÒ>ÖÔú\]‹v|מ¿í¸í¸Õ Ù>Þƒò@@tß6Ç®EÛAß6k‚û~sòZ$¶ kÙÖh͇ÿ z¸4ɪSÿ‡ˆ³Ùlf.Ô¼!¨i)XÌ}¼áåÐ'›´ò7›¸O6jÁÑ0÷Ë*nØÇõU¿šê©ÎÙÚ€%fÁLBD8¼@(¢)ÁðHeV+Ò‚ÒÜÜÁ.:õpƒmTñƒkɰY(áËWr{;4Ù“ÔÊÃÜÞ„Vóµ£O:ì~RWòw¿ B'¨ I¼€´ùQ¯[JùŸZåçêñêŠÇ¡šlЫ®«L+®)Å®†KÁß³AÏ“ ?ôÏ}3ÁòkUåv™è0/Ê3b(¢x±ˆÿR‘ì»Ð»ûd¢ï|Ï00ÉHªÿdÏÐÛß;ònj`CKjmC߆–£­Ý¿ïîé:Û;<šÜynëÐh×4<MRý¿è¸ó 3:'mÄ9,ù4¾` ¶msî²kÍ©G‘ÔƒhòþÆÖEÛž«Û›Þ½ÓØz·YÕM[àÎw-`¾mßGboºÝ»é¸ߎÆÇ£cÍí×›Ú@ E;nLn´-g” Q;lÔ™´šQ?C#éyɪðå–§0™AõRÈHÈ3±?M†´ˆPý+)^F¼Mæ‘vkY¥s±æþû~„ûÿ€Žt¾µGc¾©#Ä$ ’‰ÇúåVKß²Æ+ä™àðË£šsý;aî@J#¢})nœ;eJCš×ŒFfî©;pÜ­-Y˜Ü“¥ˆÂž$2`[òØ ÿE52é·YÎ:VMÔW¬yª”NK³$!wFqO)Žì¾,ª^^@ÀO)³"–¾IáëDï/]’®«tQƒŽtÀó(ìMÜÓߪ²Øz$cƒ„E›syºÍ¶x:TO×yêÌl¥`|‹ V*Á7nI¡½èÏdø¾N;˜¸ #+Âfðuè××Ù£¿ö> «aÇtÀ=YëQÃ.5äÿ¨¨ÀDx>7h‰…*‰<‚·ö0Q¦•µ"dB:ø‰ø¾%&ÖûîÖzÖ›(¡ð”!¦9F*¬ÿÒcŸ Ö”AKFŒH€†”ý/ûåÛÆq…á  @`1 ;˜Åî$%Q´˜Úªh‰7I$EK¾ˆ7ÉN¤Žƒ“º–u«œ¸µ%Y–Q£°;.¤‰Ó}kbGñMI_ }h¤è[Û§^6N¢@²uãöRA_übU/rDü †KîÌjæœÿ|ÇóÇlj©˜N¸ý©J1õI&É…ÇÆÖR –8/:|±°÷×1øœÁ-MÐÀCñ-©é`ÀW£›7U¹32ñ¸TðÞà™™Áñ»Ã“ fÇoŸœ~ÿÔù«/ˆwÖ3 2@¼#ÀºùæØÔ‘£¿6àÇ¿ª¢ Æw¾w®†ë ‘š0IFîŒNYÔÀŠºÍ–ïLlϹÖÜD²û|[v:þh‰gÆ“ÙWâ™cßl{.òTÿަ|ccw¨¡jÜ”ŽD¢Á@X˜Ê¨Í˜hj`ËtC”ãÂòzáŽÂÂ2ÝÅewqõ‹ÊòŒT*Ë««+Õ‘©ú•¿ŒQÁø¦âbÊ ÿ]ää§Ö©‚Vfù tœºž m¿<¢]Û0ùñà¶ Ú•ÚôK²eU‡}…¥ öp¼B6×zÂCLšáºmS/k×F«øQep²ž¥77 XßïUP.ûzf­Ôëºcª k"›¸âÒA¸ê¡–®[ä& ðŸÎåÓ•RºRL¸¥„Û‡j[.µWŠÈ&ê¤Ç#IP—ˆrCJ/')›º?çöeܾÄr)>_j]ÊG—K™{ñ*áæÌörýf¢ S-•Ú– = ’†¼&Õ™AüŒv L«‰°„ôÂâ” ¨À{† ¸†“›±–J¹k®7êbªbz%ջߊ†# ]ŠÙ#ˆn'*‘ÌÄ#èÀ1B€3¨ô\å¦C½žjúÛ¾ÌB9¹XÜ])´gëMð’¥X…J•²ÒÏõß§ÛÜR÷dSÙ"`(5[hx§nß^ì36Ç-wý°ÉO¤N†M <«o6×-”r¿íŒ°0“  Sâ}‹Fª:ô;\»Eù»ÃïLΟ½;:ù¸TpûÕóÀ‰;C*¨xïäÔ©Ò³§Î¡ A™bpîà…Ðñè!*ð-~zùpøììè`föäùuÐÈm…k„E>À$£S>&`JD ,è«öGÄäÀT©0ö2©ð†ð´‚0¼#•”©n‰£ÉõQ4† Ì*ðײäÿ|ŒÚB"ou‚fÄ]­¸k$²F#+Puÿñã8UDÁ6‡Ð Y‚ÚG-À?Õ åÉÕó‰”É=^‹"÷ÑK¢6‘d“viP»¸>x”À!ÔŒ1ò¼ÞèÔ`Ï4Md½¢>nÔ Ó"ŒDÚÐaíµa…—ÔûÕ!íJmž_7©”: )·œE ž¾ ´9LÛ« )“€‚Âg ô˜dÌ#YËg„lß#õ™dóçÅìgTÛÖÕBëJ)¹”ouË/5 ƒõ0IøN·.Ò¿éŒ#´A#\Ÿ°4-èz»W ©•br®·«ÇT…âÊL®ÔéŸs­ÿ.t~œŽao ¶ªKÌ$b‹F6–FnŒLÜ8qúîàn¿5vîÊ‹ƒ)HÅŠBCQ‡ŠO¼º2 ¼„ˆ:ÁË/`n?={rúݧ÷†{Ý{#gÁ05¹;:Í Žß™Dä ]BÉÂÀÔñGx-Þÿ?Rœ®É¨ çn±šÄ– »Üs Á(ÔFH¸é°N@·T¶£!C¢dÕ­,}E$|rWªXb"¹ÛR£ˆ7m ±dØH5±Xƒ ‰DØÌìrоƒ9z¤í‰;Ò¢I¡µ@^8ªxD•òË£F#‰kÕÙ~tT{ûûÚ¾Íz;=ˆX<ãà[W ldÚ´Wh׆«øqbíFŒ¯ }=id¾Ðé–ÛÝRb¡7æö¥¿8þE4Ìà‚š:ibÂ量jÿóô1îïäL Û”¢N’ñÎ\±…Ò-¥Wú²Šq·/5Ó¾3`è^—WT$Üaôxƒóe>ë–:*eðOÜ-µÿ)—t,GCÑä©>†P⹸+ìöw»}‰…r|µÔs0 và*ÚFÂ¥4 f ?¢è#>H4Ïöþ½§ëææËä„”`Ñ!j®}”4˜ž¥BÎ-wó‰ù|ÇH}x—àƒ0J›˜{unóÌ&bŸïß÷Ù³m»Ÿo°CÄs*Ô¸Tì¼_Ì<èM¸ÅÖ•¾·œ{Ú'U ©~–€Ðüà©ÿ.Ë·™ÏE¹ð1ª\‹™À úxÔ-¶/Ó÷R­AÄ>0†À°¸êÏX6ì~>ñI:fâ bàFX™Eì-©©ßïTÁ˜"ünŒLÎŒž­"ÁÄ:h<ðÑ蹻Ó7ONŽgLj'€¡ÃE6¼ópG÷¾HKØ@µÑ‰%‰NÅ33¯œ»=8„ÝR·O=£S˜¡6® à¤J#ð Ež>J[ Y¯<‘6Q.$’Š9†¼C'Ë‘wˆ^[\Ý¡4*e6X··±©7É76BJ}¤£u;ëЙ²NH”‡KK5ùŠF*Ë««5‘µ£‘F°9¢½SÚºž×~ZÖÞ.jë%í­^íçeígEíúªŸ<­½ñŠJiš¢-¢]Œl¼>¤]úŽš¤qa@»:†‹äìwµ±oéÏô°C=ÛŽÔ¦_^ûêê°vu@Èë#ÚåãÚ¥êøêк–ÞÜ4²PêZ.tÌ•¾öîºý™å|î/=¹±†–°^Çà”8œy,æµ…Ÿr?ó"Ý€'°lÁœ€ÎÿË~¹ÇFqÜq|ÿ²dé¤Õj4ZíjV÷ÐÝacó¶ûÞgc¾}œ1ॠæüÀ %ÂÆ6RÆD‘Ú´DûW1!`ÞÐHUõ¯Tý3m 4„„’”‚Á{l¿{¤¨j‰„ ¡²ö«ÕîÌÎÎÌogçûù‰mËlÇ}}IJ«‹•'Õ ©ûÌxÍJkuž—`šŠCd¼”{}ùÒz%ÜùžšRËOøŠ9–뢎9ÄIEÉCx§ÌZUe•fÜ7¡SF,âFŠƒŸ›5(` Ô8”kË𠜺À4J̺¥gÃáÅŒæ"ƒ±ƒ@yð¨^šcË¿QËA\°ò›+|f/@p8"È$WáçJdïÜãj˜ôu,x71ë¢×Õè±bÏ×Ë—¤µHʨšÀ˜ >ë?Ôêz¯2K°ÌQ`ÄE¥"ÂrÛÇÑ…w0ñxõúÂ’¦6T›ÏÖ®y¬N«kG—×_޽üÉšW¯6o»ÙÜv«qÛß›Ún6m›ô×–Ö«-­Ÿ5·~ÞÜz£ióÍÆÍ_5n¾ÕÔúEó³ÑÕ¦®¸§ügÏf"I3ö¸g¦ñHÒ*ÈGðç*”’0 ‹ŸÑP°_Ô#U„e{ûþnhÓ3¤‘œ¡.î0.Ú,,ná†Ú¹ÃíÖy(KG;,éÈvÚÉí¶jmÏÖvZ:’­v×[sVU(s Iï‡0µŠ¤xîÛø“J‹fô‰«eºoʈ˜ñ%˜‚Y¾½lññų¼’S$ItRÅ)(/e¹HÐxRh%w|DpœàÚ¦Q6Y1u?ô«P1%6¸¦S¢¬›è s‹Æ´åf¼dB/iÔyóçÀŸ‘ôIÌÎSI‘wå ×V„Aãªÿ^<˜Ö*Wy¬ !Äa' Ïl Í»§–kѤ fŒÀÚpOS ¹LdvÂÜTQ|ñ£rŸYçKj¥i£lÔÿ’Wdy• GÌ“ÁYÂÚ|v/VŽ LÅü™x¦?¥q‘ Kèd‘ <$X†,Z™©‹Ú%B>Š”á¤øCx¡¹Šz˜(- ´s[¯¹£ÕIhe%Vvô/ÛÝ"½&„&hˆæx ^…âµhü]4ò“ù… ¶D¦„¸À- SZè±J‚ú´ ¸nRLhq=i/Ìú\évc‚ˆ¤‹H·÷^éè6Œìì.œNôœììœJôhÙŒDüìýÑÒØHGÏåî½'»ö€:.%z{サÒ$O×·¢üdb÷Ù`‰³íÓî÷\ÇžÑÎ=tZg0Éù, 7nÂ'–©õû|•_4m½Ñ²íoM[¾´ÜsëŒ~ˆjØRY8[ˆ[V°õ¥M =Rfú¤qo¥<ŒÉ‚@d’W6ÿùÛc+¹_®%á!ˆ‹‹,±PáÙЈÅ!GÚ¸áíÜÛ îgÝÜO»¹áwh7ÜÅé²ÎG³gpÈ¡vî@w0Áîø¶,9ÒνÓ=ý~·Øk˜(»‰H&0ãU/Lh¡ŒE 8‡’Føn,0VëKi‘»jYJb.ôš?WUŒ”.üñ,‡ÙЉ^p(NIQ€’€Ö:Ëa•)Í÷O¸§ê3ãkÕáE ÌÕ²`‘*j‹»\)uŤ¾0£/ü¬º²X]à˜«â!2ØæxYÞ}­ÒŒWLiþF £•×ã÷e‰ˆ(.!ΩZˆÆü»Å…£â{Јջ#K#‹æ¥³Ãû_M¨ÁI-ÊJi¡‡™Fð¹/¼'Ô:·×…E†ij;öÂÓ/vö¿ß¹{Ú4’èEÛÓí½ ‘7_~%Ä*‚9¤Á†—»÷þ®{ߙξ“½—º÷î[µ/R§@›7¡í¥®Ñí»/ìÜw*1m z, 5¼6C#/–¾jIDò¼NI’R 8§Ò©ÿ¤‘L:Ì …õ±˜S–­ÝŽÑçï¹3z¬Þ3¸wWŠn‰âDz8¯;º™;ÒùÌhÄB‘îÀ6ÛÚ¥6—l—ÿÅ~ÇFqÝq)’%K–FO£ÑÓ<Íjw¬]»ØŽM øXï½^_žk1¸@‹š*Hx×6¨`°qÒTÀ8(½[¤HQ›ˆ64€sU(¢ý¿ý£­ª¨M£FBQƒÁ×3ý¾ ¡ùƒH^jÉ¡òòcô¼škwÞþ¾ŸÇÐÙÑnq>Yá •(¨j^I!#‘hé…nÇ‘/i˾îtF8¸™Œµ¥â64yièØ›Ï<ÿÆÈø…Çj"?'U”Áhêå¡ïÎdN\Í¿~ôÔ¯2ÇvGRÏ@eØç‡ûF¯¿ŸžW.eD#8ðžFp¶5<Œõá7öoðbMÄ3"º)˜;ðϹ«Œ1ZQ\wÏÀ€FÎ*­~ì®Õ}ë"@2ÈÖkÞRîË>M8÷„p.»b97$LÎg«ön©”Ä:"ÕR=qǃ©T<ù<áå—¡(¾B<ù)TP#Ù]>ŠhVJÎnh\Ô“#¼êm|™å¦£‹z0o%Ü׈ºFŠ@JÞêñ§žÓƒ·ŒŽOü8Òßݹ©÷móAž:É'$0þ_z¯3âš!‡3¦sÑâ@×îÊÖùñ­žžŠ_Å·$«ªø¯¾ä}~*"©=²ì+%+Œñ§Í‰¢™pÍ(ÏM;’·Â®Õ½£qO²Š¼VU&©Z•ƒFÌP$g&¸FL*qº¹žQÂ((¨Ì5çü>š5cŽÑ ®6µD©Æ, <ñ5>*omëv­àÁ)bàT±¢‡³BG¹qÌè‡ýɸ&ªXQÀ·/¤(‚Y§}:)Ùá—îôsïýáYæ-iäts#ŒqßÊë1^ØÍ•N–ài®úÄ[fšæ‘àà“Ø¥Ñ‰_fŽA#¯•«‚·FO^cFƯdO¼:r¼Uõq«*¥Œ1xqÿ‘מžøé#Ovõ£ˆ £Âb5 ¯ Á!ÄQÀ̇Ÿ}0@ ÷4‚{XÓÈCWÿØ{à+2O2Dé¾þBI Ÿ×^x³à8{¶ïô–.ctõcw­¾¨~>¨×! ÐdEå™Y1¼¦2‹£ûE/­•xÆU0d“ò)B¼²ÂeBùKæù ð(D?R˜úÙ>Ø¡ìë‚@£»±æåíE!Ï57ÍÝH™UoãËÕˆ@N-!òÁzØM÷}lm¾oÿ¤?åÚ=n:U(Å¥k%‹Fç춤k¶lÝ®ö!U둉âX–kTŸäõH•9³Ë1‚K÷4‚±?ûÕz$*Ø«„<8óF<4ÇÓΉM6ÕñgïW(Т)U¯„[toΊ/á°âà4âZq¨ –«€-Ÿî>ڨʤJ£^ãW“á7Š1 P饵¸"Îü`ñ}N#øoâ}aá+2ãØòe—¶«=ë–_aÈüZ×û—M¾6|üÍ‘“¯gŽ–«‚+Cc $0“Ÿ9ülfë«ù÷LäBëm¤*Z“Æ'¤ŒEŒVE°ÏåÓW3'Þ=ü4N Ê½.²¦‘ÿƒúౌ_&T–»ìÂ]8w5…8\#ÐÉ®®þ|éšF¾¬õ3Søñ Õ!¼T¾VT…óû„ó£+¦‘³CÂôˆðÂÁª§+kTJˆ¦(^Í«D6*¡flRZå¶&%ºÉÓõô§˜ÝÃÒ½òöq{ªòk½U™Ø%Œì-_#CÂØ·<ˆYh‡’# y³ÇyxÖžùþxÑN:vÄ5;\;ùO£÷BËúÍ ¹븹µÛMwçŒÈ-½}ŸÈNí^w{Ï[©x+”y%ŧªI!LñSéß[bn:4Ë5’š7“®^Ð;në‘o×øª% shFð;Ýâ÷í]WÅ@ Ü”VúrÛF×êÀ…3œ·#y3˜3PÝzÀ[M4‚Ÿ7bÉ'ûÅïT«sfOѯz_f-èÉœ•Ìëm®ÝŽÔ»ÔÖÐŤGàG›;þÃ~½ÇFqÜq 餕V£Ñh´«]íÞÉ67¾Øðãìóù|ÆÇ··{Ü 0Ä"RZT6~ðjªS$$J€%MضRÚ@x(@RUQ+úþ£õ´ii*©EǀϾÛ~çLR ©Ž¬º(‘:ϳóøízŸÑQ½é£Ó}¨)4]±¯/}ez*Í{±ÛÉÈĪÖëõ?Xï­¬›©F&Üå¾×üQg{ÐÖM*,A…NMj,`6eŠ0)×õ„eú«:þå4ú^âói$ÈM]¿§ÓáEW[?0~«¼ÚüÈoZ*ÿ”X|½#2–ŠN¸Í©‡F˸¡Š$—ÑþHÍå>Y߯ àsh¦*x«oèÜîá3ý{ ‘Ÿôí=³{øùíßjZX©â 6díÀ“©K* ÆXýW§z¾y~×ð•à Äù¾=Å…þ¡ïÜÿ¥F¾˜ñÞúÍ!Nå@ˆ®tö~Èß Ó,YÍB¶ÓANdÉIÔ>·i2жGNgf­¤žH“Sh8ä¤Gޝ&#ë䌯8rÒSY2’•^E·Œüþ»Åž#I2ê’QôqÈh†Œ¢ÿì­ç¡ ÜŽµ,f…¨Ý†Möo%G·ÍšFo#G¡‘^òÒ 9Ð#Óß<È‘AI`ü˜¶Ç Å¿Ü*{ÊnÛäbŽÎ|Þ#ۦ𤚚‘ ™~º}Ò­ó×ø«Ô¦tË„¬Œmh,0#ŒÒ)K5],è“%öwªÃ/ÖÔx´z[iY)× •ËŠ¯ë!.â ñù&ý^µøËcMéĤƒºÙ2žjžtc/6îÁ0m ‹RªØ†mQÁM#Ę-ä9t! ÌTõÀSUAß‹ÞJ5L¦ê éØT2âg¸üc§uUžUœZÜd†ÂŒrF}·ÕO7ú«¢ÀÒ¸s"9·ýPuXjÀÒ¨¡Ïǧ°LÎß×;õãéøíN¬§mMEy¥Æ¸P8…ˆxPš„‡„ ñFî:·•£õëlÖ ”®ð"L1‘M|ð´&1v3Õž)1&ˆÁtÜs¬JØe”ý²µ© µG5T“Îò§*ËUSÖ8fra¸˜@á6§ìt¤|ò3ÑIy .ÄåCiòðE18¶ŒcûHR„ -HÎášjS¨Š!,®—j†.ŠBc^’ n™!&±lrz5Ë9-à ¼7çÞ}1á5ä¡A·­ŠÃKËdÆÿÞÑ„ª u!!Ùªº×ž9»}/Dqy`f$@\Hö"Ð>ß?\Ø9|fphS2ÛT6dªä=mYP¹oU÷Ù¢v.ÊÎoR{ÉçЈ­è\ßž7ví»Ô¿ÑÓî¹IñÚx»síµ'zÿ±~óŸ»·|¸~îËî—ñÀø[w¯©ªešÆ([»¦kªàç y2ÿ©Fòù¢P¦¦2é´  µ¸%Ç‹$Púá.9áý0Kq¼h‘Nòƒ¬tÈñÚrÚ•êÀD']9שŒlÀ'¯+Ù8½ºØ†R<ÉHfîyð?×È©u|Ei)g¨.š0ÈÐFrdËìi¤Wººxq€ÛI^Àg¿4Æ1¤Ÿ”‘±]úäðvr¨Ÿ<ßGž${6ÎÿZ2°¡ƒìè&{f<ïQ գ볥!ÃO¯˜xx4â»u(èùlÇo›ªË4›LCgšX@M]è*J³ΧL€›WfØ¥Lç* 'ŽwÝr'Ù8á6åœúœ“XÒƒ‚Û€á¥Ü`š…Œ9ñSµ7R‘¼×ðL¢xy‰5á…Œ–3­†Š0׫™]ÃÙïâ˰ǻ^t<Ù<é5Ov®ˆjy¶²Cœ¡F[aaRª é,È!VÂTed`‘öÁÊ„Ÿ]Yð¢w:—Ž»‰Í%Fã¶Æ¨Í…jX&£ïÄën$ko¹ ¾[?†¹œÖ³ µ@˜jan,a´šSl|¢—éü×ñúñ”tËM7†Kp!.Ç  Êa…Ü26Ží# H‚´ 9Ǫ*K8D&,†žÜä åÞ0eûAÁh¨¡¡ü4Ö8–Œ¥ï¦"sþà}¦FÜxˆM5‚a\^'5¢ë×64&Îí¾°ûYwô™ªà|ßXâR‘—>ùõò®ýzžÆ7çwì{sÇ·Ïトô>óNÿ={ íK;†Ó>™Q`7÷^Ù1ŒövÊÁ!“ÍËÿUB‡F®t®¹†z÷ø–÷7ô\_¿eÎËî—ñÀx¿»×b¬£ÐÓé "ññŒ|¢‘|~ÝÚ.þ©F^JßÓÈHÑR#ÞljäûY9ìq—¼œ&»£Ê“K´gA‘ÇÉH’œö䤯tHzEu’‘.r|5y%C^M“W=2 ¢`y_@$¡‘—âÕˆc%4²ë rxÓ¬iäh?yn9~ôÏ;ÐKl’2Ùÿ 2Ð=k—²1«vuðd‹–¨g‘GYm¥(±¤UnQ—•£ð„Šm[äé¯ÏxÞ#˜zÀ/2 [§¼†+N[Îû¿{ÛVäR5~¦å¯+b5Ó©Z‚7$cª` žn M¾3CŒÙ*\(†¦p¥¡DA 7¸TmâêþªêÛn¼nõݨï6Ok$'©Ó|ÇL¤âÿìhÛ5?AÍàœ…$J¡ £¥,6é´ßLE}¯!—ŒŒ%ǜȸ)¸‘‚·bƒm™RÑÓ,•|/~ǩɹ‘œÛ0éÕû^]!Õr´ªBh=á Ë5,MÐ_Ä—úéZ¹ ·)ï¡óµ ë 6›¥v)ŒU˜F ×PßmÉ$Q¦²r®[ÂR¹(lwEÅõ­~f9–‡y¿º@·¥tÁTIÝ1õW1iž)§}n{ØËµ•­‹tà†Ã œÍ5äÓ¤¢;\1•Z>µ*æ{IB^âÖár ‚¡0 †ÅàØ26Ží# H‚´ 9ÏU…K¸ â­(C˜©ØYâ¡Sþ§3EàÝXÃÝTlÜmºíEçüÁ»ÿ9tòÿf¿Þb£¸Î8€ÉÒJ+FG££Ñ^´k.`sñÚ{õú޽;{±‚ ؆5¾Aic0¥”8MÕ".©i”V"„JŒ•Ж‡ª­úX©jÓ‹Ô4A•BÀÆ»ÞéÿìÒJixÀ­çÕ÷0ÚÝóËÌœïwŒHά³øœžÕƒóFìÑò‡!tgm+Ãà(×ÈI€x{àÈÕþÀ¸ž>üþ¾ã“Lí;~¥çÀÏÒ‡&÷¹ÔýÍ·F®<1Ñð¸>0ZàÄÿ£‘B×S¼í›ƒ# ÈÔб]FA#”JS-›ÿÖ¹ëã®Þ¿nKøD#_ÕøCG7ölLaVÒC2vΞËÚÿõÉÙ{ÓiF×È©fá\;/ðÀkyàz¢}ѪêÅç âLʱmƒ=åñZíú#ÂK–pþyab‹0QðÆFábR8ß.œ³8EÎçã@bäݲä<ørã|‹páëÒ³k=2*6O&ìíÆ{M#/Ã!ý«C·»•à*‡W‘ÜŠäR°›!Pò €WYDEæ9´E‘i%Ó|D.z&¾à~_éN¥ÁFy­Y¡HŸ´ÖÍšÁ%ßÞ3ìöðl"ôÛÆX¢„)¢C!ÄCÙ2Ô|, B‘¨,A>|/‘ø•ʪÊ÷2Å+*TdÎýežÙdCVætÎi‘™dˆ'·Â³Vd>¶­¦ý+ÜNÉ Š2Fæ.DMº°f…j¾&ÉjýY3:k†§õ@6˜7›:ŠA$·ª°R‰z cÔ+Q§ÝÖ”ËWóûÉêŒ^e[Õ9=>¾º #¤(_2î;Éû‚ü*°Û"³zxάÉÂ$máÏ‘3ëWù]8Á¿Ì(gƒÇC[Y–$M–¡&BјJ£e¾&b6Tˆnñ3?~`$˜ Bs¹eòëš*»-š¨¬ð}£jn±êö» u1‚ñkèF"Οl(Ÿ3b#p“µêy“¶(š# R!¡'?rLÇô±X ,–‹óòšµ+ùÀc¬\-S™OÒ4¢<2œŒÊŒ94tï¼Ũâ¶Ì}õ´ Xfôð¼Qk›±ûžPF¯y=°»:U¡Ã­©wúCÐÈdÞ ŠkûÇ.õ¸1xô½¡±ÉôákéCo§N]î;t­ÿN Œ$øþÍôÁËC*ÐR0 ,ñŸ,,F¯3}Ü!HË5x´#T‹Õ /×-³óï]Ý·»zþ²u÷?:—¾ì>‰GÆï;º]Œ¿›D"]]2Y‘ùÏK$—ƒFNŒwáí”øqN‹ g¬‡™°¸F~ÔÎy°XUõBÈüãç…VQ•plt¹}^IR|TÚX& 6 ?èä¿Â!ˆ7ЪY8Û$\håC:×*œK—ÚK á|ʹ-¨ñ¥‚ââØ•Æ{M#§v ¯äMòÒnêR½¢TBd‘ñʤê’ÿ-B±ç»TU8Ù-ÙÁŠQ%ù>)Úi-¸ßqt½GªÝà’™‹(*ý±±&¿.ýÿ8q'Q“MÆí¶wC«ü_ÓxQÖœüèÆ…1¼\¨¿^hEeЀLèSšô´JήöÚ¶SÑÙddNå¬XÆŒÝK†f’ÕY=˜Ó«ñ½ 6¤êzUI"²D)²1É9KJ\äÆhΊçŒà}#2oÄ>K„æõàœ^™ÑÓÉx[‰KR(.ÊzfuÌM¶4d“$gĦ“ §*ÖhQ”¸™Ì$Qe¢JnÆBv[ÝL2>¯×ÛFt&µQÖ­úë¡u]¢&;1…ª¢¦¦È¸dLvi"hFáÙK!Müy`Õ'‰H`uÍÅšˆ¿É×KS4™ü2Re›u™D¶Mˆ´ ¢9:AWèÝ¢s, Çò‘¤ AZ0ñÇ {ö˜Ó6æÈ»ë´üÆž‰!ÆœÖ1§åkC9säQ»ù³R'¼‡¡Ÿ¾x¿Ïˆl›cQ DdÉ9é-¨IÁɧѳýõ»®÷¿×¸õýZËÁŪàVë!J‘Æ}×÷l¼éY8°ÀÃŒ^/qšäuðÍññzKbJ@,¿Ü°÷¿ ÁpÜŒ.BWw¼ÒÒ~#tñn3…ÍÕ݇ìi«Î'& ü§5Á‰-ã›ê?ݼã¥F^ظ^\ÁÐó itïŒD¢3Z4º°ðÌ!QúŠÄî´Ž£Ç8=“ 9†%mnÒ¿‘œCÑWȰJPËéÛ¥ªª#UdÀK.xÉ`9¯R] l"ÇÄ$÷긽žÓ™b’Ob F=ØmLaYÖ ‹Ëàâj­äXéÇddÚpÙyðœc°˜ôûÉžRÁÀ@#,Ãé*ò—R# EGé ’ž iÛJ¾NN„ȉ&ÒÑHº›é=®]±· îO6“ãr¼ž†Š"HÞj¥=,vÜŽzr*hض‘gécdt½kR"˽·/¢ (™3rަÚ"¢#ªhŠ0Ðë‚”‰lhŠgAuÏKV mVò,Hš ا)Ƀü`è9š('>Œæ¸¢!šÇ:Ù€'´[Ù…%OÄ–$ ˜-Ò‚äh>˸h¨˜¾¾¨d ӯ̖Ý_ J††iûòÇ‘4Õù Gyݲÿð¾ V‘ñõÙŸÆ4òÔ[¨&Q‹ð<ŸÂ.µ¶ÿªõÐõæöÑEzàY\ ¶!nî|óRhß¶ÂäxÝÆ \bL(0 ÄððxrªbÛ3\ îGÀ!߀"Pärh?u³‰Êª¹Ü»’°Y˜X>Å$ܯ NT&ªêÿZx©‘6F‹ÊY#yáèuÌÇìñ•W4¹ôö;‹É àÊm±A‘Œl Ce¤/V‡e2T±dUõl)E:@øI9£’>ÙPùH$$'ZR9ygz%ѧ2FÆ(¤ë¸Tà›cx]üú2TM†¯£32ñ“ótÐ>ÿÜ:+’¡XŒ(dD¥‰ û©‘ú …\(§Âpgb×á²eÓÈBúKHÊ1ºD.Ù„L93I÷â«ÿÿŠÞEWém*⎇HO+é®§9µ‹"äD él¡üèm%!ÒQâºvÆ|ÒLŽÔÑç]ß`>ÛÉéV²kk²žÁΩçùPZŠ&Û–}{ÞÕDuÍŠ¨žù0ɼlÍš‚"høò&K³´²‚?yì'處câ œIÏÅg¥†ñyÅ.µheù´4/÷B^ƲDXv‚I³0‰"0!Æ {½¾‹ñµëW¶w7ë·ÞÃ{Û).ø¨9”:`l _k;"j!@ i¡JS¡B[©ê?mᩈr˜Ýí7vµUÿ±ãzÿëÓhv<3ï½™7ïû}^Åol…ƒ~8èƒ=Θ}Ͱ­ ZlÌ×a¯[¡Ëáæ]Ò«èeû•k ‘CÍÐÙÀóXRaÅeO"Ñ^Û—>°˜}dÔ‡±¼5fLÉÙ地)ëiIzȨ‹Xò¿2ìNMŽ…kPÊH–¤Ë‰êÏë‘+¹Se‘Ws¦Œú£.êyQ E#¦ÌG&ý?"rzÈ”s{CHUH| ¡¦ï¯{·YÉæ ÖÈ©@bæüö½Û˱ukÉ«nW{P#_Ö4>Ÿ¹eo¸åp^¯qêpÞ¨U†µjÓgÈ3‡óa­çz->÷Íj×½žv·Æ­~ödbY"‰"!ìé3g"¡È³pøÙk$„¹üûKßjD°¯ÕH±²œƒ F*3±ŽÌæúƒró1#Œ•ºP`>Òä%ÀP9Œ#9*ÀŸNSÔÙãR7ÖÄéV‹h œ <ÅW¡Y³ŠÛb…î-p¸¸`À§œÙß=N8à_ˆFúšàMo¢V‹o9œ.’§ÆÜ¨/ïK!cÚ´Iÿ¬,3bÙpßwµ0Ælˆ”›Brñ”\2©[©æ”zŠËqD¤îxÍ”©à™œõИ1ç<6êÂæèäED%P#¡2ÔHÖ#“.bJ›)˽˜•A –q‚†å6ç• P#˜Ðßoê:9\tMºÛÎ6u5äÔ¼Èð4‘СM³;~ãíøÈÓŽ'¼ØiÍ\'"h<'ôÖ4œ÷w¾ïm?îßyº©EqÆ»ó;jïvp“G¤´!RWjÚœFT{nÛ7Ÿ?ܨó^·o½Uïÿ¤Îó‰uó—v׃êÆkµÞ‡çŽmë¯9?¯ó~VãºWç}Pç¿aÛ­~¶§h Ñò<%äâ¥K¨‘'33Ïþƒ"a܆ffþpé2%œFXR”¬,†‘r²ü4RA‹’[‡1ÑãO ”ãÛ7hEºBE4úx°‚/“YÃ&°@y6™Sf>˲|’ Ú˜V+œw»A5À¸F áJ†a[Ìåàû!k]M²µüZ5Ÿ&‘â$hÌáúí0X©ô3ˆ§”~Ž›· WFM#ȳ +h²(R5G§¦ðóÅ¢ˆWÆ›nØç…}nðCWeÝÀ <ΊDA­áx‘å°äÁ©BD”f,ÃÖ‘"}Ðç‡~?ôùÔ®ö7Á@S\êKXïðTTÕâì¨/ïKsæ´œ5e@WI]aÉÖx©#yÅžU+êcE½Àr„‘ˆ†j4œ˜Lp%Vý6+ã‰sк'æ¬%é93l~î÷"æ"$g‡MYË2ŸÊ³î‘1gtM ¥Œ¢†ì°8Na6($@`fŸ¯ PZwŸõµï4Ù†°’ËsM]'ZºN{w|ܲûWˆœ×»k³ c±¢D\±Ö:ñ ¶ˆú ¹ûÃm?Ãó¿‹Fævº­õX¶`PîÒçáp£FîÏjäº#ú6êÿÉ~½Ç6u?R$K–®®ŽŽŽîÕ¹òõUâ4!MXh¤Iœ'Äöµ—4 vB`¼œ‡8.´ò i „G‚Ȥmm)¯]·þ¹?¶?Æ4­›TÁJ Öñh!ÄÞwVmýÏQWWŸìc_Û绾÷~ßïÌ8­—õ ûJ—&K\3ôeÊBm;&£æx¸»F@gÛw~ì7Ð]_R•2QVZ+«Ïûv´}4rõõ½Ã-ÁKšS([W;/¼¹&zÏ·ë|°¿ 완¾ÖÈù@ï¬F¶W0X ÔºZQ÷©ghúì­†– ñçÁÇý/0ìVcëŸÝ[V”h‰fJ5Œ5,&üë ÏãõÁ·K*~[³áæÆŽOÜ[â•§'íJpc’¿ß»÷\#áð7@0ÉÏ5BòTt²ö¹FB5hLGã•ht»ê¬ ªx?SxõWã T5À5LMIXaFYHEbÂ̱Õ¡‰ZN‘ŽFu²óq¬ó†Ö Ó «:4ìj¿¯hT1ŠfY¥ŒP‹Ì È T1PÉH±™ ¼„7 uhÜ…&œf§lqÓÈx̆F«äÚl’L’Emõó¦‘Cè8¤ .üÂzÝ@Åt*' gg 7ò£á ÚýC©8[eJªÄ X kËÑþ¨(@#ðõ9Ì ÓìBCÔU ç_¤L#4°Ø÷ò¾ÀñÄQvD\¹_T¦ÁÈà. "pD¦IP^o+‚I™”IÅödõ®mÕ4ðÙùÒ¶bÆUòX/Џ ã~ /".1£ƒC ž:f5’ßVš)  {,Ñl5鮞+þž‹þnèéÐ߯vÄ®‘ ɼ¶dÅ˪P© —å–ü²áMþqß[ÝuëWedQƒÑL嬴ŒÃmÛ'ßëê½ðúžºö\öu¿ïÛë¼_Ûé\çsJ¹—åK°QX’ákU§Z@#·<^ÐÈÍÆ¶¸ó`ãoM­pìSceÕ9L1@é`ý"[$É(ã?5ÎÚëWìIIý£gëgMqûôä4L±&É ÆÏ¸<"\#3áÿ¢<ÎÌÀ¢Àr Š^6ãýwV#cµ¼õϯF~ZÍ-q¢…àe=òY™‚Œ032¬@ýÍ‚º‹½T™Ž~äDgœh†N•£S:ÿüÉJ4*€qyì *Cglh¼.á Ý  Š€_"<+K¨Ú\˜pŽÔƒŽÕ¡@©Th¡’˜¡,Æ 8[Fƒ3Ljã·ÇM#! ™'En*À_–Œ‰a½kÞ4ò“Vt8ˆö{ѱN´¿U,Ï¡”$‹– äÍèp'…ÇpPìm¡3”,c^:ð¢á4È ÃIóÔðÅ ìBýë)“ŒX‚¥œ;QŽ{y_à;KÃznD_q¿²Ø,‰TVT‘dP1‘2‹@TB ªl¡½`ZJDwF\+#®¢Ï+–`"μzÉS;´¤øÈ‹ˆKÌjä‰=§õNe‰‚ ËäKÚ…ýtö]êìá6ðwÏA#ºúÀ3çƒ}ËM†P«WIÖL*5 耄Øc–XE^aÛjçÞŠºÑúmïøwý·(2éÛ}%Ø?gœíì†Ì$®%Ëitc”^w·ÜnôF¦Ü[?«÷N5ùâ΃Ž=›ï6wü¡v“[ÕÁ@³HŠMI‹E€(¹æöYe¦`KÆ‹Žº»ëâ§‘ÅKà„I‚ ™‹„#O¦ùó76n’pxÍê2™rp†9Bk¸C&ªÑh: ݰzÞºê8„‚v\h¤ÆÐleʰ–FÓL‚DL"ÑSѾr4±MÔ¢ã.4 &©å U£SN.ÉHìù€aÆ€µRq¢J™òa˜U¦¡“:O ´s¦:š[MÂQª—°l0™Q™y²ø^Hàt5:^?̸ŽöÙ)1U-’*9­h°ÇÁvt 7÷¡hšHüè ¸"ˆ´Ú”œL3Æ k9k1Úß‚Ž8TùÐñN4äUWçBŒ #QQøà‹Q±Ä8ï!?Ïœ'ÜŽSÌf85"ˆþÓ^ø•+?òÞ §õ‚GzÉ—z~ÄùjÜËþ·¾¤-zªß(³Næ-íOSkUœ/J=.VHK¢|*+ùZiöCÐÅ÷„_Äw*8r¨í3ÎåìÙss4‚¡ üe®Ë=—}ïz ¹ÃøRŒ$€øÈ×3è;Þ¾#Ód&|%B‰,1ŽEܳ˜@µ”0•E [îe3ßËà}kJÆ`Í†ßø÷Ä:/P䪿çÝ@÷{]=ú{.½¹/ €ËEŠ—1vÓã…N7Õè½¾®åózï­†Ö¸ó`ã“u›o4xçÚÿI*a¥šå÷5÷Z ‡f,ÜÛ' @5­|0Ð"æ¤b¡¦°$¢´ Ã~t4•IPËJ·šB¨À(Ø‚†üèíwÅ¡9L:«ž¼”÷ЉH8‡ÒWqxDôìˆ3gÚa}`/“„õÿYüÞý(º¼ ;‹ÂŽ’gŽÒÇzÙgŧñرæ‘må´£8ì*Ãg9qOøE|§â!×HéWŽ‚g wGîà÷24(s2U‰ÔóZ#ôôY\ìì™›F€ç½£m;*2²–š´TIÑDª ( ó0I–¢‰¶*Cõàv&„ˆ[$¶¿Ù;éÛë¼-L}®«÷l°÷ª¯ûg»,À ˜B¦¥ZâTï€7›¼ýÕÈíÆ­Y»ùW¶†±_÷1M¤yÀ‰ I“Éd2™L3MKãË‚(.®«òV\yéL'ô  ²§”B[Z_wn½]QP@‘»Þyžoø‚o÷ÿå’ýk³wñÜ]qu7—»K.».-mï÷ Þí™ËýQ"Öl,¿4ÏÌ<3Ï3LÛïça8N+hÎç—=¬vu¤¤Ò,S–¸þO»j?+­UÓ4>ûú­K±Üóyh«RN²¨‘omާ6Ç\UƒNÐàç]j1›C á_‹8yÞ+¬å ͨ98n†‰B’ûS¥0^> bóËÓˆ|fëÓ2ø,ÔÞ-ÌêØÄwõГ#2ü¦ ÎcŸ|˃©B¸`$)Œ='%˜TÙ‡2‘–8LóÎ ,¥b8-ÃÁB˜–È~ŸLR“fb¤q3|bSW¤P:NÇih!F-ŠFÌdJÑÒÞø¤2Õ!+¯eðo£æ7­MÄÿ%´Á(rÌ '=D2HŽAUÊ3L<Í 9 ÁL®9Ú Õ’nØct¬†eWS »q ÒŽ»a @å¸#âq‡F¹Ù]…ˆg²Âº².$eŒ[ƒ²aÁ˜‹>Lá ô“Máïå´gRê¼”êSübÖ¼”îG™ÒBx×"2,#`2øMÛžaô QŸð›z­ê1 5‚nGÅmåzµ€‹…·Xa¤ÖsKIvÔÈuE#h’ˆ5âê¸éê¸ÓúË ®6„ÁyWÛØ^÷pU}M¾ÉœšµcýÆwµ+õ4«g8ô .â"jb3E˰çàEoG¤ãâ„o7u-jä–»óô×J–Gî_µnã“ÊÆ'6Ç£*;jƒ7£ÎƒW\så{ÿ¾ÛõëÂÒXŽÆòå¼²¿ý¼¹<>“¼l݆¹Òš¶Æ8ŽÃCUI›¾ÝízA~à³@Š|ð °ð. §Æ‹`˜0“œxy9ƒœPRõc™˜äèèÉÓe„S&χÑ\¢‘I¥ó¨L$€íéB²sgUB £9â4W ÓUÀq*ŠWdz,œ¶ÁT™É¢sÆ`¡v°}¨Æÿ #Ð|,´ç’sÉ¡ü¨i„ oÁ£V.cÔ«iŽÕ«I º‰FN,"Ä©hÄ9HœÏs´…So¡4\Í&P4dÄCÏ^8³Ÿxã„úbÊb“õ±,E‰†˜ã^rr4/I#.rA¿ <•*–ÁE~wZ5a9oÞ˜ê— !1ã{);,gLéQÿÙ_¦ ›2°[ASz@ÎÀò›P#¸¹yAÜ‚B–È!)#(¦#Ì¢>á7õZ•_Ìʹèvüœü³8+‰£qµ¢Ò0›5q盉@®{º®(¹¥4"UÁÖ¾kîŽçáÙ¦®»ûzî·ô¡ fÚpçeOÇõ–Þ™}Ÿ¸ÛNÕyû*öº Jªw‹É[·¯J\Ϫ×0\2'LìkÇ>‘k¤ 5rÕK@2ëíî-­Ö/jDÍÚšC4R^ÿE¥}®Ò!8WÙu¼jXkP#¿7¿Ïk9=ËÚ“Ó>µ:r×&hhNܰñÍÑ–š£U«u4s$WúÊZ»ÜóA~ckÀÂÆWvÔšä?«Æe¦†p™Yf)U4ü‘ÿ¦î$ûCáþc±&q§ £…äš>3Ñ6P&S!GÇóÜ;¼ž§WÀ™3Áta45‚OI泪åwP#'h9¼V’ã'›`ÐEX‚$8î\ŠFH5‘s‡½pÒCXâ,¥’WÅì)‚cnP.Ž&9b´nžj†îâÜìwÀ0áÊŠ£KtñÊÊкb6ÅãÂGÇò ¬ê³yAi{À˜”2äì°˜øéj$ mŸ—r¾3fc=³ü¦ì „•4íðK9 b¶ KŒé F³¨OøM½V óRVÀˆ1ŒlNbH^ë8žv¾g¼Úܹâé¼î麭hQ© îx{n"6Üw›{‘ȃKîv¼òo=äôq“£7›:‘=×öu£LfqÓÕq§¹ÞR®p¯)âq¯µÜP4r£µ¯"%KÃhvÖh{ZÙøMEý_ªìOIðEŸ¯¸Ûê¾®´ÏU5\Ü)oŽÓQ” ý[‚V ¸$V`XÅÄêეÜÏËíO*ê–{>lõø,Ûê¿P4ò×*ç[=ÎMÍâ’gifdh8´° …Âÿï ß¿{O#jŽ×ÐRçÛ]½a·sÓ^Oðˆ¯ã»]g6ï:îz+° ²œuB–³2Q 5(å¬,8L6/PçÇòå0&ì¯|&šDËþ®²é¦+ù‹³ (2Rãû?ÔÈ[ý ÁóNψݳǰʩy–b°gÓj޶QKi¼A»ð¼#p±6pÏåëzÀ!7Ö{¯¬÷€F®;<w.8=1ãj 0’ÁtßÑcàx|š¸#ÏvpöW¿<e© óŒs)ÑP:.kdH@Qaֺꖵ ‚g24§Ë`æ±ZóY˜ÓѬ†áxn ”Á1˜áh¨žÍÍàT¦¯¢cЋMЈISîW¬N>µˆN¬E¯ØqÙ|Žåáa©hŠiYE@2ó?ƒD#ý•èxŲ°Z˜¥`(ι õ (VNZQßì©,iT¢S"zµ ZÓB&ަ)žË¤iÅ‹%iÝ^ÒÍ €~ƒíɫÀO¶½¡GãDüèp Ú/SaL8Õ+s¬r0 ÓŶֳGÛÑn/:”³'™—¤3ö‚IÂÊšòL øžQîy~Á´É(­Ó™òÇÊ  ;ÇÍE)ÿìÏQ$Äå !"n΃ž2!xˆ†Iqù¤òaÙ >‘ÄbIxª‘§ñO1.¢qR,´çffdÑ%­Ê¥ñëí;N¶‚N‡‰FÞ t’Ξ¼F*^ÞõJ[§K¿r‰J«¥YXíB˘¯¤Wêæoìß l¼îúÉKß|;° ðóý0±ìœmÛ J9ÛÞýf[rI!Þhßñ^ë"¨P'L¡0S  4’Ãó—œÁÝÞ ÎÆa‡—h¤Æ—r|ÁñÐÝò{{ÃÚ–‡çZ}ûÀj›eÞ" £Rc•S¹Ùê=ÆÕ×Á?¹Â7þa{Ã\×3ìòÁƒ\vù@#·]-8{òK` @ò‹Ÿ¿Þ êø·_bæßáœD#Œª4 ØÐ @:xZ%ŠÎZ¦º¬ &]G©i ð–IÑé4§Ô0,ÍRÙðz³ðrsŒí9Õ"µ†á)F©+zEèT%Š­Eà"+1É`òõÄVb<X•Ï2‹•”–£q¡õ»Q_5™/DŸ¬Jþ*´SŠ”£“ÕäÂ\nM™Fúm2× hŠTQX‘ÅòZÌkrsPo ¢Ã€ê 9$M‘Š 3@‡Bdàq4";¡»™®·re%éuê܈z;P$€öµÐëVh4´¹í  žvt EÂÉç ð‚âáЛö­f–¡1ƒ5´z‘ K–UqsÁT…1a.|`ÒÇÅÿ$,… óri]ɘ¥tÜl”,¥’X2)ã‚>©„Æ„üi ˆ7jʇ;&¹#L;úvò šI‰´ Ý^~NÅÀ‡Ÿ—‰¯­‚Ϭ~J,š2é§ÍÅ“©þæÿ÷1)äO˜ò¦ÌEc妢„Pty¯ºùT#‰éiF tQcŽZˆQÌŽ¢ehHîƒ3Ýy¶ºj¬u­Pô8Q¬Em(êHÛ"fh(Ì2´u ê«B¯V zí|.Ç0X™º×¢Á ROìq‹é/'ƒÄ€ÿ ¿ÞcÚºî8€ ©’%KWWWWG÷êZ¶࢑›ÿ>ÿTºmðôëškë½­ý?­i ®)üÒ×uÕ½õ–7ð©/tÚ&ï3W„Ëlî¼±­4iîœñ÷´_÷t}æ Uî] ht.Eâi’ô‰ª‘…h46?ßâõ14c` §Éj" 8!£Q(…dñR¥ê¹d¦C¾+hBDõÏúL–㌙¸Ú„NCô7lœ—a¬]N½È0£å›×¢s„.£p­H`ê¼ã*Hµè’½]‰&a–&ª¿lÙæ<Š×ð¬Ö˜)P«yM« :Ѹ 5«àß`í hÄN>Špêó.U…ë‰F` €¥³šíÅ Ob[p×’L €FŽu“# ÷U0¨b§ûÐ õMû3Z7Ã÷öDÏ lF»"ÔmⲀѡ.4¼SÛ\[•LÊ„¡dÏ'ÔñP7:ÔΘ‡ÝC瘈¸  âx^‚²¦ý±ÿ_V\.]ls ¥8%'u!—Sª{âú»ÒKwëJnKæˆcì±Î)Kû«ˆd^€ÅJ– Ña‹Š%  ‡-.m¸-ZnK–Å’PŠJñÙ’ö†Ÿ±ºo_ŸË~m1ë0…#×гˆôßûÍqòôÊŽþJYÏrŒÀgRL8°ëýÐÀåàžßôüøµÃ£-UÆløÉ‚Fàá0ÒÖ÷nßÞTçýÖêÛÿnp7Päýþ›Ly°'b8œ…ù?¸^¹é €Ff|þwç—ž®©ÿKüÅÓq´¤ 4Èò¸Ñ”óWçÖᲞf°¶t,<œ1Ãò >iñÞâÿÌÛþ¤û™ñtF¦¼ ‘kÞö)¯ÿSo`%Ãð,6ê U›6'$¦Vò/þ%dÃxbWÿN½ 3°FŒµè ¨4)V£|©Rln@“.4 ,©Bçê3ü¹X€ P:éBáVÍq%› µŒhNƒöÔ‡Œ«Œ€ Ĕ煅L8ÑÌnG?ªEç<¯¬fr´˜†ûÅ8C6ÅåP Ãiµ¥†çŽxÑhÒ*ÆÀärUPéÒÈhB „FðT1¥£y´PVøP#Aâ8žH]#C=äM Nö c~t² e´Ù ,—%èu…ùðÎGz™¦Z=E/çõZo-ù·Wy µFŸ‰‹W££!t4õyÁ!0)¡2èFƒ½TQ.@ZÇ0´Žúµä¾\—-³bÑwH#1©4.Û"Rñ}¥8&›ëœRñç겈´1¥J(¶¸RúO¥l¦ª0ù“K#RIÚøxI€®’9¹8=zUÆäò˜TuÅVx|ýò>ÿ·ŠÂ¸£,Ñ`»W».ý ?[5'ÎIe{rM QDþv9ÜWB‹QA!(’¬¾J6 ËVæ­ýYp÷owüUpà£ÞýȱlÕZ;Yké ;Þ»dùpÇ÷B@‘‹=»WszÌqÐD‰.몧‚ïïÍD#‚…Sé¶ÁÓ¯/|úÜ|c#Å|ØÐúµ/ôbNÇq:gѬ‘ãLÎ×ñŸ4µÍ¶ô<ÏÇÝ&¼îë¸án“Lû¿oj3b€,†×¼ÅÌ%Õ1‹Ec ‰ÿI ^Q5òÖßTqk]£^+ ¾sªFHÊK–ªð†gêÑ™4,¢‘*tÁ¥Ýï x-'@ú`ŠÕ²yŒÎlxN§¥8ZÇcNCi‹t蔈¤ vT¤:/\®GgWÿæ¾Üc›ºî8~$$$K–®®ŽŽŽîÕµ|m9! $¥±çi IìkÏVâ8„w‰cÇNxu0 ŒJ 4@ÊVB;«*ZÆx­Ú´imü³?&MÖ(Eh´§íýŽ UDÂ(Ô]­¯¯Î=÷Þóûûø}?gЂEªlNäp6¡zB$Œ)ÏË0ÂóZœYº…ëÐ)¨ùD ¥ EÙXæÀ!CnÖ8Ú@ ¼†DB´ 3ÓH_€ÑH_{¢¢ŽÑ66N_‚ €Fw îµ@s)¿ÈlBBìPÏF-üx"¿Žú6«7Õgc! Ââ\†"ýÛSŽÛ—d§P"ù êõCܹkj D©È \W^NÜaSÌSö"°¹´—ýuÇÒ¸³,ªX،ӵæ¸RvµÂÌÑ4dH)É£×z2åeI~ù»µ0j+Ž;KâNsÚ'ø MÙ$@ŒcJIL);—N¸«®.7-ËtX­VÏ­Ó ](*ˆ9­€giOøû&§é~MÅ2Y¿,I‘ ¡ Á®—¦‘§»çC]gÛò³ !¦X ÕùÆK;Þ>ïß œp.¸Ž^îì6/.€š°@Öçj䋉žÙ¢ªK›{>îì:². Ç”ˆ‚ž'- Bn>Áh3lò¥ ¾}6¶™õ`õ%9y×<þ‹«aר՞¶­¬]0ŸªUzÂßié­ÛôÈzÕùÜñú?_åYã¿ëÙ8ºÊwÃÓz©¶‘|D–4ûzzl0ö`(ÇŸ¡‘h4 '±84Ï|ø!˜¿Ë2åç®+@'œi$âbV8[®ú‹ZæòÇÝhØÂ•(²…×r®¨€×‚ÁêEq¯É£óæq¼Ž`| 6¢aŠ(ÌŽ•—¡‚°p£÷Ý(R ÕrQO°ž×ó’ Wå¡`zýR\¨—0>(Q õU¢…],nÉN¾TÜÙR$ÁQ0€"¸‘i¾ Å@”¨• ¡wýèÝ:ègíT‘àhG‚a`Àƒ:”`’ø8ß@E¦hÿtt3:ÔYÍj ¨•¢^@ˆ(ŠP¦ó"ôóNt¨3u† ² |'z»õìY7§QC1®ÉÁÊï;ŠâË„R‘þ²ÿbºg+;À”‹ÇKÜQw®8k1éÉ\ Æ)I$ŒËT. êß”˜ÆíåQgñ¤}IÚ'ø M9ŠbŽâq»9Êf óµþ³²hoS€ï)SÌ”‰n.§®Ñ ±š¨Òžð÷LðJÜz£TCÕP>¡ò/ÈÈøtK÷ù—€$\Þ²vEÎø~¼[i|=ŠRž¨ û¶' á̶ž¶uÿ2° ‚ÌãJsÉ•àžO:fF.¶ïúdûO!ÄîúÕ©$æbº£¸úv³ÿZ³ïŸ×÷”F 3íxð-ëº7X*gꉔő_Õ4dÈTÿê1•Ü\ôå,4RçZsàíËÕ¯œÖî6FZ7½oÞö¶Þi ~ÙØ]\)P0 A+i.]¸{ OÙã‰B' ôŒŽÜ‚²§!X¤¢¡<…ëQ¤…Áþê3Ì–«ž´¡A סa7ЏÐqèq3Çò¢}5¼×(”e Ez¾6ŠÐa à'óßá:4ä`xq²Rvs'‹r¢»Ð[•Xâ(¬Ú¨€‡jØ9ÇêTëÊ2´TÃqd™ŒÞoD…%|ÒÁ»XÂi¤È¤vÃMS¯1k±`ƒÇòV%h$À¶ý†³E#ýÜ–5òâ…ñÎgSxùyœ­C[Zб édW 0IêHÊ4"8*Xñá‰s§^Ë›P*&œ%“¶ÿ{%Œ–'"€ùe*êI(–°†>_‚5À"‚A‹ñÕr3 WŠÆëÌ.lž²%•ÄP¢âìÅààÑ'øñ¸=³k4â,›°W€ãO8 §ì¦,-üJä±Lh‘X¡”ä\N} ?{L™‘j’Ì´„0n³€’PÁB'}’ÏtâœW=ÎwMSvã#gIÌn™v–?¬)ܳYîÛ¬ÿ¥¾Îc£¸î8€? É’¥•F£ÑèiF3ÚC>0 6q!ÆÆçÚ.6ØxwvcÇöîzâ{OÖ»>€¾p)ªÂípø¦Q’†û %êmÕ´•ª–?Òˆ1ظ”Ò@ìµwû{k HÅQ621]ýd½Ͼ÷æü~žIdU Zx>1»·fÝ'Þ-§š¶Gšþ¼­§ê[7w[¿åœ·åRSç¯7u–-Ë€Ç<ó±‚V¬L¸¢ŠÏ‰O„aa‚y>5!q‡¹ö7oî8íÞ|±qtr¶¾õœ·ÚÀ›¼[ÏùÚ~ÛôóHç(:áo»ÔЙ·(DŽáYáñ_ËkçK##V÷¿-ÐÈ5ƒ¡nÜì2ÙGªc&ç(¨ÃâºmvÃvð8¼qÓh¿iõÜ4»Æk?µ:¯˜WªýŸ™ã„(Ž‹ zŒš]#‘ÏçK‹ïƒÇÓp¨t2‘_ÀoNê•æM#=d&ý%äTÀå€)µ CÀÁ‡R'£}¾0¼á¿s§‘_¸ø¼T.JËò€™œƒÅÑOh#ÈEˆIŒEÍo wšÐ7Úí‡ýÑ[n´×÷¨v†5Ò±FÐfk<ÍQp‘h™6¥ùé×zuH—9ïqð=k6<–Á<Í „‚°Æ˜DÈ,ÅñX.`e,‹—“ý5Ľ6{RÊ›u\Ha½: å@òBN=Ôå|#eÿgMzä©—ý‚d‡ ·¿#µHé!T›‚µ©pÈC«ò–±²Fy©€` PVÌÆ¸wŲû³k*¤Ï = B]N@§~¢ˆ'Ç¿c>sÕÏ‹VpõRn\ÖœûšL8¢{šÌimÖïWf'±Ñ šU1bB\ü‰ [.z6lîŒX#õmgüí§6v÷N@»Û½±0>I‰ B`E f±œå”XXBà ÌÁSŒU忚Ö\RÞ]S’y¿¡õLsçå Û/úÚÏûÛ$'½-§(Î碯~ø¡¯5ž!Χˆâ ›¾4NØ0!l çÍj°dÜêù‡Õ5dvÞ0;G Kì·,Ž/¬Î«6ÈäºÅê6Ú¯›Þ”ŒºEK~¶8y`eÉUèÍh¶¸®ÛEnW9¯W9"ϸÉ~­Úûfjv)9¬Þd1ª¿TÖܨ¬5¿ôrtTTdO@ÈÛÑ>?ÚëEû½d&4âýA:róJ…(Â+"<úïjˆõ~þãà{Ö¬ahÆp²rQƒB”'dJ?³(ž¬À½šÌP—Õ+hÕ!)czöq'µÀöP“ ™ÖçBMDž¶“3ÙGâ/“ÔSŸYuY!˜õÙ÷¥‚ŽÄ8–ƒ|ÄX!)†bdñüÈê¼Pé¬'LK¨CaÍ)€j*ìŠÿýú|ûyÁ*(åNir§ty4YßhÒ'ôÙн–Û¶$A)xVb¡*¿èdãÖ õ-Çü§ÿ_ûiÛñb’›:χe²Ûêpé+W-M[ÈÂ-ËÂm 8÷€œà ,;s—*)f'Æó¢>-Û[¨ë¯m<ëmN 7˜Ì˜ÏeÛoË[Õ.¸{Q”cl})é¶Õ;_!19Æ,ÄÐi\­\wÏì¹mõ„7:n‘¶ß03j¡€.ŸÛÜãf×›oÔæÏZŸÈá…<ל”ü·Êší#V÷ÐZô9nrG>Ÿ{æºk6ç°±îJYõ{…ú Eå0@èÏ6çû¯[+…Òʼnc&÷°¡vx­sÌTých´fs†ÏƒóšÕ›'W³  ™€O;dæ3.øÌ€$˜ NO+ KÁj ´+ÛUzJP?P¤Œ„òœ«„ú4訕ЀD‚¾[3 èH)ê­@ËÐ j.dl™X—,O‰ÁÅÄPtM:êQ¬!ôD>. âõéÑ`:RE¯ÀpˆI´À§ðhÃ*ê@•lŸ‰«X®¢d*SJU›‚•“_õ>ždoaÒ|ilTƒóÖ]ºàÝR¢²3“*p(‹ÚÖ‘ôßå&*˜Cì_,Q ȘMŽÃúüè:=jµGíl$~ì߀:œ²7tt]%ÚãB]^Ôq‘ít‡;ñG<î¾zF›½†åŽæ£w½’’òÿRc6ˆ,Ï&#$U,cQÕ(…×ãÄgÖÊXVŠ*b…šü‡üå´!ÝŠ .m¶q“áx h2§4™A]NH—”">o)‡œmmV0lh>¥œÙS¢?oBRY’6¡K2…^+ø¬0·éå8¥‚V1ѱœ¬.A1´2#T¾:¤Y6[?_i³'w8!8 }ŠP‡Ý“{`:<«çÝÏ‹Vä)Ш:õ„”ФO“$ÌäKS¢Gqª=ø6ÜÔqÂßiúŸñ‡HÎùÚ.úÚ/x¶^jê<×ÐqzýÖ³ Ç6lër4¸ŠK _y5ITª¤É‰MÖ X.ˆ˜Iаˆ€¯ ,ߢ7}äÝz¾qÛŒpN4F6¨OÚa&5kô ÃðrQ¤è½¹ÅcFÇ|id¸Ê1j%º5Ú·@&Fûݵõ÷ öÛ&pâs›sh­ë ›kÌâü/õuÛÄyÇü‘,Y²N§ÓéNgùEqƒAE ÄqÇ!„$~»#&!qÎvh ;ç—¡Ë‹“¨h¡ YËK)M H+CP )††VM“¦U릮-…R /¼•רû=Ýøosjýd=vž»ç¹ÇÑóý<×Eï@MÝW?t¾áj8_åMãXŠ€MjÏÊùÚ]SôÃ%и쬻&ú¯Ô¦®,ñ•«.ï÷¢o¸6xÝ% 9}é˪—®¯ª»ãž\w¬¾[öH—]ÞDçg»>CðÕu]Xe¶¸óñN«•ªœ%ÙqÆÈcÄ2™ÔÈØÄ8n$Þ=â¿nÚMöLÔ\†úÔëÀT蛺TíƒÛZÐz[@»Å=Õ¨µ „s1¹,Y@rœ,–§3¤’ 8š#8u:£¦’¨ÊDïU£`>v ¤TLJì±?nìd’I¡“§+õÅÊeÜL‚“úUøJÓ:NþtžÔ\^ŽÞ- }¥Ó©‘^X7›m/ü"%À*jePФIbM9ÖÈ[´=€ºýS¦‘ßQS-m7Ê}•hk=êj@ `F÷:ÔÝ€v…PWXQ¢‡S©UQÅ9¨'2c[E×¢ "ü uÁM~âЯz`ó!š`È2%}ÏZ<úóIdá|Œ”©ðöͱL¥N=XVãËÆmƧVœ/Š ÅöeÃ¥†qÞçõã¶Å7m “Ž #& 2‘ˆZÇ|RE$«ÉK0lxœ}cO|ùÔzdÍ FxÞ»–ìqÒ?;.äÅË‹c¶ÂÛ¥_šrÿi2 ”‚ ñð 9ÉîsŸÏIhá1„àAã8_¬‹ÿ@"QÉç?U÷yÞ*f3YóÆøÜ [ö8¦)hségÆ,–&ÕAjÔKTºSáNˆþá¶þHÊù8Øx8¹þ50@¿Ôöi¤ã hDj=ê€ö'áöcÁ¶ÃÑCM}á–î5Òz¡Úœ‘5—S3±;J%˲$A,­¥˜Íâšcë;O$xóQ¤ýH¸-ÕùœŠ€‹Z™YTâþirùiGí°sz(¹?ä‘@àhÜv5ü°:ô§ª—/z¤KiÀpúÀ'PC5¾A±Bù¼Û—ÀFà3›GOA‘šûÐìøþÅôùNô]pC7´/¥>ŸZÿ_žž¼’¦%¦7 ÌíYùoåÿ¡Ü3 Âd¤[¢&¹Tãö|UýÊåg¿> ‘A§÷[WÝkíÜÊ—44…Ï_$UU¹ Œ„€:þM‘ILL$–øãÄø£ÑÑžîn–& áÈ&«ËA}´‚¸íç§,U÷–¡Ý‚¢ÍL8n§Ð€çe4=SI°Q3ÂiI3 .RÐzZ¥”ÏœiÑ v´PaÁ@J9Í­h·õ±Fúì3ßqÈÊgËÔr-Á¦Á°£%é4È‚€S«lu6ÚãÀ={A> –¼W5rÀ>myÙœx|nï/Eû´¡DC³,œPJ¹<'x·„ºè­ú)ÓÈžzÃ‹Þ $P@o¯C]A´#ˆÛ€Ÿm h‹Ÿñ°rJÉr岪—çó4(C6¸POwÞú“æ³ÝO.HgA¢° QD¾þg”É4òK’Ò(H‚Áÿo,C8´ô¨½(ÎçŽØ³ŸZ­Ó¸Ppßšpb‡Ð7<ôI‡†¨²BÎæ?âMìw¬y·,ywì)Ï2š‡ón˜õPÐÀÈI®Á+Î÷˜÷ȶ¿[õ8+…¼›|NŒ/¸g)|`__aŠ ú˜mÑXrÀŠM"*ᇇ|þmkî5sÎmsöˆÕ0 ÜóGf<ëûnh䜈tL^žR´­oÒª5 ¼HòW ûEµïºKš.\qû‡ÝÐÈÑ÷M÷ºÓ ïþŒÌÖ¬ü]&ËÁ}¾Æ­6tͼ"Ö_tzA#Wܘƒ®ÀÁ¢rмÔ$ûùÊÕ`P ÜCî€äR7Õù¼o]¥W«à0Y [ŠŠ 4 A…<¤i5ݬ¨©ä¢;0ì‘΋õƒNß³^Ÿ±þ†+pÁ â.qÀÏÆRǰ¯oÚ ‰ÿh'5òòÄ—èöÇsç8†$(FGÑrç ¨¯ís =ßS–ª}©N:ZMꔳHXGFK±ó`¶´’ÈY-­a šãØ9™sh%ÓP,!O_¨‘½î@‡ªÑ¾<¥]•©kG}åØWï ÐÞ颜ŽQÉFIÐ ÍÉV9O­ðšÐnt àÑà“õV¢½h§´L›Fz+P¯õòX#û¡JÐnóŒm«t ì$`3Z8ƒÒ¿§m›:lñÍèÙ€º$´#€zÂðmHhPDÂ8鉠 (ãà·b!m)%ó ŠI—)H%Â"êJf{êãîÁ…òêâÙ40‡ahrÝ\uÌf˜ö8ø?+™F”KÁfÍq/PœšV:âþŠ¥m‹àÌûÔµb6}Œ‡Ð4Þ³Æí…ñ…,I5·'lÄF ÈpYÎ×K3>7Îÿ[á‚”SÏf€ÿÁjø¶h4àãYÿ{¼é®Õ_‘ç³ãBîC>÷¶`±.¾kËŒCt E÷íKG,Y1{Ö=»~/N²uËÃúJ(Àp£,û›¢ÍŸs³t1@1ÎÁEÿSSuŸç­&l9chD¹ÃM—Ý2/Ïde*’“«9‚ÚãÝp$Ò~&¢hï7§šþ'ƒQ`Æ1©õXÓk×E×[*ª2²7òUI-Pý¡è©ÆN° ðpr$ý}¸ãl¤ót0 >/á›ÃQ‰ßâhXj=ÖØq Üj?½~\•êd Ž46|9H$CÓåųçœwÖßt§M#¢o¨Æ‡÷Eé Ñ{Íø³sm)£(‚¦MÎgÙb­60á;æ#Öê«âÚAÑ{Á]©Æ·5w9ÖÇii%xøñ³nиêôþ‹ørâºâø•,­4Òjtu5šÑíx´¼66Á6»Æk{×ïÅ{1ÆöÚBÛ»~ã¶PˆÀ*mc…‡Ã£`ƒ±y4!¢Ú$_ú­©Ô~Œ •g£à8ø5=³&QK¨ZKF­gÆ3÷Ü{æÜóÿqù.œÏs>kÉb<:–³ÊÇóiD€p™)NKMûf]ôfsçX}ìzÓk§¸;õ-›Úo6ö‰µžôU`Š#¡è>5<35˜aÀÆŽÙøñLMM^»vp̱xèL(CÃC JU« î¦FÆi¶2&™‡@ÍV3•ƒ-fCvtXA§jÐñ¦„-™"1Y‰hs¥¢c h¨ú ¤™¯ßÁ t2„†@Ça-*:QáfýFE17Ӹܴq%ÚQ‚‡ b9[Ωè$Ì6„CÿTV‰ŽÊȸTJx,š9V’P B;:ÜŽú;ŒFDQÿVt¨'N1t0ŠÞÛ†öw¶¯ÅôMôdHT&1—È ¬ÄÃŽ£Ða,TúÐ;-èHÁ$À3;¿·Ãþ‡ëNÃvoêwj¦l*eÆ**gƒù ÍzÕœF? Ìhþ)eñeâGjøjI6x f¨˜ÎT#ã'ªÖxÞóJ›P³f5ÎBPÕñà*½*g*˜3¥äëUyï»S4™†ìɵ²3,[UY^cµM³ôêÒQ׉¢‚ÅiF7Æ@jmG]y”2]Ë™ fŽ+xhøá™–w.5ïcͯ«%wËKGÜy~‘bÊYj‡Êq.žër¦üÉçS tÍÿaÖò»°'—;’"²µÜ‘¼mYŠ®oŒ+>X¯.ê]–¦ÚœU6KÈšRosTZK¬=\ §ƒ.xøƒUåV1¸ÔYcKÙíÕ²TkǺ¦êÁòsWžÄò‚Y&ØNŽH”%ÞéDæ²™`¹^U9È6D¹Ê÷ÏŠ½º\zŸj€Lîç€CÕùºæ™U >õæ¶$%™ðf‹„…:yRj±ôgdŽ••èU%äôñ`þÃ`!PÓŒâ›Q €»žk¹ºšµè‰ô’Msu­’AW³!ÈZñùÌ Øzð}­˜ §¹Ïwï$¸ÚÓäðé¶=óU Š?¼Õ÷qÇ®:v]øY_©=ÕÎSHUJiIFÖÎꆳ­½ðÀåö_|ÖÓ÷9Æö½s¼'Úw^îí’ùlûÞùú½Ü¹pìʶ=WâÓž£—?víé,S‚¢±2¿ß•ÿ ¾í˦èbÑÈÝ8Š|½¾óz¤åš»~[YE>Àb‰ðP­œº%ZE8\²£;Õ³/_]mOµh¬¸jgú|ýÞoŒÞlhù*½ÜÒkˆÞmÖÁwOà͹”Û²b¥l‘¬… ÃHl‚H8grdW¶÷fcÛß×Ç5´o½æøü#Ÿ/ë·>nj¿UßÒã·€pÐ¥bü—?1Ç!ÓÓSð;93=ójyq€„£d) üð«$4Ro÷ˆjhñB (0Àp«K¨²qe)8’‹Úò—l/£¿Þ`+]Éa–M§è ð@؆!ÕÄI4cF$¨5טϰ††æïw¨ ¡SkµÀ§5tRA#€ªÇkÑñuhp-]‡†á² .™à–:t~­qgPAçÂÆ+‹/_¾6*ì,PSK z7ŠÅÐ»Ý F#Û ƒ“þt´ ô ›ÙõÚR›J90Œqù)üÍ,eY&‘7YyFñtÔ5Þ:Ðù0uv°+>~ûõ by§CÈ[åd9FÂ21ýÎíÖ«Š+ži5[Ì 'Õ¢ÉÅÖˆÿŸF(dz"À/cÎÆá‰ôA`õ”Zú¹Ú½GMÏ…¦ ø÷•µ_Õ·Ýh\4¹Ý½·n˺­7€ êÛEbç +s ©ý…¹FXH7žò¨(ÏÙŒOC -Ív$lß—³z¾~Çšbàú~sì^¤ívc¸âzCëÜ"ØžYDø\©»µ©—2¬“ÐÕæ/Öl¨°Øa2ëWº?VëœnEZF¢·"¯=>w"m€L7[¿nŒ¬_–ÉÉÊÔ[·ÿ>ôé°ã?8•¼øÏ™i6QXFÇj ý=0b¡ôxhèB3:6©E#uh4„Îj¨¿6Áj"¬IôHh4‚†üè\.G£*N¶CšHAõè€Dý¼ýŽªqR È9 — :Açµø9`R ¬EGkоըÇC*S˜"9PΕ3¬¢³µ‹Ž/YBk‰Ä2<Ï‹„’Jß÷ð°p4r †öÇÁ` õǘ†Õìr;K ü°0f'DJÈ{A0°s°%…ÙKÚÂæ_Qt¡Q_ç±Q\wÀŸdÉÒJ+žžFO3z£Yízíõ‰íás},ØØ;»‹Á¬/zw}Cˆ¡…¨‰¹$\!TéŠå¯Tú_«ôH ¥ ¥Žm|L¿Ï$ ¢4Š[Z«öójµÞ7;ïÍïûùÝ@FúÈK)É’‘~9¾ÀÆ€¤Èþ¯™zœúÀ¦´Ô*ÜqÔÒ æ^ayœhÝ¦Š‰h‰/ŸBMŽÕŒG*ÆcåóßP#2!7®g¢bq^mhû òŽåî-Ìyä) Žç(\Z‹†&íÒ;8f4|Ó®ÞY0¹oàúàWÑáþlq¡…›ˆQ¾‚ ?¬ ¥‘f©š;=‘kŒ.«€Æâ58¦³¼ qško7†Î,\°Ð`iܕϘ&A ©8O&]À=ÊåmÈ•î «'Óï,3™(Ü ¬Å+F›BÓv 4r×.Eb®òY(Eº A_h(Ne"UaÉFíðHa–Un&ÆÝBÆ ôôB^‘‰Y·T᥺€p9GÓ‡_&˜¢QÆ\½~Ïå&€ªäfc™Óžˆ€%¥Sv©ÓRw­>üt~ÐËÜ~uVéòb›¦jz™ì[ºñ*^VLÆ3”_=‘åÄëå¡ñHÉLW¸|:Zµ»k‡œxõ¼o¤‡Æ¸\ýø=«œ‰U½[Wi1—Wf5/1ý'ú6ËLÚ‡ Þ„樂 Ãßkp;hñ“g·ÚmÙw´¼»™ÐÕÙ}kaÛR¢{3Z+ë¶&¾}rp @r~X*âìà6œÀ… Ïÿ'97{Úç7<ç?~.K7-v?ÙÙûýwô]ž?|ÔÕ‹œ½Ù=\N$ït\[3ônWê\¤ãX]|Ó¢ê†@V.3VÜÌ…îŒIœ(BÅý.tÍ«Ð_6¬žë¼×É‹½—¾Lüƒï'’ý¹ÅÜlÌ.üs[òO+×y¤ÛµwâÝO¬;W×­}²äjgÿ_ºún&z¯&R»úÿë—¨£÷J—\øçR{*lZ^)IÝ4<ãŸMOeéÙñ€@¾BÈýçøk[Ý‚šƒ á.²§…œˆI<Æ~-F^Èq2‰H €¯/%›„îÊÔy0[O;š úq=9…©ÛhSVòKÕÈ©vr¬EŽC#Ç¢äd 9ÙLN7KiK?ÔFެ$»Ɇ0kB©.Ÿ‹óôLÕåÓE:KcÛqªøHƒüÈ‘eäÔÊyçÇÃã…fƒ»€r¯*ôÂl² Ž(zlmF’äà09¼‘¬O¸òM0¹î•m/BŽ*B32|]dàPÝ®%/%ÉÑ䥲§‡ÙDö Ãò û‡åa_ì•2ùì!{Sò »’¬  sÍTQÙ{U‹&c‹§¢eS±òÉHÙ ò"R6/›÷˜ø† P$*óÉ«‡¬ç D&£~U1Ø£‡Æ©!X!WÞ •}f×Þ‘_¶Ú‰/Tï-dKu~ÕÀrÈKÄuEU±.š~&ŠEhªTtCe²I£PêcÇæ ;ñŠO› ‘ÚÉH…Ó\÷fé‚L‹¥©î"=ƒ3O]ÅM'„!LƒrŸªƒ––!nR4ƒÔD#ˆª«iY ʬX‘aND«hÉd¬6@n¶|@2Þi©&à ‰ù8Ÿ±Ã3Ñj$þddñ¡¢|Ÿ*á„·!ï+@JXháÑý ná1¹FSÁ<[\ø°^¬*§æ@cvõL´Â‰—5=9³¼ú³¦ºçò‚ÙT^Aµ\&2T!1Ä™Ÿ3—æbÔ­ºWÁÆå†n˜Š’çao•W:Ë«fìES±Šñhé´]z/Vy;RéÄkç}#=4¤[ØK7äYŽÃd¼£jɯ·ì:?¸ýí¡¿A¾?³óçÃÛçªHæí;¡|üì–ìîîYS׸Ðô£é€@ …Atè}„‰¶Ce”nº,»èÁ­¿Å§·_xf'Dñ‹¾-s÷¾=$¢fŸã xoö}oVEýG”ÇÁ»×_lO}Ò1?Áø ±±~£kà¯k/vö]më¹Ñ–¼ÖÙ=ÑûÉêäíÎÁ[]ƒ—©÷ZÖühIì`M}EA~¾lHŧ"—™—Ñ?¬X;×y¯'’u¤0®"ëg5òÇÎÞïfçs*ìÌü±5Ï.mQÕLña{êzûÚßG¾£0%O¥7½WÉ[ýW:þ¹ÚÑ5ý­£ïÃÎÔ‰dåˆrt$U•!gÆyðçA|‰ipåÁWvíÞáÑ ŸŠ¶A!Û–‘còjýãLOØæt#9ÝD΀:ÍÒ$Çcä•(Ù3T”"®<½§F9ÐJÞèpi#[š´ †’’OUÉ!'V‘Ÿ®$'ç>u”¼“3žn!Ç#ä•z2Ò¨4zPh†šŠª»ŒÉªîñ0Ó«è\0×ÚrI&häe€¤•¼<ßöøçñZ·§•šÂ¨ÕdÛ·d‚#ý—F =}’»“îUO)œ(‡: Ž’ãϨ+O{º›ü°Ïݶy‘Ç8Í1É‹³"B†ÈžÙS0Éá!rhˆì’ÿÅã¾=ïá”$Íþ^¼Si©³™à”«ëƒæL¬Þ‰‡Fc¥ãvÉ(’,‰ýßhD—ñÍ<ª¦«h—4D0EQ²}xä` QªYÔý»ªj'¶øž]"#)Z3©YÈÀ*hH"”j xÛ}ª‘ΩKS,MêPPfif®ÊtÊàÁMÜe‹Ædô©»dÒ®T}j×^_*ób6¬õ¹ ¨Æô˜ç“ᜆ¦2´{ÈÓ# !Ù÷Īb»úɹ±}ï9çúœóûüÕˆÇq—3)Ä3«o¶cŠ»áP'1uÂ(q²uÅïÚ×@#G—®ý8Ñ5^оvj ‡ã«&º/í>¸lÝĪ­ b í³óV•µ"*™:ADÄüÓíøÂ©ö5§â]h÷H[×ñŽî'Ðìq´­+Éœ ðÎ"§I£L'Šåýõ‘óAžìž—F€`ôËÚ&°äl(v9»ˆÞÆÎ…ZÏ#œ -èÞ­ÐâþúæËu‹®„ÛúêZþZ»è€;°!¯ÄoµzÒÓñïxÛ…å/5FÂpp=Ó]>#O4 Œ}æåsOȈµ(I¿.÷Ÿ 4½SP¥¦D& Ìo»Ù½Žh¾ÔÐò¬ŸÏÀ˜CÐâ…PôÕ T ¥æ§\WS;2<œÄÆððÐc5’ bì„»z~ñN &™ŠBS.Ùí'û¼<ƒ?­ì¹ËIvWñàçÀI5ÙSKzêIoX¶°·ªè‰Yk.± uÓh‰-5S1c$”GdI ïÉþ¹dÿø5²ÛMvùÈ?éõ’,”²Õ/¤¥h%e”›¸$£42½E¶è±[ÉËô,’('ûjI¯›ìžKÞ÷“_>o{ü{ô©@Z€ªda~Oý›bOM#›Z¸F6A#-ÔW‚œ1Qæe‘yji«!ïÆyscdk‰×¦X¸RR Y"ë£ds‚loçŸnZL6Ä8?¶áû­cÝkãÂùÙåŒÙ#[:ÈÒ ÖOåLÎRÄ3%EØŠïyrQÆVåag~àþ¿ÑˆªÈ’LÍT6Q*°*z$ıÚöña¤&ÌI“$|Qdõ:FÜ3G\¹ÃUECî’“ÓÍð‡¬"›ãÉPÆñA ÄkR—¥VL24™u6IÐ(¢ èqCÐÞ`Ä&¥j¯–úÉ=¯c¨ªlsV†VÕÊ’ËZ–.)ø™µ’†QM¹Aêœhy=Ë6)Ù:fÄí ¢H¢€±PÞVk6rxr &ü"x &ŒR•Á E€aL¥÷]¥Cžâûž‚»®Ò·³³  p C àã óyŽY]™™±l’µÖ¢Ze™¢gTQÀ3UNÓêUM½>·d¨Ê>âAvÎtÛûJ ÌL+¨T'yXËZê<“x©Ü>:¯òº³ð«¹ƒUåщ&ƒ,‚‚&AÕ ‘3ÙFé¯r2‡Üè¶áÓ)ÿž«ÃyîéQ ^vÜuέž»ñÅt$è©¢“WÆä;¹NÇ»>It#•BNO¬¯ >Y¶I^ W‰­8Õ¶úÓD77Fç´¯L8ý– E+Z¨2Až-uí\w"ÞõYç›Ç`˜øÊãKÖŽ·]ìדKÖ&)‚“S?]W9CÕ @é§óô×4õ…[¯=û¬úcÑh¾Š] ¶Âg‘y[‘â‘‚ꛡ”þp&9Û¹4?9\Ä—Ãñ+–ËÈùpüÚ+‰‹áø_B-·Ãmãm^òQ4¶‚@W-C±*«Iœ¤“WÛKþàiЫ*¥4[U…ÅÓÁ7,7Iø{cëÍ@ׂF0É3DÁ(4rCnŒ~8×ÚÔÄëù­ŸýÂxHn’䟱JIB%é‡ùâÏ¿%j €–è¶‘^®‘$žNøÈn/Ù;ƃ^?Á;{ý¤§’6NG=cÔb[ef•éyYHQ|ªZEH)3í~ò¾l/#{ÇߟýÀŸkd§“ì¨$û|ä½5›W•*j>¦Ñ4âT¦”ÙŒei¶"ÈLNSicÙYGz’¡’wø¹óã‘Øá%ËKU& ‚0RUï˜Êsý–Ö§¦‘mm܈·£ÚºÙ¢(˜$¬‘öZ.m ¼Ï[ÜÙ)v5›²Ò5®ÜÔ–jòNòòy¯ƒ¬xU :Ù«~²â'ü’í þ>¤Á¿°øGÛ]6wð×­íä­¨<;IÜÀ§†¸f’m°²xÔ[ðÒ½Û>ÂSþsOÿ¥Fðôþ&ˆ¹R'J6ªˆØADHKylHÌ óå¬=mŸ9T•3â…Ff|ë.vnzÑbµŒß‡ zÆÒ©,PmWFÚç¬{¾ÒxŠïT•îš–m4ˆZØAê…,&”i?wäŽz ¿wMõ• V”ª e¯¨È•ÚT{HŠª™bUöΜ|sNñw¾Š¯¼s¾vý©8'žaÖ¨Dj£˜v"ã‡P­Åô½«݃”0äoqØdÁœ4QAGUóØo‡µ6â*ñ¹rîV½õR†&a­aŒè£ð“…öLË¥ ÀfÖ=Wñmç¬#ùS°˜ FÓQ½¤(Vª9Yìtæ!;?på\«,zc¢UR%0E•$3¦©´ª}³PÜýÊÜacÔ7kôeû`EÁü “^„‘T£b0‹4CkÒèmgù¨§ä—ã¶*yÿÛÿ=`^=ðÜ©Ìé¯p”£ü•T5®ó5‚'Á‰D÷‰ŽÄÉñ“9˜è:öÚ›â+w®åž‰¯H-Ys¢}õoǘ±1Ážl’U{~ÓöžÅËÑâñÅ+Ow¬=öDBð ÛºpÄCŠ|{ݤè0»PãLÓÎcõ‘KáØÕç§$ÙþPk åJ r C$W8?Z¯†ã¡xCZè¯Ü µáüF0öM¨í|}ó…š…_7ÆoÌo¨io»ƒ-} ‘ÁÖ«H“¼í™@ÄgK?Tæ¾ÙÐü·†ÈK&³‰—9ŒéøZfŒ.Ê̆Fn…ÃNW¡‘ùãVÐhäòØóØÖçKФP¾ºóÑG††Fþup†<‹Ñ€ä‡IwïÜ`ªÞ&èQòh€cy¼÷éeÏÞZÒøÈÎ ~[8&öÏ!{teÙY”zZ&Ú˜N¡#SÓ(ÓçYɦ²¯†ì©HÙé'»Æß.šØî&{ªI‡ë‚*l7C*0Éu9©sÈ–jþi¯ŸôÖm‹Å¤HšÔôÔ_§±Q\ÀŸdÉÒJ+žF£ÑŒf4»+ñllÀÆ{ù¾0ÞÙµ—Ëöú|­×öÖ4å «€ cN‹‰Ä¥n¥_š¦ßú¡­š¦! GìrÛìô?K*U·yõdW3ïò›÷ÿ=Ó/9 G½œðì‚óã©r,@×Yx|B*ñ ÙÛFÍòó-ƒ]ä`9&‡#qÝë$‹Œ…À"]ƒû;ÉÁ>2“´$ä@LAoÇ2ÜOÞj'Û[™tK2CãdJ}d÷&òN? ÿ¬‘Á¹Ûê74²FÝFP9D¹]b¯W"ƒš‡^öç‰çÔÏ‘,³,'Á4ÙˆW{†öÌ"³r"+XEúY‘cZÍÓkíÕå·Õ¢»Þü,›Â1Œ„mc˶q\ QºU½B”M«9Qï½¶è¾ÏÓŸ¤$3"¦¯Ђ ŒwçNV;Öäè>×KKd–š!QXÊ›‘-ù d½G¯)Ñ1¯Ôk\÷½åÝ©éBœål•‡‚D’¬÷Ôâ5ï†LwΨõ‹B9 kBיּJpqV ûÀªÂw²Sa ÀHžU(cåX-AzX]¬×èÚR4‡¦¯Wv¦,á%ÎÆRÉ@¨)ýÜá˜4fÛ5­ºn{*&›åÀ$"š²yþ`vÆ]o‰^S<¡:ïyÝÆÝ˜¾>ËËN(º%³¨ «ŠZØø«U+t_9¤Ü>öæj†úz!=Ufü¥·ª–éµ…óÒR8•%Ê+Ë”ÔK¿Üu®û×㽆.ôí¸1òŠ˜¿ vê7¶d9vÕÏv¿Žª 8äÓž„¶^Ø²çØæé8ü˜iI®}¬ošÆ÷ŸGvÁ-þ 8ñb A¹Þ†ò„"GÖ¼†ea…È%iEFæõ†Ð ]ß5v^ .˜FÐ4@r#Øy»¡óN0t=hPÒØ¼ÜYiUdÖl–̼D²¸eiÞøªæ°,Qßön¹§ßî<[îýÓšõàÁ|Û½ÜÜ…vÿÙ*þѾVßqg]ÛÍá« íki›lêøª%ô~I “S’)Ÿ3X"IŸø¿ vNכ÷C—_¾â®‚aÍapñ§ÆP8#Áúò‹?èÑ'ØøÙ ø5ûð˜ã3õjB²ÄZpœ±X2ROFd|3_´è&ow‘C²{£9/M13 HWùÕr¸Ÿí#ýä­ì'û{È‘>2°‰¶¯%=õxÄ´ºçÙŽÏä„x‰Òíîï&û»È`ÏUPŒ@Ã}doŽæ²eY,6#ÈttYöOiÔ¨ÊEZMxK<&žS#/½Bù9Hñæ$‡GÄÆTxVáDD8‹Üùm¡kV-›T §½NÝŸLß—• °¢¨°€!ðÕÞÏI»Sí˜Õ캯%êwNzÝçíFˆóœÅ`€Gð G%H^àáÍÌT…§EÎh–e-{hqÊ„'ïQ ÿ¦ÇõUèªë¡ßÕÜS^×7Î ™a)2A!Ë<Ì×Ù,Q_Ѭšw_-„I¢¾‚Õ6 6"™‡7l‚Ñ5Äâ|¬9©Å²Òe–áQfB_¨óâòWïy—?Ò\Q­d“©ÚQÕï\91b° ÈA^”Ab¥}Y)SZ^Ô_ðH+ùKi…Èad‹qãx™1GÒ2F³²a’=Y‹Ó0ÌáÅYKZS2¬”£¼(‰Š•iPâÇœÀÄ’ûÀãKté¤f_¨õfÃN3ª3€UôHuϪ?…_SþÈ«­N²±"]Äqñ<ÝS»~¾ÑÿqÏŽóá­—6ï>׿ÓHÿÞã‘7.†·~ÞöÁÖßÔæ("^Wš,ÊÜü-êÚ÷"0`Ü6ÜÚ•Ãˉþkü ¨ã™¤AÓãáí÷>‰¼Ž *NLey“Lß+ñLCmhû®µ÷‡ú…¡Ê×M¡Ûõí·;¯5u|ßÐv¥52Xæ·òf#örñ6AÂO­pÂwù×Í=“uá’Äjd‘ÿ½Öø÷Æ®ù¶ûCSè2LÒØyY_ßþmpÓÆŽŸêÛ&ê^»ÒÒñçú ß7¶ßjí=_éß”šY“žIÏøB­™¾ v|ÕÔ @#×ZÂ/{~à´›-=WÖnºÖ.NIEã ¡HòÿRÇœYçX„¼×¼h"ûyrÜûÒSõ8°¡‘S2ê!GäÝ QFÖ‘cAr²‘œ\GFý†UÎÔ7ñ75*fÕ4¶L!ýnr:@ÆjÉÑHódT3„s&@NÅ~B8‡ë…E,-‘˜âdrd óãUF'œOðl$`ÞXHY³ÄKÊ1«JÈ`'9Øc侑øÝFÁÅPñå|52{ꉆzM­ΕIËrɶæ¸Áþ¸½°G9!C1Šl_Ϭ)£‹¬ ^Æâ\2ÔgVa×g$Þd2ÅgZ˜A—C½Fß êtÍ­ ð&d´»/ªC}tc@`Y+Ï‹Ô\%s7ªË§T‡îwÌÔ"ϩAR8üàYEH¤æ¤´‰•Þûj%"þ™Ñ}¥·ª³¾|]sê5Eº¯à®·h.Œ»–ÞSѰ¡@× <ð~êÎK#QÍDÒm2gèÈÂJ²žeQé—`K÷;g½ùÓZùÛèµî»ª3ª–mxÅ*IR2•YRèÿM#hý#göCÍ>íCø–L©nTõXuC#x±Ág¨óß¹ï³ë~÷Œ·è\Þ2ÀÀE§0E1.œX9j²qLG9É$Hf«@­Ôœ„ÆxžŠ# 6–žÎÉŒ‚@>&P÷C#EÓÞÜÓÈ¿ˆ¯÷ئ®;àGBB²déêêèêè^Ý+_[v^@á™—ÁIL±¯]< ‰í$¼ó°±c0µ¼ J)P(P PV¦îU^¥”nÕVmÒ6õíi´<&V äå}¡ü5”è(¹±|ÏùÝsÏùý>¿=În¯é1\üôFz|…)oéeîñ¢¨IñWõ£‘Õ­þŸÅ׺¬õ—Kß<½bÓÙ43N-]sfYëçÉM4­,ËŽ÷!*(ªTh6Só‹7¿`¹17¹óÇaÝI8’È/M#Ÿ$ÖŸK´B#'ãëN'ÖÃ<Ç[ÖL´e+³ILSÙ—¾ÐípôÛpÓÅÚ赚¦ÁÒÈåPóݺø…êE×k›Û´ì(rçË*4b¥˜)l!j£ÔÁVÀt‡Y(alŸÛ÷M06J·RFGiê¥`S;a€ãÞ5·‡›¿ 6¶oÔÅn¤MòŸºøÅÚæ‹¡¦[µKï£0Àß‚ÿ Çn…[¾¬]r¹>v3½n¾Rë5wT7\ªixÕóÓQÓ„±nÖÅ¿ EGHØŠ,CÓó†ç¾˜Eúúïo^³^a ”J&òF9RÍðª«ê¾9äjkš=>lrÐM~>ƒópŠl÷“3äªKq’)~°l"NJ¢\5’ìŸEŽ/ç‡SÉûèâ šÚfI‘òœ™£³T$=–Ë4™Qó4;Ùí!GgC•䃚ÁçÇí b›=dë\Q2¡:ذâólä&²3FvµÀ¼”oO—õÝÀÉ)‚Æ)’öL[Ù¿’¼#’ÝI²-B¶ÇøÅ{«H[Ô´À'åQ»EeÌ&R!ÇB6-&[Eg@Š˜f»ñM²½™wøî2ÒC“<½-åná”jáhÙ—4mj2ÍÈ”U^Ò˜éEãR†«Ë[ð_¿y{Ðùñ5‚mŨ„Y²3~øœc³ôy§öûJ`Œ§¶~oAÊ?¡ß]LèõŒGŸý^çßägiä+W!…Fz½®t E=¾Ò?–?K#)_ñ}crM< Hü4§RÆt\ɦ»ži(ô÷fŽKùKïyÝ=^W¯§‘Ü«œÐï{mG^H `XŒ½, 7Ø©Ç_òX#ÝiüÞU€ÊûX#Xcx ®£8å+Á$oÏËv`·"sQñPªÚ%UÂv`l„¬ñ}¡jbúôª‰ÜÒ¨h•™&ˆvI±ó—"ì“wßSÚï›øÇߦü®>_ñ`­ŸþàÎÀ˜`8Eú¸F&ö]žò Ãª š*š“å3O®jhõÿ¢eÃùä¦_Eß8[s&¶9_w*±þT|ÝÖ@ÝX¼“ «ªlÕ¹Ip•Ur­¢”!«‚ɬëºÊ”\{ÆËÒȯãkϯØüil“Î,ßøî¢X¦Èd¾²hEFö…Ú(*òõpäb¨ùZhp(‚vªi„p}hš²ªÅò–e‰º®!?MÍÉsê6àDÀ’Ò˜(šÜ6Û>·?½û˜?;çßõ‰®øWõ’Îyq˜äÊœE7j£íó_>ó†·¸“J·•Ï8g„:ê—uÎKü}îâ‹õ±Ë5 ¸å æóÆAüzàwg(úU`^&ÅæãI©znÕ‹i$•êýø£ãP¯ÎT&™…y%dŸò¼òªztnzpb6/ú‡d¿´¹ÔàXyªCɨ&ò*DEÊQ1 Èo:e“&˜}²/ÖHå€ÇýÉd5˜ŸU–­C~ŠG–ìºYR·3Ì"UÍCŠÉ1P§’ô‘ÃUƒÏ'Úa9:‹¼–F"ƒH9ÈIJL6Ì{„^ÍÓÅ¥gœìˆ¾ˆF8l¼«½ðL”[îYI¶ÇI²Î<¥PpXðƒU‡£ Õ™¯Cj^äç"ڸزj¡éÍE¦·À$¿wGš7ÛÓ×ÏpÚ›äFp½+ ™(¿¨ªÈ¯é´Çã¾ã)îóõûŸ?P#˜Äϳ:Ï´R C.úŒQ(»Ïhå]•®~?/Ž©×˺ŒI÷QÊy·O×È_Ê Ó…¬ Û(åÍ[€ñás4ÒmLd0¨'³3–)™nygÀ!ù©@ù}£ì.xãsÝòŽï÷;ø§·ææh sH* ÓKÓãé6ŠÀ]iôÅèê®Âï5"ËXßk¤›C®¸Ïpï3œÉ‚¨䲆£Š¬Û™ŠŠ0Q©"AMUT³DûHjͦSª©L”tÎEPÍ?{ÇS†GîòLK`€{³&ÖúéN7P­7­ WVŒIS4›,iºE?ј<™X=ÐêÿÛDëéØÚ³«·œY¹ùó䦳ñõ§–®9³¬õtbÃÉß7Ì/«g±còDAKð~5UÅrã/‘Õ²C  S}/K#÷ìòéÜòÐȉ•#Óý*+xÏŒ®)tµÏ‹_­i¼Ž^5u„£ƒ¥0àBõ’;ó“ÿøÑ§ÝjE$#¬Ìša#ÏÜÆoUÇn/Xý'ÿüæacE+@b®päP*Ú˜Ô6ijGm¤3Ø0Ðq;ëb—æ,ì¬Bb¡È…päXE äÈÆû€UÝ`ç1Êù³)þ[ó—Ý E0]×ëc×ë¢W«®›ÚƒÉ«žŸNŒ[i¯iDxYŠŒDME±mËÖ³HOï×þ+V Æ³>•§ç’UäXà•WÕã³ÉG³É.]Xd9Fžà­Ô. É¢Ì&"_¨Vf³0²R–Cf™*Õ™hU$kž"ÎÉ!f‘ãrÄ7Ðq-UNÆ‹ÈDdMUÕT ŽzÕ‡*f9“É•ÃÉîùx69<2¸‘O´#€¸ UùšhÊI˜"„+ÈÎÄ#À!»Òý‘O¨ÜÈïJ78dwË÷~LV×Ks¦›Çæ ŸcØ)CÞ°¼RdÊ O`¨j“ÆDˆ´5§IƒN–òHÞjLwá}¢=G#ˆ|z¨Ä¿3¿¼-*æç("Ë”5š>)Ÿò•¥Œ’ß Uj„=Ô&MRP,•×ÿè>~ËSÚ}ÃÝï›Üë)ýn¦óŽgR·§$埔2ŠŸ©‘Ò‚ó±Fx'à_|øôîH¶nKW`1:x3ÿÆY”z} äÐ…ø=%wŒÒ”¿ì•cS³Ê»fLñgYöðydE’ÿO|Ç6‘ÝqR$K–¬Ñhô4#|È ×nŒh€8¶cÈáÄ$öŒI„IÇæLb'Ž$°‚mNè®"(›aaIèR¨»"@n¯Ýª]©ÿl»­ ÜGX(”r4q»¿çPínV–žF3V2¿7oæ½ïç½*ð4ûãÒˆ5fÓMkdJÌ[}‘› _ö´FðsˆFmºˆ`:gX*Á)›³)è&ÛUJªb©yð¥àY˜MQ02–‘1¤Óà TQÈ,QÊ)Ž“-Â’^­æŸÅ9±•y1;4 ò¸53i‰CÆŸ}KÿolyÕT†–+%öÛÛÔv:°%áô÷ÿøÌ;?ù¸©µ«¬º£dõpK×4 †ƒmpr2ØöISûÑpkÏÆ€K——ß*MÃŽFö„ ¤ ص‹öVÐL 2n‡ê¿jÙv:Øv¤¥Ý˜:_…9x•jŸ²UÝ„°«ò=t7BØÝv5$K#w\õ]¾îÀpaù”hJCÑë2tWÜþUzÇÝ¡Oàkdž‘µÁ¯\ÞÎ…KaS&ci‹’Á*šú]ùº .ïˆ+a\®òÂï8½#Žš{6]á°hReR‰–†WÁ9K“é#¡$¹ þh¡ý>€­ÊG`qzïzà™.ߟ+.ßj»¡€ªqdÖzüÄËid*ûϨ:5n…µp¡þÒמª½f4ètY(-Å…d?¾ÝV*EÌH`é…¬a3Ó‰FH✘ÖÈ´LÕQA˜ÜawèÙeWÍ,Ã|-ËC¤ÂÎ…Áä¨àK”pš®¡V¡ÎZÔÛ¯îG{›ÐŽz"à´ÝMä&LŸü°Žü¨'Dy„ é@oXZSN¾ )Ô¹©x¢Ä4j3E¬9IçÇ jD K97 Ì0Êšªxj3GDݤ-û{Û”mᨰ„Ä¢Hnµé#‚~ Ò|üyY6ɲÿiNà~œI#Q!B¿±V ½Â°üƒ”h†¥Ök”“Ö¢˜£ð²#v¿˜Ý³›¿ÔëµrV)ƒL'“!»ÃW£èÞç¹Ù0\£VÒ±Q«~R€Á1<¯ö9&¬ºQ«ñ’ÙÄÐ)$¼h¢Žã–ÈÙC™K¢BIL4ÇìÅ1ûŠIÁ [ó"bqÔV?NZó¢6P–éV©9&ŠúÇ¥9Om†§¢á¡˜´ï'b‹Žà1xïð˜¢)"ÏrT´K&Ãi©³Ö5Ÿ µž %€¦Î¡Ð»n£y!–gaþHsI°íT¸ýlSçg-ÛÎ7už ´ý2Üñi¸ýDKÇ–Š5ðÇ…iéé4«S¥9uyû6ÏnÚþÊ4jÿ$ Õ; .ÝãkÖ0¬œåä4mV§^tù¯:ëîz¾©ö@Â:ë’¥‘‘ªºËÕõW+|›¤ÓÐ |ˆKª/µ€¥ëUÞ•µÜ=A8¿o 5§à¥,ÂÏÄì5·ÿkçÆ[ž„5rÕUwÝãÿÆÕðÐÕøU…wí- i¨ææ@:ìD‡èC,'}ƒÖoM¶=¾ÓúhP ÿa¹<Ãðþaȱ¨s=Ú$Q™QÞ$é %¬ÀOã!r¢¾&¸‰¬²æ— “Iƒr°6jx©%m^ƒvоú(N‘÷êPo#Ú|ÆIOü|gi’¾ëNw'"гþë½>CËHh «È%¿È|û©ó“ÎÔ/W2 #å©ÃåÍÜñkL,tßÛböecöåÜcbÁh©)V–ߪ{$èfÒÈMÙPÊMØr'AB\Â3i$"dAèÿu¹)MQ•4Ð’UÃf‹“¿Å2™‹oZ tnÌž]i =±|a2ÖÎ&ûV5¬|<=—¢iù+ÓOá?˜tÐí1›.&æƒF`&l†Ïs³ Æw5U"`$Áø $ßB…¾`¹‚á$˜£1U“ª¼fY[¹lJ4<²êǬÆQÛ"x–©•ò2¯šõãö xoR4E#zbË™ qtc¢>iŸÐ´CàhÕƒF€"O¬†û+²=ij #…ýÖ²3Á­€‡Óám‰¦ÿñ–޵¹E°yÁ žË)6¯tkÜz.Üy²¹s8Ü~*Ðz.ÔñëMÛÏ7u NZá8Üðî¹æ.0ñpëÉM]¿ßÒ}Þ»õ•i$Ðv"ÜÕ? uœoÙXQN¶6,ËÓô¦ÅÆ»îð%—÷ǽº4r«2i>´õs”9$-ÇmÈ4þÛÝ|Çé½¾6øêú ¥*ßwýmÿ‘«¡[gá`ßAìÃuo/ºíª¿æª½éN¸ÿP÷BEÍ5§÷ñºÍçìk20+eÈ=½sÒÿT¾îž»ù¸eµ=}œl(° ãþ\ó%—ï'p mM4r¯Ú?²6ðF4â¿áôT ˜¼J95y9L‘CÔé®RM14)j3“ Ý© è/Eƒ.ºTÃò2>+v,¥j—¡nõ•£h° ¡4(ºü¼uJW«d7k[>:XŠÛSú¯{L@Ûó¥ûÝh°}\FJü¬,BGHÅhHDƒÐ· Ô'¢ý¥ä2éüøV;+! p¨òÞ’óJxiŠF;z߇zÃhG=ê  Ý!’éÖüãÎ8Hà²í HÛë8’h[˜[”.ÙhGÝõ¨·uÐÞz¿ŽÈô’Ù?ÖÅOÂÄ»â°é ?ÓÈõ§ñ¥>ˆw›ˆ(þÇ=>YuiÖH93Ò< õÔb˜ ’ÎÔ©šbxšâ(ìþ4œ|½R-þ—ør‰êÊãøILH&™äææææäÞÜɽ3áíÊ>Ç(Ïy)df(Vy Ì"Ûø€ÁÖî.Úªµ­Va‹ÝmRm]->¢mwmÝ×?ûO³kET*¶¾ð(3û½l›˜lùƒFÃðrïÜs~çœß=ç÷ýü¢¥ŠÈ¨Ÿ´2ƒ¾26Æc0„ÑÂ8€Äžv¦ÍF#ÌJy`ËÂp˜ÀÌ µÙ2/ŸF&àÍ‘7UV+S ^D:“9.†S"(#2Áxa¸hù”5õ‘5žO¤/*5ðZŽaU"8u-<}V4"³ôϹ&¢@#΂ ¬ÅaB<Ï›S¤ñi™´e©4²ÚrÛºòåEñ<8J§‹¤R4XÙˆ£‰!GÖ„3í¶=5ì̸ïÀÿœ¿æ™òEMY$÷7KfØnžr˜ðX2n3ݶe>°¥‡ìé`€{öÜùÚ?¡LÌdÒž Y¹T¦\¤ï[IÒÉG|';6Ÿnï=Ø1WõßéÞL%Žçj)åÅwm|ض¤*8èþ$Ð}Ü¿õ$h§£÷lG/žW†ÚƒG6öÀ޶nù¬kÎãÎfð|¤}Û6?õ÷àzE4*+¼gl0á@ó¦§B³ºùŸ®õ×¼¾1Ïü lԽᢻñ®·€¡U$ìü¾¬’k•Íc®†ÕM×\õ£žÆÞæa׆OÃXïD‘Ö H È}æÒ+këÇ_ô»ëæ:î]WÃH]àkwÓ¨Çÿ¡Õ­c@BÔ¢u5Ôú¯UÖOÖv~¹z]AdŒ†eôTÚdLþ—§ñŽ·õÒÚ Oî¦[ÞÖ‹k×?ïøŒy[þ]UµÚ—,P-«Ñët–œpèçÁHx “á½»ö!qx^âXúRùàù«ê€gÁ[NrÐIÞÌ%%*ÿ“ÃŪÔ®&ƒäÀÍoœ¤ÝDúd°òÉØ Q>С䋼o%ƒÅs÷p9é/!ƒEäÐ áì/$¿uƒ«•b£ÀÉœ.J‰×/l(%¿/'”þùfŸ0;yK¨ ƒ…¤×¢e# T/—%’]3(Ò>Ã!¾”}®42‹ ©lUé®%¯Tby­™ìn!o·‘}vw’>C§zýVçS,Ѧ2’:¥™ö¯Ï}> “]­ÚÅq‘ê&–#^3êCŽ¢I{¤0ìÌ„6MØÌag~ØžY™/5 Ûó&™ãÖeagöC‡é®=ãssZ4ËBçd‹¯ͧr,Ï>±æß·™&¬{ËŽä…oÊêô¬Ä +ÑHž~aN ÙsC¶ì3† ÜâGÇ­ËÃŽÂUQŠÂ+¬,T\QL'iZ ï8,÷  ÝÆ…H1+ij`KÌŸCˆ(„ë¡JÙ ˆ`~ž Fb(UxNMJœZnO2{¦méauæ/,i)‘<²qvdÝ++4ë8è0è¶®  "~Þ<ëϦò ˆû±Ö-mìc|Ú<èù¸k{zl‚,Ëž$i¹lèµUðoCËSþî3›^=ÒÜY×ì/+ïu½Ôïû%úH>iÝŠ¾ç:_ù¨e3\Á'å™ÑH[ïÑÎÞS˜ž¿{gk'TèNy.Uྪi¾ãñ]©n¾\Ý õún¹æFª®V7WÝÆË*ËacÍ%×=;®Æ«^ßמ¦ß÷îf¨ÿX­ÿfUï-NÀ'à°gmUÿ©m÷4]÷ÔÏæÿŠ»q¸Æ?ìmù¦Ú÷ýÚÆ©º®¿”¯ûª6pÕÕ4 ‡5[.ßQG•Ì2£i^œz ¹š.×6ßòÔÔµÖ-[†sÓ±%qñß«nx[01pÈew# eC?çø€Á¾õú•T(êQUÓWWÀÿ0<ýóhä X$¾pîKI(ÇéQÎØÈ@ÙsWUÀÆ{N•(€" ¸È;kT¨^°ÃÁ5äJÅ ÅE­¢Q^0‘ýv.%ÏR>JKÞ-Tƒ%s÷2òž•¼QD^.%»Ö¨Ô_)®Œc“tHjŒ†*,éÊ#‡ŠÉàšùfÿ³+é_CúËÉïä2n!É‹8ËB”žד½U¾a{ å¾{64BvTiô͸ÝÓAö¶“ÞuQVjZ,¤%òɼÍB|•*–ì!"àоµý®Vòf@5ÀÉœ‡Ær:4/: †’‚„ q*Ü? ,a{î¤Õ4eK{bϸo5?±æ†¹SöÌùR“)kΤ#ã!DÙ‰[UM.äš"9^æ…9>H.؇ E!¦¶åMAÇU‘ÊþUr´B9QÐEòš©åÇÏIš¶YBvó#{ö#UÔ̸ÅxÄ©0" 1º #ºÃIxUÖÝR8\qi¥Å­£œ–QD‰êP™R Å­(Ï`€žc"µ2Ï2:Ó‘D*+ ŽÅØC |lÍ 93«„°Â¥`æø~D2EzÒ„l¬©·­)!{N_2ËáMR‰¨H9„B¸4ä¬ËFóB–Iæ š¢˜L’±cÌ´M%½=o•˜-1.ù-Y…".<§ãQUÄJ\¡Lk ²^fE‘Ñ1ÚŽ‹¡4BÒê¶AoxTÆËüL;̪Í+`&áUùã¦=c¢t)Þø´”dŽA¨eQŠ£ÒÁöÍà‡ÏÁ3mÁc=³©ü‰@÷ÙŽí§ÛƒÇ;{Aç=Cí={ê|2(WU-§S^õÖmzeÈ¿íôÆí’w;K–¤) gäE#ÃÇjÙróŠýÚÏnë;ÕÖ\A³¡ö੎ޡ–­ÏŠFNµvÜ„ÿ“þm­ö QT“vêzcâÅßwk†½¾Ë?JÞ˜gÞh亻aÄÓô§ep1?*þ[oÇpMˉ/Û˜¨®4ŽŸ¤‰É$7¹¹¹99¹7çf^2 PÐA¤E˜Þ]`ÞVÐafÐÒ*03‚´±[ëëÖl+ŤB­ ¶›Ø—Ø5[Y÷C»q³ÙÝn÷ÃîfSëK*ëëÆ¨  8³ÿ;ûq× ÉÉäÞ;ç<çÜÿ¹çùÿxýD°óöÆÄåHô» ¯ý‰á:¾¢¯¬r*êÅH÷¥p×]i{:í„¢…¢—Â10É×¶5šV¨°MËVl/©ú¬®ùë;Ï­ßì2[2Êùúƾë:/mŠcU nnÉË3Š¢i#®Ú¿EÒh켓¦¨wmáõ’Ýõ¼_Z£R=סH9öÁ“sÏF#©ä FNþû¾ÍheÑ¢jr±JN,¼ Ÿò’±:rj 9ÝD>l!ûRGµðӥ̆-× ŠCM¤Š Óªœd¬…5fl¢Ä–HkMd¸‰ŒøÉGyÏ;ÖDNù¥æÉfâÅ6²ËAŽ®33n’ øÅ”šjÈB·S2ÒBŽÏ?þ‚Óˆœ\GŽùÈ/›È±&ê±›% ZÛ¥`=9ÚOºu€Ÿ Åuº8ÚG:Ép/y¯[Øäò­V‰bjÙ¬¡°À¤°yn9ðè%‡ãäÈV'Þ’¡­äPOzUó¥ O‚ ô²B$KE¡’U6¼iÏ…ç>ö¹f=EIŸsÒ³jÚ]žj¬ZD7y詜ó:¹W‚fJR޲߻JQ)ht~MÒ U„k©jHù«“Þ¢”¯,åw½»Âʘ 2ªJØo]uTjßTäÏyÊ“À¡tÃnñ¡º¡3†` †#Èü×­*À9q×f(²h0p žB©nX\uà0#‰¬Ü,«B©*½ ‹FYCµ‚±WdÈÖ’`!Ö¶*dòլʹp0†>1“Ò@"«KR5©F@Zqª±üÈrýd…F$•éü Q… Mg*÷JÈ1¿-wh 2БD%#€$â<+¶ø¯ì±×‰†PWµÏžca‚… š,€”p Ì` ܪKE%#ÇÑÎU\Â(8­@Q68$`pHÒ_¾è42ívâ÷v½cV‡ÏÒËk\ÅÜ"á5Tà[×ßÙŸí?@çú÷=Íå¿è݉>¿E‡¾=¸=—ØõEÿîÎZ¯‰©(å, o«X‹' Àéø[Ã¥æLI”¸É$K„2k&A–ê–¯|5~¦W§ü2¾“‡žŒÇwýjÛž_'v"æê¥ùø`°aš,R€ÁM¬ß|¥­ûr¨ë̺µs"[4 n¹Ò»Ú–h·Ùá qMQθ[wÛ÷Âñ;ÁèÍ`×­Hür8ö?\¢qêí¯ÛWÞÞÔ{¤Ñ*è|Zü‰¶n ÍÝP÷õÖèM½ãð2*rU˜áYÉÁÔšœ|ø²MáÅŠék߯¡øíÖø½Pâ¼»µ@þS»jºÐ¹ŽÞlíºìºÑÖ} 4ÒÚy3Ò½ÐúüìxI´ç½„󉃊ÔñÝ·N%“ÏJ#sS:—*-xIPe#Ue«DF‚ îª#^rÒGƼäWXmBÁ’Í‘+$.é$$2ýŦHTP¬Œ÷†Ö‘·êI¢ü@>]OŽ4Ñù¯ó#‰Ÿ:4I´æ2N¶­ Ã~…sõ$*Éí%KŠp$QIHÂ^/nX|üøß6ÚLN@½ôE_µFQ¾*Èþ¦Â猯úË3)e®€F@ p[H¡ Dƒtº€^Äüc…ÓÈD35™˜F®©fXÁÁå3^hëzì+™ö§üeÉÆÚ‹µ®‚ìLd ¨­r³bRÀ8*¨ŠgÉJ>S-²*R£F3m¢Q¥V›ö‡Ê2 È´»t6ýÁè(²Ø4&½¥S^0‰3ÕTóN®E@*¤à5æ´d~Ú¿ûLôÍsðñ¾=gAOwùÏ·íf6trHìߺûó7öÖ­(Ò·LÕy'øêxßžñîç¶ïíÝ‘Í8ÀUûo¡0QaQä`SQj,Zuº×o¶íý* óêüðœhä|ßž¯ð.‰Ç·l[ÆTAgFngê÷Á8øÀº¥Þ EaÖ—FàïÛb¡è鿪Â!D«E oŒü3ˆµÅ®6o¹JÜmã¬;ØnËU…‹½HÙxý†‰–-÷#ñïC]?†:žÿZ8z#»î¹ìø{ËæáÕ ªŒêhºÕ—W¹†ÔÇTŽ£Y¢ðþ|ç‰úõûµ5Fë ¢!CáC+ú"» ÔCÌ+á(ÞZx¹¸aËý[ˬ(C€»&³yrr2õäÙiäaJ§‘öPP6ë@@U‘¼]¿à–z¼I÷Ó±‰(kìFQ\&sð„ø*…ð*Í\ ,#¯W’Câ&cëÈÉ^G>È1Dh™÷¼>Ö,—š)·ÃÄÉþUä“>!¤X”a:†%*9Ó¬ŠIze%mZ|öø?ÍGFÓ87 C~f×}ï‚lCvl$C}:ˆ‘!ÀC÷s£@Å!EÇ’ƒ}æ×šx•A°«Üo‘`,LÖ¸(IXIŽf2‰²!XCâd0¦H“Ì`O–æ9ï‘2Ø þ!‡úLeEªf*š@åW²øµµ«RM®iwá¬E®kÊW±XV¢ÓˆÛ•øJžøk’ÞªY¯ë|YaŽ Aäy5ȨPÐà©Èp­¡ò®§|Úû“)oõû¹Ù .ÿÃ|ÙÇ6qÞqü‘&EŠdÉ:N§;ugËvh ïØNÇIÇöÝ%^8N t)8qâà¼LEB íÄKa VBGaZ)myYK[­Z÷WµíŸmÕʘ #†·òîÛ÷Ÿ“‚@©ôÈz|÷ûýžçù=÷<ßÏ¢Ešf‘u†ýKɪɠ>9E$.üÅC¼‚Ì` 8ÂA zÓÁÂ9¨žR¨©ŽGŠ÷š·8µ,K !D8¸ùL<Ï£¸³3LE9xÃÁ–Á ¯$q& Wkahýndø°]¸ðhÕeÓr14tJ´ehkòF,ùuxK·£8¾rMIÊFuÀ ¸ãõ€I\ ¡LÚhE+ö‹ÖIžâÙÍë\V›n<"qàÇ­¨s¨114Ïr/:?7c­W#q«ßE¸ü]ÏpbföiDKÏ»kÇŽ2¢f1ò"–+xá’ú^#yG%¿’þ†ÌæR*‹¥).bËj– äd)9&gêI?¸àá'çÐ ’>…ôÕwUrV!ç€"òÂiDÿeª²mŒ™§Œä("×ÒÆ ÏšL9³‘ßU¢ÄÀ­Ë!çk<þ§QH?À,LúTI·ál½ªEýh¤Ëɉ.rlŽCÍ[žn%'Ûɉ6€©¼€X+DÊh1ó!鈒]/£ÃJ"MÑ8#KMäÕ­äd‡ÎGæ¡èøN“:îI¸À1¡¯«{«I9–Íü(uZ)ÑïpFê¢ìX,5™–=š-˜’Kf‚®±`þ7%k“K̵vqAm“$Ö™Ù¨EzE2'l¦»UŽ´ý­¼å/:›—[oÂVðmBu–¶›¯z×b¸yaÅÚ!ú.üÅC¼‚Ì` 8ÂA4Õ3r‚CÐ7hÕ%cªoÔï½QQ9°nmÂ*m@†õ¬q›EzcÅò?•`^­¦Ê*Ð4ÅâJ\†ô³<”²e‰ø X’V½“!礜?*:–k«\")6>ô’ø3‹©ÁbÙfïú½e̦dï@ÞòíVS£$F$“jE"$ é´‘:$iD2¿tçEì¦zÉÜ( 5V¡Îj‰ZÅwósgCÅAh·C'œP~:T’‚kµC•΂•¯æÚ¼"k–0€'ÆÆÑÙå³±§Ö/­ê? 5%^h?™ lH«® ½ï‹Û$܆vV`Œlõм]¯?¾ìÜÿiGï'©žßwîÿìé*}<èZŸÚ{Ðȇ;woZï¢ZiÖ»lå‰í©77½ìÏ]#TiFàx» Åܾ÷;÷öÅ»Üö¥8b´Àãm[™<Ü t“€F.?'Ñi¤C§¦ßvíöääŠ,Ë ÜO Ô‡Õ±ûQ]F‡Zn5& ª·£ Hê¿FFëw¶$¯b&±äi¿ªÚ홆L n?+ÍXå€~ŽÑïBŠ]Ó†ÌJ›õT°öÃÉÛ‘øµhó­§SÁ`¬ù:°ÆÄh}˃†ÖÁXòfÝ+ÿÜÿJõW¨ëŠd«}5ƒ±h|3°vG¯ —CQç½*"Û†ˆù}´ùf£ÞÁ“¬ñ¹X4_§ð;Z[ç™"ýl,2«¥5àÈôÜWß|md-á£e}K_¼ªªäœB>¨!çjH¯‰®"Iy»ôÕ‘ßÔ‘÷6“wÂäté ßÁ2@Nt 9=O# ŠS2é—Éyeᤠe$\vŠ)ŠÛæ"~Ñ,BàPX‘þúŸlËÉ´ÒfŽÎhZIúN;/ºUI€œ©!ýaÉÞÞ ldLÂçÚÉÁùÕ)oÕEüyÑÈ¡¤N#o§È›Û3sDAP¢F ¯mÓG<’ ÇÛÉ[)cLÉPœ¢£èˆŸO‘ãmäh›áXòYhäXy«M_Ñá8¢±r1˜ÙÌ ™,½Å"ýÕëšU=PÃiÅ )I/€‹4Å1,˜ º¡•3jÞ#Õñw_édhaM«ö?V¼¤±€o¤Ê­Ué[«qj²û~eéœL+¾YY÷ñ€gÔm…ŽNë(â@ñ¯`3ÃŽpGGA§VS’VŠ&ƒ×H•c¼Ê¡…Ëgd÷Ã*×ý€çì»ôÝ«*},›QÊÓJ¹VS|Í»Žå &ZLâK(ƒ(ÆDS—Û'Cî‰@ÑœâœSÖká¢ë%T6@0®w:T>âÉ”kjQ:”ß©PÉÂÊ~Mõ¥å²¹`1Rôh>]HR7¦ÓˆCOf¸èžß=ªÐԒDzg<䛪B†‹Òrñ¸¾Ñ®IP¨ìЀh!¶~"°zF)˜‹FîåÃþòoKÝtæ[êö§±vÙ5È›æÁë¡êž–Ÿ ܆F°q5%ãjÙùÈ +˜L.ÏŸ¬ßq±³W‡äžKí{ŸHù]ž¦ò È§;{€%èÿ!Õ Ç}á Õ¤ž£ŒÆe¼”e ùL£$I8JšMk/übÿ•Ö݈Ð.oätqe³8!î t÷^î>ðqr7怰ϑF®tô¼k2³º £º%Ëw©"ñÁ˜®¤·ë›!Ð7#ñ;‘æÁÅ£‘‘hÛp$~5Ò4ßnêð×Uü—ýº‰"½ãþ$$$$›l6“Éd&³Yvø‚'õ@^—wVvg†E@aÙEOyÝ…eéÑSDh½\=Ž;_@íU{z§U¯½¶wM®ÿ4ý§½—T=_°¢w*o=AØé÷Ù¾ýÑÔƒåš4y2†}^æ™Ýù~~bh˜†Á¡æ‚ °±ßaÅU:®è«Á0µñÆ6ß½r÷ §çvYí¨Ë3êø·*¸]^=ZV=æô|QQwmsÕ²šÏ·5Ž9Ñ ·ÆŠÌ>›EÀhd˜QïL?àhá†Ú–Oýoh¤#Î%CëÉ)…cñj%ƒ¹ä™Ï'édwéZGŽ•½UD‰"2„ü-!ƒE4ŽÑ}`ý‚çÀ¤ö Þbm8,K¿AŒ´¢‘a 9á"Gì!nE%’W7þ¥¶Ç¿6àíx9‚*&ƒ29™M†aF¼Q8Q¯gµZÒ¾&ø!ØBX$Š õxIO=y£ÅÐé†Ê±]”™ ä`.’#­tÒ¾V~w.ÒÆò1,ǤG“ý5T#½Mt=˾ÏÛÝLbÞÀñ`yµ†[¡cÎhІ¼9Y>Q<« ¸ÓT%y©Òä‰-KUR§i>ZTÅBâ˸…X?îBÎÆ%ó”-v^J˜¶&ŽS1b—ÌsŸÞÂlÝ.:¯…n da©ðƬœì—¢¦­kf”4µ0sFŠ÷îwÊ–öК2%a‘xîØŸ¹À«rê+.Òo‚_Š›–㦥˜9)úòÛ,ª„GCI£J‰ÀØÌ_ò÷'8hK¦¬Yƒ°XDFÇq‚h eù’Ô¤Ÿ5wžkxå]ïžË/ï?]û]8$¸Ð°û)AÿA@ ï¶t ×‡M4uüÈÓcŠ@½Â3¬E˜Ñ‹"-h9î¥ÊÙ¦=5íûØ×yn×>Gfn('à!G Ôµäÿ¸¹ýŒw÷…–Î+»º.{M#Xá¥æ½[³r@–§¸m5[î;w‚×¶6"F¿äøÍ-ÕðɨӽTù“à <ÚÚx§tûݲêq§ï—Êöüè$”~xåÒPËHLž_&è7.‹:c/B;8<×õ7+Üw+Ü·Ÿ’æÎúÑ-U\ טÃýÈÙpµ¬f¢Ì=á¨uT}é¬uÕ^+¯þ¢¢æjEÍ}—gÌá¹ãhüʱóJ¾«-ÎRŸc4\uÖaŠÑÊF` Á8£[èÉÍ篑ûϦ5/†²Ïp+ñãO~£Îû'ÕùgÓºÍùýssOpžm±àë‰aEŽ'½eäh>Î!§ "2¨Ð´Â'YŸfgÈAÃ"¸ŒœŽ7 €hŽÓüÁbQ ³§óÍ~%9®JæYɼä7ø-o_cóíY*HfM›•3çl©D¥LZcçíy?\³š×jhYÁ0«ÄгõOSÇ‚Zoe}º>Ì c!ÉeDyº‚Zsì—[º.zvã8âi;ÿò÷ׇGN+ò&-Ó窻ظç§;;Ï6·¿¿«ó¢oÁ`~ÞÒu¾¾ ƒ\ôu\ðí…C(™ÚGZ;W”6+Yv%Ë|dw!Ú–J÷ÊÝWËi¦•×?„Óý•£öFBŸo¿^#¹o¹|W7׎W4þN©èL·TÆ®Ý^ÕaNÿÐVrÇQ½Xëùcy-3Yî†R>/¯»_ÙôYiÕè6ßuWÕ-'Ú½Jïo˪¯W6>p6€+Ï{îº< â]Gý=§b{®;ê¾t¹oºšÍ¡¡ÀdÊOŽQý~´Ùg³H€"ÿpŒÏ똡åÈ+y4ò ‘a¤^ÍAhd¸hÑR1zÁj hD&ƒëÈ)%¨»TÍp&&”caÜž‰P‹q"£±dÿFrz39!‘þfNÁ$ù ž :šGÞ.%}%Z9Š ç´LHph'ï­§::±‘êh Ÿ¼Š¡"ª À , €D"CK¦‘~ùo9Ðö0{-›Ñ3¢Ž5rf…)h_yÓM€CÍ‹§Œ†æ‚—‰a ^ bpL®„j êrS ´’¦×hÔ²g³!ѨÓ1"¿ŠJLâxþº)[šßfžU,K7ßò†ìóËÉ~%ÅoK»½Á’d`t\H8¯y/nõg–äy)G-\ø¥L¿´íZ¶%7Bdx êNQ¬èX‰erÃÅ[9YøädAÒ¼œúÄ–ê—Rÿ¯‘ÿئ¬àGäüЖ†MS 3ðç„5I-²œIZ“ÀjobðZâ|Ê–K¾ÎÅÒȹæ½Ý5ÊZ³AË„²|8Ã'êMm›*Þ÷¶ŸnnÿÉNÊŒ‹m?رA çi¡ê'#Fšv_öuÀZ»Îûö^jZ¸F|Wš÷]ð¶_ÙÕõ^À!—š÷¡ýÂ×ÙVìÒó¢øöë=&ªìŽøI61™d’›““›“{s'ó  ]PAWäø†™[¦0ÃpgF«â¼ÈÔ5+ŠÒµZqEY ÊCìF·Ý‡Juݦi²4Mk›lëmt󵔻 2ôwFÛþÕl°cðürsfrïœsÏÍ=ßÏQ|xGÆâkϸ˜/Üs†o8·ÝÁñÏS|Ñèßø}ÝÓÂ…žï-·ù&]‘Ïê·>pGÿäðÜs…î8|76Ç®:ŸÛ<£ßèææëMÉÏHƒç«n‡ã¹êúm‹—*é‹v¿V|  üScýø¦ð˜Ã7¦¿Ø›¬oú‡âqz^ôüŒ)>@ȸ⇺Ýèƒ_K·ßo­[3`ãÉóBÖT¬Mhdf꿦xÄãñ'O¦ß;{Ö ˆkŽ#±¡JÁ§ëЙDC#Y©Ê’]f±ù‰ß_…º­ØYHEQÃaÁ’HDÓRlaN$*¾>v wdva-„ÁXæÜï)3#Ç ˆÂúÊq·Ãˆ]+Pl9kGCµìœAõ:ØÀú*XôCw}žÁiÈÁ$Ð? XÙ¨@#Ѐ!±ƒIH¾A#ñ’|J¹­µ¨Ë‡PgsÒ4r `DoÇ€¸"s\6/aBPÔ†˜7ºw ½ÞX;/=•t”’òåè€ýÔ:¼¨;Š:¨cîý‚F:ÃèpB0†Qt4Š^wé :Êöw‚@qgVƬ¼îIMÁýïÒðÛjVΟ1¯š¬Zy׸&ðjÆ-—I '¨¬Z!ñ›Òô'rs>.*¹RTÖ“³#=EOùtBV/ÅLBÕkt:µ$œX‘õ º ’ôëš¼¸¹ð±©xÊ ![4ï7ø²—©pÖ\ôX.ÌÔÌʅߘ Z ªê T%b‰JZL7då|زg82çôÿ_NœÝ¾§ÛÛrÈííÜä ¼~©õàåHÛùµŸ‹µõ{c¾õf ¡ð|)á$Ë*!—"mB­Ã-íLѹwÝÒà¹&aiý¸¥pª¹Ý·néJ^`³‰yîd¹éo÷”ù¡ÔD#dºrÛ¾mܸ“ˆÝ«NïÖÌIá>¨qŒ:¼È_9CŸ¹<÷á›vÏ5‡ï¦™vÇîÙ½£ÞÉÏ}Gð¦+Ü”»”Ò4ž×`XoyXS%­Ideù‘²ê_Éî;JàŸîàXÖ>Eï'³"„Í“Mч÷Ý 6ÈkÊ ÏïØµ3¡‘8 âù42“( ÉôôÔ_®_ç Š@‘- åA#:]›Ðˆ9™ôU¡3ïvÔ<¨ãÖªQ –à Ù"çÈQ·É*ßj©|‘^ÄYXÇ¥`´· ˜P¿1á Ì}<,Ç&VèC ê©C§¬è:%£ýF¾a…ƼLµ­ µW¡Aê¯G`˜5h(1ÐcŸŒz󦑧SÇF’Iâk¿&ŠJj &zL…ÂÔáCǶ£·’D¨£tÄŸ`I…Ô1 Ó,AvÕYÖ£°Cí6é—g§cšÛ*xmÔêÞZ˜#‘ÄåaÔC€Š9wdÇÃÁgé ¡ã@¬g_§%ž£Z­V'pWKÙîòKcÎüÇÍË]÷kò o ò‰€%,¤s”a™“ x‚Aþ”r‘(oÀDMyÈÇ%"윘ÎK)j¼D§YŸ·”L[ò™WÎZ V}]S ,™÷|É+^Sü\úLb)ŒËŪW=2N[J÷g-Ê¢ž‚Hµ:I×Ùüux÷•ííÉÒÈ%ð0`û>hÚu>¼`p>¸ `p%¼çBs[‰~¡žP ó°Ñ ©$uѱ¦@ârx  —?‡F€:?·^Lpú‚Ná8ÙÓ³¥9]ÒRAÐè4¯ò;[Ó˜;|³Ñ;_`id¢€Ø…´½«„n¸‚}²–Bë¶Ô´Ï¶Mºüö­£Nï]%ø³ªú®¢ ç×Ôý¦®éš38¶1|W $k<“®–*ÛRƒžãت.QjDŽ’^Ðc>•<&¶¼–ÿGûæ/7_øü(þIw£N?3[£oRñÃý¾±j@L…wß;Ç0ñ|€1ÿùƒ'SS SÓ$*BÄði<:ncéù·Fú,h >i‘:hE§*Ñð õÖ2çÄ*áUàI¥á ÎºÑ œY‡7pYj=Nƒå{‹ÑIê©B}&ö=Öçéº?å§M¨o:mDCà"+¿³ ç jAEa5X|5XcÉ{åÌÄ'™Y§=2›˼Q¤0.ªf42XËîæðmNUi%A‡ž ÜÎÍL‘¤i¤Ó:Cè­:A?ñc'Pö^r K°²HCÀ=…ÜLÔ@ÝÑg—wxQWuÍ}<Ð#ÜÅSVuÂ1ÄÃ~]n–žˆ¥œÄÿÀ@™Êgå‚y›—¼âr)ÈáVEY¾À©Πii¼ÀzK /ŠZQÔQ O‘›‚*¥RÊv’NÍKzªÅɦê+…³rIÜ’ÿؼ|Ê’7k.ž2•>°”ÍÔ|7ÿßV¦âGrY¼f˜ð¡¥(n)‹[Ö~Z²,rƪ×ai[µuøö+¡]—xHJ}üØñ&HàЈî…c\Š´}ûñ'!¦‘f¹!EÒêÉ›Q·~¿ñâ® -Íû~{óB¨ çϵß÷c{?lnc‰¶ÁíŠ.6· ·´{ÖšµÖZ€/iÎÊuÿªøÇß¼iDñº·ž Wð¶˜pø¯*~%-3•h%.…'ƒ•2peÂøûÆÈp}eF*^CH&¢æàjã\á‘D^'¥FAû’PÈb*n^¼Ü½8^C‰ °ºb­D5A§%ï_]1îò76½ðùq`fàE €mJà®;\™šÉ†{IøóЈbê¹>3 <ûŸµÊµO5BE‚Z«Xâ÷=Í_3ê5£Óöäi¤õT3oôZX/'ͪ-ù @Ž©hႱ_§±Q\wÀÿ’%K+­4=žf5«=´°ØŽjœ|d}‚ì=Y³>Öë]7l³Þ;.lŒ ¢ 6¶1øÀ±CAc áH*”FÍ—ªQ>4­A€˜#© -)‡½Ûÿ[Ú*ß"ÓEæCvÿÍÎÌ;öÍÌûÿÞH=ËþG‹YÞŸnäÜ«xªWKµéáÇ×WÀqÛ_l»ãÆ8clðF%#Ö[x¤öš8 OÔˆ¶]l»~V 5rÀÇšf,‰käh;ø«ÕJ•œ-PDò×~®ÙË–>Ý<Ûµß7¼Ÿ“^ Æ… Qp‚b… e.»Ð¼È‹"QŠ¢$*î rªÆáSñÙ’½ÄÈX†5Äì…,Y,«¬9QKþ‚¹52ÿ“F~,™ ¸Yq ^ú‡)/¶¡üZy‰GCñ’$ œhYi`y<ôêÉö.4@¢4rº}Ï©«íB{ï¬o'ºâ£Î}³]çpÛž™Ž=S¡‚¤àˆŽÐív×{‘®™m=(&¢`*wP‹m÷T„Ù%s6Ðu.´ût°ëýöžw;2—¥jB—<÷;›gÎÕvÅÙ2çZŠÄ5Òz­Á‹¹áÌ1ø>tlJçx Z„¼šSü•Çwws䯆ÆO/çëtJÂkðíE…€Ý;m¬»ÛàŸsµ>íñ¹ö#µ KpçëúÖëߗΖTADS¢”RRRбG óqH<±F-,DÙgI3Ð×φ£L©Ð˜ U0icf˜0¸&§‘Éš8o,,“Nc–¯HjËC¤SQ½RJ®…wípÜS6©â-‘j”„K.S0H`ñQTŠ-.¥EV8j‚ ûk ²×ì²LAPJi8åÊ9¥‚ã•Éš¬%´L-# Y0ZǬ¬ŸcØyÓ¢ÛMظý`‹ƒ€–ÃA@–Œ­‡ý6NÅé¥FP zšà`sÂ4rÀËh1ßò'ê„NO²£XÅããHy*¨QÃcÖ¢üº,èn¾ ôµAŸ#²ý¤žZèGà‘0ìnâÝåê•:Ã~c)lo„þ0ôã)3C¼”¼¾Œ+ÏbÅ‘OÐîëm¬¹á úïÁ!?üº 5ýͺŒŸi‰HJ½\ž¥¥KžnžñˆÙ ¾­x!fÏŽY³î˜Š>/-ygõêÕ \àà×!¸(PSI)HTPI­“$ërå†Ì‡¦‚šóîÙ ³˜ o› 1›!j1D͈“µÿ²äÏ[~ÒÈÄ÷VCÌœÅq3çÆ6”1ô„“KDM9%ÇG¬õ'ƒ];öœtÎtö|ìM”FΆÐÝ´÷¢:0ÐÈŒ í½¿ ïºé¹ÜN˜Šìz;´ñp6Ð…q±c/ZâT`çÅÎ}x1–úm¸{ÑíFz°ésÁî ñ™m=S¡Îô5ø¨á”ËS2²Öö纭·]¾[.ïµ¥¢Hƒ÷¦Û{ÕÕr»1xÕÙÊ4R-¶‰Ê¯é5[¹}_Õ5ί@†HT©„"mjo¾%°ª@ÂÜ!ÑtB¹ʼnêÏIs 9N’¼¾öNC¨45ECÉ/³‹¯Õm¾Þ0¯XN)7]^õ'ü§Ú-8tO{|®x|sž6ôjÄÙzÅÝöY}󴡤@Hª ŽÍÏ?BO|ÿXOô‰F~øA¢ÂyWF‚´\/ÂX Lcú乨oÚ—U-l‹Á,äx³V>`‡R™žW+dT£WÁ>¼ÆÓF–vº`°B¶i%ô•Áx!œÀR:x«jÑíNÙXs£8ŽÿÅ£ ’e 邨" Ž¢¾jaÄÆNq©$‘Wˆ Iá"x»†0î`ýÁGGUÂD%ÓÚ8: ·68²DDa@ª‚#$©“u‚ÈQ‘.WÃfèÂÁ#į¼0ÜÎ8Ñׯû¦”ƒAV[ !Äø 1®ÙO…\ŠŒç·Jüü¢ …™+ÛYÁxqD^9üýAœøa4 nµ^‹ §-!ÍzåKeÌR³ݬȌZrbÖœ‡Kƒžý¸e\÷—’¼Kù/þ›ýzi*Ëã~’&Mš››››{s›–†‚¢»ÌŠ. PaäÕ­”Ò·: mo_´‚Äå!¨ëdUf@|!°ˆãÆG‡‘(êìl²›MæÙv³ËÌ("шË8Œ¢@÷wŠfçŸI¦3ÜdÈ/Í…ž{Î鯗ûýÜ÷S{’eÝÉqSÖ*~9]”:S’>c49 šìyUÔâjïöõ¯MάR1¯T„Õ[Ÿ«p.js¸yá²ì¯J6‡õyco¦s\ K­¥$±$½cSú%~ߟë_ñ5\©k\ÿðµB]ýð$桚¨%“ FÞ µB-—v¾«> Æ\ô7„nú›¯úOzöÊHZNq2Šù…˜û¬â­i›oÒì¼gqCÞ­–F¦-ža‹û.ˆÈä¾kóÞ7¸>.³‹h!GPI¬äPVé°£¾+[›@Є˜£Y9CLTTÝ·x>5;‹~F31­KHŽ:åM.ؘÍsÛìzdæG*vßÛå›±ðw. %Ó¢Àæ´Ž@vl,ÍÒõiùí{ÿnö$ÇÇÑ q 3ï±=0bóžW¼?&~Üæ¹ãðŒUVݱ»'ŒÎ‡ö`é†$?ÁÀÍ—úbxxü°L?‹Š@mÏ/0$+–èâ[‹zt˜"½êeKÏ%œ)Áê3 ³FTŸ ý§b…‚ª,ÔoÁcNÿ »6p^N–£³•è"¤/FývtFõº½ 5®sœ0ˆÞ\·MQÖTìŸÎt^ƒþ¨F:±B.¥¤páQÖdtVƒIäxO‹{Ò_Ž~¯Ãƒ¶ôh°Fà¸o5¢CÝzÔ¡§6âg[ ɉâÄk|ZÔæCÇxL…#<:Ê£ŽŽù–M#ïxÑéZ<'hXÒˆ0ǻąْHcI1'q‰rtÄ…Ú½èíªˆ‘蘿Âàw£_÷˜7¢,?,*Ú­ÒPDÌ0rZг%%¬-zP”Öe…ËO•¤«O¯y…µ¹aͶêmOÔy3ªÜå¶oÔy Ú| ÈS¥4òRt?iäûPdºZ¶mQ“ýL©˜UeÍAë”À’œ¯JRÃ;òæÔy;ãÄëH’¡1Ao‰ï¨ ÜØ{hÐÛ–x?ØôapÿÍÐhÓÿ#ÓÒL €×P Lu5RPÁ`°eÀß8èoº±'êù£­!óPÝ¡+¡ý/÷½mHÉ’Ò¬”d ’Ü“–óo³{Ê‚3nÒä†P^-L™\w!6ÿ¸É=j÷O[¼ÓïJ¢ÉµÇ G³Pp÷´7(®W©Ÿ´yîUTíÆÉ…„P"•ÖF­‘q‡Ôì¾måG­ü»ÿ¾ÿ§¥úŽé×ÕnÅZYƒ‹hRÂqµ›r£VHÌX=iáY½Íü„Ýû…ÙõdWèž=øA±áÓ;GìÞÏ~[òæ5‚’²‰ô‚ Rî3ýîGŽàì5SFçJ÷g2òí“;|Ð+`Û-­MF Ђ²¤ãáGkNŒžkq~ê“ÿDÎEè’ÔgÄAÜ£ÆÑß·|é Á ³õêñäøW=êÑ¢nê×£SZ¬‘¥Âêbg&:X„Þ+Gýš˜=ùd¼ÎjÞM¤­§D"xê"¢DB<*ÎyaªÉksæU9«O¯w=/S<×d¾P¥¿PmYP¥G*sA­€ ýE"#1E^ÿTßUaõV°¦ˆRñBý’"alEXWp+cs,CK¹1 –|ÖöÁºƒ—½¿¹Ø-ÔzüP× Q>ämŒ6ýoÕ µB]«Ù&Y’ÉÍÚƒþF¬‚` €Þ…‘ƒÁ–ÐÊR >ÎGÞø\7‚­°œ3¯DFÑ$Ç,ex#yÊœ2¹îYœ£Vþ¡Õ;nY%ŠX1 mïW:'L.ÐÈ„ÑùØü‹a·vÝ9M‰Å |Q"RÈ0ä[Óþe >±zÿ°ñMi¹2ŠŒei‚^UZ¢OyVœ¬t‚FÆM®ÛþޱzÆÄO›kF Î'Žà#3fÏEº$šÂ8J@‹dHÏ5»ÇLîÏM¸{+ÝŸ«¶1nqOÛ½U£vÛ¶ÿ²_÷±MœwÀR$K–N§G§Gwº“+Nha@Q:F 5y¡„—Çgb…8öÙk ¶ã䜄®# „·¶)PÞYÞ`hl£´ h·þ1MÚËCݺv… B€ è`t@ˆ³ßã¤Ûþ2 JÿÀùét¶sÏï¹Göóý¸@$5"RºûÝVÔȤ"b±§¡ã)±±'ì8:ŠcÞûúf“YeJxq>…¶´c «Ðá`T˜ªôDtÇ5Òù˜krð¾èr‹êl.…3ˆE¥h*B´pËeB’D“ʲ™P#Ý«îÛæ€ÞxwlÚ•}EÜîbã<ÎÂ)œ@Å©Š;SŠps Vd¨`åĤùìv±«˜Ê\,ñ;VAï –þq¡¬ºìÐ¥²»˜.ô© $íùð³u’}žÂqßCð‚AÍ„=5ñÐ×a¦5“§J#­:ì ÃÁzØú†±`Gy+¥QšËS‘ãM„š$Ù˜,Ì"îº&A$Yó¡Þ{«!°¿–M†é(’xß i€wƒì¦$‡ë!ZÂ[噼9ELÔPžJ¿qäÝ_m‹9²Æ9ÓOßñ+Ä…²Å _WmãÎ%ãjÎXaÖc»m Ô±d‚"xþ¿O_Ôÿ©Ç…¯¡C¢âY1g6.ï˜=—7æÌý2/;W!)²DpÃÄů¤ÝŒa}Noú´aç½éT´ñÃMÛ'¿Ú¸-Ñô?[» ½9mþuýŽ 5['F¾ 7\Ýôim 6Ú|º¶»#ÙD8Ža„ð?y½à–'˜hßaoðâG xÃ_kÕcZÍ%w¸z^'ñö´´?9ý•/<7ú¿~ÛSùçâ —J‚_x*–7ô—l¸í¯îGJ%Þ÷Y4¢±õÁ©ÞõU]ôEÈ2ALSjVL>Ÿ¤HlÂ$Ïüøï哉moi±ìcC$ž”ç@O)t­†ã*ºôDØ Bºâ,éF„0'´¯†¶"³k¡LežJDâ’ÓeNæLFBÕùp¸ÞuŠ ŸLHREt» 'ñôGðàUmNhw@_t¯‚cÅp¤„ª©ØSà`²È‹`VE–“ÈÚ¹I{Tès@ÏJF¦£h'ÒRØâ$å‹ Å©°¿úJ §˜Í§Ó>mé,bÓCt@—Ï’3ˈ ¡ÄBˆX´ öÕÂÁ(쎰øžZ‰BkpFµ›S¨d0ZD‰˜DƒÄs+3asì¯a­ÔÏh¬¾?‰bášÔjl&­°¿ŽaI“°FêaW;î©„½U°ïˆ "æeànŠÈÎ̸[˜S_hä)…‰9†'…¶GöLÄFÌ™;î\Ssþ£‘±‰‹¯ä <µÐp•ÔlüìÙ3ñéƒ5¹Wò36ÏJ“(I2rVÙ²ˆJMšï7µÍ¿Œ6M(â´ÞøqÃdÉY½ Oð•DÓÿ#”ÌÆäÍÞ²°ß¶,Ãlµp·6ע엷£êÍ3 ÛÎ=ržµ˜‹ª‘U=ú3gΡ~1ÅB{sí7ý:ÆÜŸidH ÷{Ã#^}º42¤±0j=Á!¦ŽšdPÃ×Ãø®'t¯,:òÚÏ=Á~_ø~@¿á–雿¦rÂòmåúG ­hƒ{^ÿß¼“=?w¼ADNÅwkƒ·ª}¹Å„)ªP5®vwvŽkDbr>&•hLM!&b¢Ð[}èô9';UÉg†…F)FéôÆrè¯0šX‚É ®Í€#U&Û Á‰˜¹Ò0±•2…O”ÀÀØØŽ;¡¿ŽO¼ë¤QÌô'ìÌ—X:Y±bèû%İQ ﹈c.IVÑö¦¥)æYDîuQ7z«àC¼‚ú§N#8h¹ÞÚɽŽÄ¤tª#„Ê žüi]áPE s#tâF‘.?ÂálñŠÙIš+ö¢@P;aY=À~D§ÜÄ¢'3-“©D¥†ZÔˆÿßßÄꉺ‚°õm-5™j’†MÌ5ò?a¶Žºrž”f?q.}Rºd¨tÙhYÁ%yS[o구gŽ¢!{îËöØ>w´Ì6ê*ø$#]9ÓpC ã 9˜ÑWCíÓ‘öx¥ÿåÀ¶Ö­Iˆ!Œš¹f¦#5’ˆBjÙì ìôJdçéðöÏ¢qSÇÙ`Ûň´ÓùÐöñ3ظn¿Ùv*ÚöåæÝ…³Ò ŽCUuJŽ-)š*u¼ju¯®ñdžЗeÞYøãPÄ7Qq¡ráœ9ÿbÉš‡«#½¡ÇnürSo^!£ÐÎ¥+oº›n¯nùÖ+7&œ7=¾»nßõÕÏ¢Ëg̤‚Oç*¥ôÚµkCC/Ð ##Ãx~w¬²j\³R#:JdÎbØM~ªžtÁÁJ}:5rJÝðq-œ¨I/^dÔÏДõy„ü9hª½•0肪ád%ôÿçß±1PƒåOóJ)¼ÇA',„Ojád5©„^O‚/›-Ô„P8•û -¤®•$³„ù4aÝ<8T"‡Õ?éZûÿã·MB ÄÊa NU|¹Q4BuÆÈ3t6ÉÚ‹xhÓBœÒX¢¯‰ðxw |„cgö†${Žn=ASin6áNS(µ(Ä,×9äö$=qOö´Àæz+ ¾HI¬·šï­°}ïÈu¡C²Ÿ:l£ŽìaGîˆ#ÊcëM½–õ¼dé¨+oȾè¥Óö¼tÙWK۬׾|€º,%ípKô|´ãjt×ÅÖö q"Ö™pûj[¾„ˆB›“Ý‹sÝK “TaE’šn´ü.Ú~)Ô~>,;½éˆW¿H‘K›:ç‚ÛÆÏ`{¬Ñv&´µËãKeBf­PsTñŪuS΀W¤î¯ÙøM­¯'¥B©F©.tMW™j¤*ÒÑ(Äa ¤gŸsyÎ8kV37™ÌÒ¿¢ò®Ç/R·áqCègço3Ö=¯tÇퟥã*&ÆÒÒÒž>}:F‘‘q9ŒŒ}â«‘#{÷PʌԈSÄÖdÉÄ¡I&žò.´D YŸÅqïêÃúLØíJ¨Ï¶0êˆè¸§Tͤòò™p¼ú0…« 5R•0P.ÕÔg‡ŽŸ¢ þ•0°~_1'®‚`^òʹè‚›ˆrL7+Uu… I¸‰%–Í€ðòÄ.Œ~Q‰ì}°bÊ4"€½ãl ˆVÀljÊ5™if|(4a½Sà@º}cZˆSúKu´È î±HóŒãäp4ÑW®ÏœN83pjbê\.peAGŒÀ>tHëØEâ8žf8*oSÔ9uÊšÆa\ ¥ÿQ”?Z¶ü‰}á gÖ°3{Ôa{îÈòØzS¯e–å •fŽºÐ$¿øSþÒt]>H ‚ [h´ð…?ÝÔŽÁ:lû<²3^*8xÇ¢P“0ÎaâP]ã¥è®ãá_Í·LG¼¥°•õ¨‘÷½¾¦BÇ>oÓåÀ¶xõ;ΤȸF.ŽÝ϶¶] ¶ÙÒæ1|-‚彬üï‚S΀W¤¾®Y÷¨>øÀŒ¸:r Ó„N R’ ¡rB,”jŒð}Rã)ºÎ)Ut5“k_T¿}׃Bðßv7þPzP×<éñ4Þò6ýÓã¿QÓx¹´_p1-Œ{<žq0 ¿ü/⮑ký3RVe;Õ—˜`Ð Çœ?GªAc¬€ß"H „ÅBTbDª(<‰™æ3³0(Ó’à};[!ªà¨Ž8 ×ýN8U1;ôO¸ßƒèÙøÀɪæÑ9šÂq1ðdEObædnL¡jªF­ Œ†õ9°¿vÚÑ*ˆUJüôCÿX×'*åH¦J#±1ÄÊå<œ²ÃÉ"ˆUC ÇD>š’Ág¤@OPj¤«ö‡â–þÝi‰Caèj”ºèöË^Ð[4[ºÐuCås«0âÃÕk(΄M«ÿÅ~ÝÇ4‘æqÿ%$$Mš4O&“'3™I_BANW`Eåeñ( ¥–B¡e  ®Ð7Z(ÈŠ ¸âª ¾@…®î›ïÆóö.¹¿ïr/ÉæþXEoWs/ÑÈËý¦MÜËýç¦ch¾™tšé<ÏLÚù~h‘“nÏÐ9ôÕÁi/ôzá˜W,΋Q¥VÀ«çÅÁ„O 6½´lxfZ;kN}eÉø§)cÑkk)ïdþmN~Uœ9_´ñ~ža½^àðéͰ¸ì]#h»kÜWšä²¾èÛûe ýzSç _{¤HÐTR«žrRê¦+®Ö;ÍŸV¦e „åYZœ’>Z¿{sìJ½ Qâ6ZﴌԸWýíaŠ IÂ2ÁOp{³±}À^Käz^Hæø?–×MJ‹Ï€·$Óï”Ý…œ˜ªñOUúšÖ&s‚–R5%ZÊè9ªÁ–BÔ„ê%„4¼Ÿz·&0i«{èp?’ÜOí·ö×ȃŠÚIÉõ»ó‘äiIÛ€áE^ËÐÑÑÑ9ù5BÈìÌÌ«È:$üš›}‘˜˜HYž' «QÂñR²†:w[5hƒs…0THR„X¥ c´ñŒˆSˆC2¸¸P‘’£{JaL‚AœÃùäÁH>ŒšawÍ4ɽü ƽd…S%ћФl¯×0žªyÊ^ÅñDˆ¥Œi%üz3Œ @Š¢N£… `Ì Šàs³ìŸÁF‚[M##˜9gŒ0Žw`3œ+“Vv9‡¿çx¢U<¸,pxGT3ôGN#áœjD]D÷4B¯iÁgÅÆÆªÐ±èÊããQÏpœ^å(ˆúÔ Gñ+^èvBƒ¬‘n4IcÄfÒë~Ôˆ Ž{ሇ3¤ñ FÃi4,G¨²+iù¬Ù0oÎxiZ;WœùbKú¢×ÖRÞɼ0¯™/Þø ?Û ´<Ïfáb mµØn¶¹îkÃ\Ûu@ÖH ã–¤Tð±Á$ ¶Áô›Ý‡—ÖÄã3\’DÍ o÷Å@û‡ºxQ)yº³ÀrÅ»7RãþŸL ™d_nÒjžç5”ÇçøþŒ\¬3,ßEgÀ[’¿Hµ÷$×$ïóêÆ¿~ô±).‹;hÊæ¼QXæJIKÑéð÷#pÿâÒù/´¬ g^d¹-+!h‡‘ÂoÕ3%p»µHáÉŠŽQÒüxð¦ÃÀV8e†óåcé”U0¼Šµ&°=UÈŽr$B»Fì0†l°Â ñÇ=g„ 6hÙ¬jV¥YAyi t[`ù¿Πy,rÝ…ÌÄm‘üE¤Èˆ5t žd‘(ÖȰ)4+ šÑ!2pJC6E2ÃrŠ+´ZrBß'‘ÔÈ1¿¼Åê?†ÀðÁa·`Í%«ðÞ³×MWzQ#Ó’÷'»g¢Ú÷·òZäÊ„ä{,yï–×NU¹~¬¨CÌ [žT5.ô+\ì®Ó¹ì‘ae»ö´½ÃììÌÿÊ$²ù×ü«Ç÷'–qj„=+0$Àp9M Þªƒv*”‹õD)ŒT˺6ÀÙ|Ù§Œp¾FòáDCE-©†zQIÑB´Ú±^Õ_ƒG˜ß|hŽ+ô—3¶x6gËä*ÊJ.„´¯‡Îl°Â9 ‚e0Z"7þUæÓ°UÞ•1P´h‘g‹ö(m1[á´E6R°DåÜ$Pºœáˆ@±ºêàXKÄÚ!vÈÏAxø–itJ ¬4BOƒLtH_?‡“èöÀQô„)‚r™!bó ÀÉ8êã~èwÁ~Ò].m –A‘q ‘Q dlmâ|qÎË¢´E¯­¥¼“©_±â¢ ŒBÐJÊ”edÝjh»ÜÔ~;ÐùfWÇW¾}wšü®±óv óÛ¦È3æùd•. ¢åtÕˆËEÍ«ù¼g÷ ‡û=*€«ZKʇ}{ ‘7L‘ÿe¿Þcª¸ò8€Ÿ„„„d’ÉÉÉäd&g2QÑúæ)¨‹.Êc.rõzÄûâ%Zä-Õ®ømU¯´juµ®Z­ÕîÃýcÿØÖÄìn]×jZ«vÛm«+½û;ƒe»¦n¢¹ÛË&¿;93™9çÇpï|?SÓ(EU‚Db ?‰S÷tí£’ê›ö²EkƒÎ€QR·Š*ïÚ_–x®Ù˯-YÙ3waëŒÄ­Éó~ŸkÿÄ^~«Øù…½òKÛÚ;+×—¯ý¶È ¹»¬âÓÒª›æîçEŽOV8ïüßûüÔ^q§Øy» ¬rzB4¥ÆLa¿¹p àñC‡ >152Xø‡ü>ßÂô ÛIDQ˜ˆ¶BÐ/å©×c@Æ!¯•‡«7p© €”çIZ€Þ3PŸŽZ9ÀB‡2Q{ºžÇNeJE¬Jh„ÄBã(:°Šwr õ›–èµ #VÔcNÛ“Åc\ñ?4ë°rÿxáBpE^è^kˆk>ž"G¨ ?î±z¤¼dI õe¢cÀ•Eè`6òÚy[û …‰b¸,GQ n¶¤¢½•<¸Aݦ:!;ªù‘®À© ½m]ÇqÞF vWñâc—ÉnÏH³«úé9PûêønÓ:œêWðKºh—ƒ7¹Íº\hoÕ ÷³É&E²‘NV¢C™ÌywƔǖ ‰Ï’ôÄ’ôØHþ6;屑æË™ûMÖœ ÇÙ«Uõ$'e¤sR†ŒÙ>³†,I_)³üFÊ@všßXðMvƦ‰º¢(žOŠMhéÌ4èë·œvmz‰”ÿa?]ÓrÖÓü‘§åгù·ug›ÌZOV5¹æXRU•H’Be*2 Wu‚‰®ë!S´ˆÎ5î_Õ¶}\Õ@|´¾ãŒ»éìÆŽóî¦_{Z×4'LˆS$ð? '¸+9ýö Çžk÷ ʂ΀QRß9î,«¼g¯=—·*V¥” #ÑòžŽS´âi)ç>(ªû[‘û^‰ç3{y°ú|°¼ì†½òúªš(J5…E`ªarÿá?¬Žçkdhp¨µ©™Qnc8lm<ê[Êrèû˜ƒ×ŒïC‹ÎžLN/pÂÊíÑŸ+쳢ݹ!­¹$/FЉƘBUÆÄ8‚©‚ Ä4uæò«Žæ£ËÓÙ ·ƒ¦`|Ø‚z³Ÿ».P§ÏŠöü/òf¡#¹!»r[ ,%!ޱÌè8,ÂÊú$UØ—,Eýê[„z ¾.`æp°áñ#,Ÿ¬›Ke l ' ?mY‹ºÍô‡êªâèt .´'@ÚV޶;ŸêVñS™˜cÆžj´ÝÁO>¾Ý²«Ž"[ÊCƒ^dž%‰s£d¦Âï]fXUÆx? £aÂL-¢½°ô\ã›'+6^Yß(\¬i;ål@K—ë6_ªÛ¼)o94 YÔYŠÌ®.-½±¼ü/«¿Xá¼_ì :FI}¶¼ìvií ɲªI"Áa“uÔ±`Yˆ5ªP’õˆÆøÔ‹ò¾*v«Ï{vÇíe¿Ì*Ð1âFJrIaá ß÷Ó`d`ÈK]¿ö'øFÉ"†Ic¨'Ÿ';Ïk+Oº^ËÓÝj¤ÏÂ'ì·¢últ$_vÏŒ €‹qʸ(A×± c™JcY’°Pž²97´;õXQ¯ `‰Á‘àÍC³L'˜ˆfÉ–®ÊCoæd’פ„²0•¨á„…k‘š( E†DcA#:±Mö,ã3Ÿø0ïC¯|~ׯ”¨ñ&”Hð6az¿´æïöŠ[ÅÎÏ ËnÛ£§n•ÿµ ¢%q@q”ŒGG•OM„é$«ê‚(R®ÈЬØqÎ_DÜ]VY?=)¾IŠèï÷ ü4ù|$~ߤèJe‚E) 6tÐ0cýû|À6€9¼”‹ÂkA¢#FØ>›š¬‡RQ£`)EÉ¥:•§iÚM !ªÎ@Çmè(Ð(½gEû¡>“"3јڃ& €¨‚çkĆö[L½,Býê²JS˜&R"Š’Æ *‘DS ¢”$Grò ¿þ\uãWµ.¹w]ñ#v_®n¹øú™FÈ4E"i*-Ç~/ ¢È“T>°ÎüùަOý»ëóíå?7ùs¬Ç> \4àÔWýÃòžo-×¼ ×Â5 OFê £[¼õ3¥‘KáÚ.Ê{FênN7p K$‰ð${nüïŠÊG‹Ê–¸ž:\J<t¸F‹]QgÀ,ÉM®‘L+.u*Ž¿f¶ßuº­qzI¶&-zêô?°Ëé “æ 䯆Ò›äÛΨ}n÷‹]­é9„géONvÖÖ…&C“oG#?Ž…Bã¡Ý{úx¾Z§Sð,jD+À1ôçO€ÁmÐà˜>Á1ãÓúgNe3¥‘n+œWØg‚“>;^Ã2ºEÒtx ÎÉÍSâ‚©”ƒ«glKâü'†ôïÍk$Qoï2«2ižÒîG(ò<7åoÆ•HOKÂ*~ž4G-¨­+W¨©jB~\w_­Ù÷«ªfTÁyoýÅÍo¬‘—}ß×€ŠH]¶BMD>Fa]–:䯿P۲Ͼ-#q‰–åuDT1ì*M\mnÁðÎý—WM¿®jþ¥§Çù‡Ú¹ÿ3wÝY×ÎëugJ#çü{ð6Gü{ÛË|ñ¢’|ä$"2æ?ØZõ½Ã}ÛYþ§Â-϶Uß*øð‘ÓuÌ’|ë(»¹a³ŽðÇV¤ÝqºJ'i·í®[Å•ï«ÕJ‘œ7>¶»ÿꔣUç}G¥!>žçŽe%"Ýüúfh"ô–,‚¯ÉÐØäØ“ÿüGhü£Â’$^£Ño´¬¢ Á΋é3Ã`>ÍÀ 6P# „´ÂIKU)Z"ñ£`6§BŸj¡¿úñ] œÌ… eŠÅ Ð] -¢£T°sø°8Fl-‚TŠN›ÂÃæR;½j^ª×Dï¥'N@W'(ШªÅ*:WOáüyì”b‡S($IÉ+¸¢¥*Ù´tH_ ڢΟ&XDåv"†òนµ/ÖòŒÄIŽãÇ;LT ¨ÆDˆ÷%E"i÷Ñt üð±Žà~5x ˜z©Ëó’$á †EñË`×6訂®ÀH.¿pC›/ì™ÀËÁÿûàmqÑÃ>:T'¬ šš¤¼(ª9QÍ <+땳S&Ö'G½ý½Ë¬Ê´F&,kÆ-i¨¤ÈSÃr=añÁµsaÙ «Ò°#ߨj¼ákö5 ?>—wËØ©›Ð'g·ï}ƒFÑåÍvŠ¤È¹³_æ±M%w )’%KO£ÑÓè=½'ÊAX²Þ#$ˆCB9 vl“ß! 8¶ãرŽ]’C°ì‚–c96!÷"¶jC—£d¡⮪n¥þQµ”…]HÈÑRJ³ì6$¶û{•úGù§²Iÿàé—ɼÑ{3ß™ñû}?ãÙvÏb¢áÄ͵Ð~¼¼:WO£ðéϺR¡>Uë¿´§ã‹Pû¥Ä!W÷H€´À6€"—ý­ñ¢‘‘½W=ïÝlî2¼½JJ-<¯¢‚Hè¡ìÜ»åµO­Þ‡Õ pÔYêfª‚c‹çªÿoñÍ5í¦³ôuò©MúÉ —H ؽ5-õ[«gÔdO¡¬ã›:[ØÒð[»gÑtZÜaDNº4Éé€ѹèóÈ+â‘HÆ‹ÎÍ=‡ò|w'Á›iºLÔç@½ …hЄ† ôœÄË=€$ nè¼5­Go'qoðœ} :cDC:Ô½Yzò\¥¼._\³<¶ÈPã&tÚ._Á,ÅòdV@,û¤ Z$°*“D˜b}¾d\x … Ñg¶¤£;èæå„ÊÔó›ÒÑaݯ6•Ã)r ~¥”##‡KQ?x½ ŠlE}4hH8]ô.H,,×yà ì‹ÕAÌgeÒÁ“@nCEhȈú­hO1“­ÄD&b¬â(ä À\º\ZªÑ /: fíC'ãG#/‰c~tz:Þ€Nívl…Ì©`9åSX)bcŒèã D,ÀH§è#/:ê{3ðºTŸžÃ^>ëd9ÇÂËa{Šê«õEQSNĘ÷£® b( Šž<3h¡qÑmñu$4¢¦5°ï3zíŒ~mØ´Øã™^ûƒvN—6­›7j#ú¬ˆA;[Rx!;3S`c?[ K ·3¿èbc €Çí†ÿ…:þkŒ†:fFo5uúZ®¤ž»-u`ô"\˜5f®¶oÜ !g 4 @J9m³ŒÛn;ã¥çMí—m ´] Æ8§©}ÔÿþæŽ}•U<åÓxÁ «æ ‘Ãn­zj]éŸì¡IGà‘Õ3asMXkÚbÆ ·ŽúNß=»wÌê~boXt7¬— 4lÌ–æ?+Ξ5¬ž1æ?×ÿäd¦Fdå*Œá‹¢„ÕðŠ®ü§Í¯…:®B4ÆÇú!F\kêü%0I°Ê+Áƒ?÷·ôï &³rqHX‚Y¨CåMÂU®Ê¯\W‰¾nBíÚ¨û<Øz¥¡%^z?.û[aŽ7š»àÈ$Á¬o4µ_ðï/H_RXL”‚–ŽÖ¡ eè¬ ˜¥WzÊP·õ—¡^“¤sÐ$±ÓK]>öX_lľ­hØŒºíÈÃ)U"e°5 uW“â7T ¯S #6h°Bês(özA‚¨á¯‚Fc`Ö› Ôna}Î/Lô—œ+EÝ•èL)_™·„Oây¶ ÎÀ‚šðå9%ä ’G+F.(ì·¢3Íè+æþ ¦‘#~´·JþnZ*xL€´á‚¬•²ò]ôþN‰UN7£î}Šñ'ÕHa:äAŸ6Kr2$1Éqà_üèÈ t„>¨ç óÔ Q‚L k#×°äbÎê™’ ÏKVE YSÎ?Á†JÖ/¾]¾ŽDÆŒ^;[’1jçõ9ÑÒµÑ2À•?ê3£¥ÚyÓúÇ[64d¤òDF8Ê$«0Ãhå{&óH õF¨ãfs¸óÏBmñtÿ¦ KÁ6¨ŒÛ ®ìíÒi² ÷1”e(á8ê9¢ºiƒáª¿õ¬wïRHŒr&ÐK-0Ò¥ÐÁxé u„|áom_6u™\õµŒÚê·˜”€g,æðiS MIÃjÌq`©j§ä˜t–qg®ºY¶kÚ¹|yÊáûÆæ¾cÙõ­ÝýÈé°ÖM$Þm+Û}wíÞ‡µ¡q³{Ò¸µ­ª·¨¬+¯èZᎯ-î{VÏ´Ó§¼fÊæûõöšâ”4ž§ü…IUrúè6ÛÄNÿ#‹Ø á4bó¦Œ;ꧬžI§ObKÝ×–]o±‚È8Ë.[¶,òÃìüðªhD‚ØÏøçΜ¥,…j·g¡rɸ‡Mè_ì×mLyð_bBBÒ¤™L&“™Ìd¦„‚¢»tQY­¢@)miy*Šˆ } ¥€ˆò *AD@)åÙÝ„½[•ÕÕ“s7Ù÷÷îrçi\]Ýó\Ù;ïv£ ö~ÿ¢/}×Ê›m~išv~óŸçûùêaÌHpª´ÅTE\Ì†Ñ ˜Ò¬f 0‘M—í`iEœ’—(µH©DZ$1FÓ,)îˆ& {˜Î„i-L˜H4£.f‹HX#o0ħðøú÷ž—˜*ȪYS0е¤Q³¢Ù¬ÌàH2¹Ì¾LhÓÀ´…¨Æ¯…I\2øôà3‘#à°|`¯\‘‰h"h!üÛ^)üòb¡âPGI+«¢"i†¡…hFÄGC‚N£ë;º!u×P’R)&o†3ʃ5a×HçaE,º_Pà äy•딨Õ@ zÝ0Òƒn8C¶Œ¬0àä§–³êà”†<!gœ0è蚆pÞ çÈI…‚,‰áTƒ3‹†UvÄǼÐkÆmϳ5¤þœµ}Õãò÷ k½ÈI{cüìuÎö—º¤%cêËÜÔúmK9[ÆÔç9»îÛ•'sŒ"Be’²›¬Šé)·Ï!?Ü­·=×kZˆŽv‡,ý=í7<í׼툜+^ü€>iŸw5û6I4+‘E»EŠjÉ-¹ÒtbáÈ [²§±$ˆYaÆÛríH7îª~þTÛq£¾ëKO ÖõºNìíwÛÍÚŽ‘ƒ ²Z ƒƒ"‹q¬ºÅèpe:7K£h™¥hô+R’22•j5Í«¸S\õÈæzjsý„&)ª¼[RùŸŠšUgC¸ªÄþ°Ü}ÏRuËXjPÇnà¤p ¦d!Š¢Ó%•O£û»ÕþÄæ^´Õ>-ª:Ÿa>¹#c<Ýø—¼ÊÿV6âî3Ö°kä‰Õy¯Ùã$ø±:þUì¸_êœÐd‹øTDÂý„"¯~ |hϯ^ýôè1&G–±Ï‚Ï~}P#˜Å¨‘Ð¥íx$øîˆq-ÌèIÍšä)’ üˆÔL´šx–¢’TtY:ŒÖ c([a:Ÿ¨1g†Ù`ÍËŒï™ü·Qþ^™‰[P,cZ ¼4ôî>V> úlø\O.Ùo&A#ëˆIpÇQŒáŽ…A˜Â®‘éwð› ò  ­…… e‘1SÇv3i*ž£Dšå Ÿ"/²›²Iß\môµj§Úu­vJ Ö ¸Š¡1}# ÷Âô1è=v yÄÏ’Ô /rd:‰1ÑÔ¡8í_ ÖÂ); x¡¿&2o6¥fØH™¨Ð°†k`È9PO6 U?ýNèëvÂ:Ç-”›Õ¼ÌÒ,þõp’áÀX£ø»ûvò2—rR¹«—¿WXk9gçÃÎ×ú”׆íˆí¿i·,go äí}¦Ý÷}ÊöžbJ–dIA¯¥ÙŒõªûª¡ãj]Ç­Æ“7 îÖo›zæÝ­¡Jÿï< žö›uóõ¤V<ð· qÉu¬Õ\Z‘¶¯ÙT2rÈ;S×zÎÑPžš³ç.ÍJ×cc¸ýMw[¨ú¹ííÄ«ûê«é$ºèªý~‰$ih%…ÿè(^d(^·9³¿¨½+¯cÈÜRºµ †Û@QŒÀ²2Ë òYµ°s]ìTºÃîyYÍ“û3ÌÁRû’ÊÕgCxênqõ¢Õõù.]¢(â¢0R©”DY¦¸ž¦Õ2®¹pUhމûb¯ñi¹çÅŽGÅŽ;ÅŽ{Vǯûë~±TÿP\õ°¢öAIu¸ûDÜ_ù\\ý¸Øþï2÷ßÊ=•ë6’Ç))jþÊÕÀËåÀ2qÈÒ‡±Hðµ¼üîloH¥köð,'Ódi;k&±N eb&9;f$àñ[•¥ kjÒ#Î[‚øIƒ©½0¬°oá˶±–d¨ÑÀYÜ,Ÿ°Ä_ÓA`àgÌÄÈ’ñàqÞ« DH6Ùez%åõ0¡'™3“6FŒ9se¤™ è“"ò+nŒ$˜. CA £…©Ð©ì}…#3lrâEð¢F²álgMV­C¿*8†ÃÅ)Žë#ާvimC-¹þö,sþDkÉ…¦j_›ÙßZ4x\Ü+°Òœá9*ý“Èžê°kä´F› ÁÆêv1].ð…!ô{ Ï ÃG¡õ€”–$à4„hÅJ®XCüŸýzi*Ëã~’&ÍÍÉÍɽ¹Mo ñÅ…J[¨<ìKK[n)P^奠<, >œÑ‰::‹¢èŽ›I6ÙìûÇd7îì̺Šàw'»)ÝßAþ˜lô:d›_šRÚs~·÷Þóý&)f•M¼Õ¨¿ õÚ—­¯‹NÝ+¡:cGg%ÔS‰Z+pB´¦Æœ’`݈ðñ¢Rg­|\~¨€Vnêk €$ÉŸïפüG·ë~úö†HÁòHvñºd0Ü\û2s®H ®æñŠ£wž‰Ãm·ë:®J ×+ÔwÝ‘š—+ýÇ='« ãÄ0QŽè1¬`ŒÛ~¾²Øs¿ºí¶£q\j‚•†¡‚ndÐRFdÌGÝdMû¤Ô ¹íò,W?÷\­ã‡[¯W7ƒI`v8ØrWrXË‚ …JbÏ8à5ï)ìôê»Oæ·÷8eêiÖ·”¥—¥G¤F0b$Qއ­À°a …mkÊïòö͘ß[Vž ªßëËÒD°Š'"f¶¡-‰õ ­[Rby®¨Õ˜'°`sl¡*䃾òƒÙö°øàS‹}z¯´öÈh}n© tŸOA#f:ûc3˜ÄñÌâùXGÃaUZ²ÿC¨ üK&ù… >ßÂüüôÔSH7¨8ÂàuAèR¥ÂùÅ|ÿìÝ)ÿ¾5šCap¹€*rvlqðÀ¥lš¼c&t^‡.ëÁûÂY" a"äòp"`N¦ˆ F®t9ŸªàS-Õ s0š]ÔRW|^„Nç¼[#t f×.æÁ/îBÃY4ú¡±«À€Lt9d/MïE>ͧàyG²®:c>-ðh~ H{Bh$aFÆbV­¡áM8ÄîØœßå6m1Œ¶ {@ £žÂ mºáæ¢óõ…#-»ìûBXž•œX–A‡õ×X¢Ï…N9ѹÚ%„ô9) N»QãACl yA(!6PÃAá–%aJ™1‹~~°jÙú9U‹¼nj¤>òV ¾C¨¿u; I¬NàQ˜Ã hG²òÝaâÊÇå‡ dù4)/s_æÆ-h“_j2&’6jDDV…ÂÞnb™Õ¢Ø¨7MÖ›tuLHí÷À!.ÏêÖ/õ`’ÉšŽ«VJ…åJÿÝIë^0Çq¡,Ë‹g÷Ú`Ò• GŽÝ©òÜ«jù¢® ²cý¦1{Ý7îŽû _»Ûo8›®»—§¨ÛRÓDmÇ5W5 þEymÅN c°È(`rFHOéÖ7 wuîîÜÝÓc<Ö•×/Në{ûõ]Ç žâ´"‘…ÛZ` Üâ„°8Q)z“vN›+Ά•q[ò&L¯XΜ1›[g à û÷fû³}Õ'’²#X°y"ð*ÌôïÔ>2š2[g,¶ÇÅåSëƒõ©É6m xŸ ‘'&˜ÚöÈlÿ»ÉñØ(]$0"ìp<þåÍׯçæýþW¾y ß/ÄŸož:dÁ÷ów²²²"ÂO¦€äj…€0¨iÜ_Z>¼«>Ó-%ïˆ`SxÚzÂ*ÖÐ{@ aè2±XNBàd#×.ª—@÷èúÑh˜¨ý¨C´?`¤ÏArÑ‚›ôª¸°Õ˜áÉâFƒ”°‹ÃÁÊĨ互üÑ6@È[+g¸)¸Ùrºq]æfŒƒEX@ªp4èZÕá@=Ôï\Ìkò:iR/[úW"o%(&éw J4P-Ö•«ÖGò¶šƒóȳ æ"B°IªŠXCO8¬],«d9YŪ—30Ž Jè4¦ UÑ¡NB^‰Ž Õ/Ñ‘á@ºmhàýõ2#¸d¥Z)~^X7YQ„’ÛºÁ¯ÛáÏKžÕlû·’+Õ§Ùá×&øu)¯òR_¨gÕñðç‚.qN¿âñú¡ÞZ~m¬O7§K›×~ìË͘W§ÍÃyÔ¦.è¶Î©·-è2§ÔŸt®‰b9ÆpíH99“³y Ä~ÔQÕr×ÕrËåY®”ÿZòLÖ´_•&kýÆé¹#5Ýjê²fé‚•pÝ‘ÁáœÂ’p–‡fä„]‹‰[[|£¶íVeã¤Ô|¿º Ôq\g¾`¶ÝpÔT@ o˜D ±|}Þs7ånw=pµÝ”<­%væít !cb¹õµê*¯áD—Îã5H<}…o­âMºl”Rñ‹é9ÜÚTÑ“¹æ?+þ²_zl¶>7•¿Øk{b©øÎ@£ù™ÅöÌd1V<³8fLö)“í)<¯43þ§ ±ÇfÛ SÅßöÚþºçÀOÇ´Iú£®”(à &«£ŸX¤ú³ÅúÐb*.›.qü©¨ìVVˆ™Èóœ³u¥únöX¿Ýkû—EúÎhÿv]Á,îY@#™ŸýFs¾yß;ùõÏÏpræÌ p;0¬L^¸‘f卿Ð| t:|‚Æ è‹KÚà›øPA!‡ƒ c¹,)V±$ÚR¼<† :ùÿ¯‘+zja¨|ª¾‹ÀørИèÐ…=¨WÏj£!ó–J%êxžÁr.RÈØ¯7÷->×\8Òò.E J/t5Ù¸p;Vp‚‚ƒ 3Q_òVQ0 U£nê³Ó _Fô/:¤ÏI§t¢ U‰¨ å‚‚éÂÆm^‡šKá3²îÃГô|@!ÇD)(b×Ñqz¬è¬µ”Êz«Ð€„N¤=-"þÛ[I_@ÿƒî¥cyïVT2nT¿'Ä2y(fY·†‘‡qrW´øìTÊuœO·}!7ɯÛ>“÷ã'ñþü¾¼ÌÕÉs¹I ºÔÝõÖz˜Tǿ̉„øuép*}¹‰³ eª/7ý›´x}ÇȃBYÃ+¯Å\Izöˆ£îÎÑãàqGøÔt{™"ê«õ×Rã5g#(r¯¶ã˜©l/Âöj#§tïÒÕXlÆ0–¬Áô9œ!GòŒ7«=¿=ÒyÃZ7YÓqÍÕ¡Xªi¿åü/ûuÓFvÇüI•"!YžFO3462a[P³¹'¹ ÁØcÆÆ†%Á_8NÂes.s&„#’¦­´G®Ý„U»Ú?ûOÕ?ÚªÙíæâÈÙlÓn¶ ô7 ­ªUø# ûGÐOOc¿÷æzßÏk„Z¢ÈÒÁŠÔUýEoý’v> 4m‰¦Ø;À›«À|qª¡Ýî5tô:º [{Œ­Ëi$bjóe»rwÄàhX¶xØM1 O¤¶2þ½ßçšY=Ӣ㛢ŠY³û¡Åw¯´ê¦¡|ÚlŸ)÷ýÍìü¦Äy¿ÔûÐô“ÓÈ×&ÇmÑþ@´Íšì7JwÅÊëwå† ,&*6úòþòé÷}·‹m3¢í[³ пš²T]+²ïOŒÆ8†&*aíjÍÿ®É~Ûl¿nvNíÓ¢kl·^Éަaݵ˜K–°ƒ@‘ç?ðàMRd^[šÆÌÌ O³JÂGi4jBg µh¢àÿžÎc’FÆÕÐÔFÌÈ)zÍmÏŒŠ®± Ú>ØÇ’¨£jõ9ñºWUÎhÐx.Þ‡†Éw® Á7ãÒ-D!ãáfðRC0)ÌÑ›´YÅÇ‚†¡~¤Ñt¦Ù4Ú¸œFŠO…Á*º‘†ƒã­ÛÊtK 3ÔïC^ÔíB}~ÔíD}+§‘ˆ õTKZèó¡¾E™øMkX_áæÉVÀ„KZ‡Â¨×‹N$« øÏÌÉè(%¯dX–ÂÒoa† ¥NèЃŽU¢ã>ÔS)©àÔç^Â…º*Q¤ZÒŒòªó\š!t×á›—N±ðÔa¸Ò<ËÉy&GÀWÒ6-èsæ5ª]Ú£Üm ùj™sUsjÕ‚&ý‰&ãŸyo5ò­'y™ÏtY/t™sZÕ\^òsMʼ&mA“úí¾=ë×%ò²(ØâÀ{ñH3qBL$ßúaUíd°íŠ7™ô7AÄ_Z¹”ÿ¼¦ù“êºOµHÈq7|lÖ'§CÊÃÖ/°SûÛêÆ 5áj½ÃòÝC à@R«/ùµ»îRMÓywýÕ@ 8(.b)Wj†Ks›ô†?vþèH“cw®RFA€“SüöwRŠ÷˜:"ùíƒÆHW~KqÇr9aè®t7Uî*O‘oŒÁްÇ1_¾xé¿xöì)häŤÈÿjd±•ß·c·‚‘‚ƒãd¨a¯”›#¹oB#Fi”Ñ=hTÏ ”œ‰QbŒª7£  å ß¨Ñ9=÷~E(Aàq¿Ú–xíÑHÒ;£F»ÑDšÐ¢q=+þÙ‘YbÅEñKx‹ÂÉS%еÛHkþP}þDJw2(ŽÖ-§‘’áPÑXÓîÁ v¤Á2z'sÆ´¼ ›“P§ õ/å² ÷¢ˆcÅ4"ÙÀ+9À¨¨-—mMˆã¢‰L³3™jƒ  ?úÀ)¤½ŠKyKæâX'£¿ZR ´†H:áE½•kºý29á—¾…áàDz<‹>yÅ‚ÓT¢~¿4á'tˆ=f^)'2ØËÉ &4ÏD 8°N>•“1¯Ý± KŸ×l›ËSÍkUó:8H}®N›×f¬zì¾­—¸ñ_jÕ#uÊó¼ä]ê¼6s*7ó»Òs|"C±„&<<Œp‡Ùœ¤-ƒ•Á/kZ~h¹ìªûØuâþó`+d=bÅRÞ¾x8Ü&}ô7´ûã1GXvƒsõHû®†^ãAAFƒC’xùž„õ4a0Ã`š^Kø»Ôg}õ€™/I³&-ÕÊ:d©®Ö´LzBŸ›B¥å šú9\#˜E4I¢ã+³+:Í­]…íýú®>ý±¾Â—Sª[ÛzÜÐ9&)jëŠ)úõ|‚´šqpíiŽ`–Ç*…¼o{ö×¢ûaið±Åùx­Ø~»Ôýâ^tÌŠÎVתóãG5-:+Øî—¹oŠŽsYšhš–†`êdNÁÓÁ{¢óV±íÙ1[ê¼fu=¶¸o˜œ3¢+°Q“v<ܪiäFñA0ÞÑq¿Ôûgƒ]€E—†g¼ŸðýwOssÏ–0ðæ5òƒC¤PgGGiŠ–cšÎV¢³ftRý&4rJÆuè¬1œ öÑp:­G¿Ô¢Ñíh\‹zKdXGJέ>'^³ÎèÑÈ>44¾3Ó­:j§ 4æ±À°ri½`£+ß(3 7GCÆñpᩆüáÚý£µ†±zh—Óˆy¨Q?Ò¨;Ú{ªÎp*l{ˆ’—¢$œ@3tAêñ.&»õV£n׊i Àp£^ꪒ¨Ð@µeðJØÈØ‚Ž¹%®Dܨˉ†¨ËÇg%+h†ãù8 ú"Tv êó£AøÊ.QaÀ‹†¨¾lÍ®©Oè “‡Sè^H’Ï+κ,8¸¨ßƒ>pD5Úä;“â M0'™\ t¾@ÎoÝü½:ã‰ì‘ö\½õߺ”§ºÔ] ÔªÇîÛzi-è¶-¤/èÒ^䥾ȘړÕõ‹¤$–Ž’ZF­e£ Ë+8¹/[ÿ™'ôåávpÈUˆãšæ‹~‰ —}!ø8é]±”?ïA·—á¾ÂÙ÷Rÿ´UÊ÷[ÆŠû%U·ü‡ýºi"Íãþ$&&MšL&“É“™Ì¤/¡€¬ ®àËõ€UE„J·¥”¾"/}aJQP^ -”×òVäýE]woÏ[u=uÁxg6»ÿß%{¹Kö\$z¬îåÖso/¾!÷›ö4·Fþ0²ö›_ÊÐÎ<ó›vú|?OÕ·…çÇsõ½IÒ‚Õþ¥ò_Vç í… š¦à³J É`fî—y–y«°hqÀž÷Œö¿Ùî™…ùBûBqMYÂfÏÉiœ©þoXl·-Î}Ù‹{xÇ^ˆžçÀÀ›}YT€È€°.=~m Ÿ÷ñãGOq²6É­…ox–WâÊPHÐÄ4©}é<“‹¦rÑ©|4ž/‰–’$ŽF¾\tZ>ÈG'³ÐIª×¨x~ÅÂ’!òœxÅ:©EéÄiƒtÀHë%ʵ˜kq ó4'£YÇ©ÙšÉæ¢‘c»N{÷hΟl2Œ7™'<Æ P$eNy5£†¾ÜiOÞ„çà¤?½D'ÁÄ=Òd}•™æŒ–ó¤Ö€ÃbË(ZÍÊëÒó>s·ÎñÿÚqìbo®¶(H0ÌÕ¶AÖϺ½ ‘pè¯NÊ?%àá\Uã9—眻ä󩻥ËZ!ªƒc•1¿q{®Õuœu6ìMM‹cøŒw6ÿ’S ” ð:4vÕÕ!•¹’x9#‘&`ŽcU DÈ5]ueÛæGûÒ–óÒ—ó2#»oê…õCNfpcôV K×(ÌÆR Oa¸Ûönج>©õ©i9_ë;ïn¾Rã™~çj†LŸ«öιZ®T{¯¸}ôÏêi¤å³j±Â~¸ìj†³\­j¾,xŠ“ÓaéE`j߆­³ŽÆÏø‡KX‹1¢£Lè),=/4‰U{á(8ü¢«ùrm@Û„¦ÕêócÛ±4eœƒ$øci…fKî`¡' i*èê»ú´íýúö¾‚Ž€¡j%Ànƒºö€¶µWïèý@—ACw°°§KìÝßsü}»¶V¯ÖÄ0*Š Ž“ÃÃŒ$rTQîΟ7Ûÿaª„Š8?ž«&Û=KÕ|á¡¿›+¿³:¯›ì_[„39Eæ˜$Å”¥¤ð[$†i Hf£h²|“úü^ÃÁØx˜wÍâëÚòHõ¿h²ß²‚£l)éÿ¥¾Nc›HÏ8€¿R$K–F£W£ÑŒf4c+!„c³ 䲯ÃÂÚ;öÆâÚp$>b;,!‡spd±$ ’Ðý°Û]–@ Ñî¢JU¿·R¥–-ÝåÜÒnaÅ’`÷gË—Š­¬ºXFã‘gæ™ñÌûÿ½ ¦38±»µM¦HB‹‹ ¯4²‹ýþ§°ÉÓ<9JÉàu¬JeĦ hB’k̈¦a:jD“64šÄt6£I8ì»hÌ‚N›YJZ‘‹1O+i!"Cðoa•šÄi9xE_%Û….ÑGv4f@Óf4¾ KhÜž2]L•¡)h î’M,_l´¢Q»üuÚˆ.—£‰íhÄ€ÎÛÑpõ†í…pMpi< ò£áõ_%ˆë[Ö¡V ‡}¤c÷X–PU¯!ÇQ·Eɘ¡T4‡)ZáÝ"^õ£S4à—úÃD^Ÿ ÉDhN–R€ ÷C!Ù'÷Ùt!‹¢)†‚×A 1Öd£>|ÆH=ŠÑ@uî'Ö¨Öð"„X€àè4ž³× ¾ZÔïù©±h¢ íÓ¡äi* 7 ˤ ¡®ýD….MEÓÉBÃ4£sÌuú-6n‘bæ/Mú熂%©0f.Š™òbRñ‚¤‹[4qsÔKIó£Yû̬]’`‹&å1ý†V\ʉIóæ’çF]̤‹›KâæÂ©àGóÖySQ\Ú·lŠ[òç-ú?•ég ós5 „ÆEÓ"/ÀÔf3§ª—ìÉJmÀ\c÷M_Ûõú¶‰†£;6å÷Õx³Y5Ÿ7†g@ÁÎ/[zo4„? ¶_oêù\i _mêº.û¡ý³ÆÎ_6uÂÆ]ë·@›ð˜çrb[…£å=×*N`DÒ ŽóU¨kÆ×:ÓÜ}¥¡vLVÿ€.héã†ö«-Ý€™¹Æ.èNaØX"@j²˜âáYÇÛÒ OÚ;*ú^§Žÿ´'{_Ôv"b;JùÀ²dï\Mˆ0×)†ga,¤31]³vó5“㻽Á¿¹¼ž».ß—ï‡ïÃûØxèòÝsÃïm§çNÏ×.Ï·NÏ}G¢R”òœþßX\=…¥¥j5ƒåÄ ÿiÅbŽœÀè¡ä)í{¶hoWצªÏ;îƒ÷«ën;ýëEÌᆓ˜ºýû?¤V¯ý$Œ´¯Æ¯²@À‹Ì¦yur°^Jdë²I.YlEãÉKóñi3éF\š ¡(2ƒa²hœ‰I³£Æb4mCËÑ´‚>m؆F î­rWçS§‘lòrÄŒFmè’M&:û¸/ýÂ*Ûiڎλ°#«a&DXIsh™Q çZ˪£@‘½S}Ήnû…öW•diÄ5Ô¹®t¼´’€/m%§hùŠzÑ` øäŽ$*J„r’"^Nù`Bõè”Gá,e®$0K’˜ÆŠÂµ+ŽÔÈ Ê®8éCƒ>òX—³$f†%ð:̈4«8¼k@ƒ~ñËž¢Èò^þ䵚à\õè\iL ײÞÝékaÁ©)&“dÔ-P¤FÀî,þîvÍKÙ¼mÇsIóÄûT*xi-‰KùK&í¢T²`ygÁüÎ’±8fÔÆLÅ1I—òXC+f)‰YtÀ¼Pfý¢Yÿ6JE1IóB*Z ã–âE“þ·:ÍÁ•"C*À!0þ«‘#±JI:µÛGêv¤7YiŠ€@¿u¸ïRèh^æZž¤ÞÆìùƒ7õ^õýâÐ1ø Àãr õˆTeÈ̼šás¡:_w¡¶iöб¯»oÃ×ÂŽ½œW'`zë1 Ïå±þ†V̤Ÿ7ê~0hŸ5‹&-`ï…©ä™Iÿƒ±0^¡Ÿ—¶Ïjó+y +˜Xž¦iЈŠÀRN~d_àÓæðL}ø!Yi~¥)|Ãwôï-pA¬e„Õ˜>Ðpópßœ¿ýWŽËÍÖ"}/ ï4ä,ËpéU$}@WþqCû\c÷¦î“®ƒoÑIüxx9νyÔsh¶¥çª·„óI¨ýzS÷äõÿycX> °$¾ÙÐuípo¸êçšô,†Tr4ÍaNM¨ÜÚªþªŽãÖp²(²¬‘„F¢'¢Öþˆ½ïTuïqG¸µ2ìÖíÉUåÀ¿†E’àH%E² _@á‘m†¿¸ýÞou÷ܾ».ï=¾;°îô'3B1dz ‹ÄR–Ã4ÿv‚²¹A¿Ø›l+ ¶U/vB^Qyu )(fÚ4K½ùÎjž¡’0ÞÎõV›K@2î&|Î…&݄Ůˆ¥<ÄúxvÔŽ¦½ÈwBP˜B(° 'a™ËŽ&À¦²VoX·ã óyÑš<-‚L ˜½ ¨­Ž|xЊƚÈÇ1ësÌFaÀÈÐ3àÄFNˈ͸N"u>/•qtÆÈ8ŒYšQiRvr÷·ù™!eNHuè…"m³8}S•õL}è™*ëyqè¦2“à$Ú±þ†Ö? ÈÙ • iÒCª”­âƒ[ꜗª¼MÅ{W³RJ€BÈñxN &àE2gÈ›Šu—=W _µž½iïˆTšÿÆÙþEó™5¯_ŸšÃÓ,LÍ£²yIɳfÏ—ÞÞËæ–“ù*pÅ0¢ðŸlm`¼K,5eä­¸;®:}kžŸÚÏP4[Îrù»öÌÔ»¯µöÝhê^µµV›{®†å±þÝ×=þkŽŽ/œŸ{ü Ÿì„$̰œ˜Èié±m¹½e]ƒº3cúþR¤42X~†h¤¬²tj¢40¤í h{Fµg' _‘C“”“$’c².aDÄ3Œ˜a âã.嫟Ժ6ªl_ëŽ?0ÙîHLD&`RÕ ‘GÆèD<)“ùžñä7•'  ™çcT…ù¡É}éˆÖ¸ãmÏ1BÁx¾jÃØøsyC´ú\¯¶ýµ¬n?'’P …ñ6‰ìÉwë?½xev¼fÛln¾ mÚ| +.-ŧڃ.”£ÍÌ0®yZVF,Ð rTh>| ¾¨$ÚwfÁ<*òrV¦5hA:^™׫‚€2Å;ÞšºèL‰–FˆÓÀfKÐöQt>-+ÐGZtQMÔ¤ß/” )LÁzKc9†[–ÆÅ¦Ô¦ó½%ÁåL[Ý…^ýìéÒ`+ʸÐûÒ™vЈ>Ø©E ŒsÝÁõ‚ÿ#©;ZÆ2BÌðœÙuhÔM²˜¤¼ :HE*â¡fÓÜ^"±„—ó”HL±»d²æ|õнuõT÷GÇMw÷5Wçš»ówn_¤ÒüjS÷'nßÇŽv°„iV+Ò4+&WBÞŽÝ—msVo"#"ŒÆXÆàm¹zcáI„ãá=Ž¢wc¾«¼æŠ­˜´foZ<®’ŠÇÔ£µVÿ†·—ôlo‡chf!o:"Öÿo›|ŸENõ€Ó>tµ3òbávãy–§Ä4Nå“;”ÍÃe}ãe£º³à‡HidDûÞQmߤnàœn `–sº¾¡bìçMC§Ùråá΂‹cy‘„åX9ÞIþ½Ú°QãzPm{h°<6Z× –ûó×Fó7ÕD&*ÍQÓH•ù^e=ì7jj¬·õÇoêïÖ9îU4Ü2ZþVã¼QZ;•–»ªñAÅÉÛÕQëónUãlv¡ˆ%«+(ÙX^zzmu¼nûWh ~ ~{³XÄâx¦â˜˜é2´PN̰¨!,6,!Š"–æKá@‡aƒ*´¬ ®DËjôA ¾G’}N‹<‡e¹I"̈)†§p–r*&‘Bþ´¤@¢‹…ÑÓhªˆÔŠ }¨A+:4 Z3D‰¼ àqc)LÖ&9—‘—ªn©ú˦}ÀƒÚù.ýT«a®½tºE7냊€C €%•óÝÔ ^=Û )< ÿ[X>ÙD†î݆ÜF4áE#á ‡&¹lXÊXPßI28PgØ‚&aí¸ˆI‚^¨'s ÛuJJÎËà ’çáòãÄ<òÖ àû&{–𨥊i*l†Fb§IaC¤ú„ÁÉ_ýß?NA”‡'ÿvÂS e±éûxNÆÒ¼Œ•lã¤,ÆBV°—£m qwfÿ¨8¼¥<üB‘ùςԟï†T©¡’w£ëohm†i*É©,s5}ïñ±Ç0bQ@(aÄ,-Ú)‘™óŽ]vz!ÇÿØzöó¦îk¹ÿµ0>ñöDL#Nßj‹ÿºÇÿ•«2]ýö¹4–MÊóBº<åPc‘ìÁPô>‰Ü’«øÀÙ³·ëSÄ2L+¥„Ô¾øÄ›-}Ÿžlùƒ»çKoæcotþg—uÝÝõ™£¦Xu9ÜhöƒO"Õÿ§îÎ5§NËÚûgN)Ë·³<œFVŸÌvVfÉ©™ª+ Œj†´ýƒÚžˆiD×È@ k{G4ý£Ú³cÚ@@Û9PêÐÔxs¨²ËœW•,JSñ˜‘J°î.Ž$Køî¬ü¿”Öo69žV;¾7Xÿ^ÑpÇ`¾[eýÎ-Š<65®W[ïWÔ–˜¬÷M–[åu?“ æu“ã[CãCã“S_ç?m¤gÀ_)R$$KÖèÕh4£[rì†,¹C!€ $lƒø M³K¸lŒ±—lll®`NC‡É¦ÊfsÓÍFmÕ? ¿TêfÕîFÛ(iUí²l€€Ýç5éþPmså®y4z5Œßyì÷ûy-‹\–¨>ÿh±šÓ¶S –³Jì­ÏnCÖ¯DV펟~½*­E£Ë«+Ñhщb?ìO჊\YhB‡®h HÔ `€x¥y"¢™HÖ+\‚¦a~M78 ¸¼Ti •Ä@¢ƒ•yØ Ïó¯Ú/6’Ë ‘Q þ,ÅhZMrADÎBYÞV'É(Ø 2Ì@ìË9nÏÞt¥µJ;Ó]4ë×^ö8ÕakÕM¸µW:ÄIwÕ”w]# 8B`P1FÊ&<c窮v—Oº•Þ::>”d1—J$|îž žPÈ…ÐØcѯ²“™"0ùE¡¹‹­h°¤üˆµžÚ¸…ßÌóœþјJMÞP+¢ `•ZÔgGÎ"ÿb‘4l%S ÅHCš´Æ­Ob+™vØNêÇóƒv4ãÙ(ôo#š‚Ë‚ÕI &k'¬” ÍQ2™„g’°„I¦SpRÃfùïŽù^y|U]´¨œd}[²/á±þ3­¨¦àMiîŸ s§ì?–*€û0C)0µs°HiZàóá¹Zç³ÖÎûÖ–ÇΤ9Ä7„;Èá¡3ðÀѱ¯4àðÁ„7ëÎ=²z@#3u-yiÛå OaœÂË’)¼‰Oxv .¥þ¾+ð¤ÑûÛ&?è(h®Nã Y`m û §Á0ØÔñÄÕù¨Þ}/Æùf?Üh~%Îà!^ýÿºÑ 7ºÑ螪۟²Ú}Ca­(Î(0ùCb×Ýà€Ø7¨tÆ‹"Ãåàó±q÷€®{PߨPe§W××§ iûGõ}AC§_ïÑî)?Àí’IHw&…Tú>…*ÒæNh~_ñ‹oNZÿy²ñSÝ_Lµ/,õ/§‘ÆÚ¯5ÐÆ_à"SÍ?L5 ð+ó™ç–šWæú“õõIû—ÚaüÒR—¨>c8£’तÔÞôŒ…Þ¬­­F#‘D»ã§_K@%ÐÈJôÛhôÚAÊ2›haCNÓ¢9IÞ«Z4YB’wN·4ÞL©I¦OH4d'gTü9‘ÚÃpœTÀ” Å;Y™‚‘Ððƒyây#Å;’¯]«B“ú„izM]Õ£®ãL‘sI¬s°â`ž¡ ¬XYFZVAéÓ^òŸ¾Ôf {NLœ-¾ìÑMw¦Ú¡Ä°Rî0OÖ5±\錗FŒ—}pGíÅ–ÓSíº‰ö£ –…o:ŸK:ƒ%Ú|Ô_‡Flïü0? Û!ÖC|ÔA(rè–ôÔ®)1¶º E)hfæc)qÅ®q¡P3é€*è·¢Fƒ¼Cö¸õ ÈŽ1ì]ý¹i?ª…Ðh aIz;ƒÏ F=>Î`&æÓvEqð}çi–hdøúÞô¿çEË —J%<Ö¦õEaæàûÂNÂ1ÃV„’ 4|Lä°4$ó|EvÎxµõs—ïs[Û[Û]—ãS»çÞÇ{N’àOš‰ž5Å-ÍÄÀp·%pÓæ~v®w²¾%sóvͲ°Ú3,MöônEÚUG; äf³\:úÕÇÅ»3áwɼ §h[¡ê³–±Õó¸¥ ÜrËá…㼓L P‡€¬Ǭr'&“¸ÔÓ&BµkÖÖ¢mX"eAN¯ Ù½)Ûô®¡ÊÀ¨Ø5¤éÒÅÞm|(ÂÓµ=ÁŠÎ~}×±·ßÐÝ'ú/©ºÇtçôP=c†`¨¼·¿¬oX3úÏ–5ì*àX0+>ÃÈhNŽ%§>ØqG©ûÒTûÒÒ@¢ÖT÷ÒX›¨”m¶¾25¼47üÍLšùÊR,ùêdý+ËGÏOÖ¼¨¬^¨²a¬ýÓiûssÝ׿šDõÙ½3›æÈG39Yîs´¬F!í#ÿ·YE" ’è÷ß-lJI%*…¯=G¡@ˆˆfÔ( ù«!ƒéãÿó”i¹d%ÐL K³ œ$Psš)Û8¨¦Ž¥PÔFØQûåô˜]QÅí¾ÓÅh¦îBŒ1«Ca šÁ¸ ÍÁ@ƒ¦ÊŸ®¨Ñì t½ÍQPCUeK·’iF=õÒ‚=S)/aqZú6r>d#mô×£‘fr 5¡K.ä¨Â†ôÁ v×{²ÒÊf‰¡ 8Þ! èÚ!¦²ÆÎØH Ûÿ=Ž]¯þÁQ0ç:“lzœ“_öM¤‹y)Ã&ɉ ïb°gÛö?äGTÙuÎ’2{I™µ¦Î~«ÌZ,Ù· Ì\Ræ¼UæDT9Q5T6\¶¦:´¢:ô2Q™¿¬Ê_Qå½Uæ.+sVÔ¹Ë꼄óà?j%v\ƒ£’<<Ý¢êà¢:kI•»¬:²LNf¯ªEÔä¹V•™+¥ð,yðPunÞ¨ÌZVeÂ[~(Û½P¶oQQŽª¾.)™=˜¥Kf!(yŠÆ°ŽòæYXN˜ù€Kög«w]þ[ööùfÿCg`Þî…œWjßvxï6¶Ãœš:æÛ@9:Ö…sßÀè¸ïð5û;ü7N7oæeÐ*ÇqXéɨÞÛu¯±ýYsàºËw³¾õ©« XòË£¥d;ű@)G^ɧNt´<´û@ pÓxõO&$vòp3÷ìÞ'®NpÔS»û¶Ó¯Ù›/P¬œg,å(¬`SûÊAMç€Ø rÖ‡#ÈjLì½höÿ‹ù:mâLãþJHH‘"F£ÑÈ£±lGP …ã$„+Îá+_ NbÇ$!9|;·CHœÛq. ‹VìR ‚nûe¿í‡Ý[iEÑîvÛÒ² ݪÛmÉaï3Ί­*¡~q›µYãëgÞ8ïÿ÷²aKß 14lî½j5õ²=#–Á‘ª~83堮 =“¦‰ÊžTé¥Ïâë¯ò÷}KêËvÏÀÄ8–NJpš$1†”PTSnÁoÍç?åŸ[íϸ ðþb«}Ruþ™­ê9Wû…Í 0جô߬úØæúÈæxÊ×?³Úñv˜„‡UöOj\Û©XÄÐ$¬ûàáÃ͆Æ¿Ö××6ÖVV:ÚÚI†¤0¬&-òh¦-éQL›LíÔ¥ÿ«jÁL•Hñ4FJ'w!Ÿ E94΢ù2´Ìn0R"#ÓEi¨ý„à‡TÝwàÑ iŠé“€¾À!“hž®.”£Ù2fsU(jÙê8¶õ •Fl… ÛF @"pœ‘{• ¾ËaŸ 𦼆˜ß8ïTTE»_¥nÁ[>Úl˜lçc>Ãd‡a¶Û2ï×Nu°‹~vÆs&`=õE§t»Ì’gï9rpÛ9ÇåGl“ÏÅGÜUQ_eÔ­yT‘¶êå㜗[ ªÆÛ-1HL¢›w§.×D½†©î“ãÖ¥~K iWÁAIÅx– 5ŸF#(\‹Æ.&S>Y怨°SIªÒ†Æ*\L?§Ã¥´(--S$’I%¨ëM4—\- ñÇ[PðQü3F*M“Ò°ñ„I&Å …iò]¨‘GƒÉn.n 'á4úR#®ÿjš;SּпCšüŒ6mr¡‹VY[9AgáTÅdQÀåt ––%ÂKÓ#rž”Lè” ÍÑoÔ…@Ž„NñJñµJñ•Jñ/UÁ×ê‚!Ù šÂUµ²;®Í‹ëò¡Ö5Šuõ¡5•|Óùñ½úV•¿¢†öƒµºÃ‰Êä»®¤¾rÀyøÂ·Ð<€œ™à® kCW¹á Ê6õ…M=ƒ†àUK_X3¤J#C¦Œ òùô5G8Åö\vx”(‡ ²paoÈÄCùÇsõ³íŸ\í³3Møº¿rö/k ‘ëqö§\ݦóà'®Ïy×ckÝ'\íS¾öo¼ýckí›s¾¨ &¼—–(×WW!åWWW6•?ðz©‘D<ñ‡ßýÖR& Wqø]PPV™ùú[JëGÖº­uOxÇg6Ç-ç>äìÿ8ÝøçjǦóà'®g¶˜‡Çœý³êúçV;¨ìyM³13 ÖL(±ˆùùïÿç‰Çã‚I Û/ÊKËH–~1M¦£æch"X…¢åh^æÌ?ºF–4h™E³e苦JÑ‚ Ýd…[Çl„½ˆÌ$HœÚFÊ¿-ëSyk°Í‚N 8d¡-ªÐ’VèaI/_· a£ÌIH’¦·BQ%&)µ+#ÿ¼¹zÂmèT.…NÌz*f݆¨Ï0Ûmšó˜ç¼ìL׫4bžé„ï€"ÔàSó½ü¸·¤ãük{v¦ ZÀáI‚ØÈbØ'RÉŸ–`-öRýº”m8[=éã£ASÔ ªŒz-KÁ¤‚|eÑ.KÌgûóuÓDšÇüILLHšL&“Éd&Óth-*fÜ“WÛ‚¨Qè-”¶¼­/« ÐWª‡´…¶RÑRhEÀò&¬Þݮ®/swÿÜß÷²î%wq/³··Ñu½å¥÷{ï.»Yÿë.×ü†™2Ï3Ó>Ï÷óLš'{fûá¬vÌÿªÓ&—±rñÊ™,Oª Pô(еÿ/v.Ã4r6MQ¾¢‘„Å:И ¸×´›è·7I®¥ â°E*à‡NyuE@ã,Š‘À’® ·T¯­« ä2X„J%$¹1km«%£„ 9±FF:¾ÅÐIú:‹(àÙˆKl·CløÔFEÙ뉲ÍžxÚÌJdf QÅ’<%‘JÖ±‡²ùÙÂü'{KŸU)ÿ¥«x…K%jgú¢VõR§úF«|ªQ>×–¿Ò•§ô¸Vß)Ʋ^ùR·ã.%Ô‚^µ¨W½ÐA½ÔÍk _hŠ æµ%óÚ²çÚ§šÂ¯«K4êMåÃêø–µrøp)øCºÐËK¥2š“”œd6s2›r÷p«ûã‘O¼'ovúo;÷»Â»û®º{Á!·<¡•ð9¤+ʡ@¸þJC·=¡{žðµ¶îv?œ…ƒïÛ{à8 ¼qߎ­è«m†õ P8ì'¶L„Œ“½†d(Èœô™æB5>è h÷d:h¸“§ÃjKUDz"›—IhŠ®©@Ã.‡À…´íÓÖ…5‚3½3miw¾¦Npv"§•Pm!9šÖ©Ð™vü†QÏZï;™x­I)(XÁ\ΰ…ÿò¢h'‘¯ØÌàQFª¶bÞŒ™œß«¦ôšÁƒÍWvcE;Ð9;<ŒÛD¼9‘ÿUSIäÊ9¬)ÅKi¦O†#I<ÍQëÙ ë:Ì’G»Õ)ÝNðÆsMÙcMñ¼fÇ‚V¹¬W/ƒ@ôåózå7Ú²§šÒUçÇwK[²¨+]² S¨ ÛK:Õ?«ò—õÛS†’”¡8e(MÕ¨ôåÏ4;–u{žUíú­º4”—S*{HXšÈ£¨ Žæ6‹†ˆdÑ$»ßÚÐÔ]rô|àò_sn9w]ÁûþÇNŠ9ÄÙÝ'E `ç¶(“´°çA÷ÀuGÈqͼb÷Ýw]“Œ¤7H’0šä4– CRð’ɰŸ5ùE³Ý¡Þðu±Ï’Û®¾×w‘>Pa~ˆÎ¹ã }ØÙ–k÷jr·Ð$EÀÒ&G€Ù£P^à«ñŒÔŒšãæÓß«‚AëÀI­¼ahÌ<˜0Fj‚§mýÎÑ„53õÅkÂIkl¼>¯é?k>5lޤK#1s̪;µRâ‘È 9mkp—Ø$Íc8©œå(IÁS¼„ØÄóÁâÊßþÕÖþ7ÛÑ'MWŸ?r}akÿ¢¹óacÛŸ›Û¾´¶>kñ´å±Å3Y”×íd‡”‡¬_ëÿóõˆÛ¥%èóW_þcƒ"WJrSB§IËž‘*ˆ*œU$'‘²•”ôm’Ý/{ûñ¾Še]…HHöÒe]QJW˜2lOÕ­>?¾]/"ºÒ%mIJW–ÒíHé•)CyÊPñJ_¶l{¨5ªyíίªw=¬Tþºt[]ŽP!cÖSI4é C‰¢Yˆo¬J‚Ü.ÏöîÖ]:è¸îê¹âõßqïyB¿„­£÷Ž£çlWðrW8jÅ!Pp|%ÐÓ•æ` @ÂMGðó‘3ð§÷£žÈÈ!GeÞV9%ŽKo ³sU×}ØÕw·Ã˺ìôÃ~Gy•@R‚X²ðͬçeÙ¥ÎTtkë¯xƒ šÿ ËÇÝ·Â’4öÿzWžPnáö¿™¯÷ئ®;àGª)’%ëêêêê^]ËNä$„@@@`”â‘IÛÄÏ81¡„@ÞvlßÏéît¾ Ê……‚…ùfaTù”ÔRÕ ¡?¦œTž§‚€¾ÂQøG¾°0àIôΦ¾L}tõWý†žaƒ2p´7bWŒªü™ÒHPïÒ¸Ôž€Ö7¢ëŠ@…ô!ÅPPÙ1ƒšÝN…TR¶_GPø=¢0ò­+Z¬¬½ß`ú¤¾íÑñÎ5çÁK®¿Z?«oÿ¡ùãúÖÏÌ¿Õ5o‰"0KŸÜ½—Ž{pÈ㥥ÿ[¤¾¦þ#™@¥ œ`kJ«T%(j@!©«P\ñÂ52¯B‰ ´ DýÌŠ"0£b‚”09€¼,q–@U„|2´Ð„&+Ð[™h$Æk$!Cdh^—5a`½ªÂWó„y¤€#`Í“Œv¸Ÿ'.=kl ÷˜¢þ†Y‡2j¯ˆukãÎSQ·næ¼fæ¼qÎe¸à€ Ž_ð«gìÏÓhA>ùfÓ\ß™°³D^F0°‡Ja¡f˜üÂõS“Óé'’úàÛÕÕäòœ^ºt©°°R¢ŽÂÀ¤¥›Nº³è±aÞ§í†?tqpHsàc¤ªnÞÝ0m¯\ðUlÅ{·Ó-¦i–Q1Lúì• å×´ f€@æAjÇ!]LZñu_šµ¡É.¢|—ˆÁë> ˜8´‹‹ÖtÃ1{¶!÷ꌞ‰òHF@ ‘µ,Ø6f,„PçWÁíwþ‹I2QQí¸Á +š²¡q~r ¦Íhڂƺþýûfèý=‹óŠ}À]wê{\NͰᷖ.*[XÌIÚUÒÕsÞw;zÞ·ùÔÙ«/-hÁs¥(JÊŠš«T—{û®X0o~~®ŽÐø"/^#|wÚç4!æÈBEÐ\ŠV ¹¯‘¨ E*ÑEŠÔ J¸uS@JàeË!IêØvªÁlˆ«ÐÅüxy&ǸÍÉÑÕ+£JÊX’•ŸE“C²ðd!s`Adé\§ªxô oUÔ¡H¸5qjÖ¥ŠzEýúä~¯O#¥±nõ‚ïD¸gŸ¦œ¦…¬€Ý¢HHV©¸÷ÇñãHb~,%—–S«_Â;•J.=]5.¯&áÁ}ñùö†“¹ì:II8!»·H°5^PŒ«‹;j#¸ðŒ@WêbvC´·6ælœrÊçüûýÖ\±8n¥ H m•H0Fù< òTud,ÍGÌX8 ¡ ›qã#p¥[³GÏ¢ñÎWÚ×ïØÁÅA~åRƒÖìF…P**¤XFH•Ò|C‰ Šà(ÖÕÊc©7°ñ5ò ùZ>tHº°ÍÌ|³¼L`ð|ø¯ó®ƒI°åÚðq¬µã» ·¡‰6jE¦šì#[!X†£€!$ÃÒ°‹‘ˆ( CŠóH‰„„ý“Ïû8ª£@ß±ù§û÷¬9?þ£J“Õ»ŸVï^‘ïû[õþß)½¹§8±MRžÇì`…9$üL„ðt„¼·r(‰”ó÷ÅœáZ‰4¯¹ìÈäñÓïØ<ïš·ÌîÛï 3¤3ä©ç†ÉyÕæ¹rÖýžÕuÕê¾iõ@‚/v¹MδFnbœà¿frE¿ïÏTšãî ÐÍ®ëí=Ðl þt©$Ü /[±(gߦm;¥…ù›G±b’–râ¡Æv@Ë/@­ÝwÎõýÀâïÜKs,¼ª"‚ªÜ°í‡¦ÞÛ]îŸY°@àvà.îØ|0lì«'í¨ jÏ8Íì“ôVj6xº-b8XUdÛË öñšÁqep¬6à×8@#éú– Fë‡û•¾qõÐX/Xëúõµ_¦’©•ÔÓ'°$Á¢ô0ugòN¿Öb$Œê™ÒÈ”68¡ o†U¾®Œiž•³Oãóׇ‚†ñpuT7`WY6‰·ˆINDаI¸“¡ûvìþô¸iÍyð’ë±ãn]˧ÆÖµÍ÷ -UëŠr„$Þ¥2ì;—.­&“|ʯ&!å!RÖÚßõ£•×ÐŒD"ÎeYDÛ´Pƒ.(ÑŒü…k:šªD Š×guìÏæ» ô»PBùìúÎ]ÈQB† 4¯Á§±*4·§‡Q¢]Ô ¦N°§^g‹XN(ØÈ¯œðªÃ΢0¿N$°£…U–fU~ËÉxŸ:憈×GzN&\êényüÙä€RDú9Ÿ*â4Ä=uQ·nÆTxmÎnœui;Oл*V>UyøðãÇÓšMÒ\üæ4ý/þÍJ=yòÄï÷Ã:Ï ) &ó¶6 ÷ªcÞƒó^YÌ©Ž9a„†™npˆ6îÔbyµÓv]Ü¥˜é6Ä]2G‹0—âHr=Éæ Èì]›ë4 Y¿Ép'Žà13šHã_Äí|.g*åMØ'AˆlÜe”;Š)Xah4Ü…Æ-Èb$7äÀüÿ¤¾Üc¢ºò8~’I&¹¹¹¹¹¹7w2— 3EpÕÊKÐ*ˆ 3så:OFtò@ä5Ã0À3 ¢¶]­Û¸jªk¶ý¯Ùt·Y“ݤþán£®]ÛÄWåQ˜ý¡5ÙmúÏ.Æxøå—ÃÉs~çžßù}?—RqPé)(°B|mF#5Èï@zÚ˜'0aÌEÁfçÉFüÛ€GXåN°£qXˉe¢ Ã{œ€‹ŒG"uü¸ñWjðV›¬„~'¹EC+XަÃa@˰AòÑŒ’fÕ,¯bä©e‹z~µárê–¿e¥?Ïß÷.ìYÒfþ ÍZÔe.êv-êv.è2õ;–uÉa}JX·m¡`ë‚>åEáöçàµIaqû)a1-¬O{¢K[ÖA'eE¨H]Ò¦ÍkSçui bƼ¸ó©6ý™.c^›´ K^Ô¥-éÓ—ô;`þù‚Œïó3ndì|/)©scÂ!•°îEE‚…#Qþ9Ça‹4Ð Aoåí¦ä¦Òä»õ Ë×»¯E´øµØ§?U­·š{n6z®Ôv€‚_ €ÐέççM}ï×¶½»ã8¤LÛ3+>­wÃÃÙ±‰0H+–™m*ÍxM˵&ÏM» &¹àpÎ59ó4 ‚L^”–*wÜhòÜjÀxóî×*þËõÎ+Ç=5u Á€Õ¶_nvÿÞÞùÙ‰þ]Eå Š%šâ(ž£˜(ú`R[:4õMò<6 úLýCFXÐä÷K½#Æ1Ó ÿ`ϸy`Ð:0 yƒ§m§úuÅõÅõ/Gào9¼[ßùìË`yß Ô=aò‡üÆÁq«ßgìñš{{¿±w\úoÈùŸÍoêõº†ÍÞ}ß´a´_ôHé"ÔJ(ÅPÀ³ó²óÛlÃ_‹¿²ÙïÚì÷ÔÞ±¼{ÿhõƒ¢ò»¶ÊoŠ}[TùÀRùÐVsÏRy×\ù÷£o<½<,ª¾[b¿c©üîpÃÕ\³œ!áÖAµLIIY•‰Ÿ<‘åå7ŒG._¼¥…”ÓŽ‘g0hJÂ:>«å4r&…€DtVB£bTÍvÊ­GÓÅkF#øW^b.Ó£s:ì' s4{Xv<—zG+ «;¯ yÜX®ÙÑøìÉSƒ$‘)ðP†XõÞm%£Ni²Ã0Ûu(ÔnšÆBo˜óüH3›ršC]ÆixËŒ¼vªóèH·^ÁRGP ¦û÷æ<~ôxc5VÛKDZ‰´ÕÁÕ¼ ¹ðÁ¸†gE—³ŸõâÀžçùÙóv¾{÷'é3[7uÄklá§â ’•iXBÉ #'‚9Šeˆ\M±ÀÒpF*’VÔ&šÏ|+¤|¤Ìªi9Üýqk/ÈèïX—AF_u\k÷ž±·šK¯µô^µ;B®Ô»€®4™tA¿QoêQäuÜÅFÐÈ\]«5= Np‹$ñ瀢)u×¥úÎ î?´x.5»á±fÑ2Vá€ÍÞléT¸nw}ÁÌk¸…]€0'P¬þ“ã½·ZúÎW´Œ—Úý¸U8¤(%Iç&d×t }c…¾1É%ÞØ×/öú¤þQ‹þ H}ACÿÔ(ô@Â: Oõ¾mÐÂkíºä~/ü“ÈÒòòR¤&-*š¦â8¨÷PWC„ÂÂÂÛ·o‡áWÂ_þéÏ‚B‰ë-ËËy¢ÐQR>ë5žvë§;ô§Ú C…!×/шi¶PcÉ´ :@&™éª˜îÍÚJP2MG3ܦ ¾ùWøg óóz™]«@àòáÅ‹XXŽgi#ÓìÞ\=æ6ÍöˆS§;L³NñÔ‰ÃsÝÆ)' Zg»!` ÝT{ÉYoÉPGVq¡œ#á:+àN¾/êш뱎ƒ_5 $vL#` ëkF#õx¶‘Èœ'(èH““rt˜¢Èbj¶!¿õTªrvÁ6™(¹jG &á<¨£’X¡axœâãÔÈU¼Õëüh¼ AäÀ$öŸ4 ±fYµKN`b˜›Ójm¶²§ÃÕ„{À›WL#h¼ÂÛ[}‚½þ9ËdU—ÎlÒ° Ž£i0 -P‚‚T²ðñà O3,K“‘6"š’ ”LEËcâ-ZžÊS9*^Òµp$Z¨SÇ´oØp"!>‘'¢¸uÑTT‘’íOH8±q}®FaÐ(uÑlZ™ÃofˆXZ“°d ‹ÃÛ¦XžâZˆ¦%)(…‚"Á`uRW ™0ŠN ÿM}¹Ç6uÝqüH“&EŠd]]]Ý«{eÇʃ€—P <ÕR^c%BbâÄv'('N; ¼ìÄqâÄÄ$ò ¡ÐBW åÑ£k'µë¤j›Äj×u"ÖQÔB‡÷=EHÒ&‚X¯~º:>÷ÞãßïwÏý}??i‘’°A· tmf°h×›åu§ª˜²Ÿ­huz ˜Ñ3Ž¦ÓŽF(þhÕLªóÿdÇ}Õ ë—½‡2MçÁE@‘Ý­x xéí*·qÉ ™ã©Ta°\ªô –Ö.›•†dàH–5s5‰jû•.k°0æ}G`àÝòúÑ=mÇœ'€ 1îB¼ˆ}fƒ½èjÁÊÈ-†ç*=°3å 'jZ"Ûì‹D)ß å°A•4Ÿ&×oruZ¼kgÈàïÊéŒ:!ñÝÆöˆ1Ðmì{ÀÂyíïËïÀü~½/¼©¥¯ 4ø9- Cá,O¯Á,ò~wù[”›¢Ñ[SSwQwnG?>ö¡?¯á`ÿ ¡í VÎjï1‡|›<KÇLÑHÐä êÛö都Ƹh©fšW°3ñ²õÿºùO^½|û*3"çTENxGú¿˜J®Ú?Ïßy³Èþ…Õöí6טÅvÅ\rµØñMaùW¦-vIQ´¼¨FÏÇÑ/¯>uât4¦ûã0Ic]=h$f\ÊbmŸÇ<èym >{Ø;äÎj~à’qÀmö‚@ ‡šõƒn r1Y³ƒÓð¨ê(z4žûô“ß³äO>xâ{™œ˜ÞN1ìeD‚™ ¿CÍ jÔ!dnuöºâŸy ec_}î°'k­åÇÈpˆA8J?ØÏR–>­¿-)s…„ÆW¤IEã¡Ê|‰t–1Å„FOk(Ô¼ûG ‰Ì¨dG@8•$XJÂlÜWCêŠ>_ ð@+ÊË’í¨ZþÙ– ppÛrøôdRiW°¼AõkÑ訬©·$MXœ.+мx.)7“Þ*&÷A;S|@TÃnnâlATÇ«Ôj“(›£j+éq‘¤¬'P$RñEÉ}NÆc}1$CzA}Ès›¸ ózeÝK ‹FB»+Rœc‘õ†Tf†üÐ@QEd‚u‹"*4娖  ,?@*‹T–E”s•Ì–Ò ¸E,À.AÇp’%YŠv •D9AT4¼¤Æ×Á£È3Ä‚ìª êÔ ¯Ì›ŸûjÆv£©k{ù¡Š½ïìñž®õžv4+o„Žäò^ªö^t6_p¸Gî Tµœ‡ªVºŸø² H1PºT8l«yww‹ßZ²iVzغs´®ý”£ñ²ÚÃΆ–ÍÖ‘]5GwT/’5ȇ,Ëktóú{·¬ÊHFW" Ç/צ‚UNV6s4]Úí?ÎVº‘@e4/bŸ)ÿ‘Ud(r¦š­|!–Õ‹µ¾{3ÒæjNHQ.ªçS]ÕÆ]£o~gÄ :CÆ`Øè2¶ELŒ@"f J8¤×ÒÈm…¾k-©´§ªv|r[gbâþóŽb@òÐ7†JÌר½d‡V”Ž—8•DùŒŠÂâ>xØœ9Ԩ﯇‡1i‚K› ‡ÜÙƒu†!ö³`Ðk9àùÅ꥜*NËs©åâã9séŽT¨€swL(™ŒV<Ä’™±JÒƒ?²3ZÀÏP‰T‘êBú¢ŽøT^„)œ@×.#!p…‹´ØØmáJ2°‡”YVT¼€ÁÓDHdJÒlNH樊)6å7­|È!û]$ääW-„˜¢š*UO sxAPD²,‰´–þZÏšFB±‘IfÓIèu2*‹üˆgûpœØÉ°ƒôì$-bÏR™VËk*óS”$5ö¡Vx…˜Håf`†ið Zó’$¡h+@Æ*„JÀv‡HÓ8Œ% @PIÍ \Á;”²[5”S àeNQ©4œ*…ÒµËuº×WdÖn0‡­¥Gmµ§PáÑÊÆ Φ÷ª›OW5C%Ϻ<`H3Tò¬½¢Œ™i%=‡KN4ôbµ÷yÑÈÈ6GªŠ™jÔHTÖ K¬/¯ÍKP°õó¿é¨‡ç8›Wã;_éëRÓ‘žãÌËמ¬h¸TÓêßZŠÍQƒãTë’t'k½ï”ö~XåEàx(`À™1ƒsÆüÿ­«9SÓÊ ®Ò}Êå)­]—¾PQq’È "‡—›'—®)æ{ö3HvÁ¼@È;}Aƒ ÁëÊï›ýàŠ}%ÏÎ~ˆNÜcõ%zsê£ás!c'nè(ðìwuN^ÿó¨WwqÓdtê»è1ÿ¯ÛMm!ƒÐÒ¹ÙÛc Ìtlnä…ŠzsvÏ4’ÌK åUBÃÞº©ÉIJßä8«‚7¿ùg$ÜÇÅ'‹R"ˆš’´¹•jÍ{™ù7¬Ž¿å—}e-»Qäø‡µìªyç ‹íöÇslj§´±­Žk–ÒËÆ ÔjÊjûºÿðñ§Ó21­ÄâÑÌOåx€÷:5å²Ù%Y™ýoæË=¦­ëŽãGª„dÉ’e]]]]ëZ6È$Pòhµ´Ù”!¤ÄÅ`Œy&$‚ñBüvxÚ< 0PÒF­Ö6i $$Y²Eë:íŸJÓ´M›Úµ£k”(S·) Oï{®Y”¦kÿ)YzùÉ:üî¹÷žó;çü¾Ÿ¤Ç°‡_$£EOœF¢z27×’ñ¼UÿZÑȹ<2”MÞ,—t®ß©Ib¥¨AÐëXFøúúú/þòIlye)¶ðUìÁ’¸‚KK‹#3‰€Fä,+lTU…NULœ98Ü )v}?èÆ|Ñg< ñTDûýµrå)MIOJ¹wçvÉ"ålœåñzl]âž……ùG=žB#^#hóQ»‚I9N‘¤w×UN¶çœ.÷•Žù@#°nÔU4îÑ6&¼Q÷Áþ¦ÊóáCmÎôW¶ Œ\%“¦ð V%0å‡Hšè }6J#04¨^›×Rµ»-”F†¤+$fú¡'xCR–é• .µ@RJ á:rÖAµO9Á¤i@N,GÖqÊŒ lª¢ EBr†‰ÉH\•dÐ)=¢¥ÁŸ§„#Sr©RŠA.1I¯BWÏ“§‘o˜8ÙU´û6àa0ˆ<f¥ Ñe#=ˆƒtÛ(Ò„kI°Š8‹%Gqú}IÙY);3“7§)wdð)j†G™(gY—Ìó›@˜JN#•£@Y ‘U"Yó =$0.IvlLÝ•¾eOú–W·í¬Ü} v¿¶IWÚVQ;Z×ø–Í}Áé¿ä LY3Vße 5è5èbÆî¶{И…DB‚-ž‹7Z ÃSjvß%‹w! âSO‡F00Ëþ|l˜©´–ÆS&aåŒTÅ£,:<å ^µfjN(šs å]Ṳ̀ähµã7íS¦Ó>c@W½“1¼rJÆÛ6÷ìÉ–wOœÂ|g-ÞË:A PdJœìÒ×,}­(BÇâ¹êîŒTÛ_ÝüPËŠ¥Å_ŸR•e é}½ú6 HD$të)Šté[» [$CÆ®îÂ6tèÔÛ_ó÷;a-ù¾öš3_ýñd¤±•1#!·|vý¯­E¾½¨8pöHë'×~GdyåßË‹ ¹û±?\ýs°Ð7P  téZ׊F†Œ}áÂ6·Ö¹oÓ®DºseØ«i)©÷ïß§ÁGcý|n®öÈÑ 9«‘3ršâqä”GR·LkËn—Y¿0Ôü½Âr¯Êq§¬~ÎXýÔqâÚßÊLŸUX"YÙ8Ìj¹ •«ÕÆWUùø¶¬üÈ/l- ú£oa1qZ5,#M–$ ”=qñã\>™Š"ç´džÜ5£‘ÉâgzõJ݆•ð2Ù…ZÃ@Éxdìììì›7oÒíë…bKPyÀÁ"=j±ùùUØž¹U)ç5‚J*“¼hÈ)òŽy õ%QïwÑHñ(Å€ü¨W;êÁ¿#¾šáÀúײ@@jN¡”±Ó¾e1ì”E–¿kÃ|óÐ-Çn-qÌÀ¸îÞ½›‘–!æe[éŽ?1¢¤ˆzõã^ð’~Ä•„xã>CÔU2æ.nÒ4ëÆ<¹ƒÍ寷k;×mÛD°§±ü<Ç—jI{-‰8)‡P±¶¬ÒÈ€}͹O”Ý>é¬!qPäèªK‰d¿­D‘P«£¢ 9î5zœÜË[@õ ¦«”Ú½L›• 5’ÖcòY ÕÞ,<ð`’Õª¼=\z2ÐE)g% V‘™F¿ÛR› {EZ´û_5åŸÎãdÐñÿ üö[IÄJúãÓƒ‡‰ôùÌ’°%!$²<½u¤§AœµcÕÀ'°nqÐÖ+¾­_|[¿™ôšHW-õ¯~ÂLBlj§4ÁTÌ Â&†ŠëΔ´CÕD­ó½ÆàŒÅ5kóàwÚ|,A9Áê…ä]u´^±¹b ÎZ|×­þŸ[ü7-þõÞ©ÆÀ%§ï¢Ãº€Úâ‘Y›–ò‰7$Pá¸è`õ^°z ÐhƒO€"èYì%}Z42ÓØÒ}´þ…äÔduBA3€œQ ³ª$¾òƒ¦3çMMÓ'ÏÜ8ÝñîÉ@vÚFP Oγ;&-Í—›ÛÞ´{vj6ÀSþÒîL†¯ÏÉ¿èn¿`v]s1÷™†à”85ÌB£aó­ídã!¥a´Ðe¨*÷ÄyO(g² ¯’©‹¶kÛò]†ŽHAgŸ>MïÕw<`àIXß>`uå{h»¥§¸#TØÔzFŽE¾üôK "´$]y°°YŠ-/,/Ææcï„Îwüƒ¡ÁüŽößõ³Ó±¢ïr×<жùØí_~*ð—õô…׊FÂÚúËÇ÷qxQ; äXnjjê±”øh™†ºî··~upO¶\"E9ƒ²3‰å¹t3ǹŸùcCÍ\…å÷Æê?•Vß©¨ê8ñí¶±îccõ¾¤D†— R2÷Û?{ç!< Ñÿ¬pü××+t5—c …z-Š‚DP¼”˜v=q™Ì%oä’ó¹ä\‰æR Ï£d²F4ÂT½ M—Éå’DNÅñ‰2Žç863Q9òƹùÅ%*è+±±Ø¿–h!›§z/ÆÕ–€>úð×*TEr9]ª’·ÙÊ^ä 6}”DýÃnݘ¯p<`ˆúªFu^ihGIÔsŸÎ-Ѱ¯Æ÷, FßQñ!­î4ä% š¦Ø_Ü ¹¼°ža¤‚lŸë8> 1» þÐȈÇõFO— Ÿ*i.› ¬b9 ”M´íwÒAk”GXFà ĜG¤ß!ê£H#]&ªtk¥ÎC6ÒY'i5QEóÔ!'E.àdÐ! ;è­'i3Q8 Ûñuöh!¤J¡á¬ÀÿôyÚgÐNB2ì$íõRý^I NñÒ6A l¥’³*–GCƒY©ÒPNºM”²Âõ¤óTo=E¬øŸ¨!tôs°/n , „‰ ˜È ™DÌ46Ìô. ¢¯Žôb¨Õ¤¿šDjHO3}Uœp¬”RzídÐFû¯¾_dd¨ŽD8f£à9ÅžÍÏ]t<üSß”Õ ƒº]iB7á™±¦­~8©ŒR…õM;¼ï;<ï;\—ܳ6ׇ{Æî†ó’Ín ‘kxü¿$ƒß+"¥Ä  ‚WíY‘R`Ó¢=-yïdÀ¾O»]¡VË +Ë0Øÿ!¿Üc›ºî8~þBŠdɺººººW×òC$Œq ÐS)i M;¾ñ#ε“–•<œÄNœðŠßvìfÛwÞî;Wá¢x·Ö€qt·ÿå¥j𦓴ZB:¶ëJ_Õ¬Uf€µ©(ú˜Ýu¸Ö s~Y‹Il¬ÒóAmV îuB‚¾3,¼&Ï4_xÝh]`Ôî~¿68RåÚõâ6¹r`iJMN+^QgE̾nc¤‹oi2D€4€:ÚX$qCS‹©)·;D>iæƒí…-»Mhž8=>57ƒKÑôÌÕ?ùðäØŸã6 wJ³÷®Ü‰X¢š–žüîV]sTvVF&®^šÁ-ÛôÃî®F½+®DóZžôð]Þµ”R5Ò¡dd;­oÎ<²ÛTÕüºByïúJl›M ¯P¥Ã‘Ï XRN“¤tËD7m½h.¹WT9Q°kÁqâ[êžÅ~,+WÉÑ2)ôd܆5ë°—=²ŒÇûÖÔõwñ7==5:: çN+4J…% P’G‡rÑ;¼¿Z|EÕäÚDas¯zþy=oU³-ƒôf«z5Ø%@ÂB!Á’È3p€,>þ.X|oÄé;Y±»a‡7E;çjƒ˜¦ö†Á£Uãµ{àöc5ž‘ݸ?ÓîdÏÔ…„-¯šÒGÀù )%ÍÉI·9aÎ…JïÑj÷ñ}! ˜œ¿i+L€Ó“ÓlúpðÕ4gÝ´íy¯ÃÉèÔ#ÁR@<°§k\gr~QãÑmü ­€-%3)h±hÁiWíêë[Mm|S§!ãÃó¹|ÔèoÕ‡Zs’æv`•Á÷ÁÑ÷ç¦ÀÄ¿ö˜üèzé1Dw6ÏA|Ú,Œyᎂ–H~CÌØÔcŠ…ßŽünîîÜGíc±Âp«)ׇÚõó¾w>2ÅŒ‘P“©±]ßçC]¦¦˜.è+t¿¼dK:©”‘ðåÒééªÜÿûÜ7.“·nÝ ‡Ã$I*q!“ÂÛ)#É­rÕìÂ…šë–²›BÙ sÉ„¥b¢¨ò†¹ì³ÂòÏ­ŽqsùU‹íŠÕvI(‡q¼ØvÓZ~£°t¡¨ãR‘ýº©ôŸæŠO‹íÊî åãÖòËÖ²KÖ:mú2BÁ‘N±ƒý‰é¹ÿÒÕ~÷ïßiÃF9'ëDŽÍ耆³Ñ!Ö¡A ™ä,@ À!ZtX‡êPïh 6`2If£w (ªc³Ò &b(@…\õ¤Ójǯ]ÇŸô“oÚ•«W`AäCJ ZÁeÛß´5C~}Òeòòûó“^ý OÛ_Ÿ×ç.Hú‹] 4" a»7 5¨s6/·ŠÈ°GÁ(;=z:v…ÿ퟉‰ µZM$EŒ‚Í«Ýe¿>èý©ˆLóшqÀŸpó^¡Û«ß[*[¦`hRÅqM*8ä,F={P¼û~w ŠŠìñе«°›wÔˆLRñÜ]µ­†]»\EA³Ä(‚`©Ev3êr¢'f ‡h9¦³T¸Lº—TÉ@ -ÁÃ,Z*£ò_CÍ6Ô[‡º«Q{j³aÈiD±aJt@¤ƒ3ªÄ]xœø^ÐÈ)Q)/~äȘLŽW¹Îînx¯6‘~œ°{NcVñ¨„ÿCÇmûXNÔEÆö„Á¬ãœ«pc°qà!˜[ªýçí¾¾²Ú•œ‚%H5+_%SRIRç×2Wº|X¼æ9YQao¤¿ÄùC’U‘@$°l`dì’æWoøùÞÀÿ€FNˆXiB¾pqFÌPd̉ñLØœ¥b0J)€ª »I#³VlÞ­©jµ`séз´šæuÿü @HŸ¹µU å¹Oµp¤JâÅß^ ðžD~¼#¯Ùmñ_þ㕹™ÙSS÷?¹Óa‰tê"9-ÆÆ¸¡©3¿Ù­Ûµ†F -Ãì¹B¤‘nޤ¹â””$Í$´·¬\¦ Y0 PVöF(A-¨QL'îHk°¥5A"ÕX1·RXÒæÀ´³ð8ñ½ ‘Q'Ö#ñNœq`¥ d¤Ê•òh°fШݺë¬H&)¥&¼çðžÛÓ®Ýc)k5þl°´öˆÝ5ºßR§ùûõÓT–ü$›LbBÒÜÜ47mî …ˆg²£Æu‚ÃèºÉ:¨P¸Ð–Rž:@iéãBå!·ïR胖‡0@y(³3³º;ã 53ºq'ÙMÖì§ýàŒ«îˆŒîú`(tÿ§Æ£MFÖì–“›Cï½§çqïÿÿ;Š÷Ò6}PÉ5î‘Á„ÀƒÏ£i¯|\oþ#çøü€ëlCë)€ÞÒUÍe®{ãçµb~I'è2¥c²ÁùÓ« (… Pгƒ¦Îh[`B`PÊ-Û ç°±J Ä¢è2“·s»kr7äôn™/JçÓ²{®³Géëd=íyößÛ? ßœ…`8™…??çõºÙ /×hèïggïG‘/ÇÎûäŽY; ðÛ} §›µø ݘ7Š6?4.÷t«:žW#¸xymÐ&€$(sCËNió›ñ©‰ÂxÐ „²’Šbœh!h?3LÆ’×rT\Œ§×.]Jß° oH%Ì!AKâ)‚\Oîôw¿Vjn—®(«¯©o×Ü.Ñ\Sª'T –‰R ™Ti&KjVK#б—è®Kdû”&K´×K´%ZÍÆŒ„8øŠ‹º½~ˆþßÍÍþ­½ŸØòÅôþÝ{¯§¬’8uÒ4š²Ð‹Fw¡Ñ,4*E£,Îû«¦…ö`ÉÃÿŽæ¡1å¡^e\ÕÛD*!Æ%’d)J¢%°\ÉIë:Áe‡,í€]Ï;?Ó‘…Û÷îîHÏ€ð{!M&ÿj£¦Çž²fY÷öó!sñ€YÑÏç‡,{B¼lÀ"²‚Fdý-²>^æ0Æ1D"~!â3¶n]êÉ3ÿüë…é¸Â˜XåáÇÅxƒô’Š.‹lØ}Pô4 ÎõÁeuÄ’u $PYÕ€l•¢o E¼†ÜjÔcÀ_zkPP·ä‡n@οÈù>L4 ͈ R’œ$bðvrˆF:&G_¾ 0ãW£^ jñÐàÞÎK8l›¶ª¥¾ÚåÕÐ $V9MÁŸ×;.Ô9¾0âú¸Þ‚¿lpáËt<Ô¿0¹Æëì'j[ ‚ÅRËÃÙËgõ¶!mcåŽ÷ÞŒO (¬P9»i눮 ”rªÑõ‰¦é|£ûwF~gÚ&˜6"Ñ&á¨Év¼¦ùc#¯Ëbƒåš‹Z¡©Ïš\GŒ-}•ÜÇlã-màèÉKÐÈø2E`¤§õæs:óE“ëXEõÎNXG$Sè·P@m^›ÆKMþ¢V ˆ'× ½«Ð y†Fz ;Úsœàw¾ýڙˀù……éÈÌ⣅©«S‡›BÞ|Û¡ÊÀ­¯îÎÌÏ.D¦¿ëÕ\ÙfpN§Âã–19´vÉÜAÖDfý2¯ ½=·õy)âgÛzäþ ´ý¬ä•9ÝJk~Z6ERxã&"×Iî=¸ îñôã™mW"*DÅ©H7Žö ¬•$0 ŠK€¶i|²™ö¿“õM¹áºªæŸªªŠ}—Kk¯–ÔÞ,Õß*Õß,­ýFU3¡TO*WM#7ŠÔߪ4WT5ࢩ °ô¯RÃiq*%‡ÀÆ,ž¢&'n>ˆ„ñv4üÌyyu>˘Œ®÷b$àó‚Æ¡$ホh, f¡ÃQ ­žFúv¡¡lôÛ‚(K ¢92™ôD‘„`H’!¨xZ"ˆ0´¸ÞT{çÎÈÏg8<ÿbÙÿQCíÒ—N ¨F"$‰×„q{÷ :òCé E9â,²)z›Ù–œÃ6iÿÁâ»|€Ïí?Xrd”I0!dEævE#OŠâ9×kaå8??·ò½ªPµVÌ$ŠÄ‘€5k@޹(Ä?M#CÖü¾f¸ LµsØ’=â,îµfÖ(ÄÃA*<ïÀ…¸"t¨'kHå©áÁ ÑGSöKÉÚÃ&ä×eÙˆ/Ç4ê4 ¦ÈRŒÈ«FýüKH·ÓðäŠ) Äm ƒ E¨©B˜¹•ÌØˆº¨Ï€qe,Bœ ñÐf´>•M”7±¡½hý_#6@t ¶‡Á ÁýÔ›±@ –ãu¶“&q²Ö[Îê- —³uö“Ú–³+\¢ÞþIÅÆÃÎ^±x¡r )B’Ñ[RRáì9£í¢Þ×5ð½U\’€24A‹‚Ø‘œÚ¦ÜŸ³y+D¼·’Ö3a Àïž^†Á¹zé8?÷<çç~ßÏÃKe '#¨t’Nç`úBtSkXþe’©ÝStª®åš©ãCcÛo]Á ­–½ Š †–f¤Ã<„’2 ö&©V¹8tÁèù\iê\2¾ÖJߊ$~€= ‰}âîƒQ×äïT§Q ŒŽaX H¾tSwIk¯ª½_éƒ="Ã4¢,—þAu ,à4o±«·Âë,;riì#ñ±8<-ÎÅ¡ÀAöOÏÎãj"~yñZÐP{¢‘n…·Oè ]½ª.`O¤Ä&zÂj_På–*oHxfÝÁý]ƒ¥ýX5å=v…%?s£Œ%À„ejk«¡ÔÍÍÍ$jd<ŽW„ßW—NHâÿ<šNŒIü6>‘=-Š_|õ…¼˜—J ’‚GŠ9ÅP2ž-ÏʾVz`JSÿ Êü°Ò|¯¬îïeúë•ÆÛÕ¦{ºUsÈ”N»ÒpW[¯Âø•V·Êzµ¸ò(Ìi,t;a¾žº)&Æ5»ÿ­ý@·¤F`76X†a(È÷Zž‰†Th\…bJ4.GÇ嫦‘±4¡D“º”~ [¹…Êa2…¥( øz ú¼ú³§&ß§1îï‹I~àWäÒ\››}öû‚‰Çñ¯];ßäXJ™„e_ÞúŠ¦Óª=áÛ{Ì! ;kÇÝå1gáh«âx{éP›fØ¡ïü6J†£Ùu/åÌ'TƒŸ‘§ ñ[’Xɱ$ø¯~ú™”áA#p/¶èŠ´ƒ.ŰCïXN#Сֲ“°SAÄ^=é)‰.?Ñ©uÔŒxòêJi†ÐT:Ë¥€$µV‰|u(bÃI¬Ça—Ô a¥S+¼Q‡›0„¢6Ð'LbL€dbÅ–ðèé76fÀú‘¤ÒáqÍ]ƒœp‡ƒFL)|¦õ5¼p¸V’%“$¬Œx’”1 ˜„Ùš‡ÌZÜ61å«m‰‹F>†ÝÖ­·»ÊjuÛ÷nJ_˧Ù·–ÆÀ¤ë9©zÃ/:KkÎ9{N[]gL ||â)wƒl ™’ÊTÍŽ·Æ6_hõ:„ªÀ¼ І²޾ﲲêF…áŸå†;º†»5毫Lw4WK#7upéº;åõÿi 7«­Í¯m£)˜8}ôUÕ#ðÅørw燶%¿»™™™ÄÞoOÝâY. PÎ)²PPŽ&KQLÆ‹ÑľUÓȯEÖ|b3™Â¿DáKKišL“ñþ^ßý‡ß€¿M~5ŸD¶¸h’¤™ŸçÅ1Òfãq˜ÉŸùg†åx’Î`°…6ë ߎ´íŸì.¹µCmÚÑ6Õq'hD8ÖRë(u¼a«&9JJ³<ÃYL&hè€_{ò&Y’ÌÓëìïÿð9”¬tšáyæ5õ›º±.U¬£x¤m9”ÆÚåÃGä1§vÂ]uÌqp¤C=tdoÌQ4êl= aYJy-‘¦pij”c $HÔH¯ ˜W^„&ŠÑ M¨Ñˆ )Ð(œ)Go¡{6y—þùK$O£ ¨…E •†f«ªªnܸ!ŠOø‘œ“Ï eîIò¶$ߌŒŒ@}ƒ*G“›Î¿m®~oÜ£u@¬—Œu¨†ÛuÇowlnÑÅGBR„”¡Ó(MU¢ÄäµEL(Ôˆüï¡°)ß(¡¿ø>lYñ´4ák 4 1;j­e³eé4 Ýe¡„oùõhÈ–À ôÖŠŽ‚^, ØQ CÜBÔ(Rxy™›¹1ÿÑW¢<„€'jBÆÅšð`ahzÔgB½¸ýhSâ†4®¶=þ×5r¥Éý“㜽ótcÛ%sûïÿ‡ûzi"ÏþK.1!!™L&“ÉLfÒÒ°(àꞸ.‹^Ũçè8¥­å¡žò,Ó‡ä1ÐÒR -Ђ<ä±§·.ÑuEX|är—ÿ;7·¹Üºç®ËŠ»>bÌ…¬¬Gï;­²œ‰›hÊzw“_šaÊL¯ù~?ߦ¬µ%{õ›~½T d9 Ž’ÃIr„І¢•¥1‚ã8^5F– d€½5]—šÇŒ5—Mõ–W›wñëWB©û§’Úsb­»H|wùJxã •«|"‰§X—îà„Í9i¶C»|Ôu¡¼Ö›W”ÿ^ª:!I¿j­#ÛÞ8k’`–]_–ú !í9 ÆÆŽ:GÍÒ¸XuÁ"]¬pk ©; ²¦*†aÑÔöe›¤¬£ ŽvÞZ€"/Íò‚»-§ÕŸí ðßÐ5µdÔŸüþg+oïÚ\i´ îVÞÓ&4ƒI|:÷W—þü!T!­ÏÎÌÌŒVûõn¿ Óåø^_;ßâ<-ZÏ«ªãeíø^<ÙÇ7¹óÜiooŽ¡•MCœáy>œ]Vj¯Qµý\ …ÍÇ9rDÎ#P“€ZI@ ;'sÙŠ?ìÒýÃ`üÎ Þ1”ÞÙWr'ßøm¾ñk}Ñt^Ù÷ùâ”¶ða¾x¾ÒßÍ-û.Ïø­¡|A<Ì3}m(yWvÛPx;·´1%¥ŽS á$Ny‘œ7~,Nx€·nÝR‘D IÇ Ì# ¡,4¢F{"¦à ð8¤F#‚ü9&É@Ý;Ð@ê݉Îðè´õ KÚưfIÍbðŠr8ÝbY6uÃÆk¾/N¸ç‹-ÄçΙƒÍ[BEqP½a±TǶ¯«Zè—øþzÝK×U! J€ã@G“ÀÁ+Aì}ïÞ½`í϶п‚¯µ‘à¶fŸô§Ûç‚Û3ù’SõYbOMQæ ú`è–^U#Ú>©`Ø¥éªÑwJ»H'Â|G«ä*“bX6êà9·[ä|ç-B]&ä7Éi3É×å¯Â.~vnùNcš­Q$Æâ2S£9Yód$øÈgDÞ2¹oŽÃ”z±~5±ö2}#õ¨±ùe®°[ÖAÎJ  î ‘·u[QÀ,ßÒi !Ä‘EÆ Œ´£<¤¯rÙ-pÝ["w úêÍóã¿Z#&9 _¨p‚ @#—V95 8Û 'À ¨O1<† V)bÖÅÆ§/OÚýNòÖIq8Ôƒ,á E'q1u9û'+ÝWÌö1QµÙOZjO˜ªÎYê*²õðŸ_bî=ÕÒ-IÉà(Y€8ï$Ÿ©p|T\yõ¨ë¢(MV¸ÆªO‹5g+ÙìZ¤óVûy±ö²Í¹Øóö)"JG.U4ž+¯9k¬¾|¬ Vç’Í9XlÛµ:EËHÖ$I‹_gÞUìÛר®ñ´©›@#~mó˲|“ÐÌèà½Ú·º¦I+ò›šùp´–LG;ï>®óúùf€ < š7ÇåÎs\9ùiðÇàÜS90=…€ò$xy`Ò©¯÷i\Þ¬†€Æã×{Üj)Rñ«;ö6·j<™Ö·éD(î fjj ânóõZ8`Fê˜/TÃÁóÆÏiB´Šd˰«húЊw¯î=0+ÞÊ+Ö=Ô—Né‹nê A&ÀoôEàiCétˆ+@‘»ùÆï Ă䶶pz¿ø¡d*¿ä/ú °IŠ$d8]¿~}áˆ";?oö€ÕY˜çsº dÅ`Á083{V¢-ÎD#éÓÈIÔÈ ìÑ2áÑ€>àÑ0\Ï@òUzxT–F$€Xa0–Àã*–¢b•ʾ¾¾PïåÙÙ'áοvŠÿÙùy‘j=ŠW,s*vå–dc—]ÛQ) Ôoï9¦=Qm´çõÔå׉KBoáKÛ²u~¶_8yÕãéóe wFþœ›ûëgŸQ+¿P4üEHš!gV_]NÏ+käw]µšÎJ~Àž=ìæ{í¼$² ¨K!ÎÃë²Â2R‘W”4x `}ÖrÔRŠZÊ~¢Âbg[F+ÈŠ¼FdÑSikÈ6::ŠÊÞŒ!Htše]lÈq(:%* ¤'HU8TJ»y-²RìÙº”áâh6ŠÀ‘Ï„ºC²‚‡Ë?Q†a–ˆòèà‡| ‘Pƒë€_<`°_@_ÿû¹huŒšCYØê€Ì;$V­çbåNÒ,ì+%Nlˆ[~0mGûañL• x0Vé:c­ë.²ª“Râ0Ј“` b[Òû§mõðÀñ⪫Ç䑆q«£ uÛ[4‹áòF5¬ÛÜ}È4ṟ.&Ê’$¡°2gë>©tNÂ$ˆÒE¸Å\ü€‘>1ÕÁ>…^Y{`>¶ÔÃ$L€LŒµ°(pr¾¬zÌä*©Ø¹2 ‹Z5—Š$$ƒ+”Û—mŠ4ç6´iCIœonÜ­9î—ey¯ÆÕ¡ñvi} GNÕ¨÷ÔW>?Û6Ú¢môêÜ­Ú&¸×Ë»@=ú6?ØFãññΣN¨>Õ4òãýYªà€!Ä¿¼öeCN}§¾¹Gßâάn×;"¦Ácñj©z%NQ$®P°óöÏ…Žù ¹ðÏOž< >íð++SÞ‡Ãa‰ãE@ÈÛİÒÚŸJþ–[ú•¾øAnùƒËÍܲ›ú¢ûúbаPpÀyÄ4’[v¿ù `OXŸüšÄCŒU«ÕÁ™7ÛÿÍ^”…ã‚ó«×þKò*h¤Ç}:t2 mŽ˜Fx4(ÈŸýp®Fƒj™%'2Ñ©,ù¼—Gµ[ÙT#£h’[M.UA/H‚Áñ*›mffFÎæs²F^ؽÁEÐHxé>v||\I*•‡c8ÉQ[ò³Š{ø~i÷ïíÙCö¬ÞÚC= ɻӘPTô÷ À”Fä-ûÆ@ܘ•£GŽ eR@À&°5;×îuh2OHÚW¤ˆ¬‘n)БÑ_÷Û!{ú€CÛ)ikJ©DLG±rÉaQ§ ù,²ÂùºÃJßå¡fü%4Òa‘µêèBØ«ÏÝE®_…¤¨ÿò•Ê]ò›å£ÒSpƒƒ¡èX’†] ’€ËKC$¨€(²—$(¢›ÃŽ*G]VÔeFí"r"³ößì— LSYÇObbBBÒÜÜÜÜܛ۴4UFpG_+ƒ13jVe¤zÛRZ(>F)´° ôA[ZZ(m)P‡‡ èÌúE4:1wœÙÝìšÍÆ™¸›q‡]1cÖQW÷;»Œ³f³Z²c²''·í½·çœï|çüÿ¿ƒt<²|8 `À-e(¢bÏT¤ÿ§‘ÿD#p-wœ6Zû£.|Î`=QnÛ‘±Ž&)Y +\.™6T~jrÀkðô‚ÞrÉhÿì€û´Þ|¬¤ŠOK‡Ä1bˆ²”fÝùΫåN ‘ zk3¿SJâ`¡3@;×Êœý]SÓà$gÊ·D’“ýÑf <.W8¦­$}*³<gÊkúMµ¸;½õ23¤BnÝ^¾vÁš$EBš¡ (BJ¼RºÒ"ÛïÓ¸E0B(êJ—wr¼Èå›rþÌÙ§Óƒ‡ø–·i®¶± ,N@T2«°ê”mÖm•ë:m[Úl»ÃNrÀÊÉäàw›9Û±¡¾,LÿqäÉ0LBs0D„63ô—DåÚ šV³¢ÃÂwü×(UÕnÉl6)»›Û-|gÍŽ#m¸æ—ág+Òh!Y”Ä$IJ…ÈYˆ(X‚B%¨©5M¹³ÓHpöݶÅ0Í<Ð0Ik ¼Å¨Ù€K0HD_›ã*š+¡Òì*FDÙÕT¬âÔ[iÉD~ náÈ%nZ…ÜE¨¥Þ[Äæo,]HI4—D³qb²˜ýE2iç4£‘B˜†éÁ4•þ¯Ùã§N#猶óÑïÀ˜IÔ†vèðº…AK' Üy{€1.•X>3à÷ÊŸW~0Õ¶|¨ƒ„· ]TI¬Ïü¤Ô Aõ¬Ç+lše«X–å8nÉœ29>/µ_+¯õjvCâ€RD,Vòù]ËkÁý¯˜\¿*©:«7CûÓc3Ú“ÎVØOgFΙœgõ–‹evHG_qõùýΓ5maš0™&ˆc0s¬tý¢õέFà °ï ï…êã]õrgc¶ûE.ߨp·¹Úrƒ jÇķÀ"c —㬓ð1:4òû³_>pÈ­¶ Ôn1‡ÕÌüÀ5ø²=ž®[—¿ÁB39VÓÓy²z¿ÂÛ”Û/©ç½þl¯KiÞüöGщ%ºs”vrºLÌP¼xºíðð0ˆðØØè”Ž>ÅwGÆAKoÞÜ^Ri˜Ç0,E hBDÓRŠÖ¦¦õ¿Ÿ3˜³ïnnñÐvàºð¯šé:˜C4ûîj‹ãE#ß©÷ü]µ÷a~imú:šƒL J®ÌŽ<3£±)ü¡}¿îe*Ñ1‹œÊ†ÆÈäåkŸK)VHqø|‘L"¯ }¬ˆd¡êÉD]1ô*Q{6òËXõ2Bš6/¥„©„8‰ „䊌EŸ?³ÿ82ùï¬(N<¿\áËQÜËãÇŸõ…SÿûGËV¬$á¼F³KqËSvùÍù‡ìYaëÎN÷;»•‰Éq ØÜÖ̬ȳÅ#ŒMõ«?ĉۜŒí鞇å:—HX½]–¶Q`i³¾ȺlÊnûÖªòºœòC朎šÍ-•ªW–ß¼ }±€#¥ ì˜ÀH2}12 Föb ‘ .jÊLM†Yw[ŸKQЈ+€A³sQSj¯@Î=ø‘Ou®WŸc&ð^¦–¦"¯u@-ѧåZ*IıÜWá8krôV:Ö§¦ 8š`ÁD8Ïîâ£úªúüÂ4±”äØìôw“Éõo.©Í/8YfêúÂüº08­7ô•ÛOï·/³Îö<>aŠNÈ™òšc¶Jy^†x^MJ9„F‘ EŠ~¹h£/ÛÒ,wxF`@‘F…Û§Ä@ò"—¯“Û[Õþ† *×Í‹7@+AÉGpãˆêÆVÒá¿<ºÒu1lZùjŽ'À×·fƒ Ÿ‡wÔ«]W;~×sÍ£´uÍ|C³ÜPú\Y®xш¯kÖøÜ ÛÚ¤ ÅÐ AsÔo܈Ì8úMsB\ËÓ§?hó_œ¾ý ¢üë/¿Tnã9‚”P4(è0°„aõ?ç:¿ëN®îvnÑúA­n H†ò‹‡òtwr‹à/y¨ÕÝÞ®ÿF¾û-Vˆw1M§ì_\‹ùõ3Ë›|ùiˆ(¶¦Ê8NΤFÎÓøüH‹E4£Z†ÚãG#Ñkw&:œ‰:„_Aìy7qXJp:`)FâB±‹.òxjïO<Š`® G6>: ?GÆžŽD& ґܯk0Ölí7þÇ.*A ba½Ð’%)kT™Z³~W•^ü¦–0M‘`Ú§NŸ|ïcdþc48>þÛ¯~fŠ%š„ó9õâ-¶­‡ÌŠN[N‡Uù‘åeh¤Ý¼µ­`&«É¤î´e…æt;6‡òÎ÷¼eé«—“d"%aÅ4M„`˜Ðk\:*C!CÔ õ˜F‚³î¶ õL> …(dD¡RŽ2‰»ßi5¡&#òàû>ýœ%@5ŽfK’Qi.jС@™ÀgîRÎB~H Ã1)Räý'ûeÅuÇñ÷W$K–F£§ÑhF3ÚYkÁÒ&"T(P&>v±½>°1GÀç®ñÆøX¯ÏõÍacL 4á*W ÒTQ£ÒþSUIÔŠ4倯»ëÝé÷í”­E )HíèiöÍÌ›y×o¿ßϯєg]¼ÃŽF1‘EQL oR°ÅÀr>"‚NŸH*²‡tVDÚ _4{¼ì4ÇÇΕ¹aÄW4âΩÐÊÄ´ñ¼¸…ÌüHÖvƒ@*Î8k™_oh<\\–gµ ‡5?YbÂÈ2va–Õ‚Rð…ƒÅ›³gÏÇ6© އƒDKJThîšbÚ_ZÓœºm`ý”³å ‡ 7áË ³ån|åLi½Á$ÏÊŠkÏ—7œ,bthC}ÑÒ䉈5¸LŒQTVy󻱉Í)5=‰õ;S;z’=(€V@Â27PVÞfkx’Ëwe¶6½ëÚ›½«1¡¦« U÷ê†rÞº«˜á%”˰¼Ê«ß¹tûdﱞ¼Žº¤Êîôµ®3¥¡=¥¡ÍæêBwÉîž”&ôØ‘âéLm+iKrsÚS›2g¥[¨YAàs׬1lh´€?'·EG,¥ ¥–èâ!£¶[)¯ßXŸÃž9ýMÊ AЉ4RæcÌʦ鳾ÎvüÙþhÄÀÃͬBÐȵôܱ¢‘Á̵_f¸fÍ$}×—/K ë6ë1wº{|®ŒKèÙ§ŸýZU jå8Ó-)cF#{ì¤ÏF’I¿TÍçš9S¤ÊERQ1QEƒ»JâjGÞç×¾fcò2 ú™ ë ‹–„Nðžî7Â)<—ï’É÷_ýÑî‡ ]|ðáÀ; çŸÇ‹&€ —€*EFš¨`’åiÓ¦B5úká1ÿ‡C ê~¯÷¯™4tª@ ¡½QÊêú ÛÖ*Û¦%Û7€FÒ÷¸l»jž•Fð"ʲݛ—õÕØúªíýuÉ;6KÒv¹VïmNÜR55~ÔSæ9³$ý€"^Óø¬8†ÝNÒå`„+᨜vT8*' 2UdNUŽnL°]_§>Ÿ¿èlÀ+§‹6Ÿ.q5®Èc GAžCţܿ,ªþ¤ØØ–ÌÑ ѲŠùr"“@Îæ´œC¥µ'œ5*ÏT+qtÖ)Ütº´þxIî{ðñ‹ë΃FÐËó_‡óeîãy•66cš«fÍ›D%LˆWå‰)¡*ZÆímiµÝöæ-)Û“ÚÛmÝöÖŽÔ¦¶”œ$ƒž4Ï“\¾1¹žaCBëŽå=uöªKÿ”àñW_‹£ñTÿqï·^ßC/Ò¹!Ýw_ÆÙ‡Сûúí‹W~Õy¼w¥§;¥~ë²ö.[ °¤+ÝÝdÛÜžRß‘ìÆ`ÆŠFzÓ[Ú’ÜöÖòø²hÍDL¤’À¯_¿~ppp´H>Vÿþ‡Ïç ×Ã’>¬³ÏHô˜À‚°ù÷îÕvvFOœ,EòãˆÂüÂ0£ð,Ævq^ÒSô1–NO²AÖxJ#E~ö; ÈϬdW<ÙGúI¯ìÏ$ý@‹E 0úãÉ~Ù‡Ë8vsw¨ô/&{—’‹H9Hö%°–;ãÉÏ“¾Ë.%¼ÎÉœIdü 0«ÕzáÂc £Iౕgd >Ôý÷Mh8âÇ/ôÎ3O÷'„»@¬Ñý#Œ'ú®?Ðõc'O¾=#ĪˆŠ,Š å¥š@M‚$RÑ# œ‰R•§&E©ó´ …r‘P&Â~(ò¾Àˆ‘¦xýþÇ*x bÖh€ôû½ld>íÃzðÎ7·vµ·GQ)˜Y$‹¢Íou&lß”ºÇ•ÒWÁåYQä)%©¯v)(¥ßmï­›’Ï©TæùI’ ƒAˆÖ…Äã`îܾ–t‘ŽµÌ£»Á$E£*ùÿ JT´0H@]ƒUšsIQ<ÕTQS_– ª&qTQUØV¥¯L13†Gu8¹• @Lhr¡ fRšI:A;NÒ]Fª×¼2A\2“Ô¯!­d{1ÙêäÜ…Â +󆦚(OE‹&¼=5â=+[mÿ§‘[Ž”ÖÚÞš‹`ÆPyQxSwl}Í©r÷±’ÚÃ%5°ì@#Κãõ9s£'‰Y]8þÕÃ宥.P ˆ˜Q–`Ÿ¥3qTe3ÄLi±¯:ê¬~Qó:Yáö`lŸ”5€v0ÌåPYÝ)Gå¹ ÷û…—¼>Ce&Rü‹MT*O^õVZ‡­n»­y‹µ¥Ëîñ¤>³û·¥4·Øê3=¶¦.[ÃÁª¤r°zàÄö_ô¦vnKl?\wðò—}¾!&nAötH¾¯?„˜B=ÿxד=6Èñ´’ÚÖ’ÔØ™æq%Õ,´Ø A¡œ q@Éy³ç9ðÁàí»!00d9ÀØÇÀ£ ËL™.aˆjàQã­Ñ®ÁÌâŸjZ>Ý®]¹š“½B‘d¨þSH™!ŠÔ:áµ³Öœ+×Óro­p^J[ýUöº«+WÀ$™ù×2 þ–‘w#Ëq3Ûñ•}퓨ãzŽóZzÞõÌü+YWÓsïdæÝ\žw)+÷F†³¨ÁaïÅß|Šü‘!‚"HHó"²?™ìZ̨XÒg#VVßJv/!{–’ÔÁ$6²(‚›KÙ£ý‰d¿•ÌŽ8F#û¬BO†°b&÷*'™ʌۤðÔB…˜˜˜òÃqbÄ›×ë5¶Ã¸4¢ËŠÓNŸ™15öË?}n„¨î}f áÿG%È ù׋Ï>¸õmNNŽlRDÊ[D* ŠF¾5Úþ¤³^7Ú/éÌp¼j´\4šHN­^ªœ,‘A‚¥¡b:õÛO°³Ã?]×þ«VÆèˆ(î±BU¯àiÐ_àÂüihW êÍA{—£¾<´Cv‰@²s9Ú•z—céÍÇÒW€viжÔ“‡¯vd£ž"ÔcDîlEGq$Ð&O0I¤B!£ ™¾˜ØÆiœIæñêWüÚW”Bò ’Ó•Ü1&þäùà;ú?ÄGaËÞT-Ɇm"gi%1uðÌäŒ ‹—#KZïBVÇÄ3Z”+™”A³É §H¦h…LÑ››µô÷§?_Ub»ÄEöøÑ5à½#N=<:’¸õû7š#‘Ùó^b)FÁrð­ – $yмÐëPu{‹z½ üÀ4Ò]Ÿ@ˆñοnÚí5=›4½nM¯·x»ÇÜå׸Êét>…•³22E$FI椡 ¯c) ZPãjQÊAí¨Ë…Ú*Q°Eªžº ci$"âtZ«$-kq¿Ot‰é“ ±L"I"G!¦¦N¸ßÆdfÈ9–b$£®j´¡¶jÔlÇ4Ò):²­ ¹W)æePŽÛd4"ch‚pg•F´ IhÃÊç4òsÔï¯n˜£˜ Ÿ (NIҦ̬ýÎú÷ÇU $@&o9¶‹R‚çypg É4éËŠ%Tþ—Bí!{íGÕà–wlTyŽ®m8"Ô}$¸Ÿ•_ÇÖùßqù™`y0¾«ò6ê,4¯ ‚‚ÌùL%¹yÊ™®  HHä{@¦;ŠÃ@-ÚÀO ‘–’-ÁB_[QЈ_Sw ý]Ðr\´Ý‹ ½Ó³±g´8®s†â{jzÚÍ8|:þ×xüf|wm7<Ò¤nxê4¢´ëCaM#ÌÒû*s*~‘š9Jbh’ciØ€X÷¡V )Žæ~6k¶Ýi‰t†÷ù'·‡n/P£Ec¢@àŠíï ?vN‘ÛccÙõ>„$´æ±ê@ƒL<:úö¾}€I@# ÇA±É€ìÐdI¶¼œõµÎú]©ðƒí¦Þ ò•ÑrÎdý³Þ|So>o¬x|c°\ÓYn”¬¾Qê8¯3Ÿƒƒuå̹JȨ$[¬Rßû?…‘øp,S,~òÄ Èl di†!å2äYŽöjPÿk¨?íÖ ^µh¹¨¿õ«Q ÓHŸzìt‡ ½YŒQ(eùóeÙ)R¹$=…¿ QÇ(¹$½Fîò¥[ñ‡Á#ÑFF¢Ã ̸ FAà8z2Ť -%¤„ìíû‡FžGbcmôÁ©!h‡ñ¾ßÌ\0ŸãY,U$£ ¸‰)™¨hjjC]{P¤…úPkêìCÍûP°™H>‰# %,M`§¥Mýò‹/ ª1iÍ8¿Oïã»üJtîÂâÇ?súL•àœ•>`ÍPÙ¹œ¦ˆÔ…³rý‚vgC~w H‚C dòïE0}Ï&m÷†‚5…;ݪí5Å;Ü¥ÛÝykòÔ޵@lp8H’'+ P{5ÚáB5ÙPØÙ UÀ§áÿ€ ¯M@-l@ Í|lû<Ö nªÑy™$G“¦< KÍfÔQ+¤sç+H (% ‚Ó”".ÌíU¨¥ôµºðNBvR½PDJ‘2šb礣ú2ì©w5“ŸÅÓì MDRÞâç4òÕv¸åò•-ÊžƒÚœÎñ{›Ž¯©Ò8Xí{«Ú[¶ðµiP‘|jB"U½øò{.Ï¡þx¥ç(¨¼Óøpº ¤Ê Î~ਇÁÖzŸ•_°XÆÁ5µÀéº`ªêìžæx °•P(XP4¨h–¤¼âÍwtèÃ_Pkƒ` Öaµ¯MãR•h6‡‹CZ°Àýæâ@àuwìêÐèH&gÏ|óýÙ+cò};~xÛQ ––’Í@ mM¯³s‹ÖÝ®kjUoyÚ4¬Ñ`öP@WcĨS¹Ì¯š^à’•§$9ždyñ§“(2ÁÌA,“4ÀÿܳMZC×Ö®ÏN~zkð‡'$œzC††Æ$c\;ŒF‡ÿ±ÎýÑ&Þ)BÎ@AüƵë-¡0”‚‡˜žL‚“as&%õ/Õ^6ÙΚlL¶ƒm dõ“åü ëE}ù£hä<u0пXj¿¤)¿V*üZeH!aC€Ï Ìñ›“'ïÅã÷@¢O*kÿ# ~äpB%cqS‰ž”JÉæÍD}:Ô· õ,C}*´KvjÑÎ<´»sØn5¦ïÉG{4¨'DT¤~–ôoì—l×ÇŸ„)R¤ÓétzºÓüGNR’MaEÝP´”dÄN.¹8ŽI 4ÿŽŸ€c;Žc'¶ãÿùë$"í  ¦MÛZµ[7UÛT1µu@iǺM]! ‰÷{vHlˆ2´‰ÓÓó»çÓ½÷»÷ûý¾Ÿ_&ES”šR™T†¡T¢˜³bÅkçÎ~ú›Ý;y¼„L ‚:¨`c¾eOÛÙ3“Ó7‰:Ü‚Ü97ŸÀïÌç÷Ïö÷úëŸòóÜ#o¹þrËU¹êScÝ_+®ê·]®¨¾\3Öl¬ýÄP(ò;cí_ uŸU¶Ôå¬â ìå8ÊB V¼‘8»ø­ûYñÿ|ÍIŸ™è$'rñÃD–Õð‚ «Dƒ¬fŒjј”æ „ ˆ–0ɰ üÅ$4VJ˜d¤5¯£–3 ’‰9 + Œ’W2ÙJ¯ß=¿5› ²^œ ’ëßá!IIºÙ/Þy7gù3¢@xÈùËrÀ6B«Ìf¦½ßÌÃÚž >P»­JͲ (Üha²Ru[‘ˇcÈ7†<‡‘o…Ž¢Ð:H&ýãȈr y¢@lQy… ›JbG @ò›÷ß'^M¸ëîxIzþ… ‡fñbR;aøà<|v‘"‚8LÏVmÜn¨ŒÚ˸€:äÁýÅÃíp›³/ ˆ®?ÐÈ“ÙÊc©o·3tÐqO 5=røꀖ’`Ó|ƒ1iÉÇH!¸bBîZ‚"žÄdg·,êФ¸ïä°[%ö5Èh`/òÔ“7GLÈ\&px…—²¼†fYÉ™ÜóËÓ* Ķjzí·R0  ¬ò„Fþj›í“M¶c»/.Í !Ák³Ÿ–W­Y¥ÐdÒPŠ… Š4ûMQé­¨>¾§Ì9×â€þ¸Éò&à‡©ý‡ÛüÈl?g²¨ÀË_o¶=.»`c§[:N6YO¶:¼åÛ_XÄN¬SCœ0fy%­¬Z»Å]lëÑ9ýr Zì ÷?ø¤.Իåpë|P•Hî€ìrIö`¹ÇWØ”¼>Ù9Pí‡Ú’Ë—ñøßg§a4Ùw̫﹣’Øc@ßÛ“o,÷z7Ùûô>QÏ£¦Ødo‰3Á!ݾ"§W瀾WêòJN_™«Çàh/Ù³5טŸóâsêåY8]ÁpJP(Ž! ™B§BÜaš0 ÆÆÍoÿü­dŹÔd ØÛPOzÉÁf,üõ/¯ÙøW’”xÄŠˆ#H¼èÍŸý´ð¥|È@J& ‡Ó1^LÓ¦•ß{×Póiyý'eÕŸoiü“±æž4bØq¹¢þJyí¥Š† Õ«lù‰¶BÅ2<Ë*Y¼ ¼ó^’FÛ}(]ûß½æ¦ Þœ†ŸøÔ 9ŽæÆpkšR¬W¥D$4^BØcL‡byh¤êÈí! ÅthȤ4%T€vçQkUi8UAQY,h«™|WCÃõëŸ}Ÿ‰ƒ?LÁéÎ$NšœøôôÔü6æf¸ôã‹—ò7æA•© P„ƒ²s‹°zÑ:]Ê&cš¸L‘Æ(E&M¤ùÊƒÚ >¹À? ®;<< ¢¢Ä,x{Š˜¾¨´ ¹ûQß«(tÆQp…£Ð8ê!ï(òD=1ä>€‚§çuÔ{ ¡µ,DÔA24éWþxyÞ¥‹%Ç6¿úå{M &JÍÐ4f1K¢Œƒèc†V±YëWå™·ÔöÙ }iÄž³í/¶–öï3è d’`@àÒ†¬_#Gí%ûtmÅ1kɈ ––†öëGíú¾6ÝxGÁˆmuµ¬ÌTqBÁ5 CQ슬´j‰(xRAÇ9Ôϯ4ß&F2Ùׂ|5ÈSÂ&ÔgB‘FÔ[OöÖßBzo Š6£hkšqCZ†˜Á‹T%ð„{S4k«CfòªhsŠœ Î÷4ëi6•¦”J%I“п‡8IÔnOhäþ ôpâd³Í.mÖ`žf%æ<à㫜.(H°Æ/<µ,²Íâ>¹«ód£,:±Ëq¼Å·gÍöMVP€Ó€%MÀ*`ïióc£‘3;°Õ#­¶¥Ï«3©O †0"Íe±K›75yKQ¹'¢÷¸K:“.uGôÝɺ,õ>8¸rW·ÜÑ«w$O°Ð tÑ­³~øÖoãSH ßœ?r¦g‹­·¤3*÷úK{`!²(,]ÜH8þûeÛÄyÇñGš„dÉÒét:YgÝÉN”†0RµPZÖµ¥”RHYâøâóKœŒ¥YVòþB¿Äv;Ûç—„$~IRX(+kK[!uý§ÛØK‹Öu菊KÆšBµy±³ßcCè R¤"¤®§ŸÎÏïžç~Ïó{~ßÏ€äÓ 6ô‘wtžAŒ>l¼/Ä‹p'bö ú }nÁî6õ6ÕÕl7î}l϶ìÍyTGàØ†Ø$ÌÃ0fˆy•’ݵsç… nܸqOÎR©•Ät‘¹\áû ¦‘ôÃ_Æ ¸H‚,¦ð”'â…ù´˜’H¼÷i’ÜʲҮ}Ÿ˜þin¸Xµ*\5ýd¶¦ñ~¬qÆÔôgcC}árJÎ0ÐÝÙД!«¥ô§/-Þœ¾ÉGzàw>¹Spk~þ_W.°Ñ$§æ”J ¡£»1€—¡ÉbI“ É$& h°U³”<K9Ç09 J 1cЗøÑû¸ï¥´%Ho-Ãb/-$çWƇ€Y ˆ+kØC­RS$®•iàœ—»µER…£h[G«U Øö²ktkuwE’wV‡ßÌÌ̦œ–¡U ²4ƒŠŠÐðÆß›H:‰ÂÓ(tN ß’€OΠÐë(ü*ŠLã;CÓ(r‰“¨Õ[aã€û V%EÅŸ}:—3Œ"ÛÀóANke( r²Š†Wœš}ÉPVåî4:ø¸sûDÏÞD.nÓG­š˜µrÜ©µÕ³e˜$ÓùQ÷)ØŒÂ(Њb(˜~1ÔÉU•ª(…²›ŠË¦™,PI¥‚С¡v€þ[IS±LQ¡ Ô,Qµ7ï…ï«ór! © Ü€š €|ò-ÜßÎv8Îr¾Õdyópßzë ( “>H‚œÌaUû÷”M´¿›ÁŒVû/»ûO·X~qÄýz—ãl«í½ÖÞÓ]ŽÓvÜUwߎ3­Và“³Ï/˜íã Ý5Ïî2‡ elgܦ¹ß}Þ^q(lð"ˆ²©Øà ñ ý@A­3¤í éú%èÓ ¬Uå#ðbŸTíu”Y#Bà˜.Ñ ÞøáAL#7qñ7÷ÇÙ~Áêçû$¯wÍ¢·¢wÈè ž€Î |"Vö?hôò“n¿Þ0|Òz#•bX;8Té÷•zFõá!$ý@Ge~Þ+U 8KSÑýÓº’G÷l.Ø@q ÃäN’‚°¡(ª¾¾~nnnù.H¬ ‡ÏçK$™ËÛ·o9ù¥ f æÞ“i´YL-%Ἒ•šûü³Þ^¤ë\(H‚–‚dOÈJÖç¾V¬57¯F#—«üÇ|àïÕ 3æ¦ùª¶7ʪ•r9Ë*¡žƒêæêÌÌÍ…y =©åäR2¹VUûf)|$3KpëÖ­®®.5â F*ža× óè„ïCÑ/CS<šØ‹&JQ¢JfØ¢ÈU’9U 08ŽiÚ²eËôôô.M3çÂÝQpxÀ?°Ä‹"K7aÛÀЋɩSÓùyYE6K±E²U(™¿ éÑà Ï4Ž<Õ^źªˆíÒ£$IP"MÉ·æ3}M(Ø‚Ä&¦Õ,g©l31Qþ’ÚÐH;²ÔÒÕ¥äS”Š!Ã)Ÿ,Øø-Ü߀ε;>8è>õJ÷þE”œP«Õ4ÎÄŠ\†}á‘ÂÃ¥Âk­=ït::Îu8Öw¾ÓÞ søv§£N‡ý­.×ÛÝnàŸwºÞkÇ^œê°ží°œk·ö×6ì(ÜBÑ ©dV•ˆ‹&ùÊæÚ3d:(2œý<–~±²O2xá~ðkÝAÞ- nŸàôñ® €Ÿ òž/FÈ4ˆµTî2 мËot έc¤*ÒxVSŸÎó釳q¾Xþb>5sz}’VüÚC'†ô>ø~€Šc&¿¤éÑKá 1 HU¢Kg„M.ìcù`¬rHÒzúApœ‚è=’É+ê\k×8àÒXvÔ•îy\¹QMB¡Š%*Í#Dá†øà<®yS8±<\üËŸ(R®æ”»·?ûѯ~½œÄ©~E°,.f’ÿŠ\d+­ƒwî¤+Ö¯®^5å`! " #ޤó”P¡;ŸØö{]ÝßÌͳÕmÿ65ΚB/Õ4]27\1×_®mºhªÿ¼¶óÆÆýù“¥¦`v»=yOS+íÿÏãî*às/¯]»V›¯f â%©z” ŸjЫehBƒPç‹DÐV\F‘0«ÙÙÙ~¿ÿúõ뙞abÓ«˜ig°µ´¹Œiõ¿ @òïŸÿÝ®â¢lšTÌ£AÄ!ÇÓJežll4<…¤iGþ“(ø3$Ž"V-#r” I3Om}2Óùüü|¦ó Üßå *g¢ñ“?†"—R(Õ ’SªQSòN"é$:Žük§ïz¹#ÞI9)[Ïe{‘ñh~Þ% ™ G/ '§äLW¸ûé:ñp]ÐúèCŸpòñ^mÌÒoޝ EÀ $E €cþX·nðÆnw” áã¶Š¨Å4éÔö€™Æ\|Ôo »9aÛ?á‚Ñ÷Æ«õ¯µTÄ{Kãvxëåÿ±_ÿ1m\ÀŸT É’%ët:ît– Â4!MÈÒd)iB›æ‡Hšæ ¶1¿¢‚…`ÛØÆœ± ) %IÓ©ùEȺhÓþ´iSµ­ÊÖt˺üþ15iû^½,ݨ*!­9=YÏgß{ïÞýø~Þ Ûä±¾[cây^ è¼Xp”â34Ô®íDÜGšHŒ¬’4µ®jÒe&}ómKŸ•xÍLK…|×v™1[^²…Tk¥ý‡[HOqV%-OÕB*ÍÈ*éú"VKÜ ÔÇ^™½R¾WK²Ò©’÷^jä¿h¤Éy¶æÐd­í§}þ ó«4«”SËÔ©Åë6»Ê+G¬¶ÓVûÙFI[lgëíó5Ήf7z?Îá«Õ‰!%”"ÅbÃôNÔ¶NX'[ÍùÆ%JšbRñú­¤l–ðé•ÙÅ H_i7R;Ž)ˆ %BDJDÔÅÜŽH¿W/F |Iчdb¿Ö×H@ç ê:£EÁ~SŽšDXEÔw žN­=jêœ-µÃE]?OâµvÿÉ=|Þúõ—zwŸ¡ûûÒHÄðïpaH½ÆàÌyº^_£9§1gñ–M ×mZ´~½&kW–É_ìö81Lè/˜®·hô̵_þñº:LަC¶=)3ä¶x$!¤ž ˆDZ= ’„R¤”œšþù•+×®§”Šá’Y¨Ækp!E9ß|ç·ú½×K,×Êj¯•Õ|QTu§¬î¯¥UŸî¼¹³ásÓ¾Þµ[3hVdAFFló\ün‰iŸ~fÂý¿’æÔ›Ì²I¯ÉÈÐ.2ZHFtdP÷J‡–ËRc aèUñ’FöìÙsõêUûøñ£DSñæþMü4c€ûøåéôŸþüåîݵ©rnç*4\#c^¾:›4ÙHx˜Ǥrä4é%¡1'ÝLjÏM©2p "X†>oÒ]K¼û^jäÛˇû—Z:&­N ü8Q×z¦Åõq³kÒêšBj]®w\ÞïBúhiÃþùç¹f÷D‹BxÁ˜'[<—Ú'jÛηtØô;—§¤!z0ój†¦)Ö¹©ŒR·bK§Þˆ…Ý@b7AìŒEöåy! $:?¢9TÔ)–¹…ëß5ïÌ**X©-X¥-\­ÍÏÌÙ½®Ìah…L¢eƒèßáBƒ!½w¶ÔŽê‚ÎüÖ_œøÙôÃéßOþN,•¢?¤súÏJ'jt帣ÅiÿŽš·_]à¡`É~†U ÎJ[‘U"–wм0L¯>ˆ³Æáß¡_ ¹‰ZŸ¨•¦'4xQjßÛ»œË@GJep|dt:-•AjIË?Ž¡†âRðˆàùåÖ¾õöù³çrqv @‘iõÍ×çyI|Á‹òÕc)ìnݺÕn³   ,È‚@g§$o5|Vbþ¼Ä|½Ä|Ãd¾fªö¿•ÍÒð‰ÍÊ|óÁƒÏv$µ,Eç—%qLÏLEbžN5~ê4k*³\ÒB³{#µL‘As¼œ’®3'ðûFú²£CÃ÷g‰;$±%x#]úøO¸Ð3ùàÄØ;™™,«P2ò Nah-¼’¾‚ä•’À?Ù/ئ®3Ž )’¥««#ëêZײ…@ $Êšn€cˆ<¿mB ^]çY'~¿âWüÈÓ¯$„G!£!„Áh»ÕTmR‡ªMêÖM¬['mUW ±÷;°À¤L•¢©µ>Yç¾¾ïÏ9÷ügùDz¶~‘àGÏYä=CA8<‹zFIÛWn*+¢i 0ý ?™æ3j±WNgÅŒŒbš† k0æ½põC¡K(4–­5±d $,.2R4PSϽ¸¡¢óè±QGmÒ¤2€•WÚÔÃ&`y6j¢]@#ºäÒPQ'-5 SUÒT9b­±Ê’viÜ*Æ­Gmgn^ù󽿧2éÏïÝËŽñûéÏm7ΨO;+ÆŠŽÚ+ܹh‰$Ц‰5q &RPD5jþNÂ/²ã59a>¦Å|v=+„m#ù åÄëƒM$†Z‘ïØò³ÇÓ(RO)¬'ÿ¡Fƒí(ÜŒü äj¸ ´¢@ï•ê•EÃ"Xß0Î縵4^-àVì-EÁF‚.ßÐÈ3c²Õ2©7N×w_m0‚H8óã7^Ñ›ˆæVÛ6ûÛí8¥É<Õº|:[ÌSzÓt£ñšÞün»ãvÇu"õÝSú®ñúŽº²ò|>›s91H0@8·F¸V÷í:·Ê”:ú¤^ð\°KðЊød0qÂ!J7`I¿Æg|r—_ëv©-†ê¶Š-{·Š6Âþnƒ¹ƒo˜Bˆin-.ø^qyãÞ“pó`-1åˆlQCH}áZ¯»Îò‡·o;u6¯Üî¯vjþøÒÔÜU–€Ê¬u7í}=]Èòøð¥3À ¶À£ó€Ò„œva|of‹î®skÌ@Yå„F"JßRëÂã~•êF´è[èRèIè^§ÒtJªß.Ù$É®±Ä—`KD3ù˜lÿÊ‹‹ô;wm¥y4?2Ä´hàV©T~pëøÓýÙÔܼÌ=v âXóæ5—žÿÍ-ô¸š#†ÜŽIîܹ£R©X5芚 Ñè#ë7¾'õ£CúO_nû‰òÕ2ˆ±P"¢1ž8áqÎGæ5—ù2 úZýžzýTj&“N}17»±l·„ÒŒö%¢òX,.?ÇR4°hsgÛÝÏþ žžIý'ÃB´#yæ ä"ýÞÏnê4ZX?aÆæS¼ŽÉ‘ljWT¨Í‹Q40‘åqäGÁs(|'Pà" AcùÏfÛ?@‘ÓèDƒÀèÃô+äüÑïr%ž"9m¹Éö0•Ú½s—ˆÖJ0‡ôÈõO"ï(Š€€óäp©4Ò{ù'{ £#Ç‚ÕÌpbÇ NŒ{ö ´+“ÝÊáNùP·rÌu8f=µŠ™ÆÍ@Ú„Y7Ê¢K¥MŒ`Œ"a®JZÄM•Q³|¨7  Gjûû=1… `#G `š­/G&ýOXÓÆêS9<:{·¢]¾]º‰)ÉÁ=‰—±,ÃÇàb ‡YŽ =_ZPÌVmØo¬z#¢ „¤‹ºù°*ØSmö×:}µNÜ’{†t¡€ÌþUÑHPêê×y!·¢u»¸t @$à@­P ¬ÕÖþõ/wamùÅÏß_[PHåñ$B±ˆb¶‹Âuž@{@Õ ÿ9T[Rx•V¿ÆÐ“8| aMä1N™É¦3l¬[ňDŠ˜Ï1XÒ7Š„#‡dc·»ºë¶•ˆY ªK=šá{é0þuÿ>Y çÒYkHÏÌÌäÀ'ü"½Ð8þUx‚;öÚQ(#ºpˆyåù×üäΟ8 hІ œW²ú‘’_@¡Q#üÓ»D€ƒPß[$Op€·yHÎP°Î<_¹G³UŽc&uÔP›°É£VU .¯ŠvƒÅЍ“UÒH¬‰4rhĬꨉviF욨õ•‹ûòÈô‡7ÿ‘ºÿÈ2“~0;]3;;C@$C>œß|úÉɸ·fبLZ¤Ã†œ€Åò«‡;Õ±.š   kEÂxxÈx|È p%OØê‚Ý/Öì¡X :V@c1LXb9¥Øƒ<ú•Þ¦åÇÿrsÂþ×QO= ¶ ¾V$€"ÁFÒ†K}-W¼ÇÑÀ)äo X5ÜŠ"Ùg£§÷ 6 ÁæohäÙñ£Vh›Ô!ˆH Žf ˜> ÊU¸¡Í~½Ýí)¸š…åÒ9ÝnŸn2ƒ@‘©ú.@‘IƒóL‹éå]{J8!ìjaKË`¦çc¼X½CÛSgï×yü•VË#wU®ˆÌ(Ò«$¶›c@‘–økl¹#tÐíÖYŽìüàÖ¦ á’€¥…_¶µÂ*7@oô©üÐ •k©uCZOfóËí­ÐŽ$‘9ûÔÞPõ¿Ù/ئ®3ŽiR¥H–®®Ž¬«k]ËŽ•ÇRBȲµÕ*¯Œ`;ŽIBeЄ%qÈ£Ð%~bÇ{ý̃<Í›QJÒ†Ú ÖMcš¨:´I¨°ª@§u•(±cçî;v’ee©”-låèÓÕ¹×ç^ç;ç|ÿßç‚«GèයçéŒ4¬˜’1¸,g‰ØÞ- ‚è²ß÷{~¶g×Ö åó —†Éy\¡izéÒ¥Ýíb\LâÇÔL1;÷ú¸P]›œ>(içŽP—·7/5Š2ZJS2 ¢·’–¾¢PåJ(ÐR©qW~5šÔ!øëä7“¢9 B_ÏF¦#<Ãfäi$'O¦4[·JYZqº”“pʼ¼‡b„Bˆð'ÂoE¿ 3 ÑO~ðÁ½û‚Û““½DŠCXÐeÈŸ¹ðµì¨Ò€‚aB³„: (â;9 !þ· =(Ø…ÇQè$ê<…óv‚UŽ Úf‚Á +ÂaeÃCçç¢Ñ|-é,ýà¹àFJv&Ú´ ]¨{9áz 9Ã(x–üËBi¤ã(âûPð ™ Õ4H”*NÉ&É”wY67t(í3–÷;Šz¯ö›7õAÓÕ½F-1Pü$ ¤ …²°Yßk*9l2 ôüòÖ‡÷â.ÂúDb0eàøë·o»tñ‘›ž,ÛàoGËæ²~‡¦§^, [0æû~y/° q¯°»\…‘¥½æ².sEys¿eýQkQ¿­¸ËTÜo×ôXך^Wrrȧ^áð©X^³Õ—>iöxÌ|ÔQºš·†XG Õ P=aÀŒŽÄWbñþµP;°Šyë¯9+Qp?agÕ3ùj1˜‡ & Žá7ìCuæáç û@&À`InÛ'åç01Ëûõ6ãHƒmè Ý©ÛõjZ6æ0#Å ,À–A£™Õ™Ë÷–ùt^—ÖÅ9ƒ:G—–˜ sØõ3Ú­÷“€A´½DhÁ·yKSá’¹t– C!ÅÒä ³³Ö¯óóÂo®üúÖ¯øÑ/¿Y}€Ôn …•–QJ,[&Í©ß\ý48Äëì ýíZ¿o‹+XÔ*èm‹E#:Ÿc›Q³rñœehZ¢àägO¾EÒlj:ý&:gΜ†\¹ÐßeÒ̪µ»Ce™& ”v‰ëŒöA?‹Cvýôá=ÃrŒsYš„¢eR6S «,§h‚;ZÆ¡*œÃ³ú›ìK„>iQ=Ù}°ŠÇDñ ˆpâeø1&NŒ _Î{é%šz.S†Sá+@6 £T*ÑÎÔÒŽü'f4Nùöž^¨úã{?œRÁÐYX–‘–»ÿ >‰þ+Ö&ÛôO‚‡±‰ÉÜTèôKYšfRXŽÞ"Gù‚NgBIOì!(ùN à ‚O|½¬I¥S{àðjkví<â\ßÕ à ™_ýjúnkI»ÉuþØï?û8Føpj,…嘂Ec¿ûË~Ñ«9büÃr`È ˜°ô{õaǺ^ãÖSy¿µ¬Ï¢Z$öLÙëWK8R¤¨¤l+W2rÈá¸ð;ÈòòW­íOèi- $Ä”=` σuÓÏ ž8®<íö¿A#O›½Óh(ºðá2˜Þ5,MÖÁú7ßm45:_ßz¬ò§{¿¿1CÆPÍ1ÃHX)^TXU²¦ãp¡w>õŠœ.µ½­\àõv—ÖÚîª[;´<¯·4T¯R.g° 3 ŠXÎqÔëõ£££âœÄ•T=ȵŸÝ¹«Óašp²+U®”³\͆}B©Ó»ÍÙVì<–;ÝjkP#,uGyu­ͯ¾²{5öö¿Pè²—Kò‰è+AS)-¥›ššˆoãs«ÚH$RYY™CÃùi/zw´ú¶:ë}¼zÁtØîv«m3@Y`¡">i>Mëa¸êhÑÔ¶±2j9#—0ŠwÔ¿àbÀ+ n1=.Ñ'>ßqë`sÕÚ<Ž‘`–‚œ,ǰªœŠæª^ÛóÉ?‹ãâDLL¨ÜTRÈþ)Ñ(èÝd<.ÎÓæÐ síÚµÒÒRнïfæ¬P¨T´4‘ÐÞýô6ÑÍÅ”ëÿç6‹ˆp5°åîܹ#Î@È—,É'„>EˆÒ%øð£ë×5MlD %çR8u”DŦ?÷ 2{£y’í;Š'ˆîûN!aáêoñÑÙ«Ó%)´T¢äR‹+~,FŇâq'™œ0“W1¹£âðÙdãÑo­X©¤SXÓò4‚">@‘Ó @ÇN¢L#g· ÿ8Âd^»•²Ë2Òo®Óuš ÂV}ØZ¶."ô_þ$ò – Pkb’ìuB%âÐ¥‘=!“6lÙÑmùóÄßÒÇŽUÕiÛÖg+8n×öY+zÌeÝFÝâùh´§óЖêÊ\ÆÀKÑ©¬jLnYº¤Jº€4ö!ç^ÔÑD ¤­ñ•D^Ûš_M¬­µÕ>i­úíü'(r¾Þr¡Á6Ò`ƒÛŸ7Ùßk°¯n¹Ðhi°œ3› Kó³ráÌ2˜RIiŽc!Î Šy9sµ¡ Ê©7{´ ÐÁùÔÓ¢©ç…_±3©¤~=‘Ôý›ªV1¹JŠSÈ 32 ƒóW­ùàÂûÓµÙØäŒ¢Ågs1œâþÞ>LcðS4¼¹‚ÉÝ¿¡€Á«vtîxÍ£9ê¼X4_fh×»}{°¨h æÒVî}}}E¥JÃPÿ”*Òë„Äf=šëüÍ›7—deÃŒU´¢ú‡{‚%ž@‚ ê¯µƒ‡&úÕ®¤uo÷·ZÜ:c~z„…#©†Ö­Ì'(r¸-îqŠîVÑ祑t‚m¢74ZU«{!Ó)„  $nædd…þáçŸÃ`NDyÀª¹ÊÇb•ºKç¬zŽ]¾|Y|8vi`¨fçîT–ó´:§bÓló_‰ôשÍqŽ ‹‰h'I8ч¸N&FO%ìì—{l÷ÀÒ$¤H–N§ŸN§;ÝÉNä$^-PªRJ–ÒˆÑÒ!‰ÇÉ’E Ê#„@ $qüÌÃö_I;ò$ TÐRµ¼DÛµ]é¦nÕ6MU¥ŠýÑòªÔÀ‰}ûþ|ĤÛè–(LËÏ_ÎÒùüý½¾ŸÏàïÆõ›ÇŽÔ ¬(b^¤4ZëhšÓ)Ù›ÐQµ÷ ñˆŠøˆøG‰ ʧKàþŽê,8¯°)†įGNÂP³J&9yC¤vœ,´ø§†96ÑèYágÏç _BEüÃÄ"@E |ÓLFµ ž@Þaä@¾S¨ÉÇ“¥Îð,;?{ØHá€ÓÐÕ`Œ4léj˜-ú_úò bY0Q2 ñq¢`†07&îº.Œ…,Þs'ˆ LÄÁÕz?¿PÜiÙÐmÍ볆ê+ÃæÒÎú’ÞÙIÂØï4Dwö¶”9j–®_ÅêHá0N1<ÏkL?»Yv ÈäÙ‰‚û´…Ž ÀA$íAjâ'ò>¬yܬòcÎFfçU9d«Æzæ€ù½ƒÖ‹‡ìXÎÕØÛ·î)ËÎMxbÑ€(kyž¥…ù8£rM±ËTï1˜%£3X)Û m¢§ßØÒnòøò›C%¾€Ñã)iršl[W—§Q©ó¹t-x†sÐίݺqSIÀ-á!±)eVm‰b ðŠ+'††žh‡Yxà î)›¡®½ÌíʳÁßRgÍFuÉÓ¶#C3tT„Øab&í¯o«Tú|¡À¦²4“ʳ 8úJÍÅ/ÇAEZ›ˆŠø¼ÄFdw\rE½-JÀ«´º_Û˜Ùz!UÄtšui>æ3)þÅg³Ï½wñÞø8‘‘ÄÈ«-©%'éZ<>x~llL%#ÔçO?úäþÝ{‰yøé—̵dK.§²19ñÑ„™Ä¿Wà0yñ6É•¥×cš~P$E^À‚&kÚ^dàõÂë΄Š@€Š‚Ÿ@ò’†‘wúôžFþ¾y¹…zœ Ñ3:!kÑ·Wÿ¬Lng5ÿä‰z5~¸·›íë,R"Ú¶›Xoù‡ˆHG_áý#ÓÎ~ì#2ãM(–t:N+ÀH|æê¥[»ý°SÄ\t|Ö追«åòWŒ*Ñ;Êý¿þðmÿ•ËÝÎÞŽÝ‘.Ç¿ÿûÈïßÿà/PÏYcвgÔWØmùeÅÐk3vY^ëu„Íy³g#ºë úm [¦n뮈óÕªòÔgÒi‘ZŒ…4št: g&/¦m@žÝ(TÂ5Hz¹÷¢¶ZÔQƒÚªˆø>nÖ?ù1g#3´‘wªÌç_ß>d{»Ö~ºÖVó²a•NÏQ–¥XLDky‘Æ|î‚ÜšÍUn“C*pv–È~C‹s‹Eªp? Å€òÖÑ ¸I©È)[Ìd œ–¡‘ãxšêíêL)ejM…ï@±ÒµÌÂÎýèÃß,ÊZÈ2,ËÃfb_ÎXë+k†d@{à_܆¦Ù²‘ÖbG°ÔÈwµåKm….ùW͵^H}V”2–¥uzíÕ¯¿ŒÅ¢ È>´‘$‚ÕÚ{ïúØâÌ…¬À€¤3ºêM¯ƒØÀ;§›¸8 ‘c3¼ÂS"×o¨Z˜º„¢±VYšòçmTÚ|ŠäR\ÍDE *¢ødPÅãwYãà$²¤xd¥#|Õn5¯Ëѱ( O|&Ã:‘ÑVL_}ñ'Ò»¸r÷Θòã9z7ÕAHBnT’Þ‹F£ ý˜t6uâ§åÿó¦ÝC'ŒM@$‡Z}@u<ñÞ¿¼võsjž˜)j*–`^Ãf ¼ d¢à)$ ÷@÷ âè ï0’‘wˆ<8‚:‹ÇîÄHÇaS|ýýw%áÆ’^{~Älˆ4‚0”öØ6GÌë{g+cŸeKwÝ–ã–ü>«±×²óx“©¹úic®žh̰˜ÑBYãXŽ¢¸Lݼ½$ï#l Dò~ä9¬FµÈ·ÿq³þÉ9™IÀ@]<ä¸tØq¡Æ~®Ö9|ØRk()ë)–fu˜1f1Íòƒ×kÛLr°Ôå5ÚÚF…­ƒÛetVf—/å‰X€CÃá ½îü»gII+±)5*YWÕÚ«²ìÁêp\ùݕό±@Áé&]#V­Ûå/u)‘äYRw±èßaôúòZBr£áèÏõ«RiQ«(ZvñÉ•cÊA5|ƧºS,y%m\qZí:³t}ÃÓ¹®R;Ú lÄotŠÀ$ÄmpÀt@’Me-¹ik´Œ€1…YÚôÌò{·"Ù”€ŸxˆÏKTDr+~/ñŸS ÂD¥Eñºân¸JŠßÿù±ºË–éy‹fyVƒ¸òlcƒùöÍ[¤±X‚ÿ šñÉŒ'‡~ÇÆc$¦>ú_@x®‘¦ZÇ¿ü©N÷×®]Û]TÊaç´4#ÐbŠN­ÉEõ!Ôš spyû‘»I $'‘o„„w䊀´ÎÄF‚ý¨õ$ œD‡mi¦Ò`ݳ‚ÃáP&e)©£ Ùä(òÝ7Ó :( ð|ÊòIVD†‰‡T YM7è‘¿/á6£È=ˆ‚o"9ÌòÄ‘XŒ欨ìr€9”öXLsAWìÑÐV©ß6oÕºê ‡@uÊ:ºO÷Üúá†2‹GÉÙ fíŽrÿÔ•K]•½¶âp=xHY¯Ý¶V ºŠz³•©«^ºe°oì<=Ý1Ø úŠ­zþÊ% C p’Á˜c¨o×®D5åÄFÚªP°y«‘gßãýÿDÌÙÈLâüÎ3U ïT[ξáðmÛS¸*'ƒhšÖ`«²ùTnÁæ•ë6VýƒýrâºâøýÉÒJ«Õht5£YíC¶)6±#D¢!´JbØ{½^l 1 I Ìb{Û`ãb‚Ò µU?4UD›~¨Hš&Rj¢B¥Fu*Úì}Ýž;»,î·8²D¤2:½;ÿ½wÎýÿîE»;Þè²…FÂ6I²+D¼ñ†ÁÅÜ3f ‚*-þ°Ã÷ÊÆö¶Êhà1†©Â+­ü[°·|––$­Êü#)…–Ü‚_áHÏÍ}~=«ƒu®‚7o®|Ñ#vƒG(àÔËD#6’è….ÄÛÂ.ñÜîç¶›õ`Õ06 'pc—ÇA׃÷©zªµÈK ÄçŠÞ‘!w?½#<¥ž]Á˜ûÄ®ÈÒuÔAè%Û|&wd_0llß šqE…[leÊÞ?{ŽÄ£D¤RYC@Ž ˆ”W”CB^"ûsr «HD"À$Ñ¡9%öVgç&£`1bƒL„á8 ÅU[S;:T¬¡‚­Ö¯Þ†Þ8ƒÔ!}ÅgPl I $u¼ÔkH£®­\¥@ãžÒÎWQxbÉî/'Pbù§Ñ…i´Ãa1U%c“Ùb±Ü¾}»Ô‹“hÕ¿˜¹&l°°Ì3íH.€Ä$R§zµH )6½d=ônœÞ £Üu|–!ð ãšMkÛ†]Mcn Çh¿˜ê_.÷oJöÙFz[.öc´¦úê/žmJö@Ø“ýžï'>ý+ÔOŽIþ>™;5)íKR hDên»àìÿaêÕØ²éi탇7Œô4§h7©¼KNPØ12°wÂ[ój½ÑÌYYÆ‚9Þ\¦Ó[yݾ`¯(~Io"ùÍŸ¼ÝÅã)|™€ºyvpäÍ®ƒ[v>ËÙ2=þÀô›Ä ‹YóZëú76Š´ ^°Qj’<:Ðè7{Á#¢?a—5Ðf),ú‚­ákø2ÆÄóoXUµòÃ>Èk«h6“-.¹ÿ§sÙ’o6€pÍßg?_UUÍa£³2ü±ºÃ¡f"C¢¹h$*J²¦?àné®_[«º…`Á0 ÝèüL®H"4+íør }6_ô rè@'¦g0éqÛK-@KÕ·IÀƒÎJvŸÚæï«ëªÅF–ÌXøkð}gQÕ|`²G!ET™HÁŠX„æÐ.K”Uh£:'yóaÈ#$ú›ßjÜSΔY0SÎbƒNoâ0¸ooÙúË[¿(zßc¹g®4‰ôçCò„(Mqæñõô(Þ‚-§ã©•R:­©^Å U …VÎ0V†++¯Fû¡PEÀÊ€ÔJQSŽÝ fÔLEg(–PÇ¿†ÔI *@&ÊÒÝŸrÎ}>¼+2^¶bu-ÆzŽaYvݺu÷îÝ[Ø‹”fHîpûA,•˜±0 ê?‰lH0X Ž<œ#PÄ ¢Y&¡ Q#DUHÀKBp—BÔQà‘ábõ—çð† P†ÎÇsì8p÷Ïwþ—uæ8MÒéyàµÂˆo€„~ùü}ÒÿïQúþ ü„ܧƒ£7Gòé,ÉÞ#0ªð3óλïìÚ³¸èq%ìl9CµëÍ5h¯yT”˜Aò5¸ŒbS‹º¶2‚.N#éòÏhÆBÑ ¢IT£—è[HžA’†Ñ)N¡ø$ФÏ¿N‘&>A/€· M#ÿ¿ŽÎ‡Ÿ©~þyCÐ2Ëè=®2—&2Ÿ¡ŸÉÍA>{ï_fÖl€%s-’á7–NA òІ.3TC‘¬@ÿRÆiš¦ªºÜl]É–•cº¹`cå;ÜßkO¸¶¹[S}Ždoûhÿþ¤óÀ¸·5åÚ=ÜÛ0áY.*¨»Üßž¸qëg9­î“\ò½›ödïÁTßžÑóu“n –3Ó‰ÏóóÙ ” ùõg¿eijëÒÀŽ ç®d/ðHjL:—K}èlÛ˜sïhoÓ˜{_Ò³¾³ž­À,g`¸ÄÈQ&ý—°i-:wEO¢X’Ž È ”8"ÇzE£ðë(zBóâcô ÿª…xâlð”FžL@ÇirÂYø qS‹Ÿøi—óG'Ïß„8ïš8~ÎÓܱڴʂÁa z¾Œ1êŒ&l„B5˜­n÷ìîQZ|!Ñ#Û|€’è‰Ø‚KuÏxc0`wÖ­ÙRÎÞÊ«Ê+?úèÃåZ®ç¾¸¿²r£7˜4Ž:Úðš_t%Å J³¿©SnðÇšÃQ{: F…x‚ßæÞÿÍÖŒ¼˜aôÀS[¶l~ðàA‘ˆ´£D‹ù<\ ü’Û¸q£Ag0±B9kvÔ5Ãë.ؤèžP¼ÞÛÜpމ‹Žó0è´ù%;Ì‹8häàÖÖr ¬`4°†¬ûù©£D ‘ à„D‘CK À•p€ž ITͼŸ}ýÕ•@«°$q¬`½~MU•òöÙ,ÉÃhÙ2—OkŽY²Ñ…ãóoöë>&nóŽø#!EB:ɲ,ë‘-ŸlN„º†ˆ&R’¥ªXÛ5i^ª„—㎗¦tä¥!ãÇ÷æ³ïŽðþrÀ)$MÕ’¬[²7m¤“:U,Z×N‹´DšTi´Q Žó~oËÒµt¥BBš°~²ã{üØ~¾?ÆÉúòÍËã‚aÂýçézD²‰ŒsJïKp$ÙññÝ»§ªO`HU:Ý$ ´Àm0Й´”öÃbTÓ€”n¤Ž" aE µ—×HpuNu@”‡F‘:ŒÔ8 M¢®1$ ï0 Ž¡àò’#{FQçUñÊ( ÄPÏ$9Ø3HÎV À_ã:&‘Y_¥Œ¦Ò7‹M3S7o%$ú3òP#™<í3`:‹ë i/#¥Sïà 5Š‘ O dÝŽ¡À0RÀTWHõN æ@Ú3?Ø I&ŠhŒ ´d8§‹´µÍV5â=Üç°µõ6Aè—õ·Dì×GbÉj¥ÿ^û½÷¾˜I}ÎÀ4Œ ¶”ô7UL¸vÛ«:¦gþÓ¢GÚo§ß¿öû_yÞ©îwW ´éo3÷¶X«ÕŸc-–žóæ–‚¾–¢žÖCÞÊŽ†m…/Š kže¡1A1ô† ž{~'rV£pcZ¨yN¢` ŠÚP¤…N‡B"uD,¤]‹:m(Z·Ö6X×ÈÚÔÏëœpíïÚZ¯Õ‘‚ì¼ÙàzËÖvÝÖv³ÞùësÎ)[³§ôؾÜí"Řc@"0ð˜£è JØ“óü¹ÂZOak¸Â*÷F‹ 4²RŠ@A¾ŸÙ{2›ÉÚ˜giæêääÒÒÂjÍÛss³íð=Åcr÷÷æ½xˆ«ßÞ!©xÀZ6»%.µŒì »BfŸËÜj/¨ÛÂälÄLö@‘­[sggg"Ofë7SDû·F“‰x<.p‚‘áMŒ°+{[°Ü-¹º-¡.³ ƒ¬VxƒfWg‰¹~ö–ä¶ÎÊܵÔßt¨~—i|·P–hÊ{蕯‡hDÑi!¯\#jP“}d ñ{H#¬.z\šÒ£çm–(Ö`d肈Ìòü³;vüâæ­T2jpWŒÌ<ÙÖæççS×þ¸±¾|ûå+œÓ-—H$æ¥"lþ! D››™‹zB<–(lbé bCÚ÷ªkDBpB$N¨ÌAchyŒ#%†"—Éñ¡¤Ž£à$9ÞF œ$†¢CÈÓ‰Îʤ]D8þ t ¸2‰<}H"¿åÑ#“Møu%NÖní·ä²4%pNܺiˇü ¡Í%æà©k}îÙnC¶‘3Q:EFõÞ®T#—ɆÇPx…‡PxX7œj⤟Þ³ßÂM†ÉàM›²²%A„¯$Ð56b:›?êi¬êsˆ6–Å\‡{› {›­CíE=ÍÙåm«•þ–¡–s£ÁY-¡¿5‰¿|zïx·vqöµT_r¾7ý»%xK©&‰ùs¹ï»Ò¤»¹°ç‚exÕústØQÔe/îo¶Ž¸$%íÃæ®–ãÍg²woa0•-ðO3lÍfó"Lã˜çÙ=»ÑÅ*ÔÛ€º5„"@hD9ƒ‚µ$”Ã6Ôµæ6X×ÈÚÔ{6ÇOÏ:¦ڧλßil»®õ†­†âV½÷FëjÃ]þ£ý¹y›NbÀ  ´‚Œá3 B¾iwíK§<%N=‘=J©Pá2oÈJÂ=RX©F¼¥í{²ò3àk c¨ãUÕ0µ.$_7·%ùñŸ>ú^V6‡A;\.·©µÄŠøjŠÍÐH±$u½¶ÃonçrŸæ6ñ4 àyê©ìééií+ôøŸ!´ZöàÁƒL)Sä…3YãùWl~K{Ô*‡‹ü0ÈrYG Ø™¢Ñ×÷ÓÕ¶ºCÖŽ@™«0÷HÁSϤcª2oëßÛÜZ8ª¼ ‘$¬Á+Õ1ŒP$Å’ÔIÂj2Сu÷üÃá´¿Ÿ¸ Çòœ†5Aö˜W­•øàɘ?“ÚÜ#0‰>,K_‚/o®/Ë-DOhä_Ñ´‡ÀM”d›˜ÌÉÉaicòõ ÁŠi#6æ¥UœBÁR/¡èR®"9®ë"ŽüãHCã˦¹z™™@ôLp)Wz“¤ùé †]ù<³(fÇ9:}û>TcGî(R†QWœü·\!¤ ©1rNøuøks„% ‹"#‰4Þ{𥻟ß½j‹Úõø; \AJ72›ù}èÔû¹RŠLè—9”1] £ú…@gÞ"°Íð¥ô—Í, Ï-#Ò,`º»¯¾20ŸÅqF–a8zãîÜ7å–ò÷Áî Å£®ÃƒŽ¢€¤ bmؽZéo¸xªßõË;ï/j‹`ޱß\}Ðup°i_sYo[÷x(²øHK&æµÄ½ùÏ>ƒ[¿ +4™ü4ñ nL)ík¶ 6¯VˆC[áœä´ý0ØÞÖ’˜÷@ôüÉQïú׌[D€¤‰Å0nFÓ€^ˆŒùüm¨©Š€$TƒTòÖ  ŽÈâµɧӼ§×ÚëY›úY½4™²µÂ8\¯k“\³µ*NÊÛ ³Ø’•f K‹Þ%>SýÜQpH¸TV‹ýÁ" Äon—­n">Å¢kĺâ”o,<›e0IðCLCâ'þ^©9m55o豊J˜a LŒñõü#²ŽÐ »„p'îø|ÅNµÂ+W¸÷œÙÌšDŠã(&CM&éÎB‘Åù…•ws)™$ —___Ï18 ð^äîóW:AAr»«Âï)v@7¾A#>³;Z.«…Îp¹»á`m.»E€ÛhÄÙ=õÆšzIóÉZЧÉ^Íß¡…V®àÔ“ ñ{È»pk>¦t}ô“‹Çvì`(ƒ ð¬(04“Á`#/ÙÝ®ûŸÏÀíо˜…+]€ùS_ XSµz7ýÿ|yŒÛÿ4ØPbéöíÛæ2+Å06d™,La†¥„´×Œ\!yõM"¤³Žàò‘Œ“„&—MsHm1R*lÆÑ?Ù¯û˜(Ò;à¿ÄÄd“M&“Éd2“ÙìKx´â)¥Ê/×5½ž/U`ew‹g­ð©¼//ûÆììì‹À‚¼S±5©½¦æš^Íýa/½¤1mZÛÆ¦¹úwÍÅËîNÏr1ž ¶\HHZ'¿,;»ÌÌ3ÏÎó|?Opúbàéß|¤Järôñ (Çk&‡Òà²f“ù8$òϾ ¸ö“´af 2ÊÈSŽ¥O‹½MW):»1àÃ/ò¾½wî¾ÿÇß}´#k'Çhy^cÒ0p¶|( <Ãêí\­ZþI&Á3E †õ̓ç&y CÑ·M|f&# ¡išn¼T‡Ãxy9þîÍ[F}…s" ÉÈßjö6ÖŒ¸,Ã=‡†Ú$ÅC¶hGUÔ¾^éx¨¹|¨³nÐù‹ßÿæï©'¨‹Ò¨ýЄÝvÝÕ6;ðhñŸØ,øg=óQôIUÄý£_¿GšTÕäo?û[õ`§-Ú¶n:±— µ­Üã©¡ŽêhwÅHwÉ@û‰1û‘kÍæ‘.óP׫u•BAÍ1è-8Þ) Ÿ‘6IFÑ«ÐRÁ:ÖCð")t†rð2æ2(nƒ—Ù˜ºÕ@^ÙÐó«KÝwÞ!™¬oQÎÔعËı"­5‰ˆ’Ü8МÏmµî)î(þ¡buÌÞ°YZ¼^³ ÓÙoq¥)â–ÍNÅì [¥/¡Ûëe™¬‘cñ©ekkkq@-Äãq5µ^óv<¾ˆ'{ïçwˆ4æûk†¯vÙÚÖÚN¼}¿-÷¥Ý²Í%W9jžÝ'èYÞ êðä,Ë|ðÁ]¼âòÒÒ—i~*%˜$©ÔÇqfÔ œ°“Íi*yÇWN:-„T,½óªýìµz|¥ÎrÉ[f?žÔÄ|ä9¦máX•ýª$Hødµ×•òºÖ¬_úpD d$øJÞ`)i¨àÉCª'p£¦º` ¯a5h!QyŠFbåææú‚ñ´6ŸFêçJ®Ë/þÿ°=×W)BÙô'K©Gÿãü¥:ŠðƒÚ&ÛY.[K‹œaó¾¯CóUèyúç@ž†b`Âã…àÙE*H3«kdÂ(IbLóÐ$„GÁÕ§9ø&cÐé©Í¼^+êØ,ŠËÀÄ$lÓ±­†Ö™ è8(ây‰¾)Mƒgœ´'y”YBU‘ÍÉÕ²:Vägl:ƒ£hFoÔ#u„]E -Ç«#ŸÖª¼¨Šh„4>ý1èKßNG/)eESÍÏœþð[‡>ùôãÅÄ2éÖD266iä2Øõ:Žc²^ßqÚÕøvÔ‰ )wlŤƘ^¯ô/í81l/ 7×NȾ»7«FzJ£í‡†[¾q|ôè¯Ø¤T|yQUÝ?;5ÑûÍáVó”Tìüð/@.§ŸªK¢nËàºiäÄõNóP›u¨ý»#]Õƒå}Í•ý­ÕCvóp›uÙÓa쨌öœTZ÷Ÿ*f³q´³¸ŒÅÒñ¼À²C³Y†Œ…à9J=ˆ¯ä ௃ÐEo¸ ^jdcjîrÇüÅöŸ]ê|÷r×ì…æ^Û™_ÛŸ¥e(FÉ Y04®JôŒîý¶£»Ù7I¶ž¾ ¹Ïê –Hr‰ sY®p*eNÔHÀÒë3»V(Ògó¾ %W«}[÷y2Àqwÿþ} åd2µ˜XZÇ™›}"U¸{ °ê´áüá·I³ËÜX_ ÇwŸ×ˆÅƒ$ðWx"çž~ͰˠåE\0Q®oÞˆ=›é€H=¸/n&ÖÒÒR’¬oT«µŒ¡(l­‰K÷óV:üV©·Ä(ïõY0Ëf‰ºÍ£1l‡ Mœ‚ ºåøÖ®¼ âGAŠÌBM†v;Ô5@ÞVkb´èÑÈ‹ŠŠ?N¨©•Á˜L˹±á ‹(by,†Õfæg!HjF\‡û[lŽ’ÁÖŠèú¥´«bÜU<ØŽ»'¯÷TFí¨;÷?\\™ÐRê'©ÄÙ>¢åÍë-oE›OwË7®'È·ÉE5á¹5Z1Ò½^í!Øsb“ŽEšUc]x³•Ãíßµ#QN÷µžéo¯î95ê°t˜•F]Å!nGËPY¼ <Í0˜¼9¬ Á¾{£`S½ ¤ ¹ ý ¼rÝFÛà¥F6¦~Úä¼yµg´¾¥©´²('ÏD18Þñ!ˆÅ¾ážÕåéò,»‹»Ž_<éF‡„,½r±+h–Bå^ŸÅ%[nsj)²’àXþRþÛZ5ò]&Ï ‚´z£@FÙ2hñTâÅóð¿%qpÆøÇ'yqEÎÄŠßÚYä-u -žåÇ¿ãäÙ›ÅCH*œµÏ"ED:½rc£A?;3“\^Æ–/,,àEãÉIJ’,q<<•H¯Åâ‹wï¾oЉ,Më9._Ìk<|"™øê5“ßbµvz­®k6%Xìl*n0ñ™4Ke ÌѼí!™ Áàq©~YUÜj`Yш,‘“ @¼žÏM‚o$7~•PzŸø{Õ¢ú|ªÛ•þPúS—½î{u´†¡)#ÏcŸ‘/MŸ?þÁƒéTM=›ª/·ÿ¸=eÛÓÇìöíÛ………&ò€ £Íå˜-Œ 5æí H „æ!0a’À?N$à›$üðMƒ< Þ9ðÏA(–Îë±Õ)2 ža<1¸6 =’&£ÐÈf0” )<mpm”[ Å 0›u¦oeeFj>Ž¢I$ÀWð±J¢h`z- e{ÆEÇÎè*_3ꘗh¢BGlІýoV-ßû2ƒßF<°WWá3ƒ3SÞÑÝnÅn—Pe›ìæB?´ÏøÞëãÓÃö¤k½ªÓÄ€mj°~ÒY›ä’ƒ\¼ʽ|söŠý©‚9²êR>wvÂo›t5&û¹TØ`ö7×À!šïןœ_¯Î@¼=‰AbN @jÒƒµ©.íj˜rÚ“ÃÀ€P]Ú½?Ñ_•àç†[&Gþ&iðõæzƒÉ`Ôé¶R–¥,½ ¿û$adˆ×v–¯Eþ3(æ@JÛó¶Á7y>qñT_ïµû+¶áŠ@‘KÓÀhZa·5¼Tí>Ò¥Ø}.¨˜E0FŒ¡L‹¼/Ô8"p^(ˆŠ- q#D8¬h 1f“‹Õˆî5ÒÀÕæ!ùL6§WÊÿͲ–ϳüÕ=’ÖAà|B³t!q£iüGD-!øƒà±¾ƒûØ—Me PD§ßÀÐÔâü¾žAá+fq¾(¾ÿx¾“/d?íð|}ía=Cѱ±Lo«´ˆühÄ šG°F¬â³ú ͤڑq[¨ýÐiRGëMTQê±ðjh$'ªI‚j8œ•«Òˆ*ú‹Öˆ,a@ÀvH[‡%I.È‹>L” _»D$/Џ±ŒÅ’"¿èì=¼};ðÓ—ù‡G£.>å>œruMÿtï‹[Ÿýº6\¨N~~z[“t›“ƒü´»aò}Kr®bžX7M™“C Sî¦éQ{Ôõí¦jb3LsÉr²]Në·Qì‚f í0üA£· I§ÒŽ”iCÑ.íÆ%[îBâ»xg´Ig‘ hiG­|U:Q¼ÿé@áÜ^êxÞÆxQ4rÓá¹Ñƒ¶¡ó?éº?õx®v¹¯vÂþë½Þ›½^Ø­Ë}­Ú ÞèmוNçåþáØÉ¶cûªvèM& ê?EA¥cIŠÇ‚`ݫԮ·_µxúÃ6?'€1DÎ[¬.Рɀ–M a®=Œ³kN«É…iÉz-ùG©»³­Ý„ AÀü‘ß[ç·¹ãMb¨v$Þ*…xOÔŒ5„¢|0Âûe«_â}°°Eˆ7†Ç¸ˆÀù¤ÖàñªÖ­Ì&9Œ`Yjë¥K— ù*“YUWÿ¹ª>><ç¼sçdHÖ@ÁÍ*׺jÏM^@`¸.çD‰óÈ8JæCa‹ý„ûk ø­C‘&!ÈùÚÞ:UAQLéV]©›kÕ,¡QAT%¬J’NȪT¥^‡16ò¡ "sá?DU’µÔT´^ü5"çBŠð@œ·Zõ$MÂkʤ/7úý»÷Þ¼v²ëýür¶p¿Öp.TÛŠ/OàJa”ðäïÅX4šâå©ÿ㳪HþöðÁ¹ö® ’,gi–ÐhÒDè¶ÁËôÊ›¨ãR&2ƒB3(:»n‰Íkå~³!|ƒÄzÂDS†)©®GÑģЛAÌ!e7ŽÎ–iÙÊX‚DǰOä…g_bûAÑüQ¤‘<ŽäòÄð‰ÏkÂÑÈ kÒ€=p\„{5‹Ä$ÓHšÓ”:šGâ>³’F§ß+y½ž w2:=Á0„6d%A †½{÷Þ¾}ûÉPý[YYQŸ ®#:¢Üd$¢ü;;Z‚}¶„§fjØ–ææÄ€%5œ¨Ÿ8g™p¶¤‡‹­æM`ƒIgí¤“K¹mq§ó|äK^ͯærùªú³Ï?ûãßÿ I^’ŸßýmàÆü·>þâáW8{f²ð|\þÝ/ONÖO¹ì ÏÕ»Ÿ®¨™‡jæ/ù³Ró”·1þ¾yÂÝ<ヮŽöð)h.pZ/Æ¡nÜÙœùAÒBt<Á³»LxÞK’,EéµTÆÒe&vƒ‰.­ßº›J$Ð…“ãÉ Nüì¥t ¥ )gÑxŠõh-A í¸e¤ )Ý8ž?3^\×ò±c裞aˆ;†®8ÜCz½àÉåv'8¤€–Ÿv ]k¢x>ìv¹ø£‡víÙH³ÀQI0õÔÈB~ eìËÆ]G^9x®Þ1b›|a~TjðAiSl‚bûÿR¢œ2èIÒ@Õ‡ª ãÜ‹uŸY¯|ž×’Íd`ýé¯nÎõ4`‚­dv¹ù~‰·†³Wà<@¯¸U‚¿![ü7 !sA‰ „ZüÇ÷µn'¶”Ôfišühq±@‘)”OÍdÿÛ~æžP¤°gyyÙn·ët¥›M)ÓvbÓ{uAÞƒ¦˜…x« [GÁH¢%¶ŠQ{w›‰YbO±ÊíÕmF†¶æ%olÞ $P…€©Št?àÉ(5*¨á€&Aü* È!‡ñZ”pc K(¨ŠA¼ˆÅkÎ'‡ É’_ï±MÜwÀR¥H‘,N'ëtÖYv,Û j馦>6¤1ëÈÉã„4å•òp !ÁNü~žg;/;Og ¯Z£cÀ¶J›ª¢®H*-šX™ÐZ #Ž}·ïï uãP*Ôq:~¹üüûýîw¿û~??ÜE¬ÿ3«Ý¿©RA“Zü¥B ›ÍºÍŸ^¾”„»óó’HaZóù¹,–dîÞ¬Â,ú2Å«ïûr䥥UX]…Ç—h-æ±ßz^«')™hGÊXìlš]¶56#.b (þêƒÜ=ºhœ?:…‚iÜ º©LN4‹ªÞĈAñiäê“:=Š¢Ó(víh)Zöbõ¨v' ã>ªýXÁ9 Ó¸ÀK7yé~ô°d•üß ä–X!<‰‚£(2Œc(uÒ¸>ˆ%ì™Áþéñ>W»]¦}‰¦5$¥€D WÐKäT IhYÕË×d2™Â„‹"/°…2€ÄlnFX3Œ IÕÚåMÁ®í#ÞMñÎú´»v̾q¨®è ý[†­ÍS=Æ‘Þê”XÒ<ä:wùO8~aœç>¹ymwŠ›¸xô.Â8óÙYøND!XÊãÅñ·[×÷økRÖªñÞØ©é;P /á¯×¯ûèüÔÅ3ÜtrWÊÛ«ØÆxI tgZ$Šàñ÷Ü2ÒcµW¦z1d­qm÷5 Ø~¶Ë¨)_*£eƒJhZIP,I©ä œ•³,ñòJÙÎj0£D¶G_ âöaiÄ̸<Њ À…÷#n/ Ib‰´Hù}?vËÓgÆ3¡À\A´; y¯ÃqªÓwNì·€C pæ€[ÅÜ×£½ƒ»;ßY_Q®Ö« G*ö¤´ZÁŸVT ¡|E³v×ë[ gr…êÝœÑ2¸À!q#¯ „k݃ó»ÖÈKšTÃ2r†¡þyó&pd>/Ì 9q‘Ž{É]2I~~¾Ö`PAØ&H ÉnyÕ4¹¢ Èü0º!¿Ã$@9^ˆ¸DM(jôM¯É¾m]ÓRB¯!UJŠah¹^¯ýý…‹Òçÿ _,t÷ðÆê1G{/âZ¸zõꪕ+I‚FªIf ©m«Ø09á5kìÁgÈè ƒà%Îà†›Q£w *8Vߪ ºíËÕËœ° Q“¬kÝšÏ=1}, kÞox·èõˆ¿a6¼uø¨è÷b„„91‰a@…_ÃK‘€æ|n‰=~ÑïÆ½ð‰ÛžÀ¥öΆ¬ Y¥QP^Ÿ0±jJá²Ùo}ý <û×·oãÌ ó‘ÅqwAk ÇOò÷ô€Õ[ ÈGøãÚÕ«I†×1òRØYÈEl)ª«CŽ8ŠŽ¢)œ¦!§Qx a±4G¼än £"‘AMÍ@"-M¯3`ù„"Ç$ÆÀÔ9†xÅâ‡P0Š\!d‹¢À(ŠM?ºýaħ±aÂGpS‘cxð¡ÄOá¦àĺ4òÁ53X,\qãÒØ$ŠpÒ}ˆ¨ÍQôz5¡Ð«!÷ÑÅJ‚€(H©HB^ë®nÓÆ©©©[xZŶB¼ÿ Þ¿ ÚÎùsP†•×ÑÖ^ªTkärØß‘ J]¾lgàPã„ Q™²&U#–ÊdWý°µdò¸ }¸§b «)í1D:.œ¼!ÜÅ£™þ!ü«;Ãmo§Ã¾ütN˜a€YpöÆ\nîêŽÃÛҾʡC†d÷Û·îf³B¯x¼Y1ÿo\5wþ‹K]i~û³~¸Õ˜öTv‡zK#ÛGm )KU²»b´·b¾iĺ1i­Hö“½;SNCç®ç_YE³rx)†Õë 3I¸Òô2µéG¨­ñmˆß‹úA&-(¸q{¤;­$| VJTröÉ^¬‘XËÓ6Ƴ¢‘SN0˜ä}sÏéVÛ™v\¡|¶Íqî€ût»ã˜Ù:ÝÖóËöäžN_cóú_^B³°÷T*•Œ‚“(¤Q!×Qª×ÊÖìX×Ô[Ó¬u‡ªü|E7¢U^|Bv6úÁ œÑ ú»ÖÈOW­ÓÑj­ ¦ÄŽ÷ƒ¢ð?ò“‹ ~ø›srŠbE îV­°pµ^PG¢.ñA£‹7aŠÀœôÃÑÆ@wuǶŸ4ªV+WëX5-§JKu—/ÿEÀ@ÌfçzY\Op,äÖBT\höÌû¿†Ñ²,]R¢„|­“©VµœE<‘ÚC5pH(‡ ž„ÁÇW{BuÞw64—)õá—Q)”4S¼~™ö¬¹5¹ˆÈ…Å€O ú16àlp>Œh— QNˆòÿ|È›ãÜçÃ^1ä{l Í°öçv1è.1àx0OH‡omZ«ce,¡(QÒRDRR”^­IIsŠcí|>÷þ ? ˜±oùäÿò(,ŒÙÙY˜kW¿0T`k˜b--#ˆ"† B_ôšÙBÈ7„†>@Ü4 Œ¡ø8ŠO nÿ™øÕ¢i$:†BSX (ôeP§…VéW0²âÒUèP¥ ¯£(V™DaÀ°a—ã3¾ Ê`Zûæïo÷9šFœ5HÞ<ì6XK#ƃ¦”Å8bT%- ´š”žÈ”<ʪ¶5MrþÎ¥^¥”4KÓ°ÛÒ(TeŒJƒw%4 [(’^©“m}ã¹î²P;Šu`ðfLŽX+â÷¡(œû1B gÔŒ+<}f<9Þa?ù®r¶Õ~®Åö¡ÙöÛ6ÇïÞu6÷žjé=yÀy´Ën6¿õã åj† ´x@*þC~Æ6‘ÝR$$K–¬Ñh4šÑX>”“„õ®( îŠ ,Ô,8q|$d , „p„øˆãk<3¾;‰ãÜÄÀR–/»­ªªʪ¶{|¨–ª-­ºÒR(W°§ÿg£© Zi=YÏ#û½73oþÿßc“TØž Ti2l>ôæÞž&‡ßæò›Ýk°×Ž5ˆ½–HŸ-Ük"’Å/YÀ!>ÉæÙÕ4IqÆd2Áësûî½{òì€ðÜÇS « ß¿{oÕòË14©%˜†¥[ùí=Bƒ?i—ü&—Ðìl^Ð &X}ÀøM©×°,’$T••å_~ùy±J-¦¯s†"Ïg’™0Ÿ32Á9hZÎår­RQ š&ªí|Uùö•VŸÙ-Ù±¦Xï¶y£ÖPÄ[ ;ÜÛZµëkÔ,Ch9JMJ–†«.W*ëëêâöí8Õ™ôÊ|l€ùoðYðÉaŸñ?²„\N²À y箑"`"B^ô Êqñ!L$ñy¯[N$îúù„Ñh`HIpZ lŠ#*…ië–ßÿöw°à^ÜzZ§3÷çUÐÞNùæï:Ou°4 S¦Z¥ÐÃfuhÑѱv”Eþ, _@Þ,ŠM¡$dí1E± Hñ/J#Ña$äpÆO HÎ[³¥’T*HZµÊˆœ<†°€"‰³H½L¡Ø9L‘Ð$F…˜CÒг§/~Ž!iÿ¦‹f†0YTÖ #qÏ øËbŠ„‹ýDõN"_/jó*—¬Té* ¥JO)«ñøÕe´êš·6sS·nÞ†7í~ßYÈtáq!0³µJ™ 6sþÞ=Lã»÷‹ÅÂÃü‰ëh\Ú@h`Õ,mÐZŽïÙ—òÚÓnK¦Û’qY;­é޹fóæL7¤o[ÆeMwoNG>þêÊo¾øÔÖßeOwµ º,YÏú§}BØÙÛûh´çâÐþ´ÏïltÛ'ƒ¶´»çüÀmùAñõ)|ö«Ž±äDO`²ÿ«¿_–ó€ü;òÃ3W~µ+ã8™3NSªcÇPϋ҈eÐaÍ8›‹ë‡op¾Ýï€fq™²®Ÿgº6¤N›»÷Ž„Þ»Ö½ßR«Ó€IxLj†Ór¦!…-¤8Ž h K®4(ßÝŠ¼ûQì(Hä †G¼Ë¾–ˆ)^<ø}ãUÑÈ…6×Å6÷'Ç<¿.6X< äâaÇù“žÔ{mm›Íª HFO5ñË ašÆ—ÌVPºÅjƒy™±Ãz8dóÍÞìlDÌþPChöE›¥È¶@ÌŠˆVŸhõâÌÞ—­õôæu–bÊyz­öâÔyˆ½wŸÎ>ÿÏñàQTÉÓ=6wfŠ„MN‘°p•û6ða ‹~HÖ`Èì‹4;% ˆqá¦jJÏ(AsÜÏÚÚšE â(‚Ç«Y¥ôŸ$O&ÙÇZqàá±,§cHRW­bË íæê{×îöX;…o¸Ålö8-§¿Õº¦f…©*'Ô:¼d•þ@(5Á°ZÈM×®§Èe{`íºóMÖ+­‡¿ÓÉd!)„²eA’C¢d>( <‹èÇ ™«FàBk'"â~À#½rÈÇ K@ièGã×NœîúÉ–TÀr¡Ì$54¹HÛ¹çÚŸ¾Î?º-ùYuë—±?°_`AN÷¥^«­ƒw™cXˆÖPHª(}™ú5´c?Š÷¡HÅs8ÝK9”†l2¬C±³(>…"#ˆ|aÁ¥¢F"€Ÿñ¢ÆÑ!ÅÖ))^+¢b>ZnDb Ä?Š©HL pÔ?…„â Ï_ÃÃB' "q…Æ¿Ÿ*¶qEqhãx ”Æ'*á’+Xf²+tuØä€[5¥¡U•r«=¸÷ȧüúNñ~BËç wdù6€_ÆÜ}r#ÁË;Ë$3çK@K©ÿà6IÀëƒR2 GP*…B[¥]¿Ûº§¯ÇšrmNžjóBºŸk6NXûðGkÖÙ>µc¨{G¿û}®úA¥Îy‡º7ÄNÚ2ݶ”ÞvÚæÁNSÖaì;½+áþówÿÄÑéáô·…ÛíãÑã¼ “t¶g„«ÿþj0Øç7þöNŸÛ˜ì°dÝ€{ïœÕô¬ÒØšr”XÕ@p5öu¥6vnIu€Rvg=-)§µ·Ó —9à4øV;߫޴œÖRŒJ©'¨ ’©@yB3‚ÒP S¥'~º¸ì€E—yß/“Ž¢èQþ‰û‹D9ò}ãÒÈGǺÁuâ¯'½gN¸ãûÛÜoïYU>ßÀ¨A’Z‚„«ƒ…–%Y´®'´jÖ´mÜhè×»f¯` FmBÜ*D|ñÆ@²IÛx½Ÿ±ó‚µ'Ðèâ-n È$ÞÈ¿l„­nÛR“–V³,¥¦¨UÖÞüöƃ—e@#ùb´ÀRŠ!Ðo²Ù9šå ü2ýÂ.s»dñ÷6GÅzÔÌ Àæi¯?ºm逭$´j;µ~ýºkùk1šJHx!¥x5ëÌÿ~ÌĽ™ ÷dT„ãÒ¥Kó«jXDÁ@>ÒêùLåaµ~ÑÚŠe«Ë¸ZxÜzF´o¨9ýF]Ý/Ï}˜ÈhõåzŽUáMÂrœ’Ų!8ø)¡£ÉÅ]_]ѾbÅ„ÙþÙ‘“×½¡Iá;áhAŠÈBXæy™÷cBHÁ¹j¤ x帄5âï‘EA‡1opÀ!¶ ïËG„[¢øEk«Q¯«V)áÑ$PŠ+§˜×u•/\¿~ý‰›<›%?ÔãòåË›6¾I$8  =4Ôð.ê‘Æ å?‰Ä1Ë"1‹“8dêhÉ'S8¹ ^˜F&ðÈ1@E?V*NA¶C:¦FG–Õ’óhu ŠÇ‘8Œœˆ]@]nÑÏæ–#1…ç?òl€C`Š ƒVºŠ³(ò!ž f‰AFñ!ÆÏ¢À  8¸ë™J:(' ¬¥ÂWò)–xn&I—ô˜éq&”)@ žSÊõákÐ&ŽÃšø©°x Çerj˜–…'0¬†àã,+è–g¿øüKºÚ)elt$æç¾Á3 È ¥gÙ×8ì€W¦QÇ€„dOdz%9úæUožómÙ¢xýŠ? ø<3Ej¾v@âíTü^Åçòy'>˜ŒÐa1¦»] HÚ¿Ð2æK$*¶üˆ®ŸƒC‚ÁŒ<¯ÎÍÍz´?µãßÙçÿ¥’TR~uÕûT!ÿò·/j5“ɧ®8r¡jŽ âÉJ‰X½ÏTsçq:Aº ë)9œ"ÇH0à8qDÂÇHø(•õ@ª}¶Å{„ì63Ú%¸)Yl騣ŸøÏ‘]„¬ù"3—ÑŠsV•“P‚Î$~@ê}” <ƒ”.B3_O7žg)ºܯõŒVƒüb \œaDQt»Ý###Ê„?‹åŸ)%yùòåE‹ñ©dAÏSvÌ[›÷»¥"f¯ßQÓg/î:PÞo/7Dö—ƒ ú­UÑ–ÙRÿ]=ÖMýÖ‚£ratoë×8@d’’¿¿õ©1b]wĺnÐ^ký ÛöÇÏ?¥4’LÞNŽnI´oŠlEÑ–ò¨y¦óJ19ý„•õÚ °©Ï Â)‰›a C¯ {$t VGÛ)Œ¡í:à¿ œil¦PC){Ihäd“õÔ^ÛÇ0“|Ödjjƒa–Ë&ž° )ës¶s{ígL2*xÒÊ^ûÙ&Û©Ë™FëSËESë“ù7–_7ÈWê-C&ù¢ÉÖ½}ßžÕR~VÎ|^Ðqj¨î–ƒ*ÍåNHÏ óUº¥ÜâÂÅkv­Ü2[´à6X]e¿Á,s„¤ö.ƒ;¸Ñï+öF‹uI¡ ·W:°é1x:ŠœeþOQâ T¹v¼]3)!¨9hÿ»k×|ù÷;“TEi’‚›39>†D$eó—§êZ’Óáâ;‚‰ßí4‚ÇrZF½TŸóó‚m-•ûêJw-_ÿ=M¶N¥Yêù<Ï®Y³rllìɘ6 /º<5 > 16;;Μ6QÐR áhî€oAÑjµÕÕÕW¯^ý×qð 7n܈F£EEE×àäTìŸ0 ¥´ªF•e_Õ¨ -ô¾WtÃl›ðw+N%èMºlJÀ Ò˜ ¸”@HqŸT¾Õ9”pè³6kóÛy 9Ð GF9QäµIº~íO Nv’Rádòab;}ÖãS“€·—ŽQî)ôC¦Rþ}ï›·ß3GCQxòC0Çè2¸Œ¥o‘ºÄ!®Ä³Õùw`@ð(ñ%Î^J ]§Iä4ñ žÓÄ}„ì³ÏýY%qúHôÌìÑÈ1â ./ÙZûÊš­$|œ‡I‰‘ç³TÃè¸Ù¤ÜDœqÖ=Hœ‘Wr~Ì€±ÁÙ<ŸÉ0•••7oÞĦŽ?˜ÞäÁ$ÊH<<<¼ {VÀfdÌ4 ›1oùâ*ïÁª„cCÏÁÒ„\7—Fš«úle±–‚ð^0Élш!ÚZØ'¯‰î¯IX¯ß¹ub îD¯ÄÄÔÈĘíd\ŠZ ·n‰9 öÜ»=À…I~òÙŸ*…1 ~ ©îµ=ÇÔÆ~8$%i2¡LmÁÇ‚@*ryÜ+‹™±Èg BQ$aÅA#†žÖʸ­&n7ö˜·GkM›³ßù‰#²jr‡ÜIÇp b“F2Aê¥b€é,³l1/­&–mÄù!ñ7’‰„(o€LÀ$Ý&n \äðî!žÝÄ‹WOrȤî!¢P˜yô ©Õž/ \®·^ª“/5Pü€¡2T/Ã({4ÚÎ7Ù/¦º]¨—Ï×Y.ÖY>®· 1M,Cu–Ku–_ÖÉ¿mlûUS†n š#õ-ŽM;Œ+VåŠY‹v!%CèǦ2FÈ$nŸžÓŠŒÅêó²–mÍ«l•š:+¬®rÛlÑ`#Ré ·‡K;`©=\íwW¸1K×î@¤±»³ÚÑ^Ü,qD7…$3? ¹Å¶6£EÊ-Dn“è?³ú­•w¿ºCµfbJy(:Te¾•1Òl0ª¤Ñó»€$©T+!»-«ž¯Ö/`2dè_eô ¹yš¹Ü|µ˜©ÑÁ׫Œ÷î"”=‰=ÿ™.é@JÁ,UîÞ½ûQo¿TX—Æ µjA Çfy£¡<ߺukz…Øô¯¦<]Eüì‡wïÜ•ÿfž¨":¯´8‘Õˆ€–åX•^Íf©æ¾Á1ÿ ¾lc›ºÎ8~¤H•"Y²¬«««{u-Û‘6–FYa´+¥c„”·;N ¤i2‚Ç!@BüîØñÛµ¯c‚ã8N !"¼h:´¶c°Ž¶}â[×V݇ˆØwϱ±Ò-›[£GWçÜ{Þï9Ïÿ÷4.ÿþ„¾%n—àé.ÁíÀ|â÷ŒFúù„«GàƒBhà†þà¾e+HÄ$K(Ä KI)ÃR·Ãú÷„llšûé©ìba£ —˜þZtçëK“ª)!?±ø[%´¸˜ Še²b…HLÊ¢·~ŽQÇtÁ?Sûb(0‚P'ŽÇ‘?à Ü1䡾KмHÕ(“bèpG;ꋎFŽ£ð)<޼£¨'Žú/ ‹·hMµ\&f©b)!¦µv!oùN££ã(xÏ!î4ò£ØòÃmç;.0OhÕ4ËD¬œ’€6QŒ´ÏϧséÉ…‹%ÿ{Êö<ëpRù‹yç÷+++•¬Œ‰å™šY,×ú…vØž•Ú­ó¶VgM̸9ÒY(Y7bX7d¨‹Úâ×'†dPä/Ÿ}œ!áÓ©{C¿½ä¹8z콋w“3O‘|º|²1bÓ [¶ŒXêÃÆùŽ ì(KSà¶Ï=€CÀ0„Ãz¢æ¯ šˆz€† 1›ú ³@²öhWÍ ¥i¤·1d®Ò7-Ù°J^¡¢2’o¥ %ÖЬTB*ªŒb% ŠeìšWˆ¦Ôõ3äÝ×#¾3À ¯ÃìáÏs²/ :Äé0u„2ô’«–ÿúÜÐÈ•ûàŠ „´€(&Ø/°u\Ô›aD@”Ëz+Ô|¿£çÝv[`ZMíÖ+¿>Ð ãz#¿K¯ß¤Ý°tÅ"V^BP°Ï%$èC1l6,€` ‚¦h’–RÁ®’®l|y«A}ȽÝîÖÚ<µö@+¤õŠFBµ~ÿ&WÇ«Ý~m¯µÎÄíñýùÒŸ’_$pù…Äç‰÷£—]ußfsê̳ÿ#ZΣ²ó nSmצEU eHÈ’yQY>qömˆÓÓÂLRH¥…é9A/xï,„Ìú‡<¤æz¡g;aòþäO›š ‰€„”¥Œ¢„”)i-&”‘‚îdÀÇaJ=Ýá7F#YÉ.vîËl1‘HÌL¾ø”+Æ= fs?MMMeI,9•øèÆ£‘ÁÖ½-•?Y«·NPÀ9n4I°”¸‡!+Hñþ×Wßáû„^7fÈÄ.ðB0—Cp‚×—¶;²/<Úܼ¶”…8.‚ˆ D GT…B98<”†“‘RöÈ/ 6á?øýÿwé×>ܤRÃ>ƒv—$–HIX’$‹ªkÝú@|DZvó§Pß™gªsÀ#Žñ#0†ësãX¯Œ¡`°°e«RQÆ`—R¤|ÙŒFÂÇ‘3‚¸Äáé#/¼ZU"—E hJ¼t%²º{ÓŒt9ƒ˜" è>ü0½QäFþãó×=Œz¸bù’E$SAK Œ99vj:sò„0Kã©ÞÙ<ý>õFº?9¹£±IaŽDQÅHd ¤+ÛÞlIeJçÄt.„ü«OxJ»¿<¥r·Óíî]´¨\"Æ„„ İûPÔhÔ×®þ.‡"ßz|yÊÉ¿}™þòkÏnNžgæVë!¿@ÈÌÌäó÷îݽúÁ{=kÕê5 þ-£d ÅÊÄD©Tº””\oï8^ðô |¯ÀÙ F#@8œOàyÃLÏ„×u×Õã®ÞPÎâIp5XY)Á.$˜­[óáõßç&Ÿz®>w)=“hÒ6"BÎÊi±DIÈ^ ÊŠ~¸¶¢Þ~ăˆŸE~ ‹Qä=†|'Ÿ©ÎÁŒÄûN!=¨ü↑•GU2JYn…ß.“¿„vïGÁ¡gF膊ÝíJþm²XF(į©Å“ñžÁœNrÙHÓ„lÔ?ŠÁÉLjã™Ï{Üq´KWÂ.’"нÙÔ§<™Êö ´?9?p½àe¼M.8†S8“L:Ì&%ÃÊRÁ"Á¥^kRo to‹÷®šÞ8Ò¹}ÐÔÃ!Är öz“ÂôÕ¿Ý6‡BÆúˆA5ˆ à0`¾ãfñ (,G&ÆšCM?7 ª#Æê˜lcÔôT3· ˜LCÌÖxäð¶p7°Í†ÁîªÁÃÕ1“zWP8jø®Ê®]Ë5UòÅe–"šfY)!=—c¡Ç¾¼9‘­L*¡)æ;¥ò5+©&5ê܉Ü-ˆ×¡q{1côµ¡  H 6(†ôˆoC~ݬåbßóB#çÚÍ¿l·€“\Ô™Þi3¿­ÃÔq¥Õœ(^Ô›Ïï·œí°œî°Œî7š÷èªT/ÿ#/ƒÐfŠ^HÓ°ŸbÖ“RbŒ×e‰XZA•­.µùÇ u‡³ÞìU›¹³OÁƒ×ºu.0È´žBшGëtjmÎŽkã¤ï¦²">5… 23ÂÌ£S‰Ïo}j«7ZÌ»•Нö6c 1Õv©WT+%r–a‹E¢R_&°M\iR$K‘¬Ñh4²5–+Ç’Òd[B Ýr Ê ıã$®nH“rÄG|$N|9lljs°)„Ce¡-‹„Ø.aÛŠªÚíÒtÛ"Zq–Äñ1ûÍLb¥”TÖêÓ§ÑÌó{ß›7~ß÷ÿ}B1…CHa ïî»zeŒ‰ªp˜Sùé{FtB)\Ϭù'.»²îß¿öÖÔU*¶Ë·Xì¦Ï¯Æz`.ü½’e °â^Æ Y›ÍO‘Ww¹…èTöj}Zy_ ó†-‹LÚR¯ªÚ¯+ïÑ(¼-e½†*¿±¬­iulþªœTÐLœO‚lRE ¥•FS“qŠR¨¥„É™¼Ÿ&\µX\°5–#U 2½ xÀ‚ ðÉ[¨ X¥ž1÷Û Ÿ«¸÷#Oï…F6Î5èÀ€CÎ7è/4µ^h2žß¯;Ó ;ݨ?õ®~¸AÝYW°°¼jùÚ‚ìWÄ„^†9®„Œ"àÒ8$X!ÓII0 tùUqöúìUõëöjd-z[Y«Cn씵ûJ,>™Õ¥Mo³Ë[mŠ6«¢ÕRb4—m¥¦DшQ©» Ñ÷B¿wùê©K¡»!‘2š7Aë+Zœ²Ž9/¡dðÉ]l q›]•fC¹fçÕR2MLJ„B!Fb@#!& °¥¯,êh3}ò÷9`‰"ÆÝÏÈÿSΉ²r ‘ sáP$ŠÒ Ó¡É(ÜÄ8R™ª°ÂNé~o~Ñ/¾hVmoÞ¼)—ËI¶‰D"¸b¶dÉ’±±±'f=µ6ü1xpžcqJáДTlvƒ™ë¿¿¼UµmUÃ%”j Éo\·æ±ÛC›m‰¢‘ Gí°1@ã´Ñ.íì Ûvô´ÓDÛíŸ54åg¤Š » (”< ¹ãY/,°v˜¿¿óÝsäÆÿ§Á©ƒ7?¼ï€“BŒÇÇæ­Üˆ¬nä9ƒl#Èìc„»k„Q|ë²ÏN<ÌFÏ(2u¢Ò^F¶”ÉY€OJ³Ñ=rô#ï²ø™1‰¢÷Y–Ü€CG‘i5µ`¸TŒ“É© ‘¡ ùÿˆT6¤¬á S0‘Ô™G¦#E-2y‘ý(²A® rÁ¾æN#î‘ä¢jú4’ D)¹p‘Ë ôô!çÈZ(Jì_öD*˜Š£È AIË_¿~}~zäóDL€-,X]km® ¶mî:(êE# Ý#®¯_¹yp©vˆoÔlènÚ>l¬êÖt´ž ˜Ï©ê5×È|-@ƒ†bß!Ί|Íϰ.,Ía ‡"`[º›ëº´5]š=-µ~}µ¯¥¼[ ðP˜•v*û `રGÅ8é7”t`mQ€Ù§QúÔ@#}Àrºí½ú:¯®¶[»Í«)÷kŠš AmWó{Í®¥Šõ/½œ!Åù¢džÇἉø8œÆ”±Ž‘PÐdJø¯gñ·¬HÚSˆZj‘­Yßb®À'®ý ‡04R<‰B‘_žFÀÞÑsà1Ú¤Ú¯òîzǹýÍ·7ʪVäæ¾¸0G(IÇÈŒ$|J"Tà ¤È!Œ`úÉ1.Y@f¾‘¾bûëJuþ>‹\í*3Xå&—Ò Âm+nuËL=Jk·Òâ,ju)Mv¹Ñ*3“™Ø0,Q4â¯ï¤ÿ†âíþA£'îŽÿÙwºM©å ŠæQç‰MF£¡;a\ã)œ³k©Áª0¾:Km…ÕRl4霕æÃ²ÆYë2ñT‚ÇO•H@r`ÃHÃÅ”èÕœE{wï9îÇ÷pXO;ñ:èçÉá‡èC“‘»·ï~råÓ«]¾|é¯W.ßþúvxb2ŽÎ œä–çÅ!3 £££ð5 ˉ…KÁ¤~Hw8<ž8q‚ûããã3gÑ?¦´žº)ø¦0¤ÇÖz0nœŽ= ‡À)ØŸÎ~‘™ kA, (Žó¬Yst%ŠFh»•[{Ôi;ÚCFÚn¦öÅ@Ûm´QO;\´«³W¡ÈP qßADQüdþÊå+>8s6ÆÒñ¯¬Eà›Ó_Ýú&-+£ …òùâ,TSìÝÈ3ˆ<¬dÛ‘kôuœU4‰ï3sÝÈ3€\GçN#Ç’ÊkA`Ò1Uþ`ëú>m^oóæÍŸV4lê>$ïSË*EŸº´A‹g  Ž@,ñi”ý@‘¥ú]ËwlY\•÷rynvEîo«ó–í•mÒî®ñÌê¿Ä«Vö¶€9{-ôk6{UŽڒ€z”>íV_Ke « ð_âË5¶‰ìŠãWBBBŠdF£ÑŒÆ²%H!ì*Ë#!±ã‰ã„¦áѲ!!Mš‡ß‰3ã±ÇÇ8á%¼»í®úawµÒªV궈ªZTU»l¥]µ,å•8žžkCJ?€ŠÀ:ººž_ß{æœóÿí1|«r ŸegÜRyÆfˆ÷G{¢}ðŒ!f+?íć õ–öÚh,_ùN+Ј:e˜“€ð’T6EgQt&¢ âK«) * VÁRòUôÞUÓ>ÔYœ‡øÁ¡Èk§‘øáN¡¶¹ã}ýþâ­;òÖ®ÕfeZ@™" 88M¥ZY†!¡|ÒOÙcÞ9ieYµ<__Ñú~ÓPM\k—ùA?/5²‡—e£è7ƒ7%âC>£ÓVã ‡B¼,hôÀÝ” Aƒ¸P4â6ÙÿtùÊ,(Qú¯ŸýÅË;NèåpU(Rï¿ä=·@¸?½ð™`rÄ*½¯º¾—·È&·¯Ê.ë=#&¿¬÷… ƒ"oëÙ÷ÁîÂR.ƒÒÒœŽÖ¨I5qD§Ö°À' «¯¬<5»yófZ…ç‹ÃËùáßo‡G‡wíØ¥¡8ŽàÔ$â a“âÂb{ŸýŸß}ç‚:6—å·õIcóršœžž†¦( 'TŠ@`’N.áÉ|ù}Fsó–¾¢ü/œÌOþë´™$¼Ù¹'3©»|IefF™K“»5ûÝE5ý»Ú¼z«dp,E¼ÈD½;h½ õg„÷T ý"/÷ºGkƒþ ÷ˆ) lÜ*ç°q0À{#¾ä=evöÉŒòèÁÜlä¨ ×À ÎÓÖè݂ěùyöëO¿¾}ã__N=æx&">(ñ¢`tÃRQÓ+Ó‘Ï(ˆ¼Ïoò«ôíí8Pl.Ñ•äªrAxÀ« Ä#ø™eiìfPçk ]½¶ܸ™Ä‘|¨ßž@Þ¾±žâù02Á\”LšMµABû©æX:—;óî‰Yß:füŸVsîµÖœ²™ÆúëãÖýãpÅZ³ÕÇu‘ÚÁv®h)¡ âLƒ¦ ä™±i&H‚RÓ„†¢ó4+ËßÝÝýËÆ°µiÔiˆZM㮽‘>°òp·ÿ—e¡öëùÔÇ\O¹›#NÞÕUÚÒ¸î€^·>O“ŸMf²*– R›NÉ ­ì#Qt$­…¦OE¥0/ 'Þž#(8\A®ZJ® ŠW3[‹è=[ÈªÒ –ºÝ¨ÓŒ:jÑñtœG&ÔÛ€‡yZHoëKÁÐÛó ¦;lS¶±æö`í¡á†_Éûøë» Ý;ôm[Ê›Ê*·UT¬{oGþ†’œ5븥+)mŽŠË¡¸,ŠÍÄìNÆnvRQXYÌ„OiæÁ@_’Ñ’l¥Î"5ËÝvEIöÆùeÍ[êÚËØjzÜf››w¼Kâ=A^xÝ4®–Ä*OÀ$M¾0ï•ôNÁì±íž›»ÁvÅ=íýÅ Ëì€-ÉüPÄä®tKfÏWS_@U¿—øÆ[_}k9ùÍ7•ÇXŽdÿ“”ðý03i÷U»d£è®t…ê… q(°Ïõªû" ƒ~ƒ+ÀɦAo­ÍÎ÷õ>4—g‚'³)]6ˆ¯Š‡.\ i®æ8"Cµ©h㥠îß¿‹743‹‡dòá˜/ÿØ&Î3Ž¿R¤H–,^N§;Ýél+vH`M52"ˆPÆBD +PòɤP °ÖÒP JBˆãøçùü3NlœLš50(¬-šVVië¦Q´µÕÐþÙh)°²8¾=ïÚj*SQ“ÒWoÞ¼w¾»÷y<Ï÷óhLt{‹ @Ï¥ûÐHÎt „Ve‡(ØM¡¬ªêÊõk$¼dÕééiõA¶•‹o3úß¾hz4›‹cÐùr”ì \«3™®\YTR"€Fcž^.òØ{ð®ΆÂj¤ÿ¯¶WâŒA7T?uozúnvv2'Æ÷æT…³@¥woÞø¬ªr%¸§~@3meK&½²êëÍÊ=jPVýÒÌ3öL(‘ô–í«‹ E}>ËP‚‡">Wd)ˆ÷ƒµ°˜D¾÷ö}jjêÂoÞÅ6HXU†-@."Í}cÈ}…N!„~ø¡ê¬¤Pˆh·®ÂNIMhÅ^N/ Œ!%M¨&_‹¢ÆV#MCdõXW»…’ä§P EO>2{Èi!¦D†Q>5‚öDt?4Òù¢dFÛûãgPh4¿te ú<#OAp§–¬DΙÌô$r¢øYÔ›&s‰h„ó°qƒÃHA{»xl\ €óÒ"EË'â$õÈdrN”c(Ó÷¾£3ðµÐ{ýúõò%KÁ-’¤ctë÷o·%æLm¿©íïhvÔh:\—ìr°:wô;WïlÖó”Yà,Áâ (ˆ¢ àÑ„@r("rt ™‚›4¦ÈÎguÒbó ëÓ[BÀ$ÍI‡}ÐÑ8è°&;E6¦æÌþ¦ckŠ˜]´ æB¦“tÔ$»·um‰;š}íÏx¡r»­tC•qÙ"la)` °‘cŒˆ}5šM‘QaG&ZŠói,¼‰ÆeFéò¾ƒj,¡ÊŠêqªAEUú.íi/áÉ™æEøG‚×g²ZJ8wfÞíZ´ÿøo nšË9ÔZõRKYÓÚ…«Ë¥%… 5G @Çh6CGkAv*XN+ìƒ ¨ÐløŸÊÒÚp x!§D<lƒÍpEV¤I«Ús4{ÿ=Ï·ë9lÀ<‡á¡b^OóC.áà³ 8$˜°ôÖ\&=¹²¨¢öGk·®Ü¸{ý‹¶½žf‡§©ÛksÈ6@HÌè³)Q«2` öYåp­7\çƒ;}M¡°] ™o Ú\r³»ÛÞ~)ø—±‹ê'Ó Õ“÷¦Áu3jæÎìÄè782„í;êùä¯Ã5NÅæ Úz~“ˆzvöNf||JÓø{ãbg»lûüm®ñ\ƒŸnÃ/5Ý‘’­Gú[¼@0bØ.?ªJc/0 T`’ÕmðÅ‚ýö`Èêî­ëtÚ;ÏÚ½~GÓ²ÚŠ¢¥&J,Ä%À¹À´‰—^Ü×6™>æÜ¦B#'‚z’Í¥iˆó­+ÊÏïn»á¨Á(Q4Ù;ðÞ‰.îÞµ£tñ"^ˆÿ2`ºÈb~ç­·sÁ-§ìšvÌ%Š|Q¾6³ÚÅíÏn¯ùq3(‹¥VHÂÅ}‡T9”õû2^‡õeNµ§[öEjÖYšÂzFäŠ ‹þ}ã&AEØÍ9Í Á¨™]''îFÃaXi²ªÞ³bùTЫ<ªÇ¥F"*Ì?DzT¿SõÂ@Š~p°ýåêU…z R ‹$ßµk×NþÊð>ñ°ÙkãWÁrXS³@ñ‹v´uî;ƒüLjþ†FªÎŠÆ-Á4úyø‚E䤂%¨[&lA‰4røô?µ„By^‰k)E;_A‰ãDýýÀo"÷È#ÓH,M^à^BcÄfWEÈGƒ§;äŠÄP_š3-ähZ\Šä$Úø2'bÈïÐá !wõŸCÎ4| yúQôᨇE Œ{ ùby˪ .5Š\>¹/D½$¹ö±’äÍfþsësd¾ !"#._ø|¢û±cÆ7¥‘d׿!§½ÿPCª«f¨ D|çq¹ºmT=EÑEƒÄð!Y¹ùéí\ªBZÈ\µÎ™/óØ(®;Ž? i%K«ÑhµÚÕ¬ö¯”[1`T7j‚ƒãcgwvví@¡…H)„”£IŒ÷ÞÙcν¼ÞpËA‘©­’H‰¢(½@…zIQ› Qµ!ãk=ý½]@ý£H±j'}5z~~ûޛ߼ù}??µÆØ ?|r£ÿΖnT…Pîé)‹Þh–«ÕIêq˳ûÝßKzéì¨ód¸§ä[®ý3¯»ìeIŠÇYPÁë)ú† ^º8r”¼LÅ”BGéBmÑJ¨¿à4b‹¡áç)„¾úGõ{iÛ~O—§]ï3m[7¶>ÙfikÒë€#dB«' 3©ú´@\üt:hÀÃÖ1Œ"tÈ™P1Bèô¸~4‘¤†Òׂa´­|ŒX€8$ŒÃTmij5Ø:,k·´nÜÙñ]O—ý¥î¡Ïîð²#·/ÆúcLH`""Ã'é„b‹ö˜ìŒ%™ô@?O‡%š)N>Åuó•éh¥i$H¿>ž¸úîU̳uó[¸-85sØþæÔ9Pí0áóóQî=ÅI0\̘ÿô.¸ŒÿRýâÖç—²çw¸ÂȇÀ;ý—²oÂ4·U0õÃSïdèHnˆI F—ºO€7É•AÄ$†—i!I »ð–c%4''1œÈDB.ï}”éXg^k‚ÏÝ@‘p0ôÄj½–e3¼V“yuƒÆÒhYCÃím¿9|äf(¬Ê)UI«<¯ QUæªÉè¢S«ÆåqfÈDhI8!&“•ÀùíüÔ¹™é{“…lîp_ ©Ï9??WoÀíÀ+‡Ì&pS4¡™Ü³G2ªW“ÒB’S³1•÷«iñŽ ïh±Y à4$œ^9šXX\œž›Q—oŸy±–a>ÿç¿knßÔš m„æ¯ NM**Ãt("ÇVœFDnNŒV3©*’˜ªˆw’©Ã’Y¯>­¶›7oª53Z!€ü߯:Ý©µÏ±î¡b‚‡$6mÖjˆ5PXFé7‘te&Pjê‘™Br’hßh"t†ýêÍ[Ñä‹­ú¡nÍ· Ò %dN¨CÏÑH)¢ÔI$å1BÆ’CÊÅ%ÓH`V?‹i„?ijXü$’N£üEÄ_@á ês“–&ѸñUÏë­¤•$Ð1í‹T‹Ž"Ñö¢±ÓH™Bé‹fB%ü§tEúÈua¤4ÆWΠ°D4¶C©Ñ¤kÄIÛ`¬WuC¬³_óµxÿ™óÜÙ)x#MPÜêµ›†wî.¿qÌøŠrUB»*a67žö»*‘áè1ªÍGÔf±(ÊÖÒò«Ë—qUsz´ña®ÕVRY¬>泿ý}<;¾móö\C‹ I\$jMëöu{¤‘=§ã; £Ëµÿ'|/œô÷U|%¯½äðp–GNöžØ8îÊ¿”@ÿ‚tÅÏ–0™`D+åà@Ñ7 G—#ň.…åÀ*žñ +ô¼ðÚ>û±}ý¯ìzf÷@·§»»ÔÍöms>ßÕÛݾý©–εmëÛ:Ì&LU‡µ‘°X +¥o¶h-MdÓ–öMÍŸnÝ´¹µssËÆNÛz{GŸcýû=¼É½oûÞW{^>Ò{p„þqœ &j°!;1<¤ìÑ,Ï9¢‹“]1…§X>Eói»¥eP†AÐ4"8"¼3,°a("ºyÁ Ó‰ÍfS˜pÖ½d×^ª>¹ðKõ¸ÆõÙÙ»øð̪ӷ¦¯\ú퇓ïÿúÒGùø€Ju~~F­NCëêO^óÓÁü.ùƒñ_,b†¹wW¹ý§[Ò÷9¡'0Ag³½‰ô‹±Ï}€§‚‰gÕ ÜæPš‰‰N°Ô}bq%ö¾$— ¸Ä”KäiN°G$: !Í8øô |’sH"Í¥‡i(r{wu»×ÙÖyš,ï)!G5è½ÕØ¢k{zÒyU’U%©*²*$°o‚•+5IUJ€¥V•ô™ýûZM¤†ÔP”QGO´µÿþ굇¨¿ìùí?½²nO` ‚$ÃÒZ ¶™ÐzQNª‰ø|FVÅ8†(!‚•UÀˆÁÃÞ9|džÐh5³eë“]ðícªÕ¹åÚdµFJêƒJ2Ì‘Æ5ÉL5h~~è *ð8°p2Áñ\a‘”;|l>U{üx@M‰ŸÅ"]º€Oxé°±L*õp·ÿÏWݶj-unfvúÎÝÍ›º ?›Œz£†D,Šæ±S'§°ï?ʳgQì “@ûꨵ«ÙüA4i¨f 9A5ëL­ ”þñ-èÀQ”9‡ÄÊM¢°B¶ui¾õ4’s(yjÉ4"ELbLJÃ'ïK>ƒïÂ${ ɧÑÐ^×6ôÚ æÌzs±šÜ°ñy“ÑÃÈCJ‰”ž€]­î¥ÒHÆÞ~äºÀ*Q°ÐL>G½«ÖlhЙ j8ùwW®àã??£úù¾þ7;_­^»vmMÓcP'iµEôÝË|ß8f|UUBlÁ;\ðzN…èJÐ] u:v¤‚LÕ€ÿúõëÕzr¨Vk²øßâ!>â˜IpS»7ûö¥·†]¡³L6Áf€)µæ M½#û]ùe‹ÏÎ’¯¯œè/b ,ûè²o°8 Lâ(§‹#Ðö9€FŠ£î²Xe¨âƒ; È™?î*zw/îb€.úR`ΕÀs'–õ±?Sô3' Þü(,W[Ñ_G¦„潃'9½^k%ÉÕÙÔ™ÚíXoØ€ÀúEw@qEƧ0þ´'”tÀFSÎhÊOréAŒpwŠqK`DÞ)Ä:É9#¼›‹ÒA`ª`ÿ륣iõK|~fjVvãkq'DcÎÀÝ?Þ†ÏÀ÷ÔŸý›ørâ¸ãøH–,Y:é´ZV{ÚÓO~Äáa”T$†BZBU’ðˆíõ=L¬@RJúR(¡ÂùlŸ}¾×îíÞÛççÙ€©AMš¨ u"¤$DmU5‚>¥¶©ÚT (û^Óïì.ýTWvXýtÏÎÌþæ73¿ïg†_Ou©qÌô°þþì%-–ð›ûh!Øá×ähÁà %áÕWêg¢-ŒŸ¨;¬xB`6ÄG•T è!z,âŒOœr+CqtaKÐÆV¼÷rë·?ÿÀç,g3qìÈHVÏm³òóß9J3:¤šJµh1Á/MÆi"N• ¡>^Ò¢9…H1ýyw÷#Àw ]ƒíyêi\]ÛViÕóTþÎSŒÃ;77' VÎÌÕ:ìNÞÜ»óñ¼¦1‚RŠÑMj4‘ ±(MëK?<P}øÐ¦»$@ƒxéÌùó‹ì~¸ª4Rd¢y›FJóóó6I’‡]à#ûžbŽ1ÌÓ©+%ÖžF”0M%ØÚÅUšÔ¯Gú÷ï‘ì"{‡Eضek!÷vº_zô¿?,“#¼Æóâ›oÙ9‹C²ó *«“øBD{•(¯’ÔÄ]Õ9yº‰óäT¶Úû¢…“$ÏK5NÞ$Y¡¼Y’ªöË$”b£EΑÔ9òÕïÕ8įµH–]’:³bÑ/ø9¢Ï²Ñà%†LÓl(ý £#xJ[œ›LVÛük¶e§h1;9Q5ž%#oåõª'Ú«¶¶_/·m¯ÍÜX½sÑ“D;÷Oϰ)`²É<¨ùþ+’£GÕJëÆuë}ù2;Ʀ½_ÏOÞºØÔÔ$ð#C«Õ¾Þq$}¿c%ñŒøŽõB‘¡é{ÃÇLÎÁs¸ê!;^zó§Ô`g;yyK/ÇMrÅ|¹fyŸ—r…Kü¬es‹ƒãà'Ž®ÕÌ5[Ýáã«åÿÁLÿ¡ÑÐÀp`²Ï3ÙöØ=vâ™)k¶§Ý€ÌîÀXOW¦·mÒ×6öŠ<Á@Å=z’Áɘ¯žžôíCå”ô‚š®QßÁŒïÐh÷¾lï“ã¾½~y²´ƒÑ\ž±n™AŽƨfÌ{nÜÿüdï§ûjyÓF‹`±Õm¯ÛÞ€ºe@ Mu«š;ƒ°j²’tÅõöXÝŒ{€ÍK¨mAÀIJ„¥;BI÷`Ò= 3 $<ýDzAeC_Å„¡€ú”KrkC²K·‡™uÄP©»bŠŒ^1½3¾Ö42èõýó·W %z“²ûÂé¬ÚmUåÁao|¸->áNÄåÙþiHžhî_Ÿæ5O(!kzgô‡'3l㕘/~¼àï치~»ð&Í tá&½A¯Óñiý@DÙJ»5 HLW(+õsÌ¥ƒñ\ÐV Ôx¬#bX,woˌ煇ёŽäH[rÄ› ¹{w5í¨·8jYN²òœ¹µ¹ù÷ƒrE©:HãQÈ%Ucì_X,¤ L¢%h4DõUT…°¦y¢ïK"»m!Åá" Fc•C´ªù­ÄžÊ€eé¼rå 2˜ÓÌ‹;'˜½Ö] «8C‘D?'QÎ)Ñf¡DŠi}A 3éo;.šk$AªµØšyÔXèU£‘¼‘pŠŸ‹e?'¾ûÄcôÔ0 …¨¢"z9=°Ö4RÂ2é1¶š°èà‡þ“,ÔW­vÉöþ»ï±•2üì­V>³G–÷:›Yä›9ÎÒÜB”!’º@4(þ ѳD›!I”ÄäXEyš‰2Ô ´³Œ ”,9ì#Ê&G£À ØÕÛ¿LŽÙ è¨Np¨zÇSu±^¬iMõ&[õ–vZ1Ü͘«`•)’ø]‘ üV ÐxKµÆ×àÕË+ wŽAð­ÜEz ÆöTž.ý}iî¥éSÏÆÁ6à·T§R&´„;ºZþcX^Ïà²F0~Ä­ê.5Õª¦½ñ^—÷ûk»À›L6 —¾®‡6~28@µ8 õ1ñÒÕ» œÊE ¡éäM%ôŽ·]à9›Mâ¾¥qýµk×X\–èb~¥úRÉf…ürº+sÈB9›åY ,ÍŸ?ùkƒ]jD›µÖÌq;lâ§áAMAªŸî!Ðl«¢ X¤Œ·çßÁÉ7Òé}úÎ;ËJý¯ôeY—Q™U¼£–çŸiY·€ÐÅ¢¹„Fa(¯1ЈF“ ÒTšF‡Û6=,H¼S0ó<äÈZÁ¼òSüÿ¦|Ÿÿò‘TW['IVŽ3sRu×·H:Kô9&»š!¾‰sL—ñ«Ÿe¢œÌ2ÝGH¶>MÒ3$1A‚ Œˆ()ö6v¤LRÓäX7çh2KA”D“`®ßDžÿ:‰¥‰2³j4¥`ðù韨r& ÎZÁ±ó1qU=IÔ)¢¾FÔ92<Íoogœ±¦¶®fw ŒÌkl(LÊb„sž&ž4fÍìL%h ùæË5’Ãn6ƒm,œµ±¾îWW>¤ÅeѬ ‰ù{^+Ðl™I–Ÿ2—G0,²6¥Ê«›KK£€›Ëg}ƒ(Õó¢ˆcÌ™ù:áñ¯¹^löµŽûÿÍ}ùÀ¶QÝqüI‘*E²dNÖ鬳ìFMÚ¬,é(‚QµëPÙ ÐvIpâøOþ· B¡ëÂ*¶±üñߨ>ŸïÎÿÓı“ØIC“RZ!6Ó&¤ ФIcBLš´®Z'¥”6þ{û½»ÄM@)%Cåé§§wÏç÷~þù½ß÷óëL»-IGï´úδ³+ãiIŒ%Wò{0Ä"¯?û‹ZšØLSP£îرãÓ÷¯|Zþ*R¾²XPn¥’î*7ú†T>ÔÔ„1‚Ô¨únŠ8ä‰ËK±¯| &­é<ç»Î®²ÂNšÔCíÂ05íÅK—”äPÁeðùœðeü¿9(KP]xé<¤ŠdJ³ËA{4NŠŒ"ü¡>üEÂÛ6k!h›iFC’,Ë‚“‹‹‹+¥çÎké¿RéСC:5©¥àøÕ÷=ˆ¸$Öâ¨L#! ‘iÂBÌÏ£Ñ΢ài.Ý&¼ TÌç¡¿ôÏË?í?Ù¸½8„Ì#)u’ÒQõ»m®“½É‘¦1»)ë5N ·Ž‚ šN uOzÀ@(7šRŽæI—mÜÒrƒò*ó0ypÊu09lœptg|¶ñáfñdû©®Œ§5µáªjM;Û”RKÒñÝ#-P—Õh(’¦.¨ü|%w}&>Ëü©B#•ü£D‚/g¿R¡Ç‡]îáƒÇšZ´ LB¨«í5vÇí˜F¦@DÖ±¡¾ ÷íшL€ÐþÁ£òiQ¾y4›‚…‹X‚Qs0fá`íA0PI0y#Ÿ`ñÍ^®ÝÇš×mßÛ¶ÿhOˆÂ/]ÃüŠ/Ѥà1Ÿh‰t|ÍŽP37Õ•ôݿ˾çóHIšc3‘N.aGÍaÁê?Á’—Þ}íÏÉg€XÀ1+¨¢ ˆfʦ “¬‹ÁRóÌÁQkP$ÒÊÁ#\´Ø½Ãû¶î­ÓÖU«T ê(²i{ý^OÙ/+¸È=Ã’ÈËjί¥nXLÃb™óc1†ñ$ÌÙB(ÑyOãf(ACšÌxzß©[¥²µÚ*A_q{¡ƒ öï'Õ„–ft cÐÐÉ“”HHn—âYv)à+…Ö¦©› Á`Ô¾ÿI˜¦h5aw:WçØråîµ¶”™å<Óÿã$”~C’Õ¿=~ pYá†6œF¤˜ ±#Ë=µwI«UZjÉÜ·kÏM±XF¯ÊãÔJy|&þôÎ; øTµJ«fÐOœ(žEcó˜„ÓXë#“X|{ÀY¬=@åù3HX@ü‹(6üÑM?4”¡èŒ»Ì¦ûèyJ¤0W­ÇR>·~4"¯¼$NសA± ŠžEÜy$žCcIÔÝCÕÕêˆê ¡Þr?ê?AÖ×oªV3ÌCˆM㯇2Ø"3À½YLYáùU{ˆ3Ë–Eñ—ʪ:Ÿdôúz†"Ir‹†ùÑÁCŸ|| òÞ²z–¤[2¹ò‚R/,ÏÈ'«T¼Éó2“¿ôâ9ÐP¸ZB±­!¨z—Cz~Wãþ_}|lähšíšðXdìÊzA[{¦þÇ}ùÀ6qÝqüIHH‘,Y§Óédë,;VBšu”?a­©¬X‘؉ãü#£ ©eÝ ƒüõ¿³}¾³}vHpâ$ Jh‹&uR÷§ûÓë¨JÛ•M›´?l“F»n¨‚’¾}ß]HÙ4@ 0Ô>ýd½;¿»÷{¿{ï÷ýüü ïHV5ÐéɳÁÚž&[Å3 ¥õ[Ëš*7hv‡4¦»š3þí§Âþm™Îš¬Ï;â«Ívª2÷[=ÝÙîúlhj^²u½cóy+€ëüùó€:#J™¼öÊ«þžÞª]U¥«V;*86oÚ\_ç C?ýÉËüýò§£Çvzzj>æ´_¾þP•…“c‹×–ì;æsûvŽö`¥À°Ýƒ¾;:l È<Üz™é¦@òà8äÿC#ŠGNÔÂ$XÒŽC4«C°>w$]#¥  î¨ê–ÕZE­‹§¼‰E#i)õßþþ›Ú¬¾¦µŸ=ÿò1O8¹+xzÏñ>W ®JÍé¿}¬å¦frÓ î+;€"éj$ ¹C?ùaæp Î¯x"Ÿ¨UŠXT}Ì` HR‡üÂËÿ˜+ˆ·ER®˜RM§PêÃ1o°õk»‹,%f³%Ÿ Þ.0[—9þMhqKé()èZy{¡Ä¢PƒžRI½@åSçZZ x³]l ¿þ+åSSSóI힎ÞBå…“ˆ#ù‰–kmm{TÈ/¶9LSÀ±íŸ˜–Ãà(’¦ŠDM‘Fsªr·h¢òûNªBg« <\¼s‰TûÏŠïÚ‚¬_¿ö y… Ç[Jíü”š¢9D—‚Ÿ´s¿iDµ¤ú«gÛyÞ„Oãà­NÆòêëoÁ=| M‡.cíÚáßg¡Ñ@_§z×ÖÕ:9“Õb[ê\IºÃ¤ÒŒ¸†|tühPéhî¾ßêY•éjÉöVgiÇYºl™…·ƒf­¶…I Dõ¹ÉÉu_*CB@Ñ&X@H ›Õ¦wܤ±œÃîØº¥"ß½pÞ|0uªÉ­Z±‰¥çÝ?tg{wd»°Þ&=hwë?%H(åóM#‡À Âx­âãuºA”Ýaµ6¢º%Ð4T­–“U±E#Ç<2,êò´©ÚUœ4šë>þðJŸ'|Ì‘¶w%ëŰ·ûw?~ÇH…ø½øÒ…h½¿ÏðÆ.ºcÞd Æ—h”w$±+’iHá_ÉÕ-Õö`½@抗‹H#²'àr•˜ðF”fñÐÎgÜkvæYyÁa²¢aíæ¼5ó‹ßþ–&§5±WKIÓr2P$!ÍFC”.n©æŠ&…uQrèDE:—Š<-ÅŸ(´!O8Q¦2ì»o¾5}÷4òiIu#Ñ'qvzªõðaœÜ"àCž¹Ä!´nxüšÚOg†r²îIJÕ"A (ÞÊÿ¹dD“D-,iêqÏÊ’åËœáÆÇÇovãŽUáíÛ¼¾çªêAä –a–•iŠ¢%¥9)D\§ÜÒÏE35ñQopS!j5¹n¹™=t°ŽÝˆóÜÍèuÏë}PV3¹Ù©¹L]}ìÑ•ÅVk³ÛÍÌ’-nÒ#SQiÄ!¾£Tâã“”:`T”ǨˆSá>CÒDŠOê9ÎuŒ(ý$ž&r‚ˆY}™§)Ϩ§çiD£¿йÎèršvä3”[d >Kdg=cu04bÉ•þËPÏ…­ò?›±a~ofÚ÷ß{ïÙ¶6ÁbåXÖa³³f(B÷ •7ÛØ‡6–Vwíß;ô@³ÝÛ»ÜÃ>÷`OS¶·n £¦ïHãÉ@õ`gÃÀüë lên5‹í+6¬fØ<;Ë ãä¸"AÈç-³çKÀd+U­ßx:jÊwï¬êªéödŽÞoõÜ™éÚ3äß‘íðN®˜YÖ¬]?«Ÿ.# ï¼}¡bóçaÁfhX9†ƒ¡/ð‹·£:˜0,˜—N»cõWH’téÒ¥A×rss»›š‘X Ö& Û=êìqa±:Ô ÞFgà ü¨ö7žÑû:àÒó9¦  x]XöŠ’7 ÖúµÝa¯© D=þ˜'¨è3Nèt„½=xå7ÈvzÆÖ~žz w ©¶Øå_ÿB*vÆe-{°_ÜÙÓ_—P\¡XMK«Å¾9¶Ëw‹ÇêeÜVõ&=¢Ú¥ï¿ÁèEb®à"ú/¹±š Þ¬6H¯oÅÞ ÅëìfN@ª¡õ ¾°5Ÿ1ݸ隒Ðâ*ðCK%´h˜êc\¦(’NhJø–êW(´€C@/É8… .jj:årÛ@;‚#Ÿ³}ï`ûÔìõ»Õ#¡-$@ã ÏÌLƒP5ED!ÇÖ\† D݈I¢t éäL$ É·ö¿O¦ÇÓçvï)Xk.ä¬åååW¯^5æÒpâžž5üÿíû‘ m-y áµ½OÁÛœÔb!ê î6Ô·X–R#Û*Q’šMŒ]°•.ûðÊGssóòqsÍusÿ³Òæ´ëØa4Ö³3ñ†ÕìàYá <ÖZ@ž:Je7ö8CiDoŒ“ä8UjH3d:¡«? Hy‘ Ž’Oó¶G–T6’Á 9KÔ´.îúÔ‰“0^…û“‹F#Ê П ©³t–¸!tÆHd’ ²k×± j‰ü%žÝ$ 9EW¦ò÷ÿ›ûºmâ¼ã~R¤H§ÓétºÓY\"‡4À€–ð: ƒx$¼8¾øb(J¡¬¡´%¼8vÛ±c_Û ‰ã—8 $„•©êÖ•+¡±¾ 1 ›¶‰mR'¡Q /·ïã Ñ4-˜Âõèt>¿ÜsÏ=Ïïû¹9UÇ‹ÖTÍݰ•z»€^‚F:ú ±ÈŸ_˜bÉ¿j„X—_¸jìãÓØûTkßœÝÖ%쥒êUîÿ„^´Fþø^cÇІ¯´”û® aú柳þL_Ækß•—1Ô†£°ßÐÐ`Ôíùb1-¯ ‚Ý”ÖOùüe*’£}3ª ãânÐKg†Òº©ö+Tâc*ñåOQ‰ù)ù41@uŽïD2T{Ža¶”¢]¦BÃT¨œ½þ-†©0s½ÒDµvQÝ?Xæ8±Bñb61"Í•q2'Ë˨w=ä'¸Øz8H:Ö1LÅG¨Îˇp¢M ÿ€=Ä*™xz(ëÉr™Ë‰’@ŠÆº óï?ûen O^“ƪœ"ú䳆Zˆ31Y8þTÿÇßœ|ë2ÔÄI2o21<ÒD8FbÊÖ,Øu´îyS ±X•ñlKž{=Øá°”ˆ¼Ì ‡¤âßo:çZ³j5ØO"žçX¢Ž/­'êt{-)wU³šñ Þ¨}^kº š­ô¬Éºœ)7ÎõF2ÀKl /pg³(äalbâ·7?åDŠ71E%¼Èò‹¸e»–j¶Ä~Q}ñ×?º½qèËC¿Û;x§ºëƒµïu˜wâËW€-&–6óE/‰E¸à–®`il-6Ûoî~e±)£h`…sÆ›ööy«“Z@¯½}3jdg¦Åžj9Üëq¦]Uîí©³‡{}ßú%º9ödô˯ïI·nïi<Ðïy-‰P“^[º¥ã–rÎv5ýžå\{r-»2MJν7}Í–% ªÏzA2gÒE0™#­&å‚‘©®‘.G´ÃFªÆ”’_FÎÆl1­&ÒåŒãSM hª?æy«NY6îÚ²|Ãró’2~ž1KM”HX`³È1ì<¥D`ifUåò†G}ö&­Î×a õØc1%Ò®†´ÙÓÑL ŽÚCm5„ µåþçÁª{”øñèéãQ}t,?Šu¨­œÉ¾èþ`„-ZÜF¯0ªØØƒmÖ–Î:0/˜PàSD EíZ·ÖÔf¯ãµ¥KKY뢄çK9¬b²P%q^Ã4l^¯ýz‡FÚl_¤M3¡Ó›×ý&)̧"á§ù¼ùüøTêMGÞôŽ‘&Æ‘±‰|áiÅ ?Ë?ÔÇFF†c†åäˆ)®_¾ðžß¥wÅôVŸ{îþAuh“a1I0”U,yÔ ‰ejj-õñ'äÖæõIR]¿%›1Æ&&& dš¦Káb1QPœ'íGëiãÀ›%™ÅñÞÖJ-¨¯=<µ?[ã Àf„…møó„>Â̈́׾\Y‚Á£,1U±!2þŒ"ßõ×´©Œ)ôàÁ³Ù,Š¢ÌÐsåRj½…ê¤ÚîƒTw!ÜŸ[#øh€J R=Hð~*Ú?µß[HùÖb†Î!*q‘Š P± ³¦‘Ž!‰îªˆjn+zuÇ`5‹sÔ7¨`Œª›1-Æ-3M’ ñ [Ìó2S¾‘r…¨® ”†.ár„¼1LøŠàŠÂ¹H Ç#ÉA˜ ->D@ReåÙ–eJ‰á˜²…ò­›7ÈjÌçÿÍ礎Ž)Ü ý£>¬\´?“y±”0óáp¾DüÞöµU§^wvyöeüÏ›Jðƒ%×RÛçßß~Vª0 4 H¼tòĉñÑ1œÔØ¢ _ZP^`ž³ ÌåŠï\w Üx¸·à^·5í±e›‘–äY˜ä@®e¶4‚8Þ—ö@#‡“~š+–ОwZU Ó£‡ß,\dæ ¥B+bK·óÉ~R?ô©ýòíªKw6 ßÙzévõ¥[{/ÞØÕK¾í¹iÏ}²ËßWéh–nšËÈ¥¬T"Ðæé"f¡\1ß$£¾$ˆ8Ùþ„£dhvdšê²ØwÏÔO|Méq9“gí}žªl“%Õ»zù1©s¤Ü}£O6^éµdΩY×”»®×¯ô6×f|ºº¤ûxÚ8á:Øãy-P»Ý‡rAµÛ6Ôeñ2°»»ÏØ · o•¬Ç–ób«dšk’3êh¶4V‚]N áØnõ!d‡¤dÂ8¯†Û¬^]Ó©š“Õ¯TUJËæs2-–0’ÌÀ¼‰æ‘I‚p²d‚C0…` Z–æa“j-o.]÷ÎŽÇD"V§½=^§µ¿àèGkW|šˆ«\Ú?¹/ר(®+Ž_ )’¥•V£Ñh4£Yí®åb7)ÄA (±¿Ö»^¯ (4SÅ1ØÆû~ÍìËÏ]¿í5^â Pp•i ”„Ô@ ¥QQÕ~ˆBj¼^{§çîØÒÉ­ý!½º²f®ÖwÎ=÷œóÿGaÝywÔi4öXqð­ÁÊ­÷nö v­i¾í ~‘°D"°Í_döèö¬¶"‹Kçt.Acõå[ÌE5•›÷/'S—0)àRš„ÒB¦§.ÍÎÊÂMÉ-¡èЃè󊆇9SC§MôØE—mø×Ç’)˜DpõŠŸ&jE|šIfšYñ ‘áURÜM D¡ëŠ?œŒ6w¶)N ÛÑ\*Íé_Xú¥ÕóüØDŸ0-볚^@»m¢Û&úîY¬™,¤8ÌÆäðï.ŧD(›¤ÿ4$Y—ìŸ>×LÁ>~è0d¨Ð*YRSÙŒ"Ó_OÐÈaùO¯]t˜&`-!n³N:`Åß’Ÿ½ÜÄÀŸ¿úØ<þeýèF4q:ͺ.\€O¦Õr†¤h5*?ŒÈ—d÷Üìi¤S­'Á!ÈÄ[ mÈjAþ^BÎòô @¹ú‘óÙ´3Û ›3x#‰¯ô¢*;Ê-[[Œ¿ÕØFp?âZLrä’uèõCèW•I×Q´B%ãž[“‹„fä;ƒšÏ &8ÂF¾ 'x'W€Á€(|âèކ¤Y;Ñþ_B¡õ„žäS½$ùýsC¸‹Å$'?NU)àyòQô\däª:$䓌HbS¸•Û7èëïm·—tÙ¶tœÚÜ9k•Ç4ÒZSÜZÿ³z‚#Õ,–§ÌW^}Â’¸”ƒ0FGG÷íÜ ­.D;ta "Êeª¬Ò\CãÉ]M°./x²¨Ã·®¹j®h¤0tÂ¬Í Ö¾Þf#9BAQJ¥R““'>ŠækhR¦¦8.yU‰½ßÐ÷qöÀ›ú>_ßûÇuá[Ã7·„oäœþÃÖþO×öß_Ýw/3|gÝé;Û"·µ=×µ—òç3òö&‘) Å)IœË É*)V‰óšæÒ’Ë ý&8ZqðDQèó,;Uà7úÐÉüP üËÁþ¯£p¹Ñɨ8Ÿz?Ô´Õ¶V•`=¶át-§ü#wÇþöÕ·÷?¾ûYäÊGÍﵿÝu¨ÑZrìl:¥k®ðØÖ](ð ÖéZkaàú`¥ mÖþœ-¸´6`/0‰ÎѤÇRÈk¬ ¥¼ÛPo-®Þ½ZŸÉe$JØTÎ*R©¦ñd)O- E‘ ˜€J 7“ [&ñŒé:…P¬`Ów¾ZbÓ½z—WãpçÏ»ô >µÖ‰ùJc²jÆ¿Md¾¸øOñÖ7BG%F§Æä׺æÝ­ PSŸß^ ):B‘NÖû·öÝX¾¶*<²¦dÓé;Ù§ïní¿¾‘¾žùlMÿí¬þ[Û÷5}·u=#šÞ‘má‘­áøA™çÝÕ[  I@‡ÁÒÜBZ ;¿°>ó@È^ÜnŠ)ë¨+ =ó\šꂖã%ÝõùÁZCsý•¿ßÃõ+= ”Ü)páù›WC ‚oÁnyí&p”¾ÓXÑa¼z;wÿŠ#ô1qêbìæ7÷׆jó<Çs»Nw[ Zjö´š~´î Ôík·išÿŒóM#^ƒÓQhñZ±h–º:siÎŽtEz ¥ð`䤒£IR¦àH nƒd@W¾´²¼¼Üçó ]¾|ùÓ+Ÿ\¾|ù÷Ã0;Û;v”–¥/K#äàp¢HE0iÔ¢ŸoÜcÕÔKæ[ýs Ø*4ÐÛ,…Õƒ¿¿ýå»kg‡½œÆ‚AkqåÝfŸö™þ™C (1„èáRìnÅ¡³ô| ÐÕ”ï YMšjÃÚâT:UAË) u"Áñ4Yg6A”Aºò~à4ôS,K}~ä¨á”Ç!ºæFÜ¢Ý,ú½¢ËÓ»kËÈp‰4•Ÿ›'Õ1\ʦÇSR(µZ’Žàò‡¼ˆ\VVUQ$B±Ð $òÝ//ýÒjÆ(âõŠæz‘w`eçùYÛévÆ=NQpà žoìîL|E«8µBNw7µƒ©Àñ)‚ú÷1666cót5|8ú]EÕ€ÅPÌ.…cw¾˜6î÷áoIS2ã{¯ÿóŒ»xL;.딀oaÜÉ­|INÊ8Alƒ[ˆK"òÿD# ÆbO†Ðƒ^IÏH’%©izÉë³Qcò "ÏÀ¬iÄÓÜý¨ĺ[‘ÿ jèB+6,”) .i ÈìCž0†–¦n,ësE#|â{/‚¼oc_Âx[+zëx A-’'-(ú÷uÓÔ¹ÇüILLHš4''''çä4m /êÝl®ó2ߦ#Ñ›ˆÐJ¥€ :‡à¦›îNÈK×Rú^ÚòN¡å¥¥Âtn7óÞÝ×Ì{ç¼7ê•waÛÝÜuΩÓ] ´çþžV˜Ù 7!Ö<9)§åœç9}žß÷óä!'¸å7HÛ€j΢Ì|’@GEo ú3È~; €ÌÀØÃøŠH€%¶0Q0HzðŸ0^‡+¬?*8ÊI×”(Žæ¤d”˜ýØÔd€ÿÉ‚ñþ.¬PIŠ Ôs$½’Ë;qXÕXù1$÷¨3Û5JWyvcÉ!÷‚S>£µ,ߥÉÓŸŒb¡®q¤@˜¸é¹éÐL €gòÿîe¦‚xzÿðýz­ŽÑ '&i1A%–I¶PnÐtëÒK•핵‹¨ñWE¶«jå YG’Agd¤‹i±” chnÓž¢dÏ?6ž½ÞHñ÷ïðö§¶÷ïòôÉ;0?À$Iþïe¹ïj–ïZ®·?»«_Ñy ¾¶­»£ïúîs£r÷²Ì+¶f ì.Ä%ÈöV縴ù^}zCɾv­ª¥|^4ïëÒÂ×^n«nûÛùq>üÜ‚üÍ©û¸ÖM‡FïßÎkÏ”)ÛÊSÝ0®ÒL÷;û5]ûw2ÇGP£gA>4ÂË”òÙ÷_›ÎwÂ}9û›µ=WþôÅøíë÷¾¾øíHé™&•K½Ô±dV×dpdï1Ú”:{®I­,ß›ÅÐ,\„c8–b þ`¿M±›ù+}µá·çwç»»sedæ1jŸl¸°ßºùMc}ƒŠbÄ$A$$·–‘Ê8éÈ1ÙÒ–<ýë•Õ` HˆþZ•Á®ª2çi>nû£.GmÍ5˜ÚUMÛ3ÃØ²¿Æ ¬XêþDø ú-"ÜTV³ÂP¯²8³ôG$Ænˆá`Ö E k e²ÕŸ|r!R1` iôUðËÆQp .¿ù8kd±(b3Ï8̼ɀãÕQ{WoØM³4ÁÑŒˆãF‡G“ð³ûY¨$Onmæª ÎL>TtüI°Ö`‹C‘éϬ¹¡+ŸE4ÖaŠ@¸Û¬à Œ“kÄÄ;m|ƒ3h¨âvÞj¨9”rohH‰(:Z²rpxGötÓhž×|‚op•ÿÏÃämIì(F '„Ù²§n™Ì¼ÝÊ[ªð}#íIŠ,žFxk ¾šÕÈ›ªø[S†²IÄŠàùC”\½|e.Ghý\^á9óxlÙ›?|_ã3b:JHsèH rt"ƒkÁix5ô¢£•Q‰ r}2JÍB%UHk]–® 91E°Ë² ‘³9Û‘­=Œ‡EÒˆÐ Ñørô"c7f ¸¨®x‡¦c… 2ÈâBfø¾½Ë·*9š|¢‚ãÈ ð𣖈:€Ií$u½aŸøñ›ˆ=ÀQ¶0Qà¼Å‡µV×…ÌdðaÏk„¢•IÆÓRŠlp‡ ‹îݹ©Õ @xΣC#«c㡦ˆ9NH éÕâLõë…ÍÕù­jUã)ˆ'•[½§MíÑäy4™Í¥ zOe^SåÖƒÊð.Љå$Å'Og·5‹ÎMœ)’P(0Ïÿõã ëŸ]‡{Îp"ŠÂU‘!dIò '{ô»[Ê€I‹¥ˆo ķҥݜžÄ± ËqR ž ÍŠbH†“¬yÅó— §‡žíýWZ砢늲»?Ë7 êÌðgt¥xG·u åuɽ}/t]{Þ{-ñôprïõ”Óc©¾ëÛ{}}IgƶúGRÝ—ÖT’’èz9®æ,õôKÏj®‚Ïl«”7•‚‹æëçÞ5 \Õ¤6œë¸3õ‹‚ Ýüò\ß0Àâ>(lÑe¹Ê2ÝéîJU[™Ê£)h3ôÝúŠÇ“äâÑÑï¾xÀO>ägðb›„™0óåÄí¢&ÊSµ¿¶â÷}gpé Þç'ªÞo;Ð^½Ô1+«js,5J=€Ä‘k*‘ÿZžº‚ˆ‹fXVH0B‚%(Y¼¬´¸â›·a ‘Ù;W4Âu#4[O~,&‘7ƒ#ý«VÇS ʔ٭±›«3+!Ž—:ý›TFën]M¶Ùši‚ÑÕe­*­)Gkϲ:”çnk½k>²¨´ælõR÷'2d0 ´E0“r,u{ôV•îí´7“eÛ£I),U{<Š"„àæ#EîÜyl¼ >Úí6X•bX ¤ çåý¼Ý6c5,bFˆÀh5v{ZŠˆˆYDQXp:œþéF&’‘X‡_†´9„Ìádq4qŽw6üùØO³¤” ŠÐÛíöÈ*{ÌÿÙåö3xÍÉŽ@€Ÿý] Ö˜NU’4ÉŽæ„qëPE5²y¬@¹™%&¸8 ±\¶½u ™ËrsÉÅ' ²jë†dë\4Ô$½ªíA?²Â™0!çÁäª$@†ÇÁC¨© Ù;Ñþ†Œ}Ñt *1¢Ú3¨Þ´&¤nÂ×Á éÄÿä¨8¡«^ |}?¾>Î;z¾Õ½‹,~T{µ¼‹Þ.æd›–q±°­€ÛBb玔ÏÇÆ";Ǭ[›w%aë d~!Ú]þêvƒÂ£ÛëÆ’ïÖ䶪•¥‘è—{æMÉy›»¼°E¿eî" ¥ŒèÒÅOgÂ!8ÄÇé`0®pàì|˜ût||\£ÑÀ³’Ò”*ì‘ØU¢Ô#y¯¹ôyÍ ïϦó à'UB²dÉ:N§;…m%¯%4 ªM³5íÄH€@ ƒ1N !K–fí-SB 6øû|þ8ãll>ÂGAéViS¢­Ê¦t©–,@>”6S¤LÊ¢|'€±ýîymª­©”þééÕqÜÉï½÷ÜsÏï÷ìéq6v·ìî±JøôöìS|~&þŽ'†*ú:v1_9O&’ÑÜ/ÂŽÊ®–¥¶¸"j­!£`Õ™¶å•,g4®j†¡eò¯‰.7¤+¤Æ –Öt§ææ‹a”ÉxâYUIft oÆI’è‹ñÓ O+(™ŠáVSš÷ ›<†Ž¥¦W  ï1¸=zÁ§s‡ôîpCÀQiöé=bµ3d”:õ¢¿K‚WgóêíK½Qg‡õ€ŠÀqFE`UÖŽÚƒ† ÚµÊU …˜ƒ%“­Tª~¸áµÓýδdjÞFÒ:uòtN4˳ õë¢M(àK‰.äq- ò¸‘$Ív`âÍÖ–jÍP´Z¥ºqõ¬¿þ¹x†èZ²p|ûöíââÍ ÍôZ´R¡Ð¯_sK°x8¬Hò¥`Ápžô™€ÿeÖép»ŽÔ)avû„”Ÿ9múx#%Wá*1Ê.X±îïûrýw…߯Âyé GVæä‚ìA#¦¡9µ\Þ\\tôÌ'àÅú”‘ù¤mdqUÛˆýq—ã‘O2äÑ,ØŸ)--] uf[ˆÿ÷o[Ð-øóàÞÒ7Þ Y~Í©H†ØXLéa £ª4 Fq®šS+y’ÎæsˆÃQBðËrW.ÏRMÁßÁßÎE³” ¾B BpfˆðÀâû _?v=p,•¥¡i¥r­|UÏÒZ¦!åÄ–rBì%ºŽÎN2¯„¨>˜ª7ýD£X9@?¤1,$ "p &ïÊâ $BŸbWñ a)2;ù¯CnÇ {ø¤×¯Ë›š˜€´omm…˦Y¯âîÛ×ã*ín{;f)Š™¶õ¶UEL†pkSÔº½§½ªèöÂô¯ 7Ðc§–Ãó±Ë™lŽdàý΃¤=$£"ÐÒdf¡ßI¥ÓÓ¸ú¥ _2‡\8sæ‹‚õXŠSÁ€þ–”+TTÎ–× ö‹e#5=-µÝ-[¢mú˜}Wó‡8" ·£(en6'£¨jq¬xôëwG¯VÇÎ6 _܇2ù%ƦþüV´µ1æ<{ëz=Q²©ÓRù|;Z,>‚u΀ޱwSS½Š!i:›¢¦ìÝŠ¯¯]ƒ¾1æâÉé$=FÏИácz¤…$™X Ò7ñ„f±ÇX,m G*yF%gµù[mu¦¥¦°Ú&E[µÍSïõ× *§ø®5Tçuë®Z›³Æ*Ô€„¸àR°ÚÒ‰K½P‘Œ€–€ë= "‡ÞÙ¿‚ÍU’  †•)U$MÉ_]³.à”’Øþ°dÂ;ÇÂcîÞ}†ã<åM^1moG@áE´À:Ìæ¤$@¼ ùü¿,,$y1ž×VTbv§…sžÉM-¨HIIÉhF¥Ÿa(ž«È_½Ã†ÅÃcCñÓ½H‘à„›b¡z  %ÒÞ|¾¤ß=p"Ñ™”¤Á]Äî¤²Õ †g8_,ü]àK¡›7þ©×ÕR$™)×ðË*){$ß‹ü.næ÷#÷[lŽÁ¬+þGÜÈnF¡.Wv%EjhFÁ³ F—/_΄:üÌ~!øßÛ-•H%æÎŒçð*%Ø:—Åó–8úa ¯GÏ!àþñçZs„ÐÕèy^I˜Ý€rÙ¦†eð–W¿IìÝ›¥âWS$aØMûg”ðõž4ëƒz ˜|˜pëŸ?ÿ‹/h¨B„Øþó¬eù¼‚Éå(ž—©)9ToY~!ቾÂ&×¼£æÈJþÊO6®#D÷g„këX 8F(Jû±ŠH0í!Œâ }Þ}³Þ.W¨ò(¢É±dÖ:–êt{„çÏ3åûŒ?Ù€Sº¨¥!Ò¾X”ß6Ðn4Ès”º†ÙQg„î%r÷áÇ­-&(Dð‘‚(@¿šlÕ¦&í^Éܵ×öY¯[ÃzÛŒÝÍàNúh»>b†±£×ª‹˜+ºMú~Ûsm¤·ã½00ÔR³4vw€`Q$iènÔ”‚[_¬˜*:_>|¶lø²®ÿbùð‹­C2ÛF.eþ->6¹e`‚Ôð”|%M*i^+6W´¿²è¢¦¢°ÙÐçØÞÕ²3l2ö˜ô±ÖÊ£cÛ¢f×ç#wSO @ û×ôý]ݶ2xÒ®¶'hæ)ŠÃÉñKÿxï˜`è:\ƒ·iÚÑm¶<Ƙ˜Añá‰S˜©(ÖVÛc;s*Ãô§‹0„Ú®þûV<]Óï<½. “,µ€‡tÖBU{{ýGk•¹©ò()€XAér™˜Þ¾£úe.ýO¿–)õ°¿ýà.ÀLAÒ6'W‘{HÀ­·{êBCÔ»¼unØ{ ØDc»½Úä¯w{õ‚W/ ~± ³{©ma±F¤Vóñêí¢Ñêзz ¶@½[ÔZÅZTë•´n É`ÙSÜX°:âi–Âßϰ<‹‰ÿ«ýû=x¸ðÿß@zÖ°SMó2ŠTñ´³² uú‘`CÀ¥#.¹æ<ävaЋÞÙ—¡¤¹óz#ˆ¥)›%Ÿz%—…„22'ÿxšHwü¦“i'Ò=^õƒ{wËŠ U¸X€ì³jRÖZôÖvòûÏ;ÏîA¹ .³  Ò&#¸’ØÜnÎà A˜1¬`&ƒ»wn\–M“MÒÙ4áÒ뾺öV;Ð:ÈÊ9œ¯Óݽ~óðƒÜ¸¯ûØ&Î;à)R¤“¬G'ët§;ùEyš6mÚU‰V1^!ÁŽcCB*D×µ …Ävâwûîüî˜Ø1y_-{A‚UüÁ*ª•16X·Q„(ê:ª1 ¿Ü~3U{QXƒ¨*a=±¹{Þî¹çûyü¢cx(pl„`¸¸»}ÎãPÂraa*À$¤ÿPF|’½yÀhÊï› ‹3QǬÝ6hÚ±£öÅžoo:uàÀy`-ç|ŒT¼%$fazcar|…9ñ$E¨“€JòAQD(ë|OO9ô^àõj˜CÆ.–¾s? 8åÈi(ßÛÕ GTž0Ï— <ÚïCbŧQ`%§#ƒâÇ‘<¶húC|°B kÔ,zû(:ñ’o®¬¤*aGÂL)¼}è{‡QpŦ‹ê˜"CÊ“¬Aòx'Oˆ"P@P¡1”GÉ4Ú×Uúj#ækXU9®¬E¦·‘GÞãe/m i¼3eZ}I} z£ ¢È4’&Qtù3¤è›ó`OG¦¿sı=vhQ¤û-€”µ9Ó¿{ÈYUW­a`[à5­Wãªuí-mœüíæ© õ“0Œÿñ14òH¾6Œ_ÔßÔqœžVa^õ–©>Ùýú y­§%ã2'{;2¶-IPŠÍ2ælNôt¥Ÿ<ø+9±·²ß]»räìÏÜ—òÝøüÓ,ùU¹~ÿ¶iÐÞ™²µŒôµ uƒFäŸÍ’ÿ*äæç.ýùÊà™ãÒé‰Cc¡¡3'nÞ»­äITßWržŸŽï¶ï:2ðùƒ»9ò*×ÿöܾ}èðW­‘°Ñ1D‹ÛRgà)µVËcL½òòª/(ò+áÿî¹,dÒ¿›$Ÿ½‘)Ø»÷Meõ4³ókZb–@Ôì›EÙ蓌ޠÉ2zd£[69¢dp… ÞX[.Kì’<-¶¯_²À(bíØN¿ØæôD£+j“æü´x}g¯ñ‡MÏ7.Ã啬–Ã4¼M°`•Êljûèòe‚·Ü£^S˜ÉsçÎÁóÕòZ–¢êÔÔ÷CVÎHJ’"rÓ_€¼ƒÔ†¤[júËÅ $±è#ñKw%Ñß´©”V•ó¼NE?SQuçÞ=²táe€¬È8=˜›ƒ§|óÓÏZ6mæ0fÔ€ZV«R977üh*nÜ…Xd©ýÉûAYaÅåȇ%b¤x4çw Üý^%à!ý$8ñÉæýn%ÌJp½¨È‘÷÷íÿV…s4+ð‚ŠC„†õã¢|öäé“Çœ½¶­õ [ OaŒa:yšW•í®©9ð0¡H$D²@hÂ͉€¢hš zI[0À`ð¦Ç³ýY])WÊkØ 5Ùî­[·ÜñAÿÝä¸&Áë‚Þæ=äIä,8("úò @P¥ì¢Ü’ý†åú*x1 ¼µ~󬲨NŸîPä~nn¾8üúµë@±óÒä‘‘<…ÓHA‘#/ôè¢)GÎ4jî,åyªº½¾Y¨©AÀŒF«Ö”•–4‰7À!Þ#Å '4ŽÄQ÷’È(ŠŒ¡`æ‰i: f3Eíd8ˆäŠ !o2(q9â\uÍ2LQUzqk00[Vù2zëp‘"(y‰à1À Øfœt’T~ ÉÇo÷]ä–Ñž]´®œb¹r,0P­€á uœÅÝÕ1ìjIõµŽØ ©žÖTϓ҈!e«Û¾Ž¡U¹@ˆ3§Þ#»ÇÒ×d9ö8² Øì^ &¡Õ€øGÅ⺦u¯y»:öéþæ!kS¢»cÔi¶›’=°æd·9ÖõQÇbý4¦í 1÷ïN»ÖZY¢04A¯ê<Ô8}eýÔ¥ÆýfÃøïS?žFþ·l°¥4ŒV§¦yA¨5­Ju¦ÝM ˜ÿÀ!éÏQëÆáÃ#öm “dÿµO®’s ìÁsYâºBá¡’{ änÌÞ%ñQ D¹«ä;@#Í©nÓ¨}OÆ5vîÔ,Ì:ÌûC¸«0S˜ƒë …ùâ‘RQÈ{–ûÓ?þòFÒeJ[÷¤\3 9fÂå—n|¼cȺûª5B$`ö{¿ÁÖèX­š……©þðƒýìì¬ò/c—Á£ÖIῸ’ÍÂ0•"E`”Ù÷N¬äy-ÆÕ ·öÙÚá¶Pl›7fÃ& JÔ€¯ð£lö ΄%7øbFO¼Íë7XE³ãkgÆ—,ÞV;8„˜¤Ul ÇÁˆAˆmÖþ¶C†•ÍUìr–Öèm«-§˜ïUu+qê4YÙìBì<~…ìCXm-#¯RëY¾\+4×%‰™ì'Áð'¹&’_–¬‘b=P såâKÄn:úŸ«Ôèi\A³ fš6lËߺ¯< =É“£+éî…_ýºVW¥Ãä¨BóŒ–.³6lºår+áˆð‘ a)+.¹?3Qˆo‡’ÏyíŠè†Ñ= Ĩâ÷'žÛ~»2”Pœ®Bxà"Ê¡ ]]æž0Å Ãs@FÃCÁj5öȑ¸gu4ë4Íá936ßñ¸QTÂ2 „˜´‹<“%¢ â=†+/¹‰ÜðUn]^+ÐTKU’Ôൂ^C«·Õ¬8ß×£ˆ!Eç-2Ô#$w>D“Òx¤"iÄ¢m΂ëoh¨X½šYFs5Ë«Ï_¼ bé;÷Óð¼ ûÎ|>wíêÕ ^«¡afX81•4šQè(!Ddši …×$5dtdªd‹™gt[¡W¯ÐRZ=£”4[W Ù­AjM ýJ=¡Bd …§HýP‚#¤­'¨¨0 ÕN"ï(aï'„ޣĻ(üäŽSÕ«YžÔMÑ%Ííh_/µv½ –0£bjW£`%Æ8‰ÂÇɸ@e‘É¢— L‘,Ö®4‰†ÞAÁ²ÚiáyÝ?É/Ø(Ž3ŽT É’¥ÕjµZíiWw>Ùl (H]âeÀÁ6‡ÏâæÑEi0¶Ïö}ïÝÞù6Üùl c×i‹š6´ i«”BS%„JPTÏÔøÎ¾ÝþçŽP©ªiˆÚª«Ñjv´3ûÍ·ó}ÿßÇr޳!è ñÚP³5Ú),‹í‡ô”÷4>-ÙÒãÌ[0CâØ¤^¸qí:ª˜±Ô¿.oÿé522’>úOO½[²f-˜1ldù©F Ú„Å5–š@sMÔe‰7­ï¶eîà«ªÞæêÞæ—cõ¡k´ZŒ)Ðß u;Y‘•XÌc„â}ê²Áß‚FÖ?·èÈù’ã—ž˜FŠžÏt2ã«:OrŒQÈfQœ¶xFew}e«,ÖR£4š*>¸¯ìˆÃÚÛºµ³eðýŸd*Aèë_AéèÐáÌäØ(ˆ”ž tñ™®·|÷h¤¢×V«ßr°ùÇ—~ýP’Z*IISð8–H¤3Œv3y7úÞ |±<ÚPwSU×1åç?°Æ( ~Ñ4ÒaUÝZ_/yÕ nE˜sìòâÿ€™>†€%9$À´G34’Ì0 v5>>Íd6ò"¾"òâòÙK‹òž›WP4{Ú³hè,È/Z=oUÍš†²:—µ9På T´©ë[»ª}êÄöÿ·µŽMí )àG´*.WÕr·ZéöT¶n_²i¾4ÓÌÉ<Ïs‡³¹¯æÏQï½;w)ͦcN{ Ф=9þ 9zíÚµS °ŒÁ`0ó\Ia¡æi×=nX¢¸!£zPMzìTà&M#¸{4è#ú¡ în×Õ€ ½õ]³Ø,Ö(2‚ddM–ën\ÿ4¡%îèÉ÷nÛêg°#(=v(slGÉÊ[TÇ;t§C´§:Ò‹+¾IÛƒY)º§íž_©[±fTÍ™óÃÝ{Ń +áµé!Ð*@%Hº[t·]ïÜt¹«Š x00ò( >Cúåá7ÈtÙ„`A ›Ë³M‹—üÉÖŒxô ¢ÁôÓið‡PÏ€ôyç{ï\úðÊ­?éc÷õÔh&T4ýŽ>väooì²UÄÁ–5Û×/C’A+¸ŸýýÅn~ò—äÈ]=uGOÝÒ´÷®^POö[»êK{)ÿì¿øSXðíO[ãvËÄ÷ÔhÄâu[•Ï[dÆ $£Q ‡Ãéß­eþ>þ{*C¿´LÓÒ‡DË<_пpþ\Àë«Z_U?‹E j01’ 4+sJRg‡Ï’DNf9T=f>/Ë+ÊùÊž-­íÖ6دZ}ÿqÌøwiÄÒ´ø"ÔÀzEÙÐæª¶o_þõ"ãg>Ge¤ÍJá•M[®^ù$ã´ñd2“ráðÇ{@<š8>ü&# J‘ÄP]h¾ÒæÒÃݺ‹Š~ÒÖ uO^ý}š×£U š›QÞLóúK_”%ü*“LHb(Cª,¥+ËÖH87PyÔfY¹g9¶oëÍãÔ»ÂTÙaCÈ—‚=*d}ò4¢´R±v9Gµ4ϘÍ2B^>ËÊSEnßâEw|iVQÛèkЇ®F)Hуí) †CÔÐÕ¦¶]Ë—™$#“e’9ƒ‘„lƒÀʳjšä.^q¥Á¦»t0p®Ã{ˆ"Á@š=\tM:®h 5Ÿ‡ÒHP¡NVÔ„Ï·æ8DîÙµMSÚ½kKDŽ³Ì½¦04ÀÏã×ÒEºWÕ~]qQŸ„ºê§+ÓÕÜt¤ƒ7ì¶_žƒMò,g”MeVä z6Æþ_iÇÖ“4÷&R(µÚ]µdIäžrf“:OZÐûˆ?žÖ÷ T¸k˜DS™î|‹Ô;³MRËdÏÿiö%JbÃdã.¦ÀŒ82¨Å¬¬ÒmÄ®’Î~Ê!ž!â"‘a*ôO‹F@ƒà1ÊᇠAGŽfÍ]‚Êr'ÉdÓ.ùQŽP3Þh0s’i”ͤrÙá!~Ò!‘½Ä{8L$2HBG&ü®{t Ï!Ê?]'ˆ»3{ÙzWdc0^VÖ”e×n Û6ö9Jc°§ƒ"T•®i/8vqÕ±ßXŽ[ÑaÕ±Ÿ  =ßÖϰ’Är8Ôs×-¬ì®¯8@ ªì@#hÄm¬êµƒöÄ=ï_½0šƒ+´ŸýîÜÖƒm–hKU¯³2ܸ-êìúÁà›gßMÇ ¥ˆ3ühK¬µ<ÚPÑã¨í´_}pÒr/™¸pûúΰsc¤ÓkºÒ . 6nê¶—ÇêKÑ_ßòý^ªã)}D׿}æTeŒúEÓHh½ê­v.š¾µ˜šÂ²¿:sVÏHcA3GP:áöH¥ÒøAû£#Μþå¯+×d’E˜`”LŸÛ…'ÁÈӞ̳9Ö$R]À£IÀ›,ϱР™‘_˜þ7îë>¶‰óŽø#UŠÉÒét:Î:Ëv’ÂËXhP…P ¡MLœ„$$@  ´ƒ òê8ñ»Ïw~É‹; /‰!ÚMZ‹J§½°ªhÿìѲÑJL+ˆ‰òÒÄN|Ï~ÏybÓ&³‚˜:ÕzdâÃw÷<Ÿ{¾ŸßÚöšw\ÛþßwÎŒoÛêÀN.±ÑÙ¿­gïK­e¹+ôD4Û‹^¯‡TÇÐÛLÕ¿øùǰ0`Á¤gì_ÍOf[Q2Ms2]T¤ðCe~ßÑ·2c\6lÍ:jÝÃ/Ãþ0vÉX`—Mñ9žF#’~1‰Ç™’ÝJ@$ù+ŠJ`°·|­‘g4ËpŒåŒZn¡ 520PY/ù±KÄòÐŒ[ºÑÝ{ùà›§ÍæÉººOû¼ ):ÉxÓêð~@öŠ„"'9W“Ôê{  #‚»| —O~ ù—ðÙ:šúäÇûotÏåh#OßìîøÚëH¤°Z&k¼¥Ë2!YЧ Ä=ì—±×N¬å´á`ðn Ô»ºŒ¢é<^(àu:ƒáÚW™IÿÜó×Ã÷û5‡Õºf^Q§AÅÿ×;·–-biž#Žf5¥/#ÏÉbt_æöN!Ï( O£DðjjË®jBV; žG){C]Va‘V“%Ь‘[ªeÙ¬]ºí9Œ¼ãhèqNð,òÄž™F\SHŒNHÐgh“H>|'Qø$zÇ!è—púœ¬Ê](ÌEÃ?C]}œð¼‘æYž)ÐPz6UØOÐë]HE!€Öiä‰#_6™ûé›F®¼AÞ'ߌd­­úv’Å:=Åd›zÞ¨Yk¢–†ˆåYidó‘6†g Xxr9Q’øASPSý·Lù—ºóýc·œM„-öPX—/ÿʼe ”I9‚ ¡¡`ÒpzîÓÆg{kÌnµÔD{ =N#cÐÈö({}l`¹y#Ô:ð'lê”N]»äû€»$*.;‘äyt£9Ù3'ú¾‘C–5eã5¦?YÚo^o¤9ëÚ—±ì¸ã²æó†Úâ¥ýolö{Ѯέ¤8UªymªôÜÉÐH¬µm1Mƒ.<ºû࣋æ饒§ßó׌®’!¬ÌÎ'Rxþê§¿á­žá¡h¥uzT½ ŸC¡ È9”1…eàD¹&‘ãyùãH+¬l6Aý’(Í}pñ#uM?ñ²VaN ¶G{&ùÕ&W$URçß.+y^KÑ9¼v+ä±Ekè"¡¤ÍÔ0ØÛ2a3dLÕm£D#æX÷`ɨ¥*ÜûÂ.“ªÇé_êZÿ¬ 42qÕtæ³WâOF‘L¶b×1ØÀó9Þ@ëÖÙµ5Ö{(2PkÖGº›Ç­¦p§y̺5Ößu¾v™9€êOõUµ×Žw6ĺš¢]5§,¦H×µ¯®Ïƒ$p*¡$š£öš¨µbl ãlâ$þ'W?Þî2Oô˜£`z°^"±ÑÎÆÑÎÑŽÚ˜%zåCò)ø>N~m¸kûXïÿZ#ƒ5>wc_YÞrKÇhiF­D”GðHC?–"dU倯þîJueÏqдð ¤y†b%zŽYndëVå{wWœïnùƒm³ræ>wÇ[I;³oæÄžßv®=TUù«ƒth@ŠŽÒ®–YLo}çÌø–m÷‹-« +” gµ­ù¼× !ž”zv—¿Z¥Ì1­i+)¾m³“n˸;ñƒäÇ.è|Ô‘’í÷BŠÏ–òö“/øÕI.ÒÉ•ôKŠ×C:é!ÒÀ^;˜KªC€%`A‘ú°Dt§€: §ý‹ö·ýÆÞY)ˆ}ÃX `QÌ×dÓBn¤©U‘,ï7×h8]°Ú¤ˆA,°{ûþN~ùÇ6qžqü•"!EŠt:N§;å³e„Œð#ÖÊO'Ž !$å‡Ö”Ò–©MÂÛIìølŸ}þ'qâÄ¿HR ªºýÃ6‰Uë:µØ Bê6­EâNc”BìÛó^² ´…ÉÝÝ«Óé½Ó{ÏûÜó¾ïóý<ऄ§óTÂqcg$‘|½Ý¾‘×0Žã(Šh<Ñ8S—8«d§M囵¿ëÍj·“] €a4¤Wu´¥nS‡1öÓCí Äõ1{C´ãð€¤Ùm5÷Ÿ1wVǺ«Z_Æe$ O­«=½;qkGúÓ­™kÏgn“W󥑦®™RŸG¯î¿V9ü릷oîŽÿaõÄ_–­Û €­#i‚%öö¼¾7á8³9kË7þ€./÷;uããG*¹}9}_~/qì¬uOÌ&¿—Äùd*7™Í&û‹Ãý]€ óÙ1ÅzR¿¹„ë éì—9¥åâÐáxW]´%_ ÚXš…EàYí ý¢°Åå­qL®ùÔ3bz-¶ç„2NjFk” ™¹c’œºÞ³•ŠÚf`I|0ž-++c‹hqe!W¦„,lz~iªyÇg¾z%uB?®¤•ÌqÀÿ|eš•¡£Ë 8µˆ‚|ÃkV.^éªïr›º#fÀèö׸|]’Ù2»¿mºYd©Ê3†Ì® Ù¬í ZÄ€âÙ9(ÉUbè ×[ët²ÝÖPÆ”ò K“”–ãa óê½´d©$I<˜ãº™ƒ“{jÅ ~85•}ò”åÀ„ZÌ};cçÒ¥KKãŽ'¡‚btc Ù½›·þ²©é޽S „ɯ€‚ÈJNål@ÊÉÒ#wÐ\Ÿ¬x}ê`Yñƒ¶Ê¸Ù“ùΗjò¥Ž@ûæ°{>ñkIzèòT–®ÓSšbà†YB1z»ä³Ã'Žmb(¢DœæŽ”WLFz±ë™¹rc2ˆ’KTVqã@ý“ à™ûžؼ|õ¶…‹þæêT‚g ¶Y_PG’¿œÖÖ­ßZB³…<ñŧ¦zº1à ˆ6 Ÿ×0OòäB¡ÅZF 鈥iº¢¢âîÝ»O¬ûS·Êÿc›|´eß¾™ oà „UÈ@A a$%PxEÆ0xNÆðwÒX…ghÄŸFŽAJ³Œ-diCIÁ>3òŸÅ:>tÙÏì2-dùB¶mÝ ÒüI#1‚9ìxF‘<†‚ãHN£ XÁ|iŒ(~u};/'P` ÛqÅÑàjqÓÂZ§ÑT‘AÚ@JÈ7ŠúR›6h®˜àÐ#r…UÆÀ¸Æçµ¸p‚Ã0W¯ú bÈ+ßH2Ï@òÐ6Œ8Ímûãb¾êS3Ø¥j™Õ4p¦vÈ âhî‡~'>½M‘TYé25e=­ÞúmN§fk:5ÓÞ¹s§¡±I'h54]Ìñ,A0Ù’øÈøÎ­ÊÁß™27¶^%YÀhtÅêÙ‹»b¶ýÖ#ýùß^=b3‡ÚÎŒ†/|xùʼ5ý×Þ.¶q$?¹t?ûÂò•’íy7Qnƒœ—Fz­?ÿý‡X„¦ñø×â’¥¿£¾ÿL¾þÔ XF`íYš/Õê@@ŸN#¡*Ÿdé2®Ùû…xâ>~ÿƒ©'w ,î\>|E5Oâ¥Ï)ÉÌ8”uZ’ÔÃ`ŠYf{1ékØðy´ùëÔëʹW”s/)ãMJ¦IISƛ科“0`:ýjú ³ž¡YNO‘‹5ܱ^‹#hòôÕÊ>S×ìðV;þ4â5‰ÁZ :¾ªî`M0‰ßä8 ×zœ{¬rè²tÝܸ†_)üBNÇR FãÓ·þ¹œKg”Ü\ ³Çíéçk: „÷/=šýüŸ¦fŽÛ ™@›œœ¼﫦#0;ägL#¥NOÃ>(Z!° kW%Õÿ¹Ë1)‡A4±ô»EE’YVÅQÌIΜߕ º•p0ër`é ɇ;¸ïû¶iDñx”0H6¨¿ˆÀPüç¦M+-A‘ XÂ@Q<ÏmX±ôóînEöÀÈiä~a§Ž¡ÖðÌàqJî|fþ¸JHVAÄ÷P“¼ †‡ ‚öêöÍà™–b‚ŒŠ×‘•ÝŠ¬]±´H\Ã(Ȉ¦ÕåEÀXÕzUªÁ@åVÿ£ôF:¶o)X¶ˆ`XN§Ó]¹ren‡@v}æ©û»ÐrʵÏþ´¬´LKI²”P¸q?’ƒ(”D>PØ :×3Œ| äKÎÒH …Q_*9xèäi¦d':þ&ŠDQ4ƒ5]Š4¼EòºÅPTDÁž: 6þ 䊡p†U5Oaõ öŒà1™df§ƒ—$0,_·})É ¦K¡6W¡nÕÒ"J«YŽÞjG¾꽈‚Ãu'ðùfŠj j8… ˆ C×(¾àÇçµ(5‚\ ì8ƒÿÆÃo/¹z}CrŒÛ·>b;³îèÎW}ªmÕ±ÎjÓþVsÜV=ØQµïîy ’¡†çy–k¨?¬Ìîêg ØSS“?ÎåÆ÷/_þ~y¹–¢õ,@¢e¡)–¤õ܆úýì¡qÀZï6 ÙL}m è5ÃVË`ûžþVË?¸/÷˜¨®<Žß¤I’I&7777÷æÞÌ A)jĬŠ[]ÛºŠ ø@g†ÁAQAP)*ÑmQžÃ¼w^Ìð~Í30PíîÆìncÒ6&M·Ý­-ˆÖv³ûO[SÛЭÀ0ggFXl»ì¢ôææpιçžó;¿óû~NØvÚ×@óRŽJ“ é/õ}P4²c`L^Š€e‡îî þyÿà­áÑm}ãY‘ÏòzÞË®éæ¹@2 –]ûÒúmúÜNp~}QGãRýŸÕ^¥  ; Åmf«¶¤Ót™üGÕµvMGÝ‘îÚ…Æ)î¶|ôÅ=ASÓhª¼Õ¨i­ÑvÖ,u>À0Ã‚Þ»ÕÆÅiÄ­t:ó …[óH Ép\2ËGýÑx2üIÌ$Àcfvë¡vwˆ¡ß¾ù \Q)?Ž&¥ Ú£ýÕWm±«Ð@Šœ@ƒE(t Dƒ%(\º(”£H .Eáʆ#Û ³‚â”d+¿Ù\Pï8llÑzE¥É¡2<qjl¢Úâ+Kᩤ »j qÙ†ÑÂ~ð¼‰9ǽ)„aà <Æ•ÎḲ'*C„ØG¸ú oè¡à(1Høú O¦÷ú¯™5Ûˆâsx]@D޾g´å«X™ @˜–;4D—h!¼#„3ŒßMÀÒ‚ŸƳ…¯ŒÛ¸zñ´ý}„ú¤”‘³4ÉÑì†Ì̲æú’κüöú¥ªÏ¡.[ýŽ+ûºê ¦¤Ã¸áÄH‰`Ãv´µ'2Õò2öã½™ù ‰\°ï…M)ÏK¤© Ëò!ñQ¦à¹g‘¥ª°Ë¸»½VÛk„iïö_RvÕæt^ÙÝ[¬E·rS˲IJÙ´ã-7ö Œî fÜÚ¾½TÙ¼“54ºwè/yýã/÷ÿ53t÷DðÝç2÷*hž•RCæ+Ò6תzô@Gù­uKõÿžšC†ÜÖuÀ¬î6ÂB”Õ$G[kÏ477ÕŸî¶Ô¨»j¡‘üÖ†¾þtÅ¢÷c%-ymÕÊÞ%ǃ¦­–gx–Å4ù hDÌ7/B#^µúTæ” RB†'©ò’Ò©yš»¹Âc¹«-úüÞ½µ«×à8æä y/$Sï ÑÕ‹9Be˜=Ï¢Ði:‹†Ï¡È«(\†K¤‘P))G]ù0_vŸÙ&OJä,C¯”ÈÏg—YUz¯ÒîTš]‹Sù4hÄ£­y€–g“Òâ´+´™•rNoSd¦RŠdNàÁh ÄÃ3ë7\{ã*€xæÿÔ‘«Ø<›Ý‚DëÜîLƒ|AôÌDá°ŽŽ^¬¬\•š SÈ1‘Ppƒ*‡Ó¥ ’ŽmÝ<\Vö…ÞˆD7r¹‘hE^ÐtòX‘•Ì$P ÐÒü¤iÄ 2 aî ]ãïN•å®KÏLN{q%ó¡¡5·öMçè$©Öq2mÝ}›éù›Å„ßõØ0G‰Ë7± ¹<1QŒ{ÀŠ\`ö˜Y?e>qO‹@>{^Þs,·‚æÏ¾²Ð™MÈßþA?^Sýµ®a kñ'Ø#Ž|V\2Ããë`œû.Ï&™@ÁÎ2‰TªÕ Y°œ±åMÝ?ƒÜñ~&‘Qß@ò-ÅáMˉâK„¿sˆeˆhŠMÂŒ³Á|ÑC.®ôb„h &zý‹œN±D94}q¦â`\qDÏỆ!ÆôWa `h¿Nx‚x(ü­8ä8û0·¸–N#Î 60¬7Bø"ošûˆ†s;Ñ!ŠËy^ išþÊ|…hôĉ –Á\䯡háïÂr<¼38$Lt F7¡yU’²&™¤S ƒqÔ.m^E¿9¿õ’ª§z©ê£ìnTuÖ){ê²Ú¯ô˜Ê[BæjHD¤ šùtüÎ,,+c?J˜=äñßh4ñïä!Z¢ØbáHxsÆ¢xJH6…cxRJ˨5Ù[TçUþ:’ü€á@@·«W”²1oÃ0põ IþpmûÞþOv Ží }œ3pg©4²7ôYNäö®÷ÇrŸçŽî¼h…Kˆ ˜¾±Š?n¯*ê6l«.€i, z?r[¯¨ztê^@‘zeGõ±^¦[§ò_)Z´Ýzu·ZOTmU ŽÓk{çã¯îÝýöïo9v2`HÛÓµ ½,F#,úÈ1¼‚b¼³ScYŒF4.Ï!ƒ£°1N…a§V+R¾ÿáŸSS“ö963'y³58p‡x \~­ ÂŒ¦(иMBҘأEN¢ÞB4t œCáŠXè U`& ŸBC§¤‘áSøõ‘ (| Ÿm9ºU  A(’)~Ϻ,Û½¨4yòmž#6Qix 4âP›\ù6¯ÚêSYEÜG-õÊËË¥œ T„‚PN¢y)'0™›ŸôGÀ!Ñ©©„g°Š€ó÷Þù$Îìôôvx4 xc}ðþŸ`1œoÝ{{¾Ñç`ÄV:Ôf´˜Ïwì´é®°5rHƒD‘^)*¢TPbJf/ÖpPìsËsêÄÉ¿öyæg&%$ÊÂ8Cùš¾±Œ¤£‰ØÎ›Ÿ×é5«Ã‚ àHÔ0§Öm^½ãLÝáö†>›¹Ï²{¤ãHı©Ò€Y.KD†[_zjïøuЈ1qckì“ùjdÏ…O¶Ä®o‹þÁxáãÒøGå}ï2ËWeqlÆË8õúª}ea XÎ0@X6ÏΧ· ÒÎ7Y ƒ­û‡,À*øY6l5Ù¨­†ÛJ[wöž1Ú+FæÔΞˆ PTj« ZêÏK;{ß.±–Ì}ý³5Âó¬ÈkA#¡2éÙñ›åÐÉw¨³8§˜g½(Bغ0y‘(+áãHš9O²¶Y‹’oýQ#Š,Èœnµ¸ô=»L%ñºt¬Ž\m!±£$VIUäB-™×”ÏMzä÷ÞlzŽçtj¶âÕú{§ÜN`‘iŸ“À½Pô€„òÃ;kådºGöš ù˜…I É‘†yå>™÷™RóZœ¿û¤B)r;Mî§Ów>ý4??GÃp:^‡—1ª›ÑÙŒ"oõL(!ö1º‡øë‰* I @œjÄAýšãè´ãùe"æ Qi9òŒRÏØ|Kv› Øì¥X§eõZNDÆ ÔæB}Pá$½ÀÞª¡Ô5¨<%ªhD1œ <˜¯F1ÚÂP9HJ ¾I )Nß%˜P}oŸ¸,—å´BQjõ¡$’Ggñ„cÐQR±ÖÜõ÷Dh ýcÈÖƒŒ5X_¤c°3ZÌÀ(Ä '£å‹ï94ÔnˆÚæ}Lkùµ|à»’‘ö²°ua;d@®òÛ­¶ÌÚ¸°íY[šüãëo ó ´¢æ…—ûË/nÓÄ©‡3©§"—²B‚Tȯ¯]3‚F`Y†ƒ¤ŒôtËéðò5ùÛJwW9ZjF¤ZŸmÓ¾Ð~ÆzŽÑ­ÚœÑHÙÄõïÇÿ4_l‰}¸+vʞćeÿÊÝ^ ¹H«æ9†_¡«µ™Æ:÷G¬ãà‡ !æUEì‡G;ÚA `ø¥#Tƒöò1ÇÞ¾VcÄ Ÿþ2ÙŒs×o²Â½Ã6*¸T±—÷µ-@G°ZcÌ€F´ ñ˜ÓœÑÖcrõ›<žöÚ­µ@úpóËk×eâÚãaótøƒ9ý`*(ÝŽaµ‚iì™]+ÉÄqráUG²‰$Ž‘ñ ’¨&ñ*2QM’µÔ$µ”“'æÔH¼–\:N¢õ$yœŒU‘K-5Å:­V‹Eu6#žÚR/›ASltKžñ^‹XBfg_wð«ÛdÙ»r‡žËbF±Z­*ÈÉ ù$øÓJw¥Ÿð Ói):#”áB…ÓÓûË_[ššá‰ÐÉ<øçoܸ‘ù4á<º8MM“‚ô£ð}fîÔƒÙy˜"3éo¾ø2‘Lš«~P ÓÃ'ƒ¡Â±WA§…/Ïò,ëØµû–µøƒDê" Éi'á¿®‘iÄn/ñyR²“xý×Û¬«8&‡Ç"ïÉo¾u:ð¤z‰Ó{åHõZ‘¹ØPóy§x}ëá/ö)jò,žŽ|Dv‘€›xºHw;‰Dþ,¹êŸ_K¶³E">·±ø'NMû#å7h8NϨÞp’BÄíwY".‰x@ ²r hħt£ã|§±%—QâE³ +Ù:` <¤ƒ…LOOefßc[>Éþ¿Ín¾y0›M=üèýßAW2X—%ªµ*¼dw% D¨ zâ &g5"Çû<5 ß ¥ÄQÇ8 ƒL‚¨¾ŽÕ¡“ç¨dzc¨±‹Óo`uVC”Êáy/a8Qe(GŽAÔÿ$_FeÍ*mn>³Õ¶R€Füã(¤ð±L ^¸7JY€ÚFQ(Š<À›IèE’›)\«ÎY‰,vBÞ+(0‰|qäU®‡·¸ˆ¤(eÒ\õ‡~Œ:û©Z•[€Y5¬a0í³9,œ6'7OÈËS‹¹Ð¢ÆÔòFŢϰµz¸½²ÿÜÁᶃÿf¿\c⸮8>R%$$¤Õh4ÍjV»¬`-ü(©íÚ•C]\ǯØÁ±Á ì!Žã6øëø¹ ,,ûš}°`Ëò0˜lš*Š"UÍ—D•¥ªnl'NcÉv«¨JÝÔ®k`a÷ög ñÓË‘*¥W—áÌÝ™;÷uÎÿwzížãâbC:‹@i)•gÑúYBâ<qAÌ@#³¨EL[ûbÎèðÈcü‚P9=“ŒÂjz‰? S“®‰™;·¿8QW§EZ†"YœV¯át|R£1pšÕéëVòZän¢Ž²x6U4å÷¼uèzIôꦡ/J#Û†?)ütûÅ[Û‡¯-=èJy04U“Wkv—v7mí©Ïï­·„­%]ÏB#rÄÆ0wÙÊz,=*Tô5më´Yºì–žæ¢H£ÜeCçoö·”ÐçíóõƒOiÌ=ÖáSyáSE‘ú7•çˆ¦Ý à,‡“&êu®ÕÒòïiÄoöž“•Ö–³ågM’IyвZÝØØX2"6ΜÙL-ÿFøÈÖ›‘N šØ”«¾#dè0¥Ž¡J2|ˆ\¬$—÷‘c$z˜’ H#ZAi„þZ=/\>LËHt/„];=üÞÛ…F>…•RœT¼¼@1;‚²4*õeçw"~Ù ø áZê>´qßJ1ôÅë9-/俜÷Õí/É¡*2OL’]œY_£þ&¦¦ž!³Å‚?øúïAŸIÖbNå= ˆDw–+//2¹˜uj|?ž˜Ï‰Ä·û…=T ÿ')’$0ZUöfÞÿÝššª/`F¬ÄÁ¹tøcZªõ¥ ÷Ýà qÛ‰ßIÆßGgÔ6JŸTúhK³?}Ó†TƒI'2#+˜ÛD®¹¡ñ/wîíܼU«áŒzËqZ£¡úÔ‰‚°KîjضV…má†M}M»ú÷´¯ê;[ÜuRŸ-4ïî°[ºÍ‘F Èëá³…ÝÖWÂVs¯£²½9{SŽ ‰ªÎ ²,'7nŽFž¡Ì¨/ÇTHö355ß¹zó:fÄHEÊZh˜N‚Z>úð#DæXAx†Öiš0Εd'wïÞ­¯¯_´h¨oá*!ÞbЪ«Ž“Òu65Uo0äÕ¹vDo®¾?xm>ê(—oäE?ùâ盯¿ß22¾>úqîÈgrÿí£7rÝýéÚ¥™èß êYAkþYÙyë[½s‡µ4Ò¸«Ó r ,±@õÿŸ«›È‹:žÓñpN±8|g[ἪÝ^h3û=²ÃSêx-§$S£×.´¬ÉhúçƒÇTM㳇­œÆ®RÆœžÛKº_³¬(ö€^°í²«Ãì’€´¶G«¹É'ÛqÛañúm­%à7¥¼%+çÌ ®­%ž¦2Û†e¹:VÀ±—4‚ÅbyR&°»–ßÈ 5Td˜œžŠQ’I`¹cI`H¡‘KKLÙ,¯c ^«1²)&AJŒ—XÍïýJ¥þ\k*NAh¡~­f (ñ‡¾3öKSF&V/±ðcþ×µGˆÛO…ÕÛ ™ ¸¬æ_,躠̠ qÐó´Å?¥öù‰há›t¶¶ÎI—ò›êƒvY®ÈÉé.}ý¯MN €î?°B/fp<+JËŒ™ï¬} º úy^ÔPQÁ¯ &…~WñÆo#!qzˆ³•5ä%®–[ÇN¶íÚ^¸4à hò¤Kœ¤ç„4=" ¸’ç?©·“P(áj¤\¤¸(>yBt|.âE£ƒx±ªç7ggÁk@˜Ë6ÿtçnÒź‰ßÛ’¤ñd¢4‡%¬†Í€wê¤T>“9Ñ„†¨@3 ß ‘V¨s”ñ^¤íÐk¨y’Fð€O} ö_¤¥iáé&6›©±1ž0£œcÎ(œ$ñúlfï¾”œ­Fýâ4½È¦ )«s)Šø#L —öºÌø£ô+¡¾çF#À WCŒ2@kÒFcÛ#¹:»Ð­Àÿ¦õã»Lm_„9z2eíÏu¼>éŒN/’–å ¼ˆ¤ `燿ûmR£oßülY† 'üN º-µû»íoD¬?m?úê@ËîNGeGóîîúåÖêõ§«w8Ž™;ߌ8*:l–îÓ9Cg䈭 Ûjîo¶´Y_=²W£eÁFQBW®\A´IF?ŠODÂÿ¾Äh¬£±¯Ï²èÌÌk; ¼€!>ë%¯Œ¼hä9^ Geëjë¾¼÷gL0§Aó¡zl’‡gî,al=òºÜës×áE“W•F6é"%«Õe‡ÌÃ7Ö^¸)G¯ÏG#yÑñmƒãàmÑOóGÿˆÜî¸t+àæ¦‘ñ¢Ît«òDCV¦(êX”m*PŽUõ;Kºê-¶òÞ&ªã=öï!@©CÅ^Ÿì –yÞÞqtmæQŸC•jkk±ƒ± ŸØ¬x<¦â¥*d3Ó8 øýUºY«Ü²‚  Ñ}ä8¤‚ ¢öhÅ‚i$z€Œî%Ñýäâ>2TMF÷“ê¥F Œ Hý‘v±§¸ñ\‘W17cjà„ùæå•[€XÞ¢f E Ä… Ã#7µZ Šbv¹Š›Q½ÅNÜÒÆb*žÁ+0‚fº,’@¡«Í¬àõË™åÒuœÈiX£Vÿþý9™˜˜ø~”\·ä±OºRò&F—ÿ¦ ü„ÖÄ;c£?^•)²ÿb¿üc›º®8þ$¤H‘,===YOÏz–Ÿ-'Y Ã-m—ÒF=M…;„!Úf@( BJ‰ígûýð³ 4 $v{)Tü1ikÕ•nt°µPúcZé6µÒþhÍÿ¸;÷½, [›)[´iZ¯Ž¬ûçÞóî=ç|?*g²RFŠcÈŽù®cérÖ ¸¸êñÇ´…àF ¿²Ó¹Ì¼›Ïçv&›½ÿÇ{Ǫ,bÍ ²íkŸA‘³X…E0É”´põ—ÃH £P[PS爒•H‘ñ\ O†Eúß:x°¡´ØBÓ+,¼…¢­Fzs?¶»áÏ è²p§½ó+2c¥ÈGèüßöt¢P0#zFlHà3,kð¤d¢dd!­ho}öüÝ®Ó×µ~r¼)g¬&ñ3Ÿ?UßÐæ\W K™T)M_llþ"܇ü^¤ŠøÜ´7Í…$8„i±E0ƒåBJWEE wjìõÿG„&sùöë1ÏÐ[Z}̤ä–ëIêÚÁñ+ˆ™èO`“DH“épŒˆ kŸ"ä/³%ž–ã~É:7¡^"úljhŠ&‰g«Úaáì4OòLùtÞ¦âŒJô c âe¥$! cHˆ\Z4Ñ)¬¡Ø,>…´OxǾ¼Dø† )E¨WˆóW ÿ q&šW*.3“f+M[M”ÕÄ3 žç,unÏÛ×~šÁ}PV?ÍôÔÔí_½GH\ÕÀîà·Wĺ\çz\½mE•kÈb–1™U"ßàp®XÛÙì¹ÐÙr®{Óùϰ·n »Þ{Œ¶A—ÊÀ¾6š9zô(ú—ðãï†Þ@=tï94žJ=j†Í`¦ŒKí¥Î†ƒ–N–ɲ¢AK JÂbtj2Õªì,ÉÌõ óIM<øâ­7ߤJ(ЃñF–Q ™?‘2¾n$HÉÆ=¼£I:PlUV¦&&1íg³ÿ~­þÿX“æÛ¬¸Ü¾uã[Ëk˲S4éXM(ÄÙ$¡Žcö$Œ X#Š.ëºÍJ?ÌkwP,÷ š"êë1føGˆH‚..©ªæ)‹ÕÌØ¨<ÈS½ðGðŸ¢#„ªNä2¦‘P o¤\\4™ë¤>×É$ÔIaðp”â„8D¼ÜClÜžo^ÆæQvÌ!XøìFÎBÒVšÙéÞ¥;£s½Ö{LÅ×._†K§ehL¸e\eǾê“uÞ#PŠp‚B.PVša8eÅQŽò²m‡ZvëÞ;àÝéo39xøF#óHÑÒ{÷îÍ^ÞåaXèÕ#]ˆ k2h£žüvKæ3f†­mÙ“¸Ñ{穦“†boáiŠäyp4¿ü©'o^»Ž2³KegÙffÙlvVîþ:ÏA§Î¬._4/žg*ªí£füÓM£w¾ŠFÊ“w×'>®yosìÝÊø•‰ßTÞ]?t§qä—O?ßM™íl¾a©ÑȲŒóû u¯œvŸëÛuÉÛ0Ô(âºp ¤\ÿüß¶…ÒH]oÐÕÓ·MŠn•"ÛC§Ü/o(ušHàHG(ÂäÛׯehnZ—N¸¼‰©)¤¡éÍ_Üý2³”V¥yŠ5¢Ñ&Fö¡±£˜FFw.˜FÐø>”jÁ`“|Åv¢ø>×3+#Ã2F»Á,zz¢5ÙãƒW›Fj}`a—ˆ›[;·5ÔW‚ÔLྔ¶úûÜ¡~·© E\¹Ö ¢Ô ¢«G©¼õ§–Ñ&h¼ã†õëædDë4œÆüj2·›ÓÿRi†Fr(—¯Z ¢§èì ,FHvÞùMÇÚªQl7>Ûñ¶×Ž8M8„9`»­àÁýû¹ ÜEn*û%°3ÿ˜J§õKÔQ$;5½Ï^K†³Ðåß\ý ¢(© ÂBU>êE’õÉYɇÂ" KHñDögD/ReO”çJl4GÒ uhõšë­'.·´nq¬¼…ÞlC¡5+õe„ÀŽ®«MM“€ݤE£)€"rNxa1†ï%$È¡MÏrÖ|c°2V’¢(3¹ÊF¿~ðÅloŠª˜¯0n‘¨fBÚj~/~ÇI‚æ'KwŽ¢èE½}¢½Œçò)ƒÅfƒx®©®Ö_‡"äëñÏ„®®k³cbb²ipl¸Ðh´A?Å’vš]²z!Ñ¡& i˜PãD4=†u\ŠÿMåu¡‡G]ë[ϰ–Bàâ|‹ðG‰È«˜d„!Þ ŠD“¸åÕ¿@¼r‘8¯1À@dsl|‰‹G#ÍO96ãª>ÑwéOáÝ…þ2rh=¾äé*ð’7s, Ž3™LÑdÖ€A±ycÞ Æ@0`³ëõ‹ øIÀ‰ ØÆìzŸ3û²¡< x½/SõKú¡URQÚÁ8PCƒ ý˜T yÁ®w÷öܰÒVFuŠ’ÍÕÕîÙ½çÎÜ{ÎùÿNó¢ÞÀêr)xCà9†í¦QÌß¼ºöH‹~É £Ñó¼¨P͇׮ÁBÉdBQÿ,ñ?8¼j'ù,±ã•$eñ,xMnñ†²þßm ß_¸>ô§òÀû‹7Õf1zx0ŽÊÒÓ3³!·RLÞ–Ç©¡§Á òá‹gû7¿R[cËAüŠ¡(!§Ôݺ½)2:l ?0Ý/¿tcGäã-#V†>Ù0pgו›;ÎP쨆×ä1TÑJû:,ºªû»¡Š˜Îv„Ô\²ý¿ÒÈIÙb –I¾n©ÖѺµeMÎr+€6ñ(HÑêjbÇl¦Üõ¢Ã#"Çe³†Öun»tsÛð½©hdëà_Íc–È­òá{+£Y¯ŽVMç0¬Nå«Ñ-Ðííí2÷w›/žPÙ£üLôÉqÕEëO?2˜­}5nÐkPö€É-YìΪîÃ%oÏçf(l¦5sæG?M%ŠVhDmÿü 8V8h²š5sÑåVŒq ˆ}(zÅð`º42 ú[FÞF‘zÚ ú‹<‰i„ç Ĺ“4â®°¾„F¾€I’MN` à.·¯Æî®è:°í@ÕêªâùÅ+²—/Ó/];{måªÊÖ­öªN¹€Ä@rÊâíµH’¥vÏ[i—Ë ÙVÖe^²bSË $&“IM€“‘5©)S¤M5̱çC4Âõ¯~yuÑ‚‚ÙìL‘&-HZ+“õzöÌËïY2!áfLw‘¯GñviA±ªß:ê iBÏÐEßSÉô´Ul’‹žüãËæúFx)8kb(rfdžâ„SB’„<6äub& øB§»0€Ö{eÔÛ‹œ.<Àº‰ÂSºÙÑ­!ûLu@ÈoO8!o ³´ THøM‡’^+žî–Q_’ì¯ã© DÿÕшkßvŸÄ«ýÈãBŽøÌHÝo.+Òqú3e&$÷~xø¸öG€-(­–˜ƒÖ?ñß—qœÈ½ü.ܽ®”«›r;$+(âøF4/^%$%ðZ†ÏãÄ;·o£þ¢:$ÀŸYä¿l߯^'n~›A_$­û!cIrŒŽÓ ÇéÑ"ä0áŽr ³„¿ÿ_hDu _!ì>òµµ³™|‘ÖQZF£'ØKæ-"ZÁ!l'8ŒÙÃÝOx#D.£¸"E<ø§W$L8ðˆâ>yi$Î ?a~“Ì+¤8¢x>Ã2B6­a ,SÿVÅGøÍ“äWj- yçéD"™žPRFMJ˜å¾{†µhŠU‘3èJ$õè<l $Có<›C²3tyDC3èWúÂ*Í07òâB6 è‡å4ƒVKƒ›s<<ÉÕØ0Xú&­BHúûòòl9UÃs3˜F”ŠöïÝÒÃÒ Ï°Æµ¦ý¡%¡ñíч¦øxÉà-ññU±1Süξ ¿_WßÍd/%±Rñ,õì|sš[þöè±Z¨ñø1‰"ªkáýIOܹ;J—tG³ú’:sèÖ¦ÈèT4R~ù³-onøsq|lid¼âêã·N}`|½F¤a:¨,ÎÒ—ÉGJ~q´òBgu—©ÿÆ’þn•@vœ>f9 ÷»zœøqiÄk²÷Vºe“=PåôUº=;m*w Rj*Ù3Ÿ6h‘ÖP4Kå/ÈC G'wRcnÞØ^в…9â³(Ö„bu(¾Ea܈.7M›FÂM(ºÛ‰À¸´ p $È-àD+r =–“}&7@ÐH¯Išê½‚&@;@‹«ú¤µæxÛö–‹¶r ´”N¤D^8¥8 Œ~÷ÊŠ÷Ê˵6¿ÅÕgñx+0ÉÀ*§L>•çÝm‡æqFúŸì—yl÷ÇGBB²´Òh4f4«Ýµ|€¡1‰IÌáÄL(6Ø`_Ø€/ˆ!ÚæppY{ïÎîúÀ± ÆxwØ5¥ -Jšþ5ª-GÍ¡T‰R¨P[¥ )àcw_ßo n‚êGQóO~úi4úÍü~zóæ½÷ý< # GF–åÉœšT“g¢þØ£Q•À£¡3ÁŒôeèXÌy¬&Q` /21™ILèÀ†q¥Noƒ@ (eˆvÑÐ^í‚ÁJ¨‚s‡#C5 « ‰lŒ$Åó¼®ÐhĶð;äõä¸òÇËk²²±¹@Kš‰“t»_LþØt|¨ÑfðXÀm!8árÍEP—ñ1Fþ—ÃþöþÃGÁÛýÐåú«Í|™Äîé-Þ4W`=”“?*Û@nzZÁåùiJŠ^oH晑ƒ‡‰Ê»Q«-ê°¢Ö:šÀëÛw¢£ÿN#Ÿ¶´Ö§-¼ÔÔð•Å0HüÍÙÂcQeØ»¦Æ/­–TIg`Ye{éžì¼D càù8Ž®]ôâ˜ÙíÞ1W3øÜÈ!ÄH´Ön#'{e$n˨ËÕ’›‹ÃaådHå<¢ªÏdéÙ‚dzƤë0㦒îñÍøøýD¢ð—ü}ÝŠUqÚl§’˜YÔ¼LêgM”ï4á÷YÊ"ØàîùŠ|}v…(×Iêx?UkõªQ$Ò–‰ñÌ‚å”ÅNuöªA q#r PŠzr?å;EÉý”³Ÿð¢ˆwð{£‘)™š“+=ç(S‡&k3-é%F3‡£c9ë?Ãi¬ûì6ÑYôË8!TÖè8o²@Ù ¢>zHÜ‘1‡ãшú&¨• ÎÌId×kµ(¤¬aö¦×(_§ú±h†B¬£Ÿ2µÌ^m”èX$vßçù¤¸„÷Î_ˆŽODÿ²| ŸY-§ýõØy©¶ýîý÷µ¤€³x¥y!ÏÞŸ=puMðÓ%ƒ—7*— >Lº‘©|²Ø?’¦Œäo;/<¿q;ËòIöØQòˆL$x­(+¿ôáEB8ß °©&®,’ ¬FϋҲ¢RÿÕìÀðt4’Þ}ÃЭåZºr##øINß•Õfš‰#ÄhiZâõÙ;·O¶¦Ÿ:bì;RÞeBÉïm4¾u|c7¹–ŸjËïjøáqâÿK#No¾Õ^Ðâ,1;Š[m…rg¾Œ ^™Qò>^b°%Ž™?þÍá¹Ob) Ƽ  X`‘Šïú¶ƒ·²”ÝெàîÓn mS©f„Þ€Áê/:+´*Ï΀ ²ù`- ¯Í\…¥‹çÙXŽá‹šKz.nV®¯ñ_ËÝ\áÎU>Ê9}³ðÌ­\ÿ,ÿG¹Á×+·6®®l Ò™•˜‰hªžçáô<­eéX½>g}Þ;¿yø C¢ G@MKr>º[žš¦–}^?oQòûdÞ€(RØw¬èD3.æ0­ë;šsâ躓¦Â“䵂>¾€â^Úw¬´·eKoËßnV¼eb‰ÇX‰%ø'#]˜ÝæéT{Ú™owm¶V¯,Od ¨S’ˆqƯZ™ùÅçÿ|³ø»&½]]Ø'8DN}{q ¢\î…íDIû ´gæ4ò: VÁÐë¨e íüCÓ:­¨Ç€‰gÅÂ%9-% È!Î"‹»ØæTíô9|Å6OA›\Ôê->&›p–¬ÎOn±t Áuƒ ˆ'ªTƒÙMF0ÆÉ³!d^Ô²ÂÞ¼]›eß§«Ôb)2u”8¬EfO‰Ëk´µ-ÝeÎúõ5‰Ë„tƒNžŸ0÷Ϻ¡†+¨½ÆòýéÜ„!…E'áÏa0‹xTafë¼Ùçk×=ò×Á™]¨¥ ”j‚dÓú§ {{ÊÒy–æˆã™Œ´›xº,‡Ÿ¬LÛBd8¢M~U¯×J)tÚ+èà äô!g/¡ Îrv£NõÍ…Òˆ¦D¾0rDµu  ¶ ²ô¢ ¹qrªÕëh†ãé×6¬½{ïÞƒ<‹"s~P;3sXò-m.kÍvàƒƒöÊ)AÏpqeã'Fllܭ˜K«©T¤5*ÙþpGߟ*œâ3+´bÔ¸zކÕÒZ(Š<Ŭ]³îò…_MMED‰MEñ8$XphQFÁQ'Az¢ä=?oº7lßÍ g ™üïë~–Mk)p"ÃP Ë“ßðYL ç-y§7vוôÕoë9]z¶ÞÔu¢ôìÉòÞ°m=õ¥Ýu[»OŠõ Éï&VÐS¿µ÷‡ÇŒЈ(‚ÖÄ€ìzJšŸFÿô3‘ad–ã1=^óEo5¾|ªp° G~ˆ"`aUˆC»I'\ƒÃ{ûÖë°YuZÎôr¡ÓÜÔ^êò:|EvoqËÙ¥½Èæ*¶4—ÔŸ.­=¸eÿ¦¹i\J<+dz¨­^U:ðÐ0UVF¦Ófÿ˵ë*œÏ|rçÎÆì ¸Šù+rcs›Ñí25ÛKO{ŒVp‚§ÄÖV¤¸ó[£ÅQÞ´?»j¥n…,êà‚ÁW‰‹þvkt6xgcê1 <.:bÁ@D€saiËë9@k³—ÒáCÙ_¼…/×áˇɖ#{€¾ðPÜ7¯.‚o«¿î¯]mÐÒ"+ ’Žb\ €ê\0õ\,ÏöÇá˜%“°?þî÷+RdI (-äj†a– ‚ß\uz&Ü V‚"îl·Sˆ Ev@ǽÎI¥qÂfumÚ"è%¨Q eYŠ×Ä…·•M»ˆpÚdI_•f€Ú †æE^¤éuï7–ளϓF-äéuEíg¢@P>ÃÜ®X»çÊŽí­]¬¡ÖäK•ÛgQ¸§„4®©y–c…ÓöÛ _Zž¦»Q[7ÛlsaÛìs‘ýÚšq›xŒøžÀ'×Ý3µyI©²VCh‡cR’£cc±‰‰é'¨õE{Žmö¦ã'bðÊ¥Ë M¸Dž¥i‘Ñd‘Ò…¼—;B`c>Àh‹ OyÃH9Îx½ u…Pëòö!OjíÔ÷ž'æ #W2V!QÒ–,i!ÎÀj5Bâ¢l3²¶!; ¼9€\½È½@Îi £Ö‹dÙÀ6žVmÞ.QLä5|§ƒ(>pìpT…Ž9]‡þÿ×Dó´' ä)˜À±Åi ñ¬™‚ô¨ÉIhV[/yUsû )¸CÈw…ø¤úMæÇ« ÀÓ‹PwQ,Ãó,o.2ñ÷ÏIšˆÂlS±i•,žâ¥™G…î·,”€ÌøT49Áî•)JÐ¥­Øv¤,8’θ‘ËŒln†ó‡nå„ng…?Éú8ýü›ún” gùG+B£¥îw’swRRA^Ðqœ,ó ”y óÒªW|Ý}_~õ5L›~óÞŸÄkÒ–X6Q91µ¼û½ÌÀÇóÑH–Ä4t'7|'/8²lg–áuà ^âXF”Å%k—g®,oo,l;¹¹ãdY¿Õ|®±´§ÁÔ}ÌÜ} PÄÜsh¤¢ûDùÙ: ø½ä\}ñ¹†¢ó FèüИñ=­¼­–{šF|EÍʳÐH¼U)³6™ÊnZÊ'ŠD.(žc×­{õ?ÿý*ª^£©É©c‰N`F–¦ºö¾Ž ©Õ8´ ûË𥃠¦‘Ð>bþ 9€#‡@š{*×ðœÈ󼞖díó”::ŠÜ…ÎàAƒRÖd55ÛT“¿,o©ªcd¸N"ÍKŒ ŒÑ14‚ãÇß½©BÙž¥‘Éñ‰ÏþñOIeNdiæ'|Š%¿¾³Äë(²(Ûš…Wq“ÓØÔfR¼&—mk³³ÌÚRÖX“YÌÄ/á „sD.eiB02Hà7E ʵk×$FdÀG—À²iÔ"ewæ¿úáWÚ‹wâàâ´ ØÙ??­Uÿ ½}áh>M#Ó-fô†Ô”û÷ïÏÍøðáC5¬I˜?ª‘¦cxzfl|âC5ËKà#“Âhs—&¾ÿæ1ìmÙ@C•…«|³ª¿*„¸l3ŽY,5·`{#öÚp‹ý¾Ò±yåjð0G³q"ë3oŸhmÅ®Ür »›ÿ}úÔÑìõ+%¢¢Ì”®]sýx-öv1açE#…‰“ðRÌëŒÙÕeÛ¬ä›ý7•{Ruä(%†–hí»;÷aoçy§éƒ#ãE.N ”ø2 ¬·wõª±ÍNÐK±Æ•=?¢M§È¾\ ¶;Ç<Þ¢•É< ŸN¤u< ãí›áirñ¾»F}Ñž©MÅ¢³Ú6+jÓPÑÎà#55‰ZZ’e­ÀH£),G­½Èzy/ÎK#>?A€$‚\¢³í¿$ ãU9ÄPyÀ\ƒ*ZÀûaÔè帴$–Jb5) “ÈñÍ3lÒ¢‚]ÈÙOÆéz5Àçï,˜FìAä$4« @Ú_ÍŠ ‹Y.žã 7¦çæB¤OOL›šV9äû¢~LO}‰ëì×}lçð“"YŠt:=:ît–ϧ8:FiW²òR yâÆy£)­ ,÷Ävûüš$8~‰ÀªUb“:‰I]Gy)„8¼lÓº·NÓ]¡@Þüì÷Ø1u™È„ÔzzÙŽ}÷ÜsÏó|?¿Èo#4Ãh¡W®¥\}d@œ±Áw‚L ?ÐC"y &±†¨¾¨V§*Í ˆIÃ$±q4,®$­|j`hj6¾)E£ÐÝ驸…â›U¼š›››w}ÌÍ‘Êú3ªûʽ@Š@ÁÏ!÷MƒTo˜j0¢—×Aõ§E‰¼À¬Ú°öîýÑx5Ûƒž ô§ÌX NˆgNžpË,¯í—í¦\C1¤y 쀱aÒ%‰ÓO@/x¦Ì~ª;Lõÿ”ÚÛ¤zi%l¬:žÖЪÅ"lVhCNö/ýñìô4ž‰=²oÙãéúßžoôoŸÿUæu°iU‚Èisêíy¡Û™¡‰Œ‘ð(’˜Ð‡oçû'6{Ç Á‰-Á‰MÁÉôÀ$€$-t'säNzð¶aäZ¶ÿzFè÷©ÞÛÇ«FnTº>\_Ý’¼ü „4ɼ˜ÂÒÐD&‘åxö-Ž•VƒXF®Òöì‹$Ÿ™œO#9#ãÞHa`"¥ü¨È 2“À"•–WË‚%$&s¢ñ:VPÃÅD¨R»J÷ýú¼#U»ÝMUƒ¦²Ávý@sîÉFÀIá@³þdÓÖÆâÓ-eƒÍ;N7m8þ3ã9[~s ”šhfo3´» ¥4e[§½ÐÜ_ìr¿E@Ò¾½©pÕ™ÑhYP2Ä=W_¿æÆÔÌìÔLtuêFžåAŽPzX·¯#ðU᱃طsÁ¬#é '€>·¯8U§%©t¢æÝí{U¬)KÓ½¹LX ÙÊ‘ «v}(la«a“*Paaa0¼{ï^|ƒ‚¯›žüq0t+ß7™í»™5üYÞp¤Üw‰YüoöË=&ªìŽã'11!™äææææäÞÜÉ<2Œ‘U'¬šº(Dä%(22Î* 뢲 ¥´õQ†aÞOð¹ 0ÃÌ0¢M6ÛĤMc|l²(*ˆ®mcšºi]kÛàê0÷ôwf„Ý?J#ÍnügO~99Ü3—{Îïœßïûùeûìs{M55’Zűœ‹j^ЉJ¬`EøÇŒ‚ã^b¥…Ê…ë²swWTµj>Û¹¥·#e°Í½'K{Ž¥ícÆ[ZaënÌcIà•à7,8í@#^“c®4âÚfñVÚ‚®3¦€{‹Í½ÝÚþÁ±rC±ŽS/´HDl±œé…ÛsíêMø †Ã*¬Îbçÿ®¥˜\ùKja@ ‰”ïrÈLÝ7?Nâà¦>·Úotu™Ün“Ìkìè6;ü&‰×è€çÀ*þ-v·ÑâÙÙÙ¶õàb^¯d°âÜŽ…CÍÍ/žÿ2ükà(>¿Z©âD­^TœoÈ#CÍd šâD¨ž 5‘h#¥¯X‰$±FÙGáe6ÿÀlt/¬&ñ½$Ô´¯P¯À™Œ|]i4¦s/M()¯ß¼y½8¿sp%Ã% ϘŒ¦œ5ÏížI/¥¤î„×’pœ¤c·c®*?zísÊ.À w E@Öí¤«‹¸»o}|еµüÓ;^{ÉœXÿSvx´èòDé'W Žõi×›8K’ô'BöfÒ|e»à}ó¯C»¢#5¡±‚³ÑHÁÐDnÿHáѳ˜ƒûƈ»r¥­­M¯Ë,*RE}êZöððP·ŠXR‹êLUVY^NÃΪÎÖÎtÔœm7w7?±»ßúÎ1ã-­¨­ZÄ¢ sJV "PÙùÿЈ©Ý»½ÓQÞú¬t¹Ö®ÝÛ¶ö|CžZ!ebÄÆÌÈÈçTÐeòQÝ^@ð¥F©^¯eG} $Ö h1gÚK_Œ×‘Ø2üá7½»Aè± ñ,'p úju•(IPpò¬J#J§äùüÜÜžóçž>}ú*‘øæõë)‘• ÑšáÛë-¿‰5è¿­7nÜÐrs (>øi…ßè8eòzŒ”F*mЀ™€À9^“ëÌvŸ§Âj­8ÞZÞ¼V·J•âIÂùyžýíïi Þew€_ yh¹y×m;I¼‰|²‹ÄÉP¬'ñI´„?¤˜ObûèŸñ³ÓÌ‹µtÛwÿtÝé(Êžãn1’J¿ÔMLimUJ"¸Nb1œŽžÇëD~¸v׿@vΤz:˜òÚ^q»ç¬ò~ñy(„BP–°'»ƒ¶ž0¯X®åÌ3çLFfݪÚnïWïbÌ.U‰z(Q¡q#7 _9Ú_v{_œIŠp^ 'îï EÀ|°»‘#'t,ƒ6X[“ú‰Ó"î(E`ñN[Òë{vÂb\¦‡¤À(1,õnkqûéJ·Àið3›ú ž}uÔ=é´w‡ì¶Ë~ßçmG p)%@S`?uq~þ¿Ÿ¿€KF¦5ANÐíh€"ÓBÞhÜt8LÉddôþ½NTdHX«Õl–nV¡à1ê‘ôô" ^B.à“%“@?²žBûN"ã~T¹ÕF¾~*Êu*‘ƒrŒY½ùO¡®3ÈÂ=€ì=ÈÖ…:z‘7Š‚ÃTÐçL#=ÈG^úT×Ärš…J5”? q“iú eÐHR†ä7Ifô=í‡t®ûX23•ÂêBÈêNE‘Qp’Šæ¯X†NÃ.."UˆB ,Ì {‰Ò½ƒ—`ô„\ S°wß%ê:[:݇ìÝ•õ’8DÙ›e!@xž/**züø1|qr’’ÔL©ø_[öꟀ`k,1âzsÓ–¾?ülè~Áà£ÒÁñòðø–ÐXEd¬,àq¯|øÁ†ÐHnø^IllËÅñ’ðí͡ۑ»t+ÝËßûr]d¼0r¯,v§4|³rh¤hà‹â؃‚¡G%á;æ¾k9-®•u?_µëP~MÛòç®s¿ß¹½&z§<4¶ahVÉ‹<,¼ô`Ѷ& ÇiEêÔXä7¯SŽN›¿¥§¯FR+a{@¨÷œ«:¹}í‹E4 PÂnߺ헿¸µ4© ¢²V—3qfû>ž9ƒ‡ð, ÅŠñ¾Ò…UOFöaYºyñÒf=ì2bÐ0tYéúŸw‘×Aèý> î("‚8(?-™“^‰ þW¶cò×Mã7ò^©€#ƒÞø×/¾Xø„ü·öÇßÿaf:u¨¡q]I)œj¡nC–BI''\¿e>áHÍäŒ:=“«[»mýËü÷v4[÷·o¸ìjòY㞆Xwý`wy´­fع/Þ W˳*Öaw[:jcíkFUñ.kÜmôð—;€l#žšaWy‡u ëà€³¡·sO¼cÿˆ£rÄ _àã]|Ìa9lƒÎêÁΚ¸¾I:Á†È§ÊÚaÀ#±Æ»ëF<µC.~ «¬ý(ùÇ4gæ·Œ¡:W¤è«Zü_j‚Å›5Ÿ˜5™(– X´F‰ðr„ÃÕBˆT^&‘ê]mÕ§Ö³zŠ1û´W¯\Åó„Ï?øñû¹¬”¦¸cÝ ûl̉Sõ  ¡DI“M8u¢´¬¨¶Éf< ¢|,«ËMﺛPrÆ ×SZÊd4UVT ‚pýúõ'Û€KIž~<%.÷› —²FŠiÚe Ø:EÞ 1ñÕöDy¹¯Vy¯PãVìnÙÚ±:z­.Õ~^±x JQÂØã¯õ–•¾žË«±æ[·nÂÆú釽‰5Pœ¡ñÛ&œhÅ3­xºOÁ ˆCNÅã­8Ùš…“ÃxúNœ]1>“M„ñ&Ž‘@M5É|>|ê 3âèÂ\†1Q9ÓrMEZ]yÀ˜4½Ž¢ÊLÜ”ø!~ø¿J¸Cb&è#2’± ÜÊ€X cA$Ä¢(óB`hžŠÑ´*᠓ȱ¸êUÙ´´&¡&-uXîÃbèãKíQKõÏ/ž#¼!JiYzï⹓ßÙràùÂ>¾üÏ'™§D+›‡%,ÈŸžn_Gs–=Ò¨ð{çÃÒ‚àÃðX€PPô—Ù H!¡Ú^{uâ’„ `¹‹2‰*¥C~ìs_ÍΉâç^OÝÆgYƨ7BÝ(ÌÏ»õÉÍÕæç7íëj¼ê–Á³©›­íÀçZ½ù[ÅPï ý) ¤Ž¢Þ$’W¦Ðb9” ž@ÍgúÜŠ¢Ö• !N”:<½¦¢Ñ@Aýe×ìo@áY$¥rùg0‚z(úR® èìªÕ<”BêÒcÔ–Ý:J¢™Ó/U°ùù¹GL’•ôUÃîâò;˾ÆlŒç—wKG×¹ûn|ð¡ÇåÚùêN6›¢º‡¹Ê?‡À ai–Ös ÃP:rGç°Ã:ðÉë®ýšëzÞnŽ:›†<ö˜8E8¬CŽºQgÍ`;ï>)ïïªêwÔza@åå ‚%ƒNà–qWÃ`çÁXWmX]¬ë@œôƒñ±°ª¬™€€¢œ<ìÉ>‚ëp÷¾¶À* O# m,©* Zý²Åû¥&Z{À$k\ë“­É èƒ}¢Õ#,›Xë Ú܂ͦVú‚–îC/Û‹˜0¸€d>ÒH³8sᇧ÷€pÂŒIU¨…gd)–Êgô)Ú±·ü'íísQGeô V¤U¨ ð@€¹,!$ˆ/‘ì¥G²HtFFੇ¤Å€b{f½Îh,bõ¿UÇìu»‹LÏ€SLŽIO ½ÙDÞ"НΤ´¤êà°J¾ðuÓHHšz±ªÞ푪KJÿÉ~¹ÆFq]qüJH–Vi4®f4£]-^l®HcB<ÒT ãà†µ1¶yš7²ëÄ…âÇzí}ÍîÌ>Ào¿Ö^S’öCÕJ-jŠÔD­Ò¨­Bͧ~«T(‚bãÛsׯÔ×\ÑÝ@i¤§i_š1 {šózšõ¸«ºš*:éI¯ˆìH¿g[ªúfZàÜuõw_8Ô¤pЈUÊÔ˼F‰.5 —óê€"ûÛC%m`À!`$Ñ +>x<\  Ò@tµ‚õÇãûBž’‹«¹ÌŠâ³re$Ò#sÚL=&æL}]-ƒZ”eÑ.pœ$Ñ@Æ‘J’O´H—ê>WcÕ[׊k‚ʱ,–8‡Óvû¯S± tëä3–‹xµMþcäPIž Ã‡Èø1’€UŸ£KžDz%™Î!ì|z–ç³x…ÂGê™Æ}C™{v~“¬ÏÍUú@AÊBA…’ÈFñ¥ÓHh&i.v°œ*)‚“a± Ü¼yóy7ž:ð‚XÏ<ž¾3õÏq ÄN ö–=ÿR÷®É©-?½½cèó’ÑÛycw¾uüxÉÞNÜ=8ôÉŠ]•X”˜Ë¹ÎX Bú öž?šœ/ÓÈ<“,Nþv÷îÏ>üÈÓì>PZæÌÌÂ<¶BEåx‘ålX,ŒSR$A°‰â «*±ÆÐñêæµZë˽®ö=WÊe6¶Ÿ/è2vŒLœù¢µ\V20owbË[Þq:~u¦f6v…@= Š †F‰¤ù+h$Í!f8Òý©P‡©R·Ã÷8jÞA4J&)˜*®S¨ w<ôHsñÞ£o®%?ÀÆ­ê“R^.ò[Ö٥ОҪ왬œ#Xï|pö¾×cF4˜ÍÔ¼iY÷›aï+§ˆ@¤_Eõ—ÑY7òÆP|…(þó%«¹6‚]ôí±A.w›,c v?xð`n]émž%ž—¼ÿq@c6ûlææ¹ÿÏ{PÛ©Ì »jŠu#mŽFF(T,Õ} Hëá6©¼ÕŠYècž8O_ýÌssa …}ff>V™«T%Ì 6Npî,/MþiÛÐ_¶ßÞ:úÙîñ©½Ãß9Ù6:u0ñùÿÃ~¹ÇD•Ýqü&›˜L2ÉÍÍÍÍͽ97óÈ ‚VÌ‚ (W­"¨, OE”q@ÔµU—× ó`0€¼" îþÓt·¦‰é®¯´‰nw»k·Ý¶Ù6ñÕmW»2ÌÌéïÜÊùC³Íö=ùåäîÌüî÷üÎù~~uN…0Âj9F‹P¯g‰4–G¾¾óúx´^ä´`ñ×/oÞ¹ëíî©/vµ ñyúL‡y–‰aÕ8U/ùh¹Oœ¶;’׬–ʶgן@ èhìTHÚ^7vذ ž³2qÂ[ôL––BmÜ{›ŽWÊ}ú-”V 4ÿÊ%úãøGhñÈGš‘H'òõ£Ç™û²%-h9è;¢Lµ”w†ò­ìªc”ç2å»Lhìµçå꣌§”êxÅë4¨íû¨ Vª{‚²_~-½˜F±¼€DI+(%å¶½”ÅA¬ùeݼëÕ1Jy®’_OÓÃî¬áÑõëןÓ—G‘}i$2ßúð&Јš_Û£§ºF(× ¡ï™I^–¦®Pý£”é,¯Ô )™UkׯÜûû—ËsŽlВᘟ#(ò«÷ÞW*µZ%Â!KÈrûS§îïŸøüÍËŸî¸úñ6ÿGyc¿ÿÁñã¹Ø3õÉÑßUøï²‰zZÔA*±¬I†\ÃonÜXÎ!@ÅNä·^â±Èˆ¬e -W†àJ`jæŸÈ—`üôÙ³O|öÞ/ßæIKÝ#ªÕ +Ѭ© )TmŠÎi¨*µeö]<9ø¯'`õ`ïH^ÐåÂ^¶Zp§g&²€äKB|wv¸gM¦5Pã"‹àL0Üþ´Œ}õNAh.¹äÿ#HÈpÁ¦#·:éhÂøŸ¾ÉÙ¹N%ONå*$FQÆZª}`e*¸B¹`1MuŽS®!Êí§ºfœøF¨ª‹TYÕh£Zú¨Îiª½—JÍÕrp÷ÑQÊU*8ö*µJÁ0±qTýÙ—vóŽ ÊY½Cu\£ªkYø .E¶®®n¡±Z¯p%b¹P—>ÑÇnmƒf|±Uqœê¥\³”w‚„ûhäò0ÑIjVT!žF¼£Í\ê —ýî’çFlúñW¶¥¤zA&<ÃÆ7ž¹Ÿ8öÛœ«Ö}š1ýÙöÉ{Yã÷~püx.Ò&î§O~œ3þQ¡÷JíEÁn©8ÊL…¤Mñ õ.~þàá`P¦‘Ð’²C…":̇B¡ÅÝ5ÔðÂNÉþš›,Âó¡ÿâMž >üÇÃ6KË–M‰´B‰À±e|æÎ##m™CMyCM@#…}õ@ G-$ùÖœ¡æìþ@‘ò®ú‚ÆÊ踤9ÀY(4’ë'LEŒ’ㆃµ À,2´FäuHTñ,bpR5ÏÁš]¯•”¼–U"£è𻢶¥®IÞ•ôÂØ¹&e«.1A\ÃFihIM#-ƒt,©CHä‹O‚%™q!Y#$ö÷^ŠH<‘#! 4Μª“$øEŠ”Výƹé Ä|'+º­¿O•ãÉ*쯄¸T¶K("«r÷öñÃáHóŠcEn~ð¡ÉxlÓ†x¨s…¦%–(Ìa· :C§x§lëíàõðì9< éÃWá‰R<{²»xP¾¨Õ±4Sœ|à?ì—kl׆„dÉÒJ£Ñh4šÑ¬vÖZ³Üb«6J!44vÀ„€ƒ7ƒñ…‹ TFJ¡¾€1ÞûÌì¬mÀƀͮgwmêVM!ýAó£4¨&Ü …4mRh•Rnkïž~gÇP‚ºR‹’´?rôíhfvfÎ9ï¹¼Ï'¯îPJw™Ò]®xí$åÏ—ÂÁ r<ÍrÒµKçFŽ œ|% "ŒàògØQo>–Ò¤m Ã@„úÔ1M„êRʺlN]ÖÅ † UÛÜkæK˘h†1-Αþ!kXñ``M%B0À‰µ´®=ô$5?¡?ˆ î<îÓâÎÜÙ…].¬(øÀþ/œí7;Ú°¦aMŽwøåæLã-&†þ¾U¼ï• ù€ï{< Ïæ²Sdò^ø¯Ý¼[GrÒ~Š´w‘ÓÍÑ–i¬H‹4dy7nÜ0z“HáVò±dí?/‰”Dø1˜)]¾œcàó¬…± æHíGòRŽ’Æ<§WóBÖ3`”iÁœy¿sß%(2>7ü÷Q&{‘Ú¥}n8A}†µIÖ²ÞÓÅýÇ./>:Vº²"üÑ«¡³E±³ÿsüx"–D.êWE®U„.V;C¶œ%Q‚ÝFàˆ‘\A@rfÎÚÖÐðÞñ·oß~‚*‹1o üˆI@&‘GC‚Pͤhd4SñÁè¨ÍfcYf˱Ù|yWKIû=Måw•õîªÜ×ZÞ³Ëq¨íµƒ­$ëzvÖ;2³L`ñ,@K|Êp~‘× ñЇ O:4É$<Ã@ˆ]R<—ÇÚ¬&ÖÌÓ”DÛÑÊÚÀS`óo@Àƒ¨Dj‚ 0fTMjOa€Y¯x`¦@=܆ªÚÓ¿þ é~"IIŒï‘HƉ:D²’• »ZGCš`:TóñôȺ´nÇ_O<L9¼hZR@ ‡¢1ƒ@òK6ŸX$Z[]3kÆLÜ Ò¦D½Hl¢E4Qy·}ÅüQ¥jb¸°Ç0@B5WãÈF‚:ÒVZqI©³s|& ™(,ÍyÑ÷æÞ.Ç~m¥[-uk¯²Ê嬨½ û…,22&‰_/uξ«ëmæá'P4g/²"$PQx«Å‘õ©c: Ù‚c›‰Dá*rÚŠÃõÞ"5@)ñ#;çši‰•¬Ð-fJßêÕĈ}ì6€`•ø2IZãîÀîvÂ-šöÇææ}¯/«ÍË){6W¯,‹ÃG¼@5§wï¨Î·µÍÍMEøö`Uùb—Ë Úì´‰Þ˜Ÿ‡x澦VÍ™ V]05ÿWëÞÆÚ~,·aOûR\¤yxöà€Œ•ö¾ Žr{¡Æ$¡ï_Ú;fZEZàžÖmÁ©å†ÞòùPùkÊ‚TŽbhÁŠªPPG ?ÎÜaEÔäE]GQWRbHþ9©+؃Ôä;Š´AÔ ìFþ0R¡Q¤„ÉpÚ³?†|=™Ek8†Ïâ2sö–úí†÷LÄÄqòþÓñH2 î6‘$&S’¦é 8Cežƒü(#A4IO#ð¯vùŽ }Ãä­îÃÈ݇:¶ÿ(Þg%NEgЦ÷Nü üÐMÄC”"Æ ¾:ñàÏŸ]·Ùs$b¤¦LNšÓØ•Îý ¿|ø“¢óËÂçK"cK#—F>ž?ø§Å‘?,[¹øŠ~vaôœ„.éW„Ï,94ºP¿Z _}-òQÑ‘ÑâèØ«ƒ¾.) _ºX¾áÐ/­Úw"omc†”#ò¬™e`V@ˆ4EÌÕ"˜ÆÌ15•½>»vzžÊhðC³KqZ  K?9tÉ'.W ¥À0ú,–+ïíXvhϺžÖ’Þæ·ú÷8ú€@Z+µUÜUÜײ¦ooYãQœä%XÚÅB&aXE&ï@ ’"†f&Ÿ$ô“@530† ÷/¨x" H3ž4j|üƒP܇›Ó§Ú–W:~¿ÿäÉ“7oÞüª œ¦Ü¾{oáË?°‚Ós,ó™LÆÈ¶%8 ž[‰R‹C›p¬‡6à(xqÖÄp#Ûñ@5Ž­ÿe[Y®@³´dá¸Öæc,îMÎW@ž; 6Ÿ06ÿIÒžHKì>Æw’‰FÏ´îlZV¸ÈB1vÁ"r˘E^ÜhÓTž†’+R›_¶½ßRŒõâh=¨Å±-i©€$º‰£2Eš—8nþ´çåU>­ÔyÀáô;Ú=å.ßJâðì.iúž9ŸyS£sêÔ)h¡®ëd\`°.ƒÏÍæ©¡ÆWRŸ­KF6ãè­ÃÑx°뵄Lbµx° Öà¡ú´í‰žp¬n¨®À*è0Ó9j–%ësçž{`%îqc8÷—ÝØïJëÚÞŒ{ºÝKf†6Y¹Lxñý­ä-oàS—g¶ÀMÍ`Y÷Úš»þà8|PöŸ¨ßs†­Y£wԸ콰µîÒÛ[á„T Gÿ7Œ²7Aº)<$:µã••65ýMqb¯ û_*®OZ[oµìÆQªòW_ÇáÒ7XÑ’KÑŸ¶ž“~7ÖdìvaŸŒýî¤&'àEHIð8'È¿ !“€òÛ¦¦ç,"ű’Eâ3©çf̼zõ*dyí¨É§ËR¿+ßv!Æ7@bÏž «RÍ,ÍPS碆w¸û h‡Q_”IZ‰!-”â¸Fj/%äÚXÓ”ü9™KK,&–ÿ'ûåÕ•Çñ“˜˜Lrssrss'÷fîLFÅP¢®1õŸ°E® ˆ…®µ¾•ˆ<æýD¡€‚ÃÌÀ®ÍZצ»ij}¤¾‹ÏÖ¶±ûиuŸ*0³¿3lu;MºiÿhÒ““;gîLÎùžßy|??Y=©°•oUr²ˆ1ªØLnd9ZO!ƒÕ6"ëET7²ºiÛ ›‡‚J‹ŸRŠÝÞ¬V¨“´¬c,Ëê Ѭ0±ª@(ôÿl¼Ð¸Í‘„ÉÉßᔂÒ4AÁÌ[ƒl‘9:ÝtvßM#Ž~ªÜâ{©lˆ‰¥4OZ¼<Ë ,¸ÎÛO#0Þpàe' dììX…·oÛ!R q’¨Ô.Ê-ê>ËýWT»¾Ÿ=pgÁ±+‹Ý×sü·r½×7´½7«²iöÆ}É™›æíLßw¸ÜsqûÊ2÷ÕŒÁû‹û¿Xâ»ûšçF~ß­U=7–õÜþ¡h$«ç:ºtÕbЦ/OU *&ŽÇ Ä"‘ãÔCÂð/B„˜¸i2»zÑŒ3ûr´¿ÜM|@B[¨Å{Ëcº? SOi’Z)²¼ZfÉ)–³-·¹5·Ù–×d.Ôœ¸òÌÆü†œYYÛ±ŸÁîëJçÎaEå4^fxöÜÖŠ@kKØl"0ôaW˜ò€àǦb·“æÆgËo‹Kt«‘¹Ïk눡™Xœ×Ô$Klጄ‡¦æa£ž~ûëƒ öPÖʰÍAÌzâP±›žaC('úFªüˆ‹XÄd 6ÛíÖ¹§•Ëk°ÇÍêdE&ÅÏ4ò“(c™KäÒ€;vzR2Mâ8^…9FL@{ ð€9¼H\ßåÂ.`•nd§>‰œ¢jæ4Ž™´"™ŽÄ-ÊÅ4Í™ÔÔ© … âÑè¹ í± çQdoG%%|Â/Ðî:¤ï¦Ôê8>P—‰Ã,Ç‘ÅKiÄä¡O{ JÏQ1¢Ì3«HKKyòì_p BF6: þûëǯÎ]ÀðjKJ…bI²ôøè¯É@%éÛHú«ˆé­ ¾M¤¯œBˆ?BÐðn"¾·VëKóËíh®t;Ò΃£däiä#øùŸœ>ó^CMmæ’åj>N •RTÁŽf%Œ%–˜ç±Ä€ýcž™*áM‹RNlÏù{[ØNŽo ¾RZ{KHÿf $Јåþþ7€ –½š&óJ§`¹)·Éšß|8ßh+ÐSÉ7´¬5¹Ööd¿9]©£c³X–TOž<‰Fæô©wuÚø)Bœ `!°d×kÓHßv:kpj7å´Œ­´á~«$Þ1õ€Z˜EO%¨ºX—£°B©ÓòÌtž¹¿³š8[ˆÃ2j®'$f ±;c¹9ðƒqu&ÙÉ‚"EÄ{Ì{·ªêÃÝû‰ÅBœ6b³³á¡Õ²6M§Vr°(©<þÊb æbo6æecÅZ&[$3_ÜOÇ5B·–°pìÞø£Óˆ‘VGý’€Œ€ghÅ¿5/íªž¦â¼B§Äï”H²³sïâ_²ðRRü©±žØ¬assÀj[":Ðâ´Æ}íÖayd0g%Çs*̰l² «XÞ¢ÿ)Í,'®…Ÿ!ä§Tàêk… $_pG…F%+¤dT]¬]Hì½ÈÞ›FÀˆÝÈîFz†~t¤ /͆פ"Crõ£õo‰bІÃ`7 ] j0Ož5_Jœ~U¤â§bA‹uh‡™º‘³YÝÈÔClÝa ðÀíÍÙªëâtó6ShE¼¹r3¥áP$ ~ï(„€CÂÏ(ýõ/i©)kÈž,NAuFä tDdÌè¥JbÆÁƒœ€.^tÄ‹,H?ˆ\mÌ+³¡+ Ãù××ÖSùûuÅ™Ç|“M6™L&“ÉLf3»„w90ÈéùJ}Á­¬.VA„R­§õ¥¾@e÷äE‘—Ý™Ù]ô̵&íýá%=Ï\U”A©õ»¤É%Å&ž­À²Ïýž½×mï›Ü%lȳÃì<ÏÌ<ó|??¨hgf¾CóÙ×ó` Ì7^äî̇å%–RkY!qG•^º¿Î^#®Q½2š­ ¯ul‘ôþ%)»˜æ8ˆËhÖX+ 4®@aÓ*÷÷þÑà3ìð=ÚîÎulu½)d{mrg¸†s=ã¹Þ‰Íž‰uò—«å¯6Ê7È7KCÙһ囅¯o:jÒmÞ“¬ƒ¡’/@VЇ†@‘QŒlÌÐ,Ïi’wtõÞðÝ‹ÙÙ™™dÇ=¸'Ü៻§°sÀëchf2ä^ò†åÝ 9Ý5;/Šìê<­ï®ÕwÛw©4²ûR튲jYH«bɈÏËŠ98Bà‡¥ µ4ã‘ÞV¦\¸Ýú7ãÙÜÄÄ8ŽÅ++Ð$}åw×pY‰…¥È\û™ü_ls øÜÂ+»%QÐ$ ÇÊ… »‹hê#œ×¦°µpôaB8¯`8ûˆ#ÇÄ&ŠŒšZ¸–(>I7e•"qø$Ñ~•ØsŒT³Ñ,ÍR¸HUêˆUéD}7ÎýV‰pHÄyn[@&Þã„1\&.\%Ì>¢è! ª!©bYÙ:U|> ñßÿ^#¼P?›yáGþ6K“Hª£Vd¸ˆ·² G'añm`¡Â,cl8Ã“Ìæ&ì>Â, nœ ÞÓTŒA§NLˆŸüÇóiH¬¦À pSð­A!92÷Õ£ô%à‹×$cp~–.§L„Kÿel{ð-ïðFex¯{(Y *¿8†äYžãSòÊs϶/.>IÅÿšcy¥‚R"-¿¢¤÷f†k4Ã÷d½{4KÊQî¿)lðNl‘G3]÷ßv îpßËí¿—íÙª<„î6Êcë¼c+•‘eýwaÌÛ”‘]ʰ¡g0íþ…újí¢4–x–Ö²RÇÒPWjYF a±S°j'ffl9\U}ùR÷/n;ùôðL~™Ô0Ÿ×§­Ñ J ,V¯}/ßecÖÅÓ;{j /žË¿x6§óLAO}aW­¡ýLAw]j~†F`y5Uæ­[·B–²=#8èšüúŠ”¯ÿ÷fÙü6ûãÇ¼Öø¡“O¦Cö̆vý#cð§:h¦»::i´ÇÂ;™«þ{ï4PŽú‹pÚzʃé8„¤» ˆc¹ô©ûƒ·S9xsE! æ'`O§YŠÒi´¸@4ðø@qŒ|^¤À©t|4èxŠÖÑêõ ì©ì_}v4óëÖä­FR’Ëñɽe¸/©g}ÿ !ßûH©FJP#žR$…MNRªã(ZMŠ<ý›ØS~£>†æ}½m· 4ÒšwÞ‘×dÝ]w8½$Š×0*4RVV7nnŸ{ïÙ·Ï7mJg DREÃæ%“߸>@ȵ)x s q—!yØñ¸YµOÙ7ê¬Hâ)0X4¯#òfåAd3#[£ßÚˆÌtÞ.ÍoΊbØHŽ?‘¶~¶ÉŠ9Ñä„~MTÓê@VǪ/¢¨žNu@²V“ ¦ò&>:ufÖX‡pŒ9ÐdDç›ðñ8ÍÍÈÚüsk5µ ‡¿år4|ÓT I†…áhJ•DSJyås#ŒÇ:c­E–:|9Öö~ƒþOÇߟ27#‡Ál-0‰ÕŠ,fd·LEà7Ë“†º‚ű0Å¢XATÁC×4Z,SÁ’MO…ÎùЗô—íy›{H¡ –9¨(c4º(†‡@¢Ö$'έoø¸s?Ñæ#l„ÍEØ[!ˆAÀ‘$™È‰ª”4Âa#Þ=±ç a‚ƒ¯¦®ˆ=ïDRl,¯ {–¤-„¥—pöönÜœ¤]!œn_pc Šl ÖtV±uF¬ÞB 11Ž{šanÝø3,¸þ/j›žIàÁÑ% ±ñ4§¥RÐU§‰6‰0{ƒ—ßKXAJxaïƒLXÜxö ©L6AH…bã)Ž£;.u¹„üÓÓø­ †ÃÑüƒÀ#Ÿœœ\œ”$ÀZNÑ$+®Øfûå;ëä‰t)lúg¸†×xÆ—zF²¥;EÖk$·!Š¡„%™åŸèå{ËÝC•¡âž+w14+òÂ.Ao¿žë}¼´l4šse,K¹û¦4‚y£<È‘‡·K÷ôÒ AÔK÷õòPž<²UÎ’F³<³•‰,÷—¹½ø³Yùj£ü8Sy¼Kßfû4­Ò—®'…hÀC“–%,,ˬ–¦àÃP4ÀgXH@ ',K]R´·°¡ö£«ãg¦ mѧ_W/PA¬À‘ÿd¿îcšHó8€?É&$$M&Íd2™¦M["t‘ŒË.œž/貸ê B·HQ)ò¦È"§¾-A‘·¶túÆ‹ Ðé´S”½½ûûî’»º¸‘Q\owÏ?ö.—{I6‹¼´óÜï©JTRï6ÁäþØÉ¦§Ó§ÏÌó|??}êšBçYË•¶Ýýg÷œ· 4—· · _ 4_ÜZ’ #n2ìõëןN‡Hø) ^¼M/%þK+^´‹¬Öøä» .—ûðR^Ú^u*zy êŽEžÏÙù®š2ÐqŸwZ°TM2t¼ 8i ; ²¾’$,hÁgÁW®·­×ëµQ=€o]r¼‚Qsº:Q«L —¤á)XYF¡fYÉtcnúïßõTa©KǰÈ©&öÀ<xäµS㧱Ј¥Rq,–‘n@?@¥"fô“¾Õáñ £²ÂÓ²99ÃZØá5wòf{×þ6ïA«§°£»Àá.èr¶9ÌÍŠ€TÓÒÒ#áÈò¸EðßÿýcažfN-èøü4Ãߎà‰_a$à"ÀÒÕzòbõÇc±•aþ¤Á]¼Y§ŒW±ÅÊœ k±Ý1Ïw.¹m¸Ë†®XinÐéðLÒÌgõgˆ@Ú/`=ìx;†ÈîvÊ-ÍØå™wz½ùùà–8˜¬ÊHpà¹ýFž®l³b;qÈoïhÁ<8Ä&Ãu^·F<½2ßA#îfèó'%å ððœ0ʬ¤Äï:ØíÅ®¶ˆí\ÄÛŽA®îÅŽvìrÂð’üFvtÈ]Öˆ ®ÓA(âr=öôV§½ Õ «Vk(&Y¥«®©!7üEyYýË3qU¦áOÛëÞ"ÑýÉ[.¯ Òò §2* — ÕQjª?…<±5â §€< ¹ÇIj÷Kć+ÑÆí”B§NB½¨;„Ú.#4ö¡v~ ½–aY…NK+ܲÔ#ÇIÿn¸ „Z/#/ÀeýÄ$Ž(THÖ‡gYýhÀZ<(-KËja!¢ÕtjÊú¯¦î…_´ñÿ´ÉXž_?~\VV¢‚ ‚š.ñŒMˆ¿„Ü!ä ‘>xFÉ7D:k! 2§ŸÈÍÚ‡ŒãYNËP4½k7ù–„A¼´YZ‰&¨yN'G«Èš®â¨”ÍÅÂdNèÁnqf¯p'Vú»·M¸¿câë¼Á?dä•«XHoŽKL)ùÌ8|3;0›.>Ü,>°üæ+Ëàï©MùÉ¿°¬):c¾2¹Ë7ý> '8½Û?µS¸½ZÉ•È×|Ï7öØ É¦@M¹â]£ÿnÞèô¾‘;ùcwó…Ùÿìéë,ÿ½ìÑÛÐÆ»ÿŽQºÿþØ]Óù¾ŒÒ_k·™ú qpƒY’pj:–„hHàòÀmð¤²ä%§‚‚WÅr™[·­3¬tA8›™—U"ØA#9ƒM»®|TÞÛtðòÓpk^€Ä4xÞÜ!³4ŸURÉ’e'''ñŠX‡eDùs‘_Ø"σaù#+é²ZÛJŸüˆ…W–Ë'B~Žº’¦)j¨:ûÊIÔª ?Àp´9jqàIU¡œÀà·'o8ë>ÜšÆ §d( r”˜¤bXJÃÄ­ÕÄß¡m¦ô/Î-õŸ!—ÕŽa?ì ‹J8ŒCeX„ïªÅb=6Èã8T‡ƒåX:„ý‡ðUHü*ÒÌWJš…jq°6fú‡Ž‡ÇʵV«ÖAÞoys£ÍdëÝßå(´¹Íž¢Žî"+_`wºx³Õ}°##%UEÑ`ZŽãž¬s ä`‰üýaaétc#TH¬"^§ÑÒ´º,CýÍ`‰P‚¯Ö`±†t5[G'ˆ¯&`âkÇñhñÜhíöJI3z,0qâƒ?Øl¹$‚c§9 >Ö©”ô†³Øé®Žþ"öðäS$»£‘ÝçëlÇ}=ó!~ºÔÙÓ¯­TQ25XÅÈ$҉å©Ö•r½.fîŸ ¡wùÆ­9¦3Ã*;ƒ=O¨/‘Ô”„HôD#”õªª¬áXE›ÆRrõŽ*wxÛЬ¦ì ßôNßD*õ/óŽ”Uû~·58Ù¡’^ÙÇ«­ÞÍÞ±‚ЬfpúµÞ%×çr½3y¾ùüàg¹¡¹’Þ mßÄöÐÌ:ÿÄŽàL¡hAãŸ,ŒíõÍ•ôÏî MøG‹ý ¼Ó…Áù‚Oóm‡ ÿ, ‚n`f¬4ðp¿w¢Ì3®õM•¦€@àmÏ‹jRÕò®5- u­«÷ÖfnÎg T:+U14lß ¥¤ÒÔŒ>øƒ@E.W¬‘ë.©íµv5çwÓõ_¨èlÜ{­©¢ç²öZ\¯•É)ˆoð¡©9·„a¿ä<À~EDw"²…¡7žLÇ’¾„£K8²HºÃKÐ&––àn]•Žtú'Å.eI›Q§q,:Gœø-ñ›DÒ’d !Ç3ÅÄñ1±‚©K¢‡/B{b8y‘¬Ñþhxø·nÛgõ›5 ³ Ü€j  ë(ô  ¨Hà öWÝ÷O©¶ÿsõèo UJ–QQŒ‚–o9på@§]ÛâÞov~è P]å&—Î`+Ó;*,{¶©(…8ƒ•Ý»÷ÉÓÜ(žÊü=yò$Mƒl²à@¾§¿_@¾Ì ܇Îa_ͳکÛÀe2”p™å캄ӈÛ.cs'nÞž°[ ð·Í…ÍÆ]¯l¦8yÙ¦q— ;ù„±)Æ›#mØÞŠ]WlÅ ,³,õöÆ ØÕþÜ(¤Çn'˜„“&A+քͶ بàÀ< ¶`Á‚]z?®Nl´c§  •‰8y¹ Vòj:;zêÄ’ óBƒfM-[A§ý¬î8vvbCk¼Óµ\Æn;àÄBfq¹¢ð—o·-¬—v®€M1ð i–®¯¯_XXøçéy Ú_”oSIF¼€Ï/c!`É Í aÕQC !kF[7z?ˆLþ”ê,xP[\À`¾(µ©cY~9ÍePr .ª=º>@úNtÉNœäØÕRµR‘óŠšÎÌ Ó$ëäHwµ…{5{ÉØCÈ@í!ä;…ëHð!g7ª<&ç²dR)ÍR«nÕšµ#wFÀþÈ"¨¼þÁEcqL¤#žŒí¢0à8°H_ëñ¬Te° g´t%ÅI³s‘Þ‚\¡g¦gr‘Ë‹Ÿ¡¸,9%Igéï¬ÌžŸŸMHòTö .…Å~Pèðð°œaU,äw”T¾bkÿëƒ[ƒK‡æ´Á™"ßdJöïðÏUôL…&(†QÊ(ZÊlw|xp`¦äÚˆ60Y60µ«ÿþ¾¡™¢àØNÿý<ÿÔ¡Á©×­7µ¶PM`¤8pwpª o¢Ð7Yƒ1šž©ß¼Æ?¾{hv›g¶40Yä`@÷!´{‚ÓÀEƒ3äÚ3±ÇKZP40 ðóMÓÈ÷‚Ÿ¾˜Óøföù'+ãÕ}wK?Ê»ØSy^UXÅ®×HÒ×P¬ZÁ)H Mg8šISf+ŠÏÖê2è¼M{Þ?w°[_ÚÕx¨·yßÕ‹Úžæ7­õ´œRP4x{q~9Qp‘€"âDå '@MzÔך•ˆD–žïÒ~õu}‚1H’,A˜$uY 'ý Á׿üù¯·î~2|çîÈÈÈèèè­oݹ}÷ÁØøß¾ZEE2"ô§?|öðþÈí_þüá ÛÚjmi|»¶ê`YiI¡&{õjN.c‹étÃ1R‰’cJ¢’)dn»Ê¢{ùsï)¬ÅÁJì¯ÁÁwpè‚Jý·)0ñ±;ý½]¢6•\)©Êèyô<ó4ófgÞû~j D·°Š#€j಑)€l>Ô 89…Þ.çâ_S´\“yJ°h=Ó2{ñ(EØ'û!lÇ™xü¿í,HFæ97eºNÐêRÐa²¹ãE)âEæóÈtÙ8iÌ9ñº°U[Ÿ÷bœ-s¿3I˜™dôY4îÔ'ß25-œû¤§cLô?ß°÷]ßµW(ÓÝ·Ò×·Ê2x&MùœàÝ%î¡’ÖÞµQ’‰À‹¼’q°µ°¥§,0œÓ9¬ñ÷eœ½’ïï)òwçzÞvýUN+ JjÂâÂE5Þ¬ˆå^vðo lwOAàA®w³Êusµÿn¾¿wµ»»Ð{³Øw«ÀÝ›ç½ç d‡3]ý¹¾¯ ÷Öú†€(ЙL÷­—­‘e®;+}C+¼ƒim·ÓÝý¹çï¯ /?w;×" •z{À'‡[ÞÈ/O˜ù&”x’¨Dä53ÍÝÝTUÖrÐÐv¨8ª‘ÒÖ£°7´ÙyªRNV(Ìí¢}òd||ôÂ… ;¶nK[°„9WRJ ÆÆ Ï›SVX°¹ÄP¸6w}©ÁXu¼±Þ {‡Íü—˟ݸÖèºÖÝùùW¯w_½r­«««³³ó 8iŒ0Ÿéõz­–“%YD…àhá£h…©(ž£D¦<•ª°&"ÏÁ!È"N ¼ÈiàAô² }æ1 5XUR*åeŠáãä5³uÜŽ5KþÞ¼K=¿OuoQåª{›xOíØÍb÷•3ã–ànó;‹áÝ鉔(òåÙ;š v{IMC©ÑÕˆÉPU¿®º¹Ôb7ÔÖŒi3Êœ¤ 3[(tsbb”EXtb€hûÞ‰ ŒJY¯h5†…Rijo¢}£êß®zv¾h?Ÿù?Ø·"Þh„ãâ6Ì_¨:ÚUëqÕ^£«USM4ôM¬b³Dêle3§óTÐ8E"m†Ò¯T†N«¶“ýŽ•$¿> >mJPrëÈ!Ü?–Fb½=*è^¬ÔV1~Äœ±šžs¥¾áÚǾ,5埕ðv8û¨öxѬKf†j³`FÌæw4ªuÕ  8ø Z­ªã”j21½8jÕº »‹Ý†ÙL*°Äj¯«?¶*$¢QˆV‚w¡d¦g<}ø0ö¾~âÇÿý‹N¶E"XDðë'Ì+Iè£ýÈáFÍ¿e*™L–ÎèŽ ²P½›Y¢¡=!j&N¢AGLÈy ÙZPCU¶£Ó¿C[¶Nç•,àxY–¦#[:õ{T PB¡²M¥Q#c .E†QOÑìÏr¸^X#–OQ³3®°l¦˜çdg¦¥ýð1Œfè6]ó>×Hd j#a~ë¶¶6 w„à©ËJ?Íó…Š<ƒòË}½ËÝ=¥îI5’å¹½ÒÛ¿ÞûUƹ볳7óI’äÄyYpʪàýÅN¨€ ýÃùÎ;YþÁÂ74Ñc¬‹›.åúû²ÜCÙÞ¡ü¶ë%þ;+œÐx}G‰çfV{h©Òÿd}§'ßÕëîÏd{ïfú‡—»%9î;PV{ú²3žÞ—­‘·œWJ½76BžÐZW(ÛÙ·Î÷äxByÁAP ”ÿ@y°okóŸÞ|Ï$Ê)TÔ DiήM›Î*j­(‹$Ö’R*Ñ9B\’ áy†hf§ˆ{òg^>«þf¿z~ÜÅ4Ü©ºw1ø¶«þͯž?°xwíÉš¡À#c^Çqûò÷8ÖYêÖ·WÚÊŒuÅ5¶bÓɳ£È±”ÖÎMJÀë„·©ß­PþkBÒÁ‘$%N¥œ ƒ_Dîâ¯ÖªŸÕ¶°êûömÿ¦~Û4!Ž( ðzÁ™þåGªíKg3$²…%>Tæ¦Ó…ùþÁƒóDžOÒi/‹â,…ÏIy'uÎëìEã°f¦€åå#`†ë¦0 ˆ9J›•õ­Þ®6ZÆmÕa»qDZ°3f°öµÆw—Χ'ÜÞéŽæG'j f%L¹%ÿ嶪pØ0©ÕUQ5Õ²}C£j4ªv{ØT¶TGê¡5üê@ck-»²Ý2Z[µiFÏkÁâ”êxqÕ²ŒÇß>‹¾µØâ.ZaÿFgÚðKÈß¶W¶}oTFØ8õº=Š KXÁ'Çëu©¨¢YÜÈèŒzcrØ;5ˆÈŇLSV’.æ§#c+jò¢šFÔt½B¤º¸x~†›hx˜…_[Š>¶£“N0Ï” ƒŽŠÉZ ^Nؑ͋ê}Èv9<ÈæCÖvñú“hï$qÁTÌÇÃlN8*±eNfFóé3—»o¨ücCýo`cÉzÄ@8­žL°(Ð8%}xY]ì‚õ’¶Öˆ£5s—0ÕCøðøäÒȿհúÇmãOa÷x,CK¯(‰2åXb*óvÖ­s^Í 2<äµ÷åû³}E®¾ÉÒ9Óy½(p/Ã3WáºÄxN¸Ö½_ÖüÇ­¾e®ë¥žÛùÓÎÁå®»é¾[Óò·ë±òIÎZ¿õÜÕgEgøûuÛDvÇüIH‘,YF£ÑŒÆ²9 –,%Ý@!rç61$^'$! W¶I ·ïƒB{|&Ð"¤VªÚªÝ–¥°ä¾8¶§Ú?úÏjÅçõ76•V»Š´H‹VZíèÉÏØóžÇóÞ÷ó;‘y¨¥ÒyGœßú«fàA™o:7øt“o!3ô4;ø(ß?Sœ‡ÕžiIÿQqðIAp!W˜.òÏÂ)€A¡wòmk¤(8 ðÈóŒ‰øñMçygöº‚ 5þI0•ãžÉð¾Ex”!Ì”ŽÌ{îï®;M)â •YžO¯*­¹Ñ¢½Ñ¤ëï®ìo-íkÜ;ܪík2\kÉ?}P 1¿I4«ä8lGBt*@)"D€`eD$€Ø8–‚øçIø%~…ae$ § ?™x"‡}œÉ2”” –WŸwËúreùÙý{ŸÒ /çUÚ$†äÅ+C×Ì€‘9.bYZl¬08g ŽÀ³-§èx–Ld¤é ¬nû†ýÛ×]ØŸÞ[›ûë“eÿènÀÞ³8t BààA8ˆýu8p û~†Cb_=öVÿÌø–mäçûR … þ¦8ZÖ­o¹¢·9õ&«®4bÚ×uYo½¼ÏäÒu»ªLç ÎÈH˜·(--¿5±B‰®{a±^y ’èfu8âIXMŠÓ¬¥ð­s8P‹}ÇßxœÁÃxôðµòm0+‹£¹´wÅ\¶DÒ9î¦n1…m–‹QÌ}§õM)<ΔBEÈSë"#ÁÓ¬œIå¹Û G^#$°ug=¹&P†ÍØ%²«]DˆÎZ"cŽ€ÁfÂNcØh*OZCI63TMzÚZ•fϳMꜵǶvl‡+ôD„cĦNì´-áÕ†+Cw¶ž°¹›Œp< ]EŒðs,_¸y;×Ñ< ϵ8¡˜òÝšÅ/žF–ñÊ7ëÇ퇷…¿ùÿ®`Áí‘+y…”äY¨AdJ&;Š®z‘óÖªélw#K™ý¢œ£È| ]¡fsLòv˜Ý¤LŽêÎ sõQc£J‚u›%$Ôú-1¥°°ó#ÑT#³9‚¨¼ŽâUJB¶FS‰ìtå6jó ë r "û0²‚FB¨o¹†ÐÑf:)YÊ+À6P«BM µE,Í&R|+çHqÕ ‚z‡‘%R2ÁPó$e –qx {HìÔ&¼±Fœ}Òm…±$C) N*Ñ8·òÙÊrt}ûÚ—–@÷/áÐâ n<Ûù%«5½.õ€ð È7¥>Κ*¦!â‹GÔžÙÕÒyŸw:_¸§ñÎçÜ )UÇ9–WQ’‰ãIÉ;4Ê-yÒ÷4†ë¿- Líy’éø%¡xWEÑRŠ/5K†§õÞ…¢þ?ò, ëyŒü'Ûl¿Ú"Ì ³Z÷TNàI¡WÄFž0·[˜Íñ/hüsaªÄ?½wh¬tx\ëäû&‹sÏdi`îmk$×?v*ÌBƒA+¦ÔËǵÂ\~àénÿã a>/8[rsfç/†î¾5Ëqðç“J*>>«j6 «û›Ëú›J.”õ7W´,ç$ JA3ðØÈX1ÙARV!‘ůßQ°>M³!5sSZÖÆÔÑ&KL"`d¼<0B32˜,`‚oc€±p‡Á 4I*9¸& íâÒªy!Ê ‡Ÿß¿{— †æä„İ#ÉYéªÙ ­·>×U›mÔgœÜ¥jHa Û••é±Õ;T5éŠãê¤6C¶©®À\_8Ý¥»Xðw‡~há=„uøæì¯Á¾°ÿì>†'°ÿ8„ÔcOÖàÑ<„½‡EŒÇ~Ø?øý3ã[¶Ð©T%IRý=ìy×&%)‰æÒö&“aö™×gžçûyö6¼¹·1©èôâZñÍU,'Ð ßž÷<’‰á©›×®1`A\ÂkšJŒ8´«ç¨P•*†h&°ÍÂÚiöMÆÝm ØÚøB–µZ†jŽ ÖÕ]­©}ênŸ²I„–VR2’ýi„ÀÀ!E¬­³@‘NÏS[Ë—fÛàáÚ^SÞP]-v»É¯N),µÌÊMØ)¿°x¬»Š)ŽO¤¹-+×?‘Oa§7Ÿ Û ®Ú¬a‡Û­36KX2Ïš›€(„".¶X°ËEÞ€¹LòÄ-E–ÀôˆãD7\ÖÆŒ““Ï&I…§f^ê1ü/-õƒFþç–)¢Ïï@YfæfW?LŠ3Œ&¾:†QIù¼élWCAN?²»‘§ ¹‚$â½Hò#ÏEäô"Ï%ÔŠÚTóH=«a8=‚§Âw-#xg«÷ö6ßýŒÐƒtïÍÝÁçFÖöÿa¾tÞ <Îð]Ûæ.ê¿›ÜóÇõð ¥>˜œÊ äyEŽ¢9Ncx§Ü{=Ç;jH\ð@1ª°ÎœzþNÜ¥?åö q« ãsLŒ±ªyKßä®+º Ð.Z\4£×­Îz÷HgAï0Ä}š:ž{a"Ó;”°¯ÝÓºÎrѤÜ2*#[úîf)÷²|¯—"P²ûÆ7+cPŒ}` ÿ8)My˜î¿½90²M½“Õs#»÷ÖÖ ù)ÕÿpufÇÄVKSÆê‚s?Ïó7u5îîüh$»çXá¹9çŸmÚ\Y¤gYg9ø°$÷°¥È;˜9ð`™òû•ÁǃRÕqXÃH ÜKSÆÒÕ{©ÑôÐÄïíÿÝìÐ}£r¤”« C1*ãù½7k¼W„ämŒ ð‚Èrxfvžn‡¿Æßhäúà ÉÊññô"Ké&¬–â`å*±²÷À¾2âµ’”Tü¥XìÃÁ*ØCXD„DPa†R‹¨\†ÕRú+ñùRÂ8Ê_Npìʾ=8TþïÑÈcGa,|¤Z CrGa“³ ÉUè8òÍÎBÉ’ÛäÚinØþ³ÃZ‘†ùœœlL#Lòkn¼ûç ‹tÕoöLÍüåùß GST,ÇþXŒÂÊQ¬/øV‚>xɇpðÈÖD‘çbcú—jLyb…\&M"à´8;a{V>‰]X²à6'¶»±k¨)·Øš°Ë<#› Zì¯A# Ø–í@‘OòŒoÅð0L-¡£¤÷óþ*;*Br€;O].®XÎs‚–ÑSÑñËòì§e%ØÒ‚ÝmSŽ¢PÄŽmÖIg[Ø)‘'r;Ãmæ°Ý>-Ù±Ë=m3“‡r8&­-Í?QF$VÇsl^ú¦g_}59; íEFÕ0~27Fòmcý@‘ÿŸ…´u8|tl‰á †¦µ,éÔ°FÔ é4’‘ý2²‘ÝGb]V‘ò]!„ r«Èé# ‘ƒHR‘;€Ìž¨„5«8-Å-B9µÈíC^r¶v/jEa…Ž[´˜¡¨¤Tt¼y>AnÐB;²!2qw¡N’½È¢"3hä’Î#—\‚ˆB%×m9‹j-¨ðJßM¿õ£t´aÊß‹êå4¹œÇ·Pu ûytZAænt*€œýÈ}É=è=¼ C|Âó¿?¿‘®óÒíD–H÷ùÏüî—¿^Ì ”–†ìa˜„Ìößn L¼ªÔÞáúTÞmô_ßÑ“w"3pÿ…DvVßÅè»eRGsý÷2½c¯[)@…|ß­w'ëúƳ7¶{‡²zÆôb¼À1hJ Ê¤£»ºOæ=ÅÔU¿óô±‚sõ¦îc°3·ëD‘óËhbV˱+Rvú†¶f{o˜CFõÎBïǨŽfùGr£ ë²D–áY>†aæµù,PáïÊ_è8F`tðUxv§|ïqÿºŠZCHSõ½´`)XŠC•$µ‡°o?8Lˆ$›ç<#ÍÅz6f,Íæ¬5IyõrA½'¿¥3ÏiÏnñì’šwœ¨y¯*yñJž¢ 5ç–GAߌL¸¾í¤ÿvy† ®(ݧ£ápæMƒæX¸Fü%8TMMÙ7r"o)Å"´³ž‹ž¨? ) ¢˜‘ÌþS3vX_™.æ-²–]Ø´° xdÀ´Ù‚ÛÛ'­@ –YÙò´ÉònÒJŽA¥g:z°¦KsPqZ±ÜbÝ’©EŠã’Xº!7ÆsšÕ­‹ÿì§aɃ[¡ŽõE[=©o³ÃÉ´â°_÷1Q¤wÀŸÄÄ„d“Éd2™Ìf6³lXP¼O¼æ¤œEw_PQäU•ó¬w¾]9At—}›}ãEXÙ—ÙTšþÓkz¦¹¦zw€ xÚ^®I›Ø³µÍµV„}ú{fOmÒz ‰þul×e½Âé%›VÚ‡VÙr¬›Ž¹Y]ª IaÓsͽ#˾úaäN^ßXed¤84üX†,.ŒŽæG†MÊ­ÕÊ«¥Ô¢èèFel}ïèúè¸)>QÛΨlYAïEà¬X\ßÙRÚÝTÒÓ\Úsº¬»¥úBó6"“ÆíÀ$§÷œ³:VÇP<Ïks×WôÝX§| ‚§T½5«‘—\£õ!ñƒD#€¨Ð9Ø ¶÷ª©]‡/ƒRàÈ=ß¡‘NëØX‰Œ®êíþ­–ö²Ö¶§\ qYÊOU/+Ïæ2S­¨X–ffhhèùœ¦RäYÌýI¾YŒ»Ú;E’Ó1šÈ¡õ84s(ûp\݆jñÀÉw ^ãi ÇêõtJmö"ÜÞ•°[±dKE ë+׈Çe‰HÀ%áÎvè™¶¶`¿w¦­g°!=tÙjdáDFXBS›²Y–óG«Ú°Ó–pµb¿ü§3æ4n.­YÌó÷NÁn¬¦ÆÈsš”9Åiºûg-pÎ)ÇiÜé™´ŸÅNÇðÃ+cÙ™°4aPĆ~ì„[¶ýÁa«X²ÐÀ2ZвÔݵ«úEž(‰ïúŒfË÷¨¨!{÷΃>•c9ˆ`‘Jáõó©ü28‡ÚÃľ0rÕxT, !©€„¤y¹ ýmѾk2—2À …6Õ~)˜²|s*—’ÁëÑñFâðLYUJÖRt° ù‰À6.袎8ò‡ˆy€%ÀÔ£*…ø'ŒrUPá``Œ¬V@ ÞkÎßzŽÜ—NWÒ5gm E  ù!¬1À#JLMauzK¨åÛ'§~DI™@iwH$øDv,8t‹·lÈÏ8õ^TMѱµÊøÚðí ÊĺÈÔMƒ÷àütê"ËY z^î >}>˲"«¥õÆ~¹¦ÿ÷UÁëÙ¦N£Ñ§/H/,_uþj‰KÉ?ì(iûxgì–°a?ÅŠF–áÆ poš+öõl‹ÝÍ‹ÆJ‚¿ÝØ7¼9FÆ%£÷ß5ÇnÄoDF^µF*”aSßí¢þ/‹¢·ÍÊx¾2QêbÄù"ÍéxžÒR¥?©¯êlÚ|þCÐH lÏ7×tŸ”õœlé>]sî,£¥y–Wï]ÏÜY¹·9«‘—\ãûI4G÷> ëZ¢¨ýïàpùkx1Ipï&œ§³z9ÏktZ½‘ÕW«i«´Ë¥¶3•'÷›wçh³_gÓEŠ7FsôèÑ'O&ÏËÿ‰6X6LOMv톖…ùNµZ©j<µö’:SÀˆ] Î{‰ }è=Ñ Z(OãWW¯âÿXf%çºg3Þ³…؃ÞJ_ ãhAËñŒ!§Áº¡ÿæÆÞáU/Q#‘Û«C7Aæð­•G £cD;ö+BÖ `¤Às4Ksœ&MàšÏÚ\[1F¾Ê‹Ý+–ãtæb Åy~Nva‰=\§ ¯U~WÔóiæ–½°FÀ»`iN³Þ4çU/îýØty̳,öù²ØH^ìöŠè¸I¹›ß;º!x³22þª5²52 îZ™€û]/î¹–aª*ya¨´Ü¬}]–l¹Ø²­»¹âBSñù&а¤¢·¹úBsñ…æªÎZ á'IÍ1Õ…o¬ O¬S¾X¾ ¼™ÕÈËÖÈ>Û‹•:ÒØO*4`7zG?…vâp5lÀWÞÇá¦`×J–£h D˜~oa­µ´ñ€¹ºèõµ™ŒÁ@‹zJ+R\†h`IÊÑ„ãÓñ¿/|1ó׿ÁrƒÑŠ Í4¬ÌÀ¡†™kô}ÀÁø§Gäª-E«K:Þœ™þÈíÇN ш@"¿r¸œØãÁ^ {ØçÆÖ Hð:§§a7ár>´¹òpu,cd?ª«Çn™Æå«L‚š¼°ëÁ’Ë6Ò/¦ìŽiû,ØïHØÎ^{ÿØ_v{É¿ø¥Ç.ë¿Ù¯Ó˜(²<à/Ù„¤’N¥R©T¥;}AXWGãŨ#·œ-—ˆ*2²:¬ *"gCß-ˆÜ}7 ³»É~Û]ãèo„Á¸3›ì‡Í~òØEºßþ_µ³c6q&l䓼þ§òººRõÞ«~ïÿ{ØÄ2bPΘÛ±¡wšô¯:ÚÒ×®‰‚iÂq,¬ˆ}¦®6@F~ñí·óÃr /¤+åC.ð7Á§ós¯_>‘žšFÑ ^Î)™†¡#×%#M²! PÁML ŠØÂ_ÝÄ.rÞ lAF²»á*Få9d´¡“U,Ï+d".’B©%È>ˆº¿BÔ :6ZBÇS"J.¥?ùT”–‡¾ì@Æd÷“[Á}เ£‡€Ì™Á*#¨s€„­Ù‘mÙB!–¨è…ÝÌr[[÷ÉÎh1ÍÊ!·³åÇÊ`½þ÷œ0J?öbo œ¯««[Íñ°<òbVºioÿžÊ9åžMðL¼¯ìœã™Ìr?Nsgz'30qpì¯;N´DRì*6RÎ2´Œ>ÐòE½(‘×Ûp ¯øq¤¿4r°ÿò¡ž†œþ¦ƒ}jåÇ1, }f¡ËåýߤºfS¼³‰Žñï’•¸¢‘Ÿ ÷1ì-RŽ]€ãQ*±«»Ë°ó(«Âžã$‰;Obç©wjähŒ|`c¥q«)òÏ”ð=žaäØ,ñ"QÄöí[oݺéùùy8óøç)È´ až·¢`yiéVö×.¹¿þ*ì« Ü ³ÄSú³»£Ä°ÜÑd±ýÅC&€$d*X–]#‹)¨Sÿ˜´D–F-‘‰¦õ_fÃêZPð`C´lØ ÃÚV¬i!×`€ Ö±¡¡ÒN0c6àör8§ó*Vk‰=àAzøIGŽpƒ!h€Ý„ÇéM“õRV±ÇÂj#ÓðîΜ??¿°›7Z¯™À·WÔ•òò÷Jx†0€$31“Ó<ÏFs¬”â©_îD DfˆY\Bâv‘0»H*‡ŠÍOÀGÀƒa]q nË(úR‹>ÚÊD %ñY² QtX˜ødN!‡}.,-"–—KWQ,/ŠÞˆöW"]2 æ¹âD]ð8¿áYÃÈä h†Äâ â!z¥¨XF—¬+Üg]¨Ë…ŽžP² %ψi*.&öûï¾ £ý¿ê†JIø$”›7o2 £`h˜|·.¡áêÏ£ÂÁ齞Ù]Žï+;«œãyîÇ*ßT¶*Óû8Ó5ž=ü0sàÞ6ß³¬¡‡%ÎÉÔÁIUÿõå—ø ;×'æïñ=ÊòMí8×ý«]yìšÏ÷ü¹´ÿFLnY4GUÖîR{§c¼Ov>Z•[F±žå¢v}z¼‰Þœ»¦Ú”ç¾»¯÷zÂ%ßGû«ù„¢˜œª”kiï"׃DÏT¼wÙ5’8<“ï~œã|P4ö4»ÃÏ)×) ¢E›÷%U ë³®œ/jÉ¿¿©¨çrfï僽E=o4’Õט­eCò6P¥‚¥#i®@ãËpO'y¾MuLdxŸ¬hä=‡§âM€@üŸ q{ª°û0…|]Gë‚î³Ø{šˆÅ_ö®ûtI’2””f9Ö^Âòb^DI"Y–fЦÅJ¥¼««óåË—ÂÄ †—¯G](?¹ò ¿åÍˤÙÑMöŸ]ºF Ë'°·’tÇWŠ]GðX­ïLŠ‚IxÀ¿I!ÿg›:¨oÃ6Y—]#:ˆ^Mœ iÃ6Ûx}}Wñþ9u34 h6ésóc8订pãz¢°„ÝŠ-Z¬mÁ†öLd‚ЙÀ¯VîhÆVSH×0í­Ø&˜Š<Àc u¡²¨U/ÀõFl¶ß9~g””’ÀŠ"áÅ4¼ÇßÔ_|þê„`6,âЯéÍÔ /§+å/A!Âenn.\Y p`¡æ\-ÇH•4[Ø”È?F/!µ` €YÐ Ø$°y 4â âCúaduün·ˆrJ%\œlíÔfE>d@i4ùg9*­@¿¾À'¨( §ŒˆøEüVtÑøÆ<Ö!ÂÈÇOìaí !Û0² 1ºÉÑn4Ì(´d©±;mé<¨E»’{1ŽÕk´á1x„+à⢰Ѕ§Rø<KJJX–•’Œ§PdUªœwöù¿M¹ö Ã7ï|oÙò`–{*Í=¹Û5•lÏ“|Ï´Ìõ4Ë?´HšÈ™)þË¡Á[]·v;¦ûg£K›hŠW0&nO|Y£"¥PJE*Y&.!K5p?Öó}Žó½f³”¦‰LÕêWõÝÏuÝOòMæ\ýS\r‰ˆŽâx¸ò/¦¤«¶e&Ô‹¾ßæ_ndN¥ûŸ% =<꼩ؔ,¥˜hžå9‰tKÌuM^W}á`s~ߥ‚î‹¥uaoh¤¸§¡L"h$£¯1·»qOI.¼Ð(VLÓô–ãM¹`6× ã^÷ÄŠFÞ¸*H‚‡x?ÇNøz Ö`ÿåßV§o¤c(´?AöÇ–bü‡z)iÏØØÈ‹/„½á°;`>þÏ®á'^ ¼’`0ôèö]nÊpp<—‹Ý§þ}AýÕØ_‡ðH5vœÄ£§Uñ%4˜biжçå=7¨±®mÙ)B 9`]+6j°Ù8{ñRº„•‰D¿;vÛLXÛÞ]¯€V1\ö†uØv%d œ:°Í€mf¬ëÀÖ»u5×kêFó Ÿ|qæµ¾}¡ÓôÚ¢ ‚OÀ!Æ€®u^ÛF¬[ÍÂs5X§]1.‚¸ æ5µÛdüد÷˜(î<à¿Ä„„d“Íd2™ìd6;Kx^¨Úú ÒƒJ×ey( ¨XDPÀ‚JÛ3*Z=ä±o@ÝÙ™Y@{½ûã.—ËÙÞCEÞøè5½šÜ_½ª½òüÝ÷Öz—Ó„D/é…_~™ Ãïµó›ßïûùÓ«ŒÞklm~<3IæišÌ×Ã'ÓS0ý,_Á×0Ÿñá•\ÉWÏtù‘rŠÒF°,¯ÕhX_zôQ=‰ @&ÑnTT2QÈ—„l>òÄ6‡ Dc3:P†NºQCrt ÂŠ•”–çà TÊÍBç/¢sWPm“VÇ®Ò-YÂóèà1äVH³µÈéCM]ÈY!öŸHê=¤e‡<X\^äöÿÀ´-X#Îd €y‚6åRzˆ0dÅÆÇ¼ùøá#Øâž.“ï''ŸúmbâÉq T `Ì!3,5ÿ‚ÝζõÊ`ªp·gäeEçy"éyt­<ºÎ?þ®2nG,âH’üçlùzjûõ¿Ezï&*c›¤ÞÑ4˜ òš#µÃö\¬>·‘Ϫö„é4Fš6Â̱BÜŠ %‡~ãÿå·ßüƒðczÏ9òÔ$Ù¯ð™¿>Ë’ÿšàLµÚ›.ò4­ƒuKSçó°rpá¿·cïAB‘î",—a¥û³USAñB˜6š gN`k5výO4b¯ÅÎZÒÓù÷† æðV*6ÆOÛ €ýó}ÈÑ’â"õìו'°Ó­vl«›q[qÝYl³>´Öä¼nÐò\¤V+îÊ™r‚a¬ðÛë°­[Ïàs.RÒí"}ÕUÃóYgÝ´«Šôk·ÊyÙ+9 Î5‚Ψ¥ø×VUåGM`ÌÎNá™Ç€gà1?Sx‘"‹é…iz@‚/^h†¸Ì³ÏêtXåíA®‹ëEÔ("[;²àÏnäîF¶.dS‘ÃK`œ$¸}È*£Æ+è‚„óz6Ј­i]ã9­Ÿs1)¼Žb‚bw*ôþ)U¹Ÿì^]pL“ÍëâÓw¶]ßÒ=ºÆÓ›ué÷ÂÒ•¡,ìWÆeuRB[¾:± x°Bx\ÞG1¦tþŒ•;K¶8/[<7ß‘Æ,êk;Õûñ¾q‹8-oö¥$zoÃMº^Îm‹ÜoûRýƒ¦ÎÞMÒPf× —z-Ò0x&×ÑÃG­f9½žáõœ÷ƾ¦…Qrôú·xVÂh8Ž­p­•ÓäÁdiì'£ñ ÜâìÍÇjùt â;©hŠÄñÃØ_†ÕCXyûKHy?– ž¯0ÌûØ÷/öë<&Š,øKLHH:éT*•JUªÓEaQɈ:ƒ8+‚ J; ƒèp‹Š×8®ÇȈ@ô ʨ£ÐGõQ Î»›ýk7»Éš¬Î"GsˆŽ1™d7³»þ1Ó4ýö÷ºÕ1;k"‰óÇ$¼T:Õ¯«_ýº^×û~ªõùñ¹Ëà ¶_…WàA-öîÂÞ½D)Þfìo£b9„=°SO ýÞ¦ha5ØWñï×oM+Hd3X¶aËJ`D+PJ!^\ÁSJµ¾vã?Ý§å– "@RYRˆÈ­Vn&¯PüF‰_mN2D9Ë ÈéàYŠBáèÒùÑÑ·¤c>ü?‰öG^Úåå§ax‚ +ž¹3’ hjáÖ qßNb©ê­idø@ÐÑœÊÇÓ4+ "Eý®µ™„¾-–àæ9«qÞØ züM¿PX-äë0šþ!Ã6vážÎ°ÙÔù¡ó,v˜¡ÿÏ‡Žª”J CMœ<¢xÒqö¬N§áÕ ²WÜ”7g¿ºxæ°`Gß·íÚŒtš¥Šø¦¬uŒpЈ›:‰FŒú§=Ä<{ÈЭ6R‰Õˆ]m6[IQ:¥`( n4NÉ$©Ä‘¯oÇ(?_Hc³ð*Ûb{ÓÁ¡g$p§&‚)IÉ,EkhNÅ ,Í)²6#k?2€†ÈÖq¢Þ+¨wì8\ш—‘]&r°_!x°P_1/©h¤ÓQwÒ»QßoÑ…+ÊÜ͉ gyV•„ŽF篣n/Ú{T±¶tIf ªmEŸ[‘u9†‘-€Ú/’ÙÝQZ,P#V™åÁFÞ9€,>RvÛñD&9U3¤zöÎǯ¿0OC¡ØÎÃû÷R““yX6á¦ùwšLòäׄ60½Õ5¢õL¸ƒZP'ms”ºnïðÞÙéŸ(–F =cpÌÏ­8o‰4¹Å{7[šÍôÞ_뿟˜Í Ì@Ðo¦3‚…¾ÙJÏ-¶JIQËé8Nµ"kwË{ÝRÑàÍÜ“i@3ÙuGªü“céÃËÁ”¬-IT<-ù—Š<3µÿ¨b¨åL<¯ˆƒéÓ0´ .K)SV–ê}5ž[ņ!ÞWî¼™'Mî”Æ·ú‚±XŒ•xÇt©B÷hgD7<µÉ9Rì –Ê÷à¢mLošÞ~õÉïr´š…F1L¢Xi>Qÿåg ÕÈv©A€FŽ^úë2­ot«w*ß7úKÑHD>Jrÿ«ƒ$©]µ8fØ‹½µØ×‚{ñðaò)èÂUƒ]ÕøÚë‡] Cš°« {>&®€ƒAÎjâ“¡ƒ#{Ú´–Š÷CWk±öµaw9ËP ¾ÖL>ˆ½Iû›:|µìñv]ö2#R\Š’ŽÏQçö {Ö¬ˆ§T¼ŠMäâpà(¾~{*V«9JH`YÅlO9–_ÊSOüû]ð¤–|ˆ6V½œâø™ØÃÑOƒì7~|ë‰idþ•(Ä/(2?7÷$ÞU¼ bšŽo×®ÄþÃX®|kë,ï7Wæ¤Ój‘òSÓ¾7ŸÃú³ØnÆ=Ý›)b6`CAúB5b…A dxc³F©`Ðc£ÛóÐ2鵄­ÆgŽþŸÌ ŸéŠA,ðÅéMeËW¨8NɃ¸Üäemùåí•õÚ¢_‰êðÈI1ù"÷û¶V|¡› dp«žøÇlÁ½6²ÓÙƒ“²¡x“ñ‘ÍzlSþ»´’¥• Ï«151ù^p ð»æ/§ 6}/e¸ØÛ¶Pè‡çwz‡C¡Ù™™5«(¢šÔÊ”ÔmEê…X—Ù…z‘Lâ"Ð~˜†ˆ Ç›]’ÑE Ù¾@gŒÄ*}.r|Ý>A¥VÑ*F –èªÑ—>ÔjX²N çJ¡(«\§LYÚ>Edd‘Ñå¨_BŸ_B| Ö|ìa’ êéñŸô‚©ú(M†d”´À §N~‚Ûèõ®Ë³9r‹5VW«(JÍó'¦æhwH#ÅòÌzif“gz»{|«{¬È7KšÊõLÊ÷¶¦¶ºþ,.’Æ‹|3?·F ¤›E¾Û%ÞÑRÏø6÷T±4]äÞ$MH6Jwµ¾yΠNÛxn€KÏáh1ŸÑv¦L]öÑ)XHaÞ©h²×Žf¾)éÿ‹ ®|—¡86aG÷p¶t?ó°e5£¤xqéú²ì¢]`¢ŽË*(MY•Çp"C1lbúæ£æ-÷Oltø&·Hw Ý#ÅÒ¸Ö ^×zÆvá¤Ù<çd¾ïn‰,òý-½t·‚Ô‹$œ%ïÓÆKǪ‘Ûá^Ã2¼ŠŽç…”ý*rOæJ·~)Á^Bì¬"‘ëðäx öUâÁrüU¾ü!–ˆ.n4ãá&ì©yý8 XªÅžjì¯Çrc”й_o™8w7®N¤éĉŽAD)×Ú°wjÀΊygõ¦¼}™šdZ±ŒŽû(g™÷{Z±\‹¥*wkMA&©4ý*<öÀÒÆQjjIC=¾Üн€ŸÊÓº,šÕ$q g].vÕã@ nÁþF¢ؤ:r˜oÿ·ç÷$€iY•šfÒÒÖ~÷ï"‘P,Î`]‚Dû¿2ùiÒÅ{úô)Ì|ïaçÈ'Ç`hžY†Z'Æ=¸|ˆ”á,{iÅþê'ƒ‡35p'¨Jþ‹]åØf !nìÀ¶‰ ÐÍ ×ˆ±;¬ó6SH›¾‹°ÁaÃ6YpÛldXcwØêh{•@qù«Óç-FlêÀ&ó×'NçrLÌ• ÄÁœ± RDVàá_½R- WW<¶[0l€»‘À Nj&öCÍP¼ñ,6ub³ùag×žÌ ‘R&¨T4,ƒ,¿>{ÃÌè,Ÿ‘ù„ÈË©y•…‹m±½y{õ‰#±}0yôïÿàxžaþĬŽN´£>÷a¢ ÷²H'õ’™ìô@<ÈäF=ndþË~ÆFqÝ’%K+­4FO3šÕÌZ»¾08á²cnað¹¾ð…ð`;€qLPØøØÛ^s„øØÝÙïz”~hKÕ/=( ‡lì… ©MÕªijŒ}}cS©¡’¥äC$žžäñhöÍÞõÿ=7¸|˜úã8qZ#DálÅ„q!;ÝÚmdø-©b©Ð(2Õ‘©ÚºzI¿ÒšB ת5‚í_a½îe/É Ï.»@AIÍk5Ÿ "µQssÏŸ¡yôú4£œ¹‚èÖïÿÀ„Žeh ªø5%íýIâ½Ä»9#2ˆ|iºLžÌ¼“5<»ÓûE¼sf‡s K ]œÌ–§³äé×ä­‘$ï½4éN¶ûn¡k¬È9^èÏ÷LÈ Òx8™ãij»=ùþÉBÇÏëM[SÕa±57±²¿!9=O¨Hš[SßqÄóÛâ¾O×Ôããž–RÃØm¸=8/çVˆŠ —ZUîþ¬Ös/¶ðEózjBIòzÃ!)6¡µ¿Äskd¯4“!Ob䤻'2ä€Ò-î‰Ït–øh÷àTîèçEâ×6uá}’ ´A‘;ËöUJVÃå–CgW«‘œÁÖ¸ø ÊiH•†‚{›z <3[¥Ï~2­Y”*Ñè „ÍàoAÞf$· é}4Ü€ûú›ÊCxP½š ¤‰áKXz®JäoüÁ4â¬V„6rÌ<“× ä5ˆeù¿Ûq~7w"sû’í’’îMÝJ–_­FlfdìTªÃ4›ç,–/7Ê‹íŠlÙiÿüð¬B…öE»ýÓÃØ]z†úº½ YðOzŒæ?w˜6lâÕFžç(JƒªVG°TáÆu_^ì˜ÃõYQ'¦K²v-Yº–´(v²ƒÖNÔcFËã óã6@µJ«T*Ì;MÒžÔÏ¿UöÇ`p!8ÿjŒ^QäIÞ”Õ–¥åU¿2sð¢Vˆ»¼–ÑWÏ›Ž5ihžƒŒž& G³1 â]`AŸ\½>%Å›%%×÷ˆÀî6,'°¹‡XñMŸB+~Æl£ ëÉ0<¡æb¶óUåùüJžgudÔGƒ¼jpâ$HÚG3ÁiCö—‡æ×À¯‚œ^qÕ±ûA/ާ_ñŒÕ«DÛçç;¡ð–ŠgRͬxm`n~~­l~ß_p—à.ÊÌØ§ÅÇ ª(V›[_!ÞÉ~€st®ø0ÕÈqåZ>y»®½Øò³l×XþHÀà™NrMíy’)Ϥ8Çö ÿ¸Á5CzŒ]”é™Í–exg÷H“ âx‚4‘?x«TÃDÉ luŽï–¦òýŸgŒ—É÷+‡nUŽ>Þ8Hqï®9γa”š"õ Á鯅À&éØ!Wˆ·µ±1 ¥RC*®õ#üŠTÏÌúƒ'u4ƒ÷ù0}lÊ™ëéç}qPMèi–Í9^ä¼mžI”g ÒDžx?Óó`H÷Ìùéwp¥ùž{§‹ºûbÇÅ ÉrçLË6 CPj¼HÜ>+Ô®{ö÷¯Ðüâò,¬üQúÿ;į߀äMYUÁ‹yñå’_B¯¦ÐÊœz6÷±Å.Ð I87…rl$)€Ç@Ë%àp‚«Ø²¬‘^°º• E2è“CR%`¾ú~ Ú€­ÔÔ º àŒY1ŒcH%ÄĪC´ÇY½£ÀäÉ+‚¤@Fë­>$ÞÚm H:ݫֈÕnÐ3¨ k䊴YCÓŠ¢H^-ð,MïÚ»-.ÍÏ-³>øVͼìó‘$ÍÓ¬Y6bSéÕ_ì–)žÉi2sh2Ýÿ4Ç}[—[J²ºè­›*›öøkä»9Î{)âÃ4i6ÕÝò£k$×ý8ÃHsÏî•föÊwÈÓ»†&úfK¤©ùA²8†}’ãÉžÝ50žê{’  2vÈT²÷IúÈìþ_o.9ÎD%@J‡·ájµ ½½´±Æý»äáÇ%¦Z– ]‰ë.þ4üÒÈ]Éx· ÜUóÁv×t†ÿÉ;e ÃqP«I«þ7ûõUvÆü$&“L2Éäæäæd&÷fA: *®V±€€Ã[A]AEä ‚øÂe-‹@å9à0¼EqfîR¿ÆGAÊ"©¹cÁl¥ac˜æZšgZš½"6Ì´ÍLÏis£èœ–&ñ ¡Ohn¢-Fjª§¦ÚTG篲ó‚8”J–ÀWÀ+¸G-̦uêã§3à¿yï·¾ HïÔãëòºü÷/’wÉ$ßÚ€ˆ/š÷‰hß'‚`]­EQË*‘1r$&UQ§µEÜbôw €pâYjP› µEìèÜ j8΢s}¨í<2  Æ~Ôy5´éX†“Éx_T×…z® F‡h›â:·ŠÁËtD¢Sú òÚ¯þÿ²1:E2uõ/ɃÎ:ÑÑJ†õUa¢•sµâöðtnzþåtøÉ‹Ægæ_èt:žSƒF ã"R rœ7} ôwØF“ì“a®ûqçß#ú`Øù1rF©`|ôëò«3„S\÷¢­‰Î;†[ß·F’…ñDûh¼cÄàø$ÎþI²0’*ŒîµŽÆ ӡΩî»a®‰ûXšut›m$Ú9iŸL¹4o»¹Í5m»ë¹'L$œÿmБS+bâý#¢ƒ2ODµþïšþ‘ýa`A·6™˜[½91Õ5µ\ae•@sšmžÐ« ¶’’}8uð²lÇïÂmîiQ#âFSÛ¬“»„±$ç­­®ÑXÏ„±INtkX©/V…2º¬ íbM¦¥*ñ»±«ž«YdöVG^<©! -æY"ån]yŸÁ:öCÑȃI>ËTr Ç© &¾‰ ö{Sƒ¥¬:Ñ$ê9BYb…¸·qJfÑÁÒ±æÜCXÊc9§ÀC¹+éÐɬ„pœ’hµX†1cL «ÛõäBµ~'f§` ÆC¥)t ƒZ³¨#Ÿ:Nn⤬Š×‘eŸöäPkª«d†ÃR¢ÞBmôò1*Á*…”óYI˜Ï»SE¹9 Ãëó’>ªÝG…|zž¼€:òÄøA’K…l‘ŽÃÐ2ÜzLÉñ˜‘¨`à. Àív‹;£¯Õáõ.|5ÒßhDüŠLMMY,–ìÌ,Â`EÄè$ †èÄ„”mýçÀQqÄ<™ÔžMí9Ô•ýÊ4â,ÍÀÍYÔ]’£—a·p  ck×Ï6˜èÙî…†jÚÑBMMÔl~iœù)\;ÛÜX³5\¥ržðJu¤ˆyçò‹EBëíí´±ž¶Ö½½}7Ïâ`žÐæN@mm M5Þ¶zÆ,c,¶Õ-¶ÔѶ&Ñ$¦%À¹•66,À%FñlG#57[âÞ`À #!ßît>‹‡ÅEH‡…º8·è]Š/4=Ÿ£¯'îµI^—WSàzövŽŽÂëȲ¬–È!”ÑÚÍèÓÈl½av#“C }³]䘤ú<¨Ã‰Î8Äc€J—€:¨y™®¢–A±¶ž“òºå° #TÓŒ:á*7´Kö—b.П•a†C%M¨Y@fµ\C:s u_GÆ>ÔjEÆK¨ëç¨íì 5ÒmÓnC¦^ÔÑ¿lu¸Ÿd%lÁòòòžõ:ø cPŸÎÏ{ÿcé[\,¯¬Ñ²J+WJŸõ;ã~®{iö‘õ—ÇvX>>è¸븻Ú5±­÷ýà…RÌ«ÀlbB.@oxÛ˜~þ†~pz­ãÓxûøwÖï[)¯ªn0$s„Sȉ¡¨6Æ6í¾“p²MÉ0Z«ô›Bû&¶\úShß-­>„°y—¤d…µ˜¤)ÒÜù×cÃ5êì ñ¥;·PËÓH# ÔýÕ4\÷ðjƒž$`)Æ¢øwMM1'ÄNÍQHy¨Ï­;u:n7”ÌaNGÈ{õóÎKÔa¦=ÎyÓêvS«E¥ŽÙH»í·~ø#¸“—¸Ù–sÔÞIÔÚµº–íßiü—¹zlÔÒE-&u¨SÌÞ5guŸË/LbÀëx^Ë’WR3Ó/;tVÊJY®<;ƒÄ?~œ——'˰Åc OàJä5ÈЂœn¶r‘Ýl~ÔRý`Ur5„ìÀ€9ÈBC4ìGFÜ̬/‚=‡°³¥]hGžaÔêdôz"a‰åPY êDƒÈ݇Îu –ó¨Í‚œÔ׬^ä‚¿_Wû\N#@£n¿ `’ˇª X΀ý ÎM™é< Ïà1ÉBüC\ø±gsýý¯Óв@-!Ž*Œ£P…ïü%gøökcw*'f‹†>,ŸÉÏ–‡¦{Ûàùirúk\Y|cAV^ݲ픽fô–pße¤•ØÔï%ÊY•ÖHQhf—ïÞ«{Ž¥ÊZ‰ÍåGß Ín»¿§÷W’,F#kS—(²küþÿ=¸*4`¾E£* Ìåævú?Pv×qDJ%ŒqÚ:}ùt}ÐQØwfoÿÙÃÞ¶}Þ¶¼þ3Ëiä€÷Båày@Ô=qÀµ¬ÿâŽÁÓ…Göñ„gYV’-'i¤WÊ®ý»z0‰âÕœf1|àPŽNÄélbËîÕ_ î8«~vºŒŽ ‘C4x‚Ž×+ÉÓˆÒµê ÔwX•ÏÐ{8'IàÂ5¿™IÇjivâ#KÃ*…OÀx½”ø4Ô £†š Ò-ƒõ23×UFý•ôFóLá³k­_z›éõ³ôz3 Rëx=8¾ì:„ëh FuK 1:yfâTé:)QÂŒÀI[È2æ“T’Áq £YÍ'ê%FÇ&(X¯˜È /bG%ô)P‰È ìúL¶·æO©¹~’FŽ©‡Œ7¨k¬aQ»äT^†ëæÃ-Îú‘Ñ`8¸qdgšŽ:ÝOÔ¹OüçÕˆÓN{\•ßφÞàM9WZ3[¨;Îø¯œÓE»Ôn£nç‚ÍH½kežå±«bÿ¢Å¸hk§.;µ{–íßÒA{»©­“º@¦E«é+«éŸ6Ûþ,}&Ë ØÊ8nMJúìôýèËOœ•²Rþ»,,D"KWø8?ÿôÑ£GMMM,Oô¢¨c/&ò ª1 K/rO"Û0r—´{FU6x"ÈB¦a•"î0ºì@†·Qi1êc¤hײ„y‚W¥ éDbÖàq].²Œ ×2v£œRfUj¢ˆ“%…Y·]¾Œ\!Ô}uù{xY8#ª‹ŒjÛä!Š6.H ޻Š3ŠÅ–¦‹×h,¶ôqiî0_È—Š²r™%²–ç —ñFžàíÿÝÝCw·NÌø¦wDf¶‡>RsÍÿIÞèýâñû¹®›,ÑeËZØŽËÃY&IÄ  sK¿Î¸À„òRýni¤dôvMð÷[M¾ŠÀwg«üSÒ†R–ÅD›\xºç`h&wd¦ÀÐGÓt-ÉÞ”ÿ E BzÈ÷©Ñ¿70U쟽”¸Þed}æSx .>ÓP=Ð^:xaw_kíÐ¥†‹Uýʼÿ›"jõª©¼hÙ?ti·­Ä{©ÈÛV5Ü®ÏY†Td-f4)‚DÄÔg߬9Œa©£ú–õé0„  ëÇ©ÿ<‡7cB$ß‘Â,ŒŸ¡×ߦ#‡ÔÛÂõt²‘úã_i¢ã†þê /&æ|éF5ÐÆÅÐIOàUJ¸ÅH+¤¤¥d x,)E9ï¶l›2~j)‡>c!xÜÄQOm¾Žˆ˜ç ù™ðtÕ“»+×)‰ ˜'Š\—Ÿñë+U½ßX/1x}tÒ‹²TDÀ`zöè›·ë]µo~î©¢áPÓB¸Ea†ZKGR?0£Nm–]‡ƒ0• ‘£0ªÿÑ[æêâ ¼® ‹eXx. j’$"‰+ A1I²(Ão¦,óx-fÒˆ&;9±&W÷ËÖÂ{¨ÝÞhP©OQG‰4¾0‡|­©ø#ÂÇUtù«¡ñç¡–‚äDIHâ1FÜ¿8Aû&ê°=·Fì¦Gf"àNLÈlûejÕtR§CuHO7µ©Í Ý “j´Öo݈ÈK]EmÚcZ»¨Ù¼lÿ00øº±#j½B]NjuL½¸QäÀðñÀY‘Ûž³mþ˯ æ_z쬔•òmRêR2z¨ß+Ð2à ,lø,£0[ÊP›yüÈ9†l~äž@WßAÎ ²Ž ž1ä wYÁ'at¥m*ç4’ÈcT¹ЉKšmoe3’ÄðzQaa ø³Ð©6äÆxQµËY:8+ñ\†„HúFtÑ‚® £þêX^#ad®QŸ/!¿" öxh‰ôú¦Í_üãsðÆÒŒ¢Ñyˆ˜…%–ÄâúŠA²@}ÿ77žW“ˆÇX^µßö“\ÿÇEÁËFïlΖ§7|°=Ìïgî$ w“÷*¼2Ï\M>ÚDíÈ$Ì3„ejCX\„ Zä‰îNØæÁFOÅ)$ùëO>ÅØ€qײeÒÈú\YY~ñ"éíD††ÝŒ¦èí¥¦,÷l†óF¸—+ÞKöÝÊçòø ÿ$…_LóÏõMrlœ‚%9šNlÌð,æ9çóúÆå;²ó'n¬e\H ëùiD#nGÓf©¦J•Ïä$ÅëRY4cD*·!=>.’¤éމ†í`ÂûŠÓÿboGþ:ä¯EÞcØP÷BÇ_‹>‚3µÈS‰|0 V=6†à ‰!c|ÿ<…ãÈ]¦›§ ›¸¸‚Xi7=±5~vRk)ßߘ]“¤6$«Š7ÕîÛb®H³ëS¯¿WðÔª]qеV܇@nT€Ù0‚Ípë¸ ˜äú5ñz L£ÐÑ+¡?Þ LT|0950ó• [d ¦b"d²žÌ 4öÁ’¥™^Y##æ…§(Ž Y%KýõÔ{Á1+@˜"C!EŒ ~ÓÛñ[cýŒ¦;'[ŸôöØHZ2ÓdBý3¸°áóûà9#Èl^±X-ùÙ,-¡9VA±4E±,3<<?”°ªay·¼ô질™7Ç›ãÁP@¯Föò2&1„ö>C=ÍÙ—ù à:@A.ß4é[{ ‰zŸ°?DÂ6EØİ€}2ê&FbØC\óXØ) { ™@èÛˆãg‰w*E,f G‡ç—Bë1â!ÞŸ&Ž‹ ™_Ê¥DZ)qÎB4´ÆÙ·Ä-牱Oˆ~ÿÆá‰K׈!›4) ¾V$ò¼¤:ØXWW¨¬ >}‰ÿZ-N΂F(´]7þ»=Â×ùü#ÐHŠw²8ÕõE¡çŽÆ¹Pà}²×»PÌ߈ٛCIÂiJ¹}_Ñäõ$ßÓ,a¡ÜñûR×—±âŸÖùñ_åµ3ãÿ,‡óÚ©o2ù;IŽ[ć0äDç\Z`1W\ÜïžKwÞÍ <­œ¼^fw¶X =kö€Wé,•tÿü~ÿ"&\©â( K1R³e_BÉÀ)Ý垊‰žÃW;ŠíEW;ò¯t¼3ѳ‘FJí¸h&º1B®võö^ÍP»" Ö C“4¼;Xœ*ÃR¼ÊÜË7$9žÙla.S¼‡5½rm8ÞŸ\#B}(Ê!¾!¼Zàß ×x:;†âÀÞtSò&ôi7rW O òÔÅ:ä©F¼]kÃnqÿ}¼6Ž¥Ô,!“ 3rT¡icMÆîM,IK¥bÃ$êѤZ_ˆï"‡i¾+#Ю¥åjš‹¥Ã‘Ç€\:èÀ‰ƒ‰ÐO !ç"¥”"Š îjC>÷Òdýãþ¢/»Ê V<ZƒB3šnDÞ2ä„Ï`xx«ÀEH¨C‚Ÿôèp£€wîªØ‚¼!„Úæa 4â3"·MÑÌ |#\ïƒi9ŠU32›Ð„ç Z±ˆ•Øo3õ¸0'@ð†Ë€iÄWù*Œ%\¯Å¶Šø Ò€Á&Eý©‘@¨{Ð4!„4â¯û7ûõÓT–Çü$&$Mš47777·9M[R`«Œºêè Š€Šä¥(* 8DŸ™ôôÿÉ`*ܰZÆKT 9´ÊñªXíˆS¤oÆ ÜÕ¡ùׯéæ5r–ÚR[¼ÍͽŽlüƒF‚!ú Äø«Ù¦¦&¹ŒQ1ðÃ+% «ZŽv sh0à@VdXPï2{‘ÁC•rÕ‰~Þ.ÙZ `V)‘`^!ÃJV…5$/[€ŒfÔçE½"2ß@3Ò÷DmH¤ Ïò’íÑåë¨Ç„Ìfd²Ósv[ÕHß꼉šN 2,üšaT•ßÿ»6‚ÁÙ…Ò4B‹Ÿ„Èwß¾\§UÊ1ǰV&WµfYÆtÞélçTªe,wøËLg uô ÄY¡ãlç9ý;Ï]—rx%½1Iͽٮ'›]OËœw×5ml4´ÝͰ?ˆäòßóîÿJ#Ù®‰]Öñ<«Ÿ'a×¹ì§;ž¤{¿ÊÏ'¶ØÇS¼OˆãCþ,zY&¡^¨ú5–Ë´Oå´;×ðR… aùh–•2Ja{ñžJý™Òkç${- nœ?°E Ý<¿°½`°-ßÚ&©ºÝq¸ûôºÂ49Ãaø)ßœxúä),`ø ûáÅ;ûìþ<÷dªëˆHçš„oó]j2ò ²Œn§ùh¯­O—ÉS8AÁ|cý˜ØÃ1:é WHF…Fj‰«’¸JC®S1¬œ‘a0üó«•d¸‘øjK¶®W³ŒB¥5N&öRrçÈœ½þ¤N3\½Íß™ë¨H‰ã¤¼”×i¥á¤†à®z1xª*Iµ™Šf™Ü¤U½% ¡ÑzbßOÄâ-'â!*pRL¼UÔNžC4ÐM€ ¼¢`¶î:"A Š4ÑE¯xC ÿ $C'VM…%‹å”b)ñ•ñ ñ”Šèè€ W˜bDá±~âøIÒßGz äJ1ö£ñÙÅö´Ÿ® Ï+A ACï³³g¾éî"ú+ÄÔ2g»;¢÷‹Ó§6DÃC‹A%<ˆ –MLX?5€[úõÌ+Óðòm©-µÿq‹Øc$¡ð} …÷·àµûçà+Ø!ºDŒ£9ކ+Ò訄\ÔØŽ®Ù©IzÈ|‡ÁŠL`Œdö _8‘~í)Sóq F¦”³?a¤ï±œtC&Ò[ѵÏégãÉŽ‚¨UkQÝ)d0ÉV§h¸(†A%-T8õ ¡kaä,¦‘þ_¢.¿^¦Œ~ÅjVvñlóG…k™™™yS)˜džæ øþšŸojhP€–d Yüª÷Ë]¿ÉpOçØçø¦vŠSÙCwê}Ït¶ø4Çö Û3YìS%±¬³æƒ” ñ·Û­_¥x^ìÖsx¹DÀ1+Ö¥ÛîGr™&»XÉ;gƿطz&Ó…b2}·ûî.—?Ïö°Èñ|‹íËrq,×1–%Ž Ã_ï°û3ÝOs­…ê XèzOÒœ~ \JÅ%ˆl 'áÙhÓÆð<,!Y†Åñê5eYù†û[‹o](»Ù¶¨F®·€Fòn·eY.ä^o)hͬ/‰Â’c†„|rçSÑå•ÉXçÕ<¯=a)´ï~¸Õ1¾M|æ~˜+>γÞ™F\¥Ä{”f.¤°;¬Oå‹«G F©æqsÖjâ;Aì‡É0¤?¤[Ó¯ŽoÿâLñ4Gð#cM¬Z`8>¶3KùÇÁšñÓI›Ôð( R>¶"]KÜ'‚Ž#¾ÚT™ ey¬x×ÈY–°íh~èN•†óå£6äi"âÉ7ÎñB²ŸœñÀ¯5$TQŠ Õ_cÐQJ>ƒCŽÐÉûŽo±ÕPŠ€"|°ÿhà1\C9±@]´ÀÚE¯ƒ}/ñU‘áz 5 ¤–8kh²CÄÙ!åÁ<îFân"®£Tq®j2jª¤ O å̶Çh‡CÀ!ž(„Þh¤’R>"£‹Ïçm;\ œÙYIF‰½ší­'î²ïzkcåRžWa/礟֕ƒñm5BÕ¡¿ü‡‹mJž‰Â8 %q±ãuUDßìÓÿ`êzÑúñùmIŒLÂ+£×Êã¿o藍ô¤·‹tëƒ=]³Ý—)Z9¿·¢øNÂq@xUíÞóòÛ¯ÁKnhòjþõ ÍÒw#èäŸ=Km©½“ÁID,ccc‰‰‰‹aµË ŒZ`¥jͲҟ¡2  x`C}@ˆÔ;ŠŒd° “ µô Âchc=èp3ºÔ®ÚQŸõ[PóY™³‚å¢RQÛ%Ôrc+‰Tu2ݠ؀3ûP¿EÔ/"“ˆô.Ô‡;PHD×ËòË/al\¬ö¯/ÿB´L{¡Š…’æBdnžL?œà9 £ÄRšb8îʯ·[ý¹žG`‰'"!›g»«ó=Ý(>× Ž´X>ÒJÁJ¶µÛ6¸ï+‡§ Ü÷–ï:±„åxÝÊäèâæøÝ&Ýþ½Ÿ';&rÄßï¶OnvO帟åY& Ä'Éâã4Ïtþ­ÀAG@'úSűž{i^`À£m⣠ç£<Ç$òÎYòoöMâýlo ¡¸Añ*R©Ä°cxÁË9Žc¬Â«¶|¸³¦´Üpaÿ¶a~XZ Ûò­íÙ·ÏgZZ ïsvÀžâ[«Í­›vgp˜ýûõÅ•ü%&$›L2™L&/3y“]6 ˆÅ£UÔªpñ¿E  uEAK%Z©iÓ³Ê]`± Xª.ìîÌî5wæ’kÎ#w—ž'P”Ÿji/w½ËÝÅ“&wñä×¾ûôÈ¥ ›xmøæø2afßì¼yßÏ᪩N¸XAW–¶ñ«ú]Ô{”v¿EÕ ­“jÍôØwÖšWr1;Ëi׉š} &Gis:"yµDNÚXK[ìÔÙH­VÀÀt«“ZꨭaI¸êè<'Ú r£y†!¼@ôŽNÙð~Qá©´ì}LzËlÁX-?>‹Æ‡‹6Ø´t8©Í>m·S›•º­Ôu‰Ú/†¬·¾—žÅ1¬QoÀ¼ ëwí¥ú¿«âJ¬ÄÿqÌÌL/Ö‹m}rr²úð –€"<§3`¢ãM«ÒKP½] !°üD./jò ‡]îÑüàö"çUds#×etùºâ×ziíFÍÞU{É‚Q¡“^N@9»±¬c8جCÖV 6î ªU4–ØÔìGN¿f¸¦CA¿öqïÙP|b4&&ÌBÓ»z¹]Û»†Ã0æoi$¼³ÚAh7…ùp„Õ}d|jþEöƳ|ùê$’"u4Ù3œæ©òß!1¯Â-ÅÖ§f¸ÞŸšHM7t‰ú52ÏÊ<–ù5ŒLLð/^sä<ôA­!Þ¸¿»çóÿÄŽž/“ÕûÝ£Ùž»…?JVGƒZ»ÌìLó fùFs”ñݾ±\ÿxAðÁ çÄsfV×XºwPJÌ[-‰ËÑøÓ›—ÜOôz–a ¾%³¬ œ3z>f׆”²ÂÒÚ3Ç[?(¿r±´íbi{ùÚ¥ÊëuåW.µ¿›Qm–ÖY‰ƒ™zŠded~ýdäùë۽Уa±8~½ùÂþ¾Dux—úP—« ÃSÈ]zœËÕijùÉtëæ' ˜"Ü~'¹]ìުÛXÌèb„î`#¯3a€®Œ%™'$^ŠxÐh¦ŠúÞÞª€[Y.–àH>¢îlÙ&CD‚„JÓ¢ih/ ”P¥ò©÷ÔŸÜÿºqš†ÎPµêŠt½Iýå4x\ÓH ’†Þ|ñíû–]ÕaoùŸ}g_‹d`.ÀN-^`¯—”R[ãS[=m²R§CûY_C]ÛR™sÔRËEÚì~jsÔge›8˜ ;ƒÈŬBˆðü™Wõ¢Ï|`àÑì N;µÖѰ‡›6;5êÀ§3Ül£68^ —ýâÂOrã¢L‚FžÕö‘1QÑ]ÁÐÜÌ ]ÁÈJ|¯b±¡CŠéYê¹Ü%JäâD!ÃöРHœ»€Z|èJª»®iä*xÚ{-ˆl` Ÿ&Èf¨ýÈEÙ{Pë-TÛ‚ŠÍ„D%p\ ÇŲ,gŒY•Q¤ÑÅéÕ@Ò8¢½S«›½Zí Î_Áš®1;‹tœ!–ã·#-ÎhÔ˜¥³‹·Ã^ùFæßÁÿª÷gϼà@Ö˜7) ô© ïÖU½Cy7ÿPàíÏz»V/I°oe¤¨×Ôÿ—i‰ÃþÏ6¦—F‚CN0D'çUæì¯z)zƒNˆÉsþ<³ëóÔ?Ýb åx{zú³ƒ÷S”}ÞÁ};”{›ýƒéÁ±üއŠ}öûÇ_÷íé–d«^8'ž33:ûr†Ô}2ËDà0¡áÙg³S~ÿ¶mÛ$Ž3 BÆÑ¢5Hˆ+²Ø$®N^·uoV²97¡8#µ$Ǹe!ÞÈ ¬„1 R$zAJNJz86è„úÙÝ~‚5<ÁÒ+Gêözï‚ô2M#@‘lu€÷]i¦hdvzª­õ# 2œ„¹þšýËîbJÕãk§Ïg¬_Ë3Q‚$ zQŒf8c$æ0ÑÇÊøv}) "*§•o+=_¼õD*±•l°˜Ã¡óÔSE}oÑ@uØg¦ÝU4XMÕÓT9MÕjÍ!²o(¢Vh (/¾wÿðÒWAƒU´û¤çØv 6•LkaU!±k>˜‡XëÂN°A#uØÃŽÚdYJ#S. uÙ©ÍFìSÎVåèÑdYˆ9™çd–øx?–´ù·çÏÍ9¨­–6Z5{¸a›5Üd Ûë©Ã„Xk´ƒë´´}RybK$¼/<'r"œ•’¶lW6e‹ ãJ¬Ä÷"`í]ÉBÀO)½?:²31QÐEhMóFž#r *>„í¨ý²…P½ª¡¥µ„ àB¶nÔÔ¥á,ÑBŽ‘å²u¡ö›È݆N‰HÉÒ‘8–¼ŒÒ‹Ð»ÔÖ‰~ä"§ŠœdŸwˆÛ?/“ØxÐÉK1EòR¬ ÈDúÅ/{µñi™þïøç¾5þ™9úõäßR’d ˰ýÀ†—ß8 Íì±@‘lÿH®:¢PNº>˜b7çq¼'ÄäËŒnêúKŠro¿CDô/Æ '¹X¦ÞÉQîT¨½)ï_1+}™u!%’hN·)sûÉZ³çÓÒÀ£"ßDfÇð>uÄìéËT&rÕ/ |ãù÷ :ïçÆs·ûÆ^8'ž3F²?ê3l?HXÆ$‰'ŸüuVAíôÔÀïûŽ—@š$"CÁƒ'±AÀI°€‰€eÌ—xŒ)l¬lˆä‘á`Å/((züø1,ª [¼&kƒ^"`°ÊÆj7Ðq'CÏ÷d@#£ùÞ%¿Ïåj>N›[á{ƒ æ Â)ì`½yÙ]¬§ŒúÍuê­=p®`sú¦ÿ°_ï±MÜwÀOš„„dÉ:N'[gÙ‰’†¬´JmX‹h3 I€„WHº0ZÈ›¼HHaê`S»–¼ì8öíM!KbßÃç$Ðý5u“VZ””æÍ  ±P4PâÇ}÷ýÙ)›¶1©ƒ*+ÊO_~9ÿîwýßÏ/%§W&›K_f‚6Þ †¤E)ÈE0Pj HÕ Õ‚¿ ÔJPËà#”F ¨Å ÖƒV2þ´¤Jñ‘bÐJB䊊ãIÄ¢§ï§,TÊZP* x$gÇІd†3²Ö¶Ülø [ïp‚W§'¡ˆøŸ)B¢SÐgÔÑ ¢Îö˜ Þ\¿®.÷îþ èMÿî}“?û¹~¼ ç:¸±M tº E!€’ñ­àÆŠ+Ö†:q47ÏÊ1·fÖ̲¸÷WT~yç.üRY*ߪ‚I<YÈéÑhc!­Ï‡Q#·ôØ;·ëhƒ‘7›$È’Tƺ<3—jõP¾³”#DÀ tSî^J”(_h!¼å•)¡º(^b!@uJ”§—rž¢:º¨ŽIK—JÙÑ!Ø@¦¼R¼¤ˆD(âR¨S*Õì2¬-°2lï7V¿ÕˆŸ¹†(Š?¬/”…¥—¨'þÄ.f7h«Í¶ìù[û.f¯&ì±1 ’Ì…&I°d2–­Ng‡®¼ÞõÛW‹Ì<ûJ¾ëlfpöy?¢bøåÂ’$†ÁThz%oSàÜ:m’üËòøÆÀÈ®ÐåâîaÛK;£9Íd£M¼‘INÍܳËûqÁàµmÒlAÏo(—Ö*Ó?þnKh&O›Ü$oÄ4š#/>'3ò»?}sðZÊÖަ“P4=zqèÁó˜ŽÇ3¸w÷Î@¨°¨·òIÏÓ¬E@äÌV­ˆu” b„M6ñVšKfÍ«¿»ªëTOø«)ï 7{6Ãý€ë…¶)c¯©ÓyÉ|yÐê@;2Ô”¿ÊB᱈gøçXÃìÑwÀí¯.Çœ³…°¤£ýQÑÛš±euá]Z›HEt…íè txÀ{:Dhm6kÁ .wØÑ MàuB{Ø›áÞtý±©iË‹«Y‹‰fÐöæ >wg¯è‰ÌÏãbÁÀm0±·cåHKe©|#…¤ïX41i¦nL‡^aÈ!Q:íO2YX3ž`Í´…³ ¶´ÕÔÁÔ¯›ˆ¢S£\½”€ÒPÉ5Qñ(”ÛOê¢F(âÓ(·L€Pù°Ÿê¤D•ò Pn¤K¼.ú THc?ŒK&øz¨²–NFÿ³´1}eúÔÕÙøƒ8þõù/²äÚéÏ®I5=“bXn²X¾×М£M¼*Í$ìéi‹4Žud V ûFr‚3ß—/oUgöž*9u®Hº´N™þQðZQ»Êp|:Mó\zÞ»¿ÈÓ¦7¨³[¤[;”ßHÓÊUL‚Ù§Ïo\Èêy¡ôçpœuEÑþ-Ò…µ=;ú¯eI£¹ÚÙòçë¥Ï×+ãYÊT¶4°3¸øœxÌ(ÇÖ÷L¬©s¢#Ì´ÑÂ1-ïE=ÄÂÑÄààxDãShôýdhØ%zvîÈOK}‡Ôd$,I5™pkGi 3*KÊCƒþÓ_¢ñÉÄLh ° 7™a`ÚÞyn›6ùš2³­o5²QC™Ln÷_~r‰Ýâ¿uÙÄÃá¬7~vl÷ÿ”ÈÊá#C¨ep¦‚„ƒ@;Z”€RC± 9l|Ô:Pj‰[Bõ Ô@ ŠÜÁÕG´êûr©ŽÏ± fÆ·ˆCBq~(û EBµ$°¾øéûé ©” ¢Vݪ+Þ`2І•HcÆP÷Òš¨Ð "ꢼ®ˆè€vû£4>/8ñ°ƒàÑ©;Žé¨ŽN8ÛÀÝ®“û.8yÉ.Qïp€Ï¢ìïƒË ^ï-‡ãWuµVßn`™KJÍ'¥¤ŽœŠE"‰u‡çʇûù›çKe©üßœ´ÿ~ç/Éø÷çáoáH梑±ÑKy9›-Œ…6è†ã 6š_¶se÷RÚ#@ye"Q"ð*”G"Þp©”[¡|uR#ØèP‰4*¹ßÙOuªÔq¼/“Ç}JQ"våw¨Ro·.ËÈDüp,Ã2t§×‹k ¿9Os±ØÂrûjÝ-,;<4nÄ´eaLÉ,›dK-}OÜë?—« 6Æ0þY#yÒx^p*K›Ù¢"0.J“›úF0;zgV–¼Cs( >-c[¹zi“Œp*ß?^®]Ø+žË-]‘Y–]˜ÙÐVv⓪žÓ329Ãr£5¥T~Á?¾+4µî''ªçË”‹?Tǰÿ¬àì&íÊÖàÄitÑ9ñ˜ Z§\-~i`xžãl·:5ùÞƒ0Ùc ;a8[2=ªÇgÔÜÜõë×G.~6tþÜÅááO‡/ܼy3—þ‰Åñá,ÅžR’’mV¤ñܮÞQ/‹þÉ|ylziƒŠƒråÉiDŸ#ä í‚…eMfÚf¢Gšwí,†ŠÖƒT  V@ï^aj+וÐj íq(¨35Ä*¨‹þP*`R g«@ۃȘ=нU’«RþZ Z5ÈU T„ ?0°C¤¾T®\üôý”E-±"Í™j<lªG<'q<Ï›m´á7t·œ- 8ÃŽfð ÒˆÞÖ‰\íàrÄœÄ!1g›noN€ë1sÎÑBx¼ ˆ¤±ãd‰·sâ½÷ùùIŒÑÂ9Ž]i²ZŒLö®ü{w¿„øùL×ÿqFÃõ”XnKe©|+ ÎÞ‡& ‡çLôâçYˆE`þ>þ…ðí{ýiüÕj mͱFŽOþNÆfêm;Q‡'ôwöë=&ªì øMšL2¹¹™ÜÜ›;™ AðÕÅU*î¨uÙÂ" /y®@å êj¶µÛ´Q„að•µ<†ûš; 6»MôŸ­ÿ4­»*ò‡èni›>¶¶1Šóõ;s›íÒ„´ Ù]N¾Üœœ9s盜{Ï÷;” )ÒC8áR(·Ð¢¥›jí¦Îãx7Ñ…¹¢‘ —$ª¹›j褜ê"~ꡜñIs/‘ ²ä¼D@²»ÖL‹«9˲Û6o…§Ï3 SëS,t—ùÏŸ H‘‰‰ * ˜$Ëa¡ä£2K·^ú)LÊ0^3´ ì>IPïÇûsÕ¡,i$UÍÔÇZ¼öYf›ßžgâlŽã®4ß°]Ú­ 9äϳ®|ºv#ká#,&‘ að Â®ŽÈ9±~ó*µÐ᥿ïý]R£e£˜è”­š‹ºnçú>Û&m“FQ#9Zÿ’sâŒ$eh‹w² ëב1›q¶2LËÂD†K£Z°¯PÍ( õ«âì¢Úû(·Ný´æQ¡V^´X,7nÜ0°„oÙü·P’ׯ_ÿÁ›qF’¤Jr‚ÀòbXxùû;/]ËWú·w ¤h“õ‡XOÓ½CqÊV· u(Ãs'Sº»Cq¨ãH£–%zîÆwÞNê0è‚‘%O¼^s:„cl,“ðý½GW&år¢`6ŠÜ¢B7$¦yGÒ•AkúþH2BÛ“Ròbâs·ÝÙùq¢>– ÿ9O6€”¡âï¦é£ Úxœ2¾E»›åÍD·hYòx¶>†ƒKÎÿ¨òŸn÷ÞË–G_f¸ˆHŽæ,´Y°}tU{>õOôÄôììüé Oj¹öï‹57f¬é¬1óåúN?›x€c5ïE[ÌaL¨‰ s”œZ|ž‹Ö!Q`Úålâñ)g­6†í¯Ï^ú²ø5 %({@+ :ê0¨eà¯iÚk¶ÅF²w΀z<»AªN(m/x+@ª?“}%ß®½·gêB%\Í?Z«8H¯ o¨E„ ‹Î§” P‘‹ÈŒrB;Ô ^ŠYAOôV€¯4a)èÕ T‚T½?ôËÞ$š­Œ™µ0,G³6ÚÌ™6ÙØ yYO\-Ðæ†»œ jd¡xæ:p¡C\ÐÒF‰}„M=´ÖCs=8]ÓîË J¢8à "Ïó4M¯]»wEã?Q.·åö-i¤Là‹¿üuoA¡Àñ¤Ö3D#4òF<õã³Ô™rû¨zÕæ§Ú;¨¦Êí¡.ÊÔ%jÕˆCÜ2uY_P#-ꂟˆ¥U¢bâQgÌøÞíÚµëùsBãŠmjjê¿§ú÷/þÖÒÔ¼fÕjÚŒ¨áXšAÐæpvmÜ–-™þ[XÜc{°âçwŽäô'IýoKiú8’ ]Þ! ìèé'NÐF’¥A "ÄÆ;Ò­Øý56AY!®âTjßÃÊDö•Áèuo†!~ö{ï6í躛ÛõnÅ&ܾlšÃCY1ÔŒ0ZÁDÆdöÈÃo«c߃de í?—Öu }’­ bïx†Ò»ï¼åÙ¢ dɃùÊ(ÓRóãKlÿ Œk·"vZx>Om i †C¦¦çöÉ9„àSdÈdn˜t¦§_ÀK±¼bI`æºäÁŸ±â̤»s½äJÐJ®ÏM‰ ‰bB3ƒÇ– ·p¯™M§¶'ÞúÑÉçn$„ Ï@s0ÜÎÅjšÁíB„Ì6ÔƒË ­-„4î³Ðt6àv>hh(Û°n ƒbì"k¢9Ž+++{üøñÜÓúê•YnËí[Õ3h’ÀÏ?¸²*2 Ab¡+mŠf!l5µ«˜º Qí¿ \}” ;ÕÞCµ{(Wåì¢ÜÕ†ƒÚ‚iChT›L8ÎpQ Ë~«7g™œœÃBsk¾–}e3JÂé“¿?väˆhµ¡Nxš±ñ‚‰9{ŠãýËEÊí\u8IMPî9Ôá½ã™ú˜CÈP‡²õ{™jÄ@^±oh$MMûÉE–Â&"6Éþ³®=Ò'ö®–±Ñtdt|²|3KŽ­<ÍÒ‚(М°bcrÁ¶}Gوע8f…ɱ.¡H½™" ¦ÉCñ=ƒ[Õû‰þI¼mVOŽç“íÒÈNu4½ó¦C»ª÷ç©™Ýéúƒ%çÇ—"Ós?]ÿ<Ös7µo(ëò‡¼=™631ϱðÉI©CƒÃÆBsÌL/´a'»™¹ ÆBã">CΠ¨p¿…7‡‹4kaWfT¤ªËùš…Zþ# VŠø^ùT=ÔQºÅÌ3‚%ähŽüU ×Bwù?:O\¯s\Ùk77ÉÄ ¡¼bÑòLw"õ-@¨è¥ –‚|zkƒ© ÂYl>ø-­TLì¨5 WèÕpµ ”âà ë‚3Ë>m*ÈþûõEv|’M&™L^&/3™ÍþÈ‚,Ü!öN‹PŸ xŠþ–¢QÔ+Õó½*°ìòcù¥r*¿vg‡]¶WïÚ¦il®½!¿Qï¼kO®iï’6i¥ËëwvУ&Öò—±·/ßLÞÌÎξì¼÷ý~Þª¦Ï"A—Ò´(bý¦ÈeŸ)Ÿ¬°sçI]±ZHMi¬'õ@ Ë‚5b­&µ6…1¶©šÓSuUŠIjíSöæ_*‹âY­sÒq<ϰF½¡µµõɪ™õ·'ñ@ ´—¼ÍŸö`’‘¡!sj€ä5QG£ ¬eE^GEÆR§ê¨f'Õà¥jT£D5A¿“ªé lª^RÈñ,´x¨:‰²£C£Lz¢YÌbËÉãê/ª«O-Uäy{u¨ Kfɵ«}ÙYYÄÓzž]ŒPÃkQHðêœÕ?»æ¹ºV¾·Î5šäèC©Yƒ’¤îñDÏ=ЈŠo뚟%qò7™]ýñGNÑœ(pP&õXµ¬&-Ò">dç‰ i,³»ß«ÇœÀÑ‘»*w·]ßîXYzBË¢×xÄê–Å;ú2<ŸmëêÛÖr9öDGbíå¼®›Yîñu=Ñ® Q¦c ×9´É1˜#$IC±ž;/œOE¦ôYJçPfÏØ*év’g`ëÅ+ºå‰ˆFð'À?b“ÐôÑCe¾ø|æÑ£y¯Æ÷˜”sªœU.Í<™]ê)t&gg]Ni©´»ˆçiš7lmúðuçx@#/Yty¯RýÝ%¤«@…T2å=vaÚ¯K¿i;Hûˆ\ô°ëP”Ž]‚¨¼†§ƒDQs"}eþšÅ$b-æõgá9ÅÊ×á9žRâÞCäÝŠ%:žž=¤UD¤½Šp~@*$Žâ‚ëûˆk<¶¿"7;:œGÈÈÓ<§lch˜Œ`â„%Z®·¼LÃÙb­$•'I£•4Xgí6R®¨_¨F|¤ŠØ+I]%i´ÏÚ›ÿ~ºº|íº0–á8ëDóF^LMJ¼:xK]Dj>œÛy=/Z ýÿ5Xsó_Ùð*&±Yªa×*juÄrÆ,L¯P9»¨úꜗj”`4ÈT“[‘ hˆò,48©'|WÏrœÈðX[¶|òë?OMM=5Œÿ…"M©'êPݲ¼â+´Œ9#b cA«™y憷Éý¹Ý#‰Îá×xœk,^Ÿ€=T~@€L ÔÓäöÏS½÷ÓW·Øß_¹ã¨¼# {Y^ a5ÂÒÑ­¿]ß>–qÚ%`=Ã!,¬9Ó—æù2VŽú±•eÙ%,cZ½âÒhŒüEð–#6[ð¯‰ZZúJá©ø‹ýIîáÕ)®;Yòý”Ž1è¤zîÆ9n½p~<]å¥á ò@žk0¾ýVª÷®‘­g~iLج´˜fÁ]&7`³lA^~ïåÔwÔPßÈãø‹Š[üßôt¯ìÕ‹Z-bL ˆˆÜ¼?·ë†YþS@#/Y¼Wª°¡{7‘·gñ–©ˆ8 Ïœ/t–Ľ™Fºr}½om_¦×Š0‚uèÒO7ù0Ü“ò*Êñ„ßÝñ#ÒSN\ ‘bâ*&žB¥#í[ø@@£"â)&ÞbH[Ho)qíüå|qqr‹°ÎŒFÄübàfAˆÔŒˆÕ#ÍÆÅâtC£B‘š …"MÖéúÓ³µ¤º’Ô7,T#~~ØH=˜¤‚ÔXIcËû˜—„0¯åE‘1Â^{¼üèää?g ûíáÇp„ô8Ÿhö]hSÓs«`®Ð“¹R2>Пl^Ïb£ˆ ¼hbYd0i–ÿzËBYZ©&?EàØì¡š$Ÿ©»ƒ:YEÂMJ  i‘ïtÈÄ¿Ð`Åù|3þôùã¿­¾'…F½SÙGøk¦Þf1‹<8šg4K zÄ€õ‘KÓ,=éÎÑTïƒ5®»P¼ò¤›*Bæâ„Pû›iŽþÍ=÷2Ú†Óåñ˜ÎÉö÷…•ù‚Æm3½{h½<¸ C„¨ {’¥ñ$çX^÷-mB–ADFŽ ÝPëJ~Ç¡Á:¦1d;Q„XF—ïÊp¤zÆcÚndöÜIìIs æu ¾p~<Iî¡7¤›Ùí}yÒXBûø:×§fçíÒÇñ[öê#¢ƒ ……c‘Nx –††.+ûÃGýëá¤JÙipæ,™TgÔW&*Nfxa‘tØhx%qû…+ë:oæÈ÷yÙ¢ˆtƒ@#»È¥Cÿè,#®2 ÁT[ñ*ƒ‘ báë³;‰´ãöÉ4-Âo\3qæ0q—çAi:œ8deÿ&¿­°ÖÚa‹,ŠÀü÷Aõ,Çê#åäS–ªY¢jÝ”ÅMÙ]ÔÙŽgj¤êÂ"sTŒi-‹ÒÓÕ_U¢twž«‘ÿ ¾ù+F ŽòÍÀ†¢¶Ú²X¯X(bE#a+Äè#¢ Ê77ü"ßqk‹g,Ó1!ª°B­n9× ì®íÌÆÌÝ£I=Cë}Û¯›µe9¯ezFÓÎýFäCuLÎS!Ám›äÁV iƒ@¼Á˜o÷˜]c y¥n0bBÍ;SŽ]™¶ jF(üí÷RÚ®æ:?Ž;Ú²µ©7«íÊy ßyç…óã©HôŒ¤J·³]ÃÙα Ò]@—ÙûiŒÔ¿Cº™ië Í=$„ Ñ ¤U¨èƒI 0‡%Û ¶¾{®uxpP…"g}>ˆë}׎=Á!`6 0Úøz¶Õ»±{$IW4ò’Å¿Ù/óØ(®;ޝd i¥Ñèi4šÑ[í!c6˜Š!sÙ˜õ±f½¾Û@|àÛ±±9 JRÚ0>Ö’ÆÄÞÝ9ö° ­µÿ@kBBÁøZßæ!¥ME4`{ýú›5±ÒHŽä¨R•Ö¿}zzóö7oÞ›yï÷ýü\G‰«rF*y&WØËªL¯¶åD*Dá®Èˆ\¯F+ùà÷Fqÿ´œ»6”G¯àPGyê”\LäÂçâ›ëð’@†Ö#õÇofÂ]ÄY¬ 4â&Yø|„â(Tòˆ­Ðwå—w[ŸJ çX¬¡ÕË1‚Ž9–£ÕzžµÖ7|ó÷¯`‹Nú|.O Ñ cÌáUýçoÿ†44ºZÒÜLêÎ€ŠæÆ…¢ˆRÏ*Hsþªc¦µ”×ð%Éã¢ì¼/ÿñ5lȯž¿˜™™"¾ÙÀë›åâÏÔ~d@_´Eûɚϯæßߌ?“ý'ô€ÔÏ|ý°ÿ¦9a×R„8¬×Ð\½„aqÀf“ª²FuÞ£ºàVYªšùiäH5âBV#¤†Þ?âƒÑ¿#sü Lûý|ߺ½ô„Ê÷ ™y1i!C÷T>¡áõ˜†„–±È€–B¸Ó‡½òÚIcëõò“91;‡Q½³õ~ad=H[Çx´{b·­'Öv7Þ=nZGRÚŒ®ío\R³x3GkC"â݃&ûØ^¡7l_f5ˆÓFÆæJwM¶‡[sOb%²±Tx²ù®ÂÖëkIjúã6q,ÙÝ—iuÐ8DÍ,Ó¦•$·£ä‰ÿ:~|¯ìαÒÈnç¨ÙÞoqFÙzŒî±P×ã(y<«ý³‚&yCÜ^–ÕêXÐ8óX V+Øéïl4v—1,tõì%ôŠøÿE·Xº·^Lú¶9†M®á]®;‹4òÓ*£uyG~T~ãìþUL|å=áxJ.!âßÕè44¥ŽD fHÇ]E‰° ‚h:=W1q¥w¹5-šåyIJGb–¹’ˆ…D˜ÉW€ÄU²ð)UW)‘óIGé_/fÿ:)d€a¾c‘–e ƒ)æØÑ=‚ˆ¡ÀäsâÏfâb¶i¥ai–Gµ1Û¿xçüLc#©­&MÀ!µ?E ÔŸù¢úWÕ)‰«9¤¡è`Nc@ ½‚ Jà‚(;­Ä4Ø–Ï Ö~ú&'_rÈ\š¶h‹ön³§cQÀÎ;Ë0 ÅQ­¼àô*Sªª¦EÕbW]èT˜¤±MuIVY•Õ­ª‘Tç¡´¯ 㵚¦5>ZV<1ãSxä?=[EˆfÏïýû÷Oœ8¡e‰T‡f´ ‹ Á–¬lsëmK{Oªäwô™$uŒíðK°I7Éc Òh‚8'ö™Ä»±;URTÒhïçtç`Ì»]Úc­Á'Û2Åî ßM¤¿ÿ}`p¯V#¼êø»›?èŸØö뚟ÇŸxFc‰8rÎèé6:z6IÃY­û+(d\·2lƒ!$ a Ç¡ ą̈ß^‹è|´E2vÜŠuÜL’î§‹ÞöÏàÞrO¢8šøÁp"€“«;E3·dI#Á =»A—#p#Ì9N‘&¢„¡h©×$÷¦ Ãû„ó©ùnù ›âðîqô§Ûû —ðæó·ýPGÉC;åa@”=¯GÔñ2Yd]ËøWÅprƒhvâ€Ç‡ð4øú4Å"V·„1„Ägg5^ÍpôÄî‰h{/`ÉBi$^P2F]·i‹˜ˆf–g‰c¾-òÓ ©àe-ƒ4ûEYÌ÷_$rqúÛÎâ.SúD*"®\`EÁ= È é‡ˆPF\Ðsˆ8¡QN„׈'—¸s‰” bM¤,"_;ßš·­)'šˆÙÄsDñwñ¼E„LÒYFYD*SFh;@Ü¥_º‹ˆpx²ŸµWXv¬FZZ–2:ÌX6;³/}|±˜8s_ˆUë´ à*M39•#LÚÒ À´&ŒçnÔå÷~X˽K•«Q€¡h¬úÛåRÒYJ„CÄSNäbâ.Vâ,VV'•çëÊz•÷“¯¬],"ž2eíB®ÿ øI&<ÇÞ«ñ6ðF‚£'Ùq7MìMûAévJ#Qò4’Ý£À-àýI¶;æöۙξ8ÛÀö#Y.hÿl{ºã–åêD²íÆÖê«Ù­Ÿ®K9Ê¢eZj)æµÛJjwË7Ê÷ ŸêÖDhc`Ëb–W蘠oI;ÐÜe¶š}éŽ[ÚÆ ÌWîo‘ÖÚú®<‰î&%ÈÝ1r¿ÉéMv ½q4gKŠ{ØlïO´õ™å!“Û'÷Dí¶ Í§æ1²7Z0º¼&×`œÔx÷ôÌçk7;‡Nx'#&çÐ>—7WºwùO{Ý¥§5‘É^C#=¤¡ËÃOËR¤d]©e˱@ ºW"£-§.gžÿ(×åMvŽíF'vçˆ ¦‘Dyæ·‡­Ñ1ˆE|èêuÿ 4ÅSªpÐÈ\Qø¤„EÄ]¡Ð4pô(°q˜È â €L±ˆ9Š|+XRDlÀ*@ >Qò‰§’H è‡ë3‚ZGQ[ƒtäJ±·äùu?‡ØÁí€ò¬+ð”râªzù,˜RGÙ´øzÙ«—° ó_ì—LéÇ71!!!™L&“73™ÉÎE¸õ¢õN)ʲË",²² ø_ ŠÍ=ëUåø¹@í%W•ÝÙÙ™YÐk.¹ØëÙöšóªÂòcYãZ/ÑþÑ4½ÆÞ‰°oŸÙUclhbâ?½ðäÉæ}ßì<ó¼“÷}¾Ÿ‡ŽI¤u©ãàšqž"/ÎÂÞxèä™F¸sžgÛ*,C½‡-©<À7"o½¾Šï”“'rV]¨+ô;«°Ú€={Ã@R£1•k?–jûRa_px à¡Öi»:‚%Ôiÿ”‘*ñ`ÝsûάÙÈ,ƒKg 1Z#bÐÇ#„N: Ÿ‚ÐsÐz¢ÖÊQ×V× NMäÁ ©¸·w´à }@¡Î6üóvÜq÷wãî.ÜÖ†»{pO7†ug+vö„z»æœ€+¸¥èåAGûi›yE'’T<Ã"8œ—ÐßÛ /zÞßE¨HJ/•¯%[²%{É@Ó#ƒ/ÎÐWÖ¬XEÓ”A+hÎ@ Ñú¸˜-[u§{tÝnÝEY×{UwÞ«»èÕiŽŠßLÓ4‹=ËuwtŠ@ˆ5÷,àë2¸ãóóO^@ÕŸ?ý˜ÄÁÒ ER,ÃX¤ˆÐ'­.=VÒÿÉÀY“¶íjÀ¢Œæy‡íÒ]`’·?Ë3¡Þ7Iy¾é\%˜#ŽîðŽª"ïX‰2mëûlã¸jZYr|8²õÜ`RA=¢–ç´ûÖm#b‘@.„ÔÊQ“ïkG›LPP%Š7¦8miì4U¿K³IÉ ODf둲ÁÓåà‡Ã´‰ó‡·K§vú¦LžI³wÊì äxF,Ò]“:f’€Õ; ^ä »Ç ¥±Rqt¿8âp€¾g Ng]›Þ,,¦æö›­Œ<Åßx®wxQõ—üfÉ_ -] ¤{ü&ï]‹z;ÏØ¡1Ìë/odµ l¨=lÝ·â-ëúT……Ä7“·Åæì1Ö¾—Ýﳫ7-ž1ÈÜ움Pða!¸ÕóÊ4bñLDˆéõDë‘>;g-^Õÿ_hÄ[­é>È. €C`ëC 6à¡CÐ\® ?Ò„]•ÚT­ÇC  òسˇ5htb¥¦õ0U€%ª°»häo®ÚÄ8àV­äb'[‹Aôă)%Ø[‰¯Ujr?ÔøèƒJåÈŽ÷íë?<ª±Šz8ØU—@EÁ1NF¤»&sÁûSì{ïbE:G’±Ÿ·VU ¢ºY§Ý€HÐ÷µˆþVlÂjÅŸ[ËbɨJŸO=ºT…¯á›þé>þ­xLÛš(È}ÕO r€]GH ðA-,–j´m/yÊñ0LÝ‚|òNKyõ&j9G±$Åð<§7Ðx0ú¦C÷ïß®õÏëXdEƒÿËW³ÃrˆÞ€cÉ_ÕVá®.Í[[poO¨«÷8±8Ä SììÀ­Í¸³÷´À4Ôz^[ïì¾y´1#ÎcLb ¥Gˆˆ‰±Ûí>„7FJS$¨¥¯·.Ù’ýPí¥Ë  ¾Çxvvvÿ.;C1d4+0,A&SÌJ~­®¨L×Ù¯ëÿX×ñ‘®ïŠ®ÄþMó 4R̆µ)‘Näß?ù_šñÚ’ŸÇ¡Çóaš áßÝøí®B»žåJk€Xš^É£Xš i&9¿ÂÞûéN)¸MΔ5Íô,òd¾2Y u€ÞÁ 0 ˆ Éí×°DlwªÁrŸ¿Ü}³èÒç9˜û35­[‰–EÇÇ'”5f8jX"ÊÈÆD¡ølé–E5×s â9aµãD8{õÁv÷„­U„63ŽŽc€yÊ7)ƒceâçù?ùŦg6”žÌª=¿»S.÷|aS&,ê×eÒxŽë.ñ.éžÍ5iöLZʼnRwÀ8L“ýVÏÀ‰É5™åÒXÅæ^”.ŠE1`€8±Ý5n‘‚6×H‰4¶¨ú+£@#ÀVy:OœÈPi¾ñTq8Ã;fU' Á¥Q9›t'_¶_Ïø"àVë¶m`8ß4{gÒ]Sk¼S›•{[ÜãÒ( |O@Aûª4’/ò”q“$h:ÑÅí*ý!ÐHD‚EÀ#B S À Ðb¨£Js¥ZSgnß1"|µáq†"¾Úï$–Ë5D¨¹û®­¹x“ck¾Œ¤FSÊ­3•xè(V+ë²h¸ ÑÑj]º†1°(Vi¥éÀŒr¢¾“G“ B?N¦±»^1°«qœ°{[þ¨‹ Ø yV¼)D“‚νXvª-XÇ V`Ia <_mÀrCQRÔ¦Xúlîj,Ök,!ÀÞ|­_v a¥BÛ2‰¸¨vö%ÃS@&õØsH£# ±C†!©­5|Ö”Sú#&ž%y’nvà M$ýö±ú<ø+žûîYíZÿ¯²¦ñÉüœ†%=Î.èY ^Q ™õFÜßÏ·âî¾ÇÎvÜ׋;ZpÐH{¼»w·â¾.ÜßržÅm͸«÷÷~ó~sEÚÆxTF!±,"Ib­Ñèp‡žhÀƒÃX˜C–PdÉ–ìÕ,|‡ç_œ‚ý Gªzè×G„ @ãIm XÁhÑÕŸÕ]¼¤{ûlÌòD=%À½$©×?Yû÷ss¯1ÏçÇ‹Õòž -<~òäi;·~³ÄVËqK´Ýhºõ"BYé6V†{ï<M6íÆ4𵯮Š<p°Jý£Ù¸ÉnìŠÃÌÙó›ÑIšV³þc–““Ëï>¸÷üàœïùœì³™ƒišÿ ™.o¦ÖgéìI¡œæÅï.×|K”;Ë´¡D·ÏÒåC†IWzóC¹Ê¾ÆÒ5dQ{Þwôæj=íÝH#©ÚÝW¥‘Lêý).Ãq3(eòÖÂ’``ì%ÙüfÐH?ÐEð4Œ%èÊJlýØëk±MTìÎ;¡ÓîÍà°A!œ›À³çÛ}¹‡JÓRÊ2§Ã|Ã$”Y‰ç8ÌûE¢Ü^‹$ã¬^aÂ>N˜Éó‚ö pWüãdé‹âŠJg·§‚̃¯Ú1Ë`ԉќÀüt¼?zfC¢,Žá[mÐ^nd›2P‹¶%Í †3Ö'€R ªMÝ–„ÅeæÈ–îí –´–>tì… {{ZePµÑ_GÐ:WMæ»Æme¸7ZCO»ªÀSA7èÂc5½Bwºë뺼ÄYˆ ú™‚,býÉ,„º]5ºŽ…dà7s!ægú¤@òäñhì’¥8:Ä Â|ž‘-_šàØhj†c!€§'ŽR?v›BÓ‰@cã©ò’Å3$3£7ð/Š&b`.×jõù|á) Ý?AµèWŠˆ zS6eSö õ÷@dúA=8F§‰±Ñ±?ìÛOB£€D"qœža 3¦Ç'‰‹W Äô–‘ W\€C+ øðt¯µø~sêAà „ÄhlÒŸbðø@0øÝ•ËÖü|Y2à`ˆMI‘Õ›8½Ž1¼³º(o[qû,×ðJçp‚s(Á9€-8Mõ†Ý¢ô#™„á$Gñ"NÄ8‡–tÞL¾ðÃ{ÎÒ´^›r9¶õRlñ¾ï&‰Ä$0Ѧ5[–Ù¯.sÞÌ«ï˜.EDT:±èPûºó÷)CqŽÁ„FŽu& 1žÞ '.bÓáÌ<‹°$":Ñðt’Á %XÓZ¿]m¿³ôü½µ_ §ü鯥Úåž[3œÝ«´þMöžBe0Yñ¥;†sÛ¾OoþKîéKï»®¿¨›¯rÝ]¡ô¯qxS݉j]tÝÅ]¿èyä.<æi¾@ªYó6A&Ä]•‚“-O롱 š›ƒ õÐrš› þ0o„“­þ†Æ?=Xþûy³yF`ôD£ƒ‘åM³ç~}éRdš÷SÙ ÂÓ_Nai¢‘)›²—˜ß?)–ññg"OËÖÔ0:î€Õuý굜„5fÞÄÎ,qQDψ,JD4g$XÙ¢422‚l0jXyþÀëŠ32k„5'n*ô\/;}m½z%ÎÑ=»ënš£?¡ê'ĈRlRöŽÒˆÖŸåî/ÔnØÿV¤\Å…EíNPû^ª/C´tö¥tö¥i}9ÎL¼ØÑï^ãðeÙòÏöœ¹m¥Ðr;YëŽwÜ]ë¹ïX¡ô¦y†3wRÚ½yÚ=„“<Íb‰~‹Ý‹/ĢݫÒH–cc@2äEÁÄ12'äääC`ì…‰ò¦ÐâG˜Fðˆt t{9¸ªÁU ®Á®:pÖ‚Åù áó6z×Q*¶€»î€e!F^6™ÌBëöÜûÇ׃}ÛµC%KÅiz^–9öLeò¸»nE´DGbì;” žÊ·m1AŠxa¢­’ÒNWÕ7Zfq:VÇ®[LàÜÞ‡í»VÈ:†ÈÓ |i¼|­.U©µfÆÇèYg”£n©¦_¨¹ÕTúÔ³œ»‘jB€QICU×#“í[A«Oxj¡c3tm§[ û­ 4¢ÙÀ³ ÔRÊ0x˹×Û¼õ“üeï’i¨,^”9±Œ$ðhaÌ'õõc@h½? &Áh€J“ÿWM>Ò÷ÓQD@ži]òrs%É(³¢p{S“ž4…–&8z š?ƒ ðY#4ú#ÐzjäàáÏó­Q¬~¡ad£ÈÐ᫼bËãŸÑ|£²911Nµ(â¿„¢ÿ]§lÊþO,\ª‘ŽåƒþK>Œ“н‰ÿÀÓÎVeîüwÏDñz#§HxŽ]@È „c“! >G„×dϧžÈ”ñœs?B‚3I¥ib"à§í(è§ +8 à:ðàÁƒ÷ÔqDäxçylRF‚$¥GÅc’W.þâJŽÒ‹ 4Wí³tö “`LS½ÿe¿N`›H¯#!!Y²4F¿<š‘Ç#'!‡0B! dM.ç2IãÜ$8‡“l á(ˆí² ,WÄ‚8–刱Ç3ãcCÕC]µR¥X®\ÎÆ$ŽJÛVtU E„øï›„¦´•¨èJyYã‘güÆžÿ½ïAG®‡,òH¦«·J¼^-öæ(â¥û‰ÛY®žTÿ‹t¯èBÈìí[ë¼Rí»Ÿêú=™È"ƒ‘¤üÃëXcªµú˜Xbx­VÏD¦~Ü•-^G©@8Ö,¯Ü _M{ïgtß/ÜrT@/KÁRµŠ©D5•X޽쳫úÚ±R} S o–¨o°<|ðº+uXiÀî:|±}ÌßñËùöå¬ :JOR1z†…æt,Ø%I+N|qæÏMý¿ÏñT&XÛ/[>žÃÏ_© á©cSÅalbb¦hÀüÕéòµk©CðLÑd”NóÛv>¸âØgª@Ž™<ôiø³N|üØOír£Œ0ÀP,Ò"ŠB,KqË’ú._›zÒž«U.¬RdºML†§5òoiü£|Ͳd6fã­Å‹ñq˜Z7¶°:µØë ` óìÙ³/&f>kñÿaéMןé²p÷îÝíÛ·GEDBÂ4EAþ äNѰcàù¸’-åÇ^¡ô˜ÅžUJ(KYÝC¥Î ÍÕSâ ZÄ`¦4l–‡Ó<ßäÊC –<åÅ5RêVº¯çÉCKÅ;6ßHö®3Ðh–'……¥í{ xk B#Ò€(2R°}˜æ(q_âøeÍhYmÍá‹?ô . |ïr¸/kPGS¥I‘o‡–[+8%Ðsx!–E ]‘ 啦E™ÆÔ‚„ÈX Kòì‚eŸ²Šýd¶g(Uìî-ô @‰žÑlé^†kø½Ìõ:-2£ ÑÌÜ(“yµ­&¥ë«DÏí|ð•g´ìlOfùfSÇgûük\7’.†Ö‰½…Þ›‹¥že`7ìd‰Ap¤—§„^§‹k8r~ 8p7Å\! §ûB™îkoªØÒ¤~«âHÄ!!¶ØjƒIô¿üåïF#r-áµYÝåØ×¨2Ì 5¨G¤2µkw;°XŠehÇÍêÛ@­*ÅÞÕ”]¶,Zx" =õX" ½ïۨƸl#ömRÛ7ts¯‹uOo@tÌ"zžž žž(ÃJôý§g©¦0ª†äÏÖ$O|¹5ðA&BOÖ•IØ[…}Ù±ZO¤ŽkL]ˆÛ±ç¶/&àa‚ ã«-X¬lÞ[ºŠäô,AÇè8ÐÌ|=úŶü_í(‚ô(VØ™‡}MS ©WAöðÖãî:õÖྠU (ÒŒ½ êøqà§*K;öÁg$å÷»¾¨ÏÉŠe ‰(†eôpûERÅ0ŒÙlöûýÓ«øÕòòâÅdÇÆ6ž5ZuIT.5}w¬wÀG:ñþøØ©ÁÚ“’ÔY‹c µÈ!d8Ž;|øðÓ§Oÿ9 ÍÆlÌÆ»Š0þëã'êpñ»Kù9¹I² +{$¨¯®ÐwN‘iÌŒ'Ó#Ì“G;2Å- R­{,ûÒ$O #ŸZ˜±ÏY,]ÍoZÜ߬󌬖雷#iÎþ*]Tð‹St:Äs5†¥†”CrÉš«62(žÑ/ˆI!J¯EqéÖ% »³úòœ73¥¡ùVŽg0ÃÕo‘BižP¾ŒHXÍh5$ÍQ HŽgYG訴¦Eæm§š¤>0ÒŠ_аCë¢Lé5ç¾Nv…Šå{6Q½”­kTüÈRÁ3&É÷ÞRU&_Gˆ<_0ËÓ“+÷¥;oX½C¶¼®¾Ê7§È÷F#’{[TÈëq aÒßþÉîqOö¶b·wo=d{r® Ë-j§–jØU…EIËk‚‰UoÍ@i5:4ŸÖΧ´ Í#JHFóžtµâÀu|`.bÇîjhÅbóˆ Kñ'ësζål*HÎH‚ÒÑM‚ýÃé:ì®úît5§ÕDŒ I†ÏÖ`OóƒS­ Z‰41DðxC¸Û1!oÍ#Ö e„Æ´HÜÝ€}5ᮆà¡ZwmÊɲ…nGò½S±ØúëŽltfÄþ(# »êUø[U_¾Üvì¬Äò”:Ä5Uß”FãÞÍSž•N^È›¯p|bM1Ñs¢éyMè`²¡XŽb EÓtssó¥K—f¦‰é…ü6 Æ¿ý“À ¼^`€Ÿ¸Xg~ø>xô/;÷Xbt¢´< (ÔAJeee###pêØØØ[Kc6fc6þç¿Ü““ðªHr©­ÿ=Þ¹F¦cbb|z¤šÙ™Nþïì—yl÷Ç+Y²´ÒJ£ÑO£Ÿf4£]ùÆà_`ÀËbŸ»öb_øÄñm°ÁÜê‚JhLIÓ” øØcfÛ¡Hi% —" ØøöÚ¤F*¢ MCÛüúÆ«P«*ÿTTi©ŸžfßÎŽfÞìÌïûý¼ï¾ý+tnÐo¤A€9˜DËÓJ€AEV·6¶æp®å÷›äÍö™$ǬÑ1þ ®š!@“l•n¦ºÆõòxœ4ªwN{Ȇ†åðñûO¤Øodôyr­%¿¾TÞv¾ÔÚŸgH•‡c-#…ÒØºÒŸqXëGùhBןø,Ù2¼½ãò#׆qjDáUYÀÙÇÏS,ÌmXã˜t°«Ø2P$Ý6¿.ÿÄùsuh@8ðŒ'@ÏËû`>¾ápõFœ4­—gMNÙ2<“æÙbïgXQ‹|Ó›ŽE–ÔÒ\H­â‘¯èQq¼×Ø;Ý|‰º`Ú',:©Æ1¢wÜ‹íœ4ÉÓ€%ÒDŠu ` o ÅËÂäL²^OwecÌÖѤÎÑ4ç½×—FjˆŽ \Aúvƒƒ¿—oØ’æ18 § AÔ&-Õ²9ðê‘âç¶FÒ÷±¿IäFk}‡9Ì󫃅Ïd<ø€¡Îsl›Þ¯d©«ïV¹„HåŠË»ˆ«žØ+IO±ÔìɈàELa F,†O¿0J ¦.$ >]Õ‰ 8JI_]v¤ˆ1Ë1ÌÕV#éÙµàÜ›B«Y‘G¶HÍ‰Š ™†-¢hÚŸbcxÕÃö "•s€s]5 h9jŸ»w}\‘F‰´KÏž-¤§I¹e…‘êXút/±7×n"U[1‘ʈ³œHU Î ­ÁN¹áA÷¹9+'Bôg(†f k3sJÒ8,dÕϽó§;wÿ <^%‡,ˆ×óùùÚ~ o\>¡T;ö‹ Uõ[ƒýLÑ"ây¬c‘BA«\.×RM{üø1ù¯Q¹åXŽÿÏ€%üHæŸ=ûKþ7V¥¢‹ ?ýÛï-\ºp1'k+¸–€°Æ<«AˆÙüPpD`JAQ›}û™/ ¥‘x»'Ê:/Oe:Æ€1ò-ƒ&i2UòdÚFÀj³Î™[»|ÌY ݘßÑ+MF:ïÆØ&³íSy]ãfçtt÷`òù»q£9î;9§/sëS5 «ÃZL é`øB´ ÄÙW )lëÌ»ß÷+š‚½˜0Iƒ›Óëì}Ït²}¸ÌÖŸ–Ïip1R/D¨ÀÕ -Ç ¤!ƒÝ+Ïd¸g2mÙ–[iöÛ†£gAñ5 ý\h¶åJVÇ@M÷XÂ1 ñ¢ŽQašKh9™d»UvÑ,Ïs‘%û9ÝwLòh¦{.T<é…ØfÈ/CˆëX†Ã/ÏÀŸ–âôdIƒ©no™ymi ×ÙHÜ€ •ßvÔ¦ ? B”æ€÷XÀAKažfEø0ÇLÔxN6‘OwÑ“Ç@ù3¦ç«r#½ó#‰0"ðI4bhÒÌ0 ¡×YM "À(unò7þèçi„tF<І?ìé*I‚w·ždžs&kJnÅR %ìiÃ^0L-æÁ­Ýé+"£HÝ™žl,ïÂ*œÖƒù^<ÜŽ½{ñHö¶b¾Ë{±8€ùN¸sÊm_®úüµ–ß*ùšÿ)VDÒ„…Fð öÂàœ=ÚµrkȤö. 6½R“‘Ëã´ÉÄõðHÂDšhÆl-t:?üU®8m—¯e /8•›Pââåbi ¬’qLùÑS›‚LÍqeÉW3$º´PÍíÊd£8Ã:›YR—@ê6»÷% ãù î’CБ+Ì”IÓ.qÌS,ÍäñS6“²¬ÅPD°ÊH0¬‘!IÑzÆ´µïg…êBÁÑß2ÆÒDÙ-5ÊÕCšŠ¡ÞŸ¿÷ýg<£`Ôwþ{ôã~Zè™Ø¡À'0y!òù ‹óóAÙí‡Í4²$$å þî‰ÕˆÔŠ hÄ…Nu j½Ig¥ˆº¬¸eek°´s-Xyªù{=åV1”-‘e´º/?{²£ah©³P¢ Û³¢¸·½ÝPXM ²°õñßÿ†ÀÞ^,4AÝ×n wc¹Aì͈¦P,aLß`¹£‚úµø ¬viê±Ô‡•æOº2ßèj˜„5ta¾A»\îÃr·f± XÃ4kÇ¥n,4cµsn¬º1¨¾ P‡•6 6| –úñÌݘƒ«à0OËí“ç:Ò³7ÆÄ1Kèá‹°$‚Ïš,f@iغ%ñ¥ÃoÞX€wt÷öÝ{ö€­ÒöÞ·‘±9A½ý v¥•XÝÂ&B‘§kÏZ ‡îÜ×o1‘mõõº¾Iá¥8–CZ*X^ =˜:þ½Y‹µX‹µø¯G8ìUUWY9 í*ÔqŠ63¬ !(Ü t­IFÅ%ïpï<橾tJ“vi._‹sa®„Ÿ-õà8¡H TˆsÕ\`çð´K˜)•Á->»¸#60þ ipâg*D?ü·ˆŸÎ>5šuòr7¤)|Pš+†ün~Œ-h2 ÆJ2)©¹GNÙO_xX)ßþúyg2@£Z÷Â;)]/­+kŠO+d2ëbË÷ä– yX•¯úåFšYdÉv–y.ÖŠ –M[)!‚Ž?¢æK׊T¿sàU«™.Òj¯-ã&Ó=¾2e”òƒÁ´Ý‡RjŸ¯üůkå+ÞÀa®RMSæJ•Ñ<ÕgçÇóÔ¹jáBŽt%K8ŸËs¥Pœ[ÏÏo8{3M æ %b XžÍšvû+Äùä6åT|ÿ3Q;—”öH)‡Q{óX%A(ڶΤÃR/–ڱ؊ÿÁ~½Æ6uݯ4)’%KWWGWG÷êZ~Èq$c%~€JçâB:ˆ —­J“šû]`§§ò›ŠL”Ì]ÿ¹Ðöy_q‹y‰CjĆ€Æs|‡ºHD"ñÿ ÏÛ?üãäûlÚ°Ñpªå ,¯A˜£õƒÕ%ád6«h«ë¨ýôÕ¢a»/l¾8žË“¢ ˆ*q¼Ü7æ"Ń‘r!Þ° cùBÌ"*ð€ê\ „¡Aý…â óÁ!РcóD Á h$>R쟭"?Ù÷¾6-“U«´” k“5[‹—ÓˆÙýk„ø–6fZª®çzÇàqµbÌ) ï>ÿe…ΕgŸ„_wB4›Êñi;[«C±Êþ0`GƒÔ:^[>pÍ.NšåÉÍη´ ­ãùôš^»7\ó§{g.¯ÉÌÂ=¢Q˜Ó7Zj»>ÅôcGúÑP¾÷F¹çVª­%ïƒÙµ}6¬Ð3RyêréÛçK_h†w|¼\+ÞjM(~óOå a‡<úÊhDt=ƒb-·_ Ô?ú¨AÏÑ Öq˜ýfÀM.¹‰¼—ø\ÄÓH|M_½S“Æê@,C)ãPô?탟’c0bUwO6(zñî!¡šGý=™,¬ZÍP?ˆlRH t<;øÁ$äüÖw ÐD­E*›6é‹ýöù Šd–Ë3Ø¥ ´·‚K‡’3)Т¤!ôq?‘ö+sàþþ]Äç^\@¥^IUtÉIüN:ÈñÝ-ðLû¢vÏímÂØ:q¶:8“^ââ±Æ€Ðjç¡bidÇ™ë˜eõê#û†g¸Tš´úº bò˜ÝØñ®Ý;Z빡ÍۙʨŒ4ÊCÍGj„µ|J2ÃkÕ¯¥RØzX.N8½7‘š_Eó˜[eóDwËaCi;oÈÀØPVßÁgl£y¸.ɘ¡¯huž»ºK/”f ¥©|Ïíÿ«£ ˆRè[•šh\ð´dMašaÿ~â§Dl$ž* µoK‹ÙÄpŽÙ`dH° þwÁ×U’•²ŠEFFýÕ¾|2Ø>{®ÝçÞ^™µZôj®R=hS<#Âd „S!°DÚMÝÖÜPwÑÔï›I°—\ê$Þºåól8-&ÙC½Dî&r'‘»ˆÐGD·² Å9à&eŽØMI#Û”v©wNî¾ú‹²ÃÆt-60t2¬~nlà5&)žÇ Þ˜•uèÀÁé‰IØ/Oçæžï —(ïÿ/6ïòGÈÂóxžÌüüÓM*‰HD"–…8H–‰›äÑ“…s¼K.”H©¡c†Â¥±4ø„§y^—±Ú\·­çTÙ©/öÈÑÂÑÊЬ=0“íÍG¥ÞHµ”HÑr!Vቖ ŽB•·‰‹?GHÜ!€xS.Å©¼ Q³+õEê½×+s1ÿˆ\ÿÇëËi$es.Ç(N27-"`¡RÏHÕàHÙ`¬Ú7eÜß$Þ­÷GÙL3¯…S-²½+xo[]Ä™xfmÆ6Òvñn8­Ë®Hç¬í¨§Xž¬ú•ŒXƒ4:Þ´zk¹ã½À–Ÿ¬ÿ‘E‡ød–× *ç˜ ¾Úyvˆã5¤fuÉÅb¬Â{S—·‹US«0…¦8æ FÑqÉëw¼ýÑîÀXž4½Ý3Q"9äð+£(ñR;‘œJÕö :wmÖ³˜ç}ù­22¸‡÷(…^îþæ“Öd5ÆF•ô^•H‹’‘\n{ _ ­É_»>M¿V…µF Òª“ œFǪƒ]Vž½ 'B ‘½DjT,!î!~€Pï‚ÔM0Þ¨ŒÛ—ÍÓïR'·)Û‰nVDäk[w)wáæÐÉÄß Ïý®¿ñó¾â&óM_ªžã~-Ãè4¥%U¯q´:c}VsçÏ®üe(îögOŸÆ7K¼¯”ü—(ÇÀ Æ’F^\®°Ž‘ˆD$âûãÉ“¹—^Y Ký¹yç(x…}ýõý'Žgff`ŽÃ,Ëc K1¨ÈŒFC³ˆfy½i]v®åÍÓ»~÷YçoUÒHip¢À?c¦­Ò½liÂ,OZ凸ؤ‰BiÔ&Ý.õMÄb¢Ð–@Rã­ ÎnöNoñÏšC³Û„1³|Ç*?XN#ŒV‡ÅòFûÁ³à ›Üá/òÍ€|ªÄq›0‘ësyÿJR4˜bÊöÁŸ‹¤ÈFw?hιk²Ëó3é~ƒAÆÌT†R#~çÙ+ÞñŒºƒ ÎI^m®p ×lâ˜Cˆ¸>¼¤ÆÐͱöÓ—L¯)¨É˜6dm¶zGlRX·½š¥TFLá”õæ®Ö–#ظ>UC!ŠÞXÑ^潑¼Sà™¬’'òo¼2ù/ûåÅqÇñ?"Y:ÉÒi5Zvµ«»³ÛÓpC3`Ûœ}6¶± 6Äøuwælc0¯¤¥PJ‰š’”д…”ľ}ÞbÓD…H¥”(j!€ç×ÙÆ¡)ªªHm¥¢øqçéo|`!«R›ª¡º¯~7šÙùÝÎÎï÷™ž6l'zÑZ‰ÒLtoGþ³,âì˜9½cé9ôÀØû‰tHÙ[‘e…„ŽqJ¡Ý4ñ¦>Õ PñâOk'™mÉcJ¢/_ŠxŸcÕãÞ)i/éÙCÇúˆœà!ª‡ÒˆÑL$è§L,MŠ7»õÓ˜‡0£…Bˆá#ø\G ÿüÈͤÛO.첊¾ã›:ëUl÷ç¯ZŽÍ³)›“X†å“*0ÈÂÂç +‚êvþêÝž¹|N¢S‘Èìã«Í'ýŠüoä ^Í=áy\qÅ××M±Hõ(„FÆ1("pê#s3šÿ¢d8>~ô»Õ.p‚(ŠX`16 Ø,"Sª1Û­)¶5›V{—žz¯*0P gËw‹u`ŒÑy4[&)ÒÇàJ±Ú_¢>Î!12)„*»ú+Ôq—:™­NäjùêÐK¬Ã—ZåëFÉË?yÞ{Â}æ÷ƒйX ¹T˜+Ïfi#%ƘçÌ%[x“ (¢²ó6ÀRJÝI@+^3œeŽÕRíI…ìŒkF½3ŽÚ\ K0¤$>¥î¥#¼^/V†Ë•–ÜJ+$)d« Ü.ÔÇ» WƒW8òò‘,©s–Ù!Ó"Æéÿ~i×í:}`EýÑ$6ÁÂàe9Û‹Þþp]plSçðv%œo ?54¢ùˆä'j-ÑÚ($\ðœ­ËâNYìZ™vĽ¼ò[–4ÑlgÌ,cÅ\’Cï*'Æ>J/rÑw¾Z›‚ Ã3+¸„*Gò+5Ž+ûs¦Ïî$Ò."·žýDñÝœCT/¹ƒ ˜±…ÂÜ®ë‰DqhNm[ÜO Ž]]`(àú{iÓˆñL3yÇ{÷µç¼¹¥«EŽy†CØŠJLAH2™1‹˜%#ðŒ§±î½w/ýí/÷É™‰Ð­_øØRD£‘Xevvê` (BæAå¿·gÿ¥N1¯bþÄ$®¸âúÚj>X}Ù!.F"‡Á¢3+s´2õÛ+—[üM©Ë’Y V â ¢óVd™ƒ“$g3[2¸Ì¢Ì†#5¯iþ®¼òjµ¿HÉVGräáMÒ`©4Y8†"€% @·ÜÆàÆÎ~·b´Ïê‡>S^&?oê;\r¼üÀ?ã+ØXÑΚD–¡MÁ˜‘Çͺ|ðùý¹ÈÜß§L8%|ûd.¶s–ýbŠáýW³?ÿÅ dKÈcžÇW\q}ÝôX¤ŠÆÂWL3€óAxj>5FèÁÂqä>!f¢pP$÷#½W><¸«-=9Ìó€"VÛYdg™$d±YÀfœ±ÁVâ]ó3¹o]Ëׇòµ0@ A B C .Bšk[yZ¨\Ÿ¨Ã%]ý%êP‘>æR'£‘9\ÕHC…Ú$€Gip $8ü‚òqU``³Z'm2îºÜãØÚ˜¾Þ\Ô¸98¹AÚqêòR ^* $%vÓô´DÀˆaÄìJ  ·6”×q#>‰5ñ˜Ïj:¶Åg¿qyYV©È0øÔЀÚNŒZ"A}?énì?QMW³,#¤ ¼$ð ëÓ¤öròËÒ]MBÝE‘@¯%2<å'Á&ô ˆbQZ©QrüðÕK;ð[‰î'²‡òÜ‚& Kw‘}YEViXÜÕ6ÚGk¤s)Í<]'yÖwdY(°<Ï"3°‚…ÿdY (Íq85=½¥½ãÒo>øô¯ŸQ䘙~Äß2ý€–ó{c–Ì=¶ÑE×葦§§ÿÝ}ùÕhÁÉ'vw\qÅ×ÿ‡¢Q “‡$333}õêÕŽö½Ë–Óô9‚=bŽƒ& [°.Ï.)Ø}¢ìU­A¾™©Ndªãkõ;ô‰m,G.PF<6K½›õÐfcÈ¥…²å¾l-”¥ fiÃ%òbi¢HžpÉáBe¬Hu«a0@·ú a¥ËÌŠXSÓ3Öl;˜ˆ“æ͵R¯[l8_å²q’>$,Aàbl¢U`8 ²ðÎòmÊ-—:˜Ùø]™0gJ¯?àT>Ù! ¥d•!Ö$Sx\«îü¸LéOmØgƒ‡ñ’ômû*;oæ*á|}Òõv_<ðÔÐHpžTÀ éj$|zÎwÄ™ðfU†Üè¸u¤ìÏor´Q¢0€[§ ñÑ’š‡h^j@,j 1vSÓZ©ÁttF?žR¼Dn&°ŠŸè^êpÀ Ü¥}šˆC5cÿ½Ÿyz–í)ÉÌ´c™­,—ÄÂWÈÉ>ÅJ0ø2W®xîØ±c×®]›¥/5VÆW\qÅõ´(F#PÆ\$pjŒÌÌÜ?ùò_÷1Q¤wÀû— Édòd2™Ílö% XÑÓ ŠñÀC—eÙ–=8À£Êû« õðŒïìéõ®^{w=5õîP`wÞv¬Z/­&5µ¶GD^öeÔkÓ³McÓ¦í),<ýÍîÕ`î¯6‘d¾yÂ>»Ì< ÃÃï÷™wór·AÍOÕ– M4»žÕ±¤Ò¡#§1Ï¡ {²«»¯}ÔþÉÕ–¡›µÃc.1Xæ›-g­þ/öòñ½…N~Æí V3‚6ß´Uœ´r“vnÚ͇«ùhw¶j(g•‹3å\”}¡8»[ž_M#.f–æŠ|QXÐ9pÓ}GÝÞkuï_ÚÖt<§îàξSnï¬S'Gmï]2m)¦Y#45#Eh(:Ó˜¥ÍÒh}¾»mèó:>´»å$x@§Aͯíãôyez±H[ò¶`»vó·óZ^5Q$Åèóö÷7 v)b•çʹ`Z3á»ðI@÷‡·—_ÿ8á?º$õc?z±ï" èÒººjz0ß9X°‹=Êz”Åz,ÀBæ±Ôš\¤Kñ†ØåÃXŸZšçÀ€Eä,5`<†9ö×Á£¿>æ>íÈ.Î"s4ë àC‘pƒX†aðªÑ±Z¸aàd«¥ìÇ§Þ ƒ°iA ©=üô=^þ?þó¨Q£FšÿQžð'  ¶/-.*ß[\¼77?ðɧe¥ ­cÚHQÐŽ3i´^ÃhÍÒ-Aj(†bMºœÂÜúÕoÖüªž³{ÃB´BŒ;…˜“‹»„ù ~ÞáWrÓÕb¨Æ·Ø¼“¥ž +?m—B¥ÜLl|È)Í:¤¸YŒïæg „Øj±{fò½B.¼K˜±Þ³úç7Ní«ä/rwê}Sež±rÿÌNoà…áI§p [|°µ±/·©·äè;ÛôZƒ–JϯêîÆíCSÙõo¦‘‚Õç6ß牔yn$I!d,þ`Ô52W)ŽçÖ÷ë 9²†¼†Wš¸ß•qSf!báÃ6!°f4âïã}ŠCÄ<Ò…6Eàx+6c_Û”¯ €í«/Õ„ý­x¤û۰ܶ Cj,&ù!w)CìR¸"ÄR"©sû’DéÄ#½x¤K-Øó2æ<ø¨ýÚ+ö“öÍÎ Ô&*]‹C³,£§)=MY6“Ñ¢i’ÔÑdVFfïÁž+—.ÿé˰QSCÙ®+öð²’¥ÿƉ5jÔ¨y6“ªÛ©y²˜//'PÞ ©:Ÿš@µÿòïüW>ë8عuó·ibC®ƒV®g‘‘ cP\Y±iHG›6gç[·4uœ8×:p½Q¸íöNìñóÅxž|¯\œ+ãc¥ÞH1*•Â_Ðì ‹“A.n¸âN޽j.¸šFàH7pðÓÞi×p b(è ¿$O¢ŽÑù!h‰çyCN9Ò"~θ:vúe'àœ¨¢µŸŽ±ÅS[4i¹ß· ã%?û½cp¼ê]¯ãËÎ\±+äȦ†Ï×uÔô• þÆ&ÅËù©GΚòKuEÕ;|X'ÜDYäü@©5£°Ÿ$‡Ð„}ÍØßŽ…V̵)QF«Â©‹ '„oXª]Y„kÀ\£rŠÜ¦,À¸Ø}} B„ne°¤{›ºÊaòÁÅ¡®ðûC½¶cÕ;·g3lº–JcIJ,Mëe é ="A!&ŠÑT£w[ì?=}& ¤´ü”CRs5jÔ¨Q³6ôÀOƒäò㯀*Ð_—C¡À™3?±Z-"X KS4"H–¤ 4¶Z‚4Ñ4Íè JKè7hómÏí?Røú9çÙ«/ñ¿5‹Ó¥RÐâ Ù}36)jfËù¨Õ;[,FÌBÄ,†¬BÈÁ*¹@wºÎ3½šFÀ0EÜ„E˜rH!»„Sª¥h5vùï;‡'ÃÅb4_œw ç×÷24I°r*; z>Ìï=[Õ—NgÒHé|g®ù¢Fq¾›9Åq¸B«w ±ýÞ;/‹·š.Ü´‰Aû \Û¬uøN+w«vèøªBšbÁ5ƒ|l¾àšÑˆÜ§hDîÆr‡ˆÐ¢ÌA)~¤†Ô¡ –Xmá–z±Ø£,(uãáfÌcZ±·s°¯t`_+–Ú°ŽïúÃLJ®¿±ï fGÁ†L–Ò"Ò€PBš5Ð! 4üI´ˆÒ!Än.-xëÄñ×®=|ø0‘ÜÃðЉE󓹸¸°â¦.¥P½r‡«Q£Fšg9PÕS“H Œ'+ù×2YXx¼²æÃãçòâÒ×Ï¡ ˜ãÄcü蟋W?»xìØwwlÏÇZ=­10Z•Í@#baÂ"–$™tÄІ,SÎŽMîöâ®7kÈ7 ܨçÆ+¼Á!¶[š/bÅbü1¾KŒÁ€9ÀÆÅVÓˆ]˜syc•óåžH™/^$„-R´” 9†‚îócMþ°Å´È_XOß 6>o¢Ó³©o1Ä:½ÑˆHRC¬ÓRà‘¹ß髽0m•çŠ|÷]Âý*oÜì —z#5ÂݽÁêÑ»¹r BŽìgê¸9³4WG áR92)â¢)æc`•µ¤±[ш éÂþ.,ƒ+Z€.|I`ŒôaX¥ íÊa«­Ã5à‘NÅàrM~(ua¾‹}9èæÉÚ³M…=Åצ4¥Ñ’(“A&š0bi `d2 DÓ­bZD›4ZÇž’½ñÖÍË?ÿóW‰%oßÂN,cØ”0ñòÓ·PÙ«OíÒÿd¥IÔ¨Q£FÍ3ÉjE{Åæ’2_N@‰ÇKÉÆÀOÚƒÒ1€)K<øãèèhG{çÖœíL€"ŒÑFŠÎd˜LŠ2Q¤«EZš61Ût…U^Ýý½s®.6¿uÀ3öoöË7¶‰óŽãï"YŠN§Ó£;å‹’A7@”KC²(!Î?Û‰íØq ƒçIÖitZt¡1k×ijbßÝsç¤åÍ4ši/†º2Jþø¿^ÀÚjšö‰âØñ³ßÙvÙ;^ ÝW_÷(VWó‘]I?\^ŒŠÓxôÇ£Ûw½ÌqˆEˆ¥Oå!#à õ“SšfÊö˜ªÛ¾^ûæÕÖkp‰·[å°M ­G#[§æ+åY^hÆ¡†`´BšsNÅÛ'æ¬r¸Ç+äT­ºœ`Ÿ˜m•-x¹A‰í¹øÇš3’íŒÔpFêòÿ­-«ÆlÔãy‡: LR©&ö*Q§²ª!ë‡óð&ºWuÈŸÛÄ…bÒ‚Ã0¬KŠtIo Ü:9_¦Q¿04¢©øûˆ2Jä£$0@¦Çˆ2DÄCD9Bp™ ØG¦Žj—I뎳ü~ÿͳž÷{«N¹vuW–~-*¡ <,4¬‡ijœ@3<¢y–d„=¢hú»[·ËNôýã7=·Îz?þ™ûÂaËXÛ+•e;Ì\9K™ébX ñF^@H(¦x¶°R Cp‚(Úl,‹ Á$¸ηNVdœˆÆrYPæ¿¶ÇóݺtéÒ¥KW^ ùvîh‘”Ó: '»²òÕ_þé“™Ó'O¹].#Ë“@–!ÑÍ!žçL4ÅmbhˆÂˆ)AˆGÏÄ3¬ Ñ|iéÖmUÖÝ._Eß[;^¿\yNí”>t‰ñö@´[MºåH‡³NÜnÇ!7K!+ŽXp´Æ®ÃÉZõn^ôˆËÎÉ”}"ÑæOÙK­â²MZnÅ÷NœÒ<î;EÍ.)lìRÈ#.5֌ٕ¨ G`äþH7ž; †•ó¬‰fº½Ýé̺4“S4rqüÐH1à TÑ­w~HTß³ €! hûµº€%þD¨èÓŽÀ€ Ð àG? ôiWb¸å5¢#øGDËÆþ~ùÐü/¼3o¸ÞóÕŸ;P7ÚZѱ·t»ù¥2V(ãà¬UlæY#¼ Ãñ€Š]‚øÄrƒ™¡6²-F˜„2„ìÙ±óUo×ø¹ó37>YJ¥V§áí4ÚÊfó+þÍ–È=ÕsÝ{ºtéÒ¥KÉÇ:ÿa-°ò^YÍ.//ÏÌÌ\¾|¹ÓÓY^ZÎÓ¼ ™Œ4]²Ï#Š‚LäYNc†1ÒL¨ÈÄÈ~ÈJ#Íñ$禗vÕm©q~ß;¼»÷çM§?h—]Üðæ=“³®ÀB‡oS›¤d”²(w.ZÕhët¼QÖâP5íU¯#RÄŠcàf9Ú,Ç[p …MÙ”(P \°OÖ xÓ€;”»Ü¿@#®Ü`p;=«ëGîªöò¹Õ,¹tá¢F#4*åØç€:†Ÿí©! 6”~$²O+´–<{|—¤1iGg(‹{éfeÃ×vKž>OMª]»auRƆ2Û1‡˜vš¦M²ÄZ–)t®ïUçaëØº¤M²vkÝ7…–ŠÿˆÎ™'÷¹o~ϽynŸÓ÷›{F^{à'çs?{»päÚ®.n?2õèѱžÑ×¥í ±¥UÌ×[ì~J8^¨l¤oÿ A„àx«M4Œ-X&V(c¡’ã\\”‡ypS0õ„K†Ã,¡ev+'Í”41Ò,¸+k 2Ã…Å•…PèÈ’–i@[ðf6ÛrË»¾º>÷•Þ¾¡ ½1~nâÂ…éòLb†êønä¹Q€*EÁÌìgª|ÁØ:Ò¥¨vß÷ª!Á`¨h4Fó_&N¤ërâ{~VO!ÇU –#:tÑ¢ü¸ÊQ9n#™^ößšœzù—§F‡û{w=º½°á–Õ·6ÛÍHX¤.cŒs&¤ ”ØÜH$Du„”Ü0„„£•\&Rš Cš\JÂTlg…@ôÃ%\Mb9OÜ–“VŒ¨çMõÜ©kú¬$õR0ˆPgggTk^×)©s*%éÛ7dñŒmI!­,%·,ʰM[JG6¡F†p‚ø%¦:3HÆ$Ä<ËŠd¨m:ì] ›ñ›;7::·n}ø±Þ½Ã#£¿zéåñ7Ïþùƒ÷÷Ã(ðg« G‚9à{x.Å0‚7‰l`ε‘Ø(æ²æ³&âÅr‚ªYyƒþJF£Ñ|<ˆ¡$zæ‡Tú«G³A ñ†|?™Š|dãì25•|ÿ£fâ#Ã8ÕoÚu¯]»vnlüôñ“Ï ?³û©7sùBkËJ˜…Ê (¡ ιÉ î!ãJ+ŒSªª¢± ×9 r ^¤ÜbzƒZIënâ™:j·°:“g¤4òùüÇy) ¾ðFà6—' –Ã(ʆxP’E‡Q‹ª*6òU¹ü7wìØ¿wÏÁþ‘ý}£?}þìø›ccg''Çã+òKÓÇu)¿óJÊ:<÷Ž „žºM7tqÑå·¹±&÷‰« Ê¥ø!šñ0•å'©Z¤î‘xH4W3j̤fýû‹i4F³ HÓóÊ•+SSSgΜ9|øpÿÐþ_ÛöPw¡XÌÚÛÖHnÄ%Ð2Bѱ¥Eá°ªD[š˜åñ¬)$±}tÐrˆŠèà£Åó6Íâ«W¯ŽÇLLLŒ-Îäädr„4ñušk4F³LAš§?Gžëž§Ì!ŒÂ ÀêÝK—ßšœ:?~îÌ+¯ž8vüÐÁ?;0x`_ÿðàPÿû¾õøã[º{ò¹\®+‡vs¡XÈ’ÅBãO?õÝ%l$ª¤´³ô¶«7_ÔB¢Ñh4Ír"Œ™ßOH• Gëû^e$@?OÓNõ/x^9}t]wéý`qµ‡ _m í?˜»X«ˆF£Ñh4ˉ4ÊÃ É B=‘€ùåUü zdÁ>*Y™´3år2èzµÆ²ÐÆÂdoK«HT¥IÕF£Ñh– ÿ™Ô(Ç|?I«ø‰~¤’Œ|‚iÑh4æÿ…TBjú t*nƒ¹3GÔ3d#v“ä§|ßK6ý©´³ JXªTLg‰ýskÑh4fY’jÆlš‡‘çºç¡ƒ‚I`"±d$¬ŒGWa¥ÔÏFKúÂ'”–tÛÑ\Gº~Fó¿È¿.Uç endstream endobj 1 0 obj << /Type /Page /Parent 336 0 R /Resources 11 0 R /Contents 12 0 R /Annots [ 2 0 R 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 2 0 obj << /A << /URI (http://www.synthesis.ch/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 142 683 265 697 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 3 0 obj << /A << /URI (http://sourceforge.net/projects/expat)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 206 631 400 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 4 0 obj << /A << /URI (http://sourceforge.net/projects/syncml-ctoolkit/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 181 584 426 598 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 5 0 obj << /A << /URI (http://www.zlib.net/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 240 516 342 530 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 6 0 obj << /A << /URI (http://www.sqlite.org/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 252 469 365 483 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 7 0 obj << /A << /URI (http://www.pcre.org/license.txt)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 170 435 331 449 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 8 0 obj << /A << /URI (http://www.metrowerks.com/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 354 364 502 378 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 9 0 obj << /A << /URI (http://www.microsoft.com/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 170 317 305 331 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 10 0 obj << /A << /URI (http://developer.apple.com/tools/xcode/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 126 271 333 285 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 11 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 12 0 obj << /Length 4294 /Filter /FlateDecode >> stream H‰”W[wÛÆ~ׯØGàD¹‹»ßlÅõI*µi¥º9µû‘+10h™ùGù}è73‹‹(ɉŽ`/³³3ß|3óæælys)­nîδQ+üáåašU¢Ò< L¶ ÕÍîlyÑejÝñš•êÖõÙòݵV÷ÝÙb¬V+ÈXŸ og¼Ÿ ™woé™xÊøÿ½ùñ,çý¹JWAžàŒ0£=| 2é (9¿+³ZEjA\ÝÕõ±îý…NƒÜÛÚ®Ä+Ôõ:õúݹúÏÿüE„^[®·çêú¡ì³-VÄX\ù8 òŠzã/r¼@$kÄ·æè(Iñ}ó½h£3ÖF4yxx|ºJ‰$êèküÖýWÔÆëÊaB–­·,ÿíÍ™V¥:3‰†5µ S<>B£H£Lµöìîì ;Ã8gèwfÍøm°V%ôÂæš<ÁªF£Rg¹›-Œ“‘¶ÆS»¢>}+:æÞƒ¿ «d ó=ø±×ÊXÙËÓ=,-1^­îȸÆkä»ÅçŒxôÅpÆ×W2qI神z[ßó‚Ú: Þã PÄ4·’w·`) Ôû&¡¥~vú©4í¹ ‚¹ç@>ZÔ¤#ÆWŠk‡ép´cçì§€ó½éÆßT]Ûö³m—~ ¿W¥­{Õ5wýCÑZµ±Ýº-oíF•µ*{EcPÙ[7ûc[Þo{»9‡õÄJIʧ^¿uÀ\†ÀøÁ+ªJñêpéè¸M ¾A³¥vÅQÕM¯nG]J¨1;6¤c9Ìhz%ƒØ/k»ÇE:Ÿü«œ×ú¦ ¢¯” «ö2Ü|.7r}:ëØdXɲQ{w~¼RÈ´aª*×¶vÝPã Ø/î$+ò[ù–£Ú;ívoî^tyѲ/ë{ðÊ©ÉÑHkÝÝ›¬ûúúèù7¿Ìø#2#äÁ;æÜ±íûý«å’(„”‹Á º,KãR°-}Ä`åHQꀺNæÓ!ÞG? U@5“6:ZØ8É WÌë #ÂIF¾y IœYô,¿œ2¼÷hW—àîCg;µ/Z µ¹cHÞ5UÕ<™ü½"m'ºƒÙá×t°œIFÈ%z€Ü¾è#DÛdêç+þ¼¤£ø A1,pAŸ¸ Çårç—Ñ% G¾[)¾3ì÷Ñm]ãg8ózÇ >ü®¦ˆ¤‰;Ê(™×ÈÌ=YYÔòÕ/‰¦Œ·ŸËhäã»î;7o¿øšÓu]ö@* 92„jpdŽxáÔ‘EóÔá(.‡'%ÇÒ‹ÆÞ=‹,©Ÿd†Ð˜qµ#¼‹†ãgÏ¿GJßH à¢íõÀýú£=òìœ~sÜ‚BøœR4L¸å}E©þNi‘ïÌÁ[K°^‹ôC»¶Ã»#¥ ·¤ØV]ö›Á“æ%úŽn³šè{bï$–Ë\C$XÀ§Z„rñì¥êùÙ4•ŸxŸJüÈÀìdSHÿIèèü:Ìv9ð#å M€·C@îÉŠ{ž²Œ-ø-–{™uKñu4Ínº£H®×»j1E;–ÓTŸÊ~9V"ˆ†ÝB"EÁ7C)N^,BB3Vof–<ÚÃM)©Ä˜¡xJ9’«Áþ e÷Zæô0ïV[™ë|ÊïÄ$T^¤T¤@8Ꙃà™xî ·Z=ÞüÙ_D0»ûªš½{s«( ȶ™^¤z•Í‘Ìê;Pàu)ú —}ùÙ'ÈbÄyfÉbdW“AHªîù÷HwÕ.Sºµ BޏeÓ !o"³1¾EòÛ€‡´µOuS×5õ¹úáÍÕ¹ºlúCw®®Š¾;t[YÔ š°Iw»Cív=˜*únêWߺމæª{ȽùR›¾‘èZ8¹Ì0£ Âlª¼2Ñ´m -õªâ\ý v Ò“¾?1ÊKŸZLýäG|$Ÿ¸ãu¸P½†©NhV6ˆ\ùÚÏžÐ+ZÔ|šî¶eµü™}äÃÄySGƒY}ê~ªò–Qâç]OÜ¡!Êgž[ËÌžD9‰„.£Iýî–!uÆ nnOÙ& ¢|fZ“<®B?x?Ú¢^TÍa¯Þ¥ÄHu<'òYϤDÑTÈ;1h¸:Ù<ÑFOÓY-Žô”ÊÖ«‚›ÅÁH±¥^o*ºh,Ýb ýŽ#¼„sOñŸ„cîöþÁˆ¼,ùAY:RªM!#ÅmÑYe©Ã¤e¨BüòôÆÁ!8ÖA’i%9ˆâä'~Ù.!JÃ'5ø ú ºøç[ Tg¢ÛV,"£Z¼lƒlì%ØÏõ+_ƒØ öë–ìîQ½‚[CdRîÑlС'? õF‚ ŠŒFÔW阃î ŽIs,òYdêÏ(FÆ´™pì%{Ù˜6£yíšR襧ÀσԘ|üx<À±À¿jpUÄÈî­°yGǤLg($ª¡"‚ºªŠÕE±»u eÅæÞž„êS„¹™j,WšÁ;”H[xP{ñHC„ºcZ-+N-ªoÔย·Ü]¯}¦cnB *Guýý_Õ¾:Ü/¸N.}š­yá6£¯Ã'5qÜÒñ ?6w˜—™í9‹< ä¬W'¼pÚúͲ™cš‹åÅwß¡ØØûÜN´=ú/9»6ôÊIN¾+þis¶þ,SôÕÔ;[÷4¼à±—ÃÃÀËá,>Ò\ˆTìlßr†oäžnœo­=™úÔPs0‘p´ “5¸Ž€Ïì[##Œ’²g»º1g dÏ]]ÆÍX&]]2vu†Ó’!¸_ÑE:âî„–>à´Þ~BiX¨¿´Öv뢲°8OïD`Q‹Ü@½våb ö¶Ž¶Ç ÕmTóØ?Wê„úqN6ñD€r©÷%k׊Š_P¼EÜG62Û°«¿VËd™Ì:zÑÓ <]r5ks¿çì÷Hü»#¾Áï&EEDî»Ye½˜÷•?!°_Ó¯øçÎ2\¨OüÊ9Î%6̽ýL.FïHXü÷¶ån&(xá~/ã–¿î7àkúØ-{‘Ñ4²¦[~Yk6tÑ`b.LÊ•-z@dûÿÓ^%½[1øÞ_AÌI*”Ô’WaN²åE€-¹Z&c —™ íã,ˆÓù#ý½åGòÉKÒsèEz ÉGò‘ù~4 ¢~Ϻ²7Ñvjáð( ú}Íû¸ ‰¾„WØþ"©‡É£®+ùNš»[ʰÊ}÷½›“É]³ ý\p4àÞHõ¿xÓ|¤ˆÚ-yû-á»/úßÞÝZM?+¡§ŽjÏé /G€ôºz¾çlE}{àVO>. €Ø…”Ë{=£ˆGnõeè)³Öu·ä7JA|òôËd'DJjÜNî@ÞÂnZ<¿ð¿Ço²ÕãVõ!7êG,'š<ý‡€›ݹìz”±I}U¥î÷qóôª„<ѱÊÜàɲ¹ËŒ»öD“S‡}¨¾tz<Ý~¸öåθâ³N]`yªWµM–{Á~Ñâ=kÏF+ŠÐ–CÌÆ²qƒ¦ŽEp²a·:½6îg}&l¥šÉ«× ÷>àšNéèUùU¶ }¯‡ÇÞÎÄ“-m ý¿k%½¤Úªæ7áwÔÎè™PÆ×>Ž“6æÅŽ7yŽá2ýºÜïΘM®ÙƒþÎTC¶{ºc©Ü‚³RÆb§ì”åÚÞךûb<~ÎŒï¼gû!0¢ÎQ` ÛÀ00ƒ*@¢­˜ª#h7tB¿-ÖÅêNn6¾¾Ú@.Bžb 7±:Ú«_8°)™Ëpä´ýM“ìÆþ­I¶•¯rÚΤŽðI+£;þÑæ"L)Ä7C·o3ú Ì‰zÇT¥Ì¶ëŽP;ëËVï«ç}{ëáÛ'Y ÅÍGJÙωyv®y83Vp»ßMs\6ƒ„;÷]eÎì4k}½ R™mÇ |"¥}®½M}TšÏ>âr]J¿Õót±ª–Pª½G&UM–*"[I/B:[.éJGe©ÿ\¹jºÌd4ý¼.ÝT”Î¥*\E®—Fž§Û¹h=Y6©›Ëó€ÆMíH󢦥î_ˆWêŸõÉ·OÎP]±Ê¤ÂÖbvÌf¦Sª ´kzõ¿ˆÛ Rê•è°^2 RV§¸ð^%l~nùYK©Í´ð«6yF+kór²8#Oô‘;6^ˆ]¢4 %Û¨Nfs’§4sû¹UÑŒý›ÐZ²/fÉèAËZ…NdšSµ]NdÀ°„e]æÅ›³¤uS®‹jêd‰ÁgÄj&¯ÚNHŽ´ÌŹl`~‘å³R&]/Ëç"eO"üWöÏëKÊòÃÕ’­}‘쮩Z$vºý¨Ú81 ¹ä¾éUeU«ÔœÆfî‘1«=ÉÅ?`hwä\5°Â -·#‰h†äxÄqZ˜JrÝ8gƒ¼êJ^¡j–R |pü¡„&?`'(qjÜÿÎ=t—XÆjÛÊéä€3vî¸Äl<ˆòµš2ea -/ÀgæÌégI »2£Kœ¦›€ÎbjÙªiRIíáþUçÌ#3ôL]hó.üuÚ:u­N|’f]þjÔõ$»œœ×‰I7=’…§F’Éû#w 9‚5Jž©§Vö¯§jà$ uYLšRœÛa¦‡NÁŽ`‡ªWšR¡Y7n®Ä4/4‰"V|ÀÑã,ŽBg60fsÆ¢5)?Á×°*â2ElU(‘#ï#-‹J@ª1žÀïµ×›&Ò²ÖP}èé$ˆ³}3Zû@•ÊLýfÞ7•n#ø;îÈŠ£Úd™~e³®•°0<ȹ»EcM‹âjjê1MTƒ¦j‹õÔ¹B[6Mû–¦@¡B5Æ(aÐuóõœo¡10Õ»2®¿.#0 ȉši€h‰‡7fãŒW"TÕÌ å¸‚ÀPÄ §u;RœÕ€|°ÂÊM^Ûž´4]¹Ã‘ÔÖ¼¯ Û—k¹g¤Ÿ³½ƒªØLƦ]æ–Ô=5\ ¤ÍC´™õ[ˆ|¿˜¸ôBTszE–\#ÃÚ|Ny[NóŠ"æ‚ó' ?1Ìæ+\!Zèš«-ìk¶ª26'´[”´¥§ââÓ¶9b!ÌìH•í¡Û•?ðlÛ6ŠFrö¬ºDdOÂZÉ@Â]ç» 9/YWR³úJ"á-wj%ÝÔÊT2¢o“Ü?ÆbäÑq ’ÊJ…Ⓦ3}AUÒ쨀Ô#Ð+KÄå¾RQc˜>2¹KýÕº¶QZ¯É‚R=mÅ_ih â\\äô¾_LëŸþÇÕÊ‚ endstream endobj 13 0 obj << /Type /Page /Parent 336 0 R /Resources 57 0 R /Contents 58 0 R /Annots [ 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 14 0 obj << /Dest [ 73 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 68 700 526 714 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 15 0 obj << /Dest [ 78 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 682 526 696 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 16 0 obj << /Dest [ 86 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 666 526 680 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 17 0 obj << /Dest [ 92 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 649 526 663 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 18 0 obj << /Dest [ 92 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 632 526 646 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 19 0 obj << /Dest [ 92 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 618 526 632 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 20 0 obj << /Dest [ 96 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 604 526 618 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 21 0 obj << /Dest [ 102 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 591 526 605 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 22 0 obj << /Dest [ 102 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 577 526 591 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 23 0 obj << /Dest [ 105 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 563 526 577 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 24 0 obj << /Dest [ 105 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 549 526 563 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 25 0 obj << /Dest [ 108 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 535 526 549 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 26 0 obj << /Dest [ 111 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 522 526 536 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 27 0 obj << /Dest [ 111 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 508 526 522 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 28 0 obj << /Dest [ 114 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 494 526 508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 29 0 obj << /Dest [ 114 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 480 526 494 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 30 0 obj << /Dest [ 117 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 466 526 480 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 31 0 obj << /Dest [ 120 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 453 526 467 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 32 0 obj << /Dest [ 123 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 439 526 453 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 33 0 obj << /Dest [ 123 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 422 526 436 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 34 0 obj << /Dest [ 126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 408 526 422 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 35 0 obj << /Dest [ 126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 394 526 408 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 36 0 obj << /Dest [ 131 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 380 526 394 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 37 0 obj << /Dest [ 131 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 367 526 381 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 38 0 obj << /Dest [ 134 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 353 526 367 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 39 0 obj << /Dest [ 139 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 339 526 353 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 40 0 obj << /Dest [ 145 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 325 526 339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 41 0 obj << /Dest [ 154 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 311 526 325 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 42 0 obj << /Dest [ 154 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 295 526 309 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 43 0 obj << /Dest [ 159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 281 526 295 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 44 0 obj << /Dest [ 159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 267 526 281 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 45 0 obj << /Dest [ 162 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 253 526 267 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 46 0 obj << /Dest [ 162 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 239 526 253 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 47 0 obj << /Dest [ 168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 226 526 240 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 48 0 obj << /Dest [ 171 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 212 526 226 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 49 0 obj << /Dest [ 174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 198 526 212 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 50 0 obj << /Dest [ 174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 181 526 195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 51 0 obj << /Dest [ 177 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 167 526 181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 52 0 obj << /Dest [ 180 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 154 526 168 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 53 0 obj << /Dest [ 180 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 139 526 153 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 54 0 obj << /Dest [ 183 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 126 526 140 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 55 0 obj << /Dest [ 183 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 109 526 123 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 56 0 obj << /Dest [ 186 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 95 526 109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 57 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 58 0 obj << /Length 2130 /Filter /FlateDecode >> stream H‰¼WÙnãF}×WrѬ…ÛÓ -wºÝ ÒˆÕI0ƒÁ€¦h›32)ˆ”ç7’ŸÈ?æ!w).ZÚN·ÅØYU,RçÔÝÎ=ONæs#¤˜_M¤>üÃÍ$Ú‹”Š( =ûZÌo''³:YM{|QgåääÕ…×õdê{¾ïÃ7²I;ºŸüÛùºSíÅÎuŽ÷ÐÚýÏüÍ$¡÷ù^Âoèß¡Ÿ ©¨ýPÈßù](ß7bŠ·D\>ˆ‹‡²q§2òç&¯ \§/^}#þõ‡; =í¬‹ìæqq_4¿äkØÀæ¥ ?`œ´\¸ÓðIBD¬‰‘’ž4aóù£‘1¡a$÷÷÷ž‹Tjø"~êÁ•p-› (•SíÞ–ÝÐ÷_Î'Rb¢B §)…Žà&`¢•@D±Xç“«É)CYcÄlŒ¸;§Hf{P½ èÀÄè̪²É˦vçÿز{Ý÷½Ð Ï9Ä·¦íŸôÄyÙ¬«Å&kŠª³ùÐðÆùC#„N`M0…“”ݱë[ÀØØŽÕwÄww9Ž×®ÎuWÐäÞª(ñÔXX-`é;!áÿ éÒ™; àÇ ×͉ñäwlðÒÚ¢Âq‰ñ-^‹%ÁG·Q# 'Äq‹˜:éŽVÚ3„U&ÎN_¬ qqöV,ò:[+véŸ/Ä }ú}píк6ÚZi´5ù¡D˜ñ¤x]Ý»Ò`|6•°ÃµKçÛä" 7Æ(Xà>Mz9œÖ9ÍÄj¹¹¦QQŠ‚o(y$?†Ÿ‰}Çr"¯•AÇd൲å£Ä{À® àÎb³ÌÅkä`Zå5£ Fõ\„ á‘´ÀÁð^Î6žnâI3fÕ= âuʃ?±Ø5ŽG†ûHÊ>òÀ%ÄYJhš´n\¤V¡îÃ8å¸0;\ãäŽcl»¸ñ\K)ð:w§‘sÃÎk}÷WòõŠ×V´–—¿Ñ¢¨sÌÌ´qË«ÒiÉ´ÎrÈ»‰ ðV-™‹2BˆNÀt4Ç'ø?­ÝºSæ€Ø\ÓCÞ™.~£’t!jJšÒ±)è¸1Ò„ÙâhzŽj›£rtÏ1fކ‡Ì‘“,1Óñ0Ä ‚½¿”ÞÇh\¼Kî1š§ ¸áµ§±´É[c±©r~l½3@~É(Y­3\°ÅíP„G˜-\NÈ%ctÉÝŠ³yh¶è¨QgC-üËn>å†×4ÉËœý1]’ßõ>Ù´ŽˆÛØNÇ÷ÃÎÃ'Í=n¦ÌEe´¬êü`TÁHIÐ&"üÓÝŒÞÎÎ>˜¥Ë%ªp­ìÿ"ƒYQ[Ú{°ðÃîc~´ã?ä+‚}†=¥º´.#lú‚¾‚]/ÿ¹Íg WѺã2bÚ’¯;æm"rˆˆCHì~G˜!w‘ˆœÓå&'üì‚—@^j,??B£»÷I[.R¯ê#óÜÆ$"G&­¶íû“Ö]ãzYÞö½6 6ŸY¡óJÆ7ññüŽ$$eZ@åÎ o± ~ó ½Ú×±‚wì»Q4 Z|¹Ü÷ç)Õô|­I¸˜¹h™Š¬P–¹5&e,X¸¦uÑÜä<¸xàçe†;pÞaú€š”‘ ¸(Á|I¯óG.y7¤Ã‰ý˜¸ã;oOÅGºŸÃiiº#Œh,|_ê êpë0LŒåÄǺ(¹ƒŽ–¹*ËU1WˆÑÙ²ÈËF¼+.¹b¥|³»™ kƒdΉB<'grfTò ÔÝk)G]ŠV¢“<_¥> endobj 60 0 obj << /Dest [ 231 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 757 526 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 61 0 obj << /Dest [ 231 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 740 526 754 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 62 0 obj << /Dest [ 234 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 727 526 741 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 63 0 obj << /Dest [ 234 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 712 526 726 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 64 0 obj << /Dest [ 240 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 699 526 713 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 65 0 obj << /Dest [ 261 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 685 526 699 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 66 0 obj << /Dest [ 261 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 671 526 685 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 67 0 obj << /Dest [ 274 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 658 526 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 68 0 obj << /Dest [ 277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 643 526 657 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 69 0 obj << /Dest [ 277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 627 526 641 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 70 0 obj << /Dest [ 282 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 613 526 627 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 71 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 72 0 obj << /Length 998 /Filter /FlateDecode >> stream H‰¤VÛnã6}×WÌ#YDŠHÝ7Þln‹ jõ¥Ýb¡ÈL,Ô+¦´†ûGýÇ>t.RnÛ5ÚZLRŽÎ™33ÌEœ×u ê»ÀXˆñ‡´J¢ÂÆ9UÙ2N þœ/| ­g›|ÛçWK÷>ã(ŽcôÑólüªn&Q©î¹‚TÿVT|¾‚"Žª¿‘”t†?ÁŽl1;ÊÅÏŸ`ã8…† n°<ôƒMUjí|‡S„«<¼¹:ƒ_þÒa%j×µë3Xî»á·C‹ 7?ª¦_é°Â ºdDÌšY™4/p]¿4¦d4‚d¿ßGš¨xôH®Úào?¬‘¢±Êw󆘵köY:ln0š’ÀEb•°sÁ]pÁbØ×bÌq*²"*'-ž4”é´*‚Ÿ¯ßKi¤ 7( àvÓµ@è-‡ƒû™· Ô*’¾åD¢)|øBØñ€˜L«5IÙ yÙãXe89WϬêï„Mú$}Á !XfB J""ð;-êñ‘v§·Ûv3±î‡†ÇA“'.š‚ªýa&eJ•åÌ!<.MKL«G!†¡ãK±d~w‰²×ô ~|à‡­h08^®¨¶HßådÞ·¢í⓱sý—ü^^Ê7D¾ž¾]˜ÿ¤›È”'¯“)MÙvµÙJº5ð‚õ½Pr¯i[ç½[IÚ~>„½ëßKÀ¦ÓÓxÓ ëŠ}|ÔÔ$¨[ü+øs–}u»1*2 KÄÔil¨Xð=l¶\ÉF5ÍB?¤&ûŒ7QþüËK›Ñù³‰l¸ŒbªiÙM‘(k’ªP”Fòo@Yú^ÞÄ “6LÚ¦/;¾t<£òbnãÓÕZ’,Iï@›=]/B‹ .w;̵°ÄC»ÅË…WqZ}|ëÉËãwÍ‹ÂAtFÒâ[Y¿äÚN©¶Õèa!¹ÈŠâHjœðLYUþãõòu£ö%} /pif¬rª¤…õÍë·©œ.åünŸ›Á‚­Dc‹ÓúïqzÜØòjþ—çoë¬G¯ endstream endobj 73 0 obj << /Type /Page /Parent 336 0 R /Resources 75 0 R /Contents 76 0 R /Annots [ 74 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 74 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 77 0 R >> /Type /Annot /Subtype /Link /Rect [ 71 474 209 488 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 75 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 76 0 obj << /Length 1565 /Filter /FlateDecode >> stream H‰tWÉrã6½ë+º*01aîËql§¦<3©¸bå;5Q„ E*eEù£ücé@R‹cW™X¯»_/¾›ÏnçóB˜¯faþâ')cžGAy™ñ¨b˜og·÷º€J›3誙Ý~|a­g~Àƒ @Õlf/ìIx~Ì ¶–ôͤÞïóO³ÒÜ/!x™áqAwÌFP”‚2+爂 Ÿ>%,Žð|lzÏs^²Ô ‡—iøðñ~û×ó3³NU›x>¨þoÙá‰×>0Ñ,=¿ÄŠ4ˆŒÖF£(äa’å8Ÿ?X4aaÐX$‡Ã{¤ŠF‰$êè…ø·é7¨b1­† {¬Úù?Îg!(˜EYˆÖ !Îñ8‰# Dtr¶šÝgDÎ…uF1Ú)³3Ôäkû˜@²{ó?HFædX=³ nÏÉxŒ?î‰HèÔ {lzk®‚µË}Õ«¶1:¼G“YŸ»ð’ l¾Í78¶{XµT›¶ÕªY +¸äiybùàÔòärôµç'è[åìÔy,ÄüôJ1]),†WïjõÈ3 DCü¦¸ŠÒ0&K3lbÝåÖÐCtéé—Ÿa\D'a„Ùýƒ¬ëqbEû6¨ žF»Ôèż[‰› 0jµèDw]d7¬&RÒ¾ŠKêV,Å¢&%1œ†‹¯Œ/ëú¸=×âhyÄÍWÏFÊF¼I;Oз—î|a¢BªéÁrlµoL2°ê&ªÚ+1^»¥VÄtà<ð ªfBÔÐù…õ£Éú‘µþý9ÉÉ"{ek¨D J)3Ù¿S}/âÅ…6!*|ÂÅpJ(aîž»½ÿÁ+o?ÜÀýw5#å§52¹GDc²éòêE^†Óƒ±­šŸÄeÊ” óù#’ˆé1µ"§2“­Í„t5„1dtôŽ rÞY͸ʡ/l݉í–rE-šõž´)± ƒ ™Š©mÊvD\hW†aô̽¯û#.U‚(•³Ú¤£¶yó¨QB~×¼2É×îÚ®&·=Èz·Q¯+G£ðÀº ‰ endstream endobj 77 0 obj << /Type /Filespec /F (SySync_config_reference.pdf) >> endobj 78 0 obj << /Type /Page /Parent 336 0 R /Resources 81 0 R /Contents 82 0 R /Annots [ 79 0 R 80 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 79 0 obj << /Dest [ 92 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 478 541 486 555 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 80 0 obj << /Dest [ 123 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 469 526 477 540 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 81 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 82 0 obj << /Length 2636 /Filter /FlateDecode >> stream H‰ÌWÛ’ÛÆ­¼ò+æ-€"B˜ n~[i—,+vŠt¥*’° –„D€ .kýùŒücrºg¹”V•'KUKÌ­§ûtŸîž×óÉ«ùÜ)æ÷©DŒÿø1…Ž2§"+ÒHå±óvòêÍ>Õž÷Äb_u“W?̤Xî'Ó8Šã2ª‰ÿ:N>¿”áTGy°¬é7 Dþ6ÿqRðùBdqT¤¸Cçt†¯`A*ó‚R+ç?BűSú)ÄÝ£˜=v}8•YT«zßàê{qóÃKñÏÿ†Ó4ÒÁ®©V/ÅìØô¿×;ìH°yâ”Ý"œø€HÖˆ­f‹”Œ¤I3Œç·V™³6V“ãñ…dÊIÔc(ñ·ëW0Qª`ßø»­Z±üïç)1Q©šRè ?­i”‹]=¹Ÿ¼fg(çŒÜ:#pÊ4tv@|`±×¤d ¢pþ‰d¤N†µ#æEáÖœü8Òøç6ˆ„v}~~•šZªäCS‡Y”G6åZ´ ÆÙàIiHäÔ€ä9rùJ´åçz/0nväÒêýO¢î–MW‹ûCWõͦ+Ã(®›þQ”a© lÖåÝ:$ïaÛf'ªÃ¾ß´ÍïõB,ʾ¼+÷µØ®ËiÓ9ßNáS=àà<éBsÆö3 ¶! úz·nf~$f›ûþè»ZÜÖõz³mC)ƒºëÅ»¦áQÊJid’Q8ÅNÁìös‡G3*²‘3Ô 9eÃHœàû&6èëjÕmÖ›%V&X¯7GÆÔ3eu¦2Œb ]ñ!hëè7bam`äCGR‚…°Þ2ù°Çþ¦Ãð¾¬à3°jµ9ô|OWúͽ8t ìîA®¦[òÊ¢ž>q1êdœtÆõpë>$ŠBRbÒq vÁO4e×ûPa—”;^Z€€*ˆÄ[¬*·úg'ªìD³¨ËµX4kذMç®9n¬”Ï”d îêþX×ÅŽ 6±`||¿ð@TÛZ– -NÆ«sšMý'¿Ým>ÕUÿÝÈ»‹zÝÒ*³èç÷7âv&€Œ%Tˆ””ûÓÇ2£ÀTÐ쯹ÇF謤!{~ƒË»†È8ík29a“uÿ—˲éÜ”^–aæ2x ÎC¹kjaBºæ¤+-°¶¦r\C˜¶åî36BB‰9/Áp‘‡ÛßÍp_ÃYž¬påhÓ­9Z-?öÛºjî›J|î6!çì#qªËjKM)«Š“Pm÷{ÀN»iîwe[#–>Wüò‰3WYp%ˆ[äöfEÞZ‰ A|7òŸ8îš¾Gˆ‚ü{°w‡ðF-¡AK¼³ÂYJÝòP’#´=»®!u…Ž7Žl- FX¯­ÖÄÖ)@¤€ F û‹PšãêXãÄbcùSZdG Ð…VëÒ ´Äš†”OwìÀñ ¸â®(W¶8â9.³ï¬VÍbY§¯ý´ ±5%‹ŒÄ ”qA!!Ä8(i¿©6°£æä$J¤üU³XÔÝ€"ÀIõ Emo™‡)m0tp (ýG º ûãPcƒ3/µùRgÀÛwßÙzòWßD YG-Ò¸ž:/üˆæÔV“¡ìu œÊ‘rUN Lú´zEYñ¤x3ƒç@856ÊTpª (%Ç•—åè)àãàJ ôXg[]¿}}ƒ»Q¼UЈ‹ Añ13(ïÂàcÈ1Ѝ³(É ÷ »èC®£@‚Cß×HA+·²µuö ƒú|î+ê93ó‡r×Á;jTÍ/QË£ìÌMÉIíƒz¹W<1£®…~}{³m.ìPQqÚw%ãÀÌv$ ä Ëi8Ær»g÷ø¬àŸd$—>ºòlÝ´õ›Dâý3EKV˜{?¯ù€½IÍgÎÂõ ÂBT›v»®ûnÐ÷lÏzLt½KŒ/]gAýÒÒ˶Wµõ•´J¿ÍÚãšœÚ[ñ9?¹ˆüã"ŽRj2£,£?¹}ʘ<‰b|«,rÑcmðÞÊÅzb D9ا“ì|B*2ß¿ È$îE R;þêsÑNT;ÑäV#Ù:Eñ6Wd,ŸàÒœ½¼ŸÉ²z’ýƒp Hñ'‡‰¯•w®mVqªï¨ìãú~½®»z~©J{)ðëe|´±½Äðk…ü9°¿\ÉŸCò"ÕjDTBqlÐyüåTûLéŽAÆo-Þ7¾x?M’™t†k¯~l'ò”¶°áCZ¡à¥”«‘žpñÈ5EìºBÛ,Š eƒä> endobj 84 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 85 0 obj << /Length 3725 /Filter /FlateDecode >> stream H‰ÜWËrÛÈ­lù]5‹4Ê$„‰Gv¶äqÙ‘Ç®Pc»b§RM°%¶­YûüùÇ,rîm€€HÉ —µI¹,4~Üǹçž~v1:¹¸˜ _\\Žü@xø‡Ç4 Ý8ð"§‘$^(.Ö£“Ó:YÍsþÍ .ú¬M÷ÁNËV¼ÿó‹‘/Œ‘hú"Œñø‚,JD¥G—£gHƯÁa.’Ć)žÎÜhjãÔ§À#ëä_œ‹Ï”ÈÈ.Æ–‘uAŠöK—b87ëBM#ÎYU^Q¶bY!{37ëµ)ÚW Éê²ý˜Ñ/~%.ËÊF§%­û¸"&³Ä̧Åû ÊÓ“Ó'OîZÙ»ºÁ¬]ÆŽº<± e5 ÅQÙۃ챰QOÅ&ß^MLÁn©,Óu-š²ÛåÈ¿Ôè÷îaïÞ+u£hUï“ï&C—,ózÝÖ®I;¢ü4ÀÕL®œ€ îÌ0Þ‚HÍ+þñ›Ê—Jí“ä‰ö-L¿)»Ô8¾¼Ñ‚&¼‹}MøÅÃnyéLQ¶*ÓŸþ(ëˆQ¹”¼R`_“;¾/­Žå"×®…@Ÿ¡ÀE}†¼>0?+†ÎtRL.`“˜ Züþ> ¶QåâìbÜVp*e×r­¶_ìï’×Úß1&ŃÜ$ÿò‚Qäƒ|úQo}ËnBQÐ}XÎáT DÔwhäŒ ¥)2-n´Ö¾* ñÔãzŸœ£OÝ(øÿ ¹-Ô!Ÿé|ãLÄjeºŽâ¸éÀ“Þ‘}ðû¸SÄE WbT‰'‹Ì‰©2(ôíÛïE¾Å?3ê^•®¾AŸ©ld/9ž3ªÂÉs±Ð¬7¹^k´FO ßåRÀèJÿ±m§7}<²Þ±íÑO²=ímO­í_ÿ¡Õ’¢iÂ2pøt[ëoBq¨+²_de;K·³˜€ÅR¯K±TZ¨Z‹u¹ÜæXÔÏSŸŽVJ%¾6úK³\|ë"…4¢S!@EÛíá©~ÝhHcX‹7J´q­ ë|«OæE¹sH{¼_™Fó™ú ïpçž–jÃIhÍó;˜“‘OžX+Q*­WìŒæiÆ+ž«ha(oÔx`s@6ü_l¥þ¨@®ÌÇ·›vDÉN¤(©äPyäÒFe×d(HûJS Ȇ¥)»FÁ'šH…,ŸnŒ¥!©‘šö4x§í\1½§Z(=^ì¡Y(¥-”ßÀSV’î–iÆìõ¹ÈrÜDÝë¢mîøe[Q¹×埨+%ì«-¸X˜j)2•ëb©*žöÞ“CT}”ËrWŸp~ÌX¼VÙ›ù‡“Ó’:eFç&²T'œìrZ.5góÜÛ/'/šë“¹aïˆY‰ž@ÿù¶{³Ü§lr Œši˜’@¾µyüýe—DúÈiäŠr'æì¦ra¿®™”UÞý&/)˜\BBm6¾¸sC5†°ÃäßC‰àóíxÉ¡3si²{ë/éë/± VÔ)fr£³ÆŽ,‚#Ù:„]†&·Îâ”Û‰%³['L<2‘¤Iz¯4ùa ·©9ɲú£|ïL¦,¹È‚@ñ`› Ý4ô)rüà0j؃ÀxNwŸNˆA¨ï´ÅY0(²¸/²˜ƒÀ˜|ØÝ´[Ì“-ÂÖðI4 N¸×ÚaÛ„U]Ù^Û@w«…µ®ûõv³)«°W ’o ÂÍZ»â×’îY²än´­’šq_ ýõfÓ¡³òrC-Ué°è ˆö€›É+yM( ä_•å{ŒKÄ cþO¹ÄtŠ ¯ü ”²¦*˵݀y èè·FÒ'áÝ•0mWQ½ò:ÍQ8â•þ¦²¿´K­±PµØil‡ç;SoQÓóf»4¥7Ù¦*?‹K˜Øñáq,>œÚ†KÇÓö¦›…IJÌ9DþB5ťƒæà¡XÓõxÍT§é™HÚÜŽøæ½Çî!a´ÖÞwÐtÄ]Ã`€ó0nŒ^±^U¼™Å[•¯éiÞ®ÊÂ2µ¾‚ÑŠAÎo¹?-–Ui–„ÙìÙcý}ÀXyJ$¸(k:žHírÛl+}x½ý¹ªÌï±ãŽŸ(HÇ<3jF™*HM’WÔH¥XPãŸÙnZθߦÜmp!\³" +¢}HÙvA":¶‚àÏàŸÉvòžÎ»æ’Ù‰L>¤’ê{£éï£é·:ž†SÏni€«-¿Häçó ÂÙ5þ,ªöK»§²NÂÿìü\|rº„´ïÏž‰§ÖMlB,nPšÛ+SÔ Ù^•z­*}½ÍC™,˜À„.UÑKRŽP}$ki[ƒªµfÒt¨3<¢Õ÷⃠ó³¿ÓQ‰­É‰ xÎW¤ZŽ·ŸÈ¿ÚÐPºÜÖ¢9NHEÔ¬¸fAþ)1 C³uIYö’ÿéžÑ½¡kMƒêÆ>œà1£ó@NŸ«úeW\š«me±c\êàZ!±H¸Þ™Ä$ú¸Æ6Ê$©ÑZÈÙÆ :qcyÑ•Mí “Z½=׈ouršð%®ªÍÊÞB,„ÉïnÏ>’"e£³UQæåÕm{ÃC—³|Ù LmÕ(ÔŠÑ´;…¬¡ð™Æo 05Ü X]ÜY !a¯‰f©í‡1<(`·Ò”JË×Evƒ>N2eL妹µÛ¦–hR•‹œS”ÍcÃÏï-ç>e|­9aÌÀ™MZFr›»Â¶ªèý õâ+JüßþÒ,ßIuX’û[“7",‹îz“PКí›UomGòï)dö²ëËHó[ØOÝijï$È}§y[Ù¹‘?BÒÛqö wˆ»Ãp¶W¶Ù±â'lÇ›Iø~÷4´ÝÞëÇxJÂZÌMtÆMõÅoT£&vÌÀ”MÏùüq P^O.ÏäÊâ½ëÚÔð®–¦ÓƸ×%@=†Cñ‡2YØJ™³Ì¹¥ CÖÝ-k] B‡·"Hshêþ3@õ¯›šqF«qûü›x ÆW× ¿]Tå¶Á‚#ÌìïRûk™IÖV4˜!êˆBwÅs•­D»%ºŠŠKQi°É ¡« E×RM;c›õ]¡Z DýŸÂqØrú«lÔ§:²¶î…P„,´ÒŽÕYì“Ôb‘—„á”bE¾‡„öA3,`îâÚ‡Šñ`´‡{­V žéCl1‡-·]·ØC4$Z9¸oNºánÔaôúaÙQ7kÏ›k€%5ÂÑI~ô`1Ø{æñQ¡¦ÃB‹U« ¨„оSsÿc½LvÛ†0|ïSðH‰)^äsÛCîMa Z¢"Úª%iïyƒ¼pÿ™¡d-Fzé%ŠdŠCÍòÏ7˜3‚´NK œ´µÍw¢I¾Íg¢ŽQü,Siމ‹ÑÿÙ– ×56„”F¤à•:´L_Å߈â# kK Ö0³!{w¯ò¿rºkU¼æŠ—wË:ŸFúˆ¿&õæì%º/² 2ó@ÙSâjJ‰óq&.«´oÃi€a…ÛØÊ“¢y1.ÌB1lñ/~®0e™º…µÓ|yýaÁHàäN‘ú\ºØ¢f}~¨lnL[êøS„²à¦†A­—LZDMc†8MÇƒÕ °7ÜíPêÈ"Š^,0æäî4²¡ð†X4•ÌÖµ9Y€®Ià¶Ï¯àIÒjAÃ&>®œ†îÂåCˆ)®Â!rF}úì«Ò°EtA“Y$ª$zÛ»M»¸ÞÁ åäÛe0»Äº Qdá$'Ïqã1â®WÂ[Öü£;µ‡Q@öþΧ?SÝÊV®-Üé€i(óqã—Íü?T‘ÔHÏÙzÞ^ž&+Q¤OObÀ¿)—'誡‚¾?@ë¡Óù³MP©;T¦ú#Êõíû§¿ÝÍ ï endstream endobj 86 0 obj << /Type /Page /Parent 336 0 R /Resources 87 0 R /Contents 88 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 87 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 88 0 obj << /Length 2988 /Filter /FlateDecode >> stream H‰ÄWÛrãÆ}çWÌã`k a.~ó®6®µ•S¤ã*K.DB"Ö@“Ôj•?Ê?æ!§{CH¢´©¼Dª"0ƒ¹ôåôéîwóÉÉ|n…óë‰Ò"Ã?¶2i©³B”U‘j—1¿œ¼ß9±ØñšLìÝä䇙7»É4K³,ËÉðv?9—?×ÉÔ¤NÞ4ô,¤pÉïó'ï¯D™¥U;Œ£=|¤Ëá ÂŸó/¡³ÌŠ)=*qõ fÝ>™ª2­äªÙµx…¸r'¾ÿá­øíßÉ´Hܶ‹Õ[1»o÷ÿl¶X‘cñ:ÁVÖÝ2™VxÁ‘,kÍi•*[”ÏO½4ʱ4^’ûûû4!Uv8‘ŽzH~»ý **-wíðÁ/[¬øüó‰­˜èBÁšJ˜Ñ‚$rbÛL®'ïØ:8Ãyg¸h§Ò@æ`¨ƒ¼í )MšÌ?ÓE8Ãë‘ñG¾…ó³Ôà/,ˆGøÓrÒVž¶»ý¶½ºÛ·}'þÒ®›]8á\¢„YùØ•ðÛm¾jÄr|Üm³lkq!»~{[¯×¢éoõv±j¿4‰Xôݾn»€mÅu¿^÷÷m—À¶¥¼+qÍ2ybF™¨KyÐ¥ô\ÈO›'9<óá;±l6M·l»Qèü/ÍvÇI¶‡þN¬ê/M/É·¢ë÷"Šþš—®[¿rß,ƒ4÷-–\5ʶ[¬ï–Íò"ùnp?ÇÎûYˆÙûOùG˜ñ³(ĽP™ø«8ÿ=ËIé!º*SkÅ-3«D^i<ÅzB‘©4&hG l•‡ô+f„£ƒo”«Ò’œ£ó*-ì>iÎ<þÈùçò}¿l~…nNrk¹Ý¶ýö­øë¯å]’á·^‹ÙþnÙö#7èè†âpjåͶÿÜ,öÑrFŠq[ÿÑÐÄ`,HV‰Ã ©á–ìP€€?Mbj-TòÁ£„ ¡`Ù –T4Œ;¡Å…‹&S™KM!°µ,hë»7l0Köe›ñ›²6AìœïxufýÝvÑ$¸e÷ªôâ’°(È·SUØÔ¹ƒôži ¢Ý ÂÒR{v`P´…ð°Ï…$ å°>—MR¥¹ìð[É›6q '?ð.—þy_]”ƒ)…`[̘ȋÚùƒŒÐ$Äz]Ú½$rÍ%–CÒ‡MCĨ˜5fWOñâÏÌý™»‡f»í=k—¼£ ;æoüJc†•ÝGA‡_IGô_É%O6Dø¤ Ý­éÂ6*Ãa KøÀva®1rÁƒËå•Ö‰2rãßÛ„®ÉØ‚,‡(©Èj7>Óîø†{«”;»‰cáßùM·t–mJ«ÝøÄB“ÄÁfÖ ÙÒ…´[/YÝ\Þ&S„ YF“ï‡ézO&*d®ÄI˜éb³9êÏ/ÃùWëþм©É›þˆìÈcGÐŽ¡'ØH bá2£†Ì†]ΞXñ"0D/xɆg_ÖÆÚ!Ü4;ý‰C%Á’è«]Gщ> ‹6ЊRÆm;Þ·ÙôÛ°€”6ÓÛ‹“GqœgÇgPyÒÝPœx©ðó#¹ôk^‰5RP“·ç0<_xðçþ|η£óÝÀ~üyÅäú@~¶èI•…šyÒ‚,ûÉFú™&¡¬qÛ'ZãúåÝš¿ùÙ+^Q'%'|«Â‡tÅ_Èå‹ ¿n^ýsâÅ5ZCÜ †FýT§ƒQãKŠ` ±‡Ê$•uMJ$ù»æ–ÌTÈ>Q”ý2Ž h Ázäï$JcQC$ýº$¼á‰$Y”ê£¶Š‡»´Ò= ìüÖé´ã˜žv¬çÕ¶]rzCÜœSÈ7VLÈS sÀ†Î3Nø° ƒTpÃT1%E#Œ ˜ ²[ê²QY'2ØÕ¡,‰9Õ#ã ë–#™Sãs·ÏûXZý·i_ë ^‰"a+~¿‘õ©FröŬÿ´!§gÁmNüV\+VZè‚r;å/=òÚ³ûPÞ©2¨\?‹€xÍ,\P«ø›ÆµÄ`‹'œàMP>6ÁPKhSxY‡˜Öf°æ!O‚RÁÛ”V‰¸€(B’å¸J§:× Êo¤p²ã( mÚK?>=;K×íU, ÆÀÒ%Ð1Vœ€' TlãÎùGe Ì #°*¯i„ÇkÀ2ÜyÉoý° BŠÃÿ…r22Ò¹üåãå÷””9ÅÕë6!Ÿzãb79›²‹•…*üÞE½§”jeO\¼Z”F (æÑ`*NÍ3 *›ŠËQ¿ö°ô1’Œ)};HHrǃÈDe}±x2^ZÏ!×ã]ò≆´rç8?jòc°G®bÅ¡Bžú…«ô”QÏ¡ åì²æß4á fÓ•¡Ü ñ‚«“ ÏnŽ¢Ó ˜LèÆ*_œÐ':ãx@§åÎî° Ž‡eî{ôq¹5|4á^Ä·e@Ž&t©Ž>n9ŽÜrf5L¼7n=Žp‹Rùãe„«j”‹Nß]~L¨"éö¾¸k¶× ÝÚ£m•ãVäeGC[T$j| àA% +kU2”YŸØZ¥ m•>J…G&ÄŽCYO¨é5ATÕÓ¨öŠz@yüQßEKP&9_÷zà ¡þ´A*Ƥ$^ɳ³ ã.²UÐ[îËPU‡ÙK¿¦ß„qÛw»tõªqÉD°˜+sëVG­«³¦âR…Ö’ñ^0.å<þ±î8;T±ºÕÁ¸±Ñ«-ÃóŠ‚Ù„DÂ3{_ºså[ʯaèÛ?G¥ M”ñ6¯õ&ÓÙ8>¡ùSÛšŠÓ™.ɨaæÔæµà Ëånfà´¡È|dÛ<4¡iJf¡Â6}ELªÿ‰÷3NoÊhNžŠž œBÀ *ø..|,'ªÕŒºB yÁ{ÇÄ4¡ÖØ=Àó,¨õþr…•32uI~*äOÈeü²n»Ðõ|åR#å~h±š¼ÈÆ7B8Í<èøšîÈã·áŽœï0þ¬úãy+ø?ßqOß”l»áðÅñnЗ¤çò T¹üÒîîêÄr~#‹¥_\öo ƒmÿù‘!¬~jˆŠ„TAŒŠD¤¶—EÌYD¿ÝúÉz‘†·Åæ¥"Ð A ÊöA}!w=7\hÿD-ö«f׈떅prÝì8r­|{Tm:<œXø™|ø+¹i:?n;ŽÖJо{ß*!êhÄf]‡™ë zÏ_¶¡¼HŽ'~í¸Í«Öøȑ%9'+QbžNQœ¨/ÍŸ$Iï˜P¹ø<)j*+ Ò j%®õJÌ€êF6RUyÇ!S vÇ_óØ¢\›Ã…ÔîmÖ €@3~ »,²r(¨´>He†S>|­oE€ÅfY ¼Üw &‰> endobj 90 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 91 0 obj << /Length 1470 /Filter /FlateDecode >> stream H‰”WÛnÛF}çW Зe`ÑÜåòÖ·Ø.‚¸HVB[Ô Š¢-:4¥˜tõ¹Яè?ö¡gvI‘¦ÝF±í’ÚÙ9s;3:Y8Ç‹…&I‹+G*òñE§+?¢8<•ø-nãÓ&¡¼1g|jòÚ9~5—tÝ83ßó}wäN¿{p.Ä»Ì^"® ^#A©ûaqî¤F>¥Ø÷Ò:‚„eŒ s‘Šû‹"{Ïߤ|_ÓŒ—”–;šïêÖÉØKźhJlW4ôòÕýþ;‹¼@Ü•ùúˆæeûGq‡!W.h‘Õ+w–bƒ+ "cµ±HIOê(ÆóâÌ¢‘‰Ac‘<<> endobj 93 0 obj << /Dest [ 120 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 87 478 103 492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 94 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 95 0 obj << /Length 2569 /Filter /FlateDecode >> stream H‰¤WÛŽÛÈ}×W4à—fV¢IJ"9y Æ3›µ½ö® ž`Ñ¢ZR¯)’Ë&GVžóÉWäóSÝÍ‹4²½@l`(’Í®êS§NU½ZM^®V ²ÕvF,À\iêi³ä&ö£4˜³ÕaòòN§,ÓfMÀtVL^þð²ž~Кl2ë~'ùáÍæþ‚ï$]#ÎÂÀûûêíäÆlpÃ’À¿‰adžºöû(¡­èWl7ú‹‚`Áft¹aë{87 ÿ†ï¥Vø9÷®ÙíSö·ÿz³ØŸóZeû){8ªæ²ÆŠ%ç ,¸(6Þì?°¥ñÈÛ) ýp'¸_Ý[oÂÔxc=9¾7÷c®±#muòBü-š=ÎF\«î…]–íÍþ߯&!SlÅ!à Ù<Á…áf1ò(eµœl'¯L4"ÔF#íqJæðÙ5a6 Ï¾·ú•öˆÝöyÉÜ;·àÏñÏ- -–C{Ú‡€ÎØý+/Lè­7< ¯¼ÀO¹b÷?²ÔY­*/ñ—¼QeaŽ{Rý!‚¤¶··Z£+o {à:ç’„*X³¯½ HÉÖy™}Òf +·À8åx-™sÕ þàž7^„oŽÂ} çqa÷òIoó²:È¢a?ª†=rœåÑcÝZ³ew”ÔeŽŒihñÞ›-ý—D¯˜oÚ\^àú'#¨£êˆvàS²èâãìÍæ ?LØ „œ÷&½Qþ µ&ÀíG½pdç[Î@|{´3Ks>>ÙØÈ½h„nÊZž›gáè8ÏSŸía*WÅÎg+d(Z»èy1bóIkÉŠ²>ˆ<òV·n%UŠ­U·]áQÇÆd]ö¬ÜÈGÏÔ-t>·`†£èÞí Ÿu¨ºé8o‡Ž‘« â£áyÙoúÀXAìó=t ˜nê6£Þ"¢ÔpiQŠÍ½I ‡“½)Ü"ù·Ô_Æ£†àfÔ´hˆåçy2§w7úB€s4ªôÉEh[Šóv"ì?± ‡F‰g¹ú T°‘‹Ï‚Žô×6¨Zz½prõ«ÕÈs]R¥æÚ4³0öѧ“êYïõg ÑKÖâº+ËÍ5ùpíÓhd@\F}t8äzèrýçLŠâ•òµ’½dEyD šò¿îIÇ­Ò˜šÙ#¶µ£®å4cQÜo¹ÁÐx¤û¨\T{))DeÈ0l>Jý! ¤Ø¨w¾=Šk´üJy~ãYúQ£Ñ×`W0³òýÙ|ä];ÔS+k‘}BBqŽº"¾nw¬l›ªm˜]}²Ïí5"SvÜcz*~~Ö ·ç‰Ù&.é¼³•ä“Ĝ֫Ò2`Ù ™Ôá½9F7ÓÆ³K;Œ?ôt¤G¶Ó‚m޲LQTÅ–Z£‘V-!6¦«¤ey¹3m”ß94þY…à·_c`_1¬1JBC!ÛM^éñ£¥œMµƒp›Kωõ®ÀD½úܸPZ‹kÓ£Ôâ|¹z6FÈùyžÐ++Ü>»Ðka·6ƒÁ‚gÏ Vö=ÑDŠÍÉ‚sµ‡Cºf(»Æ.ñ¦kÀ&°ÌÐ:¯Çí²ïào¦‘ˆIµZ^‰FêÇã1-b¡¯OuAú•éу’9òÙ¤’Ò’Š„ÀŽ;ª±$“µáÊF>)êLJQC¦§l/kê)!êÐÜ´…—UÊ ôHŸ5B[K`¸©“vô#7jù[‹6Ln.Åf6œd|*º‡]bXÖÞŒ\lxLä÷¼ÄAöÎÊïÎ|C¬7³"A#Ͳç%£×ÝgÓdOôþ\GyÒº©¬fdÇêÂÅÐI”´_l¨±ŒŠÒG~tó`ÓÈârr¤þl÷E¡-þÕPª¸Þ‘¶ïúG;JÚñÑîËd7.žŒ÷#¯X‹³©Ò¥âÔºëÆYÕw—×zÉçT4(ÁõÉ (!5-&sS¾Ý7IJëÿ4;JöÈMPaHo•IÛôÂ¥¢B®j%idÄMJ£Y{–™#Ü‚íØ„|Ú ˆñK®³Z½ÔNˆ¨]¤õ ”=hâÛËÃnýZš1—¼)h]¶7U[û¿sJŒ0%†nJÄlý?³aÚ§Žä÷Õ׆¥è hk±tÉwßœóÂÝ{dý²ýÅrP¤ÙE»œu”ÖÎú/w {#ïGÓ˜|&W†Æff6éS`6TÀQœ1·é_±ÓÄoO}ýWw¢k…MAÒ—&ì®» .-_*Z¿Ç“ÚB}aþ Öz¯tUjùóúWÆ^qð?> endobj 97 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 98 0 obj << /Length 2716 /Filter /FlateDecode >> stream H‰ŒWÛŽãÆ}Ÿ¯h @ÐF\ñN.‚žÛ±³ö.0‚ĔؒhS¤BR#Ožç <_‘ÌCNU5EŽF‹õîbÅ&»»n§ªNÝ,®Þ,¡òÔb}åùjŽ¿ø ÓÔ§óX%Yìúé³kŠCeTeL媷†^;É1ÊÕw|ÿ{QÃÔ›²¶_mpfJ@atVÏÙj½jêÚ¬úNõÊÕÇ z}S[©×êÉYü2 °ç»A&áeÇ“è~ÇG~~ך¼w°Nz×Ô½ù­?¡D¼Ÿ¹Þx yR(“‹žÕÑI(U¥–ð:œ¾Ê«ÊÉ` )ÔºlÉC±î]öFQÊrE!AØœ²Þ\³Ø0fìŸež4Ög¶Iѹ^° Þ 9®¾fûnMezà ¾£ÌLõ§Œ Ï5­•%LC®‰™+\™ê\pUU0” Ï;Çbg]Öy¥Ø|ÊU |"°ÆÞKøÅeGrߪ5Ók{ƒshå’9Ê&0™Ät%¶ŠY‰Ît]ÙÔ”ÿT1P SßM¾Úª"ïó®oZÈ)veÍ ‚ƒçF:wáħ©Ý >ý“£ÂÑQ¡èðD!Èô€.^bdX¦-žû/C¤“)¡¯l†äиú‚3%Ñæ¨ØPþþU92ÛžF°&G':·7áì¦j–ˆMOé |&íò]So~ßu®’\RƒûŸæÏ(D(siLá pa‡$D£„hpœøìà ãkHzfQ×w\iri0û|YVe_"Ï"ªo–SÏ({0]•5¼cÌ®ÕqK8 ½ÔIt©Õ¡mMÝWJ^Pìp÷¾i{S\Šø…€®³-¥úí+©“¨—¡4¹ìò±S=Ùe“>òæJ6 ¦¼à¨§ºåv±“ºñÌ‚@(#r'UÕDiðZªÜµÃs¦å¦‰Æ—00B{n¡]Ö¨|Ùzõ:\Ö?ïÉ­‰½8gM=ýWt–ñ¤:°±.7( ðÅÅLiìn ㉯D’Ú:~Ý;>¢Nu(_Bô2/’>éþ ËšO‹Ç#}‚¯ä"Æ7Edú¿T²1g?úQí­ˆ•)JûrsÑqñè¸ø%´¹ÙPÞz§J€º8vMÂÈàO9¶ÊëºéÉÄ ˜¢À.ÉÍXlÌÆèÁ-û¶ÙÀí;Ó^+”à3÷"p=Û–—5Y¥»}Þ—œA6Urªr§Ò)¢ªM¶ÎœëHS#Síîêòò —š–t¶ÚJ‚¬åE'ç¿^ʪPõa·ÄEsµ"ºX8Òñ`zæÝ5ãi® ÌO") ¬]k€Zˆ ÈpjÉpàFÑe¨¿o¾* 4#]FúŒ¼J'Ý÷U½, T•r]"˜êù[¾ÛWæ­z²)c+i~è·oëæYÝ;t?±Ü ˜FUè¢ÃLóÈħ5»æí­Ùuûþ½ZjîQ–~õx­> aµgßÃMYƒ;!Y—sgæyY‰gCË ÝY :>EAóJ„dª^ˆåí—¹Ÿ¼ž°Íoù1—zöCã‡ÒÒÔzõQ¾¬Yº%¶jg¨…•YSÔ¿÷ä#$N¹›],ᯧøŒD˜âZ•kÕ!ùW[d\³^»ê+dÄ»?Át°Ÿ‰³­•uPeÐzSížkà)¸ìI¿;HáÑFÅY}ßðl‘jA& Î1ês"}2Ìsž› nï[A;…ù'=câ Þ ) =âH#< •Î,Íè®ï5è¸mª§`_•™ñÚ/þ¢È÷=FpŽšvŽzú&Â4'jAßÊÞì^NÞ“T3íL*ò‰„†Ák¡6Õ`«éeV ö½6ˆ…ø#Vü3y·?ÀJÐFÄ$‰…<»ÚJ-ÌQ4hÃÜr4÷…±»3ÁÈP¾½Y”;ñü8M-–=ÞŠ¨8Ë^ZùôµéooG¡¦ÃÏ£àSpéQÚ@ô ~4ÈÎA\gQ’Fç(Ùá'üz^1§ïN~MáטýŠ¢3H®žø5HÚq¯…Çïó¶íÖÏÆóŽm…™qüÂÌA u¬—‘­ôöµ Œ_tŠ_ôZÐ è8 J‰nN-ñÁÊ  $ݼÿ@Œ¯oTǕ™]¶ïBù&>Šû‘¤|nF²A /¤ùð‰åÔÍŽÏ=IsZòú­%¶œIYæ±ÛùKáÐb8¦Æ#% •g#óÌ$½Á““×ühA0#¸A¿êÖn’M›uxª§áPÍÙ‚’+(T]7DÞf µâIg¥3u“øUå¼¶ý~(â®ïË}Ææ”;'&àøò,¾¤…sWkÛóL& TÔÅžåä¹»ý;v¬~Í7˜Õµ’CÛæhOÓ:6·Ä6&ŒÂÅmG¤±‘¬£š€Ÿ•”pâÜ éë QðÙ¾å3¯ýIÿaAEÄÓ_9øy{æN gÙ„½ô˜5øÌ)©) ^óïCÙ;› ðÁh£ºá8FB¤ø‘W磛$ ®[4.­0„`r_HÏûß­°¥Yåy†J581¨”Ї[ô¹)i—¢Î¥ŠCK Y¦,R+¶מ'1SoÄH|E?–UE4BÞ00¶ ¹ÓnøG†»²p_•îËÄfàÆ·e·o:óaùË3®ýµcž_"–+!þ˜Õv • ‰÷²Û¼ƒZàõ¡­P‹@7μp²ˆÙÆ0ZAÇ÷2AðÜèëåHÚ‰iÀÎð4yóÞ9áÓ·e tçÄxæJžÜCœ)9`7Mh@Ü&n<”‘8Ž“³¤ö‡¤ðgZdÆnlãm©“ú[^5+/"nº9çe¾¨èú¡‡Æ!åâîÃê^gT‹´Æ$Õ!Àœw _§I5Ç?g†¸ØUßåŽ2‚Š8!Œˆ–yKÓäÌŽU/úÆX¶Ä¼‡reh0è„Â#&ÆHQãõ–F@¨z¢Ùü r¦à™¾Ø™0ÑLØ#¤òæ D|ú¶¨»×–|I^&> endobj 100 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 101 0 obj << /Length 2223 /Filter /FlateDecode >> stream H‰¤W[oÛÆ~ׯX /ËÂdx¿ä;RÔn«(Ф0ÖÔJb+‘‚HJÕyö/¨ÅùçáÌey³åÆI`^VËÙ¹|óÍ̇ùìÍ| OÌ—3Ï.ü‡[˜¦Ž›º±H²ØñS7óíìÍeм¦=®¨óröæÓ­'VõÌu\÷ä3»{<ξÊ/ʲ'”+w_‚dë÷ù³Œd"q,†C‚Ô|´åïýEáSÌ‚þ#|× …·LÜŸÄí©l,ÛKœL®u]Àcà$²ï?]ˆßþkÙ±È}‘¯/Äí±hþ­÷°#‚Í ¥*–Áˆ$Èl2É÷/ŒxŸ_±6^JÚ°&Çãѱ'–5HDQ'˃kÙ¬ÁFÏ—uÑýÀÛò5Éÿ8Ÿy¢3?öÀž¸ x |¥b¯gËÙŠFú4Ÿ’ØuRŒ!첕ü*o~ž[växò£e‡p{KÇ!†0dl*b–±bnE ÷Ìò¥·º¦w¾è>OVåÝ  ñõTŽ·q)–•e§ðËÞ aÛâšnÕB‹-]ZÞÛX>Æà^‹¢›¢Ô‚µàK‘WåÒ˜+a6úoþL¨¶”Ma~`¥rÕUIæÚd¥ ‘ ú(L±‘µFˆø²i Df"˺+“µcàFøQï¦hpSÄ®ÛMSì6Z Jà(#ù‘¯¤TžâW‘«RìÛ Ý©½ÚlôæB´fo¹êlÎõ®Õ<âíf½×j?«†vÜZ=áae~ý“Ðå ¼Öë ûÎødtÆGÔ#›Qd#©12‰ÔK âbž¨%ªù‰bItjMŠkZÿ- ä-Kæ[ÜH”fy]Tåæ$šŠ´ÿå\Ve£ÿjÞ‰ƒâM…å‚Ô=xó›Çuay¸³ µKFpI.¹9U5z.Ùô1{JGUØmÚ• 1X¶eŽ–‰kþÇ(ûS' Fé1Æ dB _Ü]îñX4Âò| ý_MO!®’e#þ@)(àQà±Ð$¿ÜhÔýHÏ» ÿð„€;}¦Z\iðOZdç¨Dˆ¦ÈÇo–ƒÛAˆ¤3AÌ”Ïs§Ô A7„Á ã[”ú ÷"·/Èñ!% €2ç0 µ²R0N×Õ²ÍSàSƒˆÇ Q4ô­ªëv«k@jÎׂë™ZƒØ…¿ TÞ!ð†]ŒPI•˜œHMHËë¹Æ%H9 Ù’`Š £íø‡ ™…2Ò¦R·Õ‚oÍê3ù*?S¦—”{É0ʃdÈ|vsÔºŒv“GüÂWN”>ù¶®ÚÍ“Bªbz˜t>“6[ä ¤2NYµ°‰Ey¯"ññz 3†Ý rÂâ,Õ ÁàX)d»© ›Ó"É/|kХȌùZ•+ý–jOB HBžåácÎOP¸! ¬ŠƒfĈ²‚‚Ppc—Õ^›³[p[•¸&vVÏ9z`U&‘d¢ÞWmƒjœ7îÊ®£´E'êýBaíäΰðçô·ãØËÀÿD ôÍ:¯ÖÉõ³^.ò 'ªë‚ßQiËN¨µ¢Èš 9ßþD|yeVüj¾Ía5ŠcüÁç¶nЧ ¶=°|÷4µó“nn°Á€’¥úhZ<5”Ï!©»¬Dݪƒîd…AÀjygÕzƒSYWúPäú3A/ŒD <ãõ!˜ö³hB¢0]\PCÉV_}˜óâݘ…>Øà†Þöù÷&é½Î}ÞÈfôx,YÛ/„ìx9ºÔãyG…2¡å]\C Ki‚«ásÿ2t‚:Á:"“Ò@ëÎÝO5¨‘4K%´×QâË_£—ààõðôÆðôžQOŸáiÎðЪ0a¥®Ž¤cÎÅðr*ó5²I:¦Á•dÀ³Ž1ã–y)²ÒA§tŠJ_™Çz‡Z{Tbzûù3·)÷ð.!0‘"WFØB¿à5¿' ?žDÆä¬×E&î yp‡ó ôÁ»¶ìÆZ:6I\ãÞôLʽ– ã ÍàKl˜I¦Í“ô@ Ø £aÌ£!ɸï5aƒ0?‡ýÏáS>žô·7P!Ê¿ìöû:À‹MvâëÆ¦©x| ÍÕ´ÂU©j×¼-«Gœ}®©ÌÜá\Ý" Tª”˜ŠMÑû4öAø§Tñ¬3ñ¿YI›aú“®¨ó+w8iਸ਼À18A¥[ ñƒÚw T€ˆ ðq½Nåb[”ï f²”IïCž9u˜‰çÜbu–Ÿ{XÐ¿×øyÁ.3ŽeiÞ0¯ •}‹ŸRq8èh N@~•Ž÷ Rs YKÊŒ´¹$_©Q& rQÝ17ž z¦ ûHÇiŸ#O#ŸtªŒCm>ä_ §â´mÖïà¤Âˆ3{¹ÆB¿òšÀ^òš& ô’äG¾Ì„¬0ûùIØ# ;lû;ê$‰> óUôj6I293ÎÝ@Ë9¶“ç3ÝxÊ?ÒíÆ"Ò¥ /T¹—ß]€“rÕÒgv)NÁÚéuÓ!mG^~gæ¹Öò$Í=…9£:–be†¾{:ÆÙ D`7È H!96Ê=šOöMüÿøæ üŠˆ-õ¡ æò¾ƒ0,B¾Ã@x"°ÝÒû‰7•y?Bý‹:ù…¾oWb×îw•ad¾a˜–ýã|ö¿s3™æ endstream endobj 102 0 obj << /Type /Page /Parent 338 0 R /Resources 103 0 R /Contents 104 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 103 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 104 0 obj << /Length 2629 /Filter /FlateDecode >> stream H‰œWÛŽãÆ}×W4òÔ F6ïÄvgfí öbd„ñ®± HjÄDC*$µZyœ?ÃÿÌCNU7/ÒÈ^'^cÔ$»«ëzêÔËÅìr±ð…‹ÕL¹ÂÁ?üøql;±Š( m7v<±x˜]^·±ÈZÞãˆ6«f—ßÞ)qßÎÛqhO6›÷Ëýìƒü>µæžíËû‚~])”gý¸øÓ,a‰ˆ; q‰›Cú¼‘(Z…Zп…ë8¾˜ÓO"–qw¨:k®";‘ë¢-±ôìH¶âÅ·â‡ÿXóÐödSfë q·/» vؼ±p/Ó*·æ ɱÙl’«l凞7Z³6Z“ý~o[žÊIÔÁRø[ukب\Ù–ý½-[³üÛÅL‰RÌÜPÁJx~¤ùŒl,›Ùy.~s®Âg~»mN畾!’]1ŠÙëí%Þ ²M­5*´b8¯7¢µzuѹðúcx}m<Ù™%Ö{N”­ÈËÏe^䈂Ô"ˆžhwK¬³®D@‹4[÷Äùk÷À…¢‡‹ØÀ…cGˆã©=ܰ!céN%)¡ ¬®ºâKמPb#ÁœÁÚl©QNª·E÷­ê†³Î dÜKa:A8:3Åì6w"Æ+'™®/DpÏÜàÙ^ò 7ëŽ/˜{>Àô«YÏtHÒ5Òÿ/‹,ݵÝ}è3ƒ2Íâ.µíè§ìÞ-EiÌ}Û£šØnv÷¨ˆ‡:ßmŠVÀKu§­H܃HÛ³¹•Œ*™ð½¿y‰š å5 Ž%C–Á’Ç€"Ó·Ùâ®Öêîk¾4‘âò@º':B »>fuBèýJ0–+-1Eíô1ª´hB 1€æléžæœJ¤)º]SƒÑIݧÂLkˆS ]•ªÆ“7ÎP¾¥%_ÓO(ß}2‹jU_ŠÓ‚ï“_©¡ò‰U§–'ß²#>]÷¨Mù³M—å¦ìJ„$ (é®âÊ'P@îG‹:PšëºØ×M.Å‹›·¯ß=ч?¤×u5gæ zþqHhÕ˜k08ð.}(þˆü´Àí¯ n"IÍ1’È Èë,EhOŒIŽ m”ÊÁ% å\DÕ­€á…Ï¡Vˆš°{/Ð48Ù‹£®¸{®6D0f+=圧{ʉmß9‘qJáÎ^®PÃLÞ§'uà\ øû ÈJÉê'n*Dë¸ëØQÕÕÁ ßW©]ฤéHížw êkn…x$È}"‚$u/ÓXüxBÄ ù§á„„_ƒJ%h3Ô+Ðß`¯¢üRxûéZ7„Aš¦ÇáØ´ tî(o›šzmÛ·FêU¹éœ¸¡¶”ŽD²8Uh£ÎtÓC#ÂP²·o„.öÓ–ª]3 9´¢1z_ïÇŽ'=Ì=ò@hã}m;2ÎoýŒþ‡Œ%~sê‰9‹jI+­†~«z]ŒïvÛmÝtÆ‚ÞèÓq!îO½b¿™C¿;¨S‹ˆOÌ}"èÄIÎyv0É…3-ïñXÛ'Žáã‘2O‚ʼ¥dcÎÄ4-"Ý¢(ŸÒaGŒœ‰!i©? „„Ħëé$`Ž{D4ji­¨ƒ‹cnw!–»N€—!¹²¢ƒ«züÏK“k“F= SB Ed–·J´ì¤8ß5}£ËægI÷1ùÀ 1# Ž;柙{ØU¼;æ¶Öú/f¹DÓë/›2Ew¹Û/éd]QÜ.fŒJxÚl,|F*Š€è'ßçÀâùÎ1°<Ç|âЈâÌXoò€ ŠÜw¥sé•ê)]$ßd– pçÆg®sý#2 ^Ýmvuå"ÆŽ«’…JTì$?Œåáû!ùbcì£!ÐÔ?ø´y£7²®F çK0lÕý×ÀÝq €¹³¬ðBïÑ*šàa#è^üÙhFô[ÎÏÒæzzìiŠ*+ÄCZh¹IÑ 2ŒíºÞÁšü  ¹ÌÅà ·æ —Mk%\Ö~´.xýs„øœnvháV­Æû"?;›<Ïn÷;‚}Ä¿ ·ÅëîD‡/†ˆªîh¢Yëää­ $er1LOåýºûs@?EÍPŠõ¤ÂˆRNLÇÕ<Ji*]#:±Üì(ŽbúN”w‘‡ôï4ü•ú›hÒ=2ËÔ$ƒþKþp0bÍØAæöÍîëã™itkMtkEÕðÕz¼¢n£'9NFÚ=ªp®‘œi§gŠÜ‹œîñå^qeGó×jeÞÒí®Œé†.î¬Ó×,¬k²::o´°ñDSê‰@o1ÝóR˜Ð}Òk5A>e­yÌ¥Fx.øuA1=ÎJ¹/> endobj 106 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 107 0 obj << /Length 2496 /Filter /FlateDecode >> stream H‰œWÛnÛH}×W4òÔ ,šÍ;Å@®ƒÌ:Ù…-`/ñ  È–ÅY^‘Šã}ö¬ç'öçaêÒ)YÉf7"²Ù—SU§NU¿ZLÎ _(±XM”+øƒ?Žm'vB%¡íÆŽ'Õäüu‹¬¥9Žh³zrþÓµ·íıçd“iÿx7ù$ÿ’ZSÏöå­Æ_W å[¿,~ž$´A""ÇNB8ċ͢Š×»n…O!oôá:Ž/¦ø“ˆå½¸¾¯;kª";‘kÝðèÙ‘lÅËŸÎÄ?~·¦¡íÉm‘­ÏÄõ]ÑýKoaF“K ðeZçÖ4Ø’‘Ùd’«l凼/Þ0Frwwg[žÊvÄ­î-ÿ×ÝlT®l‹þOËÖ´ÿÛÅD‰BLÜP;•ð"øðâ¹Åb«'«É+Іk¢áÛ`³#|ÛóâHðkï²(ìØgŸ ñp©ômßv­Å¯¸—r7sÌ>ʉmß9ÚH ³ê{¸š©1ZÉawÙG‹µinÅàðÊrdQƒuôƒÏäoÖ4VH kê»vLîôl%Á‹1 g]ÑÔä¹SìÜ;Á  ;ƒËCšW„!ÍE«io‘Z![–Í]+ºF¬¥FQ¥ÑáçH.KÝÚâîÒ¢´€­s‘ë6ÛÚ$Kk±´ Ü1÷¤X5»:EmH52¹H$‚” èF÷ÐZä¾Î>çËtSØëG[À~òeYŠ­”…nÚuE­y²hV’°f„Œa„I‹¢Ú”ºÒuqG]mº{ɰ6`Vu;~­é‘5¹÷öà£|Äàß¼‚c}ùù]³]y®kñBÎD±"?²×»H3át0 °­-¥$jƒD§ç˜ÐiLììÃ¥Ðõ-8Q)FKQt¼‡y/Wö)«pRéXX¨°;Ðd @Ž pŽ ýP§â.µPIî‘f ÐÙÛ|!Nðtm>6´™ í“5èíN—Ȉ'¯¶{ÇL`ëÚn°7 ËÇ?/¬)îþ2~fGìýLX”úTËÆY'…€8ˆ¿uŒ>ãdY³Í‹úÜÙmïŦ)ê®Õ®í0 [æåbµm*šÿ`çzõ(VE©m‚)¹ÇL^D^‘Ÿ!@—–o\Bš¿ÄØ¿I; ƒ•j,«æ‰vW¨Ü”K¸5ÅŸ@¢fÀàG3úµû`>lÞwf¬êOc=‘o J”5Qݤø¡gWÏÑ,-‘šM‰Ü Z‹ù¦Ü3?çèºðÓ¥¼Í…ŒE¡ó/ÄQ~š„C–Ý÷Ça†€ë³¦^·'9}"óÞw¢Ö:¯ÿM{%;¥¸xØ`ö°)ô  »8«›GÐÁÈ ‹M¾+õç×)­M—EYtý>‹UpÌb9ìÉ™xBáÀÿ…?Éë¦Ò oä¬ðXÚÛ^ndV`âÅê [í/VBÊ‹I8hÎ&Ývâ¶ ‰œ®êr¹+Ên ‚ÃÕoW©ܧl:3e‰‰BíÒ¹SÏ;ÔO5ä /®NBH›€©L/Ìk†„Ц‚ù&* É8Ï+Ê:<ZÄ:@e@òš'žÍ/{9ú‘þÀÐéû‹½§°µð~´µïñ¿µã•ìòÁ½©Ë&CcËü7,ìôØa‹Iì Ø|4°–ÿ÷vÚ¾¡§ÂHùCÐü¡š(tózH}}15˜_0­@#xRÇcœž×]?Ls@)Ó+Øò²’š]çK@†\L,ׯ²‰+ h…r´Ì>VA®2C~‚š(ô¹lá('2X"¸né '¦´b¯OÓ¡èŽk®ò…\±{,ä¡rBnô[~OƒÀÃÒù«Ÿ/o¬Ó5ÃÝååâQ>%ÅŸ„ré(5Gác…ôpåK”©ÖÂVôOæ Tm7Qø„ !¸ÇEÛ<í!DlmÈÖ†l-Ê=²‘)¶1øŽûËŠlŒØ.»Óg#iœè²eYF9ï‘eø,ó㟞óǧ¶‘Aƒ"»½{-ô‡@"¼2â ýÚ,ѸÄòùóoØñc¼ãË[&ô7ùvPÖ‡¯¿¸G¨$v âߪ‹¨ž}mñQ°‰k¤G©°FryìöeÑ dº1uÒÑ”ôD¶'ëv<à4 Îs4þ 1wÌØO7KÂF3G©nÛÇ•{¤pá@ÄiÐeQVTçâá l‹QÇh`&æ -Ÿ‡#› èá®P£“¸Øì+Îàʳ­Ò§æ[µ+;@Pë³S7 wˆ_ŸAwkèÌI>ÅœõŽ; ŒeÙÚOÁ£Š;ØãøãâîÜ+àfÒ«BoÛCnùè盚Dx¾\’5V^˜â{Aul¬¤IŸÄÜ,Hôtֺ̟ èÛ’Q™QûíÆv]p†.D%CIž[8 }OÅ»S8ì&\G-˜ëZ·Vo`-¦v6?wT©K‡^稖BëŽ\9èH/Ó·ºÖÛ´ëïzª’0ØÈAŸ,æ¯aã@^]¾»€käÍÍöæï“ÎW'†ÿ+ª›'Ôæ2Š›µXÁplÀÇÞH± ÀX±à¦säû˜wSÌÀ5ÄšînÜŠI†Ë« ºÐ¸¤fÙ6cå~hŽ÷O¾³|b‰Äu÷û¯üC[Coj|qÍiðE) µî @i:[.ç‰|}ui¡œ¿£È\d4˜Íòü€‡ß±P(ù ûíé)'âµ ±C¯G„I!° ‰†l‰e-M)¿sA´Ì'Ö‚ÄLáU·57µþÑ^e^¥Q§•æÉghèz³Ó¯;G]†×zW-Í!̦´†KT®¿‚XDòì¤ß4$\åÒ]×àÁ‡… z±Ž8ñÈÿt Ø5Å@×”ú(@“ñûnk•D®wÛžž;:AãyXèÆ«·_ÓŠubvtæ±À’¹Ÿä<}O´ë qÁY¬â³ÓÆ}ê+¾3û™n &*D%"RÄDò¤š]Wêùë+˜àÊ'ßÝÙG}'þŽÜ†Á’Úì[tI±Ñb*‡û@út æë²¦^ÑSq+ÌC‰ùÝmiÖý‘¡׿9I0ÆÊ¢¥Ê×½xð|™aZBX)½¡ÖÔyº}vô€WÑÀ+Óª øI@°æ=ÃzvºÜi(Ù"Ù_> endobj 109 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 110 0 obj << /Length 2725 /Filter /FlateDecode >> stream H‰¬WÛnÛHžú+ú±X´H‘å͈ã$ð8É bívãAIm‹ŠTÈVdåÙ_0ÞŸØ܇=UÕÔÍÊ`1ØɾT×åÔ©ê³áÑÉp©@ o‚Puñ‡G”¦~7í&ª?Hü0íöÔpvtòªIÕ¸á5]Ռˣ“·WºkŽº~·KkÆGöuyôIÿœyžé;CÏP« ö~þx4`Õïúƒ‡ôR·i&ûÃ>‰¢·Dý[…Ýn¤:ô¨ÑJ]­Jëu‚¾?ÐSÓäxíù}ݨ—oÕ?ÿãu¿§ë|<=VWËÜ~35VÄX\x8 ÒY9ñ:¼@$kÄf³IaàQÒÇ÷ð\´ RÖF4Y.—¾×óÝ@"‰Zy~K;…A¨›¼eã)Ë=< T®ŽÂ$€;Õëã¡ðÑ i”ªÚÝ ·bÐz§õ±Lܳq=k­]N¯¤ßÐKü@O¡T_õpu~ycͽŒUÃSIçÌæ…Q¹ )s?7c›—^@ÛîT^NÌ}&“%‹ÊfÆ#gÿ@»ýhk/Âç“6Çj${Í8[È>£àu‹e¡Î=öˆ)&³l®Êlæ!}‹0§Ä2/ ‹¤†äS¸ÁUHFê²²jdTc«ÚLŽUSñQU=1u^Þ©ê–¿ÇUy›ß©Û¼0¿7x¸Ó'Æšz–—¦áUlªÊš&¿+g¦´¾7ü2"•Œ]zk,„É>ü4ô:1tíu"¬Çñš‘Jld‡mÛSº±/ûÆÕlžÙ|¨ÙJeEM êél²ärkKv ùõhJõ¿ßx]¼?óí½åÊâc2"†îSø„Cí{‚é–5%c€Uîeë…ñ[h…~·*Á&‚6bœ;å¤6j’ÙL Óð¸g%Ao¶(l^HÂ`ݱ’銷aQ]çÙANÛE]º­Ï_ç‘þø»eˆ¼ ŸCž‘q67…dÑnùæáúºF‚á4sk ÙäHomÈS"xþŽSï ‚?Ð/$ÓødJ6:yОLr²›u§–¾:©˜À¢Z"Ž6Ž1ÐlÏ2„·¯ÇŸe´ð˜jåcê"„ÍCˆRÅ×vêµ;È ›v]¯á;gÀõõãµç«ójAü²¨,’ԯƶ.(•êll)„‰6R¨ê†”°r´ø$kÔÒ…¯ÞT5‘G–jŒÐ[c‰qEä@5!}5u“W¥ª«…e ʬz!(üñ|ŽP/§¨\@¯šgµmé LŽïñgà >IõA@?ñ‡NMmT†ÿvY!ë¬)Iƒ†’"©TÒìþ”iïM¸ÅzT„ωêßé¿8jLÜ"?J„Ý´Ú%ÍÀG­^óžP¦>{÷ÓYsê® 2êod¼Q>vINåeV¯T‘Õw^Šlå~C½R£¢¢Â‚¼Aôôg!tÎV"D fVe±R™j™Ùiˆ"oUx¡f±²F–Õ¦›}UÓt{GÒv(Ò¢hñ§Qd&íì„©ŸÆ»h=@7ù5'¿å$Í=&h¢q¢gHšL”d 8'dž“Ù%tA ^ÊDnbì³Sõq“f´òŒ)EU£“_ÚõÆMT#ÿä–+ÁŒ¢|OÚŽâ¯g|œÐÎOHá¾–‘ ˆôù÷«o ÿÀÝÒ<õü~Å]Å7´LXòbÝ'K¢ðJqí¶|ù…׸íPXI™Áÿ º$á“~Y³ƒèèUsªžÖúp ÊOk!!u![mê JS¦ä…«m_“[%vÒ—,¹^R¡Fà²Ô1a‡O\Gj'(mAüÄR~=d‹sÏVܰTàXêá£É&¨AC¦Ý[ ^O[3{‰ÐèKoVL¢„;,††©œ‡äðjF(ÅéÑÂnþíÙT_¸º¡ŠgóùÏH;í¼´FV¨çÛÒp {g—f|–$Á !÷ž„WÙŸñ´Œ9‘òK©ÝÓ®a{žíJ>G“scý‚ë-7HðÕ~2âò±$ÐdŸ×pVàP¸?”¶PvŸÏºÉ^÷{lP/nY\wV%1PÌ$ ­ß¿S¦Dó‰¦'¿UÃ×ïo^^Ý\¾FøbýZ”èSj¹©„I MÕï«ÉÂ5pt7JN‰ÂÜ¼ÊæT¢cÐqÙ܈í ATO¦ÇPH®GÍMZ®– ¿+M Ö¯}æs·9`7#›Ü°úlV­äš.¸ 툶…¤juù²@¥AF“‡æÅþ8HO FtX÷™¹ãüÌÚl<5R¾(JÁýâ~ ¨Ú¢ñ¤‚oý{ÆL"ä¿0'Wâbš ñ°‡’rŒo$]-zýœÚ.} ­ÛE‰{#Ú‰öÚäˆ8ˆ„G#¿×C˜å³½Ïöú0¦ÛÞg©7À½Åœ„ »+¢ëvÝÔº{Û×ôýGçÀžîíSúë*î´Kêq1ŸÀ7¡Î¬áç¿pËÓèùP¥b*>È„~Ÿ¸ñ…+H¹ O¹W‚PŒ7öǸ3&ÎþøßA¨z€BÐåQ9¬²Ë݇åBË ××Ö!˜#ÿpeÛa^C4ó‹ ä$¬åpSNv¶½.'XJèsu$Ö[Û|î*Bæá>A™Ò9Ø?¥”ŽlÔµ†ˆ²0J6¹ƒ«“Íp¢ÏБ¨kï\`k7\+éh¹-Geuñ¤æSÃxƒÓÎ^™Ÿ%[Ýœ”A”PxÌŠŸ(ª]$ý^4;¼s7!zA‹¢žKòŽº( . r±JøŠ#edø ]}žXpüµ·ïÀΦqnßvå­Ü •\:ç% tãÑ —nýEGI{f´{æÆ–µ)kKÞ û¦¸€#òo0Ž[T¼ÇòÕ.bôÅùAƒèÛ8憎Ú”^ÖÈþ‹öÖ$ñ€Ò÷;÷?iÍw!¨ÚÐyЧËÝ3¡ºïx;ˆ×ÊÅ­¤÷ÕWCʱR1T:è²h½1j7ž³Ô/yZ÷¼h_fËņ6‚ c jðøŠsUòÑôÅ`ã‹A»@–þ>¡þÀ {¸—ègÏžzaã„ÎŽ¼H;5Î8ó©†Äš„%iDô¸',ü3(ÊkឌµÞíW\âí\v“Á.A ‰B Ò®þ`̤ü[KÌåÜÌÐj!=¦:õ ¥ûfB•ž/2hªµå.Bú3ÐzmNËê‘z÷\»o^1[fs×€ƒ\) é1áÓËÀ3§hÿ E¹A…zÙ!eݤÃÞ((-S°Õ2íäwÊÎ5¦¡.]qÕC¥©§ñK`°¾<¸tûïp*‚·þÍ1Zÿ¦ˆÖ?~›A½4{&ë(øØ2–D ë˜B;@#»&°N€)¨ í; Ìf kþƒî€œ iŒèƒ»¦P"6„3ÁY¥ù3”Üí ˜k›KrC endstream endobj 111 0 obj << /Type /Page /Parent 338 0 R /Resources 112 0 R /Contents 113 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 112 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 113 0 obj << /Length 2294 /Filter /FlateDecode >> stream H‰¤WÛnãÈ}×W°/MCâð&Št.€Çž ¼;ò,ÖJÉ80(±%qW"²eEyöÄûùÇ<¤.Mݬ™El@$ûR]—SuªßŽ:oF£|M;~þã#J×K¼iì‰ÂhÙysÝ$0ixͤì¼yïìéx®çÑšI§×¾n:ŸÔ÷™Ó ÝHÍ4=~ìü}ôm'e) <7ñ0±›–²?(z‹EÐ ð¼zôHa¼…ûmiœž?pS5×M¯¡;P \½ïÂßþëôb7Tu1™wá~S˜éWôqñÂÁ"••¹ÓKñE²Fl6›ø®Åü݈6~ÂÚˆ&›ÍÆuB7V J$Q[ÇÇßÒÌÑF?PMÑNȲɜå¿u|( Ä>ºÓ‡p€À0Ò(Zw¦·£ƒ´ÞÄž›Øì]Ïš v.§WÒoäÄxöÜ ”Þ¦X,`¬aÝð¨ÎÅX x"¸^ –z;UQ6Fg¹3úé¡‹šøÄo#Dot0FÅéEh1°+øíÞ¡Ùñr"Ïá°ó%#Q3G¨0ˆë«ÒNvÁñ=ULáY¦oeÞÑl¢†W4œª{Ùõøø+=Ruiêµô"û¡hÐÇ2dÖu{ â®`#ŸV #Q£@z ЊDöî].†«|½Ð×Ù* VÚºqúH@ Af`¡Ñ}•ɨû›ïaãz¨•,\ËSç.Œømޏ ••£ág½mEÖ&ÕrµÐÆñ”ªIç¾Zl¡ZeÿX£¼cZÕ 7Ù ŸÔj±ž%,Yï“ãŠÚ‰Pêl2„®Ïƒ9žWýOK«¦qèD‚–¬·*d9TVÀFž…1ºDš9éïµù‹“`%Èkýæžœ…#øÑ*=É‹ÞÊ;·#NwÕ%`˜Ž³ÉÏ0]—STeãZ¸Z`ãîÀ ú;¼ñAß}9½>†™1ã«Ë6+vXÒƒ¬@l?«'}kôò…`´ªõ £³‹çâEQÎ`^è:«'óm€œLãê—(“5¦ªuãÂmÉ^˜¬ëZ—žtÝ î»(õøà]¤ØÖþÞì¾h¥oB9Tb5OÁÒZV¶Ú@ÈpRŠÉÏ@%ͼ°K¦:CäÛrÊ>]k4C.³>•òÑÊÅXOœØ¨¯ Ò'µ Dÿ ýÔmÑGj²†‡Ï¡¤…¯ßýÀJü ÙüH¡¢©[ü ÔС*ÿ=<(äÐ{p/%£PsJçnÉÀ¦X„¡ŒÜ0L Ÿm]ƒ`Gmå/¼ì[4ùޱϊð½Ä¼ ì®/î#Q1±îìí‡ò‚å7AS—T!¬È˜O…!†é“~qz ±`0È/ ó_Hiˆz)ŽÞ ¦_ÓJìùnYóéüxq6PDšDy*TöÆN.þÙiJKåL[±AÚŠ½-M=V¤jêŠÌbµº5vjyêDÑ2Ùi™´âþ¼Ê3KÌzÈo}–³<«&Q+!j%ÜhdC»×?ÞÛúè3!±k‰ý‚6bz‡¥ã7a̪r±E6TWzI ?ü^ÊÚ#Õ}t(9¥ÊÏ"ˆ.#…U–!òG!}”|WC‰´m-,UTå´˜¹gñø:_ï´Î˳ Ï!ž5Ûz.š†¬©¿Óô²¬^¨}±-Žì¸'Ûv‡òYúãÎò~ÿ”€#¢ßP]Â+öíG–}ÏW€ûj©%Ë5ßèЀ͟5Yh3rƒ0dƒÅéÉI•¶mà>S‘ÃÍiCàÅ¡¾÷Wãu±0=ÌΓÆ;`ï ëÚ0WŒ1ÌfªH=Køá¯4—ľ§]Vn›4¬oDïdpØÒqS%+aêPRqzÛÆŒÜe{ʉíGíjùøMƉ{g)4þZ =”ñÛ(ôp§¸|ï¿Ö̦3¬è ÷:È[ ‚÷h,™â Íé bîi{]V ¾WöÑkH¦¡úu" £›|™H²¨)pX]Bi牖·dTÂ`—gË}°»~[Gsºáô%­ûhp.×™¡ýÜÊä5èDÍíh9£ŒæîfïäFTqŸ¾9_Äwœàí8áGÙ];W¾^EêB/UÕì¦-ðçIÆìZWB ‘ZI5\Õ{‘7H1Z”Î}õàœWð ÞͪjôÇñO@}“xêââhÿ. ÷5§Ý-¹ƒ"‚Ê ¤)Uö[mÄ’9`éQBÒÄÑÐk€àJ ¿[ÿÃn¾­á–Žb-lÓµ¨©¤B# ¼Æò'á¥Uµ¥2éßĵmã|tMû÷ÿJÖ¬Ì —\£ª©%äé EÃæ\HüƒÒhñ~!N»«ŽÝD5/åšqÍC2ý–wÌm·ÝüV¸þ¦‹&á­FT0z|¿ÅBa·dBÍO¯'{¯¿ºæÛ‡¤°ÇT›f˜6i»OÆÇ¬J6“>oRa±ïÐOH nÍ [3ÉÎ9”ÔZ?ØÔ‘üDQXX²ô'cêNÕbE¶LdË7|pˆÀ-?þŽn±"'×ãõ VkùÄdA€kúážçU×ùI]5E>ªÌ°ÄÉw&|²•¯.O›9Iµ\ƒ½fŽ…­¨—‡™“¶3MLv-ËáyÄBÚÝY>ä—l{Íýt_áf}WÉûæù¼6„ýåZާŽfÀ õà¸_yi½µWˆ¢œ" ¤(¹^ò=;7NÍs‚ †÷Z2î~u×Rü>[l;ÏèÔË•±®|7êüo$=kø endstream endobj 114 0 obj << /Type /Page /Parent 338 0 R /Resources 115 0 R /Contents 116 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 115 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT10 293 0 R /TT12 295 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 116 0 obj << /Length 2390 /Filter /FlateDecode >> stream H‰ÔWËŽÛÈÝë+ ³*Í÷câp»Û$Ž3ˆå,2 ŠbK´)RCR-w–AAœŸÈ?f‘soMiÚ L6ƒF‹UdÕ­û<÷ÔÅröl¹ô„-–73Ûþðð¢È´"+a˜Nd¹b¹›={ÕD"mx%š´œ=»~g‹M3³LË¢5élÑ ³å‰±pMOn2z:RØ¡ñ÷åf1 ˆEh™q€CÜHoÚ©ýNH¢h(AÿŽeybAX¬îÄ»»²5vhÆr›59†®ÊF¼¼ž‹¿ý×X¦+ë<ÝÎÅ»cÞþ#«±ÂÇâÂÀžLʵ±ˆ1€HÖˆÍf“Û´½ Ä|y©´±#ÖFir<MÃ5Ù@"‰º3lü–í6ÚŽlòîƒZ–nYþÕrf‹\ÌœÀ†;má†xL\GF‘¨³ÙÍì‚£áèhx&l¶„gºn 5í\ú¾yÊgC<,ÒTz¦g†Æòɲ­‡Â,-Ƕ"Ó³&‚¤Ð»ÓÀ†«UjŒv.† à‘­¼µÜfâkZTMfDpÆ¿E“¥7 JD- M_VHÙQ²§Îeco´ëÓÑÊhŠŒß§ ùDù*·J$3qOgóDÇ‘_…ž¤m^•¢6|õ¾ÈýA=¢)ÖIkØ®D ;ôJ}i WV¼ÏÚ‡ÍÂð`•›J±; ;Î$¶YÿV$EAÿ•a“°4i³µØ¶cê;>óN§ê)êPz²«Ã¡ìB僛ª†HDŸ2v$jØd ÜËÚ Ãˆ—8¹Z}‚Gôò:ku‰óÛŠÝ€JKÿôFdå&/3aØ–<æØ³Ê°²0bÄ‘4„ÖúìDÅmGªº}%YNŸ ŽRõŸ—y³Gzüyõé_b_çJsdÊ%æÁ"…gÌN,ð{yŽßW¦\pîuŒ(ªˆ9=<®ŒË¬ÈÚìUU¶Ù—¶[¯JgÁzù¬d0¸VÑÛJ$iš‘©®T¿ÊQ¹ž¤J¶èœ´®àµä¦¥`ÚÊU𾸟 ÌóµºlÎ#šúf0²ÌaŸÊ¯æùÒµ&¸X4ípC¡…¯·z+äw8E Hàº#p¤JO‡!ùèâµJÒÏ(ùHE¯ùfeû@Ï*Û*Ûò,!Ø'¼o&iÙöûªn‘ðytºØeFøMʼÙÍÅq‹nÀé›&%æÐ Siž´œç\¿y9ÍÛQ{ëCÁG¡Rië¼ÍË B½Ûee«¿èr)ª¸É»õ&µ›PŠ7ÕfC[dHÉž µšº¤TCõ›Óvd)аPÈ‹s R{Ñ ÉU-ƒŒÍ^yx@·ì6+nÙŒ[¨]qPK3µH¨Ù¶:kÑE-ÒQ³M?…Þ G}ñ핱 •ÿ PÇCÏþ2 <:âiò ¹#)*â8P¶7_|}ŸV‡ö«J¢¹H®4ñ9‡;ªoûC+𦬸H¨É£ úè±èÁ?–öy×– µ-9q „·Y­¾¢A¨Ô¹§>R`-§ËE5cªcË‚8jr¨GaGrlpTNñÉ~_W0`6¬CT5óHî(v>¢F±s»w—üxhó‚3ðYÝæk´ÉZ†ªõQ´dÝ1EñòêâýõÇW‰¢t‹b=Üh#ˆXï×XE V‡jöátqâºu¡üs—'çØñHÁi“Ç9”ßó¯õž8¢X% :Xñâ k€Ç{[Á[‹Àrе:ËâƒìÞÑ÷ßt“äÕżÊ&ß Evóf‹ê&ëluؼ.’M3g³`¢ãÙ[Ï ¤ I4ý@TÝ“¯(ýA?¿®Fêøæc¸Rë1éÔKzá¦ivÃÆoYТS]0 m%îÔM¨.I$óÖÄú'è÷ ¬‚o¿eý¸FN”g¡íލ§¢]ƒCT¾÷ ìŒêdÚÊ¿9uªi‘0õøf]ÆßªËàLÈÄs ”¸™ø¸ ¡÷mR¼ ^ªõ;SèÅõÇxÑüFòýõïA?ߎü¨‹ñ7#w‚XÃÐv{6Î`¬ž#)0}!nê53eðë‘Þ̘ ’Á%ÕˆK1÷ÔÉ$ýgЇ+vÉ “*1ƒÓtĘx}uƒÀå,éZ¾&eè⧘9÷ƈÏf•–¨9%lÚÈ¿ÚÁ¬Œ>Bqiq¿¡óòÝ„’ÛCÄM'’+5É~: á©ó샡>bŸyR“oÞþ†ŠŽðhWÙì*˜zT‡ämÆ®aU4#Ñš½;8Cj2!‰WÐÖóS¼FÆý¤%k“¼hp‡£q“ÖùžÜTnÅ}M?®WÉ>7·Š‹Z2}Ú†ßU»¬Íw:;ºå€– õ–%YJÅšP-5¹ªAŸf&‡kj[5Ú­h[Ñ=ö6oò’ M¶¬ê]R ”Ì<O+ôŠ0ÍóüòÐÎýGÓÇçÙ—ª%po{ažõò´Q*ŠLA˜]œ´h÷áe «ÿ+:)¥.Å÷®) D¦ŽÉUÔ“«HÃ"9Ü7½SF¦® ãC//ÄCŒ‹ì#;õ¢èÙ.YêƒSQšeq7¹bTä¾MQ­£ï } å—JÑÜ…‚:‰Õ4_Q{yúàžK‘yõär$%M“µß+=Μç>% aøÿ“p3?Œ~-l¡ÓöqºÐgÐÓYÃÈ ¿nÚ`ã^RKeð‰cTvŒè¯ 9<>èê?-dJÛi%ÛÑzªdªTM":áIB¡XSˆ@Qˆ §¦w®)]0ߢ³Å#™ž34 b ´—úŸ#³º¸e‡$ªY#š‡´=Ô@áƒzKëó|ÀS|w±*ªô³ZqmOÃd=iA_¡Þ+Yž¬ùVÓð{æ x’1÷öM%©ÃS½rNš©-—W”ûà4üâ=]mxHM©‡{jŠgX9YrU®õ*Z(‰àE¹:KÍMÅž'Jw6Þ•›‚K#'>ä0ßòH¹I\ô¬qD›ú«G°MŠÀ M#:™!¤ekƒh£ùÅM,òžŒ±d-|Y!4Ìþ|ý&Ëd3ï¡ç‘u—à4 \p´0öŸŠ?É˶­—ı¦9ÔCÍ„DŒÉà_lçT«åì3‰pœ endstream endobj 117 0 obj << /Type /Page /Parent 338 0 R /Resources 118 0 R /Contents 119 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 118 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /F4 294 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 119 0 obj << /Length 2880 /Filter /FlateDecode >> stream H‰ŒWÛŽÛÈ}Ÿ¯è<¥iŒ8$Eñ²6X_±Éî&ˆµ{apÈ–È,ENDjÆJ7AüùÇ<äTU·Di”Ë;bwWW×õTÕËåÕÍr«P-WWa¤üÃOœe~‰JóIJ`®–›«›WC¦Êi5”ÝÕÍ»÷¡ZWDS^ÍÜçãÕýû›ÍýX¯ ýFZ…™÷óò7W93ÈUøy‚G晽´‘ûQJ¬è+FÿTQÄjF?¹ºÛ«÷ûnôfaêçº6CƒÏ¹ŸêA}ûîZýé_Þ,ñçzÛ”õµzÿØŒ5[P,@Üzx ÖEWy³`ɱڬRúaœ¤X/_‹4aÆÒˆ$¾7÷=€#±Ú{!þvc ÃH;²²fþo–W¡jÔU”„0g¨æ)~óH‘D™Úš«ÕÕËåÄÎ:)ÌYóMÏ’,ŠtKo3Ôi®2]¥úÄÈ´*ÔXo½Ø_hÈ᧨TYtêΨ/5^ ×ÒÕ¢mM¥½t´?Ö¾š²näŠj:áÞó®°ßx‘.ƦïTmÚ{K8öª´¯£Q›þD+ÁèÑBNv^€rÜYÂJµýZÈ|6èÍ[³9Œ$áD›ÁÛ.l9¢â‰úîO‚^zýæåOï>½éªe½5EõQ»"zæÅ«—îó£÷\X.³ó¬q¯'ÈžE4 脞ÿ üÝÒ›-üP¿ñf1~¾q¬¬2H’\"jÓ 3›PðBjØØ¨]W!®¡'¢š¬µoºµªÌÝn­J!£ 2o¨Ûö®ð(SJD&¼õ ßz!]‘‹3U…03ŠXïd—xòº¼›Á‘¾- /cžå/Äd¡ÿ@Éx[±«„º°öjSÀ 0òÐwq]<à‘&qH’Ïã7 ;úMƒÐߪð£§VýV ýÆîŸÁß²LËe°8è¼Yº/qUŒ4kþPÌl:óÝ3ÿæGëo àÁZÙÚ14ÁÈI ´E29¦ WˆÌþ‘â ¡ ¨a¨…dØ­ñ¹é«§d(qè妊 7Àòá´â"Ú°ƒÏl¡ ÎBEóIµjæ¡(ïN]ùQ2í4rgºÐ&4[žJ„{&ª eÓH*ò2Õw„k õ7‘ä-]àò5ZƒG™Ÿåg0’ƒ'µMŽ1ŽŠûBË_#¹»å`ÝxbJCVŠm}FÖB¹Åá‘§Íá[ÄÕ]?ÖÁ ìtuåߣoO¸iÛ?4Ž µ1e]tͰ!ۯͨ†]YcŸë² áKˆ›i±"o÷»ñ@þlÒÛìÙ~å’óx™8ÄraHv÷©ƒH«dM]K¬·;êUŒúò×_I&}EUp8º‚B•°~‘[{ûÓ•Ÿª;~½‡²+¿þŠØ{lÚVÙ}sûG%l–YsÉ+?°C>½"`õBöØ\[¹hý•Â…³z»;æc/&~:ɵ`Úo¸¨¿zI]J횘{Ü|>°cÓšb¨°üˆ•l~Z¹E¾pÍ}:À‹DV|ÞÎ}Ð7Ï~%}ÙB¿­Ü:_û5ñ‰Ûzvs°*IƒØß˜ßÌÍ­þÆÄpF燶A ±Ieܬžƒ<‰,nž¹›Ø¦ZV¤Z5¦­.Háat‘q©Ÿóêþ ç±?|Õ‡Ín¢ó3 çF{b—ÝwÝ8ÜqÙ—´D‰ÿå@Òïºs3/Ÿ2˜¦°, VÒÿˆòüÁfûúù¹û:òŸ(tPû×ÃAG0º>ˆðë#54lJôgÍΜþï,õüãyšûirŒÍðu¡…º›™tÈ¡&ÅoÑä5„ sêÊ”º¦*“ÐLÕŒ מÁÍlîǽ j„¶s‹PŠˆ˜þ§¶zŽÉ¿Û+Úº÷„’úU˽‘§›R‘µh*¤%÷Kô¨­ýÜÀѳ§ßþŸ0*˜Üm+uß7(@kÂÖÊbgCØr‰]oY9Ä=S¦ !0qC .ÈšðJsÊ „ã­Úì¦7©¥mºÒÞØ „aîö*ô/ÂhvT"³˜-ø ê¿_PÝ*ÎZ”˜Wuÿ`ÕðªRE­u&ꤺº£ ãпG9c†4€D‚¼\ïd³”ÍCí»\C㣰vÔÙzÙ{Râ5ËqÇAÄ~àž¯P”¦¶j´È¨v“H¿æ¹ƒT–Ù?^ﮟÅÁ¤ÿ™LËf¿V> endobj 121 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 122 0 obj << /Length 3100 /Filter /FlateDecode >> stream H‰ÌWÛŽÛÈE^õýØÄŽ8¼_€uÏx½qÖ—…=›E¶F\S¤@R#+ÏþÏWäóSÕMQÒhfˆ ŒxiV×åÔ©ÓW“ó««@¸âj>q=áà?~‚$±Ä‰DœF¶—8¾¸ZNÎ/»Dä¯qD—דó?¸â¦›8¶ãК|2.7“kùsfM};7Š~=)ÜÔúûÕŸ')HEìØi„MüÄ|´Ôß{1™¢«Hú—ð'SúIÅl+>lëÞšº±Ê…êJ\úv,;ñüÇ3ñ·[ÓÈöe[æ‹3ñaSöÿT-V„X\YØ Y]XÓ0ÉqØ’çÚnŸ¿z¡½qöF{²ÙllË·#ÙÁ"™ÚZ.þÖý1ºžìÊá…^–/ØþWW”bâE.Òé ?ÆÀï ò(­šÌ'\ ÏT#°3{ÆWC¶â0´“@§k,…CNÊÀŽ­«_ÉHdŒØQ4D#…yg6plÿö"uÂ!ïC¯J¼ËUV_Tke%”±sJe‚Є5cù¥MeÍÅðecMbcQ¹ÿº({%²"[õ(¥áÔvay)AN‡Eiwx¢Kòæ¥`×Ndk…R\~÷Èj¡>[®#³åªR¢¤¿KËõìPªºÏú²©°™˜Y.} Lzp®³l‰¢–y•é[ýW|”⋎šï9tyGЉñÒ¦ìd/Ô&ÈŸÒrp{« ؃G¸ÞYÕ›Z%›3íëð>Ê/êfÃi»£}ÊN¬²¶Í\_¸Î?Y)Ù½Q¶  ÉK P’º@w"otYw"«*^QÖÈý<Ë•˜¯ëœÓ‘uâ¶lûuVíùå“_×r©úEStb³@óˆÙ)Ñܪ¶- Us x$0‘ì;̯s¾á6ó§:[ˆnÊ[Å¥JÉÛƒZ¹È*ju/K×ÈeÛY! ±ÛHzž­²YUö[1§¸]©ŠY†§2ÿ$æMË>-›b ó•ºU¶‹äy¼VÍMYï–iËT=|®oÌfš#°%›àéƒ"ë X.t”7ƨ;ÂÕÕõ\à˪¬o„É*¬#m­ÀÞDTÔêsnžeÅ9jÇË”~ÔŸ¯WØW3Øo¥ÐRTXµ^Û0-Ò«3Kïó¦Pöà(ŽÀKM—ÃL$0ƒŽö"â¼—ú)Èú][ÐÜr­_÷…#ê¦'ÄäýFgì A1+¨#R *€McqSâ VM­}ÆÄ£'ºe/¹Úå±S€ƒš“œ7µ·ÅŸT«´çèØL ä“ äcǞ潑àw\Oæ;”: x¬@9S†Å W[}‰·»—B_¯q©¯@Ô`›8Á'ÀTGì—ãïö§)7TÄ <±h6¢oDÞ*T_l›u+šMMÌfYgÒ¥™UWyŠÁåVÚõwƒKº­ÃÁ.‹Œ <9†Ùì^zø&ûnᬶÄO_:M®ÜPQìÅ÷ “½ÒOÑŽ¾ÌW«;îBŽúc PI– ®4¡fÃÓ½`A¼Çê=-ÖûÄüœÍPgh³!VOÇŠHцȶ\â ´RKi@wñ­ª5(èkÇv41É1Ÿœ¢–ʪƒÅ\uhn9Cûb~e«@‰Ìûj{ÆEw[#ÅÖÈì›íóâwgÕZV½1o—Uò%”+œ:Á³uY¢^/gªŽ _BÊ`«úu .êC|CÙæOî57v…tä…OºÄjÃÀ9ÐÓFÖý…ù–&pÔƒzÅ£ Ž$¥YJâ×…>ˆ “=£tM=„à¡28N•Ü4‰–!=¨a.oˆú{Um©´­(Ô¼¬•Ù»UÝLÍLîö€7gÅþ¨ ¾ŸvÀˆ_K?Ðþ=²KÒGÛë ’l .E}‡¡°Ö ¦ˆ*Ö«MÖúÑyVo9òlV²,ÈJ+Oæ¥ZÛ9+# AК (ªÊ ƒ§õÀ8g3g.yPÂE3Þ5Ás2é%Z'àd“·åJ«·þw€Þ‹#8Œ±gGÁÞÑÊÙëèËÌä­TÝ¡ß{h§“JpdÉĪÑ=ÀØMO¦,|RÊÜqð¸Ñ VèpGb%E¾v„ÇcÂÆŠïJ´–°D¿4j¾ÏôõOø|ûÇ8ã•s‹°Ý°qcä7è%Hõñ%Â1?”è`^ÞCÚ½…i—êI:èsÿ ¿N)αEªsqدGήâSÊ;ÃnДLJ˜½jÔ=©>š&&ÇSä2¼Ì¬°rÕ`ªPþƒî×õ¼Yi0ä •ƒh>ÓUŒÒ¨MlØxmÑÐ\ñò”A¬2ýJÿÝçT/(ž­õãáƒòÍ‹P¨:o U|´Ø€~¥ô‡ýZßÖ¬6õÇ\Üïõõ/ö~¢q"ž‰/aÚ]™ÜÙâs¥€п;œ:æÓܵd”ðì¢ÍŸ±“Ð8zò¹fò$Ëæ8w¦\à@šGôu^•èIaLrñ Å}.šʱ©ðJ¤±tF.ó1.Ï ¿—º257ëñîøÈr-‹õr¹µÅÏ)õŠ·QG>C7Ðáö7¤ uê4?tÙn¿Q.[Ü8OZ>£¦tb¼Ä±Hß?2o½q&'68Õ8%ƒ47luÔëOÃHüìÓP¶ƒ•½ù¼ÖÝR0šKÆ"Ä IC`°çSXü­)ì%&×B´æºSý‹¦þÚ‹ZÁW €žfÅ}MhÔ H)ÂÏ[œDw8&44ÛZZmQ.CÑŽÉŽRÅÏn-Š_w†é¸X( M‚¥€±‚+üÒ3¶ƒ¶÷â]Rtêþpœ¸À$î8g@Ã~ÎîŸ[ò¦¦> eyÃ…×”žw/.¸å/qP’œ11‡>êáô }LGÓ=ú J¦Ô¾bæyËêöŠŸÿ@ˆLäû·Ï_#’Xþãù‹7ÜIûKbm«%µ™+ ãè°bÆz¢™³%1¬ÁÛ²\ÿ·‘½ê˜^Ý9ÍêBàÌ(4hWYÛ“èhnZ"ï¶,†>½-Û~ Ù¡WGîÀuÿ„£ýNžÖ÷Áõ’‰ ½!5´Ø= ¬× ºwÖ4‘úÁ£ ûæðt]ðc}ƒ0b¬ÔþÏ‘¦ƒvwÒß}i¯ÿCz¹ô4qü#&•¶-x“Ô“éѤ¡eÛn¤€éMsË8é è¡ZÒÄ/l=À2 0)Îg§Ol™[£ˆÏÌ.±–sn/n—ŠAø¿bà ~zâg\ѺiŽ„126”Ø¡ÍI5 ¾C"ŽÇذ4²^çúCÁNç-1â«4]U•u;åî]¾¨Œ0¬N‹½jÎvM–{ó™íž®ÿ§˜}ƒäöD]j²|TÔ6ÕØz¦Ø8´˜àе¸uý »®ØJWúîЯkúS‡$ªã¿z{`0ØΪ̆‘ yŒ©*ˆMg`³)Ïy6ÂCÆÊ¤"±rú Ø©ZÎïquõ#ÀèVQN endstream endobj 123 0 obj << /Type /Page /Parent 338 0 R /Resources 124 0 R /Contents 125 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 124 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 125 0 obj << /Length 2990 /Filter /FlateDecode >> stream H‰´W[oÛÈ}ׯ /ìEó"Qäf qœ¬»I6X)Á¶qaPÔHšš"^¬ªÏû 6@ÿCÿcz¾o†-«í¢hÀ’sù®çœy5\Îf#á‹ÙràÂÃüŒâØõb/“$rƒØ Ål3¸¼ªc‘Õ<ÇuV .ßN}±ªžëy4' »ánðE~LaèŽäJÑo Eà9šý~ð‰˜xná0¶‹6f}0¡­h™þŽ•ÞH é'ó½˜î‹Æú7‘kUk Cw"kñòí…øã?œa䆲ÒÙúBLwºù«ª0cŒÉ¹ƒF2-Î0Á[²Eì6»ø®?Š&xž½6Öø1[c,Ùív®º‘¬±#mµw|ü-š5|ôYë–­yÿëÙÀZ ‚ÈG8}Nð#ð‚,ŠE¥ËÁ+ÎF`³›lć8MBØluLÂð}9vÙŸiÈîaüðø£°ßìþžâŸ@[ÇŽŒ·Ó=‰O7/aÈ­ã¹c©Åôõb¡ê¬ÒÛF—{x®Šv{“C‚y{›_ßOl¥Ìœ1B¶v|©„ã{½ƒ·Zl«òAã<ž#²²Rbê$È÷V¹±,²÷ïIJ-22&Íu³º˲ڈr)R‘ëy•V{q+ÝEž_×ìTb´À7¡šÌµU0DöÃC@FÖL/±u¸P[U,t±e!r±ÍÓ†ºuDSЬRicŒ£Â@ÍûƸt»Íu–’}µ(ÊFPȲÈ÷f„]‹.Œ± c¸ãq/}°#0Vd­ãh§º)7¢ÞªL/5Åê$C³¹йóÉ™ËyÛˆ4¯Ë®8ìé¡ƽðâò¸3…>B›5h€‰$KÌó–ÂEY|oÞ¿s†cTò·Ù´Gƒz0BDžîUUŸØÀãøXž~`Mck‚+¨l**ËšïKû4WYÚš±2±.T³++g£ïÍkÑÏ¡;ŽBÒh2(ìIB™e ÍQ¶È 2Š›r®s%Žv—ŠÊ4”:SÝÊF¯Ö]²GHÚm®\ù\ TZl’:&àä‡[™šõ÷„b¾¤:äƒÆ+óné Â90ý·OoÊ^é‡`*ßxÎ'L¤º€­E¡¸Ó¨â•yߤó\›! 7cCƲÑK``,µãQè¨hÇ&ci&Ói–©m#J³¸Rì¹#o×XˆÈž„Ö‡t±Ðtþ…yÜ” {^R¹µ/S:"X§=><¢5—gÛ«Þ×ÚÔ芼ƒ1ouÞ *u»Ý–UC˜Bu–H ‹V5¡ W6ÂÒ¯)[1üʹë{›áïg³Öäê\&ÎÐ꯮»5èMlÒ·9'”ŠˆP‹ð¼{·k­ŽZFèdƒÒ<ê€z<ÓÀLÇz`ÿ„VÜ(ê8òßÑJšxä®l 9Äß(âfíÄBNÐtŒ¬<'¤ `¥/c²÷å{‘XâY"è°ýA§†-þ#G‰ôÈÈ?Ò^°}XQ¢ëA¢"]4¶Ë¨¿ÒLu` æ¶7m³/ÒâÌ3­qÈ-ó¥­&2kZó¨cÀ£íì&©éž\l ØÏͺ\tð‡3›aÎøI©{“®Ô§%cË´=ÉHo€EtU7ý°½`Pút#0y$ ŸÑ¨á¦£"ß´˜ºR &êú ›ynËÇÇâútsw…½»)lÙÌÁÝä¸"èx+šX.¶¡%§—œ \ª’Æ!wÌ·öMp |—r±]Ý8xê… -h€ô”œ4_dO'VuQÅJê×Z 35y_´›¹ª°ûuA°žÈÕgóå…XV`GZÈløN˜µ`¯µª¨€ QK  3<§ELĆÝM¡c3B©_¨¡ˆkbðnsm‡tÈ×oO+á€îC;¢­.Ÿ‰÷}´D©¢1ºÛ¡ਂџvé âeé0aàÞ,ƒËeÛ˜'}vi*âM/°32×tÍ9Gn›Ó¦ÝXyýáí͇ë»ë³Ÿþ‰ïÈßlº¿®*@§}¶ÐrÍ!î^ÞÊnÔ+6ûæYzusÁ¦Ð’‰o¨4Š(X€*›EàO `>ö¶//ú™2áí¯Fé›ôcõxÁì1êMÑø/ò9ð¯Õ¼]½ÉÓU}°ÚéFìñÝËÙì§ç'mõÞÂäáæ2Å5üE~øqFàéËkÒc¾üö)·Iµƒj3XHñwõ;ñË©PLüþ²^g?ÊÅôqw£M£Sm÷ƒ¿žô JNt:gÞïSéâ±L›_úï ÿ Tr#þ7¨l@É £“Ö<í¦UK´Û˜ GÉ•0œ ]ÓÝÁv¼HW@¤¸SF ôÔƒ¶MTlЇ®ø°f›3–WÝnm§æù<Íøëýg«xlÏ9tÁx!t§´àvÖšæ¯=­ýðx¥½Ñ ‘£Ÿ£¸]1Ö׆•‰ "Yµ3(Å´‰ )]œîFµb´liB‡œæ@ÜCÑß4$à@Í+ŽÝ‘ƒTl±cB"y,­õüõì.:myƒT´¨nn™¢è²Iv× S…zøŠ‹ߎ´¹ï]]¸ƒ=¾ùÆÒRe³ô[ð- !‚ÿ¾MϤ,Eî,°`êh5Jéþ ´ý_Á„ádtެߋÿRô± >ˆCº¼•­|N€4 '©ñL•ÏX÷tá…²n*³E¹ëî1uÍ#Pr'–H(qyf¤±€5ÌÚDó4¨Å-EU¶«5z¥>m;ÙÍ3 y±Q¤2jº˜Åß— eÑš¥Šµ(T§õ½ŸÜ†úõ8}ýv¶ÛÞMͶÎ0Fâ+0=¡×ià¡ò&GX§Ûc̤뾅"™@†¥ #oD‚?ÀO‘Ý-æéVw“Üõ­saï:Ṳ́~äÝn!Ë[ó„Íæ{öòõ+~Ar¸·Ù²CdƘ. ¢ûk Iò£nø±îÍK &GR‰¾%Õ1«ÆÎ¿Y(ZF¤PI7Û\õ¼ãúþÿìêóâï)=––! bÒMaG1/q…xù‘ƒhî/v>^É$ixMd–ßRÖsy¹â)vZ ˆT)³Øu`ƒ/Å;šàÐa÷j§Ñ«¹&¼U ÝO&ò3 ‚º>o O'’í÷ ¿œQ¸SÕ|æ¥1/„‚gÓcÙÂVØQþSzf| ÷Á‹:Oç z{ŒŽÖ<¹}‘olX(Yàlà;{böÖÝQbG/ÐÔüAd0,wè¤Ô̰ó ôÙ‚„®).¸È^¿'m®^ñ'ÚCóòÅêxÈ–Ý|@  =ºwì$®5µ†”Xƒò>-\ Ja¦¤æäLçºöÀÅm÷¥z¶>ç4Š\ßS”wX"­!`p³O/,Æîã ë|±¸¼*j¥ØLñZý³ðò×iˆÁøÎSÜ$@ µCÕ­ ꀘ"E×$Ð(Å5Ùy^˜ï³/¤´‘˜*Y—«}¶?ÿ\uûB7K£—i˜5rszâß×Öü’jÄ^$]¤mÝ¡½vÌû"ÄR•îÙ!ç¥48gE>eÿül¬»•”˨ˆF‚¾"Ë\mFZù¸Îg¡h1¶ÐÀàMZòKÈԹǃ@«¤s5Žo9)…B™ÇÑÖûKVBˆÊpqüƨN*ë7‘™Ñmó^ ˜GW·³@Na„F¦œxÀk˜¯mÕ#?É«ÐqÎñ‹‹ 1ÜÛõE•=÷œ¦k_“VWV°rBš5“ÂFó¨j0–ЦPŸ{ØIÂîEÂHÈOöh¬Nwœ½›—«ï% endstream endobj 126 0 obj << /Type /Page /Parent 339 0 R /Resources 129 0 R /Contents 130 0 R /Annots [ 127 0 R 128 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 127 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 77 0 R >> /Type /Annot /Subtype /Link /Rect [ 153 130 291 144 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 128 0 obj << /Dest [ 123 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 344 349 361 363 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 129 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /F2 291 0 R /F4 294 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 130 0 obj << /Length 2487 /Filter /FlateDecode >> stream H‰¬WÛnÛÈFoõ£ìDqxf6XÀqÃm’ "M»* šIÜP¤@Rö*×íô)ú޽è÷Ï %Y–²7kâœç?~ÿ7¯ÓÁ8M}&X:—9øÇÇcÛ‰EIh»±ã±t5_µ1Ë[µÆam^ Æ7ÁíÀ±‡ÖäƒQß|üÂ?fÖȳ}¾ôu9s…õÏô/ƒD°È±“—x±Ù´ÒûÝˆŽ¢V¨ú/sÇg#ú$ì~Ë&Ûª³F"²¾”m¦gG¼e—7CöÿY£ÐöxSäË!›<Ý7Ù`E€Å¥… |žU3k” #•DJm¥’+lá‡úé-ˆ•4Z’ÇÇGÛòì·8‘ŽÚZ¿U·„ŽÂåmÑOèeùR+ØÀ Ì)˜áÃÐñ\FŬ‘ƒùàuzàƒÞ:‘a™6ÏÞôÊÎborAòñt)Ùç[v¹.X^W]VT-óX+󮨫ö¥•þ:¿uµ·6‚0ééì4äRkÒ44‹l?Ô¶àÌÌôÁbÃ#jFiï}a¼]-ŠJ²[+€3*˜)äE§¬±¤Ï ò ÿd|8~CŽwyUÕ‚¢ÇR>Êu|²‰l[2ÐéÂ?ÈFñÞF±–n"»µVhœ]æ¹ÔM-‰ÀµÝ`§ »WÐÕG¼­6“pu)g¬¨æu³ÊÈÛðºd+Ù-ëæÛ¼)Ö*°†±IåœU=Û”ò>k¥½$‹ü?êâô…x/¯¾+…/#Ž¥ð(š¡³õº,r}åjÓªå’>³Bwafê×U…@dH¦¯g¸“gýÈŒu5[e_­Ä޹Ô[˜>`c9øm,CýL·Äά,Í3lÌI#,3Ø¡Pµœ™¼‡)`‡’ƒTϱ4@tè_H^n_ö›}òÌJãìºêô=[¶®‹ªcs AÌke9=sÚ:žç ôbl"ÔÄW„ÐXJ0‚$°CßÁ© Õõ‡›Û×w×ÒON:.tK'Û릺¦ÿ¦hs-ŽÎá)ïg>ßÞ]Áæw·U?’]½î›S«o©Óï.ÓôÓZà459%|@8ÕÚÉì qy`»OÓ öÀ¼K´Ël‡ -ú‚‚¡ÿÜ’m3Jþüý;FÁ0\Y£(¦ºàûÀª$±²D¡–úP©¡€zWÜ7Y³eE†à¿\[|Zô>+¢½n~‚#ý?ŸÄ¾I,8x^—eýHB®³&[4Ùzٚ̽—*¨EÎÚN®[Ê•.û*é›72ë,! *´‚k5)£#q‚Cå¼,$BQ%¬•ôð'¸Ê]û \2ã/üB•9¹E°Îç’€f8$‘íœÛzÓ°,ï6Qv›µ}œ"º¢»½;\[KÍ 1%AFŸ„·¦ËLß,jkÔG=37ßFY`Ù¯ï›Ä8'Þ…‚AÝù¦,·l¾©¨,’‹cUŸÌ„&¨É#0¼Z—ÒØ­}æg; ¾Sz8[7õC1*g-¹´cõ\¹qòæ¯lÊuRÀ9Âà)`S½€€<{_+ÊŽÞT÷E3¿+ËN•·L­¹8ÀæÝ¾¿Õ¬~TÝ)G-¸ªg-„¶YÃÞÈr½,ŽcaŸQ»äR>T'#ü"BàfdÈ©5dït»ùüçÉ}ã+Ö‰G»q;D èE<ÖÙøçû_%ò ë»âAàÕÔb`lìE [ ^m~Ãa7%ì;¾é¾²+(àó~˜ZöÄW½8:‚/òìàvtöØÂ ŒpN#—pbÛwŽÎ8Æ¥“— UE®ŸÜ~C=…n$¡ÅiÂ+8Ÿ†L>™èE|¾Æ)2z1¹Ó"ŽS­ €ß…)/pí8>†)Œ¢i»áaU* ¢Üw ØdŠ…Žô±ˆŒ°ÀÐ.ž¡‚º Ú«í †OƒËjˆ£°ÒÀ 2–‚¡¨Š®ÈÊâ[”ü ZRW±€˜3þ%@6|!ä««y±Ø4š¥ÌA•†ŠøT‘ùJ"U{3xD Nð®åi_I‰$·aøêºx ´=õ(À{ ¯8Æx*ú¥^ÒídaàeÖcÛÍz]-Úz”CmòBË*+d/˜)tŠ÷ø”)Ù})I×_hã Ùã’ð?ÑÉò%˳ŠÝSºÚ‚!g½G*V&WäÏ•Z“éƒV(F³¬Ë®(9Äp4GƒUWÊ-ºCä-„1Š9ê¡0Kª#ÄH¦Ü£v?ÑÑ;K°4™‚möÍà)¯’¿eÛC»ZYx“)Ó’é !\lVH©pä>è5ªÈŸ†ÃjÍgÒ\f9'¬3Ä•ž_kœýÄÚjéd¨FF€r£“ž{ýð± N ÛLÞo¬¬:L‡ÊÐjRØäÜÛ6°‘n¦€¯7]Ÿ+poDa¨’,¿˜o{f©äTñ¤Ž;™ÏÊeÛÂl½F;Iw¯ÌŒõ"kÚ±eh 5p¢]“™Š©)òU&.4ëi_b+z®§>Þñ»ð•ºä'ÙëtŽ æº± 4³ý˜Ôo#óß Â~ÒwQ¦žLÀv×?·ùû³»{#;êgû¡¼ùôüëôš…S6» Õ=¥ç¯ˆ?ýyÊW[Ó™Z¯Æýø‘yÀTè™ o"Å$93Z'T¼´$ÿ~z“HÀ*Ï_tfúÉ=q¬‹‘ˆ‚}Q}5>åv‰óæ?;InדçÝ~zó÷gû{c° ÿ¼ÛÏÍÃ߫ͩ±¯ÍÁ>AS:kuz,Qrëæëð0YQ ª*ý/tÔP¢Æ»|\^ìê9@p9ÛÕ_ä­~GpSˆAÆAÙgRN²Å=†Ê|!:ówùÔ‚pSG”ÉÌIĸڼàÚxϰEtðŒl©ªÞ™S@€w €õkn ¦[åÒ^Ïæ»“u2ʘwÀÝŸÃË—Dz5Õä‹«' âA•yc9mØVUpÈ3£}¨¾´0+Õ½ˆÙ½R4Ës žK) ¼ÀDÒ©tØù_${ÿï´P‡{ÙCóP8”õŒ˜Ý‚æUdÀ(Ñ£²R×_Õ[F «Î' ð¯*…pSB±KÖRÙÁH®à¨ñØ…½ té{ÝoVÓþ|{w…¸º»­ú‘Ä|n«}¿/3ûÝ»ƒh卨íl»fƒØF¥§+Û¡0ÙÖÑÞ÷ï·}ëJÓÚkÅÛ¦|j‘.šQ$ôáéd{Ý4u³—$û±wÿÿ‡:ÙÙ endstream endobj 131 0 obj << /Type /Page /Parent 339 0 R /Resources 132 0 R /Contents 133 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 132 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 133 0 obj << /Length 2650 /Filter /FlateDecode >> stream H‰¬WÛ’ÛÆ­¼ò+¦ô)‹ûÅ.¹J»^ÉŠw£--%;ñ¦TXpH"†—¦SyÓè+òyÈé™Á•ܵœŠ]¥€™îÓݧϜÏ&g³™Çl6[Ll‡Yø¼(2­È X¦Y.›­'gUÄÒJØX¬J‹ÉÙ«[›-«‰eZÙ¤£Yî'?i7‰n¸¦§-9ýu4æ8úßfšÄbƒ˜…–8ÄÔGkù½ÒV´ äFÿfŽeyÌ ?1»?°ÛCQ놚±¶âU†¥k†ZÅ^¼š²¿þG7ÓÕ¶Yºš²Û}Vÿ·°ðaœë8ÀÓ’b®1ØRx$Â!9¶i{AˆçÙ·Ò;ÞHOöû½©»f UØ‘¶:è6þ-êb´­Êš¤Yºû_Î&6ËØÄ lÀi37Ć×aäQĶ|²˜œ#/m™ŒØHœh¹¦OP…>ü $VøÑôU&l9ú“vv,>”^4ká¡\V¼®³bY5Ïù¡³Jêf½Ù–Ùœ·fIšòª}ªËf•–Å"[6OÉ6Kîs|Ö«×…ŽiC«ø—)Î@ŒòCa ’2”¦ØùgÊý“‚Ýs–YÉíÚÎÕòì=‚¶ásS€‰ ”gB¦YÌ3]7 ™|lãóhP4Ò¥‘Tšob*)llk¸¥¶°­Èô¬ÑS_=u¸ÆBvpúH®úÝKûëB œº îñŒÙ±y=áÚß•´ÀaUÍ7_Y¹»-º®,ØzWÕ„¯RYsV— Ò6½¾b2&›­²Š‰TP­‘ÒÔ¬,z£ÐiˆçDáÔ+•{$?“É—ÿª Q¿Ê‡¢fûä ‹ÆdoèiLþÉ×zÉ­Ì(±¨uQ\éªT¶ÅWÉ—*Q ¯í Y¿SÉ ”éj²QãÈ,7±v¡6‘r¶€ôŽ4°8+’5¾ùð•|ó5‰9âñµ!ðq݆&—@øÚ”ÉK^vF]È}”y‚­VjƒžóLY¥5µ%n šÝiÊ/´¡¦8aF-Hƒœ†½K*ÔÍNX×"5—òÕRwE_Óò =þ™ððÍËGeû]Ð¿íø‚­îtSÀÞäÌ@²r‰îf ¥ý9;qS$h÷«2¼IxÅqY˜³¤bTù0«aVî*6Oê¤éq¿CÂÒà-¶æër{@g¿° ö0ä¸> ±ˆ—ôÄQ¾öãõÕšQühF¦ÿ¿ÐìºÝRÝž0Z’·¶lQn°¸g&s€Ñ"»ÌÝ ^Aï£æË“•ÎQB1Õx&9ÝäßÓð’C¶œ“OB,8ãdr¥…ùâ|Œò££N¡±é¢ã·9@Žàš“B…ÑM€©IGŒ…ùªâi@ÚégVI|+ö»Ö ÐÊüDE­²m äõ÷ ¥jEàr;ÚÊ&?êb‹¤/ ò?T¤eHKLò$ψuÀVÔ`S–-  qˆá€²ü®-ä¶‚a›°Hv9J@)+¨ ÐlY³E&^L7—&C ®pSå%« j!ÖR*°@[1Ì3²Ç¥Éˆ~‹~pdõ´~p¿T?ô÷ømú¡ÿ¥ÑA/VšútA¥Ê¹•Øè†íS9W¿*$Ë6=ï´8Q ‰šÐvÅø6ÉBa¨ ÚÜûtÅRtnDâÍ%µ'*]‘,ø”4½(’w¯Y²Ù䙲ô[a>Jq.ª³sÌnÓ‘TԎǸ ä0t4¥»%;#üÊ×÷|N—ä<è9aµú‰O•¢]o”5izÌô:Q#4¢ZÊÕ©û!+æå^œ¤Œ¤ËŒÞÑÌ4õü¡;Õì©'÷‰é¤òÉÄݬb«„(Óná®)5 X¤‡Ñ–TG«#Èb*š Æ‹T¾Xµô[nxAYȶx¾öiD¥®eÚv¯çƒ®øßàsÜRΆ ?i9l`7„rƒð%H”Q9š±ßT[ÚŽ ÿ3¸•Í@±H4X¹PPˆw }ª¡Dߥ9q§&~Ÿº·ˆH^ñú=í9uP0}±×ª=ÛVdô™1ô™u|V;ˆ;I¬Øº9êü@mãh¯¿}ZÉŠè ‚Aù±ý”'R6àôÀ´8]œ·Ä:·N—GN,„)ŒIõêµÛ÷ÓxªxGImÏ>? äÁùp¸1—Õò™QÒ¯ÁôÙ&ç£l@K¯èV"×…,d%Oå܉jìR©WÔ²-è‡lÎ8s˜BÃ*Q ïg¸P]SÛ'†¬ßa(¢ýÜ FC©gÅ]‡Ç¼¤˜S蘶óx gðüš\£èö@?æÊÏÍMÎ6[¢Äø]½ƒkðl žKAªŠåx"— üs-© ::d¨vÆÁCû¦ähÈ<âù‚ç%ÅgØn»HRÜSJò &•°CZ]NYRØ<Ë»"¥ï #ên€ž6%ÉÛ‘üª§Ðð/–ÍFû,ÏÙN>ì’DK¡nƒ’O1°ß…à«ûAòóc±À`ÙzÍçD§¤axNú͘,•$M¯<'ºþÝájT/Ž–—ä€Ô¹(SQ 86$åÈ^/dx™4‚ÚýÇ.ÃxœG£‚¬îm•/z!t%ÖÝK¥lÒá7pbüUC(…x½œMþ;ÞØÜÇ endstream endobj 134 0 obj << /Type /Page /Parent 339 0 R /Resources 137 0 R /Contents 138 0 R /Annots [ 135 0 R 136 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 135 0 obj << /Dest [ 261 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 730 88 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 136 0 obj << /Dest [ 261 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 385 716 401 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 137 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT2 417 0 R /TT4 421 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 138 0 obj << /Length 2342 /Filter /FlateDecode >> stream H‰”WÝŽÛ¸¾÷S°sH K#J²,o0’ì$;Ýéfq¶h×Å€#Ócnôcˆôxîå¾A€¾Cß±=ü•d{&[°(Š<OFóÕÇ(‚<Ò<£<ÊÐt–…q%h^Îßð\­‰/êÑù»[Œø( £H®)FîF?{7Ä’0õ¨|ÆŠÿŸó¿ŒfJÀ M£p–Á!In6Uz<•¢ä(Ó‚þƒâ(JQ 3t¿G·ûZøž†3oM9ƒaN=Ž^½£üײ0ñZV¬ÇèvÇÄgÚŠ ,.}8 õH½ôƒ @¤ÒH™­LŠqˆÓl ïóï´68WÚhMv»]è'aæq(Eí} ÿµXƒ8ö8³ô²b­ä_ÎG14Š3 îÄ(™ÂÁK#©QŽZ:Z^Ï{1°Þ™fQ˜›t®W~ÆË±ÖïU诤ڔmÚæ¡%úýãÕÙlî8‚Õ<,6›/ˆ¯›Gð‡@uN‘ýŠ R£{ úøèO–œ…v-‚Ö¡qVNJ¤ƒÔÑq§El´@%ã5+T4UÕÔhCÄZ úD÷¨&åˆo7›¦t‰VM+•A-þzŠ’ÑZ Z?°ÚWN<ŸÄÓª §VͤÂÂN±Ø)6í›jÅfa¢ïè†ÖK0fò`é=Ò–³¦#¾¡#%ZmëBÀ )™ðq ðÝ+ 6% q%­“›º%»oI»wòÈ#a% N:ì8l÷2^”ë­£*ö°2$K¶ZÑV¶j›JÄl íR†¼€À>ôoP‘.CË‘hàㆴDÐC'iR›lr´y©·¤ä*,Ê+VH0-·…à¡?ÿEŠL:؉0ö\j j!2æÒ8ŽHK¿…äœMø^€~?±+ë¾(Õ Ÿ§ñ¯YEmSØ ¬^5_¤>Ùøÿ(åΆTØÞÚD˨Õ0ŽS£!§- ãã?˜„Ø»‚œžy‡Êv¾Œ3{fl˜ DøAæÀ1 ’š°×úÛÞ£ÄðÌÍI¶”¼ÅùNÏ4íRuhŸb%ç—¡uÒ8?… ±nò±4‰aR¹L«Ö€Åþˆ1ýÓ“8‰ëX*e€ñj¥þÎüÈkj­Ôü8tÓ¹·VnJVìדͶ\JØ‹²Ñ“T‚A«*ºd2±à,÷:oV@»5ËÇ€rfÖïXY"òذ%°J­'Í7 ¦Âl‡ü)›âd÷ÉÔ›tpšh¿ û*)*ä5¢Ü« ¿‰žŒãéa(«xí¶ï¤ÜR³[©&ëWიnÜ¢f˜ù(÷cÔ@ ›/¨Úv›:êP¶DI±F‚UGI|’‚=I¯ð>„„HƒKºh%Ë«,†º÷ê>Ð(û…'Í¡D¦¦ð„&Mœ„~æÅò/‘XiqtØJ`(¼Qt(NŠòгj`œŸÖ#î°?1iv …ŠïË/ÉN ˆPæËÔÄ€[erLtÎáLæ òƒP9*ß ÈóÄ‘^&œkP1€g•!³{vžAªy 5Uª»ßzç¨Ïr®žÆau&jR:V†š 5†*,b@DS»ÊÃíQ‰ü¢Š¸šA†àÌ—›–š-°Y§«™€šÇô¼‚KèFL 3ÅD–r¨›€gÑt P¬iñI1*‘­”}YXíÑDhÌ€¡\«²„¥/û/‹M›ºEK ô«ÂV¨–ö’R5%ØåþTrã. °iD¤B:^ú¢¹zJÆ‚&­ü2]ŽË²ÙIÍ‹f©=6“¨ˆ¡+VÕ3²gR]| bàºÑoßêP¿Å:Ò3¯nvå ·€E]GNz=]œö²ìü*AÐðnP‹}!œo+jßÄ€nÆÐê½!eywUÛ™o x¿ªoì;P§ èÓív‚äÊ€¹\´Pñ·mŸq]€úš'ª¥°º¦Kû~¿·£7M]ÓB\ª²½ð¾ m:ÅG"‹‚r'Öv¦NãÆŽ*òÉ)Ï¥¢v¿ÙWOî~ãô¡aÍ›†ÕB^Bøtÿýů¯Ç_܇—VtQ%ܽÿ°cìúב·!õ3™@O Õù|ÅZîRFØSXƒ³Åš^ó:—ÍÈí(Ò¶mÚ.nKS0ÔÑ¦Ô ƒPã!´+ö°mÚµKÒEr×¥˜ºî8üÝo^uÓ™ÖTÐw³û.vL¬Ý×m+/½ìàÔhgîE®«`Õí¸óÒ•[Ûñ‰åg •7Jzæì*ɃËêmœû'ÉǨG• ƒvªÂc¦€úT¸óíñ²G<Ö®)—ÿddNùÎŦ¦»ñWÎa¯›V 3" 3œÚ´²ÕÐT ˜'U´ºeŸ;~üüÒfuÇCeŸewTü$[Ü…gögã-‘˜«a/µÌ¢>÷8ehöÙЮb™…Y’gÚºwTâ3ßÔÕPï§W×ó¿ß\Þ]ý8ǙѮ#‹YYšéXb×% ©Å €¨†ÿ¸úá,¸g]>By8bëÀÚ÷Ñ¢Wrþ‹¡Ž´†›`šÍfÇjo:.(7 z€·À À°Ò¬žÁÝây ÿX9¸2¥Iz¬ï±cGÒ2"ÉéÀI8 ÓÉ4xéÿ¬ŽÃ8JóæGUö•?uEÅjôÛo‡…@ÛêêÏ›·ïn^}¸½ü£UèDå7÷Íçy@?áóí×ߺöM6ø.]MÛò®—Qh8bGy# íã×)Zô§ÈÎuX§R¦w uUâmW$ëfçêD—~¿ôê€æïg¡®'+UŸ¬ìÔãƒ.¡WH¾R±ž¨3OktZ‘îÎùw{U‹ü°zÑ üò”Gž%óÛ!™_ÎGÿ?£=´ endstream endobj 139 0 obj << /Type /Page /Parent 339 0 R /Resources 143 0 R /Contents 144 0 R /Annots [ 140 0 R 141 0 R 142 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 140 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 77 0 R >> /Type /Annot /Subtype /Link /Rect [ 71 169 209 183 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 141 0 obj << /Dest [ 261 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 392 142 408 156 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 142 0 obj << /Dest [ 134 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 311 57 343 71 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 143 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT10 293 0 R /TT12 295 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 144 0 obj << /Length 2289 /Filter /FlateDecode >> stream H‰¬W[sÛ¸ž¾êW`õà;Mð&ª]g&'Mã&™XÙmu<4IXÓ¤JRV•NPÿcz@€ÑŽ»íhF@ð\¿óàÅ|t6Ÿû„‘ùjÄ\âÀ~ÙNä„d: m7r<2¿½,#’”rCÊ$½¹bd]ŽÛqpO2šèá~ô•~Œ­‰gûtÍñéRâúÖ_çͤ€™:ö,%^Tt§¾w§( G¡ô/â:ŽO&ø˜‘›¹:d•5aS{F7¼0ôì)-Éó7§ä/ÿ¶&¡íÑB$›SrµÕ7^ÀŽ6§(ðiœ-­É  RZ$Ý–.¹Ìf~8…ùü•²†EÒeÉ~¿·-Ïi QÔÁbðŸU𑹴ú…Ú–l¤ü‹ùˆAFnÈ œŒxSx˜x.A‹"RðÑjô²ñš©dÌ 6*N8`®¯b5 ];U°šDȨùh'Mâ4}›}<µæ¿À† ºã‡è ÝùJ¤¼|ÇP¯í ‘ ·zn ·Žó{^ì Qñ±’£·…v膊Ž#õII“z½%£eÒOÏ/ç_>^\¿}?ì:1Êê—Ê.Tar£™R÷•žAf‚+í†Iž­ÄZÏî㢦;³«Êõ¨äU/å“ZK;¥øÆóU×wÈ'ókßé‚«ÖSÍF©F¹Ú  ±?r;YX¿ï‹ìä§-s¢Y¾71ÙðäÖ(­âjWêY¼ŽE¦' ºij¾*x\™ˆe|ß Y%²µ‘Ñhågk‘a,zþ`C×z0Ivn´+ÜNž½áÕO˜º•¢ `€uÂs q¶'@\ k¯T|z8ŸÙ¡…Ç8¯×¿‹sayf;^ÈŽA±7!ÜÇÈjG‘í96Y`áäFTMN*¾žëE¿VÚŽÑ‚ÆÛíÇ?(ÖI7 GVÇúálËÛ]5hà†¼_`ZH;þO¨°®i ëØ8ÇŽ|Ï Ðê1(iÈAÄ7éq ú¶L£N”NÊo2á?(Ï¡êl¿ÒX0øgßÌùo[(é˜É•ÂX›¸¦<.Í$ÏÌÞå¦òþ.ÊÊÀÂð°j„fyu:\çK¾ŠwiÕ—Ý Q§t¾S¿¶<»ÚÝÜòCSÁ½8}mJ¸þú¤Ö« ·kKÙY|wñêìúí«ë×o?]Íͺ#u=’¯]Î=2;r¦®ÆÔ=?õâú}þ2‡šÉ*à¸Zç?t˜LªîBLôdåæð¿KQ‹÷æÜ_Ÿ3ͺÿל½¿øùúÕÅëçŸ/UæºÉSò÷Ãù凗Ÿ>]x÷ä¾ë>”¼‹¢È‹&EqE5œ0Ó0•†Ny_ò]sˆÙ¥Kóõ¦éä±iµ»’›£Mœò¨îîÐa°U-(8T¶ï²éÀñŠw"C‡zÀjój‡Z”7@ˆ† ëüu˜ði•g2g`wÒÃBí‡ó÷Ÿ//ŸZ™Éx”SK¬aSG/Ó¼D{¦XZ6$NõÎ,h` Ò“U^iž§Atm¬q•5÷\ªÊ”d€ƒ à2WYŒÙS ·¾$ZMæQê©Ü@q~ÇÁ|€e`3ZZ¾=£`÷$å÷<%êj¸+À—¶e®*¶<#©¸åäŠp“#Ÿ?Yº<%HµY|‡Né)ÙÆe¹Ï‹¥Mž—$Fu%è ЈAT×µá)«Y9 ïzM«¸XóJéN&\þjþL%wyÁ!4  4C’Àûe\Á¹×± ±z€F¢ õ°ª¨—‡,Ùy&J™ÜSÂãdsÓ˜Œ!.ÄS ©®_YpÜžJ'.< ²ßø\2vEÖþ1…¯hžÔÑý *hã–DB ÍÝv› '€Þ¬«ƒÜ ÂYcöϺlg²#}’èY’î÷q뺨­`¾±‡¥lwVÉr‰µZXsëµzƒt´ÿ¸¼©[…[.–ÏÀ¶5hÁ¥ ü‡`„"õ£t0Å(x)ðgD-ðD -OMû7¨^ð gkX}¥W‡+HìµRŸX°1l£¹ëëBq‹šóz–%ÜÞ.W=Þ ^ Œ¬ÉSª–M~†®Pû=FšB*cð«Iaá¿Ä .L)¹µ"tõ€™‚®£) ä’XmÉÈ bËGlyðÀ\’*7Ä#í¼˜·"©6…ÆA˜hÐáIÁG«Ñ‹ùK² ‚€¦vÓȇkEdKl¹‹S 4œGÉÍûä YTŸœ­,`—ƒsÍU.†Ÿùª‚€äÕWÈÂÉFÕ æ-K Þ!êg\?Wyšæûz²€+T_ZOk5œ€M ëwФ^ëfã¹·i²Šž~SS¨¶A:B…Ú£,f;ž>°´äVS8’wœݰf*µmu›¹?¯ˆ¼ëÊV  äüo;Qðåi?¢“  >é\’Ä65"JÉÑ7Üàé Cã0܆¿aBñÔÓb]<uyC±E u³@—!4!š%øÉÃÓ[@¡³È‡åR»›çÏP¨þï‰v4½ƒÕM³caO˱ú•¸ŽMÙ°T£3¤[YË<ü1.è› –9¢6®vR‰³¥ä¸q~Ï•–=Êu©š Qzp‘“{¬m†ü€ZÓ´H)*+Ɇ'@’½<>õÄñ†ÇiµËÌ®(ºG8Ž,y™â¤Cªïl8Ù; ÿ Ù±Z endstream endobj 145 0 obj << /Type /Page /Parent 339 0 R /Resources 146 0 R /Contents 147 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 146 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /F2 291 0 R /F5 296 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 147 0 obj << /Length 2891 /Filter /FlateDecode >> stream H‰¼WÛnÛÊE_õ½”*$š‘¢Š¢@râ>q.°”ħIaÐÔÈbC‘:$eGý£þcºöÞ3’,)i“ž ,’sÛ³/k­ýtÚ9›N‡ÊWÓyÇ”‡ø&‰ë%^¬FãØ /TÓeçì§&QYÃs<ÕdeçìÅÄWwMÇs=æd}|è|tÞ¦½Aè;M¿£‚¨÷×éÏ1o0V#ÏÇ8$LÌ¢¥¬F´=ŲÑ?TàyC5 Ÿ±ºÝ¨É¦l{䎅nr<†îÈiÔ“}õ—ö±:už-újò·×5fD˜\ôpÀÐIËYo0ƶd‹øÚ|¥Àwýa<Âûô™Xã'lXòððàöB7vìH[mz>þ–íwô§Éí€L˼ÿù´ã«\u‚؇;}Žð£ðŠ,JT­;óÎSDãypŒdlbñûi¬s~×›þ"ËblËeFlŒ]lÀ#©h´È­®æy¡›^Dƒ÷y©ºg«ýÏ]ÏåZÞÛ^nµªVºÔ3 ÈË;õ'ëÛÏzóÉùÔëÛ¡uZuÛƒ³xq:*ou¶Xcb2@,kªoMõMZT÷läúŽJïÓ¼ ­b9àÓm¡ÕJF«yoˆ€°õ”dý’q-¢ä; qìh%ßWò–åi¡^ž÷(É~yÿä’7¹¹À–±óìæ9^}GÞ®&SÙy…¿¼ï%¸ÓáŠ×ç×Ó½‹…Û‹%»‹%r±û´X³±ö4¿ùÌåÕgÏ}ÉÈßsÑ6Iê0¾’ püx/Žë÷<ÍÊ^eUÙ¦0%vr*¢‘S6*Uåzy«kUÍU£›&¯JUè{]à­¥@6J®ÒWEþY«n£kÄìÝUo0ÄpPètû'½rÇÄÜÆþ]ÏÃ_3„ÚC´d +‰ t›¹¨sT¨™¤R™€n–™‘G›ÌöÓä…nßÓEXß¹¾¾VÈ5B5ÁG›F¯¯{*ׇé+NíÁH]­áMnfô-ÅK‡ã=‡pÿ`\G»¸Ž¾בD5”¨vÛ´¾ÓmÓ=E¬QÈ|ý‡Vepa@E‡A =ß'/p ÁÉjö÷¼AñRož"*€‚· œi» ¸°~‰¶9ÏûŒv^ùäî¹e¸sËÐä×ã[çì ù¦>#²¸ÔFÍ«Zi©Ü~–¶iÓV5 c½ZUu+èGlppé8+{u©²"×e«ty——‚X–?9í"mUŽjiU£ÕLÏsÂS0vT×´º*çùÝš`²*Ü38ö@Âoç$ÎãÀ»…}¸DŠfó_î0ŸÁ—`h0óÉœØæ›Óò|•~ƒKzD«¨ú!b¨öªGզ̘¶ÔŸf·í3xJ>û³õ#%ïõ+Þæ’—±Weƒ;%olÎÒ©¡ñé`ÇœOía¸’YÚU„ôCóaä9*-äAvT«ª‘w±•hª­˜ùx—´…;ïí%A‘äk~¹£ Lä§ì»6Û¿ø#-Nªì∇‰®ž\Þ\€Ñ.Àc; Á: â286Ú#¢àQQñÿ%é(z{õ¹# ]-ž  ª4ÔosškŽØÐS/êvYÍûC""‡¾ê‡€,–U«áub@V—؆'º/X{ÀgÉ'²äÃ,$33bÆiÿ‘%ŸÈùšÚé6ßè6KQÄA!8Š#9¡{ó®iïÙ”¼ÁNÌÄa>¢3ÃEP³ Dß(Ï ]Ò=˜Eµ¤à~vKnÊ›¢ZhYbÃ_úÌàj™~¶s`&þšº24¾©ÖjV•¿o •ÝÒГ;²ÚÊIÙú3¿EkìËþ1·»¹Ønp²nÆ»”ËÕ)ÿ4)A? <*{™á«&•(ݘ•.‚2v6}ØÅ…µ‘^nD³§ªž!éíX¤L‚¬3_‘~-å:f,™Ô7%r*a<w_n@ùA®Ü]£nêÆØ8#." ª0(µHï5@¿hóU!|(ý5«ÁJcCÃ×R 3§t©Oúõ¸ýhó%®˜1ñâõ+ø œIÊ£ÖKÊáˆ%«3{T£tQlšN-8 \P†a2RòjÏ!šÂ(°Õ¸Ðž¸CQ¾÷xÏlá{‰;ôöØÛ·÷Ñ«r?·¿RÊ*´}¯obtµ.KBxÒКÔÅ‘è1G¢C´™Ÿ *êi#§”ŸÆ:‚춟´·ÇáñÞùÞö|Û@¨X­‰{bGlIUCÖX½šAÓKŸ#V0Åsj­ÕmÚä˜plþxH"m£Ã¾å{ø"’6;ð­Ùq[Ffǟ䀼¤ô“ ¿(o|@‰oêÙè; ŠÌ+Íb\PpMY‚Ë®ísI88vè³Z¾OdÖñ$‡»c`û¸Ñ#Ú¢=þ<.ª EÌiÔ P¯qE,›ÄU9A¸ÈBTÙJCŠÌŠ aCʤ[TÕJ­!Ç ÈÌh×u)ëÕdÊ¿çozõìæÙ›×çÇ­*Ý0þñNu¿¡Ù±µgØšŽœù6¦‰baóéZ?-gØ OÔ¢»FƒóªˆmuÁâ¤ò'ç“ÉÅ›×ÙüüíÍ—/_Nª‡´Ú²Å^hbÆLJÈ•œÄzÃÝ |»\Ë#Ò ú9[èì³@¬ ÁÀ¢V«VÙP­dë2™VÊT†³1Ä,É:HÕü…¹ frI4&ÕI5în` „(«§dÃÈ{TºYhÔΪùû=_XË‹ªÌo©õŒ¦B’à?==Ø)sÞH^ªå~Š=,5ßÍ");ýƒþ+üFæið|V-—y™£< …KZQÖ‘‘P¦#aÀ`Û‹„Ô¸-ÚvÕWožJª\o£q”I’¸Yi¦•8¡ì;1º¯E_hAáv²‘™HP.t^±æ¿|ºžÏÍÄšjø ØS.}ÿbq<áˆàÅ{ñ–(â=¢à0Q0RÅ™ÐÆ:’G†[9MŒü`åž ]ßLÉaàQ%úT1¿ ©@®Ö­äË%Òž@ûewOÊ cl|Žm~NïS•®VE.Áoúª*}T{W´Ítv&‚ú}D:XÌz{å-K”€z¼<X@ @<ÖvS ‰FáÎØ„˜B¿*ùsj(>®efˆÌ*.'*ds«~]ëzc—“†”E$_]žtöq·i€Œà•öyÇÎE¡s³Bbž€ ,Ä^»Yi2w Az»a——âý;j_¤6E„ Š gßN–þqSIj|Z{—YûRo8áȾ/ƒ1Õ*8¯Q]˜Xjþ”µb|ì\ty63 ]Æ“í<«{Ê/A° øG‡YªáÉÿ>I~0?Ž“~ºÐŒyëÒd<8(-Ù½‰¤z¡2 õíÞµÐÅL´öþçö-:çi¶Peêzä Õ;¾©FMµÎÐI‘.žžsÞ¿­«»ÁfÈk.ÊyÅYÞÙçÙâ$Kò¼œQÌ€…+ÙÎ(o½•åFtþkš Òè2=Plgm+Ê…Ä5¸»ê5‚ÜVs,°ÃÌpi¥9¨Mc> endobj 149 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT4 421 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 150 0 obj << /Length 1589 /Filter /FlateDecode >> stream H‰ÌWÛnÛF}×WlýàRHó"SR pÕQíÆ‚ÄM£À ¨•Äš•»²¢ý þc:ËÝå]ÎEQ0wÉÙ™3g.zá´Î§‹ ä¬Z†‰tøƒG·ß×ô¾n£ÞÀÖ̾n!'l Iy$=£#âE­³ë™Ö¤¥kºÎÎx-U.÷­÷ÊÄm«–ÖUÖ˜=M™vûƒóSk* ž® l¸Äê ¡Ë›=¦Š­l®è/dêz©ì1@‹š"ÚVž6P6˜ø°´´žBÐÕuýúw[µ5KI|oÓA³½O?áNœÃá  t7Z¶Õ,@ejQêvê’ihF×îÁÞyÉ­1ú©5Ü’ý~¯µ-ÍVhdªmþGt>¦B|ùó6©þ‘Ó2Z¦mœ²zð@°±LÄ,ꣷV­N!ž­k}‚ú#;ŒVqÄ{?Z£!òâ%Fä·m­Ï½ï)˜Æ"›xO˜.ñ=ä‡Û‡8¢.õás‚ßù ^"£d!‘Cä!‚ ÏÏS§Î~48od<4ÜbËÖÎÍÌbí\Ú\òì ¢¤ëÊ!»ó5ݸ”¯ÞŒï‡nÜ#¾æÁnMøÎ‹ÁL?"RJˆ³3ª/$MvÝ%XÄW…¸Z–Å¢š_î  †“^òÝâÀŸÃ8аGGÑÚð\™·¥*S3m HI€$tŠû.±â˜=e‡Ên⻋“Œ“7ç‹,·c’Äë4Ž£UÌ¥¶…7©dzÞÝn'±QÆý‚¯øî’?^¿¹½-È8³Ã(Ib)AÝ‹‚Õ&·y7ލaËx; —%•3g4þüò~x;½vfÎÕÔ‘Zr&˜¦Öç)–ƒ°òBs½•¼TS‘zŒpÞù­dœÔâpæ’ÄÂéb·Zá„d–®_4…¦&Ï$/ªF± K6mܤb7¨`Âû²5.„@Žj=É/Á.Åe²•(V¢ ±ä¯H$õ‡»-Žf\n.ßvN%K:z‡kK­Aëk¦ðæ$<@ ö„üIÙå84oK×2¸ ì•ðòWeQ#§Åœ™þÝåíÝp4ÞßÝ@ú¥üQ#“Îõ5b†;býѧuˆÒ×sÅÖ‚–AE›òg5B)²òŠ<ÓCWVŸ Ž«fW-ã#î‚WUèejå÷Q÷AD?"5$Ì—D_Dnryô³àŸŠÄ C¨îÓ¿BpTg%õ³1„rúQÆhî›Â¡†è O.eYKî¦<ÒÐ EºànNézÌDchô" o®`Iü ™ùè»Ì©ü¤‡!›UʨüP¹E!Œ%3»2[y RjÈ2³\ÆÜc>Kïnž×¼7Ê:w=ªt*¾óRœ–UßÝ5˦FNo:ìÙDÒÔ̇fª5ª[)QŸÇb2½»žŽf³ãˆ˜<ðþ ‚åâɆ´§æ†á{âè{¾H<‰àR¼’º!s\úâÃÒ'ÛÀ“Žà„~mnKƒ†at¤‡-¾¼œŒÞÞ¿Ï&·Wï ]"çV8nNº rDó0/¾JâP¾cŠB0Ç]š¶p>8uä]¢ÞàÃ÷âÔ‰€&µâDÎ&8X6‘ñÈ”ê^æª/i ÒX‰s…ýÛ*ðåUà£ÑXcÚ€n‚“Gé¾$®dW½g®_cúª ÖÌz£–uö--ãRo s û^ Z ¾Ö›Šªl_¼ëíÕ­ón2ºwF¿8jgÂ9 {Ù|܈V~‚°:.G3A'ÃV>ͳp«mªfм@«yû4ŸkÖçUã¶;Z3eƒ³ŸAÙ Y¼²<“ÖîäƒuÖϲéXÖùó¥zÕ 2$ŸÊqZÌ[åÈçScó¸EËç %¬œú‚†;R»ÄÁaܘxù4hÖ„æ·ß>6ÀÈiëœI(‹zC³àºqD8G*í#J*ü}3®ñD¸j-]÷¿ëÇéˆ÷ãÉóåœA· –2"·6Ÿ8ê”*-ÝI`I½Ó¸8½tõXç–ÝÌ]ÄJóŒÌ,ÎÕÔI‘9­£ø%» endstream endobj 151 0 obj << /Type /Page /Parent 339 0 R /Resources 152 0 R /Contents 153 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 152 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT4 421 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 153 0 obj << /Length 1903 /Filter /FlateDecode >> stream H‰ìWënãÆþ¯§˜î„\H4/2EmšÞµâºÝ؆ÄM€®‹bD¬©yQ9C3J‘—È[äó#gn¤HIŽ·7 @!@’Ãs¾sÎw¾™yÎâxŒ<¯ž\øÁeE޹!šLCÇÜÅÙàì‹PÂä±$œ]-<ôÀ®ãºbN2™a=øhÝa{8c눫o!bÿ%þã`* LÑÄu¦!8 "ýQ¦¾÷'”…ÊÐÏÈwÝ1‰Ë-wh±Ë¹=ò&ÎÔÚFa8‹¡‹«!úó/ö(t«¤Éfˆ5å?fœÃäÔc ç+{4…˜”ˆdØ2$ßs¼q8ûøR¡ñ"‰F!©ëÚ±'´X¦v¶ÿ9ß@Œžo1j^¨iÉFÚŸÅQ4ðCÒé¡`7¢•d°¼…j|í©b˜$yïx"K“0pÎ}•&xåœë"¸ÞGëì Âv]+ÃDXUêQRä9I8-ru/@ÊçiÁÈJeNÄ ¦iªFKýyIFÅ–äfæº(Õ 'ßs3ãïa\çr9 ‚@d°ÅÅ—«7{^ °,«ršà[²ÁV# k o@ $Úbq:bÊ›H¦øµF<,âsÞKsŒ“í»LÛøR]ñìîÝ7—×/zÌò £öSc-K‚íøo{†Å;ë óX}::tÙÿ6Á£Ÿ6f7——ñÅ=­á ˜‰Ž—ˆÃ減ä’d'¦À¾ãŸŸ.peÊ{ Y^Æ ¸"»{ëÞîqíŠðoqZ‘öU뗔е I»ºuDß`=Út×Ê%«¾®´Ê½>ëIÎhÜïÚgõgv‹æo4¨‰À Mðm~kÒçJË£¦LF [:vS>òº EÒ¾BÁÒ÷òâùÅÍâîë‹ë÷Gb8ˆàÅy^cšù ;žÿ_Ôæ›ÙìSµ¹¥YM+5½P’„Ð'ѦZ^YÝ\ÙKû¬õ±­ø¡)ååP:”¨1ÉhNº2¢E@AŒ©åîY_QðÅÓݾ 6Ñ™è«öÑKuöPÄŠÇݧ–Jß•”“¾YçÿÚõïÔ®«ÛÓÒåÿ¶tuYZ¶-r¶¿Šö{âŒÿw…kê|šnZu£ý±Oï0É %›–°I¶êWØ×fýãFOœ öX×ô«Ø¶Ù4˜‡xY”|Øå'+ôƒ¬XÑõn¯ŸšÌ6»Á—uHÃ?ÕokÜRæÙv[-O·l•+-ë䣥½}“ÜXŸè¹ ñ/p „ê’AÔ¥€>?>»ø°¸ƒã„"´8¯ ™;Æ"ÃK×™ˆWÿªýG+9õÉiD?žÖI·_Ö‹··óX'µ§1‡-Ô9k¤E¡i^圦G¯Šœé!£‹­È²,Ê~;ŸBÓeµFXõd©§7m}îMø¿ûÒÄ|y{3SŽ?û¬mÄΔÙ|~;¿·Ub¦Î4”¦å Šàß QàN¹.ëêŒãºþXe^å ê%s147yQ›a’je7šbØnhÄI«D£ ´8\ˆ6rÇG£vºô¸SvqĺÎïF_½~Êì½y<Ô~þ`"?‹ã1ä;^<_š†ËÄU~ý °ÍÄ1»žp92ükû Ȯؤ ÊЊ0ú“âz$d‹È÷$©Äʃ8Ͳ=` ClDA0ØÐ*°½µ]¦dˆ`¡ß ¾ÁÑl›’  Ð?ïïåTkŒq‹h¬éµg¤2Œ’”‚  \I'H³¨8’»;„#[\bNÀ/,m+Å‚’bE{$)á€]Â^°hqøŠ€ ÎÑ’ Ø«’‡ÒÒL-°µ‚`úêÃ5ÂÛmJí© ìÏ’ 1Ê0ÌM&R…S9!-j´- ½Õ! E¶jq¯ BÖOƨ­Ï~yÀ>0 ù ©Ô‘…b}ÎPs⊜ÐbèÞJé#?„&[-+i%ΑHVš’Ô1Š…Ôîô¼äKñr–›ÛXÔÙ³ 3ÇpyÓã_àøS#zG¹†®ùO¯Xsa­¨Ãïh¾*j Ó:<QL-(!@šSNqJ 2 9áuQ>‘B'°äfªk6A¬}B£¥FJMuO°Ld¶ˆ†¨ŠªõOm˜ tk8¼LÁ[)¬iɸl ˜œ¹±a 6ü¤>< ®´]ùÉïßɇùõW Íojš¦0â˜ZˆãGŽà&"õ‰ñÑ’Aï}>Dtðìô0´‚4¢ê8‹¿qô*h endstream endobj 154 0 obj << /Type /Page /Parent 339 0 R /Resources 157 0 R /Contents 158 0 R /Annots [ 155 0 R 156 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 155 0 obj << /Dest [ 154 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 121 690 137 704 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 156 0 obj << /Dest [ 159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 121 674 137 688 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 157 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT12 295 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 158 0 obj << /Length 2902 /Filter /FlateDecode >> stream H‰¬WÛrÛÈ­}åWôã !â²o–´vy×κBfåŠrAä„,­<ë VUù‡ücrzfp!eeSÙµ«(\fݧ»OŸ¹˜Îçó€$ÍW#éÑÿñ'ˆcwOBŠ’Ðõâ‰Oóíèü²ŽiQë5ªÅèüõLÒºMÜÉ„×,Fãöò0ú(Þ§ÎØw±Vü×äÅÎßç?Žm ¡hâ&!>âÇvÓÖì÷"6ÅW¡1ô/ò&“€Æü'¡›{šÝ3–‘›ˆª3\ún$jzùúŒþöogº¾¨²ÅæŒf‡¬ù‡ª°bŠÅ¹ƒ"-–Î8ÁLjtØ:$Oº2#ÜϯŒ72ÖÞO‡ƒëøn(jXdS÷ŽÄoÑl£ôDµ/̲ÅFÛÿa>’”ÑÈ %à”äGøC¸ñ=bbªÔh5ºÐÙðl6b“¸Ã)òᳪO¸G_„®3ÿÂ6BkÃÄ1Ñ/ɾ³ö'®ƒ@'²Ï äpÅL5û½ÞgKe÷>©”ηItœÄ‰×&‘¯»ù&«©Ö&×l’e¼È˜“çîTP¹¢æPÒ6Í ¬]4Ö|¯1<Õ:Nc uéÔˆïŽ#¨¡‰­‹[¶Àº¨%ƒË·êQëÏRèÊã¨Qcþ`ã¸h©êE•ݨšP”u“æyªq\xf Æm$mÙIÏl˨ìòüòÅ‹cGú䣭¦ƒmGÒ@U­Ò…\uf€ì¡ËÄJÆSú]\qWlÌD X0,µv:`’xàEØ»aÀ8Ü“ 4Ú°r¦®™3A‡ÜØWž½¹N× €á{yü£^ÿgÇÃú7¸m`ú±Y—.™«Òé?Ñ9úðÐMdï³ç÷€ÿ˜Þ¥Ïá-ÝxØR¦ÝÚÂ{+{®ŸèÊûíš ¾Y’QŸÈx­À‹r»UÅò ˜8RŠ´¡lE÷åžÒJQ¡cO¨)5=‚A”aÈæ†ß,Þ½¥™ªîTu~™gªhÎȼl€¯'Òª¡F ŸdÅšÀ¢N…eË®`> Ôx±Ló²P“5×zZk¯6éš./É™Î,ù6X™ÕÙMŽŒ±ÓR¨å.Q)ny Ò +œxfˆëÐVJ.½Y‘ºSãÞ³}üQT÷͆'ƒYeuËw«¬P ¡*´— T\,ì¤*H¥¼8Ëïq0ƒ+kÆ•]z3{ùþ •½Ü¥`wY;ßÞ]ÂÕWX’ãovB Ç&{k¥ô{C+»vËÃìžÓøyæ$H¬ý6çóó6-öiþè¶Uß^`Ê µ¯¯ZΞHrÜΓ®þ{Þk§ˆ†íHüÍ)"eÇû‰•ù~=ÏîëFmÑ¥˜Å1Z´tÆQæÇpöy8“žèR\òlŹ3ž">&¿ã&~:|¦ij|‹ß©ãxŠOø`yPæâ¶¦Ëré0~Ê´ÉujÞTšì²²:a:¤ÛrÝñªP”_@ ,ˆÂÑ­ ú$ÈÝ.vŸJÍ2E;{Õh"c†ã-:ų«Ÿæ<»SfɽµWjyaž=OfŠ0Nòé@²\;cž¬Ì¶ ïey¨ObN“ÄÒÛÙsãŠÆÒ¥m@#ÛôÄÿ(Þ²þJ¸Ý¥(ö_ŸýFž÷_HOˆåùé&^ç*¿K?Ï>FU£—DU¡žé~$Eì~`â/®ððš· a˜\ºD̶šô¾B›j7&¼j*޶¿ãux·0û~æ^’bf—¸-z,VºjékT0W>Ÿèpú¤´ÿߪîä|§ìµJJs#&j©ÀœÌ ñ¬Õœ Œ…ªî™ ô˃/ðC&(c̨#î’èXR?™G{¶¤9d™A×5¨5œjJgâÀ»‰”ꌇšf[ÚçÀ´Ûƒ….é ý•œâ|ñµ¡«‹ÁšL]Ÿc °Š/zü§§úù™Ö·–@]Z2µJÒe ÝÌgHOÓ¾Ÿ‡û«Ír?Óõüæ¢Ìo9Ñ‘Ðý©-é&ÕϘw¥=r”ˆ¼ÁéÈÈþe³ÌžÍÆîUd6l´kVbªå71OñfI‘‚~Z¤˜²ãå 05·Œ(ßv´ô`FÃÔôµ/€°G´Àô¤oÍÀ ø<`ÛÀ]‚åxº;ŠëLOÙ³Ó„ çÀi·† bñX9Ü °ô–ùãì›a÷Ùr¤»¼Gäð>Jø8`t†æM‰¯ìfŒŸtÔ`èç»ãS̤£ÎŽ9ZQoŽGÏóäLŸq«%]B°¡ˆÑà\è`ÏùF óÁ'‚Ç}Ù× NY¡Ë/ESÜì×´Uu®•ÆUñù‘cùaŽsF †³çãhP5fûR¥F«ÑÅ|pê1ká›t'Aì™ô}1Ñ}!ªrÏ+hÎ \²!Y–¦Ò7*ß­ö9áLZi?w%f¾Ó¼U¸±6x@µæ¾Óö²jbeÕu•i›]äè©0¿š ±¶ÍÜÅßeYè¾Ù½æùMêDFZr×ÞÂî}0XZØM[ÔZ­`f½{KªXÃÉ'…úŒfÛ›ó;Ê6®ØÛÏWúé#ëo)´#,ÜùÙFÉÀr<7¥‘èCŒ…ùÕ!†6DA9ÃonͰ¬@9 ?ë=[ L¨è"ùµ~Ò1}‘çåÚh=—®Êâ׆¥!=èº[=j¿k>ÛPQ6¹9á€YgeQ0ßÕaÑ«U…5¬û,wøMü>Ëö´‘Þ€wõ€TiÃÄ K ª÷˜l·à þJg·oÜ'Íû‡ö®ìýëNC/^hR´'-îY'ÔI ‘D~sD ¨©p0¢øPêá VÆèý…:ÓíèÖªM'ÍûOáղ ¥ÇœÄ(X â¿DLëÁ˜P•âßwöa-íÍ<6³»3³ffszXúpÉZw«@ó¶~,|[‚‚/Õ5û_ö¶€Ê•ý9òÈ­Sx™›%ÆŠ Jp8`Á«÷#ØIx.z»C¥U¨ôܹ–,r*Ã]ꇺ ËÌ|SNæ âk¼lŠ„•‘§ÊƒÒê€:<±ÀýÙH7«l‘èC±DAØÿò ýáäކ5z´js v2}rà¥îœ,:¹%Š,Q~«ü+Ô´çŸj¾ÂM¾‹°\EXݱ¥‚MnîaÊ‹:¸tWLÙ†W!œ¦%¥øDC“m)óTMíð endstream endobj 159 0 obj << /Type /Page /Parent 339 0 R /Resources 160 0 R /Contents 161 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 160 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 161 0 obj << /Length 2985 /Filter /FlateDecode >> stream H‰ŒWÛnÛH}×Wô¾5‹")‰"ƒÅ¹o쩪¦(ÉÎ`m@ì&««««Nª~1Œæó‰òÕ|9ðåáI¹^ä…j‡nyc5ß F/›H¥ ËxªIËÁè핯VÍÀs=dÒÁ°Þ ¾èO‰3»½2ô ´ bçùå f±šynb“qdmd}0#U4 EÑTày5¤G¬{uµ/[gèÏÜX¯M“c8vgºQÏß^¨ý׆îX×yº¾PWwyûoSCb áÂÁ”™3Œ1€J¶ˆÍG |ן„3Ìç¯Ä?bkÄ’»»;×»¡n ‘Tí¿e»Æý@7y÷AÄÒ5ë=ø*Wƒ ôáN_gx(LÆ"‹"U›Árð‚£GÃ÷prÔ,ôÜÈF£‚ø,$+¿è?ÏáÔõõkg8ÁãïßÇxìFGg“ Çl¾6ê%4è¹*ÔumÊvžo̵¾vÔrW¦m^•jטL%²E  ¸÷W¦iðíæ­i_½ #Bû «XX—ާ3H¶<«ÛWü”ÙÐFbˆŒÉB6kÒ£j"þB»†š1åë${PŽïé¼Qùf[˜ Ì…i·¦Þ«z—å4w|±O꽫ÞTµJÔªª²^<¡]¨v tÀcC‚ƒ!aoˆE%;¢YW»"S ƒn‹$ÅÞÀ'Y””Ê”ë¤Ä»§b9ÈeýÀèlª†L»=|ÿ° 9ÎÔôšAf”ùžÑ*­Ê%àë|µ«òŸAÝ7,¾/éÄÊÔˆÈíM•-R÷û¦xP¹|QVÀƒÚmU[©$M™x˜^‹Œ]œ#|¯~ºiÍ÷6[<¨,í&m‹ý“|Ì pPf–É®h]õ÷m±[9"™àfº¼ÙTÙ®0ÿ€‘|P:#œ·DäNv&ç âòYeI›4mUU˜[S¸O1îm‰{‡ìàN²M^ª6Y¦áªZ>>ó]^jA>ÄIÛ‰¼ÉÜs'“ˆÑÆ„Ä÷9­Žt¹ûNhkÊ’©;Ež`ù©òÁ¾Hé1Ö?KR^ɲß(mÔ=ý¾w|ýêæý»¿ùEú¹$‰ý.JnHk¤?Ùó>°‚Í®i`Ù>•A«:ãÄUÕ™ýT3J$íaöašF1!òØ ÔNû¶¥ˆ9¶>ìðT¬g~‘/jd±€Ã}ívüXÖœ¸gâäQWcB;M:êì]£º9ó¯´>´ëÝ0ìè_+ûÍêöÜ1þŽKƒ O §O@óºÚ7­Ù¨%Õ篜ált£©)®^¾¾¤:4Ö‰% Á@GâãpÔ˜Õíáé€úáüÂ> .K¾„k¬¯~£Sq¥¡’Þ¨€R}ØXùu†WP,ItD€oík$ž 6rŠÑ{¢ Ë\VfôFÞLôÆ ßÉ£"]ûÖŒ.íš[+É™p`bí.;•?Vp¼//Ê­hó †¼uÒôFç-Êå1çrLÅœT*á!W $7½IªHné¨í@¥r!v4Ȳ…ÛOdÉ×ϼµ Ój³Í‘¢Œ«´HäµüR“ #¬äµ¾[£ÉVkQ8é>#1L)Ë­µ z²sh¢™Î[GÎ…xß¾âHíä‘ÙXèÞx¼z¸vœñcŠ»«ÖeOhùU)z³¤I%Ûƒº`xíø·kÄÑiMŽX?ˆüdYÿ’/:œÉ;S[;Héu ¿ NíËÍÈe§d:Ê^? ögê9ó2´§ßÄa+:•\Þõˆ×š»À™N6ˆå½0ðÞ>ÊÞSÔæªBItÆ©»ÓÓZL£ÎŒ@ÌX:v. ž’»$*É('qÂB:ÃÕ€JF{iPc2ƒ0ÃUs¯Y—Q¤WÈM#)òv. ¯y :5ÞªÛŽíŸj yÛ‘¹|VyËSÔ83±ï#V(v•œ ­¶¶dg>?Ù£„s¹Ožu6ôþI–ååJŒ¥L; %\Lß”Àe²qü 7øed›Ô”*‡+ÄSÑøè:Ú°[‡ëGjÜsèbÛØ¢I®‡—tµKÈ€[ È?PÕ–œÝœW”èŒQÀ™´Sv~Çù‰ç;j6U“–ƒÈO¢69öÐ'¾[ĨۧÎñ¸Y¥ÕâÑb9êÑIŽÄ··ª,ö`£uÒ€{»¼h©ƒÞÚNZš}¾þQÐáH–Yw ÉT}Î8Ë›ö®ŠÉ=tÊ™#P¨L¹xŒ!T"`_çn‚€¤¥2Êœ/¤•XòXóò„®«Ý]å»YQ<È ÚÆí®ÞV²€ &ÕÖ§º¶sh|Ñ×z±kѵ´íD*LÝvWT€æÚqÕ›ŠîS\ÒšÕÖ€Pò[ƒ`ßæuUnà î­Dn´¦. ó=A;![“]`MštS6,/[# d’Çn—<ýèý½vtͼi+±¾]jßÇd–ú¥;â®G€ðÅ´'j:-ÍtHwÃc|{Ñ¢‘ë×wTº ÛmäH‰?ž1"YV”¬3®¢(M¹Ä¢[.ÁÛ£Ú’‘huí%(_a9Å¿ÊâÕBâÿÝ^ÈQ dG@EQ¹›ªú½1Áý³3„›ƒ‡‡â£Yòd ^ž &:u'<¢Ç¤¦a€qo{;öûòð幞0b¦SËPDˆa?xŠx|PÐ`1b|©Dµ£hŽŸ¦17‰ü±ÊŸ3U}´’•©‚€ÐŒ'ú0Q91M`:g—êñ@ljNF¹ØK$ÏŠKwXLÙg.L¶næ‡Ô—BÑ’³³°ï|§ zRN"«ßrº6nÍ~ûDæ÷$ß¡ÞN|v¬•Å!enÚæµEJ1êïÔÆ!ñ@¦Ðuƒ›nŸoHÐ õÏnläîž®~ÒêÑ endstream endobj 162 0 obj << /Type /Page /Parent 339 0 R /Resources 163 0 R /Contents 164 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 163 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 164 0 obj << /Length 2637 /Filter /FlateDecode >> stream H‰¬WÙ’ÛÆ}çW´òÔHlÄ¢ÈS5²dG¶d«<|pEr¹š`“D ‡yté ̯ð?ú!wi,ÄЉ"—‡@£—»œ{îé—óÉÍ| OÌWÏ.ü?a’8nâF"N#ÇOÜ@Ì·“›/ëDd5ÍqE•“›¯ï=±®'®ãº8'›ØíãqòA¾W–8¡\küõ¥\ë§ù7“”6HEì:i‡‰Y´åõ~Œ[áSÄý&|× …?©XœÄý©l,Û‹TntÃcàIJw_OÅ?~·ìÈ ä>Ï6SqÌ›ë=̘Áä‚B©Ê¥e§ð[’Eä6¹ä{ŽF1¼Ï_±5^BÖ°%Çãѱ'’5ìˆ[,þ–Í|ô|Yçíž–mhÿ×ó‰'r1ñ#Âé‰ †//ТDìõd5yIÙHÆÙhãG®“˜dôI ˆÏÐÆòõ£ÚZ!8¿+ôs:¹Ï®+lð-@¿È-^ñbWÖyùó¶Z }kÅÎL~‰éŠåýßï~xoAdgòÆÍ—A˜Ã>ªÈÎbMÓµ.Th'I²°ƒÔŸá„Df‹À[.¼¿À”@¾¸cy®„£Œy¾q7t Åä1=µNGiÜ!ÐE›eä„ÖüŸ¸42K(jS&…ùf¶uþ Òéúœ`—,²€ÆÁ‚©²ÐâGÄJ¼³ìaûÖ²CÁBˆódfÙ Wå*_öªÉ«rê§©‹à! h…×W‹‡ íDÔb{¨±ÐBeMþ ½ª3ñã»·".Vy¡t{b9ßäµÈT‰{,«R‹Uµ§õµ®k\EpCZe±Tª›j_w ¶ÕÅÉo{è]Š]‹¦‡vÌW+m÷gú}|½¶xÙ±r¯ËFìØ½º3ËDl☺´}ÇŸõµ˜¶›ãnþogÙ3ÊɃ)¡À¡L´ˆ÷»Bn6X Ûén2,|CcSñ¢¶" $*̯hN;ýÅü²¶xÓ±ÔÛªµä9°w:¦ÚÁ%ä3Ì ¾,~òv`Ùn»ß@´–¢ÈÁ¿ý‰‚pq,XœºãCéL >&t؈—S4åzÒâÞå˜]~iaÉ!m†²M™VeMÃS¬@f³1¬eÌ‚´Ðw`°íhkIéå1³/Ò2UÔdNg(¢"/?ÁTêûá·2:Ô%ø ¯â™‹ÞnÑðïË‚H UÔÌÏD™–8T“"€›² ¤Á¦…Í‘×t(¥µƒc _}+<¦y+ڶƒ±øúýµÀJ‰å#Æ+™^BÝÏdw6MÕc,üAjê!6r];â3's~¦Ó@C• { š®D£,ÔE*/Ô‚sY58»¯L\ïmQŽÃÎÁî4œgŒbˆÙ&ž3Œ¸ƒ¯àØ|cFÆîuºlæÌÂ7‡ñ@”½ÿ_*¿¢xZ,5’¦EH`ujDÕŠÈè1mj°ë6 ¹§|óÝ›.((b‰¡Ù]tqÃö1´þ÷ô Òv™¯,Ô$>’¦Ã`ã8qãè;ŠÞŠiA+ Z*+~Ûª2ÓDŒü®±Ö")Ê ëüAa‡/žä¿¦=™…ü»Ac¡ HäQƒ ’¥)%™©Hþ$œÄ ãaø¹‡o$Ÿôó«­Xå4¶¢‹\4Ó6][$¯5_-@Úèºüµ!Q¢X·X¬Âº²ÉWÀ&.ÿÏbØî£9”d7†’C |D¦¦d ¥ŸŠ'¸©dšåÿR)‰¼9Ž4DU)‡>¡ýâüÝÝ;}Í]ö,ˆsR¦>O²ÊæªÇ· ÷³¨}°Æni †§âÈ,˜Rî!#„&ã ˆ2b{"¶J‚$ `%³øLM€.µ~‡âÏgÆ^Bš=|¢ÙaE$['dyÔ•¾áÜP²Vâ!ƒœ­GŲAC³)a<$ÊŽä`™Ù‰_øonqýYêx³º„>Ðs4"É÷RVLHXÿ›D÷Éb*òFó¢ LŽßíÑÕ’m%0ÞRÍ€8j)©,œ­¾¡ã†Ôþù)Á…ÆŸEðŠª}‹Øo¯ƒ‘33WÁȬw¢(ŠïPIüÍì íþ õD0¾ò¾£œ¾­ÌÜâ5Ðâ͸ÅÛ1ª•ê üîh ´%j8£ò£ÚoüÞ”šk\¹Þ€]g x ­ÒHqÓ\/¥‹ùF92í ’rÌA "ÖVUQTGô j{²'×àR*ÈvÞª|~­çsÁÞÝNpDÚVbÍ'¼¯'G¢ù_/ÚÀ`Þ{Ž7˜žM5ñˉi\|Fr–Eq¿üFÑŒÍpêA;9‹U§Ñ³“xKCÔ0â£e*C%ĬÁðþh™Ý ¼Rb«:üQo0FÁñ°Ž×S$c¨­t¥ Ÿ•¢[­ÙøÙb±8C°8Aï¯ê ¨£Îʈ­üE)õ+й§! §¥²•mH>âÉ–³RHVgõ/`í¤@s¡€ðØ> endobj 166 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 167 0 obj << /Length 1813 /Filter /FlateDecode >> stream H‰”WÛŽÛF}×WT’—æfH³yç 00{}Iì5v#XO`PdK¢—""5òì³ÿÀ_‘܇=ÕÝ”(e²Ø…‘MV×­O*þ8Ÿ=™Ï#’4_Îd@>~¸DYæù™ŸPš'^ù!Í7³'×}Fe¯e|êËvöäŤU?ó=ßg™r掷ûÙñ®pÜЋÄJñ5Jç·ùëY®ä”ú^žÀH˜ÙM³?HYß%FÑïø~D._rZ<ÐÍC;8®L½\¬U_ã6ôRÑÓÕ‹ úÇ¿7ñB±­ËõÝìëá_j ‰Â‘(ÚÊqsÜ@¥öH‡­C ¤'£$ÅzþÌx#3íñd¿ß{Nè%¢‡FVõàHü·Ã1Ê@ôõøÂˆ•k­ÿù|&©¦YH¤SR˜âBX„±GmÕl9ûq>9ƒ1;iâ{™=‚cêµgÁ!å|Ëþ=ÿ\lîuIs‡ã]Ã»X(Zl ª«•¢¡£×z…Ó ðöÞÉ!YŒ~j³’ÒO„ÈãÄû^òß<ŒR29@y8@¾c¿æœŸ˜1ðºà›faíb ºkxŠÝб’ ·6ë–ìMï„‚ìÞ9æÓ³:?xÙ—>ãT Öb·¤~WšÅÚîÍö»õæ]?ØVÃ%Ô :z>ʵƒµdíÒ²ÛÒp»1þ>3J~¢~ôk qÜìúvuiq‰ fìéBJ&Ðûá®Ù­êö㦫vzúúí«onžýôñSÁŠ¢ZüðäDÄI=)žj½ó¿ü`^* ž!ܽ¢54Jÿð¤ Öê:\aµãsˆß—EÓàŠµªè‹ÔÛWãUMó•ökT ¡ ‰œ .©±i¬ {¥ZÈØ‡\àå-ü³ÃÝ"¬“ t+öV›öiT;¦%Œ)”ò²4!×-]ÿý­C k2‚Iv£HLa¤â^GÎ!fbŸ‘ÂÕEÍ%²p+ì ÷P¦Yk-q&'`]C]št5…ynþéËq¯ñà«1áM¢OàŽ·ºÒ·[À„F°Ü4@JtØm[U]P½€\\ÿ|usóîjþÒ™š4&$,˜l8vi; •{fôÀ¹¨Û²ÙUœÚZÕŒ–L¨rhGÁnáXöªiL˜.DÁa§è‰¦bcê [¹z‹–”![ZBs(:pm&¶NÌ%SêÒˆEa¤Íÿ–(€’b /×—··Ÿ¬û uªºQfÇWC"œV2\ \ó¶Þ×lvCÞh¹ûÊuÝ*F‡1Ó8üÏÉ)†¡Ð+×ÈMÙñv÷1à=’ëiòÿ7s}`ê2Ñç\!¶Ž˜x{ 'qÂlL³RT‹ßN NïVÍOÏ ÂsøA¼ýÛXÏ™Ò/x´ð ½8: Æ¡Ör¼¡÷’—y¿jÖhlÏÔ¶µ%paÇX ÄžlÙµ-2t|‰3L6I“¢Þt[&"`«kùÀÑ4I\tÔãŠ4Ÿ ¼$Àuñ¤\ŽñHÎ×EZÕNº°êÖ¢77èM5z‹7÷å§Uâ«Ä·Ur§QŽLÝå?‘,tgp~kÈ´0}s£tç¬êåRmU;9\ꑹºkû Zw{u¯ts¥÷o¨»ÓÏ©Ø¶î ¨àYî1ÆL>ÙddIZÄ£‘€¢ŠŠM×®4àAcGÚ íÇèfÇåˆÜÏÔè”~£;¶D=º#×GbñPÃnõy@óØ™·ÌÎÛ~ÐŒùH{$¿½î³> endobj 169 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 170 0 obj << /Length 1633 /Filter /FlateDecode >> stream H‰ìWÛrÛ6}×WlŸvB„7ñ’7ËŠ]§vš©5I[;£HHfJ‘* YQŸû™ñ?ôûÐÅ…"ãÈÎ¥M§©=#övv±‹M&“\˜Ì®þãÄ1ub'„( ©;>L–ƒG‡M i£Î8ФåàÑñ¹ ‹fàPÇ‘gÒÝN7ƒ òœY¶O²àrôøžõjòt( DMBâdžh©é½H²’³P3ú<Ç À–C³-œoKaÙnDrÅ›§>HÇá§?,;¤>©óôê!œorñ+¯ñÄ +3ËNp‚,•FÊle’çR7#\OÆZ7VÚhM6› µ|’9JV[ËÅßR\¡®Gš¼ÝÐÇÒ+ÅÿÉdàB/tNüÀ…ïÔ(†š惑ò†g¼P´Yi¦f-Zdž«s…#•$! ­ÉkÉ$4Lh¶Ö0{F€C}üÓ{Êm^çÁÀx°X/òrzRZ uɼ‚U]-$–¾ز£Gée ÿR™º/œvª»® +­ú.f.ȬE^äb«ø×l óªÁkH“¼\ÀJ)Ë*[j ò2ã+Ž?¥(¶«o+V ¨æ€óñ·N‚+Öu©¶¥wˆœU–ƒþYrãýîI$.È5¯›¼*£rÉ;Ÿç)òS^"lV­0¥#.yù¸åâQo¨¹AÉs ¡,¤ 2"ië*u¹µ vÍò‚Í ÞwØ¡{äì÷û¸3Xïø*Z_=’wd쬽_†ÄNŠhƒî^GÃØÈ¸¯x¾C£°W¼zåÒÓ öœŸà{S¾×Oøo/ž>;ù óýUÉfÐl›m™¾z{+ÿ^B1ýãÓ⓲€õ5Œÿñìß5ÕF鯲ÿz=Øg/šû¹f©äÿ‰ãvàßU:¤Zj2«ólÁß-OÑ5û”þ+yÿôd´ÿnÞ›÷G®ßÏûÁжy-¸#é7ë.¬_¾o ±wò•{K¡»Þ,ïì߯Ÿåâ.ÞébéE53©F/ÎÔã uÅÒŸÙ‚ïwÍ]þîÇ>îclRþ¯¶ÿ¢jº£ø WÛàkÜ®¶Áa8ú˜jë: V¶¶Ë•½íº¶=dEÉ D . ©–¼ímã–!bÝÚªB膪š™,‡Ÿ­ª¡“-!¶‚õRÖÙçæÒÄ„Nˈ&š¥ªùnWþ]É’À%Ùäâ *uq¸ÉT yƒ7X^rÄÛ—b;+õµ=G¶y»ÞS1K:¾‰âËÊ-d˜2°šÝ²2À§VhWçM‰“­%´eMÓí˲_9“À@… ªqÅJüá®ëš—¢å&õì>HÜЩÚ\¸¹¾´¨ÌFð“HÇhç€xç€XË9B>§µGcR®ßX2í鉼&8dpf>¤rðÉwÒ5!9×d?Xv@à7ù{j¹d<ÅŠô½e‡¸u€ñ Yý¨™L%ט<7›“oÞ*Ë5Z3ãZ4f" UNëU™­ZFžR,l3ƒ9Ð4:3·Žv_†šéz!Eï$tW® „  ãš"ŸÕ¬Þ‚nK^2Ú>ÿk! endstream endobj 171 0 obj << /Type /Page /Parent 340 0 R /Resources 172 0 R /Contents 173 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 172 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 173 0 obj << /Length 1979 /Filter /FlateDecode >> stream H‰ÔWÍnÛF¾ë)íeY˜k.ÿ‰4;Ü&…+EQ¥0hj%±¥H•¤¢¨Eo~ƒ¬IÚ\§"¯Ó$ÎÎЀ-‰ÑTÒt¹ÊÄ6ˆ)ù2»b2™ZJï9ǵ KƒÛøT¢„(‹8# ?Sw¬c¼³3~›>Cd§W©QÈSt ”ääÞàò e†\ÅwOAŠy¥$su•&{tÉñ1F¿;aÁà®bÈD&¿â˜2‘ v0~릑‡‹"ÏERÀœ¾’Q¾ý$1F —2M†Û 8ý„qñ`PȘ Ú>U‘‰Õ»äò øãRõ½ƒÜi!·™í5FZaKša ¹'!G=Ót6¥ÈÛ,ž­Uå À×ÚJ¼ùDd¹xs)®èî®1z3ˆÚÝm]®“šlÒ,SÎgY‘Ä5z㨠tz0CZŽçšã M¨XpSf‚C§âùZ2†ŒªK/¿¹É²û8ùs—Ó ~˜(eûr‘£,“Iä+{ js!¦ø X`O§2Û8Àëø½UŸ_qEGaC a—?}ÛÚ7-ïK§œÓÓ$‹« ù¶0Oþã6‡y¡Í5ŸÞ”½ñRïÒDlê-8WA'¹ùfŸR#WîÂkCÁÒLÀª~D91Íç}Ý.ãA¤7Lèe–}/?/ èsO”¦7C•V#í‹j›'I–B.ßÕ¢ªÙ4Ë¾è ‡ìðœ@ŸÊ¥g}—Lš? TŽ;ÁžWUÇ ÝêZ ¹s¿žß©²é©÷][kg^$™–NŸ÷M€ CÞ9Ó”ê\l†z»{ëõ™çZ/}Oß§Bßïüi®®Óxµzº«ëÏåêQ½G]•YÓw¶ð„žŸ«cLàø«Îægÿì:¶¦ó”Údˆâ À‚¹^®Š²îá1Ht¾BÒ{ãç~ºxMèj}ŸAÌ¥Ó:þr->ïæÑ“̦¢:$@Ç·ÛWeY”Ç šP}Œé (^3÷:Y ÆÀõu½ÒNêÓiqèŒ8Á4¾xy6iêïVÃ;ËýãT¢bu*ü'ÐúÙ^‰i »8=îjuìSZÀ=…Opä´È›ò„È€>·;æeBãK䤫,žW*“° 1Ʀk³(ôxÿmâ7Ø>žøú³¤›úòý#õßÍø ¦|?=nt8´0ÊäÆN£0èT ÿÔSÚљʉ µ´:3Õ°+{ý”œ“T­ n§ÈŽA¶ë»¦1¤?&Do¡k eïŠÝ.rD¡²¹[híEVlp4òeŠ7‹B·azÆrTß«†—\KèL1Ol×›Ž[1¹Ò÷ÝÌ—/´¹j½Õ—Ýhr§7Ë>V½dç=-r¥ûÚÀ–_ά7u¨#ÂáôI¦ãA?n?ÒiöëGµÃ’éQÇÑÜÔÛ9õÇþAÞæž®¿Öª6gÇ Ý<.E½(¦j½*‹º¨·+ý&ÀTM~Õ0Ñys@·/dgÕamö¹H©×»týñí›»+˜öª‰û,€®©ÛèAú¼Ï„ÿÕÁ¨)û©Í{ ‡ü,ƒ·'ÇÕe¹€ÙV-ê]<ã²ZÀì¤RNæÑ djÖ zº›}÷‚¸Ež×døÿ&(úhœ] häÈa"“º–3ì³w1|´ßxTo÷èÖ§ «Óùp쵨/5ó\%€œuS¤˜Cà‡D5]í‚É#XÜëˆìWÌúêæ…6?H?Ÿœf œB€Úýì¨Õ-1ô(¯^Ccv¼ý0¤Îöa[›úÕn]NT¡é=LafÄ Òía:ýyø”Úƒ«e¸nJ´.¯ÏнþUd¶ endstream endobj 174 0 obj << /Type /Page /Parent 340 0 R /Resources 175 0 R /Contents 176 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 175 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 176 0 obj << /Length 2951 /Filter /FlateDecode >> stream H‰ŒWÛnÛÊ}×WÌãh’¢D*h Äqšäœcç VŒ ÇE0"ÇÒœðV^¬¨Ïù‚ã¯è?ö¡kÏ EZrƒÆ@ÄËpϾ¬½öšËõäb½™ÏÖ?`þðƱëÅÞ’E«¥ÄÞœ­óÉÅ›&fI£×x¬IŠÉÅ»[Ÿm›‰çz­I&³þr?ùÿ*œÙÜ ùVÒoÀÙ›Gøa¸™Œ<ŠY-'“K]ÀV#6ÕˆyŠæðÙ&j(ÂlÈ>\gý;ÙXZ&O¿döµï¹sü³ ÈÄb(`d¢}³ÅV²÷ªiK¤p±@’: ?tQ퟾ê]\8ƒ‹}Þà—☻\öYþ‘c³Á³1²Œc kT‘HvKÕõ\Ÿ_9³(BîÞV€ÓñùªÍ}ª}À]ØqÄKÈ?‚â,Cí¼²cQùײfI×8 ìÔ:ö)sBÍ14,¹HªŠ!é¿‹G‡Ê«éY~P™l\¶ÆjCrý “ÅVÒ‰89¸¯UÛÊ‚ÝȾð±ÅÚ/ãZ0jö´Ü{Q£‘aE—odMñÐë‚khèû³µ³»\\aŸ!ºkýó‰:cÉo×yÉÙÍG{h'šRvÏ™ü–HéÁ¡ù€Ô‚¬í¾îÞ¥îËÐt¯~—Jó¢=|^ÀÖ¦SYjCÓ‹¦hn®xâÌÙ1óBšÛÊÞ™ÐäÍ‹]qÞ äX¦¡)Ó²TmÏuƒÅ‚ŠA¯)…C¦Ù½ãžÃ:À–ûAÀŸ*9mz¦=\v°?Lpßòl_•©ö@ù¤–}ÔˆÑKSC¹·Oàœ(Ð|ŽòäÔ‚ð óÒÐURöŸë<<˜T…˜g‡)Û2mb‰®`e–âc‹j¸>@fÔµ¦÷Yâ,‰E(/вif½ ¦²ÙC¥"Ò™÷Ëk‘ˉÍ0øbœ¢Ô=…Gòž)´×CW$šwé}.g§Õåñäjwe ®z_î%¡«iVš›#éaˆMÙµ ƒæXñ{ ¿}e˜–ȶ$¹ÁÛžøY¿ÜOçä“X¾¸`I¦Ñþ~Ì-S&Ý­Ëî0¹\‡4“I ƒBuíØ_ê$ †ì=Œf"ê…)uÌÏúîÂÕ+׊Ùë4U”TêβË‘„CÇX 7Ñ>`Ñ{®óûu™v™üòFTB#Yé8´(õ¹Yû„4€W²–«Bå]sÿìT |ØŒøä<&¾Ü94šÍl÷{s5UUtgEø_p(s`.ä­Jô/‚f[•†UúEáx`³ºØNz˜ÚŦë!—!¤ž÷<¸i,­ŽRÛÀ‚+Í0ö“¸ÿÄ FBÒØ>1ëÝŒìúG»GZÓ€ZSi×–%õµžÃðÌ…)©¡¶™»qÚ€>4=—ü+FAdFAà­"Ta}O'‚O†Ð*ˆç½5çr…gA‘èý’¯wzªabKÿ™-ØIQbœ&~М6ß³¦«ª’NPäÒÖ]B*‘D‰št(ÀÇ3~?ËC¡«ÈD˾›x1¾¤Q)#nbîîž0‡¨¾së&ó“ì”M[†Ñ·56´@—ßJ0( Q“_†¢U]û"WŠÂ¬Ë!BŠ犲Ì$†»ÈԶЧ¡ª.¡˜1 iõƒú&S÷´e€ÿ™Æé›ëJfÝ—Y¹9•:Q4*ä¹ì"<ÄÇ èèÞG<Î$©‘“?çÄ* ˜hrøò——F^ÙP-dG.kž7¹!0+[n¡g¤íJBš´øòšî—œŽyèr¡¤ÕQ>=ÃØbâ9;¢ëçºþf›%Eá´?œä:¯5¿¦ŠK2D¯8+ªªË­:–\y>ûüñÉ 1Ñ‘Êç&(¢¸VægÇ«E4"O]¢È ¯t¨˜óö(j%€•¦WÆMR«Jf[ù­¥’áTxÐ@" xí~#0Àáÿ¥1ž.ñ£ò*3Š‚Ð«ÓAÍ\Õ jPþ‚D?Ã06 Æ€øPh]EÐÑ…´Óµ¨ôÓ¤W|ûPj<œ¦oé†cqJHæÂ)78Ú"4+tZÔŒq?µê×0Å–6z² îFÑùh¯É‚x„×§*­¼6„R}pZÜCæO§iÐn>ÏÂ|” ˜¬è€#~:kçTµ!ÈQ”C˜qÑ!msÔëZµ°Ç´:ŸWZÅÑd!£†Ë)1O œ„*Ì;,Á3Ž1à$ª`qœ³Á±±_†=ΖmÌ@ÉE{þåjÔ̧€ä®Ë>´¦77Z®Í¨1'ªÿœì‰ô3×T0=¯š6½mGb#ä–*J fÁ­5UµU¤³äÑåò¸êãµ6ûš]Ý2¬s‡I~‚}Ñ·=w àû¨!$£9î:D~EŽãîoæ ¹¼ÌÀÆæÁñ„÷€ïn¾.s:zxîL5µíwÖ®dßožÌ£Þ€Q(¢5J‡`h›Ž³±ôüñ×åTf¹aqk|J9ÇÆè3÷óùÆà€~"e¬7ì¿WÁn‚@¼û׋‘·%išÔP{o¹Zׄ°¡Øñ‹;ïí“]*UO ºÀ¾Ý™73‡°ª}-sÉ o'ú±§Ï¾ï*·WÄ40mê­+Ú.+ºâÕÛ¡ š¹ˆgüáß_â”ò <ÍÛ«‹v“©ÈÄŒ“Ëɤ§á<]¦{p£uoÒr¾ØÚæ‘Ï8á#J•Ìþh|â½8£¿îô,’9 žd‚$Hÿb|ec|›~[G—|ÕK<»Z:ÌÍ‹íÀ­²U^ÖŽzgržêk–E›{bLje¡8ŠÄ Æ¥µð §Êé–ÿ½e|—ñÛ1¡¬!mHòãÏ ÁKÉMY!ÁÃG|¯ú_Ÿƒr7ëCU ±÷æØ#¶¯Tz—.©ÆÌu›])> endobj 178 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 292 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 179 0 obj << /Length 2191 /Filter /FlateDecode >> stream H‰”WÛnãº}÷Wð‘*bî—tN€ÄÉÉÉÜ0hœÁ “ÂP,ÚVG‘\IŽã>û š¯è?ö¡k“”%+9=è SEnî½ÖÚKÓÑ»éÔc6›.F¶Ã,üÇE¦Y ãÀt"ËeÓÇÑ»I±y-çX¬ž£w×·6[Ö#Ë´,š3ÛávôƒMŒ±kz|)è×áÌõ¿M?Œb¹@ÌBËŒlâFú¥Gõ¾ÒR4 ÔBÿfŽeylL?1{رÛ]Ñc;4c¾u†¡k†¼fç×'ì¯ÿ1Æéò*›¯NØí6kþ)*Ìð197°Ç“"5Æ1XRF$-䨦í!®§—*;’ѨH¶Û­i¸fÀk¬HKí ‹f…3Ú¯³öš6_Éõ¯¦#›elä6Òi37ÄÃ…ë0Š(b•-FÓ^ Úì„^ˆi*=]êežÃ.塊ïòÂð±ùõìë§»kc!7†‡Ü|Aœ!Ÿ}ÿþýÔ;e!¸sVËÙÝ1#¾N*Lu8U7‚-òd©gìÔ uÑf‰Gvϑܳ9U=¼7äS¶(Õb ™aë|³Ì –Š‡Í’ååÒˆLŸ/‘(üdÅR¦È¶M$·pt¤þw µJjö DÁ²¢©Êt3©É.²†P‰ª¢ˆI%°Ñ"+DÊ Û¢Z#¹µ¨ž0Uî4Ö[!NŸ¶BÖ®.î®gWÏe“Í‘û,¿RÖnX ä'i°*¶.l@HQ°qc‰”£%g“$Ïéß{T‹MÛÕÓétq{P›†tPyšÁ&c;2C™"Wo4k7`àh¯ÈŒmµ@©ž´ :8¡ÛeB¥Ú¦uð[Q×YYÌ>cµ/QÁ6½0¤¡;ƒÝËÖÅ@>ônò”°²Èw÷Æ)±Ã±øW°÷+õøQ4B Ùþ¶Q#àà ôÌmúŠªóUR(duI ²ÿvþƒx?ë­ öÍ ¬ű\7¤uOèm¨ÜJ¬nÔãd)X¹0 IÉ9['ê™ú»%N¸\â<ä){,S¡ž˜mž­«ž õ’´–£–Ù~蛑×2ûPLhƒ.S ß7ƒ •$Îô3½¶eºø×“+ÒL%žØI–a‚T-EÍ꬘ vKRHç¹4Æa~Ý¥JAµù7’F›Û$•.7]ÓÀðµDù.rÜä!-™?1ŸPº@§<Hæ?HBZ₎÷A¥#¹¶G6EÂ]ô6W t‚Ÿl±)æ À[K9(PÚMM€z߬²zrqÆÀj[Æàò8ràùÐZy"Z=zÝ“dê†jÐë–òØäaܑ∕P|j6UDAmøXÉ‘±OozËëH¥«Ip‹I£Ô¬%aŽjʦ €ÍWRìÑŠè‚©ŸRÞËŸ„¾›°µz³|È¡åRÉ7êeêC$~¢%K#&åW³Ì,H½:)‘Åó{0¸zNeGXçâT½ú«­ÅPûÇv(é(Cä\‡¥Ôh½yȳ9:»eñ"i²'¡ÆOe–ªÑ%u—Ë‹{®.3r4P%?QÐ’9N¦Ïzʽñç?Ä8Ùé×VîÿŒz"»¨”nr±_'Yž5ÈÓ1ÊÑõú¢ïw(÷UŽ×6ŒøžšcÈÏ/?ß|™Ý‹òÊsh›Ö@½Ã³TTÐ> û„e KÒTÝ—2†‡E“-2Àƒ‚pÉoCëµ^ï±TÎɪ/éÛ Éã{ˆÎöJ}ÆXҨΚ>fÅ¿¤$ï'Jr¥“€ƒh ›ü‚˜”E#ž›—!V†-XQÌéÁå×,o„²•A>aBL))-ì–|äóg2]¸Ñ 2 öZ“’£CsÓ™öãÖ"{dÃ:Ö›õº$é xE].“ò§9ÿü‰‰íO«a·—Ù“¨¨7²³_Ø7t~†&â×òb,C8¢C…b"5 ’åð9%·r‘‚ùŠw`kN )ZÈ üŽTÙçköÚ‚ ·¸^ïЯ͡Öȟߤfø\ὂikez~ Kg,«¥¦Ê”Q²NàŽ«›j3‡¬)ÿ5&$+;W7Tw^d¤Õ«}tÏÒ‡d ü.ÌÕ‹©V9F‹|ÕéVqÔñînØù:;E‹Àó¦WSÿÿ®©G5ù«Þwp©"YF«ŽÛÏó!ÅGæþA»“rL±âPP2Q-ôîC[“üÔŠ@î$VÌ‹¹²/.?x]4• ßpÕ—I“ÔMYµ|Þ<1ÖóHVdy’¼×U÷zÃÿ†Ý‘œ¸GåóÚ ñQì@ƒÚ÷Ò`Ç?´ ~a+Cò;!jEüI@Q|²˜HÉªæ¨æ ùÉÏ“ôtêõ-Ü´¶þ2Gx´{¼ÔÄ|ŸÚòK'À—B?£PèSOS³Hsj“™¬EÔÎLR˜FUå`߃Îz'àÇ‹RÒÏL¦nª7˜úÙÔˆ[ i í5@Ýëîñ;'|HevùÖUé~ˆõ7Eú¨§c)4'NòÝÄõÕYÁ^£ ƒŠ#”¾0¿ao½8ˆQÓ Ið¸6+t¦BlY$myÛæÔPyeg r,Ú±=>†h…™Aµ›LbÌêï„é&Ù&å’—âÅÔ6J:|rNòûÔ*;àtn†ãè£ „;’O™0.þ±Éž’MùX ÚQ¶s[­j÷[—RX³[ÃÆ/¤¢Å×p6äÚ-ÞIo¢å·PÎàTu 8Î 8P§Ÿz#:s(Ùùy*Ä'ÜP÷MÒ#æQË¥$½e,SÎ ›ëû~ÀÓ¡ÛÑ_«³Iûp” ôÌžˆ¼!T/ÁTxÔÕç{ ç¤H5½âèÍ*í‡EòüUînd\€ô°Faü?ÜD/ª»’ì[WÓÑ¿FÆ: endstream endobj 180 0 obj << /Type /Page /Parent 340 0 R /Resources 181 0 R /Contents 182 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 181 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 182 0 obj << /Length 2241 /Filter /FlateDecode >> stream H‰ÌWÛnÛH}×W°/Í‹aó®ûGIà{Œ•`ãA“m‰‰H*ŠæÙ_°ùŠùÇyØSÝM]hO²‹}ØMó¢îbÕ©S§ªÏg£g³YH’f÷#铇ÿ¸„iêz©S2‰]?õš­FÏ^¶)å­^ãQ›W£go®%ÍÛ‘çz¯ÉGãþv;ú ÞeÎ8pC1W|õ±óëìo£‰60¡Äs'1>¤vÓÊì÷6Åw±1ô;ùžÒ˜/ºÛÑõ®êœ±L܉X¨¶Ämà&¢¥oÎèï8ãØ DSæ‹3ºÞ–ÝoªÁŠ‹—>Ь*œñ70©=Òaë|éÊ0Nð<›odª½1žl·[× ÜX´°È¦vŽÄߪ[ Fé‹¶ì0Ëò…¶ÿj6’TÒÈ%à”$¸ŸØ£”5ºëlø6¡‹˜µgú®G+‰"7 \‡Txì¤HÜÀ™ýƒÄÖˆÇ}4‚ìoöžàßQ¤ ·ÁŸÓá¾\dÕ\µÔ–U®èšQôÈ©3N7? ¯F )~fT¥Œr \¸­£Šaûhü 3ÍDÃ_N4J¬¡QÜeëòÆÁ‡#/qS¸ ‘qu·™OÏ ù¤)h(Ï–Ë»ÌIDîŒ},ûˆ7xZ.[ÜT´¬çTÕ[êjÂrr¤'T5/+õÏ–ÓÞJé"CcðÀgd´'“ƒSãÔ}¹TT”Ê»åî9=´N„tïì¥Êo ãû øy›; sÏ8ôR77×/€˜Qii5Õ÷ÚÍëéìµk©Šý~´w-:¸×>\e [ñÅÂñð©lùÂ<Þˆ÷Õ*«²¹*fúÅùkå^¾ûåºknœ_i[.—t§hcv¨BÃu_7`ûïš`ÿýðð}KÞ*E‡MP„ÕœcÉVªSùÙ,+»HeGyÉ%›ŠwŽ=Ú•39¼º$“#ãÜ*ûèLص#o‰’o¤ñ†Íäuõ _/ëŠî›zõ é?{ .!c‡ó“RYÁÁ Qîܧâ”ñÞ²´ª4sXf:NE•NN‹`F«¢ÍÚ[mZÇkh HP4Å_Ö `ðž/\;È?SúÁ¼ÚÙ‹!*ºßcHÅF´E_“Š—Œ 0(s̘•\hÄAgÌ©çbG‰w ê¾½qhµi;.tOh~¨Âà4¶õrLJyHƒ”GE¼)³õÚ±dì™…©F0‚ï/ =¸†‘euÑê5´È>! ŽŸõÚ3 Æ¢^q1ê[T$M/õoæ¯6hÍtõ ÆDNÔIÏ+SG‘XÀ>X¨¥šïØà=}‰‹:èŸÍg"aõ 2zéÔéØoŸ\n4 2Z ˆN4àI²K_ì…:ÿT^B¹oeœÛÒ¾UDñq3ÐÖÅ˺ª€è+]×vG¯æÛö¾"EWÌK¤´íëýáÄì8Íj™ŠíÓœ2Lò{Úò[¿¨ZTBˆ>Ðt\Í>T‡;}»â6%uÃ:§wËÍÜŒ#L-d bùãeè½æ¦Û4e|ÒLÏo§öÞÕ[® {û~°Ví»4÷½õÒ/j ž[s¿à➈2·€düg|”‡yJÚyŠÕC @2×SDÈ Ø….^«“Ù]½é  Ðl³LyÈ´|@IH}.ySÇê\vjEÛEÉLßDç@Ái³wJUO’ïq¹lÖEÖ™ŽáÒÌ|…ÄÇøãÒøе˜y]ÜïY¯ýÉæÒf±GM«5uM–y†ê¼9óýjt¿l‰]Ö\¨7B•zD`»ÀªÕ?¬!=ü\©Ïµªå.qã¸ýà’ö³’'2*££¹ðÇ·36÷ŠêsL=…*ë¸Lfìë½Ê@@…ê7*ÛnÖëºa@ïk=Sú¢ƒ :ÕUߦx® âü˜cÅ×NE0¡óñ\äð—™l%JÄsôáÐãO½gªFbÍ9`q4ÊþñÄf¦°üãÏŠù ÝyÿJ“.©LŽq‘{\´ß‚ ž?öPœ¤®k6¹Æ ­©µCaùE?´lsUÙ±'Y}Öí”Û3l¸‹/î©>¥ž–cÚÒë£Bù›º¬ëÅôTcwòuYÌa±àýèp“åÑaSåÚ9Ô.:Ê =BF\1t‰hÔz™!q¨¨ŒP&%kvt1%ðÝNŒŠ‡-íQv`Á»ˆ‘¢9m!¸†Š3¼Ù;Èst£X+Ÿœ“ËÖ¥–­·zÎzùê§Ÿn¹XbÁÝ>€ †zð ð÷ŒJ#qHz‡‚TE?d|#1GmmŠÝ)ž¯U7L‹÷´ /Qàs^^@œ`i¥ªÎLÂ{`ƒs•Û' ÎÎΦ‘éW€iUB ta6ï1l”Ñ}Ô\üM]e¨­6^¾ÝÈϼ«wgÇêo…•¿Œ Ÿð†ãèé1à'ðlÄîé9ñÏ¢~ÂýAÔ?Ãÿ£ãgôo?ý>{Ãã§õ7ËúƒJ‡Î]D €òa(† âÉØ¤ÏC'[OH¹áW9ø½¹C!jÙo0t/»’Vu±Yîe8¿=*Š@æ%Ã$¯ oٗ⎹#üy||RŸ³ÕzÉt–)9/LÃ(²ug]< •ç<Ó•´ÝÿQSöŸ´ï?R>j@‰ÿÕôôɱþ—ýçɳԞ#RZ޼ÍUVㄇßF=»†‹N*~Y`rr‘ï‹—<“úâûïÉæ»‰*˜Í¾;´íÇLEÆGD ¡ÙZ¥S¦HÝÚBq1½ý76FB)rðƒ¡­Y:-ØÞ´%Ž ÷-÷(PM»»q4ÌǬÅQ£|™´zŠâ¹Ò¼==dn~¥{½Ö­éxèF9žŒÕ`‚Xêq¹¶ Œõ˜Oc¹V0Z˜q-¦Ìæñ+°é¯ÇlÐ4%ØÍW³Ñ¿^Ís@ endstream endobj 183 0 obj << /Type /Page /Parent 340 0 R /Resources 184 0 R /Contents 185 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 184 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 185 0 obj << /Length 4410 /Filter /FlateDecode >> stream H‰ÜWÛrÛF­}åWàqF%˜ûÌ£E%.m­«¤äa-EA‘TÔ-´ÿ˜‡t÷ @€okIÆ®08Ó—Ó§Oœ^žêLd§!³þÃE{Ÿ¾°™ 6—¾PÙélðjTùlRÑ7EVMæƒWoNDvY м(ð›É`XßÞÞ³wc>T¹f—%^%Ë”ãÿ9ýç Ð!sE,¢|úÑ,þ^:Ü ïlÜè¿™, ñ²³Çìäq¾âCáòÀ®Êj ·*w¬Ê^¿ÙÏþýÚ\±åtrµŸÜOW¿—KøÂÀÇ×Ðlç*·¬‚q«G.àï|u> ɪiý"~6¹¢ý¿;ˆlš ¤N€K %3´ÈgËrp18 lÈ” ³á›896§@­“0\GŸùœŸþŠ{Ø´Gô£ —Yz—ö/rÿÒ¸…]'ÐGo¸ðàËk>„¸XvÃÁ6ÍŽæ«ryÁCîÙxRfçe5áÞC˜%äyz³š.æä¸Ð9$Žü »ÚëÞ$Wêø‚ýbËÜÚ:Ÿr`¸ö€îttàûÛù„lñˆlqW.輦(£sÁîÉÂWß§í‰7¡<*:†þcÓLH¡q~ËLQ—U®tÐë@kû¼g§`•c'Áúø-–ËÅ2Z?O{ë\JúYPäÒ´)BÜÿGpÊ|ˆîžß^—FËr¼*G HàÇòYmà…o™‘•ýÂ:§šP´¾Ú cG#:гt†ìžæÈ´2gšÌùTòÙÞ ÷‘X×XëlÅÌ€ÙÇK÷ùÐó¬9#™g mÚ·àíZetÀ¤Àã\ U‘œá}Œ2*VuY!DºBÀ)ow pª 8§Ö€SìΨ̱§ß^ƇÓyzš×:y" ¿(„¯©R©5UBæt„µ²u…ö«4½F2ëçÝ.YD oˆ ýN¥8uÉÐYÄ­XÆÐS·œ§V9Z–©®¢Î¦lË”m•²mû³ýkM_¬ ¯JG$[©ì1ë؈Xz† ¦¯+z%ºQkµÅQêÜWµjø|w”M£1õxV•±fªŠlÂ$àh3?Æ>ˆýkÆuÄ%~µ¬d»ÖÚ¼Ð^®ù|¦®=¨Û{Eó%îÝ© ó%¥¤Aߪ‘¬8ÒD¬Ÿjij×çµjç jåuÄ¥$&IÎtzã†~F|´H¬ÐkêÒ×EÖ‚“ExÍÁ¡žxYsáÉOˆJ‚eM”Äþ1«h#’0 ^hŸ’-a߸­BDöTŽÚŠ¥Þžr4N9Wé¶w¼i Ð¯Ïö*âq ¡Í)jÝÖc“>Äí]—¡þ ­5ðÔö·ì)À’'´_xÑQ%èD (,mì4¶¦uFÁVèeqL®Õ_Å•LÂfÛlnÖ@ÜP£kŸÆŠJ®Ó¬)qš"½-Ø[ÄI$—Éøúç1(aAïBÅl“¬l“ìíÒ6r BRTàî–qPfZéÏìQäüóH¬‰Hç«)Ñw`«tšž/ãÇ]E§cKÛ-*£Œ‹n¯¨Û;b2L 2^GWå$Eä·Ãò.>œNÊnk—Ðj^¬µ?/=}˸KN…Ú²¦®Ç<cwtØù"XÝé4íŠô¬6‰ ß_˜6„/$ …!òã‰^Á~HÔRSÎczÞC'À9J¹§¥“Ìk{ó8^Í'‘«ÓäÕ)IK8ß­‚ŒA³mmõ˜t…¥jxÒ›8bvŒºM±ú=ÇE·*]:ëåÆ+ú©i°ošªD*E…éÑ`-vØÜJ‚–aqÉqxné@ êj -õ«€žmàuRvg;×4ÏÖÙ`{BW.¾LÒ­†Œãõ.^H£jv\Õ4¡Ôß„öŸlžëèÒ/¤. w@x»°O“^#¸l—à‚T¦õÔ¹€²;š_DŠ[l[¢"þ&hûV‘¡¢OQYD]AHÕ µv`Ð씡°¿6¶D[ªlÅ9ˆ/L5GП±9ÎF…¤:v)x9qè4»…ùÂɯUZ Â7' U” šL£ðûOQŸ-¤~bê¶ ¥¢±MQÈP=C£uÚ} .eÓT‘U`Ò­(2éS[Åë; Àtપî)³¤Þ|.ñççİ!p2¦_Â|ZôÁÉPØðbd=v58Œ«;"CÀTKTˆƒ‡U'ÇP¤ÖJš¬òv—Ú›Ð䉂d¢ M‰ÆëÛ´¾Œ—)æ#³u¾í£ò¡-ÝÛ V$ßçx°x5‚˜DlÇqµã…`}äÓˆ¿aÝ"[í M«gÖ$Ÿd¿|ÒÚvêŠPÖŒ?U©È–qðS‡Ø ¤”¥/ö16¦k®Ée¡ÛLWøm®ôµ¹PqWéI/eÚZé†È]-ö*(zŠ "©!Ð÷œšÕ‚¸B¢?©Ìi¹¿mõPÁq^PϦ8=Ó /’ÙJ­Í+1¢?ÑÀ‰8G/ˆ£$Î?¤çk%Á­G^tÉÜRõì–Š¥ÖçS•Ó–%G yƒÄ`-;"å‚À‡ï?Ðý[dmЗ‹[zÚ)AжÁû¿OË"•ÎgˆÚE›¿¨m7ƒkuñþOî«`¹mˆÞû>‚'#$HS©žÑ4NfœæÔC‡6ÙV)ei$Ù•ÿ¾ûvAŠhcKjÕ‹a ´À¾}ûžzC4éPò$(XCÈtúÙ†ÛvZ钾ߒaÉÇ• #Cs¿´!’ÏàèLÝÈ—ßBYH§z…³}Gó1“F‚™A“=ˆ'âΡå–L®Ä(±¦J(‘2½À9:ã;Öì¬øyé§gçÓŠ³ƒ(³ž‹ð†‹œJZCô¡‚ è u}ThÛöæ¥4dË÷ÃpÐðSäÔŸ‹ªwåKSffÌe Þ7Lúüý2VŸfÊ+~â<¦ Mâ¶m“FnÚvN1çðywà À¦âθ–I¨³)µÎ½‰œ÷DþÖm˜7aæM¯ið¯ÅQ±à·QgÄÀnÎÇ2®*Q_ÓÈÀ¦,w/—ü‡³¯Îÿ9÷qk²ÙMk5›Õbßg±íž¤iüÓ˜¼¢®/'U]âdÔôú~x£žxtKëÍçÐű"ýÑ«ð¶îA·O'{ ŽFB)ÿ·“ß'·c¾^ÃòŽ3€Ùz–ÒõÖ¶²%èš®<À_Î;GŒ£ª®VÂt`ÃfEóxÀ.¥âø·ìEHRäš4•uq›ìDòÚU(Cê6«j8cŠcõÈB{Ì.ò¤à/¼z±4c›¢¡¨XsÌ4Ø´üëçÜL{Ýa–æÝ¢wÛ„!jlÎÝêe¬‘·¬Ñ`«qŠ~ÁxÇâüTø0§´PE.%¤4R¿™í4¡¤k_G˜èGõ›!ÏŠšÛŽüÛjUÜþÆè:˜°-ë§Ý¸vOø Ï—µÄ¶íùôéz»§{ì^˜‚6B¬¯Í‘¸«"ÈÊŸ›éㅴn7}Ám7"Ϙíl[ï׿šÀ¾.ø>oBrê1¤Äƒ1õÔýÒç®~U÷cð,~Þ¯V™ÝÓ˜no}õ74;“âB/˜œÿùr?‡ gÇ‚‹òÈ59»cJÐM’qŹh2'†2t-Sv™½&µû¢…N+åkHÚÈ@ ãŽj5%ÈÈ!fê¿bÔ=?¬«eØÜ!”Åá¡å÷¾$²†>®Y$ÿ-S'Û'¢3:íQá¤[8éœÀ«Bæ “¹G•aTñ42O¡*K’ýñÒÆWò-o_Ò•V‹kl|`IêÈ( N$¦„hJ6h²™;!=ãpÛ-Ù¯X‘çŽ܈ß«"ô]TIú¨(ëÓ£E#E»´"\µ–Éó¤µ/x™Ö„ Zö1‘¼-ê‹×ÌFX2˜ëȉî£Ôç’dªÎUÕFʪ_2j‰;ñR;­t‰{¢‹;%ÀŽ›èÎ# ΄Ì#¬—,F$ÒäŽ!8*¼¤]AE:†ùiùFÞ?ó¶‘vNUñP}ˆ ÖKQkS\JB…(‘׌xAo92'ý4tõVDïrÚäe®"mY¾QÅEÉ-(Ìó}æ,%R¾O¾ÍãÓÝ/Ç;¹ï67³Y½{"ý=2*^WT aÇоŸCè#Üø?Wüv>æœ[;?K*>2|zHjÈ$ÅšACšíßóvè:½«"ÒDH‘Í#c)×£ÝXìŽêÔYæƒ1:óÁLÇäÁ»#܇L”Ü ¢!OIÖs'Å>œ—åùI}² BB©G‡åɾ Ó¡y{ˆõÊv|Ǥ«e%fi!!êãŠ3À}!§Ð+Ï+n=(v;™8mé{4d÷JÜÜŧ-í¡õuî›OY4˜J;–òz%òïYþ­ÁAÝn4/EÖ ï ‹ºåõÜš{eÀ¶ÅÜaÚìÁeQÀÏ!Ë%ħ…,΃Ö¨ª«UuÅ”@–†9Ñ´¡«CÝû|¤}ôä2—·Ëf-zLƒϨ!í DY´ae ¢ä¨ôdmþ=ôd žß"‚è]Gž=€¼ ´"Ø äIOßßhîŽu#ˆL–󙘵%Wcõùæ[˜©<ÑÙ±EÙJ¯\o@‘)8MJ>ŸG´Z q²u4˜®ýü ªÕÙC³|"ÏK?=óãù´ùr Írjõ†”“zŒt+n~úå‡×1] endstream endobj 186 0 obj << /Type /Page /Parent 340 0 R /Resources 187 0 R /Contents 188 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 187 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 188 0 obj << /Length 4672 /Filter /FlateDecode >> stream H‰ìWÛrÛ8­}ÕWðtY q+™Ò&3•е;U;³ŠÄØÚÈ’J’c;´ÿ¸ÛÝi˜d_bϨvËU&!’  qÎéÓ/ǽã±Êx6þØã"+à.ʹAá “YoÂ2Ÿ÷^o]6ÝÒ;E¶.{/~:áÙé¶W Šß™öúÕíeï7ön’÷å@±Ó¯‚eÒåÿÿµç)€Ïl1ð&‘.~t¾Cá þ‰¢PY/>ûp\/wyŸÛggåv·r`Ù6;úé0ûÇò¾H¶™Oϳ“ËùîK¹74¼¼ÈaÅ&ËYÞ÷p!iE´mڒ஌…ñxVí&¬äòòrËa[ˆˆ¡®sÿ—»3Ø#l;¯„צgÿոdzyÖ†C:y&-\2H‘áŠ\¶){{/á4^‹prò„7Uª,~cB®nΡÀ²¿äãáišÂjëÂFXŸñø¢(¯’] ñû¼¢m@F5¤pFƒ"ü8âD ixòqaÃ×ã³M9Áì[6û9ï‹nâø:\Ž!"$ç,þº< ×ò—U¸¹¬çªZ ¤·&™ÌÓf³ßYµ%Uí¶+Ëtn",êøb«ƒC*¯rH<Û5'Q. }ó©ð Î=›Ó§«eîG‰®tÈ¿ç!`ut}ϤwìÕ£)l ¢?æœð[?þ5W°êM. áóìrH3+ßÒ¦V§CØ–g“ݤ™(¤X~ý(|¡þˆ£8l%A_xº“Ðyz´Îûn Ù¾Öìøl²y×\‘p)’q^­ˆû¸¢m˳SXgÜ4Ï„ÖÅaÓF, ƒ‘Îü0ÄW…¯‡óíš¶ ÙhY c[;Ï9Ì Ø:;)íà(áéFx¤sv•Êa%·ÎD˜%ê%ø)¡Ä0 ˆÊs†pܲ,V&qS¬|ȱܬV‹–D œ’évj€ˆ “Åâõ¼\Ìp{žm»&…Š\c“ÒoÙz}Œz‰_Þuíä± g[¢ø! ŸÎ±ôö1Ç8Pl:¢üx~ùQmE. ðЦÚh%QŠxÃÄ–äXº¯_Ñ`³YmÚ'/„óu¢¦í ІF¹ÿhi€r´¦Ën§©B€˜œ·ç1VÙ{c™ Wa9‡|r¶‚ Þå\á¬9jM™CQó€D(îØV5¶MŠm Øâû¸”! ˆåõ1!㌓¼è€—(ãý©ž‰öÈuì¢/ý °B"¹6¦‰ °;8Њ å–½E¤NÐ~[6,þ>Ù øéÓØ‰ïª|QåcIe@0Yí·±61pZ«oJÑd4‹2„F\/,ÒbŨܴ­¼f-ßCáQÑcdC о٠s…Îê=\Êɬm°”ãþþ%ôKñºqã‰ÅBYâ ùçC–9*åU|[pê60uZÞ<Â[~§šQ -* ¹Jn¸AXÇÙv†cj7 Ç¼p?z¹µ[u•ªlˆ=‚ÑzÛ^œÇ»1i‰+ö´bÍ[¶H A $—{H‚"–Ã÷%96-Í/Áß òwXû’|fõs«ƒî(þ¼´°7´°-Ð:Ihb}¤–tMµÄ©ƒNj€4&8‘i5F{‚ZRI4h¯‘t#ª'Ãæ:e³AjX_ÙáaóX€¹FóU?))®V÷Úä6ÔwZ~´”‚,¥fC½®ª£ gHÛ´0nG‘ÍË]`³D2»®Òcœ±]6EÔš†å É µ1¢aA`$°]ЪAXàŠÂrØ\r_BÍòZ4Kðƒz.ë,Ö {=‡"­È_ˆ¶—¡]Ü?)à:‘Ìì š0¤»L䥦c€®Ð£‘ ¨G„l:±A|S^7×¾Èõ¬ñ]ç7åAS>ú<šÔ'T‡N{ú¤°`áxx¾$ÌY٢ɷý`ÒxBýÖìM¡®ÉR1Pw(Ý·òµ-éCÔfJœ oK4ÈÀß[^šÂ©‰Ú9F¬Oqˆº'q±=Ä :¼…8³Üî½~„*vÊlEûh“¿â¾ánMq¦>aº&è–Ñâ]k»_û;b“ªÙdRÂC‹Eªžy÷~ Ÿ”ÿçåö÷[O ¾ñ> TOï“ k£6aÃHÊ@½Ô×óíÒ£[_Œ/ÄQ ÓXqÊý5w·j Zgoy"’ªjTÓTWM³ƒ„áymïëM{A‰Sbâ ÷‡ ÖÙtµÜæ–ÊþÖB?œ·²ÿ/nâÖöul«ØG7±¼½ãI" &32ý/°YÀ·ŽIž¹Ÿ+ê~EˆÙ+j$[†6´¬ÚQŽÆ*Ò2\Дƒ¾?àO­îô®Mæž­×è}ƒ¾®-è:©nÝ‚…ùeôS‹ ×+bçú_I}Ôu0DžeŸÃóðúŒÙÁAN}U;&À§¼`ï¨1ãUYØÄØ!èŲOèË"Ø¿Fû¥káŠÇ»%Ï=PZvºÌAgËY¶ ájyŠã,¶z¹´2üÿ2¼òé„,AøüKyóã'Û{ÇÓ.,e v¦#ÓÐM@ ì[Sz<¬µ¬ÏÅ-‰Å<$A¼í\¾™O€;§œ'Þ@brÞ""ÉÐ<-W¡ï¨:¢€²û§‹:Ƶ$œÑÿaÇÝä}¨¦ ”yÌó}¡k­Ñ©¯u¡‘ÕU#«©‘ÕÔÈvô <ú•ý;*%C|ŒŒù*Ød³æhˆá¨~…£9Âb"ZÇeõš‘ÇX´Ä£©Ô¤¡ayQ¤3 ODò«0è:-\ù~VR`¡¶.cÙFû¸ —Xr“ÒË-•ÞÖÌP?À´ÐH6Š{E8g*Â)"œ!ÂɹN;Kƒ¹]þó>Òu _ëï{€¯´kÒd@Ãx(äôc(%“®ÅyéÝŒQ<¯#P•DV›…>[–è.sŽHÅ>)Û6Ù2ì÷ ô”Ö#²V Êm] ¢n¹:šN%¸}ÞúótxºVOÔi0’ç ]¬.ürŒáK%û£»†G‘C‡“GrHgö„_‡ø¯ÑS êæéà{A?…_@ª &Õ÷0?œé$¼1‚!g­¹~f6´ðuL[Åö(­êT¼GGoÑ—¢ œc²<µs¢„Ç÷¦w×ÿ»­@¹äbš.0ð{6B€w8Tãìž©?¥9ŠÿßÖ»³ ø¼r­‡jÛÝÈÙ¡Ë…« ›S;»¢Nœ%6,;jJLµ5æÈ¡ïÛUãŤ˜FÊ´p¸•»È¹¸eopã çÇt=#y¬Óã(ejÚš`²éqdð8=ZÿÀ1‹åÃÛšAW‡l˜?%Ѿk´Ä1UZi·³)ÇTä˜L8†ààè޶oÊß䟻¼†‡Oy¥B­ÀJgjE¹œ~r¯t§~â õÕ×°wÇ*â…ò¦:yWXÑvÈuPÏ_ÛúD”{‰œáБÖ^.8‡Ö7rζ9ÇCÒ›”ûS³MFËö3™ÍVŸË7Ç>¦l•3¬·æþüú/ûÕ¶Û¶Dßó|+iDwÉå¥ Ôv #}h‰‰…È’!ÑiүårEÒ²a£FÖ&—K-çrfÎ* W_†Ñ+å¬À_4cÜI_©ê¡§Éˆµ€QNmQå²²dZìž1wL!òàÁ:íéøCbëxÖR,>+$›Œ“ì^Ì”£|ÕR>•sjË<ÃD¢)ç4Œæaµ­e»!Ï@¿Cñ†Qœž±¨DÎ?­WuK&‡ IâiYðŃk â¤ëÑvn¥¦[Â~á.6±VXnÖ_dTÇ´þ*+B¾æ÷ÿªã ›z#{kj0¹;r’‡_Ú 99Ò4õŸqeƒ&<ïß*§±N½,úºàïn6«~úÔ=Á¯„‘‰âÍrk§iÂá§“)àúè/'îËyûå·QIêeÞC£´4OÁ;ÏxZ;ÑBM Ö2 t¶¬È ^ÑÙÒ® |Í‚Ò]7<)Õ¤SB¹©°*™}ößâiÑÅ©hEmÆ® *Õ¡·KpÕ3„nj¡ûz£34fú/ê©>rÞ·KéõPC¡M¤OKÏnPŠ3Ÿ sBqý5x3ìh¨Á<1ìhÚiƒ¸ÆŽP¥A þÏç5õUÑÑT<&ïÁp¦ô1«=c*9ðÚRÝõÉ¥}2n:M³²<ÄÔGk.6R1&HE#Hs •½õÏpùâY¿ ÂL‹03DØCG€X¹)L•ˆÐ…Ê¡!rR=5Ky!%®ñÌf6S*²Uq w9ÔP(hŠao®ü̧û¹C~³–ˆ\huër‚?ªÝàÛ’È››õ¼Yò䬟næ7W0Û$ÒùsªL 0!±Aöö F°"½õçwl»o'PtvU;üõøþñÌûx¨’˜È/€¬Ÿ”Ë ­Ö¦ƒÖsHꑤìudÝ)p¤—–œÓb»<àì(ÁM:Šã7 ½‡›·kCµG—y…9AÕá2•¹»ËR•9KµÐÍÙºI¨è \Mð`·4^…Ä{µv¶`3JžÙЭšåçe½V™wSZ1ºeNU ï܆[7 š²y;2Ç|x·Åe¬p=€Ë[ö—N )G2|‡/ 2s„V[’Ùo=ÜÙe¤ˆ –»€ä~] ²‰Ï–Ù[Õ¢’g׈a)(ü‘&ÕÔW¸$eöhªÃ¬áL3|ÓÍÏ+°¢z!èa6A—NxT ylaÑÄüÙ©%\'ŒTšf{ÃÕá+žp&(¡7[Éõ—¡6(ìŠÑ'7&2ªÀKæØ:X ;®¿†ñ¾ÙÖ4ªñ®±_#ãMæŒs/4¯* Æâ~jï{Ur8‘Éq_8/’V*S?J6ð„Ù1PÔ H/k²6X²ä!-u…Êð§ˆØ.XÈ{WbÀjà—5à¡~é{øÅY6Ýlhz~)xtI#ü^ËÝ"X²«8L ÄÀ9~Þep½ vŠ”ò÷ñ̦{®Qq¼ÝÈuÁ…8Ù§«ä]Ú.·»7cÐôÁ!‹”ÃKÚ«QWK ’²VÒPpzU/úqMÊ\’”¹s4ít÷»º¹Ù®ÑMìP‘l&!+[>5ÍFÁ> endobj 190 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 191 0 obj << /Length 5385 /Filter /FlateDecode >> stream H‰”W[oÛF~ׯ˜·Cï QÒ¢ÛnØêC7)š¢,¶ ©’Tl÷í܇=·¡(Y²³ Îíœ9×ïœy½œ½X.Cå«åzæåÁ>ašº^êÅ*Ébפ^ –_f/}ªŠžÎxª/šÙ‹¯}uÛÏ<×óðL1›ÛáÝì£þ;óÀ õm‰_£U9¿/ÿ9ˈA¦ÏÍb¸$H…è Ó›Yá(fFÿQÆóB5ÇO¦nÔõC38s?q3½)û †›è^}ÿã…ú÷y캫ŠÍ…º¾«†¿ËNDp¸và‚PçÍÊ™g0–$©M*ßõÃ8ùò Kã§$ Krwwç:ë8"«LJÿfØ€Ž¾Ñ}e7øX±!þo—3_UjfbÌé« ‚I`J”ª®œ­g¯É~,îð]PšD£ø„Ì• “íµ÷ÎÃ%!‹ûΉAë÷ô¿D³ÄúíK倀ã|ãø.ÕÇÏ\_—$}¬eÚ:þ»<£Öm§òU¾ÅÉP®h­œ<ÛUôinq±·ÌvDÝê¦TyM'ê¶p@£sÇs‘ ÏVªn‘´Èy^×t¥«–›R‘H™¾¦¥¦ø×/ªä‹ÀïÜÞŒGîHQ–¥®Õž›8yÎô,9Ö†YAEæú‡“ê7À#ÒU¿mûòýã°Æ`ìû©›j1`ã7%º å@à$zheЕ¼W—y/C¡Êo™g^5r¶rä‚9Ö’c_ðªýáÁªÌÀFÈ›¤ñ1ô‘«ÞƒÀ7‡‡Jô 2îªF®ìUÁ¢ä̵AÇðuVÞa×5|¸\© ‹MnYˆ<+%º÷ˆþhÚð gœŒ(p„Kç1ÈSò bšáIÆ!g$…„8ðƒ4±àˆ¯>;òTŒô»%& ®~ãeµû©^X´ ïéá>×»í¶íÀå ºú¤gŽ)+¶ñXlƒÐdS˜'*ç‹Ö™GºÁ?`¡'ï‡cÝCÌ0R-°¸—2› pØœšéï“ív±!UÃ@>H¼`€ø±|€>°Y›l*‚¾×Î?Ö èÕ®.i«?–4qýÀDÂ9éO޳üq- ¡Rø€å1ä–",› Ú³»Q<î†Q„¨8ÙLæ¦áYòg¶åî82ÿÿ.J&»ç%;CþÌöh•ÈSÙ…”Žâc½Nï[™ˆ“d_&0â1‡ŒÔÕ%‚?¡ÀÀz×>’U-ï5*ïÿäa˜A€|ލ4ĺS=žô–¦¥PW|¦*”,@Z9)g\U´ºeî».¯nì…O¢Å¨ilÜ ÕÇbírL”`¡Ò1 B‡© 6¢1ô ýË1‹Œ˜ÖM½Ä¸aø[pCæõ%¤Š<^€néJ¦ã÷Õ(}ló=K¢l’”©Íwϰ¬Š º M©Vù÷!ÈŠi×Ár´Ë+å½LŽdŸËm(|ÇöÎ(˜˜æ0A½H€h38±¾¢2²«aXö´úH°]ù{}BŒ0ߟ(äs›…£T×Àð'  £¡¬÷€eTòÀ»vs…œiÞR¹ª  *v¯´¤Ú5êƒ~Ǥl²×ÉS—t!»áû‘˜•À ]ºÞ‰Kò "þ·,¤PäCßòÊ'·©az²y[³&ŽÁS,U@Ž ÷;ÇGç,¢qÏ9÷@¸ïÓ}éÓÙ:Pžˆlbái^pñÿQ¸?ÇÖ‚†BÆv¶¤+(£¹Ð’ó@ëž„AʈøtrÇ,™½Ð*(Ó–ºô5hA¨;´ÐNÚ¥Äó+%™ÅAVr­lJb8<Ê8N±},Œ‰,I.ÑË ^$±8!ô­Pr¬wD²™Oåma‰-ÌßÛ)’Äÿ‰Ø–-€Ù˜_[Kæ(YÊšc×Ü•ÌEïä¦ru¡dh­xÒvV“؉ö•Y€9¿¦ØØaÐH~JWP0^¬i±R#:Çॊ–xF.™’BûNxÔã ʇ~I˜ì»Ùh,MÒ‹~~K]6šáê7Ä£?+»r îJõÃÛŽ¨£‡_Ë͵€£!HÏÓ2§¶8¥Ú‹À»À·œ±4 ì™{@8ñ`±xæ :Q÷¸m‡;¢I[¤m1jA†¢gÀºhz$úDïxþ¤wß?PL2iÞá`°yÇ`ÇæÚ…”l‚pø_§š÷‘7±ô‚ã·E@å†>öñ1뎃wò<„n f_Êǽ¼gBÚË_¶òt»ax®i=¿‹ ³ìžo˜Ï?³=ÞRÈ ±9A}zæÓïÌ(°G¦Îñ£~óúó"¯¥Y¬¡ÙMôMŽ/0Ìgè©F<òUèçÑWTÀK¯-&‹Ý{0A8FLè>÷R~î¥6bðåG½o‰•ƒwhÿ†²°ïëÏœi´Ÿ¡á¤‹óâG ‡2†† ¬0í@:  ÑÿÁ’©`¿öÝÏ$[$ž ŠXðÔ«3 ¼³±rz‹‚¶žˆÐ„OíÙûBŠ·ó±yfÿÛsÚÛLsŸ#_ðy‰qBõ+º¼èRݵ»*BÕ”!­÷ŠœWêZ¶Vjhí^µ&$œFêZï†Y—”wŽÔØ€š°9–Q¬±4Uë–GP2Ë•ðʉAÏxЈXyQð¨ìéMi D|oRfú'Çp?J) È›5|Dîèh?ØÃy]Ëý”/@šî­íIÑ“ejw"4ïÈÒÊ&…§Çý4¼²,ðÇâ É•uÛ)ÇÐ;vSÑ›·rTÃ>{ùm;pÁcƒÁTöÉ%Ða®d^Éqf5T²_Wó /+…â2ǾžŠ`’XŸ¹í•Ú §.'²–Ћ•²¬ÐÃØ¡á@×oˆ%8ô+³É‰¤Þñ¬TÃFÖGmj¢«[f&–@“Grß½:^³*›5]£|)²ö´ÝÜò.:ì½SñAlBöBAÜGȾ§ÞdpÌ“yR6OBæã$hœ‚IÁDºQ§bíÀ云ìƒ5¶´â¹®|ìq"ªÖ£sm<=—,uδJ«®ñYòM/aü×®J·L€f_žnnãá5ÑÆ|c H|Æ‹•æl½Ø°»wÏú]¯¥ éNÒL=±ðÂýÅMô›¾¤K%\6f‚øè>ñÞm–<M'š%rPít§Fÿ©j¬sªß#zÛ„Ü&ê«Q4í/}«é—Bô5®ÒÜ#J@ÿ)Y/e3+¥ïŠ !¤ô}_ôÖç¾m˜ÙtÛÐxožÄj©û£î˜R‘>¤^®B” i6–­žÃBcqŠhé§ÕgR ãƒ-XÌxš‘8’ÍQ„|bSZ±,gÕ“©n1Ç«Æ>~ãEˆ)%¯@Pè?è’âÂÉfüdT^G,¬"jpÁê+ªÖHÃE>ÇûèŽ :l¾ ¯ÝÝ›ä_Nx ¹{¨ —ž J’ô=öÑÔÀ7”P’9Å-%n…â–‚'9|v|w` l74ô;Lã3V’“òß™[ÜÉ9ÊÞ†GùâÅ… é+&V¶™ÛQYW•┡ò˜‰š°é°­u­BÊ~ŒQeƒó=«ë—õ½ݰöÁêÐȰ\+ƒ2/<äÓB!ŸSXÒÏ$å)™#/”LÅq!Ñ-áè“í:÷wuÅßÙyÅÁa®¬MÅ œ= ¨þÞþm˜‚¡rÊû5î:æžq»uÕJûÜ«ËçKÆQgæ|X"}ó/ÎHM÷8ÎޙŚb®Åë²àRËý×+ޤ‚gÌxÞêξío™‹$þˆ¿·wh™yÏÕ!£%T]Ó;£3O©ôÖ»ªk»­£.íóÞ¿ i±ŽÓÀtÅ“l? ({ñà"þ¦Áuýü›œ[¨ç«]Ó±eÅöàV p[‘ü†káEh$jaþ-9ë†ãeçÖw(@y‘­Tüë³Ø ±‹¢­kZT´ ümE rQ£t«öMÌæ§Îšy ¦–Bºd0mw½r©ú£’«éqSM¦8ø~ÔMÊÿ&ƒ(7¿B˜yBV½I¯#I=†y:ÀPîÍwZS¥c‘@,ü°ÝKì'¼P°K€‚3}F²É(²v±fg¤ñyðU—~³À î)€CA¢jíJ6tΣßðEHÛªÎ=˜`×ÊŽ!QœG©úc^Þ‘u):½iVÂ,ŠóïÑ…¸Ï{cáuÓ›…ôÂõ¼fþW=£¡pWâ@~o¬IKØ;¬¬eÁe1kêJšC÷%¨Ç÷”Ž÷gÕ6ÞÜ[‡ç¶xÑÚ˜’Žl%2eBþ#ä¿„gâ§,6ÞpÆG¨õ³Ymcøw -ËÅ ¶Ô|üª¶Ù¡¯HB?ÏGšóŽÅ=Ô™BýõÝG¸j.óÇ? [ÂÓù?ŸeË(x}×Àr9g¬‡FTèÀ]Ã…äT(7K°³Œ‹á%EKíslÕ­¾ätæÕ• Vúò ^ìÃõa<1±M‰;Æo¼+š-L¨FÅÖñßI€ôš&ÅA#p†Û¦ð¾«yÉeðþúÀ¦|\fY:ÈÑ^Wï¹2–bµg€cž'ƒuZ/GÃû9CôÆ€ú×0†–§'&ÃipõÞgøtĢݣÅñHàŒ—aÄöÕ%Xß¾?°N\gšÅâü%D<¿»ù©HÇ“2r±ô¥'G㳩º{S˜å^˜f’ÔwÄY<—é©Åß—ú}å]ä^J³Tú»Ž/C<@$‰M*‘å‡Ç:&¿¼ÙÉ¡Ñx’²ÅÓ/ßãŹϠJÞltRÂY-b‰h­ŸlÖ›Ž4u!Ä2"žÛâ¹'°RsmE÷P»V“Û“¶/3O’.ªg¬uäÇ(XU*o^õ·° û ý‚¥Ž×Â×tæùíR|3”¨Ï‚ë Wuæ:§RëÔTÜVf ™~ ‘E"?z Ó T‹ŽäHáûT5–¼Á殺<"¡#mà‚ì,©{{äãxáK•ľÙÃãpè ·áÝó9Ä–$lMA¬ iÎ*$7µÕ¥Ôþ°’¦?Þ„FûÔ>en<05ÒÍ·¨½’©\ayOP§FrÁ;ÂUÕ¶{˜”é¼Gó±/}—v51¦™àÚ|¡‡¯-:­Î)Ë{"¸OäyvþT5¤Šžüw_ÂCœ¤·)Šh§´âD‚ ï-—èPRM½éQ’M-Oº­ À^;”(FPGÈä!{“ÚÉ5#ô¹`[p¿2áÜÉf ê*(<;ÙŽ3úÕ·KŽ×·Gi_œÿ—´mÞéõ¼\Xy­ñ¶Ú1Ð+@æÖßô/.ÔŽƒqˆF×–Û²g}UB\d¶^œ0wç•sqv^]z ü¿»m)?Jµ¢}/ì©ViT«ì©VIª{ª•‘]i*l@ª•0 |reãÔ†W6w¥¯^爅M<¹J=ùJ=ù:Xôâ'îÓ iÒ|ú¿'_GÙE”‹åé©bzZŠBnÒÓ…üÄò7Ä~ïT’ýŸÒ. ¿cÖÑÅß—ö€L¶Üã»8%ÿ1v!+ÜdË.¶§4¢zó²à€XÄO‹R—Ä""™gíîgÌ*ý¿\Ú„¹¯îk›1¯½HUÁ×s¯§²÷Lg j–Ú;œõ,¡ò«GìVþÌÐÒBî©©ŸÍôµ¾7íòU¿¤Áb%¨½É ªcÁ½º÷³’“+6llÇð‰6‰Vl“†Ö¿t¶d¬ÔP™kê¼dL4Ã&}9둞*Ò¿¯çPŸ©ä'Uq* bH—ú5e7Š,Q{˜–ò; –®¡FÈ쵩°Ùh<#4m;³–•b„cooÆ ]Pm«‹l‚ u >¡Ã±û"Á­ÅFaÞ¤VÀdm_*;¯®Bt7˜~Bã…¬ÊYÛøßtñ‰*Lw[û¯ùZW­ú?v¦;ð­Ž«ô°Íý4JúDG »Z- ,VRdÄ7:xü‘Ƹ[¬ð’ÚÕ®dÕî¢m*Ãö" "¸H„Úl²Ne ÕÍ:¾ü¥ž /UlYk ż"ÿ©ëÕ3czfDÏ丧ÅJŒX±YnV­Ü­·³©UÕ²6m8…> endobj 193 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 194 0 obj << /Length 3602 /Filter /FlateDecode >> stream H‰ÔWmoܸÆ}Ý_Áo¥K)J¢N€žíܹ'½E‘^ c³+ÛÛ®%C’ÏvÿQÿc?t^HIëݵkpÀaɾÌp晇?L'¯¦S#”˜^L”1üàc¬bg"/²HÛ8ÓëÉ«ƒÖŠyK:±hçÕäÕgJ\¶“8ŠcÔ™OBß¼›ü"?΂0‰Œ¼,ñ«¥0qðé_&-Pˆ<ŽŠ 6I¬›tÍóuŽKa+ã…þ#tâ§_ÄÙCÕ¡Ê£B^•íšI”ËVüùÇ=ñ÷ÿa%²YίöÄÙݲûwÙ€F Ê«60rV-‚°€,I'"³É$­"e²úÓC>²t>ÉÝÝ]$Q&[X—züWÝب´l—^Àjó+Zÿh:Qb)&:SàN%’>:‰x"+šrr1ùnCe|x‡=… gì­<Óx7ä®á*褩÷¶ð¸eÓÔAh¢T6b('rýJvÈžX^^ÑÜÉ« ‡ÿ.Ð0XÞs§ÞREB·à N¡_ÖÖëÛ­Ê®ôó>KQF—49×mYÊm¿l;¼4+—´oÅbž)ög ¯20ðÑÉy‘7âsÑU ƒ-;8ÔQ®b+ 8s­‹áÆ•÷#ùñüèý”–·òôSZøž ?r`p?5x<ð4ììNŸ»Ž8¤-Àþ&€ùA˜‚¸{Ü÷B¸!-¯1[È3<~pà«øãÕï]Cx»tìò¸ˆò"ÕÃhF2á§ÇœZɺêÊ …Eïé¿{ì"%±­ç}–+ç›=‹ªíš¡p‘òúøpãLà¨45ã´*Æg:&iyøøY–¸à ù9¦ÿÄŒÊ äy’F™”E£\zVšf½Ô¤)æãHžjˆ4³sú3b¿7€If¾^J'cé'Û>ýñÈ+Ú Áïi¶iÖñ:På™Ã'Dó>b4_ö0—WÒËV˜…lêÛ.°“˪D¨R€® ƒÌÀX1sS3Ÿñ¸Óîœô¢©¯UHà,3'œ}á}û9nu½QY¡"kÇ5j¾g ån‚É¥0Shc>c²æDß²i¿ïóBûø¶qEËŽÉ|š\ü¹².Ô®–„t 0÷ñû¦?}æóµÈÓbÈWmz(sµ”`+µ®`E@ðL7kƒ NJ€Ð”˜Ï$ãÀPêDºÍðì¤~K¥GžÙŸ!fÆn.A¥ù8³&6j8>”&#ÈH2vË19µ §æ€ø×xß öx¼?¶fð†Ãñä (?X¸aú]@„ÕAüà*À}Äþ²+Ö58#¿sÙÜ¿Aó(eSV¤ÝÑXpDW³˜«!ů+…Üîë ’›Å ˜IÈ»™Í{6½wåiÙÝ6Ä”s[ödHÙ¹íÀˆÀEÊzáRá­öÞ/Ðã°ŒHð—Ä;ç¶Ì¼ªIsË~îo±¿DcR;þž¥ÇRÞáu*ùÙâGÌÅþéé9 S/ü9ÀÐÝÚëMô%„JØÞbêårÎã>%Ú–”œÊjÝÚpdnž#{}™t1ç2ðð‡ó÷5”[N¹\¾S ØÆc·}hãk× õ.ÄÜßcÓ—©ü«B»ü¼;ìXÉ"y§Œ<ü&P”Aê+¢Ô›ßÁö°Ç~l¸›Ž¢HÔ ^dÕŒéKELíqRÔ!)”‡’G¼ö™Ó¨æü=¡¨S×õܧ¦Eý\7¥ö„ÕJ7iO´eдÿ©k\‹\_»\?Ÿrâ ¹Å+ÐÒuW •]AñEºiòÞG±í!Z=b›©c›iÏ6Sb›©g›š¦e¶i\Ç±Í è‹'H¹î T“„N‰½žxŒx¦äšâµ# ÊPÃÔôj÷®±Aö´ƒ ]óoÄ?‰¾”€¦ŒiO@Ñ&E5]Ãñn¶ÐÏdD?i™¡|K «A{Òi •=E:S«í W»¥Híœt7µÛ1ý±ß;Ë! ¿^J'cé'Û>ýñà•Ý”s«ðe„3Má5"œJo„ÈÉìÆ‘BÇÿ -° @Žˆ«JY-Vó ÐÏKÖøž5ÄaÉz¼"žŽ:@E}XÎz¸K§àÆE}tIc-ê Á¢-:wˆ{ß}M¾?"NÈ(²q$£v £Ž|¦#:jÝÑQ;¸ê96:âKû×HC×É€P¢Ó²PXP³3ó¡¼Þ;ÇÆ[ÜF?‡µÑþžùøzˆEþ.ÐX\–ô`z"…¾ªç³œwo¿)é>S¸J×Zw%Œcù¤ÑŠ&,ÄþƱ–+/¸$zSÝF1´í[QL•÷T'&Ö ˆ6ä™Ê—ªD.øCi„unHÈ”œ^…þ´îr¾×µ‹ˆ}zÿ†ÛPþ°>ç3¨o©üæb †,™{ʧ,ˆº÷ÇÝSàe!f96LgâhàúœÙf ÜS†O³ob “ˆÞõIîÌY0ë­{ŒÏ’V ALüh'Ê{ê/[÷¾Û²&‡·aÎà?O[þzvt(>¼÷Iü²^}ÂËœrhÿD(!öoV·—ªcŸÕù‚ûüA(‰< O4Ø”^ «‚ö€5Ä©Þ< —yáŽpiìPøIF§çà„žø~{?uO‹ÓO<,üÀÉFºM±ä¯‚ð5Vüa~¼í! Çj5wý€Ÿ°¤8$«òº÷nt ¯Ê »ö˜2cbu@QHQÜñ+±yƒQi[è§È16Bú³½Œï–"…pÒÝbÇôgÄ~ïjþz)Œ¥OœlûôgĽW°&ïæ7»ä/£8FA\™űű|ùS ,¤ª :Äwšú¶£H[V%ˆ…kàÀc0\˜¹A€0¹¢q(Æž3µnJç—½háj"9‘Žj7Í›Áz_ Šƒ"¢å‹( Uõ°œ1‰o¾ðèdGÒQDòq°!éktØ3$Å9 ¡>(¡ÓË9Šäy4X{›H²ø F× aKùô[‰ºÔÚO]=Ý_0ëÜá4ÀUÿ{+y¦Ö~Ïzº¿`îv¥ÏÿŒÃ1ä3% }.ü3ìÇÆA¤‰7†!SÀÃOÒô>ˆXð Bø¯o÷S‹xÊòŸ=·b’G (ý\ÃÃCॠȱY›<{’N¸YmýH•öm–Ú÷»Nˆ§ÚØ•Þ3WS/šÓ)ªÂOfñDÊÍ©3fMêr]a¶õ>TÛM¥‹¨­ÜÎk¡¨¨S;¹=£`ìd]"˜{r ²6+s³s…WQþ˜OŸAB°=¥&oß™‡ûÇG¼{3ß‹Åm*Ò16ËWÓfåü㣯³ØO4jù$v§RnG¾Õì4Y;ŽÚ±-$Ñ•zgµŒmÒ :Ûø27ÞR5ÏÖx%“JDI[kËus°‡qµ¢(Pimnó#Ù Êž‡þ0JÏAÿÿÆûÞõ¡NF¾'iÚ…jr°Í·3Jî(d![äR¨ïzÁ=î0êŸJ進ÙX> endobj 196 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 197 0 obj << /Length 4416 /Filter /FlateDecode >> stream H‰ìW[ÛÆF_õ+æÍ¤aÑ^†¤ápÖn6­]EEVŒ%jAR^oÿQþcznCQ+i׆ô% Îíœ9÷ïÌ÷³ÉóÙ,QZÍ–©~ðIò<óШ¬0A”‡±šm&Ï/º\U UW5“ç?\iuÝM ñL5™ºáíägï]éOã ñ®-~#O%ÚÿÏ쯓‚* ƒÂÀ%q.D¦2d…#ÃŒ~UQ&jŠŸBÍïÔÕ]ÓûS…·²] Ã8ȼN½úá™ú÷oþÔ±×ÖÕꙺº­ûÿÚN¤pxíÉW6 ZÀX’D¤6©é@'&ƒùì5K£s’†%¹½½ ü80^‘Õ¯á¿éW £Ž¼®v|¬Zÿ7³‰VµšDFƒ9µŠ3ø(˜Ä‘B‰rÕÚÉrò=y.$w`¶²‚•8/ÖÚ{‚%ufsøðæ3Ç€m.ÿåOsø~PŸ`”ô¶þ4 ëÕ뺻á¡ìtö-[rÎó_Ðx±§Þ{þ4…ÁÅ…løÓó²ý,6-(…_àgFl[”3›¶äË.Àn \Ó[?y?ÓïX9Û$Aêhä%ˆ §|Äüž±¦¬M zª§GÅAjL¼H"lÀ¥xr³m}”ìî¾qP„±j$ôÞûþìôv–@þh•e¾Š<<ò󣻩v“4ÅXí§QäÉYòG¶ÝÝi@J}õ.IÆ»Hvšü‘íÁ*a`dS£ƒî«ur[RÇH¤iº³šFPÎ8y’(ÐF’3&’¨1 û“`ÛùkžíÔÆ‡<‹o<™m!ã#¯…Ä^e”ï…w»‚z£V¥¯1I:5·–‡ WåÚÏ`¶ÞV¼\2ÓžV内º­iÞ¯ø+´ýŠ/³î²…\Ó—,k—ŽAµ‹ i†Ó•¬cNÙgbÛîÀÔ,ö^ûPPûvÎò:òqCa]U;w7×Ó)”˜4Š†ÄŠtˆ$?Ë^• XÓ]õ>ò¯Qp2tAfÇ:ªnýÌ«Á }Y^@:b^GpHV{¦´Ÿeú]p?Y«é žÉÇØSŒ*À»²¥bIÞÒ 8÷X(44@M÷b¨,‘D`‡YDfHãÌ óŸ½—~BÏÊ*å–2ªøýnÞ¸zWdi1*TÉPî#ÕŒP0öVÀ1ç/JŒŒ0*¨­UÕ¶¡=^[Ñ$¸/úT.ËÎw¼ÜX*†ÞÝ Ó,WR3(©ÃBå0Íðk!3 )ÊÞ. ß ±/‚êÆð³å&¢%õr¨ÂQLŽü‹à‘§)ImòÌÉÁ&'ù½KÛïÚ|5z\,Ž]EÅ|êι ©4TT'‹“bß ¤ƒªùîb€ îb0Pnå âÔxÓâFzE Æ)eNµo^[ðç5FxYƒÓÜ+/)5ÁZ¥\ΗqE…àr~ŒË`æ*ëï ˧Ñ@†¦çLí?¿‹¸#»çqç ù#Ûîî(G¶_½K’ñî’&d{° „hrÏí& Ê¡TÃH)‡À C …ÂBµµî¢HîµÛ”íp«¤êeÐJ ¯›Ò-uPÍ5CUÕB²k _a·l·BE¥‹©æeçx߬d­³êG(®æ+D£¹.»Î:†6¸æ»B µÜ¶'¬¥ ©–0…w«¥ê۲馧ñMïñM;|«Ûëm€ÀºphÞõøþ ´”& e‘X¥÷PÒ0®ƒŠÒK8E ¯–väfm]›Ò` u³›Þu(|k ÅO º7×¼¨º!-¯…Z•ÐFe]ï¬úéíÅ›ËËoÿ†­uá©?Cì}Þ¦9<â?ðörtêß¹Pé|‹H¶m!ø¡óDwmöH„´EÑÿÚþ‰ä©×Ö¹((Ì·!ܘŽ!Ál„p„x_qƒ‰F-< æÛíZ‰¯‚"û«G~·CÉS¯"ûT¶£owâÅiâQXÂÛÕ]žÉ«ºeUú”È7 ‚s&/¶ï°|€-Ÿ º±tÔÁÅcù„ýÜ»m?úìüoŽS„±yÿÓ(}àUz~QVvÏ£ìòG¶ÝÝ_»K’ñî’&d{°JrêÉ»Wëäö—¡RÀ[ÊŒÐ?Ù‡³4î¯|Ìíäoâ}ò©æÑC-$îÐc*€ˆ­)n4¶¢+&¬«“î ÷õZÍùœ¡˜V6¨–Nœ~+ƒZV¬è,l–NIêá`cåä¤>ÐÜq–¯h„ð9ž~¶¶âwçTs¯B'ûÜÔ’›Ûv¥$óàí‰Ð’£§ðëªA(¦æ\cqÛøQ„Ü5£›|îp5Â~’úy¡Q?^º¼,I¼Ü„Z-|ó#^LÄ—ó¿õ‘ÝB± ¼Ö²XˆòÈ|ìA®$Ä”UD¿1Z{ÓZfe›~¬œ`´´Ž¥¶]ìxc-B‘œO@ãTr¢míêbIþÔ|Ë·œnðD)9È}áý¶àÍ1š EAY5OÈèA‹áEŸ'ØðêJ°"–mÿ_ÞJ—Ý`—bKã;FΪíR¬wÀ²Æ~á~› œ¤[p—®¤…”!@5·–É­Ök»xïîì+¼4ë„™Pƒ·¹¶"—Æ7Å«Ëç”_à _ŒÅ{XÚ‘¹Gye,’2¶¡ÞV_]¿/P†ÓT“ê ¨;ª8ü8œˆ)¹q¦JØÿQ<0gw ëK^¸arL)Þ Ž)÷q¯åÍ‹åmP—R8Ó•ê CÒ@ršáæŠOÿ>‰÷“ŽU–·®Et«kvïÎÕÚ^Nîèd+ª¹U¢ÄýDóR¤= µ÷Ù¬2BÓœ}r…ÌÕnö”!'À'b¯aœc€k pñÿD^ „£‹16j pfãª,¥Ÿ‹rNBàw‚—ù?Ó¤'î@G]Žèެýòjëi‰Âïý󶓉âK|Aia‹„Ô… Ò‡U»Z™ÄY\;ëØ[úï÷;—›@A}gΙ™3çú}D@HFA?¸ì†îC®g©nÑCásYnÕž+Jfû‰ÿ~ zÝ?óÔðU¡–˜Fݰ™Øˆœ'6è}r ¥‘ɧôŒ…§éˆÊ$Yê‹(ðä ,ok Žžl¾È¢aJÍuJ•mÛ´hSˆ¾Œù½ÝH;5Í® wæ\í…| ÌñL¸MF½Ç@M·4­!î9ÂCXÏÌUC ~Øó «„I߸•_F.jˆâb|q¥Îy°!l²ø Y gµ”/Ç-£0Í3òÓWßÛ)ƒ\»ÎÕõ’ºo`ß±ýì»X³.76PgªØ¦îˆ DŠì%¶‹ úõêzDI#4R§¨×¥Óã•]¹‚ñ4qY²Ç›èg͇™ËI@=óÉÛkžè€^l…;JO•j͉d¢lŠ ˆìè{^|íRžPŸÎÌY/KÜJU8êÐ@®n Zëq‹¯n'4·ð܈ËÌÇð[#2/¤w””BŒ™q?ô(/&4 T„ݲzß–k4pÓaªÔŨH›¹ò?ú)ªW]'[5_ çèäTÕúe¦ƒÚl§SmvÅ¿=-.sß!å y&óz[wbUêð LÝÖN£xjÃz»™ŽEàA~ð nÊv¢Í ®êÌ·F†Zî|À"Žþ€Ì •ýKa÷KìVÃü! 2²td„ĬSrÂʄĢi@" ×»Aj€4Sl«Y[1 CÍ®ä¼U!÷UäXÒ3E½6z3¢OŒ¡Oç»ÒûI6±â~'?š=îP9Q DÄrý½Þ¢%_8Å_è%¹ý]ô÷;rÍßwÿpÏñ>KÄnäÐKÊ õÕøj½ùßG¡M|dçéÐ=52ݽkÉÐrש^L³òYk¤M¸qñGšKß #äB2\ß se¤ðôoµïÊ\-y²eöæOY6ýeÝEüÊÂŶêJÉ-Ïù[Á[»]#¿;æóó¦vZÂŒç´s(@‘/BÐØø‡Ûß»»C4¸Ÿ²],|Ŭ7¿.õ fi¢R‚ÝÉá“^–Ÿ-Ÿ šŒû@G8*›Ä—M˜Œz(q'Æü4h¸R7}̓ “yÛˆ¬x˜(5`î'ˆ®á|kÝFš# V])Û[³ïeWmèÞ(zg}g¾è§CÕkÂ~,ZNøˆ Ã&šìTgžáØÐUBøäªýlO˜öàÌОã)‘E À’”m̘ÌYŸ¸âÍÓE®EAfzV0WV`¤ §%4¿M L'>lKe™®”úãÀö©Þvȃ‘kN rFn¹Çµ7½üªK–ûgö£1$A<Ø?Ï= FöÇJrGôB&z9·œ‰Ó¼ÙðÆPÙ É TeM†òLH;M¹Í6²ºÁ{ù6l³i{Þ4;¸)ºéeËèbán13¹Ä6c¹‘}…š²Î1*i'_•îÆÄÊíA7HÅÕ6 ÍÆÙ´ÒÃåç`ýûzª>ˆYù<ѱItAZ0ñT /öR¡='#°/¶¨y>¨Ö·IH#fÛ­¸8Rθˆ1`lצ‘MFþ3[0Øà ¡•#ég†8,QŽ…¢†£Ë¹«åxBfP*T<Õÿ hÛ‹zÕm+↶VSÈ%Ë_G É âøîîäœ]w#Þ· ìÊnaOW«ãõú󡱿8ýë5‚8®®ñŸã†¡¯G ?íªŸÐsr{j˜ã%.l\ØøîYë l¹„-°N aCŽø°6æ‰.h9Âã®jdsKì€$[رÕËWªO}$¡®e.uJ|È^b+Ûª"BÒ¼¥•åúÈÈ—Þ4ÎFo|rÓ6c²4JíÄ;-v=I»‘®çj¯p2‚ áIï¶Låê6™Àÿ‹‹:ý endstream endobj 198 0 obj << /Type /Page /Parent 341 0 R /Resources 199 0 R /Contents 200 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 199 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 200 0 obj << /Length 4854 /Filter /FlateDecode >> stream H‰¼W[oÛ8ƾúWðm( VE‰ºi€i’¼›^xfÛE ØJ­G $yÜôí܇=7ʲ“if°ƒÂ€IŠäá¹~çœ×óÉ‹ùÜ*£æ·ª~0Ø,óƒ,HTš'~˜‘šßM^œv™Ztt&PÝ¢ž¼øéʨÏÝ$ðƒÏ,&S7ÝN>ê…7|«?—8†ZÙÐû÷üä* üŸU©I˜P§QQ ƒ‚E*ä(Sm9¹¼&kÀƒdŽ´ÃšÂIš³²Ò΋¶v–`NÓ(‹Ø½>7~?Ó—?{Ó Ækå¾\yh”‡óuëÖ á¿ñ¦TÉ õ†W«­æXÕ€z]}õ¦©otyÁrwQ¬Qpav¦>ioÃôôTv…HÏŸË/2a;€ôaÀÒ‡¡„Ö°!P¦hl‡‚m| "ÝÔ}éÅ@ô ý÷Ž”S¤õ£€|[(±žã"½#µh€3cÉ´‘îÕ¬/ï€ÿC¶@qqlÇî‘Ùš‘+†úìãÇIîãÅ:&f=Ù&ÕO¾ùy%;9ÂxxZoî—³3oþËøÍÐÏl$¼xTòðxcj!¾JS£"ùá³»q2ìÚ8F_íÇaÿîõg¶ÝÛqêƒ^þô.qÆ»ßàìéëÏlZ üD6ÁÖqr(Ö“ÛÚ‰xƒ¡uhpËÁmCß$Üè\ÖEt³Ì1ä"½ò À"]uÊ´ÉuÛlz/…­ê¿@ì‚G<íË'F«Bñ©’úÎ3 ÷M[´LQY°ý¾QE-óc ,Ï/O”{ƒ¡Þ_•2+ë¥"DÌô›†oµîÃBî.VåRuÂ@qÇluîÜvPîr§C òY°J “¨Ó§€åqaŸîÂ>emμ þÌK¢*zÕ“b]*bœDhnYÈL«vSû‡‘½Óƒ%J²qRãć¢%LÁ€ZÅ "!9ÐTÕ½@ t@’iH²Y›8ÙÈO>êcÏ‚6€fИI€FáqÇ“ûÄacžÆùSsÉ—òED>‡V)Õ²è‹ÎK€Sß¶$ìÄ=þR~á…ÈúT;à y§™ãóC©ã«¡Ÿ›8ݱ eB(‡:ÖnX™¨XÐcWª_=BT‘â LÙPý`õ-1«–{·@Àœ¡áêfg,c6Dðž?\,—¤¾É“Aj†‘Ô”¸ÃAIÎLo„DÀÀ/ÄÑÍÿ&xŸ¸S6N3Ö"ïÙaÏÆÙ(ý„¡S^J,`þ ôýS+˜ï¥z÷Ï tÆLË n r$]$þ €3EE.±¾í¸€†ôš±;“²eSÞ€:ð’íoò}-r, ŽåÓ½Pšùîé^ŽÝ¸Gk/øxtË ö)b„/%Ê=ÜË-ž7îm$ÕS¢9 ˜Çß7ÊtdÈeƒY8ÿµ¶yïŒ2XÇCØ{I±i!2 +'õN"^`§ƒ]oœù½_eò ëÛFô¤Žå(„ª¯Nq;jµºq÷èbªºUT4Ó¡® hLôû²ïE»§ÈôÑÇ…ÿcc…ÆÒhÀ»3ÉeÙoÚUª¤ä›€š=ª˶mZµð Fh³,ÿHŒþÿÎ`bç VJ€ ®ºßsÎ;e¼<'俼¼ÆÍØmþÃCȃ"\‘»ý*PŸ¼#P>ܵoP­P±£E‡¡ä¡ëèYç߯xŒäŸ³××P9H€bWrC‹ <ª”eYÓe|e!ßB‰;ÅÌwÄ¢ƒ›CUÎÙ ëj*#R™âD- ¾ýƒ"Q?Am+fý²cÖ¿9xJIüWê!ôzx‡lÄ$J¢ßP(`džß65 Kу=XÒCHz#¿Öh_wo‹‹\óÅ™AGšÁ:¬ÄœvòLù<|~ñþôœÊðëwïç³·”?`ª5hqX~É8Ñaac¡‡ÃÆ‘‡½Ê]7Ѝn«š&—Žë B¤¿Ò 4¼™®?CŽgQ|²,—P™=¾S¬¿G0þðÏjð}_!ê¢I)=i¸XT gªT3¢†Ú¾’õ‚Ç· àþ9"êîÊþˆÙBË¥#Õ•C•Jï_ÊäÖu#Úå>îÊ['%,ÉCÖáÌó­Rl#hÇv­R‰Ö²D’&x ¾•ëó—Ê æ©s™aýeÀ‰k( ÛÀ¼´ñpÑõª¬Èö˜œrV µTã’Š{DÅ‚ö*œÖ˜â.T ¢s•©oåf)7e‡ÎŠûŠ‰ß ÑžV+zºT\‹]G@L9Ut„aÌ7Ñ ¡8d£}ã[2oh º»§["‡2y"¾é]q³sÌÝ«,n¡ð’Þ óo •Ì7ž¡¾MîÝ”2¡¦‰Š¼ÄZ{˜×:»-¨–åìºYð' NwZ®RgBý…wÕœ+„,ÑÅiV/Þ^@×ö™W_…â”ȪmµGR}ã9õ÷ŸØBkÙÝ7]ùþ†Éþ"õ‡Qk‡” V¤ãt‡EÒNáÖìê‘|(+pJµ¿sÊtÐpJ5ç4¸E!ôºD­aãkHn6¸©’ÄC®e…†ÏÑð=ßWø øî-j9üûÜ´?éV|®Ù€* ‹Ü8úÅz[ y™ÜÝ?¬¿ÀáŠRš¤9©MA9–ƒtºŸÖ\{y}þ‹ØT_þ x¬¯¯®JêCU>¥ÿ¶œÜ>¿'îA‹{ûq˜û™ýÝëÏl»·iüó»Äï~ƒ³§¯?³=hò¼•]¸–Êõôþëùɾ6Îý0Øe_ׯdR»íÃtÕ ž´Í†³ Ê2:¡ìaGÚ3 »…ªË­Zº”!cW2ÄÇòl) ,à~3\ñGÉ‚À1 …@ѾV’Aj>³tÛÈÅ-Rº…™ŸÅY:ªaÍ(!J0ü ¢&ưÎPß@“§£*8’È„R÷+HÄ&S¸ÐP1†Í݉ڒ¾ªõZÝx”–J:†œÒ3ÓÞŒ!µcJ†$Ú“ý¦I#õTŒdÓp„ê!eµúCñ?Þ«m·äˆ¾ïW4öÅ3€HpzîM 6DXË^H‚Ån ŒÈ¦Ä„ípËŸ:UÕÃáMNƾpØ÷êê:UçÔÌCcOb(ÇÄBGš–ýÑeêÍe›3¬OÅ ·R.“Ì[šÈ¾C·´§¥\ ÊA¹–ºrÎÛøŽ½J¹=OËλ$‡u‡ë ®ý¢’;а¦Ú¨P¤l^;¦|“÷"þ¡é==Œ¹UÖÚ>èfã¡ÒÛkªïcýßè÷Èx*Dé ëß ÜŽñ)oÕø 3cÞ¹ÙZ/)X(уdÑŸ ª¼]†¨1[^»hPc‰çˆŠ‚•lÉUÃTÕåÃÃð}Áx sÓàPù‰7M&—Óé¯4ƒÇ¦Œþyä+½Û¯"{à«„¬½yÆöË(íÀM}¬Ìž“'ıB0SgþÍ"‘ƒú¿ 2k02wÆ1eš'™å½´jÑèÀ¸l=8Ý;Ç5Gà¡KäÖJ\d”$¼Í;ô·ð#4hEÌ^CÑVâHãÀÕ5ñõ ÀOï>uû µ#P“ï©O£Ô{=QÕÀª2 >!òÂ(¿ßGÈíí=S?øSÐ!ó®|;`13ŸAL™Íž%Í*Õ~œ|6ž¤Sû·íu®›çß龜‘펩´¿»§8 ëÕMˆHpõ#ó4‡$5ßÄ yÂ/vÓ¹ç‚~IÒÍg¤öª-’ã„"·äwFØËƒíBç>p1ÛJå]¼uiè;éáS—?Râÿ}«[éÀÔÈŸµTKªµøÎ¤Y/Mů`ƒ•g‡GmŸ¹kZuÚüIŽÚ¤e­ßÿºAÔkðXªíܘSÙKƒéÔ­¸‰àz ÕA>ïÚsäôau­)Ü•+;I!J#3©dõìL÷÷ñ)G8Iªäá°ø›ž÷C–~O?´ùßã~ØRÙç‹Z ³L²`ÍٷצWƒÇ'þOÁǘ|æV5q hd‚3cvN¼û[H„¿¤æ”~¿oֵȣ¥r"V¿ —0ë†ÙF<9éñ³ïtÆj"ßÎOûóô³æMýZ]"”æ‹@]˜kI Ÿ«fa.Ðèìíö-ðKnüE¶xhsqXèÎñn[fø³ãÝ…z-‰”.~äªõ‰?ã2¸º4à…o3'ÏO——(‡|ÍnsbEýUæêÔUù Ee?c¶(å`·!êê˜ÏÝhËmóàL%‹<{±žhEGÖeýáÀOÃjFŸ÷2‡÷¸ÓáÕäæEý£´æX¸Ò9´Ñ匓uw¶6§O4o`~©·™o„Q„¹€‘)7‹Ûâ`Uù<¯7îçýküK™æxŒ0¶ dÊœ3„<©OúÖúLš‘äÜ’§_»³dv]@øÔ,.(|\%6´£mŠh‰3c=JˆíOû*ÛÏK ¹$î—]¶ïµÞŽKß_}!̓Û_ˆC÷FZw!=ÜU Z™., ¶¬ s½ây$üàú¦7˜’œ‹ei‹J÷—Ð"oóà=‘3ºä}Yøþ½ž³’ßïEÿ´:ŽR§ðJÛÏâ¢C¹ã¢CH+„[L´†…Áªq!èÇ ÿ6‡N$†„½KÞÙQ€\bξtú‰À“~9ͱ=kZ›šõEwòæ îšJš“®œ©\þÄ¡Gâå豓Nnîy^*Öaˆi×òz|d@, CwÐùcÏe ÏeÓ4ñþÀÄ€ª2M¹úüCžÐ]"cS2ØP=(Lk÷Ã웃iæ“”ˆ×ÞpjË~‘œ[üú¨?7!ÀüQ6KF_±ëôòo w<‚ãQˆÀìøZ§Æß}>ð¨ ;“.Àwz3Ý8’. ޼( GÏãBž1¶z¡ :æz¨§Á LÓ«gU{Úï– ãÔøŸñ¢ŽaLÁFèëÆfÒöK±[*{å¼×0lQv/¶’Qç*î§Ò¦––ŒjÖÒY;?J»Òì)å\pšùJòÕêÿ`—ºc endstream endobj 201 0 obj << /Type /Page /Parent 341 0 R /Resources 202 0 R /Contents 203 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 202 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 203 0 obj << /Length 5130 /Filter /FlateDecode >> stream H‰´W[oÛÊF_õ+~ ÷ÀbÈå=0IJOÎiŸ VP¤uaÐm³I¤â¸ÿ¨ÿ±ýff)Ñ’ìôr âîÎîìÜçÛãéèõt*_MoF¾Q~ø„iêz©«$‹]“zšÞ^OÚTÍZÞã©vV^¿¿ðÕm;ò\Ï£=³Ñ¸>Œþâ|Êõ8pCç¶ ¯qTè¿Nÿ8ʘA¦ÏÍb\¤öнœ7 ±¢Q,Œþ¡Œç…jLŸL]?ª‹ÇªÓc?q3ç®hK 7qZõîý¡úó?õ8v§)gw‡êâ¡ìþ^4ØaóBã‚ÐÉ«¹g€%KÄj³JÆwý0N0Ÿžˆ4~ÊÒˆ$®ÜØiÁ‘X=jÿUw}ã´eOm³;æ:ùªT#û0§¯‚…I`I”ª¦ÝŒŽÙ¸Ý‘Á:b)$™+‰±ßZkã 4ð×R÷JGΩN Îù”äƒDŸ¿Ò¢ê§L}\ïkÔµ|ÔYƒ4§ýĹ=t/©]V'DîèO]:“I]u°Câ|§U1-2ž(dŒÿ‰mÃmóI­Ç‘SѼáþâ{×3é­Âr™,}¬d6êÕL‡x{§M)—ËÉ"1u}§ÑÄÿ¤)>vÄâ盡tf(Ý”ŽC2tSg–/Ø‘sr¼+c¤ÑFF/]{ƆR’!%t‚”`‚?„E¸&,§$D6ú*I||ÇË j~Hâ55Œ"м=2™›†Ïÿy}·çÆ–›ìÞK–pïÍÿL¸‡©›¦ƒâ u¦wÊç⾦â’QÄÀìN±ë ¸<í3z1ëB#ÎÈ5ñx6R(µâ•=Qc á h²¡|sŠãˆ&¦„Á¾®dõ–yGË8ù®à~`ú0"®Î¥ÖÓ¿ #"„Lá³^y–Ê!Ô"bÿñû»#XѼÏÐm ŒmGBÐ…Ò”x„¶$Qx. ¡Ard`«@Z—Nï´O=§l•F=Μ›U5Ó\µº²Z¥nePhîèú­(披xŠ2ïûZ”çöõ ´¹*«a¥Ö†úͽö3|sð¯T~]¯d×óêtŠÛïxóú‚†9³Zs¦öÄ”dACçº;ErÝÔ«F-sÙ³Üö^+eѰÌodÖs:jO˜—húM$û K2{{h[!Ôóã Ï*X[µë¨ýÂyÑR7¡É÷Áæ¸Á›à¦ŽÈÜ>„Ä®À9«g9™7v'|úXS¼ÕT©·7ÖT¸ ™@¿TÌON*6§q‹+9ó³ÙWC²D¢%N£AËì³Óùå‚ÍÆB1JRÉ6ØMhë@tƒ0 =ëÛŽñ­Q–”Ô¾³Xiê·ü_Z0PñìJvÌåC€žmQ³‚Ê@ÊTÿeYξeŒCšfÏ|§=z½¹–¿ÿë½¥dë8]É.ƒ`ðŽñѨðM“,Z—e3,ËŸ¨Ã"ÞŠ7ŸªsD9IãŽZ¯Ñœ¦}³.÷¦„ÔK çHÆ}80ŒA @6ŽaãL<„%Á1ô}»7î‘B–DÙ 7¥}\Q›"Y-RÐÇ…cžwy«©›thZÈ‹¦P³ºbª¬ßídKö±½„âµð^20ÍQ.Æ8«å;³óÅÉñŽðȪÔ ¬…·UXçlè6&dÍõ°»¾A)pŒ-zQA\ @,Ô¦}¯¥¶×lIýœ‘ÔÊÐubW`tY/L7ÍÚO{s?í%†ÀŒHoÄs_0šgC¬oX%ŸÅGò¡y(uÖ;]&ÀýQz´¤B'ö¶]­­¬­Ç}XÔŠLÕÕ–™UZü¦à›Ò¿Ù8©¯¬,RCÜ\›BZñ.à—6¡Èu‡¶£¯¬²Û/€’¾èÓÎÉ‹ñŽéNMM„|ü¢t¬“Ö^ÑwÔ£×ä¡Ó@9Y\áOËŸ¢yk‹ò¬¤±²Â.•m8·¢¡Š  ØáØ/äÒ Ý¶ÁÙgÖJ¨o6\[…²óYH¾ ú÷ù©kBDþö°ÕóÄ’Í`§[-1¼›ýmöóÏ?f¹>E† òÉPZüO{íSVK‘º¡ZÀ€!o1~ÆÄ`€À«ŽùÅ>ë}åˆF£ô ÷¯CÂÈ£ÚYH¢€`NƒåÊÿޤ[›žÆ“^ÕwBÂØ¸î!ÞÌAtU,‡€^'dÒ¿±"ŸmÈÒWØ_´opx ;˜IÒî"QßM×`Ú)‘ГwWâÉ«KàAÇɴLJ;5[Xz³ï‹vGk)ÍÄ#¶׊½1®É6Y%kÅ—™ 0ˆ9´‘§Aç†KŠœRGPé\Ð*ù7ƒ]fÓm^ç¾tÐíèÏÆ’Ҏϲ+ÛÇþ®U†Íip¯·B}~}›çW‹ÎRþýƒX×ǧÿó0†!Ç“a¤%g2>"+Äqu‰x<¡£á¸S:8B ¨ëª&¤b«P´Mˆãèñ/×:áí4“íô&Á{$äHbÌûýÁN盟eô{7<6\“?JÈ„D1&qí,ŒÓSôy™åJ^úqU|Ô{2HéUäA7- ~Òó^©KÄ]œ {97Ý“o²Ýáñ"¿Çteœöu¥öéЫÊÑBŒº c¨‘—ˆÃ‰Ä}} SA¼W²rHtÙÉÞ=]I1¦ô–ßÁ'äü~”&²¼R—Ãh8ì«Ëó}qCÏħ¤ÔÉAª8<-âŽ/þñhw.Še'Ñâ#‹CÂíãÁxªx§Ãâ\Æq¬;¿ ‰ k"ÒžBÒLkëJû@ÐFòpÆ ^.N…Å<]¢i³{:cïZ1·ó;ÒÂX^Kè©`Ì«ÀJ"\þÿXÑ(Ù‹x½Z¥p[ê_Ë?‰2=B*ÈŸuÞé‚L;_]ägv ɦ±d.´å;§AòØweç·fT¦ËJ²_P•=Ž¢á~ý´ Õ2ÀFƒÞ¿†'‘¯˜IlŽÿ-Õ˜¨*„ÏBûàs=kL&j’Ú–^’y&Â&ŽšÌ²ˆIßõÛUe^œÛœù¶µ¯¥M­]‘éÞùÊ©hÅm4 àNøA'.ÜÂ&¶™ ›¥~'ÞxïroEkÛ½ÀœÖ›€(_Xÿr-)û¶µÝ]§J6È×ïn{®Oˆˆ¾Z'æÆ1ª“¸ï„/ˆ-ß I_KÝQ`›b°S›+™fà ï^WÛÖºJÞ, ŠžÞ¬uË"$ ·:m«ÓlÈ9Yí¨ö†]Œ˜8Æ)Qö›gïïïnnïßß¼ûÕ_fžûŠ`ÖØm|o&< epñ]/mÃ9+cüN Ì£ËtÜOöHˆžÙn‹²•±µ¢aߦCìùº )5¯(íúÕƒ¯tÀ´©uO:f¤@lª 6ñ•î©®l¤ÎX°p[RÔ c¨ž†ëOUé À\oQïp¥!{ëôŽÆ²ƒSÕÛµ¿×úßúQìžóhº^B Á‹„õ(w`®3•ŒA®:¾]³‹…x÷?·6^¶æ…†Œ—RrÄ+Àº#UöÂÛñ¯”ø*à¨{TΨÁPfÖ„7ÀG[{bÊïœÃàÖ™ "!ãoýMç¹åZÍ)œ~4º@‘„¥v“yt·kúö™$}–e•çó¹~ävd~æÖD‚ÖûŽðÃs;Õ·ŸüafVÏ ‹`3÷Ð=sHîãïj-Š ÅÕª¹4‹»ÌZ°¶\¸³ùœþøC//8Â冩ct0è-îåÅXˆŽl‚Àö3ò•b;­pÆbºÕ~¹at9‹£ìØLïÞ¨”†J Ÿt¡ (à7ÉÔÂR\ñþË_þ3wmd endstream endobj 204 0 obj << /Type /Page /Parent 341 0 R /Resources 205 0 R /Contents 206 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 205 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 206 0 obj << /Length 4506 /Filter /FlateDecode >> stream H‰¬WÛnÉ}×W4ü²3 q<÷‹c°%cac-6_6ëÀ’-’E*3CKÌåóS—æ IIN€@€ØÓ]U]÷:ýf|ö|¥ÄÕ˜mM¼Ïȶq_ø|7 mž¢æˆ*yØ0ð^r£·ÚúyPñº£žVéÇ¡}[÷B‚ ]\ðnÆ®ð™}õ‡bjŒùš¢ìËöZ߈˜a¹çÿݱ«Ò óLÙ‰ñ£´Åã´H1‹"ÜÓ{tð*ýÙa–»Ã4Ëè];8Îâ*(ÓǘŸ>Õ{³²Â‹â?%µôôq½aÿÉñÀ#èþrŠºÈòS³:3>hQ¦ü’•{Ie¸¥,å%Ń:ë±M&1Ë›iAíŠVßwÍfKïK âµ`bî–+ÞY)¸ƒi­GÎÑ6j'¦[8¢•µõ\Œšik"J0p@=oä³±˜ÛKÝ*¤Pz´ïÈ‹Éí=H8SëDó–š o¬íT”èäÍÁŒ{Y_vJ6ýð;úÝü@ üBÅ¡ó5å*ªÇ±âÇ;è>`‚Þt~³¬Ì/~„ôð>`æˆ!òøv),ôX¡‘Î]ðvÓÚ¼G!¼ïüÐU )‰ùÚ4è·™>+þ±Úecg²¼R~¡ ?Óüì‚&‚ZVÊôÚögi’àÀ*לºúÈY•zo_òúÍY»,+)Ëd§[®ea‘fl"|3Ñ-ŠeæÒ,•4K)Í>^ýþ¦^“«à…náµVèñ°’óˆc gß:-–k]ÔF3#vDÍF>û;ïêl ºÌ;ò~äè[—:s!Úlfnç¶ÙŒɘªÏ…9s ‰z¹pªWœÝàåGléhÌm ’åÔbFóÞ†]®Òº¹ã1Âùnû¨Á\Ø—_0•½K¦¶+ÛÙ ŒVB¶|¾±–ÄÜwLÊX÷d¢BÕœÛ/öÝP)O¥N†Ï§ºÑiO<’çÒˆ[H" Ý¥#Lû0RJ‘þüôÀ“0ªÐëÃÇ1ÏúDA¼ø")cÁ öi8s DŠÿLL˾ӗG8‘Þ4À‰OÁ 8Þà8ê³³t0¥ÄH%h ‚ß~Pb ¦Ž3SÔ ÈSCГ2û%ª‡Æ –hk>ù&õ>RÅÞä{iRB"”TM§pâ“8ë#•”C8ÕW ê vAH›Š¡MRæƒÇGXí£®o²s²/Šä¡Çþz¢è<9ÉÕÈJ¼$Ⱥ;V¯Š0ÉŸÂWi–?Žs=$ #‡ã˜‡™Ÿ>u÷¦ñçñSVKNŸÐëaöŸ<ò¾zìü¿ÃWi\<€¯ð´ŒJ}1\.[Ê”¶5ŠXá8üâS¹4 6 •ÞÝb9]˜…ÃMÀ[Š¥ÖLoj…cÅ0µئ7ÌdœæžCPÊÛ)Þ³æCí‘ÃC÷úè¤øê½îzhg 8´mÝjk J¼z( úÇ-ÉU›õŠ]zÖ°U™X…&QOäŒÌȼ•ütK+T-v7‡1ó¹Ñ/åC€[‚R o‘’Hj!V»a.Px{}ÔË`¥ˆœraØý‡ýêûmÛˆÁØrëˤ!v¢“dYE ÈÒ¡X»MPô¡@ Ø²-T• Iîÿ~üHž$ÇvÛ‡=îIº;GòÈï«L½PËv\“ÉPOvÊWû ìˆñĉ˜K]â‚÷µã¥+vL. .LI¨páob–„ ³f´û†ÚZè=GÑ$ <á>­(ä+èDNNézhò„3|utQì¾N>y{e 8‘Vð#ù)¯L&Ø´dQÊEw€J>5|BÝFSæÙ×rH¢×ÓÚ 2ºß*;Ÿ‰Ùgf'‡´ìŠü„ŠÄTF#UõÔ¸{ð|À´;n=‰÷‚•zz†(,ʩޓŠîR›8×Ãá©V˜³GJ=4kó1ña€¨>ÎÙØÓ!šå7óL¶V•¢‚—ö”J)<ጆV Ï~Ql e‹L‹Å1䉧¸!ŒÒhhT3×î¬>ÈW+v‹!ÄHy @&äÌ=0î°%ÐÌ-© H࢖ÿJ>Ôç­\úÓr¨ª «ÚWŒrŘ­(*uyÇÓëc[zHFîŽ<µƒL ~º¡‚÷ÁsªÅöa[ÀÒï§ßT8[ÛÜ¢žúè® ÉZÓk¶†J/×c}½7~e”yÀ_”þjy¾é7ð\I¼±È}¹Í£ Ñ(yg$ˆi Ä´@½H€[¡e[ú ¹á²O’¿y%Ý¥Ó5¬¥éed#›Á%ê¾ùR‡ðÖL;'i<<ªÿiÀÞ=&zð“øÙhä¦ËO9ƒHïÛÙ«’ùöûB¶¡Ž7ÁÙ-åeŽoNµ›8§º=8’¸Ò\'L)ÎGãLjÇÿ —a†Böä%f…·,XîÖEu›ÑXD)_ñ”¸0à€žÃÄ \àŽrz²ó q˜pÌ®ñÒbÇ^,³ûì%r”eAç\¥Vkaåv{½á›Gd0T5· ì¢ ^v”FñžYuµ*Ö·x–E’1#ƒOíS ét>S›³}fcczÝÑ) z$BWO“ˆÛ°ÜŸ=(\w°ûø:‘ˆýö¤Ò¾mxƒÕ"uýŽ3‰Yb‚´â–‰>+ ö Hö$JF¹‹"ä €/µ duâ|Š8€þ *MO"5›¦Aœ|„Ú08MO.r xñ;q:ºùû«îÜ(‚ÒÓQ:±þsTϳq!dZTc«½à^šßƇ³io ÐO Ço€!ärtz7`©g¶xJʰÚ2T¡ Lw ;ÏËÒ<ŠpÎ2¦Uݕа9(Ðk @béèwîíÖLŠªéÀx¦ 7 f£¿¹ûÛ1ª¦|\º™ÛKà•xNebÐb¡–µ­[Q[äv 2½_HbLU0å@(!RÑ9'èã¬w¢ì±15¸E oœo˜åÆtûµü°wcojî‰`^ne’긊¡½Y¯zÐ…¬É˜šÑ+¼ÖxiÈ?K`ª+wvÃY|zQ-÷ô~Þ-wª°Ö÷¡XÕ2î=œ«ä¢wa›ËLË ñˆGá`3û-u¦ËT¸Ü)p=uú× ¢`p´bž HÒ>Ï‘å×)¾¨Rž;¾ÇÌ«o^ëT.ŽŸÉ¥)kÝŽÅFÿ’ïEŒãï;Õ:¥]öõÌ<îdÔ™ªvúÜDÝŽÕr»ä¿Šº©ê»ß –ߦvÚ¨JòOnÚüÕ»réÄT¹ ދܱ‘ùšç›CâÈØ'î‘ ~áGKν ðúŸë›·o®_þyûâíÝÍÿÌ çW‚¶ ha¹©W#v™Š¿åE,’ ‹á¼M$A™[‰tãnN.€ÿ°£3íNþ¶Ûºa\CðOfF)‡¶Ç¡áp­}7ïÑûçÞ‹7·¯oÀdCï¹?‰Ôä+¨½1ߥutÑÈ (‡3¬¢Ó­ïû> endobj 208 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 209 0 obj << /Length 4696 /Filter /FlateDecode >> stream H‰ÌWmoÛÈþ®_±¸/·,,šËw®Äξ»8­¦Hσ–h‹=Š2HÊŽ‹þ¡þÇ~è33KŠ~Q’ýPwwvggfçå™7³Éþl*£f×ã+?|Â4u½Ô‹U’Å®Ÿzš­&ûGmªæ-ïñT;¯'ûïκi'žëy´g>™öÃûÉoúcîL7Ô7}}­ÂÈù}öó$c™J<7‹qIÚC+9ï'ÄŠF±0ú—ò=/TSúdêêA?Ô35‰›éeÑ–n¢[õúÝžúÛ¿iìº)çË=u~_vÿ(숰¹rpA¨ózáL3 À’%bµY%߸&ŒÌgÇ"IY‘äþþÞu7Ö-8«Çà¿î–ÐÑøº-{‚l›/™ÿÛÙĨRMüØÀœF > “ÀW$Qªšbr=yïabûÆ…Ò,ð&l®„˜„b¯í[°áüá hH«¹ƒó†Á|H”ß>ž/ØÎèWûw2È'Ãg¿ZßȾìkdÚë¹µÜÔ¸Qd/~ül뙕aSuN¢Kò‚L¯~·œž"Ó]q™×$PÊ&…—ÜãµL_ÉöÐê|ÝìO|‰é=ÄjyêÄn¤?ðÿÌ™&úí+åà)ý~½Ø8†¨ŠËŽ ñ4ÕæF–X"¨GÅ›¥º!UCÄ”ýI–ï™oYUv~U¨¹ŒX ·"+áV,Ôk>ð+< Õ•Égþ?ÇR¤-›ëucGE?a‰”½RW¸e]ËrgY±Ó=UÜɰ¨-òZÕkËävÐpº}$‘OÈ#ù¡ØÏ„Y*,k%Žé†ô§è(.+DÌL—­,Šk8I@öóÉû‹ùDŸ§©Ý4["ÀÐheWÕú–B”€qÐïëÖvÐvß\îµË0‚åÓóëŠZî모õ×ÄgYåÎ=%,YÒÒI‡ë–½””+ð)Øœ|‹â¦×5Dka”óa+F;öQ?圣+ÒyYåW2d6¾.\>DqŸJÜgsÉ4è£>Nc7ñÇY’²,IL o4¯i„1¥#r’‘ÆÈ‡í«þ&8‚d7õŸ# ãÞ9Bá{à„.±#ÅŽ`¨@¯‘tC8gñE¾‡ƒä6cE®É×¼Á͆DÞ—5cY–9yA†õùŸ K¡JëÖóiØ9¿¤(øEÖܧzLíÅ#E$%£'8X­©2$º–Ïuy#ªSômìwÕ>Ó ËO’­fáäÌH1J8dšÝVl¢ Ínè¯ä9¹)]ƒ…¹7’ Ü!›Ûï`&òqáÄoX6²TÊRÍ7:>GZþŠIWWòfg”9ä"C>û“CUðp>—]‹ÅoGgi)ñû3 [p‰·®’ ì jÈsS‚UŒ´ð ±GÖò¿¬®ëŒË<·%7Š{¿Iã­y}r¥ã‰C$”Hæ2|ïLSh‰ªœaÉ5?I¬o ÄP®&Gʰò#늂㿳‡âai8b¼¶|ê§‘:¥Ø 2¶Jœ&C «è³¢Û45Boö÷GµýåÈK·neórÑ4(s*\dQ<ÁwãÁõñÊ=‡¼m¬ /ñä©~ËYëtÆZ§úì³,«£OŽMôi¸ZµL*È Á¾gãER›˜$g¿}òB!yØ-_˜Ø©ÁÇ#TªTñs•^¢x€:[ÆØQ·ˆU^ü]Ñ©ŽÑP†4J¥\îG*ꀟêÎÒànm¹®Ý ƒ¨ãÛ,6IŸ~˜I<ä’nç|ðŠŒêùû_Õ}éP~p_—ÿa÷ìC²F8Bs JŒ'Éãe[‹ ·N ïàiYßÈ€€Kgo/­nÃîÆrÅËõJ3FôõOŠfOµk(S,ñR(ý¢•¡é67S2*Ÿ%/ŠÇ×VcÐÀÞd3Ô6çúv€†írÍ0(xaq(…¸ÀZ 'Ñ7åWƒÖh—D×”d³§‹v ¶¤GÉd¿]_ŒUN* 4Ówãõ ¼ÏêSë7p˜¯ñp‡DdB›ˆ×3^¶­öžß«ž…¶µE¹a G&mƧõå§‚Á&cHôL%Ó×õ…V°PC¯ct/ÇÕFÈÕB >íïåª`¶†ú1~¸íwp/c³Õ^9ïIQx †dº£/[_+„UжUDÿBÐÑ×—îÖ*&‘Üô7z¡ÐölujÅÂí±>…QJ~GäB\Ùˆ èwº±Mß•C»‹æPÍû®Ø.ì9i ¯¹›²Ý"z uõ`·và t?ÄþÔjû4›âðqˆû `E9lœëMÍž¯»’«BÐ.pËG@rÛ%¯xOEm‰ë‹ÏrªâÝoø Ácu¡8`t×–|ªPy-ç¤é“–/‘–‘t/rtË>jØ»æ)›{ÚŸ=öSÏíG?QdÂ;_ŠoßlS±µV·¤‰û5ÈÅí&Åž²ÃšA'5?D®*GÒ-æó?xy0i½î:d•$ó²ãÞXH:o)×!fÏ> M¨ø¨[¬è!èñ›Ë#¼yquE"gËÇ…óÌÐÓä†Â½ÔjiBÛµÎ7È·©nš¢æAçP»ª¤jÞñéB…êr‡¨Ü’Qå”Ý??þåR(ŸÞžŸØ3Níâ{kÔ×ràgÉPX÷3õO²."ëj\3›ÇO¶ŒNN?œ]8/9ÿË9ò‰¹ p»·éaÔëìù‚|J"“] fµééF¾+®svOÑ|GÏ2µN%ÞåY»_¾åF%†RgŸ©â&úRõ+çìÈo¹a ay Kò0BN<¡ŽÅ@³«wV†½(Ó' ¬œO†èRdg-Ÿ~Ç;xÖ² ‹± GéÈŒ­”?îC#á%¡ö¬ƒñÓÌ%¥-&6¶RïQUh;uB=aš•Tà“ãg"ÁÓ¢è‘DãÜ’Ÿ°oùúø©ðèÅ`”X·bxÑ ,ê⯟¸ÜÞ²ïfúhII+…Í>¾ Q@:툌ƒ`›è{n0}€+º‚³ ¹ma·JÚöu¡AŒíì­vS©²ÔÝ ÔŽãß wœ÷¥Eò_8ý2-Ôã‚‘dR0‚ Õ%ÜvM†S”îNŽûŒ6¼b$=êã=(MزµZf»ÄÞA"{i·±^:ø5Zo&ÏÐÒn3í _§ ;¸fÔi îÃÊæÆ~¡t#ô׬ Sb«¹¾0Ø"TBeùNö3\ÐåäœXB}"°æØ¡zå–]a~ºnÖvŠ' |ìÆÛ…En|/#Ãè?¼WÛnÛFEÿd)CÄ;8zp]F“4°óX Ð…¶ Ó¢!R¹}}çÌÌRKItR4 Xä^¸³3gfÎé6ÿ>âÆy‡£_M<è›Á÷òŽhš§±#À‚¨k Iy@ëfäÒ‹vÑŒP³ÁËêmÁDs2B™_¦‡¦Oô°ƒv'UX=ƒGÔ¯/L%íéÇ©›qÆæ¤rVR±[XÃDÜrÍNÍÙ©)wM½øúòð2–9R.”ýàLʸ>¨…$.@Zb8&'•è>‚™³£¡ ÆçŒ8šoyÜ•ik(¢n¾P7À¶¡a®–Lƒ4õ8B¦ßÍ`ôòÓ¶Ð!áN'I=½ò¬ y !ÇW¡oðu‰Ê52fdH Cýð^Œù8¹vy”ä îvÃç¿QÆ(Û×–L¬-¶Ûz ÑHðòêu!&\9p€&‡tääßôÈÄ.âT9x‡­ZQgnk­×"íÙo2ŸØãLèwÁñœ‘77ÿ`2¶“2£r`õzFȃ37ÍN(Ì \±û)ä§iî„éó’ªÛ‰s] æ‡Ü÷”!ý÷®¦‚˜!!®¸HÏÛmøg¾Ž(Øm)‚.žCu]òÈ`µû>áŠÂâJ)÷ UH$úM/ •eŸ>9öCÿ@?Ìrëˆ`]UÉUGTÌóë);R]Eï}„Þý¿Y4ÏüºX¦ÜÈL++ s© yñ â=é\Ñ=NM½E°(~\j 0Ñ%¿HÇ2uË6’D-dÄ®¾Õ›•ü¾}#:Ëô×éO͵{u‹ ’øaý‡‘±iŠ®Uòù7úp7J™æºß.úØ-oíEv5}­Žªq3ŸxtTüeÔfQ±XËøE¥ –òóM¥Âë3 ¯ÄT4cÖòÓÅ”ˆ(+©ž®ÇɱM¤¦’4vM ÷@^œ ß¤½‚õ)]EŒ A}~&és|òv ý$W;¥¢ü0t.»¾¡~_{3¯ª—×Gꎒ…¾ËRÆ}Y¯!¢>8 i “Ãâàôæ—gs¡‡ÂÐü Ž f”°™Ãý=±LÅ• L b¯\›³³£PPÂä©‹Ó ‹‹Jóå"Ú"3ŠïQPâYâ€%ï *ËÔzwU½¹7gÔYâcdä#ß…hÚ³†Œ¡@yÕ#_,ón˯ҨŠãÜñà >@¯\0µðKм3ÆëKæ0éYýñCÝÞ·,GH€¯§Ìf®ñÞ/ã—Ì3˺®Ž Fž„¹ëWä,®`ZJ1šCsTH‚iFùa¾‰7¬z¾u†ìŒpšP§´åزàO4¤O˜±ÿ€$.‘–^æúyÙ;BóÈ]NÞíߘ¶é‹Dz)}æ)}]Æíóô'OVËú%‘\fÏ&ûJ¯éóA¸ïÈ>No ´µôz׎å¦ÀUÛ­>,ÖvQûPèSó\¬d–ˆp†­ÌR?)*c³ùí6U}ß[Ðm¨ä½^=êJ’'#4>"Œ ýŸÏ©~P×Á¹¹ÛÖ$ 3dLZëQíb©OM1=M¿øuKÐ`â¸X$Ë"d4’^ì:·[¦'~èmIˆÁM¤R¥}3 ñ]ZoÀÍ¥yG¬I„ ¦¾Ü×h+“—5.Ê#¼Ò.šQÂ2Ð÷êmaVõ†çd¤ø,/Ç:V;‚ÂÔ3ç M'4+•?NÝì´Öï,Þ>ÿÃDÜrÍNe èƒu>!˜¾çtîÄV–EŽ7’Αzc/Ø>|(™’9]+T>"𜗭аˆÎÊizNl!ôÆçÏ,`²©xÆI+û)&à§^qG¤3F}…š ª;s‘èTŒ3?wØLäÐ4­®”}2˜»ñÜC4æ”N‘ÿ%˜{÷\:,DVÕw#úË´¼¢Û½¬ø½^ž[tpÁY|”ë‹êñ}»=q§(ÉÜÎÒN”)û3ï…d×’\MÙ–úIeh!¿keÈMùµ è¢U͘Tó¢%C&"…㣠rX¸æï‘ÑÏÝ1ܡӰ£À W#ºŽœ[!ˆl?å+¾éaÒä=_‘—@5à°bÞׇŽ<Œöêðÿ üS†Jó¯7ì¶Ô{ÞIh_±²""í}.™åÞ“Î=‘¯uˆ Óq8~c–_ä ^¡ìå;Qd¦å¼K0)–¼q yÄG/y°“o×+YB\ »k›·K»u+TQ_Õڵȕ©¹¶çž/+þÄ-Þ‘“€~¾Zç†zÝ Æ¨ßföÏjÔU˰Ó5è™bâÆÞ©5U9áxΠŒ»qëæWtµµ4i¨-?]ÒÅÊYÿ)ºƒ)ÔÖŸíÈyä½2ìÃÄ“ð§ìDæ}øñÖêh£%”HoW(ÖÇû8öìG,b†BÜA!e(`É#AF¾™@¼™s^žëòJglœ›'½ Ù~œbŠÓÒZQ1 0'àß÷8+µ6ê  ]µKK{£Æ”ýfç<óQ Ó-•Žë'%ÐDQÿ²g›M endstream endobj 210 0 obj << /Type /Page /Parent 341 0 R /Resources 211 0 R /Contents 212 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 211 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 212 0 obj << /Length 5052 /Filter /FlateDecode >> stream H‰´W[oÛÈF_õ+æ­3…ÅpxÒp 4±³p‘MŒX/m²XPm1‘I/IÅqþQÿcznCÝœf taCœë™3ßùÎe^Î&/f³DY5»ØH…ðŸ$σ03åŠ,ˆò0V³ûÉ‹W}®=­ U¿h&/~º±ê®Ÿ„AâšÅdꛓúº4Ó8Hô]…ßH«$3¿Ìþ>)H@¡\ç²éž÷GEa+cAÿRQ&jŠŸBÍŸÔÍS3˜©uA¡WU_C3œîÕß~:Qÿü·™fA¬»z±:Q7õð­ê`E ‹×HtÙ,Í´€ˆ$èÚt¥È6Éôg¬ÍIÖäññ10qé$¢¨'cá·VpGé¾ö¼l±"ù—³‰UµšD™8­Š|tâH¡F¹êªÉíä%Y#ŠØ ÃHaÆ£å²mCpmMÁÀg¨ê}V"™žµünø[«ÎI8Åf|Jä¡‹ø¾~ìÁßYÍßD·hF§‡r­zƒpÖ&Öß*ÕÞj5¬L¸Wj¾nç꣮ꃽL„ˆ ‘E;ÑæÆL#}¢¥_W©rÍsr’ OTÍÂy×@•_¨_‚éÁªå|]¨*¸£Á ›i£ìèT): sW•¢Ê½AƒÃAÅc?X¦H‡$Û’!Û!ÂìÖ×fš½k<·Ð]? *é.ÈɲPðºÂ;&ú¸êô†zÀDÂ^{Í¢ /@.h¥1 UÒ2³Ox® ¨§.çcµ’¹dœKÒ|‡çq:z]Ê: Þ/Màã4˜/G\OÕesW“–©nü(Q®@¿‹ÏÌ|L1ÍÀh‘©"U¤W4ê¥àB°GÍCÖŠ”ˆ%§¶ ^/Ç á` W˼Ý1'‹ÇÞÔ#œ`²0f8³(ž¤¤à´îåʧ ^á²ïêߩͫXW~³—òpÑk†õ=Œ\(èw€xì(V% âØ%[GIŽ%Ñoäû¬‡²ñÖC솬=äÝÆ8¸Æ`"ò’,ȵŒ<ã%™K™5ùZu››R·õ ®6V…W,ÐKf«ºWð?¾ 0݆~~]2ÕûA=HS œ¤à¾²±¥2Ë&”j ÜR/E#Ãåý9eI1«Füã] ] ö.PñS">fNõsÛÉæ7?ûŒn ÚÁEëõšøžßqf½n‘ı~) ‰šï‰×&)Q2)ϨpËHý¾6]ÓŸŠþž„vôã(õc»­l,_£êº¶S C¬]V’¦Pׯ¤$œÉFµŸ©ƤüTP² q¤æ•_è·0"4]N‰$IKuV^QÎDS¢*ôÕÅùÉYù,´”°|.G5 µ x£J!‹ò ¤R@í 1GIÖyûn†4Éõ¥2tŒýhž”ëÙª’±{C…VÅéMzu ä$@P`„{dC9¨³ùú3]¢h=ç>Å BËì ØA]‚©º:W"|CÂÁ3°$À)Ù´Q|ð‚†‡j)G"s` dqlÍÚ¥ä¶+êUTXÜÈŠfñóU5wÜ«ywS“AœIýKæ’i’ÅcJOG–DBöE¹†žéµú³±4.(XÕýCÛWï¨=7TY}"­–uÚYql—KÞ¶¾ÅðâÎk“PDÄÕ€²âV °¦Zu‹\²®ðfzoW$xAA)¤bˆ:¼¹{â‚ímÓ$ Ä%ºtKéÈ¥¹D­KŒÄ~@(¦ÇB±'¾9]v³Ö€„̺}¬–¼ú„œC!ƒ°‹WÇï Ñ+N´z¦ÏÔõêŒýp@{!´TzÇ;D± À„cÕúŠWjheŠÑC®‡î\f¡ŒU2[í$…Dé!s#C|NÛ4Ëê–,Fü²@8ºsFw†xV¾1µ‰Ù˜- Xw¤¸ÛS|è6,¡âzÛ"ÿrØvaˆÊÌ¿9/û$.,KÔ‚ð?…Ôeè%oÆô·MMSÝèv[FBñOâ ß-xµ×¸úƒø±-ëß‹Ä $Á¥ŠGî`bMÅGÔN7 xÇã52zë‚&±ºÇ¾‚ç-(YYñÌÖ¨ðð—)›– ,nÏFä3æ%ž˜Ó¡€5—§y/s’=uäL…gHs… ®¬Ú5˜ÃÑ{‰>1§Ø§`¨®ÐUjq%€0K6Õ4DN.mÇÐÑUý†(SÈòβF5)˶·{¶ÌÑ–µÈh0ó,ZÙÿ@Ýu‘ÆË‚ ä þ‰šopTq2¯y6xäâ"<º”FY7þ. gX¡7“ýèœ×8Ï+ø=gKüuŸô^¡£’ €„H ’®àü˜B=‘'œ];>ËÆù×Ë·3©4ßÿÉ™ë_•¹1˜þŸ.! T E\†%TS~/Þ…w¦ñ«+Ê÷Tßaó•¬y%[þø…_¥¡ÆÒ;”j¥ Úv,™ã|§ä. ÖQ¯ •¶Á2"ƒhö•F‡Cx …`@÷ƒûáNÔ¢m Î@ErE5‰…p‚õæ‘^Mš&;e ó×+v%¿‹C-ÀÐY¶ûȶ5öZ”p£T?<¼Z•hD=a×\A«¿Pï•F¤¦;±Çk„:¾AñtQr·è3¨Žñq5 âk­„Á£*~Ï!K‚Â¥ÅdɘäÍDá?Y+ñ™ é ¦; ¶]…¡’æx¤úÊàPõ©Fé>ËJk>í¬ÄlãÃïPU`€MÝNü߯Ë=]±$]|W@qÝD“kz;Ü5<·<¢!ä gwÃfœ°PÞ…ÈW|=`R¸z†…6Ì“QOkãQÏ\⺪|ùÅ\ 9²=>]ÔÒ¤DŠ‚Ð´‘4ç;Ã=È…Ý»èŸ\‘Qc/ö#¼˜\1­]H{ïài¥a¶<Ë…H²¤z_ ƒ™¨£!†d޽^ Äo(*©¤Á3 ®T¡Ò)OÔ-ÕÖ-ûíRs•%‹-Q¶²45 ¤dæï·êT5E](/²;y°Å¾UwWW:§€“-A–wMÖ;9dŸt-e.ÕÊ!dŸL\#‰[wI‹KPJ©y= -:…+{‰¥ÙêßôM<*¨ã'úŠ£)"© ‹ØµŒV ³C¡nh-©C*ö5Àò…e'ò* 2η­!Ô̲] I%?ãÄ”‰ —È…?ÒJI¾»ôÚEÚÏršE[©XÆÌI›«ˆ_£û"³ÖTtÌ( ¶ ó˜x9 5‡èµ7¶ÅjQ€@h6¬WØÖL;6½`kV³~’n–í‰æ‚"%Í%`U5óuî[ʹHoýÎÙZøŽÛH#ØítZÖ¤æˆß½!–ïÉ›ˆLÅ÷cÊø«"ï¾:¡CƒÈu·¤{E='âÃ\}hÔvæJ^œ • kjµºF}«!Nx÷j oƒ¥‚; ¯µ\Gý›¼©Ñ7}µFz=bò‚ÖP¤}ñÉôH©z¤ìõH =’x=b!A2Ñ#…6 G2¯F U#ðÎEê(C¾R„“Vã¿ÕúñEÕJÞܨÅV~¼…ÏúqĽɠ±I6ªS LB…Ê«S’#6çu C$Pýîö« ”´¬O˜q|úô!âdZ-!½=g0>> ÕÆÍceb@µ8Ô^.°z§7Œ-H§™õø(³zgõ#Ë_ìÝs~áÿG«O«ÉÌÆÎrCEúÅוþ• “˜s2ÍdæŒT…ÛdôŒÛN/eØïÛ3>;58ê°”ÊW:‚I%æKœb‰ë±ÄKŒÇ’ ðaK¬6€%†bZÑĆÿ´HBÁ£ðBÐø¢ða<|Xú~É1|OKû5àCHÊ…GI`ðƒ’–3$†'ÐÃÄ%áÿ=vRÔäCøp7Ï*ñ¤£û€²ü•P%;"i6ä领 ‚7¥Ç<ý'¤"¸‘'¨Žýf6È É~¥eÅXréèx,ex°w6žB#ÃãIäÅ-ljO"ç³Hf}×Jà’3mhRz¢ è qC@?(ƒYrÇ”s…ÈJ‹íúðULlS›Š_¾£O)ˆö$x\­š@ñ°O ¸ÌÉÆX¼¾—²½Ô°í(FÑÉÃÝÓØ™¬<‡ª©#ÄE¶ñQ…Œž ŠÓË_ö{TzÏÅéa Š¡Z)q¶=q«8HœFÈO ÿñÙ [m7`¸Ëd“@ÑR(ù¤\œ“T|®}w+K™Z:FÕKüÓdýÑr“2¼ï/*™àñÏÝí¡¦5ñ´tÅaTÑùÓÂkÚE‡¸\A‹ÁãóÍ <°ƒÜmÂÇŠ9´ ×u\E¨:Ò`ZÃ4Æ„ ZJ£–%:4__ƒ‡áj¼á,¡:G&£úçÍÃ6â·!h\Éq6:‰å¼U†ßÞS)ŽD,7¶†ÞéPsXÍ_ª)½vSäaˆåö©Š^VM³ ]Ai‚wra3_‹¸ùVf’†TQµ¬2eÖ{o¾/—Öf£K»{PÃ-?m.b‰vZ_óýÈ\¿Ü­n6X_whoQ|?ÉêO;9œÁK|Üè¹e®hC¢Å²f ²œK«îôXó8ÐË/È*±Øºªü5pRÙPŒÈÉèäƒér[÷}2¯»Ûz2ЃQ5Lü8ü$HÑd’0Ž&8¼ÔP¶Qµßv­vÑzé ôÑôäúd›À?âþ+×í†i ¯¨Oâ"i,Û_¢Wt\ ˜fÈUÓ!â~¨:U”" Ó  þÞ°THñMâq}Ù—´§¶\˜á·Ìö…„ÿ^AyTÌZnÈg†ä¹U†w:Èý,.]^p#ë)¢¾è §ç3ry_­¹> áê$®è©?K#><ú…n†|´ýÙ“!VQÚˆ*½=:*±$whûâ·wÖ”Îðá5:¨ƒ–åÿKr ŸZ›(F— 9”±û( Ç/Ãxö¡ÆŸ‚Ó„ôÜNMÏœ“+í”ÝqÒlÐxFƒ¼Ë÷wäãêq¯½®¿ ôŠ¿3XPiš@çÔ2'X>I[쯤ÑÕjÙÏþŸnÿÀ"  AnŠ™˜ý»²ƒ" LcøMtÇe”j‡že¢W¥$ 6•l·Å¤5=H^oƒéQ¬pv–yz,S{,9ÝøúË­~oô÷(|òØæÓA…œ–þYÒd=|τΥ¼E.ùDyYM‚ŠïJz»ÁÛj³©u"…›Ô¼- 5¸3p|©_­ìÀ†ƒªº|”õúsÅ ™…7÷,l 8ÜP%Héûz6»ÔÍôçg®Yxu#“÷×\ÿk?\R.¼Rv÷'z‰ä\þ†ý½t‡Œ ­P/I­Uï` äK­¯´!d©I6QT¥\&~ˆ¸²sT9ƒ>-‘j‡Ú=!U†ç €÷+Xà(ÏðöUIj¯¶¶°ºfÄçøÀºà­þEàô0ôö"/â](ž#‹ÀñuF¼÷ÞŽhE2–æfGÿ¢ÝúYYî9Xèé{Öeù öθ¯~½‡‡ª|Ó¹Ü:Ö!©"|”ÎwÒ.üœß:½2uY ®"ôÓRp€·jSõ›Ê/Ñdÿ¢ƒ›:f¾zU¸ìÞ—Ü©¦¦rßj~GÞæ—æx§úÍüäãÍ3¨q/¾¾Ÿ@µî©®óTzq.OIÄiC·ÎÅJøIP3µÑêJF2âF—»¿ßØüÿé·ó€Û÷«N'ç±áÇ¶àø€ì»„3L(OTq†WØ0%WX¸t‰!€§wÁV ª©V ˆ}ñI1‡¼ûé›ÿ ü„gª endstream endobj 213 0 obj << /Type /Page /Parent 341 0 R /Resources 214 0 R /Contents 215 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 214 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 215 0 obj << /Length 4515 /Filter /FlateDecode >> stream H‰¬WkOäÈU¾ö¯¨ì—u­º=®²Ë„v±É<HÑf'™n7x·±‘í†ü£üÇ|ȹ·ªÜ††e!á®×}ž{êÖO—³W——‰Pâr=SZDøÃ'Éó0Ê£TdEê<ŠÅåíìÕqŸ‹eÏ{"Ñ/›Ù«7J\÷³(Œ"Ú³œ-üÏûÙ¯Á‡R.â0 ®+úê@$™üÇåϳ‚"‹Â"…’8w‡níy‘(ú•ZAÿ:б O!®ÄÅC3È…ÊÂ"¸©ú?ã0 zñ㛹øû¿å" ã «—7sqq_ÿ¬:ì0ؼ‘Pe³’‹? ’-b·Ù%­B•¤Æ—'Ö•³5Ö’ûûûPÆaôH¢¤Âÿf¸J}íì¶å Ë?½œ)Q‹™N©Dœá#0ˆµ ‹rÑU³õì'Îr: DÇFŠ~ #¬ÌD¡Im´v™à°'dhp^ Û®éäåo,-uÉ ó(ƒ6ò/IÉ;uêCM§ÉêëÚN,¥Òˆh»ªæ¢^Kx¢‘9\jmRÑþÎãP¼kŪÊ^+A%#ì@¸£íÖž]‰Ú-”2alya¹¬Üد»/E5TÁ½D† '|³ñÓæè*ÂzÎ!ÿC¥M¨*Êdáœ5Ú9ûJ²à=ÿ¿$ØäÁé ›s?¾¡HäA%n¥ÊÙ„/»a‹üA÷`w‰5bwXžIU@â Ë=€Ûn¸Õ$Æ·{Jø¥‚¡<òZ¶,¶k+‚«Êÿ*¥Rˆ@k.ËA¸•Ø´K·âL ÅÎÒçÏ_¸õfùö¯R%˜ñ+Usm—jkbS¹Ú ̤ñ™±:síŠBf¡ jJ ʇŒ‚%øÒKþž\Ïá+ïëïÚ¾zÏ¿¯(­ið§sÜçNmœ˜¡²ßÎͯ[{ʇ;®z·ÑÍ·^zµt‚È/š@Ì0l%A•ç¬uß²¯FÁœuʯÜÀ¤œ“xQRü‚k;*ë&gR£H½>ÑTÕªq¾ bhÅ•×PnØ—<öueåÌ'±OÔ|[ã‹iÁÖkqi™º¼€(”Ö$ÆLTŒÂšçÝPœW¥,0^I"«3B&ƒŒ›¾ŸNß¿wv˜$6£–Ce”/¥÷À2 è§Ò -«j|m÷ÖV_óˆ°°©‡JM©£MvàwPëA|t¸©¿²´gç6ÕL2êqjý‰ïÎí-T®ÿËf»K|¼Ï°Õ—9™Q;F΃ƒr³YCÀW9"ZõôÃßÑ>äŲ¾·|},éîj›B/¶ww­½?»Á­ ´!76?äN'2ÛÄSÆ68…ô{Õ}”¼dkðÅÎ +ìu—½ú(¥ž^îŸNß¡J] ç¿È¹ûIø™ I|8í¨72Å·%JÈÜ@œs§UPxíü;[;:ø2Ðõ &q_Ds¡3ÄöG©µ£!Ú÷€¯!æc`;ÑÇNcc?^œ—/|,tdc¡“Ö¶a#_ãi¿V"/dÇÀeǶ†_xvxÖ$Œ#5‘4ii‰ æâl¨nÏN„ë­¼ q˜*öŒÅÔ†3vM£öž(§¦¸XG…Ä6a…²gç@[Ûïî>0}·5;AØér{ñHѸ'™QúÈB-ßg”ÏÛ…ïN³Ç”H)e¹àŽtÒ—~sÕ¤ãjb õ¶“u£qñ%/ÿÆòD·v‹Îs‡ŸYFCýB­DS>©&ÀóÁ÷ÍcŽòXÅû¹ #kŸ¤þ¬!xò•Oôƒ•ö2ƒ«5*Ò]fõ¨‹HÌ6””´íŸ¢mNÍî¼2#<µvø¼jÛÍSt¢Ì dì<ÐS½¯ùþéú½‚…ÅIá4r|ÀH>L¤Ñb¿˜´W0võ+€yþø7–½nô¶Ù×óÂú‹1 nu½{Mè]+»jý„ZƒSné™hc ϱÓ67çJþ¿¢{[ãb/z»ô…ÿÓóEþ,¹Ýw þq Ò<>f:Û;°ÏÐ`á7™¦ŸèÖÙKµSí1꼘ãyj¬2Õv&Œ=Ù34iL2³cɬº_x#©þOpLƯm¡ÖŽ“;ɭ䀾1à«—Ð÷â"ß.¾Œûç}ÕëMb¨øïWÙ,»ú»ž?þåIDÔXo¼sÏ­çÖQ”–ÔB…Qµiå¹+Nn>Ÿ§{žDifóþ¶¼ó¯:ꢵí²4?@n¸¿TA³¢ÖR55•´ãÀîo$õG7­ÃîqhOáy÷ÅnÜv꩹ÅÖÁ[n½Ñ®ù݉þV¢KæŽ/¤eÛ<:<Ê¢W$¿×®°ݘ_$„Øš¾G’ÅØI4YÔò;==¸­æ“÷l×n‚Ú)u6_ {O—±Rqa£Úã®RÚêb ôºuâ:~8!H´­äæ®køù°®±F>اÓ0yO° žS ½Ú|ÌÏ#"hš¶¿zZ÷ÊŽÏØ¾Eo‰b~ùQä3z2#À¦ƒ‘¶ôHDn F’¤ãíM ¹=ƒL.3‡HвLÒ÷h´>õdZd¦˜4}ùØ¥;.厜Rs#sè /ÒDo  ì*­ÚÀƞؾpÚ8“éhüäA½Gž{SÏÔhnÌ”ý<Ëâ$ïˆv· jŒ·@¨_ò=€÷':–IÓûœlòߌþçÿG¼—¤6ôÞ´”"÷Çá¦]–Ø;?ììCM,©C܇ ó¢t³ X‰Ã5a_¿pÍ Mø(ý¡ÏV ¬IÈì52m¤KMðmÂ^†|?ì¥Ýva&w§ã’Àî^“tÿÒC©ì¨2‘·¦’ Á`PÁ½-ךw ôFËÞñh„òBuÅn#jlAä5Œ·±Ï`ÕORy²üyŒ|_i×…âo%b¼”ª»áXvUÉ>,]Û¹x¶vÓÚH Õ<7ÌAV†ÆiLá#mCØ`±y)N ·UX°ZlµS´xþŸÆ ÏØÄdùÿ)`\Ts*ªEXà“'5¼ /TŸí=ÔðGXÿ nø~¨‰ã t÷’ð3‰ºŸºg˜üˆaû*|ʪ‹ ÏM͘PÅy5l» I\ðZ’ŠèÎF3®v¾ýÉFêùb¼‘LF.I³ lë±Óó”8HjÚø–Ép£H‚…ÌŠð}Óú °“qÙPIŽkü$3\h±Áœµ[(ÇûŽ3š”éÄmôcwšìçrñ˜ÅŒg±’À[Ÿå‚ààFõæ?ì—mkÜFÇ¿ŠÞEWœã´’Vº6ÒØPƒIC㣜t¶àNg$9q¾}þ3³+íéÁ¾>P(ô¤ÕjW³;³3¿¿yø¼+èp$L€Cüõ®ÜÀ;|½ýYM`jý÷Ù|n§mšò–»4–MUÔôç’L¨¿B•ƒÊÑ>¬—“¬ëèå*ÔœëT’ôÞ“uÿ ж•¼i²Á6Û!*Aâˆ!rÂôfËgŽÒ|*©Š²ŸœÏ½JŠ+_X/SóŒï^\/µVÉ_÷dZOF¡Ícï”a‘<îJ£êª%ã[8ª¡cH ¯XCì5öÃÛʼÌÉ?¡o‰\ŠÊKÎJ|r9ªs´­p¼SuVAWCÍnÿþáâÜûõÝÕ'ÊÁ‘%p’âãZ*ê/ 'Þ«ûÝÃ-UHâJ‚¿ºÉ¥ æX¬ ))—¶yY¶Wà24R-«×OSZ²ÓC‹ÓûíF/›~sñŽ(ñû„]÷o˽ì5öuMÁŒÒaFõŠ‚M(!%ŽîÌ¸Ì °½LGV3†ÊD‚×Õ!#…s¼ Ž,²_¼¸b¡wp–hþÿFþ3Ø™ñ%;é¥qÍö;uªLÑÁÍ^,ø,²žÔ :MžÕ NªêR9±u¯GG 3E]#+ q¦É‹3¯Ü †pü#à„g;|êçˆj]°gÀ2Ž%p.€|ͤ祿XÞò›åp\aÚ2ùíßìæïÑJÙ=t"ö"ýÌÐÚ°ß7z«¨8Jû'¶Ç¡3¿‘d#Øl Ós·T†•ï®mGô¦01›²©‹¬-rqÉ\âW1€Iÿ'aQA ©• ‹½éÑ,jü…p‘¬`¤7@FÚ,Ƙ91hLLÃ@#í{°ÚàÕ™o*¹Ý`Yä>Pf.o³{¹3$EØ1ªè¶U˜ùö-#‹–ݤöÃGó0FK£Í¦Ñ²aˆtÈ’IóD´ìkÿJ…–-3®„”™HÈš‘ò=ÍŒXû[d©¢ÀË•[Y›Ë–3USœªõÒÌ‚1R:ÍHyvL”Š(h–æ{‰ÛLï<·Í ¦Ûùw‡ejrðD7¨m&èWHÖijáº×Úê doã*zöSV€Žé \R¸NJ†NŠM>ÜŸsªŠ…ýýLMø)Z»z'²'2Y÷‘D9ÌšŠ*IؼɊÃ~¾X9ñèÕa#Ù&ãæs®ýÒ¨™mšç¬TI·‡¡S䨥—U.Hÿ(¾Ž —¨“ÎáQÇã]R~Añ-¸Uµå¶”Çz|É&•“ZEË(šµÙ^Žsé}"Χ‡?ÓmÿMÉ[=è3ý§é“ EŠÖNØ÷š2u Y±(àš+ê„ ©“ȯ@‚™¼¹çÄØB£TfKÔKÅÀEøb½Bï9"hÍLÁž¤$ì…=œÿ¶’h˜âN–i»çtLUFKh_ÀÆB’$‚#)•óÐ2ŒÐÏÇ¢‚ÿ;XÇQÂ!MAs_¶ÅþÜ<·æÈm´-”ꤰNQY,-Áþ\ä¾!D<Í­ÝGAÓ¬›‰e£ŒêªÆJ;ÁHEÂXiµá}áV¶ ¥ÖÍ„í<ïÐ+áÈ+‰™ËPÏwNÒõ„b×+çÜ¥ki$º‹ Ô\$b‹š˜?!,·ßøáŒ’Ž>V€ VI}E] $1¼Fô‹Ä65 ièLcEifé@cQ¥…ÆbP–¾˜ëƒµ endstream endobj 216 0 obj << /Type /Page /Parent 341 0 R /Resources 217 0 R /Contents 218 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 217 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 218 0 obj << /Length 4898 /Filter /FlateDecode >> stream H‰ŒWmoÛFþ®_±È—Û ,†»|ïù 4VÚ˵—µ‡^rhje±¡)¤b«ÿ¨ÿñ>ܼ,%Ê’ì°¸/³³³óòÌÌÛéèÍt -¦‹‘6‡?ø„iêù©‹$‹=“ú˜ÞÞ\·©(Z¢ñE[Ô£7?Þhq׎|Ï÷‘¦ûáÃè³ü”«qà…òÎâ×H`«þ;ýÇ(#™H|/‹á’ u‡îù¼IŽbfô‡0¾Š1~2q»7ÛºScx™\Ú¶„aà%²ßÿx!þó?5޽@6e±¼7e÷»m€"âJÁ¡Ìë¹g0–$=›žd´§Ã8ùtÂÒ蔤aI<x±l#²Ú* ¿u·„7j#Û²ß`²bIüßMGZ”bdb êÔ"Hà#`¥¢±£Åè-YCÇÎÚƒG“h4›ºd²¾ö¶ Åi§¸$dq?¨^ý‘~§¨–X¾ûN(p7_*H+î•Î<--IK7])¿ÍiÄbÕˆ|ž¯qÒÙ9­µJÁ²MIŸúÛžÙ†N·¸µ"¯ˆ¢Z ^cd®|Ùðl.ª-ržW]é‰éÒ )“7´TÿüYX¾ìnÀìõŽäʲT•ØssFƒqã-K†íÝ,§"uýE¥r<"Y¶ëUk?Þ*m@¿‘ƒe°¯S/•NUŽßÑ\Ž“Ènåå½Êæ­ºSùóÌËÚÑ–*A.# -GvW%hVÝ t„¼I®‡Œ<ñ4¶9$²hdÜ”µ»²‹’3× Ã×õòv›¦fb;7,–yÏÂÉ3îíí@³¡Þ©6<ˆ•ÑÉ á=:yÊNžO3à ÉØÅã,‚ @‚zHè1aöîÃ!@þò+IJœ žÝÀ5Ûw †7jÊ€“­Ô8Ä'ÒDP˜ÞX SŒÜV¡»—ަæÏŒ¯—<³Ž´ø:QˆQòÍ-•…_¤GH~}Ȥãeû袺ñùé&ò‚$ˆ†P“ ÔÖ^ÓmhP8![üt¶†Ø>Qeè>A¸3Bö:Kœ_€ŒÉ…¿W&†Ïz}½ÌU„hù œ%920eÃŒù„•Éoî[¢ƒ$²°ïQÑ0š‹™úI/&ò’júBdBÒÑbSA°8Çw£x·Fì`?2™—†g¿°½» ™º]xÝñéÓû€ëgü< à ƒr4Y¶K¢¡ós4ÏÞP) áM¼{EÇöBÒÆËÞ§& ð Ø ’üÉnÍcà%;'ÒñN"ô^”Cn‹œLㆠˆfä'tM¢áì„+p†‚Õ«ºÀÓDÛ ¨*ȆþòE:LœB¸ž³ÙÙMtÞ<ï-§?¿Ûß›ð=ï+çöÿ\ Ç‘—˜½ã@ˆºXÏÖèõÒ_´uŸy FsÂmH¼ù-ïQ*€ÔÐ'[cÖ0É`ôn‡ÕB\rG,'€´UbÞŠ)àu&'WŠ+Áé$Ø¥àPÛŽ©[qéÖÁîŽöŠS‹h!]d=a“†ŒGw-XDq™ŸÏ4e+êov½ÆòºAÙyü>µÃÍœØÃÛËŠõ–b%iP]}VïJ^lîx:Æ¢(ᢒÄ(©ÛðVS‹W ‹ÙW¼) A39ä-Ô”ËùÈü³¼T˜![x¤Dxä_p)Ìc˜²ð»?Þe„( È ÷­„fi)»*W©L/‰©<Âú®eÙy©\ÕD" 7è¬Òa¾ìŸ1v÷>y‡+ ñ^I®Iþýä !g 3àl–¦™Û'sH2c·TŸ¶®J…ƨ湘ƒãW¡¦x?LÃâzœJ&½;z„„œ8Þ?"˜ú²UXÀS~RT’l]n>a‰LGÉý{T1ƒ'¡ — ”/ ‹Š8š2H(èÛšr¿øªç>[n¨ì¢f_Cñ^ÍüSÝY…¢Æ­„ÒývÀYlp‚oÀªÇ\AxÐRδ]Þv¼ŒH@J/ Û¶¶U…:¤Žc/ 7?Qà°Êa—Æð³Gƒ¾3Êö Ûu`~ßS.ìµt@Þ›’÷Öô]¡ŒX/â¤@ŸŽ°‡P %–°ÆmÞѯ€:Ü˰èzfUNŒŽµ?ï˜Ùƒ-þ-‰`ÅœÅ{²hÐsx<`'ÑJÛõ¦ÜòõP*XˆL9Ð}”•u‡»î•«œû¯à{óó]Ö+…>f5Ÿ²ÑØù)á4$šÛ4Ð+šYȱOs<€°8Mz†«Ë_,&/¿Ã¸?}&Ý™ÝEŠ=:“+"$Hlø"P\Öã‚0`ûm9§éõÐ[Ó싺å øüºÚÐâ“”L2CäÀAI5Yaó9ESˆžq=žRó@k‰¨vi†v‚7ù–õzÕtvþWáD@X‘ äÕ–»Gºaž)þ\…`óAã§{ MYÿ"ÀºQýï&4éó~V¨ß_yãßÎù :Ha>Å4–É¿óæ%èï)¥àPÖ³9ϰv UÔÝ½Ò ))^ȳ}ùÁ“f5~ }³ f¡v¾®a…¾.á¦üÚTîø ûÕ„úÕ€úÕˆÐ>3Zä~1¤c6§®³o^ÜDl=<×Ó<ºëe3îeŸ#$©^·´±Çf@‚tØ}œ\ƒ£b€w þ@>:Ôz¡›5û>$t³áºYÌ»†DSCCC‚œjDÒlÏZ»4× ©±ôŸ¶-¹ä]©˜B?@T…2¿‡ú&9îU R=ÓÛF`¡óýåù]lVÜîùnåÌñ¶wwÏö¶çöÏö¶a¦q@añYNÞήóÊUœ•Âô6/¨Ðò+º'ìúÄù°—•íõÛ•ûñ¹ö0¼È>óîó»¨s·{^çgŽ¿°ÝëÜü|Få§·ÿ\‡&Pö†{p5¥ ¯Oß‚C,Щ]û2·‹|SÀ‡rßÑ0Ô'VQÎn[lC Ð¦‹{Ì´õ¨e:ñ€8šq³IfXñDÜZáXæ sE=çYuðm/ÎþÖjÐÊÑ/‹|Ía]B_|-qi°–…õ^4E”ÁÜP9H¢ó‰Á3XøÑÔ|¼cií£›ŠÕâ‰B ™žn ¹Šð´N]1€©‡Ú?LÛâÓÜ6ßTV<”¼ U 3$åð-›ÔÁÃU]m¹4¾PT3•tdbfkE‘m¾1ÕÍzyÝáµýÛ«5ÝmÜšB:©±ý ¡ð]­Ž°—×sÈšîÀŽ”OÖ³á+®ú#,X‹÷';>ó©ÔölàsPÓ׬<ãÜ4 \Qç7Ö+t*î/7îré:w‹tO,g«Å¬S˜_—v¶æóGŒ.ùì›uE”j'Ÿ½Lð‰/Êc*7¿@L™à lÀpæ©iÙÌÞ§&Žu ŠçjÛc†¼µfáV<ð®DçW²˜ˆË÷;ܨ©/òg͸-]Åžvæb˜v"êË\^ 9ªßõ½Õ“ìïœÞ–Êi+`E4”N¯ìCm啪fâ‹iæQff¨,ûe—&eϸ,ò” håY2Tª×R?ïÉåô)÷|Nà'›ÛQ3"çô(R§_,ØË‘wO¦Š‚±¦\ª"-ê<äËëRBY5Ã8J–½ é¡£ À›÷ŽÐÀû’ÎèÈÀ¸VhŒÂ!~b‰Dð‹zÌ€ùú„G„YbÉÿÍM °%%̲ã úV6ù'ÊœRe¦e„ œ8&_·\v—H¢2É´uÒBæÍªVzãìCˆœÚV0~)ÚÝòµ©ú‰Àz··¥ž°Ö·»…˶Ÿ…»$+nGb5kJõçž?œéÁ@ˆ¬¸¢hšºAßõ©ó‘LŽ{ÐÒ˜"e@Ó[~«x:7²¨–>Ò¡o.b=ÜPŠÙ-Kg»« oE~Çÿ®ÜO2-hh²2Ò g^J`)@gûó1ƒu¿³»…óSOŒ_. ëCu¸«QvP¬=‰YzŸ7üyŽÁ¼Ðf³$Á¼ORôñ©ZÜ¢P¡!ß,&\Ã;Óq­.ʨðŸ/çúF— ¢F¦{ͪ¬xÀ“ȆTKý§àPKɵ1¤’’ªCýCc'v9i£$•¶+ºè¨âiQÁȾԻåÿR*Íš×yñ ³!M.‹Õhé¯é´¬}Ïß/òžx$_M òãÆßüÔ!/=9UoÍ?9™ïR:žœ#ÿ¢§V%zÈ kÆ‘KÖ-ÿwºs¨Ó÷æ4«ÊÝ…¾cÿÓ©aå.úCÒ®@sêÉÉ t¢£\_.ø¥PsÆ¢Èab¥@º?KSþû$ˆùË@k%ݸ’~NeË{åà"Ÿ=õ©+uvÇ€§¿*¶­í}íÛ>¸Ù[ÜáÎù3RƒÌ@X0ºCMžÎô¿’÷Öºn!BUÕ‰Ž;½‡,'ĨÀæw¿ón2€þ_(~q†6á-¯E À\ {QÑõ×Ë 0ÕMþ¥ž¶fªF‰õïEÅNã9:SÚÔ_7bÉÕƒ°åq~8sl<|͸ϪÞlAÄp”á¿dÌ!VÄlE¨6Dbz—<;^ªªFñœªþ^.H4ó>9¨çQ×'’àÛÈÐ3 ÷2?TsÍn8c®wqÅGGÞ·?eÚ¸‰K–?Ö6 §R-¶YW¼ª•@hyPÖkQx*¡$K*ytò8!¦PȦG™§w"³ê$ÂL͡˹\8 œdÑxa:ʰ"!BrXÈ1!kLHãŽï}í Nê”ågW¿%v6O}„ävª3›š)ÿ7Åo«×¥QÜKmá1’GA6KíÑí¯ˆÝÙugûóR¶L¤/Xvxû+âÞ+„nUˆˆw¯uPüñêYq=‚›‚9Á»nò÷‹îiQ†'Œó@¹€¹ùs‰X´XŠÕ6¡r0Äp$ø*Ù¹¨ 1ÎmÚí7r@-剸̱ýï U·Óïªd€ä–Óózí^+k]Ñèq/ÖDÜK­XÈ­œ®~åœÛüŒhB9™crùuÑ0^ ¡€z)"Æ}š״ow©Þaâ`…˜½#g'TNø^”‘kå¹GWí,¢QS ýÀøJǤR ¦e’Gƒë1Û.S%_ ~Æ%l‡ïÑXÐÀ¯bNv0Û÷w¨“§cêD.`*ᣬ.¥}ÀHËFŽGL£x\ñ<Їè2ˆYE•²¢`‚ÐÞ´bqþ<åÖa ‰Å=Fµqœq»€K¿ý)dçÚõ£½¨”‘TŸJ½^•·û'ÏŠœ!ø­û‰¶ð7@Sÿ pêm6'w Æ ÍWʳdß'ñ¨Ç‰K±K6BLÄ¿Ö[N6Ê)kÚ R¡ŽüãR4•o6G¶¿"=w­ˆÊ¡݇äÔnž—Ê$ÓR‰B F*Ð_Þª\N"ï3Wà*“;Ÿx EÎKh‚’žG¯rTÊné n<¼ý±;;˜£wãùuíŒ\3\Dס«éÿnJêœíg»/Œ„Û7Z 7U©‘¡p^÷¨CSËË å_T•vѲcõÅýÄϨkRÿ®M~s+›L½í6[§i£{»;Ý{¥ÇS–‰¦v‹Ëµ³¬l'œÞ¦Ô#6•;¬ š›5 KÅ»1¹ÞðfëlØl›^0eÄIPt4uçq_š•“Ôë …Ì ÷ Akró½ÔI}˜‹?ˆbyW@ä´äã™9ùp~~vjnÜ®NÞZ›Ì¥ ÖË/ç¦ ßqÕ„ìV¥lX3s²p(ŠÚÎÓÕczlÔ€BÇä À÷#î¥|Ó¹Ëüª‰©‚¿ ÔP–þ=¦|å† endstream endobj 219 0 obj << /Type /Page /Parent 341 0 R /Resources 220 0 R /Contents 221 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 220 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 221 0 obj << /Length 4168 /Filter /FlateDecode >> stream H‰ìWÛnä¸}ï¯ ò²Ô­)ê63`Çž5f‘Ì Öý’¬Cî¦ÝZtK†$OÛù£ücRR-÷Åž]lhñR,V‹ußÏ&¯f3#”˜ÝL”üàcò<Œò(Y‘†:b1[O^v¹˜w$‰n^O^_(qÛM¢0ŠPf>™úæfò‹üRÓ84òÖâWKaŠàﳟ&)(D…E ›Ä¹[´æõ:CUØJYÑ?…Ž"#¦ø)Äõ£¸x¬û`ª²°KÛUÐŒÃLvâ‡óñ·Ó4Œe[Í—'âbSõÿ°-H$ ¼ `#ËzL h€J²ˆÜ&—´ •I3èÏÎØ•“5lÉf³ ƒ8LeQÕc à¿î—à£Ò²«ü‹Í—¤ÿÃl¢D%&:UN%â >:±hQ.Z;¹™¼§ÓК£€èp¤°¡¢”£•¥φµ= ´Ô ¡¿È· ˜Áþ§A¡h ZdøûŽŒ‚­TÊ[™0OÃN£¦XmS±çb†‚ÊeP€z+º E•à¿Æh$°UMM"bî=„"§ÍݶÞéÛwŠA7éò(…üm‰ç™ÈÕêÇÊ®Üé¸P¨$ÛºÀÑ trY$úö 4 tˆ×¢\­¹¥ä DJÉ Üçp›„NÙÈêî K©–Ê5DWÉ;íéÈ Ì…õ6”š™¬y·îÄï± ”ÂÁ®×¼Ô›âöãí;§wUºÝœb'ìdßìSóK–XuöõŽ«_òZ¼}'þDÛ+é¿bhÔO$`Öý÷»'`Â8"ð X1DG³¾"@ˆï÷,ŠC¸ñÖ ‡ƒ¬` YÁZ7m€–=î‡E§n5åe€‡ Ø“@ %Ò¼Aáf:/M&©Ÿ4I‚°5šNtææØâçgý¾œÎï˜%³xö»/azß¡Á±¼`ƒ®«¼Ü¸J«Á_ûùšGá‚+ ïÖˆyY;®F`â¯É–¬hGVšùü¾  —½ \YCx@K_aµ'Ë7TN+tªP-Þ2FuA×>%ÒD±~àﻃî^»§,m8ÝïN[Œîò—²uÅŽ‘Ø–y,[0ÕBÙÞÌuûe~z Mž|ñCÀ\‚FÃÄì‹Ë-¤Dùp’(6zª›°køçóˆïp~m©¸ÉÇV&Y>®Œé`¥qVžUˆ9qP‰äà0¾™—½]ˆ5¤G)û:Њ >QZ±FøÙ;e0{§ü€vð4ÞÁÙÌál8ëGàf!6|hù}ÓÈØ sR×!v"×èˆeTN¦æÏ ž3Zêôœ¤gïýVÕÚ:ð=øë°ßøøÂ‰‘?³Æ¤;¥ËŸÉ†Á»æOéñKâ–œÀe€,ëîîtÉ­ö Ýk(Zîƒ1l”Äcûâ‘}ó{ô³-Å®WÍýžI0 ûPlðá‰rÇàl«þ0X'€¹9†MÇgÝìq\<²ü…i¿·IÃü7O’]4ùŒY??; HœëcóßÖI¬ÂBoÁšëÏtüº<2zZ"Hô„1ÒO©B-H•ê^œ‘èû %ZJðä` «hn‰4dfGE°(ôh”94Êö_‡q(§Gdþq(Þ‚z¤F@„%l0€c‰•D.:¶‡ŽP„à==îFuã˳‡$¼èP9[¼àXÖèmò~V!Wfß ð8‰ÒÝ:4¼ 7 |äFÁRP-±550BP§ùS9Öi‚° õª¹A¢B4çõÜ­hÅý-±ÀÕcäRßrx qgÐÑ~Szð^ÊÒ¼ ²ø™¦óÂî6jXI %K¶ì2ØGIÀê?æ9ŠÉšï>£lÛ6­˜ãý(d³°Â@zåüRþ0bàæ5¾áÁ‰Ý:«±Lcï28Õ F¼¾[ÝÓà-‹T,rµ°_©Qxyç¶\P%åš®1‘ Ä%”¦ahE>K£ +ìOò.wwM \ä0”Kù)PxSšÞÛNKX´[þÄäý%å“–lpY­Êë•S~7æÌ[â¢2YåhT¬ o“°õ-µ*„6Ì ÆçäÞ¼µÀ¥º€@½êYÄu"FnOó2 Û,²fîè´Dä ïI|>·®Ï*o0ñR7¹Ú˶}ÆDW.®œqYsÚŒüjrù‰«ˆòÄÃÂ\ÐüãHjv†ÇÃÇœhÆ’Ëþ,:¬ðœ'ûOM=§–e18oàIø(ÂÁˆäøÜMxþÇø߬©—'H¨ EM4<‰ÜÿÞ%ù>Q|ÝV¼tdgÍ!Höù¨O ý 2ð„Ré1¼?>‹DÃÍgG–¿0í÷Ƥþí³dÏ>cÙáå/LQû’gAÇæ¿AÍ‚³Þ² åߊڿMÎmO„ÊûÖXªc¾ùPü(æÕ' ƒ¡Å«žÈ€Ž’ýÒŠEÉ2}yíZ ÅG$JškC‚‚ÁW‡;@ÅiÞñ¾§áª¶nÏÖ:m€?,Ò‰²v“¶e+šöÄ ܺxdñzþ—?Su¤^ÅGPõ.óÝmºâŽp>:߬wÇŽk20“ÃTXž1žU߉fScåA–Ha#°ßƒÞÃô/Π˜¦ÿ§ßBÿFèhÆœÁÈÛ=«x’bT£“Usw€â‡„âk‰M13ˆ<$ìzHØ‚c ó<‹hœœ9­µüñó#• 4â³Ëi0càŽhéµ´4‚œ1Ž…žŽ έ"…·µ› õ 7þ•ÜØ±í#ír†8d°¢coŸ&"¤i¼õßMã-˜ázÂã'ÈéJˆtÁÉ&ÀÆQMÌ« šU0óÒžy‘$±a¢_Ó/œ†·Ú”nµåäŠXR«¤iM·*µµ,!nécÝtíz %[ƽÅêgzbF)¾ºPl…HYˆ·{測YŽÖìÙädnGƉF™i£B; Vw35qVõÌnˆIì›wïŤÙ»#éšË¯×fL¶LÆ„û&Ã!½*?ê—òæÏ®ASþ•& DîÞÀ`/n_zÜ~ÿô#Ývoz‡n ÿ4¸7yo+`K½ 5šTÿPàò©,“ž“ö¹¹b¸eƒàX@×1>‚œS÷Â^/œfü™ ²»šý3Ýàâíyuç!ÌÐÀ†—Àî°& :pó ‡b#`]¶¨°b¥Ç¡ Ä”-O¡õèï‰m¨hò£ÿ!úµ½OÑ\£¥!n쓉Åàî¹¹‹Øñ(MÆq#“Im$ñÍ ‘2‰M¯pvx³q áZªÆ2>‘,1LŒòïh4ꣶ„9kÀJS!wd¼jÆ«Ÿ×ÒPæòî'ÉÒt?0žYü…—”2 y§H“;Gƒð•"Yâö¤w-KoJ¶ÚlÖå¶ÈuüÖ9d† ˜Ï Ýq±SO>Tà!…±6/ûq™bÑÛäóûKçöæú+ Y¶¯+®FCöPÞà¹kX²Ì«KÉÀ«)»(™[%om^¯dÇ׉mF’6h÷¨g×»í+ Zª;¨d,h¹tmÕ³¨oO)h{ù?ðÇÐa?ƒ÷2ÿkï0ÿL?Ò­{gäæÕ|.é>Vÿäý-…D¶d!“®H}ý§%dÀ–¼_Ö$u®'[šg‹ZP˜Ò4û ­ËÊÑJ Ð"¢© dä6C%%häç“j‚„K­«$ ãûgñl\ endstream endobj 222 0 obj << /Type /Page /Parent 341 0 R /Resources 223 0 R /Contents 224 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 223 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 224 0 obj << /Length 3957 /Filter /FlateDecode >> stream H‰ìWQoܸF_÷W÷rUDŠ¢¤\àb;¹±ÄÒs±Xïʶ [kH²×é?êìC¿™¡veÇk'm¯íŠV$gH‡3ß||9=L¬Òjr2ÒFÅøácó<ŠóØ©¬p‘ÉãDM.FOwÚ\Í[Ö‰U;¯GO_juÚŽâ(ŽIg>÷ÍÕè—àý,'‘ NKúš@¥qøçÉG/P¨,Ž ‡M’ÜOºù&£¥¨åd¡¿)ÇVéS¨ãÏêðsÝ…cEEpV¶šI”­úñõõ§¿‡c%ASÍÏž¨ÃUÕýµl ‘Bù<Ä6˜Õ‹p\ %Ù">6ÉèH[—¡?ÙktÎÖˆ%«Õ* “È-V¤¥>‡ÿuw†3j´U/µù¯¿7iU©‘qîÔ*ÉðQè$F‘E¹jÊÑÉè%߆1r¼#ž¢†Žx+s†î†Ýµ¹ ²Ô’¡¿ÏCi˜aÿ0‡+–ð–…ƒÊù¾`£°•v²•ò4µrhZ)Ñ›ËÔrr5¡bɳ°Àò¥jCGKâü†¼‘bª–5«¨¹otpEΛ÷Ûæ²-îÉ9ÜöNOëw—ƒ°ÇƒewÕÔí³pò—¡Á:ÊãÌðDk×á͵ÙFÌ.›fÙ¨yˆ¥²0ÉpßQð*LaÝ’(BÐ9®ÜE|²¹æÞQøDU'!îµÔåùžŠJ%*S:;&ðíçôä¿Âñ l3Ö_QŸ]ugÜPÞœ¯‹T•H—²t§ZÙêòrÙtåâì¢0Ÿ—~Ç8gWkÅVrš[Èj !“FÆ2.NûŒ£ùíãáÞ®zwðö“ú™³ËoBä[L(sLð) Ôsxã4䀯$jx"‡BÙÊ×#X‹έw£áv¼g…Øêrçô|dN÷& 6øðIòzªÚ7µl œpƒÓóîG“ŸÚjéí•ÏÔ ³¼Æ -¾7’7ˆóaA¾ë±9,Zȧ cºÏ£€6ÜÙ¹½<[A€ênb98nCǹbŽ`NËkñJ´NêùŽ÷,¥0>…i6¢–’ГY†V®H in ó¨4uk©MS®<5E”Û­Ó÷{çQûíR¶L¤XvÿôGįxr u_êK¡`ø§¶d s3<ˆÓ…oK{äz]vŠrÅ0Ú^Î(k Ëeb,ÔE¨)Àj¡s¥g‚ãRtbJc&óJ5¿’U›Æ+Ö<« )¿Ï©V;ªk¤¢¬ZqhÞ ­†Ðó«Ô¢ÃZ NA%€6uCÃZ%Ò+@˜ß´ó›.xÓèaXû+Ցˇ¡dÈûYÃY›”½ÁEŸcª=ð‹á6‚:Òçžy¨üî+é+|Ü( Gáf“"sìøƒ¯·þTˆò4ËåTÀ/‘ٵ̦ù¼ˆµ @'®¿FÓ¶#<ˆž9\ÇnSu;¤æà@’ Ø$‡#cü#}UoÔ¨gê;Y\]\Ñ´4h;åðó;/ð£5—?r* Ï ÖªÞP¯ÉÎ ´¶ža«{‘êÿ÷r"o^%zý*‘„–ÿ•ÄßÙM‡%b²˜î‡tôÝ—†D~¦ï>NBr zò)¿È‘ø SzˆèBŠ[”iˆ¨©yiukM$4.Ê…ºäÖ,ŒDÅ2ÜUJ±ÈFýÇBñ›wá‚ÝÔw(Ï2à£Ï;Ÿa}.p²f"ïn¢îûÐØ•җ·ⱿK]& yp\µ~VóìRòt&ÂÀhM{x.ÀàZ:·ƒþôÞV®ÓÔÜ.?ÿÄ9…£Aîí†0Ûµ­ÙƬ=cÖ`ÌýÈ!€°>ï5$€«C#/’Ô7{&ÝrÉt„t{Õ†£N½àpví[%«ì–}¿’«ž—¾Ï\/Ä4šz;÷“_A¯/ˆ4R,µüO²çˆ_â²Â£ÆÂ>C ÿÇ|ÝâM¶s6“·[¿G‚'_Ú„A¢týÊ:ÖâRgøTÊë*ä°…W4Ä0¡ÆIHẼk4vMc÷åO îÒl#·Û¥D¬½t;±Þ2ýq¿w PÙú Ø.eËDú€e÷OD<ðÊúApëß&ÿ:âo K‰¸A’býœ-|vRý,‚™OŽë>KÂW[&ùÈÌ,X/n÷¯+¯·Î/UÕ¢rÂÐÄ XpñÃàÎhã»^úœ $Ûs¡y¯Z÷&õ;Ýø—„Œ>‚XkŸº´ùuÉ}bÒß¹ï1öûÞ!÷&Û”ýç3 k5/ßÔ'˾Ì÷V;áTñ­óKeð6ï/›RU|fª:­‰ G~7ô˜œ‰kD™x†š/¯¨!bÅ7“Ðs4†À"ØÍ2ë”g€ù,PÐ’Ñy Ìï7nÔ.ö—Äΰ܌§,Ô¹l{zº™W“ Ü”óþU”G¸ÿ„çòìÑWÑ }ï}múJjÄueÓÀØ9=m zï*YB,¯¼r®¢cJãjÁÝ [sï(|¢ª“Y?àÁSQ©DeJ¾¢F¿Pfϰ„¦`º@ìpE%®(ʪ¢³R©X2º”;%BÙåòrÙtåâL*Ì=ˆ˜@F[ynxÕ+Yóœ¿òt%NÒ›}—o²&÷ä‰+(1ìírG½ãÏÿ¿eNòI?³A•È\ž4—?‰Ðó+Í1ŠÇ^=]HbGÉwDÍr¯ñ•¼*Ép³9F²yZXO«`‚ ö8Ô&>o>|’aÕ²üó@·iàÚ‚ÞFôñüŠ%%kµDos|¨ؘJ_Tf|]˜î1õ"&õáÝHLÕµO6øßÒž ùªÃ²m½¨ò²Z>SäKô+É`ÃWN­}¼:f_ÿ`¿lzÜ6b0üWt´‚µáѧ4ŠMomds/d[k»u¤­,§»ýõ}_’#ÉXËÙ=öbKâ ‡CrÈg8ì…¹·BI›»a°ŠLÝNÿü¡ÿh‹ý%ü“ò2¦)9íÂŒN?³BÉÃkbÃÇEv»S—Œ‹Ô‰ú˜“øéôªÝÀjѪˆnÑQ”"ñ¦X`RH Qá4…\Ÿ|[ê×M"\,þ½TÌRé »®Oÿޏ÷Ûë4MÉßFGQ”câp˜ýH#ë.D CÄ.áXøA0aÄ£Gѧ²ÝìµfPe¤³3‰É@ޝg2N!ÜÑ™g9û "[)xÒ…ªë¼ÓW¸æ+‹.ºÚö|¬‚-Y Ù­G 3©Îæ÷hº~QEððíf%΋ýÎ[¾Ic”qE0cùÓ[qÔØ·‰ë%–ŽYdåcHdlBAZFÿåñ;b÷Þx¨õ«Žö¨\Om£‚µޕ鹓W€ÿ73]a)M^áJ.…|> ÁÒ!X³ Ð Ç14—Vègº%¯8Ö^*¯¬\7gÒ’Ï…ÍÚë®%cSf¬I7¶zÉs3Xzòr„ù‡Ó½ÐWSÏÅÓ_Þiò­Û™ƒ»ê™Ê%ïf?.ôJ ÷ÀnÉÜP;ƒÃNGÖM[mõÍ'xOûôR1“ô–„ÌmqôJZ×rVSÿá©{Ñùès"éÅÜQ7>r–3…$#~mVm«ío+eÕ_ÿ¿­¼îßól‘e¸dü'Œ-ýîÇù4RD)Éã¤`#ëù«¸à¯Û ñ°üø/¤KTúŸ°% «vÉ£ òìA0'ªµ‡øœ°bxÁgoê3n*”›¨¨Ö?kÜT\á&·ÈâU6 Õj”ReHRºY8täâ³|½BO19tÐ÷AOTÝ 3A¯˜ýÄÛ^ä¿ßK$²öÿIÒì•™ÙH÷Øáª÷XJâãBgÛü¢»7_üþÊÖl•僭£{€KGÆF¬0dc%pòž'v~½:”°<š¢¡i)I̤Ó$61ý;âÑÚ‘'H:üÊìkr%1†ë·‘%ýâ22ŽM[Ά¯ÕÉÚ+qÉ©[¹[ŽZ÷LìrRH«pÚ¿×'ß–zï.AnÙ ïNÈ߯¹y¼H–#ÌM{°ÈÚ¤‰&€µÚÃIIÒqq¢µ1A©ß‡¿õ¡oá¼ÜdL*•Îv:/xla”¤â¡m[ª:½ä­Ë•EÒÄÑÜÐâ™ \€!>„ ½Ÿöø0ð€-q–¥O=D<©¬—${-Û*0Ïf~èÖvÖ•k{:aTãÅm5¿ÊÂQä+€‹­E±SÈ^›5×s³ßõRëaD)Êi^Þ[¢då–TO™ûFR˜ÙH¾~ü3î(:Ÿ endstream endobj 225 0 obj << /Type /Page /Parent 342 0 R /Resources 226 0 R /Contents 227 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 226 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 227 0 obj << /Length 4032 /Filter /FlateDecode >> stream H‰ìWmoÛÈþ®_±è—…Åp—ïEz@Î.zi«8´½" ¥µÅF¢\’ŠíûGýýÐgf–eIv½ýp îîìÎÎÛÎ<óílòz6‹•V³›‰6*ÄŸ8σ0S•i`ò0R³õäõy›«yË{BÕÎëÉëï®´ºm'a†´g>™öÃûÉß¼¥?‚Ø»µô5žJ´ÿ÷Ù&3(TEŠK¢ÜZËy“+¥Âè_Ê„a¬¦ô)Ôõ£ºz¬;ª³ ð–¶­0Œ‚ÌkÕÛïÎÔ_ÿíOÓ òšj¾»itÎÒˆ$÷÷÷©×‚#±zô5þën µñÚª'ȶù’ù¿›M´ªÔĤæÔ*ÊðQ˜DF‘D¹jìäfò-{²; XG,Ex„•ál­'ÄnIJv'}Á܃´·ö§ Æ$ «ájÃBíïX:ÜiŒ 3È+D&!ãXø¾ñã@Oãû9Xnà…†·òý¦g§SaE–bL–0î=Û»VÍØy‘·ÇسjQveë§4Âe›Æªù¦f𬨙OEŸºËHö$MÙÓ‘ûÞ°˜+Ÿì[r˜¢ãÉÌOƒÄÛ|¶õI`’h§Bïâ<é`X‡‚uøÂß¡‘à22ÚÖQx£öî}M‚,aJIÅ[æ8©c¢–އ,¶~æ©kkk!6¶±mØ›B² u)qô  d«ð«Èÿ…°s²¬}c`‡Íb+¢ZUʉ½ƒV­zï¹m¿á%í½£Çeœ QíÂ7D,Ñ94þ¡¥eÍòZÏGÍK¹KþÕ½oÒ wVZ‰ŽtmÙ[SñÑÏSüº`KÄQ·ðxF”Œ¾ðØòCI¼šgi‹]v#GEt÷j…»XS 9qw¦my„©°‚+:GìÙÝøšL$4s2êà•œÖ°½M²o ÞoدPvMŽDÀ®d›ûÀ½´^âéÒéÆᬺÍçcÂUŽ\ºùå5õþ”§¡VNÆ åìÄkúË»ú8‰E|wW}Ë>˜ý–M­uot]¸”éCõ˜bÔ«æl äm?#{'„Fj„mãDéZÒŒE‘­v°‘¤s ªx´eeóWt')½Õ_)›š¦¿~Ì=¶>_³ÆjN¶ iùG¨Lþ“«¯å²žÿ-/WÌ Rí–„—[”}ʉz㓽T©ZÛ’Å#'`µ³øÑKûaH6ä0$a1·2Fv!38Þ Ü‚W‹ýsxã#¯í*n_»_}Ä·åâ=çÛŒ}{—u•eͯüÕ8¡‘‹)“[ŽúŒ9÷èÛØù¦Y(Y.y™")r)-g'õTá_ ¯Û§ÅAÊï¥7ãß ¡Ã-¶k;;šÕÓ -ò|—Ö“!«›QRqù†êæg_Sš¢TÓ^‰é‰º‚6_ ´w–w,^ ùCEîh»EìjVˆ¦£ L‰d³°ƒ†=À KP*Ÿd6)Ȭ°÷ÑvÛ¦F%Ÿýc¬ß¨Çñ®惚kHOÛ4›ODSt@„  ¦swdQ\ì`Ñ2Z}z÷~Ƙ,ö>þEàÕ'Õ¯\ùôß5.Ç7x:ü„©øÊ„­á]áѧ^Ùðç‚+Y‚—È‹?× ‰‡§†Þ)MÎϯZ>nÅRî=ðN^RC…¢’Û.D±xM%óe®Ä q`ç‰b ¹Â¸`¢ÓôˆáÀ¾,Ö*cÅPoø^¤&é@“„@㈞˜"Èã“Ç_ ÷wcWú³‰,Ÿëèáç©#ƒèžŠ˜¤‡*£;Ý¿à¥0¶çQ¡S‚GÆAh‚tfx‘{ý³%=äóVQ9DyÚl;~ÉUm}{ªªÝG(e}Uý$Û"äÝ!WÚÔU(—ZÐÕÆ±Fï€<­{pD@·`ìNãkÀT­9q? ºãíAR…ÆÍT1 ç_¦3'”ÿçÎ`Haiå‘þŲ¨€¥NvI”ê+ð¥RäÏÍò±Òxž©ê†Až¢ZŸô›:åŸy9Í·< (Êhð…ÿK®h**ÇPbeçÃù;ǯrs9K¥qÅצö§`À¥v˜‘S;•äOhr(’´è€&f!_Õï\ʼˆð©|舸¥¡ xF¬Lõn§j™ÜÊǺKÞ»[î1§øâ´O±Ë‰Ÿ(î\çBúÁ >’!EÛÿ8á'Qq*¹ QJ%Òé„zìàs´þ>sªø¹TH¨ÏÈtüø äÁ€7ætš?Eÿº4Ÿ »†ù.ÍÖ‰qa}áS_¹õ õš &ådC!I9YFedÊ ¿BzáÔ¢Æv³Ø®P$ÊM‹ÆYÛæîöÕŠù ±½~”°ç¢º¹‘Š#›2Ù0«Yõn¤‘­å"Pï7Ít¯©êóhº2Á«æDœ°âÇÃ,[ …¨ Zî É ¨`SspM“•u,Î|jTm¿Ð²e†‹9Dº-]vÌ{É'Æx†¯!å2O®¯y‹…rDVoD™ÈM­*Yøh0Ë ;ôá°,)Ô£á„,#bßH $F8G='¬À¼äû w{ãŒu4„äaÃΗPòÄÛVU·ÒŸÕ€ ¢d¨ßÓÝ1½‚H‚$GÉ$íØ°4…¸^Ý!"ú…»îQÎ#ÃOÉ>TÃ60ToN[Ê€" ÿî dvq€HŽc·8ÁãÊÅn§°[šgÿvãJ=í÷½€‚ÂbÐÊœþ?r¢P›§ÁÍY!ìÎv§üJÞú†jéÝÝ92;Åeó!;”/1ö!³“L 3J¶à±¾(eZŠÆ¾DƒÂCVˆÙ6uÛ)æÈ0n}yqDœAÿ:@%©kÊÄâºØE}14z‡Œó½jÚJX ÐS0{IƒNp ª&“ððP¥Ûå‚Qên…%grÚÙÚî—!ÑË6ªîšÏËèºt,íוÂ(Ö\ñ¯¥p'úÔ]Æ =dßK oJ²E̯ðÂ;÷=> Ò$LG›Aø|Oø„…7Nø3uãäwÂîè%Ö÷^Ùh‚b ‰OÁMŽ¡6cËgÑü§÷*Ùm ¢˜ë|EßB– n¢,(:²a¼Næ43(ªsÌI%ÐßçÕÒ”Hg OdwW/õj{5&æš¹ü”g„Ò¤éb»]‚ â®znì݈Ã\³MVY¶Øíþ€¯ DV½ÀJuØÙX¡x›õ dàñ~œ ë c¤½£Am fÇ#'$önÍ3HÄù0i**b0€´‘ó]pDR[ɤٞ|™ÊûÜËä`#ˆíPk}÷ÀC➇p±—Ä ‡r^q­G ާ!ãÄá)ÿ¢Izæ¤ÀUç‚çr}Ô­Eñü¬¤žÜ*V"µ)©QóöÊVpÐ…¹ûý†wîéÇ u±Û¢Ëkà0~?!} È‘/ ã$FÔæU™G]Ô; !ï­ù¢ó….¨8,`–:µ×“6뉻ºU±Ï+w)š¥î/6’‡Ï¼5Ý¢“áT+žn®IÞwwÓQ-'425G“¾QÆgVI¿3‹Ð”Ÿk›{g”Î:œÀœ "j#;ÈœÖ'$T½v`§Áª~·Î|î¼gý9êø±RœÌREª£9ÀÙížÊèb4æä‚~ ¥I…š”£qæ}v3}/:]ŦÏÒ¦kÂÉÌbCÆ “ðÇZ*>/[Z[×U ríS„V;ûbôÇÁ3@;~é{÷”é#ÔDΗWœ‘>ÒbìQÊCãâ’ÿÛ©ùstð± °ÖÄËÈ¢ÝÇʧiXHEŠWp~×)ˆº¾Öêõ»×ÕH4€n[äð tm;[òt|†—މ%\ˆêp³eºÑÊNý%9üP¥X™,•Ýo\"R˜ä +µl°‘_\zÿ³øgâv8$wôŒ˜U¡L¡{2w(ù³S"Å!bÆAEžK²¯Û÷•`’<à8óÉ‘6_"WRM[½’é§—]=÷O¦?…è8×5¥¼™ ›ÙÞø@F ½OOðÞ½Z~ïÒ»¨9™L eU‚Ü(/DùÁ“ŽBœM%•(ñ$cž“~¯e&ß[N‡¾œ~*>ÔíÕ-2IÕÀÓM¦±cçûôçÑêfÛ¿ÖÉݺ×sÒâ¹äñßÍ”Ï{ÍÔt®PÍgZ ïî?Ð]—ÞÕ€â"<—D›ˆÔ¡¶¯ ‡÷$×§bsѠ䣙4CÌ’krø‘|Ƶ¥T—òZN¿%Õ­S¥ŽP]vZÝ‘Ù~ÉëFÔC[=ñÕÖ4Ø»–ˆÅÇ•sb’wsvY±£Äô8ߥÿ/ÕG†u*Ì’HC?…úÓDy1j¶YR(P]Â2`QèFèzêAˆL\,ÏW÷)4mWFEȹ¥V’©ð”Ët1¢rST±~ÖsÊô„fUhgD¨â3²T$‹â(GM´Qe»RGæsGö^—ËìöF%¬ô»!™ˆª[iÍ×\î/TätºyC/-9bÞŒÏÀŠ|Gbja ¢}ÕØ{Uîoå—z‚)Òž>5ß5gTåoùo¸š´ÜŒîåì«ç„ùmÖr8oÍ}®^'àYtqþ”ó—ØÀÇrr= ÎuïwíÊqr«üW N,Hpk948 æ*ý{Ê-ý„R©/í2~7šÍŒ½Å™—*LÎS éŒÜTV"Û‚£ìåw_,>µXÂį>üú ×3‡É endstream endobj 228 0 obj << /Type /Page /Parent 342 0 R /Resources 229 0 R /Contents 230 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 229 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 230 0 obj << /Length 3871 /Filter /FlateDecode >> stream H‰ÔWÛnãÈE^õýv`qØM²I ãËî:ÙÙc-‚I&Pm3#KI¯ÇóGùÇ<äTu“¢.´Íæ!°!’]}©®ªSUçt2z3™DB‰ÉÍHià(Mý ŒH2ãë4Åä~ôæ¬NŬæ9¨gËћﯕ¸­G4g6·¯£¿yW¹‡~äÝôÔžˆµüû䣌7ÈDø™Á!aêÝÛõ:¡­èÍØþ)tDbLLLŸÄõÓ²‘c•ø™wWÔ%^C?ñjñîû#ñ×ɱñC¯*gwGâú±l¾fƼ8 òòå\Ž3¼`KÖˆ¯ÍWÒÊW‘Ið=9·Ú¨”µ±š<>>ú2ôWcGÚêI*ü.›;ÜQi¯.[6»ãý/&#%J1ÒFÁœJ„ ¡¤Q*ªbt3:eoà@vGëXKÑK’Yc%óµ6ž°š¶fkðùâ§ Ô1°Í‡rœâùY´#×P0ôž.*kŠJjè»’ãû!~^ÛϹ}äó`ø é¾°•wÙ~ß˱NüØ{'µÆ~µ“ÿ©K…žøäÙégì³Ô;s'.í£Ýì«{±îQt`¢¡´ CëºkØwO.cÜì 7SÞjÙ6¾òhÓnÕÚ7òÀCÞí¤uÁ:³û‰\FØk½¾’w[•¼)Å]…MÓ}ýŒ$º§žsŠSŒ¥ [O{÷lš†ÙS,2Y¶ÙCeÅL«ØL’ùVËšŸMfIà*‘$ OÁ¡Õ °¥±é¤QSöä±Îü4\þ‚¸;;ð*}`ñA11‡(õS— ØÞIgo„fqy.ää}!€Â$êœÍKÞá˜ÔÞù®CìbúN;‡ €œCø4Š ÔûÑúYš^ÈÅmÖóËs§k{°†MB§k@S½O’¦ôž‰=(eG[é3Ž>¼üq{vœú¯AOÈ]m²ùrãêpƒ×Ðáõ3@©¼ IyˆSŸÆË‡vX´×,êÍ­*Àh²ä½yÎR€ï±0ƒ?íàúÒ ß#›qž¡Ï¯v æÒa{‰Kû*ƒ™‡gª^梔õÊÄu0¡3jY†)¯ {Á˜ÆqÔÛ&Ûãý^(*?Í”y6‘ë†bá°ˆƒ¢g"ðÀÂçdî<“¡ÿTJ 9é°NË_w–ü¸‹ú'î^ê°ÜµÆ96²Í¿¡]³I4õmDT´‰ŒÈFÆû|-¤âBžO%ðRWDmZ!îr’ÄÞr¾`X”Ë[;ã­aÁSšB¸7q/UJM•í­Ö¢D"´Cbu#š;»EY»cgoÞŠüNdo¿»UŒvi«AÌzйÊ+î0BÒ Ü´'„E¬äwôƒõÛº‹iTkA€"Óâ ²åà˜+?öÔ€eŠ-Iïx$½éyÒioZ\fIÜ«Û:í2K—‚еbÇŸçM^#éDÐ5¤£* ÄR;R|u;ºÝi¤<ªS×+DÅ'-ŒM z¢êô`ÜÖGåX W¼©uÚã=œ ßJN)—RSo{¾{ÿ­½éþawÿÄÝÿ“'¥¦¬†¦!xÇ–Ç‹Õ,_@Û£ãÊö‹ I½¸·j Œ‹Ü.yÁ\ß š¼E;|Ëõ¤&ÿD|’¾¸ä ¢¡cì)l[Ú)"_TE>gV¢hŠ\‘w)²µ…FR6*Þ¶FÐéW˜„5‰vxÅ‚ã 5Ô‰KZaÁ±¢¼G©èˆ’{‹„lF‡ŒC´šJ«ÝèíH€ ¹ìØcëš›M5ÚL¯\,Ä”&„^æA&¸æô“ÛѦ8‚š5BVk ù»Ø÷ÐdÒ¤»q/ ?ÍCµ·cò0 UÇ•£3EU1[–ÑþÂ(©ç¾çöQض ÷¼‘Lï`«„b­ÞólbQó›9ÖáŽÞ\‹.f¹#5¿—ŒùF’áÉÜ4ȺÆlpÊš;Dkls¬ûl ÿ–'úbÉOG›:>QìÄí®@Ú i„2¨÷šÒ©c7Bõ“VÖC%NÝK½=’©ì=¾¾8þéÇâ/¬K ›)²ú„gêýÀÉR¯·’»ã’ôȼåç¹ýF”¤#ôÑ^³²ƒUÑJ©¡Ê¼9ÐaË“ç«FÛ.ÆèN£´§ºÒê±k/¸I¤m?|$m3ï³hG®¹{º¨È„|O·fOÝ]˜ÚBûU2e… N±Aĸ£©SûpÄ7¦†ÑŽ,í£]õÕ½ìµi”âäÓ8&{íÁ•ŸºÌTiK¡öXî¦uìq¨Žæ¾–H…j’lClÇŠâæÔÔŒ¯×gwÔwôW æÊlßJë-ûP?•8™úœŒ¬4½ÜS,ô“,Öý²x´ÝÜÆ±ñÕ`W7,¥ŽÒI‡;Êå/ˆ»³ÁÂÒaž5$äYqfõÓáÆ%â_¸êª6 •sñ‡ì¢sÊ9]|¡dá]5¿¡=‡Äéù´ TÍ­âäa±ZÞ¶ÍËæÔíK¶O•Ô.Ð ï *Dê]—üñ­Ø‡ÊN/ó+ˆÌV0„ádÕ°ýpºL¹°St¿¬‚ÚÐ<­ÓÕj±«²z¬Òžé·ððÎæšXÕ{ùAûIe¿Á‰ÛÎþ‘DY;t¢Ñf«Ýe•qøÃ±?$dرðÔ\ü¼´=7Bx?‡¹ùëX\L‰W?Ëâ&ÄlBo—[U«‡Æ1·Â±³Çªä‘Æ‘¼šÆ•×ñ²BÔk7wfœCå8vN"¦ös™WOvµX¬E,íþ3§ÉõÇÝÒ/nþ1ÓKjVPND³‚"­ª·Ì§î­.öÚÌÃ1zùÿ£ˆ] L"†ìÛ”üÕRD¦ƒªG#7Âþkb?ç¶ !¢¸£*@­âä•L‘mk–K6jÆF%ÜßÛ»<ÔDiÔ³FÇŽ‚hC74(älIÆi¨[KØFhËÆ²FâPÄ'2ÀïÑñ:¯Š%ÏixSÃ=;¡%‰ÚµS”ôí$£¶ ½Ó2vdûˆèS•õKÀ¦v(GÊMVÔ–Ü‘y‚nNpŠý-%õÈ·K'œ JV7–Іgt«§ þ^Mk´sÁ Þ j?Q˜¯šÊÞ)Ø£d™‹{ªß×å7Éë!f‚!J*®\#F<².›’_Àk<‘Ó/óKQ—ß ¸ßÒÞЊ§QŽí¼EýI ^}#)Dãfƒ÷‘IH²@ï—Ø³ø{otfIî,9hºÿÎtã­[¶3ˆ±ÉÊ>›kûÄ^´»O¶sºø|!Àßlè£Mà8§œ¿)£’¡–ü-¦ORSÆuH<»˜ùê÷™4Ì0iJ»¡·°³Ü™"8¥=Æ¡ÏNmUù/ü—‹|º(ŽÑSðÉ–I·Š·p‹*‘»{‹ w9 úzƒ«]ƒSbùŽbVSˆpñ«gîït› 2JJØ‹U—Ç~çò˜igmøU—ãºEñ~/åw²©H‡Ì{°}laˉx ÷ *ã¿q^¸“º'¿)Ý:”cJg„^b«™ð^æÊh§;sRQgL*i3û¶ãÞu)Ÿµ÷e£ýW—»[áÒ>ùwïU²Û6DïùŠ>’€eˆ‹HÊÌÈöIHCƒA#RŽ`Z4$:ñç罪"E-Ž1sÈA"{a/ÕÕoñ,ñ«]I<޽+HÛ¼8È[4ÁaÜÆ^^¸eÁf9?¿`2 H‡èL’´¬ Ia';Ø ¥ƒ$‰½¹=ÿDv¤2d]~<—«£œ h÷y1Úö úXc@áŰúáò°Ó"‘±ï*—“…ÄÉ’ªÜ#ô‡Vv–úú°ë8z]UnUëb€ì`¨¨‘a·?…¿NÀ! â‘f”F;íÏÒ»+›çíâÌôG«ŸÏk³Sº-·Ûzë–~Àlª à•²kˤF²5³7ó”W]ý µ” „7)\" ¨ÒÏí³úÈ} ÜŠÉ{n’mO/HšÆÐm/³S –×A8Æuö±F†&ßXhšß\¹.‚ñS#*=”³úÖzH"{{ªwt*ÝÉŽÒ¹Ò‚41)/U=h3i? y”<\lœ]Ø4š€0ˆÛa»#G¤—ÍãlZkw»Rû7ΓÙIH“v¶Ñ)²ÂÓ1Ëž€Ñ»ZR]nðU÷Ï|ޱó[ 2¹$Ùø„ò)³!¤$),^“XBã(q£¼žkBTЉ  œžÝœ´å¢2ïù-/“Ží°c¸“dØje:…ÍE9zã“Þ/ä¶eÞÝ'­v?”5jåâuáþÝb!ðrì0¯ï¯sy#!lZ@¢Ïfp0Úé¥ßÁu<´«7¾äíêdL”õ7÷™™úŽ’ˆ0 k›ãàJv#õ™žG4Öñ.Üò/4õžDþE|’&fß­,önè}…¥@GÁ6­ÁAHáœûÉzîCTo_VJÁ{ØÇûkŸaÉ)ægÖžŒ†I@+mÕsY=£wïó‡˜8+Š|Äø&*©ºÕ„l$øîQ§d.À3=çuæ‹€©7H/Ö»¼Óm,ãUͺêOÍcfÞåùÕ7¶Ëß„ y³;¦BêÍo§Ëå• *ŸU·OºvÙéíôˉöKT Åûÿi?èáó/źáÿ endstream endobj 231 0 obj << /Type /Page /Parent 342 0 R /Resources 232 0 R /Contents 233 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 232 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT14 297 0 R /TT16 298 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 233 0 obj << /Length 4013 /Filter /FlateDecode >> stream H‰ÜWÛ’ÛÆ­¼ò+æqÆ!Ìàþ¨]í*IñVHW¹¢M¹°àDL4jµù#ÿcÒ—^;UªÊ&R-q™™FÏéÓ§{®æ“×óy(´˜/'ÚþÃ%LSÏOýX$Yì™ÔÄ|;y}ݦ¢hiŽ/Ú¢š¼~7ÓbÕN|Ï÷qN1™ö·O“Oò>WÓÀ åÊâÕHêoó?M22‰Ä÷²>¤nÑ–×›Má]̆~Æ÷C1ÅK&ŸÅì¹êÔT'^&×¶-á6ðÙŠ7ï^‰¿þSMc/MY¬_‰ÙSÙýÃ60#‚Ée^-Ô4ƒ0IѶiKF{:Œxž¿eotJÞ°'OOOž ¼X¶`M=+ ¿U·†=j#Û²àiÅšìßÌ'Z”bbb pj$p𥢱“å䊢a\4RŽFzÀ) ÀgÔ„逾Ì<5ÿ;Úˆ Þ‡OƒÂ9û¾À?7M„Cîßß½QS@$•;åÀ¥¸«:Û,U[Ë +¶-šr§ØpWÖmV‡Ø"ßé®w?Î’‘û=¦à³>qÚ‹ã>ÿÎivÕ°«·ûª@ZQª¸V×(ð"°4Mù=Pчñ;Ú˜–?bØ`ƒ×0_Ë|³ùñ®\§e†2)Ú®ÙtÛ!{b¹o,íóRâö 7IìöŠ$2pµóx®‘kàO$­XªPÖt¿ÙÔOeµ ÎèD]mž?¬ë'¾ÁÑ¢=8žIÞ¼Ø5*„8Õ]Ý=ï,ÏôÄÑ—ø¥9OµÂ]ìç}yô¼Ok[‰¼( Ƈ·lƒK…p‚¿5çÒ€ ´Š/ÑjWŠeSoÅn“—•¸öÄÌ›ÜL±ßÚªËiGõ’vÚžö¹áéˆÛ.;ç7Õª¬ìG”›HÖ‹ýÆ^å-?Æ h§G<2q¯9Æy)Š ®¢³ž´­ØZ¼Õrûèn¿˺\àw›_òjg¤UÆœ8œ¢z~˜ŽÆÀ8£-Z½ ßv œ5ñfõ±^¸Á c/Œ³‘p…ƒpéà˜¹aC¢_H„™°(W{žyç`®ø±ƒuðÅœ'¯ù%¯ofÔmY$zBGF|YõK?`{<:£ö†P ûgäÌ€­ÚWâ±®7Ô ¢P…½¸zųoúUø.w硇S©‰¾¶j}Ðsœ™»ªì0õ0HÆbLE5©^b肆ñ§g¬xÜ+F?ßíîÝÄŠ§uô`.´[†{Õ\'S<ËÒ/0…çcˆà³ñGÅÖ÷üxç;ú°6wV7üÉ‚ê†Øë²‚Þ£\¸E½øë|pöÿL_ç[æ¯süYDð%’ehå+;…\±]fü@ 8tµûåÖ¾æIïíóyË:$LžÀ‘GÅ®5ëû­Û( Pá 0T¨Tò¬ºBz$ù.-=|ßÓ|Ë><óÌÞÆž‰bÇV°oÃvì<èÁK¯®£îAV³ŽO6vw¦ £z=ˆ‚9Í¢ Y"…qé¨Tº#.ÝÑ8<¤ š27bm€È&œ„)%aêqt9 5I•…yßlÏCÐYŸš„Ý\rhæ>¸»Þ*ÊW+ldLà‚³±â 5ºiÉÂ}S»ÑæÈY絨^ˆ*ÐË}ÅñpÆÌìø$¿¡C[J„Ó¤iS2±¬ÝÍ=\“ Jã%Yt.4/@cúÜ;Lžx|‚{æó[ ±Fd?t†Ó?…`âØri›SJ¦œ^ƒ›áP¬~]pŽ2þ‚Ðü‡s¤ jîT£"¿eÙjÜbú¦[B¹øw¨Û¿¨/ŸÞ¶ Šßû)|¤ÛÐþ!—<ÖIPNP£2ÚCOLL×BlËP- Ê§ïÌ{»â’„œ ù"‘ËÝárç73o¾‚ZóELG÷K§-U¤Mås¶R—ûU¯Œ«y2Oò P ¸^ÊÚß;y_ Š›³å­ð:©ÁAZ™¦Ÿø£èBºžV~ï€#v.a§c Úœmñìvá² e&‹3êÐQ…„œ sD.äÂ(Àñ-!‡œ¤Ê£*øËy€È9E.§O8$ÇM\Œ7bºàf{Mü¤;ªãóxÃ%+U†®ø®ù¯èÎ æE‰ëž;î-ÍÓëCHÐ:ãN¸mÝsÐî»åŽÏЂՏúíÅnDbMÞsŸB/щӜÌ<Ð6ÄÀþ"±…¢™'¶MªÌ[|Z}q_Ÿ1S»O. Mü]a|Óç.bROjâ€õ-ïcá_‡a“S¢_Îá')Ú* a}Z%îYCJ[JrèÓQÈx¿OGrB1y—Ò:º™âcãÝr¦ŽeJªâ É®þh—o0ý˜håÏÍêµ[îÀš©ÁZIÖ´ômº¦Î™ª÷LÙ SuÏT™²ho 3[3àªeÆ•/ø»Â8¹rçf\¹bj ÚßbH•鯃 ‘UÁßþnàoV‡·â䋈ãAŽ*Ú¼êqP/¾ä-­¼ÇÁ±']³¿ìŽõœcA~é}Y7w‘PËUyMTQa8T$Ü·ˆ0­H +’ÉE£© EÜ^•”ã¶à/g®ãÔç46å(çÆždQ€•šV~{‘å’ÝŸñ'­íÕîf†”Ô¾>L…€-]f#ôCùxò>i'_k#„sÏOÝóÔNÝï`Zr=óìP;Ô ÐñõíM»éƒ#0#RçDC|僟g¦*^^t‹\Ë lnÔ íÄ)Ù‹oŒsãdïËþ\JžË–YA›#Ëí–Ø™Õ­ý¼¾;šÝO  ‹¾¤ AÌã/3µÕ=/·_ÐI6Å·n7 áÒÔy3=©DPI‚l"Hc÷¢‰LÍàµ9£sM1æ+!ÀAÿÁÆŽ3;j£G) FC;& ˜Î4?˜ØÀ6CSΞµ¿~È'C‚xÉNC=¡Ëeu ‘ó ÁE’„jæC÷(ÚZŠgE]i‹„/¾iú iüBµwÙ΢E`Ó@ ÄŠûN+®¡"€pÔ±‘ɨëu½AUg‡áw¿VW«¥Å¾˜«`¨àg”Œ´˜>>T *•3§è2–æ_:~ô+ãã¾€<ÕÑ]T-ðÈÒ86¡Ê¶•õ†~ОmŠÜCV^¢ñɰ ëAu`7'«_q£º¦«v\¾À•GÂ/v¸J<óŽ÷|"1¨ÚsT¸S̹°bhEV£“µÅëíLu÷¯~¸ï3ä«ÄÁ¦Lb'HÍî͹ÞYnè,g¥ÜËcóðQEå˜gíô¬÷þ©¢<üSÁ?®Hžßrä¾|­–Â÷¼ç 7zN’‡õéùÙ~ŒV~štO‚lzÔ}Œwª¡Ðly~öe½~L ¶ž;N°¦Ùûü¯ÝžŠÒ¿%ƒ4…Ô¿»UË‹íÉNžÄŽ&^±[ÈØ"ÝICb45v P£]8_\ÐL!ª.çÖ›±º'EvH‘UŠTÌGŽèVŽJrTöùT3kÜ$–Je ã Ü)K6P«8Ì i¥òÀÓ*0â°Ò’†A¼v²ao›Ø?=®ÿa;r=•V²(X÷?7FÜñD?Þþôßi‚'8 endstream endobj 234 0 obj << /Type /Page /Parent 342 0 R /Resources 235 0 R /Contents 236 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 235 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT10 293 0 R /TT14 297 0 R /TT16 298 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 236 0 obj << /Length 4208 /Filter /FlateDecode >> stream H‰ÔWÛnÛHžê+ú±9°ö…·‡<ÄŠœxÇɱ&vf1 %Zâ@& J²ã<ìÿì?îÃÖ¥y¥™\f³H@f“ÝÕ]U§N>žÌfV(1»)-øl’øAD"N#_'³ÛÑ“É&ó Í Äf^Žž¼¸Rb¹~àœùhÜ<>Œ~‘—™76¾•Ëÿj)Bëýsö÷QJR~Á&&q‹ny½ŽÑ>ElèßBcü“ŠëGqõXn½±ŠýT®òMÆåF<{q"þñoùFÖÅ|u"®Ší‡¼†!L^{°•Y¹ðÆ)<€I:¹M.iå+Å0ž=çÓ¨„NÃ'yxxð=ãGrÑÔ£§à·Ü®ÀG¥å¦h>ð´ùŠìOg#% 1Ò‘‚p*abø#``´À%¢ÎG7£SÈÆ™æd¤Ž>4¡ŠÑ€åXuyð„òoÞìwÌfÄÀl'ìˆî›rag›ZþˆNÚMü"gpzˆ€¼ò"?ç´†¸N=%뺪9VhÅÆúMt/VÖ°™9æ@KHRQxëC™Q` æ#³Ë[kQk- tïLªE”R~ñ«¼÷ÀŠ’UáY?‘ a‡ñxT ›àïÄK §¼Ñ‰Èîî.Ýü’Woi×"ûÑC„æüþ%N< ˜?ó4VÞݱ½UV_Šì-MÉÖdá5L©¼Å#¤2§#œ4Û±åsDžÞßß7ÇÑ8îZÞåvv „Wé c„-&‘C§USAP/¹ ¢bØÁ%o¼1npã¥hÊÓÕí‰Á€üÀà[ Lºò¬,>䢵Ãk¯ Á²ùNËs¯l…ÈhÏ·à7„N7s~õM €Wqjô.2 {×ã7wÕÃ;£Ý"Ú1CŒwÅx·ˆw˜rJû%°<>¬‚hxRÝUÞ¯ÍUªÀPª‚« ìWAÊHÒ„¤´­‚«€–¿¤Vp¶³¼ñb86¡Xí¯ ËÀÞ’?ŸKUB€©lé6=§t3㔿çá‰ØñÃ`›UolùñjäͨkP±½bC@WEI(ݰ1@ƒêÁsañ@ÓŠ÷«ðªÀÒùãõ©«20ð¥Å££ðX<®v6€û`:0z‘h¼°Á®S†1a7bìÚ»š'—¼p n#ÆmÌ>[ÂmD¸5Ü]S@[Ð_Ù6áOcË„¹¨éÂíN½ù ®lw’÷üÒ¡ÝðD4Ù Æ+Æ|¢MŽ™ÂˆÅ]¼œ ÁhE‡Ñ‚z ¢Ï–eù-ö¸®ÅÉIU–ù|;ØTG™žÇªóXµ}kC¢}[“ÐUrI¿"›bañ[PˆUåNÅâõ„î@-éîè{ɳÙr½!‘K·r!ÖUÙì/k½Ík7¿â©OÏ@Ãáñ†34Ç‹V4¬ê­Èžç×»ž'ãF<ÚÝÇÑ.Çâl-q-7OŸŸrá½øß\b4ò‚TÔÏ/Î_»÷¯z=ýÔ{×_‚‹nDàÄ=Ý, Ò–õvG#nj mÄŒÂ-/æ+n °cL" ¼Uaܯ¿¸úyY Á6´=$š°WØ•ÓÓà€~t«¯PPÿבÇq úЦ@-Xмüíóˆ £,ùå;Õò«‹Ï)#“€ºWFN¢%âK£ÐC8ˆê(Ïç¸UûúDTˆY¹åÉU 5ëGÂ2!ºü†EQ.Å;¦Œ¼¹ó §•7´ªXŠ-=äZw=íŽP”â€Ï×Wü~[ÕŸ‚L%¡ï™Á“SÌ:ñ:Ál‹ñ(ó³b}¤‘Úíà×id•vðC1¤ä3 °F’*Z1/fØ%b0¥,ßx$# ÔS–Ñ—Ê3mì†k׼̶<Ë™ú,l†À}Ñ›{…ó•`š¹†PÝŸ1fÏY_L£µ¢Eµ¨Y.3$³ÚCdNõ#‹JáûÄé_dÐÉ麠N"ÓÓP†$76\çµmB¦AÿÖÊw¸ˆ+ãá/ÈáI…`L0-cìÖÅ’ÇoòŒ”Ô3ol²»r><vlezYÇ.À Å“kâo< ªl‘×gè-Xó*ZüÓ=èDÜÓ¨Bÿá´?xtØŒ>OÀ@Unó÷4iûY•£ ­Á©¯šæÄ zϯÐÉ%R˜03_¨Ú]k{]a÷È0°Ô‰’D*ø×§_w ‰Mð‘ BÒLϨç½×¯I8×2Çu™ EbeÎ`Ïý åÎ@Ù5ì‰ö „?ü!GإϬ)¡ÄsÙpö³õ[DxUA³g ü‘]Ì èR‘±éõ*ým³ÎžA_…>”hÔ½|ê+iDþ µ~Åx&™9eNû‰ÌÛvrv/úÙfw¡#'8fÁtpep#F—öÙ³;LÉâ’ÆÜ‘½­°5 û®éÞ Ê}?à,=îI:A«î´¡lêßü¬.Ê»a?€ýAlTž„®?x¬¬_ê&1ã׋6­ˆ§‰Ù Ç£}+bâNRŸ3Þ^®qFGjq‹Ý?rȳ[¹œ~6¡}uLÕ0i³¯Vü+*KTž«—g~‘Õ¶1UÔ+64’ s óˆaž¶0æ±ÂœôE†ùÝ1Þ“ÛÞ£ïæïT ‘E5R— è³)¿¥Å ÿÊHÚ€qíŒ{ÞV_ºBDýEÀ›Æ?YЈ'y-¦xý¥ûlw&øVž= ³æ0>}{öDÍëG ƒHg»–*jó¤õ‹=O%…£Ò[Âgó'EÁ*M´`Ò®f*ìå6¯åÉÚ–}‡†ÖËðÚ—åŠß<×IùRfTbª‚Ÿúþ"·o­£/¾vrŒ;ä 6TB Œ §µÈ ßœ ?¿ßyÜZfkxPÀ©§@¤¹æ¡@ÀrȯŒ+tà}Ψ߃<¶"ϯص¤]ÝH§J-íwªëp{A~Aª9ȵy”r2vDŸqì¸äc¾Ñn)±d"—+)Œ9mZ—²X–eÂ…òû€”‘[Ç9»uDªa”× ;ù{3¶®¹@vD:±nQø‹‡w=<{þþøHÍuUûrvš1µMi‡mÝ0Z7>ýãg[i¿j_)ݪ]ÎDLC*(•§J¨»b#Þê 'vû‡—)e 3vª13öd`·šP ³×ePómÁÖ!ð¹¦ZN"â/öxÜöZWˆkÉé!°3(RΧ;ù“Û…ó‘;Þ Ô‰}íg 'ÍÅ£W%4žVŠÄ ;poӬݢÝR B; šµ8«œÖìÙXÙP~‘Œãý=‹}3µ™Ä#0sýÇÎS–Z.j¥<û«±7bBŒa¹Ó ¤8†,s(©=ŒuïkE /åÒQ·"p®ã¦$Øa,_¾ÆìG§+Éâ;öÏ<Ã%¸ÉäÏ.)k1êòòüpø>Hön“ðbÎ%öÀü¥\6æ™p¤ÎáR‰O§XŸaaÏŒ4‡g¨(w ‰Ò”‘Oß~ûwø0ò endstream endobj 237 0 obj << /Type /Page /Parent 342 0 R /Resources 238 0 R /Contents 239 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 238 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT22 301 0 R /TT24 302 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 239 0 obj << /Length 3626 /Filter /FlateDecode >> stream H‰ÔW[sÛºž¾êWà)f$† A|ÈCì¤Iê8ñiÒ™6-QÝŽHÙUþQÿcºð")çÄžöÅã‹$€Åb÷ûv?\L/'#´˜Ì:!üÁq.]hEšÙ ra,&«ÁËËʉiEsBQM׃—ïÆZÜUƒ0Cœ3ŒšÇ‡ÁßäM®Fq`ä]¿‘I¢þ>ùó #™Hà ³°Iìü¢¯R4…O– ý[DahÄ2q{ãúV#™\U qÊJ¼~7ýÙ –»rºŠñCY/v0#ÉK™¯gj”Á˜$èØt¤HÚØÞ'oØíÈöäáá!Pq`eÑÔAiø¿®pFɪlxÚtAößNZ”bY áÔ"NáGÀK ôȉ]1˜. Š8Ćã„M¨R\c9V]BôPþAMþ‰Ù´lÌ&©ãƒHáÇ´+&30©\OñP‘¼þ(V¬ ¼AlËü®8’ÉÛý\%¦‡öò'Ž:¶‡-žxy‡Ë冡S ’(c'P:lÒ;ºj¢.3=ÈXlÍá¯é… « °[J©Hé„8¸ñSßÓÖ_žDË'€Áj{ I;×Ò BY)*p‚Š\Åõ´ÜðÀúQ°™é0ú€Ùë—¯Ï[È °M?WÅáâp“׋SUl¢{N·m®i˜Žk®Ð“íÜN%U"#7ØDcIõ(•5 â…ÊÚ¹Ÿ¸ÄòAi#¯TSYb>ÝQU3¾ª¥TÕ Ëä»Â\¯Ÿ¾Þn/ërASxã_Ù™¨yxHçiè ò3ÂÆŠaóìä‚ö§ßãÙcùA…ŒýÜK$D/¿ÞÌžT­M[Õò€Þl‹µ¸÷šÙ´¾c{X‹o~ü€šcËcÀ ÏÂ×Àj[LyRI6æ¥ͽͦü„& ¬yÞœpÑ1'4V¡B¡[ó˘ö·ßTQó³°³R™h×#ŠIºô%G¥’*.ÔËŒ­¹×ôBì ƒå ³ö íLŠ$ðvÕÿvàÕïéÛPaS¾ÿÈx~CLé}<±á®GÖ*ˆ·FtŸš ˜xÓŸºçáÌÕÖ³* ŒIÎX'v:Ö0N~JpÙ„=Ò˜.êæŒ4 “&iH3iR8çþ–?|+ž$ÝðŽjQðlxÖÎ/+ÉZÍ7¿…ËÛšE÷6˜/il‰Û~ó*Ìç²zñB8÷|‰×^¸Zæ½)–E…çi6†Œð¥"„%ÿýÄs&î„Ìvdƒò®©udÔ8Ò®qhn¶ü@³@5dÂ#Müo–0ØŸRÌ—Ák‡Ë¨“´‘—´382³ô,™˜$7ö‡ßÀcøtW‰ŠK3 ÅO?Ð4Ѿbg\Jž$ÕÏZÊP“~Ý~Wp>k.dW¼ÙÐ׃߶‰Nw ÄYjÿy{Å7,*±×²X#,ØJ?ÐI£ã•€§¾(\G…Eð–€zï«…¬s=óQ0§*ˆ ÃEúJ–úJFwAL„˜îù}G"¢Ë£“˃ØlùЍ7ˆO [X2šÆ{|\äµc½(Ä•ÒäC·m©ݨuaMv– ˆ—›)n“óWt‚]<ˆ½÷¬üÕ;ë÷} wÐr½(×íö~ŽØæ;ü•e]wµýQª?‰]GãgHµî1®c5d= iý‹åM} û$x/›Ñ”³"›š>ý´îÓƒM0I\£›jzáÍWX‘89â´ûy˜õ²Ðð™åƸÞaÇFŽÞAÆKŠh[¦eÇÓ,­Á€þíˆe D03 :òûåÉ88¹í•§çU™ôi°cÈÏ„pTR åŠCZ`u‚Ú¤F °•ãzR¡lF¦wÿŠÒö4ñQ­r`á-!qø±¦†^ÐAªÁ¶.á(‰B+ýT*_XY0`a¥"¼íõå‘l5Ö׉­ѱîèZÃÿùf‡9*b’;xa+d)â(îû†ÄdìŸwÕ£zž1P#ÃçÝ󢬭Ëåu=d“{&Ã4Š{+Oû Ê€à lÞ&ðAs-ß?)ó1T©ž€ Ó®{¤ã´RLTÓrÔ`øu?­‹™¸åÆB—úéIM UæÇ¼ûLÚ :8¨£+–µ\Yôv¸ÉQIá-ŠØ(þA &¥.îÕO‚oÓ¦‹úy[¬¹€Ãå¢-WEüy8Á× ²ç„KJ­‰O®-–.++¿`uË}᣶eåþ¬Î`-xÛ]w»›åf·XãøâK¥"F1Ö nêó«,@|{‰ ÏBÍVà ´ÈŽÈ¿äËO¹ŸOÕŽP}e^|Å$¾º ±BÂBŽ”vÞCñÛ^°ltŽxi;0nîÜ©îŠÎêÈcnNz «H‡¡@wñ2Ytà»óÔ²üŽŠk<î ½XîyéûC8Àl/~bâ½ç´ÝToèy;ü”¢;ؾxë’Û(î_Š|ºHà]ˆR¤å JÀ=ʹÜ|Ïí=¨ÚSþV¢ºƒ’_ õðúÕWy度 VåÛ¼âÚÖWÅŠgÄ-*59g[ÅîQ¬m„îÿÖR(‰i¸ë¼®½/9)ŠÅŒz4½í´ {Éï¢úÀãk?!¦¬ùß3'l_£ݨˆÄLaƒ6¾b` õÚsÀÁÆñáÍù½J»°×¸â¨cstÂf,’L—ˆè’µ|Î<‰ÇIÃã„xÌ ‰‰ÇhAäžÆˆãRø$|&qõåJÒº‹èîÈ•{‘Qx•Zî±}€êÿcåaHÁ#B ŽìľRTb ñ½š«Â‚X/Ä;š‰LNIËXùEO ªˆ÷¨¿ðŠ--yp_\(t>ÐB¿´ÄAÓÀ~Ùø¿ÜWKoÚ@¾÷WpаÔH¶÷a8Ò‡”ªQT‰´=ô„‚¨`¤˜Jåßw¾™Y³Ænmz 7?Öc¯ç{;0ñSÐ_ÕߨÌíõfµþhgÆPk;¨ "4 MŒ\ȶ4çŠy ãUĄهwÍ]ìýøöD†ƒÇGÙ†ú‹k›KF¦AgâU¶çu-§2¡9•:á¾(²ŽõØÆz4³aÓ[(,“”·{ŒáyÂ’G]ÃC:Ç&˜aÕ«@î'Š/1·2p+~šíª` e]ý¡Ê•ú;ÞɆüÌœmX)ÍMQ†•I7ò gL~"2_;L”½Ö¨fz2&2¶‰¾Ýv»øí‰Ü ¤¤(îø„)ž°êÃlÇøþ&Å×^K¿äÖR-á¼XJxÂ'±’Ÿ!”¢ðœÈ“ ‡%/µE®°«önC+Ü+'ô‹EšOøÔ¿™&}’t4 +‚Õ>М\ˆþ,XjJù4¡9ÈWªÜlxëÓ‘?¢¹†I?œžIËÜ›öp9>´fä¯ EKÀÛjW2Ggð‘ThcŽÂ ˆ¥ åÄO,G ¼×†E¬‡Ä=Y¹ØSåñÜR‚z&hSN˜ŠeÊU‚­'sÕºx$¼P®æ]²:!ë˜ÉŠ÷  ãp½—Ë}öœ™ÜýoúÖŒïÀ¶øq±îÓ×¶t€Ý%¬ñ¿ƒ\ÚŽL°oZ~’Ó3f²áVM wÖ\ýl% –Çå‹V‚4{Î1“©ãQ盺ãy¬ èÄð¬ŸÞ–:0ÊUR+UÞ®·í;!j!óÙ¤šß}¾½=¦15®°Ñlè‚ϤmƒæYúaôƒqØDÎ+üD¸= ó‘Aê`¸rÃWÂ@ô4˜²‘k=`¢-ÖŒŠZàDPúÎçûÁ¬ Í®~¬©«ë0î–å`©©æ¸UžÔïÌÏÒþ½ßò7\ÔpT¨E¦e]¯ôR¥C‹t’ž; )e±èG-uaàDüF  0ç©1o§àÀD9›Å©#)tðò­ôLKÜð`t:50 =³@@½ø:šs ï«mE@AbŸ&0¾(:-, L> endobj 241 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT2 417 0 R /TT4 421 0 R /TT10 293 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 242 0 obj << /Length 3556 /Filter /FlateDecode >> stream H‰äW[oÛÊ~ׯØÇ%`1Ü —d€>;vpZ;1b¥ê#ÑdÊ ¨Øî?êìC粤¨ å´EŸ wgwvvæ›ofO'£7“‰JLîFJ‹þàǦi¥‘IæBFFLFoÎV©˜®hM$VÓjôæý÷«QF®™ŽÆíçÓèV^çÁØ„VÞø«¥ˆ]ðmòçQF 2‘Daæà“úM¼_'¨ ¿+ú‡ÐQdÅ2ñãEܼTM0VI˜Éy±*áÓ„‰\‰ßÞŸˆ¿ý3»ÐȺœÎOÄÍSÙü½¨aE ‹`e^Í‚q ’,¢kÓ•´ •u Œ'ïØ•’5lÉÓÓS˜ÐÉhDU/‚ÿU3‡;*-We+àeÓ9é?ŸŒ”(ÅH;îTÂ$ð#``´@‹RQ£»Ñ)ECûhØî “&‚‡­Ë’8SË>ÛÄ#BKeêP“?P—ж•E^ŠÒÐF;Фð»ŽY ÀÕ ÞN»ÆãoåUñð£¨ÅÅ:H!(Õ´)—è~ŒPŒ¦pÐØX@Ä; ¢–°ì‘SþYQ¨äCQ59ì­Èƒx—”ÍÊÀŒ üH2ïðºó(¢°upT Çn‡Y0â&ˆ¸Xž#TY×K/«Å ‘¡@¬/ÝÖVÓ·o[礢º/«â*k„Àr¶^§ùªxûölYUÅ´_媩Ëê^´7Ð>|d1ƒŒïzË’i1MgÐÄ–öâ‡b×-.t&u=IçcYó‰XW˜+p/ à,ÊNÒïäL,–lMB—¥i/P™·Uæ×õ1øN€ìD#Âaº‡ìW¥±ë¤€¥·ä±ÎjƒÛ_wgGa+TúÀæƒbHÉÃxsY†y°¿r ÿ{ œ–%’˜'ZXòì˜! ÒLo¢ælµDqÔÄŸ|P.Zžвm¤7ÁˆÚœ÷ª1´í"ÛÂmXHeÉ0HLd4˜/ëÀÚš=X`}°fm=;JnLd†×õýÅ‚÷Ș\{6‘Ò=¨Åm!hSø¸+ÐŒ8ß¾ÿ~}ùùýï¾øøá|Ç;=˜Û8Q~ ¶¡ì0Cci@„ FÑ0‚m<&k±‹tm[tüÞï€|½ÖtuÀ«7t™±¯"g@ þ×Í:_¦¿˜4–/çôG ¯ 0K"PÜ÷ä¢d7PŒ~Þ?%YK§±dELu´IU÷I•Ï,þm¨ Ã©@¯›ÅPîú÷ªTÜÅ«§hµU×M±gó`lÁÒjÃ;eT) œ¸Ÿ²&Kz˜ãÄçÎÅty…fÀ5céÚ ÅTB ɲ¥.–Á×áí¯ˆ{gÛ#9$÷mKt¬<;£B×ïTÖwÿ%Òc,ËŠ‹sÿ1£Á ”BxmÏîÕÀ$TFÇÿ›îPÈåùÕ÷³›É§¬G~*Þ @ÓÆñc¹\týT[÷Ã,Vé iBYyh ãóš¥Y‰Ùã<î•ððeѶm› Á®ŠônºåÞMoå]¾ÀÖUa¶¸²Ó tn²tWó­¼}\×ÐC‚›ý,‰E¾íæƒNÛƒ˜”R>°ôH>ÞþЏ=ï`S–?ò€^ ñ¨V ùÝAµNñµâ½H޼M<úõuî×çXƒG Þ²Â!ôå_åÓœ·¼ Uñsk¦SÖåU,è,oX1ãµ'‚Š&g/¾Ë×þM+zä ¯¦³¬5ůÊÙÀ¢ž\Œ…]yÚNÁoÞ~Ÿýƒn h1}Ц›—²“WÍ Zíp^ë *²:“¢¨f¼†¬2€ûðøs¤qœ$·µ}¾»Î±/Txê ­t°ÂÊ–°³¡O¯Wo»BÖ>ÊÂ4J4]iË_/ö —ŸX¸æ ?CA÷¦ä-^©¤Ï*ЦoÝ%\Ë%&1}jèM!¹qÂ[6…½y½"UUÊf×¾±WEþwwè>Ážô ¯©K<¯fW²ú1ãäm+ÖvßÞ$L¥ví¥WhkîŠ Ú[@éc¹¢•Ï•¯€Ì»€Tk0‰oSÉ÷gܲyÕ ½Rº|AAŒýÜÌï[z½¢™âq‘7~¼äÁÈC–Þ°$_°êˆ,c5h§ŸXŸRð°:ÌŸåûòâk”¼ ï¥]¬lUSt³åžÜÈs,:ŠÂ\Ýú/ÂLº·ƒ8ÉÇ m!äkl¬ Nk œL_J4rKA‡ð¯DA—Éü„߆í'ܽâ‘_˪V˜)ü–MÀë¼â.@—‰ÏÜZ:y¡xÞñhŠgÒÑ^„77Pºh¼q+ÑxÅ€§¦Y¯X‰sPv·ïÖ‹Ö¼1°ë“zº–T ð òœBçÒ¤uqÔëM>ͺ®€ |oâŽñƒ5úó=ê%ÛGY,Ïì4ÎÖ‰üô‰ß?þE,+Ä. tµæé´X­ˆ(O¨2‰Ì’P©±ÆWÓ+u¯^À‹àõ“žŸŸý9E]ÃŽ)q€… îLy€§” oM½×ªŒá$AU6ablv€þuÜ{ß /jLÊî}ƒ©yCÉïü9zÄprû¾1ô¾Id7P1qŒß78fEÝû&¥÷MDT×½o~¯Ê¦¿Žô~¡‰võ%Àuʂ߃Uâñß-tFNgzc¯=;ì>‚bG—²Æm5 1…ѽ¬îÊ{O._ ùÆD»Üo@Ó8¶ûmᦷ‹#Àˆꯆ¥ØÛyépo7°ýqw6dž~ë ɱÃk»ÞÃ/›‚g{ÝÝ¿Ó Ûd°¡§P4ì¦CÉÚó “1nãøÞÞ: ÿµØ:à'Ýs’Ú䧨•UIP1ɨƒòbŠOÁnúD,q¾áÅË*gñbñ‚ÓÐø])dYj†as*ƒœŠÐËô)Æ@å#‰—¼ª)XÏ3´«Ô –•xà¾k¿‘~° 0Eê—_ë -8¯ÅÆÿ¸+$õ‘óm!ÓÂqÄ’ÿPžãÇ—«Khñ¢˜îzD·óê5¬[|ø|‰¾²Òÿ åSgÄ-N*›–%a¸iZVÔß5Ì[(²%¯¤Ž b^Á¶MPž¡sÀ!Ð4Ì/ðËi+ ‹bVÌN(¢Ô`@©î“EÏðÍ'Še3ÇbŽÇW¶Z–j˜_"Žš¼ýÚì´‹׿_(Ë+ÐÿqY¶Ë”ÝËzªÊ UeÕ«Ê•¨O Vå˜ þ‹»ŠœPE6²(¬×•ß;%Wd³’®"[ª±j¿w«.JèÆ3êÙ wíSªÊ)”bmäPŠs>»¾ÆŒ2ë¯Õ*é=[ôVýµpç³›|ª¿pfyŸQ=ý€íŽsáÑdRw¬ýä`-–buñÒá3°ýqw6X¤É_¯ÃÆaý‡uØX¦ƒ& É[$<⬃›KÛsA©:R‘‡ä¿V‘ õ*²Š7Ôo*rB”=¦ÀŠŒN¤šm\“QÒðªÊÿj¿ z‡(üWrlW jœØ¯[-ÒJVœ8…6Ý"ªUñó÷½ÛI²iʼnKìdÆŽ“±ß7C¡2 ‰ËF¹,ÏjŒkÔq—]ý"`‘uþÌÖ8ã‡`¨W­¿€›½5sK¥?‹ÂÆ;êõgPXÀ0OæL Š–vwÚ‚ÙáÿÜpÌ¥½ã;)ˆ”ňœeê€ÍÀ•±6›@“Œêü¤3ñs˜8m & À1,¿1®†Ï×þr¢¬YÅ7<Üu^´¯Bõ?ª®EbÑA¢$=$æ‚D¯HôZûUR¨š„E+X´“tÚ¹€Å\°hó‰N”°èBéY½Æà·ø!§Å‰qš[ìÒ4ôz!0»iêÕÕóny¢´Lœ•c’7n¥Öë¸ØŽ ÇœÞÍ·Œ“iÌ®r‘ÿ6› ÷YGl ×Ë,‚rƒp3Û°~^W(Y.tSêPúm…¼£ô¥ –ªmìÿ{ö"¹0Ž}É}µÊ¾ 3•K;¯ŠÎ4yÙ]á‚’!òEMd’„üüt)(®*o†iIâ6ʪÂWÑú¡Í¬jó‚aìF­²oÔú}óöðwÌñÝЗY„8«Šòdôˆý öEˆ £m]í¢'mˆ63ÖãÔ‰¨i¨5Ðå0ÐÌÙѰg¦@çuH˜~A(|š¤{fË,Q+I™97¯z“=ízÏ<‹²ãôÚHV²Êîyôè׆’ÂqØQëÑzàÜná/G¥Ä>:MHðwró•È•ÈDm; J endstream endobj 243 0 obj << /Type /Page /Parent 342 0 R /Resources 244 0 R /Contents 245 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 244 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 291 0 R /F4 294 0 R /TT4 421 0 R /TT6 289 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 245 0 obj << /Length 3957 /Filter /FlateDecode >> stream H‰ìW[oã¸~÷¯`_¦T+¢DQR€}عí¦sÉ`ì}ivPhd%Q×–IžLúú÷aÏ…”å‹âAÑ-Z`aÀEžCòœï\¾çóÉù|®…ó›‰ E?xè4õƒ40"ÉŒ¦A$æ«Éù‹6EKkÑõäü‡™·í$ðƒ×“©{}˜\˹7|-oK|†Rĉ÷iþ×IF 2‘~f`“(µB+–T…o†ýK„A Å™øü(fuçMUâgò®l+xüD¶âûÎÄß~õ¦ÆdSwgböPuÿ,XÃâ¥h™× ošÁ ¨¤ѵéJ¡ò•6 Œç/ù4*¥ÓðI|/òlA#ªzôü×ÝÜQ…²­Ü/+îHÿ«ùD‰JLB£ÀœJD < ¢Pà‰RÑ”“›ÉsòlHîÈÀ:l)|I26Vb`½µÖÖtа÷€Êø¸_¼i ×®à™lºM¾s8Ÿöc9óbø|E°œÚOåº-Ë=”ì`ÂPÖV¾ ¹‹ §Õ·U]òÂwÞŒÊõb³,Ÿçmyqqu_Ö¼oÉ:Û¶Z×âg™ßß[5hz ²`êîÊF<ƒ)¶dW€ ?ˆŒø*¸*_>€dP˜‘sð*°Ÿ7AYÍNgôÄW¸†T¨Mžyó  !¡D’(x rÚÀu'gcÓÏê8F÷æã0óS=*~bºß;ð„Û ÌM§>€ÖGåµÜ\Ö]@12¤ÿC·øa˜fÖ„~ Å‚ùÌkð=ÊÒƒ(IeYà §îf’œòDqq<ЈŠVªùñžr›‘ùª<Õþ–ÿŽaЧzk÷?½}»g @I í(öh‰ÓG޲t_ßµ¼¾ß4p%0/\áKE™ç“Ë„®Ð3æÑY $ž}"Ž‹Ÿ˜v{Ç©ŽãPçë=é‘y›¾µ5Īæ‚JoPR9®PK°+µ-œÊÎ+ˆƒú ËZäU€ *- oúû€Øc·ŸÉ?M‡å5ÀðâWáFH¹Â´!*©(à;TÓö¢ÇwèÀ” Ô/ * 8´ÑþÞËØô˜•­—B¼´Ü TVãuý£‡9ÿz½é¼(Ÿú Y‚™ƒToá¥úÆÀYJ`úhÊ¢¬¾x ´d#(ÃÞBðcçÿWsM±Œ¡†¢âŽ9•ŠÈ~\`FrYŠ/c7"_.·êIà¤þò+±°vàIž/@'ç’vßÔSk ´ulz[ë„2+—\[‹Ž‹h&×òºâÊŒù+;´17‰â­m’Bœ„ÖÆm¹˜žSì0_‰"ÑAyëÞð„°.µ+*ÝÒ¿XóGþ&\YtÖðâ˜óªÝEåÆô`+_¼¶«§mæŒÁº(¼tÂÕŒ;a{ +yCS8¹Xºå%oîÄÛ qBôò¥èìGÁ{óeÊ_Z‹ïù2Ö»¾l=¨ön˜ Ö5† sJC×üœŠ‡9pjâë(JNí't“sÀÒ ©‘5 rª:™R³©Cy^-8;؋‹ûR²XW‘¹Œ¼!_ö|àbòqb½I9ÃN/B“M9|0¼Êü–&K±Øæ#.¾ƒ+°+ÜÎü‘ÅÅÎN{`Kì^»Ç±`3Ò^`wǃŒ ÑBA@Wš4é­=¨ªËnÓÔ~¤Á߯ÞÈ phLx~) 47Ò£3*"b†÷HáV!&¦ºxG× z=ÿé¾~ýj÷)›$Šõ¢ä–n{‚LÈ9¥¿jiOÓ´.àóš€PJ"õùýÿ”Á¼) ]’˜LOaH+ŸœˆÌþ’š$Þï”ûº–‹>–MŠYn”kú? 0±¯¢0~‚Àˆìt´÷ŸÅ¾ËÎŽ÷]#â'¦{ëq32=J`âLÁ¡Ƹ$˜&ÎÄè!ô¶ôk¤›ô¥1¤ñgGZú=.¢âÆI>°é™b\XîzÌM[ž‰ŠL}—¢ÏR-EüÀÐÿª•¤‘Új‰ÌÃÀ¸}ç©…ÁºwÀ?¤¡ß©¿Ó}4âëñYÄ™ÇÙˆø‰i‡³îõD?6ÿmý}œ„À+°S[Ï*ö̲õô€‘ÒÃÙÚ$7qïaµ‚nQaªn°(·[ͦî 'Ãç•§2\&îó&wR X&ÉæœV¶%KtXp¡ Ó ¦=n=…•7â|cñÇoc±†j™ØL2`”ë®üÆÂoÌ6úţƫĎ8æÂeú~Ç“Xg°äÓ`5:–ØcwHËן;æ•Ç™ßêÄÉ…Sö€Ù>•¼¤ãȵˆÝ!/A&£¨]§!ÿo›O2ú†ÃKù â3õ—øºæïåB<õÚCŠpñÊÄ‘°èfX²q‚3\ò²÷ô/.ù£xA•;ãÊI+÷’G:(½Øžå¿À ²¬[j¾2B!Zy`ÌL‡J ;a*©Ê¢m2ÒÙA· ZêÇK/’üÆÿè7#¹GÉèÑ3÷"i?-˜L,iJ[äFŽqëpjˆc¹¬aÜhiU‹+Os¿Šj±e0êèƒ9ºtHèªû!Ý-6°•ÂZCÏ7vØÀNgŠáfUòz½é¼›Ú“ßÄä÷ž'Ž'4eQV_àÐ %¤5†8À˜ÌÓ H"ÏÎŽ÷y#â'¦{‡é8¡›ç>ÏÙý8¹Ð`b­¹ï™îÅ1:\¬ Ø@Ð$”ìW‹}?h?V±Ÿ„Ii¤æTo_ywP„µüà%ÄU ßÜòÓN´P~ ¢—à7óÍZü…óï>²¡˜0"+^æ²ÆËdòÄU+½È$©Ay6ÛøLl|ŠïìÞŽ_ØŒ¶Ç/l÷øÓÛ·.Ú-ÀEAf~'¾¢`IãX%óì8>.~bÚíBa§+#Ó߯V¢ q?èß·<_Ñk¯¾–t g4,­¥!í#–J„hË–ów‹Kb"2¼rìš—uXã¡l–8ÈùÆ6n¤I›å<èìò…È ~ë !¹ŠÖYµV—h;È«Ÿ·#>ø½ÿm|&2Án\ÿÑÿoöÅ#îöÅz ÞõþwÄ+j‚dÄ‹!‚êœk åh{ 5±ÚZ6J{ËB?â,‹9¶ƒ{ážÐ欸\1cÍkp(vÅ¿±_-»mÃ@ýž ˆ]‘¢héš¶é% 8·(ünÈvæë»³KJ²%5)Ð äâD|s9;;sÍ®;9 %C:d+xõéû|’?7# ‹Fæ&Ž$]ݤIM€B•ïTå-†²œü†áæ§ÈhOÂh/ŠUÑQ›cR lr{}è›ý# ÚÜß´(2×ùOËÆÏ‰ÿd¨!ª‘}´“Yð &ª?´7o<É}ÁƒÚHª=h"träB¿û™”ß°Ø2Œº”8?¬×”Eµ uâB«®ùœ’µMRêX·3AœIhé!7#É_pñÛg>åÏÈ;ä9nBfH÷BŽûÞa9>0ý…îÖÞd,måP? ò~/i4Iˆ¸Ñà&å€,ÊrjLxz´|Ú2L6óú‘¢<.JÈh[ÁŸ÷=VÓ‘¢i¦ëVJƒÕœ3_xbÞi²R'5.laªÞw€2=qö'c³ðFÈ„Ž‹Lu¦[Üs09…þ(Hyë” — ÙžrR_\!ºG¢[ä&k-IÅ«u¦s^ê „³–¥fX3c9߉ ±ú9PCN†a7ØË—Þß@¾ú ÝaoCxrÃt¨ÿuTçYí¹Nh5”¢2oÿˆ Ùj’ ¥â?cŸG2Å÷]]*Òß™˜2ÈðÝn~+C|ƒZôFYÓP½Òjçê,}s†ÿ£3=æLÄŒìüjSh@q=ñK-íÐÐe?‡ø­6äaö ›#Ü”b˜rLãHZW:úÀnçÑÛ•î x3Ü uÍ ÜWÖ#Ç"Ñ1º„Š©ÜDßPÐ âemß]âÜÙ–F5—õâ…ùÓŸ1gÄÏ;~ %Ê›Z!gs¯½nZˮÓcTEÁª-£l0ü´8áĪI‘`b†ŸYÊJuq¦üÙp+‹lù(êtöÎcG6—S¯¤“غwÌIÜéÆ=§ºÀžiIl@N%úV ½ ðºByl»Ö Ü遼¨—?~×çB•Á à. Ð>ìEúÿ±”ƒ^ÃOl·jZÆÖ^ÃO.:5&*âͼà¨4ÿ¬îÒ: endstream endobj 246 0 obj << /Type /Page /Parent 342 0 R /Resources 247 0 R /Contents 248 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 247 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT4 421 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 248 0 obj << /Length 3084 /Filter /FlateDecode >> stream H‰ìW[oÛÈ~÷¯˜§bX çÂá0oë$›M›‹ay±@½Á‚–(›[™2D*Nòö?ö¡ç2¤(K´ ´MÑ6 rxfΜûùÎÉùѳós+”8_)-øÁÃz'>q"Ë]¬}bÄùÍѳ³†ö$¢™ÕGÏ^O•¸jŽ’8IpÏìhÒ½Þ]ÈÓ"š˜ØÊ«ŸZŠÔGÏÿ|”ƒ\dIœ;¸Äøpè†Ïë Yá›cF$VLð‘‹Ë/bú¥n£‰Êâ\^—M¯&Îd#~x},þú÷hâb#×ÕìúXLïªök¹†)l^Fp•E=&9¼K’ˆÔ&•´Š•u¬Ï_²4Ê“4,ÉÝÝ]™ØÉ8"«/‘‚ÿº½•–MÕxÛìšø¿:?R¢GÚ)0§&ƒ‡€…Ñ%òb]-ŽNÈp!¹#ë°¥ð%ËÙX™ƒýÁZ[O º÷€ÊYÜOÑăÚ™Ëu»)–âä³q*§Q ÿ_^ÑìÁÃÆ^®Ö¢ás_@%û˜PË:œŸíùóŽ3ª¯ªºäï¢ SËÕ|³,OЦ|þü¬l§èœô0³îÄ[x‚O6‹E¹¿Êâöö”¸¯ªº…/dR0”NØP`ÍÄ8Å>õU¢.+"ðË4‚{¬,›W`P”šþê˜vÖOcetx";yÿŽžÌ,ä†Y¦à)È{>JM]OµiŠq0 §:½=þ¹¿;‰] *}àðA2ßHÄYCÔqÄaz¦dŽËÕj)Ð$OèØä™ë‘XÊôƒüüqµŽÑâ·œE {³á—Ù  FÁq„CL±Zx6›Å G`RwìÑ"ßôùóçpO¹^ÉÙj^2üÙJ°@TDxKµ Ò¬Ë=»ÁM z0ÔÇÌ`ÍÑ¿U?ëqfN•TCœ™Î4Œ3 ãLK8Óœ‰ç@_°A¿Pi†D4R:”™IfÓ¡Ì€í.Æ,æýÕÄÌpÖí%téöÐ¥y]z—¥ß]:È?Ú‘Ç©ˆu Œ„<¸ÛŽ£Ëò(ºLsBoÛ¿éÚ]”Jô Æ y&Â1ýyç¥Ê«AÝêY€›#œ@Ñ×°Ø+ €“\MÒ71è·psÊ}»úzbæÚ§E7 Ž“ &´– ˆH/§U3j“{ÀW[5Ľk×ÖEЀ¥û†X(Op÷O{Ò¸ûÒh,ñŽQ­‘WðÄ‚CŒ:íÉ’fÞü›@nê3 ‰‘ЧbXêxX„Ü…uz=rÇèO¹i5gr÷[.1/°xXÙ¥.Ö+¸¦¾z| ãÜ´¾ºû€íBžx­ŸˆkS ù;®ý¯Áµ=0¢BtÄ Â> WØæ.°µ:B~î¾…Ë)n;;f{-^`k»]UäÒ=“-- gò Én0ö˜Œ >‡Â?¿-Á½báî{€Ý™Ý:ºˆ ŸWð÷¢­n9:2Ž {(6’Ü t2¶× ‘_ˆ 8„äXÛAAF°ŠtÀ aÖåú¸óñ ‚3MY€#ægÚW¡­s )„¨†a%`ä¼, Êð* ù òï"O¹‘Ë«} ¬G”ð€þ¹Î²ûešÔw½úÐ I}TÄP}ŠO”b}Y\.K‘ƒKÑ^Ó“àvØÓ DïZ„%Ýtóþõì·Œ‰~~ùæýkñ;vž­„;Qˆ–„€#í†øc©Á(£»æ$Ñ^ƒ(½g;•mQýûU[> Ò‡4·Ðùß,"5¦â&ŠÌçÅÆìbòAAE¡ @$€»yGx ÈE7‰,–aï²ßÆZãŽuMQ,—¢ hóò}"7ðöe„CN)æ¼,°ÞgØ/ÞF˜â¨H;ùâÕ‹{F#èo¼›a4|üüBä09Óžðêå ”!¡YÂÍ%_µ'oD9à0Oî{F›>CM¡h‚&"f 2”‘YQÓ¸â¶,ZúÜ€ü9åÐD”âbNx §$ÜËC’æ! å;ÁÎd9º¨%ü‡q ‘…œ®øZúÐâ$™ËN’:Њ$·§ñDš…O¼qSÿžûQ9ˆ¯ï³æ¿`Ö ›~;lÒ¨éwFMG£¦åQÓò¨ihÔ̺Q”52¼ªVaÌt0fš~Èt’tC&lãÑÑ ÇÌ_0}r¹®Ú’ÆLG¼»)Óð”™îM™ö)s§\›)ÓbÆè1H:g€¹6ù_˜3áœÖz!,’ "!#Ã4ÒŽP%¤w˜€é·öŒ·±õð8£+PÇ£käø#äîîÀƒöÆèOöŒHhÃÞyª€<Y’÷´Ø¥O…¡£hé3uuKPb»ŸýÌ`ö³Üm?û™îb3jNPyž8ú(?©Æ&õ}ôû>úý§G¿ìÞôƒAΰ X~åeI€û‚¿Q øCbµÌAIõµïâKîŠñЂ0æXÎa ß ÅÂÖVwlm8³M³,)Úr»°.E4²‹øº Öl¾5ðÝkèLíóT"ø•¶·›Ú‹p„”à•Ù¨ÌT•†A¥%Pé:P ç@]j¿a¡Ò,3–Hé e&™M-°´C`ùb¹jJæÄW‡EÓT«šdàuJäMÌrˆz·É5EÞ)©¾C W+.î5?ž€(Ÿ„\ØÁž:…\±czœŠè PÇÑÁÈñGȃ»Õè`Œ>Š=µQ= Ø‚¥]kh˜VܨD£T²S°Æáã»»Í?Ú/ƒa ¿ÊŽz DÏž¼ø(M$AFˆßÞõo¦¢!ñ`b¼m¬[×­ÿ¾mFNgÎ(¬_üŸÇJì>ÅJ™UiÚ✷BJ>9Le *>㈿àÜ6¹n&ïdëôžÐƬXìÝ…ÞÈh„1«ñªLUHv—%tª¦ž:@MÍùɯQÖ/n4R%> endobj 250 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT4 421 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 251 0 obj << /Length 3668 /Filter /FlateDecode >> stream H‰ìWÛnÜÈ}×WôSÒ4»y÷›miwÙ² )W­aP#Ê3±<#p(ɳ”ÌCNUus8JF€ ‚d!@Ãf±««ërªÎ›Ë½ƒËËDuy»g¬Šð‡Ÿ¤(¨ˆ2•—Yh‹(V—_÷Þ. 5^ð7‘ZŒg{?^õy±…QDߌ÷FþñiïJŸUÁ(ý¹¦_«UZ/ÿ°W²‚RåQXf8$.ܦ¯²ß椊ž2Qôe£(Q#ú)ÕõR],gm02yXêI½˜â1s½P¯ÜWûg0ÊÂX7Óñd_]—¨`ݼ¹—4L […ÅzgTz…®šzF!ÉuK¡Oô 'S©ëíȃ§‹Íéò<Î%Ìû”Y±Vcè(4¯K*ïïßN€A9%?ÌÌ4™o‹Ì‹üÜEÙO!À2¦€ TL6³ažä«½&[U¡ÃÁ}õp~Bó“2 -Ѫ ì*²—9PM] ¢"‚½F·m€õtö9@¡•„ŸÖê‹,ë Bv.eFæî+ Þ⾋’é-””z:®œÒé\>œm†}½|½ÝY™‡EÑo¨ý|>«F^Û‘Ñ_)£bM°H•ˆÆÄÏ蟋W]–Zç(¸#GÇ¢™d>•ÒÂUö)Õ‰Ñõ“üž¸%üSâΨP«¢}5hƒ˜¤?v7Ê|)fi”õò´›üTŽëéc@­„üYÀÉÔ:T;‘wŠÂÒßÀû²’k/yõ{ôDë·ÊÎÊ} ›ohh‰õôÉ êŒ„W¼kÙ¼ØôÒÈÝÜ”fÙj­0E©žµ'ŒI@½+©íi@³Ì, IdÛ?y•YÒóOÜùÇa¡:ý㻀[œûQ˜J}‹…dZÀP‰A…ú¡ª®åaN×ÍiB*ù†èµ¢™Vð^d¥¯Ð¼ d ›§šù¼ÝW¢² "žèùÆi«U;W•¼óq‰5$vÉ9 xɧ83Dù®jÙòG÷1iWû=åÒÚô»ó͆߳u¿·Ü¯&WÓÀ¸üœìò3r6OË•Ÿ£ÎÏÖûž¤ø×ê^ò‚Ò!u¯QÏòºS=#¬F+*e~;“*?ºr‘¨™Ï0ÞÝ)ž{LR™bŒ“M~O õìP‹¶™ºÝŸ·ã.³é³Öb†F¶žÉ¼cì¶c0ïåqºrL’v¨hRç ¬â£["S_“ü¬;TX8jÎP9ÜÆÈЬÈ;ß'¡ú¼nš ‰š[ÂWÈÛ´³m5)‡ïIsýà(Õo‘ZÆW*“ós^|úpBS)†ò@I·ˆnì„ý•Á2°Ô7gã÷ôHSx¤IÓÄn(ÂF’É´›ú‰4dü×ÉeÚÓ¯õ*ØKjÞ&ß —¿êПæÙ3„sXJYî¤ÃY>°ý±?»(Ãô™¡Hþ}C?ìmoè7«øš¼?ö׎¶Ü8ÝÄŸÉÄŸPë¸þ"oê¥ü*¿Nàß^/7Rs[8D¥ÜA¦­;£ñ ´;EͲF9!Æ…€ÕlŸ¼ø>Þ@ôÕþoøßå £ÕXvÀ©&E$ó† ”ˆ€‹/½T­,ç,ó«IuܳÄéh8£»Ý3÷½¢o#xòûFwTqïî€bÀ‹¾"ÿZ\—P}&³äŽñ3­KcüuMÙR'p"RM*\ºfuÄ^u’]!Fðhy-ß|™k5(²y²Ô:E^á½üpÕÓXM[©Kõ>iäJêäè¯zý.|éO"9É¡[þp|~!óU¦0‰𶏯öšŠ=ÑÏí?=ú‹ß®:;3M²çÖr¹†]:rŽÜ(] T]FÜYƒßJ=]0zµTµ’’F@I¤\¥¾þÂ?R[†k«Ô‹úäZ@' pq}:>ützôgÒaÈx5nj²ºR³5MOúõìiùýŸp£^c_önB,…f±·Œ)G”ª™>§|[áwŽù0&pl)XÆ«£Ò>ð@¾‘}ŸN碎·µ@,_!ODr=\D4ë¥HÁ¸+¤¯e…¼kêþ¹§ßº Jw¸Â é·Þ’;s= ¥7çN[:™RlÄNÞ ¾):°p´‰ª’ùב¥²²ס[¢,eȼ` ¦£ÞuÐG®¨ŸÙîª2îÁ"Ъšqê1Ĭ¤-+ž°ÈM QÒ‚»TÎ:NÆÂ÷ï6õ:{>ToÜéîçð§ñ¶~ó?¤Vþ3]uú@ZåéF~œ9þ<1,–0©ñXzû<“²‹ÇÖöHé Má^ŸÆæLcc¡±1]—(JÃã·ÐØ’ëß2Ú¸…ñ$Ý™%žÄæZÔxË–Ê¥Ga뻚Ø)©’³iüâeÝ;@ø¬Óz¸^JÃѧfŸ]ÑБo\½A€tg¤ÿŽ wz|UÜÏcéQ$í~œ’4B̉ô“:@Ô‚7â‚7³/·_9Ë€÷‹ê pçÕœÃ1`Æ5 ³LLixàN1šóÐN†Ô†[—#ÛïÙ‚ü2¼[^ ïR xÁ.€'è½OZÊ7Æñ v¾$š0ïøÄ0#¤Â')r;æÇö Ÿ`ÞŽ˜ZT½Òù9YB1#1d e*Œ‚;¨Ã(E3/ÞYûÄ‘}Ô‹Eàä[ªÁ#ò®„u¬x”¨¡™ ¢É\)‡®“þ ÒLãw $ÉP±¡géN -ÁJÞ«&4Òö>EB^¢¤GØ&<ޏæz+¼³È o«ž&ž±¼œV°áQ¨§Ž«çÀô ÃÎ7¼ ÏÐ8ÔÓrÅiò1QHw@G9o  fg mx”×KFϬ×é醭ÿv=¸7{`ü:Ú0†à¡K‰*B…’Åc\ôÀ„lDu¯#r4Òðè ú(ù}}±^êC¾Ûn‰êùÍfm§èK;rÆü”Ž9œ¯l½æÁOCòàªkP"`ÌŠÇ 57/N‡X¾ÒµébY×¹ÚZ»¾]Uþ–ÇZ|ã©%{iV¥›tQBö6j¤ýZÎ4_D·ªœðÀïÞ4¿¸¶!‡éu ¤Tt)_@ë0–…,UìÈ %k$\ƒásœå*‹U@TÁ'A%ËF-‰<‚èÙǰ>1©ãˆ©’Þ'>çQèŸâ¦8L;ÜdBû9*èÌåEù‡òBš7cB\I³©³ßéâÄO™u"vŽ’€[wˆ(qõ&é´BÔɨÌň—/t’ZúQx;~ÿÅ‹×ÔÜž01YëG§Núq| Ò-á" ¢F*e#™[ªã]´|Öôf±Õ¯C§uÐgTò=?Ý’ë?Ñ5ï`ÚÝÉÇ 8h2&£•4žåoG1œî18xþ>"äÈ –}:û"ê·g¶ vˆ3×¥”w÷ŒÒ »dôôÄ %N.¸`Ã6 œ™Q&0Ú<#éQžY• AkÞäYO{BHñÓÒ#*HÚfÁrÌ5 ¼!¹S’ó/Ô†| endstream endobj 252 0 obj << /Type /Page /Parent 342 0 R /Resources 253 0 R /Contents 254 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 253 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT4 421 0 R /TT14 297 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 254 0 obj << /Length 4126 /Filter /FlateDecode >> stream H‰ìW[oÛÈ~ׯ˜>u°Î’ú°q¼ÙÖvmØê¨´DGldI éØî?êìCÏe†¢d1Ê"»½@€Èá™sæÌ¹~çÍdôj2‰…“»‘6"„<â, Â,´"Ím`²0“ûÑ«ã&Ó†ö„¢™.G¯Þ]kñ©…Aâžéhì_G7ò²Pã(ˆå§ŸF ª“?r‹4 r ‡D™cºg~“¢(|³,èŸÂ„a,ÆøÈÅí³¸~^¶j¬Ó —ó²©à5 RÙˆÞ‰¿ýKmɺšÎÄõcÕþ£¬aG› ˆe±œ©q/ ’4¢kÓ•ŒtlSXOÞ²6:#mX“ÇÇÇ@E• HDQÏJÃÿ²Ãµ‘Må ¼m:'ù'“‘•«ÁœZD)<,"#P£LÔåènô†¼’;r°[ _Òœ•ZØï¬µñ)ºñ€am¿¨qd²RFÖíC±P.å®UÊ=ŸÐŒ“1XhU‹†¹žú¬[€ý"¹tüS¢½~íå± å§jYòÆs5FKÊÕìaQ¾)šòõk>³l=OùÔnv•â½,ÖëKÚ³ª–mY³gÀ&d{DqÙ4é»&깦8-ŸA4ºã'ÏêMÚ„Ž“íÆT.XÄ×­†‹%Òz§¥1¤iªá)ÈQ=w¤&¶£ÆI‚.ïÑ“Y<È~€ÜÖµÙü—Ìqæí:gq@¬m²rÛØÇs5Æx)TÈ!”C^«¼kü8ˆòÔ~“ñ!ÖÐú胗îÒ<11[êPìžav[‰AH}¢RŒÙf&hw®´…Û®†°92ýÀJ|Ò) þàôùÑ×J(qïR&î©svrþñ˜NÕòzrõÒ YÖÜ$Ù„2ìq»Z-„šü½oä ÈèÅÞ·ÁJ¬TVŸÔ8 ž,ù9ãVIHÚb¹«5„R§Ž;uRý˯/ïŠES:Õ7 jãÏÀ­ò½¢-^ ´‚(ÏvÞÈ›õC î´!D¯üRQû°›žqØá¤Rz2õ+鹟ýÙŸdvUN@è…ñ÷Ý5ëŒ  æÖLoМ9EQŠo\õ1hu¹¨½.[Ñ*8B–¦F>ñBÜ­Äf.ë{¥!…[±.j p6I_™êp#4´\¾—ór)–ÌÊä/ýE-¦…ÒXÏ >tv$¨fƒ½wÅ/y[ë7­{] ¦3hë¨E]Šv¾jP›T–þ3„1uR+–:÷>ùÃÆV«[¯dWa´‹AèÊifl/JÃÎŽPíä˜Æ~¤“N0aûY ›Ûº#ÅpQ8ï+ŽÆÊô£Þj}öA•Í{e-wéì¤Ðv™ö1`³$Ðý2mrV㲨©FàÔ±ŸŽ±/#J‘-–GC×]¥5>¹³05t?Lr¯XÄ‚‹S(«ÐÈŸºA™ e°ñ~ؽÔ~«ã^ɲÚ宲¨LB)V„¡Öô_ºïâ3¼™–S1/hÉUÊ×Ú¹ÂØL>²Ý’x«‡)lZs0TN.¶ îÁðî„èÅàÀ4ê Ó•o1@·܇­¬¨UR—l_héDíX:Ù*ëg`îŒT²ˆ¿0%Ê“å으@¡eå'›=>€pMu¯¾ã}¸‚Õ]@Äf¢ä—™¸:`6+ïÀRPˆ¶h±ÛkÈÏíJs‡Ó®EÅd'Ñ t»W‰³DHhwîzQ8±LYáÈ!° L"m#.xkçd±èV‹Ge@bˆD„Z3†°§×Ï8È !Í6ÙyÅl7vÒ­f‹‡ÑA«UJ“Ç—7îÂ'{é»>p’s‡ö9¡Ž];¦Š9Æuk"|¨¨ª§l ”AøÁ±X2—¼r{YTƒ‰Á±ú#&w ÊapÖÑüÝòC´åÉhI.Æ„S!2Š‘AÊ5ŽsQµí¢< %~Œ±}·¶\xõj ·mR÷Š©«‘€5Ô.rÍRoâ°‡N®Êö¡^BÑsÕÕ~­æÅ›‘J;¨z¦L^0V=†ë[𨒮®hññâT¬–d‘Í¿L§eÓ(,hG k²¸Æ”Á5l–Óswu'^Àvø¤§§'wNY×À1¥r€ÃÕFƒ; ¦Bá)ÕÂiS¿@ÀÐS åÌœFqÞÅæÖH‰ZÝ—¿pªLzPö7›*Ý`³[“ úÂŽÃTÄ­Ž:Œ[Ø{g›lx®¢Ë`™Øpnµ&;ƒ\,ÑŸ,î XžÜÌ¾É ÚNh£±"±€ˆA RÉ=LýŠ{ö³ û³SdÃSÅùÛ†Š$΀±(¦¹×D„dRÉc…Åfdà#µ¦ÄÑ`º¨Ýš,m[‡é»M‰Ðæc¨ ¦ vݺë&>rzXׅίx#¼îà5ýäšP_­‚¦{p'xã`LŽ™uß µD‡QËÙV„ÊJ´<‚< ÐÊ’šbêsìàF^¼=ùøDí‰{À&ã½V!x•C‘ˆp"ޱ¿wÛv ¨¢ÞW´•Ç™I#ù±õZ?*ÒÐáRŠ¨Ì x10H•$핈ߩ‘ÐÔ„†:6ÁdIØòcqUÛ7Ž£8È"èE; ;ÃgøªKEõ‘1E+ø¥QhšrÆ«=h©÷ÿGKß–Âlsÿ¤ƒKyÐM¶SN€I3`Ò ˜,¦Ø&äƒ Ãºðe0å˜æS.YL¸‘qí¦ãŪ)O}¹é e ä$]’¤Öv@zûQSÄ@»‡š¶†ÖS•R8$Ü‹ž°Ø~ïïôí82͆zç0û¶£÷íöäÞÙf¸o¡oïGR±»V-Á€ýz†¡_ê2D$3ñ+VØËüuª?Š^ëµ”ïÆ`äù´k™‘aØ1S`¨áz£(™‰hŸéA s¡Ä©UÌéká¾òÖ³/Ê@ü¯ ±·[BEÅ{¿tüŒnÀ1–úCìÅôÁ–N³iâkhÍ´¬—Ì×l1²ÈÖÀbü†3…øçªòñ …éh ‰üÈ¢.NñÖÙFð¡nÕ¹c…1͇7^µß½h’–QÅw¡‹ÿŸDqg7½¹¾é°Fd¥Ì²ˆ YXF–‘…&d‘;d‘Ñe#¸a·Ð EóO‰æ‘E,YC¸‘‘…î#‹weû3m+ˆnǼ%#‹K¢­Lð‘¬ÏK\0ßFùa\ñ¼O˜0ÙÍz–3û‘˜’æ‰üA,¬k_¤qº8ÆI ‡Òš&ÝËXarp½jkÃTì§Ž:ÜPØ{g‡ñ¦eîãÞGç–êM¿c˜Ô 0i]½û#Nñs±p5åÏÅý¿©¯¶Ý¶ ú+ûT…äŠQâcØ@PÇ.,9¨á#­¡²ä’”¡øësÎÌòRvýÚ’{áî\ÏœéE2<•Rì:†›j\!ñÀì?mËÀgϕȳ­S†Í1µJd³Íœi,d³Bt–›žHQ:iΨ.œ£ÈõSF(;2r'¤ä¹[¤8"Žšcã -"Ȫw åš«•õ™”½àðd££33¿‚ÊRö‘ñ ífb©õ f‡×gÜeça›šd§ö®K\ñ±7ãiÓã& 㣢á{Däý&5"9f¶pOÛrv¢K‚+•:É|uBN ‰’õ»‰VþNÇ 5'¡ ;YòÊ:³ä<~3GØqÚÎ×¥èTIPí^Mì×Sdñ H9úóÛ«Õ½xopô×ÖßÇÑÃ89I[=lR° ¨k›- ðr_øë6{ô2+©½4Ï~@†ÉÁfoÁ¬ÜÆâÉ.ÈÕÁ~V~ê­­–fµã¹;&+IÆ0QîÌS¦{ŠÂ.9eê«”8¹áÎ'Æå?dË7fqþNÂ"p§ÿ#Â,2&ø¤_¦0ð(#93rúIžÖÍ›ðŽÈ$h(ÃRŠáv)»6•Z†îbê0Nj’¸[bÈ`.é㉸=†¡ÆB‹‘ ÞÝZÖ·,éã¾rÈÍ mA³³ YÁpµÿ¢`! v+_BÀ”ÚÄ}—]ÑWífð!†rDkO5wmGµq¯z{çP`"”,õž,ôá$ôáøˆ>qMZú4•¢jýˆ¹K[àMÁãÑ-í‹t BÀ¶:Q*¥ùÉí£ÿYk¾0H•¤e4™;@¾ýKûœ³ûƒS=‡$‡#Æ™[±:lºÖ¦JÒ¨M$x{1ÑîXàQR¶:õÇNßnGI3MúfJÔî™ê&pµÌôÖ˜xâê¸zg`¡V?¥ÞG`äâqšð!%}Ç)·j–Y™õ´w¢t£<ú¥$ïWþõ tg©Äv,±­‘}$mÇ'£4iõ¹AÝæ:‹õ‹`6oPŽ2J[ ãAç•S‰h¨ -úC!¯Tä)@ॴLj".›ÇØcŸë}¸™µ%›‡cG£Çà?Tý~ð‰™ºæû™˜Ò|ÑSqAäÝíˆi¡·‡»ƒcN§£–Â¨Ž³Iž ɹÈa×á3Æ%ÈLþ˜ñUêˆxO±'æ]Û— s¡R±w‹Ö5ñ$ §hІ,!÷òGµãìo_HW5Ð\0ø/—¯uä&¡¡[>È9fcÝWIq¾ëäWïÓ¥9%žW2Ô÷©³¯¾±ټبK„ ÌуXpèìÖñJSyB׳]Þ\ â€S6—0œ£‰<LŽ„]g¹S™r½Ë\ºq)É©[ª¯êWFVèµ²<ÃP‹Û²‘‘äŒà‚¨h [šlS¸+:èÖYEÅSØåW¥„›VÑôÜêRÝIçTGÓWòzÏ®ù®!~ §‹§:ws>— ïêjöYdH‘·ð<á)À—8`þ»š¹6øÈ\Ü”xËõ"+²Q˜Üþ»—Ï5j‰P _Ò“X‰¶H 1”jÃÀêr£a‹­´ÝÝTzp¾rŸoÁsÀÚÛ,ò(͉£š3Î/˜¦š‰õì£Èz&Â]_ËàþêO³ÛªÔ¦ØëÇba‹Â'‡¨«gÚ¡’µoŸÅ)au¼A2þ÷M‡ÃÁÝcó,vKP ‚x#ÁŠÀœù¼e½qÒä¶j~À‘{ endstream endobj 255 0 obj << /Type /Page /Parent 343 0 R /Resources 256 0 R /Contents 257 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 256 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT4 421 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 257 0 obj << /Length 5345 /Filter /FlateDecode >> stream H‰´WËrÛÊÝë+f• ªD3x{'Ù²¯b]IeѾqä[.˜„D$© dùòYät÷„ø°½I±ŠæÑÓ}ºûtÏñøàÅx)£Æ7ƪ?<¢,óƒ,HTš'¾Í‚Pï^¼j25ixM šÉâàÅÛ+£n›ƒÀZ39u¯×ú²ðF¡éÛ’žV«ÄxŽÿv³€\¥Ÿ'8$Ìܦ;ÙoSEo‰ú²A©=rõõI]=-ZodR?׳²©ðú©nÔÑÛCõÿz£Äu]Mf‡êê±j¿—5VÄX<÷p@¤‹ÅÔåxHÖˆÍf“¬ñM”¤ø¿mLÆÚˆ&¾ú‰n ‘D=yÿ‹vÕMÕMȲɌ埌ŒªÔM à4*Lñ~hi”©º<¸98foà@vGt)zIs+M°Þ¡µö+Ú;À¤¢íYitS]·«b®šÓE‹CEY™† ñúݦÅäåË1–DØvâÅsq[-Êß´åt5/‹¦|ùòmÙ~äùB¶ÏWåékõY÷÷nû%O/½‘Õ¢-kAvÚ@ì ­'I8„<@^¼+Ÿ Œ`þ­ÛÚAú&´ñp§‹c] ªÉ‘‡„š4J žty5“gQ‹U—£Ò¡oTš<;gà¢ŸÎÆI?Å1¹y0ÛÜÏ¢½Û2ÝŸø‰›4vÇæÓ[æ{b+Ê|Ä×:Û;BçÅ]éÿù ]ÿ€–êÏ/yã(æ™[@©Ѫk}}¿ª‘1IõCűùç¦"øg? {gÙ2ûìÞþ“éîì8ó‰,cP\´±{ϼËïÄÑ-œ ãò8W¼@Rº ïé°gFŠê[Ï»”ðÕ­zÏ‚?‘ƒõ D€™‹r}êÙÀõk/Å¿ºYÖjÕ”ê‘?+/ÃÒv¦ÞògéA|¿¸ò¢Á'/úXÈN8öø$çžz9þEúg3Áõˆƒ\}r±IžúY¶66ˆÖ÷¾lWõ¢yÙ]‡ÐIÁ›ÄÔQÒE–鋆q©ÿîäÓG&£ÎˆŒþB9Ba¦£×îóÃù»ó‹?¤jœê™Ì0©ýÁ¶T+y,eNéŠ)ܲj^|•ɹG]ªSk' [~T#:#`‡$Ï-”]ªNós¢©D¯x¬ìV¶|ÎLea혗í¨dWÃ,\nº(¤DƒêœFi互۾Žÿ+Ϻ*"Å!ÒW‹08áNqÀÉ5b¬‘]OÕþþÃp9qû'<×›H‹ .6²%‡*òŽšCáN›ç+·1IÎŽ»3ôˆI’’tÉÛ–T…DQu» 4âa=¢>dX8­R®ýá΢dƒxÍyxï ³íªR#Ž9õ(Y¨$Ë÷¶.왥Q§¯7ø¶Æ‘òñ!­XsjCíãµý³Ä©nv?§îÙþ“éÁÙáÊÚ¾ypêîb–„kf­âZ£òF1'Ï(ÑÔ man’lº e§$n¤ÐÏêºvaP<‰À\OåQºeß6##æê#Ã$ëLëû•:4ƒÐŽuBQ<^‹1®ëqáùÑãtWi@ÃLÁÖœ–ºŸ˜+džjØ0Š?R­`µ ‚åàÃý]îrŠ&k|Ûm•†‡kñÑ3•ÉÇ]V77¥GT²•S±ÉÌÚä¨Ï)w9Ei£Ñ¤ Ï‹ôÝ•g„µxü»—I=£¹-ýbßä6æÙ³”?^lÄ<2™¾ª¾ÕíDÑFfHYW”ÈGâßEˆ‰ØîXX=KW¬Õ_6ú „@Âùm7Òb×ä¯ôz‰Mˆ§·®øYs¾U9k»-k4pÿ§î/±–Û£=l±w–™JfÀT»·ÿdº;õ!Êöwûæ­ûKÑdÐýmã÷e1mT¡<Ž–Eq‡f;A«§Ô Ò®àOôiªZ¸…Í}9ñ¸¢ŽÏp(c¸*epжPöÖ,°h±UÚ¥º/dUÓ”STƒcïXà’ºƒ'7û•¹ö­ŒÓ˜B1Z‡b>ÅKº¡#—L$Œp7e xŠóé|ŒF±Ëjû£N1ìØüÇIüôÛ5É$`"t&–nšöš']¬‡‰‰©t™‹š G(‡x¦îL¸Ö°v<®þ…70 ã05+øs1åUóά Fîà b;LVôԬà êˆ*¦dBà–!¡ÈYç¤í)*s–P f”ÚPø²Á¿°ÁEOŠ­Ú.DtÔˆÈ-½Ý9¤wœ¬±O‡zÕð<Çÿ(¦ÓòÛ5µ·)q7U.vJ¶m î q0°%\wZÔtõÆ# _«¿G-*Qo‚/êºx"Ùh¼Ê90´Ž…c„™¡Ð.À F ÑœªÈ•™–1hÉOÅÕžŠÏX’¨ƒÏ„»%¼¡àÓç"kÅC¥èåo¡è,Ü@1Î6©šPó-€Úí\ߗו砣ï-è@Qa˜Â`]©ì¹)4£‚YIqGöSI…ÇÛ¿Õ h¥D<ÑE“N§—ö•¥¢;X€–‰8ŒÆŒG®?]¡>ùòÅtÿÆß¶Àp:ÀR½ÑK’Ç?+ù".º¦×Ý… ½XÊÓ­h ¦tW„ñQk˜ú[f`úJh¤`ýîAä„:çã>F75ZWÖœ7u¡Ôø,iÈͪiÑ;BUÙ…$|Þ§Üx)*6þ¾sò–õ‚×4€Hˆv1[ì£ñ‹_gaMõ½d+Y ãHGõ•Þq¶Î$ª2aQÐ\NÀ 97¸qßCÍ3ñÇ_qÿúúèÓe– øb¸KDs¨D̦K^Ómpêô –RP ÎI¹²_×$âêÔu5aS¨]§„箫iëŠ'o±}Ìvð1L›ðÛíLÌÉô dì‚P_suµzw›]Nˆó`à¹qpœ¥]}™pÎ…LÀ‘ž#|ˆç‘™þYRÐi¦è~"^Ë–ÒWo–µúxtæñ•e̽]¤?1] PGê/¼£[qòwϤÿ>$¸ø³Ã+ùrƒ°PË[–£æ¥{kI™ ~Ö§çê˜J^§Cž(qõÙSå7^<™‹ S¢…”˜¾nÁ‘Ãm£:®‹3uœ„Þù‡3Dxª¬9 3<1Oåîp 8,AÓ³j9K»ï–“S–toÝÖFjÃ:˹­òÈŠ¹[2ç/Îæ6Q5e«ŠyãŽØ g”QOh—Þ:#Üøƒ¨&r»Ce%9§M\ð»Õ¯NÞ ó½‡ú9œÎJËØ‡7c>Àè‹‹«ßY‡œ.½ !)‡ /v@°™¶‡>pгÃPm«IÑ:Ž#µêòß+~­PU¸_ô8Q‰5S°&‘£åºC!¶ÙHŽ­]’¥½ã£>Ñ'·«z¦n$ƒ¾{gO(7“.vHmΔŒñ¢dzuR‰N ̸Y{Ïc_.Þ©%ÙQà&»â÷ɤä/p×ÙÅzwØïs»)Ò}ñaì&/Þ8éGçoOAAñ8cÉ%·Ã‰vgRŸáF¸üÆLŽ·€´`Êy„…„%»5u*¶ÂÔŒÖÅÿ¨¯ºÞ¶‘$ø¾¿b%Àøý‘·dãàŒ\öŒÄÈn`, Z¢7ÄÊ”@Ó_]ÕCrDRöÞãÁ­á {zzº««X¥bÜ|A€GdL<žÅÚÿdƒböÍüíGYOÀü¬#º¹Ä1“ ÏÏ—ŒágnžžÔ¦ýgʦ¤Úì·%¢j·kXb9>‡å’2ÅÜQA§Vìø|ÔuÍ4k‚uê ÍEq‡QÞw¼dÐX¶«ÿP>S-AI©O .(¿äžÏùO 1ÁV2þˆ¬µ<t©HÌq]úý†soÞtöÔPýWU—ºðtÝowå»â¡|óF÷,Û¯ØÎ—#ÄÈ;Ý@à´8.¹f_Õ­}­N™¾“yVë,Ž])ã»rKTüJ¡‹Æñ !Óâ¡KyépݶÚÏŒ$‹ÞŒǃŠñÄ-ý Ñ“`Ñ/¹ÁùÕ/i´ö2ßD®ÀH½ÉñÙ”¿Ü½>'ýlË¡æã@ºptòóW¦½#tVÒnîë¹ùwWnè©z=ùãO›0“#Ÿ¼·ÚeBï~+î')-7•‹ô^Èå3óxQ·>s&ásšŽ•Õ`¦w—&´bwh $£Ô̸æéÀ™}?ì\ò'I|M%D®(] í‘dË`ÏwˆgÍŸ-¢I#\„c|ŽDÁ½F4’‰t8ôSé6åmt’à±/·=ÄÁ &ŠòÌÜw"@–.î ˜‚@?Qœ‰WÒHsÉÉÁjàO¢›-xÍpî ,e”©“ÈÊéB{<˜QE{ûé i˜gd[»^\ W‰'™¹øQÐþ_˜ÉÅ,€Ó³(>;{ºøN|þÊt·w.ןtÅ%!ŠF_Ÿ˜×âë¿¿&ÖKá/©:-¿D)Òòc̆+l¾þÞT… ÈÊ|Ÿ’‚­³05’Ò·¬û¢% ‘Þ+Ô̙ĕ$M‚¹X‚ˆ•µVݱVB†túnßX[Â9®™k@–Vvos´í=½ÝÓ~ólW€b•ÍzœSǘÔ%L×q:e1)p{ÄeÑ„䜲 x B”ÒȵFØ×HGÍÓ¯0Ô<•æ“"ÀÏÿº†M ÇDúÉŒp•”I|·õÔ3ï$“Vf½eê°Ñ;¾7—èµèÐÀWƒî$ÃzËU»îXc)h7KÁhŒÚ Ò¿©àêr#&lHÑ,®+Î×è’ñœ ÌüñƒÎ¼hWóúNO*KCW‚s °ô@R}F‹jg½ùçš3X†ïhΔéáiΚ3UÍ™ñˆ{½© .úÀudõfH½öz3\¨‘^oFÔ›þXm¦Ú ©6ÃNm¦€&"¬Ýæ‚î¾W j·¸¤=pPð¢fš¥3ª#Ö”pd‡“NÅG(P›Kƒõ²èX€*' W±¸³âÝÊéc8"ÌrFðDiO¤±ÛÅûÑ^b-Ž—lŸaÅ@˜ƒPág=9 º¬“§ÙòüÇ/Ï:ûúÁi¡zj^¸ò¼: <‘"‰£NýT¹ÚÃE­©…®š1‘‘=ËãE¬+©˜†õ)­úY æ‹­þ+í²§qIÅ#•÷ªæe™¿(z!N½‘*c¹K2Añ08cYŒI·& -òòÄqm@¹>U7¨7)Œ·ÚÏlÕ¤‹Ë}W*€™ÿQÚþe빕ÖóI¿ƒѵå=©ðSE›ý_(ÚÕHÍ>ÌçÒºŽëàÄüÉ:ðs E¦u°8ÿyŒuvª*ON tò4ÌüòlOn*y! 'æ% n÷×d–rùüÕ‰D?Íd¨!ˆ×Ê)¿7µh‹^€z¡j|^+"¥0µ+k$ìVˆ™3'ÝG´®±Â÷@e[nÔéHÅrktúnßX[Ek®™k@–Vvos´í=½ÝÓ~ólWÜ¢¨šõ8wó¤J” ¼¼ r§4.‹†*$ÊvVbÊïV¹>~ * ñçyv˜úq õ"-ó6}pv0fŽ1[;”oÒ1æÜæBÙm½ô¨%ñ|zÇ÷æoùxC„è{Áa½åª]w¬©àÆc¹x$€¤K],®Av¡6bú€ƒL:âõZ_¼7Ýo¿+ÅŸåý¦ÝKþÛ‰ßvŸ‘ߪI;¿ß6TŒú,TJKÛ–O×s v¾U¼œ“³$뤇hZÅ;‡ñVª&n©b}ê×Z¡iŠgØN„´î–‘Í%O¶¼·â Ú6¦´ƒ@ÀUf }'^ò'îtR¸Xt¡kÜ.ùÁ î¾S[|Uª_ëIí Ggc˜P:¥–×J¹—¢ÿlè0žQ€Q¦NèÒ!t©º–bòY/àP")He Î’ò,™ž%áY„S˜¥Ä¬”)%[ ^Âà¥dŸœ,ÍW•Vo—¡ê Ÿ0X|[‚K"QŒOüª{2Qž&Á²grRNiÄQ­(d¼C~!ú«®áF=')70)°Üsxt4 ·8»}ÔÌaœòî_¹„ËEµN#®9¼É)o#V,g'QŸéÐèÊï6Ͷè>"=U\Žs%r!Ÿ¬î’÷{µ’«™T~æœ\9éQ¦<r*¹±Ÿ%£€4ñDŒ°ïG”kóATØW[goY ÿ^’Ï^YòóíR‹ãü†Ÿt¯Ïå¿ ÿ@Iú·gÚÒŽ}Ø5?5·šŽ˜Òg×+íK³‚£>SäV¥nÛrÕ­Xl*¹Ú«ìgvI­‡Úí i¨Rt¨iÄ“·åv¢n%½¼Pkd¿ÓeŽŽû\¶M-ýLéÒ Tò endstream endobj 258 0 obj << /Type /Page /Parent 343 0 R /Resources 259 0 R /Contents 260 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 259 0 obj << /ProcSet [ /PDF /Text ] /Font << /F4 294 0 R /TT4 421 0 R /TT16 298 0 R /TT18 299 0 R /TT20 300 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 260 0 obj << /Length 1414 /Filter /FlateDecode >> stream H‰ìW_oÛ6×§¸§bE$%ŠÌ[Ûe Ö´ j–ƒk«±VGLIöö÷°»#e;‰t/{Ù@"uxw¼ûýœ—£ìp4*AÁèk¦4ø‡¯Ò¹¼p……ÚÛ\»ÂÀè2;|Lë&]vøz¨à"dE^¤3Éýò&;gc90y).zkVËÏ£Ÿ3Ï<ÔEî-b\2ºŒöº&W´²ÑÑŸ ‹¢„½<|¹ƒá]·’Uç^ÌšÐâÒäµðâõüú—ØÜˆe;™Àð¦]ýÑ,Q£Bå¹ÄJ1î¦ràq.9"N›SÒ*W¥­q?ú1F£G#¹¹¹É¥É­è‘\ÝI…Ïn5Õ¡íQm2cÿÇ£LA ™¶ Ë©ÀÔøÜ ‘ƒe“}Í^òm(¯Ãcub¥h¡ «U[MwÃåÚ\EZn®@¥+8•JceÞËË+ñJ:ŒéXøéÃÞüöþ ,:‰!á:.&“&IÕ=ÀôP0”ƒ*w˜¬Ö”íä-'©{÷°XÂó'ÝÞÞ¦sšå-&‹i#UI×°Žà+zcI§´óͲáRe\¬ÌOR…쪺òtSÜvn“~Óaœ%¦1”U®è®JÌâ˜úà Œ!I—¨ åGmÔoX»›õnŽÙMwÑv V[ÅŠÅôzÞ¼‡æèèÕ|š7ÜMï‚_/¤.±XÝôÝÇÓSø$ÆWWÉá;Ä84žÔv«f lÿô)ë"¦lª¼2…ÚêKŽu_Žß4|%57¤'Kfr¥‹*šd(>I9ú=;ü) ?΢ñ.)Ж¬uÞvsL÷3éb×%öž‚šÂÁæ¤ÎÝêßg¥•]K˪¢Ø’WÚç®ÜkþŒ¸?[¹uÿ\Ê‘Eé‘í6F¼U•¢—RÛ?Nk‡ø>$(•#2Zñ a:bBã™ ”û_oFAÇá€1|£¡UÔ®9µíáºë9€ódä"ÌÆÑÂ'kΛüaŸÝ­>>[›Ü¹mˆ÷[Í{6&|¦¶EÂPâ’ÀÆPPJ Ê#Tò ­ÇB§‚`Ú5b(¡viûÞ­¸wi*¤Ç‘hîNd‰ïóVZšßC~-®WÒˆ}^窌L¡ëz3 ª§£TJ,$ÐÃr%Þ~ÃGŒë詎4Êøž¡`KNŠS2ÁÊÁ/˜¢Ü¾°“t)¡YÁjA_àÝG.‹§§’ÙŠ?óaÍ->[yƒERŸD²Kç^R®?:…Çg$„ûÑÚô®Ê  3Ø× »p€ð] Ò 1?Îáã!*×ymJÏ—a]½†år}ÕâC³º^vx„<[m½óÿ“tFìÛNmòwÛ|f™Ïø·Ñó™]ó™M|†bußëm˜Ì2“•ÛLf1YÆsšÞQÀE‹É 4È´VÝ£µ3Öïãh%5/³ÚB«· sTiÌŸQᆱœxy-•ΡcKòóÃU±y1܆µ,^©×ûðy¿”¸!I÷sÃógÄ[g—eþz§õ.9±COà÷‘·öy+¿R܆ž¤õÊÕù^fÝ+¤òDáþêì6~ZÚŸëcf}îÆ>0Þ#ÿ>æ¬j>½ÅœîÑЭ™ÓGæ4Äœ>j"¤5NFâÊH AæsFž«Yü@4ÚÅå”džœ'—Ve±¾ÑK­J\:l³i|•â@v'<ñçqÛź;Õ)o6„ZúM‘}âÔ ד †VñÙ¢{ü‘ÝÅ Á,ÕµÒ'ä"E¿DX¬añeÅ›q´Mz$šöÄw#þ[›œGíYôï%epwM7ä¼8ª{Ey·ƒ­¶×°²ö |’xþ¨ÃªÂ endstream endobj 261 0 obj << /Type /Page /Parent 343 0 R /Resources 263 0 R /Contents 264 0 R /Annots [ 262 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 262 0 obj << /Dest [ 131 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 227 694 252 708 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 263 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT10 293 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 264 0 obj << /Length 2786 /Filter /FlateDecode >> stream H‰ŒWÙŽÛÈ}ﯸ˜—!›ûbÀñ#Ëăie¦‘t`°©’Ä1E*\ZVþ(ÿ˜‡œ{«HJ²Úq°Èb-w9÷ÜSo–7wËeH-×7žO.þá'LSÇMݘ’,vüÔ h¹»¹{Û¥Tt2Ç¥®¨oî>Ü{´én\ÇuyNq³7ÿ°~ÎíEà„ÖFñ¯oQØÿ\þé&“ 2J\'‹qHšE;½ÞOx+~ŠõFÿ!ßuCZðOFOGº?Ö½½ð'³¶ª+ñ8‰ÕÑ>ÜÒßÿk/b'°Ú²ØÞÒý¡ìÿ­Z̈0¹²q@håõÊ^dxÀ–b‘¸-.ùžã…q‚÷å;m—Š5Ú’ÃáàØ[vä­Ž¶‡ÿë~ =ßêÊñƒžVleÿ÷ËJºñcáô(HðCx |b‹RjÕÍúædÃ7Ùø,–ÉÓ­‹ÓP‡kN…ËFZ™ØËßy“ØlâÄñèEæ›9ÀuüzêqG”ÅÝ{Õ÷e½éè³:vÔ ÆnííE’ âø '²“ŒVœ÷­^­¨¬9MÅO¡·U©êžÞ×›²Vk˜›üó<Æžö­ '`ñ#›µ´cdz¶}b)êä ñ÷ñ£í•1Z?!áôœWƒß‹Âf{Í"=ªÿ/mÎÞS¥¨oísša³%ä—>îUýgu|x°3¸øðpKTÿ«"¼õ<Œ¨Ùž¥¿" ·jX˜á®"às¼§Ð³gêááôr€Ç¡§ª)>S³&¶%Fœy¿>“ÈI-z´ôƒR9¾<Ú´Ëd{®õœëEGvX_©½íñz¥êBEM-Î=+=YïVb”cÖ÷ŠOçhÅ–¤ñÄ‘`tÄqÅL}jóöèÐ{w=öÊÛæ#ð´ß7m߉릪š[ÔnNÝ«søŽõÆirQ$qc¦"ë—ëÃñÌ6ž{½Î<7uB÷bËÚ¹z¸Ö<]ùBe}¨š§¼2¾"º©µanJAbŸÇ*CžRÐ/'0Èø>„Ì£Çç›`Yu nè5IÒÅqÊI ]/™ ÜŸ#aÀüæøsÞo­GÛø—¾T–‘n ×|Á{§¤ÂËz >ˆà+Êi£jÕÂQ¤ü©‚ð¬@F±’^AâÉ£Õª|žeðÚÔÕ–3ÆEi§ã#ÛAŒæNŠ@F7Hü $Å{&H‰i‰ÖCUÍ#ýÔ «´c(O®Ï§L†ãiû*ï×M»ÃI^ÊmeAu¾“ÂadOŸ¯PÀUëy16Œ´±ó½¸ñqÇëFn5Ü·Íj(¾*N½q4™GìòzXçE?´Üà NpP«ð^wÓ!ÈŠ‡¸q[ýNú"*šÝŽYb¥q¡6hèËN‘×ZØÌ™@@?ïe\%ps¶°R¹a;!8sé±ÞfÎÔó™Ä=«ÞÜÒa @»r³íÁU©™,çýb´)úêDñ£ Žû:SOCY­:ÐÙgEê˾dЀew =ÛÒ[8mluàôÂѵ9ï=£àkí çm™×}ѬWSÌ Š!ŒX‰2SÀ«yוë²È{2/£ññŠ\XôZ˰¡þ\7‡úöEOÓÙšT[ã½¾_"P‘õî–ü×?ÿòñ–‚׈d`C'8úÕìF›nÁ£¯ß½ÿéãX½†XF÷}Çf„f—ôxW4õºÜ`3^ÄtZ…nÖòahóž™"”TãàZŒ¾<‘u`&¹EÔJ­Y~@¥!«[znP—%úüa«j:´%KÂBÕßâœÅ †óªË\Woè¦,IÏ«·Ú–{…NÊ5žöŽ/÷¾Z„±Ëbv!ô%ÌճힰÖwœ5ãn–V3›mЙŠõæÓg…aÆ,d³ž‘oܵŽ]¯v‹C œéDÏf12 ÚòŽÞ¾z|´EÿÆé,Ô^sè¨ié¥`|!#® P±‰dÖdR–êö'̂ﰈ­I'¦Hek{4Ũ/h “U©YÖèßÁ°Š~ýÑL§ûmæÆš¡íLÝ“¶ƒOùPõÚº¾aÀõ W>F}=dF|ÚháÓ “-aËýÐãÞóRÅzs_7Çp7¿Æ4ÞÌ4ÞÄ4ÈåÞØajX[Q&݃áÝœëEÆØZ^Nk¼z¦+Î| IW¢ËTó‘ê‹ÉBbMYMR‰—Í¥q’DHžŽ£A,ý±Í÷¡†ÂX"j¾ê1Nf&†¡êU÷Ýì#>‰n1ÇÉ G‹¹ö®ãiÛìÔªÑ!ÈsÒÈÕÚþ‘z÷gÖ†¯Q盦¸û™Í-¦*õUÈŵ°ÞØ|¿_å}>æÀÏ®ä`ò(³LàÔoP:ÒHþøIÕ…ºš5žÃ.F–Á¶¥ÙFT¦w}•ž ÙBƒ­ZwR³Lö*¦Ž Šrè;FëÉîz´ÏŽ™ëѪ›ž~ºú V/pÒµ‚Y©ç²PŸS0& Å]6ûåp,¿èªê5ÂK¸Ç C]þkP¤§¾“öyËqŽ­¦ë+\NÛ\²’.v0o¦´ˆg›çÑ®<b=ìžø¶sbÎiãe ³@ϵêMûö¶å3nšë¥éKÂâšdHæ’‹(Aåy,¸Kúb䲄YÐ_Oú¢‰ÍvœÉ­l_ÕIGÉiYÇN&íÔn>CÌЩö“îÈQ=­é8²®µeÄÄ»Q«EYËBbøû¶é^îÙ/öQnIªmGvËNÚ(ãNË‘X}l ·Täv Õô¤øfȨÎiÍE@ÎˆÐØ~€ò×÷ÅÜÆ³IFFìYLEÒ‹7ËìnŽ2”o”~ C‰ºÁù܉ …`ƒCo¥Ns-µu2Y ‡+úìÑ£M¥~ÀÈuqLâÆT“in³GÄvN&²†K-¾šAÒ2$‘NÖï( ß:»~…}ÆÎ_®ÍmB s mÇtyu…ñ…ÒÑNÊ®ïÆ´ÿì£9ÈÓÕê þp{K|(Þô™ÇÇ|Ï2•?ÀZî¦y¥_”oj‘YÄ5#±m ôZ¦¬QD<çÕÀM“ÄMÍ?/AÁ›‹Ó“â´Ø»ü »j×þŸ:O¦X™Ú¾¡ªZ„¶/”á®…”Äi†Ó\Á£Ð¾…RøÒßÉíd§µù ÁÌålÂyA—^Œ, ¼ü‡<*Q²`s*Çt¶2—ûj&DØÔêÿmf7¶O¬Ê3½»‰Ü¾„Þ/çˆ[W%b6Ã#»8!  ïvžÏ—ÑýÆâ¯©«ã+žaƒ®:NÕV}µÓÚƒ}ÏuRöºh[%K ‡ G !&²!ïµnãŽÈ©_7UÕ°ôE=9îÃá¯\€rý3è1F4ÌÑ71°„`;žuó¥ ]̘œ!É‘i9ˆç†y&³îÙeÜÇrÅÇ-b7à.+Eò CHd/’Y!Úä‚!ÀAÔ㯸ˆhy|¯·Úë¦M9@><¡BOÿßòAúÆ@Me.¨L)Ð9@ÝP PmUR *Gš.4ç‚A *ÀVgX ‡"Òý½þ²0¶„¶Ã€ŽJML¤ P$ ·’¢R`f‚'$SHê6©2!\…ül¬ÉÑÌ50D4©òSJ“KœÁ)ØÙ3·þÁi-”¹,ÁÅ(Ò¡n€j€t@©1­(?êˆG]C¸(ÚÔ® endstream endobj 265 0 obj << /Type /Page /Parent 343 0 R /Resources 266 0 R /Contents 267 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 266 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT8 290 0 R /TT12 295 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 267 0 obj << /Length 3063 /Filter /FlateDecode >> stream H‰”WÛnãÈ}÷WÔc0iÞI-âsÙÙÍ\Œ±d4Ù’˜¡H…¤l+”ÌCNU“¢,Ë“ XÝÍîêêªS§ª^ÏÏ.æó<š/Î<Ÿ\üá'LSÇMݘ’Yìø©Ð|}vñ¦K)ïdK]^Ÿ]üríѲ;s×å=ù™=Î~WW™eN¨–š}Eqhý}þÛÙLÌ(qYŒK‚t8´6çý„Eñ(6‚þM¾ë†dóÏŒîvt½«{Ëög¦Vº+1 œDuôê—súÛ,;vÕ–ùꜮÊþ_ºÅŽ›+ „*« Ëža‘¢‘<[žä{ŽÆ æó·F/mŒ&Ž8±ê ‘Eí,ÿë~…7z¾êÊñƒÙ–¯DþÏó3J:ócæô(HðC˜>±F)µúlqöz~àƒÑ:Iì:éà‚ÉôödóC“mÚ¦Øæý»*[B•0œEPæ/–Á(â‰TeESW»ŸÆÍ´¨2‹í³´l߉`ÈEÛ¬©*s]wz° Ël¹/ž¼Wÿs›Õ}Ùï`ÿ0ð!Ά <Åw‡°ˆfá³ýÝ–çªá†G1…~ƒ€éF¼Ñ ÷7òÐÜhÎ[1néžšËdg&,F®ÇCVeUôóëS¿ÛXž0~¶?=Û•(²]WéÇnŠGØ×ÔÛõ?-Rº¥f!›‰wóD?nʶ¬—£¥©i©Ðë†ÖM¡éFÙž(ãqôÔn2)’°"ê’ê¦ßK¼±¬ù?8´SÚö ÃwühB¶?ÂÇs@,ÊJ9q„0ÛªÔuO %1 $„ªïqŰÄZ š”9&K7°|;LJËUðG¬‚uíø]ó˜Ù0À^3oæŽÉRúÒÐI½4¸êºDC<Î&j+°˜Ü¦ùµÙ»3g柙j[ÛxÏp*3_ö2Ø=Ô|Œ8¦ÕË 8†çèãW$j¸tnq0™Ã¯‡«é ³ÓL½ÂT}ø0¬¾%™ÆUYÛËúÃHøüéÍÏt§M @mtÍë¶wßõ®cPØ“ ×ÏÉ›¨¹×íC[öüìtÆJØÐ/e÷Þ7UÖÃá7Ý5M¥³š)di¥!‡Þ×”gÝÁåÚ†šmUPŽ€K•䆖ր|eÍFròï}ñµÑ¤hd-ë¼Yo Î]¥áÔXÐRžŸ¯Â¡¥Y ñQ =©T.¦ï?Š£¾!ÏÅž™ð Cß—]ÙðÛ»ž£Q…>¾±|C ¯ªªyè(o5 ƒ¤òzB‚b(»'öÛv2mì<«*]ŒAó˜ü}Â^³É^3£ Ô³B ëÿcÅŠÊ”µµ¼4è,õ(NQ ©QXc‚ž—á1‡je‰ÙÀ¤©êdESÖk’Yè-v¶YIà6v¡‡r70Tư9–>ã –ZÀ²›MÒl[ãQð)´§¼áycÑjM†ØÞ4õ¢\nÛ¬#ô€2{y“åßH_eK=¿¬)#Õ0ÊúA»ãLõ;ôdÐx Ã»¼‡$¤—Iî³¶l¶f‡3C‡ røÌhâY b#’ßhë¾9•˜¼`A…4°ÿNxè7Þk€ ƒh|f0ðÔû ¿à@Ê-O ¥ðºj«C2‰“cñTͯtþý]Ó¾ƒ·-G8ŸK‡)Rú¶Òµ$l¶E1Šº{C[ L$')79“­*ÑôêêêöÝ\f_na»#V ~P[èzYÖú¶Ð ØÇW¦HpV7Ö9;N‘ a®Ë™I6$GD¾(«¡äð‰Ìy9øŸçZfú^š ø%3y‰@´Üge•Ù§J!ã@{ÂòwBÅ€p«!¡îP(‡ôöõí§ï9ƒóMÆÆR(ñrΡO H^;ÕT팂¾øL¢Á‹"Õ †ÌŠÞ0 ÁÀµ°AV™9c4àÒÈ7–‹ø#ýŠ+0L`R„ú"äò‚cSî&^8¼Z†ûžÛ j?UiTˆOÉÉ\"Lò@FæëFÄë¼”Ë-V3¦óts¨qŸ™ |}Jï^ `î­~¬x¿µOÆösšmǼ4ñëÀª&^QwZÍÙnÙð}dÚÊèÊb–L>P¾wÆxÿQÑh2ÊaB!ºø“)„†êñ=ÏPÔüÑœ$üáÊ| ñ‹Å ™uæ ƒá‡µ Ô²i¢Û3±ˆ¬ =¦–Br¨sÙ“b@öMÞ õŒ’õmVw›¦íiÃ]hor%dvýDî%*šj[˜„ñ5U¤¸{SïÏÉ»\õýæœ|ùíÎ)¸|è6ç/UKÓ ‡†—Í~¼-Û";§™)U—&ödý®?§[ÍàÐÇÛ>ßœ.xN—büÜN·(£¾~yÏ­WqnÁW×»:ÿø®å+ñçS=ÞÂ.áÝœ 9$C„É ¢ã0å¾–‹]ɰÚ€éJ¯™ó² *P6$àš©fè Ce¤üù`ÚÂkáéÉÐv%[Ël1ª¥{ao)Õ-ÖÓ±‚“fØþ… ¸™Ž”ÝKÙÆTì&W¯²¶àÄU˜†Í>åÄt2Jz`g)…áƒÚ›>S&_‡ -PYhaÔ U;žçÒ šÇ‰9ÿ ‰ªkòïݯM×säz©qgêëÏoþrÍ<öˆôX­îºÿrΈgÆ'lGP·zQª?IõöR½#©_ÅÓÊIá‰Åco÷#W?îN+ïÅÇGâ€ìȱ¸föÜ5\cÞñc'Œ›Oùâ儤ÑßÒDF‘d?{Œ¥ñ .ô.-¶Á7Ff¬^ÿõãNø!›Ë=mz.üº,—æçA½àÈ»mY©ºíF²×7¾Æ²`vxÐ)ú:Yõ™2]ؽg¾®À œÀ“X¨j|¢¬òN.ªÁâÛ¡¼çq‡¦i#¨›6ß(÷2ÛöÍ:ëËœ3§ç¸çR—ûzÇ9ó¨Ú2ì`§š™÷ e¾ï2ǧW7vX ½Ìû÷‘¬´ÇýC $xRí#—uQæ#-éŽ}Å9ŠSI>4©‘™áYÀ E·j¶U1¶¢ÿ#Ý@µâ¥<ãNýÜTÙ‘±x¬4úˆšë䦿lJýjjY_ñ[g±?$d!êOîh8;$æÿ6^>­ A¿÷S,^š‚Š¦iiz 6J!XQiÁKYÝEù#1Rûí;of«¥šÚK !»;»;óæ÷Žû—ïnã´eyå}™É†ºù ™ˆðÏ´q.7ñ†WgÜ忤{;L§àö©mîÂ'&êp’ªé˜þУ:Í­á¤-—€ÂŽï‡€’Žïò%IAcž;Ü/”èU©œ–Á Ùº¥8u‹²°§}…W=º²ž&€A¥ØªL”Eo C¬Ø gm2ÐÒ?¹TßFk[ 3½FU¾È-Òyjµ<Ü*ºE#vèѸŠ»Þm¿Q»°{ªt ¦­Ò®írâ0sQöP:4ÖrpD'W d" eSš9ŠmêKŠö=ùr‚ýž¢ñ(žÁL¾»oôþÚ ÜWy. £ ÿ?‹§ì»^eD|¹dR¼'ÕT¥[ä‡ _>ßCDI„’dMÉs<ž³úADqÿTI–n£Öê#Í2d÷ŠbèKr÷Ô$+g]çoï°*óMfkK*ª £*v™Vù#ÌL" ÇÅ•î ïD P£= èZ^PÑ5@º×ñIwN'÷ÀpÆÅó«/4`¾ endstream endobj 268 0 obj << /Type /Page /Parent 343 0 R /Resources 269 0 R /Contents 270 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 269 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT8 290 0 R /TT12 295 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 270 0 obj << /Length 3076 /Filter /FlateDecode >> stream H‰´WínÛÈýï§ìŸ&Ã!EŠêÉz½p‘&A¬tÑÆE@S#‰5MªäÈŽú }‡¾côÜ;C‘’ì4EÛÍÂâÇpæ~œsî½oæg¯æó‰Pb¾l*o†ÔèÜæ¦lêNtëf[-\\|Ä#¦Xp(&ûóè’Î+Öº¸p¿óÒ@I-îôÒ›`Ç™Ê×3‰ØDx)ìãEx–ÛW¦¬W"wovv]]O…”%ñä–Õ¼›ØºSìC{#òÍÆÞ7î·Ì®vx×=r#"7>K³ÎÐy±Æm¾²!0b÷[VöÂ:ûx0…òÂT  ŠF<ad‘c¿©¬WØÛò­— Wü¤‚ÿ‘ÌWýžŽ}€ËtØQ tRŽNâi H‹"¯Å§ö㸂WÝrD2Yz!L›F¬à…‘\壈$ÀÞ>£–kiϵ(Ý›þL¤É-Mt©äžŸàM'–1:•néÊóét@Ç-ܸoÛ~/÷Ü}¶³w3+ ÒdÈ£9€8ïñƒíªi¯tn¶dT”„±ôůmitSSÎ]ëšÝ~Â3ƒkð.µ7•ü•(š…·@OBéÑâõ‡_®æ|÷ñËׯ_EY³aƒ]ß"€®We­¿,ì-n‚õ­wN¬O’F‹fãp›SÚ°Íf&ºWŽ[àNÉ¢Ðzáy+/ìðƒ¶€'–Z"ÌË*÷αSC™+!·ž€ ´;€ìQ8y%.ß|y×üÔÔ†4N²ñucÜöücÔü/c]°»ÏFøÁ)ˆŽÊSîÓd¤¯!«½<Î-N¸‘I<âÆ€Õ££$AO8üQÏ_+B™|@j÷œÆS±ÍEDü$‡à-hö9^&ïE=vÑ*÷€Àg³Hh™Eý0§E±Ûè¢\–ÒÔšDˆ˜Jb8d6m³,+pd$ ˆÒÕÐVTúQW,嫪¹Ë+ÿY¥>•÷ /ÂóýÆLC ËØõTZ}ùHFLƒYãÅ{êkLôù0ÒêÑ3´t/Fܴܦ ú€ƒLrAr–¯Ä#×{^µµìM‰»ôüãåûwþKŒ ³!™ ÄÛ?:– æ.I©²R:•Äc†ä€Â={¹@ KWa—mab¦Âx€‚èú=<ü,Á2RíZÝiCU°/¼¨ â!‡DµÚ£$\xÜUhñéú€ÀÇÉ—ÏúGéEizjP³g÷`}:XïjaÕ@p9Í ³Í«¹ f‡ëeIyU}çµ ¨Å¤n@ɲªÈ£‹u]¢|¢sÊ«Š/vÇ.~fmg›·´ÇDRq£ÍrÞ5y±Üê[‰Pýý¹ÚFƒšXކ£v*ô‘Œ€®“ ñÃrò6«Ø¤¢‘\hüo«0y3‘šƒk 7 BuâS”~ºfVp‹6tg È8#8dTéËzÉfÃ%£eqz°fÛû^;¸ÚUZØJ jJµ°¯Iñ¿SNö¸±T«‰p»&]kœäad³ÿa¸‡Ù›íÓLLûŠ0…á*ˆ/Oª‚KQz"åjà°r¶ýcJ…ƒ%d_8î9¼3ÊDÚEÂþh+b{™£eÔµ)Ö¿”%OYšPá2ËÓƒ æÀUÖoWhù €§3 <‰ …óªÊWYâÉ$ÁξG"(æhç‘XzeÛMMÊ!Ùv 9ìÆ®?–òãµ?ŒuÇŠü-14-¾ødíÁZè–*Ÿ¨bšN4Kšz륆üðm¹Ñú9ìÚþbßjÐyT1\@µbòÚØ«}eÐ}5À4·Ë; Ë1éDóÇÓ@SÿØ $zߘ˜Öå]i¸¼€Á÷½wPMPò\ÜmÍHªŠ?ëäq£!‘¢O×¶×ÅÎÛŽŽpMUO@4’}WõßÑî¹v%˜Èï*J#ŒÞ çR­}[ˆVtˆ’hp(rŠó¨[Ë K±c9“ÒQr€\‰\[RÉþƒW¨ƒA #þ‘— 4x9¼œ¹ä–-°‰Ý¦Ò¥ ¾âN%[´Xè ”‚ïÄ›…†Ñe}Ÿav”ËÓ®}["\]ó0j \(0ÈÖ‰‡rµÆHûµì ·TÍÖÊFÑ´èô6Mí_Ug3 ÐØkS¹2L®ÐüRõ[Û'†UóDÒ“,Ôô0 ]8ú4l!úÈ ÇŸ;÷ÃØ£fL÷àÄ|øu<ÂÚâ9®$p¦å)$‘5Õ8ì¿ÔÙ'QŒµ¸Nã”EOQî@¢ãᪧ¦] ænQk©é>Ý·i=Ÿº?ƒ…ýÇfÜl-Ç[âÀ.ø–`ñNÝœ8O&3 <‰s2¶sujÝJ×hS«‘ôµCVÂ>ü*ßš¦ÛÕwÝ@óø 1uì˜ žâÓß”‹ßâÔlB-Èk¨’n77c^_ž‹0"ü½X–-ÔeÓ– ÊÕî\D•Î÷O<ÈX$Íq•ø÷cµåEÁóÁÆâé‹×½ôÜ’n¶Úu+ËëÎ…º0åƒ^)Íry.â ÎCûÒ$8.yŵ<õ¨kê«Pn½ã6j`gok‡fÌ\æ»9:£„6ð¡Áõ–¦Ä%+ïãͼ4‘Dy"q^ñ·z·ž%äd×AêPP’0fz|À”§TÕŸÏ_>}èw‡ÓÕÁéOZßcüP}‹åî÷Pð5äôF©ŒšSŸ»[ûà©ÜÙ%dZËß C dóÓí¦$,,Ý2]çwtÒTV<é°ÉöU†7| ]/n¶õ9—Wua jXØë—¡†ÆPqc(ƒ@¤7¹áRó\ëzÚؘkšvßÂ&®ÿ˜@ãYrm!H 0½ nÅ ºËÑíŽmµ_¢âµ›uMnG’§¡iÜÙþ Pž§°X…áù‹½¿r½?–_P ^{üWßÕ²Ô ï~Ç=˜˜ð {VVyäH‹* ”n ù{{–DÔ>f§éé™~Öi”î·Lkú½žfŒ¿Êá¾ÒR®>ßù·3¯ÐºÀË0¤ û˜+Âêde?£ÆH-““®à‰}x²é°À³e´ƒ‹¬5™yLfyL–yÈ\¿IYÂLú!Oîë‹CmŸ ó †ìj%Ú»«^ÿ#ÆOŽ8ਤ¬Æ¹|#­èX|£÷c·J¹§î1€P•sËñò ¯‘íÙúm€”Ÿì…|£k^ÀƒØ ;D»˜sb à¦-·‡J•ϳêè]åÑ}Åí…—Šiìæ^®dBÍ,Ï V#ƒlu¯ë¾ªéü‰&Ø;úe³®›ºùP‹ûMÓ+â[?8É*Á $‰åy+u‚¦ÔìÉTïˆûGÑ"ö‹%?›M$F´º³î†Ð·¡i[2o šôYîÈX1çêÇéÕ£\}>­9:Ó±ƒ€ÈüÝvp9ØPëj??q1›Ëç‘D°TÓƒ ]i©DbÓ ëü–×üáuXá§ endstream endobj 271 0 obj << /Type /Page /Parent 343 0 R /Resources 272 0 R /Contents 273 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 272 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT12 295 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 273 0 obj << /Length 3154 /Filter /FlateDecode >> stream H‰¬WÛŽÛF}Ÿ¯hä%$0¢Å‹(*ˆ Œ¯ðb21ÆJœµga´Ä–Ä EjÉÖÈʇì?ì?îÞª"EJ£ñz/60¤š}©Ë©S§ŸO/žL§‘òÕtqájˆÿxDIâ “a¬Æ“Ø ’a¨¦ë‹'/êDÍkž3Tõ¼¸xò潯–õÅÐiÎübоî.>9ï´;½ÈYzŽŠc÷/Ó?]Lxƒ‰½IŒC¤Y´–õÁ˜¶¢·X6ú‡ †ÃH è1Q³½z¿/¬;ðÇÞÄY™:ÃkèZ]½¹Tÿéb/tªl¾ºTïw™ýÃT˜1ÂäÜÅ‘£‹ÔLð‚-Ù"v›] |Ïâ1~O_Š5~ÂÖˆ%»ÝÎsC/vjìH[í] »‚~àÔYûA¦ÍW¼ÿ«é…¯2uÄ>Âé«pŒ‡Â0PdQ¢*s±¸x>íå Î8zI“‚.ô„\ñ¿z_Ì×e “¢xD‘ð¢±Ôð©Ý•;7öGï/•ÿtQ•kU›êÞTª,rŒ26Ï3SXs'ˆè¾‰Õ1 )>|²ßá÷ȳuf}ä"Œ|2Á ±£ÒÅÒÈuçÔÛùJéZÛõŒ,X¨Tïk• QU]ÛK•š)Ò¦àã€í@”ãÛr5ìçÊ~‘7rj[VæÎåEƒnÕ7züÏ,¶v[™¾çìïÊæ;©¶ºµ|ú׆:Ën¾ØJˆqŒÅZäzY«EYZ_“ùGÁíNí’Ýw¡ŠBUÎu¾ÑvåFÃpâùˆVˆ¿ò·¹paâ0'ø¨Ÿ„S´†d ¥‹ý{©l©Òl±0ð—ikÔz›Ûl“…]œ¬åñQÍs#¿)òT‰ÇáíâåÇm¼üÆúæÐʵ¡'ìM›ÛÏŒ:£¾‡éŒ¬C‚¢ˆü¨[ TìN‰Þ~PìÒX H¹opƒ$äÚº¾/îÒŠTýxpâ!TJú·Ÿ®):‹lùH§fÁd"ìä­X9Ž;á Ø§ÊMÃPZ‡ª†M}Èn[—z:Ieö>•àmOxQú^g¹|Ó…À™å†IìÀäÁ0z¢^>ÿ|S¾*à“$¾ª(m³=¯“R#ôžð‚ßñ‚ßð×£äË¥ a FL×cGFLãÃX¸.£” ([~‘5buš@"7"/DÑS§9Tô¼Q‰9Tüè‹BC4Ð?ššó‰ÙCú¦X4ªVCÏ…ÊÀÍ µ¥±í'ZYô9¨ù›{“³â_æåLçƒÜ0¡cô”dùØ èÕá‚Å.%5‰%†> Ö.EÃ{ô:åwÔé‡ iH8:1G'‘67fˆ%-JÓŸQW “aðŋ֠àxþ¹ªk>ôJO†šMYHP˜Â†”†¥ºç–%çå[)ΘJ“Æo_þ|sV©>B3×nŠXqid\ϨL…†úÚ'÷±Fk(™¶…‰#"ŒµR5~K™QÇú·­©24ÞÚXÌ¡?¢¡¯uJ¢­ Fƒdnîê—·Gõy çl½~å(“fVê¥W¼_<Ñï«zn·¸„´­•.ÐW‹ÌôÅIÚ@~­÷ª/l„Œ5óUÑêÀ<ç—ý©‹Ÿ˜ºÙæmÍbÊí½±¿jPáDŽ ­¹#áô÷MÍç†2<–M5µ „ï"tŸ1É?îf±ö5Âán“Õ¤eq«B¸Á2Kò&B).»È  à8ÄQúË[®ŠÞmŒÁ'Ú^$$Û²bá’ô,¹#P)á–$fË‚ÁþÝ4p•Y¸EÉ"Ö“hyÚô^ú9]w†'¸‘Rí³‰PzbQ݉ã=ÈÃÄK&ÿÇ4°qãÎÎñ!!,×¹iÐKéÒ2äbÉ­K$±ELðM+Lã¾Am¿4©ƒ¼Iþ …:\Ìé ¹s¬t*Y[ÞÍê«¶Âõ0 ™R ê!jY~üEÚvQƒ?LUªLî[t_¨-im´mÙ€&H‹;ÏÌPAc§^½:?[ »'ÔŒÑ_¸à”U‹W“^ªÙ=ž›¸ôבðìrSgyI¼9r~§¹Æƒ9‰³ô`‹ ká䭜¤šwÙE¶¼o@\=@nQtQiijÖ,õv³)+«¨m9´­ÝoX¿LWݧE×°å}v^P`+U ÈjÉáAkšn¹ÊF*(SÝ>fžÉKæÅs’àgû·ŸXë]CêÑ—EáRÔÈi#270 –¹>9hžyê-3Í=™$³Qžkóì SiüÚJ{yбGÚÞ\3êó. N ²bÜ![R@ƪöÌ#ÁÜêç‚îáFuîÞÒƒ”ßÏy®iã„‹õ]» AôÞ¯àÖmRR‰HjoM[—^ꀮé&ˆ„]ŒôëûffATðb—éðfæ½7?M±!"µe!Á„Rÿ†1&+WBš²Àt=ñvÑ §+‰Ío‰î‚Q#„¨åjš5}@$Qý ò¾á1RtfåÁZ“a~SbTdPæ5Œ"ÌÄÔç)™8ÕJrÒ¢à€hç°'s7Ä_é=ÜÔ§±å7bÅŠ¦+š½Ò\…Dýd•˜àÙwÃH çö ½8#"à§­Ìùš4 M)ˠͥ­hÊèS8Š.¿’Ô‚•ÿ^> endobj 275 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT10 293 0 R /TT14 297 0 R /TT16 298 0 R /TT22 301 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 276 0 obj << /Length 2597 /Filter /FlateDecode >> stream H‰”WmoÛFþ®_±è—.ÍwR‡ @jmÚ&6l8\}8PeñL‘*_¬¨ÿèþã}¸gf–”,×9\D$wvvæ™™gfHgi(W¥ë™ë)ñ$‰í$N¤âEd{‰ã«t;»¸ì•w,ã¨.¯g?޹ꡛ9¶ãL>›ûÙoú&³æ¾臂~=­¢ØúGúólÁ *vìE„CüÄlÚÊ~/&Uô‰¢+Ïq5§Ÿ…ZÔݡÛ ½)º¾ëN½ÿñúû¬ydûº-óÍu·/û?Š!„+ :«WÖ|¨d‹ØmvÉsm7ˆb¼§Wb›°5bÉ~¿·-ߎt¤ê`¹ø¿î7ðÑõtWŽ "–oXÿ‡tæªRͼÈœ®òcü(¼øž"‹Õ³õì‡ô$#:q䨉 ÁzÆ9:BnRüg]V}Ñ^f»«¢³B`‘#žë9Ìrµº-²USW[Y®£o| ™ö©X©uÓªõÐm¡³ªîõ¾¬*•7uŸ•5oÍÔêxo.w}ÙÔªY3@…jp}–MöŽÖ{b}ží²eY•}i-/œ6>  —e%of –¶liÞY_ÖêËGU•…Ú5»a§¶E=˜íìÏÑ ‡ñFc\ÿ$Èy‹-‰&M}oÙ¼eâ™2 l$££Û÷“XÉë­(YØI0F :õÂFî[é¿Hƒë³3áò›7z-Ø9’jÏu~§²Ž½Iÿb<'Bñ€¬0}3œÀôLÓg0ý̘ÁÔ^HàµdHhä~GQõ¨ÈzUÖìV¨Emá÷Á|HGÍê¦L°„pÁ”‡–ê‘·fdŒçžXkå|&Žãœv›ÿi“s ™ró§¦#ºcä¤J)1ðÚ`}¢+˜š1ÄzµjqQEx\}YÛ ¥³U`ÛQ5y¥s‰ÄÇC7“ÐxÔë‰7ôÄ›R›ê¦ÝfUE]agH‡!æ0¸CÙ‚Ó€1ç(z Eo U”AfÄPb .‹B ´£ž~ß´cP˜ŠÃ“î‚L¥vù$?Õ·ð‘ƒþWÍLpCB96—; ƪɇ-ÕÜíâÄÉMÐÄI*¹¤ä ¡ ]û f¨gàyD ‡ÿ£î)GTwŒ6jæ˜'@úSšÞ¨›ë»ô˜ì JöoMÇD'Àôpµç'à@ïX_DóB`–M& ~F\½*Ïk×·¦"#®È`¢Z'LîBZœ ¶‰ô%&‘ýóô`ÙA˜ÿUDÕ¤ [O­ýœ‡‚ÉÕ`t•¸i©fÚäÀEú g‡˜%¯-Š\O-?2‰$Ôÿð ÐãîCr˜Ò7—Ÿ®þy‰Ñ£´'éÕŸÓ»ôýmŠÑé™ÿîT†®)CN2_C‘<\RÞ„úÕŽ¯¡ZÞå‘ '¸xù`:Ùçôý—Ô<_ŠÞßÊŽ”ú’e“u@©­ \zhG¹´z:`mÑ—¡">Œ_ œ. 'I¡¨æ'÷²`º—¹'°ÑUn5]ÈÆÄØ$pªwl/òA© “OYÛÑøâPÂÝ‘Ôr8;¸1|æt“EN´e¶¬ŠE½–ìó³ñ7£sËèµ*ê\:µ—ÖV ÊýÆhïIgôs6 mT‡ã )zî6ù“îDZc*üy ƒéþC`ƒÑ-ê ïèb·ˆ©+0ÐõÍ0~G~µB>hB.Wâó2h‡Nž#= ]"C.XŒuO ™ +µ*ÖÌ+.ßÁˆ¨WÄ*cØ–MW»wHý`2­è,s–ÝÜœD®U<í!@¼Îå£,:û¼h’_œQÇË‹ÝYvÓtk2;ÑÙvWÉÀKy»¿Z>ª”RÌ|  Áã\CŒ·ÙcÁsrcV׿Ú×6†çG«Ž,«¹»Q·ŒuÉ7&´ y­är’=PÊ Z%0DŽÆ $Í4"bÍ«œW›Úh5¦‘ZÙ¼²èÍÕðKËϦQûÚ#Ú‘Y©ùS?Zs20HgÿŸù×ç endstream endobj 277 0 obj << /Type /Page /Parent 343 0 R /Resources 280 0 R /Contents 281 0 R /Annots [ 278 0 R 279 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 278 0 obj << /A << /URI (http://www.openmobilealliance.org/release_program/ds_v12.html) /S /URI >> /Type /Annot /Subtype /Link /Rect [ 378 640 758 654 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 279 0 obj << /A << /URI (http://www.openmobilealliance.org/release_program/ds_v12.html) /S /URI >> /Type /Annot /Subtype /Link /Rect [ 71 626 388 640 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 280 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 281 0 obj << /Length 1995 /Filter /FlateDecode >> stream H‰¬WÛnã8}÷Wð‘bE÷˼M§{{›^ Þ—í d™Ž5+K‰v&óGûû°§X”ewl'6LJ¢TŪsN?,f÷‹E$|±XÏü@xøÇe™ëe^"ÒLŸg_å? gº‘|R4R$™óóâ/³Ü| ©çæ Œ„™}iËï)}Šf è?"ð¼HÌiÈÅòE<¾4Ú™û©›Ëê+LC7•½øñóø×y↲«ÊÍx|®ôªÃŠ‹k"Y4+gžc‚O̶͖ßõ£$Åõâ#{ãgÆöäùùÙuB7‘=¾HŸzq|ü6zƒ=úì«á/+7æûŸ3_Tb$>Âé‹0Å p‚<ÊD§fëÙ“Àf#ãldÇ8¥!|¶“0£/aÙYüJIìGÜ$vã™%Â.°V<7ÄßÉv½€wú 1‹7“;€@¶ŽGQe»R½ÙÕ%ä} °­ÈúJQôð )YX81>¿1DØèBð J]µ¨í]m"È©ŒWþmÍ»<·~Ù……eш¶,÷öñ7Ù´<Ýuý"öã¶åËe­DÕ uûd?c׋–”mÃÚZ}sÜ!Cº"5Q0³! &Ñ)º=ÿˆ'Ê—ž°à$ïK˜lñ-ïÀŽòïºÐû^<öc¤®uæi†½ûQ2b3Ü;™ ֧ɘLÂHy—x¨8¢è”X©uÕ¨‘•b÷èä€Ð é@(w½ ‹nåŠ?µ–뢪û;Ñ+õ#=1'C2˜ŸÐq£õî‡û{be»SͶ]V5,™½H2]™ë¢)•kò 9ºçÑ®92œHõˎ״O<ô8—Ûû/øåàîFo룳LÆL9%S2äf2WüÔjEE øå„ت'¼k±iõ cL.|‘d$B€ #ÉQ:.ä Ä=æíè£q'3±ge»ÝÕJ«;±Ük`q|·¤¦é-(¿†^”äj»k;äQ‹5rhòÌÐSͲ¤Hf¡+Ä0>B›9àY|[ô%n| îènëæO­Pº\vznaNo.A>À%HNÙæ_±5æj~š¬GÕT'ŒR„qáÉ ƒ’Âתç±âêb”k[i$¦(7jõÍyÓK?½D»‘‘î1{ùå¯wä©ç¾tæ±4?Š~ú~½¯éa Û™[€ƒ‹ºâûmsÅ»ð²s7C!4ÎÉ?kµÅj¥Vöµw† bå«|h›u]•rJ«LÖ(€ØªîIMLCöÿóa.ʺRàÉ3˜4Ñü–ÙèFvÑØIŸÝ€¯ö;®×ÔŸ ÷¾I*k† ‚í’š¾7<£ŽYòܼÉõß$ HY3G3QÔbWÐ]mkîy[ðZ½Ûµ(ĪÐûmªÖ¦´\©Fð|gJp]éak,ï]Ëí Û}­+È¡ÄmÕécsÒñqÒáË«’QT£ÛŠ„ƒâ¶Áûs Ü‘¢ÃãßövÒëiv¯ˆ+míþÙ@³ižRYý¡(±Ëb%J¾"ù>¥°-jÚ~}ÿ–ÉÖüU’_%Ãe…ÚÑÀ rŸ\£°¨‘κÏ]EÍTËOPQryÍÊñäÜ41+êb†7í¸,zõî² G£[|yÝ YþŠ#ŒÑðÛ‚Xîq蜢ü‘OëVÚí–hHfÑø¶ÏFt£yªíäVjä—ɹV 3:A²ÙïwÔ¾·ÔÃÈÍ*ÿ¦¨žiäoûsÍ\™c44¥bº]u_7›Íp†ÁAÅpaÚÎoòí{–C€G1XU…Ð/;%pBñÚzší[ͦ?îôØós”‹ºs¸1…‘áqV¿£°&Tm¯µš{œÈ¿‰·|Ü>vš©)·› ZÄìKLQdj'M8ßµKxýLНLµž&TÁ-¸ú£Ó~>4£‡ªTà>•®=Ld]O2_­ÖWúßW)’åÙrršÉI׳JP#¶¾iG°øzq¦•ã.}»ËGÕ™Èî›â@Œ%öY,kš§ïèìÏ_£â|Äâ)?.>ŠƒêzÒ<Ú4w”Çz4A×ã7t=LÓÌì› í<‚Æ‹þ…'MioPF*Nv:5ñ79ùZÇI$ÀJexÛô©ÄW ÁI;cVA%.1=K3â¼bKŸ°cס•œæÉÍ6õ5M¬aé0LR1\ |ZÌþ7Š›ý| endstream endobj 282 0 obj << /Type /Page /Parent 343 0 R /Resources 284 0 R /Contents 285 0 R /Annots [ 283 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 283 0 obj << /Dest [ 277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 447 630 469 644 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 284 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 417 0 R /TT4 421 0 R /TT6 289 0 R /TT8 290 0 R /TT18 299 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 285 0 obj << /Length 2195 /Filter /FlateDecode >> stream H‰œWÛrÛº}×Wàœ±h‚¤(ò±IÜÓ´É9™ZÓžiÜš‚$6¨òbEý£þcº6’’mÒQ’‹$.{a_Ö^x·šÝ®V!lµ™ ŸyøŸ0Ž]/ö"¶L"×½€­ö³Û÷u̲ZÏñX©Ùí/÷‚më™çzÍÉfóîñ8ûÊ¿¤Î€}|„v/Ù^¦*WŽ Ù[–ša=S磂<>9 ƒû&mZ;üÞ‰àÝR›X[ì[c’¸xpnØcÛÐVΛœ,›àä„ôÃlpÝüÜwiå„r¹ÁƒÏÍß— 1œökJ¶O¿I–Ž&iÂ`ª­žøQvûmI:9†@!Ÿµ•bHQ»!×ee‡ =U6Íõ bŸõäúTæùŽ6JøÜÑÑs|’(ùà¼ÍÏÏܺ;¬éœÔˆ*¤w™ÉºÎÕ¤‚ü¡Ûâq¾:ÝÒI7˜(¿§ûC!1ë ½,6éó"_³ß1Ùö3Â1Ñ}Ó±öwg¾ÀºwZ\ÑJl¾O© żi`~ô¤£OE5¢]dRV”µJf ‚IÊý©’I&)¯wCÇ3+Ëq¤t#Þ°"=ÉŠ¥m³+«NÌ=pén]ö§Õê‹yp:}÷8ÿ›˜Ö½ÂV° ÜdGª)=È5 Î~7¿Ÿê ŸXfWªMÞÍØáµ'ûÅ˺3V5ÄJK]ô Z È-à€„Ñ€0˜DŒí!¦– ¤2m¡­¬/[!:|Z7ÔÛ(ã¤*Û펨ÿÝÊšZ9ˆ»êÂMĽ@IdÆëýÒ‡ÝdËxIשöP·…– ìQÐojøKÇLvŠx0›È}ÒeŸÓ%Îç™TÄ Ó7—h¤ß9±gÐ}Y™‚˜©’ù‹½)<Á û•i7Ýx¢>í¢AÈ{A(* à*ŒBE]š÷¦ûκ™Êz Öd—zq$ñ´ƒèCN_ºÑþðì#̽º²4}ÔW=R¸m uóªÍ±2šdê—ý÷£zJ©Áô‘'{¥3ÇxÙVî§|ŸÓqš*‡Ø{­Vß%~¼Œ`õa–ù–]*™éšoò½,ÛæJÅäñå«ö¾ž¼¿'Ò^vW h“oò,m¤©¾h.ÏÁLé럙‘:K’WãcѪÎM +j(X—miÞ x̨­æ®þY}2*ë>؉Y¡ ½.÷ÝŠõC„¼nʪ[£o7–CÂÐ¥åõñ;Ûòǰ®¯Tþ4/öÔókqùØ@,îËêtmO2ÝËîq–:ùþPÂ׸•u2 BÉÆ>|q4ý¡¬¾±ô ’ÉIŒb%a%?Ð\Ÿ#$ËÅ€taJݤE^ïHOg샶îqÓE&¦¨!9ŽZ©¯?T¬(·¹^a·ÕÏ Ÿâ]1”¨°%*q×¥‹N^C„"¦ùê*äHºì½'T©™Ñ8¤›¡u,}¼¸õ`.37¸å£h€÷iCºL¹»ÙåµFÈÛ‚¦{kJJŠ£–\˜øáÞ³§Õw«ÙÿçxpÌ endstream endobj 286 0 obj << /Type /Page /Parent 343 0 R /Resources 287 0 R /Contents 288 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 287 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT4 421 0 R /TT8 290 0 R >> /ExtGState << /GS1 426 0 R >> /ColorSpace << /Cs8 416 0 R >> >> endobj 288 0 obj << /Length 953 /Filter /FlateDecode >> stream H‰”VMÛ6½ëWÌ‘Dc®¨o“¦X´è¡À*—nŠ@–([L©$µööõ?öÐ!EÅ›fmÄ0 ’âhæñÍ›¡ßUÁ]U%À¡êAˆ?’¢`af—‹Š0†êÜý¨ h´³ A72¸»à°ÓAÈÂÐÚ4ÁfƒGò[M71KÈNØ1"‡ôê— tJ\²2à qá?:,ßG¹uegÙâèˆÂ0JØ>Ãó4tÃsV’½Ð=Nc– oïßÀïÿÒMÆb¢úfÿ޽ù[(´HÑx  !µlé¦Ä ºtˆÜ±Ý‘"Îx’帮Þ/hxáÐ,HŽÇ#£1ˈFÖÕ3åø”fgäÑýº±˜5{çÿ§*àÐCeéäç8.â,¢”ºàËFñÿl¬<åYȲd!꜇ёOž8£ÕŸ/rš±t9‹KLvΑ£– cSÐÖ¦ÖfTähJÝ>{/ËÆºÙ öruµDt¬¸°ù…°›sÜsØG¢…Öý(Á’Eô~œ‡¶CkS+#ZèÔxð»ªçñDÅ5"’3É‚¨—F(‰dLý$ ‡Yö ÍP5^ÆÆžÔ¸Äáf4å5~0Çž;³h¶sס¢Tµ3Ž ˆ"%Ãݨb”7økömüÕÍm½=Õv²G‹'á5ú¾­õ'O†£fÙ¬¤a.Í]o¶1´7ƒáWÀð/X¸³ßÖ-LµªúºŒãKq¢«*N¾¨Øi†Œ³±UKìp·ÕK_£7:Óëô@ÄÉ‹Ó`0=Ê@W÷ÃŒû‘ÈZap©á³‰!w½é­°’kDg¦‹%ëÍPk,‘”,Ï¥}л¯m‡¨Ä]¿ìì†øÒï½.€ˆ¥ùWI]a¥aÈå¥"zµ·=’ÊEÛSlŸDè%4¶˜I­ iàágš`Ÿ¾ÿt:°ê[¿e9üµ—ó ž„Z^aõû½Ñ^œtÔ °õƒ^Ïa(…Ÿ0­ <¾ ÔGòAŠÓ$[# ±¤ɱÇJßÑ‚‹×”HmP8»„RØ,\+À(¤%"M?X 9éiHv(—O”sÒ,ߣ-»Dû9”åµúÍi,z‰×aLlá%l]¡lgùÙ Sœ1Ù6zc(¯gþŒÄ·€r)GÓk%ðÕ™Ó÷{ÄC+6ñ™ÆŠ‘=ÖïªÔGòïÒm­LÃŒ5pÛy@‰L+!·é°¥Ðw}ó"zý›ðŸ—šN½ endstream endobj 289 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 148 /Widths [ 278 0 0 556 0 0 0 0 333 333 0 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 0 0 0 0 556 0 667 667 722 722 667 611 778 722 278 500 667 556 833 0 778 667 0 722 667 611 722 667 944 667 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 ] /Encoding /WinAnsiEncoding /BaseFont /BAAOGA+ArialMT /FontDescriptor 311 0 R >> endobj 290 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 145 /Widths [ 250 0 0 667 0 0 0 0 354 354 0 667 260 333 260 552 469 396 469 469 469 469 469 469 469 469 260 0 667 667 667 0 0 656 677 677 781 708 615 729 865 396 375 677 635 917 844 792 615 0 698 510 688 760 667 896 688 0 0 0 0 0 0 500 0 479 552 469 552 469 302 542 552 281 260 531 260 844 552 521 552 552 344 417 313 552 458 708 500 469 469 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 250 ] /Encoding /WinAnsiEncoding /BaseFont /BAAOGC+Garamond-Bold /FontDescriptor 313 0 R >> endobj 291 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 1 /Widths [ 460 ] /Encoding 331 0 R /BaseFont /BAAPEO+Symbol /FontDescriptor 305 0 R /ToUnicode 332 0 R >> endobj 292 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 181 /Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 600 0 600 600 0 0 0 0 0 600 0 0 0 600 0 0 0 600 0 0 0 600 ] /Encoding /WinAnsiEncoding /BaseFont /BABAEM+Courier /FontDescriptor 303 0 R >> endobj 293 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 32 /Widths [ 278 ] /Encoding /WinAnsiEncoding /BaseFont /BABACL+Arial-ItalicMT /FontDescriptor 315 0 R >> endobj 294 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 181 /Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] /Encoding /WinAnsiEncoding /BaseFont /BABAPM+Courier-Bold /FontDescriptor 307 0 R >> endobj 295 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 219 0 0 469 469 0 0 0 469 0 0 0 0 0 0 0 0 0 0 0 563 625 729 688 573 708 0 0 0 0 0 0 0 677 0 0 625 500 0 719 0 0 0 0 0 0 0 0 0 500 0 406 0 271 406 292 0 323 417 229 0 521 219 0 427 354 406 0 302 292 250 427 344 0 500 333 ] /Encoding /WinAnsiEncoding /BaseFont /BABALL+Garamond-Italic /FontDescriptor 317 0 R >> endobj 296 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 1 /Widths [ 460 ] /Encoding 333 0 R /BaseFont /BABBOI+TT1D2o00 /FontDescriptor 309 0 R >> endobj 297 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 126 /Widths [ 250 0 0 0 0 0 0 278 333 333 0 0 0 333 250 278 0 0 500 500 0 0 0 0 0 0 0 0 570 0 570 0 0 722 667 722 722 667 611 778 0 389 0 778 667 944 722 778 611 0 722 556 667 722 722 1000 722 0 0 0 0 0 0 500 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 0 444 389 333 556 500 722 500 500 444 0 0 0 520 ] /Encoding /WinAnsiEncoding /BaseFont /BABDEC+TimesNewRomanPS-BoldMT /FontDescriptor 319 0 R >> endobj 298 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 124 /Widths [ 250 333 408 0 0 0 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 0 500 0 278 278 564 564 564 0 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 0 667 556 611 722 722 944 722 722 0 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 200 ] /Encoding /WinAnsiEncoding /BaseFont /BABDGD+TimesNewRomanPSMT /FontDescriptor 321 0 R >> endobj 299 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 122 /Widths [ 278 0 0 0 0 0 722 0 333 333 389 0 278 0 0 0 0 556 556 556 0 0 556 0 0 0 333 0 0 584 0 0 0 722 722 722 722 667 611 778 0 278 0 722 611 833 722 778 667 0 722 667 611 722 667 944 667 667 0 0 0 0 0 556 0 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 0 389 556 333 611 556 778 556 556 500 ] /Encoding /WinAnsiEncoding /BaseFont /BABDND+Arial-BoldMT /FontDescriptor 323 0 R >> endobj 300 0 obj << /Type /Font /Subtype /TrueType /FirstChar 45 /LastChar 122 /Widths [ 333 0 0 0 556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 722 722 722 667 611 0 722 278 0 722 611 833 722 0 667 0 722 667 611 722 667 0 667 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 0 389 556 333 611 556 778 556 556 500 ] /Encoding /WinAnsiEncoding /BaseFont /BABDOE+Arial-BoldItalicMT /FontDescriptor 325 0 R >> endobj 301 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 122 /Widths [ 250 0 0 0 0 0 0 214 333 333 0 0 250 333 250 278 0 500 500 0 0 0 0 0 500 0 0 0 675 0 675 0 0 611 611 667 722 611 611 722 722 333 0 667 556 833 667 722 611 0 611 500 556 722 611 833 611 0 0 389 0 389 0 0 0 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 ] /Encoding /WinAnsiEncoding /BaseFont /BABDPG+TimesNewRomanPS-ItalicMT /FontDescriptor 327 0 R >> endobj 302 0 obj << /Type /Font /Subtype /TrueType /FirstChar 40 /LastChar 121 /Widths [ 333 333 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 0 0 667 0 889 0 722 611 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 500 444 0 500 556 278 0 0 0 0 556 500 500 0 389 0 278 0 0 0 0 444 ] /Encoding /WinAnsiEncoding /BaseFont /BABGLH+TimesNewRomanPS-BoldItalicMT /FontDescriptor 329 0 R >> endobj 303 0 obj << /Type /FontDescriptor /Ascent 629 /CapHeight 562 /Descent -157 /Flags 35 /FontBBox [ -28 -250 628 805 ] /FontName /BABAEM+Courier /ItalicAngle 0 /StemV 51 /XHeight 426 /CharSet (/quotesingle/I/H/N/x/v/underscore/four/E/dollar/J/F/w/five/L/ellipsis/y/\ six/d/M/b/ampersand/seven/z/O/c/braceleft/eight/e/bar/parenleft/R/f/nine\ /colon/braceright/h/S/parenright/semicolon/i/U/asterisk/V/less/j/g/k/equ\ al/W/comma/K/m/X/greater/l/hyphen/o/n/Y/period/Z/p/slash/P/bracketleft/q\ /B/T/zero/r/backslash/C/A/one/s/exclam/bracketright/D/two/t/a/quotedbl/G\ /three/u) /FontFile3 304 0 R >> endobj 304 0 obj << /Filter /FlateDecode /Length 5964 /Subtype /Type1C >> stream H‰lU{TçŸÙef–×;è®Î®âÁâR`A[©‚€¬€,*Êòvy òŠQA¨4ˆèŠÈCt‘ððÅ ¢T‘µm’ªi8UcÕx‡ó‘¶9ý«=g¾ß9ßýîïžû»wî÷ᘕ ÃqÜa¹ïrßsüÒ²LÆxÓ˜ÉGTcâd\œ"§ÈE«r;eÚɯÛY‰SìœÓÐÅHÁ™ñ—•ýŠvd8ÀQ'a²jž“ã¸"»@§[à¡ÓéüÒÒsMÆ­ ™Ú™±³´ž‹½»K¸X7Žžãø›qœ?Ž‹ÆÑk½µ¾qi›ãµks32ãS2´©±i¦ô4SLf|œ‡V뛜¬ ‹œ¡ ψ7eKÖÿªÀpL†c†Qf-Ãì•Ø4l¾-¶ ÖOÆ0,ÃÂec^Ø"lNáGð>|Dæ) EËòeGdÿ’O“gʇ­TVÉVˆIDI‘>d2YFž%ïP“¨v¡Ø 8¥ø«õ"ëmÖÖmfÙ¬±9lsÇÖÅÖdûÀ.ÕÎl÷Ö~ž}¾ý·´–¦“éÝt-ÝîàåpÔá™ãÇŽUŽÏœÖ:}î4¨tS(«'&–iœà0!sÏ®d÷±ß8OtÞì|ÃÅÆÅÛå„KÛÄIçM̧‹ÀNŒËQÂN˜2³Ÿ¹¯Ä{ìR²fTMt̳.4‘=g¬OŠIMIIiJ±´544s44Cg™ÄYµÌ&1@bÌ%s-ê$®È:Ù9䨿*IWÀ|äÎÃ+˜У|ÇG÷.¼â{˜(ŒYW,î…%lrûŒ3œÛ"ô˜¡îºJxÐÐÇIÇ]ÝùY “„x˜­§˜p,šJ®NªJ8¨x6ZµoV¼«j•UòCǬ/¾mú²ôO©Š†BóöxÕRϼ€õë+Ïnå˜j¬Wæó”òÕšs¡è‹½ 4GwJJ¬ŽÜºû•Š.6 °‡$^9$ ì™<ñ޳€)Ó…ú Ç;´OzÊ#{2&]zÇd£i°(ý,é’EUߨrÃr1/«‰;ÙMÔÇEŸˆP/ŽŒ¯1Ö&hÊ*Š–pL·6¤dQ²*䂪íÇäµDL÷ªa6+#55LÕ2x¯»õâq ={¤‹ 7Lfõä „‡#w7šq¹õyr=¤áo~ÀÁtÐm?÷¼æ~%T r¸öM8¸¯œÓ“ áDÏ̶©ˆV¡é~ˆ3xIÔ¾ïoƒÌPÑðÇlx‘ƒCõ]¹¸Cteóî£éá‡Àƒð#!äv}‡?Lݲ9öŸ€Í#dÓ~!84bá°ToÁžu'}Ñb€¤a›€ƒÊŰÐÃ0Júµlq(N.*ºØ³iM±ñIé‰)©íçZNŸçhä:ò ÿQÔÉÅò‘XƒyÿåNw6!5CÌ“‚Y ÐÀËÅ]pí*ý.n€»™°±a¥:'gÏî\·i«®x±¢4yφBÕœ“(–A`$súRv'å–‡¦"›ùéN—pE]»®^UUJuX2ãÌ\}Ä¡ ò ]&ˆg¤œ—j}Pêµx†B;"ˆ0 ü[‰ÑÈ_!ù¤ñø+ê¤dLΠÔû£Z |@Cüü¼ûÊSUã§M…§¹Ÿ† µïêôðH?O >h¼ñøÏQKòK vpE‰ùoËA™Èb°T’¥WŠøí=̘ 웥MÆÃóÆÒ`i|¢jÞYW|’kÏз®T¯ Î4®ÓÔl$>?uëü€ú¹e]Ddl V³'¬šd†÷îjд켜¦ øƒÁ#dMMMW`h- 2úï—œRèB#Éø À­Ë8|'‰Ýî,Ìý0,ÌXB¡ýèb=Ôk‘LÒ-Í,º…ŒãYJƒð[©˜%í{À‡^ù9EŠr·pzú(ËNââíž²cê×üêU~Aú©A5æ0Mq‘Ówû |:A1¨¡ Ø)€¾Wù’‡S_†ö0ïQ,O³7ü©ßí0Fh¼×/@³UHA/8æý»Gùihõ×H¶Ð`ˆOÕ”ÞýÃ× F4[®Uuî/ß»_]f.7sG+ËöUh˜÷¡£rVo\534²ùJ6WRõIÞZŵú›mꎎܭµšÊÜ S¦Š6g‹Uþ†‡ö›r±L¬dûFÝÐþh§PÄhÑOÒ…½Þ [z¥K+N€}üVžy+ƒŽý{PËÖ*ŽyÙRÓÑô­j0v©\?q lˆ¹l☷YE¿‹õT-º·œ8p¸ÿxHüô3»:<ÆÏ8¿òÇ×C‡_6„H®5¨Ž]¼4=Ø0çØ÷¯þq¼ý«Í+8ºðôB¹TwkÎKu?OÙ‡;^„\皣ª£ÔH¾Ìk®®ÏìoÞ©ïiÖ|‚¼–¯Ö™Ÿ¦&–&î*Ù¿K:H^´|vÄ¢›ÆaÀ XµÖÂn)XcðW/0÷WŸX:òusjuty¬‚.[˜>6­Ÿ€F.ÚÁmöxÞ¥u[¤qMjN¿Øz®®•CÕVÿc£aÿéÀiÒÿ#¥ é-𓮈;$}2ê’‹EûXBïaH‹è¥F§!ob)EƒŒÿ§€?}åb%œ`…Qß0JôE:–õÕSRÏp1]¢Ÿ/ö‰D¯±9}f iム¤]BœEY  ñÌKñ'gAO¡8±Š@{ÃÀ•D«F7a èÈ/€$ ý?TWyPWgÄî&®+ÉôΰNkw¡•’."¬â HÚkQ@9DŨ –(j\k#^Á‹  (**"Òc%A¸j\ÍjÌZÁ|í~ª}ƒGíVÍ_Sï}ï{¿÷ýŽf/#ËŒ–Ù"XcÀ],BÑÄØª…×A ÑÃ@gÈÂ÷ªàjè-9$òjNö™£‡óŽœÜw攩p[Á–â­¸ñ{' ¸_îÖ¬2´°|ïõ¿¨¸ åå]\lâÕÏè$mIJ[/&ÅGî´ø{ˆyÄžÛU!Ue•Ä.2ñ½1ϸqåŠtqòe_.Ð ÂÁ…­¬Ê\]"L?œœh¢DRÓ]kêHÇC¹nX]Å,]0#eº€z×§0fÃÐÚÛÍ+-’Ÿñóçp‰Ç™‚%æÃ ôŽ&tÃñÿÄr§ëÔåë6mP­6ÁUà × àpgØ qobÂ_– ˜õîF lEÙžìRéõñîÇb’3 a›ÂR"ÅY±“2ì§Z_²KwF_•Î${™l Fˆ¦ QÀ‹Ü"fÂküÔ Fø\Æ!x¢Àk2H9½ šã5(Ã!>×VË÷4«¿Ì~(¡7êÐä6m°FÕ LK•»4ëDt¢uƽ«3¢¡…>ó%KtÅDåé¶ï!†úÒAÆ —²|³, ÷Là¨-Lûö—7®Ç…WH“ÄË3¹KáÓÿFñåL»ôAç»èѹùßJØ7jf±´)ôZ$@µv\&wc,@ì‚qòÛè¬ùX4¼µÖù´¡ÍÔr|T+øM/ƒ¯fE_›i*j2ÑÕ(¯µWo©9”Ž2˜±‡³ì0[“Åô5ÉÛ“„U(eƒ£ôo×rçÓ™Õõmi­8=¾/~8ÅY¡Nm±WUzÇÅṵ ÕawʹMGDÊ0¦“ Endqf2I[Ž—ïjÖ ô¥ÉðàzzŠ#&Õø”y~_q,éK&5F8 c$–Ðö?!X"¿Ö¬În×Nàºè–‘XTk%Áñþž18J¾¢YÃéuÉÕºŸm SÆÂpu sP³Îë{q[h 5zlàVùWm‡Õí zØ&ƒ¶¸ƒ ÂB©¶•éTsX[lØHt%Du§ûê¡Ôðã"ˆF+NóBOš|{Q Üð~øŠò.òS‘C'4úÓàPÀÜ`Âôÿ³h{àÑÒ #PLë]U ÿ„cDüæJåæhpb[ÚrêJ¥¼¢C—.™dãªm©›×‰ WÎÎ ƒtR“a>M½ç«Ukú8J€>1 z›)ºŒÄ…K ó.­vh9ø¸ >2=´ÜÄ߉Xù? {1ü!ê/9ìT= ØûgÍGB2 c+ªwDçIû7ìý"Í–e£`F+y³)ñ:H’ÕJ<áÏÙñE[Ô\ø“$”[‹AEîA§–KÍ¿bjn¹úD¤K®Õ®;/ñevc˜MC÷»D®p邜…Ÿ5ÚgL÷Šc™v˽8°+l•r6}•–f ž³dø¬c¥f‘O´ë–qáh­R.º©+³R ÇBÿ— |ô^hªL±ýþà«6ªœ"´CAh,B)@g]!èHçj ºØH¬&ÝÝF‘zÑ7 ™òk¼É¡ã¤¿e±û¾I#Îf6(&°}ZàNù–s“ÿØ`W”ÖoR„«M9Å%Ò¥óG¯7› ƒŽhµGô SÔ‡ñ|;`ÏûJÇË?r Åa Ç<%˜"ÇR1Êaî²0—zÈ Ý/lÑAŸKEÙ,üjwßF‹ü3gÕ¼p¼fbXþ2: DªÞÌOÃåJ¶–hf¡Ž7{i¼¨ë+fCCŸ©I5‹e¡|'ße““§Â.†ïOHdš †ÊM,ò8õ0™¹M0ZneÁþá.&X†TâÆÂ(ˆ€Áø| R1˜«ÈeXh¯vô5»Pnçp%ý§°ùŽ Y¾ÁÂ4¼ÂàüXBá§¹á óžö¬u”'Œ(£7ÞàTFe®iî©P#/æ´þZ C]Ú•¼q¤ë›èâM®ô,ýGМù[7‡½y@ó¾;\8È éÞ4G¬SiægÞïÚJ?a*] o2p¦ úßQO%÷Ôèv«/èëãCöb÷ökml ªÓ7ÔQøtµÚHÆÃv®`WazX’¶ø´·0=hÝêyRÎ|æpQGÁ áÜÙëOIù³ãL+¹ì(s6R¾ ¼B%¾:¸~Ú«ïÛËk‰È§ûp_R›ç«ç.žañæD_ºXp$/7GÊ¿ ì©*ʶo+“Þvð„PíÓÿªÀ3§óÕj-$À™»#œÃf§n!‡Ê=Ÿ®åøÊ0”ã«Û¹_—Ã'8=€ “dã¿)Þþî 8ö>lû°×ÜüDjðªN×Aà)…ñT›a-aÖ¦ÌóЃÎIË÷­¯ÍX^.QÉá\QDøÑyá`ö^ vóleãÿ5J-å¹ ª»F2AmÇ0†`×dž~d¾€‚ûH4P$С ©(ßl9ÝPBÁ˜ÈeA*Ã9hòHìúøÑÓöû?ÓÿA8ç$Ùõ' ¯Ó}[¿Ð(}¶Æ°¡–‰ Xo,‘{OÆJËO$*µ¦}êgÔfg€=ŽÃÁÎî(â€v´‡)÷z ηˆÁ`ÀWlã¾Æ6`‹\þ[uùEu]q\Bvß6q ò\H÷É{¦Ö8U¢3´(Ô…‘D#‘ÇO51,  ‹«F†™U!«"l4Q!€È h@$·{!V­Ë ¬ˆ4F†šŠ“ÌÔô¼z˜NÏ[b¦þ{ö{ïÞó=ßû9ÛT«7ƒ@Rņoåcå?úªì¨ƒF!ŸÙZ YŠÊwä’^"/p¿$+> sÀMcæ8¹ ûÏ‚¶•• b¢K5›öó;Ã]Ä„W_R¦ŽãGÞæÚ³V´,%ÈZŠš ù7fCpßÍ:ÇçÎà&›pzLì±#‰bI‚æç7£̸ÕCU£5‚({ ŠúeoÌ›Ñ?2þ÷+`vëÙóvx.Ücð'ɶ†UmZ¹«y7Q÷zlæ;É"ØP’¿ñÈÂÌBá×Ù}ùü5áŽ-E–°(l fÝl|ýÀ6 3þ>ÿÜUõà¾ì™l$†¦ÆT|Ѩ›fU­&¸ÛTÚ_6yÒŸŸÓøûã“ôJ2öÉP=éÇ•o³‹¯æ¯Þ“%|¨Ý°ÎjÍ’J5%_tYBƒ½ªú¤t¹é³/î~*†H7Óþƒ‘°‰xø¯4FréÝiÝÎEõ¿È+°|4¨dyEÿóÿ „Õ\o‡†t.ûΫŽU:yÊžh ƒzRù^"”(RåÂ'kñµ'W°¡Çïk¦RG0›9‹Q&üYب•:?p¤×‰Õv Éé›6n‘ÚŠ³ìÉ»¦-¦-?Ò5[vNúþÈ’é[øŒkú´ÎÞ%ôˆø“„_ýÛ³ÆáÊ3טP]½·ìÔò~yfºÛ=»õX@§¼xP­Þ!ŽïjÛ}ÞT/ÍË©Y+,_aZŸ,ñî«?ŠCSu¤oà w¡£¿õ²ÐÙóÇåTKIJs“)³Tp"¸·~…2!ɳ¿Ã9øË‡ ˆ<‚<„QÞ§Ÿ·4 µ(¬üÇÈýÁQxBìè“ ê˜Ï`LÕñ÷.øŽ‘»a«¾­´­¨YäGF‘íáBÈêë6’<ÿ¦ϤŽÕ©BJ:glfiãøL<.‡öAïűa — <¿v‡&Ä;jß~zƒïÔvÆD= Ul£ ÉÃFb¸SìÙ0!|YF¨Q*Ê)ÍÌ4 0ñð¹Ò_ßÛ-þ¾BƒÙ+*£h­ [ÜÞ_ÙA 0­éBqª°i.?XËèímS®ÁcýžO-ÇJŽêê ·Ê‚VFÊoHüuÐá f¸gÈÊs a=Ç·ý ¦uµ8…ú“eYViêvýî³u.hu娒Tj @?w|y•¸¼jÑžõMº¢Ã%ÇŽ®Ü«éy7c»ÌRœ ‚Œ\Ã; 5ñ4º¼–²Íjþd—ôçµîÊe:~ì¼ÅimÈÐUí®(,3Dâ3¥™+åOÚÖŠ—d g]ÜûÇŽÛ=ÏÞýw=Ç#)Ï¡v?r^_æÒìLúæÁ¼µ²Ö,åÚJ[› PB@‰Õ O@}´<€5áá´ç›M WUÓO½?u¤ áå«FííyBºÐÂ¥“Þ}S0ç~dË“L'v·¶à”ú+VpiGÒΘÅíÍg?<'œu~48$ñù+HË®ì<Å—ùÙ æ@&­9ê±¾LyP]r.Þ¢!ð–æÃ\ù®"&}UJ‰P|éÝ’=©õ°,L©w=©Áò¥.ÁžhЬÓ.Áúp©sÄÙ®…i´ÂUí0Tc%QÎ#ÏJžuÒ0RàEx ß#ï¦2 ù³Ã!Rûa.,и¾%®EoâògÓ|É0EÖÂ<œ¯áÇ0£4‘2¤1¢þY ‚EÍ*Õõ¹žßqˆÇ—Á:1ÄsßzN#÷pø{tR8U†Š—¿ÖÂJüq>†Ñžè%ƒ•-ÖB—bûéœ^jÛÛ©OøÃ> endobj 306 0 obj << /Filter /FlateDecode /Length 251 /Subtype /Type1C >> stream H‰bd`ab`ddäsrt põ×®ÌMÊωXüfø!ÃøC–é‡,óq–²> endobj 308 0 obj << /Filter /FlateDecode /Length 3736 /Subtype /Type1C >> stream H‰dU TçžÙÝ™EfSwuv1 –à°*È#’€’(55€‚òyŠ ÁÀiÁÄà+ŠÔjD†žÚ QA,Õֈ̯§ŠXôŽÞ­é,{zzΜ{æþçÿ¿{ïw¿ûÿ4¥ÓP4M{L Ÿ5íI™yÙɉ٣'f¦%Ø×Ã¥ ¥•aEÔ*ºÎ4æ:k›uŠÙÙ€ V>_ûü8#î ®¨xe9øÂ.º]:ØèN14íµ²¤Êjõ—¬Vë¤Ì¬Âìä¥I¹–Q‹mì«Ú`ë€3`Ç Øñ6pÀYÂ2%Zb srÓs,‘‹3³³2³ãs$‹%<-Í2ÓŽ™c™™˜“˜¯®¾®Ãb¯ãõÿÿ”FÑ”£†rÑPn4õE ¥¨á,åCQ£uÔ8BQ(ê=Š £¨‰ÔTšš¡¡btÔ<š¯ÒEi¨@*“ÚM¡Ú¨^:žK·Ò/5“4MZ6J»EÛ¥›¢KÖUé:Wf.s˜Õ³•ì9nÆ•r»¹fîªÃG }޳8¾”:¨iP·ÓX§(§N=Î8ouñt™ï²Ç¥Kï¯_¡xžNCí#­²<@˜Ûa¼óÍã†ïÅúÓ[vì;ï0– ÷ŒF º£êÐН•<ÒB~( R(JìÙ±WÑ€#Œ™^1böüâü´ÙÝlûÓK`£^™R@Cù¿´J…"ɽ¨ÿdÔ°›ÐˆƒÏ$yGJ¨çíé kGíí?¾×Ï轡–†Ñ°R«(àHÖkаz˜)Óà ×´JÌd¼æÇéWC0 ‹ Z«˜ޤž˜½$>~Yý¬kÍGŸõ«eeªL?’!«G«”C³ð´c$Î[‡%aþ5˜3`öfXÛ.ZË„w‹pèhïÕ0¤S¬ç.}± ¼ûLO«0$Ú¬¯ 4Ô­òµ`¨ò‡5s+¡›Ã%5H `‘׸?þ¤ôðÝüu¥Ly"ðÿ¬Ì_Q™lòµ, ʼàüã¨dŸ,Kêö—ì6õwö<~Ù‡úy«óÌ@íºðp®®.¯6u}ÎHøwaJÜ’Ùññß-‹ëÊv•ít¨8ÐÑÕ¹{zœ¨‡âÿÖ×ÿŸ€µ8æ ƒZV-£•@¡«Ôs.P¤UˆÄp8WÉap½®,Ú L”Å$€mhe`%Û0™ ’ØíP- •½ Ó¬†w`eÈ퉖ù~¥Æ § ÿ°¨^ä•Ô:¦qïWÇN¯,ìÆQ"žnÚ ¡Übù~p½Ò~×Ì+èUÂÔ°’|=` a[w-M7óýpƒ0ý£¢ ƒÀ :ö0P!f{­=t3.Y«\îbZ™¼Ôˆ¸wMh˜ó¤_‹æìÕæ³YMf_Šüâ¹­«æî2áXäp0¾‡ÜŸq:¤—º¶öf*B÷˰GEkï„)ý¾gĺ„O7Åšð ôW›a‚[Y¿j…B³_©0yù¤è%b~râ†8S°b†Ç#íXwö’w5ÝPéàå§ä(á{•ÓH”ÐKÀ÷i$áøŸ!WâøÞHO%ª‹N’l¤N{ ÎN¨©?Ö©Bˆò3ùáoó/• ðo–ÚŠ¥v›!L‚&‚®|žýFæø—ë§z‘xV«.R%¨†‡ä÷c÷áJOQ»r ¦ ÷©±>–M.aÖedlH7Íšó»¦DsJãªóçŒ`ùéGYäû[æ§Ÿ1ûX%-äê’v|`B_tFœŠÑ0Ì |ԶɽM›ëÌàͽæ6?Ð*[Ô™¯r2žØB$¶0Xz³ÁK†un.`§„X îs&Ø"=°|ßìj'ð­Ú EÉQÓý˜C G@#ƒó¥ö3U³$(%¾l-\{ŒL ÛßÖ`#Ùu:‡-R Ìk {2T«@}@5Á‹–*ž N–nØ ïKð{â­,l³ù2w•V[ÅЇîÃCõ~ø4 à9ƨ‰†xãHôà ú‚Ç#¾y¢µJúyô@næ³Þû—@,¼u ¢¿@ŒZ°Y†l5…㊫pzÕÉ´C♸ˆšHþÖ>ª¬NÔ÷# N7ÿöÄìW),ÌÎ^^,¥'U$›&@Ì=¶~_ÙšÝæý+ëR—íÚ0§»ÉjsµJ‡„qÈï‘/™æÚã-W?,û~Î^±.)¶r‘ 륎0H8;Ù»¨ß²sImÒ"Å[˜0¡4Vã`0[¹l¢Y¿J+Ù½]~ŸÀZ9¢‡'ê¥ÕABCÉÞ•»Äoz­ ùÒaYUä¶cÓ©Ó·D¾³±qÍgÌïÈê—ËÕ¤,޼؄o‡{/Ø{4ÍÌw_Œ½¹±}½Ãw¥ûVÄ?IXê3oAm}¼xÃåC\qÝɬv?¹š_&ñ(½ýóR§ñ™¶:Ì àzUKÎüDÐEÕÝT‘e8¡ʰN%ùÁë>ßÇíœîo¤K.Ÿá l_¼‰õܤêÛbÅŒSÇ>?mj:¶u{£ùrÞöV#œâô;ò•B—C9ÐP¡U`UH÷8Š/ÔwïÓI°\jga†-‡!,Dª·ä«ŒÝ¿†I%¬àÛx¢t œ\!çFb¨„2Ív¯ƒåÛÀŠÛU..Ü!øšË>*Šó ãA™ˆu'c•);˜Ó£†1MÔC`ù(ViP# ~€Š(Ÿ ¥°‰Á”ϲ‚)ß  E0²ˆMaiÊA) p €¡–"u^,LúÇžKÏéݘþ;_ïûÞû<ÏÀ ýkeœû¦µQOÛÉo¡·]µ6pe˜ðßTþÿ÷ÒÙRÜ"þ'+à¶Ø†nä´Ú,ÚüRm­¢}q>ÂQ_öƒú5Ó÷©`ù§`ÖúW±ðåm–6s³á»t¶œ–‚ƒ2ÓwÊ-~Üå¿ôÕÜ•®ŒÛ#Ÿá‹’âΗ0ó,zfËBWè=#8wtWÖ\3fËõKU%†Ã¼Ð¯9z')TŠ»ØÜ5VmïµåŸkt„²ƒ*öÓ?TáÌB—Ö 'DpÝÎø‹9Iñx•û¼`^ !ÐçZùt[Ë»#xÍ‚ ð²R(ìÞå{lý§°d´}paáöÖH¸¡Quº«Bi¾mJ<0ÂÅî=(ý;Õûý÷Z[óÌM²ñD¼šÍW$%^Hð×~WN¸ž÷åêô­/åËól— l*Õgf Ô0‘ªŠ"#a_õ~ =7â\NEÀ kÁ³Ç^Ý|‹ªÈŸ“HWÝÐ)79 ôÞää@ß{ojL Ý-9]|ò¤íõ_lš9}Å “DÙÛ/çLomÏ–pYÊ_?ûHÖVê K­7ë<ÀýŨ'(ýÜ\öwtŸ™‡Mí#/ˆ±M×W;pµOê½gÞû©Ã`U«–ÓzˆUÉ›Z‹¶ ,°Œ+:a:o’¢~˜•,M+ˆŒô8ñʦÇh}EÑÖ0<V8¢â‘›|«õòHGgÞ‡íwÜ5÷”Q`ú2}óØ óÚ·ð˜´gä…)=á`E$yùå èŽ+žxÃÚn{åõV9Ž+8Œ|ð¦+eñ†,o.ûÁHëžÀs²0£ôö«È‹á‡·nûýÛÑAûäÔÝCFG$B•:EJvQ!‘ 3íÐåÛ|óÇMï_3Tä›ú_’Þ9r*#J† ô'†(PÀ‚à(ßõMOÉU©§<9YƈÀg„,dwa½”’+~ÐòDX¿×óP¿˜G'ð9|O¡¡´ýž=meŒhºR‚Œ†ß ÇW±—ø˜nãXÌ ø™ºZО2,Q.é^‹ªñ!„(ë;xšBêo¥´'|·&CqÌLZ¢„¬ZN¤ó%é)ðÚbÈO˜£Uý÷”ˆ*uh”â’x¡³)¯ÑÜ`h7ª< í ÿ]zŒ,L4;¼€…tN ó§g –¿Óõey£ôõSœŒ{G=Ãà*sꘃ Z°ÒDàÞW ¢1[0¢7úƒw%ßÀVƒb7øóó"óLüyÜ:ƒöP¯w²I*˜‘é ‰¤úy'2DaŠØæ1´aÿ¾œ”xƒ0ˆJÁÄņ/R<™k{ŽOH°úñ¿A”…©MçDŸðàè_^gZñ¹Ú¶±ÁC› ?š ¼ CÚ Ìˆ‚íR~M~µ¡álªm‡´cOtl¤, c”Bÿ…^Цg ¯ó‚­åz˵Ûõ.eµWÊ.K Ey™çU ì +L?£B–º}V¨Jµ:X-ކwì,6àÊRî¤õ·l·§‹/„ªÛg DBS8MCeL4ªLŒ*‰–6¯‹—ƒWÞp¾,T¶t7帔åŸÏûÀ#iWÎþ7V—d„ƒÃ4>Ua˜ÚÈçܱŸ±KB),í}èH5¨¤vÿŠªßñ'1Wår×E‡JAuÜ‘!˜üƒga‚kv)Á£ç÷§‡Ç'š¯}E‘õÈ訋~á$©B¶6ìÐûœCZÔjŒâMÉ ©{$¿‚/êeh"ÅOâN>¾(ëBŽáÍúñô©»óbƒM²M6Ás*ËÈ%ãÀ‰> endobj 310 0 obj << /Filter /FlateDecode /Length 114 /Subtype /Type1C >> stream H‰bd`ad`ddprtrò÷Ô 1t1Ê70‰iüáëîþÙõk/«Ü¦ÆÿÝÝpû3þ—‚Ýß¹…˜9Š K‹RMà000¶ƒd˜Eºù~9}·ø.úã×g~ýyÆÎ`ÕÍ'\ endstream endobj 311 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2000 1006 ] /FontName /BAAOGA+ArialMT /ItalicAngle 0 /StemV 0 /FontFile2 312 0 R >> endobj 312 0 obj << /Filter /FlateDecode /Length 27443 /Length1 48444 >> stream H‰\T xTÕþçœswC^’lîrI„<‚È+ d$€n(H6’ !ái¢á%Ðå!òa A H‚74`xµ¨héI(Xky©üD¨ß‡´"{;»P ½óÝ{gæÌœ™ùÏœÃ"HŒ3®Wr~…{p¤‘µ£ Ê<ÛËG–O´©`Þ½6þÌ<^û°õžZQ\vª*·°‡²<£xzÕÔ‘ï½$³ýô3%EžÂ– q뀣Š}ž.aEû¾í-XÍr÷’²9•áO¹ÓX~ pô˜^^à{ZJ€-›XN,óTV„ ­ç|Ö³½>ÃSVôC›…]€ÃK9ŸðŠòÙs8o~ú×+fUäøŽ_žàøÁ–vÑü:´ˆVqˆ¬+ü^õÿ}¥ÖUÿºÿ/¾eï¦û/P=TŠ=ø#> ›ìõ.¢'‰ lB5Ö£6Ldͯ‘ä±~=E[è…­œÏV4³ísX€CèDQÖ5,Ä2y–½–1ÒÝ0cQŽÕ4Êš‹I¸ – ?Fa*h‘å¶ÖXë¬í؃ò„u!p €©Ùú^ûÜúIìñ:6â­k³ie[¾‰Y¨““YÅÖOœ/r Yh¦c"w/Š¢j™Î»l³Lë8[uÆd” ‡¨ Nm’•e5£Ǩä]7b05á(¾ Pí¦µÝº‰h$â®§-tLúî.ö aÄ4F©'òJ9þ€?á4ô¾(×Bµd-M{ÉúÐ8Ûìùº-0-”«Lk—×ühã#\"õ¢1ô¬è)ÊÅf9 A±S!Jï ¼ûyJ "T´Êmj·ºc{ÜwÑ ç‰ÃxïSWªÓlz…>¥¯Dº˜"Þ—åzµK±{¸êçQ†ÕØÛÔžP6ýŠJ¨šjè5ÚHÍtš®Š¡b¼xAÜ%r¦<ª†1S³Õm¹¶ÒvÕçö÷ýÅwÛJ¶–#›ûa1gÿ:6seÑŠsLp™4 ¡p&œ4^fZ@«é·TO»¨‘£œ¦Ët~ [tG€É&b„Stc2Ä,ñ¢X/6‰V¦Óâ;ño)»ÉÙO¦È\YÎYÕȵLûå%åP­Êbœ“µZm‹V¯íÖ>ÐnÚBí¯!èÔÏÛîÆß=ïƒo…¯Ö·Ï×h]BG>C£Ð)œ½‡iŸw-wÜ»8K¡Œƒâ)•F12ShͤJFr)ÕÑŽ@î{é£ôÝàœÃDç@ÎOŠ~b˜Ãô¼(3ÅZ±N4ŠOÅOÒ.Cd[ÙQÆËár²,’sd•¬•¦<%ÿ./ËåÏL– V]U7§Ôp5EÍU›ÕuE›¤Ô¾±ÛÊlËmM¶ÚŸ¶§ÚÇÚ³í“í¯ÚØ? Êãîüûñzè¢\,]r?Öˆ¾*Z´ˆîç)(”Y‚;UÔÓ 1ŸEw­Ò6X ¦Ñ¸©âëÅñ£,³h$Ã4ÑçÞn¶êþ¥¨q]áÚZxçJ[(-7l¡ØG9æG²·J'ñ…¼@vµSÁI×ÅN9–»à¨JÕÜpÊMØ+gÒ|ì.žNw‚Vq¦wx.Œ§dú—´ Åhî¢þò+,Á âs\ç{¼¿¡BUŒ5èKÕ¸‚·ùVôÔfØâméÏ¢TyÅcÔ¡vqu©;I­–ÒdYg»!Îa.ZU0ÎËßqö­b¯ÌR7µ*á0Ë1ÓZŒ*Í­ÎP1$=‹Xu‘§[µLVNþ/ä©2‰gھ݇x •Y¬‰âÎÅ}1'DÓžŠ;¨”ïøs<ÅZÐh/šP¬…O@ôå`¢õ66ZŘa­Cσ«šw¬Ç7xõ´Ì÷2*Ð…oÎy¥eŠV-ÓJ^qNŒµž/£KQø–i/ ©ÚaxÕg‡!Ö*ë¯ÜÝ=xÂnD>~‰¯¹Êï9Ây }}£Eƒ•)+¸Þ ȶvZ])%ÖtŒÁì°kðØÒÒ'Œš6$õ)ƒ пßS}“ûôîõdRbB|ÏOÄÅv7º9õ®]ï㈎ŠìÔ±ÃcíÛE´  nd·iJ B¢ËÈÌÓ͸+À¯ ðaÌ;ì »¢J2t“òt—™9¯ÄëÊËàíB‚Óô¢à¤D4‡0œiT4Pd*éÔ ÆI™#ÃeFþ Lëòšc³Ý®Œ§37)Ѥô#ß„1Ìl›0Az ŒiK7í0z©¿¬ÔyW5E ?/!´Ð(ôLr›Ò“ëÑ.ãf˜‘/}õ?‘7oŸî®yx5Fz]Q¥º_ôzktó­l÷ëNÿ77—÷`_›™çÍäЫÄ‘ãtŽ&–åºMZÆ!u%þªîÕWd¸üš¼iºÙÆf”x§åñÑ8¼&rªœûŽ´ƒÖE8\ºw¼ÛpšCbŒ\OFç†ðæTý>:M~t%)±!¢Ý=`ÂÛÞgBÃfЬ¸€¹Ÿ™óYògd<à aê:gâ6¸¦þOÑx °?¹Ä^f!ŸH©Ù&=Ï1ȯ÷û›Zl„¡{o;À¸þÝ£Ï}-6âü¬¿O´¯ÿ—7Ìøx‹ØÓùL9ÇÔ€Ü/)q^“0ŒŠ Æ2¶žÜA½~§ÓÀ+›ÒÏ‚¹(Û}OÖ‘³ÿá¾êƒ¢º®øyïÝ÷v5ZWqm”1BÀ¯(Š2øAnD¡š _ ±?šÚš4호p…N›V‡¨±@Mµ`ÇŘ´Agj:‰ÓL1mc?òÁL:m’1éD"¯¿sß{ëîà 6mÿ)³?~÷œûuî¹çÜ{_`á¼òˆZÉ5½N¿„kBNM´{e "¹“ø)ëxgE|SrvdE”)ŸRý«¾ (¥ °"˜”®´}[P'YõË¢uv)’ÔU»¤&j²A¹)Ú˜…จ˜‰Ÿ!ƒz{—Ç‹¨”%)7â«Ì³þ—MN¾ÁN]æ{ÜKÒµn¶™‘¬yñòâä8óÆ…5Œk° ¸"W‡P³&\g"žŠƒÉIÙ*AfÎįËì]Æ(OŒà²ln€ø³T¶×0Ñ.—ã£3m~.ºp87%)7\ÞÒe†¶¦$ùRÂÝê9õ\xWN¥8]fÏÄHnC9|µCÉBR¨´º#E©/ì(õEÁn¾ꋃgTEÍ®\]Þ‘Šº`wQ@jUÖ²’…$¨@Á"Ϩ^Ù>±_#!Y+¤BÊÛº’:¯£Sh[—jé|ŽN…NXº€ÔñŸ1ÙÅÁØè‘)YžÆW¾œVo l]9=<Ë'5±FذUüΰQ_£/‹jòë<Óé[z)•:ªPÛh7C›NqŠ@Û6Èw€{¸/Ú—V¥À4[·Ø±Œ¶ÝÜcìâq$WS…wݯ—šW1ß!½îŽ¡Ü*Þ¢“ÆrÚ ù8ú=½¥Ü}mÔýQÔoƒî8¹åMè—n—Çxñ­ èçbœözgkgi‰¨6ßÀZÊ1f>P‹9îçh“^ Ô)}T¯ô™­¨S æ¯c=°Ææ<Œ³õ«Ð/r ÊÓ`‡ž$sÔS´\LÏbýeÖº>ÚÁkŽ® öÛ6„ecA,0ç/€u¹9c›5.¬Ó2(®BõeÚ)¾H üõ„>@ÃKÄ~úp»ØN +°³Hï¤Ã,ë%ªÍ«â(5k—iê¾cÂ:¶ÃßxùªÑBõo”f̤=ˆ¯5/p cþUÆÃv*Æü Àb@ÆP-Ѐ¹þáø‰}y/öu#æúÄË1ÜFEÀZìK¸íÁü Ùç¼ïJéðr´}m61 ÿ¼ÖÎ1É}¸?ÆšiÇaë5¦V´i„_ÿ€Ÿmp ãÌê^Ä8S˜,€V  Èžæ`n¼šŒWÄ Ç¦ŒĆÞÂ6³ÖŽÉý´r¦Å‹çI6NQ•d“ó…c¶t8csNqÌ8,㻊ã^yŸ×É1e䞤µlƒÌAĖÜw°™óáZBõàÈãŽY¶Ïaö Çšô rÂæ1kM—9ÖˆRìX¯qØñE”wÐqŒYilÅ™ÒLyâ›x{Ÿ¶Š÷h6—èéÐa=hQi£ïrìåŸpqÃӯܫ÷bíðg?= Ÿ~Cô«·Š~E×ÛÍwtRÎëíꣲ<‚ÝPz­:fFlÝ¿«ÿ,P/êí83ÛÍwõ~ÓÄzçœð *é@’ÃПBÀmÞyJ“·Jéò”Ï º Ü/”¥h©èÅþøqÎ# /Ñß çµFÚ/úÍß+! ©ýTëñÓ|?Mà¹Ô‹TÃàñÁ»bâ(.æÜ±ä°¯næ3ߎ©`ù÷Š·m||ˆ8ú±bͱ”Ïgy?àŒj­x5¯Dãó<=>àħ+N«\ñ9Ηn–w Îw'OaÇ~gý|>òÇg$Ÿs|Î8íÝÓ?¬¶!Žù~™*ì¼¾ÕF>l|ÓÎ}œÃØï2Ó4rÍF§yR›dž4£ü;@7O`ÝGïÔ 9lß§s»ÔÒÓMÎ=ªgÐNû<;.Ï›è‡ò-•ö1NÓ}ûŽ3PÚÛlç ü »«D%|~˜°Ž©Zòz`ûDîÑÍ|/𨄟ù.j¤íu¼¸oM”÷Å**ƒíç¥w*3ëô2j5i±(ÁYÛKÛy¯xlï½÷Aïõãœè§Eâ§hã§±h×,} 2.¸oû³<ˆÙ hÃãµÈ>šdûã¸ô…ì·Çûc~Ú(߃ô#½„ÊC-žµ%È9?ÄO¡_ Û‚~Óä}}îF~ÕãlªÇ™C2þ+Ì!­ëyç: …à£vºYÁ‡Urík„uÆÖqþhm4‹cÄ8ˆs˜ß),æQŽQEÐ5ê8'1ïèCþ¦#w÷£ÿ ûÜ&̽zß2üFà|ñ(ÁÉwIø‚ùµw¨E˧zÄñÞƒðÃ>JÃ}¡ önYò£6,HÏb%YóÑ#RŸA¯ªmÚMˆ[¾C»Å^úš(¥ÅÚ"š*&Ršø rõc:¢M Íâ%:"º¨e‘@s4¼ÒµN¼-Yîb½ú*ä&ª+пž¾.6SµÖØû-÷`¯ÑOÿ.â$ý?À¸6”·¨B+EnÕ¢ü±yŠÛÉ9:Í2†È£4Ù/ÒV.›Õø-{ {¹g/lÚéØxûä:y\ôã6â­ 2/3-.T©hVÿ@ÙÚzú¶rÒìQŽR®2µñ3Ê“ÜâŽÏTv D&= ìEy>ø—ÀiKÆÛ-“^öaì³à§ù»€¡®¦%ÌК€_;u±à¹®§…žhöÄÉÏà®”ËXÃåø:9ç^¼Ë3ÛÍb1Ÿaì¡Éž‡h²6ú[ÐÏ%ë‰È§g(u4{FƒrÒ¥-b×èìxÊ àR '1ÛwÃdßgöwð%éß¿“ߊ!úœrѼ.U.’O{1@NƒœàøÓÙ'è õ®ýC¬Fæ?Ýz·ìÞ×ÑdõiÚ '¢ñð8­dˆUh¸eïyZÉ0^@Ý #eqbTÐmÚa¶ 18{¤lÜI³j*lÆ}s@T¾€3à¶²ÿxZ˹ ¨ø^¢õ™”Èñëö«vتwöÇÙ÷þÀ¾€x…Ög—ƒ‹ÀùGãÛ>/âb¾ÐŠ÷¨ÌgÉ€«Íµœ¸–ø®¹þ˜ÿO@î¼ô/þ¯çR± øãÞ!«ðŽìÇûänª!ºŠ³ä“…ÀOpƒ_ƒ·÷ð\`<Ê¡û*øI¢¡Q~ú~ ¦*©Ù~WN…îçv_¯=^‘ÕèWDW.§­þCmÀ½(¿<‚òÁgÁMhÿ.ú=>gÕ_Ý ù!à9ȃï‚(ìÏ€IèˆÁï‘ß¡ÿu¾þ÷Ç2Þ,Û`ç px·ûâ†ÙÙÏQØý­áìÿh¬Ûß#Ùò¾™ÞÄ»/ûíóiß8c?‡cñ/ÖË>¶ÉãŽãw÷8~IpüB»ø±;‰ Ä”P–@(yìjM hœe$¼DbÐ && ¦¡µÄ$¶1©Ahš¦U¨Oì58P)™²•5+P­Œiôv“¶þÁRªÑÎûÞÙ@Ýüøó{¹û=wçó=w¿Ç°>÷rÊY<æ¹,ÏŸEþXÐâýMä±è—Š¢Æx,<å¹3Ï_¡yûÏKÄxÖc\½b\…sãþ“¼ìÀSÐ;s‹ÍÍ]ÄÙdÞz¹æÏ8âlãçÀº¿$ê¯äFy ôø^è›Å3­¸·Þ·ÇÎp¦ý¿ýG=#¿Ä™)Ð3‡•i,°š3ý,~Tf:»¿ôYþ3úîsúõ‹ç|‘™òÒûò€ü™Ú{TzÞñÈþ´¼¤èOç¾úék¯˜ÏÌ!s¦˜öÜ=*üÝÂðÊÜ¿8†éÏñÔóV|GØOâwƒ}`^á =…ýbðœQ¹c(Ûg¾M"æÓ$ÿ€sóßס·ò:èAz˜öiî øßƒo7\±¶Î´ž§¯[žŸ‹üs&öÁ£|ü¤4'ß*þ×ü}ÿ™áÔå﹆®ÜMÃE0-œQ/!ß§áÛàÛ†:lÑjÉE&AHD¬m  €A`$¶BÉN°Œ‚E*¹ÒÇžT³PÏ •ÙþlD¸›òn÷7„›y&™×_[“×±Õù°eù°'ç‹¶äõÜyí F4®K­‘±h•TEތ삤ì7Øù)QÈI©’è€IÆB‰*93µ¡Èà¨d Tb%[‰’“hÚêˆDKYŽM'Îü°ëùv=Sîˆ FŸf’—Á(؇¸>`àër7;d3£à˜Fv ×û¸Þcï{—ÔƒfÐÁ(˜&ö.¤½Ãß7…äv3`ìH;{?ëmH» ë*»Š¡½•nXF¸¾`(Á‚áò gU$Ëþ¾5_ɲ¿düaådt»LtÀÐÙe4~™øA;軀ÖXWˆŽ‚“@F܃7Gàgà p…,*hföfÝdÙ¥t¨E‰V±‹ìV]JB4ÝHRÂ_Bd3׋‰Ì^‚Ž¤å ¸Í–-PÎÒr~×°rKþ«ò‘œe0ÿ.ŸSþäÏhZù#J^V.ˇ”×ë³f”¼ÊR¨³~:"7*§'DèTœH+û¸V¾+·*;dQÑ—¯Ø˜‚§Ú”µ¡.eÚ‹É›5…6‡•fy£²<µ„ß3¬,ÂÂy³ƒ/‹Nk|¢Áõ YºM]`:nê4µ™¾bŠ˜˜&Åä5yLf§Ùn.7Ï2—šÍf£Ù`ffb®È殩a‚¿®Âh犿|Pb¶q !ö5jfäi¢Ï–,±®…&ô±-$±Ù¯º®&KK×té%5-Tw&H¢£Eo '²¦ÜZ½!œÐMí_ï¢ôH¥:ûA–’ŽÎ,Íñ¢ƒݹ²s„Pê8xØÃõ¼ƒ‡“Iâ®ÚÓìnv®p,ýj좷 Ãw>î{l¯~<±®Sÿ¥7©G¸‘ó&ú×ù»;Gè'ôãxl„Þà*Ù9"­ ŸÄ×òriE,™LdéGüôâ°bnˆ8³øyñ›}ù¸ù¸ îG\-Wˆ³XHPÄ-g Y„Ð9D!2#B6Ü ©/„š 9$z’è9c½VŒ±^CLø¿ýôµ„Ã4Ó”ÜÒ韛÷ÖÄû@¯þüžmn]Ûì÷mIò ¿.…z7oÙÆõ¦>=YÓÓ·ÔÄüCMݨîæÕM5±!ÒïèêVûbé&µ)^³)–Ì´¶/n¸§¯CS}-n@cí¼±Å¼¯Ö†T7ðêVÞWï«÷Õª¶Š¾ˆXãíCfÒ’\Ù×VVŠõÚë $[ªì»VˆÅÛpïóœEBò RNê³jZt+àUGò*ÖØ¿ô›Y„S©¯3Z’pFJ"ÎÇî„;ÊEÜ.êŒpΈ3òtMûÅÆm\X³¯Ï©Ù_ÓñÛ‡±Çø];¥Æ…šxöÃÆoüøx+®oÅÆãìn5Z[¥ø¸±”TâzH¢ÉXLž„(š«ËùvØ“R¥iœ8Ûr Õ5é°í ÄQ.ÌqÜ í7ÍŒGG²t$ éU&Y´8F´â²Ò²„(Áå¦Úúûªå}Û7çÏÆqÜX܇ïbÛЕÑ{¨Ý½¯÷#Ïÿ—ÿïèÊt2‹L1rXXòaCÛŸSOØÒcwº(%ÕйÛe·›Á.U5;ŸévY&Õv[€uÂ1##í—âtF‘Vœƒ+áñzÜ”ŒnÇñøÔ¹ù[¶÷-¯úØXŒ¯á¿öÝ·{ùŸî^2þaä@”Ï¡,?›YQ¹ž‡ÖYÈç9Ü:A-ëd^þ\Àë*É"Bˆ_©Yî‹?B‡SUÃÉl’&“¨pОY4M µ„j xÏq¼ÇhÈâ·Ž±ö˜±ü7®âWPÉè‘nÊëçÀÕGõæ’„`'‘ ßd\‰åÒìE¨­GÛP”b›õÈÈx85vðŇðYçÝ?Œ|ãg¿zwE¨£c^rå¹—Î__]ÿ£C»ÿùVDzã}Gw=5˜²tìï¦ÄqípV¿Ogëï "̨Wà.ˆÊª]±‡d¹À ò¡‚ P FUÅç‡m6LùÃRŒ¡È^2õɲ 9**+aÉ~Ù ô‚£‚žÏb7Ãoº zÔùêN•Ÿ¯Õh›r¹Ç<ÏÒµ®Užêf×Nu·ëõÜŸª²æLÞXÕÆKüb‹ ôb*@*.éR7ïë!G‘Ÿ¬Ñó!JÂTuáõaö1&‡_–c¦6Å0ŠÑˆ‡Ï°'±–¯úÒ¸¼Ó?€{p9l$çtëjõ@¿ujR°L™f ÇSãº5:ÈÈ û$ÃsN(Uª7Ô:ËvÙ \.»ÈC‰¸vof3Æ(´ÆÇÒ®¨1¢ D›Ö`1JÄFœŒFÍ£êÄgCtŒMK´mʤ©ŽQSÇvÊØj»É$°ö?‡]ÄNËìî¹Ü³wÏ9ÿÿßÿ}„>LŸ‹¾Nú 9-uáéû1"|Hé%¤ÜV‚îñKƒ 6äóCºÂÍüz¾#”sŰ9ÿØ Ç§§‡èO„!ð#Y4lAq}yP4²ƒ¢? ƱAƶa0 ŸH…¬r*&»›È»o^¼Ø+Æ•‡¸ÎçŨw RÍK{¦é0pìœ!ät# ç³Óá4)Is¹Ò”*l2Ïkiv #Á ý‚)vÁPF9¢„ÖÑ` ƒ#ÏÁ¸WfŸÓ}?Kßš¾ÛyÄùñªøeªÅêôJ£}œµÐTh; <Æ:g’Ëátþ^’“%g²$Û"†“nÄöƒ •dÃ…ã›:#óø2…°š¡Óí©•ÊJ¥QÙ¡ð €ÄË@âÅÈ«x‰7o«î8‡‹‘ŒwAQMl—Nÿ/°d< –Çp‰PE a€ƒ‰-ô5[ òMEĈq®µõl+NjZ/È•,€Èžý+×Þå:ÚZæ¶ä{ƒ\æLä‡Ç×§÷àbÀðÓ›tYú¤‹Ñ™‹ôñù‹ÁZx\|‰7EPi±ç¹§¹§eß…xZ‡øÕ–:Û*q}­gÚŠ[øM–×lMâ&ûvÏÔ‹N‡Òž¦ûè ëãè0VϦðÑòti^$Â6öà‘®?oÅÖ.Re(ùõ²¡vdŒdE&rÞÙ9Þ[’ÃÌ·gÕ»†-ËpWëSÖæ!`ÿáåEãg‹°ÃѦG ã¹Èª:Tãììâ q9—Pî8“G e$tpuíòÛç/Ü­YѼ=Öýz¬ç¢M5K_ß²¤jó¤i­³^;Ú¶¡ñ—š·§zÿ[û—¼•7¦gó¹Gã ;>Æ/,mÚXùbsÓÀ£­e‡×o8~4áeiMjÀŠÆómË€0J…ÐÏJ;c'/µ8¹4£^•¥TeNGõªcòm¹š,eHe'Iɨc&#í ¸ L;ŸŠh•žüÈxF"ãY` Û´üÊ¢7?v#6ñ¸w£YóTYÿŸUŸ\ë¿–7r!cÂ$ßón#ð#÷ÜÀn¹{…¯*°Ö·NkñmÓö¹ùÎùîºoëýºóûî÷ÜmnnRÞb3É¡}7ÅäÍÔÍz®V&UÒ&›F—ėˇ(¹ƒn"ã,"0²úd[mCyºƒÒ´:\Kª¡µ5ÿÒHµIK):²w&hEêp$ï”O“â 9”maDPLU!´QbV2.VKµm³Ö•—à’Vt`áâŽè«kïüàùôÐꟶkXwÏRÖ¾ü|ãµZÑ;§[®ÝÂʾØßb_Åþ;õáynÂÛ=ï´åBÍtƒýÙÄg£ h"è2 Vbñ\›ù$]ƒˆ±8`9°N¨ ü n€åÁÁY\äâàÝÝÛÛË…{{ŽôöÂoWŸ‹¦ËP~ÔdŒƒ\¤’_C*Yä{)•Ôˆ %RV”HS$’šbx¤ä¨*²ç%c bÂdú3CI!¿_efjh¾örÒ|Ou–2_CW˜[Á‚ ¦a)Ñ2a)ý!ç>• ùü¡HHKKJi˜«wžBV"=¾†5÷SYM|ÿ•ú}Þ?ý£ŠóJ|¤«/ËrTϘô½üC‹&-ûEë^wﻇ\=ó¹ËcoÑ?DÈÅ. WubIV˜4þª#~ñ ƒ¡\f4Ì(ÕÄ>Ç)…J•e©u²™kU~gºh¾ ÜSlSÏ!åÊRÛIåøÀþ@²ò"oç%Ζd5ñ<ø)‹YD¸¶˜E#Ë2EÒ1¦ÇÑ{.zÓy1ž²j&“E3sæ.RkX‘E¼cLÈYlбQG/ ÜËùÏø[<×Êc¾ cÃV.^n‰\«ˆEú¿" Ÿ ¤QX/áMùêCõ‘oxy¡F|) Ô½wrÈÜÇÒm6äçƒZl.𲑕øf¥§Gêéi6 µé'm³¦ŸÔ~P1¯ƒ—9‹pöÑ=PªßPØ„ñ*ª0é_á—É93¹ì³À‘¢Ïɼ›¿|ûÀu|ïTZ‘éì·Sñ¹ØRww¿²}íß»¡6ï@¦T¦!݈‡œ;gO}ÅÛ] έ¦zC Ú'<_õU·bŒynüÔê ¡w>‘V@͈¢¿šOE väïSûÛ̲Ð(s>Z‚–G»Ðšè&´]z]xÍ<*ô›0O£‹Ñ/¢^—/êF…j¹Ò[]l•VÚÅþÖìï/]ÍžýÕ~Ü6ð1Ñ|¼~à•}ÿœ½øòºßüƒºÏ¿:‰¿÷þ%ü­ƒÞÙýò®ìç›ßÊ~öÒÛ¬’ï€Ú3í†Ü]²k¬ÜFtz=17¢à²ŠKl®>9¨T!J-äw8ôxI —D= ½/ó땇^ìAèåìÌ=ÈÕÕ¶½`7 …ÊT¢"å¢Âp!‘u x  r0ùC‚ âØç‚¥ÇqHóÆd1•ª†Ï*œa-„`D!€ÏD|T£P˜_â;ð¿_Ÿ¹²cù²É?Ú|jmö No~­îñö_~wroö=éX0úä3Ù?¿³7›Ý7oTocÝãŸí¹üeu ¢Þ•áSÈ£Ž^µƒ²£TQ ²DjjLGTaèˆz| Ê4a¢¥Y&Ѧ¨þt5šg9Ê%­6Ó~ãbêAžÖÕBÔÁxîØ%–íRCk¤c½ÙqodÍ^Æ"ƒâZˆAE?·S<† ¾„ðk‹X:!aýü¶u#aö!÷µæÙ÷¹ŸÿA‹é}ïþ6t‰žÂüÛ;¼|X Ü? ÜO`¿Ž"A2·Ï¡~ìÊËQÜW@(F89-æÆrAÌ%€òW1NV$Ê-A€¸*æÂTè 5¹îË"ã¯|x÷°ÿ'K»*pE4iiXãâW+JΟu—ÊížÌÍ\<à<Çš»#U ¿fõ6B Ë"Åáâ¢bA6’žD0Y’¤ 1Y–(4£qrûãðpÀo)pU*%â¸Xd¼°ÄÔx• ° öƒ€p2-©ü‡aeðè„÷¿ªG¨@ùò!+ }"&¯ð$Y¼1{ºû\vgžòÑNŒ_Nî?søùµ?ˆy“Í+¿Nƽ‡/,]vÏ9w/ë_xäµKºÚ¿¹æ©õ;ßÉÞêš×„½°»¡¢”r&œ;ŠLÈzØl…˜ªuk§5¢I„èl) ´¼k<ß`\·uÞõ<¼ë±a­w>Ì;_¦ËÄ&ÑÔ±­Ôà¥?šƒß}'”cebËœbÎ5—˜bsGa*Ó™¯?¹ äìcŠaø4®f9^†049€$e°î ·†eéØð2óöxÒ7Ü>B­‚,è½CŒ;D¯ûÆ´6ðs}ƒsYëœ+«œsYÂ9Gcι0ÌÏ0õx,i“´_¬‚XÛˆºÑ$Ö MAGƒHòYpsøã<“0k8ÙùW>;×òÙ¹i{¥Ç³³K<Óq_ñm›ýô›] ç2K[†3ù”@Æ1*Ö{0i16ÝùD˜ÇÕÐ>Ûó,Y(/'ߗכ뽲ÊùÖ¯3ºÁa[cnUMjMêlœcžqƒ9¤;ÕNÓfwìÛ1=cù±å·ýSüsý¢'Y?Ï—Ä+ùMý8WS&ùç#¹êÉt:1õ¼š÷QÆ™ ÞC 64%›÷+KæOXT9ÐqrõÉS¸»°ç'mËV ×‡ŠŽüiÑyVAõIS¢qÖŽ ¥MiªŽ­ÐFËÚÚ apVPVh BbU‚·ÆJiƒø’ô[ñ •4ψDe V}ñÁb ˆ†>#ícwûàšæÎ";GùùDŸ/Ä[‹à7‰VªµuUM¥š$ˆ¢%iI‚+ “ ª]Ö4$E§ˆjÑ1±¶»VÂÝÒé„tA¥‰”ÝÓkl ? Ê²Î6tëmF×ï5£&ãs‚‰µó*›ùXEjaôiiaTA&ä]LÈK äE0êi¡- Û A¶G@¶3U}nLÇA™´Mãƒ}†—åkÐ.Cö¸¼ Ôãò4¨ÌÒ<À äün×Mü(¶½j)ämDQZdGi$ ä88f(-³´ê¾4- ¤E;fi>”3˜NÝût°ãÎ¥™bƒC?ŽcøS¼[È9¬ o#«ï á›ƒ@ÿ*rvøwC[Éå+YÑAX ¨‘ÐbÛÀ* „¨ÅF"²×v+DxäÖó!¹$?$—.gœžïP4÷Þš~Ñ ?±!Ù žxÈŃÄI*…À+$u™^ÞÝ 8€ºfW2Ëð±¯%·!¨ªê.DU¢é2ç®'GÜÛ‡9q=àÜåþ\$·ò‘ 9‘Ô€§ø%äÄ ÏéÓ'¼00¤RÎn¡ˆ³Óv‰Âë‘ÌW¯"_%¾R†¶2f.* a²nìâò“ÏG_æKe +aVR†¥ùÜ|‘ aH2 ÚŒÎÞÆ þ’·Ètäƒ\M·Íœz‘óéç¯E˜År£°ÎÛB‹LæöR#öOqÓ‰Pq…±Îø#¤Ò˜`Lp UbÂázZ˜%®0èzѤ:‘hÚlt=E& )6m7¿áÒ¶’mÂe íö*²¸]®Z‰Û 5L³V¢`Rcê(¯Öà&®+¼÷jWÚ÷ËÒj%ÙB²¥µ]GøýPðÔÛLy»åa[ƒ[pÒHìðL†Æ™„‡ Ií˜&m¦hË”à`<¦m¨'“ò`¦e ™”i›q›0w(ñôíuÏ]I„iþ´–W÷ì^iµ÷Üï|çû”¯"a̲/ï˲Jö©GÔ±>†OQª>ÇÄØQTmó"ÇÇlñI c°H 0ƒG‘`s QéS‘:Š×]ˆ1=Ì ­ŸÖHk ©S™©L³ 8› ‡T¨ìæð½“‰ e‚`kVï{…ÕÉIRèû÷¼±ÊàÞeg¨ð(Tø/(qn0xÂs×›šš:¡úE˜+s«_šû׫2O®B“Ók#ñ´ü@<-Bؘ–kÝð| ®¦råÚùxjºV'ÀÁ†F‡Jv %PW•ªGsÑY÷3§ƒ›¾óâ—۾뙹ÛJ¿=]Oÿq:nh#hÉ›Ì5J¦"Ô»-¬ ¿ê÷G‚‘M«´_ útpD~SöƒfÇŠlmUÁª î`:¸vu­¶¡`}pƒ¹.Üy6x«¡¨Ç£G.`Å@J“ÞEŠÄ—ïÅÜv«ÜGºS.Ì|DÄÄ]@‡‹P‘b¶ðÞÈPaÞAf-d&Ï+²>I$ØÈ•Š×ÐÄð¸J°Q¥jk(­ƒ¤6¢¨ámÔú“ל‘ׯ:c§.£¢ ÈÀ­ßsnà+h+zeÜùáïÿàüàüe´þ—Î?«¨E†‘ðmçÏYIÏ»H”I³èÕ6ûñ2u™¿KíòÓ‚ÜRA3ë t‹åɺY5WÑ9M͆caÿaSúÅg}Qè~rtÙq¥Úï&‡$&ïŠ\%ÙµƒQ ¹‰Ç5ˆï9A\~dÅ–#sÞr '~þ½Ìòêgœ!fLÖ{G¶^tfgêA‡žì~: Q… Î@LªÍØq]‘ÞP¸~ÞCìÖy4§º|ä¾ûÜ÷‘GdÙoˆù@Èúè܇Ãz¸ÆÛÃÅ¥u9/*­Ss£’aþwÃEVv>¯æF2o/ )/-\[-tn-|œÛ%({ùÊKÒieTùXþHQCcšâ×4ESDNàxØà½º¦J"crœ ‡¢A",C$éÁ /v÷Ó4Ef£–ü²—@;§ä³[åJøbWÌ{ÉŠ½™X¢/1˜ð$ŠÍÿu½ŸUï¹=.!rã¿Ìc®B&l³KC¹½®€¹æt%Ð4Ò‚éýòü tÙþŠûÿ¨œúµyÖVÒŠú ¦?H˜õ»<$ƒ`‡Òh Ù.L« ÔâypÜS „}j #à÷úŒ ,(ñÌǧZ[%ñøàïì¾òÛek—ÏM¯}´=_ö'tbïÑ•/tª˜±U—^¾^”L¬Üáô£êg5 ¾ÙžÚÆÅߨGôh÷ÜGô_ÁñVá€]ºÑ³‘ÞæÙNÓÉÒzOºðKž%¾åE‹æ-L´–®ötúº‹Úˆ äbhI¾ù ™¬|PšJÜ­È~8$ó•J‰‹h%Q™d%pÂSšlPêJ&U®­+Y›Ü"|SÚ,?äï5„ÝÒneº#±-¹ÏsP’*Ï©{O'HG•£h®ÿ§â–±ÂœU2Ÿ*ëtMµEõBqI©ÈPG’†”Š–&Q’1Ân¿g¢).5<.çUhz:GnÈ Òœ+'³¯ˆJ&dI`â…EÑëóÒìEÉD1\ó2ÑH*lؽ<4iP)balW©(†ÚPêC‡‘ ÍY» E~’ü4<ñR΢ÊQ9¡pYÆkËÉ£Iä{åáX²tbÂÈ”ž¹N°¬¸U¾†ÔB¨zc— èÌŠ ×½ŸÿÃ¥ò©,™«àÄ&ÈÛYÀV—FvWÓÿ)Šó £¸6‹¶R+QjYõu µ€Ê ÏÊ÷üAƒº ”°º/H.ïyìǫۺ8[¾òÈÃߺó“ÿÞÇŒ)gNŸ=‘nBïw îÞ7ýʯOŽ£ê£ÏµqÛÂE—¿VÑx²÷±_mzä§ägŸªkUmíæ²çwmû-‚Ô*è cÀŠ>jÈ–…„Sw†æFñ¶aW #tÁC¸Òƒ<ŸG.5›Ø‚KlŽîäÅð‡y’˜É“‚“•eäŽìÈñûu1¤³YÈü…A–ú««âZ¼>ˆk¸À)¢:F:sæî'äiO@÷/†§õSïÛ¼¥tÐì[,mº:zÛJ/ew*?b>V|"…µQ|ñ5/ç·0Ù`ò¤˜ˆT³çú36óêMgæäóHºåY5sîõó_G~’#ú\+äˆGŸÏz [gźÝ¬'Ç23•7ßUo¾«ÕÖBÎ[¨ÕU;QÉ ÏQež$_)V‰=â;Ä/‰·ÁuŠm"¦±Àâ,\àònÙÒ‚ÎáÛ<ÇÅXÆÏ² ÁŒc†ƒŸºãAïö²¨³$•BYºEƒìaβ%l—¥7`ôþ>Ƙ\ÑbLƒ«@ãf.1·tîa¡çTVçöO@5‘ÃT¡ ¡‘„C“fK3Q³Äµ‚š…eµ¬ôê9Jøû9NGd¹â®Éý#²¶ >ÖàÊZjîRSg§+Ê@vtÆQmV¥Ö"ü…ÙË¿A{æÏ+N¡CoÎŽƒ8½1Ø·k]~·•äP˜ñC: ¥†Ý}liqw-è²'I~ÔCƒëðú ù< ‘“dEýº0‚¦kf(3FFQ×Èh¯°\Œb0Ž!Êe2, ˜þ@ÀÔEŽ‹tuMT”ÿP]íÁQUgüžûØ{÷¾»{w77¹›dó\ Ù˜ÜL0y XˆtK°"&P Q¤¶€ZB§Ð?hgdZiKíH©VZ2š¡C&ŒZZy´ B cqZ”lú³‰Àd÷œ/gÎì=ç~¿ß÷ý~ Ýéºae!æ4C^Á‘8&ªkZ0(4œ)jš†A qÛŽëSƒè1*AÉ0†áëSz¬7‘@Åb}hÇ¡œ0ÈÄc-#`RFⱑèü+¦_ùZŒ›¬à~Æø×ó¶¶ÜoYœ€I[U}`†¦ñèþ’­A² Œ SŒs(ÅÊ{³A*¬–}ÎoÈ¢;€°r€°L˜¬Z°.¥e¡Ÿg¿ÿç‹ÉxƒˆìÏ>XPìL¼ò^vÍ;Ù÷Ëx;”=\mþéîëIæÂH<{ã?;Ž0o§Éü0±bÖW¿cì@Eõ+ ÅPD¢+Ì «Õ3 BC°AiTëÌzK4­„Y˜6ñ BÝ: ³26Çf׳Õ°xƒ‡ hƒD—²|¹T©–š±B£„q¶°ˆÍOJKÕEæJ´‚íVIê s=û=k‚ æk »ß.îfû„cæIö”ð7öïÂÇêYó*{M¸¦^1'€ŒüÌ7dšp’€G Úÿã` ç’L…CzT4Xw^óUéŠV *ÑiH;Î1´Ç¤3€æ`A'bh4–¦* ÒuÅ0-K‚wF+#[¢„:mEËJPA¨A†V”„Ì„d™ŠÄ04m)Ðê)¡*ŒÂ€Î„ì˴܇–Kˆ»Ä~‘ûPßÑecŧÏG|½UÔ6ùb‚Š…Âïâⓚc6Š g†3ØfÀíVîˆRø6ž§i•MÂÀýS•Kˆ°Íy4Þˆ •@ÐJ1a1Íó@’\x;ϳr ¯±7ÏŠò<È}ÿÛŽ§àòê:ž—¯¢Fì&ËŒØSpM x— þ$~Óô$9¿p ¢ò ›$G4Ždˆ5ˆ5Ñ= ÁSè¾”7ËZt¯RŽS"H×gå«H\X\3 •}82B§newº…5áì.ú.ý§ì¶õÍ­‹Ñæ‘–»whib]kAA%ýG¶ZþuŠ¡@ê¡fŠŽsTŒ6—ŒËúªªe¸¦šyà²of;^~;»GG¯±û0UNÕÓý A%XSâ•Je¥§<®Ïk¬œS™Q2•JGe{õveKÅk‘=ñ7•p96E¸g—aLïôFlyoìòØ`ùáóåÂô*ÀzÑÀ-Ý4‰ %²¶3­ G®íFS*ÓëM˜ÃΞð¸°$õŒÐ‘zAÞ*Ÿ’ï(wRF}ZE¬^•LÛ“ CÑek+è §JmVwª¯«£*÷ºÚ£ÞTUÆÒBÅB‹ ?8¬ë6UÆ:B hŒªÃØ}ôþÞèîãðÞ'RkF™8Ùa¤Šåúr*@TXIa+Ÿ1cq#§|’,V+ðÿe¸< n“·Á'XÕAD”×pÉ>ú _-ó©R½4QZ]ÚSÊy6¢˜Ápœí%A ^ó•‚âtµ×ïÑ{=äÙølSñ/Ú%Ñ¢ªä‰À`€vÍ: 3*'%.TƇÁ#Ô•8R?ÚäïAœ¬%¹:nÇ5»]Úu‹œZçg»Ë 4ZM‘¦ø¼È¼xFÈ(ßÔ2‘oÅ;…ÕʳښȚx¿û±|Î>û§uþû4ÿ’;êÆ\•Vªæš5Ÿ›§µrÏpçò¿`¿Ôe=¬²šÊs€ÁbØQ¥hòŒ„tÉ—Ú¥Mëú8[Á¨%1Á8yÜ"’0˜0x ¸DÀƒWü*œOéydÔR|K,A-SBÓý\Û^tÝB¬‹šÑÄ l0h!¸ëçcx!DD;21T î4G0ÂÈÖ~4Šâç¢~Š̪@zcTt7µè#°†íÞ"‘áð1<¢ˆ¡ÃFª«°t8¸³:¬SÅEe ˜3x7€ šø›#݇žêéò³Ÿÿñø*:Ýöãüzý ¸?Œ|±sÁο<—½™=û3ô“m;N¿æäiè÷­£×˜a¨Wq´tL¡§ÕÒ$äS­Ô:¨}¬éH|Ôa%¤†yßž'·çe|{^Ç·ç ÂOt2ç>2“ñ ùYA¹Î4kš½ÐZh·[íözóš²Oß—%&vÒL'·^^§lRÞ{Å£²‘·ÈŸÒŒZ´L[«mÔ A‰ñ_¬¦ð¡ÚáX»¨½Ô%êÈM“¨{gtàèIU õ©(î—”R.(JÐ{>IO²3›ä$Nr2Ç 'yäòÍ<Í«x/âM<)¯|M^z`Ì%BVräÏtÏ]X<—¨4„UÚp÷íÔp7¹;ÝðªôÌeøà´áž´Ù˜Û”‘6!u›/ÅÙÊQ˜i:”ó­sÙÿvÿëÕß}âöÄ6.ݶß:„6ÛÇQ> ú¥ž_ä­ZýÞ‡gß%=f&äì"0ÒF¶ùûDšUJ”´2]áêBuÎbz‘øÐBg%ý4·"øíP»Óï~ÄýÕ:²†B7íë±!¼ˆë¦â˜®s㘻ü$:©LŠ4ÒuÊ\z†234ÇY,>®¬T†W#_¢ÛªŽÂŒ*é0Râ (ÉHÑZD•Z‰®Ÿ1nøF»±ÉjbLäj˜˜9iZ˜ªF#È „…ÕÏa+¼qCÅoþÿ7a©Íê#8;Æófò?È_äGy§hÏðr¤Nó9(’´‘¶Ä“îÃÇ Òÿçºj`›8Ïð÷Ý}÷óÝÙ¹³s¾‹Ç NöZ‚?f5Çh‚ZHBha¤#]?b ­¥Ð´©hmtŠº•­[ÂØíÖ5„¨+™Š˜41¶2i´¦FtKm]'{¿ïÈ*Ë÷ýØçó÷>ïó¼Ï»bÓÚ:G³³I—~-›áÍ.{ßçô[±J¦Å Æ`À9lÝç™X³ñÜó—wnyo_û<•-úÕÎ]¿8±w÷Ñý?=tçX¿Û²XÈ™h‚þøûóW.œc˜-< f¹NEBÂ*±Mj£«ôâVé)ºQWC¬ òcÃÄ]Éf…v- þMš°ÆóIEpQ¸"²8ؘ¿8Ò\^YüVþºÈnywh\Ï3‘ ¿ã¬°Ûím¶hGŒn³×L“D4 o°ŒQ³!`ÄÝv¼’ ìq\°m °úìÑ~VÿYH¹££eóÓ}~ìÏÂêT¼4ÍFw1+³QµSæ\Å;?=ƒTÑ,¤")`Ž‘Íñ¤fkb[¢1;Òdv$ãlÝÈ”0 r„“«-“íÈp[Îàb6•WÐí33Qj! XJÌfxáX)/¢â“ƒÉOOßœü [\Æ9øî ­ÿ¥õ‡²W„_Íêï<û:^íÀQ{.Ÿ¼:yÛ,zkp3~eÿ’ÍÇAErÂ.é/ÈÁ~wŽE±~0¼ 솷…ì{Íÿº_Í÷—ûûÂCafñ(Ϧ U¿è3" +—ˆ2Òz,lMåºÄ‰$ ‡A–X+jÒlt‘hºá°Ëhvý@d1 P9ÛAÅŒ8(É'/]‹'ò<Ÿ|Ì L&~Ãmر¼ð<ˆbhkú†ñÄ,€Y1?‡FaÔ…Ö¡.“ÉdÐÝV,XòŒk™™*² ɤÁ ¦{þ /àðd{*PR™ªLWWM@Ö˜ª…R¡’@OOnþ¾]Ë×Ô,\ùðð°ø£C[Ó _ þDkhÿÆ¡»›€_™l?FÌAóñSn»®KVR[ËõzK¦…á¤^j%Kjõ*ëQ½ÁZ­¬Ñ7ëÚB9”$Ë*y¨lyYw²7©TŪæÕ%ô†Xý¼ÇcÏû¦²>¶~^{²+y¥ìFìÓ’ÏÊŽ-‡ÞN”Gr^IÌ"´€×‘.4„."°­B§»PŠD ­¾8âÓìP*žÒâyyl:®Óît9$ !V%¹¬9\Öœ{²æpYslþkB¹¬±oÉlíÉšÃLÁ£,鎣âèܳưq͘2HÔ¨3š¡ÐqÆù [£˜ýša¿dpm3¸¶áDrGŒÉ4÷åíóQó —ÏyFFؘaŒé€¢ä8¶ãÈ2`àéœS™ XÜ„æÎ»Moé —ìè<˜—ƒwõ½?öíK/ŸÙs|ãû½¿ûäÈñÎgO¼¹g÷‰5ù-ñ…ž¨îûÎ|ø*Ƈ^íº»åÖðî_Šó/ ½ðîùw¡›Bo@Õ²ðºÓȆÄ9i‘µ-Ü^ÇI¥X/ú ßZä„ÓŽð,QÂȈHŠ¥k¾8uSUé)Ї(¶y±]-çW‹A@Yc`£ÜÛÑ|ö=Ø÷ ¡ƒ„²£³çRÑ…}þ6‹-m²tUºÏ³…mv¯ÝgOÙĬ8ç«kƒó "Èœëˆ0ªqAe×á,õl¥ÊÈ4C'öýÎìo“(ø\Ÿ‚þä>I«Ø ši7í¥}tˆ^£cTA4J·Ñ.Ú3½uNQ-JÁc)D©,>‡‘,ÉD“•¸„Hé%}dˆ\'ò#"Eä"¬ñ¼²°ŠÜ‹áq#{*áÊFf”0ÎbF‰4CÒ¤~1zÛ!zLÆêFy‰`o–òÛ;¹•©Q9800@þ1<|'DJï\YŸúÙd ^ÄÏD—Ýz"Å¥/“”´_’U’B"å"ì×Ñò‘€¤+섺¬DF7(ºã+ýqMëÖqT¯Ó›uQg'ªf'ÒMÞ™ðFAç=¥>‡w&>v(]å= ç¶εތ-ÍjÎbè 2MfýƇ?î@u¬'€Skï/J0ÕŒ—ªi”ª¦V€iŽR€¼ŒÀmì츚S"`)@ñý“›‹«¢ÕU©Å?|„ܼtéöÞ#9&kïôžkÜÀø ¹ Þ‚¸èÂ:·@ö¼•¼Z~‚ІÿßÒ¸,RCOf=;ž63¡3 ò ×d7®ŸÖ„ \”K«Ðœ –¥)kÒ` J|#Æ7ÜaG&D"r5] PÈ_ÒÖhO‹;µ+âG²r\Æ%r©WkåZçoö·’VyÒJ;É3Òz^þ3ù«<"ßTþ+ßVCAM“D‘²¬PªÂ‚ªj\‘-E‘EBâ’fI’¦AÂCZJ²¢c‘FÞÁ†K%°‘ŠU¶ŠñîÀä¶%¿ GBzE„ëP30ÒÓ­àÜçˆ#Ž8♌‚\x;xk‚Â>ÿßcK7ÍÆšC u¬Ïx¢ äœSÞ„¤s&àÔHNóŒy‰˜(»šùõ¤Ì{7ÿ2Š£ôEQ yþ@´ £òÉÚ5®F“…µT-,Ì`Wû kax¯¿ˆ'cµü/´‚óÿ‹ ¸ã4’§†úcµâP¿Í†«ýf­ì |åãÃIÝ»9Ñ ÉÆntƒ¬Z6<Ͳ2üw÷ç±›ÿy²Àû:nkåÖÍ:¸^áÆ%X†â7nNnÁg¯N}^¼{÷MîÊn¢{&¿Æòr\ª9_?z[â%1U]“æcºÒTxcqœnÊ!E¥éšDšá2&‰Qi›Ô%MIÔ\DOàÙ/q¡³éAxÚLa¶Úߺ¯ö…³ÔÞÃÚócê´ó$ &SÜ {Ú…šÈÿk¯D“/^¥·{Û,2û¤Á‰†é*—‚g*Á8ü@³ÿ±]íÁMwøötzÜCÒž§;‡žF2„ Å“[ 30…½ 䆢 'Ú¥£HÇlш Il2Ik¸›ò$±¹ð1£=ø‡Š4ÉmDÆ-´“ÌrïAz›H1 § r´G*™N}0J¦Cçßè"žN%]Råðt*æiΪ€'Fç÷ÉÄ*žO¢èá(¢÷ú(:HaþÿüßáQ\JšèÀ÷KùŽî"­¸…­HÉHôè<ö¸“¦‚ ,»2ZÖœs…z¢Ím6Ϩõ#º"ÓEY\ΘKUà°ºKz"º |Ý3IÈćb»&>º¼qïKlÙÒ|õÜo gçoúùà ëžîªab{ë׬}áÏGŽâô¯7®©ÙÛ_è¥:;Ÿùå;…k%Ïuí ìÐFƒÉIÿž€Ÿþå¼m¸ë41Xrç¢ ³‚÷à|C—Íâ²¹$ò\À$Y9«M°Edâ³dâ¹xâ¶xâ¶øn‹'$àCä¼ÂÄmñÄm¡óÿå‰Ûâ±#rÈCÇôâëeL:/v^òm™Þ$÷ÉGåS2#èn‰póî (™÷ÿ ÷˜áË 3ÁÄSºãqWïwsù‡˜"Þ!&ì‘«èo©1öa¨?pa’Id9 gæ &M6Ø9Çȉ.l·Ñ"(c?æyâîý›¯7í{rƒ‰ ‹Û1±Þ# 7-Kí(´Óoü°õ‰= A…ªÿ’‰#­”6wËø—8 É옒í¸RÈ3§‹L‹-+M«,/›š-–4¬qÔHÕòBX稓ÊYc–]sŽœ´Bn5¶²ë`«£UZ'ÿ¸Y“ѺÚðœñ9nµ°Ñ°Þ¸žÛ(pc‘d¸"*É>*ÙfœrHö1ËøªN\½=ˆ×ŸÄ3àã@ Ò@1ÎH4=Í (34kfƒyú0Ò|}I œž†j[„l8ö:‚¯àk#øYKô‡’Â:šËMM÷¦gaqÍ=D擹»¹\–(eF‘Ô¢›Çm‹m06°kkY÷&|‹ÎB QnЍòPTÛÿæ™O´íÖ[Ãc£è~càØ®îÚ â»·Œ}V¸xëÇ ¬Î_øû™óçÐu53“‚*Öê»8΃uÉhG5:¨MÂþ”;å_àߤõh–OºÔ³T]eY-d=YµÅ²Ah†­ž ê)í²ëº|Ý{90â ÜÐÆ5)Ì$aÒ]ÍÔÀ§˜¥°~ÁßòA^´$Ÿ«¼ä³ñ”M‰ qr:×Äíä@¨8‘o»©óHNž8¿W2tß,‰³Ãrx¯…ñbsÀ9ƒžáˆRÔ)ä‚@8 n&2`90Ü爢ƀ¨1 ;xJ€ÉŒ±#·’`<1’H„+P‚‹fÉ YbX¸3ò0ææòÅ ñÄDk©nœTÞYUÉí¢q ‹†2ôºûköüà'C-›‡·5¾]%ÜÒùþ¡ŽöÆš'úì³?ïÀØ·o=]SøÖÐñôù«çÏý³pñX³áÂR>0SßÍÓI:!Ï¡ëè­‚)ãÎ(uJO /`L;Ój&Pë¬Uœ êKΗԦÀÎÀÓUÇMÓWÂ×2œL‡„¤{6]-,¡Ÿéfúšð©ü¹ô•rS½OÛcuy}¼ÙfrùœÇ6ƒŠB8dЮۛì;íL@çÑrzvVB;V\BF» /»]"Ÿ‘FŠ—Þ.áµÆRAHnÏõè#š/™‡Íãf&ˆLîrDÆa²4‡·¥¢ñ%|VüŽIé².™Ë/-$Ëpš‹Pšû]`¨< “Ä4ÇS<_*†ÊDïó'ÇþýÊåWÏä÷&ý¾³ýà‘-›Œ5Ó–9õ  ˜ûÆ^;¸ûÞ“†?\¼ø·®|òîp»4g*"õ±>gª@„™4ó$ÓÀ|Ÿé`L¬ha-¬Õ)²VÊ`<¡ű=` iNà¤CbÑøéðñÆPæõþ£‹eÆD„èGAö0e*3ùõŽE§§¨³ŒÀܶ´8xif£ rü¸Û¶ã4^¨6+y¯‹5Š]ûç7gV¿8Á‚9/ºLl_~qÍ¡ø¢LS[á ^…Ìø—†Ð*L3xômLȪa—²µ‘•¡õ¡íìnöõÈAçû•5XYWöL««üÄcTéçi¦'g-Y6Ëeù¬µ¶XZØ®…oZ¬ƒ±Á¸=‹Ä#“gF¹UüºØºŠŽpGdgä]îWžŠÞʽÓú¹ß âýÇbgbREɉ†JE¸TDJEE1N܃‹p©ˆ” ?ʺ#0»Ñ ãÕbn†¯ò{OЇõR‰?¨d”åÊåˆrI1Ù• òŠ2¬0Aåm…VN"lÜh_¦BÕ…o‡@4C(èh€}¾KJ»MLP•õoôÓ~ŸÛÌàÇÀƒPq“Œ ݉f|U|Ð ¼EwÊé>ÓN‘‹GÌEÂ{DÑðHEã‰téôês$†þÑ7{(ø[ðˆ¦'ž&Qâ)*¾>Ž%¼ä«&Åé¦Ô©IíLÑ)ˆPrÑï’-§WI;.ðàBWðCh;`;y<»6¡÷t膃@D!4\еÊtÜI‘ #’OHñ(ú‡è­­žX$|)Ÿ\Væ‰G‘Æ7eFóŽÙS‹É‰6yC›½Ðž÷Ý“Ÿ]•1: L!«¦Rl…YÆ)èp¡ÓI¶°J…ÂVÁ2™SAEœåLIF¥‚Ð}V"WV<àšL$»ºº¨29¹¶|Î9K*JM<¯¢«Ó3gâñb.òfž]lö±Ì€ýÍmÛ;«£ïžýÅò'¾—x§aÇÉFñ¨ÐÞ¼½E’¦ª¯Ø»²ùìŽK×À<߆¶õµóÂr4µ¤«~ÑÖŠ`rñ¶—åÙÿ‘]-°qexfö9³Ùݻܞïìæìäì‹/ŠƒîçRƒ·„*“ºyÆi…—«Bš„‡H‹Ò4Q–6PÚ„‡RZ‰4REãØŽí%BÔ†€’´"‘–PÕ¨T&‚Ïü3w1-øngg÷¼ùÿïÿ¾ÿÛÔ±¨¾!ÆnÛ¿cûñ»^uºxî=ÒªC!zc 1Àà¢æ"™½ &ë0¶ð‚ÍsÒ­XÜkBMØ ²6ž3ÌÛéí;½ÆAã[†Š szÆ8eŒ Ýb-¸Ê¨Šµœ¼7$8˨ú±ÚD²zµƒ®ödBûa¦×Z³jWiœ%ŸGI¼b ïL*Èï4ôÇÞUÁðÓ]0 ï Þ+¶æóÙPį¹Ý_üÞL¶È‹Ð/õñÎOïZzèÐàðp,Ÿ»å‡Ç½|îYò™Ç±±«òÄã³ßÙ°4%bôuà²)µžÞ3†Rº ,’L,Qäâm A¼˜áÅf,aãXÂ2÷!L¨È&Ca'RÒ«„Ò¥„@(m§ˆ@(é;œ÷'¡ô'¡ wéOBi8CáO¹‡8¼#%r´@X“Ô»)²7õLêTj.¥¦ì,ŠÍÐ tŠªô¦pÐyá òÉ”‰§Rq©TzJijéuÂ{ÎGŠkúÿM(ˆˆ{WgU9d¥TÏu¸CtÃÔMÍ#¢Úiä˜~ ÒÚú0è/\ÛØ.SÓÉ)øxQ+Ä\éÚé“ÏõxÖåïÞ¸ñÈ­CßZ{_Oû—É·gŸøÐš›¿y˜”nLBv EÊ5ÈÃo²z˶(ÔLÄLë iÔÔ0Ñ øimù+Þ• €†P;ñªé‘v £&¿Ä¿;~‰‚Í,šb Àtƒ°Çµ=üǽ¥±ˆr0Ⱦ“6e‹(MFrËŠ(·— mf%ÔÎÖ¢5l+ÞJzÍm´÷‘{Í{éýhÞG0ï§ûX?î'(‡ÍÇèÐQú${=Ë~ŠFŒö ú›D—Ø;èOìšaKa9,‰,‡šYëA£Z$Š@¥8 ËµSXX:-rÄE’*b!ÎÉvVDEž%šf[¶¶+yˆ lù‰&*S}&ü›DçƒêLLx—'¼‹ù >`¡85Yņ ŒãVu #ëý»ý#¾âgdþFç¦$ª7'¾ º°±èÕ7´º~7Y¸¸¨ê6éiZh*Ru‹Z®x(¦Äz3m5€ƒÍ­fÞ-¢vc•y«û1eÌnk5_ã¯î曂/Ÿ5ï пf|ÅÓÏò3Áßõ4gù9”sZÜo Úâ+QG°Ï|Ä<ªÑïñò‰/Ž,OÃ;µ½P\ ׉a|=v½O¶DufÊå$ô5ðEVN¾5_Y^íKǵªóåØ¿áý÷Á ²ßõή×)61[÷©…›· 9;C~27=írç. ¡å<FñÊÚ_o÷©âf¨8sË›»O6n—g§ŒLõlgo‘gáFg „{[]8m,wR»øÅÁŸÝ`CбÁ.`×q ·p¨‹$¨¤ E%¢HIjúP¤%&¸% ¡*TQBÓ4Tµ±„ÓÒ‡Ô:U)=®¿Ý;- TUûßÎêÛùæ±»3ßoö7¿é ôê½ÁáÀ°>ÜíÞåß¿ÇØ<à?˜(pHÊxÖû=ßËÚéü¿÷þÖøÀŸÖ®™è}³+ª@÷E#.õAõ ª Þ¾=>²Á@n5©ª¬‘¯¤È¡ÐÐõ²€× ‚*“3,óy ŸÏ«²ìs[/@T‹òšè™(Nðæ“*i‘4&xOÒ×Hø`àL€&XëK*+ÁÒˆ×j²ÕJÆäZ¹SºäŒÌeêñbJÚðæñHl”#‰—NÑq‘Ñé°63U¨M ¤¦‹ÂڴͶ³+J¢•Dy8®ä–ÔíõC^O!o&osræ |™+ìv_cd~ýRSÂ[Ò”Pè/;Lä—¹ÕCž†bZ>z…ã6Y×­†¶*Šƒ3Ï7—…òËó|7>sþWñ’¹ñËã7FZJkG×Ôߨô}­²4²EãªLm磻ø–믎µöv[QN%ùž·h])l,éLð‹°P=ùÐד"l E­T:Ÿ|ˆH¯ôÔh –ð.gm¼MZîéÔÖ³Þ#õyº´öDÚìÙËvH{=_f¤§<ר Jå¬JŠ{ÒsÒ/˜hý-§´`='÷JAÈ[Éyã‹<^.y½eŒÓöÇí‹n>”§)z‡üð[!¨ÇÞÍ㊗O0uœ6Ã<÷iÞ@¤Æ«Q,ñKaP’ÊÃÊãÊU%O±ž+µš”ðîcl ¬[‘€°UBUÛQl¹øÊòîf‡6­¥-2×f,ã¦é˜7µ÷èˆø^¾µççBMM¹'Ú;Ž‘5OV±r‰³Yõ$KK*?e©hIiwd©^6`Û^"÷¡Z"ä²+§" TyÀ Î^%ìc—· Á BQÁ-ÇR×ÀÜ󊊃Ll¬+VòonÝNáÑô¹­»7³?$÷‘ϧ?¹×ó Š$Ð-ü™÷åý >„ðNrý±Â±Bþ¾ø¾ÎßßÕùâ:?#žÑù˜8¦ócâ1ë|Ÿ¸Oç×¥ë‘F Þ'õ\–dƒº$Ò ÓA½¦׸âçL6ý0ýl‚u%kô­âcâaQ™¾Ð0¿lRÀ’ Õ+;™¸P29ƒ)‡9ã…áÔwíd€„O“ØStl4³ ÍfÚœ&{Xf œec.hµ‹oO¥R,•Kl€ç5ÔÓÿr»ÅâÛ83ÎŪûç7Õ ìè,s]øésOš]Um¡þµ·)Õ.üŽ¯Ì»h+õËäJ[©«ÒUƒ3‰|RœÔù%ñ’ÎÏŠgu~B<¡óãâqè|¿¸_çÛÄm:ß m0x·ÔSJ•}ŒçuKÙO’)$“ž­ŠZFr˜Œ)ª)“^þÐYö[rùwr.˜ É*cŒm¶Õ¢ýÍœ™²4²¤šÒlN‹ÔÒ(==›ÿ³X7uJ¥H76 7Ô Ñ-V466ÕÝÆ×ž›ïŸßØ ¼3K\%¯ªj/ì¾Åp3Uÿ{°×î_AøSBáMÀ&ô.îÇéW^OáÀ“€ïa@>KÑü@ë"üП‚Ô¯ v'B,Â/Eô¾ÈW€èÛÀœ¯÷Ñós'Øo€âŸ%/¥W€²í@å7³¨ºDÃ~;‹û[š?µôìG_ê Û€…£wÁ‰,ï ±7SX“|h¥¹|ŒŽ”Ké»íŸ–} XNsZAcíP€Î%À*°úÇ@ÏA` Íem9Ð÷:ÐO: М> endobj 314 0 obj << /Filter /FlateDecode /Length 31297 /Length1 43280 >> stream H‰|V pÇ}Ý=³«Ó’`9fiÁÚ²Äa!aXÐî¢Ã€$´å]ì]Ý °"°p–!2•„pT0®r(JÌ,ÆDàTJ©Wp‚"ãØ@¹â$8Á‚8æ(C´ù3:"|dzßôÿýÿï~ÿwwí€HD;Ê–-Ïέ9XÙA£Kk׆[n]Ü»8Ô °ÎÚ ­Ê7N7~l—É×ÐÒ¸öÕ'r¦r:éßj\³±¡ãÍSÏ6ðìÛMõáº_}à§ùÞ¥˜9M44:VbžÞ´¶µ-¿ÿØ=ÒÄU®yª6̲>.žO#½jm¸­Åòºtƒâ›È_y2¼¶þÚ½»‰Àa…øøZžúz+ñ¦ç°ñRZÖÕ·\9ùÛ]À²[íò y2d+2ÄldÑKCè‰~*§`Eÿl@EÎÆŸJÂô1úÏ—D}îá·ÿ+8þ„Ñ;–°”%£B5þ*–ŽÛ8ÇÎÒøeäã즌KØT‘}Vc'~†—ñ*z™`v,@)jÑ‚ Øyã£ø¾M,’¤KÄ‹C¥Ø¸i• e·Oâ<ÞÆ‡¸†OqwXÇæ`ó™‡}`gØYöþ¾˜*ˆâ-É.åJÕÒ›òršO¡–‹…ð¢ðcV¢2l&þûÌ ^ÄAEŽáñ;KíÞÃG¸Ž›¸C« fa l,SÙ\¶­d!f¬‰­bëØÓlµÃìÍ‘‘®Nµ+S&Ošh›0>mÜØÔ1£G¥$'=˜cµÈ’à .¯ê )º#¤Kµ¨(ËÐÕ0 „G „t…†|÷ûèJÈtSî÷t“gÃç<ÝžîaO–¬Ìü,—âUýœGUºÙŠòÉ;=jPѯ›òS–¦’HŠÝNŠ7­É£è,¤xu߆&ÍòÐ|‘ø¸Bµ°>.Ë…H\<‰ñ$é>µ%Â|ó™)pŸ7?“H¬ôÕãÕ‹UAAÞp^Vðzlv{0Ë¥³ÂZµF‡ºHOrš.(4—Ñ-…ºÕ\FYe¤ƒ%âêÑ:»“Qr&Ô©u᪀.ÂAc§¾Xõ苟ù[Z–«›ý¸2 Çv3TN¡$Ú)n÷x‚Æj£ ÛGºÛ„æM[¥ª¦mWôË#­vã Ò¤Y®ÒŠ€X«ÞNÅH£"`f@“²´l"iŒi$\¯z‘ÐjEU©MÚêmÖMGÅFûñ %îSÑ?£Ä«h•Õ®/°©Á°gbd ´Š¯»•âû-Y®HrÊ@¥#$ ‰#…úa›)™î†D¬‡JÍ Fj1]©UˆI@ÕyFžñªÏƒV›GnôUtÕ/¤%ç!g$«ŠvtÔë×î ŽX2’oÃã2|äÈ>$ëN§ž™iœk!m-1›oê³³\ôRµ%YÑK©d( PP0?›Jn·»ÜÑíF )z{y`@WPc;w¶3¨óa鲤ú Kûe8<¤Òq>ãó&Uq ÿ’’ÇŽö6åëlìÿ1רéúx•ˆ$gheGXë°9BZg¶ÆGWQÓ|ªâÓBZ¸;Ú^£*ɪ)-ÕZ¼¡¡”º£§;lº¯3¨'‡šÕUŸ9PÒåjiùŠ€âÕBCWbta@Øø Äm"8ì•gzL-Wî]¡o¥Hoÿ{±“ûÈOˆÝ–á‰A¤b³Ô ]öÃ/zPnéÂBK3ª¹ü‚‰4чEdÿ6ùVó.,ŒYOþs…³¨ŸF˜DÈ!,$¸iþ èwÈ>GNÅ4«Zz`µÐ?5ù=dôò”K©hÛ£ý–T¤ËþèU«3Ú/·#Žæ¿Hëeñ>|FœÛ¨Ï”º°WBôå²Q\@gÏeÔ/¥¾ˆÓZ’¹¤;¨“‰»Krc õVZ;“ƧKN”JÍÑ{$/ã=H§|VðvÌ5çêŠÞ»¢7é#v´è‰~bÖÉC’Ÿ]¢~%ñÑ̼r¯6rÊÉàopúRGƒßH?û IÃÜ>f“÷ÿL&.Ƈ镴×K(oFH§sR` Ñ{T§>‚ר7«?ú’Yó.äg‚°ÝÕYtaÍã—OÀiÙƒ’Qw'Åÿ—órâºÂø¹wfwfýÚ]Ûk¦mð弘Û]øf4á½`)÷§Ü¥*¶;ÏI ßÿ~ð&lSæ«ÃØÛa¬“è1öc´Y‰öët“L{ÌsJíÓ°÷( ö*½'©€çÀNpŒ‚uà[©rÓET(‡“¿bŸe¿aÿdaÿà€}šm{b ìãìg);[ð±P æ"V£ TÃ&‹9fØoyžS}ÿØoÒÊ>Î1ìø¿\ˆ~ñzÙ¿Òmynð‰é8eÿûššÓL娿øJ+æüŒ4“7xîlËZêæ5 Ãg‘ d±Í1Š˜T5q^àØœ®ðGM;f5Ž‹‡Ô¤{e¢ßMv>AœÌTÎ-ß35mß);#÷pü³Â·¥ŸÙ78Þþ[µórGzÿÓ¾‘VÎMéýáXäxJÍu9öõ²<™ü«>9Á9×ýZrB;—œP>JN¸-°\NNˆëɯ§ó®ú>=êÚcǼÜÛÝιuÉ›éœëz™¾dû=ïüÒ…_’¼N×B"­–žå|«©”å¾@«íö(WîS³Ò½óÒlqz•CTo—ý•ïRö/ÄõÊ2Ä$ÞQÞ¦°ýÞh–rœJÔ/"G·R®²‚ÂjòØ ªcU*(¬üù°~vu¢®±RGK°ï!¬ñv9¿ å2;ÏZØŸ‹X3|ÚÞ»tlï´’7õƒXÿy¬éMÛοæµN;£–q[w†c/ýi"õÕÙ6ã÷œ6޽Rvœ²çy¶úÔòh7ÛÊnóWÊòžâ0˜‹÷žÑI¼ÄÀg}ÈíwÁn—Ig@-a»GP¾&}v"ϼ#¿Í§Z1N¦4âùEãÉ„,Ž{2AºfcrV¼+h4¤WfÑf|AåBWBý)ÍIivJ=¦çÀfãZ÷ny팸EwÄ­JêöuK:‹G2…» c—ÑgŒ‰ éUŒ6#btƒªw—·ÏËeÅÛæx»¼ƒê€{@“ïíµÖY1_Ä>¾Šùff¤ÔØÚVjì,ÀL³¢ï³FíñѸ¬·Æ;ãÊÀú¹ÆbŸ—Ƹ ñĸô6|Aܦ ¨&ƒÃ 4û) º§•Ž€„]K¸ú€DëI´žÄû“ø±4‰úIrM•ޤJUŒ4i—ÂâÖéR,¡¡ &H€ pͱšRÊ8AP L»4,]øbp¡ùU\“öOºâ³û Fq+Ÿ¤Cb$`{©¢¡JÝà0ˆàFS•Rï%À¸&Õ¸ÛCgq+ìNî €;-—<–D– LQH€ û-.•T Ð :"I$OgµÁ¿HbQIêï€ÀUð H]$Íy}ÙFmõóJøJôŠ>(Þ=ð‹òÀ†bcCg±ØŠņ&†Ô‰¡ä¬j(÷hÄÀPé \à  û{XO½R+è ¼ªª­Æ¨}5.úº¶m 6ÜõA—¬êªïz§KÙÓYi¬ÏWÖ‹oGÆt2±_¬_îŸè—c2?>8Þ–g~np¾Ñ©1vÁÈ<£ÖˆˆªÈHDV¹«4IK—"€sýºÙýñ–>Gv;²Ë‘Žìpä9GºÙäH‰#³)4·B ®«àgà§à'àÇà<àwßß#à50 ŽWÀÐzAØ ºÁvÀý·Ùct†üŠ#/8²ß‘^Gzévd»#ÛÙâHÔ‘GòÉs$׿#™f-ôxœ§€FÁ÷Áëà›à%pìiYíÉöÄΉDhL4Ù×:óóZì¸Û¢Å6i±¨Û¨ÅÖjŸÑËõ ^ªÏÖ‹õ"½@Ï×suŸž£g麮»uU—:!™ZyJH†V5†¬D…6­{«*ÆDÆ—×Y®ŠFaå†(´ºÑZ\‚¬´j+C–'¼¾ý”Ç;PjÉWÆ­ndžqÑ‘+wIû82ÖÂ#ÇJX·9ÖÑA•ÿM݉PøœèbóiÍøšVYZ…Ç?Æø±HÄÃ4zöhtý‹~ü‰[;õVóöU²ý”NK"Žž–™˜z´¤¬£±À×ý´½Ž§ÊŠ•œA²x‹2+;¬¬ŠF+pÕ¼†y \…ㆫrPìMUzª¬äŒx+UåC±¦¤ÑÓ[yÊŒ4G­Áæ£Ö`E“3ŸÞ}陡žŸí²ÞžÞŸæ2Jsý~·:{N^~¾"ŠgRóùöúÝù(Wòó÷d>Ê„êÒ=™Æì⌒Q/2É@A^®7';«tάŒ¢ÑœÂBéóç4·"}nMñùƒþj¿â÷2rÆÄyÓ_˜/%(1 Ã…²°°,èÏ}²jC]MUaïu~ÜÖPU]]Ý?™®ÖØ(®+|ï™]ïÎÎîìcvï®÷1xÆïÙÙ‡7k¼Þñ ³À1ØÁÁë˜:"`!ŠDy™Gl§E„¢ (J ¨8<”FB-j¥¶y¨%mÚò#¶Q9¡Š„ª]zfLªjöÞ;{çJsÎùÎ÷3ú€Gíó¾¬qÖÃLKã^þö῱ðpâómXŒù¶wGÝIJIA¤¢B”ÝúÓIw=†ƒXš³k§?ü¼€£•Ÿ¯¬l˜Yó០•»øjϨ?áã•ú˜®¼=]Ù_ÓÇ4­ü€ç¯Wäc¦ùP¯æ¶26!v!ÞAíX~ÿPóT#OÄ÷ô{häÑ<ÄãYä×½™,ÎÏ;³Y¾ˆ¹²Y5Ž‹Øë3™í˜—¯ý„H:åBäD¸ú™úå½qÕŸª7V¾:ýìgZbnÇ»•ò³•¯wŸ¨®Žc ?ÿë¿à!…ü`áXBK5ŽG 9”C@ƒ¼n[È:Ž„ˆ(M. z¿0#Ükòb±\.yßéîÀ¯nœWð؉Yî ®tJ’Ë_UÍm)ž)Gÿ>Ø6ðRA ‹&Wë¡(ý»Àç—O}3ròûÇþ㯙֧.ÍaúâѣGb`éš ?¡ßC,Êj9†‰=o1§ªNËyÄFØ8{™½Ï2ˆåYý„¥Yáƒör{ )Æ¢ƒîL:l§èŒNá;gð*õg*MäsüûJÙJ þ­“beÿ»!&š,_mâ÷ð’»0ïr߀6OàáÜ`„‹s×ÏÑ3æ¸pÍj¥by)å"€·ŽÖLk:%·R­É„l6™MbL#ÖPV–m܋ҚÞþõ¹.n”ã¾Ê«ªÁTJ ò¼–nήžÞš;8¶&L^ݾ>ÜC¶BWäF±9“çÑ ü¯k6øìeióMœFvx” <¢™„φW†0#¥S`‹ü$^r.¤(Lãò—˜`L¡Ÿ3es¹pȱ(Ì›ðžï>úŸÅä@1M@Óf–z9b[5ëYëe+cµ:ùÒ¡ü<$§î™á•þŽL+¶äŸÄ{´£Ù…ýÉîhv _­®átvWþI}ü º¥hÞ ‡‚0|6GôFí&¾Ž(eRKôt^Þ ÄÅI,Rýʵ˜7ë˜}t:È4‚^%Ñ:-0ÌnfwÇŽØÞ²1Íû,‘}‚…8ikXÆ2tñW9ukPïæýˆS8ÂÝ™AçÐt }Šî#ÓY0MÙYœ/–K|¹¨3ŸçÁ;Ttë^é`„.ð@´c1ÖBd©ÖSƒ“ ýYZN§Zˆ³cÁçÍr5Á¦=«Zž,^9&ù‡C‰—k·íܼƵSÁÕMÍZ³ÅA•ΚÚ! ü=úBljî‰QÏÁÊg_^üÞðÉÚָ㽧&ù»§WÆ7mÕ¡7žûñŠPág÷ú6éL!3ù7S‡úѽ›h~¨u ¤·¯°‚FA÷ú†õ¢)†¢𸆥á a‚6Ÿ[ YeBö¶î|oFͶ'¥†8¥Ôå3Z{§ÿ u£$Ì*ê†YA&˜í(cÜ ØìвªðoÜ×a¿Ö„^‰(qESv(û•åŠò©ò…r_±é[ý°q_aô3ý ¥(;¥öÛëA;ßîtÒýø—ÕÿZ—@TòÙ<ß΃ Â6dš‘e™06Í}”àñú¼ºÐ˜Å˜,‰1³©Ëf9f^ÈÁœ–3 NôËÀ^ËÆ=°Ï,É­Fšžfò‘<”M 9˜ó/#¤±imÒí?åd]¡@Â&¤.]ˆU I)ø¼Á}ë­ýË)_3(â`ªíœϖ‹Ùšj ÅY-l-„_'åµ±^–u„ü=Ëß’«RëÉvÚŽE=aAŒ©é´IŒû3ÕM]!@UFuŠYŒ4ô­‘S¬*!nâ!K’Ù”3a±3< ¦Ô¶¶@Ö2ÅØ˜²8{Û¢N% žãm¼)í®f—“ µ-¡r ª/G†¯çx^tø°O'BCCºÛuZ$ºåpîN\ÔÄ~qLÜ!îgÄsâñ–håE,„xP†º;_t&~Þ@˧×/?(a'_ÒÕ€oׇŽëcLºU¬52/€$Êf1 t|R-À!Ñ€ÌG³¡¾Œ/øä ¦&&j…¨¹Çå£ýRÕÆ·µãÓ‡Fz·iþÚªµâÅß]ù•;°òÒÞŸn¿¶emÆÇp]cå7J‡Œž¹é ;纖¿Ô£©}+C†ýòd{zÙ–K{ß%4YÜÍGhºÊÌÇ_BJÔ~À!^Ó¬Õ^̲Nh¶ n¯GR8•r†¥°€š‘;5³y_ØÉ„9ŸŠk£ÅLØ!~ßãùHŪ®6¬˜ s[Øôiìvñ¬Hx8øN–'‹åIˆï¤S'ÀcÙáK úšT’°õßÈZ¨§Fù± “ùqYу¼PdtZè’dÅ«kÜ×ru#K^y./unxõøwö Sï<[¹yu´½­YÒ2Áê!½«gO_ŠŒIÞCkÒÚè‰ØæÍµÁWÇWM~üʦ/NåëZ¥'ê–.¶º—]ܾ種¼*(ï,hÐR4Žh뺓YoýlœÝÞYYÿÌ𺧇×®aÿÿ~`tôYõȲZß ¦[Ö­¯JŽŽw‰’LõD˜E1 í<Ç nÎM ]h|*¨Ÿm˜ƒE³Dz¦PdŠš‚¢çÔVa,$AÝŸH·¶esyªSƒÖ³‹¶šÕÕÿe»lcÚ¸Ï~ÿ{5ç—³}w>ÛØø ÎØÆÆ/Àu ¡ …BÔ¨U’-dŠH"U i I» Vmi;µM÷i목(MhÖHm4ÑnU¢4­¢IûÒHYšOcɤ$_2`Ïß6Q*Í/œÏw‡uÿçy~Ïï¡LCÛúlÏ—r¤q|×F ú!ªÁÏó.F¹L¦+—C…Žm¨O›êz~ªï2ºwQîêB|øÄ¤LÉàDëRpªaÊ/ãˆzL7M$xÛŸ\õßô?ðS~u…ùáÃÕ @Ú#(óC ·~BØàeyúVÊu„ìË>ݯ0°¢Pêjùòµ‡«wËUÔ‰1øÌYxƒ{! v‹ aÏd.¬¬`·-0…¤‰ ]8ÄÊ §'¹ß§"— ¥2ì&'Cx¦3U9Ái‚çTñ†K(ÉDçY+>_Èbâb÷äÒI%©P¿J{êš(hH¢±VYoᨡød÷èþz^ðÀש¿ß¶Ëê’=5yALÁaŠTâåOÙÍë°œ†Hdª ÅwÍÎ~‡[ß{ÝýEÙ™‚3Äi/ý—W\†HcÑÑíÑÞ£3uMµ!3E¶ÖF"û¢m©ÒsƒPÇ ŸÑ ôüiìŠ>^Z”œ±£i¸ªº òõ0ã#vÂ\)•>”a ‘-¶ –jœ—í]=%ª êOóÛiG·ùûüOñ—‘KÆéq$ÐíÂýÂF*\F³Ëƒvd·#õ2’5Wël1a#EÔ[²]²8\*Åz{bÃÃ##àŒ;–  XÓ@ êQýc56[Œ-ÅèΡU<׬fÕJ®TRwÄJ;\{X><1 é;1p&mæNuìèƒî•ÃE\µ)Êê@U(ThÊ=Ê ¢åò!1UN޲/b2É{®®Q4ŽsNÍì}1¨·^D'“ý épÐIê4=wþ'ó»ÒÍ¥¾¨ÍÍ..ìKÅTÔ xÎ@—ã íÒ²p/ãaêúÊ+‘Ð&¡æ ?Ý#˹ÖpOÜ>Îl›}ÇÝè 壻2±ø‹öoX¿‹ÑqÔ.{çë¢.I4²…g(ƒ ×N¹³’l3Ö½¿<¼þŸSç>Ôò¶Ú–Ÿõ^:ƒ}q ¬ÐQ†#:‰šÍÈ z‡Ùm—#Ö¨%ƹ\Ž€Aî6¥5T)P)Fg ‰dBm©WÚ0¥Ñ,I{ŒK’¦ÛÀ64‘Hz“ñ¤–¼¼ŸÜHrB%q™ˆMøIÚoTn—Πr| é¯ÙóD> ø½ü¿Èß„âñd~)OæqZã„7¯V¥RÖû.¸ØF`Y q%l³ϚMÚËMQLd@ð”³é8‰áËŒÕ0Ä9'–i‡=Äg"+“JÚ}ôõLÄè "uªÁe¶È-ÿµÔö³9‹ÑImý7ÍŒé¥ößÌ´…͘ó \ ƒõ´"`¯ûñÀÞÞÖHþlÃîïl³Ge +÷ ú%úvÆ Iz†dIŒïKLÂ̳bq8ÔHäˆ^`QÜáGÿˆ—µ“½gÐéØŸK_•þa~ÔÆ³ÙbŽD–‘ï-•P.Ì–lÎb¹LRÚK%$Á—'ЉÉ—P)O !–ãºS³ºîY·ŽA+–h9äɨ™ÎÌ`†Î\ (O'ê¼j¹ ×{‹ñ¢V¤ŠY•çd꼌äÇñÚZ -…¾ ±!'>8­ 62‘ÄúW‰¶0•é‰ùr,æMÐ}V`c^)¬ ææf(†é ЕfHï²R‚¬w£§1” U*$“¶*™M±ÁaS,[ÔH+"9v84ùÖ‹ïýu´©ïpZgÕÉÝ…¾±þt0—°ÚG[ÿ>'…ÛþÁÁCévsK÷«;öL•®‘GÚ?Þ’_˜*]<Õõº=ÆäG ÃÚ^Õ5%7ú«ÑíŽwwoCl¶ 8r ¿u¬qýû¶mÓ'Ïܽõà,®œŽ;Ôk`9]ÄAÍͦߎˆˆæ;í™D4q6ÍhF’T€"`ªdÍÁÖj Ń,e?¿5—XL¼ŸXJ\MÜL° Èù*Q*@©¨´º†ç41¡Tgª²0U’KJUí:Q(Ϭ"f¼ÕËKù}—Ì<ÓºÿÜ+Q騵¨5µt.«9r8ƒäÖúUÃ%×.ˆSW¦>[K_¿Ókt‰V ÏIáéß]I[‹ÉÞÉRûÈo'G2ÍîQG)¶ ÞNû,ÛÛ¶öÏ\{eý»õÏ¿üæÃ!ì‚Ç6¨}„™ð}ZJ6Ê&Y5ŽšF–_PiDs–§ž•¯£^wÜ­¹)ÂmvãGÜŒÛÝàÇ+…¿v—è\휀q8*–o«‚ÓòŠ•:/'n`™ô1__432\ÒÑÞáZè‹;Ž 3•~!Ô(’ߺúbcí=ÛHWÔ¾>–u'SRØ&Œš:jõÛ3Ä úý.Áã´o–=@ ‚N24}€"%0ð–e±Ì²— Xš"PÏ­Ë ^heêDá_ð¡Ö:V³À0hÅÍöèü«+ÕMK<€Z‘\ƒèO>¥·üwš>®ý]ûãúÛëoºACô ê  Gø4‘úˆ ?âHö ì{9òkq°&…5ø…U–D¬—ë-ð>CoÁÿïɧÔï®ùñƒ{Ù¡þÿ½°ˆXfHîÐõ?¾Ë-¸‰ëã眽¯di%­$¯K¶.^KHZ[²- „,Û ÆÀ8Â[I–!áVl| „P¨1:¸´ô$mÚ’Îô’’¶0¡4¶<0m‡)t¦™Ì0mòàB'­g’ Cûìž]›¶O•¥µv%Íîÿ;ß÷û(„/$Ç“€&ш£Y©¸õ«ùã€NØÁAã׉©O¿B~g©ãüRǸîÃ*X~j?½@…ÁÜmÊD™%V²ž1}ÁL›Ò°=Nç[ãªÒ¯ªQ–?©²¦F“(ŽGU1UYšžŒ«b<®Ò¦|¿Jñ}b4ž#•ƵÍAŒÌal_´€Öȶ¶öU'•YåšrK!°DŽå£_Š"Qjh^UúÙz“zN}Uý»JòjXUÕ’z@¥X“JŠqH·ÆÛ×fsyõ™/Bh­ß®×³F0 ®[8Ç@H™2JÏzìyÃ÷° VVp}Jg¶®…ƒçÓ Üñ§´®'•E·G ß=üº†2&“¶Ud¨È$ë¡kt;üž“q»6¢Z_wÈB²ˆA,ÁÇ ñì—Íf~Mn³æÝ³)Й|f÷+ß•ìkÒ'&SÓWÆ.†¡½¥óÒ·¾þpæíšîÔôW{ñóç»jõVµ•¦8›Û™‡?îîMvš4!È÷S&½¬Õ²‰Á]Éõ;CbÌwc¢§Ð[Ÿy’Gè#zâìè¬É½æÙo¹žì¨ßp¼2ºvk’;vá€ý¨²ü ¦â ^ÊõJüýšü¦LòüMë»"¬[òоs¤îE¤{>¶«¾ñžú8@¹½$IJæ9Aš”nIÄ5 Jóðöõ?†`èø àq-`6Á‹R'’J—°:‡)cL«««õ…â7îmûOxêsÑ)é5‡ ê@SÜEÞ­i±ÃÒèf^«žt’áüðóïŽ3$GˆœeýŸ¿wìþ–éS]p¶¿OÏ—s…³GŽ~éþ•Âa5Õ;ËÀæ0áQ%/¼ñÛc0 _–ôtŒc_\ Â  €›¹œäöhMšzC¢‚RŸ„B-¹c³€J wÉ¥ ÑS•µÈæªðÓz"¡ý+#ìúºŽT†È¦Yž3é*wšÀå¢Ýn:=œ\7œåùd¶ÌéG„dÙl¦ sŠzñÝ|—Ö¾ExüdzJ§ŒÅG‹X¼XÜ XØx/“ÖÛäÓ*‰oæB×â¢.ñ4~2JÞ0 U?µCNÉU(Á›N×MF“´;E„•¬@Fft93>¦“¸›ÁRvëŠÆµ'‹:ÚþhªTì8Z!$¡…i¬óEüt \wðÿËÞoï:}úÚýînf[íÐ=ÚØÞ( øW¨(¡žzNÙõBæä_Û3L²B½­Õ ƒÏÀg[ê,¸bÑ ;ìIØ»ôñëw–Þß‘å„dpýt‘½5W.:«—w͵õ9šg»ÁI¬ÙÀò25B9Á Ü’3í)íÆƒ”7Ww6Ý„A=|ø¶·Jš€Úçá¹\³¦½é‰ô‰4™¾Ð bBl46#cäã%N#‡îU€FöÎÇ9‹\íî&+Únm'K¢Ò<,æøíE›U2YRb7w+è‡pˆâý6†;r ©¦BopÃÔÁ±&?;ý"‡v[,)«Z­ÅTÛM|v;žµ¤&S(•*vÏLŒÂã¿>sxº »Þ†±±ñ Þy{CyrrÜ_žÆûo?×ÕpBxlÈ@x‚}ÎЂîwÝÕ*Œ—§]Wo·+醡¯±CƘÔpöá³°].è‡ð£¢?piÀ_½r¦"èܲZyzQk€nÑ }º#®Z£A·n§áuÉÎ.#üôÐýÿ{†øTC† ±“ÒV C|ÔÏtt®Â2§œ”ÛåÕÊ¡txp_àâû?¿±þˆÁ[ÇY[Ü!I敟%d¿þjÀÂÕÕ¬% ºŸ4‰‚ùqö•ÍDõ¡?ÛÙ›ÈG½¢É… *hïnN}òæÇ/] u¤÷µ˜ôªGAñ¢É‘îpH”“ M4‡¬¢ï^ˆ6#$ÊýQ…Á"gIé'oÌÉëú<„ZlÆV¤Á%Ä+n;ǰuì‘Á÷š-N§µ½÷(%›çWÓÏðäŠ6‹ [È N½>uœ²š0–š$°b3ËËäUªu¹V»«&˜ b²šÎg¶Gˆò­äxn_ •@¬ê²y‡ÐÐårAy!ò—3º8cÙj¹ìš² OÊ„¼Ø¨94šÐ€6ͪAÿ¦íEbk>‘Ù?NíÔ ¦5Éñ$eª!ÍzòÚí‡Í¡ ß°ÕïõŸð_õ“þ3]¾±Mœw¿çþßÙç³}ç;Û‰íıãüwbÇ6Nm  4Ä [r‡DP(BiYM!JIBh€-QÄ:¢FQµl…±Q„D«®Z骽Xµ UÛ‹7Ѧ½`Ú‹¬š*öUŠ-b¨ÏG¯ 0Þ>€žðTŸñn•?…+‡¢‡Ü,öËÕΙ“ÿ*LJ-rÝoÌ!‹tÀ&›i[Ýæs絨É!ÃÑÛOÖìN NE)ÊTIJK2±>Τ–5¯[ ØL¹Ñ_F’ï’óëD¤—ÙÒEÉ‚¹¦ŽþçþË+ ×b!Ít'e†v4 ¼ÞO½VŠ£Cƒ$„•Ucov¢ƒ<ÃY[†!ŋѠŸç$-z'S—X¸[2›q‚§ÝQ€4‡&½OÿMݦ±AìƒL?èêsÚ¯Ù(¨¤×/Çs-þ\]‹^§75ÉÔ…áÝòpÇn¢ƒ‹GZSÞ@ Q^ÍŒDy&“«}Õxu¡<ßzìÏØRÖ9kê·)üQ ¤¾ý¦ô °×`Ø?†EÛ GCCKÐ7Ï10¢åÒMIMżF»z&Ü&ÛŸÉÃhT†b­ÆU¢ãÖÂ2f1jÚH£"ã´—@žQ( cg꽯øÚrÛ?ZùjvKwPµR° ~ÝÃàðð±lyå϶™€±õS, H¾|ýo_œû}çÞÙʦ—#Ÿë¢Üxê!ù…ç!QLÁ»)äY¸þ— ëß¿ocÖŠ¶£‡C"Ç;aÛ¦-.šEñE¸í& ï¥Xÿ¡ê>È•o¯¯Û´843}uþØ­ÃT;¼;Œ£?€Íûwà'™€õhò5X^¸~>’kx-7Ûs%wñ&2Âtnö§KÎ\åõû0Ü–°Ðr×°¸4¹ôh‰x´––>o€%¥IÂtHߣã³úEýcN¸À=ÐBpqQ^+NX††°0Ê,ÃHpÍŸDZšÕR;n­¥ ½ƒË‰ôP…VéE#À•CõD6þ­áCFuŘec­ð”C5>¯ZUå˜ÊN7-P.žtYl•8±C¹E¢aªº¶-¼ëÚŽÎW»#ÍO;%Æéßµ9ÞR.q›w‚1¯½&ø×{[wH” ž: ˜ R5 e<`ÔþºáÝg:Òó÷ÿîmìNØë„,Ç1šº óg|–ùÏ'mKbm˜ŽåÈ©©·æþ’L§_ÐåýÃÅ¥e9™Þ²u@™{×Ôó£ÎZ'Ñ—ËbGˆ«¹å¬Þ­÷u—îÓéǯëËúbîų‹ì±#G³â€wvŒLÍr}?î ëwu\¯ †Þ}˜¿|e.šŒ',ìœIäe§‹d–EÆNb! χÙìѾåe«˜ó… XáBž‰jq†1ŵ„I»œOä)Š»Àå®G]8¼nd”¾>q<=>:~cüÖ8uyüÑ8~cŒßfþÏtÙÇ6qÞqüž{?¿œïüv>¿¿‡Ä& 1BRî(Iì,%¤%!¹Å"!€ó¸Ô„@Q¼Ñ˜JëiZ%ªIõF·?ئ14ZþͲJ ­Í¤¬ÒX5þ LÝŠ¦i´Ú¤‘îyî’¬gûñé¹ßé$ûûý}¾?îã‰Là¡ 0q|€‘P$?Ù·˜úb1SM1™ô S Ð™põ1ÊÏÖ)µ&(q-çBÇæÑ*µäW£ GËËkïGÂS©}ôꔘškHœæ< ~©uHóy ~ôÔ Å¸ffH¦Z]™ÈßH‡îÔê¶fñpêç.èñ´±¶Ákë¶Õr¤R.zRÆÑºÞ Ä™ÚÕž€0h<ÝOèÀƒ2ÿ‹¢¨>}xÓ‚(ûn«Ù×(3¢ýù×^>Ü]´X‚P^b­8JNÙÓÛ#ÖrÁî ¹q üÿléâæÓ}}Å+A‡/ÂY—®a/a¸°ØŽ“Çõ#®ï8‡šV È䦨›àÜì…’8Nú³õQoôú¯üä/Í}í[Ü–º‹Ž­ž¥7“mÁ¤Y”ÆS>—Ŷ·S€"€Éä%'kñôñVɶå¹,Åí<ײÎmç3¬BÂÊ‘4µ—4Åëw^¸Q“í‹?Ç­v7IsdÈn²È°iÁÉ@0Y<6í¶r´ä简À†MJ’;34*;Ì.§‰õn GDèÈZŒ¤lTÇþ­ÆNöŸïÿ^ÿÕþwû©ÎN,Kuf÷‘½¬ëÈà:˜t3(áµv8ØûQ.®µ>¦å´ƒì‰Áò`e°:x}êÌ}ÙÍõ)å`»™·pëñ“ 6v„ðvïBm±ãàÊ`ípU0®<¦€G7ÒÞ¿ „éúRê}¸†Ý“kÍñ½Çû %‘i6ÎF›'OŒÔ¶þÒ•‹fA±eMúHíÆ,hðI@óŸ}^ö`€j'H ‚rVÀV”¹VåiÄÿmÒ×ú+Ì\pÁQ`ÒÕ§Ç.Âza%ÚDy ƨø í6„ЦZ+Ó'cMQÙãaV2yÞ|c¼c2LÙhÖLÇ_¦,¤Ñ q7Òt Uùa®ÃMøÂž a$ºf w̹ríß:b£­¸Æ‰ÀâÊßÞ7rôÁ_p ¸ÕDr/Êœ#Xs@²0TF,ʯØÍT³Õ*ÄÛ6mÙ-o\‰9¨Ü¿?Øù<”ï¬@Xh‚f¶ª¤ØZJÆ^Á¿©~\Ž*|KUOU®z«¾ª¿¨«¡j¸1W£Wcw¤;ž;òï‚oÁÏzÇ¥EÏ¢¼è]ò-ùS=™0ÓÇäCðŽ×*RÅS‘ÿäe*ÞŠ¯â¯*ÁJ¨®DØÅÃKG–Ž.þ0¾8±8ù—)önéÞ©§ïž^:´4FÏû ¡…ðBä^‘¾tlÞ9ïž—æ=ÀçÎûXUR=ªÜá½~5J—¥²§,—½e_Ù_”ƒåP9\Ž”£å˜•›²Þúê²:›š Çø© F#áP0à÷ye$ÅÚJêäÀÔ¬šÍNåF¹Ü¨<35õy þm1yæìÌÔÙç¤(î×3fðØÌ¨œ¤šÎwkÚ¬†°½Ú~í…IÈž²ö2NÓγm?äHkM¸C“ð»105K’£3” xw)k ड़zìDzØ(xt3›ûEänÏT…Í ³ŸÎ³¥³ Dñ%îþ ˜Aiã¬n©³àoª R½Ôj‘"P Û =ò:- £ä…'ùÇŒ3DÃ$ 0È!_Á8‡ü¥_šã,BY0ÇŸ[€ž Ð}=Þ;¨š“£““?‹%á/’\/Ò€ºÌ#,Ï¡Jt´éf`)±k@0Ѽ~`ù¢>žlóÈÝ}Ï€tŠ2P·Ä z8 ÇÒ)Ãlº+ÝmXã@#E"ÐÌÿyA `0Æk=½Z3pÂ'¸`Lª#ÎEÝ« œð xM3¨1ÙD±æó(³-xëÆø³Eû>’ó™\[º ³¬‰‡ét¸µN$¬„ Žkøîøî%»ˆ×µ7yaÈ ò?œ]b÷YaOÚ³#êàH À¿?Ä2-ÃM;^=&1íBÌ3ñs9é¢IY &È.g¤ë²oåçiîž 'Ûsx6Ý„–†‰×Œól³ó~gжòQýÊ¥¾o œ‡O ¬Ë%YpÐ!˜Ùø@D.Ü»OœñÍö÷FäàJÛ™LÒÎÉ4 výf¥vå÷Ïí’,]À†xÀ|õ~…’°¸¨–|‚0úÕS*å´]Qê»QO26êYj7ÝNuÐtZlÉtŠûE2ÓÞ•Ñ2DH:…Ì—â3Ô}ßãÄß3DA|ëä;"á$±M$xëÄ2„˜ŠÊ‹ßèîQEžÿ<£:3µ_V4õØû«ýÃÐ9ü Aãı!P£Akj|¯186ýÆôÛÓD¼Ô*Éý¥ž‘RA†è¸É…DÐ"Þ‚F¨Q%¬t(û•+·”?*Œª\Pn*Rù¤€•ŽsBhéA•–ミÀ'à.€¢Ì)áKhšå§Ãùa(󣽃ïÁÁëѲïÝL¦Ðƒ¢–†z1¿v±I¿ØÔ$*ÆEtã:™ ½ž,+“ftÏ=óC·7kÐ4‰¹s @S r¤¦›¢X/æóŽÚ”ŸT3ú °µ¶‡<1(¥é”´ªkH( 9ô.L#Uî€&»ÈÈLKh&X\sÍŽ5ì™Éþ@›dÙaå¸IÆì|k%¡´i °ºº¡A½¿ýÔí’G5¥H‡‘jyrú_×Î9t•ƒsÁâ4W{žÉÚðµ·Ç)‹ ~;é á({ð´KxÉ;õÑ ¼vïéä—Oÿí²mâ¼ãø=ÏÝùüzwöíœ;ñ[ü’Äv|‰;9Ç6y#‰Á ‰ãC:B;JHŒòR…¶ŒmméÖí ¦µšJÛµ”ÚµllZ×–N{Ñ:‰UUÊ4•ì¥cÕþÁìyì õéN¶ï|þÇ¿ïïûý|_Øp\̲†í!U*Õ«8•C¥—T^SîéI»»ú÷pg<¨î¢þç¹G–¾Sý–Û;t|b»Í,² ¤ÇÕ”Õ¨“h(%Îx`àÝíV£×¤#HÌÞ½Mÿ›ŽvT;&3ÉYóNç³â3sâó _Q¿Ô\3hgá¬ôQŠl¬0d¤Âi¢½‹½P>ÉëÁ=Ð_vŸümÉep‹èá¿Ø·†4°†æ»Ö·†I‚( ‰4)Ç(4žp¹kÿg'€1ózË­ CŽag³QÏÑ·®ºb3KÕcÕ§FºCcš=†¥f3|qúqw2Ê@”è­&gs)ùàå½:šd|Âï>2û½eùôc¯¼Uý´ú NÍJTze"|0¿;Þ±åê[}zLjû˜SŽÙZw~þóÂIAízþe¼ëQ‚ Î£6¶…x/3½¥,ÞÒ-JƮԆŽRÂ]QŸ’ÎJ¯IW¤ëÒÇÒ?$†€tÕhL©‹ HÂD1]L©û¦ SPìè"eo{”´´üCéÜ9š€°XÚo@ÁÝf´˜û ÙKà³óÄòhZÕŒÁ?7::”‘—Ãs™å!¼w“ˆîî¬âB´¶ºVFÜfD GŽÜk55È«SÝÍUôÜÚÒ>Ìv±:óY“<„à·&ä:²9¡YD¥³þ¿õl©ƒ€6/ B·õêP¿–¢–D83ºt >¿ð÷Ý~eeD8š™ß¿åO?J=¦üÜT*¿!œ)Œ6«)¬jU¿ hÉÐôòC‡÷ A *}a´ ¤Ž¡w` õ›104+ÎüpðÇlltÈF”“óG,N‹A_ B¬}âøiW·ÔÀrvŠãIè`5‚(Ø ZCS7€ò‰ÉábX¬åq‚¤_¥›‰íÈ«‡3ïZ<€oöB]Дå dΛóåZrþ\€6yM>S‹Éo A1$¶ª}-þå o)9QQrÞûÁÜð=8.@¾dÙS±ÁÒ_²ÝWÑðƒ 98h›–‹J±[mAÄoƒsʼnâ´zбN2ê Ê•[˜(,ŽîÛ¿4¼wÇØˆÆÀiIµH2¦2!TÆdmeÇÈÞ}3ûç †íÂIÎõ”ëŒëmÕäÚì‚.WT[X™ÓF«•eíºßÆÌ޵€v¬.‰ÞzÏŶÉzµÅ¨_¿JÖ¯¬_t⟠?^ã×£,׉·Önq XÂÕwD½ Ô:-ÚÍH6,2*«HNLÍ`ë^Š„ãaüž.¨Ìÿ ëÈl­='2-tºQmhHZ»ø:à໨¼ª˜IÛB•T@ATV{ÆíŠ…¬ƒÃª®#Ë+ï}~üëz1d;ÛëKµ7¨€]ì 6G¾¢ë±óî±mwLtn£$E7¶oê¦:ø‡€M÷¾ÎV®F-çžôØ|½m;Â.$Ntô³NÔ°>XŽï©\OéiºW§Fv­Òxbç !sco¨zg—Çl4 ©0$ÌúvüvÞ`†ŽÀ7ÞÒ!( #¡rú<´Ð·h÷‹-œ˜ØÞˆœeáî¿Èë´ŒB“Ì<§m ÓMKº+ýûf'rfÎÂY)Ÿi -‚p+­ˆé´^iVHsz@™Rv*»ÓôåÙô¹ôEåršÖ*6åwÊ_Ó”OI(ÊHšjL%m!…¸ßopsDAE’ÚL,Lj§Š ú Ñ÷ÝÌû†J?¯¸5W6‚´ X([6ºÑ,RTê,a¶KàõŒ-œ‰Dø³§²¯e?È’D–ÏîE¯dé,¶ùaþ‹ò¾µdçýÃÉHVP]`ÈõkÉH¹Œ_ñí¥ÏbjÆä‹‚]ƒšP8PƒN»–Ò8‹ ÖYèq×y[ŽuëÙ€Úc½ÕÒŸÌkÕzJ;¬okÛ5¿?Ù}Qy¥½·Ý#„œGO|upÇÁ˜¦h8e›FïWâ+›BÕSON¬ÞˆnKRÿqìJšÌ$ vezzâ¦B$½ë¶R´Õ9îE5TGq:ÝѬ½.Zå>_øÞ‘>ÿÊÂK›ÏÜ0j p·Šü&Gˆí@ñ˜ùÌ #ÅHù!’4›VGÐZ}¹Åk/9º•¡X)å*¡ÆsÁASœüåüTEï¸b™PA‚ ‡©b¶¨¨ùùç!k2Û)sKk¸³›Ž·mÜ”%Mö—M¸Ú8À4a&fÁt†-g³›úã«¶™Pÿ*B·›?ÉùE30_k¯‡æ yGŸ2ñ³ær´üj™L•3eXFº}»|gµŒ¦„á x`89nþ¿h‘#e4ÙÕ:ÀõÞ‹—äúk Ñ"3¹år¬Z]Ø7úî#ÖZ!©Ç~Ý Œs/ø¿”5ä.]µN“ˆÉÎZÒÔ2}ãG÷v§²‘3Î÷Š_ûtõ8ŠiÓŠ*ØdSÔz¾áÍÆ ”žoUçœVš´°»NýÔùí¤=dQîh!C« VÓôÒ¶æÖ­’>lhJðt^GG9 j4~ ÀÀ7‹²M0þgÔЦüÒãÕªï¬ xàW­1NOqj«ÚÁJ¢Ðt¨À¡Ó.P&i±¹Ë¾“ÄLá½û)ý6- TúuffÀ·uââĵ ŠŸ?4 ™!ØÙÁ+%PÔ!†gâ}ÅŽRÜU™ì,vãpR™ÝI…ìÉÇÚ;uz‰dmˆ#Ä«m(¿X.ÙfØå†9¤¬›f;gäö7.=êÍÀ S­E ½þ¾s^çáKe+ù×Q}ØL“æwú.V€«V½®òØs qµÖ 'ø´ÖÎÇ C¬)t”üÍ À%Ee4:’µ8QM>ÜÛëJ­ƒÎƒ3;êôV Wät^£xx{½‰³¥ží=j˜‘ gÍßj°¼íðC`ú@ç°ÒJ>ßÿ3sˆ2wáˆü 6ås`•¼å´I.aÊCT¯|#qñõµ3v'gáaþáUa 9kÊj]¡òéÝéè9é?™.ÐH"gâ7줜ÈJ $Å¥xB’ìGâÃñáhNº!Ý([¶Ûã«Ûû÷~j_-x¶÷¯Ë“¹å%OÙòò¥\TÌ墷WW/ÙÑn—–NåÆðؘ½Í.´å âà`LÏÍ“^‚×ùÚûú'µAÁ.•E㉶#ù±Óã‹7n›–V šÂªfu¹q„›ËÎdg{± ÉúL¶‹Ë¢,Ȇ²ÁÙ°ñÅà[gºà²fn~åûÇ&ÆàïÇÀØøä4yzª·o(7»•û0G900˜["ûmí™áeZާkí@kï²Cü¡Ú†æèª6È ÓäxI¸M„a_ßTxïb·Á?ëÿ­ùý ýD–m˜ œÝ{Üde­,ù¬ ÿ€h’ ó,}‘wz¼ûöÉ?áí'[®Ê!$ömàãiŽ"¡™/¯ª®ÄïNÔãgÔQZƒÀi­lå.ó ïýMóÆÞ~¥t‚'ÇYÖ¤Õr^–ÕAšFf½YËP¢™þcïØ^%8Ž˜!») µ÷ê<˜wÎ[Y RܛÌw™²À'ò vC‡Ó^ÞáNߦÏNÏlÜ{ã;o~÷{omnNÙ’ÓéJ¥’_nïH§mS£©”-šIÍ$çœëë® ×úÌÆÌÆÔæ\2™w­‹.×úæÔÔ\Ú&âéq#ܲ؜.¯/™JŸŸš™;w~}cS¨ì:yñ&YèÏŽâsk„ÏY®r$’ gaaäjv){™ƒ—Ù®ž^Ô'Ódì/.àsyƒá¼ =QëLD!ýèÆŒÑvñU´ˆ—E–wÖ­ÿj}óæú&¹°E\@,áâ……mPó³ë×··Á¬l´¬mm>¨6„Ü!ºàÅweG,Ö}gôþèÃQ4zabíÓn`ì¾Ð »·ÔïæTœÜÝÉ=W«SµÍð„êMEZ, ¿Ï©šÄ24>ßQëŸX‚J¯Žé²d]%½½¨¯ýÿàF|ú”Ň÷ê'õ•xª˜›€ÙÅ Táâ‚¶ÍJ!ˆ‹ZEB¥ºË,‚Ugõ6iG©Yô (8[Ñ Uzµ1¾z¨Ô1Øíš#*ö*æˆaVuN7(n`)Ú!ÄÓA$Úò…C­TíT±Õf>`µZ”»õ쵯h Çy @ù”6¶\Ç“Häw¤A ÕœR •æD l á3w^!ûuO¥sQ(mK-é,lòÇA)»kõXbÖÚ®K¶µÚrè*æ4tqÆ^gGýçLD&éXÈNǼBót\öÇ}Ú†£ŽcÀ¤,˜±…Ñz½ 4!Ö̾6pËØñ(åå4F-F.Àˆ%0F@b‘‰FÎêeª¯}ä«6Zzz÷>»à,"My4b!ÐCÉ,ˆ:†Ñj4B cü¾ó—‡+8ÖlòÓaJK²x=ÔiL8kY4‘c]µÖL!ÛlÕ·MU(ƒ–ÏÞÙ'H~’@„ù}¬Wú'¢×þËsÕÆ¶Öq?¶Çq;oŽ›æ­M]'uS§Iã$mZ§k³fMÛôºKÖöš®#ÝtÚ²uÝË¡vTØq|ØvÜ ql'´‚Óö“Æ`Ø Òø‚&¾Œ>„M04]y§›?²c;žßïÿ{QÖLiôŨvW{ )|ùÏŽa0%­ì~Il³˜†McÿÍÉ"¤óô[ý› _Kþ® ÏanàÆH³{X3²‘ÑÕȉø²ß eš¹B°+ä dáNç<_5NYlX#H5eÎLåÜ­‘<7Õša<×ÓZQÿœ|0ËùÇÉ3$ É™ûêÕ]•PÔuž’š Ô{ài®3(çä21#ß•ñeù´|U¾)oɆ’¼ !XY‘qY9³=dç ò2êle0¹¿ìbúXÁa‚ipíÙzÊ ´Ÿµªˆ’¶Àª%ék²tHxD9È^Ý&—„ïѽDÜY ]H·+ÝÓÏõôGüÐMã@˜,‡äëko~Å7R`FžíÎxüu‡ª2[²ªA«ÐyM«¬Ïœ¸ÛΘü/d®xýi)iÿ-K™ ó£#³“S‡ÆÛÇFÃFïJ—t¹Ïßåç‡z(G€ò´ð™ÈÀIÞ;xîû·.ºFå‰c>Ú“ÓA9q¡âÚ½û„ì0D±$6ÝÎIï\=Ôùd{Dt»Z”).¬Û©Áj!°0£Ž¥#Ý)¥G–ÃÉ Å\fR¦¢°c1|¬&\ #$½˜Tn(Ä宂_Un*[ ±‰ÎY(M@ží4ª\£ T¼Ì^‡‚(h E Á“°%¸gè E” uA¡”új«‘˜ì!uBBJӵꑭI 8?@A[möª^ˆ¢±»¼Üc³`¾˜y¡-&Ö6V»©'x~2~qõNÎÙGÇ °Q8sLÖz¶gβµQôèÅñž¯’Ÿ[ÆqyñöÕ`ˆ’LüÄòÐ\æÊXß’×1Ë›|³ Äù Æÿz N{ç æú‹cÅN¾]ˆí“f?,Å¡W–vŸï‹˜ŒÌÅ¿Mÿ…Æ?§Ÿ·ã±¿c8‰‰Â•@Õ.®Sv8ô˜«£¶å˜kÓ…ßt=uá®Û–_ᬇû¢Q…FbÓ ’¸,íX µm²·²oOÄÑv¡ë.¾Mf¢Ý$æ8“ÛÚ¶}cå³h4ýÍ?\úèíT,’wÛ½^ié½Ïf­23µ“0³+゙O~ ŽÜz·RW“Cj®×åüð»?ù½…ö›öCvMïþ‹\0¤± VÇþ“;ÊOk}ĉÅT-SœÏϯÏÔê$5Ãdê3Ú²vZÛÔȻږ¶­š–')ä™èÏäP2 ‡1Á[?°¸d‚h{<¢7ÐÞ»»cÑp9i½Dy>‡l¦àz‹Aú–**C—’Øqî8~¼–¼(­\*.ß(“e´q'¹/ªg†Pö>Ynï³…¡Fè‹nÈ/•Bƒ÷ªÕ†.öŒ½)"HU=²V$'djJJéL oz!S©Ë Í%X—¾4ì4ãê«ì ÙŒ4Q[ïƒÉ~ ÷E5ÉI:‡›1˜¦¾7¦O®à€ô°E·#{¨£æ§ Œ@7 p.®¸}?o3P‘èw¼ r4–=5~©¸Zÿv±íÅn@·Ô§zJ­¢Ãóaèð›ŠÂ艟EÛH&fÈ®q—™µ{/ª¾ø›Cን9ëM¹|‰þn›µØg €d)Ún6Øn7Œ9LˆÚþÏÎ?ØyŽ{ÛÚM`häÐRÐß“žûñG%…Ý'Ä:1õAw¹úK–³òßî>ÅD,´»•› -™Ð#¿µ|v8N 8\.¾:°Á`^¡üëaµJQa&dóA‰ƒxÍj35¡†‰›âMq[$WÅ'".ÞŽ!¬spHÖª]ÿ›Xb{ð­)w²Üc›;¿Üÿäx:î‹9^J ïöãn© ‚;îljyª9Y¨{@é{q„‰;Ž^©xœé¯'öE–ÎIé1_í½>ÀSG+¸§*20å‰èïæ~}¾­O;Zñƒ {.:Z§óa_ eïì"ëðµI3õ)œ&Õœ G^›[4,ÌÎL”Šjê ‘¤[,Fçá½ÂذXhc²XZؘ5~ކãfæfËE­<ô£¢9€­Xá8Vº*mKDNú›„K÷ÀÏsL w…§ÉÁ“˜@`¦°%l£ëmtk€8AšÅR_ö†ññ³f ¶¿4‹fBÆ`îÕ6g¦Öh¶Rý…½GP"Ö­<%!@‡u+ •Tð)´× !œZݺ‘<êm0ÔK$ÕŒ¼hp)£ S¨ê`ѬºÐ¿ÙL§”1¸U#CÂXg„ÒŒ °úçˆqÕ³our∸/ì÷93ç ôÚp\ @Ð-ô¤ÃL›À9„Ó·h³’d®«Ó²Û1(ÆÉWšk±Ð¿ØrÀGÚ8¯ºð'Í—ŽÆŠÁð¨“=li‰-\>åƒlh19ÚŒ6Œž}›q}ïDå ‡Ï ŒüŠ$ ˜ûâ;»äk0ÕMcG°óØn®»Ëò­•[B1–d,[ïܼÃßçqþ§Áu‡gë¥úrýJ¼Rõ{8È•7³÷³x.»™Å³ÙñRU–ÙsÕñr•¥ÆÙN¾K™5b‰…ffs‚8}vr’àÿÏtÙǶqÖqüž{÷ïÎowvìØçÚÉ9¶Û±c;N𨱛w·IÓØ‰Û:¶›,íZwi†(Ð%[%62Á€R`Œbb¼ˆ©“¨0¡FZ™Ð@ÚšªíŠJ“¢"öÏ”ÀóøÒRùåùÎ'û÷û=Ÿï÷+Í©søÜ²¤EµÛ‘Ó€¦­¾‹å½y<ŸwK 5'nátΟsƒ«nàþР “%fˆ±F¼ -(­Â%þŒ»Ñõ§«KÕ%´Qtªîe¢h ½BY…hév"ñp‡GÑ ]³¾.pììVwt´Œ…èšJë³€¦y>Åžjí~}´@ËfèK¼¨ó‰ÖvG â-Q…÷q8`pzÓ=¸õÀxÀ‘ ÉE~Ú:{g¹3æìçÕá¹WKhåd§Ëæð˜h÷‘ £4uölÞáÏ–|f“‹üa³ñA½Vxúïϼð·Ã‘£à‡…Zé(ŽÍ0„ÑÜU8õ¹>%Ó‘˜æ'kÃ×çW}§àt¬ ¦'Ʋã«O°¤EôúÌÞ—M‡Ež|!&H1zȤؼP.H‹O ®÷÷ vÇ{‚?}îK¯=E./»f}m°k¯×œ v)¡ Ëá³yÿh䎆aä ª;}’³6•»îêlm´—À›«©å´Ç=»ácÜØ¹Êre•ËVÒ•A®7” NŒNœ®- {‘xöœB[S©Dðüy«ð6$ y DL‹ÖMz¾Ì²‹tb3X(ÜÂñœg: {±F®A46Ë´4­NãÓå‡Áûa¾>}k›ôï }º`út}õÝ´w¯ Ç£E4;ºÖÃWyóc`ÉdZ\ÏìNkRL;vdZ¯{É!(ñÖ¤.ò}0´NØ $HÔíŒrÀ83Œ."­ÄÐÃB8Ò_ôyiYZ^Ê “fšô²”rœäèžø|›½¿$ )üÔËÇ® @‘”1ê’X€Û¥îùLçp÷æEû FOG1•ýBˆ€*béì•pr-é Ç’,ÉIýãÓs¶¸\hÿ}·Ó#È’ba(£f É½7&§Ör_ÿ‹  )X^ðk8áX‘gH+uý?övݼ6æGFø+É6N´QÄ¨ïŒÆ5*„±~ì•\(*z›‡îv2Ü}Bl «•‡ d. a­«3¨8,^/&¸Ð(Xœ!ˆ-Ót0VŠ %Ñ‚„EV¢›Á²¸i¸©€Ì¶¶•!©P·3ÐέC0ÜÛ;°ræƒF£?Œ{º\ —œ…ÁfŒ¨LšW$ $œÓ…¹œ½ÝCÍt%Vé;V™¯Ì'Ÿ¼T¹R¹ÜG_æœØ§uuÇ2ƒC¹‰©cÕšP¬DÊóù…‹õµKDÓÕîm8Ïp”dQHö ¶a³mD"óóÒÂû - íî.THÓnUwQÛY+ØÚD6÷ÿ¬3Ûõ6·V(Þdu…Þv÷âð\Ö¦={r+Þ4ÝÓovÌ.æ¸z­vy"o›˜ÈoQGX„§*ºñkºÃÞÙb³wÚiXuT«Õ÷àÚL›ûZËjAÝm‘ÓŠ ÈÈ:G[a5Ž‚.³@¹GQIÝvé@…v®ïàrT:se;¼\Ó};`à­¼–vÀÀà4`mÓ†øM<ЅÄÿQªÐ.˜$- ˆ)C)ìN2y93â;ñG‡Ó9õú’< ŸRí|T[Èl“”ý½6Þx€3§Sn³ÁŸ);ɬÆiRî¿È„ºÚÃ+f^b¢ß?B ÊÃ/Ós®#¥ˆ iE†“Åâ<ÅYÚ¬ÖèWÚÚS?]’ÚÛ)Ö/±#Á$@¸ìÀæþ«ÁÑ)’4ˆ6 ʼnf‘‡;‚Á\¦"X{>WÄC͈¹)ßmÃ"•d%ÎeÓ3éÛéi2êîp9¼´`– Îjåܾd ó–|\‰î(ùèÛ½é+c›Û,0`,ÈÂ#‹¦*õ¶úˆ°&Ýkg¢é¦NØÝH”‡J™4CÁƒHÕ:[ 6Õn ”íf»l{d£[ vKé…v˜ü]™ÀgÞèi7 C Dc@¦ð™üJg¦9—HVpÎgá½û]s™j3²œ!{€ýŸ_Õì´uôº#lœ•ÎBRðß,„1ô â ö=ðë\1¤N©7&ßžüó$åôFó3žûòó†ËOb‰d®röEÿ–Ø”îÊÅNo~£¿2T\úÙÕÓÆuÇï½wöýö¯;c þÛà`ã6˜_vpüƒíä`Aë%U¶`%Õ¢’Ñ,-k”,U¥t›Öý³©Ó¶vé´©™4Mš6)ëöפUS%´I“P§ eÒ$ÈÞ;›dÕ,ûùqöÑ}??µóÚâm펶{fvmc÷•-w¿Ëû™ ûChM ¹™üì"¿pÿG÷ÝG­ÍñPOª &'Óg´¼a®&³y~ý*¬|íÆÍ[ôN±ªòª“³_CþÅ3&s7 Çã±ð±:>sõÕÍla> ’$øT ÆŠƒ¹a0©ðã0äÌa †qàI… 5;ÑÔÎÔÎÂŽa§øjÖQ3KÍMÍ-ÌæŠgÖQÌ9rÌJv~¬’‹¹Íorœ™êƒ ˜Ï€Tæq_3Ô ¾æÏî'™7¨ËÉ·ðà÷ñèKÑû0pqϲ¯›k«ÎW¥ÏHýºH QR›’‹`ïM|¡²•÷Ög;3Ƀn"<7%áÑŸ¸ÑáÄu|ÑQ½zôÂ1»äÎØŸ±ÿ8Hì"±½áÝë -ݵ‰beD¢ÂnÆÍÎ(zÞ'ðó¤Ç5—“\»ËÚ°$±¼•‘*`±sÄ“q+ §Ð6µ Â)ó ÿ?Æþ3†è‚§ÏD>ýgʇêÓTsK’Ö:lò§mãl\ëÒ:ÎjËÚâÄVƒgÖûJ©–f‘ïà›[⨭iTíJ£‘ž¬–Gs¹ôLfÚ[_ÃKTÇ.SòŠÍ&ËÂÊ!M•Êf…\v&›)QͽY,mmÅ&+ÃT„¨™\]N ³Ô0>ÉdV½*T ¹ã`DàŸÉ­uïEÿ}Ü$±›”p7:øæqbr”ŒÔöêúJlõ ô1°aH8:0®7KÀ.Õ ]+ ËV'EA¯z'õ=Œ–1‹åÒwl zÑ ¶Çõ€JÀSÙ°Š¿ØXUÑΙ xªØn1¢ÙŠAf´©³·›ð`Ã'9ðëÎÈ:Mf›‚plÕ±Ž+)ŒTVåãµÛÃëS÷è„HsFNRN«kÉdƒÙ¬ÈQÙa´ØÛèM+φ\þüW?:ú¹ÃÌ2œ$‹vä%ÆfG 4°¬5š _úSÛh¢Óšì×ùÝÓÊŠN`„ /°8 >ý}†f)#ìRjæ.w×ú÷ž•fx£7ài÷oû ——ùóO¼t}^våÙ›2™mGœm²Ké® ceÌZÙF3õµê©¶‰ßüf//û-ÆjÁ }h¬üV^¤ F‘l‚Jÿ8 /#r½hmò8 ;qæ;…É@ð§¿b0‹&Gß Tjžú8{;~3&¨\ËH¼Á¹áÖú¡¢¿æÖjsù‘­¸0À c­Ér¸Õ˜ˆÑf.£t¤º(~qÎø¨(F³‘‰œ,Fr2ùš"RyKæ—ÄÝd÷d÷|÷ƒnº›ðlól£„@„èé“}=J–“C9àǾ®˜¤à×3ñƒ< ªˆ57¢Øñó&Å'G&G`¤½uÇÜ8ÓTÓFÓ)ʬ¶‚Ǩjð·f³IuùuÄL&£Ú]´Ä@,×H&×o üö ðqàqÀÀ™Þ@!ð~€NX ð=µøÈŒD†uÛ$QwÎûK«eï¸z&%§$ãþ/ÓeÛÆYÇñ{ϱïüØg_çìøåâ¼øüÛI.±/q’ÅM“¦SÒΦN»¶¡°Enm¡T- £´µâ¥öG‹6!@H-ê¡E´BTb ¤*b0A`ÚDUi-”® ÏÙM:Ÿ}ÖéN>ùžïïóý~ï7C¥é±Í¥Þ. ?ÜrÄBÃøžØ¡¹†øÐ\Öhˆmä4 á醿l›e¢azj‹;çxÒ.w»(¸ãx»`›0 E q=Ý™=Ù­µ‰¬[l#) ÎÈ>³pcRÙçaާy¿÷›Ê‚­ÅJ‹ëî. z¼òð“^>*OjÚTX¬’Êúv<¾+Ëv›ED¼ÓÊЂÅb®Qeó.ùî%v‚?wHk?î…‚®:UW`0 †ÚMèn·0 ÒÜ@¶=­§‡¾7LûC Ô78Ýÿþ óòðæU팾®Ón=ãÈø¡cƒ©Á´1Õ>nЃ<"ÂA9Ñ:Œ¨/¡ŸI”`¡«è¯ÒC‰þ zWúúPº‡è·¥ß¡[Œ¡˜4$A‹äF%´C¢"è z½/QФIÏ¢o#Š;ˆŽJ—%808$!ª%Õ[مخ‹©J‚0ˆKÄ‚ZÅÿ”MUƒlKu”??@_Çl ˆ^À¾„j¨³ê1•ZUÏ«—ÔÛ*uSªzZÂx|õ¢Yt@áê±,Èâc£Û7ÏiH@! Ä9â<¾½‹X%>  yÏYÀGWHüì#¦1SªõúòB}áþú£åGõ“ZÝ[¯cˆˆéjÃb°úêM)Vë¦î°:—ëõzÕ|5“˜º™}ΰ ®HÈ%Iè¬=Þm?%ü¾,¦“ P­ÍËAañ)Ÿ± ³‘ÄùÆškÓhšùKªM¼lÐÙ6N¨ÑJ»µsY1ÔáI#…JGZ~Ç­•PkO§ÿåâþó)F‚­¢qŽÄâè¸ÖíýZ¾Rºü©Ú5`×yŽ@;¬û]1Ym»µ@¯Ä§,N£s ¶óùH[¼µÕóck±ö¶r©ÓŸ v„œ~×òÔK¯[i%3âÔ S«›Ÿ’/Àÿ9â»F+ájí£xY‰v&))ì‘Ò¾tE®¤VùkàC‚' ¿ÀOöð‚+ ?lKé>¨eÛæ¹k˜* ø÷¯œÿ|À·'©òËì©›ÐLDô›ˆ¸á°±±ñ´"š ÚÓˆøÜÆÆP#9ˆ[a¤ñÈ;îb©\*÷$ßâö†jÛ¿q>6³n|¢Êšë¡¯|q¨Ÿxè2;ưAÑâís&HÀ;=m¾V…iñ:¨ÐéÉêK”2ÙŸ¦,µúûü:íÄi×çö(6ƒÇ_=š“y«—æ²å +'¯?æ2gað“ëÚ¼KMÁ,±ø‡192APÁH'Ý¥¸Ú²¹9º=C2J¥}©Ë~r‚Ï|aV? ÓWuJ× ]L/¤UׯF¡¡°†4é$¦Ÿ(­g®\>‘Õ]Ù¬Þ^©üŸýjmÛ:£ß%ŧH‘EQoË’²$K¶ÄP‘-ÛÌ£‹ãG{Il%–“:Îâ$ªóðêi“fA¶E_?ÒnÚuÚ,Ù°Íúp‡ˆ ØþlÃÐ †­ C (Ðí€8»¤ì¤Ýûµýò¥ÅǽïåùÎw¾%³uûÃá¥#G}GÂÑ#GÃѰ?znæ°ofæ°Í@Ö¦ ‹9HÝçâ§)™û-]©Ú9ß&'Næ8µï1oþFö7KkÒµ©‘~zV6|“üŒ}u¬j±€ÿÖÆ7hKâ[vý)!\ɶ­™·Wb1RÏÊb€pI¾¬B‘,7ÛÕâcfº:#1¯ÖÚ4î¬f/zºI÷®XAN´¶wqQ*¯ÑÛ»JâÙWù²ET\Aœ•’sñ‘{U²e‰3hæÃ+ËÄÄ'Ïh/i?ÔHVûªFÔ–?cWEwj8¹Úa ó·•rÿjk/7ö¶ÞÚ¡àœÀgÂA¾õÑmÜd{·æ\S»§~4šN¯ »–,Îûð2 .,œ£²>¼ˆÿ$¼ùæÍ›Û{{WÁ›Óœ+ëÝ]Øë";^K¶ ì¼î¤ööµô^ÂZlÛ°†l;ž¬döÙ=ú*ºÍw½x/bh¦!éQdl¸>£“k ¿EŽöã>MN¡×èGã2N-$õæÊ"}ZÌ|„Ù #áÏÏÊLT2F"ØŒ×%|û)E·\^oçö¼je½ZŽl ræñâ«ÇcÚ¯\* ñøÎœH PXò’Œ;á®šÎÆT=¢Š"ÁH‘¬92\"CQÅHÏkuJí {ǰÕq±~>Àº°í HFâE̓#Møþõ ŸiŠLÙƒ$EåXU¦K ý¿¾Óâ7ŠX’E*Lj²À ~·’àvFb';¸ääišâ)·ÏEÑ$òr8c|¸$N0 w­=…¤i©³¡ý‘iНJû¥¤Û/Yî)\ìI¼¤‘Áj°žœ®V—‚š/X j•-[ÎMF}““QU F›{*ÕinÜlÍ Ö…:»eï$ùØø3ãÄø :oíØQ¨f«9¢ÊVéMÓ;f~Ë\6É‹&¦‚•šè]™ùÓg0%°wÄ­Rñêë²VÄ|¸}K®ÜÂÒeg~ùNMq(SSÊ÷ÄÏëãñó7.@ 9*€“¤óáK޶øšˆÖuHØJãl:ã!ð¥Vª}“9@˜Ä6cì‰ÎmÑmˆóç$&†(Ä E"O¡'ÃO_ó%’[^¶ÔÀˆ‡³x—˃{ufõ'­šç­G‰[„žjÇÖ¼ô’ÙŒ|¸F‘î€Hy¾ÛzówzŠÐXQ>Ñž–tJ‘pÁRŽzÿò«9ü}fˆÑ/©8a›%7qM|žËó¯hâ_}+¨ï š\ȵWYA9Kt/Æõ.ÝÒI]‡§æºs GŽPöØFCû´1Ö|´]Þ&º"0~‚oé$vZtª2ñ•·¨¸KhWY&Jä² =˜H÷L^9óÔŸ Ñöü{ oþ+ ãƒH܇üÀ5±@¹0þÀü€›à/ˆ9‰ÓÊëê€ï ÍZÃÏüƳ÷ø@è€ð5€èn€8XhÁEVû/:>¾kè0L€¾·9P~¯Ê£ýx¬…Çmݰ=0h ¿ýŸå`ô€±C»ñs'ðÜ>ßcïï¦ð3öWàyMãµ8¸ pè·s€/à9½p ÏýÄË œÄksÏ{x;ÀY|íü>çñÜ«làŽ·7° l`ØÀÿ@`ßk7ö aÐð_ àôr à‘dÅ«ú4¿†Â‘(4Å›±lmkOu¤3ÙÎ\¾«»P„Mfis¹§·1|+üc.®nîž^Þ>¾~þAÁ!¡aá‘QÑ1±Ø-ÜFØMT, @R‚AèUeM+;†††x†*†‰ ÿÿU€d4´}:G†  L"DæÿctÈ ú`4¬±f‚nâ`HƒšÀ Œ/(›È²Ù€, PL²pE䀮‚°™ø¢ lf Š (›Èže³Ù;œýݵÝ‹sóóRtòsRˆƪ#ú3¸38CÄE@œËÏÇ T†t†R†°8~µº@ù| JBf’®jLÓ~Ãæ"+0dô1ËÀ<Ÿé;$°00NÊp°Y ŒfHcj‡ôè±`Š˜È4–á ûæŸÐXb’œY{û±N<¿ÍWi°êµ|ëþ‚ér§Š—ÿ²qF°ÿrAñ6G“²( endstream endobj 315 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 96 /FontBBox [ -517 -325 1082 998 ] /FontName /BABACL+Arial-ItalicMT /ItalicAngle -15 /StemV 0 /FontFile2 316 0 R >> endobj 316 0 obj << /Filter /FlateDecode /Length 5554 /Length1 13384 >> stream H‰ŒV{põÿ|¿Ý»¼ È e%!r‰P„Â+\&Hö’‰Î]È\!b ‚´C{¤<Ê´S)(òu``DÀ-…‰RtZ-èŪ™–Û~÷"ñŽû½Ýý>ß÷Îôà H”þxöÈÑÕ~xâsKæ6ùü˜­NF} ÐĹK›µ ·œgXö  –Ôùë›Ê7e¶L¦ß«_ÐZ÷îÝÆ7çzÖin¨õÕœ¼±éQ`ŒƒéìfÄÄF°~ô™ÖÐÔÜ3Å–Äh@ÿ Íõ‚£€¡ Ó·›|-~ÛÆˆ(Žg+ëk }Mµ{Õ=³€ÑåÏtÿ¢%Íæm–`ôKî_\ëɰÎKe¶çÕ#HßíHQÒ‘˜ÿäûšõ5š×-Yh‘ù¹øœ­öÜÝ×QG !)¨A+Ö0¼!€mØ@X‚eØÁø›ô–𣒫˜?þ„Q$ͳ؃ç©l€¿  Oaƒ¹Žâdäc1ËSòïæu*¤…HEfἎó¤ˆIj’ºÄÌ‚ŠH¼‹.1ƒãŽÃ@ŒÃt” ŠcÚű¾ƒ ”¡æ›áDf³çV¬Åvœ¦u¢V<+vÈSês“É^ø¤¤£¬µÏaçñ EQ<½MWd’²9t+tÏÜÁ™ÇL…Ïr6'qá ¾¥9T'\¢\úU©7™ó#'fb¼X޹b[Ûe[èdè.ˆgJ"‹£‡\ο’kÕ…)Ž’)†SͦFÚJÿv1^¬;Ä]©Ê †l¹]”ŸÊ‹ò¦R¤´(WmÑf†Yl6˜-æ«æqó3®éd`ŸY…gà㬞ÃJ¬Â/¸[›¶àUìÄ!tâ0Žà\Äg¸…»ÔŸFÓšHu´€Zh/¤7è}:'ž>±MtI]V²ï ”¥TY¢œ !”j Cï™ýÍýæŸÍ¯Ìû\Í!\ó4®h<¨eÏ?ǼÌwc †#¸À;òW.’ÁA ”HÃè1Ê¢‘”M¥TF•TOÍÔJ/ÑZZO/Óf2èGsŒÞ¡éÝ [\.³ˆ±bˆ*2E–x\”ˆz±Z¬{ÄAq”á¬øPœÄqSÜ“q2a¨L—EòIY%ÉÙ*_»¹žgä%EáþÅ*J¦ò3e§²Oy_ùR¹§F«kÕêïÔ+êlÛ$[©­Áö[§í#»´—Ùëì/Ø_´¿d?=böóv9Ó‡.Q…×ðÃ?¨]&ˆÝT*vÑo©¿LÂ|ù{ú«ZŒ_Š‰Â ™bü7-¥¥(_§Û¸CBçɥ좭8Ê›Ô&æ‹%–~¢¼®Ü§fåœ"Åe´‹ë–[‚²‹½-åýo¢ÉŒÕ£ ¯ˆœ;¸ ?ÅñŠ-R¬ç¾¯Cº(ÂXšnõF|ƒ/y;âh æñžÜ§íj³x–Ék"OÑ}q‘&¨Í¨³9°’ˆy†.óæåy)¦1žªqWi]s0S¬Âv¥^ý>%•¨ <P.Éé²NÄ‹7ñýk:xº0CžBýš·¿K¸0],Âù}Z®ÔË޲E(´ŠwaÈ"%ÓÐ!;pŒþ ÿF.ìSZh!m4Ý÷ŸÆ[»²WÕle°y:ô í¤³æqãÌÓrN¨ž6+ɼ—Ëy{s…¢±›í7󣌥ñ>®åyÈß¶HÞòBþrÍÀ3t‹7fW)›2P"†b¾˜j×l €}87µT·<§WÖƒñù™*z0‘*ÃRžÄª^e‹ðÄJÿláI®é´Gð(†9¤oQ÷³"ÊéüFæ Ë*üúά'L#×Õ—žÐ‡î^L@rÀJº(.¯ ¢úÈ ù»êZaÀðuš+ªuÍ¡‹bgÀïö>èh§ydMêÿX¯à*‹+|öÝcLyXÊl°@émÂ#yJ.’ ’¢„“”"y¤Ð „ÒJ,yTJÀ– © Ü Ü•Щ¦0Rk€Ñv¢(„¿ßÙÿþ—Ë…QÚi2ß~»gwÏžÝÿì9{wøõDlbšoÕèÑÝßeãvûEÙS¹95x¥&–Ï hB>åщ»»¡/§oa¿’ja)·¹E£<= yUWç?Q©ê5”@µ ‚‚”ÌëÊ5G– døKÆ—Ç×÷ ½1–†{k¯}Ú:Úû^5žÈÄ¥°”‹ Ï £H;!b"Êžót¡:3‹^+ðn­¤7µJ{½Þ…šÄؾåhí¿Ö(½ÁÅÀ`2°¨®åÀ¯0~>Ïea Ã+i¶™eŸÀzÍ:zxõIÆišl „u”Åsñã!ò§¡ëI«’r!/Dÿ~ÈrÀB{ êk0ÏFý}ÔoxV ‚·@ž=qÀ[°»L?„±EöR­Rø 3HÇEà™ÀtŒã}ôc¹¨£GDíEÿÔÆúÃÕø"*„Ž&>3œ ÏËg‰v)ê[aǃìVÔ è‰À ¼jh;ìñØ…³o ŽðžÃ{‚ý!›n‡cãôH`Í%‘¸iÛm(Â;zªhÞø¡ÚQšeŒÁ÷;M£Ì³ø¥xItÂ9åbŒBZì%ûMØù–¹óУˆF¯Ò½ú%€¾¬ ô%ä¤õþEohÍô²Õöÿ²¡¿Ø ”/ÒxÌï¥ôœÅo»"z àµ{¸çÄgã%ªð¬¢e8÷ë^öáJ: u æ—býb>sþî"«µzÆa̳@WÈg+Q,ΪßõKø÷Iè* ùᤛL“B~ÛàBùYêì+ñ¬¤Zà0ð Îl50õ'€]Æ/Öî?ê¡ü>ƒsè¡ü¾ÁþÏßJù¬³‡åcêÎó;BÏF`»µƒUÀvŒiàûÂ>ËvººùN±Ï¸¬ü{½­UjíxŸìSaæ»G4'|á[.ó½cßgÖü4œ¥§Ò@öYö7—ù\”ý¸|'Â|s¯6ì{Vq=Í ùz©Ë|Où,¼†²ÕyhêSy”¯ÿ‚2Œ¿S¡vƒv™ð-gØKyoZýÌ[Kà[f¢]Åžz1ݬ¥‹ê<ëéwà¹F½ö Q/L³Ê>o’8lViKUý6ކ¨uú˜‘}ÿ­üvܬ¢©¨7šõ¶ý¬ã;ái}€D—!¥€ÏûC±Ñ;C=(Á"ºdñ]ðÓ ÓOýZJ3Ú#u‡|‚ùÍ×WÑ`£‰~,J‘ êE¬§=rÀz€×ÒŽÓrëωð£[|.Ú—\vý5š9æ‡|Jqèî-¹„O Î ŸU~@ŒVPþj?öÏÔ~ÜõÏ[ýÔ®‹ðÏfèíí—Ѭr â»{Oùn¸ûçøÈ1Žc$Ç9üÒìéŽæ›óE*îI¹ŠÃG)7t·¬ Ð×vþ÷Ç2¬õ±•IÖ{4Mÿ.å[¹X¯™¦X©Ôû¾Î©ÏØÍ¡|šâæR>'ô7»yÔìC^Ï> lo> d•GaçOëÔju Ohn ßCuçRçFc*m0ÖÙç±ßëoã¼!7²éçªhˆþ…}ÔÈ·8'êëU *4^±Ïègà{<÷{–ù½j ¦Â°>fÛo½Kç ìÑÜ®rþ7ó·÷®°=§°ÿCtÖØ‡1]èœy„÷‚3è§ö4QÍÝj—°.O–½Ï8Of d€š³Øn GVäY(æ³€Nk’ÊÙÍcè+ O<“)Û“uçÒ9OGÈx­Uøþ½À?µ¨|]Šü–L…úWð­™Ê§›Ëì÷ô I7ëu¸wËí“æbðOÞ»bÄ}ÜõÞ€X;ñ>ã÷Äzäønô[«‚ZÒBã -4Oc|?JÓ[p ÔGØ ¡¸¡[_FÌ…;oç=ãiŸ´¶¨õ2” üN)¢%ú”­í£4Ä’qÞJøÊ$•§WÂÿþ\t@ÒBxÜv/úŽÁG_@{‹ž A}ƒ–JÓ*ÅsÎ5–ÑsF¥è}GÚàMqŒ¶Š«´Y'Û8B› W‘'ÛÑ×ú.zJßCוüCšqéÚG4ÄØˆø=gXF F•è»éšþ1ö0±óÌÕtÑìFÉ8÷ÍúWÂ˧©QÏ¢FëEÚÌëñ8àôç3Œ‘”¬æE@Ùê"Êfm4ë£è—°÷sÔËo±¶†í,£Ï•w°OÙÁz1Ç›i9‘} èîðqÜá.p*‚™ñM+8/XKóŽ#öMÄ›¥-•Bç%¢ÖaÀ>ŒË7C6õ^ÀÔc [®ßL…cì¿@–ntÆ]qâÔ"Ȧ£?ùð_ÑÆ¯‘Ö:¢ë€û´Þ^ ,Ö#røÚ§Ž=öÀK!ƒ¾ë¯`Îe´SQ/®-À`%æ|†þ$`4ÚÅÀ4öíÛÞ5ÿw¾s>»[æ¸Åv‚à6D礻f÷{~ Gç.÷ûG¼A£Ø9w¹ôs¦ËPÑ'ˆÍC£†p\æØÈñXÅ£«w€9‡€W ^âXÌñ±ø}ÄÃeàù`~ƒ˜®]»Ç— k£½N;ƒ@ `P”™@ “_{=ðrª?ÊST=v\J)ó˜'RTÛ?Òá{âŽäpŸTWQQÌíŠê”ANÛ××iwëžR2,A« …¹ŒGÙHJ‹WT·ïâL‹¹Ÿ§m«þNç”øƒÚ6ŒØ†yÛ”‰Ûü÷ »m¦•éÑZ†õMжE•%ªÌSeš*{«2>ÔÛÈ««ò *wª²·*ÓT™©ÊÙªTãÅü7ã¿ ÿ¢Ñß–’I‘$¤ð' ¿5"FÄ’kƒ"Ößÿ!Ù+q¸LR“I` ,ò”É@W_ºì/ —b„F^êØß¾m¯?(vì»±"®uEÅEZÀ7F‹ƒwy¹‡M€ðÍ“ïbv¢j%jUy-9(²òß2èyU5áo'¯È3ò²Ü/¿–£äa_•¬Á¨M”A£þà jUþx¹R> ãÎÈb9S>Ÿ¨ºfvùce&åúreNbW›¨VyLBÍ^™Ît_Pˆ½Ò/_’©Éjj OÝ+ûÊy²—TË%9ËýÀ±­'Ó^ù},ö Z%CNˆ‹‰‹ùûåÚHðïÍ$ó^ÿn»ÝÄÐ&aXNÓVA«4všI²°;ÛÝnS1Ó]pkÙ–@Ò¦‚{+xYÔ»¸qË‹ë.I-Þ„=yèI¡ xñ$è^Ú¿÷fšvÅu<)ó%ߟ÷½_Þ¾ïM2s¤î&uoQwº9êŽS÷ê>OÝQêŽP× îYêöÓ^eÖÍ:Y;cLc!¦0`½õæÞ¤Ð«E„Ãß~´!Gañt  ¦ÀàO©¶b—,bó°_Oñ%½NÚ¯Ìñ°nµÁžµbüEÃ®Óæ 3lN§¯–k„¼ë`–+ïÔ Ì–ë$.R Í—ØÕøÆÍ„ðÍ›Ž}oš13:ÑóÒ¹Âߘë¾5Ž%f<$öô[ ìrùM¾LqX¡+†®Æúùv©Ì?ëwøs"hö;6¿”ºVn-òy±Ð ·…sÊ uˆlgD^*8Ž­‘û-Ám ‡ÛSpøØ³+¹ñ8]rxì<®/ºäô¾ÔCܹ-¸Aá;³’8³w‚«mëÅBM×Öږ̶·ÏJ$™D$”Þ*I‰$‰"‘sÇHÆG†[ȰÜI%ÇLÒcºRGL—ØÉx"¹aF±"ÎÊt¹ÆÀrò×<ßycBö½+>ñIb~P…ÃáíºÅ;t L3fD²dDëä¦(ª ÇÓ±õþ#$›’îÄt—?•Éerb O¯˜êÆô)*¶>žNl“M*‚éÜãÄuV«k(+V ­÷ª/k¾¯‚ÍK67¯Ì•k”ùäõ‚ƒ¹Ñ£\GG±ÞÜñ’Ø̊¤ª¶ÀV®­Í±÷.‘ËI2†—à«x)¸ÑÉ VWñÞ÷žøÕÄ~‹S¸PSÈWØ4 ÿQ}áP ©B;Á]q¦…ż*Éßi»ú óAö0{)ò{vê0 &Æ‘4ÏŽ¦{Ò=gÑà)uç`2 û í€/Õ@ 4Ð@ 4Ð@ 4Ð@ýª„ô‚*"ò4ªõñÈ[BðŒ´!YŸT³éÙæÏ~½d š¿ýã }Z…Óh‰¿òi|y±†Ñ ¨|¨ 310ýXnxÕU$nøqã÷üXøaå¬\þ¢‘[©Ì/gÎWç—+ S³Ož rRóp ô+PyX†Ür Ö0šÇÜ£¨ œÇC$¢ ,ÀEïäÊ 0 j' endstream endobj 317 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 98 /FontBBox [ -217 -315 1129 993 ] /FontName /BABALL+Garamond-Italic /ItalicAngle -15 /StemV 0 /FontFile2 318 0 R >> endobj 318 0 obj << /Filter /FlateDecode /Length 18472 /Length1 27236 >> stream H‰|V tÕþî{³»!? šY& ÝMB 1’Ý…$IÀ²‹Ñîæ?1‘9©ø‹`Jù©çOQü)­ kƒ¤¨µ‚µ-§T[Á?¤*è±U2½³!hkçËNî{÷¾÷¾ûÝ;s ]¨Z´¸ ¨®6ø] õ-ž]X߉¾Ô•þ>д  }õ«Tg–˜Ê>öÛ‹š¢ÍgfŸ*É€rOsûê¦îõ+€¬=Àìu-‘†¹Hm^sE OŒ¼2Î $láqvKǪ[ÍŽã<îâ—´/¯ §:PË¿øÚŽÈ­QGò&óù Ç«7G:,~ûÐÒÀ|‚Ñå·¬2ϱ->Ë]Ù}뽂׀´D`ÄN[`›Uùyršgž0?ˆýÿàü×ì#ô º™Í¶ÿ}Eùw×i~Ë5j®ÿë/Y‰v6Û¿-‚QñðâZ,C=y‘‡VÔò½‘×MDаóäQz0K±™^Ã8†l,Àõ\ÁDŒB!¶b?ŽšOó8Sð69Íñî³Ð†g•"žME&Ü|ÊvJn^›‹|ÌÄ•¸ X‹£J!ì¼Ó$Ž_‰ð(c" 1ý5ˆÒi±Ò\gþ£’y¶šy¬‚ÎŒ^Àå“ÏqqŒxî«Ld1ó4c9GmÄã ´UøÄëæqf•ÄlÒ9ÊbäAf Œs ân<‹~ò±,)âSælƒ ï4…£¼¬ÄL3ãk`EÚ[ñÁ/°×Â_ð9 xª¤¦/Í:óŸ >-8Ûi˜Ç¬-Þ7²¶¸—uý!¶sž{ð~‹×ñ>œ§$Êå=úE¾¸S¼ Sä5ò&Ùg˰;Ìcœ¥ƒ÷ËŽ±rc*¦cÃÇŒjpW®7qÎk°>¦ÎfìÀO± {ñúñ2þŒ¿ò)§ùœÏçI’9§ÐšÊ ͧ…´ˆšh í¤ýt†Î‰±âq£h»Ä^±_¼,'ÉíŠ_yRé3Ç™Ýæsææ ÎÑR>NV]åÚÌ`3§2”sí*¸æ5Ü'7pÞßãÌ[¸“Úq3V0Ë[qwúݬÅÚßnlaE~ÂŒ‹áqüœ±c0ð<~‡—pÀ9›wp ÿÀY|Ià\\”MyŒ|*ä|Z©Úi%éÔC;èaz‚ zŽèz•Þ¤?1Þ¥¿Ógô ŠÑ"Cd2²âjQ!ªÅb±T4‹[D'gÿ±8+çÉò6¹Vî’»å³ò¨’®,V¢Ê‡¶€m¡­Á¶Æv¿í {›cœÃùÍKƒ¼jðùÁwÍBs™¹Æü‘ù´yÈ<ÂJWo ÷]6wÿtî¥9¸•Ü×!ÄY Õ¡MŒf~[ÑÁoƒüDÜÂju²V÷Ä*Ûƒ3vâg1ìf<Æ*=ÉÚ¼ˆWp‚qïãc|‚O¹Êgñ5Åq•¹³Rh,¥Q:M¢É¬Ñ•1Ìe”1æQ9]KU´”–Ñõt#£¥Õt;ÝÃè^ÚH›èÚFÛ¹Gv3¥½ô ƒtˆÓzu=JïÐ ú˜ÎÒ—Â!FˆT1^¸Ù"GxÄü†D­hb¬÷ˆ b£Ø&¶³Ê‹~q\|(ã¥Sºdžœ,óåtY"¯’mònÙCŸ¯ÈWåqù‘üB’ª¤)ã¸éJ‰Ò¬´+ßWîPvp‡š6²¥22l¶r[•íÛ‹¶ßÛ½ö™öõöMöG‡í§ì_9RcùŽ€ãÁ¸ô8Uïaý/»h‹x_èâ m¼Ÿ£ÇpLfÊå¿wªè+q¿2WÜ·ü¥²–>“È’ËÄfáÅÛxžuñ²"wÙ ƒ9ˆS¸I¢NúFlÚ,2¸ãû•k€ÒY%³ŠgNŸV4µ° ßëqO™œ7)7'[›èR³¾3!Ó9>#}\ÚØ1©)£“GLJLˆç°Û)¿«FnØPrµùó½ÖX‹ðDä’‰°¡òTàòC ÇÂÔË#K9²é?"K‡"K/FR²:³½Õ¯©Æ+>Mí£eÕA¶{|ZH5>‰Ù b¶’$ñÀåâª?½Å§VýF ³E÷‡}¼_oB|™VÖïõ 7>ͶŒ€í¥ÀŠ"à/éˆKbVF…æóåšÏ¢`ȤÁ¨ªú}N—+äõTV¯ÕÐæ£Ü±”ÅŽ1ìe†#vŒÚj¥ƒ j¯ç ÞÝ—Œº°;±AkˆÔ  YgŒvó4Ÿ1ï¶÷Ò½ž>Ú½$hŒ(ë#, >ƒ ³«·¼Ëç Y§¥”ï»4Ü)uz«j uý>Õx¨:x©×eÝC!ÞÔ멬 º˜µæïV­4j‚± xSJ/`’Öœ•æPšߚ ·©Æm®Ö¢·…¹Xãu5«]{ÇW”>ï㠿ª/ j.ãj§Šø2{Ç@¯Yý«òRµür×Ó›/^?žO=÷ýÇD”V¨bêÕ‹©IUÓ—°þ’'@íø¤â•wJf9eª‚~õß‹¨sEfÐÈ,ш֫(ºaTä€Ç“Ñ€¬ŽO³°)@Ðq9 §?yŠ©ÜÈpviÕ4\'Ú­Çhœ^íüC«£4=L{Œ,-ëÈ/ë¿¥{õ ÒŒ:çm#à|¨WP“ {°d„=³µ0íÔ£ÔmTÐ-O]ÒãNïó½ZŒŠe•cÏwd…3 ü#œ»T€ ¸ë3à'd1­ÑÞqf>üòˆˆÑ"î£eQ>î0gMƒ?JeŒB*Ð{ ãBèAî~ø³Èý¥JØöÎI—áÞèÙ bb„Fr$8÷¿Æ÷f¸÷Æ“wbûûlú ‹lß@À¾ÂHÚ6l×§PM¯©,ŠÁ7aCžªvnc_—ªsn©âÞóFaxb´~º TÁ §Ãµ3L9'€K.ˆJáÓ§J½•²Œ:š äÂæO3x­Ñ‡Ð·ë¹8§DÆ9ŸXV[†|Š;œƒ—µ÷è•A•*Ãù‹—èÎÑ~_á\ØsX…á_ÄÏ ¨b± ˜‚|­f²>ÕCØï{Qíz^MqÚ"âÎEÜTVï'ªØ¹,cx1G) ñIEÎïqÏàXô1#‘ÿ†{÷$«$Ø÷ðQ0Ø–a¼½Ãâw2L9à3`Ø%zurþ.«é(ç,ç ç'çç|4qÙÀ¶ó´ ÊæÝ:ççv’ÝG cíÛ=+ø¾œ_ƒy°,×'êù ¶Ñõ òï¿rŸMƒ™k›ë+Él³ëÃÿÌsôIäGÜ ¹¸õˆ~À5©®£¯ /¸µé²s’g»ÿ!?Ÿk‹ëb0ëYÈ—EÎõ t ž\'Ÿaô®ï>Éÿý±K2z$'άдfªå~àÖ3êíeî[Ü;úãŸÌ>æÞ”Œ×"×SŸ­%ˆg6ò+×Q ¦ÑH<ýSýA(âÛú8zÇ8FïˆzZ›ì»xzÌ9ëö]œÁñÐ×ÐQ7‡¸çÆœÇú{îFúŸei<÷^í4ŽïªÕïÐ[n¿‰:Ê¡9,Ïóªýç2-PTÊç*‹~Àsj…sEùé›jTb]žÁö¨Bêp÷Í£råwþªžs^—7i£»Ž½j+U)SžÃx dAu¬SóÑ.µÀÙ ¥ —¼J¡þ³X†×1çÖôŸ©VËwî žÞtc×_ÛŽß³ÝyÌSƒûÿ{ºPëYÔjŒvn¹¾jv>výŲͬËÓèÖî£UF!¥3\™¤¿Ø|Å5ä~Ÿ S¿ŸÙWÆD’ú0ú‰w‘÷eŒP£ñ3œƒ³ô<*ñæSŠÖå¼âöþU㛹^ öcTéÖÖç¦Ì¥ È›ç]Ì…ÿN:ïj·œwû¿Q`î}u<Íí‹òð· kÛ‹jÌ/`¨L|³Þ¤œÓ W⮇pÞ{Îv>Ë­Q>{iâ[ç~ù›Ãµxg–áœ'Q°ÁýæUÐ(u =à5ZžÌéÁœÌq}ýü:rv!¿;ÐÏSQC+TÔ9Ïý=ê<£ð”a˜ [Fùf¡ÏP zß1 H–z¹öˆêñË OL¬AEû· [ï~{brŒºvÞ×ÃrKÉñ@ M¬13®}ÞùÿòÖ6Š`Kì““}ûdf^’“ñ‚Ñn*íX«•–¾#Sì€öÞ%f›ØŽÁÑ8fKKÍñÀóíP“õ†È§ú”·]5³±£q:¶ÎLXÔ&f$¹<:ÒÌ.¦S 6[bÕˆ1tb’ïZ6 M„-K“–XG›0“*­ÖëEfOÙ¯xnJ«ewŽy#‚éÍÍxI›ê’ ¶ù~MD6üÒºšd]iƒð~ûóD‡8 C¨·Ë~ýªy¸æR“¹¢-cÍ:Vñ¤eî+i÷âÃñÞ°Z#˜µ5}ú ë‡Pµ9Ô¡{Ù-ô]vvK§YЍ±v“¹¶uÛVeM›ZͬªO¸JpÏeeíìFz¶´ÛÖÓ5¼ ŠÊ¡èUûªYÚ³ÀÒ„{#r†¼ áαƒ#@ÙvÐM±ƒ_Ýg¶ƒ[¨ødÊáàÇ]6ÛÁ4ÄúX‚ŽØA?¨ÁÞ Úïê?¶ƒV»x‘‚ìñ}»;ˆÙmvw'h‘ü"haB~®šew¯´:qÿW"k‹CÌÛÁtëoAÓºÞa'|ô/Æ«=(ªóŠßw÷>öîëîƒËÂ]ؽ»,0,q°Ë²@ÌA;ìê ‰JÄÖAD¦ÖD 1 1ŠK;VдvÒ±1Ô˜ ¤3úGÚ™f2­ý#Nü':ö1#iêi„ž{—Ö™ÖNsßãœß=÷œïœïÜsaŦ×3 ÷›ÞÎéÞ9ŸùDœJ¨œ·*îüÐr"G¾ÿ>ìÿIÀ±õ?¸þxTmñ,ë¼Ì:ßfUD¬)R)ºÌ¦Vö¼ôþX{Gz^<]¡ –óâ±´«Ýµ¥cžÜ"Ÿ4GçÉM¥‹ƒŽÛÉ­æg:Ú¬5+rTAßÊÀnRVŠn¨°§U>Kn 2øM†#ø¬ƒ QaW2Òœª4Ôµ"´§*ÍIÚDŠCðxTyú¬Š£O  ™ãàP,íVpS‰Dstª7¡`¦Ê€˜J”©¯{ë{1þ—aß˼F÷ˆ?”Èh<Œê+x0{ôU{Çt‹ÜÒüz¡þ¢ÌžSg P*ŸE-Í;=Í]Ñÿƒì"Îo‰œ€5]A>.@þÇ¿=ôqÇŽHFJsO{"®cŠC‘xÓ–L?Ct<Äo—$Ç#¢°§A fý©†«Òúué|ñ4už …ì>¡û}š ·‚^-Û¥ ÂT´ȆÖO4*,¨”–Ȧ–}pµ,-à +,ÈfØ„³µØÚ¿õ±—Êï÷ ¬ 3ð”&Í;Ó.¸Ã¯w¥]žhš™{…âöD‘R!Ð jh ¶VSØÈ°ç &´æ<…xBÁr–¡iN 5 ¼ŒÑî½yBÝ·V¸WÿÌýz³¥Ö_¿… Qîò²r³löÊfYƒ¾qQW¿ ÓèÈÿ‹0–?Åð™×!9œEÑòÌÁuè$º‰à/¬4× öö-¢ÐbyY°²:P!fÙ»pc£¯¤îI_IÆÒHƒßn„ S 7ÑFHe=Ó,ÇÍa[X‹ÔÚ 3 *. (Žehé9ÌR<¢(­Ö„Ö!rN©1W£s`0š#§´ZßáO8ÇŸÜÛ糃9ØlÉ®ƒBõ0Y´ÔÓ«|…÷ËËd̰EÁ†‘ªŸ]Ôà곑¥1ÍSûZkRó_ rÝ Õ§´ 9ÐdØk¢2õm½&Sá¢NRç¨w©+Ô×#å TŽ#7w׆õ4e£iŠ"t®CX€Ï ›µÒHp`|óÂ:Lô”ƒÎÕˆÄ4GÄYA `‚vv§H–º—É5B²ž2O–Qž²Šþ€ô_1æáÞúÐ⢹¶ì1®ò û¾Àwåe(éeå V««* =n†õ4`uéY#f1eV3øô±·«Üßé W×|pà䛢ãøÝ¥3ƒƒJM÷6'¶íxáµ ?ã`kÍšs\º n@ýËÕèi ªFCaÑFe$å5øü•T­?JÅü|Þ~eá@¸Âe鲋Å[EoÒaÝu¯á98'‡3MÈܽb$¯“OÊ”SöÃ`½Ü%ï‘ù=üKÜbâ "Tcø…? ·“}¢Fú“Cɸ/y{Q1ƒ)Œ†ÇY61PQmY1Ô]TXU„8Ë«Dš2µ(K¡œ ›ò-Ýüõù5å±™¡z¯½1¦XGͦ²-™‰7úY ν”Üwª«‘·2í¾Ûÿyô~Õýžo¢a¢úíõQ¯ÝníUÑ·l@£ád2Êã:ÛÛZpJä|xy#\•Ý "¨ :ƒ¡ L¹ù”.þIìnìA cc¦XM¬5Ö#b©rÙ´{º±6Ò‡¸ßq7¸[Üß¹/9RËÙ¸f.Ä}Ÿ{#9чõQCÕÅ÷M\®×Ç.ÜåZ„o‹ÆHù©j„£~E-R·)ÚOŠ’6ÄPjèÿö :&ÿ[b–©µü&µ¤Ä-òJîKÅIŠÓR'«¶,ÈH@B .¤…©‚ EB”‚"%šýúÇ„òü(© ˜‚H¸­€ M6a9Ó‰I7ov[¥œU3„œß¾W ûxM)¤xOP¥Óy¨§Òç&F.ñÙ«Òïž~fýǯí2hAŠ™Â­ Fcî8%í_zíhYóŸ®ßf›Ü& áQ§Àú„Pªäu 8šGÚ?9ào;°þõJ¼£’_Ž7X¾^ãê›ÜZëâ4Ã?º{yüоg“÷ˆÝ„Qv\ÓÞÉÐä¥ðåìRøìâÍðGÙO·³wÃ÷²ÿodUŠ0žVeËÂåÙšpC¶5Èö†wd¿V貎¬7ÊÆ³'²$óé8pŽïÿå8ÖÂól«Ê29‘n tv´3pÛŠkæ"oÁ5Y,×ĺžÕÑÑàª5=žI_I_O/§¿HS|ÚšÑ <žS¥4V‹Û"Z0Ë"xSv¥ôÞ”¨ŸÖˆ³`vynæÐêÙÔËÓs8G.€……gÙçÙSìö ö*û{‡ýŠe¤ t hœe v_+ç«YÈ×î;sŽøhÆwµ7‰ÀÙÜéE í'Oš¬9KÎdº`„cp¾&×{ô£J—Î3ÐÏ?’äI¢²s?¯öm0®ä¥ºú0“Ï|[žM …®åó&)KWLH¤…$*%óG[Œù~¥(Ùj)b÷µ¶N²E,üoÄ~K±H®»2É])e}~Á¯A‰º©×tôø )S%dI W :å"J:émÛÄ™JR,åóÛÏ€¤mN[Us±‰J(¬,žÆº¥D–Ö CÑ*È$FÚ K6ô,·qÂ'tbŠ †•ã" / ÁëFÒ5r•Š•#¹¢DRhô¼ÉŠnÕ:yGÉn“–5BʨÌ$€žÏ€I¨ªõ;™ ‚À•$HA 0¢¦§ûéÞSÝš2­æiÝŽQ:§ŸsÈÉW«Lm½óÌîÞz%ÍÈû&>LOG„9áá²°(|&|-Ð ¡Dp ­BXø«@î|XµÍ™j壹Ñ~Ð<#Önω‘±Èþ‰8Øú\]ÎáÈÙQTBÙ÷ÙÛ,ɲK3’ýfÙeY"7ÂíýB"'ók™Goj(‚|E"¸ô™Ì rtÍX(¡<òŸ õ={ö³‚–-c…“µ[j‰‚E6a.UP̤¢ ÕKrA4I•Òá7x È(…F‰&ÊB´Hí˜Ô;=~B}S!çÛÐèŠ Bá‚‚{$?l–Qt-ZM.¯ 2ZYü¢"X{{K5Á0„²«”*ãñJÝÖ+{Ï6€ñÁ'êxõ „l * C«+†×_Úß„†.ËüÌÛàlÒÚk%ÇÝ6Œe|d¯=þ|€gTVF‰rBAîõÉõÓÊéRR·­¬EžíªŒŒA‰tLBBc ×óÔ¹×ì:‡œ¢+ÑIIÚ8GòüiB‡m©FK€Þ[Ï¡¨Ïf§Ã[Ö_§]ÆB1¨Rb0ö`Àì–›H4å9AqÈ%,FâHÉ/müø5Q!;0qø'Õó®ùÿ]¶±iÜwçw<ÜÜù€0>8b0Ϙ`ÀÆØuìœù)„Ìiˆ»Ôl‘:i¦:Móäªq“6i݇ÅSçdí¤uÑTÍY_¤“ªIÉ›lÒ¬­/¶´R^¬Óì=¥‘ú"Éþö2ièàøŸ¸ß}¾Ÿ¯óu×›žeû²cÙ¹ìZÞ¶Üþ{%¼Yé¤ N>$Óä„ëxG5"O'ÀèèÐP:•. Ã]ÅÑÅ]£»öÐæáÂ0:<\d&'» «`4ÙÇœî]Åë+BXwXëIFƒ0hOOPn0µúc M¥8\êKûßL•ã^¸WW«WoUïVïUÿ^•Uoµä(ó _ÐfU\pW¼Љº:ˆöà÷Ôô~¬ÖeŸ‚™*LN–SiMjò@*}Vñ´ýè=>O](óêÚÜÕËDa­Öpb`õ€:ŒáŒ¨ºŽ\-üÖˆè6ckPᘠðt¨ðã_§Ý„s­ÔÔêm³íØ‚oQÌÂRCgÃ{Ÿ¿´ÿù~ü|¯Aá²jZA+ØÖ~²”{á½¹Z ŽH”»SàNïÆý&–pêc®¤’¥1>³[?ÜÐáUf9s”æ†1üag˾ý9Ë‹®þ†¶&8H$‘TfZtÓ—mI«ŸT"J®§4ì³úD6ímÂHL®5õ«í–Ä[{ q™²wvL0’ŒNÙªi{wÀ„ëÞ,¦)Š¢&™TAë#ݯøP˜wT;çkÛ£­î>‹è»×ŸÜ—”z%M’NÉäI¾ó<¹"½¢\A®I¯)ð/Qâ:¼³ÉÆG8;ƒÎ¦OU³=N(ÌÚûû«×Œ…äFÔ½á‹ÎOÍsFõ†aθ§8†Ÿ›+‘‚"¨˜ŸSS§Çèúú#ú&}›þ‚–h@g÷'iHóžžù“X­gp|¬Þ8oÈ‘ü£NDÅLÞ/¾©¥–fPüÄ­v,be½³³Áï©ßmµÓnŸîïÑô÷÷d.Ó¸†¦ñ-ùƒ{ýjÄÓê9Wßòõú’3yøøïP…Õ¬ˆŸÀ&"b{áüÖpÈI&çÔ5ä@ÈØÚh X (†Ä%aq9* ñT÷=1ÞÄO µàNäR0$Æ_ iO©´¦Œ©F-㎘H©ž7!@!£tG8¹Œ"{.РÝ1rlézÓŸµc»bÍ.Lˆ‰^L$ÌBÕ²ÓÒHu“ûnõïRÙÕP™‡Ü0*UÖ@ òZˆa¤¢XÝ“©P«0ÐizÆq aYKÛ©Ë#°ñ2NNý ¼ÀP£mŒ¦¹fŒÄ0 ÖÑé¶7F¶=þIë¥N9†;1‚ŒÐ¨\me.<~ðK‡^*gÔ .“ág"„”Ä>g»Š~î`q%Þ¢µÆ Oɹ¯*ºÜö'_aR‡¤WòÏäìï-r¬u¬y×|kAÙ~•|›z_ù¾j‰¾Êü°a©ñM÷ž+Á·C—;/EéAÍ;(G¡$½N^Ž.“?m_‰’%óñqÌÐ:üþ2«Õ°¬ö5ö.‹Ð¬‰u³ 6ÃJýZãÍð÷?Er’˜„‡1ɹN¡ÖyQ1\ò5ò8ÿµM6Ú¬e;ü˜^5“‰Ü ‘U乤Ò=ó™èõqóbÄ=yOÍËå×á˜1Öá&I̬Wëð0_S´­™„3Qq¦®œ p[Ùåµp D€‰íΊ¥ÖCài5¢3ýÏT‰£åYFÑï[ã'›­m4¦pYö7¨žžîÁWQªU«€N9º½|†qqR"=xþË ‹$FA Á^Í´Jêj± šÃ­œm¶ïv`ÄÍœÈÓšíÑöd;rÅÏTâ՟퉒—˜fþÂp¥]¦iŠjñê­?ùJÖ'µHÆ€9ùáØé@4Ÿ´";‡ãn·@IN­Ñ”³9M6›‹wwOò‚†ç…¬†ïΩ…¸3J6UT¸6::7Bss>D1æ0Äxý< $…9aUøµ°&|#È ¡O@º…8:1žû~îxî\n)'Åsý9$§Q£Ö,?nÏeFÍ'ùyþ3þwü¿xÙx~¥“*<˜Mg'²‹Ùßd¥Ùì*èKãxVÇëày¢fCÏÞ$RÞuüËZ=uÅj޽YFÙºgCǾ_—í-Åù?ØljM30¹*’|Eæüµæ'^¾º×{!·)0qDÔm1¶ ¢àj_øu›ÂŒÖ%FAp£A˜›K×i+ó‹îÙ è÷ªkJ·P Îèš)t[Ïæ›þÃt™Æ¶mŸaœR¤$Ї$J¤ZeË4%ê°uزb“²å#–_YÓ(Qb/qÒ$F’-X[{IšeK CÒ¢M†û 膭ëÐzœ(ò¡é>®Àº X‡î@»-Rìð² ƒíý)Úí Hâ!Âû>ïóþž¬<0|åF×—Lº¿Ó&“¾1©æî>ãÍ~åñÞT{ ¥lì¸ E9'îÂ;nï¼½ùÅûãq]“SR¯=4uþÊa0òçSÚ€ÓfsP¼‹ æ¤"Rvßæn}ï©}ÝeMÇÑ™kù ýŒÇGÚ°µ¾…ب­c‚Ÿ!'1{Ãæþ ƒd6:³vÙ/S¶À?zé˜É-{¶>ÄN`AdYãœgq79Mγø`>roüÞv% üÌñ¢{œ­Åkí5¥Ö1¦îÎNÌLÌR˜›î¡K*r™ˆDŽ+¬‹eh—ÍÉu$SÓ3*NŽ›WPŸ¢ ©½aG¯¿]Õ*A]-Yˆk视Ư¶’° ˜OiS²Ê 2­UžT.+Ï+/+?QÞTÞŠdÜÊ%U”5pÄð:ççœH JåLY/cåw¹55=L.ÿµ©&!‡èïCœÑÏCt<ô|®k9Á··hò³·ÔÌbMâð!M¬– ŸI²&ûkyð‚©ˆ@Кì¼Í»öÏöW·e'<Ø!'“®›¨¼È ·äºÐ‘E‰´ÇáéHèiÎæJIS¬‹¤HñµMÈ ÏCJœ8}"p0–Vèë³{_:0Èwl^×಻U£”#°1EÔó×Ãñˆà@ßñ'f§Šˆú~¼ôÜÍ(̹Á–š—v‘.åªè÷¹™ö„äâÇøÓ´ Øiѯ{®g.G:O.¢ó«^¥ê™êsŠA–ޤõRñ6èEG¶>F_ÅòH9m¨5g­í*w5dƒ$Ozczv„vMr“¡á˜ó÷lðF‹ Yî:"")ðº°×½*º|ŸÜ€ $Yj΀h{Ü@2°—f¸{hZtõ‡ «A `´UÌ&jZkÝ]sùC;G›õ‡øÐC÷³\´StkÇØ·h’S2z…#Y[¾v±Ê·eÔDEòÓè×(Ò®Û]ÉÉÍŸNyéDÏQðNœÞ''SùMCvwFd81¶~kóáÄ@faŽ<%!ÉáôpÖ&µH’$K1©UèödøÜ„¡QK%ÓÉŒšÕ[tI—õ˜ÞZSk‰áÉ.R”Šk#6V‘DY‡‚¸nì^^Ž«¢×ÛÀU ƒÐ mnRmZ(&˜CXTfÚhsT¬“î~Ì À´â&Á†òèG‹vEýtØð;~ÐÁÚŽÙ£a'í¹Žµ½èvÌ‹;¢J‡óGNO­¾¨Zº¹Ò”ùÍ©ŽÂü+C]þø‰^ùÚ@} ìç»HbªÞÏ¢lñïÍû3Jo׿>‚¸cw]˜è¶9í‘ßu{ÏŒæÅäžùãú[/T|ôÆL¼ú§?ú£½y½õ½ÛÉDöþ‰­? +˜Š$!Å|ň‘A¦ ­gë'²ç³ßÌþºí‘ò·Ž$þY"-R¬—f5IC5ë®Çb•#©OXÍ_g!Ÿ¯c«èœ`6¤ÏýÍÆyåKõ¦5m\0ÏÍŠ—Ìr‰#¶EUn1ËNmM›i¦4Sù,`€Â›fd׬ûß娿÷Ä ½^†b#OŽMâ-\$>Qs¶Ž´wŽ•äYfy2Z÷AΊùÃñþjœ8Шª¢“ËïÍ£g³ú™ìÕÔpÿÙ)GDšéï>,Úã1ª{bVki—ŠÏÌ#¶5°iÇ(è5ä ò4ò†!óý“Ëh©Ph ‹>Y,,ÖK'ˇ¡“Î.–ðÇ8,ÕO3a)Ñn-Ć¥0?Vˆ…z…}jŽ££KgÛðî\ŽÉ8fësãf¦ŒY «‰ÙØ5¨Ù9M[Z>y½\^Zn™æÇûÞ,¯†šRfÃŒ6 ›en&"+ð@q7ÌZÃ_}Π!ì`"Txì8¿ÉŒ°ͯè¡À#Ô,öj˜!Æâ`­`-Kò¦à¿%ÛS_;{âÞ8ïðOtÅ£” OªbG2—““žŒÓáÆìn»áXñ_épçâ·÷ìÊÛîÔ®õ¹÷«eðý|›gŠÓ ª6s®kó»= 7ãMêZýNÐcd_H ž*•1ª³?LRl ¶‹QZù±ø®žÙsQžáƒnФ ¥q[ߨó[H˜ÿBV£Áâ`n_º&óqZèj‰hr¬8"ôJñÂT±\Ûüýt¢ã‡9Á†ãÖ+ù¢ÝÝ=!/ß+‰@0i’ìèÖ{Ø<ÞÕñÀ8„À+Áª419q·@ é’”ê¹Ó0*ƒUÛNXÒKÚƒã!Ý74¤÷ôÓlçÊÈ}ðŽdëñ\ìv ½©ÔËa25ÏòŸá'ùK<ÎókèdžäTuCß«Ïé·ô×õ_éëºÑßÖÑ)èú»ãÎm…9!¹üÓ¡0vYð°n1'¾M– dÎ›Š l»  X´Ù·mx0•°³’ÌÓUeÍ£Ù_´© xÛœ\KJ;xÉöj›Ë‡ËL0½ ¹ƒ×ç*zn÷—¿s&¥ø"Ñ/ô¸8¹2]‰„oñâµÈ³A:ð?ªË>¶‰ûŒã÷»7Ûgûîì»óù-¾‹}vÇÄvìØ‡Äò†“‚¸j %”òÒ‚Sè [[*^ÆD5Ô º•V‚©Œ©¨¢ ¶m*šº÷ªeÓZÔu*b´*Ò 6Ö¶„ýÎNB«œœ³Ë÷½Ï÷ù<¼‹c—“ðµ°6G3A àzYylö¯üa¨½Tžšûý¯TAjd|Ž0ÛZºùö™ˆÅwà—ѹ»d'Ë8"çìv¬ywŒµÙ13캑»×Ñ1ü6bC È«Z¶ÀžcyV𤑃o¹?Í_ä1žÏ©mJ<ÞãW”ŠšãU5GýWÂÀ> `üy0ø–}F$Ù6ÐÏ5{ËLšRs@Éù1•<æ5'‚ôh¸êU·«§U\U¯kF7b¨Ã[NFw>W*³‹ç†ß:kàV–V…i”®ßúš£aµÞcÀ|+š\­n`‡©{6ÇÕ²¯f”`"àLȱ&Š»–4çVü"#ŠªÉÛÙçòÒVÉj¶ ¡‰pKCuy&*ª?ñP$~2”MHÍ\lnó8CqûC‰ÎäÛ¿'’ösiÉjã+™ç¢²Ïµâˆû$ïò²»—pÑ[r;iÇ=¢ÐΦØ4Ûá̼c7uL€²¹l§ÆWOçÞîú­ýÜ»Úß:?éú¨ûîÄÍ­´¯Ó×åëöeï„ìwÆ»âÝ­…ÎBW¡»PмšOók Ëš4ZÖ¶Šˆˆy14°$€Hˆl.ö/Ó¬ˆWÅK âøÙÒ(_*V¬;¾Eónw»CÄð+˜Æp°e§ƒlI_@#Ðáß ç©"•¼^G" ýMU}øÁ›‚pÕ;,òQ`=5ŠŽŽ~¼c1Òj<O é0ÆÛ, zǬ¡·fŸª15 Ëù[ÈÕ!«Öõ<ÛžMA³`i‚ÏHV¬«^S½Gð“yÆG£kþOîUë= YnžÊ¦V*ÿ²<³-lq^Ø’"°÷܇ =jø×3.*ª ÍêH$3è0™Â6ÆÇÓ±˜*îybfmr)+áaq£‹ö9D?Ó%½Ø©u[xEL,mzeo¹¯±Qëü§ø ¯ä Ïíø¤j¥9ö€Þ•³ëNÛ‡†[J±P<˜Øœ é° Þ0°yÉöUÛ_5K±ý=g±š=û}Ï÷‡^>â÷8\ùõ—L¬qMÄáu5MÁ»_¼ûús"…Ä‘—µÈ•$€ÿÇ‹FY ƒ•`ÀP¢ív' š>«DyE‰Ö‚¦@GXQ†¶nðšpÌÈ%0Q + ESV*•ÝÊå¸òŠ2­|¨ÜPìˆrIAY(ÊljotéÂv벎šDÖ5€…¸Vaïå`È"idJ õEËúy[„1q Cöão°½…˜„~OÑCB#Þ˜éæ­¶¦%ƒ¾Îl(ètžJvT&E”v´ßBOàoÌÚôþš /‹Eó÷ã Ø¶œ‹‰Œ“ŽƒGvýò/c’±³Æ\ªÜ½†=‰å‘2X©'¸^[?7è.z‹¡µCesâ ø$Vö·HmRBJJíRÊß%u‡‹i[ªØoë—WËÒæ¡ZþÚír¤uC¥¡ƒ2qyÁóB³Z–£=1m¹hA-DOĤdÿü÷ó/æ—7¹óqxŠåÏ£×µ«ËzR×ôUú„¾K߯ÓOéèÿÑm¤îÒ÷é—t\7„tÜØ>…9:dD9U…°‘Â"…¿Ýóكш¶ZYhå¸HLU*U(NóHÖ÷³ºÕ2¯‡[¯h0(ñ^øÐ& |ž^Ø`j"ÒX ’6lO°v¸ƒæ½”çÌdåò@û’`7%œÄMê®i0[5»Ý©çUÎL[Ya¨¼/ºuÔæ¬vN¹J"ú†™< @tߘ`NÎæö”BÇRK)ËáÛQ)ÜàtD_ûÜNÚlg€º¶7,ð¶Ž ë`,è°3öØö½g^÷Û1ÂL˜ý=ÊÀ†Ÿ‚sô2–BX¤¹©ýZ¼íþ¢áßq(pB<ú§kV¼¸*]•ÍkÅ’ô¸EÚ>åÚ8â2÷¡Ë]#bŸÔ'”hq“Rò‹7à%óKâKîcÒ1/úœ&à€Ǩ!ðüÀ `Ðxé5^rÆK&܇œDî"8ƒìBPÙ‰L#D~«ìwÇÆ8Y Q Cׯդq! 2 Hãy²_TÖWÖ/ÕÙêˆù7?š­B£®Âöõ,ìJðH-Dêڵћq.Š^žûüG«&G»igÇG6Þù_k"ž(½õ嵇ïÓPõúÜŸ|v͵a‡»ýž;çÚbm:8ñX4Ù¿ûÝ3:wåÎWØD6#Ï"ïk]ò”¼û(rtòèæ‹½ïm1E"²¡Š{Ÿx´#E¶ [í¬“DÅLE†''©¶áá á)*ÒÜœm06!}bïw‰§•ŽêL–,>=>`] «ñÜxy}­"éMåõÌÖÏbäyôs…¤¾¢P+5L¡”¥R0Usɪ!“·fÙ[ƦQ¨Ï6ÃjRñoµ¢Œ£n—Æi[Ýg@­ k?óXÓ”ì<q^ø¾Ô<Æx€ÀÓh ¢&£ ]àMðÖ3 )hŠ´‚¦40読µDê-\_23sŸ…;%;KÓ¤•Ý$p¶”Ä+Ä€àì°òa‹Ù²É·ÃÙì´ß£VÒî5ÅV&:r«†ÒÛw<ù?ÙeÛÆYÇñ{îÕ>ŸïÕçóëùìÄ/g;¶{qlì8ñ%nÒ¦qç´iU%7CºŽ¬«Úfãej™2¡ml¬STVbUL]º±¬üQ hƒ CRA  2„D+¶„çÎq*@¶|­s"ÿ^¾Ÿï74©§Ú¢¸‚Ó!¸DRf¾µ]¡>`“íKy#á´¢gfi“Ô¡B6¶vRŠCGíN|p4¹Ï¥ÐãÞexˆ ÊÅÒ‘äçj ŠŠ.–ЕXCÁÐPꙹÆÅ—Oˆiž?°ywhu:8cÍy -½–0ÊkVþùðYÑ7 †¦Šš_ÏE•p5 d6óoĉó–@à·aG[½Úú}3 òS3Œ8þ&ÓŒ>Ç<%sL.ºÀ,D—˜¥(Õ´5ðu3àvyÜn—KsGq¡?ªÅ\nš­+-Û8½h²¡yä ) &‚CÝØó:9Ÿpù×Ъ©yáV|~ß®ÌWÃè»õ†q¬› û0‚—ÞV|@£2bó\囤Ms2ïŸ%œ²'üp,NXs|ßÖûØel™…4;9¹DǦs‚›ðì—[ÁV¨¥¶û[®H#É7°‘QSÃc5R£ JQ3MC ‚ÁÁà =¬·k1O­d¹Ýœñ4›3MyFÐk±Äˆ“)›£Ú¸"‘l?™ŠXî´\(¬2¤f Ô€oË@Wê[ƒž5´‡Ž%t¬6#ÈØaª¬åkõûj'jÖ¨ÚX4y²y¨Ùi>Ö|ªùë&Ù|ïtëm ‰°+¶õìN|¦ŽtA©ü·ÍزdYÏžµn±iu² Çä=¯i°7v(jwS1ì÷Ê=§)Yе’ã¶HY©q¨žÖ’1Å¥ñ—f’š0fàÉÓ ý|Ã_ž˜ I #W¯ EªIÑ­–ëýnYÔ¿H¢âÈù_~&b%Š×¯LJèïÙz´?@SêwrJˆ—ûÉÐÒ‡¿ “xâÔ´3ùé“cW0¾þÂf¡B¼Xò³ÄÑURŒ˜¢iÏäw4Á{DÞ7ؾ¬²œƒG¶þˆ9±q¨?Ϙ@:®¦±2‚¢å" YQ,{ŠÅrœ„bsõõ‘Ÿ¤×Ú´<Í—i¬µˆáS€KER­–J­ã&íD‹|Ñ,bÅâxáµ±^Økgl«Ó>³!X¡ÏjTý0Ñõ3’½K]‚>>m£Ñ+?T©âNsÐÚ‹]ý²Víûš³ú‰ü@0ëI̧(ÖK¹ˆ±Ïj£­„—S|¢GÖ÷8[÷„¾“³œ“rzƒª _ûx>¯g.þé~9Uö"Òî3ODzÅÇó_q×ÊÅ›w÷Å]^Ÿ> è¿dÃ"ãìƒ5·þ†?†å‘‡;¦y=úï(:7?ßfšå¸#ý MÇÇæ̱þX4Ú0¡ãÐLÆÑh›;â÷pÑ# zÁŒ;:ªq¼ˆTÑÄj†T¬£.­ªä´uœ€ÇC®ã8†¨S×η‚Smµrò?NA0˜[,¾[úÒí@rZ®Ãr¹%äÞ¹½óË­C*´­‹Å “­^ôžÿ·0ÝóæMŠåk5ûh½8àƒ­Y+ÛfÐbÜ›DlãšJlóÄŒÒ[žm¤'wÚeÑ¿G d¹Ë|8Iø§î%<øÕo˜äåX&³>ê<$ #¸ÂOñµ¾¤^_‘?~v,¨²¬V\¬œb‚ö²Åûž}" I«à¨Ûáç]†ßŸ/9îso¶*zª8ÝϼÅRyŽõ’ò;cÕÁWUÅ®H’ÔWüdräÏ ÷«g³Mĵ¹Cþ‡ýª‰i"ˆÂßî¶Ë¶.»­-–¥µj"X mQ@i ÀŸÐFAQD%þ@L8¨ñ¢‰ ‰žŒFÃAMŒ‰zR/r2<˜c4ÞüÃhôBëÛîÔ¨1Lßä›y3ûvfç}»³ïU[L'è=µÇÞ;sM¹ó ú‚zK¥§xq$ûâ*©áfe¿Ð×F§l¢)!±-´ãtp×Èøü¾p[ÇÿîÐ@˜o(«àjŠÖ<Çyéì{wÇòÐÍ×ñÞV…a·¹Yji‰ÚrE‡#*ÖÄäzg}EX:Ê%ƒ&Ñ[ƒY—Ȉb´#u”˜¢ÿÖ¶·êª–¨V˜¥›TV™ôAw€büÊŠT¶Å ¥L:¨'V¾Ë¬©E¬à¡á1§p?ôÌtµöïÆ ‹–,-.Ñ:eU£fúb«ÑØÔŒu-´¶¡=Ú 7uvaËÖ¹×þ'¢ÃEªÝp‘ÆR]J{¨FÚ@ŠnÄу>ôc?c8™$[ÅÆO6a²‰j6Û±{0€A %“ÉW³‰¹„\ŸœœÕB@¯6‡T3ÚŽPQuž´e ã:äÓ3«: 1MçÈb@Óu¤_Ðtžôñp(ŠD¼MñÁøÞ};|kÆûû¶ÿÎ(­J!BÅKž“—âØ‹}´êò`ùîyXŸÝÖ‡µ8Hý~bd®yÿÜ–<ÇŽâ#êðzò” e[w²OÕoGæ,]t¤)½t‹^v>‘0-?ÓUO‚ ½?ÃM‹GY“Ü 5Ö~þÃDàr·\÷yj6x] ¥Ú#á{‰ÕSG B–ò6(<¦fþ&ÀñÜ‹F endstream endobj 319 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 34 /FontBBox [ -558 -307 2000 1026 ] /FontName /BABDEC+TimesNewRomanPS-BoldMT /ItalicAngle 0 /StemV 133 /FontFile2 320 0 R >> endobj 320 0 obj << /Filter /FlateDecode /Length 27724 /Length1 47524 >> stream H‰\U tMWþþ½Ï¹7‚i$"¸q%‚h<âÕ$ÜD¼cF‹`%‘„ Ñ Ë{¨ SÁ4ª”N©0º&WñVLuÚša,,‚ÔÄ#ef•ÎhrÏ|‰®i;ç_g­ýø÷¿¿ÿõm€æxÉc~Ùkêˆ ‡ƒ¹::#7=¯rhëÀ"@Š3æç;Ò jª¹wðòš–7=÷Ó¤Ü^sͼ:=gÑ´‚9¥@ÿ2 mOvVzfÅœè1´—Ã3}²¹àg´zøã¼SvnþÂIÿônÅyžózFºJ½É½­™œGä¦/Ìó9æçÊê¨ï˜ž›5dFGàÐ8âÙ•÷ú¼|âæw(ªa?onVÞ¬¢±@/ ¥Ûü:˜#ÿ`½më6bµj<í:sœž™V•ö£µN/þ¿P¬B'Ô`Nb ¾R ò2&À@´’~!¾€)Þ‡#  Ç7Ò%艒ˆŠ1؆ŽÖˆÇ;Ø.C­ûXJ™½<ý±Ä¡3FJ’u c‘lâÀ¼‡÷Ÿã-Në&-ÌÃoqW`!›Íí´’Œ_a¶u“qIRd’Œa˜eØŒ8ŽjyKN¦•†hLÅ\±‹Ÿ„ëëcĘW›°ÎZáKý´úHu3­o‡C¬lFÔ½)³ñâ†J´Dñ®)XŠNŒIXCߎÈ)Ñ>V1½é‹ ,G•,”S*ļj>±£ý‹"ÒBã3œÁCZK”q:×k†À ÝÀ›VáMü™‘;M9+-$D†ÑògrSnëÙú-ÿµx†K¸Ìe*V˜½êWXFãhcÆ#ŸH˜ÄÉ$žÝ¦¨ej¹>¨oáÆc+Æ:"©[€=ôë*ñwæ+QFɵLï7ß´–o$²éÅ*ìÂa<SšH3yIÒ[úÒ³%rJn«vÊ©&詺Ä\g-²Ö#„µ2Y<9+±‡P;xˆZ âÉHžŒ•dY/oËYU¡ÇëÉz“gl2ö§:³¥yÚsÉSŨ7ØéQ”)˜†ÅŒuå ®‰–¶Òž–ÉpZJ•i²TŠä]Ù)»å œ“‹r_ËT Z§6ª£ê/ªB]ÔítWíÒêr#ĸfü`O¯oç9éyl5µºY½­"k›uݪmÌB0+>CX]³È«P„wñc^Šó¸Ìº»Õ(ÕxÂü 6VS"ê(Né,ôn¼LR(¤X>—ÛR-u ª™êHéªú¨áj²*PTöÖN¯ê÷ô×ú¹±ÈìEÙk0ŸØªí¡^åu[ëozà™áÙäÙjE³m¬²•ÙjìÞö>ödû8ûûŸìGí7ì–WgÖÓ(¢ï‚Ÿ¾ 2ɈTEb©2ú}Båë¯ÔFÙû3 ˜…D‰TU¦«–é;úU®ÆíAd±rC¹Yiø›58§‚ð-ùp£NW'Ô(}ôcµQNÖYDœ;Õ-eW%ÔxÈl¤âUiƒ¯á1ã_a2¦‰ê¦ìUŸ«á¬ä«(VG±Û‘%}‰.ðïÈa탬»å¸ˆG¨ú ­Y?XÅÚÕ|[fè°ŒµÎ©.ÖCvýmYëú9kÿ5-‘Ø»Ìúe‰’†Çh‹Kd¾öØÊªýö³¿4:±ƒžâ°ŽBŠQÅœGÖÿÕã2óõJy¦â™Î€FæÓÀÆäàÍäªõA +,ÒØÑq^øê˜•¶kxoãˆöG¨Þ¥ÞP–þÂpà÷¨Ò#yëoÈOÁEK¹˜A?Ö=O1-ÌD bdª¤ÀÅ$´·r‰|7¹(Κlm1'šÝpAFŠ?N’½ÅMfO-5Kهב$k±ß“‰S|W%Tz±šjÍùf‘¹Ç,5O˜çm=±]»•Y¼ƒïøj8$ƒ±x€ïYëƒÙ=ìŸx¢Hâ–£&êã"AÈ#†“·3)ÌäH–}|“¢_J—.Ç7èÄ×u0{´˜çÒX>h‡~æ]QˆðŒ¶bÔ }\Zó5ôaUãË>HæE úQƒhÏPZÛK.K6wÅÅ‹‹}eÐÀýûÅôŽêÝ«gÈ—»GtëÚ%¼sXh'gÇG‡öí‚Ûµ híÿ’_«–¾-|š7kêÝÄËn3 ­ ÎÄ4‡;,Ím„9“’º7Ìé\HÿÙBšÛÁ¥Ä_ê¸ijŽ_jÆQsÚÿiƽЌûŸ¦ø:b`÷G‚Óá>ïr:Ê$eìŽ×»œîÚÆñ¨ÆqQã¸9Ç!!<àHÌv9Ü’æHp'ÎÏ.LHsÑܾ¦ÞCœC²¼»G`ŸwS›räpæí“€W¤q úïSðjNPî §+ÁÝÆéj@àÖ¡ é™îä±\mCB&þ—õjâºÂg;»¦ ^›˜‡ a–Á6öÚ@xįP¯m°ÍËÈ®KÛõ X4P ZJC„LÓ5!-"(jú0m;QbEŽ’öêÊ(M5I ¤Jª*U<ýÎÝ™em¬B«">Ÿ{ϹsÏýî9³ÅE–i7Ú,2*­ôB±¥E,¯ØFßΧ¡£zÑÙ; ¶xÈßat´nŽZJkŒ÷Èaß*kúwß›q»‹Å3#ÑéÖŬž±]ç®iÖ­Ó ÑTkÿÆbXsåÜš¸Yƒ­{Äú&»É‡bQK:„-u> Ÿ*q¾-F5kâ;t+ͨ4¶™;⸚lÓ¢Æ}Áììð9ûÊ®ÖÍæ¨´Vä±ÖªYý÷‘Ù¸ïÅ™a}æXKqQ #Øþ)éNÃ?9µ±%i-1œ[õÉÈJì‘Q BXz»O¢ÎTʶ”’Ù^Šaø“0ËêÀl·Ò"q3PÎzžoyr†n~F`€qóÆXM«£ÑrŸ7™'IªÁî¶­PÈ*,dŠx#¸SøøeÑ_V\´wP~ÖØÐ!>ڀضÆÊ"üÁ _ðÑÁ0µ¡cu7D}Úr(¼0³ä8[†\KÖF¶t»–äô¸&¿Dü%Ëòå%ÿ§¦M­ÞVnIÓþƒyKÂ^ßdÔ7´Dõj3î;yL/a/MÚœ–55Urd§%ç( RnNæNÔo©¹ø¯ Rw z}`¥ÐHzˆ¯NüM ïqÒ ý1Ïâö4ÇM«<4¶_1¦?Æ=¿©Àa5O®on1ÍIcl5È@¦Ycè5fÜl´»Û =`˜çð¹’o»7:hŸ?šcÕôÆpˆmR9Ø*Se¿!õ4ô‡¥ž¦–è¹~võ4GdIŽÄ+cýó`‹žÓ‰ÂB+'µÜÓ¹‡N`ú€ì¦œsa¢naU…BôÛ%:Ÿ«“¨}PNèB‡Å|÷Þàh5= ̓3ù§™Z™Ä¿eQèôÑYu7Y*Ñ|`=~(þHë£F¹Œze–}4úo©Ó|Œ¯D1d ì2ôuÀa`1–ÕÀG®VðÀ ¬QÀëIô¨w7mö¼NÏ& A69h¨ïÒ­Œš€2[Œ†öØò¼Ç¨ãf£¿ã–²D?Oí¢°×¡½ˆ×Ä92!§™Ð±ÿö2¢þ‚žTɾ‰vÖÞŒ¹!å­ƒ\¹úJè×¢_ƒ9…rŸý:ÚUh‡›5¬gï¢|`æÔÃϱ^­€m*öÍ€\dÀž¥äÓóÒ%zò+jùŹ1Fœ{Óí3A®>Mö‘ýKû$—ÙŸoï:¾ÕÞö+Díʪ€ì ^_¾Œ37’{¹çsª`øÈþçz˜¦vP:ú×ágƒç%ZÆ}`Чž„OŸÒ:ØBÚS´ú¥òàØVZ ÿœJµ\JÃùZ0¶ èÜc.tP3îÆœ¬¾OÙ°Íòp‡g886èóýâ|öGðãÆ4MÌ-Á¯ `Ž9ß}†´iÜ´¯ÃöUàë8Wð ì߇cbæcÝ ‡‡I 0÷R0Ÿ}pÁ÷ä"ÁÊîs\O»€­<ëb<ó¤kV£?—ùÁÜÀZ|uw2ÀïÁ±Ä›ù)âXÌÒ5¼-“16‹ß sV¼¼æ#s‹9ãJæ·àýé>'ßyŠÌñ\¥&öAœÜJ‘yÌ3–Ê YHó™³Ì7WŠ7™ð?ß„+“þà}òa©†(—ß*s1)ñN9I9 °æZí9øþmzXͧ:¥“Vª-T«XÈ?£¼Ÿ}S¦äßSÈ;$8ƒ3Ò3ã$ßó ï°´Ã3D/#–¹êezÒP‡å¹ê°äñœ±¯{ÎÈpÛ©r<¤¡„%#ÕößêÿÈWÖþBÓkh¿ÜW¢Þ'ö’¯ _¼>äÚáÜ\Òåë2äpIHæ3òÚ›Ž|Ë‘· ‹ÀÉ|® œŸ¹>pŽV'ùêò2ŸŠ ë]~Žç©ÃÏu?ïäåm¹2âÔÎÝ™üN±—×y³›9?rŽãÉyŽsœ;~¼LÎq†7D¾Œ¹‰w=E°ïsòò°}PäÃ{·ÆÞ£Û{´2»Gûr›½WÞoïLÖT•prYЭ¥¢Ž^ 4·Žz:©ËÉi\w—z*P›uTÔOm9üØ&ê[úÓøŠ7x”2åýˆk>MRKh«r‘eê&ôj1r2ÛvÓ<åÍR ×=ißPž å¢n®¦-JœÊx®2@éžÇ(èù3jÙ~ûc±×+HÖ±ÿÚVZɹÀ³SÔÞN>.â»÷iä÷©”/Æ\Fn¡L>‹ˆAÍqà¹ñZÞë4G-qÐbÎ?ÈÏñà‰E¢6׉5GD>›"ÖÁž M mÕyßBÎä½vRá:Åß ü^–“_‹c>Þ…ðë ¯] b[ Ž®ôMBmi£t¹O’À½YâÛ¯÷Þ'ñwÔã)ø±£›•RP¾&ê+ÛnÉå³òE»SÔû*R~ƒúørü+àÃLZ.·S©lR©š†o³‡Ðþ•*¿Ž#ûíu:rxô?cÞŸÏtØ>Á˜_1÷~´ß¦ˆò2•z~€~.¸úäðOÌûõ*/P¯ Cr»}\¬ÏØ?úw¯Çó€…®d_]Lèó/É?¡¿U·ýLú8¼¯+æñ˜{„Èþ ›£ ò1:œ–ßÄÜ!: =eŸ—pOÒûÀI¿¥ÕBö ¸ÃR°PÕt ²ò`8 \n©Ë‹cô*ä‹~*0ä‹e ûóÀ®-¼×DúT¨³Ï§ö=‹©Œ!ÙçwŒ?EKÕï ×.²Ï3”½È€6ïÖ‡¼ÿWè7aÞ¸¾g>=­>B÷ßÍŸ»Aú#-1L |/g¼Wð7×çÿ×z÷ Üï÷oˆøŸ¦‚C×ðMîµ/IèkÒ;öçÊIÒ‰>e‹xžB]rî ú¡wàʃJ#)ãõh?Äpûãïõn}¬»=.\xS˜¡^Åx`|ß×Mÿæ¾ZcÛ¼Êð¹8N糤M»ôòy¶Û¥nR{_²¦‘|îe”Û´ŠÄʦ&?F¤mЄ"VºÙB€T­–†IÑÖAË4=ß n³Pÿ€nPMÉ*¤¤ÛhJ/l[ʲÑ[ÂsŽí,sBûƒ¬ç}Þ÷œ÷\|ÎùÎûSÂ.ÏXåt{rÜ™ÐDj°NwÛš0—sÓmÜ!! ÖûG¨ÿ+ò`ÒnBühJŸO ¬­_k}L‚Ã{à›Q·Yù×KLY×{åºò”l«Ú«ýÉžóÜýA[bûâËâƒ^žË“ç;s_|äÌoJŸ÷I[Þ%s|>ü&>ü6ð­ÌÔçÿðíüx 8ñ‰ŽƒsN Î*àTŽº ¹êV|¯BnĹvœë)è×Áýà.Ĉrð¯Ê~^ž¼ŠºG²·ÚÊÉS™¼uãá÷L÷3^½ ýÿ Ø|åVÀ H¿{2ØŽú7ÒmÇ¿ þì«ào'Q¶>B¸ú0ðOài ”îïü®‘ùÈMÞ¡ÿ[žáýñŸrú½A‚YÎ}CÜo›sßÙýŸ³o‰›°Z‡Ì»é­)oŸ™Þ8aœÇT —ö#§ôÉSŽï-‹œïîVïtµ­mâtö{ÍÎ!ç;.œüÞ2¶=FÖ벌û£÷È2`wæÝ凎x6±¼¥à:1 ~I ؈±¿‘wx‹¬ï¦/ —F”…ýØù¸‹¥ï½l™í<çž[™Ÿ«ük¦æžÀ^¼GBÀ§à0ðÕɽÆÛc¿Ê‘âË/LŒ¡¯±™rÁ™ï¼íò½Û Û}Œ4M¤lÜZ·Î0“àå+‹ŠeÆQY!ʽ6Î:ÈDGe T «Wg”•«ÒЬ2†"…¸ÞGf#6ŠEW­¬ŠÆèqؔ㢦²”_·k¹=Fãí‡û~þY†êŸò8:?È# ”ÛiáJsZTH!?Àw*—¯ó¯‘ðWøÃÂн=üYÌÔäïX§œß;Â3×èå—øÃd¼.ÀkžîîåÛHÿ$i94#)âIüÍ$–EÇ)Ù§¤ÉO t„ñ~Î㤠u}|™ ~Ž?.æê©þr{_ö‚ñžÕ’,Íe¤"DyŠ¿Œ¿¬F{ÏZºÊ ‘¥|7  ‹zÚyh> mÛ4Œ­ÆÖ cÃÈl 5ïÂ'ÄÏvþ:Iû ÛÐå#+xT) ã(”ïÄJxz°v¥Y—œÙNQRªÜvZE.£¡— 1@Ÿ&´æÍ7Úzøê¯$¬ù dƒ? G–î[é½@Ãrzyœ?®Vb—ZîߤÄÍ¿­OXEÅF »ß³ rÐŒ6¸5á?4‘f€Ã½Ñr¹ wÿ’jü9áªÖ{ùzüõõjµÖ‹¹>5çÏZP6õðÏãläÄ:&¸I ±¬Ý`­ª3Â=|ƒúÄîO‹ÒÛ”r·p¤Ï«°X·V9..U¼<óÝñ 5gž¡ã0Ö©¿T Ix-ö¨ë_‹¡Z­¸ayJpÄà†š¶AZ€. °a# ¸ØHƒœU%n¾ÿi%ž+ñ·Û!G†ò;I°8œòTi ÀPÆ- €¡Çl¤ ´q  H£@>éãU§ ÞaÈ8Ð 6lH%æQ‰ºî%7 ÑIŒu˜u4Fb4Æbí >ÙUñ-’’nUr¡9Ï«]÷jñj'½ÚË^í'^m‹W«óÂ^FÐÔè•|JÉ»ŽÔhz¶¨F;Æp3Ñû„›8z£÷Š`½žäEìv]Z(¢ÐÝ *Ñí R}R8˜›FF¢3=\ ¹Hw¡Ú™¦Ü ÊÁOéI:.‚~Ð5ѺtU´.½/Zk@c’^¤ÿÀ« Ýп‹Ö§Ñ=}›TÈné›d)û8)¢ ð>’ e=]‚b¤Qº=/‚˜=(‚ "ý,Mÿ"¾ÚcÚºÎøùε±Á6\ÛÄ6ÏkãÄßBÁ°/Æ&K=“„öÔ·]Ç„´ûCa*R.¤Ð±d¢W¸‘P4¼çB1Y¸æNS@é×_.{Dá;®4óá‚O1¨hÒsLxÁuRÇGa,rFõ” G݇„çÜÌUðt ýÈa”éKz<¯Ý^ÅãCž;Â^¯C8¡D´Ó§0¾–èÚÑdø=ØŽÏeŠÖx?d9"ÕÐ6uGØß8Gñ+ '°SªÑüHs\Ó«Ù§ à÷¦R³IãДk µ&-¯Í×êµyZ­6G«ÒR-ÑZ˜^]”D‚o¯Âž‘UÊœ§lÄÕ$´”Ãõ®G`Âå`ÊçË‚vAŠpÓìR@³ ¶GAÜYhS@mÜYt5kЃ~ A‰„©‡ˆG1èQ)0ƒ¥\.Ô”p1HªÎ…€”«NaïYg»³ìëYöuÆN¬ó½®¬·nâR,¸¨1âÿ±õþ!˜j™8 õ9CÝÎPöîäÙ‰~[òD¯Ýž:2Áö$çêî}¶ŸÑž¾ä„³/˜<â ÚS-Ñǰ£ŒÝâ ¦H4´/šŠJ}A¹Ej 9{‚±©Ž“ÛF¾bëÌ—¶¶|Œ²“LÙ6f«cä1ìÆî`¶F˜­f«CêPl…;ÞMiI ÖÖ•¥ST—‡»¥»Ä Xø£>eëlwØŽ—ÜT¸Ftb,©w’ìŒUÝZÝÊX¸¥+— ÖX¶ãÛ%7áÚ‹Çe£3@Æl¡ þG±cÃŽfsmË2ÆÄÂGÀÎÆ”†Hœ³>ª¬®ñÇÈøzÅ,–ŒŠmÑT$² K°ˆŸbu·%¢˜5(ŠmbÔJ¡oQ }]Žeë¯"Œü+ÂÍ+þöE¥ÂŸÇê~û"VøåܼoÁ·èãæ# ‘EÄÞ[¸·x›¯^¨^¬æ×<`¦b€®ÿÆÅÑq¶,‚­7^މ£" ù¿9À+‘­²¬`Ë®+r"j¿”×'£Yæ¸"’]]€ñ½ZJˆºT§>"œþ#ƒÙ ×#¶¶°@ÃŽBœ&M/J¹üóð%f6¾Ǩxü¡}ÿò–Z‡8lÈÑàÏÈ›¬ë1ò„^èßtÕ>®ÿ#“‚õ`M°õ๙Ÿe~I÷µ{ëöÀ?±~‘`}+BßbŠoREƒê”útAº@u‰¾šû}+W…Þ™Ñ;Ì>¯±¯yeÜż*ÄÏ‘^o¨5wžAïî+Ž)N>âÙÛЈ?#O+]•^ ó®¨K[eÖ9Ø•Ie5¡Öƒ/%áIpÃŹŒ!3—ùIÆÌ2WÃôõáÝ/–ôx”#Åj(R]?g;ø%þOds-Ãë ÇVféþ”I\ý3¼ õDG*¦ÉΗ³¤³çÖæÒÜ"ýð&ý0a÷¥ÙÍËqV° ¤½§7êéz…„B½ÊG~õwÔ9âHƒT†aû)WHñ€ÁPwƒ9uƒ>¡š ±D,wð˜êfó)uø-þ§hœ@ý™¶pK=øù„úE%6|¨¿§î'¥ä/ÒÆÓô=ú.ÇUê/r4O—§¢.1½n™¶PK)¥VÈÓiKÓÐ=cÚlMZ©5 2˜´ìý 3ÔkÓÜÆé|5è1ÐûR Qójª¾kú¬ n•BiqyÀ-(*» Q8O”ìÅGðnDî¯Ä—ˆß¿ÌÞ(’Y+Y ~­dÍÇ¡¨CÛ‡1~%ÞÆ>ÁV4ˆ+3Œ …–ð •K~»dljÂÝÁvHÜØdjÂKþcÌAœÄ/1yë]Î MeÛ6lß䀣®¡¡q+·ûáïaøµ]Ù¿©áîùÃow?Õ—y6 µz*6Zà}¨9?pöŠa>ÝýæÎÉ3³™÷MbˆåѱúîEÌ£H>•Mµ _<&Nn˜´|×|Ñò–é ËM³®ºÔ_J µ¸£qS³ºÍ¡Ãºë<ý~á?!ÅD‹áŒõJ^MÒOf¤|u±âAjڠλ ‰ŠgʳiNsy?#U|­Â¹d,°‚µø?ŒW{lS×¾çÜ—ïM|}¯×k'ö½¾×I®_‰“€©ƒ 6mg PÔ$`èÊxˆy„…v+¥4Y`k(Eã1Z¦©Œl« UZ´jEª46QitlÒÔ‰vCª¥MÚn4fçØa¥ÿL»Öýó;¶¬£ïw¾ïû˜­Ôå®Ö:oôÌM„y1_*L"*ONIé„×WÊžlÖW2Mqê¦xÓžNJiAp¶Ùð^´Ð9e1dDHTuÇ-Ë©–vôØÚ“ìûÑãz×}?>·tÙŽ'Ê¿/—_Y˜žk†â»KÚpŽi¡ôŽÌ’‡¬§Æ^Ùöðþ¶ô©\+_O7dãsˉ}#Cx6ç©MÔ~‚!~˜3dº~”&šÎ¢.Ш³¦Ð€f I!XtìÌ×á%p‰F“sA‚"I‚`°198kkŽŒÏr@/»xb²ˆ¤¢hVÅ Ÿ*•°¤ºÓָǤiþ;ÁPè  ¸ 6Ý~‹š÷Õ8™?Þîïî+Ÿ(ŸüÆŽæÂ3éþ¯ý² ñÍý’_ï—ì­ŒÛíc¬ø*go…n·×RÝöüÕó>G›FÃäÿ¿wÚyÔ¼Ûo‘ù¯Æ©ýåÎÅåŽýà1° Ct— Ï Ó" ™{AkìÙ5‸S‡´_YωìO¬ãVÂ$TM ñBM€w‡<w 8h p²ä È Ìª¼M³‰A‰!Ò`(&‰NI5¨…`ƒ`s ‚ @àwI $‰6JÖB’)àÖlj¸± €›bN´‘è`ñZ*ÖÒÙ“ãl|=ù¼×;‰ =^•zˆ…Ï ù›•¶ ‘ëÓID¤Òd‰À¦üð’Á×Z,¨¼aÙÏXkQa-ËAF1¬2¯Œ… œÖAµ˜M¸” P$ ÅJm¤¡© ¦¢We†‹AýTY—=Œ- /ÑF¢ÿ8òÔµæìòËÇw0°õ‹“.Ÿ>wô^=±ÜL°ôÆrÓÄ僇ϟ-p´dÇί‚û'.åg‡)i¥‚øW¬ðÏ5¹å¾Ýx ‡µŽužµú±Æ‰z­´%‡¥#òËf•À„ªZ‚AÕüq›Õ6E!,ö˜ß¨ÀÀlK’‹XÀ~?ÚñFŤ EL¡Lƒ+†h@#O8EgÒI:Û¤ä³F>镬Ô;M)dåU`W``ÒLÑgwHÈ4D#M’ù:ƒŒìr»<.¯‹bº):hÂAó¡qøq0Ñš©»Tý:5á§Ê&œ¦Ú0ÄÓdÁlqËv—S€,£‘’SÆÀM8’CC‰Ý—µqrg:W~vè7—|g_Ç3}¢CIêùÞâ9kºt=èZO>¹®5¢Ïí.O\ýç‹+}µÔÛ>bð¶­ÇÐÍ>¾+Z_ñ]‚ú7ªG3X+É”—ƒÁT2ÕŸ:s_w^wâþÂÍ òÛ]OÆGȃNz„?Bá_p‘c<tÎwåR‹Rƒ$Í“<S9gmöuœ{™z•û…“®Û][{Å`ƒÁ€GUÍîææÑ€Étp…0¡` QÕCÔ²VÂ%º K6.™t³nyÜ÷474‚xm­§z, kc²0‹Â({š½Êþ•elì²-©Óæ;&L˜Ys¡¹ÒÜb>eŽš'L‹ùŒ(÷ËdRöåR EجõVh z[¦GåpL“«PÄÝnqkÝͲXPEô)e¦ýõÁa5ñ>%Ä©éánJŠô´¥™Åzˆ"pAS’‡* œª¤dÕ×*…ƵĥÆÜC3WžÞ.Fm~Í·­³ºßþ¸Eï¸ýÝØ}aŸPCóŠ17Fm1ë›yŒ*Oýéç/MÍÚ~(UÞÓß<óz¹û?|WlÕïù×ùÎç;ÿvlŸí»óÙŽ/±C;?ì$VÓõIײ–’¨0Qšþ’lk]Y„JÝUbˆ´P4´ ¦ê‹Zª¦RÙ‚hY7Cã"´iù+•&úGÖ¡5qö}gg¤š¢»÷Îw¶.ïó>¿4ŸS >iúÁO…MW}æåɨð;çß&,—wØÌv¶É¤p[9‹Õbe ¦¤9É&¹¤cÀ´™àžd±§XçsSÙKæKìæØEó"{Çr‡e†½Iqɧ(ÉMMs$]>œ’’ƒ ²]bPo'!Z%[4.%•±Ù’Ä1À“œü†µÐlgægÌIœ=’€b  =ѨÔÐìõ5¥$ÓžOxR'ý@Ci-A|Lsö*&°º± ´R„JŸÒR‰º^é ㈊ÌÕR W¸^‡êXýsø¾‘rja 23ÊÁh¾u€%ï«5µo|À¡ªž·¤@Æ•b *JLó³Îï>Uz€ú´0ùÔÊž÷ŽW§t\C‰Î«Çt2,F»V¬ ËQÔŠ–ý¬hI˜4gã³±Ó±“‰“ÚK§3¬Z÷*Ç}Þ•¡ÞÕ“Û7ÁM$®˜~kž³^N\N^ΰ›ÔÍåL¥ñTÆr69yÓú†í-îºöa£m«3X†Î7ÄÑRpH¡å¯ì…O~À®R@Q[×Ù—‚öµ¼­GcXŒñ`P±äuŸWìÈ%ºˆ«GCyú}»ClË»Ó mù«x`õ4^@FŠ¡éE°ÇìÄn¤»ahúÒaÀÑ(8îÎN ×¼M§ºŠ q?â ñŒUà`ùµTDئ9T»†œ²¸Çc‚hÍÀ›â5$Äùˆi4üä–FXÃõ ½3—­&`zdÍóÖï#tYͪB¡Î‹H®·´vË‹Z_ué—¯üq÷П^zà`Áßÿ€J^ÞVí/ToM¿·ú~ûf –w`gÓuw¤Å †¨\ûè|õã_½_ýüŒÏ‹Cƒ¹¤¦Yb ÏÖêbWñÐù#gÎã øœÈlkìD5=&__cèL¹Y.·GzÙ¸D%—ÜŠŽK̸¸äRT·‹Ì„„p,LÂ=K!nV{XÜ–ÙQvž5ï‡aâ2½Km 2•çeÒ"—åýò¤< Öîc † |:õËqÝE0Â^ºf”`]ÿÃ4Zc•(KÈ—ë7?¹Nç¤ÐîÙðµùòI˜×”É:ÿi?~u¯Î_TÒmÝô=!ºÚÌò\Ž+nÁ[ø§ùc¨‚^ůò3Ýsø]ǹ8Û½ŒÜ3 Ù@¶ˆ{ø]¹ÝÅÃø`–AÎbQ„b6›k@ŽxÆÐ"¿¢4Ç¥äÒ^ìÚ­¼G%RcqIST¡€ ¹¼Tø}ç²×‹8›Š^øŒ´;‚š</!,Î_„E.Òí “ä#¦[üïÔß^HjÄï³Yk¨Ü»›1&±'6ÅцR÷U²Ûв†?ÆÖlhV½T¢ÇZÉÒu¦²#«;¡c™+бŒÙp½]ÁF^W¬êÃ"SbJFì7 ‰nwL#y«Ñ° Ra›Ú7€ZÇ׊W ¦‡ñßlÉWzúRCÕ?lnÚ¶²{ÚoôØü¯Cºq=¸óg¦þ•óÏ7Ç5Íõg¾‡+™ê·Ý·¼N¹á`už~¸5éçL@‰Æc°'’yØúI¹ð<«£)ó”:•8—0}M„íJÀ^SXM ¤‰Ú¨6©Íhm_)‹q9M€˜!Œöôž#¿)û¿¦JC²%UNͤL´f=4\ÏKK+à+WJKÃ%Ð#]½^TMÿÃÞAøÖ»Û׭ͧEƒ Aµá±±£S‡rø¯ÕÄ70bf¤Óißþë™ÿm#°߃ìpè>ƾK¿ømú2º a¯ÏϘ)°À ¡x:°6±6õ½H ¤‡¹³âÙôåä?üÁ¥áp+剷úÑ`Bî[î€8'A%y8"óòHe¦‚.*Gq¸ŽÐv?á;‡»ã…èü±ê¯Æz]Øk*œ[Hp®ÕñFÚ¬5m&$Q ŠP§¤b~Ø ì"lØ@¡†ÕL‰”ä…Ų:àã ™uÕü‚./Áq8ãg¢6=21î£6£6 ™øòtÄ€¾_4¹ Ù¸;²)kò§ÝÞÁÑBõÀ·>¬* f„§hpŽ>Žmå!9 ¨ ½8|±òBå'_FGÐôó«»w,9¼nöò5ß9B¯d+}•+• •[ÿº€B(^˜÷ë—*ª=öØ4%>‡gÁ>€=ªÚQè~ lúƒQJîgm…tÿCA»ÛDÃâ á†òµæÍúSbè| )iFÓCÄÊõd>JåS)¦&Š8x©Ÿ®ŠïŠÿ bツ‰Ì$‡d„Q.D±<‹{ØU,fwæyŠØ­k±n·»\­n ¹ ª1™nA²:Y¯•D!!`F¯U H–`Ñbõ¤uŠ"´me]Ì.‘›Û 1­mÒQ[U%«öDP·¶@’Ê$g?Tîþö¬d²«I±¾òÚþÕU#;††žÂk+ÏôÙšaèÓû<[ÉîÒKCoi">T>‹~ŽTPá‚:•CO83—HÛ¤C1_õû¥9©9ÚêÔÚ/JÑÃÓ<ã-Ö%·'·kÏèï'§_*øÇ?’¾o&nJtÁÏŽàϸ5v7¤Ì°qlRj†nät­V×µAýYëT6¥&wiWµqÍÃk=Ú%ÍsICšMiºiä“#èsGÐvësùIùPU5 ÀÊXŽhˆMT–Ïâì§Âˆ;q¶Þ€¡0©ËöŸÎß=ê²"ƒd[âÁ|™ä\ÂéîݘË-$I•;À–‰?÷o+ÙâÑ%bÒ.9ŠîT!•†©µRÌH˜ÆÔÚl5H°Xñ\eD³@II’˜ªíPU“tÖ(ÕÇ2ÈÚ–ŸµSbM¬UM´oü©§ÅAk˜¸„>…˜Š<BI®æ h]ž;©ùÀ«û7Íþº×IfÚ*K*÷÷ÚÏîë>ð ÞPºSý®sO\Ó)WZ{ã²ÇÀðáòÉæÝü”ÌÑ ŸyUpZå[,.ËlW=L8ŸÅEN°rœÅg"M±ê§¶eÛ¬u™½™½Ùã-#Ùó-5öï}NŒZÁµÉm¸íxPÏ %-+2’GàtÝ[·‚’x KÇc‹ó›\ãRÁçà2G¸£Á7ƒ8ÆÊpA¯N·6yôÖX ­D[Ð zÑheò&6Gï„£Ò 'j™ÁùeUxtFnÊ'ÚG}jÒs¯Ž¯Z7 !¯–\÷$-õmm›â¯•ÆÇJˆ«îÝí)ÏZ¼ÜQÊí~—{:³Ûz‘{=ø«à{Á÷¸Uêï%hÛl[£ƒ\ª~bµ^]3ÈCŸiŽO¶ªÙÇ­-mÍÓ÷É]žw‚™ôCk·ÇÒNáÄõETþù¾³miQ–Ú£†1õæ­»›×¾ºìú›ßê,ìIJu!zc¥ãÄ›çäôB^]üøúõOŸøJª¯mÌ`êÊ;W,¼çÁ]/¯|õ*ÏÞ£ÜMT ÝÍBw+Ô룔ñK”Z4Â3øh‹¢9ÐrokÞ"l0úÄ绊Jš×´€’æ€n?‘¤[uiÙ'5R æ9?µ‘³Ž4$p 3Á‹H{Äý¢GTx)r<(ï—½òy”¥D|ò • AþÆx©¿ƒ‡‹„…R‡ë‘å¨ú5Š/C·T7näŠ@Q¡‚úÿÀ¦ ¡z„fë•]æÊG„Yí¹r{ÎM köv.Lz^åÀà5zóoß ¤7Þ¾ð ÚB*RœøŒ~ *’Gç‘KhXœÒ eõ'õ…¬ÿBÿ½>¡à=Lyx¹Ó³v0>(Œ†/6^iü²1Lë±0¯)ª©7©+4ß;êW:>>ÆÍ~Ÿ’Fš&+iQÓ²J>Miõœº(þ'»¡>̨ Êh¥yg\À †‘Ï+‹Êå¿tºà\<Ž=nkˆhÁÝvÙ==Jép*Û¥ú–K:jöÇ0¯£é²…G…ãˆà BLL$ŠFi*Æ §C¬?˜fÕà»32ñœÓ&øÅOù€<|¾œ-)Äh†i°KÄü>ÆËÒ À1?MûÔKÁÔ@n{û\î¾]$ê<ÊSú¡UXž­b›ÐôMêó›¿ W–”˜_.‹ f?ÒõË=Ȥ XÌžùy‹L š*Ø”.X’H¹pÿßk©úµ‡w«ê<çDÅiÊB'"A³PŒ!ƒ@G„©«A,V‡å΢}zn{vQ%§V ‹ín¼/¾\øûîlçüø»óËçl_.‰cŸóâ8Ø 4 ИM¨¥šGª©P@£ØtQGEC ˆ¶ë ݨcTÐ&P™B ê`ëèŠTüƒÊ&uC«Ôni™HÛmÔÉž³3ûc‹äçyîî±-ç÷y¾¿ïwû Å7„)á=ñcñc•Î nãºÁhf]¦¤o& !ƒuC/é[õú~ý¨~Fg¯fþ nƒùŒu»M|2¹‡Ý%'ügÀ;€D•šÒs`8²<]UÈÄŲ¢H³¬]…@€q€ 9…¡H½‰™t#7ï »#I’Ö9™NWË¢MéÖÎpÚ T 8¦æwŸvâÿž66ªä4ƒIw`ÚÕ¤OU“NàÀäp´ ¼OxÖÎ2ö¤ ’µh£é¤ÚJ6µòN‡ÂÉ€È^ÛrÕV•\ ¼“$G:"K‹v†fu™;|›¬ŠúA¯HÖxþÒ$vg±˜Ñ§Ð†³÷ÒS‡' ÔâAÀÄÇ|ý¢ªI‘ç¿@bî#ê¶4P7,¹ÿÁؽŸ—÷b¦Ÿ1ãe?,k صFئl$¹€ñ+åJT‰÷ÛÈ» ŸÍìtÐKš™©ä©yíõ6Hì¢?g}¶ÜÜC‰¹3s/+sK–uhå©4´_ëíÈ Ñ+ƒ’_hÿòÃî%TZZç¾;¯Y6}uúú‰å6EA‰püéÚ„ö÷ítÔÏמAƒ, ©)T'•#}íì“ÄN‹ ² WJ†AJNÙ:S0-É.-¹"\ƒ,bG‡m¢‹û0‘J†¹b_8g…TØ (`>,Ä#$…õ¦{½² PÖú‹'¥´O’Ò0õS…ç‹N§"æ c½»Š‹„"ëºÜ/F~Ús Nfi†K\o"ŽDÁfeŒ)xm¤VBÒ]l éufgk³³ œÜuŠ>á§L°!þUÐÈ|÷Éÿ#¥1Âûî¹È_ƒ `šYÃ'cÑUäêC’óaÄ#a#ÂE¦aí2‘HÄ–†XÕí-iá=ÅZÐ1“ÞÛS·GuœLÚ,ÂñòhwmóhÍõ¾{µÜ™òÔ¾\«/} 6ÍXã f;ÐkÍ}ôàëû¶È}‹áíüxܬ]{1O²µ<œô5¨Ô¶©áŒƒÜiŠuüÁ;;¸hˆV%´?>NïívbAEØAþõó3sË)ïÜ`à Š°‘4ÛðMüH­šIwZ¢þ¨—ŠßùýÜ•]DŸ¾1ÛòË; úшá·aœ£"8—1ú—e¿×õCúp—¥`®GWtMæà3ôñöSýçÚßm¿ý ýz×Gíl=HxGøá®‡ùõÌp¸ëœ„“ŒS§áΫÔÚœ¦@¡TøÖ¢±B•?è? õ]„7 vfQ©ðdÞ2Ä ¿Çòæ·üšÏ}–‡!⥵%µ6EkSûõ“ú[º…Òë«ôú÷õ#úÏô·õßêê3ºc«õ¼‰21ßa(Ä䙕ÌvææsœyùÃ:˜ ³•±ø<ŒEhŠËùDu}*?„2‡@9•B‚¡jY— ë„'„#Âiá¢@ÿQø›ðq„‚Áᬀˆ­q¸Úä¶T[±j[¦.u)²‚”OH±Ev‚½ÈR2!Àbâ)§à[6 ; È(ŒPáu?ôÍ_—,%‹óAÔ@îA=«S²OXoYQ§Õ°–¬cVÊ*.î]CŽHzOÝ:U´U3•ÙŠöË2±ž³årÕŒ€_˜y èÉi)òœø¨Ù<ƒk³7q#!T=æàÎÕc`_ap?×ßO¤Vrùs§(¯­{¯Lo_(fÇÊE„ ª8â¹8'¹%àŒ°lŽõYz$€CM´7“¡—ÊK€˜1^¬nÇž}µ­+nErO!¶+Nâ‚R?õ†o&‹…»$E˜A£áÚzxÓ£Ån[c—žAÃ'Ÿ/mš‚]¼‘h „âÃùâšêû[öæ9»¯)”2›—•±7ŸˆŠí™mÝ|òåonêQÃÁ/kÉôàJ}h×òÊ’ÖCsŒ(V„‘¥+ÀÜ«»{:bA@¸×æoRA¢ÀœîN,!v¼VÛ^™~þÕíêì~Œ:¶Ú "¥ö“¹±‰X~¸ïÔJ}f?}pþ¦eQ±ø»ñíÏm°……kÙãÒet9v~ÿ„h;ÛP«ï!y=»AgÇíUé÷”÷”o ]ðMJb—¥«Š@¿X¸Ð4¸A™†7 ¢ "õ÷.ÜrC÷_…¸ƒŽQ9 š…ȈEs6‚¬;ë‚ð(ãøýî’³Üùî|~9ljÏw~‹}¶ÏIÎy5ö‘44¨h)°ºÝEiÓ6/¥´ÛxiË['FÇ&*щÀ¤Qµš` mÕÓD%¦J5„XùƒJCÓVÉ-hPMjöüî¶Hþ=w¿œ¶Ÿçù<Ï÷qc½‡¬QIƒÙq´V³F%¸¼9ƒg¥Zmš/ÏpÝ7pä/ãfžîâ?dÁèÁ>·KbU­.u®ÎnÊ”/M~ôÅÖ—¯½ñîpïÀ¨‹ä¼j<òPÏªŽ ·¥Ÿì@-_xãô/7õ=0¶¥ võö€–ì¬V†•0‘E/™Ñ7Ù·Ùsì‡þ§ÇI„ù0³.§tR_ŠÚ3 ðs¤e¸øÞ‡NíU&y=i;”„×G¶¶M/‘RÚr <Ä¡5ˆ<ƒjÑmʰ™Ȱ5½à¯µzU'§ôYÔåJ˜˜ӇߺDY•oàƒ¹ÞÝÒý"Š} iߨwµJ³R»ƒ'Ñ·öº[±‘¹M»šfÅX<'iO¢=™J’´;®Š‰$‘fa‰ ˆ*N³PA%i‹}Š§Ô©ôý¢NO¹wz^ìŒN¥^Îî ̾ÉõËüÎÿnæ|ƽ‹; 8Š•ݺM·^§[¯ÓOßHTlx`$,ØCíR!µØŠD+âK!ï¡>£ÙÞÅmN®˜düýñ¡ñ“Ü·r".Åu#hß0Ö¸úÛOžó*‘eôWëK³{þxôë—Œå¨eÂßÖš^Ø{È+¿uâï$ăvP`ÌGDPÁÜ@{Vy+ÞIï¸ï)i‡×o:E~L^®W¨kì5ß¿©ÿ°M;}P/EŸ±žÚJMªÛ©ê+Ô^÷—ì?}®´óž9]. §AÄI9+?VøçQûÙPBt4ΣðÓìòãè6CtýfP5üO˜ lÀû©Ùm`kJBhÑÕ²ú¤úµÚ FR’ÃN¾NžeÃÛ&ò†•5 ¤S¦± R'°‚ëÝèBå&fPÓp²hZÑ¢ðÎB7ÛÊMÄ_ž¶2Úd[\ $Ýê‘ÃD‹×Fa!F,v^¤µÝ0¨à O#ŦÑîx8€ˆŸÃX‚ÕGUî¹6 ÿ ¸¹W]=¿£:±~áCW¾ŠÆ}QC@wÏ?»nè1ÿ±Ý³»/|‰|ÿ:yâEÙÓµñX\1HÔ`㪙›:¢E9Fr4áiÞÑÖ„RÏ2Œ ¾ÆsLLv\RQL¦Ù*‡¨Ó M:{|(ë~%@?nÒÍ€» C†~C§tÐùHÂnËC†N©&XõpJÿüFe¯Dªîô4Såwµ ò*ËzR ö9„­©§:SeHLžÙÅffš`xæûÖe•¹Å8˜`DÏëdNÿ‹rmA4!A0Æ€å\¡ÇMßœ)d]ýƒÿF»ó'ˆž*šÕ‹ÅÑໆË(òÀv`[_1â”T(ûY¢…®BÒø_ÅÕnS´/àëò¡ÞÈú…¿• ÞýûÑ_Ͼ¼}å2cÝÀÀ•$Rà ۟` Œ¡P~5y`ó°~øâã½ÙÁnÅÕ*p¾&._8½}3„‰]\A]’òÄ2b5úÄ|8Î7såL|ŸköHêý†s®÷RänÅî>ÐÔÔå*Ð}ô@d¬Ñ ئ\)¹W‘î|-}Ìu*{j¨Ù‰ *lJâ ªßó–R¬ÎXн’½dzúJf"i”̰ ‹O2ò%„ÿ=瑌Ò<Õ`ú¼^Œ¨·­ç(ôé$eê5Oµš dpÇQÝ1œhãF,Ôˆ¸AyQx¼É[›<âx™'ùyªÑô&Œ<Eˆ3dƒ4L%¡eðçɰ›1ÛSF f.3™ùE†Z›©fÈÌöQË–’noq¼ùZ(®¯ •éï GjÖ6ž:1ÈÅ­ÚX¯a ]×Ä^SV mcM³*€fïž#Jð³ãà>\‰Ûdê0ÕðBu‹_BŸ•M €5c¡?P>I< ú»z:­ Î)\´{ì¯]û™N+Ó(»e×ïäoÐÀ\‡(M^XIÏd—õ”~ÿÙšéñGw¿ý³ê¦á'ö<ó£½/~q¦²²íšîâÚldÛV¥ï…ß¾~œ =G½õ|G{÷À–#ëR±™3_{ôu¥£ã±|î¡ 93¼'ß1ûôË¥mó¿ž|þøÜòü··¹ÐµnåPPû±¢ZA ½Ðó3èÆ9‚¾wë½æ¾œE廒Ѹ‚$׿ª9ÒÑØHûéÝÀ±„Jdd–Wù í9í¾à&Cˆc²{ž¼n j2&«QÕ“Ùh´5&+óäçæ£í19¢¼•¶68TEq»Ù&§ìB®´W4•åeÑ~ÐÍeÑ‚W_?Üä;`I¶Ã¢eaQc°@v‹&/ŸŠˆQDüT$y‰xó\Ì!9w&Gê¹)ì‰Rÿ98ʲpšeá@ËÂI–Íä,kºŽa˸t{ÒÚ‚/v+‰ôäÅd5Iá­¹ž~òÀŽeáKYºÚ#ÌŽÙRgd(Ô¦J‘¯OOPÒ`°ÃuíþýPÅ Û@ +cégmS¸t¡Š¥LpsY±>Ã˔ݠŒì;ÑÏÂ[·ä` ñe7Î^Å[^:#.¨29«AÊ Ý¶X‡q,¥°ªž`Mm´—ÇÿÛÿçÑ]Ã~šj_¶˜è zÁÐÕÊν’ã|˜ ð\Þ+^çžó?¿aÖ)ØÅò|ÍEk#gmTú6©]Ôæ5WA«js0hhËši€ðÀÁÝž`âÓ:6²¶Ú®@ÕU¦$ÌÕÚ¬)Û:ï÷3ø4[?æ8ããïç÷4=»4%¿Û}’M8αæŽuõø Ë4q&rg`~»óns­Cµ¹÷wÚ@~êh]Ñ2·M§JOŸ*ýPy¾ø|i¾8_jl]Þ*ne´ •¹)á~S/Ñ7hD?Éü\–J~:~s*ë×®]«®_«®Ò¾UÂzEuNs&—'&É ·$‘d2¡iA„0\u_PÔ}]‰ˆÞÕkê&è.†]ÃDÑú©†ÑgêyÃàÝoc`µ<5¬xHÒãÉ„{I-™ R#oQçòœ¯Cž’€È/%i@èNÔ4®°ï£â¿‹ø\ Ã{}诋hz¡×‡|‹èµKÁSäw(ÈIHsº£RROâä3š¦KœNs¿¯¯— ‰,ô6z—z—{]½±Bñ-Äsin­Pèæ½„: w{be}emmbýŸdm„ÂT\Šz±Cdm-º¾BÓQ7y_Ê[ÁçÈ;®—òQk‚Ž&¸ÐP”R" Ž]ïoÅ[y‰]¡ƒÐƒ'@·AdAH¥Ã‚àñtvµÄ…ï ?˜Æo¸'Ýï _VÆ_˜úÛ÷ Yi&Sɾ7+=»šÉ¶:~þâµ/©ªéíîæ·Îžhþáhr;ŒìBÒŽ_3ͼG !ö,PHbp k2ÕÇIÍËHrsGt7DÀx¦’Àón¦’€÷„fx—O n·æ"Õ@±¥Ô,Øå²ØÖBjÄp^Ds"âD"bñ¬._”çe¾ Wå9¹!/Ën™þ¾T.Sû†/‡˜ÒRvŸ2Ü@˜G ߦàüïwîÊÿÞ7¨ÌÁÛä8ái åa<âèû0’eÝñiƒ^©“«pÃz'”ÈamŒ™º²ˆÿr9c›z %S3õŠ‘‘L½Ó0œʘznß¼b8;Р©ï€±Ógì6õaÃðdìmiri•-S.mÊçsy¸a¡²£'§túêÐ'ÃÞGµL™«_¬Ï×uW">(Iº„¥¾x %FiäÕØÕØõïÄæb8v+éËÛ°d³%ûª}Ýæ{ÎÆö-NÔñ`ßîCõd¦Üþ#gYOy;R^-çÖ;Ò9.•özåà‰óç÷<易õå:ü¦¿ìwê7D÷a÷aïHÇa±QwoLJ…ÃþÏíÀfN1 ©CHu%™£H¸ µè? €4Ìè@çøé] ´æÁ²{IlÝKíuÒ~,½ÿ­8ÄmÂþ?3è‰üô¡!›òйøÏ‡^6=ú“Ñ'NÛ9Èó!UV¬¤õ˜ŠÔš‰œ-)µ']€5iÿ«³Gö9:>:öƒ Íó'Ë@Dîœúzå¹½éjµé{2ÞM³À(}½rÎ1Ãú¦ïxU`²p& -:„¼°°‹Òùǯ‹C²i,m?00j#7y·ÀˆoðÄù°0ÌÎß@©X–‚ ®–$ib½&]•¼HM(¦.µH= tnd|@îŒÔS”ÔÃð»eéTJ’‚¾Ø”›wyÔEôõ…%„Ðâ×£Ñt†ã,ÁÇØ=V(¼+û’‚RÊu+ä€x…B¼â lƒ °·BsC¡8¯P’W(É+”䉂Šï’nÏÛ¸`OCÚ»Ûmvg6±Û o·™Ýn³¼Ýfyæ ÞN´ËN.—½ ñYTÈ6²KY>Û†ølâ³-x7ËÙXÿ&¼3v'÷À;̬MlÆKGÒ¦÷5kིÚù‡>Õ"øÔÁK”àS/Q‚—(ÁK”ॠÎSÐqÄ[(k;š¿ ŽÙ?Ö_’hæÚáyfdß“†~ÑüéIðݱãèâéJúlSüævÏ}aÎ|äÎ â0À¥Ñ'únåüHþš7˜ ÎÉz:¼bÒq1ƒŒºœ¬U–\È7è `f_ËT™YÚY¦Ö1{¬rÃX20g8ƤA‡nÇxÕÀ†$ë2–%±Âû2 [Sû†?XcØcörn`û UÎÖáZ!Öm8ªC«\ë€*«L÷¢4éÆÝº–Ò° t†;± dÕD<Kð‚sð–I uuÈõ$s(俯5Ôé‹h\ÂÉqm±¬>«¯İԃ†Ð~´Ÿœñ»§…sþsd:6+ÌùçÈlì=ü'ÝwÎ3˜–ÎEç<³Yi.êEÀ3c€!ˆªp®‘ÁeùT—lgÇß÷ì;;¹ËÝëóÙçŸwöÝÙŽí¤¶“K· ¾®[Óv4MùQˆ†—R6µüHÊø£-]` +?FW&Zè*Ä(ÓªVBÉh³ ‰TÛ:†±¡ FAÀÚŒFƒý‘„ç=_GI¤÷¹×~îõ{÷¼Ï÷ù<ªÁ¹Ä ÈÛ¥ñÌ㕃¿ýüžƒo¼¶ð«½[U‘ß²¦[+t(ù\Â÷âÃÿÖ+žÁ/¾ŠËCÛÿòë}Í¡mqcp gÏO¦#4‚…•m~pDªà‡œ¸\ J  Î‘ qአ•¥(Lð”/¸—M¯s’f÷”ÉÐwq¹¼Îs‘qÑI&äZ+¾Ô̬´©uª…#µùS­9µ‘ÚxÍ_“=,éWGæ„yâÕá ·K˜p“E€eâYªæs3±Œk§U¦Ã¨[þH“FÕu­µ\kžkí6×÷àP(Ylõg4!EBë¥W3ù®˜Ï•óé|!×+p^ƒ¡”è.àÎT®€Úr«È­·œÆmÒa26©Mæ'»ü)“ññôWÌñÂdùëÊcæIåû±SÚ)ã´õŒrÎ8o]T~aÉwF0‚Ø6a½Ñ$h´÷ö ÍFàÒ-K ív ³qãM{Èg|A­n^¾îRþF­wë®Î}òžŸîݾ©§קךv=ïìÙ8¶òô;–Ë1Yõ>ßi×xhK¦òÈ_§Ž]?d$ž>XÿØ®‚2ÖÝù¾' ˆ N;Ÿçë¼"VJ ƒýÛLR·Ëóýê´ÞçNÓZëc‰¸Ö)(Q›”ñIþx™áã![J# õ4ÑH‘Ѩª"㌮¹¨ª^ÑÓ.ªš–^¤§)m¶÷H޶/Õß E9-Ý.5Qû x ùñØ¥ãùÀµ€Îã Š’ª«ŒZ2Öy3Üj`Û®Mf\ë(rÔž3ð¸‘A ÆøCiøã·:ЪBO±¸H\`¥jP.ÓÃp=Іz\ ˆU¾%·­¾´ÐB.QifºZKYÈ»€Ð|lãÀ¦kú†íéD1’Á¡2°,ÛóUßÙ׿;vWcÓ¶;ý\ÔhÜÿå7ê$÷Ô2ìH4•`i½ß¹ºÀ¼1êaŽ:Ÿâ«Ò𓎢BÒE?§D•+¹+ùß“·Èû$P$¹ÒY[:ÊŸ0OXçøŸ˜³üs&Ï lG°†ø»Îá‘{ttšÑ1¦u;¼Üø-æø.'ŒNËøÀ®Ü,Çôøé¤žHPa—ã œ˜Åû3~:zS–Ù|9 ky™÷òØ‘#6¾GFY’e²ôÕó¼d·f†Hçk@¬u‹ ÉÆ{‡=fÑž´/Øœ-KA=ȸ¡ue$ŠôWá©wºe¤½3ÞK5JúDyûÂb³LâçÁ TÉ uRᆠ£dÁ †h¦°u¯pÒ ðÞ~~ïÆlözÍiƒ²÷ÂÝtç3°€ka ×Â2ÔN°RytÁ]Á‰c§3o0‚$aU:¢-ÇQÔX¤?¤išÔÐfWÿ<#(- ÔNƒ»ëèú=Xà)|Y Y ¼Xå– ¹±Çdqi‘Tð©â´‡§M‚ž…ºQ§–ýå\7l òx~¦eáQ+rÝ@0{Íiƒ‹\7@GnvõÝÐJ° —¨Ì¦@Hÿ‡Î£hRê›.'Óräÿ@© L_/­O W…|Ÿ ©¢Òú™ïIÆà‘ÅuJç›ÃÇvm×øl4KŒîn®nxðT÷'¾óá¡dHŽÆ|—W.{°ßJÆ‹¯|{×ðÉ‘߃G¦¦Ö—ª›‡ö|d÷ç.ä$ ŠʯÞdNú—QýÀçwàŸÅ!<~EñEŽ0˜ËðUÞá}üþ¶="Ïøf±è¤Yþ¢Hb¿I¬Î2l)P”°/?LÏÞ¬ž χ}áx‚*œ=x½‚K.ëÜ (-0Eå…f3Š|K0y:ß 4C½ÓÕùž~µ%}!t¢Ͼù¦”'×i;/Ž µ|øgwø—WÎï^þåÎJzwtn÷ q¿o޾t€jucuÁ_óE~âydÁîžÚ·æ-¦MH %a«à¯ O¦Î¥fSþÞ2†ÃwØY:H, ë, ûÿÀ« …œ5MÉÒæ©Yºaš,ǶÇ÷´ñí<2 xâJ^uÖ8 ïÐ<ÏQ€ç(»sÛ9Ší¥x޲;GÙý*‡%g¸«ƒ8Â1ùv‹ö0¼å1¼å±»å±;µÓ¥Ö×°²å!<µNàaκõ¬ÅT¬q‹±=‚#%‰êÊ ,,z/z/¶se' ÿŽˆ+âœ8/úĸé!½'ê¶S¤¿E†ôo©yûŒ–ˆE—éáß%F—ç›´6¸9±¿Œ=Ô¦©Ï{µÜ‹úÚ~wêûMçàÊ‘M~tÇ¡RáCøp¸˜´Ò”»—­}܇G¶ÞÿÈü% ØË_ûÌ:-œØ—¼®/ ´ý6D?…§œ„Ì ËHÆþª6ªŽÆF´KÂ5í- Ñ ÝѧÑϧt»ÝÝÅùbPøU¬&cºÚŠ fu.J"ztvõ›Î^ ¥2ÉTj³DI"¡{%®Ä”ˆ‘Ÿ#BŲJ¤*%‰$b6E/à¸â“ÿ&ª’#H>©)¾…¸Å-/üfèaºŠ}x„îlfÃÛÝaÒ,ØšÓ!ÙD»O{J»¦ù‰†Ÿ…ç`ÒÀ ¾™ìeȸr+KwËñ¥æRlÑ­Õ4²ZÇ!¹^‡¯àòèš²x˜¼t”]s/Ê1D1™kÍÿ7nðš´s"ݬF7ËPªégçÚ´RwM„šÿLóRß’CS…\ƒú2»šsŽƒ»¾òr=£vãw+¡Xד‡úºë¸§k``åW)æwGÌD[.Šj¹Ï®üWY«˜\Ž[;µlÐ,­.°Óç.æÏÉ(„»à—³²b#òóÿ¥»ìc›8ï8þ¼øíì{|çóÙgŸcŸƒßgûHãbLí–Ä0²)…Q3ªòÞº6ZmtÒ*˜(tšh·jE^ “*­«Êº?ªîvÒ4†º–)ˆ!Þ6H²ßs†Œ©íI÷üž»‹ŸÜ=Ïç÷}¾¿°O“‘Le‡ÛR­°¥UÕj¸ª-V‡kËË•e‰ÍÎuÞ5¾ ÊÓá§µ5‰uÆóò÷•áÚs‰ï%·ç~Z<`~âú }꿜¿nxoønúïä³.¯Ëçò;dgÀ‘¨—WŒ‰¢‚Aä•}†¬±qäpÎl3rH"8<† “ðfÁ°¡e“#[|þD€¨dŸ«m4P>iæóu#©F2ˆä2Ze$à2á ÅtU@Vt‘z@¾";(qùDPÁÈð%ñ?“w’$iæ 3iÀÝ€ìÀÞ|.Ѽ‚+O ò9óù΢­³KvL¶Ú±‰ê¥bÍç/!ø&r¬ˆ‹š¦ç†’Æ(.œ®­< s¸€’H€¿q¿!¼ L t¦P–TˆŠ£d™Mâ(οõ$= ª¡GÆõèxdQïÚžOMÁà%% 8¦Ð„^àì/š€Ò9 tú¿Ø³‰5õ™5¿Ýf;,{*ž ßb !Û=$&/ž"NÅÛàºÃµ[ƒßG—¦è}z›ðÚ~•³û”é¥It§ôïÙ¹hþdf:¹{—7Q°ð…Ù‰ø®ízv»Ì‰ÿ´£ãß$¿þ¹•ôg2-J౉}xs¤oº'“¡Q-Ü—Kè¹´HïÜ1å¤[P{\ÒËäÝZ_.~Ð z‹\&Ê[ \fÛgž)SůYcÙï­ý<¾Pñ@Yê‘59âˆhw ¬‹á^â¾ Û-uf3r§Ó¶]•ªé®”‹#ðb0Z}­ël)°OÌŠû V–P—%7aŒÆu#š.dŒtWy–ÑuÖ…muŒ@}IÓŒT§U2:‹ ?H¡Ý¦¢‡¬#yÂÚc½mQ+þªt¤üv™>QÞS¾%ÑÇ¥aéP™ÆëR$´\à<X߯ýLòß xiáÅ‘Ÿ ŽVX¤‡poÅ»°s7û½qË Æ}ÆaÃñ+öWv“ÑŸàƒø¦Ÿ¾Š*cF¹¦¤ª–˜dIe‡ fXFÙQ¶ F\bØãšêE»:Ó)W4âvy_¯¼S!x¥ßJR’ÏÑipœ°m»Îb?Â81b½ÿN Ù†æ  ©Ÿh½Æ…øúØÍqp?6ðfcŠu›t­{pÐöä ~ š6@„UÂH­ÐŒj[3J ;Ž€×jr üÊ0$ a_¢Îÿ“ò[Üøª' ó¸‹ÌX^S㯿$ñÆÏ›ol{»rÕÜi5"•Êß*Ðßa5ÌtÁì"{‹Ð;Í^“lB}뛊oá#Æ‘äãö9óBu¸^¢ƒaí~XÊåì²ïÿpüï,ÚL1·½]„5mÖYF¶ür =fßšO~£×ry‚­ù‰½=ƒÏô¿±xÑL⊕Ñ0ýœÞ¡6:ùYMHeJ4©ÇKüêD"ÉãÕZ_4V*“…d}‰/“=t?»Co3o­‹=l%]&ž£¤n"ÃχÄk„XKH’Ê2ñcñâ-Ñã#1FTÑq/ÛD¢½D';ÉËäq†bH_ÏŠN‘ziÝëbuìEUX˜é?í4v)°îÝoÕ#”|‚È”5ì»lû{“dï±K •[E¨J%˜2$ˆªø1­û„Qš­1Ÿ)²Þ{] ¿ÓÆêˆœFØ«Ö@¥‘ŠUîT Ëç9-Þ•˜ù¦+&² BµÕ@¯«h‘ïÀ¤Ž’ÌÂü™—»çhPÅ}SÄ šýãv±qý:/å±E²Þ w P9Ž]©*ÝVC®\‘ÇîÑÅ¿Vávv«­¢ Ô’' WMPKˆgùön_Ë¡f”ìûGüÁê=‡:¼ó]>–|^>¸È!®Êx«]õà†=0… RUäk-€ç%h`˜+ǵn03&6W´¶vâÔ4à5h áP²:ïîG„ìr Ô’¢Á R{ç7fK˜¤úŸÂrìîÉ-{9m9üÇòÒÑã§|rP+éð_NB„9£ù,GbÄ!2¸ª ‘cñ(CG퉥„õ}ØËKµKòM“O²Æ`þîŽ_‡ôéÆv±•ËÂû¹S]GÚ½DêrXÝ®ƒ[:·}°÷‘ž•²gßÆÎŽµ#«;©ùO’?zsÚcs—þ—Ýr‰i* èé‡úD䣈¤XAþ?+‚ˆ´P°Bk¡ü‘ÖJR¨( 1l41b0qáÂDC\¹rc¢{WêÖ1†„…{W~p^ßC‚‰TŒººórîéÌÜûîÜiÚÈ£éÎÎ’tí«ûM^È#·õX ×…·kØåO}ÊTr&Kkhó: ii°ý>d\…,ì,3ÈÎ1È)ÝbçŠ/OÞÙù×EØ×ûCPð åý‹%§4¶ *îA•ühTËyk_‚[֪ˆúgÐ({ëƒ&ñyšÁ+{øÄn~ÉíX4´Aè> endobj 322 0 obj << /Filter /FlateDecode /Length 39736 /Length1 63704 >> stream H‰\U P”Gþ^÷ÿÏ †àÁÀp ƒAE4@„AØ£’¯þ©×ݯ»¿÷úõ× žX‰¬ñ“¢ãò3s*€'YÜ;nF™ÝÑžô¨ðÈ  53*˜±^^ÎcWã±GaÙŸ?ìÇ+¸ý0Ä–.*Ø7¾â' !ر£h–}fËËý*y½mW‰º&½yöþó!؈ŒvŠÅ4c4>ÄKÈB F¢Ÿ¢;ÑIh° »BH‡‰tÔâ^Á<ÜÄ5„#WɋױÁ_ Uwø?«ÕörG*vã •Ò$D³!¬É;¯WÍ0!\R¹µ7)X5!ƒ­Ñ aXŠ÷à…œPD>h ÝA òP­ÅkUj6†a/ÎQ&[c±H¿Øm/JyÖN2Q³jS·ð'0‹Wz«™ñ4‹2Uß3Bñ"ÆÁΣ¿Ã%ò¦X™¢ÂÔU˽ x "Å1id‘…éX‹íœó¸GäAƒh+52Zé¾Þyº™x‹¹®¶röð P,Å “0q¶L€l[zÞÿ3œ¦LÊ¥f:,ëõW²ê­|Ô-¥føó)†}x$hýµzܳåáLlÁi´2«œ÷GxBŒëâ-±TMU»ÔMæâ†$`¦¡x;øTàküƒžŠnìÙ¢Õëíjç6#˜ûxöžÄkWó)íÁ~Æy޲™9ŠG©ÖÓFÚO—è’0ˆ@1WÜ•NyR^ÑëºJä•|ÑŸ÷µ`*ŠøÞâloàxwá(Ž“…RGtžç?ÃDc§hWå ¹^ëÐWº®¹~r=UU0r•ä<¼Ž9 ?“/s@%4Ÿ~`æïŠÏewÙSZä ù’œ,såjY#ÿ*¿ÕæiÚe}”n×v×W«ÊTïp.æ+â1„ë§€«i6ós0æa –£ ë¸^6`9î¯pçð=þÎ' dÎż{WÝ ZǨ¥Oè0¥ãtwB1ÂÅ`‘,REº(+5â´8/n˾r†\*—1êä>yIƒ¦iJcdèÕzƒá¤1ܘaÌwû¦ãÞ³ˆg¹Ï®ºàòw½ìÚè:캥¦¨EÌ?QÈLW1ËZ®ÁzÆÇ\‰ûp ßàB×$HçŠ÷# Wƒ•O-™FÒ(ÆXšÀÈfL¥i ;åSc)-£·©’Þ¡µô~6slõôíc|Aç¨~¤»ô@p ÉÕ"ÂD´Ê‘¦Š‘b¼˜È(å ‡˜'*ø„Ägâ€8/½eˆŒ’v9WÖÊÝòˆ<+ÿ© ͪEkõ)Z¡V©µh­ÚEí© Ûô"½N?bècˆ7dJ › Ÿn:Œc–1߸ÄxÖ¨ÜBX­þÂqïůцš¯÷ÖŠ6¾~Ò¡¯¢lΘAL–¥rüN/ vi¦ËT%‹ålµS¦‹'²œ¦ˆ¯(H色k ¨Q\Å-͇&‹;®½G_ˆr™* ›èg4­R¿ ˆ HoR³8*+e¥ú#õ:jÓëD+ÌÚ5á6¾Õ«Ä&žô­(ÕÈÑâõ§(漤/ä|'‰Õ!Ïju¸)-âj§¬§h´,^C©‘÷õÇ=š ½ú’¾§ý Ú%hŒxŽOË)ÿðç3äŽÇùóS~l \8ßÅ`šÄؘ;×iÎ`"ÀmBÅOD£ˆŸ< -iDBI„pžMÒž©„ŒªµM«Ê $´MIhK›@„ Dòë7ûîç -´ªåïfwfgwvvfgEä2¦;bzä2u¼Úè«4ö¦|´*Y•×¥wuvÄMµ3ÁkVaÝsÜ·>§‹É‹"ñ]ÙR¿jDǯ p×0vÌ#Íñli ÌaŠP,iİð^¸°©%€µÄŽDÜTv`Áïƒ÷dïneNr}À|@_¬¯5Ö'q0¥†IË·ûKKÃÖ‡T ­q=h.òë‰Î†²¾2–o=9!˜0RRSÝç+´ÝÚ7º ÝÈËÏn¬ÉÈdKçVÓòŒ_¶H_‚p0«°$®cOóøgÍ<2VÏÃ0ü%h™]8u摤á«ßÇú¦+äÓÆMÂùëŸ~2’Ó™æ¸C¾›ÄMŽ’L Aî´Íª*³²’ÄÁ‰ÂÆ…²?»¦zKJ˜ú_î£ÇáÛÎD}-œ òñîI…i:fOsÜîh•¿ŸÂµU S$Y2èHƬ`I#ɨ'uÄñ[ÄßcLoyæ¿À7¶8º¶ÞTÆþñ[ÞÔ¢75·ÇQ#™ömS눞-Ÿ—‘¥[Š-€ÃM-O-ÑzËÛãÌÀ¿+Ó£ë’H5ØhGâª_$ì–ð«r*ÄoGffîÄóx.-ä–ñß•òxÀ’£b¦/Ùhÿ&Fƒ÷©”²>c-I÷dÖWìÏÑa^ž¡Â`­\4µ¶ƨ².+È阑4:SVÏ*=àÓ5®Æ Ѥsü)ëÔ¿Û›À&Ö*õmA‹ûtews_XÙÝÒðákwk¼_("’\œè›Y| €ûYrs™ÉwPßýÂ+ÇûÂD=RªI†ì¯N)$y^‡§Ðê”°y>‡'ÀÓl^XòøoŠHk<;db%jä_¨Áá(­ôÑ盆Ë}’“ýç6ÜuJ·„¼°ÕÚ¡áøºû85ºë°‹oR3d­À4ð÷k/PãŸF¿t¿¨#ü¥Àg@5ЀU@X<4c¬ |‡çp î£ÏרÓu–|®6š ,E[×>¢Jm#Ñnä>Ö›¥N¤J´'CVᙈ±g­Ë,ǸÉr\ô6Rä Ñ(òì#?hP ~)æ9Æ6ƒ6©gx¯Ö5´·ÀŽ%hƒ­  ËÀ í@>t¾,ê¬Õh¢½¾)D;ˆBïë`|>l삼}Ác±n>¨ŸÇbÎ õ‚âWâMuú´V*|´öÍ{vöÄö³Mÿ1¶/¶}l«¸cÛ r°F%Ïj{z¯‡Ä9Ú ±®£­»K(Êð\ IØß'@ÖE<­¿ÂÆ%®·h6ú^`¼Ïyˆvª7( Y•ûeÄM-3 ˜mÝߦ‰î=‚ýÂß4¶'8ö S0®EêwÑ$í2•¢fx‰þœñ|ƒ³oÀïW½d}Š9" Ì3œþ8¬_Ë>àsWÚ†{1ö dÏ#€qï‘1 ÖÇ:óö9OÆ À±Ìt>:þ?.1ÌxÝ—Ÿ?à1˜w,ÆO‚ÏsÌplr|plÈøG<ɘåsÜßpŒÙ9óºxŠv%@5>Jv¦Q‰±2_øÙfΞ›c‹cÆ¡—Ûq¯\ã}rLeQÝU-×–9ȱ•E+8ö™ªa¹‡ 1Hs8fm_;TÚå|äœp¨cç§ÌPµ›ŠÙw|îu|‘¡G(Ù2×{ôˆ6ƒVªï þ;Ð~t.üsXæà5í‡ô±ØAÂ3HÕ8KÎÝWrè†gHYùáËrí½"阬 ).W¯uÅÕ+ž·á´³i.”A[Æ”‘-ûoùÿ ÄyW/=…öß\C–¥ ÑKØ+yþ®L¿è*½UÊo·’ò¬ âæðŒÆ÷k˜æjƒ´H#ó.þ Ì]«uÓ|è©øR{Q]AGݽô%u爵ÄyzÁóƒnÈÄQnÌ}1–$uâõ.”s ß¡2§ê¬?ȼª³þ(s²Î¶)ÕqmàûYÖ’ws¡¯™¸|•ÊÕ›Yñ™§Yñ9z¾Ü¸Ì¢£™¦kK¾“§Ð˵†÷/ïÇ6™Oòžƒ¬ßŸK3úÇ)%Ž[È{øµ;y ÌBÿ<}àÆysÍÜgu¸Ÿµ:Ô¥Vöù÷.ÐëÖI1ÕêËÔÔÍLße¥N-e?¹ÎQY¦Ž†è±ô}âzªC ·ëh±¬Ÿ¡ñ®ëòn›)íå<ä¬Å½7uüÖm­ˆžV_$R‘—ÌGŒ4³LóÒõO¸s—Ò&õ°õ;u¿¼ƒ¢ê0%Ô*ä0tá³ñ.Ae®j‚Éùx (óØ~·†øä» }œ•s/óÙ»oS>0Õu÷QÆ—{ É{üMa?HÝͨ+˜ËSEEš ªô˜ÔùÞ Ò¸³|‘®Í yN÷r³Rg–uÛ[Du ×4ë‡äZTï­£rW›uU¾+ŠèQõ,MWé!´KeÜïBª@½lD}Ô€aĦÏîËZ-©uKÖûm²žç¹ji¥|O°ÌM“Ü4¡é%©F}ó<ƒ¸ºö›–%ß¿§B^üXú}Âï!óå·ÐûÕpޱ ²Þ°=oïÒC\=GáÃQœƒŠ—¥ë`úô»Yø^šWfS%(Þ£6)k¥ÅiqBœ¶ºù¨¾OOª¯áüNPPmGý~µq>jøRøê7Wödð[ðöÛDZu©—0n&d ws…œ±:Aߤê/i:ˆ÷Á%~#PPÛ úÐ@åGÔ-nQ·{jò|ëU9?c“õU‰£¨›—ÒºiH[ÜÍæ­xÛÝÅ^ik¶lã]ìã9x^©‡1šFDÖE dÓáf±z#â}Œý mUŽY§”CS.‡Òø15JÚ4#Çf+ÏÓ´ÙôS`;ÚÕ §vŸ;0÷Гn|*0ÄbÄ3(x‡À¯Y6x­»ñ³áò[§FôßF­”ØÃ‘2¹ævšƒõæh ¬S õ jàÞF%ž-T¢Nôrú.?î¹·iʽì¹”wiºô¡ðýìñ~Á¹Ëõùÿ5ßýç» xBÚp÷±Œ!­œ·.‚¶)çQ·7ã.ЯA¿Øñ§sNà_òsαB*YÿÌåçösÏõ^}q’žÌ†™xx‰2´Eäö½ÿâ¾Zc£:®ðÌë»»,×»,†36ëÅ6^b³”˜À6¾KLˆІq¥,å$²)´QU;†¶i!Mk7@ ÁÅMTÛõr“åÑb©"Q®TµU¥‚i©ú£ªê< ¢µq¿™½×˜uã4ýS­¾óÍ9g^;wfΙ‹ä!í|Æëê 9Êa1'ìÁüñºVCò”<Ì5S´Á™Fõ˸WQW¶×/yvå$b10ê_Œ;³®ˆue‡“~ûûØß%õû`~†z ¨C>{‰”€ŸGlÝßÖ}qמ<¹ßGuq—ü%¥Î3qçlà¬Ü«Ïÿ'àì¼ ¼¼ý¿‹ìUÀ ÈuY¡-Fà¹:ü!Càéˆ 8yC(ÿåõ@ÊoÁv¼Œ«fè6ì#ˆ# |TÍDþNÈ^}ÜnH¶¾ <“ìcø,!ÿþ½…]ÉöC/À‡Ìlè$ð&ðs mì~~ }øWÐW&ûByøð}  8˜ä¡çáwaŒß‰|äÞ¡Ÿ+ßëýñiÙzg„m÷†˜ /ûT|×›Ãþþ±ý–ø–ë`Í_3Ÿ{½qîbì×X —ö‹œRäÑ"—MCþ,òÇQï¶G%O·ú±Ù#b ÈEþš¶9sòW4æ=¸ÂŽcïVú19 x,‹·¢Î-¼u.!6yp§ÞÀÿ;. c›ˆkæ{Yú;r^Ô¿=|ÃŽiöÝ:îŽ ¦}Þúdcägˆ©! ÑÜËnc‰… ÔX΃}øuè‚Û,ýXø[öW Ï²ø ìYà—¡ ~ÉÒ¿m-Úí²¸í4çpodü9@ ÀP:€Ò,Ýh’²ï°mr¤àx{’±\Mf®_~£¦ø}³BíXÒ&,}V® +×DT¸í:É: X#ê4¢N#ê4bUJØNŒ·S$ ^ `X÷XwaAöýÒþ]ÈV ]hì¬c!fµm1 86ÙæøƒF¨ì,{Km°§ã³²C-w4×±Áé{DÝMÒ»)îš*¬›â™ÙIF­­‘t¶| Pp5n yÀ€r@e̼b~†=F¶;‰‘Λ•fÖ¬6§©%åÔwž…H-2iN|l £B!†ié:Wƒk·‹y]9®—áªu¥Õ³fÖÂgŬŒÕ°(KKŒô™Ž¥‹@ÆJmé¢Vw»;æîs÷»ÓbZŸÖ¯ hƒZZŽV¢Z­¶NkÐvk­Z»æjÕZÊ:wƒ{·›yÝ9î·á®u§qm<ÇÖãoH/д*Ö8 {{ ˆâkD±OÁN 4/Ðò8 šõ<¨çÕ«V)<µÀ: Áòj£»¨?(<ž,Öt¬íä (•Ðth:4µú•!ÌÐ ™ÔLÚìHÛWbùךôÊ:¶Ïm•!ã«ù}…4VHÛ ik!5Âe‘1ÂçóEýÑ@´ Ú¡Öûëõõj¿&PSPÓ¡–ùËeej±¿8P\PÜ¡r?ðÞ¡¶T÷TŸ¯¾\­F«ë«›«Y)>]Ü,* IžÜkÎÊ •z"Ë”ü(dp`„Ce@= *=\醵ÖnRD4´è× $·|ÂÞ&}¢$üÊ]~†?Þe.]T©Ä•Ú†¾»àï’µ“¥iAH{U¿]Ú9¤Ý†á‚«“×\Ž_)¢@F.³5ä*€ž!9Ðô*«Ão [£tã×¥t± ¡/œÁÉÌ™„ß4§7âU¦bè®B’rŸ”eRæé•úÍJý—•ú÷*õ|”〔¹†;¢ŸŒè5½0¢£·ûH.Ñ•RjBÒ¿Iù˜”A##W¿•«”««¿–«ïÈÕ¿˜+ÚÍÆÙÕ• )ÝBÒ—¥¬”ržáæúÛ\_ÃõR®Gtz”bt²\Ê9Rf I?<é)÷×Yú!)GOÔ ò„B$Ñ3Ý6Ã+AÃfø(è_fx??GoQÒèM3ï:Ì Ó UèYü­ àAðfðOI˜ÀÇÍðQÿ'hú12×)ê¿Nje»6Z!í¯Yí^5ƒë1ê3øMŒz˜å¨ÍàuX÷›Á} Íà6P‹Üb†çóÈ4º™ä)¢îPÄLª­EÏÛÀ+“W˜AѪ\  ›þ… |1ËsÔOjåpÜôË?™Mü²‹ÙÄ/'E’Ó©GN^'s%;Mÿô¢ \çÿ ŸœÜ ó(ÿó9ü¿ÕPÿD+ÌNþëÓb¹L~9˜ Sü’ÿ,¿— «MÞL8á8L(´—ŸÀ"ÇPW¡§xOp3ïöKo‡^|ê¶ð~Ä_Ç_ @7ùžà91 ²ÿx5ÜOâÕáNþH Aá6Â̘—ú¿Æ„yI‚VÄ;ù¼„˜J úè<ÅçcÄy~9•/—žQýºtìr¬w¬v<îXæXäXàÈqd;f;2œ>§×™îœêœât:5§êTœÄ™‘0ŠNa†æ¤©Bª²ìU„„·¾B ÎNl:«RªžXNc¾*Rµjy¬´¨*áùRlIQUÌYû•µ'(ýÑ“ÐbÊÞ%«Öbƒ ÓsY1ßÃkOJÿÃzÕÇ´u]ñ{ß³ŸÁ_Ø`Œ¿û›ÀÃ|Û|üŒmb`á£+ÎBÂGHH¢ˆq;)i3²…-M³†¦¨™¶”t‰´˜8NÒ•(YÛ,Ò„´5ÓÖEû¬ªªê¦!­v®’TË?“võÎ9÷Ýó{÷œûιï[2yJOäøä©P£7ûP°×]i‡uˆ[·G…æz R¿àÑxÒë”U þg°î Î=iîé¦ÉŽNÛ;£³CQ;é¬g‡‚ÑÍíÆרaj0à¿F 꼆Ǩá@ÇcþÐcb©!€!7C,!ǰ¦ Ò” øçX6 º… ÒçV´79W˜€¹¶0*å%æÊ£r ò!9YÚÓ“INKL–&E‰É 4g±¤ÈB sÌY*êKOÔfKÒ²$ìXp(aã'˜MI dÁ†J ÷ÿlýõÿÇzîïî ô›Ýæ@?Pwôë/ h¢ÇzƹÝ÷‰Â¥­Ý½}DöôGï›ûýÑÝf¿q®§ïê>¢î1ûçP_ £s®ï÷_éá{æ(6;á ~ÎÖÉǶ|Ϙl‚Læ#¶fƒÏP‰z–Ø [Abk–ŸMØ ¶Õãà¶Î¹TòíHÊ%Ã~èÖ›BõjÅP]bsÔ˜4/é¯ ü¶$\(*5×Ge@DeóÚ¼D»“¨ä0œ¶¡Ò¼TcÒ_Çon¨0¬4×#iûü¯p8í>ç¾ìF"!N_`Yj;ÈN°§Ùsìe–!Š?åÝçØOY:Ù„G ü ›p‘Û‘H˜4Â@Is\„óuzYÔÕ.†Ê܆2€Ì@å@í@Btø¯þ ô/ :ü[@?Š‘ÚFÛš}~b1đކ¶ÇJöÊ8Èž=IÙ¾=)-IéöÚ5 ¯xÊÅÞ4(¼1ºü.Ð@ŸýHHÛi{bòH2kCaæ0¸àf„°07‚9è`òºG‡‘‡”ßÏ{„ï@‰Ñ0y,Bä |ƒ  ¤ZF"Ôâ…è3dÜ„ç?\ÿ¿+<€¤HƒnP‘¥ÂÁ"ÕUé@<ïu¤c†*ÇäëÊ÷º_èt\@óàoœnœ—‰hŸ!¾“—!$(xµCÌ j+KËKÊôª’%äYò(>*+ÅÉ•r¸ÁÍ´Õép•ÛÕ™*M8cfɰv2¾’¯àP±×[ „÷Ò…N§©)¨á•zmdØæ…÷…&i3õx.ƒ#ëÙù¸öŽö”–Æ×ÆÌGBÚJ8¾þq \Fñõ;|6t´`ºJ`¤X$Í’RbÃ$,L†â¸#&¢urWT4‚%]•ÉÄ9Y›Z§ËRŠ ngDJ¬œÔ¾mÚ??¦•®Õ•ä27ÖºêöWÎáá®oßaLç?µZÓÓK§x—šª,æª2ªÖz+ÔN[QµÎE›qÞ¨Vë©®.{®oí÷xÓX_]S–ÿêÚïHv×ÿ,ü Ö]†jQ#ñVüSR1#OÕKŒj¹Þ¨õ2› õp@)¬Ó3;’³†Jí ’/’§; øòüÒ /¿WÔmè.è¶÷×ÙGj?0J¥2.ƒ©³{ RUÈ0qÜijuU]ÛJKD¸ÜPÈquÞÔÔ²DÍ@‘§[¯V6˜éÔ85ÁK›Õj…¤Œä .¡€•ù”˜uø=H°êÝyƒ'7˜•¥“Åñq>C›kÅÖ—»Øy£fn0w(—‚âÍÆëýî]ÚAí„ö´öœö²vA»¨ý£öS­X«Ý ÿ»ã1SÇvAËrWóÒr¹+V[ýþšËKäZ-@v‚bI±äYZNÈô¬* ôUy1wTñs aƒ+AŠ_@’BÔÐpî:<ŒM™ C‰Ôêr»«"‹!šÏläi…xE2ŠŒHår:ò­ùH«™e2Uê +ACždâóÏ·G…¾±9Э²XÎlûÑîñ÷†ß¸õã”°/õ}qúL|b*š£.X{eüH¨þùû˯ì©ýòèTÄ¡÷YDžµ[SíÁFý©¡ý‡ž‹ŽþóåÉÚKÛNíÝÿý]yëW¯çé…’šé[vŽV—®j¯Î Ìöø”x­SºÄ.oåõbù±œ½. ÙR²â’;’ßJ>–¤dÌ3´“J6/–JSÒÇdçÉ×e 2¼EA^0ò4“,LJ!Á3žNè×]Y›­&‘Ä›Žp·¥–3$o¡^\ÛJ _E¨š7O+/(©Ò“JJ<“ªD38êPqê›rvƒ™cªŽÄ`×Òª;Aˆ^Y)‚°àLk¾•r*P N¦*+‡¢Æ¿ÛÿÚYl_9òz‹I·õèÚ ¥iÏ<õ>váõC…þ¿¯M¿ó›ËS¾>ƒ_LøPÅç S¶i0®'2 nMƒF¦”áš9–Ùyþ¿À]Nu–:=SDN—+_LÏôŸ>»¶øàȹf“68.Ü]Üó͵ï­Ý]Ç,¿áïÜ‹NÍÎPÛè!ð  }ŸÊì˜Lû’ëš|Ak˜o[ÔÝnøƒîý†” a¼2­ZWcuV¸ÊÛRTÙ VáVyUõ*_‘¾(P«¯ ´è[»ô»£š°!ìÝò5Í Ã¤ïä–Í´á;¾™-5³†7|—ïZïV[}U{“£Á%ÐqùyÙY A®X†ò]v˜äzŠÇY8“ÌóætÇÆEÍÈîe:rïåϸîy<ÿaºÚcÛºÊøùÎ}ùÆkÇÏëÄŽ?òô#“4™—œ¤–GI×¢­™¸aj2ÍœuÛ¨’¢ŽRimZé ¥É@­ØZÔmÝD¨P ¬Ú©š5F ŒŒRº¸|÷&e³åï~>÷êÞ{Îïü~ßï ô%ûæúnöñ}¯nÖD—$m]ZZZ\B½[\\JEîéLJ©Ž !D?Q@Qjni~˜jÜq­È?ÿè¹~us‹vþ!á´¯vÉÊ}\ðwÞSÙ®ˆ7‰-õk»*ƒ±®}S½/õÆüþîöšG©3œ,‹øq“ðH}wÄ[^™¬©)˶?ÒÜûŠ/ó{vñŽuk#ø¤U±7׆VõGc‘6ŸÍUfquUùëk»êZ×¼XWÝâsÆ“ûWU%7¹¬ñrµ¥Ôä0«eŠ×L”ÅjÇ´Ý!ùíüω‘L1o‚&¸€! ó bÂ8BFŒbw6úljÄU‘<ÑUŠ!ÌdîñKF#É üÑõi‘«º YfEcž«b^!‹› Ð$eØèܤB€}Ê´e™1¹Å ÖüB†$ ÖBÆš^‘ÂÅ¥Bf™B[°)hk´Au-ðáFX,š¿6Á?‹Ê¦¢Y›Ï®â)xƒ¼CÜd3«ÚJ·º¯»8ÙUoªœ DâyÅPJ.•2“‘oSœÎq'çÌC-6»Ê€BÕs Ƀ^$³a)£Y€Bi+,o $qÎÞÔ¬Kf¨ò!ÀËb×PN–$c¤ÔÑÐÖÛÜ54Q‡Â•a*Rà€ŠR¤¼ÌWæ/ãD{T‰£Õ­R1ÈÛI…è‡3— ³0¡Ì€¡Ôê$j Ý1i¡VÿÕÖîµ§JµBëvÙT—†«[/ÉÍ6­æê[ˆö¼¶{[öØW~ã׃×ö~ùúºÖ\ón<n­i[ÛôXŠ¿ ý›:§~Q<ó·â¥Ãïÿìnñö¹Ã;FOCëí£Ï'ƒn.CŒî áD\19ÂÌ“õL{æ=<ñ0}‘|PK§žNôÛÓ¤·–0!Àÿ! fçíy˜á¤¼$Àã.˜Ѐ: ÷gf`Ì1@Gè Wé½EÿA T­˜CŸìçBzyGg6 ­¬±–294ñ¹s"]ó¹-—'d¸*ÏÉ”dr[ë +N³­Ôº|É÷¨U<¿Õ’Þoö\·\×šÑ "¶ÜðpÁ&B–¡Z©}XÚ¨\…UŽ;5ðñ<ì€Àñ]OOE#êÜÑHöœ¼×ƒÏ>¹Þ Bñ~ºà·öž|!wå—¿™úþÅâÕÖ†˜¦„Èò'ÏUÐw…”<˜?oj•5‹Ÿ6µvÊëJÖ{+ù9jjV×°T65—šOÝ-‘H :å±ÐËñ·ÃWÂ3ññ[¡[‘ßÅÿZù—ˆ©ÛP“‡×.TW[Iž.ÜLB2Ï¥.r‚Õ®¿¯h줦ádëD·»Üß²j—²ÎÌŽ)Pk§„‚ œ,ˆÀ›Œf›̼h2#«ÊY©dpH’ÁÀñ’h2 3˜gቦ˜YQ6ˆ¢AàM&~º‘/ØÉŒ²¬p0Åá(—‡»Ì:½È¢^Í+œ"2 $Õò)åÒ:Bi$¦¶.!@­ tZ¿µ4š¶µÚtÂì×ñ+-—¢(¨h£èFr£à ÙBèI À]¹tbé}a׉b¿ ;ÿGyµÆFq]á{î"vÙ¶—Ø5{¿=k7ؽ H”iœ·æ4ŠNHèÕúÉv #<ˆåkù¢_¤z‘?¢&[0 ¨hšcQSBö7Õ‚WóòbM°…›HaväžFa¤¡S8-œá¯3b-µÍ+KètÜ8’?wâàÙWZæõÿøèøŽýãG·]y¤¯ZfÆmkפÖU9| V-쌚+þ»#OÞ¸xþØùºaŽÀ£³53«{65þ¹"yú¥ w¸W÷cä{1ò^#)èÔÆjѼ¦B©D¼5ÕY˜ÉÏd|w4ëMóœñ¼æ{#öfü¼wòÿ`vHˆfê3Å]f·/jŽZÖÃ1ø‘ù屬 Ëa=Yëæ7ÀÖx]ª™4Ã.º#Öß™zöÇ÷-ÜŸêãû„Œ!cì¶vÛú}®—øÆ­'l®_Ä^¿šåGŒù-˜°LÄ'–,0˜Mñåd|k‰°ÚH |q^ïd·®JEaìæà*2œ s€µ¼–‘•d’ÖÒTK7¦³éi>¹Œ8̆fC^‰[s÷»9··t >ŸÛbL¨NéÛkòÖTN«2èù„{IQR)´ºx£3ª ¦†`,t$šH± kC!ÅBa´ȵ¨‰$­‹r Ï¡Î*Ûvx¶c?0¶_³¯Ñ²9ÔYØE6ÌÕ 8òrýø¹Ó×v_¸¸lßßÞ½¥?«íÛ¾=“^\¶©êøS»»cké…ƒÙ-=Ô¾ádËáÛ÷ô½ß±mïãƒí>P¹ë™}•¥;“³Ys¦ñ‡Õ.kfÎK?w‹›T rÞQˆjAó޲~o¸F ¸©$͉†¦´ß™uRçeˆâÞýÑ­ã”®tYƲ4ö‡íÊL ¶…ÉUlä.æ|Nñª{E±Ãóè G¹A\O„<©ùÕèÛÖe¿•®Ò³ßî”M#ž¶.Ç(·Q )š½–d ¡Á*óËË%5¤fTN½æ÷Îcv AeVRÖÝÏ ®2)ßÒežŒ¿¶`î¿øKðÍ-þ‰ÿ4šÜ –[»vçÎ7-'8y“ßÊ¿ˆõó‹7–rà&‘αr>OŒÐLæRH2Y¤¯Ê?ÄcqA{—/ ‘£¢@s÷&ÂñÄ1ãÄU qaŠi¿š ’¥[˜ð°Z+ÖX)´ ]BFà ÀAh¿UB£@qšjB›@‘>*ŒÑM¸)þ¡¹ˆ$^iƒØ'ÒV±K¤b¡æ Dxª ôät=;ö”cy&Éú=“>ï̌σƒ<9‰5Ç£×èûµ¬LC½œ€gœ/nâNÞ§¿«g0Ûü8|İŽÂ'|·™É@öŠüС’oà)…Û€¿Àqq "ùWF[±Åp†Ð*ì²ä:¹SRà:@ hŽ€ a4”u&‘$uFý¾,×uÅ—øíú%YY¿§¨|¦ÈLùâ»êÔ¢üÒ»ï²Æí}lê1ü×Qį–á¼–ç!n‘q˸ûÞh„ü¡¨CÈÏA(܇"„EÀJh….ÈO%¨Êîûàð­$qªŸÞÃo¾ˆ:ç-Œ ÕH#éÇ ñ2¾®„T¡ö m¶ÑÈA©cŠˆþ€ã-H³“¯½;ÎšÞÆ—Òã³Å[à8±u6Á• . -$@BÔ3Hõ(Ù ¤P%H°N’`°Z:®p7‰›[wSsi@á$cÀ$¡6üjL[£D$¹’Uá®L2&Ƶ}þ$s‡| çêUÛâ¿æ7Z$É,ç)¦P•*:%»ì³úüþ€'(ªhl†¢i6 —Ô”êcQ±>-ÈM‡c¹iŸ’›vëÓCN}Ð~*ÛKÍR>¾|™ôi¼N©Tk¥jy³£Fi–vÈ;•}r†ï±ôJ=ríˆr84 È?³(—¤Kò¯|—”÷¥÷äkÁ÷”O¤?Ê“>•?UnK_É·ƒ·•…&i½Ÿ†P‡`HPQ&Kžßä ¸ý.#5øN«Ãï|V‘ä°¬…VÙam³‚U–,–Qú®f¥ŠƒR%<ƒ ë…×µ£,qN—Ëh4£pG3Iø7ôŒE³ŽÒ’áJ”Qú™f k–*Ëß-œål¸¥WÏ ¯ÙÒãc"“¹Z¶W°ŸBÙ9SÞcÉiËžz ¦EzÖ"‘'A~ë›}|àj¹¡O]lÝ; U¦jÐË›SM—--[ )pånùæSîÜÌu…+šfÿMvÙÇ6qŸqü~w绳ÛçKüvgßù|wö…slÇg°2r¼ŠÂhÒ•dÕ",ÐN+Z„†—Ž%LoZ•¨h˜Ê¨«<•—ØØÚ?*ÑI›Œ{i S·et*‹Ùïwºi’ýûÙeËz>Ïó}¾OwwØœþ €«sËÏOß}n®þõ‰ûàÃ+I)Ckš7”ÝK¾ðpÿ®çšF¦åÔàÆÕéßCuÄâFN@¿/b6ßfe{±^q7¶KÜmàßJVùjò.ÿ—äÇ™Æ9ØÖäó`î€yT}ǼÊ_M^Õ]d©†|ÂûR±„ª"Ï£Ûú³?˜7-9°˜ÏYŠ!š_¤.Òvó×Àõºy[£IhîKø)oj@÷gÓ¹Åê²ü—Áªporîc1¶Ô zÕ¾R¥4Z:\bø,Ÿë–æUQgH 'Ä ØiîRª×L:V²J]¥~¼ŸèsôQ}t_v˜â‡„ЏQJnÕ_§v;Ä1s´ôQæzæžú™^Íx%Á)ÇYIÈŠ©BåIaCR‰xËœ”I¤ãz¡à ´èÁ`Oë¨RÆ¡·Fe_*Ø×tžè˜ŸGoO,\bßV3ŒqM¸Ält“†4'Õ†>`8‹›·JÀOŠ ^øöú3ÝZQ$6|SNi!õ½M/¾í¥éŽo­Øt,ððáÈæÎ7W’8+°eþäðB­Vn-pŠÁ3DFÚç= ñáN{ßãþ{¸’½æßxƒØx‹ØÇW‰s„³‘ðxt)±špdÖ§ X 8Nág±±ütì C †ß8å3޳€­óO¹¿ïÆÝ5"cešxäØê»> ù:|¸·`:Ûc!à I!>p¬ùÔ±ÏÎþû—`å¹¥&!‹¦¤§ä¨NL„µºAhˆî`¿Ëþ†u ³ÃÍ;ÙýMü„ ÑË,òqÍQ‘ ý`'¿KÄu†’LŽÓ’à–• –tLJõ@c"íÀ8–‹qYÎâ\íÑO£rÏ(¨çu,ÄPQ+7B‘ƒv7ín ÚéBëÛÈÂn¤ì Å£ u(¾ö1Ô‹Óö פAã åó–›û¤Å"¼èõ³ZsBôFzï‡GÔ'õ¡)Üó$ýÛ·c¨cÊæÿ6FŒäü,MÉI˜u j%ì ÅìQÔ:´z_x¿ú~ýÕßôܹú¯>éÒfËCĆ‘XJÛS?©~ûüå¯DÀa°(Šjšò$̸ ŠV‡Ux)²)ò½ìCÕì¹ìÍÓ®Pz„qŽR£ô3ætª’•ãš$²ÂX(!ŒìñHN¡Q*e¡e—(ްè?¢&vÔHc­l+ÞZÃ/ÁQ‘2`A w"‘(ã¬2 Uí Gh£Yº“&àoMX]öo §«)CjÍÀ¯nà«1èhn„ð|W¡×W¢€±6*Ö¦Âڨظ¦Ú¨T;¨Ú¨ÔCù›gÀN{5C˜lV°gÊ“Så[ÓWy²µÝ‡^u{´C©„FùWvò>ÆþÓo„JXødÔ¦OI$a£È¾f([¨O`Œ˜¶Ï¢^‚¯@ÌÚ˜ÌSšæñp_ê®_aõ9C_ÍΛ¯¿úð^6kÄ‚¼º2Kú½I¿™Ó×;ðé;Jzc]ï(z}~o2ËÌÛV¯jAÖê'¶‹ºVÿíË]~/"*C¢$Ú fýXÏÔ€hÍÖÖ¤Óu„ BLãŠâkÂÉdšþÿšKOøÁÏÁ‘O»;Ýš’‹}êvÅRÙ¶é³Ù•‰Û%Á¢ þæVøÅë¿¡Ý[þJ½Ð¹L«÷¼$‡¹¦µÅ¶f^ׯ¬Y­#^Ká´yN›<([+]ä’4Nò:ΆØ0+Zžâf¦ª„7χ‡Ž‡Z3à ;ˆP1Íw+Åï?"oÉFbGÃ/ŠÄRr ý#Î!jJÞž?'ìùN@¸ÜZØv0 …┞"·HÕë×´,[éûSøê€i7™p »‚'‚d#Â_C[É®à6{góã-'ýÇÒ&„ËÝ=iHÁò ù%{œ§ÈçpàHðxÓñî?ÞÊÊK±+H¼Ä“ùÚCñxðw©:DP!•–×u_áÛø æ|ä¨èsýŒ­B¾æZsû×9oëîyΧ¤o¼(ªP•! *Þç*ÅÏ¢,E©_€af1E \§X’¦ŸRXH=‹{Â=æ•Ó,㜇Ê݃¦ÏMÿäSàœ~°ÃcE­˜ýÀ¼ËüUdGz]ï<³'[Or¦Çá v °¦¥‡ŒŸÜbõ/Š2y#†cbŒÆèŒ™é Óþ{K±°Æa÷"γb—5jÅ־З¶ ¬ÖVÕWq#Ê?hAlboݰ†] ¸’¶T0åI9íîÀŸ/Kª63©¸VG˜,¼Å—Cí&²Ü{XÊ>2ÀDYÜŠÓuA¹–›£Þ‘ws鮃žnìn|Üø°ñôï¯üóü£ŸÿúÙ+ÿ>ø( ½Cß6Þilƒça,ýÕë}cãË7΀,<O ”DÛ¤™¥v]D*ù«ßî.åÕþíÂöÐ7äaõÅû„ÿ‚tI¾!ܽ/µÒœ*§*ÉJºGÖÔ éGÒÃê¨j{A0” õ‡~¸!˜Çeø¥ô^ûûÒ{éëòÇRKHòÅI©4Q‹„h}q…cÙ°Ü+ˆXY_Vnkóa káQ jA=84ûTÚ‚%½%¤‚®þXÅ'Ô)õšÊ¨`$R†@BÂå4¦ÍiÜtúè<žS'áñ³ñÍ[>ã£ææ­ºj)†“ûH0¶úz#qubžòÕ:ñ˜|SAISCR¦=äOÊ©L{ªRˆ,é@¶IA, ¹æíÛ‡úI4ˆú{L‰H¬‡´0Š€’6‚}†ªAŽ£ò?–ŽF9 / é6#, ï&Xx%”ZUœy“è³W ú ;ÿ›nü¢³ö@é‹ámGVì,¬Æ{;F£DŸF·3_£Uÿ™Ý¯]s.omýÁèº#ýÒy‘ä†m¤ó2*b¬Ÿ‘üô¸’Æ¡%€ÿfêªx5ÇôI?Êa´]Ý*1V°&SÉåh á!iìÁE‹íLìJ‚±ØÑÜ)8•¼ºœ›•|-±ýðœ´?}Lz^Á¯I§sWr×µ[¹ÙœƒGmļLºÛÙ­vk[¥Gò­Y …À\ñJÊ"ùÏI’_TÅEw$%)Á‹1H8†ÙlæU–b¢þ\–cW³³Ì ìK,f‘0*N·tW—‡°Ëé$ñÅÂÇ©]W¢›þà@ ÅOÇñc?Ç•A/—¯•™rÑb ÊbœƒÅ@”%Ñæ3å3nú DùŽ—6_4lù¼é2àÄUkwª#ŠBÑ”o¢)?‡¦9Ñ®×9§j-¯Pwrõy'|%蟳ÞÊgÞûóNÍOñ–댈ÑdNÌ 3B5ÑQ@¢¤Åº €‚'05‚©š!õQ’øo;õß·Ïx+2õç^ƒ¨IyûWÑ8¡fh22‘yE‰ÇÁ€Úÿƒ"Ký:tÍ‘`Ѽ­ñÝF©sD¸PjeÉ¥aá¯×}ø‡§Àÿð¡¡éÅžõgWO<ݽïÆ÷C³÷䎽“©ÆžgÖÙñw`ü©'Oxh®ýÀd&¬½¯Õü‹à¶1Èe’QƬ À¶º»'a™~­¼°dÓ&ÿ¦À¦à&¡Åì0;QvªÛ´Ý¶Ý±Ý¹Ó5Ž燵ƒ–glcŽ1ç~ט2n/p¼£à(:JáB¸.ë†s¦X$Ídr…%°÷š´€Ñ¢Z|qqqi…cEvжƱ–[“Y£„£ÅB!ZʃþÁÀ`p}×ÆÂÆâÆÒÆò†NÆfËxlBF´Åº{2Zw¯yJGÙ£ùïiãù)ù­ìÛÊT÷ínï, 4„…Óð.`x.¡I¦_w”Žu†„ðPTˆD.…ébà˜7K0fwzív§bÏ:M)«±µˆ0Cœ·ÜɈ²×Š'@$ŠÑ¤&AÔ¹¼ûŠßtCÌ}Ú}Ó͸'ñØ…èDDáÈDÓDO¨pE½¥ÎJÕ——tõ]rÁ 5¦j„hMêeX†*° üM¸W«Ê‘¹Úú M¡µJ^ijžÁ—Ô’ÎÅLg3_~r‡@ºNÒ­ªÀÚ`Ò²¤±9eë°PÆEÉÔCV#—­9{ÙìJš#Ôêrf²IžÐ«%ßB1¯4j,M­$è'دҜºÅ¶Õñen‹Bs*nG#Èp¿v›ßU1i®JAs¶d=¸E‹‰Ílp-õ¶‰Vt"¸ ótJJ¥JÅr¡‹Ênys*ÉW'6n; ,ùè§Ïöÿ—îjÚ¾ã¶ÏÏóåÎgßù¾øqŸ}¹\ì#w')猲R’–°E"@°ÐÐñPÆ 4€ÖÒ”ªRym+L›¨¶A[KHT*[ÅÖjL¢›*¡ý±…‰Q¤®ÕX5Iöû9á¡M;ËþýüóCçßïûyýý½Ö’òA2QKéz²çìÆ¡ ZŒéŸêœüÅÆͱ¤æJœ>¶j÷ò…MCëŸ=¼ü蟢"[èǬy±wÞúùƒÁW»þ¡œP,Xù &Ÿö4ù ·¥íÅzk{åt¨iK«h˴׉J'‰ã…¡µ²³dšì™¡âDÁ¸­M`]Aóˆ Vøx]ò6‚#˜é&iÆã9Æ£4Æã9&•¼ ù1Ÿ@dN^-“qù¦®¡“fõv$<,[†/x‡ •Àç¯sm³QÔ[ÄeË`¿é†'±Sm@2¹¸`Zj(d²p 2ÿÅCÐ%‚eð7BYVP¾Õý>p‚ÖÔ/¡-üéj³´”ÊrDçô¯ºëZܽ}ßâ °ñèB8«ìÌ$1 fµ}áb»[o•lh{Õ:¯u»ÅTÉ$[ÈNrG×3º1/3ÏXœYl¼iP9Ã1°.{Ý:j¼oü+K¶DaZZQ¤„–®W$TËŠ×2 Ât³†©Ùà‹3pÖ@熼œÁLÃÐnÀ¡]`/i›Æh+Üp$µÇÓ!> GÇ=AJzÿôñJ™³ÑÍö1û´=iã¶¢z‹©z‹©z‹©¦y~·€nPÁÓ.!¯ 2¼&$¬ÛsÌÞ"= ¬—<ò}ž1ò!®=éš ”ËwŒ. t³šé§µŒ†‘!ÝÐë‚jáÂÙ@®€²~Ó ˆÉêÐÍ¢PÁÃõ£‹ÈYôóžîdÖ<"þæÈ÷1:ÙÔ•.ÿüòŸnØêâ§š°¥¥îºDmçký{ÿPÂÐõEÊ–©?^¾öÆÑïUÿ‰ñCOëz¹nëÔè²Ë[—ž½Šé»ÕPv.~!yZ»C#‰Ÿ'ß#ÆÉsˆ±'ÈêTô„HüˆÚÚÏ÷kĆèÚØ ¾Ã¿G#zű.m¹"VRUz¥U°%\­ éö­ ¾NªV›£_Ež :™£LÚŒš",¦fkk´+1JÂrSHPSýbR¬}"U?Q §h%ˆAüõqS—.].·°¶ãHn!P E9)¤ÁÍJL–”‰™a7,R¤JSpCà’„\cà,¦„€ÍB0ŠdîÆÐا¶èŠûÅ[".Þ´£n´+z:z+J¨Ñ5ÑÍÑ=Q<:}6®j?Ð^‰CòèKÜî»Þ‡Äç’nÛ01« {’˜ž IÈÅHBu@ÑY!0ÊÄ[KôrnÚЧqƒK<¹«_Õ܈VQ×jYLˆN½F+®»» ?ÐQ2„®3uóž¹÷W_x°P[f)@&’f®QC Ÿ<[{ã ÚœËF úÜï`–bl gyŒ¥ ”aÌ©x…ø  YCh?Cùý6éP|0.8°K°i¦Ú=°MÖ½ :ó™²µ”©â=Ì †Ì’yº5¦`&sR½iç“N²d?A>Nu°K¤n²‡ê¡«þž@O²Çî.n ×RÙþd¿4д ßFn£¶ù·³;;“Û¥¡Ôvõ;Ö^üUú•ÔËÖËö¾âAê{H8?’|]:l~ß:lŸ¤O1§ØSÉ“ÒHêTí kŒ£ßõO$ÏØ¿±ïÐwØ{µwÔ¥ýÖ:»¿¸Á›¥ò&åÛ|µŽîg|L§²Äì°ðª´ÂZnûº¨.º—õáâ6+%Zõ©œR¤–™«úZ„om‘l&…³áÙ™•xšbQ–v –=¨û6¯ðaé{†–~“JÑ ãOß%Ë4B Ɉ$˜VN2ùx‹!g%Ã)6KÎÄÌæ1‰õ«3›ÜˆMSj€eÓ¸[J¦R2ã÷CtD¥HYµ4¶­ˆm[E’¢à•”]§E7L„Kcý~š¦˜ÖŸoÁš½ã–‹bZ¼ÆÍì’]ÜSÜ_ô-+®.®)nöN&‹·Štñ&ý)ó5V:›dÏc*’Dÿí²n +p%à œhiÀž›Ú—}Ÿ_Op×ãÜÔm/¤ä§n<È%^3‹¼áàÐ,òvè¡G°øÿÁøè‘â‚m4Ø(® bô>>ÿò‡® 4bšbME†Õ%γïJªh4=Ç9DÎʃIÁ0²³Û#ƒs8Í”©¡òWäH~ú%sú·Ó¿«›~¶ˆ,nE¿Œ—›Pöš©‚'$BãêšKG±†Z1û@p¶”yñîß7ïý_¿+–ÕuÝNgvMQØðÖ•ó²B O“`(×´{JÁ>{ÞŽ™tÐCuAˆ·ª+¾†9E ãT\˜>C¶,0un.ÖF<›hƲX‚&i¤~°=™áî=8·#ŒÖ$˜l ºù®Fð€‚'Ý`ȱ¸ˆÃµ»y·Ý× ã5%SÚ†l?—Þœ®p4}$s=Îh#é‘Ìñˆu!sA¿=ß<^ù»$]R?t.¶Â¢Þaoµ§x‹Sù´Z—7-ë1ÎæmµU›oØù'iWÛíö+íø¯ è`áyko~Ÿ…/ÊWUÍÇdqa¥½#¹È ùH#Z÷Æ«7¶mãŠßÿ‰mS´%Ñ’,Q´Iɦ%Ñ–e‹Š1µ“Øsâxù×4«M“%EWÛÁ†eEWeufdÙ†+ºb`] (Ð4õ\gÙ+C€¢HíC‚ úa˜× p‡®å½£œ"ë¾L6ïOÇÓ»ãû½÷ûåžN½žz=Çn"Pg£ÛÝî ™#A”ʱ1ƒE,ÊG}ô(bfɤ0ô ¸iè!<¬Aã9-³)-/ëAYWªg•*/ 1>ªÁ*él@X-dz1®]Qcí¦NWÍÅJY]–uœmÃ8 ™S¡`Û¦åÛ4-ŸKë5XwJ% moçyÎ÷*®ZƒÄÔ°ŸÄÓx_Ã+ø~€ýx™|æ¶Œhûµã£õ#ýŠNôeòû%wû+µ6RJØC8ÑÖË, !ä!©yRÿ|m[àBSÀ¢¯ÃÉ0(”ðìðá¥<îÖóÛÐ:”aŸJ·žËOo§Új …<”µœHŸ*‘Ö)79Š¡Û*9jÀÉÁÕ9vL;LÇW–ÂŽž ÓÊxïzØi³pTY¡_>pŠ“õ)Ž®)N ¹Þâ¤FJ Fk«a¶ýwyý⃼ÖÛ‚}š?8d¸^šÁ´æ~16„ñ#•¸µµ1«1B%3‚;Ï~ëÈúoËñPLìê÷³Êàîz²`l›Åný“g_}Šœ™Üb¿ÿžV©%7Šÿât ÙG>®O,ƒ¢Ñ‰wá'ë/—Ó!­‡1 NŽþ~/\~ î˜\ÜØU÷ fB!9Ä0Ô™8Eqß ¸ÿµ§+>\äV<†~µZtí£êÑöI›í<9kžM_Œ\Hóí\;OBÍž´9Žƒ]dB„M! w ™tWÆÈÙöNìÚ_Ň…#‰Ã™Iû F8“9Ó3c×pŸæ3µžš}¹ç5ü¹b¿ÛñaÇ=[;Ï/  $†‚0ij±$Êäb¨! jG,Ñeª‘ÈÜ6Áç£ðÐӸ˨f$Ÿl_FH›*—”1BÉd‚JÉHxyã³E*1 ³æÉÚq[<%¨»>‘x2ÆÞñ”äZšž‚ÒTÔÒvÚMO¦gÒµô¥´^&¯¾§ i—צ¬(hŒJTÝTâ†&z-°›TÝ,?Xq6d=‘F¿‘|Ëf9M ´¼²3;‹@tà9L¡pq4p†VÚ¨4„%Ê ©¡ý–äÐ¥K)¡W]  }I‘Ò°üŸÚRå}üçhôø¾JýFÜÜ×»¾BjýGå¿Òf’‘D~ïVÃþJÇà Ԛܡ¯¯¯×ßx(WñvR:Þßé7ŒÞÞ®£õqüË£¹xo;²«õÓdš{ 蜫º"F‚ȰœÉYàMˆ:1‰2”0¸E¦ÁÊü:‡Š2£13LakÌ%†\a0³Àñ×0ž$Ó„@—qßÛ©Ž@›X›¥º¯ì`6?±ãéÊö¬Ã›Y¯x)NS!¸Èt}/×ïb½~ZÀ{ÿõ ðs¼~Š0žŸón—+^É´ˆÁS^01’9Ö$ŒR1ucrçÎRã&ÀYNãf¸ÇÖ¸K¹ÂanÁFo"‚ÀÏßá>”B ,=W§ö4ÜÏ&dêéÔ#®6ˆÿ°@”ýƒXÑ’N­zU\ò3Š¥¼€^(ü] \,òJ¸,WkUVŒïævó;´úî²[½Ðáó7 ÒÇð¸,0V.m}¿ð)]Ó _ 8 v´Æ‘ÒÚ’lŠc½s çÄQÉ7 áâ@@‰ËqܬCSæ+qšàÀ HrÐÀ¿ÕÓÓsîÜ9È“/ñì¢\£ªxUÚBs;û`§9J dÏ,5;CZ3­ù4oj”Ÿ€+h'WœF{4àøáUe¨õƒõƒÁŠú)xöi@)ìÔÍâ-ûL;uEÚcƒ…þH8ÛÂaš€‡Bt<¤$èB¡Ÿìúq×àÖcÏ'ºÿø·Ç÷W “äM#íòw'¶Ä¤E–B•™}eü³Þ½#‡J»çŸ ¶ÿôpßÈwu]8¡ë½å\ÿ@öÐ¥îäcÖùú{/miš*¥WF~Ч*í½ÓÎè1@þÆç÷™ÜOPuáÈ+ÁQËË\›„T?E¯ ü‘W3%ftÈëPœKt~/Ij±Dl¥ê ØæŠ0­-„b†H=AÈ>ðwÇZõj¢‡Ó;ÖŠü-ˆ„M® 1°Û;öÙw8Î/Çq( Ä@›cN KÇ’5„&¥n,@íþèÔ8th­ZaÄ t#ë´ª Ò@G» ¤‘A€¤ÚTw¥À‘²êR4D61m+²”j0Ubû¾çPT[wï½;?ß÷½û|?ŸÏÔ&ëέ4j¿Íï¾ÇïÞåOJ¤‹àÕ’¿Î½Îõw«\HkH1ñ‘,Q&ϧŸ²ñ¶[. è»ÆåRܽîa÷˜[(ÂiÂÍ#·â6Ü-Ð-¹gÝÄ Ù~m›;ŸøÍc,‘hò0m‚ÄYÌ”Y¤#ÞªÌòñ–õ!ƒw’Zƒ¸ÚŒ PÐéŠH0Š ¦CÎpébØ@u§IÝ»ð€qðƒƒ`¦ü¤‚-ªçËH]b…×KA·r “xÍÞÃßÿÃÛNö¾³Ùc#2ö¥V|+³åÈ‘ímmõܦ?ûýíW¯æÏ¾¹¡Z‰/Ö/þå¡—ߟøuع0Ô êaâ;§%ß×®ZtQLˆ.Š‘i€¨%?×+稢èËy x ïd®ãB™eæEˆ§4º£1ÕŠâôíU¹Ÿ°qß&¡ÏÖ'n"áyÖ¶ÓVDEsÊÃYcýÝf_…»ðæ`d(žæ#;ƒ#‘ýê|cÞ±à»ø8w*~€/‘K¡I7#Ÿ·qPäºÕ'Ô±F1¾'^ÿêÞ<2àˆa Qn\äÍ¢É!S1 ³×¤ë3šfÉœ5çÍÓm>£ßð`Ï%-a':­#üÚXíjé4¯Æ\¸ÇuÐÅ¹Ò jAÊ£a4†&P Í#;½À¡;ª÷Ts½Õx¼WOa—¥.ˆ‰Šhˆ-¢%ÚÄì²ì4÷CÄ€5RØXÎ ¹›«d²£\.0꾩.¥˜£OߦïÐùéÀÇ…AÈööv܃ÂeS‚DJ0Þ;çËØ%ƒ©µQ(3–~©T'b(pâ˸¶Vİý:f%)Ûù+ÜÆw'æö¼ùOŒ'÷ýbyÓš¨×?²ýáoÝúõU­ø©³bñÆ–n¬M×vÆ¢Ý[¿›m~Vßyï¦`†Š¡÷ضjÓEVƒd ’*c`C†®1ÂÒœ¥%/Å“á¢@3دáê烤¤3ŒÈ{üßN…FzL¥Ô¥ø,»Ìõûü(/®©‰gŽƒ2W¼ä0®ƒ¿(1p‚ǸO_«0 Nž§S#Ã:¶ô¼Îé1'üSc¦ ”° B?m Áã3GïFº¹ý†-NìÅt3cµ™d…Ü’¥¨9i0¹ÜLG˜ rc¥ï•Îtuµ¦iŠ|%ÙÜšO¿,¼lÛ/Ó§Ò¥4±ÒÅ4‡ÒZc Ùoë—6%_'dÁFz•£Ë±Ùñ†ðÓÆ£iRJ/$9Ã@†ù Ý *øèZ£ÇxÚxÆñœñ’1ŽÆdš\ltÖJ¾:×:5êë èuÚºHTïŒÁ4§Ð`»kÂMM1ÞCNÓePƒ¡òZQ;¥ñ1mLã´[ ½"Äz¦¾¹•¶ç»ÚÄlsvW…Áe,ŽäÀûÒ8a Ç2¥G…ñ#RÐdumRêµRƒ’œêIÂÀ¶&FŒ¸B‰¹vŠpÀwr Ï Î!VAˆÛ0cEŽ«lñ6o3÷†¹KÙb÷ëóŸøb0duÒ½)©…SÎÿ-4‹k·¥Ý2ñÜ–g×?|÷£pׯŸaDy÷ú±®ˆ7^ø-žëÎô|óò•?¢¿|ÙÇO ?ÒùW–]/i w.@ɬ‘aÊ a¨CHlãJÚ±¼^/ô3œðDÂz›Î&Œ]áwD˜º÷1›+çi6ËNF ÔA‚(ªr¹ƒ5Èqz¦ô@Œõ@:â ÆN|%ˆÊ%ú«†BX!™ <"y0ŽG‰@^ÞN <}¥ÑL¬¥pöûcQX'íÂjötµÐ@ —d9ý²„'gf©Šç.ärɇX¬)…»R‡‚¹Påýó¶›ÉhV$£Q9²Ý­RŒJDŒA¬¾•]îkln ‹!û€ïim¨êÉà–j‚y»Hì’Ëøª8ʽ*îsíWöê?áNÏúþÄ}â¹¦ÜæþÍûÔ<ÉKðºQûä²g€Ò÷w9ÞNóD„<é^i_ÏuÙ{b›¸Mö­Ü7ê ò·wLIgíŽKÜ?¸y×m‡_š%Pðή@[ºwc°iD$¯~Ô¢h¨>5£vÆ7B þ£€á ΂€Ô¢úh3gmP3tŸ cúFÈUI«g<~^Û¥Ôxí¶ß_”p‹4&q-ÒAé†Ä+’%ÁJ¤ i^¥r@@£W|“¥¶È–Ü+óHVdCæd,ÓHì°—r6š]r.Pl\,PÛRÈASŸ¯P¡¡JŽxá×~>^›³ < =´|Í¡övTÈáìÀ¤ˆ0ÇYq@?Ì‘O#OsÆ3.+•qÃ!QÅ©ÏJC9ât¸2 Wî-•‘£2²³‘%Û3%” ÞŒF_r郃ƒ>±Šú UUK ¦RK˜ ^@â5¼}û¾'÷¦b+o¼së³s‡/.îÃ?³)¡m+ûöpk®¾ð¶ïøGÿŠñ'·0ù݉Õ5íÖnðC=ñ/Ù^EINZÊîDŠéUÊ¢²“²hb‡“X‘E,É X¢c¬Â^j©4Ae•¥>)Y¤òdMrH5‰hBžÏŸVE ¥;Ê%¥Ô1SVÊQ*Q;}A¹H¿há{_–¦‘‡ÍA0ÕÒÄø'©³DÄ"Í@Ì|5 cÎr²ld×a|ùkYN5Ý— ëôŸ™¡¾•¦ã#ŒCCµ|'ßéÚÚËïuÙ 8Úeމcd\·¿¥¼åHÙxj¨q(ÉE$y2*½¶ OFÉ/Y±xt<ú~”‹zkU8Ù«`¥¥±AõŠq(ð)üøÿ™®Öض­+Ì+J”EëA=,S2m‰6õ2MY¶EY~$¢ñR9ޕĉ“hN½¤ÀЃeɆüX¼v¯n@mtH‹ Ec`XVl?šºJ¢K› FpìG0`K› AÅCÐưÕÎι’‹(!ïáá½”.ý}ç;ßûË`x«¦­5Ò©V‰`8â âq¹…×].¢ XߟŸOÓqp°6ærµQé¡£á—äôŠ“ ÄŸw–œ·œwœ3Ðõ!˱ÖZ5WåÔ&@—:Ûa¾˜{XÊm—‡sÛàláEPýñDb>4Òøãó)©«J 4In ­¯IÖnÝÝ¡÷¤vLµ† œ_S_¹"EöÙ¾ŸˆÖÖŽ_[|ñø`º­¹/ E“†ôˆ=°}e©½KQâã§M'÷¿úÑÙq-Û¦Ëßõz{¾}ot?ÀÙ³3Áþ zò!æ9æû¦ñ²Ç_x3z)Ã2šP4ë{G£ÑÓ˜»y7òq„TÉÛ׎«K`¶`ªáÀ¹žËò»òÇ2+××ЖÈ0×Wò$o@6o@*ß…ÔÉ|ÄW% †w¡\h€À iйKcd¬Êöö@žïB`)` Ü4ý…á€\SÌ0Üâ9kà9ÔÕåšúˆMÞµÁy€™bSFHH‘…ÔrêrŠM‰¨¯);R"¥$Ù¥2ƒ{s[!øsEðÑà³ Nà±Á;€H3‘PœÄ)›ƒéå8™Ž—â·âwãæ¸g­'¤<ÿ2ýÒpã:¿?ýþªé¦á½”#¹ž[`M–0¬ÀšX|•Ö4á©,~=¶ÉÜÀ=²/ž,~H¾¾ŽïUQU·PË7ËÛ4ØTËuq‹^¨e¬þê¢ðz70´Âf]¶¿@‰È ›et½s0à|˜ *Q¹#.›@'ÊO6¡)S1ù<™2Ï Í-T<ŽðŸ2îüäìà>E—Z›Eb‰Fz{úzÒ=,7Ž&#Ñc‘‰HCm3©O…™Q’ 3{,9‰)hSsX “qqB"Gc³96Û:ØÓ[†˜=ù0™ÌëÃ4†:¾×<,‘ƒÝ‡$æHâP˜Ù×<&1TA„aÞýëO'?¤<‡b·H¥Íà“`T<IÄ{êŸN(4 X@w°XA‡:êŠÃγ™þ£wÐVéi0S™~ºŠ´Ã*_z:%ܳWp­ÏœÜX}eþOª“å,¬Ký^vý7ãßè É)©t{ÏÜÂKoýï?žltëÖçÓêiÊ¿0ž.8½¯oç?Ý©ÁnV~ß—þÕ?ÈÁÄ/Oülݰp¶æ oáö—–®û¢>wØjf-6Géðâ™×g{3¢µ õ„:N™~zîüÛ³£åó—OŽ~õþ㑔²÷Âþ´ßoÑgPœþ n.cZ®kckÖ@â ¼›§BÈ‹ ^‹A¼Á¬QN@ðÀ Ot"HÅ(ªeQ9­Ç4"›ívÓQ™>CÖD|†V}úß f!تà m—c<2\T”éó4.l„©õÀ#GŒIƒðºtÃkõ s·v™­ëînô‚ º(ë~6­Âú'½ÂºZËl€A\ÆO{’:=Ã7ÆÒðP|¤;ÆSùå©äòT–y‘¦DšiJ³ýD¦i™¦eš–a7iµàË Þ€à«xOÓ²ýuÕ¦¢]7°é‚]€ÜpS^ˆ[Œî¬Ñ©óÙyè›]Wt)»’5_ÍÞÊÞͲ*G Ùùl SF–„ÄD›»Êº w»–h‹åÛùD›ïmÑ*ë4’z,9’nÓÇI8–aè.¡­r»> *¶ž\剋/ñ—ù;¼™Ç"ÑYI†´‚6¯•4ó’¶¢™®jK»¥ÝÕÌÚ|ÿp‡Â6”ØYn×FÐed"ìeØ=0@!¾|Z*|AÉÒÀEZ¢’% kCÐÚŠò ¤¥½Xfæ/%õiˆZí¯ku?ˆ55‡œ•ZCÈöögv“àÉÔÂË#K-^'Ÿ2vö6½<Oõ¼”o˜ØÜÓá]¡`S·“x,¯mŸ>¿ïØ7ßíüa6,JŠ‹ Éø§ºÓÓ;Ò©dHQ¼|ö»§æhˇád¾42í¦çjŒù€Q@ZÎ…»CɲˆÈ–½"k¡µ‚ø6tx‚Û×q¶Í!îV|þY©ÓíÁ.Ýî]£l WÍÓò‚|d¸}8<ÏŽv²Ø‘ßÀp휺Á{PÔ7æ„û5+ «P3ÕuÄØ.aÊ™žñ9•ÉÉz02R Œ@?wÔàír&üR† ËíV/noËp¥Í¦t8(&„½ƒòwVトħüÌ…”Žg8Pó˜ðÛïoä6権S!°¢y¥¤¬(«ÊcÅV ŠÉÀ“‚‚ÙÛ›¦cv°6j©ÚØ¡£‘ Ó@o¾Ý‘hó-b‘p›6@%ߺظ”czzfg‚,[–µ ²^¯óq/5AÞþýžT°@Ó Ï»ðü«á­á³†mÓŽPõé]Á#º‚¿Ó%!\bÃ%!†Kįö8$ }Jø[n L÷æF7Vë{uXªê.0ÕOÀ»\+H¸QñMçúu‡ºåÏP êŠúŽóÖU• ÃÅÒÿÙ.»Ø¶­+ŽóR–(SW"iÉ¢$["eÉ–eº”d[–«•9vK‰—X¶ÕÁ‰7dË€}Ä6°¡@2Ô{ Cæb 4ÉÓ^—¦i§bØjE°‡Ȱ ÃöP [‘åËk0¤[Ñ%ÊÎ=”œ¤!^Þ/‘¼çþÏïjnŽˆ{8¥WR±á™0{%WÝé ÷éi*›ÄgyeŽ£ü³tÑOüMrÊ*ØËlÍ妡ªX_Ûk»ÐkÝèµIMÛÖ‰¤“5ý’þ@wè:ë¢7Ÿ|#tЯŒ¿‹³57?D+Õd†b¥Ãò¯Îܪ=„ÕØ‚øT.Ûûì²ëFßUô·Ý͆ YT¥zŒ"‡¾")÷Ç|Rt°_ÒúIÌ×Ç(‡tòÀ|ÎaÚK_‚ãŸó›a£T2À=¶~séK+¹x¤Oùr¡œÐ¾)ŸVNkøî{±]ßêþ¾ïºãºt‡¿#í*÷¸ËJ9TÖ¦ôrqVÚ¿#¹3üˆ¬êC™â™’…^¹NŽÊ‹zWB^&ËÒ-ùÙù²rP»Ö}Mü»èT»ƒ²Õ´ü~ÉåQ$¿7B£Ŗ¹Ž9ê]Çœ yQYô»ÂR4ÓŽñ]mÙÏL†Ð§‰ìSyøFg)¡g`oˆ®pŠRøë6ÝP¤øè·PÇ4£Žƒñê¸i§žr b 㙀iTDš>«.K„Wzü~9¬EbaP%5 òÝ1‘‘J*1™ÊTò±É.Ãy@w’ºÐ ¯kÀ†YÂá‰Î隟t¥xI”åXà8µIî[Õý­Ç#ºÀóÃáèÉÒ-Ê? ä&ý+å×éåiFU/†H(¢IІKf2œ)›—Íó¦é\0É–¹mòæÚT±I^};þ³oãÖÞØ\… tyXÞü73®ñìaN‰5•KaöÊ,)Ç‘K¥s>3dø¾'pÎÝ68èjGy—È;vy޵}  ø>››«Üê&YŃÛà6 Yy“aÛ _ц!ó‚3jã KEžÅ)OÑÃ.JQ²/Ýö…Âå-P欗m…å,ù‰¡T>Þër ‚sq&Y²BXüQm®*< VGî¢îø9ô[•{÷¾2M†_j}a¨o¸õ°Yk™³‰^äÓ#½# ‘ç­ÿq¦‡Ò@”×uÞœþsëOg⟘L’^¿:NNµn6¦B$™TP*£—òì»ZûŠÓD½â=9¹ K]P×Ôuu[½šŽ ‡H:æJ%)oÅ ÌÀ# .‘#I/mOC[òÓÛ”,P²F×é6½DP'½|[l|/—ž‚Ê*Ù LíSžg“Žgœ O̵Êe3âÓB‘a…(Îóÿ­,ME‘CÖ…9›ž1Џ²ŽŸsËŽß·£ˆÚÀl³a±µR\Z¥^Ívô>Ë”-«±$¶ÆY{¹Âl§×l§«±â¬×le®‚ý*è(t”J5Àþ­ÚWíÄ—jg0>³Â¬oUdÓT nàp£ hyXEAfÃàþ–‡+ô³‰áþ®¥±®Ûy6GAÁ9œCÑY Ä9ô,Êæ“köú›îÿbyXWo·?…yô`83và *}n±n±>™:9R?]­î¨/¹ær¡ÁQPu Œ9v3,¢­®X=ÞaG' í×sfÛÕ¡7ðz³cÏóK0=ÌîœÂb}IåæôxEïÂ0b¸˜›Xg*xWÁ»JÞã.:¿®¯Àwú·¬ÿÂÖBa¥Êb<«¬vvŸbkµÚXioe¯”áÉñ„Wàðo”ËL”Á{/{çWÞçfŸÜæÀ™3ûäö;‘P8 MÙG£ÏêŸn6>:¶ÀÅk€›†—l7ˆîÖÓ±P“tu ŽåÀ°<ÕtlîЀ’Ž©M‡ïjÂHDzM‡÷j¢’ŽÍ‚a½”¨§j•ÅX}Æ.Ô¬bzØÍ ƒsKËlaG©è\]Nan6— ©bèSV’ñ¬NÖõË:¯7IÞ’ iÓHNe d½p¹ÀX]°¶\IV«Zm¡ÆoÕ¶kÇwçøå|ç$Nì8`šƒ@!I!é˜J¸¸µZaË ¢,”’ˆÖnívR+ Úè¦N]‚4VèÖ.kZµ¥d›Ôý1í¤‰µÞ¤©Œµ˜ýžÇvèÔ(¾{üÜùò<ñç÷ý}¿§$2%ñxJ’нTŒÜ#1r1F6Šgͦ\˜XLð¦Yì½gJë®t­çæ`[Ø™–ˆ3Åv~CѶŠ|×wq¬X)NŠŽNÙd<ï–ŠÜRqµH/Q&–‹LŒ—LU¸Ì¶¿Ý4Õäp;oª¾áDÌT vW¢Ç°6u«=[Ú¨D¾@vœL$Áçn•’Î-ñHà§øsüužå/ÓoÛQ³KZš9fVÌ)“7Ì%“¡LѤMÜÇ]Pðf¥JÚ6©r¨ñ;õsÓ•â‚.•ÖJ™r@Ž0›Š0­mÈÁÉ¥YÆPÅåiø¥Ê<®ä/pà BE~~òž ( ‘W¿7rX—|žžÍµþ ]p³›v{ÒãÃ…º¿GКuX}wä¡'j³»µH[2i¤…QtìééSµXYŠA¥m;ˆ¾ra»‚ëŒѾÉ\:¨ímTZØ@âè¼ÄÎÕ3èñÀQaqíà‹x`ñ$Knc[S¼GLQõÎHø]!à‚ïjrêÂ×ñ} þp3¥°!B\È+'ûÆ€‡,«z½šŠÁ"­Ã½ˆüx°½50F?’~.ý½ïºûÐÅþîFÛ][¥ÝáÓèy×s‡Q§f独6ØÓеðû mkhˆo®&Àâ/= þPdÑ*>ޱvŠ]`—XŽýØkÃEÛ{"Π:8"gwŠŸÌdwTËØÓ,ev,=¸ç¢Wº¨±C_Þ3þ6å½»L±ðÒî.ã88þKJaòK…˜ü-ñVôso¡;L46õ¡X åKÓ©¶´;Å¥ýBH§bHё䂑ì„Q°EÔQ”CØÓªSêdíÚÂ~¨Cƒã¶ÿ(}”;î>î;ø†tT>ÚÆ—' Aø±]m¢¿…Wþé=%ü¤ @4|†8.Ñn¤‹½}}­í0“Ð9hjõä¡'¯Ï]?þøÓ¿ßU<´ùÜ©GN~u³xö[‹O}6á;oœ¼}lÓÀÙ¿­ýõü{Ÿ<_Ðq÷vm˜y X3¨ÝÞ`Íì·±ªæÝ>¹9Œ’[F(1ƒDƒƒºD̈ëÏš~讎!j!ÆŽÉd¬SÞmmÅ‘ìGWÊ×7Á9 ¢ÂQa  °àܪDpIKÎÕ…vyY¼š#Ä6¥õ •¿ûÙ% bÞ™”ñÐíîß«#܉Fõzàð¢þiG‰YÓá® ç3(ñÁbj¨Ô:Í0l—؇ðJh'^SDöå{4÷‚›®¸çÝ‹nÆý‘N/£Çí¨®Å§âô|Qq1¾_ޝÆñʆwGaf£HTq¦ŠM¶5ão-‰ Ed|"ö?„h=Wt¶ð©Þ´7Ý*:ó:ʵÀ¡àêÓQ§K§¨5tA(§gÊÔtdR…0v:˜C'áÐh˜‚´î^@rÔ,P±ath¤¤·½0úí}ÓÏN½>Ü—É·–Fjzd ‹ UN¡^—ïk»Þ÷à>{¼;—dJ3ž}äð37ª/Ï……ÎÚ­‡ j*…$OÏAæÀD·ì›«½>™Ø0¾ó±+œÞ)€ejKm˜¥€å•E7,+i"•é°„Oa9UDF>œIüØDøˆñ³#Z ƒÿ\ÂHû˜`ˆ1NP‰”Ì™ÓWçç]m؃•ì2!¶ÍrÔµ0‡Q 3¨ŠúÈ Nb¹uÙë¤íÎùÎfÎw²ÝJw|ÀZŸmÅŽZÛ³ã˜2¡ŽÅ÷Xû³“âå@|Ò:!N+sêt|.{ZùnöáEåõÅø÷­³ÙK¯)?i{#{EzVð—ìÇÙO³–Þy$u$óBð¥àK¡åNç® jç}¦ê4Ú‘©rF"* ªÆ$ám%R1Ùéä|Ñ(¥i>Œ]ŽÒТ+h-"ñxè£t Ó¿ _ÿ+Ì„E<ìœ#JœžÙQ½“-ãöŒ‹ó¸±:pó(5z³œÌ[“­iÊá’:2B¦^gÛlÐC€o}–šÁ ˆÖXËÖ°‚Rįcêì"x}Ì!¹0\Ë×ÇBòÞg‡Nÿ…Þ+UÒŠß4LÿÁ‘þ}Ìâ§çÛR)ÑSë{xôß¿»…RºÞ–¼“C?…~ýί¯,(p¾-€×›@V]jp•±ˆFrZ«ß æÔ5ä'dý_òÕš¾Vk:R «‘#¦…0}±°I¼äF$2²ù@'SiÀÎ7jLscdœ²—±ZÁ · ùö ®T¼z­éD›ý=—†ÏNºæ\´  s°R"”~’`ñÿK„ÿ !ÞÄ×4Í2ï™Ix>•XY)¯yȨ= ñMÈÓyÁ¦máë´-´ßBV9’Ï$ Cß”V-”ÛcùCºˆXyÞ…\%Ñ‹¼ C9!îçÍ!®K³Eù“š¦éh^_ÐiJ!!.뫺C¯˜¯}Àµ–ñfnNϲÄêLµì¯g¹Õ<ð¸3àï q†±¹ƒÖ ¼4RWÃÏ5CZÃÑ¡ŽÌ®ÛÞ›LìÂÝÁ–Í÷Õ²÷·GÜŽ–„¢nf?ø`°ÃèÛ2® =`€yKJ$O=zþKmØÀ/ïÞ¤ÿ¼ô°½ ^Œá¥`cwF#ÿHÆß7¢ oxñ¼šò#àFšÇ×…'oq6u Y:ì@ŽT!d9#ÇTô¨ŠÔ”® Š2¥ÐJÀC \-—Áåà §24ÓŒø¾•+âz']£# žµ$5Ðå ­gý1‘Àˆr<å )Ëù?¾«6¶­« ßs¯?î‡íûe;÷ËÎõçµkÇNã¸ÁQµÜBÓ¯QZ¢õÀ$[™D 40˜Ä æ+ ´dýåD¤/˜HX¿xjüÀ“ë˜ûÖ–½YRÌÙõ7N~iÏÀGrùÒÎC§ÎÆyí|ᇟ¬~f´vàÈOûÄ5,üðßôVÏÊDk½–‰¹ Ô°˜‹ ”Ð0{"*òª$U ‘© ›ᩘùˆYÀï"€£ lQŒ†=mdÎSÈL¶v}¥ÜYîqØ-Pûå×'½/€i(JúÈ#9|»¯9µ‘èXÏ…q6% A4Qäpí#²œ P„µy‰9ð²˜æ¼„½°ÁwÈx§„ÿ ùïb%Ô˜õÿ®¯`O¸v½ÑX’V¤å Ù9|Vó"„ l Ô&ÐMÅfåYýrär´­ßÕý­:n }}Á‰ÀDð?š×§E4Gc¢M7„»°ùb"ƒ½Ý2ƒ4|*ÞtôZäm¢±ž›oRBÝs‹6g©;£cB7Þ¯¢¦Š(URÏ©KêuõïªO´~}|ìáÓ¾Uj¬‚vè@ØJ­ÝÆÔ)uàÑmôIu¶yÄ>ÑüÓ ÆJ$%M5R!Š+[•SÕ-À›#hÏÍ›•\â1ÙI5·—núÑÈ×úòž+ëÚ±ö›úcùÜS‡*‡è/&¢‡weŸÆÌH?¼Í¬1§¨ =ØCUÔq1zØž,ì¾´ß×Cv¼ç0o»*1–h(§lÀMÙ𢬞Ç•ô†õ iŸ`‡4_¬ü,œáóØz²bLí,ìö=‚=ëCü'{Šâd{Ø“q´¤[Â@!zp3j9ØUØæ‡sŽgXéµwõï²½«îÃÎ3±/žqR¬ƒ¶ùãìv[ÈÄØ6wUžÊd€’ðÿ'Ä ¼ $l¬ýCÔ9„D4…Zèò 6½èfÝH+Ê~uF¥›ÐS :»;]öõï|X§ü}ÆÛXˆ¼ó÷•P‡dZ¢l‰†EI²)Å,°qÒV` ð Ä0±”}ÞTu‡ ÛüÕDpåT™Cb"Úï„ÖßøÆsã{­‘]h[}¬ð•ÇkO0§Ön´vZrêÈëÍÖ_h¢ÙmC&ʬÍ5÷où8íÿČʀÑ`Ô¦¯t1ºÀq”¡øÂ¯ždh64šùÇË”°NçÞ½±20B>@+›5ž3YŽK&àwB8Š¿oXõÉÄÿÉŠ&wà|Û$±ñ<+…þ¢cË·V¤[ä³rʧøƒÚgujÜ[óB5‰YèÉH5¬‡—ä²­¤5[·Q®Æ*5­ª{ØÝÜv~\×w‡ÙŸ±³ÜÏÍVòWÔö—Üiý´qÆ|=Ï-ð ÚýUã’¹”¼¡ÝçïkŒ‡ð*¿š&±°¹ãùnܹ³§S©n”e]W·†ÅäsÔ4𦧼ÏÙßõ~O>‘äFÙa~X«™¿ó-%Þ2üßçkÇtfD٥ѪŽ«”iÇ)…—ãp žw‹œ¡Ûš®r|˜ãxÓ0Ò ë÷y=$™ª€l¢|†.hmô4Á#‰Oó-~ÿ3ïår&±äúÊ/±Ù?Âé=ÊéÏ—IÙû•aï[‘8?TÅáB JqK`—Úèò‚”DÍd÷mÀ(Du8 «.Àè®6p½0Ö´;:`^[5:8Nk®5!XÇÕõXWNó–4’@Wu´ôhŒªýȆ" Ð/ iÐ7çy;ƒâu÷D. z̨‚Ë«5Ö™ u ‹‰z]MDºBBUA58 +ª‰ˆJ¡lÖÉ:2:k9ùÈ›}¬F…ápÊZ¿”_¿ÍõËCÌ©LÖN ®ûþGw¹ÅÆq•q|Îì®ç²—9³ÞÝ™ÙõÞ²;7Ï쌳7{ÌÂnÕ\IܸUHÐ*•Ú@‚­#B’ Ë–PkGY**^RñÐUÐ$¹`U¸’‘òÈ T…·Pƒ‰Š vøÎ¬Ý¦@gu®sÛ™3ÿß÷ÿèèH6Æ aU йþ5]̱ –èÃåÐ%P‹¸±¡­˜c´}•—â4™ j¾Oè#Ÿy»íº’‡×n¶øˆf®QDÏm„{ò€ŸRø5äI ¶Wˤ ÿâ§mdS'T¤†OÈ÷®nÛ•bÑ©é+ɽÚÝv¿ßõo&úY‡ÿV3âùHÚ” ¦¨êç°sŒ{ÁùHýȸ¯Þ7"䀋ý ÿ¸ë™|½è8æsͬ¢ä3%ìy-«Ùš§í—ÎIçäsV‡ËÃú>j/cv³;Ë;ô1cÌœe¦ñ´ø}uÖ˜5§Ÿà’ƒÕ|M½füÚ¹®^7ÞSß3n:y*dú’A‰S3ú̆ô8~\=ÅŸ2Ï„çð¬|F9SšUgµiGšá^–f´@”;ˆNâ“b4«©ª+ž“´\,$`Aì<΋yÛäMÉåñè~îPs|4¸áÊð¿O ò ßv‘ëhu™Ry†œ“ÍzŽ3êmÍuÛmò$>Ñ{5y¦Ÿj M)•ÒëõŽDj`?FÑêz­¡ÆçR®ˆÄØÒT$;©ŒçPÎUŸ/M•èÒ\ •Õq¼Zå®iêµqxÛ“ Ô…Ua˜rCM4j$¥ëCµH¢V‹ÀÊË\Dªéªq5™DêLC@yX ×!Ë\ITv‚T©ärY>ó—ϧPÊQ¯¢Ø|AA áj7:Êyåʪ$$+ t“ªQ úÚņ£æ©ª-ÐïP5JÍo€4­vWî­à5«kM¬@>ÓÓ^w3Ú‚Õô+Üê#å'6Dz1Çš‰Mö„F:HŽ{“®|/wÉ;^ö_tÜëº]˜Áþçô·b­™nM.-‘f‰]b aaö (ðx·KBõ5â»F…AS¼†Ôä çI…\¼ ý?ÏC›$I*7 ¶£ nËd¤íôK±v¨·ª&é+­iäj«—O-$àÿá¢à1DÈ‚W…ærvDý™Ž÷´)"̉ä<°Œ¾I¸ï5bÏ2d¢† B‘:qcÁ¡Ø¤×ߣBª×ÄI(Lziuú“^“MzÆPÂ3¡ˆlÊãü‹¥<³#BIzURàι;rúñ¶|z£þkŒ>µÃÇï_R’4LÀ³é_˜þTJJU2«ëMþ˜¤¥ÃÄçdÐ[f±N=¶g× 5·–·îŸ\~z—·>^Qú;/ÿ`[¥²þûrF;´ø‹/>ùyÓ€$Wñ–£GŸM'³€%yËñsëWOo ”ˉ˜$u—–¾"Ê:].‡Ù“|c´Y߸dªÒ[6ÈîÔ P§t¤g!cI"š `ý®Hº´ß¥I·êw«W7“ kź¿¶{£»‰¬ Rä8‹Ê&DúÅ*ªRqÀCéEr!‘¨QT½ö±éy¿»y¡Ï’_m:÷<ýå·©ÌÃû”òp•Jèy<ÛÁLçMÃç³^5éþº“z®ùÝÐK}4Ç…â¬Â¦9+‘Ö¸r¼œÖ¬ÔŒ72;ãG¹£ü1å«ég3GíSìiþ´r2ý­Ì)û FyzûqúGÖu³þA_ <‰eÙƒƒ<òºBì½]ݰ÷[PÒé¡A>Ø–å{kNLsAžµ¡UÀi°¥ ‹¯`ÄàßênÉË uIJ+Ä-dæxt›_åégøø¿ñ~²ÍíãsnÛX'k½+P8[  s‡mäÚm›¶•ZýgÅ7 Kµž§>¶ÜX^»×½‘tí‰íG¶}HµÇÖ–­NÈBøø`‰Üд|f þ$8£ ‚볬¸ïÅýt¶QoÖª’ŸÉ#ͺôf²R)Þ¾!2ì ª†Ì)ëßk¾õäçö=ƒÏí,?¶~E(*XªÁ7¬gõíëUô/Óˆsá(˜u¹k?øæK³ÛìÁZJøÂÁ³ô|Þ)Epä?ì—_LGÇ¿³3{Üííw·œF¼“O@X( g/°Tªr^"T0+±"ÚXmš6ÕÄ‚ML“–ÊSMúÒÆšš¦1MÓ4} MLkZSí‹/ “ ô·w« ‰ñÁôegó™ýîÌìÎo~óo‡FïZÚW÷Óè ° fEž[ˆI1©Lú.ˆ‘5©3ES*kSèTS¾\è¾|u·hU³j–=*cŒëA®J>Ù»Mf¯Ë,%÷É’lx]M*;¬²^uD•TCÊAý<-’éÈZ‘3'Ü8mqWÓ…ð̰¨Y%Ës =§ªQ.üœ ʼ>]±j)™É†âui½*S &å¨_JuðAHufgå“Ô¬ò” ÅT*\YV¡×ë;t®{Ë=5˜ êç3[HrîÕ–¹›I­ç. €¹ž›]´ÌJ¤£6Zftv;u⛦ݦßÜ;ö-½ôãP)ÒÒë¾oqÖ̦Už kÀ*$TÓzŠãêÌâµé`\Äü–¼:틃y–œ˜Î‹‹‚€%ÿœTÓòSué¢I+bã‘Yeš¢õ‘‹TY ïöÜ¿*õ-\éOä/1Çüû,¹o›®yXhá(/ Um]X}ÿJQYx¯õOu~a3æäqp´™^ÈC¹¯ÔN° I’fØ/f6‡Ló‹ÊÍð5¦"Ianp“sò%¶ 1 3y-´Ó&5{ÒÜ®4¬ÁžŸ[”;×&ß›ÉjÆÃpd)̤ØRD7q_"nY_îq »Œ8Iü ä¤Ï[€wðÕšÈ-ò>üe‚¦Í, H¶^B»eãÿ²"„7‘‹@½½ Ħ€’k@é°®0¾*©Þj*[{X?ÄOgH”õQÀ<4’M›Ðü3°ýG`Ç›ëR§m¾ÍÐþ5°“Êwíº«>jÇžsÀ^òËP0Löt£—1jñ—Ôž7ÀÛnàzïÔ»À™`üà,ùå½7€sT×dÏGT÷TµÍ”ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒÃÿ$0XÁn)¶Œpá± ™âìWñ©Zn^¾?Ô BXŽ…+à ººxMlmIiÙºò £²êÔÔ®ßßølu0ш¦M›·4?·uÛö–äŽÔó­mí/tìììzqWwz_ýÓ¯Q\üâÆ*ÔbYžBvÁ2ñŽ/.R‰0Š)g#Ðjçô[9‹7uÙ¾~tàµÉAû œ,ƒ­é[»HVOŠlJ1Ðlk >jOFsJ?ikAzÚÖ.Ò·›¶4•¶ïMmî?jkiÒtêá«—±…(E;öaE’â£ä«zîÇòhZ(¿•Ò÷b û)õпý´Ë“w]§ñ8‚,ò¦† tò÷j>yO²:M@†[²žÜ1(åQG= ÿíÒz 4Â8î¶>óƒÛÇG힥ñðûX8Ò«&î¸Cîté©+.[÷/~ú<ö÷áù3Ü>z´ú:ýåÃz“S endstream endobj 323 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -628 -376 2000 1010 ] /FontName /BABDND+Arial-BoldMT /ItalicAngle 0 /StemV 133 /FontFile2 324 0 R >> endobj 324 0 obj << /Filter /FlateDecode /Length 22514 /Length1 40524 >> stream H‰|U T”×þî{ïŸADDY5ÿ0J¨€•e@©Š(FÁ%0à‰ÄªI$‚ÖI#ÑØ4.U£Ñ¸¤?J£Ñ¨˜ÆÔX—p4ÆX“pŒÆ%rJµFkdþÞÕžÓ¼w~¸ï¾ûîýî: þx¹#óz'N>›ÿ°ú#ææÎp•צYê€7×´­pv…þÇ–å»s€µÿ”ògfø\Þø„ÚçÏLŸ;EÚf@ò6`Èá’bWÑñó¶ÍÀš`~Ó·„AóƒL6ØÊçî%3*欵$®ø>Ú{x¹‚Ïq3\sÊý«ƒ$ãÙÀòúL׌⿎û¾X5ñ$•—ͪ`ܼV ÷Ü—?W\žf+bNL X¦íA¤÷Û„HHÀ¼ðãç.5/xî<ÿÅUÖÖõÞwíÀ6|N1¤c'ÝAnS%  ·ØâŸÐ†×Œ1XAAèŽ.x Ù¤X&µ´Òœm^Á@¼†õæ.ª2·ðý«ø·ÁWŠ„– Ÿ"/¢À|>XŒö€ÑÔ.œæ}“1,Ãrì§ÍÛl5U¬/iH3šwѵj©v¦ÝŸQ‡½d1 ÍRtCjD¬yÚüÑ(À[ØÆ˜b©Q … Ó°oP˜ü˜©×±nò“d†v€-ec,fâW¨Á¡ ÊÕÎh­æ æ%XÐ 1Œ©W¨•Ÿ9È<‹ x‡Ù_ÏnTÔ&m‚{°¹Úü±‹|é:¨%j¿k[`®3ß…ãIàˆä°É¨ÆA|‚⺨4+1ylùu%¢9â§E˜˜/æË“èÅÞNb´Ïã08#{°û86G3.R0EÐ/h2ÕÑuá'ŠÄ ¹R6ÈSŠÔ;o;zpŒ*°ïá(Žái¬ÿ Ê¥©TF¿§ÕÔ, qMÜR>ªZý Ú´hw³û3Ǽ‰P„c8æ¡’cûv¢Çñ®ã¾§@J¦ZG5Ó5ÑND‰‘¢\¬Åv™#ëäAÕG¥«iê˜:«ýZ[buYÝwßv/sow7™»Ì&®Ö,Žè®Š8€“¬ý |‰óžúaýh<=ÍVfÑoh9m§CÔDWÙKxw” lµL<ÇqªËÄr¶~‚÷§â¬øR|'nJMFɾòY¹Nr·üT~«U´ê¥ÔH5^™œ™Dmˆ–§mÖ¶jj­–K‘¥ÜrÙZe]ès´­gÛWn¸K܆{'×®WÒ<ŽÄ¬çºoàáˆgÄÍøg!œlô8ãîGY4ŒFÐ8šHÅTE‹é5zƒVÒzz—=`„•±ÇŠ4‘'\¢X,‹Å+¢÷ñ‰8-ΈF"í2V&Èl9^N3Ù‡ 9_.äÈÖÉ-ò„<)/É˲…³¢º©çÕ<õµI5¨&m¸6ƒ÷zí€Ö¨5iwµ»a ·DZz[¦Z6[Î[-Ö¾Ö\ëo­§¬7|Ê)’z2r-Æ=ØMlÁª’Z˜Ñ•:°ç±œ‡<îŠ,Ýœ—Ï=cë,ÂT'ÏKKªâ™'*h/úÐ!TZ„䩪š±ƒÎ‰fõ1Ÿ‘“ÂÔ&9S;"lØÊÓh©ø@ì¥t4ˆ1V¬’ ‹´¹Þç`9M£YØJ-ÔŸ^¢$ªÄ)ÑEæÑB¤˜ë…¢v”M­`X Šð4~rQ?žÖWÜk”¿z‘çÓn¬àŒnÃ×ôîf^ãé&y¹xÊÔr½/‚gêMâ>«ä~ ã 2Ýr d቟d¤æ¡ÿÆmWT:OÒKîRµF}c&™ñÜaÜeØÌ}W‚!Ü1¹JöñÙsšÈî˳$‘»:ãQ„—xêÕ™†¹Ê¬6çšeø¿½Cqt‡ÖrGìæ)8ÌûU|AK¸‡ü´Ÿÿo¹‹Ðˆ«J=(‘û¡E›­-Õ¶h Ú~í˜%£½+¹¢Ïs5û²…hÂUÜ"ÎMâð$ãMfìù˜. ä>dP8ʹgcxާß÷dk©âè­â~ÞǽÑÊsb"öã a Ù¾ëÆqþ%K¿Í¬¦Ì)â©Ý߱ߔ,*Ø^*kZÁS«‘1÷mÓ‹+Žç‚ƒÆ²®[‡"¶Ð¹TÏxýx²:äQŽww D:EÑ~çä @WôÓ¾!8wŽ™,Jå>þ1™¿–½"0žeØ6t¦‘èãÍN©icR˜2 ¿ä¤>Oþ<1á‰Þ½âãb{þ,æñèÝíQ6ý±n]##ÂÃBCºtîÔ1°C€¿_{ßv>V‹¦¤ ÄeÚ³œºí4T´}èÐxÏÙîb†ë!†ÓЙ•õ¨Œ¡;½bú£’©,9å$SïI¦>¤@=)ñqz¦]7Ž9ìún?*ŸéWöÝhñÒ#¼ôR/íÏ´ÍÆôÌЇnSÏ4²f—Ôd:¬®¾½o†=£Ø7>õ¾í™lÏ”b/¯§Aä%DHfÿze„Û™F˜ÝáA`È™®"#wT~¦#Âf+ˆ3(£Ð>Ù€=ÝèëA†×ŒaÉ0¬^3z©Ç,Ñëãkjwb²3Ö¯È^䚘oHWÇFÇX¶ë0Bæ]ýï‘•eä/~ø6BÖd†–êžcMÍbÝh•ÿð­Íó· €uð[Ñ#ËY“Ŧk9ˆÃòt¶&ä´ˆMêO<^Ýó¯Øžéá8§êF;{º½¤fª“S^c`ô\ÛŽððÔ÷Íf„gê5còí6cp„½À刬FÍè¹;ÃRõ°Goâãê;Þ l}@‡û„ŸÿÃDñƒ;/å÷PÃF?ˆ,yÙ³¹ ½Pg$ùÿá¾êƒ£ºªøyïÝ÷Þ’b»!™–Mפä´|„… Í4%„M`Ú>,D›)SœiŠ•tC”@bkK›PÝPþØ$¨‹8ÒPc;Ó¦v°ÓÁ`*pìlM Ïß¹ï½e³€X;þãN~9÷žsϽçžû»Ï9Íà«gPhå 4ïBWxVdmxTAUÈ›Ïzöë^¿/t™ÀÿÅ #5+‘á½L\džÄ¨»[ç䄳³™"fÖ1Αõ©s7FÔiþ ^ÒG‹ÛùyHz:/pC$@Õ¨„7—íºªÓS /§"¬V±%êZ’ËØ²ÙµÄÜ«ü`òâG}rØ“û»Ã›2fÁ#ùa%åߘWÛö¢%þ¢’Ê oA¨ÊÉmQ鈚mŸ³9¥ð˜‚ –¦:%5M“Vry¬1W‚£Ã"†$õª°RJ…â+ {«Úÿ+’ÒÓoê1=qNëïì%Å57'Êp~ÎÈú¬õÑiˆWdªE¥•¡PÒ[! P¨Ðï+ U…VD¬ÍÕ~Ÿ×êTªCT¹ ±ºÒÂ…[+0‰G”|U¥ù~¥¾¤# Ô/© vzñ¥R_<¬*jAÕüŠŽ/ÁìÄS$ µjLË5רHÑ«iJë àIZ…TÈúʈBRçqu ­Œ¨¶Î+uøM$^{sÎÕb*ðÒÐÐÕL¯ÔÄÿŒá¨Ô™Ú(¢½FD-}(4ï¢ ýU*¥å°ÕÚ]øÆ:Dehÿêµ;Ô™Ö´/žî2eÀRK€yðéÚÐÇÃÜ”ghÙK_ÁXìVÏèåÔ Û.c&U³cmE~”wC¿Ïh£&”[`¯à¶R²9}ö\”wèå–e6’ ¡|úŒ¿c†ÌÄøµ¢Öºˆr6úþì[ Ë KxÇÊòö‘så9>Íeä§ú&`1Ð,C~ØüÆ£ÞˆòmˆkähàvAtÚÌÆ[1 9ã8ó&9oÌ#6'Ä/cº18§óâ˜x^ç€^à¸ØÑ8µxUÜ'×çü9`–ÚKó‘—«Ë&ðtŠÅ)*ÆK¸Xß¹óë„óø¢ÐrèAO”²°–Âww‚la˜}Ê:ŒõcÑŽ\ôÑ>™×>õѧèz»uN'¥GoWëdù:™%jÛX2âmŸVÿß@}[o§5(Ÿ×û, óÙÎ{ÂT&>WBØ d{r”O1ËÈ‹O¾KÀz |=@ÓE”æŠd OЗ_•çî6ôB¤F¬×Ídòkçp6b,õmÜ÷ù@Fp.‘K®tùš(™3|îBêã°ïº€nà”ƒ?ýàã·åþÅÝÀç³¼pF6_­‹1~öP+ä\~&ð4;Ÿf"/%ß-|¾Ë»ûq4ºóçó‘Ï8>#ùœã»ÏmŸ(ãü›qvüQžÃ½Téìë,`‡>Ž:çH·±.až5Þ´ºÍ¹V·vÒê6v[/˜5Ö«Æ«óΊݩQû,ãýäÞ¥œ'¾Ý{TϤ5Îy¶G¶Åøò-—ç›°ÿÖQ5úý=ß«¼µVì;äý=%^¤oŠ~Ú†ØïÐ~aëÅ*æ3QlDzœél¿MÛ&í‹Å‡´Qd¡ü"ä^ºÓ0i£ñö±z¥îŒmc^I»À»<ñ4ýLï  ¯ÏCjäµÇžOõl¦}&Ãý´G aÎQÌñ„”{%ŸØ÷kˆçg΢/êæÇmöÑ÷‘ÏÉÇN™‹¨ÌQ³ä0rÁ}oÉ÷éï ýOè OíñÜ‹óé2¥š8KäX´Ôyò¾þûc+£zý Ö?%ÿY–6„=4ˆýÅÀÓNO¦qú íÅ^ª—ù±eïm’™#˜_©|O ‚ãÏÓ£F;m5¢à]î‚>¬Û æRC3PníÖ0Ú.@ÄcC_"ß'|O¬7x¿˜Qk0>Úp òý‡qµÄ»ƒêq–Ìó Òs†ß5ŠîÝ L¶!ëOuÀVRçµ¥’Ž>žúÕôªÚ¦©à7Û{ÄKØ{{ižv’ļÎÓSjmÑŠÁ»‹¸34ø¡.ri‚v‘Š´åý³EO¢é²] îñ³´HTÀ?J«ÄaZ¥Y(šÁGøéªÔWâõúq NƒÏ(Zd4 œgâvrŒ­†ØDS¤_d¬.8ægãbnFn¿>p¼(ÇÇ˱Æâtb¼Q|ržÜ/üd›?Ñ<"ë] ÖWKÔFj¨§ðR²ÓêRZ©PZ¼L ¥ìJ¨PÔ)õÀ"@ˆ:Ú9ò<дG¿‰©ôô} òþ.`¨¿ÂÙ ûóÀ/÷\[v‰õhw‹xnåuš$sh#?Gw= Sþ¼'},±¿&òýüYcü´Àú> |Cæÿ}Yrè,Þä¦u\9J)§­!œçîSªÌç~ºÓ]'èë¥>aýÀ•iÚbÒõ(Ïf¸õÄu½Uý®‡Ëæ 0Ä{h$Öqs,÷úzlÜ›¡”îGž E)b鿾nx)¡n@½ö÷é^F¬^JY nË@ný 事¡öS:C[ ÛbÙ~#.¯AΫe_é/×ÇåyâúÀ—ÄoqýoæRJM”1~;çÅΗØ|Õù,HhsmO\ÛØ+7ëóÿ Ø;'Àïþ§ã€ç «€—ð¦{ï0ÞªÏáó5j$ºRO4|Œè“‡qM†|º2”3!?ÆB··Ñði”7ÀöÐ iô¸ó®‡úÛ÷Ê N¶?û áµ3<ÍöÞìEùX6|ò_´—ol“ÇÇïñó$Mb‚q áž&8&i<7Ì0¤äq Tk6Å…%c¨m'mÓŠ5’²AKR¦H$”Ô]7i]§Æ›´‰Ñß»ç¹ÏÝ=wï~÷Cø ”·À ÀâÞ1xòQh'ò¿G¾bHú„~ÞDs³ü«ÐÓ2ù˜sèÿÖïrþø´Ž>~Ú§bNô·ü ñ©½4ŸKxùY£4ÿKyé,q‡Ç1ß;R·}>ñŒSrÌ翊úºæË„˜RSq4bYsËø±è*Þ~_Å“TÅ”EÇxÊ~TÉØYƯðŸªsÞEôç ùúµGõ«´Ü¶¶²MäIÈSÖ=²eÞC®ÓSÄEOåo ¶LHɽMícöÝwá.¬¹‹t!~ùìe¥=­´¶Þ±ÆÞ¹§ý_óËÝ#?ÞÚ[Ô7ÊTºÿõ¢ÊŸ·Õ(U¾/WKíÝŸy/¿Ë}û>ýßæKû|IKÅ¥åqÀRù¥ê[n¾<î¸-?#õ ÏU¾<.)åËuÇó;¿½B<³ÿ·’ÊþwËþ§ÝŽùË¥ÿk©åÿã[ÿ·Òa˜ì€,9ÖXGZ ç‹ç®&¤±æËýM¿IBúBþ,4+×ø@aïË?O_G,ýOöäߣÈkŽ ªlQK}Ïåß­ŒÏU|ˆ1S}O`.>$íÐ6¨š¾}k®q†DÛç9v^yÎåWò7P׻łwsœó¾#Ï{È»wýšôñŸ`é¤Dä3üÇ)w]ÈLó—S®U!3âæ?"Qˆ‹™d FðÉ0ÄP¼Çnû\hN&R•5!7ÊŸ 4q’Ä•ª¼ Éò'R«<²úïÛ®•Š;b; ‰”ÛŠFêøw åOò§Hü(|=üqx|?‚T«~š)—;4‚öºP¼‹¯&-xá̉à;ðÝÕ«bCvM¡!{c ©äÛ¹WqñjÒ×¹f‡„1ÏMôÔäÇS÷Èþ·Ý«Cçø(×HJ Ôá:Ç+I;$ߤ/UQJDªx^³Ã"ÐGJ&ÕÕäOÙ¨í=Èמ}‹7Õð|½½ZdæùKªØd-h¯ÓÖ–ª® e"¼O->ŸP­%RÍ[B$ÒÌ7’ Ä0¨ÃH #åæãHcšÆ15㘚qôb±&ácx2†2íü0‰óC$M"í@•«mŒàœJlØšã÷r/FÂ=±£¸»6UQ#{æµkW©bÞTUM¨ë?Hz!†Î¦ÖxCæy@½Ê¦”·^q»¢ C·¦0=rÎñu|½‰5VD O‰‹ BÙ;,+G‡ý½/ç—]D^ú»E¿Pôß<ŸaÙZ1Óì=é¹È:öWTöû3™Dбyö øKË^°ËlŽtÁ/!ÿ|þüWö}çEš¥S0ôý»Ú#_–½e·¶ÂWL¬©/&j=¡ˆý†½IÖ¡Š?Â7ÀßdÒ_„{á6HÎÃϲÍdüõ¢ÿ–-Èoš½ÁfÉxÊ®‘]°lMÚ´í”öšM ¹h»X`¯±Ód-Šž±›×âî©TóášG}”ý‚ Ú ¢6RÉ~Fû±\–$—¤“Zös;,+IØ †˜c –0½aÓg¶™S<è ¶§¸á3ÚŒ°1eDÜl‚¬ÀàáËNà&Ã×™P‚ÙŽ°ùï$ß‹‘\“*Ã5®RW÷­§×Uª‹"äE*ÁŽBÃÐôqàz:==«î BCÐ!,qqqqEÄAÄAÄAÄW­A’ˆˆˆˆ)""""¦Ù߈˜"¢ ¢ ¢ ¢Šˆ‚ˆ‚ˆ‚ˆ*" " "ª„ Âa*Âa‚0A˜Š0A˜ LEAAATDDDP„ÂP„Âa€0a€0@Špƒpƒpƒp+   ­·šŸ!H9999Eä@ä@ä@ä‘‘‘c‡fx6ò6,,¬B²@²@²@² ÉÉÉ_}P Ãgs†F ÉfÀfÀfÀf›QŸ×$Y „Âa)Âa°@Xа@X ,E$A$A$A$‘‘‘‘TDR}¸C$–ÿQ.{jØs´_ÇæÊFh‹òarUùQrIù³dFù3dJùrLùaV~ˆ4+G}ʉЩ-®ˆK@/ôtš„¦¡EHS©‹Ð_ <Ûl6:\Z¯6©Mk‹ÚŠi-§1—³×9éœv.:WL;sNfDêYµZG±´Ôu×k6\»Tª‹u Ý¬³›ñë`æÊŒkz1@t:@_ÐH{ˆ:ÔJg0CÇi¿YÕÜ).Aáf'V¦‰Ù«k„Ýüy‘¦ k1[áW¡h :…¡Ôù ¡îP¾ßl,V¹ù¡û C6A<Äjµ+usŽUÓ©ÔÛÕ¤B¶ãßnÞöaiÛß {Ãöï‘ :Kü2 ¢g1s§áÓ¶¸‚Çg öK[ÌÃNÙ¢¶ÏößÛkû/ˆH5}”‡Dûоï-}—-ö Ø#¶hµÚþfY:€†|xÚBûɸ¯Hm(´Ôd‹m°F[l•¥uâ—O¤Muo$§Ð¡ks´ßAÍ{Äâ%qøß1°ø<.iì¢/M÷˜•b¡íUŽ;R)Ëc˜)º%ý¬˜ò‰WPõÍŠ—Åýb¢-­ãöIô{L5a‹cFš6W‰ƒmWÄAñ°øšØ%öùpß_ ²›d€ö³Ó³"Š ¿ˆ·ðÙâ!_Zuq§øž0…_l5äø’-…zÃm rH¨Ðú&ŒoÀ—–ßø£á4]i´ëZBÛ«ukÛ´&­Q[¯5huz­îÖkô*½R×u§îЙNôºt>g¶|¶u8ÎÁœyu¨´›É+.¸FuF&Ö*ÞÃzvwÓ+ó8éÙoXÿØÝ”¦•|ÅZÑÔM­ÚÒÓ×mmiíIkù]V¸µÇÒ¢{ûg(À]‹OSÒן¦yyk´ÞªÝއdôdý¡ôÞÑ“ÄëyºËÛUÛ¹rëÎs‰ý‡ôªnâ¸â»{§Ó§¥“?ä;Ig8[Æ#ɲAXgK Nl“¸"Ñ(RÇ|tÀd’†4SÊW’©§CÂ$¦3&-æcú‡l…Ħ…ºñô#mÿ€É4%í¡3&igb:-.à HîÛ³ dÊݻݷ÷Þo÷½{ûîííbëP„‡»RæíŽžDæ¼”ÌÔÑμ”ìȼÖ#?“˜$6RM+%ÉÄ$»›Øâß |vw, ° Ñlª¤`†6$Sä“6 ƒ5ZÀù`8༔ÎT€|Îg*Ðp,¦¸±kr<6&ËŽQ×4̵ ô"ÆÆÆ|> ¥È8AQ8¡ÈšaUÚD@ª=Ã6‘kÊ2ŠEHð>$¨ébðŒgS¼| S¼0þÿ³ôµùq¶6}`:Þ§Ä{•xÔÞÌëû¶ ™ïm“å±i*3Œ¯wÛsÛ)ÝÚ—I+}±Ì%&ÕN?B»(âmWÚÐ’kud‚ÝoÏæ •ŒºõÑk6@‹&P|G nxÔ*\#ÑÀ#Ëà£J: MÚ?€PGfEOG¦±,ÑëAUo, ¼UK<†ÑxcFc|b~ „~0Ru´çÇ~ð j‚S—žŒp#zB ƒY§T÷Â%ØÁ_… ç8²¥tÜé­ Ù ¥´bªöjè U U…F*FªGBp?¦g”n¥ãQ ú–ÝÁ$8Ì¢úN»%MñíøýIÿÖüõ¿ÎÆKN¿ïØÅY´é—d?€À BziPzqˆ&LkC4…z!ëà‚¿)=j{Ÿà<§Ÿ µéØ<ƒLz6‘hàtyÂüûg°€?;œ ¯ççÂ]¹0Š@Ÿ¿Mm×îµW@‰Ý“™©{ªÝE2;E5lžÿ‹nT÷ ÍVÁ~CÔÍvSÀi!O¨æÇå£Ösâiù\ùè*‹‘å‘-U*˜’ÏÛTs\™e¾pšÝn§$ˆ¢ (r PÓÔTPPPDfe“Ûɰ>Y œk®) È’Û)ƒU[‹ppgÆfä\íæqLàƒjiå°÷ðCüÏò¸LµÕ ÛLS‰1‰Í]ßüð~©®\.5ËC]Ï"‘®ÙȬ½´¹°¹Û –6kO‡yCX•Ò1ŽD7$²3 V` Ì­ N exh襒µ5(…Sz_%Ç)r¥/ØÐòѶ¾ÎQRÌé‹C¥§w8p¨1ØàS–q%Å¥ ­£¾®1¤=ÿÊ@òwÇò7í:{¦£óO¿¾üéÎS,wæ}Mrà­œ¯sCw<Ú©VmíÝÿ­¶—Ú³Ÿ­ÝõTç»û‡ßü[OòTû&?z#9Ò—¿¥ö¯>üÊŠ•;ËêVµ±3º²á‰ü«µÇÚ¿9Ц{ó®|7Ù+Æ£ÇTërÛ†ŒyTh¸„—!#l¬Ë ŠŽ«&ã-˰ÌÖ°„ ogí§wÑIÍææfùYðæ!:p +>äáíê )).,u¾_½3òܦƒSGûו|÷—øßÿÀ^L®_Ê_Í?}ó§ù³ÃÏSK¢`‰ªYò¸*T’JS?é7 gÈY«ÞhàÜ…<µ AŒj6½o¸¥¶Pk wF©5³¹™¯SÔÂSï(,)Ö&Þ[í~þè/OœiëøY¾{üòÏÓ7ñ9øs¾ìÎÕæçòw©%nF ÿKÊÐÔŠ£Ex£´©ŒÄ¥Çʈd1ëÍj¶˜Ä8ëÛá ìS‹Ž%Æj‰?c¦#6+*iqÐdRi/jp´¸öÊnÕénxÒ½ÅMÜ-¶ªU{´n±k Ú+cŠ-,n1µØŒ8bü¡‘EÏ{‹qºGìšæüN17—ò;…œHI8â "á¹ÔŒó+~VäoÏ sâ ]ûb ÓPL¥Š*C‚•¾Ê£Ô¬/ÖÓçRN_ê(ÕWrÿ9ѾÞc÷mt­ù~¿0î*nÛÜ|áG/–—¼sx-#¤»Ÿ(3°R‰)TÒÿø´ÁS%]…ÃUξϿ >Kç'ñi,"3Š\0ÌœIO?8w7™M¦½Ø§/·Á_§Œj oˆ–þ}‹ßLÖ«kv.‡íÍ ®­)òÂçÁé+CÊX\‘ÞÚØNŽ`ñã—ÞÜ-º·m¤kô¤Ÿn t“jÜE^&¯"We·è°n‚<û¡Á¨ÃÈbD?‡¿#‚0I©:ÄzX™Í°,+š.â3x-˜î¢ÙÒõã¬æ0¯×Îéƒå¡zÆ—ÿòÝ«ßÁ¤f†U†âóå¢Ô#ÄZÀ GÔ-„œ“®ß³¿®WÄ+NCÔuG¥Mâ0û–pžu8§Œ–s!g;¢bÔi(ÊÅr'ãð±›Ø#ÂI×I÷Ié¼û¼d(D/ÉR­´O:( IŸJ‰††£¸¤A"¼Å&ñàFB=©BÊ¥ÛV¡£MSY‚-6zQ<–€…XTà[F‹tÆkež“Û5~?Ë>ùH{ï®9Hz·÷„Ã]ô«Éù÷Ì@¢÷§ö„í…9õþÝÏ4?5no¦6ŒÛ4¢ZùfÖÀ7ë v öæ…-(¹U³Ñ%ºˆ«³EÁDpÓlˆS݉KÈ5¹¡Jó×›šš’xD&¶{ !ó ¾¢±|1Ir,§g-÷*ù‘¯.ûW÷%Û ù¿‹Øð›Ïî¬ëªÏß^çÀºüÝãØø×±ÈÓŸíÛùòÙ® (Î;¾ß·ûíãÞïƒ;`wƒóã§Àxõ6j•">1jN|à#ŽMÄÆ÷‹N@bÕÑN£Ö™Ì@¦6˜ˆ ‘"j}Ôhµ“šªÓÒ¤im&øšÐ0-U'rKÿß¶Î87»{·ì~ÿß÷{ü¿Œ;Wî]ܾèùþ©yt•*os~X¥Ì_´â&÷e7Þ”±3bß#‡]lép}žöeºèq¡ÝžÝ^¬BÎ!¯Ó£Êf›ÉЉr5S•iæ=fl6#¬Yeg‘;)¼ÎC~ê¯>n^ÿœbøš;”o>f: k`òغ·É{äf¹M>#ù¦Ð]•‹r}žnï:Ôͤ‡¯EïÐbÀ˜èµ—%†„žèe]/¢`–CJQP>&á xhf¤ÐJ=O`‹Kн€#„ŒÛÅädçV"›yõ´ÙëVO]!¯^ÿÒ¤‰KzÒÿÃßn¸ºeÙõ­ô[×.éß¡Fuù« «Vlv÷°¯ÌžüRí‚‘ÍóV¾yîGþSçô¾ÐÓlÀ5¸z™æ´6f…qØ$H?L‹ïYZ',öÓγö«N³›Œ¶O°môÇ×lŸ¹„“ÌUøw i›_¢P̲3ÿ!«YV‹T¬R`ÕCq iÒgÒ ÄJ¨ª½ !ZÕ²e®ÖR(» @¸.«»Ê„L¾@Z·#=÷ œÃ`»?q,¨‹ÃAqd†ñôÉKÁÁìHÁÄØm 𹞀ÊsV½Ï0süœM¶WÞ>öHxõoúW(ôÏÃ_$ßÙ:mÊòU3§­âfd͜ڒܬ÷ßø‡Þ‡æ èg¨öäÀÝû6îÜÓ¸ о „üŠËKubaÍÏ–!ž/ã R‹1Ÿ‡!˜´‰ŸI%+m¹b÷™8ô#`ŠÐuLì—Qº~¥³f:ü›ž! ™Yèup‘âÔ“«µ Ž0¼ a!ÎUT¥<9ÊÆ™*¸¯¥Lv~TA¤!ñØ'AÿW9žÂö5mÐó%bàˆ‰ÅŠöBÿ›Á,=äAX×õ ˆÕ“t´Ë8R x²»Ê#î67v»]9Ù‡ST\Ä`þ*¾žÇ|E0¿ tDE2F¡¯Ú¥©‘°ž^^®ï ·„E% ã°+[agL°ïl/|nÆãMB”$êî ÙXjß@”¥ÂÄ=XÿQf¹›†‰õ:i~Ì›ëò VVº4(€ 59µ8 ÓL fýOTˆ¨âÒÑT¢ùy9¬]¾ÈËÙ'=Ò4÷µší{שּׁ÷èf<ÿAè³+&üc+r´Œ›¡m¸Bº2_>X³ìý‚üSÛjO×™EÌ]Ô? Òì'Ì’Hò„¾^2%¦Œ{9D“dáàm2ºBó'mÊvi‡k‡§™ù9IºÁÞ0þ‡•RÐ4pð¬!k¤íDœ‚×ëôzGà B$¤Ëì'FGU£é6Ýdú@<r{Z45€/h®æM+äD‹fqD-5VTeEVÍ…|jÙŽBkýÖRÍ|ˤå‹d  w~‹€¬‚,D¶x»Úý[‡×¥Žº!8à°öCÄ]@GúGbh§1Lx.G¡î§*ÐÙ¢ÝF]‹#yœþé7ú_õ7ÑFEæ_Õë_øÞ]û‹ßÿ®em+öÏ뻋ö ¹èU´¯yþ±V7ÜÓ¿Óï}³ŸzÃ[ÀÐ…ÀP4€Û´’ ÈýEïn‰‰„¼åÞ‰ž9žåRîíoò$ûD¶SZ:«MLÏo0ÌIZ•æ¬W‘¢F 'ì`¡-bÃ6ÊBå™,|BAZe¢4òzRÛž~r†H4SÞ‹Þ™¿^ðãÎ…¥K+ßXôËäuürséÄšXl匱ÇIWFÞyýöŽ¿Ñ²¸"$sçFYÕŸ´¶v,uX(GöAOØ•™½Ú÷D b€wÈEHX;‘X.€6H## |‹'ظúsĬ™Y3')ˆ6v@ ¨Èôÿ¥0VÙë=CVô”YN@O +ò”¬XŽô\¤Ä®ºÕác¸‹o&¶„t=ÔO>ÐëÀìÀì`ö³Z‹Ãìy1"žÿ.rEâ^‹"3T‚óóUàÓY®}Š1bÄÆ§çoxÖüCmv2æ “Öü°½É1¸6ù6Û»“?¥È.õõ)àp/”eUdU kŵ¦F±ÁÔèmðK¼—÷;¼ÐL ú‚YâDã{iV«³ é nCÕúðåFøŽ]Àï¨:AϹIn PHJ`BØ…\ê‚ É‡Ð!7ÇŒ0cQ _B×R@ƒ—D˜2 ý>L3MÎ8ÂßÐq0nˆyE…-l~³¤¾w’ •žx‰K]–¤ :Q¬NƒZ{ù†–—ÄeÝK·‹½ò=qLžÂ§éIqFžÇèßÅ?¤Õ-zä3x}Fl“Û1[a¶ãºR¬’ëñ”-ÄMt¡h’òÅ Éâr†]ÀsiAÌ“ 6#ØG !d'iL°lÜJ”º±¼aûò åóåÜ*˜jñ¼´Yܵ³S-pë7 NLNÌP˜I+ì6Ô+Ä–ÙŠfŒNŒ©0[Ískà-iÊ…È&„bSÊ<ÁpŠá1ÄG1öAQ Æ+md!k´Æs<‚x¨µD ±æû zž¹ì)Žø[OAÞ2Ó¦á9nÁ…š ›´|¥‘ðkÖ:d.ÂØ• Ô¨O&ããõÉxd3Üœë„x•W*¶›tô¤f.kÄó‰ÑƒfZ äVïç1JNƒŠØRKˆ >‡~‡$bèHq¬øIñlñ¯ “ãäÂåFúô• êLíæqTCrmA ž 1NCÀk]MÕ*¹­¬{+xDòŒqÂ1fD@¼ V„*©ò˜æ`fˆ» ×\n¶™dÙkâ~sÄÄ¥¾ÈÅäC½š·›› "ïUÆPq©U®»^0R€|'/M^yLêMb›k•ó¡ŽÔ01ê @O—02rH(ÔxƒGΣ£Þ®Þ7Íټלí96?Y[àͰè$JòÄ%´‘l‚ßÏø9b¼K>àá$Mfð™Çïæ?%{y?ÙÏßs³4ÐÝ6»€ÝÛ¼nÔµfä 8­ž wv¸¢ª¶€ïƒÅÛÝxK®`ᘱ8&16gÙ<|[†]ö]üa\Ζâ;Ùnöû#>ƒ/àóìklfq5[ÂzØökl¨nÒ•»öÓ®A¡Eó 8w¢4^ÊŠ§Æjȇ—É‘« •mqT„_+×^tïß¡ïà;};mʳ¹ŸÅ³ñÑbÝÁžHÝÊ·úúìM¡­á-‘-±-ñ¾¤… ÉH(NÆ#IVVc‰D #Ñì~‰4é’pÓ3Snª-µ&Õ›êOéÔ—)œ dû5ä <ÓËù¶ÁŠ ï\ ž^mõôêXØ"ÄÖN˜y 0Ñ(%På +!RDAË‚üoVnD Ѧâ†â[ÅÃÅ hÖgžýäСQ|btçšÜÜâãÅÝÅ=ÅÕ ÍW}]œ˜˜¸úÕ¥S¿‚*Pqèv§úáðá8¹KG+õ“:§Z¶­•”Òók<úU1§ïµâßPÃk-Uã/eSVܱä!Ÿ®ºñ’‰Ïè¿¡v¦£ãîüÃÁ¡Ô›ÕïM§0äF`ÈÄsíz{õZ£ÇZ[}ÆwÒñµÈûíû3-Î*ߣ¡•UU¯œÞêK=_å 9ªcßRYPÖmO$ ÷dîqŽfŽ:´3ÓélÌlt>Í|ê9y«5%3Å©³ N“l²f8V»ó„õÃÌVëG™_ÉW¬W3e -#c8 ™°¢–q¤EQ츛HVÇÑêøÞ8Žãv­XÈr¿•ׄ‰¶)ZZœLf"-Gmh;êGÐâèsê&ëÑš[Eü‹‰йe±B¬‰e§%k+³ý0s6¡/‚¥&jþ<‰ù¦æ5wNËR•½eK`s]Fú[sçJ¶+wº]‰ºGÇäZÃÏ•»äny‹, ˜'å”#"’ä@À ëßâXŠ †q ZǪ¶®`.é"Ýd ¡D—2Îg¥}á{²â¸ÏL3 Ó–M½”ïIÍŽüâ¨cÞ_´Ûè«ölzüæÍÛ“á©¶cDà©t´Éj%QÝÐDäÒ Y\ w¸·»wxvúzýtø?ó]® ªKÓ0"b¹WÖÔ°ëU Ê,s®¹ÄäºÌn“„ÍóMsؤ&ÖkôaÓY#0LäU@3ãÖ Cå-õ@JüNiç¹ Èè² –·mxŒê}íWk» <¦æ…Ïž>·¶8$xe¨qѳ˷ä¢wlûæù퉥½ó×^‡¨g³Ð9çÁû ¸ qXÕ hsÄ癌Gî©Ê‘‡5å}Å4ÜçÎi¥~Ió@L'¡ÄÚhBÉÒœ"jæ{üþ^Ž'fþ˹ý!!"$¾ÂÜ ÎZEQ.*„Õñ*…@ªÜYwÌÜó!½ôßUK6BqE‡A»»Cldz~˜ð‡â4 ƒ†AÐ ä“«P¹,þK¹ªÝo)74þ$ÿ‰rR;΀?9«]C—eùý@y[;Jûø£J¿ö1•ÇÒ2>¦„µ^ºïU~§I¹—_Â.qyAiNâʰ{QÊyO_Îyì±|̇<ÍvªÀ!,‚Ù¯(¼ï5:2ß?®R>œÎÖô `5ÒÙZëÇÒ @x¾VUŠUU‘Q Kr±$ÉTÕ´¼)Âiˆ`ªq¼¢Š²$H¢ÈçAâØ U¨ü¸4®±”°0¤Y1æa«…¡ €÷Ô]wñ`èm™¤Ìd =“ Ά‚¿rîüÇyzøñ8#ò0 Òö ^žrZÚ± ©¼þdCŠAÅ Pñ:ÁËìßãØ¬£à¯ñ£öû„ý¥}ªÐÃ}{Q~dæí4 .þG€ 7Yoy¨©´ÓE =ÀïÈûÔ/ðQX¯îÄ=Ün~‡¸[îQÿ„÷q²}â\!&p‡¸žÛÄo’å8n‰®„iL™Jg)‹•éfe+Ý«¼IÏÐ(®Ú¨l£½ÊIú‰òw**DT‘“•r ³<’Á † hpتF|1<¤ ’ÞQEÐo –×ZeX÷I† Šñ"PDpJZU&zÔ<%j,:ËD‘à,¯çV(–50<\…på@Ú W§L'äæOdO\©‡á®¥qx+•J¡çÆá\¥:ÁÿŸ=/Â8ŒذëµÚGH† ÙUø³Lc¦ß¶™šÉfàíBì%ôÑ 4 ¿Z“ÕºaSŽòœHyÊñ¹u˜`ˆ vN‚ÈÄ*¦"øF¨Ž€D¼"A&Òd9ô5/’”£$[ ~pŽaDÒ$0€ï ¾Î>™ÅÇ ½]w_ º3¹ 8)Îë—8‹&xX²‚c±’@ôÁt `›7Jî¿1H¢(P—ñg®âÅ8ˆçg.“\{æ™zç/™]ðÖ#öJº&[ İ4|ƒG:g5sÉ}ÅÚÀ{pÀ„^ºÅ^yø0ó -ÙoèX:Fµ8e=#R òO˜3KZÊ¿p_ôÈõút}AE§¾¼bCÅëú6c¿1hž4>65Apùü‚| ýy²ìú…‚öAüœ›„"µã<Õ®ˆXec`ÐCñU‘;™b­©¦ 0>)„QÈz7t+DC¡j<YpÊ|AóK­Ï”RËtÃ4â¥iòó~*j.¥šu8øÎ™ákg†;ªáË*VG«ªä1®Ä#Ú^<=\ÚUàkÆœ8Ž/êü-#˜ñU¥OðÅžx*°*Àôñ+Ë»¶çΩ‘älwòz4·»äð4Úd&¦ùåÍáúP,„S‰‘»4ɘ¡ø¼ÈÓ’Œ&€‚¢t®À%©$y%H1&ë¹b ”©3A²g ­¡¾!g1sP¾bÐpT_‡—e£§OK·rf¹}Mu‹ÜÌ}É}C½¯4kîªÖyøÉúk‘†…SgMïVÉ?ÇîîI¼<`§7¯ŸUÒ KÓ§ziÑ«­%åá’öiMöé¢Ú`esSGmECd„|# ¡ÇqŽ%èAT”½iS'4˜3LRÔ!t(þŽ`¢ä†(ÔÑ&W“·ÎœF[]­Þif¸KV´hÒÈ€$âÅb– ¯ª"%P*]£ð(wá* Ó¸ ÐÙ…ºY# MÉÅ;ÕÜ6’i¾2eÎOŽ0E •ÄÉÇZj§Ð©tú;ƒ+JødøìBWäq#X¥Ï ’)'r!d±þëCÇm;3¸ø=«(Þ²:ù›—/ÛÀÉ|×c_µoÙßÙç'öGßžÓµ÷Àá·Þ`Œ?Þ} T‚޾¶Ú&Šþg W­ð¯ ®ÖwÚ ÷ÿÉ®ئ®+|ïûÏ~¿~ïù=“8qœ8.rƒ àâ¤)…aTŒÀLB·BS6þªÖ•–µ%°®[¡t„­-¬c‚H¡mEª¦±VcS%Öj¢CˆF -0ÖÄfç>;e?Šœó~®}Ï9÷;ßùÎo?i—œkÜ5áZèšu‡ M M±æsìV§=Øä§“íɽ‘ݨng·©;ÝÃÆ!{Àè·EÅG踌âK3£¤eòÄf|«êy3H‚œzy°y°¥wN¡É2ðª:ÌcòÇPJ&rlÐÈ8>fº‘%¥TÎ#£I~ÞPrx( ³Épþ ¶0œL‚-1+äÔ×þ%TMšÌÐ!È$@‘i,^W¾± kó–Õm+-l&‡w­xÛCç?£>Ÿ¸èÑ=ïžÙ¿lmêWç†Ìãñ‡‹< ¹[QÆÍno‚ÑεKíF -¯4îˆâºhw”šJg‚S­Œ;‡n αZܽ¢húp ÔxJ€WT8 )œPä8&HQUé!؉ nå’ì—®¿]BŒ¯YZHh`Eî⺤.£„.ß‹5•4ÒÃz ÿ'T˜Å‘ï-=Y)žï{»#ÕòìŠ/¬úæöýËÚqÌ‹ v@i£ëÞýÊš·ß:yðÄ;â­¬˜¨ÿtiP'­æ½â>ù‡ÚaötZ<-ŸŠ‚‰gSs­Ò‚èa¹Ÿë¼/]^’þ¼ÃÿS–+Ô Ë†°gS6Á„ÌØnxÓÕ…Jg”:š-dGóÙá¼{9P&ùõÙ|rð¯y"då>J“ŽÅÁû¬`¥­ ×góÞ§7=Ÿ5ýÁ¦?,^ÝÏÄÛ¶½°¨ö×Zó¹—GOÒøµ_\Ètú "…ç{m¬Ü^IAy]ã6¹»‘©Æ5T ýNSiÚó¨Yô2µÝl¿8±ŽjµzG¿2¦Éi{Z}úþ¹r‹=·¾åþ›ÁBXÚ=;” A¹N±ÃÖ9¶§–TÀ ¿| +º’ã`ÉÖ7”  f|É6fJ… ZãüÆßÁ©RëˆQ¤ $á‹w\®!ˆGB:¢ëF"=¸(è”'¡tmÌpø’}†Ëü£ i…+cͪ0¼¡46Œõä;çoÞ‡ãí‡È`B>Dã•[ÜzŸ·Ô.³küªÄÊdWŠ#].ÌÚá±¾ßVp¸)¦› US B!dÞã²ïàBeýâ5“LJäçÎ]ÚüÆgÓùéëN÷ÿþ×Ñ­«víxâñ­­uS¬hÌn¬YþÆ‘=ÄùÅk£ÿrðÉìÀ.…Úú³7þøíÞ7!YßGˆi^·QŸ—Tqn&©ÍÄ3õ¿àa‘gm¶–Z¢?¡³S!S7B´Ia•$µ’æEI2-ÉF( ÅÑ«®Íñ]‹f8û¾ÚÌn§×¡Ö97ꆃdÆm˧-XÛká›¶Üp®”øõ’Ùy…,0\Ý.ß•fV˜8† §a_^ Y_4ç1QÊ(güvÇ‘KüógVì_PY¼Z½ðÁÖ5éâUŸ˜½nGOaÕxhiSËÎm…Ï!hÀö«PˆGà’F<Ú8€Dð,§K9Ol©nñ˜xN¼(ÞÙ*±SÜ"ö–æxÓt1]DŸÂ7ó ‰8–ã‰â¡gúXŒÕfW(Çu/Žœ_ž4«‘ˆJ"qC2Dœ†Ï«Ø-^Å.Ó™âèÈ&>ò1Lg?).ÄïøZè%ožÍÇùêð$¾_`»ÃFd™²ÔÄÿõˆ±¸ k»D›qJc1é!:‡å´•çÚvxZbԓ&vç]qHöa®ñ=ʹ hÖÓÿå7ñÚÒM_ÎÖMöùvR“þ v›~ôtÊ)fšœl”‚Ù=2òÁ¡åªz“aÇgž§oVÝ È뀸舾{ù¸¬çh’»Íî„ Oktˆ«WrG¥³ÒñécIZDwÒ”Ì;b+÷5áŽí?a†˜QæÇÎçç +¹ÍÌËÌÌ~v·ß'HUŒÁ%™$ÛÀ5ð BJžËÌe%ÐÚ¢$ +‰4ÇX†ƒ\¡@@à%Z’Ì)êÛ^„M ÍU<æ—©@w#\»ÁÜwˣɎ«Ý^ïSy• dÒ#Óc úî…>1ƒo;mºÕ˜ˆº-M|¼¾»ø¼´ø~±ø‡â­­ìàèmüLñ{…åøòÎâØúJ r” eÛXª›=Æžc/²7X¶Šíd·°½ð€…hšt£14œøh,ã/]Â;øE+ìõBÜëÀöuxÚJÀ·ó°t× ÅÙÁ 2N¦¦…zHxÈi© VÓ©Ä"±3Ñ8x‹;Ä¿<ÁK\L|šPP"•hƒgŸ$¸„©Èäà¾ÛÉò1†T’vØ'ñ1¿+2¼¦ëuã**âu””ªÅ Ý[ÚÔ©ãµÿæ»j`›¸îø½wç³ÏwçóÙgŸMœ;Ç>'Ä4v‚CZ%d@J>B #KD!ÀØ€tccÝÔ¦]-éʨ–-šDʪ5%lKö!ek5ÖuS«µ•V6­h£ Š$V‰8û¿sBaSwʽwÏ~÷âÿÿýßïÈ8n4Ýj8±(Ÿí ÎŠÀg≄A”äyŠ2,qÅåIoÖÀï6`ªa®€»î2#c˜u÷fªŒ7÷ ÚmDƒ¦ŒR#mÌŒJþ½~Á¡>Uä€úÐ1@µ3Ýí¤[€$KùkúæC>IºE)Ÿæ'¾O±ÜŸ° ʸ QŸ¢Õcˆî›ìH7žÙvðL0k‘±~ùî%…©’|ÍŠÝ‹ SLâø‹›Z[7ulkšmÃ/,©_Ý7PÀ¸ñû[+{OÌÞ‚=;NPö,@6ƒvŸâÛêØí`Æ»åip4¸?ôØX ²½v—È <£D€² ›Bs°ÈgA¶“O.’_Qn#·€¦ †Ü…ÜV¦þ¼‹cA½kwAµ•$p¦­0U¶>·æ«)@[ßÛí'›£¸ä¥ËZzÏ¢LâÔ…•»{¿Iðzèò“©.nÐ\}M9núnú™‹øª K![ˆÃmžÍ¾Í¶à b‡ƒÂ8÷.þ³í/ܻ”mн*zÎ:ÞÀ¿g_uüF°t<Íö:h¯U…¼BR$3v9gW;ÃÂ8ìÒ¨»lWѼÍÈ«s{<]àEöD(µû2„¸ Ƶ,¿ƒ¿7=ue ¯ô\áæQT:°o_ÿ¾}X±G ?¾^xµwnä…‘‘áS##$޾—˜Aˆ×¾ë¤¹d™oµK:'æ|™p½F\ãkæ6³›oû±û'aœÕ2^vâ¿ÌÏ{Ü.Es¨ÀkyË].wÂã± €êÿZ”/ÆÙ½îZ=l¤çÊB¸Eù³À¹DÇt±]wú/З°“$f°˜„ˆû4ê>ÄVÿè‹nMl9Ö [x¶kû“‡ÞõlmËŽÂ_ ³…™Â{­³Òc?|~ìì™ÓPG(Š®µb1“ƒ6ĹÐF[—í ®’¶¸v»HŒ“s Q朚,Œã¯›åv;Ô7Yg’â<\š;À1œú¸tZÂÒãÒËÒ[#y¨¢­ø1îAã7?"EqÝ}G9Ï^´ä5dª;wO1ÝTÓ¨²±i4»~ë–Wœ÷,ƒ$~OMGg5]F¥æ½ UM\˘²8æ­5ÖãÒ›‹€û(”F&jAL'êAÓˆ¦Fˆ±fú0!sÅ fšÁ$„€ KªÖULXT1³µÅL-&^ ¬ëV¢J‡²_a”VÕôv«¨ESñ|ðÝ©íE.»’"éyv»’*&£øe[Ñ)vÃÕÞ¾r—²¹×MŽ—òî$4‡~"æYÈ‘ÇóB2ôÏWøE^Fð>à¡/°ÌL¨Î€¢ÏIØÏFßÎúepw@…2QŒi¤Jûþrm\ö¯)¼ôùÇ.}pédᦷcËþti$~Õ¶åÆÇïÍ¢ªÔ†Öd¤ªÔ/{›îÛ|âè/ží[zßýÑ@¬ÄéZÛtø¹?ŽÂ)ŠÎ]ÅÇmÏ'üÁ,/¥À’:ËÝu®µ®6·=ä§‚tÀO)’OFŠ„e¤9»Ó.IºÝ”2¬Œ*t't“ ­Œ#æ¼È£ü¬@§Kà¹*gEU¡@ ˜a&ƒtB‘Zýyù´ü²LwÊ=òwå·äiÙFɹTNËŒR /ˆ‰¦ÑZÀ‰å€”<7¹¬­~Ý-Ð7Úë=7BZ^qaêKh»á"ƒü1¯låT!IK@J½±lu6îÅNòFÄXÜþ­ÍñÜO •I\.lz2 _ª¨^¿ji?zóòÛ?(< ùù ÌF&úà”©<äÝå°Ñbëq½· 7y§°Ýrt^†PN¿,;9Ö''ü~Ф+`©„šƒ3ÿTç¸-hÚŸmìŠó_ê ]ËZn‚ÔŠaG¡yéë~¹gï¹P(º!¿ú‘ :ݺý çðp!xyçòæƒWÐ$X%ˆ“´âäQØôÛ’jUÆN–4Ò€ÁøÓô–I+Uë2'ÄÒ¼Ãáxp¢X¢UNuêÔbþ"/ÀÙž6‹J3NÊÆËTˆS|†ªãP\’.8‘(Xkñœ’aÅ!–rRù<ñK)" saSâ)'Ã;9cÄÂ3—ÉÁH2ËQ1-š"#*ŠêqæÍ`BÆqÚäœã™<ÓÌÐÌÏpZé²*¡QHx j+DŠ+\w­˜ª=ôઠÿ°Æ–>%âTÊ!ø ÖÑNa‘s —†4ŸRS[SëòÓÂ&dü¶Na]žß!­Ù›ýÛW/Æ%Åœrà–ANl˜K!³NŠÅN» S\Âxmª]æJœ^ARtŠñ9ú?ìW]l×>wæÎßÙÝÙ]¯Ùݲ`¼^¼Øk³‹Íºc›Ÿu€ò·m"Z(Ø-ÅJ9ªÔR©I¥¨²Ò‡(}I%š§¶i¢%AíCªÊP«µ+j‘P-DCÙÝž;35-¡êCû2w÷;çÜ;w~î9çž{N^îûä1qLÖü|¥Ãk{Q…:¥ÕtFG N«¥*-Æ"†Q)Z'5h)Vg4C«´Ië^¡WêS¶hg`˜ž‘†µavÆ…³tT:«e£ÆU¸Jg¤í*›1®Ãu:/Ík×Ù¼qnÓEiIYÔn³E£AšªüÁÒiËÑ$mªrÍî1Þ3î]Þ“y޵q÷xg¹n!qM¬̘ùu,âìú4‚‚nñž.cWЃ4nt^ðˆÊã¡mù‰_ëTJLU d¦!ßn­ÁHà]¢¡†(1]ÑTYUI¢”û‡ÁÐQ€eü~ÁN¡vjÄ Ôù ЈÄ?‘ 1ߥiwr•x¬PŠGK¥x¬uœów¸5ŠÙnþƒ6… ý•èào;†ãI<òOè–/+^÷åqÁKöuËà# öE‡aon\ç½¹{‡€}Šð¼ˆûW˜ÿÉJQ$Åò$øÞ$ ¼ù[)Ÿ/ßœœ@ë¦8þ~M8_Úƒ^fàÎ=hïÜ1ë‡)å}*Œ)Ód–Ì( >IUâ4*§äVØ ö‘"ù9­°$I+-¤Mé![•1}I^R´ZšTêY޶±Í´Ÿý†ªÛÙnZd‡é 6Lže/ÓŸ(Ù ew™O¤Š¢±jš õ,K;XÕ"4ÆÚX?û{NÒËl‘j ®öB(ÊãÅ• ‘eœÏY#˜#”)”™ š*rMürMC®".ZêÕ91)hU‚ I²®»—tÂEk^Ö“ UH²$a®ªjšÒ”pb\ÎjÈ,]=ò„ïUßœOô‰|XÈê|8´€êœ8M@áÈýH0ˆ;ÿÖXÁX´%È8ÑɨԘN¦GŸ½4Úu%Â}8qý-–@Ÿæ GŸ¹ÇÀààá$Kl»nUƒŒ”Lö½ý.ÙZ#çʯ_¹&Ôby–¬.k¥ß“-åI;üåtZ5Lr¡”DÂ|éQ#S«}œÂ‰Ì‰Tcß\aL–d™út¿l –iX èEX΄b*9E~5àËøSˆ4EFÄ Üv®•Ìqn…–¯ÈEpëмhEc¹nRgi‚݈À{!’kyKŽkkŸªKîY.”bHy\-Ù{ µ5T0oÍcÕ7q6ÆÔ ל³¡¿ÙÎ5ål£mo˜xÔ·áQ?NM¸XAkUÞM²[ÑN¬¤Ê_,¿/Ø6Ã1$¡h‡ÄÝ ;œcßyVÑÙDŠ_¬YUWÇÃV?I——HMùÜæÚÍûFvììu­?ôd 7”_¸yW˜8´qUpÖ÷­"×þ*¬Ÿ>D훤0ºL 晫٠æA¢• Ÿ’%&´ê½¬×ØOö ÇÈ1a$¤þ™~`üΔeèkʯ„oƒ ŒìÆ|ƒÉ¯ÙÉBÀ4½H_ÅT5‘lDÏ!é eÍ€›êsnÕò\?`¦€ È8êþ¬À„¢fá9ã%^´¡[hø ÅXÆ{$=Žÿ÷ƒCpø»÷*^¦ ¤‡Ì[˜\ -ð‘[í7ÒC<–>™Gzƒs2èxù4šã˯Es$¬ 9STnË4GÑ-ì0Ú¦0`z^7 „ÏŽsEÈ®'-­²"­_!JKvedùÑ¡LóŽò9ñ›å¯¿xz9¹ðGrùTF$Â_ß+¯ý©ò)¸íøÃ!¬pñs´Þ:ŒŠG]|ø¯öãÙ\P÷Þ‡öÂç0ìè?CŸðõø¿Àw›õˆwB†‹—T=‰¸°ÌÃñ8F­ø¼ƒåxÿ üÖÇ6$ð»Wâ7Õ¼P[ 4ËAª`ÍV€úçÒßhÀïhD4áûš¸|Xw G§ZV´â7´âš7ÜqÿÀFßÔ Ð±Àz ëc€î·zÚzß÷àÁƒú¢Ÿkƒ/nâCg¨pÔ}’a¤Ä]IŽ,£”ä–¦ŽD!ïÊøa§+‹8ã€+S”àÊ2Êç»:»ºû»ÓCÇž:ÞÐuòøáÂîÿlMÞÉÍýˆ4ÊCp UsUtž†Ó(¡¢8«GO"? xð³þ›Y\3ò pÚqPFM˜=8ÖožÄ• \ä%@¥¶+P¸Çá¨ÂÛ?kŸ7G6°Ð3žQùc~§F¨àZEøøé{§gÚ?Qcª=ûgµ?ÊùôÌ[á;wî–LP#À·ql÷Ÿ²ç endstream endobj 325 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 96 /FontBBox [ -560 -376 1157 1000 ] /FontName /BABDOE+Arial-BoldItalicMT /ItalicAngle -15 /StemV 133 /FontFile2 326 0 R >> endobj 326 0 obj << /Filter /FlateDecode /Length 20798 /Length1 33148 >> stream H‰\V TTW½õÞûÝ€€ (›Ñ­H¤q!JpC;hðíVT\@ŒŒŠqâ–H$hÜ&ãšËIdÔDÑ(Æu<W—1‰Lœq9¸ gûOu›8:ýÎï®÷^½ª[õªîo€Ì…ÄÁCÛÇþ%s<0÷!¯“ëÊ¿ÆuÀï+*3½@XŸ½‚÷®–uãòÇç¾õ§¸>€u& =?¹pœ³Å¤N@L¦rƺ²4þ<˜—ÊgrxÁ?Ãg/;,ày«œÜ‚™}òŒ}¬k'Oãƒe‰@Þaž?ÌuÍÌ÷íÀ¶æ^`}=Ï•;6n~×¥ÀœlÆ“›?eZéAŠ9ûzþûcó³Ö_­š}ø'h•ˆô>[©¢ ˜5¿=îIfgÏ=Ù¬¿°µfÏŸ_?³p‘ÚPê¨vÐk8¯q‰Úb6NQ6š"õ¢tÒ`A†a+NY(7ÿ…/ñ.n+Â2\';ÞÁI äì¾õDMÌRÜ"a^g ]1K)D›®]¢ùÐHŠÍöà“ ‚$¬Ãyší»Ë¬Æ›øF 0ïa…‰¶D>þ‰ZÆ'Å{f.\˜ƒƒd‘)Ú ÓŽ<ÔË…æFFbÅPö; âì5‰ªÄ-ÍÐ}Ñï![°MŒÓjAˆÆdÆ~ 7i]–7唩J´Öîžì³%Þ@"G6 £1 %X…ýjA´Z‹6s¢³…ެ3ó±å¼HÁÔ„Þ¡õâCqZÜU_i—ÌÓ¬Õ ÓÓÄÜÂ}²P;ê@ói$ Å©›0÷!}˜yXŠÕ؉}œÍƒb L‘3¤¡n©§îÃðÇpÆôÊñ7Tó½5¢f"ZÜ–Qòc¹Qž”uIcµ€u¯sãC9þi|ÏEX‚ (ÅnT2ž38‹Ë¨aÔ‰4‰fÓ´—Ñ%ZŠîbŠøƒ0D¥øI6•ér˜œ*?—käQy^«Þª¿Z¯v«,q–›V—{³ûgs™iÎ3—›{ÍoÍóæ]ør§µ„ vLà\O叿p&·c?ãø;¾ÇÜY5\u ФÎÔ†ÒÛ4™Þ§%ô­¤Ut„¾~"X4ƒÅ1^,ÇÅiÙEv“*FÅ+‡®&©µP‹ç1P+ѾԶj¥Z­VoidÙꟓÏÚ>»æÎqOw_5ýÌ@³¹ÙÁœ`ÖACs¾=ÆsNÖrN6quüU8Œ“œ• Œî ®âþÁ žB¨)…ñˆ$;×Ö šH3ißâ*ZKi7UÐ>:D§è ¥st‰~¤Ÿèßt—j…ᢅ°‰X1Jäˆ9<ŠbµX#NpœgÄEqSÜ‘A²¥l/yt—½doY,KåÕD…r¶«ß©Yœñ-ªJTgÕÏ´ ­±ÖJ³kýµOµ*í˜7æ@K˜%Ú’gY`ùȲÙRaUÖ¦Öë|ë"ëZë럛ϟ}ör1NxéC™t;äÊ¢"FTLY±Ø ¦Š~jøL´¥MKex~åWX"I4TKå2Z‰]Dè†( 3h9ßôQÊçê²c< Ý"˜h%â‘<ÍœTÍÙêD©ú‰ãê;íØˆ"ÑJŒ¤ïÕH‹¯:Šb¯rªÎŠ8·…LÛŸÈÅHÀ]9MÞà®ÈUK¹#g“BÑ ù÷"×PµíГޒá4DŽ£ŽÓs¶šYb‚(=q˜VŠI2†> xÔÁríVkªÚ¤v™:¯Ìò&c+Û1´ÒFà3š颒à<óé~® æÜm*»dj¥STˆgôX<ÆØÎ,¼C´¡Ë"w,£Ôuª™HÍå8æ4ÍÌÊ£å]ô2D *0O›(’û¥’yéžvHLÁræ‹ýÌ(2ñ;‡»ÑŸ ¹y”síßg~åëјCó¸O×0_V2_T3kÜäý+xĽ»—aˆe#¯Å·ßòÁÄó;#{é†ùHãÜ}E’pÈÚØ’¤âí€5)¹÷°äžI=ºwëÚ%ñÍ„ÎÞˆïØ¡}»8{lÛ×cÚD·nek¥·hþZ³Èˆð°Ð¦MB7 jàßÀÏ×ÇjÑ”dÇv‡-Í©ÑNCEÛúöóÌm.^p½´à4t^J{UÇÐ^5ýUÍdÖ÷šÉÏ5“_hRÞÝãìºÃ¦§Rmz OÏdyqª-K7îxå^YE{'<‰Šâº#,'U7È©;Œ´é9Åg*Û+kà—bKëgG™_°d„ÚòË(4‰¼‚ut-ð `TF„-Õa„ÛR= ÙÚáÊ6†¤g:R#£¢²â쥌±6`ëm4Œõª ÅëÆ°¤V¯}‚'|ª—Ù«ŠK*‚0ÚëŸmËvÈ4¤+Ëã#8–ý¦¡³n„ýoÊÆ¥d½¼)‹atÏ´¸¸H7ªÒ3_Þò|ge± >+Z§9‹ÓØu‰'‹a툾'”çAµ9<+ΉºákëmË)žèä ‰(6Qµ3""yÿoˆpèÅÃ2mQFÏH[–+µYYŠ3 ËÓõðWwâìeAÁϳYØðWÁ?àeaì‹=¯äU÷Hý3^¤“<ˆlÿe½Z€¢¼®ðù_»‹HUh¦Ôva%¶®vªAeAdXbë*¢&4Õt;‰GÌ£Á,1±µÚ˜h­Ic×h°éš‡¢íŒcÍtt•i3CÔ&UWª“¨Í(ò÷;÷ÿÿe›Ätº³ß~÷žsçÞ{î9wKáag½–Ôº°<þiÈ£`}šáã“Ð+¼Çð`8¥ÈLÍg9÷kÙ©.gð:áØ]Ý—“%‹L‰-;õ:q‘#î`Ð[å°Û=šýÂ^„ƒ„SE}ÂØ1Fä×ÊT'ÛGskÑÍ—ïÁžgfò©¶D¼´•ðúyµFÝI‹3ÚÈëqû²Ÿ5–&m>kÖ[šxw¿ ø­œvÜÿIMV¼/®3K’¡À†‡ÕlìT© WYWË|µìWñƒþ™¸a°1<¬¨VÉ}FIÎPÄPpÛñ‘¹R;ˆÇR³mÂí—„¸­HÎ’pª¦ñë™ù¹}"vGB§ˆ~•{ êëf.)œïN®ONª'Y7(¨À^õ>¹¼º.¤+AŒ K\Î’ ?¸(¢¯_ìr¦º‚ð, ®,ö[§ÑßhÉ—<çÃ"–Kùðl™ []Ò†y­^iCU]íTü[ØP]Û†×f‘¿Ð×:ºÚN"¯Êq)ל\£r ·¢MvUÆ/þ”­*¢^‘HÈ–L¢úˆlÈR… Ÿ±ÄŽbŸÚ;‡ŠRÜ·ž¹Ý22‘g>Ê[6áMDò$!Z§¼+yÔ-êì#è í(…¤J¡k–Cº_AÇÔ×è´Oƒ¬\'OÒ_Eû§OµÀr xøp hæ:úlª0ÆxÁç©Ç~œ~¦Õ/b¾JààÓj¨º¹¶IôG®c®c2Êó _`Ã8(/€¾m«¥:”×Aå7Q¾`ßHWµýÊ1Ès1ÿpŒõ¬çyÌF èÝrHб@_~¼üÚþe/Pƒ>•X«òÙ(ÏÅþ”²X«ž×¯ƒ×` ¡‹~/¡¾ åm°k3æ8‰ò`•( mjä)VF蕘ÿY¬»Û\;ÛX_ì6%cºÉkؾDöõ¡Ï¶;°) Ú«äÒYð*`40F>.έú™ÚG8 ÀAÒw°O«°¶½êzÅAúAعSÛOP2ŽW·ëû•k´ºwl[ñš]ÿÜ Ýòeú¥-›š±ÿGÀýó^áKpæý2x…úìÐnà{¢ƒÆéyoP߈sźõ”I…/v¬» ¸Ív`þgyÏùÜ¥š^ežg Ÿ?æ| ø)ú÷¢ýfögœcµ`ŽOŒsÀ|Ìû^"Ø ÂÏLˆ½Q@æ×eˆöñ^aÏæßGù`:Ð|ˆù¿…öS„¿ÂgØ7Ù?Ø70V9Ÿ•ðYc Uð±nóμþ1`7°ÝöíÞ^Æz®ò}aŸe;­±Ù·Ø¯-þÝHÏÉ!9•×É>ÕÇ8ï­fÄ„oYÌ÷Ž}ŸYqÓl°O‰Ò,öYö7‹y_„ý¸|'âÜ·Ö°}3úï¾_´ØÚ‹8Ÿ%ŸØoüãQoÀ‡Ï!V¢Z­‚Ö*Å´KÛY#ö' ¹›V;¢4gY¾Ûúñ‹ {TzsEÕ=ØOÌ/ö5*g©QIÓöàÜI:¦í‘׉òÜR‡¡cf$꾪ü|ZÛCKQ¾¤Euëùß {L8-†¼ XŒv¸¥RÄ>ŸRmD×€ª—ò5/ݯvà^¦!æeC>ßV(âîBÌQ%Ť‰JTòØÓh£šI‹x.ù4|àñÁ+ü(Éçúû’Å–¿ögöCÓ§|füaƶþ<øçŽÏ"? F•†¿ê-qÿûE´R'îd@me[pO‹|} ï£(rc1ÞŸ¹[û‡þîÙ7ãyøÄü›ú ÄÞ¹h;ÓÌÕâmû#ÞðûpαúIÍø¢w!ßd>¹›Z`C%îï õ!*·ÅP~]ï4ãvrc>AO‰÷Iü ;í‡õðã½À6ð;…íy ±ý-ÊÚf¥¸±–6Úÿkßuÿ2@G/P”A÷Wø(çÚÊfɃòV¹¶Ë!u0dÐãù{z@}™æ(¯Òu)òá%z^öP³2gÜMÍšB¢SÇÐ%¥í>£+°«Y@Ë!§¤ã}rïG ÄšO«m´BÑé²z/Ö¿…ÜèÓ"tV«Gù!b y"uª)ÔikÁ›óñøÀŒŸÉPWSŽè—a«¶ù· 6o¡Uʈ{lïì[‚½lkÜÎ:Ç6þ7û„<.ú‰6§Dú@¶Á½ó8ý.ðA;™ù ÎyÁÖ¿^ˆØ· o–×iÆü”¨ínóœx©ÝÞÙ”'9(gAöøçhwåFÈO¬PÍ ifœÚz/ôàøa´ùm{þDtëŠÛnÔ§.` @ÞÎ3¸÷cô+Ï4t=mèsxÇDº!ë™ÌAŸg +¦ Ù·ï|×üŸùsòÙÝr_þÒo2ú礻fë<¿„ûç.ëü¿ŒÞ ÉlîƒµŽ„\ú…9Ób¸bA"›'!Fq™c#ⱈG&‹wÇÅî]€öx¿Ó@ŽÅ""sÏWf.¸¬}àX¯Úئ®3|ιö½v>¯í4qéµ›°›^C>œâc'é(.˜>bÀsºŽM®…&P!±vûÑ­HkqÕ}hTk ‘ÜØ%8©´Dë~Ð2¤Š¶š&1–銢Vâ£+#dϽÇ)LâÇ~ìÚÏyÎ}ÏsÞóÞsÏ{¬®ÚU¥õp¼Ö#\«¤è²n×ÛÝÖçÝê*ïÄÂ4»šãÑU¢Ò±+×ò‘èªÏ¢µì:µ²«HWÉf`ø˜¾ü9¼J²À À„G{6ú»„~Yv%·ëÜ®·ÚõV»°ë¢æ4¡À!ô9O§c§ø²ôŒ<£°)yJaçäs ‘G– «”+‹¶ÊhJŠa‚b˜ ž2f¿ÊfР¥£n© ç›.ü»ðï"©3jö£,Û,Ô,Ý,Û”ç€)@ú®Iáqø=ÖÁøµãå;”¼!´]Ð6Au|ø.ð%pxØìžz€. ´Sâ¡_SæÝOF³T¢”¸)ÃO ¦;¼×ãâ0änâfGsüŸÏ5ýO@ß'MJ4š§i›M’±y”ètø,x;ødÎxÝF°ú@À íÉ5Õƒ~”k €^È5µ‚žÏ5E­yÎéïiQ7ÝAt—åp;1èqð¶œqÍ[õçŒ&<<žkzG‹–Òz’a£ÐÖÝæZb°ÑœvW/8hNûV/°Ñqí#¡}i\t\»nÖ>o*0Ê+µÏš/kW‚—µ›Z´?g ä¥Útæ²ö'ÈÇmÇ Ì6Ì¿7:´· ,†f˜qÿ º2Fµýp…á^Òlõ¾`Gë^ýmñsmPÇý¸–6 mGs.Ëi[0 „Ïânû¸ÇàÏþ¾Òz1xgN‹6Ù97övL0?«îë`5%&yæïÛbÙùÞd2ŽWlëÝüБF‹ «p‘€¥# —­c£B§±K×dtþÓD³ušÿ´­sPK7– ôõ޶gðŒ­É4‡44M¡jlª4m©hºá„¥2C¶#]‡¤Y·%t)ÑmG:]jKÂ$Á¢$ý$mK~õ@b‰tvQ"…$ô¸öÄú2ý1ß<0æ"±dÏnÁÕêþuöÊ(¯]wºn’\‘nÒPÒ,iˆ™¥ HüÝþ¡-)tȽFi*i×¾²jr™)C¦–‡µAÿ«u“BÏØÊ`./6­ˆ®ˆZMXóVSÌ•Å&ÿ«kƒu“ôL±I…ÙƒqõCCᡇ Týoñ÷ezÅ×_Ü´1<4l]C}½ø“¸iôÇÍŽçvŒ)JŸÉ{“°5/Ú$ɶ¹Ýàç{“CÅ+4|pa¶øJŽSÇ‘ã¼ÀqXà8)p88GöæHÝy›#isdìÑûÏØõ¤ÏÕ”ãTÁq¤àHèÙœã˜À‘9Îiã€Ázœ u»®þ¯I²{èJ’žØj‰¦ƒ!:´h^œ-k[BáÄÉT!‘÷½ +v›û‰ÓqA"%Šã%µ.ÙyI¦{êÖÍÈ|d“z+²q>BºQWï¡XÙô=ËP`û#÷Òô=î$ÿ&Ç´µÿ%è/Ø8{£¬á 䙄D%vÛ•J9eôEé !*™"_¡ïÇÓË­QR³ó©³¤%5·²Õ”‚GÙŠ§æ?eïÞ¿7 qT;?$nò^'Ýi’¦i·s¹Ô)µ9ÛäíÒ·nÙáthT%ËŠB&Ù>B¥^*Ih‘ËY• Oý1Q؛ĉÜ,³ƒ8eàÕÚµ»I‚ "¦Ú¹¦ UÝÄæˆGOØ8{gîÖü~D˜‚îˆzk¾ó—ÎæÐOÕ¿¬l¥)’òùÛWÓ O–o¶Ñ¡Kçî_ºÿÏÏwÞ6Pròow»¤=5ÿGðo;§±Ánà»ñ,%¤””‘râ“WÑã>êm©lQWÔ ß‰§E£M%Å>I–˜$9sIs´9™^=E"æGS®üãÅE+î7'!|#z£×óð¾7öÕ´E Z¿FÿSûÖ»{%ñjWëµ5MæõîÓ/Ü^–®[²öëˆLþ êåaž…jQq‰±rT`Ã…ƒ®×{ôÆÚ]ßb§\#®K.>Ö²è ê~öœ* \‹ÑRi‰b¸$¤«B.ISdá“eÁ(B„!IçSTk²ö@PÎðK¨" ’†”·Ë$.®œÄÅ€ %† õ¤‡\ Œ ’cF†è#‚!¡ "†p#ÒÈ9Žüá2 à+Iÿ¸}ã‚c:@ìm©·ªy<òÎ:¿d=ÛùÛ˜³‡†.ŒÂ²ˆ W¤]`Á†½DIÐÞÞÏd §Q ƒæÀ~¥˜ùr'ûÍ3tnÿÄüGÇ*óEÜjñìõ62›,Ë X¾³ý(êE•(„rÆÜ`-îÐñKøpà`íp-ÛàzN:ŒFjY¢(èÒ.Õ²°Vãj¨¥E¡@¥æ«Ñe @ØNã+²d+­9¡`h4DêCí¡þÐpˆ…•ðX Ú§–™^s³î\¯l†îìÔQ‹‘G÷= ž.OÆsÊ#{ÖõÔâÚÊ,yF©Fá0A¤(ÿ{ì^Tš%/“èjUA*7¦'¯$Óã lÞr1k¶$Sõ)¸É«këK汘eðcÑ žÑXZI,xK,„Y5mj´Ñ­™^]M«œûꪸ _þÉÝ}ËvíImï3?ûçùŸßÕjÜ_µíâ9\}|ëÒîmæ~žU V÷­Ùr¤.ÙðñGè7flh™½È%ݨ©ïŽ-^o9óo&?äWùŸÑWЀQ×FmxŒ&—––†EX ûñö‚…¾%þN²š®võ 7´O{ÁúRÅ?G^rÖP5ZVi€Ö£2xt(´ŸÂ¤¯Ç8.}» d KQz¦øL‰x½yꊼY…H©´É*Æ€¬²Ru•¨åFVáSP!ÀÈK¦Bi½¥ *$/¿Ö˜'i,7¶LO¦ÒW’ÞFÒm}Æá…ûˆ vW]y7G½y\:’ïý´nÍÓ¯ª;º{Ó¡u§8ôƒ¹[6.‰ô¾Ê³\ÌÞ¸çÄ£ãæ3Ý+C%ÿ¾wörì9þÂʽ+A7@ }l„"C3rFcQaƒ&SpP j͈qE0&D^‰[ùÈJ½Ò®ô+ÃpN”åËNgûý1Í®:9Kæ# Œ<:K²n52ÿ¨¡vZV¡Q2ß(Šƒ†D[‹–—»™¥ž¸»z.G½î/ªw%™L?86‘›ÝQŒõ·””oV ˆiµ {­Äl^ÓOÛÈÕ¦œXKWExö²yä²™¾l©uzAŽe N°„òWÁÎÄZ••¼† 9'ùA2ÿ؈„û% É/°ÓõíuÒ&””5װƆ`é¼[¾ªm<ð‡nÇ劓qjìæhbeûådo¥ÇMŒDr3–7›r÷í°²C6ç~}£—d¯™ó`/׉Ã"—£º Œ§¡i4È‚<Š¢t3xý*‹óͬ‡õðôàŒÚÆ‘âÞž…˜ÎºX†g£LbåqËÄò,š÷èÿó]%°Q\gøýïÍÌ›ÙÝ{í]ïØxwmc¯°ñ^Bê!±Ml všRlšmBÂjÖ­h s&£¦j”±¥´ jiËaŠ×á¦âVÀJU©JX”r$2XÅP¥àuÿ·K¹RuìyïÍ›‘fö?¾C¿DåQ”D+ ÂC8õ±%„ÂÓó¢Çèrß'ná÷?Gçøý:}!»?`gö^ºn¿M¡ø•ë¬Y²IN‡Ð•T ¼wl¥«¯’êÕ4B•$Ud°=Š7ŒuŸH`iÅhEEé.K+*&•eZŠÆ5µŽÔ±zÛ÷ÕÊ&ò&lT†5]ø¨'sqM/ %z#¯×;øV~D×|š©ûù¤H+ÑNÎìL¿L¾P¯êÃNEÁ&rQUÖ¸¢2?JΪÇmÇì'tù}ÛÏõrH= ԕͶ·õ ®º]SVi«õNåÞ©nÑ”Eú|çJÒ¡tðUªÒ ÎÐ[´½My…+a­ZoR¾É%¾¬r$:¦MGxαëÏ:–z£Ï”Ó’ ÷£Ü:L7|®G¢©íqz½¦MÄ0ôâ0í@(¦.;Üs—:íпÀÞ&výö& | ˆ‡}–§…Þ`.è ¯:a $8Œ·‘¨µÎ*픎Hc+“,©Yj“:°vÉçxîpHºŽC1;’ZèNjÄ!‚ÿÅų…c™5tI´a{üv$qD£í£³ë^ª½„\qòάÌQ‰ý»^ê'ÉþRL¡ h‰õKà&Ú9B±ê4Í„tê•M®¦–Ðt îà×ù0ç(va!„ÐÍ` J³},d+è«üuº™¿O¶Ã{t›¼ƒï"¿’vó]ê.ícã1µO;NNÀqv\:%SÎ×ʿÈmz—篵ƒFH¨iª‚®R’Ó$DÙ„îD T™¢×¢ª KéÅÜÕ\Ö3 •`M«ê„³ÉD–bF™XS‚þB"Ÿ½°¬ÇBi’h4w¿4 Ñd2™4Í^)Á8£eÁ-·§ecèq«™ìèáÈ”Úø‚JjáÀojÙA¼Â¯º-ÍH­¤óqHÞÓx¼Zk¥Úí•t.Ф1F‡9%‘hñýC@ëÌ=¾çð|v^â]göÒòêêVÜ»_Ûˆ»ïíöí¥õÉÝrÜ-t¢Ò.[ì [^{˜f¤…ÁH Ë8ËÞt²Ư<µ7ãâH`9‰±ÄD¹ƒÒÕø•øÏį`©™ðΧÁÎÝ-û §#þÉ`}¹ˆIöZ4ê‘Cî¹®V÷\³-ëœûBÖ5·­ÊÈ¢a |È$Ä+¦B:].ð™ÊýÈ‘Œô0^Í|K|]i–•5?‹e™Æ "M" - šÑÉMË„D–<¢<Ø”ÿ­9#Øaø3ƒåÂ×:Ñ®äæN¹gmѪÀ:!¹è·»b¯|gÍÖWgüéå‘ÝÏ—ÎùÙ_å¾™¿ýqÛg¯MO±Ýœ¶±©ªÖq˜‡q¸Žqð û|ÀPC$ÏÈ£y·wm)›½dæô Áw_ü`IläŸ'‹—·<]SXÔ°¬vÁÎOâCEîoc§îÆNå`Zß[®‹¹$§ìTÎñ«T9G¤™íç'é Î>¤òʺ¤.ù#¶зø6Ê~D6’MÀ,e!Ylº¤ƒPê®Y˜Öñ¡Ð5L|¤ëXKIHU Su›b£åSác…ÀÒ± u D4u”AW¨%Ýä%¢i+FpöÜÙ¨“6'¹÷µã‹âçý?ÿÿïoŠbðf˜ˆ†Šà5Ôd¨.^EŒˆ&JDiy÷ÒÁn”"\6—=ÂQa\ „^rÒˆ0%ýÚ F*5C[ -Õh­6À  *A Ø“7LÓª­-à~`r[Ö"2¥¿¿`]ÙNé‹Í`õ6Ê<ò‹ebQйšB®™æŠR6BOÐcS«§ÕLøü­ÉôOÖ?·u~É~\þöÔîÜЕq”ai(ÛØ­Ÿ¶$³hï9*:öñƒÜèþûç'Wê;Mm­¥¡²6tÁH¤¸4z?M·pËÑÀ®7™³œ]át®‘ûÓÈf+fè"†¡1!Цé^²1L>KA@/²Â´0{Jg¶›­ÊüŽüÑ`ëéw*¨ÊP~f8ZdÚCÓæuØ©_C,ÚL…@G>rG›½YkãÍZ‘jÓÿÇ%¤mÍÐöÀ Ñ<µRSrïåîáò3¤—¤¢¿ðø9øÄõð‰Ý¸Íèö ›¨È³‚¬ú=ôJ‚_å±®M'ÕT5]Ã$+éeÊÔáèÖ¸»énæ5ù9$tö’£ž÷Ñ€}Àq^¸PtÁí/% Ig‹‡v!‘R$$Ò2OËØh†¦%"ÓE²L ¢Ù±t¬ MYQ p€&±¦=Ÿ9A ; —Šý"…DCl‡EZôïö]öABRø$åNÃ] Ó^ ³Æn܃mØ\o±0)Œf-4ÉäMýkø4+Ùùc«’°ÈðÈWÓw7ø_H¿tÑ.]òUó¦ãó°q0Gò¦‹ÀjegsÚjbÔ 6›±¨Ï1~õ¸’„¸jØ•¤»DI¢’éåƒÆô[SÁ°OŠÛX<;·tæÞÀ3·±ß±±šîàŽßÃ+s‡¸8ßK>%ä²rŸÝ¹£3ccþÖóÄÌÓ@@όߡë蚀¦à·çÖ•lö¿x%Ø]¨4eÓQ‚r¨ûësâ]þ-ñÓþ?ú¯û¯Ç¿œäÐ|¸"q…ªª¼™+û¢â‹J.曡¦Õ•ê _‡ï4:å¿Fþâ½âòÿ#þÏé)ž Ra‰ubáX/Ö °P±-8¼d‚QI¶Så®r2RŽË¡J'ª|)k-)ʯTk5‚a9U/r€‘áR†ZÐóh€þ{©˜19jÀ½QnŒpWÔ€;ä(Y—Ò,[ c%¬‡I¸—Ô~a‘3à ¤Mîä—Y—+åq™ßJö„m“Í …w{Këf’0d2†ß}muøNn¨røü¥g¢Ô›ûÌI§~Ó´éð»Ÿ_ªWæÌKcì/»úXÅ왳V'5rÏ»uϾµ•«>}¦>>÷H×ÏOºœÞÚØ#¦r}¬Í_ûFU}êû+A?  ŸAp'œÁ‡FfŽ‚'¡˜£Xˆ*Q5êÒ‹bžYêj?ÂÂ`×Ñor„RœŠì$Š[¢‚6J!ªê$DÇÚŒ‚¥6Ö—NdÇHñÅx£´²º‡¿Ì“·ðÛøqžB¼ÂëüOó½xîou8SÒKôãεp>»N5ÂamÕ‘§Ÿ>6/»íBgÚËŽYøz˜£Ø›¬p&“¾;9xIÈÓôel°PqbV:κòuµJÍÚ`ÈÒ—7nY¸ÿBË·Z'¾¸~Ñì——ü¨iÕüVæLN«M|òáë¹áCMï÷àc­›WÜZ“ùé³[à¿ì€êm‚î  “Æô@— i’¦ZI+ÕA:¨ L[¨+ЃƒÔaÿÀqü9å<r•Ù§“Ù„Â>$©2`F±áðÅiGDÆg-8-6RjÜÁ¢¸Úó˜Èðfã xÚh™ÜY09¹IФK”äi1s’ÐYÈ:övpòb¯Y³Æ&AÆí¦†o5·Ã%_#Ë´p;fl´%=5õ)ð`AvLõ¹»Çÿô¯í¸øHßM)7lOÏnÚ>ï™úúx{ù™sw?8‚« ì ¥Ÿ|á«Uß]ö,82Z”Ÿ¶fÓ ú³±kb ‘ú¦ÐXÔàm® ²3í3¼3O¹„7†ßBµ? ;hHú }NݳK¥ö÷Zµ-L»)èl‘`,‰~q1Ä#RF²¬K¸H‚¶»âŒÃE’d(Z„·c¬ã6¼ÑD³£˜°†0\ £ƒÃJ qf„p4w;„=“/åU•U“ÍPŠlÙÿ*Ê ýPO’R;`…*Ø|4:­Ð­(Qåÿ/):žñÎßÕ²ïÖ³WZWãÈØ´ÕOÎï\øÂÂ÷®ž;ë“Æñ¯’‰÷¿lߨúÑVoÍ AÅÖ‚ŠÚ@E¤ã«Æë]jw„x"X}•ï7IYžvq ¯Ù© ç·G^§Ï튨zšãº•ÎÈ»üIé"ÿ;Ç:X»ª`…(¶JX‰ÔEêuûbq™¸]§®‹lawè¿æ÷‰}ìYî2÷WnÐ~Íñ;Ìý›½ÇÝ-ºheÎ.•,‰,ìµS:ç=«ãm:Ö{É0D1V ˜dYfŒmj(îbù‹œiêKªÍÕpûÂÕ 8ÜÈá|¹¡à ðä·Œ„j‹ îþbÈûš—„¼Ø[P©é¥m,Öc/ߌå]{D¦åÛчÎdÍk{fÔÔ¯•®¶|ª˜¢Ü“_!$l…t1×ãe–ך®Êš~ì ™‘2à®Ð˜®Ø&Î;þ=ï»—ïÎvRÛqHl‚óÄqâ*-†¬IXFI³B`*µThTM¤ÑB·5J6ZhÔSW¤fª •%¤# 餦[¨­[#6šhMTÊ«C0 A $Ùÿìd ë|¾‹/wþ~ÿßËö•9¶¯Ì‰ÿÿËN›)‘òÉ åx† @BAÑ“·¶¦¿íRcI÷Wcrj—Ê©#%ud$Ž)½O¹>ü›`ŠV¥ÜdgÖ ­H¡ÁlýäB¼½þuXáš;¿˜º±ý.þË…©Ûx˺uû|¸×©lÙùVÑ»ïbó˱£þ3úÌz·ºmÛž] CÏ"Dûù?oŠ¿/™_`ãb_ÒQÆÑʆЦ#œ%h‚ ð>Á:ÅI¥ ÖŽáß鈽 ìÐ_Ó›2Xè¨R’^IX.É奒o¦[t©Âz$̳ì?€˜nü„O»±Û^Gwž½„z¥^™3¦8-ä¡4À”48ÀRÒ¾%< Æ–‡„=->¸ ê (Sf! wXCÖ8 /LLú ÷’˜çž uL|&õ’¹ˆƒ2ú–²'‰0l²Fì} ‚ó‹>æé%'É)”b6Åç­ÉóðÖrŒ†¢rÛÇ“7R ¨%°‰òrä]:YˆÇj:C?¬é|è±­=îÌGeÉ<Ýp¯¦‰tç”.¶Í\Å#’&"Îÿk×ÔDWëüVO¦onóÖÝo”mŽ/ò‚]²ÜÓw? ŸÞº'¯Yø·œì´Õ5¶VƧcw€ù!´×Ä_ Dq³gW„DsuÔÌ}´åzò.B‹1󙹘TyþëQº7Ò=¶ =Âj£Ïç?ÝÕœÏ\På¯Ìªž¿ÖËóŠò”¹Ë|±"v¯®i>Ì‘îÕÃ^êÓ2üþ€æKƒ“~­ÀÈðI ÓEAž¡Z(„ìE½tâ)jq-ðã…AS+É÷iVÆG€†ùÈ÷ãÿ2¤E´šZ@ëÓ(ÕÜð¡VkÕ>Ö®kBëÁ§âþ(Ð{î<ä´œçu's~]¢y´õµ…Éf˜äúÍ«Ö¤Ý Ï[ç“§úTâ²u°ŠÍÄ”8Çî׿6ø 5x8TYàš¨JSjí²€§4H”áݯ۴*p$«âÁ—dX>õí÷üòfÓ–ÎEùØÑ~¸vÇáMðê­u5ûjvÔ®|¹0P6A$8/óá¼]Å?;÷ÏpYësOýéî«gº²"ð›ÝÄ»ý¥ÆÓO6ìÝñÒ“ÀÏ5±^ðÄ \ dbÇÊQ×9eX¶Fœÿv‰4†·N¯î5C8¤‡ÌyQ\F¢rTšÑŒJ¹R¯gõz}Æv}‡ùŠÚ†Û•6½Í<â<âjË8¡vëÝf%ðTŽAç kèÃŽ³Ö˜ó¬ëŠuÅa –iNMw¨^ŠT‡#`8ÁNóÈo„”V(„ÃöXÕil9êZ 0>7®Ô4"ÆRcÚ`ãç1zHq\Gu«@¼÷û (fv`ƒòÖ6 í°–$ŸÝ¸î¹«]¸fØlô÷Šýý ,·¡D º vm7›Öà…:5ãìg7µo|ù@æÎ©‰WҗǪ—¯ û xïäÍT¼õB|Ïä›dûæ9%ñâåKúm¶ÕÁÛû€µe'¾7 TÓ¥U‚ *=€½PC‰I dîe^Þ.:”–bXºJ®ÒKÌ‘ÃrxD‰JQ±†×KMÊé€8$—¨ÀƒTK;I'í#}tˆ Ñkä• È=¦PXá¤n-IÒì3-´•vRJmïòø–Њ ðÀUB…Lgçá.©2â¯ã¦€ÒÒ"ð*xúý²ðô“Çg‚LC䕃—u³¨á¾ “$ʬҕÏÄblV¨*A°áÝ8;:5‘…³ÿ55™÷nË1“»æ ¬™†oÆ?‘9—¼ŒêÔT3•l•¹ªñ ZÍVÈ[Ù>Ö¬‰*Z¥<%=OߤoK‡éè)z†Ž)cêWô¢r[¹­ZUE­ t'=«œUåtzP!!”'åˆ9âˆJ‹Ä"¹RªËäzºF}š?-mÏÈ{¤&ÇúŽxGnCí¸]jSÿH{D‚ˆyá2JGÙ0?#ŠQù mÈq _¤_K—Åeù¿%}'ßTn©KXÙ_g¯­¢*²ÊU•Sʈ¦*€ “‰¦AOLƒŸM%¬”«iœÃU “$—jB–5¤r&AÛŠ#×e ü€ÒCªã®lŽ_çÓœ nñþ1g*g÷*Ç—´6ŒªV—,8:òôâ“ø{3ŽgC²qnh¸zI  vÆœDc6žv±½÷ÞØ#[ …\.—7ËV¿ eȺz\"¯=¡´ ŒÕôx—\qd]Š^€~*ÑÐéñ¸K‡Ñ°b 6Ù2aoưZP²ªn°Ëbw ºÒ&]+Þü[ýÕÔÄ®¶q¼yê“ëñ7L}bOL-°ì·I–½w#à-¼•ñq~‹NŽ“nòPEI„×Ó&X¡À :‚‡é%|‹jf0€Å¥HÆ­ëDãÀ„“ËÆR½pvðg²ûì¸Û?5Úâêbœ5õwÞ{»®\ô_ðÚ""⮨¨U>*#Ù!§Éæ ÛÉmy‰½‹O/-© o “\ù÷ú±ô#Ásúˆ9œ&"aûl_x<ÌCfÈò‡æää•¢˜‰v•ú£hUf•«Ê_•µF«7ëýÍäíW¦ðÔ®6»Ž¤ö ´u„Oh:ºÍnwVgx ê k0ýÓÌOç …‰"¸Ÿ5êKÎ œ ^B­Ëé3¿ \^,ü}«/Ûƒ?ÿßUÛÄyÆß÷îõÝÙwö½çØç»Ø—Äö%¾ÄA4MKɵ*„Òx#)BͤÒ’ª #Y? ­ m L0:º‰@ Uå¨a…BÔj+ˆj4ZVPYD¤±­ÃÞsç4cÕ4¼ïùì“íçù=¿jfC5f¶2Æ™RQPQB|9cV²iì§ÔPB!8ÅŒxI(/Áé´a¡4—*J,O[¾HÚç+O#.¤”Ä‘E©ík­Qò sIÁÊ0óž-ÆZkâù8s)Žãg˜÷ÍY8”vXi±šmá5n±öZŒµ»J‰Ä#–KM®zäD\Oc{Zš&çÒIâðø–0¸ØÌH½«óÓ2á,ÂÈ=öܲ\,ËùC´14ìnþÂV<œŸ‚- ÛÛ´ÑÐhÚ3–œwMÁÿ™™cŽs_a¢oÝüb°áâ†ÞݱþÜx¿^W·~ÙCÖS¹ñ‘Æ95ë–D¥hWnœ¤~¼]{ö™þ ;ïnb^}VÝ×ý‹¹æÅ ¥éúû×.Môæ´iWp©ãõöI`#™ΈfVgðQú,FÉ tCþ’²ÒQuT»JÉIé´ÿ?*’Ãá!á”ï¤Hê# ¸Ã¾Ã~’Œ4øüõ!’D _ÊÏ^ö}*^ °oÉøwüï‘»…ß*o¡ì_³¿ÍÇ2Mÿ$É^Ÿ(„±&JrN`M3tÒu$J’¦û‚iYB:[%gXbÍu{%|KÊKŒ!]’Yª‘š$Öz%Fr‚ÖÚ¢c}w±Ñ]`,½×!@>›ñM4ü?à,sgìÞ´ésÜ‚ Áí¶<œ¿ ›¯Ð{@ÂÔñé¾ÏtýÛ Ÿîq-¦±®ãk_ÚWú£ÜøöØÃ4í¯2*V:-}­}ÉÀ¶ûy÷MfåÎ↦§Û潟{ <Ŷüurz(¡btÔ®]¤Åîè_“óú‡ÅL%c ASo.Ò³±.²Yï×§b"ur(u"(5YÐñB¢uv{6œŒ˜^ÑŸàìôìZÎn®ãìùuƒÜ%Žéäöpƒ\ž#ˆ£œÁe¹)Îà CnPÁQÆB ï>´ù—h%TjÜ1I» „??‰š&-ËyºÙÓ]DQ醵,•¬"jý6¼Ë7±;•»9p£‡³iuÇÞì¶Õ?Ìö€d™¸3w÷j.—ëßü^Òµõ¹««zv<µ1ù¿çÖ“ËP ŠJÐû'Ký ƒ Ôù±® §˜1kt7¯£òútX>%ŸþFéu™î’wQ&áK¨Œ>J.êRÆ £dÌDq $X– ŠBÔù«\À2%Q¦²–.sj¶GÈ L§àœý ‚!d…‚G€J6 Üg`ÃuUrÁU9ÁsŒb KÚÙSŸ5ŒŽ/׬ÇÆêYêPW‡SÂn«g²€ÑÿØX¬7<§ê³»Èo0FyH&@ëÞ´ÁAi¤íõ¶7Ï|ôÉ3Ï›½¶¥µùå¶žöÖ‹Iê ç}1‘ÿàÈoï^aWl{õû·º6õ>ÿgG]ïàMFãvG’Iúj½£ìUé¯×ÊpRDJ¢”¿Fið/áÛÄNe¿‘ۉϡQÿ¨ü©ÿº?ègUæ¿/@¾Çð ȇ?€9ÆK? …ddŸwµ½®. ™rn|¨.ËaÊa€ ¾ÆV ¯áûx†ß=jp5át‹ŒåÝTŽ¼Ë¼ƒÕi31I;þÑÑ3á‚qfÜ¿)d£[G§Š.µƒCqB€ËϾÀÂPDKÖÀà¼ægͪſXž^à æÅë³n6ž9Ÿ;Õ©†i|ªS…‡ÞAå`n¼[5–äpþ«!oc9lö.±‘fŒÌìŒÉf<¾€PY/6K›Ê¯úÿ¼áørOR-/J&’ |óËy¨MñX†52µeõÉùeÍI;ÓV–…³jk¤-±,ÕY•Íl²vXûo…Z«Že·ϫg­‘ª¯‹£À«`/Ò²òD2å¥Á‘Y–µYZ§¶rÆ0›°ƒÁX:fË|ŸÅ³1[’tZÔ­‰4EZ",窷…ʉM§¦X‡LjælÓ6=æî̬G)NÔ Ü‰6 &‹Ñ%t hH™-µÀèÐ1Ê€ôa|èDõ#˵‚6;(Ÿ¤“pl9 ¿ër))°qØ©:RØœœ}¨<6ÊáSèfÁiž$8„Ôñ„{µŠ9³á˜Ãs1{æø¾Fwd"u#0£=î[EIÕ%ŸºZ3e&ÌT]mC})ȳ'e:‡"ªs‡`¤RÕXM>Û¹öÁʰúdî_óž\ýf>ú8–ûg¸Æ^±¢¥Bïÿ¸y]îúwpeUû¢ª+Qåsß¾}eï@_æ¸9׬(¦=øÝç÷ýé`gþ:kx@/Øka÷°×XxàÁ?~.^%ìVò yYxE'Ë|=aýìì9ör… \Û˾Ʋ ÃF†ç¼œ¦2ªGá°×ªrCøœ~©Oqʵèçx‚ŒsäD•kÊŒp#ôüGBN ï+#x”C¯½‡µCú1|†çú”¾èÏÈ€0à=H¸vm³w‹ÖÇõñ}”+Óç“fo;Ûî}"Ì• )¯AJu8¥qÀ ¬A O)W ¿D‰¦ª¬ÎªˆˆˆxaæYÃ{$à (´ˆuÒK%!"aECeCðy^F8•19ÌKNvÌ"Q¹pÌÓlû¹ <äÑ&ð­N¥“A“Œif:DÆ:ÑšáÒïÜ‹NïÝÇ9w÷Þ½»ßïû=0ê„‹ Ч±‘Í&ÄM1²ÂVøÐÌßdÃ’¥Îì¬K›^~eVŲû¦Õ²šÁSWâíƒñ—v†²¦‰ÁÀ¶ s?‚Óx?íÈ.xþï o5‚±ùæ¥æR縦…­¤†ë’47ä¹ÑŒr·1£#c Ã"` Œ€L£n0-}ZÊ´PIzyúJÿŠÐzßzÿºP3ÝæßÚê×®¯DnÑ»©·ÓG3;ÂvرŒk,“Âþ€údü)ñãÊÇÿCÜñQoa¥+`#kÛÀyÔ%þ ‚ ê!ÛÓ'Iwr^À&n0ÔÜbß´i¦]fWÙ OÚ-ö›Ù=ð¹—ŧÚÝ·Óís\-êæ»Ô5íˆq'[5«‹—b—ÎÁAÒº%ÛŒ`QTžônX)m¼)^/Á—*VB%#1PQ(' ˆ¢ø/“…Y@‹‹Š1ffOfCf«»h^NŲ“é› ó«ø£:o¶~0…çŒýº)cöÂïÍeÁì ðô»/ÛO~ð«âãJ!¢«~ˆU’ ωleÇHÏøU¯ÖŽ-GéòýD¬´'É!Ù0C+€%ä%XEVÀ:øì4Záä0¥`̓ÖÙî;I:}׬«rÀ7™øÂ°ì”É!8ENÃ5ø,Âí^:˜†Ð-®é:#–LZè¬u–ÕCŸxv¦,“õ’K 2(£’IÕáj_ƒ¯ÑÇ|ty&kgô¦>—ÕzƒÞˆ¿„w n’Ú /¢¦)S‚‹‹¶.AÜdâ¹Ã„ y3á‘Kû±U‚# ;¢šÍoV6š]uŠ!‹þìñ ¤WfêÆ/ý`@ωϽ´ ôôáóÛOˆ~Ÿ_ z½~$4jÙ±4 cK3¸MRæ?_ ¸£ß1î˜Ãÿ+ÿ›ö©~ͺ’r‡ÞÑÄIÙáï$gàœ¸h—âm¾G!G´#úAyB›ÄF«…¿!v-þ6&*åQcT›+¬×éF&æ‘">W‹Y%²Ì¿˜ˆ<2‡ÏÔg‰éÆÔ”¨_ä"4B‹õE¢Bzþ·ekÊg–„Ô¤N¬TH“‚j\Xª2@[̸e†Ž)=³a2AÉEš‹w›BŸtï’0„hé¡Q/b‘å›Q€‡€Á»X‡ëÍÍ&5?¡åhö9#‚hôOžU¯oÖ[ô:Çê¯õ2ˆò@Q‘/<шœ8„yâ6¡QZFí¡ÿ=ã«QD÷¨nL•OÉíHÝHb„Uĉꎒ¨¤z'c¥øqR^Ïk|èŒ)=ãCçpO£¸QªY«ŠÜôœøš9'!àø ÏŠÄ ×Ž‰ @‰ü“•Űç Â… ?X¿ÿv÷xT‚6–@”[‹VB¯ª{jü3ì©ûª§h‘÷…½Ÿ›/Hƒ,¬‡EÔ§0lXLÓ¤Ì÷y¾µd5Ô¯š«¤UÊÊY¹¾žüœí#GÉ!¶_7¿ÏfñYZŽ˜j̲¢¾"ZÄŠŒ"3ßWI–@9]Æ*y¥¶T/ËÌZ²†Õš¯“ðkàëôŸÊm|‡ù†Õ,ß"­°× ’^@=H™>ÄÖáG#uÁ1C]P êÔT5v j‹^IÁR£t¯Ú¾Ù¯htbÒ¿7ØŸÄHñ‚‘„Q7q@òÌ€š}þ1î“ÖKÑ.f¥‹MÊ¥…$â‚áÊ=µÇðôn#Q³zÆG»C1f„bbîã"Ñ&¹ô!Î üeuÜ ªã}žˆI7€ó@i/¼nbV  Àá–Î?‰wÀ¿ãaîaðA]< )ñ›0=~ Ÿ˜ÿ;Ìû"ŠË}ñþqçÀWÞÙ6I}ÙØm ¥ŽZ¦ã¥Ò…¿Õé%¿Gï±{ü¾äW´Ëúm:ȹ֭uéWèev™kf§D=ËÎrm?{Ÿÿ^Ï8Fµ]löNx·³ŸjÛévÖ¬í ï¥Z­Qb³ÉÜìh‹yex­a¯ m+1bæËtÓÐ\ñsåeæÞp;g:R eœƒÙ Ø>sxÞì(Æéz/WpG<Œaj qB„†(;×x˜;icÂRýØsãÅ]’LRLÒ`­̛ÉÉò! [ù×ùŽçìrÚÄÍ€3ä ¤¨ÓàôáTw.ÐoÈ$úéG™@ÙØs¶A»5œPl¥×ZÒYáÞáOX¬²‘&ÅG?€‘grÒßÿŒ…t ÒW¨*~Æô&€å{FDˆ­ÿ3au[š<¤"lquÛ1-/3q؈9ÁgPAZ 'Ä åü4{Jn±2j§á…òɬäµ8ä5ÖÔµ®]³%­pnÛJ¤¦7–ë‚ÛßmyoëÂè­€â(29*±bB¸KW‘ð:^-°Ei£Þ(øû®h:Ï*¨bU¼JTUf=­Õr]/d£ü-yÞ¡ûÄq‚ž½¤—ö²NÑkÞ ×Y¿Þ'®›ú€ø†dã =õLª3êá%(vNW$Fs¹ê¡s‘˜ž‹:#Tg¤âa‘‡œkB.±Ì™F™A‹t1ÑþÇ~¹…4Çqü{.nÇÛZe²^–­ãÔ9Gsc›NÛ¼”—î M-L±é)¢×Š è)H’ ðMñ! | _{(‰^»@®Óï\ -¬|ûÿŸÿÿÇÿ÷¿œÿ÷Çáÿ?àI@‹WÏ©|“'«(Wœ¿)Üxº4OÃÜa!á(FêmÑž3Ym“Ö呸ò¢zœ,$¬ŸuWK©?#ËþÀ¢¬Õt÷Zýà)?:÷ë‹Í\±¹ÄÉG¿;ª„`ifšSÜsüõ73>@·Ádf-ÜU:{«ÿñÝFh*s! ѽ6Û äéäÖy%:ùK€e ØžvNéÌè¶³€ýP´ì^ÒÙ3ûgö}ŠiÍ’V ”öâx ”_œ§ƒ @…M§’â•o÷àij£@Ý#ïsÀÇe€ÿ%p(hÚ „îá9 *2 ƒÁ`0 c«Nûï-€ zýWr&lάêø]kÛÊûË8!W ²ªÚ ê¼õ >4®ÆÃ‘hsK¬µí0í]GÐÝÓÛwìø‰“§6¹ø™ˆ+TÚho$¸Pƒ(bH =èC 1®(ÔÃ7‚hAEº(’ÄyŒ*Šòn½ÇÐz}åãoßI 1ƒ;•œñ¦vztßD^šI1›ZlôVºÏÂ~èLjá‹äO¾‰üW¡`(Ü‘ƒ£©dÚNÄÆ’éTüèæ‘0!„ÑŽdòGI¶$Ò$Ó9 áyIjÛ¨—‹Z‡© ÙÇ´–m!ŽçýŸ#tu…'TЋ,RЊ*t“ܯ󼤯 ÏÝ¢ˆ$BÔÒ°ZcßAÃÚ¯i ¡‰—Ôiæ%Nälòï‡Þ¹÷åÌ6ÿ'É.i½':ŸyÕzúÅäío7V2ÙAIí©æW›ù‡s3` endstream endobj 327 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 98 /FontBBox [ -498 -307 1120 1023 ] /FontName /BABDPG+TimesNewRomanPS-ItalicMT /ItalicAngle -15 /StemV 0 /FontFile2 328 0 R >> endobj 328 0 obj << /Filter /FlateDecode /Length 26556 /Length1 41040 >> stream H‰\V T•Uþö>ÿ/"†‚ϸxy(‚$ñ‰(\!‰Ä× Ì.ÈC…B—æŒ/|eŠïÌšÒDãâ[«‘ñ1šæ2sTt\¦3£i¦©eºî™ÍmÖ¬š»×YkŸsöùÏ·÷þö> %* 6rLÏ謔ô*`Ó Y})»ÐYTüõ”ÉÀ†€6dÏ,±éÄVËÞÀZš[”WHã?[xÌÓySËr× 9}ÿÈ9šŸãœt¬ÍJ/àývr¦o¾,´(·¾ø†È<$¿°¤´õêÌ2O–áš:=ÛI¯f­–TÈ|w¡³´ÈëR‹4Á³UìmÓœ…9É•ÛK€÷Ͼ¢é¯—èŸe¿nÞ/z-§¨¬CÒ ÓÀûˆ¹TP½ˆ T1ƒ¾.ãVópÐæØÝùúŸ*NN¯úïøõŠ­XJ>(ÇÛp ÆILAF¡ƒpŸ." †X½nˆGȉá+³¥Ô'eç}›o‚±sð3pÙø,XG}‚~ø ƒuüÍzôÅ<¬Òÿ€ÕˆÁG¨×W´Éøõ4ˆÆ¨ 3/cfc1Rõ£Ù ¥øuì÷Ì´@*^ÂX¤#» ’;M¤¡†Î«¹)•ô<Õéí° ª0Da(õåîú žCb0Cð'¬Ä\¤4Xõ6 P|râùRu¡Cz‚DR1A.F¶áNQåž*ÓüÄ} ¾˜.ËQ‰óx@Þô2•ò~µÃ=Dè]ú¨œŽ•{1Bp—cµx·{Q‡¿JLê©3¥Ñjºg”˜ÑMsÜgÝ×t€~€V‚uò1 oa¡äæ=ÆeüOÈ /jM‡¹_V¾Æ{f †žßÌôÄP‰V)æcÈ9qŒlÔ•úP ]`_nÅSùM®æÔBU«þe|§ôV}Db~VØEÂ0Z²Z.Y[&¹ÛŽO±ûqßã>~–HP%ÕÒzÌmxŸ7Ízó¾Þ¨á#ÑE$z‰ô‘&áÁ2 ë$S_â´ÔÌS<¥ŽÔŸÞ¤ù´ˆ–Ò*ª¢oéžÇgøªªRŸ(—:am˜•æ5Ë(«Ó]å^§SÄ;ùvŒð&Nb˜#\|]8±Aâ¸ûpH°=FƒÄÅ_¼ ¡4šJi6Í¡eô>]âd.àé\¤HuVv®AFµqÖ¸lÎ2+Ýaî Ýͼñ6 Üé"@®Ü2K¤RâPƒÏ%[Ç…µ·…ÍÐ ·±äÙ‡ÚR0…“Cdœd=&’“ò©œ>¤jºL÷ØÛq^Æ+ùCþ†¿SÅê]µ^íRç”ÛЦ-’bfˆ¿ÕæCË8ËBë0k–u‹×WMM'š®º[¸ÛºÃÝcÜt¦ÓõLý†Þ¬·èºF×y*U w; ¿l"áè!•“‚1QðOA±pr–ã‘-âÃ.ìÆQaÜY|ƒ«øVä&nIfïx|z„Fñ©Ù©·ð%–&PåRÍòÈÛ´†ÖÒzrÑ!ª£“tŽ.R=]ù…Ó~–ý¹'Çr"'ñHÍÙœÃEü¯áõü1ïãƒ|L²|/ò v«N’ ‡JV¯ª‰‘25GmVûÔßÕyU¯®«'CrlØPc€‘gÌ5®™]%N“Ìs“Èa‹¥ÀRcÙe9e¹eµX»Z“­iÖ­;­Z*¥+¤JóÆm¥nüŠ Tt„wÓ»tšwwÙ—2h–G‘ÂñTÜä…*”âT)u”:^‚XI }y#'!Äó©ÑRÅ}„‡cÍsF[Úð<Ê—~sFø“"6 p¡º­ñŽž‚=(•£×J-TP ÕI åq1o4*?aèuuIxsSj?†ª,§0» ÛcÐ_òyedãµjd:íaL5¥‡ÓCµÛ¸Šòný%?Hßo$ŒkÒ÷#Dwð©`;Éçx!í1,´™F †NÊKøq!¼9j\Á?õ¸Äýy¼Š¤‡Fo%¯¡äi.2èya;Uñ Æ*ªïoоüDš›Ô2Χtœ¸; S½àæë”%hBpÏ $/Ž•:²¯nò6•KëqÎ<¬®©j/ ú År£²q"¥ª~ú.B-OTK÷y€DÖz…áÓô£D§—ôQe8 {Îp ­P…fº~è.7çrrÍÛÖÁ(ãégä-ªAýÈ$îA²2@"h,ohàQèÌ÷éJi™TGˆx2V:G òh«Øšò6 ‘Wà)WK×LU3¤ÏìÅQaûléíþœ-ïL>Ë+axÞƒu†Æd”É¿‡4|!¯iµhÏ™Å?$nð ú÷‹}>¦Otï^={DEvèÖ5<,4ÄÞ%Øô\çN;´oжÿ³­ýZù¶láãýŒ—ÕbŠ ‘ûðL›+,Óe„Ù““£šçv§,8³é²ÉÒðßÛ¸l™3Ûï-ãÅ2÷ÿ,㵌ÿŸ%ùÙaPT¤Ía·¹N'Úmûiü¨tÑ—$Ú3l®»=Õ£/÷è-E–6G»üD›‹2m×ð™ù‹™‰ò¹Zï{BŽwT$j½}DõÍh/ª¥À8ò(èPËðj) \ì‰W{{b3— u8'¹ÒF¥;;gDEº(!Ûžå‚}˜«Uw <׸, .«çÛäfoPi«¬[´x¿ßh¯ ¨®+|Þ»ïín *ÖðgÉlDŠ”ªH´®?P•$F²PbDkÄÛm5´Æê¬ÿFSš1©I;tâÄÅT‚AÛ¢Õ”8cªÓŽvkQë¨)áö;wß[w1mLgÊðqî=çž{Ͻï»ç\¨ÌŸWî)/-ñEi¯Ñ#ëN ö]z¡ßí.&ÿÚDߪhk¢äô{ÂÍÝ@`•;¸{º/ښċŠ0|õä\ K¯åCì—Ž@8|ÞJxSs<9¬ñÏwïñLðÌ Ì÷ã{$‚4cIR]B‚·^þ™rÜ|Ÿ')8.ÑST:i@m/ ÌXòv¯»¬%mXm|ðiÖvën5âºF7æDlª¥†s+oFä85ŽÈ3,ºg»‰ÏƒdñŸ9Y˜…aø)Òà,Çgx"xÏD >›õì4“ã=îÀ Âg÷´ý=VSjiÉñ7ˆ›LŽ¿`·ÛÁÔÔàÐ¡Ì çD|HÄømÕ‘6ìÙ~Ù³0Þ ã£G}p+ÊNÇ™'%ñW]òR:Áªé¾pßMe‰uäMO- ê~¶4Ú–Þl©²-w¿ôÝKü_@ï +%òÛ=¾OÏœyÙA­Ï1Ï Ûófzò¦ûÜ9¿u¶yù1½°=+b³ZÁž}"Q·Zz¢PV0±$2˜;¾¸ ‘Œ_‡bryÈé•Fsçãý“˺$%Ý¥SH^e/%n»Ya³ScûÆôc‹ l¤èyùÅ@—[.ÒN ëqçüÒ¬*ó¸ã=z¼ñ‚…9~û‹†äþ5‰ÁܵEØÄ<-lÕiB­G[=½Ö«­žYì«ÇËvu¾¯N×ô‰þ Eµ÷Ãæ«wy•Vh¹çæåi`zîR¦Äz/Q•²J¡ú³C)ËÖi4;¤‡uñJ‡Ÿ4õ|À{I9ô˜«¢ÝlïpÝÄÿRÎè÷…xÓ1ZÀ-ÝF5½,J´ƒèE ÐQM£©L{Gë ÛZ½Z&¤ÝgÎ¥ä%èFÂ/G-ßÅø¥À2À L¼Àà'À'À#ÀƒðY Ü9^޲„¾ÉYB¥Æy¹8iRÀl–‡Ñ>7›i=ú¿ÅúbÜoÊcÆ"ÙਖÐn†})Æ€ä9Nb¾nÆ"Ú€þã¼FØÇ-èC‚_»H]õÑtF ”™ÂOYÉ+zµ6~Ñbëh¤Wݱöcè?ú»¡ï…ö4ÌïáqÀŒ™†¹‡bÞ6ØóY±Ã°â%°5‹LZ§gR›È”ß7ò©—µïWxß¼g{O*þpLwóòÜÞh„ã»Û±})Î"¦?B>d`/íz ½e¤Óƒ:ö9zцó4¾{µ¶ˆ3Ê©¿s Ü‚'›{iúŒY@1ü¯;å)q¼°¥:^¢ÍÐOÖ3À±T§ÿˆ.8’黨oÖ3™'8·Š åêÜtÈAÆ_åûhs?Ù9PëbÓN>ç:JƒÿH¬uq´‹´ðCÄVlâx°~:ÎÜï¾O+ì¨Á<=À½ßÀ¾–…!σÛ qƒ\DÏ[뜊’§˜{Ѱ¾36ÔÙWãEYMMÀMÄ’–Áï#Ètèœ.6a|&󼏿¦|‹¹¾ÿúQ»ÚøÍ ßm©>—~T/8ˆ^µðSŒQ÷…9ËqZs·1·˜3¶´¸qD¯Á;ž÷ɼ²¤º{çhˆŠ{gnE$îs_É‹¸Ó,·Òæ,Ï‘Í*Œáûˆo›‘V<|?‘7Î*y‘ -®±¥u‡#r|¶e޾´ËÈ÷C¸C¨¸†tgø$Må{ll¥—õ•ÔËy‰Òñ-§a®íä6†³U›ùqžMF m‡Üf´ê÷­šiÖÈ‹F›ÖhÖè˹}§ì {,KF´í«êÿèš5øŸ¢FþÍl•Òh¥ÍØ+9/i÷-¡¯ª€¡®Tm›«B 9 (¼¹T^Ê6½à\#3z«ü }ƒpþå¯Ð"­Që* ´G -¸£XKÿV0x~È……¹–mË;¸dI›¯äQÎùœwm©îòª%}1ýlú×ÎÏ\8G3Â|•¯Ex¹5ä£ÛüŒå©¼ÅÏ1gFg^FÉs,¹¶p~çÚ‚õgaý]˜ëuÞ¿ÊÈqœ#9ÏáÎ?lï,#þÕÚä‡}*·P±}¯¾çŸÀö•G‡i¯Ê‡•ô¸£ŠÄ(zXå£É4ËŠý”Ñ_°—u!Ù¤Î}ûÊ4> g¾Ü(nÊŒù½ûTÈzu8£è³Pµ™ß˜ÓQI[Õy°Ï úØå“æ¾ÇaäÒBä’ñÎ5òW†NßçF༧s€«ÈÂá0´á1š{¾þOjC»íïé âÇzâw ø@¶Šçå}“\.£â¸<© ÷tâx_~&> "í 5‰*:(¦àÝ´šÅQyA–çô{iª>FîµT!VÈñ MOa¾tDü\^ëå±½A‡ÄïäJ#‹Þ3îÅ\ç¨IûíÐÿA;Q<֯毢 ˜¿Â ð~ÑP±Ú¸3æ2=™â¬x‹câåXí8ííøÖ£–Yññ¾y^å‡1ÆdšJ$ÿ$‡eÇt|“bÎë*gå ÷¸‹§1°'}~ Ø‹ö&Œ½ \@û9 €öjà_ÀkÀSwÓŒ£ÿ#ž³òL%ƧB·€ßç§Ð„vÚ-@¢ö!ŸÆ¡} €¾Ý´Pt‡ÆI^+ÃÒ]ÁøÀ´_…œÖµ¿vWKî¶ËáêýÚé]ò_XîVvªCkÊW’9w%cjýý¿LZµ¥äiƒ½¨xþSÍ‹‘àOC48·r~ã¼Ê¹óé¿Y¯úØ&’+>³c{m'›ØN‚@‹X¸ÃöR¶Ÿ±½”ígö×ùó~¥ý,ìgPí¿®ëÚýl>Vu 0ÒÌÑl\¥ÎpG¢žHVYtdä6«4 ŸY$Ya­DÈ3æ²Ze™©ÔR£­½ØÈ7­Qï$ÝðŠù!ˆ@,2ƒ‹QùÆfõ£d 0¤F„À’’«dÄì åI?É#1Qd+Èa» ¸˜<ºò!HĆ|dÌ|ï4½N.àCø$ùzˉõRš³åìBNÈapV0.ÜÄ~³ú€jnæ÷×€Ë<‡˜á—ä$ö³úp'̨¦[Íò0-••E¬“‹¸<ÄÑ ÙÕÚç`Z »ÂÄÑIÝ*(ô·|‡Ò¥Î‘ר‰:œhŠêòn-hÁ8w?„òr³V ]v^'#0%£\—1[‹êa¾m»ÔR†›·©õ 7ö©e,E¯æÐ]ÊFÕ'wp’©j,ÆlÒ|ŒïR}³° i…õ*¹K Èkw©Y‰©¹I+…úVá±Þ ¯ÑJ;Z4õûòEùšüÙf—ÛÀ«¶«Õ«:Ú;H@öCÂ+r»l›##ìD²éZNÙÅÓ¯S¡„¶j0ª¿æ)ö v" ¤*'DaÐ1áê/ßu© ¿«»/Ñzµ>ÙΆ”3WiêÙ¤äÌ`²ýi:ÑÔ L[X¹«ŸÛ¢ªÊj-é.|@r>ý €À¿@H‡‚È|¢W 2léP},S³Æ»°(y~E³±îg7ÅÂDr¨Ózé ­^iUÕzEk‡ú º[â.¥¶N½¥0ɱ)0°f§ŽGÂA. á¶`»@&È r›Ø^ÖYB(i! ²… {yr­pnî è w@jy‘÷&` a´4dDx'ÀËZ ¶Š¹gðöÿÀÄ$¦pNNÈ¢×Ä1jÅ:0F., 'òûa‹ñyz²DxU£’p×q®kõš˜t6&ŒIÏǤlLÚ“>“VǤƘ”ôkQIB-Óø׿âz+׫õšôQHº’¾’^ I_IŸIƒ!©'$%%¼·# uqÝÊõ ¦ñâ•ò¾räºQ’È$Lm¢B•©Ä¨%TšJÀigi²ZpÀ+!¯dĶ„Q³ce»~ˆÂøYÀ˦ÒD-ü‹"Œ³œÉ*<†…†‚Xü)çý·Q”ãO–ðGføû!ƒ¤ ÿ¾1 Ðx‘—M¥Ü/˜Ñ—hÒ‹AMf~5pZ–ÃÄRXØ ž§s¸ÖEW”Wè"ÄË&ý‡f9±IÿÞ` ã&ý³baèý|çLz/ =½„¾½Gß‹ž¦¿S,_¥¿UnÑ[²eât”/+<É¥ >º—~W9Oß*æmà¤×a2Çõ ú i8|†4Ï…_¢{‹©ö„ù<3Ï{ýp=[4nܬ°ÄtcôK´W§ÝÑ[tCx/í `¿J×5Ü£ñ0¯ÕæáMA\ɪð8]§ÏÄç𯑈GA"z³˜¿*ˆQÛÅ6qX/Ö‰•NŸÓã,s–:ÝN§Óá´9áeÖYiîêðZ…Q¥ÃÃÀacÚÆÛiPì‘"`§/~FÉ™þ”d,±°Ýhd ×Ö]“¿™ÅãæQæ !ãAØÂîm; {8… _ev¤@6„7,Œv X¸À"NÕ¾îxfaýÔ™Z†ÙSg²Y´ìåD áÛà]×Ûó)jß’Ž<=‘ÿ<+ŒïdúŒ‹+²†Ê…ÙŒ±±?´{`F8&¼šî™Ž2ÈÌà^áXz;³ãÞžì,¨£@ƒE}´HË¡ £ÁêÎqÚÞ"B4ÐdŒ6†(§Q<Æh°Ìorœ¦{&)åÛa4Î9ã¶ÃEŽÌ9óÿƱ{Ð<çÌÛ=¼œŸS€m`”Éú L6Ôs÷¶§îpÑ}¬è>ÆÝ_yêÖŠî‹E÷EpGþOÇþÔÿb¤ö§pfëÀ¤¥²Ý»‹¸Ìsx_Þ©®µ×ðrò*‰d w8e”„S(‘D<¸e£Ôp€Maôõuãµ×l¦œÑKÁ,-¹Ö$×$™ –3s•¹|É8¾¾ŠŒ-¹<`öBXÇÍý°.¥¦}áž, ¤öÀo †à:2ÌPú3F×¶“Š’6ª÷õd#éÀÁž#ÿeü(c4AP‚‰bÚÐ!hh(Âã"‘ábr³æ'#E§¢ÈÐ;fy‡X–†)µ È—ó§îTD (m¾êF&}#gñÐ ¹Š†ŠYÙ?œ}ÁÁ ÏK%®xÁ!Z½Ùm ¹EÛFÕN‡}Þ<ñ¦¼ëíwá¾<è\ìÜìù¸³o±% íy*ÚZç­óÊ `3ABäæ#ÝŽ¢í&üÇ%üöC¨ ÅuwIYmY‘2²ðÉ«âñûk\6¦PuùÜÃ@r÷-nNïï™G‰¾ûØ».ÚŠ÷àŠ¶x[›¦.«ª"Á•¤Št¤¡É-u’0n<¾:o¤þåÊÈãw`ûúÆãMdÔþ&ò Îiщq…Ëë³ðH¾ý[8·»×CÍg§Ê»íÕÞÔŒàAÅÂ÷ïyï{ t‚—••ÊZO܇ýÑ!TUâ‘ú¯Å¿=Ïf†¿yíñNÏû—ßÅ©nÇáÓ¿8ö`Þ’ëo(¯ß=í‚ú^W…÷Sêëîòîò’]­ÁM\Wø>vWokõX=V’míJ–ä•%aËÈ Z d&PC›ÀñlJÛð(©ór¦†ºžÒJSÒ4ÐÐ)m^NS@±cOë6 “fÚNšvú#m‡@@ÃLkœ& ¹ge“dÒÙÕîÝ3Ú½ßýÎ9ß9—m` +¼Ë§¾ £˜ÒþFÎãõ¼àÐàlÏâf©¿-qd´º¡ƒÝíúÀ¨ž¯V_®þ­áÀ3on€8®V§1^@n”V­Èí¾^¨Ãß®ÃuŽÞ2ü"Z`ñ ½7fVm¢ŒÒZ_™uNÆ3µgcM:Ùæ9ƒ°,ᘠ5Ì'  ¼-eãQ§Ý˜19<Ê‚E­Ý#­Àý\üM²OCT‹h?Á£Ô1Â?Ó{PŸe¢‹Ÿ@é ,ËΑu‰ÊG <=0ï-™¾X‹È‚êÏ@L>ÍY ìv ›üÖۡŃ7s50²¤{V™Ÿonž?¿8_¿ÂO_õÙé·© اèUÚ€ O!J!„º ч[¨†Dk¬„¯³3ÿú4ùB~M)ƒ{ÆkÀ2¦¶ ·†L³?úû+½Dî«Ù(€.ª¢AīȲ‹ì çm,TZÞ‹½vÆh7wÌ-´@Ÿf@">…¶¶q~xqÒ·cŠŒqÞn¿…M O"‘ÚTS €X£ÁŠðY‡h‰¥Ø`ÇöQS-<‚ {qÐ\"qü,dSQò ?†•)m"#_[ ?Y¬K){øqÅáôvú£¬ÜÂ7_ÆüØÌU_¦†ú0æ·Ç ¾™[;\µ0h’%C,JWW_ ¶Ýk®Têî›…°tY ´),ælø‹ìƛǿ–ŒÆ Ñ(±8ëSý4z§Åí’ãÖȽÀU#p5\…а>dü®å˜ñQósÆ!ëcÉúºñuŸù:}Ÿ¹ê¹îe,ÖÐyàÈüô£ îP…õú éç¢NŽzƒ-£„¨VÓõû.7¬Ö Ä ’öªG4‡!BN;ņžÂ×k®êš(óSÀ_É*ÀÖÉ€3U¾†ø æ_=Å‘Å+ר&;µ0 4À0Hëž“AÖÂáväºMÄ'B3µÎ͵‘ßV4Â<Ùõàú‡{ä¶ñmûN6döWÏà•wmòÆ£xãþý÷òûÚ»fÙÎÃoUÿñ¹N]w—O_¦W€/Š  útÓo©_ç; Žû­Þ?ãgçÙ:cwÚ–ÆVâûðVvgdwf?ðí 4H·µ=<Út¤ù‰Ì³üPðDä™è¯3'ñ9ë9[‰¿¼šlŒú¬ˆ¡öÚM©ÿÐÉ*r¶ð²óvb/A³Ç?W-vSƒ‰˜üsRC´„ÿ`³„µÂƒÂ?F[_9ƒ=hVœ*S$“ú]ƒD)ÊŽY*õBš‚=Ÿ¤g®éSê1w†@0¯ÇÀéqÖÖª›Hqm÷GNüá©ËÝ…—üƒ‘G.~£»Ö½9Ô:ò“ÁÍÛŽõ6ŽôœøÏï¿Ó÷÷u½ï{rËæøèÓ½ëwní^ܹrbÁÕÁÞŸmY %Š¡³Ló#ġ爫í§ÄKc”0”&8ÖÍQ±  „݈2º°ÔÈà—hòKÄÑçA,ª¿‘¥ïrvøžßÀ°,!vŒ±h\4+Ñy^?&µ<ˆEÚ/VÊårƒAcʧ0i€•>Í… gŒÉÞú*}âækä7øÏ««›«›îÁoêZÌÝ5̨ɋÇéôJãSB’˜‘ÊÀ2,çfYŽa15V‡­CÖ¡ë°ë1}!;×ÀN4bBf¦Âø 3Ø'g±ÃºøÏ€g³Q{P¿ ãvýdºo¾Fßú “%WS«ðñ£=ÕfD¦!Ĭ…ú.¡(>¬î£ò0>6Jf™‹¬2NËy…üey‹¼W>(?.Ÿ•ßkœj´°aVf#™p›”‰, -‘î–zC÷Ië#»Ü;¥§¥7„¿„ÿ*¿q5IwF˜b(HÓ!&¦úçe›T×¼¬+*;ÝY5’ÍNKÈ ‡GI@]*…ëC!6†LA! Ê‚ ‡%w8,ÉNYpÖÏ0‰º£²Ëe’ ƒf³ÉH%‡D$$‡w„q6e,ŒN-ó²Â(]ô¢¼WRý¬4k“Fé‚a¤[ЬºšEª «ü¼¬§ñ L¡.nú¾,¡Æ½‡öÔdzRS&eJQ&/)šÎ½ÃÙ©éâG!ïìL—a ‹vÍu³±äû´bÃÕxíã'CŸ7°|>oÈC7-¢r® z¦µŒó´¨·µÖT=žÉ¿šÎÏÍÆ0Ó°Áhw-ì²TÞ·x&B¼ÅÌW¿u íËæ-Õ-–¥}[ió‰j?¾›½ÿæc+üq!ŒFƒ®dÃöçÎr¾Æ‰F©ö³¼Z¬\AtúOgØÏ£0J¢>ªî2€lg2Sˆ2+2=ÙMm»Û¶v>”9bþiüxææçC™"3l>½q­JŽ3Dʵ´$]¢;äÂÂÉ––z1àÅ€©=’N¹šS8—’"mí©´t|&¹0q¥\²EìˆDÞdе´BS\,X±µ„¡4Èœêpf9ÝW¼îØ;Ü™<ßòN`”.Q뜢îÉ“â˜øG‘Šð§aG{FÄâ(Þ>Òa½b‡¹„·cáv¡Õ“IÑ”Åú®P„Oý­b“W¿?XŒûjÏ#-ð¬::•™~¼k¢2¢(]W&û®øÁñiýkP³a؉|…X4hÿjØôFä³Î7ð57kËNÆa{±¶§³þèèô{ݰçPÀ¸ŒÃ‘¸—â`ÅàT­™ÿÑ]6ÀQ”gßw7w—½¯½ÛÛË}í{¹ÝûÈ]î²¹KÂÅ@6¤(ÔDlÕ2ŠÑ`ÆA0JDC$£Ži­µ”Z¡Ñ±È*…Ò™Ú–2­c§¶EÚIqš:Ó\ú¼{J@o&ûîíí}ä}~ÿÿÿyBÎ\u(˜‹ÂŸös » Vk–mÐŽjáÿ§¿æØŽ¢QCø¡NÓV4ÖõÁÃlÚ°úõ_ÿiž³Ü%ÆìîØ¿ËëZíG›ðé_?Õ+ÍÉÿè›s¿ÿÙË{)]Tnémyü½ÊÔ+K;FWºí2m±‹‘^¦fu…œ˜:Eõ®Zo¾ºÔztϦ ñÅÓÓíg‰R/ª’dk65ÛÔ¯2m0všžð÷ØvÚöQÃÔ Ù²—ÿ%Oë9D¢V•-•úK3Ñã¥#öv7K3þt/tßóD{‰Z…5i@T^Tï¸3+ªBn·ˆÄŽXÇæ‚Q’M%Æ'ÇÇ@šSc ã—lc¤!X»Æ„£)¶ö«du}I8$AàñR¦Ú¥]ÒíéJtÒÂ5Í{Þ^v÷¹Ñ¾?µ¥×ä'ì¦z.£ÝX±©Öí–*tä­ixhAtùæ±£??yñ©­?{³ïÚKgÐ'Ò‚=³Ú '/UI}zˆ§/¨;³Ä·1Ú•è‹ùõÁŠ-@'F>Qô NAœá”%™B´¥THÅœ‚-~˜ÙBé ˆê#•ž>¦²ŽÜÚ4Jû>3ˆr2 yN@¡>Å .!u õë4ä@>G(¢NVÕ¬ ª;'ÜÌ{˜]ë?  ÃXdwÓÝÌ5a:DJx§`¥KnBQWhOao%mQÒŒö#b°týåü¿NO·,öÅXš³-¨5ÿIÐÉ{ë_G–otõŸýc 0øíüg¯={u×ð™6ÛqÅ&»¬.Z¹Æ>æ³ùul“Ú†n?}ñd’ø=ì:»^‡Ô½ªgÐC?ëyÙó¦‡Ù.öDwŠ»*÷ùöU)â‡Ä‘Jã*±Sì¡'p‹O!›¿ úÕiÝÙy¯dÈ>1 «•BPoàÅb!¼”a.‹®N§—Åpt†''`g‰Œd¿„eŠãüØ/`ìO§d:e±Z2]æ,ÅU1?V(ƒj gøÔ@¢ýT¤*¢Fè"^…úˆ#Dø!Í<‡Ëq3ÝaBB ß\e„Óý×n¡€.”ËgLCýñ-¡·®J¿îz龬ôÔ u¾µòÛ¡ò›¨¹EbVÁ õž5Áj+­ú{?<ðä‘çcÜ×ì Ô=bž‚ {cŸ|{3-æ±=bZ”‹õéJ¦ÎucžoˆÎmίú–$ÇÈ€ ®ïf”s¼2/çæÅæ·ÚŒV/LŸÕýÒª–:¡¶8 N$KNÈ)‹”ø•åØ –‰gÌ;ˇ©!ö°óãÇ1»/(bŸ—÷`oU5mâív((„ì\(èózÓ2G—Ó4=ÊÀ°kÈdúkÓŒµ]f}$ÅŠaVÛK#ŸC™ ɸ8|kœ¤Y¼£®ãA-ÆHŠÙ>')F´Öpiê\é9`BIX‰|HÛq“ SÄ…‹`ôv'[ìФBTc m‚ÑØ'Ñx°Ñ×#ïxG„}ç•ü¯N¾~üÃêûXáôV<$šè¬±õv=ÒþÜOÚ>ξå»}úàÉ—O—yÂ"¤ß}wJËwåÿr>ÿ÷÷ó—ørÔ¶0!9p4ŠBqßÓùÛ¢{»í]4÷ÏKª®$QÒ‡¥ß Jj‚nßÌ»Cœc^œ¸Ñé3am„U}N„–ÏWÓ=Æ!aØËÜÓØiìŒ3÷rk›i h*ÔÔfÈh‡ùÁðbO…’Àl=ªoº ׳4 nÞ…Ýñp ÇsÕs0´ë¼?@ ðæ¦pدT ŠR¨P0œ(w}.Ã]{<îR%0?Fªßd‘Ñ´ƒ  ç¨0œW3 (žRÀ³3µYE•kˆL¤²Ú‹k«ê ×(¤5íVÞUŽ)§•³Ê„¢W@ªq>p)®€2_Ó磚>A E«&颖ÉÚG±àÙŠêçÉ3M¹JQ¹…W9£ÒÍy´«# c¥ÛÓ~ŠI{DZaÞ1O™‘uñAÔ=>96ž à èúØõ9†µf¶8ÌXg†ë 37Û¾à’¡èød.³oC3ÿà!Š›>sÀ–#5‡ÅË~G¡¿ ^7CÄP v¶?¿Ì0Š÷£ÿÒ­=Ù#2/U¹‚¡+þšvÓÔ„<ƒ÷Fº¦ú6ál{éÔ%Ëb0od{jZÍ´ËÔH—ù%ú Z¼¼–x…Œ8g0Ýyí·+“‘¨æ$¼݆vç—µ§®_ˆoe2íÙâíB0Ù¬£(f!°îGßD!.WFØVmªœ Ð÷¹^uô1ÝD³ ¦Yñnæ‘ZA»Ñ†ínÇÏ–5òvšF¥lyÌÈÚÜGD@h¤0ql9›f·°/²:ªÎBµ$jÈ2’©aÕH4KÎÿGyÕ9QÞá}wó±¹d³»ÙMv÷ÝÍ×&›ä’p¹ÜÁëe­ÀQùСwÊ—€­LµV°*-ŒŽ3ŒýG°­ãŒ ÜqžŒ í€Nÿi©µíÔþ-ÎÈØµ±e¸ }ßMîƒJvæòþ²ÙäÞçù=Ïós»kós¹È|‚îD\`dc v “aÆt3ƒ8+3 gvÂŽáDGàêŒ#Ð"·¡E Ö™)j2˜šøh8.âêR”iQÔ=êþ´l­ù¡HªÎ`Æ2-–¶jŸ[Sîñ>‡ATf[r¯žn ï,OÎr¦iÂÞ„§ƒ3aupG¡`Ýœ;-ªÉà*7ùnp…ÖI¤þf¨˜Î1‹eë£x¬Çr Å(ï¡*›ªjZtQ¿}hâ×;ÌXJDØÿ %†÷ö}à¯%œºzê%¼\­„i`µ…úv{B;KJGËÞåí+{¿Çþ¤òÌ-?'^eϰ#â‡!V(´DÑÁ{¶LKU}A?ô)F*Ù"Êsûjp®x Wæ#PΘÌô”»a€ IÁ`¨ R¥²T"@©,÷À렕ʄƨùN¡Ä–2ÞP(X*•‹|¥VÔÐknOO6›!Yöù¼´Q·Mž£€# †ce«!Ã4ÊuÑøÄ WÏꌡuvóTÒÀA£ÙáF“ F‹ FK¡ ÄUo‡ä–fÛ»xŽZXΈѴÑçès2¾B”'¥ÐkÊÿW…úüêÆPôcGÊI¾†gÌa£·°&øKÓT,Bqd¹S¨™DÁÍô(5Ã)€Nâ 3åÂä!pçš]ë¸É³Ì‚KWãs¿ÁOº¡©ÑÇZçíRL²u³`gïYgV†'™þõ¡Šš¼úôRËòW†.-ÇõíVÆž%FkkvÞ•®/ïoÛåÕˆôZV ›dŸÆN|– œ9˜=h#^#F5Ö4 ›²fZŠD3M3©¸=|N"^HœmgS„'Oçl†æ‰— ›·ã6eŸËÇÎ ¥b\»¤‘ÔäZ¡s®é›Q—(t“(´ë Q\݉„ÞלH\»jfÑf·cìÑHÚˇk_Ðõî˜1ˆíÍIR_lìú‡'õH«³°$ŸDµùƒ‰áKb¸’SöãŽ#îU[_™ƒwjyÉL}lô, ³2G.S…ÜGšî}üðŠ¾ªÞ¯"88–vSµMs2y`Yéœöý‰ß¤£r(­u1g¿!ÑAêÃ1Üí½HiW‚5)$é.د-„wë«àfb$ñGøOÈfõ·!¹ >G!• ˜äÃ}Ä´øÝ yÛŠ»,ÛÞYÑ`Gè}¹áF‘šÃR: 3ž9°C„šê ]áìå'Ï£¿óçÃhcqÖt¦æÜßQDwRŒR¢*A1ÓŽ>,°a(X&ž^Òàé™k¨š¤ªú'Rº&éºVloO™†dš† ŠzƲ Ôé‚"I‚„: TS­Øšj˜õ8‰[ë4a¡e Ëƒ¯yœX—g (£¦Azã@´À~æ‚s…Çõ Q¯£NÛqª *I¤'•ÌdºªBwZIbSFØYA›' Ý¥>ýî…]“-ïÿøw_k€ø¾ o¾±xàÙ#_?~ÏC/>ëݶóƒGÞo$&^Þv|ëêÎ}—F/¾sèÏkx ¼<öäo òúo¿þ õ„޶êÄ|¤Lö'ž´žKüÐzÉÿÓø¨ÿT‚õ± wOl^•Žæ·$zWÙXGÉW£m§g-NF¡$œ ñ}ÐfYhÛœ #;&ay²Íq†¬ ÞPXš™Awšf˜ …0Í”œ³™O¦†P†óö{ÜiäÈ )Žûd ¹¦,+rÓ”›1åAוå¦+Ë-W–[ñMv¢nëœjòô\ÙÌâÈ£—^™²èVÍ:&ÇyäÒ‚ëÓÿ…÷þ j*°×ÃÁ±c$*%B);MîJËš³"†ªÙ~àò»ö7&ެ}f{¦{;ù·uùœ‹vmýÛ;<0¼ñѽó×{—œúÎæ_îI6íÏÇó>ËúÊK”çß„W}lç~ß;Üùìó}9þ<ŸïŒíÄÎÝÙ±˜˜ø€‰Ñ$ké€Ò™}––…AKiJZ TÀDÇVÑ@G¥uÝˤ„mãub´ª4u“&*U“uÚØ¦m$ì}Ï_Ó¶\t¿÷ÎoÎÊ=Ïïù=ÏkfÒpNŸ‘לÿú“;yÄê;"ÔÞF¨¥A´†¨&:SÉ.=ٮܰ ìÏ*»ô︎ë?Ê^ ^Í^5øw\çÝ„+Ö; “d¦PpxEŸìe™‰Ha9’Ö+/8qQ’DQR5- „TS…-¦i1 "íõ2  4G«ØÖ,‰\+F-Ž_¼^Â&ù\,^¯bUÌô",>v`@%BœqDéK´‚L´üáN±¯Ä~â¢Pß{O(£i/ñ·ˆo±?Bß2,B3¤  Øö°m«ÝÄØÛ=wÿ{S³Áá®U³‡åÿÔÀW¹Êе†æ©¤+SŸzYl÷¼:KÜ"ê7Ĭ¨“‚ìÿ¤§oGPnú=ý¦+Ò"&’S¡î¥^xé÷×>{%ÿµ§™éÕVÛé_ %Z‰×!7óTß¼lH R)ÒËËæ³dq…nX0õÈ3Û®v¥ˆßÑWî¤z€½sÓ±é_ü²µo_ëK&±Ö·–]ëßädýƒÜo»Ç¿›Ö‡Qß vÔÏ5ƒ¬¯¤?¦¯Wô¨Ýì6ãµ?»_Ó{œ=Î+¾ ÎxÇØ1ÿiîûÆÍ‹ð§Þ+ìUîœñžyˈ7Ë™>o¿ï ý1Óå’‚R—wÛŽb¸üºÏp¸›åI2nyšÉÏU5@—¡(£›¼»X*šË žÓ‰|>OäÑ։䈖Ñ&áâ E½¡j}"âr.-ájEµLÉT«ê°Jª‘…¹Ó‚e´ ׉Ø1ñ¾n I€v^@l—à\PsÏ…0EP'#ÛÎMÝÊaïŽ Ó¸®a*`nLý‘›Â-°ñÄpoƒ5°n ŠÅ†"Û í¥¹Å6Ät`.’É:ÖxÀ$p!AÏ`ðÙ-š{ìÐÞż¾.f|üÎü6eÅËËÙXzƒæøÞÞ /÷ÃÜêÍ×wU6lËD:Tþý‘üÓ§6~a~ÿ‡…åþãÒ‚/ÌtVR»Ž?ß·tÏÌÍSO¬ÿÙ¦¦œ¿ágR æ¬$‰{χ¤zÂm›,0È!;É"1¢tAx™¤€¨Ø¼òe•y°¿;’²¸(çA*^·ÎtÌ„£–õ}(P­9Ê1 ¶#FPÚ5gÔk²¥^ã‰R݇"¥=‘·"cÈOñ  F4Ïú‹dh4o ;ôND,ä1mk,ן'Ø—±3‚RCÛ§r¸¥d¹jå6 •JeVÍsÏsªÁ™Ã«h1?w "H§Ë÷·3ŽaH'T5„RÚðÞ3±0‰§p¶:\ƒiQ×==s«h-7¼ÓãLäѬlfaxùŽ#«c)gÏ̽¤b·×ü¤%]H¥Âüãß"QÙ¶áò[äE÷"\Ú`ÿE Ôcž“Íhq,yÞ;á»Üäèw®P¶ûö%”A™e¡#ã c¹ ](ðF19 ô6Øî¢éxV—²Y=¡iIA’AŠF"H¶ v Eû9~NÒ)d…b³ž•8mD°ì ¶P‡;qµ||9/XBŸ@r®iv½óp{ÖÆ®¹dלnWK(,(%²0û\‘Î… z¶g’¬ž¼g=ëBÔI5;©<T¦ò³¹ä¿Jm#0òRˆæK>I‚–p°a€›2‡­'Äùãçf @n©“hÌcdE1z$K l/ÍÊsz‰…Ìêîvùµ”Û{þ»ëF¿’|N_XcàÓ³¤Myý‹/~~öú?JÙ+owö¤¹k`&1ÜlÍÛõƒîW?Û O¾iª¦Çîgfè¿þáÄgÇ:–´>=`¦Z\(1äC?°û°fY€OITÔ¥º¼ÅÂ|~a #\N”Õe\?Ä¿ æNH£÷ì“Ê@‚åÌ_áI”€’„„VÂu\n·/#Qûòœ±À®Vk¶ö{d:’ˆÊ ºe*̇䰟ãì¹Îñò—T’ª&&ïì´¨‰H8LÓ¡Úä!?Iç^T/‘èX<0c°ŒZ2‚~Fâ0  ¬Ñ“äò³?ÍÎ[4eÿvëÓ˜M9”=Œÿbzÿ2ÿ6?Î;@­<ïFO»]ÆÑ«š´ ög¥r=š³ž:’il–Ý$DC¸½J!œ·…Z²lއ2«‰¦àW6ùª¾á)Èó6ïœv(Ž+ãz ­¥iýíßí0”`´Ù‘J9ü‘M§þõgÔÁÿ¸sÓ}!Z€7,ÞÕ }ÆïãYÑ/¹ —cÄÖvBŒ¿„¯-- æ5¯¿ÄZèDc™v 8Å´‹Ú á§:áOyt§á,˜)*` ½j¯Ö›éÍõêk•µú.v·vP<(OJßÎçøªÞ«ô&Èj¦š«¶’U­šª¦ÉªRMTUÒÐ<Œ™¬¡~I‘‰e‰£ å¥eŠ À@´Idôf9ã†.ÙíO›i"­ K¨ÄãIC— CÆãq3/™qÅ̳>_²— …¼×ç³ åcG¼¾<ÉqEg@&$‰¢ÜDÁ4gãQEw™h Š“äÊqcÄœ$FÆ #6§˜p │†M¸í|Î6¾4ukêS>XD¿ˆQ•§ðš1*7Ä9¯!†…ê jv1{§ÁµÚ’­ö`i¨G]AðØŠÅk+hʲ6£îç“‹@7îÞ©Ç\ÂÀ÷â• ¼Í<ÕÍv£-‹7SDŠùªR=$z虥sò (xÔÓ¾b~b`zUê›Ó«ǦEÉÑ®ûèôœÓ]õ±Mœgü}ïÃgûr—‹íóíØŽ¿Îç\'±Ï®ÁÄG ¬BÊG4dY[ŠR ]öVE¢£¢(" ºµÊÊhE¨„Úul*$ÐZ˜„öÇú›ÔªÚ´.C–uPuëâì¹³ª¶Y¹÷yï+÷¾ÏÇïùýÈ€‡ È˜*—íXØPYS9Hxj}¨QY@µtÅuòuXÞüsÐåg!Kx“áßG½N§HÙ»^Øy;s:CÛívo^&u³¿,«/,6|íYÃ`½’ä•eZ’dUM¦R^›f ËéºCUS°¯|>‰iè6õ^!Xߦ§ƒmÕ •qÀx¼P "ÞÁùˆÜŒ VÜšj ¶rjB²Ù0‘l4ŠêК¼)):ŸLÆdÚ_Ìë)ŸìuÐöÅL̓¢‰wbéh[+ô, }ÑH=o?‹o>H+ô& +qúδ…øØÌö1Ê襁€–ûwþoàïþ\`{Ñ^ì».ó—­Iu,Ú/WñgpàÅŠ0v{¥Qcø@Hlõ™û¤“ʽV—ݵǔ$Å¿fýÑ®ÊÑÇyEnïYÎÎý…]ø‡* ºØÿ geÛŸëÛǶuô 8ñŸë–¤}ò¦ß¾np–Cßá7î­ªŒg·/[&A4zš‡påÂPÈÕrÛ‰„=œ>€àÑSk!Ob^yCeòÚ ½Qâ\$àW&¯€"`ЯÎsTñr?=m׈6QC`(?C^"÷!éøcCv4Ù#:~ ¿Ô<Ž^m>ÔöóÌ{Ûn¢‡Tç)óë rÍË›ˆº¨O¯ã£j–7ï`R’ú¤!‰\ÔŽë 8­3|úïÇÊŒBb‚¢×+% /ÔqÞdºSIx©±%TÊä¸áFÉx4ŠQTXT<¢¨¤ËóŸN…\¥t™l38¿_`Åœªˆ7Vw/AA"ÖO¾¯üB4à9Ñt<Kd‘(ˆí"ùCèk›ÉµºxžG-ä‹ÄA“$e³AóYIIfƒ»×êÁσD°3'JbÎÙùaÕñU.£YŒÃ|éaµd¾4bòrí\ŒUm}í:,$X¥Õ–=i2Óêocï;Ú 4•; :¾˜Õ„šVfµ{$X†eêÌiÜP€,l(À Z WGÍû€I¼pÙ„¤A˜´ÃB&´âDóÚ'¬~däÏ_CY8Ôù”œŸy~@Œ4ȲŠR¦ŒÉK– œì²f®<ÈV¯”g¢ÐÒ,Ölñ&òÒ‡^Òi¯ãÄäâèÒWº4Í+îyºoeÏÖ ¯~wË¢ÕbüŠñЖ‰î–í»?Hî›{d€su!8 o×R¯8ÞÝñüÖ üèÖuÆòÅþÊähwß›¿ûcÿJ3÷rfîÑ!ëã˜6„¶;1ãX¾IŸk¤Ó‘¡¬i¡aù³ 4Ʊ¸,#i)Sõ¶K½2‡#~ÌCE"¸*‡9ÞÃq|$*D’ÃMûã,Ë%TžBeòE£žx¿Ìü†! f“ I$á8âàCÍíO›TuË(–1?ÏU Š?{‘ûˆûGre¼ðt‚“¸„³L„OÖæž^žƒº¼q/¼³€(V|íÕøb—QWáî¬ö/|âY,î2#:b†BJæÌHˆ‚ŠE“¸*C£ŒNBHr.“ÜFm ÑwåÛ/¯zú@¹rsôµ ܤVQKm^¹áüþ®ÁI…>8×»yù+»Þ¬\š¡¤çE?çb”~™w¾±ix|/t‚"ø~Ô½Š9c2$¾¤šCjÁZ²MíB]xÝ•ìRû#û’ljcñÓ᩸F~ÂOùh2¬Úö*xgr,ùV„ôÒØ”…“ –ZœôZêQŸPßU "Äùʘ:Œ;™ ÆT@(ýÔˆ† ‰$É¢«žg|I”æJ\7ÄQõ\˜#8sÔŒ]È·J¶>Ûí;6j·í¨í„í¢í#mó¥´õUº8¢õÞX%TL;;; Þ×4ˆ€‰èáê`µ•˜ŠiƒŠ9rb…ÌJÙˆFðÄ0Q+WÜŠC­@ºˆj$î‰Ê\ž _{öàÄqÙ¿}›Ò˜ §êÓNwPìb÷šïmî}í[ŸìúþÑÑŸ`õÌÀƒ]-Q5änjõ°"ïûÁáÃ[žë}òJ”ZùŸF ñÆ&„=Q_}‰àtÂÁ¹bÖi¬œÕ³¬Ñ™ÓN=púÙ'O²pþžµ•Ä>qHìÏP÷_‹.ÈæôžPÏÂþ¶QýÇøuÏañ-ô.;OOe§t~ Ʒu\'ãNóyë¥EFB_dÄâ0iÔ=1W÷6'v²éŠRÆ· EmkO÷Æ<™B»X‹yH·Y{$J“a·âq»•L¼‰)”ç?™  &r³²Ì³î¢ª¸T&É)å]7kf†3ëì<’eÇœpú~V¾äHzßÃIN§Ç‘[pî*€»Ï€ç øä@0‚ñl Z®K]ªÀ_Ñ-¹‹Îη¿^•½#Ós_hd„ðoº«¶³ ßwçäüs¶Ï>Ûgû’;ÿíóOb'>§¶[ûêÄi'ýËš.i²†µë?¥i kH[ctª ÍŠÄ4VR~×i¤kñ 4ʤ±M „¦I¬1*k U•&Ã÷Ïi@Bò{ïåûôù{ÞçyŸ÷î‰o©¾–ž¨TìH|K5’ÂÒQyª?s«5Â*šA?Ž·:DЮiçÿ—XFóƒ*©1õL÷@ãû6ƒÙØZT >òõG·WGç^{navsøaIY~VæFrg•»@z^ø×ÞYÞh7»g{O§¹ÙÓ·' çN^ÛíHô‚iÑõ:-6R\9¡ln̾VÝ^Gº«@îÏAî{1k(Y+mÝ´[ÔazZÛÇõÛ xÔ× ü9¬6 wéwÒ;ÄEÝ·uW™%ÝM‘Ž cß– [I€ã®Þ 7´q˜Þàôaç9Eo,š¹N®›#8Î ÙɶˆÉäË[‚wz#Ø0ŽhÍZ ¤–/F·–, \è²X<áø¯Ü­<öñòfˆâX]5gКÍÄëJ˜ ÑZ3èØŒÚ« PXàV H`lÆ’^Ë$ʪˆž—`nvdˆØ Óâ3û?´'Û#ªlSrï’g§†žxÜYÿãÅgjÀµxh_yçŽÝzffaANïû ˜ïñOž)<Òy§ö™K`ݵ‰Âøèž ’×&õ}³˼ ýcãrcxr½ì{#àv¦’%!³#^jWØl9‡éì%*e‚è{¯'˜Áx©@ÊW 7 © ga–5#KùuºÊ*p` VèPkï½´!”ÄèK\È`ÅJ+ËèÝ!t×Èß¾Ã)q ¼¿¬ †tÞ)Cï%D0àkÍ÷׬ʠUÑjÂ@4"ÐÙ|.ªá%6m®á„B§öÚ€À Æž÷4þÝY©¯ÔW Woîn†^n¹€|ôÜ-8|k£oYTƒß¢• «žÜŽœ&otõ| WÖ;J@rªäG—ŠÂ´ÌÖ$€¥È “*ý"ج†kÓeѨÆûš7ZÏmV@‹žðMßc¿xtxäàüôôú˜Ð+r¢“& L|÷ˆß²á¥—,ãå¾D!;rehtº+$D¼³§ÔÓ/sCÄ\¹Qm¼ÿüû;6†xDÚ˜ïø´GPz1 jmL–PaZÃÑ -ßI@zuì­Q7RÙ9¤±uyÛéha¢j4“ÊÞ»uˆ~27ÇæZè§S*soTfWÉŠhÚÊVºH#ºÂ¬a Õ¨©va–u±5 ©¦°†6KªÜUù]ÄA{ zHéHXïüslîׇdGhøõ2½ó~íôÛæâÜÙ®m}ìãßVg“c“Cs‹õË{¢ ÿ¶ñõß}ê­ê‘Q=íþòþý&_‚¶9ü¶d8#W¶?9VØ+ÇgxfS(Ê:/ì¼p›÷}këôŸÆÎï{~å³âÉuåxñSc‘A˜UøE¨Y°Eù´ýrBº"ÛóG"ó†y~!¼Ñc‡Ãø¸ŒœÌÀÅ Œqd+]SQ9•Á$èÂ0’¢Îçà8–À² !ÙåH&»‚i™LÝ&®/ê㺒´ã<»ìuŠ}5Z¢Dµ×N,eŸDžZ]”—Øœš:dõ[è Ô˨Y±çå’ ééãØ$Ëõ{¾¢¬šp#í^†Ã’P§MJëaÃmk6\Xn4©b«¾¸ÕpÏÑ–3·à¼£êlµÕ—{ cËBÇöc_`,X2Џ©\ è þt“q¦L`×èNÜïȼّ™¦¦7ˈ$ƒ O}$e|²ñÁÍ·gRJÇçY›ÉlË­ó;bwð„Ëãè&ÝOÆ8å`8좳íÂ'2°¿Rî+?Ô˜Õ[ìæÄfFþBº[LœOWã·+v\xopüÝ©ÓÞh;A½÷Áÿ ïjsa&L!%ÂÍË®Ïåe{\±ËqÅÃe&)à +UüSÑhJ£°cí5â9ÅK‘QÊJIV÷;xÞÏ™øXÔÏÓìyô«áAÕÀ¦%bÖZÁŸHGì¼ÂÉ<-_Èðx(+ˆ&¯¾æø2)þ)ç=1žåcÆG5,ïC‰ÎÛÄ£Í+fxA‹¹ÌjÖfÜɱå•å¿ÒÚ*ÖkŒv¯N·ÀEÓÎŒºä V¡%³ _Ž…è¡ÛÖ«XsšC_#ÍÌ<[ÆjPü&–/HR!ß÷†ƒ1[¹|p`z (e<_ò œ«ÒæÊǤBAŠå'Vú7Yhgl’Ó¢8~y´ÃÕaB5¾ÓÄ‹mNˆQ ûঽG±Ò™ô—¹ˆš•N³¼Û¼[ÜÞYLµy%ª„§¢Ý©Ô*X~ФÌTÊ,ˆa‡(†]µ@ˆ¶Šð‰éhX¤!Vê|“Ÿ&€Bl%pbgU#â×·„´Ú—o„ùe&ï­²b ßI‹¬˜^¥}ï’Ø™º:òhÇG]¾uâQ«®· ¡Ã w`A»€AÁß?éµÇ 4û YÄ6»&ëR]Ò}òÈàÝX¡ƒ‘o¬TþùÕÒÆ´¯Óe÷Xp‚¢¶HÞöÇýf›ÙÓæT£qò“Çþñ‡|Tèf¬Œ—1‘m:Ýþg lŽr‡ 8ïB—„¹¡&ÞšØ n()*àÈÉŠÙš‘§,+´l4)·ÉCmÇž°]¥É>¶$²¬Ž=ao’Ð ‘"p&‰ p$ƒ­„ÿÃwµ7qás´²ÖZ],­VZ­dë¶’v×’,Y–l낵$ ãc…ДP.†$@S iÌe2M é4PÈ@È€14¨04e&ôBûÐÌd&ÎôÅe */4i=»+§Ðj¤=:gwu9ÿ÷JÍëã±¶~ôžðé årÿ¬˜I:%;Éè½6ipŠújh¡(;?g†PÍñœ™.·ÁlŒôj]LßV •a£håå¤ìv·?HùýA¨†@-¥¸™£Ìfrè‹õä”ÚÐÏ Q‚2è5O¸Ž88Ÿ.$˜ Ž¤ë€» ¯]µÏúËÔlðS,Šxð* „àõKñ/™“ A!cyŠ<¢PëgY’‰tR`-çÔµ5ú}xçkDÀ+Ï˜î ”€\¿äsÙ9Vˆ1¯¢Çóœ, ³ÔðLˆºY>šnãõ¦l}öÇÒñ ɯM·nÉ“™Â9àƒ,ÛáÅ52ÅÚ$¡~‹¸ †cˆvçÚVõLuvÛõNRφY¼B7µ­óŒÚ<í e¦vÓ+±fš/M®?—7ÖX:ލWXû‹åŒAk"‚A5,6-Ïïý’çÍÁ!fr•7¾V=®Þ¾–±Ø=„Œ¬ˆw×"d5AAìÓH7t‹Žä0n¼ïþ7­&<º˜NÔ èÔº¦^ë8ßkBAÙ¶ s“VŠ$­ :ÒÅ[IÓã 73ð:úH¿¨Ç$ áMòsRE–aF$\Z’&]ÄkËkº(¹$ÙÌ’¨p´1GÊDgr¤ÈSòìrÀ¦¬ZX+Zõ¢UQºP49•ó Lí.#V ÊÕWì)R´ÍYß9\™}p¯ôßDŒê=WÓ’DÃ¥Ü*3»NúB:@ÄÀ³©šá‚O¡[8_·µÕsŒÅˆÄ#åZ3IÛ<°Áäé( ¦ãcTeFÝo&ƒ ŸÿeìÜ÷Ív7@•`}U·ùÛ!U¯¸AZÝcÚ ýÃ*jug)]Ê<›|Ñò’mCx‡~‡mgøõì$v0|0;¹ä8ö¾ñýöãK>‚S†:Îv^L]L_Ì\Èžë9Õ{¥ójúj>ð½ö;6ô`ƒ`¬gp›l«çg½ØºÔÎöíé]=¯æO¥4< ¤¸eÑ‘-Ãu^ßPµ(õó0?ê†4 Ý" A1Ñj6w·âøÐïN1Œ[ˆ¡Žé´;ÓEe2] †òîB‘*ŠA]!ŸGTHÃH²»2Å‚ÉwÀ+ù,† ÄÊ@˜€ “Ï TBY•¸º% /¦aZ OÖŒÈ&3¢³1±%3$]Ó™xäUØ'ÅéÁÛÅÉ›”·<\F7ÉSF™6‡å©HG‰-…ûUè ] …áÇm²K4Qyð R2!_)mEë <[ @ò»Ü¼o««qÄ7›5!w_‘Õ¬x9ô\(ù%ù¡àÍl@®-‹^À§Oõ¡±]ú ©Ùï§ÔÊ”Å!e k&Ïç³,Äú(ALÎpŠáÃÉŽÖ~Âûu,Œw켜¡ ˆ±–9Jâà­Z´f<™Ž/¦—zg劖 ¹Ù¯Õ“Š{™ÝãA6*L¸U˜NßÐ=ðúŠÞ÷¦m&o ûëóìO¯ÙqÞmÈh±Éê¢?èôˆñÖUغ«'·8Ý]ݵÛh$pK8oåÅclì'°{‹Þ‚¤ÓÚý÷÷î©Jßñ:vîØÞQýRõÖ°EkcõRçpH§Qç´Ã·÷©¹_ñXÍþÖGmÀ©rFÕ+ñAí k¥gÜ™táNó3ª™ n5\ÍÿbãÚq׸G\JÔÐŒ6¯Ln ¢¾ùvÔÉI#¢$ Ù0‘,D±B ð‘#ÚCîp„ ‡#áÐ\܈„Ÿ7¤z®N:˪#—’·#RÀ !± Ë+'å!-’Æ…k$¬H`XæHSî‡aX áÿ@Bý•ÙÙ¡'3ÈSï6Xƒ®é[9äÿÄ>äÀ$ÝÞ’8žp¨ŠΣáìÖþë¿_ïnÚi5iõædÎ]J·¾WlK#×wr,ꎽêazWPƒà”‚ô/'³ß­NLF‹¡yÔ²?ÅE‚±íðb3ÅØ#þ`d݇ªm[i›W­ñ£¼‘E˜¹Œ0c ˜»ëUZLC`§-ì'—ÈK¶Oíš û³ßrÈ~ÄrÜþ!‰·[ÒÌ2KYU?J[pB¯7ûu8VWGûÕ:ªŒíI|Oq(ïY’|?«pÆa”–9 )Ñ9 .I1Ž^®$ä£EpÔÏœ¡Ïì¨B_+ê¿««ÿ.ÈU$Š‘ Y ­¥)”öô£­Å¥-SÉ{Kb—OTgßœœ> ûöM™È¿ûÍs…ÃߨŽVÿrþâÁw!þÂÒÒóÕ‰Ï׬‡§Ÿzäªöa@»À‚8‹#ð°þ¸~ZÃP—²ÁRãRk¾yD³Î¸Ý¸Ãqž¿VC¸Ö|Ûa\â£F,>`ÐàoÀæ c6«‘ŠYÙ^g~$y_Œí~ BàŒ–±Ã¢Ojkt;œ”Ãá ú º«Ám¼Óa Ï`{ŽÝ’Ä%\ ÊÀɃhõ$qÑ\CÀ_ÆOâ7ñ:|Ë GúÄɲeºìWñ¤Ct‘9é½H6¢‰³)qßL›ƒv´e,ýñh-4(M±ó+{ÔTy¨ 6tWq[Ãç* ãZÊ¥fH=Å"Û—E7nÍ× oWðPÅ8¹lm¸·£ýqdHZPéº0y¢Ááo{7Mý°úóÄûcè×V¢ÔíH»=M‰Í]/%6®ì.´nü¢›¼³ç…Ã[ÿZMÙ«Õå´ÍmÔ»±C”Ó…s-}émGþøüÀȿΠjƒªöŸPµ½ —Š„Æ©i\鋨9i›JÈMÕ;ªWá9óYrÚw&xš;™j¹Â鎵L9±àÞà¡,Ïô9G!–Šd¢K!ö¶«=¶‰ûŽßïÎïsì³ÏöÝùßïü8;¶c;±ÇÁ!„QÈ ŒÂ¡´+4¢e°*Z_ˆ2ð4@«E”ÁÖU“(mE#D`ZÇÄ“úO5©ê´°ŽIÕìÁ’ìû;›—4Y?å»ÓYú~¾ßÏ£ÕÑšëH0Ç(”Ã*çàØ¼ÃŽly»ÇÓØÃET1ÛÊ%ÕIæ¨ÎSñXs3!…S}§¦'™¬îô³»‹Ë'UŽ£>ÎSÑ* ‹Ã_ænq4÷êp‰Ó58J¤ÈÕ©ŽáZ€‘HÐÁ¶Šº\·ç9Ë;Ú/¡¿R÷£! Ú`¿‘›·gî;À¼®‡ðrÓFø!B]iàü(¾ulwÖU;M5¬ PÕ€õ>»ÕW( J5ÈÏËüvîR@ð)íŽ9Õ±EÔÚµ}»V}é™g§ÞüÖæeeÙ`eÏÜ?–仾y’9xïƒAµ9ãq›ÝÝû<šùÅ`ùíÑc¨lxiÿ×~¬¯žÛ8Õ7Ø»-!^^ƒ%¨¾-Ô¿õE4h  gZËl²or¬n9ÜuŸß Ú_ Χ™ƒ¦ã&:¬(ˆZªþ=Ù’§íôB#5ׄš&Ñ)=â‹[,ÈšDð¢`Õ‡±ŠGRÅ\Þ®ÛWÚû­S øã-×0%+T°^ì.b=SÂz NŽ‚áB¨¹HaDáSø2¾Žoáylí;p!…v# Ün¬_:==;m¸ô‡’T‡.VêQ9úA¯-O4æãÌ«C€HhlÍC•1.mEë|pxUAÕ"b« šh«õ¸ƒ¥á§Rᔿ„Ý>ÕßÉ¬êœ ¢ôîÞD|qµ5¬ð›Í¥oykñð.áeúùíY¯“³C÷çg I}ÝÏSõX;BBDæzl¬É-²~wWœd£îã “C=h"šD&Ý‘½Jå­æX‹UšDô¢ÿª(°Í1Kר«H÷²=+B×\]×ñgø ̼‚Cÿ®`>mëÒŽkÒUÑý"Œ~Ž)ž¯ˆ´øí¶)Ô‹žàîÉ¿ r{ddønzd¥§:=Sÿ1ØŠ 3Õ  4B)t*Ê€¶ÚIã²t©ÝÈï2ýywܼm`áòæ¶½ýïí{b“êmâÝqË®§û×s¡‰Â÷và k«'Ý ýûý{zójµãÐ}Û"Î,ê}óåµ “‘êÇc¥§ö›™D&xôðYÓkTY.Qf0p;ÁýêîÊOÌ·è{.f­\£î"&ÖÜE}ÅŸq3¦_A¢Ã”ËLf«•j…e 5‡E³dB6Ð$I2™˜7¨Ó4²ð,X3%  K%)8z¹›QzžAÌvL}`u×\SQVNo@隷®耑\;´Ey,¹¦‰mwHR è!|!qö.P ™èé:ך1×-ô|ÖH0ÊB=T*Æ›«UÄ]«çÂ1Ä@¬Ñÿ뢄mhað¤ç­³!Ž•ZÄauãêÎJ¦ÿô˜ã…ïo0½6÷EÏìøhÈãú¶JûËZ9ݱƒ^’ï~ƒ°q@Á¼VÑ1}Ÿ­Kꢽ¥¶emkªcý{gý¿¢þ㷯ͮY0fgúük¨ ~¦ƒªúi5ÙR¡ßµ£ŠÖ“JŽ&ïøïîT¬¾Õ*owh‰ÎJW@0üU^KÈÝÙB¡á…ÓÖ*e¡Fá«>ž¯Š.Væ»Á WyÎQ³ofHä“«ïñà‘x]”мî/)ü?ÊæOñfÒ¡î,Äe=‹²q|Ô+×Ý0)ð¸Q}þzͪKÑd1/ëòi™‘¥n»,ðü©c÷/ ‹|åYz{ŒÀæ‘z.P1à IpÆxbáÓL$äd! 6Ô侈ÀPb êU—26¢_d+þFÚ['' §‘àìcøGqÌwÏk¢£ü¸É^H—ËÌGï'šXOËpxh¸\Hdš¸¾37¶dõÌ:ìqøS+”¾5zG<—Ü”üêØ¹¯/ 0;gϾõz”íÂK ´L4Ò¹â_s7?ÖÛúN ÒÙé o|£œÎÅ;¾;÷ó}Q^Xü—_ÒO&)“TƒIÒ¨{ú¢‹%u®”Ôp\¥õô“ÌÏLŸ¨¦–ЂÐršéŒ ›ÝœM.«hµ"žó#«‚YÅ›óöx/èÎEwB$ž™PÛxªd0œ¬•n‰ó"E]|U<"þA4‹Á¤RÃÔrÜwúJ=Ú6ª]ÖLÚ‡L”,1…É(d‹¸þC ¤x h¼|%~Á§Jqë˜Á“th"Ñþ©HÛ‰Xðinf°ñ{Ô‡X†êí  Í!·nà&5ÂÇàÓQ6>ŽA•†é‰Ò™fªð²ÇæzIÜçS›Ø‘B4¥sÁC?ôý&.öK]R–é[¸b`ç‰ÁÿÖÔ ¥” ËÁÞn_Z(äúÿ4)ü‘~ñdÁ]ÎÿÍÜ]O£:+ú%™¶ùí2"¹7álZ¸.8œújpsê³ 9åÏÉÕÀò¨¼1õ‚¼]y.ýNâ|šõ¶’IÏwI¿ÝZo“Q£L„ë7õ¼*SשH-~5­i`ø­!Y–$‘¥“ÙböHr:RØÛÃ2, xÁ¼×íAžI¦¬;Ñ ©&î ¦kÔà$}HwȵP|(6£c“Lnz0û/³_ÆÛr0w·ì\;É^+ÞÞmoJ»ƒä¨¸–°$Št³·4ÚŽ¨¦ƒÿ!ÞÇͰ ñÁ:؈§¿Â=¢TÀ}@óø¿†ö—ŸFݹ tÃë0ì0½À_¨÷XOØÇ?®ˆ—*h¾îŸxŸð}À eo!,·"¢^€€6üVù@Ç7Ö‘|²‚ÔÕO#èú@æ½r€>ü_65 ^îÁ÷ni›؆óL<0y`Ç>€¿˜Æoß…k³×fï(À>ÄÃ8çÜïæoÔPC 5ÔPC 5ÔPC 5Ôp? LùÞêB-Æ…ÐÂ}©d£ ï•« ÎrE#Â@ % ·F¢1h‹'äöHu¦3]Ý= ¨Øi`ÓàÐp~dó–­£cãÛ&¶O>¸cçÔô®Ý{fîÿòÿGâo¼Ðü«&ðB+Ä¡2ÅïÏÃ8LÁn˜S¥öòBb W[û`3L”[gK¥Òo?ëW]÷ÏN¸Ä¥ÿmì¯ÎBpÑ¡jsh{ª¶-…2Ëé±&†ßT±Y0ÃÙªM°ÇóU›CûU[ cïïëŠN.ž?>:ÿØÄ#‡gŒoߘ?1{hanëä× ý¸Xý0€Ë9Q˜„8 ópFñù.â#Xž…#ؾKópNÂ!¬9ö¹FnDÂN`éöšƒ­ðùÞû¿M™!WáO¸W‚™°àÎzi;cx Wž¥2ç±EÇ¡EKwsØÏÚpø½ôÏÛ!‡ }Ë §ttšwt r¼º+ØåÙ­§ƒÕg?Ö‰ºrï—<…ŸÐü¥+­ŸhÖžÔýE—À"Ý'å™ÿ>Úò$ endstream endobj 329 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 98 /FontBBox [ -547 -307 1206 1032 ] /FontName /BABGLH+TimesNewRomanPS-BoldItalicMT /ItalicAngle -15 /StemV 133 /FontFile2 330 0 R >> endobj 330 0 obj << /Filter /FlateDecode /Length 13494 /Length1 23244 >> stream H‰\U T”×þfîÿï.£ êâ¢>PŒŠÊâ+5D”E| ¨Ô(ÚœHˆ‡úФø &Zc­¤š¸4ViJ5k‹4Qj}?ª‰&ƦdÿONÒs÷̽ÿÌ™o ^†BÚs“ûGçLNßLsÈéÄY΢3õ¥&à…2€~?ki±ÕÒxO¾]ÌesŠò hζ×K6 ŸÌ[°|Ε SûöoëÅüÙÎÜc3·´Ê}•¢3$_|[¼€ödš_P¼lçk!ͲŸ"˵ p–E3J€”3²?Pà\VdÙæó’臊¼u¡³`özß‘ïécÄŸ.)6Ä’ì{·}/Z<»(ã=€îàu_ß ^GOYÁªA€q]Ö-YwÝcV}>lîyÆ5ÕI´[Ÿ®axDVÌÄT|‰hã´pã°Ÿâá…oÉ» @SÀè‚ZœCÀf|„Ëø1ÆèÈ‘Šw(•ÒѱX-:6Äc†c"nÊ=#É[îZD·ñ(Å›8Ž&øË÷5IoBo¡z­Üœ+§)“VG&‰·Ê0ÐQø'S±–,÷-†Xöú3†Šx‹%Ö˜Ž¹(A5ê©—ñPr¼79B‚ |£‘vÂØo1>G¤x‹8Ñž*ìF-æ•h¬Ã(9›‰7ð|DÞtIõP&™È}y7–¹YÃsÔŸT:ùceñn4ºoKjhšÚ$ê;ó+*kµ,ì$‡<Õ8àþXÕã®:EKÔ¿©÷Ò6ÉŒ² öµ’­Rg“ÕªÖ[LT_ã$ÕJ©ÛÑКÒZƒ2ÞÓú-—? <""c$ùÊ—¦"È]hÔs* ä¯ÝËÝZ£Õ»­í[ª¯Ì“ ì”é2L3¤ÓWK—daœL–Z¬6ŽI?,–Ù–!/RÅÈk4RæQ‰Lžó2íÍ2‘oÈœª£yhæbd¶YÅ^™¥iúnlL5%!>näˆØáÆ>3xPôÀýûEEFôíÓ;ÜjëbíÙ£{pP·®]ü;wz¦£_‡öí|}¼½,f“®)&D&Ù’³­.{¶K³ÛÆŒ‰jÛÛœràüÙA¶Ë*GÉ¿”qY³=bÖ_J&ˆäœÿ“LøQ2á'Iò³ŽÀˆ¨Hk’Íê:é°YkiÚ¤tá×;lVW³‡Ÿàá7zøv‡„ˆ‚5)0ßauQ¶5É•¼4MR¶C®«ññN´%ÎöŽŠD·°>¹lE5G†’†×0,íÄ)W7›#ÉÕÕæhóÀ¥Â’œ¹®´IéIŽ Œ¨H%βå¸`íêáA¢ÇŒË”è2{ÌXç¶EƒµÖšÈÃkÖÕú!';Â7ז뜞îRÎŒ6#Ä®ÃPr+ð¬W pTÕ>ï½ûÞ&Êφ’„Èf–„ŸQ~„ÄB–„ì Á’„› CHaÐPZ+E4­?0KÒP ­‚ 3–I¬n3©2Öq"ÅâØŽ2Ô"-¶áÇöö;wßÛìÚb§™|9÷žsï}çžûÝsnz»X|pI`C¢5Ó•{ÐÃÝPhƒ'üRE њͫ«±æê9þ`ÈO7r‡‡#ì>o%¶©:o)k‚+<áTo±wyhEç‘ SåÚì½¾vùGÊ(õ„ªÞìpQ¦·zñÌá­·Q¨ríëé>Oz²%\«{P,š­Ú~ýuq›j©áÜ*«Œ‡Sc¼÷‚aÏR< x±‘©ü§n*…–NÅ0üTk˜®Å1<N- †Ü…лy~ØÌq{=¡‹„c÷žÿ2Y³ØÖX9î‹ÄM&Gœ_°;íp^^xìXæ…« §«þäüqDôO½õnÂGåL«.˜ggó©nŠøh :ᆊ@¬ï¡%™{É7>¯:¬ÙÒéXÒæ±¥Á±Ä§½ ï>âÿÒÂ)¹ñßî¡CJ—†µ¡ÿÁ\³—Íõ–UÔ<¥¡ Û²ª¤^Ì>5n³[á!%#S·[z¦¡¬`âÂø`îú…E~-ÅäÚˆ+TTÍ㻃³b«oÉξÉIyg)Ñ;Ív3\˜—Ü¿'©Ÿä^¿‡E®^VU Ý’dó#í„B~¯Ç †GdïÇí µŒ¡úÒ s¢ùæ¦Ì°¿±›X®‚­:·zµ­>mãÜš@»ÿçl¬ ìÅ¢$X\Ý:¶@»‡È§´z\Ë=÷ÇÁô½zŠ2e¶ûˆ”U(…ê/h¤t)ŽN£¥=¦s+~òI½KÉ•-¥©úÕ=ÑÔ—ñªr%½*^± ´áªâÛ0²hµX­UàŸ²r`ŽÕLŸX´HÇ{Uo¦ôf™ý%ñ3*× Uª™úCžÑ d ô«;€Ç¾¬¾f 0§Ðx8ˆÞ°öÈ+æ|Ù¼gΧgÌc² íÚd£ŸZ²ÃÈ’Aòôâ3ÙáÊ’û1®öUèa Û!±F~(>£Ýèwbþ?\YÔýSÐñ¼w°·õz 2 ßÿÖœ ŸºáÇh`ˆÑDwCŽÌ×›£üÍçÅJÇœ1zA´ ¶~hߎØÜ}ú0Æ‚…zá§„}l~¬Q `ßm4Ilçôã´@;B;õãr¾?ÊÞw“Ú7ïÙÞûoût°n!pW"ðÍüDàûCc¾õÁ*NQ«1‘öA®î…¯Ÿë'¨ò÷‚¢»ÍÒCŒ’×ôfm bÕ.ji‚« >£yæ>¼kévÖ)äý½|R\»»W*å_'m¾ö•œó9ï:’ùÌ÷ër?ä·¸6 ?GT}@ŽV@Ïټ̰Jå~1—†Åù™ÄSð,ÆO ^îÄšÂæ£ÿò(ËXm÷b÷ÔÇõ‚s9ïßιœ#9Ïáñ}eï|­¹a¹ÊÃ'¨Æ¾×ÀQØÆÙy„ó°ŸcmM!Ÿk ΫùÌSäÃ8Ÿ5‹¦cßã5UÈo¾ON-å8ëãuÔ/?àxÀÎ㎈nÔ=¾Ÿðë§µŒ.™Wä_U^áZŠ{¨î r­:‡sð9]VUTdl@>å>Š*T-šF™ØßVÄ÷'\mœ»a!ƒÆfÔIÌ5"²Â ÐZó8݃9cÕzÃ’u쿵‰¶p.0‹©Æ>«ˆó.pÍ”]ïËk=m1Wa›é]ìå ŠAšüÇAÍý¡Lãµ\Ù Ë÷xŒÇsÖË ŽQb,˜ÃêMÁkž ­*X«‡.¥êò ÃJ£Ó®·äÇæ`yÊœL))käëæ“òGª^Gi†±•&éÝòœq…î`Þ»vÈËÆy’y¤0ï¦LœÓ:¹C¬¶ßê}!-¾?üÞ`Ž˜oÆÞjÎDZŠwÚ} 1…¾m6Qµ±¨”gÍ“Xo„Šw¾OÃŒyÚ¨T÷EÆÞ2üNˆ¶áÜ_DNç;Æ>àEhO3Žà^uSrÉ W¥üXDÃÁ¹É±ú%ÁSYj÷Û8ƒö~lŒ¦Ã^…úpí…hO×;ŒÇôšÂï@1R¾m”¯¦\g~ð Ú“L‰â•}XàÍí–©rÑÿžÈ Ávž©Ãx¨£€%×ù[ÈϬÛsÀº×÷£ý€ã½z0ÕÞ‰9OaFÈ,[ÿkŒGûÚv´ç@Þ ¹(±1ºû€þ1Ùs†ùyÝ»äÿ/o\nRÚõgLLʯ¯«)ßD–Ý”LªAÎùÿ7éÔ–¾Ò‰ƒSGüùw5/I‚(‰àÜÊùó*ç6ΧœO©ê8ç5®xÓC†‘ÇNü‹øj Š"»Â÷Ñ3Ý<Úy€0,a.½ ‚/˜†•œq³;¶¸è*è¢F#ƨÁZÑ­ZÖ5 ÖÆhÕ&Ùd­’}E­-†Vdy¸I%jvó#[µ1F*EU~$ÄM­ñGV!çÞ!k¥*?ò/=s¾sï9ß=çôéî[ÝâÛ ö3¾—òýÌòîØ÷ Ï^è3ùw]ƒë_ ¥ÂCÝ22"ÍOÒÉK‘H¥í-Ú,^Z9ÂæSK*Çè$¼!†q3+WxÆÌÆÆ…¿&9¸´¬´òÄC÷A£ã¨8¹êRqYågq:>„ÏXÏÈddþUrÃ\îÓã䯥¯ø*í¡\Ȱ d?E6À‚b€Ób´ðm1*li"7ô‹#DõDM°R7Þg—Ù$»Íf˜e-û:ëbße’Ä2™‡U±0³Ì°Œô³QöF§wäõÄÙÄ@b"!% ãŽA^7Îc†dn©ÛBºI7%6Чè=zŸÎSé4í£t‚JMt+í ÝTê#d‚L)阢RÒqšJŒ–ÓÚD¥î›¶#Œ:nØ$°A`¹@&Ð&p^à}Ž´ÝÔ¶‡Üåkû@îPèÅ]èÅ]Ô!f}ä&ØoBl€ ¤d+ˆDîÂï&ün@×21|¸ L‚²³áÎs:=ä ½øj@*~F`GÒŽfsÄ]ÃÇÔÏ©‡Ž©!•T#8\)Gü5z¶G=ïQèQ_ó¨u³G]åQŸöðEÏ!7ÐqÄ×¾'ð;zž[}èVÿîVÿäVïºÕÝêA·ºß­ît«Ínu”d¢ðÞÖÓêµ4 æÔ8Y|Ù¶¡”Q²…!p½iä±8©3 *`ËØ5R‰ ½%e&{ƒ…RH b¸æ^Ð@/v•c†9Ãû„Ý|_—gúf Z®é Ê2µRÇ¿0 7¨ ÓxÔ¸i$Ø5<šÌ„‡M¶ "â+ñ$ÌMäç‘ð òã·@ÇLÿ(¬0ýýPþïC»ÀüsÐ@Ÿ7µpÿÔÔªA½ojAPïšÚHñ¼-ðP/óÄ×ðadˆÈ‡x¡Åø`òÜp'dÞ zÿBÆÐܾ'yNx·é;ÊS·#MØw  ÐÏšÆÓ¼ò•0æ¼ ò‘~ÐuÈ'浦¯ Šñ›Zd÷Áç+·VšÁ~˜2Hz¦9Ée›Ú³ fu”b‡AYMÖÊbú€BÃ@ù<­F°®`=ƒÝ÷•°¿AðYm5›†sºgÄ16Ù€\8Äî°û½ ^aŸúO²O´8Þ`²ß…JB}dŒòZÑ-¬›çØÍ~9Mök_¤±}AvÝWÃÆai¡ÉFƒ£ '_Âû€|!Žõá½ì=-ÁÞ­Žã·t{Ní'ÐúïUÏÀf— óQ­†uóåWØË¾Õì0g^aß6ŠØ·  ‹ÚçÙí$Ûækf›‚£ü Èp€m„r<Ä^„slJf[í?Ç¢ÕÙdÏã„ùÕ`‚E´el%Ä+Ô³X£ÑÌBÐ Ýw’Õú÷²2­‚•Àjó0óB;xQÅp“ñJLöbàÙˆdü Èq½Lþ£|Q>'oWÈUr…¼T^"Êùr¦âTìÊ"%]IUŪH Q’ŸŸÖKl4™V;WV‰£$Æv¬ô<ê#½°Y÷¢ Ë Q]× x£qy¾9VãÆäµ›[1þ~+ŽÆ&w èöüØÃuqœú¦˜¥ ÇœQ]ßèrŒœ€»b}KÏó=¹1çÊ–Ø­j{Når]ßsªµCøN”u¨ÁÕà\á¨]þ/°m½O—÷?—7/ö£èº–ØÏòZc•|0Ÿ×­Ë©e„œ ½‘ð9ÎUkËö‘fnÇžp+Ð* ïs˜³O$iÛñ>Nƒ{n» ­4ØEŽ ¶‡ã‚F¶ Æi`ßÂip•“<¿‡êÂ)o"¿àù•7OÂÉ´:ª‹„ëêË=u‘TwO‹¤éœ4 Åä”AgƒA§p/âÖ’îµI÷Zá®}â®NºÛ’î6p{ÿ/ÇÎÆÿ™Ù½®G×¶ *¨±uåKIeß¿BÜIŽóÏôä^ŹôS”æm¥4ÆÒ QCƒËk¯Çåјºžßnó±ÞÆ/ÇÖô˜¨2Ô\¯ä^•¾(¢¤ƒY]p•†JCÜO w-³mÁåz%¨Aî‹ .;˜ÛÙ†?Wpty#á®®ƒ âÐóÎNoĵ|¤[Ð(_š„Ía×ÜzIJÙQ“ž™)•*UÅJ r¤dàò Œc¸HÁ;¡˜Ü©§Y7nMëH#i9ŽFð^H ÛŒÙYûŒýqÛ \ gmíò ܆e«l%ŽÌl9ªþ€ŸqžÞrf¨É1÷ù¦oÞî³ì ´¿ý¸îŸ®×áoàöoýu>¤ð|ÎÜR59PT·åJ)A‰¦àT”‘êH…Bd”Š;¯¤ãò¨/N¶Ë›Òqú©Œ«8?ãxÐ6 µØ¡¦'õЀßï 8««Šȑɋû³³³ïbu¸ÉŽÕM»Û7w$ÐüK¼ùWO_ø°vîÇsg§nýET¯3­äd)\›=™¯!h ‰Ó“C4Gêí=0fg ]ùìòŠ MÖÖU+“¥·ÿ®ìRËj”ߠإ÷:sòƒO—P¯ž’^U^¡g,®Bº-³Ê]T\¼Ä™‘çD®¼<”ý/ÆË5ƉëŠãsïØ_3Þy®×c¯3~ ^³^?Yƒ „W`Y`éf—ÆA<—ðÞ4)%é—„%! 4•h«µ„ !@t¡qD(D´j!(•ÚT­”’¦RUA…£(¢I)k»gÖ€Ô~iµö¹_Kë3¿óÿŸÄe-jóE|Ù–LhѨ_’y¹Ì;J’$Ç#máeZ„ˆú"D„àH¤ÀmV©;*Kl¢Ïy&Øg)ûRiÂrÌrÙBZ<)I’ºmùïÉHª6¿x×/%¥’DJîJ>§CaÁùª¢÷ݾ{ÛX°W¦Ò—¬Ôt¶N@>ÇÍ]HןgÜ…¼w[Aw d‚­!øÂT‡#2è® ¹†^F›·&œîR´ £ƒ-Õæ•Ÿ2OµyçS0Î £@JE·X¨ÖäRÙlŽËfÒZÍÂ0PIŠ=)cGC3±<Ñ·aÇÐÙ ï¿~øóÆÕú 犺ò¥Ú»Í<ðæêµ+rçN§Úÿ|fîfóN>8´ðÈšXæÄö‘kÕWZOÎùŽê2Õ?Â+.,]‹qý'õwð½×{:fP÷<ó=xj½ØRÞÙ¦Z5uPÌ™â(†ã°Ð5}šžHvé™d6ž›eÎ[³tV˜!çs3 ÅÞEÔz0L ËCÞUÚªìæÄ.q\<æ=¢¼‘8‰ßqýˆ9é>é=®üØw"q²÷²û²÷¼rÞwÝý+ñ—ÊŸØSm~<Á´¥]0–gÁ¤ó ï#íÈŽi¹™…Ä n…UÂ>EIf§+I"ß« íR¯Ø¡x»´„Ò•ÍåªäÆrFÕx5—Wµ\>—Íû)+OQVJËæòæ™IožR­ª—€þ‚RU-L‡iA¤#ì‹§i¿ ò¢Aœ ˆÉ®.Eñb–a u³ ŨÈÒU< Z) gŠ´ EÛøòMF%¢šÞ"©ÈÂ_+Ž» Ž>îP(kÑZÔ †x»¥‚7œu+|:n…‰qì?ûâ9 žkø‚ œÛ\i+ ´w؃ pIL‘yAvŽBµùeY‚‰]¶3%Âø­ØÈ-•³^„$-/JT 7 ?€3 ‚†¢P$¡{°k ƒ9Q”L·êì3òþÇä9ƒöú6{ÿҮοFJCvü‚½Lx¹À“h͈ƒÕ3vÔ´÷ªÝ/Ì®üáí¥ƒóTs!žX‹>j¸ÔxRU¬-%…j0Eª*çIv7ÞG­æÚ½¾iðè̶/=øAÃñõ*0½æE‚ >†cèÆD;bÕæ˯C¹á¤3Éq‘*:áið=BFÌ«}x!µØ¹˜égçç ‹Ôb ~Žû„úA|_ ¼íÜ5;œíB»h¢íNZ4‘”I!ŽU¸Sñ»¬NÅåíò©aYâ9+eú£Ñ˜*CSè%^D²gµú9žç8#d êxžo1Æ«áðÔ|]2¶dYBþh•|³$HŒ ì÷ù@"†qYe.å9É/'å~™”YëE¸6– ®yågmö’ŸC\ç/ ZXЉªèÜ»I±$ö‹¤X%§—é8'É'ÇmU9×b m ”kžöÚ¾:òÈ0«§ñ!ÇX®¹ -š FÇM0“u³1u=àv `ó”fÞÀ¹Tø(·À-ÛíèZºÈ_’ÌD¥…mþà–CÐöĨ$ ‘èá Ì!M åHj=~ }âX»1ü/¹8D×¿éØ¶)Üœüglo£Îΰ5Êôr}I©ñ¹ýó’É'ÉãêÊ}“GWDÕVÕ1rÇý·L»'Çrjj& GúóÏ’ïòªÐ{lk~f¾lÞ ½C€+Û•¸Í‘öªé‹ »# W”åvز ñ›ðnç¸ÏìÎXIO† ¥>X8^ ·"S{ÐßW‡½ OGÚË´$§žÐÞ­†¿~¥ë£}·ÁgGøQª•jFFŒÊ45-“n#zR†o”… º0†Tô¤rY0| —_ßÐ@g;vs¬ñók?8Û¿c÷¾m›¶÷ýðƒ‘Îý·¶Š®"fß§£õùÌ7Ì3 ûï5VÚûü¢ïâîO^ƒî¬yÜ@ƒJòA-qåu1hÅ3…PGÈ›w÷ó±h‘wap„Ú$ì^ŽÒG…Óôiá=úCú&ÍþX Y]´b¥E¡†WäR¬L,â…ð31¨Ã3ð.¹Dn$ÂV ÔB*  µäŠGîóç­M¬”ÐoF~Rú‰{Ý“Z ât •I ߪE‡_d=YÛ‹ñ*ŽMd.}m4ä5·¯ÖÒ Œ­­pçn­‚ØJín`ïTîB"aÚªùótw{7~Pì„QídH‹@!§²Ûj‹BÁ0¬©×ãí¬à?ÛɆuÎtj4`÷Æ._úÜòïïxö櫃ûz0ìÑœ+®_÷ÒâÆ?zÔϯ<ñÚ@Péò›·4Ò[g?µq×âÇþÖ‰5Ûªz6ø7ÛåÛÄ}Çñÿßç×ù?Îö\¿Îg;wgì`çÇv| y§„š¸´°BDÛ”¬¬a¤ˆÒñk:©ŠÐ‚”%ÚDF;0£[5­Ò¶J“26©bS&EÕÖ6R«Ehtàì¶ÓÂ4YöÝù%ûÿù¿Û#¯ïè< µûº¦îi‡¬ùÐÚ2vû`AÒÒ B„ijc§ÿ:£Ä<Òó~.6¨Ot€N¸%0L ëOÚNŠçÙ·ãÄyלÛ&ü6%Kú½½FiÔéP¹™J%O²V’dÙ<ö³ë@͵y5›òX³D:FBBŒYbMì/á(PÂkÀȵ_ýÜ’¼JB2¯è('Ȩ~á„N¦–¤ÉZ³Ï^î·«¹Ñb!u"§q³Nä4×è(kèή¢ëó•+Ë¥ÚbÏVŽÿ3g”f—‘BJú°ßCµ˜L‚¢: lë2´Q…˜F]vŸ-óBt TŠgd‘¢è„&”å ^7*4 ÝùÀŠ™q‹l¥õr.™öØÇFê[†¶ýäûŸ«m2ù{¤ÛíÝ|‘±…76Ö<½õpoQ£'=[Éc‡Ráàþž{£S»ÎÂ/5ô^èñ;\õ…7N×Dâ#ï#UkËÊÒ‹Ò°Všª²V¥2ñ÷ãù:Uú‰P8D˜e³\–oÈÑØapÂvŒ;ÆŸLJOr“ü[uWàœeš›æçêòð†â¦e[ào¦~gùØô©qÅÄèYˆ§!ãC1¡ÖU¤Ã-4±ø¦.è nã9Žc1x–´²²±,É-ò‚@t³[S+§hZ'¿–ÕI:…n¶‚ 32ôÂ÷ñŠ%¼e·K°0þfR™+Ür›p3ÅÖøÏÎ¥*]G†Z;÷ÿé¥'ƒ™`Ç¿Ë`ÓÁöÂñ¨Çö^ôÙ¦ïǪ‘ÿ\¦“Ù¹År/[xþ¯íâø·ß†¾z=Âý¡Ý‡3¿—©õJ…#Ç£=Oƒˆw5Òë)¤W'O¥tÚ=èý9¤$*4Vƒ©Ý0 a´ ÓÆð“Z¡Uखĕ¸Vÿ„OñÄEe ±@ÏæïÝ,¨¸Í>£Ê£ÍcÓÚE\"*âøgzô%É£¤ŠÁž£ös Á(ǹך5£>dÍÞ6Â%#42UÌ~9ÔWGåìè’]r}N¤Ð; è#Åyƒ’óMþÊkè³|Iž£«<2Ô¤J{$[¹B&s‘¹Zɤª£È4G!úÖ oôGú›Ur:X•à¨a>ÐÞr6ç:øññÙ£·aû•íý\ÝÂö—w<›krÛ£é࡮󩦾 g^™žm¿íδ7?}Ðeå*Â{¦žÍã`kç -JZç8hÛ YþŸKõD²u„¤>U¥À·êzží"5£YÚ®D¿‚¢4$å¡TÍL§žËàͦ ÀTx*›ÙšQd2L5–‡û$/œ¨Ù\­aˆÎ”ÓØÜÝÍÛ,V›Í²%速eБ‡v)ØX§’×K%¯—QåV¡3Õ.•ʃ–Tk*¥ªrû‹m°íL#·4Á´ä ÖÕEƒo¯±à„çš1ì+ÈÅ4“‡ªu¥Éz‚å«b¹`v¨óœöìùõ+îN¡Ñ¬7VÆþаsð“/ÿu°÷À»Û#»†?z£¯Ñ7Sí{’\•+¹],ÝÕ|êÜ‘—öþ° ÛýBªfð!\볌dMرmGnu×ugö…|Î@Õæç7o¸´Û¢³zª?Ù[t&¾Ü-ˆö±ý›†3bKlk«JòÕøŒô{Ñ[Ïmóìñ¼ª<©Uk¼°Ÿëã»°^“Ýo:BÞ$HE²±l¼´{Z¹f¡#ü>ìaƽßñ$ÎxÆŽÆ/ç=½“±Éø˜…óÞyß\ørâ†a!¶_J„4÷jÑhâ XHh6†!Âñ<š³o6èìì‹ ¨ÅÌâ\,6Á ÑÅXy§¸\ €¬ù2b‹ñ‰š1µFàut––h-ï.ƒyáCŒ+"˜ ³®_`(æá5©"òwÁ!ºhDÝ·nbíåz)ëºkí Þ”.÷ËqÓŠPT3µÛÒ$ÏKï @­åª«%ã=a(™ïhîey;A”•bIÎØ×FüHÔZÊÞ«Æ0¢ó`Ù°âRáÁ‰ÌàëéX»ý5³×ë=~Üì§¹¾Åþ]½™ðgÛùoØfµVŠØ¥ypøÃ–çZ»$±§Ð_kÁ:GÂà¤~°_Š =p^°æôáÂýÂ_”ûÛ܃ ¥ß†×–{Ð> ßþé=½Îœ¬È¯Ý“jLæzŒ¶Ð åZ݇ܯqçõóúijš¾Ê]wå2Ф‘rè°»“8Äq£“^œ”½“¤jc ƼF½ž÷:­^™–×ëTß(‹Á‰šj%j’š¦”T^ÁK6êagUÈkêF%ˆvV}‡£üzç/õšÕ•, Æÿ—€eYËj9ëESI²²H-ß,?­x|íQîý±¾¯?“îï;ü‘™Ô™Íá¬oj¾¡Ë|Æðm°W5ÒŸÉôË÷Büa2c!,FöYká~{-›„kf( %ú‡Ò&{+¬—¦ÈLÕ«JÅO/×-b„‡¢âK¢’µ'ô­ú–ª¡MC±½ÚsÚ Âí¼pð$V(íVûÙ¯úØ&Î3þܽŸ'¾³çîŸíØ1NlâÇvìàk€|ò¾ $+ ÂWG?€…–AûÈ„Z¤­jm‰ÔNÂÇ2@£Zë4iª”Iø££@'Š´u›VÅÙs>éX;:µÿùìß½Ïݽwö=Ïû{žßC—P>; ™{.UF•A@ÞT!{ <ªSeÙ@F„‚!õ0 úªt:Wí‹D€ 4J ÇF±åh)ªç 2âªLÉc$ X‚Uð½ÐhPŠÊBP£±b³çdçLbÜÕx¡²BU˜3™!>ˆx_„5šQ)‘ίÛw@¦ræMß<Ë™ç¹Æ°òph;͉r'Ÿ˜íL+[,žù"æ­Kµß£‡¼È’s…È|¯úò«¹D+¡¬+­+ Û„ÝŽC¯ZYRáyšð%³™ŽT•¦Ò)á C›…@aá=³¤÷ðzïÉ´ÙsȲºâÙ;û(Š®Dý}N§£Y~ŒŒ*1ÿü|£4.Ž‹‚É-•|ùlƒz‡AuѰr* Š¡Ë°Í0l8e¸bÐúbôEêȤé|³O4wŒ4y$È5Ok’"˜¡B-*äÔ'H• “éÚ µZÏóÿÄŒ4sŸ‘沯­­Ý{•Mj(@ÍRV_«­t>­ËýéŽL`‹1Õ™¥m-Äð<”‚쪵¶¼ÿ`ýºÞßžþÀ©ˆ8f/3Lý%WYá›,âÝñ'êñº5áj¿×U^G6Æßèšÿ“þÔÇ]5‰ç¾]åöåû|ô’ý¤yß,äNùç{7ïZÜ`±7bó¢LŒc ‹©e¡¥4—r»*½«É*©ôôöJϒݶ1ú=x¯8¿PÀ.Ø‹DAˆ‰R¤ú[¥bXW^E^2ä‘ âkr\ãœÛår·ÄâVÌ•DÞ2¬§Öë¯èÿ¬ŸÖ3úÚg€Q,ç£JèTºíº'½%JQØP§Ffòödçm~êvð6ÅßÆà ”½R.$õŠÕ;“jÉ®yéÅaƒd²V+üÄDg2ù0yQf!aÆ|uȤµLZ~‚é;gg IÃ)iKÚh´Ñ˜9/«Ž¬‰"…ãÓ¿˜É`–êLSêFÎDØGÉŠúäØÅuÕuH…ÓWZÊr…}5‘Oß²X‹#*D†§þ@ýl}¼.Þ]hÉ×åu^?öGúX‹Xä4Éõ¥ÖïýÌQ©¿‚œé›£ÖDÎØôMå—(³Çì´›vÉÍyøG‰\IW’j^¡²€›Ï/•–ÚëåU°Z\+­µ¯’{¡‡î!Ò€½ËÑ+ï¢w‘¤ìßs ïsG¤#ö!zˆËù©ýmrJº@_ ×à*¹&ø|‹¾EbòÀåš,E`—DlRZísbiÃ.j\9j:n¢MªLp²],@P´ˆÚJ±%MŠi¯3¦‹t‘êBõR2ŒQõ OYŒØ"9KEϼώØTŸ[œIoœUGÔQáœs"¶‹NƒM°9ªl 0?)\&Þ&ùI¤¬Ú&ÌÐv‘OuÚ§:Ãöçù;b®üf:ƒC*§¯>¤*EªXï !ñPÅyU®ÒKÚ^òîá-F³%Tç]x²mA«ýõ— OïaަþºsêrÌ‘o5yW>»ma´f--·Tìûª†é©ò#ä[n(QH A±ÆP#&ì‰Ðb±Á¿F¿Fì{üωƒ5§k8g+/cEʇ{Šõ”Q#ŠËÅI¬ÑÆùK=åM˜nNeEˆaʲ¥\¥žäÚ8:Éý˜âŽs§¹w9‡a9Ç.õPž1ú¾"•“á§Âtex ¼-<>Î Q[Ï&¼›´–kâ>¦¾ÛZrœèT3œÈ´Sè¾ä èt»…GT¦Å‚N«/ÝKY±–«<@e–¦ˆŽ¥Óý®&ÖÔ†J«÷¨ˆ öOÈ8ñqEF›þ;‡Ýbs¤zYëá3oo9Ø $–5Ï©«òàc1Þl(q”›mdášPYãÞû©»?¼Ó0Ïßàw…[–'æŸù05ñ»ÁíÅÖ¶êêEJ0Ÿ¯Ù«¬|ÚÛòx°}÷ÉAå"^û\ÿúA†þ7tË5èG5^0Æ!ïäÿSï#ð+Ì¿Ö`EØ®öÇ!þ Àî(º¡A>¨ÁÕö8Ü׳È"‹,²È"‹,²È"‹,²x Tºo-¢Z”¡ƒ'ÞŒy¸ãÿÛß#•®ˆ}îò€Æ&hi]¤,kJ5¿õä¿ýn áÞ‰ïFÀePõÐ ‹¡ : z ¶ÁØÏMOã¼Ò‡×—¦¯o€°õÁõé[_üÉxÿË60ý·/¡‡ÞÌsxqOeÞÀ‹ÍÖ¡Õ F˜1à™Ùøï5›Æw{%cœñFÆfо›±uÐ@UÔ?U߸¨)¸¼KÏÎ%=»Û¶tomë(¯ؼ¡yW÷æþ§/ÿz¦ ŸB4Â"h‚ ,Ç¿ºݽ–à~7´Ãw£sÕ@´ã¹ð lÆ3;¾Òj¸ð¾ ÐŒAêF«žÆð}µßÿ¦Ÿ¢Fü>…ZØ9-*(À,ü÷8ßc‡ ÉŒ€2,@ˆ£Ò˜„€Úá=ÉØƒ0ÝVr€Œ9ÃáÄ\ M9LÏÒ»6'÷ÄóÛ|åä«^,¿g ˆÞzr•Êïù{8—q8¹ ´6¼åo+ endstream endobj 331 0 obj << /Type /Encoding /Differences [ 1 /bullet ] >> endobj 332 0 obj << /Filter /FlateDecode /Length 208 >> stream H‰T½Â0 „÷>…GCÚÎUX:ð# ìiâV‘ˆ¹éз')ÄKöåÓ-öÍ¡!@\Ø©ô†4ãè&V† (AÖn©ÊJ"Âí<´ õª*×(ŽgØ´³íÜs—oAœY#`s+î8h'ïŸh‘äP× ±ÏÄþ(ýIZŒòŠ.ób5tG/²¤¡Ê‹ú]ô¿ö!ºþÝþ¾Ve^–u‰–à´É×[MÌ1Ö²î’(e0„ß‹xç“ezÙK€CÈi? endstream endobj 333 0 obj << /Type /Encoding /Differences [ 1 /square4 ] >> endobj 334 0 obj << /S /D >> endobj 335 0 obj << /Nums [ 0 334 0 R ] >> endobj 336 0 obj << /Type /Pages /Kids [ 357 0 R 1 0 R 13 0 R 59 0 R 73 0 R 78 0 R 83 0 R 86 0 R 89 0 R 92 0 R ] /Count 10 /Parent 337 0 R >> endobj 337 0 obj << /Type /Pages /Kids [ 336 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R ] /Count 70 >> endobj 338 0 obj << /Type /Pages /Kids [ 96 0 R 99 0 R 102 0 R 105 0 R 108 0 R 111 0 R 114 0 R 117 0 R 120 0 R 123 0 R ] /Count 10 /Parent 337 0 R >> endobj 339 0 obj << /Type /Pages /Kids [ 126 0 R 131 0 R 134 0 R 139 0 R 145 0 R 148 0 R 151 0 R 154 0 R 159 0 R 162 0 R ] /Count 10 /Parent 337 0 R >> endobj 340 0 obj << /Type /Pages /Kids [ 165 0 R 168 0 R 171 0 R 174 0 R 177 0 R 180 0 R 183 0 R 186 0 R 189 0 R 192 0 R ] /Count 10 /Parent 337 0 R >> endobj 341 0 obj << /Type /Pages /Kids [ 195 0 R 198 0 R 201 0 R 204 0 R 207 0 R 210 0 R 213 0 R 216 0 R 219 0 R 222 0 R ] /Count 10 /Parent 337 0 R >> endobj 342 0 obj << /Type /Pages /Kids [ 225 0 R 228 0 R 231 0 R 234 0 R 237 0 R 240 0 R 243 0 R 246 0 R 249 0 R 252 0 R ] /Count 10 /Parent 337 0 R >> endobj 343 0 obj << /Type /Pages /Kids [ 255 0 R 258 0 R 261 0 R 265 0 R 268 0 R 271 0 R 274 0 R 277 0 R 282 0 R 286 0 R ] /Count 10 /Parent 337 0 R >> endobj 344 0 obj << /Dt (D:20090210093019) /JTM (Distiller) >> endobj 345 0 obj /This endobj 346 0 obj << /CP (Distiller) /Fi 345 0 R >> endobj 347 0 obj << /R [ 600 600 ] >> endobj 348 0 obj << /JTF 0 /MB [ 0 0 595 842 ] /R 347 0 R /W [ 0 69 ] >> endobj 349 0 obj << /Fi [ 346 0 R ] /P [ 348 0 R ] >> endobj 350 0 obj << /Dm [ 595 842 595 842 ] >> endobj 351 0 obj << /Me 350 0 R >> endobj 352 0 obj << /D [ 349 0 R ] /MS 351 0 R /Type /JobTicketContents >> endobj 353 0 obj << /A [ 344 0 R ] /Cn [ 352 0 R ] /V 1.10001 >> endobj 354 0 obj << /CreationDate (D:20090210093019) /Producer (Acrobat Distiller 4.0 for Windows) /Creator (AdobePS5.dll Version 5.0.1) /Title (Microsoft Word - SDK_manual.doc) /ModDate (D:20090210093019+01'00') >> endobj xref 0 355 0000000000 65535 f 0000662609 00000 n 0000662831 00000 n 0000663000 00000 n 0000663182 00000 n 0000663375 00000 n 0000663540 00000 n 0000663707 00000 n 0000663883 00000 n 0000664054 00000 n 0000664224 00000 n 0000664409 00000 n 0000664586 00000 n 0000668955 00000 n 0000669428 00000 n 0000669586 00000 n 0000669744 00000 n 0000669902 00000 n 0000670060 00000 n 0000670218 00000 n 0000670376 00000 n 0000670534 00000 n 0000670693 00000 n 0000670852 00000 n 0000671011 00000 n 0000671170 00000 n 0000671329 00000 n 0000671488 00000 n 0000671647 00000 n 0000671806 00000 n 0000671965 00000 n 0000672124 00000 n 0000672283 00000 n 0000672442 00000 n 0000672601 00000 n 0000672760 00000 n 0000672919 00000 n 0000673078 00000 n 0000673237 00000 n 0000673397 00000 n 0000673557 00000 n 0000673716 00000 n 0000673875 00000 n 0000674034 00000 n 0000674193 00000 n 0000674352 00000 n 0000674511 00000 n 0000674670 00000 n 0000674829 00000 n 0000674988 00000 n 0000675147 00000 n 0000675306 00000 n 0000675465 00000 n 0000675624 00000 n 0000675783 00000 n 0000675942 00000 n 0000676101 00000 n 0000676259 00000 n 0000676423 00000 n 0000678628 00000 n 0000678874 00000 n 0000679033 00000 n 0000679192 00000 n 0000679351 00000 n 0000679510 00000 n 0000679669 00000 n 0000679828 00000 n 0000679987 00000 n 0000680146 00000 n 0000680305 00000 n 0000680464 00000 n 0000680623 00000 n 0000680787 00000 n 0000681859 00000 n 0000682034 00000 n 0000682213 00000 n 0000682390 00000 n 0000684030 00000 n 0000684104 00000 n 0000684286 00000 n 0000684445 00000 n 0000684605 00000 n 0000684794 00000 n 0000687505 00000 n 0000687660 00000 n 0000687836 00000 n 0000691636 00000 n 0000691791 00000 n 0000691968 00000 n 0000695031 00000 n 0000695186 00000 n 0000695337 00000 n 0000696882 00000 n 0000697057 00000 n 0000697216 00000 n 0000697393 00000 n 0000700037 00000 n 0000700192 00000 n 0000700369 00000 n 0000703160 00000 n 0000703317 00000 n 0000703482 00000 n 0000705781 00000 n 0000705939 00000 n 0000706143 00000 n 0000708848 00000 n 0000709006 00000 n 0000709185 00000 n 0000711757 00000 n 0000711915 00000 n 0000712119 00000 n 0000714920 00000 n 0000715078 00000 n 0000715257 00000 n 0000717627 00000 n 0000717785 00000 n 0000718004 00000 n 0000720470 00000 n 0000720628 00000 n 0000720830 00000 n 0000723786 00000 n 0000723944 00000 n 0000724134 00000 n 0000727310 00000 n 0000727468 00000 n 0000727658 00000 n 0000730724 00000 n 0000730911 00000 n 0000731092 00000 n 0000731253 00000 n 0000731482 00000 n 0000734045 00000 n 0000734203 00000 n 0000734420 00000 n 0000737146 00000 n 0000737333 00000 n 0000737492 00000 n 0000737653 00000 n 0000737831 00000 n 0000740249 00000 n 0000740444 00000 n 0000740624 00000 n 0000740785 00000 n 0000740944 00000 n 0000741162 00000 n 0000743527 00000 n 0000743685 00000 n 0000743901 00000 n 0000746868 00000 n 0000747026 00000 n 0000747177 00000 n 0000748842 00000 n 0000749000 00000 n 0000749164 00000 n 0000751143 00000 n 0000751330 00000 n 0000751491 00000 n 0000751652 00000 n 0000751856 00000 n 0000754834 00000 n 0000754992 00000 n 0000755170 00000 n 0000758231 00000 n 0000758389 00000 n 0000758567 00000 n 0000761280 00000 n 0000761438 00000 n 0000761590 00000 n 0000763479 00000 n 0000763637 00000 n 0000763827 00000 n 0000765536 00000 n 0000765694 00000 n 0000765871 00000 n 0000767926 00000 n 0000768084 00000 n 0000768262 00000 n 0000771289 00000 n 0000771447 00000 n 0000771637 00000 n 0000773904 00000 n 0000774062 00000 n 0000774240 00000 n 0000776557 00000 n 0000776715 00000 n 0000776921 00000 n 0000781407 00000 n 0000781565 00000 n 0000781813 00000 n 0000786561 00000 n 0000786719 00000 n 0000786929 00000 n 0000792390 00000 n 0000792548 00000 n 0000792783 00000 n 0000796461 00000 n 0000796619 00000 n 0000796840 00000 n 0000801332 00000 n 0000801490 00000 n 0000801725 00000 n 0000806655 00000 n 0000806813 00000 n 0000807034 00000 n 0000812240 00000 n 0000812398 00000 n 0000812633 00000 n 0000817215 00000 n 0000817373 00000 n 0000817608 00000 n 0000822380 00000 n 0000822538 00000 n 0000822773 00000 n 0000827901 00000 n 0000828059 00000 n 0000828307 00000 n 0000832898 00000 n 0000833056 00000 n 0000833291 00000 n 0000838265 00000 n 0000838423 00000 n 0000838618 00000 n 0000842862 00000 n 0000843020 00000 n 0000843241 00000 n 0000847274 00000 n 0000847432 00000 n 0000847653 00000 n 0000851761 00000 n 0000851919 00000 n 0000852154 00000 n 0000856101 00000 n 0000856259 00000 n 0000856478 00000 n 0000860567 00000 n 0000860725 00000 n 0000860959 00000 n 0000865243 00000 n 0000865401 00000 n 0000865622 00000 n 0000869324 00000 n 0000869482 00000 n 0000869717 00000 n 0000873349 00000 n 0000873507 00000 n 0000873754 00000 n 0000877787 00000 n 0000877945 00000 n 0000878153 00000 n 0000881313 00000 n 0000881471 00000 n 0000881693 00000 n 0000885437 00000 n 0000885595 00000 n 0000885817 00000 n 0000890019 00000 n 0000890177 00000 n 0000890385 00000 n 0000895806 00000 n 0000895964 00000 n 0000896172 00000 n 0000897662 00000 n 0000897841 00000 n 0000898002 00000 n 0000898194 00000 n 0000901056 00000 n 0000901214 00000 n 0000901380 00000 n 0000904519 00000 n 0000904677 00000 n 0000904843 00000 n 0000907995 00000 n 0000908153 00000 n 0000908306 00000 n 0000911536 00000 n 0000911694 00000 n 0000911903 00000 n 0000914576 00000 n 0000914763 00000 n 0000914972 00000 n 0000915180 00000 n 0000915358 00000 n 0000917429 00000 n 0000917608 00000 n 0000917769 00000 n 0000917961 00000 n 0000920232 00000 n 0000920390 00000 n 0000920542 00000 n 0000921570 00000 n 0000922134 00000 n 0000922702 00000 n 0000922891 00000 n 0000923582 00000 n 0000923773 00000 n 0000924565 00000 n 0000925007 00000 n 0000925178 00000 n 0000925687 00000 n 0000926229 00000 n 0000926721 00000 n 0000927164 00000 n 0000927674 00000 n 0000928085 00000 n 0000928698 00000 n 0000934755 00000 n 0000934977 00000 n 0000935320 00000 n 0000935759 00000 n 0000939588 00000 n 0000939804 00000 n 0000940010 00000 n 0000940219 00000 n 0000967754 00000 n 0000967970 00000 n 0000999359 00000 n 0000999576 00000 n 0001005221 00000 n 0001005439 00000 n 0001024003 00000 n 0001024229 00000 n 0001052045 00000 n 0001052264 00000 n 0001092092 00000 n 0001092308 00000 n 0001114914 00000 n 0001115138 00000 n 0001136028 00000 n 0001136256 00000 n 0001162904 00000 n 0001163138 00000 n 0001176724 00000 n 0001176794 00000 n 0001177077 00000 n 0001177148 00000 n 0001177180 00000 n 0001177226 00000 n 0001177375 00000 n 0001177492 00000 n 0001177649 00000 n 0001177808 00000 n 0001177967 00000 n 0001178126 00000 n 0001178285 00000 n 0001178444 00000 n 0001178509 00000 n 0001178533 00000 n 0001178587 00000 n 0001178628 00000 n 0001178707 00000 n 0001178765 00000 n 0001178815 00000 n 0001178853 00000 n 0001178933 00000 n 0001179003 00000 n trailer << /Size 355 /ID[<249cf20073e979528f301d5873119c5c><249cf20073e979528f301d5873119c5c>] >> startxref 173 %%EOF syncevolution-1.5/src/synthesis/doc/SySync_config_reference.doc0000644000373300037200000534200012424517753026561 0ustar00nightlyallusers00000000000000ÐÏࡱá>þÿ  Å þÿÿÿ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Á ø¿åÖbjbjààj ‚j‚jæÐþÿÿÿÿÿÿl^^^^^^^tÀ0žžžÈfüb&¼À0à~*-´IÞvL*w*w*wbxÞ]@ÖœÜñÐ ¯|šI~I~I~I~I~I~$ø€ ƒ¸m~-^¬ÿ^xbx¬ÿ¬ÿm~.^^*w*w4š~...¬ÿ‚^*w^*w¯|.¬ÿ¯|.ž.Ì ÃfÈ^^#z*w- €|9JÓqÊÀ0Þìž.‹ub#zŒ°~0à~ív6Ѓ.Ѓ#z.ÒH (¦^^^^Ù  HYPERLINK "http://www.synthesis.ch/"  XML Configuration Reference for Synthesis SyncML Server & Client 3.4 Products  HYPERLINK "http://www.syncml.org/"   © 2002-2009 by Synthesis AG This manual was written for Synthesis SyncML Engine Version 3.4.0.0 This manual and the Synthesis SyncML software (Server or Client) described in it are copyrighted, with all rights reserved. This manual and the Synthesis SyncML software may not be copied, except as otherwise provided in your software license or as expressly permitted in writing by Synthesis AG ( HYPERLINK "http://www.synthesis.ch/" http://www.synthesis.ch/). Synthesis SyncML products uses parts of the following software: expat - XML parser - HYPERLINK "http://sourceforge.net/projects/expat"http://sourceforge.net/projects/expat Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd SyncML toolkit - HYPERLINK "http://sourceforge.net/projects/syncml-ctoolkit/"http://sourceforge.net/projects/syncml-ctoolkit/ This product includes software developed by The SyncML Initiative. Copyright (c) 2000 Ericsson, IBM, Lotus, Matsushita Communications Industrial Co., LTD, Motorola, Nokia, Palm, Inc., Psion, Starfish Software. All rights reserved. zlib compression library - HYPERLINK "http://www.zlib.net/"http://www.zlib.net/ zlib software copyright © 1995-2004 Jean-loup Gailly and Mark Adler SQLite 3 database engine - HYPERLINK "http://www.sqlite.org/"http://www.sqlite.org/ PCRE Library -  HYPERLINK "http://www.pcre.org/license.txt" http://www.pcre.org/license.txt Copyright (c) 1997-2007 University of Cambridge Disclaimer Use of the Synthesis SyncML software and other software accompanying your license (the "Software") and its documentation is at your sole risk. The Software and its documentation (including this manual), and software maintainance by Synthesis AG, if applicable, are provided "AS IS" and without warranty of any kind and Synthesis AG EXPRESSLY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT. IN NO EVENT SHALL SYNTHESIS AG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Introduction All Synthesis AG SyncML products, clients as well as servers are based on our platform independent SyncML engine. This engine is configured using a single XML config file, which makes replicating or migration of client and server installations very simple. If you already have worked with a previous version of the Synthesis SyncML engine configuration, please refer to the (new) chapter " REF _Ref182744145 \h  \* MERGEFORMAT What's New?" on page  PAGEREF _Ref182744145 \h 12 of this manual. Please also consult the product-specific manuals (like Server Manual, Client Manual etc.) for product specific news and step-by-step migration guides. As both clients and servers share the same core engine, large sections of the configuration is equal or similar in server und clients, different platforms and versions. Therefore, this configuration reference covers all Synthesis SyncML products that are user-configurable with an XML configuration document. This includes all servers, command-line desktop clients and most versions of the Synthesis SyncML client engine that can be used to build custom clients with the client SDK. Only ready-to use, device specific versions such as the PalmOS and Windows Mobile clients have no XML configuration). In the description of a configuration option, the products for which the option is available is listed under the "Available" header line if it does not apply to all versions. Please note also that this document is a reference manual. It is useful to get an overview of the entire functionality available and of course to create and adapt configuration files. However, it is not a guide for creating new configurations from scratch. We recommend to always use one of the tested and commented sample configuration files included in the product distributions as a starting point. Note that this manual makes heavy use of cross references (references to related parts in the manual) - which are active links if this manual is viewed as a PDF document. You can just click on any of the cross-referenced chapter numbers to have the PDF viewer show the corresponding page of the manual. Using the "back" button in the PDF viewer, you can always jump back to the original page. Contents  TOC \o "2-9" \t "Überschrift 1;1;Überschrift 4;4" 1. Introduction  PAGEREF _Toc247362773 \h 3 Contents  PAGEREF _Toc247362774 \h 4 2. What's New?  PAGEREF _Toc247362775 \h 12 2.1 New in this manual  PAGEREF _Toc247362776 \h 12 2.2 New in SyncML Engine 3.2 and newer compared to 3.0  PAGEREF _Toc247362777 \h 12 2.2.1 General changes  PAGEREF _Toc247362778 \h 12 2.2.2 New Features  PAGEREF _Toc247362779 \h 13 2.2.3 How to migrate from 3.0 to 3.2 or newer (up to 3.4)  PAGEREF _Toc247362780 \h 14 3. Overview  PAGEREF _Toc247362781 \h 17 3.1 Basic Concepts  PAGEREF _Toc247362782 \h 17 3.2 Configuration Structure  PAGEREF _Toc247362783 \h 17 3.3 XML basics  PAGEREF _Toc247362784 \h 19 3.4 Synthesis Sync Server Config specific XML usage  PAGEREF _Toc247362785 \h 19 4. Configuration variables and conditional configuration  PAGEREF _Toc247362786 \h 21 4.1 Sources for values of config variable  PAGEREF _Toc247362787 \h 21 4.2 Using configuration variables  PAGEREF _Toc247362788 \h 21 4.3 "expand" attribute  PAGEREF _Toc247362789 \h 22 4.4 Predefined Configuration Variables  PAGEREF _Toc247362790 \h 22 4.5 "ifdef/ifndef/if" conditional attributes  PAGEREF _Toc247362791 \h 23 4.6 "platform" conditional attribute  PAGEREF _Toc247362792 \h 23 5. Time zone handling  PAGEREF _Toc247362793 \h 24 5.1 Timestamp representation  PAGEREF _Toc247362794 \h 24 5.2 Timezone contexts  PAGEREF _Toc247362795 \h 24 5.3 Time zone specifications  PAGEREF _Toc247362796 \h 26 6. Scripting Language  PAGEREF _Toc247362797 \h 27 6.1 What can be scripted?  PAGEREF _Toc247362798 \h 27 6.2 Embedding script source code in XML  PAGEREF _Toc247362799 \h 27 6.3 Comments  PAGEREF _Toc247362800 \h 28 6.4 Statements and Statement Blocks  PAGEREF _Toc247362801 \h 28 6.5 Identifiers  PAGEREF _Toc247362802 \h 28 6.6 Data types  PAGEREF _Toc247362803 \h 28 6.7 Constants/Literals  PAGEREF _Toc247362804 \h 28 6.8 Script contexts  PAGEREF _Toc247362805 \h 29 6.9 Variables  PAGEREF _Toc247362806 \h 29 6.9.1 Context Variables  PAGEREF _Toc247362807 \h 30 6.9.2 Local variables of a user-defined function  PAGEREF _Toc247362808 \h 30 6.9.3 Field variables  PAGEREF _Toc247362809 \h 30 6.9.4 Array variable references  PAGEREF _Toc247362810 \h 31 6.10 Expressions  PAGEREF _Toc247362811 \h 32 6.11 Flow control  PAGEREF _Toc247362812 \h 32 6.12 Macros  PAGEREF _Toc247362813 \h 33 6.12.1 Defining Macros  PAGEREF _Toc247362814 \h 33 6.12.2 Marco arguments  PAGEREF _Toc247362815 \h 34 6.12.3 Using Macros  PAGEREF _Toc247362816 \h 34 6.13 Functions  PAGEREF _Toc247362817 \h 35 6.13.1 User defined Functions  PAGEREF _Toc247362818 \h 35 6.13.2 Built-in Functions  PAGEREF _Toc247362819 \h 36 6.14 Global built-in Function Reference  PAGEREF _Toc247362820 \h 36 6.14.1 String functions  PAGEREF _Toc247362821 \h 37 6.14.2 Regular Expression functions  PAGEREF _Toc247362822 \h 38 6.14.3 Date and Time functions  PAGEREF _Toc247362823 \h 38 6.14.4 Time zone related functions  PAGEREF _Toc247362824 \h 41 6.14.5 Debug log functions  PAGEREF _Toc247362825 \h 42 6.14.6 Other functions  PAGEREF _Toc247362826 \h 43 6.15 Debugging scripts  PAGEREF _Toc247362827 \h 45 7. Filters  PAGEREF _Toc247362828 \h 47 7.1 Test and Make-Pass modes  PAGEREF _Toc247362829 \h 48 7.2 Basic filter syntax  PAGEREF _Toc247362830 \h 48 7.3 Identifiers in filters  PAGEREF _Toc247362831 \h 49 7.4 CGI Filter Syntax  PAGEREF _Toc247362832 \h 50 7.5 Special options in CGI filters passed with database path  PAGEREF _Toc247362833 \h 51 7.6 Filters in the configuration  PAGEREF _Toc247362834 \h 52 8. General Global Configuration Options  PAGEREF _Toc247362835 \h 53 8.1 , : License  PAGEREF _Toc247362836 \h 53 8.2 : concurrent sessions limit  PAGEREF _Toc247362837 \h 53 8.3 : max SyncML message size  PAGEREF _Toc247362838 \h 53 8.4 : maximum object size  PAGEREF _Toc247362839 \h 54 8.5 : text to identify config  PAGEREF _Toc247362840 \h 54 8.6 : text to identify product manufacturer  PAGEREF _Toc247362841 \h 54 8.7 : text to identify model/product name  PAGEREF _Toc247362842 \h 54 8.8 : define configuration variable  PAGEREF _Toc247362843 \h 55 8.9 : define configuration variable  PAGEREF _Toc247362844 \h 55 8.10 : Global scripting definitions  PAGEREF _Toc247362845 \h 55 8.10.1 : User-defined function  PAGEREF _Toc247362846 \h 55 8.10.2 : define macro  PAGEREF _Toc247362847 \h 56 8.10.3 : maximum loop execution time  PAGEREF _Toc247362848 \h 56 8.11 : Debug Option Section  PAGEREF _Toc247362849 \h 56 8.11.1 : Directory path for debug log files  PAGEREF _Toc247362850 \h 57 8.11.2 ,  PAGEREF _Toc247362851 \h 57 8.11.3 : select log file format  PAGEREF _Toc247362852 \h 59 8.11.4 : dynamic folding for HTML logs  PAGEREF _Toc247362853 \h 59 8.11.5 , : show timestamps in logs  PAGEREF _Toc247362854 \h 60 8.11.6 : show thread ID in logs  PAGEREF _Toc247362855 \h 60 8.11.7 : show timestamps in logs  PAGEREF _Toc247362856 \h 60 8.11.8 , : single file log option  PAGEREF _Toc247362857 \h 61 8.11.9 : append or overwrite existing session logs  PAGEREF _Toc247362858 \h 61 8.11.10 : select log file format  PAGEREF _Toc247362859 \h 61 8.11.11 : if and how to show log output from subthreads  PAGEREF _Toc247362860 \h 62 8.11.12 , : text to add at begin and end of logfiles  PAGEREF _Toc247362861 \h 62 8.11.13 : string to be used for indenting blocks  PAGEREF _Toc247362862 \h 63 8.11.14 : show traffic in XML  PAGEREF _Toc247362863 \h 63 8.11.15 : dump SyncML traffic to files  PAGEREF _Toc247362864 \h 64 8.11.16 : generate session logs  PAGEREF _Toc247362865 \h 64 8.11.17 : No longer supported; use instead  PAGEREF _Toc247362866 \h 65 8.11.18 : generate global log  PAGEREF _Toc247362867 \h 65 8.11.19 : send session logs to global logfile  PAGEREF _Toc247362868 \h 65 8.12 : set timestamp for config file  PAGEREF _Toc247362869 \h 65 8.13 : avoid PUT of devinf  PAGEREF _Toc247362870 \h 66 8.14 : override local system time zone  PAGEREF _Toc247362871 \h 66 8.15 : define custom time zone as VTIMEZONE  PAGEREF _Toc247362872 \h 66 9. : Transport Configuration Section  PAGEREF _Toc247362873 \h 68 9.1 : HTTP 1.1 connection  PAGEREF _Toc247362874 \h 68 9.2 : buffer last answer for retries  PAGEREF _Toc247362875 \h 69 9.3 : communication protocol  PAGEREF _Toc247362876 \h 69 9.4 : HTTP and OBEX/TCP server port number  PAGEREF _Toc247362877 \h 70 9.5 : listener IP address  PAGEREF _Toc247362878 \h 70 9.6 : OBEX service name  PAGEREF _Toc247362879 \h 70 9.7 : Max number of session threads per server process  PAGEREF _Toc247362880 \h 71 9.8 : Max sessions to be run by a process  PAGEREF _Toc247362881 \h 71 10. : Data Type Definitions  PAGEREF _Toc247362882 \h 72 10.1 : internal data field list  PAGEREF _Toc247362883 \h 73 10.2 : definition of an internal field  PAGEREF _Toc247362884 \h 73 10.3 : definition of a mime-dir profile  PAGEREF _Toc247362885 \h 75 10.3.1 : root profile definition  PAGEREF _Toc247362886 \h 76 10.3.2 : nested subprofile definition  PAGEREF _Toc247362887 \h 76 10.3.3 : property definition  PAGEREF _Toc247362888 \h 77 10.3.4 : property or parameter value storage  PAGEREF _Toc247362889 \h 79 10.3.5 : enumerated values  PAGEREF _Toc247362890 \h 81 10.3.6 : property parameter definition  PAGEREF _Toc247362891 \h 82 10.3.7 : control storage position and repetitions  PAGEREF _Toc247362892 \h 84 10.3.8 : VTIMEZONE generation mode  PAGEREF _Toc247362893 \h 87 10.3.9 : handling of floating timestamps  PAGEREF _Toc247362894 \h 87 10.4 : definition of a text format profile  PAGEREF _Toc247362895 \h 88 10.4.1 : mapping of text based formats to database fields  PAGEREF _Toc247362896 \h 88 10.4.2 : Number of lines to map  PAGEREF _Toc247362897 \h 88 10.4.3 : header lines  PAGEREF _Toc247362898 \h 89 10.4.4 : empty field handling  PAGEREF _Toc247362899 \h 89 10.4.5 : tagged header handling  PAGEREF _Toc247362900 \h 89 10.4.6 : type of text field  PAGEREF _Toc247362901 \h 89 10.4.7 RFC822 email body options  PAGEREF _Toc247362902 \h 90 10.5 : definition of a datatype  PAGEREF _Toc247362903 \h 91 10.5.1 : MIME-DIR profile, text profile or field list to use for datatype  PAGEREF _Toc247362904 \h 91 10.5.2 : vCard or vCalendar version  PAGEREF _Toc247362905 \h 92 10.5.3 , : MIME type and version  PAGEREF _Toc247362906 \h 92 10.5.4 : Enable/disable special compressed (non-standard) item format  PAGEREF _Toc247362907 \h 93 10.5.5 : Compression level for compression  PAGEREF _Toc247362908 \h 93 10.5.6 : Allow unencoded binary in content  PAGEREF _Toc247362909 \h 93 10.5.7 , : Unicode content  PAGEREF _Toc247362910 \h 94 10.5.8 : Initialisation of type-specific script context  PAGEREF _Toc247362911 \h 94 10.5.9 , : Custom pre- and postprocessing items  PAGEREF _Toc247362912 \h 95 10.5.10 , : Script-based data filtering  PAGEREF _Toc247362913 \h 95 10.5.11 : Custom processing for incoming items  PAGEREF _Toc247362914 \h 97 10.5.12 : Custom item comparison  PAGEREF _Toc247362915 \h 98 10.5.13 : Custom item merge  PAGEREF _Toc247362916 \h 99 10.5.14 : MIME-DIR conformance  PAGEREF _Toc247362917 \h 99 10.6 RRULE field block  PAGEREF _Toc247362918 \h 100 11. , : General Server and Client Settings  PAGEREF _Toc247362919 \h 101 11.1 ,: SyncML version support  PAGEREF _Toc247362920 \h 101 11.2 : Timeout for unfinished sessions  PAGEREF _Toc247362921 \h 102 11.3 : max time for request processing  PAGEREF _Toc247362922 \h 102 11.4 : artifical slow down  PAGEREF _Toc247362923 \h 102 11.5 : specify URL used to access the server  PAGEREF _Toc247362924 \h 103 11.6 ,: SyncML Authentication  PAGEREF _Toc247362925 \h 103 11.7 : MD5 nonce generation mode  PAGEREF _Toc247362926 \h 104 11.8 : constant nonce string  PAGEREF _Toc247362927 \h 104 11.9 , : RespURI configuration  PAGEREF _Toc247362928 \h 104 11.10 , : single user mode  PAGEREF _Toc247362929 \h 105 11.11 : Allow multi-threaded execution  PAGEREF _Toc247362930 \h 105 11.12 : Session init script  PAGEREF _Toc247362931 \h 105 11.13 : Session finish script  PAGEREF _Toc247362932 \h 106 11.14 , : Session level status code handling  PAGEREF _Toc247362933 \h 106 11.15 , : Creation of custom SyncML Get and Put commands  PAGEREF _Toc247362934 \h 106 11.16 : Custom handling of SyncML Get commands  PAGEREF _Toc247362935 \h 107 11.17 : Custom handling of SyncML Put/Result commands  PAGEREF _Toc247362936 \h 108 11.18 : SyncML command flow option  PAGEREF _Toc247362937 \h 108 11.19 : Add resending policy  PAGEREF _Toc247362938 \h 108 11.20 : LargeObject chunk size limit for testing  PAGEREF _Toc247362939 \h 109 11.21 : Handling of delete for non-existing items  PAGEREF _Toc247362940 \h 109 11.22 : Set user's default time zone  PAGEREF _Toc247362941 \h 109 11.23 : end date for allday events inclusive  PAGEREF _Toc247362942 \h 109 11.24 : error handling option  PAGEREF _Toc247362943 \h 110 11.25 : show field support details in device information  PAGEREF _Toc247362944 \h 110 11.26 : show size and type in SyncML 1.0 devInf  PAGEREF _Toc247362945 \h 110 11.27 : enumerate default property parameter's values as property names  PAGEREF _Toc247362946 \h 111 11.28 : Acceptance of server alerted sync types  PAGEREF _Toc247362947 \h 111 11.29 : Activity log text file  PAGEREF _Toc247362948 \h 111 11.30 : Activity log enable  PAGEREF _Toc247362949 \h 112 11.31 : Activity log format  PAGEREF _Toc247362950 \h 112 11.32 : Activity log header  PAGEREF _Toc247362951 \h 114 11.33 , : Pre- and post-login scripts  PAGEREF _Toc247362952 \h 114 11.34 : General Datastore settings  PAGEREF _Toc247362953 \h 115 11.34.1 : alternate name for this datastore  PAGEREF _Toc247362954 \h 116 11.34.2 : datastore type ID  PAGEREF _Toc247362955 \h 116 11.34.3 : decriptive name for a datastore  PAGEREF _Toc247362956 \h 117 11.34.4 : read-only datastore  PAGEREF _Toc247362957 \h 117 11.34.5 : delete overrides replace  PAGEREF _Toc247362958 \h 117 11.34.6 : try to update "deleted" items  PAGEREF _Toc247362959 \h 118 11.34.7 : transmit updates to remote  PAGEREF _Toc247362960 \h 118 11.34.8 : maximum number of data items per SyncML message  PAGEREF _Toc247362961 \h 118 11.34.9 : send localID (GUID) in all operations (not only adds).  PAGEREF _Toc247362962 \h 119 11.34.10 , , : sync conflict resolution strategy  PAGEREF _Toc247362963 \h 119 11.34.11 : datastore's supported types  PAGEREF _Toc247362964 \h 120 11.34.12 : use a datatype  PAGEREF _Toc247362965 \h 120 11.34.13 : enable SyncML DS 1.2 filtering  PAGEREF _Toc247362966 \h 121 11.34.14 : enable date range filtering  PAGEREF _Toc247362967 \h 121 11.34.15 : check incoming items  PAGEREF _Toc247362968 \h 121 11.34.16 : discard not accepted items silently  PAGEREF _Toc247362969 \h 122 11.34.17 : filter subset of datastore  PAGEREF _Toc247362970 \h 122 11.34.18 : filter invisible items  PAGEREF _Toc247362971 \h 122 11.34.19 : make item visible  PAGEREF _Toc247362972 \h 123 11.34.20 : make incoming items pass  PAGEREF _Toc247362973 \h 123 11.34.21 : script called before accessing database  PAGEREF _Toc247362974 \h 123 11.34.22 : script called after accessing database  PAGEREF _Toc247362975 \h 126 11.34.23 : script called when admin data (targets, maps) are read  PAGEREF _Toc247362976 \h 127 11.34.24 : script executed at end of sync  PAGEREF _Toc247362977 \h 127 11.34.25 : script called at sync alert  PAGEREF _Toc247362978 \h 127 11.34.26 : script called before sending sync alert  PAGEREF _Toc247362979 \h 128 11.34.27 : script to handle status codes for sent items  PAGEREF _Toc247362980 \h 128 11.34.28 : script to handle status codes for received items  PAGEREF _Toc247362981 \h 129 11.34.29 : re-send failing items in next session  PAGEREF _Toc247362982 \h 129 11.34.30 , : type of database timestamp  PAGEREF _Toc247362983 \h 130 11.34.31 : timezone for database timestamps  PAGEREF _Toc247362984 \h 130 11.34.32 : output data in user zone  PAGEREF _Toc247362985 \h 130 11.34.33 : character set to be used for database strings  PAGEREF _Toc247362986 \h 131 11.34.34 : encoding of line ends within database strings  PAGEREF _Toc247362987 \h 131 11.34.35 : always update all fields  PAGEREF _Toc247362988 \h 132 11.34.36 : Support for "one-way from remote sync"  PAGEREF _Toc247362989 \h 132 11.34.37 : How to determine "time of last sync"  PAGEREF _Toc247362990 \h 132 11.34.38 (or ): custom "time of last sync" identifier  PAGEREF _Toc247362991 \h 133 11.34.39 : support for resuming interrupted sync session  PAGEREF _Toc247362992 \h 133 11.34.40 : support for resuming half-transmitted data items after interrupted sync  PAGEREF _Toc247362993 \h 133 11.34.41 : mapping datatype's fields to database fields  PAGEREF _Toc247362994 \h 134 11.34.41.1 , : mapping a datatype field to a database field  PAGEREF _Toc247362995 \h 134 11.34.41.2 : auto-map internal to DB fields  PAGEREF _Toc247362996 \h 137 11.34.41.3 : initialize accessing database  PAGEREF _Toc247362997 \h 137 11.34.41.4 : post-process item read from database  PAGEREF _Toc247362998 \h 138 11.34.41.5 : prepare writing item to database  PAGEREF _Toc247362999 \h 139 11.34.41.6 : finalize written items  PAGEREF _Toc247363000 \h 140 11.34.41.7 : finish access to database  PAGEREF _Toc247363001 \h 141 11.35 : combined datastore definition  PAGEREF _Toc247363002 \h 141 11.35.1 : Include a datastore in a superdatastore  PAGEREF _Toc247363003 \h 142 11.35.2 : filter to direct incoming items  PAGEREF _Toc247363004 \h 142 11.35.3 : prefix for item ID  PAGEREF _Toc247363005 \h 142 11.36 : special rules for specific remotes  PAGEREF _Toc247363006 \h 143 11.36.1  PAGEREF _Toc247363007 \h 143 11.36.2 device identification tags for  PAGEREF _Toc247363008 \h 143 11.36.3  PAGEREF _Toc247363009 \h 144 11.36.4 : device has short fields  PAGEREF _Toc247363010 \h 144 11.36.5 : do not send empty properties  PAGEREF _Toc247363011 \h 145 11.36.6 : update client records during slowsync  PAGEREF _Toc247363012 \h 145 11.36.7 : update server records during slowsync  PAGEREF _Toc247363013 \h 145 11.36.8 : never update client records during slowsync  PAGEREF _Toc247363014 \h 146 11.36.9 : ignore maximum field size reported in client's devInf  PAGEREF _Toc247363015 \h 146 11.36.10 , : how to show datastore name in devInf sent to client.  PAGEREF _Toc247363016 \h 146 11.36.11 : allow client to send the same message twice  PAGEREF _Toc247363017 \h 147 11.36.12 : allow client to send the same message twice  PAGEREF _Toc247363018 \h 147 11.36.13 : always send time information as localtime  PAGEREF _Toc247363019 \h 147 11.36.14 : always send time information as localtime  PAGEREF _Toc247363020 \h 148 11.36.15 : always treat received information as localtime  PAGEREF _Toc247363021 \h 148 11.36.16 : always treat received information as UTC  PAGEREF _Toc247363022 \h 148 11.36.17 : prevent folding long lines  PAGEREF _Toc247363023 \h 148 11.36.18 : end date for allday events inclusive  PAGEREF _Toc247363024 \h 149 11.36.19 : set default output character set  PAGEREF _Toc247363025 \h 149 11.36.20 : set default input character set  PAGEREF _Toc247363026 \h 149 11.36.21 , : use relaxed conformance modes  PAGEREF _Toc247363027 \h 149 11.36.22 : reject sync with device  PAGEREF _Toc247363028 \h 150 11.36.23 : max time for request processing  PAGEREF _Toc247363029 \h 150 11.36.24 : script to execute if rule applies  PAGEREF _Toc247363030 \h 150 12. , : SQL/ODBC based Server or Client Config  PAGEREF _Toc247363031 \h 151 12.1 SQL Statement processing  PAGEREF _Toc247363032 \h 151 12.1.1 Placeholders for all SQL statements  PAGEREF _Toc247363033 \h 152 12.1.2 Placeholders for SQL statements within  PAGEREF _Toc247363034 \h 152 12.1.3 Placeholders for SQL data access statements within  PAGEREF _Toc247363035 \h 153 12.1.4 Executing SQL statements from scripts  PAGEREF _Toc247363036 \h 154 12.2 : ODBC data source name  PAGEREF _Toc247363037 \h 155 12.3 : ODBC database user name  PAGEREF _Toc247363038 \h 156 12.4 : ODBC database connection string  PAGEREF _Toc247363039 \h 156 12.5 : ODBC database password  PAGEREF _Toc247363040 \h 157 12.6 : prevent setting connection attributes  PAGEREF _Toc247363041 \h 157 12.7 : ODBC timeout  PAGEREF _Toc247363042 \h 157 12.8 : Script executed whenever new DB connection is opened.  PAGEREF _Toc247363043 \h 157 12.9 : Transaction isolation mode  PAGEREF _Toc247363044 \h 158 12.10 : usage of ODBC cursor library  PAGEREF _Toc247363045 \h 158 12.11 , , : outdated - no longer available  PAGEREF _Toc247363046 \h 158 12.12 : plain text password in database  PAGEREF _Toc247363047 \h 159 12.13 : MD5 digest passwort in database  PAGEREF _Toc247363048 \h 159 12.14 : MD5 digest stored as hex string in database  PAGEREF _Toc247363049 \h 159 12.15 , , , : Device management  PAGEREF _Toc247363050 \h 160 12.16 : query for user authentication  PAGEREF _Toc247363051 \h 161 12.17 : custom login checking script  PAGEREF _Toc247363052 \h 162 12.18 : query for getting database time  PAGEREF _Toc247363053 \h 163 12.19 : SQL statement to write activity log entry  PAGEREF _Toc247363054 \h 163 12.20 : SQL and ODBC Datastore specific settings  PAGEREF _Toc247363055 \h 164 12.20.1 : get data subselection key  PAGEREF _Toc247363056 \h 164 12.20.2 , , , : Sync target management  PAGEREF _Toc247363057 \h 165 12.20.3 : format for timestamps in target table  PAGEREF _Toc247363058 \h 169 12.20.4 : modified time stamp type  PAGEREF _Toc247363059 \h 169 12.20.5 , , , : Map table management  PAGEREF _Toc247363060 \h 169 12.20.6 : SQLite database file name  PAGEREF _Toc247363061 \h 171 12.20.7 : SQLite database file name  PAGEREF _Toc247363062 \h 172 12.20.8 : how ODBC strings must be escaped for the database  PAGEREF _Toc247363063 \h 172 12.20.9 : use filtering in WHERE clause  PAGEREF _Toc247363064 \h 172 12.20.10 : commit at end of SyncML message exchange  PAGEREF _Toc247363065 \h 173 12.20.11 : no longer supported in version 3.0  PAGEREF _Toc247363066 \h 173 12.20.12 : commit each item update  PAGEREF _Toc247363067 \h 173 12.20.13 : combined date and time for modification timestamp  PAGEREF _Toc247363068 \h 173 12.20.14 : read IDs and timestamps  PAGEREF _Toc247363069 \h 174 12.20.15 : read record from database  PAGEREF _Toc247363070 \h 174 12.20.16 , , , : write records to database  PAGEREF _Toc247363071 \h 175 12.20.17 : Ignore SQLRowCount  PAGEREF _Toc247363072 \h 175 12.20.18 , , , , , , : local object ID management  PAGEREF _Toc247363073 \h 176 12.20.19 : SQL specific field mapping features  PAGEREF _Toc247363074 \h 178 12.20.20 : definition of master - detail record structures  PAGEREF _Toc247363075 \h 179 12.20.21 , , : detail record storage options  PAGEREF _Toc247363076 \h 181 12.20.22 : detail record storage filter  PAGEREF _Toc247363077 \h 181 12.20.23 , , : detail record SQL  PAGEREF _Toc247363078 \h 182 12.20.24 : clean detail records on insert  PAGEREF _Toc247363079 \h 182 12.20.25 : prepare SQL filter according to options  PAGEREF _Toc247363080 \h 182 13. , : Text File Based Server or Client  PAGEREF _Toc247363081 \h 183 14. , : Plugin Based Server or Client Config  PAGEREF _Toc247363082 \h 184 14.1 plugin module: global settings  PAGEREF _Toc247363083 \h 184 14.1.1  PAGEREF _Toc247363084 \h 184 14.1.2  PAGEREF _Toc247363085 \h 185 14.1.3  PAGEREF _Toc247363086 \h 185 14.1.4  PAGEREF _Toc247363087 \h 185 14.2 : Plugin Datastore specific settings  PAGEREF _Toc247363088 \h 185 14.2.1  PAGEREF _Toc247363089 \h 185 14.2.2  PAGEREF _Toc247363090 \h 186 14.2.3  PAGEREF _Toc247363091 \h 186 14.2.4  PAGEREF _Toc247363092 \h 186 14.2.5 ,, , : Synthesis SyncML Engine library only configuration tags  PAGEREF _Toc247363099 \h 189 15.1 : Path for persistent storage of client settings and admin data  PAGEREF _Toc247363100 \h 189 15.2 : enable binfile based admin  PAGEREF _Toc247363101 \h 189 15.3 : enable CRC based change detection  PAGEREF _Toc247363102 \h 189 16. : Command line client-only configuration tags  PAGEREF _Toc247363103 \h 191 16.1 : Set default SyncML Version to start a session  PAGEREF _Toc247363104 \h 191 16.2 : Set default auth method  PAGEREF _Toc247363105 \h 191 16.3 : Set default auth encoding  PAGEREF _Toc247363106 \h 191 16.4 : Set default nonce  PAGEREF _Toc247363107 \h 192 16.5 : Use a new sessionID for retries  PAGEREF _Toc247363108 \h 192 16.6 : Use original URI for retry  PAGEREF _Toc247363109 \h 192 16.7 : Use smart retry attempt variations  PAGEREF _Toc247363110 \h 192 16.8 : Always send Device Info at Slowsync  PAGEREF _Toc247363111 \h 193 16.9 , : Login to local database  PAGEREF _Toc247363112 \h 193 16.10 : Prevent local DB login  PAGEREF _Toc247363113 \h 193 16.11 : SyncML encoding format  PAGEREF _Toc247363114 \h 193 16.12 : Remote SyncML server URL  PAGEREF _Toc247363115 \h 194 16.13 , : Login to remote SyncML server  PAGEREF _Toc247363116 \h 194 16.14 , : Proxy servers  PAGEREF _Toc247363117 \h 194 16.15 , : Proxy auth  PAGEREF _Toc247363118 \h 194 16.16 , : Login to remote SyncML server  PAGEREF _Toc247363119 \h 195 16.17 : Request to sync a datastore  PAGEREF _Toc247363120 \h 195 16.17.1 : path of remote server's datastore  PAGEREF _Toc247363121 \h 195 16.17.2 : Synchronisation mode  PAGEREF _Toc247363122 \h 195 16.17.3 : Force a slow sync  PAGEREF _Toc247363123 \h 196 16.17.4 : local datastore options  PAGEREF _Toc247363124 \h 196 16.17.5 : define SyncML DS 1.2 record filter  PAGEREF _Toc247363125 \h 197 16.17.6 : define inclusive SyncML DS 1.2 record filter  PAGEREF _Toc247363126 \h 197 17. List of built-in timezones  PAGEREF _Toc247363127 \h 198 18. Error codes  PAGEREF _Toc247363128 \h 199 18.1 SyncML Status Codes  PAGEREF _Toc247363129 \h 199 18.2 Internal Error Codes  PAGEREF _Toc247363130 \h 200 19. Index  PAGEREF _Toc247363131 \h 202 19.1 Alphabetic Index of all config XML tags  PAGEREF _Toc247363132 \h 202  What's New? New in this manual This chapter – intended as a quick overview to see what is new in this release. In particular, paragraph  REF _Ref201664889 \r \h  \* MERGEFORMAT 2.2.3 " REF _Ref201664889 \h  \* MERGEFORMAT How to migrate from 3.0 to 3.2" details the (simple) steps to take to upgrade an existing installation. An overview diagram " HYPERLINK "SySync_script_call_flow.pdf" SySync_script_call_flow.pdf" (not in this manual itself, but as a separate PDF document in the product package) showing which scripts (PRO version only) are called when in the process of sync session, and what is the typical use of a script. This is intended as a reference card to quickly find out which scripts to use to accomplish a certain customisation task. A separate chapter (see chapter  REF _Ref185238094 \r \h 5) about time zones and how these are handled in the SyncML engine. We recommend to read this chapter, as correct handling of timezones is crucial for a successful calendar sync. New in SyncML Engine 3.2 and newer compared to 3.0 General changes New Version numbering convention (borrowed from Linux kernel numbering): Odd numbers are development versions, that may be released from time to time as beta or for solving very specific customer needs in a project. Even numbers are official release versions. Completely revised and greatly enhanced handling of timezones. Apart from a lot of new features and script functions to work efficiently with time zones, the most important general change is the internal representation of time stamps. In engine versions before 3.1, the internal timestamp value was always represented in UTC (Universal Time Coordinated) along with a time zone offset indicating the time zone context. In engine version starting with 3.1, the internal timestamp value represents time in the context of the time zone identifier that is attached to it. This is a small, but important change, which allows to handle all aspects of timestamps, including "floating" timestamps, in a consistent way throughout the entire data path from backend database to remote SyncML device. See chapter  REF _Ref185238094 \r \h 5 for more details about timestamps and timezones. Most existing setups are not or only slightly affected by these changes –only configurations which were using the LOCALIZEDASUTC, RELATIVEASUTC, UTCASRELATIVE, LOCALZONEOFFSET, SETZONEOFFSET, ISRELATIVE and SETRELATIVE functions in scripts or a "zoneoffset_xxx" conversion mode need to be adapted – and normally the adapted version is simpler and much easier to understand as the new timezone system is more logical and consistent. Our sample config for the PRO servers until 3.1 used RELATIVEASUTC and "zoneoffset_secs" two times – please refer to instructions in paragraph  REF _Ref201664889 \r \h  \* MERGEFORMAT 2.2.3 " REF _Ref201664889 \h  \* MERGEFORMAT How to migrate from 3.0 to 3.2" how to update your config. New Features SyncML engine now available as library – Starting with Synthesis SyncML engine 3.1, the core engine with all SyncML functionality, SQL/ODBC/SQLite and plugin database interfaces, complete XML configuration is now available as a dynamically linkable library for various platforms. Using the Synthesis SyncML SDK, custom SyncML applications can be built in native languages (C/C++/Delphi etc.) as well as in Java or .net. Extended support for symbolic time zones – which can be referenced and stored in the database by name. These symbolic time zones handle DST rules automatically (not only for the system's local zone, but any time zone). See chapter  REF _Ref185238094 \r \h 5 for an overview of time zones. The PRO version also has many new built-in script functions for working with time zones: ZONEOFFSET(), TIMEZONE(), VTIMEZONE(), SETTIMEZONE(), SETFLOATING(), CONVERTTOZONE(), CONVERTTOUSERZONE(), USERTIMEZONE(), SETUSERTIMEZONE(), ISDATEONLY(), DATEONLY(), ISFLOATING() – see ( REF _Ref204925451 \r \h 6.14.4). Per user time zones – using (see  REF _Ref204935552 \r \h 11.22) and SETUSERTIMEZONE() (see  REF _Ref204925451 \r \h 6.14.4) it is possible to assign a default time zone on a per-user level. This is important with client devices that do not support UTC, and must be server in a specific local time zone. Per datastore time zone – using the new (see  REF _Ref185246110 \r \h 11.34.31) which replaces former (still supported for compatibility). Record level or field level time zones e.g. for storing originating time zone of a calendar entry along with the entry, or to define floating timestamps (timestamps not bound to a time zone). To map the timezone of a timestamp field to a database string field, use the new "zonename" database field type (see  REF _Ref47173451 \r \h 11.34.41.1). To create TZ, DAYLIGHT and TZID values in vCalendar/iCalendar data formats, new conversion modes "TZ", "DAYLIGHT", "TZID" have been added (see  REF _Ref182995906 \r \h 10.3.4). To include full time zone specification in VTIMEZONE format, a predefined (see  REF _Ref182997657 \r \h 10.3.2) has been added. PRO only: Support for maintaining relational links between items by providing an optional post-processing step at the end of the session (when the data sets are known to be in sync) trough the new (see  REF _Ref207618734 \r \h 11.34.41.6). PRO only: Support for regular expression search, replace and pattern split (using new script functions REGEX_FIND, REGEX_MATCH, REGEX_SPLIT, REGEX_REPLACE, see  REF _Ref204937964 \r \h 6.14.2). These can greatly simplify value conversion scripts. PRO only: Script language now supports the WHILE() statement in addition to the LOOP statement. PRO only: A lot of new built-in script functions: SYNCMLVERS(), EXPLODE(), ABS(), SIGN(), NUMFORMAT(), DAYUNITS(), MONTHDAYS(), PARSEEMAILSPEC(), MAKEEMAILSPEC(), SLEEPMS(), TIMESTAMPTODBINT(), DBINTTOTIMESTAMP(), CONVERTTODATAZONE(), ADDTARGETCGI(), SETRECORDFILTER(), SETDAYSRANGE(), TARGETSETTING() - see ( REF _Ref42673942 \r \h 6.14). Enhanced support for calendar content formats – new conversion modes "valuetype", "tzid", "tz", "daylight", "autodate", "autoenddate" see ( REF _Ref182995906 \r \h 10.3.4), new script functions to detects/generate all-day events: ALLDAYCOUNT(), MAKEALLDAY() and to generate and expand recurring events: RECURRENCE_DATE(), RECURRENCE_COUNT(), see ( REF _Ref204935761 \r \h 6.14.3). SyncML max message and object size limits are now configurable using , (see  REF _Ref203479102 \r \h 8.3 and  REF _Ref204935780 \r \h 8.4). Debug logging enhanced – now shows timestamps with millisecond resolution. Blocks now have a "enclosing" navigation link which allows jumping to the beginning or end of an enclosing block in the hierarchy. SyncML message dumping enhanced – messages are now saved on a per-session basis and message dumping can be switched on and off in scripts, e.g. based on what user is logged in or what device type is being synchronized. See ( REF _Ref203482186 \r \h 8.11.15), ( REF _Ref203482205 \r \h 8.11.14) and the related script functions SETMSGDUMP and SETXMLTRANSLATE ( REF _Ref153590626 \r \h 6.14.5). Script execution logging enhanced – colorized to recognize comments, executed code and conditionally skipped code at a glance. Condensed output to avoid too much detail by default (but new "expressions" debug option still allows in-detail expression debugging, see  REF _Ref42675268 \r \h 8.11.2). New script functions DEBUGSHOWITEM() and DEBUGSHOWVARS() can be used to show the contents of a sync item or of all local script variables in the log, see  REF _Ref153590626 \r \h 6.14.5. Optional parameters for built-in script functions – many of the new 3.1 engine's scripting functions and some of the existing functions now have optional parameters which can be omitted when no special non-default behaviour is needed. Config variables: These are variable strings that can be referenced in the XML config using $(varname) syntax (see  REF _Ref184459487 \r \h 4.2) or for conditional config sections (see  REF _Ref183001062 \r \h 4.5). Config variables are either preset by the operating environment (with values like engine version, device ID, file paths to standard config, temp, user directories etc., see  REF _Ref184460000 \r \h 4.4), defined from the command line using the –D option (for executable program versions, use -h option to show syntax options), via the "/configvars" engine settings key (for library versions). Conditional config: All config XML tags now have generic "if", "ifdef" and "ifndef" attributes (see  REF _Ref183001062 \r \h 4.5) that can be used to make certain config sections dependent on config variables (e.g. SyncML engine version). This simplifies using the same config file for different versions of the SyncML engine, different platform, different operating conditions. How to migrate from 3.0 to 3.2 or newer (up to 3.4) Existing 3.0 installations usually need some changes when based on our 3.0 configuration sample to run with SyncML engine 3.2 or later. Some configurations that did not make use of time-zone related features might need no changes at all. Please check the following: Obsolete time zone conversion modes: zoneoffset_secs, zoneoffset_mins, zoneoffset_hours are no longer available. These have been replaced by the much more versatile "tz" mode (see  REF _Ref182995906 \r \h 10.3.4). If your configuration is based on the sample configuration as delivered with the 3.0 version, you'll likely have two occurrences of zoneoffset_secs for the "TZ" field. The way this field was defined in 3.0 and earlier was not correct vCalendar 1.0 usage anyway, and almost no client supported it, so it had no real meaning. If you want to be prepared to save the originating time zone along with each calendar item, change the type of the TIMEZONE field in the "calendar" from string: to integer This will cause your TIMEZONE field in the database store a minute offset to UTC instead of a seconds offset as in 3.0. Then move the first occurrence of "..." one level up (out of "" into ""), and delete the second occurrence of "...": ... Alternatively, if you do not need the TIMEZONE information in your application, just remove the two ... definitions entirely from the config file. and should be changed to : No change is needed, but the SyncML engine will show a warning when or (see  REF _Ref185245663 \r \h 11.34.30) are used as these should be replaced by the more versatile (see  REF _Ref185246110 \r \h 11.34.31). PRO only – script functions no longer supported: LOCALIZEDASUTC, RELATIVEASUTC, UTCASRELATIVE, LOCALZONEOFFSET, SETZONEOFFSET, ISRELATIVE and SETRELATIVE are not supported any more because they do not fit with the new enhanced timezone handling. If your configuration is based on the sample configuration as delivered with the 3.0 version, you'll likely have two occurrences of RELATIVEASUTC in the of vCalendar10. These can be simply removed. So the line that originally reads: RES = COMPARE(DATEONLY(RELATIVEASUTC(TARGET.DTSTART)), DATEONLY(RELATIVEASUTC(REFERENCE.DTSTART))); can be replaced by RES = COMPARE(DATEONLY(TARGET.DTSTART), DATEONLY(REFERENCE.DTSTART)); Overview In order to understand a server's or client's configuration, an overview of the basic building blocks and concepts in the Synthesis SyncML engine is helpful. Basic Concepts The Synthesis SyncML engine performs three conceptually more or less separate tasks: Running the SyncML protocol. SyncML is an open industry standard and therefore there are clear specifications about how the SyncML protocol must be implemented and run. Therefore, there is not a lot of configuration needed for the SyncML protocol engine itself. Encoding and decoding the data that is synchronized with the SyncML protocol. SyncML itself is designed to synchronize any type of data, even proprietary, customer-defined types. However, to make a SyncML server or client interoperable, it must support some standard datatypes. Today, this includes the widely used vCard format for contact information and vCalendar for events and tasklists, and a number of RFC(2)822 based email formats for email synchronisation. Synthesis SyncML products support these standard formats, but they give the user complete freedom about all the details (you can define a server or client that can handle 37 phone numbers per contact if this is important in your context). In addition, custom formats based on plain text, MIME-email or MIME-DIR can be defined. Covering all the possible options of the vCard/vCalendar formats and even allowing to define new formats makes the datatype configuration quite complex and big - however in most applications, it is sufficient to slightly modify one of the provided sample datatypes. Interfacing the SyncML data with a server's or client's database. The complexity of this task depends largely on the type and kind of database. Our text file based demo versions need almost no configuration, because the data is simply saved to tab-separated text files. On the other hand, our ODBC-based products are designed to interface with existing databases, which requires very flexible configuration options to handle field mapping and data conversions. In most real-world applications, configuration of the database interface is what needs most attention and customisation. Configuration Structure According to the basic tasks decribed above, the config for a Synthesis SyncML server or client is structured as follows: client and server: General global options, (see  REF _Ref47775300 \r \h 8) such as: a section for configuring level of debugging log information a section for defining global scripting functions and macros (only in PRO versions) a section for entering license codes (not all versions need license codes) server only: Configuration of the transport, that is how clients can access the server (see  REF _Ref47775275 \r \h 9) server and client: Datatype definitions (see  REF _Ref6129297 \r \h 10). This consists of the following sub-sections: one or multiple sections, which define the internal representation of a data type as a list of typed fields (or array fields). one or multiple and/or sections, which define a mapping between internal fields and a data format based on MIME-DIR (such as vCard or vCalendar) or plain text (such as email or notes). one or multiple sections, which define actual data types based on field lists and MIME-DIR or text profiles. server only: a section which defines the server databases (see  REF _Ref47165113 \r \h 11 and  REF _Ref47165137 \r \h 12) client only: a section which defines the client databases (see  REF _Ref47165113 \r \h 11 and  REF _Ref47165137 \r \h 12) server and client: the or section contains one or multiple sections which each define a database. The definition provides the necessary mapping information between the internal fields from the field list and the database itself. For the ODBC based products this includes all SQL statements needed to read, modify, insert and delete data as well as a mapping table assigning SQL-names to internal field names. For the plugin based datastores, the mapping is between internal field names and the plugin API data format's names. For both types of datastores, importants settings like database character set and line end format can be defined here. client only: one or multiple sections which define what databases should be synced with a server when the client application is started (not available in all client versions). server and client: optional sections which define special options for a certain type of remote SyncML client or server. This is normally used in servers to control device-specific behaviour. The order in which the elements appear in the config file does not matter unless a section refers to definitions in another sections (like referencing s, or s referencing ) - in this case the defining section must appear before the referring section in the config file. Generally, we recommend using the order as outlined above (and also used in the sample config files). An "empty" server config file looks like this (a client would be similar except that there was a section instead of the section): We recommend to use the sample config file as a starting point, because there are quite complex parts (especially datatype definitions) which are hard to create from scratch. In many applications, modest modifications to one of the sample files is sufficient anyway. XML basics The configuration file is formatted in XML, which is a tagged text format. Any text editor (including Windows Notepad) can be used to edit XML files. In addition, there are many XML-aware text editors or specialized XML editors. To view (but not edit) XML files neatly formatted and colorized, they can be opened with a web browser like Firefox. We cannot give a real introduction to XML here, but here are just a few notes about XML syntax in case you are not familiar with it already: An XML tag consist of text enclosed in angle brackets like: XML tags must always appear in pairs: something in between the "something in between" can be plain text or other paired tags: some text Instead of writing: for a tag pair with "nothing in between" (tag with no contents), it can be abbreviated as: Tags can have attributes: Attribute values must always be enclosed in double quotes. In Synthesis Sync Server config, tags with attributes are often tags with no contents, so many config tags might look like: (note the slash at the end) XML allows inserting comments. A comment starts with : Formatting does not matter (except for string values, see below), but it makes XML much more readable when nested contents are indented like in the sample config files. Most XML enabled tools do this automatically or have an option for it. Synthesis Sync Server Config specific XML usage A few notes on the way XML is used in Synthesis Sync Server: String values: They are used exactly as written in the config file, except that leading and trailing whitespace is removed first. All other contained spaces, control characters and line ends are preserved. So when formatting the XML source nicely, make sure you don't break strings into muliple lines that should be one line (such as directory paths). C-String values: These are strings that are parsed like in the C programming language as follows: Actual line ends are ignored, but the following escape sequences can be used to insert special characters into the string: \t is used to insert a TAB character \r is used to insert a CR character \n is used to insert a LF (linefeed) character \xXX is used to insert the character having an ASCII-code of XX (in hexadecimal). Note that the octal form \0XX available in the C language is NOT supported. \\ is used to insert a single backslash character. Boolean values: "yes", "true", "on", "1" can be used for true, "no", "false", "off", "0" can be used for false. Configuration variables and conditional configuration New in 3.1: Configuration variables (or short "config variables") are a new concept introduced with the 3.1 SyncML engine to allow parametrizing some values within a config file from "the outside" without needing to edit the config file itself. Using conditional sections in a config file, the same file can be used for different setups controlled by configuration variables. Sources for values of config variable There are four sources for these "outside" values: From the operating environment – these are values like file system paths to various platform specific directories (like temp dir, application dir etc.) or other values like current user name (see  REF _Ref184460000 \r \h 4.4 for a list). From the SyncML engine itself – like the version of the SyncML engine Supplied from another program or the user: via the –D command line option for standalone SyncML applications or via the "/configvars" settings key when the SyncML engine is used as a libary with the client or server SDK API – see separate SDK docs for details. Finally, the directive (see  REF _Ref204511965 \r \h 8.8) can be used to define config variables in the config file itself. The first two sources are predefined by the engine. See  REF _Ref184460000 \r \h 4.4 for a list of commonly supported configuration variables. Depending on the platform or engine variant, there might be additional variables predefined (and documented in the specific product documentation). Using configuration variables Configuration variables can be used within many string literals in the configuration using the syntax $(configvarname). This syntax is generally recognized in strings that specify file system paths. In all other tags, the $(configvarname) syntax is not recognized by default, but can be switched on using the "expand" attribute (see  REF _Ref184459204 \r \h 4.3). In XML tag attributes, the $(configvarname) syntax is usually not supported, however there are exceptions such as the tag, see  REF _Ref204511965 \r \h 8.8. By default, expansion of config variables is recursive, which means that if the value of a config variable contains another $(configvarname), this is expanded as well. To avoid recursive expansion, the "expand" attribute (see  REF _Ref184459204 \r \h 4.3) can be set to "single". Note: before version 3.2.0.11, expanding tags with pure numeric, enumerated or timestamp values was not supported. From 3.2.0.11 onwards, $(configname) expansion works for all tags (but for most tags only if the "expand" attribute is set, see above). Config variables can also be used to control conditional configuration (see  REF _Ref183001062 \r \h 4.5). "expand" attribute All tags that support configuration variable expansion (see  REF _Ref184459487 \r \h 4.2) can have a "expand" attribute to control if and how to expand $(configvarname). Possible values for "expand" are: "no" : do not expand "single" : expand once, but do not try to expand result again "yes" : expand recursively. Predefined Configuration Variables The following list contains the configuration variables generally available in most Synthesis SyncML products. Depending on the platform or engine variant, there might be additional variables predefined (and documented in the specific product documentation). version Version string of the Synthesis SyncML engine, like "3.4.0.0" hexversion Synthesis SyncML engine version as 32-bit hex like MMmmssbb (MM=major, mm=minor, ss=subversion, bb=build). manufacturer Manufacturer string that is also communicated to remote parties in the SyncML device Information. For Synthesis SyncML engine library products, this can be configured using the tag (see  REF _Ref206385571 \r \h 8.6). model Model (product name) string that is also communicated to remote parties in the SyncML device Information. For Synthesis SyncML engine library products, this can be configured using the tag (see  REF _Ref206385661 \r \h 8.7). platformname name of the current OS platform (like Windows, Linux, iPhoneOS…) platformvers version string of the current OS platform (like "5.1.1732") globcfg_path global system-wide config path (such as C:\Windows or /etc) loccfg_path local config path (such as exedir or user's dir) defout_path default path to writable directory to write logs and other output by default temp_path path where we can write temp files exedir_path path to directory where executable resides userdir_path path to the user's home directory for user-visible documents and files appdata_path path to the user's preference directory for this application prefs_path path to directory where all application prefs reside (not just mine) device_uri URI of the device (usually unique ID or URL identifying the device or server) device_name Name of the device (like a model or brand name) user_name name of the currently logged-in user conferrpath for Synthesis SyncML engine library only: path of the file to output configuration parsing error messages. Can be set to "console" to direct the error messages to the standard output (note that a usable standard output might not exist for certain platforms). "ifdef/ifndef/if" conditional attributes New in 3.1: These attributes are available in every XML tag and can be used in a similar way as the "platform" attribute (see  REF _Ref184460158 \r \h 4.6) to make sections of the configuration dependent on certain conditions: "ifdef": used in the form . This will conditionally include and all tags contained only if "configvarname" is an existing config variable. "ifndef": same as "ifdef", but condition reversed – config variable must not exist to include the tag in the config. "if": used in the form . This will compare the config variable with the specified value. Allowed comparison operators are "=", ">", "<", "!=", ">=", "<=". The comparison is a string comparison, except when comparing the "version" variable, which is compared such that "newer version > older version" is always true (which would not always be the case with string comparison). "platform" conditional attribute Usually, a Synthesis SyncML server or client configuration file is largely platform independent. However, some specifications, such as file paths, are always platform dependent. Since version 2.9.8.5, every tag can be made platform-specific by adding a platform="xxx" attribute. xxx can be "win32", "linux" or "macosx" at this time. Tags having a platform attribute are only evaluated on the specified platform. This allows using a single config file for multiple platforms. For example, the debug log path usually varies depending on the platform: C:\logs\syncml /var/log/syncml /private/var/log/syncml Time zone handling With the Synthesis SyncML engine 3.1, a completely revised time zone handling has been implemented that allows much more flexibility than before, and allows handling time zone association with timestamp information down to the single field level. Note: For setups designed for SyncML engine before 3.1, the new engine behaves fully compatible when used with existing 3.0 configuration file, with the exception of a few rarely used scripting functions (LOCALIZEDASUTC, RELATIVEASUTC, UTCASRELATIVE, LOCALZONEOFFSET, SETZONEOFFSET, ISRELATIVE and SETRELATIVE) which are no longer available. In config the 3.0 engine config samples, RELAVTIVEASUTC is used twice, which can be simply removed as the new timestamp representation makes the use of RELATIVEASUTC functionally obsolete. Timestamp representation Timestamp fields consist of two parts: The timestamp value itself (internally represented as 64bit integer counting milliseconds passed since -4712-01-01 00:00:00 on most platforms). When a timestamp is converted e.g. from a string representation into internal format, the timestamp represents date and time exactly as found in the input, regardless of eventual time zone information. This is the key difference between Synthesis SyncML engine 3.0 and 3.1 timezone handling – in 3.0 and earlier, timestamps were always converted to UTC. The time zone context  where a timestamp value belongs to or originates from. The context is either a plain numeric offset from UTC (like: 1 hour east of UTC, which applies for example for Zürich local winter time), or it can be in symbolic form which handles winter and summer (daylight savings) time (like "CET/CEST" meaning Central European Time and Central European Summer Time, which is 1 hour east of UTC in winter, and 2 hours in summer). Timestamps that are not associated with a specific time zone are called floating timestamps. Date-only values are normally floating, as they usually refer to a specific calendar day and not a absolute point in UTC time. External string representations for timestamps sometimes include time zone information (like the "Z" in ISO8601 UTC format: 20071212T110000Z or an explicit offset like in 20071212T120000+01) . Sometimes, external representation does not include time zone information directly, but timestamps are still implicitly meant in a specific time zone context, like the system's current time zone for example). Therefore it is important to understand what different implicit time zone contexts exist within a SyncML session and how timestamp values are affected by "travelling" through these contexts. Timezone contexts The Synthesis SyncML Engine 3.1 and later maintains the following time zone contexts, ordered starting with most general and global context and ending with most specific context: System time zone context. This is the time zone set in the operating system which runs the SyncML engine. It can be referenced by name by the string "SYSTEM". Usually, the parameters (offset and daylight saving switching rules) are obtained from the operating system automatically. It can be overridden by using the configuration tag (see  REF _Ref185247389 \r \h 8.14). Datastore time zone context. This is a per-datastore time zone context which is used for all timestamps stored in the database. This means that timestamp values are converted from their original timezone context to the datastore time zone context before storing them in the database. Vice versa, timestamps read from the database are implicitly treated as originating in the datastore time zone context. An exception to this are timestamps mapped to the database using the "f" (floating) mode flag in the tag (see  REF _Ref47173451 \r \h 11.34.41.1) – these are always stored as-is (which can make sense if the actual time zone is stored along with each timestamp in a separate database field using the "zonename" or " zoneoffset_xxx" mapping types). The datastore time zone context to be used for a datastore is specified using the tag (see  REF _Ref185246110 \r \h 11.34.31). For compatibility with pre-3.1 configuration files (see  REF _Ref185245663 \r \h 11.34.30) is still supported but no longer recommended – use (see  REF _Ref185246110 \r \h 11.34.31) instead: timeutc=true is equivalent with datatimezone=UTC and timeutc=false is equivalent with datatimezone=SYSTEM). User time zone context. Each user of a SyncML application thinks of his or her calendar entries in the context of a time zone. Calendar applications and web sites use this time zone to display timestamps, and usually input of new calendar entries is meant in that time zone as well. This general fact gains technical relevance with SyncML devices that are not capable of receiving and sending timestamps in a time-zone independent way (usually UTC). When communicating with such a device, the SyncML application must know implicitly in what timezone context transmitted timestamp values are meant. By default (and generally in Synthesis SyncML engines before 3.1), this user time zone context is the same as the local time zone of the operating system. While this is usually correct for single user mobile devices, it might not be sufficient for a multi-user server. To allow individual time zone context per user, Synthesis SyncML Engine 3.1 adds the configuration tag (see  REF _Ref204922935 \r \h 11.22) and especially the SETUSERTIMEZONE() (see  REF _Ref204925451 \r \h 6.14.4) script function, which allows setting the user time zone context based on user-level information retrieved at login (see and in  REF _Ref43727925 \r \h 11.33 or in  REF _Ref43727928 \r \h 12.17). Item time zone context. For each item (such as a vCalendar item) processed by the SyncML engine, the item time zone context is initialized with the user time zone context, which means that timestamp data which has no timezone information attached is treated as related to the user time zone context. However, if a item carries time zone information (for example vCalendar TZ/DAYLIGHT), this modifies the item time zone context accordingly, and any timestamp found in the item which does not have its own specific time zone will be subsequently treated in the item time zone context. Vice versa, the item time zone context might be used (depending on rules defined by the content format) to represent timestamps when generating items like vCalendar. Field level time zone context. Each timestamp which "travels" from SyncML end to the database end trough the SyncML engine has its own time zone context associated. When reading a item from SyncML content formats like vCalendar, the field level time zone context is either read as part of the timestamp string representation (e.g. TZID parameter in iCalendar) or copied from the item time zone context. When writing the timestamp to the database, it is usually converted to the datastore time zone context (if mode flag "f" is not used, see  REF _Ref47173451 \r \h 11.34.41.1) Vice versa, timestamps read from the database receive either a individual time zone from a "zonename" (see  REF _Ref47173451 \r \h 11.34.41.1) or are put into datastore time zone context. Before data is converted to SyncML content formats like vCalendar, timestamps are converted to user time zone context (except if is set to false, see  REF _Ref204936212 \r \h 11.34.32). The built-in script language offers various built-in functions to access and manipulate the field level time zone context. Time zone specifications Time zones can be specified in different ways: By name: The SyncML engine has a built-in list of world-wide time zones which can be referenced by name. Well known timezone name examples are "UTC", "PST", "CET". If a timezone has daylight savings, it can be referenced either by the standard time zone name, the daylight savings zone name or a combination of both: "PST", "PDT" and "PST/PDT" all reference Pacific time; "CET", "CEST" and "CET/CEST" all reference Central European Time. Some zones have more descriptive aliases like "Pacific", some have variants with differing daylight savings rules like "Pacific_Mexico" etc. The TIMEZONE script function (see  REF _Ref204925451 \r \h 6.14.4) returns the time zone name of a given timestamp. For a complete list of built-in time zones see chapter  REF _Ref185261956 \r \h 17. A number of special time zone names are supported as follows: SYSTEM – means the local time zone of the operating system (eventually overridden with see  REF _Ref185247389 \r \h 8.14). DATE – means a floating date-only value. FLOATING – means that the timestamp is not related to any time zone in particular. USERTIMEZONE – can be used in script functions like SETTIMEZONE (see  REF _Ref204925451 \r \h 6.14.4) to apply the user time zone context  active for the current user in the current sync session. By VTIMEZONE specification: New timezones can be added to the built-in list using the VTIMEZONE format (as defined in iCalendar, RFC 2445). This can be done statically in the configuration (, see  REF _Ref185262282 \r \h 8.15) or dynamically in scripts using script functions like SETTIMEZONE (see  REF _Ref204925451 \r \h 6.14.4) which can accept VTIMEZONE input to specify a time zone. New timezones are also created implicitly when receiving vCalendar items containing VTIMEZONE specifications that do not match one of the already defined time zones. The VTIMEZONE script function (see  REF _Ref204925451 \r \h 6.14.4) returns the time zone of a given timestamp as a VTIMEZONE record. By TZ/DAYLIGHT specification: New timezones are also added implicitly when receiving TZ/DAYLIGHT properties in vCalendar 1.0 items (using the special "tz" and "daylight" conversion modes, see  REF _Ref182995906 \r \h 10.3.4). As numeric offset: This is generally not recommended, as most time zones do not have the samm offset all year long but change between standard and daylight savings time, so a numeric offset only applies for a single specific time stamp value and cannot be used generally for other timestamps in the same zone. Numeric time zone offsets are accepted as part of timestamp formats like ISO8601 or RFC822 (email time stamps), or as input to script functions like SETTIMEZONE (see  REF _Ref204925451 \r \h 6.14.4) when used with numeric arguments. Scripting Language The PRO versions of the Synthesis SyncML engine feature a built-in, highly efficient, C-style syntax scripting language that extends flexibility in adapting to even exotic database layouts far beyond what is possible with the standard version. It allows for example to code value translations that are more complex than simple 1:1 translations (which can be done with s, see  REF _Ref42506966 \r \h 10.3.5). This chapter describes the script language in general. Scripts can be defined at many points within the configuration to customize many aspects of handling data, database access, data matching algorithms etc. These places where a script can be used within the configuration is described together with the related configuration section. Note that this chapter assumes basic knowledge of C or a C-like syntax language (for example JavaScript). What can be scripted? There are various possibilities to use scripts to customize processing of a synchronisation operation (a so called sync session). For each possibility, a "hook" exists to insert your custom code in the form of a configuration tag, where xxxxx describes the action or process that can be customized. These scripts are executed in various different contexts (see  REF _Ref42517152 \r \h 6.8 for details). This is important to understand as every context has it's own scope (local variables, lifetime, context script functions that can be accessed). To get an overview of what scripts exist in what contexts, please refer to the " HYPERLINK "SySync_script_call_flow.pdf" SySync_script_call_flow.pdf" diagram (separate PDF document). Embedding script source code in XML All script source is embedded in the configuration file as text between XML tags like: // this is a script integer x; However, as scripts often contain greater-than and less-than signs (< and >) and maybe ampersands (&) which have a special meaning in XML, we strongly recommend to use the XML CDATA bracket to enclose scripts, as follows: and & integer x,y,z; x = y > z && z<100; ]]> Comments The script engine supports both forms of ANSI-C style comments, that is Any sequence of characters starting with /* and ending with */ Any sequence of characters starting with // and ending with a line end Statements and Statement Blocks A statement is either a simple statement terminated with a semicolon (;) or it is a statement block. Statement blocks are multiple statements enclosed in { and }. Note that empty statements are allowed (consisting of a semicolon only) // simple statement a = b; // statement block { a = b; // first simple statement c = d; // another simple statement } // empty statement ; Identifiers Identifiers identify language keywords (such as IF, ELSE etc.), symbolic constants, variables and functions. Identifiers always start with an alphabethic character, and otherwise consists of any number of alphanumeric characters or underscores (_). Note that identifiers in scripts are not case sensitive (unlike in C)! Data types The built-in script language uses exactly the same base datatypes that are also available for fields in a definition (see  REF _Ref5625615 \r \h 10.2 for details). All datatypes are either integer or string based. There is no floating point data type. Note also that despite the similarity with C, the basic types known from C are not available (neither char nor int). Constants/Literals There are three basic types of literal constants: Integer constants: an optional minus sign "-" followed by digits "0".."9". From version 3.1 onwards C-style hexadecimal (0x...) integer syntax is supported (but not octal (0...) integer syntax). Quoted string constants: Any text surrounded by double quotes. Within the quotes, only "\" (backslash) has a special meaning: it causes the following character to be added to the string unprocessed, for example a doublequote or the backslash itself. Note the following special escape sequences: "\n" stands for a line end "\t" stands for a tab "\xNN (where NN is a two-digit hexadecimal number) stands for the character with the ASCII-Code equivalent to NN. Date and time constants in ISO8601 basic format such as 20030604T164922 or 20030604144922Z (see ISO8601 specs if you need more details). Note that if the ISO8601 constant expression contains + or -, it must be quoted like a string constant. There are also the following special symbolic constant values: TRUE (synonymous to a constant integer of 1) FALSE (synonymous to a constant integer of 0) EMPTY: This is a special "value" all variables can have and means that the variable has no value. UNASSIGNED: This is almost the same as EMPTY, but for data item fields, it has the additional meaning of "this value has not been assigned, not even with an EMPTY value". This is useful to distinguish values that were transmitted from the remote SyncML device with an empty value (==EMPTY) from values that were not transmitted at all (==UNASSIGNED). Script contexts All scripts run in a specific script context. For example, there is a "login context", a "session context", "datatype contexts" etc. A script context can be thought of as an execution environment that is (mostly) isolated from other script contexts and has the following properties: One or several scripts that belong to the script context and are executed within the environment that this context represents. Which scripts belong to what context is described where the script's tag in other chapters of this reference manual. A lifetime. For example, the "session context"s life time is the entire sync session, whereas a database mapping script context's life is only as long as database access takes place. Context variables (these are defined by the scripts, see  REF _Ref42509834 \r \h 6.9 below). These are values that are local to the script context and can be accessed only by scripts in the same context. None, one or two (but not more) data items. A data item represents the data in an object being synced by the SyncML engine, such as a vCard or vCalendar. However, the data item is not the vCard itself, but its internal representation which consists of a list of fields as defined by a (see  REF _Ref6030571 \r \h 10.1). A number of context built-in functions. These are built-in functions that do make sense only within this special script context and are not available in other script contexts (as opposed to global built-in functions (see  REF _Ref42673816 \r \h 6.13.2) which are available in all scripts). Variables Variables in scripts are technically the same internal objects as fields in a (see  REF _Ref5625615 \r \h 10.2). Variables can be assigned values (using the = assignment operator) and values stored in variables can be used in expressions (see  REF _Ref42671142 \r \h 6.10) Within scripts, there are three basically different kinds of variables - where the difference is in the way they come into existence (scope) and the syntax used to access them. Context Variables These are variables declared in one of the scripts that belong to a script context. Note that all variables must be declared before being used. Variables can be of any of the basic datatypes (see  REF _Ref185238839 \r \h 6.6) or dynamic arrays thereof (always with empty square brackets, specification of a size is neither needed nor allowed): // declaration of simple variables integer mynumber,yournumber; // two integers string s; // a dynamic string telephone tel; /* also a dynamic string, but with telephone-number comparison rules */ timestamp t; // a timestamp // declaration of dynamic arrays string mynamelist[]; // an array of strings integer l[]; // an array of integers Note that all context variables declared in any of the scripts belonging to the same context are accessible in all scripts belonging to this context regardless of when (or whether at all) the scripts containing the declarations are executed. Therefore, it is sufficient to declare context variables in one script belonging to a context (altough redeclaration is allowed as long as the type of a variable is the same in all declarations). To explicitly access context variables in script expressions when there are field variables having the same name the name can be qualified with a "local." prefix, but this is only for documentation purposes (as a context variable always override field variables with the same name): // accessing a context variable integer a,b; // two integers // normal access a = b; // with qualifier prefix for documentation local.a = local.b; Local variables of a user-defined function Variables declared in user-defined functions (see  REF _Ref42511232 \r \h 6.13) are local to the function, and not to the script context where the function is called. Otherwise, local variables in user-defined functions are declared and used like script context variables. Field variables In script contexts that have associated data items (see  REF _Ref42517152 \r \h 6.8 above) the fields of the data items can be accessed as follows: The field of the so called target data item (also called new or winning item, depending on the context) can be accessed by the field name alone (if there is no context variable with the same name) or with any of the (synonymous) prefixes "new.", "winning.", "target.". The field of the so called reference data item (also called old or loosing item, depending on the context) can only be accessed by using one of the (synonymous) prefixes "old.", "loosing." or "reference.". /* assuming there is no context variable DTSTART we can access the DTSTART of a vCalendar like: */ t = DTSTART; /* to make sure we get the field, and not a context variable: */ t = TARGET.DTSTART; /* if there are two data items involved (for example when comparing or merging items: */ if (NEW.DTSTART<>OLD.DTSTART) { /* do something */ } Note that in some contexts, it might be that data items (one or both) cannot be written, such that assigning values to field variables is not allowed (for example in the ). Array variable references Array variables are always one-dimensional, dynamically sized arrays of simple variables. The elements can be accessed by a zero-based index expression in square brackets like: // declaration integer a,myarray[]; // accessing array elements a = myarray[0]; // first element b = myarray[7]; // 8th element In addition there is a special form of array index that can be used to access fields in a field list (see  REF _Ref42589436 \r \h 10.1) by index instead of by name. This special form of array index starts with a + sign as the first character after the opening [ as shown in the following example: /* sample script to access the telephone numbers by index instead of by name */ integer i; telephone a,b,c; a = TEL_1[+0]; // this is the same as: a=TEL_1 b = TEL_1[+1]; // this is the same as: b=TEL_2 c = TEL_1[+2]; // this is the same as: c=TEL_3 As this special form is dependent on the field order in the field list, it's use is only recommended when this can be guaranteed. Expressions Expressions are built as follows (much like C, but not all operators of C available): An expression consists of a single term or multiple terms linked together with one of the operators. A term is either an expression enclosed in parantheses, a constant (see  REF _Ref42588386 \r \h 6.7), a variable reference (see  REF _Ref42509834 \r \h 6.9 and  REF _Ref42590185 \r \h 6.9.4) or a function call (see  REF _Ref42511232 \r \h 6.13). A term can be optionally preceeded by a typecast. A typecast is a type name enclosed in parantheses, like: (integer)a. It's effect is that the term it preceedes is converted to the type specified. Operators are the following, in the order of precedence: Unary minus (-), unary logical NOT (!) and unary bitwise NOT (~). Multiply (*), divide (/) and modulus (%) Add for numbers or concatenate for strings (+) and subtract (-) Shift left (<<) and shift right (>>) Comparison operators (>, <, >=, <=, ==, !=) Bitwise AND (&) Bitwise XOR (^) Bitwise OR (|) Logical AND (&&) Logical OR (||) Note that all operators except + need numeric (integer or timestamp) operands. If operands are not numeric, they will be implicitly converted. Flow control The script engine supports the following flow control mechanisms: IF (conditional_expression) statement: statement is executed if conditional_expression returns non-zero result. IF (conditional_expression) statement1 ELSE statement2: statement1 is executed if conditional_expression returns non-zero result, otherwise, statement2 is executed. IF (conditional_expression1) statement1 ELSE IF (conditional_expression2) statement2.... ELSE statement: Chained if-else; the last statement is only executed if none of the previous IF conditions were true. LOOP statement. This is a general loop mechanism (there is also a while statement, but no for/do as in C). It causes statement (which is normally a statement block) to be repeated forever. Therefore, the statement (block) must contain at least one BREAK statement to exit the loop. It can also contain CONTINUE statements to jump to the beginning of the loop. To prevent the SyncML engine to hang in case there is an infinite LOOP in a script, any LOOP that takes more than the number of seconds defined in (see  REF _Ref153285595 \r \h 8.10.3, default is 5 seconds) aborts the script execution with an error. WHILE (conditional_expression) statement. New in 3.1: This causes statement (which is normally a statement block) to be repeated as long as conditional_expression is true. The statement (block) may contain BREAK statements to exit the while loop or CONTINUE statements to jump to the beginning of the while loop. To prevent the SyncML engine to hang in case there is an infinite WHILE in a script, any WHILE that takes more than the number of seconds defined in (see  REF _Ref153285595 \r \h 8.10.3, default is 5 seconds) aborts the script execution with an error. RETURN or RETURN expression. This statement can be used to terminate the script and optionally return the specified expression to the caller (whether this makes sense, depends on the script's purpose and is described in the other configuration chapters). Some examples: integer a,b; string s; a=5; b=2; // exit script if a is equal b if (a==b) return false; // loop 5 times a=5; loop { if (a<=0) break; a=a-1; } // chained if/else if (a==1) s="one"; else if (a==2) s="two"; else if (a==3) s="three"; else s="out of range"; Macros Since version 2.9.8.12, the scripting engine also supports macros. Macros are texts (usually consisting of one or more script statements) that are defined once in the section of the config and can then be inserted into any script by name. The sample config makes use of macros to avoid duplication of some lengthy scripts required in serveral different email datatypes. Defining Macros Macros are defined in the section using the tag. The macroname must be unique among all macros and is used to reference the macros in scripts. Like with scripts, using the XML bracket around the actual macro text prevents problems with special XML characters like <,> and & and is strongly recommended. Marco arguments New in 3.4: Macros can have up to 9 arguments. Use $1, $2 … $9 in the macro definiton as placeholders where arguments should be substituted. Using Macros Macros can be used (inserted) in scripts simply by a dollar sign followed by the macro name. See the following example: … other config tags … $MYMACRO d = c + 1; This is equivalent to the following script: integer a,b,c; a = b; c = b*5; d = c + 1; If the macro definition contains placeholders for arguments ($1,$2...$9), see  REF _Ref247357288 \r \h 6.12.2, the macro invocation should provide arguments in parantheses: … other config tags … integer b,f; $MYMACRO(7) // macro call with one argument Functions Functions are called using their name, followed by a comma-separated list of parameters in parantheses. Functions that have no parameters are called just with empty parantheses. Some functions return a value, which can be used in expressions: integer l; string s; timestamp t; // function that returns a value and has one parameter l = length(s); // function that returns a value and has no parameter t = now(); // function with more than one parameter l = find(s,"x",0); User defined Functions User-defined functions must be defined in the section of the config file using a tag for every function to be defined. The function definition starts with the type of the return value (if the function has a return value), followed by the function name, followed by a parameter list in parantheses, followed by a statement block that contains the function's code. Functions can return a value to the caller using the RETURN statement. The parameter list can be empty for functions without parameters, or contains one or multiple comma separated parameter declarations. A parameter declaration is like a variable declaration (see  REF _Ref42672298 \r \h 6.9.1) and consists of a type name followed by the parameter name. This declares a parameter that is passed by value (which means that the value specified when calling the function is stored in a local variable of the function, which can be modified by the function code, but does not affect any variables of the caller). Optionally, parameter passing can also be declared as "by reference" by preceeding the parameter name with an ampersand. This means that the caller of the function must specify a variable (rather than a constant or an expression) for the parameter. If the function code assigns a new value to the parameter, the caller's variable will be changed. Built-in Functions A number of useful functions are built into the script engine. They can be called exactly like user-defined functions. There are two types of built-in functions Global built-in functions: These are generally useful functions that are available in all scripts. See  REF _Ref42673942 \r \h 6.14 for a list. context built-in functions: These are special functions that are only available in a specific context. These functions are described along with the scripts where they are valid. See section  REF _Ref78023979 \r \h 0 for a list of all function names (global and context-specific). Global built-in Function Reference This section lists script functions that are available in all script contexts. Note that there are many more script functions available in some specific script contexts – these are described with the tag they apply to. See section  REF _Ref78023979 \r \h 0 for a list of all function names (global and context-specific). String functions integer XE "LENGTH" \f FLENGTH(expression): returns the length of expression. The result is the number of bytes in the string representation of expression. Note that due to UTF-8 encoding (multi-byte representation of characters outside 7bit ASCII range) the number of characters might be less than the number of bytes. Note that (unlike stated in earlier versions of this document) LENGTH cannot be used to determine the size of an array. Use SIZE() instead. integer XE "SIZE" \f FSIZE(var): returns the size of var. If varis an array, the result is the number of elements in the array. If var is a single value (a non-array or an array element), the result is the number of bytes in the string representation of var. Note that due to UTF-8 encoding (multi-byte representation of characters outside 7bit ASCII range) the number of characters might be less than the number of bytes. Note that SIZE cannot be used to determine the length of a string expression. User LENGTH instead. string XE "LOWERCASE" \f FLOWERCASE(string str): returns an all-lowercase version of str. string XE "UPPERCASE" \f FUPPERCASE(string str): returns an all-uppercase version of str. string XE "NORMALIZED" \f FNORMALIZED(string str): returns normalized version of str. Normalized has only a meaning for string-based types such as simple string (New in 3.1: normalized form is spaces trimmed off at start and end) telephone number (normalized form is number without all separator and spacing characters) or multiline (normalized form is text without leading or trailing empty lines and spaces). integer XE "FIND" \f FFIND(string str, string pattern, integer start): searches for first occurrence of pattern in str, starting the search at start (0=first character). Returns UNASSIGNED if pattern not found, otherwise returns the position of pattern in str (0=at the beginning) integer XE "RFIND" \f FRFIND(string str, string pattern, integer start): searches backwards for first occurrence of pattern in str before start (0=first character). Returns UNASSIGNED if pattern not, otherwise returns the position of pattern in str (0=at the beginning) string XE "SUBSTR" \f FSUBSTR(string str, integer start, integer count): returns substring of str which starts at position start in str and has at most count characters. string  XE "NUMFORMAT" \f F NUMFORMAT(integer num, integer digits [,string filler=" " [, string opts=""]]): formats the number specified in num as a string with digits number of digits or spaces. If digits is negative, the output is left justified, otherwise it is right justified. If filler is specified empty, no padding will occur, otherwise filler is used to pad unused space to make the result digit characters long. Opts can be set to '+' to force a positive sign to be shown, or to ' ' to force a space to be shown for positive numbers. With no opts, negative numbers are prefixed by a '-', positive number have no prefix. If optscontains 'x', the number is formatted in hexadecimal. string  XE "EXPLODE" \f F EXPLODE(string glue, &parts[]): returns the elements of the parts array passed concatenated as a string, elements separated by glue. integer  XE "PARSEEMAILSPEC" \f F PARSEEMAILSPEC(string emailspec, string &name, string &email): Parses emailspec as a RFC2822 email address and puts the descriptive name into name and the plain email address into email. string  XE "MAKEEMAILSPEC" \f F MAKEEMAILSPEC(string name, string email): Makes a RFC2822 email address out of name and email (quoting name if required). Regular Expression functions Note that regular expression support may not be compiled into all versions of the Synthesis SyncML engine, and therefore the following functions may not be available. The pattern string in the following functions can be of the "/rrrr/oo" form, where rrrr is the regular expression and oo are one or multiple options (i,m,s,x,U supported). Alternatively, a regex can be specified directly without delimiters, as long as it does not start with a /. Please refer to general documentation about regular expressions for information about how to work with regular expressions. The regular expression engine used in Synthesis SyncML engine is PCRE which is documented in the internet at  HYPERLINK "http://www.pcre.org/" http://www.pcre.org/. integer XE "REGEX_FIND" \f F REGEX_FIND(string subject, string pattern [, integer startat]): searches for first occurrence of pattern in subject, starting the search at startat (0=first character). Returns UNASSIGNED if no match is found, otherwise returns the position of where pattern matches in subject (0=at the beginning). integer XE "REGEX_MATCH" \f F REGEX_MATCH(string subject, string pattern, integer startat, string &matches[]): searches for the first match of pattern within subject, starting the search at startat (0=first character). Returns UNASSIGNED if no match is found, otherwise returns the position of the match. Additionally, the matches array will contain the entire matched string in its first element, and paranthesized subpattern matches within pattern in the subsequent elements. If a non-array is passed for matches, that variable is assigned either the entire matched string (if pattern does not specify subpatterns) or the first subpattern (if pattern does specify at least one subpattern). integer XE "REGEX_SPLIT" \f F REGEX_SPLIT(string subject, string separatorpattern, string &elements [, boolean emptyElements]): Splits subject into string elements and store them in elements. The string is split where separatorpattern matches in subject. If emptyElements is set to ture, elements consisting of nothing (i.e. two separators in succession) will be stored as such in elements, otherwise empty elements will be ignored. string XE "REGEX_REPLACE" \f F REGEX_REPLACE(string subject, string pattern, string replacement [, integer startat [, integer repeat]]): Replaces matches of pattern within subject with replacement. Pattern matching starts at startat in subject (default = 0) and continues repeat times (default = 0 which means all occurrences are replaced). Date and Time functions timestamp XE "NOW" \f FNOW(): returns the current time of the SyncML server in UTC. Note that the database time might not be fully in sync with this. Use DBNOW() if you need accurate database time. timestamp XE "DBNOW" \f FDBNOW(): returns database's current time in UTC. Note that calling this function will cause a database access, so use it with care to avoid performance degradation. timestamp XE "SYSTEMNOW" \f F SYSTEMNOW(): returns the current time of the SyncML server in the system's local time. Note: while this is usually a shortcut for CONVERTTOZONE(NOW(),"SYSTEM"), there might be implementations that do not have time zone support at all. In these implementations, NOW() would not return a proper value, but SYSTEMNOW() will. XE "SLEEPMS" \f F SLEEPMS(integer milliseconds): suspends the current thread for the given number of milliseconds. Accuray depends on the platform, not all platforms support millisecond resolution for sleeping, so actual time might differ. timestamp XE "DATEONLY" \f FDATEONLY(timestamp ts): returns the date part of ts as a date-only value (which corresponds to a floating timestamp with a 0:00:00 time part). However, a date-only value has a special flag set to differentiate it from a timestamp, which is used for example when rendering time/date values in ISO8601 (for example, in the "autodate" conversion mode for vCalendar items, see  REF _Ref182995906 \r \h 10.3.4). timestamp  XE "TIMEONLY" \f F TIMEONLY(timestamp ts): returns the time part of ts as a time-only value (which is the number of time units since midnight). integer XE "ISDATEONLY" \f FISDATEONLY(timestamp ts); returns true (1) if tsis a date-only value. timestamp  XE "DURATION" \f F DURATION(timestamp ts): returns the timestamp as a duration. Duration timestamps are rendered in the ISO8601 duration format. The timestamp's internal value will not be affected by the conversion to duration format. timestamp  XE "POINTINTIME" \f F POINTINTIME(timestamp ts): returns the timestamp as a point in time. This is useful to convert duration timestamps back into timestamps that represent a point in absolute time, and are rendered in ISO8601 date/time format. The timestamp's internal value will not be affected by the conversion to a point in time. integer  XE "ISDURATION" \f F ISDURATION(timestamp ts); returns true (1) if tsis a duration value. integer XE "WEEKDAY" \f F WEEKDAY(timestamp ts): returns weekday of day represented by ts (0=sunday, 1=monday ... 6=saturday). integer XE "SECONDS" \f FSECONDS(timestamp ts): returns number of seconds corresponding to ts (which makes most sense if ts is a difference between two timestamps, that is, a duration). integer XE "MILLISECONDS" \f FMILLISECONDS(timestamp ts): returns number of milliseconds corresponding to ts (which makes most sense if ts is a difference between two timestamps, that is, a duration). integer XE "TIMEUNITS" \f F TIMEUNITS(integer seconds): returns number of time units (normally milliseconds, but can be another unit depending on platform capabilities) corresponding to the specified number of seconds. Time units can be added or subtracted from time stamps. integer XE "DAYUNITS" \f F DAYUNITS(integer days): returns number of internal time units (normally milliseconds, but can be another unit depending on platform capabilities) corresponding to the specified number of days. Time units can be added or subtracted from time stamps. integer XE "MONTHDAYS" \f F MONTHDAYS(timestamp date): returns number of days of the month date is in. integer XE "ALLDAYCOUNT" \f F ALLDAYCOUNT(timestamp start, timestamp end [, boolean checkinusercontext [, boolean onlyutcinusercontext]]): This functions examines the start and end timestamps to check if these represent an all-day event, and if so, how many days it spans. This function is designed to operate on vCalendar 1.0 and iCalendar 2.0 DTSTART and DTEND values, and takes into account that in vCalendar 1.0 All-day events cannot be represented as such, but just as events starting at midnight, and ending at next midnight or 23:59. If the result is 0, start and end do not specify an all-day event, otherwise, the result is the number of days. The input timestamps must be in the context in which they are to be checked for midnight, 23:59:xx etc. except if checkutcinusercontext ist set. If so all non-floating timestamps (onlyutcinusercontext = false) or all UTC timestamps (onlyutcinusercontext = true) will be converted to user time zone before checking for all day boundaries. XE "MAKEALLDAY" \f F MAKEALLDAY(timestamp &start, timestamp &end [,integer days]): This function is designed to adjust start and end suitable for using it with the "autodate" and "autoenddate" conversion modes (see  REF _Ref182995906 \r \h 10.3.4). If days is omitted or set to <=0, the difference between end and start determines the number of days. If days is set to >0, the input value of end is ignored, and an all-day of days days length is created starting at start. On input, timestamps must already represent local day times. On output, the timestamps are made floating. timestamp XE "RECURRENCE_DATE" \f F RECURRENCE_DATE(timestamp start, string rr_freq, integer interval, integer fmask, integer lmask, boolean occurrencecount, integer count): Returns the date of the countth iteration of a recurrence rules. If occurrencecount is true, the countth occurrence is calculated, otherwise the countth repetition of the entire rule interval (the latter is relevant for vCalendar 1.0 RRULE #n repetition value). See  REF _Ref36890908 \r \h 10.6 for a description of the start, rr_freq, interval, fmask and lmask parameters. integer XE "RECURRENCE_COUNT" \f F RECURRENCE_COUNT(timestamp start, string rr_freq, integer interval, integer fmask, integer lmask, boolean occurrencecount, timestamp occurrence): Returns the count of a given occurrence date relative to the beginning of a recurrence rule. If occurrencecount is true, the count returned is the occurrence count, otherwise it is the repetition count of the entire rule interval (the latter is relevant for vCalendar 1.0 RRULE #n repetition value). See  REF _Ref36890908 \r \h 10.6 for a description of the start, rr_freq, interval, fmask and lmask parameters. If no recurrence count can be calculated for occurrence, the function returns UNASSIGNED. string  XE "MAKE_RRULE" \f F MAKE_RRULE(boolean rrule2, string rr_freq, integer interval, integer fmask, integer lmask, timestamp until): Creates a RRULE from the RRULE block parameters specified (see  REF _Ref36890908 \r \h 10.6 for a description of the start, rr_freq, interval, fmask, lmask and until parameters). If rrule2 is set to true, a iCalendar 2.0 style RRULE will be created, otherwise, a vCalendar 1.0 RRULE is returned. boolean XE "PARSE_RRULE" \f F PARSE_RRULE(boolean rrule2, string rrule, timestamp start, string &rr_freq, integer &interval, integer &fmask, integer &lmask, timestamp &until): Parses a RRULE string into RRULE block parameters specified (see  REF _Ref36890908 \r \h 10.6 for a description of the rr_freq, interval, fmask, lmask and until parameters). If rrule2 is set to true, a iCalendar 2.0 style RRULE is expected in rrule, otherwise, a vCalendar 1.0 RRULE is expected. The start parameter must be set to the starting point of the recurring calendar entry. The function returns true if rrule could be successfully parsed, false otherwise. integer XE "ISRELATIVE" \f FISRELATIVE(timestamo ts): No longer supported in 3.1. Usually ISFLOATING() provides the same functionality, but please read  REF _Ref204926421 \r \h 5.1 about the general changes in the way timestamps are represented in 3.1 vs. 3.0. XE "SETRELATIVE" \f FSETRELATIVE(timestamp &ts): No longer supported in 3.1. Usually SETFLOATING() provides the same functionality, but please read  REF _Ref204926421 \r \h 5.1 about the general changes in the way timestamps are represented in 3.1 vs. 3.0. timestamp XE "LOCALIZEDASUTC" \f FLOCALIZEDASUTC(timestamp ts): No longer supported in 3.1. The functionality itself is no longer needed as the new 3.1 way of representing timestamps (see  REF _Ref204926421 \r \h 5.1) makes it obsolete. integer XE "LOCALZONEOFFSET" \f FLOCALZONEOFFSET():No longer supported in 3.1. Replacements are usually USERTIMEZONE() or TIMEZONE(SYSTEMNOW()). timestamp XE "RELATIVEASUTC" \f FRELATIVEASUTC(timestamp ts): No longer supported in 3.1. The functionality itself is no longer needed as the new 3.1 way of representing timestamps (see  REF _Ref204926421 \r \h 5.1) makes it obsolete. XE "SETZONEOFFSET" \f FSETZONEOFFSET(timestamp &ts, integer zoneoffset): No longer supported in 3.1. Usually SETTIMEZONE() provides the same functionality, but please read  REF _Ref204926421 \r \h 5.1 about the general changes in the way timestamps are represented in 3.1 vs. 3.0.. timestamp XE "UTCASRELATIVE" \f FUTCASRELATIVE(timestamp ts): No longer supported in 3.1. The functionality itself is no longer needed as the new 3.1 way of representing timestamps (see  REF _Ref204926421 \r \h 5.1) makes it obsolete. Time zone related functions Some of the time zone related functions have a timezonespec parameter. This parameter specifies a time zone in one of the following ways: when a timestamp type is passed, the time zone is copied from the specified timestamp. when a integer type is passed, the time zone is set to the given number of seconds east of GMT/UTC when an empty value or the string value "FLOATING" is passed, the result is no time zone (i.e floating timestamp). when a string value of "USERTIMEZONE" is passed, the current user time zone (see  REF _Ref185257870 \r \h 5.2) is used. when a string value of "SYSTEM" is passed, the current system time zone is used. when a string value beginning with "BEGIN:VTIMEZONE" is passed, it is paresed as a timezone specification in vTIMEZONE format. when the string value names one of the defined zone names (see list in chapter  REF _Ref185261956 \r \h 17), the corresponding zone is used. finally, the string can specify a time zone offset specified in ISO8601 format. Script functions that return a timezonestring either return: the name of the time zone (see list in chapter  REF _Ref185261956 \r \h 17) as string an empty string for floating timestamps a time zone offset in ISO8601 format for fixed UTC offset time zones timezonestring XE "TIMEZONE" \f F TIMEZONE(timestamp atime): returns the time zone associated with atime. string XE "VTIMEZONE" \f F VTIMEZONE(timestamp atime): returns the time zone associated with atime formatted as a vTIMEZONE entry. XE "SETTIMEZONE" \f F SETTIMEZONE(timestamp &atime, timezonespec zone): sets the time zone of atime to the specified zone. Note that the local time value of atime does not change (which means that the absolute time value changes by the difference of the old and new time zone). integer XE "ISFLOATING" \f F ISFLOATING(timestamp ts); returns true (1) if tsis a floating timestamp (i.e. a timestamp not associated with a time zone). XE "SETFLOATING" \f F SETFLOATING(timestamp &atime): this is a shortcut for SETTIMEZONE(atime, "FLOATING"), and removes time zone information from atime, thus making atime a floating timestamp (not associated to any time zone). string XE "USERTIMEZONE" \f F USERTIMEZONE(): returns the current user time zone (see  REF _Ref185257870 \r \h 5.2), as set by SETUSERTIMEZONE() or . The default is "SYSTEM". XE "SETUSERTIMEZONE" \f F SETUSERTIMEZONE(timezonespec tz): sets the user time zone (the time zone context used to evaluate local time specifications which do not include an originating time zone information, see  REF _Ref185257870 \r \h 5.2). The default user time zone can be configured using (see  REF _Ref204922935 \r \h 11.22) and defaults to "SYSTEM". timestamp XE "CONVERTTOZONE" \f F CONVERTTOZONE(timestamp atime, timezonespec zone [,boolean doUnfloat]): returns atime converted to the specified zone. This means that the absolute value (UTC time) of the result will be the same as that of atime, but represented in a different time zone and therefore having a different local time value. A special case are floating time stamps – these cannot be actually converted to a different time zone, as they have no zone to begin with. If doUnfloat is set to true, floating time stamps will be made local time of the specified zone, without changing their time value. Otherwise, floating timestamps will be returned as-is. timestamp XE "CONVERTTOUSERZONE" \f F CONVERTTOUSERZONE(timestamp atime [,boolean doUnfloat]): this is a shortcut for CONVERTTOZONE(atime, "FLOATING", doUnfloat), and returns atime converted to the current user time zone. integer XE "ZONEOFFSET" \f FZONEOFFSET(timestamp ts): returns offset in number of seconds, east of UTC/Greenwich of ts. If ts is a floating timestamp, this function will return UNASSIGNED. Debug log functions XE "DEBUGMESSAGE" \f FDEBUGMESSAGE(string message): writes message to the debug log. Note that these messages are only shown in the log if the "hot" option in (see  REF _Ref42675268 \r \h 8.11.2) is enabled.  XE "DEBUGSHOWITEM" \f F DEBUGSHOWITEM(boolean refItem): In scripts that have access to a data item (a collection of fields as defined in a field list, see  REF _Ref47156991 \r \h 6.9.3), this function can be called to dump the contents of the data item into the log file (if the debug options are set such that user data can be shown in logs at all, see "userdata" option in  REF _Ref42675268 \r \h 8.11.2). For scripts that operate on two data items (for example: , see  REF _Ref204932692 \r \h 10.5.12), setting refItem to true shows the reference item (depending on the context, also called "loosing" or "old" item) instead of the normal (sometimes called "winning") item. XE "DEBUGSHOWVARS" \f F DEBUGSHOWVARS(): This dumps a list of all local variables of the current script and their current values to the debug log. integer XE "GETDEBUGMASK" \f F GETDEBUGMASK(): returns the currently active debug options for the current sync session as 32 bit integer value representing flags for each possible debug option, see  REF _Ref47170147 \r \h 8.11. This is useful to temporarily change the debug options in a script (see SETDEBUGOPTIONS and SETDEBUGMASK) and later restore the original options. XE "SETDEBUGMASK" \f F SETDEBUGMASK(integer mask): should be used only to restore a debug channel configuration previously saved from GETDEBUGMASK. To enable or disable debug channels, please use SETDEBUGOPTIONS. XE "SETDEBUGOPTIONS" \f F SETDEBUGOPTIONS(string optionname, boolean enable): This is the equivalent of the (when enable is true) and (when enable is false) tags in the section, see  REF _Ref42675268 \r \h 8.11.2. The same names that are valid for the "option" attribute in and can be used for optionname. XE "SETXMLTRANSLATE" \f F SETXMLTRANSLATE(boolean enable): This function allows switching on or off writing an XML transcript of the SyncML messages for the current session. This can be used for example in the (see  REF _Ref43727925 \r \h 11.33) to selectively switch on XML loggin based on device or user name. See in  REF _Ref203481904 \r \h 8.11.14 for details about the files created. XE "SETXMLTRANSLATE" \f F SETMSGDUMP (boolean enable): This function allows switching on or off dumping SyncML messages to files for the current session. This can be used for example in the (see  REF _Ref43727925 \r \h 11.33) to selectively switch on SyncML message dumping based on device or user name. See in  REF _Ref203481972 \r \h 8.11.15 for details about the files created. Other functions integer  XE "ABS" \f F ABS(integer value): returns the absolute of value. integer  XE "SIGN" \f F SIGN(integer value): returns the sign of value, that is, 0 if value is 0, 1 if value>0 and -1 if value<0. integer  XE "RANDOM" \f F RANDOM(integer range [, integer seed]): returns a random number between 0 and range-1. The optional seed can be specified to seed the random generator. string  XE "SYNCMLVERS" \f F SYNCMLVERS(): This function returns the SyncML version number (currently one of "1.0", "1.1" or "1.2") of the running session. This can be useful to implement version dependent behaviour.  XE "ABORTSESSION" \f F ABORTSESSION(integer statuscode): aborts the current session and reports statuscode as the reason for aborting the session. Note that statuscode can be 0 to abort silently. integer XE "COMPARE" \f FCOMPARE(value1, value2): returns 0 if value1 equals value2, -1 if value1 < value2, 1 if value1 > value2 and -999 if values cannot be compared. integer  XE "CONTAINS " \f F CONTAINS (&variable, value [, bool caseinsensitive]): returns 1 (true) if value is contained in variable. "Contain" means that value is a substring of variable, or in case value is an array,.it means that value is a substring of one of variable's elements. caseinsenstive can be set to make the comparison case insensitive.  XE "APPEND " \f F APPEND (&variable, value): appends value to the contents of variable. If variable is an array, appending means adding a new element. If value is an array, all elements of value will be appended to variable one by one. boolean  XE "ISAVAILABLE" \f F ISAVAILABLE(field): checks if field (which must be a field from the , see  REF _Ref42589436 \r \h 10.1, of the item processed in the current script's context) is explicitly available for the current sync. Explicitly available means that the remote's device information was received and contained a list of fields supported by the remote party. If this is the case, this function returns true or false. If a non-field (e.g. a script local variable) is specified for field, UNASSIGNED is returned. If a field is specified, but no explicit availability is known from the remote, the function returns EMPTY. This function is useful in and (see  REF _Ref206062819 \r \h 10.5.9) to format data differently depending on what fields are supported – for example including some data from unsupported fields into the description text.  XE "REQUESTMAXTIME" \f F REQUESTMAXTIME(integer maxtime): this allows to set the max time in seconds the server should spend processing a request before it should return an answer to the client. See in  REF _Ref70164511 \r \h 11.3 for details.  XE "REQUESTMINTIME" \f F REQUESTMINTIME(integer mintime): this allows to artificially delay server responses to be sent not earlier than mintime seconds after the request reached the server. See for details ( REF _Ref207622654 \r \h 11.4).  XE "FORCELOCALTIME" \f F FORCELOCALTIME(boolean flagvalue): this allows modifying the flag that is controlled by the directive in , see  REF _Ref54091188 \r \h 11.36.13.  XE "FORCEUTC " \f F FORCEUTC(boolean flagvalue): this allows modifying the flag that is controlled by the directive in , see  REF _Ref54091192 \r \h 11.36.14.  XE "SHOWCTCAPPROPERTIES" \f F SHOWCTCAPPROPERTIES(boolean flagvalue): this allows modifying the flag that is controlled by the directive (see  REF _Ref153773639 \r \h 11.25).  XE "ENUMDEFAULTPROPPARAMS" \f F ENUMDEFAULTPROPPARAMS(boolean flagvalue): this allows modifying the flag that is controlled by the directive (see ). string XE "LOCALURI" \f FLOCALURI(): returns the original URI used by the client to start the server session. string XE "REMOTERULENAME" \f FREMOTERULENAME(): returns the name of the active (see  REF _Ref42941679 \r \h 11.36) or EMPTY if no remoterule is active in the session. This can be used to implement device-specific behaviour. XE "SETREADONLY" \f FSETREADONLY(integer readonly): If readonly is set to TRUE, the session will be read-only (clients cannot apply any changes to the server's database). See also per-datastore read-only option in  REF _Ref45368759 \r \h 11.34.4 and per-datastore version of SETREADONLY in  REF _Ref55271118 \r \h 11.34.21. XE "SETDEBUGLOG" \f FSETDEBUGLOG(integer enabled): Enables or disables the session log for this session. XE "SETLOG" \f FSETLOG(integer enabled): Enables or disables logging this session's result in the log file/log table. any_type XE "SESSIONVAR" \f FSESSIONVAR(string varname): Returns the value of the session context variable varname (Session context variables can be declared for example in , see  REF _Ref43008951 \r \h 11.11). This allows to access context variables (see  REF _Ref42672298 \r \h 6.9.1) of the session's context from any script (and not only from those running in session context). This allows using session context variables as a kind of global variables. Note that accessing variables this way is less efficient (access by name needs string search) than normal variable references (access through precompiled index). If varname does not exists, UNASSIGNED is returned. XE "SETSESSIONVAR" \f FSETSESSIONVAR(string varname, value): Assigns a new value to the session context variable varname. integer  XE "SHELLEXECUTE" \f F SHELLEXECUTE(string command, string params, integer backgroundflag): Calls the operating system's shell to execute the command with the specified params. If backgroundflag is true, the shell process is started in background and SHELLEXECUTE immediately returns with result=0 (Note that background execution might not be available on all platforms!). Otherwise, SHELLEXECUTE waits until the shell command completes and then returns the exit code of the command executed. The exit code is operating system specific. In case that the command could not be started at all, SHELLEXCUTE returns -1. Note: using SHELLEXECUTE often makes the configuration file platform-dependent. Therefore, using the "platform" attribute (see  REF _Ref153284855 \r \h 4) is recommended in scripts using SHELLEXECUTE to make sure the script only runs on the right platform, or to provide multiple variants of the script for each platform. XE "SWAP" \f FSWAP(variable1, variable2): swaps the contents of variable1 and variable2.  XE "UPDATECLIENTINSLOWSYNC" \f F UPDATECLIENTINSLOWSYNC(boolean flagvalue): this allows modifying the flag that is controlled by the < updateclientinslowsync > directive in , see  REF _Ref45001933 \r \h 11.36.6.  XE "UPDATESERVEINSLOWSYNC" \f F UPDATESERVEINSLOWSYNC(boolean flagvalue): this allows modifying the flag that is controlled by the directive in , see  REF _Ref54091553 \r \h 11.36.7.  XE "TREATASLOCALTIME" \f F TREATASLOCALTIME(boolean flagvalue): this allows modifying the flag that is controlled by the directive in , see  REF _Ref54091119 \r \h 11.36.15.  XE "TREATASUTC" \f F TREATASUTC(boolean flagvalue): this allows modifying the flag that is controlled by the directive in , see  REF _Ref97961473 \r \h 11.36.16. string XE "TYPENAME" \f FTYPENAME(value): returns the name of the type of value. string  XE "ITEMDATATYPE " \f F ITEMDATATYPE (): returns the internal name of the datatype of the current item (only usable in context that are processing a data item at all). The datatype name is the name specified in the tag, see  REF _Ref231887961 \r \h 10.5 string  XE "ITEMTYPENAME " \f F ITEMTYPENAME (): returns the MIME type name of the datatype of the current item (only usable in context that are processing a data item at all). The datatype name is the name specified in the tag, see  REF _Ref231888133 \r \h 10.5.3 (or implicitly set by the basetype attribute of , see  REF _Ref231887961 \r \h 10.5) string  XE "ITEMTYPEVERS " \f F ITEMTYPEVERS (): returns the type version string of the datatype of the current item (only usable in context that are processing a data item at all). The datatype version is the name specified in the tag, see  REF _Ref231888133 \r \h 10.5.3 (or implicitly set by the basetype attribute of , see  REF _Ref231887961 \r \h 10.5) Debugging scripts Scripts can be debugged by switching on the "scripts" option in the directive (see  REF _Ref42675268 \r \h 8.11.2). This will cause that every script line processed to be shown in the debug log along with some information about the expressions evaluated and variables assigned (see "expressions" option in the directive for enabling more in-depth expression debugging). If you use HTML formatted logs, the script source will be colored gray for script lines that were skipped unexecuted due to flow control. Note that using this debug option not only can generate huge logfiles and degrades performance, but also needs slightly more memory per sync session as the script engine must keep the script source code in memory (when debugging is off, scripts are stored in a compressed, tokenized form only). When the "exotic" debug option is enabled as well, the script processing is logged in extensive detail – this is only recommended for hard core debugging. The script engine is designed for efficiency, and is not meant to be a general-purpose programming language, and therefore there is no real debugger available. If your scripts get too large and complicated to be debugged and tested with the simple debug log feature, you should probably re-think your application design in general. Scripts are provided to add more flexibilty to adapt SyncML to your application, but not to implement things that should be done in the application itself. If you feel that the adaption to your database exceeds what can be done reasonably with scripts, please consider using the plugin API for database adapters available in the PRO products. This allows you to separate all database access code into an external plugin project written in C, C++, Java or .net. See  REF _Ref135023442 \r \h 14 for details. Filters There are three types of Filters that can be used: Inclusive or Temporary Filter expressions: This type of filter defines conditions for content to be transmitted to a remote party, that is, included into the sync set (the set of items that are being synced). However, a inclusive filter does not exclude items from the sync set. This means that if for instance the client already contains items (from a previous sync session) that do not pass an inclusive filter, they will not be deleted on the client (in contrast, with a dynamic or static exclusive filter, see below, these would be deleted). In SyncML 1.0 and 1.1 terminology, these type of filters were called Target Address Filters (TAF), and can be specified as part of the database path using a CGI syntax. In SyncML 1.2 and later, these filters are called Inclusive Filters and are transmitted from client to server using the and SyncML elements in the CGI syntax (see  REF _Ref153291752 \r \h 7.4). Dynamic exclusive Filter expressions: These allow clients to request synchronizing only a subset of the database by specifying constraints. In Synthesis SyncML servers dynamic exclusive filters can be specified similar to TAF in the database path. This is a Synthesis-specific option and not part of the SyncML standard. An events path could look like "./events?/fi(DTSTART>20030630T000000Z)" which would restrict the sync set to events starting after July 2003. In SyncML 1.2, the and SyncML elements are used to specify exclusive filters in the CGI syntax (see  REF _Ref153291752 \r \h 7.4). Synthesis SyncML servers still support the SyncML 1.1 methods (TAF and /fi, even for SyncML 1.2). Static Filter expressions used in the config file: Filters are also used internally, for example to split a common "calendar" database into "events" and "tasks" or to implement visibility control for records based on a special database field or the type of device connected (as an example some devices cannot handle dates before a certain date, so these can be filtered out by setting a static filter. See the sample config files for examples. The inclusive filters are simply applied just before sending data to the client – only data passing the filter is included, other data it is just ignored and not sent to the client. The term dynamic is used with exclusive filters to specify that the filter might change between sync sessions and therefore some records which were filtered out (= excluded) in one session get visible in the next session and vice versa. Dynamic filters can put considerable load to the SyncML server as applying them might require the server to load all records from the database instead of the changed ones. However, if the dynamic filter is such that it can be translated to a SQL WHERE clause, the performance penalty is much smaller (see in  REF _Ref69052620 \r \h 12.20.9). A static filter is a filter that is guaranteed not to change between sync sessions with a particluar device, such as filter specified in the server configuration or set depending on the device that is being synced. Static filters are much more efficient because only those records that have changed or added need to be filtered. There is one important reason why the Synthesis SyncML engine supports filters in parallel with scripting (which might look like the same thing was implemented twice): The filter syntax is such (much simpler than script expression syntax) that the SyncML engine can translate most filter expressions directly to SQL WHERE clause expressions. This is a huge performance benefit, because this way, only needed data gets fetched from the database at all (while otherwise, as explained above for dynamic filters all records need to be fetched from the database only to be checked against a filter. This might be needed for complex situations where a filter is not flexible enough (see in  REF _Ref46904847 \r \h 10.5.10), but should be avoided whenever possible. Test and Make-Pass modes Filters are used by the SyncML engine in two modes: Test Mode: This is the normal mode, and means that a filter expression is applied to a data item, which gives a result of true (item passes) or false (item does not pass). Make-Pass Mode: Sometimes, the engine must make sure that an internally generated item will pass a certain filter. In this case, the filter expression is applied to the data item first like in test mode, and if the result is true, nothing more happens. If the result is false (item does not pass), the assign-to-pass modifiers (see below,  REF _Ref46823382 \r \h 7.2) in the filter expressions are applied from left to right until the data item passes the filter. Basic filter syntax The filter syntax might look a little unusual - however it is modeled after the TAF (Target Address Filter) syntax proposed by the SyncML standard for the temporary filters. The SyncML standard does not specify dynamic or static filters, but we use the same syntax (with some extensions) for all three filter types. A filter expression either consists of a single filter term or multiple filter terms concatenated with logical operators. Logical operators are: & (and), | (or). Note that there is no "NOT" operator. A filter term consists of a filter expression enclosed in parantheses or of an identifier followed by a comparison operator followed by a constant. A identifier is usually the name of an property or header field in a content format like vCard or RFC2822 email, but can also directly reference internal fields from the . There are also a number of predefined special identifiers. Details see  REF _Ref153288035 \r \h 7.3. Comparison operators are the usual =,<>, >, <, >=, <=. In addition % means "contains" and $ means "does not contain" (for strings). Comparison operators can be preceeded by three optional prefix characters, only in the following order: a colon, called the assign-to-pass modifier, which means "assign to make true". This modifier is ignored in test mode (see  REF _Ref47262189 \r \h 7.1), but used when by the sync engine in make-pass mode (when it needs to make a data item pass a filter and signals that assigning the value on the right of the operator to the field on the left of the operator will make the filter term evaluate to true). Note that, obviously, this makes only sense for comparisons where such an assignment actually makes the expression true: "FIELD := 2" will assign the value 2 to FIELD, which makes the comparison FIELD=2 true. However, "FIELD :<> 2" will not work, as assigning 2 to FIELD will obviously make the expression evaluate to false. an asterisk, which means that the following constant is a special value (see below). a '^' character, which makes the comparison case insensitive. Constants are string representations of the values to be compared. For strings, this is simply the characters the string consists of (no quotes around the string, no "&" or "|" or ")" might be contained). Numbers must be entered as decimal integers. Date and time values must be entered in ISO8601 format (yyyymmddThhmmssZ, for example 20030724T120000Z). If the Comparison operator  is immediately preceeded by an asterisk, the Constant is treated as a special value: E meaning "empty" or N meaning "not assigned". A few examples: FIELD:*=E Means: test if FIELD is empty. If the sync engine needs to make a data item pass the filter, it will assign an empty value to FIELD. FIELD:>=2 Means: test if FIELD greater than or equal 2. If the sync engine needs to make a data item pass the filter, it will assign the value 2 to FIELD. FIELD^=a simple text Means:case insensitive test if FIELD contains the string "a simple text" ("A Simple Text" would match as well, as the comparison is case insensitive). There is no colon prefix, so the sync engine will not assign anything to FIELD even in case a data item needs to be made pass the filter (which means that the item cannot be made pass the filter, if the shown filter term is the entire filter expression). FIELD1*=E|FIELD2:=4 Means: test if FIELD1 is empty or FIELD2 equals 4. If the sync engine needs to make a data item pass the filter, it will assign 4 to FIELD2, but only if FIELD1 is not empty - otherwise the expression is already true without modifying anything. Identifiers in filters Filter identifiers reference values that are to be compared. The following identifiers can be used in filter expressions: a property name: for MIME-DIR based formats like vCard and vCalendar, properties of the format (like TITLE, DTSTART, SUBJECT, etc) can be referenced directly by name. a header line name: for textprofile-based formats like email, named headers like "Cc", "From", "To" can be referenced directly. a filter keyword: textprofile and dataobj based formats allow defining keywords for some headers and content fields. a field name from the : This gives direct access to the value of an internal field. This is useful e.g. to access elements of multi-value properties like N or ADR in vCard. To make sure an identifier is used to access the field list (and not a predefined special identifier), it can be prefixed by "F.", like "F.N_FIRST". for vCalendar: START, END – these are aliases for DTSTART and DTEND. for vCard: FAMILY, GIVEN – these are aliases for the lastname and firstname components of the N property. for vCard: GROUP – this is an alias for the CATEGORIES property. LOCALID – this means the local identifier (e.g. database key) of an item. REMOTEID – available in servers only. This means the identifier the client uses for a certain item. GUID –available in servers only. This is equivalent to the server's LOCALID. LUID or &LUID;– in a server, this is equivalent to REMOTEID, in a client it is equivalent to LOCALID. SINCE, BEFORE – these can only be used in CGI filters and SyncML DS 1.2 , but not in static filter expressions in the configuration file. These are pseudo-identifiers for defining a date range filter. SINCE&EQ;20061206T120000&AND;BEFORE&EQ;20061231T090000 for example means the range from December 6th 12PM to December 31th 9AM, 2006. See also /dr() below. MAXSIZE, MAXCOUNT – these can only be used in CGI filters and SyncML DS 1.2 , but not in static filter expressions in the configuration file. These are pseudo-identifiers for defining a maximum item size (in bytes) or a maximum item count, resp. See also /limit() and /max() below NOATT - this can only be used in CGI filters and SyncML DS 1.2 , but not in static filter expressions in the configuration file. Setting this equal to 1 (or "true" or "yes") suppresses attachments. See also /na below. DBOPTIONS – this can only be used in CGI filters and SyncML DS 1.2 , but not in static filter expressions in the configuration file. It can be used to pass a string of implementation specific DB options. See also /o () below. CGI Filter Syntax When filter expressions are passed in the database path for SyncML 1.0 and SyncML 1.1, or when passing them via the element in SyncML 1.2, they must be formatted like CGI parameters. The Synthesis SyncML engine also accepts most of the operators literally (useful when entering in phone clients with difficult input methods) , however to follow the SyncML standard, the following entities must be used: &EQ; = equal (case sensitive) &iEQ; ^= equal (case insensitive) > > greater than (case sensitive) &iGT; ^> greater than (case insensitive) &GE; >= greater or equal (case sensitive) &iGE; ^>= greater or equal (case insensitive) < < less than (case sensitive) &iLT; ^< less than (case insensitive) &LE; <= less or equal (case sensitive) &iLE; ^<= less or equal (case insensitive) &NE; <> not equal (case sensitive) &iNE; ^<> not equal (case insensitive) &CON; % contains (case sensitive) &iCON; ^% contains (case insensitive) &NCON; $ does not contain (case sensitive) &iNCON; ^$ does not contain (case insensitive) & & and &AND; & and &OR; | or &LUID; is an alias for the LUID identifier. &NULL; can be used as value and means "no value" or "empty value". &UNASSIGNED; can be used as value and means "no value assigned". In addition, in the value part of a filter term (the part following after the operator), a % sign followed by two digit hex number is interpreted as the the character with the ASCII-code or UTF-8 sequence element corresponding to the hex number, to allow including any char into values. Therefore, the following two filter expressions are synonymous: FIELD1*&EQ;&NULL;∨FIELD2:&iEQ;test FIELD1*=E|FIELD2:^=test Special options in CGI filters passed with database path As the SyncML 1.0 and 1.1 standards only provide TAF filters (temporary inclusive filters), Synthesis SyncML engine also parses some special options in the CGI to allow for additional flags and for differentiating between excklusive and inclusive filters: /dr(-before,after) This specifies a date range relative to today, starting before days before today and ending after days after today. Note that actually implementing a date range filter for a datastore in a server needs scripting (see in in  REF _Ref46821357 \r \h 10.5.4). Alternatively, the SINCE and BEFORE pseudo-identifiers can be used for defining a absolute date range, see  REF _Ref153288035 \r \h 7.3. /li(kbytes) This specifies a limit for example when dealing with possibly large data objects such as email. Note that actually implementing a limit for a datastore in a server needs scripting (see in in  REF _Ref46823145 \r \h 10.5.11). Alternatively, the MAXSIZE pseudo-identifier can be used for defining a size limit. /o(string) This specifies an option string. The option string can be parsed in scripts, such as the to archieve special user-defined behaviour. Alternatively, the DBOPTIONS pseudo-identifier can be used for setting database options. /slow Server only: this forces a slow sync even if neither client nor server have requested it. This is useful for clients which have no GUI to force a slow sync (such as Nokia 9210) /na This specifies that no attachments should be transmitted to the remote party. This is useful for clients which cannot handle them to reduce traffic. Alternatively, the NOATT pseudo-identifier can be set to true to suppress attachments. /max(items) This specifies a limit for the number of items to be sent to the remote (for example how many of the most recent email messages are to be sent). Note that actually implementing a limit for a datastore in a server needs scripting (see in  REF _Ref55271118 \r \h 11.34.21). Alternatively, the MAXCOUNT pseudo-identifier can be used for setting the item count limit. /fi(filter expression) This option is provided to allow to specify dynamic filters (rather than temporary) in the CGI. /tf(filter expression) This option is provided to allow to specify temporary filters mixing other options with filters in the same CGI. If only a filter expression is used, it can be specified in the CGI without the /fi option. So the following two examples are synonymous: FIELD1=3 /tf(FIELD1=3) Note that while our own SyncML client products may provide user interface for these options, they work with any SyncML client that allows entering the database paths. Filters in the configuration Filters used in the configuration must always be specified in the basic filter syntax (see  REF _Ref46823382 \r \h 7.2 above). None of the extra GCI options are allowed (nor would they make sense) in filters in the configuration. For details, see the description of the filtering tags (such as etc.). General Global Configuration Options XE "licensename" \f T, XE "licensecode" \f T: License Contained in: Can contain: nothing Attributes: none Available: in non-demo versions These tags are used to enable the server or client according to a license purchased. Please fill in the license name and code you have received with your purchase of the product as shown in the following sample: joe tester joe@company.com 2HRY-23LU-45AG-ORN5 If license name and code are correct, the product will work according to what you have licensed. The license information affects the number of simultaneous connections a server can handle, see  REF _Ref47451551 \r \h 8.2. Note that there are permanent licenses (work forever) and time-limited evaluation licenses (stop working after a certain date). The license may also grant or deny access to some features, like using external plugin modules etc. XE "maxconcurrentsessions" \f T: concurrent sessions limit Contained in: Can contain: integer value Attributes: none Available: in evaluation version only Default: off This tag is available in some versions to specify how many simultaneous sync sessions the server will allow. Note that the upper limit is defined by what your license allows (see  REF _Ref47451589 \r \h 8.1).  XE "maxmsgsize" \f T : max SyncML message size Contained in: Can contain: integer value (number of bytes) Attributes: none Default: 20000 bytes for clients, 50000 bytes for servers. Usually there is no need to change the message size, but in rare cases (with implementations not respecting message size limits, or testing message size related features like chunking) this allows to set the maximum size. Note that the engine allocates twice the maxmsgsize per session in memory, so setting huge values here might cause memory shortage.  XE "maxobjsize" \f T : maximum object size Contained in: Can contain: integer value (number of bytes) Attributes: none Default: 4000000 bytes This tag determines maximum size an object (i.e. item, like a contact, a calendar entry etc.) can have. This is set to approx 4MBytes by default. If your application has larger data items to synchronize, this should be increased accordingly. Note that unlike with (see  REF _Ref203479102 \r \h 8.3), a high number here does not cause any memory usage per se. Memory is allocated only when actually needed for a large object.  XE "configidstring" \f T : text to identify config Contained in: Can contain: string Attributes: none This tag is useful to specify a string which is output to all debug log files and helps to identify what config file was in use for a particular session. It is recommended to put a text here that uniquely identifies your config version, such as "Config V2.7 for myserver.com, last edited by ME 2003-11-02".  XE "manufacturer" \f T : text to identify product manufacturer Contained in: Can contain: string Attributes: none Available: in Synthesis SyncML library products only This tag can be used to set the manufacturer string which will be transmitted to remote parties in the SyncML device information as . If this string is not defined or empty, "Synthesis AG" will be used. The actual manufacturer string can be read as a config variable (see  REF _Ref184460000 \r \h 4.4).  XE "model" \f T : text to identify model/product name Contained in: Can contain: string Attributes: none Available: in Synthesis SyncML library products only This tag can be used to set the model (product name) string which will be transmitted to remote parties in the SyncML device information as . If this string is not defined or empty, Synthesis' product name will be used. The actual model string can be read as a config variable (see  REF _Ref184460000 \r \h 4.4).  XE "configvar" \f T : define configuration variable Contained in: Attributes: name, value This tag can be used to define config variables (see chapter  REF _Ref203380577 \r \h 4 for general information about config variables) in the configuration file, and use the defined value in subsequent configuration sections using the $(varname) syntax. has the following attributes: "name": This name of the variable to define (or redefine), without leading $ and paranthesis. "value": The value (string) to assign to the variable. Note that if the "expand" attribute (see  REF _Ref184459204 \r \h 4.3) is specified before "value" and enables config variable expansion, $(varname) within the assigned string is expanded before assigning the value. Defining config variables in a config file is useful for things like base paths for logs, binary files, sqlite files etc.  XE "configvar" \f T : define configuration variable Contained in: Attributes: error, warning This tag can be used to cause a configuration parsing error. This is useful together with conditional attributes (see  REF _Ref203475251 \r \h 4.5), for example to generate an error message to the configuration error output path (usually the console stdout, or a special log file for servers - for syncml engine library also see "conferrpath" in  REF _Ref184460000 \r \h 4.4) when a configuration file is used with an unsupported platform. The available attributes are: "error": shows a config error (which makes startup of the sync application fail). "warning": shows a warning on the config error output (but does not fail startup). XE "scripting" \f T: Global scripting definitions Contained in: Can contain: , , Attributes: none This section contains global definitions for scripts contained in other sections. XE "function" \f T: User-defined function Contained in: Can contain: user-defined function, see  REF _Ref42675038 \r \h 6.13.1 Attributes: none This is used to define functions that then can be called from scripts in other sections of the configuration. See  REF _Ref42675038 \r \h 6.13.1 for description of function syntax. XE "macro" \f T: define macro Contained in: Can contain: script text to be used in other scripts, see  REF _Ref153282321 \r \h 6.12.1. Attributes: name This is used to define macros that then can be used in scripts in other sections of the configuration. See  REF _Ref153282321 \r \h 6.12.1 for details. The name attribute defines the macro's name, which is used to reference it in scripts, see  REF _Ref153282518 \r \h 6.12.3.  XE "looptimeout" \f T : maximum loop execution time Contained in: Can contain: maximum loop execution time in seconds, 0 for unlimited. Attributes: none Default: 5 (seconds) This is used to define the maximum time a loop statement (see  REF _Ref153285510 \r \h 6.11) in a script might take. This is to prevent sessions to completely hang in a scripting loop. XE "debug" \f T: Debug Option Section Contained in: Can contain: , , , , , Attributes: none This tag contains all options for debug logs. Since the 2.1 versions of the Synthesis SyncML engine, debug logging has been significantly enhanced. In 2.1, debug log files were simple plain text without much structure, and therefore somewhat hard to read. The new 3.0 engine has the following new options that make debug logs much more easily readable: Logs are now hierachically structured in indented blocks with timestamps at beginning and end. This groups all log output for a certain operation, item or message. Standard log format is now nicely colored HTML, which can be viewed in any web browser. Blocks can be collapsed/expanded while browsing (built-in Javascript). Links to jump between SyncML commands sent and status received are automatically added. Log writing is much faster, because it does no longer open and close the logfile for every log output line as in version 2.1. Alternative log formats are XML or plain text like in version 2.1, with or without indented blocks. XE "logpath" \f T: Directory path for debug log files Contained in: Can contain: full path to directory where to store log files Attributes: none Default: none (no debug output) This tag specifies the directory where all debug-related log files are stored. For the ISAPI and Apache versions, please make sure that the server process' user (normally called IUSR_xxx under IIS or something like "www-data" or "wwwrun" under Apache) has write access to this directory. Note that the "platform" attribute (see  REF _Ref153284855 \r \h 4) can be used to define different log paths for use on different platforms. Example: C:\sync\logs /var/log/syncml XE "enable" \f T, XE "disable" \f T Contained in: Can contain: nothing Attributes: option Default: by default, "normal" debug is enabled The option attribute specifies which type of information should be enabled or disabled for logging. There are a number of separate debug topic and category options, and some useful groups of multiple topics that can be selected with a single or tag. Separate debug topics: "error": error messages. The standard HTML formatting shows these in bold red. "hot" : most important information (of all topics). This should never be switched of (except when switching off debug logging completely). The standard HTML formatting shows important information in boldface, using the color of the debug topic related. "proto": SyncML protocol related information. The standard HTML formatting shows syncml protocol related information in olive. "session": Session management related information. No special formatting. "admin": Everything that has to do with administrative data (anchors, targets, map table). No special formatting. "data": Everything that has to do with handling user data (data objects). Actual user data will however be shown only if "userdata" option is on as well (see below). No special formatting. "remoteinfo": This shows information delivered in the remote party's device information, such as manufacturer name, datatypes supported, fields supported etc. The standard HTML formatting shows remote's device information related messages in grass green. "parse": This shows information related to parsing and processing incoming data from the remote party. Actual user data will however be shown only if "userdata" option is on as well (see below). The standard HTML formatting shows parsing related messages in dark green. "generate": This shows information related to generating outgoing data for the remote party. Actual user data will however be shown only if "userdata" option is on as well (see below). The standard HTML formatting shows generation related messages in dark blue. "transp": Shows transport (http and TCP communication) related information. Note that this type of log messages only appear in the global logs (see  REF _Ref153336229 \r \h 8.11.18). "syncml_rtk": Messages generated by the SyncML Toolkit code. "rest": Any other debug log message that does not fit in any of the above topics. Detail categories (these are combined with the topics above to determine the level of detail to be shown for the above topics): "userdata": Anything that is user data. To create anonymized logs that do not show user's data, disable this category (and, depending on the database interface, "dbapi" as well, as it might show SQL commands revealing user data as well). "dbapi": Information related to accessing the database. For ODBC, this enables showing SQL statements issued to the database, for plugin datastores, this includes all communication with the plugins and also messages generated by the plugin itself (see "plugin" below). The standard HTML formatting shows database API message in dark pink. "plugin": Messages generated by database adapter plugins. These are messages shows database plugin messages in mauve. "scripts": This is useful to debug scripts, and shows each line of executed scripts (but only for enabled debug topics!). Switching this on can generate huge log files, so it should normally be switched off in productive environments. The standard HTML formatting generally shows script execution in brown, but colorizes executed code in bright blue, comments in light green, conditionally skipped code in grey and expression results in red. "expressions": (New in 3.1) Together with "scripts" this causes detailed step-by-step logging of script expression evaluation. "filter": Information about data item filtering. The standard HTML formatting shows filter processing in light brown. "match": Information about matching data in slow sync. Note that together with "exotic" this can produce extremely large logs as matching is an O(N^2) operation, so use with care. The standard HTML formatting shows slow sync matching in a brownish orange. "conflict": Information about conflict resolution and data merging. The standard HTML formatting shows conflict resolution and data merge information in dark red. "details": Enabling this option adds generally some more detail to the debug output. "exotic": Enabling this adds the highest level of exotic detail possible. This is usually only required to track down device interoperability issues or bugs in the server/config. If "exotic" and "match" are both enabled, extremely large logs can be produced as all slow sync matching is shown in full field by field detail. Use with care! The standard HTML formatting shows exotic details in orange. Groups of multiple topics/categories "minimal": Just "error" and "hot" "normal": This is the default, and shows "hot", "error", "data", "admin", "proto" and "remoteinfo". This gives an overview what is happening during a sync, but no details and no user data. "extended": This shows extended info – almost everything except "script" and "exotic". "maximal": Everything switched on, including "exotic", however "match" is disabled because together with "exotic" it would produce enormously large logs. "db": Everything related to database access ("data", "admin", "dbapi", "plugin"). "all": Really everything. Should not be used normally with , but only for .. For compatibility with 2.1 version: "items": alias for "data". "cmd": alias for "proto". "devinf": alias for "remoteinfo". "dataconv": same as "parse" and "debug" together. Note that enabling and disabling is done in the order specified, so to enable extended debugging topics but no user data, specify:  XE "logformat" \f T : select log file format Contained in: Can contain: "html", "xml", "text" Attributes: none Default: "html" Selects the debug log format. Default is nicely colored HTML, but XML (useful for post-processing with XLT or other XML tools) and plain text (similar to version 2.1 logs) are possible.  XE "folding" \f T : dynamic folding for HTML logs Contained in: Can contain: "none", "collapsed", "expanded", "auto" Attributes: none Default: "auto" If not set to "none", HTML logs will contains some JavaScript to allow dynamically "fold" the block structure of the debug log. Every block can be collapsed or expanded individually. Using the "[++] and [--]" buttons on the right, a block and all of it's contained blocks can be expanded or collapsed with a single click.  The mode determines the initial folding state: "collapsed" means that all blocks are collapsed, "expanded" means that all are expanded and "auto" will have most blocks expanded, but some possibly lengthy, but for normal use not essential blocks will be shown collapsed. Please note that the find function in browsers only searches the visible part of a HTML document, so messages in collapsed blocks cannot be found. So if your log debugging mainly relies on searching in the browser, "expanded" is probably the best mode to make sure everything can be found. Alternatively, there is a button named "expand all" at the beginning of the log file which can be used to expand everything before using the browser's search function.  XE "timestamp" \f T ,  XE "timestampall" \f T : show timestamps in logs Contained in: Can contain: boolean value Attributes: none Default: true (for timestamp), false (for timestampall). These boolean flags control if start and end of each block () and every single log message () should be prefixed with the current date and time (including milliseconds, if platform supports it). This is useful to see where a lot of time is spent during processing of SyncML messages. Usually, timestamps at start and end of each block is sufficient (the default).  XE " showthreadid " \f T : show thread ID in logs Contained in: Can contain: boolean value Attributes: none Default: false for session logs, true for global logs. These boolean flags control if every log messge should be prefixed with the ID of the current thread.  XE "timedsessionlognames" \f T : show timestamps in logs Contained in: Can contain: boolean value Attributes: none Default: true. These boolean flags control if the name of session logs contain the date of creation in their name. With this option, session log files are of the form: pipe_odbc_20061211T150022_sXXXXXXXXXX.html (where XXXXXXX is the session ID). Otherwise, session log files ar simply named like pipe_odbc_sXXXXXXXXXX.html  XE "singlegloballog" \f T ,  XE "singlesessionlog" \f T : single file log option Contained in: Can contain: boolean value Attributes: none Default: false. These boolean flags can be set to true when all global or session-related logging should be written into a single file, rather than creating a new file for each start of the server or new session, resp. Note that in case of the session log, the flag (see  REF _Ref153612150 \r \h 8.11.9) controls if the file is overwritten for every new session (erasing the previous log) or if new information is appended to an existing file when is enabled.  XE "appendtoexisting" \f T : append or overwrite existing session logs Contained in: Can contain: boolean value Attributes: none Default: false. This flag controls if in mode (see  REF _Ref153612128 \r \h 8.11.8), an existing file is overwritten when a new session starts, or if new information is appended to the existing session log file. Note that the global log is always appended to.  XE "logflushmode" \f T : select log file format Contained in: Can contain: "buffered", "flush", "openclose" Attributes: none Default: "buffered" Selects how log information is written to the log file: "buffered" is the fastest mode – log file is only written when internal file buffer is full, that is ususally a few kilobytes at a time. This is the best mode for normal operation, but to debug crashes the contents of the internal buffer is lost when the application crashes, so the log will not show exactly where the crash occurred. In this case, use one of the other modes. "flush" is a good compromise between "buffered" and "openclose". The log file is kept open, but log information is flushed to the file after every log message, so even in case of a crash, the last message before the crash should be visible in the log file. Note however that using flush mode when writing logs to a network volume might degrade performance significantly. "openclose" is the slowest, but also safest mode for writing logs. The log file is opened for every log line to be written and then closed again. This mode was the only mode available in version 2.1.  XE " subthreadmode " \f T : if and how to show log output from subthreads Contained in: Can contain: "suppress", "separate" Attributes: none Default: "suppress" This determines how to handle debug output from simultaneously running subthreads of a session. Subthreads are created for loading the sync set (reading all items that are required in a sync session – in a slow sync this can be all items, so this can take a while, that's why this is done in a separate thread so the main thread can continue communicating with the clients to prevent them timing out). If is set to "suppress", debug output from these threads is discarded and not stored at all. If is set to "separate", a separate file is created for each thread, having the same file name as the main session log but with a "_xxxx" suffix (xxxx = thread ID). In HTML logs, the thread logs are linked from the main log at the point in the log where the subthread is started, which allows easy viewing.  XE "fileprefix" \f T ,  XE "filesuffix" \f T : text to add at begin and end of logfiles Contained in: Can contain: any text Attributes: none Default: standard prefix/suffix suitable for selected (see  REF _Ref153557607 \r \h 8.11.3) Here you can define the text that is inserted at the beginning and end of a log file. This can be used to use a custom style sheet for HTML instead of the built-in, or to reference a XLT for XML logfiles.  XE " indentstring " \f T : string to be used for indenting blocks Contained in: Can contain: any text Attributes: none Default: two spaces This string is used to indent messages contained in blocks visibly. For HTML and XML logs, this should be whitespace in all cases, but for text logs any character can be used. The indent string is inserted at beginning of lines once for every indendation level. XE "xmltranslate" \f T: show traffic in XML Contained in: Can contain: boolean value Attributes: none Default: off If set to on, incoming and outgoing messages (which are often in binary WBXML format) will be translated to XML format and written to the path specified with with the following file naming scheme: xxxx_sYYYYYYYYYY_trmNNN_MMM_outgoing.xml xxxx_sYYYYYYYYYY_trmNNN_MMM_incoming.xml Where "xxxx" is an identifier for the product being used such as "isapi_odbc" for Windows ISAPI version, "xpt_odbc" for the standalone versions, "pipe_odbc" for Apache based servers, "demo" for demo versions etc. YYYYYYYYYY is the internal session ID "trm" means "translated message" NNN is the SyncML message number MMM is a sequence number, which is just incremented for every message translation saved in a particular session. This is because sometimes messages are resent due to problems, so more than one dump with the same NNN value might exist. MMM ensures that these are saved in separate files. Note: This option should never be switched on permanently in productive environment, as it requires a lot of additional memory, degrades performance and can lead to problems when completely malformed messages are processed. It is only for debugging problems with specific SyncML clients. A good option in the PRO version is to use XML translation selectively – for example only for the first sync with a device. This is possible using the SETXMLTRANSLATE script function (see  REF _Ref153590626 \r \h 6.14.5) for example in the (see  REF _Ref43727925 \r \h 11.33). Example: on XE "msgdump" \f T: dump SyncML traffic to files Contained in: Can contain: boolean value Attributes: none Default: off If set to yes, messages received from and sent to client will be dumped 1:1 to files in the path specified with with the following file naming scheme: xxxx_sYYYYYYYYYY_msgNNN_MMM_outgoing.wbxml (or .xml) xxxx_sYYYYYYYYYY_msgNNN_MMM_incoming.wbxml (or .xml) Where "xxxx" is an identifier for the product being used such as "isapi_odbc" for Windows ISAPI version, "xpt_odbc" for the standalone versions, "pipe_odbc" for Apache based servers, "demo" for demo versions etc. YYYYYYYYYY is the internal session ID "msg" means "message", i.e. 1:1 dump of the actual message NNN is the SyncML message number MMM is a sequence number, which is just incremented for every message translation saved in a particular session. This is because sometimes messages are resent due to problems, so more than one dump with the same NNN value might exist. MMM ensures that these are saved in separate files. The file will usually have .wbxml suffix (WBXML is a binary, space saving encoding method for XML). These can't be viewed with a text editor (consider to save a XML translation along with the dumped original, see  REF _Ref203481633 \r \h 8.11.14) If the communication is in plain text XML, the dump files will have .xml suffix. Note: This option creates a lot of small files for each message of a session, usually dozens or hundreds per session, depending on the amout of data transferred. A good option in the PRO version is to use message dumping selectively – for example only for the first sync with a device. This is possible using the SETMSGDUMP script function (see  REF _Ref153590626 \r \h 6.14.5) for example in the (see  REF _Ref43727925 \r \h 11.33). XE "sessionlogs" \f T: generate session logs Contained in: Can contain: boolean value Attributes: none Default: yes If set to yes, Synthesis Sync Server writes session-specific logs. This is the normal case under almost every circumstance. XE "sessionlogs" \f T: No longer supported; use instead This tag is no longer supported in Version 3.x. Use instead (see  REF _Ref153612650 \r \h 8.11.8). XE "globallogs" \f T: generate global log Contained in: Can contain: boolean value Attributes: none Default: no If set to no, no global log is written. This is recommended for productive environments, as for one the global log can get very large quickly, and the information contained is only useful to track down very low-level problems on the data transport level. In addition, writing the global log is slow because it must always use "openclose" (see  REF _Ref153603854 \r \h 8.11.10) as multiple threads are writing to the session log.  XE "logsessionstoglobal" \f T : send session logs to global logfile Contained in: Can contain: boolean value Attributes: none Default: no If set to yes, session logs will be sent to the global log file instead of creating separate log files for each session. XE "configdate" \f T: set timestamp for config file Contained in: Can contain: date/time in ISO8601 format (yyyymmddThhmmss) Attributes: none Available: server only Default: none If this tag is specified, the server will assume that the last modification of the config file has happened at the date specified. Without this option, the server will use the file's modification date (as set by the operating system) to determine when the config has last changed. The date/time of last config change is needed by the server to determine if a client must be sent updated "devinf" - which is always the case when a client's last sync date is before the last change to the config. See also ( REF _Ref36888765 \r \h 8.13). XE "neverputdevinf" \f T: avoid PUT of devinf Contained in: Can contain: boolean value Attributes: none Available: server only Default: off If this tag is set to on, the server will never send its device information "devinf" to the client if not specifically asked (client sending GET command).  XE "systemtimezone" \f T <systemtimezone>: override local system time zone Contained in: <sysync_config> Can contain: time zone specification (see  REF _Ref185246210 \r \h ·ð) Attributes: none Default: system local time zone as retrieved from the operating system This can be used (usually required for testing only) to set the system time zone to a specific time zone rather than retrieving it from the operating system.  XE "definetimezone" \f T : define custom time zone as VTIMEZONE Contained in: Can contain: time zone definition in VTIMEZONE format (as specified in iCalendar, RFC 2445) Attributes: none This can be used to extend the built-in set of named time zones (see chapter  REF _Ref185261956 \r \h 17 for a list) by custom time zones specified in the VTIMEZONE format. Note that not all exotic features of VTIMEZONE as specified in RFC 2445 are supported). For general information on time zone handling please refer to chapter  REF _Ref185238094 \r \h 5. The following example shows how to define a new time zone named "ZUERICH" which is one hour east of UTC in winter and 2 hours east of UTC during daylight savings which is active since 1987 between last sunday in march and last sunday in october: XE "transport" \f T: Transport Configuration Section Contained in: Can contain: , Attributes: type This tag encloses all transport-related configuration. The "type" attribute is required and must have one of the following values: "xpt" for the standalone server (all platforms) "isapi" for the ISAPI-based server (Windows only) "pipe" for Apache/pipe based server (Linux, Mac OS X) Note that for SyncML Engine V 1.0.8.50 and later the config file is allowed to have multiple sections. All transport sections that do not match the server type (isapi, xpt or pipe) will simply be ignored (before V1.0.8.50, this caused a config error). The advantage is that you now can use the same config file for all type of servers - simply include a section for each type. This is handy to test config files for a production ISAPI or Apache server using the standalone server first, without the need to modify anything in the file before using it with the production version later. Example: HTTP 80 yes 0 200 XE "keepconnection" \f T: HTTP 1.1 connection Contained in: Can contain: boolean value Attributes: none Available: standalone and ISAPI server only Default: yes This tag is used to enable or disable HTTP 1.1 "keep alive" / "keep connection" feature. If set, the server signals the client to not close the HTTP connection for every request but re-use it until the entire sync session is done. Notes: Supporting keep-alive is important for synchronizing with mobile devices – these often can open only a limited number of connections in a given time frame. So it is essential not to re-open a connection for every SyncML request, but use a single connection for the entire session. In the Apache version of the server keep-alive cannot be controlled by the sync server config, but is a setting the apache configuration.  XE "bufferretryanswer" \f T : buffer last answer for retries Contained in: Can contain: boolean value Attributes: none Available: ISAPI server only Default: yes If this option is enabled, the server will buffer the last answer message sent for every session in progress. This will allow the server to re-send a message in case a client did not receive it and re-sends a particular request again. This can reduce probability for aborted sessions when the connection is not stable (as sometimes the case in mobile environments). However, it only works with clients that can actually resend messages in case of transmission problems. A few recent client implementation will do that (including the Synthesis clients for PocketPC and Palm), but many others don't. Note that switching this on will cause the server to require around 30-100k more memory per session in progress. XE "protocol" \f T: communication protocol Contained in: Can contain: protocol name Attributes: none Available: in standalone version only Default: HTTP This tag is used to specify the transport protocol to be used. The following options are supported (attention, these are case sensitive!): "HTTP" : This is the default and specifies HTTP (Web) protocol. "OBEX/IR": This works only under Windows 2000. It defines that the server is listening for connections on the infrared port. Note that most existing clients (even those devices that have builtin infrared) don't support SyncML over infrared yet. Synthesis Sync Client 1.1 however supports infrared connections (under Windows 2000). "OBEX/TCP": This is a very seldom used connection mode. Don't use it unless you have distinct reasons to use this instead of HTTP. XE "httpport" \f T: HTTP and OBEX/TCP server port number Contained in: Can contain: port number Attributes: none Available: in standalone version only Default: 80 This tag specifies the TCP/IP port number for the HTTP server or for the OBEX/TCP server. If no other HTTP (Web) server is running on the same machine, the default of 80 is best (standard HTTP port). Note that some older SyncML clients might have problems accessing servers on other ports than 80. For OBEX/TCP, this should normally be set to 650. XE "ipaddress" \f T: listener IP address Contained in: Can contain: IP address Attributes: none Available: in standalone version only Default: 0.0.0.0 (=all) This tag specifies the TCP/IP address for the HTTP server to listen. On machines with muliple IP addresses, this can be used to have the server listen on only one specific address instead of all (0.0.0.0) XE "obexservice" \f T: OBEX service name Contained in: Can contain: OBEX service name Attributes: none Available: in standalone version only Default: SYNCML-SYNC This tag is relevant only when is set to "OBEX/IR". It specifies the OBEX service name. This is conceptually similar to the HTTP port number. The default value of "SYNCML-SYNC" is the official standard service for doing SyncML over OBEX, so normally does not need to be specified. XE "maxthreads" \f T: Max number of session threads per server process Contained in: Can contain: number Attributes: none Available: Apache pipe based server only New in: Server version 3.0.2.0 Default: 0 This tag is used to control multi-threaded operation (multiple sessions run as threads within one single server process): maxthreads=0: single-threaded server, one process per sync session (default, and only mode available in servers before 3.0.2.0). maxthreads=1: only one session at a time per process, but after session finishes, server process keeps running and can process another session. maxthreads>1: multi-threaded server, can run the specified number of sessions in parallel threads. This is the recommended mode when starting a new server process is expensive in terms of memory or cpu, such as with Java based plugins (with a multithreaded server, the Java VM will be loaded only once for all sessions, in a single-threaded server, each session will instantiate a new Java VM). Note that for multithreaded operation, mod_sysync/mod_sysync2 must be updated to the version included with server 3.0.2.0 and later. Otherwise, the server will still work, but will use a new process for every session (as with older servers that have no multithread support). XE "maxsessionruns" \f T: Max sessions to be run by a process Contained in: Can contain: number Attributes: none Available: Apache pipe based server only New in: Server version 3.0.2.0 Default: 0 If set to >0, this is the max number of sessions a server process should run before exiting. This can be useful to make sure the server environment is restarted once in a while to avoid eventual memory leaks in plugins etc. to accumulate too much XE "datatypes" \f T: Data Type Definitions Contained in: Can contain: , , Attributes: none This section defines the content data types that are used in synchronisation. Most SyncML clients today support vCard (versions 2.1 and 3.0) and vCalendar (version 1.0). Of course Synthesis Sync Server supports these as well. However, it can do much more as it has a fully configurable parser/generator for MIME-DIR formatted data. So Synthesis Sync Server can be used with most MIME-DIR based formats (see RFC2425 for details about MIME-DIR). This allows you to customize existing formats like vCard and vCalendar exactly how you need them (they both allow a lot of variants depending on what information is required). In addition, you can define your own MIME-DIR based formats. To change or create datatype config, it is important to understand how Synthesis Sync Server's datatype architecture works. There are three basic building blocks, that are needed to build a datatype: A field list. Field lists are one-dimensional lists of data fields. For every possible value in a vCard, vCalendar or other MIME-DIR type, there should be an appropriate field in the field list. For plain text types (see below), a field list is also required. For example to store the vCard "N" property, the underlying field list should define 5 separate fields, as "N" contains 5 different name parts (first, middle, last names, suffix and prefix). Of course, if some of theses values are not relevant to your application, the field list does not need to include them. If your vCard should allow to repeat some values (such as 10 different telephone numbers), the underlying field list should provide a separate field for each repetition (and list them all in sequence) or use an array field (PRO version only, see  REF _Ref46747184 \r \h 10.2). A mime-dir or text profile. A mime-dir profile defines a format like vCard. Such a format is not just a list of values, but can also have the following features: it may contain structured values (like the "N" property), certain properties (such as "TEL" for telephone numbers) can occur more than just once certain properties can have attributes (e.g. LANGUAGE) that need to be stored in the database as well certain properties can have attributes (eg. TYPE) that qualify the contents of the property itself. For example, a "TEL" property having a "TYPE=WORK" attribute should be stored in another data field than a "TEL" property without an attribute. a profile can contain subprofiles (like VTODO and VEVENT are subprofiles of the VCALENDAR profile) All of these cases can be handled in the MIME-DIR profile configuration. A MIME-DIR profile always relates to an existing field list (see 1.), as it specifies which fields are used to store the information contained in a MIME-DIR object. Likewise, a text profile defines header fields and types in a text base format like email or notes. A datatype specification. A datatype specification finally defines a complete content type. It usually refers to a mime-dir or text profile to define the structure of the datatype, but provides some additional information such as the version of the datatype. It is a common case that the same profile is referenced by different datatypes: in the sample files, there is one generic "vcard" mime-profile, which is used in two datatypes "vcard21" and "vcard30" to provide the different versions of the vCard type. Datatypes are finally referenced by datastores in the section (see " REF _Ref5709751 \r \h 11.34.11") to make them available for accessing a datastore. XE "fieldlist" \f T: internal data field list Contained in: Can contain: Attributes: name A field list defines all data fields used by a certain data type. The name attribute is required to give the field list a name under which it can be referenced later in MIME-DIR profile definitons (see " REF _Ref6058882 \r \h 10.3") and mapping lists (see " REF _Ref6029952 \r \h 11.34.41"). For each field, the must contain a tag (see below). Note that the names of the fields are used internally only and need not to be the same as the fields in your database. To associate fields from a field list with actual database fields, the tag in (see " REF _Ref6029971 \r \h 11.34.41") is used. XE "field" \f T: definition of an internal field Contained in: Can contain: nothing Attributes: name, array, type, compare, age, merge The tag has the following attributes: "name": this is the internal name of the field. This name is used to reference the field in MIME-DIR-profiles and tags, but it needs not to be the same as the database's field name (but of course, it can have the same name). "array" (PRO versions only): if this is set to true, the field is created as an array and will be able to store a list of values of the type specified in "type". This can be useful for storing values that can occur more than once in a record (such as EXDATE in vCalendar). "type" specifies the field's type: "string" : string field. "multiline" : string field, but intended for use with strings that consist of multiple lines. Comparisons of multilines ignores leading or trailing line ends. "telephone": This is like string, except that when comparing two telephone fields, only the following characters are compared: 0..9, *, # and +. So, the following two telephone values will be considered equal: "+ 41 1 440 66 00" and "+4114406600". The reason for using telephone fields is that some clients do store telephone numbers including formatting spaces, some other clients don't. "url": This is like string, except that it is intended to store an URL. To allow the widespread habit of entering WWW URLs without the "http://" prefix, this field type automatically adds the "http://" if no other service specifier (such as "ftp://") is specified. "timestamp" : date and/or time field including time zone context information (see chapter  REF _Ref185238094 \r \h 5 for details about timestamps and time zone handling).Standard string representation is ISO8601 (useful for all combined date and time values in vCard and vCalendar). Depending on the context, other string representations are used (like RFC822 in emails). See chapter  REF _Ref185238094 \r \h 5 for general information about timestamps and timezones. "date" : date-only value. The only difference to "timestamp" is that the output is always a date-only value. On input, it can be assigned date and combined date/time values. Standard string representation is ISO8601 (useful for date-only values like BDAY in vCard). Depending on the context, other string representations are used (like RFC822 in emails). . See chapter  REF _Ref185238094 \r \h 5 for general information about dates and timezones. "integer" : Integer number (64 bit for servers and most clients, could 32 bit on some limited client platforms). "blob": This is a "binary large object" and can be used to store any chunk of binary data. This is useful for contact pictures or email attachments. "compare": This attribute controls how fields are compared in sync conflict, slow sync and first time sync cases. Note that in slowsync, only actually assigned (that is, transmitted) field values are compared, whereas when resolving conflicts during normal sync, all fields supported by both server and client are compared. "never": field is not compared at all. This is for fields that do not contain user data, such as "REV" in vCard. It would not make sense to compare these fields, as they are not relevant for finding out if two objects have the same data or not. "conflict": field is compared only when a sync conflict occurs (that is, when both client and server have modified versions of the same object). This mode should be set for all fields that contain user-entered data and which do not use "slowsync" or "always", see below. "slowsync": field is compared in conflict case (like "conflict"), but in addition, it is also compared during slow-sync to match client objects with existing server objects. Therefore, "slowsync" should be set only on data fields that are important for identifying objects (such as name, company, country, but probably not details that might differ in server and client like telephone numbers, notes etc.). Setting too many fields to "slowsync" carries the risk of creating duplicates during slow sync, because the matching criteria is too tight and small differences between client and server versions of a data record will prevent them to match. "always": field is always used in comparisons, not only in conflict and slow-sync cases, but also in "first time sync" case. This is the special case when a client and a server perform sync for the first time. This is different from slow-sync as in a first-time sync situation, it is often desirable to have relatively loose matching criteria (for example only compare first and last name) to match and union server and client objects. Use this only for fields that are absolutely essential for identifying an object. "age": This optional attribute can be set to "yes" for fields that are relevant in age comparison (i.e. finding out which one of two objects is more recent). If more than one field has the "age" attribute set, the fields that are defined first have precedence when comparing. In vCard, this attribute is normally used for the "REV" field, in vCalendar for the "DATE-MODIFIED" field. If a format does not have a timestamp value that can be used to compare ages, no field must have the "age" attribute set. Note that for fields with "age" set, compare mode should be "never" normally. "merge": This optional attribute is used to define a merging mode for the field. Merging is used when resolving conflicts, that is when two versions of the same object exist and must be unified into one without loosing data. The following merge modes are available: "no" : do not use merge with this field (this is the default when a field has no "merge" attribute. "fillempty": If a field is empty in one object and has a value in the other one, the value is copied to the object which has no value. Note that this implies that "more data is better than no data". While this is a sensible strategy in most cases, there might be cases where this is not the case. "addunassigned": This is like "fillempty" with the following difference: a value is only copied if it has a value in one object and does not exist at all in the other object. A value not existing is different from an empty value. For example, a vCard that includes an empty "TEL" property is explicitly saying: "there is no telephone number at all". A vCard that does not include a "TEL" property is saying "there is no telephone number stored yet". So in the second case it is ok to supply a telephone number once one gets available, while in the first case it might be unwanted to fill in one against the explicit statement of the sender that there is none. This is what "addunassigned" is for. "lines": This is very useful for multi-line fields (like NOTE in vCard). If field values differ, they will be merged on a line-by-line basis as follows: the resulting value will have all lines from both objects, but without duplicating identical lines. So, if one object has just a new line appended to the original note field, this line will simply be added to the other object as well. any single character (for example a comma, or space or any other): This works like the "lines" option, but instead of operating on lines, it operates on values separated by the specified character. "append": If a field's value is different between the two objects, the contents of both fields will be concatenated to build a new field value for both objects. For example, if one field contained "this", and the other "that", after conflict resolution both objects will have the value "thisthat" (or "thatthis"). Example (fieldlist for a simple vCard with name, private and work phone number and a notes field only): XE "mimeprofile" \f T: definition of a mime-dir profile Contained in: Can contain: Attributes: name, fieldlist A MIME-DIR profile defines the entire structure of a MIME-DIR based datatype such as vCard or vCalendar. It must contain one tag (see " REF _Ref6042344 \r \h 10.3.1"). has the following attributes: "name": This must be specified to name the MIME-DIR profile. In , these names are used to reference a profile (see  REF _Ref6060179 \r \h 10.5). "fieldlist": This must be the name of an already defined fieldlist (see  REF _Ref6030571 \r \h 10.1). This fieldlist is the base on which a MIME-DIR type can be defined. All field names used in the definition of the MIME-DIR profile will reference fields from this fieldlist. XE "profile" \f T: root profile definition Contained in: Can contain: , Attributes: name, nummandatory This tag defines the root of a MIME-DIR profile. MIME-DIR profiles can be multi-level, that is the root profile can contain several sub-profiles (such as VCALENDAR contains VTODO and VEVENT subprofiles). To define sub-profiles, use the tag (see " REF _Ref6042851 \r \h 10.3.2"). has the following attributes: "name": This is the name of the profile. This is the name that appears in the BEGIN and END lines. For vCard, the name must be "VCARD", for vCalendar it must be "VCALENDAR". "nummandatory". This attribute is an integer and specifies how many properties of this profile are mandatory, that is, must be present in a valid data item. Normally, this is the number of properties in the profile that are flagged "mandatory" (see " REF _Ref6043386 \r \h 10.3.3"). It can however a lower number, for example if the profile is valid if either one or another value is present: then, there will be two properties flagged "mandatory", but "nummandatory" would be set to 1. Note that this count relates only to properties of this profile, not of eventually contained subprofiles. XE "subprofile" \f T: nested subprofile definition Contained in: Can contain: Attributes: name, nummandatory, field, value, showlevel, showprops This tag defines a sub-profile (such as VTODO, VEVENT or VTIMEZONE in VCALENDAR). has the following attributes: "name": This is the name of the subprofile. This is the name that appears in the BEGIN and END lines.. "mode": This defaults to "custom" for subprofiles which include tags to define the supported set of properties. Special modes are: "vtimezones" : This mode automatically creates or parses the VTIMEZONE records referenced by TZID parameters (, see see  REF _Ref182996929 \r \h 10.3.4) of timestamp properties in iCalendar 2.0 based records. A must not contain any tags – the needed properties are implicitly created. "onlyformode": If set to "old" or "standard", this restricts the subprofile to exist in pre-MIME-DIR ("old", e.g. vCard 2.1, vCalendar 1.0) or MIME-DIR ("standard", e.g. vCard 3.0, iCalendar 2.0) datatypes (see  REF _Ref182997376 \r \h 10.5.14 and  REF _Ref182997381 \r \h 10.5.1) only. "nummandatory": This works as described for , see " REF _Ref6042344 \r \h 10.3.1". "field": This optional attribute can specify the name of a field in the referenced field list, which is used to control this subprofile. See "value" below for details. "value": If "field" is set, this attribute specifies a value that... ...must be contained in the specified field in order to generate that subprofile when generating an object. ...will be written to the specified field when an object is received that contains this subprofile. "showlevel": obsolete since 3.2 – no longer needed as engine automatically calculates if a subprofile nees to be shown in devInf. "showprops": obsolete since 3.2 – no longer needed as engine automatically calculates if a subprofile nees to be shown in devInf. "showifselectedonly": If this attribute is set, the subprofile (and all of its subprofiles) are shown in devInf only if the subprofile is the selected subprofile, or if no subprofile is specifically selected. This is useful for vCalendar profiles, which contain both vEvent and vTodo subprofiles, but in a event-only datastore only vEvent is "selected". "useproperties": This optional attribute can be used to specify the name of an already defined profile or subprofile to use the same set of properties without the need to define them again. When this attribute is used, "showprops" defaults to false because normally the same properties should not be shown twice in the device information. Example: skeleton profile and subprofiles for VCALENDAR (the field named KIND can contain "TODO" or "EVENT" depending on the type of VCALENDAR that is received or to be sent): XE "property" \f T: property definition Contained in: , Can contain: , , Attributes: name, suppressempty, values, mandatory, show This tag defines a MIME-DIR property. A property contains one or multiple data items and eventually some parameters. has the following attributes: "name": This is the name of the property. This is the name that appears at the beginning of a MIME-DIR object, such as "TEL:" for a telephone number. "onlyformode": If set to "old" or "standard", this restricts the property to exist in pre-MIME-DIR ("old", e.g. vCard 2.1, vCalendar 1.0) or MIME-DIR ("standard", e.g. vCard 3.0, iCalendar 2.0) datatypes (see  REF _Ref182997376 \r \h 10.5.14 and  REF _Ref182997381 \r \h 10.5.1) only. "rule": This is the name of a remote rule (see  REF _Ref42941679 \r \h 11.36) that must be active in order to activate this property. This allows to specify multiple property definitions for the same property "name". All adjacent definitions having the same name are treated as a group. The group can contain alternatives for different remote rules, and it can also contain a default property definition (specify rule = "other" in the definition) that is used when no remote rule is active or the group does not contain a specific for the currently active remote rule. Properties that have no "rule" attribute are unconditional, that is they are always active (this is the default). "suppressempty": This optional boolean value. can be set to true if this property must never be sent empty (without values). This is the case for most vCalendar fields, for example. "delayedparsing": This optional integer value can be set to indicate that the property must be parsed after all other properties with a smaller "delayedparsing" value have been parsed. This is useful for example for properies like RRULE where parsing may depend on values like DTSTART. The default value is 0 (means immediate processing). "values": This optional attribute specifyes how many values the property consists of. For example, the "N:" property in vCard consists of 5 values (first, last, middle, prefix, suffix). The default is 1. For each value, the property can contain a tag that defines where and how to store the value (see " REF _Ref6046402 \r \h 10.3.4"). The special values "list" or "expandedlist" can be used instead of a number for properties which contain multiple values of the same type, such as the EXDATE property in vCalendar. This will cause the values to be handled as if the property was occurring multiple times (allowing the use of all the repeating mechanisms for the values). While "list" will generate a single property with multiple values on output, "expandedlist" will generate multiple instances of the same property, one for each value (some servers expect EXDATEs in that form). "valueseparator": This optional attribute can be used to specify the separator used for multi-valued properties. Normally, this is the semicolon (as in N), but for example to read CATEGORIES into elements of an array, "valueseparator" can be set to another separator, like the comma. "altvalueseparator": This optional attribute can be used to specify a alternate value separator that is also recognized when parsing properties. This is useful for properties like EXDATE or CATEGORIES where many implementations use ; instead of , or vice versa. "mandatory": This optional boolean attribute can be set to specify that this property is to be counted as mandatory (see "nummandatory" in and ). Default is "false". "show": obsolete since 3.2 – use "showindefinv" instead. "showindevinf ": This optional boolean attribute specifies if the property should be shown in the device information. Default is "true". "groupfield" New in 3.4: This optional attribute can be used to specify a string field (usually a array or a repeating field) which represents the vCard or vCalendar group tag (a prefix to the property name, separated by a dot). The group tag can be used to link properties together which can occur multiple times. For example, some vCards might contain more than one ORG and TITLE. Now each title belongs to a particular organisation, so the group tag is used to represent that: A.ORG:myOwnCompany B.ORG:myEmployer B.TITLE:employee A.TITLE:boss The groupfield mechanism makes sure that TITLE and ORG repetitions will be stored in the same repetition index (array position if ORG and TITLE are mapped to arrays) according to their group tag, even if occuring out of order in the incoming vCard. XE "value" \f T: property or parameter value storage Contained in: , Can contain: Attributes: index, field, conversion, combine This tag defines if and how a value of a property or parameter should be stored, and defines conversions that should be applied before storing it. has the following attributes: "index": This optional attribute specifies which one of multiple values (see "values" attribute in ) of a property this tag applies to. The default is 1, so for properties with only one value it can be omitted. For parameters, "index" cannot be specified as parameters always have only one value. "field": This optional attribute can specifiy a field name (from the fieldlist referenced in ) where the corresponding property value should be stored. If there is no "field" attribute, the corresponding property value will not be stored and an empty value will be generated when the object is generated by the server. "conversion": This optional attribute can specify a special conversion mode to be applied to the value. It can be one of the following: "version": This special conversion mode means that the property value is the profile's version number. Its only use is for the VERSION property of profiles like vCard or vCalendar. "none": This is the standard conversion (just copy). This is also the default if no "conversion" is specified "emptyonly": This is the like "none", but value is only assigned to fields that are empty. This can be useful to only assign the first value of a value list. "tz" : New in 3.1: When used with a timestamp field, the value is the standard (non-DST) minute offset for the timestamp (indended for vCalendar TZ property). Together with "daylight" (see below), this can be used to represent time zone in vCalendar 1.0 formats. It can be used also with a string field (representing a time zone name or UTC offset in minutes) or a integer field (representing the UTC offset in minutes). "daylight": New in 3.1: Intended for vCalendar 1.0 DAYLIGHT property. When used with a timestamp field, the value is the assiociated time zone's daylight savings rule (for FALSE if no DST defined for the time zone) in the DAYLIGHT format. "tzid": New in 3.1: Intended for iCalendar 2.0 TZID parameter. When used with a timestamp field, the value is a time zone identifier. Appropriate time zone descriptions can be included using a (see  REF _Ref182996673 \r \h 10.3.2). "zoneoffset_hours" : No longer supported in 3.1. "zoneoffset_mins": No longer supported in 3.1 – equivalent is using "tz" with an integer field. "zoneoffset_secs": No longer supported in 3.1. "timestamp": Forces the output to be a timestamp (date + time), even if the referenced field is a date-only field. "valuetype": This is a special conversion mode to be used with VALUE parameters of some properties (e.g. date/time fields in iCalendar 2.0). For timestamps, if the referenced field is a time-only value, the conversion result is "TIME", if the referenced field is a date-only value, the conversion result is "DATE". Otherwise, the conversion result is empty which causes no VALUE parameter to be used, which denotes a timestamp value. "date": Render and parse as date-only, even if actual value is a datetime. "autodate": New in 3.1: This is for properties like DTSTART that can be either date-only or timestamp values in MIME-DIR formats (like iCalendar 2.0), but must always be timestamps in vCalendar 1.0. A date-only value is rendered as timestamp with 0:00 localtime in vCalendar 1.0, whereas it is rendered as a real date-only in MIME-DIR conformant formats. "autoenddate": New in 3.1: Similar to "autodate", however a date-only value is rendered as a timestamp at 23:59:59 localtime in the previous day when (see  REF _Ref231889747 \r \h 11.36.18) is set (otherwise, the end date is rendered as-is, which is 0:00 the next day). This is useful for DTEND properties. "bitmap": This is a special conversion mode for integer fields that represent a number of flags by their individual bits. It converts an integer number into a list of bit numbers - for example, the decimal integer value 17 (hex: 0x11) will be represented as "0,4" as Bit0 and Bit4 are set. This is very useful in conjunction with s (see  REF _Ref62467260 \r \h 10.3.5), as these allow mapping list of numbers to list of identifiers. If the property had s relating WORK=0, HOME=1,FAX=2,PAGER=3,MOBILE=4, the above example "0,4" would correspond with "WORK,MOBILE", whereas 6 = 0x06 would correspond to the bitmap "1,2" which would represent "HOME,FAX". This can be very useful to efficiently store TYPE attributes of telephone number or email addresses. "multimix": New in 3.1: This is a very powerful conversion mode including the functionality of "bitmap", but additionally allows mixing bits from more than one field and also using literal values mixed with bitmapped values. This is useful for complex TYPE parameters like that from our iPhone client which has WORK, HOME etc. but also custom labels in the form "X-CustomLabel-xxxx" and IDs in the form "X-Synthesis-Ref-y" (see example below) When the input string into the conversion is of the form "Bx" or "n.Bx", multimix works like "bitmap", i.e. it maps to the bit number x in an integer field. When the input string into the conversion is of the form "Lyyyyy" or "n.Lyyyyy", the yyyyy part is stored in the referenced field. In both variants, the "n." prefix defines an offset in the field list relative to to the main field selected by the 'name' parameter, such that more than one field can be targeted by a multimix conversion. "rrule": This is a special conversion mode for vCalendar RRULE, it is available only in types based on "vcalendar". "rrule" conversion mode requires that the "field" attribute references not a single field, but the first field of a so-called RRULE field block. See  REF _Ref36890908 \r \h 10.6 for details. "blob_b64": the contents of the associated field (usually a BLOB) is represented as a base 64 encoded binary value. This is for example required for vCard PHOTO. Note: For converting enumerated values, the tag can contain tags, see below. "combine": This option can be used to combine the values of multiple properties into a single field. It can be one of the following: "no" : do not combine values. This is the default. "lines" : combine values by storing each value on a new line any single character: combine values by storing them separated by the specified character. The following example shows how to use the "multimix" mode in combination with the "prefix" mode (see  REF _Ref62467260 \r \h 10.3.5). For each telephone number in TEL_NUMBERS array, the TEL_FLAGS holds a bitmap coding CELL, HOME and WORK in any combination, TEL_IDS holds a numeric ID transferred as "X-Synthesis-RefX" and TEL_LABELS can hold a custom label. The 1 in "1.L" is the offset between the value's specified field (TEL_FLAGS) and the field that should actually be used to store (TEL_IDS). Same for the "2.L". Note that if there is no field offset, the value must be specified without a "0." prefix, like the "B0", "B1" and "B2" values. ... XE "enum" \f T: enumerated values Contained in: Can contain: nothing Attributes: name, value, positional This tag defines a name/value pair. All tags contained in a tag form an enumeration list which will be used to convert values contained in the MIME-DIR based format into values more convenient for internal use: If a value in the MIME-DIR object matches the "name" of an , the "value" of that is used as value to store into the internal field (and in the database, finally). has the following attributes: "name": This is how the value is shown in the MIME-DIR object. "value": This is how the value is shown internally (and stored in the database). "positional": This is an optional boolean attribute which can be used to exclude or include a certain value into the set of values that control the storage position of data (see " REF _Ref6049927 \r \h 10.3.7"). Normally, this needs not to be specified, but to have lists with mixed positional and non-positional values, it can be specified. "mode": This attribute can be used to specify special enum modes as follows (the default is "translate"): "translate": default mode, translate 1:1 between name and value "defaultname": when translating from values to names, and no matching value is found, the result is taken from the name of the with mode="defaultname" (if no such exists, the value is passed as name without translation). "defaultvalue": when translating from names to values, and no matching name is found, the result is taken from the value of the with mode="defaultvalue" (if no such exists, the name is passed as value without translation). "ignore": if a value or name matches an with mode="ignore", it will be ignored, i.e. the result generated is empty. "prefix": this works similar to "translate", however the translation is applied even if only the beginning of the name or value string matches. If so, the remainder of the string are appended to the output string. As an example: a would translate "X-BitNumber-2" to "B2" or "X-BitNumber-3456" to "B3456" and vice versa. See  REF _Ref182995906 \r \h 10.3.4 for an example using prefix enum mode together with multimix conversion mode. Example: Usage of an list to convert the STATUS attribute of VCALENDAR into an internal numeric representation: XE "parameter" \f T: property parameter definition Contained in: Can contain: , Attributes: name, default, show, positional,shownonempty This tag defines an attribute to a property. Parameters are supplementary information to a property which often defines things like language or type of the information stored in the property's value(s). There are two main uses of parameters: non-positional use: using them as additional values and store them like any other property value. positional use: use the value of a parameter to determine in which field the property's value should be stored. An example of this is the TYPE parameter of the TEL property in vCard: If TYPE=WORK, the number should be stored in a TEL_WORK field, but when TYPE=HOME, the number should be store in TEL_HOME. Positional parameters must always have some tags in their ; these will be used with the tag (see " REF _Ref6049927 \r \h 10.3.7") to define the rules for storing property values according to parameter values. has the following attributes: "name": This is how the parameter is shown in the MIME-DIR object. For example, the "TYPE" can be used to specify the type parameter in the vCard TEL property (which look like: "TEL;TYPE=WORK:123456"). "onlyformode": If set to "old" or "standard", this restricts the property to exist in pre-MIME-DIR ("old", e.g. vCard 2.1, vCalendar 1.0) or MIME-DIR ("standard", e.g. vCard 3.0, iCalendar 2.0) datatypes (see  REF _Ref182997376 \r \h 10.5.14 and  REF _Ref182997381 \r \h 10.5.1) only. "default" is an optional boolean attribute. If it is set, the parameter is treated as default parameter. This has significance in non-standard (pre-MIME-DIR) formats like vCard 2.1 only, and means that the parameter value(s) appear without the parameter name (such as "TEL;WORK:123456" which is vCard 2.1 format for "TEL;TYPE=WORK:123456"). By default, this is "false". "showindevinf " (also "show" is allowed for backward compatibility, but is deprecated in 3.2 and later) is an optional boolean attribute. If set to true, this parameter and (if any) its defined values will be shown in the device information. This should usually be set on "TYPE" parameters for properties like "TEL" or "ADDR", to show the client what kind of telephone numbers/postal addresses the server supports. Some phone device clients will not send more than a single tel number if the devInf does not contain this information. Default is "false". Note that this option has effect only if the containing profile/subprofile has not set "showprops" to "false". "positional" is an optional boolean attribute. It specifies if the parameter is used to determine where to store property values (see above). The default is "false". "shownonempty" is an optional boolean attribute. It specifies that the property which contains this parameter is to be show when this parameter contains a value, even if the property itself contains no value(s). The default is "false" which means that the property is only shown if it has main values(s). Example: make sure that the value of the LANGUAGE attribute of the NOTE property gets stored into the field "NOTE_LANG" (non-positional parameter): XE "position" \f T: control storage position and repetitions Contained in: , Can contain: nothing Attributes: has, hasnot, shows, field, repeat, increment, minshow This tag is used together with positional parameters (or generally with repeating properties to define how and how many times these are stored). It can be used to define rules how parameter values influence in what field the enclosing property's data is stored. It also handles the case of repeating properties, such as multiple TEL properties in a single vCard object. Note that while this is a very powerful option, it is also rather complex to understand and use. So we recommend to look at the sample config files distributed with the server before defining your own . They show how can be used in some standard cases for vCard and vCalendar. can appear in a or in . If the position (field(s) where to store property value(s) depend on a single parameter's value, should be put inside that . Otherwise, should be inside (especially when the is used only to define a repeat count for a property). has the following attributes: "has", "hasnot": These attributes both specify one or several (comma separated) name(s), either from the list of the enclosing , or from any other list of a parameter in the . If the being referenced is not in the same as the tag, the name must be prefixed with the parameter name. For example, to reference the "WORK" from the "TYPE" parameter, you should write "TYPE.WORK". "has" specifies the attribute values that must be present for the to apply to a property's values. For example, has="TYPE.WORK" specifies a property that must have a TYPE-attibute with a value of "WORK". "hasnot" specifies the attribute values that prevent the to apply to a property's values. For example, hasnot="TYPE.MODEM,TYPE.FAX" specifies that the property may not be of TYPE MODEM or FAX. "shows": This attribute is like "has", but can be used to specify additional values that a parameter should have when the object is sent to the remote party. For example, on voice telephone numbers it does not make sense to specify "VOICE" in "has" (because not all clients tag voice numbers as such), but it would be a good idea to specify shows="TYPE.VOICE", so voice numbers in outgoing vCards will have the "VOICE" type set. "field": Simply said, this attribute defines the field where the property value is stored when the applies according to its "has" and "hasnot" attributes. However, this simple description is only true if the property has a single value. The whole complicated truth is: The field specified is used to calculate a difference between the numeric positions in the fieldlist of that field and the first field specified in a of the enclosing property. This offset is then added to all the fields that store values of this property and all its non-positional parameters (so the entire block of fields is offset). In order to use this feature, you need to make sure that the field list is designed appropriately for offsetting fields or blocks of fields. "repeat": This attribute specifies how many times this can be applied. For example, a database might provide 3 fields for work telephone numbers, so the that catches work numbers (using has="TYPE.WORK") can have a "repeat" attribute of 3. Repeat can also be set to the following special values: "rewrite": this means that if the property occurs more than once, the last occurrence will be stored. Note that this is different from the default value "1" for "repeat": This will store the first occurrence, but if the property occurs again, it will not match this again, but eventually a subsequent one. "array" (PRO versions only): this can be used when the target field is an array field. In this case, all repeated occurrences will be stored in the elements of the array (instead of using field offsets). Important Note: before version 3.1.x, when an empty array element is encountered when generating properties from an array, this stops generation, even if subsequent array elements exist and are non-empty. For properties with parameters, these are not checked for being empty by default, but they can be included by using the "shownonempty" attribute of (see  REF _Ref182740974 \r \h 10.3.6). Note that a specifying "repeat" (and probably "increment" as well) can also be used completely independently of any positional parameters (no "has", "hasnot" etc.), for a property that is simply allowed to repeat several times. "increment": This is needed only when "repeat" is used. It specifies the increment (offset) that is added to the numeric position of the field(s) after each repeated occurrence. So, if a database has 3 fields for work telephone numbers, and they are listed one after the other in the fieldlist, the will have a "repeat" of 3 and an "increment" of 1. For a setup where the database has 5 blocks of 2 fields each, one for the telephone number itself and one for the TYPE parameter value, "repeat" would be 5 and "increment" would be 2. "minshow": This specifies how many times a property is shown minimally in a generated object. For example, in a database with 3 fields for work telephone numbers, you might not want to show 3 "TEL" properties unless they really contain data. But probably you still want one "TEL" property to show in all cases, even if the database has no work telephone numbers stored at all. In this case, you could set "minshow" to 1. By default, "minshow" is equal to "repeat", meaning that all possible repetitions of a property will be shown in generated objects, even if they are empty. Please note that if the "suppressempty" attribute of (see " REF _Ref6043386 \r \h 10.3.3") is set, empty properties are generally suppressed. There is also a device-specific setting in (see " REF _Ref6055322 \r \h 11.36.5") which overrides "supressempty" and "minshow" when set (it causes that empty properties are never generated for that specific device - some devices just can't handle empty properties at all). "readonly": This specifies that this position rule is only used for parsing data, not for generating data. This allows specifying more than one rules for the same values. The parser will try to apply them in the order of appearance. Default is "false". "overwriteempty": If this is set to true, the parser will overwrite empty occurrences of a repeating specifications with subsequent occurrences. This avoids wasting storage with storing empty values. Default is "true". Simple example: a vCard for a database with 2 fields for email addresses: Full featured example: a vCard with 8 telephone numbers, 4 of them for specific purposes, and 4 more for additional numbers (note the comments):  XE "vtimezonegenmode" \f T : VTIMEZONE generation mode Contained in: Attributes: none Default: none This tag defines how VTIMEZONE records should be generated in a mimeprofile which contains datetime values specifying a TZID parameter. It can have one of the following values "current": VTIMEZONE is generated for descibing the current time only. "start": VTIMEZONE is generated for descibing the earliest date used in the record. "end": VTIMEZONE is generated for descibing the latest date used in the record. "range": VTIMEZONE is generated for descibing all dates used in the record. "openend": VTIMEZONE is generated for describing all dates starting from the earliest date used in the record up to the latest time zone defintion known. < XE "unfloattimestamps" \f T unfloattimestamps>: handling of floating timestamps Contained in: Attributes: none Default: false If set, parsed datetime values that do not specify a time zone (i.e. have no TZID or no Z suffix) will be assigned to the item's time zone (which is usually the user's time zone). See  REF _Ref185257870 \r \h 5.2 for details about time zone contexts. This is useful for DB configurations that cannot store floating time stamps and must interpret them in a fixed time zone context.  XE "textprofile" \f T : definition of a text format profile Contained in: Can contain: , in PRO version only: , , , , , , , , , , Attributes: name, fieldlist A text profile relates internal fields to (header) lines of a plain-text format like email. It contains one or multiple tags (see  REF _Ref153617304 \r \h 10.4.1). has the following attributes: "name": This must be specified to name the text profile. In , these names are used to reference a profile (see  REF _Ref6060179 \r \h 10.5) with the tag. "fieldlist": This must be the name of an already defined fieldlist (see  REF _Ref6030571 \r \h 10.1). This fieldlist is the base on which a text type can be defined. All field names used in the definition of the text profile will reference fields from this fieldlist. XE "linemap" \f T: mapping of text based formats to database fields Contained in: (or , only for compatibility with version 2.1) Can contain: , , , , Attributes: field Note: In version 2.1, were defined directly within . This is still possible in version 3.x for compatibility, but no longer recommended. Please create (see  REF _Ref153617348 \r \h 10.4) sections for your and reference them from via . This tag is used to map one or multiple lines of the text based data format to a field of the fieldlist. The "field" attribute is required: "field" specifies the name of the field from the fieldlist which is to be mapped to one or multiple lines of the text format. The tag contains further tags to define how the lines are mapped XE "numlines" \f T: Number of lines to map Contained in: Can contain: integer number Default: 0 (all lines) This tag is used to specify how many lines are to be mapped to the field specified in . If the value is 0, this means that all remaining lines should be mapped to the specified field. Note that for linemaps with , is irrelevant (a header is always decoded into a single line – even if present as multiple lines with RFC822 folding). XE "inheader" \f T: header lines Contained in: Can contain: boolean value Default: false This tag is used to specify if the line(s) in the belong to a email-style header or not. E-mail headers are separated by body text by a single empty line. E-Mail header style lines can be represended on multiple lines using header folding mechanism. The folding/unfolding takes place automatically – the referenced internal field will always contain a single line. XE "allowempty" \f T: empty field handling Contained in: Can contain: boolean value Default: false If this option is set, one empty line will be generated if the mapped field is empty, otherwise, empty fields will just be ignored when creating the text output. XE "headertag" \f T: tagged header handling Contained in: Can contain: header name Default: empty This option is used to parse and generate RFC822-type headers (for example, email messages). The header name is the name of the header including the colon! If an input line begins with the header name, it is assigned to the field specified in the linemap. When generating output, the output text is preceeded by the header name. Note that long header lines are folded according to RFC822 specs. Example for the "From." header of email messages: From: true  XE "valuetype" \f T : type of text field Contained in: Can contain: value type name Default: text This option allows four type options: text (default): contents are treated as plain text date: contents are treated as RFC822 date/time specification body: contents are treated as a RFC822/MIME email body (that can include multiple body variants and attachments). Note that this option is only available in the PRO versions. Use the RFC822 email body options (see  REF _Ref45025338 \r \h 10.4.7) to specify details for storing the body elements. The body text itself will be stored in the field specified by the enclosing . If that field is an array, multiple format variants of the body will be stored in subsequent array elements (also see and below in  REF _Ref45025338 \r \h 10.4.7). Otherwise, only the plain text variant of the body will be stored. rfc2047: contents are treated as RFC2047 encododed. This is the encoding used to represent non-ASCII characters in RFC2822 style email headers. RFC822 email body options Contained in: (, only for compatibility with version 2.1) Available: in PRO version only Note: In version 2.1, the following tags were defined directly within . This is still possible in version 3.x for compatibility, but no longer recommended. Please create (see  REF _Ref153617348 \r \h 10.4) sections and reference them from via . These tags are used to control parsing/generation of RFC(2)822-type email bodies and are applied to linemaps that have a valuetypeof body:  XE "mimemail" \f T boolean: If set to false (default), no RFC(2)822 email body parsing/generating is done at all. For email format support, this must be set to true.  XE "maxattachments" \f T number: Specifies the maximum number of attachments that will be processed  XE "attachmentcountfield" \f T field: Specifies a field that will be assigned the number of attachments in a parsed email message  XE "attachmentmimetypesfield" \f T field: specifies the field (normally an array) that is used to store the attachment MIME-types.  XE "attachmentsfield" \f T field: specifies the field (normally an array) that is used to store the attachment contents.  XE "attachmentsizesfield" \f T field: specifies the field (normally an array) that is used to store the size (in bytes) of the attachments.  XE "attachmentnamesfield" \f T field: specifies the field (normally an array) that is used to store the file names of the attachments.  XE "sizelimitfield" \f T field: specifies the field that is used by Synthesis SyncML Server and clients to transmit email size constraints with the special "X-Sync-Message-Limit" header. Note that this is a very advanced setting, and needs a lot of scripting in a config file to make it work with a server database. See implementation for email in the sample config.  XE "bodymimetypesfield" \f T field : specifies the field (normally an array) that is used to store the MIME-types of the possibly multiple body variants of the email message (such as text, html, rtf).  XE "bodycountfield" \f T field : Specifies a field that will be assigned the number of body variants found in a parsed email message. XE "datatype" \f T: definition of a datatype Contained in: Can contain: , If basetype is "vcard" or "vcalendar": , If basetype is "mimedir": , , If basetype is "text": , , ( for compatibility with version 2.1, but these should be moved to a if possible) Attributes: name, basetype This tag is used to define a datatype that can then be referenced by a datastore as content format (see " REF _Ref6058085 \r \h 11.34.12"). The "name" and "basetype" attributes are required: "name" specifies the name under which the datatype can be referenced by a datastore. For example, vCard 2.1 is named "vcard21" in the sample config files. "basetype" can be one of the following: "vcard": The type is a vCard. Note that a vCard could also be defined with basetype "mimedir" (as it is a MIME-DIR based format), however using the "vcard" base type allows the server to optimize some vcard specific things. "vcalendar": The type is a vCalendar. "mimedir": The type is a generic MIME-DIR type. This basetype is intended for defining custom formats which are not vCard nor vCalendar. "text": The type is a text-based format, such as notes or email. The tag should reference a (new in version 3.0) containing (see  REF _Ref153617348 \r \h 10.4).For compatibility with version 2.1, the s can be specified in the directly, but you will get warnings when starting the server, recommending moving to a separate . XE "use" \f T: MIME-DIR profile, text profile or field list to use for datatype Contained in: Can contain: nothing Attributes: for basetypes "mimedir", "vcard", "vcalendar": mimeprofile for basetype "text": textprofile (or fieldlist for compatibility with version 2.1) This tag is used to define the MIME-DIR profile (for basetypes "mimedir", "vcard" and "vcalendar"), textprofile or fieldlist (for basetype "text") the datatype is based on. The attribute must specify a name of a previously defined (see  REF _Ref6058882 \r \h 10.3), (see  REF _Ref153617348 \r \h 10.4) or (see  REF _Ref6030571 \r \h 10.1) resp. Examples: 2.1 text/plain 1.0 1 false true 0 false true XE "version" \f T: vCard or vCalendar version Contained in: or Can contain: vCard or vCalendar version Attributes: none This tag is used to define the vCard or vCalendar version. It controls how data is interpreted and generated (as this is different between versions) as well as how the type is named in SyncML communication (for example, the correct name for vCard 2.1 is "text/x-vcard", while for vCard 3.0 it is "text/vcard"). For vCard, versions available are "2.1" and "3.0". For vCalendar, versions available are "1.0" and "2.0". XE "typestring" \f T, XE "versionstring" \f T: MIME type and version Contained in: Can contain: MIME type and version strings, resp. Attributes: none These tags are used to define a MIME type and a version for which base on the generic "mimedir" type. This should be used only for custom types. Example of a custom type definition: text/x-mytype 1.7  XE "zippedbindata" \f T: Enable/disable special compressed (non-standard) item format Contained in: Available: might not be available in all standard products Can contain: boolean value Attributes: none Default: false If this flag is set to true for a definition, it enables a (non-standard) per-item data compression as follows: The raw data (for example a vCard) will be compressed with the zip compressor (compression level can be set using , see  REF _Ref103576461 \r \h 10.5.5) and the resulting binary data will be sent as "bin" opaque WBXML data. The will contain set to and will have a tag which contains the original (uncompressed) size of the item data. This will happen if and only if the SyncML communication is in WBXML format and if the SyncML Version is 1.1 or higher. Note: This allows to define special types (in addition to the standard data types) to optimize network bandwith usage, such as for large emails. Of course, this does only work if both ends (server and client) support this non-standard compression scheme. Synthesis SyncML client for Windows Mobile for example support this kind of compressed format for emails as "application/x-zip-message" custom type, and therefore the sample config supports this format as well, in addition to the standard "text/message".  XE "zipcompressionlevel" \f T: Compression level for compression Contained in: Available: might not be available in all standard products Can contain: number 0..9 Attributes: none Default: empty This tag specifies the compression level (0=no compression, 1=low compression level, fast, 9=high compression level, slow) used when the feature is enabled (see  REF _Ref103576458 \r \h 10.5.4).  XE "binaryparts" \f T : Allow unencoded binary in content Contained in: Available: might not be available in all standard products Can contain: boolean value Attributes: none Default: false If this flag is set to true for a definition, it enables a (non-standard) format extension for certain content formats (RFC 2822 email attachments at this time) to allow more efficient bandwidth usage than base 64 encoding by including binary parts as such (plain binary). This takes place with WBXML format only – XML cannot transfer unencoded binary. Synthesis SyncML client for Windows Mobile support binary parts for email attachments in the "application/x-zip-message" (1.1) custom type, and therefore the sample config supports this as well.  XE "unicodedata" \f T ,  XE "bigendian" \f T : Unicode content Contained in: Available: might not be available in all standard products Can contain: boolean value Attributes: none Default: false New in: 3.0.2.0 If is set, the content of the parts is interpreted as Unicode (16-bit characters) rather than UTF-8 which is the standard encoding for SyncML. can be set in case the Unicode content is in Big Endian order (Motorola style, MSB first) rather than Little Endian order (Intel style, LSB first). Note that this makes only sense in WBXML. There are some clients on the market that use unicode encoded data in special, semi-proprietary formats like Nokia's VMSG (for SMS sync).  XE "initscript" \f T: Initialisation of type-specific script context Contained in: Available: in PRO versions only Can contain: script Script context: datatype context Attributes: none Default: no script This script is executed once before the datatype is first used for receiving or sending data. It can be used to initialize the datatype context. Note that because it is possible for a SyncML session to use different datatypes for sending and receiving (for example vCard 2.1 and vCard 3.0), the context for sending items is not necessarily the same as for receiving items - although it will be in most cases. is the place to declare and initialize variables that are used for processing incoming and outgoing items in , (see  REF _Ref46895327 \r \h 10.5.9), , (see  REF _Ref46895428 \r \h 0), (see  REF _Ref46823145 \r \h 10.5.11), (see  REF _Ref46895473 \r \h 10.5.12) and (see  REF _Ref46895489 \r \h 10.5.13)  XE "incomingscript" \f T,  XE "outgoingscript" \f T: Custom pre- and postprocessing items Contained in: Available: in PRO versions only Can contain: script Script context: datatype context Attributes: none Default: no script These scripts are executed for every data item just after decoding the incoming data () and just before encoding the outgoing data () according to the encoding/decoding defined for the . These scripts are the place to customize the endcoding/decoding process between internal field list representation and the SyncML datatype. Note that this is not the place to implement database specific conversions, because this is better done in the and in the section (see  REF _Ref42944330 \r \h 12.20).  XE "filterinitscript" \f T ,  XE "filterscript" \f T : Script-based data filtering Contained in: Available: in PRO versions only Can contain: script returning boolean value Script context: datatype context Attributes: none Default: no script With these two scripts, custom filtering that cannot be represented with the standard flters (see  REF _Ref46752884 \r \h 7) can be implemented. For example, for making the special date range limit (see  REF _Ref46896711 \r \h 7.4) work for a datatype, an appropriate and must be implemented (see example below). The is executed once per sync session. It must analyze the filter parameters (such as STARTDATE(), ENDDATE() and SIZELIMIT(), see below) and then return TRUE if the must be called for every item modified or added in the database since the last sync session. In addition, if the must be called for all items in the sync set (not only those that have changed or were added), the must use SETFILTERALL(TRUE). Note that this "filter all" mode is required for filter conditions that are dynamic, that is, which change from sync session to sync session (like a "10 days before and 30 day after" rule, which affects a different date range every day. For static conditions (like "only tasks that are not completed"), it is sufficient to have only the new and changed records filtered, which can make a huge performance difference (with SETFILTERALL(TRUE), all records of the database must be read and checked, which might need quite some processing for large databases. If returns FALSE, this means that no filtering is needed which is the most efficient case. The is executed once per data item read from the database. It must return TRUE if the data item passes the filter and FALSE otherwise. The following functions are available in the datatype context only:  XE "SETFILTERALL" \f F SETFILTERALL(integer all): For . If all is TRUE, this causes all records of the datastore being passed through the . integer  XE " DEFAULTSIZELIMIT" \f F  SIZELIMIT(): returns the size limit that was set for the item being processed. This limit defaults to the size limit set for the datastore which can be obtained by the DEFAULTSIZELIMIT function (see  REF _Ref55271118 \r \h 11.34.21), for example when set with the /li() CGI option (see  REF _Ref46896711 \r \h 7.4). If no size limit was set, SIZELIMIT() returns UNASSIGNED.  XE "SETSIZELIMIT" \f F SETSIZELIMIT(integer limit): sets a new size limit for the item being processed. This can be used to override the default size limit on a item-by-item basis. If limit is UNASSIGNED or -1, this disables the limit for the item being processed. In addition, all datastore context functions as listed in  REF _Ref55271118 \r \h 11.34.21 are also available. The following example shows a and a which offer date-range filtering for events and todos (if inserted into a vCalendar-based ). =STARTDATE()) || ((RR_FREQ!=EMPTY) && ((RR_END==EMPTY) || (RR_END>STARTDATE()))) ); } ELSE { // Todo pass if they have no DUE or one within the range PASSES = (DUE==EMPTY) || (DUE>=STARTDATE() && DUE<=ENDDATE()); } RETURN PASSES; ]]>  XE "processitemscript" \f T : Custom processing for incoming items Contained in: Available: in PRO versions only Can contain: script returning boolean value Script context: datatype context Attributes: none Default: no script This script is executed before an incoming item is processed (that is, stored in the database), but after an eventual . This is the place to implement non-standard behaviour (such as rejecting certain items or ignoring updates etc.) for item processing. For "standard" datatypes this script is normally not used, but it is needed to implement special-behaviour datatypes such as email. This script can influence how the item will be processing by using the following context functions (note that the context functions described in  REF _Ref46904847 \r \h 10.5.10 are also available):  XE "ECHOITEM" \f F ECHOITEM(string syncop): This will cause the incoming item being echoed back to the sender with the specified syncop (which can be "add", "replace", "delete").  XE "REJECTITEM" \f F REJECTITEM(integer statuscode): This will cause the incoming item being rejected with the statuscode. Whenstatuscode is set to zero, the item will be silently rejected, without returning a error code. string  XE "SYNCOP" \f F SYNCOP(): Returns the sync operation requested for the current item ("add", "replace" or "delete". string  XE "LOCALID" \f F LOCALID(): Returns the current item's local ID.  XE "SETLOCALID" \f F SETLOCALID(string localid): Sets the current item's local ID. Note that this is only required in very special cases. Usually, modifying the local ID will lead to messed up sync sessions. string  XE "REMOTEID" \f F REMOTEID(): Returns the current item's remote ID.  XE "SETREMOTEID" \f F SETREMOTEID(string remoteid): Sets the current item's remote ID. Note that this is only required in very special cases, such as clients requiring extra information (such as an email folder path) embedded in the remote ID string.  XE "CONFLICTSTRATEGY" \f F CONFLICTSTRATEGY(string strategy): Sets the conflict strategy ("duplicate","newer-wins", "server-wins", "client-wins") for the current item and overrides the default strategy set by , and (see  REF _Ref46908455 \r \h 11.34.10) or by SETCONFLICTSTRATEGY() in (see  REF _Ref55271118 \r \h 11.34.21).  XE "FORCECONFLICT" \f F FORCECONFLICT(): Forces a conflict even if there is none. This means that the item coming from the remote party is made conflict the item already in the database (if any) and have it being processed by the normal conflict resolution procedure.  XE "DELETEWINS" \f F DELETEWINS(): Normally, when a delete and a replace operation conflict, the replace always wins to preserve data (unless datastore-wide option is set, see  REF _Ref169607904 \r \h 11.34.5). When DELETEWINS() is used, this makes delete win over replace.  XE "PREVENTADD" \f F PREVENTADD(): Prevent that the item is added to the datastore. Note that just checking SYNCOP() for "add" is not enough, as clients are free to send new items using the "replace" command, which will cause an implicit add if the item does not already exist. PREVENTADD() prevents this implicit add as well.  XE "IGNOREUPDATE" \f F IGNOREUPDATE(): Causes replace operations to be ignored. Note that just checking SYNCOP() for "replace" is not enough, as clients are free to send new items using the "replace" command, causing implicit adds in the server. IGNOREUPDATE() makes sure only "replace" operations are executed that cause an implicit add.  XE "comparescript" \f T : Custom item comparison Contained in: Available: in PRO versions only Can contain: script returning 0 if target equals reference, 1 if target is newer than reference, 1 if target is older than reference,999 if items are not comparable or not equal but age of items is not known. Script context: datatype context Attributes: none Default: no script This script can be used to implement customized comparison rules. Comparison is important when trying to match existing items from client and server in slow sync, or when a conflict occurs. The fields of the two items to be compared can be accessed as field variables with the prefix target or reference (as described in  REF _Ref47156991 \r \h 6.9.3) The following special context function is available for comparison (note that the context functions described in  REF _Ref46904847 \r \h 10.5.10 are also available): integer  XE "COMPAREFIELDS" \f F COMPAREFIELDS(): This performs the default comparison (according to the compare rules defined in the for the fields). It returns 0 if target equals reference, -1 if target is older than reference, 1 if target is newer than reference and -999 if target and reference cannot be compared at all or are not equal and no age of the items is known. The following example shows how to implement a relaxed comparison for vCalendar (only comparing dates, not times to avoid that time zone shift problems will generate duplicates in slow syncs):  XE "mergescript" \f T : Custom item merge Contained in: Available: in PRO versions only Can contain: script Script context: datatype context Attributes: none Default: no script This script can be used to implement custom merge algorithms. Merge is used when resolving conflicts, that is when two items need to be updated from each other to both contain all relevant data. The fields of the two items to be merged can be accessed as field variables with the prefix winning (for the item that wins the conflict, that is, contains the "better" or "never" data) or loosing (for the item that looses the conflict), as described in  REF _Ref47156991 \r \h 6.9.3. After the execution of , both items (loosing and winning) should be equal. The must call the SETWINNINGCHANGED() and SETLOOSINGCHANGED() functions (see below) when it modifies one of the items - this is required by the SyncML engine to know if corresponding updates must be sent to the remote party or applied to the local database. The following special context functions are available for comparison (note that the context functions described in  REF _Ref46904847 \r \h 10.5.10 are also available): integer  XE "MERGEFIELDS" \f F MERGEFIELDS(): This performs the default merge (according to the merge options defined in the for the fields). Calling this function also updates the WINNINGCHANGED() and LOOSINGCHANGED() (see below) flags to show if either of the items were modified. integer  XE "WINNINGCHANGED" \f F WINNINGCHANGED() and integer  XE "LOOSINGCHANGED" \f F LOOSINGCHANGED(): return TRUE if the corresponding (winning or loosing) item is flagged changed (which will cause it to be sent to the local database or the remote party for update).  XE "SETWINNINGCHANGED" \f F SETWINNINGCHANGED(integer changed) and integer  XE "SETLOOSINGCHANGED" \f F SETLOOSINGCHANGED(integer changed): used to set the change flags of the winning or loosing item, resp. XE "mimedirmode" \f T: MIME-DIR conformance Contained in: Can contain: "old" or "standard" Attributes: none This tag is used to define the behaviour of a which bases on the generic "mimedir" type. The following values can be specified: "standard" : The type behaves according to MIME-DIR (folding of long lines, encoding of multi-line fields, escaping of characters) "old": The type behaves like in the pre-MIME-DIR formats vCard 2.1 and vCalendar 1.0. Using this setting makes a type not to conform to MIME-DIR specifications, so it should be used with care. RRULE field block Datatypes based on "vcalendar" can make use of the "rrule" conversion mode (see  REF _Ref6046402 \r \h 10.3.4), which requires a special block of subsequent fields in the field list as follows: String field, containing 2 chars to code the type of recurrence: First character is the frequency code: (0 = none, D = daily, W = weekly, M = monthly, Y = yearly) Second char is the frequency modifier (space = none, W = by weekday list, D = by monthday list, M = by monthlist) Integer field, containing the interval (expressed as number of units specified in the frequency code) Integer field, containing a bit mask which codes the frequency modifications as follows: for weekly: Bit0=Sun, Bit6=Sat for monthly by weekday: Bit0=first Sun, Bit7=2nd Sun... Bit35=5th Sun for monthly by day: Bit0=1st, Bit1=2nd, Bit31=31st. for yearly by month: Bit0=jan, Bit1=feb,... Integer field, containing a bit mask like the previous field, but coding ocurrence from the end of the interval, not the beginning. This makes sense only as follows: for monthly by weekday: Bit0=last Sun, Bit7=2nd last Sun... for monthly by day: Bit0=last, Bit1=2nd last... Timestamp field, containing the date/time when the recurrence ends. If this is empty, the recurrence has no end and repeats forever. Timestamp field, containing the start of the entire event (this is normally the field used for DTSTART property). Note that this field will never be written by the RRULE conversion, but is only used as reference context for parsing/generating RRULEs. Note that this scheme covers most, but not all options possible in RRULEs. However, it covers all of the RRULE implementations commonly used in real-world applications. Please also note that not all combinations of frequency code and frequency modifier are valid. See sample config files to see how a RRULE block is defined and used. XE "server" \f T,  XE "client" \f T : General Server and Client Settings Contained in: Can contain: tags described in this chapter (see also  REF _Ref47164085 \r \h 12 for datastore-specific settings and  REF _Ref90895285 \r \h 16 specifically for clients) Attributes: type This tag encloses all server (or client) database related information. This includes three kinds of information: general (Database type independent) configuration tags. These are described in this chapter and can be used in any type of or tag. database type specific configuration. These are described inchapter  REF _Ref47164085 \r \h 12 for SQL/ODBC or SQLite based servers and clients and in chapter  REF _Ref135023442 \r \h 14 for the plugin based servers and clients. Note that the version 3.0 DEMO server is now a plugin-based configuration (see  REF _Ref135023442 \r \h 14) with a single, built-in text-file plugin (see  REF _Ref133810323 \r \h 14.3). For clients built on the Synthesis SyncML client engine library a few special configuration directives exist which are described in chapter  REF _Ref207626203 \r \h 15. For command line clients only, configuration of the Sync Request (information about the SyncML server to be contacted and synchronized with). These client-specific tags are described in  REF _Ref90895148 \r \h 16. The "type" attribute is required. It specifies the type of the server database. For the SQL/SQLite/ODBC type must be set to "odbc" or "sql". For the plugin version (which includes the DEMO server), type must be set to "plugin". Other values are reserved for future versions of the server with DB interfaces other than SQL/SQLite/ODBC or plugin)  XE "maxsyncmlversion" \f T , XE "minsyncmlversion" \f T : SyncML version support Contained in: Can contain: SyncML version string, currently: "1.2", "1.1" or "1.0" Attributes: none Default: all versions implemented are supported These tags specify what SyncML versions the server or client should support. Normally, the server allows clients to connect with all known SyncML versions (1.2, 1.1 and 1.0 at this time) and the client tries all SyncML versions when connecting to a server. For special testing it might be useful to limit the range of SyncML versions accepted. For clients, also see in  REF _Ref90895208 \r \h 16.1. XE "sessiontimeout" \f T: Timeout for unfinished sessions Contained in: Can contain: integer value, specifying timeout in seconds Attributes: none Default: 300 seconds (5 minutes) This tag specifies how long (minimally) a started, but not finished sync session will be kept alive in the server's memory. After this time, the server might abort the session to free ressources (depending on the platform and version, the server might however keep the session alive longer if there is no need to free resources).  XE "requestmaxtime" \f T : max time for request processing Contained in: Can contain: max duration (in seconds) of a single request processing, 0=no limit Attributes: none Default: 0 (=no minimum) This can be used to specify how quickly a client request should be processed by the server. This can be important if the server database is slow or the number of synced data items is large. In these cases, request processing could take so much time that the SyncML client would time out and abort the session before the server sends an answer. With it is possible to indicate to the SyncML server engine how long processing of a single request may take. If normal sequential processing would exceed the specified amount of time, the server takes measures to answer the request in time such as postponing execution of some commands or executing them in the background in a separate thread. Note that cannot always be met exactly - some datastore implementations or server platforms might not allow multi-threaded execution, or might have uninterruptable operations that could prevent from being met. By using in a (see  REF _Ref70164454 \r \h 11.36.23) it is possible to specify different request processing times on a device by device basis - however, as it takes one or two message exchanges until s can be evaluated and applied, make sure that in the is set to a reasonable time. On the other hand, operations performed before s can be applied are almost never time consuming (usually only a database login). Finally, using the REQUESTMAXTIME() script function (see  REF _Ref43008774 \r \h 6.14.6), maximum request time can also be controlled from scripts.  XE "requestmintime" \f T : artifical slow down Contained in: Can contain: minimal duration (in seconds) of a single request processing, 0=no minimum Attributes: none Default: 0 (=no minimum) This is only intended for debugging purposes. Setting this to non-zero causes the server to wait for each response before at least the specified number of seconds have passed since the last request arrived. This can help to slow down sync sessions such that testing things like manually aborting sessions in the middle, disconnecting network etc. gets possible. Using the REQUESTMINTIME() script function (see  REF _Ref43008774 \r \h 6.14.6), such slow-down behaviour can also be applied to certain sessions only (like depending on user options). XE "externalurl" \f T: specify URL used to access the server Contained in: Can contain: fully specified URL Attributes: none Available: server only Default: not set This tag is used to set the URL which is used by external clients to access the server. Note that this is normally neither required nor recommended, so please use this option with care in special situations only (exotic proxy or redirection situations). If this option is set, the server will use this hard-coded URL in its tags rather than the URL which was used by the client to address the server in the first place. XE "requestedauth" \f T,XE "requiredauth" \f T: SyncML Authentication Contained in: Can contain: SyncML authentication method name Attributes: none Default: md5 NOTE: in Server versions before 1.0.5.3 the tag was misspelt as . So if you are upgrading from an older server, this spelling error should be corrected in your existing config file. These tags specify what type of server-level authentication the SyncML server requests (or requires minimally, resp.) from a SyncML client that want to connect. In most but very special test cases both tags should have the same value. The following values are allowed: "none" : the server does not require the client to authenticate itself. This is not a common case, as on a multi-user server authentication is needed to login to the user's data. "basic" : the client can use the SyncML "basic" authentication method (or md5, see below). This is not recommended generally as in this method the password is sent unencrypted over the net. "md5": the client must use the SyncML "md5" method. MD5 is an algorithm that encrypts the password in a way that is cannot be recovered from the data that travels over the net. This is the recommended settings, because all compliant SyncML clients are required to support this anyway. If your database does store passwords in MD5-digest form (see " REF _Ref13981914 \r \h 12.13"), you must set to "basic", as it is not possible with SyncML 1.0 to check MD5 digests (it will be possible with SyncML 1.1 and later). Note that should always be set to the same or higher "strength" method than (none < basic < md5 in terms of "strength"). Otherwise the server would request something "weaker" from the client than what it actually requires for authentication - which makes no sense and will block client login. XE "autononce" \f T: MD5 nonce generation mode Contained in: Can contain: boolean value Attributes: none Default: on This is a special option that controls the behaviour of MD5 authentication. It should be set to on under normal circumstances. The technical background is that the MD5 authentication scheme uses a so-called nonce string to increase security. The nonce string is generated by the server. When autononce is on, this happens automatically. When autononce is off, the server does not send a nonce string or uses a constant string that can be specified with the tag (see below). This compromises security, but might be useful for testing or other special circumstances. XE "constantnonce" \f T: constant nonce string Contained in: Can contain: nonce string Attributes: none Default: empty This tag should be used when is not set to specify a constant nonce string to be used in MD5 authentication.  XE "sendrespuri" \f T ,  XE "respurionlywhendifferent" \f T : RespURI configuration Contained in: Can contain: boolean value Default: true (for both options) controls if the server should create a RespURI including a sessionID CGI string or not. Default is true, because for HTTP servers this is required for session tracking. For transports which have a transport-level session context, this may not be required so it can be turned off. By default, the RespURI is only generated when it is different from the URI used for the current request. can be set to false to always generate a RespURI. XE "simpleauthuser" \f T, XE "simpleauthpw" \f T: single user mode Contained in: Can contain: username, password Attributes: none Default: not specified For single-user situations, it might be that the overhead of having a separate table for authenticating users is not desired. For this special case, these two tags allow to provide a single username and password. A SyncML client trying to authenticate with a matching user/password combination will be granted access. In this case, the (see " REF _Ref5614672 \r \h 12.13") will never be executed, and therefore there will be no userkey value that can be used as parameter (%U) in subsequent queries. Do not use these tags unless you have a true single-user situation. Example: test test  XE "multithread" \f T : Allow multi-threaded execution Contained in: Can contain: boolean value Default: false ( for Linux ) / true ( for all other operating systems ) Allows multi-threaded execution for the server, if set to true. As there are problems in early 2.4 Linux kernels, multi-threading was switched off completely for Linux in the past. For compatibility reasons the default value is set accordingly. When is on, the server uses a separate thread for each datastore to load the sync set, as this can take a long time for large sync sets and the server needs to continue communicating with the client to prevent the client to time out.  XE "sessioninitscript" \f T : Session init script Contained in: , Available: in PRO versions only Can contain: script Script context: session context Attributes: none Default: no script This script is executed whenever a new session is started. It can be used to declare and initialize variables in the session script context (which can be accessed from other script contexts using the SESSIONVAR and SETSESSIONVAR built-in functions, see  REF _Ref43008774 \r \h 6.14.6).  XE "sentitemstatusscript" \f T : Session finish script Contained in: , Available: in PRO versions only Can contain: script Script context: session context Attributes: none Default: no script This script is executed whenever a session (successfully) comes to its end. All variables of the session script context can be used. See also for details.  XE "sentitemstatusscript" \f T ,  XE "receiveditemstatusscript" \f T : Session level status code handling Contained in: , Available: in PRO versions only Can contain: script Script context: session context Attributes: none Default: no script These scripts can be inserted in the session level as well as in the datastore level. See  REF _Ref45371286 \r \h 11.34.27 and  REF _Ref45371414 \r \h 11.34.28 for details.  XE "customgetputscript" \f T ,  XE "customendputscript" \f T : Creation of custom SyncML Get and Put commands Contained in: , Available: in PRO versions only Can contain: script Script context: session context Attributes: none Default: no script This allows issuing custom SyncML and commands - custom commands, such as Alert 100 to display a message to the user) are possible as well. The is executed at the beginning of the session when and for device information are sent. The is executed at the end of the session to allow sending custom session summary or status information to the remote. For example, a Alert 100 could transmit information about conflicts etc. to the client. The script must return TRUE if it has handled the item. If it returns nothing or FALSE, other handlers (such as the default handler for devInf) are checked. The following functions are available to these scripts:  XE "ECHOITEM" \f F SETSTATUS(integer status): Sets the status code to be returned for the get/put/result command. If no status is set, the engine assumes the command execution was successful. string ITEMURI(): Returns the Target LocURI of the item. This should be checked for known URIs to decide if the script should handle the command or not. SETITEMURI(string locURI): Sets the Target locURI of the item for sending a command. string ITEMDATA(): Returns the of the item. SETITEMDATA(string itemData): Sets the of the item to the string itemData. string METATYPE(): Returns the information of the item. SETMETATYPE(string metaType): Sets the information of the item to the string metaType. ISSUEPUT(boolean allowfailure, boolean noresp): Creates and issues a command using the values set by SETITEMURI(), SETMETATYPE() and SETITEMDATA(). If allowfailure is set, the status returned for the by the remote is ignored and will not cause the session to abort if it is not ok. If noresp is set, the remote is told not to respond to this command. ISSUEGET(boolean allowfailure): Creates and issues a command using the values set by SETITEMURI() and SETMETATYPE(). If allowfailure is set, the status returned for the by the remote is ignored and will not cause the session to abort if it is not ok. ISSUEALERT(boolean allowfailure, integer alertcode): Creates and issues a command with alertcode and one item containing the string set by SETITEMDATA(). If allowfailure is set, the status returned for the by the remote is ignored and will not cause the session to abort if it is not ok. < XE "customgethandlerscript " \f T customgethandlerscript>: Custom handling of SyncML Get commands Contained in: , Available: in PRO versions only Can contain: script Script context: session context Attributes: none Default: no script This allows specifying a script to handle items of SyncML commands. This can be useful for implementing custom functionality. The script must return TRUE if it handles the command and produces any data to be returned as to the sender of the command. If it returns nothing or FALSE, other handlers (such as the default handler for devInf) are checked. The same functions as in (see  REF _Ref153699553 \r \h 11.15) are available to this script. < XE "customputresulthandlerscript " \f T customputresulthandlerscript>: Custom handling of SyncML Put/Result commands Contained in: , Available: in PRO versions only Can contain: script Script context: session context Attributes: none Default: no script This allows specifying a script to handle items of SyncML and commands. This can be useful for implementing custom functionality. The script must return TRUE if it has handled the item. If it returns nothing or FALSE, other handlers (such as the default handler for devInf) are checked. In addition to the functions available in (see  REF _Ref153699553 \r \h 11.15), the following special function is available in : boolean ISPUT XE "ECHOITEM" \f F  (): Returns TRUE if the command that called the script is a SyncML command, false if it is a SyncML command.  XE "waitforstatusofinterrupted" \f T : SyncML command flow option Contained in: , Can contain: boolean value Attributes: none Default: no This is a highly technical setting. If set to yes, a interrupted command (for example a command that had to be terminated to fit into one message and needs to be continued in the next message) will not be continued until the status for the previous part has arrived.  XE "waitforstatusofinterrupted" \f T : Add resending policy Contained in: Can contain: boolean value Attributes: none Default: yes This is a highly technical setting. If set to no, the server does not re-send commands again until a subsequent session has successfully completed. This is to avoid duplicates for clients that do not reliably re-send unconfirmed items left over from the previous session at the beginning of the next session. For properly SyncML conformant clients, this can be set to yes (the default).  XE "debugchunkmaxsize" \f T : LargeObject chunk size limit for testing Contained in: , Can contain: max size of chunk for LargeObject in bytes Attributes: none Default: 0 (disabled) This is a highly technical setting. If set to non-zero, all objects larger than the specified number of bytes will be sent in chunks of no more than the specified size. The only use of this is to test LargeObjects implementation in SyncML DS 1.1 and 1.2 remote parties. Usually, the reported by the remote party determines when objects need to be sent in multiple chunks.  XE "deletinggoneok" \f T : Handling of delete for non-existing items Contained in: , Can contain: boolean value Attributes: none Default: yes This is a highly technical setting. If set to yes, receiving a delete command for an item that does not exist is not considered an error. However, some implementation (especially the SCTS test tool) requires an error message for that, hence this option.  XE "usertimezone" \f T : Set user's default time zone Contained in: , Can contain: time zone name (see list of all time zones in  REF _Ref185261956 \r \h 17) Attributes: none Default: system time zone This defines the user's default time zone. This is important for synchronizing with client that only support local time specifications (rather than UTC). For installations supporting multiple user time zones, the USERTIMEZONE() script function (see  REF _Ref204925451 \r \h 6.14.4) can be used to set the time zone specifically for a sync session, usually derived from the user account.  XE "autoenddateinclusive" \f T : end date for allday events inclusive Contained in: , Can contain: boolean value Attributes: none Default: true for clients, false for servers. If this option is set, date values with conversion mode "autoenddate" (see  REF _Ref182995906 \r \h 10.3.4).will be rendered as 23:59:59 of the previous day in old formats like vCalendar 1.0. If it is not set, "autoenddate"s will be rendered as 0:00 of the next day (which usually is the first day not included in the all-day event when "autoenddate" is used for DTEND properties). Note that this setting can be modified on a per-device basis using a remote rule (see  REF _Ref231889747 \r \h 11.36.18) < XE "abortonallitemsfailed " \f T abortonallitemsfailed>: error handling option Contained in: , Can contain: boolean value Attributes: none Default: yes This determines if receiving an error for all items sent in a slow sync to the remote party is considered a complete failure of the entire sync for that datastore, or if the failing items are simply marked for being re-tried in the next sync. (Note that before 3.1.x, this applied to normal sync as well – which is no longer the case as in a normal sync with few upates a failure of these usually does not indicate a general problem).  XE "showctcapproperties" \f T : show field support details in device information Contained in: , Can contain: boolean value Attributes: none Default: yes This determines if the list of supported fields should be listed in the device information sent to the remote party. Normally, this should be switched on – but sometimes if a device does not send all fields one would expect it should send, disabling sending the field information might help as then the device cannot do (possibly wrong) decisions on the fields it should send based on the device information. This can help to debug IOT problems with such devices. Note that there is a scripting function SHOWCTCAPPROPERTIES (see  REF _Ref43008774 \r \h 6.14.6) that allows switching this option on and off on a session by session base (for example in the , see  REF _Ref43727925 \r \h 11.33, maybe depending on AUTHDEVICEID()).  XE "showtypesizeinctcap10" \f T : show size and type in SyncML 1.0 devInf Contained in: , Can contain: boolean value Attributes: none Default: no This determines if in the list of supported fields, the type and (max)size information should be included when sending devInf to SyncML 1.0 devices. By default, this is set to "no", because even though type and (max)size is valid information for SyncML 1.0, some of these (old) client implementations cannot handle it and would crash. This option can be set to "yes" in the unlikely case the type and (max)size information should be included for SyncML 1.0 clients. SyncML 1.1 and later clients are not affected (and always receive type and (max)size information when available server side).  XE "enumdefaultpropparams" \f T : enumerate default property parameter's values as property names Contained in: , Can contain: true, false, default Attributes: none Default: default (automatic) This determines how the default parameter of a MIME-DIR property (for example TYPE for TEL in vCard 2.1) is shown in the device information. If it is set to true, all possible values for the parameter are enumerated as parameter names (propParam tag). This is required e.g. by some Nokia DS 1.1 clients. If it is set to false, the possible parameter values are shown as valEnum tags, as required by DS 1.2 clients. If set to "default", the format is automatically chosen depending on the SyncML version of the current session. Except for very special cases, usually in debugging new clients, this setting should be left at its default. Note that there is a scripting function ENUMDEFAULTPROPPARAMS (see  REF _Ref43008774 \r \h 6.14.6) that allows switching this option on and off on a session by session base (for example in the , see  REF _Ref43727925 \r \h 11.33, maybe depending on AUTHDEVICEID()).  XE "acceptserveralerted" \f T : Acceptance of server alerted sync types Contained in: , Can contain: boolean value Attributes: none Default: yes If yes, "server alerted" sync types are accepted by the server. They operate exactly like the normal client-initiated sync types, but indicate that the sync was triggered by the server (for example via SAN using the Synthesis PushAlerter tool). If for some reason a server should generally reject server alerted syncs, this can be set to false.  XE "logfile" \f T : Activity log text file Contained in: , Can contain: complete path for log file Attributes: none Default: none This tag can contain a path to a text file (which must be writable). For each datastore involved in a sync session, a log entry as specified with (see  REF _Ref47167783 \r \h 11.31) will be appended to this file (usually a single line). Note that in addition to this logfile, you can also specify a SQL statement to store log information in a SQL database table (see  REF _Ref46754571 \r \h 12.19).  XE "logenabled" \f T : Activity log enable Contained in: , Can contain: boolean value Attributes: none Default: true This tag enables or disables recording activity log information in the text file (see  REF _Ref47168251 \r \h 11.21), in the SQL database table (see  REF _Ref46754571 \r \h 12.19) and in a eventual database adapter plugin (see  REF _Ref153681044 \r \h 14.2). Note that this setting is used as the default setting for all sessions, but using the SETLOG() function in or (see  REF _Ref47168523 \r \h 11.33 and  REF _Ref47168540 \r \h 12.17) activity log can be enabled or disabled on a per-session basis (for example, prevent logging specific test users etc.).  XE "logformat" \f T : Activity log format Contained in: , Can contain: string (C-string) Attributes: none Default: standard logfile format, depends on server/client version This string is used to format log entries. It is a string in the C language syntax (see  REF _Ref47171157 \r \h  \* MERGEFORMAT 3.4), To actually insert useful log information, the following sequences can be used: %T Time of sync as plain text (synonymous with %seT) %ssT Sync start time in plain text (when this sync attempt, successful or not, has started) %seT Sync end time in plain text (when this sync attempt, successful or not, has ended) %nD Datastore name (the name as defined in , see  REF _Ref47169243 \r \h 11.34) %rD Datastore remote path (identification of the remote party's datastore) %lD Datastore local path (how the remote party has addressed the local datastore, this might include subfolder information and CGI options) %iR Remote Device ID (URI of the remote device, usually a IMEI number for phones) %nR Remote Device name (if a is applied which has a part, this shows the instead of the real name sent by the device. See  REF _Ref42941679 \r \h 11.36 for details) %vR Remote Device version information as provided by the device's device information in the following format: DeviceType (HardwareVersion, FirmwareVersion, SoftwareVersion) OEMname %U User name %sS Status code for this datastore (0 if successful, 408 for timeout, all other errors are SyncML status codes). Note that other datastores in the same sync session might have different status. %ssS Session status code (0 if successful, 408 for timeout). Note that the session status can be successful even if some datastores have non-successful status. %syV SyncML protocol version string ("1.2", "1.1" or "1.0"). %syVn Numeric code for SyncML protocol version: 1=1.0, 2=1.1, 3=1.2 %mS Sync Mode (0=twoway, 1=fromclient 2=fromserver) %tS Synctype (0=normal,1=slow,2=firsttime slow, 10=normal resumed, 11=slowsync resumed, 12=first time resumed) %laI number of locally added Items %raI number of remotely added Items %ldI number of locally deleted Items %rdI number of remotely deleted Items %luI number of locally updated Items %ruI number of remotely updated Items %leI number of locally failed Items %reI number of remotely failed Items %diB number of incoming (received) content data bytes for this datastore (net content data excluding any SyncML protocol overhead) %doB number of outgoing (sent) content data bytes for this datastore (net content data excluding any SyncML protocol overhead) For servers only, the following sequences are also available: %iS Server Session ID (useful to find a corresponding debug logfile, see  REF _Ref47170147 \r \h 8.11) %smI number of items matched in slow sync %scI number of conflicts won by the server %ccI number of conflicts won by the client %dcI number of conflicts resolved by duplicating the conflicting item %tiB session total of incoming (received) bytes (SyncML messages, not including transport protocol's header or other envelope data) %toB session total of outgoing (sent) bytes (SyncML messages, not including transport protocol's header or other envelope data)  XE "loglabels" \f T : Activity log header Contained in: , Can contain: text (C-string) Attributes: none Default: header for standard logfile format, depends on server/client version This tag specifies a text (in C-String format, see  REF _Ref47171157 \r \h 3.4) that is written as the first line in the file specified as . This can be useful to write a header for a log file in tab separated text form, for example. XE "logininitscript" \f T,  XE "loginfinishscript" \f T : Pre- and post-login scripts Contained in: Available: in PRO versions only Can contain: script returning boolean value Script context: login context Attributes: none Default: no script The is executed before testing login details with the database. It can be used to pre-process the user name for example. If this script returns TRUE as result, this means that login is granted without any further database lookup. If the script returns FALSE as result, this means that login is rejected without any further database lookup. If the script does not return a value, this means that futher checks are needed to validate the login data (such as executing , see  REF _Ref43727921 \r \h 12.16, and , see  REF _Ref43727928 \r \h 12.17). The is executed after database level authorisation is done (regardless of the result) and has the final say about actually allowing or denying access. If this script does not return a value, the result of the database level authorisation decides about granting access. Otherwise, if this script returns TRUE as result, this means that login is granted, otherwise access is denied. The is a good place to apply user-specific parameters (like setting the user time zone context, see  REF _Ref185257870 \r \h 5.2). These scripts have access to the SQL execution functions described in  REF _Ref78024414 \r \h 12.1.4 and the following special script functions: integer XE "AUTHOK" \f FAUTHOK(): returns true if the standard checking thinks that login is ok. string XE "AUTHUSER" \f FAUTHUSER(): name of the user that tries to log-in XE "SETUSERNAME" \f FSETUSERNAME(string username): sets the username that should be used to perform login checking (can be used in SQL with %U) XE "SETDOMAIN" \f FSETDOMAIN(string domain): Sets the "domain", can be used in SQL with %D string XE "AUTHSTRING" \f FAUTHSTRING(): The auth string sent by the remote (clear text password or MD5 digest) integer XE "AUTHTYPE" \f FAUTHTYPE(): 0=anonymous (no credentials), 1=password in clear text, 2=SyncML 1.0-type MD5 digest, 3=SyncML 1.1-type MD5 digest. string XE "AUTHDEVICEID" \f FAUTHDEVICEID(): The device ID sent by the remote integer XE "UNKNOWNDEVICE" \f FUNKNOWNDEVICE(): returns TRUE if this is the first time this device tries to connect this server. string  XE "USERKEY" \f F USERKEY(): Gets the current userkey (as set by SETUSERKEY() or retrieved by the query, see  REF _Ref43727921 \r \h 12.16) XE "SETUSERKEY" \f FSETUSERKEY(string userkey): Sets the value that should be used as "userkey". string  XE "DEVICEKEY" \f F DEVICEKEY(): Gets the current device key (as set by SETDEVICEKEY() or retrieved by the query, see  REF _Ref68495073 \r \h 12.15) XE "SETDEVICEKEY" \f FSETDEVICEKEY(string devicekey): Sets the value that should be used as "devicekey". integer  XE "CHECKAUTH" \f F CHECKAUTH(string user, string secret, integer secretismd5): This function allows implementing completely custom checking of credentials in the . It checks if the credentials sent by the remote device matches the specified user and secret. Secret must be either the password in clear text (if secretismd5==FALSE) or the b64(md5(user:password)) hash (if secretismd5==TRUE). Usually a custom credential checking involves getting the secret for a user from the local database (EXECSQL etc., see  REF _Ref78024414 \r \h 12.1.4), possibly converting/decrypting it to obtain either a clear-text password or the b64(md5(user:password)) hash. If furthe database accesses depend on a user key, SETUSERKEY() should be used to set it appropriately. Finally, the would return the result of CHECKAUTH() to accept or reject the login request. timestamp  XE "CONVERTTOUSERZONE" \f F CONVERTTODATAZONE(timestamp atime [,boolean doUnfloat]): this returns atime converted to the data time zone (the time zone set for the datastore or the session using , see  REF _Ref185246110 \r \h 11.34.31). If doUnfloat is set to true, floating time stamps will be fixed into local time of the data time zone, without changing their time value. integer TIMESTAMPTODBINT(timestamp ts,string dbfieldtype): Converts the timestamp ts's value to a integer representation. Dbfieldtype specifies the integer representation type to use as a database field type (see  REF _Ref47173451 \r \h 11.34.41.1). Note that not all database field types can be used, but only "lineartime", "lineardate", "unixtime_s", "unixtime_ms", "unixtime_us", "unixdate_s", "unixdate_ms", "unixdate_us". timestamp DBINTTOTIMESTAMP(integer dbint,string dbfieldtype): Converts the integer representation of a date/time value dbint into a timestamp value. Dbfieldtype specifies the integer representation type to use as a database field type (see  REF _Ref47173451 \r \h 11.34.41.1). Note that not all database field types can be used, but only "lineartime", "lineardate", "unixtime_s", "unixtime_ms", "unixtime_us", "unixdate_s", "unixdate_ms", "unixdate_us". XE "datastore" \f T: General Datastore settings Contained in: Can contain: , , and server-type specific tags, see  REF _Ref42944330 \r \h 12.20. Attributes: name, type Default: not specified This tag specifies all the details for one datastore. A datastore is the SyncML concept for a collection (table) of objects (records) of the same type (e.g. vCard or vCalendar). A can contain multiple sections to support multiple datatypes. Note that the sample config file defines two datastores, one for contacts (vCard) and one for events and tasks (vCalendar). A datastore must have a name attribute, which specifies the name under which the datastore will be accessible from the SyncML client. For example, if the name is set to "mytest", the datastore will be accessible under "./mytest" (some clients allow just "mytest"). Note that the folder concept (see  REF _Ref42943895 \r \h 12.20.1) allows datastores to contain multiple folders that are addressed like "./mytest/foldername". A datastore can also have a type attribute. It has no relevance in SyncML engines that support only one type of datastore (such as textfile or odbc) - which is the case for our current standard products. However, future products and customized products might need the type attribute to select among different types of datastores (that is, database interfaces). Note that this section only covers the settings that are not dependent on the database type. See  REF _Ref42944330 \r \h 12.20 and for settings specific to ODBC or for text (demo) datastores. Example (skeleton for a contact and a task/event datastore):  XE "dbtypeid" \f T : alternate name for this datastore Contained in: of Can contain: alternate data store name Attributes: none Default: none This can be used to make the same datastore accessible with an alternate name. In scripts the LOCALDBNAME() function (see  REF _Ref55271118 \r \h 11.34.21) can be used to find out what name was used by the remote (client) to address the datastore – and possibly behave differently depending on what name was used.  XE "dbtypeid" \f T : datastore type ID Contained in: Can contain: 32-bit unique identifier number for datastore, must not be zero Attributes: none Default: none This is required for SyncML engine library based applications. The is a 32-bit number which is used to identify the datastore when accessing its user settings (see SDK manual for details about accessing settings via the settings key mechanisms). It is also used to identify datastore related progress events. The must be unique for each in the config, may not be zero and must not change once assigned (if it changes, related user settings will get detached). Otherwise, you are free to choose any number for this ID. XE "displayname" \f T: decriptive name for a datastore Contained in: Can contain: string Attributes: none Default: none This option allows to set a descriptive name for a datastore. This descriptive text will be transmitted to the remote party and might be used instead of the real name in communication with the end user (to select a database from a list, for example). In Synthesis SyncML engine library, this string can be queried as "dispName" value. XE "readonly" \f T: read-only datastore Contained in: Can contain: boolean value Attributes: none Default: off This option allows a datastore to be defined as read-only. This will cause that the remote party cannot write to that datastore (attempts to do so will simply be ignored). Note that in PRO versions, it is also possible to switch to read-only mode based on login information; see session-level SETREADONLY() script function in  REF _Ref45368706 \r \h 11.33, and datastore-level SETREADONLY() script function in  REF _Ref55271118 \r \h 11.34.21. XE "deletewins" \f T: delete overrides replace Contained in: Can contain: boolean value Attributes: none Default: off New in: 3.0.2.2 Normally, when a delete and a replace operation conflict, the replace always wins to preserve data. When is set, this makes delete win over replace. Note that in a function DELETEWINS is available (see  REF _Ref169609101 \r \h 10.5.11) to set delete override on a item-per item basis. XE "tryupdatedeleted" \f T: try to update "deleted" items Contained in: Can contain: boolean value Attributes: none Default: off New in: 3.0.2.2 This is a special option relevant only for the case of a client update conflicting with a server delete (and not set, see  REF _Ref169607904 \r \h 11.34.5). Server deletes can be caused by the item really deleted from the server, but also if a item falls out of a filter (such as a date range). In the latter case, the item still exists, but is no longer visible in the syncset. If the client tries to update such an item, the update will be converted to an add, because that item is not in the syncset. This creates a duplicate in the server database. With , before adding the item again, the server will try to update the item. Only if that fails, this means that the item is really deleted, not only filtered out and should be added again. XE "reportupdates" \f T: transmit updates to remote Contained in: Can contain: boolean value Attributes: none Default: on Setting this option to "no" will suppress reporting changes to existing records to the remote party. This can make sense for datastores with objects that cannot change per definition (such as received email) and will prevent updates for such objects in all cases (even if the modification date is updated).  XE "maxitemspermessage" \f T : maximum number of data items per SyncML message Contained in: Can contain: max number of items per SyncML message (0=no limit) Attributes: none Default: 0 (no limit) This can be used to specify how many items from this datastore are sent to the remote party in a single SyncML message maximally. Usually, there is no need to set a maximum, as the maximum SyncML message size implicitly limits the number of items anyway. However, if a datastore is exceptionally slow in fetching even small data items, setting a limit can ensure composing a SyncML message does not take too long. XE " alwayssendlocalid " \f T: send localID (GUID) in all operations (not only adds). Contained in: (in only) Can contain: boolean value Attributes: none Default: off New in: 3.0.2.0 Setting this option to "yes" will cause the server to send the server-side ID (localID, GUID) to be sent to the client not only in SyncML "Add" commands, but also for "Replace" and "Delete". Note that this is not strictly according to the SyncML standard – however it is accepted by real-world clients and helps avoiding problems when client items addressed by a "Replace" command do not exist any more. Without the localID, a client cannot add items instead of replace, which can cause sessions to abort. XE "conflictstrategy" \f T, XE "slowsyncstrategy" \f T, XE "firsttimestrategy" \f T: sync conflict resolution strategy Contained in: Can contain: conflict strategy name Attributes: none Default: newer-wins These tags specify how to handle conflict situations (an object was modified on both server an client). defines the strategy that is used during normal synchronisation, where defines the strategy that is used in so-called slow sync (not first time synchronisation after some problem or data loss in either client or server). defines the strategy that is used in first-time sync, and is normally set to the same strategy as The following values can be specified: "duplicate" : The conflicting objects are duplicated such that both client and server will have both versions of the object. The user then decides which one is the "right" one or to keep both. "newer-wins": If the objects in question both carry a timestamp when they were last modified, the object that was more recently modified will "win" the conflict. If no timestamps are available, this mode works like "duplicate". "server-wins": Server's version always wins the conflict. "client-wins": Client's version always wins the conflict. Note that "winning" does not necessarily mean that winning side's data simply overwrites loosing side's data. Synthesis Sync Server has powerful merging features that will combine data from both objects. The merging is contolled by the "merge" attribute of the tag (see  REF _Ref5625615 \r \h 10.2) and can be customized with (PRO version only). The default setting of "newer-wins" is the most "smart" mode; it reduces unnecessary duplicates while still avoiding newer data to be overwritten with older data. Note that the actual strategy used for a sync session can also be defined in runtime (depending on user settings for example) by using the SETCONFLICTSTRATEGY() script function in the (see  REF _Ref55271118 \r \h 11.34.21). XE "typesupport" \f T: datastore's supported types Contained in: Can contain: Attributes: none This tag defines what SyncML content data types (as defined in the config section, see  REF _Ref6129297 \r \h 10) are used for sending data to and receiving data from a SyncML client. The tag must contain a tag for every data type that is to be supported by the datastore. A datastore can support multiple (similar) types such as different versions of vCard for a contact datastore. XE "use" \f T: use a datatype Contained in: Can contain: nothing Attributes: datatype, mode, preferred This tag adds support for a datatype (such as a vCard or vCalendar version, or any other customer-defined datatype). The tag has the following attributes: "name": this must be a name of a previously defined datatype (using the tag in the section of the config file (see  REF _Ref6060179 \r \h 10.5). "mode": this optional attribute specifies if the datatype is to be used for receiving data from the client ("r") or for sending data to the client ("w") or both ("rw"). The default is "rw". "preferred": this optional attribute must be present for exactly one write-enabled and one read-enabled (or one combined read-write-enabled) tag. It is used to specify which datatypes are preferred for reading and writing. The special value "legacy" can be specified instead of "no" to specify a type that should be used as the preferred type when the engine runs ins so-called legacy mode (i.e. when a not fully conformant remote party is detected automatically or settings or remote rule (see  REF _Ref247361819 \r \h 11.36.21) demand it). For example, in configurations that support both vCard 2.1 and vCard 3.0, usually vCard 3.0 should be marked preferred=yes, and vCard 2.1 as preferred=legacy. So fully compliant remote parties will profit from the newer vCard 3.0 format, while bad implementations that might not work properly with the new format will use the older vCard 2.1. "rulematch": (3.0.2.0 and newer) this optional attribute is used to define device-specific data types. The contents of "rulematch" can be a single name of a (see  REF _Ref42941679 \r \h 11.36) or a comma separated list of remote rule names. The names might also contain wildcards (* and ?). If "rulematch" matches the currently active remoterule, the specified datatype will be used instead of the preferred type and overriding normal transfer type negotiation. Example (a contact datastore supporting vCard 2.1 and vCard 3.0 for both reading and writing, while preferring vCard 2.1, and a special datatype exclusively for a exotic device):  XE "ds12filters" \f T : enable SyncML DS 1.2 filtering Contained in: Can contain: boolean value Attributes: none Default: on If this is set to true, the sync engine accepts SyncML DS 1.2 style specifications (see  REF _Ref153291752 \r \h 7.4 for syntax) in the commands, and reports filter capabilities in the device information (SyncML DS 1.2 only).  XE "ds12filters" \f T : enable date range filtering Contained in: Can contain: boolean value Attributes: none Default: on If this is set to true, this datastore supports date range filtering (see /dr() option in  REF _Ref153732324 \r \h 7.5 and SINCE/BEFORE keywords in  REF _Ref153288035 \r \h 7.3). Note that actual support must be implemented using appropriate in the datatype (see  REF _Ref55274563 \r \h 10.5.10) or in SQL (see  REF _Ref153732596 \r \h 12.20.25) to actually make date ranges functional. Setting this option only makes date range filtering keywords appear in the device information (SyncML DS 1.2 only).  XE "acceptfilter" \f T : check incoming items Contained in: Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none This filter is applied (in test mode) to incoming items to check if the datastore can process them. If not, the item is rejected with SyncML status code 415 ( unsupported type or format). This filter is also applied in make-pass mode (see  REF _Ref47262189 \r \h 7.1) to any item sent from the datastore to the remote party to make sure it meets the conditions. This filter is useful for example to avoid vTODO items to mess up an event-only datastore and vice versa. Note that more complex filtering (or filtering that causes items to be ignored rather than rejected with status 415) can be implemented with the (see  REF _Ref46823145 \r \h 10.5.11). To simply make discard items silently instead of returning status 415, use (see  REF _Ref247356244 \r \h 11.34.16).  XE "silentdiscard" \f T : discard not accepted items silently Contained in: Can contain: boolean value Attributes: none If this is set to true, incoming items that do not pass the (see  REF _Ref247356327 \r \h 11.34.15) are silently discarded and successful status is returned, rather than 415.  XE "localdbfilter" \f T : filter subset of datastore Contained in: Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none This filter is applied (in test mode) to all items read from the local database. If an item does not pass the filter, it will be simply ignored for the synchronisation. This filter is also applied in make-pass mode (see  REF _Ref47262189 \r \h 7.1) to any item sent from the remote party before storing it in the local database. This filter basically does the same thing (actually with reversed logic) as the . However, while visibility is something that is also changed on a per-item basis, the is meant to implement a first-level subselection of items. An example for this would be when a server database that contains both events and tasks, but we need to create a for events only. Normally, this can be archieved by appropriate WHERE clauses in SQL statements directly, but with this can be implemented for text-based datastores as well.  XE "invisiblefilter" \f T : filter invisible items Contained in: Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none This filter is applied (in test mode) to items to be sent to the remote party. If the filter result is true, the item is not sent to the remote party (it is considered invisible for the remote party). This filter is also applied in make-pass mode (see  REF _Ref47262189 \r \h 7.1) when the SyncML engine must make an item invisible for the remote party. For example, when a SyncML client sends an archive-delete command, the SyncML engine will apply to the item - which looks like deleting the item from the client (it is not there any more - invisible) but still exists in the database.  XE "makevisiblefilter" \f T : make item visible Contained in: Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none This filter is never used in test mode, but only in make-pass mode (see  REF _Ref47262189 \r \h 7.1) as follows: When an item must be made visible for the remote party, and test returns true (meaning that the item is invisible), then the is applied in make-pass mode. This happens for items that are added to a server from a client to make sure they will be visible when they are read back from the server database later.  XE "makepassfilter" \f T : make incoming items pass Contained in: Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none This filter is never used in test mode, but only in make-pass mode (see  REF _Ref47262189 \r \h 7.1) as follows: Before an incoming items is added to the database, the is applied in make-pass mode. This primarily makes sense in a server that has visibility control to make sure that items added from clients without a visibility level specified in the database path CGI are added to the database with a defined visibility level.  XE "datastoreinitscript" \f T : script called before accessing database Contained in: Available: in PRO versions only Can contain: script Script context: datastore context Attributes: none Default: no script This script is executed just before the datastore contents (that is, the sync set's data itself) is accessed for the first time in a sync session. Note that access to administrative data (like targets and maps) has already taken place at this time. This is is good place to modify filters depending on the remote device (see remote rules in  REF _Ref42941679 \r \h 11.36 and REMOTERULENAME() function in  REF _Ref43008774 \r \h 6.14.6) or depending on options passed by the client (such as the string in DBOPTIONS(), see below). It is also the place to apply options like readonly folders that have been detected for example in (see  REF _Ref166651506 \r \h 11.34.23). This script has access to the following special script functions: string  XE "GETCGITARGETFILTER" \f F GETCGITARGETFILTER(): returns the current temporary filter string as sent by client, see CGI options in  REF _Ref46896711 \r \h  \* MERGEFORMAT 7.4. Note that this might change during the sync session, depending on the client. The complete filter expression used as temporary filter consists of GETCGITARGETFILTER() and GETTARGETFILTER() together. string  XE "GETTARGETFILTER" \f F GETTARGETFILTER(): returns the current temporary target filter string (as internally set by SETTARGETFILTER or ADDTARGETFILTER, see below). The complete filter expression used as temporary filter consists of GETCGITARGETFILTER() and GETTARGETFILTER() together  XE "SETTARGETFILTER" \f F SETTARGETFILTER(string targetfilter): sets the current temporary filter to targetfilter, overwriting any existing filter string.  XE "ADDTARGETFILTER" \f F ADDTARGETFILTER(string targetfilter): adds an additional temporary filter expression to the existing dynamic target filter (See  REF _Ref46752884 \r \h 7 for difference between dynamic and static filters). This function automatically inserts parantheses and an "and" operator such that the resulting filter expression will be true only if both existing and new added filter expressions string  XE "GETFILTER" \f F GETFILTER(): returns the current dynamic target filter string (as eventually sent by client, see CGI options in  REF _Ref46896711 \r \h  \* MERGEFORMAT 7.4)  XE "SETFILTER" \f F SETFILTER(string filter): sets the current dynamic target filter to filter, overwriting any existing filter string.  XE "ADDFILTER" \f F ADDFILTER(string filter): adds an additional dynamic filter expression to the existing dynamic target filter (See  REF _Ref46752884 \r \h 7 for difference between dynamic and static filters). This function automatically inserts parantheses and an "and" operator such that the resulting filter expression will be true only if both existing and new added filter expressions are true.  XE "ADDSTATICFILTER" \f F ADDSTATICFILTER(string filter): adds an additional filter expression to the existing static database filter (defined by , see  REF _Ref54100850 \r \h 11.34.17). This function automatically inserts parantheses and an "and" operator such that the resulting filter expression will be true only if both existing and new added filter expressions are true. string  XE "DBOPTIONS" \f F DBOPTIONS(): returns the option string specified by the remote party using the /o() option as CGI parameter in the database path (see CGI options in  REF _Ref46896711 \r \h  \* MERGEFORMAT 7.4). string  XE "DBNAME" \f F DBNAME(): returns the name of the datastore. This might be useful for example in the vCalendar datatype to check if the vCalendar item is being used in the "tasks" or the "events" datastore. string  XE "LOCALDBNAME" \f F LOCALDBNAME(): returns the name of the local datastore as used in the target locuri specification from the remote party. This can be used in datastores with es (see  REF _Ref247356737 \r \h 11.34.1) to find out how the datastore was addressed. string  XE "REMOTEDBNAME" \f F REMOTEDBNAME(): returns the name of the remote datastore as used in the source locuri specification from the remote party. Note that the remote datastore name might be a path containing multiple elements and even CGI. timestamp  XE "STARTDATE" \f F STARTDATE(): returns the start date if a date range was set for the datastore (for example with the /dr() CGI option, see  REF _Ref46896711 \r \h 7.4). If no range was set, STARTDATE() returns EMPTY.  XE "SETSTARTDATE" \f F SETSTARTDATE(timestamp date): sets the start date (as it can also be set by the /dr() CGI option (see  REF _Ref46896711 \r \h 7.4) according to date. timestamp  XE "ENDDATE" \f F ENDDATE(): returns the end date if a date range was set for the datastore (for example with the /dr() CGI option, see  REF _Ref46896711 \r \h 7.4). If no range was set, ENDDATE () returns EMPTY.  XE "SETENDDATE" \f F SETENDDATE(timestamp date): sets the end date (as it can also be set by the /dr() CGI option (see  REF _Ref46896711 \r \h 7.4) according to date. integer  XE "NOATTACHMENTS" \f F NOATTACHMENTS(): returns TRUE if the /na GCI option (see  REF _Ref46896711 \r \h 7.4) is set.  XE "SETNOATTACHMENTS" \f F SETNOATTACHMENTS(integer flag): set the /na option (see  REF _Ref46896711 \r \h 7.4) according to flag. integer  XE "MAXITEMCOUNT" \f F MAXITEMCOUNT(): returns the number specified with the /max GCI option (see  REF _Ref46896711 \r \h 7.4) or zero if no /max option was used.  XE "SETMAXITEMCOUNT" \f F SETMAXITEMCOUNT(integer maxcount): set the the /max GCI option (see  REF _Ref46896711 \r \h 7.4) according to maxcount (0 = no item count limit). integer  XE " DEFAULTSIZELIMIT" \f F  DEFAULTSIZELIMIT(): returns the default size limit set with the /li() CGI option, (see  REF _Ref46896711 \r \h 7.4). If no size limit was set, DEFAULTSIZELIMIT() returns EMPTY. Note that individual items might have a size limit differing from the default (see SIZELIMIT and SETSIZELIMIT functions in  REF _Ref55274563 \r \h 10.5.10)  XE "SETDEFAULTSIZELIMIT" \f F SETDEFAULTSIZELIMIT(integer limit): set the the /li() CGI option (see  REF _Ref46896711 \r \h 7.4) according to limit (EMPTY = no size limit, 0 = only header information). integer  XE "DBHANDLESOPTS" \f F DBHANDLESOPTS(): This returns TRUE if the database implementation does handle the needed filtering for date range and limit options automatically. For the currently available ODBC and text based datastores, this always returns FALSE, but future implementations might be able to handle the filtering natively. integer  XE "SLOWSYNC" \f F SLOWSYNC(): returns true if session is a slow sync FORCE XE "SLOWSYNC" \f F SLOWSYNC(): can be used in (see  REF _Ref111000885 \r \h 11.34.25) to force a slow sync even if the sync engine would do a normal sync. This has the same effect as using the /slow option in the database path (see  REF _Ref46896711 \r \h 7.4). integer  XE "FIRSTTIMESYNC" \f F FIRSTTIMESYNC(): returns true if session is a first-time (slow) sync  XE "SETCONFLICTSTRATEGY" \f F SETCONFLICTSTRATEGY(string strategy): allows to define a conflict strategy for the datastore for example depending on logged in user or device. strategy must be a valid strategy name as described in  REF _Ref46908455 \r \h 11.34.10. integer  XE "ALERTCODE" \f F ALERTCODE(): returns the alert code for the current synchronisation (see SyncML standard for details). This can be useful in (see  REF _Ref111000885 \r \h 11.34.25) to determine what kind of synchronisation was requested. integer  XE "SETALERTCODE" \f F SETALERTCODE(integer alertcode): allows to set the alertcode to something different than received from the remote party in (see  REF _Ref111000885 \r \h 11.34.25). Note that doing so requires knowledge of the SyncML protocol - arbitrarily modifiying the alert code is likely to make sync sessions fail. integer READONLY(): returns true if the current sync is a read-only sync, that is, data from the remote is ignored, and the local database is only read (never written) to send updates to the remote party. Note that the initial state of this flag is determined by the tag (see  REF _Ref131305143 \r \h 11.34.4) and by the session-level SETREADONLY() function (see  REF _Ref43727925 \r \h 11.33). SETREADONLY(integer readonly): sets the readonly flag. This is useful to force a read-only sync (modifications from the remote party will be ignored) with this datastore when the remote actually requests a two-way sync in the (see  REF _Ref111000885 \r \h 11.34.25). Note that there is also a session-level version of SETREADONLY(), see  REF _Ref43727925 \r \h 11.33. integer REFRESHONLY(): returns true if the current sync is a refresh-only sync, that is, only data from the remote is received and stored, but no updates or adds are sent to the remote party. SETREFRESHONLY(integer refreshonly): sets the refreshonly flag. This is useful to force a refresh-from-remote sync when the remote actually requests a two-way sync in the (see  REF _Ref111000885 \r \h 11.34.25). Make sure that you do not clear the refreshonly flag when the remote actually requests a refresh-only sync, as this will likely make the sync session fail (the remote does not expect data coming from the server). In SyncML client configurations, additionally the following functions are available: ADDTARGETCGI(string cgi): adds the string cgi as CGI to the database path sent to the server. This can be used to add TAF expressions or proprietary server options to the base server database path. The function automatically adds a "?" delimiter between the database path before appending cgi if the delimiter is not already part of the database path. The function also checks if cgi is already part of the database path and if so, does not add it a second time. SETRECORDFILTER(string filterexpression, boolean inclusive): sets a record level filter for the alert to be sent to the server. If the session is run in SyncML DS 1.2 or later, the filter expression is sent to the server using the and tags. Otherwise, inclusive and exclusive filters are added using the /tf() and /fi() option syntax, resp. see  REF _Ref153732324 \r \h 7.5. SETDAYSRANGE(integer daysbefore, integer daysafter): sets a relative day range from daysbefore days into the past and daysafter days into the future for the alert to be sent to the server. If the session is run in SyncML DS 1.2 or later, this range is represented as a filter expression using the BEFORE and SINCE filter keywords. Otherwise, the date range is added as CGI using the /dr(-x,y) option syntax, see  REF _Ref153732324 \r \h 7.5. variant TARGETSETTING(string settingsfieldname): Only for client configurations which are based on the Synthesis SyncML client engine library, this function can be used to query certain (not all) fields of the target settings. See the  HYPERLINK "SDK_manual.pdf" SDK_manual.pdf for more information on target settings. Currently supported settingsfieldnames are: "extras", "limit1", "limit2", "remoteFilters". Others might be supported depending on the client engine library version. This is useful for example to use the limit1 and limit2 fields in the settings for user-settable date range, which can then be queried in (see  REF _Ref207634778 \r \h 11.34.26) using TARGETSETTING() and applied to the outgoing alert using SETDAYSRANGE().  XE "datastoreinitscript" \f T : script called after accessing database Contained in: Available: in PRO versions only Can contain: script Script context: datastore context Attributes: none Default: no script This script is executed just after the datastore has been (successfully) accessed. See also for details.  XE "adminreadyscript" \f T : script called when admin data (targets, maps) are read Contained in: Available: in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script This script is executed when datastore related administrative data (target information, folder information, map data) has been fetched. This is is good place to implement folder specific behaviour (e.g. making a folder read-only). Unlike , the has access to the database context specific functions (such as those described in  REF _Ref153776689 \r \h 11.34.41.3 or in  REF _Ref78024414 \r \h 12.1.4 for ODBC).  XE "optionfilterscript" \f T : script executed at end of sync Contained in: Available: in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script This script is called once after all operations related to a datastore in a sync session are completed. This is the script to place special application specific operations that must be done after completing sync with a datastore. Note that the syncendscript is executed at end of both successful and failing sync sessions. Unlike , the has access to the database context specific functions (such as those described in  REF _Ref153776689 \r \h 11.34.41.3 or in  REF _Ref78024414 \r \h 12.1.4 for ODBC).  XE "alertscript" \f T : script called at sync alert Contained in: Available: in PRO versions only Can contain: script Script context: datastore context Attributes: none Default: no script This script is executed when the server receives an command from the client. This is the place to install custom behaviour (like switching to refresh-from-remote only using the SETREFRESHONLY() function or update-remote only using SETREADONLY()). All script functions available in are available (see  REF _Ref55271118 \r \h 11.34.21), but not all might make sense at this stage of the sync process. Note: Don't confuse this with (see  REF _Ref207634778 \r \h 11.34.26).  XE "alertprepscript" \f T : script called before sending sync alert Contained in: within Available: in PRO version clients only Can contain: script Script context: datastore context Attributes: none Default: no script This script is executed before a client sends an to the server. This is the place to add extra parameters for the datastore sync like filter expressions (see  REF _Ref46752884 \r \h 7) or date range options (see  REF _Ref153732324 \r \h 7.5). This can be done using script functions like ADDTARGETCGI(), SETRECORDFILTER(), SETDAYSRANGE(), TARGETSETTING() Note: Don't confuse this with (see  REF _Ref111000885 \r \h 11.34.25). XE "sentitemstatusscript" \f T: script to handle status codes for sent items Contained in: or / (see text) Available: in PRO versions only Can contain: script Script context: datastore context Attributes: none Default: no script This script is executed whenever a status for a sent data item is received. Note that this script can be specified on both the datastore level (will catch status for that datastore only) or on the session level (will catch all status responses). This script must return true if it has taken all actions required to handle the status code, otherwise it should return nothing or false which will cause the engine to apply default processing for the status code. This script has access to the following special script functions: integer  XE "STATUS" \f F STATUS(): returns the current status code. See  REF _Ref47451048 \r \h 18.1 for a list of SyncML error codes.  XE "SETSTATUS" \f F SETSTATUS(integer statuscode): sets a new statuscode (this will be used by all subsequent processing of the status instead of the original status code, including the Sync engine's default processing. SETRESEND(boolean resend): This can be used to override the error case behaviour set by (see  REF _Ref153774103 \r \h 11.34.29) on a per-item basis. If resend is set to true, the item will be marked for resend in the next session. If resend is set to false, a non-OK status will cause an error and abort the sync with that datastore. Note that marking items for resend only works in datastores with (see  REF _Ref153707807 \r \h 11.34.39) switched on.  XE "ABORTDATASTORE" \f F ABORTDATASTORE(integer statuscode): aborts syncing the current datastore (but continues the sync session if it includes other datastores) and reports statuscode as the reason for aborting the sync. Note that statuscode can be 0 to abort silently.  XE "STOPADDING" \f F STOPADDING(): Stops adding more data to the remote datastore. This can be used to continue a sync after the remote party signals that its datastore has no capacity to accept further records. string  XE "SYNCOP" \f F SYNCOP(): Returns the sync operation related to the status code being processed. Possible return values are: "add", "replace", "archive+delete", "soft-delete", "delete", "copy" and "map".  XE "receiveditemstatusscript" \f T : script to handle status codes for received items Contained in: or / (see text) Available: in PRO versions only Can contain: script Script context: datastore context Attributes: none Default: no script This script is executed before sending a status commad for a received data item to the remote party. Note that this script can be specified on both the datastore level (will catch status for that datastore only) or on the session level (will catch all status responses). This script can return true if it wants to mark the status code as "regular" processing (fully ok, no workarounds applied) or falseto signal "irregular" processing. This script has access to the same special script functions as , see  REF _Ref45371286 \r \h 11.34.27.  XE "resendfailing" \f T : re-send failing items in next session Contained in: Can contain: boolean value Attributes: none Default: true If this option is set to true, items sent to the remote that receive a non-ok status will not cause the sync session to abort, but will be marked such that the items get re-sent in the next sync session. This is new functionality of version 3.0, and helps to overcome temporary failures of writing items to the remote party (such as outgoing email that can't be sent at the first attempt will not break the session, but simply re-tried in the next session). This option can be set to false to restore pre-version-3.0 behaviour. Note that resending items requires that map entries have map flags ( turned on, see  REF _Ref153707807 \r \h  \* MERGEFORMAT 11.34.39 and  REF _Ref153731855 \r \h  \* MERGEFORMAT 12.20.5).  XE "timeutc" \f T ,  XE "timestamputc" \f T : type of database timestamp Contained in: () or ( or for version 2.1 compatibility) Can contain: boolean value Attributes: none Default: false (operating system's local time) Usage: deprecated in 3.1 onwards, use (see  REF _Ref185246110 \r \h 11.34.31) instead If set to true, timestamp results returned by the database API layer (ODBC or plugin) are interpreted as UTC (former Greenwich Mean Time, GMT) and timestamps sent to the database API layer are sent in UTC. Note: when used in context of a , this setting only affects the actual accesses to this datastore - so it is possible to have different timestamp settings for different datastores. If used in context of or , the setting is used for all accesses that are not related to a particular datastore, such as reading the database time (for example see  REF _Ref153704184 \r \h 12.18).  XE "datatimezone" \f T : timezone for database timestamps Contained in: ; or Can contain: time zone specification (see  REF _Ref201668435 \r \h 5.3) Attributes: none Default: SYSTEM (operating system's local time zone) Usage: New in 3.1 onwards, use instead of deprecated and (see  REF _Ref185246112 \r \h 11.34.30) Timestamp results returned by the database API layer (ODBC or plugin) are interpreted using the time zone specified, and timestamps to be written to the database are converted to this zone before writing (except for timestamps explicitly mapped as floating using the "f" mode option in the / , see  REF _Ref47173451 \r \h 11.34.41.1). Note: when used in context of a , this setting only affects the actual accesses to this datastore - so it is possible to have different time zone settings for different datastores. If used in context of or , the setting is used for all accesses that are not related to a particular datastore, such as reading the database time (for example see  REF _Ref153704184 \r \h 12.18).  XE "userzoneoutput" \f T : output data in user zone Contained in: Can contain: boolean value Attributes: none Default: true Usage: New in 3.1 onwards If this is set to true (the default), timestamps are converted to user time zone context (see  REF _Ref185257870 \r \h 5.2) before data is converted to SyncML content formats like vCalendar. For cases where the original timezone as obtained from the database must be retained, this can be set to false. XE "datacharset" \f T: character set to be used for database strings Contained in: , or Can contain: name of character set Attributes: none Default: "ANSI" This defines the character to be used for ODBC strings: "ASCII": plain 7-bit ASCII, ANSI/ISO-8859-1 characters are converted to nearest ASCII-equivalent, for example 'ä' to 'a' etc. "ANSI": standard window character set "ISO-8859-1": ISO-8859-1 character set "UTF-8": UTF-8 character set "GB2312": Simplified Chinese standard character set. Note that this character set is not supported in all client and server versions. "CP936": Simplified Chinese Windows codepage (Multi-Byte character set). Note that this character set is not supported in all client and server versions. Note: when used in context of a , this setting only affects the actual accesses to this datastore - so it is possible to have different character sets for different datastores. If used in context of or , the setting is used for all accesses that are not related to a particular datastore. XE "datalineends" \f T: encoding of line ends within database strings Contained in: , or Can contain: name of line-end mode Attributes: none Default: "dos" This defines how line ends within strings are encoded: "dos": line ends are DOS/Windows compatible CRLF (0x0D followed by a 0x0A character) "mac": line ends are Apple Macintosh compatible CR (single 0x0D) "unix": line ends are Unix/Linux compatible LF (single 0x0A) "cstr": line ends are compatible with platform's encoding for lineends in C strings (normally 0x0A like "unix") "filemaker": line ends are encoded as single 0x0B character (which is used by the Filemaker desktop database) Note: when used in context of a , this setting only affects the actual accesses to this datastore - so it is possible to have different line ends for different datastores. If used in context of or , the setting is used for all accesses that are not related to a particular datastore. XE "updateallfields" \f T: always update all fields Contained in: Can contain: boolean value Attributes: none Default: false If this option is set to true, the server always updates all fields that are ed when updating a record. If it is set to false, the server might update only those field that have actually changed. Note that this should be set to false for efficiency reasons except if the database really does not support updating fewer than all fields.  XE "fromremoteonlysupport" \f T : Support for "one-way from remote sync" Contained in: Can contain: boolean value Attributes: none Default: off This flag determines if the datastore can perform the "one-way from remote sync" mode. This is the only sync mode that needs one (or two, if is enabled) extra timestamps to be maintained per sync target (in ODBC this is in the sync targets table, see  REF _Ref43728908 \r \h 12.20.2). Synthesis SyncML engine versions before 2.0.7.2 did not support that extra mode, so some existing installations may not have the appropriate fields in their SYNC_TARGETS tables yet. XE "synctimestampatend" \f T: How to determine "time of last sync" Contained in: Can contain: boolean value Attributes: none Default: off This flag determines how the "time of last sync" is determined. This value is very important for subsequent sync session to find out which records have been changed since last sync session. Normally, this should be left to the default (off), meaning that the "time of last sync" is the time when the sync session begins. This time is used as modification timestamp for all records touched during a synchronisation. For some (desktop) databases, it might not be possible to set modification timestamps when inserting or updating records, but those databases always assign the current time to the last-modified field. In this case, the "time of last sync" must be taken AFTER all modifications have been applied. This can be done by setting to on. Note that in ODBC based datastores, SQL statements (see  REF _Ref6030156 \r \h 12.20.2) must be formed according to this setting. Note that setting is only safe in true single-user situation. During sync, no other modifications (neither by another sync session nor by another database user) may occur!  XE "storesyncidentifiers" \f T  (or  XE "storelastsyncidentifier" \f T ): custom "time of last sync" identifier Contained in: Can contain: boolean value Attributes: none Default: off This flag is provided for plugin based datastores that don't use timestamps (or a different kind of timestamp) to determine modifications since last sync. If this flag is set to yes, a separate datastore/plugin dependent identifier is saved in the sync target administrative data. In case of ODBC based admin data, the SYNC_TARGETS table must have the appropriate fields and the SQL statements to read and write target records must be adapted accordingly (see  REF _Ref43728908 \r \h 12.20.2).  XE "resumesupport" \f T : support for resuming interrupted sync session Contained in: Can contain: boolean value Attributes: none Default: off To enable SyncML DS 1.2 Suspend & Resume feature, this flag must be set. If this flag is set, some additional data will be saved for each sync target at the end of each SyncML message processed (for servers) or at the end of the session (for clients) that allows resuming interrupted sync sessions without starting over. In case of ODBC based admin data, the SYNC_TARGETS table must have the appropriate fields and the SQL statements to read and write target records must be adapted accordingly (see  REF _Ref43728908 \r \h 12.20.2).  XE "resumeitemsupport" \f T : support for resuming half-transmitted data items after interrupted sync Contained in: Can contain: boolean value Attributes: none Default: off This flag is only meaningful if is switched on (see  REF _Ref153707807 \r \h 11.34.39). If it is set to yes, it enables resuming transfer of partially transmitted items without re-transmitting the entire item. It requires some additional data to be saved for each sync target. Especially, the already transmitted fragment of a partially transmitted item will need to be saved. This is a block of binary data of arbitrary size. A BLOB database field can be used to store this block. In case of ODBC based admin data, the SYNC_TARGETS table must have the appropriate fields and the SQL statements to read and write target records must be adapted accordingly (see  REF _Ref43728908 \r \h 12.20.2). XE "fieldmap" \f T: mapping datatype's fields to database fields Contained in: Can contain: , ,,, (ODBC only, see  REF _Ref153765172 \r \h 12.20.20) Attributes: fieldlist This tag defines how the internal fields of a datatype's field list (see  REF _Ref6030571 \r \h 10.1) are mapped to the fields in a SQL table. The "fieldlist" attribute is required and specifies the field list containing the fields to be mapped. The tag must contain a tag (see  REF _Ref47173451 \r \h 11.34.41.1 and for ODBC  REF _Ref153764303 \r \h 12.20.19) for every field that is to be mapped. In the PRO version the tag can also contain scripts to perform conversions between internal field data and database data while reading or writing. XE "map" \f T, < XE "mapredefine" \f F mapredefine>: mapping a datatype field to a database field Contained in: , (ODBC only, see  REF _Ref153765172 \r \h 12.20.20) Can contain: nothing Attributes: name, references, type, mode, size, truncate plus database API specific attributes (see  REF _Ref153764303 \r \h 12.20.19 for ODBC) This tag establishes a link between an internal field as defined in a 's tag (see  REF _Ref47173292 \r \h 10.2) and a field in the datastore's user data table (SQL database table field or plugin data field). The tag works exactly as except that the field must be already mapped before. This makes sense after using (see  REF _Ref247355579 \r \h 11.34.41.2) to create a 1:1 default mapping, and then override some mappings with . The tag has the following attributes: "name": this is the database field name of the field to be mapped "references": this is the name of a field in the specified with the "fieldlist" attribute of the enclosing (or ) or it is the name of a local variable of the database context (see script descriptions in  REF _Ref153776695 \r \h  \* MERGEFORMAT 11.34.41.3,  REF _Ref153776692 \r \h  \* MERGEFORMAT 11.34.41.4,  REF _Ref153776693 \r \h  \* MERGEFORMAT 11.34.41.5 and  REF _Ref153776694 \r \h  \* MERGEFORMAT 11.34.41.7) "type" specifies how the field should be treated when accessing it in the database. Note that most fields can just be accessed as string, even if they contain numeric data. Other types than string are only required when there is no unambiguous string representation (such as for date and time fields). The following types are supported: "string" : string field. Values are copied unmodified (except for appropriate character set and line feed conversion and truncation to the maximum field length as specified with the "size" attribute, see below). "blob" : BLOB (binary large object) field. Values are treated as opaque binary data, and are copied byte by byte without any modification (except for truncation to the maximum field length if specified with the "size" attribute, see below). "numeric" : numeric field. Values are assumed to be valid numeric strings. If not, this will cause database errors to occur, so use this type only for values that are really numeric. Empty fields will be stored as NULL "date" : date field. The referenced must be a timestamp or date value. "time" : time field. The referenced must be a timestamp or time value. "timefordate" : This special type is used when a referenced timestamp must be stored as separate date/time fields in the database. In this case, create a and a referencing the same . Note that the "date" field must be listed in the before the "timefordate" field! "timestamp" : timestamp field. "zonename" (New in 3.1): This special type is used to store time zone information from a referenced timestamp in symbolic form (zone name) in the database. Unlike "zoneoffset_xxxx" (see below), the time zone name identifies a time zone including its daylight savings rule. Therefore this is the preferred way to store time zones, as it is not dependent on the time of the year. Note that the "time" or "timestamp" field must be listed in the before the "zonename" field! For general information on time zone handling please refer to chapter  REF _Ref185238094 \r \h 5. "zoneoffset_hours", "zoneoffset_mins", "zoneoffset_secs" : These are deprecated in versions 3.1 onwards of the SyncML engine, but still available for compatibility. They should no longer be used as a mere offset from UTC cannot specify a time zone completely. Use the "zonename" type instead (see above). Note that the "time" or "timestamp" field must be listed in the before the "zoneoffset_xxx" field! For general information on time zone handling please refer to chapter  REF _Ref185238094 \r \h 5. "lineartime" : integer representation of a timestamp in the SyncML engine's internal time format which is milliseconds elapsed since January 1st, 4712 BC, midnight. "lineardate" : integer representation of a date in the SyncML engine's internal date format which is days elapsed since January 1st, 4712 BC. "unixtime_s" : integer representation of a timestamp in Unix Epoch Time, which is seconds elapsed since January 1st, 1970, midnight. "unixtime_ms" : Same as unixtime_s, but in milliseconds "unixtime_us" : Same as unixtime_s, but in microseconds "unixdate_s" : integer representation of a date-only value in Unix Epoch Time, which is seconds elapsed since January 1st, 1970. "unixdate_ms" : Same as unixdate_s, but in milliseconds "unixdate_us" : Same as unixdate_s, but in microseconds "nsdate" : integer representation of a timestamp in Apple Cocoa NSDate scale, which is seconds elapsed since the "reference Date" of January 1st, 2001, midnight. "mode": this optional attribute specifies when the database field being mapped is used. In ODBC datastores this influences the field/value lists created by the %v,%V,%N placeholders, see  REF _Ref47173394 \r \h  \* MERGEFORMAT 12.1.3). The default for "mode" is "rw" if not specified explicitly. Mode can consist of one or multiple of the following flag characters: "r": the field is included when reading values from the database (in ODBC usually when executing a SELECT statement). "i": the field is included when inserting new records into the database (in ODBC usually executing an INSERT statement) "u": the field is included when updating existing records in the database (in ODBC usually executing an UPDATE statement) "w": same as specifying "i" and "u" together ("iu") - the field is included when writing to the database. "p": This flag means that the field should not be literally mapped, but inserted as a parameter. BLOBs are always inserted as parameters (even without the "p" flag), but for long strigs it might make sense as well. For ODBC, "p" means using the ODBC parameter mechanism; for plugin datastores, it causes the BLOBID-mechanism to be used (see SDK docs). "f" (New in 3.1): This flag has only a meaning for time and timestamp fields. It means that the database fields represents the time as a floating (time zone independent) value rather than in a fixed time zone context (as specified with , see  REF _Ref185246110 \r \h 11.34.31). This is useful in combination with the "zonename" field type, see above. For general information on time zone handling please refer to chapter  REF _Ref185238094 \r \h 5. Note: do not set the "f" flag in a that maps a timestamp's timezone name to a DB field. "x" (New in 3.1): This flag indicates that the value of the field directly referenced (with the "references" attribute, see above) must be kept for later finalisation using (see  REF _Ref207618734 \r \h 11.34.41.6 for details). This is useful to create links between records in relational setups. "size": this optional attribute specifies a maximum number of characters for string fields. It should always be set to avoid database errors when a client has longer strings than the database can store. Note for ODBC datastores especially that size is used to specify the maximum column size for binding SQL parameters (see "p" mode flag above) - in case you get 'HY104' SQL state errors, this is most likely caused by an invalid column size value. "truncate": this attribute can be set to "no" (default is "yes") if the data field must not be truncated. This is usually the case for binary data, where truncation would mean corrupting the data. For string data, truncation is usually acceptable. If "truncate" is set to "no", this signals to the remote party that it should not send truncated data for this field. Note that this mechanism is a new feature of SyncML DS 1.2 and therefore does not work with 1.1 and 1.0 implementations. "set_no":This optional attribute (which defaults to 0) can be used to assign this mapping entry to a numbered set of mappings. The default set is 0 and will normally be used for accessing the database. For ODBC, s that have a set_no other than zero can be used in SQL statements that are prefixed with the %GO(set_no) sequence. See  REF _Ref47173394 \r \h  \* MERGEFORMAT 12.1.3 for details. In Plugin datastores, set_no should always be 0. Other attributes specific to the datastore type: ODBC has additional attributes for , see  REF _Ref153764303 \r \h  \* MERGEFORMAT 12.20.19. Example (fieldmap for a mimimalistic name/phone number + photo (new for 3.0) datastore) XE "automap" \f T: auto-map internal to DB fields Contained in: Attributes: fieldlist, indexasname This tag automatically maps all fields in the fieldlist to database fields. The database fields are assumed to have the same names as the internal fields in the fieldlist (unless indexasname is set to true, see below). All fields are mapped as "string", except for timestamps which are mapped as "timestamp". Note that (see  REF _Ref47173451 \r \h 11.34.41.1) can be used after to change some of the automapped fields when needed. The "fieldlist" attribute is required and specifies the field list containing the fields to be mapped. The "indexasname" attribute can be set to "true" to make the database field "names" to be the numeric index of the field in the fieldlist (0,1,2….n).  XE "initscript" \f T : initialize accessing database Contained in: or (SQL only, see  REF _Ref153765172 \r \h 12.20.20) Available: in PRO versions only Can contain: script returning boolean value Script context: database context Attributes: none Default: no script If the tag is directly contained in the tag (see  REF _Ref47172480 \r \h 11.34.41), this script is executed once before the SyncML engine starts accessing the database and can be used to declare and initialize variables in the database context. ODBC only: If the tag is contained in an tag (see  REF _Ref47864390 \r \h 12.20.20 for details), the script is executed once every time before the SyncML engine starts accessing the detail records for a master record (which is always after the master record is read or written). If the script returns false, the SyncML engine will not read or write detail records. This is useful if the master record contains an indication if there are detail records at all which can be tested in the to increase performance by avoiding unneeded SQL queries. The of an can access all fields of the item being read or written - as the arrays are always read or written after the master record is read or written, the fields mapped in the are already read from the database when is called for an . In ODBC datastores, the has access to the SQL execution functions described in  REF _Ref78024414 \r \h 12.1.4 and the following functions specific to the database context: integer  XE "ARRAYINDEX" \f F ARRAYINDEX(): ODBC only: Returns the current array index (zero based) when reading or writing an array. In the (see  REF _Ref153776724 \r \h 11.34.41.7) the return value is the number of array records read or written. string  XE "PARENTKEY" \f F PARENTKEY(): Returns the key (localID) of the master record (same value as %k represents in SQL queries, see  REF _Ref47173394 \r \h 12.1.3) string  XE "NEWKEY" \f F NEWKEY(): Returns a new key (localID) for the master data table (same value as %X represents in SQL queries, see  REF _Ref47173394 \r \h 12.1.3). Note that this can only be used when is false, that is, when keys can be generated independent from actually inserting records into the master data table. string  XE "LASTKEY" \f F LASTKEY(): Returns the last key generated for the master data table (same value as %X represents in SQL queries, see  REF _Ref47173394 \r \h 12.1.3). integer  XE "WRITING" \f F WRITING(): Returns true if script is called while writing to the database, returns false if script is called while reading from the database. integer  XE "WRITING" \f F INSERTING(): Returns true if script is called while inserting new records to the database, returns false if script is called while reading or updating existing record in the database. Note that even while UPDATEing a record, it's detail records may get INSERTed.  XE "SETSQLFILTER" \f F SETSQLFILTER(string sqlfilter): ODBC only: This can be used to specify a WHERE clause expression which is then used as part of the %AF and %WF placeholders, see  REF _Ref47173394 \r \h 12.1.3. string  XE "LOGSUBST" \f F LOGSUBST(string logtext): Returns logtext with all placeholders which are valid in (see  REF _Ref46754571 \r \h 12.19) substituted with the appropriate value.  XE "afterreadscript" \f T : post-process item read from database Contained in: or (ODBC only, see  REF _Ref153765172 \r \h 12.20.20) Available: in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script This script is called after a database record has been read according to the definitions into the internal item's fields (as defined in the , see  REF _Ref42589436 \r \h 10.1) or local variables of the database context. Note that for ODBC, the sync engine may call before or after reading all detail records from s (see  REF _Ref47865711 \r \h 12.20.20), therefore any scripting that refers to fields should not be placed in the (but in the of the array). This script has access to all fields of the data item just read and may examine and change them before the data is processed any further. This script is where custom data conversions between data in the database and contents can be implemented. To do that, the fields that need special conversion are mapped (with , see  REF _Ref47173451 \r \h 11.34.41.1) to a local variable of the database context. Then, the reads the value from that variable and stores it in the actual . The has access to the database context specific functions described in  REF _Ref153776799 \r \h 11.34.41.3.  XE "beforewritescript" \f T : prepare writing item to database Contained in: or (ODBC only, see  REF _Ref153765172 \r \h 12.20.20) Available: in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script This script is called before starting to write a database record and has access to all fields of the data item that will be written and may examine and change them before the data is actually written to the database. This script is where custom data conversions between data in the database and contents can be implemented. To do that, the fields that need special conversion are mapped (with , see  REF _Ref47173451 \r \h 11.34.41.1) to a local variable of the database context. Then, the reads the value from the and stores the converted value in that local variable. As the local variable is ed to a database column, the converted value will be stored in the database. The has access to the database context specific functions described in  REF _Ref153776799 \r \h 11.34.41.3. ODBC only: when used in an (see  REF _Ref47864390 \r \h 12.20.20), can return false to stop writing detail records explicitly (before any of the implicit criteria - maxrepeat, sizefrom and all-empty data - stops writing detail records). The following example shows a , a and a implementing a custom conversion between priority values in the database ("low", "normal", "high") and priority values needed for the vCalendar (3,2,1): 2) PRIORITY_TEXT="LOW"; ELSE IF (PRIORITY<2) PRIORITY_TEXT="HIGH"; ELSE PRIORITY_TEXT="NORMAL"; ]]>  XE "finalisationscript" \f T : finalize written items Contained in: Available: new in 3.1, in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script This is a special script that is called at the end of all user data accesses, right before (see  REF _Ref153776694 \r \h 11.34.41.7). It is called once for every item written to the database (inserted or updated), but only if at least one of the field s (see  REF _Ref47173451 \r \h 11.34.41.1) has a "x" flag in its mode attribute. In each call, the script has access to an item (like in the  REF _Ref153776693 \r \h 11.34.41.5), but this item is empty except for the fields directly referenced in a which has a "x" flag set in its mode attribute. This mechanism allows to create inter-item relational links, for example when one incoming item references another (such as tasks and subtasks) by a string identifier (like an UID), but in the database this relation should be stored as a direct relational link from one table referencing another table's (or the same table's) identity key column. In such a case, the key of the to-be-referenced item may not be known when the referencing item is written to the database (because the referenced item might be new in this session and thus only added later in the session's progress). By setting the "x" flag in the (see  REF _Ref47173451 \r \h 11.34.41.1) referencing the string identfier field (say, an UID), this means that this field's value is saved until the end of the sync session, and will be available to the . On the other hand, fields in the item that don't have a "x" mode flag in their will not be included in the item the can access. This is to limit the amount of data that must be kept in memory down to what is really needed at finalisation (most data content does not need to be kept, because it can be stored right away when the item is arriving during the sync session). If no item has the "x" flag set, the is not called at all. The has access to the database context specific functions described in  REF _Ref153776799 \r \h 11.34.41.3.  XE "finishscript" \f T : finish access to database Contained in: or (ODBC only, see  REF _Ref153765172 \r \h 12.20.20) Available: in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script If the tag is directly contained in the tag (see  REF _Ref47172480 \r \h 11.34.41), this script is executed once after the SyncML engine has accessed the database and can be used to do some cleanup work in the database context. See also for details. If the tag is contained in an tag, it is called once after reading or writing all records of an is complete. It can be used for example to store the number of elements read (ARRAYINDEX() function, see  REF _Ref153776799 \r \h 11.34.41.3) in a . The has access to the database context specific functions described in  REF _Ref153776799 \r \h 11.34.41.3.  XE "superdatastore" \f T : combined datastore definition Contained in: , Can contain: Attributes: name Superdatastores are a very simple to use concept to combine two or more datastore into one "superdatastore" that can be accessed by the remote party as a single datastore. Most obvious use of a superdatastore is in any SyncML server that supports events and tasks. Some SyncML clients (mostly those based on Symbian OS, like Nokia9210, P800 etc.) do not access events and tasks as separate entieties, but as a single "calendar" datastore. With superdatastores, creating this "calendar" data store is as easy as grouping the existing events and tasks datastores using a tag. A superdatastore must have a name attribute, which specifies the name under which the datastore will be accessible from the SyncML client (such as "calendar" for the combined events/tasks). A must contain one or multiple tags (see  REF _Ref47260717 \r \h 11.35.1) to specifiy which datastores it groups together to form a superdatastore. Note that the grouped datastores must be defined in the configuration file before the tag. The following example shows a typical "calendar" superdatastore, grouping "events" and "tasks" together: F.KIND:=EVENT e F.KIND:=TODO t  XE "contains" \f T : Include a datastore in a superdatastore Contained in: Can contain: , Attributes: datastore This tag is used to include the datastore specified with the datastore attribute into a superdatastore.  XE "dispatchfilter" \f T : filter to direct incoming items Contained in: Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none This filter must be specified to allow the SyncML engine to dispatch incoming data items to the correct datastore within the superdatastore. In case of the event/task datastore, the filter must check if the incoming item is a vEVENT (for the s of all the contained datastores are checked to see which contained datastore can handle it. When an item is sent to the remote party from the superdatastore, the is used in make-pass mode (see  REF _Ref47262189 \r \h 7.1) to make sure the outgoing item meets the criteria set by the filter for incoming items.  XE "guidprefix" \f T : prefix for item ID Contained in: Can contain: string (normally only one character) Attributes: none Each in a must specify a different . This string (single character recommended, more only if absolutely needed) is used as a prefix to the contained datastore's item IDs to form an ID that is unique within the entire superdatastore and allows the SyncML engine to find the correct datastore from the ID. XE "remoterule" \f T: special rules for specific remotes Contained in: , Can contain: see below Attributes: name Sometimes it is desirable to treat specific remote devices different from others. A common case is when experiencing compatibility problems with a client. Synthesis Sync Server provides the config option to specify rules for certain clients. has the following attributes: "name": This optional attribute is used to specify a name for the rule. The name can be used to check in scripts (PRO version only) which (if any) rule is active using the REMOTERULENAME() script function. The name can also be used to define device-dependent datatypes using datastore's rulematch="xxx" attribute in (see  REF _Ref166648484 \r \h 11.34.12) and in MIME-DIR based datatypes to define properties depending on a certain remote rule (see  REF _Ref73442286 \r \h 10.3.3) A or tag can contain any number of tags, one for each device (or set of devices) that need special treatment. A tag contains none, one or more tags to identify the device(s), and one or more options that control the special behaviour: XE "finalrule" \f T Contained in: Can contain: boolean value Attributes: none Default: no Remote Rules are searched in the order of their definition. By default, the first rule that matches will be applied and no more rules (that eventually would match as well) will be searched. This option can be set in a remoterule to have the server continue searching for more matching rules after applying the rule. device identification tags for Contained in: Can contain: text Attributes: none The following tags are available for matching devices: XE "manufacturer" \f T: device manufacturer name XE "model" \f T: device model name XE "oem" \f T: OEM XE "firmware" \f T: firmware version string XE "software" \f T: software version string XE "hardware" \f T: hardware version string XE "deviceid" \f T: device ID (this should be unique, so this can be used to make a rule for one single specific device) XE "devicetype" \f T: SyncML device type If all of these tags appearing in a match with the connecting remote device, the rule is applied. Note that , and might contain wildcards (* and ?). Note that default rules can be specified that is applied to any device by not specifying any of the device identification tags. As rules are searched in the order of their definition, such a "catch all" rule must either: be defined as the last remoterule (and will be applied to all devices not handled by another rule) or it must have a no special option (see ) to allow subsequent rules to be processed (thus applying the settings to all devices, even those which are caught by another rule)  XE "descriptivename" \f T  Contained in: Can contain: text Attributes: none This option allows to set a more descriptive name for the device than what the device information provides (especially old devices do not even include the phone model name there). The descriptive name will be used when generating activity logs, see  REF _Ref47169796 \r \h 11.31 and  REF _Ref46754571 \r \h 12.19. XE "limitedfieldlengths" \f T: device has short fields Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, it means that the device has limited field lengths, but does not identify them in the device information. This is the case for example with the T39m mobile phone. Without a special rule for this device (contained in all sample config files), the limited field lengths would not be detected by the server and long strings could get lost during sync. Example (to switch on limited field length handling for the Ericsson T39m): Ericsson R1A yes XE "noemptyproperties" \f T: do not send empty properties Contained in: Can contain: boolean value Attributes: none Default: off If this option is set in a remoterule, the vCard/vCalendar (MIME-DIR) generator will suppress sending properties with no value. This is because some clients do have problems when encountering empty properties in a vCard or vCalendar. Normally, this option is not required. XE "updateclientinslowsync" \f T: update client records during slowsync Contained in: or (settings in are defaults for sessions without a remote rule applied or with a remote rule applied that does not specify a value for this particular option) Can contain: boolean value Attributes: none Default: off If this option is set in a remoterule, the SyncML server will try to update client records with server data if comparison shows that the server has additional data that the client does not have during non-first time slow sync. Note that this updating always takes place in first-time sync, regardless of this options's setting. It is off by default because many clients cannot store some data but also cannot inform the server what they can store exactly, so turning this option on will cause much unneeded client updates at slow sync. For clients that store everything they report in devinf however, this feature can be switched on resulting in better data consistency after a slow sync. See also corresponding function in  REF _Ref43008774 \r \h 6.14.6.  XE "updateserverinslowsync" \f T : update server records during slowsync Contained in: or (settings in are defaults for sessions without a remote rule applied or with a remote rule applied that does not specify a value for this particular option) Can contain: boolean value Attributes: none Default: off If this option is set in a remoterule, the SyncML server will try to update server records with client data if comparison shows that the client has additional data that the server does not have during non-first time slow sync. Note that this updating always takes place in first-time sync, regardless of this options's setting. It is off by default because differences in client and server database layouts often cause uneeded updates which will cause other clients to be updated on the next sync as well. For clients that store everything they report in devinf however, this feature can be switched on resulting in better data consistency after a slow sync. See also corresponding function in  REF _Ref43008774 \r \h 6.14.6. XE "noreplaceinslowsync" \f T: never update client records during slowsync Contained in: Can contain: boolean value Attributes: none Default: off If this option is set in a remoterule, the SyncML server will never send a REPLACE command to the client during slow sync. This is for clients that cannot handle replace command in slow sync (some older SyncML clients had problems with this) - this option should be set for those clients only. Note that this overrides (see  REF _Ref45001933 \r \h 11.36.6) as it effectively blocks any updates during slow-sync, including first-time sync.  XE "ignoredevinfmaxsize" \f T : ignore maximum field size reported in client's devInf Contained in: Can contain: boolean value Attributes: none Default: off If this option is set in a remoterule, the SyncML server will ignore the maximum field size reported by the client in it's devInf. This is needed for some DS 1.2 clients which report wrong field sizes, especially a way too low value (like 256 bytes) for the PHOTO field in contacts. This would cause that the server can never send a photo to these clients if it would respect the maximum field size. So for these clients, should be set in the appropriate remote rule.  XE "dspathindevinf" \f T ,  XE "dscgiindevinf" \f T : how to show datastore name in devInf sent to client. Contained in: Can contain: boolean values Attributes: none Default: true (for both options) These options can be set to true or false in a remoterule to control a special workaround which is normally active for all clients as follows: If a client starts a sync for a datastore using not only the datastore name alone (like "contacts"), but includes a subfolder path (like in "contacts/private") or some CGI filters (like in "contacts/private?CATEGORY&iCON;Family"), and then queries devInf, the server by default puts the entire string as used by the client to address the datastore as the datastore name. This is because many phone clients will fail when the devInf does not fully match the string sent. More elaborate clients will accept both the full string or only the datastore's name. In case a client does not accept the full string, can be set to false to suppress the CGI part, and to suppress all but the datastore's name. These are highly technical and only needed in exotic cases. XE "allowmessageretries" \f T: allow client to send the same message twice Contained in: or (settings in are defaults for sessions without a remote rule applied or with a remote rule applied that does not specify a value for this particular option) Can contain: boolean value Attributes: none Default: off This is a highly technical setting. Some clients try to re-send SyncML messages when the answer from the server does not reach the client (for example, on unstable connections). Normally, the server would reject this. Setting this option makes the server accept re-sent messages - however there is no guarantee that reprocessing a message is possible in all contexts.  XE "completefromclientonly" \f T : allow client to send the same message twice Contained in: or (settings in are defaults for sessions without a remote rule applied or with a remote rule applied that does not specify a value for this particular option) Can contain: boolean value Attributes: none Default: no This is a compatibility settings for clients that expect a from-client-only session to work exactly like any other sync type, that is, include a (empty) from the server to the client and a phase. To conform to the standard, this option must be disabled.  XE "forcelocaltime" \f T : always send time information as localtime Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, time information sent to the remote party is always specified in local time. Many SyncML clients with bad time zone implementation need that this flag is set in order to avoid time shifts. Note that with SyncML 1.1.1 conformant devices this option is not needed as the device reports wether it supports UTC or not. See also corresponding function in  REF _Ref43008774 \r \h 6.14.6.  XE "forceutc" \f T : always send time information as localtime Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, time information sent to the remote party is always specified in UTC. Note that this is the default case for SyncML 1.0, but with SyncML 1.1.1 conformant devices this option is not needed as the device reports wether it supports UTC or not. See also corresponding function in  REF _Ref43008774 \r \h 6.14.6.  XE "treataslocaltime" \f T : always treat received information as localtime Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, time information received from the remote party is always interpreted as localtime, even if it looks as if it was UTC ("Z" suffix). This is needed for some Symbian based clients (P800) which send local time suffixed with a "Z" which would make the receiver interpret these as UTC if this option is not set. See also corresponding function in  REF _Ref43008774 \r \h 6.14.6.  XE "treatasutc" \f T : always treat received information as UTC Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, time information received from the remote party is always interpreted as UTC, even if it looks as if it was local time (no "Z" suffix). This is needed for some Nokia Series 80 based clients (9500, 9300) which send UTC time without the "Z" suffix which would make the receiver interpret these as localtime if this option is not set. See also corresponding function in  REF _Ref43008774 \r \h 6.14.6.  XE "nocontentfolding" \f T : prevent folding long lines Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, lines longer than 72 characters in MIME-DIR properties are not folded into multiple lines as requested by the MIME-DIR standard, but transferred as a single, long line. This is for buggy SyncML client implementation that crash or misbehave when processing folded lines.  XE "autoenddateinclusive" \f T : end date for allday events inclusive Contained in: Can contain: boolean value Attributes: none If this option is set in a remoterule, date values with conversion mode "autoenddate" (see  REF _Ref182995906 \r \h 10.3.4).will be rendered as 23:59:59 of the previous day in old formats like vCalendar 1.0. If it is not set, "autoenddate"s will be rendered as 0:00 of the next day (which usually is the first day not included in the all-day event when "autoenddate" is used for DTEND properties). Note that there is a session-level setting for this option (see  REF _Ref231890048 \r \h 11.23)  XE "outputcharset" \f T : set default output character set Contained in: Can contain: character set name (choices see  REF _Ref153700641 \r \h 11.34.33) Attributes: none This optioncan be set in a remote rule to use a non-default character set for output formats, such as in vCard or vCalendar. Usually, the character set in SyncML is UTF-8. However there are buggy SyncML client implementations that misbehave on UTF-8 strings, but work for example with ANSI charset.  XE " inputcharset " \f T : set default input character set Contained in: Can contain: character set name (choices see  REF _Ref153700641 \r \h 11.34.33) Attributes: none This optioncan be set in a remote rule to use a non-default character set for interpreting input formats when these do not implicitly specify a character set, such as in vCard. Usually, the character set in SyncML is UTF-8. However there are buggy SyncML client implementations that send data e.g. with ANSI charset.  XE "legacymode" \f T ,  XE "lenientmode" \f T : use relaxed conformance modes Contained in: Can contain: boolean value Attributes: none These options can be set for remote rules that handle buggy and ill-behaving SyncML implementations: If is set, the SyncML engine will use different data types (usually old vCard 2.1 and vCalendar 1.0 instead of modern MIME-DIR, but this is configurable, see  REF _Ref166648484 \r \h 11.34.12). If is set, the SyncML engine will be more tolerant to certain types of non-conformant behaviour. Especially, with servers which do not handle client side anchors correctly, can disable client side anchor comparison. XE "rejectstatus" \f T: reject sync with device Contained in: Can contain: SyncML status code Attributes: none If this option is set in a remoterule, it will abort any attempt to synchronize with the specified status code. This is an option which can be used to prevent sync with some specific type of client completely (for example if a client is known to have bugs that could affect data integrity).  XE "requestmaxtime" \f T : max time for request processing Contained in: Can contain: max duration (in seconds) of a single request processing Attributes: none This can be used to override the session-default for maximum request processing time (see  REF _Ref70164511 \r \h 11.3 for details about limiting request time processing) - for example if a device is known to be especially impatient and timing out quickly.  XE "rulescript" \f T : script to execute if rule applies Contained in: Available: in PRO versions only Can contain: script (without variable declarations!) Script context: session context Attributes: none Default: no script This script is executed when the remote rule is applied to the session. It can be used to assign values to variables in the session context, which then can be used to control device-specific behaviour in all other scripts (using the SESSIONVAR built-in functions, see  REF _Ref43008774 \r \h 6.14.6). Note: it is not allowed to declare variables in - all variables to be accessed must be declared in the (see  REF _Ref69047370 \r \h 11.12). XE "server type=odbc" \f T XE "server type="sql"" \f T ,  XE "client type=odbc" \f T  XE "client type="sql"" \f T : SQL/ODBC based Server or Client Config Contained in: Can contain: tags described in chapters  REF _Ref47164085 \r \h 12 (see also  REF _Ref47164079 \r \h 11, and  REF _Ref90895285 \r \h 16 specifically for clients) Attributes: type="sql" (or as an alias for backward compatibility: type="odbc") This is where Synthesis Sync Server can be configured to work with almost any existing SQL database. It requires firm knowledge about SQL, your target database system and your database layout to do these changes successfully. Please refer to the sample configuration available in the product distribution package to see complete configurations for different types of SQL databases. Example: SQL Statement processing In the 1.0.5 version of the Synthesis SyncML engine, SQL statements were generated by the server automatically from a few pieces of information in the config. While this was convenient for database layouts that resembled our standard sample layout, it was not flexible enough to adapt to any database. So since version 1.0.8, we have changed the basic mechanism how SQL statements are generated and processed: All SQL statements used to access the database are now fully customizable The engine provides a number of placeholder sequences (a % sign followed by one or multiple characters) that are replaced by variable data when the statement is executed. In most tags, where a SQL statement is expected, the engine also allows specifying multiple statements separated by the special sequence %GO For backward compatibility, the engine still allows using the 1.0.5-style configuration. However, for new projects, we strongly recommend using the new directives. The old style configuration might get unavailable in a future version of the Synthesis SyncML engine. In the following paragraphs, all old-style configuration tags are marked as such and mention which new tag should be used as a replacement. The following paragraphs describe all the placeholder sequences that can be generally used in SQL statements in the configuration. There are additional placeholders that are only valid for specific SQL statemements (such as , see  REF _Ref46754571 \r \h 12.19); those are described with the statement they belong to. Note that placeholder for strings always only represent the value, but not the eventually required quoting characters around the string value. This means that when using a placeholder that represents a string value in an SQL statement, the placeholder must be enclosed in quotes itself. Placeholders for all SQL statements %u represents the current userkey. The userkeyis obtained with the statement (see  REF _Ref43727921 \r \h 12.16) and/or using the SETUSERKEY() script function in (see  REF _Ref43727925 \r \h 11.33) or (see  REF _Ref43727928 \r \h 12.17). Note that the userkey has a meaningful value only after a successful login. %d represents the current devicekey. The devicekeyis obtained with the statement (see  REF _Ref43728215 \r \h 12.14) and/or using the SETDEVICEKEY() script function in (see  REF _Ref43727925 \r \h 11.33) or (see  REF _Ref43727928 \r \h 12.17). %C PRO version only: represents the domain, which can be set in in (see  REF _Ref43727925 \r \h 11.33) or (see  REF _Ref43727928 \r \h 12.17) with the SETDOMAIN() script function. %sv(var) PRO version only: represents the value of the session context variable with the name var. Note that this works like the built-in function SESSIONVAR(), see  REF _Ref43728461 \r \h 6.14.6. Note also that the %sv() placeholder simply represents the text string in the session variable as-is. If you need to insert timestamps or strings containing non-ASCII-characters, the contents of the session variable should be generated using the DBLITERAL() function, see  REF _Ref78024414 \r \h 12.1.4. %p(mode,field_or_var [,dbfieldtype[,colsize]]) This is used to insert SQL parameters into a statement (normally a ODBC {call ...} statement to a stored procedure). mode can be "i" (for input-only parameters), "o" (for output-only parameters) or "io" for (input-output parameters). field_or_var is the name of an internal (from the datatype's , see  REF _Ref42589436 \r \h 10.1) or script variable to be used for the parameter's value. The optional dbfieldtype must be the name of a database field type (same values as for "type" attribute in , see  REF _Ref47173451 \r \h 11.34.41.1) - if not specified, dbfieldtype defaults to "string". The optional colsize can be used to explicitly specify the column size for the parameter. Note: Make sure not to add extra spaces within the paranthesis, only the needed parameters and the separating commas! Placeholders for SQL statements within %GO This separates two SQL statements that need to be executed in sequence. Note that only the last SQL statement's result is evaluated (in case the SQL statement needs to return data at all). %f represents the current folderkey. The folderkey is obtained with the statement (see  REF _Ref42943895 \r \h 12.20.1). Note that the folderkey has a meaningful value only after a successful login. %t represents the current targetkey. The targetkey is obtained with the statement (see  REF _Ref43728908 \r \h 12.20.2) %X represents a new record ID. Note that this only works if there is a method to create new IDs before actually inserting records (meaning that must be false and there must be a statement or a set - see  REF _Ref46750086 \r \h 12.20.18) %x represents the most recently generated record ID. This is especially useful in layouts with one master record and several detail records that need to be linked to the master record by ID. Placeholders for SQL data access statements within These placeholders are valid for all statements that access actual data records. %GO(set_no) this special form of %GO can be used in front of any SQL statement. It modifies the operation of %N, %aN, %V, %aV, %v and %av (see below) as follows: From the list of mapped fields (see ,  REF _Ref47173451 \r \h 11.34.41.1) only those will be included that have a corresponding set_no. The default set_no is 0 for all entries that do not specifiy the set_no attribute. This allows for example to execute database update in multiple parts, each using a different SQL statement with a different set_no and therefore different fields. %k represents the data key (local ID) of the master record inserted. Note that this is not available when inserting new records when is true (as the local ID is only known after insert has taken place). %pkos represents a string-type output parameter that receives the data key (local ID) of the record inserted. This is useful if inserting is not done with INSERT, but using a stored procedure which returns the generated ID as an SQL output Parameter. %pkoi same as %pkos, but for integer-type output parameters. %N represents the database field list for a SELECT or an INSERT statement. For data writing, the list will only contain the fields which need to be written. %aN same as %N, but list contains all mapped fields, even if they do not need to be changed. %V represents the fieldname = value pair list for an UPDATE statement. The list will only contain the fields/values which need to be updated. Note that the values might be represented as literals (normally) but als as ODBC parameters (for fields where no literal representation exists, such as BLOBs). %aV same as %V, but list contains all mapped fields, even if they do not need to be updated. %v represents the list of values for an INSERT statement's VALUE part, matching the field names generated with %N. %av represents the list of values for an INSERT statement's VALUE part, matching the field names generated with %aN. (Note that in servers before 2.1.1.7 there was a bug that requires to write "%av(" instead of "%av" ). %d([opts]fieldname,dbfieldtype) or %d([opts]fieldname#arrindex,dbfieldtype) represents the value of an internal field (from the datatype's , see  REF _Ref42589436 \r \h 10.1) or context variable contents (see  REF _Ref42672298 \r \h 6.9.1) named fieldname, where opts can be "l" for lowercase, "u" for uppercase and "a" for ASCII-only. If the field is an array field, the second form allows accessing the arrindex-1 th element from the array. dbfieldtype is optional and specifies how to format the field for the database (same values as for "type" attribute in , see  REF _Ref47173451 \r \h 11.34.41.1) - if not specified, dbfieldtype defaults to "numeric" (which means that the value of the field is inserted 1:1 into the SQL without surrounding quotes). This is to be compatible with the behaviour of %d in versions before 2.1.1.15, where the dbfieldtype parameter did not yet exist, and %d was often used inside quotes to insert string values. Note: Make sure not to add extra spaces within the paranthesis, only the needed parameters and the separating commas! %S represents the number of bytes (not necessarily equal to the number of characters for character sets with multi-byte characters such as UTF-8) of all strings in a writing statement. This might be useful for tracking database space requirements. %dM,%tM,%M represents the date (%dM), time (%tM) or datetimestamp (%M) of the last modification of the record. Note that for a 100% multi-user SyncML server, the SyncML server must be able to explicitly set the modification date for all records it writes (as all modifications of one sync session should have exactly the same date). This is only important if it is possible that records are being changed on the server while a sync session is in progress. %AF this expands either to an empty string or to a WHERE clause condition preceeded by an AND. The condition is derived from the active filter settings (see  REF _Ref46752884 \r \h 7). This placeholders can be used in SELECT statements that already have a WHERE clause, so the WHERE conditions will be extended with the filter conditions if there are any. Note that automatic conversion from filter settings to an SQL WHERE clause might not work in all cases. Therefore, the ability to filter at the DB level using %AF and %WF is disabled by default. This will cause the filters to be applied to the data after fetching it - which is less efficient but works in all cases. Set to true (see  REF _Ref69052620 \r \h 12.20.9) to enable filtering at the database level. %WF this is similar to %AF, but instead of AND, a WHERE is inserted if there is a filter condition at all. This placeholders can be used in SELECT statements that do not have a WHERE clause, so a WHERE clause will be added only when there are filter conditions (and , see  REF _Ref69052620 \r \h 12.20.9, is true). Executing SQL statements from scripts In PRO versions of the SyncML server and client, it is also possible to programmatically execute arbitrary SQL statements. This is especially useful for implementing special multi-step login procedures or similar tasks. The following SQL processing script functions are available in the (see  REF _Ref43727925 \r \h 11.33), the (see  REF _Ref43727928 \r \h 12.17) and all scripts in the SQL datastore context (e.g. , see  REF _Ref153776799 \r \h 11.34.41.3). string  XE "DBLITERAL" \f F DBLITERAL(variant value, string dbfieldtype): This is used to convert a value into a string that is suitable as literal value in SQL statements to be sent to the database, as required for example in SETSQLFILTER(). dbfieldtype specifies the database field type (as in "type" attribute of , see  REF _Ref47173451 \r \h 11.34.41.1). integer  XE "SQLEXECUTE" \f F SQLEXECUTE(string sql): This can be used to execute a SQL statement. Note that the statement is executed in a transaction context global to all datastores. Make sure that you use SQLCOMMIT or SQLROLLBACK to avoid unfinished transactions. Returns 0 if statement executed ok, or a non-zero ODBC error code in case of failure. integer  XE "SQLFETCHROW" \f F SQLFETCHROW(): Fetches the next row from a result set of a preceeding SQLEXECUTE call. If no (more) rows are available, SQLFETCHROW returns 0, otherwise it returns 1. integer  XE "SQLGETCOLUMN" \f F SQLGETCOLUMN(integer colindex, variant &value, string dbfieldtype): This reads the colindex-th column from the currently fetched row from a result set into the variable value. dbfieldtype specifies the database field type expected (as in "type" attribute of , see  REF _Ref47173451 \r \h 11.34.41.1). Note that if SQLGETCOLUMN is called multiple times for a single row, colindex must be increasing for each call (this is an ODBC requirement). integer SQLITELASTID(): For SQLite only: returns the ROWID created by the last INSERT statement.  XE "SQLCOMMIT" \f F SQLCOMMIT(): Commits the current transaction. Make sure you call SQLCOMMIT or SQLROLLBACK before ending scripts that use SQLEXECUTE, especially when the SQL statemement was a DML statement (modifiying data in the database).  XE "SQLROLLBACK" \f F SQLROLLBACK(): Performs a rollback on the current transaction. Make sure you call SQLCOMMIT or SQLROLLBACK before ending scripts that use SQLEXECUTE, especially when the SQL statemement was a DML statement (modifiying data in the database). The following two functions are available only for ODBC, but not for SQLite:  XE "SETDBCONNECTSTRING" \f F SETDBCONNECTSTRING(string dbconnectstring): This can be used to programmatically set the ODBC database connection string (which is normally set using , see  REF _Ref203474873 \r \h 12.4). Note that while this is technically possible in many scripts, it usually makes sense only in (see  REF _Ref203474654 \r \h 11.33) to eventually choose different databases depending on login information. Using SETDBCONNECTSTRING closes the currently open session level ODBC connection (if any), but does not open a new connection immediately. The new connection string and password are used to open a new connection as soon as the next SQL statement needs to be executed.  XE "SETDBPASSWORD" \f F SETDBPASSWORD(string dbpassword): This can be used together with SETDBCONNECTSTRING to set the password for opening a DB connection. XE "datasource" \f T: ODBC data source name Contained in: , Can contain: name of ODBC data source Attributes: none This tag specifies the name of the ODBC data source. This is the name that was set when creating the ODBC data source (see chapter 2). Note that for some data sources that need additional parameters (or if you want to connect without a data source by directly specifying ODBC driver parameters), you might need to use (see  REF _Ref58909011 \r \h 12.4) instead of and . XE "dbuser" \f T: ODBC database user name Contained in: , Can contain: user name for accessing the ODBC data source Attributes: none This tag specifies the name of the user that is used to access the ODBC data source. Note that for some data sources that need additional parameters (or if you want to connect without a data source by directly specifying ODBC driver parameters), you might need to use (see  REF _Ref58909011 \r \h 12.4) instead of and .  XE "dbconnectionstring" \f T : ODBC database connection string Contained in: , Can contain: ODBC connection string Attributes: none This tag can be used as an alternative to and in cases when you need to pass more parameters to the ODBC engine than just datasource name and user name. For example some versions of the MyODBC driver need the "DATABASE" parameter to be able to connect correctly. Using it is also possible to connect directly to a ODBC driver without using a datasource by including all the driver-specific parameters in the (this is for adcanced ODBC users only - see ODBC documentation). Important note: the is shown in debug logs for reference. Therefore we recommend to not including the PWD parameter in the but specifying it with (see  REF _Ref58909800 \r \h 12.5) - which causes the PWD parameter to be automatically appended to the before it is sent to the ODBC engine (but after it is shown in the log). The following three examples are functionally identical: mydatasource test secret DSN=mydatasource; UID=test; DATABASE=syncml; secret DSN=mydatasource; UID=test; DATABASE=syncml; PWD=secret; XE "dbpass" \f T: ODBC database password Contained in: , Can contain: password for accessing the ODBC data source Attributes: none This tag specifies the password required to access the ODBC data source with the user name specified in (or in the , see  REF _Ref58909011 \r \h 12.4). Please make sure that the config file is not accessible from the outside in order not to compromise your database's security.  XE "preventconnectattrs" \f T : prevent setting connection attributes Contained in: , Can contain: boolean value Attributes: none This can be set to true to prevent that any attempt to set ODBC connection attributes is made at all (some ODBC drivers exists which will crash when trying to modify connection attributes). XE "dbtimeout" \f T: ODBC timeout Contained in: , Can contain: timeout value in seconds, 0 for no timeout Attributes: none Default: 30 seconds Defines the timeout for ODBC. Please note that this does not work with every ODBC driver, so this setting might have no effect at all with some ODBC databases.  XE "afterconnectscript" \f T : Script executed whenever new DB connection is opened. Contained in: , Available: in PRO versions only Can contain: script Script context: afterconnect context (private only for this script) Attributes: none Default: no script This script is executed once immediately after opening a new database connection. This can be used to execute extra SQL statements (such as access authorisation for SyBase) using the SQLxxx() functions (see  REF _Ref78024414 \r \h 12.1.4). XE "transactionmode" \f T: Transaction isolation mode Contained in: , Can contain: transaction isolation mode Attributes: none Default: "default" This tag is used to defined the transaction isolation mode to be used. It can be set as follows: "none" : no isolation mode "default": use default isolation mode of the ODBC driver "read-uncommitted": other transactions see all changes done. This is the least restrictive mode. If you experience locked table problems, try using this mode. "read-committed": other transactions see committed changes "repeatable": reads are repeatable with same results "serializable": full serializable isolation Please note that not all ODBC drivers support all these modes. Setting a mode that is not supported may result in fatal errors preventing the sync server from working at all. XE "transactionmode" \f T: usage of ODBC cursor library Contained in: Can contain: boolean value Attributes: none Default: false This tag is used to select if the ODBC cursor library should be used or not. Under normal circumstances, for the access patterns generated by a SyncML client or server, the cursor library is not required and only generates overhead if switched on. Please note that some ODBC drivers may not work properly with cursor library switched on or off, so in case of strange ODBC behaviour, you might want to try changing this flag. XE "textmap" \f T, XE "textauth" \f T, XE "textpath" \f T: outdated - no longer available Contained in: Available: no longer available in 3.0 version These tags were used to control text-file based administration tables and/or user auth. This has been replaced by the plugin mechanism (see  REF _Ref135023442 \r \h 14) and the built-in SDK_textdb plugin module (see  REF _Ref133810323 \r \h 14.3). To use SQL for the data tables, but have all administrative data stored in text files (as it is for example required for SQLite based setups, see  REF _Ref182743880 \r \h 12.20.6), just use the SDK_textdb plugin in and enable / at the session level (see  REF _Ref153703095 \r \h 14.1) and use the SDK_textdb plugin in at the datastore level (see  REF _Ref153681044 \r \h 14.2). XE "cleartextpw" \f T: plain text password in database Contained in: Can contain: boolean value Attributes: none Default: on This option (together with selects how Synthesis Sync Server authenticates with the database: If is set, the database must be able to return the password for a user in clear text. The Sync Server then uses that password, together with an eventual nonce string (see  REF _Ref5608796 \r \h 11.7) to calculate the MD5 digest to compare with the client's authentication attempt. If and is not set, the database must be able to check authentication (and perform MD5 calcualtions required) for a given combination of username, MD5 digest and nonce string. In most cases, should be set. Even if passwords are transferred in clear text between database and sync server, they are NOT transferred in clear text over the net. So if your database and web server is properly secured, set does not compromise security. Setting prevents clear text passwords to be stored in the database, however due to a design problem in SyncML 1.0 (SyncML 1.1 has solved that), this will prevent that clients can use the MD5 digest authentification. This is more of a security risk than using , because when clients cannot use MD5 authentification they must use basic authentification which means sending passwords almost clear text (only B64 encoded!) over the internet. XE "md5userpass" \f T: MD5 digest passwort in database Contained in: Can contain: boolean value Attributes: none Default: on This option selects another mode of how Synthesis Sync Server can authenticates with the database: If is set, the database must be able to return a string which is either the B64 encoding of the MD5 digest of "user:password" ( set to false, see  REF _Ref166649222 \r \h 12.14) or a 32-char hex string encoding the MD5 digest ( set to true) for each user. The Sync Server then uses that information to verify client's credentials. See " REF _Ref5609191 \r \h 0" for security considerations. XE " md5hex " \f T: MD5 digest stored as hex string in database Contained in: Can contain: boolean value Attributes: none Default: false New in: 3.0.0.17 This option selects the format of the MD5 digest when stored in the database (see  REF _Ref166649220 \r \h 12.13). With md5hex set to true, the format is a 32-char string of hexadecimal digits (for example compatible with the md5() function in PHP). Otherwise, the MD5 digest must be stored in B64 encoding.  XE "getdevicesql" \f T ,  XE "newdevicesql" \f T ,  XE "savenoncesql" \f T ,  XE "saveinfosql" \f T : Device management Contained in: , Can contain: SQL statements Attributes: none Default: none These tags can hold SQL statements to manage a device table in the database. If these statements are not defined, the SyncML engine can also work without a device table, but it is recommended to have a device table. The device table will receive a single entry for every device that has ever connected to the server. The table for device management must have at least the following fields: a device key as a primary key to the devices table. a device id field, which should be a string of at least 50 characters. For better performance, this field should be indexed. a last nonce field, which should be a string of at least 20 characters. Optionally, the following fields are recommended a device name field, which should be a string of about 60 characters, which will be assigned the descriptive name of the device. a device info field, which should be a string of about 120 characters, which will be assigned some additional information about the device (type, version, OEM manufacturer). The four SQL statements related to device management must do the following: must be a SELECT statement returning for a given device id a result set with a single row and two columns: first column must be the device key, second column must be the last nonce. If the device id is not known yet, this statement must return an empty result set. To include the device id in the SELECT's WHERE clause, %D can be used. Note that all other % placeholders described in  REF _Ref43729255 \r \h  \* MERGEFORMAT 12.1 do not apply here! must create a new record for the device id with a new, unique device key (by means of an autoincrementing device key field in the database or another database mechanism such as a generator, sequence or trigger). Normally, this is a simple INSERT statement. To insert the device id into the statement, %D can be used. Note that all other placeholders described in  REF _Ref43729255 \r \h  \* MERGEFORMAT 12.1 do not apply here! must update the last nonce for a specified device key. To insert the device key (for example in the WHERE clause), %d can be used. To insert the last nonce, %N can be used. In addition, placeholders described in  REF _Ref47172128 \r \h 12.1.1 can also be used. is an optional statement that can be used to save device name  and  device info information. To insert the device key (for example in the WHERE clause), %d can be used. To insert the device name %nR can be used, to insert the device info, %vR can be used. In addition, placeholders described in  REF _Ref47172128 \r \h 12.1.1 can also be used. The following example shows a complete set of SQL statements to manage devices in a table called SYNC_DEVICES: SELECT DEVICE_KEY,LASTNONCE FROM SYNC_DEVICES WHERE DEVICEID='%D' INSERT INTO SYNC_DEVICES (DEVICEID) VALUES ('%D') UPDATE SYNC_DEVICES SET LASTNONCE='%N' WHERE DEVICE_KEY=%d UPDATE SYNC_DEVICES SET DEVICENAME='%nR', DEVICEINFO='%vR' WHERE DEVICE_KEY=%d XE "userkeysql" \f T: query for user authentication Contained in: , Can contain: SQL query statement Attributes: none This tag specifies the SQL statement that is used to check authorisation of a user in the database. The SQL string specified can contain placeholders to insert values into the query. In addition to the general placeholders (see  REF _Ref47172128 \r \h 12.1.1), the following special placeholders are available in : %U represents the original user name as sent by the remote device. %dU represents the user name that has been set with the SETUSERNAME() function in . %D represents the "domain" value that has been set with the SETDOMAIN() function in . %M represents the credential string (plain text password or MD5 digest, depending on login type) %N represents the nonce string. Depending on how is set (see  REF _Ref42943854 \r \h 12.12), this SQL statement must do the following: If is set, the statement must return a row for every user with a given name having the following result columns (in that order): a "user key": This is a value (normally a primary key into the user table) that uniquely identifies the user and which can be used in further queries to subselect this user's data folder(s) (see  REF _Ref42943895 \r \h 12.20.1). This value is treated as a string, but can be of any data type that has a unambiguous string representation. the password for that user in clear text. If no user with the given name exist, an empty result set (no rows) must be returned. If is set, the statement must return a row for every user with a given name having the following result columns (in that order): a "user key": This is a value (normally a primary key into the user table) that uniquely identifies the user and which can be used in further queries to subselect this user's data folder(s) (see  REF _Ref42943895 \r \h 12.20.1). This value is treated as a string, but can be of any data type that has a unambiguous string representation. the B64-encoded MD5-digest of the string "user:password". If no user with the given name exist, an empty result set (no rows) must be returned. If neither nor are set, the statement must return exactly one row as a result when there is a user that matches the given username, MD5-digest and nonce string, having the following result column: a "user key": This is a value (normally a primary key into the user table) that uniquely identifies the user and which can be used in further queries to subselect this user's data folder(s) (see  REF _Ref42943895 \r \h 12.20.1). This value is treated as a string, but can be of any data type that has a unambiguous string representation. If the given combination of username, MD5 digest and nonce are not valid, the query must return an empty result set (no rows). Note: When using (see  REF _Ref36896289 \r \h 12.17), the columns returned by are assigned to the local variables of the logincheckscript in the order of their definition. Therefore, the may be written such that it returns more columns than those described above. This allows fetching extra user data needed to decide about login in the logincheckscript. Example with set: SELECT USER_KEY,PASSWD FROM SYNC_USERS WHERE USERID='%U' Example with set: SELECT USER_KEY,MD5DIGEST FROM SYNC_USERS WHERE USERID='%U' Example with neither nor set (note that this assumes the presence of a non-standard SQL function "B64MD5"). SELECT USER_KEY FROM SYNC_USERS WHERE B64MD5('%U',PASSWD,'%N')='%M' XE "logincheckscript" \f T: custom login checking script Contained in: Available: in PRO versions only Can contain: script returning boolean value Script context: login context Attributes: none Default: no script This script is executed for every row returned by (see  REF _Ref13986562 \r \h 12.16). Local variables of this script will be initialized with values returned by . The script has access to the same special script functions as (see  REF _Ref36896793 \r \h 12.13 for details). If this script returns TRUE, login is granted. XE "timestampsql" \f T: query for getting database time Contained in: or Can contain: SQL query statement Attributes: none Default: not specified This tag specifies the SQL statement that is used to get a timestamp of the database server's current time. If this tag is not specified, Synthesis Sync Server uses the local time of the machine it is run as current time. It is recommended not to leave this unspecified, because time differences between database and sync server can lead to data consistency problems. The query must return a single row with a single column that represents a timestamp (combined date and time) value. Note that (see  REF _Ref185246110 \r \h 11.34.31) determines in what time zone context the result of this query is to be treated. Example for Microsoft SQL server: SELECT GETDATE() AS CURRENTDATETIME XE "timestamputc" \f T: SQL statement to write activity log entry Contained in: or Can contain: SQL statement Attributes: none Default: false This statement is executed for each datastore involved in a sync session after the sync session has either completed (with or without errors) or timed out (see  REF _Ref47163749 \r \h 11.2 how to set session timeout). Usually, this is an SQL INSERT statement into a global log table. In the statement, all escape sequences described in (see  REF _Ref47169796 \r \h 11.31) plus the following special escape sequences can be used to insert information from the current session into the log: %dT Sync date %tT Sync time %T Sync timestamp (reference time for comparisons of changed/unchanced decisions of last session) %ssT Sync start timestamp (when this sync attempt, successful or not, has started) %seT Sync end timestamp (when this sync attempt, successful or not, has ended) %f folder key (see  REF _Ref42943895 \r \h 12.20.1) %t target key (see  REF _Ref47171780 \r \h 12.20.2) %u user key (see  REF _Ref47171842 \r \h 12.16) %d device key (see  REF _Ref47171876 \r \h 12.14)  XE "datastore type=odbc" \f T  XE "datastore type="sql"" \f T : SQL and ODBC Datastore specific settings Contained in: or Can contain: All tags in chapter  REF _Ref42944330 \r \h 12.20 Attributes: name, type="sql" (or as an alias for backward compatibility: type="odbc") Default: not specified This chapter describes the tags that are specific to SQL and ODBC datastores. See  REF _Ref45367951 \r \h 11.34 for a description of the tag in general. Note: Starting with version 3.0.3.0, the SQL datastore type also supports direct access to SQLite database files instead of using ODBC for accessing the user data. Admin data (SYNC_TARGETS, SYNC_MAPS, SYNC_DEVICES, SYNC_LOGS in the sample config) however is not supported for SQLite at this time. See  REF _Ref182743880 \r \h 12.20.6 for details about SQLite related config. Please also note that SQLite support may not be included in some products. XE "folderkeysql" \f T: get data subselection key Contained in: Can contain: SQL query string Available for: ODBC only (not SQLite) Attributes: none Default: empty This tag specifies the SQL statement that is used to obtain a key value that can be used in subsequent SQL statements to sub-select data in a so-called folder. Folders are subdivisions of a user's data. For example, a user might have two separate database for work and private use on his SyncML-enabled PDA. To allow this on the server side, this user can be given two separate "folders" to store work and private contacts separated from each other. On the SyncML client, the folder name is specified in the target database path. For example, if the database path for contacts is "./contacts", then a folder named "private" will be addressed as "./contacts/private". This tag can be omitted or left empty if the server does not support multiple folders per user. In this case, every user will only have a single folder. In this case, the user key (or user name when using (see  REF _Ref13986080 \r \h 12.11) or , (see  REF _Ref5702037 \r \h 11.10)) is used as folder key, allowing to differentiate records in the data table by user. The SQL string specified can contain placeholders to insert the following values into the query: %F represents the folder name. If the SyncML client specifies no folder name (eg. just "./contacts"), the folder name is an empty string. %u represents the user key. The user key is the value that was returned by the statement (see  REF _Ref47171963 \r \h 12.16). The query must return: An empty result set when the folder does not exist or the user is not allowed to access it At least one row with one single column containing the folder key. This value is treated as a string, but can be of any data type that has a unambiguous string representation. Example (using a link table between folders and users to allow users sharing folders): SELECT FOLDER_KEY FROM SYNC_FOLDERS F JOIN SYNC_PERM P ON P.FOLDERKEY=F.FOLDER_KEY AND P.USERKEY=%u WHERE F.FOLDERID='%F' XE "synctargetgetsql" \f T, XE "synctargetnewsql" \f T, XE "synctargetupdatesql" \f T, : Sync target management Contained in: Can contain: SQL query strings Available for: ODBC only (not SQLite) Attributes: none These four SQL statements are used to manage sync target information. The sync server needs to remember some information for every client database (called sync target) it does a sync session with. This information is stored in an auxiliary table which can exist once for the entire server (as in the config samples, where a separate field DSCODE is used to separate targets from different datastores, see example below) or in a separate table for every datastore (for example if varying custom data needs to be in the same tables for each datatype). The SQL strings specified can contain the following special placeholders (in addition to the standard placeholders as described in  REF _Ref47172128 \r \h 12.1.1) : %f represents the folder key. The folder key is the value that was returned by the statement (see  REF _Ref6117078 \r \h  \* MERGEFORMAT 12.20.1). %u: represents the user key. The user key is the value that was returned by the statement (see  REF _Ref47174498 \r \h 12.16). %t: represents the target key (only for ). %D: represents the device ID of the SyncML client (client URI). %P: represents the client's remote database path (client datastore URI). %L: represents the timestamp of last sync (only for ). %dL: represents the date of last sync (only for ). %tL: represents the time of last sync (only for ). %S: represents the timestamp of last server anchor (only for ). This (and the following two) is needed only when (see  REF _Ref8187404 \r \h  \* MERGEFORMAT 11.34.37) is set. %dS: represents the date of last last server anchor (only for ). %tS: represents the time of last last server anchor (only for ). %RL: represents the timestamp of last sync where remote party was updated (only for . This (and the following five) is needed only if (see  REF _Ref71016088 \r \h 11.34.36) is set. %dRL: represents the date of last sync (only for ). %tRL: represents the time of last sync (only for ). %iRL: represents the custom identifier for the last sync where remote party was updated. This is needed only when (see  REF _Ref153708057 \r \h 11.34.38) is set. %RS: represents the timestamp of last server anchor (only for ). This (and the following two) is needed only when (see  REF _Ref8187404 \r \h  \* MERGEFORMAT 11.34.37) is set. %dRS: represents the date of last last server anchor (only for ). %tRS: represents the time of last last server anchor (only for ). New for Version 3.0 (only needed if is set – see  REF _Ref153707807 \r \h 11.34.39) %SUA: represents the resume alert code (only for ). %SU: represents the timestamp of last suspend (only for ).. %dSU: represents the date of last last suspend (only for ). %tSU: represents the time of last last suspend (only for ). %iSU: represents the custom identifier for the last suspend. This is needed only when (see  REF _Ref153708057 \r \h 11.34.38) is set. New for Version 3.0 (only needed if is set – see  REF _Ref153710706 \r \h 11.34.40). %pSU: represents the Source URI string of the item that must be resumed in the next session. %pTU: represents the Target URI string of the item that must be resumed in the next session. %pSt: represents the partial item status code (numeric). %pM: represents the internal partial item mode (numeric). %pTS: represents the partial item total size (numeric). %pUS: represents the partial item unconfirmed size (numeric). %pSS: represents the partial item stored size (numeric), which is the number of bytes that will be stored into the partial item data field. %pDAT: represents the partial item date (which is a BLOB of the size indicated by %pSS). This value is not literally inserted into the SQL statement, but as a parameter. The four SQL statements are used to look up, create, modify and delete sync target records. The statement specified in must look up if there is already a sync target record matching user, folder, deviceID, remote database path and if yes, return a single row with the following columns (in that order!): target key: this is a value uniquely identifying the target. Normally this is the primary key of the sync target table. It is used to subselect map entries (see below) in the map table. This value is treated as a string, but can be of any data type that has a unambiguous string representation. sync anchor: this is a string value which is set by the sync server. The database table should simply provide a string field of 40 chars size. timestamp of last successful sync: This is set by the sync server. The database table must provide a column that can hold timestamp values when (see  REF _Ref8187433 \r \h 12.20.3) is set, if is not set, it must provide a date and a time column). Only if (see  REF _Ref8187404 \r \h 11.34.37) is set, a separate timestamp used for last server anchor (if is not set, server anchor and last sync timestamps are identical and need to to be saved separately). The database table must provide a column that can hold timestamp values when is set, if is not set, it must provide a date and a time column) . Only if (see  REF _Ref71016088 \r \h 11.34.36) is set, a timestamp of last successful sync when remote was updated. This is needed to allow one-way from remote sync sessions, and is set by the sync server. The database table must provide a column that can hold timestamp values when (see  REF _Ref8187433 \r \h 12.20.3) is set, if is not set, it must provide a date and a time column) . Only if and (see  REF _Ref8187404 \r \h 11.34.37) is set, a separate timestamp used for last server anchor (if is not set, server anchor and last sync timestamps are identical and need to to be saved separately). The database table must provide a column that can hold timestamp values when is set, if is not set, it must provide a date and a time column) . Only if (see  REF _Ref153708057 \r \h 11.34.38) is set, a string identifying the point in time of the last sync for the datastore implementation (plugin). The format of this string is free and only depends on the datastore implementation in the plugin. This is used when the plugin uses a private count or timestamp for detecting changes since last sync. New for version 3.0: For databases supporting SyncML DS 1.2 Suspend & Resume (those that have enabled, see  REF _Ref153707807 \r \h 11.34.39), the following additional columns must be returned: resume alert code: this must be at least a 16-bit integer. timestamp of last suspend: This is set by the sync server. The database table must provide a column that can hold timestamp values when (see  REF _Ref8187433 \r \h 12.20.3) is set, if is not set, it must provide a date and a time column). Only if (see  REF _Ref153708057 \r \h 11.34.38) is set, a string identifying the point in time of the last suspend for the datastore implementation (plugin). The format of this string is free and only depends on the datastore implementation in the plugin. This is used when the plugin uses a private count or timestamp for detecting changes since last suspend. New for version 3.0: Only if and (see  REF _Ref153710706 \r \h 11.34.40) are enabled, the following additional columns must be returned: last source URI: a string used by the sync server for resuming partial items. last target URI: a string used by the sync server for resuming partial items. last item Status: this must be at least a 16-bit integer. partial item State: this must be at least a 8-bit integer. total item size: this must be at least a 32-bit integer. unconfirmed item size: this must be at least a 32-bit integer. stored item size: this must be at least a 32-bit integer, and represents the size of the data stored in the "partial item" column (see below). partial item: this must be a BLOB column that can hold an arbitrary block of binary data, with potentially 2^32 bytes of size. In reality, this block will never exceed the maximum size of data objects supported. But for example for emails with attachments, the partial item can get quite large. The statement specified in must insert a new record into the sync target table, which is uniquely defined by user, folder, deviceID, and remote database path. The statement specified in must update all values fetched by for a specified targetkey. The statement specified in must delete an existing sync target record identified by a target key value. In addition, it should make sure that all related map entries (see  REF _Ref47781675 \r \h 12.20.5) are also deleted (by an implicit ON DELETE CASCADE constraint or explicitly by including more than one DELETE statement into this tag, which can be done by using the %GO special sequence, see  REF _Ref47781653 \r \h 12.1.2). Example (what is new for version 3.0 is marked red): SELECT TARGET_KEY, ANCHOR, LASTSYNC, LASTTOREMOTESYNC, RESUMEALERT, LASTSUSPEND, LISOURCE, LITARGET, LISTATUS, PISTATE, PITOTALSZ, PIUNCONFSZ, PISTOREDSZ, PIDATA FROM SYNC_TARGETS WHERE DSCODE='no' AND USERKEY=%u AND FOLDERKEY=%f AND DEVICEKEY=%d AND DEVICEDBPATH='%P' INSERT INTO SYNC_TARGETS (DSCODE, USERKEY, FOLDERKEY, DEVICEKEY, DEVICEDBPATH) VALUES ('no', '%u', %f, %d, '%P') UPDATE SYNC_CONTACTS_TARGETS SET ANCHOR='%A', LASTSYNC=%L WHERE TARGET_KEY='%t' UPDATE SYNC_TARGETS SET ANCHOR='%A', LASTSYNC=%L, LASTTOREMOTESYNC=%RL, RESUMEALERT=%SUA, LASTSUSPEND=%SU, LISOURCE='%pSU', LITARGET='%pTU', LISTATUS=%pSt, PISTATE=%pM, PITOTALSZ=%pTS, PIUNCONFSZ=%pUS, PISTOREDSZ=%pSS, PIDATA=%pDAT WHERE TARGET_KEY=%t DELETE FROM SYNC_TARGETS WHERE TARGET_KEY=%t %GO DELETE FROM SYNC_MAPS WHERE TARGET_KEY=%t XE "synctimestamp" \f T: format for timestamps in target table Contained in: Can contain: boolean value Available for: ODBC only (not SQLite) Default: yes If this tag is set to yes, timestamp values in the sync target information are stored in timestamp columns (one column containing combined date/time value). Otherwise, timestamp values are stored as a pair of separate date and time columns. Note that SQL statements (see  REF _Ref6030156 \r \h 12.20.2) must be formed according to this setting.  XE "lastmodfieldtype" \f T : modified time stamp type Contained in: Can contain: database field type for the modified time stamp field Attributes: none Default: timestamp This tag specifies the database field type used as modified timestamp. For SQL/ODBC databases this is usually "timestamp" (the default), but for SQLite databases which do not have a native timestamp format, this can be set to one of the integer timestamp formats (such as UNIX epoch time). See description of "type" attribute in  REF _Ref47173451 \r \h 11.34.41.1 for possible values but note that only timestamp-related field types makes sense here!  XE "selectmapallsql" \f T ,  XE "insertmapsql" \f T ,  XE "updatemapsql" \f T ,  XE "deletemapsql" \f T : Map table management Contained in: Can contain: SQL statements Available for: ODBC only (not SQLite) Attributes: none Default: none These four SQL statements are used to manage object ID mapping information. The sync server needs to create a map entry for every object synchronized between the server and a specific device. A map entry links the unique localID - normally a primary key of the data table in the local server database - to the corresponding unique remoteID for the same object in the remote SyncML client's database. As there are separate map entries for each database on each device, the map table entries must be related to a sync target (see  REF _Ref43728908 \r \h 12.20.2). Note that map entries may not be related to the data records via localID in a way that would cause automatic deletion of the map entry when the data record is deleted (such as with a ON DELETE constraint)! It is essential that map entries remain existing after the corresponding data records are deleted - this is required by the sync engine to detect and propagate delete operations. The SQL strings specified can contain the following special placeholders (except selectmapallsql) in addition to the standard placeholders described in  REF _Ref47779943 \r \h 12.1.2: %k represents the localID. The localID is normally the primary key into the database table containing the actual data records (such as contact records or events). Depending on the type of key, this might be a string or a numeric value. %r: represents the remoteID. This must always be treated as a string - normally it is not more than 30 characters in length, but some clients (mostly those that have to deal with Microsoft Exchange) use very long IDs so we recommend reserving 64 or even 128 characters here. New for version 3.0: (only needed if is set – see  REF _Ref153707807 \r \h 11.34.39) %e: represents the entryType. This is a small integer (8 bits are sufficient) and determines the type of the map entry – because for some SyncML DS 1.2 features, different types of map entries are required. It is important to include entryType into the primary key for the map table (and no longer only localID and targetKey) because multiple map entries with the same localID, but different entryType can exist for the same targetKey). %x: represents the mapFlags. This is a 32 bit integer and stores extra flags for each map item required for SyncML DS 1.2 Suspend&Resume and other advanced features. The four SQL statements are used to read the entire map table and to add, update and delete single map entries. The statement specified in must return a result set containing the entire map table for the current sync target (normally there is a WHERE clause including %t to restrict the SELECT to the map entries of one sync target) in two columns (in that order!): localID: this column must contain the localID, which can be a string or a numeric value, depending on the type of primary key the data table has. remoteID: this column must contain the remoteID, which always is a string. New for version 3.0: For databases supporting SyncML DS 1.2 Suspend & Resume (those that have enabled, see  REF _Ref153707807 \r \h 11.34.39), the following additional columns must be returned: entryType: this column must contain the entryType, a small integer (8 bit is sufficient). mapFlags: this column must contain the mapFlags, which is at least a 32 bit integer value. The statement specified in must insert a new record into the map table, which is related to a sync target and contains both localID and remoteID. The statement specified in must update the remoteID for a given localID related to a sync target. The statement specified in must delete the map entry with a given localID related to a sync target. Example SQL definition of a map table (what is new for version 3.0 is marked red): CREATE TABLE SYNC_CONTACTS_MAP ( LOCALID INTEGER NOT NULL, REMOTEID VARCHAR(63), TARGETKEY INTEGER NOT NULL, ENTRYTYPE INTEGER DEFAULT 1, FLAGS INTEGER DEFAULT 0, PRIMARY KEY (LOCALID,ENTRYTYPE,TARGETKEY) ) Example config to access the map table defined above (new for version 3.0 in red): SELECT LOCALID, REMOTEID, ENTRYTYPE, FLAGS FROM SYNC_MAPS WHERE TARGETKEY=%t INSERT INTO SYNC_MAPS (LOCALID, REMOTEID, TARGETKEY, ENTRYTYPE, FLAGS) VALUES (%k,'%r',%t, %e, %x) UPDATE SYNC_MAPS SET REMOTEID='%r', FLAGS=%x WHERE LOCALID=%k AND ENTRYTYPE=%e AND TARGETKEY=%t DELETE FROM SYNC_MAPS WHERE LOCALID=%k AND ENTRYTYPE=%e AND TARGETKEY=%t  XE "sqlitefile" \f T : SQLite database file name Contained in: Can contain: path to SQLite 3 database file (usually has extension .sdb) Attributes: none Default: none If this tag contains a file path, the datastore uses the specified SQLite 3 database file to access user data rather than using ODBC to access a SQL server. Note that SQLite databases can only be used for user data (contacts, calendar, notes etc.), but not for SyncML administrative data like users, devices, folders, targets and maps (see  REF _Ref43728908 \r \h 12.20.2,  REF _Ref153731855 \r \h 12.20.5,  REF _Ref68495073 \r \h 12.15,  REF _Ref43727921 \r \h 12.16). In a SQLite based setup, administrative data is either transparently handled by the SyncML engine itself (this is the case for custom clients built with the Synthesis SyncML client library / SDK) or must be stored using a database plugin (see  REF _Ref135023442 \r \h 14 – " REF _Ref135023442 \h ,  XE "client type=plugin"\f T : Plugin Based Server or Client Config"). The built-in text-file based plugin is usually sufficient and can be used as-is (see  REF _Ref133810323 \r \h 14.3).  XE "sqlitebusytimeout" \f T : SQLite database file name Contained in: Can contain: SQLite timeout when data is busy (in seconds) Attributes: none Default: 15 This specifies the time the SQLite engine waits for data becoming ready for access before it returns a "database busy" error. XE "quotingmode" \f T: how ODBC strings must be escaped for the database Contained in: , or Can contain: name of quoting mode Attributes: none Default: "singlequote" This defines how line ends within strings are encoded: "singlequote": This is the default, and this was the only mode supported before version 2.1.1.5: single quotes must be duplicated (ok for many SQL DBs like Oracle, Interbase, MS-SQL) in string literals "doublequote": double quotes must be duplicated in string literals "backslash": Backslash is an escape char, and CR,LF,TAB,BS,\," and ' must be backslash-escaped (MySQL mode). "none": No quoting, usually not recommended as string containing the single quote string delimiter can not be used then. Note: when used in context of a , this setting only affects the actual accesses to this datastore - so it is possible to have different quoting modes for different datastores. If used in context of or , the setting is used for all accesses that are not related to a particular datastore.  XE "dbcanfilter" \f T : use filtering in WHERE clause Contained in: Can contain: boolean value Attributes: none Default: false If this option is set to true, the server tries to convert active filters into an SQL WHERE clause that can be included in SELECT statements using the %AF and %WF placeholders. This is efficient as it prevents the database from fetching data that is not needed for a sync session, however not all filter expressions can be converted to a WHERE clause. XE "earlycommit" \f T: commit at end of SyncML message exchange Contained in: Can contain: boolean value Attributes: none Default: true (false in 1.0.5 versions and earlier) If this option is set to true, the server always commits all updates to the database at the end of every message exchange with the client. This is important for database setups where an unfinished transaction could lock other transactions. By setting this option, no transaction will be kept active for a longer period of time. XE "multicursor" \f T: no longer supported in version 3.0 Contained in: Can contain: boolean value Attributes: none Default: false This option is no longer supported in version 3.0. XE "commititems" \f T: commit each item update Contained in: Can contain: boolean value Attributes: none Default: false If this option is set to true, the server separately commits all updates to the database as they occur. This might be needed depending on the database design. XE "modtimestamp" \f T: combined date and time for modification timestamp Contained in: Can contain: boolean value (for ) field names (for , ). Available for: ODBC only (not SQLite) Attributes: none Default: true This tag specifies if the modification timestamp in the data table consists of a single timestamp value ( true) or if it consists of a date field and a time field ( false). This setting is used when reading modification timestamps with , see  REF _Ref47784397 \r \h 12.20.14.  XE "selectidandmodifiedsql" \f T : read IDs and timestamps Contained in: Can contain: SQL statements Available for: ODBC and SQLite Attributes: none Default: none This SQL statement must return a result set containing localID and modification timestamp for all records in the database for the current sync target as follows (in that order!): local id: this column must contain the local ID, which can be a string or a numeric value. modification timestamp or modification date: this column must contain the modification timestamp (if is true) or the modification date (if is false). modification time: this third column must be returned only if is false (modification timestamp consisting of a date field and a time field). This SQL statement must only return the rows that belong to the current user (therefore possibly including %u in the WHERE clause, see  REF _Ref47172128 \r \h 12.1.1) and in the current folder (therefore possibly including %f in the WHERE clause, see  REF _Ref47779943 \r \h 12.1.2) and passing the currently set filters (therefore including %AF or %WF in the WHERE clause, see  REF _Ref47173394 \r \h 12.1.3). Example (note that records are selected by folder key with %f, and %AF is included to extend the WHERE clause with AND plus a filter expression in case there are filters defined for the current sync session (see  REF _Ref46752884 \r \h 7 for details about filters) SELECT CONTACTS_KEY,MODIFIED FROM SYNC_CONTACTS WHERE FOLDERKEY=%f %AF  XE "selectdatasql" \f T : read record from database Contained in: Can contain: SQL statements Available for: ODBC and SQLite Attributes: none Default: none This SQL statement is used to read all fields of a record identified by its localID from the database. The statement must return a result set with a single row containing all columns (fields) in the that are enabled for read (see "mode" attribute of in  REF _Ref47173451 \r \h 11.34.41.1) in the order as they appear in the . Normally, this consists of a SELECT statement which uses %N as the list of columns to be selected (%N automatically contains the list of all read-enabled fields in the , see  REF _Ref47173394 \r \h 12.1.3). Example: SELECT %N FROM SYNC_CONTACTS WHERE CONTACTS_KEY=%k  XE "insertdatasql" \f T ,  XE "updatedatasql" \f T ,  XE "deletedatasql" \f T ,  XE "zapdatasql" \f T : write records to database Contained in: Can contain: SQL statements Available for: ODBC and SQLite Attributes: none Default: none These four SQL statements are used to modify the data table. The statement specified in must insert a new record into the data table. If (see  REF _Ref46750086 \r \h 12.20.18) is false, the ID for the new record will be made available before the execution of (by executing ) and can be included in using the %k placeholder (see  REF _Ref47173394 \r \h 12.1.3). If is true, the execution of must automatically generate an ID, which is then obtained with the statement after the insert. The %N and %v placeholders can be used to easily include the list of column names and values that must be INSERTed. See example below. The statement specified in must update a record identified by a localID (which can be inserted into the statement using %k, see  REF _Ref47173394 \r \h 12.1.3). The %V placeholder can be used to easily include a list of column name / value pairs for an UPDATE statement. %N and %v can be used as well, for example when not using UPDATE, but a stored procedure call. Note that %V, %N and %v only include the columns that need to be changed, unless is set to true. To include all columns that are write-enabled (see "mode" attribute of in  REF _Ref47173451 \r \h 11.34.41.1) the placeholders %aV, %aN and %av can be used. The statement specified in must delete a record identified by a localID (which can be inserted into the statement using %k, see  REF _Ref47173394 \r \h 12.1.3). Note that this needs not necessarily be a physical DELETE statement, but could also be an UPDATE statement that updates a flag in the records such that it disappears from the list of records returned by the (see  REF _Ref47845006 \r \h 12.20.14). The optional statement specified in must delete all records that are part of the synchronized data set (that is, all records that are returned by the statement, see  REF _Ref47845006 \r \h  \* MERGEFORMAT 12.20.14). This statement is used in a server when a SyncML client requests "refresh from client only" sync or in a client when "refresh from server" sync mode is used. If it is not specified, the server will repeatedly use to delete all the records one by one.  XE "ignoreaffectedcount" \f T : Ignore SQLRowCount Contained in: Can contain: boolean value Attributes: none Default: false New in: 3.0.2.2 If < ignoreaffectedcount> is set, the SQLRowCount (number of rows affected by an UPDATE or INSERT statement) is ignored for and (see  REF _Ref66078569 \r \h 12.20.16). This might be needed when update statements are implemented as stored procedure which might not set SQLRowCount correctly. XE "obtainidafterinsert" \f T, XE "obtainlocalidsql" \f T, XE "determineidonce" \f T, XE "minnextid" \f T,  XE "specialidmode" \f T ,  XE "insertreturnsid" \f T ,  XE "localidscript" \f T : local object ID management Contained in: Can contain: boolean value (for , ), SQL query (for ), integer value (for ), one of "none" or "unixmsrnd6" (for ), script for (in PRO version only) Attributes: none Defaults: : false : empty : false : false : 1000000 : none : none These seven tags specify how Synthesis Sync Server obtains a new local ID (unique key into the data table) when inserting new data records. Basically, depending on the database used, the next ID for an INSERT statement must be either obtained before doing the insert (e.g. in Interbase/Firebird or Oracle by using a generator, or by using a random generator) or the database generates a key automatically when the INSERT occurs, and this key must be obtained afterwards (e.g. with MS SQL server's identity columns or MySQL auto_increment). Unfortunately, some desktop databases like Filemaker Pro do not provide proper support for obtaining the ID of a new records, or are terribly slow in doing so. For these, the very special and options can provide a solution that is usable, but not fully multi-user proof (see example). The options are used as follows: must be set to "no" when the key value must be obtained before doing an INSERT statement (e.g. Interbase/Firebird or Oracle case). If so, the statement (see  REF _Ref66078569 \r \h 12.20.16) must contain a statement (usually a INSERT) that sets a value for the key field (normally using the %k placeholder, see  REF _Ref47173394 \r \h 12.1.3). must be set to "yes" if the key value is generated automatically by the database at INSERT and can be obtained afterwards (SQlite, MS SQL or MySQL case). If so, the statement should not write to the key field but rely on the database to fill it appropriately. can be set to "yes" if the statement (see  REF _Ref66078569 \r \h 12.20.16) returns the new ID in a result set (single row, first column). This can be useful if insert is implemented using a stored procedure returning the new local ID. If this is set to true, the is not executed. must be an SQL query that returns a single row with a single column containing the local ID (data table key value). Depending on the setting of , this SQL query is executed before or after doing an INSERT. Note that for SQLite, this is not available – the ROWID of the last insert is always obtained using sqlite3_last_insert_rowid() SQLite API function. should never be set in multi-user environments. If set, the sync server executes the only once at the beginning of the sync session, expecting a numeric starting value for keys. Keys for new records are then generated by incrementing this number. This can be useful for accessing desktop databases which do not have a proper mechanism for generating unique keys. The SQL could be something like "SELECT MAX(ID) FROM DATA_TABLE". Of course, this will not work when the database is accessed by more than one application simultaneously. is only relevant when is set. It can be used to specify a minimum integer value to be used for the next id. If the result returned by executing the statement is numerically less than , the value from will be used as starting value for generating IDs. This is useful for desktop databases that have some auto-increment feature for generating IDs, but no way to properly obtain the ID via ODBC (Filemaker Pro 5.0 for example). With specifying a high , one can guarantee in a single user environment that IDs generated by the internal autoincrement feature and those generated by the sync engine do not conflict. Inserts done by the desktop database itself will have autoincrement IDs (say starting at 1), and because of a high (say 1000000), inserts done by the sync server will get IDs starting at 1000000. With "SELECT MAX(ID) FROM DATA_TABLE" as , the sync server is able to properly continue numbering new items, while the database itself uses some internal counter for the autoincrement field which is way below 1000000. can be set to "unixmsrnd6" to have pseudo-random IDs generated as follows: UNIX-style time() is multiplied by 1000000 and then a 6-digit random number is appended. This gives a very high probability that all IDs generated this way are unique. If is not "none", the is notused for obtaining an ID. can be used to implement a completely custom method of obtaining a new ID for a new record. This script is executed before is executed. If it has a return value, it is used as the local ID for the record to be added, unless is specified as well (in this case, the result of will override the return value of the - the script might still be useful in case some preparation is required before executing ). Usually however, either or will be used. Example for MS SQL Server (ID must be obtained after insert): yes SELECT @@IDENTITY AS ID Example for Interbase / Firebird (ID must be generated before insert by calling a stored procedure): no SELECT * FROM NEXT_CONTACT_KEY Example for Filemaker Pro (non-multiuser, lacks proper ID mechanisms) yes SELECT MAX(CONTACT_KEY)+1 FROM SYNC_CONTACTS 1000000 XE "map" \f T: SQL specific field mapping features Contained in: , Can contain: nothing Attributes: SQL specific: readblobsql, keyfield plus standard attributes: name, references, type, mode, size, truncate (see  REF _Ref47173451 \r \h 11.34.41.1) This tag establishes a link between an internal field as defined in a 's tag (see  REF _Ref47173292 \r \h 10.2) and a field in the datastore's user data table (SQL database table field or plugin data field). The tag in SQL datastores can have the following extra attributes (in addition to the standard attributes explained in  REF _Ref47173451 \r \h 11.34.41.1): "readblobsql": This allows specifying a SQL statement for fetching only the mapped field from the database. It must contain a SQL statement (usually a SELECT) that returns exactly one row with exactly one column. This mechanism is intended to read large text and BLOB fields from the database only when needed. Unlike most small strings and other fields that are always required for slow sync comparison etc., large BLOBs and text field's contents are often only needed when actually transmitting them to the remote party. So specifying "readblobsql" prevents unneeded reading of large data chunks and thus increases memory efficiency and performance. Note that the "readblobsql" will usually not be executed when reading other fields, but probably much later in the process of the sync session. "keyfield": this must be specified if the "readblobsql" needs a special key value to be retrieved independently from the main record. If "keyfield" is specified, the %N list of fields when fetching the main record will contain the name of the keyfield (instead of the name of the content field itself). The value returned from the keyfield can then be used in the "readblobsql" statement using the %K placeholder. Note that for BLOBs that are contained in the main record, "keyfield" can usually be left empty, as the main record key %k can be used to address them. However if the BLOBs are in a detail table (see  REF _Ref153765172 \r \h 12.20.20), the "keyfield" mechanism is important to obtain the correct key for individually reading the BLOBs of an array. Example 1: the PHOTO field of a vCard (key is the main record key, so no "keyfield" is required: Example 2: the CONTENTS for email Attachments, which are in a detail table ( map, see  REF _Ref153765172 \r \h 12.20.20). Here a "keyfield" is required, as the key for fetching the contents is NOT the main record key, but the key in the secondary table (here: ATTS_KEY): … other maps … XE "array" \f T: definition of master - detail record structures Contained in: Available: in PRO versions only Can contain: , , , , , , , , , , , Attributes: sizefrom The tag has the following optional attribute: "sizefrom": this can be used to specify either an array field (usually one of the detail fields ed in the ) which is used to determine the size of the array when writing detail records. Alternatively, this can specify an integer field, which is then used as array size - it will receive the number of detail records read after a read operation and will be used to determine how many detail records must be written. An array is a powerful means to map an internal item (consisting of the fields defined in a , see  REF _Ref42589436 \r \h 10.1) not only to a single database record, but to a master record having one or several detail records. For example, a database for contact information could store the contact's name in the master record, but have an unlimited number of attached detail records for each phone number relevant to that contact. Another example are calendar databases that store alarm information in a table separate from the main event table. An array can contain several tags that control how and if detail records are accessed (see  REF _Ref47867141 \r \h 12.20.21 and  REF _Ref47867143 \r \h 12.20.22) and also contain tags for SQL statement to actually access the detail table  REF _Ref47867144 \r \h 12.20.23). An array must also contain tags that map internal fields (and local variables of the ODBC database context) to the columns of the detail table. As an array might have multiple elements, must either map array columns to array fields or it must map to the first in a block of fields with same type (such that the second and further array elements can be stored in the second and further s in that block). The following step-by step description shows how works for reading and writing. When an item is read from the database, the following happens: The master record is read using the statement (see  REF _Ref47784098 \r \h 12.20.15) If defined, the of the is executed. If this script returns false, processing continues at  REF _Ref47867609 \r \h 13. The statement (see  REF _Ref47867926 \r \h 12.20.23) is executed to fetch all detail records related to the current master record. An internal array index is reset to zero. If the result set contains no more rows, processing continues at  REF _Ref47871470 \r \h 11. A row from the result set returned by the statement is stored in the fields as defined with the s of the . If a mapped field is an array field, the internal array index is used as array index for the field. If the mappe field is a non-array field, the internal array index is used as an offset which will be added to the position of the mapped field in the (therefore, second and further elements of the array will be stored in the s following the mapped in the . Note that if a within an references a local script variable rather than a field from the , the array index is irrelevant if the local variable referenced is not an array variable. If defined, the of the is executed The internal array index is incremented by the value defined with (default = 1). If the number of array elements processed is less than the number defined with (and is not 0, meaning unlimited), processing continues at  REF _Ref47871522 \r \h 5. If the "sizefrom" attribute was set to a non-array field, the number of array elements read will be stored in it. If the has returned no rows, the (see  REF _Ref47867954 \r \h 12.20.22) is applied to the data item in make-pass mode (see  REF _Ref47262189 \r \h 7.1 for details about filters). If defined, the of the is executed If defined, the of the is executed Now, reading the item is complete. When an item is written to the database, the following happens: If defined, the of the is executed The master record is written to the database using the or statements (see  REF _Ref47784099 \r \h 12.20.16). If defined, the of the is executed. If this script returns false, processing continues at  REF _Ref63052833 \r \h 14. Note that before Version 2.1.1.24, the was executed only after issuing the (see step  REF _Ref130893908 \r \h 4), so returning false from the for an update always caused deleting all existing detail records. From Version 2.1.1.24 onwards, returning false from the causes not touching the details records at all. If the write operation is an update, the statement of the is executed (If is set to true, the is also executed for inserts, see  REF _Ref207637531 \r \h 12.20.24). Note that updating the detail records always includes deleting all existing detail records and then creating new ones with updated detail data. If the is defined, it is applied in test mode to the data item. If the item passes the filter, this means that no detail records are needed and therefore processing continues at  REF _Ref63052833 \r \h 14. An internal array index is reset to zero. If defined, the of the is executed. If this script returns false, processing continues at  REF _Ref47869783 \r \h 13. If all fields that are mapped with for write in the are empty and the number of detail records is neither defined by a "sizefrom" field in the nor with a , processing continues at  REF _Ref47871769 \r \h 11. If all fields that are mapped with for write in the are empty and is false, processing continues at  REF _Ref47871769 \r \h 11. The statement (see  REF _Ref47867926 \r \h 12.20.23) is executed to insert one array element. The insert statement must make sure that the detail records are somehow related to the master record, for example by linking them with the master record's key (%k placeholder). The placeholders %v and %V will contain values as defined with the s of the . If a mapped field is an array field, the internal array index is used as array index for the field. If the mapped field is a non-array field, the internal array index is used as an offset which will be added to the position of the mapped field in the (therefore, second and further elements of the array will be stored in the s following the mapped in the . Note that if a within an references a local script variable rather than a field from the , the array index is irrelevant if the local variable referenced is not an array variable. As a consequence, mapping a local variable in an means that the array has no "natural" size (as any array index will at least get a value from the local variable), so it is essential to use or the "sizefrom" attribute in to limit the number of array elements written to the database! The internal array index is incremented by the value defined with (default = 1). If the number of array elements processed is less than the number defined by the "sizefrom" field and less than specified with , processing continues at  REF _Ref63053303 \r \h 7. If defined, the of the is executed Now, writing the item is complete.  XE "maxrepeat" \f T ,  XE "repeatinc" \f T ,  XE "storeempty" \f T : detail record storage options Contained in: Available: in PRO versions only Can contain: number (for maxrepeat and repeatinc), boolean value (for storeempty) Attributes: none Default: maxrepeat=1, repeatinc=1, storeempty=false These tags control how stores data in detail tables: defines the maximum number of detail records for the . If this is set to 0, this means that the number is not fixed, but rather depending on how many non-empty detail records can be written or on the "sizefrom" attribute in . We recommend specifying the "sizefrom" attribute (see  REF _Ref47864390 \r \h 12.20.20) when using =0. defines the increment for the array index (default is 1). This makes sense if the ed fields are not array fields and therefore the array index is used as a offset in the field list. can be set to true to have even elements with all ed fields empty stored as array element in the detail table. If is set to false, all empty elements will not be stored in the database.  XE "noitemsfilter" \f T : detail record storage filter Contained in: Available: in PRO versions only Can contain: filter expression (see  REF _Ref46752884 \r \h 7) Attributes: none Default: none This filter is applied in test mode to check if an contains any elements. If the data item passes this filter, the SyncML engine assumes the item has no array elements. See in  REF _Ref47872399 \r \h 12.20.20 for details.  XE "selectarraysql" \f T ,  XE "deletearraysql" \f T ,  XE "insertelementsql" \f T : detail record SQL Contained in: Available: in PRO versions only Can contain: SQL statements Attributes: none Default: none These statements are used to read, delete or insert array elements. See in  REF _Ref47872399 \r \h 12.20.20 for details.  XE "alwaysclean" \f T : clean detail records on insert Contained in: Available: in PRO versions only Can contain: boolean value Attributes: none Default: false If this is set to true, the will be executed even after inserting a new master record. Usually, when a master record is inserted, no child records related to it already exist and therefore executing in these cases is not necessary (but was always performed before version 3.1.6.12).  XE "optionfilterscript" \f T : prepare SQL filter according to options Contained in: Available: in PRO versions only Can contain: script Script context: database context Attributes: none Default: no script This script is called once before any reading or writing takes place. It should check the user options that might restrict the data to be fetched from the database, such as STARTDATE(), ENDDATE(), NOATTACHMENTS() and similar. If it is possible to generate an SQL expression that can be used in a WHERE clause (see %AF and %WF placeholders in  REF _Ref47173394 \r \h 12.1.3), the script should use SETSQLFILTER() to specify the expression and return TRUE. If it is not possible to create an appropriate filter expression, the script must return FALSE or nothing. The has access to the database context specific functions described in  REF _Ref153776799 \r \h 11.34.41.3.  XE "server type=textdb"\f T ,  XE "client type=textdb" \f T : Text File Based Server or Client Contained in: Available: Is no longer available in version V3.0, replaced by „textdb“ plugin, see  REF _Ref133745663 \r \h  \* MERGEFORMAT 14. and can be defined as plugin params of the plugin module  XE "server type=plugin"\f T ,  XE "client type=plugin"\f T : Plugin Based Server or Client Config Contained in: Can contain: tags described in this chapter (see also  REF _Ref47164079 \r \h 11, and  REF _Ref90895285 \r \h 16 specifically for clients) Attributes: type="plugin" This chapter describes the tags available for the configuration of a plugin based server or client. Plugins are additional modules, which will be accessed thru a standardized interface. The details of this interface are described in the SDK_manual.pdf (Reference Manual for Software Development Kit and Plugin Interface of the Synthesis Sync Engine). One member of the plugin family is the „textdb“, which is the replacement for the implementation in the 2.1.X servers/clients. Plugins are either built-in (e.g.: „textdb“; replacement for the former server type „textdb“) external modules (DLLs / shared libaries; e.g.: samples of the SDK package) plugin module: global settings Contained in: , Can contain: Default: empty built-in module called „no_dbapi“ w/o functionality  XE "plugin_module" \f T  The plugin name can either refer to an external module, which will be linked dynamically (example: SDK_textdb), or as built-in module using the bracket notation (example: [SDK_textdb]). While external plugin modules can be added individually by the customer, the built-in modules are integrated by Synthesis AG only. Built-in modules are: the empty default adapter „no_dbapi“ the text db plugin „SDK_textdb“ , available in demo/STD/PRO server/desktop client, see also  REF _Ref133810323 \r \h 14.3 the Java/JNI interface „JNI“ ( PRO server/desktop client only ).  XE "plugin_sessionauth" \f T  By default, the session authenitification ( login / logout ) will be done by the underlying layer (ODBC for the STD and PRO server, see  REF _Ref43727921 \r \h 12.16). By setting to yes, the authentification of the plugin module will be activated: yes  XE "plugin_deviceadmin" \f T  By default, the device administration (nonce handling, getting DB time, saving device info) will be done by the underlying layer ( ODBC for the STD and PRO server ). By setting the tag to yes, the device administration of the plugin module will be activated: yes  XE "plugin_params" \f T  All plugin specific parameters must be passed as within . They will be passed as a string to the plugin module. See description of the used plugin module for the details of these parameters. Example: /var/log/sysync  XE "datastore type=plugin" \f T : Plugin Datastore specific settings Contained in: Attributes: name, type Can contain: Default: not specified This chapter describes the tags that are specific to plugin based datastores. See  REF _Ref45367951 \r \h 11.34 for a description of the tag in general.  XE "plugin_deviceadmin" \f T  By default, the datastore administration ( ADM / MAP tables ) will be done by the underlying layer ( ODBC for the STD and PRO server ). By setting the tag to yes, the datastore administration of the plugin module will be activated: yes NOTE: If this flag is set, the params of  REF _Ref133832449 \r \h 14.2.5 will not be considered.  XE "plugin_module" \f T  For details see  REF _Ref133830177 \r \h 14.1.1  XE "plugin_params" \f T  All plugin specific parameters for this datastore must be passed within . For details see  REF _Ref133831852 \r \h 14.1.4.  XE " plugin_debugflags " \f T  16 plugin specific flags can be defined for plugin debug logging. Two of these bits ( bit 0 and bit 1 ) are predefined and reserved: bit 0 is used for all plugin interface logging (which is part of the SyncML engine), bit 1 is an unspecific DB flag, which will be used in all the plugin examples. The flags must be defined in hexadecimal representation. Example: 0x0501 ( Bits 0, 8 and 10 are set If is not defined, ALL plugin specific flags are set ( 0xffff ). NOTE: To activate any plugin logging, the global flag "plugin" must be set. "plugin" will be activated also together with some combined groups. For details see the description ( REF _Ref47170147 \r \h 8.11): ... ...  XE "plugin_moduleadmin" \f T , XE "plugin_paramsadmin" \f T , . For this case and will be used. If only is defined, but not , the datastore data will be handled by the underlying layer (which is ODBC for the STD and PRO server ). An overview is given in the table below: DATAADMIN--falseODBCODBCaa-falseaaODBC-bbfalseODBCbbaabbfalseaabb--trueODBCODBCaa-trueaaaa-bbtrueODBCODBCaabbtrueaaaaXE "plugin_module" \f Tplugin module “SDK_textdb” The built-in plugin module „SDK_textdb“ acts as the db interface for the „demo“ server/desktop client, but is also available in the STD and PRO servers/desktop clients Files of the textdb The „textdb“ creates 5 different files: TDB_uuu_datastorename.txt uuu = userKey BLB_uuu_datastorename_itemid_fieldid DEV_ddd.txt ddd = deviceKey ADM_ddd_uuu_datastorename.txt MAP_ddd_uuu_datastorename.txt The most important one is the TDB_*.txt file, which contains the data for each datastore. The file format has the same structure as the former textdb data file: The first column is the GUID (object identifier on the server), which is an integer number in the SDK_textdb implementation (starting at 10000). The second column is the modification timestamp in ISO8601 format, UTC (you would need to update this in order to mark a record modified). All following columns contain the data fields in the order as defined in the corresponding (see  REF _Ref6030571 \r \h 10.1). uuu is the userKey, resulting from Login( username,password ). It must be unique for each user. The ddd part of the name is derived from the client's DeviceID (which should be, in theory, unique). Login( „test“,“test“ ) is hardwired in this textdb and results in uuu=“test“. The DEV_*.txt file holds the device information, ADM_*.txt / MAP_*.txt contain the administration data for each device and user and datastore (if datastore admin is switched on). Normally no reason exists to edit these files. PluginParams of the textdb Plugin specific params are defined for the (see  REF _Ref135023800 \r \h 14.2.3): : The data files TDB_* can be chosen specifically. If this tag is not defined, data files will be stored at the current path of the SyncML engine. This plugin param replaces the former of the old textdb. : The BLOB files BLB_* can be chosen specifically. If this tag is not defined, BLOB files will be stored at . This plugin param was not available for the old textdb (because BLOBs were not supported there). : The map/admin files MAP_*, ADM_* and DEV_* can be chosen specifically. If this tag is not defined, data files will be stored at . This plugin param replaces the former of the old textdb. Some legacy params, do not use them any more for new applications: : path for TDB/BLB/MAP/ADM/DEV files ( Linux, MacOSX ) : path for TDB/BLB/MAP/ADM/DEV files ( Windows ) If platform specific data/map file paths are needed, use the platform attribute (see  REF _Ref153284855 \r \h 4): Example: D:\projects\maps XE "plugin_module" \f Tplugin module “FILEOBJ” Files of the fileobj modules The FILEOBJ plugin is able to handle OMA DS 1.2 file objects. The items will be stored as real files, when possible with their correct name, file date and attributes. So with this plugin module, a file sync via SyncML is possible. NOTE: Using OMA DS 1.2 FILEOBJ do not require necessarily a FILEOBJ plugin, the objects can alternatively be stored as BLOBs within an ODBC data structure. Even the textdb implementation is able to store these file objects.  XE "client" \f T ,  XE "server" \f T : Synthesis SyncML Engine library only configuration tags Contained in: of a Synthesis SyncML Engine library based client or server. Can contain: tags described in this chapter (see also  REF _Ref47164079 \r \h 11,  REF _Ref47164085 \r \h 12 and  REF _Ref135023442 \r \h 14 for settings not specific to SyncML engine library based clients) Attributes: type (see  REF _Ref47164079 \r \h 11 for details)  XE "binfilespath" \f T : Path for persistent storage of client settings and admin data Contained in: Can contain: path of a directory where client engine library can read and write Default: platform's default location for storing application data The Synthesis SyncML Client Engine Library usually comes with built-in management for persistent, but user changeable settings, organized in so-called "profiles" and "targets" (for details about the Synthesis SyncML Client Engine Library, please refer to the SDK documentation ( HYPERLINK "SDK_manual.pdf" SDK_manual.pdf). This setting information, along with some internal SyncML administration data like changelogs is stored in binary files. The tag is used to specify a directory where the client engine library can store these files. If is not explicitly set, the platform's default path for storing an application's data or preferences is used (the same path as represented by the $(appdata_path) config variable, see  REF _Ref184460000 \r \h 4.4)  XE "binfilesactive" \f T : enable binfile based admin Contained in: Can contain: boolean value Default: true for clients (false for server) This can be set to false to disable the binfile admin data handling, and use admin storage implemented as SQL tables or in a plugin (like textdb). This can make sense when using the engine as client and server for the same database. Disabling the binfiles layer makes the engine behave like the command line client products (where remote server URL, login etc. is all defined in the XML config (see  REF _Ref90895148 \r \h 16).  XE "crcchangedetection" \f T : enable CRC based change detection Contained in: Can contain: boolean value Default: false This can be set to true to make the SyncML engine detect changes by calculating CRC checksums of all records. If this option is enabled, the underlying database (SQL or plugin) does not need to have a reliable last-change date. The engine will always query all records from the database before each sync to calculate CRCs, which then are compared with stored CRCs to detect changes.  XE "client" \f T : Command line client-only configuration tags Contained in: of a command line Synthesis SyncML client or Synthesis SyncML engine library with set to false (see  REF _Ref247361078 \r \h 15.2). Can contain: tags described in this chapter (see also  REF _Ref47164079 \r \h 11,  REF _Ref47164085 \r \h 12 and  REF _Ref135023442 \r \h 14 for settings not specific to command line clients) Attributes: type (see  REF _Ref47164079 \r \h 11 for details)  XE "defaultsyncmlversion" \f T : Set default SyncML Version to start a session Contained in: Can contain: SyncML version string, currently "1.0", "1.1" or "1.2" Default: Higest version supported by client. This specifies the SyncML version that is used in the first attempt to contact a SyncML server. By default, this is the highest version supported by the client (1.2 at this time). When session initialisation fails with a SyncML version, the client automatically re-tries with the next lower SyncML version. Only if you e.g. want to prevent attempts for SyncML 1.2 or 1.1 completely, this can be set to 1.1 or 1.0, resp.  XE "defaultauth" \f T : Set default auth method Contained in: Can contain: SyncML auth method: "none", "basic", "md5" Default: "none". This specifies the SyncML auth method that is used in the first attempt to login with a SyncML server. When login fails, the server will return a challenge for the required auth method, and the client will login according to that challenge. Another setting than "none" should be used only for special testing situations. In particular, using "basic" comprises a security risk as this means the client will send credentials in decodable form.  XE "defaultauthencoding" \f T : Set default auth encoding Contained in: Can contain: SyncML encoding: "chr", "bin", "b64" Default: "chr". This specifies the encoding for the SyncML auth credentials that is used in the first attempt to login with a SyncML server. When login fails, the server will return a challenge for the required auth encoding, and the client will login according to that challenge. This setting should be changed only for special testing situations.  XE "defaultauthnonce" \f T : Set default nonce Contained in: Can contain: nonce to use for first MD5 login attempt Default: "chr". This is relevant only if is set to "md5". Then the specified string will be used as nonce for the MD5 login attempt. In normal use, the nonce is always sent by the server in the challenge, and is not known in advance. Therefor, this setting is useful only for special testing situations.  XE "newsessionforretry" \f T : Use a new sessionID for retries Contained in: Can contain: boolean value Default: true If this is set, retries (due to auth failure) are done with a completely new SyncML session (different session ID). If this is set to no, the retry is done with the same session ID as the initial attempt (so it looks like continuing the session). Only some special testing tools may require this.  XE "originaluriforretry" \f T : Use original URI for retry Contained in: Can contain: boolean value Default: true If this is set, retries (due to auth failure) are done to the original URI as specified in the (see  REF _Ref153889197 \r \h 16.12). If this is set to no, the retry is done with the URI returned by the server in the element. Only some special testing tools may require this.  XE "smartauthretry" \f T : Use smart retry attempt variations Contained in: Can contain: boolean value Default: true If this is set, after doing the regular retries in the way configured with (see  REF _Ref232415540 \r \h 16.5) and (see  REF _Ref232415549 \r \h 16.6), the client also does some more retry attempts with varied behaviour. In particular, is inverted for the additional retries, and will be set to the same (inverted) value of . Future versions might add more elaborate retry attempts when is set. Note that this helps to get authorized with servers that have problem with either type of retry (in-session or fresh-session).  XE "putdevinfatslowsync" \f T : Always send Device Info at Slowsync Contained in: Can contain: boolean value Default: true If set to true, the client will always send it's Device Info (DevInf) to the server when a slow sync is performed. If set to false, the client will send the DevInf only in the first sync session with a server or when explicitly requested by the server.  XE "localdbuser" \f T ,  XE "localdbpassword" \f T : Login to local database Contained in: Can contain: user, password Default: none This information is used to login the client locally with the database. This is needed because the SyncML client can connect to a multi-user-database, but will usually synchronize only one user's data in a given sync session. These tags are required to specify which user's data the sync session operates on.  XE "nolocaldblogin" \f T : Prevent local DB login Contained in: Can contain: boolean value Default: false If set to false, the client will not perform the login steps to the local database. This can be useful when the underlying database is a single-user database. Note that the sample database layouts delivered with the Synthesis SyncML client are designed for multiple users and therefore need local login.  XE "syncmlencoding" \f T : SyncML encoding format Contained in: Can contain: "xml" or "wbxml" Default: "xml" This can be used to select either the plain text (but bandwidth wasting) XML format or the much more efficient, but not human-readable binary WBXML format. For any application but server debugging, this should be set to WBXML.  XE "serverurl" \f T : Remote SyncML server URL Contained in: Can contain: URL Default: none This is the remote SyncML server's URL for use with command line clients which specify the server details in the configuration. For clients based on Synthesis SyncML client engine, the URL and other settings are specified in profile settings, not the config file. Still, this tag can be used to "hard-code" the server URL so the client can only be used for a specific server. All clients support http URLs, some clients also support the following special URLS: SSL-enabled clients also support URLs beginning with "https://" instead of "http://" OBEX-over-infrared enabled clients support the special "obex:irda" URL. OBEX-over-TCP enabled clients support the special "obex:xxxx" URL, where xxx is the name or IP address of the OBEX server.  XE "serveruser" \f T ,  XE "serverpassword" \f T : Login to remote SyncML server Contained in: Can contain: user, password Default: none Available in: command line based clients This information is used to login the client with the remote SyncML server.  XE "sockshost" \f T ,  XE "proxyhost" \f T : Proxy servers Contained in: Can contain: proxy server addresses Default: none Available in: command line based clients These can be used to specify a SOCKS or HTTP proxy server to be used.  XE "proxyuser" \f T ,  XE "proxypassword" \f T : Proxy auth Contained in: Can contain: proxy server user and password (if required) Default: none Available in: command line based clients These can be used to specify a SOCKS or HTTP proxy server to be used.  XE "transportuser" \f T ,  XE "transportpassword" \f T : Login to remote SyncML server Contained in: Can contain: user, password Default: none Available in: command line based clients This information is used for HTTP authentification if the server addressed by needs this.  XE "syncrequest" \f T : Request to sync a datastore Contained in: Can contain: , , , Attributes: datastore Default: none Available in: command line based clients This tag specifies a Sync request for one of the s (see  REF _Ref45367951 \r \h 11.34) available to the client. The "datastore" attribute must reference one of the s defined further up in the configuration file. Multiple tags are allowed to synchronize multiple datastores in a single session (however, each datastore may only be synced once per session).  XE "dbpath" \f T : path of remote server's datastore Contained in: Can contain: remote server db path string Default: empty Available in: command line based clients This tag specifies the path that is used to address the remote server's datastore that should be synchronized with the local datastore identfied by the "datastore" attribute in the enclosing . Usually, this is a simple string like "contact", "events", "emails" etc. But some server support structured paths like "contacts/private", "emails/office" or even CGI-style filtering like "contacts?LAST=Miller". If the server happens to be a Synthesis SyncML server, you can refer to  REF _Ref46896711 \r \h 7.4 to see what options are possible.  XE "syncmode" \f T : Synchronisation mode Contained in: Can contain: "twoway", "fromclient" or "fromserver" Default: "twoway" Available in: command line based clients This can be used to select between three basic sync modes: "twoway" means that changes made on the client are sent to the server and changes made to the server are sent to the client. "fromclient" means that only changes made to the client are sent to the server. Changes made on the server will be ignored. Sometimes called "update server only" mode. "fromserver" means that only changes made to the server are sent to the client. Changes made on the client will be ignored. Sometimes called "update client only" mode. Note: "fromclient" in conjunction with (see  REF _Ref90894483 \r \h 16.17.3) set to true will cause the server database to be completely overwritten with the contents of the client database (also called "refresh from client" or "reload server"). Likewise, "fromserver" in conjunction with set to true will cause the client database to be completely overwritten with the contents of the server database (also called "refresh from server" or "reload client"/"reload device").  XE "slowsync" \f T : Force a slow sync Contained in: Can contain: boolean value Default: automatically determined Available in: command line based clients This can be used to explicitly request a slow sync. Slow sync means that all data on the client and the server are exchanged. In a two-way slow sync, the result will be the union of all client and all server data. In a one-way (from server or from client) sync, the result is that either side (client or server) is totally overwritten with the data from the other side. See ( REF _Ref90894479 \r \h 16.17.2) for more information.  XE "localpathextension" \f T : local datastore options Contained in: Can contain: local db path extension Default: empty Available in: command line based clients This tag specifies extra information for addressing the local datastore. Usually, this is empty. But if your local database makes use of multiple folders per user (see description of our standard database layout for SyncML in the client or server installation manual delivered with the software), you can specify the folder here. Likewise, if your local datastores support filtering (see  REF _Ref46896711 \r \h 7.4), you can specify the required CGI to activate the filters here. Note that the same kind of options might be available at the remote server's side, but then they need to be specified as part of .  XE "recordfilter" \f T : define SyncML DS 1.2 record filter Contained in: Can contain: Filter expression Default: none Available in: command line based clients This tag can be used to specify a SyncML DS 1.2 exclusive filter expression (see  REF _Ref153291752 \r \h 7.4 for syntax and  REF _Ref46752884 \r \h 7 for general information about filters). This is relevant only for sync sessions with SyncML DS 1.2 capable servers.  XE "recordfilterinclusive" \f T : define inclusive SyncML DS 1.2 record filter Contained in: Can contain: Filter expression Default: none Available in: command line based clients This tag can be used to specify a SyncML DS 1.2 inclusive filter expression (see  REF _Ref153291752 \r \h 7.4 for syntax and  REF _Ref46752884 \r \h 7 for general information about filters). This is relevant only for sync sessions with SyncML DS 1.2 capable servers. List of built-in timezones Special names SYSTEM DATE FLOATING USERTIMEZONE Name east of UTC Afghanistan 4.5 AKST/AKDT -9 HNY/NAY -9 Alaskan -9 Arab 3 Arabian 4 Arabic 3 AST/ADT -4 HNA/HAA -4 Atlantic -4 AUS_Central 9.5 AUS_Eastern 10 Azerbaijan 4 Azores -1 Canada_Central -6 Cape_Verde -1 Caucasus 4 ACST/ACDT 9.5 Central_Australia 9.5 Central_America -6 Central_Asia 6 Central_Brazilian -4 CET/CEST 1 MEZ/MESZ 1 Central_Europe 1 Central_European 1 Central_Pacific 11 CST/CDT -6 HNC/HAC -6 Central -6 Central_Mexico -6 China 8 Dateline -12 East_Africa 3 AEST/AEDT 10 East_Australia 10 EET/EEST 2 East_Europe 2 East_South_America -3 EST/EDT -5 HNE/HAE -5 Eastern -5 Egypt 2 Ekaterinburg 5 Fiji 12 FLE 2 Georgian 3 GMT 0 Greenland -3 Greenwich 0 GTB 2 HAST/HADT -10 Hawaiian -10 India 5.5 Iran 3.5 Israel 2 Jordan 2 Korea 9 Mexico -6 Mexico_2 -7 Mid_Atlantic -2 Middle_East 2 Montevideo -3 MST/MDT -7 HNR/HAR -7 Mountain -7 Mountain_Mexico -7 Myanmar 6.5 North_Central_Asia 6 Namibia 2 Nepal 5.75 New_Zealand 12 NST/NDT -3.5 HNT/HAT -3.5 Newfoundland -3.5 North_Asia_East 8 North_Asia 7 Pacific_SA -4 PST/PDT -8 HNP/HAP -8 Pacific -8 Pacific_Mexico -8 Romance 1 Russian 3 SA_Eastern -3 SA_Pacific -5 SA_Western -4 Samoa -11 SE_Asia 7 Singapore 8 South_Africa 2 Sri_Lanka 5.5 Taipei 8 Tasmania 10 Tokyo 9 Tonga 13 US_Eastern -5 US_Mountain -7 Vladivostok 10 West_Australia 8 West_Central_Africa 1 WET/WEST 1 West_Europe 1 West_Asia 5 West_Pacific 10 Yakutsk 9 A 1 ACDT 10.5 ACST 9.5 ADT -3 AEDT 11 AEST 10 AKDT -8 AKST -9 AST -4 AWST 8 B 2 BST 1 C 3 CDT -5 CEST 2 CET 1 CST -6 CXT 7 D 4 E 5 EDT -4 EEST 3 EET 2 EST -5 F 6 G 7 H 8 HAA -3 HAC -5 HADT -9 HAE -4 HAP -7 HAR -6 HAST -10 HAT -1.5 HAY -8 HNA -4 HNC -6 HNE -5 HNP -8 HNR -7 HNT -2.5 HNY -9 I 9 IST 1 K 10 L 11 M 12 MDT -6 MESZ 2 MEZ 1 MST -7 N -1 NDT -1.5 NFT 11.5 NST -2.5 O -2 P -3 PDT -7 PST -8 Q -4 R -5 S -6 T -7 U -8 UTC 0 V -9 W -10 WEST 1 WET 0 WST 8 X -11 Y -12 Z 0 Error codes This section lists the error codes that can occur (normally visible in the logs or on the console). SyncML Status Codes These codes are defined by the SyncML standard. For details, see HYPERLINK "http://www.openmobilealliance.org/release_program/ds_v12.html" http://www.openmobilealliance.org/release_program/ds_v12.html. Note that this list is not complete, but only contains the codes that are important for the SyncML engine. 101 Server is busy (session limit reached, see  REF _Ref47451430 \r \h 8.2) 200 OK, successful operation 201 Item added 207 Conflict resolved with merge 208 Conflict resolved - client wins 209 Conflict resolved by duplicating item 210 Deleted without archive 211 Item not deleted 212 Authentication accepted for entire session 213 Chunked item accepted and buffered (this status is sent for each non-final part of a data item that has been split across multiple SyncML messages) 400 Bad request 401 Unauthorized (bad credentials) 403 Forbidden (e.g. attempt to write to a read-only database) 404 Object not found 405 Command not allowed 406 Optional feature not supported 407 Authentication required (no credentials found) 408 Timeout 409 Conflict, operation failed 410 Gone, requested object not here any more 412 Incomplete command 415 Unsupported media type or format 418 Object already exists 419 Conflict resolved with server data 420 Device full 500 Command failed 501 Command not implemented 503 Service unavailable 505 DTD version not supported 508 Slow sync required 509 Authentication required 510 Database error 511 Server error 512 Synchronisation failed 513 SyncML Version not supported 514 Cancelled Internal Error Codes 0 No error 10000..10999 These have the same meaning as the SyncML Status Codes (see  REF _Ref47451048 \r \h 18.1), but they are offset by 10000 to make clear that they were generated internally, and not sent or received via SyncML. 20001 Bad or unknown transport protocol 20002 Fatal problem with SyncML encoder/decoder 20003 Cannot open communication 20004 Cannot send data 20005 Cannot receive data 20006 Bad content type (message received with an unknown MIME-type) 20007 Error processing incoming SyncML message (for example invalid XML or WBXML formatting) 20008 Cannot close communication 20009 Transport layer authorisation (e.g. HTTP auth) failed 20010 Error parsing XML config file 20011 Error reading config file 20012 No configuration found at all, or not enough for requested operation (client) 20013 Config file could not be found 20014 License expired or no license found 20015 Internal fatal error 20016 Bad handle 20017 Session aborted by user 20018 Invalid license 20019 Limited trial version 20020 Connection timeout 20021 Connection SSL certificate expired 20022 Connection SSL certificate invalid 20023 incomplete sync session (some datastores failed, some completed) 20025 Out of memory 20026 Connection impossible (e.g. no network available) 20027 Establishing connection failed (e.g. network layer login failure) 20028 element is already installed 20029 this build is too new for this license (need upgrading license) 20030 function not implemented 20031 this license code is valid, but not for this product (e.g. STD license used in PRO product, or client license in server product) 20032 Explicitly suspended by user 20033 this build is too old for this SDK/plugin 20034 unknown subsystem 20036 local datastore not ready 20037 session should be restarted from scratch 20038 internal pipe communication problem 20039 buffer too small for requested value 20040 value truncated to fit into field 20041 bad parameter 20042 out of range 20043 external transport failure (no details known in engine) 20044 class not registered 20500..20599 These represent SIG_xxx codes in Linux versions of the SyncML engine. Unexpected SIG_xxx will generate a error code of 20500+signal_code. 20998 Internal unkown exception 20999 Unknown error 21000...21999 Database plugin module specific error codes Index Alphabetic Index of all config XML tags  INDEX \c "3" \f "T" abortonallitemsfailed 110 acceptfilter 121 acceptserveralerted 111 adminreadyscript 127 afterconnectscript 157 afterreadscript 138 alertprepscript 128 alertscript 127 allowempty 89 allowmessageretries 147 alwaysclean 182 alwayssendlocalid 119 appendtoexisting 61 array 179 attachmentcountfield 90 attachmentmimetypesfield 90 attachmentnamesfield 90 attachmentsfield 90 attachmentsizesfield 90 autoenddateinclusive 109, 149 automap 137 autononce 104 beforewritescript 139 bigendian 94 binaryparts 93 binfilesactive 189 binfilespath 189 bodycountfield 90 bodymimetypesfield 90 bufferretryanswer 69 cleartextpw 159 client 101, 189, 191 client type= 151 client type=odbc 151 client type=plugin 171, 184 client type=textdb 183 commititems 173 comparescript 98 completefromclientonly 147 configdate 65 configidstring 54 configvar 55 conflictstrategy 119 constantnonce 104 contains 142 crcchangedetection 189 customendputscript 106 customgethandlerscript 107 customgetputscript 106 customputresulthandlerscript 108 datacharset 131 datalineends 131 datasource 155 datastore 115 datastore type= 164 datastore type=odbc 164 datastore type=plugin 185 datastoreinitscript 123, 126 datatimezone 130 datatype 91 datatypes 72 dbcanfilter 172 dbconnectionstring 156 dbpass 157 dbpath 195 dbtimeout 157 dbtypeid 116 dbuser 156 debug 56 debugchunkmaxsize 109 defaultauth 191 defaultauthencoding 191 defaultauthnonce 192 defaultsyncmlversion 191 definetimezone 66 deletearraysql 182 deletedatasql 175 deletemapsql 169 deletewins 117 deletinggoneok 109 descriptivename 144 determineidonce 176 deviceid 144 devicetype 144 disable 57 dispatchfilter 142 displayname 117 ds12filters 121 dscgiindevinf 146 dspathindevinf 146 earlycommit 173 enable 57 enum 81 enumdefaultpropparams 111 externalurl 103 field 73 fieldlist 73 fieldmap 134 fileprefix 62 filesuffix 62 filterinitscript 95 filterscript 95 finalisationscript 140 finalrule 143 finishscript 141 firmware 143 firsttimestrategy 119 folderkeysql 164 folding 59 forcelocaltime 147 forceutc 148 fromremoteonlysupport 132 function 55 getdevicesql 160 globallogs 65 guidprefix 142 hardware 143 headertag 89 httpport 70 ignoreaffectedcount 175 ignoredevinfmaxsize 146 incomingscript 95 indentstring 63 inheader 89 initscript 94, 137 inputcharset 149 insertdatasql 175 insertelementsql 182 insertmapsql 169 insertreturnsid 176 invisiblefilter 122 ipaddress 70 keepconnection 68 lastmodfieldtype 169 legacymode 149 lenientmode 149 licensecode 53 licensename 53 limitedfieldlengths 144 linemap 88 localdbfilter 122 localdbpassword 193 localdbuser 193 localidscript 176 localpathextension 196 logenabled 112 logfile 111 logflushmode 61 logformat 59, 112 logincheckscript 162 loginfinishscript 114 logininitscript 114 loglabels 114 logpath 57 logsessionstoglobal 65 looptimeout 56 macro 56 makepassfilter 123 makevisiblefilter 123 manufacturer 54, 143 map 134, 178 maxattachments 90 maxconcurrentsessions 53 maxitemspermessage 118 maxmsgsize 53 maxobjsize 54 maxrepeat 181 maxsessionruns 71 maxsyncmlversion 101 maxthreads 71 md5hex 159 md5userpass 159 mergescript 99 mimedirmode 99 mimemail 90 mimeprofile 75 minnextid 176 minsyncmlversion 101 model 54, 143 modtimestamp 173 msgdump 64 multicursor 173 multithread 105 neverputdevinf 66 newdevicesql 160 newsessionforretry 192 nocontentfolding 148 noemptyproperties 145 noitemsfilter 181 nolocaldblogin 193 noreplaceinslowsync 146 numlines 88 obexservice 70 obtainidafterinsert 176 obtainlocalidsql 176 oem 143 optionfilterscript 127, 182 originaluriforretry 192 outgoingscript 95 outputcharset 149 parameter 82 plugin_debugflags 186 plugin_deviceadmin 185 plugin_module 184, 186, 187, 188 plugin_moduleadmin 186 plugin_params 185, 186 plugin_paramsadmin 186 plugin_sessionauth 185 position 84 preventconnectattrs 157 processitemscript 97 profile 76 property 77 protocol 69 proxyhost 194 proxypassword 194 proxyuser 194 putdevinfatslowsync 193 quotingmode 172 readonly 117 receiveditemstatusscript 106, 129 recordfilter 197 recordfilterinclusive 197 rejectstatus 150 remoterule 143 repeatinc 181 reportupdates 118 requestedauth 103 requestmaxtime 102, 150 requestmintime 102 requiredauth 103 resendfailing 129 respurionlywhendifferent 104 resumeitemsupport 133 resumesupport 133 rulescript 150 saveinfosql 160 savenoncesql 160 scripting 55 selectarraysql 182 selectdatasql 174 selectidandmodifiedsql 174 selectmapallsql 169 sendrespuri 104 sentitemstatusscript 106, 128 server 101, 189 server type= 151 server type=odbc 151 server type=plugin 184 server type=textdb 183 serverpassword 194 serverurl 194 serveruser 194 sessioninitscript 105 sessionlogs 64, 65 sessiontimeout 102 showctcapproperties 110 showthreadid 60 showtypesizeinctcap10 110 silentdiscard 122 simpleauthpw 105 simpleauthuser 105 singlegloballog 61 singlesessionlog 61 sizelimitfield 90 slowsync 196 slowsyncstrategy 119 smartauthretry 192 sockshost 194 software 143 specialidmode 176 sqlitebusytimeout 172 sqlitefile 171 storeempty 181 storelastsyncidentifier 133 storesyncidentifiers 133 subprofile 76 subthreadmode 62 superdatastore 141 syncmlencoding 193 syncmode 195 syncrequest 195 synctargetgetsql 165 synctargetnewsql 165 synctargetupdatesql 165 synctimestamp 169 synctimestampatend 132 systemtimezone 66 textauth 158 textmap 158 textpath 158 textprofile 88 timedsessionlognames 60 timestamp 60 timestampall 60 timestampsql 163 timestamputc 130, 163 timeutc 130 transactionmode 158 transport 68 transportpassword 195 transportuser 195 treataslocaltime 148 treatasutc 148 tryupdatedeleted 118 typestring 92 typesupport 120 unfloattimestamps 87 unicodedata 94 updateallfields 132 updateclientinslowsync 145 updatedatasql 175 updatemapsql 169 updateserverinslowsync 145 use 91, 120 userkeysql 161 usertimezone 109 userzoneoutput 130 value 79 valuetype 89 version 92 versionstring 92 vtimezonegenmode 87 waitforstatusofinterrupted 108 xmltranslate 63 zapdatasql 175 zipcompressionlevel 93 zippedbindata 93  Alphabetic Index of all built-in script functions INDEX \c "2" \f "F" ABORTDATASTORE 128 ABORTSESSION 43 ABS 43 ADDFILTER 124 ADDSTATICFILTER 124 ADDTARGETFILTER 124 ALERTCODE 125 ALLDAYCOUNT 39 APPEND 43 ARRAYINDEX 138 AUTHDEVICEID 114 AUTHOK 114 AUTHSTRING 114 AUTHTYPE 114 AUTHUSER 114 CHECKAUTH 115 COMPARE 43 COMPAREFIELDS 98 CONFLICTSTRATEGY 97 CONTAINS 43 CONVERTTOUSERZONE 42, 115 CONVERTTOZONE 42 DATEONLY 39 DAYUNITS 39 DBHANDLESOPTS 125 DBLITERAL 154 DBNAME 124 DBNOW 38 DBOPTIONS 124 DEBUGMESSAGE 42 DEBUGSHOWITEM 42 DEBUGSHOWVARS 42 DEFAULTSIZELIMIT 96, 125 DELETEWINS 97 DEVICEKEY 115 DURATION 39 ECHOITEM 97, 107, 108 ENDDATE 124 ENUMDEFAULTPROPPARAMS 44 EXPLODE 37 FIND 37 FIRSTTIMESYNC 125 FORCECONFLICT 97 FORCELOCALTIME 44 FORCEUTC 44 GETCGITARGETFILTER 123 GETDEBUGMASK 42 GETFILTER 124 GETTARGETFILTER 124 IGNOREUPDATE 98 ISAVAILABLE 43 ISDATEONLY 39 ISDURATION 39 ISFLOATING 41 ISRELATIVE 40 ITEMDATATYPE 45 ITEMTYPENAME 45 ITEMTYPEVERS 45 LASTKEY 138 LENGTH 37 LOCALDBNAME 124 LOCALID 97 LOCALIZEDASUTC 40 LOCALURI 44 LOCALZONEOFFSET 40 LOGSUBST 138 LOOSINGCHANGED 99 LOWERCASE 37 MAKE_RRULE 40 MAKEALLDAY 40 MAKEEMAILSPEC 37 mapredefine 134 MAXITEMCOUNT 125 MERGEFIELDS 99 MILLISECONDS 39 MONTHDAYS 39 NEWKEY 138 NOATTACHMENTS 125 NORMALIZED 37 NOW 38 NUMFORMAT 37 PARENTKEY 138 PARSE_RRULE 40 PARSEEMAILSPEC 37 POINTINTIME 39 PREVENTADD 98 RANDOM 43 RECURRENCE_COUNT 40 RECURRENCE_DATE 40 REGEX_FIND 38 REGEX_MATCH 38 REGEX_REPLACE 38 REGEX_SPLIT 38 REJECTITEM 97 RELATIVEASUTC 41 REMOTEDBNAME 124 REMOTEID 97 REMOTERULENAME 44 REQUESTMAXTIME 44 REQUESTMINTIME 44 RFIND 37 SECONDS 39 SESSIONVAR 44 SETALERTCODE 125 SETCONFLICTSTRATEGY 125 SETDBCONNECTSTRING 155 SETDBPASSWORD 155 SETDEBUGLOG 44 SETDEBUGMASK 43 SETDEBUGOPTIONS 43 SETDEFAULTSIZELIMIT 125 SETDEVICEKEY 115 SETDOMAIN 114 SETENDDATE 124 SETFILTER 124 SETFILTERALL 96 SETFLOATING 42 SETLOCALID 97 SETLOG 44 SETLOOSINGCHANGED 99 SETMAXITEMCOUNT 125 SETNOATTACHMENTS 125 SETREADONLY 44 SETRELATIVE 40 SETREMOTEID 97 SETSESSIONVAR 44 SETSIZELIMIT 96 SETSQLFILTER 138 SETSTARTDATE 124 SETSTATUS 128 SETTARGETFILTER 124 SETTIMEZONE 41 SETUSERKEY 115 SETUSERNAME 114 SETUSERTIMEZONE 42 SETWINNINGCHANGED 99 SETXMLTRANSLATE 43 SETZONEOFFSET 41 SHELLEXECUTE 44 SHOWCTCAPPROPERTIES 44 SIGN 43 SIZE 37 SLEEPMS 39 SLOWSYNC 125 SQLCOMMIT 155 SQLEXECUTE 154 SQLFETCHROW 155 SQLGETCOLUMN 155 SQLROLLBACK 155 STARTDATE 124 STATUS 128 STOPADDING 129 SUBSTR 37 SWAP 45 SYNCMLVERS 43 SYNCOP 97, 129 SYSTEMNOW 38 TIMEONLY 39 TIMEUNITS 39 TIMEZONE 41 TREATASLOCALTIME 45 TREATASUTC 45 TYPENAME 45 UNKNOWNDEVICE 115 UPDATECLIENTINSLOWSYNC 45 UPDATESERVEINSLOWSYNC 45 UPPERCASE 37 USERKEY 115 USERTIMEZONE 42 UTCASRELATIVE 41 VTIMEZONE 41 WEEKDAY 39 WINNINGCHANGED 99 WRITING 138 ZONEOFFSET 42  Page  PAGE 11 ©2002-2008 by Synthesis AG, Zürich, Switzerland – HYPERLINK "http://www.synthesis.ch/"www.synthesis.ch Page  PAGE 202 ©2002-2008 by Synthesis AG, Zürich, Switzerland – HYPERLINK "http://www.synthesis.ch/"www.synthesis.ch ()*+,-34|}¡¢£¤¥¦§¨ÆÇýþ de)*56\]^vw©ªÏÐÑúòúëúäáÜáÕÒÈÕÁÕÒ¸³°«°¨¨¨ú úú¨–‰€0JOJQJ^Jj0JOJQJU^J OJQJ^J0JjåƒUNHCJNHCJmH sH j‡§UmH sH  j,•CJUju”CJ(UCJ( jCJ(UCJ$NHCJ$ B*CJphÿ j»CJUjU jU,-|¦§©ªÆ  z{»+oñ4Ù- r Ê * Z e `ùôòòðôôôîððððîçäçÞäçääçîð„Ä^„Ä@&„Ä@&^„Ä$a$ Æ_¾$æÕäÖýý)*+o€½¾¿ïðñ-.4GŽÂÙôõ   + , . R b g r Ž ° ± ² È É Ù Ú   ( ëÞÕÞÒËÀ˲ÀÕÀÒ®¨®Ò®¨®ÒÀËšÀÕÀÒ®Ò®ÀËŒÀÕÀÀË~ÀÕjʇOJQJU^Jj‡OJQJU^Jj`†OJQJU^J 5CJNH5CJju…OJQJU^JjOJQJU^J OJQJ^JCJ0JOJQJ^Jj0JOJQJU^J'j „>*B*OJQJU^Jphÿ1( ) * B Y Z À Á p q ÇÈ&'oÃÄóô  '(23MNOQRú{|ìíÄÅòóKL™=>€ª«",-`aqrŒŽôñëñèèèèäÞäÖäËäÖäÖäÖäÀÖ·Öäèèèèèµ±µ±µ±µ±µ¬¬¬¤¬¬j‰U jU5NH55\mHnHuj‰5U\j“ˆ5U\j5U\ 5NH\5\NH 5CJ\CJjOJQJU^J?`mnoúû¤¥ßUV˜™"#,‘ºê"z±å@m¡Þýûûûûûûûûûûûûûûûöôôôòòðððôòò & F‘𛵶·¸¹ºÉÊäåæèéê !"XYZtuvxyz‘«¬­¯°±ÄÅßàáãäå :;<>?@LùôìôôùôäôôùÝôÕôôÇÝô¿ôôÇô·ôôªô¢ôôªôšôôªjøŒUj{ŒUOJQJaJmHnHsHjþ‹Uj‹U5OJQJaJmHnHsHj‹U mHnHsHj‡ŠUj ŠU jU OJQJaJé ê !!!! ! !!!"!!@!A!B!Y!Z!t!u!v!x!y!z!!!ª!«!¬!®!¯!°!¿!À!Ú!Û!Ü!Þ!ß!à!þ!ÿ!""""""9":"T"U"V"X"Y"Z"‚"ƒ""ž"Ÿ"¡"¢"úòúúäúÜúúÏúÇúúÏú¿úúÏú·úúäú¯úúÏú§úúÏúŸúúj€ Uj Uj†ŸUj ŸUjŒžUjžUOJQJaJmHnHsHj’U5OJQJaJmHnHsHjU jU>Ý !B!z!°!à!"Z"£"Ü"!#a#¥#á#$Q$}$»$ô$0%g%Å%&P&›&ó&>'…'Ô'/(ýûûûýûûýûûûûûûýùýýýýýýùýýýýýý¢"£"»"¼"Ö"×"Ø"Ú"Û"Ü"###### #!#@#A#[#\#]#_#`#a#„#…#Ÿ# #¡#£#¤#¥#À#Á#Û#Ü#Ý#ß#à#á#ø#ù#$$$$$$0$1$K$L$M$O$P$Q$\$]$w$x$y$ñìäìì×ìÏìì×ìÇìì×ì¿ìì×ì·ìì×ì¯ìì×ì§ììñìŸìjh¤Ujë£Ujn£Ujñ¢Ujt¢Uj÷¡Ujz¡UOJQJaJmHnHsHjý U jU5OJQJaJmHnHsH>y${$|$}$š$›$µ$¶$·$¹$º$»$Ó$Ô$î$ï$ð$ò$ó$ô$%%*%+%,%.%/%0%F%G%a%b%c%e%f%g%¤%¥%¿%À%Á%Ã%Ä%Å%æ%ç%&&&&&&/&0&J&K&L&N&O&P&z&{&•&–&—&™&úóúëúúÝúÕúúÝúÍúúÝúÅúúÝú½úúÝúµúúÝú­úúóú¥újP¨UjÓ§UjV§UjÙ¦Uj\¦UjߥUjb¥U5OJQJaJmHnHsHjå¤U OJQJaJ jUA™&š&›&Ò&Ó&í&î&ï&ñ&ò&ó&''8'9':'<'='>'d'e''€''ƒ'„'…'³'´'Î'Ï'Ð'Ò'Ó'Ô'(()(*(+(-(.(/(`(a({(|(}((€((°(±(Ë(Ì(Í(Ï(Ð(Ñ()))))) )!)P)Q)úìúäúúìúÜúúìúÔúúìúÌúúìúÄúúìú¼úúìú´úúìú¬úúìúj8¬Uj»«Uj>«UjÁªUjDªUjÇ©UjJ©UjͨU5OJQJaJmHnHsH jUD/((Ñ(!)q)»)ù)L**æ*"+n+¿+,k,Ã,)--ß-G.µ./b/³/0o0º01p1¼1ýýýýûûûýûûûûûûûûûûûûûûûûûûûýýQ)k)l)m)o)p)q)š)›)µ)¶)·)¹)º)»)Ø)Ù)ó)ô)õ)÷)ø)ù)+*,*F*G*H*J*K*L*o*p*Š*‹*Œ*Ž***Å*Æ*à*á*â*ä*å*æ*+++++ +!+"+M+N+h+i+j+l+m+n+÷òòäòÜòòÏòÇòòÏò¿òòÏò·òòäò¯òòÏò§òòÏòŸòòÏj °Uj£¯Uj&¯Uj©®Uj,®Uj¯­UOJQJaJmHnHsHj2­U5OJQJaJmHnHsH jUjµ¬U>n+ž+Ÿ+¹+º+»+½+¾+¿+û+ü+,,,,,,J,K,e,f,g,i,j,k,¢,£,½,¾,¿,Á,Â,Ã,- -#-$-%-'-(-)-n-o-‰-Š-‹--Ž--¾-¿-Ù-Ú-Û-Ý-Þ-ß-&.'.A.B.C.E.F.G.”.•.¯.úòúúåúÝúúåúÕúúåúÍúúåúÅúúåú½úúåúµúúåú­úúåúj´Uj‹³Uj³Uj‘²Uj²Uj—±Uj±UOJQJaJmHnHsHj°U jUC¯.°.±.³.´.µ.ô.õ.//////A/B/\/]/^/`/a/b/’/“/­/®/¯/±/²/³/à/á/û/ü/ý/ÿ/00N0O0i0j0k0m0n0o0™0š0´0µ0¶0¸0¹0º0ý0þ0111111O1P1j1k1÷òòåòÝòòåòÕòòåòÍòòåòÅòòåò½òòåòµòòåò­òòåò¥jm¸Ujð·Ujs·Ujö¶Ujy¶UjüµUjµUjµUOJQJaJmHnHsH jUj…´UAk1l1n1o1p1›1œ1¶1·1¸1º1»1¼1ó1ô1222222P2Q2k2l2m2o2p2q2¡2¢2¼2½2¾2À2Á2Â2ì2í233 3 3 3 3E3F3`3a3b3d3e3f33Ž3¨3©3ª3¬3­3®3ã3ä3þ3ÿ34úúìúäúúìúÜúúìúÔúúìúÌúúÅú½úúìúµúúìú­úúìú¥újU¼UjØ»Uj[»UjÞºU OJQJaJjaºUjä¹Ujg¹Ujê¸U5OJQJaJmHnHsH jUA¼12q2Â2 3f3®34J44ô4O5—5ã526ˆ6Ó6&7n7Ã78X8µ8 9h9Á9%:p:±:ü:ýýûýýýýýýýýûýýýùùùùùùùùùýùùùù4444)4*4D4E4F4H4I4J4o4p4Š4‹4Œ4Ž444Ó4Ô4î4ï4ð4ò4ó4ô4.5/5I5J5K5M5N5O5v5w5‘5’5“5•5–5—5Â5Ã5Ý5Þ5ß5á5â5ã566,6-6.6061626g6h6‚6ƒ6„6†6úìúäúúìúÜúúìúÔúúìúÌúúìúÄúú½úµúúìú­úúìú¥új=ÀUjÀ¿UjC¿U OJQJaJjƾUjI¾Uj̽UjO½UjÒ¼U5OJQJaJmHnHsH jUA†6‡6ˆ6²6³6Í6Î6Ï6Ñ6Ò6Ó677 7!7"7$7%7&7M7N7h7i7j7l7m7n7¢7£7½7¾7¿7Á7Â7Ã7ä7å7ÿ7888887888R8S8T8V8W8X8”8•8¯8°8±8³8´8µ8ê8ë899úìúäúú×úÏúú×úÇúú×ú¿úú×ú·úú×ú¯úú×ú§úú×úŸj%ÄUj¨ÃUj+ÃUj®ÂUj1ÂUj´ÁUj7ÁUOJQJaJmHnHsHjºÀU5OJQJaJmHnHsH jU>99 9 9 9G9H9b9c9d9f9g9h9 9¡9»9¼9½9¿9À9Á9::: :!:#:$:%:O:P:j:k:l:n:o:p::‘:«:¬:­:¯:°:±:Û:Ü:ö:÷:ø:ú:û:ü:';(;B;C;D;F;G;H;o;p;Š;úúíúåúúíúÝúúÏúÇúúíú¿úúíú·úúíú¯úúíú§úúíújÇUjÇUj–ÆUjÆUjœÅU5OJQJaJmHnHsHjÅUj¢ÄUOJQJaJmHnHsH jU?ü:H;;Ò;<<Û<8=®=>x>Ì>1?¢? @n@¿@ AVAAìAQBªBCPC¬C DWD¥D EýýýûýýýýýýýýýýýýýýûùûûûûûûûûûŠ;‹;Œ;Ž;;;±;²;Ì;Í;Î;Ð;Ñ;Ò;ü;ý;<<<<<<l<m<‡<ˆ<‰<‹<Œ<<º<»<Õ<Ö<×<Ù<Ú<Û<==2=3=4=6=7=8==Ž=¨=©=ª=¬=­=®=þ=ÿ=>>>>>>W>÷òòåòÝòòåòÕòòÇò¿òòåò·òòåò¯òòåò§òòåòŸòòåjxËUjûÊUj~ÊUjÊUj„ÉU5OJQJaJmHnHsHjÉUjŠÈUOJQJaJmHnHsH jUj ÈU>W>X>r>s>t>v>w>x>«>¬>Æ>Ç>È>Ê>Ë>Ì>??+?,?-?/?0?1??‚?œ??ž? ?¡?¢?ê?ë?@@@ @ @ @M@N@h@i@j@l@m@n@ž@Ÿ@¹@º@»@½@¾@¿@è@é@AAAAA A5A6APAúòúúåúÝúúåúÕúúåúÍúúåúÅúúåú½úúåúµúúåú­úúåúj`ÏUjãÎUjfÎUjéÍUjlÍUjïÌUjrÌUOJQJaJmHnHsHjõËU jUBPAQARATAUAVAmAnAˆA‰AŠAAŽAAÊAËAåAæAçAêAëAìA/B0BJBKBLBOBPBQBˆB‰B£B¤B¥B¨B©BªBáBâBüBýBþBCCC.C/CICJCKCNCOCPCŠC‹C¥C¦C§CªC«C÷òòåòÝòòÏòÇòòÀò¸òòÏò°òòÏò¨òòÏò òòÏò˜òòjHÓUjËÒUjNÒUjÑÑUjTÑU OJQJaJj×ÐU5OJQJaJmHnHsHjZÐUOJQJaJmHnHsH jUjÝÏU<«C¬CçCèCDDDDD D5D6DPDQDRDUDVDWDƒD„DžDŸD D£D¤D¥DëDìDEEE E E EFEGEaEbEcEfEgEhEœEE·E¸E¹E¼E½E¾EíEîEF F F FFFBFCF]F^F_FbFcFdFÁFÂFÜFñìäììñìÜììñìÔììñìÌììñìÄììñì¼ììñì´ììñì¬ììñìj0×Uj³ÖUj6ÖUj¹ÕUj<ÕUj¿ÔUjBÔUjÅÓU jU5OJQJaJmHnHsHD EhE¾EFdFãFfGÏGEH¦HöH\IÀIJzJÑJAKªK+L’LÜL&MoM¸M$NtNÉNOjO´OýýýýýýýýýýýýýýýýýýýýýýýýýûûûûÜFÝFÞFáFâFãFDGEG_G`GaGdGeGfG­G®GÈGÉGÊGÍGÎGÏG#H$H>H?H@HCHDHEH„H…HŸH H¡H¤H¥H¦HÔHÕHïHðHñHôHõHöH:I;IUIVIWIZI[I\IžIŸI¹IºI»I¾I¿IÀIóIôIJ÷òòäòÜòòäòÔòòäòÌòòäòÄòòäò¼òòäò´òòäò¬òòäòjÛUj›ÚUjÚUj¡ÙUj$ÙUj§ØUj*ØU5OJQJaJmHnHsH jUj­×U@JJJJJJXJYJsJtJuJxJyJzJ¯J°JÊJËJÌJÏJÐJÑJK K:K;K’O“O­O®O¯O²O³O´OãOäOþOÿOPPPP?P@PZP[P\P_P`PaP•P–P°P±P²PµP¶P·PQQ Q!Q"Q%Q&Q'Q{Q|Q–Q—Q˜Q›QœQQRR R!R"R%R&R'R[R\RvRwRxR{R|R}RœRR·RúòúúåúÝúúåúÕúúåúÍúúåúÅúúåú½úúåúµúúåú­úúåújÐæUjSæUjÖåUjYåUjÜäUj_äUjâãUOJQJaJmHnHsHjeãU jUB´OPaP·P'QQ'R}R¾RSrSÂS"TyTÎT UvUàUKVÁVWrWØWHXÀX"YƒYßY5ZZýýýýýýýýýýýýýýýýýýýýýýýýýýýýý·R¸R¹R¼R½R¾RõRöRSSSSSSPSQSkSlSmSpSqSrS S¡S»S¼S½SÀSÁSÂSTTTTT T!T"TWTXTrTsTtTwTxTyT¬T­TÇTÈTÉTÌTÍTÎTþTÿTUUUUU UTUUUoUpU÷òòåòÝòòåòÕòòåòÍòòåòÅòòåò½òòåòµòòåò­òòåò¥j5ëUj¸êUj;êUj¾éUjAéUjÄèUjGèUjÊçUOJQJaJmHnHsH jUjMçUApUqUtUuUvU¾U¿UÙUÚUÛUÞUßUàU)V*VDVEVFVIVJVKVŸV VºV»V¼V¿VÀVÁVúVûVWWWWWWPWQWkWlWmWpWqWrW¶W·WÑWÒWÓWÖW×WØW&X'XAXBXCXFXGXHXžXŸX¹XºX»X¾X¿XÀXúúíúåúúíúÝúúíúÕúúíúÍúúíúÅúúíú½úúíúµúúíú­úúíjïUj îUj#îUj¦íUj)íUj¬ìUj/ìUj²ëUOJQJaJmHnHsH jUDÀXYYYYY Y!Y"YaYbY|Y}Y~YY‚YƒY½Y¾YØYÙYÚYÝYÞYßYZZ.Z/Z0Z3Z4Z5Z{Z|Z–Z—Z˜Z›ZœZZäZåZÿZ[[[[[;[<[V[W[X[[[\[][§[¨[Â[Ã[Ä[Ç[È[É[ \\(\úòúúåúÝúúåúÕúúåúÍúúåúÅúúåú½úúåúµúúåú­úúåújóUjˆòUj òUjŽñUjñUj”ðUjðUOJQJaJmHnHsHjšïU jUCZ[][É[/\·\!]©] ^}^Ô^-_’_õ_O`¦`þ`\a¸ab\b’bèb$c}cÙcCd­de‘eýýýýýýýýûûûûûûûùýýýùýýýýýýýýý(\)\*\-\.\/\•\–\°\±\²\µ\¶\·\ÿ\]]]]] ]!]‡]ˆ]¢]£]¤]§]¨]©]ë]ì]^^^ ^ ^ ^[^\^v^w^x^{^|^}^²^³^Í^Î^Ï^Ò^Ó^Ô^ _ _&_'_(_+_,_-_p_q_‹_Œ_÷òòåòÝòòåòÕòòåòÍòòåòÅòòåò½òòåòµòòåò­òòåò¥jj÷UjíöUjpöUjóõUjvõUjùôUj|ôUjÿóUOJQJaJmHnHsH jUj‚óUAŒ___‘_’_Ó_Ô_î_ï_ð_ó_ô_õ_-`.`H`I`J`M`N`O`„`…`Ÿ` `¡`¤`¥`¦`Ü`Ý`÷`ø`ù`ü`ý`þ`:a;aUaVaWaZa[a\a–a—a±a²a³a¶a·a¸aáaâaüaýaþabbb:b;bUbúúíúåúúíúÝúúíúÕúúíúÍúú¿ú·úúíú¯úúíú§úúíújÕúUjXúUjÛùU5OJQJaJmHnHsHj^ùUjáøUjdøUjç÷UOJQJaJmHnHsH jU?UbVbWbZb[b\bpbqb‹bŒbbb‘b’bÆbÇbábâbãbæbçbèbccccc"c#c$c[c\cvcwcxc{c|c}c·c¸cÒcÓcÔc×cØcÙc!d"ddAdBdCd‹dŒd¦d§d¨d«d¬d­død÷òòäòÜòòÏòÇòòÏò¿òòÏò·òòÏò¯òòÏò§òòÏòŸòòÏj½þUj@þUjÃýUjFýUjÉüUjLüUOJQJaJmHnHsHjÏûU5OJQJaJmHnHsH jUjRûU>ødùdeeeeeeoepeŠe‹eŒeee‘eòeóe ffffff`faf{f|f}f€ff‚fÑfÒfìfífîfñfòfóf8g9gSgTgUgXgYgZg™gšg´gµg¶g¹gºg»ghh"h#h$h'h(h)hihjh„húòúúåúÝúúåúÕúúåúÍúúåúÅúúåú½úúåúµúúåú­úúåúj¥Uj(Uj«Uj.Uj±Uj4Uj·ÿUOJQJaJmHnHsHj:ÿU jUB‘ef‚fófZg»g)h‹håhMiªijkj¾jkvkûk;lˆlälLm›mæm/nŒnÔn8oyoìoApýýýýýýýýýýýýýýýûùýýýýùùùùùùùù„h…h†h‰hŠh‹hÃhÄhÞhßhàhãhähåh+i,iFiGiHiKiLiMiˆi‰i£i¤i¥i¨i©iªiãiäiþiÿijjjjIjJjdjejfjijjjkjœjj·j¸j¹j¼j½j¾jùjújkkkkkkTkUkokpk÷òòåòÝòòåòÕòòåòÍòòåòÅòòåò½òòåòµòòåò­òòåò¥j UjUjUj“UjUj™UjUjŸUOJQJaJmHnHsH jUj"UApkqktkukvkÙkÚkôkõkökùkúkûkll4l5l6l9l:l;lflgll‚lƒl†l‡lˆlÂlÃlÝlÞlßlâlãläl*m+mEmFmGmJmKmLmymzm”m•m–m™mšm›mÄmÅmßmàmámämåmæm nn(núúíúåúúÞúÖúúÈúÀúúíú¸úúíú°úúíú¨úúíú úúÈúju Ujø Uj{ UjþUjU5OJQJaJmHnHsHjU OJQJaJj‡UOJQJaJmHnHsH jU?(n)n*n-n.n/njnkn…n†n‡nŠn‹nŒn²n³nÍnÎnÏnÒnÓnÔnoo1o2o3o6o7o8oWoXorosotowoxoyoÊoËoåoæoçoêoëoìop p:p;p w w$w%w&w)w*w+wtwuwww‘w”w•w–wËwÌwæwçwèwëwìwíw.x/xIxJxKxNxOxPx‹xŒx¦x§x¨x«x¬x­xÝxÞxøxùxúxýxþxÿxJyKyeyfygyjykyly§y¨yÂyÃyÄyÇyÈyÉyýyþyzúòúúåúÝúúåúÕúúåúÍúúåúÅúúåú½úúåúµúúåú­úúåújUj˜UjUjžUj!Uj¤Uj'UOJQJaJmHnHsHjªU jUBzzzzzzƒz„zžzŸz z£z¤z¥zØzÙzózôzõzøzùzúzž{Ÿ{¹{º{»{¾{¿{À{ô{õ{||||||X|Y|s|t|u|x|y|z|É|Ê|ä|å|æ|é|ê|ë|"}#}=}>}?}B}C}D}—}˜}²}³}÷òòåòÝòòåòÕòòåòÍòòåòÅòòåò½òòåòµòòåò­òòåò¥jzUjýUj€UjUj†Uj UjŒUjUOJQJaJmHnHsH jUj’UAÀ{|z|ë|D}¹}~{~ò~m³ì*€h€¡€G€¹öe‚§‚ä‚(ƒgƒ­ƒ„”„è„ýýýýýýýûûùýýýýùýýýýóùýýùýûùù Æ ³}´}·}¸}¹}ð}ñ} ~ ~ ~~~~Y~Z~t~u~v~y~z~{~Ð~Ñ~ë~ì~í~ð~ñ~ò~KLfghklm‘’¬­®±²³ÊËåæçêëì€ €#€$€%€(€)€*€F€G€a€úúíúåúúíúÝúúíúÕúúÎúÆúúÎú¾úú°ú¨úúíú úúíújå!Ujh!U5OJQJaJmHnHsHjë Ujn U OJQJaJjñUjtUj÷UOJQJaJmHnHsH jU?a€b€c€f€g€h€€€€š€›€œ€Ÿ€ €¡€ä€å€ÿ€%&@ABEFG^_yz{~€—˜²³´·¸¹ÔÕïðñôõö)‚*‚C‚D‚^‚_‚`‚c‚d‚÷òòåòÝòòåòÕòòÇò¿òòåò·òòåò¯òòåò§òòååòŸòòjÍ%UjP%UjÓ$UjV$UjÙ#U5OJQJaJmHnHsHj\#Ujß"UOJQJaJmHnHsH jUjb"U>d‚e‚…‚†‚ ‚¡‚¢‚¥‚¦‚§‚‚Â݂ނ߂â‚ã‚䂃ƒ!ƒ"ƒ#ƒ&ƒ'ƒ(ƒEƒFƒ`ƒaƒbƒeƒfƒgƒ‹ƒŒƒ¦ƒ§ƒ¨ƒ«ƒ¬ƒ­ƒýƒþƒ„„„„„„r„s„„Ž„„’„“„”„ƄDŽá„óîæîîØîÐîîóîÈîîóîÀîîØî¸îîóî°îî©î¡îîØîj8)U OJQJaJj»(Uj>(UjÁ'UjD'UjÇ&U5OJQJaJmHnHsHjJ&U jUOJQJaJmHnHsH<á„â„ã„æ„ç„è„%…&…@…A…B…E…F…G……‚…œ……ž…¡…¢…£…î…ï… † † ††††<†=†W†X†Y†\†]†^†”†•†¯†°†±†´†µ†¶†á†â†ü†ý†þ†‡‡‡>‡?‡Y‡Z‡[‡^‡_‡`‡—‡˜‡²‡÷òòäòÜòòäòÔòòÍòÅòòäò½òòäòµòòäò­òòäò¥òòäòj -Uj£,Uj&,Uj©+Uj,+U OJQJaJj¯*Uj2*U5OJQJaJmHnHsH jUjµ)U@è„G…£…†^†¶†‡`‡¹‡ˆwˆØˆ)‰z‰È‰.Š~ŠÏŠ;‹Ž‹ä‹/ŒwŒÏŒ,œÝŽJކŽýûýýýýýýýýýýýýýýýýýùùùùùùûûýý²‡³‡´‡·‡¸‡¹‡ó‡ô‡ˆˆˆˆˆˆUˆVˆpˆqˆrˆuˆvˆwˆ¶ˆ·ˆÑˆÒˆÓˆÖˆ×ˆØˆ‰‰"‰#‰$‰'‰(‰)‰X‰Y‰s‰t‰u‰x‰y‰z‰¦‰§‰Á‰Â‰Ã‰Æ‰Ç‰È‰ Š Š'Š(Š)Š,Š-Š.Š\Š]ŠwŠ÷òòäòÜòòäòÔòòäòÌòòäòÄòòäò¼òòäò´òòäò¬òòäòj1Uj‹0Uj0Uj‘/Uj/Uj—.Uj.U5OJQJaJmHnHsH jUj-U@wŠxŠyŠ|Š}Š~Š­Š®ŠÈŠÉŠÊŠÍŠÎŠÏŠ‹‹4‹5‹6‹9‹:‹;‹l‹m‹‡‹ˆ‹‰‹Œ‹‹Ž‹Â‹Ã‹Ý‹Þ‹ß‹â‹ã‹ä‹ ŒŒ(Œ)Œ*Œ-Œ.Œ/ŒUŒVŒpŒqŒrŒuŒvŒwŒ­Œ®ŒÈŒÉŒÊŒÍŒÎŒÏŒ ÷òòäòÜòòäòÔòòäòÌòòäòÄòò·ò¯òò·ò§òò·òŸòò·jð4Ujs4Ujö3UOJQJaJmHnHsHjy3Ujü2Uj2Uj2U5OJQJaJmHnHsH jUj…1U> %&'*+,z{•–—š›œ»¼ÖרÛÜÝíîŽ Ž Ž ŽŽŽ(Ž)ŽCŽDŽEŽHŽIŽJŽdŽeŽŽ€ŽŽ„Ž…Ž†ŽŽ‘ޫެޭްޱ޲ŽßŽàŽúŽûŽüŽúòúúåúÝúúåúÕúúÎúÆúúÎú¾úú°ú¨úú°ú úúÎú˜újØ8Uj[8UjÞ7U5OJQJaJmHnHsHja7Ujä6U OJQJaJjg6Ujê5UOJQJaJmHnHsHjm5U jU<†Ž²Ž"Qÿ‘ï’"“2“6”~š‹š/œžÖŸ~ 5£>¤9¥™¥ñ¦v¨#©ñ©ýûù÷õðëëõéÞÞéÞÞÞÞÞÞÞÞÞÞÞÞ  ÆÐk„e^„e & F¸a & F¸üŽÿŽr‹Œ¥¦¶·¼½¿ÀÖ×çèPefg‘’­®ØÙŽ‘‘þ‘ÿ‘’ ’9’:’;’<’=’€’×’Ø’î’"“2“{“†“ ”úìÝØÒÇÒ¹ÒÇÒÇÒÇÒ«ÒÇ©ÇÒØú¡úžú››Øú“úú©©ØØ‡Ø5\mHsH5NHjú:UNH0JjO:U5jÒ95UmHsHjU95UmHsHj5UmHsH 5mHsHmHsHjOJQJUmHnHu5OJQJaJmHnHsH jU5 ””6”j”s”Ô”å”æ”•–M–N–k–V—W—p—q—r—s—t——€—¦—í—ü—ý—¤™¥™å™æ™ÿ™ššššššš0š1šAšBš`šaš|š‹š±š/œWœ01234ižjžƒžøóññíññíñèàèèÝÙÝÝÎȺÈÎÈÎÈÎȬÈÎñÎÈÈóÈó£ó—£ó£ó£ójî<UmHsHjUmHsHjq<5UmHsHjô;5UmHsH 5mHsHj5UmHsH5\NHjw;U jU5NH5mHsH5\mHsH:ƒž„ž…ž‹žŒžž¢ž¿žÀžÙžÚžÛžàžážþžÿžŸŸŸ Ÿ!ŸÖŸíŸ  , - . 6 7 Q R ~ ¤ ³¡´¡Ì¡Í¡Î¡Ø¡Ù¡k¢l¢…¢†¢‡¢¢Ž¢þ¢ÿ¢£££ £!£K£g£óêåêåßåêåÓêåêåêåÇêåêåßåêå»êåêå´åßåêå¨êåêåêåœêåêåêåêåêåßjW@UmHsHjÚ?UmHsHj_?UmHsH NHmHsHjâ>UmHsHje>UmHsHjè=UmHsH 5mHsHmHsHjUmHsHjk=UmHsH8g£‡£ˆ£¤¤.¤/¤0¤:¤;¤=¤T¤f¤Þ¤ß¤ø¤ù¤ú¤¥¥W¥u¥™¥£¥É¥Ë¥×¥ë¥E¦F¦W¦Y¦k¦m¦€¦„¦Æ¦É¦Î¦Ï¦ç¦è¦é¦í¦î¦ð¦ñ¦§w§|§}§–§—§˜§ž§Ÿ§ §»§¼§Û§ö§$¨P¨Q¨j¨k¨l¨r¨ýøðøøëåëÜëÐÜëÜëåëÎëëëëëëëÜëÂÜëÜëÎëÜë¶ÜëÜëýëëÜëªÜëjÆBUmHsHjIBUmHsHjÎAUmHsH5jQAUmHsHjUmHsH 5mHsHmHsHjÔ@U jUNHCr¨s¨u¨v¨ˆ¨¨Ÿ¨¨¨´¨Ã¨Ä¨Ï¨Ð¨Û¨Ü¨õ¨ö¨÷¨ú¨û¨©©©©©© ©#©:©ð©ñ©ªÛªÜªõªöª÷ªþªÿª««,«-«.«5«6«y«z«“«”«•«›«œ«Ÿ«À«æ«ç«¨¬©¬Á¬öñëñëñëñäñäñöñØöñöñöñÌöñöñëñëñöñÀöñöñöñ´öñöñöñ¨öñöñ ñäñöñ5\mHsHj7EUmHsHjºDUmHsHj=DUmHsHjÀCUmHsHjCCUmHsH NHmHsH 5mHsHmHsHjUmHsH;ñ©Ÿ«Œ­w®ä°c²—²…³¡³m¶¤¶¯¶ç¶I¸u¸v¸¡¸Â¸Ï¸Ð¸æ¸¹ ¹!¹B¹€¹¹ôôôôôòððôêáêáêêêêêêêêêêêêê  & F„l^„l„Å^„Å  ÆÐk„e^„eÁ¬Â¬Ã¬É¬Ê¬g­h­­‚­ƒ­‰­Š­Œ­©­½­w®‡®ê®ë®¯¯¯ ¯ ¯4¯5¯N¯O¯P¯S¯T¯°°°° °#°$°ä°ö°H±I±b±c±d±g±h±²²c²—²¡³Å³V´óêåêåêåÙêåêåÑËåËåêå¿êåêåêå³êåêåêå§êåêåËåêå›êåêå”ååÑŽ \mHsH NHmHsHj#HUmHsHj¦GUmHsHj)GUmHsHj¬FUmHsH 5mHsH5\mHsHj/FUmHsHmHsHjUmHsHj´EUmHsH5V´W´p´q´r´x´y´|´’µ“µL¶M¶l¶m¶£¶¤¶¯¶Ì¶Ó¶æ¶ç¶#·)·E·L·I¸Ð¸¹¹ ¹¹ ¹„¹™¹ž¹»¹¼¹Õ¹Ø¹ä¹ý¹^ºsºxº•º–º¯º²º¾º¿ºÀºq»r»õïáõïõïÞÞÖËÆÃ¼Æ¶Æ¶Æ³®§®Ÿ®³™®™‘™®™ˆ³™®™‘™®™ˆ™Æï0JpB*CJphÿ0Jp7CJNH 0Jp7CJ0Jp5CJ\ 0JpCJNH0JpCJCJ 5mHsH CJmHsH0JpmHsHCJOJQJmHsH5\mHsHNHj HU\mHsH \mHsHjU\mHsH4¹™¹Õ¹ì¹û¹ü¹ºZº[ºsº¯ºÀºr»¸¼²¾¿)¿o¿p¿q¿z¿À'À|À‚ÁùùùùùùùùùùùðååùðùãÝÛãÙãÔ & Fl Æ_¾$  ÆÐk„e^„e  & F„l^„l„Å^„År»€»»Ž»³»Á»¼¼¼¼4¼5¼6¼>¼?¼¼‘¼ª¼«¼¬¼´¼µ¼¸¼è¼¾‚¾±¾²¾¿¿)¿o¿q¿%Á)Á*Á€ÁQÄRĚģÅ\Æ]ÆiÇjÇqÇéÇÈ¦È­È®ÈÆÈÇÈÈÈÉÈÊÈòÉûÉ,Ê-ÊEÊFÊüùüôðôçôÛçôçôçôÏçôçôüÌôɾô·ôµ±µÌµÌ̵µ¬¤¬¬µ¬œj’JUjJU jU5NH5 CJmHsHCJOJQJmHsHCJNHjšIUmHsHjIUmHsHjUmHsH0J(5mHsH0J(5\=‚Á¤ÅêÇÈ|È}ÈÕÈÉzÉÏÉÐÉKÊLÊÆÊQË&̞̟Ì*ͶÍúúøöñìÞÞÞØìñìÊÊÊñ½¸a & Fn a & Fn„Å„;ý^„Å`„;ýa & Fm ÆhЄÐ^„Ð Æ_¾$ & Fm ÆhЄÐ^„Ða & Fma & F & FlFÊGÊHÊIÊ_ÊsÊyÊzʑʒʓʕʖÊöË÷ËÑÌâÌçÌèÌÍÍÍÍÍ Í Í#Í$Í%Í'Í(Í\ÍmÍsÍtÍŒÍÍŽÍ͖͑͗ͯͰͱͳʹÍ\ηÎÐ/Ð4ÐCÐXÐVњѤҥÒÓÓ/Ó0ÓÔËÕ?×@טؙØÙÙ6ÙXÙ›Ù¿ÙÓÙáÙ<ÚúúøúðúúíøúåúúúÝúúøúÕúúúÍúúøÉÇÉÇøíííÂííÂÂÂÂOJQJ\5\j÷LUj|LUjLUj†KUNHj KU5 jUL¶ÍYÐÑãÑäуӄÓÔÔ1ÔOÔPÔZÔuÔ€ÔÔšÔÃÔÒÔÓÔáÔ ÕÕÕ1ÕdÕpÕñìçåååååããããããããããããããããããa & Fpa & Foa & Fn ÆhЄÐ^„ÐpÕqÕÕ©Õ¹ÕºÕËÕÌÕ×ÖâÖ<Ø=ØËØÌØÙXÙ¿ÙDÚÛéÛÙÜ ÝFݦÞýýýýýýûûùûûûûêÛÛÌÌÌÌùûÇ & F: & F5„e„›þ¤<^„e`„›þ & F4„e„›þ¤<^„e`„›þ & F6„e„›þ¤<^„e`„›þ<ÚDÚ^ÚˆÚ?ÛeÛÎÛéÛFÝTݦ޶ރ߆ߨ߫ßÌßÐßüßà”à•àšààÍàÜàsáá¢á²áaâbâãžã ä ä$ä%ä&ä)ä*äÐäÑä¬å­åÆåÇåÈåËåÌåIæJæcædæeæhæiæïæðæWç½ç¿çÌçÍç7èGèRèUè¦è§èÀèÁèÂèÅèûûûûùùùùùùöùùóñööìäììöìÜìììÔììöÏÉÁÉñùì¹ìjéNU56mHsH 5mHsHmHsHjlNUjïMUjrMU jU60JpNH5OJQJI¦Þƒß¨ßÌßüßšàÍà=ásáëâãFã8ä~ä„åææ9çWçÏçÐçè èÉèÊèwéxé”êúôôôôôúòðîðúúúúðèîððððððððð Æ_¾$e„^„ & F:ÅèÆèé éUéVéoépéqétéuéôéê9ê:êZê[êtêuêvêyêzêðêñêŽëëÝëÞë÷ëøëùëüëýëìOìPìiìjìkìnìoì¯ì¿ìQíuíåí/î0îxîzî‚îÀîËî7ïDï ðð'ð(ð)ð,ð-ð0ð6ð¶ð·ðñññúøúðúúîëúãúúëøúÛúúÖÍÖÁÍÖÍÖ»ÖÖëÖøøøú³úúøëújZQU 6mHsHjÝPUmHsHjUmHsHmHsHj`PUjãOUNH6jfOU5 jUD”ê•êë‘ëììãìøì6íRíuívíyîzîÀî7ï0ð#ñqñºñò@ò™òÆòýòQó›óýýý÷õýðððõýýýààààààààààààà„ü „ ÷1$7$8$H$^„ü `„ ÷ & Fº Æ_¾$ññññ ñ#ñ0ñqñ~ñºñÇñòò@òLò™ò£òÆòÒòýò óQó^ó›ó¦óìó÷óEôQôô‹ô°ô¼ôCõDõèõôõfögö€öö‚ö…ö†öÐöÕö'÷(÷v÷…÷ˆ÷Ž÷»÷Ê÷ý÷ÿ÷Qø`ø¸úÆúÒúÕúûû¸û¹ûáû†ü™ü^þéÿøÿóô?QRÖÛì‹÷òòððððððððððððððíêòâòòðíàðàðàÜààíÙÔÐíðÌðð5NH5\mHsHCJ6]6jTRU0JpNH5 jUj×QUP›óìóEôô°ô¿õèõÏö‡÷ü÷šù»ùWûáûüHü†ü™üý‘ý¤ÿ½ÿäÿåÿ×ÂÔïïïïïíëéééíëëçççåëëëíëëééío„ü „ ÷1$7$8$H$^„ü `„ ÷‹ŒÝðòüýqrÔ‡ ëì      , ë  ‡ ¢   1 2 3 = > Á   ( s t  Ž  — ˜ Ý Þ ÷ ø ù   K L e f g o p ç þ …ýû÷ûýòìòãò×ãòãòìòÑòÑòãòÅãòãò¾òÑòãò²ãòãòãò¦ãòãòãòšãòãòìòjÃTUmHsHjFTUmHsHjÉSUmHsH NHmHsHjNSUmHsH 6mHsHjÑRUmHsHjUmHsH 5mHsHmHsH5\5NH<Ô‡ ç >+† Ï °Ù,ôÀ"¦#É%Ê%Ý%'€'Ð(Ñ(;)Q)†+‡+ýûûûûûùýûççççûûûýåýýýýýùýý & F9 Æḧ́ʄ›þ^„Ê`„›þo…›ÅÆßàáæç-./56bxÞß÷øùþÿ2349:>U£¹ÒèRhÒèmƒ•«+I1¦¼ $NOghistçèùôëôßëôëôëôÓëôëôùôëôÇëôëôëô»ëôëôµôùôùôùôùôùôùôµôùôùôùôëô©ëôëôëôj0WUmHsH 5mHsHjµVUmHsHj:VUmHsHj½UUmHsHj@UUmHsHjUmHsHmHsH 6mHsH?  :›±ãäýþÿg„†Ï×&'ÛÜ45NOPVW‰ÁÂÛÜÝßàâ &Œ¦§¨¬­°´Ùá,8qr‹óêåêåßåßåêåÓêåêåßåÏÍÉÍÉÍÂ͸ÂÍÂÍϰϥ°Ï°ÏÍÏ£ž–žž£££žjYU jU5j Y5U\j5U\j£XU\ jU\NH\\5\j&XUmHsH 6mHsHmHsHjUmHsHj«WUmHsH;‹Œ“”£¹ô y È É â ã ä è é 2!3!L!M!N!T!U!6"Y"Z"s"t"u"{"|"¿"Ý"##€##š#›#œ#¢#£#¥#¦#¸#¹#V$W$Û$Ü$‚%ƒ%œ%%ž%¤%¥%É%Ê%û&ü&Z'['s'÷òòðìêòâòòòÚòòêòÒòòêìêÎêÇê½ÇêÇêì»ð¸»ò°òò«¸òmHsHj‹\UNH5j\U\ jU\NH\j‘[Uj[Uj—ZU\5\6 jUjZU@s't'u'{'|' (¡(±)²)&*+*L*Q*º*Â*È*É*á*â*ã*æ*ç*X+Y+×+Ø+,,,,,¾,ü,X-Y-Ü-c.G0Ø0·2¸2Ï2Ð2Ñ2Õ2Ö2÷34B4[4º4Ñ4„6›6›7¬7µ7¹7â7ç788r8|8Æ8Ç8ÿ9 :E:F:W;X;©<º<â<ã<û<÷òòïïëééòáòòïòÙòÖòÑïÑÑòÉòòÇÄÇÇÇÇÇÇÇïéïïéò0Jp5j©^UOJQJ0Jjþ]Ujƒ]U66]NH jUj]UL‡+B,f,½,¾,Ë,á,î,ü,ý,Û-Ü-ò-+.<.R.c.d.m.µ.ô.;/[/F0G0[0b0c0v0ýûýýùùùùýýýùùùùùýûýôôûýýùùùù & Fv0x0›0À0Â0Ã0Ö0Ø0ä0Ý1Þ1&212²3Å3÷3º4á5ü56„6u7v7µ7â78r8ýýýýýýýûùùùûùûùôïáááïùùßßßa & F~ ÆhЄÐ^„Ð & F~ & F}r8Ñ9á9ü:ò;©<y=É>ï?ù?z@AAÐAâA?CbCC­CD D!DBDnD“D”DeGgGýûùôôôôôûùùùùòùðððððððððùêêc„^„ & F€aû<ü<ý<==%=&=™=£=->0>§>¨>¿>À>Á>Å>Æ>Õ>ñ>‡?¡?¦?§?¿?À?Á?Ç?È?X@Y@p@q@r@v@w@ë@ö@ü@ý@AAAAAöAþAGBHBVB^B¦B§BÀBÁBÂBÅBÆB?CâCãC“D¢D´DÀDÃDùDúDEE^E_EÂEÅE÷òòïííòåòòííòÝòòòÕòòíòÍòòíïíòÅòòÀ¹Àííïíïí NHOJQJOJQJj…aUj aUj‘`Uj`Uj_U6NH jUj"_UIÅE–F¥FG/G@GOGgGüGZH[HsHtHuHyHzH^D^H^O^Y^[^²^¼^M_Q`X`Öaæa@bIbIcYcecåcýùý÷÷÷ó÷÷÷ýýýðëãëëýùýùýà÷ó÷÷÷÷ýýëØëëýýùý÷ÓÎÎÈÎà 6mHsHmHsHOJQJjÜeU0Jpj_eU jUNH6NH6565OƒY÷[>^=_>_M_Z_d_i_n_o_Ž_¦_§_·_¼_Ã_Ö_ß_á_â_õ_` `:`Q`X`SaÖaýýýûûùùùùùùùùùùùùùùùùùùùù÷ûûbÖaæaIcYcæcôcldmdydšd­d¸dÅdÓdàdád÷dødee+e,eYefewe€e‹e¦e§eXfýûýûýûûùùùùùùùùùùùùùûûùùùùùûûåcæcôcád÷dõeöefffffÂfØf2gög÷g0h…h†hËhÌhiÂiÕiRj`j€jjÿj kikk„k™k¤k¸k¾k¿k×kØkÙkÞkßkynŒq@rYr§r¨rÀrÁrÂrÆrÇrÔrár’s“s«s¬s­s®s¯stútuûûòûéûÝéûéûòûÚÕÎÕÎÕÌÌÌÌÌÌÌÇ¿ÇÇսǵÇǽǭÇǨmHsHjÌgUjQgU5jÖfU jU6 NHOJQJOJQJNHjYfUmHsHjUmHsHOJQJmHsHmHsHBXfYfef†f¦f´fÁfÂfØfÙfæfõf#g1g2gŽþŽ`R‘ “¨“ ”•`–Å–F—ýýýýýýýýûùùùùýýýýûýýýýýýýýýýýd||8|=|i|q|ž|¦|©|­|Â|Ê|Ë|Ú|Û|è|ë|ô|û|} }.}/}8}@}D}H}N}T}€}‚}ƒ}ˆ}¯}·}º}¾}Ó}Ú}Û}ë}ì}~(~)~3~6~P~V~Y~\~m~r~x~y~~†~‡~œ~~¯~²~¼~Â~Ì~Ò~á~å~ë~ "(HOž¤Úà€€'€+€©€­€ú€þ€4;<Oýýýýýûóïóûëûëûëèýýýýäýýýûóïóûèýýýýèûóïóûëûëûëûëûýýýýýýýýýûóï6NHNH565j5U56ZOP_cfknŒ’¡¢ÏÓÕÝÞøù‚‚"‚&‚0‚5‚?‚C‚D‚H‚‡‚‹‚­‚²‚´‚»‚¼‚Õ‚Ö‚ë‚ï‚ø‚ý‚&ƒ*ƒ/ƒ5ƒ>ƒBƒ„ „w„x„††9†:†;†O†P†S†[†\†q†r†„†‹†”†›†§†ª†«†®†°†Ó†Û†߆æ†ÿ†‡‡‡m‡u‡÷õñõñõïìïõ÷è÷õñõñõñïäïïïõ÷è÷õñõñïïïïìß×ßÔßõ÷è÷õñõñõñÎñõïïïìï 56NH0JjÂhU jU6NH5NH6565j5UQu‡€‡ˆ‡ž‡¦‡§‡½‡¾‡ч؇á‡è‡ò‡ù‡ˆ ˆ ˆ/ˆ6ˆ>ˆEˆ^ˆeˆãˆêˆ‰‰Z‰a‰›‰¢‰ã‰ê‰%Š,ŠTŠ\Š]ŠsŠtŠ‡ŠŽŠ—Š§Š±Š¹Š¿ŠÀŠÅŠÒŠÔŠÝŠäŠóŠôŠ ‹‹0‹@‹L‹S‹X‹e‹¤‹¥‹Ó‹Û‹ŒŒŒ'Œ(Œ=ŒDŒMŒOŒPŒTŒ]ŒhŒtŒ{Œ‡ŒŒŒ¦Œ­ŒµŒ¼ŒýûóïóûëûëûëûëûýýýýèýýýýûóïóûëûëûëûäûëûýèýýýýèýûóïóûëûëÞëûëûëûëûýý 56NH5NHNH565j5U56X¼ŒÂŒÎŒêŒñŒõŒüŒ()TUv€Ž”ÝÞ>ŽHŽIŽXŽYŽ`Ž÷ŽøŽþŽ )`ast’ËÌ‘‘R‘\‘]‘o‘p‘ƒ‘…‘†‘¡‘£‘j’k’å’æ’ÿ’““““ “““*“+“>“@“A“\“^“¨“°“±“œƓۓݓޓô“ö“ ””ýýýýúúøðìðøúøðìðøúøðìðøðìðøúúøðìðøèøýúãÛããøðìðøèøÙÔÙøðìðøèøýø 6\]\juiU jU565j5U5NH6T””+”,”?”A”B”u”v”•••&•'•=•?•@•––F–G–`–h–i––€–•–—–˜–®–°–Ä–Í–Ζà–á–ó–õ–ö–——— —F—N—O—`—a—s—u—v—”—•—£—¥—Á—×ã—ä—˜ ˜ ˜!˜"˜9˜;˜<˜n˜p˜Œ˜Ž˜ŘƘ͘Õ˜Ö˜ê˜ë˜ý˜™™q™r™â™ê™ë™þ™ÿ™šššNšOš÷ó÷ñíñêñ÷ó÷ñíñêêñ÷ó÷ñíñèñ÷ó÷ñíñêèñ÷ó÷ñíñêèèêñ÷ó÷ñíñèèêñ÷ó÷ñíñêñ÷ó÷ñíñê6NH5655j5U\F—˜͘â™øša›BŸŒ¡¶£g¦¨¦ª±«¸¬«­>®/¯O°@±\±æ±=² ²³³à³_´ð´Aµýýýýýýýýýýýýýýýýýýûù÷÷÷÷÷÷÷÷sdOšøš››››*›.›/›U›Y›a›i›j›€››—›œ›¨›«›·›É›Õ›é›ì› œœœœœœæœçœ”™ž¡bžhžižwž¤ž¸žÙžížŸŸBŸCŸXŸYŸoŸtŸŸ„ŸŸ“Ÿ•Ÿ©ŸªŸ»ŸÀŸÅŸÉŸÿŸ   6 7 8 > ? E I { ~ ƒ ˆ « ¯ Ñ Õ ó ÷ ¡ýõñõýíýëýõñõýíýíýíýíýëëèèëëëäëëëèõñõýíýíýíýèëëèß×ßßëëëëëëjòiU jU6NHNH6565j5U5U¡ ¡q¡r¡Œ¡–¡—¡±¡²¡Ì¡Ñ¡Ú¡á¡ë¡ó¡ö¡÷¡ý¡¢ ¢¢¢*¢4¢9¢:¢T¢Y¢o¢p¢€¢¢¢¢¢Í¢Ò¢ô¢õ¢F£G£_£`£a£e£f£€£…£‡£Ž££˜£š£Ÿ£¤£©£¯£°£¶£¾£¿£Ú£Û£ö£û£¤ ¤¤¤"¤#¤'¤,¤6¤;¤E¤T¤`¤j¤k¤Ф•¤ͤܤ¥ž¥¶¥ýúøðìðøèøèøèøäøèøèøèøèøýúýýýúß×ßßýýýýýúøðìðøèøèøèøäøèøèøèøèøýýßjojU jU5NH565j5U5NH6U¶¥·¥¸¥¼¥½¥×¥Ü¥Þ¥å¥ç¥ë¥ì¥ï¥ñ¥ö¥û¥¦:¦>¦?¦C¦g¦n¦o¦…¦†¦™¦Ÿ¦¨¦¯¦¹¦Á¦˦ЦÓ¦Ô¦Ú¦ߦë¦ð¦ñ¦§§2§3§K§L§M§Q§R§l§q§s§z§|§„§†§Œ§§’§—§§­§³§¨'¨(¨>¨?¨S¨Y¨b¨g¨s¨x¨‚¨‰¨”¨œ¨§¨¬¨÷òòðððìððððìðêâÞâêÚêÚêÚêÚêÖêÚêÚêÓòËòòðððððððêâÞâêÚêÚêÚêÚêÚêÚjekUNH5NH565j5U56NH6 jUjêjUP¬¨·¨¼¨ɨΨϨ©©+©,©-©1©2©L©S©U©]©_©d©f©l©p©u©†©Œ©¢©£©È©Í©ô©õ©ªªqªvª¦ª®ª¯ªêĪÙªÛªܪÞªøª@«A«Z«[«\«_«`«m«n«±«²«Ç«È«ß«á«â«ä«þ«G¬H¬a¬b¬c¬f¬g¬¸¬¬ìÛ¬ܬõ¬÷¬ø¬ú¬­ýùýùýôìôôêêêêêêçêçêêýßÛßýùýØôÐôôçßÛßýùýØôÈôôýßÛßýùýØjØlUj[lU0Jp5j5UNH6jàkU jU565O­#­$­v­w­­‘­’­•­–­«­³­´­Í­έß­à­ì­í­ú­>®H®I®`®a®y®{®|®~®˜®ú®û®¯¯¯¯¯/¯0¯G¯H¯a¯c¯m¯w¯x¯z¯”¯˜¯™¯ݯÞ¯÷¯ø¯ù¯ü¯ý¯O°Y°Z°q°r°аŒ°°°©° ± ±%±&±'±*±+±\±ýøðøøîæâæîßÚßîæâæîÖîßøÎøøæâæîÖîÖîßýøÆøøîæâæîÖîßø¾øøjÌnUjOnUjÒmU560JpNH0Jp5j5U5jUmU jUNHJ\±‹±—±¶±·±d³e³~³³€³ƒ³„³4´5´®´¯´È´É´Ê´Ì´Í´aµpµ®µ¯µȵɵʵ̵͵G¶W¶X¶k¶l¶¶„¶…¶­¶²¶´¶»¶¼¶жѶå¶ê¶ë¶····9·:·P·Q·h·m·|·€··™·ž·Ø·Ý·Q¸Y¸Z¸ûõûîûåûÙåûåûîûåûÍåûåûõûåûÁåûåû¿·³·¿¯¿­¿·³·¿¯¿­ª·³·¿¯¿¯¿­­¿·NH6565j5U5jCpUmHsHjÆoUmHsHjIoUmHsHjUmHsH NHmHsH 6mHsHmHsHCAµBµµÙµ¶F¶G¶H¶´¶9·Q¸ì¸Ò¹•º¼°¾¿OÀcÀAÁÄ˜ÄÆìÆRÈʥ˵ËÌúúøøøöôôôôôôôôôôôòôôôôôôôôòôdss & FZ¸o¸p¸…¸‡¸ˆ¸ž¸ ¸øĸì¸í¸¹¹¹ ¹!¹F¹K¹¹†¹”¹™¹Ò¹Ù¹Ú¹ñ¹ò¹º*º+ºDºEºFºIºJº•º–º°º±ºκкѺl»m»†»‡»ˆ»‹»Œ»Ö»×»ð»ñ»ò»÷»ø»¼¼¼7¼8¼P¼U¼d¼h¼s¼v¼w¼|¼~¼ˆ¼¼£¼¤¼©¼­¼½ ½üôòîòìéôüôòîòìììòôüôòäÜääôüôòîòäÔäääÌääòôüôòîòîòîÆîòìéìì 56NHjºqUj=qUjÀpU jUNH6565j5U5N ½ø½¾¡¾¢¾°¾º¾»¾×¾ؾô¾ù¾¿¿¿ ¿¿6¿;¿I¿R¿a¿f¿¿˜¿™¿­¿®¿ÿſƿÀÀ ÀÀcÀdÀzÀ{ÀÀ–À—À À§ÀÌÀÍÀÁÁ*Á+Á,Á2Á3Á9Á:ÁAÁBÁ[Á\ÁrÁyÁzÁ¯Á°ÁßÁàÁøÁùÁúÁÿÁ¿ÂÀÂØÂÙÂÚÂàÂáÂ2ÃýúøðìðøèøèâèøýýýøðìðøèøýýðìðøèøýúÝÕÝÝúðìðøèøúÝÍÝÝÝÅÝÝj-sUj²rUj7rU jU 56NH565j5U5NH6N2Ã3ÃLÃMÃNÃUÃVÃaÃbÃcÃhõöÃÄÄÄÄ,ĘĠġĸĹÄÈÄàÄáÄaÅbÅzÅ{Å|Å€ÅÅ­Å®Å ÆÆÆÆ-Æ.ÆCÆGÆIÆÆ‚ÆÉÆÊÆìÆíÆÇÇÇ)Ç-Ç.Ç3Ç9Ç;ÇiÇoÇǓǬǭǿÇÀÇØÇÙÇÚÇàÇáÇFÈKÈLÈPÈúòúúðìðéáÝáÛÛáÝáÛéúÓúúééáÝáÛÏÛééáÝáÛÏÛËÛÏÛÇðéú¿úúðìðj tU6]5NH56j%tU55j5UNH6NH6j¨sU jUKPÈRÈSÈmÈnȆȌȎÈ=É>ÉVÉWÉXÉ]É^ɸɹÉÒÉÓÉÔÉÛÉÜÉÊÊÊÊ2Ê8Ê:ÊÇÊÈÊÙÊÚÊòÊóÊôÊùÊúÊ[Ë\ËuËvËwË~Ë˵˽˾ËÍËÎËÚËßËàËúËÿËÌ Ì ÌÌÌ(Ì-Ì.ÌDÌIÌYÌ^ÌjÌoÌ|ÌÌ…Ì̵̡̠̰̎Ì÷ó÷ñíñèàèèèØèè÷ó÷ñíñÕèÍèèèÅèèñ÷ó÷ñíñÃñ÷ó÷ñíñÃÃÃÃñ÷ó÷ñí6jŽvUjvUNHj–uUjuU jU5655j5UMÌ…Ì9ÍÎÛÎ…ÏèÐØÑfÕrÖz×HØÙÑÙÚñÚåÛ3ÝžÝÞÒàNáåbåIæ,çèÂèé,êýýýýýýýýýýýýýýýýýýýýýýýýýýýýýdµÌÁÌÅÌÇÌÕÌÖÌïÌôÌÍ Í8Í9Í@ÍAÍWÍXÍfÍÎÎ-Î.ÎCÎMÎNÎw΂δξÎÒÎÓÎÛÎãÎäÎõÎöÎþÎÏÏ Ï ÏÏ"Ï*Ï0Ï8Ï>ÏAÏGÏNÏTÏWÏ]Ï…ÏώϣϤϹϾÏÇÏÑÏÒÏÖÏØÏîÏóÏÐ Ð#Ð(Ð;ÐCÐPÐUÐqÐvÐИХЪЫдÐßÐàÐèÐéÐüÐýùýöôôïýçãçýçãçýùýôôöýçãçýùýùýôôôôôôýçãçýùýùÝùýôôôôôôôôÙôöçã6NH 56NH5j5UmHsH6NH565VüÐýÐÑÑÑ Ñ%Ñ9Ñ<Ñ=ÑAÑFÑOхъѨѮÑÃÑËÑØÑàÑáÑøÑùÑÒ Ò ÒÒÒNÒOÒgÒhÒiÒmÒnÒÙÓÞÓýÓÔVÔWÔªÔ«ÔÄÔÅÔÆÔÌÔÍÔãÔäÔfÕgÕÕ‚Õ™Õ Õ£Õ©ÕªÕ&Ö'ÖDÖEÖ]Ö^Ö_ÖcÖdÖjÖkÖrÖsÖÖŽÖ¥Ö¬Ö¯ÖþÖ÷õñõïïëïïïïïõ÷ç÷õñõïâÚââïï×âÏââ×÷ç÷õñõ××âÇââ×÷ç÷õñõjxUj†wUNHj wU jU56NH6565j5UNþÖ×:×;×V×W×p×q×r×v×w×z×{וז׭׶׹׿×ÀרØ"Ø#Ø;Ø<Ø=ØEØFØHØIØ^Ø_ØpØyØ|ظعØߨàØøØùØúØÙÙÙÙ%Ù&ÙBÙKÙNÙwÙxÙ–Ù—Ù¬Ù­ÙÆÙÇÙÈÙÍÙÎÙÑÙÒÙóÙôÙÚýúõíõõåáåßÛßúúõÓõõåáåßÛßúõËõõåáåßÛßúúõÃõõ¹´¹°5\ 5\j5U\jñyUjvyUjûxU5655j5Uj~xU jUNH6CÚÚÚڈډڛڜڥÚñÚøÚùÚÛÛ"ÛUÛVÛnÛoÛpÛuÛvÛËÛÌÛåÛæÛûÛüÛÜÜÜÜ&ܾܽÜÖÜ×ÜØÜßÜàÜõÜöÜ ÝÝ&Ý'Ý(Ý0Ý1Ý3Ý4ÝIÝJÝ^ÝeÝfÝžÝŸÝ¯Ý°Ý¿ÝÆÝÇÝÞÞ Þ4Þ5ÞGÞNÞQÞƒÞ‹Þ»Þ¼ÞÞÞùõóñéåéññéåéñàØààÕéåéñÑñÏàÇààÕà¿ààéåéñÑñéåéñÑññéåéñÑñÏÕjd{UjézU656NHjnzU jU5j5U5\5\ 56\]KÞÞßÞ÷ÞøÞùÞþÞÿÞ/ß0ßHßIßJßOßP߾߿ßààiàjà¡à¨àÉàÊàÒàÓàêàëàáááá$áEáLáNáVáWáoápá„á‹á”ášá¤á²á´áçáîáââ ââââ„âËâÒâÓâ4ã;ãJãKãƒãŠãÀãÿãää?ä@äYäZä[ä\ä]ä¾äúòúúúêúúçççåçÝÙÝ×Ó×åå×ÝÙÝ×Ó×Ó×Ó×åååÏå×çåÌå×È×úÀúújÕ|U5NHNH6NH5655j5U6NHjZ|Ujß{U jUL¾ä¿äååååå%å'å0å1åIåRåWå`åbåcå…å†å¥å®å±åææ$æ%æ=æ>æ?æFæGæIæJækælæŠæ“æ–æçç ç!ç"ç)ç*ç,ç-çIçJçcçlçoçÚçÛçóçôçõçýçþçèèèè+è4è7èœèèµè¶è·è¿èÀèÂèÉèÊèÜèÝèýõñõïëïëïééõñõïëïýäÜääõñõïëïäÔääõñõïëïäÌääõñõïëïäÄääïõñõjÃ~UjH~UjÍ}UjR}U jU65655j5UNHMÝèæèëèìèééééé6é7éFé ê ê$ê%ê&ê*ê+ê,ê3ê4êMêNê]ê$ë%ë>ë?ë@ëFëGëˆë‰ë¢ë£ë¤ë¨ë©ë«ë²ë³ëÌëÍëÜë®ì¯ìÈìÉìÊìÐìÑìöì÷ìíí,í-í.í2í3ítí{í¢í£í»í¼í½íÃíÄínîýùý÷ýïëïýæÞææýïëïýæÖæææÎææýïëïýæÆææÃæ»ææ÷æ³ææj¯Uj2UNHjµ€Uj8€Uj»Uj>U jU5j5U6565F,ê«ë5íGí~ððññóófônô¡ôÃöl÷HøÔøúûÒüÓüŠý‹ýáÿâÿ+,ýýûùùóùùùùñùïääïääïßßßßßßßa & F a ÆhЄÐ^„Ða Æ_¾$dnîzî;ï<ï‚ï¬ï­ïµïûïüï‰ððxñyñóŸó9ô:ôSôTôUôWôXô¡ô«ô­ô¸ôÌôùôúô-õ5õ?õGõ}õ†õ“õ¶õöö÷$÷k÷ž÷¯÷%ø&ø?ø@øAøDøEøHøOøPøYøløðø ùiújú‘ú’ú«ú¬ú­ú°ú±úûûHûrûsû×üáü”ý›ýýúöðöúýúöëãëëßÝßÝúýýýýýÙ×ýëÏëëßÝÊÝÙúëÂëëßÝúýýj$ƒU 56]j§‚U]6]556j*‚U jU 5NH\5\NH6L›ý©ý³ý0þ8þyþ€þ5ÿ<ÿ ÿ¡ÿ»ÿ¼ÿÔÿÕÿÖÿÝÿÞÿäÿëÿ¹Àçè  ƒ/=]u‚ƒ›œ ¡tu²¼ÓÔêòõûUfƒŽ›§ºËÍÞ ) 7 I j t ƒ – ¥ ® ± ½ ® ¯ È É Ê Í ýýýýúõíõõýýúýõåõõããýõÛõõúýúýýýýýýýýýýýýýõÓõj…Uj—„U5j„Uj¡ƒU jUNH6S,6Oƒ/SÍ ¯ Ð ¼ šï-01AKÐÚk€*úøöëëøöéééééÞÞÞéúúÜÚÜÚÜÚÜc a ÆhЄÐ^„Ða a Æh¤„¤^„¤a & FÍ Î Ð ä ó    T h Ð ç ( 1 7 8 P Q R U V } ‹ 6 A ¤ ¥ ÆÎ-6—«Ùák€ýþ5°ÁVWjÖ×èKLn˜™²ÝÞöGHXˆ‰ÒÛ6;„…úøøøøøøúðúúøøíøøøøøøèíãÚÒÉÚÒÉÚÒÉÚÒÉÚÒÉÚÒÉÚÒɾҾҾã¾56\]mHsH6\]mHsH\]mHsH5\]mHsHmHsHOJQJNHj…U6 jUH*5¯°W×L™ÞH‰Ó7…ëXz\GYõ ö !6![!„!®!Ü!ýûùù÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷ûùùðððððð Æ8¼ac…‰“êëøHO¼óKPWXjºÁ`hmsyzÎÕQT[\e´»9>FGž$Ÿ$š%Ø%Q&e&ñ&û&' '''' '%'''_'e'~''ƒ'‰'!("(:(;(<(B(C(G(H(±(²(Ë(Ì(øóïóøóéóäóÜóäøóéóÜóÜóäøóéóÜóäøóéóÜóäÙÔÒÒÒÐÌÐÌÐÒÙÒÇ¿ÇÇÙÇ·j…†Uj †U jU5656OJQJNH6]mHsHOJQJ 6mHsH5\mHsH56mHsHHÜ!þ!$"K"v"™"À"â"#3#b#n#z#„#²#ö#9$:$Y%Z%š%À%Ø%Ù%Ú%&''øøøøøøøøøøøøøøøøööööôôîöìöö Æ_¾$ Æ8¼Ì(Í(Ð(Ñ(Ö(Ú(à(á(Á)Â)Ú)Û)Ü)ã)ä);*>*D*F*3+8+ê+î+Ú,ß,ä,æ,‹-Œ-Ù-Ú-é-ê-... . .l.p..‚.¯.¶.Ì.Õ.ã.ç.ø.ù.&///»/¾/î/ï/-1.1F1G1H1K1L1³1´122;2<2Q2R2a2b2w2x222­2º2úúøôøúìúúøôøøøøôøééúáúúøôøßßøôøßßéú×úúééÐÎÐÐÎÐËË0J( jUjø‡U6j}‡UNHj‡U565 jUN'Ö(;*3+ê+Ú,l.ã.õ/þ/ 0 0µ0Ò02;22­2Â2Ó2ó2ô2È3É34/404ö5J6ýýýýýýýýûûùù÷ùõ÷óóóóùùùûûùù÷'eº2Á2Â2Î2Ó2Þ2ó2É3/4ñ4ò4 5 5 555ö5÷566J6X6h6u6‚6ƒ66”6Ÿ6º6Â6{7|7”7•7–7™7š77ž7´7µ7Û7é7ù78%8&82878?8á8â8Õ9Ö9ì9í9::-:::Y:Z:f:k:s:D;E;;ž;·;¸;¹;¼;½;)<*<J<K<e<f<ûøøûóîæîîßÝßøøûøøøîÕîîßÝßøøûøøÒßÝßøøûøøÒîÊîîÒßÝßji‰UNHjîˆU jUjsˆU jUOJQJ0J(0J(5PJ6h6ƒ6”6º6Ç6È67Û7ù7&878r8s8Õ9:-:Z:k:‚:ƒ:J<<®<Â<Ó<Ô<>W>u>ýýýýýûûùýýýýûûùýýýýûûùýýýûûùý'f<<ž<®<»<Á<Â<Î<>> >!>W>e>u>‚>ˆ>‰>•>š>¥>å?æ?ÿ?@@@@@ @@@H@V@f@s@y@z@†@‹@–@~AAÕAÖAàAáAúAûAüAÿABBBBBEBSBcBoB¹BºBÓBÔBÕBÖB×BøBùB[C\C«C¯CDD DDhDiD‚DýýùýòðòýýùýýëãëëòðòýýùýýààëØëëòðòýýëÐëëààÎÌÎë65jàŠUjcŠUNHjæ‰U jU jU0J(50J(Ou>‰>š>Ï>Ð>@H@f@z@‹@À@Á@BEBcB{B|BC€CªCDEE—EÙE÷EFFýýýûûùýýýýûûùýýûûûûððêêùýýû„<^„< & FZ„¤^„¤'‚DƒD„D‡DˆDEE—E˜E­E®EÙEçE÷EFqFrF‰FŠF£F¤F¥F¨F©FqGrG‹GŒGGG‘GóGøGCHDHEHLH—H˜H«H¬HÖHäHôHI I$I0I5IˆI‰I›IœI¾IÌIØIåIJJJJJ!J"J#J/J–J—J§J¨JÀJÁJ÷òòðéçéääáòÙòòòÑòòÏðÏéçéääËäÅéçéääËò½òòäáòµjOUjÔŒU mHnHu0J(55jWŒUjÚ‹UNH0J( jU6 jUj]‹UGFÓGòGDH—HÖHôH$I5I6IˆI¾IØI#J4J5JîJK/KŽKŸK KkGkkkrk†k‹k k¨kÂkÌkxl±l²l³lÈlÉlílûlmm%m&m2m7m?mGmnnnn@nNnVncnŠn‹n—nœn¤n¬nðo÷õíõõõéõáõõÞõõÞõõÞÜõõõõ×ÐÎÐËËÇËËÂÐÎÐËËÇËËÂmHsH0J(50J( jUOJQJ\NH5B*\phÿ™5NH5B* \phº55B*\phØWIílm&m7mGmHmn@nVn‹nœn¬n­nïoðoòoóo qÕr;sQsls}s¶s·s=u€u–u±uýýýýûûùýýýýûûû÷ûûûùýýýýûûùýý'ðoño qqËqÌqÕrÖrërìrùrúrss;sIsQs^skslsxs}s…s¶s÷tøt=u>uXuYu€uŽu–u£u°u±u½uÂuÊuùu`vavv‚v²vÀvÈvÕvâvãvïvôvüvw§w·w;x?Z[š¨°½ÓÔàåíù<…=…S…T…b…c…y…óêåêåÞÜÞÙÙÕÙÙååêåÉêåêåÞÜÞÙÙÕÙÙåÃåÃå»å»µåÞÜÞÙÙÕÙÙåÞÜÞÞÜ \mHsH5\mHsH 5mHsHj)¹UmHsH0J(50J( jUmHsHjUmHsHj¬¸UmHsHGz{‹{›{œ{§|è|þ|,}=}Q}R}Š}v€>š°ÔåùúŒƒùƒ<…±…Ç…Ý…î…Z†ýýûûùýýýýûû÷÷÷ùýýýýûûûûùýýýýa'y…z…±…¿…Ç…Ô…Ü…Ý…é…î…ö…5†6†O†P†Q†W†X†Z†'‡(‡)‡C‡D‡{‡‰‡‘‡ž‡¦‡§‡³‡¸‡À‡̇ÓˆÔˆêˆëˆ‰‰%‰2‰?‰@‰L‰Q‰Y‰”•°Ž±Ž»Ž¼ŽÕŽÖŽ׎ÝŽÞŽ  #$%*+8XYjk“¡©¶ÃÄÐÕÝùööòööíåííàùÞùööòööàùÞùööòööÛÛíÓíííËííÆùÞùööòööOJQJj ºUj#ºUNHmHsHj¦¹U jU0J(50J( jUNZ†[†(‡{‡‘‡§‡¸‡͇̇Óˆ‰%‰@‰Q‰^‰_‰.Š/ŠXŠŠ‚ŠˆŠW‹}‹ž‹¿‹ÞŒߌýýûùùùùýýûùùùùýýýýýýýôôôïïý & F2 & F;'ߌÿ./8X“©ÄÕâã„…ºïðöÅ‘ë‘&’G’f“g“”Ôe•–ýýýýûù÷÷÷÷ýýýýýýýòòòííýýýýý & F2 & F;'Ý!”"”K”L”e”f”g”n”o”z”{”––6–7–8–>–?–k–l–„–…–†–‹–Œ––‘–¦–§–Ì–Ú–â–ï–ü–ý– ———~——˜—™—®—¯—ô—#˜H˜I˜b˜c˜d˜j˜k˜n˜o˜ƒ˜„˜¦˜´˜¼˜ɘÖ˜טã˜è˜ð˜[š\šušvšwš~ššµšýøðøøýøèøøøàøøÙ×ÙÔÔÐÔÔýÙ×ÙËøÃøøÙ×ÙÔÔÐÔÔø»øøj ½Uj¼U B*phÿ0J(50J( jUj¼Uj˜»Uj»U jUNHJ––Ì–â–ý–———˜—ô—n˜¦˜¼˜טè˜ô˜õ˜µš›'›B›S›_›`›Ù›œ9œtœ…œýûùùùùýýûýûùùùùýýûùùùùýý÷ùùù'µš¶šÕšÖš››'›4›A›B›N›S›[›Ù›Ú›î›ï›œ)œ9œFœsœtœ€œ…œœœœ¤œ¾¿µž¶žΞÏžОԞ՞؞ٞñžòžŸ&Ÿ6ŸCŸPŸQŸ]ŸbŸmŸyŸŸD F z | à ü ¡6¡p¡r¡¤¡¦¡¨¡ª¡¬¡°¡È¡Ò¡ä¡΢Ï¢Тê¢ë¢"£0£@£ù÷ùôôðôôù÷ùôôðôôôííèàèèù÷ùôôðôôôù÷ùôôð×ðÏ×ð×ðôôÊù÷ùômHsHj¾Uj0J(5UjнU jUNH0J(50J( jUP…œœœªœ«œÄØžŸ6ŸQŸbŸyŸ†Ÿ‡ŸD à ¡°¡Ò¡0¢1¢Ï¢"£@£œ£­£®£¥¥ýýûûûùýýýýýûûùýýýýóîùýýýóîîa & F Æ_¾$'@£M£œ£¨£û£ü£¤¤¤¤¤,¤-¤•¤–¤ý¤þ¤¥¥¥¥¥Ü¥Ý¥¦%¦/¦Z§_§n§p§q§r§…§†§³§Á§ѧÞ§ó§ô§¨þªÿª<«D«Ž«3­4­L­M­s­­­š­§­¨­´­¹­Ä­Ó­å­í­Ú®û¯…°†°£°¤°ذæ°ÿ° ±±±&±+±ýùýôìôôééôáôôéÜ×Ü×Ü×ÐÎÐýýùýéÌ×ÐÎÐýýùýýÆýÂÐÎÐýýùý5\ 0J(5\6 jUOJQJmHsHjÿ¾UNHj‚¾U jU0J(50J(L¥¦/¦?¦L¦[¦s¦¦¯¦¿¦̦Û¦ó¦§/§?§L§p§q§³§ѧô§¨¨=¨‰¨¹¨ë¨úøøøøøøøøøøøøøøøøöôòòòöööíí & F<'a & Fë¨!©"©„«…«Ž«¥«Ù«õ«¬¬¬6¬e¬Œ¬™¬š¬²¬â¬ÿ¬&­3­s­­¨­¹­å­ò­úõóóóññññññññññññññññïííííí'$$a$ & F<ò­ó­Ú®â®û¯…°ذÿ°±+±H±U±V±A²¬³´T´y´”´¥´Ë´Ù´Ú´eµ¥µð¶s·t·ýøøóóñïïïïïýýýýñïïïïïýýíííë$a'a & F±a & F+±6±H±P±U±V±²²^³_³´´0´1´T´b´y´†´“´”´ ´¥´°´Ë´Ó´¶¶·¶t·u·‡·ˆ·¹·Ç·Þ·ë·ö·÷·¸¸¸.¸6¸ñ¸ò¸—¹˜¹«¹¬¹͹Û¹ò¹ÿ¹ º ººº&ºAºIº(»)»>»?»`»n»…»’»£»¤»°»µ»À»Û»ã»ý¼þ¼#½$½8½9½x½†½ž½«½±½²½¾½ýνì½ó½ ¾¾’¾ýýýúúóñóýýíýýýúóñóýýíýýýúóñóýýíýýýóñóýýíýýýúóñóýýíýýýý0J(5 jUNH0J(]t·¹·Þ·÷·¸.¸:¸;¸—¹͹ò¹ ººAºYºZº'»(»`»…»¤»µ»Û»ð»ñ»#½x½ž½²½ýýûûûûûùùýûûûûûùùùýûûûûûùùýûûû'ýì½ ¾¾¾‘¾’¾¿£¿.Á/ÁB’¸ÂÌÂÝÂÃ%Ã0Ã1Ã(Ä`Ä~IJÄÃÄÄÄnÅoÅýýýûûûöööûðîýýýýýýûûìýýýûûû Æ_¾$ & F·'’¾ ¾¿!¿£¿±¿†Á‡ÁBÂCÂ[Â\’ ¸ÂÅÂËÂÌÂØÂÝÂèÂà Ã%Ã-Ã(Ä)Ä<Ä=ÄWÄXÄ`ÄnÄ~ċıIJľÄ9ÈEÈ4Ë5ËjËk˃˄˅ˉˊËË©ËÒÏêÏÐŽÐ#Ò$Ò;Ò<Ò=ÒEÒFÒ{Ò|ÒÒÒ¶ÒÄÒÐÒÝÒäÒåÒñÒÂÓÃÓÚÓÛÓÜÓàÓýýýúóñóîîêîîîîóñóúîîêîäúß×ßßääúßÏßßóñóîîêîßÇßjpÀUj÷¿Uj|¿U jU 5mH sH 0J(50J( jUNH5NoÅÆ‚ÆoÇpÇ8È9ÈŽËË1ÌkÌÂÌ(ÍÎÎmÏÑÏÒÏ{Ò¶ÒÐÒåÒöÒ÷Ò#Ôýýýýýýöðöâââââ×××öÕÓÓÓýý' „hdð¤^„h & FX ÆhЄÐ^„Ð Æ_¾$ & FW@&àÓáÓüÓýÓÔÔÔÔÔ0Õ1ÕOÕPÕgÕhÕiÕqÕrÕ~ÕÕŽÕÕ¸ÕÆÕÒÕßÕæÕçÕóÕJÖNÖ6×;×ø×ù×HØLØkØq؃؎Ø"Ù#Ù$Ù-Ù€ÚÚ©Ú¬ÚÛÛTÛUÛ´Û½ÛÜ Ü ÜÜ'Ü(Ü)Ü*Ü+ÜÓÜÔÜ7Ý8ÝQÝRÝSÝTÝUÝÝ“ÝÄÝÅÝ?Þ@ÞúúòúúïúçúúàÞàÛÛ×ÛÕÕïÕÕÕÕÕïÕïïÕïúÍúúïúÅúúÕïïjXÂUjÛÁU50J(50J( jUjbÁUNHjéÀU jUN#Ô$ÔlÔmÔ~Õ¸ÕÒÕçÕÖÖIÖ5×GØj؃Ø#Ù¨Ú³ÛŽÝQßÂßWà›áâŸã'æ.èýýýýûùùùýýôôôææææææææôææææ & FK ÆhЄÐ^„Ð & FK'@ÞÿÞßßßßßßQßZßÂßÈßXà_àkáláœá¡áPâQâ‘â™â™ãšã ã¨ãQäRä©äªä6å­å®åææ&æ(æ.æÚæÛæ6ç7ç’ç“ç/è2è‹èŒèwê|êëƒëÚëÛëåëîëíí’í§íbîiîÂîÍî³ï´ïÊïÏï$ð%ðMñbñòòòò·ó¦õ§õ¨õ½õ¾õîõüõöúòúúðððíðíðíðííðéðéððíííðíððíððçççíðíðððâÛÙÛÖ0J( jUOJQJ65NHNH5jÕÂU jUT.èuê€ëäëíÉïMñòNóOó·óÒóôQôôÌôõPõ™õ¦õ§õîõöö;ö<öòöúúììììììêêèèèèèèèèèêæäääêê' & FK ÆhЄÐ^„Ð & FKöööö+öÍöÎöåöæöçöíöîö ÷$÷œ÷÷´÷µ÷¶÷º÷»÷¿÷È÷øøøø ø$ø%øÖø×øèøéø ùù(ù5ùLùMùYùpúqúˆú‰úŠúú‘ú¿úÃúmûyûfügü~üü€ü†ü‡ü”ü•üòüóü¬ý­ýÂýÃý×ýØýþþþ(þ2þ3þ?þýùýôìôôêôâôôêôÚôôÓÑÓýýùýôÉôôêêôÁôô¾¾¾ÓÑÓýýùýNHj6ÅUj½ÄU jUjDÄUjËÃU5jRÃU jU0J(50J(Kòöóö÷¾÷Öø ù(ùMùlùmù•ú–ú¾úlûÁýÂýþþ3þvþwþÉþÊþõþ\ÿêÿýýøøöôôôýýýýææýöôôôýýýýææ & FZ Æh¤„¤^„¤' & FY?þöþúþ[ÿ\ÿ]ÿaÿéÿêÿëÿõÿ{|•–—ž¦§MNOZ!";<=DEJKdeflmtuv‚±²ÉÊËÑÒÔÕÖÛ|}~ƒÁÂ-.ˆ‰‘’“œŸïð!ýûýû÷òêòòçû÷çòßòòò×òòûýòÏòòûýûýûçûçûýÌÇÌûý0JpNH0Jpj&ÇUj©ÆUj,ÆUNHj¯ÅU jU5\65NêÿNuÕ}Â.’–øKLü( t œ ¬ ÷ . D x öèÚÚÚÌÌÚÃÃÚ½½»»»»»»»¹ Æ_¾$ & FZ„¤^„¤ & FZ Æh „ ^„  & FZ Æh¤„¤^„¤ & FZ Æh„¤^„¤ & FZ„ ^„ !qr•–—©RS÷øùPQJKLäåü˜ › œ    D E W X x †  ª Ê Ë × ¥ © 9 : ; F   % & ' . / 4 5 N O P V W ^ _ e Ž  § ¨ © ýøýöôñöôñöìåìàÖàÖàÏÍÏÊÊÆÊôö½µ½½½­½½öô½¥½j™ÈUjÈUjŸÇU jU5\0J(50J( jUOJQJmHnHuOJQJ NHOJQJOJQJNH560JpNH0JpAx  Ë   z { ¤ : _ $Ú-·ÓÚ–ÏX9L]n|}ýýýûûûûíäíííííäíÖííÐÐÐÐÎc„7^„7 & FZ Æhª„¤^„¤ & FZ„¤^„¤ & FZ Æh¤„¤^„¤'© ® ¯ çèCDŸ #$%2ÒÓÙÚÛé%&,-.4de|}~„…¸ÆÔåÛä—›žÍÐÜYcepvw†‡´ÂÙæìíù{|×Üëì\ ] ^ h ä å æ í ™!š!›!Ÿ!ñ!ò!"ú÷÷÷õó÷õó÷õóúëúúóóóóèóäèÝÛÝØØÔØÔ÷ó÷õóõóõóõó÷0J(50J( jU5\0JpjÉU56NH jUT}v´Ùí¯°Ö] å š!"¦"K$:%E&v&Ö&'x'*)u)Ø*ýûùùù÷÷÷÷éééÛÛÛÛÛÛÛÛÛÛÛÛÛ & FZ Æh „ ^„  & FZ Æh¤„¤^„¤'c"" ""¥"¦"§"©"­"¹"J$K$L$T$W$c$9%:%;%?%B%N%%Ž%î%ï%& &9&:&;&A&B&D&E&F&V&Z&u&v&w&†&‰&Ê&Ë&Õ&Ö&×&æ&é&''''w'x'y'‚'(())))*)+)/)t)u)v)~)))Ô)Õ)u*v*É*Ê*×*Ø*Ù*ä*ç*ó*Œ++¦+ýûý÷ôýûôý÷ôññìäììýûôýûôßôýûôýûýûýñýûýûôñññýûôì0JpNHjÉU jUNH0Jp5\56V¦+§+¨+°+±+',(,),/,-€-˜-™-š- -¡-—.˜.(/)/*/2/5/A/z/{/{0|0ã0ä0D1E1€1122±2²2Ó2Ø2Û3Ü3ô3õ3ö3ú3û3 445555`5a5‹5Œ555¾5¿5À5Å5û5ü56Q6R6Å6Æ6Þ6ß6à6æ6ç6w7x7ì8‹;÷òòðîòæòòãðßÜããðãððãîòÔòòîãîãðîðîðîãòÌòòãÉCJj}ËUjËU0Jp5\NHj‡ÊU56 jUj ÊUNØ*(,)/ä012Ò2 4«45Œ5¿5ü5W6X6ê8ì8 9%9ñññßßßññÔÏÁÁ³±«¥££„h^„h Æ_¾$ & FK ÆhЄÐ^„Ð & FZ ÆhЄÐ^„Ð & FZ „hdð¤^„h & FZ Æh-„-„&ÿ^„-`„&ÿ & FZ Æh „ ^„ %9M9ˆ9Ò9 :K:€:±:è:é:í:î:;#;V;–;Õ;ú;<D<‡<Ó<=]=¬=ê=÷=D>ƒ>’>ýýýýýýýýýýýýýýýýýýýýýýýýýýýýý‹;Œ;ž>Ÿ>­>®>È>Ö>Þ>ë>ò>ó>ÿ>?q?r?Ñ@Õ@AAAA_A`AaAkABB+B,B-B3B4BÀBÁBÂBÆB,C5CoCzCZDfDGEMEÂEÈE=G>GWGXGYG_G`G(HÊIËIÞIßI JJ#J0JBJCJOJ{JÛJÜJM€M—M˜M™MŸM MûøñïñììèìèåãáãáãÜÔÜÜáããããããÜÌÜÜÇñïñììèìèåÜ¿ÜÜjîÌUOJQJjqÌUjøËU jU65NH0J(50J( jUCJCJNHK’>ž>È>Þ>ó>??ª@«@Ð@A`AÁB+CnCYDFEÁE¯G°G'H(HAHbHŒH¶Hýûùùù÷÷÷÷ééééÛÛÛÛÛ÷÷÷ýýýý & FZ ÆhЄ ^„  & FZ Æh¤„¤^„¤'¶HàH I4I^IˆI²I½IÊI J#JCJ|J}JHKIKpKÒKòMóMNçN P~QTÄTýýýýýýýýûùùù÷÷÷÷òò÷÷äÛäÛä & FZ„¤^„¤ & FZ Æh¤„¤^„¤ & F]' MN"NæNçNèNóNœOO¸O¹OÒOÓOÔOÛOÜOáOâOûOüOýOPP P P PPkPlP}Q~QQ‹Q•Q™QÆQåQ9R:RøRùRTTTTT)TzT{TÃTÄTÅTÑTUUôUõUŠVWW$W%WZWhWWŒW“W”W WÖW×XØXBYCYøZÿZ[[ø[ýû÷ôïçïïïßïïûýôûýýÜôôôûýôûýôû×ÐÎÐËËÇËÇôôûô0J(50J( jUOJQJ0JpjäÍUjgÍU jUNH5\65NÄTõUöUŠV¡V¹V×VöVWWZWW”WÖW×WIYJYwZxZÍ[Î[÷[Å]œ^h_ñëéççççççåãããééééééééñÕÕ & FZ Æh „ ^„ ' Æ_¾$ & FZ Æh¤„¤^„¤ø[û[ÿ[\]ž]@^O^ñ^ò^_*_i_n_Ä_Å_` `½`Ï`aacc9c‰P‰Q‰t‰‚‰Œ‰™‰§‰¨‰±‰¿‰tŠuŠ,‹-‹?‹@‹Y‹g‹q‹~‹Œ‹•‹›‹()LZdqˆŽ1Ž2Ž÷òòëéëæáæÝæáÕáËá¾ËáËỹ»ëéëææÝæÝ»ëéëææÝæÝëéëææÝæÝë5NHj¼ÑB*UphÿjB*Uphÿ5B*\phÿ0J(5 B*phÿ0J( jU jUjCÑUI›‹œ‹LdŽ1ŽjŽ‚Ž›ŽªŽ«Ž67ijƒ¢¾É‘‘5‘C‘D‘j‘‘ýýûùùùýýûùùùýýýýý÷÷÷÷ûùùùýýõa'2ŽEŽFŽjŽxŽ‚ŽŽ›Ž¤ŽªŽ 2Ehs‹¢©çòjÉÊßà‘‘‘%‘5‘>‘C‘j‘n‘‘¡‘Ù‘Þ‘°’±’É’Ê’Ë’Ñ’Ò’“Ó””” ”!”'”(”m”u”ý”þ”•&•A•h•j•u•‰•Š•–/–F–G–R–ýöóóïóïíëííííæöýöóóïóïëëëáÙááÖáÎááëëóÉóïÉÁÉºÉ B*NHphÿ5B*\phÿ B*phÿj´ÒUNHj9ÒU jUOJQJ560J(50J( jUH‘Ú‘n”þ”•j•‰•Š•¬–­–8—ö—˜1™ì™šI›œ“ˆž2ŸkŸ…Ÿ™Ÿ² Í Π^¡_¡ýýýûùùù÷÷÷ýýýýýýýýýýõùùùù÷÷÷'aR–S–l–m–n–r–s–ª–————&—/—2—6—8—9—M—N—X—_—k—ö—÷—˜˜"˜(˜:˜Q˜W˜\˜]˜˜€˜ ˜¡˜·˜¼˜Õ˜á˜æ˜õ˜ö˜0™1™2™V™W™j™k™q™v™‘™¡™§™ë™ì™í™ š šš!š6šDšIšŒššŽš®š¯š¾š¿šÅšÊšãšñš÷šH›öñäöñöñáßßß×Ó×ÑÍÑ×Ó×ÑÍÑßá×Ó×ÑÍÑßáÑ×Ó×ÑÉÑÍÑßÑ×Ó×ÑÍÑßÑ×Ó×ÑÉÑÍÑß5NH5655j5U6NHj/ÓB*Uphÿ B*phÿjB*UphÿOH›I›J›j›k›z›{››†›Ÿ›­›²›ÿ›œœœœ,œ1œDœRœXœWX“”²³ÇÌâòø‡žˆž‰ž£ž¤ž´ž¹žÍžÙžÞžûžüž1Ÿ2Ÿ3ŸEŸFŸkŸyŸ…Ÿ’ŸçŸ * ^ _ ¬ ­ ² ¾ 7¡8¡O¡P¡Q¡Y¡Z¡“¡—¡.¢6¢V¢[¢ü¢ý¢6£ýõñõýíýéýçýõñõýéýçäõñõýéýçýõñõýéýçäýÝÛÝØØÔÔääØÏÇÏÏýýýäj¬ÓU jU0J(50J( jUNH6565NH5j5U5N_¡’¡-¢U¢5£[£ä£u¥Ì¥å¥ú¥”¦•¦B§C§&¨'¨1¨\¨u¨’¨ž¨Ÿ¨ƨ਩+©ýøøêêêêèæææýýýýýýäääääääää' & F^ ÆhЄÐ^„Ð & F^6£?£\£c£å£é£%¤T¤h¤ƒ¤„¤¤ž¤Ÿ¤£¤¤¤ý¤þ¤¥8¥N¥R¥S¥t¥u¥v¥ƒ¥„¥Ì¥Ú¥å¥ò¥ù¥ú¥¦ ¦ ¦ñ¦ò¦e§“§”§«§¬§­§±§²§ȧɧâ§ã§ä§è§é§ÿ§¨¨¨¨¨¨1¨>ª?ªýýýùñìäììáÜÚÖÚÏÍÏÊÊÆÊÆÊáÆ½Æµ½Æ½Æ½Æ­½Æ½Æ½Æ¥½Æ½Æ OJQJj˜ÕUjÕUj¢ÔUj0J(5U0J(50J( jUNH\\ B*phÿNHj%ÔU jU5B*\phÿ5\5?+©G©b©©£©°©É©ä©ª%ª2ª>ª?ªxªŪíªþªÿª6¬7¬j¬¡¬¢¬­2­d­u­v­®ýýýýýýýýýýýûù÷÷÷ûûûûûûù÷÷÷ûû'?ª@ªQªRªxª†ªŪÒªìªíªùª¢¬£¬·¬¸¬ƬǬÞ¬߬­­2­?­c­d­p­ЭÑ­®8®ß®à®ø®ù®G¯U¯`¯k¯›¯¨¯¶¯¯ǯЯ֯߰à°ù°ú°û°±± ±±±ñ[²a²9³E³ͳγY´Z´x´y´´дÛ´æ´µ#µ/µ;µ@µIµOµ¶¶¶¶¶#¶ù÷ùôôðôù÷ùù÷ùôôðôíðèù÷ùôôôðôôðãÛããíí××íù÷ùôôôðôôðãÏãjŽÖU5\jÖU jUOJQJNH0J(50J( jUR®®8®d®®²®Ó®ß®G¯`¯›¯¶¯ǯÖ¯ׯ[²Y´´Û´µ/µ@µOµPµ'¶q¶жŶà¶ýýûûûûûù÷÷÷÷÷ýýýù÷÷÷÷÷ýýù÷÷÷'#¶$¶'¶(¶?¶@¶q¶¶ж•¶ŶÒ¶à¶ì¶ñ¶ú¶·0¹1¹H¹I¹X¹Y¹n¹o¹Œ¹š¹¥¹°¹à¹í¹û¹º ººº#ºŒººÊ»Ë»$¼%¼:¼;¼x¼†¼‘¼œ¼±¼¾¼żÕ¼å¼æ¼ò¼÷¼½ ½4¾5¾G¿H¿`¿a¿b¿h¿i¿ƒ¿„¿”¿•¿­¿®¿¯¿°¿±¿Í¿οæ¿ç¿è¿ï¿úóñóîîîêîîêóñóóñóîîîêîîêîççóñóîîîêîêîîêçúßúúçú×úúúÏújØUj†×Uj ×UNH0J(50J( jU jURà¶ñ¶··m¸0¹Œ¹¥¹à¹û¹ ºº+º,ºp»$¼x¼‘¼±¼żæ¼÷¼ ½ ½¤¾¥¾iÀèÀÁ!Áýýûûûùýýýýýýûûûùýýýýýýûûûûùýý'ï¿ð¿À À!À"À#À*À+ÀDÀEÀ]À^À_ÀfÀgÀiÀjÀƒÀ„À–À—À°À±ÀèÀöÀÁ Á!Á.Á5ÁEÁUÁVÁbÁgÁpÁzÁÖÁ×Á3Â4ÂÿÂÃ}Ã~æçÿÃÀÃÁÃÆÃÇÃÊÃËÃçÃèÃüÃýÃÄÄBÄPÄ[ÄfÄ{ĈħķÄÇÄÈÄÔÄÙÄâÄìÄOÅPÅhÅiÅúúòúúúêúúãáããáãÞÞÞÚÞÚÞÞÚ××Õ×úÍúúãáããáãÞÞÞÚÞÚÞÞÚúÅjíÙUjrÙU6NH0J(50J( jUj÷ØUj|ØU jUN!Á5ÁVÁgÁzÁ{Á`ÂaÂÊÃBÄ[Ä{ħÄÈÄÙÄìÄíÄPÆQÆÅÊÆÊ\Ë]ˡˢËQÌ÷ÍÏÏýýýýûûûûùýýýýýýûûûûûûûûû÷÷÷ûd'iÅjÅkÅlżŽÅÕÅÖÅ×ÅÚÅÛūǮÇåÉʸʹʢˣ˻˼ËÑËÔËÖËòËõËGÌHÌQÌYÌZÌwÌxÌ…ÌþÌÿÌ@ÍAÍYÍZÍ[ÍcÍd͛͜ʹ͵Ͷ͹ͺÍ÷ÍøÍÎÎ&Î+Î-βηÎóÎôÎ>Ï?ÏWÏXÏYÏaÏbÏ'ГєÑäÑåÑÌÔÍÔúúúòúúððíåáåßÛßðíßåáåßíúÓúúúËúúåáåßÛßðíúÃúúÀ»À»ÀCJNHCJjÙÛUj^ÛUjãÚU5655j5UNH6jhÚU jUJÏxÏyÏ&Ð'ÐCÐcÐyÐzмÐËÐÑbѲÑõÑÒ6Ò7ÒOÒaÒbÒƒÒ“ÒÝÒôÒ)ÓfÓsÓ‘Ó™Óýýýýûûûûûûûûûûûûûûûûûûûûûûûûû™Ó»ÓÔ ÔÔÔVÔcÔyÔ¥Ô©ÔºÔÍÔ&Õ?Õ_Õ‹Õ¬Õ½ÕÐÕÑÕc×d×.Ø/ØåØÆÙDÚÚýýýýýýýýýýýýûùùùùùù÷÷÷÷÷õõõõd'ÍÔÎÔëÔìÔ&Õ4Õ?ÕJÕ_ÕlÕ‹Õ›Õ«Õ¬Õ¸Õ½ÕÆÕÐÕÀ×Á×õ×ö×ØØØØØ/Ø0ØDØEØUØ[Ø]سعØÑØÒØåØæØüØýØÙÙÙ2Ù3ÙWÙaÙgÙqÙ¯Ù°ÙÆÙÍÙÎÙàÙáÙêÙÚÚDÚKÚLÚ_Ú`ÚjÚÚ‘Ú§Ú¨ÚºÚÁÚÃÚ[Û\ÛcÛjÛkÛÛ€Ûù÷ùôôôðôðôôðíèàèèØÔØÒÎÒÌíØÔØÒÎÒíÌÌíÒØÔØÒíÒØÔØÒØÔØÒÎÒíÒØÔØ65655j5UjTÜU jUNH0J(50J( jUPÚcÛ²Û°ÜOÞ^ß„àÎá$ãgã€ã ãsä”ä¥ä¸ä¹äææÈæÉæPèQèéé,é;é<éýýýýýýýýûùùùùùù÷÷ñ÷÷ý÷÷÷ïïï Æ_¾$'d€Û‹Û²Û³ÛÊÛËÛÞÛæÛè۰ܱÜÍÜÎÜæÜîÜñÜOÝPÝ Ý¡ÝÈÝÉÝáÝâÝãÝëÝìÝ(Þ)ÞAÞBÞCÞKÞLÞOÞPÞiÞjÞzÞ¿ÞÀÞAßBß^ß_ßußv߃߫߬ßàààà8à9à:àAàBàlàmà„à…à›àœà¨à—á˜áÎáÏáçáèá÷áãã$ã%ã>ãýõñõýíýõñõýíýêêåÝåååÕååõñõýêêõñõýêêåÍååêõñõýêõñõýêÆÄ jUjÅÝUjJÝUjÏÜU jUNH565j5U5M>ã?ãgãuã€ã‹ã ã­ãÃãÉãÑãÚãáãçãöãÿãä ää%äsäƒä“ä”ä ä¥ä®ä¸äpåqåÕåÜåßåèåúåûåæææææ{æ|æææ¨æ©æªæ±æ²æÉæÑæÒæëæìæüæ6ç7ç~ç„çŒç•çç¤ç³ç¼çÃçÊçØçáçîçôçùçè©èªèë ëùöööòìòìòìòìòìòìòöòööòéççâÚââéâÒââÐÈÄÈÐéççççççççéù5j5U5j½ÞUjBÞU jU6NH 0J(560J(50J( jUM<éeé‚é›éÃéÓéê&ê]êsê}êŒê½êðêùêýê ëëYërë’ë¦ëÇëØëëëìëÑíÒí;ïýýýýýýýýýýýýýýýýýûùùùùùù÷÷÷÷' ë7ë8ëYëgërë}ë’ëŸë¦ë¶ëÆëÇëÓëØëáëëë íímítí®í¯íÇíÈíÉíÎíÏíî îîî=î_îcîvî›ïœï¯ï°ïÈïÉïÊïÑïÒïéïñïòï ð ððˆð‰ð¬ð¼ðÁðÑðñññ5ñ6ñFñKñSñTñnñoññ£ñªñ®ñµñ&ò'òDòEògòlòýöóóóïóïóóïííèàèèííÞÞÛèÓèèÞËÇËÞÛÞÞÞËÇËÞÞËÇËÞííËÇËÞ5j5Uj³ßUNH5j8ßU jU60J(50J( jUN;ï<ïèïéïñ&òlòúò5óaó‚ó“ó”óô¢ôcõuõ;ö<ö}ößöQ÷·÷øù÷÷õõõðîììì÷÷ççå÷÷àÒÇàà a ÆhЄÐ^„Ða & Ft ÆhЄÐ^„Ða & Fr & F_'d$a$d Æ_¾$lòtòuò’ò“ò­ò´òµòÛòÝòÞòâòæòíòúòûòóó5óCóaónóó‚óŽó ô(ô£ô¦ôÅõÆõÝõÞõßõåõæõ·ü¸üÈüÉüÓüÔüæüçü ýýý"ý2ý?ýhýiýý‚ýƒý…ý†ý«ý¬ýÄýÅýÆýÈýÉýãýäýðý^þ_þýõñõýíýëçëëàÞàÛÛ×ÛýýÒÊÒÒàÞààÞàÇÛÛ×¾×¶¾×¾×¾×®¾×¾×ÛÇj"áUj§àUj0J(5UNHj.àU jU0J(50J( jU6NH6565j5U5Dø/øuø©øÕø{ù·ùçùlúgûhûpüqü·üý2ýäýõýöýgþüþ«X23ƒôôôôïôôïïêêêêèæææääßßßßää & FO'a & Fa & Fr a ÆhЄÐ^„Ð_þgþþüþ ÿ@ÿAÿYÿZÿ[ÿ]ÿ^ÿŸÿ ÿ¹ÿºÿ»ÿ½ÿ¾ÿ89RSTVW‡ˆ¡¢£§¨«ê78QRSUVX˜+,-/0Žª«¾¿ÛÜ+bcot}ýýøðøøøèøøøàøøøØøøýÕøÍøøýÕøÅøø¾¼¾¾¼¾¹¹µ¹¹0J(50J( jUj äUjãUNHjãUj•âUjâUjáU jU5GƒÀct¤¥Pœ³íþ j¸Ï! 2 K L ¤    úúøøöôôôôøøöôôôôøøöôôôôøøøøø' & FM}£ %&./GHIMNPQijœª³Àìíùþåæjk…†¸ÆÏÜ ! - 2 ; J   » ¼   È É 5 6 N O P X Y /0HIJPQŽ©ªÐÞçô>?KPYh)*ûøøóëóóäâäßßûßßûøäâäßßûßßûøøøøó×óóóÏóóäâäßßûßßûøój}åUjåU0J( jUj‡äU jUNH0J(5R  õöŽÐç?Pij‘Ýô&=NOlƒ²ÃÐÑ£Žýýýýûùùùùýýûùùùùùýôýûùùùùýýýa & F'%&OP[\‘’§¨Ýëô!&1=E§M./EFlzƒ±²¾ÃÌÏÑ&'}~£ÿ³·fk$'-.€™š› ¡¹º9./~€“”»ÉÒßí÷òòïïèæèããßãããÝèæèèæèããßããßÝÙÝÙÝïÝÝÝïòÑòòïÝÙÝèæèããßjsæU5NH50J(50J( jUNH jUjøåURޱ²e#@A9~»Òíþ  Q‘¨ÂÓâã\ ] Ý ô !ýýýûûûöööýôòòòòýýôòòòòýýýôòò'a & Faíùþ FGQRij‘Ÿ¨µÂÎÓÜá] ^ u v … † ª « Ý ë ô !!!!²"³"Ö"×"##(#)#;#<#R#S#t#‚#‹#˜#«#·#¼#Å#7$8$ô$õ$7%8%O%P%Q%V%W%Ò%Ó%Ù%&'&o&p&‡&ˆ&¶&Ä&Í&Ú&ç&è&ñ&É'Ê'ýýùöïíïýýùýýùïíïïíïýýçýööïíïïíïýýùýýööâÚââöØÓïíïýýùýöOJQJ5jîæU jU 0J(5\ jUNH0J(50J(S!0!1!è!W"#t#‹#«#¼#Ó#Ô#&&'&M&o&¶&Í&è&0'1'q'Ï'&()f)‡)§)ýûöööôýýýýûûûûòòôýýýûûûûûôýýa & F'Ê'æ(ç())<)=)f)t)‡)’)§)´)º)»)Ë)Ú)Û)ç)ì)õ)ý*þ*+++++#+$+D+E+r+€+“+ž+³+À+Æ+Ç+×+æ+ç+ó+ø+,¼,½,Ý,Þ,ö,÷,--%-&-[-i-|-‡-œ-©-¯-°-À-Ï-Ð-Ü-á-ê-O.P.h.i.j.r.s.x.y.‘.’.“.›.ýöôöñññíñíññèàèèöôöñññíñíññöôööôöýñññíñíññèØèèèÐèj]èUjâçUjgçU jU0J(50J( jUNHR§)»)Û)ì)ÿ)*#+r+“+³+Ç+ç+ø+ , ,»,¼,[-|-œ-°-Ð-á-ô-õ-ª.E/f/†/š/ýýýýûûùýýýýýýûûûùýýýýýýûûùýýý'›.œ.ª.«.É.Ê.à.á.ÿ./E/S/f/q/†/“/™/š/ª/¹/º/Æ/Ë/Ô/-0.0·2¸2Ì2Í2ß2å2ç2ñ2÷2%3&3Z3[3z3‹34%4+4-4>4D4h4z4›4®4¶4¸4ã4ë4í4ÿ425E5M5O5Œ5”5–5§5³5½5Ã5Å536?6r6s6¿6Å6777!7€7Œ7 88)8úóñóóñóîîîêîêîîçßÛßÙÕÙÓççÙÙÕÙÓÙÙÕÙÓÙÙÕÙÓÙÕÙÕÙÓçÓÙÕÙÓÙÕ65655j5UNH0J(50J( jU jUSš/º/Ë/Þ/ß/0€0ß1à1}2~2¶2·2z34h4›4í425–57 8;9¡9Â9â9ö9:':ýýýûûûûûûûûûùùùùùùùùùù÷ýýýýýd')838<8>8^8_8i8r8¯8»8<9=9`9a9š9›9¡9¯9Â9Í9â9ï9õ9ö9:::":':0:ä;å;þ;ÿ;<<<'<(<Q<R<Ÿ<­<À<Ë<à<í<ó<ô<=== =%=.=¯>°>É>Ê>Ë>Ð>Ñ>#?0?1?E?F?J?Ã?Ä?ê?ë?$@2@E@R@_@`@ýùýöôôíëíöèèèäèäèèß×ßßíëíèèèäèäèèßÏßßýÇÃÇýíëíèèä5j5UjUéUjØèU jU0J(50J( jU6NH565M':::;:¿:À:°;±;&<Ÿ<À<à<ô<=%=8=9=Ê=Ë=j>k>#?Ã?$@E@`@q@}@~@Aýûûûûûûùýýýýýýûûûûûû÷ùýýýýûûd'`@l@q@y@}@A‘A·A¸AàAîA÷ABBBB#B+B0BÀCÁCÞCßCD+D>DKDuDvD‚D‡DDDiEjEFFF F:F;FwF…F˜F¥F²F³F¿FÄFÌFÑFÐGÑGéGêGH%H8HEHsHtHHŽHH‘H’H“H”H H¥H­H¿H¹IºIÓIÔIÕIÛIÜIJJGJHJhJiJ¦JýýùòðòýýùýýùòðòýýùýýùííòðòýýùýýùòðòýýèàèèùýýùèØèèíòðòjOêUjÒéU jUNH jU0J(50J(UAàA÷AB#B0B1BÀCD>DvD‡DDžDFwF˜F³FÄFÑFÒFÐGH8H”H¥H¿HÀHGJ¦Jýûûûûùùýûûûûùùýûûûûùùýûûûûùùý'¦J´JÇJÔJáJâJîJóJûJ!KmKnK‡KˆK‰KKKúLûLMMMMM"M#MEMFMtM‚M•M¢M¯M°M¼MÁMÉMÎMNN3N4NƒO„O£O¤OìOúO PP'P(P4P9PAPFPXRYRqRrRsRyRzRñRòR S S SSS8S9SZS[SœSªS½SÊS×SýýùýýùôìôôôäôôÝÛÝýýùýýùÙÖÝÛÝýýùýýùôÎôôôÆôôÝÛÝýýjAìUjÆëUNH6 jUjIëUjÌêU jU0J(50J(N¦JÇJâJóJ!K"K¤L!MtM•M°MÁMÎMÏMƒOìO P(P9PFPGP8SœS½SØSéSõSöSÉUGVýýýýûûûùýýýýûûùýýýýûûùýýýýûûû'×SØSäSéSñSõSGVHViVjVÃVÑVäVñVWWWWW4WX X!X*X§X®XôYõY ZZZZZ{Z|ZZŽZ¦Z§Z¨Z­Z®ZÕZÖZõZöZ5[C[V[c[p[q[}[‚[Š[[é\ê\ý\þ\ ].]A]N]h]i]u]z]‚]ˆ],^-^E^F^G^L^M^_ _!_ûøøûñïñøøûøøûëëëæÞææÛæÓææñïñøøûøøûñïñøøûøøûæËæææj²íUj7íUNHj¼ìU jU6] jU0J(0J(5OGVÃVäVWW4W5WÔXDY±YÔZÕZ5[V[q[‚[[[é\ ]A]i]z]ˆ]‰],_f_‡_¢_³_ýûûûûùùùùùùýûûûûùùýûûûûùùýûûû'!_"_#_(_)_,_-_C_D_f_t_‡_”_¡_¢_®_³_»_Á_"`#`;`<`=`B`C`e`f`~``€`…`†`·`¸`Ñ`Ò`Ó`×`Ø`=a>asataŒaaŽa“a”a™aša²a³a´a¹aºa5b6bKbLbmb{bŽb›b£b¬b­b¹b¾bÆbcZc[c÷òòëéëææâææâòÚòòòÒòòòÊòòÇò¿òòò·òòëéëææââææâòj–ðUjðUNHjžïUj#ïUj¨îU0J(50J( jU jUj-îUH³_Á_Â_5bmbŽb­b¾bccŒccÝcÞcdodÇd2e}e f[f5gêg÷g¹hYi–iÚijýûûùýýýýûûûûû÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷e'[csctc„c…cˆc‰cÞcácddodtdÁdÂdÇdËdeeee(e)e*e/e0e2e6e}ee f fUfVf[f_fggg g!g&g'g5g9g£gégêgíg÷gûg¹h½hYi]i–i›iÚiÞijj}j‚j j¥jÄjÉjéjîjkk4k9kZk_k~kƒk£k¨k&l+l~llälèl-m÷ôïïíííêíèïàïïíííêíïØïïíèíííííííííííííííííêíjòUjŒñU6NH5 jUCJjñUUj}j jÄjéjk4kZk~k£k&l¥l¦lälOmym¤mÏmn™noQoroo oîoïoæpdqýýýýýýýýýýýûûýýýýýýýù÷÷÷÷ûûù'e-m.mFmGmHmLmMmOmTmym~m¤m©mÏmÔmnn™nžnñnònoo/o0oQo_oroo…oŽoo›o o¨oío"p#p;p„÷òòïìïïïìïêâÞâêÚêÚêØòÐòòØêÚêÚêïØØØïòÈòòïêÚêÚêïØØïjT÷Uj×öU6565j5U5NHNH jUj\öUO>„ˆ„‰„¡„¢„£„­„®„b…c…v…w…Ÿ…­…¶…Ã… † †††5†6†7†<†=†>†?†K†V†_†цÒ† ˆˆ‰‰‰‰6‰7‰8‰?‰@‰¼‰Á‰¬Š°Š ‹k‹l‹„‹…‹†‹‹‹Œ‹Ò‹Ó‹Ú‹ŒÁŒÂŒÖŒ׌(5O[`iúòúúëéëææãúÛúú׿æãÕãúÍúúÕÕËÄ˺ÄËÄ˶˱ëéëææ×ææOJQJ5NHj@ù5U j5U5jÅøU60J(5jJøUNH0J( jUjÏ÷U jUFb…Ÿ…¶…?†V†m†n† ‡!‡ñ‡ò‡Ÿ‰ ‰ ‹ ‹Ú‹Û‹ŒŒ4Œ_ŒlŒmŒ‰Œ´ŒÁŒ(Oýûûûûùùùùùùùùùùùùù÷÷÷÷÷÷÷õûû'O`no­ŽáŽûŽHYgh¨‘Ö‘ð‘’’#’$’“s“§“Á“Ü“í“ú“û“¿•ü•–ýýûûùýýýýûûûùýýýýûûûùýýýýûûùý'iéêŽŽŽ Ž Ž­Ž®ŽÂŽÃŽáŽïŽûŽHTYbÄÅO\‘‘‘¦‘§‘Ö‘ä‘ð‘ý‘’’’’‡’ˆ’s“t“†“‡“§“µ“Á“ΓÜ“è“í“ö“º”»”A•B•Z•[•\•a•b••‘•™•𕲕³•´•¼•½•¿•À•Ô•Õ•ü• ––#–1–=–B–K–O–W–úòúúëéëææâææßÝëéëææâææßëéëææâææßúÕúúßúÍúúëéëææâæææj±úUj6úU6NH0J(50J( jUj»ùU jUQ–1–B–O–_–`–¢—ð— ˜%˜6˜C˜S˜T˜_›¤›¾›Ù›ê›ö›÷›*ªëüžžÆŸ1 ýýýýûûùýýýýýûûùýýýýûûùýýýýûûù'W–——K—L—e—f—g—n—o—¢—£—½—¾—ð—þ— ˜˜%˜1˜6˜?˜C˜K˜¶˜·˜Û˜ܘõ˜ö˜÷˜þ˜ÿ˜3™4™dšešmšnšËšÌš_›`›w›x›¤›²›¾›Ë›Ù›å›ê›ó›*+IJžª·êë÷üžžÆŸÇŸäŸåŸ1 ? ^ k y … Š “ — Ÿ g¡©¡ýøðøøéçéääàäääýøØøøýýýýéçéääàääéçéääàääÒéçéääàäääÐ5 0J(5\j©ûU0J(50J( jUj,ûU jUNHR1 ^ y Š — § ¨ ¢¢V£p£”£¥£¹£º£®¥¯¥Ö¥—¦{§µ§ï§ð§d©e©ª ª«F«`«ýýýýýûûùýýýýûûûûôôôôûûûûûûùý & F?'©¡Ú¡ñ¡w¢x¢¡¢¢¢£¢½¢¾¢Ò¢Ó¢í¢î¢££££V£d£p£}£”£ £¥£®£Ú¤Û¤:¥;¥×¥à¥˜¦¢¦î¦ï¦|§‡§¶§Á§©©©© ©$©%©ܪݪõªöª÷ªÿª«««««F«T«`«m«s««è«é«¬¬¬¬¬­­)­*­@­N­\­i­q­}­ó­ýúýóñóóñóóñóîîêîîúúýýúýýåÝåååÕååóñóîîêîåÍååóñóîîêîjýUjŸüUj&üU jU0J(50J( jUNH5Q`«s«„«…«M¬N¬­@­\­q­—­˜­ ®®:®æ®¤¯#³µµ¶µĵúµ(¶g¶v¶½¶×¶ýýûûûûùýýýûûûûôôôìûûêêêêêùý$ & FLa$ & FL'ó­ô­;®?®Ä®Å®Ü®Ý®Þ®â®ã®ç®ë®¥¯®¯¶°·°n±o±™±š±³±´±µ±½±¾±;²<²#³.³Ò³Ó³ë³ì³í³ò³ó³³´дÕ´µ¶µv¶w¶޶¶½¶˶×¶ä¶ò¶þ¶· ·q·r·‹·Œ···‘·¸¸¸ ¸P¸^¸j¸w¸…¸‘¸–¸Ÿ¸ý¸þ¸¹ýûöîööûûýýöæööýûöÞööûûÙÒÐÒÍÍÉÍÍöÁööÒÐÒÍÍÉÍÍöjÿU0J(50J( jUOJQJj‰þUj þUj“ýU jU5NHK×¶ò¶···¸P¸j¸…¸–¸¢¸£¸κ »'»j»{»|»8¼9¼ú¼û¼;¿7¿R¿c¿d¿&ÀmÀýýýûûùýýýýûûùýýýûûûûûûùýýýûûù'¹¹¹¹¹;¹<¹U¹V¹W¹Z¹[¹’¹“¹Á¹¹Ú¹Û¹ܹã¹ä¹ º º$º%º&º.º/º‰ºŠºº‘ºͺκϺçºèº »»'»4»K»L»d»e»f»g»h»j»v»—» »X¼f¼l¼m¼…¼†¼‡¼м‹¼¾¾(¾÷òòòêòòçòßòòò×òòççÒËÉËÆÆÂ¹Â±¹Â¹ÂƯ¯ò§òòòjîU6jsUj0J(5U0J(50J( jUOJQJjöUj{UNHjþÿU jUjÿU?(¾)¾*¾1¾2¾•¾–¾¤¾¥¾¾¾¿¾À¾Ⱦɾ;ξç¾è¾¿+¿7¿D¿R¿^¿´¿µ¿οÏ¿пØ¿Ù¿ê¿ë¿&À'À@ÀAÀmÀ{À‡À”À«À¬ÀÄÀÅÀÆÀÇÀÈÀÊÀÖÀ÷ÀÁ¥Á³Á¹ÁºÁÒÁÓÁÔÁ×ÁØÁíÂîÂiÄjąĆİľÄÊÄ×ÄîÄ÷òòïòçòòàÞàÛÛ×ÛòÏòòïàÞàÛÛׯ׾Æ×Æ×Û¼¼ò´òòïàÞàÛÛ×jYU6jÞUj0J(5UjaU0J(50J( jUjäUNH jUjiUGmÀ‡ÀÊÀÛÀÜÀ…Á†Á*Â+¼ÃiİÄÊÄ ÅÅÅéÅêŃÇÉÇãÇ&È7È8ÈnÉÊOÊiʬʽÊýýýûûûûûûûùýýýûûûûùýýýûûûùýýý'îÄïÄÅÅ Å Å Å ÅÅ:ÅCŘśÅÇÅÐÅ ÆÆÆÆ6Æ7Æ8Æ;Æ<ÆÃÆÄÆVÇ_Ç~ÇǃDŽǡǢÇÉÇ×ÇãÇðÇÈÈ È!È"È#È$È&È2ÈUÈ^ÈlÈzÈ€ÈșȚțȞȟÈ^ÉlÉÊ Ê#Ê$ÊOÊ]ÊiÊvÊʎʦÊ÷óë÷ó÷óèæäææß×ßßÔæÔÍËÍèèó÷óÃ÷ó÷óèææß»ßßæÍËÍèèó÷ójEUjÊU jUNHjOU jU560J(jÔU0J(5j0J(5UF¦Ê§Ê¨Ê©ÊªÊ¬Ê¸ÊÛÊäÊòÊËËËË Ë!Ë$Ë%Ë>Ë?ˉ˗ˀÌÌ Ì¡ÌàÌîÌúÌÍÍ'Í-Í.Í>ÍBÍGÍOÍPÍ\ÍaÍjÍÚÍÛÍºÎÆÎÊÎËÎãÎäÎåÎêÎëÎ ÏÏ&Ï'Ï(Ï.Ï/ÏºÏ»Ï Ð Ð#Ð$Ð%Ð-Ð.ÐvÐ}Ð÷îêîêçååàØààÕåÎÌÎçççêçêçêççÕåàÄààà¼ààÕà´àà²5j¬Uj1Uj¶U jUNHj;U jU60J(0J(5j0J(5UjÀUF½Ê¾Ê™Ë€ÌàÌúÌÍ.ÍPÍaÍtÍuÍnÎ1Ð3ÐuÐvÐýÑ%ÓÃÓgÕ&Ö±ÖJØÙÙ¾Ú˜Û¾ÜÀÝýýýûùùùùùùýýýýýý÷÷÷÷÷÷÷÷÷÷÷÷d'}Ð~МÐбÐÇÐÐÐÑÑÑÑ/Ñ0Ñ3Ñ4ÑpÑqѫѴÑÝÑàÑýÑÒÒ Ò!Ò2ÒHÒQÒÔÒÝÒÓ ÓÓÓ%Ó&ÓAÓBÓYÓeÓfÓyÓ‚ÓÓ™ÓžÓŸÓÃÓÄÓßÓàÓ÷ÓÔÔÔ#ÔEÔLÔ`ÔaÔyÔzÔ{Ô|Ô}ԄԅԕԜԡԧÔ[Õ\ÕgÕnÕoÕ„Õ…ÕÕõÕöÕÖ÷ó÷ñïêâêêßïïñ÷ó÷ñïïïß÷ó÷ñÛñïïß÷ó÷ñÛñïïêÓêêßïïßñ÷ó÷ñêj¤ U56NHj) U jU655j5URÖÖÖ Ö#Ö$Ö&Ö'Ö<Ö=ÖNÖTÖUÖÖ‡ÖÖžÖ±Ö²ÖÇÖÈÖÙÖßÖàÖõÖýÖ×&×:×;×S×T×U×V×W×o×v×{××JØKØfØgØ~؄؅ؒؓؼØÂØôØõØ ÙÙÙÙÙÙÙàÙáÙöÙ÷ÙÚŒÚÚ¥Ú¦Ú¶Ú·ÚºÚ»Ú¾ÚÅÚÆÚØÚÙÚâÚdÛ÷òòêæêäàäÞÛêæêäàäÞÞòÓòòÞÞêæêäàäÛÞòËòòäêæêäòÃòòäêæêäj Uj Ujš UNH65655j5U jUj UMdÛeÛ˜ÛŸÛ Û·Û¸ÛÆÛÜÜkÜl܅܆܇܎ÜܩܪܾÜÅÜÆÜÞÜßÜîܫݬÝÀÝÊÝËÝàÝáÝìÝ[Þ\ÞtÞuÞvÞyÞzÞŸÞ Þ­Þ®ÞÆÞÇÞÞÞâÞãÞ"ß#ß-ß.ßFßGßHßKßLß[ß`ßaßkßlß߀߉ßöß÷ßààààà9à:àGàHà^àýûóïóûýêâêêýûóïóûýûóïóûêÚêêýóïóûÖûýêÎêêÌûóïóûêÄêêýóïj~ U6j U56jˆ Uj U jU5j5U5NHMÀÝ­ÞaßGàõàzáâ¶âiãæä·åç`ç„èìèúé ëmì î’ïRð òbò1ôÃõ÷úàúúúûýýýýýýýýýýýýýýýýýýýýýýýýýýûùù'd^à_àtàxàyàÁàÂàÚàÛàÜàßàààïàôàõàýàþàáá'áQáRájákáláoápázá{á—á˜á±áµá¶áÐáÑáéáêáëáîáïáþáââ â â%â&â4âqârâŠâ‹âŒâââ¶â·âÒâÓâëâóâôâãã0ã1ã2ã5ã6ã=ã>ãEãMãgã÷õñõìäììâõ÷Þ÷õìÖìì÷Þ÷õñõìÎììâõ÷Þ÷õìÆìì÷Þ÷õñõì¾ìì»âNHjåUjjUjïUjtU56jù U jU565j5UJgãhãiãqãrããã¤ã²ã³ãèãéãäääääÁäÂäÚäÛäÜäãäääæäçäåå#å(å)åMåNåfågåhåkålå{å€åµå¶å·å¿åÀåÙåÚåêå#æ$æwæxæÉæÊæç çççç,ç-ç8ç`çeçfçzç{ç†ç©çªçÃçÄçÅçÍçÎçbècè{èýûóïóûìçßççç×ççóïóûÓûçËççýýûóïóûììììûóïóûûóïóûçÃçççjÑUjVU56jÛUj`U jUNH5j5U56M{è|è}è€èè„èŒèè¦è§è·èìèíè é é(é,é-é0é2éaébéé¥éÔéÕéíéîéïé÷éøéúéêêêê%ê©êªêÃêÄêÅêÍêÎêÿêë ëëë+ë,ëAëJëLë_ëhë{ë|ëºë»ëÔëÕëÖëÞëßë`ìaìmììíííŽí§í÷òòðèäèðèäèðàÚàð×ÕòÍòòðèäèðòÅòòÂðèäèðàðÕÂòºòòÂðÂòjÁUNHjDUjÉU6NH 56NH565j5U5 jUjNUI§í¨í©í°í±íèíéíîîîî î î î(î*î4î<îûîüîïïïïï%ï&ïoïpïˆï‰ïŠïïï’ï©ïRðiðtðvð€ð‹ð ñ ñññ*ñ+ñ,ñ4ñ5ñÈñÉñbòvòyò|òŒòòƒó†ó¶ó·óÞóáó1ôHôXôbôkômô õ¡õºõ»õ¼õ÷òòòêòòèäèâèòÚòòòÒòòèèäèâèòÊòòÇèäèââÇâèäèäèò¿òj«UNHj.Uj³Uj6U6565j»U jUj>UK¼õ¿õÀõÃõØõâõìõõõøõö!ö9öBö_÷`÷y÷z÷{÷~÷÷€÷ž÷¯÷²÷lømø‰øŠø‹ø™øšøØøéøLùMù ú ú$ú%ú&ú.ú/ú\ú]úú€úŸú úàúîúúúûû'û-û.û>ûBûGûOûPû\ûaûjûÖû×ûôûõûüü]üküwü‚ü—ü¤üªü«üúøôøôøòòúêúúøôøúâúßúòÜúÔúúÜÍËÍÈÈÈÄÈÄÈÄÈÈÜÍËÍÈÈÈÄ0J(50J( jUjCUNH0Jj¥Uj(U6565 jUMû.ûPûaûtûuûôû]üwü—ü«üÌüÝüðüñüyýØýÙý¼þ ÿ&ÿFÿZÿ{ÿŒÿŸÿ ÿ†ãäýýýýûûùýýýýýýûûûûûùýýýýýýûûûû'«ü»ü¿üÃüËüÌüØüÝüæüQýRý þ1þ`þaþzþ{þ|þ†þ‡þŽþþ§þ¨þ©þ¯þ°þ¼þ½þÛþÜþ ÿÿ&ÿ1ÿFÿSÿYÿZÿjÿnÿrÿzÿ{ÿ‡ÿŒÿ•ÿžÿÿÿ*;jk„…†‘˜™±²³¹ºÆÇÞß $/DQWXhýùýùýýöôïçïïïßïïØÖØýýýùýùýùýýùöôïÎïïïÆïïØÖØýýýùýj5Uj¸U jUj=UjÀU jU6NH0J(50J(NäÆ $DXz‹žŸP­/VjŒ°±$}â<Prƒ–—ýûùùùùùùýýýûùùùùùùýýýûùùùùùùý'hlqyz†‹”ÇÏéê  …†Ÿ ¡©ª­®ÉÊ/:IUVcijz~ƒ‹Œ˜¦WXpqrst‘’«¬­°±UVopqyz}~œâûøûøøöñéñññáññÚØÚøøÔøûøûøûøøÑñÉñññÁñññ¹ññÚØÚj Uj#Uj¨UNH5\ jUj+Uj°U jU50J(0J(5Iâð'<IOP`diqr~ƒŒ^ _ ¥ ©   ¦ ¯ °  à Ë ò ó      5 6 K L ^ h i v € ø ù  & , -  ‚ › œ  ¥ ¦ À Æ   v Ì Í æ ç è ð ñ 3=ýýýùýùýùýýöôôòêæêòáÙááêæêòÕòôöòÕòáÍááôôòÆò¼ÆòÆòêæêòÕj5U j5Uj˜U56jU jU5j5U56NH0J(50J(J— c e § 5  êÁ4nŽ¢ÄÕèéøžq‹¦·ÅÆýýýýûûûûûûù÷÷÷÷÷÷ýýýýýù÷÷÷÷ý'd=>op²½ìö  *+7€êñò Z[ÁÂæç)*4BnyŽ›¡¢²¶»ÃÄÐÕÞv{ùú 9:q‹˜¦²·ÀÄ‹ŒëìÖ9:ýúøøúðìðýúýðìðýúåãåúàààÜàÜàÜààøø×Ï××åãåààÜààÜúúËÃj5U\5\j’U jU0J(50J( jU5j5U6NH5MÆÖª†¡²áKL´ÿ/{ŒÁ?@£¤= > … Ÿ º ýýýûùùùùùóýýîûùùùùùóýýîîûùùa & F Æ_¾$':STdemnstŽžŸ¦§ª«¾¿ÊËãä5}~†“¡­²»áçè567?@Iª«¹ÛHI©ª«°±´µüñüéüéüéüÞüéüéü×Õ××Õ×ÒÎËÒÎÒÒÒÎÈοη¿Î¿ÎËÎ˲ª²² j0J(5Uj„ U jUj Uj0J(5U0JpNH0J(50J( jUjŠ5U\j5U\j 5U\5\<µÍÎÿ /<YZstuxy{‡Œ•ÁÇÈÚ234<=>Ž z{“”•Ÿ ¢ÑÒ  2 3 4 9 : > ? Y Z … “ ž Ÿ ¬ úðìéìéìàìØàìàìéééìÕìàìÍàìàìÊžŵũµÅµÅʤœ¤¤ðúðìéìéjv"U jUjû!UmHsHjUmHsH NHmHsHmHsHNHj~!U0Jpj!Uj0J(5U0J(0J(5j0J(5U 0J(5=¬ º Æ Ë Ô Ù ß à ò ô 6!L!R!S!l!m!n!q!r!&"'"("=">"{"‰"«"¸"Î"Ú"ß"è"é"(#/#¦#¬#Ì#Ø#ó#ú#$$k$l$–$$%%ú%û%p&q&‡&ˆ&Æ&Ô&ö&''%'*'3'8'q'v'Æ'Ë'( (D(J(´(¿([*\*u*ûøøøûõðêðáðÕáðáðÐÉÇÉøøûøøûÅÅÅÅÅÂÅÂÂÉÇÉøøûøøûÅÅÅÅÅÉÇNH5 jUmHsHjó"UmHsHjUmHsH 6mHsHmHsH0Jp0J(0J(5Lº Ë Ù ó ô '"{"«"Î"ß"ï"ð"(#¦#Ì#ó#$–$0%1%p&Æ&ö&'*'9':'q'ýýý÷õóýýýýõõññññññììóýýýýõõa & Fa Æ_¾$'q'Æ'(D(´(")#)[*¢*¼*×*è*÷*ø*Á+M,±,Ë,æ,÷,--ñ.J/d////ž/ýýýýýøøöôôôôòòòöôôôôòòöôôôôò'a & Fau*v*¢*°*¼*É*×*ã*è*ñ*ö*M,N,o,p,±,¿,Ë,Ø,æ,ò,÷,-¼-½-ý- ...../.0.7.8.˜.™.ñ.ò.//J/X/d/q//‹//™/™1š1Ö2×2î2ï2ð2÷2ø2$3y3z3Î3Ï3å3æ344"4#4F4G4‰4—4£4°4¾4Ê4Ï4Ø4£5¤5©6ª6Â6ùööòööòùðùööòööíëæÞææíùðùööòööíæÖææÔÐÔÐÔùðùùðùööòööíæ5NH5jë#Ujp#U jU6NH0J(50J( jURž/=12$3å3‰4£4¾4Ï4Ü4Ý4Ï6)7C7^7o7|7}7˜9:.:I:Z:g:h:7=„=ž=%>;>ýýýýûùùùùýýûùùùùýýûùùùùýýûùùù'Â6Ã6Ä6Ë6Ì6Ï6Ð6é6ê6)777C7P7^7j7o7x78898r9s9‹9Œ99”9•9˜9™9¶9·9:":.:;:I:U:Z:c:¬:­:Æ:Ç:È:Ð:Ñ:È<É<==*=+=,=3=4=7=8=J=K=„=’=ž=«=þ=ÿ=>>>">#>%>1>…>†>÷òòëéëææâææßò×òòëéëææâææòÏòòßòÇòòëéëææâ¾â¶¾â¾âæòjR&Uj0J(5Uj×%UjZ%Ujß$UNH0J(50J( jU jUjd$UH;><>Ï>Ð>7?8?ß?à?~@é@BAWAëAìAÓBÔBàCáC DODFpGDH5IJ_J®JöKýýýýýýýýûùùùýýýýýý÷÷÷éééééé & FK ÆhЄÐ^„Ðo'†>>ž>Ÿ>£>¤>^?_?w?x?y?ƒ?„?’?“?¬?­?®?¶?·?~@@Œ@@•@–@­@®@é@÷@AA5A6A7A?A@ABAOAWAcA»A¼AÕAÖA×AßAàAQBRBjBkBlBpBqBbCcC|C}C~CˆC‰C DDOD[D°D±D E÷òòòêòòòâòòÛÙÛÛÙÛÖòÎòòÖÊÖòÂòòòºòòò²òò°°­NH5jµ)Uj:)Uj½(U0J(5j@(U0J( jUjÃ'UjH'U jUjÏ&UD EEEE8E9ERESEcEdEnEoEqErE‹EŒEœEE§E¨EªE«EÄEÅEÕEÖEàEáEæEçEFFFFFFF%FqGwG(H)HEHIH½HÀH5I>IJJ`JdJ¯JºJbKeK‘K•K–KžKõK÷KLL L!L+L˜MûMANBN[N\N]N^N_NaN™NýùýôìôôôäôôôÜôôôÔôôÒÒÏÒýÒÒÒÒýýÒÒÒÒÌÒôÄôôÒj&,U0JpNH5j©+Uj,+Uj¯*Uj2*U jU6NH6MöKLaNcPQ–QRSR‹R SES}S T’UV€VúVdWÅXúZ<\ý]æ_¨a>b?b—böèèèèèèèèèèöæèèèèèèöææææääo & FK ÆhЄÐ^„Ð & FK„Ð^„ЙNœNÉN\O]O”O°O±OýOCPDP]P^P_P`PaPdPnP QQ_Q`Q—Q¡QêQëQR'RTR_RŒR–RSSFSQS~S„S T&TÑTÒTÛTÜTôTõTUU U U“U”U V VV‚VÕVÖVûVüVfWgW¼W½WdXeXÆXÇXÊXÔXNYtYÅYÆYßYàYáYéYêY|Z}Z–Zú÷õñõìäììõõ÷õ÷õõõõõõõ÷ìÜììõõõ÷õõ÷÷õÙõìÑìììj›-U0Jpj -Uj£,U jU5NH5NH B*phÿQ–Z—Z˜Z™ZšZ¥Z¬ZûZüZÿZ [¯[°[Á[Â[Û[Ü[Ý[ç[è[<\B\ö\÷\0]4]÷]ø]ý]^__æ_î_™`š`Í`Ô`!a'a(a)a7a8aPaQaaabahaiaa“a§aÙabb!b"b2b3b;bbvb‹b—b-d1dKdXdgdhd÷òòðîëèòàòòîèðèîèîèðððòØòòðîòÐòòîËÆ½Æ½Æ¶ jUB*OJQJphÿOJQJ B*phÿj/Uj/Uj•.UNH0Jp56 jUj.UH—b¶bÞbcXc…c¬cýc[dgd¤d½dàdád­f®fgg¬gðgJhjh–h·hÈhÛhÜhíiîiýýýýýýýýýûùù÷÷÷÷÷÷ûùùùùùù÷÷÷'hdydzd¤d²d½dÉd4f5fMfNfOfYfZfugvg«g¬g­gÃgÄgðgþgh#h$h=h>h?hGhHhIhJhUhjhwh–h¦hªh®h·hÃhÈhÑh%i&i>i?i@iHiIi]i^iÛiëi5j6jNjOjPjXjYjñj÷j¶l¼l²m³mËmýöóóîæîîãÞöýöóÚÑÚÉÑÚÑÚóóóÇóóî¿îîã½îµîî½½îj}1U6j1U5j…0Uj0J(5U0J(5OJQJNHj 0U jU0J( jUDîiUmVmnn!oÐo2qèq“r¿sžtlumuÂuv=vQvrvƒv–v—vºxDyEyÁzÂzD{ýýýýûûûûûûûûñïííííííýýýýýýý' d„„^„`„dËmÌmÍmÓmÔmnnnnn3n4nAn·n¸nÑnÒnÓnÝnÞn!o(o)o>o?oKo]odo‘o’o¬o­oÅoÆoÇoÍoÎoÐo×oØoêoëoôopp\p]pupvpwp}p~p¨p©püpýp q!q2q9q:qMqNqXqÃqÄqÜqÝqÞqäqåqèqðqñqrr÷òòðîæâæîòÚòòîæâæîð×òÏòòîæâæîðòÇòò×××îæâæîò¿òòîæâæjæ3Ujk3Ujð2UNHjs2U5j5U56 jUjø1UKrr“r›rœr¯r°r¼rss¿sÀsØsÙsísös÷szt{t“t”t•t›tœtžt¥t¦tºt»tÔtÝtätòtót!u"u:u;u‰ŠŠ‹‚‹´‹µ‹Í‹΋ϋًڋµ¸ŽŽ¤ŽµŽÕŽÖŽïŽðŽñŽûŽüŽÿŽCQ^_swx‘ûøóëóóøóãóóøóÛóóøøøóÓóóøÑøÑóÉóóÂÀ½½û´ûj0J(5U0J( jUj¢;U6j';Ujª:Uj/:Uj²9U jUNH0J(5DLˆMˆC‰D‰ŸŠŠ‹"ŽxŽyŽþŽÿŽCž¾Òó=‘>‘e’f’å’æ’2“S“k“|“ýýýýýýýýýýûùùùùùùýýýýýýý÷ùùù'‘’“›œž©¾ËÑÒâæêòóÿ cd|}~†‡‘‘É‘.’/’H’I’J’T’U’e’‹’œ’¼’½’Ö’×’Ø’â’ã’æ’ç’““2“@“S“`“j“k“w“Ú“Û“ê•î•Ñ–Ò–ê–ë–ì–ó–ô–˜÷îêîêççêçêçêççêâÚââØêâÐââêØâÈââÁ¿Áççêç¼Øâ´ââj>UNH jUj”=Uj=U6jœ<U jU0J(0J(5j0J(5Uj<UF|“}“4•͕̕‹–Œ–¬—­—˜˜8˜9˜t˜u˜•˜Șç˜õ˜ø˜™I™h™|™}™¯™°™À™ü™ šýýýýýýýýýýûûûûûûûûûûûûûûûûûûû šš šjš‰šµšËšÌš5›ƒ›œ›ß›ð›ñ›34íîÝžŸ/ŸaŸrŸsŸË ¡3¡J¡[¡ýýûùùù÷÷ûùùù÷÷÷÷÷÷ûùùù÷÷õùùù'˜š š!š5š6šjšxš‰š–š´šµšÁš ››/›0›5›6›P›Q›ƒ›‘›œ›©›À›Á›Ù›Ú›Û›Ü›Ý›ß›ë›Pž^ždžež}ž~žž‚žƒžΞϞݞޞôžõžŸ$Ÿ/Ÿ<ŸaŸmŸÏŸПË Ì à á ¡ ¡3¡@¡I¡J¡V¡T¢U¢ˆ¢Œ¢Û£Ü£õ£ö£÷£ýöôöññíñëèöôöññíßí×ßíßíñëÒÊÒÒèöôöññíñèöôöññíñèÈÒÀÒj‚?U5j?U jUjŒ>Uj0J(5UNH60J(50J( jUCJL[¡\¡÷¡[¢\¢‡¢ƒ¤„¤¥¥œ¥½¥Ø¥ó¥¦¦¦O§{§–§¨§¹§º§ñ§2¨^¨x¨°¨è¨ýýýýýûýýýýù÷÷÷÷ýýù÷÷÷ýýòòòòò & FT'a÷£ÿ£¤_¤`¤x¤y¤z¤€¤¤œ¥¥°¥±¥½¥Ë¥Ø¥å¥ò¥ó¥ÿ¥¦ ¦‰¦Ϧ §3§{§‰§–§£§§§¨§´§ñ§ò§¨ ¨2¨3¨B¨C¨^¨_¨l¨m¨x¨y¨‹¨Œ¨°¨±¨èĨè¨é¨û¨ü¨ ©!©3©4©©©¥©¦©º©»©תÛª²«Ù«g¬Ÿ¬¡¬¢¬½¬¾¬ЬÞ¬ë¬ø¬ü¬ý¬ ­k­l­È­úúòúúëéëææâææààææâæëéëëéëëéëëéëëéëëéëëéëÝëéëàààëéëææâæÝNH60J(50J( jUjÿ?U jUWè¨ ©¥©Ü©Ý©›ªx«Û«¡¬Ьë¬ý¬­­Q®Ÿ®º®Õ®æ®ç®k°l°¸°Űî°±1±2±úúúôòòððîìììòòîìììòòòòêêêêê'a Æ_¾$ & FTÈ­É­® ®!®"®#®(®)®.®/®G®H®I®N®O®Q®R®o®p®Ÿ®­®º®Ç®Ô®Õ®á®¸°q±r±s±ޱ±Á±ϱܱé±ö±÷±²²²βϲ'³(³H³I³‰³—³ã³ä³V´c´p´q´}´‚´‹´Rµ×µƒ¶„¶â¶ã¶d·e·}·~··…·†·ˆ·‰·«·¬·ì·ú·F¸G¸ýøðøøøèøøáßáÜÜØÜÓáßáÜÜØÜÜýáßáÜýÜØÜÜÑýýøÉøøáßáÜýjpAU6OJQJ0J(50J( jUjõ@Ujz@U jUNHO2±c±q±r±Á±ܱ÷±²²²'³‰³V´q´‚´´´ˆ·ì·¹¸Ô¸å¸ò¸ó¸Í»/¼J¼e¼v¼ýýûù÷÷÷÷ûûù÷÷÷÷ûûù÷÷÷÷ûûù÷÷÷'G¸¹¸ƸÓ¸Ô¸à¸å¸î¸U¹V¹µ¹:ºS»T»©»ª»»ûĻʻ˻ͻλë»ì»/¼=¼J¼W¼d¼e¼q¼v¼¼á½â½ú½û½ü½¾¾¾#¾X¾Y¾x¾y¾ƾÔ¾á¾î¾û¾ü¾¿ ¿¿x¿y¿šÀ›ÀÁÁ!Á"Á4Á5ÁNÁOÁ•Á£Á°Á½ÁËÁÌÁØÁÝÁæÁÅťŦÅÃÅÄÅÆÆýùýýöôöïçïïàÞàýýùýýïÖïïôàÞàýýùýýööàÞààÞàýýùýýöàÞàýjfBU jUjëAU jU6NH0J(50J(Tv¼ƒ¼„¼X¾ƾá¾ü¾ ¿¿¿ÁÁ•Á°ÁÌÁÝÁþÁÿÁiÅ¥ÅÆÔÆïÆÇ ÇÇ~ÈèȵÉÐÉýûûùýýýýûûûùýýýýûûûùýýýýûûùýý'ÆaÆbÆÔÆáÆîÆïÆûÆÇ ÇvÈwÈ~ÈȡȢÈèÈöÈBÉCɵÉÂÉÏÉÐÉÜÉáÉêÉùÊúÊËËMËNËQË_ËlËyˆˇ˓ËÍÍ7Í8Í9Í?Í@ÍBÍCÍWÍX͎ͩ͜ͶÍÃÍÄÍÐÍÏÏ*Ï+Ï,Ï2Ï3Ï5Ï6ÏRÏSϖϤϱϾÏËÏÌÏØÏ[Ñ\ÑtÑuÑvÑ|ÑýúöúúýïíïúýúöúúïíïêúúöúåÝååïíïúúöúåÕååïíïúúöúåÍåj×CUj\CUjáBU jUNH jU0J(50J(NHQÐÉáÉíÉîÉùÊQËlˇ˘˙ËBÍŽÍ©ÍÄÍÕÍÖÍ5ϖϱÏÌÏÝÏÞÏÑÎÑéÑÒÒÒÐÓÔýýûûùýýýûûùýýýûûùýýýûûùýýýûûù'|Ñ}ÑріїÑÎÑÜÑéÑöÑÒÒқӜӬӭÓÅÓÆÓÇÓÍÓÎÓÐÓÑÓíÓîÓÔ+Ô8ÔEÔRÔSÔ_Ô$Õ%ÕšÕ›Õ»Õ¼ÕùÕÖÖ!Ö.Ö/Ö;ÖœÖÖ¶Ö·Ö¸Ö¾Ö¿ÖØØ-Ø.Ø/Ø4Ø5Ø8Ø9ØRØS؅ؓؠحØÍØÎØçØèØéØñØòØóØôØÙ1Úúóñóîîêîçúßúúóñóîîêîçóñóîîêîú×úúúÏúúóñóîîúÇúúêîjÇEUjJEUjÍDUjRDUNH0J(50J( jU jUNÔ8ÔSÔdÔeÔšÕùÕÖ/Ö@ÖAÖÓ×7Ø8؅ؠØôØÙÙ1Ú}Ú˜ÚìÚýÚþÚ;ܧÜÂÜÝÜîÜýýýûûùýýýûûûûùýýýûûùýýýûûùýýý'1Ú2ÚLÚMÚ}Ú‹Ú˜Ú¥ÚÅÚÆÚßÚàÚáÚéÚêÚëÚìÚøÚ¿ÛÀÛ ÜÜ;Ü<ÜRÜSÜaÜbÜyÜzܧܵÜÂÜÏÜÜÜÝÜéÜJÝKÝÿÝÞÞÞÞ#Þ$ÞÙÞÚÞßß2ß3ß[ßißv߃ߕߖߢßËàÌàæàçàá'á4áAáyázá†áæáçáÿáââââgâhâ‘â’â¨â©âù÷ùôôïçïïãôààù÷ùù÷ùôôãôàïØïïàù÷ùôôãôù÷ùôôãôïÐïïàù÷ùj>GUjÁFUNH0J(5jDFU jU0J( jURîÜïÜTÝ'Þß[ßvߖߧߨßËàá4ázá‹áŒá‘âÙâôâãIãiãzããŽã¿äpåGæeæýýûûù÷÷÷ýýù÷÷÷ýýù÷÷÷÷÷÷ýýýõ÷'a©âÙâçâôâÿâã!ãHãIãYãhãiãuãzãƒãNäOäšä›ä³ä´äµä»ä¼äLåMåeåfågålåmåpåqå‹ååªå«åÇåÈåäåæåææGæUæeærææŽæ¦æ§æ¨æªæ«æ¶æ·æÏæÐæÑæÓæÔæÚæÛæóæôæõæ÷æøæççç¦è§èýýýùýùýýöñéñññáññÚØÚØÚÚØÚØÚýýùÏùÇÏùÏùÏù¿ÏùÏùÏù·ÏùÏùýöj¥IUj*IUj¯HUj0J(5U jUj4HUj¹GU jUNH0J(50J(HeæçcçdçFèâèãèìèéOéYéZésé ëWëìì%î&îtïuï”ð¸ð0òdóEôCö±ùýýûûûûûùùùû÷ûõõõõððððîìììììea & Fa'§èìè'é(é@éAéBéFéGéYéwëŒëêìëìCíDíPîeîïï2ï3ï4ï9ï:ï6ð7ð}ð~ð¸ð»ðÒðÙðßðæðññ0ñ1ñ2ñ7ñ8ñ‚ñƒñ›ñœññ¢ñ£ñÀñÁñÙñÚñÛñàñáñòñùñ0ò3òJòSòYòbò•ò–ò®ò¯ò°òµò¶òûòûæòûòûäááäÜÔÜÜááÒääÜÊÜÜÜÂÜÜܺÜÜäÒääܲÜÜj‡LUj LUj‘KUjKU5j›JU jUNH6j JOJQJUjOJQJUOJQJF¶òîòïòóóóóó"ó#ó@óAóYóZó[ó`óaódógóˆóŽó¾ó¿ó×óØóÙóÞóßóüóýóôôôôôEôIôLôMô|ô•ô¤ô§ôëôìôõõõ õ õööö ö8ö9ö:ö@öAöCöFöpöqöçöìö\÷h÷²÷³÷Ë÷Ì÷Í÷Ñ÷ýøðøøøèøøæäøÜøøøÔøøæÐæääøÈøøýøÀøøæÐæääø¸øjäOUjiOUjîNU56jsNUjøMU65j}MUjMU jUNHHÑ÷Ò÷ø&ø?ø@øƒø„øœøøžø¨ø©ø¿øÊøîøõøAù°ùåùèù¦ú©úÀúÉúÏúÙú û û%û&û'û.û/û@ûIûpûqû€û‚ûšû£û©û³ûêûëûüüü ü üüüýý-ý.ý/ý7ý8ý;ý=ýŠþŽþ”þ•þWÿXÿpÿqÿrÿ|ÿ}ÿµÿ»ÿÉÿÏÿ úøõúíúúøøëëëøøúãúúøõëøøúÛúúëúÓúúëëÏëúÇúúøøøjKRU56jÐQUjUQUjÚPU5j_PUNH6 jUN±ù²ùåù¦ú€ûü;ýúý9þŠþº›–ÓpÍûX˧í å ­ Á4=>ýûýýýýýûùýýýýýýýýýýýýýýýûùùùùe ’˜©ªº½› –›ÓÖptÍÐûÿPQX[Ëϧ«¯°ÅÎÒÓÜÝñóCD\]^bc‡ˆ ¡¢§¨°¹ÁÅÙÚ01OWu€…†÷ø     3 > ž Ÿ ï ð   F G } ì í ð ýúøøøøøøøúøøøôøôøôøôøôøïçïïïßïïýýúúýýúï×ïïýúúýúøøj¼SUjASUjÆRU jU565NH6Uð Ý Þ å ð ? @ ­ ± JKcdefgstqrŠ‹Œ“”¤¥ÁÅßàøùúõökl„…†‹Œ«¬ÄÅÆËÌ-./9:>EF[\ns|‡‰ýûýûöîööýöæööýûöÞööýöÖöööÎöööÆööú¶ºÃ²Ã²Ã0J(60J(j0J(U0J(jžVUj#VUj¨UUj-UUj²TUj7TU jU5NHD‰¤©3>‡ˆ ¡¢¬­°¸¹ÏÐâåèþÿ45DÜäåýþ&+4?AQY§¬®¹øù  $%&01yµ¶º»ÂÚ#$9:FþÿûõûõûìûäìûìûáØÔØáÐáûÊûÊûáØÔØáûáØÔØáÐáÐáÐáûõûõûõûÊûìûÂìûìûõûÊûÊûáûÊûØÔØá¿ØNHj–WU 0J(5NH0J(60J(j0J(U0J(jWUj0J(5U 0J(560J(5K>°ÜÂ#$qRò, M s „ …  !%"Y"z"´"Å"Æ"#4$Š$«$Ï$à$ýýýýýýýýýýûùùù÷÷÷ûùùù÷÷÷ûùù÷'d23A qr‘«¯°º¼/0AB[\]abÙÚóôõúûRSlm‚ŒŽòó  , : M Z r s  á â j!k!Ý!Þ!ö!÷!ø!ü!ý!%"&"6"7"Y"g"z"‡"³"´"À"ûòïìòûòïèâèïìÝÕÝÝÝÍÝÝìòûòïèïÆÄÆïïÀïììݸÝÝÆÄÆïïÀïj YU0J(5 jUjŽXUjXU jU 0J(6NH0J(6NH0J(j0J(U0J(HÀ"y#z#ì#í#$$$ $ $4$5$S$T$Š$˜$«$¸$Î$Ï$Û$—%˜%í%î%©&ª&d'g'Å'Æ'Þ'ß'à'ä'å'k(p(**§*¨*¸*¹*Ú*è*û*+3+4+@+Ü+Ý+õ+ö+÷+û+ü+,,v,w,~,,ž,Ÿ,Ü,ê,ý, --$-é-ê-ý-þ-.&.9.F.p.q.ýøðøøéçéääàäýýýÞøÖøøÞýéçéääàäøÎøøýýéçéääàäéçéääàj|ZUjZU60J(50J( jUj†YU jUNHQà$á$ú&û&Š(‹(Ä(ï()+)C)D)r)É)á)â)E*§*Ú*û*4+E+F+},~,Ü,ý,-)-ýýýýýýûûûûûûûûûûûù÷÷÷ýýýù÷÷÷')-*-è-é-.9.q.‚.–.—.µ.7/£/Ä/ä/ø/<0M0`0a0U1ž1¿1ç1ø1 2 2m2ˆ2ýýýûùùùùýýýûùùùùùùýýûùùùùýý÷a'q.}.‚.‹.µ.7/8/V/W/£/±/Ä/Ï/ä/ñ/÷/ø/0;0<0H0M0V00111I1J1K1Q1R1T1U1V1o1p1ž1¬1¿1Ì1æ1ç1ó1ø122f2g2n2r2‰22Â2Ò2"3_3a3o3œ3¦3Ò3Þ3ý3¬4­4Æ4Ç4ô45 55%5&52575@5E5£5¤5?6ñ6ò67777"7#7/707ýýûôòôýýýîýîýýéáééûôòôýýîýýîÞûûûûûûûûôòôýýîýýîÞûôòôôòôôNHj÷ZU jU0J(5 jU50J(Xˆ2Á2`3›3Ñ3ý3¬4ô4 5&575F5G5?6ð6ñ6n7ˆ7¶7·7·8Œ:Ò:é:;;!;";Ž;ýýýýýûù÷÷÷÷ûòûûù÷÷ûûûù÷÷÷÷ûûa & F'a07B7C7n7|7ˆ7“7µ7C8D8]8^8_8a8b8“8”8­8®8¯8³8´8I9J9c9d9e9l9m9ò9ó9 : ::::h:i:‚:ƒ:„:ˆ:‰:Œ::¢:£:Ò:à:é:ö:;;;; ;G<H<_<`<a<e<f<==°=6>ó>ô>…?ýöóóîéáéééÙéééÑéééÉéééÁééöýöóó½óó½éµéé²°²5NHjã]U0J(5jf]Ujé\Ujl\Ujï[Ujr[U jU B*phÿ0J( jUEŽ;¹<„=q@·@Î@é@ú@AAjACaCxC“C¤C³CÄCÅCýDµEÖEòEFFFOGPG™Gúúøöôôôôøøúöôôôôôøøöôôôôøøøø' & F=…?T@U@q@r@‡@ˆ@·@Å@Î@Û@é@õ@ú@AAcAdABB,B-B.B3B4BÜBÝBôBõBöB÷BøBCCCC*C+CaCoCxC…C“CŸC¤C­C²C³C»CDD1D2D3D8D9DýDþDEE'E(E@EAEQEREjEkE{E|E“E”EµEÃEÖEãEòEþEF FýùýòðòííéííéæáÙáááÑááæòðòííéííéíáÉááòðòòðòòðòòðòííéííjR_UjÙ^Uj\^U jUNH0J(50J( jU5NH5O FFAFMF®FºF8G9G›G¥GÏGØGLHVHÆHÑHGIRIêIëI@JNJ€JŠJÓJÝJùJK KKgKpKŸKÏKÐKèKéKùKúKþKÿKLL!LCLML`LjLÅLÆL1M:M_MMŽM¦M§M·M¸M¼M½MàMðMúM NNqN{N´NµNÍNÎNÏNÕNÖNèNöN)OûùùöòòòòòöðùùùùùðéðßðéðéðÛðùùöùðéðÑðéðéðùùùÌÄÌÌðjÅ`U jUjJ`5U5NHjÏ_5U j5U556NH60J(5M™GÍGJH’H“HÄHEIóIôI@JLÑMéNSPTPÃPÄPÓPQ%Q&Q5QgQwQ|Q‹QÆQÖQ×Qýýýøøýýööôôôôöööòòòòòòòòòòòòa & Fa)O5O:OFO®O¹OÙOäOýOþOPP7P8P9P?P@PRPSPÄPCRDRXRYR…R“R¦R³RÇRÓR8S9S¾S¿S×SØSÙSßSàS%T(ThTlTÍTÐT4U7U•U˜UáUâUúUûUüUVV&V'VW‚WšW›WœW£W¤WæYçYÿYZZZ Z­\ýýýýúõíõõëèáßáÜÜØÜúõÐõõëëëëëõÈõõúõÀõõõ¸õõj,cUj±bUj6bUj»aU0J(50J( jUCJ5j@aU jUNH6H×QåQ4RCR…R¦RÇRØRÙR=S>S%ThTÍT4U•UµU¶U/V¾VX>X”X#YyZ³Zýýýûùùù÷÷÷÷õõõõõ÷÷ðââ×ðââ „hdð¤^„h & F= ÆhЄÐ^„Ð & F=e'³Z [ê[@]¿]À]U_V_v_È_É_é_>`?`Ç`$aqaˆa¨aÔaòabbbØbôïáôôÚØØÖØØÖØØÖÔÒÒÒÒÒÒØØ'dð¤ & F= ÆhЄÐ^„Ð & F= „hdð¤^„h­\®\Æ\Ç\È\Ï\Ð\é]ê]^^^ ^ ^K_L_v_È_é_>`—`˜`Ç`$a%a?a@aqaaˆa“a¨aµaÔaäañaòaþab bb[b\btbubvb{b|b-c.cFcGcHcMcNcTcUccŽc¤c¥cÕcãcøcdd%d*d3d¢d£d eueve²eúòúúúêúúçââçâÛÙÛÖÖÖÒÖÒÖÖÒúÊúúúÂúúçÛÙÛÖÖÒÖÖçÀ¼À5NH5jeUjdU0J(50J( jUOJQJNHj"dUj§cU jUJØb]c^ccÕcøcd*dAdBd®d e²e&f'f¼f½fßf g!grg•g°gÁgÐgÑg¯hñhòhýýýûùùùùýýýýýýýýý÷ýûùùùùýýýý'²eEfFf_f`fafifjfßf g!g"g8g9grg€g•g¢g°g¼gÁgÊgqhrhŠh‹hŒhh‘h¨h©hEiFi^i_i`ieifiÝiáiëiïiùiüi[j`j®j³jýjkkk)k*k+k2k3k5k8kHkIkakbkckjkkkmkpk~kk—kúòúúíæäæááÝááúÕúúÒúÊúúÈÈÈÈÈÈúÀúúÈú¸úúÈújgUjgU5j‹fUNHjfU0J(50J( jUOJQJj“eU jUFòhÝiëiùi[j®jýj5kmk¡k×kbl©lìlBmYmZmnnÊoËo p'pEpkp|p‹pŒp,qýûûûûûûûûûù÷÷÷÷ýýýýýõ÷÷÷÷÷ýý'e—k˜k™kžkŸk¡k¤k´kµkÍkÎkÏkÔkÕk×kØk÷kùkllblpl©l¶lÊlËlãlälålêlëlìlølBmKm¬m­mÅmÆmÇmÌmÍmn n1o2oKoLoMoToUooÉoËoÌoâoão pp'p4pEpTpjpkpwp|p…pŠpìpíp6r7rt÷òòðòèòòáßáßáÜÜòÔòòÐÜÜòÈòòÄò¼òòÄáßáÜÜÐÜÐÜÜй¹NHjèiU5\jmiU0J(5jòhU0J( jUjwhU5 jUjügUI,qNrOr)s*sÊtËt,u¶uFvGv^v¹viwjwÁwXxYxy7yVy|yyŽySz´{µ{ýýýýýýýûûýýííýýëýéççççýýýý' & FA Æh¤„¤^„¤ett t!t"t't(tStTtktltmtrtst,u/u¶u¹u!v"v:v;v‚ǂȂá‚â‚ã‚ë‚ì‚ö‚û‚—ƒ˜ƒ¯ƒ°ƒÀƒÁƒɃʃÔƒÚƒ+„1„‚„–„úøúðúúøøøøøøøúèúúøøøååúÝúúøøøúÕúúøúÍúúøøÈ B*phÿj´nUj7nUj¼mUNHjCmUjÈlU5 jUO–„ÄĄ݄ބ߄ç„è„é„ê„ï„3…8…„…Š…Õ…Û…&†+†˜†™†²†³†´†¼†½†džÚ† ‡ ‡&‡'‡(‡0‡1‡4‡9‡Ї‹‡‘‡–‡ç‡è‡î‡ó‡'ˆ+ˆaˆfˆ™ˆžˆ׈܈c‰i‰cŠdЇЙŠS‹]‹zŒ…Œ ,±²ÉÊËÒÓJŽKŽbŽcŽdŽlŽmŽyŽúòúúíëëëëëúãúúíúÛúúëØëØëëëëëëØëëëëúÐúúúÈúújqUj¤pUNHj'pUjªoU5 B*phÿj-oU jUO'ˆaˆ™ˆ׈c‰ŠŠkŠlŠS‹zŒ (ŽØ‘i“ç”蔾•ù• —‘˜’˜C™‘™ß™ýýýýýýûûöèèèèèèèââèèèØØèè  Æ_¾$„h^„h„h^„h & FC ÆhЄÐ^„Ð & F²eyާŽìŽíŽ˜™ýþ !-f%‘&‘=‘>‘?‘F‘G‘Û‘Ü‘ó‘ô‘õ‘ý‘þ‘ ’8’ “ “a“b““Ž“§“¨“©“±“²“¾“”è”ý”c•d•}•~••‡•ˆ•¾•Еø•–N–O–––—–®–¯–°–·–¸–—— — —1—2—K—ýúúõíõõýõåõõõÝõõýúúõÕõõýÐõÈõõýýúõÀõõúýõjýsUj€sU B*phÿjsUjŠrUjrUj–qU jUNH5HK—L—M—U—V—b—Ä—’˜§˜ܘݘö˜÷˜ø˜™™C™S™‘™¡™ß™ð™š,šTšdšš£šÌšÝš[›h› œ œžœ°œÚœÛœQfŽÕêžžpžqž|ž}ž•ž–ž—žžžŸžãžäžaŸbŸzŸ{Ÿ|Ÿ‚ŸƒŸ—Ÿ¹Ÿ½ŸП q Ý ¡v¡÷òòðëòãòòððððððððàðàðàðààòØòòàòÐòòëË÷ÃËÃ5B*OJQJ\phÿ5OJQJ\OJQJjëuUjpuUNHjótU B*phÿ5 jUjvtUHß™šTššÌš[›‚œƒœ56¹º†Ÿ‡Ÿ½ŸПÝ ñ ò ¡v¡Š¡‹¡¡¡ñ¡í¢£ññññññïêïêäêïïââââââââââââ Æ_¾$ & F² & FC ÆhЄÐ^„Ðv¡¡¡7¢Ø¢í¢£v££Ž££¦£§£Þ£ì£ø£¤¤"¤8¤9¤B¤E¤V¥W¥n¥o¥p¥w¥x¥¤¥¥¥Á¥Â¥ï¥ý¥ ¦¦L¦X¦]¦f¦p¦:§;§º§»§Ó§Ô§Õ§ß§à§õ§ ¨ ¨8¨9¨T¨U¨h¨i¨¨‚¨’¨“¨«¨¬¨¼¨½¨Õ¨Ö¨û¨ ©©"©ûóçóûóûàÞàÛÛ×Û×Û×ÒÊÒÒàÞàÛÛ×ÛÛ×ÇÒ¿ÒÒ½¹½àÞààÞààÞààÞàÛÛ5NH5jßvUNHjfvU jU0J(50J( jU5B*OJQJ\phÿ5OJQJ\OJQJI£££H£v££Ž£Þ£ø£¤9¤F¤G¤¤¥ï¥ ¦L¦]¦p¦q¦8¨û¨©1©W©h©v©w©¯«ýýýýýûù÷÷÷÷ûûù÷÷÷÷ûûù÷÷÷÷÷ûû'"©1©@©V©W©c©h©q©u©¤©¶©0ª1ªTª[ªê˪x«„«‰«Š«¢«£«¤«««¬«É­Ê­â­ã­ä­ê­ë­í­ð­ÿ­® ®®Ú®Þ®í®õ®í¯°/°0°I°J°K°S°T°V°Y°i°r°%±@±I±q±…±±‘±š±DZαÞ±ç±ÿ±²²² ² ²²²&²ûøûøøûöóöööîæîîîÞîîÜööÜö×îÏîîÜöÜËÜöööööÇöÁÜö 5OJQJ6NH56jPxU B*phÿ5jÕwUjZwU jUNH60J(0J(5L¯«0­1­í­Ú®í¯V° ²±²²²"³#³3´Æ´µçµA¶œ¶¶>·?·°·±·$¸%¸x¸—¸ýûûùùùùùùûûôïïéïïûôûôãôûûá Æ_¾$„Å^„Å & F´ & F³ef&²y³z³™³¤³´´+´,´3´:´Y´`´Æ´дí´õ´µ&µŒµµ¦µ§µ¨µ°µ±µϵеçµñµ¶¶A¶J¶h¶p¶ ··(·/·4·<·y··Ž·•·£·®·¸¸¸ ¸¸"¸S¸u¸ú¸@¹X¹b¹§¹Á¹Ĺֹ#ºFºyº‹ºŸº§º©ºɺëºõº»»)»I»p»ýûûýùûùûôïçïïýùûùûûûûûûûûãûûôôôôÞÖÊÖÞÖÊÖÊÖÞÖÊÖÊÖÞÖ5B*OJQJ\phÿ5OJQJ\OJQJ6NHjÍxU jU B*phÿ56NHP—¸™¸»¸ظú¸¹@¹n¹p¹q¹ĹÖ¹#º6º7ºFº©º¹ºººɺ)»9»:»I»’»¢»â»ü»E¼ýýýýýýýýûûýýýýýýýýýýýýýýýù÷÷'p»€»’»¢»£»¹»º»â»ð»ü» ¼E¼Q¼V¼_¼d¼нª½¯½´½¹½º½Ò½Ó½Ô½Û½ܽ޽߽ø½ù½ú½¾¾¾¾¾¾¾$¾%¾'¾(¾@¾A¾B¾G¾H¾§¾¨¾>¿?¿X¿Y¿Z¿\¿]¿a¿b¿x¿y¿z¿óëæßÝßÚÚÖÚÚÖÔÔÏÇÏÏÏ¿ÏÏÏ·ÏÏϯÏϬϤÏÏÏœÏjµ{Uj8{UNHj½zUjBzUjÅyUjJyU jU60J(50J( jUOJQJ5OJQJ\5B*OJQJ\phÿ=E¼V¼d¼e¼½kÀ¹ÀÓÀÁ Á,Á-Á«ÁÂ3ÂUÂfÂ}Â~µÂÃÂÃ/ĨĩÄåÅ+ÆEÆ`Æýýûûûùýýýýûûùýýýýûû÷÷÷÷òòùýýa & Fa'z¿’¿“¿°¿±¿í¿î¿ÀÀGÀHÀaÀbÀcÀgÀhÀkÀlÀ‰ÀŠÀ¹ÀÇÀÓÀàÀÁÁ Á)Á,Á‹ÁŒÁ«Á¬ÁÁÁÂÁÂÂ3Â@ÂUÂaÂfÂoÂ|µÂÂÂZÃ[Ã~ÃŒÃÁÃÍÃ.Ä5ħĩÄÑÅÒÅÝÅÞÅåÅæÅýÅþÅ+Æ9ÆEÆRÆ`ÆlÆqÆzÆÆ=Ç>ÇáÇâÇ÷ÇøÇ0È>ÈJÈWÈeÈqÈvÈÈ©ÈiÉù÷ùòïòçòòù÷ùääàääàïù÷ùääàääàÞïÞÞÞÞïïù÷ùääàääàïù÷ùääàääà50J(50J(j2|UNH jU jUX`ÆqÆ€ÆÆáÇ0ÈJÈeÈvȪȫÈóÉ<ÊVÊqʂʑʒÊÅÊËË8ËIËXËYËøËRÌlÌÎÌôÌýýûûùýýýýûûùýýýýûûùýýýýûûùýýý'iÉjÉóÉôÉ Ê Ê<ÊJÊVÊcÊqÊ}ʂʋÊÊ¡ÊÄÊÅÊÆÊÛÊÜÊËËË*Ë8ËDËIËRËWË»Ë¼ËøËùËÌÌRÌ`ÌlÌyÌŒÌÍÌÎÌÝÌóÌôÌÍÍÍ:Î;ÎSÎTÎUÎ]Î^Î`Îa΃΄ζÎÄÎÐÎÝÎìÎûÎ Ï ÏÏÏ%Ï)ÏbÏiÏnτϵÏÀÏÞÏæÏ9ÐPÐSÐfÐíÐþÐýöôöññíññíèöôöññíññíýöôöññííñíññãÛããöôöññíñíññíÙÙÙ××××56j¯|U jU B*phÿ0J(50J( jUNHUôÌÍÍÍ`ζÎÐÎìÎ ÏÏ*Ï+ÏÞÏ9ÐíЉъÑ1Ó2Ó?ÔXÔŸÔ¹ÔÿÔÕ5ÕTÕeÕsÕýýûûùýýýýýûûôôôûûûûòòòùýýýýý & FC'þÐÒÒ*Ò+Ò,Ò2Ò3ÒdÒeÒ‰ÒŠÒ¢Ò£Ò¤ÒªÒ«ÒßÒàÒ Ó Ó%Ó&Ó'Ó-Ó.ÓÔÔÔ Ô!Ô"Ô#Ô¹ÔºÔÓÔÔÔÿÔ ÕÕ&Õ5ÕDÕSÕTÕ`ÕeÕnÕrÕÀÕÇÕÔÕÕÕ‚ÖƒÖ›ÖœÖ֧֍֒ד׫׬׭׳״רØ/Ø0ØAØúòúúïúçúúïúßúúú×úúÐÎÐËËÇËÇËËÇÅïú½úúúµúúÐÎÐj‘UjU60J(50J( jUj›~Uj ~Uj¥}UNHj*}U jUGsÕtշ׸×Á×ÑרØÙØóØÙ.Ù?ÙMÙNÙ‹ÙŒÙTÜUÜñÞòÞ»à¼àÉâã-ãHãýýýýûûûù÷÷÷÷÷ýýñãýãýãýãù÷÷ & Fµ ÆÐh„h^„h Æ_¾$'AØBØ[Ø\ØmØn؇؈ؙؚذرØÕØÖØÙØçØóØÙÙÙ-Ù.Ù:Ù?ÙHÙLÙ§Ù¶ÙÚÚÚÚÚ&Ú'ÚdÚjÚÇÚÈÚóÚôÚ Û ÛÛÛÛ»ÛÀÛpÜܥܬÜåÜæÜþÜÿÜÝÝÝ*Þ+Þ‰ÞŠÞšÞ›Þ³Þ´ÞµÞ¿ÞÀÞ ßßBßI߂߃ߛßù÷ùù÷ùù÷ùôññíñíññíëæÞææÜôæÔææÜÐÜæÈææôôæÀææÐÜæj}UjU5\j‡€U6j €U jU50J(50J(NH jUL›ßœßߣߤßÂßÃßààxàyà”à•à­à®à¯à·à¸àààìà‡áˆá á¡á±á²áºá»áÉâÊâéâêâã"ã-ã:ãHãTãYãbãhãpãää7ä8ä9äAäBäÀäÁäÞäßäöä÷äåå&å'å@åAåTåUåhåiåvåwåå‘å¢å£å¾å¿åÒåÓåìåíåæ÷òòïïïòçòòãòÛòòÔÒÔÏÏËÏÏËÏòÃòòÔÒÔÔÒÔÔÒÔÔÒÔÔÒÔÔÒÔÔÒÔjiƒU0J(50J( jUjî‚U5\js‚UNH jUjøUMHãYãhãxãyãÀäæ4æ*ç;çñç}è~èêêKëLëmëîpïûðHó¹÷ù`ûaûŸûÎûýýýûûùýýýýûûûûûûûôôôôôôôîûì Æ_¾$ & FH'æ(æ4æAæTæ*ç6ç;çEç˜é™émë‚ëìì0ì1ìIìJìKìSìTìÎìÏìçìèìéìïìðìîîî.îjîkîƒî„î…îîŽî‘î’îðîñîNïOïhïiïoï‚ï"ð#ðûð ñHóSóOôPô¿õÀõöövöwöŠ÷‹÷¹÷È÷døeøÂøÃøøøûøù$ùïúðú%û+û<û>ûGûHûŸûýýùýýöôöïçïïïßïïöôï×ïïööööôöôôöööööôööÕôöÕÕö6jÚ„Uj_„UjäƒU jU5NH0J(50J(TÎû ü üqüŸüãüäü*ýQý£ýÂýüýþ3þ×þØþ¿ÿÀÿlˆŽð-tu¯Àýûûýýûûýýýù÷÷÷ûûûûòòûûýýûûýý & FK'Ÿû üiüjüqüãü*ýÂýÃýÐýÑýüý þþ+þ3þ>þbþcþ¯þ°þÈþÉþÊþÔþÕþ=ÿ>ÿVÿWÿXÿ\ÿ]ÿCD\]^hily12‰Šßàø‡ˆ’áâøùö÷%&ŽðtÒÓìíûøûûñïñììèìèìãÛãããÓãããËããÉøøøÉûÉøøãÁããøû¾ã¶jC‡UCJjƆU5jK†UjÐ…UjU…U jU0J(50J( jUNHOJQJHíîö÷¯Àˆ ‰ ˜ ™ Ò à ë ö   ‡ ‰ ® ¯ Ý é ) 3 6 7 B C [ \ ] a b “   · Å *Uccd|}~†‡Œ¥¦§¯°þÿ!"–±²Êúú÷ð÷éçéäääâÞØÞäâÕúÍúúËËËËúÃúúú»úúú³úúËúj1‰Uj¶ˆUj;ˆU6jÀ‡UNH 0J(5NH0J(550J( jU CJOJQJCJ jUCÀ   ˆ Ò ë  Ý ò ó ) Ô Õ %&ÔÕ./n×fþ(‰ýýýýûùùùù÷÷ò÷÷÷÷÷÷÷÷÷ðëëëëë & F¥f & FK'ÊËÌÔÕFG_`acdŠ‹£¤¥­®ij‚ƒ„†‡”•Z[hi¦§¿ÀÁÂÃ~—˜™¡¢ÃÑרðñòõöž¶·¸ÀÁ34LMNP÷òòòêòòòâòòòÚòò××ÕòÍòòòÅòòÃò»òòò³òòò«òj„Uj UjŽŒU6jŒUj˜‹U5NHj‹Uj¢ŠUj'ŠU jUj¬‰UC‰j§Å7M°±ñ3ÄÇ7 C Ù Î!n"€'Ý' (Ú(ý(‰)Ÿ)úúúúúúúúúøöññññññññññññññïí' & Fªf & F¥PQStÆÇàáâãäRrsÆ €™š›£¤ûüktùú     ¹ º Ò Ó Ô Ö × Ž!!®!¯!Ç!È!É!Ë!Ì!#"$"M"N"f"g"h"j"k"”"•"­"®"¯"·"¸"B#C#úøúðúúíøéøíúáúúííßú×úúúÏúúíúÇúúíú¿úúú·úúíjåUjjUjïUjtUjùŽU6j|ŽU5NHNHjÿU5 jUHC#ˆ#‰#ç#è#8&9&G&'a(b((‚(š(›(œ((ž(ý(þ())!)")7)8)E)F)\)])‰)—)Ÿ)ª)¿)Ì)***"*+*”*Ÿ*Æ+Ç+ß+à+á+é+ê+ü+ý+,,Í,Ù,¯-°-É-Ê-ø-.....;.R.S.k.l.m.n.o.p.q.}.‚.‹.«.´.Q/ýýýûýöîööçåççåççåçâââÞââûöÖööýûûçåçâââöÎööÞââÌ6jV’UjÛ‘U0J(50J( jUj`‘U jU5NHPŸ)¿)*"*V*W*”*,Í,¯-ø-...q.‚..‘.†/&0<0\0x0‰0—0˜01d1z1š1ýýýýûûùùù÷ýýýýýûû÷ýýýýýûû÷ýýa'Q/R/j/k/l/t/u/†/‡/¡/¢/´/µ/Ï/Ð/â/ã/ÿ/0&040<0G0\0i0w0x0„0‰0’0ë0ì011111115161d1r1z1…1š1§1´1µ1Á1Æ1Ï17282332333q33Š3•3ª3·3½3¾3Î3Þ3ß3ë3ð3ù34I4d4e455Z5[5úòúúëéëëéëëéëæææâææúÚúúëéëæææâææ×ëéëæææâæâææââÑâÑâÈj0J(5U 0J(5NHNHjL“U0J(50J( jUjÑ’U jUOš1µ1Æ1Õ1Ö13q3Š3ª3¾3ß3ð344:6;6À6Q7o7K8L8ß8ý89ª9«9e:¹: ;ýýýûûùýýýýýýûûûû÷ýýû÷ýýýûûûû'[5s5t5u5{5|53646:6f6w6—6˜6±6²6³6½6¾6À6Á6Þ6ß6÷6ø677Q7_7a7b7o7z7£7¤7½7Ã7Ä7Ý7Þ7î7ï7ñ7ò7L8M8j8k8ƒ8„8¡8¢8Ú8Û8ß8í8ï8ð8ý8 93949L9M9N9P9Q9W9X9ûóêûêûäûâÝÕÝÝÎÌÎÎÌÎÉÆÉÁºÁݲÝÝÎÌÎÎÌÎÆÉÆÉûêûªêûêûêj<•Uj¿”U B*NHphÿ B*phÿNH0J( jUjB”U jU6 0J(5NHj0J(5UjÇ“U0J(5CX9p9q9r9t9u9‰9Š999œ9ß9à9˜:¦:¬:­:;;g;h;±;·;À;Á; < <*<-<V<d<“< <º<»<Ô<Õ<ê<ó<&='=-=.=G=H=Š=‹=¼=å=#>N>“>”>??%?/?7?8?m?n?‡?ˆ?‰??Ž?§?ª?Ð?Ñ?ï?ð?@Ž@¦@ûóêûêûäûáÞÜÞÞÞÜÞÞÜááûäûäûáÞÕÓÕÞÎÎÞÜÜÞÉÁÉÉÜÕÓÕÉj2–U jUOJQJ jU5NH0J( 0J(5NHj0J(5Uj·•U0J(5J ; ;‹;Œ; ;ë;7<V<“<°<Å<Ú<ê<-=X=²=Q>R>Õ>Ö>ì>??Ð?@ADAý÷÷÷òòðîîèèèîæýý÷ýýýáááæýß & F¬'„`„' & F« Æ_¾$¦@§@¨@­@®@AAAADAEAcAdA¨A©AcBdB¡B¢B¿BÀBÙBÚBîBýBÿBCÛCÜCDD8D9DwD…DœD¨D³DÀDÏDÐDâDãDçDèDEE E EEE!E"E+E3E4E9E:EŒEE¥E¦E§E¬E­EµE¶EãEäEFFæFçFEGFGQGVGzG{G”G÷òòïïèæèïïïèæèäïïèæèáááÝÝ×ÝÝ×ÝÝ×ÝáïáòÏòòïèæèïïäòj*—U 0J(5NH0J(50J(5 jUNH jUj¯–UODAyA’B¿BêB¸C¹CÃCÓCDDwDœD³DÐDèDøD E"E9E:EãEF¤FQG¶GáGHýûùýûûûùùù÷õõõïïïïõõûýûûûýû'„`„'”G•G–GœGG¶G·GÐGÑGñGòG H H HHHHH/H0HDHSHUHVHªH«HÄHÅHÆHÌHÍHÏHÐHïHðH8I9IªI«I²I³IMJNJ J¡JÌKÍKÓKÔKìKíKîKòKóK÷KLL.L/LMLNLdLeLƒL„LëMìM`NcN÷òòëéëòáòòëéëßÜòÔòòëéëÜÜÜÜËÜòÃòòÀ»ÀëéëëéëÜ®B*CJOJQJhphCJNHCJj™U jèðmHnHujŸ˜UNH5j"˜U jU jUj¥—UDH@HšHÏHIFIfJgJžJ»J¼JKK÷KÿKLL%L.L´LŠM‹M6N_N`NiNqNzNýûöýööööööööûôôîôôýûûûûûèèè$If„]`„]$a$cNdNtNuN}N~N‹NŒN­N`OaOxOyO(P)PyP|P¤P¨PÉPÌPáPâPêPíPQ QEQNQ±Q²QóQôQ:R;RƒR„RQSRSiSjSkSoSpStSwS¡S¢SØSÛSŒT•T¹TÂTÅTÎTàTáT=U>U·U¸UÑUÒUÓUÙUÚUÝUëUVV‹VŒVñäñäñäñäÙÒÐÒÍËËËÍËËËÍÍÍÍÆ¾ÆÆËÍËËËËÍÍÆ¶ÆÆËÍÍjšUj—™U jU5NH jUB*OJQJhphB*CJOJQJhphB*CJNHOJQJhphHzNˆN‘N¡N¢N§N­N®N¯N°NùùùðççVðð$$If–”÷ÖˆâÿèE£0 $] ^ ïîöÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿ4Ö aö $$Ifa$ $$Ifa$$If °N±N²N³N´NµN·N¹N¿NÀNÅNööööeX\\\\\ $$Ifa$$$If–”‚ÖˆâÿèE£0 $] ^ ïîöÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿ4Ö aö $$Ifa$ ÅNÊNËNÎNÐNÖN×NÚNßNöeTöööööö$$If–”÷ÖˆâÿèE£0 $] ^ ïîöÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿ4Ö aö $$Ifa$ßNàNâNåNëNìNñNôNõNøNûNOnTeeeeeenPeee $$Ifa$$$If–”÷ÖˆâÿèE£0 $] ^ ïîöÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿ4Ö aö OOOO O O O O OOOöööeöööööö$$If–”÷ÖˆâÿèE£0 $] ^ ïîöÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿ4Ö aö $$Ifa$ OOOOOOO$OnTeeeeee $$Ifa$$$If–”‚ÖˆâÿèE£0 $] ^ ïîöÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿÖÿÿÿÿÿÿ4Ö aö$O%O(O*O/O0O3O6O7O9ObAbBbEbFb`babŽbœb¥b²bÀbÉbMcNc}d~d–d—d˜dšd›dždŸd½d¾döde ee(eûõûòéûáéûéûõûÚØÚòòòÕÐÈÐÅÐÕнÐÐÚØÚòòòÕеÐÐÚØÚòòjžUj–U0JjøœU jUNH jUj}œUj0J(5U0J( 0J(5NH0J(5G(e1e¸f¹fËfÌfgggg•g–g¯g°g±gµg¶g¹gÆgïgðgh h h h hhh(h)h*h,h-h2h3hLhMhNhPhQh~hh„h…h‘h›hœh´hµh¶h¸h¹h¿hÀhÇhÈhèhéh/i=iFiSiti‰iŠi“i¤i¥i·i¸i€jýöôöýñìäììýà×àÏ×à×à×àÇ×à×à×à¿×à×à¹àý×à±×à×à¹àöôöýýàýñýj~ U 0J(5NHj Uj†ŸUj ŸUj0J(5U0J(5jŽžU jUNH jU0J(F7e8e·f¸fg¹g…hÇh/iFiŠi·i¸i]kk´kìkýkþk¸m n!nSncndn±oõo pBpýýýûùùù÷ùùùùý÷ùùùùý÷ùùùùý÷ùù'€jj]k^kukvkk«k´kÁkÔkëkìkõkýkþk9m:mžmŸm¸m¹mØmÙm nn!n.n>nRnSn\ncndn»n¼n«o¬o±o²oÎoÏoõop pp;p°v°|°’°ž°Ȱɰ ± ±*±0±J±P±ýúýýýýúýýýúýúýúýúýúýýúýúýúýúýúýúýýýýýýúýýýýýýýúúýýNH5cï¬6­J­‚­Ê­í­3®R®Ú®ý®-¯E¯e¯”¯¾¯é¯°%°8°v°‘°’°)±*±J±^±_±š±›±ýýýýýýýýýýýýýýýýýýýýóýýýýýýñ g„„^„`„gP±_±m±ʱ˱ß±à±á±fÊgÊhʛʜʰʱʳÊãÕäÕåÕæÕëÕìÕòÕóÕõÕöÕ÷ÕøÕ*Ö+ÖOÖPÖQÖaÖbÖcÖdÖiÖjÖpÖqÖtÖuÖvÖwÖ©ÖªÖÎÖÏÖÐÖàÖáÖâÖåÖýøøðøøøêðêøçàçàØàçÕÎÕÄοÎÕçàçàØàçÕÎյοÎÕj}©CJU0JCJj¨CJU jCJUCJ0JmHnHu j0JU0J mHnHumHnHsHu jU55›±¡±ɱʱá±ü±²'²=²U²j²²²Ÿ²¸²ɲà²õ²³³6³O³d³}³œ³©³¸³ϳݳýûù÷ññññññññññññññññññññññññ9 Æå +ݳí³´´&´=´S´d´z´Œ´¢´¿´×´è´ú´µ%µ8µFµ\µoµ}µ•µ­µɵáµ¶¶&¶6¶ùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå 6¶E¶Z¶s¶޶¬¶¾¶˶Ù¶ê¶···)·7·C·M·d·u·Ž·¤·¾·Ñ·å·ø· ¸¸.¸C¸X¸ùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå X¸f¸v¸‚¸–¸§¸¸¸˸߸ð¸û¸¹¹0¹:¹H¹V¹e¹t¹‰¹š¹²¹Á¹Ó¹á¹ø¹ ºº*º8ºùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå 8ºSº`ºrºº‘ºŸº­ºººÓºìºÿº»»1»C»V»l»~»“»¨»¶»É»ß»ï»¼¼ ¼9¼E¼ùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå E¼X¼m¼~¼‘¼©¼¹¼Ƽ׼꼽½,½;½G½_½o½y½½¤½º½ȽÛ½õ½ ¾¾+¾:¾M¾c¾ùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå c¾r¾~¾¾Ÿ¾¯¾¼¾̾Û¾ñ¾¿¿¿/¿@¿S¿e¿}¿“¿ª¿½¿Ñ¿ê¿÷¿À À6À?À\ÀuÀùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå uÀˆÀ›À©ÀÀÀØÀúÀÁ*ÁBÁZÁgÁ€Á–Á¢Á¯Á¼ÁËÁÞÁíÁÂÂ%ÂHÂZÂu‡—¦¹Âùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå ¹ÂÌÂåÂù ÃÃ<ÃSÃfÃvÇÙçûÃÎÃêÃÿÃÄ/Ä@ÄRÄhĀĘĬĻÄËÄâÄöÄ Åùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå  Å#Å4ÅOÅbÅtňŜűÅÄÅÒÅèÅüÅ ÆÆ,ÆCÆSÆcƀƚƩƻÆÏÆãÆñÆÇÇ.ÇGÇùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå GÇZÇrDžǓǠǮǾÇ×ÇåÇöÇÈÈ,ÈAÈOÈfÈyÈȟȵÈÄÈÕÈëÈûÈÉ,É?ÉQÉmÉùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 Æå mÉzɊɜɰɺÉÈÉÔÉæÉûÉÊ,Ê<ÊTÊfÊgÊiʲʳÊÇÊØÊàÊïÊËË(Ë8ËCËùùùùùùùùùùùùùù÷÷õõïïïïïïïïï9 ÆE +9 Æå CËSËeËqËËËˬ˸ËÊËßËìËÌÌ&Ì3ÌFÌUÌaÌkÌzÌ‹Ì̯ÌÉÌØÌçÌôÌ ÍÍùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 ÆE Í2Í>ÍGÍZÍlÍ͌ͤ͵ÍÄÍÙÍêÍúÍ ÎÎ'Î6ÎGÎXÎiÎvÎΒΞαξÎÒÎàÎóÎùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 ÆE óÎÏÏÏ1ÏBÏTÏdÏuσÏϢϱϹÏÇÏÖÏæÏùÏ ÐÐ#Ð8ÐLÐ[ÐkÐ}ÐМЮÐÀÐùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 ÆE ÀÐÍÐàÐóÐÑÑÑ+Ñ=ÑVÑnÑёѢѶÑÏÑáÑðÑÒÒ Ò0Ò?ÒJÒ`ÒuÒ‹Ò›Ò«Ò»Òùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 ÆE »ÒÍÒÞÒðÒÓÓ&Ó6ÓFÓWÓkÓÓ•Ó§Ó¸ÓÐÓÙÓâÓîÓüÓ ÔÔ,Ô>ÔOÔ^ÔjÔzÔ…ÔŽÔùùùùùùùùùùùùùùùùùùùùùùùùùùùùù9 ÆE ŽÔÔ­Ô»ÔÈÔÖÔãÔøÔÕÕ'ÕBÕ\ÕjÕwÕˆÕšÕ¨Õ´ÕÇÕÔÕãÕäÕæÕ÷ÕøÕcÖdÖvÖùùùùùùùùùùùùùùùùùùùùù÷÷ò÷÷÷ò$a$9 ÆE vÖwÖâÖãÖäÖåÖýýýýý2 0 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° Ä3 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° P Å/ 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° Ä2 0 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° P2 0 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° Ä2 0 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° P2 0 0h1hP°‚. °ÆA!°Š"°Š#Š$n%° Ä»DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Jhttp://www.synthesis.ch/yXô;H¯,‚]Ä…'c¥«º“Ddõ*e c èèð€² ð c ð\AÁ8¿ÿLogo-Quadrat, alleinstehen ð€Rðæ’O91ÍîÐü¹»s"œµ!ÿÂ’ÿ- Fðº’O91ÍîÐü¹»s"œµ!ÿÿØÿàJFIF,,ÿîAdobedÿÛ„         ÿÀ*õÿÝ?ÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?ôjþoÔ/õô´ÓÒÚÆá­¿Ò½b䨿»øw®*­ÿ!þÔÿôõŠ»þB/ý©ÿéëwü„_ûSÿÓÖ*™èÿâ2þ™ú§*Gê~¥)¿.^§ÑJb©†*—ëâ1~†ú§*Ÿ[랥)·>ŸÓZâ©gü„_ûSÿÓÖ*ïù¿ö§ÿ§¬UßòíOÿOXª+Mÿ}mIþŽú?«zþ­iðÓŸÃ×®*œâªÿ_ú¤Ÿ£ý/®Pz>¿/JµåÃâéኤòíOÿOX«¿ä"ÿÚŸþž±WÈEÿµ?ý=b­¯ü¬>C—èŽ5ø©õšÓÛdX«±V:ßò°ù?¢8×á¯ÖkO|U¯ù¿ö§ÿ§¬UßòíOÿOX«¿ä"ÿÚŸþž±TòÃëÿTô‡¥õÊ[ÐåéV¦œyü]¿«Z|Uáðõ銡ä"ÿÚŸþž±WÈEÿµ?ý=b®ÿ‹ÿjúzÅS=üAÆ_Ó?TåQèýOÔ¥7åËÔú)LU0ÅRýcüAÆ/ÐßTåSë}sÔ¥6ãÇÓúk\U,ÿ‹ÿjúzÅ]ÿ!þÔÿôõŠ»þB/ý©ÿéëEi¿ã/­¯é?ÑßS¡çõo_Õ­>søzõÅSœUBÿëÿT“ô¥õÊG×åéV¢¼¸|]<1TþB/ý©ÿéëwü„_ûSÿÓÖ*ïù¿ö§ÿ§¬Uµÿ•‡ÈrýÆ¿>³Z{b¬‹v*Ç[þV#ÇôGü5úÍiÿ!þÔÿôõŠ»þB/ý©ÿéëwü„_ûSÿÓÖ*éߤ~§é/Gë»ú¿Wåé}£Ç?‹ìÒµý¬UŠ¤Ú—øËëmú3ôwÔè8}g×õkOм>½1T/ü„_ûSÿÓÖ*ïù¿ö§ÿ§¬UßòíOÿOXªe£ÿˆÿ}úgê³è}OÕ÷åÏÔÿcÇŽ*˜â©~±þ ãèoªr©õ¾¹êR›qãéý5®*–ÈEÿµ?ý=b®ÿ‹ÿjúzÅ]ÿ!þÔÿôõŠ¢tïñ§×#ý%ú7ê[ú¿Wõý_²xñçðýªV¿³Š§X«±WÿÐô7”ÞÏ0ÛJOøŠâ¬v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت_­k ¥Ão#DeúÅÄvÀƆSN]LU0Å_ÿÑô¦‰¤M§Ï©É#«‹ë§¸Œ-vVPÔuÛMqWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]бÏ<¼zoý´­¿âGdx«ÿÒõN*ìUت”—v±7 &ùY€?q8ªßÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×S¸Ö4‹hZk‹ëxaZr’IQTTÐT’SЍ[y›ËwRzVº­œòÓ—®"v ïEcŠ¢ÿHXËL_ðkýqW~°ÿ–˜¿à×úâªZþ…fª×z­º±¢´³F€ŸɆ*Õ§˜t ÎTÔ­n}:sô§øÖ´¯4­1TGé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*ïÒòÓüÿ\Uߤ,?å¦/ø5þ¸«¿HXËL_ðkýqW~°ÿ–˜¿à×úâ®ý!aÿ-1Á¯õÅ]úBÃþZbÿƒ_늻ô…‡ü´Åÿ¿×wé ùi‹þ ®*º+«Y[ŒS$׊°&ŸAÅUqWb¬sÏï›ÿm+oø‘ÅY*ÿÿÓôÚßIwƒYÌÖórøÔi¹Û|UŠ»xçç¯æ™äxQºO¬]L«…˜Zþ`_i֚Εg¦²%¬Ò4!Ô¢¿©'=^|«ñ|ù9*ú«v*ðïùÊŸùGô?ù‹—þMâ©üâý5?ôaÿc8«èUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìU<òüuüboÖ1VkŠ»cžxÿxôßûi[ÄŽ*ÈñWÿÔô7”ÞÏ0ÛJOøŠâ¬v*øÛþsY®ÿÆú*°?T,a=½C'ï?áDXªEÿ8ݬyÂ{ôÖÞÛ_’D67|Tz\wH¤…ŸÚVƒíqÅ^÷­y?Êšü–÷®™o{-»¤°Lè UM@ä7dñFýÛ~Òâ©ÐØtÅ^;cÿ97å+»Û{DÒ¯Õî$H•˜C@]‚‚i'¾*õùåÃ$¬ XÔ¹­Wy•ÿ9-åMGS³ÓâÒïÒ[Éã·ØCÄ4®I ¥N*ôÏ1ù—Dòæ—&©¬Ý-¥œd/6©,Ƥ"(«;š}•Å^E{ÿ9Qåèî8Ùh—Wýì²G |Â/üKeÞCüïò›ïSM‡ÖÓõY+éZ\I8ŽGÓ‘ ) e¸7ù8«Ì¿:¿8´?0hº‡•m¬®¢¼¶½óÉéúDÛHÊÔâÅ·§Ãðâ¬òÏÚo’<Ís«jó\Ã=“Ú¬vüyyb̨ãHŽ*úoòëó'JóÕ•åÞk=ªYȱ:Üp©,¼ª83b©›¿ç <‡åû©,¡yu{ØÌ)‰uV•Š©ÿž~¦*Æm?ç*tœ-Þ…u ÞH¥ŽW§úŒ"ðø«Öü­æÍ ÍJjš-ȹµbQ¶*èãª:Õ…ãeøqW—~g~dþXYy¶m'̾Y}[QÒÄ@] qÆXÖeP]Õ™©öáåËgéç½*?ËåóŠZʺjÚ‹•´P‚QVeÅQmóÇ–<¥d.õËÕ·_B Í)’5ø»}…ý¦Å^Y{ÿ9S $¤YhwSÅSGšXáoøÿıVYäoÏO'y²ú=1Ún§)¤÷AxÊi^1Ȥ©oò_ƒ7ìòÅU???òRë¿ôiÿQâ¯ü‰ó&åÏ7ÝêÚ½À·²ƒN›“Ù˜ÉTE³·e«Ó.¿ç*|¾—%mt;©­«OVIcéãÀ ü>*ô"~ey_ζ²I¤LÉsæÆpxÁØ5edÿ-±WœÎTÿÊ?¡ÿÌ\¿òoKÿçÿé©ÿ£ûÅ^Õæ6yËiÔu»Ä´·¯Á©y•á ³·ú¸«É¯ç*<»ül´K»ˆA§©,‘ÂÔñ =_ø–*Í<…ùÏäÿ8Ü W’ÇU •±ºYøŠ·¤êY$ ýŸ†OÚáÇg˜«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O<Ÿÿcÿ›õŒUšâ®ÅRo4i·wöÖIj¡ÚØ'2KñTçÿÕô7”ÞÏ0ÛJOøŠâ¬v*òÎïËíÎêÚv£Ê)¢U’Êö0 ÈE ý¤oÛOÚÿ[‹*¯–<Ïÿ8õùƒ£´’Y@šÍšÔ¬¶ûÞ>ð½—ù1ú¸«Ð<íç'_ì/nl^¤Ú|ܽ*Ž«$|5ÿcÏ}cùcçÈ<íåhµeŒAw›{ûu©T™'wàÊÊëÿû8«ã.ÿÊA¦Ì\òqqWÝzüsîãÿÄN*øwÉŸò˜h_öеÿ“銽—þr²MC×òôdŸÑånY@­ À <¾IN?ìñVùWwù8–wvÞzµ•¯¥—ýìú愨inÜÖN|‰~ËŠ½ÃòÉ¿–z\—º§•/ãÕ§ˆ³«Ëm n! ³§»:ó|U‚~x~RyWBòí÷™ìžèêW7ªÒ $VŠ·Yè¡ê~‹`_’žFÑ|çæ«­/Wi–Ú.Û¸Fæ³D‚¤«|ä ý¨Ãpž&§Šò\Uîó•/hDƒu!Æ,Uÿ8ŸÿMOýØÎ*óOÎ/7^y“Ïz“É!6VIga j‹,P²Y}Fÿ›WzƒÿBÅc¡Åcxº…ëFÝô–úˆvˆÇÆ5ôÖ¿c‡û.MмV›OÑüÕ4þV¿’{+;6•Å£’ŠC¡!Õ’„ü ËŽ*ûcËz°Ö<½¦jÀúý¬7%FáL±‡+þÄšb©Ž*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©ç“ÿã¬ã~±Š³\UØ«±Wb¯ÿÖô7”ÞÏ0ÛJOøŠâ¬v*ñ_ϯ̽+ÈÁ®f qª\F«§Ør¡vwjn±'í7û UˆùsóóòëV°Žk»ñ¥^q{;¥o…»ñ‘T¤‹_³û_ä.*ñÏŸ;yWÍ~c´Ÿ@_Um`1\ê ~±-U0W+ÿÚþ\Uê_ó‹úmÝ¿“/ïea½½?V£,H¨Î=‹òOù犾nŒË¤ëJ]yK§Ü‚Èv«C&àøn¸«êýó·òú/*\ꚬW72Û¿Õl¾»Jèx#ÇNQü_m›á\Uòß“?å0пí¡kÿ'Ó}ù™þ_)ÜÉç(Ò]&2 ©¯ªf¡ âCú§zq?g—/ÝóÅ^;©~E~_êZ;ë^WódqZÌ©õÇŠH†ÕâÃNÍÓö±W–þ]kZ–çmïOwYšîd =X¥‘QâaÜ88«èÿùÈå'òÊà€HVäûDb¯ÿœ{ó.‰ yêiõ{¨ì­îìeµŽâb1!–)7? ‚±7ÄØ«ßüéçÝ=<‡æ WËZŒ×:|Dö’$뒪ܲrN\ÿØüX«æ/Ë?*XùÏÎéš¾ öÑÜ '–^@Í3Ê#=xõåȇý¬U꿚_•ß•OòeÕÊ$‰¬ºpÓ—ÒÉ)a¿§P¥QwsÇû,U‰ÿÎ3䯗þÙóÿÉȱTŸóóÿ&Ö»ÿFŸõ*öývoûtÿÌÌUãßù6´/ú;ÿ¨9±WÑ_ßù+5ÿøÅüŸ|ûÿ8óÿ“OMÿŒW?òañU_ùÈo0êzæ%æ›<Œ,´¥ŽKrh«êD’;ÓùŸí' UèžAü…ü¼ºò¥†³ªÜÉ©=åº\M"Ïé[ÆYy2Nû¿²üßí/ì}œUáÞƒËþpÔ­ü°yhpºÇhÜÚ@JÆ¢B®Ä–S(“‹Wì⯢2¿õý³ô¯ù=mмSòSÏ–Nóy»Ôê4ÛØÖæURÆ*²ºÉÄ|L’Œö[}¬þv~\iº[ß&± ëñ&Kb^gjT/?w_8ñÅ_&C ÿ™üÒ#‰?Óu›ÃEQPâJŸö+Ëþ{Ïüå$k–´“ì¥Ìеð1Tüâý5?ôaÿc8«Èÿ2´ ÏZÖŸ:êI`'ö¡™Œ‘0?ê0¯ùX«Ö|«ù7ù3æ-VÓ^¾@Ñ«]@÷VŠð=*É 0¼OÚûXªFü·ü…ÕüÉ?—ì¼Ã©½ôL Ö†#âX$ô8ÈÊ~òÿÝ|×} hÖº&‹e¤Z3½µ„)o ÊAr±ŠÅB¯/’â¨üUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSÏ'ÿÇXÿÆ&ýcf¸«±U ËûK$î¤,²,1’ «¿Ù]늫â¯ÿ×ôg–-.­îõ¶ž&g¿’HK rBxŒU=Å]оüýü”Ò|ïæ©Çw%†²GÌk,.‹Rªñ’8Ò¿j6_ò•ñWÝÿÎ4~cC)HZÆê:í$s²Š{‰*È|­ÿ8»¨µÊMæ}N(íTÕ­,y;¸²euAû“}¦é¶e„}„ mej‚8 AEU^ƒûqW‹þfÎ;O®kw:ß–ï ¶šõÌ×v7\Ö?U·wŽDYïâ(Éö¿oI<¥ÿ8Á«~’Š4_[®Ÿ{[6w’Z°]–1Ÿæ^mþ¯ÚÅ[Ðç|×§kšv¡.©`ñYÝCpè¾·"±HT¥h1W£þm~S7Ÿ"µ’VK› Â(-[–ä”JÉÛÔ¾‡†*ñçÿœaüÁp[½5£®ÒúÓOqèòü1W¢~ZÎ>YykTƒ[Ö¯QÔ­;X"R¶ñH:=[â‘—ö>ãü¸«Ó|ÏåÍ;Ìš 拨©kKØø9_´¬$u¯í#…uÅ_;j¿ó‹Þq†å†™¨XÞZ×÷o+I´ÿ)H¿t˜«Óÿ*?)¯<³å}cEóÛ^Ǭ5&†Ü» ŒÆP©gXÏ-û/ʼçÌó‹¾c†õÛ@Ô­®l‹V5»/ Ê;ÁŸÍ𩊣ôÏùÆ-M´ûÙµVõwˆ¥Œq™ !Ø<²2‰ˆû(©ö¿›d”Ÿ’Zÿ’üÒúÅýý¥Ì k%¸ŽSŸ'd`~4QOƒ@þe~Aù“Í^uÔuû=FÎ kÏGÓŠoW˜ô Ž#^(Ëö£¯\Uœÿ€u/ùTŸà¿¬Cõÿ©}Wë?£Ë—*ôçÇýŽ*Á¿- üÉå_:éÚýæ£g=µŸ­êE«Ìú°I§$UûRW®*õÌ-Ýy›ÉÚž‡i,pÜ^¢$rË^¬Šûñô_ Uæ–‘bòœm5ËÝBÎâÞÝ&FŠW™2FÈ)Éu>8ªuùµùoç;ÅÖ4Û¤°Ö‚æõT˜gTÙ •ø‘Ô|<èÿ㊼ãLÿœcóÄ“úú¥•­aê´/,Ì@î±”[ý›¦*™kß󋺤š¤¡ê6Ðé"XRèÊf,±*ÈÏÁ Õåÿób¯Tóg‘µ gò»ü!Ä1ÞýVÎßëËÒåjñ3j7¤xü8«ÌtùÅë…[صíJ²ÃKìù—ŠpÀ†e‘Q^><•’¿ð?kHgÿœ_óÒݘá¿Ó¤¶¯ÃpÒL†Ÿå'¤Ä7°-þ¶*õ_ÊßÉ#Ésþ”»œjZáR±Üpã…D¤“ÉâÒ7ìý•O’¨ŸÎOËmWÏZfi§]Ajös<®×èC' تò_ò³XòéÒ7v÷_¤¾­é}_ŸÃèz¼¹sUëêŠb©Ïæ?å_—¼ói× ZjVà­®£Ôø:šz‘×~5_òy6*ñ;ßùÅÿ<Å?Ký>æ~剩âÉéµ?Ø»â¬ÃÈóVzeì:š/P–…°a%Ü‘‚¼‚¿±Â?ò¹}œUWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O<Ÿÿcÿ›õŒUšâ®ÅXçž?Þ=7þÚVßñ#в™uúÄÄv,ÍHþü*‚Òÿç%?1mf yõMB*üI,>™§ù-Jš¶*úòóΫç.E¬®Ÿ6œŠ¦¡V+Õ¢}½Hëðóâ¿,U“b®Å]Š»|«ùÓù«æ]CÍš†‹§ÞÍc¤i“=§£ní–HVZ3|a‚¯ØãþV*»òƒÊŸ˜)ç-W¸´Ô"Ñf“Ô{¦õ=6ŒÆÌ¥…»}¾&~,Uôž§æÏ*éW"×TÖll.J‡]\à ñ5¸»+q4늣4íOMÔíVóN»†öÑÉ qo"Ë*h@t,¦‡lUŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]а/ÌÎ/-y'ýP×ú˨tÓ¡ ì´Îj#Sògÿ#Ž*ñ-Sþr[óêV6Kg§Å_c‡Ôj”Ò—ü•qUMþrgÏ–s/é(m5;züjSÐò^?…~˜›}ä?èžuÑŽ£¦sâaݬ£ãŠJV†›2ŸÙuû_ð¸«&Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZfURÌBªŠ³€¹ÅR8|ûäiæŽ<Å¥Ë4¬(’öÝ™™UCÔ±=*žâ®Å]ЧžOÿޱÿŒMúÆ*ÍqWb¬sÏï›ÿm+oø‘ÅY*ÿÿÒô7”ÞÏ0ÛJOøŠâ¬v*øçþs[Pºo8èºy¨´ŽÍ®~ËI#ð?JªøXó_—üѧKB»–k#BÒ„’:H ¥dT~Œ§ìâ©wš2¼“å[ȬµíHYÝO­^Œò“b¼¿t’ñ+uÅS/-y§Bó6›úOD¸7V%Ú!1ŽXªÉN@ UÒ¿jœqV;¯þtþ[蓵µÖ°“Ü¡!¡´W¸ Ž ¼`Æù%ñT6ùïùeª\­²j¿T™Ïq¼(~ré/û7\UŸ«”ÕNàŽ„b¬ßó×ò®æâ+xu¾sLëkõ[ÁVc@*a©ÅQjüâò–/ÛNÔoËßÇOVÚÞ6™£®ÿQÁ[üŽ\ÿÉÅY^›©ZjZe®§jŬï`Žæ`T˜å@êH=>аÍoóÇòÏHíåÕ…Ôèhéh8´þñG¥ÿŠ£¼­ùµä/3Ü­¦—©¯×_ìZN­Œ|8 !öFlU—â®ÅR=ùž?+ùGS×C½œ5F™ÈŽ%>ÆF^_ä⯌ôû-sÍþhŠÕÝjú½ÇÅ,‡«¹äî粨«7òªâ¯©<§ùä Â8ïlW¿â>±wv9†joÂ"}4OåÛŸó;b¨o3ÿÎ=yYž ìámÒ@×"ÓìKtàĤmü®ƒýƒb¯@Ðô-'BÓ!Ó4›d´²·Ž(ÇÞÌz³·í;|MŠ­×<áè6F÷Y¾†ÆØ &`¼›¯iÛü•±V ÿó‘?•Ë?¤/§d­=qm/ ‡ÿ„ÅY§—<Ûå¿2Z›P†ú%§¨#4t¯Nq·¿åªâª¾aóåÝ*]WY¸ú­„%VI¸<”.ÁWá]÷cü¸ªC¢þnþ]kR\ǧë1¹³®®žX§·D…P¹yã>Ôˆ´åËâÅRgÿœ†ü­K£é™¡¸[iŒñð˜«=Ò5+Y°PÒ²›û¹â`Ê|AðaÝOĸª&Yb†'–WXâŒy…UQ¹$€«Õ¿>ÿ,4éÚªÉѤO*”€Ûýƒ¶*œyWóCÈÞh˜[èú¤r^_ªJ7[òη§ú*8à–S¡õнÀŒ:WÔ†ž“ÂÉû\±WËÚÎú7X¾Ó½OWêWÛú´ãËÒrœ¸Õ¸òãZW{µ—üâ×;Bÿâz}f%Ûê?f¬¯ÿ-ýšb¯*üÌòø#Ìk£}{ô‡+t¸õý/Cí³/<åéï,U˜~^~@ÿŒ<«m¯~žúÖTú·Õ=n>”…+ÏÖŽµã_±Š£ÿç"¼úß˺¬'ÕHícÒnæ À4–Éû§+SF‘ŸµþëÅY_üâÿ™Ï–u- gýæ™8žÇaÀÜe•›þ2b¯óf¥uæ8kZ­º4Ââk‹• ¯hªTŸd…WzÏüâǘ==CYòü´ñ¥õº“ûQNZ{°xÿà1Vù˯?˜?2õW„™b·”XZ(©ÚÝ¿ëK͇úØ«éÝÈVV¿—ÞO¹/FÏм’ÝÌoêÉñÌêËã+1þV_…¹.*ò}3òÉ:%ÅÃùÛÌ$bCõ(â+@b­å2ü\Ú¿b?…ߊ°/Ío(ùF{k¿'ë‘j6ó³Gqd&I䉀¨udëtø¾Ë~ÓrøU{güã˜îµo ›K© ’é7-kcVô ,‘ƒßáäè¿ä¦*ùV e†h慊͇PÊjúqW¸i?óŒ~`ÕlÆ£®k«e¨Ýþþ[A®\<Ÿõd2EûÊŸŽþ/ÚÅZüðó^¥åí Cüº±º Zi¶é«ÜEUõDh"HüUÓ2:þ×(ÿÊÅR¯ËÊ¿!ë:jþjóV’\3}_OŠêÞTRW”¾§&«UJ/Ãþ¶*Ä¿2¼£¥yOÌ1C¡jñêš|È'¶¸ŠXÞX˜1$h9­9+˜«éïÉÿ7\ù«Èvãs¿ˆµ­ãÿ4šsùºvÿ)±Viм«þrQæ_Ëb#¯½·ÓùhçöAqW’Î6Çnÿ™q´´çÃA_çøTÓýƒ>*úÃv*£yu¤÷w  xÚYœöD˜ýb¯ŠüÛæ0yÿÍßXpóMw0·ÒìÔFŽÜc‰JšŽmûoñb¯LƒþqWYm4K6½Z‰ZýU`w„5:¹«}>†*òëk¯4~^ùÉø1´Õô¹¸M$Ç"ìJ·NqJ›ÿªÜ±WпœzÕ¶¹ùÚۤ7ëe:¯R¼åBTû¡øN*ù×ÈþTÕ|׿t-6A —jÞ¼®Hb÷Œ\/Úªñ_çኲßÌÿÉCÈÚU¾ªº’jvRJ ˜ˆL²–SÇœ¡ñ#—/µŠ²¿ùÅnáumgCg&ÞKu½Ž2vWÄNT–%N_ê.*…ÿœüÀ¿º×O”,¦1éÖ*¨*zÓÈ¢EV#ªDŒ¿ûó—/°¼UJ¿/¿çu¯5è±k7zŠi6W µ¢˜LòÈ ‘̧8‚¡§ÁñüX«;üµÿœy} ÌÒj¾až+ج$VÒRÁdqFJ¤|<ÙŽ¿oüŽ<Õb?ó‘˜ú‡™%ò­¤Í“¦ðúÒ! šå”9-N«`Š¿ÏÍ¿—EyòwòÚóË–×Þdó4QêW‘ ~­oyk€8ª«sÍ"µû*ßUæþgÓÉ~sx´]U/Œ‘Üiú³«TjP²óSðºÿƸ«êï01~Jj:ß}¡]É*‹(¶‘dQì$ LUòO—´­[XÕíô%Yï¯ÛиÔ6íÈÿ QÉÿÉÅ^Ç/üâ®®ºq’=~ÔB×ê¦XKxzÜË}>†*ò+Tó‘¼ÙëÃÊÓUÓ&1\ÀNÍÁ©$OMš7§ün¿³Š¾…üÄü¨ƒó"K7Ûë&ÂÝ´¸}smëCÎá[Ÿ«*&ãN8«æ}Ný%¬XéÞ§¥õÛˆ­ýZrãê¸N\j¼¸ò­+оšü¼üÿy¦Û^ý=õ﫤©õoªz<½XÊWŸ­%)Ê¿gx'æž±¨ê¿˜:ì÷ÌÆHo&µŠ6ÿuÅo!|•à¾,UèzäŸåç˜tËmYµçEf†âH¸#t0*­Ä_O©Š¾Œüòä»q¥éõ’G¤¼»qGš_„#öTtDý•ÿ+“2¯ZÅ]Š»v*ÿÿÔô7”ÞÏ0ÛJOøŠâ¬v*ò¿Î9h¾QŽ}_Vˆ‘!…(d–Bã•cÿ ¿*‘ùwÏ^Róž—ºf¥¨ëÊHYÕfÅeŒžHGýsоmÿœ‚HÿÛ·–¹¸h˜êßS*`õy|càõiËÔãþO/g_óŽúeýçå§™­”ñŠúi µ'oÞ5ª£0?ì£ÿÅ^å=J=Î:V¡}ôÛèeºŠŸH €?™hÙb¯¶¬õÍ÷M­ôiÅyýmdS_Õ¢ûòÅ_"~uy—Lóæýö˜âk(Ö;xîìÈb@Ô÷^U ß´¸«é_É6çMü±Ð-®AYL ?êâWü‹Š¾IóŸü¦ïý´.¿äû⯸´ïøçÛÆ$ÿˆŒUòïüäÏþLh¿íŸüœ—zçüã¥Õ¼ß–6pÅ"¼¶ÓÜ$èèÍ)p÷VVÅY柖™ü…ªiÑw>—ÖlˆÞ³CûÄ ÿ)éÿ³Å_%y/ΞW¼Ô.-«[ý>æÁ¸š3'îÜÆ9B6*ôùÆÏ(Ûk^a½¾§ÔΛB6?\¯©Ou)ÿ=1VåÝgRü¾óÛ\²s»Òe¹µž.„õýž_*œ~HyqüÇù“d÷Õ‚À¶¥v[z˜ˆ)Zõå;G_òyb¯vüûóÆ©åo(D4™ †§7Õ’å~ÔQ„-#!ìÿeTþÏ.Kñ.*ðÏËÊKóâúö}HZZÚº‹›—S<òK%ZK/‡Äîÿðxª7ó{ò“Eò&›a=¶«-ååìÌŸW•QO¦ˆK8ã¾ÍÁÙb¯@ÿœVÿ”\ÿ˜¸¿äÞ*ùóËê­¯iªÀ2µÔ!”î2.Ç}銾Rÿœ“Ónm¿1šî@} ûXd»~ì™~‚•ÿeЬü¼ü_;y}uk?0Eo*»EufÐx]NÁˆ‘kÍ8ºšb©­çüãµ–«i¤ÝùÆÒ Jø3ZZ¼<( +/¿Ãüÿ±ö[{GåOåüÞFòíÆ‘5êß´÷ov&XÌ`Ž8øñ,ÿïªÿ²ÅYž*Åÿ3<¬þhò>«£ÂÖ¥ˆIi_÷ô,$ŒW·6^ÿ+|åO1j>RóM¦¯d]iò‘-»Õy- Kw^JYÉÅ_aù[óÊg±K­3Q„» Éi+¬wžáã'—û!ð7ì¶*“ùçóŸÉ¾SÇ%ÂêWÏ"«ÙYº;Æ•øÝÍx¡Uû(Ç“ÿ«ñª©œú¾•ço!êå륺MBÆæÚ"§‹¤²ÂÈÔîŽ tlUò/‘5›mκF©|¤[Ù]Æ÷"•e@hçó <©Š¾Öƒ[Ñ®4Ñ©Ã}šq^\YÑãJÔ½xŒUñçç˜ôï0þa꺖šÂK&há†aÒA KqþK2žäqÅ^·æý6çMÿœf²´¹gX¬äun«ë\,¡Oú¡éа¯ùÆoü˜ÒÿÛ>ù9*õŸùÈÿü–sÿÌ]¿üHâ¯.ÿœ]ÿ”ÿPÿ¶Lßõoб¿Ï=6æÇó?YõãtÑÜÀçö£’5ܪÁ“ý†*ú/òkÍš.·äMÚÒâ?®éÖÚ]ÚrThGȧ^2qæ­Š²Í7_Ñu9îíôëØnæ°qäq8s‘PŸçË’ý¥lUòç6›s§þfk©8#׸úÌLz4s¨‘HùWûU–ùGþqçüOåë-nÃÌú7q†x¾®ÌÑH6x›÷ƒâ¾UXÎ;Xq´!çOÓ œØúÔôØ =_jñû\~/²Ø«Ö[Ê’yOòCWòü—"ñì´N· ¥z«<£á%©ÇÔã×|áùAæM7Ë¿˜ZV§©7§b¦H¦š•ôÄÑ4aÏù*Ì9‘Ë}‹.³¤E§NKØN Ïë†Dôxøó¯Ç|[ù‘¯YkþyÖu{÷Žæàú E9"(Œ=N|y⯮¼«§O¦þ]év­Å¶—s)ê²5ÿbÛb¯|«q·š4{‰ÜG7ÖÒK#tTIT±? 1WÝ‚D!H`Cý‚Çjíã¶*òÌßÉo(ù“Ìk5¶¬š7™55iE«t¹ô€ë$uz}¶CþW\ÛxÇæäïš¼‘kýü–÷:|²ˆRæÙØñr (tuF‚·Ùæ¿åb¯pÿœ:óηªjº——µ;‡»ŽÊÔ\XË),èœÂ ä¸ªi¯~Fþkêzbkœ«y†yV6³{˜™¡· Ä—–WXëÏáfUÿˆ*ô¿È$ùŸÊš>«o¯Ù}Jk›„’õb—’ªPšÄò¿Ž*ñíò+óRÛX±¸›Dá 7I#}jÌÑUÁ&‚bz Uõ¶*Ä¿2?.4<è¢Êñ½í¹/a|£“DíN@­G8ÞƒšWþ|õqù7ùÇåk÷—FŽvê¢ûJ¹àY|(9‡Ò˜ª¶‡ùùŸæ-P]k¥´ärmBúQ4æŸÊŠÍ#8ÿ‹?õñWÔ>ú7KµÓþ±5ßÕbX¾³rÞ¤ÒqäíÝŽ*ŒÅ]мŸóKòMó]ÌšÆ2iºÛŠÎÑîùŸˆä’xÈ¡¹~Òrø±W†jŸ’Ÿ™Út¬’hs\(? ¶¥'V FKöJ¸ª¦‹ùù™ªÌ¨4w²Œý©ïX@‹Ú¥Md?ìclUôwågåfäM6UYæ«yÇë·t*´_³iSDZõûOÿª«üÖÿœ|—YÔg×|ªñCwrÆKÍ6SÁFݤ‰ú+9Ý‘þ_5û8«ÈßòWóEgô—ççZT©dlå„KëÛËñ³¡ŒR;tSÛzçg–5Ï2ù]/E¶úÝó\C"ÃÎ8þ$±å+"íþ¶*Àÿ!,|ñå_8^jö›õ;9tù-ã—×·–²4ð¸^1HíöQ·§UŸ~j~Uiž{Óâ&Ag¬Z,ïxòNæ)@ûQ“Óö£o‰m]WÎÚ¯äOæ~;Gú ÞF {I#•Ü ¬€®‹Š³ŸÉßÊoÍ ÌkºèvJiw ¬²½Ä5©Òˆßù¤dhþÚb¯Kü×ü¤Ó¼õiñʶZ媕¶¼ ²ºTŸJP7áÈÕX|Qÿ•öqW„ÿÊ«üíòÌòÅ¥Áyrü/6—uÅ$â7G§üdEÅS%ÿÎ?yÿPÖ"ÔµéßD%=Ϭ$½vµƒ?ÿ‹$‡íp|Uï~~Óü»ó|™øi«ÉÏ&4¶qR{œUñß’|µþ'ó=–„&ú»_zˆ“È+¬NëQü¼”rÅY§ùùŸarÐþ†k´‰=¬‘Éñ_öh˜«?ü«ÿœzÕbÕmõŸ7Æ–ðZ²Ëo¥†YIÕLÅK"Æ:ðäÌÿ·Çö•}@ ‚*ÄUò·ž?ç¼ã¦ê·ù~×ô¦#³ÛzN¢hКˆÝ«1_³É9òÿ'ìâ©×ä—å¿æ“ç›SWÓ&´Ó-#YçtL‘2¨XùsÜŸÙ\UKó;òó^ÿÍ7:ì.¶$pÖÓ[ȰK jv‚'eáéþϤò¿â励¹-?<|ÄÑ[êVÚ…Ìq‘Àê7UŽ>Õ´‡þb¯¤?ç*G‘fº–òtºÖoâ¥Ì‘WÓ‚±ÆZŒß,ÏÅy|?ʽçv*Ç|ì̶zwEu`i¶ÜŽ*ȱWÿÖõ4pCsj†Fç!P&=Í:œU~*ìUƒù·þ; þ¢~¬U&Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUþaÿÊæoûdßÔ3⯕$òièñ–_ù1&*û+v*ìUØ«±Wb®ÅSÏ'ÿÇXÿÆ&ýcf¸«±V9ç÷Mÿ¶•·üHâ¬ÿ×õN*ìUØ«óoüvýDýXªMŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUت•Õ­µÝ¬Ö—Q¬Ö×ÑO Š«£‚¬¬Ue48ªK§~_ù#M½ŠûOÐì­o $Ãq(®¤‚  ¶8ªŠ»v*ìUØ«±Wb©ç“ÿã¬ã~±Š³\UØ«óÇûǦÿÛJÛþ$qVGŠ¿ÿÐôg–.î®.õµžV‘`¿’8Cñ@x U=Å]а6ÿÇa¿ÔOÕŠ¤Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»O<Ÿÿcÿ›õŒUšâ®ÅXçž?Þ=7þÚVßñ#в·Ö.b¶§.<}RG.Zxb©Ž*ÿÿÓô¦‰¤M§Ï©É#«‹ë§¸Œ-vVPÔuÛMqWb¬Í¿ñØoõõb©6*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅSÏ'ÿÇXÿÆ&ýcf¸«±V9ç÷Mÿ¶•·üHâ¬ÿÔõN*ìUØ«ó{*êÎÌBªÆ¥˜ì©Å^+æ¯ùÈŸ"h³ÉkdeÖnc%XÚ;zÎ@oœk"â¬R?ùÊëc5$òÓ¬5ûkx©þ©…Gü>*Î|Ÿùíä?2ͧÖKÔ$!c¶½ ØöIT´g}”3#·òbªþ{üãòÿ’µHôýcNÔ]¦ŒKͼp<2/F Ï27$;:•ÿ…eÅRþr;ÈZ®­i¦¥¾¡j÷’¬)qs ³š/6Yœª×jñÅ^©Š´Ìª¥˜…Uf;sм–ïþroòúÞîkuµÔ®dÅŽ@¦œÐ´êܪòUÅYw?2´ŸW×<ͪ¦•¢Û«ÇÊ‚QÙˆUE¨ßzßüã?æ4†xßO¹ ýV)ÜHO…dŽ8ëÿ=1Uÿ”ÿ’¦¹®Kqæ[Yl´2cͼ¡’K‰“ýÔ½?v?Ý’/ú±ÿ2*÷OÍ/ËËO8ùIôØ‘"Ô,Ç«¥I@H«ON½£‘~ÿbÿ±Š¾5¹¶¹´º–Úæ6†æÝÚ9¢qFGCFR;F*ú÷òOÏÃ;Pˆ]KÏXÓ8Ûj?Ð~êoùê£âÿ‹LU"ÿœˆüÂýåñåÛ 8êšÂ;)£Ei^.~sÆ?ÈõqW;Zòö¥æ-rÏFÓcõ.ï$¿Ê«Õ¼oòqWÛRòÆå/YèšxýŪQ¤ ’C»ÈÔý§mÿáqW˜ª¤ÍÑÏ ´sDÁâ‘MYMU8«ìÏÊ>Ãç?)Á|ì£S¶¥¾§Ú“(û`$£ã_öIû«3Å_Ÿ˜«êÿ$é7šÇüãäUSw{§]AsÅK¼²SÛyý ‡ægûâÓþ’úb¬?ΞE×üŽ´‘¤÷zñˆœH8r+¹늭òg’uß8j’éš*F÷PÀ×.%qújè‡sß”‹Š³/úÌÏ÷ŧý$/ôÅ^±æÍûCÿœw¸Ò/­å”1ι/!p‡cß®*ù[~â®Å_*ÿÎLÿ䯋þÙðÉÉqTãþq[þR sþa"ÿ“˜«Òç!¿òVj_ñ–ÛþO¦*ù&ÞÞk›ˆ­á^sLëkP*ÌhMSгßùP›_õbÿ§»?ú­Š»þTæ×ýX¿éîÏþ«b¯gÿœ~ò/š¼§g­Gæ ©=Ü5¸õa—EpßÝ<”§!ö±T«þr[Ïwºm§•´ùL2jQ´úƒ¡£~E=·ã++óÿ%8þÓb¯Ÿü»å½kÌz¬ZVl×W²Ôª >Ó31 ª?™±W£\Î3~cEhgI4ùå¿UŽwV*ñ¤Uÿž˜ªÏÊïÈýk]óßâ+Yl4.P—±H I4ƒF3ü´¡yý†ø>×,UõÔÁ¤Í(#†+vHãQ@ª©@ð|оÓüŸÿÉgåßù„_ø‘Å_?~ùî÷]ó…΋¤i,†„…îá–F«+r•Wü¶ÅX·’?-|×ç9e]Ý~¯ =äíéÂŒw M 3’ŠØ«$óüãÇæ.d÷‹¶§kÊD°‘Þ@£© "DÏò›b¬óòòuí ¿›üÁ[’=M"ÅÁ0zO þb?ºOÙþóíqâ«Þ±Wb®Å]о|ÿœ¡ó}_Nò¥³ì¿éÚ€&©ÏGeÿŒmоÅ_b~GùÀy—ÈVfi9êgú å~Ñ1鿉ç ·óóÅYþ*£yymei5åÔ‹ µ´m,ò¶Êˆ€³1öb¯¿5?55_;j®ˆïo [¹úiP6ÊÚ‘¿ä—ÙOÚfU"òŸ‘|Õæ»–ƒB°{¯Nž´Ä„†:ÿ<ŽUÿ&¼¿ÉÅYúÿÎ0þaD†ïLJú&i¹|¶‡‡ü6*ÀüÛù}æß)αëvr0Ü©BçÁdZ¯/òÇþN*ú‡þqGòÏUòÄ“ë:´³A{©Ûº_"#Ž ÊÊò§C9í_î“áûLüU}#Š»cžxÿxôßûi[ÄŽ*ÈñWÿÖô7”ÞÏ0ÛJOøŠâ¬v*ø‡þsNº·ü׎ñÁ6÷º|§ÃX‹# >+ð±ÿ_a“_˜¶^Hó÷Z…»Ía}¡;D’:0euŽCo‰kо¢ò÷æ’¼ÄiŵįömËúsïÿIÂOø\U‘b®Å_<ÎH~[zR4È¿w!Xõ˜Ôl®h±Ü³Ú9?Êàß¶ø«Ì¿+|û7’¼Õ¦Cɧʦ FÝ)W…·ª‚@çëÿûXªQæï3êgóî·|}w!e޵Xã$kþJ-}ÿ8ùùmúDÿj1qÕõhÇ Œ7†ÔÑ”{4Û;“é¯ób¯^Å_Ÿ˜«4ó/e±ò/—|Ýh¬öz”MøÜúw +ª7²J‹ÿü늯ü¢óüžLód7R¹ýyK}N1¸ôÉÚJ4-ñÿ«Í?o}•±ËKŽE ަ ©Øâ¯ÏìUö_äþJÍþ1Iÿ'äÅYÆ*ù—þr›þRý'þÙãþOÉŠ¡ÿçå?Ô?í“7ýDÛ⯨±VùÝÿ’³_ÿŒQÿÉøñWƘ«ë/úÿË?÷ýßý#·õÅ]ÿCùgþÿ»ÿ¤vþ¸«Âÿ:|ã¢ù·Î ªèí#Ú-¤P*Ûš3“±ÿXb¬Ïþq[þR sþa"ÿ“˜«Òç!¿òVj_ñ–ÛþO¦*ùGF¸†ÛX±¸™¸C ÄRHÔ&Š® 4=*úÛþWçå/ý_éÒóþ¨â®ÿ•ùùKÿWßút¼ÿª8«-òß™ô?2鋪h·?[±ghÖnGñ&Ì8ʨÛ«Š¾uÿœ¡Ó®¢ó®Ÿ~À›[«Ž'¦Üá•ù ù ¿Ùâ¬SòóÓÉi}BöÝ籺­n=*YÕà$¡MÖ¸«ê_.þcùÌAF“¬[Í3Ò–ÎÞ”õ=½)8H~…ÅY&*‡ÔãŸsÿŸþ"qWÀ˜«í?Éÿü–~]ÿ˜Eÿ‰Uò‡æFu§yûÌ· ‰üòÂ…’Y ‘¿û4ulUèß‘_œ_ò®›>¯+ÛÛMp×0j©‘Tº*²Ê«WýÅ•_} ¢yŸËºä^®©[_­*D+²ÿ¬ ò_öCLñWb®Å]Ѝ_ÞÚØXÜ_]¸ŠÖÖ7šyEHÔ³  Uð×›|ÅuæO2êÝÍD—Ó4Їö# iþÂ0©Š²>þYÜygÊ>WÖ™[ÔÕ a¨©éîLÑf07Í b©·ü㿜?ByÝt¹ßޏ¢Ø‚hÂ’`o¤–‹þz⯫ñW”ÿÎHëòé¿—âÆã&­r–ïCCè 2¿ÞQ¿É|Uóƒ£ÜëZ݆‘m´÷óÇo™/#ìµäqWÜ>Zòî—åÍ×GÓ"ZZ UþgoÚw=ÝÏÄÇDjz¾“¥[ ­Rö bÁ÷R¤)ÈÔ…äåW‘§LU$¹óÇåµÔb;Ÿ0hÓÆ®²*IyjÀ¼…]|Oò—|»æÏ,ê>Yó扨-.-ˆp(²!Ý$_ò]lUôüãæ'éM!¼§¨K[ý19iìÇy-A§ ú´Óþ1qÿ}¶*ù›}—ù#ÿ’³@ÿŒRÉù1Vqоeÿœ¦ÿ”¿Iÿ¶xÿ“òb¨ùÅßùOõûdÍÿQ6ø«ê,Uƒþwä¬×ÿãò~Ü£Fãæ¬Å^‹ùcùÝæ/-jözµÔš‡—Ý‚MÄÉ$M9Âæ­ðuô¾Ã“ö±WÕw²$šdòFÁ‘àvV‚ Å_b¯´ÿ'ÿòYùwþaþ$qT»ó?òwDóÂ-ØéúÜ)Â+å^Jê7 2TrÊÀó_ò—àÅ_=y—òCóAæï¦6¡j•ÿI°>¸ îP2õ£ÅXD3^XÝ a’K[¸át-ˆÃcB(ÊÃ}ùùÑ«jº¤^Vó$ßZšuoѺƒPH]c§öù(<$û|¾çÏáUïX«±Wb¯ ÿœ“óè¿(Å¡[¿½ié-:‹hHgùs~ þRú˜«À?.4MwΚ^Ÿ{$qX„·¯+*§£æêKmñ…ôÇúØ«ê/Ío/ùŸÈÚž•¡h×b?^Ä £¯¯Æ€|_·OOýž*øò æ‚hç…ÌsDÁã‘M ²š‚ˆ8«íÿ ù¦4ùGMÖÒ‚K˜€¹Aû3§Á*ü¹ƒÇüœUå_ó•qÊt/È+é-Äêþ™¯à­Š¼—òjh"üÏòóÍNä ­>ÛÆÈËeÅ_gâ¯&ÿœ™ÿÉsý´ ÿˆIоUÅ^—ÿ8Ýÿ“·Êßñžoú†—~„â®Å]Š»ÿÐô7”ÞÏ0ÛJOøŠâ¬v*ó_Í1i>]z¾«0†ÊÚ$.z³²¢Úw;(ÅR_.ù“Eó—§£Ý%Õ¤£í)ø‘©R޽Q׺¶*Å;tï,Üþ_j—ÚD%¶ÛMÀ-ѺHÛí~ñ«¨ýµŠ¾9Å_yym.S˺Z]Wë+gž½yˆ”7ü6*˜â¯“ç#ÿòfOÿ0–ÿñвŸùÅ?øèyþ1ZÿÄ¥Å_Dâ®Å_Ÿ˜«ì¿Éü•šüb“þOÉŠ±ŸùÈ˿ӺóŸ-WHBgU¶ƒâaþ´;È¿äzŸä⯛<»¯j>_Öìõ9ý;Ë)‘žÄtdjuGRQÿÉlU-Å_eþHÿä¬Ð?ãŸò~LUœb¯™ç)¿å/Òíž?äü˜ªþqwþSýCþÙ3ÔM¾*ú‹`ÿßù+5ÿøÅüŸ|iŠ¿@ñWb¯•ç&òcEÿlø?ä个qÿ8­ÿ)¹ÿ0‘ÉÌUé?óßù+5/øËmÿ'Ó|«åßùH4Ïù‹ƒþN.*ûÏv*ìU¯kº^ƒ¤ÜêÚ¤âÞÊÕ9Ë!ÜøQûLÇáUý¦ÅT<±æÌÚTZžr·6ÒÈ9ÆÄT¤‹Õ”â©ç囿 êÒëÉ[{yÊwÔKž'Ñô›írgâ¼GÛû-ð⯌qWÜ^[K”ü½Ò’ê¿Y]&=zóÊþ|;оÓüŸÿÉgåßù„_ø‘ÅQþmóç–<¦¶m­Ýý_ëÒˆ`P 7ùR0ˆã¯Æøªykumwoͬ©=¼Ê)£`èÊwXTм;þr‡NòÊi}ñH£ó—,¶ÁŸ©O´¨þŸo³öWí6*ñŸË¹Ì_-‹zúƒQ¶-OäY“þI†Å_nb®Å]о0üßó‡ø«Ïw÷Ñ?; cõ; ê=I‡´Ž^_öx«ŽÎîT:Œ¨Ä}àb«¿GjòË/üLUNX'„4m;€êV¿~*÷/ùÆ8z÷•.‘Þy` ÿwF J£ýx¿üòlU韞žT›Ì—׉j†KÝ5ÖþÝ©oH"Žõ1;ñ´ÜqWÈvwwwp]Û9ŠæÞE–ªº0eaò#}ùiù¥¡yÓKˆ¤ÑÛëh€^é¬B¸p>'ˆWˆõ ¿göñVmмgþrŽîÔy+N´3Gõ¶Ô£•mùPƶó«8Jòâ”ÿ+yoüãwþNß+Æy¿ê\UúŠ»Cßj6v)ÝIé¬Ò,1š3VGÙGÂ\UŠ¿ÿÑôg–-.­îõ¶ž&g¿’HK rBxŒU=Å]о+ÿœº_Ì)¼æ_U¶áåkp£I’سÂy(çj7 Ó‹Ž*¿ <þ7u^¦ë¶—1ŸL½¸±œìe¶•áz¬…N*»T×u½YÖMWP¹Ô>ÃÝM$Ä|Œ…±W þN~Qê~iÕíµMFÝ¡òݬ‹,²J¤ ’†¢(ÁûjÄRGû*¿å⯭1Wb¯“ç#ÿòfOÿ0–ÿñвŸùÅ?øèyþ1ZÿÄ¥Å_Dâ®Å_Ÿ˜«ì¿Éü•šüb“þOÉŠ³vPÀ« ©ØƒÐŒUñ÷çWåéòšÜÚÇÇEÔËO§>ß÷ÿÏ&?üVÉŠ¼û}—ù#ÿ’³@ÿŒRÉù1Vqоeÿœ¦ÿ”¿Iÿ¶xÿ“òb¨ùÅßùOõûdÍÿQ6ø«ê,Uƒþwä¬×ÿãò~¦8+µZ€ ÑŠ¾bü×O=7›®n<áC{)"߈?WôTü+nße¢ð\¿¼ýç,Ué~fó&“G¥jך|ljÉkq, Ÿq.*„»½¾¿¹3ÞO-ÝËÐ4³;HíáVbXâ¯ÿœü¤Ô¬/—ÍÚõ»[H¨Ë¥YÊ Ê ƒ‹Nê~ÇÀYcVø¾.ÉÉW¾b®ÅXçW›ÿÃ>B¾–㨩Yo¸iãþ1ÅÍ«üü1WǶÖÓÝ\Åmn†K‰Ýb†5êÎ犨ù“оæòw—mü·å7D‚…l Tw·!ø¥örlU8Å^Aÿ9)å/ÒžP‡\‚>WZ,•”ަÚj+üø8¿É_S|ÙåÝróA×lu›3þ‘a2LŠMq;¡§ìºÕüœU÷>‘ªYêÚU¦§füíoaIánüdP´î+ñb¯Ÿ7¿!/Ἰ×ü£nn,æc%Ö‘þò&=Zn6?î¥ø£ýŽIöxq·<ฅ½ÑÑÔýXU8|óÀ‹ÑbÔÄ4§¦/.8Óœ銤ÓÏ=Ä­4ò4³9«ÈìY‰ñ$îqW°Î1y7ÍŸšš·›1Ò,^i®oÙxBÀñü,üD‡›ªñ“b¯¼1Wb¬sÏï›ÿm+oø‘ÅY*ÿÿÒõN*ìUتÿBÒoË›ÛdŸÔ^¤2Ò”"´#a§üã¿ä¶§!’çʶ¨Í¹ú³Ïj>ëy"ª¦“ÿ8ýù7¤È²YùZÐÈŸa® ·$ô‡—|U—¯–´5P«hªª(ª ì7Å[ÿh¿òÊ¿{\UßáÍþYWïo능—åwåΩtnõ?-é÷×D3ÜÛÇ4…W æášƒUÒ.|‡£´¤h6ZsL™­!X …­zayR»WL¿Ãš/ü²¯Þß×wøsEÿ–UûÛúâ¬{þTÏå/ýIúGý!Ãÿ4â©Í“¼¯akŽ› ¥¤@ˆ­à_N4Ô…E¢®ç¶*ˆÿh¿òÊ¿{\UªùÉz¼)­£ZêÆÜãŠê1:«Rœ‚Éȡ능Ÿò¦)êOÒ?éù§Nl|å{ XììtØm-"Eoúq &¤*-w=±TGøsEÿ–UûÛúâ©^«ùiù«Ì“êÞ_±Ô&xG-Ô ;*Ö¼CH…©éе¥þY~^é s¥yvÃO¸t1¼Ö°$.PÅKFñª©ãþN*šÿ‡4_ùe_½¿®*‡¾òw•ïíd³¾Óa»´”-¼ëêFà€ÈÕVÜwÅRoùS?”¿õ'éô‡üÓŠ²ðæ‹ÿ,«÷·õÅ]þÑå•~öþ¸ªS©þX~]ê·"ëTòæŸr žêÝ&~"¤/' ÜEzb«ô¯Ëo éI&“ XéÒJÊö¤ Ê @cZŒU¨ù'Êz«Yê:U½í£^Þá}XÉSPJ?%4;â©Gü©ŸÊ_ú“ôúC‡þiÅ]ÿ*gò—þ¤ý#þáÿšqWÊ™ü¥ÿ©?Hÿ¤8æœU¥~Z~_é<úO—ìtù¤^Kk@̵¯Ñ…%j:b©“ùgB‘ÍebÄv ‚qVªÿÎ<þLjŽ^ëʶªÍÔÛ4Ö¾ÿñîñb­é_óŸ“:T‹%§•­K¡ªµÃMtA­kþòòÎ…*%š*( ª¥€lâ­·–´6R­h¬¬(ÊKAìwÅXÿü©ŸÊ_ú“ôúC‡þiÅS«?(yfÊÖ;K-:kXG „ãEðTRGËY¨ù'Êz•«Zj:\–¯»Ap¾¬dzŒU†ÞÎ4þGÝËêKåx•M!¸»wÿ&)‘ U9п&+t)DÚW–ìí®Õ.8³Ê»×á’BÎ>†ÅYøsEÿ–UûÛúâ®ÿh¿òÊ¿{\UßáÍþYWïo능ú·åï‘õ…u}ÏQXI0­ÜK8BÔ©_S—Ó¶*ƒ¶ü¢ü®µ¸Šæ×Êš\0°’ⵉMU••C+ÐŒU<ÿh¿òÊ¿{\UßáÍþYWïo늩\ùOË—VòÛ]XE=´Êcš AttaFVV%YHê*‘ÿÊ™ü¥ÿ©?Hÿ¤8æœU9±òw•ì-c³±Óa´´ˆ¼ 鯀š¨´UÜöÅQáÍþYWïo늤ºïåG导yk_³½’”JŸ½v$ðX«?󌑆oXùa9Ô »à›'áÿ ЧZWäå.”Áì¼­`’.ë+Æep}žRì>üU•Ùèúmœž¥´'§‚zxnqTf*ìUŽyãýãÓí¥mÿ8«#Å_ÿÓõ,76Ó4‹ ©#DÅ%ÁŠ8ê­O²ÞÇTÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Ç<ñþñé¿öÒ¶ÿ‰U‘â¯ÿÔîÚ¿£iºŽ»õÜvò>¡#*¹5+@+øb©ÏøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓGéÚ¾›©#½…Â\$g‹²v'|UŠ u-sIÓ5¿ºKs(&0õÜ´ûñTøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓDXy“B¿¸öw±Ï9„jMh:öÅS,UFööÖÊÙî®åÛÇNr7AÈ…‰ÅR¿ñ§•êåÞ¦*ïñ§•êåÞ¦*ïñ§•êåÞ¦*ÚyÇË:¢j0³¹ ª ܇lU9Å]Ф¿ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU5µº·º·K‹wÁ(å‹ÐŒUWJï|Ï Y\½­ÝôpÜGNq±5€aÛÀâª?ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU§jún¤Žö p‘ž.ÉØñT^*‚Ôµ­+Lôþ¿r–þ·/OŸíq¥iòä1TøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓDXy“B¿¸öw±Ï9„jMh:öÅS,UFööÖÊÙî®åÛÇNr7AÈ…‰ÅR¿ñ§•êåÞ¦*ïñ§•êåÞ¦*ïñ§•êåÞ¦*ÚyÇË:¢j0³¹ ª ܇lU9Å]Ф¿ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU5µº·º·K‹wÁ(å‹ÐŒUWJï|Ï Y\½­ÝôpÜGNq±5€aÛÀâª?ãO*ÿÕʼÿLUßãO*ÿÕʼÿLUßãO*ÿÕʼÿLU§jún¤Žö p‘ž.ÉØñT^*‚Ôµ­+Lôþ¿r–þ·/OŸíq¥iòä1TøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓwøÓÊ¿õr‡ï?ÓDXy“B¿¸öw±Ï9„jMh:öÅS,UŽùÙY¬ôî šj6ÄÓ}¹U‘b¯ÿÕõéöÅÞÚ&f5f(¤“îHÅZý§Ë,?ò-¦*ïѺwü²Ãÿ"×úbªÛÛ†$ˆÈE _»TÅTæµ¶œƒ4))_³ÍCR¾ÅTÿFéßòËü‹_銻ônÿ,°ÿȵþ˜«¿FéßòËü‹_銮ŠÊÎ'çÆý9**Ÿ¼ U[[$QÊ…$@èz«A¦ý*£ú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅ]ú7Nÿ–XäZÿLUÃNÓÁZÂÜÿLUŠ»CþÓ¿å–ù¿ÓwèÝ;þYaÿ‘ký1W~Ó¿å–ù¿ÓwèÝ;þYaÿ‘ký1UtD"„EØ*Šô U¼UFK)\¼–ñ»ž¬È¤šmÔŒUoèÝ;þYaÿ‘ký1W~Ó¿å–ù¿ÓwèÝ;þYaÿ‘ký1UHmíáCDä"…¯ÝŠªbªs[[OOZ$—xóPÔ¯ZWSý§Ë,?ò-¦*ïѺwü²Ãÿ"×úb®ý§Ë,?ò-¦*º++8ŸœPGô䨪~ð1UlUl‘G*‘¡ê¬›ô8ªèÝ;þYaÿ‘ký1W~Ó¿å–ù¿ÓwèÝ;þYaÿ‘ký1W ;Ok#pDký1TF*ìUú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅ]ú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅUÑ4Š`ª(Ð1VñU,l¥rò[Æîz³"’i·R1U¿£tïùe‡þE¯ôÅ]ú7Nÿ–XäZÿLUߣtïùe‡þE¯ôÅU!··„ I;Š¿v*©Š©Ímm==h’^5ãÍCR½i\UOônÿ,°ÿȵþ˜«¿FéßòËü‹_銻ônÿ,°ÿȵþ˜ªè¬¬â~qAoÓ’¢©ûÀÅU±Wb®Å_ÿÖõN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©µço/hÞ`Ñt ùÙ5O04ɦ@‘»ó6áZBÌ ˆÀ7|U=Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUتEªyÛËÚgš4+ÝÎË­k‹3éÖë¸u·BòeP*‚~_Ýâ©güägæ/›tKKo/ù"F‹ÌR[\k:…Ê*9¶Ó,QšG!Ã/ï\p]¿a“ö×zo’¼Ã»ä­_gj÷s1 gˆ4€öø[8«Ç!ó¯æ˜ÿ/2<ý¥êÓYé´£ÉЬqÒ;M4†žärB_ë+¯Æ_ÓoWzÇ埘fóå×—u˹=K«Ý:Þ[ÉH þ˜5:ÞÅ^Gä?Î/6ëÿ° ‰Z?!y’=BÛÊÐ2 I[MãÊä7R²zRìÏþìãû8«Ð?<¼íªùcÉÉ€ÔóV¿u• ª€Íõ‹†¡p¤7÷iË~<}Fcëæ8èžÞVò†¡¬Ë¨èú¶‚ÜıÆ=MBÙdi¦ªª]açÄ«"üëóž³åÿ,A§ùoâów˜îSKÐJË)øæ½,|G›¹É¬rMýç¡ÀªÿÅŠ­ü¿×<ûå_Íéÿ-<Ñ­7™4ëÍ3ô®‹©ÎŠ·(ªå JA$×Ó˜LÿaxóeÅROùÊ]Ï^T×5Ôó”©åËÆµµÊ‹eÌÆŽ ß?Sâeyÿ»ÿбVmùuùeù“å»Í%õ_?˪hš}¸€ùôt'Š8ýu’GãâƒãôñW›ÜêÞsÔ?ç&üáiä¸aý*tûm7ô½Ðçoal±Ã-Ä̃ûÉ}`±Ãí?Ûødwòæç•|·©y¿KüÊÔ5KH‚Kû›+Èb[9¢}I•a£÷jÅW‹'ÃË–*õËß57š|‹¢yŽhÖ u+8î.#a$+IÔŸƒ˜n5ýœUç6þdüÄüÖÔ¯“5Uò¯¬&{U×Öž÷R–3Gke’‰º·Â$ ÏýŽ(•J|á¡þq~Vé­æý#Î^mÒ4ò²kZ.®™­êɵf^=O>ßï”x«=üÁüÙ³òçå)óí„?Y–¶Ói0IPïB˜}JPñ@üäZþÇU‹EùQù˪i‹ªê?™—¶^c™=e²²‰N…Èä°ðR¾ª/Ù2qÿbÿ¶«Ð¿-OŸÿ‹çÅ·_1§%íX0tàyÊGÛX¹GûKö¸"¬_ò?ÍžaóMÇõJñ®tÛo0]iú,EQDVöô`£ˆ j²ÇRØ«ÓuÌ/Íß0kï£ùšO)ù/A¾—K·z+_]Ü@y^V ÅĬœe¸påñ⬗È^YüâòלçÓõmy|Ïäy-½Hu î)} ÅH¨^O'OÔoOƒr‹«ÆÊ½CcÞ~óÆ‹ä+^y‹WcõkPp%=I¦sH⌮íÿ¼¾Å^o§yCó¿ÏãXóšæò]¥ÐXùwG‰DÐÆÛ¯ÖnŒž­)Í>/ùåýÞ*žy Ë¿œ~[ó\šfµ®Eæ%¼àÔ®À‹P†jü1ÑC¿Êi]÷L«Ì-5O;êßó‘ž~¶òZC£4v¶3k—J%ƒOµ¶Ž4Äîéä™A|<¹óøáU?óç’?6ü•å«ï9i?˜ú†©}¤'Öîôûø£ú¤Ñ% ¡c«$& Çü•dozGü¬Cÿ*üõaê~…ý+õ:ž>¯ÕýONµ¯Sáåü¸«ÿÑõN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»x–½=¯–ÿç(´ÝV᎖½å«˜ngr†²f¹‘‰=a·ŒœUùI¡Ÿ7¯š?0õ¸˜ÿŒýK&  :\¡‰)û-qOROæâ’~Þ*óÍ Î:ÅüãÌ~F±~~n¹Õî¼™h ÊÏ1i\Ò¥V+i¸sÝü о€Ó<‘¥é¾@Évš|zsi¥ºŽIŸµ!fwÿ)±WϾNón«'üãÖƒä=&OKÍšþ¡wåÈ:†]¥¼¸Ÿ³ok7añ/%|U™þpy{NòF‘ùi«éiéYy7X´³v?hXÝ(Šá˜ÿ4žšs?´ïËL,óßçíÖ yåÿ˘ •§t“W»¿aQCèF=7±"Fت—çœcNüÄüªó58¬ÑÒç“jqÔ å_å !ÿ‚ÅQ^P_ñßæþ¯çGoW@ò‡©¡yoùñ€ý!t¿*ý]\|2Gþ¦*Äü¿ç8,¢üãÓäâFÔÆ©£ÚŸÚ}eÕâQ½P8‡—ò¯&þlUê’ÞJŸÊ—Ú}…í[Y¼å¨ëR¿Û{Ûª<¼ÎÕdb¯üWгœUã¿óWúV¥{ª~[ùÆûÊM)¹›L ·6 #,D QáËÖãöWáøqTwäÿŸ<÷yæ¿3y Ï?Vº×|¶ ”j¶KÂ9â¹PëÍUÅãeà‰ö¸²rOT«óÃ?ó‘¾Dó(ø-<Ém>{MÁSâòMÿžXª¦ˆ¿ò³?:®¼ÀçÖò‡¬t~ñÏ«µ óŽÍè…Õ‚Dý¬U¿ùÊŽ‹äÿ+ÿÔÁæKYWz¾%`wµ$x«ÚUT*€ª¢Š£`ì1WŒÙ«ÎXj3Tò÷–b¶ä;Kq2Ê íÞ;‰1WÎK§ÁäO,¯]kÌÖK ñ†>JõØì ¨Äÿ“нŸx¯üã¬I¨kŸ™^j§&ÔüÉqi‡¯£iVŒTšý›Š²ÿÏmPi¿“Þm¸&‚M:k]ünÀ¶û÷HÒóAÿœ^x-¹GwmåFv*$‘ìùÊGqijŸòqVùUùOçKïËŸ/^èŸ™š†›¦ÝYÇ4Z}½¬M'Å,j}O‹„ÆE-ö¹b©þ¯ùçÝKN¸ÓuOÍ]J{ Ô6÷òÚÅÆEP¡ýèûX«:“ò¿Ë—–vŸ—Ú°kÍ*ÞÊ &˜~îRöê¼gMÛÓ“šz |Kûb¯8Ô?+ÿ8|‡£Ïyä?ͨiº\-,z· L 0!oI'<øü#Š*$ þZ®*ô/Ë¿ÌFóGå]îí–Ñ嵸žê'€{G’9 דf…+ɸ6*Åÿç,%ƒòsO½š¾¶«uy{)"„“;EÊŸåyb«u¿ùÇùbó¡æ? ù²ÿÊŽ©!¸½¶„ ‹e$±chþÓo‰¤TäÞšqø1W~Uùßó?Ì=còÛÏrÚêzŽ›bºž·f‚!,ãN2 ¼Ï¬´ãqá'Ûø{*ñOùÈy o4þWZj Mo0Æ÷Ç˜Ä<ê@§Ç ßöyâ¯kÅ]мWþqš$¾‡Ï^j"³k¾e¼!û˜!!â&¼U§”*þÎ*Éç"5A¦þKùªrw–Õm@ñ7R¤ýùŠ®ÿ ùPá®Öÿ }S }o¨ñ­:×Ôø©Š¿ÿÒõN*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»ygçoäÅ׿=Ç—åµÔÆ”ÚSÜÅw(V2Iiz©ñ¡SÔÆŒ¿Ãñâ¯KÓ´û=7O¶ÓìbX,ìâH-¡_²‘Æ¡QGúª1W–ywò!tÏÎMOÏ—ëq§M-Åî—¥aè^Þ¢%Äí_€– ø~/îÿ“zÞ*òOËÈ…ò§æ½æË»ä½Šîâêm ÅU‚Ù­ô¥æ?§¨cXá䟱Ïf?š^Hxò­åYmä¿= ‡R˱H²£7§$ÞŸ³Š¨þT~_#yB-[Ÿ¯êsM-æ­¨šò¹º¹<„·Ä~ ñ|_*…üåüº½ó÷”cÒ4ûåÓu[Ø/ì¯\1Ë!Èp£âíÄâ©×<›aäß'éž[²ø£°„,³R†Y›âšSï$ŒÏÿ аO8þD/™?7tÏ:K~©£@¶ÒjšG­ÍÅ‘‘­Ùˆø(ƒ+¯ÙGþ|U—~iùgÍžeòuΑåmhè:¬ÒFEð.‡ÒV«Æ$‹÷‘ò´Ÿê}—ÅWßyõoË‘äíkUº¹š[¬¯5ˆœÅs$¨Šjƒûn¼™¿¨¿¾§&Å^w£ùþrW˺|z“æÍÿG¶Q –¡¨Á?×b…G7à>Ï«,¿ëqÅYÇååœ^L·Ônï5 5¯3k“ sZ™B4Ò-x" $G|›‚Wö¿—Š"¬þr¶½òŸ—´Ë |Õw­Û‡#„ÒS:†V`ÃtDõ³þËúX«Ò.<‘aäŸ&iž\³£}N!õ©Àþúåþ)¥5ßãž5û)ÅgJ¼õùuyæ;y+]qÃaåk›‹»‹VR^i$ú\HÙ}6‹¿ób¬ë`¾Pü»½Ñ1|åç Û¸®[Ì­h¶‘"°h!µŒÇÅËËô¾Ïòb¨?ÎOËMwÎ1è:——5(tß1ùjóëÚl—H^ݘñªÉ@äoðåãñb©×í?3`·½“Ï7ÚeÝÜ¥>¥•©ACsäò#—%{|Ïôèæ‰^ËÑú»@À1qáÀŽ„ÛxÖùKù·äInlÿ-<Ëa'–§•æ·Ñ5øåeµ2°ŠhVI ×ýEþegå#*™éŸ”žw×uë oó3Ì˪&•2]iº”kaÄg’K#|2ÎPýŽkËü¾“Mÿ6+õ_7¾“«hôú™4m6à’Ù‹Ž$I xò¥WÔ ß¼r$‰öUc7ÞAÿœ„óM‹è^jó^‘§h7 bÔ%Ñ`•¯.aaGŒ™’4‹Ô_´cÿtø1W j>G·‡òÚóÉ^])§ÀúdÚe„É„BXZ/Q©Ffø¹³}¦‹Cùoòî 7ò¶ÓÈ—WRpOúÍå›´sp}I"añ)æÅ–¿ìùb¯?п.ÿç"|¡`º–üÕ¢ê>_·„º¼­Õ¼#eD$ŠÜ?dI#/û‡fŸ––ùVëS×u½Qõÿ8k¥««È‚%á¢C k´q'·Ûø~àˆªµkä=/æõß›.|Ï#ùQ­Dž[Bâ5MTóB}-¤7¬?}ñzÝâ©·æ?åî‡çï+Í jüф֗QKop€„•+µG&VSö‘™qVgå?ùÉÝ.Ýt«O6èZ„kéÅ«jó õ@( DGŠG2É#7í»b¬ÇÈ@Õü­¥jfûÌ7z÷˜5w7š…Û ÏÂú0Ë (â>ÙEý”DUZüœü½—òÿÈV^[¸¹K˨$ž[‹˜”ª;K+2Ð6ûGÁqUŸœŸ—×þòiòå¥äv+5Ô]K*³†.È‘ñãLU›úqú~ŸéÓ É&[Ž—‚”P)¢; %ü?d ^’xIâ%ˆ—d ^’xI⥶¥ÑÓ½ãCTÝf®¢kÄqÿì>ý­¥0¦‡@À±.üXû»‡´‰AŸÞ±=ºD8® • ç·Å˜ËSêüðvCÕ(%”?ÜËÿv)Œ0 ŠÃÚr@›¸–ÍT—0T‘~G˜íBaÄí<„B( !àº2ü–Q•€ `¨Z[iÛ: Às©"#ÂoÉ À ¶m;ŽÓ–CÚ4¡Œ1B(Dø¹ÀFÀUUMh“Ïs*^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâÕŽã´åiŒ1|u]߀mÛ¸bÇÄǯÎ?¢ ¸oØžÿ„ïÇá-ƒÏÙ‰j7Çq(¥Š¢`·8>އŸo‡RUà¯xà£ëºØÉà9ÅÇGîBcØÆ²,×u)¥Ðú`Ê@ `Y!„Rl7ئsÕnŠ¢0ÆLÓ좢(¶my(ŠB‚lzÊŸÿÀG¼:´ZRçÛ¶#""’’’úôé£ë:PJ-ËâãéÜü_"„ {–––ææfJill,¥”¯HJ)wPŽãà ÐuÝëõ¶´´PJ{÷îmšæÍ›7ãããÑtâ@ÚÍ@Q”æææˆˆˆ»wïnݺu÷îÝÕÕÕÜÌy›ÐÐÐaÆåääLž<9<<\Ó4à>ƒJgá7ºŠ«RªªªëºW®\;v,¥tÕªUsæÌA@@×uœSnï¶m뺞——wàÀQ£F}ùå—ß|óÍܹs?þøãI“&¯›?®Ž¬ƒˆˆ¯×»xñâ;v@«3E‹Ãå¯(ʯ¿þúõ×_—––644,X° ** Zý!ä/ˆÜTy^@ñz½PPPðòË/GGGcÿ¹Qó•ªëzyyyaa!!äöíÛ”R¿ßãÆ 4¦Nˆ8¤}ûö!°,kÆŒÅÅŇ:|øðêÕ«SRRø¨Þ}÷ÝS§Naèã]ÿ <®K ]ПFFÆñãÇ> (Zà+Û¶ÿñÄÅÅõïßO†C°m»s£ZG|c¬¤¤DQô§¯¾úê_|¿Z–5bĈìììÌÌ̆†¶}ûö°°0˲lÛVUuРAQQQ<}¢”ÖÕÕ]ºtÉ0 ÆXRRR ¨­­UUUQ”¬¬,Ó4/\¸PYYùóÏ?wéÒ¥OŸ>Œ÷ûý¯ë8ÎÍ›7:tïÞ½ëׯ;Ž–œœÜ·oߌŒ ]×¹ës]wæÌ™¶m/_¾|̘1š¦á@xÂöqôèÑâââÏ>ûl×®]~¿ßu]L@0’wnXîÈšr]÷—_~]×Ç1MÓçó…„„¸®‹Kµoß¾………MMM˜bGGGïß¿ݺuxø¶mÛæÍ›­YŠßïŸ7o^yy9†îªªª¯¾újõêÕ]TTôÑG•””ð@¢(JŸ>}Ö®]›Pïܹ³fÍšuëÖiš†É Zë3Ï<³uëÖ””tâ”Ò¸¸¸üüü1cÆìÛ·oöìÙØm<ÆØ† G޹sçÎà|ïÏXÁa@)MII)++3MSUÕÝ»wß¹sçÙgŸMHHxì±Çúõë×½{÷¬¬,´SÌG{öì‰ EY¿~ýÔ©SCCCÑ \¼xñøñãÕ§M›6`À€àÎÈëõΚ5«®®ZÎìõë×óòò’’’žxâ ŸÏ7þüýû÷€iš”Ò°°0EQ¼^/æ6§OŸž4iÒ®]»† bš¦ã8>Ÿo̘1ÉÉÉ7nÌÎÎ6 CQtY¸Ž=ZZZúÉ'ŸÄÆÆZ–å8ßåà t.‰Žì“`öìÙ½{÷Û¶ !eee«V­ÊÍÍ:thrrrZZÚôéÓóóó8à÷û)¥IIIo¾ù&²¦¦¦¼¼}¥tçÎÜ_{í5àöèóùêêê²²²¶lÙ²wïÞüüüÈÈHÜ666–––Ú¶½bÅ @)Y\\¼téÒS§Nùý~œPÛ¶Eijjjnn¾xñ"躞‘‘±~ýúΚ5kË–- Fíºî­[·öìÙ¶m=:==4Mã9åÈ‘#qš4M³,«gÏž¹¹¹8 ÍÍÍÛ¶mÃŽuíÚuóæÍƒÆXïÞ½SSS¯_¿~äÈ˲***®^½Š¶Œ»–qãÆ=ÿüók×®2eJHHˆeYš¦©ªZ^^~îܹ‚‚‚ˆˆɹáót'.…ŽÔ*¥4--íàÁƒG-,,\¶lYNNNRRRxx8oi†išeee¹¹¹MMM©©©Ó¦MÃÅ^RRRUU¥ªê¾}ûÑM¿ÿþûh§ý Ãp'//àÖé…^À6À»qãÆ½{÷°®0lØ0„ôK555W¯^­®®ŽÇ¹Ãꪪ‹/®®®Þ³gªªÉ|ø•W^ñù|+W®0`ÀôéÓùx9ƒà¼Hp­ë0~ø¡ã8º®›¦yðàÁ§Ÿ~:66‹w8<¯×Ë(ŠÒ­[7LnnîÎ;ïß¿_WW—››‹ç2dÈøñãyUU×u´èà +/bî–eõë×/..®¡¡ÁuÝ'N”——gff¬Ê½þúëçϟdzýðÃÈØ², 0a„ôôô+VŒ;öرc§OŸ.**òx<Áµ¦à”‰GˆG0`^gÛ6híßrµûE‰ŠŠZ¸p!˜¦©iÚ¥K—^zé¥;vTVVÖÖÖ^¹reíÚµ|ð¶gŒõêÕ+##ç.%%eâĉ®ëâ½Øœ9s µìŠ•p¹ÏçÃ=ÿk8)Œ±°°°œœƘÇãiiiY°`Á¦M›|>_KKË·ß~;yòd (ÊÌ™3cccÑkáÕ±{¡¡¡ .¼|ùòš5kÖ¯_Ÿžž>jÔ(x¸ômš&‰ Ã@x¥MÓÄóàÂå{òöªƒûƒ·ß~»¢¢âرcX„¨¨¨˜={vxx8º¿ßÏ`¬W¯^ØWMÓæÌ™STTäóù°²Ý¯_¿)S¦`Ä£‚Ý:‚Â#„`ÖûÞ{ïUTT OûþûïóòòòóóCBBêëëMÓÄyŒ‰‰yë­·pGé8ŽÇãAçÆ7%›6mZ¹r%!¤°°044”/œ\<ægÏž5 í »­µÛ¶GŒí÷QaÀ‹ß¾}ûÖ­[?ÿüó;wî躎[*Ã0Ð_£ýfff.Z´ÓPì( >|äÈ‘EEEØû¹sçvïÞZ—3´ºÓ4£¢¢0—çLÓìÖ­[cc#îª!QQQ7nܶm[ss3–Ø8BÃ0FŒ±téÒAƒáù5MÃ;&c¸I^¸pá™3g233srr‚»Šö…YV8ÐCë†Ð'ÇÄÄ|÷ÝwQ=£Û;ŸdËñÒßm4婌]º AvjšfSSSUUUmm-zÛ¶ ÈŒŒìÞ½{ÿþýSSSqHÁÅêŸ~úiâĉgΜÑu=::úôéÓqqq8)ØàÚµkwïÞUÅçó 4(44Zc£ëº'OžìÒ¥ DFF&$$`$gŒ]½zµ²²²¾¾¾¥¥7111‰‰‰Äí:!¤¹¹¹ªª*999** ïÕ`ÑÔ4ÍÊÊÊ®]»&&&â÷˜V)ŠR[[{ÿþýÔÔT¯×[]]m&c¸:yµ&44Ôçó 2„©Tc€?ýÚ\üÝÉÎgÇ"ì(ÚŸDì%Ÿz|­¯¯¯¯¯wg×®]6lÀ–o¼ñ¾.Àñûì<üâªç>š»#Jip¢òŸ·¯¡õ7Z6ý=¿oÛa‘Û ¯ñ‹ò°Œ=q]ã?¿:!ÄÖ^É‹ÐôpÖøX¼I“BhM!0M€'NL:5xŽbbbæÏŸGy<¼)ýÈÝ0§‹¤¹wbŒÜ â¬Ùw†{mžÅ—}¸çá=7)~,æ'ÐTUE»áç±,ë¯È‹c<æÜ-òB<´¥Wkp\Ål5!!aåÊ•)))¸ñ† ¿,ð” Å<÷€VÒtïƒaXRÆz^‚ß´À3óEƒã}æ·0Gðx-ûßÎü‘ y(@Æ\ŠÒ¶©M \Æ\` aí.ÛRò¯îcýëŸÈ¿ºªs†öÈ _!FhÛî¶µiÀ.Ä!ÄQÚü²‡ÿg÷¯º.àá?jüÝ ´¯º×¦uÐÔÒlY–J…æ´ïV*O-8 œk^²ç  úKáßWÁ»¿æûÞ¶Ò&ÇþYõÇ:&õ[úoXûwIâ%ˆ—d ^’xIâ%ˆ—d ^’xIâ%ˆ×ÿ3 ïÉH8öIEND®B`‚^ÜDdÆ*‰+ðj² ð C ðFAÁ.ÿsysync_diagram_big.jpgð€Rð ÛTª(†D»NCTœZÌ2ÿ|Û˧- FðtÛTª(†D»NCTœZÌ2ÿÿØÿàJFIFddÿìDuckyGÿîAdobedÀÿÛ„   ÿÀçÚÿÄ¢  s!1AQa"q2‘¡±B#ÁRÑá3bð$r‚ñ%C4S’¢²csÂ5D'“£³6TdtÃÒâ&ƒ „”EF¤´VÓU(òãóÄÔäôeu…•¥µÅÕåõfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø)9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúm!1AQa"q‘2¡±ðÁÑá#BRbrñ3$4C‚’S%¢c²ÂsÒ5âDƒT“ &6E'dtU7ò£³Ã()Óã󄔤´ÄÔäôeu…•¥µÅÕåõFVfv†–¦¶ÆÖæöGWgw‡—§·Ç×ç÷8HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?÷ö*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¥ú–»¢hñúº¾¥k§Å¿Çwq ·]ä`2“¨Æ šh°½Oóçò_H¨½óÞ‹É~ÒA ËÀ¡HÛ¿†?˜ŸÈþ¤ð–'ÿ9{ÿ8ûaÉÅŸYnÛOÔ%®ôÙ½Ÿ{câž‘?gé!xXåßüçä}¹"ÕîèH<( ~×ï¥Mßí‰/柳õ¯ Mqÿ9õùMqo¡y†gRBo`ˆÔ;ýlú¸ñO¸|ÿbð üüòï·•õ£ó6cþga”§ÐŸüuxP­ÿ?òw6 äíLÆ àÆêØ;7§ß’‰—QøùáFùÏÿËz ùc\¯z /ú¯“^TóŸ”­nt1G-OöŸ"Ó·Ä׈ QœÛÿÎr~GÎXJu‹jR†]=O*øzR¿ãŠð²ùËÿùÇËÒù°ÛHIn4ÝI­y‹r€|Û¦Y¦þ~JjÔž}Ñ‚ÜßÃhIÛ`.Lg¾+LÓKó®/-U³Ô–•ågs À§bfÅ –*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUŽù“ϾIòt~§š¼Å§hâ• {y ß꣰fúTsDm{ùn~A4^1æùÍoÈýœzuí÷˜n£†™f꜇üYv`R=Ö¹G”OÇoÛö'…å÷¿óœÞoóïeùkùq-ìÀÑy./ä$ýšÛÙD¤ùèr¬¹ŒÎQ€óýd¹Š\þ|ÿœáó¿Å§éÑùfÒJòãkceÀmE¥œ}¹©ÏÛš8}YL½ß® }íƒîB·äGü䯚èÞrüÎ’œ­ÓSÔ.x×­aAU§ƒf¯7µ:AËŸ¾¿I%˜ÂQó„z37«¯ùÊöúfÝÚÚÒ;rMûSI9=¿Ï¦ý³ŸðcÞoõ2ð<ÙnŸÿ8wù?eO¬þ•Ôi×ëWªµÜþ­9ƒ“Úí\¹ppýd²bÉìç$l(bòœ2°¥Zâêö⦔©ÌÃð¦aÏÚ=l¿Ê|„GèeáG¹>´ü—ü¥³Cä¨8þûO·Ÿj×ýÜ­¿¿\Æ—ljåÏ,¾d}ÉàÉ´—¾A¶áõo*èðúTôý=2Ñ8S§1ŠS(–¿9ç’_éŠxGr3ü'å_ú±éÿô…üÑ•þk/óÌ­ËŸ’Ö6Mÿ9Qù“jÖÑX­µq5ôÐ.©h¥™ÙöÄåü—„Þ÷÷2h€õ—Ôá?*ÿÕOÿ¤(?æŒã?5—ùÇæ[è!¦ò‘®\Éqå&Yfi4ëV$R›“ÉvqÊrÿLW„%7?“Ÿ”÷@,¾IÑ éi–°úÔÄ‹—ǵõCü¬ÿÓpäŠóþq¿òJûûÿ(Û§Oî./-úÆ “2aí¶<²?xG…æ3¨Î ~N^‚- Ôtê­ñjmJ¬¤ß=ó3µºÈó1>ñú©‰Ã%¨ÿÎùa›ž…æÍFÅÔò‰®­àº*A$Äm÷t§ôÎÅí¦QõcÜHýlNÞ…OùÇ¿ùÈO*Êù§1‚=’ÞKýJÅTl=3Æ}Û68½³Â~¸H{¨þ¦NQ1ù£þs—ÉKYÒ/3XB¢Ó¯ §ü`0Ý1ù×6˜}¥ÑÏøèù‚?c„÷# ÿœÙüÈò¬‹æwå“ÚµB¼°Í.‡Åc¼ŽpÕì=AóͶV,¿D„½Ä³‘åŸùÎÉMo„zÄš——'4 oìÌÐò>dÓš{².d1§´y_ó3ò÷ÎG•<ϦjÒ°¯Õío!{ß⇗¨¿JâŠeX«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«D…˜ÑFä€i^SçùÉ?É ´kh·»Ô£¨:v—]Bà0ß‹}_’!ÿŒŽ¹_Š:oøï䞀ëóœ~cóãé”BŸP¼'÷S߬·r•&€›;Ÿò<Œ§6ns”`?M}ÅŠC6‰ÿ9“ù¬9y‹ÌÊZ<Ûý].NýÙê¾–œsþ¬Ì>ìçõ^Ñèñõ9ÙöÔ~MÑÂ}ÉŽÿ8[åÅ—ë¾uó5þ³xçœËh©jŒÝü¾¼óªœÒgöÇ',P{þ¦Á€uzÏ—¿ ¿'ü³Å´ÿ)ÙM2ÐúÚ‚¶ ü‡í­´€õ@Í£·uyyä?OÝMƒGG¢[Û[ÚB–ö¤ñŠ$Q"¢(ð  š©HÈÙ6Yª`Wb®Å]Š»v*ìUØ«äÏÉ_ýjÿÌÏù‡Ö?î«i¿lÿÆ^|ÜÉ¢Y}gœC{ãÿÎmR÷Sÿœ„_-OçëŸ#h0ip<ÚŒÒÛÅÂ'•j‹4KÍË*õ”Îï±ñè8Æ!–FGj¿Ð\yŸW:ezE­ß•?-üé­Ï6ó&žÖ¶[ëàËzÚ5ijñ–+›É+/¨©·Æ½@Û0²ÈfÔbåx ŸO.!^è«ÜÈlïVò¯š4Ÿ+þXhçœ|Û í¬¶pH|Ç|Ì^úêe•' !b‡áy°"¹¤Õi§—S8bÆA¿¤o_-¿C`47,‹ËÞuòŸ›4ùµ_-kº¥…µE̶²¬ž‰ Ê’(ø”Óz˜º\2œLIïH/6ÿœlóÿ›¿2|¡ªùÍw 9MRk=?„ÂVáŠMÄj ï%+í›h´´¹£ b½6}öS R$nÈ7ÿ5àü§Ò´Eô¶Ö'Õ¯ÓOŠÊ+…·‰ÜÈ¥‘ÃQ•ŽßjµÚ‡²{,ë%(ñpˆ‹º´Î|/EÍS6ThäPñ°£#A±iX˜$¿)üÑÌêþRÓÚWÝ絇êS1ñ2ÚœŸ™ÍžŸ¶uX¾œ’øï÷ÛŒ%óüáw‘¯Y®<«­jÕyF’ð½n8ƒéJ>™No4þØçŽÙ"$>Gô±¬àX<‡ÿ9uù[Y<‘çó™ø,d»[ŠF:¨¶ÕDÛ´O_ ó Ó{[¥É´®ÌXû?ST°ßLÿœÓüÆò]Äzoçåô¹×"8Wо\òŸ–|¡d4ï,i6ºU˜”v¬eÈèd`99ÿ)‰9Êj5Y3K‹$Œ›prN2„»v*ìUØ«±Wb®Å]Š»v*–j¾dòö‡u§Øë:­¥…î«(·Òí®n#Šk¹‹¤| G!œò‘ 9»Ÿ&@LbHŽæ‡/r 3ÊRìUØ«äoÉÛ»[OùÊïÌ–»ž8Hu„ŒÊêŸô«qˆ©¢“OÏkÀ˲ðP½ãþæN<>²ú»ô¶•ÿ-Öÿò:?ëœO….âäZ,EFàô9v*£ygg¨[IgoÕ¤£Œ¶óƲÆãÁ‘Á|òP™‰°hª^þVòÛèÓùté‹ Ü‚·lvñÇm b ¦´Û-¬œb|Gˆu½ÑAŽy«òƒÈ>oò§’õ=-bÑ4ê-mÃ%›EaqZlMCq™z^Öχ)Ëz¥ÎúûÐ`¦%åOùÆŸ#ù3Îz74kÝBKÍ9“н™.VáåŠX}WbŠC*Éð…¢ü#jÔœíW´y³á–)Ô»¶®_©ˆÄ·¤ùÛËŸâÿ(k¾WýYµ{›$¸§!ÍEr;€H$f£E¨ðsC%_ œ…Šx¿ä¥ÿæÇ‘?BþSùŸÈŽ4;º‹üUep²[ä–”5v¥y†¡û΃¶a¥Ôqj1åõô¿wãïkÇcjy_”?5tËï6þtë>my¬¼ÿ¨Ïs…dmæ—îYb"•URaøœÁAÍÖ¯²ç©Å¦Ž:8â±åû~-q|ÑÞ^˜?—_ó‹š~»ä¥Y×u9u^ò–{›k‘Õª Á,â¬NÛ°¯Qù}Oi˜fúa2ü‘b3ï!ù÷óËŸ2ù¿Kó&›ù‘¤éQG6˜×1þŠÔ¡ôxIz—êÄ"áæÉWvb TšÍv‡NuÇ(K —:õGú<=ök¹”djù¡?çÿ5üËæýCZ²ósê·SêÒϪhÓMnL¶´ŠB&Ž+“FÚI¡Uâ¦ã'í'eãÜ|#†£-ýDô±îÝqLžo¡´ï1yWž[m'V³¿¹‚¾¼6·PÎñÐÐóXØ‘¿Žr¹4ù .Q ðÜL²¥@ë&æ 'ÓuÝ>ßSÓäûv·¤ñãÆ@E}òÌ9§Ž\P&'Ëe"ß?ùßþpûÉZ¼‡Rò5ôþVÕú‘D¥îlýE< ì%Œ×ö–J/eΧCív|{ecäWÙñi–y1‹OÌOùÊùDz#óU±ó¿’mÍ ÔÏ%ê¤KZ•½Qõˆ¶éõ…*:–ƒ·tÚ£*—óNÇöüyâ!ïß–ó–ߔߘޅÕéò¿˜¥!›«²ÇŽ{Ct?tÛì”rz.nˆ{À €A¨=(v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUãÿšÿó’¿–”¾­Ž«~u_3 4Ðt³\+v½DpïÔ;r¦áN)ó ÷Ÿÿç&ç%eh<±y3òþf*g‚I-!’"hD—”õî *aP‡ö—¾j;G¶ôú]¦n_ÍŸÙñm†"^‰ùwÿ8£ùyäÿFÿÌH|Õ®¡d½@¶HÿäZ‚U‡üe/ãAœ/h{S¨Íb»—?Ÿê§&8@{´PÅoAk1€±ÆŠU@  €ÍI²Ú¿»v*ìUØ«±Wb®Å]а¿$~gùÏÚ¿™ô] ¸®¼«x,5º„G’‘9DUš£”Oö¸ž†›æÃ[Ù¹4ð„¤Ed+ôüØÆ`²ë‹ËKCºž8 αB%uNr9 ª¼ˆ©$€ÌÀžA’AæïÌ%ù gó~µm¥-Á"Ý&bÒËJR(Ã;QRƒ¾dé4µŒq2¤J@sBÏù£äX¼‘uù‰± ß•-´·¶ÕóäEÃf32¨FÔŠÓ'ÌÎs &$Lô?¹b­òwç?ç^•çÙ|‡ækVÑÓCÕÅåî¥n±ÛÝ[—ŠFheBÀ•hWïíÛö?cKN2ã3Œ¸ãD¸;ó‰Îé÷yÓ’ìUØ«óþëòòÇó/þróB¿¼–Æ+{Jõ&Q˜¼w±EćڄHs¼í>ÞŸfvf °ˆ‘<1£çÐÝÙºêsJÕ ûGëeÿô)ž]ÿ©Š÷þDCœüGúŒ~eÞÿ¡|Ï(aÿ8IaçíçzŸPñ=GÁp‡ñˇü¤~­8#úÿñÂÖ}—2}ŸµzÿÎ=þbé¿ñÅüƹ‹U(×–¿jî§zn:e£þúIÿy¦ûb~ø†©{31Ë ù+¯‘ç'ôz¾›ù„×ÀV‹6©y3ŸÚéw/QAñeÑöϱr}x%ócþö_¡¦^ÎêG)DüOêD'šç14 åôu«téÊ-.ZÒ§¤^”¦´ï™í?g³ÿ<~°ãO²5qþø„Ló“ž^_ßÍ¿—‰, ^SCifßÕcjsû9¬Çüî£ûY ±/KÒµÍ]·úÞ‰©ZêV¿ïû+ˆ®#ÿ‚‰˜fŸ.ã58˜Ÿ1M€Úž©åÝ\Šxu.ÓPŠæ?Bán­â›Ô‹~ ÍM@` ­ökS†dF<` ±ú»ü·Lr‚ô>~aykòãËÃÌÞešDÒÚhm£kxÌÎòMR¼Bö⥫^ƒ5zMNOz½ÙÊ@Egwo¨ÙÁ}jÞ¥¥ÜI4/B9G*†SC¾à÷ÌYÄÄy„¼óþq£òÓÏÞµìV_áýz@Oé1V5wñšßhŸ´@V?Í›ÞÏöS§¡|qî—è<ÿG“\±ò fÿœ›ÿœeSI¹>pü½·ûVÌ%½µŠñ„Ÿ^Öƒ¼méƒÔ¶w]íŸSBø%ÜAä~ÿ'xH} ùMÿ9qùcù—õm3QŸü-橸§èÝE×êóJ{[ÝÑQªv áöS›æ’ýŠŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Vù•ù»äÊ}0j>sÕRÖI6šlT–úê›~æ<ˆ®ÅÍwaŠÓä-wóËóçþr.ö/þRiÒù[ÉÜŒWZ¢Êb”¡ÿ–‹ð> ý+qϵXf»_Ú¸4¢òK~î§àÛ d³Ë/ùÅ?#y5¢Õ|ÓO5yO>WIKœïð[’y‘üÒ–ñ §8Òö§>{Ž?ÝÇËêùþ§*8@æ÷ÄD8Ô*( ª¢€° æ ¶ÖñWb®Å]Š»v*ìUتԒ9 Ü1CÅøx°¡§C¾$R¼3Ìÿó•Ÿ—z*Κ¶¡æ+»9fŽþKY ©Uyfk•B«É¸©ã¹´Ú½&›Ù}DëŒÆò³w}ÔÔs#¬ÎOùÖÔiÞ{°òz/äÍåêØ Né¿Ü”®•X§+G Ê6V+Nu9‡Ù¬'‹ Éûð.‡ÓåÓ~~ NSζMÿÄ:ýÿçÿš-µræ*y§Ëï7—ä³e·’ÚI­¢¬A$j§šñœ«5zÛe—Ç<ñ€ãÇ?Uï{Ø›õñÊ—:çæâßXùª[_"ùFh¦Ô|ׯ갛RöÞOQb´g©^k±U'Z¿ è3jµô”qÞLƒhB&¢?ÇŬO=™'çÖ§¢þ}GæûíZ×Kò¶½¦[Gåß3_é_¦l­áFαEÅÇ3 sÈ –Z칉Ù1Œô>‰”á#Å.wëðû“?ª×ù/òµ|ïù;çý+ÈúÍæ®úŽ¡mwa%æ–º.Ÿuue+HæÍG^¡ B#*T(è5§àjðË,DxbA©qÈüíº|o~iŒ.&•<Ùoùçù§ùi§~\ËwÒŸËëbn5 ©ã€^=¢‹HÖÒ9–$CF.äHʰ#K-“S,þ7ìÕï½_ܧŠB©õÖ†/F‹¦J?GQ¶âòÊÅ'ô—Ô^HYM¢¡ˆ÷Î7¸yY§ #²µv*øÃòûÿZó#ý][þêVÙ¾ö×þ1tÿÖ‡û‰»Og?ÆeýS÷Åô.xëÛ»v*ìUØ«±T·Sòö­¯ gK´Ôö»¶Š~Ôÿv)̽6¿>îòJÕ‘sNLŸÕ}á‚ë•zÀvý õ Þ¿¾±žX8×Â>F?øLèôžÝvžò¼cº@·êû]v^ÃÓOøkÝø¦}ÿ8´–7_ò_šîôÛ¸êa7 Wµ'¶h™~„9Óé¿à"8u#!ý_ìeÅ÷ºÌÞÌGø&G¿öSp7üå‡å埫ŠtèúÅ,©¨ÕGM®Â\}Ù¶ÅÛÝ…¬úÃ/1Ãþæãóuy»Uâ_·tóIÿœÅÖô;„Ó¿3¼“=Èþòk/RÞM¶%mozÿÈìÍ>ËáÏ=6a1ð?ì£útå8œH/eò—üä7圌pØyŠ÷§ú¨ Œ•=4Ô²;f“Wؼ˜;ã¿Ý¿Ø‘¦:AwG"¤öÓ¡WFã’7 ƒPA4à|Ù±Mò¯òãËš¿éíË}†® º‚Ý£/³zc¢T|m™¹»SQ–œŒ{­ˆ€5·ü©ó7å—•2uï,ÜIæŸÌO6<²ÚܤqÚMÎMJ‰%#”m,’ìßk¶måÚ˜õYpà ðñcçחíóaÀ@5Íãzò5—‘¿%<•ùr4x%üÏó¶¡ ÄÍ$(o vuýØzR¦H`ãZ}¿|è4:Ùj5™sq øÆçä×(Ô@ê^—«­ë?œXü–òýÚ]y/ÈÚM´^mÑ]AxÖÐÄ8ȳ¤ƒ•D(¬%fz³PqBIê¦*ydx(ÕY=ß~ÌïÕ]ÌŠOùÈsäï0?—7¼³uå$žY¿Ejñ}a=²¹³4ˆ`¥yðçCÔ/Aˆ=Ÿñññé¦2wŽDìø§Ä£»Ûí® ¼·†îÙÄ–Ó¢K ƒ£#€ÊE|AÎvQ1$aµS¼oó;þq¯ò÷óM¿ø̯R5M>5T•Ï{‹}’Ov\ÿ6oû7Ú=FšÕ[›«‰(bEYÝÜ€ ¤œUòæ—üæ-þ¯©Ÿ"ÿÎ?éÒkZíþmÚU ZglÃ㯭0?•‡Å•fÏ Q2™¥”clgÉŸóŠz™.§óo玵sªùƒPVw°Šé¤twZqtjY’»GÀ(>&]³‡í/kÍðéÆßÎ? ~¿“• éOä˜5OÉÏÍ-cò;ͲŸÑ÷÷´{†$FnÙA…Ò»¹‹É¯Rr]»‚:Ý,uxùê÷uÿJ~ÅÆxMØÁ¹Å]Š»v*ìUØ«ó§æW‘¿/ †9kPibâ¿W…„“O(H W¨îÁh37GÙÙõ$ŒQ2¯—Ìì‰HoÿœüËón}ä¯5ù%5DòÕš[ëjO¨%ã«Û[ÜÇð7:FÜ£ ýŽtþÎön)Ç.<¼ªŸ—¦VKÏ,]Ïlîn #‚<Å}:Ñ—ï¾:>Ɇ9 <¼,†ý]2 î=kšÊw¾áè¾iÿœ”¸ògåÇ–õ½[BüÛæM/ìœ@ÃJlUUdºµ “7¦„°Z ŽA³S¥ötgÔN1˜à„¨ÿ:¿[3–ƒ?—óFп+ôŸÌŸ8Æ,íõ­L–ºlƒP =Îâ4‘8© µOÃB*O]`ì™äÔË-Ⱦ~ƒ.:YÝ­ÆŸ®ép]ÂëKÔ I£'Ã, eä’Œ§pÃ5’Œ±Èƒ±‰ûC>ož¿2ÿçtRèùŸò²ïü-æˆ_׎Ö7’+'™O д»×¡J¯J*õγ²ý«ÉŠ£›×ÿâ¯ïóižy!/ÿç+¼õùc«Gä?ùÈ*ä¬TH|‘v±•åXþ ˜ÿâØ.µæÙßéuxóÇ„ƒ‰(û'ËþbмפÛkÞ[Ô Õ4{µåoyk ’6ÅGB̧pv9’Á3Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯4üÝüóò'äÖ™õŸ2ÝúúÌè_OЭJ½íÏP‰ $u2=Zr;b!HŸÿó—:Šßk³Ÿ*þUÅ';{XËg ÛzHxµÔ¢›Êä"šñãöN‡µ»pýSþhý=ß{v“UfÇ—Vz•³Ë _;~wþRùËÊþw¼úÞ‘q2ÛùSÌRÙ­±ŸÑc"J°ªFLHñÆA¥~&Jü;kûJXt¼y1 zãw_÷ç÷³…ÈY‡å§å7žì¼»såÍýgNó?”Ê;NÐá…¤H£ùG!¸xà“’¨ »(¤0¦ø£Ú¸%dÓFPÙ—¿ÊÈüre¢Ë|—ù%ùcù}¨6¯å};mT†T¼šY_b"k‡~mU¡#bNak;gS©IØîØ}Ì£ŒLÿ5lŠ»v*ìUØ«±Wb®Å]о0ü¾ÿÖŸüÈÿWVÿº•¶o½µÿŒ]?õ¡þânÓÙÏñ™Týñ} ž:öîÅ]Š»v*ìUl’G m,α³»ªª7$“°(ÄÈÐÜ šæ–iþhòÖ­pmt½fÆúékÊ k¸&Pj±±=eçìÝFñdÇ8ŽóÚa©Ç3Q'È„×0›ÝŠ»v*ìU ©é:^µhö½”öR}»{˜’hÏûW/Ój²`—9HuØ×“f*@æñ6Î1ùKSs}å;¹¼½¨©çjZâטܬÂD5î¯AÙs¿ì¯ø#ê°úucþ–_¨ü¾.‡Uìæ)ïŒð˜Ilü÷ÿ9ù#Æ=v/ñ” ØÍ3=â¤b•+t \EA°õ”¨ì3®Óê{#µ¿»—…ÿ ôŸ—Ó/óM¼î§³µ¨Xïþ>/lü»ÿœ ü´óߥe{uþ×\ Ùjn©¿qÖÑ··> {.`v‡³Z>àqǾ?¤sûÜHåì—6Öº…¤Ö—Q¥Å•ÔoÑ8 ±H¥YXt!¡ÍdbAØðo2Î+ù{PƒNÒ¼¿®êzg•aÔ÷PòÔ×—:|—D·¤'#•$!ÎùÒéý§Ée8FSá¡*_ÿvÍGaÿ˜ÐXùþrcÊþNóô gä.ÞòÍÞÓR¸’4nUYB™©íN14å\ÏìùKfäË„ÞIQ½â?³‹o %Þ]¿Ó¯5oüŸäÆ·Ñ¿"¼ƒ äÞiŽeIôûÛ‡Ë1˜Ý RU Õ"bŒê1Ê:Q“-ËQ˜Ž’¥W—?3ºƒ½Aë^Xÿœˆü¢óVºžZÑõÕ]BWY ›y­a¹sEU…æEZ±4Uj;sE©öW†r†Ýhƒ^öÁ’%êy¦fǼåäo*ùÿI}ÍšlZ‘©Œ¸+,.nVŽî§~‡lÊÑëréçÅŽTÑ(ƒÍòî¥äÎ/ùÆZ8~Sê3kžHf2êZ\Èf¤Kÿ-–É@à/ü|Cņõà:ú/d{MQPÉèŸØ}ߨý®.L4úoòGþrWÈÿœ¶ñéñ8Ñ|ê‰Êç@¹“ˆ%žÒRL  uî´Üõ9iÅÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUòŸçüåÌûùòr%ó窾¥ }jÖÖføx[¢róE=yn¹ 䌔ÈFØWåüã-7æç•Ëëžf½¬¶q/Ö9¥òJ‘!Kð(Ûâà{cÚ£+†Ÿaüî¿ï?s—{é袊’Qc†5 hªªŠP6ƒ8’I6[×b®ÅVÉsFñJ‚H¤]VV ƒ±b nñ…³Mÿ8Áùôö²–òÓÍ”âÌO¥´²|-]Ç+I‰ïéþÐÏA«¡¿ò¸þÿøðû}Î7Ñ/'Ú Êêd` °5„óç%¼UØ«å:jÏù%ÿ9/'æ'˜mä“Éžo²[GÔ6”ÛÈ*K#Û£•]ý6økÓ;m/ÏvoƒëÆn»ùý÷óh‘ᕳo6ÎOyr-CEп,-‡ž<ê\$oeng·D…ÔÓ÷Ïù_„…PÅ©šý/³Y e<çÂŒG=ÙŽŒŽQÓt£[ÿœpótžp×õ'ù¼yoÊr!üͦÀŽóVBÍÐâ`2cãž?¤ý×ø¡¿_.'GÛÆqÃÇbbzŸÛIGœ7uã¦ùFò!Šo8ù¦ ;Éв¤1K]H4äüªß²³;²}•Áâj²êìaÀeë ô÷ Û©hÕö¬øqG×0ãñÑ‹þe]y‹ó'ó;KüŸR0éÖ1Âu›˜‡î'âêyŒ`ÐñZ,q’@nù¹öwŸ³;6}¢ar‘<ó‹†1¿3¼Pâv„²ju1Óql>¯3VOê —Vÿœ\ò©³·>XÕ/t½fÝãe¾šA8`¬91Dàn¥wÍF—þ Z®3ãÂ3Ò}»íß`¹Y}›ÅC‚F2y½§L¶“IҬ쯯Þökh£†Kû’‹$î /7ãAÉŽpœƒ6YJ$ðŽCÈ;üqàˆÝu(ìÆmv*ìUØ«±Wb®Å^cçÈ!ùÌIr¶Ÿ¡µ‡«}OUŒ3òÃö§© cüÙ×ö7¶ÚíG‹Ä‡óg¿Èów“¨Öv. Û× »Çêy½¬ŸŸ¿ó”}ëüQäXNö®²\ÁcÆúÖûTÖ&1Ú¯Lô='löWlí?Üæ=û_º\¥ñ©w–ÕöN}>ãÕñúGO¹îß–_ó“Ÿ—¿˜>†}7øsÌ’¿P¿‘DÈ{Asð£o°WàDzœÂí/fõkqï¤hp#”²\YÚÝðúÌ)#DKBì8Ù”¡dnªx±Rh#29džùÿò2ÃEü–ó_“+ìäK½Jxµ7¶yšY®LÇ)dsÈ€‘Ò5bw÷$çG í¹OY.s´GºÁßõµK¤€ð6y§Ë>~ò/•?)¼‹ä‹»/Ì› ­"¸SfÉe$ éÜ9™ªy¹ í"­Äô gK¥ÒäÓçɨ˔D¼ï–ܶò÷¢A»×µùÉKÏ/yþo+Ùh÷>hò¿–l½?6êÚe»Ü\¥ä+Ig‰¬hãƒú¥Ey|Bƒ–‹³£&ÈcœÏ HЮƒ¾ý͇-{’¼ëåïÌ/[yŸË&çL¹ä¿˜åŠT4x¥Cº²ž½»‚A9Íf&›!ÇQ ±"Ùb¥óÇæÿüã—æißÍß—/—<ë ýdE0ZÝέÌ81ÐÁ5w&Äý¡SÈu}í<ðT2Ü¡ßÔ~±øòiž+ä§ùCÿ9c®y[W–Ÿó¶òéÚ½«-¼>cš0¬; ½TYHû71Ô»w|ôm>¢ 'Ä ‰(Óìˆ'‚ê®­eI­¦E’£`é"8䬬µj˘*b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅP:γ¤ù{KºÖõËØtý&Ê3-ÝíÌ‹Q ڬͷ]‡‰Û|9ù•ùñùÿ9®Ü~XþI[Ïcå姬žvòÝÛ“Åžy)X-ÛzGöä¹0µÝ¡‹K<†‡Ú}Í/[üžüˆò§å-žŸ›&N7ºäÈ€zÇn¦¾”~4<›ö‰Ø/í~Üˬ•L:Gõ÷—6Ä^«šVnÅ]Š»v*òßÏßÊèÿ4|…u§ÚƧ̚g+íR>/Yゾ(ááË‹³›žÂí3¤Î úe´¿_Á†HXaÿóŠšy·Êry'\‘‡™ü¬«Yj%›OSéÄÄëýÓø|5Üæµ™àåñaôdÿuûyüØáŠ}œ»k±T¯¢èþ`°“K×l-õ-6jz¶—p¤ñ1‚R@EGcÛ,ÅšxåÅb{ÆÊE¥ž\ò’¼ òIåÃIšPD³ZZÅ®§~&@9·Ù­2íF»6oï&eï(“!ÌT»v*Ðt,ÈZrPwéQ+ϼ©ù©cù‹'šlülòOåÆ[T¾ÔWѲº½oRˆ†2òp_Oâr üBŠsiªìÉi¼3”ý{Ðæß"wtòtÿœ˜×4|ßåŸÍ=?,ùëN´»¸Ð 'ÕnÜDÂÕ¤g©.*²(â´¡máör<šyqã‘]ã¿û9†¿®ù³ßùÆí3]·ü²²×¼Ñw¨ëÞd‘õYî/ç’âQ”KeV’Ä¢@?Ë9¬ö‹$¤ÃŒ=; ߯۷Á–!¶éü凗¼ÙæË™Dk?Ð:X—S×c¹}h‹bž‰µ(¨ )“•>þ9>Ëj1cÔzïŠ^˜×-ùßÙHÌ {ʾCóæwüã÷­qç+½K[Õ!Šû@"¶BÊk%{sdï”’7*Q™€¡ø¨HÌ­V»—_CŒbj]n÷âò?Øc̓èvÔ9¿0(¼¯¯C"yƒÉ÷òù•&Vîtþ¤’räßVÇó³”Í–}t:}FHN@8}Òþß“."§ó‘ÿ,?ç#ÿ0n¼õ¢¶¥§]D—V·+f—¿U{¸á¸wá'@æCqÐü= ÈÇ}Wga¥ÂFÜêêÇèº[FÕÿ+.uOÌO'þoÊO/ySÎ7¿”ínU¡Œµ­Ô·qÑV¼cǪî@¯ ‡iö„tÙ´üGŽxÇ®¼À>gûSØ>i?—?)|Ѩþ„òŸ™¿-u‹ûëI£‹UÔ5O0ˬcÓkèªP(C% V¨ã‘¨í\QâÉ<@#az¯Îÿb*}º«ÅBÔš*MI§‰Ï:r[Å_~_ëOþd««ÝJÛ7ÞÚÿÆ.ŸúÐÿq7iìçøÌ¿ª~ø¾…Ï{wb®Å]Ф>vòâù»ÊZÇ–Ë*>£m$PÈõ(“S”NÔ©¢¸Ri›>ÆíÉê±çþd>î£ån6³Oãb”;ÃÌ&?%u?"ê·ž`óeŽö°‘-ž’mä’hà·ãG`eD ‘DQM–¿ÍµþØc×âŽ81…ñNÀžœ‰÷žó]Σ²;"X$g‚ysüÑÒ<Çùqù¥oùâØ>¥¡Îª5xb÷<`ò‰8ƒÅYu“ µÛ–ÓÙ­VŸ´»0önYðdA=}\B»È;ÿ7—–/ibɦÔLGzü«ð{ÙFÿ9%äÿ1ù‡KÐ,tÝF6ÔŸÑk‰¢Ž‘LßaxBò3z¶Üzô­4úïøêôØ2fœàx7 Nã®ä ÷us0{A‹&HÀ z˜×æ'™|±ù‹æÙ¼½’õO5¿•x®f°º6Ș$£Š)f ÉDø”’ 6Í·`vv§³t£1ÔãÁãÑQâóë} êâkõõ9L9dðï‘¥È2ÜØjþtÓÞ[Ø|•¢B×QÙêŒ^ãO1;ŒöR\0û=:å¾ÜötrbÓLœùO ÃéÖþ{‘^ö=‡¨1–A¿EÔ¹…þRÿœŽóV¡§Þ^jO¸Õá‚tn´˜fXaªH¸‘„‹Ïuâ>w;d{Sþúly#j#Œ‘ÊdY?ÑçÞº^ßË(’q™oü?§›Ùï1¼¦j‹¡êzõ•ž±ð¬–’Ü h€<$o²§~ŒFp}ŸÖåÅâãÅ)C¼~c©ø;ùö†ˆS]ÖÁõ¯Ì¿17çf•ù{å¿«Ë¥¬Q¶¶&Œ¹Z£\ÈQÕ”©ñã¹›ps¢Ñû;§“YžÄìðQóá?­wä9ºìÝ£“ó‘à ¯âûþç°g ï]Š»v*ìUå¾ü†òWž=[Øaý ¯>ÿ¤,Б¼f‚¡ÜŽ,›;.ÂößY¡¨“âcþlºV\ÇÚ<6»±0çÜzeÞ?HxÏ‘??0)5{Ï-Ïv¾rò–“3[Ï<ޱGú|ín™K"ÖC†Oå×=wQØú}~(eáðgXå{‹¢:Ÿvýï0qÈÆø„O7Ø¿–ßœ>GüÓ²õ¼·}ÇRC]è÷4ŠòR¤:ÿ—e÷®ÙÃödgÒJ¦6é!Èþ<Û#1&a«XK¨é·öv—Ri×—–ò[ǨۅõíÙÑ•$N`‚P·%¯|ÀÅF@‘ĺ<‹"6ù£Éú§ä?äôÞOò5¥Ö¿ç9Þ>û]†Õ¶úÙôT¹½2Q„P«?Ûfz×:Ý6®=¡«2‘b#}Ûü{ϦƒÐêöoÊËØ,|ƒ¦yT:Í}kNá>Ì·“žR•ÿ%vE=ÕFh;[^uYå“§!î‹m„hRa{ù‘äm3ÍQù'RÖà²ó<ɰXÜóƒÕY‰ˆå‘DLÌE«“]©•C³³Ï‹“ñø´ñ ¦S˜I`Ÿ™ÿ”žPüÖÒ?GùŠÛ…ü*Gêð·v¬•ÚB~ÔmðŸf¡.Íí\ºIÜÝGCøïc8 >xòŸææ§üâ6½•<ë ¾bü«»•…Œ±V5-ÉžÉÜÒ7ý§¶sÄÅ+Ìúfv¶-d.XõŽ÷&2sy?Î^Yóömæo)j1jz5ÐýÜñÑÀ£‘ŒŽµø‘À#6)î*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»c^|ó÷•¿-¼·sæ¯7ß-Ž•mð¯íK<ÄÁÝäjl£æh «á½SVüÑÿœÇóAŽ?SË”:UÇÀ´&0V´gÜ ‹¢§ <"µjú^×í¬z8ï¼Ï(þ“Üñâ·Ô~Fò–?.´|½åk1kgiZ=Ì´¡–y( 9û‡EPg–ëuÙu33ÈlýƒÈ9‘ˆ™.b%Ø«±Wb®Å]Š»|wùߢê_‘ß›šOçO•¡? õ‹‚5‹DшÓg¨}2rû¾ãÜÂq1Ü"¿ç|ëå=Eºü»Õ¥“JóÝÅô·³[j èµá™c³š³U>›Qy-ErÕhòÎc4}XÀ­º{ÿZáåÕùý¦X~f~s~_~T˜ÇIõjê%Q:Z8.bJ|9§Jºûd{ $´º<Úpˆé~ïØS\€Fþ\[~pþOyÅ-ïô»Ï8þ[Lk¤kpËO…3ÈÁ-(ð3 }¨ê6jûFZMnHcËüQþwã¿æ±â‰®¡u}.Ï\Ò¯´]E=M?R·šÎî:Óœ7˜¤Zû«åqe8æ%q6> Ä[È<‡ù9'ä•¶±æ ;_Ö¼Ïka§ß7Êž‹K£0/0g‘â ­­Ièk›íwkþ|Æ„`I?³sÜ/«\aÂÇÿ&ü­æ-óƒÍ_œ~`ò¬þR±¿µKM+M½_NáåD&Ъ0b!«A¼›r¡9•Úú¬xô˜ôÐÈ2l‘Ë­·ìcL‰¦e?ånº??m¿5l®­@m,Øj6¬ò‹É&ôÝU”*)æ@v;xëãÚpüÓx¸¬w}þþŒ¸=VõœÒ6;v*ìUñ‡å÷þ´ÿæGúº·ýÔ­³}í¯übéÿ­÷vžÎŒËú§ï‹è\ñ×·v*ìUØ«±Wb®ÅPvÚF•e;ÜÙØ[ÛÜÉ_RhaŽ7jø²€NddÕeœxe2@èI-qÅ›óÍSòSKŸÌמjòþ»ªùnÿSf}R=2àGÃ9äç§ Y¾&øˆ¯@3¨Ó{c–:héóbÇš0ú8Ř÷|†ß}º¼ä„¥.ty°áù9æÏ'~Xù³Ëþ_š=oÌžb¸ˆIpŒ-™¬PJ}v¡sYú?\ßktºÞÒÓæÌ,Xbvú½ËééÑÁþIˇM’õJgÝ·ÇãófÞSòö£ùyù4ÖVPÓÌvšUåûÆ3FH^p†• UøÇþÇ9îÔ×ãí×â‘ýÔ²F?æ#~V7ø» . iô”¨DŸóªÿcÅ(<£ùQæo'k:ÏŸob“]k‰Úêk‹×·šÚ ĨŽLÌY‹Õ? :×Ð=«í^ÔÒêñâÒDŒt(Ø‘åGm«a[W7AÙZ].\R–Sê¾ú¤÷þqg˯su¯yÖížržž“§ÜMñ9U $¿h’(‚; ŒÖÿÁ/^#ZXÐç9òoû\f´öe”ïü#ñò}/žHõ®Å]Š»v*òŸÏ¯ÌOð7”ÏO—‡˜u°ö¶%OÇ TýôþÜAâ§ù˜Ç;Ob;óú¾)ÝâõKÌÿ ~<Ït½·¯ð1Pú¥°ý%gägå¤OòQ}bÕY×ÑgÔá™p”úV̬)²±.ûLGl—¶žÑKY¬ýÔ-¢GY|ùyv7g 8}CÕ>~îæ=çùÇx¾º<Ïù]xÞ_ó »úñY¤¯A½`•([­ëÛá¸ì/ø Ê#ÁÖn/âÿ8ßïpûCÙèËÕ‡Ò{º|;¿“/Ë¿ùÊ-kËZ’ù+óÊÆ[+è8ĺ臋èê(ÅOi¡?Êwlêu~ÏâÔãñôR‰éqè|ìyyqc— Åú§OÔ,5k(5-.æ+Í>åD–÷Vò,±H‡£+¡ –qÙ1Ê1¢-Œ~j7œò÷Ìä Ç͂ںpŒ/Û_WÒ ZÉésôÇóR›æoeŒ?˜‡ô^ÿŽëæÆw[>.ó>¯æ _˺7‘â×®|éæ3ˆ!»Ð¼Á¤Ï±¢êI"–’Úöo‹eh÷r¡yæ§ é±c†Ie0¡ ©BC†qóˆùûÜbMW7Ðw?óþWü»ó'—ÿ,<Átuôë,üÏæQ%b¶¿†SÉ@%É*ÆZn¤¹ä-ÀË©Ç<ð6I„{Åþ)»ÄÓÜ´­WL×4ëm_G»ŠûL»A-µÝ»‰"‘ueÛ®ÇÀç7—±ÈÆBˆèÚ ¡üÅåÍÍš=΃æ+õ &íxÏm0¨> ¤P«º²AÜžŸQ<3¢E¾JÕ¼·ù™ÿ8•æy<ëù}<š×åµÜŠ5; ù4b2HX¯U>ɤW*űñoMìOh!«ôäîè}ß©ÄÉŠ½Ï³?)¿7¼¡ùÅåµ×ü¯qIâàš¦•1êÆvá*ŽªhxH¿ p@égءث±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]аÍOÍ(þPùfO1ùªç>QéÚtTk«ë€µB¿ñ'? ÷=*¨‹4/,þaÎZù´yûóWÒ¿.¬¢Ótè "4`ÔÃfÔëܶäì½(œßn{A à†ùÊ>ÿÔäbÅ~çך6‹¤ùwKµÑt;8¬4«4[ZÀ¡Q{w$îIÜÎùæ³O,Œ¦lž®`ŽÊÕØ«±Wb®$S°N*ñ̿ϟðíÝ®…ùo¤¯ž¼É4sÝ]Á¦Íõ˜¬­­˜$7ÕDË‘ãÇjwìAÙ݇âƒ<ò𣰵“Ýt×,•Ëv]ùQù¡¢~lyV/1i*m®coCSÓ]ÃÉip%K9)’=!Ø@ÀíNÌž/·xe ñsšæLoÏþKÓ?0|£ªyKU[ꕎjh'_Š)–½ÑÀ>ý;æ^ƒY-6Xä1öŽ¡Š|çÿ8»çMSÊcÖ?!üæLŒ÷£; c«Ü@„õW_ßÄFÄr=Æu~Óhã›ux¹8¿AýàÓŠTxKë â[ÝŠ¸ ³(Ü“°b¬GTüÄÐ!òŸ™|ÓåÛ«o0§–mîç½·²»‰‡©iâi˜SÄxÎÅÙùXc˜0ã"¬wš¶&[[Ïu›o&~v~HGç¿âhVn@ >2$J…ý´âΣµN“W”é² Ãé==@ýŸ"Õ ˆ°ǫ̈üÅÿ9äß'ÙyCF½±Ñ.õ}æ5DúÕb·A…2Ó×Võ‘ æ>ø³CÙÇfæÈrHÔxw»û¹u®m’¹OKüÀüü¿üɸÓïµë) Ôtâ‚í>Am;ƒhdp§’ ¸þÒþË šéôµŸJ±.‡qïg,`²]'ÈþUÑu6×,´ØÛ_’­¥ÖnKÝj1,*­up^R8¢òø¾*TÔæ&]nYÇ€ËÓwÂ6ÈlÈD2 ÅK±Wb®Å]Š»v*ìUØ«ã/ËÏýiïÌ¿õ5oû©ÚçAí§übàþ´?ÜMÙ{=þ2ª~ðú–§ ƒ£\[»cÐ’ üI_³"íãCP4¥Ù9´’©ºHr?ŽçL¼Çä-+U½ºó.“gŸ…ÆŸ§ù—ÐÏl'^!ø’•¥¶à¡ Õ§×J•Ë‚c|ÔÇæùÇÍ>^Ñÿ!?-¦òd6‹æ¯Í¿ÌQ-”÷&¸2zçƒ …Ǧ§âyO3° ë4º‰ö†¤e'ÃÇ~î_û†Í$pŠêQ¾QüÓòÿüã×—,+®,¯¼Ñæû1%ÿ˜¡ÒÂÉo§ËqI^äLjT?Ƶ$‚i•êû3'id:€F8£ÅÎU×â‘1LûÍ?ó“^PÓ<¥ kÞX·—^Ö|Ë,qézNî‚q ÂU^eX0hÒ¹½8ÕjF¯KìÞYåœ2ܺr±_frŠÙ쪑êºj¦£eÆ+غÓî–9(²§Ç ª £R¥XTûŒÐY„½'‘ؼ6>MüÅü¦ó‡ä?™?åo~HÍ$Z]¹-©èÊo«Äæ²+Gþíµ;rSñGöÛ’ú`ûF3V,ƧÒ]ÿ·ïqrâ­ÃêoÈÏÏ+~vh?YÓȱóE’!Öt9²@ÇoV"¼…›ì¸éÑ€={‡«â‡b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мóó‡ó‡Êß“>V“Ì`“Ö¾›”zF‘q}px­kÅ É!QâÅT©ñÿ’¼ƒçoùɯ5¯æÇæä­”‘øéZDAâŽâØ‘²–&;pßnJòÖ†µaÊvÿ´#Oxñï“¿ù¿µÈÅŠ÷èúöÖÖÚÆÚ+(RÞÎÝ+{x”$qÆƒŠ¢*Р<ÒR2$“d¹j¸Ø«±Wb¨ g\Ñ|»`ú¦¿¨[ištd»¼š8" zr*{ùfÉ.#Ü7Rió÷üäüѨ~\þžü­Ö¬µ?%KëØy¢m8Çs2Gs¤+*3pOŠŽ Zž$çSìö‹uˆ˜äØÂöåø÷4å‘­¹0‹_(Êý[Éÿœ¿‘P]ù‹ÉšÔQiºÖ•¹»e¸uWJ(¨,é¸;G2 ü'ˆØËWù¸dÓjÈ„ã¼eÈmøøÄ±áª!ïÞPüÑ<çýsÏÚÕÍŒ^a…Ç—"YÇ37©$Œ*ž[ àK€Jµ1«íyæÁ 3ð«¯ãïÙ¶0£oIÍC7b¯–ÿç+¿/ïì&Òÿ:ü£Êß]Ð¥·]VHWãáƒmtiÔÆÔëZ©_Ù\ìý–ׯBZ\›Æw_¤|yÿkFhõtü®óþŸù™ä7Í–4InÓÔ-—þ=ï"Mõ4 ºWª{ç7Úz isKéËÌtm„¬[0ÌN C¸=F*ù‡óGòSÌžK¼Õ|ïù+ú®±kqgæ'Ä£º‚éYíb^¤s,#¡û™ØöglãÎ#‹UÎ$O¸ŽóúzõïhœÜ3oËïËmzóþqâÃò×ÍO.‡ªÝ[Ý[_”ô¥šyµ &81J¼/SÆ»Š‚3]¯íG´|~°#ßÂÞÎ1ôÑzg“|©¦yËo•4v‘´Ý./F•¥`X»3•U–bMÍ>³U,ùe’\äÎ"…'™Ž—b®Å]Š»IµÏ7ùSË*[ÌZ冔åKÛ¸mØe‘5íLÈä˗艗¸ƒ i­ÿÎRþKhÅ‘5×ÔçZÖ->Òâ^‘Õ#5ö|ÛáögY?àá÷‘ý¬X° [þssÊ–]Ë•ûtO­ÍofÓoîÍÁÜûLÙâö3)úòD{¬þ¦8è)¿ç-45jŸ,~]€¦¼ ‰}A½*`H+ÛüúX}Ñbþ÷PÆ1ûÉr!‡<þœr?P’~wÎRju6žZ³±¤±1Ð ©þ—pß?ìÊΟ±qóÍÿr¨öN¶\±Ÿ»ïC·ç0.¨EÜ6A{t3ο5“§Ñ:¾ÁS/ùYûˆû=¯?Á_þµ/Ò_󖲓+ù•ßâd®ž´'zQ â>°*öÛ€ü¥úÛ³:ß/˜bV@üøÓ<Ǩy¶Æþ|Ū‰F¡|&·-0šEšJ«FTUÑNÊ:eÚ¾ßì}FáÉ(F¨Qé°ëæÙƒÙí~)qB÷„ô'üå©å±Ŷ#ýƽ)ÿ¢§ÝšžfçÏò³ôIÌükG”ÿKúBåóüå5 °Cz«QȦ”yס¤,‡oÀ{;Ù©ò&?Ÿ¦Ñáv¼yÆÿÒ~µëù³ÿ9 ¦m}äøoP1K ™Ójƒm1þÎ@û+ØY~Aùñÿ}ÒÄêûJðßù§ôEÿœžó.–iæO#É3‰¦µ§OÙšÿ‰dü ôù¹Ôƒðû¤h2ãþó1÷„ÿMÿœªò-É ©iº•‹ž¬±Ãíp¨¿sS9íW±½§‡žêÔ¿Ü’]†.ØÓO”À÷í÷³‹-BÃR„\i×PÝÛž’ÛÈ’¡ÿd„Œçs`ž#Ã8˜žâ)ØBq°l"2¦nÅ]Š»v*ìUØ«±Wb®Å_?ÿÎGyÖîD°ü®òç)µ­má7ÑÄ~?IÜ,ûw•÷oòGƒg§Àÿ±à õù¶† xo¼T¿Ío˜yžßÖX!õKŸèªþ\ù&ÓÈR±òõ¿¸}]BáÝ÷rd}÷¥~ÿ$ âý í‰ö†ªY¥ÈíÝÈ~“çnç³ôcOˆ@sëïey¥s]Š»[$qËÅ*‡ŠE(èÀ2²°¡ˆ#%A¢@"‹çÿ>þFjZ¦¾{ü¸“J×mÎt«wôÁ?´mXš Ž°·ÂÃaO²}SÙßnã’?—×ú¢vã?ïÿâ¾}ï'Ú}^¼?éWêz?ä¯ü䵇œ'Éߘºžbo«¬’)‚ÞöTŠÿœ~ÿœÐ?;4-ééþvÓã_Ó:7-ˆÙ~³mÈÕ¡cô¡ø[öY»—‡²â‡b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬ócóWË?”R¸óW™$.kèéÚtD ﮈ%a޽:UÜì«¿€*€ø×ÈGóOüäÏfüßü×äžSÄzN’¡ÒˆâbVÞwèkê?Y»×‘§´=¿ùqác>³Ìÿ7ö¹8±^åõüAkvÖѬ6ÐªÇ 1¨DDAÅUUhPži)lór×àWb®Å]мƒÍÿó‘ÞCò7šu*ùŽûk½*Ò+¨¥Ä­ô²‘H- “FR¨‡âø‡÷ºOg³ê1G$"F¹òó?‹ä×, yWç«åÝ[ó·É‡óHÜCùQu¤‹Í2”¸··úܪ䛨¬ŠÁ½5‘z¨áÊŠNnû#Hh²~^¼a*5D×—Núø°™Bù*~Jé^TÔ?;<óeùs]þP\é"ÛT…ħËu1}$|Lïørýž|~8;g.Xè±ûf±üêø|>Ϋ8r}ùsùkåßÊí}ËMrÖ72Þ8»¦!ä   ÑT*…]–¦•jó—íÑÉ«˜œêÀ­ƒlb0ÌNÅ]Š¡µ>ËWÓî´½J¹Óïb’ÞêÞAT’)T£©ö Ó'$¡!(š#p¤>=ü³Ôo?ç;µË-~vÿyŽHÿG^LH@e$Y\× ©­¼Æ€r¯Î󴱎ÒÑ ð¸sî‡ûáû\xž Sì¼à‡b®Å]Š»v*¥uukco%ÝìñÛZÄ9K<αƋâÌÄ>xc#@YWy¿þr‡ò‡ÊlðG«6½|•ßFŒ\­GOß±H¯òÈs}¤ökW›~ý-¾Îc\²Ä<ƒPÿœ²üÉódkùk䵊2Jýnáf¿uÿ(úb(£?ë–¸>Îèô¢õ9€òÚ?¬Ÿƒf Y³Ç/ƒºÒç$üøKù§ÍÒérÿyi ×Õ×ý“œ6§ùmóß1çídivÅÄ=õúg¿È;¬Ëjò}d@{÷û?[Z_üãfzÚö³y¨NÇ“ú –ÊÌMO"þ«ø!šýOü3±cŒGËþ%Üàö;úæeîÛõ³M3òsòßKâbТ¸‘z½ÛÉsËæ²³'ܹ¡Ô{U¯ËÏ)Õ¨ýÛ»|>ÏèñòƾÏß³,°Ñt},Ó4ûk%€[A ”øf—6¯._®r—¼“÷»xÐ<Çåû¯3i²Iú&ÌÍëÉ$LŽ>®‚G!w&Šs;[ØùôÙã‚`qÊ«~óAÅÒö–,øŽX“Â.þ±¸¿=¿,¤n-«¬~¦ÒëþrWÉ1Ü2éñu c¾åOPGt~ƒ–gµÜãàÈûá÷\yi{SOË÷ƒý7ê’o¤ÿÎQËa8°óç•î4û¥ –KNJñ­µ×ÿŒ‡5ú¯øŒ‘ãÒgÒÿŠÿ¹ahŒlf'ñÐþ·«ùcókò÷Í¥#Ò5ÈãÐ +¢mn ÙT›#þ¥sŠí/eµú=òb«S8ÌåÈ<+òË:‡›üɪþqy z·7LšXaðú­ðK"û1§îcú—=#ÛžÑÇ£ÓãìÜ» >r>©|;Þs°ôòÍ’ZœœÉÛñåÈ>Ï'z´–ÿ;^Òõë-j7ñÛkš4–0JxúÜX'c·"Oµ©í› —¨Ë‚Yá(@Ôˆéû;ÏN®<õXã1jRäf½Èv*ìUث˿5¿%´OÌHQ´á¦ù²5Ž¢¢‰?@—!waMƒ‰}Çç²þÙfìâ1Îç‡ù½cçÕÈù:NÔìhj}3ûýÿ­ ü©ÿœóåþ²Ÿ–_ÂH–±Xy‚r]âBx§Ö$ßÕ…©ðÎ7_Ú¨Ý}]Øøu¸¿3¢"@ÿýǾ?ƒÆLO¸2 !õŒ°éÚŧ4pßé—h­ÅÕ'‚hÚŽ¦†ªÀìFq ÊÚÁÍ.ówšt¯$ùoQóN´df™šqm,¸UUUîÌ@© I|·I¥–|‘ÇrD |›uæ_ο0Gwÿ9%寗|µ¡Å(òï—µn Ë9HRžœF?PÊxÑÜQÂñBÓ·Ž›GŽ´Tg)}R±ýö6‹‘õ>Žü¥üÓÑ4<«§êö÷°ëòÂÏ©èÝG-Å£Ç+@Ìñõ¯(˲Ã9>ÕìÉé2˜xoiVǯö·Bvök>QüêüžÖ¿.uøÿ;ÿ&Ùôûí2_®êº]ªž1ïY'Š5ØÂ¢âðñ$ýšß{9í`Ìwþ~ƒú —PúWòóÛ@üîòѼ¶U±óNœ±¦»£ÔŸIÚ¡f„Ú ñ=Tü-ØžåÄ!ëX¡Ø«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*Æ0<ûåÏËO*ßy¿Í7?WÒì–Tr–âfÚ8!_Úw;Ó¹¢‚qWÃ~Vòÿ›¿ç,0eüÈüÀY,¿/4Ù}-7KFoEѩۓJƒJÜÎXì)·kÚÝXðC|‡ýŸêr1b¿sìK[[khl¬¡K{;tX­íâP‘Ç*ˆ«@€ òéHÈ’M’æ*àWb®Å]аÍoÌûoËM*ÂH¬Xó·tšvƒ£Dâ6ºº€99Š‚Ê ¡ÜÞ£gÙ}šuR;ðÆ"å.àÆs§ˆy»È~[ü溗RO4Ágùó …¬±y~×TŽâÎÂêË”o F’›·Æcðp^Ÿk:=&»&„pødéìúŒhzŸÚ75‰{Ù/åüÿ™ÿšsÛywó“ÈKåm&ÖH¯ïõkb—7Z€¢Å=²8Ø•›DîHað¦aëã¦Ò=6cÇ#°‰ØG¸þß—TÆåÌ=ãDÐtO-ié¥yN·Ó4ØÉdµ´…!Œ1êÜPI¦äîsšÍžyeÅ2d{Ëp˜eJìUØ«±Wb¯ÿœžü«?˜>HmgI‡Ÿš|¶$»³àµ’âÚ•žÜSrh9 þe ûG:?f»SòÙ¸d}Øù…«,,#¿ç¿5?åeù(u)½O4è>–­Í’eãû‹“ß÷ŠcüêÙ_´]—ù\÷èžãô‡ÜœS°ö<Ð6;v*Áüõù¿ùyùs4kPÃ|SL‚·¯µGîc«(=™ø¯¾lt=“¨Ôÿw]ü‡ÍŒ¦7ÎÚÿüåž¼ás.•ùEåg‰~ÏéÈþ·p¡º9¡¯ûñä\é£ìæ—K=^P<®‡ë?ƒ\æ±DÈþ>LNoʯÌÿÌ;”Ô4¼×3¯"âÈJnZ2z„xÛÅÿ<Á‰›Û ”pé1_™ôø£ñ§£Òû%š{æˆîŸÕ÷³/~Lþ_yx+¦–ºÒÒ·‰$‘ßÓ`"ä™Ëk½¬×j9Ï€wCÓöý_kÓi=žÒaþ#ß-þÎ_c0Ô5=ËÖ[Ô®`Ӵ訂IYaIû*µ ¯€¤Á§Ë¨Ÿ œvåÚåÍ nDF#àƒòç›ü¹æØîeòíú_%œ‚+‚ŠèQ˜rHªH=˜lh|2ýeê4†#4xx…Ž_¡§I¯Ã¨ã—syOæg熳å/3^ykFÓ­¬„[»“$œŒÐ¤ß !@( ÉÎÇÙïcñjôñÍ’rõ^º9ïÜó]³í.M>cŠšÜù‹òïdŸ›¾`Õ­ÿ."ó'–/d²/%Ážk•âH;èvÍW²úRל9â%´…çGû °ííVHèÆ\R1úMŽãý¡åú” ó‹g­ùÓóCÑŽþœéóÝs•CõJM8ÜR”ç]Ÿ´å§Í,Zm˜šâÛìéyÌZ›gŸU\BèŸ×/ÐúKJx$ÒìžÖqulÖð´7#¤Ñ˜ÁYúÃ|òÍHÉ!!ÂlØîß—Áïða6(oßæñÏùÉx ycF¹Þ‘ߘÎÛ~òmÏÁÇü§þwÃî#õ¼§¶QýÌô¿C$“ò{ò÷^òô –776ÑÉå»:˼`†û\Z•èÀŒÕÇÚ­v æò#±äwû>Àû?¤Íˆz8IÇ7Ÿ~Pkïä=ybòS,M¥Ä–§—%A4¤ˆ§ùkeÄçKíN’Y¥ÏG$…ü kã¿ÜèûQ#¦ÏŠFįˆ•ýÈÏÊ‹‰äoœh¯n5uÜiѸ&¾ç(ö–ùcOçáÿÓB{gù37—û€À¼—ç/!è^TŸMó/•XÔ¦–vŠõ­í÷VE ¸Þ-?g¥vε»+[ŸR'‡?‡¦åóáä~.“³»CK‡Ž\\r$ïCå|Þ¯ÿ8ï ëš?—µ+VÞ[[kùã’Ê”£ˆUåÛ€ÕPzxS8ßnõ¸sg„q‘#xˆ÷ò¿/ÒôÞÉirãÅ#0@‘Úþ÷¨ù[ƒËzþ»sK „/;Ä„~=ܳ‘ÐhΧ41DÑ™§¤ÖjF RÈwóhç"üˆñÚ4ðßE-À&tXŵ¨õ1ZËà ±ñÛ:™û­Tb@å¿ÕîÛá½<ü}­Òб-ü¹{÷û­éöšÆ—}¥Å­ZÝÆúTщ£»,?LþÑ-J{צrYt¹!ã”O5]mè±ê!8 ‚8H»kO×4]\¸Òµ+[⛸µ¸Šb´‰ {ˆ(üÆnv*ƒÔ´/X·6ºµ”ÖÇýÕsJ»÷Áß/Óêra—9Ÿ#MY°C ©ÄHy‹y§˜¿ç|«‡—Kh·F¤w2ÁÈ÷h¥'odeίCíÆ³Ù+ óØüÇéçµ~Êé²o òÜ|è¦/—¿>?,¨ÞVÕ›^ÑbéeË×P‹_‡ê×eù@Õͬõ‹ÚŸßã𦋗û(óÿ<:iöWhi?»—‰ïøéÿzÊ|³ÿ9A§zÿ£<ÿ£M¢_ÆxKqn$JÝýH Sä9œÒvü ²pñé2 ±è ðôŸö)Áí‡4Lã§1ö½¿Bóƒæk1åýF FÓ`Ò[ȯÀžÎê}˜žy­ìüúYðfówÁè0ê!”\!3Ì6çb®Å_1þpë‡æ§æ.™ùMå¹èû ëª\'Ä‚áGï¤qÒ–ñÔR»¹+Ö™ëþÉé1öOgÏ´3TÇ Gø@þ¹ÿcG½ä{[,µzˆéáÈýý~_{èÝF°òö‘e¢iqz:}„)ºm^()V"•cÕs¾yN³W=NYeÈnS6sÔáÅp Ìf×̾nó‡/üäPÕ<Åx–Ú“l‘ÝÜ“ÎXâõQcQ»?¯p¿ Šž9ëÝ• Ì;ÃÃrjeöFû‡ :÷¼Ž«<¿Šf£Œ~>ÒͼŸùÑ«ù«SÔµ™4%Ó?,,crÞ`½˜ÂèÑV¤ìË!m—Ò재jsÝ­ì†-&8bxõR?ÝÄ_?º¿.}ÎÃIÚóË#.CøãpJ¯?ç+<•ù‚×JÔn¬¸›À°ÆXö’7pH=¹>Ã3qÀÇY(\²B2îÜüÍ}ÖÓ?i°‰P‰#½ë^PóŸ—|ó¥.±å˱sm^!%†JT¤¨wSøÄŒâ;W²5 ¾hðžÄw‚îôº¼yãÅa?Íc’ìUˆþ`~]y{óH:nµ ¨ƒ F ={Y *Tžªiñ!Øû¾ìh³ön^cÒb¼³–KEÔ¡å‹Æh. ™iÞ¡•¡8©Âx§Fã(Ÿˆ+Íã_šß”7>uó>“æ}r+É.Y½Ýæ‡6¾œ–«¿"ƒ¦cýº‚ˆ ¨¹fÿ²ûX`Å!Ž7žf„¹óý7ó;–©ÂÎüžqùe¥Ûþe~x[~`þ]hQùWòÛÊѵ‰»¶„Z~”uÐ)œ:óªÆ£‘äTfß´².ˆáÍ?.MèïÃøûùlÂåc“é*þcy7Ηڞ—åíR;WFš[}NÁ•⸅âÄÇ„K/!NiU÷ÎGUÙù°F2œhHX=Äe$(w¨Ì4¾FüÞü´ó'ä§›¢üñüž­­•¼¾®³¤À„Ãn¬A—”hG+YiûÔÿuÖ‚œ=Ù¾ßñ@Ôú¿„÷ù{þÿdÑH‚þ.0ë:S7)ln¸Ô¡4‘ºÇ%(ÃÁƒÙ¸¤=;v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T·­é^[Ò/uírî;#O…î/.æn)h*Iý@ ÉØoоÔu4Îd~ho_Jü¤òÜ„B›+¬NÔ¯B¦êà-OU|iñé{o¶#£Ç|ç/¤~“äß‹¾½Ñ´}3Ëú]¦‹£ZÇe¥ØÆ°ÚÚ¼Q{âz’w's¾y6lÒÉ#)%Í‘¹Z»v*ìUŒjÞyòÍ—˜í¼ˆÚͽŸœµKi¦ÓmeS!E™AQRjÊ…”¸V¦fbÑd–3›„˜Dïøý=d.Ÿ1K0ó'˜òCþrbi—S†ñ¯<¥æëvKo\\;¡FÓ—¤|“á#Ó4eZv xXÿ5¡ª§u_mŽ¿6Žf¤Ë?,"/ôïÌÛo6Ï Aå/,ùTÝÛh–±\«íaÜÉ ÝÝHÌÅAGåÇá¦À-+˜=¥Û‘–˜ã9'’Œ¶¡[Pǽ¾˜ÎA¹ØªÅޤÝ]ÊZÀ­$ÓÊÁ#U™™¨rNÄÈÐܪO¢ùÏÊžb·±ºÑ5›Kص?_ô¥2ò¸ú«˜Æ„†n|T}9~m\D‰ÄŽ¿+ä SÌÇK±Wb®Å_ùÊÖçþq£óÖÓÎz\L¿—Þhi>·k%)]MÜzr‰ÊÏÚ‹Ó–zŽCµ4'¿¼ÇËô#óq¥è•ô}“kum}k휫=¥Ìi5¼ÑÉ$r(de#¨ Ôg(˜’Ä9/8üÊüøü¼ü±G·Ö/þ»®€xhº®«ÛÕÜ$C÷cGÙ6ÝØzVñç_·àÂY|ß«þs~z~s»Ùù&ÐùWË YZîÞFÊÖ”{æPäŽâÝTøçE=/föX¼òñ'üÞì✽fêuÝÇnó°ùþ¥O+ÿÎ>ywOqæ«™5ÝI©$d´VÜÉäIós^ìÔ=×9îÒöçQ—Ó€ QùËõ€ø½~‡Ù<8÷ÊxÏÈ~³øÙë6:}Ž™l–Zm´V–qŠG¬q¯ÉPœ^lóË#)ÈÈž¤ÙzŒX£Ž<1àÂÿ244ÿ˨­R{o¯ï–Fµ‰cŠ‘P7©!©°è§7ÝìäûDȉÆ5}NýÃöºžØí¨h€¸™rîÛÏö%ú·š5/8~OÜù§ËW/§j¢Õ®$ú»|q½«ÿ¤Æ 9 ª·±ès'MÙØô}«€œ8«~¼_Iû¯âÑŸ[=Ogœ¸ ªöòú‡ÞÇ´ëé1!oṑ®u}>ÞXæw%äiôò.#%𤳯¤õ$æÏ>ÙݵP™wTý'à ¸roeÈå~qÜ|Å<¿Èµ÷‘"Ó|ýcÎ}[™t1ZƒÐí20ñ°1ŸæB+ñg]ÛzhkŒô’Úb"xÏØ~Ñ¿‘£ÎvVyiuÞÁ1öýܼǚmªÙ[ùßUüÐÖì\CkoÕœëN,HŽXwÞ(ZŸŽai³KEEŠ{÷ƒþúAÊÏŒj§ªœw>~€YΑsþ,ÿœv¼·sÎ}:Êxdht×Ä?äZ&sú¬”íØž“?éö?i.çO?ÌvIc?Òn>Êy¯’-ÿ%ãÐb½óµÅÔšï©(–Â?¬p(­ð`E¥E:É×:®×Ÿkæ:aއ«ÓñæCÏöl;8bÎOûoúé{%­†‡ù­å[|£«jZ…¢JúxŠ&tyR(# YX•Ueâ^§®pÙ3æì­LΣ2äÈ8·édïË©îz¸bÅÚ"0ÎXáÃö?½)üÓò%íåvŸå½ oõÉìu¸SÀÜÝ0”NÎXDµ OlÌös¶¡>Ñžl¼„¡_ÍŽÜ5Ìù8Ý·Ù’†Š8±ñLÆWÞ‹»Þ”[yóËRÑ­<·¢ù`é1Çm §×ç‰á™Q#órʪh*h„ŽÛævMccË,Ù3x„ÈË„ïøA'çN,5}§iòõöŸ%¾·%ñ´µõ#-"Íg KFV+ñeÜæË¶{[M›µ0fŒÁ„lïµNG¹ÂìÎÎÏA—£S—|@Bé–Z¾¥ù-7—5;&µó ­ÍÅþŸ œyú¨v]‰þñy ߸9n£ÚXû\f„¸±ÈÈù~ÃE«cdŸgRL!øóäο)/üÇqå8tß4é÷V:¦—ÆÙdº‰£úÄ~éÁn¤žUïœ÷´ø4ñÔ™àœeïé7G¯ë±Ýv\ÇŽX˜Ê;n9ŽŸ© ùë}õ/Ë]Q£ÞIkl‡ç:ÈÃC—{‡´ š$~Â>òÕí6^¼è}¯.‹óȶÿ”å ¬]uãhÐýM­ÈSu ª]ú?hH kÛ¦uòì-d»Só_»â»¿áá_gsÍǵ´ÑìÿÇ×UU×ù×ö£mµ§òwåW—ü£¬h¿¦55=Á¶Ó'‘ Xà–e1òañfud¡­jÊ2i³´²ê1äðã‚®@]7ølAçîn† é´8ðÎg-ÔNÛ^ß}„—P±Õ4?ù:¼±•u‰o èÂæ;¨$òŒ3qrV$ü[øfv Øõ-A9ŽxŸª<&$yí}îq2âžV1 R2L®ÅŽ?K4óožüûÿ+hùgÉ4»KKxÒ}2OH[Ë'¤gg’I*¨¡¸º“N5®h{3±´_Éž>§ÓÄMK{øhÏ‘æ;vúþÓÕ~ÂÁ½§jå{Ÿ“!—ó3UòO—í¦ü̲ æ;Û™â²ÓôµG/a>6&V^­Ù¼6­s[g±ks‘¢—îãe)÷›Ûé¿ÁÝΗlÏKˆT}r&„{¶ódJüÊò÷ž$¸´ÓÄöšµ ås§^GéΊRÂ…”Ššu¨îk;_Ùüú%:”%ÊQ6îÎíŒZ¢DlHs‰æÌsFí]Ф¾aò—–üÕoõ}M†õ@!$u¤©_ä•hëôÏÐöž£K+Å3»â9W Ã¨’"_Ï›ÈuoÈkË׿§?,uÙì¯cÝ-f”Å%:•KˆèíÁÖž-®›Û,:˜xZìBQ=@±þ”ýàûƒÊj½–ž3Ǧ™¸þ¿×óFè?óžmò}Úh?›:$¦E¢JÖ)ÙA¡s¤Rò¢e<Ä×{¥ÖDåìü£ú¤Ø÷_Õt¯àáãí¬Úypj`o¿ñ±ø=óË>oòלl¿HyoR‡P·õmIb' ’&£¡öeæ}£ÙZø3ÀÀùò>ãÈü‹OªÇ˜\$ üßóü_—¾N¹Ô¢uý5w[]"#½no!ËÕϽ|Úû)ØG´uqú#ꟻ»üî_oGµuÃOˆËøŽÃßûwüãŸåüš'5”-¯ùˆz‘< ™#²fæµ'zÌxÞ#Žo¿àÛ£Qœi±ÿw‡m¹rÿcôüÜÀÐøpñeõOîý¼þOnÏ|óõN Uî}\\Gßéâ뽤‘Œ!í~꯽ì¾Xò7–|«åø¼»¦ØBÖ˜K––$v»jO9#ã,wßnÃjgÚ]µ©Õç9§3Å{Q>Ÿ(÷S¾Óh±âÇÁ+ï÷±#þPAä/9k>cÑõRº.¬®£@[nCY‰I}F¨CÈ'À(™¸í¯jåÚLxrcõãÿ)ŹڎÕ×kÜî=e >iN2ôËøkö½/9nìUتCç'è~yÐçÐ5ø=[I~(äZ,°J ,LAâË_‘‚Fm;#¶3è3 ¸£¤‡qü{œMfŽˆpÌ~ǃùKÎ~qÿœaójùgÌ.¯ùc¨ÈÏm*B+7Å=¸$ð‘kûè+Fê:«g´cž›·´þ.Nhó}Ǽ6_´<¯I“K>rè{ßhéz¦æ]ßTÒî"Ôt]F/R ã£Å4N(Aé ¤mÐç—ñLÆC†Qb ¾xüóü½“O»ò|¶qj“] sNò¹ϧÈÜå[уÉC]¸±P»ïÔö&¿ˆd¾žuÂgÊ_ÑüsÛ¹§$yw0_ÊÝgZó?æ-§ŸïµE!~^ÅmçËØZÊçU²’"¶ð]Õ«"òZw¥ |ek²í<0ŧ8DyšˆÆ7=HîŽL lß@ú³È¾{ò÷æ.€žeòIJK¦<³[†š…ÃÂÜ[á~Çbññ¨V»C“M“ƒ'7"22à‚ê -®cY­¦VŽhdPèèã‹++TA¡1c" Ži|uç//y£þqSóßó?òö6¹ò§!ƒRÒÙ¤‰#{9ˆŠ9[KBTŠþß§û=ÛƒU ŸÞGýï÷÷üÜL¸ëÜû›Èžyòïæ?•¬<ßå{Ÿ¬iZ‚r¨%‚A´Ì ž2!Ù…~U9Ó¸Ìv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«‰MêqWÁž?˜úïüä—æ·äÇå¤Õò^9“UÕ­ËÀÀKu#)Á i×÷Žk½R˜=¡¯†—É>œ‡yîl„,¾‘ò7’t/Ëß,Ùy[ËÐúvkñHÔ2Ï3y4¬«¹Üý€žA­ÖÏSä™ÜýžN|cB™b¥Ø«±Wb¯/üýüÉÔ+ü‚ÚÎ>¹¨]Ã¥i²MÄÅ ó¤’z®€…Hš•Û•+µssØ]^~} qpéö°É* óò³OÕüåÈ?2<Ýigù¹o$‹¤y¹Ü[}bîK—¸Ž×á ÌŠQ8HG%Tì»?´å ó81“„ýPçBªÿù†ÛÕü…ù/ç{Ì‘ù¯óúêËÌ3鱨è:p *#G2Íõ™Li3UiF _‘åÐwl`ÇÃу#r? ¡ÏötL`I¹>…ÎYµØ«±WžyÓó[òÛGÔ.<‡­yŠÂÏÌ—ð< g} ·±µÌDF/ «’I’Ÿpsk£ì½Dâ3FÄcc·ózüa)ŽO—¼»åWÿœ`üÍÐõ¿Ì‹}S@Ôí¤KmnÅ'–=*ñÇïDHô,P&©ÈÆÜ“pË–£Uü«¦”0Dý&½CÏñÏŸ{@w×¾AóÞùåØüÏ¡Gq›,×Eõ¸L.â sPj °c¸ pšý ôÙ<9ÕÐåæäÆV-“æ]Š»`¿›ß—6šFÔ<³?¿+õ&å¿Ý±bb{+T£ÿ’Ç6]“ÚIœd¹sÆÅ>)ò׿'ç…î•ä–ƒyú*])îmî$åõkèaŽB²A%Ã1eX˜@=6Ü gwÚ:} ÖeBUæ éCÏÏdè´¹u3±ógþNü…òÞˆËæVý=«“Í„À‹Es¹¤d’çÄÈH?Ê3†íomuî8u/«çÓáó{ÎÎö[VOÞKý˯Çäõ˜ãŽÖ(‘c‰TDUTl`3Œ”‰6y½8 J®ñ:Fæ)HI Qˆ j=ñ‰‚E¬#gÉVžuüÊÐüé¨êW÷ÓjwúJº®Ÿ,„C%¢J#›„J*ƒÅª‹·Ú¥ÏhËÙŸŸIB"Ë\q*±góæ|¹ÓæûGY‹Q)JFGÔ:Uï·ê÷³ÌoËÞyÕ-5K9ºf§y5¥ôMÇœHóZ$±H»ñ`$oÀ¨sEØLúzÈHT¡(ùí:#ËoÐí{cS‹W=4ân2‘ËxØ?4_äÔ¾\ó'™?+µŸ‹Œ’Íj®> cÓ–ƒÂH¸8ö)ö¿Ôéðë±÷|¯qþ–V}›™Á›.’}û~Ÿ˜¢·òr¾Sóÿš¿.ow·”¼–‹&áÄñÛÆHd ÕÉ{Uþ¢Á¬1Ïãú¤+âgÿÁõYtÒåÓáúâW~Wùþ¼ñä0i· 勯1Û^K$nÖò¼k$.Â…ˆ*êE~ÈÈûEÛ#MªÃ1âÇrßÔ¢>câžÅìÉŸHŸ\¸óaø2_ÊʽCÉPyŠÛ^šÞê\Eo€±oB/YX¿5æ$¯LÕ{Mí$5²ÂqŽÎýç‡î§aØ]‡=(È2DöÛ»¾Ù/’¿.4¯%è7Þ_†ê{û=E®ÅÁ@¤É‰ø*( eµ'5]¯ÛÙu¹£”ÄDÕy~nó»"\RÆ —;÷S¬?*?.tÚ}_˶OùiV»ÿ¨–“þÓkòsÍ/‡§ýÍ..ÂÒC–1ñßï¶Ugac§EèiöÑZAZúPF±%zWŠ3O—4òœŒ™·g`* äˆÊ™»v*ìUØ«±Wþqy;_ó¿–ít Cv·S¬ò4|Õ"‘© Àîýé?²½«ƒC¨–L·F<"…õ©Ñ{AÙùuXD1ÖÆ÷÷Q”¼¼!°7šU•Õí„Á ÜÖÑK*ˆP"ñ‘×¥6ÍDûS=ˆrŒdI H¿•»è1Tx¡b²íæ¡æÿ#ywÏqZkÖìæÝ™í®"sЖ7ØÐTFÃÃ,ì¾ØÏ¡™–#Ϙ;‚ô;3ª d¹¡Œéÿ’þ^Ó<Ï¥ùšÖöòIôÐk Ô¿Xõ˜+…vwÜXtÛnNm³ûYŸ.žx%>±\º|>×]‹ÙÜXóC(”®=ûß5¾Hü½Öt/=ù›ÍúäÖó¶ª\X˜ؤsLdd`ê´*5®ØíÌYôXtøU÷][+Ù½““«.l„>Uæoõ1OÎOËWúݦ‰æHoô9ìciô4E–+ñb‚8Ï&@@«Xt¦çsì–ŸQ ²á0Ê$jx‰£[ïg‘òäC¬ö‹6äÊ%qÉÒýÝßh)•ÿ3|ÇkùeæO2ÝÃÚ½¬ÖövZÇ ª÷2Ja§!@v…hAa¾ÀæOhû=§—háÃD$ ¥ ú@ßÓÝÄ{¼ÈhÑvÎhè²å •s½·ïáa+æZÇFý9wæŸ0XùÝŠÝÛ[^,§O½‚GDU, úd8.¡;JßžÎÅ“/…¥ƒé&5Ç;þ;lo«§ÜÇâ¹#—˜ød<¾ï³èüʱÒ/tŸ;yŠ'C¨{kuÞi¾×¦®@¥8«}‘žl=ŸžmvM6ô™n{‡Ø=ïp{b8ôÏ}@l;ÏwÞŸh^sòǘý$Ò5Kyîå….>¤%ArˆëË㊼î)¶ku“¨ÓYÉ5Å^ŸŸ'7MÚ8s×$]^ÿ%Þjóv…äÍ0êºõÇ£`‘F£”²¹ý˜Ó©#©ð;7²ók2xx…Ÿ°{ÊuÚüZhqä4>ÓîW»°Ð¼Û¤Dº…¤Z†•yM\DwY’°+PõØŒ¯|ÚL§‚F‰­w»ŸÜÏ&,ZŒcˆ F[î=¯þFêº÷ø‹ò³UšÃPŠ­‹Ìcz«Åwù%Ø÷líô^ØbÔCÁ×ã‰þ*¿œL~O'­ö^XåâidAþmýÇõüØ«æWÍ^~Ð-¿:¤’ÇMÒJCyÕž:ÇÈÈÎÑ'ûø…WxÇÙÝFÃ:=7fbÒhržÌRɼ}@ïË™þnä×›ÍçÏ<šˆÇUqç·ãŸxèû[KÔ4ÝV ýâ­6eÞ{wW‰”l8•Ûn”íŸ>êpdÅ3 €ÆC˜<Þ÷HÎ ÄØòEå ŽÅ]аÿ̯Ëí7ó#ËRhW²}ZåO§ß*ókyÔŽJA*Ë]Ǹ7¾ÎöîNÌÔ ±C”£Þ?_qýhhc©ÇÀv=qyß-ÿ;ü™¬Ûi¾t’ßËÍ: ÖçUõíЂ£““¸eR KÐûgSÛ™;[†SÒƒLȨT÷&[ްÞún³Cfˆåß}»¾h]gó·Gó̶Ú?’<Í7”uˆ®‰‚ÿU³êWà+(ˆ·)$5eAò®]¤ö;6€K&«Ô@ÇxÂGŠ}/üÒXeíˆg"8§á›ç!±òëö³ŸÊ?ÌKï<Øj–:å´vÞeòõÏÔµAnko+U•dŽ¤Ò¥SÒ£cAÎûUØÐNÄL±f/˜å±ùÀv—¯–xÈHT h÷"-?6ü¯ù‚ÿ—–>µÎ£?;ØSÔ¶Y⤄²Ô‚ª>&û ü5®U—ÙmN=ÖJ£~“´¨ò—Ç»oÉœ{S³ø#sßÒû™îsNÉØªKæ¿*hžtÑ.4 ~ÜOc8ª° ’«ÒÏK“†\º÷Ø—¾aòôÞS¹ó3HšŸ–Ê[ÉÞ3x—ž‘gãæj8Óçœ|4ùQéÖûQabŸù—Ì7^v‹Ëz¾±£Kå_ùÆ»fÛLµÓm¡õc~RIq0†¥Íóuû$…Ÿ“DÓiÆ8Æ^&¨ÄÈ“÷ üwíN17îf¾Y»ò]üä_–¬¿!efÐ.¬Ý|×ohÓ¾œÑª9,}S¹QÀòû!øñ®ÔÃ4»>gWõèºâü~†B¸½/®mo¬¯LâÊæ+ƒm+[Üú2,ž”èh߉lO!ƒÿ9,ôýv-6é¡ÒEÊÇêÙÛž0<«*²Ôoé´œ¨FrÝ©¬Åãøšc(q ëmÏ:ý>mЉª/U··‚Öí­bH-¡UŽbPˆˆ¢Šª«@Í,¤I³Íš¦v*ìUØ«ãÿùÊ?#_y'Íš_çg•#ôÄ“E¶ˆQr«Â9Øž0b“¦àw|íýŸÔCW§ž/"=>ï׸ýˆÇšX2Ç,9ƒøù³o.kÖ>gÑ,µÝ9«k{‘Vµ(ÝÕSòÏ3×è§¥Í,Sçø?Öôš¨çÇ‘å šf’ìUóïæÕ±ò?æF‡ù\ôëò Õ#ãÉdྌÊÀíûÈ€êNz_³?=Ùùt„ú¡¼|ºÇå/½áûz•ÖCP¦[Kî?8¥þbü¡Ö4¯:hú¯’­ÛPòÅÕä:„0£NЬ‰#,@àT| ZÓáê9:j1eÒdÇ©<czËb>}ããîÇÕöLz˜OâÆd%ý^_gwÉëŸåŽ£ùcçè拾»³HÄ–Ð"ÿ¤I$ îÕØÆ}6wÎ3Oí ñèe¤1'sÐáïÜy½>nÆŒõQÔqGA×ð6déåÍ 5™<ºt§%[P1«OEOLsR¿÷lÔ~cˆaã<øonwËÞìF“ÉâpŽ>þ½Éžb9Å]Š u kGÒW–«¨[X¯^W3Çûäa™4™rÿw KÜ ûšrê1ãúä#ï 1kïÍÿË}>¾·˜ ŽÖË-Í~Fqøæã²Ý¡“–"=õ¼‡[—·ôpç|,ýÌzïþròöÞ¾×®éÓѶ¿ò9ãÍž/auÒçÃ|¿P.Ok4‘åÄ}Ãõ”Ïÿ91å•?èÚ5ü‚§y íØü.ù›øj:äˆùŸÐY{e‡¤%ö~´ÎNiá.LW±7h ãÓ9xÿäÿÕ‡ú_ÚÔ}³‡ú™ùþÅ¿ô3¶]ü·/ý&¯ýRÂàw/õaþ—þ<¿èÎêgý7ìT‹þroK$úÞ^¸AØ¥Ôn\„¿ày“¦Qþ”þ´ÇÛ8uÆ~i…¿ü䯔ŸZÒõ(‰¾š[ÈúeM³ð?Õ¦p?é‡ûÒßltçœd>_­:³üÿü·¹§­ysg_÷ý¤­Où$̾ÄëãÊ1—ºCôÓ—Ú¹’=àþ‹dzæoåþ§Akæ+ ÍÑg˜[±Þ”~¹ªÏìö»Õ†_Å÷[Ÿ‹¶t¹9dÄ×ßLžÞêÚî!5¤É<'¤‘:ºŸ¥I©ÉŽP5 Aóv0˜°l*ä;Q¹µµ½…­ï ŽâݾÔS"ȇæ¬ÉãÉ(‰ ù1œ#!RÝkË:6» \ùnîÙSJ¹Ó1B«§CÉZ0V†Ýs/IÚpg¢}`õÞýþ÷Q¢Ç—ÄG¤÷<çIü¯ó¾›qc¤]y–ÛVò5“ÿÇ2þÍei ©ˆ«Ø)¢þòŠw¶u¯h´yc,‘Ã,yä>¨Ê·ïý~ûÝÅÔÀÆ(ž(ÿ £{w~ üÁÓeó§æO—ÿ-,­ÞÏËš4 $Áchã„Vs¥8¬j‘!è‘›>ÃÔ gåÖȉdÈvë¿KøÜ“ƒÚ¸N«YKP€û<¾›4Ö,ÿ-?(Q¼ÓŸ¦¨ð=¥¬.æ[ª•n(®ÍCP9IØëÓ4:\½¡ÚçÀ32ñyGŸ:û¶ÔcÑöoïDjU@gñÞ“ùGÉš¯šuSù“ùž¡$@dÒtYÇ, _ˆ<¨û ·úÍ¿LîÔílZ\_“ÐÿŸ1ÎG¸ú=ÃgAÙÓÔOóZ¯óbyDyþ<ËÑt:ùK^½};GÖm/o`†eg`½JÚ¹Zç/ªìVqäÇ(ǼÅ|]öÑÁš\0˜‘÷§Ù®sR/3ù?˾p²6:ý’\ Ò˜|3Â|c‘~!òè{ƒ›Îí\ú9ñb•yt>ðáë{?¦<9#x÷ŠÜùSó+òNö]sÈ—²j¾Y¯©wdêdþZ-Ԋлb¡øŒîãÚ=ŸÛpµQËÒ\¿ÒËýì¶÷¼V§²µ]žLðž8u¬~‘ö=›òÓó·Êÿ˜h–$+Ì”øôÉÜTRmäØH=¨xS|óÿh½ŽÔöq2þóó‡OëŸw›²ìîØÇ¨Ûé—wêïznrÝØ«±T6£akªé÷z]òz¶W°ËmsØybÉ5(G¼nd€œLO")ó7¼‡ùƒä*'4;[_4ùSX»d²šK×ÚtÓ8ãY„BÄí)SM÷]†zçcöÞƒ]ªüÞYKlqõ?DÀò«5üßw7’Öh³àÅàÀ ÂGm·ã¿îCjòþUè0þQùŽ¥ù®º¶½kG6òJ¼}i¸e^çì-_bß Ø0ÖÎ{GWèÓbþî2êñ+ùš!¼'3¤€Óáß$¾¢:yÆÜÞ¹ùKùw ~XØ-ÍݼþtÔU[Q—Õ_Põe†b‚øÒ¬w=€áý©íüý©>(ÆC>‘[{äyYû9w“»ì½4±¢GçúƒÓówÅ]Ф>pò~…ç}_·õ­%ø¢•h&‚PYbbZüB$f×±ûc7gçqúŽ’ÅÄÖèᨄ¿±â?•ÿ˜>aÿœwó‰ü·üÀ•§òôœôý@1Zú­µÌ5©ôÉ?¿ˆ}–« šóöŒøðvÖ˜jtÿÞc¯õOŸqê>Ï>Ï‚zl†üy¾¿¿Ò|³«yuôÍBÒÎëʲۯ+i&²6Ê¡ö¨”Ž”g ¹!“Š$‰ßÆÔOüåù­åæo!Î=iÖºýݶŸ®yÞŠF­s'¦‹Å —ïXô cµÞ²òL ÚÉ Ž?w—èù÷8ò˜åC§ézßüã'Ÿ¼¡åÝ;]_0ùÏ·‰o¬XMk^-Ñ’+qs©i)Ê`UKhÃry L™aÚ¸2NPà–!é7µnk»£ 8ó}=«y›ËÚ Îe­jvÖz¼ßVÓ!¹™#{™¶ø# ENà|ÈHÎ;›&A#’",×Fâ@H¿3¿.´_Í)]ù_Xÿ{az4–—HŽdéâC üJHÌžÍí é2Œ‘øŽñ܉ÆÅ<_þqwó[Zü³óuÏüãÇæ{›sÁ‡ËWr±áć’Û+µ+ À!íÏó?¶û“U øÆHÀœh¾Ú̆Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å^]ù÷ùŦþLyã_—„úýákO/éìkëÝ•¯6ƒéÄ>9Éz°Å >uÿœdü­Ô§šãó¯ÏÅï<ׯ´—:[Ýo*EsS%ÛW£Ì ƒhúlÛyçµ]±Ç/aõyžï‡ßîs0ã­ßMgÞìUتòöÖÆ5{™â„Êë i!$Òl‘©n¬Ç`ù(@ËW…ySþr VƒÌÚŸåÿæ~–üê%›ô–f‡M½W,má{’²q®Ê³(*þ¾Òê»s`‘ž?âþpï5ú:{š†Mè¼ãówÌ›z—“uO*þo~_ìù5Ö•æo/òš++ˆjb–EV•xLmÍ£< Ú¹¶ì>’9£“Mš#õ{½ýwa2jˆ{_üã¯æOü¬Ë‹+‹Ù½O0èôÓu~F®òD£Òœ×sêÇF'ùùÙÏ{AÙߕԦ[Çõ|ÙM¸åaë9£fìU%ó™ ò–5O3ÜÚÜ^Á¥Û½ËÚÙÆež@•GnìÇec°Ì&œæÉ`ÄktHз˜ùó¿LüÜÓµ/þ^Zߦ¾ú ÍÒjCÂ×OÔ¦£‚ÚYIÔñ+„±ëMÆ~Å–ŽQžb8xÀ®²S]ÌN.O’t­CËsiñyͺ4ß”c–/ÊÐiwj^a×ff¡ÔnQUÄ(üCÂ%V+ð§lîrãÈ%ÇŽDÇ'9ñCú#¿Î½î8#«î-ù2Û^·ò¯¿04;#ù§YßE"Ù¼ÇÔô• 0¬U¢–åŹ"¹ç:aÆrbÃ#áHüüþ?ÚåÝÍŸf±“±Wb®Å]Š»J¼ÏåÍ/ÍÞ_Ô|µ­Eëiz¤mp‚œ€q³©5£)£)ì@9v›Q,9#8ó‰´añ/彯©ùWù…«þPù¡éÜ1Óg5ò N•è·q vj¤çQíVŠ:í,u¸†ñ¯wütýEì·ixY ¥Ëúß·ï{ÎyƒèNÅRígAѼÃo¦·eý¬2¬ñÃ:óA"‚¡¸ŽÌEei5¹tò2Å#EXîhÔiqædˆ÷GEpF‹1¨Hã@UTP*°t);’Ý€(r_‘JQÕtÍÜÝê×°XÚŽ³\Ê‘%|*ä åø4Ù3K‡LpÕ›<1‹œ„G™§škßó^DÒ¹G§5Ʊp*Õ£ôá¨ñ’n;{ª¶uz/aõ¹wcfÏÈ_ÚCÏj½«ÒãÚ73åËækÎ/Í?4íäÿ,‹[Y>ÅËE%Á¾“Ó‡ï\ßãöC³ôÿßå2=Ö#ö —ÚëÇmö†«ûŒ4;蟴ÔPíäïί3ü^bó+X@ÿÞ@—,½â«0±ø,̆£²ôßÝa=õúee¶=ƒÚšïrðëýÛíDXÿÎ>èêÞ¦¯¬Ý]¹5A#‚§Ü¿ªry=©ÉÊß¿êrðû ˆo“$¥î¡÷ñ2[/ɯËûJÓžéÇG¸¸˜û}”eS÷f¿'´©{€v¸}’ÐÜ ½äþ‚{mä_&ZSÐÐ,íb‘…<Á9‡>ÓÔKžI|Ë²ÇØºHrÅô ýé¤:F“l)oao¥)¦Þ˜òÔd—9ñrá¥Å¦|-UQB  £` Pòʉ¶ð)¼ Y$0ÍA4k 9¨j}ù!"91”æ-?—´  EΕg05¨’Ú¯.¿iO\º:¼±å9‰q§ Á?«O¾!(ºü¸ò-å}mÑkþùÐÿ“%s&¯©,‡ã¿ÞáeöE>x£ð÷S¾üŽòØ?WŠêÄžŸW¹f§üfv?i5QæD½ãõS¬ÍìnŠ|„£î—üU±éÿ!®leúÏ–üÉ5¤ãìz‘²7·ïau#þ3G´±˜¬¸„‡ã¡¯'±ðæ ùÒè\¶ßóVÞÏRý7j›²¼±Ý–Çëaeÿ5ÌyéûSõCÃ>W÷>Ÿ›D´±¦úeâx—ûª?$]§ü䘴YVÓÏWx$èÒÀ%¶jâ+€Á¶ðp37°¸rŽ-6o©}±ýL#íF|'‡Q„ƒñØ[ÐtÎËÝŒiª >å¿ÝŠýXŠÿÅ„˜¾çÎc[ìž»O¹‡ìú¾Çu¥ö‹I›øøOt¶ûy}¬ö9#š5–'Y"qTu!•îØç;(hów@‚,.È¥®*X5  MÀ4¨¯Ñ†Ö˜*þYÙÝyê:ë·²jÎ?DØÜ*ˆ¬ŠÔìÍÄî› “Vø³¡>ÐÎ:1¦Åùòåøëò6tñ£-IÏ’FÍ”?^ìwþr&ÿS´ò<YKKËÈá¿t¯÷B7uF§ì³(¯Êógì&sÖ.q‰1÷Øßäà{[–qÓFTX›<¿ùyå_$hÞiòn¤©æÈ^ÒkK¨î̳\ɱ¼™WŽä€ ²zçGÙšív«Y“¦º"@Ž*]oÞ{ä×i4š}42à—ïosß·ìòz瑵{ý È:v«ù‰¬F—7 %®‘2G(å Lƅ߈äkñoNÙÅvÆ–õ³Ç£ÆhmQ³¸æ|…ü§³3Ë–3ÔÏsÖ[{‡™ûYf¯èž`€Üèš…¾¡ š;[ʲp'³5SìsMªÑfÓˇ, ˜§g§ÕcÌ/„‡‘Ls½äÿ˜_’zW™õ¯-2èþdSꆎ©oq Ü º=wõuê ß;.Ãö¿.˜xy¿y—˜¤yƒÌö·³xóúñz'öÕï ‘<õï(jCÉ›ÐËÄDpë.¥¥Eè¦~5õPö•*|yuöß±X5˜ÿ3ÙÄoÎ?Íþiþ‰øS¤Òö¶]<ü-H Ž¿¯¼y¾µº¶½¶ŠòÎd¸´VHg‰ƒÇ"0¨ee¨ Žã<£&)c‘Œs˜zxÈHX6r Š»yDß—šå~Ÿç??yvnüÇ%­í圗lnÔúFFT-RÀ½Y™ªÄlOR{Xvö~ÕɦÒf"8Ä£píŽoðØV×½:S †–92ÃyQ"÷§Î:^ƒi„>süÅŠëQÑ|Ïíiæ[+‰d¸Óµ(¤‘i˜¨4jíöz0ÏVÔë¥)6ŒÆÀEâN§¸oÓãÌ<®<DeÍf3º;Æ^o¥¿!üɬkÿ–¶:‡˜åi'†il὜üWÆá#fcNG‘ôëÔ•Þ§<“ÛnÎŧíC @‘ˆþEŸø¯+îzÎÅÔO&œ÷Õ÷þ9=?8÷pìUØ«üÆü¾Ò?1¼».©Üu“M¿ Y-gÛâ*ÔâëÜxßû;Ûù{38Éâv”œ?XèEºîÒìøêqðžc‘ütyßä接är_ÈŸÍ:, íi¢]\Ñ¡_V¼m™¤”û†>!:Öû_EY„kt¦Ákïòþ'1–)sCßo¿%¿.®ü‹yùyo¤%‡—oÎÂÐð.yr[+rbêvRõ~qÛ9ÈvÆ gŒ®C¿•w{¿·›.TùÛÌ>\ò?äšlN’º§ææýÌkþ°¾ ööJü¢ŠfX—”Œ(ÁXôý›:½>£?hâ<\8p¨Žg¼y~9´"{Ë3òݾ—¯åÍ;þr3Z²Ö?3ouA¨ù_H þ¦‹,ꌱÊöαð‘âŒG©NcáçRF¿Q)NZ(˜â©Ÿçü÷ÚÍžuÜÈK›é\ä[žÿ9+ù40¼¼¾fòì$yãAC%±‹i/-P—kzË©øá÷ªþÖÝ/³}±ùlœ>‰}‡¿õþƬ°°Î?ç¿=Gæß”¯ÎŸ|¼‰¦€÷¶ÿb;À½Éû3S£ï°uêN ÅÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T.§©ØhÚuÞ¯ªÜ%¦™a —7—Rš$PÂ¥ÝØø Å_i‹¨ÿÎZþvÝù·YŽH¿,<°Ëœ‚Šöêå¡·#qêNÃÕ¸ð_†¿c9ÿh{_ò˜ª?\¹yyþ¯7#;/±Q$XãP‘  ˆ U€:žPM¹â®Å]мßó¯òïÊÿ˜~Rú§™µS¡>U¸Óµ†œE ­ÓÒ(ÚEvXÜÁhÔ;ü,¤æÛ±»C.›-ãósãvˆ#wκÝô‰èþOÿÎLÛ1©_)~d@9¼B€+I1¼Œü"B~.ž¨¯ï«Ãz þ¾/ÙÐ÷}Í'ºOlü‹Ó¿6|¶Ú‡”|ë5¶³å 6(_Ë^fŽs$·PK¼hŸh´jƒöÈ)²‚èT¯=Ûy4¹k& c9}Q®GõýþE·#bïÉï˯4ùÎþ}ó×™­­ôñ5ç=Êo^/J ‹—`%ùUv »«ZcÚý¡‹&X±“.¼Žß‡êæ°‰—³g>ØìUóïæçüäO•¼»¬j¿—÷Z>§¨éÉÚùYÓ&ú»X-üC‡ à|OÅÅ tØWqGe{?—$#˜J17qŒ·ºïü©äfiùeæ$ó;þqz÷üA¢ê6©oªé³£%ÑPÔ‘]à©çS$|‘âzñøIUØÏ´±çâÁ¯b/¿àw0à#x¾‡ü¼ÑüÏ—ìoÿ1–ÆïÏl$k»Ë[xÕ¡IºAê.ÌcSÄ”¢üþÓr½¡›ÈF ú~ß‹tA­ù³,ÀdìUFòòÏO¶–öþâ;[8G)®'‘bŠ5ñgr3’„ eVØê¥ª^é—PÞÙK_NæÚDš'¡¡âèH?~3Ç( ù­¢2*ìUØ«±WÎó––3kþ^ƒó@—Ì~X®ÚIdÓÕ½BõÖ¬ƒÁKçWì¿hˆLàŸÑ“¿¿þ=ËäÕRÂOùgçX¼óå[mM™F§ú>¥ý›„­Oqó§lãý¡ìƒ¡Ô˜ Þ>ïÙÉõ>Æí«À'üCi{ÿo6cš7jìU‚y³ó{ÉRõ ¹¾Ú’mõM oj„OpÍ_lè»3Ù}f®ˆ -‡Ã©øK®íý6Ÿc.)wGØaqù§ù©ç×k#é¢ôâJ›Ú,JÐÖâp±ƒNȼ‡c–e»?G¾¦~$»¹ô£™§D;W´5Æ´Øøcßÿ;|·[cù#©k¤¼÷¯Íyvô/.Ò¿ÈÏ=~T ò9›?hqៈ÷WØ?[™§ö2y§)‘îÿ²?©è:/åç“t-§é0™Ö”¸œ}bZŽá¥åÄÿ«LÒê;WQ›ê™®á°û£GØ:M?ÑŒ_yÜý¿¡“ôØtÍs·v*ìUØ«±Wb®Å]Š»v*ìUØ«±WbªsÛÛÝDÐ]D“Àû4r(t?0Õ(ÌÄØ4XOf*@æÁµßÉï#ë\ž;#¦\µi-ƒzK^ߺ ÇO’ŒÜi»S‹œ¸‡ô·ûy¼ö·ÙM}Äxôvû9}Œ;þU¿æW’Üù_k‹u<¾§ÌBXûÃ1hæHùfÇ'ihu¢µ8…÷óûEH<îOfuÚCzlœC»—Ø}%5Ò?u­åt¿ÌMX']Õ´fr0JxµzòGÀf£Yì>,£IÝ-ÇúaËâ>,q{O—¸5XÌOxöÐ^¿å¿9ùcͰzÚ¥ÛÊHá<ëÄôqó¥3‡íÉÔi eŸCî<žŸGÚ8uñÈ¿åÍ>Íkšñ?=¯Ÿü½æ-CR¼±9ùTÒŸHãQknj=8Ô•d=%âj>ÑåB;îÆ:FB2ü¾¢Äÿœ}ç˜?ͱ嵼‡iVÒ”£ãaú{¾»¿ç»òG"óÇ!Õ­¼¹&ä›I¥‚wšapñžB1$û¹sNAvT÷5nƒ¶;lèt‡³ ¹åµŠçQå]/r|¹i»7²†«R&1øx£ÐÙ¿+<ïìiÇæîªù—óJÃËòÜÛÚÛÇd’èñß3-¤ònîŒE22”÷ …ì¾|znÍ–Q"eSáú€è~ßĹ]¿†yõ±ÆH‡ÓÅôŸíä§äÑ«Aù¿¤AiåïðÍÀµš=zÎÙ‰²¸HÖ@ÓFWnP‘Ì ë\ŸjøR켆Y|aÄ2~¡ué>|û¶Ggøƒ´ ?Ñãé<÷\¾/`±üÎòÿšoü¥É[ëyÜ8ÙÝ"ÉZU âyR§a\áó{=©Ç¦Ž ÇÓ.ŸÅäkÍê±vÖ ç–w^ž{ù3Ñ»V;æÿ$èwÓŽŸ­Û‡eÛ]¥xþÔoúÔì{ŒÚv_kçÑdãÄ}ã¡÷þ-À×ön-T8rqê=ÏÓ5¿>α廞SXp‘*Y Ž4>jLîµz½tqá8”x2§·ëëÈw‡Iü•‹”øˆÇFây<¢dó‡ç¬‰åï!Z'—-t"´3EIèÒ˜•‹Ê~Ð@ ÔššžÒIØ#ÆÕËÆÕeÜÖæ:¾Qé{qt(iˆË¯ôb¡Ëñß÷=_òsó;VóN¡«ù'ÌÖÑ'˜|¸)/-dy!¹Ky>¬ìÍ#9/ÈË—ÇZÐgío³x´˜ñê°áæß†@!Ä9VÕÒ¶ów=“Ú2Ë)b˜õC¨ë[~;Þ»œ3¼v*ìUåß_•P~bh\ÓÔGæ½1´é¶_]Ämœø1Ýì·±lí}ö övn ‡÷3>¯èŸçÓåît}³Ù˜‡~¸ý¾_©8ÿœiüê›Îvy Î4^zÐÐÆ­qU–úÞÁ‹rßÖˆü2ƒ¹ÿ;h»a#6-ñÏ»¡? ôþÇ‹Ç>‡›Õüý k:ž‡yäÓieçèí%·Ñu‹«t’HŒ­$jì Pái]À4$f“Cž˜lã¿TAæÎC»›äßÌ/ þ]þTùnå|Í®^ù—óïU+qcwewp.-.ä ¬´W…jj¼Ÿ°ö{»Q«È<8ˆiãÌ(ÇvëD¢"<ßU~QŸ77å·—žùÿЍú÷¬IžœÛÑ3rßÕô¸zµßk¾q]­á~b~Ñ{~šò¾^MðºÝšf½“ä?Î.ë¿™Úgç·"¦—wrFµ`µ‹‰ªfŽN#h®–»Óá“~¼3Ò=–í Ϫ#o8þϹÅÍ«íß#ùËDüÁò¦•ç.ÍëiZ¬"h«Nq¸%dŠ@:ü¾Ñ|íy£]ü‚ó¡ùùe¤pÌ&@³hâX ¶Ïo8õ~±ˆj@*À Àí5ù±ãÅ d/Yó·ÞÆÞûý," ðó¬4 KòÆ‹cåým¥iÐ¥½¬ –âˆ;“RIêIêsˆÏžYfg#fGw Lr¥v*ò>~}~SygQºòn¿¯M£"5µóé©pïdeR¤´öàð‘k_€–SÛ7zÃÕeˆË æ.·øŸc dg‰y=5Èß0 þØyãò_óã‹OÕ­ úä’“Ó‰$D›<^-ù/Åá“:-YŽ¿>|<ÁÛñïù÷µGÓæ è_Ë?Ê.~U>¶<·sxözÅÂΖW3´Z"-q/C¹?UŠñíSËv—kdÕðñqÀæÝ½5lŠ õ=_JÑmþ·¬_[éö…‚ îæŽù‹ÊB¢§Ã'æj “庒ùþr‹ÍÖÞhòY׬Ÿ_ü¶šÖîò.¾¯g¨j|Y õ®#`=4åT6ÊÍJԌ콙Ó‹/àË`]YŒzÐïæÑ”î;›ÿœl{/)yÆïÉš5ÂkÓjöŸ¥õÛPúƃ¡ÏéZÂi/­.è'­Óo‹%öˆØFYÃ!SŸy<¨yWÞ¸¶4ú¯8¦÷b®Å]Ьš®"’ ãY`•Y%‰Ô2:0£+)Ø‚6 áƒa_ kLßóœóinY<…æ:Ii#r)´ŽxTšÕ­œ”mÉày~ÐÎã[„vÇgñï±}ýGùÃí÷;ÃíÊj7>‰ìAø}ÌÛοœ~Qòp’ØOúSY^–Œð–]Õ>[·ù9ÅöG²š­eJ¸!üé~ÌýÞomÚ>ÐéôÛ_»‡é=>ÿ'–Mù»ù·¼múÊòý¥íâ’3î+,Õì+á¾ÏìÞËéâäûŸÕ½ÑÃiv¦ã÷xÏÀÓ/¹–ùgògÊZIï¢:ÅúЙnÀôCå€|4ÿ_–bë=¡Ï—hžåÏçú©é;;Ù-.žŒÇ‰/érÿKËçoCDHÑcBF E@Í7¹z€À—b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅP𖕦ëÍgªÚEyjÛ˜§Eu¯JŽCcî2Ü9çŒñ@|š5ly£Ã’"CÍåšÿäuªÏúOÉZ„šN£ç /#˜Õ»zs)õçñgG¦öŒ‘Áž"q<ÿhä~Ç×û ãÓHÂC¡åð<ÇÚ†Ó6¿0|u—ù‹¦É¨iäðŽøYˆÒeýÜ»vj7‹f.¯ÙM¶&zIpK»§Ëœ~y:ÈöγC. T ÿ¨ò—Þö¿+yÛË^rµúÎ|“²€f¶o‚âß¼‰¾!¿~‡±Ï>í.ÇÔhåÖ5Üzqü«ÑvŽLo¯Ë¨÷†AšÇ5y³É[ó­¢Zy‚ÐMè’mîŒsÂ[¯]è{©¨>³ìÎ×Ôh¤eŠU|Ç0}ãð\wfáÕF² ®G¨a~o±Ô-.ΑäKKËé™ä·†èÒy¬bºnR:ð·o³E cSÐfû²ócí-‰ª”b*Èä$cËŸ—?-F¿ô:N 8”+æc|ÞwæOË¿*y òÈÜùž3?ž5>?T++††v!Š*«q+ÿxÄž‡uΟAÛºhpà5‚öæ;ûìžC»âèu“ƒI¢¼»å—-ùÙ×û¥ùg¨?–ÿ.ôVó¾§ „Ó+µ©Ô.#……»1hP´¬*B@ìÈ{C€juù?- 9ð‚wêvóû^“±²øHxò'—­ºsòzíž¡n—v]ZH+ðH²ÆÃü–BAÎk.㑌Á‰¢ï1äŒÅÄ‚;ÂÍKM°Ö,gÓuKt»°¹^A*òV~ðwnã%§ÔO ÄàLd9ŒØa’&3GÏúÇ—¼Ýù®7›ü•+ÞyNfQ}e)fUBM"¸Uꢿ»˜nÇü¯HÓkt½½‡òú‘Ô}2||ûã×îàuÝ››³gâáßQÝäAüE~_þah˜º0ÕtY8Ͼ°ZÖR+Å€ê§~.6o@òžÝìý››ÃÊ6?LºH~9ŽŽ÷C¯†¦QøŽæYšG5ت×D•9žÂì/z†uèɹæO¬{ í rÃòľ‚Ü~˜ü»žC·û2ó¿_ë}!ùCùŸ¥þky>ÛÌ6a`Ô£¥¾¯§†©¶»P ]ø7Ú»ppv·fËG˜ÀòþÞ?Ý 'Äwù‡}ùcå­SÏÞ{ò­µïç.…§G5ÊI²›&>œécuô¹• ²îBïJµv½Ÿ NXáÅ‘‚rùõ®þŸ˜J…‘Íä3è¾yò—å¶“ÿ9æ5Þ¡¯Ï5¥ÕΕ<ò=µÌw3¬fÒ¦R¨þò>X8›ØæÁ›Q-‚E‹­Å|¾GõµÑŠß`ù7Ο<»gæŸ.LÓé7¡ý&t1º´ncut;‚¬¤g¬ÒOO㘢ˆÊÅ¢|ËåÝ'ͺ¡å­r¬iZœ-osCÅ· §³)‘»0!¦ÔOA81*E¾fÿœwóŽ­ùù·¨þFùÚà-kw´[É’îZ iГ@—*ni QÙ³Ù;;]Vä_°õHQ}Ý™­nÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUçß?šååî§ç ¾_"ý[G³riu¨L£ƒÄP»Ðý…nø¤Ì_óŠß—šÑÔ:¼ä^ëÌžc’vÓfŸy=)¤&âèÔlÓ=Uz|ÓgÏ<ö·µxåà@í«ßÝðûýÎfu};œ[{±Wb¨ ròÿOѯﴫÔõ;{ye³Ó‘Ò6¹™”ˆ<„*òj “–a„e0$xA;žå/‡<•ù±aäëÏ=ùçÍÖ÷WŸZ„Íc¥é×v²,VÂj%µ+é£`§‚ª'Újz>³²¥œbÅŒ§ÉŸö÷÷Ù.,gVO7Òº_å|ÿ˜Ÿ•ú>‘ùáj¾húÍ{km{bdÝK¼Uâ%Û‹7PÔ©ärö˜Óje-/¦ÜÁøww7XÝ”þZ~VySò§F—Fò´s¹“Ö¼½»‘e¹¸p(¾£"¢ÑFʪ ™'0»G´òêçÅ’¶ä Ê0äÍ3^ÉØ«Ö?2¼££ùÃJòΡO5ëA¥œhdô”Fî¯1 n(&§Â›ævÎË<2Ì¢<Ïêbd.Ÿ ùSÍ~Tü¶òÿ?.ÿ5¢Ó ŽO!(õH’F yr_‹¯wªÒåÕdÅ›OG­p×=¹rÚ»“Ž‚7}/ÿ8íåkÊ”ú&“æHÚ-L´÷¢ÒPyÚ-ÌŒé º°SV‹œ‡´¸fÕJPå°¾úoÆ(=W4¬ÝŠ u=kIÑÍšjw°ÚI¨\Ge`“HÜ]Kö"ŒËtf<3ð‚hYòêKäkë­+ó?ó«SÐ?ç!?-Zh6RÅ¡é^k[)KNd§(š&áψØq+Ô#-&Ž3ÑúÌϪUg—*÷ûëíqùËÔœÎ;è:/˜o0|ƒ,+æ¯Ê-6ý@ŸQŒM Nd&J32S³mÏ|h3ÏØ4‡ª»¶çøû“Œ]Ž¥<³äï+y2ÎK*éºM¬­êL–±,fG‘‡ÄÄ ‡"s‘Ôêòç7’FG͸DIÞc¥Ø«±Wb¬SÏŸ™Oü¶ÒŽ«æÍE-Uƒ}ZÑh÷WL¿³ òos²Ú#3t=›U.q¿>ƒÞXÊ@s|]ù“ù…çùÉF×NÑ4(´ï*éS<–·SŽR©qÁškŠPrZF }ùPÞè´˜;&&SÎCýôŸ±ÊÐv^£]*Ç¿œyè§ÞOüŸòß–‚]ß ÕµaCëNƒÑ¿â¸FÇöš§Â™§×öþlûGÑ.ú7e{)§ÓT§ûÉ÷žCÜ?[Ñ:l:f‰ê]Š»v*ìUØ«±Wb¬ÍŸ›š”uI´kËKÉïáÍé$B"$@âŒÒßùsw¡ì,ºˆ ‚>ûûžgµ=©Á£ÊqJ22Õ[üCoÏ›ë÷ht,Ks îfyV´¬qDâY³ÌFòeáúItÇÛYä5‹—ÆþÀ?KÖô+ë­KF°¿¾¶kKÛˆ#’æÕÑ‘¢•”s^/ñ Ò¹ÌjqÆ%›ì|ž×EšYpÂs2 Xî=y¦C”ìUØ«±Wb®Å]Š»v*ìUØ«±Wbª–Vz´–wðGsi(ã$2¨taîlž<’≢òá†H˜Ì м—Ì“ÙÝ~ü½½“MÔá&Hì̬ƒ—„3ÉkàÕÄ é´¾Ð ÇÃÔÄN'­}ã«Äv²2ñ4’àþûOÌ"ü©ùåªh·£ËŸšrZÝFB~“X¸°MŠ?ïÈ¿à{æ§µ=ŒÇ–>.ŠV?›îOè—ÍÃÑûG“ ü-\LHþ*ûÇé'¹XßYjv‘_i÷ÝYΡážާ¸eÛ<ï6 â‘„ÁŒ‡0^ÃHÎ"Q6PˆÊ™°o3þXi>kó^•æmRæibÓ—‹éoG¶—.”ìüF®7ä(6·³½¢Ë¤ÓO"Ÿñï÷í˹Ók{£<2Ìšðô?޽ïóF‘æ8þgyŠC :•×—d­|½tïÖ¬#?f¬¿²C‘Q^]úó³µX4}„Y€Ì äxf{þï*ø¼–·]N·!¡#”Xù}ÿEù-¨¬Ÿ˜:õ——,®tß)½¢Íq¥Ý3?Õ/TÆ…AbH<Œk¹Q¿MµžÖà#CŠY¥åâ¡(ÿwý?{ìîkÕäŽ(˜ã«1=%·íø=ÃIÖôv)§Ñï"¼ŠÞi-¦h[Ib4e?ÃÄn6Ï>Ôèòà d‰‰ }ÅìpjqåÂB@ø£eŠ9ãxfE’¤‘¸ ¬¬(UØ‚:Œ¢2166!ºQQäù÷Î>I×ÿ)u¥üÂü¸‘ÓK¹j¤1“VG_Û€÷®éÖ½ô®Ëíl¯‡òzÐ8Ó.óÞ;§÷ý‡‚í^ÈÉ¡Ÿ§úzŽïøïÜ÷ïËoÌó'DŽœDŒSRÓ]’ÚB>ŽHÔ<›û@òÿh}žÍÙ™¸'¼OÓ.’¯¼~‡oÙý¡ L8£Ï¨îfy sÝŠ»|ãæk{ïÊ¿ÎkïÌÍgHŸVò†§©[Æ&}>IR8ªj@R p^D@IÛ=[³²Cµ»":Y<Ð?I5ÆŸ;ëêí»Êê#-&¬ç”L¡.½Ü¿âÄïôÝ_þr ó óVò…¬º'•ͼ¦©0áëEú„ʱµ$ÑxÇÈì©È޹»Á¨Åìî‚8õ2rÙ” 7¢vÚþ˜ó¹WYU¸SÇ>ÐÎeŒp¨ŸÇ3åî}%äO(yWÉz9Ñü®‘”‰ý;ëË$ó\G³Ýh~‹ÐžOÛ}«ª×eñ3ÞÿHäOóGwŸW«Ñiq`‡?}ù²ŒÓ9ŽÅVÉsFñL‹$R²Fà2²°¡ ÄÔ”&bAˆc(‚(ò|Íëê?󌟛ëšzI/åǘ›Ó»¶NL©:¼B§ymÉç?iîÔ÷^É×÷t2¡Ÿ?º]{ÁóîÓÐ.]¾™rý_²~cþ]y®ûÌð~q~L¾Ÿª]ëZrÙëš5ñF±Ö¬fDly²#‡Œ"°ieRZâvhbŽ#¦Õ\Deqçý¾E”MØb–¿ó‰òO¨·˜¿5…ºBfk‹_(iŽÂÊ&cQ꺱øGûí ®Üœî¹Ú>ÔÔx4÷Ëë—?Ç™ù1Ž÷Ôö––¶ÑYXÁµœ ±Áo ,qFŠ(@М\ædl›%½["¯ÿœ¡ü©o=y?üM¢ÂO›<²¯si.,—ãšMË-=HýÁvΗٞÕü¾n DþÃÐþƒû²ÂÃÒÿç8ÇæçåÔ-ªMÏΧa®‚~9è]ü¦U<¿ËWíLõ'‡·b‡b®Å]Š»v*ìUØ«±Wb®Å]Š»~mÎP~`jŸŸšsyGÊ­ëyoÊ+qmmñ…Š{¤!n® èAp°ÄzPrۑʲæŽ1eÆÖkqé¡Çкd•ÿó•W^U[?%þki&ÎÞÆ8­mµk(=3 1(=kTJ€>ܺ!ëœWj{,2Þ]<¬øIûëù¹Ú]t2ÄJ$J=áõ†…æ Ìúl:Ç—µ5-2îî­dYž¥I^Œ+ºÇ|áóàž)pÌŸ78HIŽT—b®Å^kù­ù!äßÍ‹>Z¤FÃÌQ/-vÕGÖ#¦ê² „©_ÙnŸ²W®mû/¶³hϧxõ‰åû ãUü›òßæ?•|½u£~bëQks[\˜´{”å$¿REZYžŒÅEaU§ÚjŠGµõ|ٰdžǫßä»ÑsTÍØ«±WÊ~aÖ5É?Ï2yïÌ^X»ó—üÑ I¥jö1‰fµ))…y|*~K)*†ÕÚéðÃ]¡†(LBXÎàõóh'†VõÉSóÍjþpüÀ´ýc¨\†òž=¼QÜØØƒ'&w¤„Èãê6úNØÅ§Âc â zå{÷måÞÙNåꙥfìU(ԼͤiöWËqãÛHö«ik,Oq5ê)ag—ÎÝ2AËñé§)U{Ùå_Î÷y —ÈŸœ_œ^^üÄòÙÓ5ý'Pò'æ–.SÐ’þ9 ´‘µ•Q]Âò^q*óUøúçuÙ‘“M“ŠŽ\S2¯¾¿o"vqç0Gqz†¹äÿ/ÿÎQþRhÞgƒÒ°óŠ[Ÿ«__Bò*¥Å¬ÜjƽÔàu ¦Á«ÉÙ:¹c;Âùyt#Ïû DŲïùÇÿñ…¿‘Fç/.Cåëý"æk¾­ 6±^Ç ân…U%Ôq“í®Ç0{{Á9ø±LÌH^ökÊÏàreŽëwªf•›±Wb®Å_:þrÎQi>Qš_*þ_¢kÞpfôáA–ÎÒBxñ f”¸.Àõ5sªìf¥˜x™½ûOêÚÖfIሲ^¤~Zy‹Îz³yÇó^þ{íFä‡úŒ’!^ª’²ÐF‚»E)íÓ6ú®ÛÇ‚”_Õßï/kØÞÇ™VMOúOø£úÍë––v–ÑÙØÀ–Ö°Ž1C„EV€g-“$¦L¤l—бbŽ8ˆÄ@­lv*ìUØ«±Wb®ùuÅ^Kå¯Î«;›½V7ˆ4„³*¶«šfv Ë"’¡‹BÒŠ3§Ö{;(Æ ÎùòçŠìÿká)äŠÇÃʬ÷ß➯ ÑÜCð·(¥UxØt* ýÙÍJ$=ÎŽE .¤Oto§°¶’ô€¦åà¥!zdrÛ¶ùduxDw^Í2Òb”¸Ì"eßBþoü•ÿq^yó€ßæP§oŠÒäGM÷­ç]íï4Øò{¿Ù |ÿÙÝksbò?ìe_¥2Ô<Çæ$~iÅk¬j3Üù[VoÜ,îZ(c¸4k°1H({ðùæ>-&-Vˆ˜D îë_¬}®^}~}iä™8²r¾@ø“ö{Û–êûÍ£O†æa¤hj²K r8Œ›t y(4Þg |F1„pvwЧþ:²É=Wlp  \Åíéÿ@þgÜk×?š6• ^Igy%µ´p°‘„bFšcê2ßcÓ.ìhbŽŠsÉ~á³íLòí,xñHĘƷÚî[¥¾lÑ<íù]%—™-üË>¥Äâ+TÊ¡¥*d $o$Õ‚¶õ®_¡ÔéµâXŽ1råähS‹Úz=ge˜æŒÁ4nùó¢ 6ïIóæD^\ò~æ X[ýf(d°·ž êÄ%fzP ‡RFh;?²mD±“´ ³î4õ]­íÓi!š"å|Åïî`“yëó/EÓíüÕy©éZ¦•3FgÓ-Þ’“p®bPÊM@¯7¡¥suÌÑå™ÅÎ2ÄoŸê;>ÚíÆyOàjâ*Å÷×ë/jÑu[}sI²Ö-÷°¤è­ö—˜©SîÇ9F‹$ yÄÓßhõ1ÏŠ9#ÊBÝ­jqhºEö¯:—ŠÆ n«zh[ˆùÒ˜éðœ¹#üF—W©1K!åOÉàú6³ùÁçÁ}­hZŠÃom'µGŠäG1jÊk@FîwñÎÏQ§Ði8a’6Hç¹øŸØùÆ“WÚºþ,¸§B'–Ãà?kÓ¿-µß9k6 æý1­f¶NÖA ¸*HpbÚ…HûJ8Ÿ£9î×ÓiñHx2°zs¯à½³úÝ^hÌC„Ç”¹_~Þ]ãbÎ3Nô.Å]Š»v*ìU&ó'•4?5Ù-jÕfQ_JaðÍ ?µÇË¡îeé5Ùtò⯸ûÜÐìÌ:¸på÷£Ü^?&™çÿÉkÇÕ<¿;j¾SfåsÑ…ÿ‹££SýÚ›t¯òçGhû^GN‡¯Àõþ©ý¯¨ìýgdHÏãÅ×öŽŸÖçµùó+ËÞ}´å§Éõ}V5åu¦LÃÖÄ©Ø:Wö—é¦yÇm{?ŸA/Xâå!Ëö/•½/fvÆ\}&¥Ö=hófY¢v¬'Ο•¾Xó¼ñß߉¬õx”"jN#” ­ÃV¾÷ÍÿdûG¨ÐÄÂ(á–ãáø§QÚ=‰‡Tx¥q—ó‡6ù•­êV—Ð~Xù"ÍÿÄzÄ6é«j¾ˆ†[˜–1ŸUB†øõd袪;Ó£öGŽp:ÝT‡‡Œž]ˆ›¾^ÿ¦<Éߺô±©œd4¸#ë˜Rª$WÞzrEy_òÎ~F¼Ó%òß™!ú´ó#y‚ -T#"­HJÕœuE©ò©¥=£í>“] ŒØMû³Åø¼óîîmÑv£I(œYëø¾îïRÐüÑåÿ2Ç,š¡ è¸N‘µ$º|hÔaíQœ†³³³éˆ`c|¼þ<žM­ÅœŽBTšº$ˆÑÈ¡ãpU•…Ab=³  ‡(‹|ùç_'k_”ž`ó#òø˜ô´~ÓÇ#(ì £¨ëô§ìS±•Ù=©‡µð³yW¦]O˜þ˜û~wÀö·eOC“ó>ž£»þ:~Çп—¿˜7æ.µ¥Nu¤wö.ÀËk5*U©ÕOTj|CÞ ygovnÍÎqdÜ ºH~9ŽŽçA®†¦QøŽæYšG5تWæ/.éjÑî´rÜ\é×kÆHÎĺº7Ue;©™ ×åÒfŽ\G†QüQò-:ŒË á¾eÕ¼ý¥~aYþV~VÉaåÝ/M°K»+kˆã Dæà¼‘ÈÌÄò]¨I ÌÕÜz/git9t×ëÄóNsá‘ú7¡°#Èü@¿ÔeÏ ã €ˆ±æÅ´8®—ù› Üè6—:_šµíJm?óË.ÒËlnu uµ*d’P|iöOŹ×vIËÙ¹cšQž,PÓåØJ¸O ×º1å½ß>Xx5|˜ÊU’=.ùýçËÜú¿¯Î1±Ø« üÃüØòGå…Ö¼Ó¨¬wn…ít¸)-íÍ6ýÜUÛ›•_|ØöefÕʱºžƒâÆS›ä¯9~y~iþsK6“åHÛËLbc™â¬ÓFv>½ÈGX¡oFå×;þÍös–¥?ÞOÏ÷Ò\­fê5†±ÇnóËçúIùaæ‹ÿùÇ/Í=\šwºò®§²Öʧ%¬Œ¢R§ã…¸Ê›ïök¹Î’2´ößbÏC(‚x„‡?>¡ú‡oqݼWV²,ÖÓ¢Ë Ñ°d’7••†ÄjMÑ*b®Å]Š»v*ìUØ«±Wb®Å]мCþr›ókþUWåÛi·/5ùƒž™¢i$|×ý"åG_ÝFvnÎÉãŠ@|aùcåŸÐZ ÝÜ'GRã4µê‘S÷I÷GÜûf‡[ŸŽt9Í}£íÌgáL6þ¥’ë:“¯Ú›MVÙ.#߃GŒžèãu?,ÆÇ–P6 ©ÒkréåÅŽT~ÿ{±Ò?0ÿ*u&×ÿ-5iÌ‹˜Èƒöe€þîaïNC·Žefð5qàÍïýG£Ývgµ8òTrú%ßü'õ|vó} ù_ÿ9iå2´Z/Ÿã_,ù‚¢3tÄ:gèjïñB}¤øGóöÎG´ý•ˋՇ×ïâý¿“ØcÔ‚7åÞú.)bž4šY!‘CÇ"ÊÊ ‚6 Œå ÑrAµØØ«±Wb®Å]Š»v*ìUØ«â=~RyßòëÎz§æ]¿—#Õÿ/4­h꟠_QšïÔˆ ®È´Ef5.¡xÁfô]jáÔáŽ>’æþ9ô£³(o£Ü¼§ù“ä/ùÈ;OD“Éój^]ÓlṓPÔía’4»–¡íU™d BŒSFû4RÜæ«³³öpŒüAHÕDž]þï{h—D§þqkEÕt¸¼ïwu¤yQÕÌÞTÓõhî¥I˜«’Ôà!J’jTïPrÿi³Bg2È#ë#—Jý'âŒCŸsè<å›]Š»BêZ–Ÿ£Ø\jš­Ìvzu¢4×7S¸Ž(£QRÌÍ@O9NB1OE|kù£ùýæ¯ÍJ_!þS$Ö~]jÇ}«|PÏuFf~°À|>Ûý<3¼ìþÅᇩ Ë ç_¬ýƒílÒi2êòxx…Ÿ°{×ùòÏEò\KqA{®2Ò[ùìTn°©¯ïÔ÷ðÍoiöÆMQ¯¦ß­õ.Åöwˆ_Õ“ùß«»ïfù§zb®Å]Š»v*Ó*XÄxŠTÓ°®‚^=}ùÇ©ëÒÈZ<ÒkNìºE%"@99@ÜTÔÓâjùÔãö~G¢c‡Ë½á³{Y“P|=&2gÅÝßW÷•žMóv§çŸÓ_—¾v_GR– ‘&HÄ2‚‡ŒˆÈ>HhË·c\=¡ †—ƒQƒx‚<ÿDz{S&»ÄÑê¶‘z£æ+¼s Dù[Còw潎…©Ä/<½?¥é}{‹rVz]¦µ)›OÎåÔèe’&¦?›äS¤þMãí8â˜âÆj¸¼ÅoÓê}jm^…‘ŒCmHPñã)Ùh)ðç>+¹]÷êúž3 ¨Õ ¶éä­lxž‰¤jº_熡s…ÁÒîd¹3^,2ë6ÿX¤QÄUÈž¹×jsÃ'fÄ![^ûåî|ÿG¥Ë‹¶g!ÀL¬Ñ¯Tx¹òæË?8¼·»äû‹ÂU/tp×HÆ•E½Ž¿å(¨Ø Öö°âÔôžÇôÇGuí_gÇ>Ëø±ú‡é¼;ù ¥LÖZ¿™ï Is8%’̱þòF©ëÉßsâ¹í>qÅ Qå©Õû¦&3Ës3WîÜüÉûÿæL:ž¡ù¹§Úhó‹]UbµW öVUç*–Øí]ºÎìyB ‹›\g´É“µ!g†uç¹Dê~PüÙóæ¡i§ù±c³Òm“Îoéï³:¤LÌîWe®ÃÛ|¯¿C¤‰–2>ÿÓÈ6ê;+µ5óŒ5Dóô×¾Üþ6e?›^D»Öüµ¦¦K>† Cf»´–슄-z²ðZû÷Íoavœqf—ˆhO¯Ÿà»Ÿj;YôðEœ\£ßnÁæ±Aå VæËM_$j–ú³º¦¢–“Íû¾Ìñ¤Áûšñn ý󠔵ĥãÀÇøl¶«ô¼œa¤Ë(ÃòÙïÕÂNÞ`ûkÞú/CÒ-t&ÏG².Ö¶qˆ¢iHiب¿!œ&§<³d3—9Ô´zXéñGn¢+~j:þ¥ XY<ÃsWßè¦;‡ %õ¾€u"‡¹Û%¥Ã–r¼`“öéMzíF p¬Ò2ôïÖöx˜´1~Nj æ,^™¼½w(ŠKy~ «,S/FÆE¡Ýúý&«iCÃ˘ÿHýOŸkô:ŽÆÉã`•㑪?t»üˆßôõ›;ZÃä3çc¦h.#·s_ß?À‘’)Pd!ká¾s0ìéW}jü»þOk“¶"4_šªôÝyô5#yÒ3yZO2jö‰¦ÁJEvhÞ8“ÊU¢•=O´»8`Ì1@ñ_oF¾Æíyj´Ç6Hð~êÏâù2=/WÒõ«Qy¤ÞE{jvõ pàVMÁö;ælÅ.ƒæítÚ¬yãÅŽBCÉ”¹Å]Š»v*æUe*À"„Á±Â ·ùÓò–h.ÿÅ—Ò6Ÿ¬@Þ±²…ý%fò·aN þGÙ>ÝM í¸Ê>¤q@ígŸ¿›ÃöDzÄKÆÒzf7á¥î÷r÷2/ËOÎxµ¹“Ë>rQ§yÑI}(®]vâÊiéËþOBzPü9ÍûCì‘Àm?«:æcúãö޽ì;Ú”øYý9Ý×ú—ö=ƒ8g¨Xa…¦[†L謉)QÍUÈ,¡º€JŠa’5W²8EßW‡ùë[óµ×æŠybÏÌ+åm1m’ãK¸˜‚îOL1XQ‰“’Qª>•4>ØÚ={8ç–/\U 9Ä_Ní¨í¾ýÏÚzLµ¾rxQ«‰èoƒòö©¨ß~hhÚ6›maæ;)¥·óEÎ’éú>úÑ]KÍÆ/€¹W«ñèvv›;;,²NRÇ !?®Þ†ûó¯óo¦î·IžsÖ㈌âHÈaôÊ=û~.žÁuùÇùylÑ/éˆåi.Í‹>›)£Jõ¥"ïÁP{V‡8|~Êk¥»"£Å¿_!ý//›ÕOÚ$k×{ðþßw›9t†æŽEYmåR®Œ#£ A¨ ƒœø&&ÆÄ;’…Á|ïæ#\ü‡ó|^uòŠ´ÞS½Jòı(ªÇ“[Êhh§¬2ucþW¦hµ{{JtÚ²ÇxËýðÿ|:ýÞ}ÚZönoøåÌwyÐÓÞUóFç-×ÌÞµÒÖ†‚Hœ}¨äPMNÄ}ÛgŽöŸfåÑf–¢¥‘óEè´Ú˜f€œNÅ9Ì!Ø«üÎü½¶óîƒ,6Âo3[)mUu!íä ¯¨Ÿ«Ò„ŠÓíQ³}½.ÏÎ ®X¥õü{¹Xûy:îÑÐ D(m!ôžçE¢~QjysÉV¯æßÎ ¢Öך¬¼‘YÍ «Åmìî?h÷ý£J¦z\°fíŒc6ªCO£Žñ…€d##Ðw}ƒøžhN9pb&c±=ÞïÇêf_•ÞpóÇ”<È<¥ù«¥&§æ™ÅÆ“<‹ÌQ¹^.=H]¸©øC"ŠE±!Ch}¥ì³Où€ŽSÄžíˆó¢wŸ™fêóaÉáê®gn¿wà>ƒÏ0zwb®Å^ ÿ9 ä{Ô[/Í?+3[y‡Ëï—’Á´†_œWƒv…º“ûËž¡ÿîÝGC›xd¾ïëó¾ÿ{Ë{EÙöUóG坿·¨[i1@>­­‰¤–÷ñ¨2F ’O=ž5b¬;æf¿±òâÔœ0]cæ?Þj3[Ã?0¿ç,µÏ1]Iå¯É­>D.xvæ Ó°­ AÕ#_ø²nß²§|é»3Ù(Ƨ¨7ýúOêù²Ã&ypb‰‘y~“ùs5íëëÞy¾“XÖnXË:Ë+ÊÉ­e•Ï)áóξ"0ˆŒGÏoÙ~ÇÆ5=Aâ?;'¯ÝïzQEi (±Ã ‘  ª£`‹ÚãÇDF"€è/9yy<Ë¡Obúâ~úÍÎÜfA°¯ƒ ©ùä¢hºÎÛìÑ«ÓÊÄ7¿öò}ÿ8Où®þjò]Çåη9>bòˆ f’m$šI!#;ŸAÿt|Æ3!ñiăEõ6,Š»v*ìUØ«±Wb®Å]Š»~i~pùÇþW¿ç¥Ô–ÒzÞIòÅl´þ&±K¼Ÿ¼”v?Xš¤¾˜_åÌ]^oeÔöçh~WNHú¥°ý½’ç<ùc±C±V5æ_#h>gV{¸} ú|7°QeÛ§.Ì?Öú)™8uSÇË“¶ìîÙÏ¥5qþiåûo,yßósò"P4ÛÓ~LVå&Ÿ?9mBÖ¬BÔ½»wä‡zò鎯³ôºñê3ïÿkßvgoáÔmÁ/æŸÑß÷¾«ü®ÿœ‡òæjÃc Çè38´[çUw~âÞ]–QàÅFpݧìþ}-šâ‡ó‡é>ï7¢† ŽÅëY£rŠ»v*ìUØ«±Wb®Å\@"‡pzŒU a¦éÚTUÒí!²¶äÏèÛDÇÍ·f†žç'“$¦nD“æ´‰È+±Wb©G™üÑ¡y7Dºó™/RÃI³^RÏ!êOÙDQ»;•Wrrý6šyæ!d­¾!ó¯Ÿ|ëÿ9#¯¶›¦‰4oË› AXXÔµã-Ç“0û1ƒÅ>öo@Óé°vN>)z²Ëñ·póëö9Ý•Ù9{BuLÕ/Ç3äô?-ycGòžššf¥¡–V¡–g¥ ÈÛTþ¶sÍnMDø¦P÷>µÙý‹Iƒ¡öŸ2œf#žìUØ«±T‹ÍpÐ|ŸkÖ·pcõÉX!KË!Zr⣰®ä홺-]Lˆ€åÍÖö—jàÑÄK)«ä:”ÂßWÒ®îÒÚön¤nÒ‘ZCnôã'kÄò9Dôóˆ³×ǹÊǪÅ9Æ@’8ª÷®ÿsÊüóæíOUól¾JÓu¤òÞ—c­ªjìá’‹'nJvä *°$×zgIÙºcÀ3Ê$¤}1xÞÙíL™uGM ƒ b.sûvåÞ6ZMùmæo2[ùÁ´;BëÍ>Vwá-óÅ5! *&¬ÕhÀm™KPö©¦eö¾ Óø’ˆÅ“»mü¶æà{?Ú:ˆêü(ÎYñ:ŽÞ{ò÷[\ÈŸë°MÖ^ªNÀ%þÛW YÇÜ1¿Íöoô¡þ÷þ:´4±ÝŸïÿãÉßš|©æ+?Í]/Í^[°{¨'ô¥¾hÊÆŠS÷«3£”DR½MsE®Å- ±e•u÷µØv—fg‡iÃ>F_îeó‹+óß宕ç©-n®n$³¾µSÏ«sˆž\[À’FýÎk{3¶'¤?{¹í¯g±kÌe"c(íc¹3òg“tÿ$érištóOÒ›‰^vRL…U P (£1ûC´'ªŸ€+g/²;'‡„ 6o~öE˜ÕØ«Ì|ñù{æÿ6j×Wó´òÝÈ„6žÍ3(1ªÔúbˆj×\è{7µpiñ‹Çs¾ß{ÈöÏajµyMeáÅ*ôïÓË—=ÙÏ–´ O,hvz‘- ¢q20¤v%ÈÌÄœÓë5RÏä—2ô=Ÿ¡Ž— qG”Gϼ±íCòî-CÏ6¾v}A’KS !*DHWwå]ɯÙÌì]¬a¦88yÞöë3öɭލÏé¯MwyÛ6ÍCÐ;v*ìU‡yóòïJóÕ´FyÓT¶m¯QCQNå –»õ‡­v½™ÚÓÒBây‡EÛ}ƒ‹_g†qå/ÐGPóÁù%æûé-ì5¿2,Ú ³VÄ·2/OÝÃ(„¶lÞÿ¢=<”1Ôϸ|Èܼ¸ö?UˆeÍxãËy;š/óÆѼ£ èZlf=9}6§Aõx¸Ä¬ÝÉ«6ýH®Uìܼ\ù2K꯼îßí”<.,P~á·éJü×ç¯.Ú~YéÞUò½Ð–ææ`ºEVV†0ÏΠNûÞ§2t=™–ZÉeÊ(Hóîù´ûkOΆ ³ òå~dþ–W§ËåOåTwR(ÅÊz¢6-}vµE#¿¦ rsY–'´5Ô>‘þä~¿ÒîpHvOf ¬ïþ|¿PçîI¼³ùâm´ëeó…•ÃÏ+•]BÚHž1AÈ‚ã“^\ö—¬öoŠgÁ®âwü{ÜÎöˇ1gø€Ú¾{ù×Éì–7¶š•¤7ö,öw$†d5VVÜœ¦Lr„Œd(‡»Ãš9`'q<оAµØ«±Wb®ÅXæ厛ç8Zöן˜£_Ý]D›ˆÙ& 7ƒS÷fë²»fzcÂ}Pîî÷~§›íßgqëG}9#ßå/×Ì}‰'å׿¾©åÝE|‹ù“Î ˆYa´ÔîéÙVw?iÜ%ûÍ7ûAì¼3Àêt{Þæ#¯õ|ûãòÝç;/¶²iò~_W`„éòî—ö½ì@ Ô‡<؇³I¼Ñå}'ͺTúV­:ÈŽÜ¢’[vqOR#*°V÷ÙÝ£—I”dÆNÇqdäj¬8šÝ=F3 ŽÖ<żÇQ] þqûÉÀéþ‘ó6¨Æ$¼•8ú²(äYÀ'ŒQ×hÁÜž»–ηÍí¯Öx1Cz—|ö<îa‹±ôþ‘Å’}{ÿ`îþÖ+åßÊ=Ë¥ùòóêRë7WÂòóK¿‰U)Iv–EQÄ5Mx*ÕMÚwµ! écÄ!ðÆQ=GAåæNþçY¤ì Q”5áâ2³çÏ˧½ô–y[è]KM±Ö,.4½J¹°»FŠx_£+|·¸#pwvŸQ<3©DØ-y°Ç$ $,oŸô=SWÿœyóëi÷Í%×5§¯3V¢A2Óa,5¤Š>Òöû4ô}~—´Z.8ÔuÿýYtî?óÉF}•¨á;âŸãæ:÷üŸXÚÝ[^ÛCyg*Ïip‹,FÁ’HÜrVR6 ƒQž%—±ÈÆBˆ4GqzØÈH9\ƒ'b©d]Ðíu›¯1A§ÀšåêGÕøAëH‘*¥ºJN´è32züÒÃ&gÉ$G ¿ÇâÚc‚f`#Õ0hbiRfLцXä* *½9z€h+òÌQ2^Ŷ…ÚüŠ]Š´î‘£I#E™˜Ð7$“Ûš%៙ó‘XÒb¸Ð<­o™uIÕíå$ÓטâUˆÞjÖœScüÙèÞÎ{ªÍ(åÎN‚þÃù¾ó¿“Ïv‡nãÃã'o/ÛðxG–ÿ+u=H-ƼͦéÌޢء&c_f$&Û|UožÞd½£²½‘Ë–¥ŸÑïâýŸ“ÖtKÐíE¦—l–ðíˈ«9ÝŽì~yY6úC‹MqŽ}èü[±Wb¬ÏÌwŸ’ß›ºæN˜Œt©æ+«[GÒXeø.â§JºQ+ûb½²ìeòßk»3ÁÍâÄzrºëóçó~Ÿi÷öZ­…®©§L·:}ô1\Ú\Fj’Ã2 #u> ¤–2ü²òðÐü¹ÄËKíKÌÕ*„~é>…5ù“š nn9×@ù§´zÿP@úa°ý'ñÜÍ3 çÝŠ»v*â;ƒÔb–æoÊÝ#W-y£‘¥êhzc÷ÃqTdû§Üs;ºQÚ[‡¤ìïiráôäõÇíùõøüÓß$ÿÎCþfþS\C¡þ`[Kæ-©Ãq+òºD´€Ø—~Õ\×뽞ÓêÁ–#Á/³â?SÞviãÏÅ+Í<ÇêûGsë þhy'ó*Ãë¾TÔÒæTPnl$ýÕݽ{I |@Wö…Tö9Âkû36–U’5çÐü]¾<ñ–Üwãô3 Ànv*ìUØ«±Wb®Å]Š»v*ìU&óWš´/%h7ždóÚÙéVIÎYí3~Ìq¯Vv;*ާ/ÒégžbJ’7Ã^có/›ÿç%<Øn.Ìš_åþ—)ú­¢š¬`þ\:ý¦è€í·Úô(Cdá¡êË/ÇÂ#íû¶}ØÓí ŸÍÇrýÏîûú¾“¤éÚ„:f•n¶ÖP©¼±êIîNç9ùç–FS6Këš].<Æ8b¹KìUØ«±T©«éš-©½Õ®â³´/«3„Eê}†]‡òˆÈù8úV<âÉ!æóÏÌ› ÿÌMƒÉÂÏU°–ä´×bAÊÝ‘ R­Ê€P²¸#—M³yÙc£Ë#›Š]ÿŽ1íöŽ 7 âe¹¾_޽y0ïÈÈ4{1jš¤/šíƒ­¯¨ì F¿»š0›kï]ºR‡6¾ÒË!ÅxÏ?Ð}΋ØÈbŽyÇ #,y_w) ïütL¿2/5 _]O9ùZÞb ™ õˆy-ϤH£/%!8º«r­~Œ~ÈíhcÅàå&r>ýÿ±Ëöƒ°rfÍùœdêõŽÞV6£Fí¢ùÏþcÕtÉ5Eò‡–´£É,ôç6Í5YK§Ÿ—ÅÆœš€•9^£U¥Ã pŸsë-ëæ´šv§, ãù|Xÿ†›ïäo~òõ;ÝDÔo Ôµ .¯­T¥¼ÓF²Åy|!ª®àç9U’1Œˆ=Žm“œ¥D‹¤Ç1ܧb®Å]Š»v*ìUØ«±Wb®Å]Š»v*¡{ce©[=ž¡oÕ¤›IȲ#SqU`FOY@ñD|š³a†X˜Ì ÐîÂ5/Ê'Þߨ_[[›bèÍknAp©'¨VE ±'¥ytÛ7{QÊ$ñqu<ǹçõÊé'8J#‡„òŽ÷¿ö¼«ókÌWjóDºf]i>^I Ë4fB>±#Ð)¢WÚ½ó¤ì- Óá‘©düD~—ö£_-^¤ÂŠnÿßÑý¬Ïÿ™IÖ¼„t z——·±04Rô™X’JñT ­|+˜—ÙœZ®9òfþ¯Ç=ݧn{A£Í¢ðñîMTj¸kìÛ–ßs ò®¦ß—¿”Öºž¶¬Im-áfk™áˆwÜmà+á˜Zì?œ××SîæC³ìÍOòweÆyyî@þ±ôÓä¥äßέS³Š4Ï›«=*¢Ëè8 £³+I¦î|vÉv‡³¹1Èœ@Ê? ý¿&“í~°9×Z÷ù|Þ¨¬®¡Ð†F«PAèAÎlŠ{ m¼ v*ìUØ«ó×´¯;éþ•Àj)ú•úŠ2wâãöž£îÍŸfv¤ô²±¼O1øêé{k±1k¡RÚcé—wë #òçóVò&¬?/¿0 GjŒ#°¿–4@\ý¨[ö[ö:¾ÎG´>ÏcÖãüÖ—êþ(ÿ;þ=Þ:ûùñÝ—Ú™tY+ªÚ¹îíÿšzŸw¡TnCž^CÛ±Ï;ù+IóÞŠÚ>«Ê2­êÚ]GOR € 0®ÄhÊzz´ì~×Ë¡Íâc÷ÐÇW_Ú]W‚Ü^Oùˆšíÿš|±ùA¦êÓÙérÙÄ×7óÈL×Tõ20*^‹ ⵜӗa8ôÙ»BxĤ$j m\»¾­Ï@ó=¬2Ï>-fDLw'™çÏ¿—.ô<Ÿä§ž¼½¤Ùkj^Zó ‚Þ{¶hÙ¤XŒž˜$ «+-+B¹lócí­\’Æ!“±!×bjþŽ›Å>ËÔã„fe ›ñ«ûCèLó7¹c¾vò~›ç}ãDÔVoÞZ\Ò­o:ƒÂEûèø$fÓ²;W&‡8ˈïߎ®iv|5XŽ9|qïyÏä_žµ/(ëÓþPùͽ)"•“FšC²JÇ— õIkÎâiû@Û^ÄÇ«À;GM½Xòþw¾<¥óè^3²5SÓå:l»vý^ãÌ>”Ï%z§b®Å]Š»y÷æç“¿/cx/®>½®R±é6Œ­5i·ªzF?ÖßÀéû Ù-_h`8qÿ>\¾Îø|HušîÖŧ؛—pülùã\óGæwç4…n$ý åj­¬e’Pk£Î~tJôãžÓØ~Éèû4Ç“ùòçðé†þeÔaÒk{Oîñ}Ÿ®_w¹‘yoÉ:–P=¤^µõ(÷³Q¥5ê²—Ó\è̉{NÌì->Œ\EËùÇŸìø2<‹¹v*ìUØ«±T‹Íú ù@ºÓ€X§«jÇ´Ñî¿~ê}ŽJ&‹«ížÏüÞžXúó¼rý_пó„™§ÌÞAºü¾Õ$ÿs^Pz[,„ú’i·.Í͹ô¤åþUà3!ñ9 /©±bìUØ«±Wb®Å]Š»v*üçÿœ‘ó[~nþ~/•­dõ¼¯äÐö$)ª4Ѱ{÷ö-([öæ>«/ êë»_[ùm<¦9‡¼þ®i€ €è3œ|ءث±Wb©FæM7]¹¿µ±õ=]6f‚ãœeT°bµVÜxŸl»&@z¹Ú¾ÏÉ‚0”ª¦,n›å. …Ý­ý»ÚÞ—Ò Ì ÔÐä ‹äÃ!‰áÜô|ïaqyù£çhô>NÚy±Kµ†Îܘή+çÈr å¹!sºËè4Þ&œqqVç}»ÿï—áÉ>ÕÖ Z³ÁÃÅQoÝ×ðôÉïÿ%üðÚmô?•µ>?¾#fˆš,Ôsˆš8GÍr£ÓÓqGl‘üW¸ôþÖÍ<çØºÎ ’qO¯—¾=±™ùÓò†×ͺÂy‡HÔ—N–éTÝ‹ÕI~ P«- ^½_ê{?·¥§ÇáÎúvOnñÿ"}äÖ…?Ÿš¤†¶þV<Æ·29¯ÌB2Ñì´<¿gí@öÃQ/§LkÞOû×Êø×?êV?ò:_ú¥úÇþ«ö~ÕÿEš¯ùF?ì¿âW/üäÔ;^ùa’›³ ¶ZõZã€û*,¿gíAöÓ$>½9>ø£í?ç ü¼ä Ý*ò õ1¦þ £Ê'ì®QôÎ'æ?[v/n°«‡ºêdVœ¾@¾!_P{I€-̯ÞÈGÒÙ—ÙýT?†ýÄ;<Öègüf>ðheºn½¢kºV£m{µH‚d‘‡Ì)$}9¬Í¥É뉼;½>·oîç{ˆ)†På;v*§qOo, +ÂÒ£ š2ÆXS’–Tu(Jˆ5l2GŠ$]Xæ:0¯ þ[Yy'ô“¼ãP¹¾n ;ÇÄ‹PôÙIaRÄòñÛ6ý©ÚòÕpíÂ#÷÷ºÃö~2O—Zþï×ß².Ë!Zj¥bÑ¡ yª³ÈЫ šˆYŒcþƒ¶U.ÙÕJf¾óæÝg4PÉâ bþ5òºû'ù“çüãædŽ?RO)hò"HÑVŽ­"¤³Ô7ÙŽ½¾g:îÈìó¦Ãf¼IѰýoík f¢…œ8ÏO~òøòµ•~ißþ\Mä¸!ÐÚÆ]EšÑ‚ÈGêĊÙ'Ä«À£þÕ<3[ظµcPNN.ø¯¯»ötw>Òçìó¤–Ü<5c¾ú]ýY÷å̳éÿ—º,ºìÂÝ’ÆK‡•Œf 锦i;^"z¹Œb÷éß[ý¶ô#AŒå5·^ëO/÷y;ù rùGàóÒöWŇ×´~±Ì3¿ÉOÌ´üÃòºývAþ$ÒÂAª&ÀÉQû»€ißÁíLåý±ötöv§Ò?u=áå߇ÝN?cö‡æqïõGŸëø½/9nìU"óOœ|·ä½<ê^dÔ#²ƒIÖY˜³kVsòwÍ—fvN£]“ƒ Ø=çqµ:¼x#Å3Oœ<ÕùççÌ™t?Ë›It$ž2êí÷iGÃöB_Á»g°öütújÉ©#,ÿ›üáü_¼žtëõZéxzh;ÿYä>ô¯Ë–:fšâÿ\Òš£mêTÀ®MIâÛ¹¯í?ÝžÅB†Áè»/ÙLX}yy?ö#õü~LðP €¬¼UØ«±Wb®Å]Š»b>Oó[~J~{hÞr©‹Ëš»›}` —ê·L#º®ÛúoÂàä—ÀØ|ŸÚ¾Ïð5&CéÉ¿Ç¯ëø¿NÕ•”2TŠ‚7ã&ò­â®Å]Š»v*ìUØ«üçüÀ‹òÇòÏÌ>qfQyglcÓQ·õ/®†ÙiÜ 3’ Å!ùßùM¤Ë™uæ;âÒ_êÒ³ d©vÕ‹êîXŸ ÒöŽ[—sçþÕëxó C”9ûÏìz&kžQØ«±Wb¨MR+Û:ê :U‚úX-æzÒ7a@Ûo·\œ_&ý4¡‘3wï$Òõo4þ[]]/˜4æ»Óo¥õf¼ˆ†¬§bë Ø–þW¡>ÙµÉp8Möú.›´ã|2ˆ wu~‘oYÒ5;}kM·Õ-ÖÞåyƲ¯¤n7ðÍVHHƒÑâuZi`ÈqÊ®=È܃ŽìU+Öü½¤y†ÛêÚ­²Î£û¹>Ì‘Ÿq¸Ëqf” ‚æhõùtòâÇ*û¼0KMóò§RmòçU­Áå5ª|Lè»ñš±(ù û ËÊpj£Áš#ñÜz=¿gûG‹1'îçüîŸ?Ðv} ù]ÿ9oåŸ2´?D¾]× ýsâ6?MÉ«DIìÿùYÈöŸ²™1ܰúãÝ×ö½\5f?^ãùÃôÒ/àú> ຅.-¥I­åPñËGS¸*ËPAÎJQ ÑØ¹ñ°l/À—b®Å]Š»i™QK¹ Š f&€¹$œ@WÃß™z§ç§œcü¼òTå<“¦Ê^êõkéݼFrôë†ý£ñw} ²ô0ìÜ>aûÃÈwy{ûûœ‡&·0Åâ{‡ã™f¾^Ð4ß,é0hú\~´rwyý©÷f?çLæõz©ç™œÎåö=‡—ÇŒPo™LóÌv*ìUØ«Ï3¼û}åd±ÑôDþbÕ[·%æ"RÁ ûLÌh€íÖ¾yØÝ™A”ò„9þ>÷˜ö¶ç¥Lj^Lœ¼ºrï'“Õu/Î/ o0kw«}aøò?±éˢíØirù®ÂÚãU³ ;-=H¢¹áÅÊT Šö5§ZœñÔRÃ""vø=pÑŒðÔB&qß¼ uü~¤ë¦Ã¦a»b®Å]б1þfù?Ë%á¼¾7ÉPlìé< ŽÍBO³0ͦ“±µ÷Œhw‡ãÜèûCÚ-&—iJåüØîPø—›ß~ty·]f·ò†Š-ã$¯ÖeáÇ­4?ër·³xqï–wåËöýÏ:=¢×ëO ÷×Û´GÆÒ; Ͼfø¼Í®È!µoê3¨ÿžQðˆ}²Ç-6îà/¿öósqûÚzÍõY¸Guñ±µgùm ÁCró]7pÏÁЀøl2í žTþ“þ Þd>f‡û?jumå/Z!Ó`¨è]‡ï“‘Ìyjrd½ŸÙŽÏÃôà‡Äq}²´Î( €R’1àŠõeFDów°CÓp¥L ®Å]Š¡§Óì.kõ›Xf¯_R4z×ý`rBr‹‰ŸAƒ/׎2÷Ľ*¹òo–n«ÏOŒ%¢§Ð„Ã.ޝ êé5>Çvnnx@þ­ÇýÉ#»ü³°-êi·ÓZÊ W˜GJÀ¿2#Úø€/5¬ÿ¦ž[áË(:ÿz~Ò­kuù¯åj;SmJÍ?Ý8¸Gnÿžg1òétyþ¨ðŸ-¾ïÒê2vnhwÅ?#¥ßÙ-ÿÒ²]óäÁ(³ó~%¤âæµ ±ñ0LCòsš­G³/ ïÈþ±úšp{c,RðõXŒ$;¯ýÌ·û^£¡y«ËÞf‹ÖÑ5®è*ñ©ã*ò£z8úFsš\²D»æõº.ÒÁ©Šb_Ëšo˜®s±T¿]ÒÛ[Ñït•º’ÈÞDÐýfs@ÛrìFÇÛ¡|¿M›ÂÉЕEÅÖé¼|RÇÄcÄ*Ãòwåž“åÏ.^hzŠÇ¨É©ý#)R«"}%QZ€£q½CTצl»C¶2fÌ2GÓÃôþŸÇs§ìŸgqi´òÅ:ŸÕçÝòûÐw䇒l5¿eº¼DnqÙÜÊ ÔT"+0 Äõ˲ûI©œ8v`o÷¸Ø=ŽÑãÉÇê—‘;}Âþ'Þ¼Óo}ù‡ù¦ÞO¹ºk=Nøc…GDŽ ò2¯BîME§†û}ã£ÑxÀqJ_¯o€ûÝicŸhö—å¥.C§¸YøŸ¹C_Òäü—óF‘ êÜiz‰aue;ï,¢EL*µCÖ3Æ äô¹ÇiáœrD G‘Ù»V»L{SŽx¦L'Î'¸UÝ{öÛbú8gÓÝŠ»v*ìU~g~^Áç-7ëvJ±ùŠÍI´—eõnasà`ö>Äæë±»Té§Rú?/?Öó^ÑvÖãâŽÙ#ËÏú'ôwÿ&?2æ×bo'y•Ì~gÓƒ$-0ã%ÌQlÊÕÿvÇOˆu#~Íšk}žæ0ÝË ?ïOØvîuÏvÁÊ< »dZý#¯Ï½ìÃ=C óåw•<Óæ[O3k0<óÛEé=©zA?å‘zž5;FïQ±ßh}£ÔétòÌБ»ê;ëßötu:¾ÅÁ¨Ì2ÌY—CÝiî¯å/kÖ¶¶Z¾ Õ”‰5¬”HÞ1E¢­lW¡î3]¥íø%)c™‰¢{ïñÏ›™¨ÑbÍÄ`&À€lÌ7)¼ ùßÌö÷Ÿ’™v~wÐâcå}YÙ/m#Ù(ä5Å¿€è%‡ÜS¢ç¦è%ÜìéirŸÞãúOû™½—í|ûµ4dzµC4¢|ÇÞ?Hý©#×ti4hüÂ/¡MXRéoä‘c‡ÑW.ä7ïž3-a˜áá> << Y±Òžg‡Ž»x?žÿç%§mòÊѵ=FJÆ5Ibf[¥`‚œœŽ¼ž‹ìÃ=/°?àq9ÖMaáÌÿÎ==Ã0óÚ®Ý3—‡§Zû‡WœÙù[ó6 ÞaüÄÔf½¾˜†kc/7§P®ãeQÙ#Øv#=_I¥Ã¦Æ1ሄGAøÜù—7Aì¬òËÄÕÈ“üÛûÏè7¡ÙXÙéÖéic[ÛG²E…Q÷w÷Ë­íð`†(ˆÀÐ"06»R¹¹·³‚K›©Vxi%‘‚ªÜ“‹ ¹cŽ&R4RÁçüËK©ÞÛË=Ö´Sfš5hâ¯Ùf§úÀdø;Þ_'µr1Óâ–Zê6qûi8ò潯ê·s[kš\qÇÍ'g,®Õ€ø@­ zà ;Ìí Fi˜åÂq€9ßÙÉ’ä]Ó±Wb®ÅX‡æF‡úkË3¼KÊîÃý* ÈAûÅúV¦ž dàh¼÷´úÌiIT=Côý²ÿç1å`þNéKw(“Zòáý ¨ÔüL-Q~­!®ç”*ÝØ6^øù{–(v*ìUØ«±Wb®Å_ÎtyÊmoÌTü¡Ò¤«†]WSU5Q=Ák{Ujt(ž«°=NBsžy³ Xå9rˆ¶!aeeoal8ÛÛFÆ?ÉE +ï¶s3‘‘$õ|{>c’frç#hŒ‹S±Wb®Å^Cç»ù5]sY°¼Ô¤°Ó4+D–+Xº¸”!Z‚Ewp+½N§6ÚXpÆ$ 2?'¹ì\sŒ¥–Ugø@¿Ô˜ùGRÔ4¹ô?'ê1›¿Ò¶²ß]Éq#LУ£˜áàÕ   ­{·L¯Q!)¨Ó‰Úš|yc—SÃáÈDP«6,ß^cÒ¢Š("HaEŽÔ$q  ªª(`Íq6òr‘‘$îJü ]Š»v*Æ<Íä=ÌêÒÜEõmD†öëÛ˜èãç¿“ƒU<|¹;ŽÎí¼ú]âóOèîH¼µçͯȉÇèûƒ«yD5^ÎnrÙñ'ÃíÀÇÅvùäµz .¸z‡ ûúþ׸ìî×è7Ž\þiëðä}â¤ú·ò¿þr/È_™K¯úÌŒm*õÕ}FïèK²¸öÙ½³†í?gséw®8÷Ò‚Ð d'¿øOǧ¸×•½{4.s±Wb®Å_.ÎRþoÞBSòƒÉR4šöª=rXÇ3ÂÑHèÒƒY<oÚ4ì}šì¨×ærý1ú~~<ýÈ”ä!r—&;ùä«O$è‰f¡dÔî8ɨݲIM”¼´_¤÷ÌnÔíj²qúGã©}{°û:<<äw‘ï?¨tý¬¯5ŽéØ«±WþgyÏ^¸×­ÿ/üœÍ©qÀ^\DxÈ «ÍcWý€ãwì;õΣ±»?Äu¾‘È~Ÿ=öáý¢í|òÎ4šo¬ó#žý/¦Û’Ì¿/<­¨yGB“OÕ/íô÷2]K2³°DDâ ›Ÿ±×5]«­†£(”¾÷}Ø=›= ’â‘‘‘>ð;ýÌOóƒÊzíõÞ—æï-Æ÷†“Ä</9@ŽOZ)z·­ToÓß6}®ÅË]„ÿ°‡Ií_e朡¨Â.Xú{wîÅõmÏÿšvÖÞXƒBm:ݤGÔ.ÙeXIN…šET‹‡ÄÆ›fÇ—K ')ÉÄz ¯ñæê5ZíwjÄ`¸Ž#½}¼‡ZܽÃAÒaÐtkÝ‹Åe p‰ÅÊŠ#Üïœ~§9Ë’S?Ämô-”iðÇåI†På;v*Áüáù©åŸ)sµ2~‘Õ×o¨Û0<ÂY7TùnÞÙ¸Ðv&mFõÃóú_¹ç{WÚ]>’ã|sþhý'§ßäòCÌ_˜ß˜d¯©úA~‘DZt>'ûÉ*?Øü³©Óö~—IÓŽ]çØ>÷IƒGÚݳ¸ýÎïˆ#ýÔ¿Üû‘:Oåþ‡§…{¥7÷rÓ G_hÆÔÿZ¹n]tåË`ö]“ì‡MG ñ¥ý/§ý//²¨ãŽ$Ä¡#]•Tö0É·¶†8ÀÄ@»NÅ]Š»v*ìUØ«±Wb®Å]Š¡¯tûF/FúÞ;ˆ»,Šžàõå’„ÌMƒN&³AƒS Ðcîîø0ûÿËÄŠa}åËÉ,/c<âRíEaÓ„‹ñ¯Ï|͆ºÇ Ç|û´ÿàuŽüMÎ9@“_ }Cý’i¤~kùÇÊ3Çaç;FÔlI¢ÝŽ"p¾+"üPvjšíO``Î8°žÝÓö~6yãÛ¡Ù“õ°2I~© ¥î;÷½“ËžmÐ<×kõñg*–ðÍ{ño#íkiŽ)aúä{¿„÷ßèø<¯AòŸ|ϤØéšÖ¡sgåK"^ÎÊgjl\´pIcñ¿ŽÕé°ÑàÇ–YcâOœ«sñu™ìî«Uø„Ãå|þôŸµé:^‡åÿ'éòÉk[C¹¼”ÖFUÜ—~¿@ÛÀeä’÷šM›AŒ˜ò<þ%ˆy—ó2ÖëMÞS¹?¤ç-ùÉB±¸?z‚›OJü²Q‡{Îö§µ0ž.4½f@n:w‹üôoÌÞYó ·—|ßp.­õÒï—>2± ^d) Ÿ„ƒÐÒ›b@"Â{?]ªÑêcƒU.!“é—=ýÿgË£Òò·µv*Â|ËåýcÌúý½•ó}_ʨ'Ç q(ê¬:Švð Ôí0hy¼Ïjvvmf¢0Ÿ§Eì~£ÝøéæºÿÏ>Mò­¸°±t˜Â8¥¥‚«*üÜQñÞ¸ˆ’ËQÛú-x A¯á‡ëåöÛ¼æýgÌ÷ӵƒlôoO•µÍ5 —j¨?²»SDv/lçÖd&XøqÖÇ~~þ¿Í2JìUØ«±Vˆ °ªˆ=ÅHµ_ùį4ËŸÏ=OòþîOOEó\M ¨cEVá®lÚ¤÷¥‹Ý˜ ȉ°ølh-¨ž>€íî;‡èVIÕ»v*ìUØ«±U“M¼RO;ˆá‰Yä‘UEI$ôb¯ËË}~oÍ?Î?5~e\†kG¸éÁÁªBÃêö©½7Ktí×5Ý£’£ÃÞóÕêø0 cœÏØ?m3ìÒ¾xìUØ«±Tµwua¤ÞÞXÀno …ÞT»ðŠ êþ7ûº‘›^ÇìëÌ!ü#y/ÚÆr¡o”?)<©{q-Ïæ'™ÙîuíaäžÞI÷“ŒìZK†¯íJNßäÿ­?oëã¶ŸÑ?‡O‡ßî{ÿd;‚?™È=Rú|‡Çî÷½g9‡ºv*ìUØ«çÏ0Þ·‘¿:?OjˆÏ§\°™e§ÐžA™ãWoïÆ—æ»;ÇÔ>ðoí|Ç]›ò=¯âä™oð1áû鷣˦þ˜ŽþÒøó7‚Tô‚Ò»µh>YÇ6A>ÅÝ[¾‹f#Ä÷³Ë<…ç2yÇó Qh¯¤—ÊvBåá„Æ‘§¦ïÂÜTÄ|C‘®Ç:>ÓÐaÓi#q$«ö¼wbv®£Y¯Hœ1â¡@mÊ=>;÷=‹9Wºv*ìU¬ëzW—¬$Ôõ‹”µ³«¹Ýš• Š7f4Ù@®_§ÓO4¸`,¸º½f-< òK„ÇÅá¾aüËóOž®%Ò<švöfº'„Χ¼’ ˆÁþT<‰éž‹±0逞oT»º~ß‹ÄO´µÝ¯áÑÄÆeËý4¿‡Ü7>k4"izO‹À/¯úó~íù(Yü336¶SØlß°}†Òèêy?{“¼ý#ÝÒoÊ™^a½»±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUJ{x.¡h.cYaqGÀe#Ü1‘ÃV}<3@Âq‰æá…jI¼Ón—Xò}Ô–wОi©ùFõÿ…mŽgGU‘àÊ,ÌûcØc— ‘Œ‡ð_û™~‰mæÌ|™ùÎuÐüõÔu"1¨á7Oß'ìò‡Ãþ¨Íhû;C¨7õwýþ÷YÙ¾ÔÊð5‘ðæ6²+ý0éïåî{ :J‹$l7‘Ô‚¬¤TGPs•"¶/l"Ç&ð%Ø«ó÷“Ït3¥%ëÙJ²,ÈëV‰Êþ̨ä7¨ßcC›.Ë×þW/ߊtý·Ù_Ãቛ¿/ˆëúÑþVò¶•å*=+JŽŠ>)çjz“ÉMÝÏ€íÐe:ÝlõãŸö9›Ù¸´x†}¸ò—ö>g¯Ó˲5ƒ$î²tûÇÜ~]ï¥l¯mu8/ìeYìîcI ™ UãqÉX|ÁÏ!͆Xæa!R‰¢ÛHÎ"Q6%|©›ó‡æ•ü‘oêëWcëL9Ca $¹—‰QAþSP{æß²»S®•bŽÝd~‘ñýw]Ú«‡J.g~áÍá:Çžÿ1?5d’ÇBˆèžYbRVGe½–p?ºF)â\õ>ÇöOM£©O÷™;Ï!î¤ïîyC©×v¡áÄ<<}ÿ¬õ÷ŠqåËÍ˼.~½©­Ö¦QDoø­7 óÜûçO)’ôÝ•ìÞ -HúçÞ@é÷ù²üƒÐ¥gÒäÖ¼¿¨išMhµ™©,p€ÆŽIi$ØÐ©ãJ“UéLº¾e“U¥:ŒÆ³DóÏ©÷mï ìzGŸ|ü¶j\,ll˜.eÓrh‘Fò35êÀí#¢íÓà9*"Ey'à;žÅ ÈÆ“?«*ª‰$ãÇ›BÜw¥Ol¥ôx"6{Õ1dÆ<û¡^yƒËÒÚiõ7ѺK A hhÈÄ)BNýÀÉDÑt~Ðö|õZcP u~O9Ѽ™çM)„ÉåûgMÄ·’G1ù…õŠ xñË êñº.Ä×a60@žùßW؈ӼëçýKYH±6÷3FãÖG‡‚Ÿ‹”¢ (éÉ~ŒLE7i»s´rç¡Ã"ôyïÝæ>dÊ_Hov*ìUØ«Î?1Í÷—µ/ù÷Gc§¤]BÉ0¯Ã$ ˆjlZ¿<·x/m´V!˜Týãô¿O<¥æ;/8y_FóVœkc¬Ù[_B+R«q“÷RxŸq–¾tœâ®Å]Š»v*ñoùÊ¿<ÿ$üÁ<úz–¶«¡ØQ¸±{ðVb§¨+•…;ŒRþYi¢¼§jî¼n/ɼ“mé%ðOÓœþ·'C峿^Ñê¼]T€åOËŸÚÌsлv*ìUˆy·Ì^gÒ®à¶òöŒÚ’ËÜLc‘ÑXš*„oASó—§Ã ”©Þv^ƒM–&Y²po°±ú^{q§yîÿ_·×,4#£êLÃÕžÜËÞUv#¿Å¶ýóRøÑó,/Í~a¹ÿœ†üÚ’÷ãBòÿî¬âj€m•º‘µåבîSös"—£¯ò³ûÿT~ÿ{Ööf~P,~îËõ|~ëzò"F‹j4UTP6Û8âmö0À—b®Å]Ф>kò~‰ç+a¬DIŒ–·¹ˆ…š"„£z÷s7C¯É¦—¼t.·´û+¶.Dsç—Gÿ8ﺬºû*׊Ú)Œ…GΟFtgڳö=ýû}Ï`Çù}?Õßïz¿–¼¯£ùOM]3FƒÒ†¼¥‘)fzP¼µOà;œÖ³[“Q>)þÁî{>ÏìÜZL|Å´ù”ã1÷b¬OÏÑü‘gÎé¾±ªJ¤ÚièÀHý¹?ò¥hýÍŸfö^MT¶Ú#™üut½³Û˜´0¹o3Ê=`óx²óæ6 º÷š§h´î¶¶©T^~1!¯=ÜîÞýsµÇZHpbõ?­ÐvO³z®Ù˜ÔjɆ/á¬DtÒæz_6qgei§Û¥­”+º}”AAó=É÷9‡9™/®èôX´ØÆÐëûS³á«Á,RëÈ÷‡ñÑç”ɧTò/îVÆ=)¥–Îy‰âœZ²ÂRžqÐoSN£3½«ì#«àÔé£ÄgB@}‡ô‡›ÂviþPÏM¨<<WöÒ;ÝæÏ-wÌ—/¡~ZØÈ¼ê­©H€ÌTíɾ×ü·ßýS–v?°Ð…OTxóG/‰ëðÛÞO´9õRð´‘?Öëú‡¼ý‰>‡ùb¯pu8\¶©ªJÞ¤‘4Žè_ÆIâþ<ï #ˆÀÐ9ÝìœAñ5'ŽG§O‰æ~ï{ÐâŠ(#XaEŽ$R4U@ìØ`{@DPüY;v*ĵMÊþWRóséé-â“pYþ/Þ»Pª³Ÿ´wÉ‚N΃W¢ÒhÆMQ€2çñ=ÝÖz°Í>/ÌŸ;Æux5/Ñ– ÍõeYd·FâiE‚Ì%òFƒÍiáÚ}¢Ÿ‡NRò­†·¦é k¯Ý‹Ëðîþ°frÏ ¥ž„Iú6í•ȇºì>|XDsËŽVwçÏ̧yfìUØ«±T—ÍzOé¿/jp^RÉh7õcøÒŸ6a‰¢ë{_Gù4ñõ#oxÜ}¯¡ÿç|ñþ!ü¬ºò•Ìœ¯ü§xñF„Õ…ñkˆI®ÿÞzÊ<ŒÉ|BAõ(v*ìUØ«±W¿óœÞc“Ì>xògå}œŸ¼gP½ ½&¾“З¼qÄíò|†IðÄžæNq‡¦„Ç¢Š8"Hb^1Fªˆ£ UîÎ`›|vR2$že~.Å]Š»¼k@ó¶‰iç­cUÔLÖ¶×ãÒ¤ â6B«ñªŠÐ…ø~žù¸Ë¦‘Å7§¼×v>iè±ã…HÇ}÷|þ<Þ·c©iú¤?XÓ®¢º‡ùáupâv>Ç53‰¢)â3iòb58˜Ÿ4VE¥¢BŠ“A°ßÄš SI˜ñ4-M´úýxZÎmøý¯SÓÕÙÖàÔÔr~îìO¸þ¿µé=w3ŸzÇb®Å]Š»v*ìUØ«üÅüɱòU¯ÕmÂÝy‚áI·µ­V vKMé^‹Õ¿ÝvOdKU+;@s=þAç;{Úh£ÃVCÈwyŸÕÕäú–/õ‹×ó7œÔH&5'ÀÈ;û1ôîο&h㇈PÁaìϱóÍ?Íë®R;ˆ¾_¢=:÷3ž›™€ú›x«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¡ïl­ug´½‰f·Q‘¿X=AˆÉBf&Ë­ÑbÔã8òÄJ2éøëæÂ,ï5ÿÊ\_é¬×~]ºp.m›ì¸ì¯ü®ÙqýFej4ØõÐá–Óã§“ã£ÙºŸgóø˜Éž ŸÀ—t»¥×æBy{Ì:_™ô¸u}"oVÚ]™Nϵ‹Ù‡ö³‚Õig‚fCÚh5øõXÆLfÁû<ši˜Îc±WH'sîiLQNÅ.Å]Š»iÝ"F’F Îì@UP*I' @½‚ Yäò¿7~uišt¥ùR!¬jÌ}5™C5²¹ØqáñJkÙvÿ+:^Ïös&J–_L{¿‹ö~6xÞÕöÃ+†âK¿øãߛʼÙåo;ÝØÏç3g•ãYá ,ÑÆGfDUG´­|Fvº}<0ÀB€x |u‰Ï—r^«ä–Ѧòí¥Î‹l–°J£Ö‰7a*|.Yˆ=ØôÁ+·Ô{X%¦Œ°ÄDcÏ­õ?E‘wÅ]Š»v*Ç|ó¦I«yWR³€rœF&‰GRа–ƒÜ…¦J&‹§íí)ϤÉά|7ý ;ËŸ™:å;{¯RMJÙZinB±âÅï_l™%ç;3Ú}>ŸGÊÌã·ûï’U*ù¿ÏúÍ–·a¦¦‘_ªÞHYVŠüÁgmÞ†¿a0ì1­í<ðÍ c‡)}óþ/€{2òâ9Ð= 7ïJå/¤‹­×b–#ç8ü¯¦¼Ë¯i¦úh¸ÚÅE žN¼‘˜-+]Ødã|ž¶ã¤ÃZŒØøÈô޽çqËæÅ‡¼íæ ò–õK?²—…m¤,CåC’ᛡþ]×j½:\\1ïçöš‹ ò—–|Õ§êo¬y‡WúÔ’ÄÑ5 g•@bQ›Š­è«‘”‡GoØý•«Å”åÏ—ˆ‘\;ŸØ>›äØ«±Wb®ÅVÿÎ.ëÿàùÈÛÏ,JÞž•æÈ.-c P‚R¿^·#ÜxWýlȉ°ø¿oé< VHô»ã¿ÙÉú!’t®Å]Š»v*üÆÖõ³ù‹ÿ9 ç/82ØYÜÜAc'UôméamAÐrŠ2ÿ<Àí Ô+½ç=©Ôpi„:ÌýƒÔÌsFùñWb®ÅR?5ùŽ/+é-¨¼Fâwt‚ÖÝM ’½H¡ì é—éðø’§cÙžuYx.…Y=Á€'˜àÖ.õ(?04+H-ôèRI¦T¬£KÇÒˆ2±nLù–”ß3¼<9Þ˜ö|°ÆI–DÌì6áÛ™îÛâÏü¯åí@±q¢r6·Ì.C»s%YP ââ¾9ƒŸ4¦}\ÃÌö–¿6¢cÅç¿iæPë’3è+æ]]%®¤´YJ1’0¥ OQP *:u˰eðåÅVçöv»òÙFN*ï`£4<¾p5Ý1:BÕ•‚öø‰Ê69ǃ/1Â^—ó›¬úÇ….þ_o/˜Ah÷¾Eó¹¶µåÙ,uÙäâÑÆÒú)ÜóJ•ñ? Ì øšŽÐìL:þ™wÒ:ýï¯{3íô£QŒ¸‡ó%ÏüÓý£ÉëþQüÃòßœc §\z:ˆ“O¸¢N´êTVŽ=ÔŸzg¯ì¬ÚcêñËö>ÃÙ}½§ÖA©4óý¿Uš×tìUØ«±Wb¬7ó϶žHÒ¹¯µ« Ëajwï,€oÁ·‰nÉìÉj§ÝÌþ{¡íîÛ†‡󜾑úOû^Aå/ÞêwæÏ3»\ê7L&eÜ‚zHàڜ¢¢–|±Ç À5û!ì¼òKóºÏTå¼ÿtÞŽŸ*œf éîÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±U+›h.à’Úæ1,‚²F ƒ†2 ØiÔiáš@% °[+Í_ò£_]JÃ×—nÈK‹rM•@ëÕ¿Þ3/S§†» ¶˜ä;ßí.ÎÏìþ§ÄÇsÁ?Ç þþ׿ú/GÕôý{M·Õ´¹„öW+Ê7¬àƒ±çúŒÅ3 Š!î4º¨gÆ2@ÜdÊ\‡b®Å]Š»ažpüÍòדÕàžo®êÃìéöì ƒÿ7D=üÍ·gö6mNàpǼþŽ÷CÚ¾Ñiô{Å?æÓÝ÷ù<ºAù‰ù²áïô?•˜Õc’'ZÔ• 1÷b™Üh;#›x‹—ó?Øùþ³´u}¢}Gƒpåÿøíîz•ü‹åÿ*F „­ñ’új4ÍãÄôQì¿MsfÏO£†.C~ôúöÎßP´žÆí–×1¼S!îŽ8‘øâäN"@ƒÈ¼cÉRÜy7·’õ&Þáëi!Ø4yFðõ#ëîÈd ý–Ö6¢Zy§ËßûGÛOWÊ_Gv*ìUØ«±Wb¬cNò•ôÛÉo’ÌOq$*ŠH‘rnAcJ~É¥}òFeÒi½Òa™˜…’o}ëÜ9{ºù²l‹»kšòáÈs§.5Þ+LQbév)R¸¶¶»Ñº…'„Þœ¨®µSPhÀŠƒÓ1Fb¤{¼tjÞó<Úž©£]ýVÇKfág„øV¤"¨SÌñ<¾ º€|çó£¬92b— qÿÛáçñýBò¿š­u-Á¬êEjëÊ+ÆwXãYS®ìh*(ßNW(ÑzþÉíxgÒŒ³"=%ÐXüZ}iwm}oÝœ«=´¢±Ê†ªÀl~c"í°æŽH‰@Ø=Uñlv*ìUØ«Î<ûywå?6yWÏúpÿKÒ®à”°2YÌ·1)?åQöËq—Ï}·Òú±ån'ï¥ú—¦êº¶iªØÈ%±¾†+«iGGŠd#šr×ÏÑX«±Wb¬;ócÍ_àËO5y©_Ó¸Ó4Ë©m´ÿJhÌv⽫+ ÅCó‹òsMú·—®u{éÈSãˆÿ†/šNÑÌçÏý¬ÔqgþhûOì§£f½å]Š»Q¹º¶³‹Ö»•!‹’§9*òrEOrM0Æ$òlÇŽS5eŽyó@¿×tˆN’ÁuM>â;Ë@HÞ0G¶ÀïQ]ª3'K”B[ò"¯bk¡ƒ)ñ>‰ƒñy½ž“çgôžq¥=«kWqÜjš”ñ²"¤mÍU+@B¶ã‰>°–LQ©|#`õyuZ,<A/$B ÷í¿í{]¥´vv°ZC_JÞ4Š:îx¢…úi¥+6ùþ\†r2<ɵl mcE’v RÎ5Ÿ,ùößSºÖüµ­úñÜ»L¶LÜ)û*©'8šƒnF™±ÇŸˆŒâõzNÑÐËqgÅD âý¢¤>Ô_u½WÍMy®é–ë6û»}Ebã'ªy# -Z+ˉFÛä5x£h“¿FŽÜÑâÒS5>q½«¡ýL÷0^iØ«±Wb®Å]мïóo^k-ÔŸ­êGUû^‚Q¶ÿP{ï›ÏÅÅ.#Ñê}–Ñqå9eÊìýIß”ô5òö…k§P Ž>¥ÓÚ™÷mûÓìa›—UÚºÓ©Ï)ôä=×ëNñuÎÅZeWRŽ#H¨ õbkpÀüÃùecy'é/Iú/RBU — Ž;Æ}×ol(òzžËö£.Kˆ|zýþmhŸš¾kòmÄzGŸ,ä¼´û1ß }`(îìJ>d7‰íœßh{7'«¤÷tý¶{=íÿ@™ñcßücßßñù—³h^bÑ|Éf/´[Èî 4äÑã'ö] O±Æêt™0K†b‹ê-~L8±HH}ÞñÑ3Ìg1تQæ1éþTÑ®5­E¿s¤qñÍ+}ˆÖ½Éû†ý³+G¤ž£ „yŸ³ÍÁíÐǤÂrÏûOsçíÓPóƹ?œ|ÉñÂÏþ‹¯¦x*¨?î´éîz÷ÎþBlc?Çí/5ì¯bO´óv¨\ôÇ¡#ýì~ÓÏ«?ÌØŠ»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š¡ï¬­µYl¯#[Ì¥]OàAìGPrP™‰°âëtXµX¥‹(⌆ÿŽþâÅ<›æ;ÏÊÿ2¶ªÈÒy_QpÞ©é? Σ±,€vßz Ÿjhc­ÅÇ®?o—ê|g‹Ø:Ã)¼3ÜKý÷¼rý¢ÑÒDY#`ñ¸ ¬¦ ƒ¸ ŽÙÀ‘O¡°Þ»J<ÃæÊÖ]ÖïÚ3_J?µ,¤vÄÇðó+K¢Ëž\0÷{ƒ®í,:Xqe•}çÜ;©þaùßó æM'Èö’iÚ]xÍ{^2ñ=ä˜|1í¿ø½ÏLí;?ÙÜx½Y=rÿcû~?'Ï{CÚ}N¬˜iÁ„{ÿ‹çÓῚwåOÊ}Ee¾ÖHÕuZ‡&AþõøPý£_Ú¸gFë4ýo/Qz €è1vNÅ]м«ó“C‘!±ó~ŸT½Ó¤Ž9ä^¡9ò‰ÿؾßì±u=¥ŒÇ‡,v1?Ùö²¿/êñkº5ž«¸ŒQû2…×è`Fc‘EõÍÖNåÄ>Þ¿jgÍv*ìUØ«±Wb¯6óž³æk¿4ÚùCB¹x¸ˆIõ‚x3Ô3Î…€M8îNY*Þ3¶õº©êã¥Ã.!wÊùõøtDywËz”5a}«ù„\k7€[úê¦C3-YÛâ‡lI¾½›Ù˜ô9¸òçâÉ/Mwß¾Éß®ÏAÊ޹ثÈî4/<é^dÖmü§Ea¨J³5Ë,kW¢´µ v_„W-±[¾}“A¯ÃªË0¨ÌÝí]ý{¬·TÒ¿' ú棵Ik{5ØÖ’H?ãLNFzObºæÉðë?©é:>‘e¡iñišz²ÚÃÈ wg5bY[Äší•“oi¢ÑãÓcáôŠ?”ìUØ«±V%ù“¦þ‘òíe´áw·¤~3ÿ['»ÏûO¦ñtsï«åÏì·Ú_óŠjÿþDùZYÞ‘š5È­x}BC+ÿ"=#ôåï´â‡b®Å_0ÿÎuyŸô?äý¾Òo1j–ÐIiÊÚÐ5ÛŸzHýø¤>|òžú+ËZ]‰^/¼m*øI õþŽsZ‰ñLŸ7ÈûS?‹¨œûÉù ‡Øœå.±Wb¯-üÛ”K}åí6öVƒFžv{¹G@¢3|ÑÓ›>ÏHŽocì´j§so´ý¤,×|ŪyŸW¶ò—‘o;h#ås¨Ç+€B7”Uø¨ ¨?8°ÇLòƒ-ƒ—µ¨Ù'hÐû¹Yûcùw®kªj¾V×n>¹q¦ÔÇtX»|é²—;°$‚¤ï•ë1G„N"­Åíí‹|C„O§ÂþDÍ{Ë õ]F #MºÔîj`´‰åuZrn"¡Ev©; ž8HÕ¿M§–l‘„yÈÓ_Ì/&ùŽÂãMšþM5®âx_Ö_IÕdR¤‰(ñƒCÜæ_å2c ÕÓ¼=…«ÓLL@O„ÞÛòòرø<‡æKŒ¾Jó:Ïbÿ°&dJ‘ ÷ ËΪûÈnìçÛz|†µX*^ï×GïfžFòÄÞVÑ•ÔË=ìòµÅË¡bØ¢–¡;/Zf«8É+mvˆÕæâˆ¨A“f3¨v*ìUØ«±Wb¯²?ã_Ì©õýæ—¤ŸÜžªDŒtÿZJÉò΋K‹‚u{­GøgržN!³Õr÷ˆv*ìUØ«±T=í…–¥nö—ð%ųý¨äPÃæ<·aÏÇ®[ÝÚÝÛ%å¬ñÏi"óŽxÝ^6_ÊH#9iã”O ^÷XΖ;8@DPñdìUØ«±T&©§[êÚuÖ™t+owÃ'ˆ)Qî:ŒXd€œLOW‘þVÞ\iz†­äí@ñ¸µ•å‰MiÊ6ôå½ÂÃé9^AÕÍö;Xa)éåýa÷Ð~oPÊžùØ«±Wb®Å]мïóvÍßD¶Ô-íÃOmp¢K¥_ÞCVý¡¸RÔúrÌ|Þ?Û,$àŒãã/«¨ªÒK/þ^h‘AªkZàÔnÈY•!”ý¯´H+%kÝ› $º½?gvnœ ™³qËžÇôGÕó/SÓ5+]^ JÉ‹Zܯ8É4­#ÄC•‘Oy¥ÔÃ>8ä‡)#09Å]бíCÏXÒ¯åÓ5ï«ÞÂToCÿœó°ÛyãÈwOÆK+›mNÊ‘ZÒäÓÛÒ„fSàÙ±˜HÄóŸibÔìUØ«áùÎMUµßÌß"y[”6¶¦îUjwBåO¶¯°>ù^YpÄžàÑ«Íáaœÿš ûlæv(v*ìU,×4 +ÌVQÕ õ¡šJº5)ÉXn2ÌYeqs4zìºiñc4Pz'”tŸ-Ù\Ûh¡ žåHkǤ“¡ ~!O„š…¥2yuÈA“~³µrêf%—qáä?-ò“î|´·×š¤âçW¿™eRXV$|M¹,O&ú2ÝV d 9/¶ûZ:žã0€ÛñåÈ3Ãt-2«©W”ìA{âi䟘V‰?™´_/Ago§öY.¯âŒFÅ]Ê¢×á=k½>®“$„%"nº=·aj³GM—1‘Ÿ(“}/ßø(2y.ÏËZþ‡i¡ê—6«Kè3s¬±HŠàÇÀñ%»þ=2Ì:“’2Ó•Ùý¯=V ²ËËÃäy÷ßsÚ”qP¢¦‚•&§osLùù-â‡b®Å]Š»cÞxÖAybþõÃ'¡mãêÍð=ÔßFdiqñÌiØÚOSô»>áø¦7ù[¤~òདiq¨¹˜žþ’|ÖßNt%Ù{O«ñ5#”|zþ¯ƒ7Å犻v*ìUØ«±T§\òÞæ=NÜ;Hç_†hÿÕ~¿AÛ;EÚ9´Ò¼gáÐüM¯ÛkÞA–]IÖd}?X‰ÕíÆ7<8÷P[ì‡]Îý36“I J ˜ò/©û;í£QŠQÇÅ/Iq+îóû|Ù§•4Ðt¨à`>»5$»oòÈÙkà£lÔêsx’¾Ó>Êöìí(¼—ª~þïty|ÏT÷1Þ•Ø«±TªãÌš ¬†)õA³(1Àñ­2ØéæyéuÑè0ˆy ¾þä]ž¥§ê*ZÆê+€>ЉՈù€j>œ„ñÊ<Å9º>ÒÓêEáÉÿT‚ŠÈ¹®Å]Š»v*ìUØ«±Wb¬Yüý¡¥ëXŸ×YLúkǘnyt®eêöx¹ûy¡Žc„‰ñ pý"®ë½”æ#Ú;v*ìUØ«±Wb®ÅP#XÒïèáy¾ž‡1Σµ<}ºäü)Wlë‡liNoĉüÛßÝïòæŽÈ;b®Å]Š»`žv°ºÒ¯m<㣓휑™ÙGB§àr;ØoLÏÒÊ9"qOp_-öû±åŠQ×áÚQ#ýì¿ÞŸ‚/NѼßù¶é¬ù‹Rú ÈÂ(!"€©£,P‚BžÜ䫬3/GÙø´Â >=Kçù³ê{Dñå—§ ¾ôÞ«åÿ+èžY¶ú¶‘j±–sñM/»¹Üüºx ÍspéáŒTBq‹{±Wb®Å]Š»v*ñÌH›Ê¾}Ò¼ÙãmyÄ]S»EH¥xÄËOzà"ì–c¥ÕÃ0å{ýÇìzz°`H*EA‚q˜ï­{†ñK±Wb®Å]Š u8jÚ]Þ˜eh>µÄ&JÕ ¡ê+¿L Ó­Óxø¥ŽëˆU÷<²çJü¶òeеÕÍÆ±©¥ °€ ÇPª‹Ð׋3e–KÁåÒv_gχ/YŽc»á°ø^“å­WCÕtÄ“ËüÆ"Sêè‚/I¾ÑR‚”ë_|®@õ{NËÕéóbŽ•UðN0;b®Å^mç4yE5(ìcÒ­µ]åŽ9å0£ú`7¼À,ÌÁGOÃ,ŒKÅö×jèÆQŽ9r4 y_2|¿±è–öðZAµ´k¼J8ÐQUG@†Vö8ñƈ 9\Y»v*ìUOþq£To*ÎQK¥rámæ[[ëS]”™!Šý<àâ?·2 v|kÚM?…¬È;Ïúmþ÷è–IÑ;v*üÝüßÔÅó•¾aœQítN±€kÇêviÔø‰Ù¶aëåXÏ›£ö“7’CùĶÿBušÌ]Š»v*‚Õµ};C²}CTmíP€\Ô’Ç¢ªŠ’O€ÉãÆfh9:].LóàÆ,±ý#ó#ʺÍâØÁrðÜÈÜ![ˆÌbF;­¸©ì ~MH !Ùj½ŸÔá‡:7L·1]#±Wb¯;üøò¢ñéºî mõKjúrÛ£Êð‡¡+ EaC±âwð͆ŒeŽñ=O`ãÖãx¡p—~×îý|–ù7È:47Py‘ufÖø ÙÉÇ‚!Ag$¯`iO u:¹a\)í~ÜÍ(œ>…üïÅoFÍ{Ê»v*ìUØ«±W”~m]K©jZ/•mïgLã¨å+z1T{|y¶ìÜ|åð{OeñŒXòê%È ùnCÐí-¢²µ‚ÎÆ xÒ(×ÁQBÀfÍä²ä3‘‘æM«bÖìUØ«±Wb®Å]Š©Ï“‡”®¸«ùüÞ•š§×Þqÿ)4¿óßò:ÿwðýÌúøÒ—ü8ÿ»{¶sÏÓÅ]Š»v*ìUØ«±W“Ãä?0¦¶€ú²L$úÿ5ÝCråJòåíN¾Ûæäëqðy÷>‡Ø^ÐŽ´_Ò%~%ŽWw\ø¼«Ÿ–ïXÍ3îNÅ]Š»v*¥so ݼ¶³¯8fFŽE=Õ…ȃa§S§†lrÇ1q û‹ü³Ôåò¯šï||çê—­ÊÑÛaë(ªÛ÷‰±÷gE‹ œA~yɤ—gë'¦Ÿ v=ýÇâ>Ýž×–9ÎÅ]Š»v*ìUØ«±Vù±£ [É÷3"ÖãNe¼ÇŠ|2}Ÿ£´±qb>[¨þ_jߥü©c+·)íÔÚÍãÊ…kîS‰Ê&(½ß³š¿GyÇÒ~²™>EÞ;v*ìUØ«±Wh·~_ÐüÝæ5ó|h.䤴žâ&™}7vsÄqjVR :mó´ÙŸ;ÐæÓiµ™ÿ47!{Y=ÝE&–Í Ï™¼Åy£Äbòü…DKÇŠóæJPvÛ‘§`F òg³3Õgž!X/žß§Üôü­îмgÍ^}¿Öõ<¿c8Ñ´Ñ#Ásu1!Û‰*ÜÌaŠ­E(½{šeÑnù¿kûC“Q”àð¡tIçñ«¡ä>+|Ÿåÿ>Aki}¡gqhËé)E˜§6§^&¨@­ 1•DZaƒKÚ1˜œe«n|þ«âöpAƒPwe/¥Þ*ìUØ«±Vu©)~uy͵á7öå«@b†íVmûV))—c;>ií¶ Ï ÿ:5ò?´?Q²Çˆv*ìUùeäÝ@ù£óÏ>rcÌê7×W 曋û¹.6#jQFÃlÕöœ¶ä}°ËXñü“òþ×¢æ¡àÝŠ»I<Ó¯·–ô£©%£Þ°‘#ô•4j’Õ Ô v ^$ªéØvn„jrðpíÏñO'ó‡žô6Ã¥ÆÐ\A­È’òݸ•’ n.­^@:¹µÓéeŽùnײ{.ÌØ.Ÿ·Ï•i¿LÜê¼A^*è÷ý³ù°q5øt+‡ôùUy2Êao®5±ÐÆì u®Á¹W߉޹Úã|ëwYíQõbâúø}_}½/5Ï$ìUØ«±Wb®Å^A¥ñ殡¨ŸŠÛMõ}×÷ [->d—ÑiaÃŒ·Öƒvd!Öuöú¿cÔr÷‹v*ìUH\[›ƒh%_­* L<‡1¡¸õ¥AÅŸ‡.*ÚêüÕq`ìUØ«±Vù©­=&ÿIÔß‹ÔCº1â¾â¸½G²Ú?CýÑåø÷"<µ¤F¶² éê\ÞWݾï³ôg?¨ËÇ2_¶½›ì‘ ÑÃzªåýcÏåËÜ|¥Þ»v*óÌmíoƵ fKIQVvPO¦è8‚ÞŠo›maÃÂy¾3ÿNÄÊ3þj ˜H/è‘¶þDVýè/ùö÷E¶ŽÂ⻳‹hþ."“Zr¡ÕNYŸD&l.³Ùÿnóèq 3€ÉòÞ¤>;ßËâÏô?7ióz6îÐÞR¿W˜cN¼H$£5¹´³Ç¹äú—aû[¤íÃc?æËcðè~ÿ&7ùƒ>µ¥Ý[ÞØÞÏ •ÂðhÒF ²§°éÈ~£™zÂ@‚‡öÿ>·I–påœa1T ¡!úÇÜSß#ë2k*›™ —–Îb™ØÕ˜}¥cóŸFck1pOnE齈í™ktCÄÖ³ù¿Ãá?QÚìWé`:Œ¾†½w8ŒWr¿•ã)4Í”À'Ë»C/‡®É?æä‘ùL¦Z÷œæôÅÛÞCjä2H†H¢PßgˆR¿ŽSއ¤U»ŽÐ×vÌãùœ‡,`wqF"ùP‡qëÞYG<Ñ}¨\I¤êR™Ø!–ÞgÝþ+ýj ÌMvš1Q{O`½§Ï©É-6yqšâŒ=¹‚z÷޼ü“/9y½´–6!_R•y–aU‰ @$w'°ûò­&—ÄÜòvþØûZ{8 Xhå½ùDwûû‡ÄùÄá°óö¯j5T¸¸1°õ"X1(€€=ºW¶f™àá¡òx\:ÞÖâüÀœèî=|7çØør¾ˆÿ'ùËP„z>³#MÍéE4¿ÞG/@¬zš·Þ¹V«I(»Od=±Ô~`iµR2<"Rú£.€÷ÙÛ}í7óßšnô_GOÓ˜Gw:$˜€JG^#ˆ;TwÊtZa=Ï'}íϵt<8pœÅ™wB¼Îûôû¢6öÞz½³ý3o=Ü–ä®·-̪“^)ΤW°›)a‰á |žO¦íÌø5 ä”{ÆCt;£ÅuåODò—éæÒÖMyÃLä4 ËIV:» ©ùWÇÛWªàâô>±ìŸçΔKXnGéÛÔô¿²ÇSÐs¨<î7˜#·:„æx±˜ýFãÃÖ§xS6‡8.‡'ɰ{A®=¡Óáñ@®#UÇTËü÷曽ÑÓôæÝΆI& ‘׈âÕ$ó E¦Üò{ßn}¨Ë¡áÃ€Ôæ,˸ræwß§Ý·¶óÕíŸé›yîä· •u¹neTšñNu"½€ÌÙK O äðz}7ngÃù¨O$£Þ2¡Ý+¯*z'”¿O6–²kÎg! VZJ±ÓýØEOʾ>Ú½W¡õdÿ>t¢ZÃr?NÞ ?¥ý–:ž€û1ÞØ«±V ù‡a4Ë̶$Çwc"+ȽTåÿ±}¾œÙv~Z&/—ÿÁ#²®ÕÜ ½Çé?·ùÏdòö±¿¢XëÐ-ÜJH>_ö,Í«Æ`Ê2@K½3ŵث±Wb®Å]Š»R¹·ŠòÚkIÇ('GŠUñGR¬>ã‹DEã•SK¦jšï•îOïm¤2*ÿ• ˜e?OÁ•ä_±™Ìg— þ·Ëcú¥•=û±Wb®Å]Š»a~k¸ò¬šö›¤ù‹OŽCu²j2¸‰"Uäx³‚¨ñ¦ù8Ýló]¯—Huñg€<@úÎÀsëøæ—ÝyËJÑõ}Aò¡³—M¹b½ŽÙ z~£ª)WF IäIذðß7/máÁ› 7„¥Rᬱ}üž‰•½ƒ±T¢ÿÊþ]Õ¤¾Ó-å•É//¦«#¹%Öøá.¿QÙ:lÆçŽ$÷Öÿ>l>ûòëÈ73›kkß©]Ö‹WhíËÀ¤¼Ûñɉ—Ïì×gÎ\1Ÿ»„û –_å ü7¤Ç¤­ÉºŠ‘¢vNVFçÄ€OrwÈHÛÐöWgþSÅÅÄ5ñÝ8Àì]Š»v*ó_ÎKRúF|£â·¹hê:,e«_œc,Æñ^Ûa¼0Ÿt«æ?cô÷Éº×ø“Ê_ó<†¯¦Øßò¥+õ«tš´þl¹ó$ïcŸ˜:·è!y§]‰Ó4JôÔ{Y%Øÿ/Å_š?“Þž}vE{²Ÿ5Š4§âÇ4½¥/XOívKÏ÷Gï'õ='5Ï&ìUØ«±VçO4y'I»ú†±§&¥~T<‘¬HцÜry)BFà ó;Mƒ,…ÄÐzNÈìÝfhñ㙄}ä_À,Ñ<½ä BÿO¾Ó­¾©«¬Pê‘Ù‰_’!!‘ 2Êšl9sfˆ ›™k5úìpœ'.(Y…×Î6˜2ìUç7œEž¡ucuaqÂÚiaBÑÉÌFåCqb”­+JæÀvtˆõPöS,ñÆQ˜õhØçóJ¯5Ê?1]›íJ)m®ä Êæ9ãõ l@Yj{·_|¶8õ7f-'jé¡Á$œM{¸ž—¡¦’šU·è5EÒŠr¶‚©=~-êOZïšì¼\G‹›ÉëS–^-ñõ´Ã+q]Š»v*ìU«^7K½ÔZ”µ‚Y·îcBÀ}4Éã€ïr4¸|\±‡óˆ7šþPÙ0ÓµV]åºb z‘ò&¾åÿ 鞣ÚÌß¼†1Ê"þØôŒ^IØ«±W—~eéWúmì^r°¿0ʆ+qêèhiÀˆ;òVüp‡³ösU,šp±¹þßÐS_'þcZk\4íc¦«²£ý˜§=©_²ÇùO^Þ)Âíg¥‚ç‹Õ´~±çóg˜¼Ë±Wb¯!¼“üUùûó°Ò~E-ŽþƲŸ»1µy8qŸ7ßàUØ>&lBCaûÙ½ÿ{ö½4OÔNÅ]Š»CÝÞÙÙ"5ìÉ JÂ$20™¶|”`eÈ8º½f²<"ú“Ñ'Ôü—åýL1kQm;tšß÷d£á?HËñêç¶è;OØÞÏÕ‚N> :Ÿ³é?òêiz±² %³¸")S£˜ž‡±¦nþ¨ïÔ> x´š¿ÝˈãžÄuá–Ä{ÞÍæ}$kZ-͘œRÜøJ›¯ßö~œÐéòðLè_i»'óÚ)âUqGúÃ—Ï—ÅæžG×DÕ&MÂÒxœK]¨ñê~{úsm¬Ãǹ¾;ìOmÇAªÈj‰¿|nCôŠ—–­$óšRkÉL¯yuá@Ü©ò,BáÔKÃÇ·¹§Ù½$»Oµ§¸â9'ó¿´ÐfŸ™ßñÁ·ÿ˜ÈÿäÔ¹ƒÙßY÷~§Ðÿà™þ!øhÿq4åb'¥©ÉO” ˽(æ™gi¥ÕÿÀ¾‡<ºÜ?ß%ß™ê£X´`>#l>4‘é–öwÐ}î«þ ±œÆÚÿßI˜ù“åM>»ÿøNù­þôþ:>ì1¾ÊÃþû¹<²ãþRiæ9¿äþn#ýßÃô>'¨ÿ)Ãû·»g<ý0ð‹´Y<ǸûÃô´1Aœõ9ÿ¹/.ü¿$yžÚÒjÿȳ›}w÷eño`úçt¿Ü•?=ú¿â›ïWþ*ááÇÒZS%¢¯ 4ûsÅü©—‹ú5îàŠikiùö°½£ÊmZ40¸·Ó*8ÓãéL¦RÓÙ¾~âîôºOhåŠ'—†§•mü]È(üŸæö¾²YòŸÖÉ'¯nO>\É4~µß,:¬\5{®Çì‡kœã,±Ü¸¸‰ãÇÎîþ¦cç_)O¯olEì+é4nx‰¥…±ž¾9£Õ {Oí§²™;G‡.ü×êô£ã“é>Æ{Y>ÑâŘìåË¡|Þqoÿ)4_ó¿ò6’þïáú#ÓÿÆ”áÃýÛѼëå)õã íƒ(½…}&Ï"T°£v “×Ç5z=PDZäú×¶žÊdí¸Hñ"8híÄ.ù÷‚OÍ„ÎçåXÿãâÒÕO´°'ý’n~üØ~ë/q?kçëÏcÇøñÀëCýôwûYÇ’¼Û>¿ëYߢ‹ØH²  ‘+Ä’;Hûó_«ÒŒ{ŽO¤ûídûG‹`ÜávŽŠ:¬Ã.S~ßÝ.ü•ÕeHuO,]šOe!ž$=@céÊ£ÙXþË:Pl[ó×gñc”ðÏi@þÃö½chìUØ«±Wb®Å]Š»xƨ¿áÿÎH¥¾¬¨iãõˆÌ_Œ©\ŒÆÎ/feð;J¤öùŠûÞ¡”>¤ìUØ«±Wb®Å^O¯~Vÿ¦®£ ¯ Åß+±râŽdøUó%·â2Ñ7ídý~ ‰KÕŵy¾ý)Gå¿õX!’ ýb$¸0†Ø3TÑOú¢¸7.dÇfvnhƒ_~ò¯?/€·¡Ç$sF“DÁâ‘C£©ª²°¨ ŽÄeoa Fà¯Å“Ïÿ4uBÒÓOÑt·1ÝjÒ´lÈÜ_‚•^õ™ÆþÔË KÚÍnHBqš–S_ ¶ø’€“:wÔ8¶£?éN?ÞŸWçOäãÊ•ÿ/ÄÄâðþ³ÇðáùsûS/Ë=oPº·¿Ð5w/£ÉésV1Ô¡RNçƒ)=ˆÁ1ÕÍö[]’qž ¦åˆ×Õ|g¹«v*ìUØ«ü϶M½zU­Þ WþFªÁŽNÞwÚ¬\Z)Ÿæ~Úý/¸ÿçõÓ¾H»-É¡²{íõ ‰m;ÑŒ½òõÌPòOùÉíOôOä'ž.«ORÅ-+ÿ1·1ZS¡ë굊CâÊÛCÉv.E ï<§þG2ÁFh5Æò—̽¥ÉŬ—•±™f¡v*ìUo4#,=B9¨©jÓ 2£Vño=µß—õo1úÖ†X<úÙêï°…}HëNàE{.n4µ8ǧ£ßv(†£•$Ü{ùÑüy¦þCW×|Ìž`³³kMOÓâÓÒGLòF¡+¶Æ€oC°*Õz!ÂM’mÁí²0iÎKŠs™Ÿ¸ÿªf­ã]мÛÌ–QE4ÚÏ–ïEÝZI-ÙÉ5 ™ '³†,ØáÖíÃ!aë4>Ñ<ÑâñÚ_gè¢Æ,5ÿ*}e´¿:hpÜ!â÷úr§¦NÛ¸¶?yB~Y“>³ÿ#7¥¯·sxš¹žã_-™..¡ØªÕÌVV³ÞNxÁoË+x$jYÜ1lÅŒÎB#™5óx·Ÿ|ñcæˆ-,ôøfŽÚ Y½`Š]¸ñ^!YºÝp‡Ð» ±'¤”¥2 "…~’\Õ›½#¦ùq¡¹ˆ*,ö¾¤ÎÈ£ˆWà€7M‰ÅÉÑi%|y¬’¡ò²ôÿËÑæ5Ñž?0¬ŠñIéÚ-‘7¤ˆÈ© ®ø ÆöÿåÎ`pÖãzål»D€ÖõÒt‹ÝHõ¶…äP{¸úM.V‹OãeŒ?œ@y¿å¥‰[ ½V]æ»—‚±êV=ÉúYÝšžÑÈG¹û'þ}œ1é§š¾³Â?«Ú~Æsš÷ÓŠ»v*ó=èc¿½úä Þéè)ŠêI'ö…~ŒÚh³ãˆ£±|ÛžÁíFo?½Æ>˜Çœ{ý=o¼_Ãf$­æÔT߈©ÇêÃ×ãO? Íýß=¾Ç…‰íAxÕ˃×^îIå/#_½ä:ޱ·µ„‰í$Ž»­W°­wöÌ]V²5Qܽ²žÄg–hçÔÇ‚6"~©ÊÇAß{žUÕê¨}ãyÒ†—¯LÑ€-ïÖ#±rCø Notyx¡î~{ö㲆“_#§'¬|yý·ðeÿ–ºWմɵI’^7Éÿ}DHÛæÕû†av†K—sÞÀß²ü-4µå4?«Öo䟘6º†‹60=Ä«tŽÉ–!DRh;TŒ¯C1’MlçÿÁC›S£„q@ÎC 4íÃ?Ö„ü¹Óu :Aoí¤¶24EªW«Jüòzü‘‘mÁÿßfê4°Ì3BP³âRóHÕ5NÖ[In#H8³F…€nlhi–èrÆ16kwYÿÈÕju8処+Ò/ø‹(òm­ÅŸ–ì­®âhnÖ炬+3°¨>Ç0õrÈHülöžÇi²`ìÜXòDÆCŠÁØýr,Í>QÕíu[›»+i.¬î$i£xT»!rX«*Õ…|ÙiµP1š!òßj=’ÕâÕO&(K$'# b,‹7D öïîêŸy*ëÍW:Ÿ_ë_PŽ g‘KÕ@øˆ+˜ú¸âôÕÛÓ{ªí\ºšÔøž‰ú¢@½«zy÷±¹ü½®7˜$¸|æxÒ =6ãÃÖ¯*øS2†xpUŽO#ŸÙýqí LaŸŠMðš®;·ªkqI>‹¨Ã —–K[„T³4LÄœÓá50|Ãí½µŠY4y£r–9€;ɉ§œù'CÖ,¼Ãoqyc4*ÊI#ePLd Îm5™¡,d%ö+±5˜;BÉŠQˆÜ‚ÒY?œü¢Úò¥í‰UÔ¡^[e•áIìAè~üÄÒj¼='²öÇÙ#Ú eÅC,EoÊC»Þ:}¾PëkŸ>èþ‚¤„Uc_«úÁkÙ‹~3¥¾!Ë·N»žŒJêûÏz¥©Ò®`º– ‘M©V G&à_|ÍŒ0Äñ>o ©Ööî¯ÓÎ%Ìxt~'‡ñÕ•ùÊ·š)›PÔ@ŽêtG!Š%CDmR@Øf·R'@r{a½–Í 2ÍŸiÈpˆó¡voÌÐf¹€ú#±Wb®ÅX=´ßáŸÍ;+ xZj¥c“²Ÿ¬þèÔûHœÞhgÅÜø_µúOÊö©Ú9@—ÏcþÈ_Åî¹–â»v*ìUØ«±Wb®Å^?ùÓ Ù_ù_„~òt'ü¨&þ6ÅÔvŒŽ9à ç÷nôhäIcIc<£pXwTÆ}v2ŽE~,Š»v*ìU‹þ`é7šÏ•îílÉt†9’ݤµJÜÒ´ÎJ‹£öG=F’Q€³±®úyþ£ëk¹×õY´EÞÁ,ì­îUYÑcŒÚEjÒ¹a4ò:mml³e8«ÑÃ/çzFÖ9ì~tõ*Ú]ØùsL³¾R—PÛÆ’!5*@ÙOÈm•K›ÜöFãÓcŒþ¡œ`v/8üÕµ¼/ êV<÷wQ#Bä“ÁÖ¡A=S,ƒÆ{]Šw‡$‘Œ/ý?ñOæ–£µŽ‚¶ª~ËI£}óºÃ Z?•»[/ч‡ß?Ýo‘<¹æ­;ÌúÖ¿q‹øŸÖ $eŒÍ"¸¿ù-+_ÑzÆ¡gOkÝ:÷ÿ¾d¾ _Jb‡Îßó›:‡Ôÿ!õ zÓô†£¦ÛS}øÍõšmÿ{þ¼R0ù"«ùGFŽ”­¬Rt§÷£Ôÿ³›ÕÉ/{äý³>-VCý#ölŸå±Ø«±V#ç%?™æµ¾´ÔdÓõ 5e…Ô»šõR¬ {ƒôf^›Sá‚°]çdöÀÒ‰BPŒ¹°Û¿2yÛÉGêž`’Ï[Óê4fb<;Ió/f\pâ˼n%ßbìý»Õ„K½Æ¿WȆ{å7iþl´–[$¶{R‰42¢—Ž%Não˜:9Æwêó]«ÙY4’D.E‘æ;ªK|Ã-ä:¥&ž’=ø¶˜[, ´ž©B¨PI šå˜@3Êܽa,Ю!wʺ¾z—ë«7©æûMVä)­dáaã_^)+÷ŒßНA§Ç€ŠÓË÷ ÿs Êt Kò¹î`µmèÝÏ"EÜ7®…‚€G¨Sü™–êø…:}vŸ´„L¼Xжߣô½´ *Š(ذf•óâ[ÅÅ]Š»v*òÿΛ–n“§®æââIBޤÂüÍŸfGÔKØ{!÷™'ÜùŸØÎ¬m–ÎÊÚÑ~ͼQÄ)àŠøfÙåód㜥ÞIù¢1j[$‹o+š"Ì|8²ŒI4[~aù#V¶’Îúáã‚u)$SC(䧨& ߯zØÜ2€Ž Ò‹Òî?.×è×ÓM¸“褧þFQ±hÔãíõø„|kìÙ”E$2 h^>€¡ ]4âAßšüX»`¿š÷æ×Ë"ÕOÅ{¢ Ÿ|½Gí)®Tv*ìUØ«±V#æ:Ÿ.ê1Ù- º•©é•,Ì }–ðÌÝ>“ÄÝ<'´ÞÙžÌÔ C‰qâú¸jÉǹ緷zœ5ÄeŒ}br±CÔ¬q»1ùæÎŽ{Ÿ)Öêõ·®Tê1”Gê’}ïh²´ŠÂÎ ("·E>J)SîsC9OWè’|0ŦðDd\—b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUþf[2Úéú¤GŒ¶Óù£˜æ§è)›Ο¨‡Ì?à›¤¼8³q‘úaï~×¶é7ɪivZ”bî§ÃÔ@Ôú+›gÇ>(ƒÞ˜³v*ìUØ«±Wb®Å^{ùÍgõŸ'}` ìî –½ÀnPþ·ºÞÕâ¾â˜ùFëë¾XÒn «XQ‹F¡íî¹D¹¾‘ØÙ¼M&)D}›'YdìUØ«±Wb¨=P_6ìilRôdú¡!Hõ¸žå·_!ÇÕŒž¼?®¿£Î.4Í«˜dš}f8Ù·¥Þ“µ*h¾ŒAkó#,¸¼fNÏí‰Ä“” kýÌi’þ[jO©ùZ &»’òê)%ŽâYË4ùsâY‹@†½>ìŒÆîïÙQͤÈÈ‚A'óøóeÙ H¼á­Íåï/^j–Êæ0‰aU#„j×%eÕöÖºZ]4²G˜åñ4ó›o1ù÷AŸJÖuùý}TxùFÂ2rA¢Q¸žJ†ù:ãqvŸhi¥.sxòÝÈû¹Ü=*}Ø«±Wb®ÅP÷Ð}fÊæÚ•õ¢’:u¯5+ßçˆjÏŽx!ê¿óïËÿSÉ^oÒùômRÞç£ë6Â:צþmü{fSà’}ƒ‹ÊŸóŸ7†/Êm ÍKsæ vb>ÉH¬nê§ý“)ú1L^% ÅèhzdNÒÝ(:|1(Û9Œ¦ä}ïkeÅšg¾RûÓ ­Åv*ìUæ?™Zœõ¿­èÒK6’±*=•¼ì­ÈYŒU«QÒ§6Z,¸â*\Þ¿Ùív“xr€'Q§§ØÆ<±mùle¾b†î×SR‘ßÈË?õ¡XÊÿÏ@3'9ÍÎ4G“·í¡\XLeèþÛûÉ£éº.Ÿj?AÁ6“Q¹Û+%6º×—ι¨É9Hú¹¼&¯Q›$¿zI#¿§Ã¢c•¸ŽÅ]Š äÒt©fK‰lmÞâ6Y#•¡ŒººU•ˆ¨ ŽLdeÈŽ«( >eqÝŠ»v*ìUثɿ3?Ó|çå­/¨&"G]¦¸ILÜvhô“æö¾Ïz4y²{þÈþ×¥æÅã]Š­tI£GYOB¡¦2 ØyoæN‡å½IŠk-28ïî¥ôã•E¨™‚«'`G|!í=œÖêså"s&1Ó²ÔõË}ÃÊ’jÝJo €\‹)ŠR@ª·ÖQ=%€C_âÞ£ úp´êûF&5mêz×7.›qz ÞKko%Àn¢V‰Kƒô“Ûá$À΂?Çb¬cóØ]y'Yˆþ̯ü‰u—þ5ÅÄ×FñKÜÇ+î=&Ù¡50<ñùÎ?ÊgÍì=”ÉÅ¢ˆî2mþ–ez7b®Å]Š»Y ,ŒŠÜ]”…=Á¥+ôbÆBÅ<ż…çÍELz¯™ˆ‰Å$Ž)gt ö)HÔåœC¹â³ý¡”V]FǸÈýž–]ä­KÐôo«iWbþ)%y&»R¤<¢ˆ@âMãJW##eè;C‹Mƒ‡¸Á$™wž_¡‘ä]Ëóî™u«yVúÊÆ#5ãz- kÕŠLŒiþÄ”MKí–yô“„ËjçÐó›ï/~eëº]ž‘{`‚ÂÄF äöèߺÓZžeÂrÀb7?gv¦§qN†[Ç ®ûdú>—ùžuKKcQˆØG*µÌÐrö€X£å¾D˜»Í“µ|XË.AÂãn_ô0Á…T‚7ôØåo` ·Š»v*ìU˜ÿÎLmõ?Ì(Ô¢¶“"~1=ìm@{žK÷fH|Q‘ÜKíÜ-Žçà· ¾Ròe¡r]FòQôaº©cÛncïÅ”^ojž•¬1qãÂ4^>P)œ¬Žï‹å•ÈŸ5l nÅ]мóÌ7ß™³ëwv~\µX´¸Š,7NŽ@Æ¥)ÍÄOE͆àGw¨ÐaìèጳJæyûÿ£ä“Ü~ZùÇÌRG?™uˆ9/Ù*†W@zŠ*Æ¿@l´kqÃ苟Ú&˜ƒû¿[>ò—–aò¦”tÈg7!¥išV@„³*¯@Oòøæ£?‰+y®Ôí«ËÆEmIîPë]Š»v*ìUØ«±Wb®Å]м›Ì¿é_›zLMÒà¥Oò &Ûé9¼ìñû¿‹Úè=•÷“úÒó5ã]Š»I¼ÍåËO3é§Ý1ƒ ELr@4î(hF.ó{Bz\œqß¡áçßò¬|×*®q­¡Ñ•‡½[† £¡¿ì°ÛÔÿ¢](Òè5RáÅ–$ž†âO¸J‰M²—xìUØ«±Wb®Å]Š»v*¥qs¤/qs"Å{¼Žhª ¦äáŒI4uŒx`g’B1Éä—‰ü½ÿW;où¿×-ü¾Oæ—Sþ‰»?ý^é‚g±ÍM ŠE ަ¡•…Axå$VÎçX䈔M‚,Ô:Y#†7šV j]ÝªŠ’O€k“$a)Y=À%Ÿâ/ÕÎÛþF¯õË¿/“ù¥Ó¢nÏÿW‡ú`˜ÛÜÁw \[H²Á&é"«i±T¢A¢í´úŒy 'ŽBQ<ˆäÿh^¯£úFßÕåǨµåZRž5Ë< ÕÑu¿è‡CÅÃãCŠê¸‡4Ï*wÅ]Š»v*ìUØ«±T«Öt»Û~¾­¼Éÿ„dñ>njáñt¹aüèH|âT#î}O-ßZ“S ë0öY"J~*s¤~{ì‰~ì7§âí]мSÎß—¾SÐL’;ß© ‰ßÕK‘<Þº‚¤¢ xÈR+MéóÂèµz,xëz³çú•eäO'éî²[hÖÂD5G‘=RèA”¶ø¤4x£Ê!âä»v*–y’¬ywW·¦[+¨è Å §¬âá!ä^qù=/?-]DzÇ{%³Er¬œÝ÷±s½,‡tÏÝ¡åo^ìUØ«±Wb¯6ó5ÝÙüÍòý™¹{kUY 5N@×cÏ‚¡d~’ñ}©šʸ!ÄcûîþtÑ. Žæ m¥¯¥24oÅŠ·4e¡Üeoc“œLO")æß”å­ï|Ã¥Á)›M¶=­TžR'!ÛâUvY“£Åû L'Ÿ7¾Ñ•½ºU´¸¿Ó®l­nšÊât(—Qмd÷éàp‡W†YqJ—#êRÊÖÑÀ‚4³×!]–gaœ{T³E¿Ï—Ï'é/2?•ðz@†aßÈýñý+d±üÏó ›{û‹m Éö”[S=@*Îá׈D´ý«ªôÎQü<þóþè3 D¶òö—•hòI\9[“sÉ€=@›z.ÏÐÇKˆc‰$ôÏšìUØ«±VCÿ89"Áù©ù‡`O ÙœD>Í!¿(zm·1LÉŸ í8ðê2éËï/»p¸‹?çá$+È1‚=F¹ÕЧí#¶ƒé¤0¬åv*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»y-Ïï:ŽþŒ{VÀÿÍC7úîƒÚÇnÇ÷Ÿ÷ïĻv*’y¯LÕum!­4[¯©ßú‘ºNd’*;ŽQØ»ËÔâ׋,x£Gjïyf¯eç½öÆÆ]~[‹û÷áooåËÈP[ÕUP*i× Úi3hu”ÆÙ1ˆû¬«ë~byb(.ïõ—kiÜDfIä•bfÞŽ+ÐÔZôSìýY1†=Æõ@_»w¯iâQaj'M8†/VU<•߀äÀíPNøQ^$¨P³²'—b¯&Öü×¾sÕÒ>dMþŒÄ×Ý¿DÿÀñðùFgïýlï4ÒÎÅ]Š»v*ìUØ«üÆÖî,,àÓ­Ç%ç&™ÔÑ„IAÄò‰ü3?A„H™œÁ¶òi°Ã3Âr_øGO讬7ËÞNÔ<à —Pɨޟ©%IgG…zœÏϪŽ3G›çÞÏ{!¨í8‘„«=O ¤–úªêqAs*~Ž5y.¢;€¿²¨CÝ¿VS.Ð Žnïü5CSNCÂæg.”ˆüG_'©EÃB•)„RÌY¨¢‚¤Ô“óÍ96möœXÆ8ˆŽ@Vûý§šü[Š»v*ìUØ«±Wb©åÔÔOù8¹‘¤þð<Ƕñ™›Ü?ÝŠ*3e„œŽÂ¡j~’3oΑ ‘ÓŸÝú^»ùy©ýwB®k5‹˜¦ßįњMv>ß{ïð>í/C៫áøãúGÁߘZŸÔtµF¤×Î"¿¦>'?©~œt8ø§}Éÿ‚i~_BqƒêÊx~åú¾/"de Ì9!=ÅJÔ} æîß”ž¼¾ïÐö¿%Ê/§¨ÿòq³A«þð¿Eûÿ˜}ÇýÑy'ý/¿èóþfæïø>„Èÿù+þýïYÎ?O;v*ìUØ«±Wb®ÅZ Ab*EìXÿä[M~ÔïéIjkÚ¬%^Ÿìs§ù§²‡ œ{ëzö.áØ«Ï¿7ìg¾òÝ´vzsj†í1rI,A£r]D[þÈSQMüi‹­í8c,Û´óOç·ŠÝ4‰Y”õç±t‘¸Ž®\¨©ùaq#¨ÕUpýRò¤úÝÎi?˜£ôu—õMÌ|BqýëðÙvûp;m1™€3æœâÞìU~‹%Ìmº¼R+b¤XÌl^Gù2ÌtI+ð‹„ {˜÷ýYVGiìAýÎAý/Ðôܭ튻v*ìU‰ùßÉ«æ«hd¶”[jÖ„›iÍx°;”b»QPGL”eNƒ·{kb O ãÈþƒøÙ‰I¡~mÞÂt»AVɇ˜Íª'}RñÉÜ^~]ŸÛ#áÊ~žûxLëÊ>V¶ò¦™õ(_Ö¸•½K«‚8ózP7¢Ð\„¥oSØÝ“ .lÉïý‰þEÛ;v*ìUØ«±Wb®Å]Ч?ó…Ž©ùëçèÒgÓï¤T=J RŸøeûó&<ŸíZ¬¿×—û¢û× ¬|Eÿ? gY-1ÉÃkÅW­H:}¤ ¾~ÿþjÔ·ý!ÝÕ\Ôþ[ó¾Ðñ?É™þ¬ÓGþ%ßã?ÍOú–ãÿ¤;¯ú«å°;í ü‘ÙŸêÇý4â]þ3üÔÿ©n?úCºÿª¸þ[ó¾Ð¿É™þ¬ÓGþ%ßã?ÍOú–ãÿ¤;¯ú«å°;í ü‘ÙŸêÇý4â]þ3üÔÿ©n?úCºÿª¸þ[ó¾Ð¿É™þ¬ÓGþ%ßã?ÍOú–ãÿ¤;¯ú«å°;í ü‘ÙŸêÇý4â]þ3üÔÿ©n?úCºÿª¸þ[ó¾Ð¿É™þ¬ÓGþ%ßâÿÍi~òìhÇ£}VàS¿W–˜þ_ó¾Ð¿É]˜7ñúhÿÄ»üIù¹ÿVHÿäAÿª¸ø:ç/òeªŸŸìwø“ósþ¬‘ÿȃÿUqðtÿÎ_äþÊÿU??Øïñ'æçýY#ÿ‘þªãàéÿœ¿Éý•þª~±ßâOÍÏú²Gÿ"ýUÇÁÓÿ9“û+ýTüÿc¿ÄŸ›ŸõdþDú«ƒ§þrÿ'öWú©ùþlj?7?êÉüˆ?õWOüåþOì¯õSóýŽÿ~nÕ’?ùê®>ŸùËüŸÙ_ê§çûþ$üÜÿ«$ò ÿÕ\|?ó—ù?²¿ÕOÏö;üIù¹ÿVHÿäAÿª¸ø:ç/òeªŸŸìI¼·s«Þ~g vmª¼oõˆUx…¥ TÚ§ª€zæÇ b y9½¥;7‡¸^ÇüïÖö±à]Š»yçæƒ­K¨iþfБ§¹° ¯ n¾›™Õ?krC¿L!꽟×açƒ)¡>¾ñD_O&9ªj>sóè·ÑŽ–m`IÌâ)Q€W“¼ü=~x»}6ŸGÙ÷—Äâ5¶àŸ€{×ì­–ÊÎÞͲÛÅJÇ©¨P ›'Ì»É?5|Zм—Nÿɬ«7ë0õÿÝü_¥à=ýô?áRûÃ<Í+ôS±Wb®Å]Š»v*¿0|½wªÛÛßX!–{Nk$**ÍPÕGréï™úâƒÕó¿oýŸË¬Ç ØG±ÝÄs1=Þîï6 ¡y§Uòáx-½»7)-¦S@Ý Pƒ¶l3i£“sÍó^Âö£UÙwQ‰;Æ]ÿx?Šgº/晩J–·±›‡¢«3„±Úœ¶"¾âžù®Í¡”EÃéý‹ÿ6ªCXœR>w÷í_^m~aÛß.›§cq,-jÜgX¤d9 !Of§ßކC‹„Žhÿ‚Ÿ8ÓÇQ†r†j\$LºíÜ~ô'对=â]é—“4ÓFDð´Œ]Š+бè >üž¿ øvÜó ˜2ÈÊCÕ6k‘÷ù¡ÿ25»‹{‹M6Êw…ÕZyÌNÈO#Å*G9.ÏÂ2!Æÿ‚7mdÇ“ S1 qK„‘Ïhò÷±VÚ=BÏòúîþ{™íÐYÒF•ˤfET I¨¨ßéÁ#œ6 ºhj0{?“4ç.<• LÅ(ô±¿Å‡ézÇ™%•ì´û›‰î®×ÓÔwp+È•ä~·Úì3;&,`YƒÀögkö”äqaœå<‚¹’{ö³·¿ S¾‡Ìz Ò5ëÜZܿƒz¤ò§Z:1÷à ڈj×aíÎÊS)shžs´ }èÝÆÒ2…‘%&NL@‚±a¹ý¬´fÄvÙÔ˱{g eáÈ ˆÜKÕg•Ñâg:Ì¥¿‘nãÖ'â428PŠHûD6k±œÃ„P}+¶0ê±öHêgÇ’…Ÿó£·™ý~Ö äëÕ/ol¬öSªW³òB‡è`luSáù¾i솀jóeÂÀ÷Ükäiù}¨?_ú”¤¬wªae;RTø’£Çb¿NW®ÇÅ îvð?í¦×øRØe?ç Çéÿ05Ô|À,`«¥š¬(£zÊæ­O}Âýèaà =Síþ¼êµã 7Àˆþ±ÜþðAyËOM.úËOO÷E”*Äw~NXý,IË4“ã‰=å×ûa Lø°àÅñ¹Yø›/JòWü¢úwúÿ'5:¿ï ìÆÆfqÿt^IÿKïú<ÿ™¹»þƒáò?þJÿ¿{ÖsÓÎÅ]Š»v*ìUØ«±Wb¬sò;ýèó/‡;=þ™ó¦'æ¾Îþó'¿õ½ƒ ¶v*‘ù·ÌÖÞSÑeÕ®PÊÁ–+xâd•êUk½'Øbãêu8‹ËÿåfþbZšå d*Aú¼ÑÇÁŽÄJX‘ZìÄpº¯ÏçˆÇÓîz懫ÚëúM¦±e_«Ý§5ª°%YOº°*p;Œ9FH‰©†-®ÅVº,ˆÈâªÀ«v8 ‡ÍžHóF· Ay•¥¶¥Î!T‘½6ýØ=}ü22ˆ.»°{[>–2ñø€‘ß·É•ÿÊÈó‡ýKÈ«Ÿù§!À;Ýÿú'ÖÿÊ9ùKõ;þVžå·ò´…FÌ~­tûÿ±ï_ôGÚútçý,˿ǟ˜Ÿõ+IÿHw˜ðŽõÿD¥ÿ(çý$Ýþ<üÄÿ©ZOúC¼Ç„w¯ú í/ùG?é&ïñçæ'ýJÒÒæ<#½ÑiÊ9ÿI7?1?êV“þï1áëþˆ;KþQÏúI»üyù‰ÿR´Ÿô‡yï_ôAÚ_òŽÒMßãÏÌOú•¤ÿ¤;ÌxGzÿ¢Òÿ”sþ’nÿ~bÔ­'ý!ÞcÂ;×ýv—ü£Ÿô“wøóóþ¥i?éó޿胴¿åÿ¤›¿ÇŸ˜Ÿõ+IÿHw˜ðŽõÿD¥ÿ(çý$Ýþ<üÄÿ©ZOúC¼Ç„w¯ú í/ùG?é&ïñçæ'ýJÒÒæ<#½ÑiÊ9ÿI7?3ŸâËJ¨z´ºåôÖAú±ázÿ.v©åƒýŒÿâþ1üÑÿ©r?úDºÿª¸ðǽ–»[ý@¥ŸüS¿Æ?š?õ.GÿH—_õW÷¯ò×k¨ô³ÿŠwøÇóGþ¥ÈÿéëþªãÃõþZíoõþ–ñOXÿœ ¸½ºüøóEΣ‚þ]P{ˆB• !ÔìK/$Š–…í “žiË á‘&Çq~„ápŸÿÏÁãU±ü½½ßÁq«¬gµmÔ|Ð`!5`†œ«âŽÅ]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯%›÷_-ß×AíJX͹¿Ñt?^ÔoØþãþÿö½32ž5Ø«±V!ç=sÍZDÖ±ù{NúôS£™œ[Í;FêE7Œ€*|]÷cè´¹„Žið‘ËÔüØÉó?期èü èÂÑÇâÍL.ãù7²Æþ'û!úú_órR,xµô"ù—4Å)Ù#œïâCÕp«1†ãÁ¢o…›î<†nr—ÝCáÝ™ž}‘Úcüœ¸eýS±?/Pø*]ó_›™#$Çuqé£ øÁ܇É–þë¸6ꌻcµˆ,“¡åµÿ¥ôŸ8FùNú(׌qÇ¢ŽVEf«Ho(}Úüq‡eeŒEþš,#òÍTëó’*VÒB¾ÇÕŒ~£›Ñú½óøÄ|ü±ËýÔ¯Í>£§šn%pÍ3³~¢ôðO¸Â¤~åž@Y_Ë:²Aýó<¢?õÌǺ¼Hßãv¯`c9vn Cê&UïàÄ<£-´dÓä¼ B$"­Ð9FOÉÈÌíP'§‚öK.,}¥†Y~ž.½ôDÙSÛ™•\…¤ÐTšôœçߤ% 7&’/:ÿÊ/¨ÿ¨Ÿòqs#IýàyŸlÿã37¸º òÛþRÿ˜iâI›.Ðþïâù‡ü?ã@ÿR_|P¾m´“CóL³Ûü/mØmBÇ‘§ÉÁÉéeÇŽ¹Áö³K-jJpÚÈɉ¿÷@¯òu¬ºßšRêçãôÝïnŃTуW. t=ÍžÈie¯íA’{ð“’^ûÛý‘ ÿ™?ò¯üÃEÿ|gÿwñr¿àÿú‘ûäÏ|•ÿ(¾þ£ÿÉÆÍn¯ûÂú±Ÿñ™‡ÜÝ’tתz}oþfæïø>„Èÿù)þýî¿X·ÿ~§üÎw„¿Lþcó‡ÍrI•àêÔëăú°Ê#.Dø³v*ìUØ«±Wb®ÅXçä`,ÞbœÝÈöœ|võÏñÓŽOÍ]™.)d#‘?­ì»wb¯=üâÑï5O+$öQ™M„ëq®•X¡ Xÿ’8Œ.^ÒŒ±p¹äô_Ë­"ïEò~e|†;²$šH˜Q“Ö‘œ) QãÙèqbóe8¹nÅTo6´¸ÿŒoÿ8±—"òÉøæjŸñž?ø†U‘ÙûýÖOë¹éÙ[Û»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Цÿó…ñ ¿?<÷xM-3P€(èCê–ÛÿÉ1™äølÊõY¯/¼¾÷É:·Æ¿óðkuo,ù&ï‘åýüA{,±?G YEçй’ä;Ub¸®r¤nø¬ÅàbìUØ«óž¥æ=&ÎÚ÷˶Ÿ^t”‹»oI¥&"§p†ØŽÙ“¦„$H‘§oÙ}>i˜æ—Û­þæ;¤~ph·$C­[K§\ÅÜZ A¡­qòâs#'gH}&ݦ«ÙLÑß„ÇÈþ¯µéÚ¶™«Eëé—q]ÅÜÄáŠ×³¸>Ç0gŽQæ)ç3éra58˜Ÿ4fAÇv*ìUØ«±Wb®Å]Š»v*ò]sýóƒO—§­{Žü¡x¿†ot÷Ok¤õvLÇq?x/LÌÇv*ìUŠùÏ\óŒ¶CËÚw×Ús/¯û™g)À/ˆ"µ=|1w}¢Óçâñ§ÁU[|ûؘ׿6.éèé¦ ÿ˲§¿û¸œ.ïò=•s¿ó¯îOo!üÁž÷AšÒA°‚ßô²1…@œßnAtöÀëpÏAen\ù ~Ös‹Í»yF®>©ù¯§eºD'ß•±ˆu÷^Ù¬ˆ¾ïÿ=O£¾qù‰~’ÎsBýPìUØ«±Wb®Å]аß<ùwYÖÖ4ù„À7±$%_Œ1Øšm¿Ñ™Ú<ð‡?›çþÛû=¬×ˆË ®1ÿ'ËçÈž›Õtæ^~4/4Ú“v7¨í£¡í¹JŒÙxØÎö+‡Ú˜I€Å”_óD«ìÙ9Ð?/õ;ˈæÕ£6–*C:1¬€~ÈQÒ½ÉÊ3ë¢Grô]ƒì§>A-HðñŽ`ýRò®žóòzº"ÆŠˆ¢€ª£`Øšb_p„@P3üÍÓ»]V:r¦)‡rÑ…½þO£6Ý’ÁsãŸðKìÁ Øõþ1Ã/|y–ß©ùe¥sšëX|1«ÀOó5ÏÐ(>œ£“aïøv_òjd>ŸD}çy}”>%™y¦Îæÿ@½´´ŒËq*¨Ž0@$‡SÞƒ Ì 4„f äúµLš\xǤóƒò—µ'XžçQ´h!kg\²±’6á'°9›­Ï Àz¼7°žÏë4zÉO63œd]Ž|Q=‘M<ÿ¤j:½œztwŽVg TP¥~"2XÀ›.ïÛÞÉÔkpãŽq˜È“Ë»ÍSÈ:V¡¤é·0ê0%yù¢’¦«ÁE~{Œܱœ£g°}•¨Ñé§ ðà&v9ráÉ™ÿ/îd¹—PкJKÉfHFV&§4ö$S¶diµÀ —Íç=¦ö$²Ë6’ˆ–æ¨õáé^[WDƒônxY¼mDzi$„D„t*Y¸Š{fO„oaå»k-b0ÈDy#Â=ÖxYõ\ù:}>ûÖ®èªgvÔ€ÌÔ€œÖÂpAÔµ½Ÿ®ËØóÖ²f rëêÉØšæµ ò7—5­+ZkBÑ €Á",„r,¤„Ÿ ÉÖg„á@õyaýÖèõ§&lf1à"ìs±ÜSO?ùz÷XŽÎçM„Íu 4r * ÅAøˆèGã”èsˆX—'síï³Ùµ±Ç“x§A}'~½Ä}ªžAòýÖku>¡£ypáB  Ûì’7$àÖç A·Ø>ÀˡŒy£Ã9š¯èwy'ä<ùsZÕu¥¹Óíx¡pÈ ÌHøˆñËôyáQ=]·ÎëušÑ“3(ðv9Ùï,ÃÊÖw6•¥Üf+ˆ•„‘’ »Õ`êd%2G'½ö_I“O Å á”A±þqyË-åĉ§¹G–FSÎ=ÁbAûY·†¯wƵžÇö”óNC £"yǿޡþ óGý[Ÿþ?ù«%ù¼}î7ú í?õóëf—ú«¤M~Ú•³@²¬B2̧‘RÕû$øæ»4f ·Ð½€ìMVŠyNxq×.—ÜK:Í{énÅ]Š»v*ìU}7Õì®gééE#×ýU'%d]—ÃÁ9ÿ62? €üŒ·ã¡êwTþöíb­?ßQ+uÿg3ó§dGÐO›Õ0;wb©/™¼Ó¤ùNÀ_êŽÔvá€ÒÊÝHPH¤šbѨÔGnO>Ñ2/§ÕRI´8ô»§oƒQ6Öç‹7w‘uùïůÀeôðžúZVVPÊC+A ƒÜbîÅ.ÅRí~Q…ªNiH­.\ÔÐ|11ÜâÕ˜Ô ò/4üœŒ.ÞÊz=ë¨êÃÿŽU“›¼ö*?àÓ?Óýz.Vö.Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb©÷üá ^¿æ÷æýxñ´™=:V¾¶¢µöááß2cÉðÞÕ•êréËýÑ}á…×¾Nÿœýµ/ù]åÛÝ©¿?å~úÆé¶öýÞø²‹Æ´Yº>Ÿ(èöÐ0ÿeœåò ‘÷¾9¬e˜þ‘ûÑÙØ«±T=íõž›l÷—󥵬nYX*¿sØd£#A·åŒ$÷<NÕÐÜk^™£E­Í©]<–O4F_J0Ì9ªÕiß7³Ç´I— Ó3éO<“ÈqGÕF¬íµòûÙÏ?.µ=R^Õ¦HgU%Œ_¢•<Ü W¢×ç˜Z½dgóyÞÜíüyñœXÁ#oQòîNÍkÈ;cÞmó†å+4žíL×SÔ[Z¡œ¯RI袢§ðÌ>žYNܧeöVMdÈŽÀs?ެþV—šâA¨\yp Ðú¼.JŸ ˆ)ôñÌßÈãä%»Ñ¡­)<7¯»Ó÷sz7—õû2i‘êz{Ud¶x¤ixŠæ¿6#ŽT^W]¡ž›!„ùýã½4Êœ7b®Å]Š»y7æú'æ–ïÎÈßVFù%ËrðìùºìÓè#Íí{ × Íë¹ýKÌ÷v*ìU'ó>»—4kQÓÔt¢CiÎG4PO‡s틟ٺ©Ì1¯Ÿ¹ç\üÒ{3æE_÷Õô½88~× ‡÷œiûU­;Ó Öf øÇËœ¹ûù[Ѽ­¯ÇæM MSÓ•«ñP’¦Ì±ê=Ž“í= Òæ8îÇOrs‹¯v*ò¿Ìuú‡›ô[¢0øˆf«¾C,ny>£ÿwƒšù™c/«û‹6Îqû9Ø«±Wb®Å]Š»v*ìUØ«ó‡™çòÚÙ›x’g¸i9,œ¾ÊèTжeétã%ßGö¿Úl–1DHÌËc|…w{Þo­kšŸ›/ Vˆs»¶¶„»úÔ’{æ×â‰|‡¶{oSÛà wåFúþ“ú¹åý(hÚE®Ÿ·©ò˜Žò?ÄûüͶi3äã™/»û?ÙcC¤Ç‡¨¯ëÏÛö&yS¹v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T“Í÷?UòÖ¥%iÊ#üŽ"?øÛ/ÒÆòö·QàönywLJý7§ô§ß”VUòE¤„PÝËq9ÿ‘†!ø Îñ>Ìalë`ìUãÿ›ò髿/-~’˜=¤.úÏ‹ú³Ì¼ÜPPòËJ×a…Òö™/—Qä£ù}ä‹ý ÎßA6sêÍ4bÔY*HèC+ú`qïÛ=¡<2€«òz‡–!k_/ivrL“Ímk2¼ny¤aHV´éÛiÅB#¸&Ø·;c¾|¸ú¯“u¹+NV’Åÿ#‡¥ÿbãk%X¥îbŸ•0|Ÿ”§Ö&žAïGôÿãL¦|Þ¯Ù|: œd~Úý Û ôÎÅ]Š»v*ìUØ«±Wb®ÅXך¼ë¥ùSÑŠé^âöqÊ+hiË…iɉ; ìžÿFd‡ÁµrâÉ#ÞOÞû‡ ŒùÇþs~ÀÞ~EÜ\H°Õ4ë’Ag·Þ¿ñ—¶)š|™7¯å=ü,àOîÐ'ðÎoR+$½ï’ö¼8uYôÚm<Ês±Wb¬Íúÿ‘u[)4]_VôÕ&S2Û¬ h[uøQ€ßc™Ú|Ybx¢²´:ÜSqã½¶º­þ!+°üÁü¼òÕ¿Õt[Iý?Úh`ä>.ó:³}9dô™²‘s3ö¿S.,²æy{€=GÕ Ö´»]VÙY!ºA"#ÓÞ”4$vÌ 0‘£ÌêôÒÁ’XåÎ%qм§ÎMgæv‡&·OÑèd§¤œ¼KWj 8ò¯n»fÓM~¸y½§d‰žÎÊ1}vysþÑtõGHå’E‚®Œ9+) ŽàŒÖƒc›Ì¿)RH¯¼ËQ¼Zr\F!ŠE*ÈÁ¥H=^<‡Ë6=¡Ê=ôõÞÔa„“r£uðý<žŸš×v*ìUØ«±W•þsÂñ&‰©Ç³A,É]ú°G_øÍ¯fKêgìŒ9`zúGéz2¤ðÇ<{¤ª®¿&´y)ÀÄz*bÁØ«óÎ…qæ/OegCy$ð!4ÉZ­NÛ‚iï‹·ìMttÚ)}'cñFiÚ]Úùf Q˜ ¯ª}Vi¡q¬|U¨ïÜïL\}F¦RrÀmÅÄ÷ÚÉÞ[>WÒåÓšqpïq$Í"Ž#â ª(kCÅA8·v¿hþo(pìãâY.©Ø«Ï?7¬}mÒùEZÖã‹™H?ðʸCÕ{'Ÿ‡<¡üá÷~ q¤^ CK³½­LðÆíþ±QÈ}¹Íå‡ ˆ~åì_æt¸²ÿ: ükµvÅ]Š»v*ìUØ«±Wbª7–·kÂêçAÑeEq÷08c"9Œú\Y…dˆþïYm§iöD›;HmÉØ˜bHöÿbd”¹›jÓv~Ÿ÷Xãêĸ"r.c±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»a?™—žŽof æ`HñH–§þ®gö|.d÷Îà•¬àÑÃç’_dGë1zÿ–ôó¥hfšÃŒ–ÖÐÇ ÿ‹ðÕÍÃÀà‡ î ¦-ÎÅXœ4 ^ÜÅqæ×‚+ÓŽ–éà“Ó H¢«­EIÞ˜¸Z¬XI¼•~ö:¿”IÕíÅæ¨Ü¼%‚xgŠ£ý;­…ÆþLÅ1q%åÏÊHü¹æMjU® ¶2lðpfå*üjälH?g¶X;7Ø—'¥bíа?Î ±m䛘kCw=¼Þë̼]iʱ:Uò=¯Ôü¥¤CJr·Y©ÿ‰—þ6Ê%ÍôÁÅáèñèßÏÒÈ2.ÝØ«±Wb®Å]Š»v*ìUØ«Ìüü—Ú&º¾gŽÐÝØËa-ƒ¸6Ò¸p²t4û_¬eÜSÄûCš}Gæx¢`aýS¾ÿoÞ?%¥×˜oü¹ ­£CaåÕ™îoŽÂG‘Ìœ}ªmZîÇ%-­ÕögªÉ€F5rï$Ý~<ËÚ2—ÒŠ»v*¥q(‚ g="Fs_òEqa’|1'¸='þ}óbÉå¯;j„mscoËSo’‹¿÷Ý;}9”øŸebÅã¿ó•:oé_È:ÛVŠÚÚìÔ}RöƒØöC_lR~XÜ ü•§ Õ¢3ÄÞÜfr?áHÎ\+)|ÃÚ8pë'çGì ¿1±Wb¬Í>GòôZN³«Yi‹&®ñÜ\‰¥sê5]™P±ZŠ’\ÎÁª™”bNÏGÙ½³œåÇŽS¨X9{ù°í?]ò^A“N¹‚3­eFŒÛ“3Üž\$ñ ±¯-†ÞÙ—ÛÈH" :ÔøÚƒ2t¦wî㱥¨9<&¸ÅwÁŽXþnÃ%Ô+ªéXi×-HoK—Z¹QAÏiï™2ìó[J˵Íì©>A9qüö½"8âBí*™[œŒ m@9:š+šâ^RR'ŸEø»v*ìUØ«üÚ²ú×”%œ ›9áŸÜL'þNfwgʲ{ÞÙ|ܰ?œý?¡äËϯyWIžµ"Ý"'ÄÃû£ø®nÜ.ØÅáê²;ùïúSÜ]c±U“4‹ ó•UŠ!Ø3°úN, "ù¬¯@ÔŸžç±´º{­7\·]AQØ1ŠYÕ6ûŠøbé5ú~=œ¢#,Rà÷€kïûmè¸MتMæ½4êþ]Ôlr–HY¢2GûÄK(ÅØv^§ÁÔB}ßÜv,'òâÿë:Y±¬–R²þDŸŸ¼¶iõð©ß{ö‡üµþ.„â<ñH„½Cíâù3Á{÷b®Å]Š»v*ìUJæâH$¹¸N”¼ŽjB¨Ü°Æ$š :D0ã–IšŒE“ä’ÿ|¯ÿWÿ€“þiËÿ)“¹ç¿ÑŸf«”¿S¿Æ¾Wÿ«ŠÀIÿ4ãùLËþŒû3ýX|¥ú‘ún¹¥jí"é·+;D*°â´û@xey0ÊP§eÙ½·¥Ö™ áçϯ¼Ã+v®Å]Š»v*ìUkºF$Œ4˜ÐI$ⱜÄA”¹)6›æÍV¼66W<®J+# .ç`+—äÓNÈÙçû7Ú½³1ÅŠw.–â®ëþÔï(z'b®Å]Š»v*ìUØ«±Wb®Å]Š»v*ÀõHĘº>†(-Z6zŠô‰~ôP3sÙð¨_{â~Þjÿ1ÚPÂ9cýçÔ~Ê{Îg:×b®$S°N*ðï.ùJ?yŸÌwÞc¹—•¥Ç¦±BêògU܆øP§_è0i†|“3<Н”ì®|Ÿù¥'•ôË—¸ÒæSõ…r+Ãêæt.ƒ’š Ó¿¾,´Ð8µ6?e½³½v*ìU俞M%¾‹£ÅñIs<“p(4ûýC‹¨íReÃÌ–{in¶–°Z§Ø‚4‰~H¡GêÌgÖð〈èù+bØìUØ«±Wb®Å]Š»v*ìUç—_˜7Vw~g’D„Ùi&;kXÒY.™™7vRC3t wË89<~_hçŽz‚@áÇQˆêe¸øŽdùo#ù³]Õ59ôO0[$7)l—°2/é1@($nHî;à”GFÞÁí}Fl§x€xx‡M¶ýcô³ÜƒÕ»v*ìU)ó4ÿUòæ­84d³¸*Êô˜/O|1æàv®N 6IwF_sè_ùÁ 7ê“W׬£–£®ÞL­µJGmm‘ºøæKá²}?ŠŸæŽuÿË_8hмäÔ4]NÞ 'Ô’ÒEB®á¨F*›ß“W^¯–î­‰ø­îÞƒÁdüCf“´cëÉóÿkqÖ¢2ïÜKÑs^ò®Å]Ф:çœü»åÙ…¶«vbºd,+ŽÌ¬HR;§/ŦœÅ³³ÑöF£R8±ÆÇ+°ó›ß6þY5ã]ÛyuîîÉ,O¤‘ÄÄnINd{š¦l#§ÏTeAêpö_hðpË7÷’~uúYç’¼Ùþ,´¹¹[c´‹C‘uqÆ»7Àé˜:?†@»y¾Øì¿ÊN1ãâ2øÜ²ŒÆtîÅX7æ®{«yi^Æ6šK)ÖâHTZ0ŒŒ@’9Wå\ÍÐdžý^‹Ù\0ê*F„…_žÌ;ÌÞxµó®‘kåÝJ›ô”ÒÄBB±¤\ '¤-f`ÒœR2‘ÙßvwcKE–Y²d ¿ðw{o%žŸii+s–b‰ßù™);ø‘š‰›$¼.£ žIHr$”NE¥Ø«±Wb®ÅR¿2iÿ¥4 KO¯=¼«ÿ‹8’ŸðÀe¸'Ã0|ÜÎÏÏág„û¤>]X/å%÷¯åû‹&5{;† ðŽU ?áƒgH]ÿµx8uÎhü bòîÅ]мÃUü¾ó&¥­ê’Û_Çe¤_HÑY“ÕZ9E Ô5ÝO\6öZ^ÞÓâÃŒJS€ù|Nãà­“¡~W¤:­ç¯¨^Ý7Õ–áQR8øšŠX‘P:üGnصÏWŸµ‰Ç„c½u?ƒ5ÒüãkS\A¥Ý-ËÚð3 Äs­(Hôíçµ]Ÿ›$xx¹&˜¸NÅ^?¥'ø_Ï÷ú3wŽÑhß½ŠŸ J|ó]ŠÜý+ÿ~Ýýô##¶XðŸëÇ—ÏôÏBÍ+ôS±Wb®Å]Š»v*”ùŸþQíOþa¥ÿˆœ»Oýä}îÚoøÏÏýI}ÏÑt™µ½B=:ÝÖ9dCÉ^#‚–==³{›(„l¿=ö7dÏ_¨ DL¯sËa}Gü« _þ[-¿ä§üÓ˜Ê1î/kÿ&ËWþ©ö_ñ,ŸÉÞU¼òä—ou4R‹…Œ/¥Ën‰¯ _£$OÄ_É"üÅó%ÿ–ô‹iôÇ y=ÂÆ *¸ôÂ36Ìzd -Õ{KÚy4˜c,f¤e_ ?±•ÚúÿV‡ë$ž ëøŽT<ƒ¿ÅÅÂ8¹Öþõl[мw[—òÂóÌ’êWw&OT¨¡Œµ´®Mx–¡#âã×¶Z8©ó­tû+&¨ä”¥w¸ÒOÊýõÍ—ùFßC½Öõ2éZ›j2]zqñdt6è@<>0¤Š¨ã¶ÀS#+ªzÇǧɟ.£Oʇ"8Gvþí»€fy¤v*ìUØ«üȹú·“u#Z4¢(—ßœªü-rPæè}§ËÁ¢ÉçCæCìÿùÄÍ$éPÖ“]Çy{!ñ7³IêÝe3!ñÂö¬PÓ*º²:†F2‘PAØ‚*ü®ü»².y»Î>Q–¢M6òK~,(ÀÙ\Knõë¿LÕvœv‰xÿl1zqÏÞ>ïÔô¬Ô¼+±Wb©V£å­W»KÝNÂ+«¨ÐD(-D X VIí–Ã<â(stý£Ÿ La3MìóÌg‘|Ñæ+mnÉ iæ-i%¼*¬Åq¢²•"žæË.f„LK×ët95úl2Å+¡½ž»_Änš~YI6¡¯y‡Z´ít+·¬10¢™K–j…'•:W*ÖF'r/hâ1àÊG‹$Fþêü|žŸš×v*†Ô.šÆÂêõ"3µ´RL!SBþš–â æ”ÉB6@nÁ‹ÄœcuÄ@¿{Ë¿Çq½\ùwÊ‚Ý{ƒo,¬Ã®Î¢0Oß›?ÊãJoaü¤…G6{ò°?[3ò»wæ/G{,s_,’Ç9Œ¡ ÉU”Bøæ¯„èrt=·¢ŽŸ9Œ¡LŸ1;±Wb®Å]Š»xÿ“‡ø{óZòó|0Ü Ò¼­ßñŽt¸gÅ^ß¶?Â4óu_ÜÙ©eìUØ« üÉó© i6í¥·£-̦7¸â¢…-E¨ ãˆzgtµO‰¸ˆºb?—>fÔ4éõWQ7Wë š P^âG4åÑ NAÃnû´:ly•ìWmçí <瘋Œ«a[P/8ódó/˜õY1  @è3i¥Ã‘ûWšc´s#õw¢/´5êÖÏæ ÈšXÝLÓŽb.µXɨP: Œ3bà^·°»WYŒërÄÈÅÏ~(ôû¢7òû\»¶ÕâÒ¤•žÆè2¬lIXÝT¸e¯JÒ†™^»1âê°·›®:s"qä±GøHîå_&Cçÿ3Üék•§¹Šêtõ&™M#&€)ìI~Ù¡Ó‰z'ªö÷ÚlšA>Ã9‹”‡1B»‰ß~ƒÞÂ4¿-yƒ[F¿³‰™*H¸’@œÜuâXÔš÷͆MD!±|ß²ý›í x9±D‘Q5gÈÏ¿íQÖ/5Ô’=?WyVæÌ^dóâÛŠ°?ð8qFãÈ´v¾¯\%:“!,[oÎŽüúùµéz±òrÄ¿Õ.O"wÿvwÍVaûÿˆ}‡±$Oa{øy?ß0O"Í3ù¦ÁZFe>½AbG÷›`üu|ËØ|Ó=©„¯û\‘˜SJžcuIWÑ‹`ć!¡Ãrÿàƒ–qí#Ó4z'š¼ÇcðFšÒÖ+eyÕbPŸ±öÜ÷93›3]\<}‹Ú½©‚9¨ÊˆŒlÖÑéùnz›Yåj÷HÖm­ÄŒ-'•a¸·bxümÇ—Щ5êÂ'zµû%ÛY´ZÈBÏä#(ôÜÕ×xùôz?›üÆ|½§«À_\’–áº-YÈïJ¼Nj´¸»íw´_ɺpa¾Ií.ù|6øÀt¿.ëþqY5+›¿Ý*²Ü37&îFÀ xfË&xaô€ùf{=¯í°sÏ&×W2MŸèŽáðÈx®õ¿#ëÙÞª„4&£nàÆ•#g…¸˜µZÞÀÖxdì9Æý‰ëú0~!ìv×]ÛÃu å è²F|UÇ!øÑÊ$/ÐmDscŽH}2CÜwUÀÜìUØ«±Wb®ÅXwæ&­õ=!tèúEûp u!¾óEûó;A‹ŠwÜððCíoH0Äú²šÿ4sùì>oLò6ƒþòÅŽœëÆè§­wãëËñ0?êì¿Fn_7ÒaðñÕ‘bä»cqòÕ—œ¬—D—PkYàu¹ G5âȦHͮ曌\MV˜pÝ<³TÓ<ÿùdmä±Õ}}*yE¼nQzŒ Txf¨R@;©úpºœ˜óiª¥·ã£Ùü½>«u¢XÜëq¬:¬±+ÜÄŠÈ›p ±$)ÈW®y€ÈÀsLñmv*Ó2ª–bTI4çäËŽ,ú¥gñÜçËGÙ¸äÊr}ÿ¹ýlɶ^lµ¿¼o2êðß3F£êqËÍàzÔ@ª«Q^™©–2§UÚù´³„| f;ó#ŸÆÍ³<ÃtÅ^g}æ/Ìûû»«-E[X¢’H’éã¡`¬T:½Ã*µvS›(aÁ ¥o]‡AÙ¸ãdÉÄH¯ôGµ:ü¼ò®¡å›¶ÕeW¾¾•e’4nJœAêÝØ’kL§Yœd"¹_ÛݧU8øcÓ_&e˜n…Ø«±Wb®Å]м“ó!@󆋿˜IÅg+ÜÀÔzÿ­ñú3sÙÓ¸˜÷=·³çóL¸>Ÿ_"˜¬®¡Ð†V©=l4ŠÙ¼PìU/Ö´í?R°’-JÓë°Eûõ·iž0H ºîzuÅÊÑê2bÈ %ÂN×ïy«yûÌÚÝ4ï'i_W‚0#GTõ]l*H §ˆúp½xì-6^§%“ð¿÷Å:Ñü›®_éš…ŸœoZd¿h¥EIŒ“A$DïÈ‚‚µ§Q×jûc<–š5Ác•Ûñf:6“k¡i–úU—#mn)òrY‹±$¹$âè5š©j2’æQø¸ÈMSNƒVÓ®tÛŸînchØõ+Q³pw¹]D°äŒãÎ&Þ[ä[Éô­FûÊzÃ<2;@B˳…¯b(Ëôæ·´0ò~´ÿ´É§'iŽ8¾éøIŸæ­ö7b®Å]Š»v*”ùŸþQíOþa¥ÿˆœ»Oýä}îÚoøÏÏýI}Ï(òjØ>¿êB´ã/1pÇ^•ç·^™¹Õñpo‡{×Àg0©_pý&¾­žõ%¾´¿ølÔqfþ—Úû7åûùº–4~œÚ,|­ô“jµýãÅjbè9èÊòqó•ü]§gKE†›ÃHÇÃîºÞñï7ÊK©Æcú†o4¿Ý‡À=­ÿ,ÿÖ{8iü@}Sµ8f‡ø¾/ÐÔ?/]8CÆ<£ÿ).›ÿ‡ê9¾Õv_ž}’ÿ,ÖL¿1b‘<ÈîÿbXbhÿÕ‰üAÊ´÷nßþx¥Ò$ò”bG»—Þ Ð|Ÿey Y%«¯;x’)ârIQ‰åQšÍT fo«êžÈk°çÐbȸDFC¨#c~þl óþÊóY‰-d{x½9äBäXž5Í–‚0ß«æðD×aϬˆÆDŒ#R#¾É¯‡é¦_¡ÿÊ¿óuÿ337÷ÿ÷݇ÿ#þ“ýóò'ü¥zü÷ÿ¨y3e­þèþ:¾aì/üjáÿ?þ™Éù‰ÿ),Ÿñ†/ÔrîÜ¿ø!ÿÆ‘þ¬^“åp—tÀÕâ;{­sU©þò^÷×ý˜Ùø?©¹äy–P:}y¿äþo#ýßÃô> Ÿþ4¥ÿ?îÙoæ”RúÚlÛ˜J̃À0*ú³ ³NÄ=×ü1K¿†¤>;}ÿ¡%Ð<³®kV&çLÔ"ŠvF…¦™®êˆFõ®_ŸQJ¤w°=š×k°qàÍÄá2˜ û„HÝ/5¹®¾¯6£g%ïþ›Ï+IéÔ€hc­+è`sr{­É—‚Y±Õќ̫¿èºzN‡e>›¤ÚX\²¼öñˆÝ’¦ž€ Õf˜”‰__ìMôºLxfA”#F¹}´˜enÑØ«±Wb®ÅZ$I4rN*MnXG•¬ÛÏ~~mN@[EÑÊÈ•û-é±ôWý“‚çØS: 6.Õù÷¶;DöŸhK'ù8mpåó>§ºåíŽÅXÍžtMGÌóùZÑ™î G->Þ“KâNäROMŽ.,5–CÍŽyËò¾ï_Õ¥ó—«µ¾¦á8E0!‚…$ŠŒ¢ƒù[ ‹ªìó’\q•0þBüË×n­4¯2]´º,k‰.RPF*+ê3R¡yø¸§G¨™™ÛÞ÷ ùØ«±V-ù‹¬ Éú•·îêoC΀‘î“}¸šì¼‰ø1ßÊí/ôw•!Å&¿w¹o'àAÿµúr™Þ»ÙM'…¤ó™âýì Ó ô®Å]Š»v*óŸÌGQ¼Ô4Ï&i’ú/©Ñîž´¬lå?gábý2ȯí>§&L˜ô˜Íœý×Cá±µ;ÉÍØíon¤ášB†&zw@µû5G¾>#žÅaðê3—yª¿urø¤ß—çSÖ|Ý êìd—Ëö’[†mÏ í†=ÈÛÿ“†{YìÖ—s‚&?i¤üžÇ•>ŽìUŽùÏÌÿá]#ëÉžîi±5x™«Sz;uÉF6éûoµ%‡Œ ‘4›ºówœô•‚9h°Í¢]:ƒF•Zî(90 EW'Â:<¾nØ×`£«Ä9áúÎþRz¥©·6е UµdV„ ¡ªÐ PS*{Ì\<#‡•mîVűث±Wb¯=ónœ|×ù‹ä%¨-úJöÖÝÔ-õÜväŸS¿l·ç>Üg¼˜áÜ ùšýÕ µàÝŠ»|ÿ9«¥ÿ‡¿9¼•çDNú•œpNãnrX])¯¥š¬K\ú\SƒùåMûfÇÊ YâßÜõÙ¸òéñÌGŠ^ þ­ïcº©ùßPÒ5/.j–ÒÏ-¾¿õ¨õʱˆä‘–èOÃÏÇcØæF¨‰F@ÿ S¶í¬˜ócÍŽ@‹„Ç¿p?]=·4Ïž»v*ìUØ«±Vù™£þ—òÓFµ¸°"ò/FÀ9—¢ÉÃyìï}Õø:¨ß)ú~|¾ÕËÝ_ô¿•í ·+‹:ÚMãX€à~”+›â½¿¤ðu2®Rõ?¶ÙN.•Ø«±Vç¿1ËåM2Ú×G…#½½gK~(8Æ©NL¨ U€¡ì>ÎÌ’–RLcÏÏãðb—ù—å{t×õ £qh¬¿Xµ’_T(s@hšUØ]Þ1Ùº¹0„ ù~רé:”:Æ›k©ÛŠEsÈîTžª}Á¨Àñz½<°ä–9s‰Fâã»y—æn‹=ͯœ4ÁÆâÝ‘nÈÔÒ9·ì7Ñ‚Q^÷خ۞Ÿ(ˆ5(ž({úÇ› ѵH5: BßìÊ¿V¥lÊ~G9ì¸Ì$A~Ïì~Ô†»O Ðþ!¸î=GÁ•»7b®Å]Š»KõËY¯t{ë;qÊyá’8ÔfZ ÎY†B3÷º¾ÛÒÏ>.8 ”¢@÷ò¿ùWþhÿ–Tÿ‘Ñÿ\Ü~{{â_è´ÿÔÇúhþ·Ê¿óGü²§üŽúãùì}ëþ€{OýL¦ëd¾Gò¾³¢jÓ]j0¬p½»Ä¬$GøŒˆÀQIì§1uš˜N Õì=‰öcY ÕË&h¨ø¢z{ŠYæ%ùƒPÖ¯ommÕ­æ´leI‰®[ƒWÀ]?´Æv†§[—.8JǪ?­é~›}SÒ§Çéñ§¿f¦÷}‡Ã>^ûiåï%ùƒOÖ¬¯n­Õmá4Œ%ˆ=®m³êá( ãÞÏûÚmn,¹ c+>¨þ¶gæŸ,[ùŽÙ1 ì5ô'¥FýU½á˜:mAÆ|ŸAö£Ùœ}§ˆoÃ’?L¿Aòû¾ÃÏòÿÍËé¤(Èj É2§û"Ÿìsgùìds|¦^ÀöœgB ç ûhý‰g˜47Ð.¡²–ešá Yfá^(ìì8‚w;–àÍâ|Ý7oö!ìì±Å) HÀJUÈe·È§yzÚY|‘ ²-fšÖeI¥Lœøî|kšœò5ù¾ÍìþžsìHãÕ,süî*ûØß•<Ÿ¯izý¥ýì –Ñz¼ØJŒG(Àש•©ÕBp Þ?Ù_d5ÚM~<Ù`#Å~¨žpè{Ê·œ|§­ëÓÞØ@²[˜ãPÆDSUìÄŽ“SB‰r=°öS[­Öœ¸b xb> 9{Ë5Ðíf²Ñìlîà†8äPA•hwšBS$w¾‹ØšYàÑâÇ1RŒ@>ðu7’|ÂúÜ—«n¿Wk¦˜7«xyV•¯LÚ f> ½éòlÞÅv„µ§(€á9 ¾¨òâ¾þç¢kZ5¦»`ö`…?r/ÚÇF«Ã”㕇Ö;k±ñv†‡'¼±=ãñÉçäß7è³»é4ˆvõm¦^Ü•ŠŸ£|Ú^)WÚùýŽí}BtÄ‘ß pØóÒ‰Ñüæ+A5VåìÝX;L%õ.Xó'èÈeÖc¨‹ûœÎÈö#´rê}DÎ2 ñqqd?iø§ …:ûæ¥ö`Þ*ìUØ«±Wb¬?ÏÚãXØ.“hK_êUÝ–ð‡v?ús;CƒŠ\Gxo»wòÚËÀþó/Ù¿é¹|Þ‰ùåuò¯—¡´”Ò7éÍÿ°|Q~u=órù®‹OáBºžl§- ©µÊi·d+x°JmÀêex~4ņKá5Ξ ùwæÏ-ùNÇT¾Ô¡y¼ÂÌ¢ð%8ý‘!'ÅöÉíN¸^{C©ÇˆHŸ©»…üÉÖtÛŸ>ɨIigï!g’ ÄÜÄ¿þQø¿ÊÅeãÎ'-Ðürzç<Ásæo,ZêW }p†vPvŒÓ˜¥E ÷ÀîtYÎL`žlŸ-Ø«±W~nÝˬëš/“¬š²;¬³ <ÇÓŒŸõW“c‰.§[Ÿ40Ç™?{Ñ-mâ³¶†ÒÆ"‰|*¸f3ëX± q(Šl[Š»v*ìUç?™F« þç  ×`Už0 ˆåÕ¸ÊÕ˜=;e=7Ú}h䆫³Ÿ¸ Í ¥üå·{*Zé’~”e¢£:˜UÎÕ¨ø˜{q|7~ÛDãôã<~ý¯ï?$ïòÓË÷ºNu©êˆSRÕdº8£¬kR¼‡bK1#å‘™·gì¿gO)dÈ*y ü?³ŒƒÔ%>dÓõ-SHšËI¼6²)r ©PŽ€ÈA¥0‚ëûOM—6 Rà‘­÷ïòy–¹åŸÌéí¢µ¼‘5k{yVxY&tt õé¾X%ˆ×öWjÊ"2# ‰±¸»øÑS×µÏ3ù•´Ï.ëºLºm¼×0‹‰R•‹p=J(oü0€ì{C_ªÕœx3b8Á³G~›^Ïc†(íᎇ¢UD_Q@>ì¥ôx@F"#TÅ“±Wb®ÅRÿÈÍ,y·þr«Jf¥——ãžòOcihUµ.$\¾gÈ=©ÔxšÉ÷F£òý¶ýɼã±Wb¯•?ç<ü²u?Êí#Ì‘')´UV§Ø¶¾‰¢s_yRŠbðÿ.j¥t7P&¯qoÈâÎ ?ü09Ìæ‡ Èó|ƒ´0xYçâ~]<©Ãv*ìU+óüú^ƒ¨ê6ËÊâÚÞY"î*š<S–နÀ=îggàsÂå"O£ùùƒËRy²ãV™õ™V{ˆÈ<èð–;nå‰^£§¾m2jø'ÀÏkªí¿Ëêœc‡Ï»£Ð¿.õ›ÍoÊö×7ìd»‰¤·’f¯)=3³zš ñÌ f1 „O1ÛÚH`ÔÊ0Ø5Ýl«1]+±V=æÍËzµ‘¾ó_¹°F—ë ÌŽˆ>&MÈ4é÷fFŸ,âj=]§eëµgÄï=©‚Ú~fÏcl‡IòÌ‹å[2!YðPiS'·èIß¾fËD õKÔ^/³±É#âf,·­¾ë¿Ç'§éz•¦±§Ûêv/ÎÖåÆH¡ˆ#ÄAÍnH’ ÇêtòÃÂ\âŒÈ4;v*ìUت×D‘94n ²ÁPƒ„@l<É…ü§çmOÊ—‹k’~ªOr€Éÿeûí&œp{~ÙW¢† s?¸ü‹Õ2ljv*ìU†~bùn÷\Óí®ôÀ[RÓ]¤Š54gWãÈ-hR>X‡ ö´a§É(äúf(þ>,;TóGœ<×eþHh®%(·Œ±È¬ÜHmù€#šŸ§ ¿Óvf“I?ä°>Çèúž™åÝ>=FÓ´i¦Cp‘•¥@ç!¬’pr'èÀñý¡œê3O(_ÙÈZq‹€ìUFêÖ Ûi¬îIo:4r¡èU…ųYc”M»È4é.<…æi´=Aè{¶ íöhÛG/üjÿÙ˜šÌq±Ì?GÿÀ×Û(ã5&Òþ„ûýÝþTz=4ÑŽÅ]Š»v*ìUØ«±Wb®Å]Š»`_˜“kœmⱂUÓ£"i.a©>ªŸ†¼7P½j{ü³c ÞÎï˜ÿÁ 6º¡QÅQ”œ9rÜó÷û˜Ì˜>e†Dͤ dˆH ?H̳¡ÆO'ŽÁíÿiB&Q—™ˆ¿Ñö„&Ÿ¤k~lÔLîOU¹½Qt;ì6~¬žL°ÅûÏìolê8Íž#êÈyÑîˆûÚ-m¢³¶†ÒH`Eù((3C)Kô>—M£ŽLˆ÷ •°7»v*ìUØ«±Wb®Å]Š»v*ìU ©j6ÚUŒ×÷mÆV§Å@£Ü†O33AÂí.ÐÇ£Á,Ù F#ûó,{òÛ@¹óV½7µ”­­¼Ÿè1Õ¦_³Æ¿³éþWÈçC‹„@ÏòÔä×êe©ËÔì;»€òiɹîÅ]б{Ï˯'_êGU¹Ó®™½Iy9µ«F¬ÔõÛ~ø¸’Ð┸ˆÝ üÏÓ|٪ǧh^ˆ6‘{ð],iÄFb ¯«%h±Ò„:¯}†´1ä•FãäÌ|³¡Ãå½ÏF…¹‹d¤’Rœär]ÛébiíÍÓáà#Ü›bÜìUdóEm —°HbV’G=TT“òBËÅ|вù«Îš·œnTú13-°nÍ áêD(~c!³öSLsêgœò/yýCïz¶Rú3±Wb®Å]Š u@i:Uî¦ËÏêÉ0NœŠ) }'l [­Ôøg“ù –äÿ0ßÚyR÷Íg¼õ­fšImW¬›L¢ïJE:ôé9 è<×bö–Hhç©ÔJâI1ïî¡ñä:%Ú'æ.›u­@u ;½~º‚ª—«7ÉŠ-ENìØL6p´>ÒâžqÇ„CŒí/ÛCâ^§•=Û±Wb¯ó&¿æ«ÛOSÒõ³Ó4ëÕÓ-m¢4i¦¯vôåñ}hó¾Óí^IdÉŽ|0„ü8Ôþ7Ý‘ùGUó«ù‚ëAóA<61†¸¸Pë .% Ô0=Jvß|Œ€­ÇcjõÇS,9øH€Üí{òª®~æ}zÇb®Å]Š­‘Ò$i$ÞCÜÞÎ×s¨?äú1Wæ3$ÁõyÎ\’™þ"O̾äÂã;v*óïÏ?*·(|ãåÈÓÕ¹¹ÓgšÒ *^æÎ—vê¼±(Å!ùóùC©}oÊídÍY,'’0½Är~õOÞ[îÍhB§}ï{U§àÔñ<˜Ûõ3üÀy—b®ÅVMSÅ$ ’U’DaPÊ„àFi”$bAÃ˓͖žI½ºòö…¢Ë>¦ËÏS¼ Í"™H«->ñ^Gz}9³:s” J[žOb{.zèG6\ NcÒ:mø³\­“hþh–o2K¢\AvW°CE¹€ü3À­ϧÄM[¦ÛûÆÉ‚¡Ä9‹¨ÕöhŽœe™DðL‡õteÙˆèÝŠ¥>fÒäÖ´ CK…¸Ís ,DšP|J ð$rÜ8& ›ÙÚ‘ƒ<2@ý)¶óÍΕå‡ò]Æ/镊[%B(¤KÈr)NDü]Úñͤ´¢Sñ¶æö™;9u#Sƒ‚ľ^Šz‘4Ùü¹å+huvòRy„¬a1`¬NÃjWß05S2˜í­@Ôê¤qî6ºÒ{¦êÚn±“i—QÝC†)$ˆòPà"½ÄtÊ'ŽQæ)Öê4¹0'EîÈ8îÅ]Š»v*òßÍ­*kY4ï7Ø76r$S°(Üásòj©ùŒÚvv^q/c쾦3ÓÏ”…¸Ç›6Ñõ85.×S·þîæ0ük^-Ñ”û«TfÕæµši`Ë,rçŽÅÆv*ìU„ù×Ï^_¸IÓlžmNáE+©1щQÁWwjŽ›}8½cv,u19'*„y÷ü{ƒ ºÑüí`bóβޤ–’G+Âó™P°qQÅTÖ…GL/C‹W¢ÉzL[ .¶ýdùý¯Xòö·oæ&ßU·R‹(!âcRާ‹)?>žØ#_¢–›)Ç-ëí ¦.±V7çO+Eæ(”MFÞ²YÊzr¦èÇù[ú]¿cö™Òe¿á?Pý>ðÃü“æ)\·—5zÇ©ZV8}M™–=ŠþÒÓé,ÔëtÔx‡'ë¯`=«Ž§tÙ%rÑ/çG»Þ>ÑîfÙ¯}9Ø«±Wb®Å]Š»v*ìUØ«±Wbª/km#ú lãpÌŠOÞF#ÞÑ-.)1û‚¨ €è07Mâ®Å]Š»v*ìUØ«±Wb®Å]Š»i™QK¹ ª f&€Ô“Š%!g`{*Þþey’-LfC´nwØ(4iO‰?f1ý´Þi4þ³Ì¾íOoKµu#ûœgý1þwèí{¶§ÚiV6úu„b+Kdă°ω=Iîs-Ä„@EbÍØªI®y¿Ë~\‘!Öu¶šAÉbã$²q­*V%b¹¸ùµXñýF‘Ú^¯¦kVÂóJ»ŽîÞ´/Äø0ê±Å³XÌ\M£qlv*ìUØ«Îÿ8<Åú+Ë£I·z_jÌb!~зZû-“Ü…Ööž~pŽrFy+BÿyvÒÉ×Û^ïÇÖ“rú¢‹ôf<—Ðû ³ÿ+¦ŒÔw—¼þ®_C‘vîÅ]Š»v*†¿²ƒQ²¸°¹ÛÝFðÈÇ‹©SCã¾Zu#—¡.R‹Ì­¿)µ/­Ei«úÞ\‚C*[«H“ÔÏÀ„‹rÏâ1{—ŒFyo7[ý܇½WÍ–š÷›t+ZX}/KT™¦Qð}]¸†"›¡8(þl4-³¶4óÔë1i£c£ÑÛìCÍê9[Ü»Ku=wJÒ_®ÝEñB÷"ÝVW'‚’ èFØ@·UÚpÇ U{;˜”Þ^ÒüÛåi¯´}6}Jçô–à°&xÝÔ– ÍÄnÔ+óÉ]žŸfâ×i ð^3’\w/çy󮼓%ùsQÓ÷XÖ¯“PÕuL4Ñ1tF(´bµùSld\ÎÃì̘Lò昜òVã•=¿—d…Ø«±Wb¬sÏzèÏ)êsƒI$ˆÛÇãÊr"Û䜔Fî›Ú Oƒ£É.¤WúmŸVÿÎyTùsò7N¾•8\ùŽòóV´¸´‹è1À®?Ö̇ÅËèLPìUØ«±WåÜ'ü«¯Î¿:y¯¥f—WÁÄÀŽn-v÷·’¹®í\îyk4üx#“ù§ì?¶™æi_ŠWçwùÞþIv‹¢\y.çM󯸋qõ 2Ö ÒˆŒ¡«ÍÅ@V}·ùíLž\£(1Æ<Ë•¬ÖG[áÒÇŸªDíu\‡>ç§éú¾™« ›L»Ší`NV…ƒªµ+JŽÞ­ž9G˜§Ï¥É†¸âc}è܃ŽìU‚y³Ìžn¶Õ΋å­טƎºƒ)‘xIׯJ2‘ñ1Ìí>fßÓé£Zl_çÅŸ‰ ÿ@òÞ“å«gµÒb1¤„4¬îÎÎÀPSO¸ ÀËšY ÉæµÝ¡—U.,†ë’m•8.Å]Š»v*‚Õ´Û}cLºÒº£b:©={ƒB2xæc GG#K¨–‘Éq6óËmFãGÔõ%ꇄðÈïl غm"­z†:ûTçI GW­öOØáªÇÈÿGê?§dž5Ø«±T-âÇ5úÚ‹›Ëhä0*ªú¦¢¥NTì$“ÁÅÃ}Þóîy<’ùÏó*Siõ 6õªÃðšüMö¤aà6à ÜF:>ËOO·þ:>ß{Óü¿¢[y{J‡KµbéKÊßiÝYˆíòÀñÚýlµ9NIuLñpŠ»`?˜L—Q§˜4E)¬Ûqi=šeMÃ-?m{x¼1«Ø½o³]¿-,Ä%*q—óOêûŽêQóTzí¿Õ®ˆV€RXúz€mÍGüHvÍ&«Lq›Ÿ¯ý‘öª£‚d ÑççÒ:{™>b=›±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«ÏüìßyŸRO(ùeL­3úw3)øZŸhr¢/Voó;m–½Ræøÿ¶~ÕLŽL}<§!ü^Cú#©ëîç×¼¡åK/(é)§Úþòáè÷—$|RËMÏ²ŽŠ<=뛘Òé†(Ðø§ø¹.Å]оr¼¾Ó®ï|Îúµ›ên½¼ú–—láȈ3´|”)  ªù>ø^fS‰3â2h2ï,Éwå2hÞGÒþ¯4—H.¼Á:¯9DÅ]Œ\Á *(^;w¯íbæiÉÅ’8£[ï'¯àwNÅ]Š´HPYˆ I;*ñ 'oÌOÌIµW«èzA_@²R6>ÿfõûm‘™ ãö&“óºÎ3ôcßõ|ÎïYÊPv*ìUØ«±Wb®Å]езл`™O‡Y5;N+¬<æ¸Fa“á­Ojdá*y/i»:ˆŒ‘þóa¼¨Výû}É3ù#ÏÚ5»ZhкӥS¢\ÇD}‰T“’¯^ªÕÉqÍÖžÁíY /YØýŸùMt4Ñî®çÔõImõoÑñjÚF¡”YäaÉ£$Õ‹3*C•>¶ñx€¡µÑuùÚ1€0ã8ç9þêÏÉí¾UÔçÖ|»§jw+ÆââeÚ€º’¥€ðb*3Mž3 >}ÚzháÔNä q”¸Å]Š»v*ìUå_ššLÚeítÂ#º†Hã¹÷uÞ'#¾Ãƒ{S6Ý›ø Ùû5ªa=.MÁ¿Oë ÛCÖ-µí.ßTµ?»jÉÝlÈ~G6o5­ÒKO–XåÓíéŽ.#±Wb­¢€t’¡{{i§[Iy}2Ák«Êæ€R{ [0ážYÀY/*Ö¼ã®yÎðè>S†HìÞ¢YGÃ$‰Ð³·DOÄý4ÂöÚ>ÈÁ¡‡¨ Ë» ÷wŸÇ›Ó´KKë*ÖÓR¹w° In#‘:îh6äzõÀñÚܰɖR„xbO/Çà#ñq]мßÎþGœN|Ëå€ÑjQ7«qmÅÈë$`~×ó/í|ú‚y=¿³>ÓÏM8ÆR11>‰ÿ7ÈùaÙ•|Ýo®Æ-.©­ýäGa%:²Wñ^Ù¥ÔéN3c“õ¯²¾×cíN£˜ ÇIyÇôŽžæO˜fìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®ÅZ$S°N*M0-oÌWþb¿_+ùMLòÜÜÆiÈ~ÐVì€}§þvºMz¥ò|‹Ú¿l¥œ.Œìv”Ç^ñ.ùué·>¡äo$Yù;O)UŸV¸Þ]×þ+Jî~'sà6o%£Ò 1óêÊð9ŽÅ\H§`:œUæš_æ¡«ë·z˜1YùL2Cqw'RÉÄúl ø‰&”Tûáuxõ²œÌ¹c uΉä/Í J{­ú[e;…q( z†7¥O@J°÷µKL‰‰¢Ìü¡ä-Éë$–eîu ‡o&§>5¯QV¢§Ç¹Àçi´pÃËsÞÊqrÝŠ»y×æçš¿Bè¡í$¦£ª†F¡ø£¶HÞܾÀú|0ºÎÓÔðC„s—ܯä//Çåÿ/[Äh×w@\Ý:À»¨¢‚6!EÞsFËßû=ÙÃK¦ˆþ)zÇõ2|‹¼v*ìUØ«±Wb®Å]Š»v*ìUãþwHõmcÌsê/Õ´XO·SÅL·A@s±iÁ=ȧ†[öôF|ÙåšÃð9Vÿ3÷/ò¶‹ªèþfÒtÛeþ§=”Zå°cé•&_‰MIÙ¶Ûñdl2ìl¬xá”𘠒<Årøí³×r§ÐŠ»v*ìU*üÐåbÿÎOiœÓÖÒ¼©ÏQž¢¡?FÝöÚòDËà6|ƒÚ_¬r§åÏí·éM犻v*ìUóÿüæ?‘¿Æ’º–¡o=KÊóG¬ÁAñb¬WB¿Ê!vÿ¨1H|¡ù}«þ™ò¥„Ìܧ·_ªÏã΄WܯúsÕãáÈ_,íÝ/ƒª˜è}Cãûm“æ3§v*ìUNx!º†K{˜ÖkyT¤‘:†VS±ˆÂ Ã8LăD<·R°üÂÔêÕî-¼¹å›7’5–"¶°˜Uˆ 8ô#ĪœÙÂxcFŒ¤~/c§Ï Æ# %›,«cê7÷}å1ò‡—¼—%•Ί5Hõ÷žD¹ž* I+êF€ò1är½Fl–%\./jëõ‚qËÀqP |By{¶zqÇ i J(Ô""€UEtf6òò‘‘³Ì®ÀÅ ¨XZê–Sé÷©êZÜ¡ŽT>¸ð#¨9(LÄØnÁžX¦'D1ü¯Ðä³±±¾žâê>Yž"_‰hå ˆ˜Šü#ìÓ¿Jæ_ç¥dŠï´™„å(0>c¯¿ßlÖb·†;xc‚%TŽ4UUИdÞåÐNfD’l•ø;v*ìU¦eU,Ĥ€¹Å [ϼÍù«¦i¬ÖZ OQ'€‘jmÑŽÃuÝϲýù°Á ”·–Áéû7Ùœ¹}Y}ÿeû>?$·Hü¶óžîSWóµÔ¶6òŠÙ€ð=£‹ìÄ=Ørñ®l¢!ŒTCÓÃ. $x0Ä_ë=P^[–ïÈo»òn®ÿè72i9ÙK7÷Ri¼å—bÜÝÑVšÕ~î¿.oSÂð.Å]Š»y–¿å?6y«Ì’[ê7݃ÛÊ¿ÝúmÐ"V¦JlÄôùPa{jétša( ÈyŽ·æ›ÜŠÖµÝ òïN:6ƒ >¬àòe$m$íÜï²þ¡‹FCŸ´²x¹Cñ´_ÞSŸ%ù¾×ÌvEq4k­"Ÿ¬[©!›ŽÜÀ úµ¦¶;&Zl„€|>‡ôk*ÅÒ;v*À|åù~5)ZÐÕu¥>£¢·™†üâþýNû¬ìig¥”c2h}2ãû>ÑÑ(ò÷›ÖýæU6š”GÓõä^ Ì6¤€Ó‹{ô>ÙªÔèˆÞ<»Ÿ¨ý“ÿ‚=LcS $~œŸÃ/qóåîfù®}AØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wbªw–¶ïuy*Ão«Èæ€Sà0ÆFƒ«ÕâÓã92ÈF#™, }G^üÁ¿:–¡h´ÑO¬Ü5Tp¯Ú•‡Ù_ŸÃ7:m†çrø¿´^×fí){†.§¬½ýÃ˯^á×|Ÿä½+Éö^ õ¯¥ëW® I!ðʵ迬æk§Òéc„PçÞÉ1rŠ»b³þaù-5ÑæÕ#õëé»qsc±S0>g•=ñq»¾ü£´Ò>·ªÝêS\ùbÌ=ëXÀ¿¿tKqäX%Bþ߇†]>͹qÒ+ò¿C7¾`¾ó½‡è½ Ñ Ó-A?x©`Nä¿èXíÓ}Ÿ‡Šg 1èõÜ娫±T6¡k¥Ù\j²­-‘¥•ÏeQ]¼Iì1a9ˆ‚O ùîÚÞïó3ÍÚ¥û<6 ?dŠÅ ÃÔ^í·Žei´þ!òyÈÄêr_ŠG"yÏòñÌ–R~‘ÐA,ñÍ­w,•¬gÝM$)r3cÙÿÄG:Ùë}–âÊ"æ#éûM$>sÓ<µåWÑõ(L«¬$êÂ(®s,|jf¥MjæFšsÉÄ'ÉÙvF£Q«!¨Šê*wã•=§4ÏìUØ«±Wb®Å]Š»cfóÞ…å…hî%úΡO†Ê ×·3ÑÏs'–y9rwØ™õ[QþqýìÞ×óóZO€~ŒòÑmÜòH ƒÿ3Â×ùsm‹1y—³ÓhtºcÕ>þ¿³ï÷½[Ê–¾\ò‚¤öñ}sUâÔ..Mz ùoâNL–N¶yyì;™ŽEÃyçæÇ’š4oÒ:|u×4Åg€(ø¦‡«Åîi=öï–c•aÙú¯T~’Çüæ±æ-/ê÷Mþ嬀Kšõ‘z,¿OF÷ùŒ¼¼Çov_å²Ü~‰ròòý^L¿BìUتÜSMk46Ó{‡FX§ ÆäP5ƇÌRŒd …€yw¼û@òM§—ÅÇ™<ãq÷q3ÉYÉo´ŒXUÝ¿gúô/S¯í©êk˜Àû¼‡ã’A¦¼žlüÁ‹WÐí¥…¬‘K< qýÔ{ôØ4€qâ;}'i©ˆÑè<²â”yžï(óüe¨~gùfÒ'{yîTŸÐôcZQNR)mŠÓ§‰ûðSÏàökS2"®ÿG¿îeÖ—PÞÚÃynKA:,‘–R¤« ƒFŒ]\GŒeÌl­‹[±V;æ&é^h†· èj) ì`sÇí/±úÅÛvgleÒ·Xþ®âóžó?åüéc¬Âo4bxÁ2’VŸñ[ž‡ü†úŽ3Ül_zö7þ RÅ|Lcø×êùyr÷3}'[Óu¨=}>q%)Î3´ˆOfS¸ýY¨Ë†P4Cï]•ÛZm|8ðÊûÇñxüäÃ+v®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¬sÌsÒ´0ІúÕøémû'ü¶Ü/˯¶e`ÒJ~Aä»Û/gƒ|LŸÍ?¬z}þI^ä¿4~`\G©ùŽGÓô0yCYÔïû˜Û¥Gû±þŠæãã>G¯×jûS'yTzDráúNïeÑô]3A±M?J·[{TÞ‹ö™»³±Ý‰ñ9k~,Q€¨Šü[Š»Hüßm¬ÞùzöË@!u;•#³ð ŽÀHCv<*.>¦3”2ò7ò•†³ªÚyI‚It«qq¯ë %iøh¦¢ª©Où§réΚ3Å\#ÔYåÿ™%Žmòwå¨Uþ­|çá;GéÆMy¡*Û~ÏÜ1r;2y¤ï÷«€P@ÀÜ7Š»v*ñ?Ío4Ï®jqy/E&Xã•EÙCýíÅ~ê?e:·ù_êä£MEÚ:ƒ9xqüIåÝ K‡OŠ øî%ûÉ[í7˰öÍþB§/Ž4šå­Ì?Ì—ú^¬ZæÂ–«rŒ~éۯă¡÷_Ç0óhã=ÆÅÂÏ¢Œ÷ªÇÎ>lòTÉaæxÿM¯î9rz‘)Ù¿Õ}þY§Í¦”áÚv´º!Ì8áß×ç×ãózn‰æ-#Ì6ÿXÒ®V`)êD~c'³¡Ü|úxf)÷úÒê9_—Qï ¦9Ø«±Wb®Å]Ф¾m»¾²òíüúdO~c1«;©“á.Ôü òú0Ç›­íŒÙ1é¦q‚eT+žý~Þuùoæß,è6¦j%ìõ ¥gžæD¬l~Ê/%«#ù…*NY8’ñÞÌvÆ—MŒãÉq‘;’6ò4OæÅ–­/—íô¹c¸¾¸•½ ¡eÙ~%4¡nŸ,a³wµy1ç8#Œ‰JGb7çCïz¶T÷®Å]Š»v*ó¯ÍF_ÑÖ^^³V–óT™r€³:FG 7«HVŸ,³xÏlõ¼cˆs™³î¶¾OÒ/ÊŸ$ÃùuùuåÏ&D I¥YD—eiG»’³]8§f™Ý†\ùf8«±Wb®Å]Š»|ÿ9§åI<—ù£å¿Í}:-5¤[}L ëwb¢3ÈÒ€ËlÊ‹þ£ey±ñÄŽ÷Y¦ðËþ!ýŸjU±ÏO ŠEWÇFV|Æs$Sãò‰‰ ó ð1v*ìU¬húv»a&©Â&¶’†•!•‡FV‚2Ìy ‡'I«É§˜œ òéí¿-|‰õ¤–}_V·$ÃkêG*Ã"‹TPAþbHð®l͘WÒÆ;G_8fˆ±ó'î÷²¿"yæO6½ôwPÅk,,­m HÚ"7¨'‘âz°P7Ì]V—ªÝÒößc ‰‰2™®¿Ž–Ís çÝŠ»v*ìU-Öuý'ËößZÕ®’Þ3^ w’B;" ÏÑ–cÅ)šˆrôšº‰pãýÃÞ^guç?7ùêí´$ÙKokÒK• ”)?iåû1‘¯¿lÛaÐÆËröº/g°i‡r%.îŸ.¿™—”%ô)—Pó+_T¯3 ©µF&»†ÞCîû“ß2%“¹ÌÔv”¥´=#íýQUTUDP¨ P(ÊÝcx¡Ø«±WƒþcyróÈÞb‹Ï^ŽšmÌŸé°-BG+ŸX‰'Qàßìrür½¾! ^‡'>‡ôûÃ5ѵ{=sNƒR±~PÌ*Tý¤aö‘‡bXùî³I=>C ó‹Gââ»v*‘ù§Ë¾iÓÖÊâW£q$R¡¯ÐÕkCQ_–.˳;JZLœQØ¢€Ôï´oË¿/*ÚAµJ[A_Šiˆ©gn½¾#ôع:l9»KQê>óÜ<¿CÎ,<æo0ÛMæÄX¾·$ÂâÞÖDU&`­D ^¾ÖÿIzÜý¯¦ÓHiÍÐOóMû¹}ݲÓë?U‡ëßõÄUôÄ”ø¸×zW¦Îòðñ«ÚùÒ¶-nÅ]Š©\Û[Þ@ö×Q,Öò2E"†VàâÏIBBQ4CÎu¿Ë-æ:Ÿ”.ZÖå!hÎ@ùG'QòjüðH(½¿bûg—O0fLd9N;~’Wkç}[EœiÞm±‘&]½u@®GNEvVå)Í~nÏx—ß½žÿ‚ˆœ@Αšì˜¥aõ^Îí6²¯ê;l¿IÌŒZYÏÙæ»_Ú݆ÄçÅ?æÇsñè>%Ž[Üùãϲ5¾…ll4¢xÉtID§~SRÉŒW6xtP†çrù‡iûc¯í †Ýcòçñ—üM=Ê•Z—Ê^jÕ5U£ e_ÜÆßäFj öš§Â™˜étýn}Ežâ슻yÇæ¥‡šV?0h²¬Qõf³ˆP« þÿañ€V¨ضYÚ0ÉBq?OOÒÇï?2µÏ7Yiz•Úù‚øº_²>Ÿ¦+XÜôVbz­)‹-|òˆÆHóB¾±çïËMVÓüGzÚ®‘v~>S=ʲ­9ðy€uu´Ø|X¹´Ògˆ‹#×*ε­M®iÃYZjƒäjŒÅ–@ q*ËU~¼[û09Y»;Ž|Q• sz¤ÙèZe¶“`¥m-S„|X’K31ñf$Ÿ|]Ž,b‚;Çb®ÅX7æW×ÊÚgÕ,œ~œ½R s }R?÷ùauúý_…Q`ÿ—žXkHÄ‚“{r ¶WÝ’6êæ½ßõ|óm¢ÓÐâ<Ü-ž‡æYög»b®ÅT®-­îá{{¨–hQã‘C)àà”AQ(‚(°=WòþæÊàj¾Q¹{K¸Ï%·õ ýÉ^ÿÊÛ{æ»>‚÷ÉÁ:iâ—È#4?Ìû›Æ•ç;g·¹J)¼XÊŸœ‘æM½³S“ ‰§§ìßkˆ<‘GùÃôÕòzU­Ý­ô ug2\[H*’ÆÁ”ý#({Œ9¡’"P"@õ ø¶;v*ìUتK¬ùS@×Ôþ’²I&=.zsökB~Gl"D:Ýwdiõ?Þ@ßÈüØÞ‰ùae¡ù†^¶žÒí¼È ¬¤qR]h“öFôÉØtºeqéµ#(•Ä]Îýÿ±Ÿd±Ø«±Wb®ÅR¿È,ŸÍ_ùÈëKÉSÖòÿ”+¨ÊiT&ÁÀ·èy]2½;¨=³"ƒãžÒk¿1ª‘£éÛoÒ,“ v*ìUØ«±Wb®Å^Kÿ9'ùwÿ+/ò‡^Ñ­âõu›ÿKhàNnì~ §¨I$°¯-d.SŸÀ›š“×}³; Ë”pƒ°z] µºØ PFÓo>§îH<¼šÿœ<ímçaú3Kxú»V0¬ r!}BܨX òܱ̌]—g¯84z9i¸øæ~Ãú=Ï\ÍKûv*¥qsoiÜÝJ[Æ9I,Œä†MxñÊdF"Éîy™?6ÓÔýå8¾±räF·²)ãɶ(ÎìkзÜsgƒ³úÏäöì©>¬æ‡óGé?«æŒòïäö­­ÜkóòF’CËê+')XuIÈ?ÈO¼fwˆ¨‡y-n<1àÃãñ»ØtÍ+NÑ­ÃJµŽÒÒ?³JW¹=É=ÉÜådÛ«žILÜ”f,Ÿž|ù¦y&Áe¸XÔ§êv*Ôg§Vc¿4ùd¡ rôºIf;rïAyGòþrgózÉ<Áe,VÐnG«a%ü¯§¤¨EAŽ8cšá”ƒUw^-ØÓ20î=(WïBùÇÈÿó‘_‘ñ~—ó<ùʨ@¹Ô-dkÛhêiY$)Ä^Ï"p©¦çl,rö~)…&Gå8i>rÓ¡¦· R‹uhäz°9ìÔêì·FcÊ4èuib•ßPÓìõ[)ôëø„öw(cš&èÊQð=°M0™‰sŸ^-Gò“ͧޟË7íΩZ¥iÌûiPwFeFVþÐÑG´0ÜvÉÅ{G©Ã470¤ð:˪9‚¬¤TFÏ'AB¦,Š»c¾rò´~jÓ¨Cyz–³0%CR…Z›Ñ»âí»#´Î“/\NÄ%zþ¯äß"FnæŽ}^%KXdEø¶Ë×ípQÖ›‘‹™§Á‹]®< ˆ‘óýV^y¥¥ÍåÄókÝÞ—¯¼BçO–veŠddõz…»vùôÂõz“D X£“ðÈc§/Çézåÿ˜n¼Å ýbûâ¼¶•­å” 8ª°j «FÞ˜ Æöö‚:lü0úd,y2AƒPwbé[ÅÅ]Š¡oôë Rm¨ÛGsý‰T5ˆ®àûŒ[°j2b—$b|˜«ùOkê}kË—¯ap§’E#3 =¸È¿ý<±;ózÎÎöÇ6)1¸þ(úeøù$ò]~bùcáÔlÎ¥dŸîྰâ;ú‘|Cç ÌLš,rå³ë}‡ÿŒÂ¢rG îÉ´¿Ómì‘–™Z4ô[èe³“ö=XÇÒ¿ü.aϳæ9núvƒþ :<›eŒ±ŸôÑùÿز;=E¿ê—ðÈÇ¢s ÿð-Fü3x'`½v“·´ZîòÀù]‘ßìL²§lìUØ«±Wb®ÅV¼‘Ä¥ä`ˆ:³úN [äŒÈ€<ÒkÏ7yrƾ¶¡°ýˆI˜×Ã÷uürøirK£Ïë=­ìí?Õš$÷GÕþæØíÏæ?Ö%º›-ÕÃí0jO´qò'ï—Î?Ä^?]ÿÈ}:|FG¾[±0ˆƒÊ™žlßQisõI¥Uî=$¬‡å!Kr#®í®Ó×í’|?ÃHû7?çgåïÊ/,hå'¿VÕo~Wö„mÿ[2 ™ŽŸQg¨‰,q¨HÔTPt À ]Š]Š»BjZ•Ž‘e6£¨Ì¶öp/)$nÞ¹$ìÜâÃ&Ag“²üåòõÞ¤–w—–3ßL©¥]A4_zŸ|.º©* ÞÇüãåkß#k0ùãÊH> Î{`¼£€È8¶Àÿtà‘·Ù=;QqµZs‚^.>_±cÁæ¯Íù,.&‚ ;ËV²8yc•]¹íê|5çÊŸd~¸©5th‡´ÅACãj¨‹àª(ÝÞB—â—b®ÅR?5ùžÃÊzLšéäÿbÖÜŠiHÙG·v=†.>§P1Gˆ¼S˺]ÿž5ÉüͯŸRÔIÈ©Ž¿f%öR¿wŽfé4üfÏ èôøåžfsäõ03rîÏ)yWVó¦½kåí^]Y‘1®ï$„B¨ëµ{ šd2dZòåwš|£æ&j¤y†Íín–¦6?S%vxœlÊ}ºt4;c ˜°¸²ÆbâRL›c±Wb©~­¢išÜWÔ­ÖUaúH‡ÅXn2¼˜£1D5eÊ!Üh>gò,²jžZ»k5k$ð=½}HþË?iwùf§Q¡1Ün4ùµ)qá–ÝGOˆý<Ù§“ÿ0ôÿ2‘gt«cª€)8ôæ=?tM ?äõùæ¶P§»ì_i1êýôO»¡÷~¯½šd•Ø«±Wb®Å]Š»v*ìUتAç-lh]½¿VãrWѵއ֗áR?ÕݾŒ”E—UÛzïÊé§>¼£ï?«ŸÁô—üáåÑò§å|¾o¾‹Ž­ç þ²„ƒÍtûRÑ[)¯ó1’]º«.d>'"úo;v*ìUØ«±Wb®Å_š™þT?“ózž•zVó+}wLê#X/œ²¢íJC8x†û.ç®aëqqÃÌ:_h4^>˜‘õCÔ?OØÉó@ù{±Wb®ÅP·šu†¡èýzÚ;ŸAýXD¨#ÐŽ@ûä£3E»¢xï‚DX£H¬‹S±C±VæÌÝBçi`F¥ª ¯¥~ê6éñÈ*+þJÔøÓ3phe=ÎÁè»7ÙÌÚŠ”½óæ}Ãõý¬»òóþqócóžk}{ó âO*ù=ˆ– yb+w2ÇÕíœîÙ·î ÜaÁc`÷zÎÃ¥c÷õ/_üíÿœJòU·äü°~Zi™ü·ÏRŠà“5î© úÌ3Hwv(¼âE^(£‘Ëœà^+ùSçñW—+¹9júg{Êš´‹OÝJküÀPÿ”bä›í 7‡=¹wpnî ²µžöå¸[[FóL碤jYÐ,£M?ÿ8Áù^Ÿÿ˜¯æ­Åוt’;-6aÊ ‹Ês†8"þÓ2Ö °9q­Ãˆb€ˆ~„ Ðd™©ÏPKmsMm24sC"‡IÇVV¨ ƒB*üýÿœ‹ü”Ô?"¼ËæŸåÄE<‘}8QÓ‘ŽÂiML,Ñå?ݟ؇o‚±”m†l1Ë&:¹eæ="×YÓÚ¶×IÈ)ûHÀÑ‘©ÝH æ)^W6#ŽF'¢Í^XÓ|Û¤K¤ê+EoŽ ÔUà”EùWqÜmŒeE–Ÿ<±KˆÐÀ­¼¯æKï«ùcÌöQÏ£Û#¥ž±_Z*}>-È;âÉáóÂôÙ;OOŽóà‘‘õ@ò=ÿ¶ ß2ÞÁä.Áå C&«v¤ÜN¢ŽCFz ÑžœTvåŠ{7 µúƒ©Ê*ä=Ý=ÙókËמxò¤6}ö™ëi“¾òÍ5LG"9+0QAb|qOhbÑk ç ÔÀä?ø¢NÛOš2í­m<£/­xÔi=2Z=øªqö˜ûtùãM=™ì锵"£>~v:ûÉ×^sy.m<Õnª°ª4W_wgýŸÝ| êE)ïØ:Î×Å£2Óž|Æÿ§vY‹£v*ìUتW¨ùoAÕªu>än²” 'üÑ¿\Ý?hçÃôL»åÉ‹_~Rùrâ­g-Å›vUq"¡ÁoølmÝ`ö«Q¨F_aû?RRß•Úýüqõò }}[ù6Ï‘”"y€ô/ø eÃô™ãþ¤ÏüuaòßæŸ÷„wéIQëÿ#ÐeGKŒôzm7ü5ÿ/1ýh‰Å-ú·æÜU­ºH«VËâØ0?†CòX»®?ø0gÚóƒïÇú¢–iz¿æ6­©Ýézz‹‹ûbâ{r–È!(üân#fÛv8þGs½Ò{wÚ¹½PÈ$$,zc°=Û¶Ó±¡þrM±‰ <ìw¯È·L#E¹Ê—µ=µ/ãüܨª¯å÷æ…ïûÕ¬El§­.dSô#§ã– 61ü!ÃÉÚ}«—êÏ!î—ûšEAù#qpâMg^y›ºÇcô<Žâ9hˆtû?&Sy2;?ydšwå“,hÓÁ5üƒ~W35+þ¬\ÞÜ}™Š<ų /MÒãôtÛ8m"î°D‘ƒóâqsaŽ1ä)‹7b®Å]Š»xÞ¡ù¡æ.y³V°ÕaŠúÚ:ÃgklB*¸5¹|MV÷€÷éÓ ¤ŸhOI n:2½KLrò–¡æØ®4³dúòÂ"¡_ÒžJÕj‹P»âåäÇãc%Æ·§œjSÅç= Só>·¨Çai§s¶ÐtH¢•zšŠAﲊbë2r4Ó£~Z'˜dòäšOšl8-É·¶7 rš dhÛ~+г)Û¦.Ï@&qðÌrfvVVšu¬VV0¥½¤#ŒPÆ¡UGÈ`s¡C’¾,Š»Kõ½kOòþ›6©©J#¶„V›rvý”@z±ì1jË–8âdy<I5Í/1µÝÑh4›s@ Õmá&¡Ò…Ú›ŸàÌ>ù<ÿ«U’Ï õ+KK{h­-#[B¡#z3{ˆŠÞ19"a†[‰£·YåeŽ(Ðgv4UP7$ž˜II4úËóúíµ­®¥7šCóO­YÙÀœÞ)ö¥I«¿(¤ò³]“\ÕaÕäí“\7â×óEó·_•¿ž–PÁ¬ÙÈmãÖ#…¥á—˜Ñfe‘hŒáFÆ ¯&³§”yˆíÜò_ÍÊ{¿ËkÈ&Žö;ýPg|åÑn¬‘×zöÓá?ä’fiõ ós´º¡”r¢s™[±Wb¬#Îz–»©XùËP½æ·«M Þsw™€ŠáÈXšPuØœ×k³× |]_hj(p‹ê[þpKÉ·¾EÒtý/S—Kóý²‹ÝdžÎúèürz°9T1+FT…§ ç5nŸ‰ó‡™´¯ÍŸÈ½F=#óJ’ïEvôìõh˜Ío0ƛúr…zvQ•Êõ•í^lŸ¼û!ñëñù†G¡ù“Fó¾—r²0É|3Gþ²Çϧʈ§Ñt§ƒWÇ+òê=ãðl{±Wb®Å]Š»v*ìU€jZ-÷æŸæ‡–ÿ+´–n3Ü"ÞÊ‚¾’°õ'”ìºY¾ñ—cš{eÚyFÊŸëÔ>÷ꙦÙhÚmž‘§D Óôø"´´~ÌpÀ‚8Ð{eŠÅ]Š»v*ìUØ«±Wb¯™¿ç5ÿ,œ?-ÎZl<õÏ';]9E«É¦ÍÅn—o÷ÝjžŠ­ãŠCæï$y€y˶·Îܯ#…àî&ŒIÿXQ¾œç5X¸&GGÊ{gCùmD¢9Ǹþ®L‹1ÝS±Wb®Å]Ф>có†‡åˆ«¨Ï[¢9Gggðø{v Ëðéå““²ÐvVmQô »Ï/ǹ)ò’?8ÿç ®LV±:7“y¸Õî ÃiÄ03S”Ì;ǧóS®n0hã ù—½ìÞÀÁ¦õ\ûÏè‚û/òwþqkòãò˜Aª4â8FoPH…üm-þ$‹ÙªÒuøèi™ŽòÞ㊊¿;?ç ¿.ï¿ ?4£óï—m‰òš&½´`íçú—t/ûöß ¥W¢Œ£a§Q€e‡ æÊ4ûûMVÆßQ°”Mgr‹,2/B¬?_ˆÌB)ågAæGç.±ú/É70#qŸR’;4§^$ú’}P¯Ó“Æ,¹Ý›‹(=Û¾Åÿœcò`òG䟕´ù#ôïõÓÕX˨Ÿ¬(qüÉG¯òæSÑ—®â‡b©O™ü¹¥y¿ËºŸ•õ¸DúN­m-¥Ü{W„ªW’“Z2Ÿ‰[±â¯ÍÉÑ{¡kkò=ëú£Þ:>È–^Úb7;Šz僧í|cÓ'®e.•ŒùÛÉzw4¦³º+èkÚU¡øø©ý¥þ4ÉFTäéuRÅ+º¼ËždÔ¼—©7“ü⦠>«¨ïý¿ßÔU•Ô2ÊÀ`j=8¼1Þ(v*ìUØ«ƒÈ–©æ¹|Ísr÷\« €Ls¨Øª°)·Ñ‹½ŸnHéFÄG¡#¨ýgª{®ê–š6“u¨ßÐD†±~ñ›e@óL]n‡K<ùcs'åçðxÿ•¼¡«ùëb±4Éc¸çgÅ ¡~\Ÿ€_²«PÇà ÞvŸkbÒÖƒ0G«•÷’ô}oζ^Y¼‹NÔmîç>ŠH÷‘GB )È€ËMÆû|°<ž‹±§ªœ Fäp’SÍ+WÓµ»E¾Ó'YíÉâH¨*겚~xºÝV“& ðdQظÎÅ]Š»v*ìUØ«±Wž~ZäÆóWúןõ0¾éì¯÷Pÿ…ÇîbÅë]Š»v*ìUتK¬ù»Ë~_ªêÚŒPJ}L’ÿȸÃ7á‹F]N<QK4ßÌ¿%ê—Igo©¸…ŒO«°ÝB׿qjǯÅ#@§bó‡–t©µmE£#]ÞI좃Üÿn-ÙóGx‹Íu̯=iki®j¾]»` ‰ß÷î„rëÏ$t&0=°º¹ëóF¤bOãñ³¼Ëù{ ë~Z›ÌþRÚò厠‰È‘$l+$*ƒe Ô…ëËáù+¨ÑBxøñó;þÅ?+~j]_Á¥ynëK“Q¿•ÖÒö`yz–çà/Æ›°SñòÛbk¾Ê4ý¢d#<¹”éß”žQÓµAª"O7¦þ¤6“ȯ05q Àv ÇÞ¸¸vn(ˉb슻v*€Öu;@Ó¦Ôõ9„6°ÏVv=v=†-yrÇx¥Éàš†¡¯~iëÔ¶ÑíÀc·Œ÷=9HÔÿh ¿ÐyéÎz©÷ö~×¥iZ]žcŸbœ Œu;³1êÌ{“›ÌxÄk€ É¶=ò_ÌþRòŸœ¡Õ<ÙlÒB…•èøÒÊf4õž m¶ä7^ Øú¬r”j.&³ç ‹èWò-–Ÿç»¿Î½GÌ2j~_µ³–úÊ8«+"´L¼#1UZ‰Œ/R~*î[]ã .¯Ç&mò¯¼Ï?œ¼×ªyšxý&Ô&çU©Ž$QHOr¨ª Ͷ,|ÝaÇÁäªëRÔ/¡µ·½º–â ý 8å‘a‹‘~ ØT“A’˜ˆ¸Y;J|Ç®Cåý*[ù(Òý‹xíÊÃá.çÛ*Ï”B6ÓŸ0Ç{¿üágäİÃ/çg›"õ5mSÕËqÊ( rR{ÊÃK¼qô¢r;‡ ”‰6^js$Ù}“‚UÒt½wO¸Òu«(5.éLw6Wq$ðJ‡³Ç *GÌb¯5ÿçáËæÉ;öÒµ8ë òõÔÌ!fî-n˜–ŒŸä”²’~Ú®ØÓvóÇ!(’ê;ÿŒ¼Íä­^O+~hi^­nB¼²Bc’£:ž¢H¶# 9T±÷=ße{dEGP?Τ~¯“<²¾³ÔmÒîÂt¸¶³,lO¶Ýý²²óxeˆ”=B#k±Wb®Å]Š¥úÖ«‰¥]ê·Çm~5§&èª=Ùˆ@·]«ŽŸ ²K”Gö‰zwüà¿åä÷§ÿ95Èù]êRK¦èÎàׇ1%äË]¨ÏÆ%=Gó >¨Í,“3—9/´0´»v*ìUØ«±Wb®Å]Š©][[ÞÛMgwÏip ðÈ$‘È¥YXˆ ÐŒUù…©ybëòKó—Zü»¾fý { }"âN’ÛÊKÙÉ^ç‰1=?l À×áâ…Žaç}¦ÐøØoÖ¿-üϨAs¥Ø]K¾§m*Ïl² Ã+F\‘hJõFÙ€<²¬½Ã®í È8¢7Gjöñ~s~kyCòï@˜^iÓ\F/nm›š¬r-Ô– úVñ–¯F8£IìÝ9Çd(—éô0Åop@‚8bUHãQEUQ@k°_Š»yOç×çf‰ù-äùµ;‡K3ß,ùJ¨/5Çï]zˆc$4òQ» Râ?ÉQ¶Óõ4ë›P×ä+IýãFœÊÞò3–ùP÷Ì|²²è{S8”„Gð½C*uNÅX×<—¥ùÓL6W£Ò¼Š­gz«W…ÏÝU?´½þt9(Êœ6ªX¥c—sÇ4Ís[üºÕ?Âþn›L–·@ vxÍ*ñžëÕ ÉíNdž²>.§Ôwþ£÷ý¯P‚xn¡K‹iX$£‘e`{‚1xIÂP&2B¦,Š»v*‘ù§Ë¾i°[+™ä€Æþ¤RFjÒ•d;6ÇeÙ¥-&N(€ocýªëÉå_'Ü~ƒŠa%¸§. ²£HGr.kôâÙ¡W«)úÎÿ«ô07Tóá÷~×¥iZU–‹e…„|!MÉ;³±êÌ{“›¼xÄk€ ŽÉ¶=Kò7ÈžVóö¿¨iždžUh- Öv°·¦e<Â;ú›ïT…¦õ¯A¾.¯, ·<±Ä²ýwþqœÝ$÷~@ó ¾©.ñ=Û(–9#4xÌÐÕyƒ±VD¡ë”Ã]_P¦ˆv•}b’¯)ù—ó7ò2ïêfÑ®¤òœûûY©;½µÂrŒ6õ+ÊܸžHcÌ,ÙåÇP.'v ù«ù;[ó]ơ䛰Ò%D.¤zk$är‘Ò‘Šž‰Ù^ÖáÍQËè—ðŸOÍž+”‚¤T¸ ÷[×mâ®Å]м÷ͶگŸ|á þVùpzšŽ¥s MJ•W—ì—¦üc”¯í¿l·êùç¶}¥rxž[ËßÐ~Ÿˆ~šy7ʺW‘ü«¤yGDNfm¤3ðOÚv«¹îÄ寞b®Å]Š»v*ìUØ«±Wb®Å_-ÿÎl~TIæÏ#Áù‡£E_0y<4—e*$—Kv )oX÷£Á}Cמ{Ï^Jóy—@·¾fò1èÞ¨í2SOaóÎsS‡Ã™(íÒç0þ¼}ß³’$‰4’°HÐwb¨’Iè2€lbI¡ÍçÚßælmvš/“mZÖnE¥È#l4Œs•¼íîsaƒ³ÉÞ[«ìßeòdõfôïâýYü²ÿœ8óŸžn óOçn£6™`Ôx´Müˆ~.20;t;UTêC¾m±ãŒOm¦ÒãÁq›í/(y'Ê~@Ñ£Ð|¡¥[éTB¦(ŒìÛ–F«ÈÞ.ìO¾XÞðÿÎùÌO ~^ýcEò™O6ùµ9Fbµ“ýÇ[IÓ÷×+Pä÷\<ºfCŠiâ”ó•?˜q~p[7æÕñËiHìÅ«Çõk=1ȶžÿeyŸNVsÈ©äìx ³&)B¸…[¦ÖaÎ Å!.F·Ý÷þVÞìU¦eU,Ĥ€¹Å_žÿó?ó¾düÜó×å×å­ÛÙyÍžýF 3ªq<IhE½vŽ1öþÓV .F›M,Òá‹®í^ÕáÅâe>áÔžàòÛ/Ë/AKÃ-Üä|r—1Šÿ’©Ð|ÉÎbâ{%òÍW·ºÙÎñðÂ=Õ2E(A£y§òÓXƒÎ¿—Å®¥aWâ¤}3öÔŠq•ûQ²îTó—üæÏ|Û<º7äÇ–ÑOÂ5mB5º»PNÎ ZÁO÷cÈ0Î0#O0Ó?.¼Çæ}xùËó_U“ZÖd!ͬҙêA%VW?E'h£ø>²™eîu:®Ô±Ãçúž¦PEØÐ ¥Ò·Š»v*“y—ÊúG›4×Óuxy¦æ—iazPpòä‘yhúB3‹új>)V3W4I$¹¦-‘Úë¼L‡ë¿…òýH?"ù§Ë—zE‡–%ONñÑà’ÚHëÆŒÌKn§˜ì{í…ÈíÎÌÔC,óƒq»»ÜbYù•®^ǨÚùcM2Ad‘¤— j¤;†¯ÂÓáU§O˜‡3ÙÍ9g]/ÇRÆLiž\¸²Ô<£¨^ä~¿axÔ 7†Üw#®.ßò™51”50ôeÛ»ß0>bìUØ«±Wb¯<ü´ÿÉæ¯õ¯?ê0a}ÓÙ_î¡ÿ Üŋֻv*ìUØ«±Wˆùî7ò_æ6Ÿæ«u"Òñ–iBŽ¥@ŠåG¹BæØ]°x9ÄÇ#ø+¼Õù…yçxÛʾPÓæ’;²iœRDV€ªHE¨ø™›§†)ÔëNoF1Íé~Iò×øSËÖúS¸’ê­5Ü‹öLÒuã^À£åÚi0xPê·òß—í/›S¶Ó-¢¿rXÜ,(‘êA¦Ä÷¦,ã‚ñ-4Źث±Wb®ÅX?0tŸ(ÂÐÔ]ë +’7Ù¯F”Šñ‰üqpµZØâÌ÷<–ÇHóæ¤u½~gKh¯N  5ôíÐôQü߬×34úS=ÎÁÓÃõâŸ/Ç'§XØÚi¶±ÙØÄ°ÛÆ(¨¿¬ž¤žäæâ¼ "(rDä™;dGóEÇ“|×¥ùŽÞ¤YL­8Õ›L_SyËPòwåqÔ¿5´øû\óJC˜‰ÈZ—hCú•‘‰øìõcš¼BY*t¸c<µŒì"ð=ó×óÌž[ŸËZÔ& ¦X¼‚Ä‘nL,c!8«D‰ œÏ†’•‡i 8ˈ<×2\·b®Å]Š¥Zöaæ?ª_)O(fJ¼A>=ÆU›È(´æÁ‚Š Ë:çç‡åŠˆ<æÉ×KBZ==¤I-Æõ?è·‚HVµÜ®kg ˜å»ªÉÙÓ·z^•ÿ9£ùå pO4ù[OÕíþòt¶¸µ™¼G«ÿ‘Y,0\Ié§`½[É_óß–ÚÜñYyÃI¾òµÄ„+]5 (ÏCÍâT˜oá÷¦TÒbúwGÖt0é¶úÎ…}¥¤Ý¯©m{i*Í «ZU] „PûâÅ^ÚòÒóÕú¥Äw„þ“«úsGöã~$Ñ—ºÆ*¯Š¼›óoþq×òÛó~.5»ÑþeãH|Á§…Šì(¢mŠÌ»R’@û%qH/Š|÷ù7ùÉÿ8úò^zâo ÆIý#jŽðÅ=g‹â’ØûÔÇ_Úc‘”Aw½•í}&ÀñGù§—ûñ²–¼÷¡y”,PKõmDŠÊr“ßèã忈L¢Cé=—Ûú}^ÀðÏù§ôwþ6dùv—kš½¾…¥]j·G÷vèX/ws² ÷f aÜM~²:l2É.Q3Ð|^“ÿ8?ùiuu«þvùŽ>w5†€Î:Õ©ypƒ°¨ôø°f@ˆjuË3926_kaqÝŠ»v*ìUØ«±Wb®Å]Š»R¹¶·¼·šÒî$žÖá)à‘C¤‘¸*ÈÊv ƒB*ü½üÇòåÿüã—æ®·åñÝy_QC{¢‚Ü}[IK>#_Š& “Ö…©ºæ.«L2Þê»c²F²_ ¢yùud>Aüˆüãüý’OW'ÊÞA‡Žîæ7Q4}µ±*ót‘ʧ^-Û%‡M |¹÷³ìþÉÁ¥rþqçû>¶¿*!¿.'íycNëLœ.uëÞ3_Í_´”5?ÉUñ©ß2’—æ¿üäåÇ峯˜µu¯åo X•šöBETºÔ”ÿ<„{W¦)ñæçÇççÃϧY1òÇå,†ÂÕÝhúsq@ó“Ý,~+]ó7K É›¡Þè{_ÚM.€TÏÿš9ü{¾?ËÞIѼ¾dO­j­ÜÀù Ñ_¾tÚNÍLJ~g¼¾OÛ>Õjµ×x!üØþ“×îòRóç—¿NhÍ$ ]BË”ÖôêËO>*=ÀÈv¦“ÅÇcœy6û!Û?“Õ#èÉé——qø}ľÑÿœKüá™ÿ—0éZµÏ«ç+¬v:—6¬·àRÖèÔ’K"𑺗ROÚǾâCß±CÁ¿ç/?0çò俣Ÿ)‡Xó,©¢ZH†s«=ËŠn?rŽ€ŽŒÀâø¯Èz"húËKËÐ.'nôqT_¡çcÙšaï–åðÏk»Têõ’ú1úcðæ~'ì¦Q›—v*óß0¦»ù®ÛùÿÈ÷Òé„lé$ö¤+Bó!˜ ÅÁ!~yÌö¾„@ø‘äy¾µìG´'4-”Ü¢='¼w{ÇO/s!ò7å®›ækX¼éæËùµëýTµÌ‚Id ÈX‡3ÈÇÔ‘ÃËp+ãœäò§¨Öö„ã#íO\²±²Ó­ÖÓO¶ŠÖÙ>Ì0"ƃäªÊItò™‘²m‹b¨Í3HÔõ«¥²Òm%¼ºn‘Â…ˆ&›îvÄ g r‘ -êþZü‹¸‘à—Í×éd&?ºÓ­Zw re2¨ H@Ûwlqw»<=˜Œ×“Ï|ñ¢XysÍ:†¦N×–®¡Àä¥9BGRµâNÙ Š.§„ÌG&=‘hCÞØÙêV²ØßÀ—6“/a•C+pq”dblsx™¿,µï&Þ7˜|‡,³Y­ZkWš4­Jñÿv§·Úýrøä¾nÔgŪ‡‡œã‘FùSóM×BYêluc·4†Vÿ!B”ýË)å{SÙìš{”=pûG¿õýÌ×v*ìUØ«±Wb©[yoAkåÔŽ¿F,ëVæ CmJš÷ÅÍ£œCƒŒðò«Hüáå ­bê×\Ñn×]²§¦Ï²HªK($B 4Ú‡¡ÅÙvGkG e‹(âÇ/±¥h>aÕu'›Îšu„¶¡Ó‘B –D5 ­XƒûA˜ÔW#U®ÓáÆ–süê¾?e{‹Ì;v*ìUØ«Ï?-?òcy«ýkÏúŒ_töWû¨Âã÷±bõ®Å]Š»v*ìU'ó–4o4Co³š+i}h»!'‰R¥–‡‰®àZ3éã”.ˆ½7HÒôx¶—i¤;Ua@¼©ÝˆÜŸs‹¨ì\³^S6õ?ä×çá›=>‹¬þM:} ž)þ=ïDUTUDP¨ P(Í“´JµÏ2i>_ˆI¨MûÖŽÞ1ÊWù/aîh2¬¹ã»NmDqÒ?ÌþvóKwå'_jz|D‡žÚÚêéVŸÌÐFT|³ö‰èt»Lô úŸlu+¯Ñº” ¦êaŒ~”§à2Ä¥HR­]¸°öÌŒ:ÈÌÑØ¹85Ñ™£±eÙ˜ç= RüÔ¼Ô¿+ôÿË«‹D•ìç,u ~&[x›œ ìÓ!?Èîi8 ÜXé@ÊfóÜÈrŠ»bžkó\ºTé·ä‚žPóSV@¶ñÿ¸Ë‰ãÔ·JzD‘öá¥:”c‹!"&y‚Í?ÉMM4?ÌÝitæb–š¢ŸV)ÕEkÐø$ÛrŽCÚãÓ+”¿²½­Í†£—÷‘ÿd?_Çæ‚ß~vùãË¿—~Qg6×Ò£ÜÜ20-9Í4Šfƒ7¹ØvƤ{OÛ±ÕpÃô Ï™ýÔ,ysJò‡—tÏ+èˆ4&Ú+KHö¯”/&"•f?7rIË=6Å]Š»v*ìUØ«±Wb®Å]Š»v*Ç|Åä/&ù·QÒuo3è–šµþ†ÒÉ¥Ky˜[¼ÜyU5à¤r„7ÅVù×ÏÞNüºÑÛ\óž¯o¤iËQ™«$Ì¢¥ …’F§ì¢“ŠÓâÌïùÌo<ùúâ-þMØÍ¡é ðK­JêR)¨,¦¦;e=¨Yû†S¶]ƒO<¦¢-Ã×öŽ $8óHD}§Ü9—èÿ—ð‹—Õ¼ÏpÚ¾¯;™¦i]¤C#³;?Å#Ô·Ý“±á çê?gí|»¶½¹Ížá§ýÜ{ÿˆÿÄü7ófŠŠŠ*(¢¨À ÜO);•ءثÑ|Ë­~F~céÿ˜ž[RúTÎaÔìãðJAžÙ»ÀsŒþ˨4øs”í]‡.8ý2û ìþÆöÿæðø9ï1ôÑï÷ŽGà_§>SóV‰ç-é¾kòåȺѵXVâÖQJ€Û28ñt`U×öXš‡³|Aÿ9½æ#æÍ)þ][¿+m&ßë7Š»qŸQĬ£õ²í>/$cÞ\.ÒÕþ[M“/óbOǧÚÄ@ ¨¢€wÎD’l·Š»I¼Ö°·–µQqOOê³˧0¤§ÓÊ”Ì]p ︻gŒÆ»>8ü¯²ÓÈÉŒžJhËòôo'UZ‚QJ£RªI9çÙy¾ÅÚ£÷¿¥ånµØ«±W®hÿvú—ca¦ynÚÝããú@ÂÞ”rñز*­y0ß““Cã–ŒµÑÚãí!€"<Þ£Ÿ,]\_~kY_Ïumõ)VKiÜ·Õ0$•P1< mþŽX+êsñðs{|Ÿ6ÉúSÌz­ÕÌPÉw¨]¼÷r¤(Ò1©2Èh š ó›Ïž)Èžd¥øÝŠ»yÿ¿*4?5ú—ÖtÓu¶©7¯î¦n¿¾AÔŸæø×'„; /hOÇpóD×<éùstš_š­^ïL¯'åÈáš”m¿a÷äåàƒÉ†³±túÀgˆðKìøÒ>×¢hž`Ò¼Ál.´ÉÄ€yøeŒø:Çϧ†ŠÖè2é¥ÃWŸCî)ž.±Wb®Å]Š»v*ìUØ«±Wb®Å^yùiÿ“Í_ë^Ô`Âû§²¿ÝCþ¸=‹­v*ìUØ«±Wb®Å]Š»v*ìUØ«ó_æ7—¼¬ $úÆÜ‚ÊâÇÜ'Ó¿¶.§] [s=Ï(º½ó¯æmÅe?TѾ’Ùh~ù3#šY9ru–]IîÙûY¯—¼¥¥yu[§­zEî@ šõ ÙG°úk›|:hãåÍÏÁ¥Ž>\ûÓì½Éc>oód^]¶X`]Và«ÅÔ é͇…zç1µ:Œy¸š­HÆ6æ÷ùÇßùÄc«?1?:á{›‹¾7–'ªü'u’ülw+n(û}Ðie##eÐO!‘³Íö••žk ŽŸo¥ºˆà¶‚5Š(Ñz*" 2-o ÿœŠÿœlòÿæî‘s®hÐG§~bÙÄïe¬k¨_†Þî€rœRCñ'ºÕqH/ˆ|‰®Ýß[ÜhÚ·%ÕôÆ1ʲ‚%(§ù#-ôW|Üh³ñŠ<þÐê8ãG˜fšç»v*Çü׿{-Ø6“P˜kî{»’?™¨Î17S¨ãæúþqþqæâÑ¡üåüÄ·2k·¿é[ÓîWâ·ŽAµìªÝ$pr´øâêWŽŽR$ÙyÙÌÈÙ}ƒukm}k=•äI=Ìo Ä(d’9«£)Ø‚ ÀÁùyæß(Éù5ùÕ®y ƒ.…{ ›Gw$†µ¸¬¶¦§©Z´ {°9™¢ËÃ:è]gæát)þn]ë±U®é4’0XÐv&€*I8“H&˜W”ô9¿7<õÊpËå="’OԗóLFþ €Îo´5vl|;;FuÚþˆóý_¹õ\qÇkJ$QUU°fô€_ÿ+<©ç˜Ú[ûªêô¤z¥° 5@ØH:H=›2Üy¥UÚ=‡T.B¥üáÏãÞÃ<³çïÏùÆ™VŸüSùsPÙÌd{h£&¿»oŠKVûã©èÇ6óÆ^÷í.Ãͦ܎(ÿ8~žçØ”ó‘–ÿœÇo£^þŽó/Íåí@¬Wu¬a5ã2÷ŒÔ´«—:RµŠýoBѼɦ\hÞ`°·Ôô›¥áqgwM upEGP{b¬cÊÿ”–þJó-ï›|©åë]#[Ô-ťĶŠc‹Ñçê0ŽxGÈ…åÁEx YJDófø±v*ìUØ«±Wb®Å]Š»v*ìUتPÔ,4«)õ-Rê+->Õ ·7w,PÅîYÝÈP‰8«äÍ¿ùÍÍ2ÂY|·ù9gú{Ycé~œ¸‰Í’7Cõx™‡fn)ßã(ÄÈÐXåÉ q2™ˆæNÁó%Þ‡æÿÌ a¼Ñù¡¬ÜêZŒ»úRKÉÂÖ¼$IÿÄùfóIؤï“o'ÎûkÛØÂá¥Gùç—Àuøü‹-²°²ÓmÖÖ··N‰ ¯‰ñ>ç:x£Q3Õk2ê&g–FR=OãìDäÜu9æŠÚ.'`Ĭò9誢¤ŸÁ)‹<ƒ€}šìíÖæ#$‡(ôùFGâh'ÞXóIÖ¤ŸN¿·6ZÕŸûÑlkB+NK]éR6÷-oŠLd8d9‡AÛÝù1¸¥âaŸÓ/Ðü“KOµÕlfÓï¼ëŇqÜ|AÜf^lQÉr.—C­É¦Ë¸ÍJ'ñóDþG~}ë?óŽšÿ•|Õgs¬yõšâÚ;b¢[yéOZÜJBà,e…Ä kËŠÕie†\'û_}ìŽ×ůÂ2c;ÿzÄ÷~£Õˆiú¾­ù‘ùƒæÍ=r?N]JâW¶Ž¥„a€#F4ªÃ ¬@÷ͧb鉑ÈyOí÷kF8†š'Õ#rò>ó¿Ã͘çJùC±U »ËKZâöd·zÉ#_¼ä'’0#A»O¦ÉšBâe#Ð b:n™æoÏ/6ZyÈ–ìönë%õó«,Q@Œ9ÜNvãW`wf 9~ÒíÓ§ï}ƒÙOe¿$‘‹Éj´YpÉÇ$ÃØ«±Wb®Å]Š»v*ìUØ«Ï?-?òcy«ýkÏúŒ_töWû¨Âã÷±bõ®Å]Š»v*ìUØ«±Wb®ÅX·˜ÿ0|±å®QÝÝ ï–¿èvÔ–ZŽÍCÅÙ‹‰Ÿ[3¿sËõ=ùßÏ2=—àm?N? ˜ZÄÿ¿. )òZ}9n<2™Ø:™ë3gÚ‡ãª3Aü¶°²+s¬¸¾»ëèŠú zîïôíí›<:Çyn[pè#å¹g‰ª"…E*¨ t ÎØ»v*žÿÎ ùÏó7óOZüÀ×ãZ_• 2Ø[H*{rÎ-MÄB‘3Óùøç²äã‘/1¨Êg"_¡¹[C±Wb¯ÎOùÊ/'ÊïÏh¼Õi£åß8«_¹.Y„wËSÔ‡)9ÿ\eÚ|œÊÒåà˜)x ŠŽ™¿zFñT›Ì~c²ò呸¸<î¢ÚØ4Œ?RŽç)ÏœcZ3çÅ—¥Î1ÿÎ<_þbêÐþmþgÚ“åÈÝ&Ðt™’‰¨º¤²FÕÿFJ|*½=~óÑäÈfl¼öl¦fËï@: ƒK±WÈßó_—2ê¾VÒ?3ô˜é/,Ê-5)#_ê. RÖ‘O@üXǶ Ó(š/žô Z=oI¶Ôc#”ªÊ?fUÙ×ïéíœqéðåãˆ)žXÚÂ?25;˜lmtk*›MÊ0O´È¤ýf`? À×åáw¸ü†„G9>„ü¾òe§‘¼³k£@®ÈjýÝràs5ðe}†rYrq}²ôÒáúžòÊr·`ìU¦Uu(à2°!”Š‚PF*CÈüéù£jÓgÉó‡õèØK‡’Z´Šj*|Q5z4{å̬z’9îó¥ìÎ,×,^‰±?«áòO<…ÿ9Wù›ùI{•?:ôÙõ;²œMúF»sYvŽèM–OænÙ ‚Cg„Öh2éåÃ’5÷q}äÌ?&~dhé®y3WƒT±4ˆÉY cûBôxÛÙÔ{m“p™>*ìUØ«±Wb®Å]Š»v*ìUØ«±W€~qÎZþ]~W›#Ky£ÍñU›c*‹kw®®€eR;¢zìÁzâyÃΛŸž÷«}çM´ÿ-«ú–š< ÐZF+QéÛV¬Â»K33S¡#lÚi;+&]åé#Û>Ùi´— ¼Ÿ—Ò=çô±¢yoHÐ"ôôøÈE$¸ŠWù·ðgK¦ÑãÂ=#ãÕòŽÕí½NºW–[tˆÚ#áúNé¶dº—b®ÅRÏ1YM¨èwöVÿßÍ ¬cÅ©P>šS1õxÌñJ#™ϱuQÓêñd—Ó ÷~ăò÷YÓî4˜tDNÅdúų!SA&ïZSr£­s ²µ0ùJ<ÃÐ{gÙy¡¨– ú±ä#†WåËä6éI¿èm,y›ôÂÎWV0{`éF‹dæRœ¼kLÊü¼F—¢$h±Æ¡#Pª€°$¹LÈÙ6JRÕ,4‹V¼ÔgX-×nMÕ‚¹>Ã*Íš8ãÅ#AÊÐè3j² x¢e/Ç>æ/¥ë>{üÂÔ·ùcåÛ­Jë`ó$&SmƒÈº‰kûRµ3A¨í¹±Šó/¥ö_üñÄ jeÄ›‡Ï™øSÜ<‘ÿ89æ¿0Í­ù¿æSh„†m#MassÄîQ®÷1hÒAïš\¹§Ü½Þ“E‡MPCïïø¾¾ò寒,tq¢y+H‡L´j5Ä«W¸¹qûsÌä»öäh:(l­ÉNõÍHó.‘y ëÖqj>¡Ayg:òŽXÛ¨#±Aƒ¸ß~x~l~Pù»þq£Ìïæo,¬Ú·å~¡"©w%ŒÛá¶»*>ZÒ)©FéÖ«‘”m§S¦ŽhÑæÉ<µæ#ÍšjjZDÜÓa4-´°½*REìÛ1eg> b•I9ÀÒìU—þ[êþZмɧæh¤’šÑ‘y¬sÕÙ:š~Í:þRîåèòB¹2ËoÍû^÷S´ó®™õï-_ȯkl€;ÚTJÖ£v`ÀÖ´ëLŸ‰|ܘö€‘"bâ~Åú¯š#óðÓÿ.<‡§7C’E3<Š÷q·¨Y‘ Š~2Krf§~©—Á93øÕ‹ È¼Ãÿ*±n´ÏËmF)ãšÄÇ WÖéúRÊ6Y&5z±~MEãÈïÓiMù| G’ù÷Ê/ä¿0ɤz¦{gn-&aFh\•€Ú¡•”Ó­+í•N4]f«OáO…Œä\gb®ÅRícBÑõûoªk6Q^A¿*Õ‰Fe>êFHlÇ–P7O(×#d·›ô‡“57¶¸CÉ-®”¯ücž1È{_öYlr÷»Hv˜áËŽŒy¼Õçÿ&:Ûy³L{‹`B‰ä^5ö[ˆ¹FßMNZ<œþÏéuâ—û>GvO¤~dy_Tâ’\ ƒAéÝ‹_i)O™ÓÎêýÔâÜ1ýÕÍ•Ç,s"Ë ¬‘0ªºÊG±bé%DQ_‹b®Å]Š»v*ìU矖Ÿù1¼ÕþµçýF /º{+ýÔ?áqûƒØ±z×b®Å]Š»v*ìU ¨jºf•¯©ÞCifžEŽ¿.DWèÅ„òF"äiçÚççO—¬CG£C.§?g ÁüŽGþéÂësv¬#ôîÃnuÏ̯<Õaå§érTR.VЕ>.k#=²üziÏp¥—QŸ–Ãä˜èß–ze¡Yµi ôý}1T„<›é?Fl1h">­Û±v|FòÝ›C6Ñ,ñ¬P ¢FŠTx6ÌÐØ9à°T—b®Å]вùÃ=iþ@üÈó寽2ÚGæCésÊB£^Ú Qr= ÑÊxW«Q»g;’2!åóã1‘ÏÐ<ƒK±Wb¯ÿœ¬ü¬—ó?òªñt»s?™¼¾ß¥t”QñËé­. _ñTª÷u\R á¯!y…5%-&÷!b«ŠNïÙßm¿Ï7Z<Üq®¡è4Yøã]B7Ìþj±òÝ·)šþAû‹PÔcþSx/¾YŸP16ÍF¤coTÿœtÿœbÔ0oaüÏüß·qåù8O£hSU úý¤–dê–À}ˆúÉÔüoI“!™²è2å36_yEPD‹1¨Hã@UTP*°t•ø«±T·£i¾bÑïô fÝn´NÞ[KÛw­$†d(ëQ¸¨=Fã~gþh~UùÇþqÇ͇Š][òïQ”?SQð0?f9HŽáÆ»HGù9}AÆ|œÍ.¨ã>It~ò«À&kïL‘SE'0|(ªGÜsh5˜ë›·ÜuvÇ^ÏÍ›šý¶ùy ÞêWújÉ8{u«ªŠ775á>͹ØoAšÝ^qŠn«T' cµ='Jüÿ»Ðæ:æNy§k–„GtñÃéIËÆ[Yý6CãB}€éšyé;‹Õh½­h›ïêgz_ç徫ÄE®Ão#uKÅ’Û‰÷iUSîl à˜èïpöö“')ïÛïfVwö:Œ"ãO¹ŠîÜô– T?ì‘•C´Ç–3òD`fìUªéf¹c&›«ÚE{c(øà™­{^„v#q†2 ØjÍ‚bc0=ïÔ)|ßä `y¿òcZ¹Óõj~¢&á/ ÔÆ®ÿ¨i¼S å³7«¤ž/´½•"倨þiýõüÞÏùSÿ9­g5ÒyWó¯Oo/k±0…µ¨¡‘-Yº­[µd…v^IÞˆ30x옥c!Dt/­´ýBÃU²ƒRÒÓîKmwo"Ë ±¶á‘Е øƒ…©Š»v*ìUØ«±Wb®Å]оÿœ¬üÝüáÿ•…wùRn×ÊþV›ÓrY;ÆÚÇØ–{9ñ$2…Ây뺊ÐýbUPÿÅi¸=ϾušNÌÇ‹sê—ê|[¶½®Ôën øxÿš:ÿXõ÷l<™VlžU-ÖµÍ;@´7šŒ¼ík¼’7òª÷ýYF£S 1â‘v]—Ù9õ¹<|ùæ$ Ûøù=GiöwgvvžX¤N]D‡1üô}²>@³œÜ<+±Wb¬gÍO§Þù‹M³ô¹E…®B „‘Ôz}ªPuýY¯×†É8¹[Ó{?k³cÒæÈ|+âá¾ ‡w_·«Òît_-Z§šu[ãªy†þ>qEœ™yÔïµ:1nñÖàž<ñg.9ÉêûC«´2 ~ f‰#»¯ésç#ÝÑtë³coxa{vÌ2©WBz‚o±d㈕U¾o­ÓxeˆK„ÕŽE–8ÎÅRoË!Yþu~yÃäß0Þ½¯—ôøf¹šß„³ÅlªÍDÖ#0,ÝBMÀÎ?µsæ òŽÏ¸û¡† 'êÉê'îú_¤ÞXò§–ü™£Á yWL·Òt‹qH­mcµîÌz³Úv%RsZõ)Æ*ìUتRÓtýbÂçJÕ­b½Óo#hn­.dŠXÜQ•ÑUð_ç_üãgš?&µ;ÌÊZóÊ Ê]GG«O>ŸjÁ”’Ó[æÝã·BùFØeÅ‘á’_äo>i~v±2[ÿ£êpõËj²WöÐþÒßïÌižoU¤–¿.öY‘qŠ»{‘µo.ùÈ·ÞjŽæÏ4ßk ¨`d„Ôúq²Âíê9èhZe°""ú»]6HaÄgw"˜Aæ/Ê-jþ;kM-Ÿ˜¢ô¥¹ÓøÌѽÌ@p¨¬p)ñŸ뇊'vÁ›O#âKiw<ÓÏžl9yŠ}_ŠÔ*ÁgnÉd•åMªI,~y\åe×j³ø³âcYØ«LʪYˆ I;sŠ¡bÕ4Ù¤Cy’‚$ÈÌOÈãLÎ9ˆ¼X,–(¦¢™HœQÑÀe`{v8¤`úçå’µ®r%™Ónš§Ö±oHTøÆAîQ“sqvŽXu±æÁn¿&üá¡H×SÖĨ }"ïk#xhÛý‘`Ê:¹SÖ`Ì+,ûjO0þhùdñ×ôW¹~ÔÆFßñuµcûòb@¸9;E›û¹pŸè;¢ì7ôi¨5 )íX÷Œ¬È>gà?ð¹*u™ý’Í¢B^ý¿["³ó甯iéê‘FǨŸ”úe ?§7aêñóÆO»¹<·½²¼­.b|b‘\“‹®É†pú¢G¼+âÔìUØ«Ï?-?òcy«ýkÏúŒ_töWû¨Âã÷±bõ®Å]Š¥×šþ…§Wëú­±V[ˆÐü¨Mqj–hG™Ž_þky"Æ _›©ì[E#ÿëÿ ‹>ÑöÅ5Ï8*cÑ´‡‘ŽÉ%Ôwíû¸¹Wþ ‡>×ÚM7š?5¼Ì8ÚFú}³÷‚1j´ñJKÿÀ¶] 4åÈ4F§'-‡ÉJÛòÎþö_­yƒT2LÛÈ#-,ó–^ÿìNeóÏñG³å#s“-ÒüŸåí#‹[Ù¬“¯û¾Þ½|G-‡û37šäÜzXCOr÷!Ø«±W·yCò[A¶ò̘™ÚYùbHãž+["d’E—dY$Ujv)³{ƒ˜Y5G‹†w]—Y#. ÑŸ˜MüªÔ,Ï¿—ÑIaõ˜íY%{ŠÜ‘chÊ\3ü@82ž€ý× ÉÃ&83ex'½¼3Ý›±V-æï(¦¾‰yfâßX·Ñš¤Ô+¸¡û-Û1u:aXæáê´£ ±Íë¿•ÿóšiò<0y_ó‹I¹Ö-­•cƒ[¶à5M>ꬅc¸ ÿvVþbä×4ó‰¢LR‰¢)õ“ç#&<ò"FóeœÒÐ IŽŸqÌþ­Ð@íÿÙ² tõ%euWF ŒV ƒ¸ ŒPÞ*øcóëò+òŠO9]ëžRüÌÐü•æ[™]KB½½"Žw$É$fõ`äMLe­iÄm„HÃ8ÌÃ%üŠÿœJòÖ ó×™üÓcù‰,N }:E¸Ò–u¡i9»NW¨F ¿Ì­‰$óYLžo°€è00v*ìUØ«±V5çýoÉ^_ò–¥©~aIhžRHøê ϪÄÑeoQ˜ÓŠ$žƒ|æüáMÿ™È¼ü±Ôí4¹fîP^]¬Hyͬ`½â±÷*?`ôÅ–ï¼<‰¤ùKòå›þ^YéöžY¼.mJŽ4‚tqU“”`s$uf©ñÅŠ3Ì>Qò¯›m¾§æÃZ¶‹¡i Ð_uõU¸Ÿ1Wù‡þpóò_äñy~]á«Yô»ÛˆºøE+K§´x¦Þ3æßùÁsËË&µù?ç ÒPüQiÚ‹ i¤WŠÞ[qNG W‰T÷a€ÄmØuÆn$Äù0/&þiùƒFó ~^~lØÉ¥yš Ù.§Ñ-!ÙuÇ· Sà`GúÇ6š·‹Ûö7´ž!ós<¥úÿ[Ù³ ì]Š»c^nò–<ïkèk¶jóªñ‚ú*%Ì=þ éþKU}²Èe1äàk»7¤TÆýýGÅæZ;~uÿÎ:^ɪyQ}sÉ¥ý[Í&Ti *7&kZòCN³@Àíñ6ÌüZ‘.{ƒí/g3`¹G×.cÞ?Õ_“Ÿó–—šWÒu –|á%ô]ô«è\Hv¥­É ®Od`¯à\ÈyÂùŠŠ»v*ìUØ«±Wb¯ž?ç.¿&Oæg[Ì,§œ|¬²]Ùª-dº²§+›m·-AêG×â^#íœRùÌc_Ògjê6|b¹¯Wø$ÿdþõÎdz5~6=þ¡Ïõ¾ígb~GRLGîç¼|»ãðû©”fÅåÞùÕõMZ¼…®tkY8]D ¤¸jvø¿S¾i;V58NBâ9¾ìn^=>£OŽ\f.'¿jû>Ë¾Šš‡æ ]2iÞQ¶{ýBQDs,qûñjOz(Éeí^/NÄK^‹ØÓŒºéŒpKŸŸ•’˜ùzâçG‘tß2êés­j/êÃk^F/‡uä6Óa@+ök—é',g‡,îRéøüw:þÚÃV]& 8…wïμºÍ}TÊódònÅVº$ˆÑÈ¡ã`C+A¨ âEóLdbAˆ`Í ùkÉú”z­ìR\ë¡£pг2Š‚T oF¦Àl3Lt¸tÓã¾#·t^î=¯®í\9øp¹nx²WÀóîêNå+òí×›Tžsw-õŵé¶Õ´çaéÇ l%“(CP(íá˜ÚIçã&̈•J>]áÚvÖŸ³†ž1àŽ8Ï,ƒ™þPóÏ^÷¢G©éÒÏ´WQI<Êïk"±uCň¡Þ‡øøføf ,¾s=xÀÎPŒHv'qø÷w¢òdžëMæ/$ù§OüÏòdÆ gJ‘&—ˆ,>àK¨§(Ý+«ü§çœ÷lhI>$~?­ôïaý ŒcùL¦¿˜}ÿÃóÜ|»Ÿ¡‘ÿ~^üëò¢ë:w=vÓŒZÞŒ\4–³³/v‰èLoM÷âg<úiOÅÅ]Š»q‚¨=F*üÖüÍ´òv‰ÿ9<Öß•’ÄÚlä~™µ³§Ôíï$I ä0ðªðPB£e’ª)Çhdäãk€8M½1^YØ«±Wb®Å]Š»KµíjË˺EÞ³¨5-m»NNݽوQ„ -˜±ÈDub–’ߘ¿ó“Oæ=kS>^ü¾†fŠàÒ‰ñÚÁTS£Ì涨Ur££š†Ã~÷±^Ï¿<öœ4ÿ7j°_P~úx-gŠ´ß÷H"n¿ñfIÈây·˜ÿçÿç"?,‘ï¼›ª§›tx7ú­«±¸àõ²º¨ú!‘Û"` “K'0Ç<¡ù­©¨.yªÌè¾dÌ ŠñÆó©âb)'Ç×nß½vÊ'Ž6¯³N1ÅÃÒ²·XìUتS©yc˺Ác©éV·NÛ™$ Ÿðtåøá!¶çD†)}ù1ä;ʘ­&²cûV×÷7¨? Ê\¸vžQÖØíßüãþ˜Æº~·qnAª™¡IÈßü†‹$39íyuˆ(6üšó¦ÚgšhÙ¬—0v§ìÉx¡„µzyýXø¦/7ík°Ì®×rµHíû؆5˜h%Ïù~¢Ñò·çlCš^E#ˆ$¶5úÇÄ‹Éöqþ÷_­ƒhÒyêËÌšÂhÏÇ_ËÈÖ¶žMÑg{]E刲ÃBVeeãsVä«3ƒ×|„±3-Ë\ðÄcã3õÏߜڗô¿Ì}jËËA#ÓãxËÁ PÜ4jf)°ë°û&«Û6S#nÓG)`Ë›ËÜ—bª76–·‘náIá=c•¯ÜÀà”AæÆQb¶¡ùqåËÚµºIe!Þ°½V¾êü…=…3z[8“Ðc—-•´4þn~JÕ<™æiŸC·eiôÉ™¤³e,*$´”´{ô/ÀŒÀÏ£”ó»Q¡”ó ûÍó¿œó¦*y:ßü- ¬ vk9¤Q,¬€Jf¹ uˆž\ O‰‡Úçû82ÓÙý›—U>yèôoùÇ'ÚZ*ëWWZñ¼’7ñþB(-÷±Ì)jåÑí´þÊ`Œ}dÈü‚Oså>~@k çÿʽRâm2 RÆ_Œ5ºµLwQ'šÍXÉö…ä/éâØót]±ìä°êü“üÞÑ9ü•™ôÔšŒMõmgKçÍí.”V´£Ê6¦ãn ”òÄ=;v*…Ôõ=?FÓ®µ}Vå-4ˤ¸»º™¸Ç1)gv'°~u~cyç^ÿœ©üÆkKaù[å÷&ÙHàÌ„•7ZÏ0Nȫȵ9²ˆqÙ•-^JåõÇVy©þYùCPò³yN=:[”¶–(Ç­ Áh³ûEë»?C×5ã4„­ôLÝ‘‚x|.Nð{ýÿz3þp·ÏúŸ–üÇ®þCù¢pÙç¼ÐØÐKåu Uê²!ú º;~Öm#+ù^«O,9 %Î&Ÿkäœwb®Å_7ÿÎc~Si^tü¶½ó­¼ šü¥ ¼†ñ@WšÁ·HÝÕT´©àÃjrj©ä”~d¸óGôÍBõÌ—ð‡³º‘K½»pIêY8³{œÔç‡ ‹ë‡«9ôÑ”¹ÁœeNÙØ«±Wb¯ üßüµò=Ɖ¨ù²çýÃj6±´­uj«ÆæC²$’ªÌì@ šÎdàÍ+›ÌöïdéÎ9e>‚:Ž¿7´ÿÎj¿šZï“õ-GÍÚ¬×ÞJ†E³òâ_-É–/ïÚ9ßã0 ã«rªÉórú«;v*ìUØ«±Wb®Å_œ_ó’¿–~HþfÅç_/[ò/™äw0Æ´ŽÚå;›@ûØÛUFÈs+G©8r ]}Ϋ¶û&:ý4±|â{¥Óõ$µÌ–ñ][8’ÞeY#qÑ•…AÎÚŽEùÿ> ♄ÅJ&ˆ],QÍE2,‘8âèà2°=ˆ;& Š,1ä””Iu V¾¿³Ô¤òד4t´¼uW¸¾XR4û† S·&ï°Í6|²ŒÎ,£ÔÓÞvv“\WÚÌà ‡&ÇNÿ€÷“I—¼g¥KúGRê:Ëmq-YQúÕnOùG–di;68ϽRïu½µí^]L|,#ÂÂ6áGtò{ÙflžMØ«±T.£§Yê¶rXßÄ%¶”Q”ö=ˆ#pGc•åÅ‘1°\­·.› ÉŒðÈ0ÝF=/òóMxô»w»Ô5Wô£ŸS‘QѨ rû o\ÕfÑ .Sï{=õ»œÒÇ„YáÚ½Þf¹ô¤–|§yåÍV×UÖE ‚Hœ»Ë(Ck1?  ¯$xl7ö­= °LNuUò.nûE´4óçãâU ãRzöòï5Ò••”2TŠ‚7ã:_3 ƒEÄ" ìAÅA¦kyæ_É¿6Úþcy SÀÿé–G‘ár ÌŠG(^?dЊåûO³¼?\>ž¾_±öd½©üÈ3ŸÞ¤ÿ;þ=÷¿E¿'¿8|­ùÍåhüÁåù=èxÇ«é077W‹Rœ‘¨LrF F•îÈz(Zî‘£I#gv *¨$“Ð Uà_™?ó˜”~A3Xé׿½v*g¤2½²½iI/§ÌŽëŠ@|ÍæßÏ/ÏïÏ$“OÑ£Oò]ÍUÒÑžV&¨¤·ŒÒ‚ aUFý¥ÈJ`8Ùµ˜ñs6{—yòãIòLM:9¼Ö&^^ºñ¢Ö¼#Zž+ã½Oá”NvèµzÙfòÌ‹]×´¿-é²êº¼ÂH¨+J³¹û(Š7,|?†D qñb–IpǛέ¿>ü³-Ï¥qayolMôèEÅw]‡\UÄ%XPˆ=AÅ]Š»v*ìUØ«ç¯.ÿäÉóoüÄßÿÔiÍ×fóø>ØŸHþ¨ý ÷7@ìUتœ³CòšE|]‚Ç@A sYݤÍÂã‘ÿ•XýÀàªäUð²v*ìUØ«±WÒ“·Vÿ™–:÷åf§ 7ÖQ´º[¾åc‘½H˜w¤SÿÉ`½3[©A0êucÂÊ2%ù'ùqæû>Xk3YO§iz%˽íäècVxy#Ao¶K|-Çe¯jݪÏ9’ß­ÔC€‹²P?š}Où\Sù³ÊÓ#*[hí®“t¸{hÂHI_´Œy%Aø—%§Ãû®ue¦ÁûžuLüõÿ9æ¿2$–\ü?¦>Ï$OÎöAJÍ@¨ÿ(ä1h£Îå†ÏŒw–åã ÌÌY‰,MI;’Os™®Á¬UØ«±T«¬iú-©»ÔfGÑW«»*/Rr2ÆË^L±€²À,›YüÜó5§–´ðl´º´Ó7ÛôàJsšZ ¢¯J+ß4zÍiòptøç®Ì1Çaú;ßUùgË:G”tˆ4] ¤"¬Æ†Id#â’Fîǹú4™‘²úVGOŒB€û|Êq‘rVº$¨ÑÈ¡ãpUÑ€*ÊE õ{–~Cë¯ù'ÿ97“g—Ðòœ¸Ú®Ԍ4ÅžÁÅz•—•·û#›l3â¾OÛ:Ëg”.cÜý Ë]K±U’Ë<Ó:Ç j^I…UU,ÄìN*øó÷ó§YüþóBþSþZHËä‹I‰Ôõ O¥¨<.?#-io Ä¿¶Ôn¼†Iˆ‹.vƒC=NAsû‡{0ò‡”ô¯%èphzJR¾9¦`=Iæ`9Êäu&Ÿ@ è3U’fFËêÚ4ØÄ!ý§½=È9o üÜ:‡åçŸü­ù¿ ¥.lî¡`l²Kly*¹¦‡œMþJæ~’{SÂ{Y¢©G0þ-¿§Ù÷?Eü¿®i¾gдß1èòúÚV­m휴¡hn#%GcC¸ìs1âÓUØ«Âç-¿14ï#þNëZl“­ù¦4m2Ô5D¸.¤ oÁ!-SÓ‘Uý¬R?~Ihsè_—zj]!ŽæøÉ~èEYÛ÷uùÆæ¯Q+™}OÙí1Å¥ó—«çËìzPîÝŠ»v*ðŸ6Ǭ~y~hé?”R:ÚàRõAh£h«õ‰Þ†…`Jª¹9ãÝsc¦ÅBÏWÏ=¦íO'…é‡?9~ÏÖýò¿–´'ywMò¶ƒ·Ñô›xím"Ú¼S“YYÛ»s)äÓ|UØ«±Wb®Å]Š»v*Ä?3¿/4_Í/$êžK×½üu¶º ÊKK¨þ(n#éº7Q_‰j§bqWæž‘o®~]y³Sü¯óŒWÔ¬'hà©% Ÿ‰}64ªJ¤I÷ñ9¾ì}m\º~§Î½¹ì8þkÜ}~î’ør>^æm#åMb¬oRó¶a.fã~ƒˆ‘Ôý]%eª,Ž7´©¦Ù¯ÍÚ8á# ßì¿7¦Ðû+ªÍ†9ø} >³¦#îïDy^—T{« Bk¬X0«rFW’D?ÊFY¥Õ— ”yþ·¶{":a ¸¥Ç‹%ð“±ÛœeæÜÌtNÅ]Š¥ºÎ‡§ëÖ«k¨!dGFèÜ]w ·ì¿µã=`ÔŸIt—‘þ—ßïçï_É/ùÈß&~phRÎfEó>›O­h×éEøî!‘¸ó„u-Õ:7bt~CåÎ/ο7ÿÎBùªçÉ>Dº—Lü³²b—©xÅú§Ö.©Ä”j~æÜüÛ³Jšuˆá•/,~VyOËJ’‹a¨j+Bo/†Ñ>Âûm_|Ç–B^>¿&N´<™¶AÂv*ò­D¸üÔüçò§å\´vRÍך?´ˆènnd¡)lœ–¾ù‘ˆmoAÙX¸`eÞýÔ(?,5o,Eäëÿ*éÒùzÞomkõtVB…åËIQöÞEpÇ©9k²·Ç™ÿóŠÞü£»ŸÎ“Ww:ß—V¯w¤0ßÁîCD -Ê èQD‹ü§vÈÊ °Ë†H1Ÿ$~khþhá§ê\tÍ{ì›y‘LÃcé3w¯ì6þÌyã!Ðj»>X÷‡ ä{±Wb¯üøY­ÓËz¼`0²¹œP׉wH Óþ1» ¹ìyo!îFhÿ^ÿœ‚üÇ×2¼ëÎ}"„Z~œì}8ãµ½¨ãAÂ$ ¸æÍÈדW{Ùz!–FRä>ö}¯¯8b#ª_`{m­­­” mgvöÑŠG (±¢ªÔF <|¤dl›)»ä/'ù‘[ô¾o,ÍÖåÑŸþFÅÅþó”fÑâÉõD985Ùq}2?¡ãvü›Öü«a©j>HÔnfÑî!)ªi~£$¯l¬%*ÞdVPÜYj(ç4ZÎÈ0PÜwuz-mŒ„G £ßÓö2¿ÉVÂ÷É6Ö„‹5åŠî6¥CK#L’ymò>Íå´vž22’z½ ëÞùSåIÚ;ùŒü»£r–?P|3OåZªžÚƒÄe˜ãÔ»œÞKéŠeùëm Ûù{Ìö«ûFÕµAó]—˜àC4PóŠîØ7^ÞUâé_Œ¾àeY±qÆšuFH˜²¿=~~y×Îpͧ[ºhº$À¤––d™eB(VY̓Ѕ êU‹GoÌ´`ÐÂó/,̧5Ø«±Wb­3*©f ($ìÎ*Ã5ŸÌ X&o—á:®©+âxýF4U^¹'²ýùƒ›]í˯ϯŒvŽçì{_äïüáÿš<í}œ;ž};Jø^Û˽;ë…ûAgãþóÇãýáÞ¼çW<†f˧˚S6Kü•²´Ñ2¼û¡E­Ý”óÛÁl~ÔQ[^Ɉ+¿Âx˜ÎAë}ñ&:Ðû÷ý{̼v*ìUã_óž[žãD°ó–™Ê=O@™KÍC¬8âàëHð©9•¥ïy_j´\x†QÎýÇõÛŸ“˜ÖŸšŸ—œ t7·0¬:´)OÜj—T}‘Ëã@a”÷Í‹çe›^^Ziö“ßßÏ­¬o5ÍÌαÅQ©gwv T“Šþx~yó×^ÊÏÊI$‡ÉF©ªj”xN €Žo! 4vËÐ&Í'q¸\„æ",¹ºMFA þï2È|‹ä]ÈZ:éšbú—Qﯜ-Ì u> ?e{|êN¯&C3eõ.ÍìÜz\|1çÔ÷²Œ­Ø;H<ëå{o8ùgPòýÅ®c­¼¬?º¸OŠ'Ûz´ê*2xçÂmÃí Ôa–3×—¿¢þq+óÖÛÉþ§äæLߢ®¬®dO/Þ]0H•årÏe$Œhµr^û-È­~Åvñ ‹‘gÃ,r1¢9¾ÜÂÒóÎ?Ï_$~Lèïu®Ü­×˜&›Lòý»©»¹nŠXoéÅ_µ+ uâ¾RâM:ÇÎ?ó^t?™ß™U_/!¦—¦ ¬bRÞ;ˆTï#ä5ëRF.|ü;oSØ=„s‘“ ôö_±îÀ€lÍsè®Å]Š»y·ç/æòG—Mµ„”ó¨+.'â:I9äÖ‰þWÈåú|\GÉÑv÷j~[DúåËËÏõy½Óþq'òI¿,|–|Ëæ~xó:$÷bAûÛ;#G†Ø×pÇûɇóQOØÍ£åÒ6ú';v*ìUØ«±Wb®Å]Š»|Íÿ9wùÿ˜~\_>yVÜŸ<ùr&gŽ}]BÂ2dh”.æX^*n~%Ü•¢ )Š;‚ù/É>hO1i¼g`5;Påzs¤À÷ð?Fv=­ñ¡¿Ô9þ·Ã}©ì ÏqþîO—ô~<¾,£6/.ÁüÏ êVÓ]_y~º:Ç}FÊThBÌ *VŸ¯|Óët³‰2Æ/iÒ÷ƒÚø2FõR0ð.Xæ 8ò7± ¶Ômü޲ÚZ7é4\[¢¥ž!A#r@íR™… £K`zò}º=}ûd‰ÌxhÙ!)p¿Åݽ#HÕìu»$¾°•e‰¶p+Tp*T‚¨ùfÿxåKæ½¥Ù¹tyN<¢Þ;Ñùs‚ìUت[ªè:F¸¨º¥ªÜza‰du¯Pj{W(ϥǗëì{;µõ:2N˜ß>D|†¨iú¦ þSÒ­Nå«>2^OOïë¸nUø«O†§µ[¥£. dŸƒÁÏÏñý¯o£í,:l#]š~>£&ÐÍò®ž{u¨ó²ËÞkµÐ5[½"kæºòŰÚÝ«é½FÕ‰wòïJŒ¯I®Ž˜^1È×êr{gÙìší<3dž¢{Ê<\ÆÿÎ<ù{®‹Ó!š+ˆ’xI Š9ÕYH¨ Œèc EŽO˜åÅ,r1¢6!S žù³ÈnZ]cËE­ï È.-"%©"GƔ䤫'FŸ=hvOÏ>ïÔú?³>Ùœu‡Rn<„û¿­Þ<úuò—~EjºTº ΋>†¯i+MzNæuÑ$@àWµ+ûYÉæÞÛµa.!+°y=_*uNÅ]Š¥óˆúió7üäG›¼Ù"ó¶Ñm/Þ^´–yÒÒ¾—2à(=nš8¢<Ÿ|ä›]м ó·þqOÈß›¾·¦òçØý)mô.Ü …Ü+@ÄŸ÷jÑüyR˜¤Ⱥì_œ—ñèÿ˜ÚTš—KzVz´le‚EoBê”&Ÿî©@Ê¥ŒQÙÐɼv,çË~nÐ<×mõíeeÍlßñ¯Ü|ÆÞ(”HtYôóÄjA<ÀÐÀÿ8tÁ©yùè ¶/äUñFàßðŽÙM,Î×’ý~hß?þq~kÿÎMÌžZÐtÖò¿åáukÕò$üX×7%cõ(G$‚5»µh™DFí]Ù9µ2¨ºË z’¼“¢ùGM+HŽ®h×wŽ­q-7g#·ò¯@3Y“!‘²úggö~=.>|ORÈòs±W›ùûó]Ñõ[o-ùJMs_’/.Г"A-ÅXÙO2vÝ…6Ù‹S/ňr4iö¦LsðGŽugÈwTÏòóó#Jóí‹úkõ-vÖ«¥HÕ’2 9¥@,•ïMŽÇÞ9q'#²ûZ¸ÿ6Cœ1?*ô/ÌYÏÔu¸W¾¥j$«QÍ|7v=pâÌaîaÚV,úd?‹õ÷±+ +þrƒËö åÍϲG§ Bba‰EQ剥Œ°XÍe\^F^ÉêA bG¿ö*ùcò"Ùu'óæ¥'™uÉŸÖ™%y$…äþi¤˜™&;~Õˆ9NMQ<¶w}Ÿì¶rÒ4Ç×<Ó%äʶд”’àU#—öX”5 ™àƪ¶&ƒÁdÇž33#$#Ç;;èîø>ò.³®ëþY³Õ<ŧ7R˜P«Ë(Sº‡ê“·}ó $@4Ó³säË„K$xdñLµísNòÞw­ê²zV6q™$?´Ç¢¢ƒÕ˜ªTÕg?¦,¢ZEcy3|@…û0ÎOÃÙ$Ûj Ëôú‰b˜”\ÓììzÜÓ‘ëÜzîýŒ?HÕ­5½>FÉ«£u?i}¤opsµÓçŽX EðÒììš<ÒÅn>ÑÐz8€À©ÜB=Ž\àƒ[°mBo#–Þ[Ó$ºÕõGt†v@»òâ[®Ã¢íÒ¤íšl±QX£r“Ýèòäí™êóbÂ1å~uçÔùС¼¿y¤y)íõÝAN±zâk˜!VC¶ÊÞ˜ É?†CK“’^©nk£“ÛmOlÊ3Ób>1Ã"˜³Ëo×¾ÌÖMcL‡O]VK¨×Np¬·¾aOlÛD8Éô÷¼D;7Q<Ç9ðõF++¨t!‘€*ÀÔw–ƒn¢A£Ív(v*—ëzgé.çMõÞÛ×^>¬}Fõ¡ÁèøÊu8|XÝ[°ì­å5ÍÂ'ÂyÇ>ãа}fÒkd‡òûËv…MÂ,·×²­%E\±ë¸Üöû#4ÚŒf iñ|ÏãñÑî{3S†]©«ŸÒH„ä{«î~¢Î´6=#LµÓbbél9·V=I§j“Ó7Z|#GGƒí-tµY瘊37HìµÂHõï5èþ_¾·0{ªU-#!¥cÚ£öG¹ÌMV»¹ß»«¼ìgµ:é5²?Oí÷9ù5ªYÏç½NòòEµ¼Ô ˜ZÛRˆí$É3Op£Ç|áõy É•s6û.£HpéaŒ\„îú 0Ý3±T§ÌÚÌ>^Ðu fb´…Þ0jZR5ÿdÄ 1[pb3˜{Ðÿç|¥6›ä0yÎé—ÌZ‚[Û»T™-´Ôeæ ìešU>ë™\_Zâ‡b®Å^Sª~s~Lk>pÕ¿'¼É¨ÙɪEéÛ]Øê‘ÆÚ}Ü’ sn²IÊ&u¨VG¡å°©Šiâ™ßó„RÝËæOÉ]¼¿ª©2¦‹u,ŸUåÜ[Ý%eн•ÊŸ´«€„$(‹ÔüËù¯ùK|š?æÏ–îÆ8u ¢Z þêâ*ÛÍAÙX•Kèësö\%¼ ±:½óÏ’üÙåmZÚßV†¸²¸F‚å„#4D…ÈäAþZŒ¬@‚룥ˋ$IP¿óŽz¨¹òÎ¥¤1¬¶b`<"¹ŒqðQ¾v‰’ñ˜÷½§Ú U’2ïsÙstèб_Ì8Úù'Ëw:¬Œ óƒë-Çoå_´ÞÃÆ™‰¬ÔŒ02ëÑÍÐi|‚=:ûžuùåû7Ë÷ZÝ╟Y‘^>_hÁ Œk¿ÄÌÇÜPç–V]ïjf˜ˆþ©eN­ØªomæzÓGŸËðÞ¸Ñn+êÙ°GŒÔ†$r©¨¯ÂF#TÚ3ÌG†öFÞyßY¾òµ·”&XF•hé$L‘•—àä@f B jŸ‡®#TÎZ™t o"ã³ï1yïMÕ¿/ôo(YÛO Þœð=įÃÒGŠÜhÅ·g®ã')ا;.¨K`á€äb¯¼¾Oü¬ÿ5-v3jDq|¿×7=›õ|?Sßö'!ýQúƒ›—¡cº?™SòÛó¿Ê}¹%4Èn"Ò€j°8kK¢8îH‚ZÓ¿LÔkáS¾÷IÚP©ßx~¤Å,SÄ“Bë$2(xäBYXT2‘±t9‚ësùñùž¿”–𝛢U—V,´h$G¾¹ªÆXmU@FÜ)¤Å–?”²yð¿æoæÄÚΣ­9»·¶žFý걨šr´$7û®5¢…§cAËö·lÊ8ñí\Ïê{Æì8Î&]ïý%ïún•¥èöËg¤ÙAch´ ´I ’€ å²d”ÍÈ’|Þ·(ÀT@Élxüäg,µo,Éç->Ýc×trs4kÅç´,ƒ‘ÔÆHpOE 3 ìt¡“Ã'Ó/°¼ß´:ÏŠª?hýŒÊš«k: ìÊã§9îdŒñb~tåôç©éòqÀQ¦ÉÇS¬¹½Ø«±Wb©f»®Yù~Áïï "¼b‰~ÔŽEBâr¼ÙD–¬Ù†8ÙTü¿üŸüåüú y§D¾_òDŒUµ[²ñ[È Â%Õ¸;ðN¢„®iòê§? èóë'? ûò³þq+ò«òÙa¾¼²ió"Qާ«F’EŽöö‡”I¾ê[›ƒÑóÃ%ï€t¡Ø«Ëÿ5?ÿ-¿(`dó&¥õp¯(43ßIQPY*5?Í+(=ªvÅ 3O+y“Dóß•´ß3hÎ.´=jÕ.!æ¬r­9pMQ×±b‡Ï¿™Ÿó„ß—¾n»›Zò]ÜžMÖdc)†Ú!>šÒ}ª­¿$hªßN{&,„ˆxΩù%ÿ9_ùkÈèÓÇæýÀ¶/€è=ÁÅÉŠ¹L°DôvúnÞÕbØL‘Ý-ÿk±üúÔ´=DhŸ™žYºÐµ!gu†X] hKÚÜ Ù˜ûf<ôÅèô~Öƒ¶XלWí{6©Xêö0jzeÂ]X\¨’ ã5WSáôìGlà ƒEëñeŽH‰DØ(¬ ŽÅ]Š»`ÿ›ï˜ü½å »ï.Y©HhîÎB 諹*{þÏÚ;—`ˆ2ÝÔöÖ§.Xã}çù£¿ñÉãš”®´½IüËü¨¾—SÕ­£T×ô©©$’HÀã  JþÆäŠ2šÓ2e;&3y}6†PÇ N–FR\~ñû>!íÚ”ôI5H¼ùq¢ /ÍwÖÊ.á2ôd~óìÑK‘ð³R>g1%3\7³Öi´XÌÆs’ù~ß6[•»'b®ÅPº–£e¤X\êz”ËociMq3ôTARvÜŸ78@³A¯.X㉔ðŸ>y÷Ëúúèþ{ò^´¹å© ²è·.öí5´¤ BÄô ÔÙý2~wøFfbÄEÆCbò¥ÚX²ðgÃ?V?á;Xë·ß]=̾_ËŸ"þf]Ù~az—-§ \ÚÅ*¬7>T 0âXà°Ýr¯Pô»9vV›[!¨ßÔ‹Ø×Ü^ F€4lÃ1Þƒ“Â/`Öÿç#ÿ3l?-|¡#'•4ù ú¦¦£”KL{¶èP}8¿7Z6Û->g›æÞÐö¿æ'ÁèÚ{ÿSôOÊ~UÑ<‘å½7Êž\¶º6• ÛÚÄ)Rvw NìK;~Ós%æSœUØ«±Wb®Å]Š»v*ìUØ«±Wb©~¹¢i^eÑït rÖ;í#Q…í¯-eI"PƒÜàÁÜoŠ¿33?/5ÏùÇÌ 4»ŸRïÈzË4ÚMñó€5(Ä ¡¨Yí â›Ï×ßé<ÿ[Î{Mìü{C§l±úOûÓä~ÃñNaš+ˆ’xI Š9ÕYH¨ Œìc EŽO…åÅ,r1¢6!}ÝÓ –Û3ËZ¦´|ݧµÃÝJïivðúÉ21f*…¶Ôwö4¦sàÁ9øÑ»;»}S8ÏÚ}?ärˆˆ%.¶æ·¡ûEÛ¼­äûÝn{lÉn]ì4âH.$bõ=S^½[åƒE –P ö€åûAí.-¥=K<¨O'u ùùr÷¨GpƱD¡"@@ ªt:0,œÌÉ”“̯ÂÅØ«±V¨+ZoÒ½éŠÛóœtŸ.Jv3ß‘U´Šœ¨z'e¶`êûCŽç¹è»ÙN¿xŽ8òøwýÞhŸ'~\þ{þsúsy[HmË3Ÿ‡X»-gjPþÒÎàÉ(íXûç=¨íl¹6‘åúßMìÏc4Zj3,»åËý//¾™ü¯ÿœ#ò•¤‹VüÀºo8k`‰>ªêÐi‘¿SX¹š‡¼Å»¦k ·« ‚¯üäßüã*yîÎ/;þ\@–zÑ¡Eú°&£ol D‰ÇˆI¢‘6Õè¥Tóؾ?›ó‡Î/a— ÓÍ¿›ÒSku<‘|uO†ž„‚‹%kêré¿ÃiÌ¥C{u´8pñdÉ*„Eû¿7/ž?5|¦âó[EÕ4ÍŒªé ^¿¼€SîÕ\ËÔv^LbÈÛÉÕè»K³µ§ƒê]ÆÁ>ëçðÝ6ÓÌŸó’>sÒ|ƒåxÆ™¥Ð]êÜ:ŸJ8è&À#ŸÔŽ5݉ޟ³‡S¾Ñè†'rý0ò•´$ùgKòž¡¤iékj„ÕˆA»¹Ú¬ìK9îÄœ±ÌN±Wb¯3üøüÕ´ü üºÔ|Î̬Ê>¥ Û>þµüÊ}2WºÆ‘ý–HÅ ??¼¡ù<þyòåך<Ï}q˜5¹žòÖì䉳K2¶ïê³ê (k¾nô}”2bâ‘¢y:wlœYxbŸãÉ›ù7ó·ó§þqÞâ 'Í7›?/•„q,Ò»úHNÂÚì‚ñÚ)A^ÊÚÍ~§E“ õ »Ý–“]‹8ôûº¾¹ò/çoä×瞘Ú=µÝ­ÅÍÚñºò¶¹IrÕܯ¡7(æÆ"àw¦b9”Ä<Ëÿ8Kù!æ æ½´ƒSòÿ6äöÚMâ =h—‘\qÈ@ðÅmóåÈ¿+?ç!<ÝùujÒ-}T±YO)=±ÞÚ—j ‘Кo›~ÆÉYHï›·qñaî/fÎ¥ãÐÚ†¡g¥XÜjZ„Ë•ª4³ÌýTŸ`:äg1IäãÆg!¹/mWQüìó›êº‚¼OÒÛ„PO‚µT~Ü”å!Õû9Äö†¸å•ôèõ¢1Ñbá\¿gG¹ÇpÆÄ¡"B"(UTP@j16¿;v*ìUØ«±Wb®Å_:ùÿ&š¿ã6§ÿQË›žÍú¾©ïû”ª?Cгrô)'štüÅ¥=BÝ!õ-e?³ ±§Q‡Äuqõ8´ßÃ2´WãB¿œ>÷_^Kþl¾çÊÿ•Á‡—f,j Ü…}‡§ýuÏbÐ}‡ìïîþ,Û3\ô£¬izJzšÜvâ• íñ·úª*Çè åŒy–¼™cf˜÷ü¬¯,zÂ?Rn§­èžÞ•åÿ ˜ÿžÇn7ò†;êÊ­î »‚;›iX%PÑȦ¡î3*2Xs# E† ù£† .ù£3Y[LëqH êq* ]ÅB‘_|ÀíšÖö”MýBüºó_–<ëä½Ì>Oh†qmÚÛBE§¦¡ ³"Ð#DG´Ú›mš§HÊ1Wžþfþvþ\þRZ ¼á«,z„ˆ^×GµX¿¸§TŽ öy §ùX¤É>gÿœ™üîü踟Dü¢ÒdòÇ— æÕU»âz™/X„ÓâáõflÄÕk±`3^]\í'geÎj¿>Ÿ4¯Ëÿó:?Õo.üë©Í¬yŠý%çq¸Š æSYƒ9ç+†<¹I@{®s:Ÿh§) PüÏêünõš_fqÆ'Ä7":r¯ñ³.ÿœ:üÃÔ<‘æícòÎúlgšã@g?Ý"óš'~3Æñt Ýó«Áš9`'Eã5Zyb™„¹‡ÛÙsŽìUòoüæ'ç奷•¯¿.ZÎÏÌÞz¹”1qYBHâŸXiWtœðF¦»ü̲ˆy÷ä×—u_-yÊÇYVŠòi%ºú³ý«t˜Õc#± äGbNjµ–Ϫv–xtÂ3æl×u³ü¥Ü»BÞjzvŸ%¬7×Q[Ë{(·´I]PÍ1„@z’L ד4 @‘ˆÐó/7üâóµÞ‘å›DòÕúC.§ú6}V'V[@œ„ÚŸ…Á=À Ðåø1ÙÝÑv÷hKáʸ¥ÃÅÝßñý¬>ûIÔÿ+|ßåC¤yŽç[·óÂ[jZ}Üž§ÖÙ#2ª‚A?ÂNàŽ¬+–‰ ‘6*fLÐçÅÁÌd4AëË·û^¥åŸË/ùK̦½¢™ šª=\‹XwäÅ#ž•¯ÂÐf<ò™ Ðé;'Ÿ,²BÇNƒñötfS³v*ìU/°×t}RòûOÓïb¹½Ó$ßÁ†x\ŠÑ‡áóu$bCN=N9ÊQŒ1çäñ:ùãÏ7÷÷³y^ý4û =It='LÉ=Ʊz¥}b}U D ýªñ¥;œÊÇŽ oÝ~ç•íÑÔÎDâ—àŒjÌåןEo)iÞBü׊ûOó•ÓIó~–Æ=PÙFöËê(XFÃ--6¼J91päÕ[}ßq{…¡é¾[ÒmtM" …šp‰:“½Y˜÷f$³ç1¥##eéôÚxa€„òÍïèþÒ>LÄ€À« ©Øƒ¸ çNù$ 'Xò+Áy»äû—Ò5»WYà0HÐ…‘ CDèA‡jmòÍ&·±ã?V=wOØú`ûq“ cÔÜãüïâÿç}þ÷½þQÎijzÐyKóÂÒRbãyš¿|«Ð5Ü?x?âØw?ÊÆ­œÞLR© /ªiuXµÅ!(ž¡ö†‡¯h¾fÒ­µÏ/_Á©é‹ÎÚöÖE–)CFRwfAØïnLqWç?ç/œ%ÿœŠüíML˜Éùyå3$K~îeGêåH¨&wQD°ªÔûY™¡ÒøÙéÕÄ×êÆ F]O/{Ô"Š8"HaA1¨HãPª¨ € ìÀ§ƒ$“e©à†æ·¹f‚PVH¤Pèêv!•ª8¢¢D,óWäG–õiÿ˲¶…©ƒÍ5kbàÔN §û.ju=Ž{ÇÒ~Çu¥íÌÚ~¡ö£¼µùÙÿ9%ù3ÇMÖ >uòÄ_ mv%¼dAþû»÷éØ8`:š<ýŸ—1c¼=Ÿ´°åJqÙ#Òu4~m~wÞ~ljšèVB%V€óôù%ˆ±HÕäD26;„cÿ=Žbêtà ±ÍÃÕiFAc›Ú¿-¿1î¿ç",¼Áÿ8ûç뀿˜ÐÚ´¾ZÔî¾½—O"hÒfëë!JHÀUâ䯥X¶”Š4]¢bXÏüãçf¶Šëò³Ìêö^dÑ&¸ŽÒÞàp¤n}krüâpÛ/O²síýŒ¼Xò<ýÿµí½œí(x2;Ž^ïØ÷œæž¥Ø«Ïÿ;õÑ¿•žc˜4°Gl£jŸ¬Î7˜œÙvD8µ0wòê»k'–gʾfŸ)ykÎðhº-¾“ga-æ¤Ï!*U/#ž!iÉŽÔÛˆÏPëáU»Ã`ÖŒpª²ôß-þQÎFþfm3@“˺D»}{QMŒ)èÃ×á‡ùQFFW“Y9y5d×Î]kÜ÷_"ÿÎyfÎDÔ2¼Ás¯^’[ >¶–¤íU’wå4ƒÝ}#˜¤Û„fKÖ<ãÿ8ãù?/åæ¹¡hþMÓ,®¾¡tl5m£úü7) h]n䬯Ž£ICѶ'[àOÊë§—C¸¶v$[Ü7¦쬊ƒý•Nmô¸Ü]ïgJàGqf7¶VÚ…¬¶W‘‰m¦^2!î?ŽfÊ"B‹8 <–šžtÿœoó= }_ò÷R˜6¡¥»Q\Ó8Ø‚"GíÅÀôtz9Æ|«JqŸ'ÜúÇç—oÿ%uÿÍ!ÝG©Ç§é÷A Š=½ê¯Šê*òR®ÊY{®êH æ;‡O‹(ÿ-m¿2¾³ù£ùy.½¨êWS:Á3’²Iqi.¡;Š$bŠt"€s=³Ú³Ç/wŸÔõ½…ØøòÃÅɸ½‡ë}kikco”ÛZB¡!‚XãEª€ùg')&ËÙF"€ ­‘dðùÈ?)êo¦~kyYžÛ_òü°5Ôðm"¤R‚àS¼RlOòö\é}Ÿ×pË—#ËÞò¾Òh8¢3G˜Øû»þ®¼ùéäÏ5~TX~gëz®‹eÃÐÖEÄʉk¨Âš ,I?J>&FSMó¯xŠ|Íù©ÿ9_çÌÝBo!þDZÜÚi²ƒטJ˜¯fŒü,ÑÚÚ/ø±¨v§±Œæ",¹ZMLóဳøæ“~]þKéRtÖu·¿š õ ÂÐ[¹Ü˜•÷-_÷coà5Ùu[O¡öO³øôÕ)ú§öwëûž£˜ïBìUNyൂK›™xU¤–Y*"(«31Ø:œ@D¤",ìƼéggùÝan|,6zÑMªÝ$ÐVˆ½ `*A`¼ªžw̬gÂ>®¯-ÚãÚq‰}FÇNŒ7Aó•t+Ý~VyÛËW[Kå‰íì¼·HáEÊ»1"E_³Çáe§„Ó-”$eų«Ój°ãÂt¹ñž..œÉþw¿ï÷=sÊ“ÞOòv¢º½¹¾ÔcR¶ÓꤦÝH¡ª$j *A#¶cdÏ) z]a`ÓÏŽ7#Ó‹§»`Ïò—rìUØ«“Ît>r‡ÉSE,ZÍ›_[NáD3*±45$° Ìvè2~áâp޾P0l‹Åç~}ü¹Ö4=Y¿0ÿ,Ù­õ´f—RÒãþîí !DØÒ¯íuZ7[ñepË“¤í.ÊÉŠ˜Óm/âã¨ëÓuo9¬4?8ùGS™ü½,Ð\ÛϪ‘I:'2¤ƒP@øj¦£cB0ÿvH"Áaêí(Ã6pO ƒæôï(yb)èii3]Ýò^_È Ks<²4²;nNìíASLÇÉ>#nÿC£|b7g©ï<ØŸæßælEÒþ£§2Ëæ‹ô"Î-›êè~]רý€~Ó{–`ÃÆ|wnvÀÒÆ?\¹yyþ§®Î(Î=Ïäk3ù™ç¸L¿˜:Ò3ÚÃsV—M¶¸ÝËrÜ\LïU_ƒj¸;00œÌ‰$Ù/¨p°v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]м£óçò;Büìò©Ó®xYùžÀ<º±Â­ ¤o”ÜÃ%uí³ Æ)ùõ¤Þë¾I×®¿.¼ûnúv³¦Éõxý~ªzªÜ20!¢phTŠS:ËíXæ}Çô~§Í=°öZïS€yÎ#ýÐÿ}óïfùÑ>^Ǽßå×óš±[È"¿¶ZÕÏÙä “ØÁ×é§¥ÏÇ”)4ªà׉fPTPôVÍnÄðÄô²ú?ürDe˦1?Mýáú³ jšn·¡išÎŒÈúF¡kou`ÑÐ!·š5xø…Ø$tÎmõ4Çv*Â?8üÆ<¥ùUç0úž”ÖzMïÕ^´¥Ì±m÷÷•Ôb¡ù³ù[ièy~[¦ÕòŸBÄ6u]‰Ž±Þ_öÿSǬÁó6~êg¸xgb¬UÒu?ÌÏ=h–žZeÔn®$œ¯! aÊGb7 ažJ~±œÏmjD¤ :s}oØ.É–,RÔJÿy´Gëñ<¼½ïÓï$y?Gò”ôŸ'húz^‘n¶ñVœ¤oµ$¯OÛ‘Ë;û“š7¿x§üå÷çü«ËæòÞqéù»Ík%¥±CûËkq¹¸ÛpH>”g¯&ä>Æ)àß”žIMò¼Z޵©q¹Ô ûIQû¸Ø¿ùE³°ìÝ/ƒ~g›Äö®³ÆË·Ó‡ëgÙ°uŽÅ]Š»v*ìUãZö»¨~Q~zh›²éÍ©h‘|2F‡Û´{£äAÄnd–Äü9~ØÁ!“¡zþÃÏbàêmyþr#ò{ó8F‡æ‹[}FP£ô^¤âÂð;~ÀŽr¢B;úLãß4îê“/7þIþSùû”žhòžŸ{s.í}_U»jøÜÚ˜å?Kâ¶ñ?1ÿÎ~VjNóy{WÕ´)¼a2C{lžYQeûæÅxž}ÿ8Aù©¡>Iü·|\ýwLå¿Ù¤ r½Œv¶ïÊa,€q,GÒT©&¾Ív£(œ¬ uz¬Ã$¬ }1ÿ9Aÿ8Ûwçæåªµ·æž©-í•¿îßRXRX™hEÊþpû@WQwÇÇÄ‚ ó¿ÉßÍÛ=Ùþ„Ö©kç+¥Ô,8 µái£]¨Õþñ;ÆÝ8nÕì³§—~ƒöy>‡Øý®51á–ÓoŸëz¶iãÈÿç$]—ò¾éTÐ=Ýš¸ñ§*}àfë°ø@÷Eíÿ>ðúGþq¿Ê~TÒ(ü™¬i:5¦­}¤ÚO}¨Ám \ÜM,`ÈÒ̫͉$ƒÉ½³º|콃;y?çç7å·’ü©æ ?Vó-‚kòi÷ÐZi1L'»{—·u~nœœÉÀQÜâ™>M×µ»Ky4_.éRjz­Ô¦UXã’f WhâC½rèk†¡æ]Ž“4Àá„x‰zV›ù9ù׿Hþ¹©jèJÛ¤\´RR›|jôÿfkíš]OµÁØ™{¿Ücì}f]äx>?©!Ò$ÖlµýSò÷Îanîm¹¡g> n 59 +)ŒwþfëF¢¨ÙÄÇÇ’×rØêzßå¥&œ^÷Ⱦd·—Kóî};›;„dx˜ïÆTVf‚aº·· ÑÕi¼3c“«ÒxfÇ&Oä5ß~JëÚ^ºï{ùg愎…­"‚áT£-=;¨7hÜw§ÇÌö¿eøñâÖ>ß/Ôì{µ¿/.ýì=ÿ­õ¥Ý­ý¬7¶S%ÅÂ,°OIÅU•†ÄœD¢bhìCßÂb@ll‹% ËKmBÒ{Ø–{;˜Þˆ\UdŽE*ÊÃÀƒL”dbAÃÀHwñf¥ùycå¿Í(<‰æ›Ë‹,\\l.Q€Èã UU,ʱHüz¯€ÏBÒk|l"cŸ_{çßɰǬ²’ NÇÈòýEõ/—¼±¡yVÁtÝÊ;;aBü^Fœ¤sVcîÇ1§3#eô}.ðãÛ"䡯u?LˆO¨ÝÃg#¼!ßû;ÑŸó‹ÚŸšõxÿ=4ãiæ¸]ùkN¸ZzŒ c½tíR–ñÓü¾k´Œ@+Ôêgšfs6K팓ŽìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUá¿ó‘¿ó:Gç>€×ÚrEgù¦ÄF“©n_U¹ ¡ßƒuFÜlX ¾Ðuí_CÕî<ç‹ytÿ0éò›R.‡=EÛÓ’½ÿ‘ú0¦ý é;3´øª;ô/•û[ì—‡z8ôó”GO1åÞ:{¹Mó|ùÂSæ].]gB½Ó``“NƒÓ$ÐrF>­ck0œ¸¥Ì»nÂ×ÇI«ÇšBÄNþâû.Þ{–uMVÖM>ÆÞm!y[&­gp¡#/û¾Ü‘¹ø*ÀýsGòG† ×<½áô<ݽ§ÓdrJ9ö™Å8ýCúùì|¹#µß;ê–:ËhvÚÇ3@‚ñ˸EP¬¦”ëö©Ó¥kÒÝOiN<8‘@ÿ[ƒÙÊéóiF§,fe(Èð zþ‹ç±ªçÑÕÔðRêdeä?h TS¶ù¿óy@îhÕ¥Þ`ѡ״›6SÄÈ+‡ö$]Õ¾þ¾ÙF«N3c1.ñ»NZ-DsG§1Þ:ÇW¬Î þ{.Î?$¿0.>ªRf_,^Ü0’HÜšÅÜöv< =É+]Ðg“¡#sÐ:mN=F8äÆn2päо@ÿœçüϵ´òÝå“/­®k“[ÞjÐFjb³‚NpFà~Ô³*²¯q„MJbÊF€Ýáš4}ËMÛ•¼J²ÐÈ~'#æÄçu¥ÃáãŒ{ƒó¿kë¿5©É—ùÇow!öRc—ºä›Íì~^Ñæ¾jƒû»XÏíJÃáúÚ>Ã1uº‘‡—^ž÷sØ“-v¦8ÿ‡œtG?Ÿ!æ_DÿÎ~PÉ¡ù~ëókÌQ¯ù™Z=#ÕZi~M6û†¸q_õHÙŽq‘&Ï7èB0ˆŒE(>©Õµ]?CÒïu­Zá-t½> n¯.d4H¡… »±ð À—æõ¶¯¨~þqꟙzÌN¾[ÒäHô›9hV8¢'êS¡#y¥§íŸͯdéÜòüãÏä×—ü«¥Z'é:¼íkn÷Ž©co¨Oq+Fä/r²S‘5â”QØfC½´Îãþqãò>éUdòŽ¡MG¥h°Ÿ¤ÅÄŸ§´©¿ç? ™Ï’-AbI¥Åêüœôb¶?óˆ?óŽÄ“þ ëÿkm`ØÞ+mРÎ:ÿÔ›ÿsmcþÊñ[GXÿÎ*ÿÎ?éßï?’mŸ¯ûÓu}u×þb'|VÙE‡ä·å™Ceä=7‘!ÒlÞAQCGxÙ©NÕÅmšZÚZXÀ–¶0Gmk¤pB‹j<¨b…lUñüæGå=Ÿ“®¬=<‘"húÀ¾Š-f™c\ÉVŽî4;b ΣíƒÈ¶MyqÆq1°[°æ–9 DÑ ³ÉúðóG•´0„ôÛQµ†y#¢HËûÅì g›j°øY%âúž“?‹Š3þp@þcyOüoäÍWËhâ+›¨Õ­do²·¸–.G²–P­ìNY Ôøc>ƒîkí /†Pêy{Þiùeÿ9=ùƒùåˆ.|×äYµ”ÒZDÓfk©,dŽs!Œ¸·¸IT3´øvÞƒ= §Aq!óLÚ<˜åR‰;½ÿœ¨ÿœ‘óµcò'’ Ñ¬å¨Šñí%¸q^”¹¼híÍ=ãʳv†TÃnÌÏ“é?`ù–7äÏùÉÌe#óÏ“YØMýõ„wOéŸõ­,DVÆŸëf¯7´Xcôƒ/³ñòw=˜Í/¨ˆý§ññLü¹ÿ8ÍäM$¤ÚÜ×:åÂД•þ­lHéHá<þƒ!©ÏíiíˆùŸÇÁÝiý›Á æLÏÈ}Ÿ­ëZ>…¢ù~ÔYhz}¾k±1ZÄ‘)#»p§Üïš\¹§Ü‰'ÍÞaÁ b G’a•¶¾Ióã$¿óº¡†€"@%e<¹‘¦F |)P>ŒôŸeÁð¡þwÞ^´ ëå^_îBi«éÑjÚmÎ0.#eþËuVú u¹!ÅåÆ'W¤Î)ùsË¿œÿ•mü¡óÌ{}úý"åX-݃j "³[1œd™… žd5AÎuåå±aš…—æü⚓˾gWÖ.5]´ýB%"9 ´O¥2ƒY f¡ìMC棴û*:ci÷÷ûÝ×döÄ´ÆŽðîîó 4[N×tÛm_I¸K­:ñ¶óÆ~SóÜv îÇ8\¸¥ ÈQ¡bË‘‰°Q¹Ç“~~þ_Ÿ8ùIµM>.Zþ„æÛˆ«ÍoJϦäÐsOqAö³sغï/ úe·Ç¡t}» ññqGê†ÿ¡ ù9ç¯ñ¯•"rs×4¾6º~Ô”º˜ÿ®£òƒgOŸ ¼œîÁíÌáõGcúÇï·¡åíó×’|½iùÙ«k^póŒóOamqõM3JŽV‰ ‹ˆq^& q+öH«TœÍÉ/+³ô±í9Ï6bH£ç£þhù×Î:6Ös%Ÿ˜´Óëhró‘  ô«P@~*ìhÓ„ù;ÎØìèê1€ N?Oêy{é>~üںѴ_1hòè>_Y¾»æIau’Y(¡=5>˜©e x1ø‡¶dqGnú<ùÁ©ídÆqÝο³ì÷ìúÊ×ê–ñÆò5ÅÂÇMw" –vxó“€QS×aLÂ%í±Ã„Ì÷÷¢03v*ìUثȿ:5‹ß-]ùÌ.³$Zìz6Þ^¤‹PŽVJÄ›ø-O·53'O+mÞó]¿žXe$'Sh;áøòÝù9©^yªÃZ×5Ýdꎡ9ŠûB#Œr'$XÄN*9/q±ïVàÎ8H3ì²ÏÎsâ2;Ǥ~›)ü¿ò…Ç’4›­ß}sNúåÄúdekki[’ÄÌIäkñA¹9^\œFÝfhNšV,˜ùå€\xÌÍ]£ÚÒãã—Àw–?ÿ8ýù­þwy—þV÷æ´ þÕ´}-ÁHõ‰¾T;‹XÈßýøÝÏÇ]¤ "(>Y®ÖÏQÎgsöyß ªŠ¨Šª`7 ¼UØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±WƒÿÎGÎ8éœÚAÕôŸù…§ÄFŸ¨Æ;È×qktGìÿ¾äê‡üšŒR á½^Ö<½«Oä>[M¦ù‚ÂO«v¥0è’W¹(ãf5îz>ÍíK¨d;ô?­òßjý0½F˜zyʧœ|»ÇN›r›æýód.£ ÅÅ…Ôrú7RÅ"A/ò;) Ûx¯,I‰4iÉÑe†<ЖAÅ Hï¸`ú •‡—<­}/™tÿFQ+ ƒ/ Ó+V/Lô=;WâÍ>—p`‘Ëß>êüy½×kê³v‡hcL¼C‡ÓV8/êâý=…(òµ¦®š—˜õX®G 9·ž[÷ž*ç'*„áËð8º,yã–`ðïFù{üÇ´4°dÒ`”[D~¹r¨×ñrïáåæ'ºN©ªj•âÉkÑ«é÷Ñ¿/X¤ƒQì)Ó7x3Îs6CÞð£Ùú|!S>5‘8\?óAù¿Éðy’< Õ †~Îá«ÐöÊuýž3‹H9¾Í{M>ÏŸ ½X¤wÞcõuzwåŸüæO?.m ò¯æ¶>¿ij¾®¯5l—ýÝÀòVþfcœžlÆjBŸfÐëðjádžBCî÷ŽcâË<íÿ9ïcubö•þW¼“Y¸!¼ÖDJ!b>ÒÚÚÉ1ø"ôÊãMnVIÆ2‘§`ùëAÐu½O[ºó¿îd¾ó-ôpÍpÜäõ¬’•¦Ê£e@/fvaãŸ>ƒ¹òŸk=­Ž¢'O§>â—󼇗»œÏ7ž;H.¼‘sùûù½c嘹ÿƒôrnu‹”¯iRŒ6 3Ò(ý¾.Ç8þÓÕø¹(}1äû—²=‹ù-7‡ï2o/.èü:ù—éí­­µ¬Vq$vѤ6ðF¡R8ãP¨Š£`5¯Pøûþs_óRîUÓ#ü©!—WÖ^ ybaÈBÎ>«hOc#UÁ¥Sö\ä¡"æQ)ˆƒ#È$^Lò½§“¼¹g¡ZÑšåu0ß\>ò>ûîvƒ;m.œb€ˆx-f¤æÈf?̇åßœÞ\Öu+m̺òóËw-tÖJ 4‘³FäªÛ‰‰j£zš®ÔÁ)Î"Ì/ǹÜöF¢2„Í Š¿ŸëL|Ÿù»å¯8jpè–Ñ\ÙêòDò.QsˆUãWV$*ÃáÓ¦[¦í,yeÂ,_edÃ#Dy%¾Mó¶­æ?4ù«X–íbòŽ­*È”/ø¥ÊœQ…ir­.ªY2NWè‹v¯G x±Æ¿y/Å2-~dhz÷–ÿÄ÷ßîOõÚÔ=ü±";¨÷mËâÓ 5Ã20k¡<|gÒ/«‹¨ìùãÉáQ«Ù”Øj6¥²^é—Q^Z=xOo"˧Z26̸LHX69ã” HQT‚æÞê?ZÖTš"HFÁ֠Њ©#l"@òD¢FÅW b®Å]Š¥:•ü·«ÔêšEã7WžÚ'zø†e¨?NS=<'õDƒ~=NH}2#âõŸÈÿËýR'ÖO¦\°n“Ìÿóšú‚úWeŽÝ@$2&‹ 5Ú•··å„öö›¼üгº“ü#æry_þr§U%µÌë‹E'qo¬j·Â((-¢ACóÊ%íÈHü¿[|}—Îy˜ŸêB[ÿÎ8êÚÝüWÿ˜^r»Ö½"¤YdeÚ«õ‹©¨4dÌLÞÒôG?Ôç`öXsžÝÀ~ŸØ÷>ÂÏJ±¶Ótø– 8’ hWì¤q¨UQò9‰ÌÈ™eêñ㈈ØNE›±Wb®Å]Š»v*øî[Òßn¿¯%‚{ÈUº×Ñ™m–›ôâ¹êžÏcáÇêýïŸÎ\ż¸ŸÔɯï­ôÛ9ï®›„!w?.€{“°ÎŽs\™ÌD^Éÿ8 _ ŽF¼`ð¹ ²BøçqÙš¯Ìà£õGð Çä'³µ‚cû¹óý?.cäú)cž$šC"‡ŽE «+ ‚êÂ÷€‚,qŸQQáúbÁ˜¯NìUتÙ$Ž(ÚYX$H ;± ªª*I'`Å€,¥ú?˜t?0,í¢jj jâ)ÞÚA"«‘ÈK±ÛÃ%(‘ͧ«[à•w<Ï?š^güºóf§avmu‹J›D€:ÀÖöœ ±S»·ÅÔÜ œxDâ:<×höÎmyDÔąǧ¿ñ¿“Ñ<³¡\ÜØhúלb³¿ó…¤.Q†%ýÚÎyqV_„6ä»u§SZ'-ÈÞ“LeO0È1æœØè6™¨_ê¶QA¨êl¯p‹G™PTþ;wߩș)ÊÇ¦Ç JQs=éo|ë£yF}[Vz¹ªYÙ¡­Ì´¨D·ó7@>‡3#A£´;C—þ½ˆ~HþIy“þrÌ«ù›ù˜¯oä i)a`9F5M¿¸€uXŠK/W5U5äɵnjDP|·´5ù59 æ}àÐ+{{{Kx­-"H-`EŠ"P‘Ç*ˆ«@€ ›€©Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«Å?ç ç¼½ùÙ¤ ¨Šižy°‰—KÖü2(« k  –ˆ±Ø‰ ªÔrVR àèu2~^ë÷AüÉ´“OÕlXF%œ†*t%Á*ñ°Ý%RE=ºoû;µkÑíÐþ·Î=¨ö;Žóé†ÿÅ×Î>~]zoÎl`MTîÜs£|¬‚ §Ìš ¿˜ôÇÓ§sä$†Uá"‚#¸¡ ŒÆÖiFhp—oد=q–"ö¢;Ábz¾Ÿæ ZâÏÊR³Ç¤ÙÃºŽ¦Ê±¤ê¿ËÇj QT÷ÜôÍ^|Yr„ý z¥Þõ½›¬Ñéa“]YÈŒxîÌo¿®ýOvÚÛÍw¶×R‡tó7“ôˆÌsP y¶õÚ½öÜõÚ×J2ýÜoà¹ýžÅ“üÞ^^sbúF¾Î›ì9o<Ñõk]oO‡R³åèL ÅJš WpFn´ùã–Qä^´»;&4°äçî^ô\°Ã:çeŒõGPË÷¶QbâcË(‰ ùl§oegi_ª[Å/µéF©_Ÿ20Çò6fÕeËõÈËÞIûÑ6‡b¬?óÌIÒ¾¡jÇôŽ£X£ »,ggaNæ¼Wû3UÚº¿ ç/¹ì}Œì_Íê”m^àÇÝ©Û8l’²ì{GQâN‡ ʼÑl÷¾YÖlâ–âÆî$¯Äð2¾g#n. Tâ|Ãÿœu¼†_'ßY.ÓÛ_»ÈŒìû@â#¸§·àFP{ÃØ3r芼‹ÌÿúÑ_•öÖÐî²¹Ìöß÷‘÷~—­öû©{ÿCô‹4®íñ'üç?ü§?•¿ëÝÿÔU®UŸè—¸¹_ï#ï{ѳÌZv*ìUØ«±Wb®Å]Š»XóC"I"£ÈxƬÀ>¸@%€ÆtßÌ#êúüžWÓu»{r>`Û':1Ž¥•%+é¹5Tbv̼š Ї¢D\<}£‚y<8È~> §0Ü×ÂVzΫ¦yËÌ1Xi’êšÅííÌijí'1på¿w³1©è)ž«ÙùüÇ$jq×{×3ΟOv*Ã?4|æ”/4Z(Ô£YÒæm½;¨Áà ì® Fö5í™Ý¬:|¢]:ûi膧 ^cÞòïÈO9O}¦\yY-µ òH#–¢Cj¯À¡zÂÿðGlí5Hr.³= g†T9{¿gê{.c=K±Wb®ÅRÏ0ëúo–4{sWwO´ fhãi[ã`Š 'v`<´O$i‚v  [‰Ú¼|3'O]CÍööc–xpƒPÈEžñcñòznƒå¿-yIžßH4ý59\ÝHò3T¤`4’<„•wí˜ò™‘Ýßé´˜t°"†<Ïëcšo‘-¼Ë¹¬ÙG±˜du»½iLüHä¶ò6èŽ_ ëÞ@™É8ÐåN.ÍÒfœ}~'3Ïäz2ß.èvÞZÑ,´+IfžÚÆ1rÜÈd•€ßv?=€Ø †Ù\åÄmÙitã8ÀD{Òo>þ`èž@ÒÍî¢ÂkùA:r0ÎÞ=ø ý§#osA’ňÌìâöŸjcÒCŠ[žƒ©ýži'äwä™?<õøÿ5?6ã’%TI¥iD´_¤MQ#ZòKaݾԎå³iŠ—ëµÙ5 æwû¼ƒï[;;M>Ò #µ±µ!¶¶…8¢Š5 ˆˆ   2n¾*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]мËó£ò;ÊZèír?ªk–ªß¡õØP‹7mèEG©·£‹Q‚_žúþçÈŸ1Ÿ&þ`Ú3iVÓõ¹I°Ö‚Ki“ù£4eðß³ûLâôËxýÏí/²0Ö^\5¿d½ýÇÏçÞ%V×V÷°Gui*Ío(åˆj¤gS ‰ Ãã¹ðO Ì& d9‚²úÊ FÎkÆÞá rb‡‰ð+¾ ¸ÄâbyzMTôùc’TM‹ÃõýQ´Òì|©å«fK ¶)y|H4[Ô¦ÿ*ÆŸä Õj´óŒ#‡Øó?¯ñäö]Ú˜2ê2kusp}Ü>îƒüãÊÒûKí}n%ò×’â‰l´OÝÜ\N)¥äyזÓ†¥>ü£\¶q`¡Ìž¥Øjtš3êû@ÈÏQ¼cáŽÕòsùKåŸ5Ûë€ØÜC[[ëvÀ!‘Ê7¿¶Õïß6=pËé;Ls3Û¾ÏOGûÈz°Èúe×qbÿ:2LÏy·bªWÚ[Ëupâ8!V’G=TTœŒæ" <ƒf 2Ë1 ”æ›ÿÎ+þ[Mù»ù£?æ6¿n[Ê^U–9-¢qXæ¿_ŠÖ ö"1ûé)û\A|â5zƒ›!‘üè>ÆìÈètÑÅcê=ò<Ïêò§èžc;7À¿ó•^}»üÜüÐÓ¿&¼±qË@Ð''W¸ŒÕPU"áÛ±ÑÖ0?߅dž_¦ÀrÌDuiÔêfg¢c¨êÞZü¹òõ½©èöæp¨d5"‚¡ENÀ³xça<˜ôð°äññdÔä5¼ŽéÆ™ªéºÍšjUÔW–R}‰ápêOpHèGpwv<‘˜¸› 1J¤(£2mnÅ]Š»B_éšn«ÕµK8/­ë_Fæ$™+ãÆ@FBxã!R³†I@ÜIÉyãÈv¾kò§øfÆDÒ¢†Hæ´Ä¢hëD1§Äò=:óW£qðK™¢×9xÏ«½„y÷ɾs¹ò‰祭êZÒÍwefŒ©ql€ÇUâ 0Jrø?hÓ¦øÍ.S† úŒO!Üì4:¼#<ˆô‰ ‰èR«ÝJÌï8ùPù{A»ÒãЧYµ+ë˜>ŠFñ¿¤ P„ $OA¾U<‡S–#„î[áŒipä㘗؇?§|Ùç>ù‹L×î4]/D…âõíÉ+'Õ…âÐgfïï‘õåË–bF"?£ûz0âÅ @HËôÿkZgæoæv™ä«5^Ae}¢Gpmd¸º./.¾"*8P…yPšŠqǯÏBfˆºß™NNÍÓK1Æ «Û{å…Ø¿±µ¾T1­Ô1Ì#o´¢DCî+%Äïy™Ç†Dw ¼Ëæ?ʺ%Þ¹©µ-­R¡ø¥ì‘§»¿³+Ïš8 dz6iôòË1ó/ ò.‰©~cyšÌ/5v1KK R?vïøAÿuÅÿ Ýk8mfªY$Iæ^§S8éñŒPç×ñÞ^ݘ.•Ø«Åÿ-¦KüÜÖ|¤ÌÇRæ–ëØ2¯Ö­ëò™~g:ÄÏY+ùÃíÓ´áãic“¬°ý¯¡s¬yWb¯"ó?þ´WåGýµ´û¬®s=·ýä}ߥë}Ÿþê^ÿÐý"Í+»|Iÿ9Ïÿ)Ïåoú÷õk•gú%î.F—ûÈûÇÞôlóÖŠ¼ËÍŸŸBò–©.4—Zž£nJ]E¦D“]kÉä’5ä´ø‚“N‡|Ûi»6Xñ ˆ=î›UÛ˜0˄܈þoà2Ï&yËGóÞˆšöˆ'[&wˆ­Ì&”ä;« ú£Úµ0µzIàŸªüœý²ˆqÂëÍæ3”’ëoò¯—§ŽÛ]Ö¬´ë™@1ÃusNTíË‹°4÷é—âÒäÈ.1$y6¯3S‰ó/)üÀüñTüÁÒ´]>O¯è±¢nÒÚÙžèÉ:s„A$…ù+ÆëÀÐøï›cø¸%#´¿„ÞÞwöºMmø:ˆÄoâo¿*ûÏ6~nÝé¶~\³òæ…5ß›|мìt‹ïôg¶PxÖà)½h9@I`øúnË33‡27¿s‘ªíc<œ¢v¯z@üÅóï˜çüµüÀÓ"Ð|˪YO&‘¨i²HÖ)aY%¡«ûKJe¹ô£ŒfÅ.(Äîà5àí ÒÈpfä=$~ Æôß+^yÛòûÍ^i×5]BóÏ^R™–¸¸i°<•åW©&c^[ÍæMHÞŒ@†AÝ×—êyüzSŸO“$äNLg¿þ´ïRѬ­¼‡ùgùä½#ýËi÷0C©%Œ%§»š&>£ÊbdÅOg§Jf><¤æÍ‡$¶#kéøìr2aˆÁƒ>(îºæ}ÿö¾ªFŠâ 0Mû†¡#œy{`^¦ù~@ÎJÇæÛôh¼›æ•–=BeR@‚õ‘®S©ŠåVf~?<ï{R2`¬vý_cç}¿¤8µô–ãôý¯Ð­7RÓµ‹ }SI»†ûM»A-­Ý´‹,2ÆÝ lÛº$K2¢³»E³@Ü’N*ñ¿ÌïùÉïÊËK9Ö]bwÌA¢i2¥ÌÆ@6Y¥Œ´pŠ‘^g•7 Ý1H”,l|Ñù¥ù“©þzyÒ/Cëÿ¢`âV2Z/« ˆ6æ(aø¿i·­AÎg·õñð¢w<üž³ÙÎΑŸ!°åçæ÷ìä^ÕØ«±WÍš ÷åïôÏÍ.ÇK{™•58WdúÏ5:,ñÔ¾Ð'©×ö¬eÆp˘åîý#Úø¥¤ÔGS¿üx=§EÕìuý&ÏZÓdõlobY¡nôaº°ìÊvaØí™r‰‹ÚéóÇ,ãÊA¹Ø«óÏæ/—¼…o ê¬óßÜ×êº}° <€mÊ„€«]¹¢¹fŒ~‰{”ÎiÄÇŒãâó}ʱþkþTi’Ïõ/3ùqå±¶º`O£-± "~& 4b*‘¸ éC‘)øs=ÅÑiôC_¢€&§ŽÀ=ÕÓåKŸÊŸŸ`±o*ëÚµ¶‡"ˆ/5(óÏF_CµG^\9~ÑÜàãÄ ºN‹´²ÇÂÉ0#Èž¤}ÿuõzç•ü¹aå=ËËúh?U²N!ÛíÈìKÿœsÕdÔ-¹ëß—2¤ªBÇÌÑcºU¯£/`ÿaûoð®n]<mÇs£íÏg°v„=^™ŽRþ=ãËä³C×ôß0Z‹>^DSÕ…¶’2{2ÿ™ÖéµP͉|Wµ{>‡'Qî=¸þ ^b—Y‡IšmRMA(Â7Rå“ö‚ ‹¸® \² dãæžÅÇ¥ž¢1Ô’ zƒ[ô¿'—Ï®ˆ¯$Ô¼±sqi®jlûIú¸‘}rO"¬õý¢HøIß¶s²ÔÔ¸±'.q®¯©aìž,C²ž"á—Š½=,*½ÀÛ¯6DÖ7~PòÕÓØJ’ùªà-ÅóÕd™c­\ª’»šw'3Ž9i°žyç¿ðpjñö®º(1ÓGÓb$ô³ÐË»Üo&ê:ýêr¿–=GK–!$’pÖN Æ(j w§ëÛ+³òå—Ôx¢FÒýê}¦ÑhðšÆ,€Ô±›"ºLK–ý×ðÛynlÞEƒyÂ]W̚ƙùy娚ëYÕç† }Yå`"ŒžÂ¿“Ðzg?ÛZºýØøþ§Òý‚ì['U1°Ú¦_ |{Ÿ¥_”ÿ—:_åWôŸ%é|\ÙGÎúì/uy/Å<íßâm–½íœëéå‹ÿÎFþnÅù?ùo{¬ZÈ¿â}K–ŸåèO~µ"šÎTÖ« ÕÎÔ-ÅOÚÅ >@üòtÚF‹/šu`Ï®kß½õ%«J¶Ìy­Y·¬§÷Œk¿ÃÜgSÙNqžrûžG¶õž$ø(ýÿ±–þbëšg—¼¡¨ßê¶ñ^BSцÊáHçžM£FV¨"¿{s3[–8ñ!~Ngá–L±5çÜ9äÿ$jYÐô_7Ëæ¯ðÅî«s’ÚãŠÛKm!äŠÀü<Ìaœswáëšm6’Xáœ|GáN÷W­ŽYˇÆ">7ý¯¢úî:gHò­â®Å]Š»v*ìUØ«Ÿòó@O/k]ÑÑô»}m‹ÝÍ4¯Í¸†#Ö-± B½74Ì3¢‡¡¸œèëòx‘œ½\<˜Çš¿+õ CÊÞXòv‘<'GÒ®#}Qå-“(Ù¤T0©ç#[îcj4–8c‰Ú'ÇÍËÓv”c–y$=R~>OSUUPªª€€ØfÕÓ>yÿœƒ×–ã^Ñü±,Ï—n‰y}éG”Îc‰"¬‘©+þ¶s}·˜™‚Þ§°pT%’·;§ù[Pòåîm–."›M¶"Ž8Ũ ¦Œ­ãÈW9y{¸zˆLHñÊw¡Böò×N´šúöU†ÒÝY¥c@¨¢¤â(ÄÈÐæùfûVÖ®|Ã'æl²¦˜š´kËlž´cÖŽ ×v än½Fgá‘ÆAª:aáxgºŸcÅ"MMåŠа¨9ÞƒoŸF—áCȼÏÿ­ùQÿmmþë+œÏmÿywézßgÿº—¿ô?H³JîßÎsÿÊsù[þ½ßýEZåYþ‰{‹‘¥þò>ñ÷½<Áõ¤¹%äZ&¥.œ ÔÖá­Ü™„Lc§û*e˜@3ÊÃVrD%ÃΫ߿ɒþvÜ]iÿ•ú¥ß–odÓæÓ¦·,úlÍ k•ŠHÉ€‚?¼«/ߘ‘-DDÅØ<ýÞngmHÇM#Œ× ¶ëäóÏÌO1CyÏŠ±|2çðùw§þyƒÌ˜¿–>RüÁÑôV_3Ù]­ì¶6q3HÑ#´BH—yŠ'UÜ…=M+˜ú3O¨É†Rô‘VeÉ×G&§M4cëè~<‡Á7Ö|»çÌø4?é|žLó¶q$Vvz¯".mø¤˜úa”rgP­û×(ÅŸ”ˉ ÌzÇ›~m>mXŽh $Â]GËßÑ4ò§åÇœ¯<ñææN£isªØBÖúVŸ§+z«+©f.«Ð;>#S^[S*Ôëñ >@'r[ô½šYÆlò@LËBü½òß—µ0j6QHòùšG—U†w ógb¢:÷ã×0sk²dŒþNÃgãÇ)È?ÇÅiÚf¤ZGa¥ZCcc};kh’(–»š*7Ìl™%3r6\¬xãQ$VA›ó’ô=hï£y‚ßÕ€žpL‡ŒÖòR‚Hž†‡ð=#2tº¹à—íqušA@ð/ÖíôÞÏéñ› Èùòù~»zÂ"F‹jUQ@Øi‰w`.Å.Å]Š¥iòæŸæß/ßùwSZÙßÄbfþÒHµý¤`}Æ_¦Ï,S0ãê´ñÍŒÂ\‹ç¿É}sPò‡™uOÊ2· ˆ&•ôÒÄñõTrtBfT¤±ý=Û;¹Ê9`2G‘t>Îꥃ,´¹;ý?>cö½ó1žÍØ«ÂÕ­üä]Ìžiâ±Így~Yè#Gh£P¶Â¤LŸë“™•x¶ø¼‡cÚ§Åê=îñï‹Ó<õçÍ#È:dZ–¨¯;O(† H zÒ ,¡ÈÙ@Üü³33Aßö—icÒ@J[ÙªÒ_ËíZÑ|Çæ©å³ko.kS[ꚨñòK‹ˆùÜÆcRH!˜/J|;dòÈ;ÉÙzl˜²å$T&D‡¼óøäô<¡Ý¼{óóŠKkåòwåäGXómÔ‚Õd¶ŒÜ,39â#‰VZö¡PzÔÕs+š÷<žW¶}£Ž+LJyu=ë?cÙ¿çç£òõÌ?˜›¡u;ÊßYµÒ§qqŒ¸–v$‰§º¢v«Ë°Ÿ>É–S$“d¾¯ÂÖìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±T=õ–§g>©[Ey§Ý#Cskp‹,RÆâŒŽŽ`GPF*øƒó»þqWòÅÜþzüŽõd·BÒÝù\1yá^¬lË{Œ/VþRÛ(³ic—MY£Å©Æq刔Oãà^#å¯=Úê’~ŒÕÓô~µÞ)DwSB-Õ«±Fú3¨Ðö¬rúe´¾Âù´ÇeÑÞLW<ì£ïïcãL¨ZZ‰ÍЂ1tE ÜÔ§‡*W6žnëw‘:Œ†G‡ºÍ|’m{Êðë3Eos&Ÿ«@¥#¼‡rP×áu¨ä7=óU¢H<2C¹ìŽß–’2Å( ¸¥¹„»ûÁèU¼³åø|µ¦~Šfœ´,²°ãÉØÙjh(£jäôzQ‚ ÛOnöÌ»C?‹(ðí@sÛ~½y¢5Í^ K¸Ô®7X—àNï!ÙT|ÎOSœb‘èãöOgOY¨ŽÿßÈu/`ÿœ%ü¦žöâûóÃÌ𗺺yí|¶$Z}¢cº»_Æý¹ûg“!œŒ2ý §ÓÃ8〨ÄP}ªÌ¨¬îÁQA,ÄÐ7$“m~j~hyþÇþr óÞg¾Ž?"hlöš4RHná…ë# b*÷2ÓL/u̽äÊŽßœNÐÏ,XL¢,ýÞofUUPªª€€ØgjðLϾ@¼ó¾± ½Åê/–ôùL·úqV1ëPÀjJ8‚ÄéšýfŒæ”lúG0ìô:á‚¡ê<‹ó>—qù•ùŸ•¦Y­<±å˜·%ˆÈòSxÉ´x¢štV#0õΣQÁÊ0s´Ù—Mâ 3™L//4¯ËuŸË¾Uó%ŒzíÕâ]O˜çžX¡…â© 7ǹsÐå’”t÷LqüVÕKSSÉÂz+ô²/$þbGæ=dkqçßùuøê’Å(’ÌÆC‘4rÙ>›w?=ó'K­ñ¸¶1çÜâë4 ‘>]þækmsmywVs%Å´£”SDë$nt>õ•â›þ rq'ÙøeÒ‘z?üâ÷üä7æmì~bÜÃå-¬¦I&·šBƒzÅkdì‡Aë:ÓõÊ0·›?¤n›ÿÎ`ù_Ê¿––—ÿ•žSƒÓ‡ë÷wüZupð°¼ó2Ó“ÈÓõãÚ‹@´É9²->ÜÙØZÚ1«A QâQÿ ï¡>q’W"{Ê'$Áä^gÿÖŠü¨ÿ¶¶ƒÿu•Îg¶ÿ¼»ô½o³ÿÝKßú¤Y¥woˆç5¥üÚü¬µ“â·[Ó R²j+}áFcêÏî¥î?s•¢½‡õ‡Þôœó7Öм^ü„´ŸZº×¼™æ;ï(Þß×qØ—11fäÜDrBÊ ß"µèLÝáí¢ !’ ¯ð]~Âfx¦q“ο´'žOüòß•´=[Eºš}gôò•Õç»rÀƒöOÀjKr©zïËaL}WjäË8ÈTxyWãö9:NÈdž‰&\Uþ?jKÿœü°Ó#dm2KÖ2¤ë-ÍÔÞ¢4|¸…0´Äj;íZÐdòvÞ¢_Å^àÃ`é¡ü7ï'ôS4Ô<¡åMZøjz¦‡§Þê* »›8&–‹ö~7Rv¦Þ³¬° d@÷—c“IŠrâ”=äåUQB ŠU€Ð”7€Þ)v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ž?ç%|¹žúGæ&•u–¿g4PH¼Ñ%˜#s†XÔY¢mš€ü$v\éýžÔ’N",s÷kÊûEƒ€ÇM­ÐfÒä8òÄÆ_Ž]ÿfZâ1='ËŸçg掓ùo¢»&›¦MRñ7X ‹{™Ïj¢ü׫š~Ör¯«ñ'À9Gï}—ØžÅü¶cדìOŸ?“õ CÑtÏ.hö‹n¶šN™V–VÉöc†‚§s°ÜÏ|Ô=ª?|ùùÃÿ8ùyù˜n5•¼ß') ý”cê·2ësl ©$õxø·s˦)ò¾»kùßÿ8÷r–|ÓZòˆJÛW‰Ú{vPh=;°9!?³ƒàß6z^ÕÉcê«WØø²ïL¾Ï“;òæ/•|éMØKêVM>â‘\®Õ4ZÀx¡#:-6·o¤ïÝÕæ5]Ÿ—Ô6ïèʨ+Znv'å™nË|Áùo«Ã®ë^gòÓX_I«ÀÂãJÕíáLÊ»zNÌ Tö¶ê6¬Ú Êp£ÅÒBÝÎЄqÎÇ ç_7Ÿjš§å i¾JX‚y»Î·Êׂ>cuTˆ”¨Nž,3]“±aÿ!ÝÚcÍÙå—ø1 ¿_ãÉ5òo懕<·åJñçh¢}n9&/@„³‚›(5cÇ·ÂFùoƒàê! dù´øþ6›$òDGÞÉ¡ü潺յ켯u} é×BÎâòÖQ%Ò–s¿Õ‚T†#a_¦»fPíBdjıÏäážÈ"戺<¾oKΕúE4ƒyê²Ä.#±w ;Dj9ÚO„×m³gâÇ‹†÷îu ¸x«nWÑ–5»v*ìUØ«±Vù‘ùyeçí)a.-µ‹NM§ÞU©Ê9Ü£PtÜÇÁ×h†x÷ÉØv~¼éå|ây…!ÎRþiþL-¿•?5ti|Å AHlµ#'Ô‰{%É À¢ÉGÞ”ÊgÓO© {->§ap6ú_Êó•ÿ‘žo8y–=ñéÊÏ\C`É_æ™É·ÿ”å ôžy›þrò[ÊškêWÞtÒï¯(ít»¸u™j*¡"´iÅ]™¨¾ôÅiñÿ™uŸùÉÍÿñî£hö~Lн8tË9 ‘ÀÆH¢$|-#»z³R´ iÇ6}™¤92 ¦.¯µµƒ3}Rü[Ùs­x§b¯"ó?þ´WåGýµ´û¬®s=·ýä}ߥë}Ÿþê^ÿÐý"Í+»|?ÿ9¡ÿ“‹ò·þyÝF<ÇÕÿu?ꟹËÐÿ}ë½éyæo«»v*ìUØ«±Wb®Å]Š»v*ìUØ«Ö<ÍåhÞ ÷XŠ Íi¤°³HeýóÊÀ#)Ë‹csБ™8´ù7ŽÑܸ¹µ8¶•lOå]}ü§ yÓÈL3ù—ÊK5õ»ëe7Kê~üà ,(@1ü_8$nFnu8ÙµÓv¾Hm/Pû~n£Uظ²oIû>LÓÊŸšNó´ûáo¨7ý+ï) õðZ’¯þÁŽo´úüYyû‹Îj»76bÇxeòC ¥ ±«˜Øiœ†‡MéÉÈ3i´ðãg®Ö™þ]ùâ?'ùkÍ—Wͨù_I¾Ko.óaÎc#JjÄP«µÃR@í–èµ~9“¼b}-:ý“Fr/³ö²+?ÍÍO¸Óeó·–[HÐõvU³Ô£—˜Bû¯¨¤m±©¯Mès"=¥8‘âC†2êâϲ±ÈKŸ£Ì=ëÍ>^±ÕB^ê0ÛêžÖ} [‡î~"[“Qv Iß6RÔB2á'wU6IGˆD‘t£«ùÇËzVú%¾©'£c,Jó¬®EGm½ú`É©„$óäË“&BDFñçÓïOr÷ u=9o?Gµäþ€ýTÊžµ¡á^[öÛ!âFê÷gáÊ®"²l®m­¯ {kÈRâÚAI!•чVˆ"‹(ÈÄØ4X­ù-ù{«9—ôi±™·/e+¿Dcè\×äì¼2é^çe‹¶5þ+÷þ-cùä 9ÄÓ%Ýò‚XCsp8u¨ÑXÉçóÊáØøAê~-“íÌò({‡ëz=…–™i†o­”#ŒPBG]‚í×6p€ˆ (:©ÎS7#e’`ìUäú¢¬ÿó“¿–J9D—Z4ª¾º”¬Þê¹ËöÙýèþ¯é/]Ø÷2þ·èÑÜÓ»§Ãÿóšù8¿+ç—ýÔcÌ}_÷Sþ©ûœ½÷Ðþ°ûÞ—žfú»±Wb®Å]Š»i™UK1@©'`îqT¶½¡ÞÝ =NÒâùjZÚ˜¤”¹ª+Ûå–Ë â,ÄîjŽxHÐ'Þ­©ÞþŽÓo5Eî>©·„tç'¤…ø-h*iA\Ž8qHVYdŸ L¹Ðxdž˜~bÒ¯|Åäß$Ç'—tßTÞ^]]‰PHôE1… •^yÐÇÁŽB2z ö¼Ðí½FXâÅé2Oö~”žïóãUó‡å¿æ™ Þèrö†lº\¢_\MþoâØWšmÿ+4&ùcYò Û¿žá–Úæä¬³I00Æe™ç‰ÉHøH¢œÿd7Ìí4µ3Ë8å»Ü~ªø:íTt°ÃŽXOï6=~6:Q{ zµ­þbù?ógÊ6É&“®iñ1©•FÆÜƒÌÁY@Uâ‹|ÒІ š|‡xŸOãñÍߌɨǨÆ6œ}_Ç&Uä¯Ê?Ê6¾eÒžìßùÌSJãIx½8­ ”:ƒ%‰F [áû#0õ}¥,ƪ”>÷7GÙqÂ'¸Ìòî ×JÒtÍ O‡JÑíc²Ó­ÁÛ@¡91f É$“Üï˜rÊr2‘²]Ž,QÇŠæO8ycÊ¿[ó©Ÿ‘$jË ︖®ÿìTåº}.LÆ¡Zµ¼XEÎ@~;ž/©~}yŸÎZŸøgòwËwZž¥-U.¤·iæ´æ–ñÕUG^rµ?™FtzOgzå?úÞ_[í?LCâWãÜÎ|•ÿ8iç;_Eæ_ÏŸ1Mêº%œÉquƵàóüPBµ¤*õþe9ÑáÓèËj5Y2ÊæL‹ë$~]y'òãLG’´[m"Ðê´)Yç+ѦËI!÷v9sŽÆ¿>*m?8?.u,«­D>» Üµ£ ŸL=@LOþKW¨¤Æ‘nºšÎïòÿ_ ½åæx¢†m¥ô#sÄÀïÊøHð íšýV:7Þú²ý¥âcðdw/êþϹë:ž«¦è¶Rj:µÔVv0ŠÉ<΀©êO`79Š"NÁéóf†8™L€{ŵ/Í/9~cëCÉ_’ÚMÍíìõVÔR/Þð¨S"‡¢A®òÌE+û'3qizÉâ{SÚƒ+Ž ‡óºü;¿Ÿ@~KÎh>Už?5þiËš|ÜÍë­‹—N¶”ž\ŸÕ®$ñ2ä›3@xÙÌÈÙæúUUB¨@ `ì1`Þ*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wœy÷ò#ò¿ó#V±×¼Ñ¡E6µa<‹ès-Ê@á„¶<Ý~§²ðåÞ¸OxüR—–¿?<§«·Öã“D½;-f·-Ò‚Dì|Ý`íŒsÚ^“ö:Oaå†ñõµèW²/˜4 ÄÐ5K^[Ë®¡ ãG‘ ‡6Þ•¯\ØÈø<'˜æêà<<ƒŒ& ~NyjßÊvz™m!Ôo –k‰.âi"oRV§ÀèQéÁPvÛ0°öf1ŒFbËŸŸµ²¦p4;‘þjü²Ñõ%(è±Ç¥Å‹sbTE¸@Ed&¬Üƒf$žûôË5χ»šô½£8fñ%ê½¹†_ù3óKÏ¥h^t¾]Ó&I®.mœ´·~šð­7ÄT° Èšt…=.£7 rPˆû>Í6)â³)wôü|Tt/.i¿˜ß™þoÕuûcu¤én–6öîÒF¥×÷JßRE"f§ù@äpàŽ£Q9HX~>L³ê%¦ÓcŒ oøù¤Þgò&qù©¤yGË7iɬwSÏͧlc(¬A¯ãêÛ–Êsé"uÇ[_¹ÈÓkd4²É½{ïûKß´{;» .ÖÊþñµ ØcTžõÔ#Lã«•_ çAŠ&1›=ï1–bR$ Ïœ5ûß$ëšÞe=]Ko¤B £@²±[‹oNþé\þÄTŠœæóKõñNܾOY‚±éaá <ϸïú•|¹æ=JÇÉŽÆþæëÊöb;mêå™eCs9…Bˆ%3(¥:ÐW òŽ,´Iˆåñc¨ÓÆY±XgyW{åö©ecåO-iZ®¦‡\¿²Žî(.®¹g&PT9äÔ‚‡¶ntyqÂ2>¢/~n‹_ŒË,åúA­†Û3E’7fTpÌ›8§ßÃ3m×Òì(c>jó¥”î´{[ËK›–Ön~« ÛFcj¨«Ô޼…n@>‹¨Õ F ‚x9z]³ @á»&̧Ø«Ê/¿õ¨¿,¿ã>‘ÿuó—í¿ïGõIzþÀþàÿXýÁú9šwrøþsCÿ'åoüòÿºŒy«þêÕ?s—¡þúÖ{ÒóÌßWv*ìUØ«Î;<׿/&y+ôç–¤Ž+Ä»†)žX–`!•]Ml>ÐæÓ²4ØófáŸ*u=µªÉƒ9ÛÎFXè1ùÊ1iÚ½¯Õ’ý´¨í¢ ö잨 >­$)Ü Ø¶lä%? ÀÄÝ]õù—X”cÅŒ…]WOcÿš¾iÿ•“ù9£yÊý ›-Kêš­š3ÑÚ6 Þ´$DÊ@Ýs'³tß–ÕKäc`þ>./jj¿5£ŽQ±¢?)6£ùgšü¥¬y.ËPòæ§^Ç.¯®Þ ™â£«„EV˜“Ee4ãZî´ÌÁ AÅ’9™#hŠýŽ É¦qË0ŒOªFÏë}oqm}kÕ´‰=¥Ìk,2¡ ’G"òVR6 ƒQœD¢bhó ‚ùKÉ>G×õ?5ùÇòÂËÌ÷‡cq<ÓÙÛÇͯ i¨t ý0Õ$zga«ÖB8±ç0‘û?¾Þ#E¢É<¹0 †íÞ9}ÔôÍoËòzËË,¾_¹†úÝ·’êg–CÌJV>¯-‡ìŠt­ìÞÑ”õ\S?X¯//¹Úö§fFNcè7çç÷»Ì¾Nóç˜u)~iy/Ó°óZéÐêÙ_©€†hÏ.I"ïý㣦ÁHötú¬8ã“Má{N>YcÔbÚ|;ƒ³ ü¼ü¨Õ<¯®j¾g󴚦¡æ$]fÁ-•m^y¤õ]ƒ*¢¬ pãA®í(å„aðˆîåveKå’râ3¡[_ãÉ‚j~IóÖ£w­ù{ÊÞBÒ<µ¦j2ÜY¿˜]£õNžÒ8ªÈåy¨ø„h~Cc›zÌ1œòÊdQáóu¹tYäe xclqGñÜ÷)è6ÞLò¦› ý`<]ºÇ-Ô‡€fiÔü ±&•Øg?©Ìsd3¯¨½&—ÁŠ0¿¤0ï5~}þ]y`±n R“àñF¹f<²¸škËŠHómSÍž•Ž-ÿ4<Ÿ;Ù#p:‘‹ÓiðÝÛ -œû.mpöÖHýC‹ìuû·1ûB} þxyZãÅÔšMËPzwÉÁ+Þ’¡dýb3k‡µ°Ï™á÷º|ýž‡òz¥õ–¡¹°¹ŠêݾÌÐH²¡ù23a‰ Ý\àbhŠ*ô’ç©îi’bÃ|Åùk¢ùƒ^¶ó0º¼Óu˜8+ÜXM虣M¸¾Äôøj¤m˜Yô0É1; ù; ?hÏ (J'½™æk¯y§åÏåíÞŠºüþn¶´»½Õï=r1ž¿¼QûR7QšÍˆÃˆä™{·í xŸÆHäç”ËÈ–úFf#Žîþh-£ ¢«ÈIÌ'\¯µ…aˆæ[;\Y̤y©¹w¦y{ó£ËCZlô­#IŽÞ åÚ*ˆgE$ÒƒâjWmÆQ–QǪ‡¡þ·' %“G>fRý!å¿0Êo?4¼ÿ¤ŸVHTG¦ÌV¿ I(âª#Ðåx3o›,~ šŒ°a—Å,:~­§þ[·æ·¯—Z½øf·MÂC$¾›B>"Þª‚^½¼Úʸ%(Èlùþ7nñ!-G‚qåöû™]÷˜üÇosùOc§:ɪÅm6¬L…šéf6îD¡ªNÜ…}ÎeÏ<ÁÂ/ê«óäáCOŒAᛯ.|ãZüÊóš<é¥hzìvZ,’÷¥ç™¾®ìUØ«±WŸ~wéÿ¤¿+<Çh`ŽéOqõiÒb{öS›.ÈŸ¦ξaÕvÖ>-,Ç•ü¼³Aü÷µ‡È:W“ü½¤_krNNŽ¡xãô¾Îô_Ñ­ü½¡éº«´–úm´6‘ÈÿiÄ(‘÷4®s¹òœ“2=M½6ŸÅÀrˆ¤º×Èþ]³óuïž ·qæ+ø– çõ\'¦¨‰A!w­jã-–³!Ä1é QÑcŽS”QdyŠå¨ÝÞZX@×W×Û[&ï4α¢vbÉF&F€²ÆSMœy‹óóòÓËáÑ5C«]/û£LO^¿)IX¿áóiƒ±u?‡„yíû]N£·tØÿ‹ˆÿG·—ÚÁ¡üèüÓü¹m?òŸÉ7*[Ó7† oZ=«ÉÙAüôf¹Óû9¼äO»oÇØèu>ÔLíŽ {÷ü}¬³HÿœHüñüÈ™/7<Øš6žä;é±ÉõéÔõ ··1Ú'‡%vùm›Ìä’Ûþr ;“aæï-Ýé—±3,f®§ÞÄL¿*œØãíÈÿ~N·/³Òþ ïf:_çåæ«@šÂZJzÇxoO›¸á÷6gcí<2þ*÷ºì½“¨‡ðß»v_c©éºœ~¶›yä]}KyRUûБ™Ér ¸Ç(í B/&Á.Ôô Zh›XÓmoÚXZææ)Üñ. +Mò¼˜a?¨Û<áôÈ‹î)6§£Xùk@ÖçòÆÝåê;ͦÇ@·r8*y«F%•w#a¾Q“Ç FÉéÞäcÍ,¹"':¯sçíCÊÐëÂ=3Ë>EÕt­zêUÞ4æÎÕ+ñ…iPVŸôùÏON'´1Ê2=üƒÓãÔœ~©åŒ¢;ªËÞçü½Ónu?-jòÜÌ·^Z‚;{hÓ‡¥ E W ¥»vlèŠ&P•ïšùÎ4*en‘ù}k¤j^hÔÒúI¦ó9s*º(ü̆‹ÇíSÔ¦þ1èÄe3ZåיƯ£íäò/”"òF€šWFñVY&õÚ1&B 8‚Ý)ã“Òi¼pݵëug<øê˜m÷þµå—ügÒ?î£>h{oûÑý_Ò^“°?¸?Ö?p~ŽfܾÿœÐÿÉÅù[ÿ<¿î£cêÿºŸõOÜå辇õ‡Þô¼ó7ÕÝŠ»v*§<]C%µÌi5¼ÊÑË ŠQ••ª#¨8A ØD¢£Ée­•Œ~••¼VÑ$1¬k÷(¾LË™´F;JùI&§ç)輿Kk–L½R{¸czÒ´ ÍR}€ËñérÏé‰?.¯>©ñ #Vÿœ…ü®Òõ9uV Åem+ôðyDh~†Í†.ÃÔËøkÞ]v^ßÒÃø¸½Á†Oÿ93w«Üþò?“îõ;ÇþìHÌòõ ÿGµI ÿƒÍŽ/fñÏä?s«ÍíHþ|Ïèý©­—?ç0¿0ÿÞ- ùSN—f’ê(t€ø­á{¡óEͦÂÓØâ÷—SŸÚLùpþÖW£Î ùŸ^¸ŽÿóOÏïu(ÞK}]Dò‘$ù—·ù;þq;ò7ɦ9£òâëwñÓý/\ß§s·¯}¡Ë­ì¶–––ñÙØÁµ¤#ŒPB‹h½hª >X¡[v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»JµÏ,yoÌÖÿTó&e¬ZСk ÒzÑfV«ÈüÉÿ8‰ù æ3$ƒËgHº“¬úUÔöÜÕ„³@?ä^)·”k_óïÿ/ú‚(yÛPÓeJ˜Æ¡k ãW°õ-Úԯωùa”›æÄîÿç?ç$ü¸9ykÎvz­º GßÝ#õíÜMìó"ܱå"âäÐàŸ8’CuåùËÿ-÷!åOÒѦááK+Î`ÛO˜6ôé@s*¯˜s ü?S‰>ÅÓË#ãúí&¹üÊüÞÐ+þ)ü·¾¶á»³ØêKABH3G §\ÉnO¬GãæâÏÙøR?êBÃÿ9§£˜µ//\ÛJ§Œˆ— #)îtŒÔeñíÈõ‰ù´KÙét˜ù&ÎDù&Aûë=J¥Ma–¾¬Õü2ÑÛX»ãâÑ.ÀÌ9ý¿©0‹óçòîCGº¹‹jÕíd;ø|²ÁÚø;Ïɨö& t4\ߖ޵ma£?ÊÖw„ÿÂÄFLv®ç}‡õ0=©þoÚ?[Ҽѡy·þrSòÛQòýß×,¢¼Òmä—Ò–*J·Ò9^3*ަ´¦h»SQ ¹‰±_¤½di§‡ŒÅýúgš×døOþsŸPM#ó3òïU‘ ‘ØÛ›§H Ë òÈTÜÓ*Í8÷‚ôù8'wXŸý o—¿ê^¼ÿ‘Ðç+þ†çüðö_è§ó؆oùË€ b‹zŽ™¤i:-°³Ñ¬-ôëAÒÞÒàŒvû…¡Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*”ëáŸKþv?¨zéaèpã_ø»jWyαÿB¿êÓÿà/W›Wëß ùzŸµýöõñÅ;±{þpºì,¾BZG¥©ipõñô¦\Wtº"ÎÜIêIuäàÔ‘ùŽ—oòc¼Qøb»¦~Tò?üâ ™t«Ï(]ya¼ÓÔ2i g游7jÀÄ"ˆ]¿6åÑxšâ»¾‚Å ~¡úš~•ú¯©CéýkÒ寻ñõ;b¨?ùÓ¿íYÿNتs£èÇõ~?Wâ¾—§N)ðñ¦Ô§Jb«ñWb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb®Å]Š»v*ìUØ«±Wb¯ÿÙ»DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Jhttp://www.synthesis.ch/yXô;H¯,‚]Ä…'c¥«ÕDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© dhttp://sourceforge.net/projects/expatyXô;H¯,‚]Ä…'c¥«ëDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© zhttp://sourceforge.net/projects/syncml-ctoolkit/yXô;H¯,‚]Ä…'c¥«³DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Bhttp://www.zlib.net/yXô;H¯,‚]Ä…'c¥«·DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Fhttp://www.sqlite.org/yXô;H¯,‚]Ä…'c¥«ÉDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Xhttp://www.pcre.org/license.txtyXô;H¯,‚]Ä…'c¥«}DÐÉêyùºÎŒ‚ªK© _Ref182744145}DÐÉêyùºÎŒ‚ªK© _Ref182744145}DÐÉêyùºÎŒ‚ªK© _Toc247362773}DÐÉêyùºÎŒ‚ªK© _Toc247362774}DÐÉêyùºÎŒ‚ªK© _Toc247362775}DÐÉêyùºÎŒ‚ªK© _Toc247362776}DÐÉêyùºÎŒ‚ªK© _Toc247362777}DÐÉêyùºÎŒ‚ªK© _Toc247362778}DÐÉêyùºÎŒ‚ªK© _Toc247362779}DÐÉêyùºÎŒ‚ªK© _Toc247362780}DÐÉêyùºÎŒ‚ªK© _Toc247362781}DÐÉêyùºÎŒ‚ªK© _Toc247362782}DÐÉêyùºÎŒ‚ªK© _Toc247362783}DÐÉêyùºÎŒ‚ªK© _Toc247362784}DÐÉêyùºÎŒ‚ªK© _Toc247362785}DÐÉêyùºÎŒ‚ªK© _Toc247362786}DÐÉêyùºÎŒ‚ªK© _Toc247362787}DÐÉêyùºÎŒ‚ªK© _Toc247362788}DÐÉêyùºÎŒ‚ªK© _Toc247362789}DÐÉêyùºÎŒ‚ªK© _Toc247362790}DÐÉêyùºÎŒ‚ªK© _Toc247362791}DÐÉêyùºÎŒ‚ªK© _Toc247362792}DÐÉêyùºÎŒ‚ªK© _Toc247362793}DÐÉêyùºÎŒ‚ªK© _Toc247362794}DÐÉêyùºÎŒ‚ªK© _Toc247362795}DÐÉêyùºÎŒ‚ªK© _Toc247362796}DÐÉêyùºÎŒ‚ªK© _Toc247362797}DÐÉêyùºÎŒ‚ªK© _Toc247362798}DÐÉêyùºÎŒ‚ªK© _Toc247362799}DÐÉêyùºÎŒ‚ªK© _Toc247362800}DÐÉêyùºÎŒ‚ªK© _Toc247362801}DÐÉêyùºÎŒ‚ªK© _Toc247362802}DÐÉêyùºÎŒ‚ªK© _Toc247362803}DÐÉêyùºÎŒ‚ªK© _Toc247362804}DÐÉêyùºÎŒ‚ªK© _Toc247362805}DÐÉêyùºÎŒ‚ªK© _Toc247362806}DÐÉêyùºÎŒ‚ªK© _Toc247362807}DÐÉêyùºÎŒ‚ªK© _Toc247362808}DÐÉêyùºÎŒ‚ªK© _Toc247362809}DÐÉêyùºÎŒ‚ªK© _Toc247362810}DÐÉêyùºÎŒ‚ªK© _Toc247362811}DÐÉêyùºÎŒ‚ªK© _Toc247362812}DÐÉêyùºÎŒ‚ªK© _Toc247362813}DÐÉêyùºÎŒ‚ªK© _Toc247362814}DÐÉêyùºÎŒ‚ªK© _Toc247362815}DÐÉêyùºÎŒ‚ªK© _Toc247362816}DÐÉêyùºÎŒ‚ªK© _Toc247362817}DÐÉêyùºÎŒ‚ªK© _Toc247362818}DÐÉêyùºÎŒ‚ªK© _Toc247362819}DÐÉêyùºÎŒ‚ªK© _Toc247362820}DÐÉêyùºÎŒ‚ªK© _Toc247362821}DÐÉêyùºÎŒ‚ªK© _Toc247362822}DÐÉêyùºÎŒ‚ªK© _Toc247362823}DÐÉêyùºÎŒ‚ªK© _Toc247362824}DÐÉêyùºÎŒ‚ªK© _Toc247362825}DÐÉêyùºÎŒ‚ªK© _Toc247362826}DÐÉêyùºÎŒ‚ªK© _Toc247362827}DÐÉêyùºÎŒ‚ªK© _Toc247362828}DÐÉêyùºÎŒ‚ªK© _Toc247362829}DÐÉêyùºÎŒ‚ªK© _Toc247362830}DÐÉêyùºÎŒ‚ªK© _Toc247362831}DÐÉêyùºÎŒ‚ªK© _Toc247362832}DÐÉêyùºÎŒ‚ªK© _Toc247362833}DÐÉêyùºÎŒ‚ªK© _Toc247362834}DÐÉêyùºÎŒ‚ªK© _Toc247362835}DÐÉêyùºÎŒ‚ªK© _Toc247362836}DÐÉêyùºÎŒ‚ªK© _Toc247362837}DÐÉêyùºÎŒ‚ªK© _Toc247362838}DÐÉêyùºÎŒ‚ªK© _Toc247362839}DÐÉêyùºÎŒ‚ªK© _Toc247362840}DÐÉêyùºÎŒ‚ªK© _Toc247362841}DÐÉêyùºÎŒ‚ªK© _Toc247362842}DÐÉêyùºÎŒ‚ªK© _Toc247362843}DÐÉêyùºÎŒ‚ªK© _Toc247362844}DÐÉêyùºÎŒ‚ªK© _Toc247362845}DÐÉêyùºÎŒ‚ªK© _Toc247362846}DÐÉêyùºÎŒ‚ªK© _Toc247362847}DÐÉêyùºÎŒ‚ªK© _Toc247362848}DÐÉêyùºÎŒ‚ªK© _Toc247362849}DÐÉêyùºÎŒ‚ªK© _Toc247362850}DÐÉêyùºÎŒ‚ªK© _Toc247362851}DÐÉêyùºÎŒ‚ªK© _Toc247362852}DÐÉêyùºÎŒ‚ªK© _Toc247362853}DÐÉêyùºÎŒ‚ªK© _Toc247362854}DÐÉêyùºÎŒ‚ªK© _Toc247362855}DÐÉêyùºÎŒ‚ªK© _Toc247362856}DÐÉêyùºÎŒ‚ªK© _Toc247362857}DÐÉêyùºÎŒ‚ªK© _Toc247362858}DÐÉêyùºÎŒ‚ªK© _Toc247362859}DÐÉêyùºÎŒ‚ªK© _Toc247362860}DÐÉêyùºÎŒ‚ªK© _Toc247362861}DÐÉêyùºÎŒ‚ªK© _Toc247362862}DÐÉêyùºÎŒ‚ªK© _Toc247362863}DÐÉêyùºÎŒ‚ªK© _Toc247362864}DÐÉêyùºÎŒ‚ªK© _Toc247362865}DÐÉêyùºÎŒ‚ªK© _Toc247362866}DÐÉêyùºÎŒ‚ªK© _Toc247362867}DÐÉêyùºÎŒ‚ªK© _Toc247362868}DÐÉêyùºÎŒ‚ªK© _Toc247362869}DÐÉêyùºÎŒ‚ªK© _Toc247362870}DÐÉêyùºÎŒ‚ªK© _Toc247362871}DÐÉêyùºÎŒ‚ªK© _Toc247362872}DÐÉêyùºÎŒ‚ªK© _Toc247362873}DÐÉêyùºÎŒ‚ªK© _Toc247362874}DÐÉêyùºÎŒ‚ªK© _Toc247362875}DÐÉêyùºÎŒ‚ªK© _Toc247362876}DÐÉêyùºÎŒ‚ªK© _Toc247362877}DÐÉêyùºÎŒ‚ªK© _Toc247362878}DÐÉêyùºÎŒ‚ªK© _Toc247362879}DÐÉêyùºÎŒ‚ªK© _Toc247362880}DÐÉêyùºÎŒ‚ªK© _Toc247362881}DÐÉêyùºÎŒ‚ªK© _Toc247362882}DÐÉêyùºÎŒ‚ªK© _Toc247362883}DÐÉêyùºÎŒ‚ªK© _Toc247362884}DÐÉêyùºÎŒ‚ªK© _Toc247362885}DÐÉêyùºÎŒ‚ªK© _Toc247362886}DÐÉêyùºÎŒ‚ªK© _Toc247362887}DÐÉêyùºÎŒ‚ªK© _Toc247362888}DÐÉêyùºÎŒ‚ªK© _Toc247362889}DÐÉêyùºÎŒ‚ªK© _Toc247362890}DÐÉêyùºÎŒ‚ªK© _Toc247362891}DÐÉêyùºÎŒ‚ªK© _Toc247362892}DÐÉêyùºÎŒ‚ªK© _Toc247362893}DÐÉêyùºÎŒ‚ªK© _Toc247362894}DÐÉêyùºÎŒ‚ªK© _Toc247362895}DÐÉêyùºÎŒ‚ªK© _Toc247362896}DÐÉêyùºÎŒ‚ªK© _Toc247362897}DÐÉêyùºÎŒ‚ªK© _Toc247362898}DÐÉêyùºÎŒ‚ªK© _Toc247362899}DÐÉêyùºÎŒ‚ªK© _Toc247362900}DÐÉêyùºÎŒ‚ªK© _Toc247362901}DÐÉêyùºÎŒ‚ªK© _Toc247362902}DÐÉêyùºÎŒ‚ªK© _Toc247362903}DÐÉêyùºÎŒ‚ªK© _Toc247362904}DÐÉêyùºÎŒ‚ªK© _Toc247362905}DÐÉêyùºÎŒ‚ªK© _Toc247362906}DÐÉêyùºÎŒ‚ªK© _Toc247362907}DÐÉêyùºÎŒ‚ªK© _Toc247362908}DÐÉêyùºÎŒ‚ªK© _Toc247362909}DÐÉêyùºÎŒ‚ªK© _Toc247362910}DÐÉêyùºÎŒ‚ªK© _Toc247362911}DÐÉêyùºÎŒ‚ªK© _Toc247362912}DÐÉêyùºÎŒ‚ªK© _Toc247362913}DÐÉêyùºÎŒ‚ªK© _Toc247362914}DÐÉêyùºÎŒ‚ªK© _Toc247362915}DÐÉêyùºÎŒ‚ªK© _Toc247362916}DÐÉêyùºÎŒ‚ªK© _Toc247362917}DÐÉêyùºÎŒ‚ªK© _Toc247362918}DÐÉêyùºÎŒ‚ªK© _Toc247362919}DÐÉêyùºÎŒ‚ªK© _Toc247362920}DÐÉêyùºÎŒ‚ªK© _Toc247362921}DÐÉêyùºÎŒ‚ªK© _Toc247362922}DÐÉêyùºÎŒ‚ªK© _Toc247362923}DÐÉêyùºÎŒ‚ªK© _Toc247362924}DÐÉêyùºÎŒ‚ªK© _Toc247362925}DÐÉêyùºÎŒ‚ªK© _Toc247362926}DÐÉêyùºÎŒ‚ªK© _Toc247362927}DÐÉêyùºÎŒ‚ªK© _Toc247362928}DÐÉêyùºÎŒ‚ªK© _Toc247362929}DÐÉêyùºÎŒ‚ªK© _Toc247362930}DÐÉêyùºÎŒ‚ªK© _Toc247362931}DÐÉêyùºÎŒ‚ªK© _Toc247362932}DÐÉêyùºÎŒ‚ªK© _Toc247362933}DÐÉêyùºÎŒ‚ªK© _Toc247362934}DÐÉêyùºÎŒ‚ªK© _Toc247362935}DÐÉêyùºÎŒ‚ªK© _Toc247362936}DÐÉêyùºÎŒ‚ªK© _Toc247362937}DÐÉêyùºÎŒ‚ªK© _Toc247362938}DÐÉêyùºÎŒ‚ªK© _Toc247362939}DÐÉêyùºÎŒ‚ªK© _Toc247362940}DÐÉêyùºÎŒ‚ªK© _Toc247362941}DÐÉêyùºÎŒ‚ªK© _Toc247362942}DÐÉêyùºÎŒ‚ªK© _Toc247362943}DÐÉêyùºÎŒ‚ªK© _Toc247362944}DÐÉêyùºÎŒ‚ªK© _Toc247362945}DÐÉêyùºÎŒ‚ªK© _Toc247362946}DÐÉêyùºÎŒ‚ªK© _Toc247362947}DÐÉêyùºÎŒ‚ªK© _Toc247362948}DÐÉêyùºÎŒ‚ªK© _Toc247362949}DÐÉêyùºÎŒ‚ªK© _Toc247362950}DÐÉêyùºÎŒ‚ªK© _Toc247362951}DÐÉêyùºÎŒ‚ªK© _Toc247362952}DÐÉêyùºÎŒ‚ªK© _Toc247362953}DÐÉêyùºÎŒ‚ªK© _Toc247362954}DÐÉêyùºÎŒ‚ªK© _Toc247362955}DÐÉêyùºÎŒ‚ªK© _Toc247362956}DÐÉêyùºÎŒ‚ªK© _Toc247362957}DÐÉêyùºÎŒ‚ªK© _Toc247362958}DÐÉêyùºÎŒ‚ªK© _Toc247362959}DÐÉêyùºÎŒ‚ªK© _Toc247362960}DÐÉêyùºÎŒ‚ªK© _Toc247362961}DÐÉêyùºÎŒ‚ªK© _Toc247362962}DÐÉêyùºÎŒ‚ªK© _Toc247362963}DÐÉêyùºÎŒ‚ªK© _Toc247362964}DÐÉêyùºÎŒ‚ªK© _Toc247362965}DÐÉêyùºÎŒ‚ªK© _Toc247362966}DÐÉêyùºÎŒ‚ªK© _Toc247362967}DÐÉêyùºÎŒ‚ªK© _Toc247362968}DÐÉêyùºÎŒ‚ªK© _Toc247362969}DÐÉêyùºÎŒ‚ªK© _Toc247362970}DÐÉêyùºÎŒ‚ªK© _Toc247362971}DÐÉêyùºÎŒ‚ªK© _Toc247362972}DÐÉêyùºÎŒ‚ªK© _Toc247362973}DÐÉêyùºÎŒ‚ªK© _Toc247362974}DÐÉêyùºÎŒ‚ªK© _Toc247362975}DÐÉêyùºÎŒ‚ªK© _Toc247362976}DÐÉêyùºÎŒ‚ªK© _Toc247362977}DÐÉêyùºÎŒ‚ªK© _Toc247362978}DÐÉêyùºÎŒ‚ªK© _Toc247362979}DÐÉêyùºÎŒ‚ªK© _Toc247362980}DÐÉêyùºÎŒ‚ªK© _Toc247362981}DÐÉêyùºÎŒ‚ªK© _Toc247362982}DÐÉêyùºÎŒ‚ªK© _Toc247362983}DÐÉêyùºÎŒ‚ªK© _Toc247362984}DÐÉêyùºÎŒ‚ªK© _Toc247362985}DÐÉêyùºÎŒ‚ªK© _Toc247362986}DÐÉêyùºÎŒ‚ªK© _Toc247362987}DÐÉêyùºÎŒ‚ªK© _Toc247362988}DÐÉêyùºÎŒ‚ªK© _Toc247362989}DÐÉêyùºÎŒ‚ªK© _Toc247362990}DÐÉêyùºÎŒ‚ªK© _Toc247362991}DÐÉêyùºÎŒ‚ªK© _Toc247362992}DÐÉêyùºÎŒ‚ªK© _Toc247362993}DÐÉêyùºÎŒ‚ªK© _Toc247362994}DÐÉêyùºÎŒ‚ªK© _Toc247362995}DÐÉêyùºÎŒ‚ªK© _Toc247362996}DÐÉêyùºÎŒ‚ªK© _Toc247362997}DÐÉêyùºÎŒ‚ªK© _Toc247362998}DÐÉêyùºÎŒ‚ªK© _Toc247362999}DÐÉêyùºÎŒ‚ªK© _Toc247363000}DÐÉêyùºÎŒ‚ªK© _Toc247363001}DÐÉêyùºÎŒ‚ªK© _Toc247363002}DÐÉêyùºÎŒ‚ªK© _Toc247363003}DÐÉêyùºÎŒ‚ªK© _Toc247363004}DÐÉêyùºÎŒ‚ªK© _Toc247363005}DÐÉêyùºÎŒ‚ªK© _Toc247363006}DÐÉêyùºÎŒ‚ªK© _Toc247363007}DÐÉêyùºÎŒ‚ªK© _Toc247363008}DÐÉêyùºÎŒ‚ªK© _Toc247363009}DÐÉêyùºÎŒ‚ªK© _Toc247363010}DÐÉêyùºÎŒ‚ªK© _Toc247363011}DÐÉêyùºÎŒ‚ªK© _Toc247363012}DÐÉêyùºÎŒ‚ªK© _Toc247363013}DÐÉêyùºÎŒ‚ªK© _Toc247363014}DÐÉêyùºÎŒ‚ªK© _Toc247363015}DÐÉêyùºÎŒ‚ªK© _Toc247363016}DÐÉêyùºÎŒ‚ªK© _Toc247363017}DÐÉêyùºÎŒ‚ªK© _Toc247363018}DÐÉêyùºÎŒ‚ªK© _Toc247363019}DÐÉêyùºÎŒ‚ªK© _Toc247363020}DÐÉêyùºÎŒ‚ªK© _Toc247363021}DÐÉêyùºÎŒ‚ªK© _Toc247363022}DÐÉêyùºÎŒ‚ªK© _Toc247363023}DÐÉêyùºÎŒ‚ªK© _Toc247363024}DÐÉêyùºÎŒ‚ªK© _Toc247363025}DÐÉêyùºÎŒ‚ªK© _Toc247363026}DÐÉêyùºÎŒ‚ªK© _Toc247363027}DÐÉêyùºÎŒ‚ªK© _Toc247363028}DÐÉêyùºÎŒ‚ªK© _Toc247363029}DÐÉêyùºÎŒ‚ªK© _Toc247363030}DÐÉêyùºÎŒ‚ªK© _Toc247363031}DÐÉêyùºÎŒ‚ªK© _Toc247363032}DÐÉêyùºÎŒ‚ªK© _Toc247363033}DÐÉêyùºÎŒ‚ªK© _Toc247363034}DÐÉêyùºÎŒ‚ªK© _Toc247363035}DÐÉêyùºÎŒ‚ªK© _Toc247363036}DÐÉêyùºÎŒ‚ªK© _Toc247363037}DÐÉêyùºÎŒ‚ªK© _Toc247363038}DÐÉêyùºÎŒ‚ªK© _Toc247363039}DÐÉêyùºÎŒ‚ªK© _Toc247363040}DÐÉêyùºÎŒ‚ªK© _Toc247363041}DÐÉêyùºÎŒ‚ªK© _Toc247363042}DÐÉêyùºÎŒ‚ªK© _Toc247363043}DÐÉêyùºÎŒ‚ªK© _Toc247363044}DÐÉêyùºÎŒ‚ªK© _Toc247363045}DÐÉêyùºÎŒ‚ªK© _Toc247363046}DÐÉêyùºÎŒ‚ªK© _Toc247363047}DÐÉêyùºÎŒ‚ªK© _Toc247363048}DÐÉêyùºÎŒ‚ªK© _Toc247363049}DÐÉêyùºÎŒ‚ªK© _Toc247363050}DÐÉêyùºÎŒ‚ªK© _Toc247363051}DÐÉêyùºÎŒ‚ªK© _Toc247363052}DÐÉêyùºÎŒ‚ªK© _Toc247363053}DÐÉêyùºÎŒ‚ªK© _Toc247363054}DÐÉêyùºÎŒ‚ªK© _Toc247363055}DÐÉêyùºÎŒ‚ªK© _Toc247363056}DÐÉêyùºÎŒ‚ªK© _Toc247363057}DÐÉêyùºÎŒ‚ªK© _Toc247363058}DÐÉêyùºÎŒ‚ªK© _Toc247363059}DÐÉêyùºÎŒ‚ªK© _Toc247363060}DÐÉêyùºÎŒ‚ªK© _Toc247363061}DÐÉêyùºÎŒ‚ªK© _Toc247363062}DÐÉêyùºÎŒ‚ªK© _Toc247363063}DÐÉêyùºÎŒ‚ªK© _Toc247363064}DÐÉêyùºÎŒ‚ªK© _Toc247363065}DÐÉêyùºÎŒ‚ªK© _Toc247363066}DÐÉêyùºÎŒ‚ªK© _Toc247363067}DÐÉêyùºÎŒ‚ªK© _Toc247363068}DÐÉêyùºÎŒ‚ªK© _Toc247363069}DÐÉêyùºÎŒ‚ªK© _Toc247363070}DÐÉêyùºÎŒ‚ªK© _Toc247363071}DÐÉêyùºÎŒ‚ªK© _Toc247363072}DÐÉêyùºÎŒ‚ªK© _Toc247363073}DÐÉêyùºÎŒ‚ªK© _Toc247363074}DÐÉêyùºÎŒ‚ªK© _Toc247363075}DÐÉêyùºÎŒ‚ªK© _Toc247363076}DÐÉêyùºÎŒ‚ªK© _Toc247363077}DÐÉêyùºÎŒ‚ªK© _Toc247363078}DÐÉêyùºÎŒ‚ªK© _Toc247363079}DÐÉêyùºÎŒ‚ªK© _Toc247363080}DÐÉêyùºÎŒ‚ªK© _Toc247363081}DÐÉêyùºÎŒ‚ªK© _Toc247363082}DÐÉêyùºÎŒ‚ªK© _Toc247363083}DÐÉêyùºÎŒ‚ªK© _Toc247363084}DÐÉêyùºÎŒ‚ªK© _Toc247363085}DÐÉêyùºÎŒ‚ªK© _Toc247363086}DÐÉêyùºÎŒ‚ªK© _Toc247363087}DÐÉêyùºÎŒ‚ªK© _Toc247363088}DÐÉêyùºÎŒ‚ªK© _Toc247363089}DÐÉêyùºÎŒ‚ªK© _Toc247363090}DÐÉêyùºÎŒ‚ªK© _Toc247363091}DÐÉêyùºÎŒ‚ªK© _Toc247363092}DÐÉêyùºÎŒ‚ªK© _Toc247363093}DÐÉêyùºÎŒ‚ªK© _Toc247363094}DÐÉêyùºÎŒ‚ªK© _Toc247363095}DÐÉêyùºÎŒ‚ªK© _Toc247363096}DÐÉêyùºÎŒ‚ªK© _Toc247363097}DÐÉêyùºÎŒ‚ªK© _Toc247363098}DÐÉêyùºÎŒ‚ªK© _Toc247363099}DÐÉêyùºÎŒ‚ªK© _Toc247363100}DÐÉêyùºÎŒ‚ªK© _Toc247363101}DÐÉêyùºÎŒ‚ªK© _Toc247363102}DÐÉêyùºÎŒ‚ªK© _Toc247363103}DÐÉêyùºÎŒ‚ªK© _Toc247363104}DÐÉêyùºÎŒ‚ªK© _Toc247363105}DÐÉêyùºÎŒ‚ªK© _Toc247363106}DÐÉêyùºÎŒ‚ªK© _Toc247363107}DÐÉêyùºÎŒ‚ªK© _Toc247363108}DÐÉêyùºÎŒ‚ªK© _Toc247363109}DÐÉêyùºÎŒ‚ªK© _Toc247363110}DÐÉêyùºÎŒ‚ªK© _Toc247363111}DÐÉêyùºÎŒ‚ªK© _Toc247363112}DÐÉêyùºÎŒ‚ªK© _Toc247363113}DÐÉêyùºÎŒ‚ªK© _Toc247363114}DÐÉêyùºÎŒ‚ªK© _Toc247363115}DÐÉêyùºÎŒ‚ªK© _Toc247363116}DÐÉêyùºÎŒ‚ªK© _Toc247363117}DÐÉêyùºÎŒ‚ªK© _Toc247363118}DÐÉêyùºÎŒ‚ªK© _Toc247363119}DÐÉêyùºÎŒ‚ªK© _Toc247363120}DÐÉêyùºÎŒ‚ªK© _Toc247363121}DÐÉêyùºÎŒ‚ªK© _Toc247363122}DÐÉêyùºÎŒ‚ªK© _Toc247363123}DÐÉêyùºÎŒ‚ªK© _Toc247363124}DÐÉêyùºÎŒ‚ªK© _Toc247363125}DÐÉêyùºÎŒ‚ªK© _Toc247363126}DÐÉêyùºÎŒ‚ªK© _Toc247363127}DÐÉêyùºÎŒ‚ªK© _Toc247363128}DÐÉêyùºÎŒ‚ªK© _Toc247363129}DÐÉêyùºÎŒ‚ªK© _Toc247363130}DÐÉêyùºÎŒ‚ªK© _Toc247363131}DÐÉêyùºÎŒ‚ªK© _Toc247363132}DÐÉêyùºÎŒ‚ªK© _Ref201664889}DÐÉêyùºÎŒ‚ªK© _Ref201664889«DÐÉêyùºÎŒ‚ªK© ÀFSySync_script_call_flow.pdfÿÿ­Þ}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref201664889}DÐÉêyùºÎŒ‚ªK© _Ref201664889}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref204935552}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref185246110{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref182997657}DÐÉêyùºÎŒ‚ªK© _Ref207618734}DÐÉêyùºÎŒ‚ªK© _Ref204937964{DÐÉêyùºÎŒ‚ªK©  _Ref42673942}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref204935761}DÐÉêyùºÎŒ‚ªK© _Ref203479102}DÐÉêyùºÎŒ‚ªK© _Ref204935780}DÐÉêyùºÎŒ‚ªK© _Ref203482186}DÐÉêyùºÎŒ‚ªK© _Ref203482205}DÐÉêyùºÎŒ‚ªK© _Ref153590626{DÐÉêyùºÎŒ‚ªK©  _Ref42675268}DÐÉêyùºÎŒ‚ªK© _Ref153590626}DÐÉêyùºÎŒ‚ªK© _Ref184459487}DÐÉêyùºÎŒ‚ªK© _Ref183001062}DÐÉêyùºÎŒ‚ªK© _Ref184460000}DÐÉêyùºÎŒ‚ªK© _Ref183001062}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref185245663}DÐÉêyùºÎŒ‚ªK© _Ref185246110{DÐÉêyùºÎŒ‚ªK©  _Ref47775300{DÐÉêyùºÎŒ‚ªK©  _Ref47775275yDÐÉêyùºÎŒ‚ªK©  _Ref6129297{DÐÉêyùºÎŒ‚ªK©  _Ref47165113{DÐÉêyùºÎŒ‚ªK©  _Ref47165137{DÐÉêyùºÎŒ‚ªK©  _Ref47165113{DÐÉêyùºÎŒ‚ªK©  _Ref47165137}DÐÉêyùºÎŒ‚ªK© _Ref184460000}DÐÉêyùºÎŒ‚ªK© _Ref204511965}DÐÉêyùºÎŒ‚ªK© _Ref184460000}DÐÉêyùºÎŒ‚ªK© _Ref184459204}DÐÉêyùºÎŒ‚ªK© _Ref204511965}DÐÉêyùºÎŒ‚ªK© _Ref184459204}DÐÉêyùºÎŒ‚ªK© _Ref183001062}DÐÉêyùºÎŒ‚ªK© _Ref184459487}DÐÉêyùºÎŒ‚ªK© _Ref206385571}DÐÉêyùºÎŒ‚ªK© _Ref206385661}DÐÉêyùºÎŒ‚ªK© _Ref184460158}DÐÉêyùºÎŒ‚ªK© _Ref185247389{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref185246110}DÐÉêyùºÎŒ‚ªK© _Ref185245663}DÐÉêyùºÎŒ‚ªK© _Ref185246110}DÐÉêyùºÎŒ‚ªK© _Ref204922935}DÐÉêyùºÎŒ‚ªK© _Ref204925451{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref43727928{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref204936212}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref185261956}DÐÉêyùºÎŒ‚ªK© _Ref185247389}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref185262282}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref204925451{DÐÉêyùºÎŒ‚ªK©  _Ref42506966{DÐÉêyùºÎŒ‚ªK©  _Ref42517152«DÐÉêyùºÎŒ‚ªK© ÀFSySync_script_call_flow.pdfÿÿ­ÞyDÐÉêyùºÎŒ‚ªK©  _Ref5625615{DÐÉêyùºÎŒ‚ªK©  _Ref42509834yDÐÉêyùºÎŒ‚ªK©  _Ref6030571{DÐÉêyùºÎŒ‚ªK©  _Ref42673816yDÐÉêyùºÎŒ‚ªK©  _Ref5625615{DÐÉêyùºÎŒ‚ªK©  _Ref42671142}DÐÉêyùºÎŒ‚ªK© _Ref185238839{DÐÉêyùºÎŒ‚ªK©  _Ref42511232{DÐÉêyùºÎŒ‚ªK©  _Ref42517152{DÐÉêyùºÎŒ‚ªK©  _Ref42589436{DÐÉêyùºÎŒ‚ªK©  _Ref42588386{DÐÉêyùºÎŒ‚ªK©  _Ref42509834{DÐÉêyùºÎŒ‚ªK©  _Ref42590185{DÐÉêyùºÎŒ‚ªK©  _Ref42511232}DÐÉêyùºÎŒ‚ªK© _Ref153285595}DÐÉêyùºÎŒ‚ªK© _Ref153285595}DÐÉêyùºÎŒ‚ªK© _Ref247357288{DÐÉêyùºÎŒ‚ªK©  _Ref42672298{DÐÉêyùºÎŒ‚ªK©  _Ref42673942{DÐÉêyùºÎŒ‚ªK©  _Ref78023979{DÐÉêyùºÎŒ‚ªK©  _Ref78023979³DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Bhttp://www.pcre.org/yXô;H¯,‚]Ä…'c¥«}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref182995906{DÐÉêyùºÎŒ‚ªK©  _Ref36890908{DÐÉêyùºÎŒ‚ªK©  _Ref36890908{DÐÉêyùºÎŒ‚ªK©  _Ref36890908{DÐÉêyùºÎŒ‚ªK©  _Ref36890908}DÐÉêyùºÎŒ‚ªK© _Ref204926421}DÐÉêyùºÎŒ‚ªK© _Ref204926421}DÐÉêyùºÎŒ‚ªK© _Ref204926421}DÐÉêyùºÎŒ‚ªK© _Ref204926421}DÐÉêyùºÎŒ‚ªK© _Ref204926421}DÐÉêyùºÎŒ‚ªK© _Ref204926421}DÐÉêyùºÎŒ‚ªK© _Ref185257870}DÐÉêyùºÎŒ‚ªK© _Ref185261956}DÐÉêyùºÎŒ‚ªK© _Ref185261956}DÐÉêyùºÎŒ‚ªK© _Ref185257870}DÐÉêyùºÎŒ‚ªK© _Ref185257870}DÐÉêyùºÎŒ‚ªK© _Ref204922935{DÐÉêyùºÎŒ‚ªK©  _Ref42675268{DÐÉêyùºÎŒ‚ªK©  _Ref47156991{DÐÉêyùºÎŒ‚ªK©  _Ref42675268}DÐÉêyùºÎŒ‚ªK© _Ref204932692{DÐÉêyùºÎŒ‚ªK©  _Ref47170147{DÐÉêyùºÎŒ‚ªK©  _Ref42675268{DÐÉêyùºÎŒ‚ªK©  _Ref43727925}DÐÉêyùºÎŒ‚ªK© _Ref203481904{DÐÉêyùºÎŒ‚ªK©  _Ref43727925}DÐÉêyùºÎŒ‚ªK© _Ref203481972{DÐÉêyùºÎŒ‚ªK©  _Ref42589436}DÐÉêyùºÎŒ‚ªK© _Ref206062819{DÐÉêyùºÎŒ‚ªK©  _Ref70164511}DÐÉêyùºÎŒ‚ªK© _Ref207622654{DÐÉêyùºÎŒ‚ªK©  _Ref54091188{DÐÉêyùºÎŒ‚ªK©  _Ref54091192}DÐÉêyùºÎŒ‚ªK© _Ref153773639{DÐÉêyùºÎŒ‚ªK©  _Ref42941679{DÐÉêyùºÎŒ‚ªK©  _Ref45368759{DÐÉêyùºÎŒ‚ªK©  _Ref55271118{DÐÉêyùºÎŒ‚ªK©  _Ref43008951{DÐÉêyùºÎŒ‚ªK©  _Ref42672298}DÐÉêyùºÎŒ‚ªK© _Ref153284855{DÐÉêyùºÎŒ‚ªK©  _Ref45001933{DÐÉêyùºÎŒ‚ªK©  _Ref54091553{DÐÉêyùºÎŒ‚ªK©  _Ref54091119{DÐÉêyùºÎŒ‚ªK©  _Ref97961473}DÐÉêyùºÎŒ‚ªK© _Ref231887961}DÐÉêyùºÎŒ‚ªK© _Ref231888133}DÐÉêyùºÎŒ‚ªK© _Ref231887961}DÐÉêyùºÎŒ‚ªK© _Ref231888133}DÐÉêyùºÎŒ‚ªK© _Ref231887961{DÐÉêyùºÎŒ‚ªK©  _Ref42675268}DÐÉêyùºÎŒ‚ªK© _Ref135023442}DÐÉêyùºÎŒ‚ªK© _Ref153291752}DÐÉêyùºÎŒ‚ªK© _Ref153291752{DÐÉêyùºÎŒ‚ªK©  _Ref69052620{DÐÉêyùºÎŒ‚ªK©  _Ref46904847{DÐÉêyùºÎŒ‚ªK©  _Ref46823382}DÐÉêyùºÎŒ‚ªK© _Ref153288035{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref46821357}DÐÉêyùºÎŒ‚ªK© _Ref153288035{DÐÉêyùºÎŒ‚ªK©  _Ref46823145{DÐÉêyùºÎŒ‚ªK©  _Ref55271118{DÐÉêyùºÎŒ‚ªK©  _Ref46823382{DÐÉêyùºÎŒ‚ªK©  _Ref47451551{DÐÉêyùºÎŒ‚ªK©  _Ref47451589}DÐÉêyùºÎŒ‚ªK© _Ref203479102}DÐÉêyùºÎŒ‚ªK© _Ref184460000}DÐÉêyùºÎŒ‚ªK© _Ref184460000}DÐÉêyùºÎŒ‚ªK© _Ref203380577}DÐÉêyùºÎŒ‚ªK© _Ref184459204}DÐÉêyùºÎŒ‚ªK© _Ref203475251}DÐÉêyùºÎŒ‚ªK© _Ref184460000{DÐÉêyùºÎŒ‚ªK©  _Ref42675038{DÐÉêyùºÎŒ‚ªK©  _Ref42675038}DÐÉêyùºÎŒ‚ªK© _Ref153282321}DÐÉêyùºÎŒ‚ªK© _Ref153282321}DÐÉêyùºÎŒ‚ªK© _Ref153282518}DÐÉêyùºÎŒ‚ªK© _Ref153285510}DÐÉêyùºÎŒ‚ªK© _Ref153284855}DÐÉêyùºÎŒ‚ªK© _Ref153336229ô'Dd)¬ ðf² ð C ðBAÁ*ÿdebuglog_folding.pngð€bð:'öÆÑ6²ÈTcBLRƒwf2ÿ'ü-nð'öÆÑ6²ÈTcBLRƒwf2ÿ‰PNG  IHDR¼”þ¸mftEXtSoftwareGraphicConverter5]Hî&ŸIDATxœì]=¨ÉÞL™ÁŒƒáÀ\ràèìËeü…vü:N$!pxÚŠO¡`áàxl¢@ Ìé¼»@’ûtHÈœl×¾z[[SÕUSó?+ÕG³ôövWW×Îv}Ý]3»ªÁæ´º{û2}ÿ{^¢jÐ$q°øÝoW=›ó4¬¨ž‰Dâä°0]?jpp_CF3¡1H‚oJó‡RŠ‹ÎˆžŽ&–Ìp,):åwv& Žæ“Y/R ¸v ¯V°Ñ\aî¿iðqÞà­qq¯ßÜ{ЪmOÒ€ÀH :S€Œ¾—Ò# õ½úwb§¡’£Ž´4´DñxÆ?¼i$ "§þí¾(Ó³ñ9 þóè.¾*ªoî”wîš%X„ L‹ëõ¥@ÈЂ›7Ç<†æá EÄnAÒÒ8í C A§ 1¡È| °Në)(OÈúÔ4Çj84²'úZºõ”êõQ2BCÒÄ’ÙŽ%E§"¼ ‘4PCKó)­qÏø°¦Î¦ï"´à»ÿ¶ÇÅ ¸×´b^ÞÿŒŸÛ›ÿöì÷3 ÿzó¸ªÇ@‡€<Ôysþìë“O´YÂü‚šèŽãÝ! þñD¥b¬jˆQHC¤¾Ôƒý>u\ô~‚°õìð¤HÑ;O jš;å}ºÖ‘Œz€ÇEáê"ÒŠ£Ä(°Õn¹y"d& Ú‚d P'`›ˆ»´ìFoÑ?Qàzµ#:xʮ͈ —¡t[N³29<ÒÀƒüŒhÒ ü‰b „îô0Hƒ‡z&Aô›:ä §˜Æ~ÂRü"l{|°¼Z?Þ}Äç/“Áa“9ZÄ4Ä1i7P$æ@’†ÄìŠÀC\qseT/ÂCd Õűśógô–þcüUĸà®!Ƙ4Ø·\ŽwOÄ1 ihøYNÅ­B_Ó8=&oHÖë}Ю5†8ôÁ[¾Z?¤ç a,d1Äa±x¢îðbm=—nÒAB\ qÏ$¥Ï?øô¿ù“UsÀÄÛýÔSúÙ¯—ß_ÃD"‘H¼å(=FznEé1ÒÓkÁ˜³zäb‘†®ê%‰Dâ€æ £ý!ä¤0þ°j]iænNÒ!µSÓxÚv"‘H${„ÿû00í_cGP?£ú…ÃIÆ% ×Ëÿr™H$‰DE_‹N >Zø²Ô%‹ÔgPöEŒfDÒ 9cL$‰D"‹:÷Û×€úø /¥h`MpfÑU›/C"‘H$ZÁ÷Ä|bÊMÜNpvfwÁŒ[ˆæ=²Nq‰D"‘ètÒî¹È$(µ…háÂç.ï$åÿÿÿì»jI†­ã 6ó[øü4›ïKø Œab;Š– '“c6h‚b(ê=èggërúôuºåÿ£¥¾Tºt×?U§»êïçn¨á ‹žÔXÞ”=7¿¿M¶ä„ÝŸenâÉ“x8ì·ŸßËΫ¿>=þ{¯û%l­’£~<„Bf¢‡z˜y[¤VPÚ>Vâ(£±&„ü‰w€áéñˆ>XùѱDH:ûãý]Qßv—öœéÄC!ä<´ºÌ)–4áøÂ™3`»öàN| &6¤1[œ$$*áÇ—þùþ59´ýü>!„óÓÉÉ`à6¿ Åx„?‹‘#mÿöë»×¿¼:áÛu.ÑÒ‘Õ²çp{Ý)B! bˆSÂp—ˆEÒý[êÓ ±ç"~•á›S냭£ƒ†¥G¿üð8íéñ¨³ èš.·C êµ€-ŸÉãw…B™ˆ °Œ5ô 6–hH©h@X¤ö«†Àî&d}_ÈÃí5Ü$o¶~< „BVÁH«¶élP«ŒÐÓ*s9“Іx8žŽ^]0ð4˜BY2‹[êõ,¢Áyo3’Pî ©àýŽ`<„BÈ’yi¢ÁvÒÑ€A‚ˆa­’¢6Å`߯l‡BY,‹ Ðï4èž_vDÃþj+a}y2ñ?ÈÒBÀáá°oN3ði–q¦ìwŠ– O!„U°bÑÏ,ߘp!èçí‰b$rF)ä¯\¨^¢àÿHëY› ¡h „² V,!„2' „B AÑ@!„ „B AÑ@!„ „B AÑ@!„ „B AÑ@!„+ ­kMõ¥EÄ“'ñpØããùºØÖ*]{Bϯ}¬ºÈÓãQ×Ï´áœÖ5·”o»Kœ¹¿ÚÎÿ=ʸËa¸ÍÅ2w>T:IµŸ¢^f¨k[°Ó¥2çºÖx’å°bÑÐT–rPÆí“ÛìxWTyŠaÃÚjªÿÉêœÃíµ> m8bd˜×CÇ?vTÄÐÔ+*X«î8^¦p¿7¨_†—Õc?õkj*aóÕó3jKœ~¶Š2qÏ•8œ1•äÜlìrsFÃYøâ~F¯“Ž;/Lôk‹­±UB®ò删 ¡uo'íØ"TH;[Ó6øù ¿òiˆ}ñ8áÖi2ç*k(°N)™„&‰ˆå×t|üãX »^p¬â­•I+“®ï—0†éÎe¾ªîˆWIW)z94õŠ{äÅ“áóU]Ïj§WG©.Ö¦ÅS:JØ|õÒ}ü³P?WòTMQ’àÓ‡sÇFCTÀéW\—^ÎÓz^À4¹ûéý´½?Ð^rwY·÷ÜÏ«Ç8þ’ý1¦»%âq¤ý»PdíóJiûA>¡µïº…õŒžÿ…0Í0Zs:Àµîз;{BvÛ4L]8Í2OÁVÑÕ±'Êï²Y=±ê a·¤Ìš` ±’—þsùëº.2[×cQ°cqO`'×+ÉWî¾z…Þ7YÐ(çt‘·†$à(0 F´Àh€ УZ`4@‹;6Vëè9Å–Óg¡xÆ$´þÚi¶/v”ÊçG­ÂÎ!Ÿ–íjÕ¿þøÍ|ãz­ÃÕ¥ÕRŒ…TSÁêÔµl¥~ZSo\¦Ü±Ñ°Í¶„ˆe4ˆ¤T|ùýdl{ÆøO{Oá/ ­ ›8*ã±xUÂÊ…ï¦÷(J[!¤mAìoÜdÜ4¤Øô¡ÊOšf™¯Û_§î‹ÇÔWû(€sßFÃö —9K ™Ö÷½dÒ¥´_ðnøs1ØQ®‡0Šÿ¦«Q1WÓ.áÓ˜›Å2¦;nU¤®ãXMv»ö€‚›3®Üûó(Š=nØ™qãÚ1ü¨¡|ñígQ Ú²+í04½wø(£Áôý´œëÔ}ϧí½Ê®ìøxÖh˜¢«úö­O›à›nmÖ´ÿu&Ãoåh‚ ì©§øý§þùxµÎø6Ûx³“ë±kAÙûöýÞÔ1¹?<á÷~ÿöÕÒ]¹AÔ©ËïD‘öþ9vT à‘xX£aÚš®2Oëýæ ¥5MÈÕíè iÍ_¹=ÆžóiøBKI¼íÃc`*‰þ¾½¾XO'ãò4¤>WMíÚh`nÖ¤m‘ŒvOÇ2Þ;šAýÔ·°‘w21V<—ÑÐ?î'äø©+Ã8”P‡Oøl‹¨M§FÃJÔ+3¾k4lï’÷pDÍ~Oƒ²éþ•»ø½Åuê[pM=w‹a€§£!·w/H¨ðmL޻ᮣoÿ!FƒÔí•= ñX£<±«&%½½ëééUH¿}ï÷šð–âtâCú*wPðhFCTÒÝéýÿ»ìš+7ÕÇgéȤ1¤nmá̱k4ÄÑÂhqü"]Õ`ÁÊu´J£ÝP§¾ 7g4œÅ8Ý?öEwt§VðÉã̽”wekä[óôâ,;iÇ¡BÚ¸«ð[9ˆîzt4,*™#— Z‹©([‘üÔ%²>á?˜®ÄàÅ;–çJ÷Œ÷*é¿ÿüݧMÖ©¯âVq pîØhGüW\—ì†ÓzöÄ4»+¶Ô]Õ™• žÿÓ» ¤Ÿ_…ßöŒ­#éºyû°9ìdZz².–”ñtÕ šDœ]¢_êZ0,Ë#p]»’A%<•mûy­Æ~¥×O˜zPõ­xfîØh€kˆk'ë÷ËŒº}( €) OŠéÅèøöúÂR…íè4´yZÑ7:øw凌.fqgh6¤Ç㻯ï~X.Ù#½È^ªj°šàû#©~ÿXåfF,w| sñ‘A¯ëœŠ5g# •š´uõ‘Ý“²]ŠÖ‹¤Ðz„V"b£öl\šiš×PŽ]¢xqžV4¤"÷ëµSqWÚ\°ßlÈÝmÝ i¯àzKö·^¹ØZÕÀ±ùî­ý7-ÑŸö†m]¨¢¤×q-ÿ›Ú¶ÙK¸TEÜiÆ®ÕE³ÙOštiǃ”ê—©º’tÆàGÙ[¸•× óßçò—øæV_J0wk~}¦¡ˆŸÎˆ;›¢¡gêÎŽЬG>o!ÉU§j4¹¢JÒæÍ^‘DŒSªr]Iƒ¼9Ó‚hÈóüw4Tçí?jXšÑ îYÍ úö!¢Ardr¦¡Y×Müãâ&>¥ w䃢h›) %>g“tI5= ãÙDCŒ0ã;çO?nJŠÞ4¸üñ}¢AT§»_4(¾ÂrÉ‹=èWÓÎ÷Ÿßýþ¯hYÁ«Z®÷O$û{E^y’ ¾ Âgkzæi£§'Á— 7‘Nê¯ý£}½ïqÝÂæsÍmì x.àÜáàÈØdá`¬3ß ·ÆoT®©bÙÝ’¦ÕzƒÅŸ"5P=’ÕÔnEƒÝuÖ{¬*[ÿ$“HÝ5¨¤ ÙŠÛ9¨F?è{>å{#]pÕÖ=²üu~Í té]až¾ŒÛ6Oscö‹póÑ7ÇüCø•ð®mzo7)f‰,Tàƒ–¿vc›q'„rv+¦0ÍUGk½Ž:à¦Ïë6¤Î5ÆBŠgBtžò6ÓëŸÆîvÁ–õbüŸzè,?ª•™½¤×šF¯øQ£XÄ’zÍ ó"CL×{»I1K4LÇ”¿NŠQ4Bn‡Û ã÷ã éÔ¿¹+Ÿí î),0{M¯ÇGÃe€ Š¡õJƒx_]òiF'tW0òMÛ¬þ³yt“b®hÐÐ×]þ²!„Œ@Ñà§Ë бJ3ô¯H_ÜW$ö~=®4dùg‰Œ@œp» §Ÿ®Wß…Ëw—uÉÑÓ€ 'V\žé¥h˜ÌžNfêH— !äÙ›h°ÎxÄËfSÕnCñÝl: š ¦[ ²á8„ÇÂîæŸ%¦ã꽋ñŒ•Øg#íCŒ‚¼t‹ ±¸S ˜ý»õ‰ød¦«DÌ(Lmª:ŠBȳ9Ñ0‹xZ€]ñ²pTúð¤ž6Òy0v²ñÜ}j_å^*DN¹‡ËÒ§™1 Ù=Ž1(z$éÍuõ,í ã€ÀÛÓ šg9 ~É,9Ý æ‡¿wÅñ!WØäÝ»§ËÐ5c¤x–~¦§¤ãß¿ÿR¹Þ¿o—ÕV$ƒéVë>¦˜¯Aææò±¢Ô§O/Ò1ªŠ¼+yÞ¾}ºùñcv+®¶.ëGãØNýöÇŸ¸.lÃkµKY̶DÀ׺^â€x5øW¸ ¹‡ŸËÒ†8Å/_žj.p_뙃Żéë›.:®Þ—Ȧˆ$6…E=žYwÔf} Ù1Î\· óQΩ۪𠟾ðø¸ÄyŠ+°ÖÆšÒÙaÍ{]·MÑ@ȱEÑ ÎnÒ}ÅãßþòWßÊÒ§£_Á[]œ;ÉÌ,ÞM_ßtÑñ»»N‹‚¨xW¶¨¶îNSúŒ3×ù¥kª\¶39oé¬h—¼+§²¤‰¢®Û.2¬wù „\éרøOTŸ\4¸y­~fÞ+KÇLº»Bд¡0c°x7}}ÓYÇÕÓ‹WÙ1‚]i¨U hXà O(Dèl[FÏýœÃycm&3ïbk MKšØ!qÛÙVE!7ÅEƒKׯû¹¢áþþÙ’X‡Aœs‹¯Y¥ˆMÛ¥ò¬ã$Ë.­Ç•v™˜"à#3fhp³yµDÔ \¸®ý u|@YÍšC=&ÛÁˆèůǟºÔšÝ> À? Âlµ’SÆÄޤ}uª1nÀëÑP{lPl®§#vºûhIV§¢YnÛJU¶†¨-ð2 _ h äŠØ´hÀR~ÑÏ ðOÓqæÝô]¢s‹¯ ±éѤÔ㣦Œ¢AŒÆB® M_®¢az¹v¢"îƒ(.O¶òT ã€Jä²K/ðÄ2Èâ‰]µâP¥9ŒU”R¤kL1Øu’²ðèq’õ´°³¾/ê´,pÛV7ÔéNUœc­‚r16-äûÔFÅÏ 6½ðIµ ÑŒ¹Å׈†ºéAwÞ]¯Ö¬7¬ S+n`Äà àHþ&Ýy8ø‹¢¹5Æ£1£mdÀ³ S{ßµ³°ddį4¸²]1ò’²e¶+d^U„ÄÛ—ËÒkßÐ5c°x‘¾ éºTÖÐH^ ,ÛÊüºÐ|ë’¢Áæ«®×*N.¦0RÀ>Ñcÿµº=%²Z½x¶éP¯P4²{6*ä›T&aú}ŠÕõƒYâyz"KÏ»ì34Í/^§¯oz¼ƒÙ9 ®6»¿þé‰iúµðº¢Á>>sx¹9eÙ9D°;#ö„ ¥¹¢0bgaIV§åTOOP4²{†—ws¢h¨Ï .ž ß¶sÏi¨Ïpèƒõvæ×4c¼x‘¾¸i”uPnÄU<<ÒAyKF@Ƨijf¼XÛ4FªÒÆb4¤8²aœõÃÅ‘ú¬æoÚéBvœ…jIV§eÛÖ GWUɘB®š³ˆ†‘üÞó­‡°/{Yo:÷DÈâ¤H׺½ºft‹ékšŽ‘Œ±ƒrYìágdG‰¨:x>qK#'BN‰«Ž½À…p}×;{¯±ýêùbå žžp¶Iפ#ÒM}ú@ÁÃ5.4ûõ%<±3UbêÑ@‹n(t½5ÂÓÎNmêÐZh-©ëTVІæîF¬ŸOO²¶(È–¹ñOj—Ý?·Û®ë§h äŠøÿÿìÛÁ € EÑÿÿë¶-ŸX:Žçà>l .h¢1—OªåöEª ý>ÇÍ\>¦üLä ï%6®Ý¯ˆT‰ 8ÑD¾Œ†¡5ÿ\`%ÑDDit øÓÿÿœY>u"°IEND®B`‚}DÐÉêyùºÎŒ‚ªK© _Ref153612150}DÐÉêyùºÎŒ‚ªK© _Ref153612128}DÐÉêyùºÎŒ‚ªK© _Ref153557607}DÐÉêyùºÎŒ‚ªK© _Ref153590626{DÐÉêyùºÎŒ‚ªK©  _Ref43727925}DÐÉêyùºÎŒ‚ªK© _Ref203481633}DÐÉêyùºÎŒ‚ªK© _Ref153590626{DÐÉêyùºÎŒ‚ªK©  _Ref43727925}DÐÉêyùºÎŒ‚ªK© _Ref153612650}DÐÉêyùºÎŒ‚ªK© _Ref153603854{DÐÉêyùºÎŒ‚ªK©  _Ref36888765}DÐÉêyùºÎŒ‚ªK© _Ref185246210}DÐÉêyùºÎŒ‚ªK© _Ref185261956}DÐÉêyùºÎŒ‚ªK© _Ref185238094{DÐÉêyùºÎŒ‚ªK©  _Ref46747184yDÐÉêyùºÎŒ‚ªK©  _Ref5709751yDÐÉêyùºÎŒ‚ªK©  _Ref6058882yDÐÉêyùºÎŒ‚ªK©  _Ref6029952yDÐÉêyùºÎŒ‚ªK©  _Ref6029971}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref185238094yDÐÉêyùºÎŒ‚ªK©  _Ref6042344yDÐÉêyùºÎŒ‚ªK©  _Ref6060179yDÐÉêyùºÎŒ‚ªK©  _Ref6030571yDÐÉêyùºÎŒ‚ªK©  _Ref6042851yDÐÉêyùºÎŒ‚ªK©  _Ref6043386}DÐÉêyùºÎŒ‚ªK© _Ref182996929}DÐÉêyùºÎŒ‚ªK© _Ref182997376}DÐÉêyùºÎŒ‚ªK© _Ref182997381yDÐÉêyùºÎŒ‚ªK©  _Ref6042344}DÐÉêyùºÎŒ‚ªK© _Ref182997376}DÐÉêyùºÎŒ‚ªK© _Ref182997381{DÐÉêyùºÎŒ‚ªK©  _Ref42941679yDÐÉêyùºÎŒ‚ªK©  _Ref6046402}DÐÉêyùºÎŒ‚ªK© _Ref182996673}DÐÉêyùºÎŒ‚ªK© _Ref231889747{DÐÉêyùºÎŒ‚ªK©  _Ref62467260{DÐÉêyùºÎŒ‚ªK©  _Ref36890908{DÐÉêyùºÎŒ‚ªK©  _Ref62467260yDÐÉêyùºÎŒ‚ªK©  _Ref6049927}DÐÉêyùºÎŒ‚ªK© _Ref182995906yDÐÉêyùºÎŒ‚ªK©  _Ref6049927}DÐÉêyùºÎŒ‚ªK© _Ref182997376}DÐÉêyùºÎŒ‚ªK© _Ref182997381}DÐÉêyùºÎŒ‚ªK© _Ref182740974yDÐÉêyùºÎŒ‚ªK©  _Ref6043386yDÐÉêyùºÎŒ‚ªK©  _Ref6055322}DÐÉêyùºÎŒ‚ªK© _Ref185257870}DÐÉêyùºÎŒ‚ªK© _Ref153617304yDÐÉêyùºÎŒ‚ªK©  _Ref6060179yDÐÉêyùºÎŒ‚ªK©  _Ref6030571}DÐÉêyùºÎŒ‚ªK© _Ref153617348{DÐÉêyùºÎŒ‚ªK©  _Ref45025338{DÐÉêyùºÎŒ‚ªK©  _Ref45025338}DÐÉêyùºÎŒ‚ªK© _Ref153617348yDÐÉêyùºÎŒ‚ªK©  _Ref6058085}DÐÉêyùºÎŒ‚ªK© _Ref153617348yDÐÉêyùºÎŒ‚ªK©  _Ref6058882}DÐÉêyùºÎŒ‚ªK© _Ref153617348yDÐÉêyùºÎŒ‚ªK©  _Ref6030571}DÐÉêyùºÎŒ‚ªK© _Ref103576461}DÐÉêyùºÎŒ‚ªK© _Ref103576458{DÐÉêyùºÎŒ‚ªK©  _Ref46895327{DÐÉêyùºÎŒ‚ªK©  _Ref46895428{DÐÉêyùºÎŒ‚ªK©  _Ref46823145{DÐÉêyùºÎŒ‚ªK©  _Ref46895473{DÐÉêyùºÎŒ‚ªK©  _Ref46895489{DÐÉêyùºÎŒ‚ªK©  _Ref42944330{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref55271118{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref55271118{DÐÉêyùºÎŒ‚ªK©  _Ref46904847{DÐÉêyùºÎŒ‚ªK©  _Ref46908455{DÐÉêyùºÎŒ‚ªK©  _Ref55271118}DÐÉêyùºÎŒ‚ªK© _Ref169607904{DÐÉêyùºÎŒ‚ªK©  _Ref47156991{DÐÉêyùºÎŒ‚ªK©  _Ref46904847{DÐÉêyùºÎŒ‚ªK©  _Ref47156991{DÐÉêyùºÎŒ‚ªK©  _Ref46904847yDÐÉêyùºÎŒ‚ªK©  _Ref6046402{DÐÉêyùºÎŒ‚ªK©  _Ref47164085{DÐÉêyùºÎŒ‚ªK©  _Ref90895285{DÐÉêyùºÎŒ‚ªK©  _Ref47164085}DÐÉêyùºÎŒ‚ªK© _Ref135023442}DÐÉêyùºÎŒ‚ªK© _Ref135023442}DÐÉêyùºÎŒ‚ªK© _Ref133810323}DÐÉêyùºÎŒ‚ªK© _Ref207626203{DÐÉêyùºÎŒ‚ªK©  _Ref90895148{DÐÉêyùºÎŒ‚ªK©  _Ref90895208{DÐÉêyùºÎŒ‚ªK©  _Ref70164454{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref13981914yDÐÉêyùºÎŒ‚ªK©  _Ref5614672{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref45371286{DÐÉêyùºÎŒ‚ªK©  _Ref45371414}DÐÉêyùºÎŒ‚ªK© _Ref153699553}DÐÉêyùºÎŒ‚ªK© _Ref153699553}DÐÉêyùºÎŒ‚ªK© _Ref185261956}DÐÉêyùºÎŒ‚ªK© _Ref204925451}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref231889747{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref47167783{DÐÉêyùºÎŒ‚ªK©  _Ref46754571{DÐÉêyùºÎŒ‚ªK©  _Ref47168251{DÐÉêyùºÎŒ‚ªK©  _Ref46754571}DÐÉêyùºÎŒ‚ªK© _Ref153681044{DÐÉêyùºÎŒ‚ªK©  _Ref47168523{DÐÉêyùºÎŒ‚ªK©  _Ref47168540{DÐÉêyùºÎŒ‚ªK©  _Ref47171157{DÐÉêyùºÎŒ‚ªK©  _Ref47169243{DÐÉêyùºÎŒ‚ªK©  _Ref42941679{DÐÉêyùºÎŒ‚ªK©  _Ref47170147{DÐÉêyùºÎŒ‚ªK©  _Ref47171157{DÐÉêyùºÎŒ‚ªK©  _Ref43727921{DÐÉêyùºÎŒ‚ªK©  _Ref43727928}DÐÉêyùºÎŒ‚ªK© _Ref185257870{DÐÉêyùºÎŒ‚ªK©  _Ref78024414{DÐÉêyùºÎŒ‚ªK©  _Ref43727921{DÐÉêyùºÎŒ‚ªK©  _Ref68495073{DÐÉêyùºÎŒ‚ªK©  _Ref78024414}DÐÉêyùºÎŒ‚ªK© _Ref185246110{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref42944330{DÐÉêyùºÎŒ‚ªK©  _Ref42943895{DÐÉêyùºÎŒ‚ªK©  _Ref42944330{DÐÉêyùºÎŒ‚ªK©  _Ref55271118{DÐÉêyùºÎŒ‚ªK©  _Ref45368706{DÐÉêyùºÎŒ‚ªK©  _Ref55271118}DÐÉêyùºÎŒ‚ªK© _Ref169609101}DÐÉêyùºÎŒ‚ªK© _Ref169607904yDÐÉêyùºÎŒ‚ªK©  _Ref5625615{DÐÉêyùºÎŒ‚ªK©  _Ref55271118yDÐÉêyùºÎŒ‚ªK©  _Ref6129297yDÐÉêyùºÎŒ‚ªK©  _Ref6060179}DÐÉêyùºÎŒ‚ªK© _Ref247361819{DÐÉêyùºÎŒ‚ªK©  _Ref42941679}DÐÉêyùºÎŒ‚ªK© _Ref153291752}DÐÉêyùºÎŒ‚ªK© _Ref153732324}DÐÉêyùºÎŒ‚ªK© _Ref153288035{DÐÉêyùºÎŒ‚ªK©  _Ref55274563}DÐÉêyùºÎŒ‚ªK© _Ref153732596{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref46823145}DÐÉêyùºÎŒ‚ªK© _Ref247356244}DÐÉêyùºÎŒ‚ªK© _Ref247356327{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref42941679{DÐÉêyùºÎŒ‚ªK©  _Ref43008774}DÐÉêyùºÎŒ‚ªK© _Ref166651506{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref54100850{DÐÉêyùºÎŒ‚ªK©  _Ref46896711}DÐÉêyùºÎŒ‚ªK© _Ref247356737{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref55274563{DÐÉêyùºÎŒ‚ªK©  _Ref46896711}DÐÉêyùºÎŒ‚ªK© _Ref111000885{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref46908455}DÐÉêyùºÎŒ‚ªK© _Ref111000885}DÐÉêyùºÎŒ‚ªK© _Ref111000885}DÐÉêyùºÎŒ‚ªK© _Ref131305143{DÐÉêyùºÎŒ‚ªK©  _Ref43727925}DÐÉêyùºÎŒ‚ªK© _Ref111000885{DÐÉêyùºÎŒ‚ªK©  _Ref43727925}DÐÉêyùºÎŒ‚ªK© _Ref111000885}DÐÉêyùºÎŒ‚ªK© _Ref153732324}DÐÉêyùºÎŒ‚ªK© _Ref153732324žDÐÉêyùºÎŒ‚ªK© ÀFSDK_manual.pdfÿÿ­Þ}DÐÉêyùºÎŒ‚ªK© _Ref207634778}DÐÉêyùºÎŒ‚ªK© _Ref153776689{DÐÉêyùºÎŒ‚ªK©  _Ref78024414}DÐÉêyùºÎŒ‚ªK© _Ref153776689{DÐÉêyùºÎŒ‚ªK©  _Ref78024414{DÐÉêyùºÎŒ‚ªK©  _Ref55271118}DÐÉêyùºÎŒ‚ªK© _Ref207634778{DÐÉêyùºÎŒ‚ªK©  _Ref46752884}DÐÉêyùºÎŒ‚ªK© _Ref153732324}DÐÉêyùºÎŒ‚ªK© _Ref111000885{DÐÉêyùºÎŒ‚ªK©  _Ref47451048}DÐÉêyùºÎŒ‚ªK© _Ref153774103}DÐÉêyùºÎŒ‚ªK© _Ref153707807{DÐÉêyùºÎŒ‚ªK©  _Ref45371286}DÐÉêyùºÎŒ‚ªK© _Ref153707807}DÐÉêyùºÎŒ‚ªK© _Ref153731855}DÐÉêyùºÎŒ‚ªK© _Ref185246110}DÐÉêyùºÎŒ‚ªK© _Ref153704184}DÐÉêyùºÎŒ‚ªK© _Ref201668435}DÐÉêyùºÎŒ‚ªK© _Ref185246112{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153704184}DÐÉêyùºÎŒ‚ªK© _Ref185257870{DÐÉêyùºÎŒ‚ªK©  _Ref43728908yDÐÉêyùºÎŒ‚ªK©  _Ref6030156{DÐÉêyùºÎŒ‚ªK©  _Ref43728908{DÐÉêyùºÎŒ‚ªK©  _Ref43728908}DÐÉêyùºÎŒ‚ªK© _Ref153707807{DÐÉêyùºÎŒ‚ªK©  _Ref43728908}DÐÉêyùºÎŒ‚ªK© _Ref153765172yDÐÉêyùºÎŒ‚ªK©  _Ref6030571{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153764303}DÐÉêyùºÎŒ‚ªK© _Ref153765172}DÐÉêyùºÎŒ‚ªK© _Ref153764303{DÐÉêyùºÎŒ‚ªK©  _Ref47173292}DÐÉêyùºÎŒ‚ªK© _Ref247355579}DÐÉêyùºÎŒ‚ªK© _Ref153776695}DÐÉêyùºÎŒ‚ªK© _Ref153776692}DÐÉêyùºÎŒ‚ªK© _Ref153776693}DÐÉêyùºÎŒ‚ªK© _Ref153776694}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref185238094{DÐÉêyùºÎŒ‚ªK©  _Ref47173394}DÐÉêyùºÎŒ‚ªK© _Ref185246110}DÐÉêyùºÎŒ‚ªK© _Ref185238094}DÐÉêyùºÎŒ‚ªK© _Ref207618734{DÐÉêyùºÎŒ‚ªK©  _Ref47173394}DÐÉêyùºÎŒ‚ªK© _Ref153764303{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153765172{DÐÉêyùºÎŒ‚ªK©  _Ref47172480{DÐÉêyùºÎŒ‚ªK©  _Ref47864390{DÐÉêyùºÎŒ‚ªK©  _Ref78024414}DÐÉêyùºÎŒ‚ªK© _Ref153776724{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref46754571}DÐÉêyùºÎŒ‚ªK© _Ref153765172{DÐÉêyùºÎŒ‚ªK©  _Ref42589436{DÐÉêyùºÎŒ‚ªK©  _Ref47865711{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153776799}DÐÉêyùºÎŒ‚ªK© _Ref153765172{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153776799{DÐÉêyùºÎŒ‚ªK©  _Ref47864390}DÐÉêyùºÎŒ‚ªK© _Ref153776694{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153776693{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153776799}DÐÉêyùºÎŒ‚ªK© _Ref153765172{DÐÉêyùºÎŒ‚ªK©  _Ref47172480}DÐÉêyùºÎŒ‚ªK© _Ref153776799}DÐÉêyùºÎŒ‚ªK© _Ref153776799{DÐÉêyùºÎŒ‚ªK©  _Ref47260717{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47262189}DÐÉêyùºÎŒ‚ªK© _Ref166648484{DÐÉêyùºÎŒ‚ªK©  _Ref73442286{DÐÉêyùºÎŒ‚ªK©  _Ref47169796{DÐÉêyùºÎŒ‚ªK©  _Ref46754571{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref45001933{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref43008774}DÐÉêyùºÎŒ‚ªK© _Ref182995906}DÐÉêyùºÎŒ‚ªK© _Ref231890048}DÐÉêyùºÎŒ‚ªK© _Ref153700641}DÐÉêyùºÎŒ‚ªK© _Ref153700641}DÐÉêyùºÎŒ‚ªK© _Ref166648484{DÐÉêyùºÎŒ‚ªK©  _Ref70164511{DÐÉêyùºÎŒ‚ªK©  _Ref43008774{DÐÉêyùºÎŒ‚ªK©  _Ref69047370{DÐÉêyùºÎŒ‚ªK©  _Ref47164085{DÐÉêyùºÎŒ‚ªK©  _Ref47164079{DÐÉêyùºÎŒ‚ªK©  _Ref90895285{DÐÉêyùºÎŒ‚ªK©  _Ref43726555{DÐÉêyùºÎŒ‚ªK©  _Ref46754571{DÐÉêyùºÎŒ‚ªK©  _Ref43727921{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref43727928{DÐÉêyùºÎŒ‚ªK©  _Ref43728215{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref43727928{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref43727928{DÐÉêyùºÎŒ‚ªK©  _Ref43728461{DÐÉêyùºÎŒ‚ªK©  _Ref78024414{DÐÉêyùºÎŒ‚ªK©  _Ref42589436{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref42943895{DÐÉêyùºÎŒ‚ªK©  _Ref43728908{DÐÉêyùºÎŒ‚ªK©  _Ref46750086{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref42589436{DÐÉêyùºÎŒ‚ªK©  _Ref42672298{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref69052620{DÐÉêyùºÎŒ‚ªK©  _Ref69052620{DÐÉêyùºÎŒ‚ªK©  _Ref43727925{DÐÉêyùºÎŒ‚ªK©  _Ref43727928}DÐÉêyùºÎŒ‚ªK© _Ref153776799{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref203474873}DÐÉêyùºÎŒ‚ªK© _Ref203474654{DÐÉêyùºÎŒ‚ªK©  _Ref58909011{DÐÉêyùºÎŒ‚ªK©  _Ref58909011{DÐÉêyùºÎŒ‚ªK©  _Ref58909800{DÐÉêyùºÎŒ‚ªK©  _Ref58909011{DÐÉêyùºÎŒ‚ªK©  _Ref78024414}DÐÉêyùºÎŒ‚ªK© _Ref135023442}DÐÉêyùºÎŒ‚ªK© _Ref133810323}DÐÉêyùºÎŒ‚ªK© _Ref182743880}DÐÉêyùºÎŒ‚ªK© _Ref153703095}DÐÉêyùºÎŒ‚ªK© _Ref153681044yDÐÉêyùºÎŒ‚ªK©  _Ref5608796}DÐÉêyùºÎŒ‚ªK© _Ref166649222yDÐÉêyùºÎŒ‚ªK©  _Ref5609191}DÐÉêyùºÎŒ‚ªK© _Ref166649220{DÐÉêyùºÎŒ‚ªK©  _Ref43729255{DÐÉêyùºÎŒ‚ªK©  _Ref43729255{DÐÉêyùºÎŒ‚ªK©  _Ref47172128{DÐÉêyùºÎŒ‚ªK©  _Ref47172128{DÐÉêyùºÎŒ‚ªK©  _Ref47172128{DÐÉêyùºÎŒ‚ªK©  _Ref42943854{DÐÉêyùºÎŒ‚ªK©  _Ref42943895{DÐÉêyùºÎŒ‚ªK©  _Ref42943895{DÐÉêyùºÎŒ‚ªK©  _Ref42943895{DÐÉêyùºÎŒ‚ªK©  _Ref36896289{DÐÉêyùºÎŒ‚ªK©  _Ref13986562{DÐÉêyùºÎŒ‚ªK©  _Ref36896793}DÐÉêyùºÎŒ‚ªK© _Ref185246110{DÐÉêyùºÎŒ‚ªK©  _Ref47163749{DÐÉêyùºÎŒ‚ªK©  _Ref47169796{DÐÉêyùºÎŒ‚ªK©  _Ref42943895{DÐÉêyùºÎŒ‚ªK©  _Ref47171780{DÐÉêyùºÎŒ‚ªK©  _Ref47171842{DÐÉêyùºÎŒ‚ªK©  _Ref47171876{DÐÉêyùºÎŒ‚ªK©  _Ref42944330{DÐÉêyùºÎŒ‚ªK©  _Ref45367951}DÐÉêyùºÎŒ‚ªK© _Ref182743880{DÐÉêyùºÎŒ‚ªK©  _Ref13986080yDÐÉêyùºÎŒ‚ªK©  _Ref5702037{DÐÉêyùºÎŒ‚ªK©  _Ref47171963{DÐÉêyùºÎŒ‚ªK©  _Ref47172128yDÐÉêyùºÎŒ‚ªK©  _Ref6117078{DÐÉêyùºÎŒ‚ªK©  _Ref47174498yDÐÉêyùºÎŒ‚ªK©  _Ref8187404{DÐÉêyùºÎŒ‚ªK©  _Ref71016088}DÐÉêyùºÎŒ‚ªK© _Ref153708057yDÐÉêyùºÎŒ‚ªK©  _Ref8187404}DÐÉêyùºÎŒ‚ªK© _Ref153707807}DÐÉêyùºÎŒ‚ªK© _Ref153708057}DÐÉêyùºÎŒ‚ªK© _Ref153710706yDÐÉêyùºÎŒ‚ªK©  _Ref8187433yDÐÉêyùºÎŒ‚ªK©  _Ref8187404{DÐÉêyùºÎŒ‚ªK©  _Ref71016088yDÐÉêyùºÎŒ‚ªK©  _Ref8187433yDÐÉêyùºÎŒ‚ªK©  _Ref8187404}DÐÉêyùºÎŒ‚ªK© _Ref153708057}DÐÉêyùºÎŒ‚ªK© _Ref153707807yDÐÉêyùºÎŒ‚ªK©  _Ref8187433}DÐÉêyùºÎŒ‚ªK© _Ref153708057}DÐÉêyùºÎŒ‚ªK© _Ref153710706{DÐÉêyùºÎŒ‚ªK©  _Ref47781675{DÐÉêyùºÎŒ‚ªK©  _Ref47781653yDÐÉêyùºÎŒ‚ªK©  _Ref6030156{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref43728908{DÐÉêyùºÎŒ‚ªK©  _Ref47779943}DÐÉêyùºÎŒ‚ªK© _Ref153707807}DÐÉêyùºÎŒ‚ªK© _Ref153707807{DÐÉêyùºÎŒ‚ªK©  _Ref43728908}DÐÉêyùºÎŒ‚ªK© _Ref153731855{DÐÉêyùºÎŒ‚ªK©  _Ref68495073{DÐÉêyùºÎŒ‚ªK©  _Ref43727921}DÐÉêyùºÎŒ‚ªK© _Ref135023442}DÐÉêyùºÎŒ‚ªK© _Ref135023442}DÐÉêyùºÎŒ‚ªK© _Ref133810323{DÐÉêyùºÎŒ‚ªK©  _Ref47784397{DÐÉêyùºÎŒ‚ªK©  _Ref47172128{DÐÉêyùºÎŒ‚ªK©  _Ref47779943{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref46750086{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref47845006{DÐÉêyùºÎŒ‚ªK©  _Ref47845006{DÐÉêyùºÎŒ‚ªK©  _Ref66078569{DÐÉêyùºÎŒ‚ªK©  _Ref66078569{DÐÉêyùºÎŒ‚ªK©  _Ref47173394{DÐÉêyùºÎŒ‚ªK©  _Ref66078569{DÐÉêyùºÎŒ‚ªK©  _Ref47173451{DÐÉêyùºÎŒ‚ªK©  _Ref47173292{DÐÉêyùºÎŒ‚ªK©  _Ref47173451}DÐÉêyùºÎŒ‚ªK© _Ref153765172}DÐÉêyùºÎŒ‚ªK© _Ref153765172{DÐÉêyùºÎŒ‚ªK©  _Ref42589436{DÐÉêyùºÎŒ‚ªK©  _Ref47867141{DÐÉêyùºÎŒ‚ªK©  _Ref47867143{DÐÉêyùºÎŒ‚ªK©  _Ref47867144{DÐÉêyùºÎŒ‚ªK©  _Ref47784098{DÐÉêyùºÎŒ‚ªK©  _Ref47867609{DÐÉêyùºÎŒ‚ªK©  _Ref47867926{DÐÉêyùºÎŒ‚ªK©  _Ref47871470{DÐÉêyùºÎŒ‚ªK©  _Ref47871522{DÐÉêyùºÎŒ‚ªK©  _Ref47867954{DÐÉêyùºÎŒ‚ªK©  _Ref47262189{DÐÉêyùºÎŒ‚ªK©  _Ref47784099{DÐÉêyùºÎŒ‚ªK©  _Ref63052833}DÐÉêyùºÎŒ‚ªK© _Ref130893908}DÐÉêyùºÎŒ‚ªK© _Ref207637531{DÐÉêyùºÎŒ‚ªK©  _Ref63052833{DÐÉêyùºÎŒ‚ªK©  _Ref47869783{DÐÉêyùºÎŒ‚ªK©  _Ref47871769{DÐÉêyùºÎŒ‚ªK©  _Ref47871769{DÐÉêyùºÎŒ‚ªK©  _Ref47867926{DÐÉêyùºÎŒ‚ªK©  _Ref63053303{DÐÉêyùºÎŒ‚ªK©  _Ref47864390{DÐÉêyùºÎŒ‚ªK©  _Ref46752884{DÐÉêyùºÎŒ‚ªK©  _Ref47872399{DÐÉêyùºÎŒ‚ªK©  _Ref47872399{DÐÉêyùºÎŒ‚ªK©  _Ref47173394}DÐÉêyùºÎŒ‚ªK© _Ref153776799}DÐÉêyùºÎŒ‚ªK© _Ref133745663{DÐÉêyùºÎŒ‚ªK©  _Ref47164079{DÐÉêyùºÎŒ‚ªK©  _Ref90895285}DÐÉêyùºÎŒ‚ªK© _Ref133810323{DÐÉêyùºÎŒ‚ªK©  _Ref43727921{DÐÉêyùºÎŒ‚ªK©  _Ref45367951}DÐÉêyùºÎŒ‚ªK© _Ref133832449}DÐÉêyùºÎŒ‚ªK© _Ref133830177}DÐÉêyùºÎŒ‚ªK© _Ref133831852{DÐÉêyùºÎŒ‚ªK©  _Ref47170147yDÐÉêyùºÎŒ‚ªK©  _Ref6030571}DÐÉêyùºÎŒ‚ªK© _Ref135023800}DÐÉêyùºÎŒ‚ªK© _Ref153284855{DÐÉêyùºÎŒ‚ªK©  _Ref47164079{DÐÉêyùºÎŒ‚ªK©  _Ref47164085}DÐÉêyùºÎŒ‚ªK© _Ref135023442{DÐÉêyùºÎŒ‚ªK©  _Ref47164079žDÐÉêyùºÎŒ‚ªK© ÀFSDK_manual.pdfÿÿ­Þ}DÐÉêyùºÎŒ‚ªK© _Ref184460000{DÐÉêyùºÎŒ‚ªK©  _Ref90895148}DÐÉêyùºÎŒ‚ªK© _Ref247361078{DÐÉêyùºÎŒ‚ªK©  _Ref47164079{DÐÉêyùºÎŒ‚ªK©  _Ref47164085}DÐÉêyùºÎŒ‚ªK© _Ref135023442{DÐÉêyùºÎŒ‚ªK©  _Ref47164079}DÐÉêyùºÎŒ‚ªK© _Ref153889197}DÐÉêyùºÎŒ‚ªK© _Ref232415540}DÐÉêyùºÎŒ‚ªK© _Ref232415549{DÐÉêyùºÎŒ‚ªK©  _Ref45367951{DÐÉêyùºÎŒ‚ªK©  _Ref46896711{DÐÉêyùºÎŒ‚ªK©  _Ref90894483{DÐÉêyùºÎŒ‚ªK©  _Ref90894479{DÐÉêyùºÎŒ‚ªK©  _Ref46896711}DÐÉêyùºÎŒ‚ªK© _Ref153291752{DÐÉêyùºÎŒ‚ªK©  _Ref46752884}DÐÉêyùºÎŒ‚ªK© _Ref153291752{DÐÉêyùºÎŒ‚ªK©  _Ref46752884DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© ”http://www.openmobilealliance.org/release_program/ds_v12.htmlyXô;H¯,‚]Ä…'c¥«{DÐÉêyùºÎŒ‚ªK©  _Ref47451430{DÐÉêyùºÎŒ‚ªK©  _Ref47451048»DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Jhttp://www.synthesis.ch/yXô;H¯,‚]Ä…'c¥«»DÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© Jhttp://www.synthesis.ch/yXô;H¯,‚]Ä…'c¥«u i@@ñÿ@ StandardCJOJQJ_HmH sH tHN@aN Überschrift 1$$ & Fc¤ð¤<*$@&KHR@aR Überschrift 2$$ & Fc¤à¤ð@& 6mHsHJ@aJ Überschrift 3$$ & Fc¤à¤ð@&6J@aJ Überschrift 4$$ & Fc¤à¤ð@&6H@aH Überschrift 5 & Fc¤ð¤<@&6CJH@H Überschrift 6 & Fc¤ð¤<@&6CJD@D Überschrift 7 & Fc¤ð¤<@&CJH@H Überschrift 8 & Fc¤ð¤<@&6CJJ @J Überschrift 9 & Fc¤ð¤<@& 56CJBA@òÿ¡B Absatz-Standardschriftartb0@òb Aufzählungszeichen+ & F ƹh„e„›þ¤P¤P^„e`„›þ0 @0 Fußzeile  Æ_¾$2@2 Kopfzeile  Æ_¾$JþO"J List *+ & F ÆÔЄʄ›þ¤x¤x^„Ê`„›þ$)@¢1$ SeitenzahlD>@aBD Titel$¤ð¤<@&a$CJ0KHmH sH u(U@¢Q( Hyperlink>*B*RþObR console*„°„h$d%d&d'd]„°^„hOJQJLþOarL Zwischentitel$$¤ð¤xCJmH sH u:V@¢: BesuchterHyperlink>*B* @C@’@ Textkörper-Einzug dà¤xR@aR Verzeichnis 1 Æp# „l]„lCJaJmHnHu^@^ Verzeichnis 4" Æp# „l„8„˜þ]„l^„8`„˜þaJmHnHuX@X Verzeichnis 2 Æp# „l„ð]„l^„ð5aJmHnHuV@V Verzeichnis 3 Æp# „l„à]„l^„àaJmHnHu6@6 Verzeichnis 5 „À^„À6@6 Verzeichnis 6 „°^„°6@6 Verzeichnis 7 „ ^„ 6@6 Verzeichnis 8 !„^„6@6 Verzeichnis 9 "„€^„€8Y@28 Dokumentstruktur#-D .B@B. Textkörper$$a$BþOñÿRB Font_text%CJOJQJ_HmHsHtHDþOñÿbD Font_titel&CJOJQJ_HmHsHtH<þO< Tagheader'$$„V„ªù^„V`„ªù0þO¢0 tagheadertitle5hþOñÿ’h TbT.TblTxtLft)1$d$ÿ¤´¤x ÆB*CJOJQJ_HmH sH tHBþO¢B Normal (Web) *¤d¤dB*mH sH uR#@RAbbildungsverzeichnis + Æd# mHnHuF%@ÂF Umschlagabsenderadresse,CJ K@ Anrede-D6@âD Aufzählungszeichen 2 . & FD7@òD Aufzählungszeichen 3 / & FD8@D Aufzählungszeichen 4 0 & FD9@D Aufzählungszeichen 5 1 & F8"@8 Beschriftung 2¤x¤x5:T@2: Blocktext3„ „ ¤x]„ ^„ L@ Datum40+@R0 Endnotentext5CJDO@D Fuß/-Endnotenüberschrift60@r0 Fußnotentext7CJ0?@‚0 Grußformel 8„œ^„œ2 @2 Index 19„ð„ÿ^„ð`„ÿ2 @2 Index 2:„à„ÿ^„à`„ÿ2 @2 Index 3;„Єÿ^„Ð`„ÿ2 @2 Index 4<„À„ÿ^„À`„ÿ2@2 Index 5=„°„ÿ^„°`„ÿ2@2 Index 6>„ „ÿ^„ `„ÿ2@2 Index 7?„„ÿ^„`„ÿ2@2 Index 8@„€„ÿ^„€`„ÿ2@2 Index 9A„p„ÿ^„p`„ÿ8!@’8 IndexüberschriftB52@22 KommentartextCCJ./@B. ListeD„„åþ^„`„åþ22@R2 Liste 2E„6„åþ^„6`„åþ23@b2 Liste 3F„Q„åþ^„Q`„åþ24@r2 Liste 4G„l„åþ^„l`„åþ25@‚2 Liste 5H„‡„åþ^„‡`„åþBD@’B ListenfortsetzungI„¤x^„FE@¢F Listenfortsetzung 2J„6¤x^„6FF@²F Listenfortsetzung 3K„Q¤x^„QFG@ÂF Listenfortsetzung 4L„l¤x^„lFH@ÒF Listenfortsetzung 5M„‡¤x^„‡41@â4 Listennummer N & F8:@ò8 Listennummer 2 O & F8;@8 Listennummer 3 P & F8<@8 Listennummer 4 Q & F8=@"8 Listennummer 5 R & FV-@ñÿ2V Makrotext"S Æ àÀ €` @ à_HmHsHtH^I@B^ Nachrichtenkopf.T„n„’û$d%d&d'd-D^„n`„’û(Z@R( Nur TextUCJ8@b8 Standardeinzug V„Ä^„Ä4Q@r4 Textkörper 3W¤xCJLR@‚L Textkörper-Einzug 2X„dà¤x^„JS@’J Textkörper-Einzug 3Y„¤x^„CJ\M@A¢\ Textkörper-ErstzeileneinzugZ$„Ò¤x`„Òa$dN@‘²d Textkörper-Erstzeileneinzug 2[„„Òdð^„`„ÒR$@ÂR Umschlagadresse!\„„üÿ„ôÿ„à&€+Dp/„^„4@@Ò4 Unterschrift ]„œ^„œ6J@â6 Untertitel^$¤<@&a$:.@: RGV-Überschrift_¤x5Z,@Z Rechtsgrundlagenverzeichnis`„ð„ÿ^„ð`„ÿ:þO: Simple Bullet 1 a & F§JþO"J Simple invisible bullet b & F’XþO2X Simple bulletlist continuation c„e^„eJþOBJ Functionlist d$„n„’û¤P¤P^„n`„’ûa$JþORJ SQL placeholdere„5„Ëû¤P¤P^„5`„Ëû0P@b0 Textkörper 2f5HþOrH Errorcode_descg„„éù¤¤^„`„éù2[@‚2 E-Mail-Signaturh2`@’2 HTML Adressei6]He@¢H HTML VorformatiertjCJOJQJ^J<^@²< Standard (Web)k OJQJaJ2&@¢Á2 FußnotenzeichenH* þOÒ Zwischm&þOâ& new i n & F}VþOòV list * unindented!o & F9„e„›þ¤P¤P^„e`„›þ&þO¢& new in B*phÿ$þO$ list q & F»&þO"& stand r & F6þO26 List Bullet 0 s & F½0þOB0 tzlist t ÆÜBmHsH„•øœá¬gųÅäÐåÑ ÿÿÿÿ4 ÿÿÿÿi ÿÿÿÿš ÿÿÿÿÎ ÿÿÿÿ ÿÿÿÿ6 ÿÿÿÿÎÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ "&£ÿÿ "&£ÿÿ "&£ÿÿ "&£ÿÿ "&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ"&£ÿÿ "&£ÿÿ!"&£ÿÿ""&£ÿÿ#"&£ÿÿ$"&£ÿÿ%"&£ÿÿ&"&£ÿÿ'"&£ÿÿ("&£ÿÿ)"&£ÿÿ*"&£ÿÿ+"&£ÿÿ,"&£ÿÿ-"&£ÿÿ."&£ÿÿ/"&£ÿÿ0"&£ÿÿ1"&£ÿÿ2"&£ÿÿ3"&£ÿÿ4"&£ÿÿ5"&£ÿÿ6"&£ÿÿ7"&£ÿÿ8"&£ÿÿ9"&£ÿÿ:"&£ÿÿ;"&£ÿÿ<"&£ÿÿ="&£ÿÿ>"&£ÿÿ?"&£ÿÿ@"&£ÿÿA"&£ÿÿB"&£ÿÿC"&£ÿÿD"&£ÿÿE"&£ÿÿF"&£ÿÿG"&£ÿÿH"&£ÿÿI"&£ÿÿJ"&£ÿÿK"&£ÿÿL"&£ÿÿM"&£ÿÿN"&£ÿÿO"&£ÿÿP"&£ÿÿQ"&£ÿÿR"&£ÿÿS"&£ÿÿT"&£ÿÿU"&£ÿÿV"&£ÿÿW"&£ÿÿX"&£ÿÿY"&£ÿÿZ"&£ÿÿ["&£ÿÿ\"&£ÿÿ]"&£ÿÿ^"&£ÿÿ_"&£ÿÿ`"&£ÿÿa"&£ÿÿb"&£ÿÿc"&£ÿÿd"&£ÿÿe"&£ÿÿf"&£ÿÿg"&£ÿÿh"&£ÿÿi"&£ÿÿj"&£ÿÿk"&£ÿÿl"&£ÿÿm"&£ÿÿn"&£ÿÿo"&£ÿÿp"&£ÿÿq"&£ÿÿr"&£ÿÿs"&£ÿÿt"&£ÿÿu"&£ÿÿv"&£ÿÿw"&£ÿÿx"&£ÿÿy"&£ÿÿz"&£ÿÿ{"&£ÿÿ|"&£ÿÿ}"&£ÿÿ~"&£ÿÿ"&£ÿÿ€"&£ÿÿ"&£ÿÿ‚"&£ÿÿƒ"&£ÿÿ„"&£ÿÿ…"&£ÿÿ†"&£ÿÿ‡"&£ÿÿˆ"&£ÿÿ‰"&£ÿÿŠ"&£ÿÿ‹"&£ÿÿŒ"&£ÿÿ"&£ÿÿŽ"&£ÿÿ"&£ÿÿ"&£ÿÿ‘"&£ÿÿ’"&£ÿÿ“"&£ÿÿ”"&£ÿÿ•"&£ÿÿ–"&£ÿÿ—"&£ÿÿ˜"&£ÿÿ™"&£ÿÿš"&£ÿÿ›"&£ÿÿœ"&£ÿÿ"&£ÿÿž"&£ÿÿŸ"&£ÿÿ "&£ÿÿ¡"&£ÿÿ¢"&£ÿÿ£"&£ÿÿ¤"&£ÿÿ¥"&£ÿÿ¦"&£ÿÿ§"&£ÿÿ¨"&£ÿÿ©"&£ÿÿª"&£ÿÿ«"&£ÿÿ¬"&£ÿÿ­"&£ÿÿ®"&£ÿÿ¯"&£ÿÿ°"&£ÿÿ±"&£ÿÿ²"&£ÿÿ³"&£ÿÿ´"&£ÿÿµ"&£ÿÿ¶"&£ÿÿ·"&£ÿÿ¸"&£ÿÿ¹"&£ÿÿº"&£ÿÿ»"&£ÿÿ¼"&£ÿÿ½"&£ÿÿ¾"&£ÿÿ¿"&£ÿÿÀ"&£ÿÿÁ"&£ÿÿÂ"&£ÿÿÃ"&£ÿÿÄ"&£ÿÿÅ"&£ÿÿÆ"&£!ÿÿÇ"&£!ÿÿÈ"&£!ÿÿÉ"&£#ÿÿÊ"&£ÿÿË"&£ÿÿÌ"&£ÿÿÍ"&£ÿÿÎ"&£Ç` #£q.ª>}NÙ_¯pg‹~–ñ¢|° ºq»QÇÑûÙ=Ýè¿ñ†ø‹†Ê!d*m1Ð=åE*MVŸ^2c2keqQ`ŒÉš>ªì´Â!ÐÙÞífðdÿA XÙ! ,.Õ5>îFÛN‰XÆdïks{(ƒX‹˜“Øš/¢q¢â©t²#¸(¿Õˀלç<ñ§û¤]"¿0`<pFRÇ_*näu‰|,†ÚŒ2šŸ£ß©m³i»\ÆÍτیå”î·÷P* A#&·-&7À>"FP‰X÷bj$u ‚hŠ¢’Æš ¥İ͹ƒÂýÌõÛRëôö­ÿ ªôí$$.t7pBQ¬^iÂuf€ÿ‰ø“Ë› ¤r¬Ͷ¥ÀBÈšÐ'Ùpà”ë;øK¾%§%U,Œ5Å>SK×T^5f¶p8z…C”ž¯¦°²¹ºáÂ`ÉÓyÞéã÷ˆúè!†*À1L3Ð:¤AµIÝP.W8`¸a±j!sÆy‚€5ˆ¥‘g•„•‘˜›øœj£¾ª›¬á¬8°f³C¶ñ¹̽šÁöÂQÄgÅjųÅúÈ̸ÎäÐåÑD  9QYAj— F … ñ¦ Õ*«6„ t PZ ª! ":#ß$%ò&y'ñ(æ)×*E+.,è-.Ò/ 0"12¨3%4X5B6'7Æ8X9":;™<s=¤>;?Ö@yABBCD”EôF8G¦HIrJ¶K§L–MNsO=PaQbRÆS‰TU3VyW-X”Y€Z[h\Ã]þ^_`Ja1b‹c]dÐegføgehiÃjyk]l‚mµn£oÂp‡qƒrs@thuÄvûwxPy´z({…|»}i~X×€Ü3‚nƒÁ„Ã…Ô†x‡Qˆ ‰‚Š,‹ŒGŽ…jb‘b’““_”ô•×–œ—¿˜¢™VšU›ŸœIFž8Ÿ ¢¡k¢8£¤Ý¥¦N§¨©ª²«O¬V­Ä®G¯S°±J²p³˜´µ‘¶“·G¸­¹ºé»t¼½J¾‘¿sÀeÁ~Â}ÿÄÅÅÅÅÆÇ+ÈÉÉÉÉÊÊÊËËËËHÌÌÌÍÍÍ-|¦§©ªÆ  z{»+oñ4Ù-rÊ*Ze` m n o ú û ¤ ¥ ßUV˜™"#,‘ºê"z±å@m¡Þc½ L„Ì`—Õ J¼3x©ÙFu®7xªÝ Bz°àZ£Ü!a¥á Q } » ô 0!g!Å!"P"›"ó">#…#Ô#/$$Ñ$!%q%»%ù%L&&æ&"'n'¿'(k(Ã()))ß)G*µ*+b+³+,o,º,-p-¼-.q.Â. /f/®/0J00ô0O1—1ã122ˆ2Ó2&3n3Ã34X4µ4 5h5Á5%6p6±6ü6H77Ò788Û889®9:x:Ì:1;¢; <n<¿< =V==ì=Q>ª>?P?¬? @W@¥@ AhA¾ABdBãBfCÏCED¦DöD\EÀEFzFÑFAGªG+H’HÜH&IoI¸I$JtJÉJKjK´KLaL·L'MM'N}N¾NOrOÂO"PyPÎP QvQàQKRÁRSrSØSHTÀT"UƒUßU5VVW]WÉW/X·X!Y©Y Z}ZÔZ-[’[õ[O\¦\þ\\]¸]^\^’^è^$_}_Ù_C`­`a‘ab‚bóbZc»c)d‹dådMeªefkf¾fgvgûg;hˆhähLi›iæi/jŒjÔj8kykìkAl–lmWm®m n…nÙn2oŠoëo[p¯pFq§qþq€rÒr+s–sísPt­tÿtluÉuv¥vúvÀwxzxëxDy¹yz{zòzm{³{ì{*|h|¡|}G}€}¹}ö}e~§~ä~(g­€”€è€G£‚^‚¶‚ƒ`ƒ¹ƒ„w„Ø„)…z…È….†~†Ï†;‡Ž‡ä‡/ˆwˆÏˆ,‰œ‰Ý‰ŠJІвŠ‹‹‹"‹QŒÿïŽ"26~–‹–/˜šÖ›~œ5Ÿ> 9¡™¡ñ¢v¤#¥ñ¥Ÿ§Œ©wªä¬c®—®…¯¡¯m²¤²¯²ç²I´u´v´¡´Â´Ï´Ð´æ´µ µ!µBµ€µµ™µÕµìµûµüµ¶Z¶[¶s¶¯¶À¶r·¸¸²º»)»o»p»q»z»¼'¼|¼‚½¤ÁêÃÄ|Ä}ÄÕÄÅzÅÏÅÐÅKÆLÆÆÆQÇ&ȞȟÈ*ɶÉYÌÍãÍä̓τÏÐÐ1ÐOÐPÐZÐuЀÐКÐÃÐÒÐÓÐáÐ ÑÑÑ1ÑdÑpÑqÑѩѹѺÑËÑÌÑ×ÒâÒ<Ô=ÔËÔÌÔÕXÕ¿ÕDÖ×é×ÙØ ÙFÙ¦ÚƒÛ¨ÛÌÛüÛšÜÍÜ=ÝsÝëÞßFß8à~à„áââ9ãWãÏãÐãä äÉäÊäwåx唿•æç‘çèèãèøè6éRéuévéyêzêÀê7ë0ì#íqíºíî@î™îÆîýîQï›ïìïEðð°ð¿ñèñÏò‡óüóšõ»õW÷á÷øHø†ø™øù‘ù¤û½ûäûåû×ýÂÔ‡ç >+† Ï °Ù,ôÀ¦É!Ê!Ý!#€#Ð$Ñ$;%Q%†'‡'B(f(½(¾(Ë(á(î(ü(ý(Û)Ü)ò)+*<*R*c*d*m*µ*ô*;+[+F,G,[,b,c,v,x,›,À,Â,Ã,Ö,Ø,ä,Ý-Þ-&.1.²/Å/÷/º0á1ü12„2u3v3µ3â34r4Ñ5á5ü6ò7©8y9É:ï;ù;z<==Ð=â=??b??­?@ @!@B@n@“@”@eCgC‡C¤C¥C¶C½C¾CéCüCýC(D=EMEåEòFÀGÁG$H%H2H3HtHuH‰HŠHãHäHII×IñI¢J£J²JÇJÈJäJK$K%KRLSLpL|L¡LÊLóLM)M*MzM{M†M—M˜MÇMöM%N&N©NµN OpO¨P;QtQ¶QßQRDRpR€RRŸR°RÀRPS]SŸST´TƒU÷W>Z=[>[M[Z[d[i[n[o[Ž[¦[§[·[¼[Ã[Ö[ß[á[â[õ[\ \:\Q\X\S]Ö]æ]I_Y_æ_ô_l`m`y`š`­`¸`Å`Ó`à`á`÷`ø`aa+a,aYafawa€a‹a¦a§aXbYbeb†b¦b´bÁbÂbØbÙbæbõb#c1c2cŠþŠ`ŒR ¨ ‘`’Å’F“”Í”â•ø–a—B›Œ¶Ÿg¢¤¦¦±§¸¨«©>ª/«O¬@­\­æ­=® ®¯¯à¯_°ð°A±B±±Ù±²F²G²H²´²9³Q´ì´Òµ•¶¸°º»O¼c¼A½À˜ÀÂìÂRÄÆ¥ÇµÇÈ…È9ÉÊÛÊ…ËèÌØÍfÑrÒzÓHÔÕÑÕÖñÖå×3ÙžÙÚÒÜNÝábáIâ,ãäÂäå,æ«ç5éGé~ììííïïfðnð¡ðÃòlóHôÔôö÷ÒøÓøŠù‹ùáûâû+ý,ý6Oƒ/Sͯмš ï - 0 1 A K Ð Ú k€*5¯°W×L™ÞH‰Ó7…ëXz\GYõö6[„®Üþ$Kv™Àâ3bnz„²ö9 : Y!Z!š!À!Ø!Ù!Ú!"##Ö$;&3'ê'Ú(l*ã*õ+þ+ , ,µ,Ò,.;..­.Â.Ó.ó.ô.È/É/0/000ö1J2h2ƒ2”2º2Ç2È23Û3ù3&474r4s4Õ56-6Z6k6‚6ƒ6J88®8Â8Ó8Ô8:W:u:‰:š:Ï:Ð:<H<f<z<‹<À<Á<>E>c>{>|>?€?ª?@AA—AÙA÷ABBÓCòCDD—DÖDôD$E5E6EˆE¾EØE#F4F5FîFG/GŽGŸG G}š}°}Ô}å}ù}ú}Œù<±ÇÝîZ‚[‚(ƒ{ƒ‘ƒ§ƒ¸ƒ̃̓Ó„…%…@…Q…^…_….†/†X††‚†ˆ†W‡}‡ž‡¿‡Þˆ߈ÿ‰.‹/‹8‹X‹“‹©‹Ä‹Õ‹â‹ã‹„Œ…ŒºŒïŒðŒöŒÅë&ŽGŽfgÂÃe‘’’Ì’â’ý’“““˜“ô“n”¦”¼”×”è”ô”õ”µ–—'—B—S—_—`—Ù—˜9˜t˜…˜œ˜ª˜«˜Ä™Øš›6›Q›b›y›†›‡›"œpœŽœØœéœ01Ï"ž@žœž­ž®ž  ¡/¡?¡L¡[¡s¡¡¯¡¿¡Ì¡Û¡ó¡¢/¢?¢L¢p¢q¢³¢Ñ¢ô¢££=£‰£¹£ë£!¤"¤„¦…¦ަ¥¦Ù¦õ¦§§§6§e§Œ§™§š§²§â§ÿ§&¨3¨s¨¨¨¨¹¨å¨ò¨ó¨Ú©â©ûª…«Ø«ÿ«¬+¬H¬U¬V¬A­¬®¯T¯y¯”¯¥¯˯Ù¯Ú¯e°¥°ð±s²t²¹²Þ²÷²³.³:³;³—´Í´ò´ µµAµYµZµ'¶(¶`¶…¶¤¶µ¶Û¶ð¶ñ¶#¸x¸ž¸²¸øì¸ ¹¹¹‘¹’¹º£º.¼/¼B½’½¸½̽ݽ¾%¾0¾1¾(¿`¿~¿²¿ÿÄ¿nÀoÀÁ‚ÁoÂpÂ8Ã9ÃŽÆÆ1ÇkÇÂÇ(ÈÉÉmÊÑÊÒÊ{ͶÍÐÍåÍöÍ÷Í#Ï$ÏlÏmÏ~иÐÒÐçÐÑÑIÑ5ÒGÓjÓƒÓ#Ô¨Õ³ÖŽØQÚÂÚWÛ›ÜÝŸÞ'á.ãu倿äæèÉêMìíNîOî·îÒîïQïïÌïðPð™ð¦ð§ðîðññ;ñ<ñòñóñò¾òÖó ô(ôMôlômô•õ–õ¾õlöÁøÂøùù3ùvùwùÉùÊùõù\úêúNüuýÕý}þÂþ.ÿ’ÿ–øKLü(tœ¬÷.DxËz{¤:_$ Ú - ·ÓÚ–ÏX9L]n|}v´Ùí¯°Ö]嚦K: E!v!Ö!"x"*$u$Ø%(')*ä+,-Ò- /«/0Œ0¿0ü0W1X1ê3ì3 4%4M4ˆ4Ò4 5K5€5±5è5é5í5î56#6V6–6Õ6ú67D7‡7Ó78]8¬8ê8÷8D9ƒ9’9ž9È9Þ9ó9::ª;«;Ð;<`<Á=+>n>Y?F@Á@¯B°B'C(CACbCŒC¶CàC D4D^DˆD²D½DÊD E#ECE|E}EHFIFpFÒFòHóHIçI K~LOÄOõPöPŠQ¡Q¹Q×QöQRRZRR”RÖR×RITJTwUxUÍVÎV÷VÅXœYhZ\_P`añcàdIfgklmmNm~m˜m®m²m³mËmæmn)n*n+n¼nðn o8oholomoƒo„o»o×oØop?pxpyp°pÉpÕpïp q#q¥?¥x¥Å¥í¥þ¥ÿ¥6§7§j§¡§¢§¨2¨d¨u¨v¨©©8©d©©²©Ó©ß©Gª`ª›ª¶ªǪÖªת[­Y¯¯Û¯°/°@°O°P°'±q±бűà±ñ±²²m³0´Œ´¥´à´û´ µµ+µ,µp¶$·x·‘·±·Å·æ·÷· ¸ ¸¤¹¥¹i»è»¼!¼5¼V¼g¼z¼{¼`½a½ʾB¿[¿{¿§¿È¿Ù¿ì¿í¿PÁQÁÅÅÆÅ\Æ]ơƢÆQÇ÷ÈÊÊxÊyÊ&Ë'ËCËcËyËz˼ËËËÌb̲ÌõÌÍ6Í7ÍOÍaÍb͓̓ÍÝÍôÍ)ÎfÎsΑΙλÎÏ ÏÏÏVÏcÏyϥϩϺÏÍÏ&Ð?Ð_ЋЬнÐÐÐÑÐcÒdÒ.Ó/ÓåÓÆÔDÕÕcÖ²Ö°×OÙ^Ú„ÛÎÜ$ÞgÞ€Þ Þsߔߥ߸߹ßááÈáÉáPãQãää,ä;ä<äeä‚ä›äÃäÓäå&å]åså}åŒå½åðåùåýå ææYæræ’æ¦æÇæØæëæìæÑèÒè;ê<êèêéêì&ílíúí5îaî‚î“î”îï¢ïcðuð;ñ<ñ}ñßñQò·òó/óuó©óÕó{ô·ôçôlõgöhöp÷q÷·÷ø2øäøõøöøgùüù«ûXü2ý3ýƒýÀýþþþÿÿcÿtÿ¤ÿ¥ÿPœ³íþ j¸Ï!2KL¤õ ö Ž Ð ç ? P i j ‘ Ý ô &=NOlƒ²ÃÐÑ£Ž±²e#@A9~»Òíþ  Q‘¨ÂÓâã\]Ýô01èWt‹«¼ÓÔ!!'!M!o!¶!Í!è!0"1"q"Ï"&#$f$‡$§$»$Û$ì$ÿ$%#&r&“&³&Ç&ç&ø& ' '»'¼'[(|(œ(°(Ð(á(ô(õ(ª)E*f*†*š*º*Ë*Þ*ß*+€+ß,à,}-~-¶-·-z./h/›/í/20–02 3;4¡4Â4â4ö45'5:5;5¿5À5°6±6&7Ÿ7À7à7ô78%88898Ê8Ë8j9k9#:Ã:$;E;`;q;};~;<à<÷<=#=0=1=À>?>?v?‡??ž?AwA˜A³AÄAÑAÒAÐBC8C”C¥C¿CÀCGE¦EÇEâEóE!F"F¤G!HtH•H°HÁHÎHÏHƒJìJ K(K9KFKGK8NœN½NØNéNõNöNÉPGQÃQäQRR4R5RÔSDT±TÔUÕU5VVVqV‚VVVéW XAXiXzXˆX‰X,ZfZ‡Z¢Z³ZÁZÂZ5]m]Ž]­]¾]^^Œ^^Ý^Þ^_o_Ç_2`}` a[a5bêb÷b¹cYd–dÚde}e eÄeéef4fZf~f£f&g¥g¦gägOhyh¤hÏhi™ijQjrjj jîjïjækdl{l›lÇlålöl m mcodoq‘q&r‰rÖrhsÅs7tÔt$u§uPv³vgwÒwT{é|˜~b€Ÿ€¶€?Vmn ‚!‚ñ‚ò‚Ÿ„ „ † †Ú†Û†‡‡4‡_‡l‡m‡‰‡´‡Á‡ˆ(ˆOˆ`ˆnˆoˆ­‰á‰û‰HŠYŠgŠhЍ‹ŒÖŒðŒ#$ŽsާŽÁŽÜŽíŽúŽûŽ¿ü‘1‘B‘O‘_‘`‘¢’ð’ “%“6“C“S“T“_–¤–¾–Ù–ê–ö–÷–*˜˜ª˜ë˜ü˜™™Æš1›^›y›Š›—›§›¨›¢Vžpž”ž¥ž¹žºž® ¯ Ö —¡{¢µ¢ï¢ð¢d¤e¤¥ ¥¦F¦`¦s¦„¦…¦M§N§¨@¨\¨q¨—¨˜¨ ©©:©æ©¤ª#®°°¶°İú°(±g±v±½±×±ò±²²²³P³j³…³–³¢³£³ε ¶'¶j¶{¶|¶8·9·ú·û·͹º7ºRºcºdº&»m»‡»Ê»Û»Ü»…¼†¼*½+½¼¾i¿°¿Ê¿ ÀÀÀéÀêÀƒÂÉÂãÂ&Ã7Ã8ÃnÄÅOÅiŬŽžřƀÇàÇúÇÈ.ÈPÈaÈtÈuÈnÉ1Ë3ËuËvËýÌ%ÎÃÎgÐ&ѱÑJÓÙÔ¾Õ˜Ö¾×ÀØ­ÙaÚGÛõÛzÜݶÝiÞæß·àâ`â„ãìãúä æmç é’êRë íbí1ïÃðòõàõúõö.öPöaötöuöôö]÷w÷—÷«÷Ì÷Ý÷ð÷ñ÷yøØøÙø¼ù ú&úFúZú{úŒúŸú ú†ûãûäûÆü ý$ýDýXýzý‹ýžýŸýPÿ­ÿ/VjŒ°±$}â<Prƒ–—ce§5  ê Á 4 n Ž ¢ Ä Õ è é ø žq‹¦·ÅÆÖª†¡²áKL´ÿ/{ŒÁ?@£¤=>…ŸºËÙóô'{«Îßïð(¦Ìó–0 1 p!Æ!ö!"*"9":"q"Æ"#D#´#"$#$[%¢%¼%×%è%÷%ø%Á&M'±'Ë'æ'÷'((ñ)J*d****ž*=,-$.å.‰/£/¾/Ï/Ü/Ý/Ï1)2C2^2o2|2}2˜45.5I5Z5g5h578„8ž8%9;9<9Ï9Ð97:8:ß:à:~;é;B<W<ë<ì<Ó=Ô=à>á> ?O?ApBDC5DE_E®EöFGaIcKL–LMSM‹M NEN}N O’PQ€QúQdRÅSúU]?]—]¶]Þ]^X^…^¬^ý^[_g_¤_½_à_á_­a®abb¬bðbJcjc–c·cÈcÛcÜcídîdUhVhii!jÐj2lèl“m¿nžolpmpÂpq=qQqrqƒq–q—qºsDtEtÁuÂuDvEvšvõvw)wJw[wnwowHxIxBzCzÇzÈzÕ{Ö{Ñ|Ò|}R}…}›}ß}÷}~ ~F~‚~~¸~û~(Vk‚¾ü€:€f€’€¿€Þ€ö€÷€D]‰¾ÏâãLƒMƒC„D„Ÿ…І"‰x‰y‰þ‰ÿ‰CŠžŠ¾ŠÒŠóŠ‹‹‹=Œ>Œefåæ2ŽSŽkŽ|Ž}Ž4ÌÍ‹‘Œ‘¬’­’““8“9“t“u“•“È“ç“õ“ø“”I”h”|”}”¯”°”À”ü” •• •j•‰•µ•˕̕5–ƒ–œ–ß–ð–ñ–3˜4˜í˜î˜Ý™š/šašršsšË›œ3œJœ[œ\œ÷œ[\‡ƒŸ„Ÿ  œ ½ Ø ó ¡¡¡O¢{¢–¢¨¢¹¢º¢ñ¢2£^£x£°£è£ ¤¥¤ܤݤ›¥x¦Û¦¡§Чë§ý§¨¨Q©Ÿ©º©Õ©æ©ç©k«l«¸«Å«î«¬1¬2¬c¬q¬r¬Á¬ܬ÷¬­­­'®‰®V¯q¯‚¯¯¯ˆ²ì²¹³Ô³å³ò³ó³Ͷ/·J·e·v·ƒ·„·X¹ƹá¹ü¹ ººº¼¼•¼°¼̼ݼþ¼ÿ¼iÀ¥ÀÁÔÁïÁ ÂÂ~ÃèõÄÐÄáÄíÄîÄùÅQÆlƇƘƙÆBÈŽÈ©ÈÄÈÕÈÖÈ5ʖʱÊÌÊÝÊÞÊÌÎÌéÌÍÍÍÐÎÏ8ÏSÏdÏeÏšÐùÐÑ/Ñ@ÑAÑÓÒ7Ó8Ó…Ó ÓôÓÔÔ1Õ}Õ˜ÕìÕýÕþÕ;×§×Â×Ý×î×ï×TØ'ÙÚ[ÚvÚ–Ú§Ú¨ÚËÛÜ4Üz܋܌ܑÝÙÝôÝÞIÞiÞzÞÞŽÞ¿ßpàGáeáâcâdâFãâãããìãäOäYäZäsä æWæçç%é&étêuê”ë¸ë0ídîEïCñ±ô²ôåô¦õ€ö÷;øúø9ùŠùºû›ü–ýÓýpþÍþûÿX˧íå­Á  4 =>°ÜÂ#$qRò,Ms„… %Yz´ÅÆ4Š«Ïàáú!û!Š#‹#Ä#ï#$+$C$D$r$É$á$â$E%§%Ú%û%4&E&F&}'~'Ü'ý'()(*(è(é()9)q)‚)–)—)µ)7*£*Ä*ä*ø*<+M+`+a+U,ž,¿,ç,ø, - -m-ˆ-Á-`.›.Ñ.ý.¬/ô/ 0&070F0G0?1ð1ñ1n2ˆ2¶2·2·3Œ5Ò5é566!6"6Ž6¹7„8q;·;Î;é;ú;<<j<>a>x>“>¤>³>Ä>Å>ý?µ@Ö@ò@AAAOBPB™BÍBJC’C“CÄCEDóDôD@EGÑHéISKTKÃKÄKÓKL%L&L5LgLwL|L‹LÆLÖL×LåL4MCM…M¦MÇMØMÙM=N>N%OhOÍO4P•PµP¶P/Q¾QS>S”S#TyU³U VêV@X¿XÀXUZVZvZÈZÉZéZ>[?[Ç[$\q\ˆ\¨\Ô\ò\]]]Ø]]^^^^Õ^ø^_*_A_B_®_ `²`&a'a¼a½aßa b!brb•b°bÁbÐbÑb¯cñcòcÝdëdùd[e®eýe5fmf¡f×fbg©gìgBhYhZhiiÊjËj k'kEkkk|k‹kŒk,lNmOm)n*nÊoËo,p¶pFqGq^q¹qirjrÁrXsYst7tVt|ttŽtSu´vµv^wx“xÓxy\y¨yðy8z{k{Á{§|ð|9}ö}Ô~+‚ê3€„€Õ€&Ç4‚‘‚î‚'ƒaƒ™ƒ׃c„……k…l…S†z‡ ˆ(‰ØŠŒiŽçè¾ù ’‘“’“C”‘”ß”•T••Ì•[–‚—ƒ—5˜6˜¹˜º˜†š‡š½šКÝ›ñ›ò›œvœŠœ‹œ¡œñœížžžHžvžžŽžÞžøžŸ9ŸFŸGŸ¤ ï  ¡L¡]¡p¡q¡8£û£¤1¤W¤h¤v¤w¤¯¦0¨1¨í¨Ú©íªV« ­±­²­"®#®3¯Ư°ç°A±œ±±>²?²°²±²$³%³x³—³™³»³سú³´@´n´p´q´Ä´Ö´#µ6µ7µFµ©µ¹µºµɵ)¶9¶:¶I¶’¶¢¶â¶ü¶E·V·d·e·¸k»¹»Ó»¼ ¼,¼-¼«¼½3½U½f½}½~½µ½¾¾/¿¨¿©¿åÀ+ÁEÁ`ÁqÁ€ÁÁáÂ0ÃJÃeÃvêëÃóÄ<ÅVÅqłőŒÅÅÅÆÆ8ÆIÆXÆYÆøÆRÇlÇÎÇôÇÈÈÈ`ɶÉÐÉìÉ ÊÊ*Ê+ÊÞÊ9Ëíˉ̊Ì1Î2Î?ÏXϟϹÏÿÏÐ5ÐTÐeÐsÐtзҸÒÁÒÑÒÓÓÙÓóÓÔ.Ô?ÔMÔNÔ‹ÔŒÔT×U×ñÙòÙ»Û¼ÛÉÝÞ-ÞHÞYÞhÞxÞyÞÀßá4á*â;âñâ}ã~ãååKæLæmæépêûëHî¹òô`öaöŸöÎö ÷ ÷q÷Ÿ÷ã÷ä÷*øQø£øÂøüøù3ù×ùØù¿úÀúlûˆþŽð-tu¯ÀˆÒë Ýòó)ÔÕ  % & Ô Õ . / n × fþ(‰j§Å7M°±ñ3ÄÇ7CÙÎn€"Ý" #Ú#ý#‰$Ÿ$¿$%"%V%W%”%'Í'¯(ø().)q)‚))‘)†*&+<+\+x+‰+—+˜+,d,z,š,µ,Æ,Õ,Ö,.q.Š.ª.¾.ß.ð.//:1;1À1Q2o2K3L3ß3ý34ª4«4e5¹5 6 6‹6Œ6 6ë677V7“7°7Å7Ú7ê7-8X8²8Q9R9Õ9Ö9ì9::Ð:;<D<y<’=¿=ê=¸>¹>Ã>Ó>??w?œ?³?Ð?è?ø? @"@9@:@ã@A¤AQB¶BáBC@CšCÏCDFDfEgEžE»E¼EFF÷FÿFGG%G.G´GŠH‹H6I_I`IiIqIzIˆI‘I¡I¢I§I­I®I¯I°I±I²I³I´IµI·I¹I¿IÀIÅIÊIËIÎIÐIÖI×IÚIßIàIâIåIëIìIñIôIõIøIûIJJJJ J J J J JJJJJJJJJ$J%J(J*J/J0J3J6J7J9JÈGÈZÈlÈȌȤȵÈÄÈÙÈêÈúÈ ÉÉ'É6ÉGÉXÉiÉvÉɒɞɱɾÉÒÉàÉóÉÊÊÊ1ÊBÊTÊdÊuʃÊʢʱʹÊÇÊÖÊæÊùÊ ËË#Ë8ËLË[ËkË}˘ˮËÀËÍËàËóËÌÌÌ+Ì=ÌVÌnÌ̶̢̑ÌÏÌáÌðÌÍÍ Í0Í?ÍJÍ`Íu͋͛ͫͻÍÍÍÞÍðÍÎÎ&Î6ÎFÎWÎkÎΕΧθÎÐÎÙÎâÎîÎüÎ ÏÏ,Ï>ÏOÏ^ÏjÏzÏ…ÏŽÏÏ­Ï»ÏÈÏÖÏãÏøÏÐÐ'ÐBÐ\ÐjÐwЈКШдÐÇÐÔÐãÐäÐæÐ÷ÐøÐcÑdÑvÑwÑâÑæÑ˜0€€˜0€€0€€0€€˜0€|˜0€|˜0€|˜0€|˜0€|˜0€|˜0€|˜0€|˜0€|˜0€|0€€0€€0€€˜0€ñ0€€0€€0€€0€€0€€˜0€*˜0€*c 0€€˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` ˜0€` 0€€˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#˜0€#c 0€€c 0‹‹˜¸ a0€‹˜¸ 0€‹˜¸ 0€‹c 0‹‹(c 0ïŽïŽ˜ 0€"˜ 0€"(c 0ïŽïŽ˜ 0€~–˜ 0€~–˜ 0€~–˜ 0€~–˜ 0€~–˜ 0€~–˜ 0€~–˜ 0 €~–˜ 0 €~–˜ 0 €~–˜ 0 €~–˜ 0 €~–˜ 0€~–˜ 0€~–˜ 0€~–˜ 0€~–˜ 0€~–(c 0ïŽïŽ˜0€c®˜0€c®˜ 0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜ 0€c®˜ 0€c®˜0€c®˜0€c®˜0€c®˜0€c®˜0€c®c 0€€˜0€q»c 0q»q»˜0€¼˜l 0€¼˜l 0€¼˜l 0€¼c 0q»q»˜0€êØa0€êØm a0€êØm 0€êØm 0€êØm 0€êØ0€êØm a0€êØa0€êØm a0€êØm a0€êØm a0€êØm a0€êØa0€êØn a0€êØn a0€êØn a0€êØo a0€êØp a0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êØ0€êÃc 0q»q»˜0€×Ò˜0€×Ò˜0€×Ò˜0€×Ò˜6 0€×Ò˜4 0€×Ò˜4 0€×Ò˜5 0€×Ò˜5 0€×Ò˜5 0€×Ò˜5 0€×Òc 0q»q»˜0€Ùؘ: 0€Ùؘ: 0€Ùؘe0€Ùؘe0€Ùؘe0€Ùؘe0€Ùؘe0€Ùؘ: 0€ÙØc 0€€˜0€=Ýc 0=Ý=ݘ0€ëÞ˜: 0€ëÞ˜: 0€ëÞ˜: 0€ëÞ˜: 0€ëÞ˜0€ëÞ˜0€ëÞc 0=Ý=ݘ0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ã˜0€9ãc 0=Ý=ݘ0€è˜º 0€è˜º 0€è˜º 0€èc 0=Ý=ݘ0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Ré˜0€Réc 0=Ý=ݘ0€¿ñ˜9 o0€¿ñ˜9 o0€¿ñ˜9 o0€¿ñc 0=Ý=ݘ0€šõ˜0€šõ˜0€šõ˜0€šõ˜0€šõc 0€€˜0€†ø˜0€†ø˜0€†øc 0†ø†ø˜0€¤û˜0€¤û˜9 o0€¤û˜9 o0€¤ûc 0†ø†ø˜0€Â˜9 o0€Â˜9 o0€Â˜9 o0€Â˜9 o0€Â˜9 o0 €Âc 0†ø†ø˜0€†˜9 o0 €†˜9 0 €†˜9 0 €†˜9 0 €†˜9 0€†˜9 o0€†˜9 o0€†˜9 o0€†˜0€†c 0€€˜0€Ê!˜0€Ê!˜0€Ê!˜0€Ê!˜0€Ê!c 0Ê!Ê!˜0€;%˜0€;%˜0€;%c 0Ê!Ê!˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(˜0€B(c 0Ê!Ê!˜0€d*˜ 0€d*˜ 0€d*c 0Ê!Ê!˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+˜0€;+c 0Ê!Ê!˜0€Ø,˜0€Ø,˜0€Ø,c 0Ê!Ê!˜0€&.c 0Ê!Ê!˜0€²/˜} 0€²/˜~ 0€²/˜~ 0€²/˜~ 0€²/˜~ 0€²/˜~ 0€²/˜0€²/˜0€²/˜§ a0€²/˜§ a0€²/˜§ a0€²/˜§ a0€²/c 0Ê!Ê!˜0€Ñ5˜€ 0€Ñ5˜€ 0€Ñ5˜€ 0€Ñ5˜€ 0€Ñ5˜€ 0€Ñ5c 0Ê!Ê!˜0€ï;˜0€ï;˜0€ï;˜0€ï;(c 0ï;ï;˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜c0€Ð=˜c0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜0€Ð=˜c0€Ð=(c 0ï;ï;˜0€ýC(c 0ï;ï;˜0€=E˜ 0€=E˜ 0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜0€=E˜c0€=E˜0€=E(c 0ï;ï;˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×I˜0€×Ic 0 Ê!Ê!˜0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0€©N˜ 0 €©N˜ 0 €©N˜ 0 €©N˜ 0 €©N˜ 0 €©N˜c0€©Nc 0 Ê!Ê!˜0€PS˜’ b0€PS˜’ b0€PS˜’ b0€PS˜’ b0€PS˜’ b0€PS˜’ b0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PS˜0€PSc 0 Ê!Ê!˜0€Q\˜0€Q\(c 0Q\Q\˜0€Ö](c 0Q\Q\˜0€I_(c 0Q\Q\˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_˜0€æ_c 0 Ê!Ê!˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c˜0€2c(c 02c2c˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e˜0€e(c 02c2c˜0€Œm˜0€Œm˜’ b0€Œm˜’ b0€Œmc 0 Ê!Ê!˜0€ðo(c 0ðoðo˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq˜d0€eq(c 0ðoðo˜0€Q˜0€Q˜0€Q˜0€Q˜d0€Q˜d0€Q˜d0€Q˜d0€Q(c 0ðoðo˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰˜d0€^‰(c 0ðoðo˜0€@­˜½ s0€@­˜½ s0€@­˜½ s0€@­˜½ s0€@­˜½ s0€@­˜½ s0€@­˜½ s0€@­˜½ s0€@­˜s0€@­˜s0€@­˜½ s0€@­˜½ s0 €@­˜½ s0 €@­˜0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­˜d0€@­(c 0ðoðo˜d0€O¼˜d0€O¼˜d0€O¼˜d0€O¼˜d0€O¼˜d0€O¼˜d0€O¼˜d0€O¼(c 0ðoðo˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Ç˜d0€¥Çc 0Ê!Ê!˜0€5é˜0€5é˜0€5é˜0€5é˜0€5é˜0€5é˜0€5éc 0€€˜0€f𘧠a0€f𘧠a0€f𘧠a0€f𘧠a0€f𘧠a0€f𘧠a0 €f𘧠a0 €fð˜a0€fð˜a0€fð˜a0€fð˜a0€fð˜a0€fð˜a0€fð˜a0€fð˜a0€fðc 0fðfð˜0€6˜§ a0 €6˜§ a0 €6c 0fðfð˜0€˜§ a0 €˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜a0€˜a0€˜0€˜c0€˜0€˜c0€˜0€˜c0€˜0€˜c0€c 0fðfð˜0€˜0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0€˜§ a0 €˜§ a0!€˜§ a0"€˜§ a0#€˜§ a0$€c 0fðfð˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€G˜0€Gc 0fðfð˜0€Ú!˜0€Ú!˜e0€Ú!˜e0€Ú!˜e0€Ú!˜e0€Ú!˜e0€Ú!˜e0€Ú!˜e0€Ú!˜e0€Ú!˜0€Ú!˜0€Ú!˜0€Ú!˜0€Ú!c 0fðfð˜0€µ,c 0€€c 0..˜'0€;.˜'0€;.˜'0€;.˜'0€;.˜0€;.˜0€;.˜0€;.˜0€;.˜0€;.˜0€;.˜0€;.c 0..˜'0€ö1˜'0€ö1˜'0€ö1˜'0€ö1˜'0€ö1˜0€ö1˜0€ö1c 0..˜'0€3˜'0€3˜'0€3˜'0€3˜0€3˜0€3c 0..˜'0€Õ5˜'0€Õ5˜'0€Õ5˜'0€Õ5˜0€Õ5˜0€Õ5c 0..˜'0€J8˜'0€J8˜'0€J8˜0€J8˜0€J8c 0..˜'0€:˜'0€:˜'0€:˜'0€:˜0€:˜0€:c 0..˜'0€<˜'0€<˜'0€<˜'0€<˜0€<˜0€<c 0..˜'0€>˜'0€>˜0€>˜0€>˜0€>˜0€>˜Z 0€>˜Z 0€>˜0€>˜0€>c 0..˜'0€—A˜'0€—A˜0€—A˜0€—A˜0€—A˜Z 0€—A˜Z 0€—Ac 0 ..˜'0€—D˜'0€—D˜'0€—D˜0€—D˜0€—D(c 0—D—D˜'0€ˆE˜'0€ˆE˜'0€ˆE˜0€ˆE˜0€ˆE(c 0—D—D˜'0€îF˜'0€îF˜'0€îF˜0€îF˜0€îF˜0€îF(c 0—D—D˜'0€½H˜'0€½H˜'0€½H˜'0€½H˜0€½H˜0€½Hc 0 ..˜'0€EJ˜'0€EJ˜'0€EJ˜0€EJ˜0€EJ˜0€EJ˜§ a0%€EJ˜§ a0&€EJ˜§ a0'€EJ˜§ a0(€EJ(c 0EJEJ˜'0€ÛN˜'0€ÛN˜'0€ÛN˜'0€ÛN˜0€ÛN˜0€ÛN˜0€ÛN˜0€ÛN˜0€ÛN˜0€ÛN˜0€ÛN(c 0EJEJ˜'0€ÃQ˜'0€ÃQ˜'0€ÃQ˜'0€ÃQ˜0€ÃQ˜0€ÃQ˜0€ÃQ˜f0€ÃQ˜9 o0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜0€ÃQ˜0€ÃQ˜9 0€ÃQ˜9 0€ÃQ˜9 0 €ÃQ˜9 0!€ÃQ˜9 0"€ÃQ˜9 0#€ÃQ˜9 0$€ÃQ˜9 0%€ÃQ˜9 0&€ÃQ˜9 0'€ÃQ˜0€ÃQ˜0€ÃQ˜9 0(€ÃQ˜9 0)€ÃQ˜9 0*€ÃQ˜9 0+€ÃQ˜9 0,€ÃQ˜9 0-€ÃQ˜0€ÃQ˜f0€ÃQ˜9 0.€ÃQ˜9 0/€ÃQ˜9 00€ÃQ˜9 01€ÃQ˜0€ÃQ˜0€ÃQ˜0€ÃQ˜0€ÃQ˜'0€ÃQ(c 0EJEJ˜'0€²h˜'0€²h˜'0€²h˜'0€²h˜0€²h˜0€²h(c 0EJEJ˜'0€j˜'0€j˜'0€j˜'0€j˜0€j˜0€j˜0€j˜0€j˜0€j˜0€j˜0€j(c 0EJEJ˜'0€Õn˜'0€Õn˜'0€Õn˜'0€Õn˜0€Õn˜0€Õn(c 0EJEJ˜'0€=q˜'0€=q˜'0€=q˜'0€=q˜0€=q˜0€=q(c 0EJEJ˜'0€`r˜'0€`r˜'0€`r˜'0€`r˜0€`r˜0€`r˜0€`r˜0€`r˜0€`r˜0€`r˜0€`r˜0€`r(c 0EJEJ˜'0€;t˜'0€;t˜'0€;t˜'0€;t˜0€;t˜0€;t(c 0EJEJ˜'0€ív˜'0€ív˜'0€ív˜'0€ív˜0€ív˜0€ív(c 0 EJEJ˜'0€§x˜'0€§x˜'0€§x˜'0€§x˜0€§x˜0€§x˜§ a0)€§x˜§ a0*€§x˜§ a0+€§x(c 0 EJEJ˜'0€>}˜'0€>}˜'0€>}˜'0€>}˜0€>}˜0€>}˜0€>}˜0€>}(c 0 EJEJ˜'0€<˜'0€<˜'0€<˜'0€<˜0€<˜0€<(c 0 EJEJ˜'0€(ƒ˜'0€(ƒ˜'0€(ƒ˜'0€(ƒ˜0€(ƒ˜0€(ƒ(c 0 EJEJ˜'0€Ó„˜'0€Ó„˜'0€Ó„˜'0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜; 0€Ó„˜; 0€Ó„˜; 0€Ó„˜2 0€Ó„˜2 0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„˜0€Ó„(c 0EJEJ˜'0€X‹˜'0€X‹˜'0€X‹˜'0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹˜; 0€X‹˜; 0€X‹˜; 0€X‹˜2 0€X‹˜2 0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹˜0€X‹(c 0EJEJ˜'0€’˜'0€’˜'0€’˜'0€’˜0€’˜0€’(c 0EJEJ˜0€˜“(c 0EJEJ˜'0€n”˜'0€n”˜'0€n”˜'0€n”˜0€n”˜0€n”(c 0EJEJ˜'0€µ–˜'0€µ–˜'0€µ–˜'0€µ–˜0€µ–˜0€µ–c 0 ..˜'0€Ù—˜'0€Ù—˜'0€Ù—˜'0€Ù—˜'0€Ù—˜0€Ù—˜0€Ù—˜0€Ù—c 0 ..˜'0€Øš˜'0€Øš˜'0€Øš˜'0€Øš˜'0€Øš˜0€Øš˜0€Øšc 0 ..˜'0€"œ˜'0€"œ˜'0€"œ˜'0€"œ˜0€"œ˜a0€"œc 0..˜'0€Ï˜'0€Ï˜'0€Ï˜0€Ï˜a0€Ï˜a0€Ï˜a0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ï˜0€Ïc 0€€˜'0€q¢˜'0€q¢˜'0€q¢˜0€q¢˜0€q¢˜0€q¢˜< 0€q¢˜< 0€q¢˜< 0€q¢˜0€q¢˜$0€q¢˜$0€q¢˜$0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢˜0€q¢c 0q¢q¢˜'0€3¨˜'0€3¨˜'0€3¨˜'0€3¨˜'0€3¨˜0€3¨˜a0€3¨˜a0€3¨˜± a0€3¨˜± a0€3¨c 0q¢q¢˜'0€…«˜'0€…«˜'0€…«˜'0€…«˜'0€…«˜0€…«˜0€…«˜0€…«˜0€…«c 0q¢q¢˜'0€¯˜'0€¯˜'0€¯˜'0€¯˜'0€¯˜0€¯˜0€¯˜§ a0,€¯˜§ a0-€¯˜§ a0.€¯˜$0€¯c 0q¢q¢˜'0€t²˜'0€t²˜'0€t²˜'0€t²˜'0€t²˜0€t²˜0€t²c 0q¢q¢˜'0€—´˜'0€—´˜'0€—´˜'0€—´˜'0€—´˜0€—´˜0€—´˜0€—´c 0q¢q¢˜'0€(¶˜'0€(¶˜'0€(¶˜'0€(¶˜'0€(¶˜0€(¶˜0€(¶c 0q¢q¢˜'0€#¸˜'0€#¸˜'0€#¸˜'0€#¸˜'0€#¸˜'0€#¸˜0€#¸˜0€#¸˜0€#¸˜· 0€#¸˜· 0€#¸˜· 0€#¸˜0€#¸˜0€#¸c 0q¢q¢˜'0€B½˜'0€B½˜'0€B½˜'0€B½˜'0€B½˜'0€B½˜0€B½˜0€B½c 0 €€˜'0€(¿˜'0€(¿˜'0€(¿˜0€(¿˜0€(¿˜0€(¿˜0€(¿˜0€(¿˜0€(¿˜0€(¿˜0€(¿˜0€(¿W 0€€˜0€9ÃW 0€€˜X 0€Æ˜X 0€Æ˜X 0€Æ˜X 0€Æ˜X 0€Æ˜0€Æ˜0€Æ˜0€ÆW 0€€c 0(¿Òʘ'0€{͘'0€{͘'0€{͘0€{͘0€{͘0€{͘0€{͘0€{͘0€{Íc 0(¿Òʘ'0€~И'0€~И'0€~И0€~И0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0 €~ИK 0 €~ИK 0 €~ИK 0 €~ИK 0 €~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~ИK 0€~И0€~И0€~И0€~И0€~И0€~И0€~И0€~И0€~И0€~И0€~И0€~И0€~Ðc 0(¿Òʘ'0€§ð˜'0€§ð˜'0€§ð˜0€§ð˜0€§ð˜0€§ð˜0€§ð˜Y 0€§ð˜Y 0€§ð(c 0§ð§ð˜'0€Öó˜'0€Öó˜'0€Öó˜0€Öó˜0€Öó˜0€Öó˜0€Öó˜Z 0€Öó˜Z 0€Öó˜0€Öó(c 0§ð§ð˜'0€Âø˜'0€Âø˜'0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜Z 0€Âø˜Z 0€Âø˜Z 0€Âø˜Z 0 €Âø˜Z 0 €Âø˜Z 0 €Âø˜Z 0 €Âø˜Z 0 €Âø˜Z 0€Âø˜Z 0€Âø˜Z 0€Âø˜Z 0€Âø˜Z 0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø(c 0§ð§ð˜'0€D˜'0€D˜'0€D˜0€D˜0€D˜0€D˜0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜Z 0€D˜0€D˜0€D˜0€D˜0€D˜c0€D˜c0€D(c 0§ð§ð˜'0€v˜'0€v˜'0€v˜0€v˜0€v˜0€v˜0€v˜Z 0€v˜Z 0 €v˜Z 0!€v˜Z 0"€v˜Z 0#€v˜Z 0$€v˜Z 0%€v˜Z 0&€v˜Z 0'€v˜Z 0(€v˜Z 0)€v˜Z 0*€v˜Z 0+€v˜Z 0,€v˜Z 0-€v˜Z 0.€v˜Z 0/€v˜Z 00€v˜Z 01€v˜Z 02€v˜Z 03€v˜Z 04€v˜Z 05€v˜Z 06€v˜0€v˜Z 07€v˜Z 08€v˜Z 09€v˜K 0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v˜0€v(c 0§ð§ð˜'0€ž9˜'0€ž9˜'0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜Z 0:€ž9˜Z 0;€ž9˜Z 0<€ž9˜Z 0=€ž9˜Z 0>€ž9˜Z 0?€ž9˜Z 0@€ž9˜Z 0A€ž9˜Z 0B€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9˜0€ž9(c 0§ð§ð˜'0€ÊD˜'0€ÊD˜'0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜] 0€ÊD˜] 0€ÊD˜0€ÊD˜0€ÊD˜Z 0C€ÊD˜Z 0D€ÊD˜Z 0E€ÊD˜Z 0F€ÊD˜Z 0G€ÊD˜Z 0H€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD˜0€ÊD(c 0§ð§ð˜'0€R˜'0€R˜'0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜Z 0I€R˜Z 0J€R˜Z 0K€R˜Z 0L€R˜ž 0€R˜Z 0M€R˜Z 0N€R˜Z 0O€R˜0€R˜Z 0P€R˜0€R˜Z 0Q€R˜Z 0R€R˜Z 0S€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R˜0€R(c 0§ð§ð˜'0€mw˜'0€mw˜'0€mw˜0€mw˜0€mw˜0€mw˜Z 0T€mw˜Z 0U€mw˜Z 0V€mw˜Z 0W€mw˜Z 0X€mw(c 0§ð§ð˜'0€wz˜'0€wz˜'0€wz˜0€wz˜0€wzc 0(¿Òʘ'0€‰|˜'0€‰|˜'0€‰|˜0€‰|˜0€‰|˜0€‰|˜0€‰|˜Y 0€‰|˜Y 0€‰|(c 0‰|‰|˜'0€¼€˜'0€¼€˜'0€¼€˜0€¼€˜0€¼€˜0€¼€˜0€¼€˜^ 0€¼€˜0€¼€˜0€¼€(c 0‰|‰|˜'0€=„˜'0€=„˜'0€=„˜0€=„˜0€=„(c 0‰|‰|˜'0€,†˜'0€,†˜'0€,†˜0€,†˜0€,†(c 0‰|‰|˜'0€ˆ˜'0€ˆ˜'0€ˆ˜0€ˆ˜0€ˆ(c 0‰|‰|˜'0€1‰˜'0€1‰˜'0€1‰˜0€1‰˜0€1‰˜0€1‰˜0€1‰˜0€1‰˜0€1‰˜0€1‰˜0€1‰˜0€1‰(c 0‰|‰|˜'0€É‹˜'0€É‹˜'0€É‹˜0€É‹˜0€É‹˜§ a0/€É‹˜§ a00€É‹˜§ a01€É‹˜§ a02€É‹(c 0‰|‰|˜'0€þ˜'0€þ˜'0€þ˜0€þ˜0€þ˜0€þ˜§ a03€þ˜§ a04€þ˜§ a05€þ˜§ a06€þ˜§ a07€þ˜§ a08€þ˜§ a09€þ˜§ a0:€þ˜§ a0;€þ˜§ a0<€þc 0(¿Òʘ'0€2š˜'0€2š˜'0€2š˜'0€2š˜0€2š˜0€2š˜0€2š˜0€2š˜^ 0€2š˜^ 0€2š˜^ 0€2š˜^ 0€2š˜^ 0€2š˜^ 0€2š(c 02š2š˜'0€u ˜'0€u ˜'0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u ˜0€u (c 02š2š˜'0€?¥˜'0€?¥˜'0€?¥˜0€?¥˜0€?¥˜0€?¥˜0€?¥˜0€?¥˜0€?¥(c 02š2š˜'0€¢§˜'0€¢§˜'0€¢§˜0€¢§˜0€¢§˜0€¢§˜0€¢§˜0€¢§˜0€¢§˜0€¢§˜0€¢§˜0€¢§(c 02š2š˜'0€ß©˜'0€ß©˜'0€ß©˜'0€ß©˜'0€ß©˜0€ß©˜0€ß©˜0€ß©(c 02š2š˜'0€Y¯˜'0€Y¯˜'0€Y¯˜'0€Y¯˜'0€Y¯˜0€Y¯˜0€Y¯(c 02š2š˜'0€'±˜'0€'±˜'0€'±˜'0€'±˜'0€'±˜0€'±˜0€'±˜0€'±(c 02š2š˜'0€0´˜'0€0´˜'0€0´˜'0€0´˜'0€0´˜'0€0´˜0€0´˜0€0´˜0€0´(c 02š2š˜'0€$·˜'0€$·˜'0€$·˜'0€$·˜'0€$·˜'0€$·˜0€$·˜0€$·˜0€$·˜0€$·(c 02š2š˜'0€i»˜'0€i»˜'0€i»˜'0€i»˜'0€i»˜'0€i»˜0€i»˜0€i»˜0€i»˜0€i»(c 0 2š2š˜'0€Ê¾˜'0€Ê¾˜'0€Ê¾˜'0€Ê¾˜'0€Ê¾˜'0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜d0€Ê¾˜d0€Ê¾˜d0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾˜0€Ê¾(c 0 2š2š˜'0€ÍϘ'0€ÍϘ'0€ÍϘ'0€ÍϘ'0€ÍϘ'0€ÍϘ0€ÍϘ0€ÍϘ0€ÍϘ0€ÍϘ0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍϘd0€ÍÏ(c 0 2š2š˜'0€$Þ˜'0€$Þ˜'0€$Þ˜'0€$Þ˜'0€$Þ˜'0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜d0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ˜0€$Þ(c 0 2š2š˜'0€æ˜'0€æ˜'0€æ˜'0€æ˜'0€æ˜'0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜d0€æ˜d0€æ˜d0€æ˜d0€æ(c 0 2š2š˜'0€úí˜'0€úí˜'0€úí˜0€úí˜0€úí˜_ 0€úí˜_ 0€úíc 0(¿Òʘ0€cð˜0€cð˜r a0€cð˜t a0€c𘧠a0=€cð˜r a0€cð˜r a0€c𘧠a0>€c𘧠a0?€c𘧠a0@€c𘧠a0A€cð˜r a0€c𘧠a0B€c𘧠a0C€cð˜r a0€cð˜r a0€cð˜a0€cð˜a0€cð˜a0€cð˜a0€cðc 0 €€˜'0€·÷˜'0€·÷˜'0€·÷˜0€·÷˜0€·÷˜O 0€·÷˜O 0€·÷˜O 0€·÷˜O 0€·÷˜0€·÷˜0€·÷˜M 0€·÷˜M 0€·÷˜0€·÷˜0€·÷c 0·÷·÷˜'0€þ˜'0€þ˜'0€þ˜'0€þ˜0€þ˜0€þc 0·÷·÷˜'0€P˜'0€P˜'0€P˜'0€P˜0€P˜0€Pc 0·÷·÷˜'0€j˜'0€j˜'0€j˜'0€j˜0€j˜0€j˜0€j˜0€j˜0€j˜0€j˜0€j˜0€j˜0€jc 0·÷·÷˜'0€Ž ˜'0€Ž ˜'0€Ž ˜'0€Ž ˜0€Ž ˜0€Ž c 0·÷·÷˜'0€‘ ˜'0€‘ ˜'0€‘ ˜'0€‘ ˜'0€‘ ˜0€‘ ˜a0€‘ ˜0€‘ c 0·÷·÷˜'0€˜'0€˜'0€˜'0€˜0€˜0€˜0€˜0€˜0€˜0€˜§ a0D€˜§ a0E€˜§ a0F€˜a0€˜a0€˜a0€˜0€c 0·÷·÷˜'0€˜'0€˜'0€˜'0€˜0€˜0€c 0·÷·÷˜'0€Q˜'0€Q˜'0€Q˜'0€Q˜0€Q˜0€Q˜0€Qc 0·÷·÷˜'0€]˜'0€]˜'0€]˜0€]˜a0€]˜a0€]˜a0€]c 0 ·÷·÷˜'0€˜'0€˜'0€˜'0€˜0€˜0€˜0€˜0€˜0€˜0€c 0 ·÷·÷˜'0€o!˜'0€o!˜'0€o!˜0€o!˜0€o!˜0€o!˜0€o!˜0€o!c 0 ·÷·÷˜'0€$˜'0€$˜'0€$˜'0€$˜'0€$˜'0€$˜0€$˜0€$c 0 ·÷·÷˜'0€#&˜'0€#&˜'0€#&˜'0€#&˜'0€#&˜'0€#&˜0€#&˜0€#&˜0€#&c 0 ·÷·÷˜'0€¼'˜'0€¼'˜'0€¼'˜'0€¼'˜'0€¼'˜'0€¼'˜0€¼'˜0€¼'c 0·÷·÷˜'0€ª)˜'0€ª)˜'0€ª)˜'0€ª)˜'0€ª)˜'0€ª)˜0€ª)˜0€ª)˜0€ª)˜0€ª)˜0€ª)˜0€ª)˜0€ª)˜0€ª)˜0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)˜d0€ª)c 0·÷·÷˜'0€;4˜'0€;4˜'0€;4˜'0€;4˜'0€;4˜'0€;4˜0€;4˜0€;4˜0€;4˜0€;4˜0€;4˜0€;4c 0·÷·÷˜'0€&7˜'0€&7˜'0€&7˜'0€&7˜'0€&7˜'0€&7˜0€&7˜0€&7˜0€&7˜0€&7˜0€&7˜0€&7˜d0€&7c 0·÷·÷˜'0€Ã:˜'0€Ã:˜'0€Ã:˜'0€Ã:˜0€Ã:˜0€Ã:c 0·÷·÷˜'0€<˜'0€<˜'0€<˜'0€<˜0€<˜0€<c 0·÷·÷˜'0€À>˜'0€À>˜'0€À>˜'0€À>˜0€À>˜0€À>c 0·÷·÷˜'0€A˜'0€A˜'0€A˜'0€A˜0€A˜0€Ac 0·÷·÷˜'0€ÐB˜'0€ÐB˜'0€ÐB˜'0€ÐB˜0€ÐB˜0€ÐBc 0·÷·÷˜'0€GE˜'0€GE˜'0€GE˜'0€GE˜0€GE˜0€GE˜0€GEc 0·÷·÷˜'0€!H˜'0€!H˜'0€!H˜'0€!H˜0€!H˜0€!Hc 0·÷·÷˜'0€ƒJ˜'0€ƒJ˜'0€ƒJ˜'0€ƒJ˜0€ƒJ˜0€ƒJc 0·÷·÷˜'0€8N˜'0€8N˜'0€8N˜'0€8N˜0€8N˜0€8N˜0€8Nc 0·÷·÷˜'0€GQ˜'0€GQ˜'0€GQ˜'0€GQ˜0€GQ˜0€GQ˜0€GQ˜0€GQ˜0€GQ˜0€GQc 0·÷·÷˜'0€ÕU˜'0€ÕU˜'0€ÕU˜'0€ÕU˜0€ÕU˜0€ÕUc 0·÷·÷˜'0€éW˜'0€éW˜'0€éW˜'0€éW˜0€éW˜0€éWc 0·÷·÷˜'0€,Z˜'0€,Z˜'0€,Z˜'0€,Z˜0€,Z˜0€,Zc 0·÷·÷˜'0€5]˜'0€5]˜'0€5]˜'0€5]˜0€5]˜0€5]˜0€5]˜0€5]˜0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜0€5]˜0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]˜e0€5]c 0·÷·÷˜'0€j˜'0€j˜'0€j˜'0€j˜0€j˜0€jc 0 ·÷·÷˜'0€æk˜'0€æk˜'0€æk˜'0€æk˜'0€æk˜'0€æk˜0€æk˜0€æk˜0€æk˜0€æk˜0€æk˜0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€æk˜d0€ækc 0!·÷·÷˜'0€b€˜'0€b€˜'0€b€˜'0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€˜0€b€(c 0b€b€˜'0€Á‡˜'0€Á‡˜'0€Á‡˜'0€Á‡˜0€Á‡˜0€Á‡(c 0b€b€˜'0€­‰˜'0€­‰˜'0€­‰˜'0€­‰˜0€­‰˜0€­‰˜0€­‰(c 0b€b€˜'0€Œ˜'0€Œ˜'0€Œ˜'0€Œ˜0€Œ˜0€Œ˜0€Œ(c 0b€b€˜'0€sŽ˜'0€sŽ˜'0€sŽ˜'0€sŽ˜0€sŽ˜0€sŽ(c 0b€b€˜'0€¿˜'0€¿˜'0€¿˜'0€¿˜'0€¿˜0€¿˜0€¿(c 0b€b€˜'0€¢’˜'0€¢’˜'0€¢’˜'0€¢’˜'0€¢’˜0€¢’˜0€¢’(c 0b€b€˜'0€_–˜'0€_–˜'0€_–˜'0€_–˜0€_–˜0€_–(c 0b€b€˜'0€*˜˜'0€*˜˜'0€*˜˜'0€*˜˜0€*˜˜0€*˜(c 0b€b€˜'0€Æš˜'0€Æš˜'0€Æš˜'0€Æš˜'0€Æš˜0€Æš˜0€Æš(c 0 b€b€˜'0€¢˜'0€¢˜'0€¢˜'0€¢˜0€¢˜0€¢˜0€¢˜0€¢˜? 0€¢˜? 0€¢˜? 0€¢˜? 0€¢˜0€¢˜0€¢˜0€¢˜0€¢˜0€¢˜0€¢(c 0 b€b€˜'0€¦˜'0€¦˜'0€¦˜0€¦˜0€¦˜0€¦˜0€¦(c 0 b€b€˜'0€¨˜'0€¨˜'0€¨˜0€¨˜0€¨˜0€¨˜0€¨˜L 0€¨˜L 0€¨˜L 0€¨˜L 0€¨˜0€¨˜0€¨˜0€¨˜0€¨˜0€¨˜0€¨˜0€¨(c 0 b€b€˜'0€v±˜'0€v±˜'0€v±˜'0€v±˜0€v±˜0€v±(c 0 b€b€˜'0€³˜'0€³˜'0€³˜'0€³˜0€³˜0€³(c 0b€b€˜'0€Îµ˜'0€Îµ˜'0€Îµ˜0€Îµ˜0€Îµ˜0€Îµ˜0€Îµ˜0€Îµ˜0€Îµ(c 0b€b€˜'0€Í¹˜'0€Í¹˜'0€Í¹˜0€Í¹˜0€Í¹(c 0b€b€˜'0€&»˜'0€&»˜'0€&»˜0€&»˜0€&»˜0€&»˜0€&»˜0€&»˜0€&»˜0€&»(c 0b€b€˜'0€i¿˜'0€i¿˜'0€i¿˜0€i¿˜0€i¿˜0€i¿˜0€i¿(c 0b€b€˜'0€ƒÂ˜'0€ƒÂ˜'0€ƒÂ˜0€ƒÂ˜0€ƒÂ˜0€ƒÂ(c 0b€b€˜'0€Å˜'0€Å˜'0€Å˜0€Å˜0€Å˜0€Å(c 0b€b€˜'0€€Ç˜'0€€Ç˜'0€€Ç˜'0€€Ç˜'0€€Ç˜'0€€Ç˜0€€Ç˜0€€Ç˜0€€Ç˜0€€Ç˜0€€Ç˜0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç˜d0€€Ç(c 0b€b€˜'0€õ˜'0€õ˜'0€õ˜'0€õ˜'0€õ˜'0€õ˜0€õ˜0€õ(c 0b€b€˜'0€ôö˜'0€ôö˜'0€ôö˜'0€ôö˜'0€ôö˜'0€ôö˜0€ôö˜0€ôö˜0€ôö˜0€ôö˜0€ôö(c 0b€b€˜'0€¼ù˜'0€¼ù˜'0€¼ù˜'0€¼ù˜'0€¼ù˜'0€¼ù˜0€¼ù˜0€¼ù˜0€¼ù˜0€¼ù˜0€¼ù(c 0b€b€˜'0€Æü˜'0€Æü˜'0€Æü˜'0€Æü˜'0€Æü˜'0€Æü˜0€Æü˜0€Æü˜0€Æü(c 0b€b€˜'0€­ÿ˜'0€­ÿ˜'0€­ÿ˜'0€­ÿ˜'0€­ÿ˜'0€­ÿ˜0€­ÿ˜0€­ÿ˜0€­ÿ(c 0b€b€˜'0€}˜'0€}˜'0€}˜'0€}˜'0€}˜'0€}˜0€}˜0€}˜0€}˜0€}˜0€}˜d0€}˜d0€}˜d0€}˜d0€}˜d0€}˜d0€}(c 0b€b€˜'0€Á ˜'0€Á ˜'0€Á ˜'0€Á ˜'0€Á ˜'0€Á ˜0€Á ˜0€Á ˜0€Á ˜0€Á ˜0€Á (c 0b€b€˜'0€˜'0€˜'0€˜'0€˜0€˜0€˜0€˜0€(c 0b€b€˜'0€ª˜'0€ª˜'0€ª˜'0€ª˜'0€ª˜0€ª˜0€ª˜0€ª˜a0€ª(c 0b€b€˜'0€´˜'0€´˜'0€´˜'0€´˜'0€´˜0€´˜0€´˜0€´˜a0€´˜a0€´(c 0b€b€˜'0€>˜'0€>˜'0€>˜'0€>˜'0€>˜0€>˜0€>(c 0 b€b€˜'0€'˜'0€'˜'0€'˜'0€'˜0€'˜0€'˜§ a0G€'˜§ a0H€'˜§ a0I€'˜§ a0J€'˜§ a0K€'˜§ a0L€'˜a0€'˜a0€'(c 0!b€b€˜'0€p!˜'0€p!˜'0€p!˜'0€p!˜0€p!˜0€p!˜§ a0M€p!˜§ a0N€p!˜§ a0O€p!˜§ a0P€p!˜§ a0Q€p!˜a0€p!˜a0€p!(c 0"b€b€˜'0€[%˜'0€[%˜'0€[%˜'0€[%˜0€[%˜0€[%˜0€[%(c 0#b€b€˜'0€M'˜'0€M'˜'0€M'˜'0€M'˜0€M'˜0€M'(c 0$b€b€˜'0€ñ)˜'0€ñ)˜'0€ñ)˜'0€ñ)˜0€ñ)˜0€ñ)˜0€ñ)˜0€ñ)˜0€ñ)(c 0%b€b€˜'0€å.˜'0€å.˜'0€å.˜'0€å.˜0€å.˜0€å.(c 0&b€b€˜'0€Ï1˜'0€Ï1˜'0€Ï1˜'0€Ï1˜0€Ï1˜0€Ï1(c 0'b€b€˜'0€˜4˜'0€˜4˜'0€˜4˜'0€˜4˜0€˜4˜0€˜4(c 0(b€b€˜'0€78˜'0€78˜'0€78˜0€78˜0€78˜0€78˜0€78˜0€78˜0€78˜0€78˜0€788c 07878˜'0€~;˜'0€~;˜'0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜9 o02€~;˜9 o03€~;˜9 o04€~;˜K 0€~;˜K 0€~;˜K 0€~;˜K 0€~;˜K 0€~;˜K 0€~;˜K 0€~;˜K 0 €~;˜K 0!€~;˜K 0"€~;˜K 0#€~;˜K 0$€~;˜K 0%€~;˜K 0&€~;˜K 0'€~;˜K 0(€~;˜K 0)€~;˜K 0*€~;˜9 o05€~;˜K 0+€~;˜K 0,€~;˜K 0-€~;˜K 0.€~;˜K 0/€~;˜K 00€~;˜K 01€~;˜9 o06€~;˜9 o07€~;˜9 o08€~;˜9 o09€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;˜0€~;8c 07878˜'0€g_˜'0€g_˜0€g_˜0€g_˜0€g_˜0€g_˜0€g_˜0€g_8c 07878˜'0€¬b˜'0€¬b˜'0€¬b˜'0€¬b˜'0€¬b˜'0€¬b˜0€¬b˜0€¬b˜0€¬b˜0€¬b˜0€¬b˜0€¬b˜0€¬b˜d0€¬b˜d0€¬b˜d0€¬b˜d0€¬b˜d0€¬b˜d0€¬b˜d0€¬b˜d0€¬b˜d0€¬b8c 07878˜'0€mp˜'0€mp˜'0€mp˜'0€mp˜'0€mp˜'0€mp˜0€mp˜0€mp˜0€mp˜0€mp˜0€mp˜0€mp˜0€mp˜0€mp8c 07878˜'0€Ev˜'0€Ev˜'0€Ev˜'0€Ev˜'0€Ev˜'0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev˜0€Ev8c 07878˜'0€÷€˜'0€÷€˜'0€÷€˜'0€÷€˜'0€÷€˜'0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€˜0€÷€8c 07878˜'0€ÿ‰˜'0€ÿ‰˜'0€ÿ‰˜'0€ÿ‰˜'0€ÿ‰˜'0€ÿ‰˜0€ÿ‰˜0€ÿ‰˜0€ÿ‰˜0€ÿ‰˜0€ÿ‰˜0€ÿ‰˜0€ÿ‰c 0"·÷·÷˜'0€æ˜'0€æ˜'0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ˜0€æ(c 0ææ˜'0€ •˜'0€ •˜'0€ •˜0€ •˜0€ •(c 0ææ˜'0€5–˜'0€5–˜'0€5–˜0€5–˜0€5–˜0€5–˜0€5–˜0€5–˜0€5–(c 0ææ˜'0€Ý™˜'0€Ý™˜'0€Ý™˜0€Ý™˜0€Ý™c 0#·÷·÷˜'0€Ë›˜'0€Ë›˜'0€Ë›˜0€Ë›˜0€Ë›˜0€Ë›˜0€Ë›˜0€Ë›˜§ a0R€Ë›˜0€Ë›˜0€Ë›˜0€Ë›˜0€Ë›(c 0˛˛˜'0€œ ˜'0€œ ˜'0€œ ˜'0€œ ˜0€œ ˜0€œ (c 0˛˛˜'0€O¢˜'0€O¢˜'0€O¢˜0€O¢˜0€O¢˜T 0€O¢˜T 0€O¢˜T 0€O¢˜T 0€O¢˜T 0€O¢˜T 0€O¢˜T 0€O¢˜T 0€O¢˜0€O¢˜0€O¢˜0€O¢˜§ a0S€O¢˜§ a0T€O¢(c 0˛˛˜'0€¡§˜'0€¡§˜'0€¡§˜0€¡§˜0€¡§(c 0˛˛˜'0€Q©˜'0€Q©˜'0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©˜0€Q©(c 0˛˛˜'0€r¬˜'0€r¬˜'0€r¬˜'0€r¬˜0€r¬˜0€r¬(c 0˛˛˜'0€'®˜'0€'®˜'0€'®˜'0€'®˜0€'®˜0€'®(c 0˛˛˜'0€ˆ²˜'0€ˆ²˜'0€ˆ²˜'0€ˆ²˜0€ˆ²˜0€ˆ²(c 0˛˛˜'0€Í¶˜'0€Í¶˜'0€Í¶˜'0€Í¶˜0€Í¶˜0€Í¶(c 0˛˛˜'0€X¹˜'0€X¹˜'0€X¹˜'0€X¹˜0€X¹˜0€X¹˜0€X¹(c 0 ˛˛˜'0€¼˜'0€¼˜'0€¼˜'0€¼˜0€¼˜0€¼˜0€¼(c 0 ˛˛˜'0€¥À˜'0€¥À˜'0€¥À˜'0€¥À˜0€¥À˜0€¥À(c 0 ˛˛˜'0€~Ø'0€~Ø'0€~Ø'0€~Ø0€~Ø0€~Ã(c 0 ˛˛˜'0€ùŘ'0€ùŘ'0€ùŘ0€ùŘ0€ùÅ(c 0 ˛˛˜'0€BȘ'0€BȘ'0€BȘ0€BȘ0€BÈ(c 0˛˛˜'0€5ʘ'0€5ʘ'0€5ʘ0€5ʘ0€5Ê(c 0˛˛˜'0€Ì˜'0€Ì˜'0€Ì˜0€Ì˜0€Ì(c 0˛˛˜'0€ÐΘ'0€ÐΘ'0€ÐΘ0€ÐΘ0€ÐÎ(c 0˛˛˜'0€šÐ˜'0€šÐ˜'0€šÐ˜0€šÐ˜0€šÐ˜0€šÐ˜0€šÐ(c 0˛˛˜'0€8Ó˜'0€8Ó˜'0€8Ó˜0€8Ó˜0€8Ó(c 0˛˛˜'0€1Õ˜'0€1Õ˜'0€1Õ˜0€1Õ˜0€1Õ(c 0˛˛˜'0€;ט'0€;ט'0€;ט0€;ט0€;ט§ a0U€;ט§ a0V€;×(c 0˛˛˜'0€Ú˜'0€Ú˜'0€Ú˜0€Ú˜0€Ú(c 0˛˛˜'0€ËÛ˜'0€ËÛ˜'0€ËÛ˜0€ËÛ˜0€ËÛ(c 0˛˛˜'0€‘ݘ'0€‘ݘ'0€‘ݘ'0€‘ݘ'0€‘ݘ'0€‘ݘ0€‘ݘ0€‘ݘ0€‘Ýc 0 €€˜'0€pà˜'0€pà˜'0€pà˜0€pà˜0€pà˜0€pà˜0€pà˜0€pà˜0€pà˜0€pà˜0€pà˜0€pàc 0pàpà˜0€Z䘧 a0W€Z䘧 a0X€Z䘧 a0Y€Z䘧 a0Z€Zä˜a0€Zä˜a0€Zä˜a0€Zä˜a0€Zä(c 0ZäZä˜e0€”ë˜e0€”ë˜e0€”ë˜e0€”ë˜e0€”ë˜e0€”ë(c 0ZäZä˜e0€²ô˜e0€²ô˜e0€²ô˜e0€²ô˜e0€²ô(c 0ZäZä˜0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø˜e0€úø(c 0ZäZä˜0€ ˜0€ ˜0€ ˜0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ ˜d0€ c 0pàpà˜'0€ò˜'0€ò˜'0€ò˜0€ò˜0€ò˜0€òc 0pàpà˜'0€%˜'0€%˜'0€%˜0€%˜0€%˜0€%c 0pàpà˜'0€4˜'0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4˜0€4c 0pàpà˜'0€§%˜'0€§%˜'0€§%˜0€§%˜0€§%˜0€§%c 0pàpà˜'0€~'˜'0€~'˜'0€~'˜0€~'˜0€~'˜0€~'c 0pàpà˜'0€é(˜'0€é(˜'0€é(˜'0€é(˜0€é(˜0€é(˜0€é(c 0pàpà˜'0€7*˜'0€7*˜'0€7*˜'0€7*˜'0€7*˜'0€7*˜0€7*˜0€7*c 0pàpà˜'0€U,˜'0€U,˜'0€U,˜'0€U,˜0€U,˜0€U,˜§ a0[€U,˜§ a0\€U,˜§ a0]€U,˜§ a0^€U,˜§ a0_€U,˜§ a0`€U,˜0€U,c 0 pàpà˜'0€¬/˜'0€¬/˜'0€¬/˜'0€¬/˜0€¬/˜a0€¬/˜0€¬/˜0€¬/c 0 pàpà˜'0€ñ1˜'0€ñ1˜0€ñ1˜0€ñ1˜0€ñ1c 0 pàpà˜'0€Œ5˜'0€Œ5˜'0€Œ5˜'0€Œ5˜0€Œ5˜0€Œ5˜= 0€Œ5˜= 0€Œ5˜0€Œ5c 0 pàpà˜'0€q;˜'0€q;˜'0€q;˜'0€q;˜0€q;˜0€q;˜= 0€q;c 0 pàpà˜'0€>˜'0€>˜'0€>˜'0€>˜'0€>˜0€>˜0€>c 0pàpà˜'0€ý?˜'0€ý?˜'0€ý?˜'0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜§ a0a€ý?˜§ a0b€ý?˜§ a0c€ý?˜a0€ý?˜a0€ý?˜§ a0d€ý?˜§ a0e€ý?˜0€ý?˜0€ý?˜ 0€ý?˜ 0€ý?˜ 0€ý?˜ 0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?˜0€ý?c 0pàpà˜'0€CM˜'0€CM˜'0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜e0€CM˜e0€CM˜e0€CM˜e0€CM˜e0€CM˜0€CM˜0€CM˜= 0€CM˜= 0€CM˜= 0€CM˜0€CM˜= 0€CM˜= 0€CM˜= 0€CM˜0€CM˜= 0 €CM˜= 0 €CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CM˜0€CMc 0pàpà˜'0€$\˜'0€$\˜'0€$\˜'0€$\˜'0€$\˜'0€$\˜0€$\˜0€$\˜0€$\˜0€$\˜0€$\c 0pàpà˜'0€^˜'0€^˜'0€^˜'0€^˜0€^˜0€^˜0€^˜0€^˜0€^˜0€^˜0€^˜0€^˜0€^˜0€^˜0€^c 0pàpà˜'0€!b˜'0€!b˜'0€!b˜'0€!b˜0€!b˜0€!b˜0€!b˜0€!b˜0€!b˜e0€!b˜e0€!b˜e0€!b˜e0€!b˜e0€!b˜e0€!b˜e0€!b˜e0€!b˜e0€!bc 0pàpà˜'0€×f˜'0€×f˜'0€×f˜'0€×f˜0€×f˜0€×f˜0€×f˜0€×f˜0€×f(c 0×f×f˜'0€Ëj˜'0€Ëj˜'0€Ëj˜'0€Ëj˜'0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜e0€Ëj˜e0€Ëj˜0€Ëj˜0€Ëj˜A 0€Ëj˜A 0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj˜0€Ëj(c 0×f×f˜'0€Ys˜'0€Ys˜'0€Ys˜'0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜e0€Ys˜0€Ys˜0€Ys˜² 0€Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜0€Ys˜0€Ys˜C 0€Ys˜C 0€Ys˜C 0 €Ys˜0€Ys˜0€Ys˜C 0 €Ys˜C 0 €Ys˜C 0 €Ys˜C 0 €Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜C 0€Ys˜0€Ys˜² 0€Ys˜0€Ys˜² 0€Ys˜0€Ys˜² 0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys˜0€Ys(c 0×f×f˜'0€Žž˜'0€Žž˜'0€Žž˜'0€Žž˜0€Žž˜0€Žž(c 0×f×f˜'0€¤ ˜'0€¤ ˜'0€¤ ˜'0€¤ ˜0€¤ ˜0€¤ (c 0×f×f˜'0€8£˜'0€8£˜'0€8£˜'0€8£˜'0€8£˜0€8£˜0€8£˜f0€8£˜0€8£˜0€8£˜e0€8£˜e0€8£˜e0€8£˜e0€8£˜e0€8£˜e0€8£˜0€8£˜0€8£˜³ 0€8£˜´ 0€8£˜´ 0€8£˜0€8£˜´ 0€8£˜´ 0€8£˜0€8£˜³ 0€8£˜0€8£˜³ 0€8£˜0€8£˜³ 0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£˜0€8£(c 0×f×f˜'0€¢¶˜'0€¢¶˜'0€¢¶˜'0€¢¶˜0€¢¶˜0€¢¶˜0€¢¶(c 0×f×f˜'0€k»˜'0€k»˜'0€k»˜'0€k»˜0€k»˜0€k»(c 0×f×f˜'0€«¼˜'0€«¼˜'0€«¼˜'0€«¼˜0€«¼˜0€«¼˜§ a0f€«¼˜§ a0g€«¼˜§ a0h€«¼˜§ a0i€«¼˜a0€«¼˜a0€«¼(c 0×f×f˜'0€åÀ˜'0€åÀ˜'0€åÀ˜'0€åÀ˜0€åÀ˜0€åÀ(c 0 ×f×f˜'0€á˜'0€á˜'0€á˜'0€á˜0€á˜0€áÂ(c 0 ×f×f˜'0€óĘ'0€óĘ'0€óĘ'0€óĘ0€óĘ0€óÄ(c 0 ×f×f˜'0€ÅŘ'0€ÅŘ'0€ÅŘ'0€ÅŘ0€ÅŘ0€ÅÅ(c 0 ×f×f˜'0€øÆ˜'0€øÆ˜'0€øÆ˜'0€øÆ˜'0€øÆ˜0€øÆ˜0€øÆ(c 0 ×f×f˜'0€`ɘ'0€`ɘ'0€`ɘ'0€`ɘ'0€`ɘ0€`ɘ0€`ɘC 0€`ɘC 0€`ɘC 0€`ɘ0€`ɘ0€`ɘ0€`ɘ0€`ɘ0€`ɘ0€`ɘ0€`É(c 0×f×f˜'0€¹Ï˜'0€¹Ï˜'0€¹Ï˜'0€¹Ï˜'0€¹Ï˜0€¹Ï˜0€¹Ï˜0€¹Ï˜0€¹Ï˜0€¹Ï˜0€¹Ï˜0€¹Ï(c 0×f×f˜'0€Ó˜'0€Ó˜'0€Ó˜'0€Ó˜'0€Ó˜0€Ó˜0€Ó˜0€Ó˜µ 0€Ó˜0€Ó˜µ 0€Ó˜0€Ó˜µ 0€Ó˜0€Ó˜µ 0€Ó(c 0×f×f˜'0€Éݘ'0€Éݘ'0€Éݘ'0€Éݘ'0€Éݘ0€Éݘ0€ÉÝ(c 0×f×f˜'0€Àߘ'0€Àߘ'0€Àߘ'0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€ÀߘH 0€ÀߘH 0€ÀߘH 0€ÀߘH 0€ÀߘH 0€ÀߘH 0€ÀߘH 0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àߘ0€Àß(c 0×f×f˜'0€Âø˜'0€Âø˜'0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜K 02€Âø˜K 03€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø˜0€Âø(c 0×f×f˜'0€ˆ˜'0€ˆ˜'0€ˆ˜'0€ˆ˜0€ˆ˜0€ˆ˜K 04€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜0€ˆ˜f0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0€ˆ˜¥ 0 €ˆ˜¥ 0 €ˆ˜¥ 0 €ˆ˜¥ 0 €ˆ˜¥ 0 €ˆ˜0€ˆ˜f0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0€ˆ˜ª 0 €ˆ˜ª 0 €ˆ˜ª 0 €ˆ˜ª 0 €ˆ˜ª 0 €ˆ(c 0×f×f˜'0€ý#˜'0€ý#˜'0€ý#˜'0€ý#˜'0€ý#˜0€ý#˜0€ý#˜§ a0j€ý#˜§ a0k€ý#˜§ a0l€ý#(c 0×f×f˜'0€¯(˜'0€¯(˜'0€¯(˜'0€¯(˜'0€¯(˜0€¯(˜0€¯((c 0×f×f˜'0€†*˜'0€†*˜'0€†*˜'0€†*˜'0€†*˜0€†*˜0€†*(c 0×f×f˜'0€,˜'0€,˜'0€,˜'0€,˜'0€,˜0€,˜0€,(c 0×f×f˜'0€.˜'0€.˜'0€.˜'0€.˜'0€.˜'0€.˜0€.˜0€.˜0€.˜0€.c 0 €€˜'0€À1˜'0€À1˜0€À1c 0 €€˜'0€L3˜'0€L3˜'0€L3˜0€L3˜0€L3˜0€L3˜0€L3˜0€L3˜0€L3˜0€L3˜0€L3˜« 0€L3˜« 0€L3c 0L3L3˜'0€77˜'0€77˜'0€77˜'0€77˜'0€77˜'0€77(c 07777˜0€-8˜0€-8˜0€-8˜0€-8˜0€-8˜0€-8˜¬ 0€-8˜¬ 0€-8˜¬ 0€-8(c 07777˜0€Ð:˜0€Ð:(c 07777˜0€D<˜0€D<(c 07777˜0€¿=˜0€¿=˜0€¿=˜0€¿=˜0€¿=˜0€¿=c 0L3L3˜'0€?˜'0€?˜'0€?˜'0€?˜'0€?˜'0€?˜'0€?˜'0€?˜'0€?˜0€?(c 0??˜0€ã@˜0€ã@˜0€ã@(c 0??˜0€¶B(c 0??˜0€C˜0€C(c 0??˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC˜0€ÏC(c 0??˜0€.G˜0€.G˜0€.G˜0€.G˜0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.G©0€.G©0€.G©0€.G©0€.G©0€.G©0€.G™0€.Gc 0L3L3˜0€`J(c 0`J`J˜0€=K˜® 0€=K˜® 0€=K˜® 0€=K˜® 0€=K˜® 0€=K˜0€=K˜0€=K˜0€=K˜0€=K˜­ a0€=K˜­ 0€=K˜­ 0€=K˜0€=K˜0€=K˜0€=K˜0€=K(c 0`J`J˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jP˜0€jPc 0L3L3(c 0UU˜0€HU˜0€HU˜0€HUc 0€€˜'0€.W˜'0€.W˜'0€.W˜0€.Wc 0.W.W˜'0€Y˜'0€Y˜'0€Y˜0€Y˜0€Y˜0€Y˜0€Yc 0.W.W˜'0€E]˜'0€E]˜'0€E]˜0€E]˜0€E]c 0.W.W˜'0€ž_˜'0€ž_˜'0€ž_˜0€ž_˜0€ž_˜0€ž_c 0€€˜'0€¸a˜'0€¸a˜'0€¸ac 0¸a¸a˜'0€Çc˜'0€Çc˜'0€Çc˜'0€Çc˜0€Çcc 0¸a¸a˜'0€]f˜'0€]f˜'0€]f˜'0€]f˜0€]fc 0¸a¸a˜'0€¸h˜'0€¸h˜'0€¸h˜'0€¸h˜0€¸hc 0¸a¸a˜'0€±j˜'0€±j˜'0€±j˜'0€±j˜0€±jc 0¸a¸a˜'0€l˜'0€l˜'0€l˜'0€l˜0€lc 0¸a¸a˜'0€An˜'0€An˜'0€An˜'0€An˜0€Anc 0¸a¸a˜'0€p˜'0€p˜'0€p˜'0€p˜0€pc 0¸a¸a˜'0€!s˜'0€!s˜'0€!s˜'0€!s˜0€!sc 0¸a¸a˜'0€»t˜'0€»t˜'0€»t˜'0€»t˜0€»tc 0 ¸a¸a˜'0€¢v˜'0€¢v˜'0€¢v˜'0€¢v˜0€¢vc 0 ¸a¸a˜'0€Yx˜'0€Yx˜'0€Yx˜'0€Yx˜0€Yxc 0 ¸a¸a˜'0€Æy˜'0€Æy˜'0€Æy˜'0€Æy˜0€Æy˜0€Æy˜¨ 0€Æy˜¨ 0€Æy˜¨ 0€Æyc 0 ¸a¸a˜'0€ }˜'0€ }˜'0€ }˜'0€ }˜'0€ }˜0€ }c 0 ¸a¸a˜'0€I~˜'0€I~˜'0€I~˜'0€I~˜'0€I~˜0€I~c 0¸a¸a˜'0€X˜'0€X˜'0€X˜'0€X˜'0€X˜0€Xc 0¸a¸a˜'0€‚€˜'0€‚€˜'0€‚€˜'0€‚€˜'0€‚€˜0€‚€˜0€‚€c 0¸a¸a˜'0€Ò˜'0€Ò˜'0€Ò˜'0€Ò˜'0€Ò˜'0€Ò˜0€Ò˜0€Ò(c 0ÒÒ˜'0€L„˜'0€L„˜'0€L„˜'0€L„˜'0€L„˜0€L„(c 0ÒÒ˜'0€7‡˜'0€7‡˜'0€7‡˜'0€7‡˜'0€7‡˜0€7‡˜© 0€7‡˜© 0€7‡˜© 0€7‡˜0€7‡˜0€7‡(c 0ÒÒ˜'0€÷‹˜'0€÷‹˜'0€÷‹˜'0€÷‹˜'0€÷‹˜0€÷‹˜0€÷‹(c 0ÒÒ˜'0€lŽ˜'0€lŽ˜'0€lŽ˜'0€lŽ˜'0€lŽ˜0€lŽ˜0€lŽ(c 0ÒÒ˜'0€¥‘˜'0€¥‘˜'0€¥‘˜'0€¥‘˜'0€¥‘˜0€¥‘(c 0ÒÒ˜'0€x“˜'0€x“˜'0€x“˜'0€x“˜'0€x“˜0€x“c 0€€˜0€g•˜`0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜t0€g•˜@t0€g•c 0€€˜0€øœc 0øœøœ˜0€h˜0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€h˜g0€hc 0øœøœ˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜g0€x£˜0€x£c 0€€c 0›¬›¬˜0€¡¬˜@+0€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜`+0€¡¬˜+0€¡¬˜0€¡¬˜`0€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜90€¡¬˜`0€¡¬˜0€¡¬˜0€€š0€€˜0€€š0€€š0€€š0€€š0€€š0€€~~~~~~~~~~‘‘ýýýýýýýýýýýýýýýýýýýýýýýýýýý( Ld{@é ¢"y$™&Q)n+¯.k14†69Š;W>PA«CÜFJM’O·RpUÀX(\Œ_Ubød„hpk(nùpäs wz³}a€d‚ᄲ‡wŠ üŽ ”ƒžg£r¨Á¬V´r»FÊ<ÚÅèñ‹…‹s'û<ÅE¹S@Yåcu|Ou‡¼Œ”Oš¡¶¥¬¨­\±Z¸ ½2ÃPȵÌüÐþÖÚÞÞ¾äÝènî›ýÍ …Ì(º2f<‚DÁJíR·]éeðo3zy…ݵš@£+±’¾àÓ@Þö?þ!© "¦+‹; Mø[spõ„2ŽR–H›6£?ª#¶ï¿iÅÍÔ€Û>ã ëlò_þ}íÊ'›.)8`@¦J×S!_[c-m_t•zî~>„iW–©¡ó­¹(¾îĦÊ}ÐÖdÛ^àgã{è§í¼õ«ühâ=:µ¬ u*Â6†> E™N–ZhdËmravõ{؆‘˜÷£È­G¸Æ|Ñ1Ú©â§è¶òÑ÷ ð ‰À"q.07…? F)O­\²e—ktö|–„yŽK—v¡"©&²p»z¿iÉþÐAØ›ßæŸûíÊPC#Q/[5X9¦@”GcNŒV•](e€jatÜ}†úŒò–µš§e«P±åÖ,/0235678:;<>?@ACDEGHIJLMNOQRSUVWXZ[\^_`acdefhijlmnoprsuwz|~€‚ƒ„…‰ŠŽ’–˜™š›œžŸ ¡¢£¥¦§¨ª«¬­®¯°²³µ·¹»½¿ÁÃÅÇÉËÍÐÒÔØÛÝßáãåçéêíðòôùûýþ   "$&(*,./01468:<=?@BCDFGHIJLNOQSTUXZ\]_`bdefhjloqsuwy{}€ƒ„…‡ˆ‹’•—™›ž ¡£¥§©«­¯±²´¶·¹»¼¾ÀÁÃÅÇÒÔÕ×ÙÛÝßáãëíï`ÞÝ /(¼1ü: E´OZ‘eApÀ{脆Žñ©¹‚Á¶ÍpÕ¦Þ”ê›óÔ‡+v0r8gGMÇQƒYÖaXfi/pzF—AµÌ,ê,*Ü!'J6u>FrMV#díl±uz{Z†ߌ–…œ¥ë¨ò­t·ýoÅ#Ô.èòöêÿx }Ø*%9’>¶HÄTh_¼s)wÑ{ƒ›‹‘_¡+©®à¶!ÁÏ™ÓÚ<é;ïøƒ Ž!§)š/':A¦JGV³_jdqb…O–1 `«×¶mÀ½ÊÀÝûä—Æº q'ž/;>öK—bîiD{FƒLˆ|“ š[¡è¨2±v¼ÐÉÔîÜeæ±ù>à$)-ˆ2Ž;™G×Q³ZØbòh,qµ{'ˆß™£¯«—¸E¼`ÆôÌsÕHãÎûÀ‰Ÿ)š1 ;DAHzN°NÅNßNOO$OAO_O&QZ7eBpBz’‚‡÷T™›$xž÷ŸÀ ¡2¤¨ï¬›±ݳ6¶X¸8ºE¼c¾uÀ¹Â ÅGÇmÉCËÍóÎÀлҎÔvÖåÖ-149=BFKPTY]bgkqtvxy{}†‡ˆ‹Œ‘“”•—¤©±´¶¸º¼¾ÀÂÄÆÈÊÌÎÏÑÓÕÖ×ÙÚÜÞàâäæèëìîïñóõö÷øúüÿ   !#%')+-23579;>AEKMPRVWY[^acgikmnprtvxz|~‚†‰ŠŒŽ‘“”–˜šœŸ¢¤¦¨ª¬®°³µ¸º½¿ÂÄÆÈÉÊËÌÍÎÏÐÑÓÖØÚÜÞàâäåæçèéêìîðñòóôõö÷øùúûüýþÿäÖ.)+|¢¤5]vÐ)€¾ïô+±ÈÙ(ó  ' 2 N Q ,`qš¶¸Éåè Yux¬¯Äàã;>Lhk€œŸ½ÙÜí  B^aœ¸»è+GJc‚«ÇÊù?[^v’•´ÐÓë )EH`|›·ºä.1Wsvˆ¤§¸Ô×ð %ADTps©¬ßûþ25Wsv‰¥¨¼ØÛé!=@Yux«®¿ÛÞþ9UX‚ž¡»×Ú@\_„ £ÀÜßø  0 L O \ x { š ¶ ¹ Ó ï ò !+!.!F!b!e!¤!À!Ã!æ!""/"K"N"z"–"™"Ò"î"ñ"#9#<#d#€#ƒ#³#Ï#Ò#$*$-$`$|$$°$Ì$Ï$%%%P%l%o%š%¶%¹%Ø%ô%÷%+&G&J&o&‹&Ž&Å&á&ä&'' 'M'i'l'ž'º'½'û'((J(f(i(¢(¾(Á()$)')n)Š))¾)Ú)Ý)&*B*E*”*°*³*ô*++A+]+`+’+®+±+à+ü+ÿ+N,j,m,™,µ,¸,ý,--O-k-n-›-·-º-ó-..P.l.o.¡.½.À.ì./ /E/a/d//©/¬/ã/ÿ/0)0E0H0o0‹0Ž0Ó0ï0ò0.1J1M1v1’1•1Â1Þ1á12-202g2ƒ2†2²2Î2Ñ23!3$3M3i3l3¢3¾3Á3ä34474S4V4”4°4³4ê45 5G5c5f5 5¼5¿56 6#6O6k6n66¬6¯6Û6÷6ú6'7C7F7o7‹7Ž7±7Í7Ð7ü788l8ˆ8‹8º8Ö8Ù8939699©9¬9þ9::W:s:v:«:Ç:Ê:;,;/;;; ;ê;< <M<i<l<ž<º<½<è<==5=Q=T=m=‰==Ê=æ=ê=/>K>O>ˆ>¤>¨>á>ý>?.?J?N?Š?¦?ª?ç?@@5@Q@U@ƒ@Ÿ@£@ë@A AFAbAfAœA¸A¼AíA B BBB^BbBÁBÝBáBDC`CdC­CÉCÍC#D?DCD„D D¤DÔDðDôD:EVEZEžEºE¾EóEFFXFtFxF¯FËFÏFG;G?GˆG¤G¨G H%H)HpHŒHHºHÖHÚHI I$IMIiImI–I²I¶IJJ"JRJnJrJ§JÃJÇJïJ KKHKdKhK’K®K²KãKÿKL?L[L_L•L±LµLM!M%M{M—M›MN!N%N[NwN{NœN¸N¼NõNOOPOlOpO O¼OÀOPP PWPsPwP¬PÈPÌPþPQQTQpQtQ¾QÚQÞQ)RERIRŸR»R¿RúRSSPSlSpS¶SÒSÖS&TBTFTžTºT¾TUU UaU}UU½UÙUÝUV/V3V{V—V›VäVWW;WWW[W§WÃWÇW X)X-X•X±XµXÿXYY‡Y£Y§YëYZ Z[ZwZ{Z²ZÎZÒZ ['[+[p[Œ[[Ó[ï[ó[-\I\M\„\ \¤\Ü\ø\ü\:]V]Z]–]²]¶]á]ý]^:^V^Z^p^Œ^^Æ^â^æ^__"_[_w_{_·_Ó_×_!`=`A`‹`§`«`ø`aaoa‹aaòabb`b|b€bÑbíbñb8cTcXc™cµc¹cd#d'did…d‰dÃdßdãd+eGeKeˆe¤e¨eãeÿefIfefifœf¸f¼fùfggTgpgtgÙgõgùgh5h9hfh‚h†hÂhÞhâh*iFiJiyi•i™iÄiàiäi j)j-jjj†jŠj²jÎjÒjk2k6kWkskwkÊkækêkl;l?ltll”lÞlúlþl5mQmUmŒm¨m¬mêmn ncnnƒn·nÓn×no,o0oho„oˆoÉoåoéo9pUpYpp©p­p$q@qDq…q¡q¥qÜqøqüq^rzr~r°rÌrÐr s%s)stss”sËsçsës.tJtNt‹t§t«tÝtùtýtJufuju§uÃuÇuýuvvƒvŸv£vØvôvøvžwºw¾wôwxxXxtxxxÉxåxéx"y>yBy—y³y·yðy zzYzuzyzÐzìzðzK{g{k{‘{­{±{Ê{æ{ê{|$|(|F|b|f||›|Ÿ|ä|}}%}A}E}^}z}~}—}³}·}Ô}ð}ô}C~_~c~…~¡~¥~Â~Þ~â~"&Eae‹§«ý€€r€Ž€’€Æ€â€æ€%AE¡î ‚‚<‚X‚\‚”‚°‚´‚á‚ý‚ƒ>ƒZƒ^ƒ—ƒ³ƒ·ƒóƒ„„U„q„u„¶„Ò„Ö„…#…'…X…t…x…¦…Â…Æ… †(†,†\†x†|†­†É†Í†‡5‡9‡l‡ˆ‡Œ‡Â‡Þ‡â‡ ˆ)ˆ-ˆUˆqˆuˆ­ˆÉˆÍˆ ‰&‰*‰z‰–‰š‰»‰×‰Û‰í‰ Š Š(ŠDŠHŠdŠ€Š„ŠŠ¬Š°ŠßŠûŠÿŠ‹‹‹¶‹¼‹¿‹ç‹ŒfŒ‘Œ­ŒŽ:Ž<ŽV“q“s“å•–––A–`–™1™3™iš„š‹š¿šÚšàšþš› ›œ-œ6œ³ÍØkž†žžþžŸ Ÿ / : Þ ù ¡Î¢è¢í¢|£—£ž£P¤k¤r¤Û¤ö¤ú¤¥¥¥Û¦ö¦þ¦§-§5§y§”§›§¨¨Â¨É¨g©‚©‰©êª« «4«O«S«¬¬#¬H­c­g­V°q°x°¸5¸>¸¸«¸´¸­ÄÇÄÉÄ,ÆFÆHÆyÆ’Æ•ÆçÈÉÉ É$É'ÉsÉÉÉ–É°É³É à%à)à¬áÇáËáIâdâhâ¦äÁäÅäUåpåtåZæuæyæÝçøçüçOèjènè ì(ì,ìííífòò…òë 2=sŽ—Ýø K f o Å à æ .5Þøþ39Nhsç ãþ4OVÁÜߌ§¬qŒ“Èãè2MTYt{€›¢‚!!¤!Z#t#{#È&â&æ&×'((·.Ð.Õ.â8ü89§:À:Å:¦;À;Ç;X<q<v<ü<==¦>Á>Å>ZDtDyD…EŸE£EK©K®K¸OÒOÖOôOPPP2P8PSPmPrP‘W¬W³WØYóYúYõabb¾gØgÞg§nÁnÆn’o¬o®oq!q#q‚:‚O‚厜7œ>œFŸ`ŸeŸ¡·¡¼¡2£L£Q£¥,¥1¥@§[§_§G¨b¨f¨v©‘©•©úª««Ý«ø«ü« ­&­*­d¯¯ƒ¯®°ɰ̰®±ɱ̱*¶E¶I¶l·‡·‹·Ö·ñ·÷·½+½2½ß½ù½ÿ½¿¾Ù¾à¾2¿M¿U¿aÁ{Á€Á¿ÃÙÃàÃ=ÅWÅ]ŸÅÓÅÛÅÙÆóÆùÆ[ÇvÇ~ÇNÎhÎmΪÐÅÐÌÐDÒ^ÒcÒVÓqÓvÓ"Ô<ÔEÔßÔùÔÕ¬ÕÇÕÍÕU×o×u×½Øרߨ Ù'Ù0ÙÞÚøÚþÚ/ÛIÛOÛ?àZà\à$â>âFâã!ã)ãÚãôãýãœä¶ä¿ä æ%æ*æ$ç?çFçˆç£ç¨ç®èÉèÐèé-é2é¢é¼éÃé9ðTðWð%ô@ôDô‘ö¬ö°ö»ûÕûÝûçÿ ‚œ ®ÉÍ7QU!$;$B$±$Ì$Ð$Á%Û%ã%é)* *--G-K-ñ0 11{3•3™37¸7¼7å;<<à=û=ÿ=¹>Ô>Ö>h@ƒ@‡@‰B¤B¨BqCŒCCFF!F§FÁFÈFiG„G‹G H&H-H—H²H¹HÆIáIæIéPQQ{Z–ZžZv4v;vÒwíwôw5‚P‚W‚»ŠÖŠÝŠ ‹$‹*‹Kfn’7’>’k’…’‹’H”c”j”[–v–~–µšÏšÔš¸œÓœÕœûžŸŸýŸ  jƄƉÆ#Í<ÍEÍÂÎÛÎàÎüÎÏÏOÐhÐqÐ ×(×*×7ØRØTØÿÙÚÚÍñæñíñœòµòºòóó$ópõ‰õõf÷÷†÷{û–ûû!ý<ýDýJýeýlý±ýÊýÑý &.4OVލ®d}„!:!A!Œ&§&°&(™( (Û.õ.ú.Å1ß1æ1=,=3==BXB_BH˜HŸH¸JÓJÛJáJüJKËcæcícˆi¡i¨i1jJjRjÀ{Û{ß{«~Æ~Í~w•ô €€‚‚‚¢‚°ÊÑ 'R‘m‘r‘7œPœYœƒŸžŸ£Ÿ“¢¬¢±¢È¢ã¢è¢ÿ¢££ß«ú«¬±±#±Gºaºhº”º®º°ºͺçºïº»"»*»D»^»f»¦¾À¾ƾOÀiÀkÀ¼ÀÖÀÚÀ@ÈZÈcțȵȹÈ>ÊXÊaÊõÒÓÓÈØâØëØ(ÙBÙKÙÛ9ÛAÛúàááá©á±á®èÈèÎè¯êÉêÑêÅðÞðåðhø‚ø…ø«øÅøÈø@úZú]úŸúºú½ú8ûSûVû‡û¢û§û7üRüUüý,ý/ý.HM5OX/ I P   % €š 7 P V ý%&&O)i)r)x)’)›)ä6ÿ67¯9Ê9Ð9sCŽC‘C¹DÔDÛDmFˆFFúGHHXMrMyMñM NNôTUUU§U­U,YFYLYZ"Z(Z"[<[B[e[[…[·[Ò[×[s\\“\™\³\¹\Z^„^ˆ^`)`/`b b&b-hGhLh"k}>ˆ>8@c@n@q@œ@§@ª@Õ@à@æ@AAAI\I^ICK^K`KÛOP PÅTàTéT|U—U™UÁVÜVçV7\a\h\]2];]4aNaYa#c>cGc%d?dHd5eOeXe²hÌhÓh·iÒiÝi¬jÆjÍj\kvk}kÃlÝlälzo”o›o!p;pApöpqq:rTrYrss(su"u-uv6vAvÎvévòv y&y1yžz¹zÄzðz {{R‚m‚x‚þ‚ƒ#ƒƒ¸ƒÃ´†ΆÙ†Õ‰ð‰û‰wŠ’Š›Šc‹}‹†‹.IT¼×âÑ‘ë‘ó‘À–Ú–Ü–d™~™‚™Ûžöžÿž_ŸyŸ€Ÿ©"©(©.©H©N©d²~²…²©¶öʶá¸û¸¹È8È?ÈÊ+Ê2Ê[ÌuÌ|Ì¬ÎÆÎÍΜѷѾÑÓ.Ó4ÓÍÓèÓñÓÅÕàÕéÕÿØÙ#ÙæÜÝÝšß´ß»ßLàfàlàá§áªá¶áÐáÓáÚáôá÷á'äAäFäê3ê9êì1ì7ì‚ìœì¢ìÀìÚìàì•í¯íµíîî"î@îZî`î¾îØîÞîüîïïëïð ðñ9ñ@ñ²òÌòÑòƒóó¨ó ö&ö.öêö÷ ÷ø.ø7øWúqú|úC]b‡¡§÷J d f q ‹ “ ß ù  k…‹«ÅË.9‡¡¬ %0A\aÙôúÝ÷üì Å"ß"ä"Ü&ö&û&0,J,Q,C3^3a3“3®3³3I4d4l4ò4 55h5ƒ5ˆ5G7`7e7=-=3=Ü=õ=÷=?2?8?ÏFùFþFH·H¼H´IÎIÕIK8K?K¾NØNßNáPûPQR›R£RæTUU­WÇWÏWéXY Y[]u]{]-^G^M^Ea`aiaqc‹ccEd_dedf*f2fHfbfjf~f˜fžf´fÎfÔfÊgägêg¬hÆhÌh1jLjTjo!o'oSoloro!q;qAq8wRwYwÌwõwýwnxˆxŽxØz{ {y|“|œ|Ç}â}ë}—~À~É~ÃÞ瘳¼ ‚'‚0‚±ˆʈÒˆJ‰c‰l‰ýŠ‹ ‹%Œ>ŒFŒÛŒôŒýŒŽ¨Ž±Žc~‡–‘¯‘·‘1’L’U’Ü“÷“”|™–™ž™aš{š‚šV o w º¢Ô¢ߢ‰¦£¦«¦ɨã¨ê¨/«J«S«Œ°§°°°¹¸Ó¸Û¸Þ¸ù¸¹¹¹$¹'¹A¹G¹>ºYº\ºaºyºíºG»b»g»:ÉTÉ]ÉÍ+Í2Í‰Í£ÍªÍ Î&Î-ÎÏ Ï"ςќѧђҬҳÒÕÕ&ÕóÕ ÖÖå×ÿרšÙ´Ù¿Ù‚ڜڣڔۮ۷ۇܱܺÜß8ßAß0çJçSçÎçèçïçjé„éé¯ùÉùÔù=úWú\úCû]ûhûöÒíöB\ac } † Œ ¦ ¯ þ  ! ± Ë Ô F`cФ­iƒ†¦ÀÂ~˜¡×ñõ·À3MPÆá㚣ù¹ÓÖ®ÈËMgj”®·#›##Æ&à&é&R)l)n)Q*k*t*ë+,,Z0t0{0—1²1½1Ã2î2ñ234M4P4W4q4t4m:ˆ::;§;­;Œ@¦@¬@zB•BœBñB CCªCÅCÌCÓFíFòFQNjNoN·PÒPÙP°TËTÍT3XMXPXSXmXpXvX‘X”XîXY YC[a[p["]=]A]}_—_š_•b°bµbïb c cc)c,c2cMcPc›cµc¸cEo`ofoùpqq;qVq[qƒƒ"ƒõ†‡‡:ŠTŠ\Š0ŽJŽRޏÒÖ¶’Ñ’Õ’æ’““¥”À”ĔՔï”ñ”½žGžåžÿžŸá£û£¤ʬ߬gśŰÅäÐåÑX”ÿ•„X”ÿ•„X”ÿ•„X”ÿ•€X”ÿ•„Xÿ€XÿŒXÿŒTÿ•€%Tÿ•€ 4ÿ%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À%Tÿ•À•Œ”ÿ•€”•€Xÿ€Tÿ•€Tÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€tÿ•€tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Xÿ€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€ôÿ•€ôÿ•€XTÿ€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€ôÿ•€ôÿ•€Tÿ•€”ÿ•€”ÿ•€Ôÿ•€”ÿ•€”ÿ•€Tÿ•€ôÿ•€ôÿ•€ôÿ•€4ÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€ôÿ•€”ÿ•€tÿ•€Tÿ•€tÿ•€”ÿ•€Tÿ•€”ÿ•€ôÿ•€”ÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€Tÿ•€T•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€ôÿ•€”ÿ•€Tÿ•€tÿ•€ôÿ•€”ÿ•€Tÿ•€”ÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€tÿ•€Tÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€”ÿ•€Tÿ•€”ÿ•€4ÿ•€4ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€ôÿ•€”ÿ•€ôÿ•€”ÿ•€”ÿ•€ôÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Ôÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Ôÿ•€Ôÿ•€ôÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€ôÿ•€ôÿ•€Tÿ•€ôÿ•€ôÿ•€ôÿ•€ôÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€Ôÿ•€Tÿ•€Tÿ•€”ÿ•€ôÿ•€”ÿ•€”ÿ•€T•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€ôÿ•€ôÿ•€Tÿ•€ôÿ•€ôÿ•€ôÿ•€ôÿ•€ôÿ•€ôÿ•€T•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€ôÿ•€”ÿ•€4ÿ•€4ÿ•€ôÿ•€4ÿ•€4ÿ•€Ôÿ•€Ôÿ•€4ÿ•€Ôÿ•€4ÿ•€Tÿ•€Tÿ•€Xÿ€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€4ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€ôÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€ôÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€ôÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€ôÿ•€ôÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€tÿ•€Tÿ•€ôÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€Tÿ•€ôÿ•€”ÿ•€”ÿ•€ôÿ•€ôÿ•€”ÿ•€ôÿ•€ôÿ•€ôÿ•€ôÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€ôÿ•€”ÿ•€ôÿ•€”ÿ•€”ÿ•€Ôÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€ôÿ•€”ÿ•€”ÿ•€”ÿ•€tÿ•€”ÿ•€”ÿ•€ôÿ•€”ÿ•€ôÿ•€ôÿ•€ôÿ•€ôÿ•€Tÿ•€ôÿ•€ôÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€”ÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€”ÿ•€tÿ•€”ÿ•€Tÿ•€”ÿ•€”ÿ•€”ÿ•€Tÿ•€”ÿ•€tÿ•€”ÿ•€ôÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€ôÿ•€”ÿ•€”ÿ•€Tÿ•€Tÿ•€”ÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€”ÿ•€Tÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€ôÿ•€Tÿ•€tÿ•€Tÿ•€Tÿ•€Tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€tÿ•€ôÿ•€4ÿ•€Tÿ•€ôÿ•€ôÿ•€tÿ•€tÿ•€tÿ•€ôÿ•€ôÿ•€tÿ•€tÿ•€tÿ•€ôÿ•€Tÿ•€4ÿ•€”ÿ•€Ôÿ•€4ÿ•€Tÿ•€tÿ•€4ÿ•€4ÿ•€4ÿ•€Tÿ•€”ÿ•€4ÿ•€Tÿ•€”ÿ•€”ÿ•€4ÿ•€”ÿ•€Xÿ€Tÿ•€Tÿ•€Tÿ•€”ÿ•€”ÿ•€4ÿ•€”ÿ•€Tÿ•€Tÿ•€Tÿ•€Ôÿ•€Ôÿ•€Ôÿ•€Ôÿ•€Ôÿ•€Tÿ•€Tÿ•€Tÿ•€Tÿ•€XÿŒtÿ•€tÿ•€”ÿ•„”ÿ•„ Dj{ƒŠŽÃéú!”ÿ•€XÿŒ!”ÿ•€XÿŒð@ð  @ñÿÿÿ€€€÷ðH ðð0ð( ð ðð’ðð0ð( ð ððB ðS ð¿Ëÿ ?ðåÑÿÿs _Hlt46910490 _Ref133810247 _Hlt13986753 _Hlt182821983 _Hlt182821972 _Hlt182821980 _Hlt182821935 _Hlt182821922 _Ref13981953 _Ref13981961 _Toc247362773contents _Toc247362774 _Ref182744145 _Toc247362775 _Toc247362776 _Hlt247362399 _Hlt185238125 _Hlt185238126 _Hlt185238135 _Toc247362777 _Toc247362778 _Hlt185238325 _Toc247362779 _Hlt185256783 _Ref201664889 _Toc247362780 _Toc247362781 _Toc247362782 _Toc247362783 _Hlt47165200 _Toc247362784 _Hlt42508635 _Ref47171157 _Hlt90895144 _Toc247362785 _Hlt47171210 _Hlt47171141 _Ref153284855 _Ref184460226 _Ref203380577 _Toc247362786 _Toc247362787 _Hlt184483889 _Hlt184484230 _Hlt204511968 _Hlt204511969 _Ref184459487 _Hlt185753198 _Toc247362788 _Ref184459204 _Hlt184483930 _Hlt203381072 _Toc247362789 _Hlt207626871 _Ref184460000 _Hlt184483894 _Hlt185753259 _Toc247362790 _Hlt203475569 _Ref183001062 _Ref203475251 _Toc247362791 _Ref184460158 _Toc247362792 _Ref185238094 _Hlt185238130 _Hlt185262188 _Toc247362793 _Ref204926421 _Hlt204926469 _Toc247362794 _Ref185257870 _Toc247362795 _Hlt185247427 _Hlt185262081 _Ref185246210 _Hlt185262096 _Hlt201668363 _Hlt201668420 _Ref201668435 _Toc247362796 _Hlt185753882 _Toc247362797 _Hlt47776140 _Toc247362798 _Hlt90895146 _Toc247362799 _Toc247362800 _Ref42511462 _Hlt185238829 _Toc247362801 _Toc247362802 _Ref185238839 _Toc247362803 _Ref42588386 _Toc247362804 _Hlt46751931 _Ref42517152 _Toc247362805 _Ref42509834 _Toc247362806 _Ref42672298 _Toc247362807 _Toc247362808 _Hlt47156384 _Ref47156991 _Toc247362809 _Ref42590185 _Toc247362810 _Hlt42589455 _Ref42671142 _Toc247362811 _Ref153285510 _Toc247362812 _Toc247362813 _Ref153282321 _Toc247362814 _Ref247357288 _Toc247362815 _Ref153282518 _Toc247362816 _Ref42511232 _Toc247362817 _Hlt42675121 _Ref42675038 _Toc247362818 _Ref42673816 _Toc247362819 _Ref42673942 _Toc247362820 _Hlt207635186 _Toc247362821 _Ref204937964 _Toc247362822 _Ref204935761 _Toc247362823 _Ref204925451 _Hlt204938181 _Toc247362824 _Hlt204925429 _Ref153590626 _Toc247362825 _Hlt43728474 _Ref43008774 _Ref43728461 _Toc247362826 _Hlt47156799 _Hlt47168403 _Ref42675314 _Toc247362827 _Hlt202252094 _Hlt202252095 _Ref46752884 _Ref13982166 _Hlt54100713 _Toc247362828 _Ref47262189 _Hlt47869695 _Toc247362829 _Ref46823382 _Toc247362830 _Ref153288035 _Hlt153299871 _Toc247362831 _Ref46896711 _Hlt54077065 _Ref153291752 _Toc247362832 _Ref153732324 _Hlt153732341 _Hlt207636283 _Hlt207636514 _Toc247362833 _Hlt111001235 _Toc247362834 _Ref47775300 _Toc247362835 _Ref5701987 _Toc42530039 _Ref47451589 _Toc247362836 _Ref47451430 _Ref47451551 _Toc247362837 _Hlt45016694 _Ref203479102 _Toc247362838 _Ref204935780 _Toc247362839 _Toc247362840 _Ref206385571 _Toc247362841 _Ref206385661 _Toc247362842 _Ref204511965 _Toc247362843 _Toc247362844 _Toc247362845 _Toc247362846 _Hlt42675118 _Toc247362847 _Ref153285595 _Toc247362848 _Ref47170147 _Toc247362849 _Toc247362850 _Hlt204932610 _Hlt42941500 _Ref42675268 _Toc247362851 _Ref153557607 _Toc247362852 _Toc247362853 _Toc247362854 _Toc247362855 _Toc247362856 _Ref153612128 _Ref153612650 _Toc247362857 _Ref153612150 _Toc247362858 _Ref153603854 _Toc247362859 _Toc247362860 _Toc247362861 _Toc247362862 _Ref203481633 _Ref203481904 _Ref203482205 _Toc247362863 _Ref203481972 _Ref203482186 _Toc247362864 _Toc247362865 _Toc247362866 _Ref153336229 _Toc247362867 _Toc247362868 _Ref36885158 _Toc247362869 _Ref36888765 _Toc247362870 _Hlt185247433 _Ref185247389 _Toc247362871 _Hlt185247364 _Ref185262282 _Toc247362872 _Hlt185262185 _Hlt185262200 _Ref47775275 _Toc247362873 _Toc247362874 _Toc247362875 _Toc247362876 _Toc247362877 _Ref5612241 _Toc247362878 _Toc247362879 _Toc247362880 _Toc247362881 _Hlt46746680 _Ref6129297 _Ref46746740 _Toc247362882 _Ref5625335 _Ref6030571 _Hlt47174977 _Ref42589436 _Hlt78207127 _Toc247362883 _Hlt42507453 _Ref5625615 _Ref46747184 _Ref47173292 _Toc247362884 _Hlt6036362 _Ref6029921 _Ref5638461 _Hlt42589475 _Ref6058882 _Hlt153617393 _Toc247362885 _Ref6042344 _Toc247362886 _Ref6042851 _Ref182996673 _Ref182997657 _Toc247362887 _Hlt6043408 _Ref6043386 _Ref73442286 _Toc247362888 _Hlt6060108 _Ref6046402 _Ref6036405 _Ref182995906 _Ref182996929 _Toc247362889 _Hlt185262841 _Ref42506966 _Hlt47776143 _Ref62467260 _Toc247362890 _Ref6048674 _Ref182740974 _Toc247362891 _Ref6049927 _Toc247362892 _Toc247362893 _Toc247362894 _Ref153617348 _Toc247362895 _Ref153617304 _Toc247362896 _Toc247362897 _Hlt46910489 _Toc247362898 _Toc247362899 _Toc247362900 _Toc247362901 _Ref45025338 _Toc247362902 _Ref6060179 _Hlt47238459 _Ref231887961 _Toc247362903 _Ref182997381 _Toc247362904 _Toc247362905 _Ref231888133 _Toc247362906 _Ref46821357 _Ref103576458 _Toc247362907 _Ref103576461 _Toc247362908 _Toc247362909 _Toc247362910 _Toc247362911 initscript _Ref46895327 _Ref206062819 _Toc247362912 _Ref46895428 _Hlt47156255 _Ref46904847 _Ref55274563 _Toc247362913 _Ref46823145 _Ref169609101 _Toc247362914 _Hlt153689703 _Ref46895473 _Ref204932692 _Toc247362915 _Hlt47156780 _Ref46895489 _Toc247362916 _Ref182997376 _Toc247362917 _Hlt47165090 _Ref36890908 _Ref36886351 _Toc247362918 _Hlt36890891 _Ref47164079 _Ref47165113 _Hlt47775313 _Toc247362919 _Hlt90895315 _Hlt90895390 _Hlt90895528 _Hlt47164153 _Hlt47164182 _Hlt90895495 _Hlt206385761 _Hlt207626040 _Toc247362920 _Ref47163749 _Toc247362921 _Ref70164511 _Toc247362922 _Ref207622654 _Toc247362923 _Toc247362924 _Toc247362925 _Ref5608796 _Toc247362926 _Toc247362927 _Toc247362928 _Hlt47171970 _Ref5702037 _Toc247362929 _Hlt13986741 _Ref43008951 _Ref5703127 _Toc91387367 _Toc247362930 _Ref69047370 _Toc247362931 _Toc247362932 _Toc247362933 _Ref153699553 _Toc247362934 _Toc247362935 _Toc247362936 _Toc247362937 _Toc247362938 _Toc247362939 _Ref47168251 _Toc247362940 _Ref204922935 _Ref204935552 _Toc247362941 _Hlt204922458 _Ref231890048 _Toc247362942 _Toc247362943 _Ref153773639 _Toc247362944 _Toc247362945 _Toc247362946 _Toc247362947 _Toc247362948 _Toc247362949 _Hlt47170323 _Ref47167783 _Ref47169796 _Toc247362950 _Hlt72137546 _Hlt108511794 _Hlt47170149 _Toc247362951 _Hlt153773450 _Hlt247357576 _Hlt43727939 _Ref43727925 _Ref45368706 _Ref47168523 _Ref203474654 _Toc247362952 _Hlt78024559 _Hlt78024432 _Hlt43728343 _Hlt47169251 _Ref45367951 _Ref47169243 _Toc247362953 _Ref247356737 _Toc247362954 _Toc247362955 _Toc247362956 _Ref45368759 _Ref131305143 _Hlt131305183 _Toc247362957 _Ref169607904 _Toc247362958 _Hlt169609104 _Toc247362959 _Toc247362960 _Toc247362961 _Toc247362962 _Ref46908455 _Toc247362963 _Hlt36889516 _Ref6036607 _Toc42530040 _Ref5709751 _Toc247362964 _Ref6058085 _Ref166648484 _Toc247362965 _Hlt247361683 _Toc247362966 _Toc247362967 _Ref247356327 _Toc247362968 _Hlt47260869 _Ref247356244 _Toc247362969 _Ref54100850 _Toc247362970 _Toc247362971 _Toc247362972 _Toc247362973 _Hlt153777894 _Hlt231885580 _Ref55271118 _Toc247362974 _Hlt69827968 _Hlt207636277 _Hlt207636510 _Toc247362975 _Ref166651506 _Toc247362976 _Toc247362977 _Hlt71969232 _Ref111000885 _Toc247362978 _Ref207634778 _Toc247362979 _Ref45371286 _Toc247362980 _Ref45371414 _Toc247362981 _Ref153774103 _Toc247362982 _Ref185245663 _Ref185246112 _Toc247362983 _Hlt204934722 _Ref185246110 _Toc247362984 _Hlt185247455 _Hlt185246527 _Ref204936212 _Toc247362985 _Hlt153700673 _Ref153700641 _Toc247362986 _Toc247362987 _Toc247362988 _Ref71016088 _Toc247362989 _Hlt42943584 _Ref8187404 _Toc247362990 _Hlt153710530 _Ref153708057 _Toc247362991 _Hlt153710662 _Hlt153710686 _Ref153707807 _Toc247362992 _Ref153710706 _Toc247362993 _Ref6029952 _Ref6029971 _Ref17723797 _Toc42530042 _Ref47172480 _Hlt47173434 _Toc247362994 _Ref6030192 _Hlt175633690 _Hlt183626927 _Hlt185258856 _Hlt207618552 _Toc42530043 _Ref47173451 _Hlt69048936 _Toc247362995 _Hlt204935243 _Ref247355579 _Toc247362996 _Hlt153776691 _Hlt153776839 _Hlt153777014 _Hlt153777228 _Ref153776689 _Ref153776695 _Ref153776799 _Toc247362997 _Ref153776692 _Toc247362998 _Hlt207613371 _Ref153776693 _Toc247362999 _Hlt207625463 _Ref207618734 _Toc247363000 _Hlt207613369 _Hlt207613370 _Ref153776694 _Ref153776724 _Toc247363001 _Hlt69048829 _Toc247363002 _Ref47260717 _Toc247363003 _Toc247363004 _Toc247363005 _Hlt42941703 _Ref42941679 _Toc247363006 _Toc247363007 _Toc247363008 _Toc247363009 _Toc247363010 _Ref6055322 _Toc247363011 _Ref45001933 _Toc247363012 _Ref54091553 _Toc247363013 _Toc247363014 _Toc247363015 _Toc247363016 _Toc247363017 _Toc247363018 _Ref54091188 _Toc247363019 _Ref54091192 _Toc247363020 _Ref54091119 _Hlt97961444 _Toc247363021 _Ref97961473 _Toc247363022 _Toc247363023 _Ref231889747 _Toc247363024 _Toc247363025 _Toc247363026 _Ref247361819 _Toc247363027 _Toc247363028 _Ref70164454 _Toc247363029 _Hlt5702867 _Ref5702859 _Toc247363030 _Ref47164085 _Ref47165137 _Hlt90895270 _Toc247363031 _Hlt47164148 _Hlt90895655 _Hlt90895638 _Ref43729255 _Hlt47268694 _Toc247363032 _Hlt47172042 _Ref47172128 _Toc247363033 _Hlt43728338 _Ref47779943 _Hlt47779954 _Ref47781653 _Toc247363034 _Hlt47781638 _Ref47173394 _Hlt47785233 _Toc247363035 _Ref78024414 _Hlt79212320 _Toc247363036 _Hlt78024546 _Hlt78024525 _Ref43726555 _Toc247363037 _Toc247363038 _Ref58909011 _Ref203474873 _Toc247363039 _Ref58909800 _Toc247363040 _Toc247363041 _Toc247363042 _Toc247363043 _Toc247363044 _Hlt42943817 _Ref5609191 _Toc247363045 _Toc247363046 _Ref13986080 _Ref46754713 _Ref46754709 _Ref42943854 _Toc247363047 _Hlt5608811 _Hlt13982107 _Ref36896793 _Ref13981914 _Ref5614672 _Ref166649220 _Toc247363048 _Hlt13986561 _Ref43728215 _Ref47171876 _Ref166649222 _Toc247363049 _Ref68495073 _Toc247363050 _Hlt43728174 _Ref13986562 _Ref43727921 _Ref47171842 _Ref47171963 _Ref47174498 _Toc247363051 _Hlt47172168 _Ref5624476 _Ref36896289 _Ref43727928 _Ref47168540 _Toc247363052 _Ref153704184 _Toc247363053 _Hlt71969222 _Ref46754571 _Toc247363054 _Hlt47168312 _Hlt108511282 _Hlt47170329 _Ref42944330 _Toc247363055 _Hlt13986432 _Ref6117078 _Ref6117306 _Ref6117429 _Hlt43728875 _Ref42943895 _Toc247363056 _Ref6030156 _Hlt47777532 _Hlt47171817 _Ref43728908 _Ref47171780 _Toc247363057 _Hlt47779252 _Ref8187433 _Hlt47174587 _Toc247363058 _Toc247363059 _Ref47777798 _Ref47781675 _Hlt153731886 _Ref153731855 _Toc247363060 _Ref182743880 _Toc247363061 _Toc247363062 _Toc247363063 _Ref69052620 _Toc247363064 _Toc247363065 _Toc247363066 _Toc247363067 _Ref47784069 _Ref47783567 _Toc247363068 _Ref47784397 _Ref47845006 _Toc247363069 _Ref47784098 _Toc247363070 _Ref47784099 _Ref66078569 _Toc247363071 _Toc247363072 _Ref46750086 _Toc247363073 _Hlt46750578 _Ref153764303 _Toc247363074 _Hlt13986666 _Ref47864390 _Ref47865711 _Ref47872399 _Ref153765172 _Toc247363075 _Hlt47867866 _Ref47871522 _Ref47871470 _Ref47867609 _Ref47867554 _Ref130893908 _Hlt130894065 _Ref63053303 _Ref47870052 _Ref47871769 _Ref47869783 _Ref63052833 _Ref47867141 _Toc247363076 _Ref47867143 _Ref47867954 _Hlt69048878 _Toc247363077 _Ref47867144 _Ref47867926 _Toc247363078 _Hlt6030208 _Ref207637531 _Toc247363079 _Ref153732596 _Toc247363080 _Hlt47170196 _Ref6039859 _Toc247363081 _Hlt90895644 _Hlt133745674 _Ref133745663 _Ref135023442 _Toc247363082 _Hlt153286317 _Ref153703095 _Toc247363083 _Ref133830177 _Toc247363084 _Toc247363085 _Toc247363086 _Ref133831852 _Toc247363087 _Ref153681044 _Toc247363088 _Toc247363089 _Toc247363090 _Ref135023800 _Toc247363091 _Toc247363092 _Ref133832449 _Toc247363093 _Ref133810323 _Toc247363094 _Toc247363095 _Toc247363096 _Toc247363097 _Toc247363098 _Ref207626203 _Toc247363099 _Hlt207630554 _Toc247363100 _Ref247361078 _Toc247363101 _Toc247363102 _Hlt153620653 _Ref90895148 _Ref90895285 _Hlt90895609 _Toc247363103 _Hlt90895304 _Hlt90895385 _Hlt153620745 _Ref90895208 _Toc247363104 _Toc247363105 _Toc247363106 _Toc247363107 _Ref232415540 _Toc247363108 _Ref232415549 _Toc247363109 _Toc247363110 _Toc247363111 _Toc247363112 _Toc247363113 _Toc247363114 _Ref153889197 _Toc247363115 _Toc247363116 _Toc247363117 _Toc247363118 _Toc247363119 _Toc247363120 _Toc247363121 _Ref90894479 _Toc247363122 _Ref90894483 _Toc247363123 _Toc247363124 _Toc247363125 _Toc247363126 _Ref185261956 _Hlt185262195 _Hlt185753893 _Hlt204922464 _Toc247363127 _Toc247363128 _Ref47451048 _Hlt47451059 _Toc247363129 _Hlt153795123 _Hlt153795208 _Hlt153795243 _Toc247363130 _Toc247363131 _Toc247363132 _Ref78023979Ü  ¾` ` ` ##‹‹‹ŒŽŽŽïŽ"V“~–™c®c®q»¼êÃçÈ×ÒAÔÙØÙØÙØ‚ÛÍÜ=Ý=Ý=Ý=ÝëÞ à à¬á¬á9ã9ã9ãèèèèèRéRéRéRé°ð¿ñ¿ñ¿ñšõšõ†ø†ø†ø†ø¤û¤û¤ûÂÂëëç ç ç ç ††ÁÊ!Z#;%B(B(d*;+;+;+Ø,&.&.²/²/Ñ5Ñ5Ñ5ï;ï;Ð=Ð=ýC=E=E=E×I×IK©N©NPSPSQ\Ö]Ö]I_I_æ_æ_2c2ceeeŒmŒmðoðoqeqQQ^‰^‰@­@­@­d¯O¼O¼¥Ç¥Ç¥Ç¥ÇËžÙ5é5é9ð9ðfðfðfðfð666GGGGÚ!Ú!Ú!Ú!Ú!3'µ,..;.@.R.R.222”2µ3µ3í5í5f8:!:<<>>®A¬DœE§FÿFÖHÖHVJVJîNÃQÕQÕQÕQÉhÉhjìnYq‚r;tXtXtív wÁxÁx[}TDƒë„ë„ë„ë„k‹k‹k‹§’¯“„”„”Ö–Ù—ï—Øšòš"œ>œ>œëëëýŸýŸ†¢†¢M¨¤«1¯ˆ²E´¬´?¶9¸\½(¿(¿=¿=¿`¿{Í{ÍÍÍÍ~Ð~ÐÐÐиииÐï§ð§ð¾ðÖóéóÂøØøØøØøDDXXvvv‡‡‡V!ž9ž9®9®9ÊDßDßDR%R‹wwz¢|¢|ππQ„,†@†)ˆF‰à‹þþ2š2šFšFš„ „ R¥¸§¸§ß©ù©ù©y¯y¯@±I´;·<·i»„»„»è»ʾʾè¾è¾ÍÏìÏìÏdÒ$Þ?Þ?Þnâæ8æîîcðcðcðcðÅðÉ÷É÷É÷É÷øø2øhøãøôøýý«þjj††Ž ª ¨ ”jv)o!o!o!ˆ!ˆ!=$=$E&Þ'Ê)Ê);4&7ë:¸<ß>A;AÐBêBêBsCiEiE!H¤J¤J[NjQöUþWDZe[5]5]L]M]Z^-h0jækækllllll«qrhsw€w€w€w€ׇׇɧŒsއއއŽÕÕK’¾’x–J˜åš¾¾¥¦ ¦¦¦¨*¨*¨œ«± ³èµèµ4¶è¹è¹A»A»†¿¢Â$ŀǀǡǡÇXä ð_ò õ÷÷ÜùûßüßüÊÿÊÿÁ ç ::¿¿¿´ÎÎÿZZ'>>ˆ!v%M'p'ñ)ñ)*å.//Ï1Ï1ê1ê1·4·4787878<8K8K8K8~;~;~;~;~;ƒ;;;;dKz_z_¬b¬b¬b¬bÄbÄbÄbÄbŠpŠpEvdvdv÷€‰ƒ‰ƒŠŠŠäŽ •6•Q–õ™á›á›á›± O¢¾§p©r¬¬I®I®¬²¬²ì¶y¹"¼ÄÀ¢ÃÆÆXÈXÈSÊSÊSÊ—Ì—ÌîμмÐSÓMÕS×S×3ÚçÛçۑݑݩ݌àŒàŒà«à?áGá¶áZäZäZä”ë”ë”ë¾î²ô²ô²ô²ô¦õúøúøúø   kò74TT¹%¹%Ÿ'þ(W*p,«/«/Ç/2 2#2C2£5£5&7q;q;q;q;ˆ;ˆ;`<>>+>+>@@CMCMYMYMYMYMYM$\$\$\@\@\@\¥^¥^!b9b9bhbEd®f×fgËjËjËjËjãjãjãjYsYsusususus»tŽžŽž§ž 8£8£8£U£U£º¶º¶Š»¼þÀþÀøÂ ÅÜÅøÆÇÇ`É`ɄɹÏÔÏÓ0Ó0ÓêÝßßßß¹òÑøÑøˆ™™™™™F(7MÇùCn€" #Ú#ý#$¯(¯(¯(Ê(†*†*¢*,6,6,3.3.À1À1ß1P2Ã2L3k3k3347777H8H8ð:d<Ú=Ú=9?9?AÑB0C0CðC.GNGyJyJ=KjP0UHUBWBWîX5Ya]a]¾_¸aÌaÌaÌaÌaÍa›cÇcécécvfÙhÏj¡l¡lbnbnpBsÔt¾vuxÝyÝy8}`~o€ë`„7‡M‡÷‹ ŒŒŽ¿‘›“g•g•g•g•g•øœhhh(ž6ž:žx£›¬¡¬iÅæÑ@@@@@ @@@@@@ "!#$%6&'()*@+@,@-@/.@041@2@53@97@8@:;@<=>?@CA@B@DFE@GHIJ@K@OL@M@N@PQR@STUVWX\Y@Z[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ@„…†‡ˆŠ‰@‹Œ@Ž‘’“”•–—@˜@𝙛œžŸ ¢¡@£¥¤¦§«¨@©@ª@¬­®°±Ë²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊÌÍÎÏ@ÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîúïðñò@óôõ@ö÷ø@ù@ûüýþÿ     C@ !"#$%&D'()*@,+-.1/023456789:;<=>?@AEBFGHIJKLYMNOPQRTSUVWZX[\]^_`a@bcdefghijkolmpqnrxsvtuwy@z@{|}~€‚ƒ„…†‡ˆ‰Š‹Ž¾Œ‘’“”•–—˜™§š›œž@Ÿ ¡¢£¤¥¦¨©ª¬­®«¯°±²@³@´µ¶·¸¹º»¼½¿ÀÁÂÃÄÅÇÈÆÉÊËÌ@ÍÎÏÐÑÒÓÕÔÖרÙÚÛ@ÜÝÞßàáâãäåæçè@é@êëìí@î@ïðñòóôõö÷øùúûüýþÿ@@@@     @@@ !("@#@$@%@&)'*+@,-.@/@0@1@2345678@9:;@<=>@?@@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^`_abcdefghijklmnrostpuqwvyxz{|}~€‚ƒ…„†ˆ‡‰Š‹ŒŽ‘’“”•–—˜ž™š›œŸ ¡¢¦­¯£¤¥©ª§¨«¬®°±²³´µ¶»·¸¹º¼½¾ÀÁ¿ÂÃÄÅÆÈÉÊÇËÌÏÍÎÐÑÒÓÕÔÖ×ÙÚØ@ÛÜÝÞßàáâãäåèæçéêëìíîïðñòóôõö÷øùúûüýþÿ     @ !"#$%&'()*+,-./0123456789@:;<=>@AB?C@DE@FGHIJKLMNOPQRSTUVWXYZ[\]^_`abfc@d@e@ghjikl@m@n@opqrÝ!!¿l l l +,‹‹!‹Œ=Ž=Ž=Ž!1t“Š–4™®–®y»&¼ÄÉáÒAÔÙØÙÙ‚ÛÍÜTÝrÝrÝß*à*àÌáÌá9ãVãVãèèèèèRéRéRétété»ðæñçñçñºõºõ†ø†ø˜ø˜ø¤û¼û¼ûÓÓ  ç ç ç žžžàÜ!|#P%B(e(l*;+Z+ã,0.0.0.»/Ä/Ñ5à5à5ø;ø;á=á='D=ELELEðIðI¯K´N´N\S\SW\å]å]X_X_ó_ó_;c;ce.e.ežmžmpp$quqmmu‰u‰@­[­[­„¯b¼b¼¥Ç´Ç´Ç´ÇƒË¶ÙFéFéXðXðfðmðmð6NN44GJXXÚ!Ú!Ú!""8'Ñ,:.:.:.K.Ž.Ž.I2I2I2º2Ú3Ú3668V:V:G<G<D>D>ØAÕD½EÉFGIIsJsJsJOÃQÕQûQûQìhìh?j:oq±r³t³t³tHwHwçxçx™}°zƒ…………’‹’‹’‹Ë’ó“¥”¥”—˜››"œoœoœë!ž!ž  ²¢²¢²¢r¨׫S¯¸²Ì´_¶w¸‘½(¿_¿_¿_¿_¿{Í͵͵͵͵Í~ззззиÐð§ðíðíðíð ô ôùùùùDwwwv³³³³V!ž9Ç9Ç9Ç9 E EYRYRYR¸wÊzÔ|Ô|  s„,†X†Kˆi‰ÿ‹2šjšjšjšjšjšË Ë w¥¨¨FªFªÁ¯Á¯p±‹´F·w·ç»ç»ç»ʾA¿A¿A¿A¿A¿%Ð%Ð%ÐåÓfÞfÞfÞnâXæXæ4î4îcðtðtðæðÉ÷øøøøø†øãøäøôøõø0ý0ýÿ››··Ï Ï Ü kººÜsso!µ!µ!e$e$e$q&Z(D*D* 4ž7#;ß<?vACCC’C¥E¥EsHëJëJ›NÂQ4VXXeZ†[V]W]l]l]‰^MhPjækæklblblblclclrr†sw€ž€ž€ž€ž€ˆˆà‰ÕŒ‡Ž¦Ž¦Ž¦Žûûo’ï’£–˜0›UžUž¥¦¦E¦E¦?¨?¨?¨¢«¼±O³ ¶ ¶i¶ººl»l»¯¿ÈÂNŀǀÇßÇßÇXäÀðòßõ\÷\÷ úû ý ýáá3 3 pp´þþ:>„„'zzÅ!¡%°'°'ñ)I*I*å.ˆ/ˆ/Ï1Ï1(2(255D8K8ƒ8ƒ8ƒ8ƒ8ƒ8~;~;~;~;†;;è;è;è;QN£_£_¬b¬b¬b¬bïbïbïbïbÁpÁpEv™v™v÷€CCăăBŠBŠBŠä1Ži•i•‚–šá›œœ¼ z¢ϧž©À¬À¬ˆ®ˆ®ë²ë².·Ź”¼ÁçÃPÆPÆÈÈSʕʕÊÍÌÍÌÏøÐøÐ„Ó|զצ×ZÚÜÜ‘ÝØÝŒà?áFáFáFáFáÔádâZärärä”ë·ë·ëßî²ôäôäôäô¦õúø8ù8ù 3 3 Œò++X‰‰‰Ù%Ù%Û')¢*,«/ó/-2-2O2m2Ñ5Ñ5Ñ5f7q;¶;¶;`<>`>`>%@´@´@´@CMCM„M„M„M„M„M„M„M$\p\p\p\p\Ô^Ô^Ô^!bhbqbqbfd®fagagËjãj k k k k kYsusttttÆtŽžÝžÝžî 8£ä£ú£ú£ú£á¶á¶¸»½*Á*Á/Ã;ÅÆÇQǵɵɵɵÉþÏþÏØÓØÓØÓÞááÈòûøûøˆÀÀÀÑÑdˆŒ¯6ØâÜ"Ù#ü#ˆ$ˆ$¯(÷(÷(÷(%+%+%+,E,c,p.p.À1O2P2P2ò2Þ3Þ3Þ3Q4U7U7W8W8;x<é=é=v?v?AàB?C?CD™G³G“J“JPK„PGUdU¡W¡W Y‚Y]]õ_¸aÌaÍabbb›cÇc.d.dœf iôjÖlÖl“n“nRp|s*uævxzz‘}ž~²ÿ€‚‹„m‡m‡*Œ*Œ¹Žñ‘à“g•g•g•••h{{)ž7ž;žŒ£ ¬Ȭ›ÅæÑбŠßŠ‹›ÅæÐëÐöÐdÑiÑuÑvÑvÑ|ÑѧѨѩÑáÑãÑæÑÿÿ Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas ZellerNE:\Projects\SySync\Docs\Manuals\Sync Server Manual\SySync_config_reference.doc Lukas Zeller‚C:\Dokumente und Einstellungen\luz\Anwendungsdaten\Microsoft\Word\AutoWiederherstellen-Speicherung von SySync_config_reference.asd®|ÿÿÿÔè,kRÿÿÿÿÿÿÿÿ}ÿÿÿª°˜Qÿÿÿÿÿÿÿÿ~ÿÿÿ Ú¢¾PÿÿÿÿÿÿÿÿÿÿÿZüNOÿÿÿÿÿÿÿÿ€ÿÿÿìÄf­1ÿÿÿÿÿÿÿÿÿÿÿ¨­F 0ÿÿÿÿÿÿÿÿ‚ÿÿÿA>/ÿÿÿÿÿÿÿÿƒÿÿÿˆš<¨.ÿÿÿÿÿÿÿÿˆÿÿÿŽÂ–?Nÿÿÿÿÿÿÿÿ‰ÿÿÿÔi´äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„{êÿ€~ÆP˜>kÿÿÿÿÿÿÿÿÿõ>ôJQlWÿÿÿÿÿÿÿÿÿBûÿÿÿÿÿÿÿÿÿ D¢‰Ì\ÿÿÿÿÿÿÿÿÿÏCÀÿÿÿÿÿÿÿÿÿ³ÙÿÿÿÿÿÿÿÿÿyÔÿÿÿÿÿÿÿÿÿX@Æî\ÿÿÿÿÿÿÿÿÿ¦­V†&ÿÿÿÿÿÿÿÿÿ8¶ cÆÿ7B rHä¯ÿÿÿÿÿÿÿÿÿÆ'` †нÿÿÿÿÿÿÿÿÿó6í ÿÿÿÿÿÿÿÿÿžLþ ÿÿÿÿÿÿÿÿÿ5DG ÿÿÿÿÿÿÿÿÿÎP© ÿÿÿÿÿÿÿÿÿør@ ÿÿÿÿÿÿÿÿÿ>¸ ÿÿÿÿÿÿÿÿÿ &>ÿÿÿÿÿÿÿÿÿKÿÿÿÿÿÿÿÿÿ-z2âšÿÿÿÿÿÿÿÿÿ=8èŠNàÿÿÿÿÿÿÿÿÿ›`âš•ÿÿÿÿÿÿÿÿÿ£Vv–Sæ£ÿÿÿÿÿÿÿÿÿ8 ܪ°ÿÿÿÿÿÿÿÿÿTedÿ zRæ¿ÿÿÿÿÿÿÿÿÿØ]‚vü>íÿÿÿÿÿÿÿÿÿ¿ÿÿÿÿÿÿÿÿÿ[plˆf¤FaÌ)Æî\ÿÿÿÿÿÿÿÿÿØH„ÿÿÿÿÿÿÿÿÿG=¢ KŠÿÿÿÿÿÿÿÿÿ®\âÿÿÿÿÿÿÿÿÿ`tmÿÿÿÿÿÿÿÿÿyQ¼ÿÿÿÿÿÿÿÿÿ[3ÿPEÿÿÿÿÿÿÿÿÿ¥u¡ÿÿÿÿÿÿÿÿÿ•ÿÿÿÿÿÿÿÿÿ—Vʸܫÿÿÿÿÿÿÿÿÿë|!ÿÿÿÿÿÿÿÿÿTK3!2ž‘ÿÿÿÿÿÿÿÿÿMî!ÿÿÿÿÿÿÿÿÿt7#n âÿð2+$ˆf¤FÿÿÿÿÿÿÿÿÿŠoÀ%ÿÿÿÿÿÿÿÿÿ¹Wz&,ZlRÿÿÿÿÿÿÿÿÿzU„&ÿ)&'ˆ&^nÿÿÿÿÿÿÿÿ±]]'ÿÿÿÿÿÿÿÿÿ½sô'ÿÿÿÿÿÿÿÿÿA(5(ÿÿÿÿÿÿÿÿÿ}1þ)2à<ÿÿÿÿÿÿÿÿÿt#ž*ÿÿÿÿÿÿÿÿÿ@+ÿÿÿÿÿÿÿÿÿ=³,ÿÿÿÿÿÿÿÿÿšB- ,ŒÿÿÿÿÿÿÿÿÿÎ-ÿÿÿÿÿÿÿÿÿEr.Ê¡ ºÿÿÿÿÿÿÿÿÿ%./ÿÿÿÿÿÿÿÿÿ¾c|/ÿÿÿÿÿÿÿÿÿùkž/Æî\ÿÿÿÿÿÿÿÿÿT î/ÿÿÿÿÿÿÿÿÿünû/ÿÿÿÿÿÿÿÿÿõAD1ÿÖ1ÿÿÿÿÿÿÿÿÿOo<2ÿÿÿÿÿÿÿÿÿe"3ˆf¤Fÿÿÿÿÿÿÿÿÿ"£4ä2þÿÿÿÿÿÿÿÿÿ¿#6"O²ÿÿÿÿÿÿÿÿÿˆ[6¤ú9ÿ¿$•6ÿÿÿÿÿÿÿÿÿàÁ7ÿÿÿÿÿÿÿÿÿK¿9ÿÔ$z:ÿÿÿÿÿÿÿÿÿrn*;ÿÿÿÿÿÿÿÿÿþs/=ÿÿÿÿÿÿÿÿÿŸu¥>Þ{Šÿÿÿÿÿÿÿÿÿ¿-B|:ø‘ÿÿÿÿÿÿÿÿÿGÿÿÿÿÿÿÿÿÿ§jæHõ¢ÿÿÿÿÿÿÿÿÿ–z-IÞ{Šÿÿÿÿÿÿÿÿÿg1K@âT÷ÿÿÿÿÿÿÿÿÿ¹ HMÿÿÿÿÿÿÿÿÿ¾DäN$tÄÿÿÿÿÿÿÿÿÿL;KOˆf¤Fÿÿÿÿÿÿÿÿÿ¹A˜Oÿÿÿÿÿÿÿÿÿ|lTPÿÿÿÿÿÿÿÿÿ·)\PÿÿÿÿÿÿÿÿÿÛ/eRÿÿÿÿÿÿÿÿÿ Sÿÿÿÿÿÿÿÿÿ2×S–ýžÿÿÿÿÿÿÿÿÿz:%Uÿÿÿÿÿÿÿÿÿû=MUˆ1ôÿÿÿÿÿÿÿÿÿ°ÎUÿÿÿÿÿÿÿÿÿ‹%ÖVÿÿÿÿÿÿÿÿÿ+HÞVâæ®…ÿÿÿÿÿÿÿÿÿ¨OWÿÿÿÿÿÿÿÿÿ?D~Wÿÿÿÿÿÿÿÿÿ:¶Wÿÿÿÿÿÿÿÿÿ¢VaXÿÿÿÿÿÿÿÿÿYÿÿÿÿÿÿÿÿÿ.Y*¶&ÿÿÿÿÿÿÿÿÿt~ÎYÿm )Z‰þ$ÿÿÿÿÿÿÿÿÿv<ÀZÿÿÿÿÿÿÿÿÿ *'[P²Z‰sÿÿÿÿÿÿÿÿWU[tIŽÿÿÿÿÿÿÿÿÿv[ÿÿÿÿÿÿÿÿÿQv«[`âš•ÿÿÿÿÿÿÿÿÿóK ]ø¦#ÿÿÿÿÿÿÿÿÿbi]ècFFÿÿÿÿÿÿÿÿÿïu1]ÿÿÿÿÿÿÿÿÿ%K^Û,pÿÿÿÿÿÿÿÿÿàVs`ÿÿÿÿÿÿÿÿÿ{u!a®°Lÿÿÿÿÿÿÿÿÿÿ~%aÿÿÿÿÿÿÿÿÿ¯2saÿLKQdÿÿÿÿÿÿÿÿÿp8¹eÿÿÿÿÿÿÿÿÿIfÿÿÿÿÿÿÿÿÿ¸]§fÿÿÿÿÿÿÿÿÿS7½fÿÿÿÿÿÿÿÿÿ´!hÿÿÿÿÿÿÿÿÿ£!wjÔNÿÿÿÿÿÿÿÿÿÏ|ájÿÿÿÿÿÿÿÿÿü.–k £ˆËÿÿÿÿÿÿÿÿÿüuèk;œ0ÿÿÿÿÿÿÿÿÿQúlÿÿÿÿÿÿÿÿÿZD nÿÿÿÿÿÿÿÿÿ«M®nÿÿÿÿÿÿÿÿÿâI6oÿÿÿÿÿÿÿÿÿéZoÿÿÿÿÿÿÿÿÿåCçojÛ„ÿy5ëpÿÿÿÿÿÿÿÿÿzFÈq¾ˆ£bÿÿÿÿÿÿÿÿÜdtä2þÿÈ @tv¼½ÿÿÿÿÿÿÿÿÿ_µv”)|âqÿÿÿÿÿÿÿÿɾw@J\ÿiD1xâëšÿÿÿÿÿÿÿÿÿÄõxÿÿÿÿÿÿÿÿÿØw&yÿÿÿÿÿÿÿÿÿ¨D·yÿÿÿÿÿÿÿÿÿøKãyÿÿÿÿÿÿÿÿÿ×XäzÒŠBÔ %ùzÿÿÿÿÿÿÿÿÿú4~ÿÿÿÿÿÿÿÿÿô/~ÿÿÿÿÿÿÿÿÿÅn~ÿÿÿÿÿÿÿÿÿõ/¡~@J\ÿ‘ÿÿÿÿÿÿÿÿÿÁK ÿÿÿÿÿÿÿÿÿ²q{:1ÿÿÿÿÿÿÿÿÿÐ:Êvˆ^vÿ„Ô„˜þÆÔ^„Ô`„˜þ.„¹„˜þƹ^„¹`„˜þ.„ž„˜þÆž^„ž`„˜þ.„ƒ„˜þƃ^„ƒ`„˜þ. „Ô„˜þÆÔ^„Ô`„˜þOJQJo(·ð „¹„˜þƹ^„¹`„˜þOJQJo(·ð „ž„˜þÆž^„ž`„˜þOJQJo(·ð „ƒ„˜þƃ^„ƒ`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þ.h„ „˜þÆ ^„ `„˜þ.’h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.’h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.’h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ðh „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJQJo(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJQJo(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJQJo(§ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJQJo(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJQJo(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJQJo(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJQJo(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJQJo(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJQJo(§ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „„˜þÆ^„`„˜þOJQJo(- „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „-„˜þÆ-^„-`„˜þOJQJo(·ð„ý„˜þÆý^„ý`„˜þ.‚„Í „LÿÆÍ ^„Í `„Lÿ.€„ „˜þÆ ^„ `„˜þ.€„m„˜þÆm^„m`„˜þ.‚„=„LÿÆ=^„=`„Lÿ.€„ „˜þÆ ^„ `„˜þ.€„Ý„˜þÆÝ^„Ý`„˜þ.‚„­„LÿÆ­^„­`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJQJo(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJQJo(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJQJo(§ð„Є˜þÆÐ^„Ð`„˜þ.„ „˜þÆ ^„ `„˜þ.‚„p„LÿÆp^„p`„Lÿ.€„@ „˜þÆ@ ^„@ `„˜þ.€„„˜þÆ^„`„˜þ.‚„à„LÿÆà^„à`„Lÿ.€„°„˜þư^„°`„˜þ.€„€„˜þÆ€^„€`„˜þ.‚„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ.h„Є˜þÆÐ^„Ð`„˜þ.h„ „˜þÆ ^„ `„˜þ.h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo( ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJQJo(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJQJo(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJQJo(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJQJo(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJQJo(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJQJo(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh„Є˜þÆÐ^„Ð`„˜þ.h„ „˜þÆ ^„ `„˜þ.h„p„LÿÆp^„p`„Lÿ.h„@ „˜þÆ@ ^„@ `„˜þ.h„„˜þÆ^„`„˜þ.h„à„LÿÆà^„à`„Lÿ.h„°„˜þư^„°`„˜þ.h„€„˜þÆ€^„€`„˜þ.h„P„LÿÆP^„P`„Lÿ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo( ð „h„˜þÆh^„h`„˜þOJQJo(·ð „Є˜þÆÐ^„Ð`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJQJo(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJQJo(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJQJo(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ. „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „„˜þÆ^„`„˜þOJQJo(-h„h„˜þÆh^„h`„˜þ.h„8„˜þÆ8^„8`„˜þ.’h„„LÿÆ^„`„Lÿ.h„Ø „˜þÆØ ^„Ø `„˜þ.h„¨ „˜þƨ ^„¨ `„˜þ.’h„x„LÿÆx^„x`„Lÿ.h„H„˜þÆH^„H`„˜þ.h„„˜þÆ^„`„˜þ.’h„è„LÿÆè^„è`„Lÿ.h „h„˜þÆh^„h`„˜þOJQJo(·ðh „8„˜þÆ8^„8`„˜þOJQJo(oh „„˜þÆ^„`„˜þOJQJo(§ðh „Ø „˜þÆØ ^„Ø `„˜þOJQJo(·ðh „¨ „˜þƨ ^„¨ `„˜þOJQJo(oh „x„˜þÆx^„x`„˜þOJQJo(§ðh „H„˜þÆH^„H`„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „脘þÆè^„è`„˜þOJQJo(§ð„¹„˜þƹ^„¹`„˜þB*CJOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„h„˜þÆh^„h`„˜þ........  .... „€„€ûÆ€^„€`„€û ..... „„ðúÆØ ^„`„ðú ...... „ „`úÆ ^„ `„`ú....... „0„ÐùÆ0^„0`„Ðù........ „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð„¹„˜þƹ^„¹`„˜þB*CJOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ð „h„˜þÆh^„h`„˜þOJQJo(·ðh „Є˜þÆÐ^„Ð`„˜þOJQJo(·ðh „ „˜þÆ ^„ `„˜þOJQJo(oh „p„˜þÆp^„p`„˜þOJQJo(§ðh „@ „˜þÆ@ ^„@ `„˜þOJQJo(·ðh „„˜þÆ^„`„˜þOJQJo(oh „à„˜þÆà^„à`„˜þOJQJo(§ðh „°„˜þư^„°`„˜þOJQJo(·ðh „€„˜þÆ€^„€`„˜þOJQJo(oh „P„˜þÆP^„P`„˜þOJQJo(§ð „h„˜þÆh^„h`„˜þOJQJo(·ð½‰ÿÿÿƒÿÿÿ‚ÿÿÿÿÿÿ€ÿÿÿˆÿÿÿÿÿÿ~ÿÿÿ}ÿÿÿ|ÿÿÿ¾DäNbi]‰ÿÿÿ‰ÿÿÿƒÿÿÿ‚ÿÿÿÿÿÿ€ÿÿÿˆÿÿÿÿÿÿ~ÿÿÿ}ÿÿÿ|ÿÿÿ?D~WYA(5(ú4~³Ùrn*;‹%ÖVÏCÀ5DG ¨OWØH„G‘ó6í |lTPyQ¼´!hÔ$z:yÔ SÏ|ájâI6oŠoÀ%·)\PŠoÀ%¿$•6þs/=àÁ7¥u¡S7½fåCço¯2sa¿%./½sô'Øw&yLKQd«M®nz:%U=³,Äõx:¶Wt#ž*¹A˜O &>Ån~PEZD nô/~¨D·yOo<2Bû%ùzünû/°ÎUéZoÖ1K>¸ Ifør@ y5ëpÛ/eR[3p8¹e~%a±]]'žLþ ÎP© ¢VaXïu1]Mî!×Xäzõ>ô DiD1xWU[7B Er.g1K—VÁK Qúl¸]§fT î/@+`tmð2+$L;KO-z`tme"3û=MU`tm`tm zóK ])&'v<ÀZÎ-®\âv[¾c|/¿-B=8£Vv}1þ)Æ'` šB-{u!aùkž/2×S+HÞVÌ)X@Qv«[›Ø]‚zFÈq£!wjTK3!ü.–k¿#6%K^•m )Z¦­t7#8¶ Ð:ʈ[6TedTed[plõ/¡~ɾwzU„&"£4K¿9„{êt~ÎYÜdt[pl.YÈ @t–z-IŸu¥>€~ƧjæH8 üuèkG=¢²q{_µv¹Wz& *'[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÿÿ®f‹ fµ‚h6I_I`IqIˆI¡I¢I§I­I®I¯I°I±I²I³I´IµI·I¹I¿IÀIÅIÊIËIÎIÐIÖI×IÚIßIàIâIåIëIìIñIôIõIøIûIJJJJ J J J J JJJJJJJJJ$J%J(J*J/J0J3J6J7J9Jhttp://www.openmobilealliance.org/release_program/ds_v12.html0Uý SDK_manual.pdf0UÁSDK_manual.pdf^Z|http://www.pcre.org/t:SySync_script_call_flow.pdft_SySync_script_call_flow.pdf.s http://www.pcre.org/license.txt%3http://www.sqlite.org/D\http://www.zlib.net/LT 1http://sourceforge.net/projects/syncml-ctoolkit/ &http://sourceforge.net/projects/expathttp://www.synthesis.ch/.(http://www.syncml.org/http://www.synthesis.ch/ http://www.synthesis.ch/http://www.synthesis.ch/m#*Logo-Quadrat, alleinstehen pv£SyncML6q§sysync_diagram_big.jpgtðodebuglog_folding.png  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿþÿÿÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙþÿÿÿÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › þÿÿÿ ž Ÿ   ¡ ¢ £ þÿÿÿ¥ ¦ § ¨ © ª « þÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿÃ Ä Ñ Ö Ç È É Ê Ë Ì Í Î Ï Ð Ò ß Ó Ô Õ × þÿÿÿØ Ù Ú Û Ü Ý Þ à þÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF€|9JÓqÊÆ @/Data ÿÿÿÿÿÿÿÿÿÿÿÿ8ª1TableÿÿÿÿÿÿÿÿÚЃWordDocumentÿÿÿÿj SummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿœ DocumentSummaryInformation8ÿÿÿÿÿÿÿÿ¤ Macrosàõ7JÓqÊ€|9JÓqÊVBAÿÿÿÿÿÿÿÿ àõ7JÓqÊ€|9JÓqÊThisDocumentÿÿÿÿ ÿÿÿÿÔNewMacros ÿÿÿÿÇ __SRP_2 ÿÿÿÿH__SRP_3ÿÿÿÿÿÿÿÿÿÿÿÿU þÿÿÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGþÿÿÿIJKLMNOPQRSTþÿÿÿVWþÿÿÿYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€ÖäêÔÝ1p®»·ÿÿ£ˆ¶ÿÿÿÿÿÿÿÿÿÿÿÿ}ÛiÔ‘nžIØŽ—¼SœØáÛ§ˆ¼Dªà÷ÍA%Ð; Á_êÇLš¦ÿwðSÿÿÿÿÿÿÿÿÿÿÿÿxÿÿMEÿÿÿÿÿÿÿÿÿÿßÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(S"ÿÿÿÿSÿÿÿÿS"ÿÿÿÿ<ÿÿÿÿÿÿ(1Normal.ThisDocumentÿÿÿÿ`€þÿÿÿÿÿÿÿ(ÿÿÿÿÿÿÿÿÿÿ%ÿÿÿÿHÿÿÿÿ@ÿÿÿÿ8ÿÿÿÿ0ÿÿÿÿHƒþÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ %‚ ÿÿÿÿþÿÿÿ°ÿÿþÿÿÿÿÿÿÿÿÿÿÿ %ÿÿÿÿ€ÿÿÿÿ¸ÿÿÿÿ°ÿÿÿÿÈÿÿÿÿÀÿÿÿÿØÿÿÿÿÐÿÿÿÿèÿÿÿÿàÿÿÿÿøÿÿÿÿðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(ÿÿÿÿ ÿÿÿÿ8ÿÿÿÿ0ÿÿÿÿHÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿPû¨ LßþÊÿÿÿÿÿÿÿÿxÿÿÿÿ™°Attribute VB_Name = "ThisDocument" ŒBasŒ1Normal.VGlobal!ªSpaclFalse ¢CreatablPre declaIdžTru BExposeTemplateDeriv$Custom iz„Cƒ1ðŒÔØÿÿÿÿ2 j p® ?ÿÿ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÿÿMEÿÿÿÿÿÿÿÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP6 ÿÿÿÿLÿÿÿÿÿÿÿÿÿÿÿÿLÿÿÿÿLÿÿÿÿ”ÿÿÿÿ<ÿÿÿÿÿÿÿÿÿÿ( €`ÿÿÿÿ@èøþkÿÿÿÿÿÿÿÿÿÿ„"Project.NewMacros.addTagIndexEntry`„ÿÿÿÿxÿÿÿÿÿ 4ÿÿÿÿ`ÿÿÿÿÿÿÿÿØøþkÿÿÿÿÿÿÿÿÿÿ„`„ÿÿÿÿxÿÿÿÿÿ$ÿÿÿÿÿÿÿÿ€ƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨ØÿÿÿÿÀÿÿÿÿXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÿÿÿÿÿÿÿÿ &0˜tÿÿÿÿÿ@þÿptÿÿÿ ÿÿ ÿÿ@þÿÿÿÿÿpÿÿÿÿÿ ÿÿ@þÿð`ÿÿÿ ÿÿ ÿÿ@þÿPÿÿÿ ÿÿ ÿÿ@þÿ(@ÿÿÿ ÿÿ ÿÿ@þÿ@0ÿÿÿ ÿÿ ÿÿÿÿØ@þÿÿÿÿÿ ÿÿÿ ÿÿ À@þÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿ@þÿÿÿÿÿ ÿÿÿÿÿ h@þÿˆÿÿÿ ÿÿ À@þÿ ÿÿÿ ÿÿ ÿÿÿÿ@þÿ¸ÿÿÿ ÿÿ À@þÿÐüþÿÿ ÿÿ À@þÿÿÿÿÿøþÿÿ ÿÿ hÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸ èÿÿÿÿÐÿÿÿÿpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆÿÿÿÿÿÿÿÿ &0ÿÿ ÿÿ b@þÿtÿÿÿ ÿÿ am@þÿÿÿÿÿpÿÿÿÿÿ yS@þÿ`ÿÿÿ ÿÿ 5.@þÿPÿÿÿ ÿÿ om@þÿ8@ÿÿÿ ÿÿ oj@þÿP0ÿÿÿ ÿÿ c\ÿÿÿÿ@þÿÿÿÿÿ ÿÿÿ ÿÿ @þÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿ@þÿÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿP@þÿ¨ÿÿÿ ÿÿ n@þÿÈÿÿÿ ÿÿ tÿÿÿÿX@þÿèÿÿÿ ÿÿ ÿÿÿÿ¨@þÿüþÿÿ ÿÿ g103ÿÿÿÿÈ@þÿÿÿÿÿøþÿÿ ÿÿ ÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈû¨ L$*\Rffff*064ca0a8fb*\R1*#103*\R1*#5c*\R1*#1e*\R1*#129*\R1*#c1*\R1*#17bßþÊ"€ $7 N{@€ ÿÿÿÿ"˜€  $¨7¸N{Ø(€ ÿÿÿÿ€ ÿÿÿÿÿÿÿÿ8–]òh !d' &Ñ$¬Ñ( B@"¦ !.Ñ. 0Ñl¶XE "  ¶" \f T Ñd·Ñ2 !*B@,¾³oÿÿh–€]òÀ !d'ic &Ñ$¬Ñ( B@"e$¦ !.Ñ. 0Ñl¶XE "  ¶" \f F Ñd·Ñ2 !*B@,oÿÿÐÿÿÿÿÈÿÿÿÿS±Attribute VB_Name = "NewMacros" Sub addTagIndexEntry()  à :.’Pro cDataInvoke_Func¸4ject.-È. @u Dim n As S¡¢ng nBSel@ion.0TextMoveLeft Unit:=wdCharacter@, Coun2 3Fields.Add Range:=‡', T$yp wdEmpty€ ?:= _'"XE ""(" +€Z+‚\f T", PreserveFormatting:=False End €° ´½“t€m‹¶}ׇ1ÿCåCFæC rU€€€€~| ‰©Ñ 1a¡8Ü$pÿtÿ$ <tÿ >pÿ1xÿtÿ7 ÿ'ÿ(0ÿþÁPÿtÿ$ <tÿ ütÿ6Pÿ0ÿÿ{ÿtÿ$ <tÿ äøþüfÿlxÿ*#pÿ*F0ÿþÁPÿÿÿÿÿQÿ[üþÿÿ$ <ÿ ˆÿ L/pÿ) tÿÿüþÿøþ6Pÿ0ÿÿ„Ü(xÿ4 pÿtÿÿÿÿüþøþPÿ0ÿÿ8Ü$pÿtÿ$ <tÿ >pÿ1xÿtÿ7 ÿ'ÿ(0ÿþÁPÿtÿ$ <tÿ ütÿ6Pÿ0ÿÿ{ÿtÿ$ <tÿ äøþüfÿlxÿ*#pÿ*F0ÿþÁPÿÿÿÿÿQÿ[üþÿÿ$ <ÿ ˆÿ L/pÿ) tÿÿüþÿøþ6Pÿ0ÿÿÿ„Ü(xÿ4 pÿtÿÿÿÿüþøþPÿ0ÿÿfrU€€€ ÿÿÿÿÿÿÿÿ$`ýÿÿÿÿÿÿÿa$©`ýÿÿÿÿÿÿÿÿÿÿÿn_VBA_PROJECTÿÿÿÿÿÿÿÿÿÿÿÿXE dirÿÿÿÿÿÿÿÿÿÿÿÿŠ__SRP_0 ÿÿÿÿ—5__SRP_1ÿÿÿÿÿÿÿÿÿÿÿÿ°pÌamÿ äú*\G{000204EF-0000-0000-C000-000000000046}#4.0#9#C:\PROGRA~1\GEMEIN~1\MICROS~1\VBA\VBA6\VBE6.DLL#Visual Basic For Applications*\G{00020905-0000-0000-C000-000000000046}#8.1#0#C:\Programme\Microsoft Office\Office\MSWORD9.OLB#Microsoft Word 9.0 Object Library¸*\G{00020430-0000-0000-C000-000000000046}#2.0#0#C:\WINNT\System32\stdole2.tlb#OLE AutomationÞ*\G{0D452EE1-E08F-101A-852E-02608C4D0BB4}#2.0#0#C:\WINDOWS\system32\FM20.DLL#Microsoft Forms 2.0 Object Library*\G{AB8C0D4F-F982-46CC-BAE5-82D79A0E6A49}#2.0#0#C:\DOKUME~1\luz\LOKALE~1\Temp\VBE\MSForms.exd#Microsoft Forms 2.0 Object Libraryá.E à….`ŒM ´*\CNormal*\CNormalû¨ L*\G{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}#2.1#0#D:\Programme\Microsoft Office\Office\MSO97.DLL#Microsoft Office 8.0 Object Library  ÿÿÿÿÿÿû¨ Lÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp®ThisDocument034ca0a8fbÿÿThisDocumentÿÿ»·7ÿÿNewMacros064ca0a8fbÿÿNewMacrosÿÿ ?p ÿÿÿÿÿÿ8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚ƒ„…†‡ˆ‰þÿÿÿ‹ŒŽ‘’“”•–þÿÿÿ˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯þÿÿÿ±þÿÿÿ³þÿÿÿµ¶·¸¹ºþÿÿÿ¼þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê\©ö‹F±þ r ÿÿÿÿ ¥k!qB¦ÆZ³PfYkÿÿÿÿÿÿÿÿH€ÿ ( Wordµk VBA÷âWin16Á~Win32Mac³²VBA6­# Project-®stdole“`MSFormsCˆ ÿNormalߨˆ ÿOfficeu ThisDocument<ž €ÿ_EvaluateÙ NewMacros®j¬(addTagIndexEntry¾Âne SelectionZ®MoveLeftv“UnitŸ wdCharacterÉCount0vFields7©Add÷rRangeÚ  wdFieldEmpty›çPreserveFormatting=¬(addFunctionIndexEntry× „ÿDocumentjÓ €ÿDoPrefsFormtÊÿÿlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$@€³€0* pH‚däProjectQ(@=­ l €û¨ L J< rstdole>stdoleP f%\*\G{00020°430-C 0046}#2.0#0#C:\WINNT\System32\c2.tlb#OLE Autom`ation^mMSForms> MSFErms3€DD452EE1-E08F-101A-8-02608C@4D0BB4 DD OWS\sEFM20.DLL#MicrosoftŠ ‚: €] Ob­ Libraryè/;D1€„€tˆ€ˆ€00}#0‚€#€k0ž €€AAB8C0D4F-F982-46CC-BAE5-82D79A0E6A49ˆ6DOKUME~1\luz\LOKALTemp \VBE\DS.exdà:€ €á.E à….``ŒM ´¤C‰N©@falC‰N„eaÀ‰( À À*\NC AÃOPfficDšO@—fPicBšŒÀ‚ÂG{2DF8D04C-5BFA!xB-BD@A00TAA@™4À2EAD:\ÀÃgramm,e\t\„MSO97Œ|ƒ 8..0Ì|!€‚Ü"Âp®BÇThisDocume ntGÀ T"hÀ0sD@Dc¢u€ªenÀÐÎ Š2Ú ` H¢j1¢u7@€",Qâ»·""+¢‚-NewMaY(GÀNÀ)w(Ma+r€sË2Ô/p b- ?!b#b“K*mÿÿÿÿ *\CNormalrU€€€€~~~~~~~~~i G§iÇ–e,G½ž<èÓgAÕ äÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ¹ˆa 9ÿÿÿÿÿÿÿÿÑÿÿá¹Á¡‘ <ÇÃN¶ëE°æ~!{ Ïy ThisDocument NewMacrosProjectïÀF /C:\PROGRA~1\GEMEIN~1\MICROS~1\VBA\VBA6\VBE6.DLLVBA ÿÿÿÿ A©0 ÀF 0C:\Programme\Microsoft Office\Office\MSWORD9.OLBWord ÿÿÿÿ9©@0ÀFC:\WINNT\System32\stdole2.tlbstdole ÿÿÿÿA‰Pá.E à….`ŒM ´C:\WINDOWS\system32\FM20.DLLMSForms  1y`O Œ«‚ùÌFºå‚ךjI -C:\DOKUME~1\luz\LOKALE~1\Temp\VBE\MSForms.exd é ypLÐø-ú[½åªDÞR .D:\Programme\Microsoft Office\Office\MSO97.DLLOffice Ñÿÿÿÿùa€addTagIndexEntryaddFunctionIndexEntry ð ÀF¹ ÀFYÿÿÿÿu ÀF XE " " \f F0 ÀFY¨ " \f TfrU€€€ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  "Project.NewMacros.addTagIndexEntryjThisDocumentThisDocumentNewMacrosNewMacrosID="{048068B2-39DC-4C93-B43B-1D7131A08ED0}" Document=ThisDocument/&H00000000 Module=NewMacros Name="Project" HelpContextID="0" VersionCompatible32="393222000" CMG="A1A31F6523652365236523" DPB="B1B30F7010701070" GC="C1C37F808080807F" [Host ExtendPROJECTwmÿÿÿÿÿÿÿÿÿÿÿÿ²GPROJECTÿÿÿÿ´CompObjÿÿÿÿÿÿÿÿ»jObjectPoolÿÿÿÿÿÿÿÿÿÿÿÿ€|9JÓqÊ€|9JÓqÊer Info] &H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000 [Workspace] ThisDocument=0, 0, 0, 0, C NewMacros=0, 0, 0, 0, C þÿ ÿÿÿÿ ÀFMicrosoft Word-Dokument MSWordDocWord.Document.8ô9²qsyncevolution-1.5/src/synthesis/doc/SySync_config_reference.pdf0000644000373300037200000664013612424517753026601 0ustar00nightlyallusers00000000000000%PDF-1.3 %âãÏÓ 1738 0 obj << /Linearized 1 /O 1740 /H [ 8198 5727 ] /L 1785950 /E 780754 /N 206 /T 1751070 >> endobj xref 1738 382 0000000016 00000 n 0000007996 00000 n 0000013925 00000 n 0000014087 00000 n 0000014158 00000 n 0000014278 00000 n 0000014436 00000 n 0000014616 00000 n 0000014749 00000 n 0000014901 00000 n 0000015030 00000 n 0000015160 00000 n 0000015383 00000 n 0000015629 00000 n 0000015808 00000 n 0000016003 00000 n 0000016196 00000 n 0000016349 00000 n 0000016528 00000 n 0000016704 00000 n 0000016875 00000 n 0000017030 00000 n 0000017188 00000 n 0000017354 00000 n 0000017519 00000 n 0000017706 00000 n 0000017869 00000 n 0000018035 00000 n 0000018201 00000 n 0000018384 00000 n 0000018568 00000 n 0000018746 00000 n 0000018921 00000 n 0000019100 00000 n 0000019263 00000 n 0000019437 00000 n 0000019601 00000 n 0000019857 00000 n 0000020046 00000 n 0000020211 00000 n 0000020381 00000 n 0000020589 00000 n 0000020772 00000 n 0000020954 00000 n 0000021155 00000 n 0000021277 00000 n 0000021507 00000 n 0000021636 00000 n 0000021772 00000 n 0000021905 00000 n 0000022085 00000 n 0000022230 00000 n 0000022371 00000 n 0000022512 00000 n 0000022637 00000 n 0000022762 00000 n 0000022908 00000 n 0000023054 00000 n 0000023320 00000 n 0000023544 00000 n 0000023721 00000 n 0000023946 00000 n 0000024128 00000 n 0000024279 00000 n 0000024450 00000 n 0000024621 00000 n 0000024822 00000 n 0000024993 00000 n 0000025188 00000 n 0000025370 00000 n 0000025538 00000 n 0000025822 00000 n 0000025989 00000 n 0000026207 00000 n 0000026375 00000 n 0000026550 00000 n 0000026741 00000 n 0000026905 00000 n 0000027080 00000 n 0000027261 00000 n 0000027431 00000 n 0000027621 00000 n 0000027793 00000 n 0000027958 00000 n 0000028173 00000 n 0000028343 00000 n 0000028523 00000 n 0000028759 00000 n 0000028932 00000 n 0000029106 00000 n 0000029275 00000 n 0000029483 00000 n 0000029662 00000 n 0000029834 00000 n 0000030006 00000 n 0000030197 00000 n 0000030367 00000 n 0000030538 00000 n 0000030741 00000 n 0000030892 00000 n 0000031078 00000 n 0000031236 00000 n 0000031415 00000 n 0000031574 00000 n 0000031735 00000 n 0000031880 00000 n 0000032027 00000 n 0000032215 00000 n 0000032391 00000 n 0000032594 00000 n 0000032764 00000 n 0000032966 00000 n 0000033182 00000 n 0000033303 00000 n 0000033460 00000 n 0000033635 00000 n 0000033800 00000 n 0000033984 00000 n 0000034157 00000 n 0000034332 00000 n 0000034518 00000 n 0000034690 00000 n 0000034870 00000 n 0000035062 00000 n 0000035241 00000 n 0000035426 00000 n 0000035621 00000 n 0000035813 00000 n 0000036028 00000 n 0000036232 00000 n 0000036424 00000 n 0000036613 00000 n 0000036802 00000 n 0000036977 00000 n 0000037149 00000 n 0000037292 00000 n 0000037461 00000 n 0000037670 00000 n 0000037831 00000 n 0000037973 00000 n 0000038148 00000 n 0000038341 00000 n 0000038493 00000 n 0000038702 00000 n 0000038922 00000 n 0000039098 00000 n 0000039249 00000 n 0000039419 00000 n 0000039598 00000 n 0000039779 00000 n 0000039948 00000 n 0000040115 00000 n 0000040303 00000 n 0000040525 00000 n 0000040709 00000 n 0000040899 00000 n 0000041068 00000 n 0000041255 00000 n 0000041441 00000 n 0000041609 00000 n 0000041783 00000 n 0000041962 00000 n 0000042142 00000 n 0000042346 00000 n 0000042540 00000 n 0000042724 00000 n 0000042892 00000 n 0000043065 00000 n 0000043269 00000 n 0000043458 00000 n 0000043646 00000 n 0000043814 00000 n 0000043978 00000 n 0000044145 00000 n 0000044314 00000 n 0000044492 00000 n 0000044654 00000 n 0000044827 00000 n 0000044998 00000 n 0000045145 00000 n 0000045313 00000 n 0000045535 00000 n 0000045742 00000 n 0000045937 00000 n 0000046106 00000 n 0000046281 00000 n 0000046445 00000 n 0000046602 00000 n 0000046774 00000 n 0000046929 00000 n 0000047087 00000 n 0000047244 00000 n 0000047402 00000 n 0000047560 00000 n 0000047747 00000 n 0000047962 00000 n 0000048151 00000 n 0000048347 00000 n 0000048518 00000 n 0000048703 00000 n 0000048872 00000 n 0000049056 00000 n 0000049242 00000 n 0000049406 00000 n 0000049587 00000 n 0000049791 00000 n 0000049980 00000 n 0000050197 00000 n 0000050410 00000 n 0000050579 00000 n 0000050744 00000 n 0000050914 00000 n 0000051089 00000 n 0000051278 00000 n 0000051441 00000 n 0000051604 00000 n 0000051782 00000 n 0000051959 00000 n 0000052121 00000 n 0000052295 00000 n 0000052469 00000 n 0000052681 00000 n 0000052827 00000 n 0000052953 00000 n 0000053158 00000 n 0000053376 00000 n 0000053556 00000 n 0000053700 00000 n 0000053857 00000 n 0000054021 00000 n 0000054203 00000 n 0000054391 00000 n 0000054590 00000 n 0000054775 00000 n 0000054943 00000 n 0000055116 00000 n 0000055315 00000 n 0000055521 00000 n 0000055698 00000 n 0000055860 00000 n 0000056075 00000 n 0000056243 00000 n 0000056377 00000 n 0000056533 00000 n 0000056693 00000 n 0000056852 00000 n 0000057001 00000 n 0000057160 00000 n 0000057325 00000 n 0000057468 00000 n 0000057629 00000 n 0000057799 00000 n 0000057976 00000 n 0000058143 00000 n 0000058293 00000 n 0000058462 00000 n 0000058618 00000 n 0000058785 00000 n 0000058990 00000 n 0000059136 00000 n 0000059298 00000 n 0000059485 00000 n 0000059642 00000 n 0000059799 00000 n 0000059972 00000 n 0000060131 00000 n 0000060307 00000 n 0000060482 00000 n 0000060628 00000 n 0000060791 00000 n 0000060965 00000 n 0000061127 00000 n 0000061295 00000 n 0000061493 00000 n 0000061702 00000 n 0000061856 00000 n 0000062023 00000 n 0000062181 00000 n 0000062374 00000 n 0000062535 00000 n 0000062699 00000 n 0000062859 00000 n 0000063038 00000 n 0000063231 00000 n 0000063418 00000 n 0000063581 00000 n 0000063767 00000 n 0000063953 00000 n 0000064125 00000 n 0000064288 00000 n 0000064465 00000 n 0000064630 00000 n 0000064790 00000 n 0000064934 00000 n 0000065101 00000 n 0000065243 00000 n 0000065394 00000 n 0000065540 00000 n 0000065707 00000 n 0000065876 00000 n 0000066054 00000 n 0000066220 00000 n 0000066378 00000 n 0000066540 00000 n 0000066715 00000 n 0000066902 00000 n 0000067035 00000 n 0000067172 00000 n 0000067353 00000 n 0000067495 00000 n 0000067642 00000 n 0000067786 00000 n 0000067972 00000 n 0000068102 00000 n 0000068228 00000 n 0000068430 00000 n 0000068607 00000 n 0000068732 00000 n 0000068856 00000 n 0000069000 00000 n 0000069152 00000 n 0000069300 00000 n 0000069453 00000 n 0000069627 00000 n 0000069758 00000 n 0000069885 00000 n 0000070022 00000 n 0000070146 00000 n 0000070268 00000 n 0000070408 00000 n 0000070544 00000 n 0000070721 00000 n 0000070861 00000 n 0000070987 00000 n 0000071121 00000 n 0000071261 00000 n 0000071428 00000 n 0000071571 00000 n 0000071706 00000 n 0000071842 00000 n 0000071998 00000 n 0000072131 00000 n 0000072291 00000 n 0000072512 00000 n 0000072645 00000 n 0000072778 00000 n 0000072920 00000 n 0000073096 00000 n 0000073243 00000 n 0000073384 00000 n 0000073549 00000 n 0000073708 00000 n 0000073851 00000 n 0000074005 00000 n 0000074184 00000 n 0000074307 00000 n 0000074463 00000 n 0000074598 00000 n 0000074746 00000 n 0000074878 00000 n 0000075005 00000 n 0000075207 00000 n 0000075331 00000 n 0000075493 00000 n 0000075630 00000 n 0000075876 00000 n 0000075919 00000 n 0000077005 00000 n 0000077216 00000 n 0000077271 00000 n 0000077819 00000 n 0000078035 00000 n 0000078624 00000 n 0000078765 00000 n 0000113674 00000 n 0000114533 00000 n 0000116977 00000 n 0000130942 00000 n 0000168316 00000 n 0000173390 00000 n 0000008198 00000 n 0000013901 00000 n trailer << /Size 2120 /Info 1703 0 R /Root 1739 0 R /Prev 1751058 /ID[] >> startxref 0 %%EOF 1739 0 obj << /Type /Catalog /Pages 1715 0 R /Outlines 1741 0 R /OpenAction [ 1740 0 R /XYZ null 846 1 ] /PageMode /UseOutlines /PageLabels << /Nums [ 0 << /S /D >> ] >> /JT 1737 0 R >> endobj 2118 0 obj << /S 7267 /O 8383 /Filter /FlateDecode /Length 2119 0 R >> stream H‰lT}TS÷~obH" ! Ö¦³³N4á£-2Êšu«gǹʬgÂÇ` [á"B¤AºYE†«,àÁ3µ›J@8\C ‡lMÀœã$&7'd] ‰b‰“ªûáìì»ýÎ}?Ÿç}Ÿ¨|:D¢G#ij/"Ð_0 ªŸ`]cû„qÇZز; °dßΦ"*änfShˆø)@£0¨0õî§ÑiÈCÅå²Ù4P‰€Ë¥Ñ¨˜Êô$1FQ© Ç¥PA¥*P³© ¸±t­qÆ `¨ø\Æ„‘'…G£DÐ~ ]*›Ž5¨ø|Þ+ôʇª®œÍ åIõÍl&‡‚™PX,=k©Tü¤X *Ú•ÂàEQ…›øl ¥q·áQ èØSÀWïtqΣ²›vSF*’÷RÞkÙ¢¤4Û¾¿ó§pïcBQ¬¾ÈÁáóû,üÑF­‡`î‚ëM Ïá¦Áã,óY[àd ç»ÐÇø'´ñÁ^²qïÃ#Ï_Úb2°_Úâ^ÄÞ QV0^è¹|øGEäm˜¶a!øÈ´îôFîƒKü(|Èå¿õgB, êsçPŸŒP…hC ËaÞG/ç7pÖÄnw÷r¸¯€>‡Å‚›!6wC¿<Äz* ¹Eàȡ烺…¹ô*ÖI™Ø?„á”HøMÌ7à“.Ƨp¢‚®ƒm]¼bî„-œ<(ç¯_ÄR¹LüÙFŸ‡¿W¬‡[6æEð¥løÖê‰Î„Ë)Q×à¯\æh-d‚Ó)Ñ›àkQôK0Šé»Í²…1'»"ë¡®—Q ¿µ1"Ñ<×-ƒ+× á”ç¶BcPáa}ŸÚЈ.r×ÿ Ω¢ÒÁlc•csŽó¶¨6øÜÆ|$ž¨ ,šX›!Øý"㉽Zã H²EAÉgöù úß`¤nÂYc7ì/ŒH‡÷M‘ØÕÅ‘ÁºÖÙ ÁÉ>õ]8ƧO|;lT+Ý;÷|y^˜èÞ{Þ­´¸ù‚¨6Ì\»ž:§é •ÿkϽâ›ÓNž«®wïê¹táÞ­ÀJj°îüÎ4µòùñìàÏÝ/÷i>žA/¥`%_ó±÷;(o_g·Ò½iÆ83±)£Û¿ã÷÷Œ‹ñ“ÃÚñµ4aGªzç®bÞ·ôqéè‹xä rE™u|ÌÂ.ÔZ–FçËI¿Øb×ç*2Quoõ¤d9>QJÌ–š‚÷Qó¨hÞ•}¤t5û°y®Š04ÆùÀ轟ÕjOUÄB•·šÝ90w%cÈ8:ßn𨓵•¾¶ ×6ÂÒÜC=:‚šoê$3Ûd…_Î:~£×ò镟y¬V{´Ú K×dIsÖš?”´¢ØÐ8"IW$Îd»º È}]ê\Õ%k‰p©y!”áôü¬\Ÿ'çYÍN_‡N‚–¼Çœcz—Ö.–Ž“GG\Û%MO¢¡”¦,øcN©¹¤Çîz[˜¥´¸Û›:¯ûÛÐdŽÍ¢¥´{ÒÛa•â“ÖkÉ2ËL WÜI¦vLx—Ë Ý^­_H×lÉ'ËŒ\!>SœYIHƒ5dÞøìa³»ßáÚ·.¦%Ì•xo¤*'HütÝzí|Ť$ oju†Û 2í~"rîÐOWÅ'ùÜè eºo¤vèó—kHYµTçB$h‹¼5„¯UNOù*­åñ‰2ÁCüFQ?1´>(lû†Þa—à5kÞòÌä\w­ræeêÿª—Ì.C_…ãÑúÙ?¢‡Û->Nm¾îSŠ‚S–€bÙ1²re(ª<,ׄÂÉÚ 5ÖAíòÏÁZ壢« %éñâÖ>²T')ÌjuÎkRoxʳ£I›Ô-9XcX“§^Œ”‹#ÈÃsÁ5]P'¾iÕBâVsÀÞ0á–+׆ûM«t@4‰Ó=œÆæ–í®¥Õ k™õj)™Èk¬K=Ñ,âSé©Ç Rèð„1gðòáèüSg§½Œðô… GÆÑÝ(Dò4ö…ñWyÂb^8¦Ó\ÐOóUÿÿ  6Ž’eº™¥ZÿŠ0ɼ7üõSÁ"ꞌ)¨úïBöÇ—I'ý„¸ü5ÃL¾¿Ê ä&¡ƒV|֔⭱æá§È§ü &GÃe„38ø²©)éGUÑHûV4Ó²aŸü׋hŸ5¨Õxñ©´¥*«4GJÇÃ¥ÈÇÑô«¨©ô ÿ…ðPˆY ”í”ÅÇ8²²QU[g§KQ$Z¶f <’å±f Ø©n\ÐÅŽXq§Ýí´]‚èÃk“횈™i 8v0`$´ öü÷‘°Û sçrÿÿžÿœï|ç;ç6˜&ÕÚl€wއâ‘7öXТXe.TAßÔ"°nÏ ¹EÜ©>ÔN¤ D¼ôâ²1OñÈÜjæ•òÚ»gç’m¸<Ó”PPø<_ *ÅÏ‚oôOB 6&Ì’58'±Õög+lvÉ>Ïeȧ ±O]ÝìBcî|…]â©z0]œ©|ašTò’AùÆ6!•O Ö͸*¡r!§XK~wЧ.4Éà!W?vJÉ–a&¼>þ*ªT'êäˆr¡`õSíZóÒù•Ú{NYEO_¨ zp*¹"Q£ˆmÒMÏq ¹ žýXINrú'›êŒÃ¸qðü$ÎqÃBH\Z%›»¬”u°Êô"PÚ\½DçXXn‘œ_iíÏé¤dP´qR¾ä–ôÚ“´=[‹£ªž-Í;™ü¢IŸÇ#ˆô[³rQ¤$;b“§Ä !ãÎØbÉ–5(õÀÌÜéCíФ _PP)zÞ€%ãJš‚‡2B.TÐ…›k»î¿‚ ºÿ£¼hòÜÓèˆ)<,¸[¹—k[GÒÀÕŽ%³¬#J­)*ãÆÍ Îd[­TBt1ÿs|Rcx~{¥Õ˜×yб«{aÏê‘û³*“øN¬¹u¼kë4ö›ù|zã–äÓÃ.Ç‚'îâð4¤`‘C5 ·gõ94…¡©Î÷z¶LX;]¸«Þé"w]r¡@Jt0‡\+쇜 Ë9³å¾–= Ÿ0[‹¨ïhÙÕÄY’ïq•k³Q›º×Ú{Ñé">—¶Ç–C.Ô‡M3íši}Á[ÝëÄJ¦=‰£¾iÒ>knù©çȇƒ‹:ÃRÎôÇ÷ˆ~j²Étg€l â» °W›až]­Þ]=8]|úÍcÃÎFƒ4©9ûk-õYràTÞ›žW@§V˜±c¸ÇaEªÕö&èð]€sÖ·#ø ;ø@€—¾š/ÍO‡\¯>@KôåR¸(ëÇ]y3dàß²DÉ€ÅSgOêŽÀMÊ@ùŒ1¬Hl×Ú MZèzP5±T*|MP©T1bð!&ù¥òÿW!qåó‰¥Mé'È%DíÜøNˆï,ö¡ßÖ z…>±„¤l>Ÿ/%ö°àGºÃ€»tyÜnÛKnÅXx/ü”¿|à“ï%¤{%)Sˆ±mg*ù˜±#ß»ÎbñU~¤«¼.²øB•?LA{ Céøw"**.¦ïÊØF¹ˆ—)o(d H”6g’¾‘¯ÑQ°¨(à·“ŸJûöäÓ¸ ñÉpbȇ^È0ÄÂv:` NõA› ÞOFÂ"ÌØ!•J}БwÁÞÆcÖqQkl?o½‚PöR`¤“,| jèè©ØÓ¥ÞÐa¿MÇNåûVµB$ HFꎱ=ÓçÌkÇiè 5{¨ô4âûŒ¦S`‘ÛÉçóið¼Þó…€P¾Ï.q4"Ù#¥ÓæÇŒò¦ž†”fKHG‘à3Iáæ…‘hA*3ÉͦHà6gú¶Ò/8ø_’„LbEÈ|b)O–+Às¨ötš¸¿oº4éúc®=™b…/hŠ[ìT¿=Þ´ÁƒàT¿¸pœ8Ðuµ½ÞºÈñûDï òJfžðÛ/=ôkXuÐÔàºê%M¾A§WÑþ´!U@ù‘îg–éóÈ«/~w ´ƒA »H´ »ÁhýòjX ÉQä·²)ýêv*8ß§TA»…tÈ>2{ýa±)«¤’ R8È#è²ðó—”â,•7@æ …®,â<°u*Ÿv‰âÿqrs.3ªÎÒ}nùùç]ë;ˆ“?yÐÚ{Íy¿¿»ó7£>E5ñ{~Ô_’ø« wë÷)ƒ®Xwÿ‚1›½Ìà}m}•Á¸ŒþîŽüýÞ\…fPøOÐ…šˆ·²Œè·PçQægh1>bºžõ]t;~ó¿PS<óŒ]ÖèeôÒóýÛÊ0~nÝñã˜;h‰ãÞ&Aÿ, {„Æ­ 7º4ú_të\Ø)ô·ø­Nô»èø_¢ªÇLjsG0PUóOà?³Õ¸7õ iFø²ÝŠú5úd ²MdD_C†ŒèýHŸþ᎔¡÷æ|$sG¼äç¢s-#D‚êêÃ#}MÄuäˆü>êK ;Šfˆ>¾Éü3ºV¢Akh,z×þ#t­>JŒŠâ·ÀtÇ+y´ †YÍÖf.v·ÚˆNñȉMbÛ¾þ˜?É&¼[,9!÷GqK^Çiñ-ë»Ìd\Á­lå7Éð°:¯K›Þ×ê4~ÁGø-fð3»ç'Œ³¡É%¼g ›|ˆßå3{|“òN‡yÜ”7qc^Á‰9ˆÛâOêMf©§\Ä-ŒÍÇŽÙåªÎ01Aس•ßàc¼\”â¦Ä¶‚×3äõç$cRä&<²]›„³‚êy/± ¯ÁIÉ#ˆ8Oˆ z|Å`Åqq´ñKA5ì„¡Ìôñ*d«ˆË±µj%S¸ Q¦MLZrT?o˺#’6'¹“x‹Ôs-HsÒ•LË¿y~"^ë2æºàµ;®c“òù”62ÜÌJ eIMJ•Ä2¢ŸQ¬KBNX˜¾ —•êJ±å| ¢K„7ñ*kÕô͈ÍR͸€ŸŠ(1Uanñ8 7ä½åÖ4s à¢\»&оÒk„‰…gÓ´"¹{ð"ޓŇuiËœ“â˜Uïˆò]­n(øSòà¸4ŸSñy5sP2¦…w† Ë¸=Kß:º‚—ªUEa窳xzê<|ÇxMä„R8"ø ±]аžÞŒØFq*óÀJÆT¼ ‘UéÏjwêÞQÜœcò`7Nƒ}8;p#`3g¿,Ù£Ÿêm/Ni9"¯Ç‚ïð–‚ÓŒ·ÕÖÛjÁþÿ¢º‚C89¯‰r§TíÓó/&,CQ{@Xlµ³sÛ!Ø¿î@¼x·öÜøK hÚ[À°˜ÿõqƒxÍÞ+‡àŸÍÿ 0œÛ¯Î endstream endobj 2119 0 obj 5605 endobj 1740 0 obj << /Type /Page /Parent 1704 0 R /Resources 2102 0 R /Contents 2107 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1741 0 obj << /Count 360 /First 1742 0 R /Last 1743 0 R >> endobj 1742 0 obj << /Title (Introduction) /Dest [ 10 0 R /XYZ null null null ] /Parent 1741 0 R /Next 2096 0 R >> endobj 1743 0 obj << /Title (Index) /Dest [ 1650 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1744 0 R /First 1745 0 R /Last 1745 0 R /Count 1 >> endobj 1744 0 obj << /Title (Error codes) /Dest [ 1637 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1746 0 R /Next 1743 0 R /First 1747 0 R /Last 1748 0 R /Count 2 >> endobj 1745 0 obj << /Title (Alphabetic Index of all config XML tags) /Dest [ 1650 0 R /XYZ null null null ] /Parent 1743 0 R >> endobj 1746 0 obj << /Title (List of built-in timezones) /Dest [ 1634 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1749 0 R /Next 1744 0 R >> endobj 1747 0 obj << /Title (SyncML Status Codes) /Dest [ 1637 0 R /XYZ null null null ] /Parent 1744 0 R /Next 1748 0 R >> endobj 1748 0 obj << /Title (Internal Error Codes) /Dest [ 1643 0 R /XYZ null null null ] /Parent 1744 0 R /Prev 1747 0 R >> endobj 1749 0 obj << /Title (: Command line client-only configuration tags) /Dest [ 1596 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1750 0 R /Next 1746 0 R /First 1751 0 R /Last 1752 0 R /Count 23 >> endobj 1750 0 obj << /Title (, : Synthesis SyncML Engine library only configuration t\ ags) /Dest [ 1583 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1774 0 R /Next 1749 0 R /First 1775 0 R /Last 1776 0 R /Count 3 >> endobj 1751 0 obj << /Title (: Set default SyncML Version to start a session) /Dest [ 1596 0 R /XYZ null null null ] /Parent 1749 0 R /Next 1773 0 R >> endobj 1752 0 obj << /Title (: Request to sync a datastore) /Dest [ 1616 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1753 0 R /First 1754 0 R /Last 1755 0 R /Count 6 >> endobj 1753 0 obj << /Title (, : Login to remote SyncML server) /Dest [ 1616 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1760 0 R /Next 1752 0 R >> endobj 1754 0 obj << /Title (: path of remote server's datastore) /Dest [ 1616 0 R /XYZ null null null ] /Parent 1752 0 R /Next 1759 0 R >> endobj 1755 0 obj << /Title (: define inclusive SyncML DS 1.2 record filter) /Dest [ 1627 0 R /XYZ null null null ] /Parent 1752 0 R /Prev 1756 0 R >> endobj 1756 0 obj << /Title (: define SyncML DS 1.2 record filter) /Dest [ 1627 0 R /XYZ null null null ] /Parent 1752 0 R /Prev 1757 0 R /Next 1755 0 R >> endobj 1757 0 obj << /Title (: local datastore options) /Dest [ 1621 0 R /XYZ null null null ] /Parent 1752 0 R /Prev 1758 0 R /Next 1756 0 R >> endobj 1758 0 obj << /Title (: Force a slow sync) /Dest [ 1621 0 R /XYZ null null null ] /Parent 1752 0 R /Prev 1759 0 R /Next 1757 0 R >> endobj 1759 0 obj << /Title (: Synchronisation mode) /Dest [ 1616 0 R /XYZ null null null ] /Parent 1752 0 R /Prev 1754 0 R /Next 1758 0 R >> endobj 1760 0 obj << /Title (, : Proxy auth) /Dest [ 1613 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1761 0 R /Next 1753 0 R >> endobj 1761 0 obj << /Title (, : Proxy servers) /Dest [ 1613 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1762 0 R /Next 1760 0 R >> endobj 1762 0 obj << /Title (, : Login to remote SyncML server) /Dest [ 1613 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1763 0 R /Next 1761 0 R >> endobj 1763 0 obj << /Title (: Remote SyncML server URL) /Dest [ 1613 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1764 0 R /Next 1762 0 R >> endobj 1764 0 obj << /Title (: SyncML encoding format) /Dest [ 1610 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1765 0 R /Next 1763 0 R >> endobj 1765 0 obj << /Title (: Prevent local DB login) /Dest [ 1610 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1766 0 R /Next 1764 0 R >> endobj 1766 0 obj << /Title (, : Login to local database) /Dest [ 1610 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1767 0 R /Next 1765 0 R >> endobj 1767 0 obj << /Title (: Always send Device Info at Slowsync) /Dest [ 1610 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1768 0 R /Next 1766 0 R >> endobj 1768 0 obj << /Title (: Use smart retry attempt variations) /Dest [ 1604 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1769 0 R /Next 1767 0 R >> endobj 1769 0 obj << /Title (: Use original URI for retry) /Dest [ 1604 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1770 0 R /Next 1768 0 R >> endobj 1770 0 obj << /Title (: Use a new sessionID for retries) /Dest [ 1604 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1771 0 R /Next 1769 0 R >> endobj 1771 0 obj << /Title (: Set default nonce) /Dest [ 1604 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1772 0 R /Next 1770 0 R >> endobj 1772 0 obj << /Title (: Set default auth encoding) /Dest [ 1596 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1773 0 R /Next 1771 0 R >> endobj 1773 0 obj << /Title (: Set default auth method) /Dest [ 1596 0 R /XYZ null null null ] /Parent 1749 0 R /Prev 1751 0 R /Next 1772 0 R >> endobj 1774 0 obj << /Title (, : Plugin Based Server or C\ lient Config) /Dest [ 1556 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1778 0 R /Next 1750 0 R /First 1779 0 R /Last 1780 0 R /Count 16 >> endobj 1775 0 obj << /Title (: Path for persistent storage of client settings and admin\ data) /Dest [ 1583 0 R /XYZ null null null ] /Parent 1750 0 R /Next 1777 0 R >> endobj 1776 0 obj << /Title (: enable CRC based change detection) /Dest [ 1583 0 R /XYZ null null null ] /Parent 1750 0 R /Prev 1777 0 R >> endobj 1777 0 obj << /Title (: enable binfile based admin) /Dest [ 1583 0 R /XYZ null null null ] /Parent 1750 0 R /Prev 1775 0 R /Next 1776 0 R >> endobj 1778 0 obj << /Title (, : Text File Based Server o\ r Client) /Dest [ 1552 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1795 0 R /Next 1774 0 R >> endobj 1779 0 obj << /Title (plugin module: global settings) /Dest [ 1556 0 R /XYZ null null null ] /Parent 1774 0 R /Next 1783 0 R /First 1791 0 R /Last 1792 0 R /Count 4 >> endobj 1780 0 obj << /Title (plugin module \215FILEOBJ\216) /Dest [ 1579 0 R /XYZ null null null ] /Parent 1774 0 R /Prev 1781 0 R /First 1782 0 R /Last 1782 0 R /Count 1 >> endobj 1781 0 obj << /Title (plugin module \215SDK_textdb\216) /Dest [ 1574 0 R /XYZ null null null ] /Parent 1774 0 R /Prev 1783 0 R /Next 1780 0 R /First 1784 0 R /Last 1785 0 R /Count 2 >> endobj 1782 0 obj << /Title (Files of the fileobj modules) /Dest [ 1579 0 R /XYZ null null null ] /Parent 1780 0 R >> endobj 1783 0 obj << /Title (: Plugin Datastore specific settings) /Dest [ 1562 0 R /XYZ null null null ] /Parent 1774 0 R /Prev 1779 0 R /Next 1781 0 R /First 1786 0 R /Last 1787 0 R /Count 5 >> endobj 1784 0 obj << /Title (Files of the textdb) /Dest [ 1574 0 R /XYZ null null null ] /Parent 1781 0 R /Next 1785 0 R >> endobj 1785 0 obj << /Title (PluginParams of the textdb) /Dest [ 1574 0 R /XYZ null null null ] /Parent 1781 0 R /Prev 1784 0 R >> endobj 1786 0 obj << /Title () /Dest [ 1562 0 R /XYZ null null null ] /Parent 1783 0 R /Next 1790 0 R >> endobj 1787 0 obj << /Title (,,\t> endobj 1788 0 obj << /Title () /Dest [ 1567 0 R /XYZ null null null ] /Parent 1783 0 R /Prev 1789 0 R /Next 1787 0 R >> endobj 1789 0 obj << /Title () /Dest [ 1567 0 R /XYZ null null null ] /Parent 1783 0 R /Prev 1790 0 R /Next 1788 0 R >> endobj 1790 0 obj << /Title () /Dest [ 1567 0 R /XYZ null null null ] /Parent 1783 0 R /Prev 1786 0 R /Next 1789 0 R >> endobj 1791 0 obj << /Title () /Dest [ 1556 0 R /XYZ null null null ] /Parent 1779 0 R /Next 1794 0 R >> endobj 1792 0 obj << /Title () /Dest [ 1562 0 R /XYZ null null null ] /Parent 1779 0 R /Prev 1793 0 R >> endobj 1793 0 obj << /Title () /Dest [ 1562 0 R /XYZ null null null ] /Parent 1779 0 R /Prev 1794 0 R /Next 1792 0 R >> endobj 1794 0 obj << /Title () /Dest [ 1562 0 R /XYZ null null null ] /Parent 1779 0 R /Prev 1791 0 R /Next 1793 0 R >> endobj 1795 0 obj << /Title (, : SQL/ODBC based S\ erver or Client Config) /Dest [ 1297 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1796 0 R /Next 1778 0 R /First 1797 0 R /Last 1798 0 R /Count 49 >> endobj 1796 0 obj << /Title (, : General Server and Client Settings) /Dest [ 931 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1846 0 R /Next 1795 0 R /First 1847 0 R /Last 1848 0 R /Count 111 >> endobj 1797 0 obj << /Title (SQL Statement processing) /Dest [ 1297 0 R /XYZ null null null ] /Parent 1795 0 R /Next 1841 0 R /First 1842 0 R /Last 1843 0 R /Count 4 >> endobj 1798 0 obj << /Title (: SQL and ODBC Datastore specific settings) /Dest [ 1400 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1799 0 R /First 1800 0 R /Last 1801 0 R /Count 25 >> endobj 1799 0 obj << /Title (: SQL statement to write activity log entry) /Dest [ 1393 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1825 0 R /Next 1798 0 R >> endobj 1800 0 obj << /Title (: get data subselection key) /Dest [ 1400 0 R /XYZ null null null ] /Parent 1798 0 R /Next 1824 0 R >> endobj 1801 0 obj << /Title (: prepare SQL filter according to options) /Dest [ 1546 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1802 0 R >> endobj 1802 0 obj << /Title (: clean detail records on insert) /Dest [ 1546 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1803 0 R /Next 1801 0 R >> endobj 1803 0 obj << /Title (, , : detail record SQ\ L) /Dest [ 1546 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1804 0 R /Next 1802 0 R >> endobj 1804 0 obj << /Title (: detail record storage filter) /Dest [ 1539 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1805 0 R /Next 1803 0 R >> endobj 1805 0 obj << /Title (, , : detail record storage options) /Dest [ 1539 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1806 0 R /Next 1804 0 R >> endobj 1806 0 obj << /Title (: definition of master - detail record structures) /Dest [ 1513 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1807 0 R /Next 1805 0 R >> endobj 1807 0 obj << /Title (: SQL specific field mapping features) /Dest [ 1505 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1808 0 R /Next 1806 0 R >> endobj 1808 0 obj << /Title (, , , , , , : local object ID \ management) /Dest [ 1495 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1809 0 R /Next 1807 0 R >> endobj 1809 0 obj << /Title (: Ignore SQLRowCount) /Dest [ 1485 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1810 0 R /Next 1808 0 R >> endobj 1810 0 obj << /Title (, , , : write r\ ecords to database) /Dest [ 1485 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1811 0 R /Next 1809 0 R >> endobj 1811 0 obj << /Title (: read record from database) /Dest [ 1476 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1812 0 R /Next 1810 0 R >> endobj 1812 0 obj << /Title (: read IDs and timestamps) /Dest [ 1476 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1813 0 R /Next 1811 0 R >> endobj 1813 0 obj << /Title (: combined date and time for modification timestamp) /Dest [ 1472 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1814 0 R /Next 1812 0 R >> endobj 1814 0 obj << /Title (: commit each item update) /Dest [ 1472 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1815 0 R /Next 1813 0 R >> endobj 1815 0 obj << /Title (: no longer supported in version 3.0) /Dest [ 1472 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1816 0 R /Next 1814 0 R >> endobj 1816 0 obj << /Title (: commit at end of SyncML message exchange) /Dest [ 1472 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1817 0 R /Next 1815 0 R >> endobj 1817 0 obj << /Title (: use filtering in WHERE clause) /Dest [ 1466 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1818 0 R /Next 1816 0 R >> endobj 1818 0 obj << /Title (: how ODBC strings must be escaped for the database) /Dest [ 1466 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1819 0 R /Next 1817 0 R >> endobj 1819 0 obj << /Title (: SQLite database file name) /Dest [ 1466 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1820 0 R /Next 1818 0 R >> endobj 1820 0 obj << /Title (: SQLite database file name) /Dest [ 1458 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1821 0 R /Next 1819 0 R >> endobj 1821 0 obj << /Title (, , , : Map t\ able management) /Dest [ 1446 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1822 0 R /Next 1820 0 R >> endobj 1822 0 obj << /Title (: modified time stamp type) /Dest [ 1446 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1823 0 R /Next 1821 0 R >> endobj 1823 0 obj << /Title (: format for timestamps in target table) /Dest [ 1446 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1824 0 R /Next 1822 0 R >> endobj 1824 0 obj << /Title (, , , : Sync target management) /Dest [ 1411 0 R /XYZ null null null ] /Parent 1798 0 R /Prev 1800 0 R /Next 1823 0 R >> endobj 1825 0 obj << /Title (: query for getting database time) /Dest [ 1393 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1826 0 R /Next 1799 0 R >> endobj 1826 0 obj << /Title (: custom login checking script) /Dest [ 1385 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1827 0 R /Next 1825 0 R >> endobj 1827 0 obj << /Title (: query for user authentication) /Dest [ 1379 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1828 0 R /Next 1826 0 R >> endobj 1828 0 obj << /Title (, , , : Device ma\ nagement) /Dest [ 1371 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1829 0 R /Next 1827 0 R >> endobj 1829 0 obj << /Title (: MD5 digest stored as hex string in database) /Dest [ 1365 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1830 0 R /Next 1828 0 R >> endobj 1830 0 obj << /Title (: MD5 digest passwort in database) /Dest [ 1365 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1831 0 R /Next 1829 0 R >> endobj 1831 0 obj << /Title (: plain text password in database) /Dest [ 1365 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1832 0 R /Next 1830 0 R >> endobj 1832 0 obj << /Title (, , : outdated - no longer available) /Dest [ 1357 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1833 0 R /Next 1831 0 R >> endobj 1833 0 obj << /Title (: usage of ODBC cursor library) /Dest [ 1357 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1834 0 R /Next 1832 0 R >> endobj 1834 0 obj << /Title (: Transaction isolation mode) /Dest [ 1357 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1835 0 R /Next 1833 0 R >> endobj 1835 0 obj << /Title (: Script executed whenever new DB connection is open\ ed.) /Dest [ 1352 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1836 0 R /Next 1834 0 R >> endobj 1836 0 obj << /Title (: ODBC timeout) /Dest [ 1352 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1837 0 R /Next 1835 0 R >> endobj 1837 0 obj << /Title (: prevent setting connection attributes) /Dest [ 1352 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1838 0 R /Next 1836 0 R >> endobj 1838 0 obj << /Title (: ODBC database password) /Dest [ 1352 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1839 0 R /Next 1837 0 R >> endobj 1839 0 obj << /Title (: ODBC database connection string) /Dest [ 1347 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1840 0 R /Next 1838 0 R >> endobj 1840 0 obj << /Title (: ODBC database user name) /Dest [ 1347 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1841 0 R /Next 1839 0 R >> endobj 1841 0 obj << /Title (: ODBC data source name) /Dest [ 1340 0 R /XYZ null null null ] /Parent 1795 0 R /Prev 1797 0 R /Next 1840 0 R >> endobj 1842 0 obj << /Title (Placeholders for all SQL statements) /Dest [ 1305 0 R /XYZ null null null ] /Parent 1797 0 R /Next 1845 0 R >> endobj 1843 0 obj << /Title (Executing SQL statements from scripts) /Dest [ 1330 0 R /XYZ null null null ] /Parent 1797 0 R /Prev 1844 0 R >> endobj 1844 0 obj << /Title (Placeholders for SQL data access statements within ) /Dest [ 1323 0 R /XYZ null null null ] /Parent 1797 0 R /Prev 1845 0 R /Next 1843 0 R >> endobj 1845 0 obj << /Title (Placeholders for SQL statements within ) /Dest [ 1305 0 R /XYZ null null null ] /Parent 1797 0 R /Prev 1842 0 R /Next 1844 0 R >> endobj 1846 0 obj << /Title (: Data Type Definitions) /Dest [ 775 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1958 0 R /Next 1796 0 R /First 1959 0 R /Last 1960 0 R /Count 36 >> endobj 1847 0 obj << /Title (,: SyncML version support) /Dest [ 931 0 R /XYZ null null null ] /Parent 1796 0 R /Next 1957 0 R >> endobj 1848 0 obj << /Title (: special rules for specific remotes) /Dest [ 1254 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1849 0 R /First 1850 0 R /Last 1851 0 R /Count 24 >> endobj 1849 0 obj << /Title (: combined datastore definition) /Dest [ 1241 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1874 0 R /Next 1848 0 R /First 1875 0 R /Last 1876 0 R /Count 3 >> endobj 1850 0 obj << /Title () /Dest [ 1254 0 R /XYZ null null null ] /Parent 1848 0 R /Next 1873 0 R >> endobj 1851 0 obj << /Title (: script to execute if rule applies) /Dest [ 1291 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1852 0 R >> endobj 1852 0 obj << /Title (: max time for request processing) /Dest [ 1291 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1853 0 R /Next 1851 0 R >> endobj 1853 0 obj << /Title (: reject sync with device) /Dest [ 1291 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1854 0 R /Next 1852 0 R >> endobj 1854 0 obj << /Title (, : use relaxed conformance modes) /Dest [ 1283 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1855 0 R /Next 1853 0 R >> endobj 1855 0 obj << /Title (: set default input character set) /Dest [ 1283 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1856 0 R /Next 1854 0 R >> endobj 1856 0 obj << /Title (: set default output character set) /Dest [ 1283 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1857 0 R /Next 1855 0 R >> endobj 1857 0 obj << /Title (: end date for allday events inclusive) /Dest [ 1283 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1858 0 R /Next 1856 0 R >> endobj 1858 0 obj << /Title (: prevent folding long lines) /Dest [ 1277 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1859 0 R /Next 1857 0 R >> endobj 1859 0 obj << /Title (: always treat received information as UTC) /Dest [ 1277 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1860 0 R /Next 1858 0 R >> endobj 1860 0 obj << /Title (: always treat received information as localtime) /Dest [ 1277 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1861 0 R /Next 1859 0 R >> endobj 1861 0 obj << /Title (: always send time information as localtime) /Dest [ 1277 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1862 0 R /Next 1860 0 R >> endobj 1862 0 obj << /Title (: always send time information as localtime) /Dest [ 1273 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1863 0 R /Next 1861 0 R >> endobj 1863 0 obj << /Title (: allow client to send the same message twice) /Dest [ 1273 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1864 0 R /Next 1862 0 R >> endobj 1864 0 obj << /Title (: allow client to send the same message twice) /Dest [ 1273 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1865 0 R /Next 1863 0 R >> endobj 1865 0 obj << /Title (, : how to show datastore name in devInf \ sent to client.) /Dest [ 1269 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1866 0 R /Next 1864 0 R >> endobj 1866 0 obj << /Title (: ignore maximum field size reported in client's de\ vInf) /Dest [ 1269 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1867 0 R /Next 1865 0 R >> endobj 1867 0 obj << /Title (: never update client records during slowsync) /Dest [ 1269 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1868 0 R /Next 1866 0 R >> endobj 1868 0 obj << /Title (: update server records during slowsync) /Dest [ 1264 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1869 0 R /Next 1867 0 R >> endobj 1869 0 obj << /Title (: update client records during slowsync) /Dest [ 1264 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1870 0 R /Next 1868 0 R >> endobj 1870 0 obj << /Title (: do not send empty properties) /Dest [ 1264 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1871 0 R /Next 1869 0 R >> endobj 1871 0 obj << /Title (: device has short fields) /Dest [ 1259 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1872 0 R /Next 1870 0 R >> endobj 1872 0 obj << /Title () /Dest [ 1259 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1873 0 R /Next 1871 0 R >> endobj 1873 0 obj << /Title (device identification tags for ) /Dest [ 1254 0 R /XYZ null null null ] /Parent 1848 0 R /Prev 1850 0 R /Next 1872 0 R >> endobj 1874 0 obj << /Title (: General Datastore settings) /Dest [ 1016 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1878 0 R /Next 1849 0 R /First 1879 0 R /Last 1880 0 R /Count 48 >> endobj 1875 0 obj << /Title (: Include a datastore in a superdatastore) /Dest [ 1249 0 R /XYZ null null null ] /Parent 1849 0 R /Next 1877 0 R >> endobj 1876 0 obj << /Title (: prefix for item ID) /Dest [ 1249 0 R /XYZ null null null ] /Parent 1849 0 R /Prev 1877 0 R >> endobj 1877 0 obj << /Title (: filter to direct incoming items) /Dest [ 1249 0 R /XYZ null null null ] /Parent 1849 0 R /Prev 1875 0 R /Next 1876 0 R >> endobj 1878 0 obj << /Title (, : Pre- and post-login scripts) /Dest [ 1008 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1927 0 R /Next 1874 0 R >> endobj 1879 0 obj << /Title (: alternate name for this datastore) /Dest [ 1026 0 R /XYZ null null null ] /Parent 1874 0 R /Next 1926 0 R >> endobj 1880 0 obj << /Title (: mapping datatype's fields to database fields) /Dest [ 1174 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1881 0 R /First 1882 0 R /Last 1883 0 R /Count 7 >> endobj 1881 0 obj << /Title (: support for resuming half-transmitted data items af\ ter interrupted sync) /Dest [ 1168 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1889 0 R /Next 1880 0 R >> endobj 1882 0 obj << /Title (, : mapping a datatype field to a database field) /Dest [ 1174 0 R /XYZ null null null ] /Parent 1880 0 R /Next 1888 0 R >> endobj 1883 0 obj << /Title (: finish access to database) /Dest [ 1241 0 R /XYZ null null null ] /Parent 1880 0 R /Prev 1884 0 R >> endobj 1884 0 obj << /Title (: finalize written items) /Dest [ 1233 0 R /XYZ null null null ] /Parent 1880 0 R /Prev 1885 0 R /Next 1883 0 R >> endobj 1885 0 obj << /Title (: prepare writing item to database) /Dest [ 1225 0 R /XYZ null null null ] /Parent 1880 0 R /Prev 1886 0 R /Next 1884 0 R >> endobj 1886 0 obj << /Title (: post-process item read from database) /Dest [ 1212 0 R /XYZ null null null ] /Parent 1880 0 R /Prev 1887 0 R /Next 1885 0 R >> endobj 1887 0 obj << /Title (: initialize accessing database) /Dest [ 1204 0 R /XYZ null null null ] /Parent 1880 0 R /Prev 1888 0 R /Next 1886 0 R >> endobj 1888 0 obj << /Title (: auto-map internal to DB fields) /Dest [ 1204 0 R /XYZ null null null ] /Parent 1880 0 R /Prev 1882 0 R /Next 1887 0 R >> endobj 1889 0 obj << /Title (: support for resuming interrupted sync session) /Dest [ 1168 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1890 0 R /Next 1881 0 R >> endobj 1890 0 obj << /Title ( \(or \): custom "time of\ last sync" identifier) /Dest [ 1168 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1891 0 R /Next 1889 0 R >> endobj 1891 0 obj << /Title (: How to determine "time of last sync") /Dest [ 1163 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1892 0 R /Next 1890 0 R >> endobj 1892 0 obj << /Title (: Support for "one-way from remote sync") /Dest [ 1163 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1893 0 R /Next 1891 0 R >> endobj 1893 0 obj << /Title (: always update all fields) /Dest [ 1163 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1894 0 R /Next 1892 0 R >> endobj 1894 0 obj << /Title (: encoding of line ends within database strings) /Dest [ 1159 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1895 0 R /Next 1893 0 R >> endobj 1895 0 obj << /Title (: character set to be used for database strings) /Dest [ 1159 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1896 0 R /Next 1894 0 R >> endobj 1896 0 obj << /Title (: output data in user zone) /Dest [ 1150 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1897 0 R /Next 1895 0 R >> endobj 1897 0 obj << /Title (: timezone for database timestamps) /Dest [ 1150 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1898 0 R /Next 1896 0 R >> endobj 1898 0 obj << /Title (, : type of database timestamp) /Dest [ 1150 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1899 0 R /Next 1897 0 R >> endobj 1899 0 obj << /Title (: re-send failing items in next session) /Dest [ 1144 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1900 0 R /Next 1898 0 R >> endobj 1900 0 obj << /Title (: script to handle status codes for received i\ tems) /Dest [ 1144 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1901 0 R /Next 1899 0 R >> endobj 1901 0 obj << /Title (: script to handle status codes for sent items) /Dest [ 1135 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1902 0 R /Next 1900 0 R >> endobj 1902 0 obj << /Title (: script called before sending sync alert) /Dest [ 1135 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1903 0 R /Next 1901 0 R >> endobj 1903 0 obj << /Title (: script called at sync alert) /Dest [ 1126 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1904 0 R /Next 1902 0 R >> endobj 1904 0 obj << /Title (: script executed at end of sync) /Dest [ 1126 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1905 0 R /Next 1903 0 R >> endobj 1905 0 obj << /Title (: script called when admin data \(targets, maps\) are \ read) /Dest [ 1126 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1906 0 R /Next 1904 0 R >> endobj 1906 0 obj << /Title (: script called after accessing database) /Dest [ 1117 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1907 0 R /Next 1905 0 R >> endobj 1907 0 obj << /Title (: script called before accessing database) /Dest [ 1074 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1908 0 R /Next 1906 0 R >> endobj 1908 0 obj << /Title (: make incoming items pass) /Dest [ 1074 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1909 0 R /Next 1907 0 R >> endobj 1909 0 obj << /Title (: make item visible) /Dest [ 1074 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1910 0 R /Next 1908 0 R >> endobj 1910 0 obj << /Title (: filter invisible items) /Dest [ 1066 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1911 0 R /Next 1909 0 R >> endobj 1911 0 obj << /Title (: filter subset of datastore) /Dest [ 1066 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1912 0 R /Next 1910 0 R >> endobj 1912 0 obj << /Title (: discard not accepted items silently) /Dest [ 1066 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1913 0 R /Next 1911 0 R >> endobj 1913 0 obj << /Title (: check incoming items) /Dest [ 1054 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1914 0 R /Next 1912 0 R >> endobj 1914 0 obj << /Title (: enable date range filtering) /Dest [ 1054 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1915 0 R /Next 1913 0 R >> endobj 1915 0 obj << /Title (: enable SyncML DS 1.2 filtering) /Dest [ 1054 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1916 0 R /Next 1914 0 R >> endobj 1916 0 obj << /Title (: use a datatype) /Dest [ 1046 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1917 0 R /Next 1915 0 R >> endobj 1917 0 obj << /Title (: datastore's supported types) /Dest [ 1046 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1918 0 R /Next 1916 0 R >> endobj 1918 0 obj << /Title (, , : sync confli\ ct resolution strategy) /Dest [ 1042 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1919 0 R /Next 1917 0 R >> endobj 1919 0 obj << /Title (: send localID \(GUID\) in all operations \(not only \ adds\).) /Dest [ 1042 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1920 0 R /Next 1918 0 R >> endobj 1920 0 obj << /Title (: maximum number of data items per SyncML message) /Dest [ 1038 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1921 0 R /Next 1919 0 R >> endobj 1921 0 obj << /Title (: transmit updates to remote) /Dest [ 1038 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1922 0 R /Next 1920 0 R >> endobj 1922 0 obj << /Title (: try to update "deleted" items) /Dest [ 1038 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1923 0 R /Next 1921 0 R >> endobj 1923 0 obj << /Title (: delete overrides replace) /Dest [ 1032 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1924 0 R /Next 1922 0 R >> endobj 1924 0 obj << /Title (: read-only datastore) /Dest [ 1032 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1925 0 R /Next 1923 0 R >> endobj 1925 0 obj << /Title (: decriptive name for a datastore) /Dest [ 1032 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1926 0 R /Next 1924 0 R >> endobj 1926 0 obj << /Title (: datastore type ID) /Dest [ 1026 0 R /XYZ null null null ] /Parent 1874 0 R /Prev 1879 0 R /Next 1925 0 R >> endobj 1927 0 obj << /Title (: Activity log header) /Dest [ 1008 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1928 0 R /Next 1878 0 R >> endobj 1928 0 obj << /Title (: Activity log format) /Dest [ 991 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1929 0 R /Next 1927 0 R >> endobj 1929 0 obj << /Title (: Activity log enable) /Dest [ 991 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1930 0 R /Next 1928 0 R >> endobj 1930 0 obj << /Title (: Activity log text file) /Dest [ 986 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1931 0 R /Next 1929 0 R >> endobj 1931 0 obj << /Title (: Acceptance of server alerted sync types) /Dest [ 986 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1932 0 R /Next 1930 0 R >> endobj 1932 0 obj << /Title (: enumerate default property parameter's values a\ s property names) /Dest [ 986 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1933 0 R /Next 1931 0 R >> endobj 1933 0 obj << /Title (: show size and type in SyncML 1.0 devInf) /Dest [ 979 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1934 0 R /Next 1932 0 R >> endobj 1934 0 obj << /Title (: show field support details in device information) /Dest [ 979 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1935 0 R /Next 1933 0 R >> endobj 1935 0 obj << /Title (: error handling option) /Dest [ 979 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1936 0 R /Next 1934 0 R >> endobj 1936 0 obj << /Title (: end date for allday events inclusive) /Dest [ 974 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1937 0 R /Next 1935 0 R >> endobj 1937 0 obj << /Title (: Set user's default time zone) /Dest [ 974 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1938 0 R /Next 1936 0 R >> endobj 1938 0 obj << /Title (: Handling of delete for non-existing items) /Dest [ 974 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1939 0 R /Next 1937 0 R >> endobj 1939 0 obj << /Title (: LargeObject chunk size limit for testing) /Dest [ 974 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1940 0 R /Next 1938 0 R >> endobj 1940 0 obj << /Title (: Add resending policy) /Dest [ 970 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1941 0 R /Next 1939 0 R >> endobj 1941 0 obj << /Title (: SyncML command flow option) /Dest [ 970 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1942 0 R /Next 1940 0 R >> endobj 1942 0 obj << /Title (: Custom handling of SyncML Put/Result com\ mands) /Dest [ 970 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1943 0 R /Next 1941 0 R >> endobj 1943 0 obj << /Title (: Custom handling of SyncML Get commands) /Dest [ 966 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1944 0 R /Next 1942 0 R >> endobj 1944 0 obj << /Title (, : Creation of custom SyncML Ge\ t and Put commands) /Dest [ 961 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1945 0 R /Next 1943 0 R >> endobj 1945 0 obj << /Title (, : Session level status\ code handling) /Dest [ 961 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1946 0 R /Next 1944 0 R >> endobj 1946 0 obj << /Title (: Session finish script) /Dest [ 961 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1947 0 R /Next 1945 0 R >> endobj 1947 0 obj << /Title (: Session init script) /Dest [ 956 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1948 0 R /Next 1946 0 R >> endobj 1948 0 obj << /Title (: Allow multi-threaded execution) /Dest [ 956 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1949 0 R /Next 1947 0 R >> endobj 1949 0 obj << /Title (, : single user mode) /Dest [ 956 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1950 0 R /Next 1948 0 R >> endobj 1950 0 obj << /Title (, : RespURI configuration) /Dest [ 952 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1951 0 R /Next 1949 0 R >> endobj 1951 0 obj << /Title (: constant nonce string) /Dest [ 952 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1952 0 R /Next 1950 0 R >> endobj 1952 0 obj << /Title (: MD5 nonce generation mode) /Dest [ 952 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1953 0 R /Next 1951 0 R >> endobj 1953 0 obj << /Title (,: SyncML Authentication) /Dest [ 948 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1954 0 R /Next 1952 0 R >> endobj 1954 0 obj << /Title (: specify URL used to access the server) /Dest [ 948 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1955 0 R /Next 1953 0 R >> endobj 1955 0 obj << /Title (: artifical slow down) /Dest [ 943 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1956 0 R /Next 1954 0 R >> endobj 1956 0 obj << /Title (: max time for request processing) /Dest [ 943 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1957 0 R /Next 1955 0 R >> endobj 1957 0 obj << /Title (: Timeout for unfinished sessions) /Dest [ 943 0 R /XYZ null null null ] /Parent 1796 0 R /Prev 1847 0 R /Next 1956 0 R >> endobj 1958 0 obj << /Title (: Transport Configuration Section) /Dest [ 763 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1995 0 R /Next 1846 0 R /First 1996 0 R /Last 1997 0 R /Count 8 >> endobj 1959 0 obj << /Title (: internal data field list) /Dest [ 779 0 R /XYZ null null null ] /Parent 1846 0 R /Next 1985 0 R >> endobj 1960 0 obj << /Title (RRULE field block) /Dest [ 927 0 R /XYZ null null null ] /Parent 1846 0 R /Prev 1961 0 R >> endobj 1961 0 obj << /Title (: definition of a datatype) /Dest [ 874 0 R /XYZ null null null ] /Parent 1846 0 R /Prev 1962 0 R /Next 1960 0 R /First 1963 0 R /Last 1964 0 R /Count 14 >> endobj 1962 0 obj << /Title (: definition of a text format profile) /Dest [ 858 0 R /XYZ null null null ] /Parent 1846 0 R /Prev 1977 0 R /Next 1961 0 R /First 1978 0 R /Last 1979 0 R /Count 7 >> endobj 1963 0 obj << /Title (: MIME-DIR profile, text profile or field list to use for datatype) /Dest [ 874 0 R /XYZ null null null ] /Parent 1961 0 R /Next 1976 0 R >> endobj 1964 0 obj << /Title (: MIME-DIR conformance) /Dest [ 922 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1965 0 R >> endobj 1965 0 obj << /Title (: Custom item merge) /Dest [ 922 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1966 0 R /Next 1964 0 R >> endobj 1966 0 obj << /Title (: Custom item comparison) /Dest [ 917 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1967 0 R /Next 1965 0 R >> endobj 1967 0 obj << /Title (: Custom processing for incoming items) /Dest [ 910 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1968 0 R /Next 1966 0 R >> endobj 1968 0 obj << /Title (, : Script-based data filtering) /Dest [ 898 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1969 0 R /Next 1967 0 R >> endobj 1969 0 obj << /Title (, : Custom pre- and postprocessing items\ ) /Dest [ 898 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1970 0 R /Next 1968 0 R >> endobj 1970 0 obj << /Title (: Initialisation of type-specific script context) /Dest [ 890 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1971 0 R /Next 1969 0 R >> endobj 1971 0 obj << /Title (, : Unicode content) /Dest [ 890 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1972 0 R /Next 1970 0 R >> endobj 1972 0 obj << /Title (: Allow unencoded binary in content) /Dest [ 885 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1973 0 R /Next 1971 0 R >> endobj 1973 0 obj << /Title (: Compression level for compression\ ) /Dest [ 885 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1974 0 R /Next 1972 0 R >> endobj 1974 0 obj << /Title (: Enable/disable special compressed \(non-standard\) item\ format) /Dest [ 885 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1975 0 R /Next 1973 0 R >> endobj 1975 0 obj << /Title (, : MIME type and version) /Dest [ 882 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1976 0 R /Next 1974 0 R >> endobj 1976 0 obj << /Title (: vCard or vCalendar version) /Dest [ 882 0 R /XYZ null null null ] /Parent 1961 0 R /Prev 1963 0 R /Next 1975 0 R >> endobj 1977 0 obj << /Title (: definition of a mime-dir profile) /Dest [ 792 0 R /XYZ null null null ] /Parent 1846 0 R /Prev 1985 0 R /Next 1962 0 R /First 1986 0 R /Last 1987 0 R /Count 9 >> endobj 1978 0 obj << /Title (: mapping of text based formats to database fields) /Dest [ 858 0 R /XYZ null null null ] /Parent 1962 0 R /Next 1984 0 R >> endobj 1979 0 obj << /Title (RFC822 email body options) /Dest [ 868 0 R /XYZ null null null ] /Parent 1962 0 R /Prev 1980 0 R >> endobj 1980 0 obj << /Title (: type of text field) /Dest [ 865 0 R /XYZ null null null ] /Parent 1962 0 R /Prev 1981 0 R /Next 1979 0 R >> endobj 1981 0 obj << /Title (: tagged header handling) /Dest [ 865 0 R /XYZ null null null ] /Parent 1962 0 R /Prev 1982 0 R /Next 1980 0 R >> endobj 1982 0 obj << /Title (: empty field handling) /Dest [ 865 0 R /XYZ null null null ] /Parent 1962 0 R /Prev 1983 0 R /Next 1981 0 R >> endobj 1983 0 obj << /Title (: header lines) /Dest [ 865 0 R /XYZ null null null ] /Parent 1962 0 R /Prev 1984 0 R /Next 1982 0 R >> endobj 1984 0 obj << /Title (: Number of lines to map) /Dest [ 858 0 R /XYZ null null null ] /Parent 1962 0 R /Prev 1978 0 R /Next 1983 0 R >> endobj 1985 0 obj << /Title (: definition of an internal field) /Dest [ 779 0 R /XYZ null null null ] /Parent 1846 0 R /Prev 1959 0 R /Next 1977 0 R >> endobj 1986 0 obj << /Title (: root profile definition) /Dest [ 795 0 R /XYZ null null null ] /Parent 1977 0 R /Next 1994 0 R >> endobj 1987 0 obj << /Title (: handling of floating timestamps) /Dest [ 854 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1988 0 R >> endobj 1988 0 obj << /Title (: VTIMEZONE generation mode) /Dest [ 854 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1989 0 R /Next 1987 0 R >> endobj 1989 0 obj << /Title (: control storage position and repetitions) /Dest [ 842 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1990 0 R /Next 1988 0 R >> endobj 1990 0 obj << /Title (: property parameter definition) /Dest [ 831 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1991 0 R /Next 1989 0 R >> endobj 1991 0 obj << /Title (: enumerated values) /Dest [ 827 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1992 0 R /Next 1990 0 R >> endobj 1992 0 obj << /Title (: property or parameter value storage) /Dest [ 817 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1993 0 R /Next 1991 0 R >> endobj 1993 0 obj << /Title (: property definition) /Dest [ 804 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1994 0 R /Next 1992 0 R >> endobj 1994 0 obj << /Title (: nested subprofile definition) /Dest [ 795 0 R /XYZ null null null ] /Parent 1977 0 R /Prev 1986 0 R /Next 1993 0 R >> endobj 1995 0 obj << /Title (General Global Configuration Options) /Dest [ 686 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2004 0 R /Next 1958 0 R /First 2005 0 R /Last 2006 0 R /Count 37 >> endobj 1996 0 obj << /Title (: HTTP 1.1 connection) /Dest [ 763 0 R /XYZ null null null ] /Parent 1958 0 R /Next 2003 0 R >> endobj 1997 0 obj << /Title (: Max sessions to be run by a process) /Dest [ 772 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 1998 0 R >> endobj 1998 0 obj << /Title (: Max number of session threads per server process) /Dest [ 772 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 1999 0 R /Next 1997 0 R >> endobj 1999 0 obj << /Title (: OBEX service name) /Dest [ 769 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 2000 0 R /Next 1998 0 R >> endobj 2000 0 obj << /Title (: listener IP address) /Dest [ 769 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 2001 0 R /Next 1999 0 R >> endobj 2001 0 obj << /Title (: HTTP and OBEX/TCP server port number) /Dest [ 769 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 2002 0 R /Next 2000 0 R >> endobj 2002 0 obj << /Title (: communication protocol) /Dest [ 766 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 2003 0 R /Next 2001 0 R >> endobj 2003 0 obj << /Title (: buffer last answer for retries) /Dest [ 766 0 R /XYZ null null null ] /Parent 1958 0 R /Prev 1996 0 R /Next 2002 0 R >> endobj 2004 0 obj << /Title (Filters) /Dest [ 656 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2042 0 R /Next 1995 0 R /First 2043 0 R /Last 2044 0 R /Count 6 >> endobj 2005 0 obj << /Title (, : License) /Dest [ 686 0 R /XYZ null null null ] /Parent 1995 0 R /Next 2041 0 R >> endobj 2006 0 obj << /Title (: define custom time zone as VTIMEZONE) /Dest [ 754 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2007 0 R >> endobj 2007 0 obj << /Title (: override local system time zone) /Dest [ 754 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2008 0 R /Next 2006 0 R >> endobj 2008 0 obj << /Title (: avoid PUT of devinf) /Dest [ 754 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2009 0 R /Next 2007 0 R >> endobj 2009 0 obj << /Title (: set timestamp for config file) /Dest [ 748 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2010 0 R /Next 2008 0 R >> endobj 2010 0 obj << /Title (: Debug Option Section) /Dest [ 706 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2011 0 R /Next 2009 0 R /First 2012 0 R /Last 2013 0 R /Count 19 >> endobj 2011 0 obj << /Title (: Global scripting definitions) /Dest [ 697 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2031 0 R /Next 2010 0 R /First 2032 0 R /Last 2033 0 R /Count 3 >> endobj 2012 0 obj << /Title (: Directory path for debug log files) /Dest [ 713 0 R /XYZ null null null ] /Parent 2010 0 R /Next 2030 0 R >> endobj 2013 0 obj << /Title (: send session logs to global logfile) /Dest [ 748 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2014 0 R >> endobj 2014 0 obj << /Title (: generate global log) /Dest [ 748 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2015 0 R /Next 2013 0 R >> endobj 2015 0 obj << /Title (: No longer supported; use instead) /Dest [ 748 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2016 0 R /Next 2014 0 R >> endobj 2016 0 obj << /Title (: generate session logs) /Dest [ 742 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2017 0 R /Next 2015 0 R >> endobj 2017 0 obj << /Title (: dump SyncML traffic to files) /Dest [ 742 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2018 0 R /Next 2016 0 R >> endobj 2018 0 obj << /Title (: show traffic in XML) /Dest [ 737 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2019 0 R /Next 2017 0 R >> endobj 2019 0 obj << /Title (: string to be used for indenting blocks) /Dest [ 737 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2020 0 R /Next 2018 0 R >> endobj 2020 0 obj << /Title (, : text to add at begin and end of logfiles) /Dest [ 733 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2021 0 R /Next 2019 0 R >> endobj 2021 0 obj << /Title (: if and how to show log output from subthreads) /Dest [ 733 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2022 0 R /Next 2020 0 R >> endobj 2022 0 obj << /Title (: select log file format) /Dest [ 728 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2023 0 R /Next 2021 0 R >> endobj 2023 0 obj << /Title (: append or overwrite existing session logs) /Dest [ 728 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2024 0 R /Next 2022 0 R >> endobj 2024 0 obj << /Title (, : single file log option) /Dest [ 728 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2025 0 R /Next 2023 0 R >> endobj 2025 0 obj << /Title (: show timestamps in logs) /Dest [ 724 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2026 0 R /Next 2024 0 R >> endobj 2026 0 obj << /Title (: show thread ID in logs) /Dest [ 724 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2027 0 R /Next 2025 0 R >> endobj 2027 0 obj << /Title (, : show timestamps in logs) /Dest [ 724 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2028 0 R /Next 2026 0 R >> endobj 2028 0 obj << /Title (: dynamic folding for HTML logs) /Dest [ 721 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2029 0 R /Next 2027 0 R >> endobj 2029 0 obj << /Title (: select log file format) /Dest [ 721 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2030 0 R /Next 2028 0 R >> endobj 2030 0 obj << /Title (, ) /Dest [ 713 0 R /XYZ null null null ] /Parent 2010 0 R /Prev 2012 0 R /Next 2029 0 R >> endobj 2031 0 obj << /Title (: define configuration variable) /Dest [ 697 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2035 0 R /Next 2011 0 R >> endobj 2032 0 obj << /Title (: User-defined function) /Dest [ 697 0 R /XYZ null null null ] /Parent 2011 0 R /Next 2034 0 R >> endobj 2033 0 obj << /Title (: maximum loop execution time) /Dest [ 706 0 R /XYZ null null null ] /Parent 2011 0 R /Prev 2034 0 R >> endobj 2034 0 obj << /Title (: define macro) /Dest [ 706 0 R /XYZ null null null ] /Parent 2011 0 R /Prev 2032 0 R /Next 2033 0 R >> endobj 2035 0 obj << /Title (: define configuration variable) /Dest [ 697 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2036 0 R /Next 2031 0 R >> endobj 2036 0 obj << /Title (: text to identify model/product name) /Dest [ 691 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2037 0 R /Next 2035 0 R >> endobj 2037 0 obj << /Title (: text to identify product manufacturer) /Dest [ 691 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2038 0 R /Next 2036 0 R >> endobj 2038 0 obj << /Title (: text to identify config) /Dest [ 691 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2039 0 R /Next 2037 0 R >> endobj 2039 0 obj << /Title (: maximum object size) /Dest [ 691 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2040 0 R /Next 2038 0 R >> endobj 2040 0 obj << /Title (: max SyncML message size) /Dest [ 686 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2041 0 R /Next 2039 0 R >> endobj 2041 0 obj << /Title (: concurrent sessions limit) /Dest [ 686 0 R /XYZ null null null ] /Parent 1995 0 R /Prev 2005 0 R /Next 2040 0 R >> endobj 2042 0 obj << /Title (Scripting Language) /Dest [ 519 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2049 0 R /Next 2004 0 R /First 2050 0 R /Last 2051 0 R /Count 30 >> endobj 2043 0 obj << /Title (Test and Make-Pass modes) /Dest [ 662 0 R /XYZ null null null ] /Parent 2004 0 R /Next 2048 0 R >> endobj 2044 0 obj << /Title (Filters in the configuration) /Dest [ 682 0 R /XYZ null null null ] /Parent 2004 0 R /Prev 2045 0 R >> endobj 2045 0 obj << /Title (Special options in CGI filters passed with database path) /Dest [ 675 0 R /XYZ null null null ] /Parent 2004 0 R /Prev 2046 0 R /Next 2044 0 R >> endobj 2046 0 obj << /Title (CGI Filter Syntax) /Dest [ 672 0 R /XYZ null null null ] /Parent 2004 0 R /Prev 2047 0 R /Next 2045 0 R >> endobj 2047 0 obj << /Title (Identifiers in filters) /Dest [ 669 0 R /XYZ null null null ] /Parent 2004 0 R /Prev 2048 0 R /Next 2046 0 R >> endobj 2048 0 obj << /Title (Basic filter syntax) /Dest [ 662 0 R /XYZ null null null ] /Parent 2004 0 R /Prev 2043 0 R /Next 2047 0 R >> endobj 2049 0 obj << /Title (Time zone handling) /Dest [ 489 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2080 0 R /Next 2042 0 R /First 2081 0 R /Last 2082 0 R /Count 3 >> endobj 2050 0 obj << /Title (What can be scripted?) /Dest [ 519 0 R /XYZ null null null ] /Parent 2042 0 R /Next 2079 0 R >> endobj 2051 0 obj << /Title (Debugging scripts) /Dest [ 638 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2052 0 R >> endobj 2052 0 obj << /Title (Global built-in Function Reference) /Dest [ 567 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2053 0 R /Next 2051 0 R /First 2054 0 R /Last 2055 0 R /Count 6 >> endobj 2053 0 obj << /Title (Functions) /Dest [ 563 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2060 0 R /Next 2052 0 R /First 2061 0 R /Last 2062 0 R /Count 2 >> endobj 2054 0 obj << /Title (String functions) /Dest [ 573 0 R /XYZ null null null ] /Parent 2052 0 R /Next 2059 0 R >> endobj 2055 0 obj << /Title (Other functions) /Dest [ 615 0 R /XYZ null null null ] /Parent 2052 0 R /Prev 2056 0 R >> endobj 2056 0 obj << /Title (Debug log functions) /Dest [ 604 0 R /XYZ null null null ] /Parent 2052 0 R /Prev 2057 0 R /Next 2055 0 R >> endobj 2057 0 obj << /Title (Time zone related functions) /Dest [ 595 0 R /XYZ null null null ] /Parent 2052 0 R /Prev 2058 0 R /Next 2056 0 R >> endobj 2058 0 obj << /Title (Date and Time functions) /Dest [ 576 0 R /XYZ null null null ] /Parent 2052 0 R /Prev 2059 0 R /Next 2057 0 R >> endobj 2059 0 obj << /Title (Regular Expression functions) /Dest [ 576 0 R /XYZ null null null ] /Parent 2052 0 R /Prev 2054 0 R /Next 2058 0 R >> endobj 2060 0 obj << /Title (Macros) /Dest [ 554 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2063 0 R /Next 2053 0 R /First 2064 0 R /Last 2065 0 R /Count 3 >> endobj 2061 0 obj << /Title (User defined Functions) /Dest [ 563 0 R /XYZ null null null ] /Parent 2053 0 R /Next 2062 0 R >> endobj 2062 0 obj << /Title (Built-in Functions) /Dest [ 567 0 R /XYZ null null null ] /Parent 2053 0 R /Prev 2061 0 R >> endobj 2063 0 obj << /Title (Flow control) /Dest [ 547 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2067 0 R /Next 2060 0 R >> endobj 2064 0 obj << /Title (Defining Macros) /Dest [ 554 0 R /XYZ null null null ] /Parent 2060 0 R /Next 2066 0 R >> endobj 2065 0 obj << /Title (Using Macros) /Dest [ 559 0 R /XYZ null null null ] /Parent 2060 0 R /Prev 2066 0 R >> endobj 2066 0 obj << /Title (Marco arguments) /Dest [ 559 0 R /XYZ null null null ] /Parent 2060 0 R /Prev 2064 0 R /Next 2065 0 R >> endobj 2067 0 obj << /Title (Expressions) /Dest [ 547 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2068 0 R /Next 2063 0 R >> endobj 2068 0 obj << /Title (Variables) /Dest [ 529 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2069 0 R /Next 2067 0 R /First 2070 0 R /Last 2071 0 R /Count 4 >> endobj 2069 0 obj << /Title (Script contexts) /Dest [ 529 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2074 0 R /Next 2068 0 R >> endobj 2070 0 obj << /Title (Context Variables) /Dest [ 537 0 R /XYZ null null null ] /Parent 2068 0 R /Next 2073 0 R >> endobj 2071 0 obj << /Title (Array variable references) /Dest [ 543 0 R /XYZ null null null ] /Parent 2068 0 R /Prev 2072 0 R >> endobj 2072 0 obj << /Title (Field variables) /Dest [ 537 0 R /XYZ null null null ] /Parent 2068 0 R /Prev 2073 0 R /Next 2071 0 R >> endobj 2073 0 obj << /Title (Local variables of a user-defined function) /Dest [ 537 0 R /XYZ null null null ] /Parent 2068 0 R /Prev 2070 0 R /Next 2072 0 R >> endobj 2074 0 obj << /Title (Constants/Literals) /Dest [ 525 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2075 0 R /Next 2069 0 R >> endobj 2075 0 obj << /Title (Data types) /Dest [ 525 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2076 0 R /Next 2074 0 R >> endobj 2076 0 obj << /Title (Identifiers) /Dest [ 525 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2077 0 R /Next 2075 0 R >> endobj 2077 0 obj << /Title (Statements and Statement Blocks) /Dest [ 525 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2078 0 R /Next 2076 0 R >> endobj 2078 0 obj << /Title (Comments) /Dest [ 525 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2079 0 R /Next 2077 0 R >> endobj 2079 0 obj << /Title (Embedding script source code in XML) /Dest [ 519 0 R /XYZ null null null ] /Parent 2042 0 R /Prev 2050 0 R /Next 2078 0 R >> endobj 2080 0 obj << /Title (Configuration variables and conditional configuration) /Dest [ 469 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2084 0 R /Next 2049 0 R /First 2085 0 R /Last 2086 0 R /Count 6 >> endobj 2081 0 obj << /Title (Timestamp representation) /Dest [ 489 0 R /XYZ null null null ] /Parent 2049 0 R /Next 2083 0 R >> endobj 2082 0 obj << /Title (Time zone specifications) /Dest [ 507 0 R /XYZ null null null ] /Parent 2049 0 R /Prev 2083 0 R >> endobj 2083 0 obj << /Title (Timezone contexts) /Dest [ 489 0 R /XYZ null null null ] /Parent 2049 0 R /Prev 2081 0 R /Next 2082 0 R >> endobj 2084 0 obj << /Title (Overview) /Dest [ 450 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2091 0 R /Next 2080 0 R /First 2092 0 R /Last 2093 0 R /Count 4 >> endobj 2085 0 obj << /Title (Sources for values of config variable) /Dest [ 469 0 R /XYZ null null null ] /Parent 2080 0 R /Next 2090 0 R >> endobj 2086 0 obj << /Title ("platform" conditional attribute) /Dest [ 485 0 R /XYZ null null null ] /Parent 2080 0 R /Prev 2087 0 R >> endobj 2087 0 obj << /Title ("ifdef/ifndef/if" conditional attributes) /Dest [ 485 0 R /XYZ null null null ] /Parent 2080 0 R /Prev 2088 0 R /Next 2086 0 R >> endobj 2088 0 obj << /Title (Predefined Configuration Variables) /Dest [ 479 0 R /XYZ null null null ] /Parent 2080 0 R /Prev 2089 0 R /Next 2087 0 R >> endobj 2089 0 obj << /Title ("expand" attribute) /Dest [ 479 0 R /XYZ null null null ] /Parent 2080 0 R /Prev 2090 0 R /Next 2088 0 R >> endobj 2090 0 obj << /Title (Using configuration variables) /Dest [ 469 0 R /XYZ null null null ] /Parent 2080 0 R /Prev 2085 0 R /Next 2089 0 R >> endobj 2091 0 obj << /Title (What's New?) /Dest [ 399 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 2096 0 R /Next 2084 0 R /First 2097 0 R /Last 2098 0 R /Count 5 >> endobj 2092 0 obj << /Title (Basic Concepts) /Dest [ 450 0 R /XYZ null null null ] /Parent 2084 0 R /Next 2095 0 R >> endobj 2093 0 obj << /Title (Synthesis Sync Server Config specific XML usage) /Dest [ 463 0 R /XYZ null null null ] /Parent 2084 0 R /Prev 2094 0 R >> endobj 2094 0 obj << /Title (XML basics) /Dest [ 463 0 R /XYZ null null null ] /Parent 2084 0 R /Prev 2095 0 R /Next 2093 0 R >> endobj 2095 0 obj << /Title (Configuration Structure) /Dest [ 450 0 R /XYZ null null null ] /Parent 2084 0 R /Prev 2092 0 R /Next 2094 0 R >> endobj 2096 0 obj << /Title (Contents) /Dest [ 15 0 R /XYZ null null null ] /Parent 1741 0 R /Prev 1742 0 R /Next 2091 0 R >> endobj 2097 0 obj << /Title (New in this manual) /Dest [ 399 0 R /XYZ null null null ] /Parent 2091 0 R /Next 2098 0 R >> endobj 2098 0 obj << /Title (New in SyncML Engine 3.2 and newer compared to 3.0) /Dest [ 399 0 R /XYZ null null null ] /Parent 2091 0 R /Prev 2097 0 R /First 2099 0 R /Last 2100 0 R /Count 3 >> endobj 2099 0 obj << /Title (General changes) /Dest [ 399 0 R /XYZ null null null ] /Parent 2098 0 R /Next 2101 0 R >> endobj 2100 0 obj << /Title (How to migrate from 3.0 to 3.2 or newer \(up to 3.4\)) /Dest [ 425 0 R /XYZ null null null ] /Parent 2098 0 R /Prev 2101 0 R >> endobj 2101 0 obj << /Title (New Features) /Dest [ 411 0 R /XYZ null null null ] /Parent 2098 0 R /Prev 2099 0 R /Next 2100 0 R >> endobj 2102 0 obj << /ProcSet [ /PDF /Text /ImageC /ImageI ] /Font << /TT2 2104 0 R /TT4 2109 0 R >> /XObject << /Im1 2115 0 R /Im2 2116 0 R /Im3 2117 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R /Cs10 2106 0 R >> >> endobj 2103 0 obj [ /ICCBased 2113 0 R ] endobj 2104 0 obj << /Type /Font /Subtype /TrueType /FirstChar 31 /LastChar 252 /Widths [ 750 250 219 406 667 448 823 729 177 292 292 427 667 219 313 219 500 469 469 469 469 469 469 469 469 469 469 219 219 667 667 667 365 750 677 615 635 771 656 563 771 760 354 333 740 573 833 771 781 563 771 625 479 615 708 677 885 698 656 656 271 500 271 500 500 750 406 510 417 500 417 323 448 510 229 229 469 229 771 510 510 510 490 333 365 292 490 469 667 458 417 427 479 500 479 667 750 750 750 750 750 448 1000 750 750 750 750 750 750 750 750 750 750 750 750 750 448 750 750 500 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 760 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 406 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 490 ] /Encoding /WinAnsiEncoding /BaseFont /LGLLKB+Garamond /FontDescriptor 2105 0 R >> endobj 2105 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 34 /FontBBox [ -139 -307 1063 986 ] /FontName /LGLLKB+Garamond /ItalicAngle 0 /StemV 0 /FontFile2 2111 0 R >> endobj 2106 0 obj [ /Indexed 2103 0 R 255 2112 0 R ] endobj 2107 0 obj << /Length 472 /Filter /FlateDecode >> stream H‰|RËŽÔ0¼û+ú„âCëD=/}Vþ¾z÷ê%íÇáxº}¸—5³òÕG‰K„êŒ-v§q ·ZbÕË|~”ÈzÜc¼j«~èzZ"c‰Éé…°ªu¡¡Ú(g,ê_%aS‹’Ãe8é§ÓDÙ*W]@ 桃™ r"/TÿLµ±ðÂÒCRÈ2~dÑ\õ÷ô„ößN2( ™g²ÊÑë¬; :~~èÎS០l‚rſƫèˆ=´ä®:çUp«}¼Ú‡fé‚(+kÑÞ‹ëœüoòfÆrü1U‹ËÜZeo316 "Ò‹&»jÚ˜3å®Ô5Âè] ¹“ËîÜæ#ôèTüÇ©_¸©æŸ–>]h6N€00©©&éóäH xÙÐÓ›µË¿¹TÁØ endstream endobj 2108 0 obj << /Type /FontDescriptor /Ascent 1100 /CapHeight 0 /Descent -309 /Flags 32 /FontBBox [ -194 -307 1688 1083 ] /FontName /LGLMBL+Arial-Black /ItalicAngle 0 /StemV 0 /FontFile2 2114 0 R >> endobj 2109 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 148 /Widths [ 333 0 500 0 0 0 889 278 389 389 0 0 333 333 333 278 667 667 667 667 667 667 667 667 667 667 333 333 660 660 660 611 0 778 778 778 778 722 667 833 833 389 667 833 667 944 833 833 722 833 778 722 722 833 778 1000 778 0 722 0 0 0 0 500 0 667 667 667 667 667 389 667 667 333 333 667 333 1000 667 667 667 667 444 611 444 667 611 944 667 611 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 ] /Encoding /WinAnsiEncoding /BaseFont /LGLMBL+Arial-Black /FontDescriptor 2108 0 R >> endobj 2110 0 obj << /Type /ExtGState /SA false /SM 0.02 /OP false /op false /OPM 1 /BG2 /Default /UCR2 /Default /TR2 /Default >> endobj 2111 0 obj << /Filter /FlateDecode /Length 34816 /Length1 46800 >> stream H‰|V PT×þιåíZÁ"«æ®¸»¢¢ˆHt»ÈÃ(讳ËCñ¬ŠV¬IÖ¦–æ‚m£¡ã£mÚÆ)Îä.š„h›’N›´©yu¤Óik›‰1“Q˜”Fk…Ûÿ.â@šô~îÿ:ÿýþÇ™½`†€Š«²çÔ”ù.¯”vymc0ôæšœ.à,ÉìTížfåÀ¶Õo“ío€ØÚÔxçÖ#W©€äòMÛZ66=uºHë¾7£¡>X÷Fš7Ÿâ¥3¹ ¤HZãb¿KrzCcóÞöŠ3¿#ù Wµ­©6ÈVüñ6pºäõÁ½!Ë£b?Ï"e{°±>wDZg—ϤPÓ®fÂMë\Ÿií¬e}óÎD ™Dù—QTw š$Œ‡ —Ghð†q—ôO e‚L$àWÑ[ìñëKN}aò;þ•Ní_a?²0§ÀiÏc9pb%ްX<„õx…tY؉ç0¯CCéÃ1ˆÈ ýLä`?GrŠp QÏ7Á……³EXvSÌV¼Ç Øm!Œ\ÌGVc#ÐŽËl €¿ ;} èL!¨§¨ðmÆ ¼Šw™Ìv³=ìÜÍwñ}ü¤ Éb“6¶C¡lô¶ùѳ~C•{™öoðþŠkèÃç„Áll ³³…ÌÃ*Xkg‡ØIÖÅ~ÁzØìûŒ ðIÜÅgñõ|ßÉ;ø)þïæø€ð°°Oø‹˜-ÎI‹¥:©Kú½ü¢ü¡¥Äh2.7¨›¡·b¦bõp:eOupÃC9TS7k°‰p·`ž Ìߢý(ꄹ Ýø5ÞÁ»xá >aœNcYl{˜•Ò®bkØ:VǶRí¿ÁždY;Î^`gÙìO&rv‹Ý¢Aã\à2e‘ƳøC|)R&›©SOröiþg~™ßÒ…éÂ!Oð!!,<#(\… å|û)džMó¿H*å¿ÅM\Ä{ä]"[°‹ I³\¬fUTÍÖûTHe…b¶¼?!Ôa¾ Œ:µ ¯KÝ+ü$MHþ€³4ýmt×·7Œ~š4…ñt_Ëpx(‰ÐÂvšèšüRšÖ tƒì¨vç-È›?7gÎìYÙ3]NÇŒ³¦gf¤«ÓìÊS§L¶¥MJýúÄ”ä _o—”˜c‘%Qà N¯ZPôÌ€.fª%%.SVƒ¤ŽRt…TÅc}t%uSÆzºÉsã<ÝÞîûžÌª ÀåT¼ª¢¿ãQ•n¶¶ÒGü!êWôþ(¿,Ê‹™Q!‘»N(ÞÔ¢³€âÕ‹÷4hÞ€‡âEâãŠÔ¢ú8—‘¸xbã‰Ó‹ÕP„/bQ†{ó#1‰„J/S=^½Tõ˜t!ìÓ+*}^Ín÷»œ:+ªUkt¨…ú8GÔEÑ×èr‘n‰¾FÙl¦ƒ6%âìÑÚ»­¨ 8êÔºàzŸ.ýæ;Æ;ô%ªG_²ïãT—³›ý¬Ê§Çu3Tù^C™Ž”†=?yj‚WÓZǺ»œå+}v£zÛàJ_¹³Ôlz½©3N¥^õššÀEU ÕmK€Ú¦éXÙbïJ+s¿f|ˆ2¯¢UùT»¾Ø¦úƒžÉ‘dh+[Ζº•Ò±—3b?\ÃHÒ¸{LBâh¦þ¾-ÊEÝMŽP‘™ˆÔRj¾®Ô*„ħê<#ÏüWŸ­6ÜhùÕj3U& YóÍKVUÑn‚Z¬ö÷Õïiä ëM˜¬9÷‡‰ì#¼îpè3f˜3`)¢¦²EQyžË¹G/WCVE/§’¡ÂG‡üùÙTr»Ýì_[·5$èáJß°¬ ÆÖw¶Ã¯ó€i鱤T›–ðˆåþñ€Jƒzæ÷LŠ“yÿoœuâoC¾Î&þsý°.†W‰ˆR†VáË jm¶Ì€Öî§ÖÓ%Ó´bU)ÖZ°ÛרŠUÕ"ååZÈI©Û8ßfÓ‹Ûýº5ÐÀ¨®zÎpAô E>ÁÆý÷ Ä•¯RË+×úò¢}ƒ L¾:HßR1W†>úOÌ(ÔQ‹?#p÷ˆõà1ÁƒýZ¨–;P&õb>ÛŠJ^ójã’° Éþ4ùVñ0–Òs¯4 =(!:Nä"ZA4Ÿh3QÑ"Óg-ùï&ZC1ŽŒ¿¿¥Ai«1 ^‡MJ_v`¢äÆl1Œ…Ä?*§`:ï…ƒw«¤ëÈ;/w"‰li²È/“ø Ìz±L¼nÜ•:‘A1?³¤}Râ$7=Ý(á¼O˜wp‡ÑKÏBÆ Þ‰·(÷B1Ó„j,'}‘ùäP-I?•õRz)~æÒ3ŽÞ—Nz•¨”(U¸ŽbŠ“Aùì zå‘lzŒRµqMèÄdŠg¡úå ½Ì&‚]"œÊÿ‡fÞQ¢¼ÍœGr2ñ›˜¾”Û‰õƒ£èî(lc(Šk4m¥Fj(Æ ªkÉÍTëÐaü‹ê0Žjï5ÉÒ‹©”ŸY+sFŽÈ½Æ{8g›3At8JTg:—M± ¤spÐÍÝpR½ù9¯ب®+zßßÇÌ<òÇÀ… µ±Cldÿ1K &àl†ÅqÌÅÄ6©€KLU‰¤…¥‰Ú4ÉÉQé2 -PZƪ¢¢V5®‰ ‹²¶a1K#µ LÏý!ÓªËHçŸ÷ßrß{÷{ߟ|*bá g*GéËXÏ"ø«šØÉc•M´ gw‡íC Ðæ„AôWÖhÖW<¯ÞM«q®‹øü çÔ Ì‡­ ÀZ¥ÆÊ·°ø×$ºï¼¯n¢ßˆC4ð*Ô ¬Ä~MÖ1°ãÃFˆØóà,î2`ëïð²°µ–û{<4O±¿¤£"~À€“ÀAå<ùG«X³¬Ö'k„õ¸•­àµóX㬳ŒŸßƸN ˜¯¡lû‡Y3¬[^ç]ÛÐë$ˬqŽaGÿ’噼_Ö×]nLß°yÄX;>C4›×Ⱦ±Ûþg×t#¶9¾Nÿ× ¾—áO2|Ûah ›÷Ä>N/Á{çŽI Èycó^Æ_:›¥Wì˜-ä¸Éðg‹šF®:ƒ:Î'ˆ“‘̹ÅÖîÎú7Ëœ{8þ™áãêÌ{©ÏÐúËvÞBîÈžVY–öÐâì9q,rŸÛc¿³í¸Ëä\õ«È ¬}>3èRO³ìýÆpïlG< ßjyäÒ¦u<žëå?Aow¨A¾JâüÕH\‡÷}òãä’/Гv»Ëé#‡ì~ßGn]MJ˜ž“5šh·_G;‹\uƒH—Pþ=øxg›×ð>@劄|wwÔ¹ôÇv=sgs±Þ'hª­i>»llCWúÓ×õ°ÿ<Ü#aïö.á ÙWŸÁWì/;+}–mùDÊbš T1ì1YeüÈãm_a>û~‚MõýŒ¯tØ®ÇmÝF¥Ælô/!ÒÁ<úÏ3ÞC;¥3wÔBy3òÆòAó.;Ætø7gÐD>†¼ñp9ãçä²ë8÷;\`ß pASÚxh w“Ý6ëXN>†òÅôß•;¶Ÿü%ªÕjÀXŸ=ö6¾xîF;wosîE¾sà.èô'ïB_^ç-^Ïeäý_“'«é‘œÕ¸†\Äùˆó·!o­ÁÝô ù›é9CÓy|GÁß“´fúέͨ¾GË‘ÿÚ‘ÿ+e¸3#þ^Á/2ôób£š¢âþ·ÈÁ/ÛwÏy©D9/Tõhú/êQi·ƒlù^ ‘rÚ˜÷¶ý¯õÿ¤w3( ìç†ô.­``ߤ"Ê@–ўȠ˜Š~‹ {øóàÛð°Ú>T{þ^š„úÆì݉óH!×ð¶€–ÑÒ¤T–ØPj&¥)'Ú+ÍC[*QœœXÃ4)±£Ò çII¥ Sú¸\*M´yb"ÆÝŠmL±GÍÖØBÍÄ“ë̤ø01ü8Þ&$šÛ@ã­üÍ…æªË<Ûz¶ýlLllŒÉ¿ŠÄEÚ{…âbb»8->¥rÀdñ3NTšW“"|¼Ò¬„½"L)`òàÏÔÈa«TxúýVCwÿp¿° ñþ¡~5Ð/è’çRÃ¥¡K×Ԥȷ\ÏU˜ß‹ÃnQ 5°W[„g0`¿í5ÖBèöÆ{z‡{Uêõô–÷Z½ ½-½e íhçV#€Š¼(9´W<ß›Ú+Q§§¼G¦žW{zdOxœ(ÆlÅø–ïÆS[\ƇÍeÌy™jÅÀj`+°0Ä«ðgÌ*ꩾ¾¡¾á>…úÊû$.Io‰Å;4&6¾ÙZinXÓfV%…ïxä0³÷Mpõk q2CVþ˜9p¤Â<™enˆT˜ÕÛ"gÐ’k倫G Íê¤TbùÖL6×´•šU;`±º=6Mù­)8ùêV~äPÌ“ꢱWcñX*6S[bí±îX4¦Ä"hO 5±ùAXk=i3wU9îˆ{³ôØfž–""IE"C‘ሺsË,Tmôl »Äð0á)Ĩ${»`Í@§ÜÑ“ãÉõär¹<ÍÔËtIצšUn­L[­íÑ~ª jiM/Ók’ ¤A'L’ LUB1a*LVЬ2å2Y’% ¬•¶J¯H§¥k’Jóæ!}^ÚHŠŽÄü ЇÖ;´Î¡µ:4Ö!¿C>‡¼¹ÊuHsH±–€ÿ ¤€·€G€ðp8^v;€m@;°Ø´ É¶»Ñ1ßæP‹Cã*phŒCn‡F9¤:$[Að0ü8 üxØ3¿Â›ã͉†G‰#¤CÃ/ÛÏZûYfYzôWzô%=ú¢}Vvëѧõèj=ºLŸh”ãAc¼Qh~cŒá3<ÆhÃeŒ2 C3C2)­>žzšê[ñO—±´'–ÇÕ`ˆûê©~i]ˆ? ×KõKêâÕ¡zœâWâU¡úxNC¤é˜ßnFm\úVRÐÒ&l™«öÅ}³›NBEÏì{¾ˆ9ºïùæfèþ_Á½/¢¾açIhnÓ Ý¼¨›kuÔÕ/AU”«¢õ¨]U mÔVÿÔþ– tŸAñ/&Ùeî†%u˜«é˜AuͳW8|\Ê…U·7×ù=íÚ[¨).Ø]t 6Þ ÜPsܬ‹çÜ4-<-ÌMnjw¦©`wMqÑ)ñF¦Éƒj/üI¡uÙK N»l¿.‹ŽÎPhUÇªÌ »:ï–ÿý6::;»lêêìèBPG Q‡à:»,:).Ï]Ÿ”ÆÎ]·ö·ÄÁ9q+ 2%Á9ðZg§ã»cVln î—¹ûñιwF„(ñŸLìßÁ2ä´ÜÊMÒo !nzC>)øk{çÏT[‹çôòéÞbï¤bo±BŸäÔç–JŸQ@IÁÒ®ôGbZDùTL —LIñGkÚ¸×Í\÷áœF?‘_QÆvû-¿D~óøÏúý×üi¿î÷K¼¾™e+ŸÙve×̲¯{g–xn]¡ÚÛWk§—? KJåÉ¥“g<üHe…?Œ.¹…¦g^Ð8ùæ(UGÿ“ðj nâºÂ÷îÝÕêåÕ®´Òêa½,[òS+Y¶dÙ²õÀ6¶‘±,?dŒ05P¨dCp ÅÓRCi£å2&žÐ‡Ûñ”$iq§)ítš¤†N§£i¦“1¡3½+HÛÝÝ{wÏ=ç®Îê~ç;çò•ž ï!äðP{}m8á¬ì‚˜¢b‘ìá`0jô¾U|wÇçò?×¶·¹Ý=ÝØóo!ñ#êë@ Ì %æ(<¸+3— œ(Î#á<Ç•Ä"ú5úQHÌb7ól>Æþ†˜°ì!ú¯oȉþÇSô›¡¹¡®Í„‚¢Å[Ö…‘ Vªµ¶‰µ§Š€•M¦hk«8´£øGìÑø“5ò®Ò,Àþ;!W©5,KSv›–ãdd¹UÇóšM½ž`Ê” ͲÛ9•ˆç·ë +Tör³ÒrEN‘P¡Á zµmÌzÑTf¼¢Ñê Œ ,Çëi"X|ÜޏÇA–ƒÇéqõl‰ )aB@‚àt”V'‰D!çf³BˆX–VE¤£‰<|ùʲ$ãc‘òÖ-°«‹^£tƒFɘfK*<°ú•ð´Çÿ¥S@R è]È©w"—Nj®æ€®bÅ8ÜœÊÀ»C™ÌÇa[ñÖàðP1øüpú·,®Â³ƒðÃAt^)NH-SÜ“)æà%©eàùâ^xC~°øÔNu€]à›à$¸nÀÜ{^GõTË1µüä³Û²o÷òdÛ…‹$¢Þ8ÙÖ&%xÝÅ/-QKmÔIò´ÿ…óäÚeh‹xµÖa$Œó–´FïœWÉÓ;%•6;ØNÉGÓÉ“x&yíåeè¼Y¾fY†÷c]›ÖbÉTr"9“<š¤4I˜L^e×4Ù‘µÑÑk/ß‘Ësϵ;l|&~4¾'cñÏâŸÇQüo¾\,—ÊÉ‘÷r0'Îf ³Ù|XäbGNþ‹¼´xè‹ü¦-™XgoO÷շߺþFK¨9àwØÊÙM©-ƒ¯œ9{îÕóöMÏÌν`4YøäЩK¯¿vq÷ÂáCçÕ#Y@ òȱ—ŽŸP—©GY!òŸk˜Ó ú¢y!œç„pôp@4>` B˜-`+KK$»’mK¶ø}UÁ(ôx QØÜ z$‚AÀÏ+‚ báiD{Ü/ôÈð AOìÐðLCãS/ð´ GX(ØÜän–Ñ ¤]ÁfiB)êƒN²6ë<¡&ÛUA 4~ ï ¶C<Ã#½Ç6Æ(ò`Ù zƒÐK–5„7« !k?šß§•UQ£ÙÁ—¡:ÜJ‹¢Ò¬s(ø€ÅB$!SŽ×˜|Zõ„^«D2 iÙ%§ˆ*Ħ§*…†˜8`Ï©TP¡ÜWWQN`“DPý.æ@CÈd ‚hc”RC¸Ò×[f5ºª$hØÖõ$°bÞµ¿oç%§Œ‘÷èƒ$ ÈðQÝ¡ç=y%g6U˜Ô†^þ†UirýBFuX\AwëžØe Qñu›[«Ù¨gX‘£ˆÆ«îÔ¢LS~Áù|qC+ÊQ¥ V¶ZëêÊÓ'Zl^ЬSGG*ÔèÄxÂ÷bp4ÛyõXãòYq»Öç¦í{ûël “›×©µ¤ÀÕ÷äDzç(àpðØ ~Ûªb˜ ç«\žÈ­ ë5ú°¾Wÿ{ýc=¥ÿȳ¬­÷­¬”µ{Ý Fº#÷#ë*òQr½º©¥©§éË&²I©’ÇC ÐÖöÞ‘68 Ýô¯Tà2J’´ðXµøÙâp=ÆÏøWü÷üˆõCg­”ÿŒŸô/ßÇÔ)ã„ñ¨ñŒñ#e³Ìc˜ËÍsÞÌâN¢ô­G³ùB6/–zU"{Fc~ÕCøº!UãKWÊA“¾` ›0]Ì¡ ü?êi…QG/šàO?PŠ²â¦»iªnírnò{Û|W÷‹•ÂŒœélÜh묨'^Éí¸XmÅšÃ.ãŒký‘  t•Õ/kˆu¨¨°µø^ñ2 —îÜzmïxwfl´}á\C2¶ÿ“3¾h1}éý[ßß7Þ5<6Y8ÛÐûä<Ž+Г¿P·ÉŸá=n| vÆæ¡ï ,p«ºAÎLi&CУª,Ci §A6˜N5W£Í!wýäc'T:¡sØ& ›m6³9U_ŸÚ894¹sr}’œ¼Þ¡H­¯Ë ¬úz£Âms"»Y๪Pxˆ2)€:=Föíxãû.BýÛLïÃ>¾e·{û—ñêj€úP¡ðnÛ ¼Ð» ¿Œñö„˜ˆ&6'¶%¦G§—Š^¿Y‰³³ẏ…+æÃÜSNâÂQ¨´ÊÑB›am@d1f³žÚà‚º:•¹™v»ñ¾åvò¡|…a‰\™ª*§îK§ÝøÛdpB[]],Ýä«Ã~˜…³ð3• À%ª‘ê™(~ a:cÚ%0`úÂü„áò”ˆ0·¹*¤ÙØ,ˆÏÒ¼t!®‰¨çmD 12ÞüÝÅ…oíqõ›ËÞ|®ª$ö»ŽÎd÷Ž{ŽLµÅ}†RtÉÑ–íM¶ LÊÓõÃÝÇÞì¯ïi×o ü©%–élOV‡aŸ}Z3½pÌ™>>˜»L|0?È?ºmd^ôY¹'^¯µÖª•”BE‘ µLeëÿûŽ ]9®‰ºª ]õê”5к÷ú@dzs-Scê3ÎŶíì 4G3…WU$T‰oo·ü›ërmê:ãø9÷áëëkûúú^Ûy`ÇŽ_ÇÁñóp yÜ„,NðHX ”"d<ÒP” ²AYA¡aH 2hZÑNH[@]ȺnË´jÚ£TÛhšBGºÑMÝ´JÄÙw®¡Ò&Ë:'öutÎ÷øÿß¶®Š•@&«†ò þ ê.@/‚]:ÝFSИ€EÚxh°ÖÿÖ÷ª<± á©Ã%ÀS¥‘ÑÌ]{ÑxÆB ²^Т .S2("*`hò}Ë¡ù8zŽd¿]¦½g±SKà 0ñ§Ç9Ià©nA77¯O÷®WS–\»kCcÿ»°yM²·‘õæç ‘ºòc7Mì½õéáT‚ϵkå­Ç1üÉš84ÖóÍ„þ±â)¶¸n¥žB¢Ï|b®§ØsÂócö`Ï!ÞáC4‰Ãâ¨8)2Htˆ~QÛÄnøsF¼%ò"Ô3œ”é³óÓU_U¸fXMœÄ/)â—\xq«)¶¥0^Vu¸Ñz@YýµÞ®@c{ÃÁò´%£ûä¥ËN>·ý#>þrƒt Lk}1óxðÝÎý™¿\88PÎ…x.ÅŸÓE¬¥±I?à…¤7 ØT›*ht’Nò µIm O•t:È š6žà•D‚GZS’V½6>hI:A©Mt¦Óµ¿Qª–`‚5IoNuS~®dsÈõŒHѼf‘»¦¡]¬n¯iÏE Á0«^Ï—`Ñý£@l·Ð=ô±Äj¨TKêC䑊ù"ÛïóssŽ9G izO꙾gùe>7™#Àb/-9n? ˜J6ZjŽ<ý¿«'…=r&Û¤UI„5ª<.hN’lMÅDxÄÄ©á ¢¾©ÅõÈei,cu…Mk'%åQ%Æ[2T(â¦)YvÞèå}ß±Øó9˜²RÃëuø1KE®ôP,|‰·»è2Ëò°Âë3íê)_‚Až?+™m¹‚uY·?(l©2É›’YÞé ™:íIeÑÍšB6)bþ'1eOdø ÚμÇ| ¨õLjÂÚÛ ¾ÊY¦±¦ÇxÓ)Æü2æO!Á/hB·pOx,˜üÂ^á’ðCaR˜nÁfM(Áˆ= ÿŠ z©\—‚Rà þ¼?ÊH…º’Ýxð'¤c×e.ât å¢5?ˆC—§ñé©d:äÆ0M®Ò¥Q÷ûÜÃîQ÷=7ëžÆºÔ'bÒ úÓ1‘ö€ÖÈ@ƒ 8qv‰dëiw¨F v44ÄŽ×a«µ7 s“h-r¤dE_ÛDæb‰MìŠ.r¹\&Æá’ãRð@Gíér蛪À?ƒI·E/eXŠ“id¶wJl'݉®J)\»ùïmJ·Ò§ +—•IÅäPÚJ‰÷ƒêHDɾ0Ê’”¤“œ®Ü“ô$Øß Ñÿ8®Xc_õímåéBª. i–¨3÷HœÂï`–¦øV–¦1¼9ÑÀÂ}Ü‚~™+z›~ƒ·˜¦qžnGà×~D?"ßÍút »+Ӓϼlf ¡$º¤¶$Z·zqc]<®7Àãû3ŸÑ¯°¯ $ô|„)j+š†o åi á‘þ€èò>C•㎇1ä?t„Ëq®è˜¯ßÀ¾úåF˜f[þJ³9/õëËòÞ…“ Ýi¾a¦Ì6u ¡ÀÆ:ô<†"œ@×чèú'²šnƒ†¦x¸dÞU:¿D¤ÞÒÅ÷ýØ?–´¦­ë­;¬ŒL¼k¾kß–.xõWï‚Ëb…ÌÄFÃ0x8Ÿ!X8‹`œIr„U9UzXÌïnÔvW÷\i;vtÅ®›5‘sXZ4ÔžÊ)Ú0”ÄÔ¡m'ßÑã%#XûÝk8òzË[×Mþ»ãÌþÎm—2?ÍÌ,ìÆESp ˆ¢þÄ:QZ}= »¦ñ n ²‰ìFlÍɱUVLc×|~†­îm“6 Ù4›n›µ16[U%Ièü|ªËÐ(HP Ñú¢q@¢÷µÊXNªɧ|™õ€liÓ_B †ø¸¨Û™*l/Z²@ÙPußmvröJsíÖMEȳqo*hZÌX`•lœUrËu¦BÌ|ö²ïÒ„d¶˜l>&±ºÓ„¥Ê'ßêð7ˆ!ìÃˤcP'ྵè÷zÙlñl”Ϊ³z\ŒÓ®ˆ«Ø¥e^¶È-ðüñ¨ªD£j^ž*H vª”/Ò\默E¾ ÿóöuÊ bÏê_°|TP;ÏårI.Í}ƒÛË q93ÇyëPÅ¿ R“)*•ªyÑŽícz¨/t94bêC[CgÉ&ô©Ãë÷j^ÝËxã¤FvÑPÎ"`ýÜßÈ똕OÅ¿"}ÔÕ…ûûû‹ %UŽ=¼œY3|5v£¤ÙA@_îI€9$ˆÎÃ3tï¹'w·®´zœ‹Ö^¾wz´·þ`Èv1&³YÜ|íÀùß¾òdmó çäû—Z¾ãÑŠsX K™M0Uš Ç™hpÇka¼ï…Ñ¥1ïá$[ìW}ïŸÜóу-&$ïÀØÂš½+c‰Ö…9z;t[:¦Ëj8”‡5„4Ázg „C!Yƒˆ^gؼiÌ땾£²MïTcOlÌl®´t`ìž#îvŒ:&7Œã׺gÆCÍ¡€ŠÌwõï›ï”f&Ôl Lósõ²I\Ég’Á%²J‚ã1¢“LøÀ—Q8ƒà<¤ïŒ`rÙÈû«úìßݰµç¥œUgÖe>þó•Ö’`^ ¾wÍK3G{–·å$"ƒ5%}›ÏÑçh-›ž;Û‰[ßìþEæ¡–v†Ú?¼4òýæH‰oãúºxë ”\x@¿ 1©CËÑ{úÎæÆææãÕH©®F¨¥ºþŽõNÙ ÛíÕ[îÄb^ÄzÿËtÕÆ6qÞñ{žç^ì³/wŽcŸã÷$vâØñ»q|!¶ÏI€@ 4@’ÍM2²á½é ¥Ðt D¥›ªò²F]E×5¢íF§f+›Ð&õÓ6u™Æ*M]T> ÄV{žs@ÕéîžÓ݇çþÿßÿ÷"”—I´ð6;Íý•©tÒH­*xêZPžÍX3µ'’©ÌJΟFˆ+äý§ª¸Sù7ªÞ˜×nFÒ,¸¤ŠGÓ/§çÒ(ŸÞ(`¡HŠ´ ™\/â'Š%g‚¯E-shõÌ“¬‚Å"zka‘¼% ¤1*©áXÖ"s²KñÂlM®,+³"¨®Ã¥Ô4®$'¸¾ä(„9Qc‰ 7dð| Œ5hYÕ–0Ç$RB–ËUÔc†‡AÙ( Br{¦6¦‡ÐÙù›öï Øpæ§ž+(w36;u|jÿ9'&(z€§¾Ä¸„“a_^ËOËsVƒÁêŽá#§ï5} ¬ûîçÿKAxÇÛ¨—qPEê‚Z‰‚€_½jek7O:+ …ÎÂò2fŠ'ÄWE$ŠîNˆµÚ 6]^O×Í‚¿©‘Ø=·`ä;Q¡à£úúz—Í.ƒË¦(Ûœ Úlý’ÏëKøZ0%0zÊò¾( ²¸%µrRcÙ[ J Èrb‰ ʤækךIåqš{TT2Ú%tË$3`/8Í^hè.y> ñ,ö…5Z0A—ðN>j,^á÷ðîžIÅÃŽêi€äp÷Џ¹?Ø´Úc ©GÞvnîõá*±|#ÀÚšëξÂ/Æ”A“hdŒAÀãIœ‰“Ø£›êŸRœ"+!ècz±O‘¼-›YO¥ïÛ½êÊ5Ï÷ô'€À‡-‚EªÕ'mDë|›_Xú£Z™eP¹^Wߌù«¿¨– Œ`‡Æ`+GØ~+æ˜aÆ÷¯¯PÙ‡·U‡lSβ¦ø dŒ0ic€iÉjS\³ KÝm÷ØÇ«{èôK4¢ïQÕÕ‡ÈT™ÇŸIO¤aZðx$¾Ƙ‘§¸°® …Ï„gÂsa.ªÝP„o¤¥•ÒF IS^%¦¨ÊVåCåºò'…Pö(cʤrAaÞÕ´@ ŒÅE|Å¿h"êIÜ€•ŠÒ¦ùx,FFp~ -%?-ýw©‚ô h=#£D:¼ÔK|py &Z‹Ef…àó`(ûd»S‡Ð«#Ë·7íuXtB™½ÃÀu»b•_¹‹ÙÙR^³ñ'ï^›z¯ëiÆ-–hC”Ò½a×;? ùǶÿlôÍó:è2YÅ2±ÂŸqõ²¶öù U@w'îl[q®¡‰ôᩇ_ }ôª@ízßf³òجßTgE àÌdì>B&& i§Õ.¬N'ŸºÓÅð3<òðGyHñ€¿áÍÅrjn.GGs»s0GL"©ž€$‡d2=žé±&‚„-J²FßIyðØRì!³¡•Å\bt®¦®š0S]íRÙ05¿’~úÙÏúG;äAY'6³G‚\f2Í&ÖklrîG$E0gÛË_‹¶4¹ à Œ¡@DCú6ñ¾:Ω¸Ž]×룱b½YôJÒòÁš?®éã»ý¢ßh@àjË®Òènl¯ä±ŸÝ‘»›1Q*‰¹ÿêÙ¼”olŒ‰Ÿ0£&©©<Û‚ú¨Ã)£TÊ+™ZRz[`\ÖMè~¬Ã£´={( ³ã6Û ÛY² >x~ãSU ]dÅá»h0¨u–-–IËŒeÎÂP–˜EÕðRµ `svC¹(:@Ì1递Ãëˆ9T­§ ïp´µgBÈiïÈñ‘Úrí‚%‚`¹ˆO²3®žË¦htÌ[* l9©5ª—¸—PÄè.{døµCÏÐs´>ªÝ}Ã3‹«ñmñ³qz2~!߃¸F‹ø4UƼ±!,ÞÒì )jnº–ÁxdÃ5OH*ȱ¥¢-y?-s”JotxCgÿÚ¡3òÏáüðŽöãÙ®ÌÚöd¯·LÇ댫Róì§7_kÝF_ízb×éé‡ÔÕg¶ê‘(ÔÜ> RŸÿ´gÍÎßû–Ê"^”ôwm醓X,z@òõgtôþ tu\_®õ?Ø÷`/éúø?áåÛÔuÇñ{Î}ùú__ûÚqâØNµqâ8qLB|yš@ž—à@xHRiLÚ•T)+*4´£4•V$¨4µBEIÑèl+Ú¥šVuÚ€¦ÝРZµAœýÎM‚´¿–«ës}}ì›s~¿ß÷ûùíb~CŸ]㩚MQÌÅ‹<æ1wnÞæñxx^ÝLD&{•/çÛà|)|“œô©Ḭ̂ö¿«|NÍã(„zX–ÆaX]49Da†¦ViñÓÀEô1xn™ômш†Ç~«¯òÿ®ÓŽdT% ×™ðãÏé«O™Ý™xS¦n3ÇÀ:µÙ»ø=Ö=M=µg‚*S3ú,a ¶XÜ6÷Ï—«Ý7eâuŠUÿ¬Î$_è à@@EO"ê'Åß( HDMü”w¶.«•áJ›4_ïzÌL‰÷çÞÁÿUB*…qT/óy*˜ïúôÔÒµ”p‡,D?M8˜ò}14c…ÝË­9[¹ªñývOSLTг•gÔw7.OÕ­¨r÷EŠŒ´a(wQ±R¯(\Š–˜ì&»ûT}o‘hƒäÞ‘<4.™>Åî©ß´üjkòHÂ.dñžlá̓òÜBµlqõRØ£Ùï(ŠíbÔ6ê ÂjcgߤëÞnšªê:èÕ+nß7È¥–íÚÓ×Ï$R‰AÓáSŽ¥©ÔÀ€¼S£ÅÆæFº±qƒLÓÚæq4yyÃz­ó*š¤6PÅhR—ÖhZE{©Á!;é€a { 4@ -nOÈSåYééôò¼çá=‰MÑáè;Ñ?D¿Œ²ÑqùèµÀ/ (ã¨Qu½œMá”×ÚÞº£•n½°y òoA[@ƒÆãÐaÎÁ $=• T.N‹SáGÓâ£iÒ¥glñy(!‰d pâ"=Èt:¬®E‘XõÓƒðHéöf'¸îÕ¯ç¤.Œ@+@Î —$î‡:ÇòÁmˆªÎÍΧ@°*мH‚èøˆyS–ÉÅÛÖfº£ >ƒÛÕíl•½y…%ùRÑÙujÈÆ6XÊ$†ö[*n;lv N“Àš»Šd.GÊMù&E¦³F O˜èÅÙÍ»+d9Z`Í ;{†Ÿ­5Zø.#P=Ïû ˆçíáW5{Ý2Ä×ÿ¥¦£¶-Ñ™í½Ö‘ňŒE0q,ø$"b³,â± R*²á1ëµd¦ß™cÍóX€šãñ6Ž ü\ú›dî:×\ëAarg3Ì+QQ*EõPª‡EQµZÕobßÇplÈß::r8J£ñ[*R5Ž.Ô.¬ùÝšÉ5ô-‡ÑC‰¢hí^Òg±ê•;¾­ï£ävy§|P¾)?”9¿IÍ@Gl9@–å­¡Tº»‹õŽ”‡PyH aCħ§¦f¦H•êœO‡!âƒTx<ðHç%H"ðn’DPËUs±p%5kEs=S‚惛ÃyâK‘ÆW4@z.Ì›»Ìûäiêʰ~ÓÅË^œk3vZräRÓ¾Á?²}¯(¹™ïîŸý´ °€ålGò93éDm Åh_$ö§·r+;ºÚV¡Òˆÿvër_[8¿é\÷'Ø-¦™[>±F»•3]§·òzS1íÌ=Ó&3Ë19v9tÁêZnìE†ßÞp›i”1¯uw$myvÙh {½‡W¾:“ä Å–ýÕE‡ºjy—IIµý£½T^›ýšù Ô4Fý¼–1Ð&.Ï¿ˆö:9Îëuš´*Ú©…iúºJ‡:-äÍóüEŒä÷«¸ïůá˜Ã?`%Yêh©¯¼l´ ¿S†ÊÂzë5˜Ž„¡!,é. Dfá–¤—èB5éÜ”EË ú ²±žžvYetU´ë¢Ê¼kFY³Ùá‰>É<íp¡8DÖ»s~Sò(jŒÙܲ`•YdàhCyCчŸúæb›ÏÌ3ˆ7°\uNbß©%m'Žý8}©ÉÅܲEÚŸü*c„\¯˜ý'+2ÿ¡F©q5Ø~§IÛzÇßßÜÿBÿý¿ì¿Ýÿ°Ÿ÷÷—÷ãþ~_E…¯ù8:~üdÁÇàvAˆßRÍgÓrÉ;/ÄÏèï¶ÑNbí4W-9Ùz`cº{çžtw÷þÊáá£^zéÍâJåpº¸øÍdz?DE)P+‘+P¡GÓ5D–fâá#:è^FK›žJLé™ö1äœ6ôie޹PwRº³ì¨-¤6àx6"ó å;í dEy•î ÀšÚQúÃÝç?üIg½] ¦ûü,ÍSHªð@h¬P´ðÀ)fΞ_ã¹B’sôæ®óÅŸƒÜÁv¼Ë‘•/˜{ O¼EܹM4“¾wÏ»êï66cÒôgLš~²Îa§u~rŸqvèX™P‡¸‹Æ|ã*eX¥7]å´k@URù‰bOñ…‘âX1SØSø~áýÂBáËÂJõš daIYS¼4ÍÏŒ¸‹Dñžò@!ÇñË(˜u?ÕVR'²ÒåÇWíy¢ë‘Iº2õ Ëïñ´–0ï*¡iwóúKs%MV܉yeRFA“B ÃôT¹¬*=Z†e»‰°Ûú°@³:þEµ Y¦E#æµ4¯šEå¦V—%ÛÄ€ù|øÉùÇDŽ€`c_˜SP¨ƒstÄ­ pÉ…ýã©#$/ž34s&ßx¦ K p¯Ee‚üÆ‘]mÓ€·6€ *O¶;)†áŸ,äΤ¿gφD˜â<_6¹\»C®ã´ ×™ßsAŠœ#Ì&™W<ªÃÆð6KM0Û»-y‘–îïøvx%†¦D–IÀÑÏ ")FwþàZ†(qp€º~å{^ ¤d’Rmè» º¦Ò$¯D©V<ÚŸ¿þÃÄó›| ´ª6…qÚdÈJV–ñXC³Ýpû…âeŠÀêêµ\ 9§íT^`ðM€¾"@¢ˆ8O¯D>ÓFÂhå† CÎí7¼rkÝd k¼kª‹ò“Åú“° Rœ…—!µŽÃ)HAØÕY©0&šò¦~?B Z2M¿´D0nÐYž¥ œ$³.¥³0¨Àf‡«€qEœ„¢çŵ€FÓ@>G³k~$rà)À½EêñÝv $C“¢Çs·ªÔH´*ó­/lžZþrðk§úwÕ7[]]½Šl“9X¡¦ æ ŒdM¼Xêy{¨z¼ÓÉ€TdžCÍ æ® -ÿ‹L£}ÙB<“AFοÐï1jcF=Þ¥– är¹©ÜlîrމÞw35GüE-› hM©¢fؤ½ª]Ö~­AÅÜ`eg,ɸ†6§¼7Kñåu¨ÉQ¦ ùÍrfîRª9B¥Ö£ý‰c´¬fXxÊ¢ggñæè•ÄccÑ…Ä~×ÒPeMÖ…mø4J-6,F×.6Ò u5|¥¢ kéÆpø Ñ«áZ¢·6~‰€èº‘€áZH5ö¦ b,7 Ét—ц§ ¤¹jýÃ.V,•vò9ã+XF÷cdÎ(â¥Óß0^ÆK½Ó\˜ NÕBåÇO{y¿í¥¼Þݽ ·q±tÜßÍØ´DSbU;{›rd}»¬ N:¶áÄ{#ËŸ0Âè‰/:D«ݤЭ3Ãë³5ÿ!ºìc›8ï8~Ïs/ÏÝÙ¾;ûì\lÇq_⼜ã„$æ%ö×Mhš„8 x© …4qÉB mÚ DÒ Ô–d”Ò±±nEë`iU¥Eí(+£-ƒ±¡ mQ§VEå¶nÓâì9Û0Yö#ß‹-=÷ý}¿Ÿo•=Ü6¬%xƒ·ÕbfŒEÖ¹÷î!>k0o»Ý_o4a`2ñ†3 @ù¢Éj¬/×n@ˆV6§ÿ¶iF¤.t”Q@¬‘ ”lTUíÀñŽ4ÍÎi©Ø<¿äýòäJ«Í€/ãšÇ䂊ÅÛ@q.k£œ>”^J/Ù‘ AìÝ<A÷EÃò¨ï㞥Ï?ßÕ š›Û%qOÆ市×_8`C¼ fsÙÕÆ¶¶~ã)±Ùݬ5w64ÓÍÍ%³þ>bÖ6Íiºbé`Éh™|Íi$ã 8Ts…¨Aö5¬¬Ï#~r7Ä£Õ ·•ÌØ[‘M±É¤¢G^m&ˆ3¯Ú¬PJа8 u¬«xˆ°É“9¼SÈ•stþj®k½0†yAÉo‹ü4²*R®ÐF¹Èà ¶ºôátá· ÜŒh´!ÊbŠö/š>­ã-FÖn u«Å÷†´Ø bM-RÍš‹¡ô¹ôgM…ø¨4ª¥¬äèP‹^è·š Ô9HXþš99h wü†û¿ý•;—µ<}˜ÚdÜ·rn‚Йïÿè¦S¢1É]§>Høðjά@æ®’býÇÜëCF–g•ZOðÈ̱ΚނˆŸ‘l<]œ©©GiÄIAEò² Ùt YT÷›0Ò°žú1ªW¦?j)ÇpEz‚!G"ÖáK+ª*8%™þ Äò& l/S¾TÜZöˆbãH–áJNýlB‹C4‹,m¬A‘4Ïõ/ͤÿ äë’É\1ÕXöº‚ 42š!m)è¨öKŸ\8°Îi´È4ËáX%)ì%m–KSz~~ù˜7Uʤ߲>š:å¡MÆ}"mø d Š~-²:A^¦–(÷sÇŸB¹ð¬ó­$³—:Á+­ÎR¡²ü§…áÁ¹¯¼ =±«bJl·”VI,DNGAÌSýxƒÍ ¥Æ|åc,eJó^ñ›{…h×­/Xè y(ïÀcˆo¶Ì<Ñ.pfàÐB.Ùh !40ré>ê?Kogø\}dÇÒ_ûVISìšþÊòk®7Ö@CFV`(7"‘u8Ó G+.]™óì¦Ê®ÕX·4¢ñùÀŽ–B¹ø×é·Òç*|,gaÈR²4€…F„µ)<4ÙôƒC àÝb‹àtVë_þ’þ3m$ ˆ:â»aõ|àý$êr±åp®”ï¹"g]§]еç P8íÂòÝpÐj z%üÁyíÞ¸÷‡"åÝù”x\„âZ³i=ÚiíºF3Ðvº ?1J#¨×‰»ø/‚~b¥ôÏdâN2±”¸“¨¬$BxÑßÉ %äº&¨?×,¦è…RO@oq5 M¤®Œ»‰«Ù_3rê趃—Nu]¥µk´áö¿>7yuêÅvx¾çÜt§¿Ì=ýþPß™¡MÀ†§O§·½6¿ßïi|b{kl×Èóg¾ÙÜ»êá¦ø™OÒ‚¶kê»Mn}mÚÄO®tÆ>9¾7„g²tùKj-ýÄ¥‹„qùvXVìÁëî›*´Û]q‹%´Å[õŠãa=;"l_f²ƒù—°>à‹s:10Ð#ÉyAQß½"üвvm ÑÓêÙé÷¼å¡=;׋“â¬Hv‰@ü8MtÐITCçÏ}.@G8/1Ûö2ÑíïwŸí¦®vƒ¢î®nØí\zé’–ð®&0W5}Wïá~€¤:nd ‘¨”s>žAÍB€w7V~}¶làR§>Š;¬ú’±yExx¯ù²ƒ£¿ÉÒµ .K+,tqG¹˜÷ð[â¯Îo½5_­’) bq]ç ­íMÞ£eã Àõƒ1ÑlþH=Í2”I6®è­9;ÈûÁDâqm¡òJ^¢©%’ÏÄßíuÑVhÉ;Žtu¼¸ÂŽ5œ´:hL7ðÿ#»l`›¸8~ïÝïžÛwöù#N¸KìØvH\Ç$‰‡pBâ|Ñ#’@’”° (¡KÚEб¦P m¦M´ !Ð`"$ÖªÚ‡ ­¦ÒnÕ¨&¦NQ+µª6Q’½wÕ¤IɳÇŠtÿ÷ûĤP1ç2BZoF,âhè*FÈ´É6ï8rõº¸ÊZné@îüà|3û[AUQ-Ô‡IsMë'ècáÏ)æx+¬ÖY`Hnq{$·ÛãR­nÀøÊL5êk¾s¾O|´O€Äè)xBH{·•ñ¹\­Ü:ÓMдËìc>àó%Q´8 £»™1 —äú¹ýÜî÷ܧÜ?¹saªfÁʤƒM. ’»îÀ’@(Ðx-p;À%+…oóÄ’áüÆüƹ¼HÊ~!Û‚˜i퇹‰êàâ´ÈQÂ Ô ±@‘B”8Vºàˆ0±Vg̲ÈqOÉâ°ƒÏÎ^¿ ”¾»/^‹TˆKo"g4ä@®He܆¯ÿ¸¿3ziþ‹éY0í¾iZ&OxØÞ³5ÁÜk?7yþwG濼ԧcÑSgƒt‘KBÀ`7!¶ÈVŽlJ5ÿ”N_CNé[bß{ýùu—»§.î~fþÎÆ8V)°ðˆ-ǽ±‹ÚFý)YâÁ+1•Âá¨/ö,¯§=½j]]I–R;~Ùf5C0Ëòµ:Ìw\SLaY–Õ? €µF= ý>gxuX ?þQøNø~˜ Ï‚“vsÔþýí§ûw5)·xKÊ,x´!* ÒÓÝù†~ËTn*„@TCÃÄå ÈÕ`YêH”QMsù¹¦šþ»9,~¤œ¦‘ÖŒ4jüqLP5ÔÊRG˜W£‹†sJ†Z9Ò’ÊOc9¿Î&êpmÂfÓ}Ï` ˆãPËFÒ¿l¸–-?a5xÜTððžh}»LêÜý+;Þ-·ºWn«ïà¥Y£#3ðªì/ë-¥âýù¥|‰a½×Z4yuI¼Pb\µ±¹+,cwIa,rl±¡ølU`ÿÄ£«#a›ÞÀ`éæ7gEãªgþòÕ½N‡ œü0løÒlž¿`u[½^Ô&Íè< Dcâ¹Æ–¶úµt¤ôFûZì·í ÷éØÍuïWVQ$ þ`,*ÅbQG¨Q­Q¦ñ_<àyW£\}×ÿÀý~×”Fé«Aõ¨ ÅĨ• ›˜*ðMŒy< âÁ#ü™±“ÔÛÔ5ŠÞƒÿ¶KûMÀtÜèHÜJÜI0‰„¾AÙ;íöqûŒ Ù}¼}í8¾÷Z©&jcE±ÜÙ®§ªD]'¹Ãxà‘Sãc9—?DÞÂ^Lþ$/:êòÃß#Š9Ĥy4± ¶*C›¤Ù*é6Oš¶æ¶7Ƹ¬U3nº„g t¨ìõÝ#'jk?šy¹uÏÍ3W—aä!˶m=Òq4[W7ÿN¤' |ö›­kbÌGÍzµN`àÔøxo*ÛÕýì˽;on ºÊ,q¬­†çŒ–ƒƒÍ‡¹túÊÒt¶¾ý'ï:,xÅ-|·ðó![K Q_'­ú€n=ܰ¡ÇëMõô-«é)f˜Y’5=*2 äxšëÈÑKŽnrt’c-9²Epµš&ܦj#I˶¯`ýئM¹ÍޱÊ1J”½Ê¸2£\Vî*Ÿ+|™R° Ê–'Ãý­'»óá~*'ä’9º,ÊÍä.ç˜Èå¶l&§âa”È•Ÿ+€ˆEzÒA)l©äûÿ¿æ ”ÐÐРm] 1U+^@øÑc/+À[_œH…Šjà ˆÓH-ÔG A«DÆQ!1mø×ZÕÄ3ª°¤VÚOk[‰\mvU,eLÈâí6}ð!ptÑ›[3¢e£•/ ËÊóEH’¥ì±‘8äœÑ ŠµèØ¾Ä‰Ëô8}äÀˆEÏ †MC¯(O –9#HÌŽ“²TD04 ¡NÏ$—0’PÙ«œ7 Îì_ï/¶3•åæÝvtG69pÓ”qèr:¨s" [Õ‘ `´8Kéd-Ô±E í˜ ïÂߨíx¯¨Ô™¤Å-Ø‹ëÒ‚ÃYçvãݪ.#òVU¨•D^oÔ©kUÆ¥Œ´NzFÚ']“nãÇvp²4"›¾)g5Y’s¬3>‡Büxü•øBœ9ñYð¤%§Íý]ÓŸg¾ÊÀ½™ñ Ì~Œk¦5ž¸…Lœ[ô^,\ Á¢jÛŒ÷¬ ©ÂGEì‘P$aöFŽG`äƒ1'p¶v§3FÚ8 N_ ákQƒEÀ«îq~ø1~)&8Œ£ÑÙô€H3§MÁÅ0œ¨v>é-4†ª6üÄø8]ø´>â°j Åcd§YH3Å«OAomX’6 8Í€$"ô/î=‘ËåÊÍ–ÔwRÖá;ïäKÇ%cù©h{–çÒ‘èJˆK䢿5ˆ-;cÐ9¥žJûüD–‘Á¸?;ÿAyùfÃ1߈8­ u‚Ì‹íü[û®¿gypê¦Î ÐÉ®þØ&®;~ï~½ûí³}ŽcDZÛ!‰cÇ †8qƒ±1 MˆˆáÈ2CœU„öh2Ô%j¡4LJh6´2uSÃVØdLm¨­ÖuÑÊ6iEÓ†&íòi-Ó¤N›D²÷ÎmšÏº{÷Þ»§Ó½Ïçóý|2&@s¼9 rœÌ‘B]Ë£‰µ?o/G‚ö+äµn‡#´+Ÿ­ß„>zE ÷n¯­¿ü¶gyÉ{}ýåÔ|yqÁ»ì±Ù¦V–µ••å¥bñpΣåržó ‡Ë'µrùäb(4•.két9;î¿\ö°K7tIgÈ&=Þ£oÉÇÉWõ—ô¯“ÏêÃÃûô|~¹œ_âò‹<žO{:Ë \Ÿ<ï9Î|Ÿ˜›Ÿ#£s©¹QãâÜÃ9öÀÜqÔ¸…šÌ¶¦þth·7M¦“CÉãÉ“óɫɒ·’“"nI5 ’×Ál* ÷„…×Ãô«a//y<`cs¦AÏ`aðØàÏ?d‘ÏZ¹U¸S xqɶ’„yîÆË#˜*\‰ZC´­-x TÆ %¸Äb(ÝÅ$ïRT鎯ÿ‡«ÿºÌL­67£¢Ú06>~ìòÒR1›Íø=þ€'ð_^¼üÃÅP&›Í—ËéE]åV•ÕNEç.|áVwꛢ À5À¦!Ü E†ÍZS H¸~#uGÒŠ‹„½3Ö‰‹Fg›¡EU1²B3e”|;šõ$î²Æº&€} °÷üVLþHƒ*kbü+$¬<@²ªºE2d,`"iLGobÊS#µ§ëyJ4ËÁž×œ¼«Ù” øðÞ´™û±ÏjØgãHè•{¼›Ú¿È[TE¡Õ[­»Š‘Ý>³¶Y#p¦¯¥›2œÊ™Ý}A‡–sš¡u£èƒÛí&2éõî:a)Ê5Äqhwí}Ú È~«“ê’ZVÅÞþñf ¹¥<,Åv<u7¿ùÊ„ÄCVhµ ÐR-ȱÒË›qðcXÙl½ºvv»ÖS â,¹k³q ¼’kÞïd^âä%ªŽ2y–†’`½vÿ ¿ ÙÌMq+r€„xAŠ #×Yýoî Øƒç–¿©ßìŽ2 ¹Ý‚‰¸*2Š]CÙBùS*®ZW7»ìl–<õ×>ZûC™1À.i/¾q(À,ØšêVÍs´^E‰Ö?e~@?"fÁ³)IPè,ýu3l*•°‡uçÃZ>ŽCxj2§MNærñRÞ†“ÜLæ°>†KåA]GÔ¸ýÎAèÖOáÚ)Îp½Kï%Cº÷»,º÷¸È\<õÖÑÌdæræ~æŸfì™;*“©Ï7åÉ|Éô@ÿçn: t¯žÒ‡tZ×Ï;M l"‚€ÎÉàÍš‚IHL[§£Ó©é‹Ó·¦Ùéàu‚0˜9’ÀÞ6‘(^¶ô·G0AáÀS±S~þ$õü÷0ó"ѶM{ÐgeñD©dê{f``ωå ô=ÚÛdäF`ó ÿ ¾uaÆU©÷x3”ì—\=‚Dè1/¶âxT©#Ø™azTèÙщk~°:±ĨuÓ àN¶X·_ýêM0ëäy y ‘bx ™AB¨ZE•çÅîsw³‡î4(ÖzhFLåEФ´f¯ìüíQ[§7Àq–µã§µ¼YgwXRb‘©a5Mî=[„ùw]Áú€UqÈáÂ@ʨlÿ`v31Nü;ÕÈû€­ØísÛÜ>ÛTqT+GÝèÎwª;­uw§Ý£ij€éÐãËm-ú& ú6RÖYÜÁŒà‡!÷ë{pÇ@ŸÞÑ® ¤3ÙnßæV½õl+…¬bsÊ} >¿ÿ þÇøÃ8û³8ˆÇŽlEB®ƒXÊAGú.dÝÙáüS…há@*Ž©€ùz·ÞPiI VÉp/fíHÚŸgÝqÍa`3Ù¸A´¢Ÿá`*êôÃï1^ðˆ¡d(~%Ëõ 0Ñf¯J=úη©•È ÁôWí&v>è0·#\Røi_H‹:÷Ýÿ¼ÃâæzŸMUQÛ‰Ûìß69çߪ¡I«g J´¿wm  ©–•mÒùße튓EVp®ÀuâG³Z-MAøÒ6N¢€Üpú“-ÍÖ>NEÀaIäiD “(ɧú½û6ܳ>þ—Oåx›l)q, ü†Eâøï¬}V  $ê_ûõf+[$É,ò@DRÍ­†“@lîølª—!‰TsÇúßéO˜^âñûTG D-’Éb"­á–¦FÁ"‹ÞÕ£B¬·w ‚Ó9é}}ÑáÞü6}è}péïmb˜ðƒûoG-8qÜKµD½µ5Jö  mDŒ…ˆÅú ·8&œN°c‚èýýcý¨ dZc=›Á‹àiÈ58œý?_ù0\ëÝèØ ™©¯ÝʋȖ¶·Z¶wüõÖ¨Õúùw›ìrï7~“©EÚfoû/¾ë†´¨Ð$E‘L·Ñµ¶¶öËK\Ü¥vŒxY´s¹úÿÐ\­Am\gôÞ½»ÚBÒJZI¡'b…„¼,£5ch ðK0¯zÆ1ø•ºŽÇNÃOÚibOë8n3Î0ýQ'ÓÔuÝ@…tâÆvÇcò#¶Cʸ™ñ+ãaÊLÝ4mŒèw%¼îîܹsÏ9ßùΧ-éÀ«øÏ:=ü£Ë“t¾2¥FÏH;¨I qê<>Ž! n“ŽèÿWë{>Êü{G@£#ø¥ŸzÄ·Y5˜˜™ìDãˆ1¢NÄ 0Ä]ê>ÉgÉ5‘ÁÍb¸x¢—ùtwæ¿ÛÁo?Ïãa@­mRËÝc.³£1†–Þíz é.š®íŽÈªÜ)÷Ë·äÊšqÏËX–Õ….‡ÛÊSÈŽ¢Ð‘`u¬Ü(@9€Ðž}…ç‚0”Q`àG X©Á;$\êf .b£h®Ä‚!dŽb³®Âø¯ã“–a4ŒâšÆm×±w³/J mÅÃæ ã[¦¢_Ù7{掘 p–üûãmy~?¿8"…ol29·ø(‰&­b$s}ˆCûUBa˜ŒÀì–ààp˜Àøí?© ‹<‹C— K`QÍ';¸qî]î·ÌqÜnŽáÂÒ…hKµITN.Ó}jÜ@3Œ@yÐb^‹ƒÀÝÜÆÌ+™“)®oåaßÌÄpòêÓUÄæ¯ŽÓÆ+è´Öãá—á*#¼ÏêËg ¾{|~nX}Lb¤5 .Ì©¯_ à3¶³væ†þªõjÛ.ö½Öë‡mä|ëù®÷ìä¼þ¼ýl„´ÙÚZ_«$‹­‹m íä®mÁ¾Ø¸°™½Þx³õfÛßÚÙëù7,7­d1ÿ Ë—V‚P}~cGKXNÉÌ-ù¤<¹¢eÌèð8²۱ßñ‘ƒœpÜr¬:ˆÑŽšúaA×1ËøTÙ¤sUðþÁ)å-…Q”.ÐêÖüéxK·cúBü^œ1ÆÕ8ŸÅUí_À…OHX X¢¹Š‘zh¶µ.e‹2µ”µÒt:·Âí±•4AŸ4}ÐÈlÔçžï&âõ8Í&5*Íl‡E¡C–PIR]óSR®)ðÈÊæ€M;¾ÞÝ[ñôˆiihN–X4¦²B›9oÿÅTÏV•g¡{a‹¥Pvæs™'¬sή.«eŽÚk§è}Ã4Ú§l®ÛV7[w­Ž­qqN9ßrÎ;:5ÎIyÿ@ ¿©\R˜N¥_WN*ôãʲ" ET¼JDQ•ç[Z-Rp•²æ¤K+|Äû+É—¡ÃQ!²_YŒU(bžíe(t>…")HM¤ WLöZ=iK";½ÆlVx­”Í僲Ñéˆúh4³­NTǃ‰ª Œ£k¼p."ù…}Çx# r Ó¥oM‡:+ûí¥ÿà¥=;§ó< Ö ‰Ù…»pe²cP›g*oa¿æòÌ– ¹ÌíÝ{{8—‡µ½R:¾»yŸ2t¨«© 7þò…et[@÷BògÙwï_üÕœÇâýë“Òzgu”öÕ¯ˆ—Dýâj1¶ÌbAÕ A~BHþè·ÿž{† ƒ©®÷âQšzÄâ–¢Þ¢‘¢;ElÑ,ãUcªØ)ö‹Å×ijâ¼È#‹¢WŒˆã"+^F‚(¨B§À. X~$<ˆðÌ/~“Ó§$¤³µƒRPKOÓµ©•ûä»û+pNüY†Z¨ÀÅþ5¹Wn?7:~eàðÇg~ÖºNñE“%É’íë»~;Þ~tf㖆÷G'®ï‰…¼J½ìj{gz.†àf«_’G\J &ô{µ&(ڵ˜nFü( ûU~ÒtŒ¹f|º†áÊGåSò9ù ùkù[™ ¥è’;¢ü5?^] ½Ý]…{QwÍ´cß¼›'[R½)&5Håש[Ê=#1*%¬¤” å±¢Qž5çH¯@_zz?-> Ú &‹9§=j%N*7Y¦aAe•èr!Ùf%žª)Jã3Qʼn¬kPલq‹‚géQèÖc öKx#sj0ÆB0É“š Øã;íµ˜¿~µã7ÛêÂîÛÝS½N#ë›ì:øîï^iû1sÛuxqW´auyùnÚš9‘iÔ¢•0cæ^S¤éçŒ £³ý=ïÄýZ{©~åtãgHo¹üÁÛ–RìÛW’©B!´}¦Æ›­øNþmÃm¡]ldWùbUvŽ%^6/ÐÛA ™D“×1©&ÎD…9¸ Çúa-ظ®fGÍ–sÚø`¨Tª‘Z¤iDâ$iƒê õ‡ÆCó!‡CŒò†"ð͆.hihÿ¥eµƒÈ-ºUw§›]vcÕ}Ê}ÎMÜÏ’Ïù‰BöM‹KPýYR²*]KÅÔþïOŽò õ÷ÿ]®1mg?ïyÏ{Žï>¾Ìåcƒ1¶±}Á‡„kà,æbb'Ì¡ $PpRªÞH³.]Ú5™Ö®»·bݺD»t™¦J“2-«ÚFlÓ¤vù`>dR§ %¢IYì}&Ñ1øØ:›çyþÿç÷ϤŒ§]à¬Ø ÚA’À+1hetKî^2 Á£ p©3 ˶æñº—NIí½,h¼Øãìé:¾P¨ªokìɵ¦†6ÿÚÙô©Í¾Cñgºc4™j­FÓ¼ç79m¾V§’F¬êª†?¾Öpq°Å²T¸ßhµñ4k1ŠCѽXûÛÛPB­ÔõSÙ&´ÍlãÕ{•Î&ص~Ðßð©ïw^í¤;#SA©Ó“q‘DÚâÔ|ÜÛ;F1`;3æø55ln7/Âa×lbx>R‰À|`=ÀPTàrc£»ö@jâIø|@ ZÀKÏüo)£Iy<ñ;á3·n*óMœHËñ¥Øle[@)` p7ebÒÅ‘«­+Õ¶…'a± Dã±Ç‡<ž˜ˆ—ÄâÂ`þ!OÃr‡÷ù mÑV[úâh ìÿ_ 0r#å†FŽ˜5@k˜”¨ç0ë8óp[Ã\ÏцêzÑÛpHk±Æ—A-kÓêŒÚ®CšÕlmK^›^­VAA 0©DHóV• ›UWUX>:ã5ÚZ¾îDÙ¾WÂn·(ÔTú,5u¿&cšÒoÞ‡À(ÕK SÓÔ¶<úÞÈ•#ŸµÃïµgägC=ñØë“ &pj2ÿá…ÄÛ‰÷0‘ƒ«µÅZºvÍ;Y™½„i§X‡í˜V4Ÿh>Ó|¡y¨A!ÍÀ¸3Ö‚ ¸~ K‡ÆM܉±³c¿ƒcã²Ñg¯Ÿ¤¢!Mªoj¹³ó$ºé\sÒNgö,ÕÚÚN}’)ìmELJ+àŽ\¶ÚWì£û?6€U0¢‹)Š Ì>€0&6HØ,lDš d6&RXQ¹äÆ&¹TRicºrQnS"Û¶€e•C^E>¤‘^ÂCŠ©‘›Ùã¾’ÝŠÏÈÚ¨+ ª¦wÞ(‰bYFJ{˜…øîv@ä·3ä`Ðuðm/×ë+ßúý›ûΤ㭦ó:»Qgâ+Ï!0þãƒlevÀã> Ôg–:ž^ÿÖ»¿êK½èqÄŽ„FÏ,Í×~íØŸ;ãÎÖŸ{O¥;ö²Í¡*o¯·ªMÙŸ|ý†Eã+‡È¤¶6ñ|-=ÒÓóÝÚ­‚5¢b¾Th;xqd0ÛX· [è}ã϶¾òê7.½úèoÝÉ…¨3éש}ob°ë¸zû!ü/ŠR'¨ë²ïÆþÛ®ÛýðŠëJÿ œ˜^š¦?ï{¦¤l4<ÉF5Æ)óuìò+Ûë²uPÌ÷QSDzùÌÔ‘l^Ó÷”›k[ŸËÚÎåðì;~Pôÿ h•ëQö¤˜^ægOÌ.!B2J¡ $.£u$TâQ¿u!t€7á\‡÷!‚`•-℺lrÂH‰ä£š%c­ˆýãdåòª®¨£u³ÍÏR/ÍKK#K)iŸ2¼’Þ• $uÈ»Þ~¯ÂÜó;[q£@% ¥F' §OcÚ.Pp‚)XˆxK‚…ñ¢(à,X «ˆŸ—É)é§dì1S÷ùˆÛ“Hx<á4è@î¡ §Ãœ CöY!ªÛs¨BÿíêJ¤E&ïÔ˜h˜?ׄb¢o¹ª,ßë§AȆ|-[ë[«ž*³VÅ!V rÈ ¢Ö @¦Ë¤#E©ßü'hEJG5S×ä`õ”S+VˆômñŽøoñ‘Ȉ¸î!7îÝ`Õ]tßso»72jHÑõF YxRîö"D,à5ü#èõa£(ŠôªXï‰ÛøÎò¼@ËB ?ÝÖ„uá¾ÀQ/„(‘p©è §ñz|Þ$Šlø §Òä“’Ÿ&5ß­8·SrRpãfâzøˆ+ Û-fÜŒ´w —8Ri­óDFTˆ¬ëA½¥OöùV=Ï!5äêbÞ¿AÍ|è„}~ÑÖòp&8Òuf´¼ñ‡À3Ü¢7³xky0[on¯¹ùË‘6Ù£Rá8º½ÿ‚Ú¨—@½êîÓ©®®ù™iëÌÌtGWׄ×oõzý]Þ?÷ÌL§à¤'ã™ss‡ã_ÎŒ’™ŸÌäÈLkWÀ?dÓBd^Ô˜¦¬×˨p¦=ÓBPÅg­3î™èLç Ó5ã……¿1"F†"0²þ%ãÝ“šÖå+ó¾|2ÏTçA~4Èû.¤ßN¿Ÿ¾ž^K£¥ôjº˜†é¯!j‘_t.†åÅÔ"»8ë.,cº\³óÈŠÞG ±B¡sK»ÍÁ­á7ïb´ÇFˆ’„þ1ËãîÑGrcãîcwlÊm`Ò'´Á 0/ð·. `Yà ·HŠÔµÃK]T±ËèÿŸd«¶F;G¼1'ûl§¯ EvbÁÎaÄÞI2êÿ/÷ئÎ3ŒŸï;—ïÜl_Nâ8¶c'Ç! qœØ &vââ˜ÄIÖ0MR.!#4D@¸­ ƒ©4Ó›4X/+(ÓhëZGéE+BµË4Zi©¢@;UKÕi”i¢Iö}v2úçdûØç*ù{Ÿ÷y~ï“— é•€Í!ÑG¥IÚJ@Ò3wm® }Þä}vÉ<êÞª´-n@FAH^ßϺ ®2É Ê}m_KŠ5yš<=ÁÒRF` Ü»Bf[§ÁYï°0`[]ø\áD‰æØgoÜÛ^©ëŒUê‘y]ÑÒ(²s4Wrü Uh,ÒóÓz·Aæ$YCÛW™ž¸ùh½ÍX·*™Ò,‘£ ?STW´W¹ÜHdœ%ãMÖ‚>QYFF"‡¡‹çy æõG{ŠJðZD‘³c>ÚçÁGlZI]Ž[?e1°˜PÃàM˜3Ñ]¡'ã Ò2ŠgçÐdq[H?ß ñ¼`eémp—ñ‘ˈ0M& èÑij”Ò}L?§3q½KÀ?¯é¬¢×à(Dð§Q×ÕD ¸}³[ˆˆ0-gçï?|Uò¯ûÙì2'çCtœÊZ‘|b*h¹n9ÅXÌÿl‚9ÑäÇÓ[;À -ȇ%^Ñб ÏŽYhW“¶—F˜ÛvATJjÐ׳¯e¹1ƒjDŒ( 4ƒî}Q°›¥ç?ýâ‹}>·ÉŽ×®tqãéÔ `‹›o¬¼‘¸1A;J:Æ™ìsÁL(·`Í™FñéÌP&+‚Ì |äÉC™øóäTÓ¤hö˜¾c6t¡ýj;lÇHòÜ6 L¥§NMÑ5±5pÍÈZŒ'ŸTÁϱ PA¥00„ƒ##%#ÓG>IOú^Ž¥AšœðGF´Þ}Ó8J_4ŽÆù.~€ã'ùSü9Q¼Â{ø|ð?Ã#ÁăÙ¤xR‚\ –ûX!“àý¹\AÆshCJ1Gø5ï¶Ž¹‚Þ(_ý·ulŽô´Ö@"oyYjÍ0v`<úÙóxC¼YË3ކá…ÓH“â¦õå¿I6A<ÖÆÁMœŸ-ó1éó—àóËÏRb|–å×à&à#)Wœåv•C»Oò­N6sœgüvoc²o{uæGícmë°× .‘9´Mõ×l¨“<mѼ£3:^S²¨¹X‘síÂÇ]Ø£î· ÁÖõëN´ò¸EãþrO­{ ú$†•LÎÒ;iÂÁ*”˜#ݘºÆ}åƒ~Gˆ­Éö“ßÚôù mÂÂ’L~€€xY6ùO Õ‹¼4q¥VFT ,ÀSn2VfycËÞcÉÃ{ZW;µ…™Ý8¦ œÌK<À2eY¬Jßâ¯w´=Ù°·yÓ±w/üçƒ#»{öƒ·×ÿðéæ6µ¼øÌ/ÀŸzå°«b‘zãÜãæàµ…¯z~7Ñù§M3ÓWÞ!ÿ¤`þ_øŸ¢ê©6êÝxDwFœÐ¹*º¦©‚‹·ªÃ ¥"g5 ¡Öm;ÜîÛîÏÜÿv³È Ü(Þ¯KÁý6Âdê 9EŒö« ;žpö†.UõF§¥d"“¸šx?Á$†¶{÷{_ðžñ~èýÌËyS£êèŒƤIé”4#})±5R\ê’$rˆ“òô?„¸äý¹åxÂäÿ Í/ĵ`Ê má–ø³ üÄR#.ˆËø9›²Ä)È,K{uµøN"ÍB·˜Xž†+¦¸]Éh?·áå?O|4Ò¿×b‚f!Ðå0±ÏöŸ>‘±¢ùàw~}å'±‘ùG’€D«lVÕ—Áe°»O“‘Åમ«¦¹˜u÷ªú;¿úî¶y®«ia¶ÌÊpf¡BÀ2Ê ¯T¦=u¯Oýòú R—Öù‡ô<Ýç².êçq×ÍFp·¿o'a$z:z3J·¬ŒÒkÓe·–q‘´ÓÝÆ+é›i˜Þ•¦°`¯BëúW!ßÁÊÞDÑ(MP¤6zbúC0Ç1 §†ºÂà½ð­ð½0íÇÂÙðPx<<þ{…Ù=ãX‹Ù¹y3Ž&åá}"H²ê$˜p%–W»Cv¨ÓÅj5+Ê»ÀRR`Ì+˧ÍrXq„üª±„ G⥯Ð8cr‚&·ºp¹èÎ2H"ƒ ùR8N*5Ú±ÿr ×2Ì dÆ#…˜ʼ7úx¦{{Ògà§c ª:´áTÇêîó©ÝQú×…?v{ŠÊ›÷~ÿˆZa ¬ØÅÑ¢ bTYV(bGýï_:ˆì±Íïî¼ôOÝ)™çw¨7¯Ý<Ñ?™9ý ^DzÅyx¤Z©‹ñZÇ©®úØ6Î2~ï}úî|¾×öÅÇvâäìø’Ø±¯vÜ$õ¥qZ÷#NÚ4kìÌ˺4í>znEË(Ý¢iÆ@í4`›h(ôŸ‰JýБ@ª¦vÚ ªT´ 1$@† 6ÖðÞ%¥Å>û^Ÿ^Ÿìçù=¿D?1¦ÞˆXLÂ͈4!¡‚K@b’ª®NªTÃ*þ]õ¿«µwè\;3\©ŒeÌ”1NBÍxËÃ<žo€Sz[ ëEïtê"xQ|Þ`ÿÎâ“ìyÄlq§åýÍqø#ZÔ‘Ux4õõú£qHûõ àjyÜ,8ì›q,k¶™kRe7³ì¨ð!𸅗dó"L7ÉNq$m líÈ£)4#Wr^‡°££g@jÀY1Àb! Ñ0 Ÿ“ŒêdmÇãÃóYdžv‘b8°Q¶ êÝR?wÒÂØV/dãƒj‡ÛßÁz iõÒñ$j7Oq4göCµ¯¯¯áoCØúµß*+ÑÛ±;=äûÑ›±[êïò}ûMá¦B|ÌlÇ_n9pÐþ®bvIì‚b’}2å>[ÁÖ0tO)IÍôñÞðŒÄüÂЂ"°íÔ94wÆYì”7£d2™2“ÉÁÿ°€c{z1¾Ç'ãµøbœ€q#ŽÇ¯FNcÂ0LÂ}°?‡LꟄç!ÎbŒÂ_‚§°ü׆ínš±ûF*³Þëæi#»5sè8‹.úªÈVÑÅ¥>Å5sÈêX=²æT™cÊi§åÁMnózBi¨eäL£Nüì4sOæ.·rl[n –H<øwoïîW²;ëÝ(±¬#xfhhw0øûg’_y-óò³Ò_îÁ“\¾¿«$›yz` XXØâñ¦Ÿƒ©§v öF"3ã/¤Æ¾ÖŸ°yXiÉo·¡ ¬ÿ¯w_Öí©þ$‘®8Q"}A½M÷0ô¹0‡[GùÎNÙa„˜¶¸È幨“Éèz0z{ðžž}£(.Ó7M°WÓ ,ÿe*QEÑ]¼oB„cñ†É¦ÕqDó„´A&YÙŒYÄ1Yh@f,'’Í€`ˆÄÝ”¼+¡J1œv¾=îB|ß*krÑÓŲ®íbÎÑXÿB÷y¼9G ÜÞ^)ôÔJj-u/E¦îbz Ç;ž)ðÛ¦Å`%½(Æ\ˆ®EñO£ jÅ4wñ#ôž¿P\.Þ(á¢Q\,ž·>ÐÉ¢^œ,Ö6/1WŠ€ÅŠ`kÑŒ(',«ØÜp‰U‹üï7ëùælºTUÍå6AYu§½ÙTH™Û¢xóe©0ò‹i/j§hÉÁ ’däß0Ê0°´Àä ¨²ñ% ®fÇSD´Õ¾§]>âG5÷Níúf‚"@øXÚÙašâ9œ8É2ö.Vßšj÷R@pNÌÝ>Š ?@nÀ|T$œ8Ž»¿÷j‰¿rhËpÒ÷}-ä½çIDP<„f××ö}-Ð|[OElû(ºi¼­Tú''ÝLÊ&yÁ)l @ÁIÑX¿¿þ q›±qìo:çñ€×Äë¯éÝra4\, ¹E’å–áÑÑšD«`KQR…=™²RNÒB™1½¾Ç’½ §GW  À_˜…QY‹±‰Ø‘ØéعØç1:{9†ÇàϺÓ ížF`Ô&µš¶¬Qç5 5ÀU]n)bÈ>-óäƇ‘™ºÄ¯òŸ!CÕ¯¿§/Žãã‰z³z¢žËm²Q.çGƒ–ËU1_¾>ôPW,_¢,Zêó™'Õlz•ðxÍѳtBb¬šzoÊÇÆ|mö>j¶4öš™zc¯¹ "J¦.máO ¶º)Ãë )ÚéÚ“fP[æ¢Ûu$ZÃ̆>þ”½÷BíÙ™'$1,¶i¼ðvö^Ïx¾J2 ‘O@Ër<l"Eq-”ûÞ¥úî¿›Üéàìm,p ’ Ž"¡ ä+½c/µ†¼å“~úu) ÔÙ¿¬ÿ†:B´`uð†®,¸úçRÄ'V§WŸX=¸zèÎ<ýáü÷éN?érÁZmn¶ân¬¿uÎÏ…ëïè§µÊPØ]©ZBÒ´ÄÀÔÌLM@Ë~a~Þ€¼!_››«AZ¹f4¸À»Ñ6WŸ\©€Je†Ÿ[™óüdy[yŒö–»Ë!š.¿PÆèÐÉÄÉüÉã'É™Š_ÓJþù9BŘGÀH¼¢Kx)_--—n”(£´VÂa ”à²îú† ¸®)ú÷ú+þü¤¿zô¦ä•eåŠrC¡’Š¡,¢Åв¦ÐÐ š—õ(¿€‘o’ÉkäI‘`4tcÒ¨fœ7pÃX4î„‘@€jV7 õe9C [&´LBGQródb¬ÙÜj4MÑÑ?¼î߆Ü’…@Möü,í`á×—]œSõ €€Íæf)_ ÇÚ'®þãÚ–=‡Ä ¡yÚ$1F–Õeg=íœöàO/¥Æ?Üñ_ª«?¶‰ëŽ¿÷î—ïùì;;>û;vü#Î/Çvâ8áàH.¿ ê%‹‰SŒCBX¥ù±AIEÛô(ËDÛ14µQµµS+ PK±þ€‰îu“èÆþh» :±iÒ”iÑÆ&%Ù»3vòÝ;½÷d½û¼Ïû~>Ÿ}[cž »…šÈ©`,gµ±ÁíkýÚñ² L·ÜëL¬½³‹T¶Ó°?ÀY9‰ÆpS¾õuê;„ÛOÃ×õÜŽÝû'¨îÒΡ±ÝãS÷¦™Ow~¡|®~¹óËÌ3lK™¢¨_럞™Í´ôg³ÍeÓSS^e6“™V—ª*ÞælvdÊë"½u*;«4{-@ëËm3ÊZ‡–ÓIû^>”›0:Æò¹}¤ýénÌUWä"Æ`5 rŒ1hq棞·°›çš_j>G¬—7@‰¡@¨º¢ù }²‡ñ8rg ¢ö©Cê•V3â¶À6´íO@“´¨–ÔæµmQ»ªÝÖøŒ6ª}K;A:niÖ¸ßiPÓæf Jâ‚H‰¿@èXv J ™ÂÂÑÂÉ«…7 ÿ.ðl>¹7 3“#“Ó“ó“´4¹0‰&Õ’0yµØ˜dWÕ™üqõÍQÂü gn„¤‡¯ÿzPO¡¸]º®™Î.iä2ÞM¢“PUBô±y 4- iäb5IÝ M:§|kDWsx£ºzüÈ4E¡ªÉæØ•€÷Oņ¿7⮩¼-¦1JYïGRIeÖÝÝà G‹}%åHíÞÊHQ]\ZWç~Ò·!‰ˆz´òÌw÷×75BÚùCœõ–zB”èL¹m§¶Ô¦Ê!es•D¡}{°PF#»Ü9ñî‰3,/ykв·Ñ$ÙÙ9†Gœ•±Hs±çz]ž,ÄùS‹ M[žÆ«ï¿˜ôÛ"ó Ñs?Ec‡Õæ~£·vg½»ÚË—Ø,Œcm4ƒìœC\veñm–å×rk5C)`Œht¹˜„¿ÍA)¯ú¼„ØÒîlÖ74¬P´žÍY– Ö£}öTnS†s5¬Û—£ÙÇÃY}˜šP ¢Œ©>±2P‰*—à zu4Ù’ìI>™<’d@&ÿ*åo`¨ãyü þ1¾Žo`¶Oc„ ¹æÁc#ch̰û3yCy‹Ä1t—PF!v˜5q–Üm„Zî¸XÒ]ùááiEr‘«º>’õ¹È²ÿ_•sk,šýºâä2éSB8Ñâ1”W.²Âu?سŸA¢¾Ä*{îÏz Ïv("+ÜPêpÈ4fm„†IˆA£¢T4¢iÁ-&Û»[b4”c­^D¤ÕÝ—®÷E}"[VÕ+@ÖÒÚ¹_—8 ó®Í‡@óL‰(À· R”ó»S¢£¾6€±-ç–qCOÙ”g–³vÉÊ……8ÌZ0Í8¬Ø%(Ûo~ÿ)mÏò®]§XÆ;y‘Ar!b-”Å-DínaSÔǬékJ+{¹JÑMW…*Ê(†¸ ±ï½@¨FU¸Å…KiÎFxѼþ_ªœÝàGzðñ^Èû’MMÓwAÈóìjÒ·ÂÅ­pëÖZ·»£Ü0Úɘ°§–mšèØÓ…“ñ¶&>æVüGË?ߦ )Ê1å”rNa%;¶mk±Çc#±éØBìFŒÅz_'ËMäÉnϨ‰eS ó+Ë$÷UD$Úä§qÇ~3dÜY,uÏšåÀcl¹uÑpU”»ï¤¸h•i¸R÷ëÂ#‰ˆìÕèI¹ñ¢ V†CÍðédƶ¸|//Ôô¨–Õ8y—•¡ËqÐAq–žÖ¿Ÿ,é" §ýjÝÿGí@§Ób8™·­¾Ñê¤ä“­ìß<˜g‰õ¦BYMÄ)@Þ:žj·±å¢ÌÛO[-¾v×Ö~‰`uAgð™ŒõÞµª9¢à˜Þï÷[‡1†ò° €a(ž÷¿ãÿ™ÿSÿïýŒŸÃ² ‚ý€"Þà刻L+‘Q='â œÄ:γ¶€ïb 0;( Cœ˜ÍϬh«š´Rüå5‚dÞÈ.ëÄr©š `Ê$6™' mÖQ#ʆŸ ¸±œá ŒIõ½õYü™ÉÉg⟽uäpýËg¾Wxí`ØóÕ©ínêyÖ^c?Þ»éÃí/þÑö=·½õZ×øGMéŸw]kí{ž|éÍÕ»¨žÙB> ® DôR•¤F¨ij‘ºH‚uƒB’aFÚQT’eÐÖFÖ—r„áÍ\ŽÙrï2aꥵtËDl¯¾ÙýÀøÚۙ‡#»’¶–Õ¬Í6fØõe«}KßùÈLÚUwéT½J›¢”.>9pª3r¸«‹©é<ÅÌMdáVÍ0Z%¶6JqÒÓ‘g@f~òØlÍê´{¬VŸ×jõr¯8HcózF;<^±•8nÞŠKÁ¹è˜VÔjvTXõ±NaQÄ+dm4p ÃØF8 X4m>Ä×óÍüþ2/«â«ùÏHàêiÕJxÞn‹îtWè …B½äáƒ^Ùï ´*¥èeBÐå ]¹¡;¼;$P’4‡r]!!77Të’ îÑ‹ˆ%bEm”óö1µœŠ9AqháV¾™·:/ y· òY oQqiwn0'êˆÛZÖÊΕò0#„f!ÑÎéPvõéÂê¡(LªîP¬Ýb­-¾NÆÒ‘Õèd¶7p´ð¤xES¾A0TŽº Ò½T}g` ÑEßOË£ªTñ`LÿiÛ"JÄÉyï¢{ÿÀ =ºAùíw³Ã”‡›£›˜ßˬ–ssô…úD­B-uKeöüÒìœ*ïäâ’ †k®W©´qÒ•:ÛUìœøüü )¯‹—*sù§ÑlJV³LžÝQœ3Ï]¾ÉЩò_K6#A*eöÜ1 ëÆmËòKe‘Yï‡ GS)ñêdôÖ°¼‹ÑC€š)8ц¾)›Ø8fNIm1AG•Ò¦$‘žD%˜AY­lVv+¹ËJFIÔôk(ˆVÈ#^ÒizD×l’#z©s¸iÅŠç}t+—Š*ñ¢SJÄ-]6V²ÊäML|ÃäwûÌ%ù;˜‚³&à4ù Éö@Öxvd5hãÎHNrØÌ™ždkcqõ>·µþ¥l½Z?:Ãå‹KÈ›í ¬µÑb‹•Ƀám´ÿd•€œÎxÅzÂU@Ù ¨rµŠ°Ðø_ÚB# ´Ëê&IW€äë´ÕnÒü€þ4~0¼dœŒÕ€‰6néÍjÂ'€åâldßÞ8t@Và,\Ô×½(ȶxþÜ[Ó‡°MxzlÏÁF0‚Œ`ÿt“f¢÷ËdÊLHbÒ 2<¶°œT'W(U j6Q—”̧¤¦éÓG2Œ&³e4löLGVvŽ3×åÎË/ðx}…þ¢gŠcJJƒ!¡¬ãÆO¨˜8iò”Êg§VUO«™>cæ¬Ùsjç>7¯n~ý‚†èç<4$Ýæ:þéÈ–Çû:\Y2Œ~øà°ƒžFh‰5ebõXƒõØ@Gö£ýæ$³Ál4gR?3ÊÐ0\ûà/âõÈ„†ÁŸ7nèÙÓ³»çÓž 1öUØÇöcQÌ =‡dŽdML–‘d¿0O#åLC²„b›“YÒׯdŽä•1YFò®ÊŠÊÊ)åΊ†–†¥MËýŠJT*Ét9œ$7 …°MX†FÔ`!Âh%þEý£û>Më’6üŠ\”¢Õ"¢& ù}h¾s`vP‹œ#I|»[c‘„2æ^ù;å!*”fšÐ/'³¸×Ë®ˆ1/Ñï>ûòõ5õš’ß0Jí}H½'jáÐÊrO¤w`«|]å(¿ETÿ×HBtÚ endstream endobj 2112 0 obj << /Length 783 /Filter /FlateDecode >> stream H‰ÿüÿÿÿþþþýýýüüüúúúûûûøøøùùù÷÷÷ÞÞÞ®®®   ”””’’’“““•••˜˜˜±±±™™™–––‘‘‘¶¶¶´´´›››ªªªššš———¹¹¹†††°°°æææ³³³ååå²²²ÊÊÊää䯯¯ŽŽŽçççáááãããÇÇǸ¸¸éééöööñññôôôØØØÏÏÏÎÎÎÒÒÒÖÖÖÑÑÑÔÔÔÐÐÐÓÓÓÃÃÃ|||pppnnnssslll}}}­­­ÈÈȤ¤¤xxxjjjtttqqqmmmÕÕÕÚÚÚïïïêêê½½½ÀÀÀÆÆÆ¿¿¿ÂÂÂÄÄļ¼¼¾¾¾ÁÁÁÅÅÅ»»»bbbîîœaaa222 000RRR«««ËËËvvv''' GGG§§§)))ˆˆˆºººÉÉÉßßßÍÍ͇‡‡888OOOóóóÛÛÛrrrµµµÙÙÙzzz KKK‹‹‹eeeÝÝÝMMM„„„,,,èèèEEEBBB···ccc ………âââ"""€€€ààà---```¨¨¨PPPŠŠŠ¥¥¥yyy555+++DDD^^^‰‰‰¬¬¬666***///iiiŒŒŒ¡¡¡AAA333IIITTT...£££dddCCC@@@XXX¢¢¢ÌÌ̦¦¦~~~]]]FFF???$$$ YYY!!!VVVSSSwww%%%QQQŸŸŸõõõUUUuuužžžìììZZZ&&&;;;HHHWWW777444[[[:::ooo999111(((### ===\\\gggkkk{{{ƒƒƒ___JJJfff>>>‚‚‚ÜÜÜhhh©©©<<> stream H‰ìTwTÓY~¿’žP’:„„ 5´P¤H B 5€€"ˆ(EQD¤ ‚ˆ Š# 6¤ˆŽ.–±ÌŒ:†Ã(#ë2±nÆu÷xv÷Ÿ™w¿s¾wï¹÷~ß}¼óz¹°*€HW‹D–ñƒ à3ÀŸâ?ëË\˜-‹&2šÊÈÿÇÿÐÏrú˜ DG?ï#ŸøGÇ……ÉL“ Ê~JÍž|¦­¥½­-ÇÊÌ’é!JŒ—¦å2C¼Ý™ÂŒ´ i63'3^(br˜9²ÚgZøßïa"Je‹$2E¸X”/–$1ù’q®8CÂK˜²mÿZö™ÃŸ”ýòdÒ ­ë= Çš…[t€üõ&@i$€Ä´É:PdT4óãŒ?!Éb„öÓtQ|Î' è?]áÚßqÒG?$”)”fçý£÷ñ5`È:PZ@ɾ+`+ð¾ „‚(°A2HÙ ƒRPªÁ^p4ƒvÐz@?Ãฮ‚à6¸Y°žƒeð¼… Q ¤ iC dñ gÈò‡B ((J‚$*†¶CÕPÔ u@=Ðiètºݾæ Eègè ŒÀd˜k†°9̃Ý`?8Þ'ÁYp!\ïáNø<_oÀ÷áYø9¼‚„„0„ƒð>ˆD#‰H6²©BN¤E¦‘¯Yd ybQÊD9¨#ꃆ¡B4 ÝŠÖ ÍèqtD¿BçÐeô=†‚ÑÀ˜`0L$& “©À4`º1g1S˜û˜ÌK,ËÀ²°vXl6[„­ÁÂ`ǰw°óاŠ3Á9áqñ¸\\® www·€{…'áµñVx/|4^‚/Ã7à{ñ—ðwñOño ‚!@ØL¨%tF · „·DE"‹èD %¦K‰Ä~âñ1ñ‰¤K²'“Ĥm¤FÒ)Ò5Òé5™Jf“ùä²”¼‡|Œ£â¨†TOjµœz„:A§!4=Ÿ&¤m§uѦh t,EÐSèÕô“ôú²UÉF)\©@©Eé¢Ò,a2Œ4F-cñ€ñFYSÙMY¤\©Ü¯|WyUE]ÅUE¤R¥2 r_å*SÕS5UuŸê°ê5T­¬–¯Ö¦6¥¶¤NWwTªW©ª«k°5B4Š4ŽhÜÔXÑÔÒôÖÌÔlÒœÐ\Òbh¹j¥hÕk]ÒZÔ¦i;k‹µëµ/kÿÈTbº1Ó˜ÌI沎†ŽŽT§CgFç­.K7L·Lw@÷‰Q§—¨W¯7®·¬¯­ _¬ß§ÿ­Á€glpÐ`Ú`Õea¸ÓpØðK…%`²úX(F.FYFF÷Œ±Æ<ãTãCÆ·Ù0›ËNf·°o™À&¶&b“C&wL1¦ö¦ÓNÓ‡2Ç“ÇéãÌ™1ÌüÍÊ̆Í^˜ë›G›ï3Ÿ6oÁµH³è²xdIµôµ,³µüÙŠm%´j±ºgM±ö².±±þÉÆÄFdÓfó5—Æ àîäŽs³µ³Í¶í·]´Ó·‹³kµ{È£ó‚x5¼kö{wûû ö¯lrþæÈqLuìu|¶†µF´¦kͼ“®S¼S‡Ó¬3Ó9Îù°ó¬‹ŽK¼K§Ë÷®z® ®Ý®OÝŒÝRÜN¸½p·pÏv?ë¾Êwàoáy ÞU3žTÏ0ÏfÏï¼t½’¼ú¼–½¹ÞEÞc>?Ÿ}>š¡ G°ìkç»ÅwÒì·Î¯Ùï{¶¶ÿhà°?àñZƒµ’µÃ P¸?ðI+(+è|068(¸%ø‡Ëâéu´u±ëz×½ u­ }f& — ï _ðˆ¨‹˜4Üy#J-J5‹îŽ^Yï¹þÀú…nLẼ ¬ ®oTÛ˜¶ñb¬|l|ì™8L\D\oÜ»øÀøÎø•M‚M­›–…|áAáóׄú„E‘“¨Nô4Ñ)±.ñY’SÒþ¤Åd—ä†ä%1_Ü,þ)Å'¥=e550õXꇴˆ´t|z\ú9 U’*™ÌÐÊ(ȸ“i’Y‘9›åu k9Û/»;ÊÙ3’KÏÍ̽)5’îÎå9çµä½ÊÏ?S X )¸¹™½¹róÓB¯Â£Eh‘°h¼X§¸´xn‹Û–Ž­ÐÖM[ÇKôJÊK¶yo;^J,M-ýK™EY]Ù¯Û#¶–k–o+Ÿßá½£¯B®"»âáNÇí»Ð]â]3•Ö•M•﫪¾¬¶¨n¨~W#¬ùr·åîÆÝö$µ­mÛ‹Ý+Ùû`ŸË¾ãuŠu…uóûöÕ3ë«ê={àzƒMCûAâAéÁÙFÿÆ‘&ý¦½Mïš“›ï·¸· ´j´V¶®J8t·Íµ­¿]³½ºýÍañá¯;¼;†: ;Ž`äù¡+¼kú(ïhO·Zwu÷oÇ$Çf‡Ÿì±ëééÕè­íƒû¤}‹'bNÜ>éqr¤ŸÓß1À¨>NIOýx:îôƒA¿Áñ3¼3ý_|Ñz–v¶jÚ<´<œ<<;5rçœï¹ñQÇѳçÍλ s¡å¢ÒÅÚKÄKå—>\.¼¼2–9¶t%éÊüxìø£‰È‰{“Á“3S~S×®z]˜v›¾|ÍéÚßÑ.ÿ¼É:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿPØ•‡ endstream endobj 2114 0 obj << /Filter /FlateDecode /Length 13872 /Length1 21068 >> stream H‰œVml“×>×ök›¨I ˜€ÍKhÁ ÒЄ²’Ö±I ƒ@d³v>¨“’%%a6´©ºÅ ë˜ ˜•J¨Ý"½ahÍØ4e+…ý T±þYµM++R™˜&:±¶Ä{Îõ}]'c«:+Ï{Îý8çžûÜsÏ "šAýd¥úÍOøW5mˆøˆ¶\Bï¦æŽX×£ÅO‡ þ–H 5«Çš¹q Æþ€öÞÝ]OuÜjüSÈRO¤å<µçÀîÕ·:§ÀþÁËñÖXËÕÕîGˆ¶Àfu—¦ï"r<‰öâxGÏþ»Õ7"h÷åôìélŽîxí]¢º!ø[ÛÛߥ½iû%âù!æ{¾ëhõh#ªïÁúË»:»{7~õ <Þµ·µë­ž7iùpYtÃz¯H²'±S¼"*Ä«ÐOEÀGâG¢þ(âô,ÖëÄ2È÷ÄFú•PXtQ=¥·Åaa£AJбJìEˆî§")–‹ZºƒxFÅbÂòsúQõC«+,_µr…yY©oÙÒî_R²X_äõ,\P<ß=onQáœÙùy³\÷Íœ1=7gšÓa×lV‹ RaÂ#s>·×딩ö¼ÉmÃZâú‡× <·WŸUž™åžb5J»xJ{A¦½É #¤jØó…þjP¾! âeDþ×±”2 ¶´ëÁ6cn %…Eîò¡¿ûe,Ê÷HnN@´æ”•ÒHN.Ô\h˜Û5"B©XBÁ5#rÎ(+5ò|†¥$Èh7ª£PôxÂHþ#£©±¡ì!‚™©å§5a؆C®ëi3ªc zFJÇC£.jŠú¦·è-±'A] 1޵$o`"ƒŒhÜcØà\~Üèñãž„ÎtãQ|õXݳÝÓáCÞ1·‘4fùŒõ˜±þÙÝÖD°¨ÍÃÍDâÇ8µ%œ=êåo$)BÀ‰ ‡pl [)ò—•¦÷¤h‰¶óší1Ž3ØîI ¶ÊX‡d rj0ÎS=û²‰‰D°E¶ÄZK/0ª¤ †ía¹G°WQ]jFlr$Zñ¦ùÞ°5àØôX;}ò™ž¨êAGÐôpup`xš=m ë˜ZÉŸÖJJ4WÊüñF¬ê¿°2´—îI|B†ˆê»9¹'¦zì%®OˆÕŠ&!ÝJD±ÑT“îq鉑 ]Á(V­Ãj4uqÐm„†"†+k@?'AhkxÛ;+b6ëÍ&!«[¹r;`uJ€ej{= ª1qƒ§0ë ÐÓ’s ¹[‰cV´1G­•zJõz9AG«© £K8ÝöP“ûžžöØþBuÚÍÔ§ö*²ÇpR»BGa“´Ÿ¡@ëŸF[gò˜ã0~ع¯²Tvë?ÚìKsR*ieÿè_?‡,U©O!ýXÿ R·ï¡8<®öP‹9.Õÿæ$,gR'•>~žg=Ë®Öz˜^À~Ê!+Ñî…nAœVè¹Ð5ðWŸóÀÙ)ÈB¬ß¬ö͈ñžÍ=qüÊ÷½‰ÑD:>ˆñC`"+¶©è‚ÃÖr)Ùç3À£Èƒ öq:ÄãöÝ´†áø-†ÿ7¥ïZj¯£n¦|Î îÚ´mríýðѨ] Ÿý(-×ú©ÜâKÝÅ:^ Ð~¾þ‚Ÿ¿Ê‰çm-2OJ˜Ûuš}psû8G3\ô­æóC,·±ÞC pbpLÖÛägÞÙFl›è†¯<¬U̇^ pXåqˆíù¿&•+GMÉàü•ÀÃêŒvØ1_— •+|7¡óš|ÇF![T{9ä9à+Å㜷œ;œ£œ'œ#rým´%ïƒó\æZšïƒà’Ïn°q¿®²Ók|o˜_yo”o™c8gSrÞÈü¦>«–ªõê²äIûÕfxà\SÒYEgµ0 ð]äûÀü¥eˆ893òªwUùå»bʬ½ûåÝÔˆ*Õè5¥ÉM†£á¬úõ_ ÷׉{¾÷ñ8;H¡à<5ÙF„r3â>1E&Žk¢]£1Û8îõ5ú¾å÷ôúyÈ.ìûjW“¹Â—)Ís¹‡L*¾ò8/qn¥È;›8g ×rž@žU|ë\L;>‹¼ ç/a¬[ÖÐjIügñ^vÅT¾³$¯Ñ˵”ë™™Ö…SûçzÀwšk·ÅËdçZ!çÚß!»ã4ÙmÈBà×@ Ù­Åé9\û9~{êGúÎ-âu™Îa©WÉz*ë>ƨ{—”÷⊔~9§EžƒÕq„¶*ûJgm²5ɼ—õ\æú´û¹V˺õ8[Ï¡/Ígƒš÷Æ?7kº¯ÓNËúqÐV…öç°uÉv¯ÃóöÓLGô#\›¥ï^³þrïÑé¤ ¹çÈœ…ª1üvèÓΑH:ÞÅœ÷阥é&@2Ã×¼#ìË@|/ʺ$kÛØ;3|%³¹RoŸ}š\ÙÿŒ9tÈ 9ÍMI§Ê§Ñ·ØIë¦Õ@~læûc» N\ÈÃ4“ó~œàr£öcô1tðw‘Ü8÷¼Yo|c™+Î!§6xµ—i|u;’´ÏqžöÙ}ät ŽØîHÛuŽqè2×jµ8îç/ûAþªz;Á÷ÁYHn§6˜Ã1ȺÉçö ³þŠßítO•fNÛ¹^È· uvñœ·Q Æi»ª­›]À·ÑwB¾Yã–¶q!´s©mÿ—´s–~ÖÿSN…øMzŒ%#{ì«öÿ?°¼¯£¸†‰\!ìç»üö9>+)Ñè–8—Šó]ý±M\wü½ûá³Ï?.>çÎvûâ81 —ÄŽ Y|…BaYƒübRÈ&$% ¡Vhœ" ¢IRV1UÛºJc5¿“¶Û²©Ó` U…4ª­Z™º” ¡®¢á²ï%ã¯I;ésïù½wïûý~¾?üÞIc¾Ì4#Õéf´úŠ˨q€€â†ä6"ž«Y ¯~>P}¾=¢w·˜ÿ¢èyAÌÛ%ºÄ©S½ÄÈŽT/Ñ'Ž‘êõöôŠÎüž^§§·g°‡èéuwï=Ý;wæmÏÕWÌz;ºr…üŽ.Á3Ò;ºÜí¹ž‚+‰+©+Ù+Ÿ]¡¥vÜÞ™îÏ[ñÐp ðà(à ¤C€AÀ~@ä‡{Û¤³éˆôvÖ"½›Hç\¿3‘F‡"Ò 5ŽO7çJc€“I»tp¬Ù.½¸”^(]\(m4JGR0Üä”Ò€€ÔþÔ`jˆj´Kƒ€ý€©¦;MDëV»´ In¶KÍ€¦^jÄðÖz«ô, ²^ õ€§RpEa±À/8E°DS…` dH@åBi·P¶=QÂØŠŠ¹Â€­ÀÏù$›'ßku¹ó¬‚è´òŽ\+—c·X¬6‹‰5[ ŒÑBR´ÎŽÃq®…äÞ娵h-¹Ö@z–%n©Q"cF -1J gùTS·<ëÀÐnXžUäpÎúlD®Éš››ÎaüêF͇Æ1Üi©Cã4üŠM››Æ±[ŸN{àgÓÂ8•>êùo»q£ìÍî©ÙДíónÌVéQïF$Ã30°Kþ?>_Ÿª_Ùuä)y~5–ç;s=yàñ²ù±¹ßÿ³ìbæg\W d]ÙØ8¿àœI7±mýrýò¤ß (g1UØýöb¿ÝO¡™rrF¥Ñw¨€š„ ƒÂär êa±·v"Ÿ*ª mÆf•wDãæsÖLšU5Ãæì¤jÊuEU”18””‡ä¤œ\¬Ë›½k¸FßDÅ(Œ–¢×ÕbDá A²4FU`1æJ„¸Òªò„‘c<öÏ~­.²X£.Œ™‹(,©B®’Ôˆs>Õ×â;ã£|>—‘A)Œ«B)—kÑ~ßCÈ¡i%4m(  %û§í|,fñNxÉI¯šŽOÄ=67äŒ%+¸Ó6Ì8E'SŽC  hñ¢he9†·…\˜Q\ Á@¡AÈ%mXÈ•Heöàjwù±üÒÛUCÊöíÇÞ×nkûÅoU_Ýÿ÷ݧۆºwIÚòµ «ãÕµºÊ—ÛŸ?ô qíé¦í«»x÷LAoUAéƒ_í¿óÌÖ‘ïÿøO“k7Ôw7WãUr{YèÉÕÕZpY]hÍÎú6„0ÜoÏà/Á74*V…H’"Ò ú'4¦Ÿ¥ûèQš¢CÉät,†âJ¨"ì𠤟¬Ç¯«Ú¿–ÓïÝ×>Á%ú>}Ú:â:xŊªï”õç$$:Èݦaeô# Ïc†¡S px(ù(ªzT…âq *™Ä Á„G€6x<¥XZñ•öû7FßÔþúÍÇÓZ¥æÅüëðUˆ¦H: ’‘Î h©ºü}ZÂÇ ò=–ÎGgYž6 ¬ÉD¤YÖ’î4šÙvB‚³”MÇù˜n’=×À,¨Æ•}øÂïµìj¤oàãÚ¹‰[ëÏG»×Àîex/±Ÿ¸Ñ—«²èI R% 2ÔB¡Gs;øËˆÄ£,qQûÜ6!| Ö{Ôt–ä‰4IÒ EΫ²ç?‰Ú3ø”Ö _áÙ»D,#Q™ê‚jD\y$ 3 AºQÆd*¡¤Q¯¦Ëåáý‡ àÞÚèGô͇‚ž™u³_ÐìÄóµjŒáÒ-ä-ú–å;µ­²ã«˜ª$—X ïɈcVw^†cãìK²~¶—pdPš ~9”ÔµO'çœÕïÈAþˆpŠt ƒ ‚DqÄ-DrŽÉu¸ /:þ›=+…í¾vyâó5‹—áã­[ª7Ë­­í›ˆ¿ã·p횆~z^ë×^}qç:ì~G»{½ñƒ?â¢k×ÁÖ·!Éïî,ªš@ ¤­ßÊEÍ$&™Ó†»=j0,C¸XÂ`ÀGâÄ‚ @E QžŽ%eÐêd™ÜJÞÓÚÚÞ?zãO?eäÇ?Ø"ãÚÖ=…6Ò¼¨{ñ³ßª‚Õ%ó\4•o³ZÙ1žÉ?]¢^>‚ÏÙð^ç“y´‹1œ2œGDR”Ä^š±Ù°ë¼)óÌZP’IyŽB%¤P®GùâÇÉÏWJÄùo`@c?5óÝRá/¸øB[kMm«]ët¥þùÑ'÷2oN½´a ±ïŽš>\½¢eÛ>ÿ/÷ܶ?¿|ðÁ꟪ԭY ~'Ášrôé¢AgtvÁ¤¢R6ð¡²^õV-1Y¢Á1ÕŸð§ü£þ¬Òÿ™Ÿñû=`Ön —ŽQŒÓåòŒ9ÜÜøì·`#X¸`á¢N :×XÌrE}³0”3HFd às•d•¢ ãËp\œáH.Ìõ(ƒ±+ã 9×ÕyŽd½¦B•Wìà:Yç ˜‚ˆÓù‚ñiYæc¼^n+ÂHÆÅÑ"¥€ÒÙ:k6(„2[ìÃJ$:G)ãw øŽ6ÁðKuvÕ—­YwpæúÕ/NÌÚ1ftØÂoVš‘™ŒJ‹Ö,ñ9sÄxÙˆ´VÎ̬Àã~ãyãm#q#ðØhQ1òáí:™›üÐãaohd1(̘r Tæ‹ëMO:¬´ë‘;^þ”œ·!Ö_G+ΜÑ^ÑÚ‚æ³ÍCíÚí3üúPó;f;xÐú‰LTõy‹W ›L„‰n§-½ÞŽìöt'ÁÎÞˆpMÀ‚À¦÷Jö0ÃÛ(äù9Vekã1µÈµ`ûìĉö¨-Ç–„6Ýïó'ÑÕÉO I?)”€§.(T…€“jÇ€Ä_šã¿ìÅxSÎì=3û‘²O‹_Š}[”…ŽÈ«4FÂß Nšª½ÉÕÞëw¹´{—^Ðîï nØ»fÊŠ5;wìÞâL ^u¹xe2ÌuN·ç-n5õ˜°Áäa €ñÐÔ=½&“‹ô:W¯âpæ>Ñ2LNT–Ê¥n‰• ¥Flˆ¦MJUG q8%1N!½A/¡Rx¦r#=dŽ”¬¹8EQ„ìc<%·´ëãÁÁ[èЪ HŽÞ=ݯÝ{ = Žÿ¦3^Ò¶°z}¤vÁ&)^P±²òÓ¹s´Oþ»Ýþ2 !íCM5G†â­][žÙºkÕ‚ÅÀQж0¥j.6ˆbF»ùc36ÃþEÑ"ãrÜY,c.ÉBÓñRl|€¥\<1Á½<ë~Ù܋ɛ‡×n }î­+úݵød¨úàóßÿÕÝŸiZƒ®£T˜\#“ÇÉLbJ˜ª&Þ…6»¢ËŒ›Š”˜~«^P!w¯ ^ÚÞ?àg]~Õ_íßáßïçüþü)½éŽü^ƒPdY)¤Ü ÀMÛ„ËJQdW8!7zÍtË„M¦¢¨¬”+Ý «•Fœ ˆÂè„À„$ÃI˜ÂTf(Táq”Cçõ––R.6!g%Ó‚]^ o]]0UðmãÁbÇÝ£Pýä²c]Gä˜^¸¨µeÕKo½yoGš¶l~Å¢¥¡¹á´ÍU¡o·Ì«jbíþòºÈ™–Eo¯¨SËJÏ5oüùÚ©¯<»ó$ª© / U- ÇË—·wÔ/ßÚ¼3|ƒ 'y»EUvxP›é °Ö ¨SJy*É^ZÕ©ãì 0¯€Ä£Cª†ÔùFK“¤Óé°Ã^Jb›Þ’Á@²—)™F¹LJb( J:XZ‘Õ耵*øT°ÀîÓ>ß{çt?2¾¦ýH»züR'¾ÔVWÓÐX[׌Bþ+BŸ>^2®¼x»½G; na“Ö]s„eÃ[Ú)‡qÂG~˜¤:Øcå½LŽ æ÷°‚ ‚¥2º¥Ò å`y8é«RG½¼‰G[{,]‘úD}E‰™¡æ&W4Jb&9&)¢l…Åk%É ‹Ë’¾¸¿ L£µlÔ4Ž3Î;ÒhIÿHCÞ³¤‰~.ÄðL½À!ÇY î#Žç3È¿Á,üq‚!'Àôq&qˆ%|5SûÆÕ›/\¯²2`0ãðùý¾Aß UÓ.Ý v=œ‘0„y(¥ˆˆô?è&Mñyødý «0îi_ÂjÛÐcä—¤E¯«[UÀѲ ‚]|=áYž|4£sc¬žÛÈìçôw‹öÞQí=Û­‡¬þY-d²¹Ê¤Ç $Lo'€ÿÜ ÚžT¼LB’dêQˆ ‰ LªJZ€~Ÿå@æ±lE¢ÏRÓô[M‡³ƒ²²¥Ý²awZZÖ¹>ûõlœ æN6=…Ñ6Ž{½Å¾0u a}¢¸)=ƒk¡¯ª[+r`S´g'/,Ç?óÍôÀäø'ähÝÉcÖª•7HÍx3ùÙ­vlYóªóöç±Ö<5ïrÛ8/Ï™cXg̦D ­ Q„¸;Lù¦Flwn·yl 6ñ2]pâcRnj —&¬@qÚ¨ìêc'Çt^”2rÓÃVÿñ_5µ¯X·¤tSoñÐôë¾uµµk>¸ÑR¿¬õ:wö‡w…gäz~ú|ó©·lgÛC©•Co×VÌœOûpùðuî.p3‹©T§|‡ë2Ãh²"«55f&¨Ho6&3ÆÙ¬²Ìt jÄŽ1[LÎ{ÚL‚nc¤ãè”HŒuIç<ù‰¡ŸE²í+xg¸ï–öû~´=…RÑ#ó´HjºgãìCßšñÝÎ]{ð¶£ÍÏ¡¥Ð¸ëQ×À'OÎÊž6}ë’¾/~ò"í§#€È?ôYžNuP‚BË1‹’Ï#{ï౼ݒaiHî0Q[Ú·à1ðU‰R¦è§4è‹#ø‹_¾^Ùðþ†ÏÄ—¡¾ÆÚf|—;»þ’öÅËÿÖâÇdãеòWÞ½ù­Øˆþ4D71µêt†X &1«P-ì@?ŠU¸,FøÃh`ak†˜I:óF xCbØn2›F°gëû òcêB¯äý¸ÿ"^ÎJ¨½¸xSû“vMû1ÝÅAДÿÀ.Df®ZüvqY@Ѐt¢ÇCÒã‹Fq4>DÿzðÄuÔÇ×àéñ´RÜ7ÌhWãoѸK‡oð~à‹²/rÃyFM&†ÓŽ9&gŒ·ýêjŠê:ÃçqÏ}®°wï (..»¨« ŠP„4·Ñ@›8E[_ˆeÔNÔ¤­ŠI¶‹ï⨰ձf§5c4jÒø ­Ÿc“†6Ó˜Ní8Ĩé8£15faýÏÝE‘™Ý½»Ì¹÷œïÿÿï±?Ûµ,Œh#ÉŽê#õA-#Î@ô5o'cª,üùdR‰œT,Ó±Œ©æ)›DW“?_äý“÷òcïŸ?õJßÝoÞÅŸÍY»ø•#ïí™¶¥–X¸8ÑÖºè]¼ðÚ¼h~õÜÛüÓ¹Ý=·?;iK9ÙrêWbç’Ö4 »bx$%&‘€zWIH)‹Èd·c(ásøk|—s“W°ÎD?ÁÀ3‡Rû Uà9…l_ëfQê!±6Š)e±U¢Ë…šF`€ž0ÿûðy>Yð¸C ÿ†tÒaž€mé†á`µbd(i FTwÐ×›ÉÌà„¿LÇ’‘ûø|-¿ûé•o7ºðìeŸVÍ:û¾ìåŽ6µ¿¢þ¹áVÓ¦*ûTöØõ»i7%;ÉYÒ­Ñ õW„0&«šªhc’ª(mI*×¥k%Í+IZ Áš 2nHQ „ŠNc-Â}*±…‚¸‡m0°••"Í Q¼D¥ o`óˆCÝ6ä­Â…ê>«w£HÄÁ çi@ßJ²—ɼÄMR˜ø”tÓ)Ã%2&ñy_#©»Ç'p쀉ͅ³14Ô’ *-5ƒ˜¢ ÑÅíÀçÈ™ÞfÖÙ{ˆ¿ ëã)Ö»Ð^;MV±WÍшæ×'”ªÇû{l\¸ñêÇET¢~-·ŒhÏ{ðI„À=‘–[JUÝG¨—€§Ñ5mÁp‰‰Ãê‚vp] ø‚VêJ „³¢·¸†¸8Ì„)1Q` ™ÒãòЄq8 V>Òdåå`q@ÈÌ‹“™7®“Ÿðíü ~„_åÛ úè˪¤çz/^p¾]©‰ÐP=¹†ØÊarJ‘IWÜd„")°«u²W¢‰í0‚´€/k JKŠSœ­zÊøçLLÊŠ9…³ÄvLñ¶ ¿EFá·ù¬Äe>öó ?¨¢Á¾ËÀíà—iÀ/CPª²‹[U }¦‹*ÞÄ:Ø.å„*ÍfµÊRL3ãT2㺜ŸœŸEÙh€bR”O4E,¡CÈt‹áÈ'ÁAa%‚ÛñÜ€·ä'¾½Ï?ø+>÷æößîy«­õä?âÚùjþ:ïçÇŽ½Žg÷_9}ò»îS§…턎Zˆé0›ãìl xC·€guOzT ­ei1Ý«?ÔøÍ&Ud]Ê ˜Ô|'ùæ»{ü¿}Ÿ—ã ë—Í­e7ÿuåA¢‡þ¨®úé…ÈA¦NÞÈ EcÐj{š$á¥Á5AR5¬6¸í JÛ‚­!Ȇ¤è,Oω›0¯yÑf/Vƒ˜ðsC¡\IòE½c½£iá´G¼ [ô8æ˜)øv ­&¾¦|SFfF¦ #ü!3l0§ÃÑe¡‚2A?ìÀ¬ì‚§~½ 3Øq•¿ûá5܆†_ÀÛ8+}3¾yßÞ¶ÂÑå/UWN©Ï¼T‘ž1œÆü?xç¼/ÃqÞÌwð‚õ^9yú“;§µ²â?þ©î”ö;Ž3 å£öS†å¶<žµ¦Ûkšn·…Œì8ò¹}-¾Ÿäó¡ü8¦¦y6YØm˜V–'fšþ¨‚~ÉÏŠä @0a‡†M¼% pÆ,-z yšh ‘´c™pJ+†  ‚Y":v"Œ_#À·¿y¾nò’Á¬îËý¯0¿øû£N¨W>ïå ¬ó‡g¶¾x¤,™“ãYåçspל쑉ƒôy¯öÌøêi‚± é²5Pë±è}»tÃÈ? w½’ÀÌÀ†;o\!yF@b™é¾éöaŸ/'î•`©!ua‚Ha *ê²uÝ(ŘÅÇX¡ãýwìÓ,uÖ‡Ü>’…/š™©FC…¡Fg™mÁo8Šl+£¡Ü¨{œÛi‘‰Eá[á$TaÑa§Eã$½_SªQĬ‹FqÚ» T_šTRš?QxÁ”–C¹°È! õ¨J W­«_:aÂQ~)Ö²+×Ñ‚a|–ùšéyþf<㕯ñÿ~Æ·ð|=giYm]eù¸q£¦46hºøË\ËZ4oÊøÀ°áYöúÓÍÛn¿„ýÇ"˜Óv'Ÿ ·ÓˆÊ< !RLaE"9 ÿ“¨|$êE¬žOà|˜žŽÞÃÒt¸Ç«ý7d/ÜÇ íáÀG­²Èиj!7õÅH6h±'–ž•¾ü!÷@ÿ4E’‚œ†ÁlŽ,$Ü?I=Òt|vÆÁN,Oìß–=ŸÝ¸jåF ÁŽu_ çÖî³õçtYßÚæÍ_„ç3èx°HFë횣E NÉrË%&É1G…¨0“ Æk‘ì…D–(†ãÊʈ$c²áôúü’VvÒE(ˆP¿€Î‡Ñ/˜ W<`Ï‹ åÍcøßøü4þ8ÑÇ‚P~!p“˜œpáÏùhÒ'v>f3ùvÙ(u®ÚªÒÿ³]6@Qœgß÷Ý]voïkwïöŽ Üw‚à8à€zÈú ¨€ŠŠÑÃo8NÄ2ñëz~ ‰µæ”JL´µéØN5¦µÚ™èÐ:¦_6´%ÍdšVgt'NÓ4©rKŸw§» Ãîû>ÿçùÿ/½|0¥$¦xÀF–>™&ó4Œí o¼„U‚ìœÀWß„.M5/9Iéø1Þ¾ãT=NCÝ,}n~t’.LæÂŠþ:ú¶v 襤oÿ=F1¦±6¨§|•"„Naì<¿$ÀÁ‘ÌĤ?¾w¶dPÝØ=VdfQTuð%ŒÝSs BH)•‚Ó®é›q:/¯ÔGŽF¾'–’¢L¡ÒD†CVT‹ »D›r‰&SHVò*â’¥ÊÅT ¡@ÌUéjÃãN >®ª‚! á‡oÂpñWÎòý³„OiD’&ãô„&ÆÆ[‚¿U|æÂ!¸R1 a"õ:–7TþbûÕëËÂ6·vÐiáš»N¼{káÂw,žÕ°98Õ5¯ÙãÉ;{Þ®ü»‚¶]þœÜ‚Ù…ß]¤ù­˜Sà/Zâyþ»|EÞìEaw†v7Ûéq{fªç¬[LêÕõ²€Ò2•M­R3-k,Xtìd„ÿ¦Î 7¬KtÈåJ°¢#a‚µñ‡yœãÝ|¶I(.çÈ[HI ÅôZÀWJl¨îà¤2œ`ß:ŠM!½>4X=Ø:¬íümß‹«ç6j14ÐÞX·iÃüåÐ Œªj÷µÇ—µ/cEÓ6ÃŽ£½»Oìíé….­‡$v€Önj¥ZYÉVH-ì*‰ÙO!»=  EIOH"¨Ne'XG U)Ô(´³ÛAÇ\Ô³b‚Gh›<÷¦¨ªªXÏKp’¬“„¥@§ÐÔ”$˧O¡˜û›ÿ¸ré“o¯­,xmÑË׃¤ 퀼®iKßžõM[Ñ[ÏïþÑÆšWß=wqkÓ¾œ’ëC¥óæŸ<;²ŒÔ¾vì3µ—¨ç¨v¨=³†Á4©½Hj¯ß˜: K”’0‹Y Î@D«5$\°™-!,Kq”ƒ¢8=&d?ÙQ’ô¥ÿÿµÄ/×Û—‹2iKÉ6ɇ!fD‹5Íié¹›üùºÁ0ݹtáúMu Qrê=·9¯ÕŠx”®ªhttm_oϱƒ»_߉®D:hQœ£Ønä> dãRa¶\ »HÂAF6avTJÈ 1AȈÝt`#˜",˜(òdªºa¬ªŠIpëô“àäú@ÊddÅK„b£·3f® ‡<>tr­6úùÿõªAw߯m4µ7oøšW@—7ægÛÞóÇ^Fô•ÿ¢²~íÑû‰ž¶%c p–^ Œ—Nµª^É*óWìÈ®,!{Š07€x+«p2–0ˆÃÄN>gzH¿‚wèW@5Ì_N†ƒ4°~=é1Û)•à´ŸÒò²Y¸4èäˆ\V‡‡µèÀ€kɱC/þ¦°®°" °ŒOûS’Á£hF`ö›ª3þcòæ;ˆçiK™ úÓ¨Õ¯ZÚ=(˜·,;HM#­d"7T‘#?Ób1ë+t„Èõ'€Ms¦L„)•äïÊOd%<"eíÈ>š)¿ÇAÅ–˜Ñèe—dOš_R'òšÅj’D#ÊöR–b,§ÈMœŽMAg5Ò›P§Þ}S}€nE}hÅ«#ǵ›ŸatÌšS8¯eU8ܺõƒXäáðž ´›·w54DߨR¼ùÇÛ‚7/Øs +”œÖ]ºƒ×¿>òbš7hgw¼´cçÎÞn’e½ÀTÔ٨¥×(vìáø>1·¡Ì¬ÔÕéL™Ýs1„)ËÔlŠ7(†(FrÜf·m™<-†K%2\þ gs( ajŒ$O/:³üâ¶·ohíõsë×jàaÉ;+ëßûC2‚k7/ßvRÃdbúá‡VEÿæ«Nš†c圧9Îò</õC»@‘kdÒü…øô£3Zù€?þsßã)<ö†¶çéÏ“©¹êtA„]š“U²õŒà2Ë&òx“,Ûáù6Y>iNèLÐä%:Mú'^ jÙt‘Ž¡-ŠªÎžè¹R]â, ÁÛïíyüèÖŶ<”/,ì¯6»Rgžkj-Úì!+ÝHãßá±HÄMÀQ¾½Ñ7ðyü¦Y67ðÀw€—à2üÆNcíiil¹a¿xÀ&#C[©8£ÂòiJŠïOC"dgš7šŒ)¥Âa \<2n$:ÂäE~Xì±@{ Üp¼æÃúѨ{;_·_Ç&š#jžGô„Ò)­üÏßÒÖƒœ&´^;žl@ß?­}Jö|tBË,•8‡‚ã4ÍB‰Z/14MMª¢GI ‰™Âír=Së¥:¯€·‡œ.B߇ fúd‰Ç‚ïð˜Uæ¸Ï¡7­b¦W¶ÆE>#.^ÍDÓâ™W½7¼Ÿyi¯ÏKv¹ó ªøN²JoV²íä¹j¢a•L¶íôñ¾…»T¶Iž½hϲïõì{½xý›;pS‹º ªk[´(oVý ^ТŒopòVGýú/É-8R›WÝ‘ü×-ÈÈ/éÜüûÄÔÁîlÔâ¡«À†?2x°Ññ³<8ë³îAÕÓ™\ÿÓ×»ârߥ‰c|?ì\ó«÷Ÿž7Â…fX™Ê ‚ª;d<Äà ºRÀÎ-J ÁaqY\ø•IµM!=#:©BʸÅ—龩®U‡j‘Õ|'¦ýLûdŒzs ìXÕÒ½½yõN,~Žf^K|ø…ö˃PÚkG½Þø¨N]ZkÕäïTet3¢.šÔÅAnP–¨˜‘R_„ôwPY÷_ ‘ð'=‘N@„ð‡ÌÏ:0DQnÞþ6˜épLPVDßt‰~ŠÃúç¬îúà¾6Ü:X­gÿæÚ†(,õú¹MyÅÚõ‡Ú—Ú}µFcé‹{_ÙuüÀxök]Ìì…dö"6‹OPL1¹‘ØÅJV G(Ò²xB1<¡Ɇâ Q“9üTxy»x$bGX*“aN‡³Üƒž†—-áÁuÿc¿êƒ£ºªø9÷}ìûØdßnÞ~È!K`H“Í6å#!”Hhˆ±Ð”8(Z2©!†vl)H¬e¥UA[J[t”TЬÅh‘/§˜>´: v0/ž{wDeÐÿÑáÝyïžwïÛ³çœ{>~‡€ä‰Ï®h¬¨ÅõÎcHάkqZñfyŒJ>€FG~ÖÒ—Ÿi[÷üƵmÜ[7RÔ%,¨> 2¹hÜU{cc¨&¸¨Ý± ᥖÿ‡ˆZ/õ .¤´ÐòZ"䮕N"ÐÈË!µ9¼ïü»` Jà“§nÄõ%k4®ØP9þ¡Ürg¹9°ª~²s>­¢iÐy™ä(¼(¿LrL€ë‡aÌàu!"\ˆ¤iò·cYÕí,3[–C¡p̲ŠÃ1Ã(‡GÅ’­âQ/Ú”„—y;P,f%æC„½E“9…>”_Ì „­@Ó-5‡•Z›C=–$ØæXá˜?H\½>z˜žâpG(¤uääNã iSÌ´ÏçX2}ƒV¾5Œ¢ÑaÂËSo“t…q˜-(ª8AÑ)­¦d§!ÇvE””ÆrØÍÍ—†A%OR6yóó¢”)ÄmáÆêº¼¬ ™ÏŸ|uUÛ©7¾h]޳Á“U0}FyNÎçßýQËÊߟp>ø3F"•÷g¥ŽÍ yÃÙå;·ôTOi{,Rʘ˜5Ö¶­`]ÏÂE–{ÂäÁKR=åò ÔÇ"ǃà7m·¾=9 Ù=ÌOõÇ6Ý’ä¥3h÷úú|L 'Ý._½QÏ»jðÝÂ{äÐrüÍŸ-0l !¡ X$Ð[ÖߟdOÊ›—ÖÝÑóÂŒ;¨¸¶:§®éÑ©ÎÅ̹»^ÇO㸣\ÆÏPßpNŽPn-Œ¥S¨QEÊ¢ôût¥OðS<™š­=:OÃYtbÁ8,âQ)¢~o¦|ÎÙT¿Þ#ø¥ÙV5a÷7o<þ3öÊÀÛŸœÿÄVäÿJiT¾DÿªBwlq•t\egÕ+øI +•銪VBÈŠ¬2P¨wÉ rEeˆ] ÚT¸™*KEõK ³äZ™É*²tØ"x÷3Â1ÖN€@fa*Þ……¡|‚ÉÔŠÅ+8³2_)¯ß]ëuQõ¦ ^áš wJæÌÄL†{Nü¿ìLsºåÈ@3û $’_¢z»•äwÃŽ{þxŒûˆ™©TJ]š¬×ý¼üžŠ­&BQI½.Ív¹4YQ6ë†MŠê†ÄØfÓ°M†¦ÁI¸ܤ¡»Ý@¦’Û×TÓM·_S Ø(J†k±«Ý%¹$Ó@7cF>¬$ŹPFÌXl´²AZ'”&µ}\óÁ ¹Ð¿lÃhÃhdå6‚f¾C¡”I1%l"Ìb Ág÷Á•ýû°ËYçì8Ýçl# -e;ù}óÛ8ð4·”In6YÊ„OÅ´Ù“ì$“4“˜!´"} B`qüÅÁ35ìL‡fØÅõÑ;Ó 4 ´­WûP“µ!µ(¬¾&ÔâYÁwK+Ò‰ã/!«.$¥~öÂÞcøŽ³79ÙÇ.:³ðsÔþœÁG8‰ œo°\’T¡Îç2IꅟǦè–ìm à%{ã¸7î€^á€^:¯ây§Ñv:5¯ÐÆí5“…ÐVòv}¤×¤'uùr&¡±#2ÖÊß"oõ"ƒ-¤SÁàgç–A.Äqnëgä¿OK£A®tTxpS”ëï—¢t¨q_nŠF…;'¯ÃQNÜòè¸;Çû%‰j‰‚~ù.nuVV?~¶á팆ÖÊGÒé§±£7·þ`úâŽYQOvɦxšEvÑ©-Óµ*‘ò´ãš¤‘]öÅý™y¨à2m;x\ Y“¶«~Mr1¦˜J Óu—á♜’4ݯ5•–4 E ‘BÎOU™ãå9ÒÙK¬ôæyü«“+G~7pÞ¹ŒÄpJØné·ÊûP oþgÔ7‘`3Lˆ¥c³{‹{—[ò¸ÓÝåîZ·ì†^ìC:0°PA2VQæ7‘ýŠnãó–àóÖ->æs—)yÌt³Ü¬5ez¡² ù2Âí|èu&Ûòb^UÁýºNUWU]‡ÎxÁL)Æü(ÁèI¢5Þ*ðÇ}Å%ÁdtâGΜ—¾ûñ5 J1«=|ªîõâUÿÌ[1öƒ`mè:ë4¼ ÁÛ[(˜LÊ/Ý­ºÆÞ%Y3ñàKßi~òa¥Oyßyíðéy‚µ¸ìá151~*NÅ™b¬Åçp¾Ç¢ì츴^:#×Ë?U å5u¢Ú¨v«¸˜+ÉÕF㪶P;¤]×Kô5úIC3ÆÍÆ{Æ5³ÉÜmþÉ]à>˜IúqÒÕäÜäÏTO_ žÖsÖoµ÷Û¾o¥ÏI©JY•rÈηgÛ‡ýè¯ôXùApyð«!ê] ?>ò?5.¤ºR‹R—Þ÷ƽñÿ0D5ˆçP‰S˜J· w½$P試¨ÿóúRl  §Ž9*-=#s4ŒÉŽŒÍ7>š›7!¿`â¤ÂûŠŠK&—N™ ÓøÏ+`úŒ™³*«fW×Ì™[ûмºÍ¯_ðpÃ# 5Ýé/ß8tw±þ{— OÑ3©ªAŒ†qPNH¾‘]lË™1Šj/ˆäÂbg |1¾3xáö™ý=ý= [ÿëKº«L,KpÀ e¢} Z%j ?IY§•a‚8Í æ&h‰¾X” e¢Û´Jô+5³jæTÔDXݲ¤5¯¢uÉÒÿÎ ÔÀ,ºçйÖ@”l±ZÈ­PÂrXKÔZ»ÓWy´Â¿X wæôŸ~#¬Ãv¡ ’³2Ò/Jhm“4-îë2à ´£ÉDñ·¡–1²._ÿx åtAŒN~›Æ[´Ÿhû¤5‰Ó`Ë–}ý/eØì)»#4ñõ«óz¯óù{ïìÙï¬øBR»¶^Í!_øÛÑ1c¤ endstream endobj 2115 0 obj << /Type /XObject /Subtype /Image /Width 501 /Height 554 /BitsPerComponent 8 /ColorSpace 2106 0 R /Length 37200 /Filter /FlateDecode >> stream H‰ìW‰TÕ~Ë ¡83!$!c 0ú¨mR¸ˆ­K7ßÝÞ½wÞ VŒŽ¶Q¦SœQkikkmk¡v±«¥ZZÜÚª]ì¾ý[=÷M“ÙÞ þ0™ä}¿,3ïÝíœïœïžc˜†aš–m´€iÁ¯aX—¿Ï~5[7æ‡OvÍ·æƒ[¼·ª{µÄü¥#/Z;L}ˆDÍè; MÕº¢ì°ôˆdã’f;cBK­¶ê¥mœDI£eLU͆¶i´·Þ†ek¿Z¡w[ÏX¬vè95ÇèÄÓ¨µ=ÂŽ0JêŽe+úLýª’V"<ÉÜÛHXÉ–ÃuÌZÖ•]ô“µ‘\Ûn¨:í6NNèu¯8Ç®&Zë«+ašiQv˜ZjaG(P‰ú úÀªëRét&Õý©ÕuK&VÃãX“J ¯˜?#±¶ÕðÔ`ÿàêÔȺëëÏzýº‘ÔjxÙrâÚ:¿¬LÃö=fGÿz{V²;³c°dÝŠùâÜÖŽÔšô†ôšúÊÞ°&•ÙÐúP‹ÔY1éïô¾ÑõÛÖ‹Ucy¯âªä}SzÌ´ÚÜ鋵Р¹+º-äŒÍ[ÆÖLZ¬­NÜ²Õ ï¶eÈŒE„bŒ¥€¤UÃ1éËö\­“¾,w».÷fk˜ôedXP^nAcÒ— ,³/·ùÆêç˜ôeè>†ǪŸcÒ—,+a$·n‹I_nH®Mm?˜£éоõ-ðyb\kXšëþj¦Û£©í8Õ—>jI7F37Y¦e/ì‰b\sÔ’n®¾yãý@-é gÇM+‘Xà#Ÿ֘'ïÉ[fÅXÒ˜WÈA ×gŤ/yÌËt ÝŒk÷¥y¤·‚Ù»U½e@b[¦™4›™¡Ÿ\vsié\óîˆt@ @24TSÚ,vg™6 ; !лÁ]h3íd²áE'¤÷:Bçr¼­b-­<·[˜Ó éɤm…ÙÞ£¨+Æ\+Zÿ>¡}£#à •¾á}¯Â°’–•hãfzO뻩U}–ùfwöœiz˜i4ÊáRC'¤WÒÛ%Žæ²z»™MHµûlØ0ÄXÑ¢øéAØ¡%Ö{¸ÓÍžnæ€Óé M®439 ç„~l~øý>صW¢©luDúÊíÙ¹k÷Gw÷(öìùØÞ}hÿ­n»í㟸}ニ{÷¸ïøä¡CŸúô~ç3»w.À¯ vîÛ½÷³Ÿk’«µ¤C]kÚMz;;y§‡ ¦ˆ9ÜG®G°/Gˆ Â0g’u D¥bR!LÅ’F çyÆS˜†$vD·ÛI$á' ú'…ƒ;hÄP·Ë/b ‰îŠÊôDBÞ@zÒØíHpÙ#wþž£Að…ñcwtòûî…çªkÒyèWÄB˜£ 7j|~'¿ïþâ~q—‡8f¼ÛýbÒ£å½QúÆr@‘Ã|)ŠÅ`² ôÐÃÇK9)¤ß5é“҃̕ SÇ#‘™ÎÔ­_† 'ÇW•q év¿˜ô6¤¯¾ûÌFÒ;¯`N#„•ØÀƒÏo\ îÀD»þC’(ýEDbØÑƒR›ûR»P)E¸ðªs‘¤t¦!öÌ…a0V£BV ˆøJúlW{®w~æÀ ¥]PôÃ`OQ¨ü¬QŠKJØØ_ÂWh‘…õ"9Çd.Óa¿©!*±„ÓžËà¤$ßHºSæy0n"ª»D¢…fð*Ђt}‡¯Ýpgé?­rŽ`ù5´t¬*;0}LÀŒk?iƒ÷ˆë‚ßô~FL€ªa… yw0KºÀÒÇ*©§DRGSÂE^™¡²ÇÞ³  ¸2A¹“G„–€|É(¤=Nu!Ä@y+;Ê@‡vPøŒæ2]×#¸\Pøš*)àr­#Ý…Xžt89XÄi¹Œ‘X`¯ÍI7 ;iŒEeúÍãÓ•Ði/"‡*âƒúrI µNꬔTeAݵ_H¯£îZ§Fšb\]9²/Ù·¨è£ã2`¯‰Ýð&– Ÿ–ô~13í×I¶™†çK½áÐÁÒ‹ãí°:9ž©M9ñ?ÓÓS·ÔÜ ¯c¯]éoý)»ÕJ„ª¬uÿãÛÓE½ ¾È¸©C­›ÑSAkž€Ä ì”ÅÝ“ Ö%¤d=¯[¾ÂÕxŒdœ9Òùòi]‘²Â¾ l™ü0õAÛfÐD¸y@ ›‘^³Nò^#L(#kßéYvéñHÍ8pê!Üéñ ö 2ADÚ“œ0Éb„»ôî\´k²Ï|ºÇ1!b“Y~…7Jâ„ró\Õå}誽&õUµåˆ £‰½­î³´â;ï=¼³öPO?òg8Ž]\4•ó+,å“7ú)¤@蟒w²we^·ãÉzºÞÿs€Ìó‘îU0xÂ@j6Êë¿F=•úájozgRœÐäʦÖþ²¿î!NÝF«z¥K2Ý´Ï rv}ÖZ³.Ô‹Å”N²{iw§É­ÏßѽtëTњͺòª²báw ¼j}šÃd5 z%™m>sðŠVS, ÍØ&Ë*úƒ;Ñ~ 9mâDf¸0’$ûʘJ{~Úš¬‚åKŠ”Púèþ‡Fô’iv¶X|n¹® v´M†Q0Ú$oàô±©û «é–÷JIËÍ'ÚªK»÷X‚3îWƒN<ÞŒÑ>õ_bi›-z”‰F¨é¬TªqEQG#£.÷¬œ¤Ž,Þþû½¶”Ì-ò¾ÆÔ­²”?zhÎã3h#â(nÍw'+]È5þê:.¤£ž}Ò@Ž@±‰\wlÛ¢|‹|yUù‚[8Á Ez„Ì@?„ =Ô‡÷ôÑ\a²¨_…ýÿ#=J!wFåõ_#ªô/’ƒÊÙù±N¼ ê*(±~šù¢èXÕ  _þÕôר2%›ƒÀ[¢Æ¥cs©¶™î­µR”ö©!V–9„q»À=â¾b޵Q~5ô-Áò‰¾à}ì!âŠÂc8KbIfe•}—z\Ž[‹žA_U46Ý<Ì?J%<Ð雺B§zY*ΚL§H óHI»žgYi¢À!^D©ã uo¢RôÛ †éՊ<6敹·/³©ðíjÐÁv?«C#”-»ÿ¶ÐõlðHs9a.mŽ Ž!%$µpHò)$E!ÃmiϘrÇŦmïo5œƒ…ô*ytp†G²²ÍÌl5ó~ÉçÊϲ®ÊñŒóµ»?¹t¡é¤(Ó߉âÂÁ-ü«*§\ÀLɬ6LºP(mE›u0½¿cEÍ)GrEfd¬ÌJa;ÊwÅh£¼þkÐÇÔÜ/]W¬÷…p¼ú³ûŒ÷ª´ÀË)J©¬*ï ± ó³¼ÑynÁAD.ëJGyÛ Ò@g©B”œ1QÞ®Ë[áfè#¥–‹w½Ú½Û¿Ç—¾íûò€i7z ¡•–íÏZöZGhfÆp`ÞzRêúh ´oGñ-̼ÇÊ‘é1iñYèãÑÿ•K Ëæ0xü²Î¯-ñÉMdßGTé÷á8”ˆ®Óþc©C¥wÙ­êÞ•—kì†åu÷Ò.”V—¹ýL€1)úÆ êC#>Ñ“xv=ÐCP·'ñ«¡›AÍuyÔ–ŸO*øy%]Ø"ÝÛ‘´ x‡E\ÖíRßâ¡q"oK¨UŸOºô;:9y½ChÓ§zú|#Op8Èø³„™' ƒ{&•ºe,ü\»Ò?w¯ÇŠë]7[œãÀh+q:ˆ0Dñ €D Ô ‚ ŽÈ t_RÅV¬ªÄYX5 ç§Îº;x,ɃTVQÚ|2Ïðba›òºÕõ†¡‹™ç0mp °FQ¼á±W ƒ2›3Сbgkñy‘ïb°kxùá†iÓžjó”‡*=Ö­…"˜8@­yv(8ÆTJEW0ýÓJfHóÐŽç,Gyݶ]×vÙh£¼þ« ôšš¤Ö¯ýÖÔ·]bÕ5MιŒ1%¨Zý‰Àr°H*ËF9ã%“’,¹|ºˆ¸÷Ëçœë7 _jÕ¥]€ šÀ ._º`ê÷ö²X·!-Ö‹žX|ÃÐ ;\6æíƒqÌ™[¸IK„ÿ›2™ŠnãÝ‚ÈãÔ½¤‡ä}….£(„¿ñmɸdÄahaÝÿ°_ö±Y]uoyÉÈK[Oc«Ëí?vf™g8ánNcr^ï9瞇hWžQö¨)z¹6Ï}èÓ%K!2 )/e %“ Åh t™¡n1ˆ¸„m1qi!ò0Òø‡ÙtþãïœÛ u­ÿ4¤ýµ}zŸ{Ͻ÷œóù½|+Û< ÚCO5ʉÛ8ÐgÝÎxè³g­Îˆè9ó½3+bÉýë7\p—Í2¥™:g˦]ƒ~Î4²gÇ Cå„‚g΀oÔ]MÒi“€.Hõ؃bÙé70PG”ÿvºdÚOe☈ Ê^š4t6Ï&óœÙ||4ÊÐ[·j5·Õô²é?üEbªÁ—ÛœPL +î{oƒŽ»’3½>튑–*^e¡í‹UÏ"&§åÄm賫gÍþ¤š^]ý,îx~ÿ]ë,o·I»¡rL÷Ù=‚{&Ê2¯v“ƒÕ#µb÷ ‚Pµ<ì„QѬ'D¶Þ Bùé®6¦° Ä0Übéh#Æ"5.:7i褾Ց=N½ˆÄ±ðž´%%¹½Ð¯FDf[¢§7;UbÌ×…"¢7¹]œ´5ݘ-K|¨ËßC’Aé·CïùHw´?)½WWýo‚6JàöÊ{Nvƒ%ÓZ4¯hwé ®)i÷‡::lnB·­‘Ÿ7WgqŒj«²Jfašñ¿¬ÈNÌ…w;}´à~&ó.w ® 9QÛªç’ɧ÷:÷ÄŽsÒç-]”-8`s‰)Þ–ÞÍvcvî^»¤îÔEãJé~›(Å{ i«h¡ë÷.XoÉ™+ó%÷Ë ¿¯õl{@¤ SMr6ž›[uŸ®]ý?¡WÍY ÝÔ ËÍ6#»p*À¿Ü BÄ33Hž$gsî&t»É~';þ´ïPýW6$N˜Ï E‰¾Ù¤ S³½g„ГV#$¦{è3“‡Î`nàͯÖA1®ýÚðÓ2<} º+H9pŒ’í%\k7hJ?… Õ;ú: e]¶o€jðÚ®»Þi·‚¯ø‚‡BAN5ÉIØxÐçTUÍ[ø`züð’Wî®Þ¿{͵?–­ý_†¶¨{ô÷ Tç€w €ZÓ‚ ›ÕaÒ’¸”/úݽ\ªœmöî0ýL+/Š™[–˜OîpTJ‰i>~|ó(XøYÁä‹§`z¨”´ÇX,'ànr¹:˜¾·–ˆçJIébå,5¥´MsºÍØß‹Ök'(ìß[‹ +A¨Ç&28ÛD]Ùƒí´Á—s‰+¦0<Õ'oã 9 ¼â&ôeÞ•ùÜ£¶ƒq9<í&±Œsx¢„ðð%×)•Sǰ—lS›Ì÷±|Õ¤¥Û]¹f?ÞÿÈSJ¼ú‡m­ öJ¿Eâš­emÐd•¬ m±¡V4‹UÂØÒZèåB@"nu_…HE^.VŽAÆë›;ë<9˜ñïSjâJ0U„7Û» à.å$nÎ;w´Q{³Çõz…$DÀ=oÙèüLÁNhî©F8y›ôKöWÝ-Ôç~~íEˆAÇ9.<·|XëÅŒ>væa6‚ fç?¡³yÁér¹`F¥hiì\£„а¯ôÌ“æ {[¢ Z œ¦:™¾f 5»z›ôØjÒã\#˜eÅ„jJߤù¸œ@dކñàùdÐjŃT Aì™’©|ùEç…ôv ¬€~jt–Š3BåÇŽŒæ6KÜÚÏëî¥b>j‚¾ð‘jw꿽‚jz^ttZyØ7Ïg³HZq#2_XzÕ¶FVû˜·¶Åén•—úÇ».¸+¹r2Cuš2¬A¬íè^@ÒÚaË¿éá‘Ëf±¸Ñ:rýTzô'tTL]j=®ëÝ¡)FZ+¡txÄIS -w©zÔãîzžÊ êL«›^ûìÙTuØ y]ÄCP›TîI“}ù y Ðupô·0ªärBÙlßÓ‰ü©F8y›ôcËWuoÿa÷ígØ[ñîÞv3šÝÛ¿SõÚI)ÏÃRçϺK×.Õ=”®iZA­ôåÒÓ·§÷í}㛡€>—)xa‹¾¼µÙmu¹©ÞW±5û®X50øí¬ü'öçó•­‹¹ÔÑJ¾¿)ßô¡”<ýùÊHCœ]êkÊWò}§1£$lÃOõ> é;—¼¹F*~¥¿¯ïHÿ%Ò"óa¾Ré;þN‹Öô;Õqáä ¦cô(ã‚wßÚwá*¥ CßH7d}IWòØWDrEˆK¢ü˜¯l$‘=bÊ=àý%L#_úËÚÅ;~‰‘‚,Ó”Ä5 „Jù™(ÔÌ‹3ËèÒàB&‘J?ŠBOsÅkAó/îB°$tæÄ÷lô$¥â^Ríc6è³³™Á×;jzuÕ§¡Ô)Ï>@{ðZL`$%'L uÐ )FĈ¶¡Uœ‚XÓ!la ‘-4”J”é{˜aë&k nÁ£6Q­4ƒcÍ¥uŠÆŒ”ÌÓH¹„‚½¥(…¦ 1†íIð,X´Q<š ˜DŒy c­”†·Sï‚q bgÅ(‹¨®Ç ×ˆÒ2КX(©`8¸¡Ge€´®Ám, ZN à™m°RI£)&øØD"½úSwÍ~ !Ss¥!¹ãp’ K d’@Xjˆm # %Ø'œ1hk ·W†û˜B2–°—Ü#Š€C(J_([Z…›)•hwyŒÚÚO|PðœHmb=  <ÁH((È<*)@ǾFœ†>”+Í*pâ>Ôú2¢ö) a4ÃÆ+x¿†3˜œFö;¼“C]çºAIsÈW’ƒ´®w¯ÙD cé–ø=¸èén3Ч¡Í@Ÿ†6}Ú ôih3Ч¡Í@Ÿ†6}Ú Ïrsï4ç‡ôßÌWoˆ\Wßl hÍ&†$lë6I§ië]*´ á~ë¥ý rÏýóî=SµÒé3ÙvB(AkD#¢Zɇ*Òª(XA—HL%í­Tk¥þ©b¡ŠLüâï¼MýÐÝî,$$¹™ìμ÷î¹ç÷çœC9ΔuÔ9ês"¦![ùbÚŠ>µÿ¾Ç~{øÁÃ/=v]¦ècH1£)â±—áôZ‡Ùd Ú'ÂŸÚ Ï5»ì¯txÿ_>xÏÚk\ˆÑ®“¿)]þÜüÖkÞ9sKÍÑ›5;ò]O”¸[“¢Wq*h‰ÔuÏÜ_z½"ë`ö.°"ÄN¼O|)r1+'—‚ª›àTŒÌ8¡—_3q\Ì]õjYÆåœIGȽ8Ð7Ï̾cf¾úšÏ)]©:X5ú¥C™8+oK“R¯þcsµ™dþt)¡ €ŸìB(&¡ ûJ‰…æt óqQ+TôÝw=|hn9§°´œÛÇ™ssÕÄ):Æn)¦‚Ûµ‘FnÓÚBŸÙô¯wý@¶A[›‘—É‹^§'ãŒÜU&ã2êó‘;L• F Î\5µRJøégW|l<î•{Ûs–AùËw"Û¼ž^Ö…V:zïúœ·Ý¸¸Þ•ÓíýÖc(ìkÙûÍÛßûSà†Lô&R1.Kå‰7Ž@¶Ó‚ôŸ,‡Ú&îÉï¿ö‡/œpû»9‘q{TSÁ©.eB.fuÿÏ«p±•–"ï B€Iya«rçJÇ÷æò2G9zÝG?½øÁ·¿r oQõõ˜ÏÖ¸ê]Ëw|MÚ0¨@²€l´…ýûuÍÓg/1w z¡ºK¸(åá¬Uu)óqQËœ|ÚczeeØOÎUÝ´Ž^Þ…~=…~gAJÏR¹çÔ:Wn@é;¶í]³¤o¹‘?+9]¨èÀ[ÿäÍU9Ï”BbiÃ1Jx%­jNŽ„3Çím—Ê+UÖÙ£]Ï7Œ[öLv¡cŠ„q¥=g´£Ž’'&ŒIâþºrQÇŽï%æœ2Þ8ºHèÿÐd­˜Ð×`–Œ(tªÂ€Èâ{ª¢VõO{¤5ey>&±Õ}gâ„ 4é3Eì«=^o£Akõ¥ý›ãŽag £† 0ôOÞS{ä˜\Fu :X2ÃHmº£Î"IÖ+J˜²†B /‘ 'r%¼Và‰8!G ÒqðÊdœ”tñl™ Ø”5ò€’Êš¶K¬Híö쬆Õã:/‡ã¢ îçÆÿw­z ”÷,ܸ>è3·|ëE*ùx©üü›só[Ïÿ ø?4×`{l(·Œ©6ËQ0¢e䖨фм¦Ê߸Ì7è7]DÀs=©e0Oí;âEŽpºlØjmPZsH ¿3‹‡‚V@[YIÚæ.×uÖŽ ŸÅ–^Zödϲn"”i¥ÝñH;2›É0ö²´J±È$qHÝomË1ŠùÙoÜ9?7ÿÏ§Ž ì/Ü´œl{—‰‹çÀ°@LÜŠÏñ`ƒŒ¢¬l¡1[Å¡îg%}¿Ã„ËZ qAB+)Ëuä±B7yTΠ/UA!I˜ï„¥ä)Á’Ám¥ 6µÛš$ö†6/•>FDµ90ÿðŸ?¶à›7mšÝ±sŠÒg>uJØø. ®öfþ¹ç~GØ$œ†u£[çj±²Ê¡Õ¨#<À¤\r¸B'H˶¶5÷¶‚à>¦è}®cÊJ7¹Fn@Sgä´®r¬)从'jXÐCNïE-æ8så!ÌÈLE 9H"Y!¹€[$ŽDbQÓ[AâÈq|ú`>?;û“ŠOÊüî3eéÅk¹AC (8W¶oa›Ð«Å¸ê¿ÃvRãRl¹;å¡ >Z×;ø¤)µM@ÃIY³­õ!· |@l¸„WðϺ/ž‘4Nø™uPJ>à"|ýÖñJ^wBÔ Ÿì!~ˆo´Áaá+¾øØJ—†ýšmï_ôÙGX¤ÔG¯»#UJ |Ï/=*‹ƒËÁ:}–IÁ°|j¹ ŠèÐh Ù‰Ò{£2Ú.f¯€oÚÖ–ŠRv á+ô„9 eUE1’ØYfë²K6w\•„êC¾n²Š) ŽÂ0É.dÅýaêpˆ¬gÁÅC,ÂI—#´UöNÎ*ÀþR¹·WFÈäWšEnlÛxßë_Üs[5RR¼ È•‹ízZù ÕÍ©Ñuå°±PÀƒï1+|ƒ¢%B¨Yª1@¿R˜XÅÄ%jTi¸¬ÝdØBljÕ๑Å(£è¼-NÀ×âɺ‹w"¥=Q:*K©"…LiålÆÃà¬sœ>0³eMß¿õúõAßòèŸepí•ÉãM‡¥Èj(¸'#é0# ¹Ú`‹ô/S—mBqª_Ü?Ÿ¨ñˆÉè]h<Í1äôÉÜ%  …¬ñÔˆ²”sò$ÅðIA(Ú‚Öl!zÑgËþܦ%Qã´AÐAä¤G8€L:ÅîpBO­B=ƒn^}w4–Š>(¿ºV7Å,C0Š„F¹ÒR¤-âB#Á œÖ)Ex¹ø¬ÇÏÒ€ ‡Ù,Ø„TÄ%–ì±E•`Ým¼ø°Æ´Õãt5”øág1õyØFGØw›Ç¡º(ßAž¨PÝDÆ08´=Øœ¿ œ…Á©XB3éCAFÉýh¢>¼æ[€ñŽ…›§Ùû_{Rƒ—&W‹ª6V6;ÑUàÇ1𧏦§Où™ƒwÞDp#ù:äêÀq£õ÷Ûošèô­Rï<ÒÓgîC?kû¡ã¨åp¿¼Ü‘îÏßþ?Ϋ68ªê °u„ 0²t˜°CÇÞŒ!?´·Ê…‚î÷Çž’ȰȺ.÷®¹û#e&-UegL(Ž- Æ:°.HZ¿:P˜BK!ùP†€h;}Þse âŒù‘dï={Î{Þ÷yŸçy1@C%GË'4=­ùZˆ?.”Õ‘Õ“ú„÷4¼ÖyßèU–éÀ0$ÚpM(ƪ Tw׬ürq’„¸q¬ÄÆß¬ÞwþóݵÐ\u¨ÉUÙI¾‘ÅÂKM€ÜÚ”Ex°= Â`T[’ììäÅ {αðrš£YͬëðÒ†™Kå””5çlCçÌÊéY¸8OKµ[²m*ª«Í~ùÒÞ†ÃcS¼ îŒ~Qõ40°{íÀK ç6b3 )G\iÿ¬¤iy’+;5c>9pßí#I7m#™5î©Éyæ4(.b~l¥ –1;òp’Ž!Y‰ª³ö¾t²k©î䑯/xz6|ĸ1wÝ´èÃ+?ÅÍ»Ï.§àF¤,„SëÀɪíjIXegôÛňJ‹ny}mb©ž›Ó«Úðµ~2ÐV,á£Ø(.1Ï€õ#ÉAÜ|1¦‘ hü°½È©O´1þúw Å?/'ßÇ.O€nè3o h‚ ñõ7çʵà@¨ŒËg,¿ÿm3¹æ9YÛT`Á±TyåSïáM†±e¯ Á~£æpý²½0bEÒ°GêÀúlèž;Ó* ¦n–ê`ÆkwPÐH·_º2Þ­sí´£)ŠÚÕÂ}JQµ«µˆiïá¿é¼©SöÌ'–1 ÖøÌ6óžZ§¤ôüªmï£2ä^Z$IFŠXC©iô‘Ìð˜«îz?#¦ˆ¾ú¹¦5­ù‰ƒPä»S&+œ¨óéÒì¹}|aa±÷Òɲ﮸û]x‚ñ¸q§ dMóhDq$ضI;‹ÿ Xst XÖ0¾š7Ft×ϰf“FÀ;–Ps1‚NéÐÒ_ ¥w°ûð yÃoZôao†¹áf™G¦x¤´°¡ ¦c“¬;s[E"D9qlæ ‚“4:3âÞôQF°((¼2á< ‹ŽÀ¨B9&Fü%¾9 Î^nr,6ž”´­î%D@3RÄ5-¯T` -9ÀgŸ÷ŽX‘'QMºöŒy-´ªÉ³T`þUYƒÑ¤B_ëtt¢w¸(ßê¸ß„<ŒÍa겎Ʋ$ø§iVÚP%[s,¬t|Þçð÷kk¸ ¹­ËÕáø÷!ŽÖ# x¹®¾• "Ìnìd7•D³;(4zý£"¹B$ŒQp6¥ËЇ­bêòž}è–ºKÀ.´ÀóÞiýtø ìûõ?ߦé·üV]FûâGÿgçVÉ6æ1˜³Sº‘¿?S RA¨c;lò×!=-Ã}±fúCöEbP©ùÑLdäïè Ç“;‰Üì€D¶ÕA“ ãMJ•®ƒÌD´€:‹;>•ŒŸæ‹]š{£X PYeÉl£2{Z‡ÿI(ªtÝàËmjÿ=%ËCŒ ”dÝ ~,†:q¿¶OaɰfŒA Å2\l‰zO¤{NÞ¹óy,µ‘R‘¹`ä0]œl§í %q:*3Sr øFƒŽ./ņË`ž- ¯ƒ ßIç²ÒîTröÁ«ç;ÏôGâöŸ[^'\DA† †Á‹È²36mm.ñÂgüƒÛMöè:r‡ˆî) æYC4_s@ d»|VÙ·P-\©}¢§yºQ)naŽCÅ#~…é°6¦êÔ¼ÅÓ“ I‹Y+Þ¿QKcÏN÷øµ|Q +!µM£à%Çóy‹Ñ[?ùªbÖ^mʚϮ5WPmµÎ3õ Ld6àOvt¶¡|yã‰í»‹~ëm®ö‹L¹Y¨Ý©­›»R9¼±:u+yÎ\Ĉwpu:×Aè/–ñˆTù™GCŸKEÅr/xzf³<Ð\$kžS–!Á «IÖFΕQ¦J5/¿ùÍvvz¦UŸsšpa—MÅ0Lîf9•xý¶2îyÁ³}Õ5u©q ¬H&â*dSþšÞáä ï#&P»ÞÒé°o4½;â$æ¢qA£±çFbäp§E\±áZñOF” ¨ø½ »açÎðg”›"¯qæ ÖÂíø€õ“(½2QµÜìz© "ÿªåB®L"V`¨]8³€ ÙKZô$•_$µ¬»§ž±Ÿ`g>^cY·?Óžžj÷Øÿ«ñ=;ý'šV»çPé£@epdá!ÃÓrªg­¦Ä’ò»8Òs׿Z*«ÖSÍ'<Ù\Ù*@9Ù†ãû”Œ—[øƒbÆ C³{ôí¡ÏMç'’ê+Yx(Ù|rAõ\µØg&2Õ–&ì_0½Ç§6•¢ìÇAÂÓ¨ 9Ÿ<ùëJCÉή7OEknÚÞcjI%q¶D®„•FZ²éx_‹6>ì,#süТ˲åH8o +ƒñŸ£ô„Ÿ_æe l59¯õ@zD³poBWÿoÁ{Áë¸P«ŒÂýï Úuúïn®Ùó‡?ûÃ.ÉHc6¼?&X°â ’äšeÇÇâ-¿š®ÈGnä ™››Q%jµÈjëJ„¨;Ù:I$D+²{ovþ‹#s–ª<ðþmE¿åÖ/²Õ³ôÀ!Æ Š.@ÑEϦàådù­’ éÅ›ó˜r¼öªôæùuqØoˆ-¬&ª aŽX¾&Ÿš³nî½e  Rš:‹Ôz‹ØqÓ{èëi¥©j©¢gǼ\ÎÈHüØ„ÂÓ;Ë…Ü rÔÊ<Þ"Âv­·1SÃòOã × Bèo‡Èý¯Ê—'ÇˈúŽû™S¸¿>öyÞW×:®g¶‡ÖY‚ñúLÔ.7èÿào¾×Ýw8e…´4Õ×z¸‘’[.g·‡èñXãW¼B£é8¤)íévxzã Îá pàì²³pÜ´ö>óµ˜)ÍcÌÿþÏÛFðíÙ¸¶+<Œ»â‡‘ˆ#Æ6 ž#âk¦»#Nš¨4Jˆ›£-Ö@8­Íi—NˆH‰@Û$iCê—”9M‹¹7/Æ¢q+‚?T¢ÊNd§XFfï£ûÖ#à4 Š;)îm9ëaÊ7zZŒn"ÃD¤Ìß·÷;'÷OnÛ¿ëýו1ïz–Øxª¸ða_mê7þ7²YϰÉ`©Ö£JÜ˜ŠŒúD '‡Oe,ì¡ »"lDAf¾×*ÛhoÖ¥ôÓeK ¼WÚZUæ¡Òoû‹kLÜrûä¶ÉÁÉÁc[†ý&~f!}dÔµæÕýWä­¤°å(ìö.á³jô.;áµH3æ¶­è6AÐüú‡Îë³ý¼Ÿ m(·²fx˜½³Òû(½r‘ŽåIš= wÔZX7&”8L‹ZJQ­qC×`bïõ#þ™!¿'¿7p=˜È%c †€ÅB³ThžÍ q¢aj×E¬ˆ¾4’ÙÚ"{¤S“$Ü–eö²óÎQé3>‹UL…ÚZÌ@Óßd©{Â$öéíØ½TEºTI TÊö Ó[[סèÑéí½Kb÷Zò©èNï\îõ#ÞºW3¹È»©[¶¼ÔçAm‰ßÐoáknÕî§–ß½âÌì½Û§f1è¬á·9æ\ëFˆGn^(1S¦A‰Xò—i4àÆ&žÌkð¬(Hj¼Þ—g:‡ŸPÿáÔ¿y'Ð:ÀðñS/þ “ÝÓÝ|ÓÛ°sÇb >¨Æ%f0 ÅÎfáýg¨ +ÂaWáî9Ö£x•§ùu=Ázˆ‚ÖñZK/€’Œê,¼œFðWKÀ¨2ù„Ìå(j/¼ôwçVôô9õ[Mg"ˆ„–%šàÀoq‘œr~ë'ö2)™ªÿX&ÌcŒZÄL_ôY"Ètðn^¼-*þˆ»Ž{ Á²Û¶Ékù[Lke¢…­‚LÄ=sW„œ%VG>hïDïOMšyÇuóð@WÿìÞîÝýý×~rGç¬^6åí´ƒÞ ¶Dpû×Í·L˜¤/²ZŠ¥{÷íµã2Ô<96â‘áWY2¨c$GÚ¦|5œ cú¢óƒþ ÷ûX\„Ð}K3…‘ÅdY‡oíØ\ÙÑ5§³kÇìY•ÞÎ=Lr¡|EÍ+—D†â (ú¿ôf+fI$T9 ™«áB r¬5að‹œyÎ\îyoÆÌsTú§u”]3öÓ›.gV`ÌÙè–%y÷ò@Ρ7CÚ¤2!¸ÓV¯iÃù½8¡²Ó½µ'”c „ùÖÒ†WùÙ{!féÕQÆìüq.¤ úÖ•ÂÝzz© qQ/½üý¢7RJm+¦Š.ºË 3|í’¼X‹<Ì,òÐf§€OÂÁM~ d‚–[ßÏD\ATÝ{Ü­½ê¢5* ( À\Óæ["M’¡ HTØa7ü¿B5Ò7NDS÷Û+ÿèŃX›qø,Ðwi㕯-J£ùol 1ôÛó~ÃbØŠ†·Èþµ~J5od6Œ¼Ò£Œ!"HkòÐ,¶â`Ùýq­¢ÈßùÞŒóϭ軤f6oqîЛˆhc$ÇÕPߟX„»KŽ7˰ôî ã9•ôâ£ÔÍtÕ+ò?œ—mlÇÇ1¨QË‹ ‰1‚Ì)4]‚æËPªrPˆ¢îîìÜÎîlàx9r$\ªcen/># %2BÈ|H+BHˆM u1/…¶iQˆÒPµ4¤¥)jTÒPõÿÌœMEÀ•ºÀ>ÏÍ>3Ïÿù?¿ÇÞ •^8S²2RØšIë:ñn޳U,ß.רOïxÉ”qCßDoOìd]”§}!ú¯J¯Ò[ðsÒy×>mvjS‡åZÞŒ±R¾uÓ¸Lû”ê;â@žüøýNà pÙëŽeÒ-‰™/æpÍgŽbìµv$„rp‚‡RHƒ—.}\¤½£äŽƒœü±ju|8~ó¡eœ¾ÓuѼñŸÍii1cðãu 6é áÀSÑ…+€(ÍÙG‡¶þ8*©¯Uó™¬k ¯äÊR&.mk2ï8m^ÿüwÿÇÄv¿¤× y"=z•êEÝ-¹>õ¡I—_LL“*>Ðx "ý[¢þps¶ÿV­ñȾV¨Ùwî›ôH­mð1U aÐJ=R£WúÞÀã"è«(3„(uK€3VO™j1Y]ç;5Ë Ø;=w*çÏÐvHÕ·è÷0nÞ¤Ê=MD—N *óC–µ¶¸Ÿh÷Ò2kûÉúƆÕï.ÆæDûK&¢©ÝeÝ)•ZÓfšní­qwáJ>K´zû“Ú9NÏϽWûÔææŒ/²3.kF-ªyÒΠϗ6©\O3>æÁO,Üý\7 ÏbÞŸµÙé v:ÐvEK©ŒM­ÃdEkΚĞ~øË½[‹aõðþd«#œÀ¼¸0r™ÒŒÙ'Èt0',¼ff?¾’ºú”pÆ™ïÝýlÑ{kâ7Ì¡{®Rmªm9nò|aWŒ^#3*ÐÔ´(%zÓ(©¸“© ./`NÅŽÈXàø1ÿ“™ˆ^)nþô44…¿”—lãìèoûÈÙžá·bîh¨3A8J÷^ w¿ÄHð,cè NíÚ¼ö%éÚñ€p…­ÏJùþÉ Ty…dÏç_¤÷/Õ :„í¸=hÒ¨³^ÔwgðÀ ÔÁž™Sâÿõ^•SwÔJµ]ŸlŽpè~#â¥øê]‡z—#­cE}&•‚ê¶0¾ø\̤éŠH!é óGO¬$É5}Þãé&³ž=^ëõÛ½`ÁÒSEd¸\m·á æJï$]:©#ër>.â¿X[Á·qÃŒYòîœòWˆª¢ŠfÐÓ祳â<#ˆ¼öä’h {&h5ÓÐo]gZb¾ÔMs!ØV=)ªÈá®î”ŪÇMʦvÛËjï»cgÌï$'©ÁÔê mRÚ‡:¥8iU'—î;G®pb™Äɘë…mô- .8Èx0º~ÖüP­ #~]w¯JV×5áÑÁ+½îÍvez­ùG'G©½?m•"‹#[³({ZŒIBŽˆÐÛ?³]¦™RŽ6.Qž*|`¨ðÒ©ðpÍ H•}ŒÃm}9æ9eNWyG¤B){‘–2Ö| ˜Ï.—¿•èê+ =R¡$Õò /»½1`ïŒgœ¹½µW™Øé×V /Ìiw=> ?«Põg€ª5R¿û*+“—ïÀRIÔÿg˜Ð\à+šKcÍ Gz`Ã÷·GfE – ­ìÑý›Ù´YéTœ^^«eZÝ®´( ãZ0±Àh6‘ P7hniû#Ú’”éØ"ô¢k +»Y<º³ öjakµªê+áç÷°÷ºº¡ÃÆ4 žô¡Cž ^êOz¡]‹²xõ| F­™½ÔúPT½×jt¥ÒçÚ‰ö믒QðæÙ~*“n:­’vMAØé`Ƴ)¡Ö%T?™_2Oð@ؼõP¹hî÷/æA™)kø¼:1êˆTû:a¤@]V w’¦8å¬ÉC߉š(6x”­ó…JgÌˬ?¥÷(˜L`}‚­làqÖ²ý ;SË\B”¯¡,×Û‚šõt}ÿ#9B¸˜",%&\›}û7‰Ð"ãèêÜÄìZóÛjZ - •œZ<ÇL¢šñÒ{½µ{OH€j<‡`Ù”sPI9"¿©ª%œŸ,àŒÕNš¬è¡æêdvûu2fâׯô/?̧îÞ Q$1U¹/íJ{¾P¹âÓ…ý…øzÕ/'!ã€<Œ´N0šWÚUŸaÅ#¿Ws DøRàŒà—Õ0 }›ã=NƦ) jUG×ãcÓ^øàÕµº\ªdñÏ^^¥…³UX2[Ñ¡Uè/òx:q±MÕ ùÕšæØòAq,¸;é%7(e:.t–MR«ýµ¹µËÊøÅS²6þ\;O¿ì=*\r ß­O´$ã<.ƒídzŠzzà¢Ã¦Cý_‚J7D ä=že޽ó÷!T¡H®™,ÑÚfY›@îÕ &‡QRT×V»Ø ѺõWkh‡ç˜è¶^é°iÌ€. ŸîÜFÍÞëydäÃ'}È÷‘ßx¬RsȨZ8ñîN—!°8•Ê´¸oÜR‰ôe•“ƒ·œ4fužåî¤NÃê8z:f3Éì0¿¬§L.Tå“)*3iË®>í|•> œË#¥æsúæsï ‡ˆ¬°ã’{“/¬4tÖ¾iJ0J缸 š à¢hÅ™ž^r=‡…iwÿ–UºiVUïRÄíg1¡>ïNº‘ÈÀi:¼‡$7¡nþÃOžE-ûžÛ‘g¾ˆYÇ­çIøwïÒ×ó"tEÊs…\ÓšZ5)‡"ûQQ;ÒŠÉ‚e1p¹`½9{Nè/"1%]ž)ÅÒ›ðqKÑ×4ଽtÞB|>M9\CAÎN\SÔ"É]cÇŽ”€sòÖ:æð"hˆð7wÉŽ½Ð9{P[%Œ­Ð·él¾$ÿu–Ž^ÿõÁ“þÀWD x{ðÛkqî܇ôâH§Y‘‡³ÏÿþàÙß~ò8‚ƒI@U…‹«¥{¿ž¤ÉÖ›}ðÑ®<ù4¦—ý.!m›Iš%Y4{ó³¿üñWß¿v+þÞ“„^Zapþî/Ÿ}ùƒó·ï<š„Ù$X©NºÔ´©w7߈®Å­žI~gE”ôwHdaGôŒt £-2N£<èé¤ ³,OË‹E:oÐ7$SúÚtJ'ÎbF—fišÓ0¥ç$-y:FÅAùÉÑÖ$鳈þixtÑ-ZËÒ}OŽãˆ¶î)­/cZBSú"Z¦ó£¿‘žzU‘XïdôCh$â¢8,¿Š~(};íôxtB9Ø™¥ôgÓ‹›öÀ¤<_ÐoK—³Ižfå&ÒìÓòø³ò@£COy¸“•[V•{!½Ó¡…žûò…OÑV'yœÆ=X”§ô;Ód|·vqòfo8ÿÄh¯^×IñƸükÿûIBÿ§è¼K øåS»ràüŸè~8;ìw.'}ÿ˜Æººï}É-]•|ÍYèKn™èRÉ…1Ð_oK]Þçw`yí-] 婚Ó;Зܒ'½¼©þš[êAnþÁǤ¿î–¾§×ôå–&Y:ÿüã{ŸÜ»÷‹wîB=×QvôÓö{ëöo¦Á«?ÐÓ8‰âÉa>I²¢˜ÓoñH@oJù,:,Šp\м§qQ¼ú#½9eGYá8O§Qšg¯þ@@oLQ^ã˜Vy:ÄGQú- è)ŸNÇAA‘Žã¬ˆ^ý‘€Þ˜Ršó8 ó<Ë‚"/ÂW$t¹*4Ðe®w¶¾¢›è\²™ô‡S¡ª³ô¦fƒþEoX·¾½©ÙMúžœßtY¡oœÎÎ$ôÑ[ƒ*9Л›úÆYÍ ½±Ù wÛ sÊ€.¿z:‡ì&ýT¨ª:ЛšºÞÙúŠnbOg“ͤËÕºÕèÍÝЛÐ ètºƒÝÁ€î`@w0t_ ­Î't%/ï:,ЕPåœû@ç’íž.%–w6Y K¿U³£½¹Y —뺇åQ6ËûŠ­&O6èþá5‡w 76ôn{PKôÒôfot–Õ£K-¥ên`Òyf˜t"VkíÛ@g™yy£õm ³Ì€î“q·· t–™–w©t·³t–—w-Ÿ¼tžÕ£Óê®Äøóeßp{ЙtºƒÝÁ€î`@w0 ;Ð ètºƒÝÁ€î`@w0 ;ÐÌ€®È´ße@w0 ;Ð ètºƒY ûÁÁ¶ÐÙd3éûÇBht6Y +ZÙUÕèÍ]*¹0:“l–÷ùXÞùd®…òN›ôò¦:—lró>&M¶{zM@oj@w0 ;Ð ètºƒÝÁ,ЕX¾*ï:,нë½7èè\²YÞžŸ _cyg“ úÍ·¥ÆòÎ'›=ýíö©¤Uè\²™ôQo ZÕ¯zS³@—ÝÞ™ªné@ol6è7¯î ,YÞ»íAI t.Ð˹^:ÓLè¾h›C ³¬}~lÓ¾:Ë “®ey^×@g™é ÷²1Йe@—Ë;ßL¹—:³êÑÕbα§ó “î`@w0 ;Ð ètºƒÝÁŒè½¯eõè~Iüô)&g¦I÷[+ÿôs ³Ì„NÆ£m ³¬])_ˆ×O€Î2äK)Ô¨sè,3_²©Í«C ³Ì°¼Ó ë[Ï'}íÆIyйd˜t–ýÎ`þ¹î¯oËê ½±Y ï=¾¯+sôæf.ÄñÂèL²@_%Þ–:Ÿ¬&]`ÒYeƒîy蜲@—º|:Ÿì—÷J@oj@w0 ;Ð ètºƒÝÁlЕÖó{€Î$ t5>йd3éûûBÊ꨽©Y ¯v¿§•ÄòÎ&›Iÿ×ùé|:“,Ðeÿê®®ìè@ÿûå*ÇUÇñݽ÷6ŠIš´I©Í%ÞÆM­=׈‰O§TâHÑ9ÿ朳g„Ш\ØþÉÃd{Ù¹fcI‹y0j„‚5iª¶ˆ±ÚR›¶ÚjɃÄjA*ÑêC‚H-ÔP­~Ïì»“]ò–½ó»wïÝ™9sæw~Ÿßï{~sõÚЧ·\¿µV6rdãÈûÜš›+Cô½„~µÚ8Ðׯ½¹ÜÓ'É  ÃfnX}k }"m8ôZmº2sËÇÊJŸL+ªô©Jmãõ%ôÉ´"èµêªú–­%ô‰´áÐg<âê5•úDÚpèÕj¥6ö%ô‰´âî}ªR™.¡O¤@Ÿ©a[ï”Ð'ÌŠ+ý¢•Ð'ÌJè+ÐJè+ÐJè+ÐJè+ÐJè+ÐJè+ÐJè+Ð ¡×*Ó}Ð%ô ³èS@:]Vú„Za¥{ä3%ô‰´áÐk5ÈûÌïËJŸL+¬ôê¶¼úh }"m8ô©þüx×Jèi—éÞç6ÜVBŸH+€îÏ­½µû}óš òW•Ð'Å  ×<ëkoîjýæÕ[§†”z ýjµ1 W6¯ýx­Z›*¡Oн¶yÝmC†”ЯZú4™ÿDµ6=]BŸGÞg¶õN•Ð'ÃÆiäЭª•Ð'ÇÆ©t@¯ôî%ô«×Æ^`SÕw$•Lj¥STP… ø`Rf¤U3"ª'ŒãNõ)¤ÖŸRV0®µŒ²V£Õ¿®˜NÙp‡q‡ÊPaG-MM¸V…Iid¢àaK+£¸pî+ªŠÆ3ŒV(î‡ác$Ö„Uø%ÃðGX£9ÆQc#$üÌ4äƒõÏaŒå]Ãí†[„ŒŽ,A„PÆ FËÆÓ!÷…#pI*IÕ}žÿÃá¾ Óï ÷xÐ+•G(|§VR¸m,’MOWÜj©µÅcfëJk!­¼)àˆ£4ðI2¡‰¤IÑžI0˜`ùbú×5x ®4a’#s aùñr ,—– ¥tƒ´')Uñ| U‚>󙡬O[ÊtÆÕ0ar·åákä²ýûÀ[0¤ ¾øôêÂö™Ï­i)Þ›çrÆLK!0B `¸ˆ$ía‡C1âÁ¡ :$~Y~e¨Ká“Ô kÅWZéºO(Kµ°ªAüƒ˜á*Q*ÑðqÇ,$BPÂÂ0¯ á3Û«¡V!’œ3s:j™¾ ʬŒõ¯SãÉXjFX$–'ÃþñÀ|(sÀ2ž¥Ÿ¢€©Má¼&,J·` –ÐZ˜Là ?Ä4êY¼C_ì×£Z Õ%[^ $²ë‹A gd-¶"*LßN#0Ê"W7£‚,„ÆWô2C@9ñëhñÐ*ôL8üÒð‚Ý•ö+¬ô©Ú·¼´iÕЊ­¶0”^z”O®ÙEÊg[”k™"yÐid»ÑóuÒ` Û€Jêл\Þ1%%æ}ò¸Ì­DŽ–wÎD€’<]t]ETÔk…Q@¤H¬!Pg™ð¢ñ‘%="ƒL5 q¨mC‰m–©§ò£¤QG~ob$÷Ÿ‡aƒ &ÌBÄ”g[Qú¨(B©° ƨõ4¨µ$ l6!A#ƒn¡K©#-Vp¢…³ØvT/-¸‹mÆêOVf®z¥úA%Eèç|øO{[z㯧Þ^Ïô^ò‡XÝ&Êo«â}{«¯sä«\Üh|#>ˆÉi–ËpÄê¡X€-³\gÛç]œ%ïš/ˆd11Eò®íö9¤"[¤tžÖ(»0$ÛçlÑ|œ°ùOA»»{1¥DYáwGïÛïÜÙ“÷üèyˆ¼NΘÍýüÓ††"HP PH¼¾÷…Ç¿ÑvéÞÃÿýÌZÊH5GA“o?b£ˆº¹Eåpè^¼ H~UÉwüë©×–æµ§žxý{Ok*ˆR‘¡_d>ôÚ£\kRävÝåœk:—¦ø»3ÎC'öaç:εq2>´+ߣ¡¡H<¾páM ÞÓö7t~;¯×3œYjm°Ðû×ÝŸØVøØÝn„¥oEDÍŸÏ—ÏgÅ÷Ak¿¿tpW§áìg‡.3ãÒ×’uåc ¥ÂÌ}ó'Ù²½Åqêvÿú‚…ß¾¦©¸1_Ï_@òQ˜¡ê"ùçÑÔíoç—÷½øœXc¤rɺ ßyÀ-ù0¿ò!6¸cõW¦¢Y,¬ßùwàŽÓ^8ðãœÿOC/¢×úß5W}ªv?Õ–ÏÎÚãÒvì²Å7ãæ’;ø‹ãĶ.ü!Nýyýðlß%á; n“wcwÎ/:=çNÌ.ê0Bìö¸³Ï tïyìO¢ý2›F1wñÛzr¢zÄ×:Ïl ØŽPåH‡tCz¹)OR_­¨%ÊeÃÞyI½Ô[7¨ÇÈÞoß´C¢Ç4\<–ßõ‚ †š$äøíí´Á¥vvsúÌÓ§G3‡\ yø¥O ˜ï¢ŸÚôã,“uzË©û²šë`xšÆ¾º¥ÿþQѶʶ+«ôÊýÆ´’M¯t'¾$:©;»S†ê»iVwй]}§| f7¹.½ì¯Ÿùãö†¥qÏ\»»žXLÿzó0zq“‹G˜{Qbƒ}²Ù?^>ŸõªÒtÍØS¡3dK‹æÃØ£„aðïk´±þhÓuÚ<ïJÆ=m»ƒ¯4¦!·r?vqí;?h¿¡¯Þ㣓n7³Há ã⟛‘¯lŒSEžÏ½^Œ4šÈ!o¤x§ mãŽ}í¾ yçðiöáœù[xo”¼ÏdÇV¾=âçý²—üÒc׋À~à„˜ü Þ?ÊǹÝ[|´¸ x÷ yÒz)ÝôwýÍwÙ*O$CÇÝ}»ôï˜Ææ¯2yF}•¡{Ýp1Ë|ÆuºA‡'¹5Ö²Ïæã£¸Úû{7ŽujÊÖøÃvŸä¥Öt'±]j)Ð×íÆ¢;ýGeËO½ßm÷øF)GF啎™±“ ®ùºÝÝ’ˆs?}Á#_6®}3!ú”Si>íOýë£6y˜m ²›»÷>ë#’6}JyñÍÀ§½{›î臯%ïS >35û#áŽ;÷ù8§ÙoÜÍàN†ÏKëëV~voÛeÖŽÛß ¾·‰üëšM¿Üét1íwÏÌÕÙB˜CE©û üÍ zqÖ²0×½üúIŠnÈ¡ô‰H6³$ÊÏ¿…7$v4ÒøÐ›ý^fñ tRxÛ ‹áµwõR¼ÝMéîpìkîÀu-ŠØË5Ë¡cKØtvÉ/9öáog:ÑÌ~!…Çõ€ËŒàõ`vßE¿Þf!¬Ë¼$”H¤ôĬûJúrXÇo_.k•2?S¿ÂCï Áy ôêªjeH±ÏT¾Pߴׇº}®ùÖ«?FŽªŽßÙ"Z(¥¶¶Ð^±– %™3Ô?È“bXQqÞ{ófÞÛ·µ?I¯™“¬åº™µ{&H,†–F¨M †¦±ÒІKÑ4MPRhÅ`J­È¥ ÒTB¬¨Äøù¾Ù›ÝîܱÖòz»IgßÌ|ß÷óý~>ŸoV±TFu»ßŽÄöÄœ~-õè;.3®qì<‚ÚÓJ\ñm*>Â=©þÀÃNÃ[ÉÅsªÖÇ!U›;ÍÞí©²7k¼Ël“b›¦"ÎRúWzÛÎs½Aa!¤U ʯ¢RyÎ^cO½š®’º×Ó¿Í3`Ä擹 KÿNø>º#u5Òˆ3ÓJ[6]:ùˆš‡ 㿾Å.Ö.eÖ¢¼)`Ï"mH;o?Y¥çR*ç kÆ-Ô)¬Ô/þÔ[$ïvÐãØ‹›¦>$žHÓ¶:ʶ†õÂ/Ùè ——ÜÔ"•L xTú®k¨JïV81,d DŠqĦ+8,“W¤÷1qlW{‰ŒƒT? ¬åL06vΠ“ÖB ÚŽ«ÇÐJ;Í݈²i‹ëÙCÜcÀï÷b ”ŒØìNÐo¥c=JGJžŠD!Îîýç¨îÚé óÆ+•6Úi$|z½‹P)î^|ÒáMÊ7Ý5}¥ „¢IíËâß];}‰û.ì™ru¦[8ÉH•„Ì!ebÄî?4(‡1ÝxæÐÚlf£R[0¡0Ñ⩦óÃ/{Ã’Ç‹rP3lj_Þ †o™øä1´¿yª:þÿ4r°§äU†Ò<'éÖPp9vΚÞ*ß³@^Å=ÉMÌ\C¶V©ÈÀ$$¡'횯b4&ðE0«t5ms•„(ÍßH2Ì!sÕ/“Ï_ùÆŸ×ÎA•d;ãºE’y±™Ë×4œ†î6©W*º«ÑÔ½s•w1rS.{¨·ˆ9èý“?oX2Ç ±É·v]ÎÔÂÅï¿[}™o`Ã$úT-s4@"`—áp¨È',y÷:®Uç_3øÙ–_Š­Rµß[ªQÌ §7kÎÅÏž]Ù\ÇŸßö’³§TÈÛN??~}å H:Û?ô=v…3TèôŠ}ü ô•×W[FZ–éÈšG¿ÿ¯ _üö ’«G"h(øÏ‹;A7ËR©B³=~j»Ï£ç¶þˆåzOqÖuf‹öÛ¦†º•Øá¾ÚÙ\Ð×_~"!²Š™aøþ}— OnŸ{ü>jr$}Ã"íÝ4sŸÕé7,þLÏø÷)Ÿ¢£š²¿¾õ6T8JlËÊÔ¾”¤€¦\“ú5Wž)ñþ×$ô<àò:;d³ViïçB—tØïçIŠ• øëÐ…N·73TuyüºQ}ßÉ&&Šoò,”Ɉcç :eµý±t%åµFO½E4Ólùæ)Ãú™Ô¢æ¯ß¼ ‡¡†ù4¼àÞÅ(óL‘ª¯•”_üú;’ã2€Å-â+¬íÖ¶a7ÎŒ"™­óh¼†-#Lbb °Þ‰Ç¶\(->ÞµÊ6ÖØ§ÏH/ZÒmd›9ãsSz{¦vî™Ú33sÍX#Ÿº64œ£½}-þòˆï•™B›cÀü§“Ëq©¼ãN?Âà¶h£»‹½ƒ‘ ¤’Z…ªý8$™xô]"”9í忎†…è¦æÂ·ŠòŸR/öãlã ˜s¹óÿ¡wôzº¼s»bšI©èDŽB×,cÊèÐx\s5ëu@ sÂöM© é2Î,߈ºN¨Qf£Æ÷øE/¢àY›alÿ4¹¾¤-K_Z Ñ(Ò¥i›’lä4yÿÌ(®1¦9ŽÅçë×ÚµÛQì?=ÅqìlÐ/ùì’Ž=Ó ¡¯£È/ÉV$U!øÒÝÎYJÒ‰U;ÒJ3ödV©`Ô\Йâ§WzÐ%dd<1þ{e 9 Ú’¤ÙÎ\‰Y›lB-Mg…ueÅ5ltoÓ«†zõ•–ì†f­WíïÃEΑض³i¾¤ô3™gCµüÛq›{hw°I¤Pmšß¹Ù’)HÉ4eãâFUnÑ;'ûÈŽãõ¬&FndHc ¸mâ’‹éGæÉ¾ê›NÀÜø\5ýÃAïéÙ—Ä01xËþ· Ê(bhvíw•ÐG­aO¾Z“׿æéãjÃM ú ;eý”ò¤ˆ ‰‘lgˆI‡+‡º2B®àŽð7Ö ˜æ÷çÛBß…%n~m\T’¡Jõm#Á(²Ïð<@2üƒ©/ÊõÇz{®ºäê½·w¡­ÒÄaëuûÖb#á© n¢sèm F@Åñ±[6õ¸ì©…£¹¤·@ó–‘j¹Mñýpy°j`§t~ë~oèu'.åôNç£na¦Œò1µÀ+¹‘…µHZµÑôÄ ë$+vœþÄ{e@X™gº‚Žœj–‚×Ð3)¡}ô6Ú&ßg ÖÃC ÛÌÜß<q­˜4!c0qZPn¸•ê×LÄÜ~Úüw¡÷¥ã~ ¿ñWÓ††¶¨@WpbFê¦0 ç€;8ýX˜°VèôʱañtL¼SEÝË”I÷λÓWv¬­wß•ÌÐ]¤•M/vv:WÓ¾"ˆ ¬sÒÕÝÏ|ÊŒ!²èÞœ†ø}·í^ŒÁ®ÄYWzÇã´‘ƒ‡2n‡ö<ãÕtôúÉ/çņù4Zg3¦Â æ²Æñ„¬2>(ƒáR¢%•/¸>Üó‰‰@ï5}?ìú×ÿl›Gw9xôW1±xÅ µ¯·fµyÒn¦éª‚H7-@†*ß–'iƒÐsI’‘üÁuƒPÒ0Ðç zqQéU&Ùb\D¨«ºµO(Eb§2¯£©F¨±xýJŒ^]œ|×å*­[rACkŸýÉÌ&º•€Iüœ93®lð¤:M>Øü“9¿ƒ6øƒq%!JµöMMÆÕ‚Z5ri”)ý\@(µ/¼ÿ2_µ1R]exw›&€!é‚5“5Õ ¦ž‰41z0ˆ7!ú瞯{Ιs‰ e›‹vM·ã2wâ,J‰„ »ÚŠÕ4@ÓZÛš´%´6b]äíþ( …Øb¨Õ"Ö6qù¾çÎÌnçRØM9ÙÍ~̽ç¼ç}Þ÷yž÷{­€vÃÈÖõí?w]ôù{Â{Ø2žRõRxj÷NÝ´ášìŒO[xìMÚ#ªvîýIþ”‚4ùrrkÆH5ͳúÄQN]«¦'.ûn)‘µVE\7í+ú¹G£$Iàý—¯Ì] tÞ·-“b_kîÉg~²´µGZ@2²o¢šå-~­ÀÍ/\¶Â 7èRmÏû™’6zL;˜Y”zO»ŒhSxivÙ°½ÐyÝ8Ç-¸2è7ÝÖÿ –žÏ7쇷wåwnR–h 3T(p8¨ÍE¾9|œW1ÒàÚ¸÷x£¢ƒ¿XC”뀴\±ëîô¸ey…,·¸÷Z~šŸvî2 )GDØ;ÕZYx’õ×w“˸ •2¯mÄÂfЩYSÌ6GÍ­é]ù¹E2 éçiÜ·¤÷{߆:~2šDñCǶí>I 0S ³ŸªÖvv_™Ñ|àŸY¾x¾hÇî3V'Ð{nï[W˧ïJ—`ÓºÉêì&$ë1 ’ôEº®é:ð¢{K ˜‚hÐ/@5Èû\y"Μ϶†Lu½ ·]YêßÛéÕ¤ÃÃÒ˜0b,·blk¥6V{Ö·ieÏ~‚#$ç- ÃL;å¼û*Wü >iºîè‘ñ°#è¦{ü[êé´\ž÷Àé¯ÿBÿ»Àë¾Ó™9û]‡{Jsú‡º>cé×'ñàxFf‘@Fÿ‰£¨ МÁfŽl¾ï÷*§^Û7ñÞ{6vx–BÖÔi3OoÑVËp@O⤦' ¶ƒû¹P–Z3ÂDÐ÷Ã*VÇ=+wñß·Žä(Ìv0!}²tIŒ¸Œ†fF±=B/LmGÏÒ±ÓQÛžðc­ìW°xï©L— A‹ò%Ô ¶{Gp_·x†Ç˜ÍN¿év¡ïÈýrGvû!¼r}Šžø¼™Ì†¹zðbM˰}ïýRÿO< ^#¦uDØBppç6Ó“½†\¿‘kÆÂô µ¹Nëk9 ¡'ùݲ«\"öºŽ ï^}$˜[ÑGšA:ÒO¬‡S+èUÊ.k»õFņeë|‘ÄU÷;­µ‰9‘i_šÄ²è/jíchðÑœºƒ3ŠhVA¤–¨Ü œ÷õ|y“³/CT;„ù–Ó‚$ÉŠ;Ìýt\ci¶½¼ÑbúÇaT|ŒgaÚd× z»åå£ t¤*(ã–•¸VД´TÄÆùª»›v+'E·Î4Vj¾¨tB45ƒfÕñ3%bÈ7A’þÖä‡;n¸Gª™­MAbÀ10®^šp5?UyÞjA?çÍ&bÙÜ€ÞÓõ©ƒ1)ÌòÕ¯âN ‘i™pÅe”sйdÆp#jÓ^‡bŽVi2”܃.[AO7 %¬¤ËŸòµ4š,‰f½ÓÝèfl”6‡îhW"kZiËÀ‡ÂÜþçNúˆÑÊÄYA? £ŠXniER…¡Rìí_ñ¥Þ!Š%‡\e_0}ŸfЕæûR—y€‰Ddõ³š…vî˜ÌO@û0ö›šh€‘›#zŸ›¤–S VbÉ£‡«i]Ü‹Øô¯Ào0({I,˜9(VìËæ!˜T‡ÌÔh¿•Þ/P ÂR”_ù-ü ËíQÃùë½9™ùðžÍu5ž zMn‹-˜O ŒÙ¼`DðA*-~1Õÿàî Øs)–rkºø.W>iÑt°Ó&”¥P³Rî­É3>õ.ËH’þ¸¿æR†vÓfÜž.Ÿ+@«€À„öÑÄÛg©õòšƒ½S‚­Í@¯Ä£[ósz÷ÍÀвà£ÞmL½ ò£È[RȦ¶jÂ"dîM¬  I/ =äm@ZEƒýŒ°Á7çS NùA=Û vKì¥5mîtT¡âÙæçIhÉ00)¤°¨pªÚÀzË‹› Aüo˜ )Z;]­J 3!ŒܾókÅÚØ‡–(ýkGMµørÍþ¹øÐåK—/­=ùèZ¬ìý·µ5ÚJnìwßw°ïSbN@ïîº$Û„ -425\/5i䨭 ‰j6rÀÕŠÛ-d­wkUù†Ã© _Ø6fgtÉfÝÖ zâ@' ÀÁ3¡Ƭ"ƒ9ƒGK/ML§tŠHÐ3³¸t({` ÅáÍl(iÿùÔ› _w“¶ÓyVŒìrnZ¥ê¿¤~²ÁŸg¬P†s8ä¥ìsø.>Ï4äFÝÆ>Ðòv}jö•AŸ×ýbV# õüMm0¼z´q×ܨ¸÷ :ÔËýèâ´¯ìnùüƒ]“‚ "YRàK`<ƒ7Çõø‡ÿظ÷cPÀÁËšAÏYžo;3Å ˆžúȽؕ‰Kt>ouâ=Mjö¯>Ê(@¼“-{Û•1)<~Œ”"‘ ÊÚ\2]I:‚Þ Ï«ÃÞ‰Þ»6*p’02")1žo ~hªâšAØÅ+iVºPŸ;oÐ8i­Ì1ÖHš€= Ätc¡AÕ[@—)¦tÿŠ w÷|“DšçL)Šde¬Ôˆ´q×s¨çâÚAGå¦ðZÈXÓ²ñAƒj@´òcA¡7!aɠаJe©”Ôva3è"/`²Êš …\úBš§AW“ÓWO§-xfHLâqw[­ Y äÈØüø 0y(•aªˆ¶~(é@ï=]= ¼°_©Ó|ÊŠÏ/¹ó.q‡–œ3Q<’ÔƒšB­‚¿VС¡òá’“þRU/U7èº$¬)©/œèL·Ë7Ô¼\?çT(Ñ”µ¸w]Ϋ×Î[iKp=5áÞúCwëNçmº˜ –Àæ¨e7cÅ™ÊW·õ)c©ˆ”yƒ/{­ß¼F¦ûr¡éx=OíA‡>ÿt×Uèý!M¢ónè‹Kó²@d!°ÛWô>žÖº‹ÁäHä5ƒ.Òèªÿ3_õ±mœeü¾§ mj»–®É «L%¸P©±“8‡­×1Rä÷ìóÝùuÕnkU[% ¹–g{q#!S3˜ ë:Öѱ• Hi'1bjº¡†nÚ`+lÚSa+­R`+ôCTžç½óÙ¹³ÝT•Ö¾Vâó½Ïû<¿çã÷ä*ëQKÞù«:¤é±º÷‡pIYIš†QÐO¸@|rwB%>ÐI<¡¾?CŸØ’ãà*Šª)‰ƒ¬_C‘Û[Öô°¤1ÂÝôÎv–-(âwÒƒ@ SI5­l{©LYÛbý%]H…jçh‰löÆûZƒU]øoþWcmAp{ty=2Œ{÷Éñ˜®FvÉ™úå–Éš’*.8— ºQHkrwöA¥BgÊÔ;µ@W¡žÂ¢-°äÈã*A~-ë ¹jMέªj¦bÄ—Þ•x¬ëu(S»îÁëk/Ì‚õ,XÊÔZɳû¸äøÑ­¾}ë­Î8ùó侮)¸î›pw¹Û4Љ/Rvby}ç¶d=ƒh“o}^+ÐEøð+®ûœýkÕâ=Í@¸ohëËLÄÌþ»¦€3,ß|„²ßeàˆ³ÞË_6èšb˜jÏajŸùÑÞzd(F2®¦Ã‹gÑ®4óÕ ‡¦~ˉۑrÌÀI3Ý×ѯÕÙûNÀ‚ß0ó»$Ø×Ôÿ~+Ë_UÛ¢˜÷z&¤¤¡~ \6åhi|¥œ)®Þ¤ žÙe&«ßQäÜjø«9ÖÆ¡Õ  ¿|Ó¡Ö†ÎÓæÜ,ÉÃoÄ`œÒ“7Ll{3¡¯ÃlPfåó­B2z+q•(§)@$éTÈPIR5¦Súˆ¶Uãý';þ™¡Æ%#}7'øQçÿ¸™V,êø– KsÈ"žèÉú•¸LÐÕD ÛES7a£ñѵl—=¡¬ÅDŽ¡žq¤2Þ„wòcÐÑ) !zÂeï™IbB£ëgpeÛº0'áÅÓ«äì¤ÿzf2ÞŒYŽúÈRt¢ÖÍjhº¦­­Ã¸YV‰ªˆvCÞö$aÌGŒXˆ>Y-Ï‚Æö ‹¡îÿÀÏ&TnâƒY‡¸9‹™`æ·DK›W ºf$ fóîìÞ½v"½ ›Þ˜™CÃ( ¨2}¾‡“%Ã0ꑾ¸É$°»_ìª2t2V•m.³®fÞ펛=Ÿ½ Õ‘ÑWdèñϪPíˆVÏ$”'fú=dj4Á·k!®HfÞ€ùâ–æ/‹mÛ:L0ü¼ïÛ2×Ñ>ÒùΦÙ=È-WþÒÖ×i0ê©u² :WóŠ#=©©¦Ö3H!ýf£å¯2è:À£^Øaë̘œÍfè{ç 5" ¨)knM§{ 8Šfê± Û\Ú–[e´ê¥‡ñ™Ð¼×Ó¡ýzŸY—V?‘6b:°…º]uH*d/ÁÒà3=j\‘ ë˦1ùâ#´ì„J¦®<ytizµó¹ ·ÄP§nÝ‘³ùˆM2_?Ý•Ï&uäažKm¬`MƒÏÝOj1âÏ8ƒž]2o˜Õ’JážaHT-æìè‡ס³=ØÊÔ‰O/9Kkû¼ò í¦q‡NU6¦É4DÊÃîzï@ŽBÙR’Š®Lž{eÜbÉy„ãø½ç&á5NWOfó]îÆé" U;Ö󣟡‘JŒÑÁ_õø·’¾{9CIfW¾Ë4‚þZÚC‰‡6åZÚ­çßÇg¨ |Ž%[Îþ}aÂȇþ×Îù€à>9S–üô'}êÇÇ}áPhAh¨/Ú?íôŒìX¯TŒôF³k†Œ¡Þãb¸¿8=‘ ÷F£‘âЄ:”_ôåí§Àœ¹çî?±¼û¼:1TŒD£½½ÑÁþhßP¨¶¯‰LOG‹Ñb626“ŸùÇŸNaê}~ûmËÉPØ{­ú(Lï Eú£ƒ½Å(Yã³W$<Žìvåxí’½81÷Ýõò¯Ü п±ÿ{Ǿ¹,ЬÉF£¾"ú“÷ü"Ç«yÛ 81ÀÞH<ú9€§JNÄ=þм$ Æ–ŸW·œïN\-BâëP0 ˆß$¹ûàO²oË _g Bêâ |¶Ó~à?QmÝE ãL:/:gÖ¯}Kìàp]^vÀlV9!1Åá 1y,ˆø0¥ \£[CF@¿åësŽÝ%Qø6΂½Øšf)‹Ÿ›˜‚¾´Á» ðç¶-ÄÍtÞ9ÎrÍüÚˆgÏq­c½Ã‘ïnc¡Õ¡³Y`²3ƒmìÂÊBã+Þ¾;&%ÁŸbæ]Ó&Ù¶¼s­´M‰ç! ZÆ ”_ݰU?å[ÍãSP°ao@‡tÏ·v.†xÊqm‰Àóí@à$•ØZÕÄŘîé5#Y1þÏ~ÕÇHU]ñsï}î²à"iYìØ]åÃa+”Xˆ&ÄvAØVÚsï›Ù}ï;·ìÎÊìü˜æÝwî9÷|Ÿëì*Œ§Ë!±v0Ê·\7´ié½v$1è©$h.ÇeÙÍa"ΕO”ó‘z=NWQÍì•Î*›Ÿ]S²8ËwÊ#]5ÇB6Z'éî|Þ÷Š™nAw9] jé̦§o¡F9i%àu¦§e™ö^™Ñm͹=Ù2pgêº2*Só‡4¾m*áo Rv5=F ݦñÚ…+a²‡düv¼±®Êãèpºœ6ƒZO…—Óí4yQp:Cº<QØÈêéM¸ˆ‚€Óé4®;ú@€Óé²®kÅò^øp•wƒƒiöïyŠÈ\NŸµûbqxp9}Diµã˜`¨²ß5ë ^º.z–¹ý97eóÍ€ƒÆéeÖ<áGß½QIá^A¾çòèê¶Â¤ltEµúª)ÝÊ{Ju{C×:ÓUß÷/ $ôpˆá½\ 譀ܮ Æt.yíô?—G Û`Þª£ðàÃÊÓÓûˆ‘wö¼IÉqFpà”Ï„ÎÝªë ¸ÿ€(“GäroPvqÒä'€“W:¥§¯q V™ùƒ‡Œ·jÊÇ1MË Ú"tÇ©(N7Í€æï}%$_ú´Ê}&t-{) ѼzH‰ÂdPBMI¥ýãÓ’qv óôP%!‹…oRDšãÀTzø¶4]v=ëÞÐÓbd/ëV>Ä)?z8¿Ÿ™­NV†U¤«úàÝÛ÷P½xˆy'ƒù—xîØbRXÜxXßTÅ•yA-5KÂ=¥Y† SUª‡•³_~iè¼æèþýUÜ­rõzšU–D"û'xé2ˆGšã‘jg¹‘Á‰úÑWE£ñæ ‘Jïa}é3rîW¹åPOBâ¾ô^=¤&ñÉQßs®4ú=;2íô1cËKJËJ˼(ZeºDÀã_[‘E–AÅŠÒŠ¸'ðŒ¥%~ôÃËÊK+JGF¼ÆòA\ª;äÍß—–—”•ûÒ{ô­phi‰¯"…ª‡.KÖ´_µÚë뛣‘xԃȄÉ[;Ýz̲0Òì¥ëBUý⻫CÎSq¨­ó%Ç«èo꯱|7¤Ñ<ÞíV[FöWùÑgé!À˜Rßœ¥oÁëႜAzí9£»‡SLš¾Ħpu$ÕÿµÀ©–åpÕÑÕÑœ¢tÏÝǯ¤ƒ©^? S×ÅÀçê‚n Ì8}œa!8ó½Þ¦ù÷ý¦ÃhòQï…‘SÁ³x8QÀz¸…3ÈýuÁ¹nžÄF÷¿!0×liIøÞ(¸¤fÙÁè»! ¡ìâÎ-~ôÙzÐ9¹pz¸@¼‚ÊJ×úuÅ2%‚o9$ÖÿP½Êqüä×!¬¨GO/³ËŠjƒSy90ú2ឪL£Ð„  ¬Ïém“s£:‘ýíAT V¬ôTVì`r0åö±üÊ §Öç 69÷­oö“Dþ1½Mê"#¥É„´Ï«‡m'òÕà UœzÈtO°°ÞJÝFÜKó€Þk™ÿNôàR—¥-&AëQD¾!roý7-ýWD¾a·ðþI=î©EHhÞ+Z^Àõ´ì"ò²ºùOtérMë¯Î2ÐÁ 9¨…ò/WZþåA  ÙÄg«ûA.¼×0±XÝû&Àåu8$ïÖ§òþÈ™d4àÒYÄÿšÙŽgFå_.3wcª_. rL—ó!§(¾FYX™ûô.&mšÛΟZÛŠƒ\~À¥ß5!]ÎÃòYû &¯än}c®|°ï1#LñqlmñÊ–˜äôk44wfÅﵞɨÇV9 {Åúsîr‹è+tX¯é”㜙FþxèÕ¸:Uþ%öPã˜&&/ˆÜÛJ×ò5}×®Ú÷Åõ™¥7qöpd´\²ê¯lù‚InoÇVêÚt–00Vž;7<»wK[2yhѼv‘˜Œ1˜;m̪¼SLS|uÇæ-{§?¥è¸Øßð`ãZüëš5 «h Äqü5mŸ2óઓ;Ö¨r­‚/,ƒeÖ6_:y|–HÇ[퀺OœÜ|âÝ«UœÓâþES•ËHÕ{†œ¸tªc©É.”á,ëƒq·Ü·sß¾é“å‡õàCôÍŒ?­úlú RˆÝü£<ïH=yEª"þm“5FH«Q×%“/‹øËÊPÄyL>Ε‡™ö‹e‰¯¼‹M·‘É5™ŠVë?4; ñ¦µÇèÎ Îøß1Ù³0ñÒ$b»}5~ Êô]tà±kô°Û ê3lEDëÉwÉVª=‹a2AkM”â§Ì){“ôˆÉØK•J˜L^· >IÜ&Ã’Ë4nÿíKпÕ5*‰ ãÒÊOjUº¾÷ÝÖZ$ëÐ`WâšÐIñƒNTLZ;_¥Â—íÐwmÃ&K.¶åpëûâbs§*·µ×¾‰83]ñôGñôøYÖÚ5QkܘÀ(ùœ²Ô€Øó7uÚ¢D|îÃ:_œÂ9þ»ÉøÿZ¾cùp¯|þ¹õ;YÃu™“lN_'CC /,} ßéøÏ ÿ| SßfTDZ)Iòeìa¹ñoøõ[ŽàéçÚÎuÆäQÙ¨&…வˆ§÷Lß1ã4¹òW’R@ûy+ù‡¶G?z…üÞЩÂö Pç¹ÿÄ#Î-˜Oì¾ÃqõaðÈj´Ž}xû{ŸnÂcqªö“’¸k6Z/?¾éÔ:LÜA qÓu¼1™¨ÕÔa&¦Z^•6£¶iÁ± ^@k®¤"£í£´Ù¤ËÞ¡@p g«Î©³FLáºZIH¾ü¾ZWB\LáÙïQwÕ­@¤2-ÚRx³+'‡S¸Mæ|(‰³Ï¬¼Õ z[O[­¥ÊÏq-¸KV™Z"5—áMëʈZÓÛßAXRÊœçqåë²!ðý¸qCHÎ{0ùõúö&;ÔŒû“‰O¥Hó¹Þ!yjç,<èÈtYêÂpkÌzk©TXëœqÏST-jjz¸€Sòyˆo;Æ•›WcÉÙ¤¯ úåoáQ\¹žÜHнŒ‡ÃcᔸÎàoÖ&ž9a-o´l!‹>ƒo˜Ê²æQüwšªf1m{Slt[æë­JE¤Ïm™VDѲEÍ¢ÿq_­±Q\WøÎ½3;ëV<\‚Ÿ-¥­Å-Nq$@mZÞò7Þ†”d,-efã]ŒK†”ÄæmˆI"ZPȃM"b ™Ðà"ê ˆ64vSÛ"Q‚1=çÎâüªÔŒ­ÝÙ»÷Þ¹{¾s¾ï;pŽ‹ˆl}˜(ûÈO5£XVOàk¶ûAøùº[„ì‡j”죃A™@–©mVËnlo i/hŠîq 廑1” m)ͽWšL* €!tv¹ÐE–˜Íý×íö8HvnïÕ»•Ø'òvWÿ¶-‘Eg;}•„ŽwÈ•ò_ïþß.û0nz‹·u<í_Díëh¦wB£‹ä)\îÚEï$î§š9ŠéDÃXL¿>Ý&9Â?`š­¯98©×pZq§ rø’#LW˲DƒÅÌw‰U"¼ õlÁwÂÈ?LîP鬉tCR2øÇQݗƵß3;ôpŠëüÚ4”ÕÑ·RØ,Þ‰BÙ|6kU¡—ÇÛ8ã  »Vë&«¹Ø!ù~ W0øð¶ð,µÑ)©äà‹  38¾«Ãmøâb¢Yñ`Ë\<Þsá¡€Ü3EŒ§Ú¬Á¿Âú´~’+¯GKAÁN÷S ‰-"èì*P¢;Bn§6#±M?‰È®jð7ºÈ$|,Î"b¡WáPQªµ2Œ›.MK4yž>UЙšVÛ¢UÓ¼mxnt:ôYøån¢‹®ž<žOlÝùfNþ`·,ºV¿¨D è"lvŽê&vFü’Ézÿ‘ó¤ð3µOKÜC©áð'R$ìu@1á3•}•Úéu åøoêeèJWV†„Ø£ÖÐSNzÈMœF¦^ðwHµmôc£t.YŒФ»¾8GÙ¤"%%ú{~>iz&ü©X¡ÅŠ<Ê.l5Ø»ËÅNˆ ]k‡Æè$²o‹Ïû‰B¥3–“aœñw¼£Ë*ubQþY¯áDñø5—^Ћ1RgpŽXMdÄüQ¶Úƒ ŽÔwëëp¾g8û] -“à„‰qy¾éëg³P_³ºÇLŠ1ÿQÑϺ –Õ—b§Ñ5¿Ä¡H´Øsºi=âœWysŸâ‹8•C`Ù¾·™¥ ò™óziãš~±4¯*¯jiÅ6¸© -2ô…§‡œ3®œ+gcïZ —½›z¹TÞ¼:þPÛnäˆëd[È[Ã,§¤IÿžU Œ¼ è]ˆÉÀcdy{àaÈ HH6½xJk§X ‡k{9¦¦ÆO?Er¯©ÆJ’Ì1,ÖÖXRÐÉ(zHtª…î%p‘DM3MŠ0–áçœe´¥il@¥óy—¶gõe[ÿ¬ƒ‰!M×ÂŦ¶}žÇA~c»2oÀOZAs]1Ô×%à{n “`ˆued¿h8õx-ý â #™ü@K“¨ÛëÉûÞéÙSŒî‰mñ×n‹N+ðC¥™½IÎ $îü–Í9I̦›¿»°­Ñ.3EqÛ•]ˆ^IdØ*î *š¯#FC¹q,ºÚó( õ•œBÉfJ nÈhß¿%sÊ!0÷± 'ØaçS–…TÙJªœ­Õ˜ó²U.ê„äVĆßÜ'ÃZaÛ*1ÏGoE¦Ž\Á™O·^9seojCCÃö†­åÌê9"ü½ì=qJ…ØûÑ©B¢þqÝ•î÷IúOœÊöü$`í2\ŒÜŸ‰> ³,éOy‰iÿ) þ›Åùc4"ß;ÆNÊžá¾"ìÙNu‹Ér(סè›ì`ßá° éµÔ;(WZÚåjïœPÑ¢ø Aå5Âÿ0¢VĽqì:Cˆ‘õv9Õâb&x›ºAo¥¬ æn&Î~®·„g‘ãS–,…oi÷eO º¹MoøýoÞGÔÓ¨Ïa*çÏ2KkMægjùUš¤Œ–AŸ µ‰ÝeÏ8½Ÿ\‰I¿œoµ%:quY¬à¶ø¼ ?=‡VY˰ÿßûÿÝ¥TÊ/—ª;¹xe¥ÿ‘°÷à2ë/VÐmßÃÎB‹‹vƒ³SDד“£²»Œ$+Á猥±Ãù“KqZh=n3sáÀ©KëͲ%c)7÷ qJ³î ç†àIº¾u¤×îðm•7Nn(¬”Ô‚ðyá_8ëÄ$_³ND—,eÒŽ!B‡XŠ]AÝ×19±–8øŽ6kºw$‘ÑS€ÑÑs†ÄY÷™ÛÂSù"TkYAß¹Ûÿ›!¤¼mÖvQ kÄX¹éùªóssŸ_¡5•b’ª$²ÖýD³/eDÑ¿Q4H*Ÿè˜úD?à TªŸµƒû²NOHë¶ôQe‰&Û§ð[q­&^Ed¯ø^Äm*TÖ6àå ÆÆ“8Ò¶KÄtPÍG™Á½ÛΖTÀ*hñLJ1z!nq±Ó.›¸5‘lPK´5Ô­£¥ÿ—zèpJKZÆQœÈ¹5>/»çÓw$Ѳí»t®QTצœ.ú£œé`ô( €ZŒ¹õW\ª…‘!Ž—ÕÔ!o§•Nˆ.†¬Ä'lŽma!ó=œ0¤Î6Üëè³Á¾ÞDüQ¬Çú%F6æŽÑ,LñOèWÊ È®q¶hšöAÿJ[|ó¼BÁmœ†Ð:†aŠO¤||(t+ ýÂÁt2E+s½É§¸Œßó(ˆo§WZåJsñ/uæ[<§¼Øqk|RxÂÄŠJüÄ牻À½&¹H¾?Ü—#Mÿ‡ñj‰?¡-}œÏJcW‚ß-Ãé_=kŒÒA¯E±ãó‰ìy™°ž@U¹³‰í9Å'ƒ ‚Šnü…]6½1Mt%&N+ïW|7¿M\’£T{ü†‚³™)‡Ž³ ’×r]BŠË3¸Â lÖmaä .Ñ0ÐÄSgQCe ¬¨þ6ím]¯ÁòçVÊ?Ê;¾Ð›Ì]"mxí54èjíüÖš(Ñ„ÁZ}J”ÕyÌJsD¯8~`ÞîÄÙ¬Çv\Ué¬ßêÎÁ[íÙL Ýg¬¶¯äêÿàÌÁrÿx.ÖOb{FFðþ#8²æ sðâ ­ÝßXþOö«&6ª* Ÿ{ï»ó&"±A1D(?ƒ,üC"D¢D± ‘3aÓ…1c1µ3aHCTŒ’&ºp,AêÂc”µ‰bMlâFS:QSÁ‰RYÔX4X¬ÕóûúÃÊ•­-sé{ïÞy÷¼óóïãî»åo†ú…šd(WÇÜvŸƒ}¯ùÐrÛÛÂs<`l‡˜O¬lXÊŸçw[=øcoðÓRÖÕqKLÓ>åÁ3÷¬¢”’/`.Ý8¾6\8‘~ª£y÷]âL;¶ëÊÌ;H‘ßfVp_–¦—HÞ+ m%Òv<ûbéÚ†Yo'üãêöczZÖçScNf@Œ87áU:~m¼‰ùÃ%7½%•ðJ íö9ÌË}˜Ì³8áã§ò‹Ö瑵Xu5%É/‹Vn{ñ`‘ç‘$Ôd¹e6Rýç9ñøþÇ^¿¹7«(ê­ WRBÙ_EYž|+Ÿ?u<áž M¸W炎ø¬¼eúwºŒ@s¦,5˜áÆGqù‚gß¾™wÍ¥¬º3ThúÃ2µ÷Kü’Ìa‰ŠôUµPì~!´èï\8ˆNì­‡¤†öÇ-FÉ€ø»Bò:ành7~6æN<ÄUäG8Å6Q\R5—¥ÑGxßÇDé<–”òÄp'sóî¦2·$ ÷wt䨾“ÌEÞ%?nÞ¨`N+˜—(¡Ør%‘Ç 7qÏ Q=ó¡U#höJ¡„#ËœüpZ*ax!w×S˜ÖV¯ð97f:lOeh³p` ¸ âöKW±™:dÁ¹YZSi4ˆ‡tÝÞ^yDû/‹Jø´ý åòÆ÷ÇNË(—äÑÎÙ—û¹t¶s;g ÓêöKj,Ñ?[ºêÇÏÛzi©® Î{?9PüæÛ7ųú ºÇ©ê¢†ç“Nm´ÉöÎÃÝ|`ðèj'tŽ÷žÙׄCšå–_ÿs3ó{ëóòrS¾²aÔ1éõù ÿËIfBÁ5z¹üìT»S³É0FͨܽÐrqª½©ÙdYP;î nyfF Æšý›9p€¿ïpË:¸ø5\Íf¾ž¹®Fîgî$—›jwj6)æ=ýõ—ø§Å¦î׈©ôËÞ¹çAUq5t¿6,"{ȶ t[MêÖ¬f5û¿Û?R…ùà endstream endobj 2116 0 obj << /Type /XObject /Subtype /Image /Width 129 /Height 128 /BitsPerComponent 8 /ColorSpace 2103 0 R /Length 4903 /Filter /DCTDecode >> stream ÿØÿîAdobed€ÿÛ„ÿÀ€"ÿÝ ÿÄ¢     u!"1A2# QBa$3Rqb‘%C¡±ð&4r ÁÑ5'áS6‚ñ’¢DTsEF7Gc(UVW²ÂÒâòdƒt“„e£³ÃÓã)8fóu*9:HIJXYZghijvwxyz…†‡ˆ‰Š”•–—˜™š¤¥¦§¨©ª´µ¶·¸¹ºÄÅÆÇÈÉÊÔÕÖרÙÚäåæçèéêôõö÷øùúm!1"AQ2aqB#‘R¡b3 ±$ÁÑCrðá‚4%’ScDñ¢²&5T6Ed' sƒ“FtÂÒâòUeuV7„…£³ÃÓãó)”¤´ÄÔäô•¥µÅÕåõ(GWf8v†–¦¶ÆÖæögw‡—§·Ç×ç÷HXhxˆ˜¨¸ÈØèø9IYiy‰™©¹ÉÙéù*:JZjzŠšªºÊÚêúÿÚ ?º~÷ïg âWLì~à«ß0ïJlB` Û²ãÅ|´NF\ÂÕ™š" ŠR† ò–r¤ϺÆ]·oŸu½‚ÂØÆ'¸ñ<3+ôây›Sr;#jvœÐ ‚{ïÞî[ý’ž‰ÿVäÿÏýwüSß¿Ù)èŸùÕnOüÿ×Å=îƒÔ?ót-ÿ[Íûýû·ÙDßöÍÕ4û÷»–ÿd§¢çU¹?óÿ]ÿ÷ïöJz'þu[“ÿ?õßñO~ õÏüÝ{ýo7ï÷îÝÿeÛ7TÓïÞî[ý’ž‰ÿVäÿÏýwüSß¿Ù)èŸùÕnOüÿ×Å=úƒÔ?óuïõ¼ß¿ß»wý”MÿlÝSO¿{¹oöJz'þu[“ÿ?õßñO~ÿd§¢çU¹?óÿ]ÿ÷êQüÿÍ׿Öó~ÿ~íßöQ7ý³uM>ýîå¿Ù)èŸùÕnOüÿ×Å=ûý’ž‰ÿVäÿÏýwüSߨ=Góÿ7^ÿ[Íûýû·ÙDßöÍÕ4û÷»–ÿd§¢çU¹?óÿ]ÿ÷ïöJz'þu[“ÿ?õßñO~ õÏüÝ{ýo7ï÷îÝÿeÛ7TÓïÞϯÊÏÝsÔ›#œÙÔY:|†CuA‰©’·-5|mE&'1VU!•ˆVi¨¡"] €Œœj#Ù ÷®‚»®×s³Þ=و̈ŽL,ÏYRљ֜{E^÷ï~÷ï~軯ÿкv5ü½ÿâåÚõ´÷#q{®_v5ü½ÿâåÚõ´÷#q{÷XÿÉŸò³mŸé®¿í ç«6÷ï~÷ï~ë :÷¿{÷¿{÷^ëÞýïÞýïÝ{¯{÷¿{÷¿uî½ïÞýïÞý׺÷¿{÷¿{÷^è‡|÷ÿ™_³¿ðûƒÿyìߺ ÷kÿ=ÿæWìïü>àÿÞ{7î¨=û¨#žÿåaŸþy­?êÊõï~÷ï~÷îÝÿѺv5ü½ÿâåÚõ´÷#q{®_v5ü½ÿâåÚõ´÷#q{÷XÿÉŸò³mŸé®¿í ç«6÷ï~÷ï~ë :÷¿{÷¿{÷^ëÞýïÞýïÝ{¯{÷¿{÷¿uî½ïÞýïÞý׺÷¿{÷¿{÷^è‡|÷ÿ™_³¿ðûƒÿyìߺ ÷kÿ=ÿæWìïü>àÿÞ{7î¨=û¨#žÿåaŸþy­?êÊõï~÷ï~÷îÝÿÒºv5ü½ÿâåÚõ´÷#q{®_v5ü½ÿâåÚõ´÷#q{÷XÿÉŸò³mŸé®¿í ç«6÷ï~÷ï~ë :÷¿{÷¿{÷^ëÞýïÞýïÝ{¯{÷¿{÷¿uî½ïÞýïÞý׺÷¿{÷¿{÷^è‡|÷ÿ™_³¿ðûƒÿyìߺ ÷kÿ=ÿæWìïü>àÿÞ{7î¨=û¨#žÿåaŸþy­?êÊõï~÷ï~÷îÝÿÓºv5ü½ÿâåÚõ´÷#q{®_v5ü½ÿâåÚõ´÷#q{÷XÿÉŸò³mŸé®¿í ç«6÷ï~÷ï~ë :÷¿{÷¿{÷^ëÞýïÞýïÝ{¯{÷¿{÷¿uî½ïÞýïÞý׺÷¿{÷¿{÷^è‡|÷ÿ™_³¿ðûƒÿyìߺ ÷kÿ=ÿæWìïü>àÿÞ{7î¨=û¨#žÿåaŸþy­?êÊõï~÷ï~÷îÝÿÔºv5ü½ÿâåÚõ´÷#q{®_v5ü½ÿâåÚõ´÷#q{÷XÿÉŸò³mŸé®¿í ç«6÷ït‰üÏ?Ÿ'ÃOåo¼öŸOvn;³ûƒäøÅÑg6ÿHt¦ œÝTøŒÆLâ0Y-É‘Ìg°¸œ2î:ºjÕÛ¸±&[qæZ-Tø_ #µwÅÿ Ìø÷×›«na¾\ü ùçñlî¹|XMíÙ]cO&:XV岇ÈUmÃ]GKa÷GlPnZÅŠ7nºÈ¶Ë÷ïaçWvvÁîž»Ù]³Õ{§¾:ã±vÞ+xìÝ·êf#píÌåø¼H ë)*¥ìàQÃ*ˆ~ý׺÷¿{÷¿{÷^ëÞýïÞØ7j ·În´•è°Œ¦f±)ìf–“AS_:Ó‰V©+LÚUš×>£Ï¿uîŸýûÝvÿ-ÏæYñïù£tNG¾>?Sï}½ŒÀnêÝ—º¶/ebðø-ÿµòñã±™ÜeN_†Ïî/á‹mçq‹odé2­v.°2ÚD‘Í|–ùÖß:µ¾FöþV|W[tÞËËomÑQA¬ËÖÁŒ…¾Ó ƒÇ‰é¿Šî=Ë”j=»¶ñD9mÅ–ÇQ†MCÝ{¡ãß½Õ÷Å_æ­Ðß-«þ$cvÇíÝ»Uó£»×¾úî-ëƒÛ8ã·6¿ÇîÉÀõ~óÃoAºò‡¹*·å¤lMøÕ#R+ºÊ2B{´~ëÝïžÿó+öwþpï=›÷Tíç¿üÊýÿ‡ÜûÏfýÕ¿usßü¬3ÿÏ5§ýY^½ïÞýïÞýÐ;¯ÿÕºv5ü½ÿâåÚõ´÷#q{®_v5ü½ÿâåÚõ´÷#q{÷XÿÉŸò³mŸé®¿í ç­xœ¯òšïîãþiýuóÿùwüºø½·þ^m‰ú°Ô|î>ÇÚ8}÷Šì¶ÃÓSlìÞËÁf)w=j“qíŠ|8¬Ùû“ ‡emYš*ÚôÌ[M>{|÷þv= ÔTÔ¿Î{ùH|>ùSñjo­¿‘×3ƒ¤ÉmZãRµX .GûË×ý“¿6ÖÛËe©òµ¸lEnWaáܾ\Q„gqº¯æËÿ ÍÛ_=¾O`~rüjù%Ÿø}òß.ΫÍnü^ÛªÎà÷V¯i©1û'zÅU‡ÜWrlýù·ñœ>&=͈®Ë¤˜œ."7à "û×*Ýýüƒ?œwÎ-•èï›ÿÎsØ=AÁå³Wkô>“%›—Qô5™ˆ0Ç`.äËQj¬_÷Ÿ3š£¢ÊŸâ¡ZUR}Ö@uTÿ-¾Tçúw­¿•óÅþZô¿Ñ_1›º‹¦~AüÛ½Ÿ§éîºÞy½÷Y­¶6]&ŬÄv®ÙþýmµÜ£EFk±;;r}Žr欧›ùü¥íOæáüâ¾ÿ.ïƒ_!»cü~Ú}}·{ãäWcôwfî’2[?±pÐÜošÌì ¾:§î1=>›Gnlå­¬+EØ­öIêŸù¢Õÿ*åüŸjÿ”ßj×vR›³þ>vuWFá#Ú¹ǽû+·°û‚›uSöFkzcöùÙ›CqRvþW ¹åÛ AE‰_ázI(hV„?ðŸåÓ‘èŒ=ó“³¶ÆG Ù_)«iö—ZSg1ócòx®ƒÙu¿tsðU«J>ÆßaëN¥Ñ[†Ù»G- 5%b–÷^ê¸öžÜù½óGþGüÃ~ u_ÏÏ’ºFÝ©ô¨Ù»ÿwåò;k¨6†G¬Tm.¤Æe³ç±7&gqUm¬O÷Ÿ h2´;hîPMp¬­Äåݶ¦åOòWÿ…|^ø‰¶>lüƒù%ñï¿¶®Üݯk÷FòÌn#•ÚÖÅÃäqÙÌ&C+W·wíÍǰÛrmÍß·h°ÕŒ¯Iþ1fÇß’îàøÙüáþUÿ4ªßxÛˆù'ì|LÒõÍV'´ÿ¿[ƒ®³4óϽfÞYJLÏð¡±M(Ó¶1:ÎRÊTO—É=ò{ù½üIþh4½ÿ‰ÚxOo®pý1U×5̆ó]‘º{qTÏô]ã¤Ã.V—}­«meôy%O¥‡º÷Z×,~¥ù)ÿ gîï—_%>_üãùÒý-Õ[§kmíƒñ÷ãwcTlü>܇{ÿyó\&3_O–Ûxœ>ÚÃà¨ék7-fÙËnmù™-W_˜¾wñ ùvÿ0å¯ò¯·v6ùƒm¿’¿ËÃ{õ–ñ£›¥þI÷èÏü¡ÚÕ¯Ö:Ü.kdí9¶®SlÑåñ’”ÑV¹¸¶ÖßÞ ½m~ÚLÝ%bJøN—Êoˆ(»Gä?ò~þbìŸmŽä¬ž³vtŸ`uM?dl¼wÜdryh0t‡"røm÷6ÝVZ´ìÔÜ›>MÅ´VG¤ƒrM©˜Ž_á>ûÛ¦>XöWóùÍó/ó7ænñÙûÃlmá.Éþíí.¼¬Ýû>~¿©Ü”tÕ:ººü¦#gÕVíµ‰ÃÑí ·¶6Õee –£zuî‹gòß)ðW§ÿ“çͬtpc:æ×Å?¾c%54˜­¿ÛTô*‡=ù™Y<µYœ¦kãöïÍW•DÃîí„Äë¢UkSùHõ:ÿ˜‡KüƧñ/Žÿ ¸ß5>iT@|nãí8«êæøsñç%Tµ$ê;‹–ù ¼°Õ”l•˜M›°þƒ.n8õÿòÔÙÔÿÊ£j+îÝÝïý±ˆøßAÐùŽÁÅa*6ìòæ0øåþîö6ÝÂË–ÉÔa³;csRâ·vÝÆ¥4yœ=y4!eü¸¾æ>tvohö/pdþG|†í]ý›ío¿#709îÜì >;lá2â¾ë(ø¬NÓØ;wim 6嫊,+J®¯•u÷î½Ö¿_ÉöF›º?’¼ò#Éð/ù´É#ý/œ=r?ã_ןõýî+ï^ üŸþW|xÇ|Ë|eùÓ[[³~õÊŽœÉîÖøÙ¹û'joüÉ®ïÄwEV;maû»aÖíšÝ¶p”˜}Å™ûµ‰P@ötöQÿ7¬v÷ÚÌù«ð·uuÝéÁVo±¶>vNÔÜ»‹hC”¤¨Ü˜=»¹+þYnŠM½–Ëa–¶‹™¬Û¹xñU­‰­Œiouî…¿žÿó+öwþpï=›÷Tíç¿üÊýÿ‡ÜûÏfýÕ¿usßü¬3ÿÏ5§ýY^½ïÞýïÞýÐ;¯ÿÖºf¡;ò¯¢êw5E.Ù§ÜŸÞHq1H“å$Æ}¯ð§Èº²´t5Þo7ñ2¦±mGI|÷ï~ë,ï.l.b»´”Ãq cQŠ–F»dVCTfSÆ£4=X·ü8>cþ}~7ÿBª¯þ±û÷ü8>cþ}~7ÿBª¯þ±û®Ÿ~÷îÿ®|ÍÿG6ÿ²[/ûfèðn¿—{;~M¨ßúçyÔbKœ]Fí8ÇQŒ.ÅÏðé²ûB­¨½Fÿäú.EÍϵŒ?Ì#i ]WŽãH¢Š-×SF‰Â…~ƒkX±½w{÷¿uïëŸ3ÑÍ¿ì–ËþÙº±oøp|Çüúüoþ…U_ýc÷ïøp|Çüúüoþ…U_ýc÷]>ýïÝ{úçÌßôsoû%²ÿ¶n¬[þ1ÿ>¿ÿ¡UWÿXýûþ1ÿ>¿ÿ¡UWÿXý×O¿{÷^þ¹ó7ýÛþÉl¿í›«ÿ‡ÌϯÆÿèUUÿÖ?~ÿ‡ÌϯÆÿèUUÿÖ?uÓïÞý׿®|ÍÿG6ÿ²[/ûfêÅ¿áÁóóëñ¿úUõß¿áÁóóëñ¿úUõÝtû÷¿uïëŸ3ÑÍ¿ì–ËþÙº4Ýíòv»»öÞ+nTìúM»/:™µªƒ36IætÇÖÐ s˜ê%EÓZÒy±¼jš,Igß½ûߺ#¿Ü/7;ƒu}1žá•PÈR8ê¨(£LH‰Šé©ó'¯{÷¿{÷¿t¯ÿÙ endstream endobj 2117 0 obj << /Type /XObject /Subtype /Image /Width 730 /Height 743 /BitsPerComponent 8 /ColorSpace 2103 0 R /Length 606987 /Filter /FlateDecode >> stream H‰ì–ýoÇÇÿ€þRµ€}»;³;»{ç3†@I   EšB µÁ`;$ˆBÒ@K)à0i ¼ƒí¢*"iUh¨újZZAi `Þ1”"¥¥¨©‰B1ö½ùãóíîÌôÙÝ»õa ¿DÍW_Ÿyæ™ÙõÎIχs!!¡ÿ{QÎlw2£Ô¶¸“2›KÔ‚?6ccþ²+F]»'Ñ\Æ“Ÿ³rÅÔrS;çàÁ¹Ê3l=Ë;öþ×wíÀ;9”BöûšWæ8NpTðÂÃ^>H1»_çË e•ɆEiF/“®ß aêwa¿2‹À)Ž;º ’+ö„umæ—1`?Î9D6f ,°°Üö๟ónÎ{¼ mÛ`)†1ÃíäøÇü‡5DS¿Ì¶íaL’T>„ £¬aI!!!!!!¡ÿ]^«çгm¯Åº1´~lêšæj,Ê`Ù³Ÿ"aƒŒ9 P{Ð7§g¶ë ÈM™“ñc7H'{ °䡌ۃ6µrö‰9Ô±`•úÓû gØvðïøãƒôâù¸q°7¿>8$c>ÿ =FA×÷ #CyÚm —:†0„:Ž•7`ô@µ-‚tŽ:€4ìÌ€ô÷Rþyªïjÿà5‹ýÆdïŸ?ûüã¶³ûNŸ;púü/ÚÎþü䙟ž8óÞñS{Žjý¸m÷¡Ã­ï½ß°}çÊw›êšš[š·íiÝݼ«éÌ©ÓçÏžk¿p|ñü0—.¶Còrû¥›7þeg¬Q]Œ¡¶“Ícyd‚â,áP–-ój†Ž¢Áà%BBBBBBQNš/‡»MÖmÁУaB³¦Î@ÿ]+ãNyÒ¶oSvÓr>È\íJ~réêÞ#Ç7>ÚÚÔ¼lãæWwî~£n]ùüªñsÊ‹T­tæ Å¢¡B“(X¡É0êÈp AAª¦(’ÀÅá°RX(Œ€XW!3ŠàUi Ö±öê1‚°aªU3uCꃫT.¨˜?^ÅkK–nh|»µ¹åÇ-­à ç΃¯_û[úÞ@@#Y&ÉÀ¸S?|ñõ”/LHHHHHè‹'h¼´à çýÌéæ À#Í´ã\Ëd>íë»|çN[{ûþ#GvïÚõú† UË——WUM{ñ›ÇŒÆ U'Š!%À‡T¥@ ä(2Uˆ‹ÃQR4Eèa`,!0ìòqÂ' 1°¡ª`¢ŽÐµ‘aC ë²wZ–"º™+ËÒH¾}P ¦A™©é°„B²?…ƈh‘CŒXAEáÈì—J—~gÉúu ;¶mÿ`ïûm'NþõÓ¿t'SÖ`†ç¡‡Ï$Aüt.KHHHHHè‹©Û™Áëé+GNŸÛ½ÿÕ[¶U|ÅÔy¥3¦N%’‰Fá‚/—˜ˆH_…©ßý¡ÑcIÁ’djÐåe‚&›¦& ð‰1’.N¨ Ë…0šC†`yȹÛ%Ë'RÄ@ÅD‰¨’®£0¨#&€- •ø† Œþj>«ÀQabÀ~¼6d¬è1ˆ®" ‰T‚À§À˜Â’©_Ÿ8©ººzÍš5---¼råJ*•zÚ÷%$$$$$ôÄĨkêxç”sǵŸv3Ù²œ=QJ³Iê8Vš3›2n9°òiÊú)»Ç¹í–± §}¶}˲®ß¸ù»ã'·î;ðúÖwgV•ÏzñùÉEªlÈ’© &a¤†¡(Š®ëŠ$Cû†Þ=úº®ãPh$Æ€ !YÓ0ÆŠÒ´%ªš°Ý;èe”wì—fM¦zî”Êòçª+&TÎûÝ%“·o^¸sËŒ‡zïOžŸ5íYEtbh…ä“¶Ê£GæŸ8¶øQõM[«6½YöÆâ‰ ç­.W]6þåò‰³_ˆ†‘¢K¡¨FЉ©`S6GkcôB Å{g¬“0Q#X ëZ1–“T0ÁDC:R4ë`"ËB&Ò"ªárQˆè¨¨ì¥ù¯T¿ÒÜÔü›_Ô~ábOª;w¶ÃÜOßßf¶ã^'·™{“C·æÞ¨Íyƽ–~ÔÏf¯;Œý€>‘_žPVYäpeÌ¢4#t$¯/¹yê0Çq ßQ˜qÏ¡îªÏ-¾!v<|Žhqf9ÔîIgþ~ãæGmgßÙ´µò«f––>;þÃÄ tØ"B5Tô Ðe!cD¤‘Ðq£j(¬)*–PÔ,Òe Å:‰"E5U¥GsŒN¦O_1{ò¢ª)kkJwlyy׎9ö/þÃᕇ½Úvzé­ŽÆxÏÛÿ%»{ßI¤»ëâ©u]É5±•ñîšXbýCÝÙ±yQÕTkÀ9É%;n¿õ¨z8ªûîÚ;ñUñxDW¼!Õ³¡3ù‰ àÞ¨?ß¾ä豿ýýœ_þjÆŽí¥[6—Ö®ž¶xáä²™ã¿1¡h´†"22d¥Ø€/ƒ‹4£H3uL"¤H•´0àW(dÄŽ ›@*RFhj©ë8Š$¢*DWõ’’’¹sËêëk÷ìúÙ¹6à“8çýœ÷Q§ß²,#lÿ6AÜ¡¥Íìí3÷rAøˆ,¸î¼ë4"$$$$ô¤EyŠó´OÌc wÊ{ )åc ä³Ü×јÍ+ÃYÚßÀ½Û©Þ?¶ÿiϾýËׯÿVù·K&Œ•MEÖGiD. kÑ01T%D䉈.E ©„¨Ðz 5šª" £CW ]2 ”q™=ý¹E•“ÖÖLkÞ9ûÀ‡•‡/½zùµŽ[o&ºÞŠw­‹ÇjR©š¾¾š®Ø²Dle¬sEOª6•¨IÆjSñµñÎúîÄúÞd]üÎÁ©ØêžDÍÝžZp2¶"ox¨»{+Ê¢D—.À……‰î†îÞ†T²öQõ±U©žúx²&Ù]OÖÝéZHÕǵ±®e‰ø÷þÃn¹þÆq•aüàµñîÎý²^;÷€B% %´¤±…4NHÓ¢œ8µ÷6;³·\šPÒV\œ¢VH-è ´¤‰DZÄ¥ ¤r -QŠÔ6ÞsŸY’8öîzyg ®Š’˜GÖç¬Ïœyß³Gz~a xžâ,Å9(Œ¢”Íi•b(ÞáÌcÔ!ð/Vüå¯~õç?÷ìö'NŒ¹ù-{wߺíŽk­„)'t%1’6á褡”¡Zºb«)[•L-a¯hIŽT“3iÎ0­ ŽŠ­Xë‡7íÙ¾ïÉcßüÉ ?~ýW¿Œìÿ‚íå_s©w­Ï“ @ ¸À*üfE+ +V¬X±bÝ$u{íÎÒR»zÝ¥(·º½ùÅžÞèõñ£Û¾¶Ôd ’ (¤×éðNï"k½rî7OÎ>ýÀäÔgÆï^“Ñm HCK6ͤnKfFµÒŠnkCº4b¤”Q==¢Ùê`jX5ôDrÔ”Æî\¿kçšcÇ·}}vË‹gøéÏöR^Ä4´*섺¹àŒTˆ?Ù9N"ºÄa¾+pE Z ²O – …#Xr7s+ \æ¨Übu0i”À°˜ûUNœëšÑ½÷¤mK6JË *Ms>s£õ‚S¿"H]*õ½€ÖB^ Y4%M7<ê×8>ÄÑ ì†ªr9.Býç©õâ7œ€× GÊ<à› åêÌ¡¯¾zîK/¾ôàã'¶*"À^`AÀƒˆbç}(RÁôP£Yk4#t³2UŸ¸Mä2Q§ð öp„×7öÝûvn0€¦ôtFõq­Ï…­'~x‰á °À©¸P ¢%Ì\Â=ø„ÂÀÑ׸œ-8–'êÏ]5Òp(rIÓ¤~98NQ(%À9Öœ¾¸sïL^mUHs¦ÅKÔÏr8+`0Z„î¤2‡ªþ‘åÜîÙ§vWjc»&6lX#ëÒ€&YºdéÉ´l¨ƒ)SRÓ†a¨’iHi[–•[4E¯]µkçÄS³'÷úo¡pVnÆ1I¬X±bÅŠu³ÔéÃÈ"ðL®^¿ø×7_8}öDÞÝüÙ­ªmÈP‡,Í0U]Wª|‹®)KQ,YÏèö¤ë‰¤%¥nÿ¸úÐý›N~cÇ˧ïÿÓù©ñxpÒà!lâ8ÁÇ89ÆH³cyAK਑ç¤ÌPùr𨠇9>„° f¤Œý|¢¦-À°ÈFnÀë¡8‚š^ó’°£Ïp^à¬HpŽÀ/ €"‚€gÊ{`áPR‚M()^לÖ÷ìX§Ê d´•2©…À0ȹáú>5-oK°†·¼ßuàLp£<,Ü…–WLiî}# ™èAxºƒÝ0)1¨9!¯í0\ô›Ó‚;Ð&<°2næÂÀç¹0Ì7_>Á¼àsNþÂÛå³g<ñØÖ÷ŽÞõ©QliÀ’?bHI#¥² †6uU3uÃ6-$‡£™‘ñ­cíÄéS/7.ÍEh |Úé.bÅŠ+V¬›¨v¸põ‹OÿyoÿÛoû¤‘14mȲÕuZ2 ±¢¦R†¢ÙLí´2lI¶)ŸØ´vjrlöÛg^Û÷/CøBîc¿Lýš uMN³ €hf´à7Â4àyìÏp\䨄HÓ<åEô§E&\f1ÏžE$˃|qv(žŽ6$3ÍpZh‰2ð „uH«ÀÃwCZÃ΂8!‹¦Ìw*·¬ò<ÃÓ„º×5CÕû&ÖÙ¦fhò°¤PVáÄ…ýo´~™:ú†±'X5bRn± ¼Ê€v—ë‰Z&îѼnÙÈ/¢B˜‡€iç­b“NÁ7;˜¹,¨!êùØC¼Þ •À/Á+`g¡Y÷i-`U8x/E…€;Á¿Ø/ÛØ(Ž3Ž÷k*U%rÜíûÞÞmˆ“¨p)á¥(@ Z …¶ïÕç;ŸÏæ5¶¤%­ú¡B¢ªŸÚBÒ8ÂP5"%jQµD”Rûnwfvöö ûönûì­k¡H Ñ&Q÷¯G£ÙÙ™½¹gçÿ…Ru ëÖ˽—3'ÿ´ùðáím çÏi&È7¸L”dIÙ—ú 2wηãÑØkG™8LâÉ“'OžþU­Þdîqµê”P¸aÕj– nQ­Ô»Vj#¶ 1Z­ŽÖj5wHµ26R³,·ÿب]!¶ý*œ:ÑÿB6·nñâfQœ®$ a^ r‚ÀK¬ ) xÇA+R€c¦<ü¿ö{ß9|pÞÉ7ž¹ò1àGãB¢àÈŽñ¡©gŸZõ ÄK`Ä!ŽG4Ipê6ýq1GËmç.´žH Ÿ<±áü?wR5§™íCÚÁ"ͪÅ=e#:LºJ¤GÃÀfy¬Å(Ž–Q÷U¼—ªy ƒd2ÁËa”D8 „p“,Â;Ìr+ÕÛÊFR+lwF¼WE +†{°š2$ÑÚxnõž'¨DçÔ)é¦$÷ñGÏ~{Õþ¾MëVÏnnš*ó_Š~‰ãæáE‘‡Dà"Ó 0!ÎÏ4„¹Ç—¶ìîízû­?¦mÙÕ17GmûzÕrrÌI½š5«2ž—i–åd $`½œHæ‰Ëϵ{òäÉ“§/¸ªu¹(âîÿ•Z¥!u©¹XâܲÆl Œ¢Ž;Ô*õaöÈâÕѳg?xå'?ݾ≹A ¿ p÷I¼/(H2ŠÄ†ƒ¼"ƒ)Ïfå¹³ƒ­Ï>räÈ“ïŸm»RHÐrŠšúr©<P„Ò$8ØÜÝljɥSßiìþ„å{$ÆýŽ ùý²ˆU+ØøtË©·–²íÌ»í›7ÎlÝ0ÿoi7¯Å·^5s·™f¢P€¥‹•hJÃp˜à4`ð†n¼X,îCƒ‡ ÜW¢)ç Æ=Ĉ;è¢eJú^¬öB;€ Å·™Z†¸s4|‰æ‹C)RÚIJ©¡Bþ½÷:_yySûŽ…ó[d‰ùZHfÖ'rH%"±23•2a…o†ôàìŠ'–þÙÎ;å¤ÙxzŽV¬k5ûz­z­Ã#•JŽL2Q¿Yµº¬º&ïCòäÉ“'Oÿ«`¯‡ý|üüXÛ9S^¯Ù7`?¯kÔÁÃvšnÝ®S  ˆ=zct¨ˆÎ¼új4_õæˆÄ‰`¸ ãSY•ˆ–¼ÄøCÂô óÕéžåE²‰Uoö÷_çÛ ²‡â>ŠzÀõJ¸Û@Y‚ÅŠbÜAH.oïÚ_š¸C!…XüÀ@›ÈOWäFžvÞô˼(¢}çô¶bñùOÍ—>$Ý·~ƒRÀ»±*À“`Ò]Ô[uœ0i«)¬¦¡$Z²\êÂZ,ÕõèÓkÛ¶,8Þÿ$Òb:ÊPÜé° ´H!-¡“N¨hZ‡QÚ‰ôgnõž4â”;¤¥š†™zÑÚMšÎßÂ(©Ó¬†º®|=zlc_~ÁÒ…R„÷É~¾A †%¿"NQ„€(a9ÄÃ,ù,…š›gµ¶n>vìØ§Ÿ\¶ëìr2äg­:ž·.r¸iì2 °‡‹Öíccc“ýEyòäÉ“§;—»{O\ŽoãlþP‡üz=*Ž#8LRµ*p>5nXÎüãW~¼~ñ’Y"7Cñ³R€“X%$6É\ˆñù‚¢_ô‰3qñ‚p6=ïÍþ­—>Ìh(c–Àã¦ÑièI\ìеX™$ ðÄbÑwR-•:¡Ø1Ø"xXÞÝljɥ´cÚñ‹Ÿ/‡%ÙHS¿zMË’%’4M‘ÓBâýaÖ7пÉ0³m;+—ÁdêÑ+…bä°–¢Óõ@ ]Ë–È®Þ% À %‰•«gK¼¯A”~û»ïc=AqÜrp€DOëz¬ˆ[±ÞIEu.õÜšFÒ.@…êNPÂÔS%’¤(ü££”ó|@,”AÅ<°ŠQÊ}x©ã÷G×t§.]ð`ˆ8 If!sÁ  ‰‚_îUBSv:\/[¶ìÅC‡/œ¿hAfVí Ø¸<EnÎêϧ´'Ož·åñÛЈ $uhL4 íXÝE4x=&ÝC<ÂfM¼ ~øD'I¬'Õž.F¼¼.Öñ­ù-",Žh s³.¨ð|DáØ€ ø9† ƒóæÍM§'þP³«5kÌäšU½q}¤NË5€J¥â&³U×Ýù¬H>×Ö~ìÈQË0H&&&®v•@ªªªªªþ‹ä~fOÓs(Bhñµ×Gw>»6¼K,QàF*t% HK%NPMU¨Y×Rÿ—?õÞ·ŠÎ(Å †òĤhÐK¦¤›8]&ëgd$Á@`Âú\‰Û8ÍPŠA‰ÓÄJbäeg0$DH^„ô2Öë8IÇîc$Oq~áqâÖÒˆÃE3¶åi÷‡´ÆD™‡¾°à«Wô=ÑÒî"ÎÅ€èD„;ÿñÑ1‹™t×ù £OllJ‚ÂEê¤:Íï«×>ÿÒ‹-_ʱrá܉ã›ÕÚHDå6·ÜGYŽ ¬Gh7¥ buQKXØ¿ÁQîê];ß8ç– L,¥ƒóÌÊ‚m”+£BÉʃǭ!C„ sÂO8,MPÜ!)p™ö3«[½Œ½ôÒPV0ÍrÒÇrïM~ï»O­[[§ ‹B²¬ð*L£"ɺªñÈÊp0ÔþlÛáÇBÊ•JåzLOO/ØæªªªªªúÕôÌÔ¬§]·2KžÜÊôÔ´[©LÎÌ|:멚TfÜ)xí&&áFymrâò±_ÿ¤ó›‡øE’¢ð‚& !YPuQÔxŸRã ÔùŽ[šþtû‡‚T’³iœàî²Ý»ðéþ6÷MÒ#Ï!’êÉ]ù‚Z£†üõº¬ò|2¯*ù4Ÿpðgß0iÿeÚ–b­â¤"Îc§ëÜßS=Ú¤‰+Äeýš/oßÔ¸²a_³BWý¿x³Å.˜¨ÿÛû¾¦+ºâ«O%êŠ_aq`Â1cïoO·?`Ý['»?:—°pa÷àCŠO¨|û†ÖexˆXC–Õí”w!ÔÀÄh±(ŒÓ²ò˜&©ÆxY{°•·hœÙyËŒ—Kýu9N£¸iel §4fÛu@%ÀŒMûç§²x‰Ä1Ža+ó·c¯þ¸%Ú&¹Í ŠºàEžSe‰çyEVUNÑx¹³­íô[Ç+Õ.àuö¹·+¼Ò…ÊÊÔ¿A”ÜrƒdªªªªªªúÏ'îŠÌÒÈgr=€LMº““Ÿx@âNÍÐð™33c?ù£Î® Ë$]ÖdNSM•YòCâS¢\+7Eôޝ¼ºñÜù‚i S{ˆÐ,£}ÄÊ`£PB£ Ÿîosß,X9 olm–x¢'b÷&Í[ž¸ë–æM­ÁÕMü±ÃÏVᢑ òŠ&Ö…ŸÅ ÌÉî] K&p¾Ž®ú‹V®hö½û~{8,Hý¡û¹KÖNçZoºçaÎÇ…Äð}–íŠgßík]W«HŸ“å¥@ž_Y±èWoF7´*!%¢râÉÓq„¢6Äf?Á ÇIcIlA¤ÊÅ8E}WJ…Ëb3AÍt™ö;ŽIÎ&{Ð¥ç©1JÍ!³˜*—òŒä*•Â( †Ic”žo,£ÏÖ¦4ñæ°!†ö£±ç.F_ymí3ÛÂwó!A׸0Ä-[Hñ«BÄ×ꊩ¯ËöeÞyûÌä§S×C‘«Ÿ\…àŸœ*€ÏÙuÝÙ>³ºÅ{¶ªªªªêOW'&n<_¿âÁáê½Â‰|ufö–8yÕ«qÝ+ç.œÈv®jŒh‚§w8Ìù_Ô4Iä¡X¬qæ˺;Ö9Ú~ÙÌS'k¢,vzI)fâ®1³n¬ §)ÊÚ¸°ðéþ6÷MÒÈ8áR¾¹9 ²**ÇOm2q’¢ÇÌQÊFŠ—Œ— ¬”3ÿߟ†®¶”|E#õòÝ0hÑÉ2‘`"ÆÔH.ñæ›m»vÞÖºÄcÔʆìòiš_óªušW÷)’[×j[—5÷ï{æÜÙa ©©‹e Ÿ.}.ýû‡è_¥¢Š*ª¨¢Yk¦TK;ÓåÃé™ÒbàÔôÔ$pÉ$¡C?:¼gÍšÅ^O)-ôJ¦ ü¡×Éus Í ¹Ò£Öulm>vlÓÇŸ%x1^ A ÅŽ ¶P‚² Ø«à)F#ØÚQ×µ·ûë¼fI# äpBÓÅ£úôæ·Þnç(n£0\5q!ʬ$C°ò©'Ÿò«R]͆‡—s'“·º›ýs\7»½‹uù³¦É¬çW5¿¾PŸ·¬Þíú㻣tÇêЦŸ¼sê D£½Ù¿âW«,YèI¤îzöé¶Ž-M~ ¡Þ ÒnÉó¨à ŒÂ‡J;VÂá8Í`È壔¥1 c°íFÑ|®‡ó Iè(‚ž,Ëi„âã, ”Rj’&( TSþ±¸ðêKq‘}š³(¥Bz Å…L¦(ú'.<7òñž_¾ñð¶-w5únRkoñ¸aÝæ×U¹uYönE’ ][ûàšWvŸ¾4]B’2­_v`”²®á³[QEUô£É‹—¾ÈwÓ—§f¦K¦¡f.ÃËÖ9yêgO<±Öçui’äQ% ¦Ç¯¹MižºÀ«wlnyõ§›ÎÏá"-œ†ÜÊw »‡¢C½à†UÁ‰ Û–+e‹äøXúÚÛýu^³¤‘"ŠPžõè.YŸ§IÊ»¿ßìð‰d¸ËFQÓí{íè6¯»Ñ4´öõ-‰ ;óÐ=KLÉðhUG^ÛøÌÓ÷ìI­kÛ¸xåÊ&¿Ü´@¿)?:ÀÆc¦R§{uCªåö^Ê÷.jªRÝ>SküÍ©vD"E{PDx×=~Å4$mí}K (óÇ04 Q$ +àØ‰ÿùô¶Ág–nÙÐúÔãkòã¶¡áÃô £pòå„“\t œ¢£Ñ¨ˆ0Ü„³x™fGr®º ((ÔÃËHÃf Q†BãÅ$Éè§6FJ“bßé¿§ŽëØþí^¹Ú¯zêu¯G’|šæÓÉU­+®zS »N¾ýÛ/¦/]aõBûWô^QEUTÑ®+Aoæ‹Ë“¿™¹|irlt䣃‡+WÜƒÀ¨¸TŸê1$ð:¯ÏcÊuU®¾õÅûèãLÞ‚`` îƒ ql¥(ðã;Œ9À!árEÊ–Á¸”U¯½Ý_ç5KVÄÂY[ñéÍÊœº‰ñÎ:³EY;'Æ$³yvðÀÝpŽaT|¤À¶ Œvݫת†ª?ÿÒC9’ÆÅ½Ã$vüÔ&:‘9s®›Ù=|q»]w.0rÖŽOFR`Ö õš\m]xÒfÝh426¶ûÔÉ]úºéöïÜz¿ÃKý x ؘĶCï€ùãüþÁC›µºjÃíóé5†,û¤Û›}‡´s’*Šþ¿þ%M>Ì÷Ž¢Íœ$Š8 ‚QH†ÒPM™.®º„OØ" MôËi/AihQ(Nb G‰4^” Y“ˆw["ø·³Á—_Z÷ÀJƒ,{\ŠOöÕ+õZ“T£ût¿®*w·Þñž?;tæ ÀOM—P¤B#UTQEÿMO]š,…¾™ËŸOØ'ÞþUÇãuµÚÔuÞÂJMƒ¡ª®SsÚ +–ë{2Ëß?cÑ>æÄ (àˆ^Œ¢‚ENÂÖ1FÂR-Úƒó{ 2¡(Rba,Hi¶×Þî¯óš%\ ÞûÓS¾É/×5Õ´phÐf”b<+HÆ¡ƒ…\äÙC÷Õ«^]q ,eã–µëÃ’-wÈRµÇTjžÜvçÁo¶¶|‡?ê{m;rüø.¿fxuïæuKÇŠáát„[–á&Xd 4HP⯯‡nñé ƒývr"8íÁy€ÐN‡|å…ÇL÷bSšïSdCž cJºO®¾mÁ¼‘OÏöÓ}ã¢[oìØº”9õr²ÉwQ®ˆb¬˜,á4sµu(³J¬IœéíîlÙº¡éÌÙ}Üî<ñÖöùjƒG®z`õâÝ_($9ëy¶Ù‘ïïpWD –#}µu (Ip‰78‡> @ÃÀaî²hˆŠŒeeÊr‘-ÝŠl+ɬ)„Š6\€Ö…óaò9Þƒø?Ø/Ûਪ3Ž釶Ój•—Ýû~ïnH…†—Š´­HG¡ˆŽÅ‡y#»›ÝÜ}M6‰¢QÄ7*ò…Š:NñCµ­ÅÖÖvl ¢NÖZ;hCöÞ{^ïÝ H’ݤÏn:á-Œîž¹97gï¹ç>ç<Ïó;;þü¶–æåõC•d¿_SDY”4E è¬ËÒÅK}ø‘¡ÁSU©ªªªªú”J-'oGFFÊ [–Š¥qè++·ce;rä÷í-šl(¢aèu>ŸO–EYUµÚ†zMXûÿãßpü½NÏM ;ä’‹ÄÏ•!ÂnË'l»“tÎiæ#éëæêŠ®ªªî,±­HÞÍr» } ?-óÉEhÙå+g&c1JLN³?@íݘìtœ–ÝKÝä‡ÖÄ"¯¿±åÅ~¸{×ÚÃGÚ05ó^òÝw2[7ÏÕÅ«I6jä hŒiAe±.ËA¹vðïÐî.N3Øê,à@ì)«õÅß¶Õ)AYœ¾qý2†# ›ÄŠØÊÅ]ßpÓ¢zµÁg={pF&ÀÌë‡[D@‚ÐÁÉNF"„¶ÿí¯ÝžÜ0pχ^hwX†äÛa§Çå!Ž{?ø0zóêš]ýß=zxÀ4urÚí „ƒcðð ²2Øî£ðr?ãÁ~†²0C„Ú ¸ˆ÷œ8‘}ýh¤uý‚! ϨӥÚkƒj½.Ï‘üšä—V\·âà3ó<ÿ1ëKÃãÅsè42:::ññaaNªªªªª>«‚\W,'*×ÉÆDi¼4áR Înƒƒ'ïß•iœ;SQ¿ªªÓtE„"¢ùË5¥Nô­¼Î¿÷ñ›Oœìƒ#$sMê†m…@H'AI†{/;\!FPгøÄ±âœwyÞä´Q'u©Æ¹mý×u%à÷ AQC4ÅHüOpt û/@Á…¹Áõ"4â¹è…J œ ‹ëØaŒbðÂÛásNé¡$æyÑ\®Ýåé!”À$]ùðÈ™BÏÉ=O=yçÆÁÕßÐîºcɯ~ŸS7M“¾pý"½À÷!{‡ƒ#¯—8&µ §Ûþôç.ß´«ÔàM+5õcÊ vœ.„±Ýæ‘n‹%Tñk³º€0íý㩼b4þã=kTYQj‚-M7KPÞ|à‰[Uá+€4ºØ¨‹â¢ù_zþM„ 8¨…81buíûéšFU0f+— Žý eo/¸i{¨“à.øRX#˜E]%]œvqrJÿ;}ía$f;Í6iv‡Ã¼`:´Ór2'OfŸz¢é¦oÍ Ôªº K°@j½¡J†¦‹>yÁüy=|ïûÿ~§yå#À¹œŒÊRùxP>#ŒWtùREUUUUÕÿ\•„WNƒe©äÃRiì­·_ G›T}º$ˆªXgÈuŠ è¢_šákPÄöm+^þÝ6™y/içyf¨PN2g•S„¦/;\!†ðp>éqŒD¡Fs’öÈ=—nüÄ÷7.„ê&IR¬X( ¨` ÅÊLrA£åÂzžF>y{A€rcV,áò8¥ÇÙÁ°é ™ÄÊ;ÍIÒ¥ @,Žú)Ë8v¬¼Hı:(11ÍØ´9ý^~`Ð y5ôì³·=½3±ïæ´ ‘N—õÀØŽb;î2ÇŽ÷}siV«ÍµÎŽëÞzÛüç?b¯ýeky>¬õÐ+ͪ,H5×/Ö†‡ÖðLlÛæå²tÕ£nÏC·»^öä©Ð’¹J@\* ºâ7ä@hyÆwÝ»ÞuéK®þÉÞU›6/À®“ÒÉUËP7jçÚ <Ÿã±n˜¿Ë¢y£(ĀĜÈTþq™IqxÌåàÌ8Ä…íÄ ÍPÒ؃œˆ…Ã|¥©uûâçø|º¯¨^®üÓT)Pg,Œu¦ßüû›e›ŒÁóìq.<«ªªªª>»*G!ÛAcä£3㥳gNÿæÐ¯7ܶR×eßL]öÏ6ä€! YÖüêŠÅÇÙð¯c!šÃá[ õäY’œ2 ¸;Oz¡„}*î²n×ëÎÙSfïÏ›—p.æXíy7îXqŠîöØÝP¯/ÕøÈNÜqëÉ/†fˆµ…Õ‰¸®9Õï*h?>I £ ^¦xQyþ8íòtKhø!ÏSÄ QöXš:™2 ò ô«ËÅ™‚›µ¬6B[ Ùvu#–m2ׄ7Z¹m§‡;ç$F8ùæ^ïÏžÞdÀ¾›åVjÀ’›×ƒ¹>Lú{–tEµÛ74bþöË=8ªúŠãý§Ó?–G²¯»÷µ„ ÈË"´Z¦ÖFhˆPUæµï;² H(ŽÚÑéàt*U‘?­¥ÒVñÕNKÅiÚi­C%ݽ¿÷½ÄG€ôÜe†v: ÿàÀØ=sæfs÷w{îùýÎïû9å,¦ùæ†ZÍí ¸¥·ÞLŠñßüvuÀ¥¹kêg5Æhß[ˆ/_и¬9pàÀÝïŸJú\ÝÙìUT¯z‹®:¾°ÉÓÜARÔGqšã pE .AMË|Æpš̃ÌÀ³€âÀ$À`ÃT[,«xoìL‚Zƒ?½oäöÛ˲óæ:9X¢yê¼nÅᘬS×Ý¿ö׿:2ùɧ—hä²]ïs¢jU«ZÕ¾h« È§Ÿ‡€?ÿ‹ƒK/ò)Šì‘UI®÷×)Us*Aïô|ß÷ìÏ×ãáès)K™fŒ³nèáȵX:\P#ŠS'K0qý1àqËì1Yú¬9X*ö˜1ÂÃ%²‰îZýI·µÎÑÝår(ŽZ^N&8Äxe¿Œ ù,¹‚ÔòÌË ‚kòNû)Îb#MH/£° ’@Vö¢c`‰8xy"Bp`•¡~€‹õƒ¸ÃHÇy“ìd¨cb"Wl$œ`B;Ö+DœÐNÓŒ`4tðÐÚù-75ø‚ªS«“æiÎiO>¹œYÉ»–¨x¥™·¶xþ|"}úÌßßî“j5—AS ãÔuŽn­ó~# ëªæÎ¤o{ïdnt4LHžZáãïv¯XÞ j·H¯¦9<5¾zݹòåðsÀ®x;VbHž€LR a8~µüP‚Á` pNcŒD°Ñm‰Ä„Øf'ÚS1–gMñº\>¯Gv:çôÙþ›{»ZŽÝ:>>€H?ãÝ ÝIØ=, ÙzÄ¢„E1 F$ÂY„É(…¯;Ü ÎÍ1ÙRn œÏ~0¶ýå#mÈÌ^«ù!Û«ïmèÉ£4úNŽZ|CÄf®èFÉ^ÄÿˆéçÑ Æ( ˜!8ü›ö@¥ PåNp‚â4PŠ`yøloºµl¥LÞpª2>ÂPÚD;€W 62&ÍÁ‚R'2¶ Ç1Šc".Ǹ †Š¾“c±§žºg ¿bãý-»·ß5ú× ¨xûÕ\$+ž`í U“=õÊLŸGò¹gûU}Ãë ¨—ÐÁrlª_Ó<]ÖæÍv~q#lT*6$†Å®®îÃÔu¿<3à èÓÕgl0p”yQÎ2Œí&hg©”áf’pØç½WË0á;!fJ# ê%†WËŠbWG 2#è *Fq)VæCmnÅ Î׎=îü–ß[T%]žæq¸tYõiºâ•o¿àÑ‘GãP§“““.\ø¯²­ÒHÕªVµ/•qNGöî™ÛÔèõ¸5Žw¿Ò¦ùܾ–Fy åñw2ˆm+â(‡ï¬³qÁâpœ‚”ˆJ¯òH–ò¢Iû0g—šÄgŸ%pÿWNK›"cÐŒ‡}î¯4H³üòWÇÑžk5?ÈwÛ} Ф)Þ ZS722û•—Ö¾z¤ãè‘uWôÂx€Ä–Qžæ,õ¹4Ê^­Àg/çÎc°Ä”¥˜H¤‹[!Âðô'¸È¨(‰iœò83£u—Í$C›`I§e†±ÙIBÂöã´n2’Â1Ë)PÿŠvÃø¬I2¸ᢿH7 3K‹Û¹Ñó!¸/Ÿ]¨(5ZP’¥€âP—-­Ó¤éªG{ìÑuLl$à¤ï/':^-µæ¾¹’~“êœôÌøåá-¤8`’!uQ½¢9}Rís‡Wþ䉶-ë—ük¬‡ðîSc¡‘Ý­Úg­¹'йiÞ§[OžÌQ–…½}Õá<Ä´ÉiFÐ'iÕ3ÔÊ$f}”Ç &Ÿ5S¤Ô+ŒA\L ¥æVdõüéDïðÐê¹õzP÷»k$@#ºªy=R˼æ}ûö;w€ärÙ™T¤jU«ÚlÐ>]j¢.VlêR/NM~|Áþ.“OM}$DaÏž¡ºÙªWuɲ¬HŠOR¡Á J®eóç<óô’÷þ‚£((Áhx©Ýç^eÿ"Pa¼°Ñ²@»M²×äF! ò bYq 0&â%…kÜ~ÄH Ò‹¶n"܇YóX‰„-º  ܱ´”`w“Ï;ãч®Uü˜F¾·¦ÉïHŠS“]ªgšê÷{Ý3t|E×¼ª&é>EWœãe‹ë×´.l_Õܺª¹³û®ÃmC;îÞ³÷Ž—^þÑ‘WÖ½þæ ¶ÄÈQÔo¿])Y6óF)lФi3CÄä ao Ð4Â)Œ³‚Ä8Ž#i±~гàe„™GãYAU(O2+‰D›é"KÁ6ƒô2a£ ¤Ý aÄ¢UŽ£¸‚†ÙÄâE øgÍLétöïf~úÄŠ}/9þöÎu«šê<_orùÿF„˜]ÇŽ…Ûï½í»ßž5úÏÁ‡½¡Ìw¼šC•kÖ·ÞY:2YöЋ­@ÝA¯¾pNiåŒñxY¤!€ß ÍmÐew“êÕ5e¦«Fõû‹9þøÆ  íœwÔc‘]ÅÉ Öi’¬i¤íàY¸aÒ.Á¸Ç© »•FFÄâ€U1Æ¢ˆv‹r6Åi‚ú*;Ê.1ØcôîdÕßôiµnÝ%ë’¤«Š¦¨^¯§a–6²wwátaê<Ô2`ÉGv•Ûu>uþüùJÅÛ•~©ö/\ïS¨jU«Ú¿Ù/ÓØ¨®+ÿ¬TJ[žåm÷m³Ù1e‹HDJšPL›4­‰…±Â 1Þf3c=Æ1›”4mº©š¤P©ŠEêb  ¥R¨¢TUTPÕÒ4ÆãyïÞû¶›‚Á¦çÙV~ñD~ÌÑ‘l?½7~ç̽÷ûN=΢OF§Ùù˜»5{c¦6ï)ÞxgZ*ž’‘ ]H\¥JªÈûbŠâÅë•×~Ö¡[¥òÇ®5j’~8-Ä`# ¸ïÚp¯’knIŸžšxPâ: !€ ÐÄ»¾xgÒ㣙ÆzܶróJ$ Ü1qƲâ¶ÓW¼g½OШ‘ÃDsì„û'õÞmßZ Ý™/ŽÝs·Þœ§mû%F€P^ s,lމkyIºc + ¾zEiGdET‡¢¼b„F^޲bÈϬÕŒ±‚*ŠàÛð°ÔúÍØîÑC‡žxéÅ-¯þ´íô™½ïÐ71©;I.ÃÜo൩&yèñŒ"FW­Ây5×JÙ4An“ö#Ž+IÛ€æ»vªÛ¡úˆ…™ô°iŽRtȈY¸h@|m^áάEºknžêyäŠÑ÷¿™‘ññÁ‹µ}çqh5˜aÏÁˆâoˆ Êc¤Bÿ¦M-«U),ó ½ûWWiÉ5KÉÞGd¤¢W*}E×»ë¹Ë—rp¿$øEayTD+U•ˆ_¡°áµ‘Ð{ç Ž’…íP«eôJÊû®íÌüJðìCkŠS³{ª6¤O ƒ{PU³H¨æ Tô,< åÀ¢‚GÀâ ¡|£’5¬Á«•Âo´mÚð P¡í"Ϩ(&"?â$ŲéÔ¿¯|xûö ð9ÏL7þÂ~‡¸57W·‘zÔ£÷=¼³h~P‚‰iñ€š…c ´äöë3ÿ+_Hñ /ra8ÜË+œŒ|(ÄsmkÞyg_Ù vÆRצŽÖ¤Ç¸g, °úýv†{–5Nm U÷QPÒUu qÏÇpÁµ‡ X×€8@O°2 ,KÕÉF‰ž2±6å–ŒÉ XŠEÓŽ•%FoÍÍÂï€!‹d±ÝCHÕ‹–£µoý’Ĉ$þüÄ3w­¬µo{Ha#¢,³ôXÓÂò%–«{Ç”Y¿lÙౌˆó#žSeE’YŽ÷ñbPRƒ‚œÄE†SxYö±Ìа¬FPù嘋pb Pɳ µ!E^Õ~æéG’½›~êõ×¶Ÿÿãó—ÿ‘Åz¡êh& [OZå´s´’1ô´U¨‘‚k¦ðS.’JÁ‚?møúLz]ÄH@QMAmª}"à $¾^½÷朗ÓYÆ»Íj²‚5ÛNLV2ÿ¼4ZÊ#Ì}A 0žbñ¢äWåe¿ýMû´s´<_ÛĈHRuìÜî2Ö09@-í'?ìPXUѺfÿ™3`=üçJ>“zTd%…÷íÙX_« ‚½œzs×É“­Ø<|•Š’3‰Ÿ£f¿í–Ê$ñö»mÛ·>åÂ!N ‰QáÁA5e1’Éd>úïåÙÛ  Bû}a™™™©ÛH=êQOWÌÎÝš¹éVs·?¿¢eCœ"‰Œ„||‹‰«c<Ú±­ùwc»&,¦ý„ éFÆvú°‘‚£’Ò$¨ÆqР0pù¾kÃ=J˜gM³¯Ré¬V»‰0ÃârÊ$@@(xQ™Lz”c.‚¤áJrÊ´Œ­hh í%ú°ƒR=aLv9´ Gh—y-_Ö=ÇÃvß±ãm|ÉáãÇ6ß­÷§FvGÛÃ2B‚/"ùOåþ$x¥;xÇܱEêhÛ[¤m-¡§¾^ãÃAØ/Ä8Iñ±JÖFÌ3’„ˆKl“"DEN@<#‚K‰"hÇ…– ³|„“Ԁ؄b6 *aFåPnkl[6¯Û»÷ÑcGŸ|ëÔ³.v«Ÿšy{ Lƒ–8FÆK3gÓ{sqúXœAêQzÔãSÓÓÓÞùcʱìï½üݦfQ@>²€Y0*ÊüÒöÖ5gÇv•ö=l$F9˜ìHe7ÇÉI˜4í!\ŸÿÚpÒ ÆÇÿþ·5J Ъç«V8µ)¼†Ø6ð 4WJX× EÀb$ˆž±ÍŒEºÙ d4‚eä¯U‹\u‰Yºð^þ­7üê»ÿú~÷È‘–º\áƒ=ïšMÑô®­ë ±b•Ü05ÖìþI©m¸~úÎyó´ïÖ™×O/½~vÉõsŸ«þ~‰{æó×þì+Ÿ•?8¹ìÜ÷—þáöÔ(ÿã^ßKû#+Ú¶HO?¡¬Žú#"# b0ÀH!•– ¢Â aËåxÅlj¼ ÈŠªðälDnT¹Ì ã £b>ûµ¯6õ|üÈ _?õö®/¥*FήåuœK^šÁ: ŸÐU‹¦0É 3`›C¶Y„Eh‘,0ÇIÿŸýrâºâø‡ª Äxmïkvç½Ûø 4 P+(`"žE`¡`cãÇz×ëµ×kc †„”W’Ví—V¥Ú¦©ª*öîúER*šV¢j*¥EiHÒ°;¯;wf½Øø==ùÈG¿øèh_3º{ÏÜsÎÿwD¡ÙLN’¤f¤@Šv›Ç!Æ$©GR `½GÕN J’ᆳ™ñNMïŒ#^SÉörÆí«Xa?ÕU=:¼éÁý»*YÊE‘ì`âБ–êÄJ Rß$‰|·ÔE[uµI‚7>ÐN«—å+J‹_<°Þã*XYh9×WõÉgõÙɰ„%©1›m‡ÚÝèJTŽ"¥a"{îŸw J7¢k&í㈘#¹ ( )X:Rç  [ 5d²2jMŽعÝçu³A’ K2´ËÇÑ>ÊM^üÑ1-ä!ŠLMM-hûY´E[´E3fffÌ·‚dåòÅK++*I§ XÄ c®ÓÉ8œ^—íÀžŠø@­¬Å@[Eñôö±±ôs1ã[»ªAvÑׯm½ôš02À…'‡'á·>éܱÕWÊå6]=6vB†ÀM&A­ w0ÚJ|.bHG y¢tkM’QqŸ$Ÿ’Qœé¾#ý03ÐPTLµ"­%%žîŽ®/ò/+"i*‡,ãɽ;7Q¤!÷|ÿ±… 6Ø^IÑ~@…"aô“óCysï~ÃH.´gmá²rÖêsÙVðå°ŒŸ ýn¶˜õq.š£X†d(Šò±•”Ãç¶q<åó3¼Ûž[è±ï¨þnW´ê?ß÷ÁßÛ¾LB™^GE© øDÖë%í¸¤Ö‰¨²2 >dã½lnMÇ&7tlæ*ð ü¢ :M (Jì«»A=ÛšÉCñ1Q8©kYªL6T”-åùå^—Ÿ·Ú„»1Uíi9^EÛy/Ï\¾¼Q–»îuˆJSbäË?Mºˆò2 ¥añWš[ü^žpuQžBÊYìb§µ„cw½àPŸz/’béT7œ¾žiJ}Ù¨©!]¯ƒûÛ¶®öç_=[ýßÿ„20ˆ€AIka€1Ô$|Êê1Ui•¥À- aH6pAâLgÿáš]U+h?ï¶ù7e/" )/-{ãÊëMŸŸ›žž^è&´h‹¶h‹öÀæ©û“—.\,+)åYŽv‘†ó10œ2Å¿oGy2yED¥f7ÍÓB½EHÕC?ÌfzÓ©€®·Âç‡nª’‰"²Ô6–‰.86:ý³Ÿܽ“Þ³‡Û±‹|ë7ûR©^Ç0¥„ÎX¬Š§l.»½ä L¡ÛÑáxèFÒfI"g6±t¶ÿ)“U®Ù§ã¹ÓùSqÛì°{*é4’£¿Àè·qÂHšW?ÜO|k2NŒØf®Q÷†I%Îÿã§Ö÷^u¼Õ²$ü"õÒVûÆRK™ÏØ<|–flœ›àIÒËzX·‡&<,åe)žgxŽvó É‘¶ÒBÇö­E‘ ¿ºZsý/!Q9£¨'‘ÁôVMmÅJX#p4æé n`$vŒõ )„ä€"E!iU܈p-Ü «}ppX"t4]’bX9‘ÁÍŽ|üiðµ+›k~°²7¼U úï„<¤“¡,kËžë;³ùúš·ß9¸i³×ÃñP;ÍÇ× Tw÷ÎÎG:y¿ßÕÔ²*Ùß~*¼JÌUPìgÉ«¿® ¶®Þ[½&Þò¯×"­¶)ûI áæúÕ”m‰—¶þøâºÔn]M ÂñAP_µÀWY©WÕ€Yw"`IÏd9Š!dÂÙà@|ÿ®m¥~Ò ëÀ îóxÝ„ êýÍ×ßÐTãò²d!íôsN*ØX•ÚðXãíÛç‹Å“óƒË² ËTœ™´=Ò'F—M çL LÚ'“Nøef¸`fÈ2;êçÍŒØÇÏL¿—7>´4;¸dbä©ñÁXpfÔ:>°ln$z0w&a™*˜OZLʽ_j¼o[¦¯9'ís Âü—+&þyÕöî+ä¥cî¶-öëŠý´Å?ÚÅRNŽ&ÚNÓVÊíeå&I—H®ò.ÂG‘Ïs{·­:ú…‘ä±/> k¨¸KAµ¡AUƒfº*El˨M ©(lJ¿Ò¦«@ QElÇ(€q½¦¶ bgº%Ô ·‰/#1ªh¡ôXgJî•P£†¢š~Tz›6xY MäzÝ^?YD‘4C;+ýÎ[Æt=|ù¶lérg­3úd¥CW[ª`ŠãÆâ¥ÞN—0\¥Ÿøë¬\’Ä^Y=¡â¾[9X0¬7RŽ„Wˆh±Ú…fV™ÖÄõöË<6Šó ãý³)˜Ã×ÎìÜ3;ëkM ¸qe®”v( W!lÀ·w}íú&Žc¨…FJT@´•ˆBMÀàR””4‡”6@H›6iÛ;3ß\»K Ø»ëí;kUjµâ*´^Ùß®-ûý¾ïy~¯ì¯h/šZB'pãê‘컥{4Ùc Åߤh^=ØÙÛ[ºnM.Ün¸ã,I3- ܆-˜7¿§§çA›PB %ô°)Fc±{uïe,l}›ˆŒÅ&ÂÑqk GÞï⼂<'YÊNá¸ÀpE9hûÚÂe¿{ÍðM7ÌYü†G­æ¬x=x¸ŸÒT0ø9R<Ó«ÈnMm[Lë2]nו.È,U­Š»}fVÂ' ›Û!ÅÉ««ûd½B3}`òW>Û8ðvᵿU©FU X!©•—.ù~~ì鿦›ž~2“°¹(!ƒÈ¨”ÓʨbèÝ<agYrV.Ùµ{Õk¯ü ; ÐÁQ=onðk%§~½•O8ζjqŽa¶jZ¥iT#e÷ê¥.{:Î;ÉË—‹U³ ÚÓP3l‡¦U[1ªþÏŸÒ<ë×ä34ï †¡"ýx¤/9ÚŸíKû¿ªÈ…é¡séWÛz÷°ûKù­K¨Å³¸8«¬`"¼H;X‚cáEŒfvÏáJq1‡aV,:½ OŸØrùj‰„‚AÀE·¡Ö4ÊJ#R}£rky5;X©+¥8-(·iJ}@o44B•Öç¬7#åyEêÖQð¶Å0šÞšmC×½‡¸f¹’ Æc¹t>ŸF<µˆ|çb%`€µ,šÇSd:o_{u üÍk»y<;“s°¾e㬦Úå»hžL†)`åÒ,hIµ`‹ßh¹p©¸t{^]IþÐÀ$hO‡YÀh€c kCõiÈk°á‹·"W«¨>ÞáÞ÷sgwýø™9fIA`)šÄYÆš? òç¿ÿ‡÷bààqË£ˆ…àå¤&âºg, %”PB߬è¿Udbb<W»;nAÉÄíXlô“«m{v‰ñÅ2 ~î#fR‹fœ9»óòŠÜ v˜ºE#ñ‡ùÑ£"÷ljû,€ ( Yª1tëé¹V•‚jM©Õä&ëw¬ˆo‡¬Wýõ£ÁNi¤À ß6PwjJûí;õŸ~¾ýÔ›?Ý»åØ‘BøÑïÞÚ&â6'Í$–%¤Qé8mŸ"Øs&ùÀ¡gº[AÞÊÒb„o]ü°VÒ:åÅ7N­X‚ÆœÏmž+«û^|"“³“¶¹ÝÍÛUµM×ʳ©±ze6ŸKbâ[ƒ[µ&¨ ­*²ø"IGu+Lœ™ëK÷ΈÚÂç±Ð¹Ô@¿M95ãüAü•êäòå©KrpNgâl6EdàI ËÙ)ÚNZ!+/¤q\*ÏœPP0»¢ø‰ã‡×~öq±¦Tªz½jv*þ:µ¨r‡¨ˆE5ÝÀ¦Ö¤+>(C³’!Ø÷R‹XÔ&ÀW¸À´´@á»ûHþòyç‘cEÏw.èîZúúñMW®¸Í[È|®p‡HÛi›½`ö£þ´ÙT»`û:š—q´@áS7o˜#£—dÿÁ“'wðTŠÀ ™ç÷wÝí÷Ë•íùï|X6"u›šè`#ðUÕˆtÔ¤ÖP AWjâg&…zh3´§÷ëö]òw›®Óg6­È¡R ž`œËRÁ‘Â1äÚ¢¼û§˜5©ŒÆ'–XdÐÄB‘I{øI8šà‘„Jè¿Uä_‘˜E#±á!©µÙK)¤pÐÙP0µ9HjÑ÷Ø£‡·êú^5PºS á ž¦*À! †“F!þÀqâ>K‘Ý%àÞ@#°˜4së+òªJeÐð†ÌVÉ_ fj/¨JÓ]³Y‚ j1B ºÙ:2Ü~Kß««%þ›žsýëyœÒë çèBÝ">3Ö;?_Xµú±Òª•¢ÃÉRvùö‰“*Ñ _^vGd1tú ÝEkЍ>•裸ilšÓž—Ëq2òüòèZΞΉS —qšÑ¡ ]ªZ!ùÛvm-à‰4žMùÍëŪڂP9<‹Š€¬¬Ä4õÚ‡•Fîž]õ&MôMõM‹õN‰õ%ÅN?26 Žö¥ß¹0õ«‹I×O¥ ¢÷•sÅË쮬Ù"›ÉS"Gòµ"ÍepœH‘âXó †Ó+K–ç´u|ÿDÏÚ/‡J^­ëCóMë#µA’öêtÕ˜g¨: ª˜DYÓhŒ_¯Ø‹ ƒM7¤s´MBuŠZ«µ’T zªÊç9V$¹š²| ̺!£Ü5{ªC¤6é·=¥B3ꎿ±J0šV/Î Žú†GjOö<+ßÉâf”lÎRõvÍlQZ‡¯¬‚†á "¹Ä0ܦY-A‡Nð/dÉŒúµ4Ú&Éõ$~µé¿*\²ÐaŸ‰Áõ§p’¡hcy–ñz½7®ßßð€)&<6>é$á0`ˆÅ!ãÿô–„J(¡oнA¬ã“Dc·õ€~à'?›åú.QNÞá`ÆÎ;Çœœ™/¿¼ÌZÀ*e©Êr`Tq eÍY†/>pÕMÖljû/¨É@‰ AËÛ€Á t±K ”!Í­Í**7‚ÕÀiËçÑ©Â\WêÑW7izù-cÏ?òd1.ËÎaí~¹J5ªv|ñ÷ ÉhüëHÛÒ•MRœ=¸oƒ"a‡MÏbgqWŽ(fqÉ|Š#‹ä¤mSѶmv^ÿÒ{ퟓÁ\pP¶ÃGÖIZ§ÜwàÀ“™ìL:Í !ûRûª€¹Ç4kâÍ×AÃj ˜5+Œ¦‡ÏÛîö§ `cýöÑ>ìÎ9zŽˆ &ÅúùûåÛÔyÆqi_P‹'>7Ÿ‹o¹ÑPJa\  B‚€MrÁN‚ã$vb'\Ê¥D¡jÖJh[Ñb—¦±K©`2ÊÊÚŽ4”*øøÜãÛ‰÷8l|cûÐh(^½>::~ßó>ÏÿùýãWâ} ¢W2¢Ÿë¢=úȧÚHל{çæþÑ“ÙV¢ÐÅM¸™À̸D1#Aä“d!‰™Œ4£cÛß¶ùõ³Åׯü$8T; ìÍ{UáÏ¶Š¼[U\ªÚÀóv.Y.Eðœçë õ'QPj…D¾…îÏó­"Ð;|XΑ,Ñ+ÛåЉƒÖ˜Ór}ÿuÈ™Ãì¾sŸìAIk6ª]ýFl‘C^ø—½{^#I-™<ŽU!©†Ý[Wä$“QxصA‘<÷¼‡éÖW6Vuˆê»¶ªr£"ÖKR½ $áòAà\ð$,Öü¼sWeÚX«7Ôǿز8194AšhE´˜[XXtæÌy44’SÓ“O&ž* 0É‹ÑµÙ˜Ùø?ŒgŠ&} `É… Ÿ-ÿáj „fÀ™×eXiÝ{'× Ü?$È-,_V.,º#r›8 ЕtR3(úò+‰3ãÅãÄ÷tŠèã3Xö¶ zÉ0·;<^ªF¸Zž?vùÒöŽ÷Þ<{ºäŸCÎK—J“™C:Ã0$†å0Y—~¿ƒg+9±© Gof£ýK¿è…ê%y$t¨\N#Œ £öî\"°‡Gåý"çUÇÜ„1c¡³ËËVüúº¾/öÝtþížm`°Y³ƒ•"w¸lË«£p+CâV3žÃP&p­n¡ pL×Þ¸:¬¾Çq5p"ÀŠ¡`£ÀÂ1Õ½¬4÷Í›òÏùçMRcÝ©ÑîôXŸ&Ú«û2£¾¬©nl*@Ä»²]Ú„/-á[è¶Ä:3's£W燿Р^¦|ÇÑÓ;çü¸È²„Dr³À?%0% M1ƒ”Ñ€ZˆùEù¶}Ë.þ¦üÁ· »BB3Ç7‘ÊŠ ’„ç û¾o$¿!ÉLuÔCsøƒŠÜ(ÂUrªR³*¹Ã’Wæ=Ã!Ï0çºü»í’\#ñ6)lÛV²A’êÄ‘REh=w¿i2ãFјòþݺ ×põF%Ẽü) ‘/oïåDÛ©ãÛLørIÜ^µÎß[ÎKnE9Ä ÕaµX€DUš8pÚ Eªü:åmaÙ£Šm?²ä”åv–õ<¬÷Hñ«ùóLD6`‰‰´â(|&råÊ•—.þ6ý›I‰‰‰$“<ó8³1³1Ï‹g¢1==Ýßß¿sçNš2X²©Ud*‡ÒØ«—üõöaI­ñõУÁ J|“$8ø`mXájù±…+È/Ì_Å+Þ$“H® ÅV¡Ñ8¤ðé›·lç/¬8»y]a®¢³0+š“—C®Xa¥IM^Æ …[HÜøÖšÜqÕ.6W”/&-¥Ç>ùå.Aðp’ƒ—ì¾_ž‹,4#HñZËàw@;õªp Ä5KáÆÓ›¨LÜHdlÝ\ô탦GBë­ow¿³iÑò×É_}´G`a‡¶¬[µÃçSe¢ŒH–ÖlšóÑǵf2ÃJ¡{vh>lˆDœªÒ[€f4¦âXûËJ#ÝÑnM´;3Þ5åËŽwé§»0»µ“í”/#Ñ™>õiJ´+ žëÓLwkãþ´©@zÌ—2Ñ97î_èÓ$z4ñÞ”¡‹s»ÞO;T…nXŽ[)4d¡,Ãô¥L(ÅÀOœÐÒ´¶¢´àg”}u§iDprruHª¤Iö@ Ìp *âi]ÀnÊ’MlŠÔ ‹ ìˆ ÎˆQ’m ášdb„ÜŠT󯫌Hª‘"LŒîö­•·‡Õ}'Ž­7è-£aÛ;…<[wÛkW›z×Úê…Š|BQ½­Î·Í¨.Ÿ2SYº2³¢ÌÒé«”c#CÞHø Ô+Š“5)R®(>—NU¡Ešy¶A9UÙ#ò..T'‡ë8Åõõ7ÍíËhš 31 xÓ3jÛÖÒ›×o$¦¦§bñ§L2K#³1³ñ¿c:^&6…‰,J­î°4IÑd–‘Bh\g1¤—•äwuÖŽF:x©N`Ý‘p³$Uñ\ +Y8šT-ðq"H®ÜÓ͉ 5ðœó…ãÄ÷²Ø #8ì)†íð\r°Ù]+(D›o2”l\e$Õ‚îÓcÄ—á:ìTÇVtýùºÝ Ke+ܽûeõÛ|òtŽë)=]W½˜ÜÐâ;{*Á`æÒLå•?ÝÜÏ+m„ÊÞ¾ÒþµC#5÷´mZ›—Ç1M¶™Jß°Öj¥iBG™qºÝYQ*_ÇŽ4 Žì?u²tGÉÒ-Åy{w/òù«”ˆëêµâ_ÇO?ñÄÖJcû9ÖVÚf€ÄÁóu3¸ ߢÊ"×>Ùâ…¦Èh+ 9„`“,×ñJ­¬x¥ `໣þ|Y‹k™*{SEñàÒ"€“BŸ~þÜöqáø;6 µPD‰è=墨d‚è>ÜÖ²®¨ÐbÐëf"õo½æÿÃ.‰;Êsõ’T u ïF2ynþ Í\Ð(A°A¥Cþól»¢8†ƒÿb¿Lc£8Ï8þ¡_z…#±×{Ì={Û`b Á€c§H7¦@iÚð®]Û»Þûë JÔ#­Ši5‚’¶!mlhTµ'‘‘"5r"nïîÌ;ï»6¸^ïîô\¥Í‡HHMb¥Ú¿Fï®F3óÎó~7{ß<ðÃ:§Ó¬'ô:3a$M¸…fõº’®PX‘dFòómqTÐWAùlnÎ1~}¢|ÉR'XD"IéÍ †U­Æ¶s°Ê­Zvƒí)>¤p~hQ$m(#߃rXÃÈlàý„FP¡Ù=™ŽÌ;Nü%ð¡Kì=ÿ—º‰E¡i‚žÕ‘cµ,n ôvš0T®1>û‹Çv7,#0Kì¤îƒ÷‘{7‹\`ßVѦÅ$VzêD"„׆Ÿ`X#cp>ºÁÆqÁk×[œc‰4šê+[Ü›7铤öϤÑ¥Ý<ˆjÑCC©6TèžÅdèV:ŠžˆÍI!rꕆê¬cKÒèE@‚B ò“ß œTsy¤ùö¹‚ *h”Ïÿ§ýgggçVT9m%—ŸÎ«“9u*«ÞΩè×é·Ï_xdý†4&Š&X3mÇ4ƒÛ̘}G]™ ÷AÅ@ ŠQóŽw;=ã)1&ñ½’Ð'ŠÝœàR;/¶Ê²Kà$¨ù?ŸŽ¼wÑýîØA‘÷ R ‰ë´HéæŒ‡=Õ‹.~îOû˜ƒƒvÒ%ì[oíJríPŠV¯XŠà„5ÒgÏÉv?Þ¦A ½ ©© aÛÕ+VÌ@ÓKHË=IphJh¤1Œ™Bo‘ Î’¤©¤ÄF±ë×~-~í§ŠÒŸ.to~ØôÒÀ÷ÚôÆë5LÉh:„îl‡Oc ñ3³íçö>¿"4òEW~„B “úÖÌ™Eñß“oc=;t–}!1ÇHR£± â£h=f4¯®r¶‡«Î½]Ï)~4÷Ó 4ïAHŸ‚a †y„÷©˜,vÁdgš°‡"F™hx=²Ô* nžëæœö\½üùñ­›j‡:èÿX^VNጙԟ<±¦Zâ|ì£ ÿó/=îö¬s:X s0$C“: 7.u.I^@°Ÿãš¥´ˆ> X!MÄ8¾S‘b¨;’7]iÉ/䤀÷‹ C;¡I–‚"ß“QIð)Ð/ m€w¡G’=¢âùørÃÑÃÕËœVʨ#Œ¸™t PCÓÅ©»ð>Ê;¹lg¦o«ùÙ;õoKúĬ2™ÌÜI.—ûÒ]³ ‚ úœ5‡êõøÜb>:µ¿vÈfÔܬVieÆÛêahC‘„´2f°˜Æî-µ°4î$ñ"3®;yr[œo†0†fÞyÇŒ»¬É´ .À”e xà“å^.Ù¼Tæ»RððØ»»jª¨2¦|ïÎj9u .Ô§'£\Ò“žÜlù£ñ®­[œ ¶+…9 +Yb$1Cå*ã…wê'ŧ'’ÞR¶˜2àVÜúç¿î ŒÂl«» #3NéÛ¤¤Zy®õô”2–fZ½üæÍ¨,·}¯¦œ%W˜ŒØèHÓ4ôíØVi7“ú¢%óÃÕåMîŸÿ壃#{ñH:ÝýF³œêLp-ß@D½\—VbE’ñv(øQJ‹«ùrjzÈ”2¨Ã:õÌ}ê¨.3jHb`”xç$ydϽ-Åez›·kd‚XŒ²Q˜ÅHØ æRŒ©ª "þª c ¡pAvBÙ dWü$!ì—§Ú9¡ÈûÄT“,wˆB‚0ä"(bPR<4ǹƒ@Êâ37¯¾zÅ¥Žß¾¼+*¡õ¥ëjh õƹ¶Ú VB¯·±:¼˜²áevg dѾ'V¾úêNYôB1 o°`ÚdZ·ÞüäÑ-ã×£@jãAuÇ-%&$|ß=•Š¡$Ã2ìEÐ25ºyíÈ!Asƒk“!2ú!CÌ,§;îÙ¿]ò4ì­pЮ30Em,é Hßש(Šæ>Z!2QósõéÜ„433óåZfAôÅ*›Í~:bLg2·çhDÍjÑäw§þXQ¾‚¡YÌ€¡ÜÄ%”¾dÝêåC§õ²N“EVÂñÝ5ì•ëAÀ{RbòîyÇŒ»ž({*á;á®…8Qð*RŠ™Š8— _ü{½ÃŒaz‹…Ò__›è}åe—”j…b#ÏGwÖ®´`4CÐËd,RôÖ®©Àí Aš<öƒû´?}Ë·uS…³±Ë /n”Ä#h^¿øÂV ³³”m{m%/5*©¨$?i5ᄎ´˜ô/ºS“îV×J3À¦ø¹£›¤±_æ±Q\w¯D[%!Û¬w×3;;×¾0®@‚JBb(I›©!6¶×çÞ^/6ÆØ4…ˆ¨ miKh”&iIƒ öúàHÛD"QcA$T*Øžó͵kp}nkG(òO@­ö§§Ñ›·z£Ùy¿ß÷÷ùö7½óöŽÃ¯­Å¶ßhEú^¤F%¥AVÃñD­ x3âF”¬SO×}ŠZ©ÈèS²Jñ•Ú4"K>ù»§Ä4|C#=3F»ïŸŒÍN¾oJž˜“<™™ìÌHvgŒÄfŽyðæ¹9WÞ"×Ù~¾ _h§ÝV·¶S$MbŒÏ-bŠœ9´³­^ºèà> |3¨®4BºJȤ Ò`¿,Ö!æ5ÊbÀ$úUÕûTµ^kÎt–þ¬8wÁ\sû¾U¢<öú¦B†dÖm³ç‘¶ë ÷6­:+ú÷©RJJ8n„ß=^B›ñ\¶€elÎäÏÿá™Þ2Y2iPå†ü(~^*Gò+šÞ6(ÖÈj yF³†"4P£¦øS¯Í×CúÃÞ~® ˜\’ÃN[W/£]¶Ü|ÖeË13öŠ²Ï›WðÖÛÇ@ˆÆÆ†AFÀMéÉèèè´HMKÖ·T:Ò‘Žÿѹí2&§bºÀ§dž†ôääĵ¯¾Þ¶e+¨I˜HÜÉÒŒ“$Ð/¶ýt€kCJøúuÿò•]Àà4‹Ñí­?_Ww'@¯î5fÜá¿–r—¨Ì ®!€ø *†ùÁ ¦‚Å«¥–5« ÆX–þñ—ƒøA‘¡¯^DáOÎûÜ8Ë`Υˉk×9ª)Mü½Äa#Âí¶Ñ~¸ƒã<ûÛ7æÒnEy* e9ªh¡¾¾j&׆c&7…ñ( ‹¼zî©ÕsiÖÍ>qüiàŠžXé_þº­ïó  ªv òµHöWÀU|"ç5Tp !$…§º Àƒð¦|¨†Ÿ`V€-p…½i¹;c²Ë2Ö•=ÒeíÎë1u[F:¬#'­£=90™8••ìúþäß¾§Ÿ{èüQü÷ÄšùÎù´ÍIP9…ÛY;CÚ왬#ƒµYs‰ì «\oþf w-|S ª’ Ñ8jF|H‘ÂCÆ.8ež«P‡#&QåfMi”å:ŽÛ ‰ah»uä“ÿ½SÿÍexiõb8„Ä 357>uñr÷§2Mo’¸j™óÝD»e. qás§·_½ê;þîæUKX—ÕùpîœÏ.UÊÚN¤xDT%*åŸ]®Y”Ÿuäw›µYjàø°*J”â *Kñ <¤hÆ0‚ŠX'à%=º¯}É‚|3‹±¬ RÆÆÒ`qÌ[¶núò«‹Éá‰äÈÈøðm™«{¦›éHG:¾ƒø6„ܾONþð+÷ÑÁ’ nšt…aÏ=½ðó/ÂJ¼ZÖ*Áï 1ðÛc(«Ãi§„Ëm·\ºÓ«÷3îp€r‚\ƒB‚˜s7‚:ŠÞL„*qwyõrù”¬[G[ I0 E0¹I™²^{u32ªÚ[žpà& ËÝûòèõqX!k¾¿XI™uѳÙsúìVkV†“!×þh./UÃ'zdù\ÆnwáDo÷vI‚©üÓÅí»Wœîª¹Ñ_£ë¤D8T/è5 µÉ冿›²œíN­ˆ**3Ôvè>ž ×Åã)ü(R¤=†Þ˜š§þã7(¢*Aè i¹K4ÒALÆrF{³nõÎê½o¨ç‘žÌñëd¯u¼Û<Þm13÷dMöÌÝ—ü óÊ뙇‚æÇV™H†3.NP˜™ pààTš±ÚìyaÙÉ÷JdÔªi~] Šôz€Ì†ÔYk!²hê‡ã†Ö¯«Q$5òMðAâ Q%þúËÐGJ6=I¸HÆEc”%a¡«­õ±Ë_„øZÕ¨×О?¿³­ôùÂÊçW~uÃ…¾²ÄPslj’ “‡Q¿l]¯Å›8!Ò{VQ—lYÊb$ƒ›‚ùýý{´W’ªxf„xä<„[Y®ŠÇÀØHܥȄj•Áà-µIâSÕ§^,+Û>×MØœ”Ëf!¤Ó–c+**:p`ßèäÐDòÔðð0x(˜LKÖmáJG:ÒñÓÕ 16ÉT'ÏŸ?ÿøk1k¶›)d±<î`0üÑ…ÔÙ³!Q sr¹ Wk® *†9´ë™â‡ÝKæXèGMÅ ^òŠ\ôžcÆMj=B<Þ :c ()!AÝ%£Ð'ÿ(Ϸر솦˜l†p‡ük>ú("ÊPbgÛž•n{¶ƒÌóEÖó‚¡j°¢²,¯|„¡h•ñ‡£Åºéçò'nr;Íóú>-UÄ]*òVV¬tÓ3ž-^Ü+•Ä:ÀøªŠÚ rûñ  AH}dE­På‘÷@‹¨PQ‚<ºV7¼†â×Q läš‚«,Õã =‹_:ø»R• IJùÓ4rWÆH×£Ý3ǺgugŽwš’ïg'OY’'sþÓ9ë֩̉N,ÙcOÆ,ã0Ï‚I¼3kòtF²÷þñއ®¿IþºžX· ›ÁIÚ6$À à¤Ãn#4]€ãøâ%…‘ðü?ñý’êååRI-WÕZQ¬sW”:M¯’ä ž«…´Ñ”FM éÜž h-œ\ ·Hô© oGgíæâ%N‚ryt6Oá--‹P"zèWKí³`Yû»Õ”ÇØ7?¹èåƒÏ¸ÀtäàûÛ7 Ò‹‡^Úâ°>øøÚÊjq“¹NbÖÉS/ÈJ³Š€½ÿºÖâ)/ª­-ºr9l$D¥R4Nr3ä¿,Ö&t¿&FU¡M•[- ¡úÿ²_®±Mgß—µl…8ñýØçb;‰sáZBéDPÔ()·B–{'Ží8@R ]™Jµ“¦iÕTi% ¹@-—uÓ¦ublZF !¾œsÞ÷=çØ&!±CΞ$Ûć!õ‚nò£GÖ9ÇÖñkŸ÷ùÿL:Ïõì_ó\ŽÒÙ-nœ¦ »ƒÍÛ´qóåËONN>(\SSSê\€züš™ªT¥êÑÖƒÉâ?C-Ëòá¶£ cq:²Ad,:M®ãéÎŽÍcAW0è‹Å:g=ÕÇ•€ö(Ä'Iî+ŸÔä°:ÚlÎd³¨ mOï)ê{â˜ñ%;*v‚6ÊÑýr¼öÓßW4¹V/sjVƒÓ±PÄ!ܸ¾Ð¹i]Ñê«‘æ(êÌû¤qïÈIñ~ßi5Ú,æü|ÛçcÕ²|„<#·]Krò8Ö˜Å>ûsólߺŠ2é]>üõÆÐ­@\982R 6+è‡DôÎý™GÒ i°´LD!Í1|Hºq蘂˜´ˆÈ ¯ `’àÞ“PG¿)Kà85|¸fö󲇄+%R Žú (L2Ï!TS4òxzæ‚)ÙoHôè“gjYí5ÌÉ¢© O¢~¨=éɳ ’ý Cú‰AZíËMüÆ’ìÕÍ\Șè_<ÞoP>bFN§|[Ÿ½ +mQ6ÃŒ‹lÙše­¦|§C»e“å—ï¿âÛ1ñÃSž}Ü¢‹ :Œª±X+¡& 5Ã$VI¨*6Q;Ê—GPM\ñËb30mÕ¡˜{øÒÎ&WAm̶èß?³åN¤«Ð¹ÄJ­°XŒ¯ï.¬®ZS²r™EgÌϱY 9NFÿ«¶†qË÷¾«wNÖÎÑ&‹‰n¨.I7Qx¾¨£±öyΘcg³ëËóoݪ—¢uEùßt}7æÝë`3 á­@TñaRqóow½¹!“ý|[6“Ké8Öê`¬tww·(Šê\nRˆQ©JUªþ?jžIæiäêÕ«%%%”•æ8†ch«‰bÌe¯œ¿X)Ľ"qñ!W\>„"ÍbÄöG+娯êÀ :ßlÔesK6oXRö=qÌø’øê¨ì!BÇéS[ œ:JcÍæ ,F{ÙöÒÑP3°ÁíÏ›Âb кÞnæ²èÅu•ÅA²O’[Á/ mϯ´qf=Ke®}6³ëÈúÃÍ‹–jÌ8˲ݻ‹CÄ=.{@ÿò‹ '^<;¸Ì:&·¡j&©—xÀƒ=vC`„`‹×AªÅ¤Šð'ñ yâRmœÑQr‹Rƒ@\Xr¹‘ˆ“€…32öÏb!j†§7Ÿ¿ÆD°‰.‰x@ç nx8mJÑÈãéÉþ´ä@úÌ :1°øÞÀ¢ñ!Íøp†Ú§>§2›à4y!]ЪeDÏ?^4Ý—¦öêf»OsXswhaòâ;Ý@[uVZKs‹5“£ó``lúeßé9óŠt`Ù'`/ . y±àV”&Yò»~ÀF¥v,´‰v´óíwq *]»’eÌ“.×a§(&Ÿ5e´Ô¬Šâ!ì¿5ÖÔP»¼bgÉë{#á @èˆè ó9æ ?xØþ‰ã#ˆo”åÆ0ïçÒ‚¥Ï0E›ò2´Ùh²1Yí‡Úc±ØtMM€šÍÌ©Ü\ÍêÛÌL2…)©JÕW²æg3‘H¨Éü'gaåwŸ^Z]\”É:Yг˜5ÚB›4åûНþÖÅ“€ @œñƒ8<Ô€„VLÚOÿtgdhDzúeEé_Ül îF\˜oÁ÷±[DÞGåzŠØ*‹ÍB¢_ ,TDï6bäÁ¨HÁ1H…Ý(ÜŠø„jgePpÍBÞ%£V"ø0ñ_ÿãÛÇ:_Z[¼x,XXrêÝõN.“â4¶–†£³7:ÿʹ¾ruÈJU\öc'^(.àš6jßûñ¦päàµOvŽü}·ó\úؽí•å6Æzé´éW­Ð¿ÕõrðÎq"½ñÄñ E#ÿµÕa3F²/ý_ËÒƒïß2¨½ZÞHWÏkQ&ûÓ“ƒÆD?õOöË5¶©ó㟶 )I|=÷sìcÇ„,\B)0ZÚ­»”A;ZtaÜ’%Nì8N|Ã$ Sµ±®›6ÑN´hVÑ®@ì$Uë@SWZT(S×’¹øÜÞsu ±“Ø{ Õ>í R¶ÉŽ,ûÈ:ï«£÷yþ¿g®ö™íG§’ÈL¯9ß»(?Xž¹€¦ÎŸ¼AvÖyc8­e4…`”…"PŠ{lB“kWUüúg›¹Û¢Ü´öq#¬ŒîÀ¢#ŠÔÍó^Hãªêƒ–)À‰º_•ã¢)½E|iõ(dïuµ´ÓF16··8ˆA2[鬸y+¨(~ö=¸–±™YªbÅ2ËàŸýuõ5+«°\\¿Ò±qƒó­ÓÍs|P‘‚† ñ\D ‡x¡3î™íü¨R´í¸ÑÅñ@=úÁåøŽmK|nÇXÊE¢2Ö?u鯉|Þ€M*?“ûwÖ}‘r÷BonÒ¶¨¢Šš]Ж™L&—+x¶À!ù{þÍîOd2áPŒ!<AâØ3»‰êšJËïOl képjó¢+I ÎJr2€"ÿdhØÿä:ÊExHÂF`hwè;ªç¹–´Þ) ?Ö@V0˜Ekê¹A“*ÂAøX͈ ó­WÿÞöóãÏ55¬ÚñBe ©¦ï\}!lµEõÂb‘ †­a€¤ðºZ»›$X¼â•_Õðݯ܈ÚÊi‡ %¬V^E±nÂê&™Õµ–+W[Di». Ö; ‰NÒ¶ñ‰'Üö…¯¼´‰KPî„RúÞ¡[±sÉMW®5J {4Õ¡¨1M ³¿·ÿ×ë…F2ý &’ ¦úʧû-¹>ëtœ9[:ÓkšH”d’d’ 'ó'’ó—¾0oâ½’9£‘ _™€«[fΘ ¤ÔgÊ÷•æÎ.0þ„€sU§»Ø¬([lC„w°(]ÉÞ:BàÖ勱hóºkkII¡a£G"†‡ì!Š^Mi/À9ߦÉá‚+Ũ  \G:âùFhv]é¹1Üø›—·ìܺ¾¡þ›ßZ[½„ð¸qìHO¬…Æ8ï­ÛÍ5•8ƒVã6¢»ëQM pÒ¯oµÆ@ÓSnÔAY±Hx ¼ø®Ä„T› SøTÙŸÖƒc#³Òˆì‡ÝæÄ'Aò)ZœK~ëÍUnÔã,#ívá&1;‰‘ñh×ɱÜôÌÝêLNNÂÏìý +ª¨¢þ+5>>^°íLúwfjúÒûƒ«×¬!0ÖåXŒÙP7MV0¦úíz5zG?S‹ö†¾p@Q#¢º{¶ôà¸fô(3ôàÀù]”Íîf*H´Â…›.^òòÀ§>´ÉBTÚ <¬©Ç‹­@Ù ÷ cöÆ?}Ç~ºÆKh’r î"-_úã©]š“ä=p])uäóÏüöåçDàç%¯btœxu+j¡Ú±þ17/úôóàÊj+e_•,Vå²±JÓøb'ý­«EiŸ*Eß¿ôà8CÑ8ZRA „Ú±Ù-Iñ1a·Bp•´–$­0N)P`9aîñ H#¼îöÍŸ(›°Lö–Oõšà\²4ï ΃Ó?Ÿ´æÏâù3t>ÉμcÏõ"sµOHJÙ„5›Ä¦Ï“SØDÒ4™,T¾¯ 2I¦÷Ëïš.þky]æ" '‰¥4áp9Q†D¬å8˰uÛ–KÔ‹r+'øŽû˜*G),‹!EŒhj‡ÈwÈb\äú†§W[%1 H~ D ¤ÿ¡Øz·YÆ~õæpLb²ÜÔ80ÆAUÕ®Â5õ°!¶¨â! þðâE?,$'ôà{iJ¥¢ÂXØPâŠÔiÈ™Ic!MоÏr~$!9DQ›t£Eä[ ƤõĘ¡áPý¶8 ;i¥œåf±Õµk>ºüa!Öî%Ûý Ëf³s´EUÔƒ5}O_üÈå!‡@ÛþòÇ)Š°Û­¬Ã‰Xì J×T‘8ÕÀCãºð­’àÓ• .S!DiÖ.£w¡/ĪùÑö”Õå$=Œ|þYÐã#©ìB@SC@êxXSOO‡dµ“—oÞêÜüm'ƒ $BÑXuíÆ-eß}ÒÁ‡5ÈMº|¬»³¦ÒYâ°•|u“bxÇÄ}C£__Î"h)c§úúwÂÍòqØï]µõy&ÜpìÐ3Ñ®§mf¬Âå®ö ©TgúÎ.¼þÚæeKX§´òhÏ3CŸuir7¬–º|XÂ0luƒÜ+§ ‚ЬëmsŽEyà9$Ûg™L˜²I3îp‡S‰…ÙÄüL¿9ÛoÎ$L3 [æŒe¦ÿ™:o›«}æ“öé„i¢¯tb°l|°t¼ÿ‘»‹¦/”¥ûí“ý%ùþ…ù>Ëô¹ò©wÉ‘w*Oušk«ÌÂFÚÚI“¬¤,Œ¹|©•X·²ü“u¿^lSå8CÐ šæŸ,…•Ä P-ð~ †¡ý¡au­s,¸òQãÛ§¿7:¥Eßÿ5vu;^~âÔ‹@n0R^mìˆÀwlù†“tÓ˜së •7n{= è;q/Úá£Λփ×"óÁY…vUmãS͆½«wÜܧɭ²ãÛÞ~Ó·ÂC¸‰r5a&ÊE-¥2ŽÜt¹\nN㶨¢Šú‚2‚†ýðƒË›6~·£8B²4M#8‹{^\sc¨hí‚Ü ÊUñêjð‘B{RZ¾U•Ï–@içR~YlOžó]½bqŒ& ‘°¤Ýúú©-é;‡p¶]lXSO⢼ä•Õ—6>MQ6«‡Xþ/öË<6ŠëŽã=¢@À8>×{ÌÌÎÌÚ»>0ØBˆ8š4QB•†B Ŷ᰽¾ööîz}„@šÐª‡Z(¤•ŠšTåð¹^Ó”ÒB AQ@1ö̼c޵ÁfíÝéÛп*,5ª…êŸÞ¾?fõæ½yïý¾¿Ï·69k—9²ýð¡M]'6‹’+;e¹YølÏî–ÕŒ©¬ˆ.Ù°vÂA%îZêêVq6ž6øšV‘U=CõŸ~Ö(*.²‡~·É^XÀP¦-[ÊUµCª‹Ë@Ú-Ê­"ŸÒ8$Ám£c»ÀpX•käÔÂf~EÆÔN x1xhôõ¨´G…F½¦‰î|‚"ú)óT,¼7‡ðIjЫÞcÑOäL‰1ã'?_j4[ïÊÕ{rõÞ¹c§3U°õ9KyÁb{Þ"mfiƒ•+uÐ¥v »z9·ïíçÿqÓ©7 Â0ÆM5C@²¾%}|’GSC¤‡R}Ú’h>„%ˆ+®“Ç~±K‚eŒÙÁÚ­táÏ~MÍ?Ž#šRwjð”q®ÕRÌ›mœiÂJ›<êåŽoíyñ½£Û>þ¤†(Œw’§»?ij¨r«,µÇåv ¸Øxw´ zE±kÎ7ýÛ6--ei;C“‰x†åYný·_¹xá£4$&IÌ´ÜÎÆlÌÆƒã>‡þÐÁß,©¨$¦†¤°+à-ÌÒ2ö?ÿ@a¬º0ȸ+Q )¨¡zA|MAvb)4zÀ¥i$ø±YAAY ¾±û›v>×d2Ùm¥_[Å^»¶›ø)ŒÜi¶!ýCªz j¥·¨æèLµ˜3çþù¯©r›ýµ¨J&‚U²ìƸóã\kuØÊKiþòù‘8Uk;sÆm³˜i«•3¯_ Êr¼Õß­xºÒ´ºjY±ÙAþ-sϯe1„ÄF„‰—‡[âq¿«GÇ\DÌÉ,’ÝkER+B H‹§t;¤ÁvEŠÌ8ÌÒÈ[ª×˜ìÉKögO dÝíyr¢Ï”Ñ 5ÀÄ5ª0¤Žtˆ å i]Ân¢* N§Hõ¦ŽèÕÄvùÑwk8´bY1ËóñFÛÞ=Ï"µŽ¼J†-xVÕ‹£íHxs틼ã)*ç§û6Cáu ýãMñAѧÁynŠó›ªhŠu0¹¾5w´vYµŒ2æÛ˜Êû_"(rùr„7•rÏ0¥ÆÂëÊÎ^pÝN s«R‡¢Õ`q×¨Ü D'ù2#;eèÇR+Ä^¬x Ô!\§* q¥™Ð‹½3޳4òÀ¦wçé„4¢ ÑùãýÙ‰û(ÝíûÒÆ˜µÏXªøŒõ+ÙÆuê Äcl¢?c¦Ö9ÙKMôäLöÍÓc™ÉXîD4çN,óîéãì^ë½^ËT_V²N2:ï^Ö½¨!Õo˜ì&͘Š´hÆõcÔ/½ìó 4m⬠m¦m»*æ ÏTRÎk®\®†}šJì†A—"ûä"ň*·ÊØ¡ËÎtA„a¤9%)Œ5g‹ûeÖD| Wý½*xÞ9¼ÙΔ2Æ%K+¸KŸ¼ŠÐöÏ6”Y9–²óœ¥7ÑùŒÝ¼Äf¶.­üÊ•k­ÓÒˆDT‚,£˵»n¡)~e$H2Z“Ãd"v‚xàÂ¥ÈÆïTØÒS0Äa L²uK5p¦Ew6fãÿ;R„;’©¤žœ"þï–"¿‰¾ã•‹J(£¥¤¨ˆ1Ï·1yœÑqhÿrñv$®v#²ì&DA_¸z½ÂØ%I ªê…À­àðÈPË»Xc13Å«ÕH-_XqábkÈ˘BœéïÏ•~(óøÂ…Dþy£Éf1óT±Õh9ûa#üw°;­cRHSÚE±^F¬„öw½÷j•Ë1–ŠÅÙ7o´I# ß^÷B9Ox³måÓÌmißç¶F‚«vm«úÉž¯ÿýo„‘f¢Òd…i”"x&yþÕ\a‘äB³‚|’è&EJÁi÷ 6CÑ¥ÉA{d ù.E  VÁ ´!è#H© €†Û°ÔGQC A€ŒZÉÖ)jäö0q¾UI#9J [Ôö¨ÐˆFêïûéÝ™úÀçÁw)eõèœxoŽÞgë£S}O&2’Ç ÷¢™z×—õã¦ÔûóÆçèýùwNf /\Td¦Xš§m6Ê`³Òl‘Éa¶Pü ›ù` DîO¿?EöQƒæø_² èƒsf«þËöûHẊÇ#Ç•XÍ1E¬ÉaÉeÌoóÚ‹—vB¥V%§?Ô4}Hò!”¾öÊ¿Ø/ÓØ8Î2ŽÓ¨*mêâØÞkvfv޽ç N[Ú4JHcˆ”*¨$ê['ÙË»¶×Ç®85Ò ø€€H­ÚÉï$JDQDÚ¡”&޽;3ï\{ر½^Ïìê,Å(UäG¯ÖcíîìÌ;Ïóÿÿþ>À{ 5+茶SÌ7BcH¨UF—ÿâ+Ù?ýÁ7òqÛ²¥ÖæµcžÃ[T%¨ˆí®YË:4cÙð˜ýÈ÷7ýôÏl­^a#`èÛ×ABQ4˜(º‡~ȇåÄ«ªÑeDmIrõÀ?² sWWìüÿºŽÛÁ‹h‹ÙIØ]67e¦×¬X?ÐÛ33­+`~F›žÊAÓC™–Ó´› ”333ðšËåtÕœ-¼µP µP·­r“¹Â_}è²Y5¯å`áŸÃ‡:¬ "Œ‹&p£ÑM¬Ø¶uõ¥ßÖŠ¤ä.> ÖV”ˆÀ!‰Â¼©ÎÀsÀÐ «ñLÉ®ë-K:IlñîªPZ €‡‚?‚™]¾¨3ÿƒÑËr¨¿÷9Sæ¤]4FðJ»"µHI?Ï7‹R”¢€X·*Þ¾åSä€*×¥”0<`øé¹ö-%GZdTø`6 W€%¢}ª‚w®)£´Ù†Oúq¡€¢:yq”ª¥Z8•"t$¹°’jR•E¸dž&BAE Ý-42sÎ49tïd¿15À¾b×á÷T2;w_û%“;Ehý‹òçšéŸÈF¹d"ëâ¯Óc2ªÊmÉ„Ž.K%€ÝC… €–Ȥ[Ò©Vn, Há»…F´ã­×¨ –M™†ŽZ «Ù€ÙI»{ Û03dÖN,Êô/™ZüÃpEp[Å+~ËO:¾ ¬Ð†–¼ í.¯ÉF-%1·ÅûˆãÁúøkóÁo—W¯}€ÄËM e­dW•–ô¡R%¹SKf{,Ú€eö¬U;CÞq̸Õý¹p¯vÖ;cš4]:f¬ÙTº32$UnsylË–[H·á¬ÿà/¾ `:A}Ð iéPF> ‹Ah0 äLº š  tòÝ÷B›þ³]7’/@S]öAF :òò\û8jÍ"hÝÐÁ®-.Òá´YŽ~§zôF ‡®/¿÷²¬Ä AÀ'‘-W¯ó‰çÇê%! ,VæL¢º7Á‡o$Ɐ[ ÷»X£biISæO<òçÿ¨ÍæŠ2ž™†¬öišššÒþÍ' µP u[ r Œ H>7ýÖÇ—yVÚi7K®biŠÁÍU«¬o¾ñMIŠ'ÇÂi5N®(‚Ÿçým‡j¯û(R ˜>ÈÈÐHHêàXca•ƒd03MQø¶­“\½*FŠ–Z|t/çM#ÒÞÄhçÚeÂXfÇñø^næ„ ÜZáv¢ ¥"ÚôHÕp͵ë@) :´é èÅÅ:­–ÝNK°~ËßþîGR T11¶€Š¤ÄýR¢£hôŸF‘âú¬iðIâ›d¡UÛ%ÔªÊ1À…æÚ7Øü‚€‡ Ï". í"ƒo§[‘P›NùHI1n´!£tÀ[ .·™MÅD¾1%¶È¨ °Nʼn5¢Ô,ð×Ï41Z@R<íÝA#'Í3=x®÷óÚÀ⛿ªø’›ö`´ »÷”Ì —i'èÉÛõÓ¦ÍK)Æ`]ÎPÏ>õvº”;NV­dJmF‹yK[vXGÏØÔÓl¯-?l,9µ¬´–U2Äj¬×ß²O÷›´^˜çæà}Ù¾%“}ØÇŒ[\j/–ë7j§ËµFíliv¸ìÜÍ{ŸºÏcÃör–4ºq·—ªÄ1«Ív(ðå÷¯ø8®IQc²ýW¥&kz耆`&ÑÈf ýBe €ŒŽv tXNïÅ—úÎìb¬4Å:ƒÍHèTøš,š ú×3Ƈi[Åw»¶*è–xKÝö5ÓëǾ&§bBúyIi”¤º”NŒÔN¤âb²1-µÌ©\IU$PóÉÓ/¯ô’4iaI·¢KV/_óö›oë4’Ÿ¼"Y,À‚ZþëøŽ©öB-Ôÿeé#`Jk‰ÄI³ÛN.£q;‰,NíÜåºúI¢ˆk‡Ø[+ËaE‰ÀkE "rÑ(¥Ž;~$†Ð0(ÍÄž•öè´iÒ:¤ ±’8N ÔMëÊF'ºÑ¦@ƒ}}ß÷:‰!qÈÝq<å¿L¤¡J9ºº²-ù÷;÷wî9ßÏwÇ”ÊËB”åB {×Vج„ÖYáÖ_¼ØÄH!>Õ( þôí:IjKö<5X?83§62Tp ?ð®Øö<±kÇš®N/-‚û‹PT,6COâCl:(³­Šš¦}žlÇ@‘¥C,zdÙƒ›êÜŠ¸¥”¥“ A}áP€žõAq gN‡6,ÊŠ> Ô§RµÃr„§¢uÊÇ‹NŽ]z×{âè–´oþÉ›Ïýýo–má¤ºÏ Œö•‹}˜ØW2Þ3OéÓT­&€ÂÉWÖc¹³¥Û*Å5Áq·Î„[«ûäíEùNÝÁWŒn„\l'æŒ;7˜Fzðáse£‰YJ·^9­V’(ÿÛŠd´,uºl¤Ë œ3Œvè”ìnß—s}³òIu¾·ä‘cÆýžOoéX:Ú…*Ihj´³\I 47~­ŽVk­ˆA*ps‘N;î&ƒ /m?¶ñÚ¿ö Ù&ð™t0—kæ…:ž< ·‘JûŠîCà›x¦†‰ û •úûý«—áb5!x"á—ØïBg]úãN·[‹!6’4¿wiWšñvÇ÷xØÏM 9[CK4w„æÂ¢Ø0(5°©ý€"çйS½oY!ȧCz Œ2©ñƧ±«WÚp½Ål˜Ýbôàz{8ÎÊì¸rWQò“ì1 $pÏçóÿc²ÎÄLÌÄ´"? •ÿðÊûU›ªHÔmC=VÌl3kÚÔo¼±îæ@s†>‚%pé[ 9)†Ü ˜š"ŠÀTÁ… 3} f(?| `4Ñ/ˆ Kya»ãǾNšPÒL8,¶•‹m_ÉR³(DŠJ:)¬ŸAµ3)}ÑË—C‹Êjt8LæuOÙ.üyG7ÉÇ9¾ùýË{ž¯r:“ Õ¬Xáa©ƒLë0{”ø'†(®™ãê‡ä “‰pL!Ÿ¬Ø îLÇîç ´ðdzð\s1í‡O#Måh&áD/C^näDßTçÆPÍP9ÛC¥½ÃC‡dÙO³;YLëwX¶••êåœïÓtøÊ‡¡Þdíå«{¡{,Žõ©•ó†{IÃH|žÒ "nO˜9fÜç5–œ·»DéA”nÓøYÍXïü»Ér9nN”Ž'5JÇ\¥wö?~§Úþ Ym^¤CÀѸyÝjAð¥ã÷OTݦڄÁ×86 KÐ D‡ ÞIÀ­çùVFhà%¿jÏ ùÒÍm‡ž6aFi«pqF`•V³{©ýÓ¥ýðž¼~dƒÛbBô&›Õ‰u¤s¡ Pƒú‰å%Wþ†e‡$€m_*톚§|ßh¿(úi$# ± ýª(zçÂEÿúçTˆæq JZp«•$ÜnçÉ“'s¹œ2$ÿš1ùu&fb&þÿˆµ´Z, À;Iš ¨ÍTVSSùÏOL°Aƒ(8PXÊ'ó1.ùèð“nŠ˜Ð8˜0þéªO*U;$…Õ`(ÁLÎøM5e¥CíM$jmz»wD¹™Ðð—mEa-ª<\ŸMâi°`CŠõfø£õû¿FÁxa$îÂ,:ÌŒX¬F3¦u➥.û¯~ùrškLqÞ,Q¡ì 7Ãc¤H&å»Ãæ8K/ÇyÁë±t”š `0A ì„/ƒ;ä Ù>l|¦ê%ˆ-©Ã?sc îÉgWj¦<71˜a÷1|}&ëüCMÞ…»·§ÞÞfZZ¿d×ÙŸYµ|í*7€™_h't´ò?ì—yl×Çù£…Äø¶÷šÝ9÷d‰ ††Fµ¤„•‰[Âјû°½>v½öúÌa‡¤QÕHi‰¦)…¤QÖ^Û» ˜ @›ÚµU’ª¼;÷ÌîÚ^ïåéÏXBüCU$*RÅ?½½}3š÷æßßçkÖÛÊíª«{x¾†\‡ºVZaÏèÑ㿬ºkŽî{åõ*+VJèÐm;çÿßÐÈ 6>˜“Ô¦}9ѳEr_–ÉÅPœÐ/ø}[Þ¯å› ,˜IkÀ¬¿9«³•÷´×Lz ³Q±ñmbp¶âUÁP“þ‚‰~,ÔÄý³Rý†¤·$s&;1 ‚Òùé^$Ý_̽“ûáKßüô$öÀ1ã¿_¡â×g‚è¨/wâlÎ乂ñÞ|¥_?ÈûµI?šì×)~UÔ›wþebÓª<‚À0=F & ±Ø°³Y±Lóê«Ï‚˜@] Ž’>À ÇNyia¹Vl ¹™é’¹=¡3nè¬[ÿt ¡SY͈ÞPèp¬¾ú×êWÿ§ n«!Û¨[€Œ{¾}Mh8ÿñÖeK0£áI\§rÖ- · ,0³[Œºo Ž»n9¹ú¥Ã@/"ç–ÙvvE`²óïŸܽí R¯1áfDƒIEØ»»»§ D¹Kfb&fâ?G&“™>5ÓWø«d”É4üRéÔX&5¡L*>ºö©uEḞÂ)RGو—~º–ã=Räž½í}+läMNÞ!Ë~Xa5`t(‰ÏVϪ׷í4W~O¥ÑÛ)J½wYöøY­4 Uús>è¶•’$aÀ­˜Êµ«Tä*ÐÞgN{s”>MæÝÅ?[ñ©’§1åL^Ü—£ å*Þ¹Ÿ·./U¡”×él¾˜487kƒ/ZÆü:åœN>¥NžÕƃ9J^t g|È8æ¥ô(ܤIúôŠW­ d)Á¹™ÞüŒW¥ +~õ¤ì‰]Tz‹•Ò÷2¨I h½^Tï^• Ê`°áN`*“5iMÖ–›% úPM4¶ýF´ö:ÓƒÁ5ƒßù:QläÚ…–ï`¸v‰?-àM. íbén!RÍÉÛ8ÁõÝ5vðl~¦œùWÓ¨ÐÄòm-ík¦vjÜðô#p¸D®† íçE'͹i¦‰ã[¦Ìç¹ó°l»(vÝU8ø •_ü|ÈM 13j H½níêïlXI)‰1T%LŠN ìm¥…ëm퉙øšÇxÜŠT*u'ÀdØ>5…%IåÃKWJæÙHRƒ¡*3¹×—”ž?ïˆö€pô]³Æÿº0tc,ÚÊ0µ Û|ù£ƒvªÈŠÛ)ðZdöïÞÚÁðÕ<]—Úù‘v0Y4{Ï´ …³!,¸E±žåë¥Hçõë—þX}êí­'Þ¬ôw\¿Ñ%ˆ‡e± Æ‘ëïß§¹DfÕ–ðv™ji—„>N­9*×ħ(Ôò|»L7*ÜdÒè~žkXêüÇß¶=¹¼¤Ô\lAr‡‚‚ØŒ$=>Ô“Zd¾#<ÒH‹»~rl=¦#Q´àù/9õöóÇŽTœ l¼zµ~é#Z KT?ëYÁó5шçŸÃÎÇ«MØ‚…ó´,×€TõÜc&Ò`$¬•ë²â¡ãb„® ßIêLz4ßLå…éÆá/ÝeÖB·™Í8n'Õ0¤…&ʤÁKHÂBæ}þÙöp¨þ†5‰e€7' ÊWF>uÒ—?Ñ›•,Rºx@ÕUU„ º¥Æù6Þb$U-úèeL *âè™üÄÀ\³Š4 ¤Éˆ®[¡W¿‘ñj&üÄè`VâýÙé!D~M5©÷–}y“~ûhÿ%ˆ|ú¾ÈT¤§03aGŠ œ$uº¼2²°§ªXôÍR.¨'ßÕ¦úDŸ~<¨Šl aé^$Ò—“<«̘ÈKùŠ’]"€ûñX?2áÏOŸ›£x‹”`nâqVâ >1P0xx²7ûAÑH|©Ó‡Ô«ËŠôÅV Z‚¨…Àô„ÐuÇ–åŸ_icFÜ´tˆ‹ìгõ°iùP—À´r\uˆÝ §€¥³k$©!tÓ%ˆ-pð®ç…ý?@ 9 eAçÿù²+>ÖÀÑ»i©¶¼Üf1™Q•ú•_m‡1É-ómaÚÅ .ð/t¸ D`Ú¡ It3ìNQÞyWaà±pØÃ Ï Õ.)/0èŠÁYIˆýÑÒE—.„$ãJ:J+Ü)¹Ó(ò@d&fâ+Ód~›C€I ÇS“ñ̈(‰øä‰7NPi¢HD«1"ó0µê¹Jûµ/;Ã\ËÔñŒ[âð¼Ò´ÈuN%©ýh×:R VHK¢ù«–—_û¢Q–ê8z¯Ìy ÍñÒ=ӂĵ‚EŠJ­ÐËÍÐ>ÈãÒ¨#,ìäÄZ†¯ä)Òf”!uB÷‘F¦dšIn™­ÈFú7ûeÕyÅqR^g½ÛÜeVÛIí¸.q!´D,®)$Â) vJXLíñ:cÇã lêB)Mãä¡ $BŠšÒQlÏÂŒMÝ6Ô*iHÚF5Ò3¾û;6^Æ3sûM,Q©RPá£óp¿—ï~÷ÜïüÏïä±?r«Yæ;AÂl‡$¾róöO>û·#L7Ý‘ŽÈ\ƒ,µ½öÓ-&ÜŠiáu¥…wŒg;dÉIGê£R}Tè£i;Ç´8ÙÝh¯4lFBQz¶™ë±õŒÔûó7jpTC¦R[îµk€+Ât/ /3c¶UV†ë`Ä—ì§ ª‡OþhGº>¢“æ÷GDGåÆg¬…¨ý¾mQ¡³r}±‘0PHźò¦Ú­'7ÿ°¿ìÂù>ÿA_pÇëµ?$1mKA‚b‚å–(ò‡£|›Äµ2\“<Ýq{êp˜v›õ¸†4@FÁ0· J‹4]îrNvÎÔïÜeºjCM­ög8¡+p©Öå›qäø±í€îXißÙ·ê0¡p}O•Èõ«(ˆ?¸%Ú7m°‘V„[ÞïI’£ÛUa„Ì$ºª¥å[aþH$v˜NÔ×–:ù<= *•Ü?ÀßÏKòÒHܯ^ÎNø³ýTÒ¯UÆtŸ kË¡Lƒu bB6Â×ý+åÐr@‹Ã:etåÜŸô½5H ŽÀ†"S‘µz^òjR~Urx¥RÏ]Ì™"‹!XV+¿Ñ)¾Œ…@¾ò{hfD'Žë‡)ì¹ y‚¯Ð¹  ¢Gq×B¶¦FV%ÇVÔWç[Ñì %ȉêÜø¢ø00ÜS5ñP®rMø4I_¶âÏQ‚pÊŹ3Þ³ùàðÕkI‚0˜áüŠ¢ÇÇ2ÌÔs¾Ü¤W­\T%G3ioþënè)<Ǧ·0\;ƒ–,€‹ÊJ 7ßÜ;# r|- ÐìLıdØ©æX\é´_àYG{¢¢PϾ~jkYü|…‰a{¦Øú¨Üó‡÷Zp#‚ª}æ‰Á焨;"ÖÁÒ cXÞ!²ÐÔ A»MǺ˜H‹Àºfå¾/»‡Ý,q-iˆ8Åh#4rÜñ¾Œ¢0-¨8‰chsë~N 'SÿUZ ±‰Dbé9ÿ¿ÿQ<Ї/îvÇÝŽ˜UÒ(Ÿº™Ú´q3h% ´8ª³†b«í¹—ºO’Zx¾‘™j„VYpò‘ŽE#~ãs; ”®zºXMB¿Sñt[{å7Êá'Ì6½T³:Í{üR‘àK%±ciù°ÑHb,;1¢O´ó>½Ò¦|z)˜ßû]Õ5YLj¬jèt“-"âÁ¬…ЊÅQXñ믚&ÖI-n ÚB ©©D?>›%\‚å‰ìOß1Ù®ùe»öN0_ ¬TÎgÌO¨‚¯ªZ·Pßß’µw Q³jkÎ8tUGY‚C&̸w=*…P€"R ¿ÔœCl–³mmæÛE‡6æîÞðXWúÏsËcA]ú>$5œ›òeÌû3ãA]rCË®¾»¼1äm„ÑÒ¸ƒ\ð¡ŠF”@&À¤?ž¢JJŒÀ±ßÂ’ñl}¼ÏÁñ<“Ù€ÁŠh¬$ù¦Õãáp/Ã7È1»,&i‰ .ÒÊOuK¼kFîš ·¥ï-Ý,Š­ß>9éúð¯{€_=Ëð®U8ôöË46ŠóŒãI«´ÐÆ>vç¾vf×»>À©$-µ‰É¡$AJ£4qH|°^ïáݵñš¤%miz¤j*U"‘’Æ7ÓëC?4¥—R(Áxgæygv×^Û‹ Óg³R*ñ!R$"Õ^½zg>̼ÇóþŸß¿Â+ú{¸êâ¥>ÓŠhZ#ä[wx–ø\¶G›jͤ“p; ÇÒvÈk7ÌCŒZ¦­n@ "D¤Å‘Ú•Éö¾õvúµå2-„(²¼Wñ?ôÀŽsç/5¶È!Ó÷I¸Kñÿ ×ÇW?äóù¿ÿíµk*ÁŒIœ ’rµ"nÝŸ9Ó‘iÒÔ…:,3(’Æ©KQèo¨­`‘Àá‚©I¡†ÜìÁ[ý+³T…@2¡–Í)ªya¶ÖUåFß×ãà’l;j§ƒ&nÆF+ü¬©…38ž1“H`T¨¤@) zŸÕº :ƒ~B+–æ"™ÀûóZ:Û7Õù ™^6ué%X2­ç.&ß~GW’ÈJÙíÛYøð|lxü»"GúÅÀ½›j&QÄ0záÈ2v{A9Í}uXBÙvïïÏ4^N½ nRx^r“¿?¶šl3”3{Ó¸Uìz¥oETÔzýOþüÐÈÜðrgˆ½:ìÊ •8cÄ»¥ÎiR¼Û•ß?Bÿá'Ä•Ñ g€t†n¿6\æ ¸ŽÙ9FL3z³âNªŒ¡ê$Zd8 )o’ùúš²jr…HT­‘]o¿¢à1¨ÎÒ[ûéZ†áHžhë—9n¥°Ž“Y"¡.û9Ïg„…‘²¹¡ü…›•´\ÅKüZY ˆ.J(Y¡þÜÏ–-ŽWGVC}Ï%œ±ò«cËòÃ_uFn›qn¯¬¦Zæ9—8üªÛX}³hd¦4äºv´<|ÅÂ)h+¯œ(uŽ“™qwÿÓ•`,*+Ë9á6ÖU༢‹Ž…¾uîB»‘nVQKÚê™ú¨m&·l„-Üd[­€NÛ€8Ì@SÑ™Ìˇ~x¿‡(@í ;1šÈÎt8RÜž±útµÙ6ÛõÉ„möšV¯jvš™î”™™îЧnèb²øCgl èf-µgÚî1µ„ž !+4qºíÁ{««…€H*´‹“%OMÿìÙ³E±ŸŸ/Àád)–b)œO2I.—;vì˜È34éÆÇ ‚ûögŸúÚ‡çûTci<£„a„0«SÑ´Õ6äfш÷BE6Ô֌٠Å1“ ©ZldðQZåUxÊEúxn|<œJ% ô\u}Úïëz“m‡jÆ8Ì¿@j,mîµq§ev«h©쀻§3}†ÞñÒpˆ®Eж€éQxÿƒW·ù%†'èíøÑžšÚ=;›Tµ.u65|]â)‘£–Ù¾um$²UQH™"½¾Ù-V:´vˈ!Ôjê=0U]kÎ$R“IœiÎÌFÜìeh™áŸ}bKJ eí¤1•HgŸ‚Õ!}ß}Ûž’%ŠÈ.† 6ÞUmfa"nÑq"z<¢ 3•>ô²’@Q…*‰ë׸þzv·Žâ¦…ÿb3rñ£àá_=lÚðÄ®ªxìÎ'“45 „K. ŠÑ«øø¹¢‘Åñ g”\Z™[ymTpŽß¾xtUþ=×µÑÒÜíLЋÀ''Ü×g„r]FVºÌŸ¤æ¾ðçU|Cr{™Õ’Hº9Ydy…Txg¥‡`Dÿfñ‹ï¿AYCîú5ÁÊïÛ °/?]úãçJžÜò¥êZ8X8xIaY{½}T¤VJ”I\E~õj5+͵ÿý?Ïû{¶¢CgÌ{ÓZ‚Y­Ü7¿¶ŸèDR]Èh·íÊI¢,o‡ç3xч'³RçŒ#« KXœÂiš% ¿h6Æ.G:g d¾VÅ_Ê92-¤±â¸‰¥1›i¾-û¹oqÚ)úæÛ³€s³í$ZµÅ6Ù÷cºh$Ù;+Ñozêǽ¦©žXÞDo¶gËÃ…4eÆXu>ýraq¬C,YÀa…,bÜþ|Á¥‹»uµU‘]÷Ƶ (¬I“›t­ 6¼ª4ñZ3¨Fv)R£;t¦«¢bC™(T”ëâ£miQ\ºxHk$õAlÿý>Ž€Çç;pdåcÙüT“ô}‚äŽÅ[¶ª‡c­BÄ£Ê !Å£(õ²ÚvðÀª|ÒDY;ÉA’¤ßïO$à·“““©ÿƒ35S_ûšššúŸãûBHþ§''’#㛟¥r.…Ù)”Y0ßòú[´xH’$fß§N‡ÿ·¾~«¡¦&aÇQ„¥˜'¶ó‚Gib]²Ø8ó‰B8•®†>cê}Q yŸ$¾)í²_RZu}·¦„ÂᚘV;*¹ôh£¬º/ÿ±êg?êÉ‹ÔQZl½xÉ…“ÅF]Ø¿æ‰2;¤E*³«»A€Ëc!‘Oß–W¶ëZƒ&tœ~ûùR'ƒXŒ*YÜJãŽã'¶B„Œ+{ã߈СòAYÙSë^& E@šXµ¤üØŽdãVÖFPïœÝsífý+'6jz ÜU—‚Áæ…$a!HŽDØcÇž ó.EóÅ4·¨x«ªÂ… ¾èåW+$%˜vã/y=§‹F¾¨î>L¾T“ÛúlFÇ ¹§‚Ök¿%=xª'{¬ ÿ9'ËÌÙì BæÄÀìÔ…Üá.¬jsvÎj]š§F»ÌþMeËalƒþmMžcÆß¥â—sÇÏgOõd½t˜²™,6›6Û °¥ˆ9Ÿ¡ðyˆmÕrãQß|'A‘” År:òîd$ Óµ©.k¬;35˜™x×0ö^ÆÝþ€“+Çi§1×I¿ŒN¶'©Æïe›™"ŠÀ$‹ÁQ–.&©ü€omøïî°êç%ØÞ¨PÕ]­@:ž&ƴ褴äHÒ-zt%êÓcµªÐ&EܺZ 'hª(EŒy"òÎë t¯ùWkÊ}œD g13øÁNAóiÎ €c@ƒ "óíŠT-ñµ1H( k@}Ù l·JK2¼/ò‘Ü ˆ·ÞÚ¼¸xŽÅ)Ã1 |iGÅV5*ó‚ ¤ôÔ={~€%÷=y"™œ†Q1S3õUÕ}&O&“÷i>’)ÀðíÛŸ¬]½CP†´Ñ˜âÛò¥æÁËõúÈA¹"ï ðO;f|Î俣?]Ã"ÂJ²6s©ÓpûV» Ô€íĵM òa·À7…`Ú~4¢Èn!ìÕäfQ¬®‹Fk%Å+©µbØ«H ÜLi»qõÈ徊úø“ÝÏmrPFÉcPÌN௼º×ª$9€csh+WVÌÜ Õ]Tº²_êtíð›`^ò¶·otØ)JsVš£Y§öí],!YðÊ‚PA•ݪبJðh—*d%‘vEùÖÊM%ùœAYa RHg„#î¡xþý¸Ðòë¾½¤ØF‘¸íïßž QTˆ¸dÝÛ²¿¬Ð‰ –¼ý¤<"x\ghä³{b0#Þ—§÷’Z§÷wûL©žÜÔ¹9úŬ@eç@ ä|¶xe)ùLyöê„5XHŽá8×Óæ‰î¬ÔûÆ#;s ØÞ(QDÚ>øufê:~ž˜ìB“Ö[oZVÚIµ¡Ô\'æ(/ÊÛ´>‡¥òP«É†e—âÜœG‘%+G.ØS]øÝÞÙÓµ£†TŸeâ\æÝž¬D150KëEªWÍvP,m³Ú¦vÓ,©Çœ^œ‹ì¾ÂÁ£Èw̵ӅVŒ´bFfâo–-#NŸÙ*Ë­`Pºê¿¨¶KR­&V«’ö<ð¿"6ir“,¸Ó›SôˆR³ Ôó‘ÚÑ¡EðGø:Y >°nÉ¢âe‹í­*ÿø£Ž_í†ëñÅ8åUU–¨ú± 'Ý{ïQz0¦àï5EÁ¸’À-Š?I‡ Aq)ÊáÁ -+—ZHÄÉÒe1¹qý3W?úK25–6â©tH„z$ã‰Ä ‹ÌÔײ’÷06üƒ¯i2™J áêÕ«¥%N3²ÁºcÔÆ'‰×Ûx¥&ÌW‹¼²`z~M7f|ÎŽÅšþ­]±ÄQ@Ï£Ð;áðûžàã5ð¤¨OŠ´ Çið|p8Ì—þ>jHW]B´~H=ȇ[â±€$ºÅhpDêàyÿ¥]{jKKˆã¿\LJƒZÜË¡ŽÖM…4Áb8mÅœ ÞÚ²æ|ÏfÖF³¤åû•EB$46V ¿¨)!I ‰‘¶Ñ¡ý¿Gö­[[€Y11Õí^F[Hà'mqGùµº”±j¸¹(x ÊéŠOÉükÀÃϾ³‹Á,€@…¤Ãnvày½•’P”z•¯eÏÊeóX)¢Éhd_LJQ?¸q„oþÝëÛi+K[ ª¶•Iòt¡‘ÏìTWFª3+ÕkL ˜&{²¡S½æT§5ñnôJöÁJs‰%ÃN>B ЍâåKòæa LX~ÏËp_ÖPçÜå ÂÙ³_¦±QœgO•¤ƒ½ØÞõsîìåõ…†’BÓDˆ„¦4QhA@CT°½>Öës½>;8 Ð%U=QÜ–(€]€DÓ~hURZœ–TŠíÝ™yç\ïÚ^ï®§ÏâôK?¤ùPd©ò£G³³3šyß™yÿÿç÷A<ç¦æ±ä°.uE¯]ʉ×ôî×™ó6»“bºæÉcV€œÛ—K;wëáQàvÚm˜¥¤ëõ•scyÚ¯Öh£Köb#íb®Äf`ƒVíêÊ_6: ò)³´Z6Ù³ÇfÖ®F²ÕÁüäµG´Ãôö“•Ø–2Ê‘4a·ØJ(ø5Üd»"À  Õƒç€I¢ ðC³ã•Åö ±(ͼX=ÉÖHÒ‰Û·{÷ìüšËš"²YI¤TZ|ó£ÚBr!•NÍÆ!±Xì3Ó^¢b±Ëñ°#‘H,î,É¿c¶ïü+é p£“¦í˜ÝŽçÔÕl„BZ‹EðÛ¡Þq¬¡:éáW™ÿU"Ö#Ë £¡C”Ah“ÍF`¯æŒðCB‡¡(K’W®ó¡Ïg*  Çd¡‰Í`Œ’èŸV[£\#ËqåXp]¡Õ~yàU`?Yj“ÔÆ0ò|ø[ÿ76®-$‹,ú<+Uðô×K ³“¡²~tz‡Ä&NQ éày¯ªxáæús%t”„Ñöíç‹ïO½›VYOZifÛ ø­»T«ˆÇ$îˆ*ùá›>°ë^ð!±îëÛç©X»{§ëxÏŽß_ZkGB¸«,µŽâsÚÍFìzqƒõONÔÅã~èY®ehø»Üà$ ö|§˜e;%¡a™FþK†Èä€)9¨™^•[•¸š]­]$µÁ/¥ qÀ1t?í!/öê~wÆTd²ØL_Áî‰ó9éë9·ÎåD)¦wŒ»ç5‹4ªWÌ^ÉÖúOšŸ.³ÑF§bž)Ê™¾j×ú³µ¾Çµ±¼¹~¼Ì•k¦I†6Ò&óÍ÷̳Á,íýÕsKö⣘6˜ìÏK]a—EýøöR M:ìÜnq¬Öicf­Ï0Êž¦´‘'’kF0-¤¿óìp«™i“V»ÝZæ`¨r}öôNùa1 b•Äõ(rKFà‚„êX\É@ˆó ¬˜à)Õ¼|ì©' ¶¶À˜]ßüLmív»™d Èm›7ºÒE;·®³òÜ›r´>ÌÆ‚žðýS¬£ò[¥†5EÂ>p8¨ÊÓ*˜L½ ×*Ó¾0ïå…ÇöÔVnpÐ&ÌD1´‹0Û\6çoÞûébW8ŸÑþÓ®—c9þÿ"N/nS©ì,nÏýâ—4a²Ñf«‰*ÄJ Ó™w_Ô®éè!>\'„Û®5ª´‡€Š¡ä-9f|ÁŒ‰-(Ü)(Õ»^vºÉ F1xáÎÝÅÐ4q¨žkß ˆö‰È+óGö|d!c€,ªëã/'4±Ð¦ñþ¨T9>ÞDb$Ô»ìTµÂ{¹66Rn5÷“;moìÛä¤lV ÇI•´A{{¢gÏÇšïZ¥Hj¬¾?l|çÝ­vš±“em-[¥Iºê pg‚p˜cýZˇ×|¤Eà‘E±.CJ\fÐH¤FQ|â´'錉Æ;3®g…¶îömÍÏ–•ä’¸“a˜“?ü&+t©±ŽryÎîºõ—@mXï¢ö¾\#‰žeùüTG²âëRc¹ cúdÈégGògFsçC–ùÑGÒcYs¡¬™ÐóÃØ|È”Yqãçº3M†ž½y‰`v"¨ëÝŸEšÊÌÎbÒRzóÇíZnrt4Î\Z­08I9ÀaOEnlȬ]ÌÕÆ¾¿lIŒ­xåùBÂJÒ¹[‹ŒÓC–ô"çF –ê=Ì éµ««Õ]¼?_»úØ*+¶Ž¤LAo+&'ú­Z®v› êé~ËlЩ êæV$®ä¦F‰·›‹s MF‹Å—¸ÜPå {w­ÿëx'Ô!¡B@ HðˆR•¢za‘ƒâ@øˆ÷©r³Äw\cFe²çÞTûú2ÊImØþô滚óüq¼j÷°CÚi‡NÍýÎñí¼è⪃CUEÌJ¿÷¥¿}ì“Õ*Àž)¶’EUª:òCN+ÄWƒaf&Ò¢H0‡)Ö#H’âW@þ\àìÙ×ÊDYJÂå (› ÿþÛ'$L-:3D2™\Âz±Ëñðb‘F—z<‡m[[…:ßF%ÔºµSßù]‚è‡2Ä…ëcJ·Èû¹*Ž"tE¦2-À’cÆLn²IŽñèÐZŠ­¸ª=IB?r¡o¯¤tñR¥(7©J{x²R}2:üЧ„¼àEÿ=pîÜÁŠCîàðØL/Ë5IÈ;8´Ÿ°4YøÒ‹åj¬‹‹ÔI¨YàŽ*Ò!0Õ0ûÖ©Sû]ÜbÄá)í ÈûÖÝùô¨ 5!T#^ž­‰É'àï·¶¹("Á‹BÃû%T §D阧â)s8Èõ6 µ©|Õûž{pÿQ¬ÏTv®>*·!¶A–ªÐbÑ#¼ü=N:C³\‹$öº ù…˜›±<‰[¬Åeº{‘Îû“-\¢t¼OƒFØ#ç¸.Yn‘o™F>?çG BRƒÆä%<õrá2‘4ª¡Gg†ñ™QÃì)=„§‡³C¹s!ƒ\ÁR#ö…á5Z(ç_ì—ipçÇ3 SÀƇdÉ’vW{鲎“81ä($-m @ÂPh „c°9lY²,YòÉå@ aÊд_Ò´%ÓLCJÀ–uØàé1e:JÛ¤…4°¥½W‡Y²´}”Ì4ýÒIÚê~ð3ï­v÷}ßÝ}žçÿû¿ÞkØ´ÚLbKž­­˜ /‰ÕJ›ë'/«•!œ *pÌdCª¼[—L]A•63 ÊŒ™PeƒÍb@Q«?¹Ã2=¨ž aRØÌ\½% žÍ\6¦CÅ7ßÔÕè¸eaÔTcúóýË”Q,ýŽ:?Z”.Ï~±@,‰v*X®„õÉKªÌ¨nìíêã{,ËPm¡Á‚i£©Öjzõì†í˜Ã@ß(ˆMðl¬c<©¤þ8_\rÅ¢Np(É=½ ”©ª¤Ïž]ŦZnEÛ_GS(M™êWVßz¿]H5þú·Žºåj ÑXQãé“[Î?6îŸÎ— ™{ø˜o¢0y#k‰Ë'D‘EàóHZX+.·‚º;îüùù]ÖêLMhð4NzÛ=J.ÿO&™cµ˜ù¸ÿ4’ÏçS©ÔöíÛõz½‰4ÐB#h]}íšON¶òBSœ?Æ2},ç•åV–k’D;î›Nᘖ9ÇŒÏ9dÁÏÄ\r¼G½G¯6¡ˆ‰DM„}u~÷£bÒqwlÿd²$XàZ$¶ã~ïGâ{»<ÕÙQ N!:M}þì÷×ð² Ú™3kÍ$I Ç žkKÊ\¬Mä}ñÄž¸ä”SÍ¿»æ²(…Ô.·#4^j³’A®| ûÕo@úý"ãøý2wäÆu'ôIi³R†{ãÞ©„3)A×픤ï8Ö=SOµ\qñÂ7>¼uHº%É ®MÚþ`\ôÊ|wBn›HôFﺓr7´k)µü  ZŠéløƒ_^Uu¤ýµ?x£1ØU›$¸D®Ì&$ /¶q¼‡çûÀʰ"ï™§‘ÏPá ¦*ge¹!µB”0ªQgGŠsA[ö’N4(CT.T– —¥u©°!þKMv¤Bz .^œŧ†Î©‚§åª.ÔÍþBŸ §¯¨²J6?­¢èV“½ÁŠŸE’‘’d™¸ª}«Ù@UVÑVÔ®#nü€PFT¹  Î*Á9£‘\@“é²a0˜óEµAk×c(؇ÝO?¸l˼S¦D*'#‹&CšüåâìPÉL¤LQç†ôS$ÒMt“Ãx.¢œ±¿P[fÑèíÖZÔ€PˆÑ†š¶l\ñ§ßŸ`£§Én^:É)ˆ~hk< ë•D7”Bò‹l§(·E={wÚkH«Ñ6Þ Äòáßšç,P§©7¶kžlܽügçöܹ} NŒ…ÞØÎíÄÚ’ ¬Ç½ñfY‚U: ‰œ\”U¡;É®ä„ïÊhã#•,³š …iI ÿæ–­²(}B#³™ì\kÅ|ÌÇý €L&?dY^»v-‚ E™Q;X×~uéß>èâ.Д„Ø+p­‚ÔÅÉ-¬Ô e(²GRWl|_BtÏ9f|ÎÁó-‰„;:Þ'&ýÀõè2ÜŒYLkÖß=ùµßšœè¿ë‡çy‡Ì·ÝõtÞx¯}ÇÎå„'ч¬„Åb,u6=û¶ûDÿ:%€—.^Øf Z\<& ̸3Îwˆ¬šØ?ÙTE™ªÿȦ—_Ùi b¤3ZªèÊS‡¿”ä:‚pâÕÓël”Õ.ß¹ëA<&G]ðÉ$®0'|Y)¾ÛÉÇ`Ù$É!ðnh˜²¼Ÿcb´Oâàb@‘6Yèà™>à fü$ 't`H‰î;¬#1ÙuN M)vŸí¹Žmù.`˜S” 6ë™§‘Ï ‘AL if‡‹§GŠ&#åSam:¤É «§ÃÈÌ€J*WÂ¥™ðâtdIáâ€VÐ)C¥ùÊpMzpa.‡ åÙadò¼J¹Z¤\„[Š3ƒ´2¤:×CÙuõZ£!ÉgkL‡·n&›·”×¢$AÑF“îɺâ™z6¸(\4±*esõf†™­ ?øî©ÒjC,´·[ÐʯfÂð–ÔùÁ…™ 51¥/áJ b6HNJòá¢ü J‰¨f‚(#ųtú²îÖ ¥·™¤Q-‰ÔZ)†”P¸®Þ¾à‡ß[?v¯ xƒå@#‚ØÉÃñ>9~PæŽÉÇ¥ý<ãÏ%½CÛ­ Ž}Û½Æ膫^9º‰]¢Ø·s[tKŠ' Ã1cMRZ£ùB‡û‰±±ÞÄ„'mœJuóŒGdÚÖ-'|<,〙eÁä# m°Ïzþ£c&R=7ÿÞûÜ’À–ŠÐ8‰#ØÆõŽ )0I.7×¢1óñßGîã‘ý8góŸÆŒ2“ž…sï]¿þÌãO˜1ª3ã„͆VìØjÿËŸ}P;Ñ訦ØXëÿ@AÝþu|zŠsC©rQÌw¬ãJÊÝ`(d±MŒù%¦3%º$¾¼xPÕ;ÜͰ‘õIB“$5¾ñ£—L(†£…’x)qýú‚[aÚ%ÞǤ­ë?¦®d· ¼àt$ß'O‡À²t€ãHÜqŽ=$Jûd¹•yAåy~W"Þùö›»¯ÅŒº µ ˜yÕjåSµ„¡ÚFUüñý—¤¨{Ztpbsœ÷Op]Ltw|Ú¿ýÛõ´n© #ƒá­¬Ðÿú7ÔÚË­h Qi1Ó† /Ôß¼³Ÿ•Ž=ÿ­©¶éL?}­‘ý|¼ù~ǹœèÝüâc§H„4’™wmÙPe€d®1ãÿd8¿e«1"zÍb±Tÿ`¿Ìc£¸î8ž¶ˆPH°ñ±žÝ{OÛ\C © ¹ZÔ†’¦ iZ 2)†õ±Þõ®½»¾¹rH”DEý£¤¶j€’(ð ¡J‚H  §GDkŠwgÞ1ÇÚØØ^ïô­·¡U%\É¢‘üÓO£7£™7¿'½÷ý}¾&áÚ™k£rìŽÂìÂ7Ëçø;aJôdœÊïž3ÓõŒuZ&ÏÌKvdO´²)h<“1Ú¹h¤gÁx+otÏmÖs&›‹¦Ý. µgSætçOÏIv|Éø(óÜ×·‘Ã. Öâ(ä¶Ü‚¾·êʯ¢z¢R¹oÍă`Ôp€rUõAŽFCX­+M@ÞùÚ+k\Ü"å|ñ¹|€Zû_}ùYžæxÎÌÓ;êÖ\¿æÝ¿÷Y7#0æ"ËúÕ›Ïëj–½HöÚ‰Ê~0ä‘a=¡¸V­É;5POTH;ö¨Z…Š# ÚäjM¯èkÚ¸®P4°VJEʬztYoï9#acÿf’Qï)mO$fe6¾Adòs&¹d?§Hd¬÷Ó +–}ƒ5qù6ÎicY³¬úfÿµ×±²K>M Gª†õˆ®xgº›¤ $ÝÍñÀ‰‚wE£5Z< Ñv]«"dcCºG/g1¤4 XµŽ«A¬Š01 wš? Ê’¢BVšâ뿾û'?\)0Ï2¢•õn_!£²8ÞM<¡I M·þ4Š&!™®?Í'D⨲ƒ 䤪¸Ž<Ÿº¦þù¯5¥¥ùù“H»ÝÎ¥¹¦/»D·g¿|Å/É„[0(ÃJ(ÖÒd¨¹oÀ·¼ˆ¬ËÉ›®^ۢă@œ;ï_¾tQ]ï´1Öbwæ™®ÆHÄ}ìÈ^!œ&áRˆï96ÌPÎÒÈÝsäsЛ»Ê±Èau‹”=Ÿ¦_æ^Â瘱˜Î¼ükz¬3ÓhîÜÉ6&y’šézÆÚ­ÝL´g]L¢+g¬={ì”åVûB26:ç rÖ,+Ű6ój7×÷ŽcºóOtå%;7ßãÆßÏ‚g¬ûÊíE,k¥sM– —ËÁÑB±ÛqühéM}‡ B­D‘›t%Œä€Š~T«šG{ƒ1y³Œ*dÐxìhÉšGî¿t9 º÷ÞÝ PŒCäxKAÀÿht°Ê58Þ¼þé•NçÅ- c7jã¸.®4È €”&òVʆ´0’¼ F¼I Y)Ñ”: u HÑÀÍ¡ü‘;ôª¯je¶æY\.›ÅÌ,/^ö—?]0ãÆd’pÈøø8‘qb*Éulbb–Ffã iù¯›âêIãâÅ ùE™l\hlôÜÆÈSýabT=ˆ”jE°!MÈ?én2µ„(Ò@r›FdA¸ª~¢n#­Yƒ-*¨‘ GÑý)ë!Õ A u¢¸c·ŠWU )R=µJ¼æÄÉ-N>‹¥­‚ÕµÔî<Ùþ jTDjðÈQßtëO£ˆ,ùÿ!SK˜ZN K¬&Z„q…¼DÜ öaewLòkjƒYkC‘ßþnݲÅC:»K´°Ù®‡‹-û~öm 5Ä`#À ì±J$íþàãŽÉa™¼59‡â‘ë¨x%äíý4ôýuÌÚ'ø7ömüäb- Tb%BH¢REñÃØ®{Ž 3”³4r÷4ÎÒà䃱SÖóû¿zþó.q…Kx‡‰á)óó/Ô>°u<8yœMtÌ5:2Œ6ëLדl£“]Y·:2=yÙc­f£CL´eïÏýûaæ!·ÉfIY$ÚL¨Ééšöü£íYã&ãf£Í”<¾(ñ‘ùì!û Oºio¶>à 6«“cèM›V|öYÙ(ô)È c5XjÖq3±$@"–'@l ŽWJ¨ À †w\ë 9úðCoq~ŽÀðÖþÜú%’´+®‰4]½^²„ç,Ù.‹û—o”`rÆQ¹Šý1Pе°ŠÂE@l«†ªãjHÓ2ôm+†!¢ºVCÔ)zÃG$hx8D(&GZšYì´´S`6ÞQoëè:hI1ˆ‘’tŒ=ŸÙø¿D2I8db2#„I¦d?ùÍA‡`cgãvñô¡›$àÓ‡«e\J¡*…UÜ€A59V3ÝMHïN÷ôÛ­<}«ª>6Ǥ€6TQó¥?Öï}í[¯ïýnßµ=19$ÁrÒŽ “1™êìMwü…æK͆‚*¬‡±H l—•úJÏ Ž±°”Ïs¯ÿN>P|„Tè‹£ªÿa äÛ4ŠyÁŸó•$…ˆàèaªmz ÄGÂM‡ÞZwè­'ªÖP–C„µît÷K.»À›9;c²[œ.†"ìÏ}Ü[EþÔ_p©®ïüùþ§yF´‹Ü¶²ÇäÁš‘øNM §n€ðe™à Y¦êÃêVU+“c”“ˇãABn÷f(giäîy³ý+ƹ…ÃmóGO¾Ÿ7Ú1ÿêÛ¦ƒ• _\5ÿ€—R;ÝYFcœ—躟¼0Óõ§r’]9ã=9#Úó'­F•lŸ3yzaÕÞîøšÌV÷Ú¢Ì[]÷%O³Óžÿô} Èb'NQFwF²‡ÒÛùþVªÞ“UL3l®Åææ)^î©ÕîžÖ­P)#ÇÚÁža½ 6‚Ä›”EqáÖ)r-Œ‡ô–wßÙüÐbçç¯ZÉý£¿A‚¥ÄÝ”l^Í‚²}ÝÉ÷~Ò¤êÛTÍ RkâZ¹t=¤«ž!Ü‚¤:âGŽþÑßúv‰¥J)V¡*Dî‚KÈmj¬ø5½h²He –g9›hgżcGOÔûÖÈhšI’Éä=m/³1Ó£££dHósÒH&&¼}ØÅ±"M ŒKü'ûåÛÔ}ÅñNêÖBBâ÷½¾¾×Žc’”òÚ´ LÐÈèD»N´ƒm)$Ž?Ûy”„G71±R¥ ¶•jª*¶µƒÛIJ¶0`BbbÚTXÙD_ßÇï¾ì‡ãäîKhš[þ)?Y¿{}u~¿û8çûùâåfóâ'vÎjëNÒ ét¡„Üò1´_"9y×ÈáǽyîÖ•…=€’èNÐþŸ¿ûåVjm4V9– Át°ÈÅqnEòÑ §$´Ü/?˺d±q÷ ¶ð€|×®¹ª*JʇÅhǵÆ¿Ú"*‘ ¦yß\÷Ÿ{D÷P°$G#¼A¢e|°tJ:„øƒ}ý¯mÙ@X‰Â#· r#¨½s—Ð|üØV¬„°ùG¾¸}ãWˆb¼Ì\F`†Ê*ìø»/ t …NÞ|}-¦Ã[~ü“o_ipŒZœ"v°Œ‡]–¡`Áf9›õe ]7ªøã~äØ0O±@#ÿCãÆñ®âɸi2FÍD 5®éÊSût‰¨5;ðl&ž¯ödÏ.9_0z®p,fš÷ýœ[4-˜ê×EKfbÆé®¢lü™ìù§¯´9pJ¯ÕáV+®«:¾T=™asÍ?-ÎÆóÔóK³ç‹S±‚ѨVëÔØ—&cÚ‹'Wn|®3—™) T½ ·˜qâàç9¾““êDÅ•+ !è).ˆ>Ž¥ä&Eô¦Äæáá}¬¹0ؽ{UÿÀwy¾MägÒ¡ƒë¬D¹Ãhzÿ½×8!4’hpÿèðKGìøÅÉoüëÆÛ£Jk2¹7-uÒIÿà ×ë_ÞR}ýj`4ÝÆ£:è<ÛÄóNàíDœ ±ÈÿÁ¯ßx®ÜdÐhl6›Q_m%©d3Sê]ƒ©.0ÉÂxLFE2™ üÎ~À3êûï¢,$‰i,z+Ä GÁ•«^Nr*Š_LvŒÊô°GD>E ‚Ê#Þ~gÃAPrrEr!3¡:ã|_me0-# ³Öj%Hƒmͪ¥/¹‘‘å€"’ §"ߟšx¯"´Cëà¸z¸ŒM60H’ÿÈ¡-C1…[)Ò´²ÿÛM@‹ÄÌ™F„ÿªŠ@{ßB©ýLr¨¸d`d$páâ¢Ä@+ö}æœi©g€£< ïkÜWc'uD‰½;þ† ¿ÓÜDjõ6Ìa6–‘úŠ]5ö¿_o¥p©é© ëáàæ~^ËÑA 1Yô‹\‹,DX®:@ €DJnã“‘kK‰m#·ÆS96ÌS,Ðȃ#]:Ó§QûòÕî'Õs‹ÕnýD¼$Ý¿hªÿ‰‰®üì™bµ»p:–—é-ë)ëŸ÷ý¨±%ãç &?ÑNDujËÆžžúc!ŠSßÞhpà¤ÙT¢Å­55^pçã|5jœk~9fÊöXÔØ3™è™^íÄ'¦l¬P=«U»ó¦zñÏ>®pÖËÌÜb;F(»™Ø¶»|µžAól²!%„y:s¨#°0 í„"‚Vƒ”ZV¬ÿœ>$¥›XÆÍòžÓ§÷”š6¬”ÒU4ºìŒÔxã–ÇY»žÒ–›í¥z»Ã²lýj|èb]Õ3BÝ•KÞ•œ'µŽ½¯b\²U”÷%i7¸ †©—d`‰È7‰Ë.5­Y©Bš+ÌFŒÀÍÇú³œ¯T§8daQÜN¡õY)ì•í_–•ÃÉa`‰zo¡Qû‹›«-&« 3}zËI³õ²Üùá{ªËµ”ECY1;aøÚJÍG¿Ývår’ÀI5Ë|D[`¸È±~AhäÑ> Jx_ˆ?LG8&(IÞYÃ…¼jFÌÃx$häÁ‘ÍÄ5“gó¦c‹³½EÝÆLœ˜ê3ÌÄó&Ϫ½¤ÓLGó'ºò&{ò§úÍ÷~Ô¸>+žè)ÌDµjT;ÓûÅôÈÓ-v NáºüÒRërì 7N¨˜¦û—Á5sÍ?Ñg?•é*P»qµ§P°'Ó«¹ÓÌœ—Œö/úݱ꯮(%õEåD®§,&rÝ*ÃéÓo&èVQ<¸íIË~E𳉈"5ÕɰM²âFœK÷K‚?ò ýéûUUz[A Û7Û“(4̆wÖME8ø‹³b`t ¥frÝjÝ?†}ŸÞ nÛTYNØl¸áÙØ_¯F¸dŠt¶õñaY "”ó€Ð@üˆ ¤•&†o¸0¨\¾ÌJ-+%­¸ÁdÐéÃÍ¡Éñ `’©ÉÌ£–—…±0þ¯1==Ífa2~g, ã& P¤ÔjÓëë_ Ý‚Ð!ra‘ Êb€ç< ¨?Ó(ò!8)ð!¨ &é’ÄÀC”œŽƒˆƒ”Ã!HybÄ}è/­]£Û¾uÕºªRQ0ti?«Ô_¸àÆ0#‰Ù)SÉoÖqWmƒP¼÷K.ñ>`‘ïä™6:¹w쎗i’ ä‘÷÷úI¬Äl±`fÁõ¹îAÂþ¹n~Ö@Á*w!$w °ÿ›7¾çªÛPIêìÅúßœÚÅÑÐjZY©ºfÀ^uu‚{Kâ#’àaQð³/ÌF¼º¬œSE©ŽcBHܼÕþÍ/ï²ýòT=Mw¦F Ú'òí2ßœ¢›’ìnY ƒ½J§ZYÖ sÄEàÅqBƒ ù‘èçG}À*ðÏÍ™²—X ‘ñdÜ0ÇáæS½EÙî%ÿf¿Ìc£¸î8.¥R0ì®÷œÙ™½llB¨Ý6д *„£ ©ÒŠ£|ïmïÚ† ©UT•$jSª$U)Rx¯Ù¥¤’пš¤RªV@0ž{fgר»žñNcWT¥TT!þ#<ý4;3ûæ½7oÞû~??-U§¦MÚyídÝd²^Ë€MãZÖ©&Mw}Hg5g­äiIƒš»ïÚï¼O6×8p/îñmΗ5‰–S ÀHçï¸}-õ€FZ•¼µ’©×FLZÊ &“uj®ú-§ÍS#µZÞô÷“Ë·?æ³á„×çtX„ÝGX£}+ÿv%<^ŠC‚&³{en˜ÿ&ÓM qALpL_‘Ù'Ñ!‰`nxíÕî–‡ûÆ×š¯^ë¤øþ£GÖãV¬ ý /z¶«ýÐѧ6m]†¢vóó‰­›–ûí­>´·›ß~/ S, €äB6/Üá~Ä0Ïw3Bàâ»Áµ«—Šxq·ßíuØìƒñ„:¥T«Õ¹ö™{å^ù¤LkÚ”ªNÏœÏ.NB€œM¿[ÕÂÁæl ˆ…¨ÃêAÚ·m¬¿òáPIÞVîÉ1ýàV‚¼Û®!‰1–ŽrL\`‡9j Z`B"dänŽ9,Б y·H=+ð{yñÇk¿µ C­„­Éº Š¡µLé9†= RÁ#¿ãÇç¹lNÔ†'óŒ\ì(2Cw:žÿ‘Xêyâ1·Ep;êq,Þòx%GahÌÌ(½d¡ ä™ Ííšú4šÚ¸f¹Ïiò8Ìf;ñÆNª´ƒ£[ý:a÷>½yÍ„eöÇôJ{N'»pg´~wÓbfFëDº»ÀAÆZ4W.Ïqƒçøˆ™;À{!‘ééè¤b¸>šíe…'ÆY>NKñ1¡4ð‚Ÿa3˜–œä£*ÜËÑaQd…NH°l/è-¤™Ð¦ÄE$6”%Q1†K°¼Þµž0 ¸)²0WÈLºxNÏ%9Ðja@ä"ð,%wmÝ´GÝ~ܸ¤q>ó§Urn¾–®-§­ é÷™L¦2¦*iRQ²‹´” |PM!´\£’5êè’k¬œ³–Ò†rÞ<‘6LfŒJÞ2‘4(¤ž…j3Ï+Éú*i¨fAhgµ³F <=­_V³æJÊ:•A*dc%k˜L7”S%cU3àòH…ü’’©QSõZ²± cƒú¹E¹…sŽ+ŸsTÓæé¤MÉ×S6ííãã‹ÝˆËîÃ=j÷lø²ëÆ™:-S3}UÈz5ýÀgÕo9[«’uĪe-JºV=ï”R­§"÷9\Ë}¨Óo1/Æ;,øºÕí.Ä(¹ØV>ÍÅ _à})Štç-¾ƒ¥öEp¼^áò{¶=~ÿ{vé›Bî[âµ45Ùfä¥ckıçKÌÄìêÚýH‹»±ÕÛâ!q‡Í ¯ß*Ãwª'Ö6»õ„Ó‹!Íæ GwW•²6¥éX2“{Î*?ü¨Õª2==wŽt¯|q ,<àEÑ—å¿h¹ªÇTe:¸p»×íÁÂí4®û¶Pd\~az¼ÁbxvV>\Þuƒ»¤BìbAè/öKÌšš ¬æ×§¾/IA˜†ŠŒO$@dt`£ƒE)ñ?Õãg# WþÑ»ne{«÷áv§Ù~âÍשþ§7>Øìs¯ýf-tÝ’uÎaøž£G6»¬nÌnŒ„V# Üž"š¥V¼ë”ø__J p,’h/¬‘‹I|R6ïvàèAÀ6ž‚id¸Àì$èÌÉô \  Y¦£ t_B7¤¨8¹‘¢‚£Çºí$* êtÊ0lŒåúqpŒŽÕ¢ˆ|pT )½5>±¡›£Ï½siwjä{éäòä®|fg6õÌ9r;™Ý¶qu +î¨]ŠšÏþò‘?¼ì¹üÓ¦‹ÇL—~¶èÝüùX õ¦±rƦ¥¬ZÚZ>g PΕœi2 ~gÒH+‚:R£åªÉEʈQ#ZÖ®»° iTóú‘4•S Ó9K%m„PÎÛ&sæ i.§MŠ$õÕÔ-3ú÷†‰TýäˆIË"‰ü¨#óµÔýS¤CÉ!*DÖ(¢d¡AÜãÁçJzž–uOå(díÔYÓo5,s€Å:œNG“™8qÀ&Ãç Í0ÿ•L­šþÌú­u@#ÊY‹–2”“óÊd]õb3{ÚŸÕµ® AlY Á0ÇÃˬ¯¿²M˜o©[Âv ‘›×ŠÂa‘ST°±$$ú…±k‡eñyø÷‹]~Œp˜›—>ˆR"Ô<ÄÑ]27|ér¯ÇÞìEq¯Ëì±û‡â«xi€¾S=ùëGñ ë|„Ýírº0—… ˆp ¬©·@çEÔ™2ë³@2‡–t¯|aËô¿ d†á|ZQuQ”X$èoÂæÁFÍøú5ΫW‡Kò~`†ý!l(Ýmùn±¹Ûî{ 6¸(Kx¡SزTH{DvØàúDZ_ïl[jÙ²y¹kؾ£åÔÉîõ«Ü^;êÈÖfßuRLoáVøýãmK:¼g×W]V‹õûÝæã¯íݹ£Ý‰˜|.#w»KÃ’0¸ýÉ%͘©½mÁϱ^÷e¾üšºÇ sF#3 q ‘X@²(ÏDd1.³d~¾dAê¸^Ž åAþf_¥8G‘‰Êü{3\‡yº¿øOöË6¶©ëŒã¦mbBìØ÷õÜs_í8 ”v@¶n¨-”÷—B»–²Aé`P $ÆŽBMÕѶij¥jS¥µê‡­[»;vØ*¤}Ø4i“ÖBa”Hìë{}¯í¼ØqìÜ=&š&Mj%$J>ŒGÎõ}9G÷žóÿÿžL¯ž ¡™†çá ¦OëPovݸü`x×ðÐÞygOß™ }gž ô¬Ù±½éémKvl_¾~õƒ7ËÒ%70Åp `=ó¢ ‚€1vI5T½,à7ÖÛ·\ëfkš›€yI!¡#`®zb1¢%§m©@nú®gç:eÇêúÃß#N¶Ê§¼Â¯Û§ÝF_}‹`¦j­Á…Vd^1”Ñd˜,FèÉ'àÄtœ*щùcñšñ„c¼Úg ˜±„m,±°ü¾Ã¢­ ÎRôëãá¯L%”Γ…89³†ìSçíÅáE€C¥A[%â°ˆ9ǃ{œÅp5ÄÏÕY±¯UÎÓ¾'i‡M’EÌSìÁ ‚~¡¾wûáÊšÒ€}:Aß­q ±å0©ÃŠÏ/ ~µ[0#*¬»vNôÿ ‰ajy…¡¼Â ¼ÔqxeZëN¦ö™¦7gWÓ±¢ÿúÓìËfý h7?óMúÔÔÑdò…üݯ°f\-CÉ|{R*/ØÎ¿=»CæX™i”h¼{Ç·3æñ¤ú\V;y§zbdƒÿºÚ»u£À"vJÃ!αwßN=­YÿAÙ‚tÖîÇý˜“˜]„UN¶*3КcÛºm˜¶³Œ]ä= ‰6®W®_;©i^Ãðëú@¨p¡8Íh=©¤WÓÚ¾lwÓÁŒ´ ØbÀðOÖìÇOßð™£êá_¾±A`´Ýå–\<#|üÙ‘dçþU-Š@È.QYý¨2Biój{ï{Ö>æüË_½Z&dݦÚ{§óÉ©éäá|ÞùJïƒM‚ÀQˆ’ÁøúN®VãšáÕÓ]¦0thˆÏHÇÿÈt`J£)¯fô¨f‡·í[")³v‰òc«›1‹eÄèíY³+“ ¤GƒG÷7¿ýÆÞ.õiFŸªyu­5ov™/Á¸#©CsE#šê53~Mm‡Ïs¦?j5v íV/d&2Ò½À*@&zÚ›3|¦æ«öÕê»2³ÇÇFSÁô­Î?ðýÁþ?=µêåÐÆgŸùæ¦MË/Ʋ[Fˆa(§„(…#]ŒÃÍØ=ðù±Ä³R@#w4©>¯ôÝé|&3/ë©v#Ófdú~ýæ6¨_ÀæìY¶ØqéÊ‹iÛËvçŒ=Õ£©]šyð‹ÕÞêíûßCÝØõTJ øÛ×ñD#Bµ"RÜœûVª fj²-g´Ñ>5Ù•RO½•Á·ÐR>u´Š/P¹¹¢‘¼È™AC T'“ VyÒè5Í´ô\®#ŸëIŽth*T‹'R©nÍèúôVpøÂ®wßÛ}úÔæç÷,rë2«¾&F€{»ðÄ2´ö0 Aâä*tÈ.Z8„%Q–xIF‚‹\ vQ\3’šsÃí4+SŒ›A„XN¡‘`›¶¥9® ‘ãy5ÜNàWDF2Ϲ1ö¸,3"´ Ø%3¼xBceÉÀ3á–œ®G¬s€BnQbE´M¢ë\dM‹L­]*?½ò—v×¾æµÅ~N|ôBp–âŒEVDªòI„­ 0Óa¦aJQb:æ¨$ìVØa… k†³±£gÁjkæîqNE™ém]”1›¾CŠ´k Â6šìÚ¹ p±¾ò;›5h/Ææ—ë­!jò©x   Gå0Y9g·â¤wB[îwZç™j'áøÛ›-ë[Š^¤ËaYBK=bÿû’©@6sl<0ÕL‡š Z(5Ú9–?õò¥“ɮ߿»«î³? PÔŸy¼·wå£`EX‚Ô²Œ€ª'­ûòÙŽ¬¹?› Ý©žöW÷£áÏdúÚZ[$@yô]"Iabr¦\™u„û(r?æ0ª@R©& @òÚÇ×€  4/²¶£í©úu£^Mù7ûuÅy¸RÕ(ˆsíÝó›™=èâÒÆHBRÅ…€Aà‚Á¥Ü`l¯½>֋현˜¤k;Uª†¶ê¯6ª‰ñMI´MTUTjSZ%)ì1÷Œ¯µ½¶·ïÄí"!ü‡Ñ«Ñìjgö›oæ{ßç…Ú eESjÁ!–IÔJ1Yr¿«›®„U ÖT•,•ǓŪÔÇÊbÒ!E=¦h•’LêÁþ¡“>w¶_o}ä¥X²bT?£é'^?³ *¸— xq48°KÓ#ñTêr¸ Y=ùAW^»×ñÄ>¯IM”‹1˜Š°¬Ö¾˜Çq É!–#˜ÊÐúÛ±°e¶dµ!¿fêu¢zä+²ä h^îdù€YMÄÊGG+’R0)UÿäÝm+ЇòÊ,ÍlŠÚhh)yJ–¾ä‡rDVCº‚äfèÖ¹pAI ÂñBiD—^•âa]­ƒÛOŠ•Š^cŽEbÉRY«LHšyú‹XÍÕk~ún~CdcagCîj?ÏðˆbŠtí<탄ÉðF‚ßç¢HVp;0Ìíñ Žó»0?‰hÆO#ž Áò08B$ÃSre­âí/¬wïü>¿íiÇö§ms¿ÙOþ¸Ðsî\Ss~Ÿ§¹ÐóúNú\‘·iÝø2ÑTÀ6íÉ~k¯p®(»iÝîhßI´ív¿±ËÌcŠÖã»×/?‰^xÖ·n . ÅˆYæõRœ€†<át²$Ãfi.YCq .ÁK<ÎzÆI†"IÒ%ëu"ãIFÀ¨Ç¶5×y|‡£á(~µùŸü¦öÃØÔÀò™(‚=öôà#³Îö.Îô¬ÈôdÍõfÏöÙÒý¶çÁޱîGf®e¥œ—¸ Gnzíã˜ý‰ǧ¿&ç†ùÌe€-Õ³hªK,™îÍúºþ¦:õ-Ýë²@ÒƒƒIÒÝDf(Ûǜ͢#Óíœé]vëJàÀ‹4O;@Ë4–ãs{6ûÂùíñx•t»jL‚´YchÐÄE ‘‚Ò­…¯„á›1£!–]¼XðÔh5Ïx0×JÁÎÖXíóÿîˆ>Zl­n­BNV¨bͽæE:¥‰gÄxÄ0‹?ÿwiyÙ3>Q.àD“Ôæ¼MHþЂFþÛœ>Ünv³$ I[{CÓç)b… ÐÔ’PpýˆÖ”ŒSE ðª2ôðü ŸL¹ ߈íßïê6"5ɉZ]©4ÍJY-—”ÈgŸÕýñO¥Wz^ÿkµ"ŸM$+uóLkëó½”§r=ÈñÛË»”Ø›ŠTš« w粎¥{väÞ¼6Œ2M J Iò1E< ¹×ñhZ}Ñ—Jk)âÎîáƒ[éýé—¾Ë}œts<>ìBË# >ËóX€wù¼´]*¢p–b’ƒñÈ ·¹Öm/ÚHœÛïz?lûÇElò ŸôªÃ\j›X6Û·(Ý»xº?{r[p<àÈ /ïvÝèv< h„ܼ7'›}»byæjÖèûÄì3ÓÏe³f‡ìS½ËAq_Ûÿ‘é>€dªÏ²Ð4ø¤Ï 1ÑoÏ <šéYPI]¶ÏôËøÐ×Zºníb±%òÑ$íàÁ57?…–ªÚ7C¯ŽÇNŽŽÔÈRp!‰‰/‡E½òï7JûºËjËw¸áüJ/›õó÷ãM£JKºÒ(Éwí2î–O¬vR†¤ÑÕ M+‘䯓ÇÖ<ø|¶‡÷3ë¶Ä*07ó"·…Ûæ¬ÐUmû¶üù—ÓêOiÿñÒ ©Q“ÊÆäS´V¢×ªjPOŒTÉò)]ŠÉ ˆ©7Üïê&'ÊL½\ƒ%ñúΖü kp¯‹„†ÓO1[r>¹^¬jûE©þGÖ²w3öÇ|Î &oÖG«?þËñ®·7'¥j]­ƒ9¡$*M-¢+aU?"ßûxDµL3BIñ¡œUÕSI±¡øhDûx½g— &ªMµÂÔª%%(«õ_‘=þ?þw¿Z)$+C:mJâírðRB¬I(g ŸfæII,ð$âu’~R›ŠXe=#€¢T¢(e`«Z ÈjPQÃ}t´#º¹äÄ“[òßñ0u>ãíÞé.ïX?Nu` ’î²§Ú‰) G›k¼Ó–jõμ³"uÞ?iÅ`?Ù‰ÆÛi8Ñ‚M”MŸw¤[°¹vbÎjs¥Ú°T»k¢Ÿi³Í¶ÛgÚ1Cª ¥¢nãëô\¯ã®•S—~èzëöx·%×#а¾¼, áÅÒÄ—SaÑËx–`BŠæóÈ2 šá?g;·×Ù׈ߺäšþ ;3`›°÷/<pü‡ýrmë®âøÄhmÓ$Žkû>|Ÿ¶»M›>Ö¡i´ˆ­eÝPˆµKÓ4ï8NœWÛt-‹Šš8q›†6T!þA š6qÜôb€* „@¬¬LCKãû¾×o_¿.Ç iZ&Z¡]Ýë\ÿrü»÷|¿ŸS¼Ì7ˆ;jwÑ•ðúìݶ5yc“ñóÊâM“6‡'C&ýúã™+˜1g½_ÿ7ýÎ „Mz¸,{½<½°Q—C¦gÑ¢9zܘ7é![ôš=¶‹Ÿ{çÒÞ=µ6Öæ¡X §­$IØï~÷7ßV?Ï7+êII>ÉsŠÔ]èžEáÏ÷‰‰—¡qº÷9Èr’`FÎ×G¤^%®/©—:Zk•û¬zƒnK­0³‘®˜æ…s^mi| :ßÅ8« €DDð‚\.÷°=éQü?Ga%3ÙìêÉ¿#k¹B,«¯?‚  ËÒ A0¨³ßKÜûè x7øZ,ÖGEêSÄ5»à¾¹˜pVüŠÒ!G^•ù~EèÅfèÙeé•X¼•¿×ÍKÞãÇžwºÌ$âtØé’ŒS‚@wmõüþM1íÔÝ»m_¨³:´š`¿¸k‰;ÏÇ”xg„óqBçý+µ 4d¥Ô3¼Øù§÷Î<é®7©vW0HÍÞ>&È%„“ùö¸Øõ°¨`Í}æ{Kµ±ˆ­’Ô`©ª^QlçÄ“²Ú³éD¿ª E¸.AòªZ³ ¶5Á0gqbWDîŒhª< J~Eó>Å¢½RdèÖÜÑñ³Ïªº®gP„EiNì±1NŒfaªŸ]A_¬6­–©xá)º­Þ5ú-v¶™ºsšI\ù1{&H|j!¤gp-hNLb©]ÖäÆˆBIN’ñ–™†{P=ˆæ&)=@eltÆ“Z“Êä ¡NšÓcdqbGt¢ÒÓžô[bÂbc¤*6…䃞Ä8žœ$`µØ8¢É)45cKL™³“tbŠQƒ¥czžC`Ay[«ÎÕòYÍÒW`åêcÒBޱß[±osùr“ #)Ô»A ¤Ãκ)'‹4†Ñ$N’X йa£p0Ìž:´ùòãêÓž.Ú¡Fý¼Ð£)ƒ$šâGš¢Ü(Ìþàð¡Í¿~×§(]ß"Чµø÷®MæºS1¿éIÄz%¡w-hmÚí$«;ëdœA¼xàùDTSÈgÿ$«d’/! Ÿb,âQ|æ€IÏå %ô(‹EøŽÙlÖ(ào (Ž;˜Íêp±ÞÎ/Šd¹ånIì„÷\¨æ½÷À]R’é~XUe©E;d±O”R M>wºoà º½Ããn?¾¯­iK•U;Ü,^÷òÁ]K‘ãñÄ©+³‡8é±ová/]zIT|à­Šx6ªݯ:aÆøÎR©RŸ: vpË烾öŠÛl5,òÄúΚÚ+-ûUîŽF þžÃ#öò<ânUî*ÃÀ~«ªÏ]‘½ eQõ´& Éü 9 G—OÅùÁ„è×x/¯z—–ºç~zäLÇ—ê÷î¤ìŒÙIWÔÚY±!&šbœìЍ!p'† Í2]Ûä+µUÏTL~ÓôKr÷5J.Ù:š¢RAü:Àsdztm—Ÿ´¥¦¬©i$ó&Ÿ"cAJ›À£A<1AÅÇJ$“¸èH\¤ãöøø¦Ä”)3NA‡>êŽ9¯ÃXµQ*6eIÌÑi2;EDß 3t:€òÓ,˜·Cf'˜ü¤+têã4L:`׿o.q}K[rãÖ\bäþŸidHà¸J#ƪ"ñ‹hbÚ{s×½àŽÛƒälS™ï»µ¿Œít›¤²S.Öåq0.»…$I@8œ"1† XØIÌIØjìÖ:þÈ·ûÉ;oáéY´2ë¡™ëåÉkëõú5€ðI~®Â›Œù ÙÅJ=\¦_Ýû…ɸŒWIcÞZ¼ºî¡ãÇ'°Pª2àW¬ÓçÌ|üÀWöà Ba˜v¢ý%$¾È­¹Ô|eê²-³°)³"·`-.ØŒ›U‰¹õºþh¸2·ˆpWvûmf(’¦IЍÄìv7]*¡ñ i@†#Ü k‘…^h4hÀRë‰~Àd²¯Ô’ÜãÕTH ú`.Á)]rÍQî4tè_?<÷Õçª)l}gÃͰWVŠâÐÒÇÍqm(¡õòûø%¯¢œ#çÖÒ?ÒÞ²ÛE$Rítà4…>÷ìó†‘2ŠF>Ÿ›(yÄJdázÅ8Å£ø/c•láJëºñ/)…îõ¶3 …£˜‹vWSh[Ëö{B*Š€ŸŠ¸Ð{oTëÐ.©É`”mür§"·ªò€,·B ²Ô%ËÐ}ïÝ3$†mߊÜþ]›&·÷~{û(e·°ÄVÁßÿKÏ7ÇÕ #ç>Q»î­7Dñ5Nl‰E{U©OàZï››Ë P˜À·Šʉh¼ÿoùŸ~ÒYCma 34øÈ«ßà俍tVáלMV‚ú•$Žšê×”Sð¸%Á)Fz$¾§¤ŠP°4d >P˨e´WT½g¿ÌbÛ8Î8þR´6lI´Hî.÷>È¥ä#uš(I›ôHÄ~háiRqàIœØ’eÔ­*vë 1j‹\î’rH/ qб.JJ 4})Æ/ŠºEêÀ’x,¹ËkÉ]rÉí'+̓!-Ã/| †ƒåÇ™™ÿÿ÷­gºÕ\&9ùÎR÷ô™ƒOê r(Oxv7Ó‚Àð,ÂRþN6ıÝÞÖ/3žïÜÍ8øÀ¥£í qÉóûêñ½¶Ìš¼•i¯%û™°%_5ŒT¢Þ’ìÕw~Æ›‹{¶2wàcÚWž&(UŽ3…YœáŠqÁ”p+B6£¬#ñ¶ÌWF“ñLœ¨I­Æ4jÉûTà/*2[ ûíkÇÉbÜÈ‘—E5&Vföé2 cÇq3Š™ÆŒpÕ0oI|S%X“èB1dÌŠµ0d¦U>‘F6hd3jŠ0@8F/GQHhÄPÐHÁ‹ uí—æ^>Ì~ˆÿJ€„×ËQ,dI‘¡G8ÂÏ `β,As$Iv‰èñGÐß±¾ºÏ^ÜÙL¸ìÒHàµy´¶ài®xê‰û>g–rXglÎ{í««¥üàg7ÏÑ\6”χҩ^pvU;©ú.½þ\ÀÇ€„Eé¿]é…AM½íøqSÀþn&èa&5¬¦‡³ê 츖š,d't5¤gO©™z®Ê´äzO:;´šì}ïýgñëÇ¿´kÿŽ'I‘¦ü¼@(æk÷ûyQè Îù÷Á€x €?ý5òÜSä[SÂjL((+ÖfÉm–â©ÆpC¡KkHBM›ñNCfK]ŒPÀ fŒµd¢®léòå¨PØá`í_W(ŒjÄg†i;ê©ÊH^!r ]P(3âuη8Ó;›I œÒŒßˆ`uÀ•È+BÙoH@ju¦Y{šÓ£„ƒ„˜#a…8$AK1˜avÊ2Y”ðbË…ù \¹€Ty‰3£< Õ'âÇflZ ­Gè’Â[3"DUáŒ(S•`É\-¼Ë {j2mÅ€šü0nFiXÚßÏ"s'Ý/=æyò~ßÝ,.´Ÿâü$#ú˜ Îú 0PàEFpžEâÀ—Ú&+çØü¤³Øî,ì¬Î·—i;á1íåWi±ÕH´Tç]ö,â̳·?n {µ—Zí•]Õ¹˜}n{s¥=óþ[](B3Ëuø:~zwþêÍý¡ÕÙ:uy[3ái,ºyŸó;Ì™ÝÕXòçÅ[=ç2m^þœ³ŒVߨ^Küü«÷ˆPòÑ´_¤¨ Žl?túàßÇ Ú; ( 6‘ª ¸¡jz,µ6©i’›MÀcpg“™î\~,•™ø`mü‘‡ƒpDò9ÊÅùðNÁ;9ѵ“׳/´1M ­¯uëzÿV:IukzšêÿåæÌ>ŽCiš 6í‰]Ûà¨^?þ¼Óî´OÙêÈÎæIö‘hÀ²ø`ï}É䄚Ð3§‹Å¸Ðß@mB×>2ß[í’ºÚ¯gÇÖ×&Ͻüе듫é!­8ü¯«ãZ¶¬ó'g»ÊGùÄñ>šSG «ã…µç‹úÙ±ÉG’ã ÏÒâÑ‚6’Ïç´ã-¯M¦’§òZ¨¤OrS©ëŸÕ<ÕÔ žÌ`âð~ÀÓ¡“R_Ȩ£G¿W¤™NA­øÞc÷' ?H«·žâþï€W»‚Ê ÔO×s¹“P å³ƒ `°:G55‘JN­®M¾ûî±—žøî7÷w’8‹’Í1 EÓ8Í`,†ÆÒ(Cu¾Gw»Æ ¯?üÇ™öd˜*¼Âæãx!†—bt!Ê›±ÝÕ˜ßýÐ/ÈByÆ_³†ŒÄšFjaÔ–+BšaÒŒ0Õ0[ ó[¹¼aëJБ„Æy¬.y­¨ÛŽ"NŒÙÈó•¬Ç+Ù‚Âé€Pgù|¢—ŠõýøŒ4@RË”{ñ”ߪù©È©"±§Xö%ý|ÆoOžäÓn[Ö猹s«éýÄt?5í›7å!K$üdð4ç~q—ñ'^G±‹Jx¨d?’<ÅMð‡KÿPƒß¬%nV㬶ÞjÄtrŠ× ,Õ¼4ð€á7Mv/Éú¨˜—’=ÖÄéëü,<’¤—Lù¨´ŸNø)ÝCÂRq?£úÈx€šôÓS|ò$’t#q9ÑKAÅÝæ¨»`"`IõcÙST¶Ot[cýÈŸ:_÷½øðâPÆA°… G9]´]ÀqDJÀMÅ òõ•¥þrôÃ>F°CyÆ•BcOšõÑ/Î9~W‘L&á™Édàvu´µý Ï….Ù²‰ºw§ ´)8V+ɇr ®MÃ59\—FµGLòdUR«/ür»‹±ÚÙ"†ä¾»m%/´£Ž—–Üþ{S8صv9jcì,Å®YëÜÒÙñÍRêàm6š®¯|Y6kZuH)«Šé‡¦ ~ÈœËËeÖêW•J)Ø ‡š¹V’ª¤p£nãŠIMáðþúºu%%´ÕIJ$¹öKÈxøí9ÇÇ LY4Z¯ª50¯ÔH³"•Æ(ë ç/¼ºwwñše,Ì|³³ÇÒB9|)bãp{!¶ÚjÚ÷êßËþ­Ùí·k>$áE ¿3yœËvóF€Iw[Ò^x#î±ä €gúéL 0²ûJ+ÖãQθÑhOd¢Ï÷šLÖƒMýW¾?›ñ>2áÍOy«=Žsû¬oo£+6Zv¾8ﯠ¯®Â–ó¦RÙ´œ¨ÝˆœÛ‡þõ3(I¦OXõ^tßðó÷{ë±¼¥˜µˆ0ï^‰H'É^f"àSû_¤pš&hŽ„©O1^–v ¤KÀ:^1_­”ž¢L/?Y€8{ÿ¿h$$'éT7“öÐY;ég 3^2íß ñíá"=6¥×1ÑëLø¸”›šîY`ôfzð ­{hÝM$ÜHÖDý¨î1gÖÌ)졹ÚÌþ¿eU„ÎEÐÝ$%М‹cm,Ž:i‹‰À¡}¾±Ì~du³Ï’^l /2.™æ?ËÌÐâÔ`aæªÕDŒ¡‚ñ‹BCIX, ‹Ñ¾k=¼¶(þ+“q£pz(/u…q©kDr /s=ÿLcÁFW¡¯•y8²ÀxßöÄë.œüpqrp!œ­1‚ů™ `cøÙȵ•Çw—®æx›/pÅÐ_v6ÿ§?+{p¿í”Ç*¢JÅÝ»5›7-a‰°<ŽýäÔΈØëÆÆkß=³“Çx–dœœéÓ{5í„$µªúî°øýˆ:³ [aæ«ò!9Ô¨(•ŸÜ©Ú¼-áì,IÓ8 7¿ª¢ôb2“ͦ3s­`OãsÙl®Ö¹³?¡I è—¶8¶¾"ܹÛ&†êcZsh¼\×J‘E‚7@ìÐÕš¸^ (¢*MO\%#»díHûÑõãÀpžaŠÌ{Þ^týF¹ª×ÈRͯ?(c10fšXÂ. ƒ¬€½lXçTõÖðXƒ¢¾%I]`7BRyX®P£M¡pCXl”¤fQl™½R߉Ê?PäªHdŸm}G 6Aƒß;d(-eH†Ç‰c]æ?Ëÿ°_¦±QœgÔ+€Ûx™wî™Ýµ×6ˆ„4"Ž€(mC”BEIÛ„ª!-Æ'>°M•#xÙÛFmÓªA=¢”ËØÆUùPE­RµR¥ë¹÷Þ½¦KÕ~©? øÂ«W£wf4ï;óÌó>ÿß_‘¢ú€¢t‚ƒ¿¹5zöýWûÛ…f§»–âjÀy4ð*Çq$M3WGÖÔ#vc-ÑûUúô#Ĩà©Îèä8G#ˆR¾ªì {júQb‚Œ…Èxʆx#Àe½Ì¢òg’~רs~»á³eýØ¢d˜!åEF€Y÷ `Ì °K©|ÖçJ{ì…0ÿþ­uUõ"'Å:qF 9"I (¤B,NÝÛ÷ª…x&x6LA ²^!ç«[|ÄËf`ìç ¤Å€µäG…w¨›žÚ_¾mëØh{¦†$‘ßÈp–Bõ,æ ¢X‚ip1Î õ·­øÝ»K«ùCêÙÙŠÂSº´²xÔ|ŵ½ÎbµXá .„~3‰§¦-&(þ–øõŠçñ¥çÁÍ«I¿b÷¿±†²!9Û7Vç©ýþæôJó eÎéKe±¹²ü,VšFÆYÜœZž¸Â¼{¨ÞÍ „q<Ë?°¨îð賑GUyÜ®÷ªò ,EÕ}¢Ú­ÊCòí¡¸ÜUÛ#wöu·oâÉZ°9'ö±W—õHßï¯õ®©±mò4¹êfñ&žÞ7Ð5*¹¢/éÂDµÈGW4y§,vêêž\?òÂsô]xCîäOßÕXìÚ£v/­Tú_Ò …»ƒ\.g˜¦Q0‹¹âÔgxœæé ž· ¼ñµ—+þöÇ‘DlLÓz4$DjhùA«aTÝ­€|‹°h+(».(‘1UQ¤®å­ë7G›œÇÐŒÂøÀä+’´v(IÑÝ?ÿõµ5¬Ýåà› Ÿj°=øüBd,í‘¥š²K–ÊË ôZ¿ªí x¾â1³»X–¬khüû'²:¢EßV¤( ªØfD×vÞ·¥¥6]íÖ”0V’´G–ÇÄ}’t0¥ êwzâD{AÞ-Ç©;éPbm²Þ-Š{¯ÎwwmߨTËÑC¢x’¤ ŒgP K:pK#ohnøá·-ß ¹2>+°DÚG¤ÆI3ì4}Ö´§:ÔbG­… ž  Ô¤3î«M„Í#öd˜ÉY)Lg}TÁKk~&ïç u.TG¹ÜÅŠ‡°œŠ]9À\¤ü¦mïVöµa­ÓòQ¿-áã“~&ÆM›õ4Dà¢ÓN PÉI«ï’g\$Í9iŒ³Õ5¹¬ â­d3él XE‘Í‚ÛüŒó·cÓËeV=d… ·~Ñ-°¤Ð×Ös¥q{Ö /¥ÇÑÖ–:7ŽÑBFÃßêpÛñÕ´ §ÈU6„  Y/0„Øxy>ÍÏæƒLÆ‹[Þ‹2>.îw¥ÃOAd’ãl.d…påµc©ŸVf¯Š8’DˆJ…ìp%ÂR~WÖË‚δ‡9sA>á¥Ò€daaI*[¢ÃÈz­é ññóƒìðû¦f‹@Uóœ“ÅII¸áÄA“NŽ˜Ÿ[Mx;œÿ<É™gÊÍY[ašHΣè‡U™ùÏd§ž(#Ìi¢0³¼8÷YóÂæ9,=_–¹P•›µ–æ,Źrcn…1_‘¾xÿÔüÂcÉKTé4nÎU‰Óì–g«,ŒÃÁØkìνoX¤sæÅ²üiTš'ŒùÏ™óUKÍSšcR³Èœ/ßÒâ H«‹^÷Ý2s¹2=KšW>_šyܘâ²S¸9³Ì¼dÍMY‹ÓLé‚=?Wž™]–»X™›·efV.Z —åg*òçmæ¬Ý8_ž»Pi^&23Ä=SÖ [˜±˜Wª®M4¯wÛä&Ë8ÁMQ«:ÚÖéJLëÅáO#£Š6 L’PÇà"l^]ùž(vhñÖÛ·ìnÛ<¸s£¬mO!*W¯m[ÝØÌ#¢ÞI`_Þ´šÂËê7‡qÛß|ZRöjz«®u*J·,õo,H]`ÓT½WVÝ¥"÷C‡â×l.DvÝþ´ó¥/¹æqÊæ¦›¢ðS§QÊÍü"“‹EP™ÿAeJ¥Bé©]û¤çP5K"ù±_¦±Qœg¯zˆ#v|ì1÷½‡½Æ8ÑB"¢RÒ A¤’ ’ víøÛ¤ Ií]ÏìaC›H4TJJˆ±×k{–‡&UÒHU?’0öîìîì9{¯§‰J¥J|@¢¢RóêÑjv5ó¾3³3Ïï÷g­iaQÓ¯žgÓnf^¤S" “ç$3Ð_uU;’—ÌꈠzŒâL -4+˜(¤å‘Žl[äÜ^þóQ{3¬g×qeFX3ƒëö¬\tpi'œ^²ly%q¤†¤7¯1i"™…òP HO6ÕÀ?‡!讵TÈýPzX:J]8ØØö„E®š6Z™š®õBÄÓPr±9§1å2&D"%y7•“8ϼ›Q†ü>éa2G¹”“R%*%’ " •6ƒºdD¤è¢æ%6gÇs¢1ïAÁ…rÇðô0’õ§±è!Kž@ îÔFb"£JdÑjn¤~(Yo¼¹ü//ÙìÛ„¬Ô3ŒAdP ^mÃ+αÎxâCàäýš¯27n,Stí,Sœ òg°’/øuêùû c¨6 ª`ÔÆ ¥qÍËi>J×ß-)#šÏN,ÒÆÊwA³BÚhâk×™ÿùäÊâïø]ó£ÉѲ”17¾ä¶óx+çÏéfÞ]\C`„€›xnà'÷©“ØEÂkTÏPÚ¢ù+s©SmŒÉûË3pÈ¥ùØÂ(\/ZšÄá>§ué1}ÑG¤ÏT|mŠMžª,LVܱey©‚ï©3Hòyá¸móªz3mÂÎBÖr²a{ùóþLô`2´#,¿Œ´çöÞLXñè!%Òu#¸CÍô„äŸFƒYi¿x©åáFèçK˜—7PÓS­×‚}þس|9ÊÜ2žù퉶Àl7ĽHpDë€z1ª,´Ü¹¹ž[6òï<%w‚\¾òê÷[aá«­¦:ÔHñ<ý›÷Þ„” ÷Ëœ p) ›ÒíPôÕøÿ_>'0r¹Ü­¯Ùlž˜ÿt‰ã(–á HZh[£­ú“Ϻ“ñCàAyW,œzQ ÷‚$'w’·©h´¡#ê•çz³ñXw$ÖRZ”xo Ô1ð³MõlYOëæG› IB/úvuíï¯äv9Ô3zú©Ù™Ã¡hs8Ú:nÇE·Ç¢=‰h(Ð¥Èî•„"í@ÂJG Ü61ñ<‹U[˜Fg¥‘‰‰aåèsàVwÄ"¯Ý­u¡ŸÀåÇ¢]J¸=,FÀ|:gã-Jª7î¿1ÛuþãúÁãoí|òQK-Âð8Æó¨™'¬a2Ðf¦(«@¢;¯yw_Í•W‰¢¤×† Y'q0y§1çÐ N> @wqÅ"=T¦ŒTņu©a$å6ľ™•èÜ™<ª‹;Ë N49‚âå_X®a?9L©#hÎmÍÛõ‰côÜ ·qyF‘M24KèÉXY q@}š@y?òŒ)íÁ5•p˜`*𜴇L»”ɉ<°>1dðlÓ38K1¼‰ÆÏ÷‘²„my©!õ¶ðùH´ÛlCÊH®N±ËŒKÝnK qQ{yZ¬ûñŒa(o~¢ÉZt2i‘P] ÚÓ ºŒ4/Ûº¶,ì©…³Í ;¤Àâ¹:†@¸«¾p2%;¢9±ð—tÓ ›”UÔçÅÊœ£ª4L¨N¼xT§Ú±’«² –k..3P–·Ãn:P‘ü ¡¾D¡(™T‘t" +I‘MIÌBy è˜„.(ÜÚHÒeʸ˜¬dÌ Víš×`¹7±¸›Kü•×,oï´lZÅÓ,båñ ¾ž`q¯(E-@ÆæMúñ×É, sjiÂ_©ú…)}q¢:çÕe§‘ùÑÊâhUqL7ïC `£tæ~Í[u·ldþ´I›^\ò¯½¯ûÏ™ ¥g ¼Ô¼8ê´se¹–hSºŒ¯¢4iÆÛÍS­(ùª. ƒZiÁFáÈGoUýhzŒÖÎ/Í{‘è)‹<¦ù°‚š÷- W1Ihcdñƒ m²\›Z”ýº6]•Eµi>ë՗Ε秗&OÃn`,èÛÈø75¿)åýVé,–ò•]óÖo]k!\ pSËsÂúµ¦/.·&ƒT¥;Ùá^ä°ÜÉ%=0'ï!Q»!Ë\ŸiõŸmYÝh¦Œ¸‰àWÔ°.mW”]‘hÿõdËÆ§X[Éáú7?ë z +B{!¼f¢„öC,ºe#ÿá$²ÜõjßÊz—›Ø:ŽæxÿôÓµy­[ˆ·™LæqŠóó÷w_ÿõQ¼9`CUUí_Bò×Ï>z°~5„žgYŠ_Ñ€ž;Ûõ+JG8¼T$i¿ ʹ¶PhßÚÁ¶XdÁ…fg:ã‰þë³°èëÓ{Z›×Ÿ8ñÃ3{7ùŒî¿xñÙ¦úFj™º —Ÿ<µåÙ§75Ðì‡ï? íË=ÑxW@n“CðÎö…‚=ð oœ<×q¯lBG0ÐUº¡f ÿ Ï­bQ‚X†™·omš™{9…Ý:•Ènè ±ÈËwoi˜³ ––oÞXè9‘@·Ü}ö¥¤Ò›éøƒwWËsëÌp4Ú=³úö|gÎ|ßùÿ>}¯oßVùZ+ö«.2#ë4ŠËRÌg\ÕkËzˆ´”šH»©÷÷p6¤'±Ôå>"3¡×œti¥º‚¹ñ†tº1ÏJ6éw>bÍúê2rmÊ‹ZfÀ8ši¶¢”Á3¦<@gÒ!ŠD¹gËš¨lËÔæd*=Î\]ÏcëêÛscÊ$SpU妨ËÒŸrR 7——ÒnSA®ÉNðËr“êjT=(ù›7$GkŠ.!ãij2•)ຜ̔K:!Æ\u±Qª X”O0–qP©1&ãr.ËÝÒHÆE'\ÀUؼ슇[‘…˜GÒÜÆœ‡(¿J§1ædþ~¢ÉÑjûn=fåDh-´h¬VŠ“Ísä¶fÊÓAöNuiæÁübmjËÎÚ¹*mƨ-ò • ©Éùšì’)¿¨Ë.PZÒ]_”zvYy–æÐ:‰àë8Ë#›7,þnŸß?˜ õ…‡Ëm-2¸ºµáÀu¸¼ÍÊ­Áp´óÄðVžÆÌ”ý›VâWö«êÞ¨r(¨t½ur‰ü†À‹‡_ü°-y^U÷)Á®pp | o ÀaPQ~üßrH`ºh¤f¹téùFdL8FS$ÝÔÔð·¿~ @¢KðyGhîÛ}ûŸVZ5pòùümÌõë×›ëͲ1„ (·¾¡æÊïû`цƒ½‘ð™êõ_U»¿lÕŽEûý7{ü·ú"ÑCp÷?®i{¶ÉLV‹Fë»oïU”—¢áÁÀ!Eyõ×§Ÿéµe±Ö‹¬ÀᎯxŒ1žr²Ùš]¯É¢æ“'ÒÆkWF°ŒGiôJ­[Ä&d²ãMЀ”u,÷ñ0 [r!U6òö|I„dÅ+¢æð“èƒvüÓ!:ê°Á˜”ƒLù,Q^t×À-zRÆHJ#挌§TÒK½âüÞL#D "¢N¿Øôá¹*çe2.©8jלlv”ÜÄÔ"‚`EÁL@d>-b.bÏ&Ñ ‰ƒPáq“’FÌ© –%LK#Ò´»Y¿Ô[ÿÛ~j©Ÿz¿Ã²»Å`çX‚3KtcÿwTÇm)¯>î®-º©œÏ‘é11=ÑI¦]ÆO‡m£OSŸ3\î4ø½ôŠ—O;¥ä0SônP=dòm11bÈ8 ±IÆïcc4›v– ®'A2^6+3…q8çni$¿JGq7•ô±Ø#é¨-xM‘q*)›Š.cÉAdLÎ#f=`ÛåAâÍïOÔó<^® ‹“²›h„qÐúCÁÎy#e«ç—ž¹l÷+?RcÝþàA¨ÿgž§$±‘0ñ"‡Dʲý±úO®^RãýÑðPp¹+ØQ÷ÇÝ¡PgÀßuUþn/˜:¶2ZZ¾qD‰ôDã/½~âIÞˆÓ&–G›ÉO®v9”3T_„3Ƚš,é (ûB‘E …N\Xêê9؈pœpËÒ Ë”¿xžªcpëV‹áøØ¿@›òc„σR.<5Æ¥e!9ÎÇ}(æ!à—ÜVÁrc(ïŠ^)ïfrNƒæÅóã”2†…O2Ao˵cöÂÏë’®u97žpò*ŒñTe=Äf[-ÉèEÁBŠ Íð""Þë0¦GLEo]Ü'&dJÞų„dçÉŒá7]S>³*W¯œÄr>}ÉMÄß2¨èEŸ0ApÈ-á#Joб³_ç±Q\wÀQ‹ŒZ ^ï1ç›ûØ]Ÿ Τ¡4©¤©PR·BJ¢âµ(@¨’õÞkÓ¤N©´mñ²6P£ªÿ´iÕ?* jØÞÝ™Ù{½'ž¾µ¥*jÄH þÃÓhþ˜™÷æÍû~~.KÑËädáCáÚ &8ÇÈ<œ{ÐðÇ\Ñ=@¥C ÏPP#:<<>|Ö ÃV~©ã \& ™šyÁp‚h2Òr# . ÕÅDÜ–´ŸÔˆ7ÝŠ.1å¶¥j`¼]^ª,p¨éªOßo>¼}å*Þb­ç¶5Õþ²ÕxË-–@÷A‘ Ÿ‡tÞQ=ï7æhÉE<$½´×’𛓣ˆ¨}X<•}Æ à5’óƒœ˹-÷]4„SÁ‹Fñt¹„‡Ì„œƒ8̸ —®Ø¿ÕdgÑÊ{N@ –f$H[V¡Þý5·Î™³!¬0‰B5åP•~e™ªž¿ˆè—¤G¥‘TŸ -}k‡@J¢dš5½¶-\7Î]øš>U;… téRmqÂP"TÍ•e['›D~™ˆ2ç†ðð8÷G‡øLs­1’eÙ†FZr´1¹ë¬~¹pbýžÕË­ÄÊ­f+êIl "ßµòæ¯êSSÆìøJ=ÊÁZ}ÊTš@¶_¥+•A»É0?iÈ¿^²úEQ_zçºxj`cjy†&ˆ‰F}abDéˆ%ºïN¿]B¬.›1µ *%®öÜû¼;‘é‰ ONíÕýÊìQ臱Ÿ¿ÔÄ6ÒfÖžÏ?k½3}xzº?ìýìo?úõ÷>w©Z¿¢½¡ªmImP ÷@~,^ù¿YÜ4¥C C“À\èÿ}K#/㦫 1$õâw¶gRéùòýÿ1É“ö¤}¹‹E}a†À–L&wî܉ãxE¶xµ¯úY EÓ†RéŽðtœÒ‰xÿâ„ ÏvªÊAH‘Tò'Pà=¸•¶˜Ús9–8ýÉ÷$`¡ÃÉ“-w£ÝjêØÇc»zrרé-ÉÌÐÌlwLí<á@g|k3[l˜+ŒØ2.6ë$õQ!ï&J^âa52çÄŠ^°:³#Ö¸_V¼"|›¿‚àtsE/ Ù5¥ùÉ´ÏósÉÑ&8 î»ñðûôÙ·¸—× ˆ€±“ÀŽ#"Š4YòdðU"ä’"S\þª©xÿ-ЃýêW•FŠA2è`¡‰àY“Tßü5¥_\^ºlÎO¬˜¿L•ƒd)´\Ÿ²”'Èâ¤ééuÉ1ªm8bLS£´£‡[ƒdFbòô¶§7NqúÄRmœë} «ÃxX;À鈳Jó$k£Ych†>kÿêÙ!"sÍžŸX>wa™>A”'¹‡íW>T3¥J¡ÅKxùš!Z¡ObúET×ñÓ'¬vÌlåL4jj”8Š9÷‹ܽ3A¢D»aå×:”èậ†û#ÓÝqõHT­T7÷Â"ZÛ¹³- °ðX©º[¤[·zÔXíU¢o‡&÷‰ô’§š ¯ë¥é™|áø½;•UÂC=´H‘/j$ªµ¥SƒÊ,dO/¬ROòB=Ãpd-ü4xšÝ¶ek1_€)K‹ yÒž´/·/2µ\.÷õõÁóȧ=L% ëÓÿ.A™Ç VX&c½ÉÀÁ½L¬`â(i£qÁ½“Œ¹©¹ ›ð1éýž‹ì~ß²~íz¤ÛÑ€;·jÞ ø¤ ³>~ÎG|‹SˆÅ/°kÄÜyü‡+$X@ÙËäƒL?8)õ<­{”ÁXÚŽ uF–chdf$žêhì{¬þe'•ãÔw´…±•…QêÓ¢uü+Õ‰&ÂjGA¡—$`zÏÜ\‘Ÿ"Š“Ú…·V©úòˆf~R“ÇþßuŠ#ä/zyŽD3™7mţ޿m·^$W{k+ã˜:¾L5“ à <üÃw ¬2! ¤•Ì$fÿK¼á$ “„zsueB \´ä皪*þZ[«Z¸Q!òSÚÂÛ+3Sõª~ázUò÷“³k,”ÉÄ­apM-ÁÙp€dÚh¤#•h„3J/4_ÙÜ¡Èì3 —<Û‘Îv||·y­…F<¤L?ý$÷ÑGÇ@…àäx´M‘{Fn±"BÔ7H”Áq´öΞD²SŽü?îÅ'zM6΄Ž(W\îm Ë­?ûé. «åh¨a˜¤¥ùh¥<¯‰|N#Ÿù±°ð¿k`$—/Á'D›Ã ’( Þ‚¾äh~hfúL6wjfº9›ì•CŽ”â¼ßîö†C­©T»錅O…Ç¢‰cñ%vX‘€¥õÅýõ&š#Ë‹f£(R‚(VÑ4ÍRV3"ß}·u‘š–JÑ“rØ¥D]‰xÜ%*C8bQg"Þ/u¸dªQûè’Ÿý¸O¼tmoÐY) <àÕ¨µp&Ž·!‚ßRCyÐÿø^¹õ zM¯^cÕÃüäÊ_-Òå ®p£z~¼Z4ÌßÀŠã†ÒYà £Uê­^_Vú&>!Vn>?æÆ(uòWšŽ”“‰¢…uÖåñ7–«StîúŠ¥ºê-αËÈ’"XE‹˜]B5S½gó²?ê‹S+Kã6u¤Êl'’VLO™kܶmq¹½^]#n¾jlú:m§p‰ŒÄÖbìí¡*õ*\åÓ“ÆO‹¾r£Õê V~[ûÇŸoyÜF"Ö¢ãH‘-HwéÒv%ÙZ„TKr¦W‘›QG,âHÆ[ã‰Fh*ãòéË?þ†@“ µ«¦ï@SÙøû?¼ðܳOí|vCÏ™'>œnžŽ´žy¤Fâpâå³ÏÌ*®xò€ êȤà‚íÐ@Å¢­±¸3–l…ŒÇ:@9ÓiJÏÌ?Ov:aS°u@Îuµµ€ÏË弨T*Ýó¦ øÐçã36Êåòo}±XP­,VEáÊå+VQ‚¾êz™¶–†Ð´0`zöp*é Ï8²©n¨çûíÂPÏᙨvE9˜Íºfgºåhûû·_èqnM¥ÜÓ‘¶7¯4ñ”ÖÊ®õ®¡-ë×TwÞøýOI¼ÝÂÑc{¢Ñ¦%SÜ–Nu)±¶{Ǹr¼>¡´$•cr,þØÌtc2Ù&ˇåXëý^„[ï4Yy’Âh11ÄòÉ›?ˆ)Ç*ÁI9›í°Ç¿á¦Ç¡¦LÚúÉÃãÄäã1Ù•ˆL%rÌÍÆœïOí;¸oN!Q¨åÎÆ’6\o%˜MâŠÓÏ™ÿtNº²Ãä|¯¸©R‹É `I/Sô³¯•ÁEKÍ»MY[öbÿb¿Üc›ºî8^m]¡ ı}¯ïûÜsﵯ¯c'„× -eVèc¥b]µ† Ú²i-Ò@È“GIG×Ñ4‰ÛIXÚ­Ý´µÕ´" ‰kÙdƒµU['µeHÄo_'Žíøuw¼Hlÿ"•¶]]{tž¿ûû~¾¹¬ÐÇ\¦lwU¡O¸|´òø¶¶Z·ŽºãJ;ã-›s™‹nîïbµ€Ìc%%êm Ò[ÉR%¯¿Ð.i}Vµ ´8Öj†¬läöÕÒñgÌk!Ïð`¬é)Pج Ìx•‡ªò<ÔȤTÃ3¨›È‚¶2ú*ö®_¢gÝ0Ö-ìXS&›ðjÞ"3F±”Å/^­žäÒN "˜áI*ÛWá‰ÓL>ï®Ôºav€™ê'>VxÜ,T“ß¶ILôSE§ð°O¯&,hŽ•Y[ÒÍÆ{‘úÓ& ^ X’µ&­†z”mßdDx–_#Ü3~Ä<×ÅÈd7«¹°¹cÍiBºŸqâÙNIõâsnSâ8÷dl+ÛÖE=b¡›(tÒi¯8ø#Z¢È"‰Ÿ|¤½Ë =bÄ¥?ÛÂ.Ç6ÒÝ߇?~tIr8¦Æ'6è}xڅͺk´×¥_>…ï7é`W¥æ¦ %û@È)h}K¢^Yí´'ûj"^8í¡cn£ÚO÷3.2åbr}h.òVi$ÔÇ"øÔœŠæ±„»8_+Wÿ·˜X©0˜™¦(B‰•)|“BÞJ_}›Ó%ÿH$F`ö,W8§Ë”iC:ÍOF*2C r¾{Š~CqÏaÚ®ùHÔžö-Êž3¥†b˜¢_üÇÛüý6HZ°]Ü{/ÓgéÂÉ……[Wÿ´{ùiZA±aµà,ºk›ÃXöZ=<· }Ê–eý\à÷ÂãÑdwÀJH2?Ù|ç?ßç‹£d~Ë’ªÏÅßê`“‰eS^xdŠ8ê¬è_øeшöÔ† èLÒÃøìŸ¤ñß=°Ö^.2€—Dš08Xæ•ö-ñÔΉà®`xŸnOÄ„&[ÔÈ¡X¸9+Cpª ɃÏ}x±-8ñò…ñ'-ŒÉfeq=fã«×­²]¯»>Ñìrn¶[,µW£ÑHWš{î9÷þÿ¿=>>þ2!×þÎ&U+$Ù¦¦¯Æ²?ŒÄÚ’±WcŸ½öñ½æ‹?Ù´wOƒ©jÑöÚñgÆÆ\©Ä±…®›JÍõ ø6%Gcº ß)Œ4˜óã:†¢ædÌõàÞ‰ÌÑèx[*zbì^ëÃÎC6qìÃö×ר±3*šC¢÷ÜúT¼ËH:Ý6[Ü…ãLƱÖ£û⑎˜Þ’L4âEÆ\‘íFǃè.]?õ濽ñ¹zM!-hb­C©eXA¦d‡ÀîZG޾BNôZ'¼åi·Í Ã[c”lKAÆŒ€4åå&ÏÛL7iº¥L7LûYó -ëátxû„3°[Jú,Ù¾åy·Õì­üÈËq,Åóõ’P½¶Éø”¸Ìú(£»æGÏ @¦–V¹ÚÞïÕr’ ”DÕ¾¾ó &™ŠÞ<’(ˆ#›k2n°R¦U$J<·®(xÔ\`›Ãñto,”°¯=!°‡–åÌ´Üd®»Ûè޳‹˜é#’gÊ.íÑö~ƒyõùåž—ÀûÔõc䬻¬à·^zý—‘ŠA‡¯xÊápoçm 7­TWÍaêT@´Õ­P+{^²LûeÃÃëîŠT·ý …ã5LH"‹&ÞrnÛtPy¯A§Fa¶AìÙm4¶u³FzÑ7kìuðˆVYûp+œKc%ýbú‚çpÂr^TpÓI/] v õx #ÖÛû‘ч©O˜t×ÍöZÿr`gá8Z@üÙ-ÖÉPCö¢ý¯çÐåæŠÀ6Õ¿MìÚDþ¶ƒùûIbC*ʲÆQ7›ø™3²Ù§\l—Ò˜9-/ulUŸt–892ò‡=£Îe3Èd»S^&ž3}.¢á[ÎèL\ýÒÈ”GÊ™Ü[¶—L¸Ñd·dúi3¸$ÞƒböpëU„,¼^`ì’iNaÀJ$ºž•>¾ÍëdñòÜÀ’ü““ù01®2•¹aëÔe S¹péìˆÍ`Ì[aðsæ¨ríL‰0@ÒdºªV$ov©ù!K!LL¢ÙwËêò¹+´yµÒ)ûcŸòÓ¶Gõ«Öé!ëì a¾ÍšWéâHÕôª-k(¬D¢ƒ€í÷>Âx¦KsïÚÍkD!üÈ̈-u…0†Ë/u@' $ÙúõÔµ>65$™#Ü‹FrýUSáGÌQjæ20‡*f®}¡pÃñ·Ÿ/ßø” ‰Mv2”(µiߺH¦eìß}ÖD¶}ìÁD¬=¦Å’ŽÅ-‘lß—ˆ7¥2íÛ6®’ŒÕÄ?>=¥Ç›7®Ô€­ÎÉ<½AÁª™[×ãx*ÙõùþݳñÃÉh«>vKtT?0×%Û±nãŸc ™}üÈ»mO¯•yVb(rE½zûÏ·ç hžCðÈçóÿaRÿÿ £P(Ì}þ¥–Ö FÔXme óþo\±t>·é>´#ㇱL#ñXk2yða»pü³¶L¢/—HD["º+}]¿¤ùðRŽY¬@Yb °5–:8g¾úÞá‘ïk€ä+êêÑòÆ=«ÜïÊMµécº.†y¼Slîú8ÆûÖ4î¢-˜Äp/€?0¥dÒQ^ÆM¾ziýäÃÎCb¬S‡7°†CâÎ,SÐ'Ÿtâ[£J$šç"Œ¸Rñã˜I°°¤âGâúáH¤)k6¦2'îÞ9õ‹Ÿm{òq»&Zx‰´CfTÈR4gANp왪?T'ü\ÊcŸ ñÅ&ç·'0T’!.²gü¦`øDÃ'§‚ ëå‹î23P‰¬¿Ik\4UÍQ·\öDh©á³Lw—â÷Î5P€,b9á§gk³þŠ©^hœW‡)«X%Â2Òqr8÷b¶ò "?hW¦Cäéç €lÃÞYg˜­_Á¶DÀ¨sç´³èG“^«Â€‚$‡­â­}R:Db—Ï„¼Æ}+²~­àå>dz©™¢È©€lv}>wMö*¦ÛZôðYüüjY¥‘$„¨U³%ˆƒ’øâdB&h¥Ì"T®ÈÞ™ä…*óWèeñƒsµóqh‘Š·É´-{AÌyKð~G]ƒ–9Õ›Q¾Gȹ)ýÍÊ·öVK€e’çm»V[R~húk /‹Ý9ãV'&º¢—Íx™É¼Ñ©8IÄ#R»×Á1ŸfúhÓ#$ƒZçvVåD+5ðâHsùT4ØY·ñ>èd^xŒqZ-[ÇŠNšgéÊ/AñÀ·Ðu¯µp‹›]\*´›aÃ@a öšã{g/_ v¸›Ð¤MB®K"Ü ˜4±ñ}ƒc“&b¼÷§MkªöC$Ž`Ì•Ej¥|i*!%j(ÆöÎìììÎz{mïô5HùŽÚÍ£Õ£™ÑŽæ™gÞ÷ÿÿ=ô±« |=OÊRÇóÔË9êù§¾+‰ÝÒ¤n.ÿ¡zN]Ö%†òâ#ÙéñœÉ[ö}›JQjI¾²UUl¸lœI´L §Äƒñx ’h¤K6G亰ü–0Ù ¶üþy–BÌðéJ9ºgRlêhÛÆc,°mÞ”?ùàhl¦fJxWº #Ä”öàôY¬‹)Ç‚Ópšk\2¹5"Cj„Óœ,×F£õ¡ êØ§Ÿï·ç3 (†Ã‹qÅf“¢( Ѐ`þBþß"N›¿H$òÊæ—  µ0fÖ_hÔܺq8nˆ5‰èñ©‰Úp°.<ÈÒ3ÑcБE±úI»pL®+¦…jI>=4¼[Qz„@­¢¼9)vn}±pÉU°ñšÁöÜSMccf<{£Ýt¢£LŽÏ(oO  í?îs—¶'„.©yi…šà΂p‹vJáö©é9Ú,„ÞX~©ZŠ„ÚŸt”P#œA¦‚-å[í,a¦à)¼²jMXê„åÁ‰’a`ª1,—Äv)Ø)E· b£¬´ ¡®Ás¿þéZA,(&pÖÄi@QZä9«þäNìo'Mª3sÖCǼ¶ÔċÉfÖkUO1I6çÁ¡K.º`&R^*á§”>bÑ‘=ïç"g˜±v¦lΤ‘Ì£H„gKŽ=K nvÎGι °©&Xœá3ÜÀ~]ÒŸ)ù°”ŸzpŠ"hœ)ø¶ Ô}7(7ëhš„¯V¾FwÏ›xÎ`zxoï.CÊ¡ïûM>I‚ æRµ5í¡Ÿ÷Ý^Ô°ùfóíDd7&;‰»G©;5lßд•س1cdzyÓ½ë’.0ߟ—t᪄Ý\x€K¸2“}Ñ ö=ƒS ¥Í·8c)Öáãâi$ M¿†ÿ\ðÒq/¦xñs‡8ž I€’@Ö²Œ7Ðcuøo·›­V+Cä0ˆyÝÊÌÄL¸ÛþR!RrÆÆR¦rúêz]1쎓(D;迉Ŀ;Bì#w—RExÂX(’Ý@£[ÖX~µ:ë9@ùvY#ລ&3j2ÚL£†ÕüLûe÷š%ììËKö#ö¸4’†—‹…ÍOxtq¯ÒHÜc•\ºŸ9éBg¼º˜‡‘=Ü­ºê9¶Mn" KÒ\bÄ_9ç߯¢—Áü¨fñ“ õb–:¤S‡ êeíÜõlx¼8æFz›lC9gâ) f.)dîŸÓª×–- ç¦Ærç¯fª×´ëòʼ SG²R—èøláÖSóÃuˆPG—©7´ñqtþj“k)° 0îø9»pA§Ž%.äªcšÙ!qé+Ùó#¹êͬØE˜²8¬U¯g/Žf¨7ÑÄ5ÍwE#òe‰Q\7Ä.ü@½I¦®ÓÉ+™êðŠùQòÁ’W6¢ Y„2&\_×°vb¢3–ì )oA “¦,tF¤I¨—¤ÚˆtT6 rÕÞ«M»ÊJøøüîž·³ ÎÓ¶Røì³ƒ3ñ¶S }XÑÚl‡“ŽhÏ´ ÓUp‚Ê õç¡fÖ.I¸ jÔù©V´‡åæ)±òöí&#a`1p3C”••ɲ =èŠ@cJ¥Rÿgü>þûñDggga~ôÝá•ÖÖV8.áÔ5Ðþa—®Ä %Ô55Q ·‡¥¶ØôÐìêᢂOÚ…CB ¼ŒØmfsºßÛd¹^ 4Ýû׉­/ØyŠ¢# ƒÜ&ë¿øÇ¾‘‘׿úª ¢B0t(n…7¹åqŸ ‰Káty!P OãÊû¾ér9¶9z¶ML·‹JÝĽÞo¾îŒÅkª'Þ±V"‡^ÚÍ+¬t ³)½}õP?PœìA#þ‚ˆ¨=K¯¼à#=Ú¹³Ä”‹ky‰^G¢ª7ìÎðêšåUkuýeøÅJôën*îÏöc³=úè)ÚoKú¨ˆ#7ía¿ì¦®¾]p­•ª.Nùs!NÄ]ˆä4×Óƒ‡}Û³îv[¢~Z9cXðRé3ì…JzïzËk¥äõèÉÑ€›ñó²MžÁgÜdÄ«™sr³^4Ú‡¿_Fs ÉÒ”£¦l\—û[@fHž22¤‰B}•Dܧ»{0@ ÑÅŠh½dÈÇÆÎþ‡ý2âºã8j‰ ^Ö{ÌÎõÞ;³»>0˜»$! j“4))´%Ј3) ñ|·iˆÆ^{×»>5m©ÚF‚íõ²v[áR¥Š*ÑTBjzÛ»;»³Çì}MŸ©ÿ#AòOžF«ÙÞ¼ù½yßÏçÇÏ™Þ=°ÆÊ’aÞ á¼½¦ÔoTAG‹§üãuÔÂyKn„.2Áµs½XxPÜóˆV$8š¡yŽq‹…Ùõâ6V{y/¡ŒUE4‰1ünm$íà2:ï0ú¼C÷‰AVqð1—¾¤SV&ú 4mp “ÝLiˆú¨×Ö²•µÑ†„Y 2`AÕ&æµ½äŠ+³:u–R'Ùâ»òÒTEÁ‡ç}XÁKüå û¥j|qý³QDïQƒ:òSËKÞò蔡4³43q×”GÊ‘ð<¤\5¨¿5e|+²×ñ„wyq KzVª>ClœV}äF3QÉ»¾L}LüËÕÉ Õ‹&°Ô{©3uB[ð‘y­z—ª&u ÆE }ÊúVÞ+Éz ©qM~‚,úðœoiÚ£ÉMB$'ê¸Yñ=à¿aÙó°•<ƒ€ã²å•Çnÿõ’¹ÀK ¥3äïΟŠH'¡”–1Ô‚»ýRï÷z¾ú•Çj- t”H£uÓzýïgKÆ…`Ûéž§Eh2ƒ%­Íµrø,ÊII:‘[ÁöÅž1Ú„]Á@³>…âTu*ÑîïK&^ G›/ÿp·à<«G‡š$ɶ¶¶|>H”N§?[8~>>ýñÉÖg³YõFj·Û!„,kà©Z ´vvl È]ÁPS(Ð wÅåV9Ø 6EÂ'%©±/*wßo G¤®°ÜõËwöŠüÃ-Zù£ d¹)²p&Ýsû?M[6ñ(œE`±þò¥R IH9‹7J†°¿GŒJ¯Ýõsåv„ø@ðˆ’hcòÝ:Ýð2!(P†k¿>üÁÍïìzNènÙ:ïo G ; w†¥n¤ÑXÏá}›9ÜŠBrâ¡Ý†ùõ¢îåÀ¢¤(6¡w_ˆÔ_óí~G p"eC HÇâ­ÞÀ–;öÒÿì¯DjQtÒ¥!&瀨?Í8a~á¦"áÖGF¨Ø0Dm¬âDñÂ1úMº „˜¼“‹^ÐÇ:@ÞlëŒehZž¡R€Ü£h'R—øÐ`Yvp]ò‘uÉ!,ßg,:µqWmɵDr¨Œ}ºÜ0È”JvCÌmQ\õ<Ÿ²ëS#Ö˜S“q3Ù!nÎaRG…¢£,:"ª}ª|T›é³.29F·?JÑ Î0LÃÛYÍ“ÀL¬e αB )@kx†W]¤ÚonâXpÎV…“³íYMáM›8²CØá!üÖ–ÕªSŸn´•[@ ¬f¾bô §Øq$ci7^°3ÙñÏg0e¢I¡’‡_Ûû^ ¯Ö™ØjŒâwÖ­¸u~mÁÍ©vãÝÚHÒ â.f#Ã<ª*ú¢PÝ ƒXÆ­Sú¸œsUÑmÉôùSÕßÁ+ƒ ~¡â挭OéªI´“B•…b€yeäê(]×nýŸ~B¤fË23_ÈùÊÕ«Ú˜¦½åªïÁ³ûô ÏóܲÁš6f&Õƒ\…Nx˜´o™:ÅܵŒÓù.ëÓ«žru¼<ëÕ¥§©‚—Jz¡:ñ@~W¯ê=Lj&’´Ø6ò`þ,cYfzia æ<¦ÒŒ6ùžÝ&M¥éK>w Ľe¥ëBÆ£Q=ú{e#ê¤VõPéÅ—ÅŠãZÕ«/]Ó*“†¬gii\S˜$þ~µî›O0€5VÉÕU€BBrçÎw•Ô©…ùá@GLFæ+ó‘ w+þž¨¿# 5ú/þáãÛ6o i’«kWÃë¿kÇ‚¯·šG®€éÜ™ósgRSTiò¤PGDî@B‚²(m]L¤hWÐß.K=~éD,ÚŽ:Ĉ܀¤¥÷ÌS"'Pq‡E_ûÀÀ@©Tú?¡•>+8~>>ÕQ*ær9´ÙŸ\W®¼my@f¸`ÚÖ›¤ùWe©>0ß õÃ÷¶!ä9§¥ä‡Bnò‡•úh¨%"õüãßG·?i±RV'*骋—¾ž”ꥹSr¢þûgž«hxiÿ£÷j=R´Þ?‡Nhw<Òö‡HòÙoc=ã¢XQc]]-ÖY€E$ ¾©—ƒárèh,ܶÅã­ G$¤p¡nÉìÞ­§!èŒG:¤À‹·>¬_[¹ÂÆÔBÚÂ0à­Ñcñpg,t0h—§Â‘ÖÞa÷öÍV³$'Tso3Q5•Éüóç—Ü~ƒMŽXSSÆiÌi§ ©!6çâ•>SÎ…—ÆŒ Ç $Éa>ãÐùÇLÙAËoÚ(ç.25"¦ÝËSçÖì+cCba€žmá‚°™+6ZÄZ`D…›+·Yk•asl„*œÇÓ#?Þ‹™x›`•4çÜoË9ÍÁ‹†b6Ñ@þ—ý²mâ¼ã8R×ÀBpœøì;ßû«_I ¡PH36…¥+T*±!eÝ`ƒ$@yRÞ¤¼ØÆ/±!«˜´Uš¦Ut¥y1 MS»?ª1 …nP± HbŸÏg;¶Û±}{²J•¶ÿÂ&Mýétºîy~~§û|¾ fÅÙRUy·ÒAŸ!zL_aexøEDt3P)VoúøPQÚ‰dm†íëôŠ5k +«¿ã\¦Øˆ¬ËàµmMMÌ9)Gò<ÁqàÐzR@)#ÎÔ®‚Û×!¿®%ïŸ(K{Ë2n2ŽÜ‹<-UŸõ5å+šr.r˜³/I\bj^0™%¡Ÿ®-=+~[‡~oeb m^Iüâ禰ݤx™äè~oõÓ-Oèv¹@Ù¶QÇ·2õ50C‘`à,Š9^/™²³ÊöØvL‡¤+Š?éF¶ò„G—ugZÅÍ uXËÐb-Ã4æ{‹ŒxHñ<ôÖ*èÌOtÒi:ç¡“®¢¨wùôu´·ü“NÖߦþs'%Ÿ­œµ©».æ1G.P9GaÎÉ$|H±,ìæ“MÆ¥]ØŒ Ïy:÷ÕõRÓnɬ‡ˆ»ð˜‡Júè)'špèg=”â"n^ôb±^äîÑe-ë‘r^‡`ËÚ‚éi–63UŽto/yü>¥ø¿­ –Ì-Èýþû/ •«¦9,4àØ§Î‚ŒŸÏ]Ñæ>P+#äl?š¾)~h¾èŸð«²ÃH~è¹Y?ù«.£À- XˆPݵdäºJé7*.œ.š¹ t‹ßX¤\Cb”¤G‰Ä:7¬UühnNŒL«rÄœKôSÊ Uú÷H~X•¾ªÊöë”ëσ£)t¦_“|>sJ cOÛgl´ =¤W>”kK&û­?ª*&0T#ÎÇÛ×´b\jå# ÈDBûcG¥hk@j Ií±Hˆœ¡ðþÉÉ“Í{–‘›Öa·ïÔË‘®{_ì­Û±š@h–%) cI+‰ÑåeÆîS›ƒ‘àòdS8Ô)GÄÐNYš‹QyÎI¢á£‘p}p¢)=2þ¤!1Ó>1y¸eïK@ƒy‚Á¤´¿»ü›9$å”lJÉå€T€S_!+›Í~}ÿ¦þo øg.óÕÌ•l^¹}÷Ö² ÖBz9Ã?Ø"Œ=<‘Ä­©M’Û&CMÏÚF¾cÑN)Ø‹6†ÆI‘F9vp"ÐsãF}Ïɵ¡xûç_îÞòê c“Àóìæhôă±¶ 5•Õ×U7ÕmÅwæ­ñx<Ú˜¨ŽïIFÎ>~Ô”÷Ük¬¨„Q‘§9Ž4ѨÚ骃§e±[DCÝQéäøã}S±Q¹+,vD#{ç«QnŠa±h8ÙuîÔ›¤f)±5ká±/w‡C;%±çÓ¿´7ì)ç0ümh=>‡$–ÕÓ|¥ïy’N“¢»<ÙW÷°‰¹4ŠR€ôšt³q;’ñÐ75ÇGiÌ Ïø,ycs_-WCs±è„S[a‹üÅb¥·,àZœó0Ÿ´è-¬“øk¯TÔUQ4)Ð ,âZ;r—(vzÆCÝ:Ákq ÂÖUðŒ‡Œ{õ³ñ‡ï”™qc4”þa”è+Q<ÅÞF0aÔŠÃ(Ž0ÚHXD/žvi6îâN2² Éàq¹Õœ²Ó)·C½ÛÊ ˜nµ€¾ù"Ö¹¿´ûÃìáY"ì¥}KE¯v"3nX$i+Mºðió?×ÿ´¯&ê0å\¨â€Âç¹*Š_Šf̰oƒ:礇jÊÍ%]TÌE¼ü´OíÃ"ç òž¢©^öý&n£a¡AxG@úJ†«b u¨EC,Å¿· Ë»)ÅÎý¸º”Ñ#@6Ö›t€þÓ}DÌ»$i£3¾EÓïBwN³/™h5YfB1#ªµoáïž«/éÓ6,íD§ÎY”óLÜ©¥Ê4¥A˜hŠÐôÞ°ûøuÓ)›vö‚6á’nd¶›q°ñ‹DÞ]\(. Q¯ "Ýkž±3^]Ô®Myø´“[äzɤûð¬M—t2³iå¬8Hùö§ãhÏz`[:…´6S¨ÑLêà—ËŠïâä~(>XÒoßPÊCV+ Y9Öu\fÊ•*ý¥ŠN B ?”Õ¤F—Ì—¤®.Ê€õŒéyÔøzÅb¢HÎjAU®}ÏM\Ö+CßJàS%ʇP|X›QeÊ (CK½Ç¼Û¸ø¦U¡”Ê\]¨\S§ý‹’ýºÜ¨:?\E£ô#Óý…éZ$•!}~„Îø‹ò>u«`)?©\/M_ÑÍ qWÖnBд…€a0èýukž„·? ¶ˆ‡[Báƒ!©30¹_ ¶Æäމñ݉äñÉÀ‘ž“¯< ¶>´?küþËœ' 4 TdçK}à KyžDÝÑR#ËÇÁ‹rèp0Ð(вÔ%:åp I<(ãÑCñæx¼- íÛÝ»}òW)6ñœ†!9‹¹ìæg7˜òÊ´’û7l}­%€_ÿ}h~Só^ùUhÈÜ s™L*9“ª®®xÜÈ œ¾|å Õ_?ëz4^ 6Åå·HÒžp¬ùYÛˆ8y8Ü ïûF¥QÚÿù½ŽúŸ­X3Ç-xêc‡nÑôÚf‡–1 cÄáMß­^½Z-P”™aÿöà°nB»æ«ŸÀD @"Ö“:Çÿñvrª'$¸u«qãÆï”Š%Í4ÆtYŒ´MŠõ Y„¥²_ç±qTwÀ«*¤-vì½æž7÷ÌÞÎUR’¶¤J 4 *ÔJ))´Ð&NlÇW;‚íõìήXªúGª‰"'¶×RZÔR!ÔJ”ÑV©ã½ïõ^³ëé3é_ü‡”*ÿtô´FoÞûû~~=±¥£éÄ1hªXô`ìF_&ÙŸLì»eÏ'Ñ¿Úe¬j¤î|üÑé{¿Å4-Š¢L‘êK}òñÀ '抓`{+²à«NÅËtƒð•Ó17FÜÆ8SÖåq{)(}d&Ô˜PñÓ•Êa %?UR™J€ƒ©W™pdžó?¾C!'°»€ÍŽ@<„:™ªÆ–‡¥å)Ö¬×^]e¸C$.µ+%Ê,‚ÒtûNÊÐІÊäýŽÜ$ع‰v±„D…Æ®û˜úžŸ¢uÍóÀF–gQ’µË@É«ÀÐð¸F>¶½I àì‚Ðl 0Å5[ÖGýeÃIj# ×SÍgµå|”>…­¨æ¿ ãdq'Øü8› ±éÕ” ÊuëŠfÖÕ]5ÕT[ÅOBA}Ýv~|f”4È*©BŒ³ø'/s^Q bòÌ“Þü°Ç Ëð¡F€X™pÔ‡°ò$_ eÕ¬ÚŒ_¶½7 v+Ol#ß þpãùž-wÓ´D¯qËÔ•SBZûrL•6q&–v¢Ô{¿§ðèšUŠSrzÏû=Æòçj‡lÈÍ(Øì¶Ü¹Ý εC⺊C!¤ýÌO6YR²ãNwKvÀT£xÙäÈ÷(†/ޱɑ›wÔj !Í”µT¨dJÃLE«*¨~*Ãå1 žVµ•UkUÃÊ!º¨ÑÅ-Ê“lÕ§1Š@ׯ¥¢Ê]{ô~תp4F{HÆM…ŠD ÷y,¯œØüÛ“bM’,Âxx’²}ôY[0Õ.›ŒY´>c[·–ß´”ÖUæn™FŒ«¶Â«-ÆÔ˜1¯„mL8·rX3iGðU`ouH?ØNïÞiuH0fMÆi¼‚é3ì§«j¹:äÞ“<î¼ÇÅN?Çe¼ËókWÂkWæ°ê ¥ÏâÆŒ^¢6éóhíµfã’ ¢¢|¡Õ˜Å>÷:§ùò¥/TÃxý2a„-Å‹&’Ç·µÒ”×)‘"Âmä×wøÆbnO2shµ^e» !²éî|º?›8œŒöÃÊ–ÊîÄú–R»¶o×}_·óƒ"vÆ:;×¹´Ø•ÊtÿñÝCmî0mvëûÀÆíçÙÔ1X¦ñUä³Ï%“pZ8a2Ö—Nô$û Fr…þtæäß?¼/‘êJ¦ö&rÏ.Eº K≟eRóé£Ð$™ô­ÓZüH:Ar0•èŠFÛÓÙã¿>÷”kæy+‹XU¶x`vãŒHa (Z¦›!–FdCEJ/[жdŠ£HÉOÔü@°0J*¬ÿ«mi-DUƒLÙÏÂUPžt¦îw;̬YGÙR“ ºa 9L¤Ó¾nz€[ö‰å Ÿ X’gm”™¥ X‹bcŽïxPž‘iIð(xô”\µe2̦àGX`Eéü~Ö²&5С^žàIÀ€¶wz@þ khȇ'<^…3Ñ %8àäÑÐ*3ã ÀOíÂ/àß^ŸÑ6|!@5|Jq’[VѲƒÁWõ£ðÐýH=€ýÐ`â*ÀB2D\ójô’·Ÿº_.ùØœjŽ‘7Ž‘ÆNDìòÅ.s-ÄêA61îŒúñ¤Šä5qe„¯aWBî¨X–}æÚ‘‰‘‰¶Èš 2¹!óïºõ8ò íŸAgu™;Êó°ÖÓN+‡Ÿk £–šoMmÜvý,¤‚Í8ÅBr˜‹ ÚúwH2…º…»ZÁå`Ï?˯¥2«O:-ôfŽwòDÓàýÔ;½ät—òý-< ‘QvzÑëÃ@W• ²:!ü¸>lmLà…1¢®YV|–Â0^ Hzƒ¯i9Då†HÝ×\‡çL q?Ûã ?R ¬ÏitV³åòrhcFãRÚºÊ8ZòO=èO·’2ÿz¼—cd˜Ûku¹œ8ƒ£2#1ŒëØ,õYP“yÖ˜çª3¶j¸E_h©_6Óø­ÒHiÆb,´V__k,Æ V½ˆþæy‹X8Eá µ1§ÅÈŽíÆœµ:ý¥ZØ\·skŒ…–7TV_ÄhÉÁ Ýóí¦M;Œ+cºY¿ ä/µ·L¹ScÁÚ˜¡õð:ã­;ôK¦z+…-Ÿ[#àÓ05®ZН›‚¤<+F.¹þ&§PMkǬŽTºöoK䟎Åa×óL±x(è‹þ»#ï+d"‘_¤2Ï$³{ÿ‡§7x e8ÂYرk$öR)q2—ê¹k?Ü¿ÃÁJ,ÑzêŇ–Rý7÷æs‡ó¹ØÖÁžHìO§º“q(œãP#ù\?<gŽ';£?ù¾·¯vK$æà%§Äÿ°_ç±Q\wÀiZœØ{ïÜ÷ììá(R’PUä RB -ÁÆìr™Ô’`ï5»Þ5”Ò+RKT’â`blAm“¶ŠR‰FjªP Äöîì1{ÌÞ»ž>·R+Eí‘!UyzZí?»ïÍûÍ{ßÏ£ìOÖªŠZûO^üûóËö×òµJµ¿¿ÇLªQÀ[)íÙ³¤äîéÈ‹qÉy÷ζbþPtjo,ê’“Î/Z#ÑÈ®ÈTÀO,Ö àq:¼‘ÇëY„îè N ¯‹G^’£]™˜X×ßní]¿¶™a €Vš_³ºõÖÃÓÑÍ™„+Ý9Wó‘ãû£Ó/¤SÎdòhvFÄ ^$ç' aÔ7ç…«^3ýjXK¯ÌÙ€ÔWöñª¸P}™¿Ø‰­o5®Àá…XÃŸŽ±e‘Rý€ppyK‰æOì[Ÿ0myŒ–¼Æêä­CˆÁB€1zË ¦ê&Ãu 9 d½çx–ùÀß÷ÀeQÓ-´ñ, :LXGr•—‰”[—ô€Å·^u9n­ˆˆ¶‚>”CV)Ô˜ RŠ…(‰f`Ë¢VÌzy`B— ¢—ªzêU·iÆÛ˜t³© ±†fßÕ!²l2¼{€ÜÐNbÒNƒ ÒBÃ(Ú@ÓM«hFyWßz¨2®-þº¾ú¦Vƒ+ ù­z R/ s¥‘ÜÕ†Ú¨V}SF4•ËæÚ¥‡‹ãäïO·®²›áZžjCHxãëfržT¯×©—M…óæÚÛ”2f˜º “gzí[WÏ# «ƒg¿½üÁø(S}³A½‚—Æùìø<õKéûr£Ô¹#‹õ ‘ž¨«Œêfýœó¬ŽCå1“rñõ#Iõ"à¤NÔߺØöìJ+Íš»•@Z8Ø“ÁQ¶3wI“‡³‰Þ$¸ŽM?n£±¸óúÕÝKšt6¼%8 Kq$äìy<.;¥[ûógLÞu¢¿ƒ21ÀWý}OO'©ôIêG–œìI$ºâñ'Ñéžè” ø$&í75€0V:µojúûrúèOü iÔ98!(úûV‹Åê?Û¿«R©ÌÌÌÜÓÐü²ÍAûoEÌ¿þËs4IX-,KXX„ìÚ¾4–ÜŸL=Ÿˆ¹äرlæP$òBF>$M¹’’ë‹ÖHRîLH½@A j¥DÏŠÅ;0MÞ¸Ñ%Ŷee§"õ'§»#‘-R|¯œ:1|ö['N¬ùùknOîK¥§dWôÓ=i饹šOlêP"¾'ïŸJ8§{ïL¹$éø'7{’Ù#½½£ÑZo§í<ÿ©ÕŽëïmïë[·¬Usm¢;!íUä#rÜ•HtG¤ýs¶>ÒÁøìîûÜ2"±m²Ü{mb»€ÛHåh ,kjC-mº+Ç,ê+æ¼_ˆù¸´)úP%È¥Ã|:PÍ €Cf)"Y/šÑŒR|xÎ3›Œ•ªˆú¤OŸ¢ƒß–@” µZ8Çšo’.0Lç@šŸê@¨åOÖ«a#fu0ÚŒûø8ì@à ”¦;ñ»"Ÿ ëU7ñRë– çh¢‘Äopj ©0ú*Ò&<Ám[mV¼l|ØRÒÀ{QøðxcÆßš cò ^vjÇLØ–wÀ$K"W ë•°NqeX b. 2B ÑEQòÎvà%à–²(èr€}dÜuÏùñ™^í³¥ñ@¹‘´]ë]>±»%° ‹âr§)%`Έ†œ¿¾Ô‚¨âÃ~T­,šÁj€Â)~NZõ#Ÿ¢só™aƒ:ÌÄîSƒBn€­ Q‘ÿóÀÒ ]B!¤S^ÕÔ‚6 OÕ'Ü8nkÆî§(;·­]nx£úcóÈ"ÃR ¢gC;_pcïF1‹ÙÓ-”¡Q2M›åG›ùÛG™çVÁ&IÒ»^?ã‡Êak!(|ØÇ.£t5/ð?cˆû[Ô!,ç1åXUÔ¼†TÈRñl€Í†„ÔI“¢ŸíµçL;¨¿ 0êiRÔy²Ö¼6@¦|Ь Ây7^×bP›¦~Öm]æ0ÚHa1 L0VßÈ5ÑFqÇ|eŒ+=¬NhÕ‘:uD7s +Œá…q(ùs§ùÿêYðÿãHyD£^µ¥Ç´Åñj ê•ÿ~Ép¦Ç¼v%GC6†kY†/øH„2ãugú¡o_±šm+1og]ì\ƒ:ªQÏ›¶®Ó£‡ãø`T~·¡t©>7ò:öÕÚ…û~ÑKÑîì×{lS×ðNÛºQH ¶¯}Ÿç>ýÆ@´°Aû£b«£+ll…È’Ô³tAâ×õ# ”­c[ûÏ:¤50^eê4 ¤vªPÇZV(‰íë÷ÛŽí»Ÿ—ºýW)ÝCêÑQ$K–sÎùÝ{¾Ÿß‰=dQqŒVÇéϺÎÂ8*M̯^64@rSS¾Œ«×5êÛ¸èá•Å›7 Z Én¦Gwîµ”„3„tçÓÇN²/óübøE3­·ÑmÈ m_Êžvm6sär»ð·{ñþh¼óû¯¶-ÁŒäb(ÇùóßÇwE•éÔ@tzÔ¡ÄvF-^|.jèmᯓÊÀÔ£®bþ t£`¡þ—¿æå)€D -ÞúõlVÍ‚42û±\.ÿç²ó‹1×ãÓ©ÕjPÖ;ù }Y+Ïr,…Ý‚-›¤ptPIü$ëLÅ÷AäÁÃOHLéË$”pÏç­‘djO,rhzjo"åL¤ŽZX=Û¿»ùéèTw>s4<ýãXäÈ{·œ7®uLLì¼õÞ$ñø+ k€·Ý /N¹|ø4g‰÷Æs·Þïøþ–v„>Qsäк{wÇ•®h¤/ß÷û±žÖXD+¢t  $‚êÜáPÂNeÊ‹ô&Ò]åМ­'Ü—N:SIg\Ù‰îSmKw!w¼³c= „ç$D.•0ꌳmòç¦jÀA¬ˆªËú4ž/]™Q‰èLC|!ˆ9î£àz¯¹^ °%Y€æ´ìà ^mΫ­™nÍjË¢ž7­uW7­’0L0Ñ„nÓ Í]ÿ*UæiDËäÇ' X‰ÞuÉDž³ê™7ºÄ̰¡îfà7ÏýˆayÁD1I¼Þ!•ec.@¦FÉïY4„ù[ÍïóÆŠÇ\>+*>­êmÉ¢ê0¯Ê€Š¦ú°PaÓ.¾< »Ðf¼L1(•B ,8ã™awð¯ÿeÊ8ÌšÛ\”fÜ⌇oøDfò^²ø¿§‘bÀR’õE/ T½ºTH_ ,ŠÈ-3¬è%f‚|E6–\FØŽêU7Êmy_Ò©!’½b^}£ˆA<¤Š.>FH2¯Ó ˾ÆÌ¸ÕCb'­õa²î§ò£\Þ¥ŸÁA¤ƒ[VÎÀl6j‰m¡Ð ‰3‡Y9âÄ6!ïm~s‹x‰M9$îqb4/±Q ñ„ÄKðüŸy®¹ì‡-cnt|©Õˆ/¶1ÍcýkïoÔß÷HÕaVõ£¤Ûœ #T0'c1YüÍò›Â<½žÛîÐ|<Äׂͅ!.´€Ÿ³>])DUÝ€gC5@Ô<\ÁÍ'tr”L‡ô¡Í|»h@h%Æó$k¶°‰'7,5]ä^X\¿ÆÎŒ-¨OèkWQá26s£e®4R+W¿\Ç*©Ê]é*®^ýºú»¯T®¥‹ÚäøcÕ› “l™#j0Œá,i£I^ ³ cIíSvüü~®~¸6L‹4«-[V±ÊÅ/©×Œ@šú%¬~}ބ˰ŒäpšâXq…aÞûg¨ˆÏºÎúÉ ©Lè«ã@šÇÔ T'êoëŠ7›½Ó¶mõˆ¢! &Äüê—[§#é\\þ‰©p÷ÄÅaK&A»²]wýÏϾûî¼Å¼NX·F<ù³gNžÚè°FÖn¤+ýõP2Öß ‡2ôèï¯f’Ç#@KÜÕ ºD»qgãÞVöCã–Œ9séÈT_C>™>%yü…ç—J,fYÚZ·oßžÍ,õŸ&ùt}1þTp¶š³(R(Ö>ù-–!)‚4óŽ•mÔ‡wÆÓ/‡£=)e y)ïP¢½™Ô±D¢7Þ™N|îI¥»@ËÙl8âœ53´@Ø­ÚÉû=Ó“{â©þÉøÞÓ§¾ÃD#³ àß–ˆõÆ•ŽDcÁѾtjߣÉÎxâø\­'ë»÷ÉáåŒ7´‘$²#­Ýøôòløx:Ñ=9ÝKŸ:öÓõé$ÎÆÒV§V·¯üÓW”Hg&áŒLw‚F`#svD(Ǿh¤^äHä@*qJì¸÷à Ý¢eX–a¹VŠ n'2ê .5,¦‚pÕÔªz¹ü [ñ13>mÖ+åýB.Ä&}†|€ˆ‡tλÉLÏCFû¤’›«¸éºŸ©É¨ä·ˆ{64!pjÉ -ûÖNüÍ=žD”ÀiDó³m|äD‹i¶pÔ•lÕǼÓÃQ6Èa&L»×ë gAX5Dß9ʳF«„sV^Û¹%ýd>$„GZ>8²üþŠŒÑ³–ª¬SOÏÏøéakÕ+äüLfˆ†\.y 1?Sñ³åAdSÞC•tÑŪCŽ’Ÿ‚m–|4Ì‚*Ê4Ì<¨Cfr>:5B§Bxq˜(ú1ˆ{n€Y^fÿëüø·™õ_KY¶äý\}(ênM&Ž¢r>T Òp°}d2 6Wdªä¡ªA®äcr"` £B*(sE7£zÉœ‹¨ÈD<(6¾ãA©3öêà™‘…ê0Œ©È|Ø«S} ¤å½úšÿí^z·ˆ±Ù¨CËž[L~âÒ«#쥗‘! Óô‘«ýÉ]k¬B/>…EÚ Îts?‚3Ÿq¡°Ÿ{’!Xì„h´á›×p+ð¯q¹Ú&Û f«þ¯æGM¯Fõ,Ìí£?dZÑã8…ôÂ’žäàCõa*xdQBn‚Ç50Æd=è¥([²2 è‹>CeˆQ]7*ÝÏXÌì"+Â9z!‹#Äýƒý2âºãx£¦$ØÞ{ç¾÷06ƒ ¤uë4QJ’B)%¤J6¾1‡)õ Á{Íø(¥IÓ–?ŠªŠ`{mlB5Q¥J½¤„„&âÚcvvwöÞõÚÓßÚR•øÉü)o¿½™yïÍoÞ{³ßÏ«BËš^˜÷ÏóXñmÝÄÈœ)¿aòM“64[(bÒ.ZÓƒHñjùÔP™æ'ラ³ægóuÚð|mÕþT‘y¤x•Ë [·U’ ÉJ–bWUbÕ,¿Ð\e³áMWNé* «‰¨ú¶×ü6íH~´<9Šýí,WÇ“UQÉ N³°û¥òÛ®Ò.Í»ÿ8ËH2~²8fÑ.êµKÌäˆA½2§8>'Ñ05n»õV݆ՂÎì …jÁóú¹ï­2d£rddwBÝö<ÁP¶5O­o“Õ®°Ú´ùùj©¥ ³ pøq,Nb$Ç̹pas$x"!·ËWŽw.jÞÃÜúähB킬¶D ‘¶h´q¦d/ÙJC4|P v¨Jk(Њt~ðߎº•"-a)€ ™ñÑ7™-y.—-ÓBZÀ¸snªàf'< g=\Ì»©i £ó`è>ˆ^Ün&|lÜ߃¦Ý֔˴S¨¬H&Ýè„0ø¿ò대¦+hÖ€€”`dè•öò’%'ZÀOaÀ‚,xHx:°bÞ O„f8D›­É^$Õ‡NxK·²n ,4í³&}¦d¯”s9ò.8sÊC:NˆÄ“¼XœÝ‹%&êr¾wˆé߬k­{èØjì÷{æúÐT.ßcý÷©eOX¿d¥…\éphrâ´ù¦yãe²au5G–qÄ—‹¢];cÊJÖÃ[*y¥Ør† rG€;t„S°ðçX`!Íżå¶Úƒtn¨038N2µ¤õÇ›`Zë¡'\T Ñ‡Â<¤D–õ^ñ§|ú‚Ϙõqã­Ü¶U:;c¡8#f–vÖ8b“>?ˆi#ÆÌ°!ó–!=jÊŽZ3ƒÆÜ%DóSÚ0¡ .Ôü_™-JIŽéµ7mÈX¼R69DhæÈegµY_agXTx­.º}ŽhXç © îǺwZbÑŽPhüPT>;6|·ýç·”Vh¿Ær¯’³E#·)ï2æÜ¦‚hÍK`afU4%$s¦Çžr I7Ÿð1É^*ÑǬÑ>“êC`–fõ™Ó¤„Aßœ¯„.ËÀëO³MÚKÞä¼4ê)7 –šƒÉìT‘P%|Fq›R}liFàªIRìe³"•òài/‘‘¨¤Ox0à"¨Ì(„ Ò)‰™QÒ¥ZHyèž›i¯=ö*—–,%ù̯ dÇÄEKz° º°¤È¦{Ù¤D&¥{Æ{;Ý/D]DVâÕ¾ÚßlÇë…G Šr Çi’ÂLÜw꘿ºŒÚðÜ”ð›¸8O«(^Ö§+&.ë'/›ŠƒÆYsù+íÒÿØ/ûØ&Î;ŽóGµWãøbŸïýÎ>¿Ä!Т´Í`ÒJ·ªëV¨ªV“¥¼´]B `‡ð²Ú¢%±}wΈ¶kµ$ŠZH„0˜ûcê?Ó¦I“MâØgûüîóÙNn?Ú´IhB Têé+Ëÿ<çßó{?ŸÏcÑÇÍÅ+ßÔÆ}lyjk}§(ÌMëׇÜÚøcú¥Eå++NwðÊ9hŽ$nÊú—ñÒ…ÚÒ„%z–ÞÔDÚ1Gyì$ûã§;çLú(βò8¹Puê-å1$w~IiÂPþ}ý?\ÿÝÕŠñ°¸¥ÎÎñ zío'S‡RѶ„ÜW|á™w•tçlìM¥Š oBé¾3uümí<ðâ‘®ç>üàåp¸+*wÄßÕßmýÑ÷·Œ²s3xrËL¬;™:œˆïV¢>px›oƒÀ±§eõî–hŽÄ:”äÁLÊ›mÍ(ï•ì´Æ A1)I9½<(ÓuµPüÚF¾¢¨È=!Ñça µ›7& §ÒκX+ߺk]<Ù©(û@²©ƒ ¦šžÙ´7:Ý¥D{RŠö§<»/©t¾ÃÑöd²-•èH„Ç#¢ñï¼ó´Ëf$pÚép±Ë‘pçÁöìzv*ü¾œoY¨z"Ê¡;³{³¹#rt<±+‘öž>ýªƒDì¤4[Ÿ{¶áŸ3¾´º3|§„„ÁêàìdPË/?Ù¬¤|‘è[0$mN¶¤“Gåø¿7êLĽr´-ê‚©=ê~‚ÿ¨JÏ…Ñ7(­ãI#W‰›Çí¥Të¥t ȸ<3ÀEH]„/ ú¥‹ä'-c%휭¾Özø%«vŠ…èW‰•,ï®­gÊétrÆE7zxµ×”þ˜ü›ßÞHq+q·‡]ö’{YB@µº´ä‚uj:?€ÌÐZß’‚ÿ¡éù ä†ñ쑤rƒ4@Ü#'Úr_‘è²HiA¢ÀUÿRb/‰¸&⪈©"ZYÕ¬""€Ô’d«©R>„«ƒà x1dÖ,¥A+¤²d$²Eê~þ»5À@ {å9¼¿µÒƒ¬ òýDÎÆHæ%,'Zî¿G€Q ©™¹SñÓ•^R•x0U Õ ³€šÁ æk2dÊ Y`Öùf FQðbÐúÐ}«©IÖª5ÕH&M2«RmQrg~Žë»(3Œþé„kç&–FÌ€JÚig …‹úÆðŽó‚¡ ‚ïyæÄ•gÞ^ã¨5:9W½™Þö=[ddµúA"áÔï1'9}¤®(¢ŠÈîzž²ób^SGâ¿jEÓ}Ü|?ÄÒƒælʰ–DV ‚š‹’áAõÃæÌôa¹!VGë]¦¸ÿzbýñ…#«)³ )[iµ¹qêøvwú£Ÿ_ª_6jÆÊUDs¯-Œ"ùIëBQ^»lžÿ¼Vµä&–/-×Çk†ë'ÙFuà¦:'ò›>RŸ0F?#[^q:Œ'xAÞ¾(=º\¿L|yÁ°q=ÃÐÖz8¦‘¯¬çn_@õKØÜä¢Ê䊹qtÁlä|ÕÇ*×puÌ4eqll韾ð´¡G6›guýÕû’3¥Lól´#¡tÊò%¾7Ý›Nú¦§ß*ÍDÚ"ácáÙýqeg,ÙŽýôÜg?ipðN–åI—ƒFm8Åbæï4ÚÏi“#Iew–”; †[·¼k=˜ô8¹:¼Ærûö¡DüõL¢{:ìûáì r6‚[[gûí•fEiO%~ÿ²Xìp,¶7&ïS¾xÌbSõ¹ZúÈû9”˜ñÅ’ÍÛ77Á}g\€‰ÍO™¢![%ÄWüFu°Å$°[þ/4ÿoÊý”0Æþ ÁYÖ‰1OÚ‘x•ÎSï­jrS.NP‹q“üðë”~ ùR\œ 5toÀ7:—œÞ}ÑïÖýTFD©åP]Etû°l¿I°¹á‡·£¤°úm÷¨]¢eÁ\Í… ¢J ¨:€æ,ÙAKvÍŸë°—D›&T= HšlYËÙ²°&ÛëÊÜjÈ•hÀhj˜P†P¹lLõc™ ™Ù{çIøw@'Šq/É“Îø à é,;h…_/„,JÀPÆJÃd>ˆÀ.B|Yà󽬂5º/6šH•RHM„©U½EdÔ•Z• š¢UKÉH¶ŒÈÃg^¤a}Ëöð­Ã U!¡4‰­Hܼ@ëý¤Þ‡¼*9ÁÄ`.e?Q ÖT>"ÿñþæ3N—µÆmk2›P«AíkšìäÍ^F)`x±gi‚ °žøó»µZšÔ”NYŠ5ôð„an„8ºuQ¸ ¯o`‰3oTû–-DÁ ó~¶,zæ$^ Uiyy+†ì´‘ 6&é7¥Ha€RC4Œä&Q›Ö!<Žë š#I« {¬ÉSsK"=¹ËÆüØ"ý¢aþsºZ[EÕI¤4aÐGA!V¤®šÏîgœ8ý¤ËÈ­²,uYpa¡ª un{Æ6½ÊH_3¿¶a±•ÿûuÅuǼÿPÉE¾½»3óæÜ=|R P©!!(‰€@C(!Ð*.c|Ÿ,Œ ±÷>Œ QU”¶¢MÀ.ÆGi¢þQªÒ–¨UŠ[%€íÝÝ™=f/¯§¿¥RÕò‘QU)£ŸV«ùc÷½7ïÍ÷óCfœÀ‘iC­éo`†¹©"ùfilR³8N,™F&uñkËrÓš…q¤Nb 7 ¤iË_.?gaxŽ^ŽH×­]ýÏ{ÇbBO(Øއ}rèx$ÔòçM’ljܖŠÃ«xŸ>9;ÛiÞd¤X=eÔ3üÚzî­3Û;š6ZèN[ÅáËoM´…ù×¾ê•BR¸zÏàì 10(…xB %cƒóóñПîvmß\­'p'k̵5Õµ‚ø7Dr™¯9òy'EYÌ忽¾k/‹8ž4³_¿BóÇ;sÂaE郭%…Û" Ö'ž’Г:Eᘮ1;åŸíŸ™i‘£AW8Ü*†›""Dy›ß4 ´ˆrÿ\¨Ï/vÂ-óÁFEÀ–ÅÖX¸yɆ$µaúB[4|44¿þ]þúò6•“x™™^ydß3Áý‘@{TîþëÌ‘M›V(J•ÿdô%!Ôœï… $#5 BSÀßâŸo…•ŒH½ €Ö×ÈCàYo$rè³;G¡Äô–#*)æÝý(6jQ†ŠÒ.FöÒ†i7ý4½għ†èžm&œåiš4°æ+GHÕC¤ÏinŸa¸¢b–ÆŒæ †wn©TìlÄU®8õ³oU‰îoÇÝXÒ]¤U&}(áÕË6m>àFHÅS‘9oˆ cK¥‘¤ rœ…H6¤<¬âan:î¢bžügÜA*Ài˜µQ9;pSQ’­xÜJ2®|Š)Ãä={åíSôÇ}Ìt§ñò~êÂäÛÆ¸¶0[WÙh~cµg ¹·Úó4õz õêj>_õz¨OõZ½joƒîàwQû&n`kÕÙuç~°âš±·ÚôŸt£»ƒø¬“ŒŒR± DžbÅséd·.êÅã#HÑJîr<Á¸›€aÃ\Ò^Nu³9$?k ¤p~­‘¬ @´dµ’vCÚÆem|ÆÝ…é‹XÄÁe\–ÄÛTzå¼xnÔøéI£ïòØZnßcß äG=TÜ^®:Ê‚>Íïú,¥%Y–B|ó‹ 4í®Rú¤•RÎÉaƒêÐH#«zž_f'TáÌ/~T™²sI—!î(RFA/|ÆÁ¦\8Fr€¹¸;¾tßÎ;xØØª[«Ú+6q‚oÑ"0æ<´Rž7ëVp5&ÄÔT•”1…Èh1šÞÝÅ÷ߣrSXllyêVáÂx¡z•Zª”ÏM”«“xz\›™¢2ZõªV½¦KOħŠ?ÿiÑhGùŽçW­ûŽ™äªB,¦Û¼ÿâ}Cö½RuØAk z K˜ªñ/V,ŽU«c%ÙëXúZ¥:E,L-Ù8'1uJ“ù`¹ púUùâM<9QšºUþ³¡z³Nkà)ž­5³†çžá?»×;Åp·î>슉'„¹Î¸|R{ò]á|SB:ý÷Oû:n6$4¹&¶nÃFÓÌç'gý­v]º´ÍDÃMò¥”˜wHcØß ÃàÁxt@ÀÛ²(ÝpÅ?×.†ÛB³üýšVU’f††%aIók»ö@Œe³iuñ«___éÊ.fs<é²ûÆ 'Œ(fN÷Ëw_•¢' .ý³-a¡%:.øBbÛ×H¨)èü¡ƒî÷w5¯i9Z78vG¥>Yj ¦˜< †;ýÁç;"¡9t&4×´¥¢]‘@kèaûRŽŒ'hƒã‡Â?—÷ƒ(ó¹w›9ž$9-æz^‡>úøØ†õÚ ^ I=÷ïwHR{,Ú&Ì7 B3¨Æ ‡NnHä´†„Ö'½ž©Hç}¡#8ל wœ:½ô E0¤áûu%wÞ®ÉÇÓ"{ȘW›Ï\7û¸iµèBÒ§üÿäô*3ý¨›#-»V•¤Ýä‚«$âäÛK×r:œÃj©ÒK;KbVË¢O«øtÉs˜TÒ]œu³¢‡‰; )Pf˜HZ‘2Œgí„â3$œKC(iD Á-{µ€ GEÊ®ËÚ±;­8$xÒ£WF`)L³oS3ƒÚÉVöòaäÞõmÅß|–Ú´†^Y‰ô fÖc4^JåKÐ4¢–Õ*iÖ„(GvòfæôµŠ•)D©6JðÖîYoä(–bÍõnfޏ9ŧ‘¬Å9׊ØP±zû‡ÃÐõò ŠBe\I5Â.0§¬¬2ÂJð NKΊgtÚƒEÜ…Ÿ&1ÊÇŪS½_úÜ}FÙI+6"cC Í„“‰y™Ø“³“6Ì|÷µ{Æi˜¾VÇ"qÜò=KÉûgÉÄ4–¼Z Þ"“ãK•ò ׋ÔXr¬8sƒJÿåÆuêu6}õ[êõŠäX™ú!óÅωµUËtœ i¸cÕŸG5êDInº g»Ž£«5NWpOUn¿Sš¼®Uo–-ŒU¨ßT¯|C½ò/öË46޳Œã ”ûðµÞÙ¹ßygörœ8MœRš Q¥U¤B E¶BIˆ|áø¾r8 M|ìeoÒ&­"(H!ØÙµsôUJQ!TÀ‡P°¯wgfgöòz{x6þć|r„úê¯Õ;³š™ç}ç™çÿ{L³ã_Yª8³Ajþ*cŒZ2—WS™«¦ÌH‘qu…|ÿÊó´°Š!Œ$I»vUhÊ1Y®S”z¨“P‡cò15Ò69}PµFÕÓwï6|û›Oæ Èl‘Úˆ˜u~4©ì›ÍÔÆõš‰©–o=S9áDÄŸ?mP•Úõ¶5ªÕ¨zc8Ü5#·†¢¯éZ8‘¦ö@ý„VNQOÝoTõ†_ÿ¼Cd¿æ$ÌTÐ$îïï/xZ>÷¿öÕ/Ç3DòFöwŸ\‘(²DanYÏáU­ìU wÇ”ÎÈt½®vÂaX>ô¸ÝÒX‰tOM×Fãm}Ï æõN¼öOwO©‘–ÐTÁ»u½ÓSÍ©øU©kÍáé ½Q7ʡΙûÝr¸#™èZªxîO4N|q¢÷è³ß}Ù¹{×–®Žÿøçq9Ú GN4Ô}‹%ˆcyéâ>U=v?T¯iM÷þÖÕ[­P?•lü×þ˜Ú®Ê‹Ò¢*­Z´ØFŽbÊ_%Ÿ«Lú¥ìõjš÷¨û–v/Nè4ðŒ§<á-™ã~b¶f̹YxY³C\|¸,uŽÖøäpQÖ_wSÚpEÌïXäIÝGÎöS_œÜôuËJ+IR$ûzõ²¬Ë”沃dzÈëÛ”÷³9Ã6¼RÆQÀ܆zçžuqsçJ}kæ½ÎIŸrû¬ôÞ²ïeúâkÖ['œÑó6ÃÏ,œ.y(-{,°„”ßž:ïH¸aùtÆÇ)gËsd~Ç|윻îð~°]$[%ª`ylfÐŽ:õaòxîš9¤—Îå×fF-sU¹QS.@åÆÖ-Œ³¹Ëìˆ)7^8“_類²™6có˜[0Æ‹’êýよXÌVm)‰^ýn·°0²ÌJékEúµÕ¹Í©+ÅÆ zv„Yª8ç[šps2w£(\^ ²ñ€|еðu¶J†ÄB‰À:DÁT[ûÌLè(´®ñxsdºMµCŒ¥º¦î÷\Ùû䲺¼„P©SbfíØµýjô´HI¥%ª®Þб áf z´¸~T‹¶Fõ¶¿ÿõèû{Ÿ}vTM7%bíÐx*@‘Ž©é(­0QÔZE9ÓÑ^ÍSË-H¨‚çЭ[Ÿ<°µ/ÇÿßÈåŒhLÙX…žŠgØ^0O͸Ôh:¢ËÇ£á6]߬Õt ßÃÛ=•Ðép¤]Oš˜îi8ø¬“©iª®n{4Ò¤)]šzD·Ë‘C1­M µÅä#áPCBï[R’µf5Ù>m·,Uª[eóŠC óçË~&=`7úˆˆÏ™.Ó}tÆ 5éZ6k~.í]g :~*ÓT/®W/Åü„áµ-^¬íÞOÄñ«k¯íàsxÇ&º™0ÉI4²@ ‡+p EäÀ€LØ‚8ºðÐóx‘Ià/BÇa†z±q,üb€Œ‚“Vž/\Å3 —xÄs<ðt ’6€mDÃ# Û8$"ÁÎñV†·AŽ0ÐÜ"aYÌqR!C" ðI¢ÊlYµ|i{噥—^%ï´!å§RÎÉ¥¼–˜÷‘ß/`ð[ÚEfÜ€kÖ#¤ÜÖ„ËõÙâ^13Tžñ™Ò{DÞcžïߘtsñA)é³§‡,³®µóp‰Ë;¿°"1è|§ÆþôfQàÑX§Móo3ÞX“ä 7™õš>÷’ßßfr¬°m³JŸàãoã䆋5ì€=šoÃÉÝ+ìˆaIRâ­ÁW—­?óë¤û‰ÜÛ¦‡ÅŸd3.&á¶ÄÜeI¯iÎGdÝì¼[Èú¨BÚ¡”%úK€…>﫪{n K±6žÙ+¦Y¢|gµùæYlW-•Ëç¯ÍR 7WåGKŒ •¾öÕt°(@ó17V”®ÊŽ•k¬øã[ÜoÚ–%ôBÐ|éHiÉ;yŽf‹­fçå^œ/5‚¥© }ÛG¾[_<øº0ôcöö…²ù릥ŠÓ)ž ”Ån‰›¦ôè*c¬t~Ô”£Œ++äÄGŽC†Lÿ›ý2â:xÔKiI xÙ™{o¯ƒ¶ ­Mˆˆ5 5—Yïá5>p€R!‡÷šµ1I•*ý£U©jŽ6@¤VTôR“´¨M£ãcwfvfïÃkO¿ RUUu%$Úü“§§ÑìÎ̧7óÞû~¿Ì¼{ŹS£‘<ß"uMÍônƒÚ'Ÿ$ÉrÊ ã¾×±cG•UOïïØ<Ã;Sb_bòä_kW' *½DމQÈð}BÌ3y°ík´eV­Pßù½‹ŸöHü ª3Ó.)Þ+.ÈŸ1¾?"uFø³Ï|Ý@QfØ3••öD"ñisõ³ößÈbqaá_•q~~^Y(]8tСѩ, ÕfÝݲàyd@Ý<ïŒF»%©âÈlwL쯣}qñˆ0=(FK«K’_ŽŠÞ©ÈP,霙<šýñ_½56²”™Yêý»ûf#'b1¬Üb¤_ˆuÆ„Á‡$ºÀ@f#½Ñè`\:^ ; D¼’Ð+D1Á z&™¸wo_µ·’DµÕÒ¾mMíJ-⬾ 0ô‡_t‰Ñ=÷þæZßÀèu&C:­’xïÿÚ.þ}EÑ)D] öïÔ¬sÏ.œÕÒ•Z £Ë÷· ÒˆQñ#Å ºäEMÚÿÐôŸ÷©³œ5"‹cê÷CÕuÖ'0œ²ã*ëc€‰ì%Kêüòù,ËŽòˆn±8ÍМR(AzÎešlH57l(øÙ\„ 7¤3A6dä ?¡ÈP–ž SÐSA*Ã1òE*ÔΗ+÷ÿù”å'Ó¹çñ¶ÚªeÕj¨¦ØCcE±,¨d7⃊\b˜™¡lPÐÁ?&©$‘z¹uµuo5ÕÓhÿáÍßÿFõ•=ën¾ØðnGÍ;­יּšžæ„»1ínL¹ë“ÝkR®uÿ±gÜ OSÂÓ4ãhøpïÊÛ»Ëo½P~«ÃþÆóëC­•ç·ÔœÜºöÅ5¶íu¶­µå•¤ÆL“Fò!õ,M°à" ŽS˜Eg±èKÝ„›JVEÑ`VfL¦w™ht}¥®³EÇí&®öZÓ!6†0Œýt!dM̉a6`R>da”Îtà–%…Ðù!~™»À†É"GÌ…ÑLP j !"dB–d€NpDjOÃ%N™º€.j5<ËQI¿^¾ ûhà pÌ  % SÎ3ÓçØ¶ŠÏH+h`=óå;Cö„ËŒaÙF9[®„U_´»Ú´ÆB²†Õã¤Ð—ÑeIßl’†9¥pxÊÏÆ9ͼŸÈªxTÙšѦ9Í\X7Ò†µðvàfù½Ø8ÔGm5,úSÔrÊÀ’øšr }ù%{~â+Åkxn\]œX¢\YªŒ/WÆŸ,^V/Œë”ËÈÂ[*eU&•§Š×‘ôÄ#³‚‰pQÛÖ„•­0¨ÎR§®Y ï”E~ºÔµµh­v•Ýdb–ÑK+óÞõįGmÙ›Ÿ“¯i•kÚˆrS.?.]¡Õx2×UÊÛ˜rå‹ñ÷¬ÏPP*â$£78…¿úúsS‘ÁDì4?Û‰v üÉó§[`¯ð¯«foü¼#ž:ÚÛj5¨`•îj³ž>ù\[ûpqŠÖÒ¤æÄÑoF…äÌ)(<£’ãî½}°ž-xµ eƯí\,¿A—“ÞßÞé^[NÀš7•¶3Ù¾ý@[±XÌ-,ä”\¡ì››Ÿ_Ÿµÿk+‹ÿœ‰”ÏçaÊ.½BQC `*£~óÍüÔ¹ßýˆ™ëø^>ê˃ÐggܰФdÇ'Z2ON$¼Q±; Æ›:8;Û—¼²ä˜ž>tæô:JK°D•ã ="ô  Р‰ŠñGdÌäèÃŽ„tƒº—N„ˆ6=Ù†$a .L»eñˆ,öߟ<(Éž?î?ó¬•fj*È&ÏL§Ç¿³Ñά`0µÃY#΋N÷ÉRßÍ÷ºêV©==­÷gŽÉ1÷§®ÿ¾[#=‚Ð-D<²pF+È=7ÞuÙHå3«¿>°"ÔåC ¥ õ°6’ jãAœ^ñ-}ŒÇSc/Ùo«‘/UI ÂÎ…ðô0ôIpøbqpù D É"fã£Vù¢-új™<†ìÒ~]2 Mq%ŸVƒ„ßHùið“hIP -‹l·Ù‘=ø·×£¬ „Ñ#ª!L˜ŽFŠÀY3…&j1"&jµ Fa2MhäSµÆåÏ®bö4Û¸-Äëmæñ]Õ¿Ù×0Ù½IvnÊ~zþðÓSžÖè‘¯Š½­1OKÜÙ”q7æœõéCµ¼³Iroˆ{7È®&©»¾ä=%åXÌF⎵qW؈ÜÓ,º›y÷†¨§…ïiÍ»ëâ]U)çê´·Qv­“½-‰þ-³® GÓ_ö7ür÷ê·¯òm^ém¬úV½­ÂÊ2(M¡©#I 62I’z‚D¡\%M$eÒ)’†3‚,Gõ•:½Uo¨eº¶±¯@ÿx²,RÃêLÉJ?îÓ&Chr—B˜Ä‘ÉQc~K‘„MHPÁlØ˜á ’Ï€rT~„Ʉɸ®êó#ôÜÈ¢”`#ЋcFñ¬Ã9Iø+?ô›6ÖZl´ #´k-ÔïŽZ"aS.¤O‡õ0*%`’‚ª`kñÇL`d´×éÖ"X5aÒãe¤ž¶äÕA¢£ùKo,˽bÆž£ /I…ʲœ=9lLú 9Î ² ú$szx»ÅÆ)ŒòÕíßÄ·dh]9²¬'µ²½^ó«K˜ò3uþ­¥Ù[*þª6ÿŽA¹üDáú?Ø/óØ(®;ŽWj*‘ãcï™swfm|õÛëµ1†ˆ£9ÕrŠÖ{O¯±¹Ú$mÀö®×ÆÐ¨5*J+µ“„’ªŠJ.•(JpŒ½»³;³³÷™þW‘ZÉ YJþÈÓWožvß{z3¿ßÌ÷ó[±ðV^úÒŠÔäÊì%åÂedaJ•¾¼j¹Üÿùæï•°ŒB£,×”t>ò“yÒ%ÅÂô©F­VÓ´ºŠfq®g&CHr+óÐÛãš{ÓúôëÅÒô#w/È+ÌL/ÛyÒo>H&]2d'±ÏÞ vn©„ä"pÀ^§Uþózçß vEC¯pÁCóœu×®ÚǷџܲůp¾Þ÷þµ»ª\+ ½ס8Cé Ãâ†íêoþûpX´Ìû-cÃͶ¶|ôTÇuz¤à±ÍºŸm©ï›Ÿ³Ý™·¡þó¯í(#Q–@U ¥ÁÀœ›8ûµÙe2,Ü×wíÛБÍfsãED¼'}øþ¬ž‚÷Ž¥õŠ?aš¹üs=Bе\nÈ|]ÁÀ¡w(èöÏw‚ÂB?l»t±%z1Ä‚ œ™i…#aÞyýÝ–¿þy¿oÞꟳFø#ÿ‰Íõ%:Q¡SßøÀ6{Çks=¡€“çŽÂ†L#GDì™»c…>¤œAs@òÝBð XvîÆ¹Þ׈ìòG¶6”¹Ÿò4Ïò'Îýî™r&ŸTr> %ÀÕ«Ýï¾Ó:;cà¿ù©Ó:ä{9nï7Žÿ/¡Kœ1±Ï7 wj÷q­¾Àomíõ2ÂP†ªõDéÓFdv´ ÞäI*>Ž>(€mÁréd¡4¦ºÙð !ydÉ  ˆè–gÇð”OxÈÔˆ>êYrŸx?¢€:#ªø˜ú¤I¸é› Â^$:¦J+SEÌ#ã‡e)‘”KžBiX%ô“׺ ýÏèZ°Š\=ERàÂ…йž$(2W¿©-À’“VAcŠrY_IîoR÷n£Ïýd͵óí›ÂÓ– ©vSÜÚŠv˜bVSÊiNuÖÆìÕQ{UÒ^·ã¹¾:f¯‰ÚÖ‹öõQgm¤sp…ho„¿¦{ÝR4²8íþLsÂÖ´7%­@°U¬³.î¨ÙŒI‹1Ù^•:¸.Û^qšDG}ØnÃD »p(`¯ý¤õ‡SÏWœy¢¬«¹ôÇU¬‘!iDCpR*A€ƒÓ˜Â 8a@q†D ¤Ö@Q ùÞªÑæ£>…ÏͤΕ$ÜÅ’W! ʤ“ű2:DFÇÉÈ.žÖ yÞukãnEÒ£ÉäPN©QR/™'Ã8ðhÈ0ú¸K åï43«YMž–®a ïuaâ¸raDv –v3¯fvB÷Ó 5./`uZú‰6ÓíÓl`Lûú ¥›˜µ*]W’¯"ÈýëæUÂ%Á¶n}ÒKc²¬¤Ixp ©¸—ÈŽR÷NÓÙ‘¥óÙsÉ™Òó­x£’£ÆRŒ–)ÑêëôØWQêmUâ¢&ú&Γ& â“ùÉé•©+CŸ™R&/ª’)”¦äËåþ_]Ð?Û,/S­éy]Á¤¿?”¾Pà=X¬ÓÒ8 UQÅè«ý•SëÛ)]Il`Éù?®¦Ð»ó³“ßO¼e¦^®óĦò“W .Òevºè󫯇Ã04ŠËJjJ‘\m Ú3¨ƒ„DÛÍ›§¾˜ûrVÿüXüW—§v™ÖÒ ¼˜˜:÷`1ÂÒVýé-{$|ôËÏì{~ެע„üýÄs>_v çüÜËK}ß‚B;çï2–ûz\&R­aiÕ(i’úøÃÒéô¢ý,ü×ö¾kß– xÿ"eRiÎxê‰'I ¡qŠF©í›ÙÏg­3wÀ^;ÄPßr¹!ç é䈈½ß°ñêÙV[ÔiÙ:3×-D»ÅÈÑpèðí‡êz5mª(;êÚzýZû|°ûµó?bˆÐ*­ËºÅÏà¹ã€ 1ñp`î××ñàtÔðÛE¾›ó[C|[8þËÛsû‚ü1žËýëìçÃÝ!þEŸ¸/ 1`Å$²ºµµÙÕ¹½D[¢S'·Í}5²Ë£õy{w—'"/{>—ÏßÅñV‘ïýæñãåçÁ Mvûïtð‘ƒßsëÖK%FD‡²¥X)Žâž=˜uèICúŒâiăGưÔ8žФÄdFh°›ðØêwëw’;jéJš&µ,‰0”ÖR«pRFâຠ…r/ƆÔ1ä³UÌ‘exríŸU ê¥<4„lfÎVÇ;ë#®Æ˜Ë Œé0Š]®ƣž³Õúm5 ðýPg}à¤Ý”h¯‹[Í1[cØÒ(X{³`5ó–zÞRu˜E›)cË’4YÄ À«)n©MZj5!k“èlìM¼½!ìlõ¼ÝínˆXÌ‹Iì¨ Ûª#£Ø¹Vì¬ ;ËRMq{CÔš£€`ßf|ãóØãk-ffKbÐÊ1†ÄHÓ—«u%¡'´:BK€}Aa‹S,†jôZ[ú§=È—'¨ì(ÏÅ[)Ìz‹’Y­N ¡9ðÆ’^íÝ1 D'íѦÜZð}n|‹x•KÅ79B„Ô@ À$‹d?ÆGðÇðkÛtÅï#ÃÃJiTÇ{ó!—€H362Xtý7di1I2å("?þØÊ»£òôH¡4.ÏŒiŽï +u ­$5D)¢^çÜôöë46ŠóŒx© qï=÷ìmc0Ûkï®Í+©AJ iCA0Þ{}p!MŠ`½‡× j›¶ß"µUB€,AÓ @¢V­Û‰ i¤º©÷šsOïa¦m©R#ù’U¾dôh4ffßÙyçýÿž•¥¨¡ÏÒØ6¸*¨+ba~ÆÈ|Ë4å€4µÐ8g"J)Z_8ómiL;q¦éE«\Oª)\Mà*Š0heÆþ§ÑÔ{Jiüq HùÚ’Wuå+H9./][Y¹±ªvC^½¢®“‹•þR|Uj\;°rò]ŠË¤¸ü«[O¬3›Í¨†TiaÎ ªá=Ez×>ˆ"ú#ÚüKÿöÒÒ‡Hõš\ˆ×=xO³h¹¡ªŽ/­]þÎÌUe%þ­ê‡ªÛ¿j¶7Q¨Ú@ieZ‚~vËú|î9‡À›Jõ±ÂPší›k-‡ÆË1.^¼ïÐÅ·{ξ¹;Ý11ÑÇd^çÅ»ŸìéjEP…YjDñ—zÖqü8¾7ù¯×3¬g¡õ Z-&フ|*áaØSÏlm4& Ã(‚´¶wó…™jí¿ñW«ÕŒÆo¶ÿã©V«óǵJ@rúä)à $I«ñ &ýnï…·)ˆGRIg*é^¬4„ä9?ìEa0“v'¦ú"ؽžni ´¤¢î‡»›î}9˜Üÿ¼ïù-¨7ép *#fÛ7‚ìÞºq$üb÷ÖvFÓ*åß>;˜f|é´3ËÎ$ñBßCëˆN§\€™Lr€Í8Sì~±pöç?{áBðåtú­¿ÿÓO÷¿ûÛbñÔdb`ÇS­ZJ¦ÅeÐEš ÍÅØKIÎ?ñça³’ÂS4²+5åá’ýyaˆc}É„'“~äüøzñƒðù§’ÞœI»á³5±üÉðØvYB¯FhѪ[2ù£4BFZ#å !AÅQåtŒbƒX"‚pLŠ5Ì„”3aB ()PŠ¢¹À¬.¼UHñ—B˜#Úì¨.%³Q¼E²s£(Œ âiò¼îƒ†þ­È:Úd ´E«)RŽ!Ž –è&fBH-JPˆr¹zWSý›Û¨ßìjúç¾öD_'ãÚ,x·BÜg½]¢§“uw€.*nû´§3ï´gûí…¾®JßÉÑñ´²>K~ ³äë,¹me‡­Úo›qØ EW{ÉÝQôÌ•Ï:_y_ç,-æ(%¸Ú¡à`!àä¬Ç:WíYŸ%çoÏZÊkÉavÚŠ®Ùš3 °‘óÛ³¾ÙKæÔÑUtw› Ž.ÁÕ%º-p“‚·*ïiϹ-‡½Øgyà°H{ºßzçÕ¶‹ÛýVÔÞˆ­×«õ¸R‹*L˜j 5Bc«ÖꮄÆÄ xkÀTϬ[uô9Åï7²€Ã1¼%jb&D”G¨RP[  AE1¤®„°j˜¨„ðbÍ…‘Blaµ†¸ 0f3åQ|~ÿ RŸ R‰@먊#)Pφd•PC9`Ã+ÊaÎùõ¾¥&¤Q¥o;Ý4W"2é¬"X;Z}ó°Q©¦1­–P*º©_œÑI#rnƒ©’)ŒÉjc4x˜(Å(Z¸HŠc˜Asc ª¸2ªË[>CÀÆ•0R3Çö øãˆÙ„+ÔF ­'šž^¯¸D¤ëË!Ò•ÕÒe¥'fâŠr|yíÆòêuå÷U‹•þ3ñÇ*7ÕÓãXyü1øE)ŽÜUÒ(J †FŒÜ¾y™J®AIʼn]ŠüUÓÇÑej\F#ÊWzpîY»¶,}¥tK-]Fk<Õ–Kã(<éôõ³X×0×Tñh3ÖÕËBÚìld¦ÎqéCΑJïÍ oð¬—Oɲ‡Xv?“f¹×8þ¬Ã »Ÿ÷%RÃÑÈNB³¾h ¹”Ð4;º)“>Í2ý|òÏœJdö.´¾A'ÈqN6sHÜ‚pú÷·\kõ¨‡þ„‚t|P›„@ü=ÚüýfûÚo^ Päò¥÷qƒÕœT×7º £»“©Až=6õ•‡cŽ ‚w±ÒãÜ,ëb7hËsÃ9ñø÷_ó´Ð:NP*ã³Ýæî¾Ìro|61Šìþî6µž’™H3®Ò‘˜FGipU³‰Òcr™×±…Ïù3i:å?Ë:Z#,\åaÓBê4›:šÉ»û¾‘’qù/ÞÞyûãþ Ê' Æ›·zYÑûÓSß#f˜Û$RÿjoÓ$;ôÉ_~ܽ™2©Ön\küû—Cë“GS½‚èä2ÇyÆõèùñ¿•ÌxSïì?Ï qŒ—I;Æ™L{˜ÔÉîM„V‡ÑˆÌ¤ANôàRÌ$F‡ÕH-bžíyõÕ‹èô˜º8¦*U•^]4Å Y@hc¡E-Œ,¨!¬™ŽÕQ¢tNQ;¯FiT]=¿:ÃÕŸN¨£¯ÏµP„À\G«BŽcr¦6cˆ EõJ84VkhìùÖ†ó;Z?êµýÛaϹ:ò. 4¡iî³d½-‚{ïÙÀyŸäZS­_‹èmË{ Zkf°%u¸­ìè,´åûm9‡wXYW'çÝÄx»R~+3`gmŒ¯#ãmc}­Œ·%ílž7F´à³ÏkDtwÀñ‚q΃Ä*x:XOà‡ñYØ6ÖoM{,¬×*øìड़g3”ØßUêë„*œðPv`‰è±ñ^›èêš=Ç·Iðu±~[Úg…&:ª¾ž‚û)9ã²Àý³¾ÙÁ€jÄ!Û½}¯¾°þm–žæV=iÈQT=®[ŠÑ«H-NâzLc$qEêhš^Gc½›uïì3Lž!¤JŠÈJAµ&óc†B„„ü‡ýºmâ¾ã΋M­xjž}ö=ŸÏ‰Iy´cœPÊ“@í¤j…ekéÄZHlŸí„“†‡‚¦n̓Ÿ’Û/¶J{RŒª[Å&mÕV6iL”U…$¾óÙgŸÏvì8ÞÏÐÓ¦hBŠÄ›^~/NÑßwÿóýýÿ~~’|‚§øK®eLy ãQ¥F*ÓãTv¤<,H€è"Œa³Ã¬4^¢ª !ÃE{™©ªbØZÿó®Õà„Å ^ èå ͤ‡Þ@!˜†®¦ÔÇ_Ââï®S~P±0/‘ÂpqnÊpÕBP]G%_IÚ(J²K®CŸi~‚̈́ʒÃjùm]:„DÆU>bÚ¶^ebž!'kpMµ‰Z;ÞÇ$®5®}ñêÊü¥’”ª0­Z¸¼&ÿAéâòåJÿùéŠÌ¤ªp¡²p•ÎN­ÌM®øý°Q¯¦5z¢s˪/.˜ö71\ƒâFg§z¬[e`ŸÑ#Úol­Š_7,N–K×Wä&×ÂÄ–k>…É’ÔdEâZiá&R¸¨OM=½©ÍÜXû³à6Š¡˜úJj5C£Üž÷ò.Â=á(pÅ {£B¯8wL ï•øÁ˜è½ûY_×Ëf­†ÖÓ& 5­¯E~ùk×gìqeàÞ]ohøÅû3vØó—Úß Õ}àQGgg»gf‰Ñ“ãßÔãU8ôY 7=u¥_„ÈËf³O:¿:þãXü²D!Ò¸¡!(ÅY¢bßËÖ°à„D„î”|,*öCx-Wò|°.ÎIHÇ$ñä÷¢ü)AtÿT»žD‚Öú:£æÊÕ!>âá#‡?ù«=àß½m ÉÒ+)DˢЮ5,ÅjÔ¼ÅÅCbÄ Ïö=¶F¢ýáp·õFïÉÑ7Á`/¼PB"I :ýÓêÔdÓZ£›¾Ò‘FæÞÚ¹£–QY´Ž@– pU¹‘…Þùñ¹3ŽŠüY‚dœ ;Š]€0ðÄùñ¿Ï+DɉØ Ñ>‘÷ÌÎ8@†±°sòýWXSñYXÌP‹ª{dz<Š,í«L–åýpHƤ'ðLˆÊÀ¶ï'ä‘  Hþ]&ãg–º\:H@pä*èI“>ýÌëþq¢öäNã‹5˜!1 ¦)hiB­Ãh« (LC18É41L×ýÙ] ¿ëêÝ[îÑÑu40·9élSœSNkÆiÉ:Í9Î2ϵ)Ž6Èñ8·9ëÜœè±ŠÜÆ9—Eè³&À-IgKÊe–ÍÅw (Eq·¤<­2×uØ$®CâlqgQŠ«#Åu(ÎvÉÞw´Èœ@ŠÄ9k|)Š@™Ô'à% &]$ܶè¡0 (ÑÛ’ìm-Þ×Ý¢¸šeT TÂe‰ƒU8(˜‰MäZm …³¤æl9×mÎ÷´ÊÝ´ÂÕ¦<ø6¢\GÔa‘¸æt_kæ€5åhOzÚ§aÆÕvs¯-ø\ÎƦzšÅ«0ÓB{K£j=Z^­^SMP4ÆbˆÖD±»Ûèà+êÛÇË gKù@]b¢.Ò˜÷!¹ ž–|¿€¨G,IŽªád‘|xjÂô­^ð©ãAƒ4¡-Œjs!unD?'BÈÂ;è·™Fükɰ*l—yýícì ’_5ÂßhEkËÙrÞª/ùKH—:«üTê4–+¿}‚:ÿ†îÜkÈM¯ñóÑZ9Èäš¼O½0Š-Ži—šgn”V~¤ a9¿©0AD}JÈ —ÜcœÛUZ”0„ž*#(ªšRíÛZy÷lê†A™Z“»¼²0­^¸P•¹\’š~jÙÒÿ’©ðÁS… «òSHæ^¸‚}ì¯Òc*’D;Ÿ-MMé÷ˆÎz­V[O㤡²’ÖT™ðš¡×ÊRS« —*R7péjÙütÙæó¾záÆyª4w‘Í_Yÿ ¥\]‘Ÿ*‰}Hy_ªaT(i@aÉà«Þû髳üñ(6Yî‡x®ØHÎ HÂ[²èâg¹?Ü´¶âF-›¼ÅžÛ¬ùôoß¾?Ó7'þø–k»­~©;wîùþÈ’[œèŒ ÇDÁ#‘A82ÃÝßeÒÑZH7-ͬ¯«Ç¤G ÉçóO:ƒ¿:¾s|,手½Ò\¿(¼ŽvýóÞ©íÛš1þLxUuS=úáG=‘hó’àýûçö=ß2HŠtÇ07´š çõj$æˆ  q0>$ˆCáH?(=~òüø¯šåûb’wv¦'!y¢¼G ÄDøi÷&æ„¥{:[HºEt:jýn[yvyl„Ö¦ÇЬ_›öážõâ#Lü4)#‰ &á¹ ™ Êh%PD«Y2ützúVD§?:ÁÛlª-¥Ô•‚@ º--PDÍŽV¡ÑÔ ôžSèù Ú×~È‚œfH^ÙÞPÜÐ!sÁ1‡”"9ÚãÝfÅaNƒF€ N›Šp¶‚²žŽyK(Å*ÛÛRîv°AÌÙ&»mP’Ó’pXŠÌàÌ`B9.ËCKX“([Ê×´À ºüpà‡‡&qXSpkG;”b·);HнC8[²8ÿ–¤Çú7pY ÜWæ€=E¢@ÁÇaPñ¢O¬Åi»‹ÐJz¶Æ]›bÎŧ€v ¨LêÝ/>¾ >"{Úå^kÌÙP°7†í–‹ßièÛb|¶7âd5ùoöË-¸‰ë ÀLK†ìYÒjï÷]ɶ° Ô-¤†& mÄšt ‰MÀÙ–Àæâ@’R\dYÌP2-}h:ä ÷LK›LfhÊ„I(Ph¬Ë®´ºË²,m1Óé‹é¸%ÓÎüÚ9çEûïîÎ÷ý`G–P$ı@þ(’Äi’àhÌ,óÌüïª']oE’#@;»ôi‡!á “]âCJeLB€Œ-Á$åÀ’K4#©øHíÄ2ûðÄ!:îÒå;5’‡‹wSê/àÈA¡f)Ë3¢ CP¬øå2Á³‚Û[MWUB‚”1p,7…Ó™ýÅj*ýœ_]…! ;"Qf>e@¿'Lv½ªû²Í˜ô%îd׊=Pdâ4€‡Š8¨´SHw")¢ ’NþH <[Ô‘˜¹ ¥M ˯VLú°²ñásO¨ýúüI*×O¦¦=*ú÷C™sOfÏ@éó…É>XõN ‹*yЙhîG ÕžéÓ…«£[€óC˜¬ôÆoõj¤ö%ÏbÇ[ÑØGšG•Oæ”9©U˜ŒÊž)V¾™óê3ý¸ÚûDürå«hXÏS´I$Ê9Të=»Zn}.àË ¿ªJô¼6Y~#Ø 7\úS]™¦0“@Qõ oÝÚõ7Dåfw×b+4±,‡23K°›w­=å6ç I áP½ÞäìþâVSy©Ð  K3Õk~2f#Çÿkd2™±É!Ì©ÃÃ)ðEŽ}…)ln¢ƒK{O/ ølñèÛÒ}’ÊRSHn ñ¨hªQ‰l”CµÙÞS[A`ü¹ï—_½ö–ÏoLÿô²eމcžei’7Ô. Ç÷}%½®( ’¿A l9´ýڕ͋痑ŰS®]o ù~lRwM˜Î![8Ú Ö‹ö‚µ`é°¯bi Ghš†hRsø—5²²]ÖGuŠÔ ¼õÙ'õmï¼`o_tâIJÛ_Zåà¶ ¿ ©E 7º™T<"YjˆH{d‹ä·…€*€ %YyÛèòk¶”pð]°yÿzu=GhÞˆ£Ü3ì¶•«NÜÅ'ìúÌÞï¤U>e‡h&j)q7–²³¹Æ‘N6éÐ&=º!‘ÚÏN3ÕÍÄìȰ váNȈszÚÉý¥•g¹~‰Y'0 ‚²$ü\ £ÖLÁé[B²‹i¸yw|MU´~”û@$€$ŒÅC¸ÿ8þcÄ,‹–ª¤e^¶À·õ;Ÿl\phE©m®EE728KãCÑàl§I LM ¶æ[ȯkÙÛm<àu­vCw|c£á“.mÊ¡Qð°“Lt!Q'qãQÕIåÌxõ“:hŒ:±”›òµi†œÈßìÄæP˜€sFáHLZB¬€0ÁŒ<=»²dÐŽæ;4y—øi›f;e3#>eÔTzˆÔ³”( æ•s ÷ìFIÚ®K:˜ŒÛrÝ¿—w²nx¨¿žM»Vu!—›ñÕÏb¸gLf5¡ÓŽí,Ïj¯&ºh¤QÎë†Îg½ZµçiµoZîtÁH‘ñÂÙ¾©¥Þ‹çú loaöLAº¯ žŠõ0wMb)–@øï–ÐG¬å¿wNó}„ìûñtª›fOµ!ïEÕúÔ¥‚] %WÌ'b— ùÞÉÊÙ‚‘óÅ `)ªSO?:k:…¨S¥³ÂŸ3Ò0 –$ÑJqÖõ?Û‚r“¬X|¾–Pd‹pkLÙ+-!©9mü‡¿åè‡Õ•¥ß8öþë¡À;a¹öêß-ëjfþ”£Ì„Á(RÜÊeeÇ¿)KïJEjf* §Ñï«)ãžoçϬƒ€™D‚Qôðácê ` ü²Ùì¿(ùŽÇ×3ò÷Ç¿/Ìî¿õÛw>7—Î]úMÛ³ë•1xQZB²U [%™ÈEýÿ€·ÍREÃOñ )Еå(NB²y-VÆÐ0TH ú™„éƒæ"ÿ9ÍîjÝŽ²_f±Q]gŽZ©¨,Æö¬wßfæÎxlC0^À†„5Q(Q±ˆ&mSÆx—ñN „†âmÆÆi‘ÒðЪ´¼'˜Ð´}èCHi 5P{æîw{ÛÜãåÅnÝDJúë×Õ}º÷è?çüß÷¿ …F¾©]…ÒzïKpjÌ#H˜fš_ÊÒúñÄàÊÄEJ»hНPGt3}‹£" µ~*1²$Ò_ÿeA‘Ã'Ž˜Áìùâvææ(˜(Ž(¹¹1¿$—s\¥ WH‘êûãõ7nzÇÆ8®yh`OÁj'lÊ´‘$S,[LftàÌÎm佇• ᇾ˜Ú(„TµŠÜóõ·pèÍc [m˜ÅlÈÎͧœŽ5wîÜÑ´Ä2Î9ÉÌãø<ý•йÚ~VHæâÑÔ¬ìe7…3LS²¹ÔzãVÝœŠŒ?œÅº(Ôpa"ƒÝ\0mçËÐØqAª ‡ I¶oˆ¡²óXÂNšM?¯V‡#‡nß«þþþ×Y©| Ž¿°Írk´îÁ_D:%Kå‚X.©uç±ÃÁÚ#úãSÛC¡ …o‘eÏB×7)Rƒ"»Âã¹|AOVÙXà@†úÞÚº‰vX͈q%ƒß;ÿZ(RsøðÖ¶÷Æ+øpETm‘Õ:N¬Yèc±: "á—×JB£,6Í=µR–]‚àæ97¨ÿã]ð]ù_ÛHH T'…ÿ6Z^º>‡ÄíºÜaÄOìõ³öøóL<Õ™¥©TlGj#Ñžìd7”lCSg°é.2Ùƒ+ATwôZ<Ýe[MÕÔ+Ïbv³©µ’ c f“´Ù¬8ì4f½¸ÊþîΜ?بø6¥¼“îÕ•/WÇ+7™Ë/œã_ŽT}ÏÄ}U¥IwqúHÑTeñ´ký´«,æY÷NÔn¸ïÙpq漢Rz‹ e #£i±0,S4„[a‚Å­vÒùÎöe7NäǺ±:vÖÆP%@ÇÛó&Úé ™Ø'Z-ñŸÉ44':³ç=B]Žçó—ä! …‘kÈÌñvƒvfét;ÝÝxh´a&‹3(aÙf…£¹RGF"`ý]]ަM4ZµšfŽîZ­œpNvã§sK(‚²­Fˆ¯Ý<ŽO¶:µnz†N´[‰N`Pö™"„絑3x¤ õàHk­æhÐv¾‚]oË2¡6P ¡ÿÎÆì;¿Á´^“vyy´Ò®é^6lžèÍH ë½+µaä?ý)y9#=ÒÅ.eÌ ÉBYÖò*™‹éQ‹"œßEÒ×p¥?SøÕm(GºH4î¦s‰$pÒãŽÚƒØø‡púªI„´KOÅû¡©A6Ù¯_,™ì7D?_[,èÒÙõ8a$hŒÄÌ ¹\e@6©Yä¨x©#ª*7†Æ=²:p'äDßÉ›òÀLˆ¢,ASƬ5m½{hô®ÿÕ}ÅVÜB™‰“o?ë~Q®y¿*6J’Ðj¾þÆñµ½Uµó9§G!h™…¦öíÛ«ÍLƒH§ÓÚcyô8>wDå8É“RÿKÿf´sïž#1 Ž 8HÓµkÀNë®$ؾh¤pç¼R¿h6™¨ UD">s‡Ç<À®~p¨È¹ …À Ãx=%ÃͼìU#Í;M8BR8h'ÄÓ,üÑÈ.TO‰âÁÛkÇÖ\Á 14à‘¤c²r„ç.t=qåÔø}¯"Ö¨òQAhä%WH<ý×?ùž¨ún?¨y~³ÍŠÙ-4„¡z×Óh0·F¡,T+aOLiùÆn <ïާÈ~Yl„zð7\®Y9á›+Š\1a~ç_¬[L/ä¹ê÷ÞßE:Æ¢£Q{‘cÅŸ:§!-hJ¶bÝT¢´B µ®Û ÆO-ˆj(ÞfˆvSA<݆${ôŸG[_cËrI¶ZiFµ£Ù n"HˆDtÏ9á¶oüé2Á½aÂU’ô­OøŠ“îÂ)OqÊ]soP«·NxËæ0úDKþ/'ÿMF*KW‰ì.Q<ë"U¥Q_IÌW¯Z3åÙwmˆz×)5E¼¿4Ô°åS÷³#{ò\ey[7à0ÊÒŒƒ"P 5b$¤#iÁ÷®2]¬€Ô€q: ˜bÝP´R[±ØiÛ,÷Ïbñ.ƒ@ä.ç|ç(DûÚJ1™°5ÏâÜI²¿¯+¼ß“m[*œf·ç€Nf Ù*3x˜b b“çÐθÇÌ0œKšQ®²cy¡Æ:Ý™±{a‚ ÒÚ_‰M©GxªŠ¬Ñ4ÈЂðd=ÑFÌ·ž©.Ü‚X'š’­™S]L¸=ÿ~ô[OëY#+L’Ù´qC]ïaguéáåÚ°Në7¤/¯Ð®š’ƒúɾ¬é¾ ¥üT?pC¢7 P^ûB’X™X®õÁ“½è§–×uû7“í¯?5Ù÷õG#˜ÖoŽ,­~±`&‹™¦™µ ål,šï0ëv™Æ~mÒ>^® fjƒÓ™‹e#ê•¥Ú 1sùS—u©‰Îc,N›<Æõ ÏÚ÷rü©Zæü×TÌe©I«p û¹ÿrãHÑêlhe ƒaks‘ß^øÄùEÞ=Æúè‡1ËB2y,;.6 ‘r‘kRäÃ²à—øºy[œêN´\¹Rî ²i„°20ŽÐç~ú³9 ÎQ2•J=ÁåEê/w|Vöý;Àûøƒä9ÂÚh‹667lQ¢õŠ Tì8‘ê#’=è¤éŽÔµ®"³)›‚zʺŸ7,Ï/ÖœcïëKT™¾‚è14~eû³š*`£Z¥%è_¬‚l5³,tÁs(e2é|å?.3S8ªÕš¶A¿>zDû¨»Ýc¾¾×(˜£üütƯl=áu²Ÿï#£~8Ò.±D·Jé/¼sõ.GMDI®2‘fJ°‚Óí9ñó³c3”OT>B“Õ¤.f)—³ã³§šòÉ¡9™á‚̰*3¬ I åM\ÈNêü RÎ*ç5Ñ|éS4=œ €&îÿñÙµU88+¸È¬ÉY7/{ó⟘5¨…D´è‚º¥¥#0+Ã9‰?«”óÙÓ¥‘øåå\ŽrW>…ψ^ÁÚ¶.„TF’Äi´ØBÁçß”øVs†¤LÐ ;D¡Qæ=RÀËœ¼°ûäÉf½j]]éÍ›»™±v™ë¯í²Û+Œ’D #EZFÀà&ðõ€"²Ð1é9Ï4ßmŒ&ºÞêzňR$„iuoܸÒ0•J}Wý}{¤Óéož?¥hþ¦õ( £Q-DV¿‡"ûx¶MG¡Àƒ v²Œ P\>}2]©Çó¬Xð|èf™íѨW|ŒØp뎯ÁVj"L:¨ÈˆK ù×®ÛXÑÁF¼W®ºË,DYÉó—.oc‚{Âr‹Ä7~~©µ¼Díó¼ ÅÛBÒ&¸ã…О©®Go¡¿çêbBgBMzT«EÐe‹Š>ÿâu!äe˜ú®ÿ½qu-N@³(m-vw¤•ZCBWp´0°!ÀLYA’Øö„|.Iò€n0A;è9I$êâx/Ô³\=øF²(èeÞo]#‚—¶ ŒC怎<CT š IBOä_ðXþ¢¨ß8Ñ«ŠƒAµoÒ™q²RŽê'zðÌQuê]øn7Ò¿%oUI¡^c ‚™h ӨDÁùPF"¶JÝ…5†îE×KáÆš”£&j_ Òk± ®Å1§5i·FKDOç[â2ÔTù”"?hdº*ä,9—„]WuÔ±<ÚøQ•nªJ´¬ƒæ;ËÆÝ‹âÎ…@#aÇ ÁþRÚþBªÁši.‹û–þËYÑÿÚ¼5¥ˆ^=K‹Ò„Š0’ZŒR«pà pt]z©Y{ï9ršŽœPK‡Õ‰#Ô£^t¢gÎdû'qL; ó~z÷Æüb„(‚ ."Hµ2b8Mg•ª©J-}w'‘927ÙK+½jùÞ±NoÄ,ÀBkaÀ†‹6¨¶8…pLGæ`Ž01óΟè©ô~rsù3Vcö©­ÅzçrÇ`¥{Ƥë9^$ö¨@…%Q©cyÉ£¹±ÃšÌqŠë¥»ë –à8‰¢8ª7š³hßW÷l/ˆ]Ð ŸNùfcê9y(EëÔï8ñÄДK3¥Alº421ˆÆ†f>‚Ògó&>ÉO}<“9g]½Ò„«1 ]„â‹,¦[·=RÄË àä/Ï6Ë¢GdÛy¶ƒa½£Áö3ï¯ ²¿f;˜×8¦õÞ=×¶_–à † „ ëÚmã½¢Ü*òÓÆ²ö'cÝ$ç­¼C\AÖÅ1û×ÔS…”Ec0µ~ýúp8üMJNLL|W1ý=yd2åÿQž4üôéÓŒéqYKèYW¯¹l£Äu„8‡À»%Ñ J–@*µŠ¸‚èœ¶à‹¼ þ-Ï:xÎ&rÁ@ç¿ïÙq¯ 4‹ÒÞ}]?3`4A9×ú}­À7q=7oºÎüîENÞäÅ2Y®›ö?wì^†·qÁÆd¸ƒ ì Nº'Ý¥BÇ?ntѹ¤ÚD ¸Ž¤iÔD#Ä|ùÊ¥O`ö*€=ÿÙ¥u×®¹%~PxãÈWMñèn 6Øþ8ÕÏööÝæ8Ð ,vÊüÛBðÀýfìáIÞ)HpS8ÁÅ'ðÓ×ÿIŠalrÈÎ3>™w‹œö†j W“@¬8±ÞZx÷ðÂT7”é#â½ÈT5’øûåÅuÆñ> "ÂÅx½ÞÙ™ûÌŽ×ë6¾°Æn!-4¥ˆ¤8¾ìÝw0w!°^{m %´RÚTÍC Œ¹Y”¨@”TQûPUjÅÁÞËììÌÎÞ׬§ÇAB}q%"£¾pô=œ9}óÍÿ|ÿßyŸN¿ÜKtnÈ®0"0n€qŽ¡p#Žs(LŽãKˆ?m.ò5Õ†[Ö¤-Õ1Ke̾DvVò–RÑYžì¨–­eQk]ØY'¶ÕJ¶%ñ¦ò‰ÆŠ¤¥*l7=±Ñç423á¬Ø¿S³ú­aûª9÷ÎsÉ‘lÀ“W±Ô%mâÒS»ü£+êø…HÀD¹š«\&‡5™ËšôÈ,á’&1œ¾¬J] ”ËY?!~R5B™˧¹Ås³÷ÇÊ.s]š¹¦Ò3g(À4è†e¹ñaJ!¥« gŠF”óHjDš¥\%Ó²”kLbxþßTçpØ<½®Œ@ÈW^6>Ú½þYìŽï½Ôë·úù]|pïTÓã[Àe ØïÛ(âúuå¥$D2´Š%òÖ­"FÇ̦‘'^ù|Ììøoy<-**⚆  K<²zÜwX’ö ü;¢·-$8€¦\20@ EÌ”ë€l„ý¼·C–>¾ùÛo¯_‹½ùFõwÿì–„Žñà[Ÿ|¶±ÈÈÚRp¡ uø‘öjÉäããÛ¼¾Aê”å6aìƒPÐÍÁ°EäʼC|Ø%…œA¹ñióùûßÞ½6dË#²vt½ìܵÅæ‚yž·Ø@~sg4b ù[C¼9àkCm²ðVÈ×å³G6pŽ­Éa[Ðgþa4PDTÞ3>ºçã³¶¿®Ú²žÞßUÿÕvI<ÎZ hóóVA|¶(B–!ÿ~Þ×ðZÃb+øM÷8ËŒ:c)œÒêÔïÄ”có“nDrc©~øiiäÓ²áÅì4Cò1RObÉÍÓâ:J¿ˆ€Ûk™»;*kµl®Ž´T'[*ƒöå!ký]´”§m¦„µ&ØP)Û—Ç­å`%b6ElË%ûJðNÄR›²Ô>§‘™ ÑR'šM€4⎪¨³Ð ïXìwTDÍq{mÔ¾ T^´ÔH–ª¨µ4e/ Z–Äli[iÊR1WI暈eiÌ\³–ŒÙëÿ¸©|kÞˆth!F‘;¥iåX ³RÙ}ý?…Oôª¦•ÐIäÎ˼ÏÄúˆ‡ƒ\òtî7ûñmÆm5ú÷6£gvÎJýšM»1¿';|2+ÞOúNCŠ«8áÒ¾V¬&ƒÁV«»ÞÎñGµ_Y¡»{JÖ”æèqd¤ÓëׯÝù·zJŒD6ŒYšÉᣛK~·iöÙdº|b.]ºW­ôåfÜDØ­ûôì%õiÒ2<@ èíÝôºBJƒë©9Ž‚˜íUÐ?ÎR™YñsY“Wˆô•9Oëò‰‹Ù€C2×r’Có&†²¦/A“—Ð̹Ê¡\ÐMžS)#Y‰!Õöêu ÄÑs´Úb‹}ù›&¯/T.ª”‹êäeøó^¸®Áˆ¤_®!&†±ÌgryöŒÑÈÅÜôð¼èÍìä0˜£é¡Ù°xãG}¸Ò€ªX' CñîÝ+!‹à=$÷†BVAnö‹Ž1Þá ˜#’#ìs„‚ à>xìÀk1—% JWÀú·—þû~»w¬Uä{Ä@G`¼Y|àöÉPƒÜð:C¡°ùñ£›iØHÓZèÇïß¿ÿØ+ŸsÈ3ñ‰‰”’Q¥§&&[·ü…òi‚Ö#…¯¾H v)ô.ï·C­>¡c¦ÜY|~ ¥N!¬|Ê|ƒB—Ïß&òÎà8ÐO'ðb/¿Ëf+¥Ð\JW±ÔTxë‹m¼ow˜·ýõÖŽuõE‰¢HázV?wHr›o¬C€ …@ËSç1{MRÈô7De@ÝMB¨ãÁh[meÙª•‹Yê…CûV†CíB éÎíöÂB5ŽAy WZ„9³uœïÂvÀi?€Ê‚¾nÁß%;§Šàw‚‚„‚»€×{ÅÆpØ!ñ]<¿óÞ·‡^z‰`æpŒ`)´8þè÷ëÇ à„†üGÁY{Ö4ÂûÛ‚|«ÏÛ"‰­~Ÿ5Þçë9v˜£})Jh8c û\ÌdNÂeŽ ¸É”›ö11TG5ñA4í¡']H¬•N‘~XqA‰ì§ffS½ŠÄu `Å øHƒõQd,^‹ýë%¢c¹l6%ìS!ZÊÃvÓÿÝŽŸÇŒDÒVm©|n_ñ—·kºj˜: &µ:˜ (Ö“0ŽTp‡ŽWà/qƒªä)Ÿ 'û¥ˆMï7H.ct»u.bò8‘qC©þ¬˜[÷è§¥—!s<[9©»ædWäkTZ–2”ü‡ý2â<ãx%š¦ÄÆÞû³;÷Ìξ&X&6§©Ò–"¨’r@Q“`|¬×öšÚæjÔÞË»q¸¤ò¥U_kãPé¡T‘¥U¯¨âØcfçØ{×{L_·ŸóÁ(_xôh4iæ}æ=žÿïOc Ê4ÂÈ}vRo+b>HÆž†+)3¦"`º³0°‰d5†Wᦠ–/NâqŸI8].ûô¢›NzÔ1—Irkc^$îÃc^,æSn,ë$3gÉÜuÀ…Œ±á2ù<ñ÷áÚ×Öj GKe·/½..›šXö]ðo'Ã÷xüëË£;›«H\IèÖ›&¯wOà¾=*¶ñìàíÛíµÕ$ Œ…ÎXc|jfú`°çú¥ÈÑ厭’B»é8#kù#¢x” õDV ö—wW1‹Ã_Þe¨©Áq3at%FLŽ¿˜-Ú`æqÓ˜[Q°ƒÅîP°#°Å¥wlYO`F¢&£Q9ø#8í¬(x+c4îS$êpˆ.cÎE,:4I,xLyWiÞ­*zôQ·éÒÏñ͵j3 ×êÔɘHœÄ´:¡Œô®:ÓG?®“»¶Ýkß,Ù¿ïmŽw4fºšR]RGCÔúÍËè“|$³nMY7%ÚžKv¬Kôm}зýN˶‹»ê63Ô³$‚#Z ‡ ¤Þ‚é*aM5 u6›ÿxÌ’¾‰£zÎY P$ëÒ¤œ«¢.UÚmȺÌI÷ ¯%3JçÝŠ¯£‘¨“Îèrn8{Ép뽿¡Ü¬(­B(ÃÐxÙ¥·(ÞW–z¿*ù^襻·Â(¡CÄ›j)bÿÚU[«‰JÃÓZBHxoÝSŸ;VÀN: ·*ãÔ­ÈŒày1-žaÒgˆ´Iyô)”s2!cn"ëƒãŽ’øÌßÜÛK,¸Þ3’2h¿ý\•æÃ!(=­ÈÏ©äë*ù“ŠÔ”29Éó:yfUv²<7‡/Wå SPqF›÷+ 7”yÚ¯-Λ\öLñšŸ/[\À³sê?øˆ-&Lé f0rOãwÅyHþ’§5…é²âR˜PÉþ²Œ_]¸aÈŽWÈ ÈiH¾U¿R±8mç+3×ÕùéyIOh—[gz–ŽÜ4î}"×V›£yÅ_>â…6‘ ?è–øN‘í ýQ©t]Ð6#ÑÁ;1ŠPíÞ±öÓ»G@åØ'7› %i‘ s%a|°g7ËH‚MŒôýÏôõ‡Ýß#þEØî˜Ô»$C‚=Àf#ý7oôTS¥ jÄMÆÆ.–0$›Éd€V>‰ÇE€zE9Ÿ+‹‹÷ïýãÙÕ&ƒ AêÑ_½»M#¬=ê«æ¬ñ‘©*l 'cƒ‘po8БˆÙÙP;< °ÁàÛm¼p"Ì L\Û×Pƒ£X¢‡M´ñõ7*ÿúÏn^ê‹p'¬oÖO^ß/ÅNòÒá@¸°M„í»‹ ô,·žP 7{GâŽKì€p€QáøÅsÍ4©¦ *HmY]Cܹö Ⴠv~÷覽Qvlâ§ÀРx>d[þEÜIç.Q&:B.ºM‰MÔ©Iø˜¯£‘¸×x‘ªäiìe"æ£NÔ¶}qƒæ`3uáU$y^›þNa¬þ\;! Ì`dôxsü»cHðRuèìó-›š˜©Ñ W[ÌI§!}ΞÁ2Îu‰(;ªË¸´‹ŽŠ‚’=hÞ‹¦¼°4ªÉ ëó`¸4áÅ > Tn g]ú ¯V×@ £^OR•FÊ@"ê+ǙĬZžYY×$§*Òsšì$,ûUHŠÓäÙ/óà&î+Ž· å0¾d{WÚK»:}à+ƒ§5„Ä=¦i7„iÊ€1>$KÆÆ6h0¾äƒ$ý§ÍLi¹ŒmYL’I§¦üÙ™&$MØÒj/­V·doŸÈßùÃ2Ìd²ó›ig¥÷Û·ï½ïç»jqç«$v%3áÎMx4ÊTfH®SÑ© êµõªû‘Ølž8M `Ûè|š¦f‹>ßòÛºÜÏßöÈS§2Õ)FÍI¼…©žuþÇ+WÖ'ç4ÊõuÉÖ­Ì®M]Y«^ÕÄÞEãníÊE!Jʳj -ä© üG•• Má›´¨Îd¢Û´´ÔÃq'BrOzÌz{Ár 8µÁ×åcŸ~Ùqîå]¼ó³ãޝ¥½y‘A §Üj*ÑFi4Ú‹—÷„pìQëˆ}‹wí"× ÆSrzÒ(Â;ý¼ƒ—Z|Â!%tögj n¢’@ÊJ+¿øBXNkf4™Œ?dÙþŽiÞK}ý1~èÀó4¡74æì®cXþŒO8̱]A©”ÈÇåEǃR7™ý¨- °ëíL«üø€<ËKÝ]lß6”BKâQ 2pú¼í%vñèož¶™B\gDõôš¢Ðp¶âÒÆ\Zi„ ã£dÂ…\¸<ª“ûKJs¡Áq’b(‰!0”0è7Õšð³O”Ò\›pÔDì;[µd«ŠÛÁ ¶m‰Ùk଴oØj¤ŽÚ‡.£ß¯³:kƒŽJGMÔ±3b«QZÒï:é¬õq[u¨¹êFcùÁ-F EnÅuÄ`уXÓÆíámôÍÞ"eL£Ô!Mx]XüU"5\ aêkÆ¥ÁÜo¢‘å‘‚à68IÅ'É䢑ñ ÌÒ«÷šA9_$¾bjS²?è¶l%IBo`M±»Ú¥—Ï!êHvj<ïÒþBŒÉÒSåE ?‰ÿ$\¹Ëç±È8™&ð C` LdËã™ÊX.ü[x”ЏôêÁä1"0HŇLê )ñ2¢ŽcÑ’KÍh©1fŒ.#p=M#¿×(3úÈ ¢ÎkRîìÔ¶2O$f²Wf6®V哳Yê|~t:'hqM ¨sgEݪ[§Î¡‘iRñ˜Þè-ØLç’: A"&]ÞÞí9ÿ½|?Ül~üºfi.㫹ìO/fo#sZu_™¦–ug¦æquYqÿP½¶1æY½–›\ £³kV®d®vŸqφ„;?:³îŸ¯×[˜¢<"¯ØhÑ¡Hß?×ω­A¹—g03yÚˆEƒ'Áº'}wÉ¢]Vš.¾ÙÞ•D6Ñ$ÖÐ`ê=¾ç™_×’Ä ÑðXµŸïçó¶Â(“ø.YìM7Î. ½¬¯ ü Ÿµ‹²MTÝY:äçN=±Ëh†÷“z’h|êÐË5¬ªÉ‡*ÚßÙcù~~aM_y‹ÔŒ¶¨Po1ÓYSïíg¹nIêösM¢àüÇ”ºIÞÓÑ!Ž|u·)¨œ„zè•üÇX®8ÄÑ^ñÂÞÊOn÷ù@øÄ^‰oÙS­MåfZGQE˜I\séR£è‰ó;á·²Ôç÷ö¥ë3к´Ô$®žF‚R7ëm‘ƒ­¬pÐ˵sü)Nx¢Ëbÿ_ÿ¼Ï€jŠä§¼„ºù¯N/ ¢|$¬ô) ~‡,u l»Ø <³ê<ˆÍÐM~?4Bp»ŸëæîŸÃr·Äuh=ýäf³nÛayã/‹Ƥ£Ÿ2ýçNggWuC}鳿,ÈçüMß6HàÀS¤‘Ï@K’мqÑyëãÃFƒÅH’$Vd,@¦Ž˜âc:eˆR'(p…ò –œ A/þvH[_–]h*ƒ4Zi"ÝãàYtT-•yª¼Û´Mtì–»¹¶­B{…ÒY¥8j…–ûÖ¨­:fßµíPZ«•öÅQìØùðeôûõ –bÛh¯Û¶sí;ÅŽŸÈ?;¸¶ªhky¤¥:ÑZ¯Ú *o6mê¬7Y1$ÇXBä“嘾„6a¸±ÓÙëònö›ãC†åq³2‚†]hÂE)¯`ñÁõBÎ7ш:„¤ÆÑà„FreGF°ä )5H/hC¸:ðˆêªˆŽ3Ÿû6£b*Äi e=³·T˜ÈS‡­êˆeq³íBP²ˆ!‹uغ‡uù‚>2†A{]Ze¢0|Ö6„'©à$)¹ôÁ!Cl˜^%Ã.]t ka“tù|¡:V$• Lx»ÕO™ñL#fÄ 4MdâhY÷3:ÿ sÂý#u ½³&y#?:«û?h$îÞ˜òä¥<)@’pç._ÍJÎgç‘•é,uÎòþäÆ J¡£§ TÉ‘ºœÏßÉT2àNnAÛÿ<ý³ŠÒ2]NfØL¯?ß¶Vœ.P=Ú°]ùŒ½‹«óY¡Yêæ$óÙe4yC{{£ ¨ã!V»ÏåéõQ}ˆ]Gº¬ m ¤H_ Èßß|Ž€Qm×OàCý-Þ{­áPŸ$—@¸v¤l¡ÈJ+ýî¹j¯ÿ%¯ïE^ì8÷¸‰ÈÔk‰/ï#§Éág§ܙݑÎì=÷ü~GOÁ0<>6 Td.óØFʺ—ËÞËæ¢‚TUQf¦LZµ‘å÷toˆI= +L¬§™]÷Ñ#ô‚czPt‹rÝL¸Yˆ·M‡Þøª+Ìwó|;¨(^ìüÕ; TŠT7U›¯|Ö,ÆjÝ1awànW™Ö¨%) W¯vÙ¿¦ÞƒŸbßz8ÚÃ{ø°Gm±˜[à.4Ÿ™é×Òa !ùkÛ™³[Yóá/^¼yÛÃqm >¯}Ú¾¼2¥ˆ†(7ëÏ´ Ì!`ãÀa$© ·rlw,Ò˲- ·‘ýàrÏ ô&@ïaù6`æ ×Î ûBVp^ÛQª§ŒJ‘ÈS%0eÛWäûnܶUU :M©½¥ºb¼çaÛïbh'8 0V„Yûýµówš¥Ä‘·z7 Ȉi)%öÜX¦œ{ÏøŸ6÷’缋SýyÒûÊø€.ã+Íú©Œ_) h²ÃxÂ+oæN!àiÄ%†qz€Ìù¡´Wùåd]µz VL¢BY´¨¼mSÞÌÇdfì[¹ËEñ±Â̤b~”X0å'å³#‹Ó£E@HRd©ósc…ÙÑüÙÉÅ™óÏä.D'+woÄ1´ØˆcíÛ‹¤‹ªÔ¨:{¿6\ø]s¾‰R˜ŠÂ*Ú’BkÛZ•8å®<‘ù]^n OOœ>PÞTJ8·*¹) *¹•0²àŽ’ œæŠ˜­wÂ^›rÕÍ:–§ÝËS븎Õ3ŽFÖUŸê¨ÏÚk“6à¢ëfíuܽ|÷:½Î„«µÈ„jLZ¥FQƒä½¬Ÿz×"zɈ×õ•DÉo²é á-ËzµédnP›ú)Æù¿÷§üpbPž:EÞ:^Ññ<º\«úê=!Ëù)ÁÞ•[œ›(’& ýVY9‘¯P•™hർù hö÷…ÉKÈBóÌNeÏ-šŸ$€¤.†.W7Y VéI $Wnßff˜c,Ý)ò.‘·Gøn–Ûyýú®m›-¯n1ïÛæÛ·PX¦C‰É+/…èæ¸àfŽ;S:TIjjцõšÜØɨàà'ú鰓ã‡ØVÐÉì;ÂNÛÐö…bÌvë?½Õ*=FaDÐÛGßžK=jlÿŸ®{¹{Ÿ]ýG´F=‚«e-ræô^6ê"66؈bÚ9¾›¡íßúm$*öBýæ ©Ó#åò‰/ÿjì°S–óœù¨ÅbQjµÅ¨š0ÁæW~P;8°y׎FRJÀO‡ÅwÍ Ñ%Ñvž5Ùf÷rŒ°Rì@qïûíB­€¶v´­4"ÀC ¥¢P-©ÑëPŒiNŸn¦é–¨ØqõŠgEåÿØ/óØ(®;ÓHM¥v|ì1÷ÌÎ^¶×`ðm¯lNZŠcDP) „ÓÞÝ™õ.ØÆ ¥ÛØ1 ‡T¤©Š(-66P¥”F=¢¶H­Ò–æpíݹg/¯w½ÞísÝô?¤Z!¤<ý4zó´3ïÍoß{ß÷´/­ÁÿþnÞ·3¨trmáPðIêâøƒÜÂó£*^à!<çRÔ®Oþº¿÷DÝæFjkS¡cOñƒ»TÙ#øm\_h2`H¶Å„SËÀÀ´i&Œ¤ô9Ý«>÷3ˆ“Ÿt=iQÀ¢æØ¹ŠÔ¬O;TùÐ’Ïä£Á€Ã§ì¾tq ådD.¥/¤uvbÌËšÃTFØš?ìª÷TU@P°Ð¹”Ã,ŒWÒ‹ÏnÍRðx¯&ñö#mdºŸŒœÑ+ƒéÁ~mâ´!Öƒ…zàÏ©LD¥sXø$‘ê]î'†·ç^qeÆûuÒ9ZÐÕy­ZK"I„ZÞÞ¥­‰ü ñäw–T®0ñÁAfª;ø-ú×ÝuÏÆOAÑ~44„ÏôÂÀU¢½æø™p«ôéb§‰D¿yn´CºÀ{t¸‡Lõæ~z,÷»UÉGPFX º¼-eÙã?†R¿x>yuIü–v¡”g™½™5}mÉ̵ô¹Æ]r¥¥nÉ«i©[ÙS£Ïù?€âöÔÈÒÔÍÅÂ(¼£Vo€1½I£'³ëŠðï» Á]K_)‚qܦÇ˪é4ùz?’v¨QoD 0Ž`¹(œMn_KrKþ*}ftÑBÇ™ÓEGééѬä5C¸ À¡rªÏ{Û<{ h€îQöéG¥3&õ]Ã@S68²éP:O‹4”eLG¢gÉÉ·Ì %VÌk1É`!qÌ„Ã::ßh˺ô¦-ÕkRú`ð†Ð îÑG¬‘sâ?)h•!S WßÑG‡°X<Û§ ŸÌˆ¾gï[Ñ»f‘Ž2›ñçiË‚Š« ºøâÌͯ§†Ócײ×uÿ¹jgÇÒScèÌUbzì¹…ÒÿQ‘º?øb‚5z<Ó¬ÉÙTh’jˆ]͈ßÎôý,ccq®E—ŸG¡7ÎC›ìI¥S„VORVÊÒÙ”¿¥®kf.ãɱ% í7öaflT3sE“ÕÏ §%nþÛYç"=n°^À „Ì!yçͰ¿M–Ý@$꾇ÿôRÐbTX[…ûÀ©ÐÏl¨¥,ः+K–½ÚTW^j£ ‡( §7­K»w«Yâ‹x¶÷{AEàÉ;^ð‚àxOóëµ&=f&q…^ZŸJ¦fggÿËÖÙÙD29ׯÊÿSæs‹ÅR_ I8)=?4ØÖ±™&ó­ÚiŸïVä–ÇE1Ñ×%‹¬(íå9V•;UÅ+ÈQa×6~³šÀ—‚~×®Öø&»ç-î¹ðî¢rÜ/2²zÈÇoßWe"4¤ÞHB60ËŠ³ïÞÝ7éßÏqͪ´OáºLU±CàAhWU>(I‡}~ 05eE&¡Ý»Qn¥ö‡ã­õ5+ ¢ ýÐ;‚â–„2ßè?¯ ì—•E7çÛ r ÖHçó€a?W'mXc4SëL°Ík=j!¬9Æì÷ßßÜ^ð¾ê8rüÛ݇êÏõþG,ÈR0|xrÂÁù@㟸H oÜd»àï †ºÉ3ákQmA¹k‚÷NÈs öÞÈî"XGeåà&‚G%”¦È•b.$µÝëldëew-P‘y™#˳¦" RL•ÌV¨L¥ÄØ¿ðÚ}ÚUb #n[ÈUqW(Žª€³Ni©bVE\Õ’§2¼ÅYj[`«ÁâÞꩽåOýCžÑ3'ÀÚÿÍ~™ÇFqÝq9‹M£VP(*ÍÁëݱ×çÚHè!jð±kch#õŸ¶ i †à#Y…J•ZÔK‰Š”Œñîα;{Ÿöô9HiÿA Š”§Ÿfæ4ï½ßoÞû}??±±"ܰ&î¹¶~dß1ñ£í?XgZƒê«NW¢¥iU”AË^ª0ÿã $2d‰÷’€=Ò#Úùs ù¼:ѫΠBé!mjP•ôjb8æÕ…½¨è},ÄÎC©ÓK¦Û‹‹´*DϨ˜Ârq«Û–óRmËV¥¤´8Q„"›ú7ö¨Ø– ÃTë5еæÂù!clX—(2¬õ)“ƒXzJô¤d6?€Gu©!"Þ‹d½º”ô"®@Ò¹3:3`Ø€¨¶Yà?Qò |u‰ü¾:wƒLLåÅÇ–f/+å?ª<-ÉL=w®• “žÄ@^ú˨J˜Z*O(£——Ë7Ñ¿]ÔZtËxe©Él.  ÇV“ùouÑáq\žR$ÆÙÉNO:obrEvB›ƒäI87¾Lºº$qÜ*Ý»©ƒVд Ñ"›« 33ms3­ÁPçs‰bw3[k@M8¤òm%÷ÌÇ'»OU¼°ÓZH0-jyÑPø²÷.ßýÓ1©@Ç9ƒb3ϵ„¥N FË{Þ%†Z®;wÊŠhFHP£Äùs#”ôs&I¦ÓßÐÈl PÙlöÑs2™\¼-ÈÑpÄf¶RØ"Šè4=g¶Bí³]AÑþ´TLâO'h‹H'}>; ‘Ïö÷!(«º}ëp4ÚÌñï¼sÀˆ¿³¿yÓît£M~®}r¼éЛ•Dë6ÁÓÓNèCm`4Îß! OL#’Ø ÖØ ´®%(ò“O^Ų̂3ï{Éäߌù"=<á眸¶ÀpÍœ:¾çOøçÚ¢’[^ÿ4"òΈÔÁç~ƒ8&p!ÉîãÙ»÷§owã°ÚBX|°ìÚ»‡¯^:¸§ÎLB$aë×¢¶EcN!zØ'ß[fçìA©…}öXÔtr¯œFø@»Àµ/ž\Áí{ØÌûÚÂÁ®ÐÊû:8éä,ï¸ó§#ûëJ +¦ƒBᔤ ÔPYô×ÃuIvC¬¡Xj¶5ydÏ\×¾œ…+…¦Ê¨£zÞ¹1ÎVÇØõ W™Øº8vTE›kC®ªpKÄV&Øêèë³;dWMÆ^$´në7G]5â± ˺gîÈ×ÔÀΑZkƒµaWyÖ¹Vv”ËŽÚ”}SÝvmßú=f¥Eаb-jQRf#f6¢êŸ¾Ýÿ9šô ’‡ûiî¬"}aep@ $íA3Ib ŸƒƒÃºÇÑHÖ‹,xñéfÃæÂ¥f%HSÏu ^ta@7éÈ3SZjiƒeÎì5ß6¥Fj/"¬z†ÐSuk LtŽÌõèc#úä¨><¨–ÑÔ “îקϪç=ºh¿týDʃe‡±pŸ IrÔ$ Üc6À¨ÙHSÔ«Õ­QB^¾n ^ùVê}…|–?È_’qÝÓ¢‘ì2ܦÕJ#QÂ`ªÌu]zªP¾òœ<å.-÷Á8ŠU6A«Kq•Š4Ö˜VLÄú`eúÊ2 Spæº*=±ôIçMO¬˜ŸÔ¦¯hrï©ä›+Ó“yÉñüÜ üî¥M•VŠ¡FÔ¦‡™÷  °õsî°xœëïüë0­Ïg´›V™,ƒC»ˆG~ó{gU5¡×* ²P׬5ON´Ï lHìôûXŸïh0Rq HþA±ç\Í{Bϳ >催§‡QÏà(J`hIñª™{÷s¹œü“<ºæ>{ø¦ýß–ÉdþÛYÓɸ¾öÊ«”ž¦uƒ»ê sB§ŸoK$›øûÔTÌ×4+rìÿ}n®>>u{º¡´”Ñ@y¤Žòx·ˆ|ÀƒO?u¯±àd  uÿ™ù`»Ÿoˆ„ݾ@#ðþé¨t*byá¨róþ®ˆÔ ØæI×#"¢¬ ‰¸8®¼üðïGJkÐÙ¶TYbÒ aæ•h  Ó¯~½—‚)R[pqd?Ïw#´]~òyÛ‚œ[º€ ƒ.8 Àµï5íÚ¾jÛV3ƒZwï(å¢õ \R éãÿlK5HeŽP¿{û{82¡½ÁXÞ爆ÛE®9àwÀú¹&NhúªiT¿“Žˆ"â;%á„P$ðšÈµÏÞmy³»¡´b”0…”tK±±}%ñÖiçºHÚ\Ç–³"ÞTý¹¬ü¯=s™û¢V_\ÊSÍ•qvm̾.áØ"9wFZÊ$Çj@&gÅ{å­C¥¿Ý[ܳ{G¾žo¬»ª¸æ*ÞUa×%Ù5Ivu¬quÖUš`­A¶ì—ß-*1iP[$BcÂ1±T1ÔåW Y/ăCæÔ€1:‚'‡ ˜S}Æäžô@)´ð–ùñšS滽ô¡Z5[£IŒ gÐpvüÛ…J­‰BqLOâ$cQ+Ž?O:«]¸ Þ¹Ú¬GžÇ)Óm÷ yŽ{LI/êA“ˆÃ¸ØoÊ UxP›Ä‡Ä=x¸ö#HÀzbgV†G âý[/[HÅM˜^c¦‰¼òbøŸ£td¢/¿'//@[:?žÿ´h$ý®â£ 6ŠÒÐJʈoŸP¤ÆUò˜báÚsòM²·UUh\–OkŒZékþÃ~½Ç6uÝqGª¦IˆŸ÷ú¾}íØ &á•„¼Ú€µ]·2 ¢J;~%qâ) VHHB-[E»¶j'H÷ÇZ¡NÓºJ+SUªÁö}_?âGœøî¤ÑþÌ™¨P¤]]]Éò=çžû»çû9¥ÐçƒFå®*|afÌšA¦®-S‚pfá:Êåóô¨!5¬J®ÈÝÍÏ®ÂÉŒ«¯/¥t GP´5üéÃ=aÁÍ…Árê‹Èö¾¾Ÿ˜IˆBD›ˆÒ`% ÄŒ¡&ƒöµ_”}óà„ yY¡™ã’ä–$ïœ@þK‘y5"ño1ì‘Ù˜ÚÁµ{{)Xߌ éô-'ÈÐÔdòÙ¥úâ>²Ùl&“sÚ§ý„"H FL¨…†ÐàȾ‰4Eŧí| 0#&·qL;nÇÛAÎîÙa†à𦫫‹ž°Ý‚x4ô¸óW/W °ÊBÂ?n4=š8ÍɇdÙzÔ‰|g<Ú$òo0áƒñ¨/òÆ£'&B9î[èxbb+Èq@‘ãá%8â‹ÉÝÌDW‘…D ¸™¢/_Þ*rmñX×?ï¿QWSj1”ØLË?»×a²Ô. ~Qðþ‘x @²Ïtñö†·?zìª*G)TcÄ)Pá§Ïlãŀ鎱Ëíím58b4Ƴg^ãd#‰íNÏ0~!ÜÁGÀ¾ KýaÆÉò®ï[#¼ä_±,{ÀãƒÏöÍr>sÿá¿\»CQT¯Ï#1#M”˜ Úú"üƒŸZú¶å¼u{)ØÆ2íµ’§.ÙT ¢|$‹T#Q—%¨e[*cþí’gë¿×ÜÚ¿ñ÷{*~ÓX⨤v®&Jj@j…ÉÕ:5ãŸ9ve½QWeÚ¾8„u®U ÏüAi›Õˆ³\pTÊNPH›âžZ¹m#ßQιëÞº˜¿Vn­}дéô®b­¢T0a0Z „Û4Zä•Ê‚G”2}®d²??Õ«M½¦zLéAkò"™ê•óð|™Rg¡Ôy^èXh¿ ¤c1@ñÖH¸ Jй!Àø?x ^Dèi\kjvl vž;æ?¶xm#…•Þ×ßÔ!qþÉYiçdSÁ2^pO0?ß·FÀà?t œŸÃû¢‰À½O|^]e¦LHKÑ6àm8qjó† gUÊQ6å­:ªApL¶UË®uRóúI׿9Š$­FR®šûöG+¨ VÔ VE\Gáz³ÂQ„@ #YŒaÅeÓãf=e¿¡}p_CÚQ™j^—hªYÉøªÍõÏüAi‹{ªîà-d[ê§›·¦ì[@‰-å1G½àiíuiGy²¹4í¬ùÛ¡í{+Ð2Ô¶±*´ÀXf‰â"XîeB¾@'û5Ê NéWeû´ÉËdì¢ØžîCæÓHô‚Øù¥™w‹Å>LЂEáÔ$õîVCP:ÈŒªï¶«¿¾`Ú_®#`-Y+¬M!P#î~·1~…Œ j”¡Bö,-€›\Ñ(½h朼¨Ëô›&{5©íÔ@2Ù'/“=p¦žî!Ó—ÈÌ (åýÃêõ¦Uz”6£ebj0­øû%€$w¯¿0=Nf‚ª§¦‘‘HcÄ?®” ÌáùE„ùÕ†ç^¬ÒY ›ÁTˆa6k{冗fÆVŠ£jed¹2²D¹]0ušº“—[2}G¿à®ƒy™›ù™ zz Ρ3A8ó‘&wCŸº³L ª…ñÆ2\gF€FhðÅÚ_ œPŠ´H±cŒØqíæÎ#+JiËÞ=ÖSoU?|Ôñ(tTg"²Q1bH什1¸HlAp¬ l3ç_ú<<Ó v^ákâ‰[ŠÜÍu¤V¢“Àð-õ›ç"Uù?CrÌâí;‡ÌMÝ{¿ý˜OÅqƒamiá×ߺ9îX$dgž´É‚_=O+Å@h€ÄùŽp¨YÜ{r|ÔY³²V¡3W›`³7“:]u±g8Ò5Ëî8ˆuñ¼‹_™“ é4™-P<ë ÂqÁ:˜½Œøkç& ¥µày7®’dûƒoš~´4S6ƒ¾ˆÆ54 ™ÿC}7qßqÏô¡´uêÛ’¬½wuø>d,H'æH(M3)$¥Ðlë¾|` 0Mb|—…†™ôȦËíCgúÐv:Ó¦-iB ’W{¯,Y–l©M2Ó)t`¨w~/Ò¬ôßýíÿßÏj€•E/íTÿá.AòI+ Ýô‚ @šùTÆt \/¸lQ²ˆâÀMçµ+û¶û_÷ºÏŽíѡم„†DçÎí 0],wìâ…Wµ gþõoØ eÚeá$èè¡(z@K•Ä^ðZ=i£JB èæ¥>š=1<²½ºBAèp)Vé t®z¹úÓá-ËŽ:ÞS#Yjãæe»Yö9O5g«‰Y¿Lá5ª‘”­8`m>P®Öâ*ƒB©Ö( @I%©S“„¢*h «(H –ÍFÕ3_¤BöÚ„·>j¯—m  âkæ~ÿß*ì2,Ú[CÄÚ±4Ç›^h¯|°2aoµl«ô˜Wm¬£îÜž»Ê\¥TA(FjA„Qê¬V#1ã5Ü4$§ˆ•á¬Å¡\a—ÆÉ¥ ìaˆLâ± (ü.$R¼2¥FÖ‡‡Ô§w•éTå$Ž îF¥amp”zû]%Š«ÁÌÀ«Ô_,ÊZœÀ¤A(6 Ý9Sê2}íJwÅÒ;–•šÒÊ“Êø !WÏ’$áÁ¼ØÓÄÆñ¥I$6¬Ž¾KE†K"?\ŸÃÏRP "ÁzIüî<)ϨR~]j.eVù¸4²z^œÉ\½ùû Ýeëó!¤X é)H¯ÃeH)V ¯‹\ú07uûî:þ5"Ý̯d%?Ò¥®i¢Óë#³Y+3:.Uê¦*9›—˜Îãþ¼Ä¬29§NÝRÇ/gGg ÿHiLÀ¸ðÂüW¤é#’èZØ7ÀÒ\pqÜ)°™]Šœ =ï‘Úîä˜à °“M#d! æDÑÒd!ðÐ]-/tÐØUæûÁÉ ´ïÎ?zëªr(ŒÀ €dblü‹H]‰'žvȯ™#­‘Õ$hÚjbEÄÊÒrt$\ñÎh-+û¶=Ì÷‡ù>:h•„Ǧna€cœ<ïOŸ¡{ÀÐm¬à¸{϶ï5Ç„(Ä4(¤úî>/¹t,tHR'K»ÂÂñíf¹.€PÈÆqVApè Ü‘4w]M<˜f»Æ'_À g5êjJ]ºø}šm¾»Ÿù|Ý­8¡&P¥Ë Õ}ý[ï|r”ûC¬›g޲´Oìë·½Hj²äÁ:_°<‚F†ŠH"gò£ªÄBä1XœPEFàå(1'ÇK#ã4–ÿsЍPŒRÁ¤…µfbÝŸD¥ü_I]ýˆòÇ¥ÙŸ“šÎ[º–‘ú0[žËþËûdƒ>GH)@I²L[xãäWcþÜÔœE¿:u5õZÞè÷2Ò£™¿ªŠÏd¦fÔñieò*ö¨ã‚_­Ì*âe¬ú3R7²–g3csÙòLFjYœýzÊ¿.q«Ê×+€e) Õ–äÞý´?½ËãÝ"ÛÏÑÝ4³› tBý<ýòÒAȽɆºxñu–µŸ€óÓÙÁw.Ðm`ŒyèÒ‡ïBÇYæC[8ÁÇr'F‡·§÷‰(®Ö,).F@ª‚lM&“O;çׯ±²"I%ñX¤ÛçÖ„Á1ÛÒ”5ïtXîqÏJ}ó¬5Ä»ö' @ç{ƒ žë–¹^‘=ò¸Ò ˜ãg—ö˜j0°ËÔQ…j(¯´Rç÷wèã¼äàøÃ ö°x$ðÀÊ‹µë£ÍvþóÓcUå9ª++É9¡‰¡mK¡ÈÂQ9Ô%òžÏç÷_÷¼>û4xBŽG¾/: Ž=LÁ¿ 1mßβ} o„¬ÂRß=Æú­UZHQ£×¦÷ \Ÿ¶Ö€¥Ã¨AaÍÆp…W©s_0UÎ\nc‚>‰ïâY'xƒ€âž´:dÆË îûœ…-c ó½AÚAK€aÎûóýï¼ým‚ȇT˜–‹:œO‘FEƛͺ;Í1Ï&°þŠÈ.PµO=¶þ£þ+~"NSÔUÍvmŽv¢#×Ñîz.ÞfXr´¤3ÎÝ,Z·Dí[–]û†°»Nt›£NÓ'®m'¶–›)Ås}{sÙàóÿ+%E0#**Á5ê{«ÅNcÔ±IrÕ‡º ²«‰·nþ¼÷ùˆ£i±Ý±ÕINç6.·×¥~ùZË…–¦ÖâS;Ì÷íåQWMØR³™N5—ý¸eÃñÖê_ì6Åiç¿Ù¯ÓØ(®àm•H¼÷îÌÎ쎽¾°YÛ»¾Å¥@8 ¸iP5%ñµ³3{øâ!´”`Û8Á´!©"µUÔ#ÁÌ‘*iÚH=ÔTm…Z%H®cçÜÛ»;}&"UKŽè‡<===iwßÌì›÷þ¿Wþj‹óruÃÙES‡Jhwc*àšé+ˆÍñçjb¤“é®g»*Ó‡@:yÜ•$÷0„kÞç wWJív…tÉõlÀ ÔО*ÎWöWK¸]Ʋ·ˆ‘%«Ã¾z ¯Žû¤®ZÞ] 4F»ìw}Ì]'xoÝ| – ÔŠ¸3ƒ× D¸PÂ]·@lž&+é>g´}£ÒÞøÐ'ú¿jÄݘl¯Hùjß=ìØ_a„aÀ#fȳ@6E]vÍuoxÁ´¦áÔEmjT'\4НØÄakòœNÔ(£Z~TÿYJQ.¬ ž/:Td3f©õy¹hñ6;z°jå;Ý«?8…V£ÖŽmÙì8`†YüÑ*Ïf3jRå ˜ÊZ¼3ÝýÚÒM鋪ð¨:>dH›¤—Ôá!cì‹84EFàø”†#†È°N2D.å1ç¬ïþ*8F@FÌX¬‚òK7ä¼?nVnä(“k“w4ñ (3‰d&Ö,ÖIda –o}m©*ˆÝX‘¼¥Z¸©OL>’¹›ýëPš¥±X`kasqöŸ_†’og)· ± H™\¡üB¹nA-z#Øؽ1uêÆªPÊ/5Ë¥#áÎc‰[&åWZeâ+Ák%[V²Á`V[­úÖÅžeCmL0¢ÛEª[š[zÑ$ò Ÿ-Ràè× *Ro®'Μ{ø4ë¦Dÿ½Nt’Žl5™m&Äl„ÜŸ’H)ñLDÉ<ˆÚh>IÞ/‰ò?JP$GïÝûŠ¢F½C1`Ý+—[Eú¼0‹‹óÏ ¡®àoˆ!8Ž÷²,0É2Òñ-[êñ½3ÓQ~þ$Þ‚é‹ò¸e·ƒ öP”{žê§ù3]]5f-‚!ˆI¼vu?-ú悎ÃËæ4:ÿEk„ž÷Sà!“T—©~vÚŸŸaŸ»û»Ã-»,ˆÖdÕçæZ1Ƞݨ×~;}÷™½ã;bdCÒ]!vTp §<5’»â¡ÇÐçѨɶ*o û¾ÅôobðªP 2;À#ˆ¤3 r™Ø$ãaO•ì)“Õ"Q›è,M‘5@œ{ïÝ*¶sÄ&ª³¦6£°Þj.6[õo~§4BÖG‰zwþåPy³¸½y¶ØôŒS'šÁ OE6Q>×íevlm)¬+€×¶ä©fÜô¢ jg5…èêC¦_µÏak-+@´:+l3¡F­¶Pƒî.(»¼£,ãq2=5r 2Òa—ˆ©ÏÅw¥Ü• ž­Œ»X&íI5ßáû] ^“\t;$ƒÇ«d½HTÉ„3êóU-{’\ì¡…‰: ¯ÝUQ¢2(Ÿ!{¸îµÇÑ-–·—ï*Ÿ|ª:Ô]&¢þoÎwÚ=›CøÖÓ,ÿwóÎêeߦP[­äiölÛQTgÂÕùF Ñë`ø…–Rþœ1Ê#ÅÒùõ©¡uñA}lÔ¹„q/ic/«>K#Ñìä뺿l]Ód6˜³ Î7c%ãßCùK%™ú\^f0GÒŸÙ¥E,–3lj…4'ŸF/îƒÞĵ‘±ÂÄÔÄ6:úd!¦ƒÔl0åÁæ½Û7üæÎRGÁ[AS>^èX¶´¥»ÎŸÝSd.@ †7~Ö6Ëúy¡“gÈYöàñcö'wVåa„£LÈÏ1Ý¡àÒµÃÚ/‹‹&ð}ÛGÑÝ ÛËqmÜì÷yºW’ÚBr»ËY…B6³Åö§÷qŽ=*Fº(®ãß³/îk-Í5˜$ûÊŸže{B€¸hq±|ÁY\•t?à(XÔ2}"Bõ$…“Ó÷½—FvbVXeÑå`H¡ÎÇŒª-¢øã‚»9ÞU“öØÈ Ù_Ëû\ ˆ“žª‡CŸ'o9ç­b¼Ûîw5*„3Üi û«ç»@GˆZ ÁS)y+¿ï®‹øëD¼"N”¥{¬³8î®Xð7ÅȦ'Ê ó¬ˆÅ”o€Uç›1™tŸËÞš;6Wcf“ƒá+O”G=Õ,Q%\¡žæ±½.¦Ë²@ÿa¿\cÚ:Ï8mR»”¬ àÛ¹ß||ÀƒccLmBצKRu%MÛ\HCÀÆÇ6`’¦Iªli£B€¬­¦5ª¶*š&–A¹­™:Mš¦hŸÚªë–æÂÍ>ö9Ç׃pöÒ~˜”©R‘˜²{õÊ:::—×çÑûÿý„ µì·Eh[·ÐVí¬+ @÷eÁp} c´b3E¨FòM,I¡zX”ò?Øìˆ„*Å.[ÚkÏz=qΖ7j¸Õ\ÿn£e‡vÁŒµÛYf<]‡þµÉ&jS«¬ø•+ Ä#P“ô9€€ªI´»ÀL\i_e²­*¬ÿW½Ýn Q3 c%¤Š@!VÞÈ@= †‰f§ÂmŒƒ[¸ŠAï{ô•}hÊœ¸b2´qÎï™y½h¶cýŸ[7ì³8B24L"”©P¢ ÖFü±ÃÌ÷#³'U¹AFêÕ(ƒêù£Üg’{ðÙ>ha‘{tà!Ù^øIîší‡’g…$3hˆÿ\}¾*c‹Ôx«.2“æuÅÐí rý1ùw«Ò—×Ì}¬^¸Š)— €Ì]D—Jÿ…ËÐì%dþŠV¹¤™»°R¹ñ¸0Š÷ÑÓCªÙáÅ FÞ,t#šb\[ iî²Ý½T07VøáqÊØ0¬Âb\3>ªUF –ËF”KkfG!ù"®<1ÿ þÓfÑ€¡Pz­ »sϲ+c2ê]ŒÍ%æ?u$·% Ä,h!}fŽïó^Ýr"pyøw5BÀ´Q[lQ›´zœ¢ iš„Uª×^~åÈ‚8ûoê~}üyx<Œáa$ z†E!Ô„QZœ‰g³éÞÿðå»±#|Xä»åhP˜èÊÆ¤âG¢€3‹þõ ‰eb&Ñ-ñ‘ î7ù87Ís7o¶n}–¢ÙèQ“6ìÜΊÒ!QôñQ`A¾åz¯ïì}ûyŠè75Ù§„cÓ1 XÜ—wO®µÂŤmÃÀÇÞŠò]ñH—Ll©4çýà72ž¸×).Z?Û½·'šøèÑx¤›Ÿä"]}ôE­Dpm`¿CŒ˜~1™ bøÎÝÎMO±ädªÓýòüV1}l: gotÚ›–¼Ë–:Á~œ¼ß%Æ9!ŽNvÞºµÿ'/“Äj–*atÃPZBõ‚þÓŽŠ´Ï T ÁŠdÐ.‡ìéŽ*ЇF¾[«äVû#ÇÐw±‘¤×9Ôè<^§o´àVõW^O&ä’ý?[dÀëÖJpÖïŽD¨:éuÉ­5¢Ïow œG®¸u‚·:ÑR•nsz«Í4‚0IÐçÖg‚’m•é@u¿îÄ& F `ž¬V_k ÅŽšqÎ1ã]›ð—ï+µXÅq3N~²§2wÀ#sõÊ~·äßÚ.FgatV±°Ò`6˜&qŒ¦é| ±zƒí´þöëðñ%? 7X-ßñÜ{ÏŸ.Z£Ã-fÄYó½ACtuž¶qÃd !ôÌx $´×Š^g†s¥ýN Z’ß•âÜ8Ï•güe™`í§ê6—´¶€fÌ`=j‚^EÙPc©ÉGuÅEm³£ÙéÈúª³m±µ<Ñézä•}hæÿ`U¬½\ô•Ëíî¯[h«Š´W nq»ƒÖQz ÇšÄHô‡½Ûèä +ô2éA4; ;ËdOc¹Ó¦o³‘Ì)Kæ$6Ëž‚å=ÎüY¯u¤ƒ¸yT/÷ÐÑA$yNõ«½…8V ,|·J¶Â‚z7•Ô”Ò(n&4«ÃνJdNëå:9 “άÎô«3}¨ÔÇŠý%™l¦—ûàìm¶_+Àé~8Ñ ý¥ŸþÅž|’ÄiÊ€rhV¿´ž½ÿkhá¥ÜÈO=6?†äF`åºNÍ[² ,Œ’¹Q•ruµ2üă‹+ÐfÆpåªzöšjøí¼’+ W (%5Ï»ò¢CÐÂ%øãžï[p‹ Ïßó’V¹ /—Ì]|RÃæ®â©+«”±'ç‡WŒ7»$f%P3ë÷ì*Ÿœòƒvr*K–}|8í¤(‚{D#ûEž£aïúâV¨i› #À0p‚Ä`„µ!ø5›Û ‘4L¥Iâ÷##ÊHÇÂ×ãQðþzÌɹYE©­¯§T¨•`Õ†¶’¡6Ñ4¢Ök´˜g£á7c¯Æ¤ 8½7%,rszÂ+ÆB¢°X¦H´#.t/ø¦;¢“­’”bo|#¥ÜSÓ¡®Ãuº²ª¾sû/í‰Æv‰ñƒRìgËõÞÈTð‹Ïɤ†¡ t÷ÛÈÈ×B Ï‘:ˇÞ9Q›H‹ð»ã±Ö8ï]2ÍE 0\Œ$¤.^ðOíM$}ùw®v=ùÔzý;Ç~|çŸ{Ó‰î¯îµx…&Tõég­ ©còž? Œï»wçÈæ§Y 31$f@¡¡ß6§2‡bSGDþ0põÿ¶D£ÞD4a>É]Ú^RlÄÀþ£( WiHÊ#ï{Šbû*“ŽØAgÄWívñ!‡à«\äMëSÁš´¿â‘cè;Ú…@A XI†}ÞäɵÚr-ޤ¯"ÉÕ‚ ²íŽ´QEÄ ØH®Í ”¥‚Δ¯:ÕR#ûë²\,—ÂöS Ê`+Ñ4¾¥”LRÞ Éç”|®É–"‡~u1ÉR¨)¤Î7Zg¸ÊT¨xªÃ]ù/öë<6ŠëŽx© ÀÇ^sÏìÌìa¯OÖÇ®íõ‰/( ‚Ò(„$mÃzwöðúÀØ„B ÁÆЄ&-U$h«)>j” ”HUª¶©H)hÒ{wgwfïµ×öô¹H‘Ú ©–Ñ?úô4Œ4ûÞìïé÷ý ë”ÈÃ*åo·Tˆ&Ájþh¯gT,NHvªÞ]Œ~ÜR!8k?i-lÎf±Y8胙–\ ‰½Dj¯;¿½¨ˆzl…0:O±舥(5x†Àt0vqG1ß¾yÞaŒØÍAg] µ4é.¹Òˆµ\lô*;*y—1îÎ= CõÙZT¦Ã!-¦bé…–…!S„hh­’Ý)7åd~ܲ5ao˜i³ÄvYÿsú!wq¢­ á. Û*C­ÕQΔlË㹺ë{óv„Þ ÃõF)…ÉÞaÌøÃz¡PGG©SéÒˆ.Ö?H#©aPà!:€¥Nc©Á4i S:Ï–EN®“Þf®ö’ ‚Œ¡0ŒV3¶&2pFèCÄa­QޱpOSº8„IЈ<1¼16‘$çXa÷¿'Èùa ,éSÌÁHbCÐü€.Ò'õAç­ŽB:–d3år¬øi“üówuóã_“ÆT ãé‰IEì]ÕâèÚ•¦¿4 B_ÿ¥*õë4éƒ4iIþ ž¿¼&ui½xõ±½µ8KÁ„^l(@ÕÂ$I@Í&&ú“Lé=YQC£ò žøêji$1–)MÀK—2æ&×IÐÂ/Ö¦®Ê'Œ$"Ó¨ 4 LÿìÇ{‚ÞŽ¨Ð3}﹕ö½©Ùç„P'ïíõ{»@äyGX8ö×OûnÉf X‹dé%K*Ô„ª¾¬øíoµ¼ÿ„ýXñE † IÜb±,,-¥R©………û™»¸¸øÅõÿã_Æ‚t¼¿ʼn<œÁry>ÒÔ¾“h (4C±z4KOe±T.«Ÿy¦à“û§îÙÄp»vDÛ¬0àòA±V+õxþŰÐéŸõ„EýÙiG<Öã÷[ÿvïèØxË…w¾áóN:Àñðó«µnHGáC¡ÿF#`îÔkõဠ™ž4Þí(z,·­¥w¬Á]s˜—QÑVÆ;ËD{ÅìQr-?µ•Fì¥awYÐS6ÛVúÓot¤^K਑×4ç1‡Ms\E_M`°šÉ!z«]ä̉Vã•çkYšd†&WUnÒQ ~VpäŠmµï=k„õ*”TÀ¼Ó@üÞ^Ø·¬¸Øn q5‡¶™HÓ£L)ß\`p’:êC6Ó­ÓfZ‘(Î’8{îë–€»vÆeþAsŽ WR†,V…׸ÚT{±h-Ýõ€U §IàÊb\¥Ø^Ö㪞â˜+ïvkÝV2Sã˜&/ÖÕé5oíæ/ùfmáàaß½Ã<ÿòŠÓÜÔïïæùƒ¢xÔëíš™é¸~íÐáέåf’¡6°8£#òfIUcƒ6?›fÈìB~ëNOw½žh¸cú®Ûäþø'WAÖWÞùáã¢èðùž ‡[BÂÁ` ãËÖÈÌÌ+~ðÂÖFG@44š‹­-Ê@™´7=¡®rÐÌ}ÖjÑ^åÊ\UÂjN‚˜¶W%m•1›%l7‡æçáÇЃøq~q¿³vS6Sp¹+/w_eÎv‚R­Ý•3ÝÖsZ"­%W…Ï^rVĹòy[]l¿%ÎUüƒürmêºãø¤©­ÐXIœÄö}___¿Çy8vâ¼_ h) °1¶yøq¯í8a%´Ðiçl-ƒmR·"ÖQB^ MªÚý1MíºµB+-”Ǿ¾¶¯Û±Ä;€úÒ˜¨¨´£ŸŽŽ®tÏùý~çñýülÈ@ÜZ²5&:þ²³€†• D,“EÍv4¥z*{eØÖanu×êɧQ“P„¥ÇÛ ™îêWÖši ’¡JJšwy‹)ÑUë2¥YSÜZ{uK±Çå­”Iú*d`•(»Úë0úXݲµäŸ?¯/Á¤$ZIµMÏÚËÒ¶ª°½æÌzA2Už‡÷7@^çÚ„sõ¼³"hæP•šÆs8­IÞÞnŒõè#ÖÒ0Û¢HXA{ ˆ”ë1Ĭ«!wE˜Ñ½¿»N.ÎÅH…•£’ßµWòLUš1‚ͽn5ì7h UÏ—Qì2GØòkŒuWÅcßèû,agxXqU‡†ˆÓ8墨kâV]‚©þÚ^“p–~±ÛÔ®VÐ áX‹)a’–òþzü‹ÃÐü›ùü Ý©ìÑH|X—C£Ã9±A">¬Lœ „184Š{¥Ì ÊZóA¹#P/£‰îŠâД€Bž‚åbqtEü¸<5F„N¯+zëá¾ño»Ÿ å§Þ@2'²ÓCp£‹Áá×$HR£$èChìu(5‚/xàø =?‚.fdž±ƒë5*VOb„Z%UuoX鿪ŒOH–.æe®æÆ.ˆšFf$ÉK?HMå¦gøTÖ€“+âÔºø®(ý^Ö¡m0…JóIââQyârNü½§~ãÆh]ŒÒÊ<¡€%ÊÂ"|ùOŒF–§%ñÉ™«Ù‹¤KwkyF“žþþ)ý³Æ,¶ Çó†3{ká¾9Ÿë¡ßíÀÁÛ·˜è|?:tþÛÛžËWQ°ÓRDK’$„i‰Bgý¦+[w]ÛÒùQ³ã“5]××0«ßw²öù"Ãpëõ%¥~¿?sH–¿i[ù¿‹í—džP„Ép †À:IãÙŸÑïìþÚ»'˜·?2Õ»}˜õðÂ]Ìðâ}/ònމ†\AÎæï,;½~‡ïTër>wHpÝöuú‚/MLZ÷u˜ÛÛ{:ªOŸ]çåúù0#^æý]Aÿ€á"/<ôü=ÝM[·\Á°ËÍ”¼èªòq½\èå·ÏµwY €~d„† 0ÂEâH¾Œ¼ºžó³ ä Ü«Ïßï ¸nÜ´òsÇ9o/È<ÈOÀ¿Ÿãß6œ9½µDýCŒ"1 CI…«C%§;š޲HÙo7Äz VŸ`–TD¦¸£"Èš8¶‚sU†{*ŠŽ=n ú/i$Ƙµ+¡\Œ ¥4EÁŠB¦ÌÍÍU•ŽÕH?g›çÙÚ¸¥<ÎVs¶ª¨˜‰w¬>ÈD¹3`1  Áæ¯ÜuB+‡sä2RŒÉþ±M/XŠ£lU-Ktë£ÖšSÍ…r $†P5Œ=kT/tèÛšŒú¨¼ŠÕ°`­÷;k…ž2ÞQíªü¨­’@Џ€$VÛÜH[ŠRÎçS´¯S#O@¸T%ÏU‰Q¾×8o)²kºJ²D²|"•¤Ä¨v­zWIö‘Vê͆uMààA$ÉtkÕ<[¼à4¬U »yÁVr4D˜JŸ³4i3§:·9hÓMý¸¥”riN« ɹmƘ½ðø+ì\ý/WËô&*bkY`Öp=5á΢ kþÊe~ì}ŸI²ÕKõɽõ kc„­}Œ-,•QgU¸»|ÞÑ8s–1m-¤H‚ ÅŒP2…Å[ØŸ{•é1 ăhdÁ“••K"1”³0,NŒâ±Q<>D.z ¿þ‚¨ÊÏËCåmzÑÍãYÑUf,›ÅuÌS¸8"JzÄáAhyLT×ObRZ$Úk‚ßï¡æGáùAIÄ£^8 IŽ ÄRò¤‡L=‰g<èÂ9)‰Ÿñ£jG3c4‚R2%)Çrz·ÂÑ 23½"ó®(5“ý°ê¿0If.˧W,Î<‘ž‚“Ò¥™•ËSÙé yz<çÃ7²4!Ší¥Ôì…ï-N*3ãð H…ÔJ•F"A)±§ãÉÔ処 ÒÑxvüÊÊè ²<)Î\—Ó«2“yó3«. µ0Œâ8Eèhôé©éŸxCÿÃ;¹Ô}×®Y¶žC#ZQâ8 ƒÇ¥w˜Î­ßþÁÆŸ~¼™ù¸År½ÅþÙZËß7Ú?}†ùðGì:L#SÓRÀø‘#G’Édæ.€þÜÿ6vziiñ$»—‡›_ÞGÄ -Dâ´T}h­f|‡æ÷›Moµ­>Û^ôV{á;; Nm"vJ”9”XªƒÔ$aéúÖ‚óçwýÁ(3îäý®Hh¿Î 0‘pO€sx7PÉ Ï ,0çqû9ßï¡Ï;Ûým«çwÍNŸÙ¬¥0RŠXìE/n-ÀµrHúêÑ _Àößžc>¿i{ó××5j)£PTAª1Zª%¯iùð>–Û¼‚ãQùÃùíŽ ‡Ü!ì‹›ó;;Ï[ü¡^o_„ï‹p~€šBï§ÿî³Ú+i!qŒË@ÓPN§YþIGe¦S÷Øeå>‹X.›Aĺ:ŒY°W.vÔDíeS–´Ö%-Õ‚­Hp—FJ[ !âÿ!¿Þc›ºî8€÷©0HHbûú¾_~›˜8qDZBá™d”Ga­t ò°¯q@£S‰ŠG‚“-­ÖM Jy5,…–iTÚ•¶«J5ÔMKˆ×öõ+ŽíØÞ‰¨ö×ø£ÓvôÓÕÕ½œsϽ÷|?‡3íFF©~ó M‚%G ¶?J bI …‘rBªB©—åÈCûº\ß²€»þoKÊÓ”²y`­'Œg–kQ³$˜=%$—cò+›*3+pZÒÑ8å\–í×%v[4¨Š–‹iV…aïn_¡¢Q%½gÎ"˸šyNq5'ÜKÂ.ëÄV#‹£8à ßYÉäµ~‘>KhOUÎÖ|u£IMŠŠX‰hZ R¿½1Þo™ÙµÜªf4QJ«HŒ,Ǥ(%%YJ&&¸¢Œ¦À¯¯‡q\>Ò\ÏwZR@#®ÚXwmºpËø‘·¯Ûœ€7¢®Ú¿Úš«I °ƒ+1†Y¡—~ø²9ãZžäjGUÄU·­ŒÛ “³à°ä¸zÞ½&Ý]çç*À­T_cnWEÔS›îYs,öU ®¦gìæ8hI:¢Ü|=³O˜y~–ˆ½.™bžF¿­îËm íR¹ ‡”(Žj©¬Ò@g~¼K¢£âÂ>w‚ŽÀÉבÌ(”=Zœ£Ÿ¤”¹“hzLòjQŽ6<7ù*›‘±Ì¼ 'ŽKf†d…c¤pZ<;*‰”Žâƒ/ 5$Š!4J³•ôÓ$?‚çŽéÃT~H’?g¼lÜ‹¦F$i/:ßÅ0N2^87"Í{¡ÔópxɱÖçT°ŠÀA´PöÄÎEñ¢Ü-Ij\47^”»µ0uM”¹A&Ds7Šç®‹òEßU¡;%™«%…ëèÕ>Z - YÖZ%:Þ…üx{q%XÏ`•ô"û6/Hÿvaáš(÷.â¿\|÷Ì‚øu¸p]œ¿ü|îý²§E”y¥\¢·¡]Û( ÂÔ, 6µVU(舆÷O?²‡øƒ‘È«¾`/öøý{C|ï|Bú"Á^wGB.ž·#n_h ìüY³^cÂP´–b˜@HÅ:…úôºíŸltµŠ{°ÒþÅî‹uŽÏWÛ¿\ãøs«ãÓµ=ß4so-ßÊBš–Q$Í Dè‘.9[˜+äÒÙo¹–&xv-ÍþËa‘š“s®ÅVŠÐ-Ó/:¿j3\ܲôÜfýåmºs/Týzƒé7/š¾­îP»¦½ª”,¡D”†‘kå4Ã0mÝÙðÁ‡îh¨/wM:£áþd`02y@ö‡"îÉ€C €ŠðýBhè÷û\ Hž9þÃõ“—ªå0MK hX’$!ªueõ×Å}î`Àzægì‘çþg{ì7šªYÑʨ’7În ‡<¼o^àïxZ㉠û€@ü>`7 "€"0I(¸×7½;¶…ç­rp:ràöï»[›ô‰ÁH†T l Ê†[+'«ãîeÁ½ÿu{Þ8Hy‡Ô“¸Ë’p[Á”o ø!b¯‰ÚêÂKhÀq7$íM!GÝÔÀÚ(×Xàü»«C6Ó…µz˜“ŒšÔ© iœ$q‹?½^õ‡ŽÆo-é}ñ.M’3$]¦”³F°UÇúW=i<[ÓêMC ‰ ¬ôè*ã3q¼Ä^UâE%´ÔúÉzÞØúûÿß+µÅ3¬-ðx§AÿëÏj=ÀKñ:ü¬3àwø¼{Xik,Üÿèk×lxÏøÑ—Ë¥…´a|—QtK1qa{U€© ÙËc{SÝÊeçÇ7ÄP$´Ô}ȶÔ50AF¿`.OÚ´q—6æPE™J¯¥å[ŒZb‡š³C%þU§"akL9šNÝÍ.e1š-…Ÿka“ᘂ+Ø¡•‚.']ª £ŽÚAkY |§EŽpX«éië‰1¦’¤ \ƣĔÔ]#]têccÀ¦™sÃݵ~C¨k©DŒ*AÎÁH\Lsü»[Ãæòˆ º"ì¨ ôhNo)“bð`Dp$›—SDWêÀõ¾åˆ ŒÀ`/AœK;•ñ.Í¢«†uVw”p1’O d1gÍW+î÷êîõ–NnkUí[oxE'{ATSϽß. ;õ ·µTÄÖ¡g÷®¢šKb.õ¬Cï·–gz+¾´zœ€‹pD(R\±+è/vW¤ºèk¥IƱ¬ ÷jCnÓœ]7åÖ-¦ »2î©yà1E_«Š9ÔIF9ë6Åš0£bÍÊ€M0ãgÔ!»:æÔ,ãõ³tÖ•À±A›á HÂY5m©|§U.G9£x¸T*Eùئµ¢ûØ/~ˆŽ…áÌ('4J?M#©1A aöðÞ“Ì #Ña(5Šf_ÿözŽQœ'Ç yWH pÞß =fFðw­”ÑèJªð§õÏG†rÙÂà0w~D‚"¿Ì ¿ƒ, –$ób#Âè=7JÅGð…8z €$>J~ñ–¼COã«C4 ­þøÇÜôyAüäŠÌy*u&/qneêŸà&'Ö$Oñ¿uýO=Ÿ¹°2}1Ø&= úµFĈ\B$…¹…ЉŸå¦/dÍœµ0!þÉóÄhP– ñÉÕpä<ñ4gá$”9+xVI[;µ&9 ýºÇ 1¸J%I‘ôÖu‹ß·Ç;»+²û¼žPÈùÕ£—"þ}SAæ1ËÄâoNåœ íýüZ×¶M˜!Hƒ¸„)ðB¡˜è1N5m»Üö£›-ö» ¶;&óFÛõvçå˧M–ÛMöMÌûµÚî«möÛ­®ãu/Ã8?EQ$INNN>‰ïüüÚYøáFýx§âƒöÒñmeãòñöâãmEÇZdGš‹ÆÛJo•ß&9Ü\n®“P"  0š…c| ¢u*éÐÈ–ÿ|Ý÷Økõù¬±¨svÊö½ ¸6ÁÌÌX€9HØYÏÛ·ì<ø?ß×qr«ˆâ %„¯‰x µÔß/›}¾W‚~;;³÷Á=Wõ°>s(àw„/Ø][…‰Há’·¿Ü|¸ÂN»žá’€mÀªü¬›eí,Ë,ÌzS½§ûf“®~R.ÀJ@ÜP¨@ IP>£•^}µ:ᬜ½°©‚=ʘ۸ìüøÆ„€YjŠÓ4d%ê®ö9¥‘~}¨[½`­¸ÕUÉÅš Q¹8è·H.ÉïWø˜¬«üQ¿â£6Õ-sõ•.,ÊAĈ‹jÄ(êPGÌZëH}Èf Y µQ‡>b©xªFlšCõ$&– 8™G“uZÄ7j1]Zðñ„£ Ð(fÑm/°'±ŒBHD€½¤¦S̺ˆ½ ˆP&ÁDº"äò(–ùó÷c¿å¦~‡.žËKœÉOžEҜųYßZ#@c§VÄ/deÎà™Óß›>¶j»!†KÅÞ®Ïú÷áU™KÂÀîgïæwhá2¿%ð<ºˆ–6ŠéG²Ó?Hœ}>szVI^D3g²~Ÿ(|qIòó+p¤ä…V™Ï»é‰çí›vúg]áÀ^¦ë Íxf9Þ³îC##VÓp!Î/Â(ƒP!*i.Ò¿[³ý“=ÿh´<¬u¾Á|«Þz§ž¹Õh»Òhù¬Á|·É~¿Ñy½ ¹Ú`¹Òb¹k2ßmíëRTUbn“¶ŽŽ4q:ý¤Â‹ éeôÀwä5ŸL}ò—¿Ž£xôqeæÐæÂ›Ê޶–½ßRz|³òƒmG¶ËtëPœø/ùuÕu¸}IKSð:ËÝ÷Ù½Ìx6ÏxÆ ¶Û”³U@#L=Û1¶!¥Q*Q…ƒm M›Dj“@CÙqX*H¢Dª4!iš”ÐЀgßWã¹=}ªÂC$*ý:š¹wŽî™sÎ=ÿ÷w[^í6]Y5±‚<¾Ìø§åê£?ª?°\·\K`•PÖŒ‚P v)ŽOn¼›Üùï€;4åʆþ ?ÒhÔ 6I8ä‰5ÚùØyð-Çç7ݶj% —ªÁ{ˆsˆ–#r-‡½ñî’©ðð»ìõß}ëš×f)Ôí¾ùÉ϶(0QµŠÃCñ§ƒS`>îÕx‚A€CŸÿÞ ¨€ƒ¡ÞH´\ vܺӻqFM‘ j@ª $;)ör»æ_ÃK£Ã gÍ´SŸë1f]Aý±óãk4Â7¤}vЊ$xˆ`Ÿ1ç\|}ƒýÀ|öÈ ½¯EM3pΨP¥ÕÔâ*‘2ÄkŒ)¾ ä_aK§Ò±£®–ž#¦aŽPˤܵæ€Ï’j‰õ›Aœ–è@k’o͸ ¼ñaãV9µB^À9‚™ªÄIŸ5êh ñ¶ŒÃåë [›RÛMÑ>S' ‹¢ ¨äè2ëWuÊgJõ7%xCÔÛ÷Դɤ8Yk´$º¸†iÆ+kP–Ãdb’!pR.ý±W!_méz­1_ÓÔ€®Ø§M8;WÖÒDŠdÕ*±zM­ôÈRìò*­ÓTàâM5p g~ÎÛ>ݯ/l­I:,q _}Ò ÔÔ˜ù©.7`Kz›fóò¶ºDŸ)ånÈ÷§Ú°Çvñ'-¶jDUYá•4G–’ÌÚæSÞšî×M»Mø_ÆÈàâfS ¥*’hã~xm•ºèš_èÕÇuA·ùÁ’E¶@›áí ·=Å·D]m_ÅÝ1W=hFežà:0ùgcl›)á3Þö¶nÖ¡0H/'Ã)Ç(Tôûubá —¯šeòà‡i$=NN¤Ò#áy¢°š9DåÇ©Ä~"½G‰&áy8!UàjGyÁCµWÌ.. uÕàϯÅ9) sL•ª‹£øô^\…3¿ªÈ%)cãdl™åÇ8 ’ÇH€s²û¡™qiz/*€?ø9&GÀbBªXèI³ZtçÄôU\¸$.ˆ…‹âüéÌ9H˜üÞ7ÖÈY´x™Lœå'Ÿ&KŠ—¥ï&Û©¹ÏnªÈ^ŠWÐÌÑï¶KhìP1Š(¢\ÌZ¤hùðfù ÛÅwNq³c8=çQi$u.ž+N—e® ï¼P©’ÍÅp™‚d0÷ÚñÞPx8èw¦bƒþ»ÞHx0œè‰}µ3æöðK+,u"Æq‚ƒP‚`5(<·ž£÷Ù—Ýèò|Ôåþ{§çÖ¢á÷Ú‡þ¶Œÿ`1øêþh¡óÆB¸õNÏdzŸv¸ÁÝO»ÿÙÜw«Ã{¢e£– hœdiäÊ·Þ~û¿) Âÿ9FŠÂýÂ4h7¬[4BaLHè &ýÄ͉¥úW—h@‘vbuýÄZýÄ:Ã+k k ‡W®Ò[­;Þ­xy¥éD·úx§òä íî%UÖj9L@ÊR8ÃP8ÅŠ1hÝSæ7ÿê„}A¿+Ý“€¬z¢¡Á°è±óà[ŽhxçW]æšÒ3ç7ýáX·œ„@zR"Z} çö´[Œ¨UiåÐí/Ÿñ‡Ý7Þì^dK*4´ip )á#þh`{,°ûQ's†ƒ;±]€óÞ½­ÑX¯áë×]K›kb’€U#gQ¤U„œîiÜõ§Þ?h§t¦O—õYb|sÊÝùØùñ?ªÚ…-'(iPäæzY ö'„ÐhgÁSSJ’æÉQ’HÁ%æÈŽª’@_‹º;ô÷—?;üѦþ#ûÇÎÎîξ·»ï½ï烂‘媨þÌ´ëÁÏxeb]÷ÝÚž›uÖ;MÎ?7Ø¿\o™0Ù—Rï¸Soÿ¢Þö§Fj¼Ö>n¦o5Úÿn¢þi¢Æk,õn§jm!´TÜÀíèè™ý&kdaaanfé ,Î/üñÚuFxƒH)Ú„ÃMŠ_¶ˆÏ4‹µ¥d¸U9º¹l´M6¶I9¼YòA›h¸­l¤U:²Q1¼Q~fGÑH‡h´¥ì´¹ì×€.ÛHª¦T\ÌÀ&†PÉ#x(_Èçºû«Ç½öàa"yÈì÷úèPÈôÓÑP_ÄÿÓH ÒýÄëš|DGüGÁÞ«×¶— ‚ L´ˆ'à1‹&ñ½7žz‚Ñžëè.%óø³c³èáäþHØóõ†}ÁðëÏ«?~˜‰½þ©Þ€Ÿöû­Ñð^ï×/~D©K‹±<‡Í'I’ȇÛÈüÛîŠ(¥QEYZìÒø]zßP-*2]غl5ì³ÓDý4G–@âЦ<’ÉbRÀ0ŸˆxkXU¼œ7uœ¯Öl× ŠIˆ ãl˜ä#Ÿt*2T¹·_wÔxmÚáa²Ha­â¼eŒÛ¥!Oͤ]—îÕÄm¢¥æ\ú¨]ù¬þÌP÷©¢áqHaS­šø®$îR'\†Ôi ——;ÿi~ö3$rî……Ë+g?D²—_\<—{éû/©I˜È•’\.J îVú»#/$¯ä:„H‘¼B2'C4r–ÿ ãyi${ž9ÿÉ‹©‹@V¹Éß®|Dš〠ðûàÚI/ƒðÐÍo8(%˜álh „£(QÈGpÉêœNŒë´>0÷Þ4Û¾4Y-î4ØnµØÆ7ØÆÍ]kpNÔÑmtŽ×Ó1S·M¶[u¶»­ž “ó®Éî¿m¶LÔQw×Zî5y.Ôí–!$?"`Œƒb¿9~‰!‹Ù…™¹åvÁòmÿ¡Hva±R£HãÀ(ŽrжHt#ÛKÆšd#â±vÑX§ôôfÉÙMec-¥#Í%gšEgÛË~±©tl£èL³d´¥ôl£b´U5²©ltSñh»t´]>ÒZü³:M»‘Š  ˆ‰æÂ„‰EïÿXû¯¯—btÊÝO5öíYvü¿5Ú;ƒ^OÌ×ö¡¨ýú­î!ÎÇsylŒ`³ì=^ïPÐ ¹Â÷Ðɦ·Þj}x-·&–ðcxÈT¬û¹õÇ·'Y²M `‰Dm~ïþNu–"/2\´†Çâ ´˜ð¬‹SÚJ§«Â.mØ©ŠÓz°nÏ:Ê—ÿ•& @‘¸K´*#vûº(­iSËË Õ(Â`|!;÷'íÊ€Û°IRnÓ+ü5$Éू!´U ãc¶nÎ.NîUÜÞi,e¿ 긢|>ÊeÿÈ$~H¯ÿy³ì¨žxH³.eÌ%ó9ÕI§áYýIÓz¯‡áKåÞžªôÖŸøÝê4- SfÙS®²ŒG³HN·)¬„¡Î=¼A›¢T VyÚ^¤uQ‡:ä0NSª¡µRÊá`Ü<‚<¼^8gQÇíʈ˜P—Ù½äCˆ«*ºGñ¨æº”±}š ešêÏ:%³Ti˜®»º­òHmñF)»NÅ{UŽþÔTro§6äÐg»*gv«”>E×,E°³4áRM;ê#Žªh¿<ÞSöÄn¼µÿþœëÀZÌJ…àùN )¥Æ;Ií!Û–·7y€@ÞêÝóçõžÛ½0¨[]Î÷ÖÙßïÝu«Ûù^ûÇ~öín;øñ×~©µŽº¹ºÙ¿ôºßÙèúSŸcª‡ýÝzçGë¸míý&”QÃHÞz«uQ#À‘GM‚G´VX(¤O?ËȈZBWNÁ´3~òVÕ™¥•úõÍ•Gz•tQ®‡q=¦!%xA$*ƼNõê…aá…xÔ/î{Óöxx˜çÙÅtޏƒ!.Ì Á}? 99–¯B¼”ŒC‹´¸ÏÝ›ví÷õڟמzySpî;aadfÖŽøÂ‘‡vRš›áâ‘¡XÄz#!?a<êÍLðÏ?ŽûÑáÈôw¿í²QœÀT(MË0¬ƒOv™c®.0&Ùº8·v¹S Ŷ‚ˆúêBsØÝó®MùÛ¶.ÃVƒXŒxcΆÛãi‘‘ánùd¨.ÉYBÞz~Èœ÷›f؆®>ÛúæS5a—97XÁ;±uQWkÑUóÆ—™B¯ å4A+PèÍg*’»,)o[nwû¥'R’ª)m0 ®Î»¾6ÁS—wT††»º™Ï‹”ˆ ì"­×ÄÐÕxÙ”¯§ÈÕGÝÍAO[ž­[j¿ao]ÈW·7Í væØæ¿m磌„–*êt’U7··f÷˜“lUÂc͸›y®)Vín]W£Äp gÔ$º¿§:ål[îû’6p˜fü¶]VˆÀP7‘R„ã#ñÆæÚŒÓšè<ØcTÃRŒÐ1ˆŽ¦É_lQ&æ¬Êpæ]½u¢ÔàÈr´£R(²àoâí¶×üÚÓ$!D¬TqId{ƒÀÖÎì«O;;JsÜÝuXÓNs˜³Ìµ§\y{cÌoTH:-9À<¶!æ±D}õqWCŽ} —»²œæö×»vV40¦¢i”@•4QI ¿ÙSQT@©Qi6€æZá^:ªŸÊ8!@@ÍEtüœ=Aò}` lUÈ4„F `Ta5ŒQ#‡ËNÛÕÅÃåùQ8tDÿî e Øãm¦Ôz3j†!¿ðòN탔¨y  “dò Q:†ðHߪ'PÌr•ža˜WG¤¹+’Òù•ù‹Pì†$3¹*=ñÅâ¯ÄÙ òÒ$Uº"ÉN®NMH–¬‚ËŸùûÒª[¡’i6ZW¾ó3({™)­É‰r“PfÆé×¹ÇîüX”Ÿ¤sãKVPéº,YTœå/Isã²Â$’›e/IrÀBcòì8’½Læ.®,Ýxlî‚zw—‚$I… Úi3›+e ¹B¡PôX…Ä܊3ûM]¿ísÜé÷u¼µ~÷û}ìC©ßwÚµ¸œQ`4Ó$qæÌ@‘t±¶Åt.Áw>Ÿ_ éÂÿ¿Qṳ̂J9›ÍFA„ÂÔ*¼â¹–‡¥óé-U?ßjùé³Õû7âz˜)aT a¸ø0¢"¥›ž©¾p“§¿ »ƒa{ðþ^!ä‰!ÄÄBÃ|Ø3t=r3,·F>ýË}$¡à‹ŸÜݡ†…¨–wða.$øƒüàC;oÐŒð³^`p£á!’Ù{.žÿF\ðE¦¿:wgýk(¦â"%ˆœìWã§6™øáµünËü`{ˆ]öY5â툱ÍIgC’µÆ=ÍA¶žwÕ§|Mawôß²¤Ù&}¼·ØCpšK;:B®ª9Ÿ)º¯+±­ãæÓM’J¹HÒ 9Ôª ¶×Î lŽz›¢\}ÜÙ:e·™(‡a£Ajœýr ˆ³ˆ§)3ØþO_»I1˜‚B/›Ø¬K Ø€yŠ®æ×ûb_-0Œ˜RÊh ¢Ò´¶×id¢kÛ[ã.kÂÛ.¸m Îê¥ö[d-!Wë7[”}ÕÊ­z¢ä9ŠiI¥ŒÀw˜˜»®¾  Žßq/6ãšouÊgûa—A…cI«Ð²ú ó^ërßÁÕõZSlÓÍç[ÉÕ«5ª5V‰¹ ¢Š‚IF«‚RB„R“â¬ü#O–ë,z­³MVJJªÅÁ“ÂN>µèÉ„Ë6ã³$]Í;j0 M«) Á•¬MáÚçµ³>sÔm³Ý·=fÁÓõ´ÞÎÚ„ß" ÔÇw™#¾fÁÕ–Ç 1g}ÒÛçA=*ÛÓ{ÛbÎî‘—’$ÎÈ%­6àe?yK%©îªSÇÊK‰ðK²ôaìßÁþ«‘ÿ€–8'ðÂ"7* ”¿2¬¶èåFR#L.Í© @cÇ©ÄIþ$ö‡@ÕF“‚*¢F¡+oîÓi¤  ÄqY4€”޾åDNµ~¥j%IÖàk%µ‚¢$SÇ4ÅK ÁW@/LóË WËs—ÊAÊgΗ®@ù«Ð’µpA”¹ŽŸûùõÛÔuÀœi݇5 yؾ¶ïÛ÷áGÞÁI¿pœ'IŒ]ÑT ñãÚŽI€B‡ª4,¡ÔNS¢Œ0VRpž&UhÝ(kÕ Ú­Ú´ˆ?â·smß•M•ú!R2¤íêȺ÷È:çøžãóÿ£¢ÃÏ 3“õQŸLð WÄÙÑB~¢(=!ÉþŽ™½/Œ3¹I T.µ}@‘äHAfT,LÈ2Ò…1qÊW †š¼òTød²8:U¸àC„H¸Ž~~ ¤$qp¥GÁË{‚ŒUheWÝônË ìr´Áýa§ý“¶Þ/×{–K#·»]GŒëq‚1¸»±…Oñ¢A)Âóüã¤Xò?|‡9~ø×H1ªTh(%J Ý™ç–K#•oý@wy‡fx›êÜÖº7w”»¬p Ba¢º"FM–IHµ‚QiÔ²ÝnÃí¿šŽí F39ÿô¾yÿá°ÿ%ÿŒg&ÀÍÆiv^ð-Y Âe†ŸúNò4ÿ."¼/FW-jäº\˜(âÇòRãy‰±Báš…xŸT.µýÜ8(’[䓈g¬ ;%ÊN!Ù«ß&Ÿ•™Q&7V´0Uxÿ·TGû:–ÀS“4 2P€˜j%5çŒÛ?ètÜÝЯÝu·ûs÷i»óÓûriäÎ÷Úl à$D à4DCÈÅóÃBößÍ.>Š<1"ü¯l&–x«Î¢Á4`P²˜j§N;üüri¤æâvõ]•6UlU oÔžÛfܬÜU‡arCX\!ƒ–.'0X³¦èÈë;îÝ÷΄ƒ‡üA¿g>ph.°ÿAÐñÄͰrùKÀM(80ëw¥…ýáà@P˜s/W¿Á€H/8·tyçç½þ™EF¢?ùøC[—±œDXß ÍªEOoÔ°ŸíÒàŽô­ó»êF@hÆm5aWýJïê)›!î0ÎsÆy¯qÎU ,”vè®9akÍô6¥íkýC`Àrè=æDOCÀ¹6اK:¬{ud%ŒH0´‚!Š”E„¢X"gEx ûj<Öˆ§ dÙø– µœ¢H ˆN=Ž<àêCn#è(õbùP‰ŒÂT4LÔh舭äKØ©KÛB¿õO/N·k_^[rÔDœß¤¾±sÝ_œ-óæ·†·W˜CÞ%¿¤³®în-tþ#(T)#ëaè%«ä¾½•ççܺù>3x!`1»¤ð}·å¨•jÑ*ºLª­Ztx‹>ÙkXéy™é5$û›‚=k·eaOã½=ëÝfCä¡ KËr%Aãp%#/_GaZÔ!·5Þcˆ: 1»ÞeYD‹‚„ï××E<aNrš„ݺ—›KÁªÃå4ÈÁÎJ$boˆÚ ao-oÓþÓÛÔLÉ”X™þÞ–ò¼¿ö¬sºÀ€nnÀøÐeäíú¨£¬L€’˜³!â1ÍzjŸ”F[]´Ïœì7áÖŽmµÖ©–b4«„)%zÒèñ’ôY¹ðjiâ„(9ˆ=.ÿ¡42X–:AeNbÂ),~cê›nªŽ’ï†äÂIiê˜ñ‚~¤SÜ-ƒÀÁ•'Ä`!†aBXv!©æÒä¾¹0õȳ×ë%>Ê5g¦Ý‡Ÿ;VU# ¾ÞôyÑžWÀÄA¹]COÍ0àñ+§íZ˜w, Çkq¹x=öÿµ_Ü¿¶‘Š`” Á¨‚‹ê+\ýJí±jÿNšŽu ¢nÜn “-«½«‡,ʨSOSµR±Ö¦Mnbݲ5hÓ&¬õq\ï#k\•×Ùr4‡lFÏ!ýœÝôvWµ\$ R`©³²ÌõqkËp‹üßy%.Ur '·×3ê¨æIQˆŠ¡’R.:½µCÈÞÉàú$Q`CÛª½„ÎOÔ‡(P«®²gU°W›"ôn‡|“\Áµ·vêd9P‘DË!Œ…Uàm˜ïGÂÈëœô(/1‚ÆO! AòÔ!KZHžg‡†áð1QjŠž* ž-Ξƒ˜Ü¿Œªžœ)eFŠ'±Äño~È©çÈy:9_È•)Ú4·ùïî… ˆZÇ{–F’çäᓬäHqrõŸ@ÃgÄY~ðØwƒo‰ßÛ—§bqŠ`!„‚í ðà(tMÞøfêÚfŠ“™fÇfòb7râS9À'ËÕBÔlQ|¶0pc~ÁÎ^Ä®³éINvй,Qœ-LOç378Ì 7u…³ÜþS“ìô,'5S(’¾žŸú(?1S½–ÇL~#{…ŸšaE~Yt}ÚÙÈ’ ØTR,âHHÊGÊÑÒ}š¶éüOö?o¤BþÐŽßÙH|ÞM}ÖCÝÚˆßîÀïöØVJ#w[ñ»­ÖOz¬:±C¨@€ÂÈ{—A2§R©Ïêlöyáwe²±f‘‹ŠåˆX$b‹H½âÒÖÊñÓˆr|[ù…îò ]Uï÷¨/_5¾yíØ&ùO;ËÆ:«ÆvTéBë¤bX Ç$GP‹bŒqwþ@{ó·/=öãs.§gá ÇÝûÜÙ°zY´=ø/|U³ÏG.RÁcÿ§Rìîj¥Æ]p‘`Ä—Íï·ÏÍõœ„èÓ¾¤(ƒEh Iår§`H[2?ÐëÕxö×ú‡AFöWfpu€Ò=1ë}–U×ȼ]>T²V¥(hmÜÛ~º­ÂÞ(œ·­õ5É~5c3…ûA iK¢„*º_á¡:»„Ũ@VÂÃKݶ¦(^"knôÖ·‰ 1‘*D°øå þ“ƒ­CÜ¡#ëJQÅ I ,±©àÐ@‹ßªñ éÝx“µYÉã¬Q¢œj úZ=+h1Òöu4eŒš® 6z‰ºD¿:H™üæ§wUÂ^§½—Ô,w¾ª"計õ{ûh’ÆÇ„.æP'(ƒÏ¬š·ª s³>Ž|6]€ÒЃÆQv²h’fEW†í¦Ð vÕÓÖªNÙþþZ·¹&ìÔ‚q“}Õ™¾ƦöRú‡ö—³3„7¥úêS¤Ék1Èš ¥¦Ú'¤v»ŒÁe%¨áówk%ú6„œMsøú#:1$§’R.R‹ºpSÄbqÝ}s“R*”!pP.•JQvn™€]Žb<ˆ£†sO7T=47¢veT€eë!M1â¹i$bß„ìÛ[! €ÓQ‹Ú5Øp¯O¿MQ*‡D¹" ÂòD|qRòð¨ˆ9{sQ#K& ‰’ÄqÌ7ŠÐg…‰Ó¥ÑØu¶`î\="ç2oÁ®c‚À(çË‹KòPTÎA€ï –º5; 1ÃÂК··pF·AÑQé³4–&NÁ‘7‹"§9QØs Ž ™óRϨ(sœ{¤+_W"â2 87rYc‡«ÂC‘©ÜÌÕ|fML³â7¿˜ùVöJÑrµÀL±’WyÌG’ÐÏ¿“šÊc¦ÙÌ$œád§yÑA‡ìÄd^v¶8qµ™E—Ûf–Ÿœ.NÍ07‹EbSù©YNú:”¾–›þëö»9¯îb—#ü<>.¥üJ¡BÜ­²ÚkëÜëü´ðx°ÎüûMäçä—í`Ãvü³Nâ‹6ëýõøJiä‹âV›ùN7õ†a&à•A(G„êMÆ%ФÓéÅŒÎd–²Ôü?¾&&&¤< C¤`)Ø®ñâù…îʉÿL‘ÿB#k?ØZ}qsíØŽÚË/È/m‘}Oýþ–† [äã;*'6—wk/î®¶´ ¥&äK \T†ñ&“‡º?½G,„»^yîlX=€ß%Š|]#~š¤=Ö…ù~ÚCú¼¶…9‚v;ô¡•×í%iÿÀ‚Û1çÂ=´Ã³ðúøOzuŠ|X -Áx <ìTçZÀ€¬¹Þå4yìÍn\²üƒû:mê>à^i§Ú@nï~~ϱcDZsùˆÏ\cH m9F+*¶Á°ã÷üžPÛ:1Um†X@•Ú­¨k2:u[! a0MÚ¡µ][ ªS)$¾íøˆããí¶ýÓ?"˜öôÓOO?ýô~‡ž~ßϯ¹èÓƒKnÄg‰pöÌP׃>ÕÃCqoÓ"Ó”9àš|¢}›J¦¬.S SÏ´d÷;ãÞŽ+»]¿ÝaÉ>g/z³‹Àë¯|«·žÖ¢j)%žÝÞt÷ŸÞj0×áͰ˜BÀ?FHë3¼úÌSºÛƒm¦ $Å/žnUขÚ$'nr= ÞáÛã>ëì.Û.mÙXê¢{ÝÍïö$ݶÖnÍöF<¦Ä )æoKræ¤-hZHòq¾+î3/úWœ†‘€+ìoOïù& [˜Ã\w–s,²†¸§5㳦6†YŸ%ËC¼!åîIxÞ±èâJ±Æ¤Çxà) èæ t”ê(z­Y)ë×güÚ…S†·„íal…=Ë[½F0ç¨G[Øk»Ã¾×FÒˆB…“$‰"Èj¦Eý¢C9lTSh9Œ¢ RCÁÐ~sÍ"ïŒyÍ1¶iÁÛ~¤ÏP ã‚ËpI£m T©À¤d#¦¢0% )~èÔüa ;°˜æœÏ˜¼;tÚgzX¹5h*ºY¿=Î7Å<Ú¿+èÊíi¼öÛ†…V·’R†Dd½«…ºyˆZ8§GP@‘ÿhdtY …±úÄøêèø—3#áe¹p)HòctÐå%‰p¼æö)êÀ&‘ºª7âteWrk„N†ó£ŠÒ¸(z|¹sa¬á‹4²8‚¥Gàü«xvNÂ…Ñ™1"quá}E¶ÓX¥¬…ĤL£Íõ’ß7f.)JçÞçÎÂÙ_—/=&œ¯X S¥éÊÒVš]%\Ä ç¿Vøe•p®:;]Vœ•ä§!a)ÎTç¦W¥ß}¬0+Yé÷ó3¢ÅsU¹éòâ…ÊÜLUþ¼´t\x ÿ9ømic£ˆÄY-¤"`9&&Å´Wþ¸çÙk}Ëk<—׺?v27œÌ˜¿®õüÍå½êbB®¯eo8F|WÖÞ7Þ\q±_Ï¿ïò­äŒÈ trrR¸ëPŠüß;äÞc5YœÖ‰ä(!UsööŸlÖžyJ=¹é~iÄðÆFýäVÍÄ6åé-Ú7·ë'žn™x²á§ë'žÔ½Ù¯ y»O5±±åäf펣ܘ—Ðt%Š7ä/Œº> ù:œFþ»ü»=:ÿƒ0Øüs‰è¾HО瓱áÐÜàý7eC‘@8²7öG£Ï¿vÊÕ€©¾VFPR¯Æ¨ñõê…½½ Â|[$`YðsŒi‰uDüŽ9ΚòY2¾¶×ð Oõ$ãÌ» ‚ßôžÛìTVW㸸N‹bu›Uè§þwú4:²J¯¬¼ÆOë<»é6ßôû- ƒä°JAUïn®éQUC0I Á•8½^¡zýqcrOŠÕeØå!ЬõcÞ®¡0†)LT‹É§6+3¬%»ÇP`Œ UÿÉt,q½‚G/0ê מô7Gئ ×½èëLzS¼.é·?$ù¶d tˆx¬±ÁådLèWžòÆ¥A}Ám.1kâ~K3¥8mŒ7ç9»0Ðv?ßgI/¯×ÚÛžbñ€1ÊY¬=Á7¥y}Òg‹­xÜ•–,×a ñ!SÔoûQ®+°FùVð«€ÝÈrÆÌ€6Ç5¥ý-aFºÅ˜Ž4ÛZ0Ä–ßìÜЀËi)ŠàÀ¯%ë‚1Z‹1%ŒŠ„þÓ75Ÿ³®tÀ²äm ±f­´¢ŽT#²:‰²Õ‰õêö6Ù4b­’!AS¤è«£Oo{»…=Æ’·l@c’{h)zÌó]t°9ÍYœ x5ÃY}ÝÙ!íŸeȨ•Iä8JËáŠNmkôEIvÏáÀ!@$@ ùW(aT’;!‰ŒÉŽ7ä‘©cÒ¹q,~²|i”ËÂÇŸí­¢å˜ •) âÖ÷ÉȨH8QS:BFŽ¢©qñ 4q¼ö‹4’? -À£G¥é1H8ŽåIs£PþR<ÍeN’ÿ8L¬ÑÕÔB4©#É6í#Ÿœ¡…‹_ÎV•ÎÑé©UK¾^šZ±2—ªS3¢Ül%pBzª¼pÏN?šŸ-Ë_,[:_Y<-ž­]š©-¥KÙ™U+ý~nª¦8+.^¨ÎÍTdΕf@‘_z¤C«pŠ–Jp& L&Ó`bβî†sø²ÓysÝå¾îÚó¡k÷.àö£u^’œ×\ÜU—ï/NïûØ÷6r÷K#î[®ot3W»Ù“–-!0¼&m6@è{)Þ}6îósoE…¥¼PJ…âÛ?;ƒa 2ŒD´xË;Týš‰õmoõ¯T+--›ïñ¼´Nn/§ûU¯oP™å" R¢¥UP\‚â”´É¡›ÞñÙÜËÙàóñ[dp8ÚNÏ™›ááÛQ.•bbÁ]Á;îD|8Ù ú:3þWJp08ÏÅãPˆù"±ÀŽsóéègûÒsæ"_}m;"a¥†ˆZ„è¢kN÷©Ã\gб.x-ù€#Ã4?èÓ;ÎØÒþ®4gO2íi ÞãQ_GÚc vGÁc9÷^}¹ÁëTS'­1Õ0)©©¥HZ°hLgdŸ1ã³ÿq«7 T¡B)ºF&§1ªCÅÔF‹|j«.Éö¼ÕGüê™–Ov¶¥ÿâ¾^c›º8€w_¶ICð뾟¾~Äq^Nl_çéi«xZŸo`,_Æ`mEð[ëLóÕb 5™ÎÚ” ƪ'Ü+®l³n3,ºX©Pƒmª Å4B³J5Áâ Ô¡Ueí–¡~Ú^sšvX*¤j¾’ËYu›Auwo}ÄmÎ9+2]-N¾ŒeC1¼ÄÄÊÿa¯Ú­ã]Õ)GE ·>n·„ ŽÊ”«܉¸jﻃBÍ´Ãø¤ ¼9±ó€ “à%>êªëu?¨l·aÌVó’•£P©DÉJ© ´±¤øfŸ.é¥ãÇá)/’ðªcñHÁÔ1"y û¯ ³IW¤¼Pö¨<}Rû›´†”Âl9Š«ü]ŠˆàQ/1Ù¯ ¿‘÷ÆÓl} ÉH•}¶ ¹ø#ö/½*ñUi̧~”RÀçNôC9í-¸õ§G‡)êJûÜjIl¨8â_25¼T¼ Í^*‡¤ÿ«¾«$‡¤â0”ý”»‹ïÊ3Ãùâå'ÄKÒØUEjX–õÃéw–‰Cò¿œ€¶·I´ˆ£•N‘4àˆE;+®¬êü¢Éþ]éâÿÐÈ­Ž;m€:ŸµØ-L“ L°4sîì  (ìì–ä2Y1³p@2K‘t:=KpnmnaJG)1D¡ßÓdüÝVýù§ªÎ¶—ž}j®52K‘ò3³ ç²Óí$§·{—ëÍJ\!¡(‚å8G• ‰±M{KÞ¾±/<8>îÅ:v_…ûâ£îÑ€û›ñ¾Ñà‰Ñ¾è¨'8æþ&äžü0V#4î¹ïöD#‡‚c38ãÐȡи ¬á™µCj\M!’\ÅHÏl³þûù5aÁ’fT²ó1gÕœ–{fÿª!î²$]|B¨ŠÙ SBeÐeй*3‚éëî’‘¾æ]&D# ©X G!–B 2ȽÜFŠŽæÉ.ã˜ËìæK•r DéÉX²`O£îýÆøÎrÑ^óIWS­R*CImæUW=ؽN¸ê†×kš5Ã;V~-¬…úy¯ï–IWSÈSì© ;Js.~ÊÝüy—õ[Ë+me¯¬S]ÙѼµ„Q(8‚6cØÒSÌÝ• OCÄaøp³Ù Aç`…¾zÎ÷4Fº«Ç<ü”§ôKO ¯’áœåP*ÿÝíâ¾êɃ ã‚%Ýe˜tZ‚¼~ÜQ7᪠æˆÍ˜Üß|ÏV¶£àÒaŠÌ ¤&殀Ç<ês¼Ñ~¢Ë”émû{·õ`£ZC£2×±ª"ü'fRqÃÃM&Å7‰¨Ošî—O¨’^ü!E¾¥ 4õB™þ’ô1:ê[|ï”nsÉ㘢®”Rø²ôQ¥è#†û*[ˤÅ2œ…–‘tÑ2.—Ãz%|¨•ñ)Ó'¹ï‰Gi$ê£bÇØ©þÂØayÐWñ«ÝÊb¸`õjDÆa²“?ƒÄ÷$â¥Åñ«Hú2-^Ο/ˆþM_–%üpêªdz¨0w¡07$ûÑ쵂‰wòDÿÒð üâ³CB8‚kÉB A1ŠTD‡Æð[ë–?­n¯´ßZïš/ÜYåød¹ýã5ŽÛlwV /ZžDDI±‚5ÔÕÏ´¶(¦2™™þž~p±PŽéÄJ¥R3óšo¼&)-Æ0 +Å˹Ùtúé²óíü™ ús›¾7Ì‚äaŒ§ÛËÏ?czksiw=^Ž „‚"HFNà8L@rØoü…õú_=ññƒ÷ƒ˜+4êž{aò«Cyáž{aG`´'xiÞðI0(„½c#žPÀ?¼ïŽ\¿~­NQ%0†4 -3éèëÛ,`ÿ8ã{EÒ]6’#6cbÝ\ÿKƒÞ‰xxj¢=µ?é0EcÜY%:†¤ÛštÖMöZ…õZšV”ÀÌ¡$Šl)Ãþ¸³ö®Çê±Æl¦,¨• Ûy•–Ó(ÐBZ‰×°…ŸîîHuµåöð·m•»V²ŠCÊ2=TpukKØ ¢:ÞS±[B{ù´P'zøD'=ïõ½ÐÒ]u¿ŸŸt•'lúLWÙTWyL¨Lõ´z a§ñÕ¸ŠÄµ ²•ZôewCÐ^Ûßä²è9L¢yzJÕQ®ö™ÇìæˆÛ·Õ&mewû·éŠ9„äpcäGÚøôÛt6NÛ áý­×~ªjS®º À‰PrÔÄvgÜz@PðÅ&<€7ÐÏõ:D»á¾†Ç’ê©ÚÛŽ7W™pLB ‰’(Á+ÕôÑa¯"wB26 ™:Ì$Žb / „ò `4’ôi'^ÇSÔ”OšðÁÿ|­ìÝclY)§øèemèˆôÖëœY¹D«9\ƒQ¥VPFkôPU>I+I­}ù¢ÐI}üò(„|\ÖÇ&¼±cdv@=®ùù Áå*”RÒMçß>$7úšfÄ‹‹çK#Y^Æÿãô¥¼Ìe,í‡þEé+àŽL¼ø˜xIvÂ…ëJÔ(£…1…Rp¬ž¦ñFŒ{Ó¼öÃ']w–Û>_çùsÓ¾ùÒȧ+­¶ÿm­ë³åŽ[k×VṲ̂ ô²šåHnÞ¼™{`\.7ÛÚ ã˜™Î·G&•óÚÐÞÁ±J=Â@ŠÂâ=µÚÁMÆÁŽŠÁu€†³[¿7>tWžÛTrnMùÙµú·Ûõ¿ßb8¾±x“‰Tc8…Wý‡ûzië¼ÃþeÚ´Œ-ƒ/ç~Žo`0ã ¶±! IšÖ¤¹-`ûøœcÀI¦¦›Ö(U–É´eZ#- VµêXÓ¬[§i]¡É&miÖ¥[§) `ã+¾àx/#“ö%)Q¬G¯Î—£c¿:~Ÿß©V@„#¸˜hs?ì½÷ù‹Áà¡`€ øù`èD*þbÔφf]É…“þyߺ3à) ЈŽ ‡C‘y.â#sžø¼/ìÿÞø÷p1\)`„RË©Z{ç€1ËÛrn]Î¥I2+£eˆ·ƒ¡Œk}J§xP F0Ò†X[ˆoŠ 8b›ClcÖm q„އL/”oÔJŠcP%ER!FKe7{¶dŽU発φìKCÎYq:>>ÒÝD ‹a©VTUIŠÔ Á>c9c­Ö“%‡3-UÒÂKζ˜³<7ì6exû2gõ邌qnȺþõýl%ï4%˜úØ  $ê±&YkÂk‹yöëC¼nˆ×Ûü€kûE—ögÒ‡\SŽ«1Uï?ߤÆH -Se4QÙ]£È°u< ϰÏq«"ßiÙ!%Õh5Š.ºÒn)¸ )V l™°¿µË@A²CZÙôACá„=ëÒE\V?×<ïk‹sÖÖòßÕqHâà=g×|’Œ=ÊêýMÒc(0ö”³åJ§©œ09M©IˆPRÄ_¢#ÂütiX’ÁVAÖÿÓ¥Ò£¢Ü|-ŒËÓçÊþ}±vh[ñSÁó¢Ì8ÖÓ"–P0…ˆ+%B›Zt¦:ÛA÷j„¤d.§Ô°`Ò¥ŽŸ“p[²œ>éµ$ùƸ۶à4§ó¢Çšb)¦mÝëûË 1È‚KÌÓsÚãÎÆ×b­·#ì±%YÛS—ÐÅxíCWmÞÓ’í¯ûwk”2-¡K„REYY))î1xk¦¿.ÍhÒƒúן7—‹¿,†ÅR²¡J?ío)ôéµ-÷7wª`–Éd¤ )z»Ó”ä·…ysâxcò˜1ÂXB®úS¿ ’(cïÈZïC˜·¤Øú´Ûœt›cýÚ´×ðˆÛ|}{-"#ÄÐפ˜R‹ÕÜ$ gñÈ%Iæ"¾ ’•Œ «IA™aa@e\F‰åKò™zùœ$;^â?]©•%˜T¨ö–—>:_³t¹bæ2ùðeü Vþøå¨£†X¾Œ?I#…‹dìì7r㪅q~L’8+JþˆþƒÑÈŠ•J9$¦(TãÞgo—¦'‹ò“ÖK#ù[Âä›XfRPx·¨ðËâܯS?)h‡Ä„†BJ(Ba™ !ËÅP;VùÖŽ}Ÿ63÷wpê`§·û‹ãÛŸmõü½›në_/|Òêùs;÷á–¾{;Ù7;ÿº…¹Ý|Ô,UÈP‚ $SSS‹™ÌÒÒÒJ‹?+Yýd³Ù|>”uøà¡•é’¤I‰æ°M5±W?ÑUùó6ýõ]ò›{ê®>÷Ej\¬‚¤ê§;ëoìÕNtW¼ÞQ=Ñez­[ÿÚsê‰^úôfÄLŠÐ0Q!J †HEm®ê7ÞwûC/ƒî@Èí €æ] ­;ž’Ìû™xôdx~0bgg¦’§‚³gF‡›äp™– Êp¢Ô+ª>èÕ-yuéc¦8ßõ˜®•âˆò¶°³>Ñg(€IvOé€kSÊÛœáÒý59¦:ïÕ'9cÐ¥K 4, ªc‡©Å¡¦Û»:¼h§–ºÚªÀ0%Lˆ¥åJƒ/µ×fxCš×†œ¶˜ÏèÓ<ÚÂÇo÷Øë*‹¢R©L¬”0¥Ä)…¼Üª˜ñmIzÌ ãŒ5ÒgmãÌO-(ÍoŽÓ¯{}?c ±uQÆ`ê—Xûc]tëy}„«ø ¹ iÆ”9\“à®I“&­F°ãǽ}çø;‰ǯ8契„! ¯uFYâØ¾óÙI°ý1UU×P (tÕXI€”nTC{´]‡†´©Ý ´4lÚ¤–%>¿³“؉÷K#¡I­©«í§¯Î§“­Ÿ}úù¾ŸßIáüIjnDÊÁ §ˆÈˆ$1"ÏœÊ=׉¤"µ,?Å¡öÂáõË×rS¿dK#™«‚ÌûëÓWʼn_ý²îX׆ Š Å0„K1BCJIJ[IýHÕŽémôÝZÏM[÷”ÝùQƒkÊæ¾Ûê¹µ™ž´9ï?ãÌ–F¦lô­&÷íf÷&ÇÃF×d ý ‘05ªPc„|ïùƒÙVÃڎ韇޹EóàvåØý›Û Ç[õ; .mûr4²pþ8åã»ÀÍ¥m…mù·jßîÔÿb·æ§-º @—äw ¨B–ÉBŽä,Á1UÎþÃæ÷§˜ÏbGýœof¶à$ë øªdÖÍÍ0Ü Ë=ÁÈ¡O½ðã3{Ø×)BII D\Š×÷›Ó‡Œq‡6â¬÷»,AÚóUϱa‡1æ4ñŒ5Òc\ë§tÔ]d*øžâ9Wq¼¿ê§öíݦÑÝ5:ªãlM„1ñÝe×:Jþæn‰ÑÅ»Í*ËÙII4Ï€ ¦Ô‡|_ ïªÀVs½@&útWuÔÓð§öší²A;üC;~uOy˜n›óÔÍôÅXkÌS½ä©»ÌqoY¬¿ÌÏ@‚ýFðñ¬×÷ÿX’´e¶$]¦E¦Œ§!—.ÊGØÂE·)É#té¼·2ì«úÔ[ï­Y8P:ë¬íÔËä¤Z„!Å"Á¾?ÇH’‘ lc ÙuÊøi• LJéÐM×vù.K ¯"ÉV¼··'Är&Q¥˜€ BT,EåësÕhîð÷û­3=–U–c‹»1q\;A„G…‹gáÌ+ î58ö2úaŸ8„$I¥ä›É׉Ð04?$N jbƒªé3B­|øp)“I¥RÙ†Ã6–——ÓéôêI¯×‡£Š}‹¶âüs†ñ6õÄæÒ‰vÝ…ã¹mòŸùχ¨&¶ê.··~Mthƶ_l+ýYgÁ[ÚñVÃåNóéNM‡§’p®RRx¾CI‹¸÷´ýæÌ¡ÙáfŸ_ăLÈφ}³~ïL௽¾E%ŠP8ŒŠ)ª_ßg³¦p—!êµs‡*À>1¶ÂӜӜfËŒ)H›¾òµ~JÏ»¼S7G—Dj>è®r0@@ ù$§P´¿žŠ8¬ } 3Ýe±kÒ]2½¯ÚˆÃjH ‘R Ê9bÈä|†gK®Ø•Û’y` ¦$è«[èQñL1Ç¥XxWÙ¼·*ä,] M§9Ñmö³•ó=Þc¸ A-9ëRkçU÷šëëÿ-!¯1ä5ÏÒFÎk öV™Jž®žwÖ„½VÎc°€+Ö¸«tÆc1åIºîú#%å`¢<Ï—ˆÞÝi™ØUI"Hª…Hò`•€DQV …!`j4oMŠi{˃^ë.Ë–“/!PœÌ‘ $¡–á q®TÕ-ø*HÂn+Xó@#Q—§Ík}w=ú´St”qlm´·H,B—%\U©îÒ³EB%.–Ê•$ûFm¡6ü’€$y[ÆVA²"“a$1"Š¿Š‡NH2ÃèÒI,4DrÃDbYÄçNÁüÏ•#D.…j.<«Éœò£¢Èiáò |nwÆ ¥›äRôÏGˆ'iÌ87 džò’CÒ…!ajŸĆÉôqé£c¤Eƒdà ,¢HdGé¦Åw×eK#™k_ûãèÆH„ðED2Ua¨‚@öUþ¦™¹oë»_ÛóIS÷¤í¹­à;Î{v÷T0‰{²‰¾¹™ý ™Î–F&›>×H£{º‰þC«ã£×­ÍÌßë{y!8)K|>_zyyµ»³íˆ/h¤2üç/\dGGQ“Aꟴœß®Ÿèx¬‚µÖˆnâÛÚ±íº±6ãD‡n¬]{¡³øòž¢ñ'¾_3Ñ |¢¿´©ø|»ö…b‹R$['—æà€@p UKaÄØ¨zsßTèÅ×ÃE}ÿôû¢³‡# ‘C~&ð„GÁ.ÐÏÍö†ƒnÀÿolæpÖÙðß&èäüž€¿?:‰x9ÎÁqÎ`À ßÜÑ`ï[o|'’Ê °i’e ,øÝ³ÞWï.žg+Â.3ﱬy1ùô‡>ÙSžtW‚é¬1A\樧,î±òÝåºÊ´8 0li1‚©ÄJ,óV!Ÿ±µKt]ØY,qÌV¤Â`!¡$DIöBu}þÊšÖaÎlÕòl}†¶Y½¿×È»Lký»ânË¿çñõ(m ÓÆ c y 1ÖÄ{L º4á,I2s®2Þm¹,ÑQ_g±QÜwÀ[)}H;`¯wwvfçØÓëµw½ö޷퇱´V jsïÚ.m¡UšV‰„ q4Q¥( wD‹7ªš*/AU!R¥¾D콯Ù{í顪ú€Ò@QV?­ö˜ùÏ~ó×|?vçA*y2¬"p‘Àº2¬=r¥x[„îLNÙAÈ‚s´G Ý9²¾KŠó&ÃõZ ÚŸd)6˜ùwù3´h˜I’s‚†ƒÍ²Œ_ ƒõ ¹Š!/hT~ÂYšôTè`òƒÊãrž4[?‹û;ZÁ”R!ë£ê[&äϳñ¦ÂÎlÈV¡í&áÜ­mZXŠ©Õ8„ì @1Ö¼úîÎv­Á•*Xe BcTK%¸iÜgC}1=P&Måqë|¿Q†ÊUD—~VÁá~Ç+½x¸Ïl1Èj’êU*I»»¹¿3w°' l0î¦LQÊ›šé‹ñý)~Sš€Õ˜e]IÖà< Þÿ¸×OžõUIs™óÿvW·^-AÄ‚ëp…"h¶Ü}E'“®ÎB•ãÍwÞBĹŽõ!Ì¢âIIô$ÁnmT+!9ÚfÓ}ëƒ_èÊs™ã¬KÓ 1HaØ0L ËoéJÇ$©*áèñø†üT8ªY›‡ËG‘õƯƒ*³ø'‡áŽ™N¡Òhär½ôWczqéùëxéR‹¸Ðš»öTá£Æò•âõ¦/«‹ÚÕÆêµ–âe¨|M±º$_Å…&q*]k(/Jk—%âšÄËÒµD¸"‹_~šöuᨠV锪6=¬7µ [Û,_¼10~³÷ôß·P·¶POÊÿ[ý¥÷@c€e’â©ÛË¢¸Z+$µZíA¤¯Ý‰_G¥TÅ’¸V«óGŽà¡”JôE:O =x·œ~’Ç­‘Žs/˜Îï6ŸêúýîŽÓCígw›Ïî±^Yo{óÙïÖgujÐxnÐxq/ÀŒõØnëÁ-j“±µU§„ H©Ä[ -J‰²õ™Í#æ‹ûáÝ;?MG}cãq*¡#ñéHêp*>‰43÷VÈdz:›ùQ21ýä9ñ•5’J†±H¢+áX4”IÏD#|,2‹•ãáÅ÷Gu:¹–QH‰ëE.ìë[9¸¹Àû¿ Ä\¤ùØS;Nuæ§|G,±²%Çm9¶gmLû¢¡MonRa6i;µD; ©!\ƒ„‡©üÝaó2ß[f»£3~pßþ'¿c@/E4*­RgDTj ÷#êTâÐ.ýÓ+ÔVñ€${dƙ㟘FêîšôX¨@†$Ø@Œï…7¥xGšµœ I[…´–_¶¬Žwƒ¶äi°±/O‹tOêU¡û–isŒíÊr¶ë,3Î í„+N:öáUà=€4àôsŒý~YÖ–çìõ½(gt¤ȧÀº AEÁ¥ "Ó¾{aO4\çGnÒ^·&Igšvƒ¬,²A@” ¨Nú+¾Gշ¤«8:æìL-±þ{áçÞÖ‚]#܆Á­­èÆ¥Ž"çˇ¼9f`q¿u´ÁжÈ ã{,êKßwDÃþ,iO0Ûœn¼è3Ê7”ÚjEá÷†zoOt¦½«ãÁ›û6o×Úrœh@1íϼÄíÉ:6J“>íHQÎmÍðVà“ .D7XœyÊ]¦}àÄ÷úÉÒ¶â}‘Þ ¼=äêBáfH©&T:EÓ UõÙ«pqVY›SdO4‹GŸÍ¼¡ZW 'T™y8?¯øÇk.'&Å¡ †‘†}6Ã6‹Â ÉÛàvÕëà–ã#úò¬´úš*ÿÝ·±ì³Ë~h¨ëü æ3»lg†-ïì´žÚ³®FNïí>½hÄpf‡úýAý¥½Fí¿í95¦Ûk÷,-B(:oSb8¨t²ÑC?:–É🧨ÏÒSÙô¡Øm:§ 6Å“|$ÁF̽¹’"Ÿ<'¾Z%“\<Æ&aÀTüp<ò“ÛŸ“BîDZøT%2þ׎J®Å!×#ˆ¼†?uŠ$Hs‰5U¦\± {žï)2,eÖ«tÈ™ ,Sö$i«rî2ãN‡ú–ÃÏ/¿ä› ç·š¿çèÀ° ¦Ý¡‡ Í:D¡ß‘©µ­ˆÆBà°Tfì+á.a¢;9Ýsi¿ß 5£ˆ–)ôjm„«u/*Y|éù{äHsteywŒµ>äYožqdÙúRœ'øÒ]~ÙS;àðñW`Þ› ¹âSîHØŸq(S‰éÊ“–˜åzò´÷¡U&½õ §œEÆ]âyÖ&pÖ<ßcú²Lot†æÙ`˜d}ªœ³Ä¹J¤½0a-&M»â3Ž•ƒŽç˲ž4íJ1Ž çʨ„œIÎþ¨úV¤ì ñ¤œ`[•é¿5æ§;¿ÙFH7`:ÑèØç²œ/1V7[œ±§ÂÁ;¤÷Ö¨e™îÉri­ÒUÞ–a6Ýì´cR™Ò„h´j|Ôa*Ñ6‘2$)—@uWùî #Ö.ô_Ô×yl×ð*jþ _»sïÌ^^{׋÷ðzïËGíÅŽC §Ò$¶÷˜™=ls(i¥*MJƒm0h…¢ †J¸ƒÓD¢UÕ¨F¥U%Ó6 øØûÞõÚÛTVÿˆ¥¦ÁAýô43zÍ<½yßÏ{…*1„ÒÐiÚéoL°€SŸsÕæh0Z`9àspŒv¨o©ÿ‹˜ &ðuE¯6álúE‹Š/@x_„B\¡¤MUQØ‹§ ³CXr€›; /¦…ð°87Ä)ÃÑ}Ò÷^ªÖs–‘¨´UABBJEá\´BÔeâM Š2GÑÙÁêÙ}ð ¯Ì¥zæóaeîÀŠÙ<=°¨vâÃXf?2wˆÜ/hS#0ŽÔBضià/GÙ Ë2cËæ.s—K³c¥…Kè7ÖÈUNæbIîrÙüu({©4{é?'ù9éËe©÷Ÿ*Ž­üdkÑVTp¿JL’8ŽB,'½ ûWwM¬§Ç×w„Š<ÒÈ‚C¾G_όضà0Ì'HŒäÕÕÔfb±|>ûß‘>77÷èäûÇ’B¼ýè™3hF¢€‡QÝÉ­êÑT§:@²p¾Ô©=Óª<îPÞXy²U1Ú®8áМ߼Xÿê“à=7´(G5'Ûä§Êšw;V¶HÏu¨vÔ9êÅ$óx8EЏøùPÅíüW¯¿õÏþT$05ÕšaC“}‘©ÝÑé=Áɾ™é‡&‰2÷ÂÎ'ΉoYÑÈΙi&d"áþàô®ÐÌîh¤ïþý®àW‰Oi¥”KPˆˆ’rpJÏ—ÝxÉ” XÓ^  HÚ§ˆ0uaÖ”ñÙRNíR¯ºqÂ~S¨Ï” è“ݵiÚ0³kÝõíõ­ò*‚ä•”¬JV‰qú-²;?ÑÌ޵ÖJIà`JŒw(¨`¯1ÙS“cU)_ݤÛ|lƒ®š·—@ÐSby…ßX1Á®uò»,a¯ºàµd]† «ÿî5ò€"¬1ÄÖEéú„§>åÑfYCÆoLø ‘€>ÆhÁýP-èÀhc hÃtc”mžv™£^[Økû é=¶VsÚ§ö;¯š>Ý®þx“|ìEåG›U¿X7¶Eñµu}³üÆvåíÃ]ocÐß¥í —5ë¶Æy‚]•ô*“À'´6áÑÅ]  p^ 3Èw€œ„ÇwZ3N{¬ä¸ ˆèAbÒõVñÕEukÜBúD¯%H‚´бHÛÓ;[ÿâ¶±L©Ñgnn1M÷êŠÒ3`RŒ¶Äüæp¿ñ¾WÚ© ùu*Y_cÖ)ʽnýÍZY W¢° ä9Ú©ÿ’QÅ=Æ"m› ˜C=’É@‹°¼LŒ¨«1&‰œ×2åÒ†ÜÚ°[e,À]I—8-JÛf<ÖÚñšã>cŒ}lúZ¬¦ý `2¤ýšt—²è±ÜešzíbT.Ä*9D#´íƇå¡a~ú´˜B* ƒœ¹!nñ°0ôüÉë«,U?”RÏ È帰†¹*~«C8±ŸÈ¿SZ| ¢~¶u…€(¯âK­HìPMáíòБ’ÅžŸ=Xš‡…÷‹Æ_©)˜Ç¯$ ãol&óàÄ/>]¼V^¼'/®,\…¿©F2æ®R™ó+ ,/ŽÁÅ+œÙ ¥Åëœâååó×Vþí„ÀÓŽá2!NR$‚ò0JTQÂM2í¹†m_´o6wÝZçyT ùþÙ:æ¯k™'ÎŒÿ±>[ËÞrô¶ŠV¥ p=÷ÞYà…Ba!ÒBHæOPÿÇ1?Ÿ/Îή¶Ø!‚/åU"¼ éž&ùˆã?# 2YÀÉRk¤æl‡ê×l¿Ý¡8¹uÈ/lwø#­‹õ—¾ íÔœz^sbƒê„C=²¡~¤]w¼:ý#í¹NÅi‡äŒC¶·©ªQ ĹBA%I!^µŒ«áÁ¢j‡ä—ç:¿˜Þ9abÑ]÷ïz‚_ù²±Ý±iÿÔ=ˆò`¨ï‰sâ[V8¸sj’‰Å¡;=E‡‚~€“d²ÿã~«Q&!p=K`u˜à|‡tÆ×èQ¦™º|/ØóÖ}†XÀui3K¿Ì»ôqð áÕg<šüÎÆÛ=:ÿ&&…B’' Ë 9λék)ôiƒ½Ú¸¿ah]}5§„À`Þ‚‰ûfƒ¤È6}ʤS•õ™C´ubGóûëôn4ýk›äfÜ¥È÷)ÂnqÚ[—s2.SŒ6}÷y’kŽ2¦°Çöè"´>Âè¬TÆÛ_Üm-ÈÓcK³ö¶ª/üXqxäÆj§^Ò¾JÔ"—*0ìj…BñQ„ƒ )A`A®Ä(ŠG|}(…rù(W„TT!J6I¨…t³Zì4Tý´¹æH›ââ&åøËš»Œ!ÖoɰöHa—ärÊ«ÏzuyZS 5Ñ€TÄk|ø ¦8cMÒö¸Ûú¸Æí­mÖk‹úŒÀ9)·"õª \ûÛÿô²õݵdÊßœc´w}Ä£+8­³½¦h·*ë1æ<¶T%î2å A§¦è–ÿùAR.Æ$$ÅË· ÿÝóÊ\ÿÐgŽÖ}0¤¦ÛÛÌ"ÁÈšjÛ–<­Ìúµy¿.Í´2ì×E&žaÌYÖœ÷gݺ¥ž?!·1æ7Eé“$ÁhЬa¢Ûº»Q(¨àã$ŒàêÞ&(|D\8À.ª‘Ùnú°45€æ–dž+BÑ©£Ê³êÁèkmÕ{· Çß§öQs¥©ƒÜ¿ÿœ\­æ#\ŒàS‚i ò+,Z<º2? ZìùŃÏeTFߦÀkߎm—s˜OrÅ|~ ‰^„æ_’½òtö*÷ßÔ×{l÷piÒT‰2BbŸ}w¿{ûíØñ+qìÄN ï„dM€l¤-¬Mœøí8Ø&m«6Ô–ðµÚ 4@ tŒ¡¥@Wml´j”ZKÛµ yÛÁŽcÇĺýÒLü±6¬@ÔÓW§‹|¾è÷óÝïû9þBæLúƒjdª_”ºÅ¿“ÅŸ¦þ˜•:#‚DZs?<º[EZ<3’”"™2 Gi²Qì/^{}µ÷ã ×Ge­×*:êïÕx?¬t]­p~TéºçJ7Ì¢3ã>sceûÕ*Ïk¶õb€¡hùV+ŸI}½}ïøñ?[ŠO]z÷]2K„3 ‡“ˆèzŸV©œ§ DÈãÔˆåðºô*œ­Pê·Tç÷¶hÕiÔä¿ù“…Î×|½×oÈ9VŸÝ[¯>Ñ ìkPœ¬Ïî[§émRjÈé]«>ݜݳ>'X48Ô:@|LNƒÈ ³´©vœoþ|¢s"¾uxÜ9tû¹è„; †G_þ|Ñ9ñ3>Ú‚£›p޵B–„Çùñ`m™ ,‘a2(4FHý¾¿ë7ÞñÂú+Œº-cí¦·R$äëÓ¸7ïQ¯ºpa‡+ü”Ï›:Ô¦ û,··”þ}££„ ƒg«Q\%Ænºì|›6á0Œ8-°[ $Í`"Œâh‚‹.n°'¼aшß<å֦ܖ»ôv§-¼Y ëÖ„Ö/'´­(ì´DŸ7%½vPßÌ=–„ÜX. ¯å®» é*˜vAœØB>ûÇ:°ÑØß¨ÙU"wæJW«$Ð`XZÈP†f &IÍJáÀq¨Àb4ŽR“@±(û­‘ˆY .7?X§a(’¦–@e .—9‡1œÈĨ–ÄêiÓŠ€ß_£¸Ð’û/gñ°Ï>î5‡ý¹1§zÚ«MøL1O.ìë¸ßÉuÙÖDÅ:ó“3ï,„N ê£AÝTGöŒ+ª•÷[BíšÁ x· Îa¤³pµ2Ö®½ÛiŽ#.U¤Ë æMA?8QOi³V`˜ a0‚N§qÁÔ™™ÑçŠx¯6ê4@ŠüÛ[ØšGJ¤ @Ä”k¤Æñ@þL‡.îRE]Æ)ŸaÚ¥»s’Þœ¤GŸðb®<ø˜<ͦ<¦¯}Ì]2éÍñhàËÊnùò7ç«Y’|BÌip9üw4>™ØËòÝÔ‚Z؃LíwöpSû¨äA‚ß&_Ç^f¢û¸ÄN*¶= žÀïFûÒNùĹ”œÆ0 FÑŒ\H€¶RìÓn,¶ÉL·r¡ëÏt§GˆS{©éƒË£Û4³OóŒÀûB„¤J5iƒg°Øù¬ø_2ù·Ó“oe<¨Fîþ퇱³O$ÿœÎ÷§'Ï-M^ľ<+=ý›åv½PÂBAJ)±š#¤3‰¨­öz¨ŽKu®*¥ŽëU®÷k=ï×ø®V Cæ›Rä´J¹î÷™OÊ]—+—ë6B¦€Ï/IŠPôŸçþúß6ÿžƒ$‘L9ZÛXš’‚ˆ¼µHsjƒþD-„ǽ@‡Ìç1hÄ´}P’Éfdr0勯žúÂã¦××,ø•cuÐ!Ð$Ù'5}ë BT}ò¾§ÔoTéO5NnÒþiö‘&í‰FÓ‰õy‡šä-f Œ£q–ŒÁ)Y¨mò+ξ×9Û9Þ2<êšó„Æ‚¡ñ-‹Î‰ï_dò_}á ‡CÃ?› m¼µ£½E +NF .–f’'šÍw|péVNûìðM3âµÆüE‰@ñd\ró]¶ ¸ ?ê¦v›à¿‹8 §çAâ6{¬ã•¿­Î–#+(DÎ iR”ùÒõx§ |Köä^~>ϲ4² %9¯Êf‡Ú‹¾Eý…¼'oÒ™3W%mº;›s? Å…<,ý.Û§~Ë„×Æw­Štä<6‡ÀAÍk$gØe XGý¶;î²QGŇϭ׋ÁZSÄ„8.Â01AQ p‚†Ú¢ šÂI%¥)21®B P àz,À‡{L‚‰¤¸˜è·'Q@‚ (‚dH††ˆ‡8a È ®osçásJ"a 9K3°Vähš…^Þl¢·Vçý£!çÚÆ‚ÛÞŠ _IÈUiÏM8M³nÓÚ®I~¦ÝœrÙ'=–Qt²aÚo‰tÙÆ˜_Ÿê4ßî,î°B%: nuæMù &!ó¼Eñ@ù´¿lÌa û C~ëÁj=”´XÂQŒR€ZuœT¸e‰³âʳú¨¯,ÚV³»ØˆQL,T“Kå$÷z½!ìÊ›öçN;Ì“›ó>÷—¶¥nÐ[=â)‰øàõóc>Ä$ïHð¡ék¡$Æ1H£®Ò¸'Ò+´‡Ûsãný-‡±V'ƒïJ‚`R)÷ꆥüKº…´0µ ã÷ "ûÈÈAEòd¶Oî‘ñ;‘ÉÝ\ò\r7Çïâ>yl+WËÓä*LÄÒJT°ŒÅ)%PIBÍ*¥äÐÎô…®y‰Xë&B;–𯒉™—~­- ÓX 4-ÁdÛZ–‡úÕü¹Ì»zrömáƒj$ùÖ þ,qvYüü’ÈEÑùƒè¦*J(Æ0… “IÅ$hŠVlÒ¯ê¯h½Qâ¹^⸹Êq³Òs©ÖóAâäZ™óFõ\¡ÏSd Ú3P醋ΌûÌõÊö+%­WªÜ¿2¬Vfá"ãvÝSMÉdr¾Ð!Hæ KfggOÿÏöåW£(pd#"FŽ[<›st½®¯nÞßÌ£Ö÷»†LN¤G9ÉJ½ùðFÙ©ÅÉ5šSë:_¼^Û;§íñ&ݱuúžµÆ7Öšzšôo6iÕë{~¬ë«Ñž.×ô•È{Êáu,GÿÃ|7qÝÿÒs–mI«½/Ik­uùuY¾°-Û‰0W†Pb[Z­V;t($m“–Ž 6!)ÉäK° „N4™v&m¦”‰M&´š†Øò¥Ë²d$[}Æ3ùT¦eŠK5ÿÙÙÕì¾÷æ½Ýÿÿ÷6Y5³-69AÒ Z‡ë(ˆR+ˆGôŒ¦J½çPÕO÷gÄP40ô>lKü×1ã ŽwÇ£/Œ%Æã=·¿èÙÛe6 Y,WF©Ut^ÀŠGüe‰Ž‚¹Àú)Á—loIBtÆ»J ¨ø€"‘ÞUϺ3B°û‹‹•$ÑJØ~¦<Ž` ¨…gµJ5Aè µŠQ®ý`gÅòmãl *"T¼Õ¦WA0KçñJy.Mýr=+3]®ˆÇÙëš ñg\ñݕɀ¸DÀ’ì,ÎìYJ§6 ”ÿEVbE#`†¿µòXMþcŽŽþŽ’\§"Q ã´¯E"Y„¤œDÁæÅ ˆ¤`bh˜aPšFÃh¦%¯!Z(M+Ê<‰°~’ßÏ2ùé¼çXþ9Fÿ/ãyuÑÖ,yÛP¦‰`ªhuAª!I*(\ÉàJSiP¨F£ÁH5°crW>(`Š ŒJEP,…»4ð®Büx£îêÓ¶ äˆJl>'zÍ‘n;pNX*OJå ¶9_Åß“=q¯3ÒeKû«ƒ]ÎŒPï,í5…E@;牧ÈL2é­§Ìzf E²F °jK‰îµ:»É&`‡aQ8‹€ñ,Ó( s)¤2Ÿ^*ŠŠæhgÕ¨`í+å<<²“gö[µÃÍcŽÐ'øLâ¢u^r®ö›s;PœÜñš|΄Ç`6ÓcMzœá^ãÍë¶"J®„YR§Ä0žV^Ø{iaþ(1Û$f§û³âxüE4ý²j¦_}5k©\è“ýñÙœV*G¥‚Á ˆh¼¬Ã­ÜU–“!¸W5ëù{µ?¦È 3¥òé×Ä^¢¦ŽçÛ¡BaDOñJç0èÃ~(óö÷2畉 9÷«‘¥wä©·¿›y?秘Ÿm̵Àkq£  ‘rÀïvþòÖ‘&ÏÍZñV4Úä¿âF÷ŒÕøÿZ)|^-\¯Ý=êÞµ¢×ë—5ò— 8޹ýÿi<&|Vë½ú¸ô~ƒ¯aPðþ*a’$ÇÇÇW@4ò5BH*.þý/•JeÀ—2‹©48>{àG4Á(²ÚÎs'[JÛôgW]Æ3 üÙVý™í–“ÛLo´ê†[ùsíù§6Y·c\.eu×ð§[ Cõö¡Mü©íä¹VîÌ&éàYÝpsÞéfÃ`+PÇýök:¹Õpz»qp«þ'5lƒÅeD.Ä‘¼•1*HÉâšú}on»üa8Ô zãû¦'}ãaïÔŒ?<ÑšÙ?=+MOíO=ߛ싡 1Ú75Ýûe°ça©Œ68!ÌLƒ±¦&¥Ù™np²ü00òÇn{"3/¦ý…[ ¯á!f”µ· >ã«Hv8c~WD´­vvÊf¥’XwõÜîÒEÉ:í1%®9Á÷DD]¸»(¨˜}ÚzG*Ž‹&p°Çvã)K¡‘C˜¢!užËl w•¦}Üd·cJ¨ˆùÜ»ìx6‰© ä`…úåJä³} €;þÉnSx¯%&Ù@1±dÎos‚+p„|¶ðÝ~’=&E½Å É9ï­L‹å)iP°üîIóëtÕf AQ 2Œ£*PÝÁ®ì œÄ…h”Œ&Q\À¶“D•š9@q?§u¯jÌ¿æ,ê79×ç iʾÊ+ q]_õÆq–)|‰1ôPÜ]K Å ÅrqLv¸,Ø…¡Ë¥!9Éa4¡Ø²aøQ+«j³_ÛÀ^ù¾=ÞUñT%½e QÁ‘ôا%`Z…Ò”§t^,ùËfEWÌ_~Gt&ü¥é”Ï9å³GVVM(¹ßu3¿(yá€3ÑÅgDÓ­@U§ £ÆX9Û‰5'`½ZÍ4D0&% LSNb(Îø1WYLác;òfý5áÝÕ!ÉñÓJ«ËLjo+qeÕ ž«Cf‚:·Yô5 Ç%ãj/÷ŠoIF*ÙQ²^›Ã(dœ&h5O‘Wz±ÙW¨…xn@‘9òÍX?õå1Ýâv/E¤û¹ðaøõ.‚Bå8lÄQ CYBy¤qíØa,õŠ"Ó§ܩ֒*9L[¹uÓÏËb}P48€ÍAýèÊù½Ú±V‹¡ë`@ik©I–~‡š;Ÿµð^öÒåo%Ïã U󾑺$_¸ŒÅ/f¥/+Rï*—ÑßÊâïÉ.e%.<’|wmüÒºÌÅGã¿!{UÅ„œE *’g“)×5©u/ÛÿS½÷º[­ö\[ï¹Y¸ß*ÿ·:éF­ï“Zá·øq£¤^P¹Q'~ä–Fê}#–3æö5 ×:>ªûÁ>Ýà»Qëýs£çj“÷³jÏç5žÑúÎÕÖäÈïÇnœˆ:ª¥ ÍSR¿ªyjáÎRzTyÀ’ÿ[¬x Œpùâ®F2‹KÑp¤Àd‘Å(ˆ–—÷m6·N4釚W[#úáÃpKÁÉÍ–¡mùÃmú7Û-¯obw¨êyNKpzµº§ŽûÕ–Â3–nýéVðHñÉ6Û‰6û©6ó` ?Ôlj+l¿ß~‹Nlín,j×oÓJ•t)‡+sXT«"q’PqrT«U;w9½õOæë4¸‰ëø—¦CÒ:ö^­¤ÕeIÖaÙ–å Ë’%Ëæ° ±!øÐ±+ÙÆ„öCK3MÂÎd¦“–!|QšfÚN§LšBjSlʤMèÈ>$K>d,ÛlŸâ´ýÄL=ƒ‡ìüµ³óv罿öí¼ÿïÕ ·…™Ð˜?<Ø<:Ñœm›`¢CÌhdßDhÿØø²=á¨ûìØ¨w2ú|(P$™)þ«‘‰ñæ¡Èþ…!j4|à×gjÔ’—$‰ƒéæ¥î6R½ Öiá¤'{ª¹œã‰Úºº«èb“9ÖP[ËæáF}¼9?Roü× Ùa>h×ÖæjZÖgvo’}íÕ´€*k±†5]Õ: Rp"™'“)‡Êuóãd‹…cÌ“þœŒãu庫ÕQ¶ PdY#`¬gNÓMΨ· Âê£~C”5G|P£Œ¼½96'ñ½¹S¾âÙ@iŒ-œnÐõ7ÚÎm2ìÌ"Õb>DÂ(‰Ñ¨@ÅOÁŠ@Å"õ‚1EAÇE¨ãW‰È}RõòìßÊ ïÉJ†h[ˆv|-³?”—öA¥mHY:¢,N(B–ÿ¬4"(- J‹奃rû²|XU”—÷ÉœŸˆ×¿O˜¼¸¢œ u$,¢„`­ Db%HP¢ \"–b‰ !D&áY ¢Þ"¾¼M3äËš dÇü9Á¶œá€iÌgœô™¢Í9‘@Ö´W¿à1Œ3º(kšóç?f,óÞ¼ÇÞœYÆ8ÃV¬&wΓi2EÚŠÂLîÛòávØ6‚¥Z„ Œ8jËsñäßÙ[º•FÒ±t*Áê<£µ|ÁÚêÅ+»Ê1–Ä—³Ï±ßŒééR‡U4ÌÃ$|1&T’b%)Sø÷ÝrÌ]f³ž—Fâs˜-eŠ>ÛY˜%JåÉ) ¢prSúð'xè î„$ö6Ä} œ9Ž/K}šbo˹÷_ú4 4"©<“RDô½K^*tR´ðKãÔA!w,iì´$`C^3¤ÿá Pdþ¾¬‘e$Lò”þ?û©ÂH¦‰q:Iˆ©°5‡1îúã7Rž\çÍ_×éÜ5ܵô¥„ñ«éO®I¹K©Ü5wŠ_YÇ„ÜÄæ/!ÜMÁÅ|[ö ˆËh¹–‡¥JE5Jþ<ÇyѶ£·’ý{s×îù[¥Àå¿gu¯´ÊîlºSîészFú¾{oY"@Ÿ6ï'sßÅö–{?/«ïµ7Ü/÷ö¹˜/]þû¶„RzAØú*<·\«®  H\œq¾&C0%¤¨8C©šžIPä?ù¶ÖWÿIéÉ·ÑÕщAˆ„¤ä8I-í¯+Û7gvWguÕ¬¶Ft=ÕÆŽ-ú3›õç«ÅÝ5—·[l‘j…)SŒEZË»[³®ÖI.:•].}Gþܦ¬öÆs•†ŽÍ Íùõ¹«êÙ¬=_¡;[®é¨T_yEÓµ]ó–KµÇœNK(°»€D"¥0)„¹¤ã@Yg?û‰Ÿ…"máqOl„ FÞ¥„Z…ö · D÷M„ý£# “îç¥À!@‘(`Ò¸h˜P´ƒ$£#­‘Éæ[¿k4* –R<8 ¶«“oï±q>Û¼Çj6³¦ÇÍæiwæj¯¢ÓK¼¾pا› h–Üy!výïwšë ü X(â d<^&,Ä`JI½åÔ-ùJçöærodî65ç* ž@I@‘*… ?ÖæD=%Ó»U½š¨;;ê+Ž·•Ä›ÔÀ!˱Jù/Õç=SLIÈ—7åÕÇX#øG!Ö:È™`McLÖ$£{³ïÖç­4•k)Ô= "'Å8!%0ÈA Dâxн QG`õ§DÁ?%Îtý]2.+~$K`cˆ¶ ÓfQ©5B['eVpwT^òHQ @2´l’gaYþ8m™gyá0mIŒûÍèÅA…uDQ:ª* ªŠÒ[â‚Oðl?©ª!ÄzÁHHH`0J`ˆGé4T&ÂH0M$™š†ÿ€­Ý¥ÇÎ:tÓ{ÍqOÁ‚×óæ~CNùóûó§[­^¼4Ÿ&ÊègÓ¬7Æ]´â©i+Šº3Z,÷¨c?* ìÛÈ$£1Z Rkeð` "Ò ¤‘Çùò¸íoÚt&j-$QˆÀˆó—6:'š fZ¬S͇3PA2A.^‡ˆÖ£ˆMÑñø<8] Ò EJ½WFÏùJž—Fb>SØ] XæXË…ºœLA T~º7‡yŸ9¥áŽ)ÂïðO¥ÅÞ}ªF–NAOŽÒ“Çáõ/gÂÐ6ï«ãÒùCâ…Cü؉äÅ“Bîx ž&‚Çî (?IüŸ™;Müj„¥c2‚xJß{(w}íÒMhá Ÿ»–Ê}¼h„û8éÉo^˜»¾fñZ¸5w9‰û(…ëY³tóå{ŠW‹Òi{(LðQTH`¡Þ%1ܰ×öÙÜ_Ú™¯lì@©çN™ûv…ïn;à`VZåÿ\á¹SáMhÄîé·¹C@ã÷}W' rØ›î‚F`’JŒÒg÷õ:Ù¿–ùî»üål¯ÃûEsÛåYmôÙšú¸ìž»v÷Ÿjü[DZÇQœ@a¤óBDzF¾ãá¾ÁÒ2H@Î ã å§í ަéZŠs¯¨/T©{ªMç«V[# ¶Û«ôUÒî J€ÖRü¢\/M& •BJd¦Å?.Ñ\¨Ë<[£¾¸îÚ(ëqÑMO•¾{«±«V×µe¥ƒÊ;7dtoÖtnж»´í•†ÎjmO­¼«®ðxµ1¡p1†QXŠ' ,û7óuÛä}ÇüÅ4Mk§røzîÇÏcûñ_±c?¶ã8ÍA UYÑ€Ä×ã#P˜6µo¶©ƒ†cGa)GAÓ€•¶LÛØV±\Úq&!qlÇNœÄ$'Þߣ­´¼ˆ¢ÖWù±=ÏOúÛÏïóSP•â¿kýà†'>Â%áÑØ¦©Ø–XÄŸ寒¡ÑĦH,‰G“áñd0•äž—FBþ'`,š¯a,¹9™ØÖ©x×íÑõ÷úB5å0Jj!žŒFfZtáU}*\áÌãêé€eš³¥¼ÆdÈ𬟢р-ç3t?;ë¶ïk]T.*DDÅDó¥²b à4‚,â‹ÔZß`D@óJ„]ã!ÇK¡ ƒP‚@4Nºø&×– ؆ìSA6×iˆʆú4gýŠ=_³äéâ$2§ýås Tš³§B6p8³AõÀ[?Ùá¼·Þº…ºFÏ/Æ J ¾”B(\,Ei¹H¦àK”%dÑ¢žþcöPºsrÇ-Um\Y7¢¬¼£²^/3Giû°Ä>È8ú••ª¼7bòꄬú¦Êr[i¹£`ïÊÙ¹øaDLâzZ”Û@î«òéWYóQ[4Ö¨œf,ý²Š~†íWÚ˪†TUC ×€Æ5È8ïR•'­o¡ª¡"„¤XŽC(Œ”Â$D2bBFA¸Âä$‰Š×˜Á¿Üz÷5Ë£NS.`ðöèã~Әߜo¯ù³Žûí£œ3ªï¾Ä¼Óàš>#`aÊ­šðk/ºí#Îð ´è¸-CnÝp¨22g:µãnu*`NxL¿uÀmë`ó. ¦8՘ϚÜlÓó IÂRLY… N¶ÛF¸e÷<®Mub¡˜/"hX(a¨¢/×U?/Lú,“~ýgŽúôºªö6`L ÅHƒqHü¦ Êtã±m‚l·bìWÔdÿIZÈì%ßÂsïH"Ý’ëÅÑå™î‚t•Û'vS{(pNúí¢é½ÈƒÁ£íßyœ¯òõá“®Ÿ~Éô®±b¾ÐŠW× ÙSèÌÙ‚¹³EÎ.˜þ¨hüTá£3 sþ sî{S¼˜ù°ðÑûŹ¿.Úí÷Æ#ž‰±@*Ò‘Šz§áTòõØHdlôõøHðyi$ <0 pH<ŠEƒ£ñ0(2´5ÂTN 2+ñ’“/ç1š"œÌV9¿sÊmKrlªËö¬Ÿ¢)7› êÇCƈßul‰|æ‘$©‘Qçx¡æk \Êç¢üû‹ú;§¦x—ý/íf‰ djX$ÆÅ»ã× Š$h4T4ò$ÏH#ie¼Óój'Ãå‚àkÂoøM?kÔ/S¡ŒG …Òˆ Œ °)ÆàR0²j1j%©Ü.Ñ—™‡ä–»  GDf‹Òlœ¶DiKDnVÙ¾PÛn(QEpÈ0SÕÏTÞ’U)YˆÂQŠØ#Lå°Ì™ÏSÒ¸Q„©–9"RGLfKÙ˜Ä:*±€5*µŽ0lDÎF{¾`‰#&q *­·æ»e,ÀITâŒHª¿d\ÿ¢Ø-bù*!a*Bd¥ˆÂIŒä“xÒÀ„"\‹I:L†ã+íý>vn«yΧžõ†'Õ`7Sœlßt°|¾û2á·¥ÜåÞŠ ¿#Ë™rÁ²¿fÄo?°Ší©‘'6§ÂšqŸs|£q¢«b*¬ïªL{-3^ËD°"f£A{ÒãÌ­¯ Ø?zÅÈ ¤ˆ+IL Cç×ZS]ö¬×4·Y}?`êqHõ0JÊ"ˆ·µ¦ìyi$ÅYS[Œi¯i"ÀNq` ¨þ±EAŠ„°”ÂqžB ?ØÎ›þ½hrõð—âÉÝð“´í‘¤zŠì€g¶ÑÓ=ü¹m r;ðá½ÈôNÑä^mbt¬û…™íE™êô.ÅäîpæãüEž¬‘‰tvOÁå7Pª”R“rŒRÂ<Þo»ÌYÀ…™3/LŸ/IŸåÎй?ÒÙÓÂܹ¢¹Ó/Îü:¼¯PxP1F”ÈEŒ”, |¤êÖ,½Z¿árËúÜ×êúñ0Õ_ƒÿj#—Sï»Zã™o—¿WÃ]¯õ^^ì¹Zç½Vãé«õ^¬óܨñ^käþÖй˱ü5kc” œ¤E0E R:¢¸M©¿Ù}µ–»Þ~Ö¹Ò+ÐÈõ%¡.÷…FÎKq#ÁŸþûÐÙ³Ùl¾Ëg³ßZ“|SØììlžOs9ŸÇ‹!(Ix$O¶Î`8²ZÖÛ²èh›òørÃÁg®ÃáV0)•k×hÑZª?Þ¦Ù×fùͫꟷ@. HåC"\30!À˜S&Ýh0í_¢>Ú¤;Öª?Ôþ_æë4¨óŒø§Ó\HÚ]­v%í¡ €.tsÁÛ×N™8Øè²1NÒé$“¶žÄà3Ný!±¹ìtœN]g:ñ§Î¤GÆNc\7© !!qŒúÊt&Ÿ<Ϙqwžyç]ÍJûHÚ}ÿ¿¨]~â>uv–^h–ôm¶” îP\lVõ6k.´€N„çÊËÍšÁ=<ŸQÑB.J3p6!€‚Â"ˆØ¢ò«N|é›{;>嚟éJLß|<´8”J¾‘šûùôô[ÏJ#ÉD˜Ì$;E¦¢`’™D×tÔÿö!Êw…ò¹¬üs-êTgå‚[“è(Ÿòi†l+SÌ¥MwUÍxj©ýØUô !Ö®ÌzÊîºÌ2îK¸@HÃ|.‡|¥ëo)vkÏÕ‰Œdqœã|‚Ajøyi—cÑSw™²nËaƒ(QÊùÁ»áTWã’»"¨H²$ÛeëA݊˼A‘ÍÓÈtGi2P¶ "¯ÝkÕ\k‘ï3‚'“<% ‹pÑ\¶C ŒÖÀBQz¡DÿU©yBbiþ€²Šj¦hsThŽŠ-±mRR5%¬Š“Ž„LôQZ!+@…©Š0­›éÁ'(-˜G„z@‘Ge Ó•OK#QÒ6IÙ&HË8e[G¥æo%• îËÌcó¤È¥LÂ8AÇÄ&ðbBhO– È4&±Þ/Éc|Ã8eÝÞ*Ñ}D«v#Â&·QŠ¡ çqpƒ ³ †DöW*¾yÍö˜g:ôóå¼W²à’.»•™'ÿ¿–|ºE`Å{Ìå˜n7,ÕK^ùŠWŸ 8×\ÚØY¶«l¥Uµäw¦‚eÓÞòÌk²¿jÉ£\i“/ø”é€zÖ§¸ß¥ˆ-Çl´Œ]€£RœÍ{ÇL¬å¸+ž>¨›i•/ѺŒ ¶À¸šyüg¥‘H§*åÕ¦<š•`ż¿|®]6åvüLI   #x ¢Ø9$LddO­¾Ï}œ’ïdÏb™nVæ4=šŸ=,¿—?{ΜÌöÍŸz>{ÎvSËGÑ¥3Üä) dC#ù~÷q9Ïä­ŸyáØN¯ˆÀ!—)DŒÈ;{™½ò“åÏŠW®1²Ÿæg¯<—¹þÃä ÿ|kµ¡hÄÁØ8ÅF؉IfAHYõy­ûvCð«šà ë‘áêÎaç¾Õ.Îw«½#6w®j|wœþ[5ž'Mù{µþ›5n››uÞ[v×=»çn­ÿë:ß×õ¡£õZ‚„8Å‹)(f"s †8,q”]Ì.hÉ¿h9øMmð¦õÀfkä†Ó{·6¾&phòŸµþ.M ¿ˆÅÇyÊ™’}uuõ¿Aÿ¼e2™ì#2†£‘I‚/À¹¿Ë²¤=õâ¡&éù:q_ƒü“ÒÞúÍÖˆ¼·^<Ð,Ú¥ìß¡êo’^j” 6©^©Ø£ìÛ-ënäm—‚B°ŽeBÌü|~­°âÃFé@}éå@#Êm’KÎ'=/}¹IÚ¿Myq»æâŽÒ¾Yÿ6EÿvÕ@‹¢wOùà«àâÒVúwг/Ëö ›„x f›€ ‚0¹¨qvjÎßtÄKÿj:y$>é™›òÍʼnxg4vøYid:œŽ‡@„Ħ‚`Lͽ?ú`¸‰8ŸB‹øùyoZ%³àAÒ%ŸëÐÇÛÕ+!˼K›t—¥›“Þ²wùf¯¢“-Xض){ëiÅ¡"ZÀÎUË_ìp$½ê…ƒšd§ýÓŸV:Ìb›%3¹ØMB2Kò…eိ]…^k+_öT§_פ}ªµ6uü°qÁ[–éS®ïûß$Ìû-s>óÝ6Ýñ:Ê,eA8á’–€„Ÿ§`6Á¡a͸}“'ÿ½Èö jœ´ƒ ‘¦(¡úIÚ2%®š!ÌqÒ¡Ì ýÇ(Ë8m‹Ðö( @bˆQưØ0&ÍÕ±nR¨‹SºQ± ¨`\bž›Ã"óÄ#Bä@ò”4–Ø"Rû„Ø:!Ì),²†)s„¶€&'iÓ‘é;I! Ü©©Ê˜À&,èÜa“¸1Ž’¤9)²Åiý·”q„¶‡…Žy‘uTbì£T”Ð@0Íb¢,XsHž€Á›áLIQ^k)o YùïýeK~õj¨\™Ñ€á‰5Ð'”ÌxÊSµsöD°lƧY 9ÓCÖ«^ôYf÷«³ý¼¯2wmø³‡ 3íšHP9b™ ÀÅ?Ь¹JýÆVZŒBÉC±_Ú‰•ýê”O [ßW¹ê7FÚÊie`&¸øYi$ÙY‘jÓ‚ßj9¤M·ëR€s!Ãí}zQP‚ˆ!´â@¥Þè¯ù³gÑìûÕÂÒ9|áÝçÖŽ#‹©3hæžý€Hw¿˜>ÆÈœDzò{^Ìôð3Ç<©ãÜ €ÚÐÈEr»ùü•3Xº›¿t"º³ˆ ”ÇÇØ$xgoQì ’ýÓKkW¡‡W ³×_Hÿ‘1rðîøþ˜Íå#…Y¢BX¾…]M–~f}ý¯[½_Öyon l=rÏžãÇpµç_ΠÈ*A ;r/×ùŸ4åo;}7œ@02¹ÓÐñyCûo,-z„(a¡àQÃP"„ãÀ©½Bu§ÚªU¬ÞMÊßþVëqþáÜ\Š€ú{•g¤ÚÄu£jÿíïí*ïÕš6-,‚Ãlˆ ÙŸ54þ÷–CH6»¾¾ž×žÿíÇs9¨M‰ ÅÐêR½¾¿I6Ø$ìmP m.E@©{†Z¤}»€+J.6RƒµÒOø—/—]ÜVöñ.ew3¶½´-”Ã(ýêë4¶‰ìxÕ/U©–†ö\žñ5ö؉ø¶'vç2vrp4ì–¥»ø!ê¶ÚOmé–#µbWˆ„$ÛCU‹ºª­ºEÐí‚w@—k—ÍeÇ÷çÆ}‘Vꇖ‘¡Žÿzz3’ýþÏ~~ÿßÈʺ̆¡.Áo[¥¿Û[>´W=Ò¡\¿F6¤£Íe#»Ê‡Û—׿ D´ª/ƒ4Úʇvé/wT\j®ÞˆBžm”ÖRˆÆå`k ßCx]…k°ü/ãî¯R? G˜TÔ™Š¸£_$þÂ4‹E@'ïD¬Päã$®æC/ q~Fu(à/œµ‹¬ù™«,Áš=f°Å<ÚL@¿àUgÊÔÑ «ÚÏ‹9g]&Pe4‡hˆ¡<¨”À·Ýï1Ï»´iÖ<çÔçMošI ºÁ¶ Qü-›rŽÕÍú©ø‘Ò´·fÞk^qêò.ÃD¯*}İࣳ‡Œ¹¾z`•¸ÿ?m’F®0 ha5ô2ŒÂ±Å% ãaU|\L½_f|L™gE¦¤˜ž’k'eºiÊ¢*ÃTUH ü@OI“¤q’¢§dô¤œ䘤ÖbÜJ¦É†¸!,´†„5€+€!q¡5&ª™V‡EÕÀ!“”y‚2o”F¦Åư´2$1/…Ȫ±eJh ‘5OeU_‘æ !=#¨ŒˆÍQÒZÀª§ óS=!5­MGVù%ez"1|)3NHëWBrÓ ¥›@ªaÊ fñyií0¥þ¾€b…;p„ãBD$ã%¸|“bn‘ƒä¼Ý( öX²þÊ—r½¿KŒ1eèr~-uÚ«Mô*R~uÚi‰û áõY§]õ‰£Ú#I¬Y:îV§ýk‹gÑmJ{ À'‹þڄϲâTýi¿¦ˆðP„D·¶‚©Nª3^c&PÜþ×*JøÛE…Œ+¨(¿(<û!ÚOG y=øï$ÜÖ)ÖœgølQb/ÍJ‚%(Ï®$²'ÄésÅÏÓÂì '?È_8MÄÏi”,ž(Ξ‚OC ƒE §D¹A Ž¢p@Fqy:,ãÒEú ánj5P™ôÔ}ÜY1ÃÔ®:é€Ð(éVçz-)_eÊK§XcÔ¯‹-Å@ ÆNžó­‰b£ò_ôÔ\Ø©à"• %8&ê­'ògd©A$ûö·óç„s'¹©“âå3ðò`Aê çyŠØ¨xvË nI N ‘s"Ÿ¦¸(Ç#c‡æ‰?ã«W‹¯œêõß!`®’ÃG0 ŒÁ ‚ß§mü»Ýûhg`¼‘ùÌÆË//ÿóúu qŒ‡ƒÝ@# Oï£ÆÚ£­ŠwÛJGºäcC›®‘²¡=—š5ïuêÚ¾•Ü.–À\¬ÏÅ Ú!,€ôúÓõè>rdOéï_¡/tÒ§ZkÆ^“_Þ 4¢éT]lUtÈFZ7;OíP;@šþWKY+¢@ùœ)Ƈ¸0NpDE…¨œ+ñ«ŽtàIøÍ¥™ãÓáÀÊtïl¢&Þ—1‰¨3œrÍFý³ÓÇ6[#É„;;63s,™dbE3½‡ö¨)dÁ… 0:nì·N÷Ò9¿œÓÿf¾Îb›¸ó8€¿mW‚–†¶çòœ>ÇvìØN|ÅgN;1!,Gè¶Ò$¾/ê¶{D!àí³AŽ¡ª[´ó’Ür—u$Eu)c\d}BË˜ÈøÔðŒÌn[ï*Ìä–)ií¶îŒÈ£å¤°„"Êp.à‘4!à“ ˜Š(Á¦ýñW»ÀÍ7- ¹éÞõ½>ÍRȘ ÒžªÙ 9±ÄWÝhXŒÙæ»×ˆ"@§C:Xÿ^XÌ/"1±„K³èF¯ý×b ^l”Ñg`å“R¢dhOy6lškr‡ª3]õ~½ˆK½pªÃ¸Ð+Ëvë|æù5¾_3¶eÕ… y~Ÿ æ'„MÀ!àÁ'øƒkµÿ’W7µ¿a#ÁSŠð0Æ—Qe½„厕¤úÙÔÛ¿(“䎢sGñÅ~4„»ÞY|«dü¸,ÿV8RT8úü­?JËÉbˆ`^ÀqñËw;¥í¶ç¤Ô 0#ÆðV– Q±ùou]—›B7ë#5žË à‹.ÏðÖðõZÏß}Wä’Ó{BÝü²ÂØ$’Ÿ¨Þöe«çƒÍjz¤ág·ü•&ÿÍÆÀ5‡çòöƒ=Ž#”áó–Þý•³ûfsd¸ÆsµÞwoKlÄþÚÙsݸb{¨à;§ï{—ÿr]ïHKäÛ-?[Aÿ‡F®7úÁ 7x‡þá¦ÕHL¤‡B4Šß_¼ôMa¹]ʯ–ž®:þ×±²:Kˡa!À€îíÕ>îžßªr«Nµ”ŸÙ!Úœ°Þ-¯ìPµ©ßw–êQ¶‘”B8‘8Ÿ†0Æ4ŠL¼•Ù©øëVéùmÂ3.Ýà.°›øÓmò³;4§·W}²8A~zÝ5¢8ÛÎ~±ƒü´U~z—e`»[ËüÄ0ŒË§XH—ฆ´½i¸Ü=•øýXºkf"0ûèÀôdßDúàh"89Yÿízkdj—LE&“žÄXl~ê÷ÿà¢6sq¬!IÇ>hR.÷™§#•ãAÝcŸa!T·Vé—‹ÖÏôªæü–BP7Ò­Ù©¤„0B6‘ [ŒQ†šïuÎEõÓÅT@—«VBu³]Ú\Ô32"D• Ih‹ŠÎîS¯xUñ8ëÕ_Ùã0ˆ6– Qr@/þ{¿!Õdƒ•™HÍLoU>X•¬Yzg£Õ)u* ËĪfb椯.ë©.äý•ùWõ'›•r&E|ŒD¸°‘Ã(†p¹jˆç¡$ŸKŒwÅ5I¦&IÛ¦µiÒ‘&¬S´uTb—˜§hÓSgÀ32·Y{\^;-±$(Ý¥KJ- ym\l¿-´Ç¥.”Ga>Š1<Šæ’|P(4Ûf$ÿñkÍ#ºà³ü– ¯"ã3fCޤ¿:Ôäû”é ;٣Ʉš×êyXÛÅ cæ^=¶¹t³€SΣYiim–|šÃ§¹„A ˜Ó])6,wÖÎÆT‰öÃz­“ó`Ùt¢Å<[e¾WWÛçº+3aý„O›‰šBHfWYeÉøt`ÖP#s~íbP9ÖíQ h\ŠC‡Ô,üÍoˆÜqÉB?>w¸tñ(–}š;Â_ìÇÖ[#ùâå£âôñM©ãÏ-ÿ™Wx›þx/¦Råqè2º™äÀ8$"åBXÈÃ!7)ýȱ{ؽfï½]ãèŠÞ¬÷^uû¯7ôÜwG.:ö]ß®óžsíw ,*Caœ&eh ¥ø{Cל>€ €–ŸÛòë}#à\«ïMC+¡ÄŸ%ý–Ö¦®ms0À¸Ôìû¶Ñs§Ö?âŠÜiŒÞÞûÒ±w¸ý PÓm«çFcpÝ5ÒøÓž}ßèû$×Ü¡× ÍŽb ë!Ôë¬ö}aeåÉ×3x,?ÑÈR*—e…2Qê~·j¨ù¬Qs¶¥j°M9ø+ù™6Í™ÖõnyíÉ6õ`;¹_SJqiŒ7Èä¯X0ƒ˜æ‹K%<Õë.và%rw¥¤C.;éÖžkcÛħÛdçv(Àé§ÀªÛµCÛåCmë½§t¨]úI³j¨=×J~æÖŸÙòÎ6ÜIJ†Oe$R •rá2a¼kÀyáA×hª/?ûÚÔd$ïËNün:q(™ˆ¬·F’“áT*œžñ¤'_ûç¹N„2$Ì%D0Š00™¨5’.†Í)_Õã`ÕLÀ¶féÝ]5ufê¯ö²¼2Ÿ‹ÊX‚)†!’íT 󽵋aÓLH‘õ—º¬_;±%Âú³z–ÃP")F¡Å¤C‹~Þ¢ý®Ó6à®´à œ V&àþd¢ï‡­ùˆ*ã¯ÈÄV×^Ó>ãZí?ÓkœŽ“ àš³Þêt´:q z<`þ ^kQbŧ @™‚19J˜¸ð!Zù5ëׯ…¦Q‘aLbšZÆÄö1¡m\d$³?PØïˬqQõ´ÀüÔðŒÌ-UÝCÖ1)2OŠŒÅúĺqa–±ÄeÖ)ýÀþ…Ðô !”¡ÿe¾Ü‚Ú¸Î8þØ‡Æ—Ø iµ÷]]VZÝ%t—’Ô\ M±=Nlƒiu'}«ãÄq·nÓ™:Ø@ˆ§îC’´“6mãØ­±!&Î¤ÆØ!0Qå5/™:gþ£9³Ú™svçÛï÷;ˆ¦ÔFD±b!† ¦‚Cfê“Úɰ}!,´[9Û\ʾ²¬Äõë1ÃbÜ2unU=¬7Ûº…”ûËæ²¶R¹‡!BD¡âbL½ÁÄŽ()v”ņ›Ë—SÖÉãîŨõ7 "öP)©'áv‚˜à”󦥤eö(»Ôiμlžˆ›–žlܺi#¹¸m#œe>bު̓¤öÕ„q3ÝùËTDJXbÏŒª-¦NÑ…7$‹ï W΢+gö>ù5=z{U$w)œD–ÏÓçŸr–X9[üà¬\CËH –Á˜ˆ ¤R)ƒ’†™ êu[Õ`ä–·`÷vmr :vÇ×zÛ{ìVUä‹`Ë׀šØÝÊøÍÊX#kÞ)B)‚¤pJHMâ0’iÿŒ| ùÛ¿/å|‡ï¢ÝÁ£ºÝ(I‹”8õ[[ý` ›Û¡è@%÷¯*îF ýnel¤29쫤Þ+mjÒÚXït…n…Êbw±ÿƒ ¸¡ÿ½ M!ªŠÿ±â¨B$B#¸„–ÌÎd€Œ¬¯¯=kïøî±ú-««…åËWûq!%çÑ@£h¯¦¤§QùAôr ¤·Öø{¥àÞгí”7ö××ÄÓ“%Æì"CO“çâÄ&EB…O\~ægåïRêQã‡/jß«Ñö5ªú4½ ªK5ºîzS߆–H{·Ýšt—ê€öèûëÔ}!u_µ¬x¥Qe¿éU/m! AñiJJ’4NîBUƒ$Úßt}ìÄâd*“‰ÌÌÅréÄãÙä¶ÛHúÄ|–›šìüÏ7Np,B ”äóPÑ Jbô˜;—*™‰²Iûú1;n&ªÚªî·–,‹;Ç£úWü&œOk‘bŒu™¢WJ¥= ö•ˆm¾ÍMè×8ïZØ•ébg“v`&Ù›EDÐÂG)±Yˆ  pB)! KÄ–@‰*lóäŽ{–b†¹°n6n›Yó1[.¶eô™KØÖâÎåˆ5Ñ?M³€,?QÛ•˜ £qÌÇyÊSÁ„!í0öšD=(õÞWÆÕã2ûc©u’uŒ+\#2ç#Mù#¥{œu?VxÀd”uÉËfÞg®?d¥ž ‘sTâ˜P–gÔÓLù„È=.)OS¥£r÷¨¶|R^þ˜rÿqEd ß)¤ ZH+Q…#"BGJÈë­¥ù¸è ùb½q/´;òQãJJ»Uõ°¡ ac:jx’(ÍG—ªUé.9üœœäi !\´ÓÄà§¼šGœc!¥Í'¬éN}wµ‰¡á"‘@ÂÛ+%•¸èô~×§mŸ¾è¸Ÿ¬Ê'|O¢¦lLn^>bå,¹„d˜ðÆr|ܱeõÜáÚx„¨c1j¾¶ß®ðX1ÍÃp¾€8é£Öß‚žžÂ—ÎñsgyKo£óç¶ÝFVßgÞÜ[x«¨ð6–ýñ§’ N¤Aø2BŒña¢ÀçNá’6­÷/ÍwªÛ¾®J~UÁÝö‡oVqÿ…ï¹áJîsËH(þçàÑ}ñqOêw‹f/,  „k¸GÒ”´ bWñkúÐ}‰•ñïKù›uí7«Ãµ” ÂqFZÏ—¾ðоðíªÈ€·mЬIÔ$ÿQÍ]ó½ô®­^'–k R†‚»¡j©æãÚèW5ÇÿYÞv Å"›6²9×CñŸ3zZ²!¤ºzõjá)Àþú³öŽïkß6d©°\ê÷Èi™ŒO H×`{kÕýõ²ú+uÚËõ÷€ûúž†í¦¼¬/h¸ÐÄÈYŒ‡ëZ×j)3½QRm—ï÷GΕðZʵ¨´Ta¼è‰€.¥(zswüzaêF0ÙïŽ|iy5¥ÎÓR1*Â0LŽRÃB½jõí»¾;>8ü 4»äoøBú‚[q5¿ˆŸt”´ã0,ƒÐ`8¼¹Õñ=owüÿ×úÆ–FF†ˆP a”@œ™ ™þX­è(ö0·WëÎT*;ʹ® uÀÉŽwyåç%òÅ¡Ed¦R“åÔ^:H+2XOjOWH¿|622»Ÿ•?RyNg8ê»+5`ùépÀ’ÎSÓS4¢=]–s¦JßV¤ëŸ—1m%ªöÂÜž í{…t•  „D&%ÁITNA´Ä,Ó¿íN;˜¼9Æ”ºê—7¥ôNrž1Öu—qwØ1Ëâó‰üíÚkõ¦õ¤óáëÆÕ”yô ÓDRû0nOǬ› ûH±Úl[¯Ó>Hy7x÷Rƒ½³‚C%(EbÄIX”Ä$T†A"‘ˆdRˆË¤åB䥺ìŒ;IÏl£a&aX‰ÚWš\Ó ÆYÞ žG€ù˜€·+ÿqS:’ûàL ÛhÜS«%Y‘ P¡TjF…¿¥—~Ï®}¤¼ÿhõÁNkdñ¤>ý>ùV%k—âñƒ,˜ÔS€YÉŒï9 ú‹õ…\(øñå@í‚æÞ¢äe_ÃÕP¢·(u)?Ò_ØøÂØ¯9‡ ¤@ Â$*ÿ‰Ö%Ý%·ý°9<䫌ùÊ}(Lé2qt— ©ÕÙ¯„ãOÛåoìN xø‹…‰/‡Îú€ë’ÿ E®çƒ Ç-EZ r– %  äæOÐúÝ„ü-•÷ß¡è…Ý ç ëwZ# ®ù-)ùÞÿD#׃üW¡z+FJ¥„ &a»58¸ù‚bä±’<<öæ‚Bh ¦@Qy•FÕY¡é®Ò·–›NíÑŸÙ«î©f?/cÛ‹ŸFt]U–SRhD°É;2%V«5Uôq+%˜]²ìPŽ¢«TÞ]¤n+Ö´—¨ÛJ²»ÊUmeÚ¶rKç^ý'E;žgk¡±«RÛQ­h«VvíWwVgŸ)Ë ´ïÏ鮩*ºJtg+•'ü¸_NÃ9LÑ$I¢!³>bßáOo·ì¸F–£_ŸÛï¢B Ai:RÅhsx6Îl$œË¼u%꜊:×£9+ ]:V°]Õo!©Hz”˜3d¤L/ߨ3Þ?èX‹X5h› ž¯Ä=鄌lGŒ ±Ð|R±^ï™MØgšÙÕ¤ñ^£ïÚ¡Š9'|ú–"Õé*Õ8ï™–SÖµxö*¯[M:㮥ëo]MXfâæÙ¦m«ÞwëdvŸtæ0žÚå`S}P!]Ìôc¹~"Õ‡N @¹_@ùýÒ©×d󯣙~eª/ä÷ÁiððˆúâžÒͦbµŒQÈH%,Wà‚@j)Äj-çš·J[ “k+Ø¡–®!oèvûg_GWMË0Ç52\S>M•ǤÅE4MIõ_Z×;Â0çÛØ¹n)Z¤ÅÉ€±ù7wËX(77´"´p½™½áì*Ô÷J{h¨…ý«›ù~¾aÓÞº“B_*%i˜¦p'K9E„ZŠ4àÊM•ö÷ê;?^É]ÿu®y…½Á«­]Ÿ¸ÙÅÖHÁj \_Î~ÐÒÍÈd4‚½M湯bdff\2ÆGãát²7ëI߯G…ñdo!Ä¢lRbc\RÜ™šØ32âO&…Äø®½‡Ž’Ȝđ ”8ÛYy‡·Í ‹®‘I¾~°™– ÅZJÉȘ¶U¶»"Å;&·9ÄuŒµˆœ#Å7¦BöTМá­YÖ‘ínûÌßþᆦ6Õ™5UYW–µ=®ñ¤"`+¶æºMàðcl›-!X³Ak’/5Œ„l©žÔÞôW­­GdˆL‹ÉÁçAe„Á„ ©Ë.1ŽÏ5MO<ŽŸòV5ÞÕ9>Ó×ÝSYD…#ªv]ѸÞÖ8šiºŒ€±âq$&y¶VýÌžfj8hŽw.ŸïrÍq¥Ñ øs>àH³u¼qR°L uyÁ‘åì £ì‚T¿î¼Êm™ EŒT%ÃU§Öiø ªÐJ5­F—õšâœ'å7fys¾×ºÜêu^|¡l8Üøþ¦FMè :P§;êÖêáoÓ%ˆfÙVMý#â™ ×ÏtÙFÃŽÇ5ÿÓl-gޝ'‚”` ù¡]…cŦ6R2´ä‚@ÎZ:Õ‡¦ Ù~jºŸL½V’?gd¹~tº(¤‘©ŸS³ýÒ™ƒKrû$“¯3Ù>}æ9,M\27@ç~‚ÍBFõz–iI‰¾x R*œ+ ¬/¯¾ú˜}ýOð’—+”ª@—Ý]7ZÙkí@&Z^Ú ')Fܸî/{¡û•sC\U²l…‡k:.¶°÷]=7Ú{7ì@\r)§ç<[.wpC®î›.ö¶‡¿Þroµ …úÞlY¸Þèவ~ïÚd†H CÅ ˆ#†õÑ¡4¼bi?ïñÿ½cÛ­‘ ö¦'üySäjKèF›ð©+t¹¥ ²»nºC·=‡ËýnU9*“QГ乳çAô?²Çììì—ø?käË›‡ü[$óÇC(¤ÁI5Žhý¶SêÓžÅNíŠ7ž¯>µ±ü׫'ÖTÿv ýV»æ„Ï|d=õf‡éwKúP¡¶¨ô9ƒ18.— eRœU‹ ܪ«ü©¯îÌæªAŸñ¸÷‰óイâäjPX@R=ø<¸–ÿfƒ~¿W³¡’ÒBTB „’Ò E˜Âh'©ÅøêG/ŽE_ÎGFâ/ÅE~<.ÄGøñ{B*Ú›ŒïŠÅvEc; i$‘Ø’wÄ¢‘‰äîûÑñd·˜ì9÷‡P™& ©’¡P z°©ìÀ¢P› Õ,¶F¦C5‡ÔÀ“j„$!}£Nñ€3güY¿a2P=É™2a[š·-P$`ʱƑ®º­V”d¾IÊ%´ê´«òþÖá-mH¬14‹!sº§!®OEêİUܶ0€TØ<²Æνí‚x)Ai´Â0°á”̧`Þ•Û£Êæ/tŽ Mãã§¼DÚW9ïëêFF³H×'W‚qªuÈ N9+q„…Œ¤Q”40è{ßµ¤º¬IÖ2®ýùuÛÆu´?ý Pk%9ûÂÅU)®’Imd´»–¼¤*'¦È™!)ÉVR)ŠhÝÔÚëM“ µ"Ùµk-º8@4E‹Äµ¼[¶×2"Û’(ŠâªÕê“øÃ? ØÑGƒ!0œ÷æÎ½ç%Ú8ëJ±U)¶$Å™b~#B"ìXàÊÀE:ôÌú‰Ëf»Œ \éßÛ­åCˆ&JñKÔ“¯Wü¤9{ÜoM2Ö¹9ÅiÒaã cÙ£| ÍÃù¸NÎ'H!ÎiT˜r$¥IìC¯(Éš# AÇóÊ@ñÍÙÚÀb`±› ‰w9§C¶]4V”Q\k$V~.\ì&{‰ä(}\íCÒÃÐò0?Ý'XìgÓÈJþo±z<,Y"ýy‰ÞâlmI Æúá{á2Œâ8Ac”Á‘„ðÐØàåþÝü¢ºc²œÉÖUoV³_ÖønxØ‹À$îR%û†Ä„ Áƒ0L3Q¾Rî»â úd&‰Ä0Ä.Q|âa† LH Š¡$!Aˆ«Ê?ma¯7tN¸wª8À’ µ Þ¬ãnÜS¸äao×ÿÓ®%e«P‡a):¨q Z›G­{Î:÷Ÿ*ß÷~YSÐPñ–Æ}Ä\×­« ÈíUU‹Tógûvid¼²c¢:ø…Û÷SG#ޤ…`X˜ ?qÈ– ¶Î_›FoO±d#éeN^ŸâÑd¡òh“î·»egš^tË6Œ´éN´Fvë>n$O¸Uhµ¼»7·‚Ä{ìúÛtg÷¶˜z½²–åçj°<43Òůك­Úß·S¿k¢G½šSÛn§B{ò»à¬Û.ž€D7ºKyª^yÂ#mМ}Eù3]£ Å8*€Õ¨²€Ã(JêRÖþªñƒÛû©`t–‰ÍTžöD#oÎ>ìžžéŽ$²j$a"³]ñè‘™GÝóÑÎéÈÁk×{êÜ ”/¥HšÂ°V¹8tÇü¥ëê÷ܪ\¶ˆ3ÚÓ-e$8D˜Bóo0/†õ i†3§9C’Ó'Ø™&YÇZÐQ«ÊG¨BD€`T1çP­¿Z¶vð™÷ªÙbÙo^<äœ —Ͱ¥™@Ù:kIK#!]ŠÕ/p®¿µ»¼jEò´RÉpHN‘°ÇG°’$Y‘ìœ*rÎ*ÿ—n{;þ†Ç´x笸""uÌ(ìSJÛ¤ÒzOᘔ9çdÎ8]qY\Þ#R+ƒ1*—ˆ„Pò¹å·|¶(뎇œ©®Ò‡¡²%Ƹ²$ÙÒΜÛH@&–gÍ«%¿zºÓšô;Ö¶5¶úÓÝ.‘GÂ9ïÕKgƒžMŠãasÊW¶Ê9çC¶L¸$ÂT¦‚Ö[“[OåÂKB˜çó)1_ Ãs{½%÷BvðLwš×ü†ç•ÿ[ÐpJ„, ° Ø ˆD§éÊ.uB h)M 8úQ­zù¸dõ”>ÆOÿ’N ˆ—ðåA^ª/?5 ̦‘ÕãpºO’&ù ½9™^d­Zøvz@þYÜX’ ‘R’’“( Sy"‡ßÔ¹>wû.y¸/=k5 Ý³×½Ùkeࢗ½éå.T¾qÙËÝñtöêQ"aPH\ªï¯fîÕ>gÙ'Á1QÙžT(Ì%¡|–H$Èæ!Á©#”ñïÁ«u¡-\­f®Õ‡/ÖqÙÆ½Uø¯eîT3W]GMRc¸B„XLB Ga>Æ/”b°Š"D"@Ýa$…< ’ø÷t–íÒ˜ümOè†'ôWO‡ F„!Hq‘j~~~K#[*øÚòHÖÖÖžü,ùãés<D“ h*•º±võ‰Å™Þµõ£Íš‘FíÉfÝÙfÑI¯þÔ>×[qB #Šv«ù£W6ok,k5½ßªékRÿz¯ú½ÝÀ0êÑ&åXƒr¬Îtz·éãæmçÇÿ‡j¤ ‰~l$[1Ž4«O·HG½E'µgÚ´íÓ®¥Jp¼GD&§(\(‚Aæ"EͲ¶sûÿ|70=2{kz:ð0⛇¢‘Ðü$—M#ÑèÛ¦:âó?xø»÷?xÔu(\Žæ´¼Z-A\h7-t¹’!}< Ï„Ü/Z#‘péå€KQ˜³9Ô‡·-ôƒC–T§}!h™ ˜bŽx÷ι }>èˆqö5…]Z G!•ƒƒmŒQfºž[5žãÌ1Öœá,ö%Æ]»Ä™WÃÖùpÅ;µE Á`¹D –æ* Ʊ£¨ò_²Š)eå}™uZn–X•ÛÞŽ¿á1Qä¼+·OÉl¶)•}Re»_dû @±Ø|·È9—EÞÏä®’†…E„T†Q ŒD6©ø\›$Û£ãr6í7%ÖÍt;HæS&ìŒ3Ϭ‘EÖí\~պΓŒvîûüËé¦ât—=æ3¦9; H´KŸ—,LqÖ•ñ9¢òÅž’ɰ¾ÍH‹Q!ÆË¡)Ô=1oÇH³ùAH÷8hLtX×ýÖé úyå?XãÂÆ'`ÚÐIØZÀª#~Ór·i¨J/ ”ä©!%èó!j}YêýNæXþJ¯tñÑb??9Ÿ²i$1¸#Ñ—¿Ô­ö WÑÌ»ÐÌ1ñêûÎoC¦Øx>Œ€ö­Gá]¨ö|ÕÏë˜ñ—¹›•ÌD wµž»è \©ôem¬5Ü—C×<ÌxMǸÇÇþ“û53JC$*¢ðSõîº'ôÏZƦTQ,%…;p>΀Ð8ŽòÁYéo¬{ÿáé¸ÚØyÅí¿ù?òë=¦äŽø?ý£R¥KIbc¯wwv×ÏõÛø ¶›‡m0`¦!„ô’¨\ÀµÁK“ôN×VU{¹»ô.IS©­›Ë5ŠzÿT•z­t}%$W¯IH Æ€Hà.ÎRÕ¦¢R¤þ¸ÕOÖìÊÒ̬væûWøzyä"ä;M²^¿Ã¥ÁeÑ‹eÁ‘Êðhið·;¢:Šú:ÅBðù8`ºCuP…€°íG „r„â@‰DB¾€ñ¤(¶Yr®•F]ÌpYÔ/7áhá…ƒƒƒÐмddz¦ñÝ{…4MbX6¶E´*úë¥Ý>y¼¶Ï«ýÐ/éòHû*TÕÈ^)i4[É&HáÕiŒga¦‹ÏUSç«•½^e·WÛã3õú g+µ]•Šž*É€ßïÛt{<[}~8lùYo$ð Ôd‰ªÛoè©Ëéõ©}Ú.¯å—Õù=²žÜ&#_‹ ²Y‚I1¾³ùBŒ–™bÚ#îúôޡɹÓ3-É©æ…xlqâÐz™N|*ÎÌLµ%EÓé×/|´GˆfI ¶ó8Û~V®Y^‹~ý\«.¶/¬­‘éù“QÛ†ò0‚äPÐr²Nù¤‰€*ƒûáÚÞ84&ƒú¥Vc*¬¾P¥'Èìm¸H‚Š8ëæ>×t{ÎdÛ ÓH:fŸ ›fú¥áI w1ìˆwTü¾AW.Eôœo€›-!- ñjýXi‰ËK⢂iYÁ¥í6mº+·MÉ]q¾éqü¯ûH‘‚‡ÒüqYþ=ÚzOby ¶Æ%ùw„è“»Rë-9)vÄîŸJt2ÀÚŽ6%À0 pp ?þG#À‚·ªžØÐöú¡Fà|szªM§½¦ÓUÚ¿ì\­ §¾ÙÉ*¹_§†óæ¢l(%æ…¢Dñ¶þ¸ÿöøéÉ#³ñãóëidìad6yx6K&ZÇþñO‘˜ââÐ"dk£À#a¢ÅöyL1µ¶)9ÃFk$ÙjI…Mï´¨1JráÂÄØˆ]ĨUŽ2EsöÕ¨q5”wìñ¶ÂO÷êUÂW²ø$‰©ER¯e·:–:,Ë/NM‹MÆÔÛôë¹ñˆa1æ¼®>YcÓq¿w-€²l `Ae½%–$îi‘cLd¾«´>”ZS¢ü¤¼èŽ4ÿ®8ZîÞô8þŠ×4?/!)x$sLʓҢG4,û]¸ ΟØà“)¹}œÎýgNþg9ξ½^¤RóØ$Î¥y¸ðY$¿˜Fÿ²Ët?R˜<è„ I‡rW¢–4cNµæÍDrŸ;åc…©pAâ@^",KGôóGz¿i®M9Ò.v¤BÖU¦p.h†yòfÉ|P7V|Öê.¡I f¦®tœ‹PjœàÃuϹdÖ¥FëB»}¾É”x+ôÂꃷ–žZe÷.8/e·Wú7ߥ&ŒF>¶E†È‹d“(QI{Þ/=u=x;[šlZO#‰¹àää¡™©¶d"ú£ÃE4B\@PÛ””ôj0o)y0͇e+1Ëìk–¹vÝFk$4~Ê›;w›ÿÅ~µqßqÉC§;Ø€$´§v%´:è@Hè$YXF;v|`Œ¤]i>êv:™6“Në\Çu“¸3I]Œ±™ÚÓ‡´qÆã´MÓ´Û€/’ØÆ'˜CHÈ€þ©gÚ'˜x¦ÍÎovöA³»ÚùÿþßÏâ¢`s „„ l¼D¶K«øƒ'/º[û,lê©7¿íИ>qÀHfˆdXú§; ‰Pþ|£&²,×û€7*ˆUñ}Ö>ÚF+8Rî*Ž”ðAdób3$»$uŽ+œ‚AÊxGY4(³ÊŠC(3È;zĦÇÿçõ@nÈ1Ý•Yf[Ç„¶˜È1,¶ß[(ã£û©ã>U4$1‹õ£¤eB\§l¿A•Ň 2ŽfŠ˜Dr:ŠÖ$÷:&ýú)º ÉhãlA¤yÉéŸòÉSlIt§uü€}VÏíã̺§¾â§A[”Ö±…QÖ<ΔLÐÅãm*œÓ]—S,ÇB.ÎH‡WS”5OØj"ˆ'HBªåh {òŠYF¿\ë?Ô€3ÐÈ$kJ†Œã]‚6L°¦”_=ß ‹†KZ½zDˆH\ÆÃ5é«.ü$?~lMêÐËÉwÑè{èÄQôÙAéb™nY“x/ëâØgÈRg D1‰ AkêƒÊäYΗm¿\ÑpÕå¿ájºîZàÈÊ'}ÅÅtW†º*‚½¥ÌmGh±T?¸ç`/»|×Ê蛥¾® Á+öÆ{ÎðÖ<[–§pr ÌÕ`B)Ÿ‘@ÈIáyÇ®n×ÂÁã®–1Ÿ»û]Ì{ÅµàŸžuþðnö²Ó³œ]4ÐË›zžò`w™ÿª³ñR9Ýåaï:BWÊ«nVÐ7œ}ö]·*B×Ý¡¿Ûv8I‰„Çâ8£%ÙŠÛú+öÞ²Ó/J#à‹]wÑ}ÏMUÊVªtR‚ÄyŸÏ?wîÜ0Ž™™™oŸ" ÇìÜܳÙù¹ùú;.€…!C(™»PsÜ›sÖ•×¶Ay²œUí^MçFõ™Zò –ú\ù©ji»Wy¶N~z ÕV£èؤìx5¿cÉ÷Y6½tÖŠäý¶BÊ«?Q#ß_Y0ZEÂÂÇ(H"É$0 £^“×}PõqÿÛC;†"ì“èÇ÷LJ±¡æèЛƒÃááøñ‘Ÿ~~¡N„òÓ„ ÉÌÂ…—f tñæ’xÀdŒ)ÌG†XH·ÒÚoŠûr烅×ì[”ÂÌ JJIÅqŽeá(vdP(‚a‚‚¹ 2!D sޝW&ÂöÙ°vœÖGç’Õ,IÑÚ© Œ½ÃlÑØ^Ó[8(ùAAÄ/ŸcKþè-4’P:L H¹ˆËOÇÒ-÷ *¹EY'äöÇ ö0ÉK^xì~WËR#ë¨ÄþIa#‹¡Wˆ—Šˆ”#B7k±; ÎùsÕ= «ã¬a2dû÷2L2F ”ŸduÑfÝ㦂¥®Ãh8?rDXë¤O5éÓ.¬É&Ë'»4¹ÈË!Â/äðj¯T|×çiÊþUµç¾de^Ülކ¬£![Œ±M²Ú•îÓDSA2`m2Ì‹¶@€žCâYöÜôÄÅì/ÒâGàùw°g-ðØû¼™V*ÕB¤Zág­œ¹Ö̧‡áéÃèü¡ôoZL?ôð²‰ï¥^Q$#¸BŠ4ï#“÷’;x£‚YÀ²¦í'öz…¸ØÃ (.´[\ð'玛¥ 0F7 Gy€çZEsŸ3Ô¿¾éëRú«²`WÙî«®Æ>§¯Ïìr4Þv.®‘Eª¿8p³2ÜåòuWøz»:¿7o3ŠrDÐH6Ÿ_%S׸]ÊôV2]¿óκ¦‹ÎÆþò¦û¶Ð•ôgnÿµÊà?=+®À?P_9ü_Vѽ¶ÆNÃk|„/‚ ãõ­ÀÏD2ý_|K™ššZ¸š[¨ÁGE¤( JLwÌ£8ãѶoÌ=Y«ìذâ)Üæ¦ÎzÉNô”à'çLµòŒW{¢Z}zSîÕ­ùH’ÁBˆðHò¹ÒQÎ$ÏL²Ôçj:_U¶¹µ¿óÛªMmÕ…må‰òÜ6× ÓÈÉ ù^íi¯´½’j¯Òœz½ððÆ<¿Mœƒ!0‡"™$ÁG!’–­çæ‡ ¶~¶ýËûoFÑOâ“ÍOÂc‘}‰Q&:¼gt¤yè»Ù©äBi"B#éu 1 HtŸ-ÞdMÍ©  DQŒË6s-Vq?ØßL@É}Å«76¨øb(=C@‚LÀø8À¹Bd˜@‚. 2TóI+¼ö¸K2ö£õcÁÂÁzej¯m„^²šR´&ÎXbÍŽØCÜ—7Ý ŸaL£aU"¤æ+ûY±&¾Ïˆ(#2¸ ¯‡„')ËuåbÝ‘á aÝ“}§‘ÿ‘º+5Ý“ÊJ¿;’jMÇÁ¬cd±&½„ä\¨3Ï0æ©}Å1°xüꭇ̠¬56Çim„V'÷,½öèb>s,l™j2ÓÆÉfë7»­›¨WD‰â)á`t«³†¶Û¦ØÒT@õÀo>V&묵Ęâ)Fæ…(k +VºO£Œ2Þ\” X@ƒDº/v­S!«B’% DøèFhæ×Ää!äiKöü/Óâ-päæ(9š=ŒEŽ É÷åyÒˆ^ÊCÖRY„Œ/—q ,s­U(~ËPuÞãûGU¨·,Øc÷õ:}å ×€%Ë•¶×íZnÌá! îS}ºÞÙÍþÙ¸T·\(©ÿ¹¾â_ì×ëO[çðÿ`KJðíÜ/ÇÆW0¾`|Ńíp1Ä!—µY|lŸc.IªUÕÔh_ÖeiÖ¨jEmÀ(íÒôä­›"¥ÝÚÜ"$kX#r+I¹Ù‚¹îE‘¦}¥ É—Z^ù‹õ¼>çyŸç÷–É•8!„|»LÑZÿ\~@bÈûÚÓ Ä2êgBÞáPçuOëÕ J†Â¿ÄJÈa$Ç~ñ^™rµÙ½˜°ÌÄô€ Ù„ xøIÔ2Í–¦AQ1ƧÃfë0“0-FJf¢¦ WšN¸¦ØÒ¿í+%ùB\ ÎkäŸñ¨žD½¹NítÌ´Òf[j? ¬Ç-‹m²LÌæJ&Û ·úœÎ²Å“ À0g:Vº7.ÇÝoW©„È+ˆˆÆH™™ n¼)œ·pî=lí­¼ÜûŠ©·/ü‘—ûƒ|ýñúŸà/b¨×È#äùrH‰AjÒ!ˆLIáÇ ÖKžƒÃþÄp½Y­ˆn˜û@#€"¾ç¦‘ÿT°q¾ö–Ùßl¹ZÁÞñrÿv1`Ö–t(E0ŽàJÀ4è HŠ£*†‹D¯+]ßø¢×ƒì]o|ÔË|UÙô”wµŽV·_]¯f[ý:ÇqT c 蔩nÈ¿åM\²~³¸ª˜’ÊxR‚ÃBÞëž¡*îj;änúâWü[®‘«~𨙑JæÛòæ±`ûÕת± 0D"¦H¾øüB.—$X\ZY}1‰Vÿ/ÕÚF4ýú Ø’Á)„§:ê1ô7j»«åý! ]r˧³½»VÓ[«í©·ž¨ƒ¤´\J:Å2§ì•€ñ`Ò*%j•C$Ž!”„  ø0zÊù $úÞz}ÿ®Â0XÊôO6êöÆldOÕ©’õªþ½šÁW_–F R … zj‹RuÚÁzEªFy®ÚØÆëõçv•¾QI»¤"|Š`X©jA#„Y½µìÆÓÿjº?Ñ>?Ý97Ñ9;¸{3Ê(pþ(\±ƒÇ?a+αº4zŽ Pd!fZ²1 èrSqóVw¹,§Ê°æ9®l‘sf 8ÃãNßða“Uí’@R!Ÿ@ †¢üýFéÛ»œ¹Òɸc†ueŽxÀ­p¦E;ÕÏr›îÆiƼ|Ä–³ÓR§9s´hœµýsÛ!Ð0Òˆ4:]Š g Œc:÷´Ò7.sÜ—”NÑö'jç˜Êö=m›¡Ü/}ŒþÏ%~ C´ý]ú@ážTV~E;~G)äµV@JÁp™m²Â#žù×cœkUW”IX¦¸’Ù„Pv¡­h³uŒ±-É€f7T3Åè¿ÜoCqZ†æo“"8Âo+_ªæÙ¢É¸~ºË™m×ÌFm9Æ›‹š3q}&nKG]ξÕçtŽsÍ2†ÙvËSp}ˆ™æk&ÚÝ69‚á@-fâñi2{‚X=ÉÏžÄ×ßgN‰2§¡‘7$‡œÜ¡¦,O †±ΓìVÏ»ÃÃÀÖ;•#ÞÈÍrf¤" Lr£*6T¹áÛ~îyMÛËè­*öKoÓ÷¡ccžøoHtÉ×âWÉ„0OćH‰(!(b¸Ú‰q0Pv`0§¯õp·}ìHeìÛ@ÛfóÞ ¶_ ²×\-hý: ËÃø !¢‡ÄÝæÝñ÷]{Ô¥•a$‰ârB’‡ Á[o€”ßÔu\ö2c>nؽ鼛+‰ ˜keÍ£•ña_ìŒu7A``WbŒxuÿ¯V—Wž¡ ·¼üÂ4òì³²²²Á’µõ?¡H1 #rG4|ã™]©PQo=P¯ë ¦B[=…©jI_¨$Õ¤=ä‚ >`rH,ऀRñqJ ÂaXMÐb”ÀN!Õt×úà H4½!]_XU=›VSÁ@üSÍÇ5¦ÞzSßn]²A™ Óý{^–F”½õ…ý†Þ¡»Æž|_>YSœ é>mPöÕê>k4%÷iºÊ03‰ " ‡©X.Þ.$¤0ÞV¬ëŸùí½;š÷Äù‚Ž8£%K\ñÓvK–unZ#]®Å˜a1ºáŸiÆ0u|Òè°R±AþË~Æ6‘žqÿZU]-°s¶Çã‰øŒï8q|&qÈ tV°4±=_ ÛU+QmÛU¥Ò=TT퇢.‹ew¡jÅ—JÝvYuK€$h6„……$„8ÎE $ôM#õ»Q_­‘åÇã™÷ùÿ^ŒO$W!ØW¬gLY~[^:ÄÙÇçëü^ãúNíºÃ8Æî;\Åsѵ!u[éc]÷T® ÎuSeÿŽsŸLÑžÚê‚IlãØV –ÓDµJô¯·¼’îe¡ô¯™O¨Á™Ëºs)çS<ÿ÷“ÖG­æ¥´a!k½Õ/§´C­n3‰¨p©„Dé7»\Kq àúbÊ13޽SšKºgâeS‚5ŸHpçcŽ…ÄÓ´.¨FsiK®M®z6nYl³- eg_×)àª$„Rr²ø/­Ð“àÙ#/?þ@rÿ·ÈØ{Ô{»HŽE(§a crÑ<4þ{[-È÷¡€0è‹^õóÿð·\«J „… aT_8q%,€p¼ì‹oTÚ^ˆð7‚ÂÅP´/´Æž[Õmÿô·e*©T ~• Áu0¡‘bŒ,cÕ&Œ¢œ#R‡4Å–÷úø+Õ©á@¬àÖ¾ø5¿pÐìÃ)!‘âÎ’ÔaÏîŸé|.… ä‹[qH$'():jP²Œf©õVÆGÂ탕ü·ÁÔHUv³5Ò€Öz«b×€%ñ~_ìë o%å QÈä3Ó9 `@‘Ç««ÏR#ËËËk/«O¾øìs‰HLâ„BŒ";ã©f®#bèÞ¥îiÔuñOQ\O×Ù\öÇ}[¬¨âvUŠB.Q"” lY”BAR©ä1'böZB ÝM% €%À!%=MëUh_yg@ÕUm:Ù¤?^¯>Z[r¢QßÕ¨é®{^Ñt5©;êÀui»êÀ-àzvŸª—w׺êU]¶³œ7öìÖ}ÜÈì· ÅEJÈ\FbrSìbjH›1ÿøÌžï’¢E \"ÇH!Î4˜g²úù„åAʆÌ_ <°6ÒŽÙäÚq³§ÜRܳ”qç3ŽIÞ2µ/$Ü`êæÓ°ÓÌÇ-9Þ²q‡,¥J—â†å˜a–·N¤K§Ò–UÁú„7çxÓDÂ9÷Úw4c˜i_£×¾t"î}ßgÔ£¢­ÒW¤¢$åÛ0I‹\yƒsim£j×<îW{&X÷„Ì1FÛFåvU£*Ï÷Åžç£/jCêëV:FXû4㜥íwå¶Û,‰kTç<khŽ’Éq1$“ˆ4q1!ùÛëx›ù =SÍúé¬c2aË­¯B*—v-Ål‹)#¨Ù„y5¥›KØ~Rƒl‚š¤Ë4Xo,r7]:Ûæy Ø'%v°:¦†yÁ0Ÿ4çã¢`ÜìuºÒâ›j·Í ܃¬ù^ܼqó¦GiW»OE“$RÃfà‰_mY="}_qL *¸””@qb;)©Z´]…)ÞµúΣõ?ï­:x)Ð~9˜é &†CÂEì|8~>"\¨úC‰Áê’/ºQi{=œ¨h¨I\öG‡*â~þw¥´ ŒÄ$0!›”Æ£¾½ßT%‡ªÛ/ûø?˜ëU¡”1£òˆ¹xéš¿µÐ¾Ã~áݪ&z[‘JŒPA‹`?g’!(ŠÂàþ4ƒ˜A˜Ø­µŸt¾~¶*z¡6 s©2Ö[›<lí ò›­‘þpÅÏÿ;Ð2äûIªÓûåFwÁaôϧÏ,?|´úl²îŸu¬>^9°ÿ-@$šUòr§j´õ‰&cG£æX5×U¿Ù)¬ï®Õw4˜G¤Aš©`érFáã˜2Z£¦8ûÌê×,Ú7ÜÞRY«Ñ|´ùÿoÖ¿„8¨BûšOïaWgœ² bØVݯöO^}^ůUwÖë?Ý£ín,înМlPuïÔ}²Sûi³á³fó‰%à§šu]ͦª õº—d/#X‰RF’Œ"e…¦ÄHŠ 1„a:Dœ0pÚ@ O'óéµ7yÁ’OÙæ³N@‘ûQˆþÍžr“•¹¨i*©ŸÏZÀ˜åsiçÝ”é~zmë·˜:Òç£Ú™¸ü°|›ë^²r6åZ Ë|ÉRÊœOÚ§ÀÆ0S^pë¬õf‹nñíÐh,tÈÊÈ0h+†²&ƒvÀdÑŒeº¸ú–Òq›6ÏÉËÆ”ÞIÂv[áWyòLENî¹¥tÝPÚÇçsѵ!u“+¿L¢*›T:ïÉíàüyKS~UkŸS8¯3¾WE25±Ð6S°ÖOÁFLÃÙòÅvûœ`É's…kd&íXäÝÀ3³|I>í;‚•˜y¤ÝÛ`¦Ô[ÀÞ ¡Ñ-íe[Æ´“‚e&ã~À¯9|! Ö©ùaÔ8Ÿ0MgÌ Óf¯ÓE`­¸RK>mšnµL¶¹ÅLC|…-’a3‰ª'¾Ê¨ö¹·;X+‚$?"1RIQ2éöýÅÖ¯C±ë5ïœ $ÎWð×½™+ÌÅHf :ÕWÙr5œì¯ú#©°0P»Rg.פ6*m½ñ>ìÛHúš/6RÁª½Lн„‹}Û<øÉpÍÁë^á?žèˆ? â¸ÓóM“âíb•w˸¿×ì# Ÿ¿6ò9+Ba–RÈ!œÀpX,fˆ@.)eØ_˜ƒ_z[†Ã™þ²–‘úŸöúcƒUÉó¾ÖþÆ Ôˆ·`\Ä€?~1Ð:Œ÷…b}Uq`Â?YêP)L ˜Œ Þ|cï“ÿIdeeåY‚d½PPnjš"H‚HŠQÚØñ†¬Ûgêi`ÕÛ;ÿË~™Å´•qü½i+e/wõõа÷l¼³Ø–ÌL2Uðr7Se3£>TUÚŽÚªR“a1†d2}™Jm¥jÚQ£I!HH“É„[ ¸‡¡R«ª©”*UŠï_÷^{ô{Žïùþ¿OÓQŸoÞk VeBC1ÉÏC¶3G gލ†Þe¢ÙXeOÄÖÑô×*U5k‡Þ‘gõ½õ€Chš€*²Mÿ@š¡~OÏÉH‘ÇA8RQÆ H‰¸DäïDµçZʳͪ¾F]ßaSÏaÙóÙ˜ê|«álcå¯ë¥ƒ1â|CEƒn &j¨è«ÓŸò‹«U•ódbâA„@¹; “iùüûŒu-iÜNZgË ò› À"mÚ’´  Hž±ïu–[f´ ¿-±ÆʸÄX@a˜O™·(P…í$ØíÊÑÕ@kLÕ*í\¡Ì9Æö´Ã´AÛVºls´!G[ÖÓfäEÇÝî°ÒÖ‰º#Å<GˆÉ …¡ ýNîÌö9¡iV¼+‰Ü‘{¦Õ¦»rçCyõLYõ— ÷Wr÷¼Äµ u>Y÷ÝF_ë¥hVâ¹+u}©pÞRÚïÈm³2Ç‚Ô='v/‰\eUdÎÛånV$ƒ ‚‡H”%èAHf‹~áÇgÓÖ¯Ó–'¤e#í|7¼èw¸š6/uXÁ¾Ë±Æ9Ú3ŸrR–Öð Ýõ–MŒCž&÷*eXx·òYÚ‹;Ö×išIëÓö­¸;G9º\ù¤k¯÷é+ß"Ý‹]ž…”f›ÖåºËŒs™6m&@ÒÕ á"Aù\T.Sª±W!o@0!D•D± †«=Ç®D˜+æR09HÞ´O†N\ žöw9@ ¹ågÆ< “úf 5å%E^ ¥^–Û^а×}ô¸Ÿü,Òq3À|Qß-- £H _üÛ:êvýÉIWâZ€®M]¬OM“#µô”%*ú)¸ðûöðTMòEǽ GÔ)¥¯Œ‹„ !*ĸX„£ÁÇuUƒ¶·&=ôMu-D_ ÅGëÙÑu#ÄNUÅïøéaÿ‰ápüºoÏidÂOO™É ˆk4«£ÿHŽ…."PáC.<¨`— ^ŒäÁp϶ Ï Ù ¸@$Àp>Vz”°ýª¹<Û*ˆi†šµ} úÁ&y¦öe¹- ˆÿ(ýÙZÝO y˜šIZtjÀ'õ’lTÛÔdÂåÙ:u¶Aî˜u&Z™‰=/¾:Ó VÓÜì¶\ÙiÉÖé(2­ºl‹z ¬øä°ñ'­ ˆ@ ±‚‡óø5¬(‹1®¦Ý¨=׿9Ý\ÞÛbÊ4(²µšl›:Óèhÿ(å9ëÙÛlíi–o–% ¸áÂEB –—–¢˜„àãB¬´Y/¸ËÖm1îGÉŠMý“F@Ý÷¯Úëì÷²´™¶-$-_ÓŽuZ¿@ëVت<åX#•Ê=ÞáiÔ!%E uÊAq§€8A~Ob¿/uÌÈœËÜ»Úw£|­}Ô,@]Õ-µã‘Ä1-­ú™Píà—p…%•‡ ªäà“frÄ×q³®ëb(Õo=‚ó J à4…Gýéé*zÒG‡Éñ0ó7/=å'/FRŸ^‘
Aø>¼ìJ8 pÄ™ðS€šÀ ; /žKM“Aòr˜þ½§C&ÀŠ„°ÁÄ¥\­˜8­ñ8~¥Ž¸2UºáMLÉá`b8H*ø,”ø¡)ô¾Ê3ÚÐ=YÃŒ™ýZ·ö2»†ÁHˆàg† [Û›…­-¯ä·¹¹‘ßA’0Å0(ŠŠ@Íò÷¬¶ž6õ@‹¤? L\Ó[¯ÉDÙú½¦Ý…¨4iyжP„éù²_†lçZumå·(‡š€ÔC!•} êÞ:Ý@ôyñUýÑ]Ù0…Ýv}¶U h$Ó@«¢?¦9Ueš‘6-.`üÁâNžÆÄJÁ×ÿ8fø žˆ*9Ç–ÞÎeÅä=1íÐþãÇ¿©2Ó&ÏÆÔç›ôƒo?8\bb˜àq …!)Žãß=P+ã÷EM3´w1­Ï³Þõví6«^aTKŒeùÝš‡)k>aú§‘¹„y£ÛµÈ@^-ÐUHãLÚX ¬8j1‰¾ñ8 ±˜ƒóüƒ¤Ÿ«ªŠìÒp¢×(òZ3R÷ŠÐ¹$vL+÷UÞ»µ½R{¤¸´Ê¥(ÿBŒ¿c'âæ÷̳¤íq§m5a\'ûL\»B™¶ºÝk¤éE¿[@#€=æ:p^M[w™4îù–é4-¥*—ISŽqäÓ®'iû“4xÃt¶ Å%B‚r¡ï·w6Á±µ¾™E4²½½.Û…­Õ|EùßÙ¯×ߦÎ;àÿÀ´š8¶Ïýâûýn'¶cÇNœÄ—ÄvlçÆ: ŒÆ±Ïñ ­´©Ó$6í¦VšÐ¦m-àÄhQ·»h+… iH€²ŒÁh ‚CÈH!{¼H¼@ʤN ÖWGÏ9:>ÏóG¿Ï£  C<düiÈTìW”b2 „BÔi†CÊ_ýתçj‘•ÚÑ]v‚F(’GµÖá~õ¾°¾¸IUèWúÔùu>¦+vöhËEaU¬84”ÿ¸¢Ï÷I‹êီ3ÒŽéÞË¿6Jii¾ÏóÖÈ" _„щz£å%"jE6ŒDQŒéÕ•{UEÿºóã‰hнô¡°æ€_únL{x»ê;=ÀT4JærISÃ2)_Œ5›ê¹§6™ç·_sβ¦ÙAÃÌ7ì·Ó¶yÖq;çœO[Ÿi̽Ú|3®KYo§šn%LË9óíTãï7;,bƒk7¢0£bÅòËÏMi+pÈJÖ½>ÏÿB*B÷ ¡ã†Òõ™Ôö ^?#ò|¦é<*rúHœFk`’¬ƒi µ¿2±År·{&nZØé¼‘´Ì¤l 9÷­A ÉâWÄTý\ÖŽw3V c§³é5_/  È°Þ³ИI˜æS–yÖ8·C_É:oÅíŸ'MÒ¦™Íײ‹/5¾¢#Ìu0ÅC…‚S¢ H!„ýÚýõ nÊ—9áÙ>Ú:0Ù–¸Ðœ¼äbÖ«ªNµU1ÌŒµÄ§¼é|ŒOÔâŒÁ;U®ÉÎÐÅiïàxËÀ¹VælGf¬ d/¶ïþž¹K‹ q ¡PLa:íg&‚Ù _j¼5q¶­:Ð8Ó–\­ß‰|ÉéæÔ;®—ß÷$K¦[sS-Õ?~Üž¹ÐÌL´°ð þ؉IL Ì'qТ‰¨ùжà)ÿú¼±•óg(ˆ/Â)Á¥jõòÜ ‘åjžÆtsùáÒââÉ£Ç`*‚q’€p—D_êQcòRLUŒ 1s!¦*FÖ\#ú‘^Ë›ý"ƒa®8٤꓿Ó#*E´b†án0 S>¢ÍUùNÅpXZ ¯ZKÑj/åˆb(´r XbÜß§<œ0#ºBHZ ê~læQu¢3˜µ,g¡y„0$ÿ~D·/€!¨€ƒÈ„¨n¨_^K½Õq–|ëÎ'¢,DÕå°eȧ~Ë'Û×#h^Àkh.&ĵ Ã2.Î…PÇäPù2ãÄÇïÝ´ëk~˜¬¿‘4ÝÚe¿7 Yɳª‘”~~‡cf°”†;Yý]Vwt³ÛFñ7r…Jìåp”$öÆ›b÷5•­"p^“5­”¡Ç,yŽ“ÿçTh×ÇJÇ”Æ~]f¯lWEö«’¦9™÷´Øàµ—I€H8¨&|ZîôórÖý £¿¾«~mXfœà«û4®[ÌY¿èw 3Ÿ³¯P ä1NÖz½ÜM‚õÞ(r7k¯vÇš—2ÖûŒ©òŠíÁûlÎ0“Ò-&tŸnÓÿ¤U+ªE¤8ÂãðpRÆåSBR€sjÁî…‘½æÐ¤7}ÖŸð3WB¹)ÏÀX=X·ªz®==êíHµÅ/¶§O¶³aBÉ¡…_¦´ÇÌ”7uÞÇžkI^ô°SÍÉ“Í̃¿Qð0ìKO ðHDˆ£¿m|锟ïH¯çŒgðßô;éØú—ÎìoÜ?íbÎ7%.zR£>öJkö„'¾×ùªÜ¢C)”c(N‘4IHŒäâh KxÜ×õ-'üÉsÞuT\&¬0"D¡þî‹K÷–=%|¾ô°ŠŸGKßÚõRb‡¨:-ëVŒ‚Z¯,W‹¸~¨ PÖåå5׈|O€¶eõXD’‰õ½@D’‘¨êpLV J ~M¹C?Ò¥-w©KQM¹gµçëŠQð4C¹[3Ü¥ ëK1p Ú†ý}ªÃQ C¡K;”‚ºv k!'õq·uÿ&ŽWÀ•†ÿ2ª8ÖÉôb¾€”b’B¯t$l,ô¨„´ÅÀºóã‰è ÝÆ|ÐR ZKÝšÝͲÂù2.àmØ“ä³]¸J,ÁøŠ x$Ëy­Æk÷º•·›çrÆ9Vù(i¼—s¬PäÙÕÈâ€a.a¿n¸Ÿ6,¤­oG5&Drp)Àø¤pÃÆ}ÍyÛ%ÊqCî¾*׬€ä¹Fžä’ØqUéú«ÔzIb½®iº.o¼L[.‹­³’¶sB{a¨¸N"በÜ©‚/l7Uv9æ3Æù„€d&e»“¶ÿŠyìpm ‘ c^ëõ2ËX³Î cý.îtT/&- ËRÊR´Ì°õÿØiŽHÜ‚˜‘ ¶3 Š p±’¹´z Ì’$¨à.Zü^Û¶¿ùrçÛ’“ÞÁ=[“gýéu«ª^àf4ÀŽû“ÓžÔX;óMM3ØáÖ<')<Ò¶õï.äxg*ØöºÁ+¥I!Ž _äÍQ¨€¢ ¾¢ÓÐw¼-~&º˜ô¥@H¦VŸ×t+3êKüÙ?ÙU½ùýû§pæg ‘¨Êh%hðL>ðh ¼F’‡*ø$¾«áQ>Zû톎#ÎÍUud>舯×{;ïa÷:»9P-ص©xd:®BäéiXhä¾­ÁJá"!„×HjÌoFåå°¢V—»B4ù°n¸ZÊ•…®µÖˆ6d#pŒà’µ*ŸÔúƒ`ãÐ×èbXz(&=–½â’W=Ñ–cÊ·WÏc„€ `‰*ªš$ß+-5…0#ÝPH(fØÛÍ£êHIj)é«^>UÃ%9*¶Uup3ý];ÂGEͲCý‚¢Ï\ˆ™þÉ~½Å6up™´‡nZàŸûÕçØÇǗ؉cçâ[ßc'¹H¯¡ ¾; ·V+Õ´IÛÝ:*Z¶Œ8±C`<¬ª¦=míC¹BB -J!áÖ’¦t-;©BhTb*X•býeë\>ßùÿ¾l».*8?î‹e Y7Òd¥L;SÃcÅË”4Ça$Õn¶nMªwüTÜšb›íÅŒœ”czHÍKðÅ0eUb{[Ko¬·ßH—ßì.ÿÞñãþÄùxu>nø¬ÇôVPÒXÆr ‹¡EJbé€`¼@WžQU]Õ¹N³gµU ™ZÔÈbîæ¬h»&8gyç¾êceÕ´P=¥²žÑÙ/³® ‚岯ÞIñNA(œcìJÃã]µsÉ’‹ë-—£æ/bÖüÃÏ[ àp4(@ò84véꙈéæÝ%¥»€*¿®.Ÿ,™IWý}¥µ]/a Ci9+àÃÐ0¢ÅéU6÷ŽÞͯ'×Y5RT,§H^o*s½×õt÷FO5ö޹"Õ¦RçãMLÔ§úãÀºç]4bïÐ@rˆ'á¥K6˜\ƒéwÏ=#š’"0¼˜Ea¼Q†P`´[p†÷ïRä˜?1æ‰Nú“À!@#@&T?µßyßÕ5Wýl'ot’‹ã†SÂ0‰¢à˜§(½(þªrÅ_Ýk×%ÎzúÎyz>¬‰~PÛ=á‰jÜ&½‰º^ä1!P=D™Ìf€„Çd‘ÿ^éΉãG ü',ngumºl¸dÔ\X;Ô@2O…Ì#צŸŸùœŒP" „¡YÑ…%¸S÷y*ÓêØõ4ð€” jsàöÀï¿E# &Ê~ðmn—FJsMº¡6Ã@SÙpFXZù$Z¤b%JÃ8"¾ù|ùËA^êÆyRØÐìm‡}¦þpÉ@«vOáùqÿxöÅÝaMn%•¶#$Dá “2IQòëgÅIâ÷QéëŒ;7K[Öð¾*GyB g­Ät•ÿ×sΫ½Öë13È‚FòàMUp]<ìÛ5e¿ ^ìÜ;Ôjj‰©Tˆ ‚Š*b¥2ÚN\çøšK|õE¥õŒÚýM -jd1 U¶i®ò*g›j.‰Î%Çyµ˜ä´²ú²¦ö]u…·wŠ,NÁL)P%‚._ÍËH®­·oõÙoDÌŸ'óßlî]zaSðYÒr3]‘O˜¿LUæc@‘™îsIû©®Ê>›€“ä“#Q¢fÐ%ËP ê+Ù±v ²ioô¥¡øË}¡U*„»„Aì qŸ·ó¼¯Tê„?qÈÙ5éOªUx““ô„;vÈ·öOt,8ê· Uª@ˆ2A´ò¢aA $©€é’b”‘CJŠnW[†­“®äIoj} 0<˸'vÌðÆFÆÀÉ}±]wÌ:éí9S—øÄÛón8nTñË—-¥YV‹²¬ÃAÉ#H%¥è58÷8Vƒ[uGN„zŽû£5]àx4˜8Ô?| vu„ö»»ëy &—sFbäø‘±Ûs_?&|5÷ïÛù¿üi;¨`T‚:*…‘}&4_Ù™Ýp“n¤U34ßì ¾µFÐgÊô4Æ ¤€ r˜d Æ1€4Ç!Â<¬ög6K“1–†BÚ\øA矿ۻYÐøf¶×iÕÙ&íH£1Û$eÚJ[ ƒu¶QÿJ€•ãÅ " …‹œœRÐËIr)‡‚…VTR)•e^ÐæBú‘@u¦YÛ¿‚ßýÃw–á°ð,³š*ÁébT‹r”R­òso­×¿û“èΘúw½e¯o¶Å/µ( "G`"F2„&h”A?ÚhÓÏFË4Þ‡ )80*·ÆK)ËaÉDAeàÑpÙr ¥z—sœ|€ÓêŠ)Éþ)í»¦¨¿·†5²3ªŠ)•õ’ÒqApœVÙO¨œ'ÅZ)…uZ´}$:#O“„0² €d¥á‰kLséšk]e³=UùxÙÿ7{ï]q kð‘k¤×2›2þ"fº1ç×ÕŠäìKyžca¹„â,BâNØUÐljy¾¿çÕ\bËߺ^y§óçoG1~Õ¡,Q ˜‚fIH¾Ñì;JöDú'ë×ñ$ Õª‡}É oâxmä°?2鋆=ëë}ÕÙ@AÑ Sã8C³Lp('1ä‹båÛµk&k'úxç3æ'Ò÷ÄAÆ]Ñ1ðhÞØ·hä¤gý_j01Yð%Û¤òR”ˆàT)­J•ù†Ý/ð'&ýIÐûã¾èIW÷1O×hýÚÑ@ôh0~Ä—;UW˜A»{ÿ±ƒ¡Ä†r·€ÃP2äm¸9wçñ`äÎW_Ïݹ Õ+9Æ#üoë5Cõº=õ¹fã®°)׬Ì5»ÃÆÁFC¦¨FZ ™6v³C D0Áq\F³:H!,cK`DQ¾EoÞÕ¢ÚÔîiÖ÷·>èüÆL8¹4èSï Š{WTüùé–Ë a:tÆ->ó®6iwX ¨s’Á`ùP“©…D„S“bii)Ôr ÈùÞŸX^k(zJ9ؤi‘†æy&fC…R‡6´€ÑÛRïn³Íæl+FU6¬ôèG:”q—©˜ddH‘ŠÀÕ”ö͸z{êF»£—í¬Ç´<Á<‚qø`(Vòm~ã'‰Ú|Ú~=e½™²ÝˆZnÅ+nõêf¥3qûõdÝõ„m~+—šßUJŸ'«g"¦kió§ÉR°³Ë'­³IÛl´âˈmÿS5&F šPã0\AÿP: ^s‹ù^gZUs…µ^VTŸ­ÓJçØ¯ÓØ&Ò3À¿*UZu%ZœØžÏáû¾í8NlÇ6Iì8‡ØÉ’m8¶l{Æã¶ÒV«©•ºU«R²¢P6‡¯$ ZèvU»UUQRBB íî–­Jr $ýBþ¬Võ?" ‰Ñ«Ņ̃o^>û{ßg¦EÎ.¾áü€ …lŒðk´ÈýúÍ„c!bý†6¯“æG1Ë2mY¥Ìë†'ããÖ۱’Bí—eÚ°ðØBÎZ´l™çø)_ œ‹¤i‰V,%$‹É’O›^±€Ác!Œ¡‚( a{•ÿLû»ç#=g#dž©c9ºg¸³ë\[×0y´÷E0ØBƒ¹¸✫iŸ¨‰ýÛùªš¾ìÉÛµ e\ >l¥|‚ƒÉŠaPó”â¨Ö“oþ„‡,¹âŠÌÔÅ@€ p óÍ–¸î¢n¸·¹Ø;Qæ 1ˆ ÃyÛ^ðàÕZ8mÊEÍTÑ׫c—ê—èÏÝíã^ê’7|ÓÑ1o'ÿ^G^öP׫H –)OÈçJUçlm|ÚÙù…‹Þéõ¹QM×F/X÷‰JÀÁkìU›ØØØxöìÙö8?}úôÅsdcóîÝ;b>f01Œêð’VuλãI´™ z¸QšöªS>Mʧ΅Äçštg\¦¬_“ ©šKÿЪìªá¤˜è5†G &KÀ,íöêGZd©Z]& O…òåW 5>O[¯Ëx§•¤ƒE°ôEB&Îf‹Ù˜•'ï(7œê†ßTfBòþ}æ ìg•‚ #vA‚ÝÁÀäÒdqæhRÍ’T@• ª†¼ºl£2½ãë“W#Y¿1Ð 5*‡Câ´Ï˜iÒ¦ý²‘€*ãÓþ¾é‡r¦ã QÐBÞéS'óiDý~D{úÕo(ÞÞ*H€#Œ"‚ qœÀ‹THþÐ.D5K‡Õ ýfÄv7ìXIV¬&KQíƒhÙ*i]%Mkq]¡ªëbÔ¸FÛ—¢ÖGG,k¤áeº·n$ìiuh„ßS3x0Ÿ c˜õ©°lV¹§àíìU¼ÔñYåm¾u^4R¾ ´¯]Ù»y ÌÁ‚Å£NǾþ–y3þ懑òEªì>@r¶³œ¬P[x.Ô~ù&fXéÔ/¦{Ië}`Òô,] ›Ö% ¤úéá=ã­¶}z ‹©f¢ ð`Tá~cÅ/ßN¤’½©Ž÷F#GÏEŽåÈ£úpÈÇácg©žÂïÖ­80|-î®ySú‹Š0h¬çÇw¢ÇR@ƒÃÂ8ƒ+9nmºèŠþÃÏ7²†$˜¨O¹I[žèdþüc>z̹VK–ÜðÄfÝ—ñi7rÙÙÑWâkiÄš6ƒãw¶æ«.jÞœØÓ6VÓ6]Ù1ìQ«!/»ÂÀ<€4[i]$ÐÈdU$Ùéõ”ºZÿ›‡r`"6Žðq®„+˜Ÿ»½…mìÜñìÉÓ‘?]@ŠX"—¢(áUÓ­Ò¡ºo¬>ÐO%9Ÿ"ãÓ ô™fez/ÿÃFKP~ºA1ÚÂË…#!õ·d$¤üÈ/ŽÛQ¯äGn´üä›òL³,Õ`)Ò¼ÉU¿!0úÍ}AfƒŒ…±»pœÅÇY<.çÁˆ@ˆ=2e·[›Ýoî9úßêà÷û?wŠzª3M¦ì~Cz/”¦Õ¹fÀ'íOŸ€·*”F¹&í`°$Rgƒ’Tƒ>T¦}’Q¿nôÇ‚ý šì.&0„ñe"ÉqJ}"žO#â“qÁo#‚¾¨ìTRÑuPä.'ø±!Lˆq&RÌFŠ™“Lk1ó\Lÿ¶>¢ÊtW(ýò‘’•w@‰+{¶ªº®Óå·¢Æ1;x‡¹vÍZ¢ôQ¢òÏ­Z­¤˜2^GÙ*6W°?Wì¹%´þWh,x;{/uÜ”WΉì·Ä–¯äesâ²Ç<'É´ÈFù¨ƒqP ¼ÅÀX¤,Ë ËCʲµ,'+îÇ-'‹¤ `=^Z¨ý²©öX¥´+´énÂv‡¶= J6iÝjÔðu»£×­ál‚É“¡ò"R,Få0Q%Õw‡ ÇzG:ºÎFŽ}œüÅ`ç{ç#=¹HwŠêÎÑ=çÈ0žMôöîí€ ˆ‹â K`ä‚ëí+ µUE.Õ„ ÎïÄgÎ6;ƒãáËÎÚZÇíí—Ü‘ñÚè¿<‰¼qE¦=Ño€ÛÉm$ü¿Ø¦Ëõz¦šœ²·Ïº¢ÿtÓSÎŽ/]ÉSæ Cð‹™ ‚`Â,~1[Žïëfݱ-ÔÓ“®Î1Oçl%9Q«%'êiêš‹°®<‡ÊN¯xí«µ±+u4%*eà,Œ‹1w}rþ“  pþ6H¶_ä±±y0A aL†ÄÿÔ¥hVçíò/*tÙЈ8Ý ¬S¥Cå£?)=ÑRÒíż*ØH0Õää+(³ª¯ž?X\aɼahVõy#‡ÔCM¢\P–óë>lÈ—_:Ð`i2ðô×–¾eøu“²³r—ãa£8L ^-&LóÄ,¼]/ÿU&Õ¢n–žmR}2ŒåCõâT@’ Š€œÊ~¯.Pgw|}òj$Û¢ é†Bš”O™õƒ_J:T/Ïúµ§Z!ñn1N@c!Ú¶Þ•ö%óiDâôaé1€ùÉ„jÄLJƒÏ=A(·ÁQ|xèN¬òI§æaÔ´,_ˆ›šuR»L•ÏEì…ª®k–{G K´a5bYOØ7Hóø>³÷Ú÷¶˜ñînöëŸÉªç‰Š»¢²›Š’‚·³WñRÇ×òÊy±c^jûRe™••,í`dFfóP;¬ÿ±_ï±M]wÀÿ4uò°}ß÷Ú×öõûljÛ8¶;àGœЭ‚øq}8´S«láÑM­x•è¦&vìÄ °­Óþë?ÓÖv „4ÀJ[] ÍBH °A·‡‰?Ü¿ˆ,$®¾²Î=ºçùØ÷ü>—!Š`޲æVÄz7Z¹)[f w»«âU ±ê]¶ûS¡ž—²uwºíwØÊºï¸Š¥DÕgžç¬¿uWmá<¾ˆ•‚Úƒ¡j„¢hØ<ys¼ûWÙݽ†÷ŸíìK·¿y:ñëß…öŽFú€F2\Ž%*gc’¡Þ†2 A†à8üSUÅåºè'>nÖÍœOeÖ×saãîIwôœ7vÉý¢!h1áØwˆ#<]ù?E·y5ò¹+ò™+’cÉæØùÆèĖؤ—K5´W`4E/ÑpÉ(!€%„P+2û@õ¿ÜÓÈyWèe¶±k¾XÏÎ8³õìT}ôŠL5ÆÖz}€|Àtu¡¡Šf„Dq6Rxøðá“<{ЬÊJ£¥ÄÄ£Ö™OýDŸlÕ5¯uUU&}š¡-†tTRíø+Æã­T@0<‚ËJI¡å8‰ò`LØu#;ª“¯Ê=²1¿âtP5èW§ZdÙÅH“)åÏwc¦M7Üêµr,FI‡|ºZ-C?6íó-JH X ˆÁc" B˜¶ËÔl­öd›2»•InÖg¼ªl³&Ô§ƒ€"ÚT@ŸmUfšdé¼ó®ùº¥·jÓmúT“6éÍQ$ãS y+R­ä3…óÁ ø))­B”a^ÿ豚Ã,s"¢;&Qos db&i’„¥4„¨1Šð“>ßs±Ç²VÝìkžW^·jw]Š™tå œá?í•_F=nÉz d"M‰@ Ãýâò›Œë¾Ðþ¥Êz]e-x9{‘ç:×ä5·Ä¶y©í†:’/”U7äÕ7äÖ9©å[yínXa0C‰éRZ,ÄöXDó\õýžªåNùJLs/ažg«îÆ-Ë¡‚id!®½×Qö0j[‰›—£º%Öò§í–VÊ'R˜”0Aò!¾€$DÛjêÿ¸ëµl÷[#±}éhßH¤ðcŒÝ7Û§C}ÙèÞt,—Lè@#gÂ{ÏDö½»#j«ÆId|è#gÇÇÑ‹ÎHÁùñTfì!€éF”þÏ\¡}‘¿¹;çkØ|×L9Ã9±¬4À)èÌ;…'6½%þiC8 䜳sÒºäá|«~= ÀF£S,`JaL½ •@(´Ul˜ðÄ/9"`,¸3Ò¤# N¯8¢—ë"3®(pȧîð…†ïSÐ3‹+¾ã´3ú‰#¬Ä‰R‹hƒRóèÑ£'y’gN‘™ÙÃA £a~© 3ï(Kµ¨RÞ5/¬ÙÓ ¯b8À¤ýº‘WÔÝvB 7ÿ)ŠIôG%´@P¬çYwjNn'jýPP›ò©ÇšDÃͨÈ-º‘@¾û«‡|€š´_9ì• o6þ¾UŸõª“ ÆT£1é7öÔ=µDD€ƒ÷)!„,‚¦‹ ¾XÌ7õê·ëU#A0\“ôê“>€EFƒÒ”W‘Î;ïZHL7Ú¦Ot)¯jÔÏ ûÊ“mÖÞ Æh’@pÁ4í^úxXt²K9ðó|QIOu1ïw—›Þa•‡£¢1ê§=¶§â@Xês  XÅC Bj1˜ïe³-•‹{œK¬n!ªXI˜ÃúBí®‹ íÝðÆåˆu%¦»ÝÔÄ ¨DÊ´´”A¼wÕesR;(ß(êæ%µ×$–‚—³y®sM±qNb[[Hæä¶¯ pÈ7âÜÿj ·îh”1EI‹×¯£©¡-²¯u{Ìÿ©î²†ùhÅmÎR¨‡仨vå5ýbLµÒi™i÷D7©%ðz•¡Pìÿ0¿DˆÂ®jë;Û"¶ïM®2`#§‘î™®ýÉPoº³÷txo6ôK “ìjÀgØýã¡>Ð?ÎVÚ>†ã(Ç:õ¶I7{Þ*8?ž Ÿ=¡™öóºð„½}jsô¢—û«»#¯^\¹ œHà4×™çú G'øœv³3€%õQ Ÿ¿;Ù˵a¼œ FPáAKóG®pÈPCK…°ÒBÄhíÏÎÕå^±GÀØ+öœ76Y™us?çÝ`Ð?k_sL»#S`ÞÆ®)ë£T|â8¡W¯^} †ÇY£ã½Ç%I#Bæ¡»LòÁæòTP› ®uUUŒ4U&å)¿4ÛdúM^+Bà‚ʼâÎO0D^m×ëú<ˆ—“ÉU™N Ù öL“f$ ô«R~mÆŸïþ@ê4àJsYº@B=¸Yôh2̸W• ¨Ò>u*X>´Ý|0¨Ú^ŽkzŸÆ ¼–ab%%"J^"ì˜|°ÌeÈ4• Ê€L2MÒU§™2­…Òˆ!Ù¬+à׎xå¯<´}°ƒÙedPœa4F•êÓ1VÜß!à˜#‰|!NÅäýœú½ÕÓ¸n [ÛßÅ pšþ(},¡9Ù«}ãUÔj&!p’¤ÖQ¸†0*Þe$ÿ²ÓzoOímÎ|³»`ìB\'a]n¯^ènd­B ƒJx‰âeä Äx¼ÉJÌ7”à›hÕ‚ÆYðrö"Ïuæä–9Æ @ˆ;ÇÔüCºé&mýVd½%·ÍØnÒ¶:Wð6È1èeJa†×qënu;ÿ¯ük\NØnsUË\U¡ž—¹=ÖÅPùW‡üú 1F•Ð ®@ T mñ!“ª²'°3ÛùÆ8×›äöž½ý‡Ø[ÿc¿Î›¼ï8€ÿ41rÙ~.?ޝÇ÷DZçÄNâ#>b;Ç ŒÁºØ~.Ûa¥ÚÔBR¨èÆ´Ò6¤ ¥ÛqºMýe¿¬ÒÆX9BŠÇP c-Ò$†B`_ƒ„*¶ü MÅzËú>ü|žGßÇÏ÷óz€4R‘í‰ðëi¦{4º d”ꢺ†én0£s‹½•&wdèî1zç{›:µ|1qE,,*8bÛ4錭:?žÊ%Gì„5tÆFžsF?³GNׇ&ô_<˫ɖÀ„;z¬1 Ovþל¯§ÏÙ¨‹ìYyºæç$“®(pE£Ê Q„„ô5ŸÙ£_º¶}ê¤Zp%ÊÇ c ÖãNzÒÁwG}ÌŸ¼äîʦê–qON# äiG®ø…æyÏÏ„ƒœx¤©Ó6²Kkƒø< ‚¤¿§§ç?)²´´ôl5²©c ÎãóŽö·Aõp[i§M>÷®*MùÊ“õ [4â/ïiáÿGiã:uºMµ§‚ó0W±Õ©Œ5âh‘€Ë/²‰«ü(˜rk?r*GÚc­% ïrõUi¯*íäP´”¦7(üš‘viƯ9Ø¢O·jÒÍʤ 4t€ "Ý"Êü˜ße:(ÆÁÍ8O k›&±A–r«’Ía8„Hùä©f@‘’þ¦ÕÒˆ1T$ݲ”K3ì&Rne¦½¦ãÌk‰BDñÕnñŠˆö‡Õ{eßkËiDÝ×)ée…°’ýqñ‡q0õ°%=q¸·“è¡4ïv({iULó!z©<ãóQ A‹1œÏáàÂVåE²æU²Z«ëõxÕ=J±³¼]¥òæI„„¡›0ÅyMS3OÉ—•¦kÊš*ª¯‰Í«ÞÎ^äÿ:S ÉyõYí…õ²Âú•Üú/¢îª¸úkyí qÔÔ6®(kæƒ÷H\ÍAóyb;ŸóçVÓSu;b˜‹Y®ÓÆlçªi$)nÖ»å8VÁ‚ò` O€ ¤?k  o;Bîì í"w F• oÏt¼ñ1½ó÷Ì.0›'ª+}€d„ì#»“¡×Gâo¦¶§Øî¡H×DZÝ6£E€¢ó óh]å¤mõùñTÆ­‘ËέgíìɆHÎ 4èõ—¿Îì4pË'æv0˜x´s¹ßŸrÒ§I ³væLÚ:Øw1ëE¥ÊG!«_÷y{©"tÊÏìÁ`œ‹aՈ䄃=e ý®¼i³DG”vˆõŸzÈÉF¨æt}$WóyÏ—ƒmÂE y”ÃApÁËW1èS§¹¤üÚ¡`Î'Éf]* È4›v7ÉBÕ’_·ÊÆ^‘%}†¤]“®Žzõ‡<ºƒ”*“E?RæöµjFZWKËÏçËúýy¦Eq¸Iž´×¥Ö˨: n 7á”ð;êax‡l•÷°Ëid¹H?ˆŠzh¢?.ëûX]ßVåžH>ë‰aáⰇŊsyyu"h¯·q1Tz‡©˜a-ß²¦›¬îVL—í4MG-Wã†[Qã]Æ´@ç¨ÒéxÅtgÕÍXÕJWÑyº6Ûi™Š™o1Õ³”éÞÖÒ©ˆf&Ú0Çj¦·Uîw˜eˆHÄÅ!š³+^õ¶õ"ß«dñêoˆª(-W%³Ò†ODåVˆ»V¯*è\C\[25×)m–Ñ,FË¿e3Ѳ™NóM¦l&jÎÆ*À¿zžµ¬ô¹¸KëÁÕ%«g#µYºö6]~›)é ³Tù,£]ˆigcå7âõ×YëÕ ÚFY ÚÂ0L 3ɸ˜ßbM¼òK€Šaº{”Ý9¼ ¼6Wšd´;ÁvíÝ-.„@}‚”°àÞØÕ‘cMÔd}äLcè¸+rÁJ³GÏÔ³«Î’§rÎ=Ù÷2ŸÛBëÉK6f¢žwÆþhÙDjk,0^ÃÊqþ1/uÁw„VZ¿»Ô (RŒó-â+ûkÇêÃã.ê¨m³ ÌVOŽ õR Š9`yÅD<´HŒéÖrG\¡óÞm“V é„3rÊóÜçáÒ:fÜNŸpÑ“ö¸*ƒp1BpÇøwç€.=xÂ’'8Yégéq––žTùÛ_òa¸˜‡ñpL`%ʵ*†\úA¯òÙiD=èÖ¥š5éfUÒ 0P’ ê“]¢Ù0è¥Ú†!Ÿîm{^Q>¸#r²¶d° 6 L¸Ñ¿ø@3/p„\'fêo'Ò}Ú¯O¸di"(;ܾìyQD9èyL0Èi$Õ®Úl’Š*à©aY›^»Ç#8²Ñ8Ð¥)§"í3¥^.}ß[žnCGì«Î§¢úÈ«;²Q“ð+Gýe™ ±/PdFa…!@m‡(BÖê÷Ť=Œ¬weQôå’£H_Lò>­ézs á¿»E¨àÅÜ|ž*0¤xíKÁšš’‘¶ò{±ú{ÚRŸ}Õrƒ5ÜcËYËmšbMÀ!Ù˜ež4χMwÉ¿ÎQ•×:Jæ@ªd>j¾N–Þ}µæNX;jú{s¥Fºâ®ÂŠ¢6WÔ¯z{z‘ïU.5ßHknˆ+¿$*¾PÕ}­l”Tjá<„/qHœ¿¶àf)Û¸aºÓ4C²1ó4e˜aŒ9ŠtZfYóTØ@²ÒçâvØŽšù7ûuþÜÄyÆü?è àK{¼{iu®,iuÛ’ïK²-_ÂG „’†ÛZíJ¶$3-á(m“¶i8†”L|ÉÆÒhki&“š›33mJ C ¾Àƃû¦™–L™1…qg@ó•F3zvõÎû¾ÏçmÏÛž7×á™–ìa÷t¬ðúv/”–3¯JÎ[1ç×Mö=¹ŽAz–gÍ3£"´)D™%ãõÚ—º;öEÃo|‡ŠÇÖH⇑]‡›^«´g‘8±4›Š¿ê ž È£åòÙ@øt0|²¬õBIä|‰|*ð§‘±¼-çK•±2ùl¹òi…Ü›¿Nræûh:ä¦Ç¦AZÎyñb¡2Z*/·þ‰âÍFŒ`TP†*ÜýËâí;K A<&BÒÈÒ}Àuqqœó«·~I°‡"1cs®³§NŒÅžJa áIuÏôx5PÄ é®{ªœñØWe׈=AÛÑŠéåæÁÕz\P1©ž¹)?Iƒ­Ö¤º£ù®Î°1ÓFkÁs’Ëña£q°Î1°ÖÑ OXeˆ×Øúê¡à‡ÐSW+È$¾ÖÚ²Ôù®OÍã0ã†W1cĬTcƒ3cw0ÿp½µ»BýQHßÌì ‡‚+·"ö×Õ ‡ƒæa@]­®=±©jšƒ L‰÷Û ˆa|¿ÝòŽÌw)ËÖHg0#tÅ€%àÃ~@b;Ø¡9ÖБ¾»I—뙩bIéUi$ÎR\Ú&7=ú£ÂÅŽâùfû¢”1!y¦Ú2&eì7ÂÞy9g!š=¯øæ”eïºàÉHÖBÔ»([gÂö ¥p¢5c)fùǦR¿ ‘(‰¢Sà¼ç¥™Ïù¬i­ÅÛÓó Ÿ–ê\(‘G É®4?¾¯…‘2帿©Vp³©*‚§çHþ‚–ã :­d-ˆûÖR½Túê˜_yŒ[´X½Œ*HÃ޼`Á1’&‘…k)T¨6vX †r_­hÿ8 «Úv¾<6Z>[Õ6R>]®Œ•„Ÿö8Œ€CÊäSélqx¬L9Q¼YM I1½¶&” È“ÐÈÝû¹wÿõà››374êÌ€ñ´™°}°ÞÚWíŽW‹}ÕOP#àsuzw…ëØ ¦þ*#äHµº¿„ ôÖ{j„#AÛpcG%²(-I³$ÎS$¼'0ϯ"(ie—£¿1}°çì­±Õ™j€:ÿí¾â`\"ð(bé­y ó±å·5νՆ^ÒŠ©QKa«‚JfXZK¥!:k½Ã~äeÃÑ[oõÊóã?£‚ Ã!gO£ãÇ•¤£Hħј Þl6Œµñ‡¢úw% …¾ky˜$àŠq¿ 1l{PÓø^›ñ€bݱ¾ÓjéT,¿–õ*‘Τ[MrZ-œt)ÇUNuRWP¼ ,µdÂ~ ¹sÏ·ûæ•Ìi9c¼}Ù»îḏ ¹n6»'¢9`››[,¯ßÊ£~€#"HéqÍ~ä˜5ÿÕ”õµÞ»âíéyž©üݘ7¡Î×çüMð}cðMr®ò¾k|Ö—bÙK˜G8Á14ÒjñU¿R|»Å7†Y ™‹xa€€"×åe+}VrOµˆ7×\GæDÄ9)¹Ú²ïD½§š\1gÂ(ŽæYÄ$64’䘤 à~ëåX|ëÞxdç`ø²_§ÁMœgÀûµ¶Óba[×îê^Ý·laÉÂò¥Ë¶l É&Ê[»ZI6&†Ží2”¤MƒÁÆ\G—Ò0C§ýЙÒvÆ1 ¾Àæ0”0iá´¹J ¤LÃ0t’©(Œ;;ÿygWÒ¾ûî®vŸß›´öSÉPÇÕñˆ°þøfz¡:bT{2²ñPcÇþ!"f`lfçÉ~ï|â Ž8ÉI[`Â8å)›~<‘Ó%Á‘ЦNC•ˆÆä2Ø_›Á²Šd¡ëÁ¢åC¶ÆS¥ÔIg舋8a NØÉô«<Ñg_!ð1>þb¸/@6†Ñhv¡¢}‘ëWE+GìÔ”-|Ì<î ÙÈq 9ZÒ09‚§Jƒg¬Ï]#p§  Á\ÔŸ”á³L .¾{çï÷ÿyï¤,÷<¸ÿU'Ûá¡ÙLŸÍabÙ¼ ™6V¯ˆWé^u«ˆ}m•O7 mŸOu«“~°‡6Y«‰ùuÑZPŠîÃeòè° |[X¡ e˜"VÎæj²:Œ‹)äruÚÜÞ2EÌ+‹{• 6î¨â­*éý†C+c^pÈ#Š€ôq¿2jËéó©µx_(^#{Û¡ª×ò¥YbƒŽ±$\‹µ`Q[¥$¶D-ÓÅ\óÎ'"I”«n8#Ýžz™MÁÄà™ÇP*©³Kv6?@Üí¤¦+¥ˆt)r({šU=Í’Tv¤(";)hÕÝaé6RÐÄ÷´(:›T V•‰Îf™˜ˆ/æCˤ˹ JäŒß-5þp=;á |Ð_ çÞ ™ùé¾uo4çܦôw#ÖËÁ‚›M–ÙK¯G­g.ò$ ÙLœ!ø G÷…|ñ ±é‚¢âœÒ0ïåée^¨|.µ~ÁËŸÅ‹ÎJÍJÓUYá /ÿ´Ì|Ad›9°ÑQ—±-—`§W›fš oDÏ’&Éݰåi¥Ï¤¯ô{óUÂr-\ÕmB~÷õüÑ mK‰ZÃUqé ü ;E0!ËÅ-ËV%¨”1ú[oöÚë7ï&6¤>œËC †6BûI„;zCíÀ›ƒkÛzƒ­&±JHŸ›N2XïÔ W¤ê餓L9CKÞÿU¦Ê¨!Gàg’R3#5lä]£çžÈ§EÄ_œ¡£eÄ´#øyiNa¨tÍñô5uÜv‘j_šÍ °°"å}éá’†aGpÌIM:BS6 (œq„§JÉSåM“åá;1f'ŽÙÈ)ûs¿cs™pÇdjÅHÍ™haldôjäßë÷R¾³åm €ÅAÐLqĪÖ*På«”}@ˆg¦M|N#‰¸_«3í«—¶—l«„(’>e´:/±TÕë–&*±¥¿¬“¬Öñ‹q”ùÝl- «S«Ö•åîª+ØW¦ˆº5±EK)ŠD+¡e¬ò(ò!ÑÅ|Š÷ݰ‹´·*õƒAŸ,Q©ß·ÄÜ]+Ö M©ÑÓóvyå±òEƒ~ý~÷¼óã‰è{«ðxEN¼Ö¸ÙƒŠ˜6Š0‘L¢ßBEðî¸3Qï\§èŽHºBéjDØEA?åŽ&Ðà:n‚Cä=aÑî&ÁÞf`‰x+)ÞN ÷7Ë;×Ê6¬äX8,˜RdÒ8(å!8NÿÎëå‘W3Açíu3-¦ÙPÞ]"mÀ¼ïzÄt«Ér‡È»N™7”ðitD dÑ¥ ¤Š%œY¯Èò>“çŸZ.)Kæ½<½Ì •K2ëy±ù‚Ä ,9-6&Ì¿Œ[Ï«­ç%ÖܼßâÆ\*b B¾\üÃŒU¼sDîµõE3M‹oRù’YØ$ 3acºÏÅ¥`Àæ¹x†²^l¶Å}:·„Ž1²³<@Éæ`Lö÷µ|fCQÅž@k´yä£ð[ƒdŠ"@ŽÑ%Z[6?®‘‡ ö)4¼‰QíÐÿ`cÛGÔ¦³šƒb\&’²}2Ãa'qÂ<æ"¡Ì:Èy·ÇæTÉÚ?8^Û’ëÎb ± ø'eáéBâlqðãròOUÔHE¸Òe¯ûqžcÈE¥ÛÿI{h¼”"e¦W¸Ú¶Ç¡â•pAF+iÔD)9Yi@€vrÜÖx6‹Ƌ֎ÛÐÈhEh¤22TöÜ/Œa¬Œ‚;5Z–ºS£Îðn£Ÿ±¹CÐwþ‹/¿bȃ¹åé4r.«¦¶ºÀ³Zš©ÜR•ÓëWôy¤q·¼ß¯Ùÿ̪§.Y%¹A#ªXÍ¢ýõ²¶ÒoåO±\¯Jzðh¥&Qo|¿ÖÔWÃt`níuÒ>·8Zmî}E’¬%<†ä«ü¥’:Vaˆ{5Ñ*yÔ£ìóH ý> Î×WðibK!Ú¸¢û"Ø{V¼½À°ÓoJ¬Ð|à“ô:åýÊŸ"V-¬w¢(SP(ÍݳL—ô*ûÝœ„GÙ»|ÞùñDòö-xÕÉYµšÆ](cpY¢(É•ôD[)éÞy'¥ínæm ¨·†àÃt5‚ïjBä]aŶT+ïiŸè:IUWß”v†u;Ök{šäÝI×kÂ]Ͳ!ÍVBBøÙz-‡Îg¡’l›£¢#ÙzüÛ›œÌ醜Í4.­³¤ûÖ ™.®+¼Jä|I®¦Fm6ƒ‘Iã+yH–‚Ã:¬/…ié9žùªÂx] Ÿ—Ï{yz™*Ó Óeyá§bËEáeqñ¾õ‚´øž7žÕäÿUaÙÎ5°!ÆbqØ?XÀCÙi€Ä ‘w+hº6ߌä]å¦û\Ü n wZLÃkŒ :ž•³ Ã$ÏÎâ1ÐZ‹wûšöä[¿¦6\óÓÐÆx ’$Û‚ý ­ ‡GœxÄ’Çqòßçñf´ÔŽ6´õo`¸PÄÂ2˜(“ñ›¢U§‹ÉW42loœt¤]ÍŸwŽºVOWþ‹ýz j*=àþ¾©µ IÎ%ç–û…$$!!wÂ- !Aˆˆv]ëºBÎ9É `;µ­ÂººÝéCÝ^t½Ì¨„tËv¦}h§íLgÔP@q­coÖew„*Ø݇g|ÐÁ¡žùÏ™3™É÷}çLrþ¿¯õ¯¶mR¾FQ ò¥[Fª¢#ÕÜßÜ ËÆ·ÅB®âÊï þà~çEÇÞ¸à÷[¼ñs¡øåZî3÷ŽëÕÍ úª¢—¼Ìp ~ÙÇø¢ºß=çk Çk˜€d¤’¾êã_=änT°@>@#`%@Aý>ö/eÍ0†`¨h˜hä)!_Ž"_ƒdqñkÏ,=^˜›‘Ôò¨ˆRä«RQ¶ÞÔQfjL'ƒªž+Õž®›±3AC¯ Sg:´•a(†©ß/3dȾZýÉ õT£æô÷Œ§"¦aÓÉ-æä&K:\ªVfüÚÞ €–dÓsÕÑ.L…m”=!]:bL6žjÐ$ë5=Ap–§ 2]¦ëõ›’Ûˆ™Å…¤¨®P»§Òx¬®0³¡ ['Í¥ö"ä‰×8~Ñd6«ºCúTðlÕùñL ™ ¸Á‚£[PÊ[O¡0 #нÍ/ªŽ• p‹ôPLz8®;ÚnüYTÒä $ŠˆÐ|…`La‚R9r<`§=Yç4c˜mssN$\sœu†1ζ:&cÎ)Î0ÙnßežH˜gXËkïêqÆ<ÅšÀ»w³Mp¥ûü…ù(OÍ—“$©€Ö|"uM‰¼ÿ‘•ü[åü\渭tßR–®z=½Îë€üWí¸©²OÈÊïRžŸJ¶ƒQ1"–Åç¿_”‹iYÍÆ>Ó^>Á˜r¬qƒµäâÅSíÖñ6ë8W<É™ï'Šïq–9®8Õƒ?ÂT«ëNÌq—sL·Ús´ã:íé(S*5yŸÄH)ŠHÐ|ŠLÎÎM;»£{úbû˾ìÑ{1Z¼Dž:$Ívf£}Ñw“ôÞܲóø-³kÀÇܨbF±K•-CÞÿ; W±ÃÕÌ5o|·®D†òQT ɶË[•%:X"Ä ˆÀ0 Ç)ÞkóùhÐ×ç½;‡B‰Ëà‹~îJulȳbZõ0}ôß«¹Á@àZ% 4òÒ8ÐË 'ú¯Êøõ ¦¿6®ozâàÙ®Ô¼C•€Cìh 0Œƒ‹ AÖMR¨–"B>|øè©'€#½$H¾)™‡ >=á©v(¡HR.Õ¦6Ê2õ†TDu:hìªU§WL#E]åÙ¶' éª“n³KÅQΓÔPÖcõÊcUE}MÆ“›T[M˜A¨ï¼¡åÁ:ý5ÅÝ› ©zmWPßÛ ï®}Þøút½¶»¶0[¯J‡– q:R(ÕÑ'½E©}ªI¢Îº,– ¶_4Bˆ‚)„‰aP”ë:8 ‘5™ˆ!¤ˆ¼<¾|]ÑûµŠîúå‘Say*¸êüxV#©€6Ý$cÊ!’GÁCI‡Q}pu(bø¨œE‡c š#m¶C»Œ?Þ†n,Û"'a°ABdŒHÉo¿YŒdB–ÇQëWÍšé¶âùV÷=ºl>Zžk1µë—š-óQk.æÈqÎcΰæûmö©Ö¢™ã\ÂùÇF“\²V£ ,àC?’¨‡ÕÕ2Ï?•®[*û;¨€[ŠòU¯¡×yåÈ·Ž1¥kLQñ'±}I­ÅyL,1ŸI2–(ºµ,$L·[,‹‰’…˜yºÍ (’cŠgiû<íX`œóŒm®8Äžc,ÚœšMië\{É—QólÜ~¼ÒPE| †ÞÀPr 4¦Óà’Ý‘íw´§ûú¸Óïö¶tdèŽÓñª5r&ÚÙCwœe÷ygÏljû·Å”BJã"S¢Â?—¿=êc/—5ƒâöÅWÏäŠ7~1»ZÅ‚~ÿuyÄ$‘Á$^˜OP‚‘z‘B „ñx”@ŒÁAµþj5 d5`.y™Ê–Ñw¹’ƒ¬˜F\€½Öãg/ÕpKçüÌHMh¤ßÏŒVdž+¢!nÈËÞðÄÀVìQTÒËñ0W<ËÚÓ5*u$NP#ÂþO/.>9^Î!ß<–––žÐdé—?$0D,$”Qpˆ.Y¯I7¨3A=¨àÔŠiŒ©K† Ò!ãG´QæÃ0ÎZpÕ‘FCöMu¶A“ŒƒR„à­SrT.Š0 ƒÍ’Â]>gv‡(]«Î„ éçj¤ VuÕ² †L:T¤ƒ²d­êTX—¬Òõ„µ½›Á}YRõÆ“ w{óñu•¡ØJ¨X‰U™T%Diø©Â\”éWaMoÄ”¨NGVÏD×å5¤·àJ !¤´“ÒuŠ#‰ÕÒˆúCVõ›¸âh«ø(GfUÇÛuÇv)ÒÀ$R›‰!ËÃÅ–¢|¡”Ï”‘ƒÛÝš-[´íXÂ0±»l!êZ m3Q[ŽvÍÆJçâîYÖ6/šLèïÅ “1ÍäŽ ·âA<ìNÐü0)QVÜQ{Ákÿ¦Æ>¦tŒ‹ì_ÈJoËÊV¿†^çu%_JÜc2ǘÊ~Ÿã ω­BBCׯEˆ÷JU³Œ%·Ns¦©˜ý[ôULw7Q|ŸsÍÓîù–’ùç cb-“?tOq¥wš-3œá>+Ÿd ¿ßj«•å£"p£pRÉç‹T¸*h:ØüƒÓLçYnÿ'ñgŸP¤—îTÈ0¯Z#`"0 `O_lÿ™·ú;îý‰ÎP‘ `I’!ÿ“÷ZMtýgåôˆŸ[u~<ÛþÕñÁšØ`ÙÎ;e‰ UQ'&H\ˆ"üì×Ûs×ð? ÍõUZí®vW÷ËêjK¶,Ù¶,Y7_„- 4­¡X»Ú]]€2eŒ í„ÜšbbB ¶, _`Ê3íC3™Clp %¤”Tl \Jlpã™>0“>¤JÝv¾³£Ñß9gvôû¬0¼‚桞O®é.óœ¬~ ¾âd&ª©¥®]»˜qL>gk=ãµÔ˜‡ž®¦¦ªèkNä´«x ጛZZª“úÌÏ]ôr5ôXÏ ÄM팹h ‘Ë5áñÚðn³P‚a ÃÞüÕ‹ÏŸ/,qda™ßéžYRÍóŶµë€v@ TÈS¿ÝP”h2õ7«RÍd²^—®×'²¦]ºYÛ_§J6•¼±ä)ù_˜«ßV«jàQžÜ¨Ý^%Ç!)!Aø"e®àšÊÉç›E¦wƒ²‘Uʯðü§*© v Ñ˜hP'=â´W;ÒbÜvAŠR늎4êeCÀõ=ëˆÍżj¼@R DP˜GàÀ$ˆ\˜a Lò³öH“ìX½6QGö“ÇÖ®8?^ˆ<áÓïk@9X*)S½GIß§VJ#šƒ1²7ª<À©{£äÁ˜ì=¤èÐvÍÝû´4äj$r%0QO˜ãZ ôvúóóÜvÅ£¨ô)e¸C¯¾µµx&n¹Ë–Î…JKžD¬÷b晈î~¸x!jÙY%΃¸H)ŸRÛKkæd•7d¥7TÖ(m©-£¬¾%}©‘—ùÿˆ<ÖÛ²Òi²xF]qWZ»3b‚Ü<¤FŠìT‹ò~¬âñVËMV7ËYrE_Ŭb•÷¹Š¹pÉ,S|;nšÙQz—±ÝátO·iÅK?Údk¯K„¹bZE`< %"R¯+í]ïÜöÚñŽÎãt È±o2Âíeº—Mò½‡íNÑ XÃ(µ;Éuýrm‡P‚Äf!Äcnö?{ÙÞ1îaWœ/dÊÁ`ŒyÙ‰Š-#«×ë!„aàÝǫоYìý¸òg.ö\ uÞËLÕm½TE]^MM»#`;ç<á îðEW8k*p„.ùÙ1_ø¬'tÁE_õÅ€C€ ¦Ì§ŽŽ%‡€aß”lÈây^v1 Ü„{I#çü,8à“áªõ„ðÇ‚õÅùE@ˆùÅçóK$ùîY¾?›_ШIpÚ #ó…ª#­¦DÀr4(O·hë5©:ý`s¶ºgQ²Y æL6«·9p”/â|$§| ÃrØ­ ’ïø1_ A£ñy¸U’g€$œT€æ’í¥æþÖâd@–ô~{‰FÝðZòh#ØЈdÄWrlƒrG•ñP³ìÃ&U¢M›jU¯3Gý%}Mò!@£€®' Ö¨]\Æç¡«òD«^‘æÍEÅ=­šmÒ¡zc:`èƒÁçÇ Q$[%MZ”W ‡¥¢B¡¤¹FÙ'{˜•Òˆú·1€õ~–ü k<¸ÕÐ×X"Џ!öoÒô„ôûÚ‰¶JDIÈ `u.‚ÁB …Z•¼>¿!w>Øn™݉êïÇMàÏùqÔò€+¹Ïšïqæ9Öô8^þQ Âˆcb1,ƒ áuÅMIÙ¬¤üï2ËM™%£°Ý’—ýMa˨«¾”W®|z™—QØo(«¿”'³ä •麲ô‰ÌyEäø1Fäà°’H Ŀšf(ëBÄ”‰–?¡ ÷(ó k[n5?‰Ä ³±¢EN¿2]k/ïvÌ„D Ëq˜€‘<)"F eRÕ[-›ÏíJ‡1ïîØ9Ù;ÌíIs݃ìn „‘p°ÁÿF# @>€C#¡ÎdèõT¤»TJò¼ð„‚Êg½Ì_tÜZq~¼¿Ô°5ô¹@ôS7Ýë\‹£†¥~mörmºàf&Üܸ3ü™ƒºê‰MU…ÿà£/øcÀ0ÓvÂË© û¸ÉÚ¬©à¼—>ç£ÿ\ÛqÑËM:èi' V8îbþêŽ^©¦'\̤‡»ä QÆÜÌ„²TwÙ!`#à~ÁÇ‚B€@gÜ”c¨'D *ÍâçOHþ‹ëß¹6}ÌŒ`Fø•"2µ®8QghÑ ÖëýYÓH@>ÒhH6 9 Dðaà AžiÿOµéFuPZ¯æ£Dƪ¤‰Æâw#„ Á á…®/X– ’éÀ·Í¯ð“é >ц©ݪÑ5¦ýÍ?0æcÄr\µÑb~Ýk>ÜZœnƒeé€&í)Jךþ€:ÑLþ®IóV-ùZ…ýÍ–òCJO´KÒD£MÔ“c*kçµó<´/Ïᘀ‡ "‘qW»ø §í‰­”F=¬|?£î‚Èzi/';нqòÃÊàKNûÁvm÷ÌoÏJO …¸Rh)<ÕV6ósûBÈöt‹ùQ‡ác¸5ÎEK²e_Óö딽Z%" †æ´M š‘Ø2âò/¶ëdyFiŸ•VÜ•Ý[3ÊÊ›+݃^æe–ó¹buF¾ú*Y–QÙ2Ò²[²ŠÛ ן”V“ðò嘈ÇFÄ#Ö¾¸Å àý5c~ÄYç¢ö¯b–yÎøŒÑý“*½GWÞ¦mCì.¹DR(Vcrðc†$ˆT‡Ê·T7&™®ÌžjW_dϪë$÷Î2BÜîÓ9îL‡w/i„þþ)Ât¥èΑÈÞ4Ý9Dužàö‚ûqv]$ D$@…"bÖzÑÿ¤žÌ^÷ÌV¦j#§=ÔǞД?–p¬ò0T…ŠÿhõbC|Ü9ï‰\òÅ'ݱÓ5T²$È‘öãî͞ؤ=4ቜõ† &Կد÷ئ®;àûÒÊâÇ}?íë{ýˆíçá<;±ãGbÇ΃×Xa…Äï8 Ê @X»¡Vla”ı’2­Ý¤©T]+U£€B@¤]×0d'ÍhüCC½?¾–Ž®ä{~çèÞûûœ¥ªçrUô¼-øy͈7îª:2Vû¼6þ¡gã®øDUx̵/¸¢cµq ¨¥š÷´'2ê /°Ê¹à0^”Ÿ9””ᨒ /Ÿ´¨‘ÇßÅ#ósssOž¬Þô™«eÜ›}~<•sÎè§µ¡ghÒÓögó«l>‹‘”ÛeräNxÚ?u´t—6­W’¬‘êdȯŒŽÞÖq[ä¬3rÊ=éj>ooY²z<‰LÕ:ÁL…„Ê/ˆq±ü´7vÉ9á 9\¨ŽœsGO¹–L#Ÿ×,@qÜw‚u-kÔãÑ­•r£q2uøèÀßsräÑ#À™ùÇþÞžhÄÀpÝV9µÒ0P:ÐH~ºÞ”ôq™ú¥êžút£*é1õû}kJ”‘c:„É!%0Iâ8ã/Gq/ÿÃÏó“+ i§úpƒÒ. ÃKh¢ZgȬËû“7oø™:2¦jùT@›\%©5ªk‹µ2Z-S¤†0&10‚p5ÉÉ\”Gx—N¯Ôuû´™ÂP“€¤¿A5è2îüÁѺ¢UÚ£uÀ*bê™ ÊVT42Ût”ŽîLÇ»úƒÛNÞ íìïèZa²j "ÐnÞ.¨wÇþéÞ˜u~<•‹®8èé—«"§­Çu6»F Æ”R‰CÐZy­òÛ~ł΄a# µŸøZ/»ÚGlÍ@##žà…ê%SÁÅê6ps+€œ ¢(BB£†åRˆFšû‘/xÉûÄ:á·‡FíA`†¥š÷³šÐà‡#¯?`L6,¸â  Ý]¢÷èàb &säÌÊ0ŽT„R ¥1¦pˆ0Ò\c¾z»ÃØë×÷ ÆRM  }²^L7SYT‡:v¬\X]É@›òšÞ]Uø†¦5LB$ U|wDÕÛjø}XÓ›Š÷sìs÷ÝNBÛ‰_bÇNì8W’j ø“2¦Ž‘ÁàT¥!@(¨8¶.ÓV©Õ&UÛ˜ZŠ:B …ŒæJnmakwS Ù›¦Û7&‰¬JE–eŸóœG‘ÿ¿wñk|ù¥‚DÀ¿: á„–Zs$ª¤_LV6¯c·!…Ô‹ÒxŒ’½”ƒhp6d2&›¸Áš‚Á¦¢£þõ%ÄzL¢ÎÁ¬?ä×§‚ºd•&óX¨€CÒuºÌ2€F'H4où5ý›µg›éÃÞÂ_id°e™2F ’ 0%¥()ä8%‘¾D³Rü¨U<ã[yv@U\ÂSDÝï_~ºLx@CªFHŠ2? [4(в8E@Õh×Op'ÛÕÝ1þx4ëÌx¨„Å×#ª“;õ=¯ˆ›q¿fHr]ž„BÕ˜Àçñ|µî;ïÕ›Ó•ÇH¦æ_ãESšŠ{¬ù®Î˜–Õj‡Y¡øW<Ål˜f‹fó¬h™æJ&è ³¬mŽ+Ÿçíó(¶7ꉯùŠœ‘ " ‡’ršùâþ_ÿµ¬‘GOg‘G‹ßhä—‡ÁRŒ )Sù ÖZ#@€ @#@©¦Âuúý^y¨q*”A½òÇn¶·I¸Ø ¬5 æÚ^T#NáÊui¢ ½ÍšÞ*M*@Ö?îúÊd ø»¢m2¨ë úë Ó…Í|ÆOüªÞp¶¶ðU/£–³„œ”!´™Š„X'—“øz’0%Êdî”|ݘi×YÙ€*Y£úúâYI~_€¨5&ÔýA1Sug¿/Óçá0@I£`«¦§ƒëŠ*{Ú…oF”'`lðBÑÞì0v%4¡:ÂjX”¢ LÆ+ †ÄRKs™•Ryžwˆ6|Ê8'Ë kJ0öÕj‡ ¡d’/™áM œyž.YP-‡-Yݳœsб±¥àŽãªÒ15èSÖëu2ÅÛÆÛ8W6!–O ¶IÚ:ÅÛI²>Ø3æS¹}œ±Ž3æ¬å/\ékc¬÷W¶æYPšþÈæO(]~ŠH&ó$ß kGv8¶$ô=ZÁq$‹‚E(t–ÛÛ3»ö·í=Þ÷ËöƒÃûÚ:³ÎŒ'Ì…pg¦}ß&{•%d0L£H»¦ôFÕ2<@¥ŽxãCîÈG¡áÊɰ;’- {#@GË4ò¢Žºw³7R‰\QhÌj^ÿFQà}{Ûmï+V„îxÚGœá ‘O亳uÔ¿í]EM…ï8¢Wª£`3ã®ÄPeìŠ3|¬È{»UÓ‚ UF¯W„o¯½âF*Ûk½‚"ñ\)c¿½üû¥Å¥‡žR#‹_ýséÑÒ?»RR©¶™×Z#šsAÃ`# ˆªÓ~í@máùúd½îLÀt®Eß·‘ÍÔñ©j]Ò_~®El5Š0很(Qõ1ÙdL•—êùþÆÿq‹ÿ²a$ÚÞ‚SnuÊ£¬6 ZÙzR’C¬ÓF}Š$ ¥øHÕ¬‡1“”Gšåà»+WXá H¶(RØäÓA°(cìÇ/d¹=$žC¢¸B‚0´êž¾'ÁwEÅ7âÉxÖ™ñ„¡N'¸ž„p,&ÝqÕ©Õ‰„òµ°°­J¢RðIJq“#2Œ@0˜ÂPXêS0ŸàŽy•ýU0%˜ØòIvÕ42CÛçXÈ kŸ`ËÆxë]µõ®Ö6F›¦¹ÒYÑ6'”M3¦)ºdŠ-wÏz½®Q&Ù‚ MÉgZ`LŸ)JÐæi•å.SõÁž5Lù¬`ŸÌÓ|1x1Ë—Ï®žfÿßÌ æ;\Á´íÚ£à×G¡rÙs JFQ"…‚ eP!©<¸ew2Ü™ u^ˆìÿyôÀÅоÁÖN`’ ñYgÆæRt_:²·{Çn\ ãH BüÆv„@Ÿ‚b½Y»V Y–€'{qQ„>r¶Öþð¦=ŒîØŠJ$ ÉJäõO]k­m²T¼&U£ÉÔ¨üÊLµ8Pͧ}º‹5b& >ëÏ?0\¨ú|º¾:1Ù‚•ñ°RŠGÌùƒ[Œ½A]&¨0Hn|ÜõE”}mº°Ç®_™_{±žNzÕ½A¢ÙÀà×¹W­îoæÒÕÜ/º@~O#¤A J¢k,¢^ó,3æ?Y;]²‚œ¬Äªˆ©`a_P™®Õžß„øD'&œZ'c·ø4=dOL *þDŒ;õ­Ñˆº+΋(Ïìš’w…å`þÞÝùÝ?R½B6™¥D®!ÀIŠ 0./'s.àE³jïg\Ù [<ñoêëü§ÍûŽø_0­Kc|=·íçyü¾s€±1`cÐP-M–ŒOȶl)„œ[[uÒr‘²¤Œ IÚhÚ´VmMºMi! ¹HH›I“6E˲¯“­¿eB ôѤ·¬¯ëùúó<¶ü~=|ÉCÒv-]®vü˜bK§ÔÖ;”ù>e}È–.жDñ”¶hŠ/œa‹çÔÅ‹Œy³Ì³à]¡»uÅòÊzƒ3O3¶{ê²UÙ¼ªì&o{¨2 >ØkæžÆz›/¹Ãe EO«‹î0¦œE¨y¦UæG9Žû´ùoÊʨ‚“"¢DPJ¬2È%(…ðBÄ*±ÎÊÆd`çPhpÈH  $“ð®TdW"Ø#83–˜ÁîdÛ»Ÿny¯˜1 †à.•²®ú"/Ên¼2C‘‰šˆP™¬‰^q†@^ÐèbutÌûÌÓ~³ªãK{ÛyGûduì/®ö?x‚¬Øžµo¸åŽÝqE.•m¾P¯³®¹–mþÓnðѱ«5±ÛÎØpISIdPDg¹XñüŽUGE.–·/WGÎÕ¬øý¹à V¼C‰Ä*…R)ÇZÖ¯öäé«käé¿fž<{f.Î#d0 “Yjq~ÓJkð Óïq¯.S¯>m«Mºõ)/Ÿ¬¤?ñåoΨe“žÜ´?'î'Gš ß_£ûQyNüm6Y¯IÖò oÁÇ>mêiä?ìyî‡oRq)Õ¬>Ö¤*Ó)%JAñoç³ÇëJã-ªcUº‘5ºïs…Z %àlyaj2sá©° °  ¯J#š!1U’;àSåmsRZŠAB*nïFÝ(Ј¾o { Hö…gÆcüe8Šê‹ƒ€%`~¦¯>ÔNíWÑÛI æmoAi]-Åi2K!ß@S”ãžÖ1KYøÒiµ ´ä ïX®vX$ é’yÞrŸ5ƒÍgÕÖ¯éÒǤm2Ï“%‹ªLæiPÊæ»lÉM¶Xðz]¡œ¢JZ0Ü‹ã>%íÇÈ&HÑD(¨òìu£5ÏÒ%³”m†uÌ2ó*Û#Ò<Çš„šç6]ú•Ú~ƒ3ߨi3Â""K¢D)ÍwAJ0Q½Å|ô[v§c=C[ÓÁ'c{‡ÛmÝ';~Ò¿é§#{gÆ3Úº-ꎊxÖâ2„ ð”±^S<á{Ч—ªÂ ï&ªÂBiä¼½õfMÇUG´ü˜'hqɘvÆÎU®Uw\­Š}V¶a§Î^ÇXf(eÔ`î5Õ©Ø r¥"8Y6¸^\®y®UF'íA°kŽ…W)e¨t5œÕ¬7y£ÀãU¡Ë®0 À €Üy÷·qß¾pŠd8„Á¸2™LÏ2 xúªyN~øxÅ Nâ"2¢úÑÆ•Öˆ>î1 yõÃu`­MÔiâ~]ܧô±ƒNUÒ;Å7«$jAíjëòS-ÚŸ1ÝHTñézc¢¡à˜ŸyéþÙÉúo¦ûóC>mÒ¯N5›úýyý jU¶H‹`ýÚBõˆÏt¤‰»Á¶Æ ê¾#WP²‚£•Ó_P$³N5ÒkÓHÒ«Oû³>ÃP­>¹†û¡MŽe‘àZeÊÞåE©Ca]ßî`HõQHpf,1êý!€¾7¦=Ü¡=å÷‡Ùƒ¶¯ƒ?´•;СéQ!¿ˆÄQ“AŽP}AæL*Öë¬å_>£0MqÖEMÙrµÃ_ÕλLùÖœäò?¤u= v»‚ßMf'`ãoIó¸ÖuW_ó€sÌж9Ú:Ï Ý­+–QÆÁÉÅY¨DL rAÇdÝjÁZ{¹r…/¾KZOZw°y;ÔÆÏÉÒ‡´ý#˜*ïñåsHá4[|›-ú;íxO¡ÑÈÄD.'Çw6n:Õù~zóöãÑ=©h×PäÇ#á]ÉÀöthg*’YŒFvœ$ÛºgÆóIp{ªsÇðæ®£.JáŽ!hª íœKÕH`[d¸Š“á=N>_‰)0)D`è‰ü’ o ë„=0YùZõe¹R;[ÑvÁ½Tžt/»‚_Vlºè ÏÙ¢ Ç:=KÁã*Ãår%Fà(† P£ÆUè–úÓîs_¦±Qœgÿ\Uj@f½»sß3;³³—×'>ÖöúØñ±¶w½†@Ai {O¯ Qi#0GZ•lcH"|¬×Qi?´Rz¨ù’pÔ˜Ëæ(.Å$1 ªš6%Ä}¾Q!°5«¿VïŒÞ™÷yŸyßçÿ{ãSÕ‘©ºèGõáåŠç]ÏÆ\‚_Í¢,IŠ&b5ƒÛxùDî† UᙚĴ¶Hq@&@t´ë•+žø:Ó¾ÄV[‘I¤DŠe3ÑÏ~üõ×_='<\øï£ƒ?? Åc¬jBW%rrGC+íªö4zà±Å;@Ùéf÷pÐ ¤ÖåŸlÊlr¦­C À¹CË-­Éã®ô¥Óû ³JÆqDd½¢u³‡(±žÀð®Þš÷Þz½¨ãir²S”tP©+ìm±†Ð8nþ¶ÏûY„?–pßaïnçúÒ‰÷ÛúcÆ%‰AäbO\îK*Ý kwB>qôuºz:„ãqt[à–‘fDŒðØ%±r¹\`Î^uUZûÑó7¹øsµæ/¢o„-Q9” 0š&áÇ „¡dŒäq Å ÅbL$©Lļ–åÏ•]—ô·×¥º°RxÃQ=+VÜS¼órÅ-®bV©¾/?­ÿ¯ù† HÊ, $…‘‹mŒÜËÙtŸÈ j7ëb(£‚J Eáˆ5Œ ezÅó‰ì½­–ÍK%€%×ϼT{ÚRÆ`ß¡ ƒÕÆpooÙy:º§?¹k¢cÏDdî8ñ‚ìIHE»&Úººü¯ñkœ¦`»µ¸ò¦ýç*¶_«Ÿkˆ^Òbµøùº¸^4ò4]®moä]$Íeð¬Q óqjsvɵ¸ö ‚àÁóüokZ§µèGÚv˜Â³¾ÿãopbº²íj]ü|eëŒÖñA]òÖr¡xš3@ñáhÞ„·qy¿©Þ ¤LiQÐåšøbÒ|‹©»R›Xé<œ¯_ÓÚ»] P- 4yèСGÏÉ" _.|ñèa玘À0d&.a˜tÐoï¯_iWuŽ6Û†Õ“ ®Á`îÈzàÇ€ß=°Œ‡Ätd?բ޵X‡ƒÎ‘õ¶Áe7?”êÝ㛊l$Ëx7P2‚‚Sœ 1Ê‚qØêL““T\–3Ô?ž¤‘á k0iQF›äEbf §i³×÷V‚ëÛuØ$„¾vñxÒuDÌXºlÇ:䞄ڛ´‰Ùû:IàŽr4.ÜF8$Фy‚3áÆc–üYë²aïÅÿRªn¨ž;¶Ê)¹üuVvb 7âqi5Ãz`P’ÌX§H‰¢%¶Á“8TN”¬”"_yCt·×%ê¶âœUK>ËîˆùsR4þª‚g?­ÿËJ#e(C`f™€Ã,ƒq ˜¾l2%)—^ñÌ å³ÖÒÏÄây©è–\ò¹ä;'Wmfi”EHœp®ÅíïOîˆþètüMÝqâ5Ý7ëJGºÞîïù~§“àq*,bø?ÔµMkñËZd².r±&r±.ñg_TwüxB¿òm± 4Мÿ¡ä9߬ìl _¨j½ãëHU|ÏÃ¨Š‘Q0Æl0’­ÿËJ# nb)ø²8œeIPB!i¯¨ê_>kó~j)¹/ÏY ˆåŸ*Õ£–\’ÈTL8P6„ïÙöúØŽ}£­oŒ·íÕ'^P§bûSÑ®QhDö '÷û³Šhd‘FyËÓ<[Óy¡*|µ66Yžô'.UëO¨%PŽåíœtF‹Ü­JLúc×JÛ®h‰„³ÖiDZm…@#SZøBMüYߥ2zι¦%Îháö,`23…QÔ‘žAPðk@èÊ·þ)»Ry,xö2 ç‹\\yŠƒÙ]©mÿ£^{‚¤qÊë){ôœ,²,òχ A%†AÝT^ÿæìÑÀJ»ª­¿Ñ1p.²GÀ5ÖlmVÒM–á€3Õ˜3Ì>Ùèêd®sŒ­s ²›–kÜì“ÍêX‹ebq üáu®wBÎÝšÒ줳Dž7Sb†ES vù! ê/[ÔqMwüxRé} É5² l$ܨ€âœ™€…àøévÛñNþXÂv4á8ÁÊ{“ºcÆÑ„8{;=IKwàDì‰Ë= û¡§Xàl¨˜YŠÂÞã þ.zçÅÜårJéM¥ä¾àû]lÁ3Œ„ÉJò4Æ`àÀ8ÅQ ìz C ÃpáP hÄ‚PN‹”À…#R|É IÓÝ^—¨~!'‹D€.XÓ*ΜÐ(K›ö1ÊÓú¿¬4ROð­1”D ¸Œ£»·^ñÜ*nÛ*îÊ‹4rW.š—ŠHÞ›ÏA…ÀHV!,®‹uŸÿDwœxAMD÷Å÷Ÿjs¤u÷Hò@gã&É ¨O‚¥}WÍŸÑÚ/øþÇ}½Æ6upÿ¸/kCßëë{Ï}¿¯_±çe'1IüLâÄq <*6!‰‡V¾TèhÖnSU‘@(°B'1:i´¶}([÷*¼F¢@õ!>l¢ZÛƒT©HH„&³Àú˺¶®î9¾Ö=ÿßi¹æ^ì¸P½ì]r›¯tN9êU–/êÜæœËþØ ÷¶¿ø¶L‡;g‹ÛzòÃÉÕƒ$+Y–5ü ÓKŸÿ§å±KžhÜórÈh œ'€/‰\zr÷šÚ*RåI‚bA_nÕtägWK¶_ôµÂ;öP#S(É”¯ f¥ïø·yŽXýJ1«²@„Ìð÷ïßJ|õÍÇ/ ™:¸Ø2$nð+9ñ桊•nÕ(Á°y4¬%jÄ¡Jq(d]—5²Q«5¿*<q¬7 Eø¡ e¸*g4´\ã×ÙŽUšGCÜÉ*îdµi¸Öz¬Áx¤^h´ ¯w®Í=^ÇÆëØÑËPÄ:P•z~|?Æx8I¸£ÕB·'ÒE°8)çB„H‡:ÄþvØææ·£ÆþNþ@Tív4gÛ³è„ïR'J_ÌÖ×)lò£ |ÜPK²wÄŠÛ|áM-w¹Z`FËŸ3ºoód]¦¤§d„f2H†fqLOËÑ Gh<%Ò³ $Žã/ôðÑS(ÛÀU&£@G° Ár›Aò(fø%þXÝ=¯9!ä*†ÆD9 $Š6“éÿàKR5ŸÏ…575÷¼âZ”³šsF· ¹+¸>T<…Š$•É2z‚8ÜØoßûþ¶})çÄL¢uÉXô5xoíîkÚiÃ9’ÇØIîÏþVX©WKw\¬l;l»Ržz~<’3îM†L†d8>ðþôR eÂÛô÷`óµ`Wc– !°~“õœoûu_ìü$,)7Ê:{sBù¬¨ÃŽ¡ ±¨µ’ãléÖ ¡®¨V”†®0¬U+¼¼¦eÒ“$ÁÃ|w…‡&Yéû0l;WÞ<íëØ¬ˆ8_D?~îÜÓa䛯þ;vê4“\fè˜mù–ÁµÖáoaû@د1žË£Õ°aóã›\‡6Ùö†¸ŸØ° š­ä-[ön_þ@£ãt#Ü»\ã*#¡¬DÄš¨W×Úß¹vù¯úóŽl.8¶^‹‡´!¯6ìcß«•km¿‰ØãëRÎG52X›•¨µ­er€áQ‚ Ú‘ÄDØàÛ;L}É~‡ß“ Šò.wNbÃr«Ô*'…}~-`Öa«~Ìg¤iH&X•RĽåÖ>Fª²GêmÇjµpÊùñH¬ƒóhÈ~8Ìd±,Fs®—héõíI{|WîýßûøL¤/féë0öÆÄþvöp»Ôß^ðv'Øèa3 ˜*€Œ´Í,7Ç»g¥Âyµd^p/W Ü“‹gÔÒn1‹!1 ’}KR€ê׃A±àSÍsK-½¥ºa_ü[(ýVòMKî^ÎÞÅ+)®ÏLå‹ ç«3åõú„9)åiÒ>b,¢×ôC¢{õqç?¯¹f„uÏI¾3Rábá-Å7/»—Q¹KÍM©2û¦T4§ÏI% ’{^.¾®}.”üA.6aÜz0˜àÀþ m°»So‰–Dëž“ÍÝP#'»zF[ºß‹í‹ F=ÎÀ¶l7lðKå­ã–©@ë_sÊùñH>¬Øº;Û«bÔjã ¼bײÖb X(þS2`­ó»5[®xZþêoú$бÔëw‡²^ÈàiP´d Y’vR—mÍëŽà°{sO~ØBpL&–Eóg«;Ï—¶|\¶ý"´Ç@<ÉÿA#ƒÍÿôE§8+‡î©ÞyÁyË¥H“KŠÄ|ÞþÔ5ljÿR@.µ=Ÿ<Ô<зsÿÅäáŸîØ i„ËSš¿l¾k¿jú,Ü|­bíñã }Zþ½¡h[®ŽÏ% ,Noy9©­ÇvmŠ V¼0R–¼m½K=müWc~ŽÁHØu €ÌÃÿãâòT!€ pÀC{A蘫îîmH²( áká}\¾c8’ µü*ØDЄJÐIäùêÄH#—-Å%&\¢Q4—_g;Óhz«ÖÔY±Zî©uTu%ò»kÔó jåLuÑ›µ›ºÅ •…ÝUÅgcΞ„º7ÃÓ"Ãàà›*O°&ßHr94 ´8bƒ ­Ýu–®jSwµu ÞÒ›0uTö~i^˜ª 'µ2‡k³:]Ã+F€£*‚à”‘#XçpšÒ  ¬(æW+¬}Õ=u¶ÞK_ÕšãÇRúÊ ;·ZkE±8€(J4ÅMÇ[W‹ ̯¦¤S»ùÓíÊÉÝÚÏöP'ZÔÓ/oÿ€„{}7v¢ÙqòEp*³ƒ¦Jà ´H QÆ_æ´âý\)]üãꪹÀ‚“›1\Ç@Ò|* 8Ê`¦¼¼¢í¦9²œiÑ>šï½#zçÙØœàɈžYÉ?/Ó¼Z̶±ðkF¶-ñö»2t7ÿ´â–]i18ůk‘%¡ì¶É1Fò§Å² 5o\Ì®…“E10¢E¦¤È¸â[ìÙ€ŒgN°§eó¬T8¬ù¦ÅÀmÏÁ“kL.|(f”Â9“{N*›Êÿ(ù/Hö_ûœSÊîê®QÝ1%ÙÆ´àŒ¸i^· –yÑ?·Fô Üy‡ì“I#Emüâm/«¡8¥ ,½Er9‚¡HÁ!°‘ðb“£4;B"ŒÃ‰ßEZçûË’×Ê›¯ÅZãÿós»MÞ %/—7mu  Iâ$ŠšU=K///ÿ4?þ÷4²ü7’ˆu‘cdŸ`}³Aê®´ $VË=­½õEµÖ³[`X±¿Ê|®FØBT˜:ªmzwÖY=·If4q#ÇçÈGjŠÞxÞvöÙü—7#N‰2â,Fé\íç•…=õÖÞZ½kËJdK׿A#_@ÈZ¡¶Æ Ùöw€Î-ø–]Ü_Åý(JV“K0†Äˆ&«¥³ f±tÔ˜;ÿïhDï¯(8ÛÈÛEŒ€5I’4­Üfy­mµ@>ž’_kÓOíÑŽ¥ à/I¤c«F;_&ýx›ræEÈBʉ6ýd»åDûúB#I@J,i8Æ™ïê>èqs¼Zê*ö¤÷´ÒŒPV ‚ç2$CÒ¬{ ù›×@ —ÕðŸ•ò¦$#eqbZóAØ€f:%:ï¨Î;÷„î›’}S‚ç¦É{Cñ¤åZ’ª¤A##TaÌVŒo¡ø.Ú¼(ùÒ\É}Á»ÈúÇdï„ÿ…oR(…ã+‚¶aji.ÆRõ çA пec¢c”÷n£…8+x¦Á(%_O¿ ÇøÐ‡¬·•Vì4ÅÒðzäˆÇòTË© v‘~|Èïšý÷ùð Þ>ïŸåœ÷YwFö“ ¶9AK• U˜ N¨á¸w„U‹¿Zõ É0-y®š}Û 62R8+ ÌŽàæ_î>ºB#ÐÙû“᤭㫫7•Ýð œKîh}©cï‘mŽo„‡KÀvà'Åñ›‘¶áÖk‘ä`<¹æøñ„†ÂMƒá–ñèÞ÷Ãͯ8j“šçYT/çô×ÕøÛ¾íC±=Gr$”òï€~ýq´éiã_Ù²÷ÃЮ+åmŸDÛ.ù¾s¼¤¦]÷4pÊß©¯³Ø¨®3À¯U¥°Ç³ÜåÜsî¾ÎŒ=6c{¼Ž‡±Ç3Þm ”¦i”âe6CÒ>´„Å• ‘ÚI(‚±=¶!$©ª¾4­RACг™:@0l˜%UŸxéïXBm*¢F„zõktç>œ{ιçüÿw(q"¬@ØÅœH‘Ƴ„°ƒáç? §?‰ôœŽõžBt?ñy¨ë¾IŒ5%O·lhQòL ó«²V^(XhB@¹À¿cÚŠ#z[ }  2%# ÙZamÔŠöáR§sXg!ÒhIÍã°EWPÎS£TaþÈßÔjï(!˜®/¤Hì‚^vO­žÉ^±j.I5óÁnQÕ]¬É ]X¤8Q"Á+6>’·Ut.Ö~)†‚ó+¦ôòÈ5¬²{fݤYs”÷¯Æ‚NÛܬ°pB$¢ÌÊËKrI4d¢Ëž™çñŠž×Ã7¼5—ÍÀtAÕ©D¢ƒå { ˜µÁgÑÄp¶ÚÏÖú\ ¯^=ã©;Æ—æHv…!ÅåóꡞM£ÉþLÏæ“t½òn¢jú"Nþ/b8ÕŸéÝr¤wëÑž­0„®M™tÿ««»á£À>€™î” Î6l8K}é=ßðôùñu-4Ç'Ó—jS—Ã}'ÂÝç"ésÑÔGm‰©pâTktûlm|¼>þ~å³Ö¾8ÖÚ÷mÛ¿^ˆ+õ}S‘ÔD¨{¢¶w,–kHŽÇÒ¿_ñÂkÖõ¾Ê°æ1yÛÁœËñJQÝßãÍ©s±äd]ÏßSOzÎÕ÷NESãMÉOS?ñVB`R#D£ûÖ»xÚãâEXZ!@`ã+x7?î½EÀï¢Fàp¢2$ ¥‚ÍÜ×Y”iµÞiÖ‡ÚŠ‡Û½[k–&Òì%r¦¡h¨Ó÷öª§Ïÿ k Ã·)Jsy" æåú2cwÒx3k*Ðöö{RæžTÁŸY{7 à¡òfêIkÄÜ·Ñx­·à 殄¼7M‚E¤{šA¬c;ã¹gDá¸:§VÜTkæ…Êi+k y ÍèU#B@âYÞŽ”<Âð¼J±‡‘Vyçxñ}¥ô²œu‡n ¡›ÆŠkzÙ¬TxKñÏÁZuWßRóVxܬõó¬ŠÞ… ‡2ý=™ó‰Ü ¹êšQ9ã-»©•ÝPÊÿ)„®[åóbð”2D–w0"6tJË·k–Ëñ¼î¹©F¯©%sJ0—Ïå‰dÚxãˆádWŠž"Aø·,ÓÀü@Ñ*ËÃ61( :É¥sž>¬y¯û‚ÐIÀ[?²A* †bÀü’ Òˆ–h4C\ŒÌAúÃS,f8ƒrüI¬ºCªî‹%ÈFà(†y¸ÎI·V2ÉÆ268£ÉœDÛʼn<¢™L4ñßer:WHfÅÀ´7pI¯˜—+á Æ&|á·¹¢ Ó”-gòCE¬a™¡Uf9"Ý  Ï"Ú@ÔK¼u^­½«…?3K¯5ðÕ®Ëw<ÑA”D”µ³û}ÉÁš§ç2D€“Ìñ0:Vw/ÁŒi·µ+肺O—\WJfÜåÛyÇ8! K™ ÍñœÈ:>$UÙj?[ës^®¹noé+®J‘ˆ*¹SCÒó0KLÖ'OE{Çëz·úˆ‹’^dñ>|øÍöøïëÕ¿b¤Ò˜œ›cž•æ@³g0k±FÁ!-æp›1ÜQ>°ÎÝ }´T Škä‚EÛšŠ÷¯]þR¤!†·—$W¸G;¼ƒßïÝG;üÛ;l¢ò eòÞCÿ"¾Îc£¸Î€ÿ[¥ªJb{ç~ÇÜ3;³»^`c¯½^{/øØ€ƒCi£6-x×^¯¹ªª‘€RZµRiÎFLlsµô RS©×_…Ƙ’–Ë6;´4U*¨ßb UH¤AZäѧÕÛÕ›7O3ß÷ûR›àè2ÐÈHÃ]eé']·b´yDw_»ýn«Á³PÄ=¦Xz`EÕ±e¾áïHgåH»K\…%°ªä㫆»Ñ¶ò‘eÁ}/Í;? ÿPÝî ª`@éÁÄÎu»Ûû­Ÿ®-” ì·³}GH î̾>sŠìÈi{rÝkUþwrú÷^-Q%—ÇŠ$•cχJÔÙpÛª´BvdÒª/ F&œÊ¼sĦÕy‰‡]54]ä9„G±ˆ04k&Èy¡(eé{œ…±a1ÑÉ@ÓŠÈ”¾­Õ]7ê¯ûOY‹§ôðjÊaÔMj¡ioÕ¯ÌZ¢ˆ– ‚à†H¡ñ©æDKä½À°°Sª JÖ ¶Ð‹£ dö5Îû‘¿yÂ[›w=­ÕÎ:M—­†Ãb¹¥0_KJtµ„è62)`Ï-I_î‘ Nõ &œ’àÙ V`Zm¼§†§­|iž6£çph¡ÉÉlà‡*Ž‚tR “!2‘`gU}¢YŒŒH9O(µ·ìؿ،Ruûø;ºËQ¢@æ¡“¿;â9®Ujþ‚iDmœt#·Õšš‰}zÍò‚)ah?£vùÞÜÆc¹­G{7˼~8½ "?˜of|ÎíÛ q$»– “ä[“ Cˆá‘Àî‹®<ÕÒ>Ñ&ùÌ«êÓÆùÖø¼ɾ³8õíªhoeè‰WÇ’«ÎEÓg¢éókO´õðdTgûÇâëžvþ¿¶õŽ-I%{Ï&Ò[³]‘9Ó’팷fÇcéñȪ ÑÌ•æÁóÍ'›VŸêü]ªÿƒÖÕWÚ×Á.´å.%ûNžõÌ·"‘>ÏŒ5÷kØß°Rö°”bY@Û¶m{dŒû÷ïÿçáñàÁƒÏÖÈŠ—z°ˆ!•a­¤t{Ê7ºª¼ï`G¡ªgÕ®Eû;Û‘e¡¡WÔå•,å ¢—È/`Y*Q…ç ­wˆ¬È¸+­²Ýû»ýï§*vuíåÇhšPúrMåÈò²áî|9~y¼ßù„€@æ(2Ç’ÀP—o‡H°^¤˜ÔPûêàBæáeþŸ÷T¼—”º¼Pû gÓf«âàR÷H .þ™w~<¾ŸCß3ÃŒŒ¥ýo ˜»ÖJ08ÂùIùžõyìÎwlþ'…¹+òqw–¾»¦ÂEòòÈB$§ê³¾¶›jõ”[wÝ©»£5\„¡À*ÛTºê„>õ¶Õkâ?/ ¾‡ŠUt0:¡²£" гa¥ø‹2»J·Ž£E×Hd¿YÚtË Ý°?Ñ÷Œ†?[Mº(8È+ê¾&j:#E0þ›¯yV¯¹êV]ó‡&½Ñõ×ôXLW {â5BN‘8 B­ÂÎhÓv|ÆžUc&T^§Hóq" ˆA", ÞU ,–`zq1œ2À"°^ªJ<–±, Ì/qè®»èF7ªAçI g (/ø¸…"!CcäïKå_HZˆ‚†˜ãvã„Û<ãþZLA³s^Qt!³ŒGMŽèˆr²Œ1%YdÌP„ÌÉ2Ö5XAÑ)obÊiº«UÝqë'åšYËoÈâJ‰a™ç]Ù ’j0¬V‘ÅVEyÃZ´Ù®n–uX<¼§ˆÐç0rXX?aþ¤ÔÞ³wÕÐtÆHl1J‰\ÂÑÏ©§¸% Ë ŽŒ˜&eZN“J’À+_‹ð 9<X2ˆ•³È½æ ½ÎÛ"ð“L AãýVjþB=Ÿ3Jã”™0ªîØ‘›j² ó”Ë7hÐ?nþZæÈš7¬Þø³¾-Ã飙Mdz[çŸ3õm~4“í{ýHfó±þ-K^+Ó)b~Í¢èÉdæãDîd2=ïüx,®„WAÅ?—̶.f‹¡Gø}ô›Ÿ$Ö_H\J œMæND¾n#Dx±ìéÆ5O;ÿåØê ñôXlÕéÖÌx[ßéxúl,s)Þ¥¼¹@òakþóRË ìÏß›²ùh[ ¿\K^¯†³[ssdz¦q.™OdN·ô_hÉ}ï5ò‹" žžž9„ü_üïÑKªTEÅEÄò÷¯p--é Ž¬zz‡–‡;‘óPgùî¥B»É«,á$†¶}œ-3feI£Ø„ mXðÅ*ïŠEJÄyÆhµº5ï­,=ð¢ÿ@Êw°+0²È4§‘ÒƒO¼ôP×\<É\Јó²%$ ÷•jk[Wàû©àW¬Ê"x ˆd¯û´»#ùËÁ%æEÙ—k¸ü©JUøì݃æÎï[SA`{VÙ• ìYØð•Æä`_ƒ…›ÿIòÑÞîóî]üa2<ÒDƒýƒQ;å‹Bz¿îÖL8õ ‘«nø–U0Ü´ê¯xC7Ñi3¶ûbˆ§b‰+’ ¨I’äå2†Å U"/-B+rå²¼A œÒ"ÿ²b·­Úõø-»ñ¿Ä—kl×Ç¿ö°»óºsçÞ™¹óÜ]{müXïÛë]{wÍæ1ТªiÒ¦µ½^c‚Ôª­x“¨©E q%¥¿ iT·ª’´$„W!ƒŸ ãJ$QU„zLÕ~@¢ ’©WgGG»š{Ï̽÷üÿ‰²ä•òüZÍÿê‘Àa™¬ØŠøŽŸÕÓ#0Õ5§~ÆH¼ï$t@ŒuG%bi‡eÿ.ûÓWƒ‰,è¾D" — ÍD" Œ£ 0eUü)ûñ, ÅUy‰é•½<àŠnAÁ²þ’º¡7L±ô1}Q_¶Y m7+~¨•3ÉÝ~ζÁöürÕÚ¦†¶¸Õ[ŒÊŸ™eÛ©ó• ñ#ZD <ã‰"ñ~ÀEã°¨QÂTi­¢oV‚ëuf@`´”1€Æ'ØH}ÒVyé[¤úRýx0þ¹]ó¥›»@ÒY,ÃCÙ" p*tмaMr#³Fö’R}KMΘùßè!¦xUÉ”ZÈ@²÷§šsɨŸ&f´Ä‰`n5†ÿ`3AWƒ<ˆ˜áñ Oáú¯XÓˆ›yÕ,Ë‹ªÈ’cfìªÓ8«¦¦•ðHYòä²$ì¨H¸‹q:O( @<à1›¯ñçkN°E¯“Nl–å¶k•2òQI‚ÙËö—¶½Û9§ã]Û†Šsj¾à˜ñ j†‚:\Ú•‚K;;·¾úÌ& –!£´áÿ4[¼’é>^è\püxFòŸå:?Zѵ¶*Æ©24ä=ñu's='b?9ÐøƒžšÆzæ.F]'VGcÏ>êø§ò§  õÃË{κÏäŠg›»O7wŸÏ•KÎ6Ï6œÎ—>ɶÿµ±ýDséBºãr¦ëd¾8’ë¹ØTú°Ð~2Û~®é±¿‡ó…¹+ÒÙlñxc)„5EU4 WWWü3 ÿçýÏÿ¦Eš»ßÀ²ÂeCß·‡Z€F}«æK=+Û–õ·ú—;‡VÖô­5K‘@[-I•Ë` yÅ”˜+‰Ð‘$• ¢è2—×òpA‘I*âÖ:¡ý+*úÚBýmåƒOpæ\]6Ðz?¢Ú÷ÙP¤¼oõ¿rí—)Uòè2q0ò¨^0FÃWp90}ªnáÈïÖV•¬éüC+?ò|½M8‰ªÙ…¤³wÙÛ]±ûùù¢}_OàåÎoU¨úÊDÙ+]ìÍÿ‰*v÷ÈûºÍçV1;òP©I Üaù zí¬?yͬ´â׬$ˆÅ¸=o42£¦oÛÙ«f䦛u3[™VË‘°DY©T@d½Há™"’¬p¢+0Š …X°[¯ïiª½ï¯ºmÖM¸Í×캯ìÚ/ôª#f\Ç¢#HŽÈ'Èc‰ß¤ø'XÕ`tÚŒO±Ô$‹¾ì¯ây%2S8 çÝÚ/ir‰ÝÔkî 6D/‘Éçƒj*@B"ùã·ŒÌM+1«¶|h.(d YbRÙBH¤”í¡òS”ž %¾Ö#zxÔJ9é«VømV|Ð!áÔ«ÒœUeß‹¨jÒh·ê§Õص@bܨ›ÕêÆÜèví1Ѱ$cÎáà¼0¯®ä0VïXùKNäŽÕxT­MŠ’. "ñEïÓŽáón Tß0Ò£dxÒNï6«^ïb˜–hð°’Fý2ÿ.«¿m€0gœèx0qhÍL¿D*‘¼ÔGA•ô*ÁP'©‹.9¹‹¡š)§þ¢E-/Àr…ŠQAÄHjS¬–5Oû›ÆXä6K]7ޏ‘?iÕçÊR³fò‹Œb7ø×j,Ä.b!Õgp2@ )#MB²É¿ÇjæküùÚŸãNn”ÕTÔMÚáQ#ý©½BÑE"ŠÁHß×þ‹?”v¦õì 9Ô¾eÁ1ãÆï;·îØ:оùíîýÅ­Püáž] –v„ —вŠ“ÄÙâHºô—ÅÇâxóÏä:€vm‘ QŠÁ°êh²¼H—TNEÎ!òpýâQ§h*œnêü[¡t¦©ëLcq¸ÐŠ4û̯ªrß±CõŽÓà8ë­Ê_W䥟ýdeé\¾ôq¡ãlCû…|÷‡ßî†A.fÿ{kê8uæ»ÎeŠçó›bV€2h„Rz÷î݇QÀɽ{÷ ¹÷ŸäÃÃÃÐd(Ò5¡Ól ¬Xãµ¶ý£Ž,TTj«{«¥v¡n°¥ìà*ÿкøo¿GZ]°Z`Í l D÷‚éE^×'‰aìîÊT¾³&зrÙÕ¡ƒ«ýƒ F•ýk½ -þ¾ÖŠ>@©VóP‹©“ Š}ˆ£ºi¿wƒÑ[*}ã|QùÆkO»qXCêäXepûsnïF»·‹í-ot™{J8½]Á×JFoq¾æµ_Ûh½ÙÃöuÚÕAÎ’(Cø‰!˜·®þ0ïiE'ƒÉ ; Šùy0:eÇÆ­ÈÝò§i …UòŠ §)Š%URd…˜<0Š¡ù%¢ÁK èMkÙ +yÝß0â$@§&ŒÔ*ÙíˆI–‰(7xž$¦ç”‘™ÒÒvzÊŸšÑ£ª¤QåEYT&S²A±§ìÈÜu7<­§&­ ÆX•0Á²) Š58!Œ_úg¥ö²¿n4˜œÑÆÌÔ ô2VrœW!À ¯c†h€`˜ë¶Y?æ&ÆXzÔŽ½§‡0ð•ˆÁ‰ÌåÞ¦=ô=1"1(ð¯(²ºXû÷õúÛäuÇüO˜¸äâçyÎyîw?¶ãĉq.Žãø–ÄÄ´2Ä%;†´ªV@¬ƒñ¢U›Ò®*%Ĺë¶¾ë^lªÖr+$] ]BÈ•4- M‚ö{©/Ðò"j²H³Ž¢Ç‘}n>ç|?‡*ܰa\+˜ýßIÙ;¡ïhîO{ ÁDј"ù ¢wˆê´™Ö &µü‡JyTt„IhDRð™=Xº§UŽÛüð\ᄵô¡]Skééð9!““ M¬ï}ÿ–ÝÃzþ¸\‘ÎlHÃaÓr`$+A½)»ÆÕÒ)Ù3«}+ƒ¦¼³Fá¿Ï]£pDòÌþaÕòœ2|0dzaø0 00!ð “³Rõ¯ÔúœS oÛýÔ²»Jѵ`Z)Ú+IaŽ'[+w\<ðZ_ë±®–_~Üòúïö]sfüÈ’ŠÙUd\‘ Núkï„ykÎÊ›êëÔ<Ž(@5Aй‰a0°gŠYp¹…æÈ¶¼à`yhß‚¿`†/Bf‚ߪ9dâa‰úËš®E[FüÍ×*Ÿ'"/ÿ>°gwQˆä cŽ1w™YhvQþû £7ÊÛFB­Ã¥û¯on¼h¼±9q¥|Õ52‰_­0[Ý 6ýÔȃ`LB¿zþìù³ùï@È¢:–z]¾|4Âc Nqg¶µ'–›Úî<3ú«W;mó»jrÎnu|3Î×[»w9»~æx·ž=á_r¥‡lƒŸtÈR&‰}²|¡a¹õj•:¹g;Ë1³õWk©Zk_ƒÐ_}n‡–ð¯³[ˆŒõ M"µŠX­‡ƒ®Þy JMmq÷×ç¤böÞUŸ‡¥Jvw]No=µúàì«Íî‰9Sæÿ‘CÁ,‹Šè8±ÏèH* £=¾R*:`›ìºÜÿ ‘A8Tµ1&ý6‘óNÂy&)u4;NÇm æýY+Óè¢F¬gÒ‰] + 4†¥¸Bœy=»tµ52)ë~ðì컫*ièÞïÄèßÅP˜¿WÔ Á²žÛHÐ*4`9’ΔH™>ÐYü‘R0±PÛ˜Õ7§”ÜS|'$ƒ¥ÒX$ËkXBˆÝø6ý@~mO+ùŸê[à`‘I’D$±‚ÉóJÁRI‚¦Xð‘‹Å7?ÄߨµhN(”}“ÖÂ1¹¤aÎFš(¨HF§ÄúwrÉ¢F¦äÀ¸î]¶F„M<² ,AÛ0ö…áÐÕ˜¼A.ß×ý ‘I=8¢mú›”‡XfQ#pD/j¤^P&5S#÷â1)äaD ` FµAè”râo8×QVþ•¨d¬¯ Ö×8ë+’|œw¨ì˜hSæÅ[fÝ ÞÓÜ3ª÷1[YßfH•`a©l¤PG™²´‹föÒ¶“RîÁó@ªÒ}åÀ´=0§Â¤ygï?%?üÐKid¥ê_±õ©xîj%ÓJpJ)žÒ=Ózñ{JžŒ ›‰Êùà—ZŽuµ¹Ôr¼¯éÿA#‡7702-"œÈ+½]Ö:X¶öüx¡¼š]†H.$MA?  .,$U[1Ë#Rá˜m†ëOìj¤éó²¦[Ñäõµ°ÉÉp#”Å·ÿ=åËš®öÝÞr¾;´¹í¥{vJ.--S„½ƒ`RÀ,À~’”HdlD•¢?mm‹&¯”¿ E7+«=ƒáP<|±ð|ÀåS(, 4ò×?ÿ4ò| óóó/Øc~áõÃÛÇ···ÃN‡;XÎ~ÐgKÕ@‚Fìý«ž¶Zo šs¦ª³.ÆäKUBo¥­{‹ûl•÷lÌÝUŸ›Ú¡¾t );s³~4ºj–[¿íÃJw÷öÜžFoÞ[¥öD$ŽTµ7j¨±÷Ô¹ßßî}c»úŠ?óe¯ÚÙ÷þwßN`˜œªÌê«s¦êl窜kC³œ¯^ÐHÍ¢FLŸtÅœí[, dâçZ]§Ê õL«ýôŠ©Àõî!å¨Âæg TNT,4¤ŒZÎz;¡v&oų;Ûlï$ìí ¡cŤŸNj ¡¾D° ‰ôQ2œÃ«­‘ûb`\ Ψ¡o”à¨ê»«C¬Ü—ŠgÔ‚YÝû-¤¹Bä¢IAÜzL§Ñ,+b6]"xšæ>ƒ!ñ:8dFôNë%ÓªwTó~n ä3(ÐH` K«˜#Pf…ïÙ6ß±Ϫž×57"ÒdóƒŒC˜²„1¾­‡—Òœon´¥1kù¤µhTËŸ•S’oJ/˜ÑC!NÄ O#,# sð’ŠHphdB÷‚Ffä °d¹ù4BÁ•@dhVdÁ‡ãŠsÜZ8¡oÓ2ÌUp\Ë6|pS3ÁDÑ F 8$·qÒ¸LÛJ®>HP–@f9³¯O1 â øK¤‹Ì/Ñ"tq„•DëyèO"ÉÂÈðK¢±}•Uhþ@|ð-ÎLP0â±ÀúH È#DPX!rˆŒFQí’7 %Ïù²{0·ZÑ#ÙH[J#+UÿJ­Ï{jþœUýЫQÝž¼¥„ÂÐkž2`vðéÝmØ{´;y¼/q¼;qlÍ9ñ#KOüÈ{»A–™+Ÿ¦£’1Xžø²,¾æüx¡t…_"±Å¼G ŠÎÈ´Y`w’Q-çpN°ÃSóIÉϯEâŸE¯„‡+’#‘äÍŠ8ä5€äz¤ žÍJBM_W$—ªÿ«hr¸,þieÓÍpóÕhkƒ”ûŽ¢5Ô‡Ð$ wFØ>Ö ÓÉp¯Ùë.¹i¾Þw¥ªe8 _âõäÉ“gÏL²œ:u n(p dqýºÒžªÊê®8ú–þË-öz×…mÙ½UÚ¹°Ñ_‘uq«³g«;U«ŸÛ¢_¬a?ªä/ý‡úzmêºãþÿþkIìû:÷ý:÷úí$8äaÇñDZ“Øy–±Eˆµy9Í£Ú¦…‚´IÓ´–- ‰IBJG7uÒ&UÕ˜¶µ€Jy¤ƒ HHp¢ý±Û~†)š*ålahÒÉÕ‘—Ï9ßÏÛ&ìÇ‹&Ú¼Ùôšµó‹VçÑdéØÖ¢©-в;›pOÖ¹F’Òdž¨÷L¥ŠN4x³)}Çhº8»Å õ‰z÷x­w¬¡x´Ùs¼Õ;ÕjŸL=+¸ÇSÞñ&'°êDÊ5^Ï’‘Œ¸QcX†Gl]…ëð€4”¸õ­— ¼?î.9ú]~ Åâ3YŠQ­H±06 w5,²ÿàeãÝA| Ûû΀m¨Ïî_¯~]ÃêpFÅòš4$sįd?äûÓÖH>Ðqø¶-º`ß´UÍÛ‚Kö dʼ£tÖ¾)ŸJà¯jì/FbF ýšõ‚h#ïAdÈ *Équ7kóßVýwõÐmѱl_rZ8 œ/±2-"Ž—‘õC˜®^4Ëj8!Ú†d n4FBÁ^Ùö@‹®ªAz*Œ””ô;f|ɨ¼i–/™áE²¯lÙŒ%,°’H³!0 GK(ÐȲþx:ÿ©F>’7©\~0~¸ñ)ˆÙ©oäMó/êU‹ù5,»åŽbŠ€48.¯…bšyyN‹À·sºÿc©‚ `»`YL’F½}7Pdºw6óú3çÄY¦2{>èÞçÔM@)ϳn†;SÓq9öìùñµòap[B2¿møz‹Â5v/aUâU~ë\"ó§pf6òÊ•DßÙdb>²¦úc]?|r.Öy!‘O®FWmÿB¬ëZü•Oj;®ÅûŽû·hâ9™a±,X-ß)®ÊÛ/× \‰ž oï(€CHYDJgéŸoÞBø¬>3ížyúë6³9b]Nô‚FÞ‹µëpv9A‘ä]¯íü(ãÑßWàñèÑ£•úÇáùÄ!O¾jkk“bižæ‰âƒÍîlëDÚ“mqN¬9ý×Z|£)ûHÒ}ªÕ1Ùì}·É÷Vʹ+R´+¾iwÒu¨Á˜1ßά— œGmz¼o÷¹¸ƒ¬-cX3ËópÛ Ä;uùÕ6óÈ€q¨×1< Z·~ñPFx}«A¢B™n8fÖ_ÖO[#‹Ø[«˜3*¯›P WÝÕü ZÅ-³j ïkÁ;j`^÷ßÂÁ%z€#G…b™¥ŠsRˆä)ÐâD7IBL,àÀ}¥*9³rI žÑƒ6±Þïd$H´Œx PÑGë_i5Ÿj%˜`4*ÍËœbe SØð‰QqO®¦ƒŸAÐi¡ŽWïj±;zùœ½2g„îá}Ó2Ž‚RD$I5Â2éÂR³8¯‘9 Ó)KÖ¬µ CלŠØ¬J²põ푊oåO4’ÃU9=œÓËæ]QlAO4ÿ¹¢‘Y5¼`¬®Z¤üò¬Æ[uƒ´+¤Ë‹x°'H¢N)É õ|Ö+öª¯Œèo´ÊVÖ%æ9°„•€ y0ˆ à¡ õ<)ÓϧeöKG4gDîk!ø¥VÓÈzµ¿^û3§”/˜Áë¶@û—”²E#0ïˆQ"mÕ8¶À|ªcú¥Ý?ëÚÿ~÷Ó]ÿ÷9Ù»÷tçqŸ¶= Ûž&ÇÂ[/F»ž9?¾VnÆþxùJ´w&9¸·¤†# UŠÚW\û»Tæ·µŸÕt^¬É\HôN \¨ïûbs×ÅpÇÕšÞËñÌÙx×¹ºÌçµ=«µ¾¦ëR¤óóú¾™êžíJ‰ @§¬Bo–$>Š¿t~s×õpæF¤zù8Ù9Tžæ «* $YØï ^ÜÜûE¬ðs)Öù?ÓÈ¥Ú ÔßaX$¢™¶–VÐÈ£¿=\ÈŠ=V*ÿ^Åb2 FŒÜ£mÞñ„{ª1¯‘lêi§­íT“m²©,Ûîy-&„4S oadRb­Ú«!ïÛŠ·–·ÂHì“ÉÙ†5kç­íb¡F°"'*4%r„U²²…6òrÌf¶û´ž2}oÈ1”²¶àl[ñÈVûx‹>Õ`L§S-EÙVÏX£c¼þÙi¤Á;’rOn‡xÆj]ï7WŒl“|èQ&¨Bwý¨Ó<Ø‹ÀÓ|g}HE9Ø#âÝÅû}‡¿§7G9A ” ‘$N—ÔmµE?ÉØšÑŽö¯W¿ú;=bƒ_aVTžÙ¯zçÍ袼éikdÞ,¿Ë [szå­zA«º¦UÞ7c÷åȼºfVß´U/Áœ¸a«üÒS™3S!ÞÚA@" w&\š ZN@eÑæŸ•Jïáø‹ù£5†—‘a9I€a.ãÄ›ŠC¢8…C Aaó Ó*зÌjHöÕ4±ù×Ј¼¢‘=¸dæ5rG 'xU~¬ñ!ŽåAMsFð®^Ñȼ^±VœV6ê,)‚Fh†ç˜ ´¿Gô,àrHÞÅ.ÃÎÚCš…YÑüœ›@#z4’sÏÊU’@À‡ü“ú:âºãþw¥ªMÁöîÜ÷={±kã5»ë=l¯÷¶Íb—# šÒ¼ë]¯TU%‚¢ôPK)uI‰š”ØølP+Ô?ÚªR޶¨%>jlSc>±¹¢„?ŠÊÑßâ¤U‘\ e]ÔÑûc4š}oöÍoÞ÷óàŽb9œþ ôÉ0nIBõ4¡ðxŠåI\¢h …‡¤!ýEaF\4U®H›æx÷=q^ðS6îcšÿºšUQ™Eg à„˜0 Eሑy¦“s. ÁÛ¢ÂâYM#…ê¿Põy]ò]1ûçtï¼âY–Ý`’I“Y Öá¼€Œ*‹#øv?6õró‹gR/>}N|ºÖ›=2°÷`6¶ Á)ô[å¡áÚôSçÇcííDj"”½ÊŽD³g=;O87wywœµ^ò¥Æãmïon{Ëûl›=°:Úí·Ý_¬o §/T7‡Z ¾ÏÅÓƒuYHðÕúŒçÃ}4’®Í”a4ì\d”ˆ²æ?…÷ Õ·‚dFà·±ì0ÜœhüìÔ&Œ€oÇa ÎÅrù §G£k>oŸhÎÇ‚-Žd`a$I’cØšªjÐÈÃGÖ¸ÿþÃÿ<<:þuýîÝ»°bMŒX*ê=[o†-ý ÖÎ-N¯yÚýqgß.û7B¸E×—H(-ñRލÁöÝ&½£IÜQÆ?WîøùVË[ê@òIûçŽ$q·QIÊ,ÂBmÓ£k1*£M!4a” £ˆ®ã¨ušƒY_+ëÃö_ìbzãbWÜÙ¿½ìt“­kÍU¶Z3õÖ•Jš{¶™{=õZ_ÃÆŽœDÀz-BÕ•jzG< ¼ÚjéhÕNLÚÑýF›t2g;–1ËbIͲLBP"sP0RƇ=–ï·Ø-Ô¸æãͪ,A4`fÃ÷Ôš9½jAZs,¨îYÝ}M|$‡.«Á×L¿§ÚÎ[¢ôà)KÕ´Å?£zç€dY÷¿£‡,(Ab¬ Æ "B¬3«U.K¾ë¼‚ãªÉ•߯Ê_‰å&œæ&-/–`ä¨à©g8‘`¡¡ÜIJ°¡ô¼’}Q­ú/Ñq^\V‹2¤¿kAöÏkUõ+H4"âàÍÈÕã\—‚hOª‘3r9‡—„=ƒF‚ä¼ Ø¯)îE¹n˜U¼óZͬºiR÷ÉE?ÒE+id„,™¼WÅ`M(…ÿˆ'I† pÒ´˜Tβç’ÅwUÉ¿‘›rí5%8§Ô,ʵ‹rÍU1°Ä>ª®È.˜áY³N@‰78Œ>¯ƒâ|ŷŲ¯QæRx3 <^ÌâÖ°¶è³½¦¤Ð¼T9mÝ´šF Õ¡ê^Tà ˜ê¹bªOÎÉ•×ïQÎ¥—CY(zWuò—ÍGº3Ò/¸Ï*¢-£«+ë/µÍ f€alÈ©,´¿â¨Ÿˆç.„Z.SãÁ44àÍXmúb$ûú¦&¶¤„ãø¬úƒ_å@ãñÿ…FÎGÓCáô_CiàŒ[Á)ðíã(¦Hò?Üt«5½'æìjÒOoÓz’›úê…Ψù;õ°…Ä(\¤i)P±ŸhW:2ægåW Ch¥?i·ËH'²ìÏr扮R²LDM’ I¬£Œ˜(Š­Å ¢Ïj\ê›æõ¨ H¸J]V¢Ë:ä¬s­5²$y.kù<ý€ ýšs»x#‹~öjY0»A)Šë–è¾-TÞ’üsj`ÊØ+Ë4ŠÊ¤j¤”*–qRaøT‚¤¸É{—xߌÉ;iª¸«F%@È-š• âÊÀaë9C.1 NѵŽâÕˆÂZ͉gÄ%#™!,¿mh¾È&¢­Ã‘–±hv¼ªyµþóÂñîŒå:+·˜á©"ÂxƳg(–Œ6%ZÞ¥ $Z†"ÍÃÑÔP8ËðŒ(Âash,Ò6KUe­ça<Ø¿™e§ƒm>ÙÂÀû _Z¼öðÁÃÕŽ“ÜÿÇ=¸ç½wÞ…õCD…ÂÉíº²¯»AïݼáÔf{w²P©jïlpt'ͧÐgY_“µ³ÞÖY•hù+ÛO“YNé'’úX÷ °Ñ(;¹»$Âü“øzmêºãþïþ¨X!‰íû>÷ýöµ'qâ<œÄ؉C;*íįè¤ñŒM´R×mPBtE…8`›Ô!R+M¢Ó6• ´¬kᑄ׫*þ(lû™üÃ?ù•(Ö‘umÝ{Îù_ßßçHbHVÙVëʵº‡»^v\OWér£ÈÎQ$#PNÃÕ^cµ™FƒÃ4yšÅ‹HœEÜ,+R,ÂYŠ"m•»:œ'»Ôá&Ïp›y<á<¾¦øèª¥Òˆ{(¦Ÿ\Sz´Ë;¸Z:ÞâZ­¯«”i^%Y„‘Lw«>/âÜ¡ŒÙŸqõg_¶ú[û³Ò¡uÚ9Ð+Êšý=}Û”,:”qèe¦µþ¬ûΡ|ÙÂH¶+ìK­§j=…P’pJ'9‘B4BâOÚKÞÍèGÞ¤ú“|:?«ƒY¹?µàÐ{=¶Š})õÈvã½´u ¦¡ÞŠZ¼ˆ`EB¶ÓŽ}²ë±X5­UBIZlÌè•×eï#-úw!°’ЍB’$¡¬ûxûÑ9&æ¤èC¹yR޾/•%DV$ó´ÅXŠ©. bV´ìm}A5ýI¨@ö×<â€Y “Š#Ž`i’P(Îd`;xõk%<©TL9kg Ö¨¨8Sîª¯Ô ¦°ˆÒZTH‰¤xƒâ;‘0«4>Pü÷Lÿ ¥jÒ Ì¨¾{rÃ*$»e‚q˜›Úá1­ÖB·uÿc¡|Z͉µ§%Ÿ†Øž%9@bì$Í©²kJÝ´U}S­¼g„€U³jùWõŒâ?%yiW(4Å‘8ÀÀœü†«} zo›5szãœu+qÇ'rè¶ÉÌZ ÿæ|¥àgÎÈO”„Ùé„jØ•¶ÝК!Ô gD€ BA41!ì«ê±ï[`+åPH’ Y™d­Þ’Ëîú}jé9ñÛñÔnHq|Ë®¨§ @ËP´VHž '/5§/6¥.F’PõÀW¢é±ÆîË­=K¥‘+ͩϻ?‹gþÞ4ÕØûëŠv†ç^g™=FøÓŽ7›D'h„äK×Ë‘²‚%ÝõQôÇ_F{.D7_Šg/4wOIJׂɅúÿ2œ¦.…“×ý!íMj5R½q"Ò=߯·Ì·+ÑäÕXúÑž  ÂÍ\Äb›½ ãÍYX+€Êb¯ÃÕ¦ t-–¹Ý2Ñ”œˆf~æj ?èâ/ç?}Q#Ïž={ñx^#ÿ{ö_8çìé3‘P$†~ä)ÉuX#qc´Ã}ì•jd(^:Ú qæÚ\Ãq8ȳd´Smµ2…(„yßn7ŽtÐk,ÑA~ÕêÒ~Ò)»1óå`$3÷Ò*([[â—q”ME"*„]#vø\{ßÐG¾WU¾ÛìúyHÍú͵>½Æ2JÌ‚2ÜÜ٨ő•¥# çPÂîô . E YÃ+CîAÐH§6ÚæÉu‰-O"‡íÒ~ºʺ~ Ðû¡¦g^V#æþŒ|8߃³/Ïs ·¤¯WÈÊöõQ\ý½Jo—&Eš%8Tióþn‡õ› ÚØd“9´Ü®;™D4¡7ÕUïÞì>¼]<܆7B_°N†¡Ý[¥þ P¥2 õ —tš<­UÝWªîʾ›æ¢kä®î¶³ñ¼Ü ©8¶|¹@– ™³@ *ü¥‡cɺiI!ϸ0V‘Ñ”‚S¯ÓËK9üŠ,Ôÿ%РЈD , [qœ€Ñ (¦y¸/É¢³jíŒR?§ùï¨5µÐu­áWyËôΨA†)‚Mb1†àBŒÂ5KÐÌ--4«ûç ¸Ê?m†æÔêûJ`l¤Œà \¢YŠáxŠ˜U‚·%XɪY©üs+8é¬ýHªTÈB³(Ï*(¦ÛyŒ&è„Ð'Ÿ*?k~\§$Ϥ^7¥„ΰ5°,Æ1¬€±œäÁQo±ÅàŸ9=<§ûn¨“ZÃ]½î®QqBÉy03°Ë€Kb‚r]‹ÜÑ*nÈÞ'Îæ‹J(Áð4³¼spnVdÒØfI>¥–pžh‘ 3˜SÊ[ìÈEbQ(2I$‹Y±Y¡fº8 ÷ä 4M7‚Í Ž](<È8ÿ,ø¦¬ð}3|G œP«C8ØÈf—‰ÆÙQ§ Y5ò€¯ýè‡â@(˜'„˜öUõ¿Ø÷í-µþÉ… ØÉR¨ÛÌìÊì^rN|Ç6šÚ 9™Ü½Îe @¢Ø©÷ý¡4?7@f¾ÂÇ|µm^Š@»Ð¸i*Ö3Ö´e,šü¢©g‡äIFäÄ÷ª:Ï­L×sª@Ñçê7ýÊ/³1<æè«ŒODÒ›»ÇbI¨Ý—¢©/" N^Že®´n=K ,<>c÷Ö¯…«.?_h «‘ü™ã¡î¿…“Z©6=Þ¦•Œ5¦ÇbéË-©EWY4Ò ¿H74ÐÈž²&š%ÐÎ9;¯‘¯§OŸÂû·Ï_p³oŸîûí^ЋD* msn¯/êp&@#щ’áÎWUUcmî‘Nk(áÌÅçÛü÷æH‡¹¹Z&mß§¾WòÁjkh­#$É8‡ÚYéÎmnG4el(1sq÷‰õ/;®ûÄmgPªå¬PfÙ"…_ÆðäàWy¬·Úa8ëDB?6F›Ì\¬|°Ý¿oMõÑõ %g®⻇WÃT‹ó‚Z˜Cùi#kþO|™ÿFu]qü/@ àyó–ûÞ½ï¾ý½™yãY°=õÆx›/Ä;˜&%"RlÏb¦RÓ%¤8U‰Æ,^0©TðC¡J©Ô¨R~¨ª(ÊRkš@ã…%ô‡ª ¤gL…"UD¢"}5ºzºsî=ïÝ{¾ŸSq¨ø]‡úpÔKIaïèÑŸܧ‘"QLdû3J#öþ"„¸ce(F3§†´_Ž(ÓÅÌQºê©V…o¦õƒÛåéáèÄŽHÿ& I9®øOúÜ.ñÍ3phy$–þ™á³C;Ÿ:N|Cɼ@òëÌ®‘Ž- #º+‚´=œ:Ý8Î{¶%.üqst È$ùÄÝöaTø¼)}:9pæÙÜûÉDʼnî•f_ø¤e„0•ç ‘;“™ªÚ¬a •䇡Æ?µdOmÈœLöŸiN”xWÿ-°ø6dOµ ½—J»¢Èp%”’‘hòÓúá³Mä†ÞM¥O$__ß·s]KÞ÷™QK¦<Ô$‚+tçd*¾eø|ÃàÿFVè(}:5xŸF&kz)EXÆ»oÏÞ;ÿü×¹wïÞƒq‘Cþ󴨟Œ¾N‰¬‹:‡×FG[ÂsE™í~Œ4,œë)ýŠ‚+ z¯µ˜Üj²ÁÁxì­±KDC/FÝBŸúrŒ"ª¢ÿ»õ‘Ù«ÐõÈt¤'r칊ÂÖÀ®V>eв×ÇI>F•-bvF‚?ï²ç6ºÇ{Ü£mö‰Öà‰MB{x¦=Tè(Ùží Ïv–ï|Š4RV豎o\w¨+z¤74Ù#, åE6æVì+ú¾=‘аÆÓîxö‘id¢ˆ©|p,ãNåalNæ``Ld̓ùÈôßXÚ[à²EŠC¾ØîáÈh¿<Ô«t[Ϸ⪰¨RM’±Bu¯È!}§Á€þ‰,|躆BüoÀBîøÌ/Ý“•·$ ²¬ ü( }a%/ù*oUKfÝ“®ê—üuoh¾RaW•L¤Vш çËè*¡ÃbàšD©ÉÂa@0WÐ=Dh6” ´þf ñ°ø7¦?èë#˜U¼^¸¡ÆðÒÀáSBr8¨–-Ù)ð¯‹Vå_õÚ¥êR°aѪYÔË–}IN\‹YDà‡’(pÌv…^±šÌÚkFÍ’ÐXr٬낫 †È’H"JªîŒ¦%£&/j–ŒÆ¿)•×ÔøVE•`pª_¶4^R%É‹E[Ö¡›+¼šGf0[W_q*—¬ªßh1B3Yð"‘Q…“™ïéþ+fͼÓxC‹]wj. 4¶¬Ç¡ƒóbÀJ€"¨ý`·,_vê.;‘K¾ê«võmZs>ÐpXކDfö¬Q) Ÿˆˆˆ¤â|Qú•ˆâÁªËe‚© d¿&@Jv›î?´Äßíø¢Sû©]×{"Äñê– H()¼L%™….Ò’e ø×»jË6§i<ë©–¹wÔ²e§îBpýU=)@"$»^ Æ@²+þ“>·×õKj".Ñ• I‘ˆ<¾mÇlæGO'¾9Ì î<žÝ5¶uÈô (/X”ZÌèÙDú\2@þaKt¶mž<-9Óž?ï¿°bÄï'ûÇ⽦‡—$é_Ýoë¶Aò®LO5oß[ÙdÂÒ+ѦÚ²§ZÓŸ$úÿÜšÞ¦úÏ4çÎ·Ž´ëÊs&‘»Ipãºx[ ¢Fñ— ŠÎIÐÑ@O„Pñ@ªH„r]¼ÑHü#RÛö³©ÜÉ"|œê?ŸJŸl9Ö°U@ Ðë»F¿\;wî|EîÞ½{Ï¿¼{´å¹çáC«-QJÊ÷ö½x¶Ã9Úœíx\®8ÚS’™Îp¡¨ã®<ŒÍõÚ6q:«2Å(Ð× ¬"ÓêMñÐËMbDQèI9ëgme¿êûÖuwFfº¿ØàéÎmq_m¦I›‘¿,ÁÔ‹8–'ŽnvÇÊÆ6­;¶Ù=œÒß´FgÛ£…žPa3(phC`&ñ´hÄí(ŸéÑwGu–6»£m’TB±ª ìm«ŒŽç'H@@#Á‰Ü£ÒüQŸÈú¦†ƒ{²¡‰¼2‘±¦†¢o –¿™ e#;·ÙÙ^¬«}k‘®ëˆtªD!H‚cÆ ;“ÏÈàŠ( ÎKí@¾ñ\`2÷54«&‡é"Möçü“Ã廳ܷ/cŠ aíïÿM|™ÿFu]qü?hží-÷Þ·ïïÍØ3Þ°=›gafŒÁã1˜`ÓŠ¤mÛ364mó*PUmj"ˆüàxÁ6T”Ji¥týÒ,ŠClðŠm–*ý%”¥=SUüæH4¸Œ®¬;ã™óÞ÷ÜóÎ÷s Ùjñ9'2k„—ôu§‘ÛFä’ÓÜÏÉ‚Hëœ,b…p ¡)±Db8óáE"üÇ(9ÝÍy5E`x—Èfyñ#ÔôU¨uZ ®ÿ®_S/©šårÁã\Ác†#L•佪¤¯éñU-1cDni±Y½áFe ñŽØ°ªl‘½p+:ÇqUŠÈ(2MÚuQÉü]m^ÒÂ7­Ø¢š˜÷GgÌD'œ#è,œ‘$S2üÄ¡è›ZbIKÎ)ѧqÆHΛÿRÒ§á a¡×+6•ÐÕ $ˆQOÛÞÑæåú;úG>*!/ƒh¾lÅÞ_ Á».º ÄæõÔŠÒ¸P™r©>‘&PP&°@f^”§ÌÔuãe+ü3qÅh€œ\uRoJ5 ª@*6è”Oc( #"°P2Ë;ت3œ‹¥[‰ü®ž³Ó³þÈR v‹«ßnhdÜ¢á°d,yDó4d–òêq´a/#‚&Ú‹éoqž´‡ùµRuOKÂ}.é±%@ÈQ ‚Lû¬â¯wÝ.Ñe9ùSÕEJyAKɹžCÏ'¾áï;:Úwd¢ø³·÷ 1xxj^ù´¥t)Wº”î…¿m)^Ìõ–\É”žH”8³ÿãôÞ/ZœI}'èC”Æë Ö}ìäfeqN¼ü¢“»WQÛòA¶÷Ãì> ‘«Ùâä–þ¯¡‘+¹þÉLßdºïrî૎Á0»Ea›æu–=à4èÃðB„lä}‚À  VR0ù]âû[ú Që‡Ï³¥OZŠ3{§2}ZŸåúßß¼è«ÌH4Ó½«ëÁý>‡>Ùß¿ÿ¿@òÕ} –ŽöBÙShRazëNï²GÛB#eqF·‡F;Ÿ•«Úcöpð\ð6þÑ‚1’lsÆwK{š ±š‹(¢#A4#Bçç݈V¦ìi¬Ü¥¾½58Úþ´×­ÿM—9–÷Ÿ-l/·Ç_¨ìÒ~q…ÒÁ´nަát¹=ލàŒà˱mUCmÕ£»BçvWÝ<Óú¼h° 2¦NäÃmuC]zoT`Ü‘!9ä[ÁÇõ%0tpídñ ÀíxQ;UF‚àñ@#þS­žÕÔX]ÜH(·—Öx êj#Œ`D }‹1˜²Í›Fˆç\2p ÏùÆm:òråà«Ò±^¸ÿ‰ÒZ×Uß(ÿ P ˜Ä¬p(tø{”^ bL'5çä¦Í¦'6mEõäzwõ%­áž¸mfÿŠÃ9«^—"‰.ÂR¼|W&„£$H„ ÇRÝÆÇÓ*G½ÎÕ,(-ójlN«_ð×­ÿ޽§¦Çì†Ú Ù3Ì $"ŠÃ2źû%å–¨˜±c·­$É’žÓã³FtÅiž²r&Í,0Ì©â55q×j¾]ƶè²›uš®ëÑn,ù †v«¤Bâ¼¼ËèI»iÉNÝÒšo˜À 3NÓ‚^°Òã|mŒ 3 E»dQàe¯À¨¤$ùP}Ή­¨à­©÷¤”Œ°‹Ãb¹ç1^TFÐ_Éõ³v|Îl^°Â‹ZxYN¯˜‘þ¨æÝ QeÜ¥ )ãÜNbÌI­«VvYß0£·ôÈt¨’6­&ÏËñ$鈨@,aXÂ2âTžh’Eh¯"²¯"ç[13_jñ)½öš¾ã$®Ùñ?‰YI´b¸=>ÎEs+ª­U"Ë‹&À“¼Ä=ßÞ)Ê¿#_Ø™;:\·ö®3’ „€Ò@ ȱÏ*þz×í¢Ñ´h5ÿA#T¡0œÌii½úÝþü¹ãÄ7\çzž))MÖ¨þÏ…×_Zö}ÜZšØRºÝÿI¶ïóÍkºùz¯3½—'²û'3=S¹ó-=}¡å©`KC‹ôÍCµ™¹ÌN×çcºÞD g"]ŸeKËíŸÌõ^Jïš kÅŸJAìd¦8™è«iöȬW~Tæ XД8–’X¤0åå`””Ìv=x ì¯I]Èô]NC~zþ4Lu¡eßµT/Ðȧ-ýÒ½ VŽInmÙ¤ñèÑ£<~üø Š<ÙÃçðXŽeÃO`ú£B¨n¨Ûk¯Î[ÛÍÑŽàÈŽgåªþ3;Bc;7MtWvT¾ÕV=Ò oáê‘¶À¹]þ×òLJͲÓIý`XÛȸTâMÊΉ¶ºwvW·ÕLì|j Î׿‡ •cíÎxœ=8ÔéLt× ¾ ¿EµÈ )Ç ƒ˜ÈÂi ’r8Z9Ôáœ-’‡ ÊpÞÏ׎¶=/ ï¨+˜cmþ±v8±# ! ,Ò8ü¸9,íd¿}¬dœ¢(>-Þ8`/)o–÷UÇäSýÕ'2ñ ”7, òMp¢Îòâ€Ã:hŒxYÂ4+yYÕ‡ÌcŒ½õ—ÚÄw§C¯•¤“å€þS×{¿žF¥ü'ǨĽÛD†Å,xýA¿kf¦íÆÛFyÉX÷óK16c…ÔȪ™º'§GäêY\'QË”|@/ZPiCPœXcÙ0ò6*ÏË‘e»c$Vý pŸëVÓZñçÍÈŠ»êlÞJÌ. ’Æc/‡U‹öý^¯ˆáU+~Õ»g¤§õð²À,¹_1ãßÕÝHí$t'Ço¥."¼¢©ÿf¿Ü›:Ï8þô§Š[âÛ¹øÜ}αc'qœØñ%Çwçæ\¡áRQB_´©*i «˜˜4îÚruL+­˜ö“ø¥´š I€œÄ8JÑÖ_FÊOÓ6iŠ´ª°hÒŽ¿²ô>Ïó}ßWï÷s¦ÕmeV´=¢%`†i®c$hfpHãø«ÊPŽ;¢ÔO»~‰%„¤*Àø®¤år“»qU7®RÙ&µîI½ Ö˜mN”ûMÅCÖ<ÏKϨê‹hÅ{¬ÎËp¤ Onr%lµFU¢"l¹ γ%_é<óLÍåJÓEèyгƒr@HË $Iû²ò¿ês›áÍpT€KMªBD†²…4'£¿Xvœø‰q±ýýT´ûd¬ëÓð›*}À!ŒU È)kËÕÚð¨/rÇ¿î å­üz™hd°&–÷bxÌõ†Æk;/¶¬W `%ˆRAÊ[0íe÷Û÷]±[¾Øçµ[ºËjn¸ÃSÞÄ`MøfmdÄÓZ –tyOxÕñ[¾ÄžòZEøUrm\…j5bb¸FÑ5H{˃§?wm¹æ }S$îú·Öv¦«w¤]áÏÖW½·½‘<Ô„&¥ÐȰ?:ꉕ …R®`ifñ/ÏÿB~øÛó÷àwñ¾k  Nè¤iªÛrœ@b«|[Ó]NS5Áææ))A‡÷´ÖY¾r1?MótÅc–æ¤/xËg´î ¥»+–O±ž,ãÊjà ˜³¬i–š´sà dõΦä)mš¢Êi|Bš¥Ý€[×xÓ%¶äUúi™a] ˜å gû³.0.ØÐΓãliÑXñ†òdå‹.M;ÑkŽ_øž3~Iz+dtî*­=ìyó†ãí!ÌŽùc7X€Ç¼{£ƒþÈMod´*<ˆíkön½Ú¸í¿C#7ê#SRh8Ð1ä‹L¸v^ tw: PÇóçÏ_üËó2™›™…#V¯ÁРƧ;Ó`<µ–î ê{ë É—æÂ†Þf6U_Ü·žÜfw£Hš –j÷Ôè϶éÏ®ÕõžZá\Pw¢IüU Õa'>tkURµ|_ “ çZµ$U¿T~mÿ:®·®¸·Ñp¼¡äü:õy/s±N¶OnÒþ:Èǽ\‹7iPÃU(¡@(%AÈqJIpµQ!«1d5ºÏ!ž¨+ém†!ŠS-údSQªy¹h¤èl³!Õ 9WÍ÷+NlÆñµ!¤¢˜ãD€"Š÷Ç©C ˆý0òíÿRdA& pöóÏÎ áP%»†7ŽŠU¸(Ù¨ ¾f øt]aHõãb9Íè—)ù÷VŠòñ2s_H7Ü`®7%ýÆ¿).L6™S!cÚcNû-ƒ¡‚dØœ¬‡)-ª‘þ)[o ›Sak&¤ÍºVö×+›L8“‡“y4!Q&•®H–¨„¥å8Jb2‚”Êä™™"zõ¦ò­> ˆ%-"Ęª_àŸ®Ï­Ft#>€bÁþF’\A#8Pt¹EÛ5²¿4Âõ&ŒÅÁߣux@¢ëI€CúÙÞ˜ö€`íë4€+ºcæ½m¼Ð€W[¸f§.Ò ßþ¶æÃCy0Áˆ«çÍ#2¦·ä£ìî¨{EŠ@ðÝÜjºãºÝ›1£ÀHFFؕ̌BÔÈŒfÕ}VÔÈ×lî·ý—ŒÇ\åmMù]]嬪bÆh›Ñ•=ÒU^וü]QòoÖ½“2Ñ’GKÕð€à`= Š×TþCSõ@µJ¬,œí&h„]™ó…¼‰%³lå=uÅ]}õ)yM/£q\.ÅWóC±®±6Q ÐŽí„ÆxdgZèÊ=3^Z#£Â®ñØ.˜vOëÏ58ƒÃÒ0Ò¥2Oz¶]­&ÝÂåê-üñsöÖéšh®ª0X„pÕÛ>陈ä˜t~âm½V?YùÓ‘ªï¸¶Zl?áK‚*cµ\¥Ï“ç¡'ªÞ™r “޶éðÖ Ì¢óŸtµŸ÷ÆA,Wm-œ­—}‰ŸòÅOÖFSeÍ;Œ5{Ì®Œ}ãIOä–·ó„»%WÏábmËû˜'( 4rÍ;ìˆK"JZ.'éŸþù»¹gyòäÉs¼h?;uò/ˆT¦`ä ”a7ZE¤ƒÖT£fXÔˆéõiD7è·Ž… ?ö3o›$r™:2K•Z)Î (“ŸOQËY·ÖüK¯)µ–ô¸õ©uÚLX?„Z\˜ Z†€IºÑEó[Rë­™zuÆË'æ~¯~¸Îv¤™‘ËhT"GEUÊ"ƒç³,Â[äô )Õw¹¬}k­ƒëÍ–ä:ëPx"€S:‘CŠ,hÄ4€åð ®_8IlБBi6P ®Pô%ÌûEf€ ô „Ū¿nžªnAs ¡;ØGÌÕ˜÷%ø}q¶G€„¢~Åz"ô¡„òH{¸ƒ;Ôùa¬¶·.Œ…ŸÜþ˜(œÞv1^Q#º‚ík×þ: sS¶Ôa€TGpé»j묲ú‘ºüWÍÚ9ßö_2þ¦ªº¡.¿ÅÛ.«K¯iÊ*KÿÉ•ÝኳöO46žDƒÓ4‡NÉäŠv\5ÅÛÿ¥«ša‹rU³jûmMå#¶$ç yK"ªm”e_ñ¶lM)(e2'8}¸õ=± ·lv¥£;@#¿í^B‹îž?‹îHt±:Š )f•Q§= ÐÈ%(âµbu1àˆçª $¾ðD"ó…8:QùCÅÁ*d( rš"Q”%H†–Ë~Èá †$+›.úâSöÖK5[®xg|‹jäJ­Å^±·]r´Â¨?ùÚv: (%¼k†ÄtÄ”/[«0|êN{:sõ&ÝÑ OÖ¯ãœ;zÅÖÓ~×\EaCÀCÀÏœ:=÷íSOŸ>§ÈÜÜÜó8›<:€£¼h!¸è*>0¥æÁµÚ,h$`zm1Œ7ª‡ü†”we_ˆlÈjµ„ÅeD¾!ŸS,g©8„£ˆÔ„3-« }MýMÖt“>»†KúÅá™Íhò-–ŸÏ6›ÓMÖS4.IÕ¿lÂHŒ$Q %ËS£XA/x­{7ðG~¤ÏlâÓë,©FCÒo©³d<–´[7äfÆ<`žɆ™H\iÄœ óé:]6À§Ö°›K@SIÓ£y§jº¢7nØŸXpBÓ×±xõA„±Àe  PqDL /8Øg†žvèÑxfgØèû¹^‘+ÐÙàÝü5bªWÕˆxÓh„ÿ0ÊìÄ]+1Š5B,ÓT|-jdõ¶ôŽNüô{¸t4r+ÜÑÚ) þÈŸg*n«Ój[[Ü@Âg«„ÁAþ jªÅ˜|9®,žUUü•-¾­YùX_3ËUÏpå³Üêœ/äM,‰˜UÛî+WÝ×–ßSÕl! i>l†¿¿¾ªùx[E´uAYŠ-vg„ÃÑ.pÔPû.»¡HNÒPÚÔùèqOäKG|¢62éŒL¸…‹ÎèdmŽ(ârÖ7ÏGìœ#rÍ.ŒÛ6"’·´„œ€×@’AÀÌagc ¤-X†-_wÖÑ:íM\u “¶ÖóþÄ¢±Ç>÷Ä ÄO¹¢W\ñ³>á½"G±”Ä »‰‘( •å7h ®ÛÚsöœ‘‹žÈ”K€ö˜ª=zÑ-|Pì‡ÀªqÚ½oÿ7ÿyü{, ä…C~Î}·wÏ4I Ñow³u–TÐ8ÔÈg‚ÆtÝk¬ªêþ:ãp½a4¨’á¢CM%¿jàÚJˆ"9®ÆI£¥$)ä KQ*]Õ«ŒÛªW÷¬/N7Œ7³iŸ&Ò6.–_›^ÖŽú,™õ°—Éú•{ðï•#$KÊg†ÈˆåEa‘ê«Yzs¡6ñ_öë-¶‰ìŒøsû‚Ô’Øs;g®žÛãKb›{0q‚ã\Ù° (øš,ÝÂËBºˆe)›„°l Iì\H¶°UûÔ®TµªÔ] K²¥¨,MÈÚ¾rí7¥íCV¡B²}fìoΜÿÏEêa¯y Öq¡1ÿB‹ó\PkYÖPÄ5ªSÄ–B¥‹")4hÉZÛHmv²UªÖL˜¢YÓœvè­e,3Îí}ñoш­7fèi¨)N€ôoõÅœ}Pp b:×ÁŸ‹óg£ÐÖÓÛéêë„ëæÞ¨n³zgÝ3)Ÿ@ÃÿÒ\|YØÎÆÍ}aIÖéXÖ‡q2[…E(ÐXCÓjù}Ù»`.X’ A#³*P¤(íÛþ*ëJÑ’¥ô–Åß„YX/2Q Œìz¦”ï¯73<Å -'2DF³ï!^Ì™µ.ið;·äž²i^ymôµVé­Õ;k.¼oÊŸ³nþïáè ØÉižß]Z3ÖqôräèXè d2Ü=™’IÚ™±Z¤ìŒÅz¶”IˆƒWƒäýØ·}¦,¢k¤::íèñGÓ®pÅ—Ño*ü:°WR4lh’ Š4 46˜ã2x¤Ñ|»Ûw¹t×-üJuô÷¾ÞtÌxÛWêîú¢2 )Õßù]E¨Òd§Fà 'œÄ[Y^ÂÑÔ¯Š÷¤kfÊÛ¯ø÷_÷‡§¶„¿¬ŒÂP§üÑÁ‚&ˆ`=…YþøOÞ{öÜ Ï^hþ>|ÇGÁÝž®nЋ0B´ãD#È®ÕF›²’)Œ6¾ªTÍlÞ0±^g›lP&êÌcuÙãÍîDcÖX“ãý á-å¦y J0ÒfÎDâu¤œaÈeОlÏ…fHäìdš¬Ôß9Øä®²Œ×h‰`Îp£ëb“íP©B°ûó¤%R¢Œ$Ãó$Å“Ç1€ xÁ’´D[] _®9×ëIÔë S±ÕêyuóðhÄ:Rç­÷Œm 1™ˆÁˆµo (ÿ¶˜ÄÒý¼Ð@EÊ!ê{{Å‚lµ¢Ðº­B‹5ÛºvÛ?gõwº,#>öâ+r nÁ@>úûbz‰/[å¥JˆÉhÃpÛKˆX$X·Õ,½hò/¨%³æüEµÂ42Iû¶¿Êš“7Þ·ún›«ò06ÒTf¼G QlH˜X ±(Š|Z7$å>P‹ˆKæây­dV.¼'—,Z½kY«UÖ‚¼iN+¼/çÍÚ¼Ÿ›¼,7’ÂïÓg± `š$‚²+]ópÆY¥k”C|å ÿ±l?K# Øúºà²Fž>}úœ©¿Ç/_„»olmA4aÄ È3ø¦k´:'Yoov%A#ÚhÓ«JU°‡’¨µŽµÚF[³‡·z†šƒuÎÑFOb›ãDÀÛ¨4XøŒ%‡ÅPœ 22¬@ÁkÎ?×bú$¨LÔmH¬¨ˆlëD5ðÚÍÚx0g¼5ï£Ýöó ¦S⻥R{±TïQJìªMäÁ¨fðT†Ls˜—Y†7ÑÄwåïdÓ5²L‘¬±Ô»§(¢%‚éÒHÖp½6^(rí Ñ:™b2y6Ûíx˜{£ ST§Â™N+¦¿–:*½ œ»û:=ïGÈP50¿:`ÁpÍ‘úbÀgäÀ(XbDP‡12˜PCsYŠ  Uî‹®œœ¯ÿÐRzG_ù [’õ‚ŸÅS7uÎû\ÉW†Êë:ç׊Òß1z9ñ‚ãh’ê×Çú&»ÁÄX´7Nœ ­X#£ÑnxN&ÂÝ'c{R‘î¤Ø=)öA6ˆ3‘>ÈüµŸŸØú&Ü<í~/Ø{&Ôs\”MwÁ#§V>.À)Sm*Ú“0¢å`ߤÂé<îŠë´[¸RÌz#ç¼áluaè¼søtUhêñE/xBçjÅ6µ¹…9O¼ôa ø«¢šFcÊ¡ Ž•1Ȥ³CºÁVýüŸV‡>óгU]×\p>ZÒË/ɲE,u½a+Œ{¹"8^ùc•åÒ‰ÉÏ»¡’È5otνÏúÂSžðg^© æj®Z„+Ó^a>‡“ï{~ô‰¨‚¡[}5‹ËËÿX^’L²ô¨FA#v[P„!(…•ÊéЧ¬Ã­úT›-Õ i$Õ¸Z]Õq¬Æžn5¿å—•¡8ùKÈ0…\Æçªä*çAŒ ‚P¢r}XO:h]S¾}kå×Ö£­Ží¶T£y¤Î2Z¿j~< ;Ñ MµÂ[­¯<¶QÛï7ŸjÏ:? Ëp«-U§NÖZvÔPxn)ã \Ýæ_i÷7ŠƒF”¢¤‘¨¹?n?¸E¹k£>Øhìô|%ªëéU@JŽñŒ‚Z›‹äÊ Šœ¨P | K¬r(Šr ¤èG¹ðhD31ˆRƒ1­RÍ£8ŠÊu8 ¹©v‚FngÖÛ§M#7¸Â»šŠ/ÔUרò³\Ù$ï|›ËO°Ö½ŒyD]ô‘ºò:çºÏ{þ¦ñÀmŸkœY/øY<ÕqÓPrs~©-¿¡q~¥,åì%Ëh¤³Ì—Žõ‚F&…ÞñHÏ“i,‘8JLlÛ{,¸ã¤ÐóAtß‘ðÎdì[*ˆÝÇ"»ß¨Ûð“òšúü²Ým¯Ãˆ'ƒ‰‘XÏ ±w¬k ü?Éø§˜ÒbÉ£¤‰S^ôÅf\¬O¼â Ãž¯²¨‘tÆ#dzýe_ ð~éÆŸ9¼]¶²F½½˜àô2D‰¢K¼È r³Fžc"¨OÝÁuÛg}Â…òÍ—½­Ø~˜q!ùYŸ0Yþª*§qÊŒÊ?ò/b3¸hÁ† ùI}üýŠMÅ¿/hÞks÷™+Ç Û@nR…¾hF#0o ‘éÇ»Zñ2«†]†Èm*ÍÂÒÒ7—,ÿ·FHŸ¥¥%¸Ž!(PBYÄå%;õcõ–ãMºdkF#†dójuUîݺ—’-¥[\¼"Lj“,J®A9Š4Féqª’ã‚ú}µöÃÎ#¯›¶YÓÌécªÍ4Ò¤?0ךÆVMGyi·!íÕŽ¬ãͶwjÊÆ×ÙSõêQoÖùñh ·À¡O7Å* GP £îÕ¦'Ðùþˆz0®>ÓöG­ƒÛÌoG顨⠠< èþ°MÛ/Ü'*ª H’¤ci…ÏÉ·¸(‡ S0†irI#ÝZÁE!§­‹a(®=$®´Í`T?3 Ĺ·B ŠáÇå~V ÉP䖺䎺$£‘»êì/ûß9Šîj‹¿Ô–~­­¸¯sÝS»n++n©\·ùâ{ºò»úŠÌ JwÂ{)K²]í³xºã¯Æ’;J'ü¤ÐTüY]ÆÓrgáê28RñÞ‰`⌸gLè–4"¬Œ’ "=üí1ñJ¸ËÛôËæÍ§7íLoé“("$à8(ìðêÌZ9ü‘[Š]0Öxp·!¡X÷œŒö­t\Hr*,@ÐHZìñhí°3‚…BMP¬F ‰Ïy"Ða/e‰"ÿÖHµThdÊšò‹âi{3Š$A)pšÏ!8Î!$(âG4¦#舡xÞ™® ]ª੹@üqù¯V —jDHÎ9W-|ìqr©epòf—`wm6•®ÓÀ‘AI=Êê¤ÞbÂÒN¡Ž…M¥Ÿ¶€Fæý±‡É$Ÿò„¿ïùqk­,”BàŒ,ì‘ÑÈÒÂâCü&Ëp•#Ͷ—.áŒ£í¦±ÇH«&ÙbNÖYRµ¦dËjuUå¸×–l6n¯XC?Ï£ó4ÉÓ§úi‘ýÍúü‘NãD«f¬^Ÿ¬³Ž¶ä'×kßmÒ¦jGkìÿb¿NŸ›¸Ï8€ÿL µ-í½:öÖaÉ·l˶,ɲ-ßÂ8i¸¬•V’ m 6G’픀Oð$ƇddÒ™Î$¯šIs'@&$Ø`nhÞµÒ>k3„¶Ã 1N=žAóÌÎOë=ž]¯öûùjÈoN7›cõb¬v±úÉñÙ'ê„xåðÓp½å¿u¬ÎzxÑ®w±Ê<Ö`Ÿ¨µN4ò­9†ét0Ž•›’M¡'$õG¸Þª‘ÁÓ"°†=…¿?hî ;~±6{(Š~#"c¾’µ7š¾?jëß"EVãfÞ€‘FZoª*w¼ Œ1ïW@#LŸ,&¯¡?,(–>…ûÕ:ø‘‘)RÛÁØæÄ’(2ÿ¾U)Â.›Ô¾É\gWŽ«lþ5&ŽÉ¿e,¸Ïý/¼Á9¾a³/qÙ—%ÇUÑy“wÞcŠ—¼áµ¬ëS!üX挅w WÄ¢¯¹Š,ƒ"q"ƒ`†£;'Ûç5èJ$é…UöÚ´½%·LGP0{]çtØñ.x㨼ëÃàn°J¢óí6§ÇB1†gsæxçÛp:uÇÍÝÉ»Ç;€Ï­‘ eWbEÍ9¥ðj‚i,­E¦*^û²"€x…œ=í-•FNEÙôçç5àÂü(Ó¯°óeÜ€1=Ü¡ŠdìÞœ"Ñ4­Ñhd6Ö˜÷acf(ª}_Dm¯û…7hÄ´/d<1õ(ÖÞˆ±7 õ%­®7,ô…žv®ÍGhÕE¤ô2¯ j@/PÆO]uÃPtÓX|›)ºÃß`aMá¬PxYÈŸ›ÿz—/½/”ÝV­U0Ã|+.yÃ/jY³ÿó®ÐŸªä‹.Ø à9ïVt4ú2ž’ÆÐ$I¦0´"Ñ;à½ú¸æ5rC,å2ÒÈucéW6#–~%]œßšJgM%W¹U³lÙU¾l†/¾lt\6æ^áògÇ’7ü¢–u]á ¯sêà6“ÿ5ï¸e\µ•”PB 0`Òðë1eçT{7äûs¨àp û¨¼ 4¢x[ é`Þê”ìûƒÛ¶·¬ÿE}›ìiªË,r$}*J`8NS¬† UELmxë#yw<ôƒ(’ÕœöMÈjÛ[k_¡qÒˆS4Švø.•‡¦½ó‘q- ETT´Ÿ÷>ÎôsUáÓîàIW–'Šþ¥+p±J9ç‘§½žö3•í°æZYÇ´+t±¤ýóÊÇ}  xã¸[~¦F<áÏ«‚gËg]íçÕƒå‚)ÃÍZ AP…L`Q<_/T2æZÁ.›Š½¬;Ë;äh/^7R¼æãÒ×g+:ÏúÂp®³ÐªW;EêǾ?ì  H“;v øùçÇ y4uðèÑÿð)Ú,Ù p‹HÀKнI§ÿ‚=Àªæw—ú#PÜ`ÄÔ£˜¢Ö÷BÜj7¥ÅxŒ~™Æ¸mkí¿ ClC[¥ß´Ûú;$¥‰ 0=J ÂuµY;ôƒÊ¼sB\O Ù~¤¾­¦Á°8Ðgšô¶g¨_±ÅO4²ðŽŠÀridv¾Õ›BÉ®ä6St‡-¾Í_3̘T‡Ü`Kî1Å÷Åß±¥ßñ%7™‚%oøE-낟Æ-£sV€qþ>ï:»ê‹i$I2Z´0Þyxs$;ˆÆÉª kíæÎê5í«ü ¹¥Š1`$ñÓT+n€·„Š ÊRz˜ÒðjÀ0Š¢*myp"PD"¼ûð¦Gª+’=éÓ™ í‚%ÔŽÖ zŒ„( “3K.”ÉÓ¾D¿©K§Hvµ<¡‡@©,ñ„þê ÂÊ ÿf¿Nc›È¯€ï‡JÕn öxÆ3¾ætlÇ9Hb;¾o;Ä &„†Š ›xX_ñ k ÆœoÀqšLÏš–ÕýiÜàeÓ4–(QìâÅ‹i‚<ùR Ï5òGžÿùÓK2œp‚xéE4ÌâdÐн™ê† Òõ–ç÷¬Ùô7¯Ö&ÃÊD0¿¿<÷”7¿/ÌõViºkŒ?ö«BšuªlT$a0J…*p‰DF b3J6s»ª4gÃù½åÆîÊÜÓLÿšÕÃ&ªuÉš‚dµîxHßU™×ÖœªÈë­Ê8?þ#€aºþþdX&!Ù(…ËÉ5×Ù¸ÚéêP@#9MìáÓ.À;¨FÞ!è7êÛò4á[œ*…’^‡Êd2"hÌmoPo";bÔñf œQá8…°Ëi÷íT¿'Çâ9ÇšÕq®sÕ:¢5±ÛÁI¹BJã)%í!㜧,iŠPfØi¿ŠŒoûÿḛ†)ºd†5ΪKïѦYÊ´À˜ç(Ó"e˜§ prJm‚gØ»¬y†³NQ¥/øÿñ?ðÏòPa¾ËYî²øÕͰΔЈ” Tˆ´Æèœ‹´\ˆ¶%"û¾†F`+À1)0@Ž`2ƒ§W¹v"D.G#e‹ÅJ¹Î(ÅX,Ts!~àLݾdCpâƒHK_´¥¿~ߪAk{®`És¨åáQ(]†íЖLØ"ÃãCîHz°º3¦‘T >âŽ6 —¬»®¸êáÌU7Ù@a@…‘²†Á` „pÃÛàgÔybqOAhÐWÇ-LøãpÁ¸oE¤ìÂ-O¸ëJöGnÚùËå @ÈPeóeod,Ô4àÇ=‘ _4勎¹ëÇ|é+‡|õ ëp¯~0P÷'Çð×gƒU õ¸;úªûóæ?•‘P2xcòhéÉò¿½–––àü‡ç/¨d0ý1)‚b‚vÃ‰ÍšÄæÜÞMºž:Y¡ëÛ¬?Y¹VS5?YÉu‡¸ó[èdPðê“e0ú¹®­Ê³elo¹îP™b§>K“%A^£Q)%Â)1©K¾“—]øÛ­T_8·'”wºœëgœßpèú7åöV߆â"J;‚X5º#Í«þ+s8VxtÝ.Gãú½Ûà‡ÍF©‘ÜF{ÁOvv¼©}7†Ö¸³XlÚõØ·(‰îW¼òD3s¬IÓ×v4’ÇV­#²SÆ0ïFhLN"r©D´ '¦)WÆ·÷—t÷Xë¬k9Ï·‚FVM¡U‰"T"ÆPWÐb<@ˆ$l¶t½L*"`n „'%¸" )’³5Îà×HñÂ~ôÅÛÎDöŸ­ß•_~”‚D2Œ€]ȫɻG¹7 9ƒážòòÀa»`PivçØÆ¼M#¾È@™rñN~8rÖÝðÄ>©Þ4¹L-ÕÉèmõS=à„)GôS?¿ÒúàQŸpÅuà6o9b׃MôìíŒll¼†¼ü¸?šò§Õ1äGƒ‘¡²{„Îèíàž¬§¨J¥Û×ÉιvÝ î½f\ócAa8ý­WÛŸj‡˜@à‡ÂHý]‰/–—Ÿ>Yü«F?~¼ôøÉáCí¨È¥ùÃââ®êœÞ°>ÎKT‚F´É°¾kͦa÷ÆÂ¾-§ªt§7çv‡ »« z·çŸÜax'¬Ýëávš¹`!¥£á DFHŠlœÂ¥¨Yn>µ=çlU~oe~WˆíË<¾éè«Ôv—ç¼W!’dÑb9!•àž|Mûª§ÿJÁ‚(ޤMBý¦)ï /*ÉÁÄb&Å$¨J¡”áüB1*ƒXPŽ"b"hÌïh&:ø®îPœ;WvÆW­ ÷ãÜÑÙú}‚ƒF ©—‘3´3ãÛûKÆ$i†a÷9휧lS LFÌÄE•mгO²¶&¦e¶.°6Ë4›ù‚_QÌ«J¦IÜà=µm–¶A7жEÊ ¢xaL3%‹¤ñsÒ:GB[lз)Æt›*š¤Kï«ÌSŒyRc[¤Í³Š’ÛŒá.kZiHñàY:H ©¡(ŠyH[æ¹Ò¹ó ] ðNf¼Q/¤}–1β†g)wÝ¢\,Ž€Fàe µ=ñ–ê[A#I~´eµ*pj )\ž\¼.[¤ Ö)q)©´Pº2½ñ»×ŽÐ[•;Ö ÇêßêÛûóµÒH_ÝÛ ¡å\´Ò/¤ßOGßVŠaTÉdfer®¹„”/ôñÔÈ` :à|‘ý¹ •j×Í”ébˆðó7ý 0ô¡<àÄTÙÞ?X·×¼.Ç`¶‰P)‚5Ó0ƨûwÜÂpYÃJëà ™qwtq;М*kj7WÚÅO•ƳæÚTÙž[ž†”ƒ‡>€[Ëøq¯0ꊤ<±¦Ao¬Ë¾í{Zƒ";;‹±ß~ý<ï'žÈ¸/ž ÄÇ oÞ´VqÂ^ƒÉQ0†R,íøuûß–-?]þJ#à/Eòtùà/~ —É0Þµ­ö¢î­êžMúD%hD“¬Ð$6åu¯ÙTq«ÏoÓþÈ•w«k‹Õ6 û'õuúÛDzü¨VU—Íá¹<÷á±ÇNBbrøvb;'1I[š.Uƒï#¡UÛXªu³ I ä„»ÝJýP©í—ª‚- á^®Ø9`YVÝJ•ÊÕg ¢_ȇ”€…õ(yÇö¼Ï3¯Æïó›"Œ#³Q-F’´–0 B¢”–æÞA³(ëÙ5‡7H£~(É<Ò`8Þ”y¼Þ0­3Žú¥=> Ë•0àÆ5X•ýÉ•Ò?˜>ëû\_Ôxh›hB‹ xN A„ž‰² e(’eàö,³.Û{y·iûÃúɼž¸2ä-»8Wê‹ÐÉ&*ç0ŠÖ";XüôÆ?«‚:Ò:WZp@½)ÛSŠ úã}²ô[Òv±-öyè’¬mž²Þcÿßøë]*îÜiÀƒdM˶Yh1/Z)Ùñ˜‘ŠõޝÇ]F]"°ÇMÅv[o›“³¼Vð¦. h1X¯+KÎ) ¤ƒ¤Z-@´©Å%ЩÓbé ©ê¡P’ñ…zÉH ®9±T ÜW¼uQ¶ÞÊ-¿VEûIxûgÁΓ¡Nèéã¡ËUA‹¥Ò£˜7¹ªƒ¾F'kä³PJ½ç® ï<ß5ÛÂ3|ÛóYd׉o_)œŒtO솿cÑÎOÃ]Ñ&J`qŠÄˆ"нä‹A >ï OÖD3©‘ÊÐÅêÈéµÑbVÈ¢´¹fG˜ßUlþkE+@\9ë ÎøâçêâG]Í… Çf¡Iìë‚×*+“ÞðRóƒC®VÆ®U'®–‡¯•GÿR ›ßAߢ €‘õLÞ¯V×þÙÑúeyòJE|ʾâm›tE>·´t™kªäÕ$ç ¹Ð`Þ, W½ÚŸ˜¬‰MzC°túU¯Ï°ëû,îFÑöüú£>|ª‘çyþzô4è}¦eO¹y¸Y7âäøA#ú1þðÊuÕ“ïæ¬×è²³Hô-àù®€3(A#…±8¢Ö h DrUõö;–ö+lhMÑÐy¼4R0ì—‡ê3΃×Ç›ÄÊIPL"þÀ£ôo[)ˆqº'¤lç»CºÁ¤r MŠ¿‹”*y(C¯ÒÙ†¢á…kPJƒéµ¬œÜPØ—“À}_ÜØÕíÑÑåæ5 $…þûÃ*RƒÃÃ9Bá¼Tžñíýe»0gI e7õVè¤ÐòRìµå)¶†²[²5õ´EÎ+î´Ñ}K¶ßàË2^ð+ŠÛÆò[¼eŽ/[ËRzË-ƒeF.˜ç\/ŒY}Vq'l‹œ-Å©zùJ²Ïë])I¥Hšµ,²Vp|gž·-5¤P,RCP“’œwxçí¸'y `‡ðfÆê%cVt<ÓHJr«Ë¢³Ì î&Šƒ4ÂçàýŸ uN„:@# ‡åª`$Úq8¶cäç¿ýŸoar1'>øh4°x9Ü óÔñJi$Ô ù!F#@‰ä‡©ö -NèQ|º*6õT#Ó5±óÞŒiäJUü’«õOî-¨&[KÑÏEW»§<[¯®mEœó†&ׯ§ª"ì­ “Ó ‰d¾[Ä)œc1Ds¬²åKOà‚7x±*¾Ôü«ž©Øú_–xcg*yî2šþ 8ÎÓ,ìÏuórµnµ,K4M¢„@0Ž L Ï•:†ï.ªû}uàºm°Vç*‚ç«c—kêà¯Ï¸u“G(- û|ï¾î=yðxòøÑs†<|øð™Fºó£U© !îræ­—G×åøóŽÖÇ×FŒCþ•j©Ê‘FóÞF6'Ë”Ëë‘Ï!ßb Š`$ ¡)M®”“[ Ô™ÖB}WEñ'ßwj):´>ÿä&a´N©/„¾<Ö”q¼îòç7q±RC„AQ¨•ûÚVJ#ƾÓÕlËë‰+=1ñ@œ tþˆ¬Íq 4!f!B6¢ÕóÜFOÁîÖÂþvøœ Q5Ò—z£ì@l¹yá\a Î×;Hø½…eýš—øÆw‡”ÔQö¬.JjÌ꬇ÎÈ•Ýçmßp¶4WzM.»n²Ïl÷á’3]ð+ŠÛ¢k–³(€ :˼T6G—Ýåœà±Æ=Öæí3¢-¥¸Dë]ºôkÞ6ÇYoÁé²ýžè€XÒ:×"eý†´/5¤€D’Bj(Ê€bfŒ¶›²Æ‹œ pof|¡^2fuN¸L îS8fåÒ9Þ£eÐŽãl¶¯%H îüZ8Ý8²õƒñpG»w}…Ñì1­i¯Ût"¾{$°æ<•üp<Ö5Þ©â!ÖµR™¨yÆ'˜ùd°c4¸Ã­1ˆ– Ñ|Q†.-þ\utÚΔF.WƦl[>µ4³l–Ô*µoN{bÓžÐùŠÐdEà‹jÕKW½ÑËÞÈYOð”­z.— AÛ›.T.úBç«—ÔÈYΚö…Ïø‚SUÑkµíg|¡?Toý‰¹Ê…‹xV6B“$Ë``“lÚʳ4:”ð ž«EK(±Kñ±Û"35íWœ¡Ë®à%_ôBUtÂ÷Ê×mbÍ ÕÐ$¸ˆìÞ»ïßàŽÀÿiäÁƒê¿ÇO>ܽ‡ÂµZ¬¦ö:MÃòxƒi¸Þt¤Ö8î†WL#úãÍÊ^6¹Š¶¡¹ t5]Pj¤Bæ¼®JËàFÇÐfëpsá‘zãprÂoÚ`5ê'tÇü £ü¿éèŠÕó¦DÞÐ:ÓX#½%ŸF4,Æ‘$¡o[¯[9B€" ‹üž¸¹'É÷„¹ÃIùÈOõý ±'¢Û3 ¶é$¹ý®Oˆ8‡Ûz#†þ„i°]ê‹É—]¡7Áˆ‹3‰“p¯j‘·Oó®9áï)¶ä¾àü–sß¡³œ3-ûÒRå,é¾Ky`pÝà½!©m÷.o_ì×Õ§ÚÌ×ü*âëÿ°_ï1QäwÀÿì_iNO`gvwfv»³oT`y,»ì›QÐ{x§5 ûš™IŸ¹kÒæ*o±×SÙ] Ú»kÒ4Í¥M.§òRñ„º‚ò(^½û§ÉÕG¿ƒwIÓÈtÓ¦ä›Éï÷ËÎ÷ûavŸ¡¬ Œy^›W™¹@eþÊ_ÆÌ_Ñî{ªÌçÆ}¥u™¶Þ#sïhrâêœ%Êô%kùBsW]îÒ4ÏæÏè àÖ}IZîkl«åPÊAQ( @ÐÌ"› D¼¯-x@™!`SXLøZgÄÕyKŒ¨‘YƲHåÇ5Yp½'FÐìÚ”DV·çlè àÄoBkÖB¬âøÅ£ïõUÔþNx÷œ¿öƒ¿Óüi÷aHÕç«;ï¯ï4ôêE?pMQ_íFid(ضà›ûùæ˜ÐÔ_Y©<îJÍ paHò§ÖÃàИd `̪³Ù¼EÖ]MþmM>PäžÎ~F›ºZ(… …ÒдÍL‘¦‹Š´6ûB À~£ÖwØÜ%:4rWY¸DÜÑf-3ùÝTº…·L)È9Ûž>@E >úO42à«¿ œâß9ã?î6d·0°C¥‡TÁF €bk¾ÈŸ ®9ÿj1h„†APp\ð7BoxhCäÐ…ä#Ó›£î†-8j\sp‰ÒˆØC±ðqáAfkrŠ\.!ð_d•^w‡`£¿êB\wr.±=ƒIZs÷2˜BžŒª%²óöØÜr„†K«å¿é¦ÂU«ÿ’Ó?æân9`¾jMú!áe‡ÿ²#0æ9øa'¹(üyoÔÁ{ÃcE8 PtËê†Æ=Áq/wÙQ ‹@±%wÝ%¼p­¹%Šb&Cd÷íÿæÉãÓÈw(yZâ-B“!MA¶PfìÛ§Œ”€FÒÏ•TÑbC¬t£vUUŸ{[ïͯv¥Çö©{KØ¡"MÔaèq¥F¼šˆV ýeé±òô³e©gËÓzö{Š´±¯ÄØSœÖ[ .ÒFKÒbe çÁKã¹RЈêí4Ј,Gdó£}LûÑÒÈ3r€7ÔÝÕ@ mGØØ"lk«Òµ ºÎ*À‰ª•?ÙÆkZ8C[˜=US}{ØÐQ¥ëª&[ƒúÓ5ß~f-¡o­Rt 4ËH¥R\|[ؼÈýh¤Õh:(Ãu›7¡ÒÍ€GøÊ$$Ž0˜”`$‹ÂûSJñƒ Ù+M„z„µ%¼ásê‚UÎ,›³Hf/« ÿl°Tà Ù¤@dÏ wò÷ÿ¨Íùвę¬éÔÜE:ë!–³ÀZâªÌu<qyšÎù;i›ÐoùÞjy ‚rPJCÐ4SCõÉ[,Y‰Ê `SXLøZgÀÕ-R;çTyqÆ ‰ë²*ó£ôN‘IP”Då‡r\½|ìé¢FkVãÜ‘Ÿ€F€.íñÝAŽÙŒ;E$p¹Ÿo>Ï5EýuQ_íFQb((ö ˆŠë£|ã`eýP¨ù ÅË x M ;ÊGÜ¡gy »êj Ü´ú “ ¹BFh ú™zÙåw‚V(b Žúa<¾’ݤxUBÉLJ‹¸k¶Š[¶ÀgÞU5™ÇÝÜ%»o¬ˆŸrS¹¾ ÷§RþŠ«bÜãwù®:ü7<¤“¿a ~QºmtɸâôݰUN9üîÊKÞŠI¸KŽÀ5»Ò-Œ[|pœpòc®®¸;ÇFŽÊ_+){ôä ÀãÑwyüX<ŧOKKvIž.*Mø¶ûÿxn¤ÆŠµÑýŒY ÿ&2Iš"Eµ'9eKhÍêèDH€=ZCäé0õ³#tí[šŽ0Ù±]G™Î*ªk%Zy}g±¥ÊØY£ê¬Ö¶Wg¾_þs^Ù³Ý5ÚÖð¶÷yy7w Í/C†SGÁ3xך5Bwðº¶*D"Ã1‚’I<„ü/:Ç"ý_£‘ieYi™ÑdÍhwÌÐTÎÏñüC”F&ÅÅw7a’¶êP”@%h²„N‘K%ò$ŽbRønj$ð“ŠbrÅv™¾Ú7º—hómz{\ošg²î)s'  ¿ÀuƼ2oîÙ‘Í™WæÜQîÆpA(ø‡£²WQ‰„À4[e2×n9 j;IfÌ©ÌqÍÎYuöeZÒþ•ÉÿšÌ¿­5/“¹°¸¬5Í+Í1,SЉ§À‰p:$TÒBr(… ])ým͸•K0ÇA¿R) ` ‹ ¿QëŒFŒE*wžÎ…Ëœeón*³FérI"ä ‘½Ù…°÷„ú}¾úµª``唈¯TpØì•nMA¤R…ÿu¸¡'Üë}¾:ÈŸœDÃMƒÆ!_Cÿáã Ÿ>¡9Â5WƒMk®lì Šàêôú¹²_ç±Q\gÀÿì¿Q±½;3oæ½7×ÎÎîú\ìõîú\Ûksƒ)…¦áðîììzZ’6>1M•6!Ä`C‹0˜#)Š*U‘ªTU[q„35$¤€ccÌÕ¤•úGãš~mTU ± ´ª`õíhv¥÷Íõæû~¯wÈìŠøá)³­| °ü“ºöóµÑk¢'Cáti䣺¶Ï‚1àDdn¹œeƒ©åAâ²|ÿ)€J(~± x?W=¾(ñþÂð+Žb¨D–TŽos{5Ä/UšŸ„âÇêÛÒuþO;Î4&©À) „.]Ô Ìücúî}î›dé’f"XÖ…mÚÛîóx`äíoÌÞ·ÂáwÃ3‚¦ÆaHµû+ý†6ÏHÌØPô3Ó³¸ Z&OxªÈVg#Š$c·F‹ò¤À\mn¾PZÈ ±o6©(’[‚ÒwBRk¶¶Éó¶iYb0Âq¼m¸·E-ç¤x>úÎö¼míлEè œmÁW\Á[é®ícÎ (þwä’/•’ÉüÊß“y+EÅÃØò3ˆÎQx§8ŽAˆÅ”RI"ðQUeëU™':–X‡dG\~þnfÆïWåMgé5gñqÞßià¯rUÚ/ð ãa!04¦Úxæu›K'ÊóëˆcÌ]5æ*¹îöÝp&õŠkšÿ†ê¿èòO9Ë®éÞqOé„«jƒ  ‚!0†CH…,c+ù3¦¸E@‘kªu±žòË.?€ê?#S‘çø¯ï2:˜}#fßc¨`$Þw0Òõ^¬o닉b=W¡€?vSuËžµ¯mÿñ{FïÑHï;m]ÂÃÑîá[ö¬ÿá/“¯KDº†Â°3î~<@BØ‚F,™ÝÉêf a#¸º·ŠÍs5Æù ‘F\˜?VµîOµ±‘ÊÕ¥ªžIî½ã6´ÜYøºwÁoêÂ6~xiKamÈ“gç3%‡šØ‚,a¨bÕh(y6;Š\¨7ÓΆ§'ëb ÉzGÅæ…KîkäîôÌ×™™ù÷þò–eâ¡Ía^H{Û} Јg¨U AãE† ŠÇÐÈìí }GLî7”]qØQZƒ°À” Ñx ïPйca‰’†`nPº e8ήРŒ µ’²Ù%o¶kÛ ­?ªíNª;ÌÂ퉂dªçãŒeÿ$,bYqö’rU«ú?ÒÈ„«âºîÿ)¾%ù&Ýu«d(™ßÄ /ßkµH ¢DdY”eJ1ƒ˜Y„õ2*Pæg×Üv–_Ö‹/g{o¸|·õŠOoÚ/ð ãa"P ”˜f0©T˜ˆ‚ #~6Ê:á¶2å |ᬘpú?w .ê^h²“Zé—ÿ”³|²ƒF` „áÄJÅH ÉŸ5|îô[;÷Mâ \w—ý‚›¦±Çù¹û¾íöyà5TÍ¢‚gGÜÕo¦ÚýsûãúÎvÇ@Lß½!wgÒÓZK9ŽfÚ` ™U»IaK°ã° X•Á¨’ÁO€Šªª‚ÍA’½$;ÐÿýœIЈús+¡•ùpÊÙa:´šðD戊9Óé™Ð*§¥i/﮲±ßM¥ø²«â \L€áU;f øh•‰Ä𼳋œMǬ,2ß ð© À‹É£¬’uT*¾á ÞQ«ÆÕÒK9¾Kù¾I—ÿ¦§òJvEÚ/ð ãaá±%˜o°È•‰¥kØ&` –Dü¬·”ü¿8‚àÛª‰±ìrˆqÍ7¦—^S}Szp§XÀ  –@DÉìCBZHþ¬idÜ]Sqü?÷üëȶñFp¥ìðÀ¡øæw#=Ãm©ªàprËÑyÄè=º¶ëk6Uç}Ë¡¨nX¡È€mHœàÀ"l ƒ¬B!+.;ÞèÆXÇ5º-„»R=îH¸¶€¨ƒF÷»Q+Ã~³{˲õp ,b‚PwNõÙ`ú5r¾*|¹qÉ`ÛÙ¦Äk¤»ÔÅ “yŸÇ 4a ÷G¨Ÿ”åsí(îñXoœª1ÏךpòŸ6&Ón†§õ q o-ÐZ—.Ÿùjæ«»3wg ‘æÅK€"ÐtDBÓßvŸÇãÀü‚}+]%:¬%D²¢E¶ÇRíþÎÁ88${0˜ÉyÓp¯ ñš”%ñðÖÀ2sÇ`‡ÂaãyžN²–«%LE–W2,‡ˆ6ŽòBhŽ{«¡ï²òo ò“Ù»’©ž{{Ô¹q9±Q0÷²3oR­œÔJÒ^Þµ hÞK9^hyW=¡Y¶Ù0)Ȥ²ÕU!Vbì^–¼$z:hÞOiáfä^Ãk”°2âyÎ^„™_‹Å_zêGó+Æ;²ÿ¶«ìªÓ{I.™L©þ´_àÆÃ4Bˆ@yn‚ Ò=<ꆩE0Óˆñ ½qL/›TJ¦tÿÕœrè¶_¨þ«ZÉu­ü–»©•ƒ•_b D’@*Hi!ù3§‘{ °þÑüÀ¶I‡¿TpP ÂCù²c8Ü mDq(UŠD{ö]{#GÌÍïGûöƺ¥ I(ª ŽƒR!*ÔZ°@"‚R4¿ç}pÄ£çàú $‘îÇÓÈÁ˜uÎptРèõֈʼnÀ³~5§ê\­y<4N×¥M#£ÕÆéPôt0 4:Ó”ø]mÛÖ‚ú*$ÃÅT¹ÁrÏ)ˆçRÇ€¯ù·õÆhCâãPüxÙÚ?×µÿ‹ý2mò¼ãøÿûg-Gbû½ýÞïkûõ‘|qb;q Ü¥ 41‘ÆN|$¡•&šÈTvHrŽŠ6!¥k«µê:­ª6µG„³$ä‚•ueS!û™H]ÿ !«û+Û¯åß÷}ž×Ïûû~žAoÅñ`ÆÆÿ¤u:\P‚ý—[·æ'w¿½{àcú¿82===ûaÕŠ•€²°„€I2»Ïô é»K-o®eÍÚYAõD¹±-™núKmq À®µš{£"ç×Q€iWœß[ÇïÛdÝU§_YDp ªA F£T»&ï7ñÜæZ®fµÚiš£ÎFQ^WfiØ ß·‰ÙWZS¶rk\Øe;Ò¦#}[L®{"µ°«Å±ù¯Ò†I®p\ve¼½?¢FEÏUÙ1)¸OÈAIí™eqS«iB›-RYÈóëµü;œûªaÑ á!màS´–byâ¹f>gœ/fmã:ï¸èžà]#‚{Xt_7ø'”ÂŒÏîñõ0Œ„1‚Rk,*Aà¢@¿Ð²htþŸôÁ©`„·IΫR*[oq®aÁ6.ŽÊ!£FÅáyŸd ÊÁ¬àlÁüi£X‡°r®‰ ˜)РÐlX«cÎpTÄÉ·¢›{b ‡£[ûãMéRÀ@_¢©¯²áPEýþêz…ä4( àÿlcE8èL* –¥æI¶6¬wü²?¶íÝØ/R(Û–îIA0ÚTíýGtES4þ@¡o6N•$NU)Š,ÊXš+‹,Œ\ Å•G‹£gK'K7¼n_“]KKPPÊDs”¿×±êÏűs¡ø`jÀUƒE)Ž:[‡ñŸ/IfžNb,¢[›@‰UK–ÏÜ…ç̽»Óß¡Èw4RRf´ôý•ñØ}¦ÊÐSf>ð"Æ« µ)Œ¤­f]Gr–ҒЙZ“ÀÌžÔ7†×«¨Î8ßžd:k¤–„¹r¥–að¹ÙóÌ‚††Ž:¡£†Þ”›ŽäzFàñ,5ÎÒ®¦ˆqï&ª%ªÛU­oOÏèÁ¼#íñÈmQ]ÍjŒ¢x”Dˆù ”aŠŒê~042!ú&'DÞ›¼U™£z^–Mjz.—M¡œÇ äFÿ¿„à7¼Âb\.˜ÐÚ¡jJ ˜Cï‹¶sZç·Jñh»IÛGuž¡œüËf?¤É Á7Å{GgÆ'ø˜zp†(Fá€|–f1©PA£„€Qjõ‚y‚óè]C²RuŠq§°DvŒÈ…Ûi3I¨é–ý€A!”ƒ X!Ø‚ùÓF#“¼€ ÖL€$õ¥à¼‹)=›Lc1¼'ÞØoìÔ÷¥O=‘†ƒñNü`Ókºç4²ŠP²ijF'¯(y Ò<÷ºÀ¢Ÿ-Ý,%¼¦ë¥Wß®l|;²å`´ñÐÿJ#½‘¨&Ÿþè–îªÆ_½6ˆ(E@#ûÇBôSÅÑL¥íñòäÙ@ -Ž„£‰ãþŠ#E‘¡âäÉp| ¸ú¯%ñÁE5¥ñ/B‘/Š£'–ÔœUFΕ&#§Ë’Ç *à3”gž˜9îPøÛ\yö™éû4rïÞÌ÷$wîÜY¸ O£Rß*zCÆc÷™¬ƒ‹-^TQsfiDt/”ÛúæXºéØ µÄ,-IC{’íLÀ«¥9Áí«Ém®•Ú’º1vy!©B ;×e4´$Ù=µr{®£VÚ÷rÊcu¢C(vmHÙQ-v¤oLí5R[<ÝñH­)¶"G9œÂ´ª&F¹!‡†%{ÆÛû#jŠñ; <¬N@q„äq D]ªÕÁ¶q½†üÒø†±]’sÏ­7yç5ÅqY³sßÖzÿÁø®ÉÞ+¼uT°Ü#¼mœqÜäR„3¬ó^Ô{®š|Ÿàcêa4""¸šD³(.š^…U¼©}‚HˆV‹4A„(üodþ¨És^g»Åù¾b½ ŽaÅ9$ä—k0Š¡ÔÊaÚT AA9˜€‚-˜?m4rSÌ =0Íïšè™¥‘å” Jhà‚ô&¶ÌÒH¼)m0ˆm{«ª!…‘-Ý•õMk#¯ý4v ±¬€R€àµ/ÑÐr(Ò̰?чðãw#)¢è»ïâŠ4Ï ðÓSYµÀ3ý6U[{c[¹ºR@Hî6ßlBÊ Vf–F.ø£Ÿ—D,Šfœ)Š *Η%NGþª,‹ Vú+¾ U],ª>оôé’È¥’ÄYïÆÅ‰Ï–ÄNÇfŽ–fžÎ%Ý §‰s 4rgæ{(rçMÃûô4MS(‰eÑk7{ÊÊíYaî^fé[©ô,3t•[º–å(·v­°t—ÿ_Šë/PzV©‰‹(C"´àÊ;«um•é¦ÿäoKXvÆM;cˆCÁµN’³É´çSkmNs­²#nj¯[ÐR÷£|#%pÆ9é0™:넎D¸;ÉîMœ˜ölJÿÔµÜ?¹€³†¾Ç;&9dtÆÛû#ê‚ÎwNHžŸK!Y§›GB#<Š¢aûDñ|-ø&8Û%Á:!{/KÎËzï˜Tx› ~M¦ä†1„[0*º.ÊÖÁÿGɱGrÒ…>Æ}SÎ^Ù÷ë>Æ{§ÿ˜¼`TÎÕ9¯pîKFß”vá½å6k¿*äÿNtuñ®ÙüwDë!ÙÕ#y?×:n® Éùäøˆ ý^Êý·õòÎnÅùgýJt_¬§ ®ýŒ­Š3,¡ù¤¸Ñmg Ÿ°y×uùÿÖ:¯+ž ¼uLö]1ù'iǸÉ7ÁÚGxï5É5&9®‹öÁ~C \‘J>â Sö—I)$КŠjåí\ÎaÎ1I‡ÿÉ9þ<ÀZ'©¼[’gŠ+ S‹á8I (JS$ƒQ$¦zŸÏegix ÖMÒh6ưè§ÿa¿Îž£8î8€ÿ©ÂH«£§»gzνtA¬öÐj¥Õ A@Bpå—´—DŒƒA²$¤RIqc;®ÈÑ0W¹R©8•"ÉK*˜ÃdlÄ¥›Ã\ŽìÂR~‹WÈ/`TßšjÍNwïÌîöïÓî(ÔÖ›zàšòDîšð¨£Gr‹ž…Á8A”÷g5`r‰¢Ì¨$X’ø]ÓÈÿË"ÙÒ°€1Ò$Úl‡R~ ©}²íaUÐ߸ñHfóû©ŽéNà4f6 öµtv­^íC‰ŽÃÉN0C_¦£'“U˜¤»ycw²íýÖÍÝ«ÖCÈÃÎ ]ö%ÚûšÛÀ3@ùl]ü2bDA‚ÇÁ¿1'v¬¦ùtmâñ—ÎV5ž©J=0ƒɳ±Ä@EâLeræÌéxr¦ºåY ŸUeÎU‚ˆ’Oãéó•éÏ*RçÊgã©Ç’Suk*~E¡L’(&{_ÿG¾†Ó÷¦¦²‘)|]‘Fí@q~_Ó‘îß{ßÏR¤§ŽE}Ë ºH|½ËžÊõ6”t½(¢4UTÔî=i}wÓãÒˆ{[’½ÛêÚ•vPÑÇË’Ý~Ÿ´½YÛ™öíluíY£ýnmáÖ„à·‡ˆ„¹^{GÊØ€IŒwZ½ÛR4õ“­‘;¬ü²'8ä)íÖŠ5GîsLƒQYµ\†ý„ßbøÔà]+~ÛŠi¡ëFpÄò„`;êŽ~ê.ò…á~áUØÏÂ]JA>rhbžÍ;1ËqIœ_Ì[Aè otÌ]zÝU#Ü´â7õØ]-4n/ô‡~¡ÚÄÁ„Œr\h–ÉϦø¹=Šo æ2JÀˆŠD·˜3 ÍòIĸ ò)ï¢íúüÁ©J¼)ˆŠˆ !²,;©ÓBÎe<=húãWݱaÀ€;2n–ŽØAh\v‡‡=‘ #ô…^~ÁÛjùË©XÈå¨NF¼¢(~A)šå0ïQ§"Y’ ª2D rvH.ÐÎsÁ¤+tÁÂíÜ0+;ˆmbQ•a øÇSü*qýQÈÈ!S”¨& À›g™ÉBjÎhDÇrOêÍô'6>¬ !=«ß€F_ÓÆÃ­[ ñûŸ¬Ë*eÕpȑԦޗÖIvj~sÿª Û²æijÛŸêÈ"Ñ–¨<ì¤ÿô½? •=&Ûw¼¦ð‡%‹àDAèØÂô@<ñÏÚÆºä@¼é9^Ÿ:QŸ:UŸþ¸6uº&u¶JdòL%TÛä³@@tÕ&Ž×%!Ý<±“‹2Çk%u¯.S à3ƒ…–šiÐÇ7Ó_ý#Оššúæ~j¸Ò.òùº—?)ìYGï _ϼÝËÝï.Q¶UI¿Œz;jžÊ¯«™û³¥HU,1oþîŒúöc¢È® 8DÝ›¶w¦I±Û%)¢$Aø%akïuGÊûÖ+…?o¶bc ËPPõ<×ö$h¤h[ŽæÛ­¾íi׎GÉ“­‘Û,2î ]6ü] j‚#WÕ¨¤2Nâe’ýYååx ÷Óß3JN[•—¼u“fÙmO|\ë%7 »¹ªG®xb®Ø˜µ+Ž™óœƒœ2¡N…ˆòy(úп橳#—¡¯/>¦—]7£·Ìò ùµ+U >+0IU$MW1(ÔùÒ¿£WÖ2F X/2užÔKîuVx.±f#B0UDxð˜`…a5ʹŠl½’á^cþVõ¨VrÍœ´K¯’²[Vð–™0+{Ì’¨A9ƒánQž¦šXVQÆH㩃B¯:Cd>QޢσC.¹K'XÙ""‚âd"«Îý@/ý“•±#Q©†E¹àœtU·vh̼¬Æíª2Ñ |²$ Þ0,k ᎲÐ+€ǨÉŸiä1kä`ËæÞÆ G2›÷­Þp8½ LÒ×ÜÖŸéì[»å×/¶¾¾tes|ékKWþæåŸv¥ÚöµtÌlêoÜx(ÕÙŸh‡Ž2›²×'ÚvÞÃôߌ0Ã’®Õë¢ð‚åh¹V|¼¶õRyËPÔtª¶ùŒ®ú¤¢é\Udòq¼Μ¨‡âÛ|²:ñ,ÁÊÄ`Uê“êô`MúLMj :y2Þ y\Úù°>³Äš£P"È’HðôW÷¦ïMù­F¦¦ïÍhdjš‰Hå³û¦3ØF=1þ¶­c þÕ‘Û"BóžÊp:Ïùu'`†U‡}ÅÛÓÊÎG¨þŽþÛÖç·µ€F´•5"/(ª ›Å)rsÜù‹*üuQÉkÁ´Q(ÊâÖnlðîn±öd w´»RÖÞÿ®l÷ïšFƬа'4©íŠ:…å„DâÍ£ð$º"bä!Ó)Z˜ò ±÷És‡ôø]½úŠò…¯ÚáÏÕЄÖ£z鈫üªU÷ºYˆ §Rf9™ÏÉÕxį'ùãr%Ðås7#óËÆÍЈ=ÅÊóe,å ÒQÖD—í )êqWMºÃ#j¤ZfÅœù=Er~ã.JнäÓ-¨û¹²„ˆEÜà‹C&O8Œœ£Š*•Ø «ì¢wÞM30b….Áìzðºû•V¨ŽC<žHòK*åx@ØÃ¤ Ž€( „I.UÏ­¡Ö9ú/otÐYL(¦ðª"0ïÇ *AŽ?¨%$14N‚ŽlDsþª‡F]åÀ‰ëÞÐU=ô3HäÙš„5Ä0¬X*û7ûuÕuÆüµoiÁöÜ{îÙÏÝïÌxÆÆxÁûŒÓ„ ¦K¢.QŠª`¼A QJ “(BU[¥!TéC#pYC©ªJm¤ö±}ë&µYêÈ› v¢6•šŒû¿LÒ¾ðò Ä£¿¬«±ç^Ͻç|ßïÛ$øùhð\Ø*Œìê1ç(w«©d³Š*ñ˜œ™¨häôÈþÛUÁ±¡gí;³}"Å̶}§w¸qícŒÜ¸qmié:Ž–n@#M÷/cŽbâ®s¨pòÿ7…DBâÝ“ÉfX—z‘ `RªmyéÉÚ#»WJ#úÇãMß ŽŒm3ùD~.ƒò•W>ìáU_hšø\Kä0ós/ _Ù¿<„À$prG—¾»5r%.½™m‹:r÷ŸÔ-9»f²B7í°»)mw¾4!–+qªÏÊx¤N9Ã&Á7ŽËsqy>h_ðÚ“Îù õb®k.,ý6jOLU•!QµvÐtµ®æv›oDýWs=ÿòÛ/fÛfò-¼¦‹¹žª‘*[(Í¥r6FPÍ3¯Fé©.ä6\ »ûbC¤´• °YH¡hövHi‡­k„e”§L(•Ë©qS‚÷ W$*4^õšçò}ÓQÓ‚¿ábR¾ô¼|/(µmYVÑ ,Ëme5ÌÕBXU8Í- Bˆtoz´úYS÷Ǥg¶Ðq>ižóºJ± /¹ Vq´T<½;Ö¯Ý W¢§L–ù*â’JáàÊšgXr5;ˆû<µþÃïûŽŒm““¥P*U…ú®ÎÎæûé·FÌ!LCA.N‰o°ª‘›yHÇ>ª$Ãcdž÷™8»ýÀ™Ñ‰ÛUÁé'Ÿ'Ní?7’¢bjÇä“<Ú­sáÀ'–7å< Ã@”ŽQø-þzùÙögG&™³;ž¿œ?> ŠœÀIF'ª|aˆVX« V›í 0Ûà–|oD;BÚ ?±ÓP±C®O´¶%b°;˜ÁÖ@íëW$ޠޝ´[0Œ,_¿±üÑòÿ^ÐÈuä¦FPBLqŽƒÒgäÝŒB®¢žpÐ/]NÍHE¸"èž÷d ¯ªñ¨GfÉÌ£¥ºúŽ_ܹR Œ_˽<cŸþF¦ršbÏu]P$UŸ‰t]›‘ú¤¸ûë ‡w‚ñK£9 äG;’#éI’ÃcŸ6ÌGÝç£ÎE¿ŠxϘI³Ë>£îÃ@Šv¬•Dî+Ü:&cÊÖj31FÈgËÔ:5¾]è}«¶kÞo¹ìµ\Êu\ZÞ÷»óÐ,3yËpãø\xâŠÌ©°u:ê|7hús±q!j¾@½ÛtàWÕôô sIÆ(Ýìó¿$å¿ùrÔø¾_þ¢çjbH4kã9Bdêú51ªf ³" Êk‰…›pŸ ¹H£½¬rœ‡Cw&×·´[ß ;®Dýð76\Ænt|F”% >E8¾OuD‰tª\E²Ô1FÜG-O¹ÏHó†éœ/öÍD³QÃ\Ôûeé‚ åØ3×!·_÷ZÎGå_„mœhDIîí$Îß²—ƒÎKqÇtØ×K)jš+s%ªVTãü>hùk±ôº×Š{Kå‰TA†¨U¬¬F¦FöO=±÷̶ýøø©ñƒ‡ojÝ jSúªCÇ'5ŠçTlò²/<>ÀœüÖÞ³ãÏݶ„xm趯ûÚ𦢑3£“Èñ¡}'‡'°r0.QJq 3ÅRö¸2ÅÕ-#èÇÁÃO‹‘Š™›Q«AÊÅ2 Ez£˜ÖÂõÙÊõÝòÒÝnª-Ì )A®//ýçÚ'Y^JßHYbÓ©m©Š=ÝYwWD–ŠºT';òº£Öí*ýŇKëé¶n¸'omô·vb€umî.:ëÑÊ‹/íZ)…WvÕW?x"lO<ñMoKy‡9‚bÂMRíH.ÌÆ¶àÙÇÜWv‚{Ä/á85ɧR#3ÙҢߵèµÏ„­‹qùïAù°©3ÐçŒEjmT9¾-ŒÃQ<}GJYè¨LÅÜwµJ´½K…ÓùûÑ(¯†åKÅÞÙlÛ?ÃΣ¹†Hfª•2:UM”£[MøNÔ{5ìžÏu¾¶] º~tžåVSôaŠ9ÆØY3á³í³µm—³÷oV*oÙk¨Îv%scc=ÄÔÑ q&ü“×wH7uH 3£É¥Ò×>!Y]u!ê_ˆJÀÀù }&îÅz.ÖJÂZkkðjk­çr˜ç¤n}ÛßôVüÀIÖü?ÈZkÇYáB\z³®g6h¿â¶\*v¿ôoá þáœ@h¡­™¶~4M']ïDýëqÇ`…£Bj0˜[? á®®Ù\ù„ß3`_á±¶Ø>þ±7kÛã¶¢€ "SÜPêU#•<(CÀµËojdâÄè›$ØÎ<³}âøŽÉG6ôJËF†>WåüúG;Š-yáY–Eü裊@>~-ݸ¶´TÑž,%æ‘\S}ýO·ÜÉOm®ÿ/ûåÕuÇñÿúggj\öqï¹÷ÜsïÝsîcï. °o`Y@QSŸÁ8i&*,,, m’Ž ’0}Óp4m䡉IlûWÛ?ÓÌ'5¶šZAžB˜¶ñ/‹ö·ašÎtìL°Î3ì|çÌÝû8¿=çÜ=ßÏwxSîÀ†¼¡Mk7zOÔX§6'7d~CõæÖ¼ãÏ)2T À'«h}X4¢õ§¤îô©mÉ>Ò”Û»Oëi.îjT^Þ©ÖVi;ª”æ-úOê}Gšò{÷³¾¹/ âíou÷4êÝ™c³/õ@¥o·Ê§YôºœõF.ško³²i5þ¾oŠ,,Ûx§[@«TdsKÌ)2.K†"*°eKˆ±,¡xUÖó*½î)Ÿañ1­tš†>•ü ZUM˜6õØ ¦©¨qàÕ<ãFl^‰Œšá)Zú]û-ù ÊQËΈ5§ƒJö÷X|žÅnKþ š1kÂ*D<܇S@vÉÉc^Œ‰Êˆ[È8µgAÉ¿¥W ‘µzB´«*Übׂ¨¸4îÛ·”õ[¥@\`åM?•UO€è8—Ä­V^Ľ$å³’%zź–ý\-¹SÒõ+´üÎxâfì Á²þŪ|Š(º=cŽ.™§<ÎÉ’¿£Ø~M ®š¡¿©•;ôBÃÅKN—é”Q]%Ú± 8¿¡§°SAdÓ9pœÉÙ;Xp^ LêþßÊÅ6ÉÉ8aD9¤"¶B#KªéP‘ 79]×q*q`¹TžK½úöÞv`ƒÁÖÎ|äÆg©¸³Wv5œl>|¦®ã\²³k{]±b ÄÉ’–…N¤½›ê: üê–8ßÐù`4-‡d°¤ñ¬BNYbØH—Ô/Ý•Ž=ûft×phÛ}5Ý>Ør&´ã÷ñÝ#ë“—ªš.Ç“WâÉK•+ÊèƒêÄÈ“‰ ë\—¸XY©¢þÏñúˉªŽFÖµUË>^äa«‡$rçÞ]`ÏïýóK¹s÷@ɽÅE™ãeÄ9±Ë ¬ñ ?½¢¯¡r†6fl¨–­ñšé½‘FŠzÚ|ÝÍZO°DïO±×²{R¹Ý)=bé”Ú—r÷·€´Þ(êK·f÷ï7»SÚëMFpH+.–[×›nàw”)˜0;dç9OÉ‚Z6mù6þU¥•̹Ã7Õà -ž0üSft•ÿ—}æ‰\V s3Á;1ÜHQíŠ(Š:GVaQvðÑa؃ГЃ'~Ó]<é‹Î+PU€ø,Y†´)¨‚D8›Hù¥‚1cý§4Â\¤QC,‹Ãq–‰ ²‡”DÎ+2oVŒkÑìÐ Û@X?â„’ )œâ ¶ß¡ìQ£xÜ(™¦àÑ¡Y#x•EÚæâV‘(a¼B\NHMç5ÿ‚îŸfE7Ìâ9WGÄp Lˆ“LÌDäzÚMFµR˜„)%0k–€éO±Ðœ±4-á/1à $$*NÄB&™RNÅ<žà ÓZð7ÒZ­Öx…ÀD‘ÇN€v.gW]õVå"^æ3ÁJú’Êý Ã#ð <@WÐ!t ÿ/i—³ l‰YŠ„p_áä ßWÓZ†\7©'ôà¸=>ïg Öa€0“Ô…Ïîéx§þ`Ã@ªcÙ4Rß>ÔÐ0\ß~¨¶0RD‚âDÏ–× 4´¿“|e(y¨ãÜÞŽkvºàM1³ñ¯ìLÀù¡º§›:%Þ®_vÝÓ‰ƒ§7fZ`’3 .úѶ:™%”YÁä–TÑxq]òÃʆ?U‚ñ5®èë¨ò†RËK\œ&)ÄÎ/Üùˆdš;wt"cÎÌ{ä¶»¢û*ïÔws·ŠØ¹D#’¿h$C‰FÜé¤Ò›TûšÔ£ÍÚ/÷é¿Ø§õ5³îÆìÞ6oo›Õ׿éÏ´VºÕûzÊw¤Éz­Ù×ݲtÕèmqw7ÑÞ”ylÿrëZ= é¹*"H FFƒ4¸ÀâLèáY=z“…çôð´'rM Žºý3,zÍ,žÑCŸñq³ê´ì¸\X«P…ØÖزçpR…bEŒÀ.ØØ%ž|O¢·”ØŒæÿ«74åöÏkÁ)À\9°`•—dääQVµ¨Í¨ONs¬àw,I Àˆ‰¨h. Øæõ\7b ¬lŠÆ­à¬Rú”D#a@„`že—Œdûûrᤘü7Ì™¡Q½äû’! »Œeðh•—!¡;ýŠæôÀ Ny‚]’ g'pn™C‚Æ7oÿ¹–÷w›gÑYï×À¯3ÓrݘYâåÐȇz4Œ3%0Æ`jÔE(r'9ôˆñ.˜(  _á "ùX‹þÿ4"cÔ¡äL‘û*ƒUF ,ñœ…%žÕð‚sô±y?7ŠºÂs€v”—Î&ŸM:SðDsûPÁ»û~|b÷ËÀí[_ÐEHr¡®ÚÄ[{œÞÛ>˜:<ì8ßôj×–= ŽH&'ulÛýVsç¹dçàžžN-·.àÇ |t¹ª¹ÌëƒÍJáEÅ)ü7,Þ]\’»‹áµ…ðçåE^ÍÖ¹í®è¾ÊÞä;±—Èqš@ä¢|«¯ÞL·<,¡é¤§7•ÛÛêýY"秉¢#ÍÖÁçéKµæ¾/´'Ho{FMn_¨ævUrÛcø™ Z»ÎØZI«£rI¡̧Á‚åÖõ¤“4±)C#F’=ó>ÑâSFà‘oã_Qczà†žR$~7iEƬÀ˜å_Pƒsj`BŽy"7Œèg´l\‹¼gµ‰Ä‡lÞ Æêâ/‹D%n;r‹Ž)gþk¾ð¤œÕ·Õ±_§¿QœwÀÿƒJãÝÙ9žcîcw}!¶×»Þ]ŸBb쀪’ßG Q‚±1F¨QT•Òª* W ÄI oÛJ­TõECTÑJ%Ûk{×A¥oR0éw M+Õ•¼É¢òú§ÑŒ53Ïì>Ï<ßÏSwÐ**”®l‰ DAD¡Ð…_±*ÀàžÿßÎÈ/¸ ±˜„¯—„ëáä=½öŽšl&Ãñi^ pÎu…ûhQ˜ä\þŒ„õâ'5E8‰i7~Û«~S‹R"@#jˆ©å "Ÿ•ãHs39Nîeºâ'€"h>oôb*?…¾ä‰iÓîŒG‚OUßr·œx&šÎW#SNÍæÒ zâœI§d7´F EqˆÇ£T"4ð6+ʺÕO¬E‘p².*è¥8mÑÃ7²PÖ¤•xäÔŒ_ö·ÄÚA=CÑijˆ\îB¦Ø1x¶³/o´öãÚ íýÐÈÀÎïyL‡p¡G›ö}Ô5t­óØûGÎuôtõmû.&¨~Û <´«׎t½ØÒw¥÷Øù¶¼´¨FŽ7µ¬häÙª›z®g€°‚Q­€á|WÞ*ø¨óèÙ–C#û¿ß1ðöÞn½PÂ=JwÄkÚöÆ­ý—[_{í­3m‡šbµU$•᜽|àrûÀHëÀ•ö#àÊÙö'Ñ.üZ#¸ÛŠFžÅú¬¾s-ÖDÈ ‰TmˆÝ;ð÷ð±F°?ÿÕW_Îû‡»MBÁì -{ì®Ô¢µöÂwJÏ5³u–&ùA ›–ó“}îÉÞ§¥ïd·6ÜåêU_zaµðÖˆ®L%¯<ñƒi¡ˆ(æj Ä *FÀ_!ž,™*ª¨ÓÓ4ª-DR«²ŒwÜç! þ&šš²S³,áçf4>áUÎéu[UÄ=±%޼V¹¦ ªªf"õ9³É8)_#fŘ•ê׊˜"0…Q<‘ìkìüD‹}©ÊšÕà `ã©EU%$a𨡫ouÓVðð)b%²VÕ”V™Õãsvj’Wä«‘œ‘¸^”Žó üDd¸H=P£Na4Œ“­T¼e§²^Õkg¢°ôk%ã Ìøïš0«ü²Àžî€KЛË>ð–X›ˆÅ¥à Kìlב_´‚F.tôå«‚‘ŽÁz† ‚Kmýïv^OLœӠؾ¹ùÔ¾ƒïõ9ÙrðåôL‘²¸]üóÎ>8äãöA\Ì\êz2@ _kϰ¢‘g®>ÝÔåŠX<ÉåÛ7ny° kdÞßààÁÇ»w4i ËYöØ]©E«ôüvhDELIÁ<€ä‡FÂÃûŸ–FÖžèq‡{ŠÞ9îmêÄüŒû¢ÉÔ—‰BȸÒ6p¥g¨}c#] xH¶ƒŠW¨D%v5ÆB21ú7œs±÷èåÖþ_vƒFÀ T¾íB +ù?¨ë[z-Q ²„ÔxqûÎGy¬|î?|8ïkÇ/6úá"ÞyeÙcw¥­â³[‹Ï4²DáÅýµ"÷NµFNxZ‰ü¸»èôþ’ÝE=ÍWB!ƒRÝÒyrO¬g±µ¬¬„V”ª©çíªÂÛjÝõnSƒÙ\ÏškÉžý•­Þ«»¢÷æÛ®5Ü­ ¾ÄEÆ‚ŠÐÅÝQ¯>ç<3kÏ -9Ng½ø´Q1ã¦?-m8n­«-FôŠvÝœS—±â7ݲÑHb2R3i¸ãÖ_*N>GflM¤çvˆ ŒZŠøOöëí'ŽëŽøP)jÃîÜÎÜÎÜgvv—sÙ { 1`®vRù¡Jk0° ŠÔ¦±±C©•Õ¦æj'l/ ¾æRKUûÒªR«äÁQ­Fil`YÀ;nÚäÁÅÐß8Š"U~0*µjé§e´Ìœ9sæìù~ÎßÄè’š2"óR匕øT ϨÁkzd¨È"E$hÖájAÙ¥˜ CÉ籊 ámËrntC ç<‘œ^6§–ÍiÛŸ%Å̓F$¼SFé¼9­:œ5â³zlÁ(‡ãœÀ>Ð ë<9VhÂå¹lÎ Íë‘Ûr –R¤5p)œÀHú­Xú# …‡'½aÄsJdÑŒÏZ±qñub½™Õ* ‘‹xÇÍ+,t…ái,32ËÇ †-f¸÷¥È”'² ÄA#Ð h 4Â#ê àÕ¬kÞŠ)O|ʈN뱜ƒ¾-ªŽ÷6}â=dÁ†ÔÍ“‚ DÌÀÅN¦w™hyÝ*è8’¹ÐûêÛû¿Ý~d¬óG O‘Jq°~8ñ8AÀ¤€- L×z«ô/ô]L=·ï£ˆî Ý“ûnˆF^mÝûD#W]ÙÑ£Ò$¼/ØÞ>×ÔæhäÞê×¹·voeõîÚÚÊêj[S‹ÂÂæÁîcÓc÷I=° 2þÓ­\Ô«PÎ å(ÞÙg§6J#x¬[=™’;}o¼(ÿ¼Ý3’´îE;Þm&½Ã½¾¡^Ï`RìQ†zä±|ꣽÆXŸ6’Ò‡“æh/”1²îþècIóX'hD„H»¿K ÓVõ‚Þôeü!kFMÌ™‰œ\r[)…Ô{“óÆIú˜”˜§IæGjôŽ]0C3Vp^ Þ–#Wq¤™gÝ®oÊXtq”ȲJ>x\ƉÓFå¢UzÍ._ÆU³j|ÙŠƒ²FÉi~›K¤’(7ð\A ·Â¸M‚C$ƒ$4âÏç>¶›rj1hdY ß4"KjpÑçÌš,énA¡yV`·² fÌä;QC3_idI Í+‰£Ø/~¥°’H¸eVxK.Y´‚Y½ì3©ôª\á3Ò„Ï휃HŒ8>_Úzù ¦çÕò#6-‡²¾Š«zÙå|ü'Oéz5’Õ·/)Ñ)¥ZUx@‘ˆ'ERÔI™ óXL2<GøŸRíGvø–Tùh‘Ì;¿"G#C¾ÌÛ—•ÂÖ»²÷WØþàýƒTxU]3˳F4«=6Z†ßT¾älH+=Å÷;ù~©>û׫‚óûû'RéŽC ‘w÷O K¾6ü.`-€ š‡€hš.óÆöý`29p©k1Ñ~D1ÙÑÿN÷Ñ'ùÿ¬÷j:†t¶ˆÝÝØúŸY[[]]½ÿg­­¥dûe¤[ìñF3ÓàÍ4e·M@î´Î6oTªúÒÉÆ@¦¾`|§çL›7ó<ܱøT½¼É?ÙbgZ¬t“uºÑ—n.L·¼éœéÏÔÙ æD½5^ï›h.šh-<µaýy\ÊŸi°2»ÙJI!H–æEAöÿô€9Ú½Qч»íÑ”1Ø%ý²7ð³.}°Ër¾ð€@¬‘^c( ذÆú¾´wÒù¯õÚëx—ÏI·4Ú­®û¾öHÀF!Y˜©˜êX|[®Îé%›¾Œ?¬FÌhÖÏ*á›ZÕïùÁçƒ1¼n™d % hò;œr~"оO›ÍónÆI|ž—)Ö ÄáS˜&Ð{¾HÖ®Ì)›ñi3š3b7´Ø´'ø®Š±Iæ+¢Œ Ä`A&i bZ ·ÊÓØÅoíÑÕ;bù'ž`N-½aÅæÅв§.¿®WÔ ˆæ]b‰i!M’¼)U,ëáÏqù-9zBÖÍÕGp ŸuKâHZâ$‰ ó–^z]/›ö%¦¥Ø ½ªQóØ Å <†tÉ\©¬ümŽy] Íʵ3Ò3i­¬™¦KÜyÍ–ý…X>WXùYrK ÞQ#ÛÕuœ°³Aó8Ŭ¬¹é_k‘Eüƒ£Âªœ´½{\¾(Ì q Ã>½UDˆU‚2¶ýƒ }¡–ÿÕt. árhš‚f ††g@.‘+_d1ÃkHàYä–`‘|`1V Xâ²›SâÀ›¿‹ÿsZΚÁ¥|A¯ZÄ ðÒu3¸d$®˜HmÄq0 Þà©Îƒã]‡A;ÖG¨ G@Pp<ÑÑ68Û3>Ðÿ½g[ÂVË:ï4ªû_ªÛ3Þéhçl§sòù®W à @òqZkïÏ´J'_¹Ð~joEƒÌpSš%χw°£ûÏÛ;Þ¯íü°jóc÷I=°®Ôt n—¯Œ wïzneuíîê½µ»_kdeå¾PþµÒÜØ„H²p8ÓâË´z'íñú@fg ÝàI×›“–ªÅgZ§êíÌóR žlQÓ­ö¹]Ú¹Gi JCÑdSád³=Þàoôo32Íúx“çlÛ™&Oz'x$³é<øïkÄž|^xÖÐ(4±¢çÇ{õ‘ŽÒˆ6Ô®]Èo¤JÆ^TO¦”I >‘ÂcIåD¯6’ì¡”¸¯ðxRëñŽõìåö×q/ÔÚ?Üã}­k½÷õŒöiÇÀÄ£/ñb /.«5Yã±ÑÈ’Tú©]ô×þ–  »¶`§9Vwcñ[82_¤xÂö§œ›C¢ QÖHžqCpÂöŽ‘\î2NüZô‰¯bQO,Šå FÌAŽV>/G¦´âE­ê˜THH”Œx†p~§B2MÀZ,QŠJ‰<ŸwN)žsúºiDìøŒÎ‘9©lN®lA¼Œ‰¡%–ÑhâèÈ5#ñ—³_ç±Q\gÀÿ¯Z©ÞõÎÌ›7oŽ7çήwmcì=¼»¾ðA øÀ(¤­ŠãõŽM¤æ á²1½¢„B ¤"özmcÀ"R›öŸJU¥üÑ*mQJklãƒJ[©ŠBM¿e«ªˆ«VŒTìO«µµï›yßÎ|ßo‚¥"óVÀ3k„ïÐê×øB‹a¼ )Ê 1èÑŠ<Ü/ä KJÙ´»aÄgíø,©‹°y_Ð\†jðœ$ñ4À) “/KH9Š\Xpq&çiq$éÈFõ=o›RJ&íêoð²íá)œaD%ÄŽÙeÚ¥,/j¡ lÒ¬:¯„~7)`¥b7dY…Èæ:Ñ$üϔФ]Ò£× °ÂrH© a6íÃ-ÃÆaûP(ÊÅ9N‚:çæ$¬ 4%ó'`ð¸ëÑÁ±¶ó 红E'ôÄ„6"k~á}šFÔÊoê û¥^&qà«ðdW¨fxßèþc0Üa ¯TÃû%À$ÀxÍýy©§¤ýeøÏˆÓ›qŽŽôôBž98Þñ/{ÀÇ àýE§"ç“$Ét¹œêƒ÷ƒÝÙä “½U[(<‘ "häBdÇ ]Wk“ï6¦~W\ó±û$ïÖ; â ^€®ØÒÜ ÉâãþƒOhdùþ?v=µž8r žk)|¨_&kƒ`V#M«¨z© ¤Q2¸µô|³õrÌxv}ù÷¶–ev›™ÍöhÔzs@(0ܯ¾LcAf§op»ÿÍVÿ@s` ©h¸¥è¶‚‘ÿCl¨m…Ïé$ï·¿nühßjiÄ{¦ÇwÊñŸt!^uŒW÷Lìïwøžßc÷ì´:·i{6ѦJ©.‚cÅ8Lê}ݱN$™&,ý²KÓèú£í+=®uº;pz¿ZèWd0|¡Çu“ÖÌØ]·ÿ´˜Ñ‹ÿbVüš&Šdް9Žóá Y*˜d{¦„pqÝqóù0Ô<,1¯éÄ„\žÚú)»rÁªº-Ån+ñœF@‹Z|ʹiT^£µ _|öW#0$9Á¸ÇQÈրЬV{Ý[RÃ3JdˆNX‘Iä–Y0ëv J™,(Ãh,QMàó–´Ê)£xÆŠÌXáY;´h”Ý¢ýbAöù–a‚yA¢D`~ª–Ü¥¥ÙÓçx#pVçˆ]* /²ùºG3‘áFÈ'I:G`¾SAÐ6Üœ—æó%%\«nû6Þ¡a8n.RŽÍ—EÌy`Öç‹’Êä¿-o×Íie÷äð”/ {yϨ² cå(O°¨H ÞnÌé牻JôÏ´–ÀBXI $„´¶ ‡íC P( §W*Ô¹| !tEG‚À¡‡&Xxt°nð?+#çëái31i—Oùbk~á}ò:´ÂóFü–U³¨UÍxcÓftÞ¨W‹eØ"h ßL4fÁàôf5’\ ²IIx€Æ:¿Õ}ÑJ­pä«öH›5Údd6ùF·”¤[×¶” ´”¦[JÒÍ…CMþá­à–5çÁç靸‡ž¢{6h<Aö>¿Ë:“\-è§ßÏÿø[ÁW’r¼xA•°”@7ƒ€‘— èÙ)K$˜‹ÖëNa_;B¬_Tt–G;«Vz\ólOðd7ðFÆŠÌ 6fþ`ÔLÛÑ5oïŸ1þ®Æ¦iùÏ *êU {òB*|5Ÿ€(Ïj§³|q¢€T,ð¢(Í‹ ÁÉå(ú´^;§'”8PioZñf9$_ÒcÓþø¼»§Õ;‚æ’= / ¢âÉå]xöëÿ›Ù0e”Ïi‘;öÆi;1mÇnØ¡9-4ï­o•L,ª"‘l7VYI Vp-Ùõ·¬è¢·zʈÌá;ZdVõ‹A ÆX„/šC<¡àÌŸ¨¡¿ªñi36ã­œ3#7 b“jü­È¤<‹$®Œaã2Œ>žçÀjBE&\Þ ²yÍ®¸­E&ôÄ6Q60\?”²º“[¦”Go«á»fbNÝÕbSvxÒ¾£×´ótÊ÷Tä4Åa¹Î*ëgÌŠY3ô'od XKÌ,‡$ BZH[†Ãö¡P (”ŠsL.õ1(×øÎVeݣȈ<2ܲÀËò:…ÈØ}E /šUKztÁ|ì´ °œ5bófõmµbÊ Où¬^yZ @WÇ„Pw×µ wQ€F+VÁsýí.§ú®8ý;vÊt¼ÔÓŸî<4ÚuŽ'{$ðÿÁ}‡º³P€@r&KüÛ'+‹To¦ëÈÅ}Y‡@Z Иӷ=R7L+¸¹ÞŠïþM]òZm×{›ßn\û±û$¿ªORI€{1hÏ®=}|? ‘ÿÆÈòò2hä;ýÇ)Ü,4QýAUà|3hÄŒ´Ò[í¾‘¶Õšªþ¡f@dŽ=m¿ØèYÅ…¨fª†˜˜l ª/ÕÎí.ºð´?ÝZœn-¼Ülg¬úÀPcáp“°ÑÜ]k|îÌlö§Ûh{TBh’0\,§Í>ÓµZ±N¥Ô³ÝÚi§ø5SQu1&Ã+ˆ‡[>'Õ,E@&†ç,•ƒ !?LzK‚q#€—RÍ+=®q¦ÛÒáëB /+Qæ³òa;]ûÿYâºU9§U-Ù›®3å–å“9Êb^XÄ‚LþÉ~þFu]ÿ*5Û³¼wßþî»o™Õx›±gy3ãÕ,6! "‰À€Ç †ˆ´¡›˜¦M0¤ È4‘ Æ6ã/5JÔ~è‡VM©ª*K Œ±ÇöxÒ*­*ÀÐ3¸ªZ…u…b*1:=æž{ï™7ïü.'òƒþ‹)F°¶0ˆf¾%ÙÝ,ÕIë_âМË#á ¦È„#rM &¡ßAדKàórà/zùJ€ðvè´v†lDzb†%ºLý7§õØ´¸n„§ÔÈ(N‘@JõMR‹­‘dÇЂ\DvD1¢É5ªnàÈM¡bR‰NâpšD’ZE»’¶ X†Â"ì^°òôœu”j±)R>#›£šyK4oò>¥ Y” +áXÞ"q”À!–ƒ¥!Y²Šœ•— lË*f­Cvï# $˜“ÊÊÉÊp,’<Ã,8Q#RñŒZ6!Å&tsLõ¥uÿ 5Ò/,›¡ˆ(F lýX%ÁYÙwÕN©¥0ÂpH© !¤…ä°eØ8lŠ¥€‚dÊ¢F^ÒŠ‡ zˆÍC](žçiÀéa¡"E³ÑÂ{slDÿ´ÃÀ<ß’ßx_‹’q54©Ffp(i§Õ § ëðÿŠk¯Û±€Ls/’{:00±ã{`’¡øN÷ê÷·”mlˆÕÔV¶–mzs[ëО#š:.ì8I~- .|²ØyÿɧÝm@¾æö†6ÐN©«@f–‚GŽýeÛ?«lúcYüÒªÆO+š–¼í>‰‡Æ EYÇK¼ÔÑÞ1ÿþmàÇíÿàÈ;w@#o;A6 Þ•W#ùgjdý‚F :{7>ª®j$6*¼}ëVœ©+:PÃ:1‡iAFDÊá Š' Å;iq­SûNÌú9åì*Ï`mîðfGÿz£o;±>·o}noÍ’óàŽ‰u eO„¥-еáù¯l_£ŸÜõ¨4âíÚ+w5soîök¤0gL‚2§^‚C/ nx‡VÅ<´Y-/mrÿdŸû¹5Ë‚Mb«ÂÚÉæÅΫl4ºšÕ-UpVå(èáكؗ2BKýlÿocT‰¥×\挾-Užó_@ЇçV„Á4›C3Ùˆ±°P=ŽEÉjU½€c¶3x͛ű¯43©äa°Ä¸¶áQ=0é§µc GÓz`Fñ'=µΑ9¨A<¿ÇæwðÊŒ^5¦–Lk!>¡&Iè–Z:c˜SzèªÜÆ ¢åYˆÉVè,Ùž9ÎËÛ~ë6ÇUsB©ºEª€"`ŒOÕÈÉ[`³8²³1k%ÌS«Í…¨„œÍ0¯jÑ\~K‰ÁzþŠK¡¹' ˆX7Î_mCŽåË{¦»3ÃPœLó²)ò(¸M ¿QÌ9½:M·”+²™À²Í†ée*“ŠXÁÐï*…_¸K“zeʈ¦ˆ–ø¾ ¾¤€ŸÎÖlËu{VnV¶ÃþÔVžN)‘ #t“njÑ b«®RI $„´¶ ‡íC P( §^Õ3u `ƒp›Ûjyf³´]AÖ‡†ðh`¤¶÷)…_ºÂ3¤$­–,ù÷µŽê¡IbÎJÁkºŽÀï[Ç4/lcŽnk9¿»-#„xÛ¢)ÒØÞ½ãe`2 íÿQç ­òB.+'eÈÀÃæì(êÈ;°ñùÞÖW[:Î7¿²¸€  ‘ÿa^X-ði8~4ÒÓxp®åpÔSál´È¡_¯Œ_©n¹kø¨ºá“Ê'yLc x‹YeÄÐ6úÇo,hìñﯻwïÂ'Ç;qp’C –ü VؽٛØä8Wãéßà>[ãîÝô5Rpv³»{³µ~nmÁÛµêó>\,ÙÙoKHd,ÜÛpÔBÈÆKˆ“)Ie¹­Þ¼ƒÕ¡®­…§Ÿñü´ãí…U­]r|Ñ{nµ·§N¹Šcm˜âÄâg+õ;•FäÚ©=¹§öåo–|Jb9Ži°ÓP sI°P«kµxÛ*£±ÎhÝ"ï«3ºö¸ÞÞçîŒç¿Õ £¯íRßÙ»Øy'›Ä®¸¾u5t1‰Ç N)ùêÿFæœÑ1ìOj%)Ã×#—è•Õ¿$£rÞ‹¢s“¤ä²4Oga”ã¥,=+ˇ‰ë}ÕŸT#sFlJ7S$8¥„RZζº {‡@…þ’6ÂÓ¤ôº«$-ç9cßÜàBKð†þ"0œ Ú‡¤’Zù¸VœÒƒÓjtL/†¶;'E¡­9Ì?a³ßSØmø.’’‹FñE¡¨˜=¤pÚ~…“t1¦`ŠYÃüzW)º(ø´âcÅ{b G Œ‘ð¬¼î0Ór†:ã"äLëá ¨)tD>Ö£?s›gD_;ïy†“Ö R=6:Åü÷qø½òº˜5*ÆÔèï ?¬íoRdÐáÿPŠü‡G´Â ¤è¼ì–}£bFSSZé¨bŽkY¥*óg}ÕâÆECºoX žvù~¥ÏQ¨ |Øö¹33ÂpH© !¤…ä°eØ8lŠ¥€‚@Y`—µp‚Žààˆ&þ÷„|˜b—Œ`ÿC¦‘}Päµè3ÍïÁÔ×?-O©ÁäÌÉ Ä⛊™$åO‹prà2± õûv~?±ó ô÷¦Ã‹UÁpsG†";î{`SíöaŠS6» I”ÀYš—äØ|’±ku]Oý¦ƒ€‹þÅC(Ñ|ø\Sûàî6ˆÞx6‰½!WžÀðÅ»´¶åJeóç¥ñK+ãO4òØF¿™æ)!Žf¿~lþߟŸ¿swÁ!÷îÝ›ŸŸpuÿèk¯3v K!õHÔöiO_­Þ[ãN¬ÿûuþÓæ}ÇüOØ#|<§ý܇Á`Œ0n|IÓfÝ’¦ ¾p€F‹Ò&¡MªtR–•…ÆHQ~]'õ‡µ«¶¬Y¶¦9$Üc©:USŽ}ÜHÓVmÒˆP'Ûøây¦(-¾bŽ«@ÖXÇ*m[cìK”eFcº+•Îi³:ë}É4Í–Fe.KE©5‚ê²Ó§^#ÞâëWpÛ‚l»ÃZÖÈÒ©xIp¬h³’kF(ý·}¥+…~Ó­÷HÛœX;Õ=ä ÐÆ[RéZ—7èEUÙÂÁiDtšÈuWÿÿz(´kúCøP˜ë ™{öt© ~x?ÕÎ?ÝYÐÛIõ…¡.¡7¢ WÌ}]ò©°n°C:á7½—¯·_éôâ\ÿî[L¶vN†íÑ k¤-ãÛûË®&‚ãSú­“Ìñ–YÆ´F™×Dû¢Î:MÞ]Ÿv« ÅsUF ÊÍ8¢U ›zIižµÏ öyܼ*W¤Ks¦'ò*É<_¶¤µÝí328вÂ9ïÒu–­€mS9h}´½{ªíÈù¶4 ƃ‡×«‚‘Ž÷'ýG⻞ àsPV†³PU-î¨lØår×,` N’@‰F;?¸´§;ÝcDZѶwA2{­·ßdàô D÷wƒI`$ŒÓ*®®bÄ?n ]®ܨnÿ²*x¹.œñ²û’ ûSmøjM諊À5§ÿ‹ÿÕúЪÀ'ÞÀµ²·?õ†>sížÙ¹éðÿ¦)tÍ•1­ýÂù:¯@pµAT'{zž}ûøÉ³ï@òÏyú|òë_}L¢8X0ig±IV¡¦5âÞXotÑFiÜ-§+¬WHºÅI¯pÞ«ÿIA`ꌬ £[ ¢Û¥ŸyUÛòq½–P¨7¡DNjQT[Śεˆ#®u÷›h5F½yQ˜òå_xÍsK£õÜ”·0ÖXóä7IõòpCAÌ×6Àð`œy>.Ù$Ä›ô#M`.–Š@ä”×h4œmÁp…VÍà Œ*ÑS}¦þt˜=ä‡ö±ƒ¾¿ŒAŸlcÎìCÎD¸sï;¹¶)n·÷ÿTú9ˆ%Âwq}a¦7Èô§õ¢?‘zÃÜ`ä4BŸíâ>ôsG*†5Ôª&óÛûKÎS6ËÚ–´¥‹ë´\vSïXbJçÐ’EÒòˆ¯¸%UdóXÏ"à ŠfSj×ðŠÍ ö%]ù´hýšrLs¶yÚ’ñ‰¼JFY¦ì³‚mV¶¬2%‹¬ãЦ G7«0T£Bëõ%±öt5aăG3;w¹wÐð_ªBX„¨·–‡LµMú§:غKP“9›³q­trgÇŽi?ÄÃÝѶ÷@#ï¿°FàÃsM R¹¥DÕ8â W«Ã ‘ë[ÂÿŸ¹âò_Ù¸\ú¼6ð‡úôô?w¾ý»šÀJÿ­êÐåX“ÐÕÁ/«Ãð³?×´gjœÝE TŽ’"•JqñÒ¥gŸ=~úôñ¿jäÉ“' ‘ß~úÙ?4"ÿ¨ 1Ÿ¬6èǼ OZ#±Ö ,¬y±t Ö‹±!ÙĤ©T¿Û„à*B‰².!/ê“SÍù#­ìþ¤@ƒ!j¥I”ãÀ*eTþ9p©~ÝÕ<ÞjŠ·”$›¹±j>Õ Å ­üÄ6}Â'ÅZÄø6yòMqj›låqÒÃM5‹Ñ&@‹™pëâncb«͘F¤˜GŽ×Î6«i%…И Õ8y°k£4òœRDìk`PƒiŸNK:Þl& „£¹‚ªº8ß|M÷ÑÞ¼áýê€ö—`‰n¨“é HûþÎ~½5uçqÚwGn99÷krNN®$¹&  @Bë´ ! Id±;ã¡jít;­•R,¶ ! (VÛî>ìÓngZu½_êª#­7Ô.ÓÝÎìv­º?–Ngg_bò 3ß9“ûÿÿ?ùÏÿ÷ù%?t—f¤WØ’Õj%p’Ê#±;ª•)?Þ—8³lþŒ®øžÚöXyE.;)¯º«sý]]7+WßÔ׌sÖB‡~!Y6¶Ž2D;ÎßÔUÜÓÚoh æÄÒ[BáMêò") hdV±->TåßU¯ü”)"± ‚¡9_WR$@A?œð'­‘ã݃‰Ž-SÁÁŽRG1 ŠrßË›¦6nûxãŽO:úá·{‹"Ãc!bôžÖîc¾Ã]ýãþíñàˆb²kûÏÔüÚoÖ…aE@,‚!;Œ… ùsEð’þú¹ÓÈ9wèŒÃw±.r¢®ç„£óZÜŠž3®Ð½’àå2ßÅ ÿyWètMàËÚðµšÈÙò®TÍssv Eúù‰ ‘ï=ú©Fž’‡ˆY¿ )D¯$aç+•JJG«7æ[¦Ö‰ªdÇÍ·J‡\ºI·1Ve9 ‹òäF[óÞjÐõ•óksÉ25ϱE*Ö­3ô––´™Æš q¯>î1D]¦D½~rµ!Þ`‰6§J#Ù“^Ó”'g¬‰41,Áá(†s„áíšȼF†#` é€a_H ¨F#æ½!nm%NS°+4Çá ZØ*K³u¶¼·Ã@áý°v$¢Ù‘Fæ%“ì¸Ú÷º C½ìh¯&×ýÕ˸(–¤üx_â|«²Íì7Å‚‡šŠ7]c&ö2¡êcô[h}É`Ž*xŒ'x™ÃY½‚€¶÷Wt[(™åónëìWÅ‚¿²¶ÚçNq/²YMÉ}µý–d»£-šS~­.ÝK›IBa3ÑÍžµ±ÀŽ#þy€F ²'«‚yu„vOùú_©n¥("0ªLl:0 ƺ¶ý.¸û#ÿ`lÓÎ6[•€PJàÄ~£Õ/ˆ¡#¡Gƒ¯ÂçŽFló¶CÛ‚Fhb‹¥übe4rµr^#gSmƒ¥Ï)g÷éò®sß…ŠÀ—å›å¡+U‘?:ýŸ»‚'+»/Ö†/8üðÖ•âγ®¸K©šgï §@$‚°$ù‡Ï>[ÐÈãÿ§‘×®C‰ñBÝ=Fs´YŽ×fGW›¢M 1M4.VU5NµêÇêMcn ˆw«£µ†q€A“f°*‹ÊR“¦ã– ,ŠqË z%Î)32²Q¦£ hu¬5;±Ær0ù¡GÝúÃ^ÝñáP…9êÉm2õ­RÚ)Œš_¸cu V«dÇé,Deˆ”š´¦Û̇ÜÖjõñ:1æ±ÄMeÉnš¯1jdljŽb ŠbÊòfx±4¢ñC¸ê‡æŸêöõ\i2t:°1À!ó R„‚¥\)­ušööHû‚Úá°ðnP핇z’W74½³‰:Ð+:  ß¡^‰g~*¥üx_âüE,½¡/œò¾‘*­@¢(«äh¥D¡Ydz‹È(MaDAPe*(lF¬zÈ=P<4–]–ŠþƯ¼ûüÝ·ù1³¢ý¶h»+Í Å3RYÒÐ$†Q$°aÏÚ@¼»Jù$8$˜4 €™éÐÎxÇ–÷Û7g3ê4ðBăã‘ÁÉÀÀ´oGlÖ±ðÀ/íN 6ªµRê‘ ¯ïÙŠˆú':·NunOt÷?›F&W T¸º™!æ[$Gß¶ºÎ;ü眨³—+g*ý)çÁ v­®÷|Y×uGÏÕºÍGÊ^z-×µÕRÙ½b倵귶—fìþ“µÁ¯ÊC_Ôú¯¤N#>k98„FQŽ N>ýô‡'?¥È‚F?~üôÉÓïÿñO¨È8‚¿ÌWÊæ±]ÌmdÇ=šÈdÑ4bˆ{µ]Ù±zí¤‡ŒU«6ç]oÜ߬ÝU›‰gIi¬€3ËI4;]¥QH™,¿\«ÖßmÔ$štS«uQ>ê5Å[“×”€ïºÅ¸Ûx´5g¨AÕhÌTedÑÊA³I †’4ŰËbшë̶å7å~PkJÔkâuÆh}ª4D”»-Q¯Êe $Æ(QíÖõ‹¦‘ýf¯O;Ú+ #›L;ÚÓ,j"3KE2Љà8εª##ðp(•JU:’¡aVlmÀWTÃ=â{¡gЈv$¤ßáöoR¯s2¸GÀqäMÁœò³}‰ó•T2c,¾/äÏñŽœ“HþeZ™‰08Oâ"IÓHŒäT(OJžG†Äœ»²ã;Á>+Þ’ŠîÈ+ïkʶ”/äER \o©‹g5¶oU¶ry œg’„e†»~=å›×wÀÃÒuD;· îö·”UC/$Ò\§³1æÛþIø5ÐÈtx×[}6ÑÈ+ dڞįvÃ@ã¾mñÐ <ø(ðê3@èGă Yo¯a + C' ZΕwƒF Î^ª œMµ –>×Ë»a—œÁ/*}¯çÖ”²’@*”JŦóÛnUõí)¨ù}yûOäOŽ®TÍÓ+å’8&1,€ä›¹¹ÿjäñ“ÿ hÂÓì‚F¨R•åPó‚F M¦X¯5/ZU•þSÐ-‰]¢^žôZ&Ú¬¯7ê;KU:ìa‚×`“AgI %Îcòj«uØkжè7k'ë³'êrÆë´n~*iè&œ†„ǘh±hãÚVp"I§# Å'9Lɦ+èe—NR™$†ÀL²–¥aV ”¬8øoöëô7ŠóŽø©`ï1ÏÌ3×ÎìÌììéÛx½>°×°‹í=lcãB+NÛ{ú"%`cRªªä_Ðpy½»> ‘ú®}ÑDÒJ! JZŽ!†„V}W¡¿5QÕ¼´lÔòè§ÑhW;ÏóÌì<ßÏÓfK3~€™i²![qL´Ó öD“¹½ŒÁ”ž!%‚’z7=-˜Ç{”á¨z´‡‹ZG»•¾UXoAŒ‘ )gÿr»8Ö-ߥØÁÕ• ,¯bv¡Q7{óÇ…£qЈ ?_†‚Æ¢–á~u¬OÞÓŠY¬Ãœˆ¨kÌúòþœë¦T=¯V~mtþÕP¥"m. oÖsú\K$†{±¢1ðz–¶#ý,\Vën«kæå2ÐÈ Cɵæ†ZýT•õ‰¼¨¬Ô RykQ#÷ W·k0ƈÆÅœ2<Ó58€L‡|?ZºFâ™#HÆoYm5H€ì¼µlÝކ_ÙÓ²µÖVL®È(¦Èê8zyv×/€@©Øþ©îïDÌv$;÷.µßÿØ)ù–R-•44 Ó½Wµ}®.¹èƒFÎ{cYçÁs®Ï¼Q˜ûß°«¹”âWÚš„G#St.ƒ>ô÷ªÚT¤A-¢åÞ® Ù»?^ƒ ad¤Ž@3òxœÑÈÃGß¡.QÀ!<Ͷ—rr§ÚžhÄ–jµ%Ÿ®FLgZlÓAó)o~2àJm2õ»4Zý±póxJÇåë‰^Ê÷Ùmoø¥¿e¦Á4éÍ›ô%ƒ–Óõy)~ÚgKz—Úoáä: .•n+Üç[%jY R‰Ïáù|\¸½ªøH«%ùõD›²ÛÍÕ˜0­³qVý~D:ËhÀpÆoM7&fÙÒHA²Í8냇bßVÑ2HÖ‘ìÎàÓÒˆõ­hÑx¿ñpØp¢×|8J7–cLÊDb\º¯C:Ú+vG»Åãý¥#Ød„¥Ñ¤¦Òn}=ÌïF3†±õ,µ_i ³Ë>Ò¯ür+æèDÃV®‰f²¾¼?çš—Ýó¢óž¡äмF¤u˜áy iEz#ÉJ¹¤¤V‰ŒAKÁC ³æ»¢ÿŸ|í=¥ú¢)ÿ®â¼'–_5×Ü!’²?‘••z¢‘›¢N¾á]ŸÊ5,ZA"Šb—d›ê}íðÐtxl ,C#S±!ðL:>TÈH 43:ÄÒŒdÉ-$IøF¤9OyuGÿUwÛ‘–ÐDhïé®W"3ûÎÄ_[¶F&#0rIƒµ/6ãsîÈ%O42WÓu¡.<·>žu<çúÐÓqe}ÏûîMHÒhV’2oÐ’XQs)XŸß÷ÄËÇ!-¢s“Um©‹fkœë•|Ølb@ò,òèñ¿n¯¹ìé~Öãù¸>zymô²;òÉÚ0 Ê¥ÚМ'ªˆüC òìðÆÂ·öø/‡,,6€JS Hg6^æ)ÛD{~ªÞžòF '‚&ñÄSKÕâD[^"è8Qo>ÝhK¶K;Êt¹?6é¤[%ÔY,ûëíévËl‹š¨Ï;ÝP–j²$êt“2ÑXð;N5À`”¤¿xjãRûu$Õé€ód;ìD)±F]¹àLl±O4:R5ãœf¸²åTcyrcÑx£iµ £)ZƒØRœ÷î&øÊœl eK#pIŸšðIo)RC¬‘àØºÈqe$’L-æ;Äú24œ0ŒÇ„‘œ;^ — »V Ží2 ‡å£ÝêÛ} “¼cýr±]FØD`-GI‡:ÍcÝ–_÷+€+ËЈ2Çbêhœ­,âIZ 0ü?3ð¸+–Þ5–Ý–\W•j0ɼø?«‘ÏÕÒëjf{;/U%Ö|itß0­»jYSõAÝ=×…ÚÛÆ5óÊšy©ò+¡,ë~Qß«ºfrþCp!W~©”Ü–œ8‡ GC’ÞødúL…—§ A:º¤k÷:Kq'©/j)!‡ŠpƒyXš¡ì%2Û †a)^g’$õɘûùæðLǾ¥ö £…®S±ýÉøþ3'Ã{e‚õ¦VÍÉsu™<¿>ü‰çÿT#—<]rwœun&0eàøcemç|Ý»ìN‰‚²ýîÎj;i½ÇVyõGU;ŸõxÎyÂÝ„<ÑÈgu‘Ku‘óÞ¨Àò¤Ž—nhnYxððñ¿Ù¯³ 6î;àïíLÛIliµ»º÷^­„Ø€Äi@ Œ$‰í&n) „°3™sØØq<‰‰¹ øÀèX |Ä}ë´Ó‡Ît:™ÄuëiÒiB-!ìÄϽ|ô'ì6ã¾Éc[žŒw¾ÃüW»ìþa%}?ÿ'·G8yÌ’{÷÷v¿H¤ð”Q9ª›sâ6Гì4E;XÑ¡¹ŸU«r/+ºù¤‹]s•ˆ^ÆWŽ0¯ ;HêD3{ÎÅ_í®¸Œ«q¥™^µa×Úõ±ì™tÒ^–p–Åœ:±ƒX±?Å|JãN2f×ka‘¢U!˜0jS®Ù"%¢ Zž»ô 7ÉuW^Ú'¼YQ¨ÁÔ¨J¢ü‘nÙ«Ž9Jcn&iË—F±£$áD§~©WKUˆš”Èåå,»{óß „åL‚¹ 7à‡@2@ÃüÚ^…#Sˆ94axƒ]~[ñqœÆèû¡V¦”ÉÈ)fb.ÂlH1ï¨Èçr½/L®©\ fBÌ^àT+¬%­p[S—ÖìÈp– ùËlM×d¨ïl ¯ó•ëlÅ-ª"EìL•[TU ØÍ;^pn4ö|a .UwnÃ$ )z±¼ë‹¶Cn ‡¢¨‹6Þ¨éý´5 A1c[þçÖÐ ÐðžP@’}(ÍþßYû³^EqЈÓîxøàჭíÿLòø•GÞ}O)W@à¯àNìÖGÛtq÷ãn.á4Ä=ϪU;Œ+Yp—\lÒIO7©OÔë.t±kN.é`£Vv¹Q±–&À.aÙ¹cÙ  ×l|ÄZ²Üfˆw0ñ¨æ\ïË‹YÃÇ[1´ —3RYù…}Ôjs¶ß.0u h‡Œ:¹q›þƒˆR‚¿Æmäbž OÙŠ5_ÑefçcíÆånŒÇÕÅr²“‘r:ýLH; ¶29*rÉÖ/Â@qº„ý…*”/1¯K¾WË‘'zôßo膈¿.ܵ½”Ü&+B]Õ;f‡ùÙ p±ç>…Ft3AÅRÐ0ÞÞ_ “Â" >;~…ê¢ù–¶"Å[6Õæu¶î®¦:ÍTåýkÿ9åk­ùaneèª4g†¤Øª »ed9d“®¼Í˜7Is†¨˜å}¯òR%o¶Üï“¿µ:D«•í*© '.„²Iú'âþìdƒ\U°>&úƽ‡/û&>ñýyàØ Ñ3/ÆÆVC“ÉácçF¦~:<ÚÕãkêØ·k·M_Q«øb9UŒé¥Ê…Ð(œ“³Fü q0 ’Ëþ#‡]oi‘¬F”r|H_ŸÕHãÀç­¾V?”à ë`Þyð¢5²«4rµñ®Æ´RÙÎüë=Ë+%˜M0}Úê6Ö«årU!2j±_ßÕ÷¼ç,üSó ×›| 0É/Þ‚e¦ WÀ2³ËÛ Þ¸ÿþ·üø/Eîomptê£SYÄâÀ9¸IßÍ‹¨`èAFl×GœÏªU©5°“»ØÆÄ톈Ýt¶mgÄmHzt—iŽ3â5Š{¨µn"ñ†°¼¯b~oÉH³~Ñn¸æÑ%ÛJ#öR±“»ÙXûSh¤Dô‚FP¬ X©"‹$†3^nµ.ÅÇ즄·$Ö n6áaW½ÆÑ6ŽiŠ”˜ì5ÓñV!ÞiŒ9MÑ–|i(áâm%Ñn……ÒHq­Çq„>Ù ŠŠ<Ò;=>!gsVÁÌ ?à΄³ôÒPÉI_‘E@ ‹´¸þÐÞò…Cä´Ÿšòe/~>ËnôM¹»V3¶_fKaîô ?åÏYAsAÝ\H}6¤¼ßÿºÇ0L…`»PÉW|[š¨Yg*¡¦S\Ã7Jsбäýkÿ9å.QG[»âÒVg´–ÛË]uÕ]eå&U³AXÒdU†¶@`¢Íî•F^剤µæÝQWlÒU¿¢« ¡dê…¤…1Ň&“}£‰qèt°$6˜³FÎF#á#±`ÑÞ‘ÕÁ# Â5ßÈ'½ã—z_êêÀ ‘QqøX40 Nœ Œ~ÜsðxW_2<ïy/g^íO€yÇ/'}»œ¨)¨*ý¨ÌþH#ŸÙ|ÜÒÈõ|ÛàÅç/¶ào›zÿÐä·R¼´h; v¾\/W“ ¢•6þÌT£@Š<»¨üeKÿçÖç®`!Päfs–%7¶4òYËÀjÍpLròÄ÷þõï‡On÷îÝûßøŸÿÇÒ¢¤¨ž²ÁÙPµ.nNì`vÃÊ3Ó±ê2E<ú•Nfm¯AÜo8ßÅžë çÛ©ÉVâ`±¿Œ´q¤Y«Ô¡˜ºŶÿ@(”ö¸x;›°•DÆXs2ÑÖ\ïkŠ:¸D;i%‘B©R…o/¦‚ÕtÒ¡O¸Øe›>æ*= > ñòI¯ºI‹ã¨QFbÅß7-yÑ-¬8ˆ5[¾4Ró¢H¦»)O,”˜B…¢šwº¡ÇéÅ0q&,0³Í\ÎèçÂÔ\€9;Ì- óar¸SRJËúÚ 3!z>È·Jѧ|ÄŒvéó…÷{™¥!ØUÍ èÏf¹Rv:”ëM6pej1LÏ„©à¶,|Ô2œE ~£kÎP ime†4opuw”Uéï®FÒtÃ-ªþ+ª²Nצ˜º U—!k3LSŠªß ëaœe‰ºjC›åYÞ'ü*/UÒ¤å]›ÖTܦ,P)†)Q †÷Õ¶‹Á# ‘¸<韸òH#ÁÜH¹ê?ºØèÿûõÛÄ}\ûoM°¥$¶ïíÇÝù|ç³wœ÷;¶ãıce+kó²}¶“PØ´AB cíÔmÁy¸J¶“Ú´NÚ&m¬…®”´!еÏý3i›V’ìkЦ©x"¤Û8}uºóÙ¿ï÷îwò÷ó;!ír&¼»aä1bŸøNGâêQo/°g2Ð29§í=Ç{á*üF8Ñ‘tÞÉPB#08hähç¾Ùe*"¡‚Nm=o \¨ò±{¡ýO4¾µçÁS޹šŽsï‡6é°Ù•¥¦ÓÒ6 ¦#Õd.Ê)ݦH¡•Êïê«NY½óÕ«]Ï5>˜‹¹ßY[B#[ïÙ|‡ÍN@¨L1XúìÁòòòÊçmË+¿þå¯T”’Ä JFp-y|´Ž»Lcý”K?í̘h|b]5ìZrô›2ÕÎt¢€Á x*“B*SÔDN¤¢„Œ$QA@ŸÅQD#p Ýš›ÛÈO׃ŒPRÔa˜NZ™cõ´Ë<ºW?‡ƒkRhASzÜ¥«Ó9Œ“nH!Ž»øÃõhöU\Á i’éÇJÑÇÜìtÃZiæBŒ×É„¨Gl+§îöd«=ëuIî¤% „øã‡‰$M‘GQðjüü‰„Loî4íØ NÐ ‡˜¡€:ìoG¶'L2PK¦¡.v8È=L'†ƒDDÊ w%›×0¢‡P¿*Ðt¢Î ´ Á)tÃA6‘©¸¯E_á‚¶ø¶¦(Á’µþÛ_¥¸Ì\á ¡/r%w´å÷è²ûšÒ{ê8½Î]Ó]ÕÿQW|…/¾$_KÖ¼àgñ…  ÈM¶ô[Rui( U£˜†Aä¯=ï{{  ptvÐH,Ô—¬ Þz©÷Ä‹»~æß 9Üúíן—z_ÜÓÜö½ÖÎuìíê›Ù¾ÿ¨ÔïØ Y¢¾ÈE@jPÊÌC™Ài²y:P3üÆ„ã ÆM ‚ňßTv\°A#ïÖvEÎ[¤ÿCÌ–·\²‡NÕzÏ—{{³-…8£Û€!i -B“J%Ë2S[0ã)KèŒ#t©Ú»Úõ€CÎUûf«½ ‘¹*ï'Öài›·?Ó Fâ 424 Þxðà¸ciié@$”²¼òî©Ó X–ª¿-Go&£n~ÊÉO:LãŽ'ÕU…ÞÚõÚu$¾&IM ¦ÃX¡X9É( F*qŠÔ£$Žà$JÀ-èב‚3'ëM7¯£nЈ0Q/NY“VP¬A«åg6S‘$(˜,*ÃÓeÜ! €¾ ¹ ñFÐHöDSæhcÍŽÍ2#·“ë·å'æh£nÊ“}䉩,yM5™ÀB3v>îÎÜQO¢¨œ"•(Š4—g½êÓw2a¿q°ÓÐÐ;“U; ñƒAn¤ ÆÉè¤"z0NP†áèàÒH§ò€— KÜP2ûxß×á*wx»ðCŸl4Ù“Ík ‡¨¡DåÄHÀ0Ô­þfÁ!p,­‡2ÜT—ýYS|•Í¿JÜÑ–.ÒEkþ·¿Jq‹Ë»Åš!3ô”ë\abÉŸ·À™!µù°ì½Ë”ÜÕ”ÞQ?Óȳø—¸¦+»Í–-ð€v‘zŽU0i¨Z”+ÆB{¢í»À Q)¡‘Ÿ´õ@gÿ4¨8Ö½ÿP°gsaMÅÒ«]h| Z¡wÚ6wì÷õý4°oºm7à'.%,3W@)3Á½±@rI!¢Á=':öÀÈ ¸3Æb´‚'•g­ÙBUúNÛÚç«| ؤ5çÁSŽkÕßZ[.Úç+½sΗÃÅÍv:“ÆÔjDª9º7×:WÙùN]÷…šÀ|EËj×3o•`"@#³µhäcKàmkû~±Ö˜@ÉÛ'ÞH¨ãß¶åGÛƒ¥[7) 'šX–²Õ‚.Ö¬; ƒ‹ãõÂT“qü‰uá¼ýîõx “F£rÀ›J†~ %Siœ@ ™‹¤Rµ¤v«O”Æ)9žÊ—ð™Ã[LÓM|´VŒ9Ìãn0‰6žt=tÔšoàã.nÀ“¦ÇŒëä tôR&gâý‘Mb¬9+Öœ{Ä;æácMÄ´Û<±‘þ~ñ—^›"u™S›¸¸“‹6¤ÇÝk¥‘ô ˜‘Ó¤M?n×E6ÊëYL©‘SŒIÐtóC!õÁÐ/ otôÉ‘ ¡‘HH–@Æá.m$ðPÔ~ý@gÆ«~c»Gë(W¶:„½­¦‘D$¨ 4MU ð=Û´á øÆË²AéN6¯éðè†CYý!|Лõ?¡ŽhP‰Bî³–E¦à†±ì6UxY[¼Èý×hä¶®ð–&ïŽP~M¬¸Æ–ýISq_]¾ +[d‹“Š»ÊÜ«ºü›@Ú|E›OLò‰á ÷þ®.¿N\ÔÞàJî0…7µ…À§ûjó=MÞ]uÞU}é§| j‘+ùT0ßÖæ¯yÁÿcq—.¼Ìå-h‹ß+ØÔTRN a2“íþS¾ÞŽÇŸÿ¼ã•Aé;9:ƒêábÁ0Œ" ‡@+'ŠXC¿ï[3Û÷Oz{ÀÉæý¼€¡`@¨ä˜¿o°m§NA&„àZ8k—ÎUûÞ©÷E.VIï[ Ys<嘯÷Ï–¶ÎÛ»OV·]²Hs––ëþ“Vß/Ê·ÌZÛ>¨|éŠ%pÆîýƒM:SÕþ{ûª×óaeìçªÚÏ•·Î:¤s5Ò|uП^³Fa¼*ï¿wæ<–VV>[ZzL‘¥‡Ç‰ýòÊßþòWx¯”$­*dxÐH´>#î4F„IÏÔˆñçËÙ)r¥§1:âjt¦¦"[Ë`h*‡díõh£MüÔæ¢±6Ó7*T¤\Æ*P`÷ð£6cÌ¡: ÜdÒ*0s‰c6SÌi8ÒL·•àŒlæ+ÙûÜšãN樃ŽÚuÓNvº™°gÄ]æqWæ˜;?ºÉ0h3Ç›…‰qÚ£‡qÆÖJ#¦ñMBÌaü÷uþe~Çü_h7 s<ós=óœóÌÈÜ\ƒ0Ì Èåma.Ô=uÕ¦]Û¸«(ˆl+ 3ȺmúsûC›lbí"ñZª.÷¥ÝZ“¦QpÛÏÀÖ6&Mv îl¼óäyH†çóåyxÞ¯'á†ë¢ÿ匒¨QB) –Ôž€FÈÞ(ì@­3ç"ÂùötUÀôDùî(0†™t·˜®6mw”~{‡”׈eˆŒ%E8*ÕÑt[½±çMæƒV‚"1  ”îè>íÙvîâa݇i+hítã™6å…ˆötP®£•(ª”ÊY2ª‚Ǭ}–µÍ’ö9Ê9“égþ·Ï cž& f)Û$i™VÛ4Î €Ê KH+³\ÑŸ…ÂiƹH9¦ûCÚþXãøªl‰0Oh,¬æ\ ¬Œe‚³ÎR–{‚m‰´Ïh Çu… tá#Uá¼Ò¶È83>ðk–EÒ2E™ç¨¢TFµ8[ÿ@ÖZì} Àörøø 8h~oW±gíõIXJ$‚#©R©”KQZ&/áM§÷D¡cW릑+Áã0 €d¸õèO·=2™ z­™Ë½^‡|æ ß, €FþT‘y|÷ùܸã ÜÝrø³ÚC“ŽÖ«åÍ7ÊB÷]¿ßrà®;:V¾Q¾e?p»°õª'8Zxå#¹‚7+"ce­7KZ®y‚×Kƒ£e‘í” n¸jrœx¸ôÔ±¼¼üteå?YõÉs<[^¡5ÐE…=bˆ7q±Jã`5Ô7—ôëcÕëÕªùñî'¥›/ì°Æ÷›b¹±m¦cU5bÇȆ\ý¥zýH=H>ì×_l’EDìFãn]²F?èçãÕ›b~múçå<S²†o5Æw  ñZ¦¯>¿¯4'QA%*„+[uƒµÚ>·i¨šë/ÑöWoŠ×å'`Ëö{ Ãu!CbÝT–nŒõÚd•.^¡û6Åv),¤ÃTbB¢@…“ûù5œk£;à.M@¨saí…¦3LŸPÚÉóaýùh·Ôȉ)²?7‚ð:MÞÉ}di$‰jƒDíuêÏF™®¨ît$mu†axMW(Å\ìPuU%E1 .'Ľ„î1YO~½îç•Â)_nßN}²‰‡’•†áæ’Oˆ×BB.æË̘FruÂ`µ0à†ë’ߦòpQË”Tª?Øü {Ú¡Ö¡ÜÓõÀ79⻣)ÌôDA#@ã™6êm* *QÉáÆ€'ì+¸§dDµ3÷£Žœc͸#Uê,å~|@ÞÝ&tz m@ ö\„ïé ºCLd«J,ÅCE{åßÉòûÛ<ãx qLSÿ7Y`Šf9ç,k[ Ì)jó”:oQeža¬iå‘Ú¶¤(øŠ´-‘©ÆŸÐÌœ“TæøB&Y;¬wFcx̬2އÇ=Þ™êJÊ:Íš!SêÍS*ëSšñ_³ÌR_QÅ·¨Ò|DD`6­P4¿÷-Pä¹FÖ®5&)pB"«59Î…Þí;x¢·åÝSÍë6+SøA k‚ìn~kxõ»ë’¡ÐûÉÀQ ÌДW ¥&&09NÄìu·ÊRsG@#·])Œ–3΃ï8ãîès15ŽJ”WrÇßq§(XEUŒÅTDéQj?-Ý{ÃÓ>æØ7^~å#¹‚cåáÑ-­_¸‚×Ê[GËBW+ÛóDÔ\;ViÎYÇëg}¤,x¨²Üã­ø5Ë™»D]V™å˜%P)†–çÙ> ¤ßþ«üx¾¿v89Ñ\äSÊpDAYHWËÛƒ£C-G~>ù›‘_¯±MgÀ¿Oš& ñåÜÏñ¹ÛÇwçBÇ$΅ĉıCÖ¤Û ÈÅNìÀ ëÆ€„޶ޑ+E@.ŽËغI“Ф©ZË´µ@hÊ*¦MJR¬íÃÆJ’=NV¦!MªQÀZwôÈzϱ”çy“èýÿN×w{;l¼^GÒ 8zwì…§Ú÷¿V¸;Ör(2ÑÙS"Úà£H§Q¶óƒUÌz³eíïo ÍTþ?jäRU[·ÃÄi¢Ž5üÚÝüZn os‚ˆ¡¸†ÄIÝeÌ}³6|ÙþmUëÓžg¶<™ñ´F®xZg*Âoù: Jã¤ÈòžòŠ•O²´Zk×ò§,I.`¹¼ràëû9Ëá"Aª¬¯úìñ ~¢RØó[âþuKÕ±Zs,(L5ˆS5RÂc˜(Ñ2#®ãQ TàxÙcjpŶçö5à…£4z­¡69z¼¦±€«Ô9F@Õ©ö…d%¶é'j•˜/ë¬wËÄ X‹3¨'1š£xQEI*£Tê2aóɯZÆü¦ñ:)V£ŒÕcÌ#>G"`Š×¦K#`¡¤©Æƒ–DÐ êzPZ‡Ð4IÊò×4néKƺ8²Fô§£ro~Ž2åûB¦¡.{oDòq8%1œŸ ÒÈ>Ù¥ÿŠ—É@Šcvx©¾|tµQã`$zK–éTD:•rߤzÃÆˆ4Ø ˜Ü:Ø¥uYXJ§C1„Uÿ”wÍ)%·¤‚91ïH#‹¼û–X4/;çŒÎE9ÿ_¸ ”ýÊR‰ Öòˆ"kr×ÂKŠã¥–œÑÖƒ? ½°çÐmÝoìJ~ºm9ŒÞdá­N{¦ùÀxhÝ4r!Üùtöœ ´áAQ0D>)¿ëi‡à{ok{R#åÉ„(œI· ž}]©ê¨Ög"Á©°©²í7*"6½LQƒ¢ç)JO’`¸7+ZÊ¢Ïâ÷SÚ&¼ZÙv½¤LrÍÓqÑÓÂYþp/46=øÛß×ÔñÉÒÒ?>\ùO<„'«9ñêñUÜ :B-(„à“&“±ûã5땪Ö_öù@æùzûpµ}Ä“3Ýs̯¦3(†Ña¤ÏÀm¨P l`3Ô”–¥ r“Fíb­¯o3ŒTÆD]æ°P‘rë„ß ˜GëŒ1îhиϹѨ¦4¨%y§Q”Ôj9$Žh9ÔXœµ9¾Í6†½`û¸$3N¦‡"IĪ…öX½i"˜ôá™/ã2Âh)Ç9«i.õ…A#rÈ$UðC©ö¤Fú“*X¢Âwv²³@²]NÛ£|§tlÇq¬—‹r­ý{•pƒAKéŠÎ2E¬§÷§ÚJè0÷Gøþ0¬Í'æÁ(½Û+¢GÐjJ½3ÝáKæ ù7%'Ä\ÚýÏšJé]©hQ*øƒ!÷Oºü»tÑE±`7ÃÖÑLJ$¸ ÃûÝN ÿ%¿y‘uÝ•·üEÈOû«›b.€Ä8gØr›/¼'”~h÷\4å¹y†Ã2T_äP•—bƸÌÛ†àYÚþ¼•1ï†\ì¦(pE<à ¾h9ôÄyt›h;Ûó­×¶G9„À(²Â‘?½ïX¢ù›à„ñÖo÷ÓíGœ™9p&˜9ɨ&[“OÖK#ª©p÷XèÐñ¯uðZ§)^?¯Ï„\õü‹°NæàÖö´ÛàÙ×lq(Ó£$éRìãÅM*4nshn¨øybÁUÏ 8r½²kÖÕ:ïŽ<íy®—‡g*Ãïù¿+Þ3ëi¿\Öw5â¸r„gØž#ÝIl¬¬,­Rdiåß0Þ ïH®9CÁ¾è¾Py^ŸÏc_b0,¥¢q§„ êPg$¤¼yɽht}(e§}ƒÕMƒó–ìš—òõ…qEñ%o+Έ¶€S:™2p¸¸A£*§¨Ÿ+y÷Äôü9+ø—˜á u„ŠÂH–ÒYôú‡$žHkLwôÀ-Pd¤ù*7›l˘In°yÿšF£Ýç£Gζ¼L’$¬Ûê,üÉžÃÚÖM#“»^ˆ¼-^ n§µÁЊšìÊ©z¿"üNeû•ªðµòöG‡içÁ3®ËžÎÚ  :}>RИ) „†üzÉZxÕÙÁYsì Ì¦ßø"³eïVv>õ‘JÛ.—·]󆮻w_¯ ƒFÎå…T§qò{ÇO6ö¹øø!ÜmƒƒÍÕp Mºå¶¾c–HírRM]'5mp›NkœD¹UZ÷fÒ*- @ $ËJÂŤY_L껩ÛϤcÓWõDDf}uôèÁ~žçìç÷yüyÑ]¹ZÝXÛ¶÷v*ò($w ¡$¯›÷(FÛb.Óù}ܽ6Žk³4bnÕ 7£ †¸›s[˜fh„ÏÅIšVÙ¥‰tÑ?\©ýÆ÷ü™ª ­RNÂ¶ëØ­rº@¯?Õi:fªKÕûF´Ó¢Ìy®roôKŸîÃê ª"Aál€ØàßO­*Óy %pRÌ"YR6ÎXæõÖ§\É’P¼éÛþ÷Ì o},”-«-+ÊŠe±,)]áŠ`Ç&(ZF‘CÃ)voA†˜œ 1#_2[†¡£Y¿e·%Õ%U?ËÓÍ›TÃŸÊ +|Ù*_„ûRUöŒKûþtyÂ[àºÄ—/ ©@c½ó…y$­²/p¶Ç\ù’¶ø±ªè&cc(<‡•³H6Fçf‘ÊP<š{Z2ýMQ’¶ª‚9ùòe˜Z4'E ØfUX g†¬ðf?Éÿ;/{œW-‹|áºÒ§tÑ3m‘3Mz+JÖU¡¢‡Ð*i6£( kwÔ\ë<>ØÙ“iõHÄ}ÑPÊ$ŸzN&w<ìÜC­½pƒŸ¼MWplסáî“Býù޳’‚f Ü3êw¼ÐývÜ× CXà ÿÄw<è½è¿|ðx¦ë¡b¡·®¶÷¹‹lêLý;b-RÌmˆº¹öBr2(Ú$½¿FŠt)"¸*Ïtg¥ölxû¸m‚ ‘QD+³Rßy5ÆÐYrDÃéßÜg:÷s:ÌèÖž @„ê3Aˆx&,Ét^Î]™Ú|ä‹äž¦ KBå’Æ¼¬ü¿×a2ŒÂH0?‹SÉ$ŽÐpxq8ePZA ùŒ-¡ž*KÕ¶ôU¸$É—>Ïs–@ÖÚÞW¾²VÄ¿½çíôª™—Š¿b­K\%ˆeI]˜ä‹ÿ ´¢²­¤ e1\Di£Z)ý(«W¥YÒª>-€¹²Å¡"5õZRX[\¿C5Ϋ–$W´ 3?aËk*òæ¯TÀ­¾ìÏ›;S"$&‡“öÎþö«Çâ¡·3­þ:{bÞž‘®·†;Ž%:N\ôîwå•ÃÏœÃ(Q‰ÍMµ TR¹`P¡$ŽãEJ†¾×:®üìñŸ½8 ƒŒyz=©v oÈs<áí½8•ézE#þÞ˾~«”ÏÈ Òâ¿ßѱY™ª <¨ €FnÕîTvÎÙý7ž)»wÖæ›©òÏV!wèo€CÀÓ6ÏtMpÚîŸsþË÷yïó–î?ÖzçRDñNUûa4ÐÈŒÃ?•ùzæw„mtjQêhŽšPð”‚FÑ}RѸ­ã PÀS4M1UJÃŒ=|Ïê¹Ußþ²ŸÏ¬Ý¦š¬ñ€Ffj³¶@»¾4´ qâæ?ý#%Žoþ $Ï5òŸ€ø¦)p4Bç±yÑ݈J¿~d§a¨i£ªª&ñš.êÖº€%Âpƒ)æÖÅZ˜h£k4%Ú ßt®9?êÖ ;…¸“¿àÔ Ù Çv®õ¸Ä‘:.Zï”â;3W™hÞ®5w 'ì'g(šT‰†Ø.͈“IØU‰jýØn¾ËFRrx23Rr~”hècMê‘í`£a¤q³4bŒ¶ÁJÄÑxzùCÍR¬Y{²ŽÆq(pð’ïÈ—> s‘  iR× Óˆæ]¿¢ª˜øa6RÙ ‘Í’p82l%xšeDˆA4=Àýæñkº¿òkN4†!úHXû~P*?ÎX#ªÞ½B.™ËP”<»†Âñ;´Ö§\Ù¦—ƒï™ta(^Š“2ŒF% Xã8”Q˜—…Ê´óŠ–Uµ5)Z òBZ”, jó_¸’Œ«_ã<­«œ’jÀ°é«öCMÉSÖ²ÌÛ¾ä, B!Üò ±2/'‹“ÑɨVŽP ªÒü´P0¯I«©gœFX‡DŠjKR²®+býáúëÙ¨q^µ¬²æ¤X±*X@tóàLÉú@]¶¢*¿®5ëd[9˜R®Ð¨¥‘𱋇ތuõgZý/zzGý}ñîþ¨/Å ht¾aãŒJ<…8‘4 !0\‘*‚ÖgÁ˜„S!ò•%¡šÖ3{à ™sÁž±®þ«¡·/yû.øú$#žq J†ë¹4òœôõˆ¸ÊMÛHÅT}÷fi$Uaw¤q»>8íðÝi K檃7ü7k}·`ߌÝs§Ú;YçwúA&µ~PǤÍsËîí0•ïSå½.æ6Œ×ùglžÛ5þ‰úEîVù&ÞL×3·Ãs«©+l°$‘Ëþ“û:}jã<þt ±ÚSÚK«Õ ¸$,, $„¸}ÅIl¬°[»Mðíf¦æðÆÎØ€@pܤÓoù&™&ž;©k'ÁÆøhè´ƒ1ôYpíÌfª ŽÝjžÑ¼ÚÙ}ÞcVïó{áô–æ#ø[Ε4Õò†å/üH ¨Žlß—¥‘KåÑç–B#e¡óni¤õ)‹ù#‰¢PmU”ò/wïÍÎÌ>þ<|øÈ ÿœššž™yðàÁ“ë3³y¹Ð“‹äžjT÷¹LI¿ð_²*,a£Û0ÈNútÝÎÌþÊÌ>¿i Awû+ L‰rC_¹1ÌýëÌÇjÅ_¹Äã>ýpµ6éÑøtÉÚTûå’ÞÜžJm;3Q›ÕѰœ]F!•AÞòjÅwb²Ò_Ï×åÊH&ÇN"÷d½˜¨Ôõy´ƒÕ ‘¬¸ßÔ÷ì4Ò[ ½sCº¸?ÿ”Ÿ¬4hÀy”Dqø“¦ëhÝ‘˜ØÑÌdŠ2]K¦ÍÑÂS( D¡ÂWÈœ‚Óƒà+pÅò\-­a_ß ÷ðGbÜÛó‰]ºc­\gŒîŠÁHæ5IT©ëHy4LrŒJ[‚)—¨.†²~Gxöå࿌Å4B"rÇ\)(h•’–“8£$Ò¨4:[0d¤ °ð3ÊÒO«-×Åâ;L>TØÅú½ño°}ÃY$·ÄˆñÔ«íùÚ¡­RpO..߈w™b` 4r[(¼¦uì¤4(²p¤eh*‘!i6Ž<ÇÙþA/ªpÌ:Ÿ)€bbÎHÿùóéæyÎâ6S2Á–Lhl×…‚¯ù¼qm!4îs%?a´4–ÿ>CYos%¢m§»ãᔫÿéà¾ÐÞ¾ˆd’3Ñ ÉëÁ¦Êz‡9OPÊQx'°@›‘cJx©QÎDð–Òi S „Ê“S°WÛ¼c°i7$l0˜ï1ž÷‚{“ÛvÜVÈ ¶ «ç3/:cÏJ#Pack%?@¤qÖ¶õjiä¢3:w1xAªÂsk#Î& ËgžÈ%GøŠ«eÔÝjEŠk"š?tl¹T8õF!ç¥ÒÈ$Õñ\µoû¼"4Rºí£â—»,¾¤¥ú}à ½ãÞ¨g”q̱5ó„Æì/ÿYÌ­CèóòæBŒ¡0 E’驳g¾ëGü˜ øÌƒdjjjfúac}Ê0‚D ¹åpØWa¨6Å«u‰Ê¥ªªÆ~¯&áÑW Ã^~Ð+V‹ñ*cO1Ù éõúë2OU›Þð_-Ó¼beªÍL®ƒL® ä™{õ=å¦~Ÿº/å~ùÝ•†„O7X—Ù»±â¸|¥>MIå’¦×ÖŸX_йNlÌeW®de¸ŒãÅЪÕݵbŸGNÖÀ ³ûk€IÏJ#`B ;\iˆû­'ýì Ç”Ü€çÑ  #àj8¸U×ÙB ›ßŽÐK§²+jÚµñËÀD…cf [cgÃUæœC;Ä#-ü±Vc×O³^±[+Máz¬#¤:㎷ЇC õ¡0$Ñvµ¦Ú/¬™ª*d8FáËÉí”ño¤ý¨j,¦%Š(¥[ÉdPIF¼ˆòë”—R-%,ê¢)I­Çñ߉«¯kòïr–I!w±~7æÊëMÖ:ÁXoóEw¹¢ÛLÊëvS(’V›+@ÂIÅ]Ê9W» ¸çoŠÿÌåŽkò€L÷yÇ'š’RòrF¾‚ÇÒ6Ņ̃ªü{™Î;˜y±<_i Ç…G ç!³€Þ'4@ivß Ü¢óZª<Ï[Üaì7™â›bñ¸:ÿ&›ƒŸä$Zp‚”ËT¿’xcC´;ôê™h{xoªÕ?’  î}7¸oxKÛo"†"íMmƒ‘ö¾–ý¿Þ²}ëZÿcŽâàT¢À0B¥”ÙÇh¥ GÐ ™Ô×5¹³|]o m8º^8ýÑÔñ~hŒd³« Aüž.ÿÅj÷˜-ø¬42âŽ:%]ŒÚÀ ¥Á1[àO®æ«…‹ö pâ3Oè¬7}¢ÆÜS­…ÆUUÝ€[HVè†jô'ªòNmÈéjÔì/ãZ­ì¦Ò¥&Ì©\Æ¡+Õ˜‚Ê@)œ’+5Æ ¢Ú°jU¼1{¨:«Ç›¯Iµß¬„oU·WÓïU\o•y»-]HãÓõr”L[¡üq†rJ+ ^Ó1\PZÞòfõׂa?B¿_ìñgÇýê>×3Ôˆ>Q!ùŒ½~Ko5“têë˜3PB+tA¿¡£…91ްá¥Òs¼ÙÔ¶™õ—ècuº7ÃlG”;Öƒ@:wàQäd‹ØÑŠVXÓ1…‚§•îC×öU‡ZL›¸×6dm:b‘¨îHÊýŠGcžaóQ¸œP82°ë\ÙøÿF鹌†íS’„dF÷¤Ú=÷/U­ù–)»Å;Æ@Û]6o‚_}EŸ½h¿BÑ|Lª‹ TÍU«B0Iªã‡Çá[‚(վ߹¸`ܤ a¾×xË„hTYî« ¿Ê&YûU¢ä#²àcÊú…B°þ&"æ/–ç+mÑ×I ¤.šÔ!Æ¥g Ÿ@‚“B‚ÄSÎó¼Å$k»ÁÞÐÜâ,\þ=ºè[ú[.‡Ä•,CÁ19¤ðnh?”þÁðž¡HÊî<œŽ mÛs&Ôþh¤i÷ûvh‡ö%‚{âѽ=Û÷wEÛ~ùRs³§Ñi²hI†Àpx±)•Š$IDž!'qVAìiØ:мpŽ7‰È¿¨¯óç&Î3à@Iƒ/I{ïj/íêòOY¶|ʲdËY&”J!Æ:V’9Òl0’i‡ÎÛ`ÙÈ– &„ÉL§“N¦t¦™P  æ 6à`mÓÉ/-$¤B“I§¸­:fœî<£yµ^½ûî#y¿ŸÝóoKv=§ࢭ¶ÜB˜ŠMI;Yõãk•‹C(Èý«ÎPB•>Ü®Rn9#¿¬]¡.ôWèJr¥Ê>º ƒê„ò¹:ÿר¾gYÃ`ŠjXœ:\âù¸!Ç\¬ñŸwÂa~ƒL’]ÏWðý²5oç8ÂYåÛó]ošl;síïV®¹R ‹ ߬I.Vû=Ú7|üòû™¨ôý¾¶í’=¡µ3ÕëX `úZó 0Æ—O¿„€:¾¥Ès|ùÜ ÏžTà¯Oþú·}{ö’˜J_:¢‹9îÑÇ–ç zåц…JÕ¼!gÞ±Æü.M)M™é ^•Τàø)DM(A l¶ E0‚ ÁEéx~†–Ly%­ޏõc¦h]æ`Ò1Åê Çê…K–‰qwáá&U³~ ›Æe¼† (‚Sãnñm?ÚŸJv1P1¥c %¢FÃ!Ê+Eã¹êÀšð¢iÄî¿ZåOncøloÒü•«•W¥ ¨ GÕ †q²‚ÖKù?ÏsEm+/Û['ì¾óÎÀÅjÿ¶ì¸œ¦xœÏ?.TµMÔ*—+}â0óe'¹7c¤Ô„‡` J§‘8FF íJ§P†ÄêäÌë¥ u‘kÊ9×KïÛ¥*ß »rÁì‰ù÷f95Œ„›^ôè±/ž<f|CÚž}½} ’'OžÜ¼y#IEfà¨P&Ë'We : #uY#Þ…JÕœ¨[?ÒléoI5d°))‚ª#¨t1ƒfIþU C"„Gê ÃÞ’èj&˜C£Kx„‘ Ì…GWéŽWÇì<&Éó.ršc òq~Ô+ »ÍƒÎü¡Æ¬!y›jÏÃך™Ö¥rWUö€Go’Æ—“§ÜÙ±Fs´jÈŠ5åÇšLQ×Ò¡SÙBn¦PBC§ãj–ÍüPAÁ”̽‘…Òßö¶-íÛ¢Wà}þÐFÃ~˜?"ìöi}Ë8k.K1`rJƒ±©b ø#5ðDD·ßãÓÞÄõ*à©/ü¼„¾LnØ?ïyÂü0½«GÈœ :VÈÔ Á5ÇØfEë#)‘ѳºÊ;lÙ½}†[ü˜ø—4|±Fä”ÂÈ ¸{ (Š¥4`È-£ÒðXôš–óg%ˆÎrHÕ)©àsÎ2#XfXÛçZë!ÊèÂh'c\†êq±–ø;ñuþÅuüh…€×»3ófæÍ}íå½ÌzO{×ÇÚ öÚŽmŒ¡-‰ŠðµkCU€Ýü–ª„ÃF1¾Á¤þTµ¿¦ ˆr„pãLÌÚ¦R¡¤ß U„‘b‰ÈÚ¯V³«Ùù¾yûæ}?_5Åêšÿž^¶KðD9Adl¡ÐYÐ&Ø£êsõÔèekÅ}9tKöŽkÁ e ðÃx^äœ3ø/.zŸ‹KÏf¯“<ÉÑ"æ5Äq4í£˜fÎy\Î?o‹Ý—°»šSËEG™dk`´2ÉÑ*:gµ8xãºV÷û­8-¸“¼½‹K°³[¼Äÿˆ%„ÀM%ÿŽß'ûÊx!)Ù«±c‰`T2R-G>S÷™d¯æò‹se’Ô óƒž@»¼sÎHÉ;ÆÒ 1Eüów>t×HÎâè5'iñ”xÂÝ•ƒ_H±Ãjø Á!D™b͘â‘a–bQœßSŸK¿âKa’/Ø<×¢Köø¥tF(œÑbà®)[xVðÏûBz.¦•ð1vK+œ•0É“¶’^ÆÇSÙ¤X˜”­à`z3`¬£äp¬mÛ\«?ˆâhG÷hóæ¡–ÍýouÇå<áIèm9®ÄXŸZ¹ï¿‚FÖ¼{<Ý}¼e+àä©7ààPó¦ÑµÝ ™ãí]sÍ;Òº¸q$½ ¾yª—?´lk-«ã1PÙ.#v1Þöqez¾4(rqI牊Ös±–KɵÛã¯S‚þÖB‰ˆ…=PAX"ZEžçóek«~ן*‘óS¥úæš÷|yúT¢õóDú|YûÙŠÌ…Òô¹dÇ@¬ þ÷ln1«ì~U”ÄÁc’ˆWDÓ”‡@ë]…§’ퟤ2WâmÙ_ýÀóó·oæç㊖«e™Ó%­iW &„.•¤N|òéS‡­OÏwøþáhÖ"p¹+ŒŠÈˆ¿`”ßÐʦ”ø cR+œTãWÅ¢/¥’/´Ð}98n„&”¢‹ÖðFYÓi lÔ*ÁJ‰iR¡Ñ8ŽþŒ&4lº5†`YMiTÖŠàCƒ –Qè/¢çk½ø¶¾lÍêÑ;\`ZN‘ 5zOHâò3&<"³; #FPÍEiÐ :°ôW®p»äU‚Ï1[͈¤sÛˆ¤Já-50e/ÍÈ‘•HƒíWB&d­$RàIüe=pM[|M‰¼ÏÛ 2W£›™•¥[rIö'gøŠ•¬ÈcÇA 0V(‰É%¬¹9»h…$ÿܱ&n«Áëzè¶›–‹néñIÕ?-æ?TK>ud÷‡ySóª³0Éè´ “ˆæ0T< ë6[)D÷•’wDo+…WµÐ]­ø¦Ñ oJá [œ6ï 鹸®GÈqx¿§E®«þ«ŽÒ&ŠƒÚGÓ´fa:“ËF:»F¾©ãPÍÇÚæF‚ÿ« y3ÐblÝû¿YÕaä ÆL"Cj+°Ð„Já;M«=ý-á̡շl9’élÛ2¸fÓXË{sÍ›m¦ à²O}2Ö¶m©+…¦•Âä¡pãç%í'—Ì›FÎ$ӟŚϷœ,o…‘\)N÷z–˜XZÐ_`†&AÐ$˳3˨Р0¡Ès žH«}“«|®y/”g õùdæ³Dû™ò4¸âDy[·«„&é|3>i:S»›+É_õ§â7Ë(³ÂU0k8N´].i?øÁççlY;éd²íb" iÒóaq²ˆ…mjzrê}|ýøÉ“g5ò,K¾‰w±[¥`1ܘó`ƒo°Ê:XéèiÕÓÓW©®µÿñçž}u¡ýîÑ&éHµq´Öµ£ñUm!"ÊaÙ}ø§Î„ûh¥6š”Ž¤¸F‡Æ`3EòÕNc¸Ñµ¿Ö3¸b®ymGR ×P½í`*o eŒ¤„¡*ëØJÛ±Z8†\ý ®þFßÇoËÕw‚BÊiNà‚ݯkcuò¡ Ïp>œ²5Î;?ž µ£T rX–å/¤ŠbOƱûåidOZÛÝ®ôtÈ{;;2xU¹ÅcX¸ƒæ_3[ ,p¼ Ó ÆYöS4<’ŽÒÒY_°½Ã»s­zà—Ú‡íÊŽ6`‰õÃ4„}W|Š€7¾;u³¾'íëÙ t4­- æÈœo‹¥lá)­`VÝT"w䨤ž´†æ½L|OÀ®••u‚åh:B³ÝlÞ¬³Kxqlí[¥¼_³ÖSRtˆÞP×ì…3Zñ%GÑÛªU¤Íà ˜x™1Ecz­áÍ 9Šà ¯ 9É 0a)† DîÇ ¢s^©×…q. r˜tÄàš_*1ÉC0Ý-x¼˜ú³Èa¦Xçð,¢XLq¹˜#8,Xhx )ƼœWV ºÊQ þG}¹ÿFq]qüˆE~ìî̹sïÌ×ÎÌ®×ëG`ýX{½ëõÛÆ`7à*¥°wí]»"iš”ghPE•„l ,8BJ«þ5?DJHC€Bì’EMú 4= Q„PZÕ*­ÕÕÑhtw÷ž™sï=ßÏ— œ&ƒÝ“yÔ†•+fÕ #4rÅ.Å\B Q"DtA{Öx0H<<ʤ7vÕW KvÕŠmbEpe7Â.%+7@Oëp© Y¬‰²î¡²Ä<ƒé“d É‚`å®Õ b·´ÐoùçvlR,)›6˾°âgŒXÒôë¼ËD‚’­ [SEMç³¾Õ" !ÌæÖ¶Ý#ùÎ-£ñ+µjB ÍXPáŠf%¬Ý§ê¶™÷ôPL8Õ7Ì*Àï);ÛÔå¸àDKpº‘Baã*Õ‰‚a)=¨X³;Âñç–ýp(ùÉÑD–"2ÝëàŽ÷nþOhdôÞcíÛ ÷’¢©<¾§ìÂ{­©3õ} ÇóE#6÷‚Î^lLœªM\‰¥Î¶ ¼³$™©^ùjÙ’t°¦Nóù©¬P g%_pYy[T॔ZÇwxEÁÎlÌFüf:‹2OŽvøÆûǺBot=¹wiá¶–‚çcƪR¾FÎóæ`ü„%äšT~=z©ÍÿVga¦)<Úaïm^:ïøñPx_éP¤‘b)JI³³ÏÙ•¶vô?*q†Sæ`ÂÚ=P¸çYû'Ës‚àt¹/«˜Bîå8Σf{Uª€;9λ$ªmOXûÖÊÛ{„=Á½ÏC)g×Láq^ëõöý ñîîñíHø‡ÓÖ¶„PìP‰¨"4Fô[8e×N{˧Š)½|ÆŠLëå¾òy—‰“F¼n\dˆP=š/c@‹ãLÁ- žï "qLA…È}Ì(¿ìDÿlÁËFnëµFd3u§`f –#["LÝ¢¨¤ËŠÉ+^Š "³s¨"¢¬I‘9Ÿç½è¼æÄ>Ó*/ÚUq¢Szå_µø¥È6Ðcb~P²±Í“ŠàIe…)ºÌaQÀØÔ|Àk§‚¤pÈÊ…6+/RôI+2«‡¦œ(°èf;óBÖE^5W ‰@'3Jì¦ÅŸÒk·*EÆ=p‚ŸÞ‚sÔBbHV©åA²KQUÌdBÝ‹Å$ºèÁA·g9\³"7ÍÊÏŒòkZéMä²_«øe¡<ñy/L‚‚‘)¢<’‡8eTÏ1'1ʘË]À„ aTßd §Ê «ì†QvÝ_rŸÑyßHÅ-3ò'³üsýÞÕhHh/å+’¬ Ü®[ûòÑ5ëOto<–Ü4Ö¿å`rý\©HæW}[€Fàï‡×þ|㊞±–RféQ<]Öûh*EG4«·K÷%~v"µ0æxz ÅÁg^˜kÞûìqÿ&+àÍ/V½Cÿ)oQýgš|²>ùIÝü ÄûõÝ ëR§ZÓ'›úÆkzÎGgRçj{?©I\ާ/Õ¥OÅ“¿ý`¸¬}ë‚ÆÊ`0@d¯‡§n—NFÏÿ¡vÍ\óž‹%>lLBŒƒÖߣ‘wÛzWšA‰—›ô¢Éºµ# ;=Gtåƒ†ä¹øšß•ÿÈ<~Ž?MžŽ'.Õö®ÿ_ÐÈx}PÓùxïMÉ÷uð„Fªª¿þû×~¤‘oFîÞ\ypäå­UÊ Aü-ÚÜ\x Íi|„êÌ´Z£-úhkñQ@ŽâÌâ’ƒí ö/òmkWÄ\8S”Izª¦rø)óíá=]Z‰Ÿ@Kñ»D²8PxhYÁ¯—š™–¹§^T4Òî?Ôí lÓö7:ƒ-¸Q¿LT$ .NØKŠU&èz>Å Ò{+ô‘¶@¦©äͦÒѧœ7Ï;~<þ#ßWK%ŽðÀ2UìÍ«AÁAýxw¥|ƒ½¡ÿ/ÊŠ:„¼n ÔyÃF Xþ†pÉOW¾ÚÇVÖƒ^ø=˜ 襯¥;úý¯§Ì]ý¾ÁP‡5”Vw§•=ýÚýÎPÁÎ~ßP? þ³¼ÚžDáöNÂ/åeqÕ%€‚óXì¡úŒÙ8kU]õ•M˜¡«Nå-µbÊþ¿¡€ŽL$T»D@‚9Qàä¬}øÎ$¢z\¿Õ#³fíu#”•$V3¡×l’ÓÃc¢(‚,aÅxdÓØãŸK<$‘§œ ÍÇ „€O¬Á)«1Ù”·nF M™á«Þê‹þè8© ©a7`­žÇ€jtUÓ°$ ÙI$ 1FDvO†TYuâx‡ SŠr™ŒI»¬O›ÑÛZÙ¬Ÿ2Ë&Íp»dd°ä$¯,`L%|]‹Mš5ÓFxBmQ‚:BTU¾!ŒCðÊf>—üU^²Móp¹M C•T—("& åøYøTÎÚ±I5ô¥^9a.¼iÆ^L#†Hp¦À~ç^HÑ]MéÞ—d_\mäTE¨Ã"¬ˆèaܪ˜Õ«¦ìŠ+v–F¦ÿA}ÆFqÝÿVUŠò°wwÎ7÷±3³»^Ÿ16Þõz½»öÚk|€C8Z `ïiJD c’¶é0w€âõÉ‘&j>ôCÕªRl°¡Êa°’(BêíꈈVuDåvõ×èÍjFï½™7ïÿûÞZé´R>ç 驸BðÝÐ<ŸI%SZ`XôåÒ6HÓˆæ×µ:„Z·õ½–NÐÈ@ª«'Þ1[¤×½q2n ·e{:ÖÑ—ÚÙÛ¾ëh|ûW%¿S\Q,"ÅXpŒb qš q—”Â'£'š; ß¾hÇ`bç7ÐØ£?Ú1Ãh@À?k«ÏÙIÄáXÇK•cþèpØLvs¥@Èx(>R¶Xr¦&9Z•¼ˆ_+Oœ­Iœ GM6c0¼«ɱò–QóŪ¶sØïB͇¯v¸µ‚Q­:át¶ý‚ Ë„ããUÉ‹¡8àç5ñÖl&K"B§ƒk>ð®1¾Öw6œ­ØÐ•[Ëë2Ž¬ã‘¶ËcWªR#Á– ¡ØûùŒ‡àèñ\uüÃÐZ–À Ö'óʲ¦¯>šÁÆÃ‡Ÿ©‘Àÿù;üî^'5Be(\祲–¸ûž›FŽGœéZ#]kž¯s¥—æô6åõ,Ïé_ÍhV°7ÇŠß¶[ŒCXYÈT8æ¹YÅJË¡<Ò¶”çö7ªCÕúЬ5âL/.8^ïìmpô/ÉïyÙ5ØX¸¿Ñª¿h!(ÅŠ“q†Ç‘„D¶À 1’Q”íz½ÒlÒû;ÒÕ® ê¯æžO…»…¸Ì I„'Ø„í¯ÕfíMI݉祱; qw·¹“— g8Yi…Ùâ÷–±‡R ãDÖꦦ5S)/Ȥ±muöOãî}íÂá6ûî„¶'™÷ó$ðC8˜BûârwŒÂù7áöÇrv'¥‰ìýõ7VJ’d¦rĸö¡ ¶âÛz1”±Æ"Ø™ïÙÿo4³ ÉP ÁÈ$ÓHcDHˆÔ¶ä³C¦T™eÜö¡äý\ôMË §¤â»rÙ¤VÞ):£²9< !Èø@ŠÂ"4Ÿ¤¥6V^E :nË`1†¡iÜ´,Úh—9*•}i÷Hn;|“rèMÊeá, Iò0$ 2pV ) ±QóˆLpZ›èh¢Ù\ 6[‰ƒ}($n…¹À 8‚®cÐÈçB¨ Þ3H$1C#Ë ºpR*šÖN …7²»JéNN³Û,𥃢yŠhÚ •¹ é×…ÀwðJŽÿºü™œ/I¸É0VÂæ\@ã CÑ™ï+Å_H¥·ìyŸål°„BPöb,³€£ –‡=ä.#Ogß‘óþ,øo¹«®e‡ÿ"•ýÆ^´^°gpV©UÂh’àBu¬zK-ƒá”`ÊÓš¿ i°&eÊÆQ¼Bšï¾µiÑ?e/T‹n¨e‚ ÑP sŽ•Éˆ±6+ÚyÝÿ©¸­ø¯ªãj>ì²ÅäŽ –µ}.ß„´è¾á»'9ʶ ŠC–çY‚Ð)é[ôüJ‰–}c}w„⻺ïx y'XÏrUpŒ`y‰•+edbK8ꪽòS©ü¯º×Ä­\ü‰ì½©ýÏiÖÕ=Ís]-ºh÷(IœN*[kW NÄ:"C p:[EÒ±ŽÁMoníkë2=³a;€¤7Ù9Ýñ^ÜdÆ[¯FaOV¾Ôã­Ts÷µl×o;ïˆ}A˜7xæàŸP¤gý÷Vè" +à¥ápr܉$/…æL#dlj±`ìb0:Z™‰€:L\Š´BãRUj<œ ÆA cÿ ¾NŸ›¸Ï8€ÿIibliïû”V—eË—$[>$[’o'0L°%Y’2™)˜@H“6 Œ 8E`M3Ói§/;MÓ¤P‡nƒ 6í¤/˜iÒIÅoÚ8Sêç…$ïî³ûóo÷ûùUE/×uÁç oü†·ë”7rʳñjMr"Ø}Áݾؾ_ÔÅÆk£Ù3G4 §ý$ ‹¦TaýdMäÁh¾¤(% °,!àY&I|½ê\®M€ÎF‚Ýÿœ dÇÀ¶%¿ £QÏ>ÝcÇG¿ùç× ÆXÐÈ¿¾«oÉ£YØþñÕ=’áÕ–ˆŠ;^ÖYDe9ò#¡Z<æw:Ì7©û’ Ø><­¯6°Ièµîꢢ…ƒ=ro«Ž'9 ‡(/&±³1œ‚c^öÜ]ð~^ò˜øž!qa(ÃpŒ¨8…±4D?ÜÚ‹E9¡Z?f,»-•Ìi¥wùâ KåU¥|³ sxžŽ¥ˆìa(¦ÙKŠÿ¡ä½-;fû×låu-Cx%—†¡ciÐo*`LF,š’ÊnZó¬ë÷ÆjEr(J&XC"GGcn=‘]äÐCºú>ç }Å»ÿ&»® ¾ œ…Fp#˜ GXˆCІuX˜‘®ª¦¥’ÆêëªsZªhAENsh ¨"p‚ÆX¿+UM«çJf9ÏÏi“ˆå¶XHå<Ç4sƒ­ºo¨x@Ì«®9ÖuVóü”u,. Ü©#hRJ‚(›2•gÇYrMëd*Ϻ&IÑ8eCÉŒíª\=g¨º¢9¯©îû\ùUCÁœV=ŠÛeBÿ<‰²à7Å„Þ;­øçYHp{—-y VdÕ·Ô鱚6Õ\ <)V3 /èa¾€1eº¶·o9Íša¤³ïh<›ï ˆE«@’ØööÊö6“kshíPd3œ „ù¸£ïØÆ­G{ßêµOÃY:©*vL¼­á÷ßĶƒ[FYÀ'~H ŽF^‡Z È{ `fó!0ŒÏb?ïM\òÆOû;O×.™F 5€ä‚¯s²:v¹&~¾6KFÒæ®¡xËÍer V_JÑ]ZÙñÚõ 8jÜù¥3/p‡ÿà}x°Ø¾ã+âÐ÷ª/ ¨8NžõÆ.—G.ºÎø¢ŸÕG¾ôE?¯O Ù[,z^ÑAøãðJ‘f´rÝ_ý§óÁä¤/>þìÇíŒ7½€‹W¼ñv¥4ÿA¸ Ï>ýó·ß)c" ùæxÚú¬SU:Þ  7X·W’A W`Á¤ç9,/H™ºË\ƒE#ÍÆtИYÓMöTsYªÎ:RomÓŽ´Œ­V2õR¦QK/ú:µLsþ‘¬C”‘ópP JÇÂŽt‹¸Æ‰ëõÆÍ%…éuæÃk: žhYr~<^ÇV8[s‚2ÂΉ¥õ½lÚåò@RÙ7ìMXöuCôË{ãðËb5´PúòîNÓ^åÝvËÌääI8IT¼±QÚ„êá÷w›>Hö¿jØÓÅÔ#½×aO¬¶lzÁÛªa=+a„¡~Ì ¥;"†=ìþ¿·Ó¸¯ë?ôÕöe ¤íï±ìŠ›÷÷rïµ£þbkLlÅ!ï3“ÆšYƒë>[iuÅP³ä1ñ=5‚“Œª#% c0d²ŒA a—AÈ>±pšF rç˜ÁuGòNižÛ‚s^(‡Lïã ¦GišC)Ed©v2M*ewÔÒû‚jÆèœ2ºq6øì»ÁÎp‡ÃI yo¨Õ›9G eiŠ!Q”DZ·)íŠRrÛV~ÑèžUjïÑ®›æÒYÁ}Sr6C óE–á!I²™f”Ê;rÉuƒL2+W4"¼ˆX¼Áê 6GfĪiÙyW)»%Umç, ¦#(šÅ²úB,E˜¯©Å·T׌\}S.…Sýšu8†S¨„3 P„¢hŒéã´›jɬ±â–Rý‰PKã8CrHvBs8õZ‘ïd¸ûËò¤GÐôÅÑÄo]ëþ²"¾Ø¾ý‰ñ@'Ô„?y®&:^×q¡.v¥*2U±áL8ö'ÿÆsuÑÉÝ©â¦õ¢=¤Z¢œíwÎ6 Óu±ÏCÀÐȹÉg=>à´‰`×éÊŽ³þ® ÕDÓ$ƒ<Ëý7uÔ­œê†Ø C¥?²Ú¸à(a ñÛÅt˜Â©[¸…!I™F žQAR׌À¬ê¾§¸çí%sZéºóã5Âp"E@GRdTÄmæm_‹¡›j”ø‡6È]¹|Jq/˜‹oƒC´’{¼ï†^²šFbδ¹4²,ùnË)ÌXýŠk5,©nÐH§ ò†(Z$yj4 ¹•ø£ìñÜÕŠ¤â9=pß6ÿ½7ÌEKrÅÎ^œfL'àØ“ÒŒ>Æ;gÌ…s†wY)›Õ¼ÐÕ¢ì@ü ™dá­| ‘›–Â;ªw^*9ǹÀx !5)ð"`OdY˜œX)|£L™l8Fq.]fpÑ”¡!ÄÒg)ÏÈÞÏg/©žeÍ xG |'–ÌÉ®õÚ?@‘É3§x@#óº/õåŠFæÍ·9ÿ»FYÎFŒ§ˆßÂJƒm¿\kõ¯£w"zèBû¾d×kï†SÌH´íOF½{m`×Þb% þ8KcA›ƒâ³´Æj7w5m/ÍΧ0‚¢i81>)ŒEz>¹Øy`<Ü æ9Ù_$ZXŠ–IÞ½äßþuEô“šðdmìóòðziärUdº²ë£@ë5‘« ݇måvŠ“iNÄI’¡pDH8©0+qœ²ÑT`B} WÅ¢BÒ¤å?­ _©‰­uÜ©@äJU䓪Î+Ωš840É7Õ]“ÁÈduø«ªØtI ða°ó/µñ¯*»?hj¿ŠYý¬:òY(~­2r­¬c2Ðñ´×çZEÆú²ºë㚘#!éè‚ìȲ?žEþýŸÞ×Ë"PJR-½Õ¹·‚žvUu{ÎõNSîh(°1Þd$!}¸L?¨M„€"–þ&Û+Aëvâ5X•‚ˆT6!žÇŒçyç›Í‰zÇÚãÔ’•Î ¡¬áMŽ‘çó4çu—æÔç,!´•DµZöPÈœÚFê Ƕ­;?~¨‘ážx6ï7›1jT £ ‡ª tª'ãæÁnðPDïO•uËP>°6Š@ÕÈ)ÏHG:Ìç÷Úúãæ7veíQFµþ¸1´ÇvöÖ#1¾½ó8M„‚Â!$™ˆL«¨ýªÍüëNÒŸQ8P„ÞZæ<ûÃСõÔî””VLòÐцºáê<Þ hÑÎíq½6¹ ñP•p”vZvÝ}3Zþt–òöºóã5¯MP°J ŲÞH‹‹rå’^tGñ=´-Iù÷DײQ¸¬¸„<èsIôÜ2—¯¦‘ßÉ0(hdAñ¥bÐ çÍþ?¨îÕ4rGvÏå-ü_þˆFæôòOƒFà$Ã#"T(Z#6LÙ‚·5ÿU%û®­tÖ(¹sÑ}Sö¼eÃsËRósÎ*°(“F*ÉAazb¡9ÐÈœ^xK÷Ü×È‚æ^Ò|H÷5’êDÐ}Ì™‹þλµ²7Å,šÉÄNÆž¢dFR¨ÿ_ïOQ]wÀÿ‚´‰ºîÞ×¹ï×Þ]vY–÷. Y\v—…(à ¦£˜È>¥uL+àÛv¦M¢‰@+ U^ Û™Lû›ÓN«#Q  ÆÇHĘ֙¦?4Õ~SÛÉD§ëh`Î0÷Þ½÷œ3ß{Ï÷û9T„çŒâH–5‰,Æicº^1áâXRàN‰HÀ ÖÀ-o“m׌ş«î)µX¸a/\¬ïçæBŠ@›]Ð@2¯ל¡g•¡Y”ú×ÿh ¶5Õê2²c¨±mdóÞc-»O$v ‡;7n;ß1Û>ؼsÏêð+E,ÞÈánÀ€%!ã),ùá] £èÈoÕÓÒŒ;œØ S:ß hÙ¹Ñ_­â êDD«Í=VÑ2æ\ñÆÏ•FÇK‹¥`À_ãõ`ëŸÝœ²"0žgáˬU3‡}.z[.7]­ØúÁ‹ rÇP˜Bc˜Î+ZHWÕžíÄ'½áTÇ,ou¿:H€ÄÆýñ3ÁøAWmˆMƒ5 \ä$€m%PȔٙ_}yåæK^€Sd"ØF#I±t6ƒFlï´ÀüÙÎÜœñf‚Ȳ0­!AO.éUr?“‹?• fL‹V5RÕz )Kòt™Â'ëŽÅ~K-úÖö‰É3§•̊ëšVtS*øÌX4/8©.oFv=ÔÈ´’ §pñ1™Ñ< ¼$S8d6Žæ@#*E«”î=ÍyWö¦L®±àZš{^+¾¡dÝÑVL1¾ ¤°4 …‰LPÌSÓÉŒHyÓÆüOTçÜÒ @#¿•<½ š@5½-:§5÷’·„~ê¦Ñó¡“ÛU\'3˜™7è9ļ Pz†2P,"iœBðzZÔSô‘ÇYVŸ‰/ÝŒ…‚;ªg^ó|.¹!È7ÅÜEÓˆ)é›_Kÿm×Ìž:‚Jœ´G¾êßEÛ6¾žrõmÛð¦=‡m?©xe«ï¥¡¦H0i‡ƒH{_¼ãÝxÛÏ×7¿”ïÉг$IÂŽ¢Š#Šb§¼é¹ûSWУd0Ú£¿ßu4ÜÞÓÜáR¬báUÊ$êw×_€bç‹^õ% Ø}ä/–F&|±ÓåÑýMG²kàûG$¦è‰út×h0qåÅÈLIËxyó=¯Ž¯l9ŒlQ°)Ó3ˆE¤ˆa'½ )‹ŒûSVÁÙÒÈxyÓDId¼h㥪-¿*ªóqš^·Äjà0Š"`S€'—ÏR|™‹ºóª/ûâ®$ @ %‘‹eMà™óþèwŸÑ@t¢4±%ÇËáhþNy2üëþýüýKUÓà{ƒ®h;íè]k>¼òYWÕŒ.¿c .w_–1Œ3¼ž·ã*É&÷B|8ÁŠ0ð •©ñÅ™úMÙüž@Ρ†¢÷6Ø{V™‡jŒƒ•é¿IY#é?®ÕAŠƒòI‹`\‚\ºŒY&f(lµÕ¶Å—»•³oMZ%7ÔŽÕÚB‹Îoj¤?d¨VûVZö”ÑÔ2NOB­á¶Œƒ›$æN|­‘™¤¬‘·É~ ‡î–§–}¿WlµR”TعP4 ÿE–çIZ„ 6£R_š±·1§³îÆÍ¿Þlz+’Q»šAÖîÍÀ$ r34üšÖÙbéLNž… Xº6)ÑZ c‰åH¤éBͰî)Í=-,:?þOÈ$Ë&ÄqFð/ÞÐüÓ&ç¬êøÖvKΘ2çÜ”sgÍÉnçD״溥 &¹Xg΂Ŏp¤tyââ“iä«{÷ïß»¿Â»ª?O³Œ„gw¯¶ >óªj;Ri Ù»j ùˆÇ "#d 1£$UP‹-¦æY·•Øß®Ìì­±þAnOUÖ`½µ¿ÞÒSgï[¥T˜†jž@ Ù»+(‹N0T Ú6¸òÛ™ª3z×8Õe½lªK{·2ãH­u8-ýpÅ¢óãíßÄ—ùsS×ÇÿƒÓ[ÒÛ÷M»¼Ä¶$Ë–dÉ–¼/€IqHiRlí2KÚvš6S6ã…ÅlcÉN0KÚä×þf €14¸nlãb0¤é¤’v:ôÈüÖÄ(µæÌ›ûÞ»÷œ£óÞ»ßÏ1õ7µ–DåôZÆLájBCÒ€‘âÛo˜:ã å éÀÚž8Ј{Ú4Ò3‹É]QðcìŠË½[MÝmÜF|_YxJBd‚Ií2‹Ö8ô;6™;bÌ»mL_ Eäƒöx”9×-a‰Ø…4R˜Ñ4†–‹kXJ(’‡è†%,UÚƒ-ÜËä%T"¹ æ‡'iÓ]gAñ¬8~|GaðÕ,–Éápú ©Ÿ'kþÂøçÛ·ÚW¬kVïážÕygxçŠg\o›4Ø–£‘ß V áî‰%÷%' à..G#sr!ˆþï§Ì`€IJÁDEŠÖãØQ.TÐ%_ˆöƒXhÚä½,ÿ˜Iõ­¼ Q±¨˜yn4ÂhˆD¤=+ÙJ (Â=Éq‰/„û&,È%s²ý¡Pü'ÙãÅqA‚f1*§PB³‘ä¯éÜ]Ÿ+ŽI¥hV,žQr%û‚Ñû1ÿ±h^ïäÞ»¯u.ˆÅhZk¿§u|É;þF?fŠVìzÆ!‚ã>_4(2­8Æ%ëzZ"Ð,* Æ[+ß ´< ‡ö§«þý±=¯:|Œ %0\Grmµδ¶„ö&£{“¡ÝC­;G‚{.G\ï6HvÂ1ùÓ#‘}À gÂ;“ñ}n}gdSûs£‘Ö]á]ýb`Ï…èþ o ´6ðJ05–Üño¹êNø#7ü ‘±Ò£È!¥¶mVF¦Ô(PïÆœ’ɲmôGkãWªÂ£ÞÀ­²ÐµÊð­Šè”;¼ËTšAàãÚ$åß* _÷µÞ¬L;ˆûIYËuopºòÍa÷¦l5¹[òI›?r¿>îÛö®}}µ.‡!0'g—_­Møcc•ÑÑšÐÈxyävuüÿA#ÕÑQOÐNs4úYQø×?¾þ~4òï¥CókÍ,FÂA™ÜþrËPã‹VÕ‚Ä:¢¿:'ÑL×É$›ÅÛ´Ò«1ìŽÔz×X×k ƒ¦d•)Qg¨5ެ1)Û¢‘Êû•G;Pmj(ìM;.{±6ûOéé׸äÈ÷ùD…e¸Ê2à/40~e¨NIÔç$^Éé­³œ©6&ëV?þËrÎ6Içª µ¦Á&¥ÌD³N2b’¹½A(d<¾EèI=1åD›ÒÕwÇÓ¥ùD›¡# Ë 1ôD˜>+8€ÞS@I!è|3l‡ Ç·™Ç„SmÒ¡€®#"tE€dÌ'·ñ‡0PNn…K´àçøÒ¸;®ûùt¦‚‚¡; Ó€ˆ®`¹®'Èý¤:•WSŽ­vrêiÒqOë]qüøŽ42Âga ¢!5*èþ$ŠnÖH•,]O*ßj>RlàtëÉÅA 9%:±…‹rár42½|Wq@8H •ƒbÑ_à󗣑Y¥pQ,g*µ ˆ€RM°("kø…TmÇÈkrþ¼P0#€ç>ÚXNa«QU@…ƒ4¡0âyÑ«Æ#ÙS%Úeï¬ ×õ¼È<£Èh¶Üg42'9€F¾’ÜúòmÀ0gY£eD‹#¸qõª^ɲ ;fõ…¦‚¿³¶iCÁcÉù¡ÎîÔdøhô#©h‘.™×ÙI6À’)}ÂXtW±>¬À“×J½?€F`ø@&sJ1 È 6—ÅQ!!yÞLqg7oŽ´¿Ú{.ø‹tÕS‹a SqMÓ.%;Ѷälè-  ‚DpW2¸k°õ­áÈ^° ¡½ppe(¼§/º;e­;.ÇÒŽ»œç¾ðÎÁèž‹-»aìÌýúé“§GÝ '`¢¶œ†óõ/ZU³Ï½Zpª¾¸¯?ábÎUÊÃ@úD…8\aHÔê“òP“ñ̺‚ÃõÂÏì–£u†äzc.ÏP *nîß ¿WcIV¤×<´6w RJú-ýµº‘5y§}Ùƒu|_£®ÚB"Â*¼A,ŠTqç×ÎWêV?¾aµ†³k­M|Ò§Û©Y%"‰RAŽpæMíѰ¹g €Ý6vFôÝÑtid9c}Vq£Ÿ>°)ûXˆÅr0ÌvGøÞ6òd\ìŠçum·‰›{¶ÁX{j»Ð™b Xeèi3 AJTWæë¥•ÔÍÊÓ‹j’F5*jU;%.Èþ9Ùû@r=’‹@›få’G’ç¡àYY)5yÈ—Î鋦ä¼ÇRñŒÞþ™Á6"J* ¨sZFi@ÎI­†EpNA4÷Ï´Ö>+‚Ü»Ûy#È7¡a¹,%I ƒ‹(~I°<à] \ñ]mÊ`§pnÁ˜“a ,„åàdNk}Â8'%o»bÑjT˜J y9“á³pÐtžà@ô9”ÉæhsÕŠV3Ys–C ã"È %î{Ý®j<Þ”>ºÊ2^cŒ{óâMŽCë³4ÊDzâr>¨³†Kõ5iȽ/)UJ²¬µËk S*¡ÅÔTš4¤fÿjMþÉ&ÓïRçM?àË­1z¬Û«­c 9#Íb•I'&‹Ð;u§M¢DÌÜå2­J?Þ¸Üìñë×XF3FV›&ê2}x)ãÞeÆ Ëï·è÷ÆÀ¾Ã1yOT †B¯ŠF¬1 ´_¾“¶;Ì …²†;Í{;¤þMÙëjPq6[heìY|½SioNÛUöv¨ƒi(lÞß ù戴/p²ÔyjÌÃ\K¸!+r™Tã¿W¸ÒRጜ?§·Ý1”ÌI¥¥ÒCÑr¹ÉŒàx Úî*¹OŽ–p“ÓJ¡Œ‘<É,)àCÓ8‡ÑZšcÈÔyÙ5c´-ª®‡|q—¨ 4Ž^Æ9Hƒíƒ¤#&åŒyÙùP,¹§CÀœÂEø  ’¡ ¡Y4ÚoɶEƒûœâ\Íñ4‘¢Gñ°3¥uš¥ÿ\+­HLÃ!-Ųˆ’6`Àõµ”—¡qŽY©hA-šU ž²n'ÁÊáðƒhJ¤H†MZàËïÉy7M9 ²£›7é$Œ`Ybµ …($¡@. ¤AFó4WÈ“Ša$šb)Š¥Yž"ºq^NÞ‚Rð¹\|C)ùcɤÈ71-Íèà†ÄyX7¡"¢Œ¤×R‚$`iXmŠYƒHê-6•ctocÊ= ¯è™7”$bYiVòÈXv[_´ ØîsYðÿÄkÑjAjq*É FÞ~ø¨­÷d 7îy™ËºO…vL{G£}@§ÚzÆ‚=»6„y {‚¢Œ¬Ø½¾íDlçXÛö‰È’Í[*­6>OÓ¡´•¤~V_âÞýýŽÉ­ŒzW m,Ô;îkÙöªhd¼¥{$Ü ãŸhÝî÷5!”hbð¤n0ZÏÕ„¯;üSÞ0ÐÈ7–wͽ<(’·ÿ“ŠàÅʈ gÌÇ2¨T2æéœòEÀë?-\÷Æ.zCð´œ÷…á¸ÕT ·X•‡¡s¾È…ªàŸÝÁËÞ—ÓNEÀã²;tÁ&™,{ÛEðÙ8µ^ÍnÏq°7uƪ[íœb é¦´¼+ÕWœ uQXÕ«ZëMV.E›Žó?µV|\óJ7*4êM¿~}É®»#}™nD¾èu »xø__ÿûÛÑÈó¯ÿùÕóç_<ú«A4¸VFZ£?ÒlÝÕ.£×¦Ó*ÅrX¢±4§%éT<…¡äŠ¢Ì±f¹Ñ”¤juô ä3­Î=\oiXê¼æ±Õæñzv½Y§JB¡Ê¾_~°Q¢8^—,A'æµJ6`žAÚ7›âKÿuGF¼Î2Ú¨­³ž\“}tPŸ!h0Ð ¸]ÙX­?øŽþÃ0˜8‰~($¿2öE.äƒèÃ{¨#cwDi©Õfée Sã2OÒ´„ѰóB«™¿h·ìé÷FåýíiC1óÏC†}힬jÉ42R÷ÄÒ:˜üL1 ‰Éºä˜>/:gÔ’Y9oÁ`»c,¾/;ž*®et“{çœ¡àžœ <0Ë.ŠöÓRì`g»¤ÀX0T-¸Îñ$J~¬”=óžqöÏÅ’í¢ž¦S44ÉèŠH¨;µSúÌ9ű Ïèp á'H€4H†(„rä®Á>§:žèKsΠ|—ÀàÚ¤$P!É„aq dµ8¥ÃhÂí¦º7 ó°[aiB&³52ÿPp>bíõÅ‹²í ç.—–¡¡/Áú±@B ÜsŸIù_òŽ~JOÑ)C`ˆ†×$¡@.-ÁTrnBFƒów\Gi€Ž A‡CÔƒôðß6Ûg 6ˆ/$×mÖõ#>M¢R$"•ÅS€”àMmp !Šƒ¥Ã20iNÁ`;HœOÒ]Ñ@ ² :–Fî‹6ø¾j,˜Um_¢¢óJIžÂ‰¸ ÄkˆÍåuc[ú€.&¢;_æò#¡nÈ™ ïÓ O<Ú»©¬VŠÔèd†[_â+@,@‡ý]ýký6Þˆiuœ$â: z Ì‹)ViÉßõ½è±P‚`ÀcmÛ`RÀ¡WE#­=Ç#}'üÝ0¦Ó”…Óp§4K{‹Àà>-m½ä‹ü—ørýâ:ÃøP©U©wwvfÎÜÎÜggwíµ‰/ëÛ®½¯/Ø`ƒ]j‚ðÞ¡j’†øBÔF­¢6Ð*vÛ &I©ª¨ýR©Uc®¥€±c’ЪH­Zš¸ïÒo‘ˆd„eéh53{Î;sžsÎûüÞsµñKáÄ…plª6¹l4êœhHžoØÑ!xÀÄEŽ{Ï×q=Òu#”¾Z¿ˆ_‰¤ÏÕ%]µ±Ä.AО”K®6t_ eQäBmìiñ§êS€4×É‹¡Äµ†îã¡.;!ðÙΑ’c/²ñs%ø²Îâ"JþзùR8}5˜¾è:Qёϊ$ƒÜŒü›À¦³õ‰Ë¡ø•`üR]êl$@r¹6µÔú|R½êÚà,Â, RÇÄÙO¾úòYiäñ?¿ZXx¼PQXdåiÈ€”n/n_jW-nzatu^¦iå@]+CÁbB®`Hž‚Ï–hð<‹B"+§3Îckʶô5x~T]ðn«ãÔz÷áUyc‹þNíèW¦™+í„îDØ|¹À9ÔÌ1’ÁâÛe9e¤ÌJ$"‹ßh2‡V-;~|­å¬ñŒµÉ#Mù£Ípáz)( @)dµ¤@;’Òö']ûÓúÁ”v(õ¼hÄØŸ €aîö t«›ë±SÓ¾mEQ¢@"Ù†\Lö‚Å‚£´Ðýó¨ãp7?˜pîp¿$¼/f ,þÕûø@ÂóîËÂŽ6 1ÀÞ"L rxç\Á@×Jn;ÊgµªyGàžZ±\n2íðß×¼`‘ózð¾äÿB­þP¯snQM#±¹Â.SlBÄ[ï:B3Z)˜þç’¯Wt`ÆjyÌò†?¥æÏj¾'6Z .àÂ_кAçìÆ Ã!È´Zñ…˜S½÷Eï´ø½æ9&$’ƃiŽ£Y†„ÃÀxÈ úc1¸;}"4J–àD29PázßVq Уr^ ת²N³¹V„y` "!XæõšûJᬣtÖ îM„m”À²(P ˆÒ€ #ˆù‘\*²„Œd‰ÝE^¥Y²_0f ?0Õ³lF+ùL«˜wÕ|løú§€Ç 'sH°ó'`ƒäò(^¶ó’djV Ûìëñ·F ÈŒZ4k—E‘妑ϵê[Îòi˜¤ô±~…Õ,É"™EŒW2ßëê;¶õ•ñx0ÆX¼÷\þhª0`#KÑž“±¾£Ý{"ù^X2X;¤§íÅ“‰þñwŸÜù³C©Ý„\¡œ:ÂÎ1Çä6Œɦ"ßpº÷ýäžÛ³¡à½Y~xN4òA¼ÿÌ%Ös`Ë.Í[‘]ÂB.ÍŸŽDÁÁ'@#`©W 0ës ËF#àïg“SáÄ/‹šyÚ‹_HáãM–&'|×B]müñ1_{Îå.fÒL¦ìSþΛáôéúød$ú´ø"‰K‘äPj"ýcxû›ÞU•“#XŠ8¨¾8’†ƒ$BêcybÙ;N8Êß©ZÿjnM5«‹ÈÑáÂ@¦©š8ÈêẢº¼Yr9î¼ÙQ¦P†Ð)«ê£Gþûì4ò¯…,üpC;¥ œA¼­`OÃ’»ê±uæh³#ÓâÞ$7x°…pÙ0Ðâó„çB-Œ¶<ó'ÕžÁf}¤Ñ•i-ÝP<Ô*·Ðã«ò¬5F¿¿h j-Ì´±> ùæ@c8…æ²µ"9«…’1…³›3O`{‚I³bÎYqG¯¼ódáHþß²(»|4 ÍåGºúÞ÷–ÀŒß‘/ JW(zÖoË$úN¦_ß·u—_ÉeQ4o§A1‰dtA‚‚BB¬€ÊOÛc™xïx´÷ƒÔ룱žÑäóAh€I™Î×`:éÚV…Bvކßîò5éKÁØ…pìü¹Z“{=Ó°<(íJ0>ÙÔ5Y“ø¸&ZnšØfc1÷=ÆÎ"r“»tÈßq<¸eoÙÚ„»²+ßEZãáüÖ(æD}×§UQ ‘?Õv~Cüó‘xö-]]“ éS¡Í©âª-®¢N1I#„ÍcÌRÙt@ˆBe3$IµQ ÉÂa´ó캕¾ßWn»\›ú4ü¸X“y¡. BØ¥Ögª>u:ƒÚ0­?È‚È?#,|ùdøÂ[oý‚Àœhå%ul-]jWõŽmÌjvþª±øÈF3´› m·B"Ö Yiµ[Ûô¼½®øh‡ûH³çتÿ1_g¿Q]wÀÿ„6Øž™»ïÛìãÝx<ãÙ==3Þhq!BìÙ¼QÔˆ%† E%6vÁÆûB¤/‘òÒ6R i ¸a0‹Ûl–BŠÒ6QR÷7ô¡R$éŒtçÞsν÷7£óýœü€v,ÌUšúBE}Õº¡°v$T0¶–®Z¶‚ND”á0S¥5¡Î²t9š¬—2HœaÔºÁµkv•‘jLÈÀ˜uzËxÝŠóãM;2 TšÆj }aÃhØ|²†X«Okö6™®Á—Ó½]î| €®f¾#ö¼4bú Ék¡»“æÎ6±ÜŠQ¸€âaEAЏ¥·~eܵpžEÔ5‰ÿÜÈXvnTŽme:ÚC Ј¶«•ïX¶Ž¨c Ë‘Vº#®ëÞf~{#C³‚c…ã«z™¼EÉ=¯@ˆ¤52-ên]©4¹-»pE7¥5s’sž·Ý ?s·Bˆf—Õ"6„âu·>KØ„2W$ë‚ì|À•O*öC¼©¥+ è@FH*Ȱ•”ð9Ÿ ·{¬ðîú6ø 'át€nІÀ@“ÜS\sbÉ=ÙúP´NKEO8ç “JôLpå=hþ&„/ÀA¹ªÌu8÷6›ý±ày"Vˆ@%K¢Á(Œ$qb#Å^Wœ‹ŠgV*™• g%ûLöŠ\€&ËE¶ gê1qÉ^<Ó:t›“<=¤eÊÔ#l ÂTÐ(( Ê ¥ƒB¡˜'µ54S‹õ$¨0!ÖìAÉtG,mç¬iá…‹ìÌ#¡ôk]Ù©¤GÈnfe†³š UQ°žàˆSyXü·¢~Š-¾Ç?ŠÒ…0 ÚOG#stÑ¢l›Qlwdÿk8‡#* ¥Áž•Æ¢Áí¿~œ‰ï9™hŽï>™Üóaì™)ùxHg}üèé‹í¨ÉµãYØ­0îÔåìßܶ»vs™>ŸÉD æ(‚”inÝßÓ¼ëÐëÛm‚‘@0„&áj£³j iÐL{NIk$žVÓñ–­™Á0‚&t/©Ž—½z݇½XÿÒŸ€TMù© ¬˜F®¸â—+ZÎb©@óÒH£¼œ± «Ÿ Fô"èÁÔjÐ5’ñ²—‘Þs×¥Ê[.ù›S®èå1³柨ˆ]ðÇà‡+®Ø´;1lž´¿ñ¹7zÚñêAk$n*-'K&Ü ÁhT ˆW0•†&Õ`B›¡î,à À¶Ke ˜ó‚/6éOÀ™]xÇ~g†©F°UŒ&“OMñŸg‘ï–¾‡ÏÒ7ßÿáÏÊÂQQÅß–_tªòƒa<$ž©ÖŽU›öù…ײµÛ\–žõ…}õÆázýè/sNÔô×K}Aù£ˆ8Ô÷uãc(»¯Úx"lé­Ê¨2‡–{_e4Mßj3UŒZeÞb3¼`§)ØXY^iÔ­’ž@ȘÅзlí¼è&„ÁÜÁjã@­y$$Ÿ ûÊà'ƒ˜“Åt !mÖiÖv$¤ŽøóÒHîÁfÐßÓ&îo\m`a ;ÐÕ¸Z~g“r AŽ3]-æÃmÒæÐÏ(DÄ(T¥R6 ]mLWR>’€‘Ä#ËֈЙÔNÂ)Dõ]m|µÌÌãÔjùÆ «·Îix[q@”,ˆ+¦‘Ù}Ÿ·Þ×Üá9ë¼¾à¦ÑúGƒ{V\^û‡˜Ñy ’npþ”äx$=–¬‹Œc -y@9®Ñî»ÚÊEÑGN‡û-Ö5%ßOçxñmÙ à+œ„KкAga8LrS.ùJr.HöYÁúcKÉÖ›¼õŸ²o^vLó¶k²ëºÁUë¿*ºoJÞyÅ· ùþM—ž£òp"ƒF(Ža†ªQZ£ÞI)³¢c†·ß•Kî*ùôö¿jÝ÷Hï]Òq_ò,JžÛ¢/%z¾£}8û"Uø„±Ï ΔÎ;/òþEÁ{—.…A¡ \P4(ÊÅü†±_e³BÙ=É9£uÝ’üs¤û1m_JoÉ% ‚mV r°>¦‹AðÓÏpÙóÊš­}Jq\V|_ʾÏxÇiºð3Îö7¾t‘s€Cnˆ3BŒš69€mO ÷“шTüDtÞ2x»Å"CÜljÀÉýõM£Éö4švŽFwý/ÊO'÷>+å @‘“ÑÝÀ8þ8Ú]µžÓà¨AIB•™¥'8i5B¬ÊâyžÃ)^7VÔ´îùðõ0C,¸’Eƒc2Fo. ¶´·ìjÜÏÓ>GœŠïÞÕ°…ƒ<ÇQÇËQñl°mʨH'iʃ€žôD/»cå+¦‘)oò’;zηå’/šŠlëµÖ»Ô<¿Z%R‘8˜ kTS:”Æ0LÅeö@^à|¸í²'q>¼èŽN’“¾gªà¢·qÒÓ˜ò'ÏVľp¿1ái:iNù›a¼>0æš+ÝΗÅok8jô7È9V^!@%1M.‚Ÿq­Âßþ#oìéäÑ®W¬­ÐÓ|ÞÝÓùöÇYdié[ÐÈ¿3K _?„N#!*„²q/:U̓KÀ<êF¼úñpö‰Hþp­I·£-èÑX^×vû¾¨ÊÅ ¨ÖU¤t´*ÝÛ¤Þ7ÉΤñwoZÛc*ƒ(hsŽ»r¥÷š@#Ú®VxñP\×ݶÜûfÞJvÄòº·ŠGblGTÿ~n’þË~Ý?5‘ŸÿÚ›9_€d7Ù—ìfw“ÝMBBHÀ$$!/&$¼Š‚ZëxcB² íµN{7×v¦§"Çè(‚¡øv3ןÚiï®g«RßðõPˆàËÕN¨w^tÚßj‡:\gÊ<Ã|³ù¾í³IžÏ—ËC Œ%s–½GéFX×]Î>¡+}¦vÎ@aZ¤jò€õÌp%c‚c–ñ~AÛ&Ã,my²ۼb†± ̓ړœ{F„ÊO÷xç}¾pDoá]3‚oš*šf,¹¢'Œ}\ë~̸îkìã/ð.Â[кAga8Lµ{˜µM1®§¬ÿžÖ3Îͽ«)Lã‚e†«mhû#Î1Í;FYËïa,Z>‡ÎÑÊT”§eJ©´ˆ¼›1ÏjWÞcJfø’ uþCÊú˜ NŠ¥Ÿ E“¼yRS˜eVLòn`À°Î6*NiŠF5ÅÃ:£ã!k›Ô9ÆD¸…$ ÒIƒÔA!LØ*xcB°gYØ&\t~Á–Žk­ ‘§jרà¼#8FEGV€çî†üL²v¸þ˜*yÀ8²Z'Ü~Vm-cBÁ¤¶(˹¦ïCµw–óͰ®º06þ !ÿ|‚SÜ\,šFDçc„×…"2 #H–Vàµ%ö3±ŽtÃOz›vj}·góÀ!@‚LÃÎ×úÓÑ9¤í0êl¤ýtSûáÆjž$É¥8ª`i™L¡H• Ÿ£À¦²šTt×G{~éèkÞ³Î]F+ E5±ÙUÞo;Þ´³?Ñq*±÷ddÁ4;vߊ(p‰Ê…¾[ÁmÀ‹Õ (£·Kçêø%_#øäj™´X H ‘ápâš{Ëu_ãÝ•-g<[ÊLv¢D•P0qUŠËPhhq* 6 n„Œ—Æïø¤‹e±ËeÒõ tå5Õ<»êk.‹ƒ¸n¤á•ñ Ȉ;6âm¼h 7^-oºlücyäB8r+$Ýį·ýÛúm›’o­±Ø‡Ó*¢sK”'3˜çªw®q鿯‘[~©Zo¦JU rò“sç¾þòÅ_Áßè†}ùâÅóçÏ¡í÷úàã Ó’J¼°û{¦žr>ÖRk Ò5bo…Ø_·PUæ4¦««õ©U…©*M¿‡96¦ÖZÒ›¹ V†D8°¡^N9<‘_ï¶Y+ÔSý•†T¥õX©·ÞØWkꫜ÷Ò™S¦Æ|¬“¬oÐËôK”KH#á8¢ZkÉ?²J— ›2UBO{´Â©RuÆãµ=•¦t­©W§kõ}Õæã¡ÅÒH~ª&?½Jè­ÖŸX£ë­µôÖ™Uå¶Š‚¨ò4Åbž"[W+vp+t»ðËäBiDß)ñ‡š¹}QCWòM\fDI2¡6† ]­â>èTjQŒ;öm—éá‹ û!ôœ°_RŽóq ˆ±»•ìŒÎw]í‰ý Á}ÐHˆû$ód¡´v©R¦†LódqžÏͬÊ:­qÍRžÅª&ÿ+1$–NQöUÑ ãœU‡ºUÅV…âcºb„-¹/¸ÆEÇ}ågžâ­÷Åâ;¢åëù”s‡dÄrÐÅä8K *ä»rlù'”÷íelÓ¼êø e›ÐÚý¿åqKg¢õ<%“jç_:ɖ̲®‡¬cDS8•j#ó±Üœ¹c‚Šs|ËëÔ1¯øÙ†˜ÓP2J‘˪"HDÉ#D³·ödboÿÖðÿhÃŽ­?õÐz ÅòT8“ƒþ|}´¿q×@¼#%µeš;ú£óÖ欴7ýƒ0I¬=Ý ë§¶¶õ´t8 GQò¡o”¶ÅRÇM¿t!8WÓoø£€ˆJmÓ¥ðÜ–þàÙ2J\ñKWÊ[.x›îú¿-Ùøã"ßz“µ ×®çLo›Ü§œõׂ µŸóeM°™ÑÒ(å\(z+œüÌßp­ªe°¢árhNh7ÃÉß„«šïânÝ×Cq âõ•±›Á8ˆØ3Xýs¹t9ÜZ¬b“C”È×_}ñ÷of‘—ù—cZš“fСÀtí!Soµ64dVëz×ûjô ‘Ìš«ª½u'j´éJ>UcNUsiŸ~`•õÀÚÜBãPSJC1%h9Š‘H^€ÖŸ]§=Qe<^cJ­6ýªŽï-Ÿïºæþ:MO¨àäZó¡zlµÓb¹è’7˜¥D1¡ß½Ò::6§ª´©òüÓu†T…¶oMÁ@}AºZŸªÔ¤WHté*K_ÅbiÄp¼ú•Ftýð\j!+zëù÷ý(…r…£‘+|·>]­ ¥¾3ÆvÅÄ®fàÁ›ÉÊJ.³ðLWsñÁ¾' I*õ6³_úŽUC,É#0¥Â¨±îO ÝIMw3}¤E<7uÎ[G°"P„9( šƒq]wKAÇV"l£s剋 ¢FI³¾QÁ™¥m¢wÑËÍ·<ž¨]Y}šwd)çeÊ[D råRN™s 1|JÙ§¸à_˜•iOV]:Íù²¬ï<åõÃÙÏs F˜—)ä ‚ø)ò’Úó„õŒp+¦´%¸’¬ºäÿù1ª-yL;AÎwtNHÚ3µû¡ÖyW³âoœ÷0k²äå2ÎÈ1NIUëb ¥‘´´ûu‘ʇ*¡8'Ç­8·mÕÆMmǤ¶ÞøKfl{ç-§$Uy(P¿ˆâFwžŒ¶ƒú“{ûb»𿝑hû©ØžLSÛ©ÄÞ¾—ö@|ØÔ±­v…“DÀG±š1|Š M#·‰Át-òF^iä¶/2T.ýÞ·¥ŒÞÒ¹£7ƒÉϼ[GÉse‘ÛÁøuot°vûï*¥óžÈ0LMËŸÊj?ý‘±°_g¿Q]wÀÿ†ì¹û:÷ν³Ü™ñ,^±Ç Ø3^g<‹0਀Íì61$E †4ˆ6Å`  1ãYÍÒ6U¥(J¥>D„`C¡˜àÒ¦yèS!ÐþÆIÕ§*222ýtu4ºWçœßhÎ÷s›_…ë;µ]¯ÈöNÁ4dª¶Ô¿_Öu½mà*LçŒ}Öºs®ªÿv}èRsðE÷çª+ ¹îŠ@]s†áÀÒWøkûôÁ’¤ˆ ‹ùöñÿLñ<yöìÙ“'Or™,œ9@Žb„Þb{¶[›n*IŒ©N%ÛnI¸ ©Îe ÖdÀšñjSmï¶T@I¶”žéVE³,§BãXœe5…IC`*_-o(±§z´ç½ð 5é7g:µ©ö%Ï;å±Ì¤¬GNJO÷”îi·”ív:ƽՙõ¦œ_Ly홉žòL—fºQ›ô)¯aºÙ¸'ëL2ÝnI®˜Fl 4´Ë 1À á+É®/NtPYÍ“l!„3„üâdØx,&OìX.NÅuQóÛCºñÓºCTfŒÃàÐÚÕ-ò§ôg^+z#¨öÔ›—HsMÓ®2ó[ã¯#êc!öÌ 2µŽ-}^ðÏD|QV⩸úAãÉAÃp¯(‹ÇòÃÐè(­<Ò9¿’*ïLè¿Ékj+nèÊætõ[µÊOÄ@³šÆVÙir'гššœTw„/ŽZ‘"u(Ž£…Š5`t©EMÏ–‹îÊu¤÷ôå rÕ}©úBÖ±â|ÙK¬z$:î+µ ‘‡Rå×bÕÚÊy¥rÞÐÒNÓ«Y”§95J¹Ì%©Ø¾\pÉéÿÿ œx/¶ïè¶¡ƒConŠœêýük‡ÏG2£Sñ‘[wn[çáqJ-ŠAH6V7BÎÁ ýÃ3±Ñ¼(BKŸ76 àÉFöç5²}øBtpª9:Po­ Y^61ùU™ûJÛÀ×ÊPj®!|©9 ¹¶vûõ¦è g>v?t‡6‹%<Ëà¸jª®g¶>‰|¯>ö§¶àç ñOêƒ5‡/7 ~Õ0t«64ë ýe]x¹ÖóyMôrË@¯RZ„ÓZø9PÄŒ’4sc.ă¶uËÚ.Ö½rýë;m{á-ªÝhÌ[’ïOc¾E7êC“ŽnÈkš$x’|}ÏÏ5ò Pñ|yú]=}úøñãÛþŒÄ  U-”d6i3­S~}ʯϵÛãòiĘ ˜¦[”œW™Yoœî(Ît–¿å/4ÑÆóMØX¶×^zȧÄ×j\&‘E¢J‹YÞhÒ§Ýæd«%åÕ%}Eé%¯§(é3g}ÚŒ[“qe;Ês›ìg;ÍSû¹niÊ«?ÒªÛ\jðËÑ:ñpKIf³%ÙeN{Å©zÓL»!ᱦ;ÍÓ^C¢u¥4b¤°CÚ &˜S@;hÅp. WSb [N½ª_Š@iNFäñð"KC eVF(©».ÝP°Õ-—Ùt­Ã^P ÆüꉨéÄ<%Œ['‡¤ã‘%Ï{" WÝñèwa'còé "Í&§Àò$B ða¸Šj×Ý–m+7/wÝQÊÿ®­úZv&4•8ƒ±£+ H–Ây¢Ä!T4…¨YJ¢HÁ )’£¹"ZC B“:‚Ó¬F-‚ø±¼fA[ó¥¡|ÞPöHªº'9îék%+¾Á—¼„ê/”ÚûR4mA_}W®˜—«¾4ÔîæM&#8Ž¥ /Þ{¿oïÅÈèriä\xžÑ0NöïI÷ Ò}{ú÷eÂ#Î `‹‘¨ !ÔœCc:²e qnû>X@uÁáì"‡òsEGáš î;Ö»CÏ è5j#B|àì¿Ú¿ì ­”F X/5æE± i{Ëû¤56æðªqFD©U æcõ;·ßlŠÌÕõÍ6…n5DßutýÂÚœ°uþ¾¡ÿ#wìZëÀ­†e[Ïͦ¡ñÚn«$!H!œêltòFxF"ˆq‡¸2×½Ýüöëõ·©ó ø_0UŒ$¶ÏýnŸs||‰8œ Iì„ÄIœ+Ê øvâÀÔ%8j+•6$„†Ç—pQ;­_&U¬›&*Ê%Ä ½°qéØ4­¦nMØãfß«tFáC¥GGﱎß÷õsŽÏó{ú’åEŠL“‹bF VŒrÑâúËê‡ j¦ös½2Üb.@„Ó/‹ER!‹ AÁÛá‚ã(=¢º’šÅÚÀ¢{ïsÏOM27(l»å Ý©U«y3Ɇ¡îÞ¿Q<[ZþaYú$ÿ;Y~ÖÚܲ¢‚ÆìÃu¹©VÛl³œ®¿ù±FK¢3SUUIuäÎxí)Ÿ!Ö2Q¦õþ† ´Ê—+¦¶ óÒÙJk²Éy®‹Ù•‡ŠÀ0ú6¥àL“3ÕªL×™ÚgV­iÖ ?Ê1Óœ¦>o®É´ÐlŸí°½Ö 5èP= u\€¼"8¡PdYŒbÚ,e#ísbÒk…lÌ´äÆ›ik¥ h$áƒS™ã>À•%ÙaK´é;LZJá «!å¦Je,$3¥°}¢ßpJ•GÃ@‚¢h7R]øHARð B`4;ð6ÓѤÎlÈ;ð3åíýú±ñ­ ubŸéT„=‚ãª5r*l>H'B°4 ¬£ig÷‹û:ŽÏÑa,ÉàXÎ+‚ò©fíËÍ‹ÅÊ/ ågù\Àë%h NËkÏ¡¡íÂHLG!…qÅP4#<‡ÐCz)cê“Í$*à ÿâ+HÅäÂGÆ’'BÙ#¡4òðG|_üYtÁñ)‰Úx_*ýJ_{MtoÁ „Ñ1 ƒk©zKiºŽûW£`€LidN=ïIÏv1|dnÏ ¸âȱ¹žƒ ݃ áé¾Ã“Á»–¡´¨AGîoz9ЦÂà ‡´ˆz£ €(V­‘PÚ ™ùžèyÿ¡”?šT‡§ý¢™GÃpDs±¢kѺZÝ»èYФ«­Ç½&ù¸V]Lk$|¡f·9KGC£…býùU6„ï7í[,Üù^õ./±(ÂëP‚¢4$NhBJ¯*®+îŒíçnEŸƒ×¯Ã³wˆïoVG\[«&–OTvµ+E8Š 4Û‹—n½W^ôøŸw~®¯«z%0øÈí¿Q¾âéU Ðt.&“ ,ñìßKß®¨â‡jä?KKËËËKKK@š7ß8ƒ€*£t;óã­RÒgL5Ûâ^ûl£)™1ÈÉ-ŽXcA¢Ñšl1Ï·fꌑRЈ¥„<¦ðt'ÿN‹mÁkóåNµR-Š00˜6»žVf|ù‰fëL“2ßì˜õ­v]˜Ð8Óo/ˆ·*q/@¨ðõ–l'ŽsŒ¢¡Œë´,­E¸—xr€h)’^/dI?/.žÙ*&š,çÚì±ÖܘϘlX+X“iŠØ“Íö„’`‰5Yg}$slsîqŸ†×0NÀTâ­ÇºÙ“=Óȉ€e4$Œ«Ê˜ÊN„K&ˆƒ]èÖ*N‡Ã£‚8‡S¼ªIÔ–ØŽöÚNôñ£AÓ‰°m|_ѪãX¯41®z]q¼_ÔŸ N†aZРHUÅ©ßZF ¥au™3+–¬y¹yÁãS¡ôk¹ê¦Rò±$DeÙ(‘µãПò$F‚•st‚Ve‚C)Ê  M±c„„fùò]ƒóžTþµqÓßôŸ(IÎÇâÆ'BÅ_ùÊÏLEçšÿÀ<È¥9ç—ré’ë‘°é¶Þ3ÀØ(<‡ÂµA¯Ðâñ®ýïî9x^šR/gL#ßE*0”ôGÏ«G.ô¬`>Àç; «]zËÀ–îs¡a¸&¾w.Hö„+Ó3†æV¿îÊ䃇/øâhL=ôJývhx9Œ„¦¯‘³\õFnUoº‹µ¡µÒÈMwïGžžžÀ wpÑ­Þq÷MUl'P-.Œì=ÏžÅÚÀµ²]wëú;õŽl ^z H„$IŠ1C¯§Ââ7»3µŸ_Wíf5Ù2M$Š;®ºÕy.èšYË'nõ²7PƒòÑ2»qÛ½òðíªàÇõ}Ï;?W7oÀÝ©òßñ„àNÁé¼Á %4Ž¡GÈ;v¤ òÍ·ßü߀äÙò³.ÿ( ‰‘úKA¬o8b^[¬!£étL7Íx¡¶J‰Ó9߯W[Hîl=óRÑpéíúÂé9Þdo/V(¤Ä£9ôî<éÒ6yÊ[”l“ öĪU`ŽÕÛε[’2xæ|»k·÷»q"[O°Z ¥¼ùÆã­ÖøÖÂW½øxÐ`;šœRÚ1Ñ!§Z‰–ܳi“õk¥K 4UomÌÌ6Ùf| #G|³4¿M*Qd‹ü]„°9È”FìãëH[OFȉ<OFòFú…_vK»gžRîä;=úèNËX¿y4¢Œ„À ÊxÄp"HwÕàÞi$œXíº0ƒé­q4ÌŸîã&ÓZáüf4"õȹz”ÅNÊÊ.ˆ5/7/x<Ëo‹ù_IΧBñ•Mï+î ¦xGê1’Ä¡aI’'gIœÃAdÙ:ŽK âË?UJ?³V<`ÄŠ[×_D×Áõ„ßôw¾ês¥ì¡ü£F¾'>7¹¾dO×cnÃ?ùš¸è’M6ƒñ„–ÕèÂÞí³þè%õð´ÿ@ªøRÏ‘LidÞ?œXP€: ÀÀŒ‹á#gB/†µ÷8aR=8<Ì÷D!.©GÁñžÁKýÇàbøV"8´êuCðôùÞ!X©ððdp Mq£& B ¯;}¿óîT‡n»ƒ×׊"5Á[µÁk5½wêú®UùÓ©Š/òa,™…!Eü¾jïÃÊЕêî×u$N°ÿe¿Î‚›¸ï8€¿ö¥2ÒjwµÚ•´‡nÉò!É–I–eÉÆH–veÉ@’0פíLSØø ز.˜L&}èL‡¶tÇ6á,g€†4Mi;} @‚NÚ™N¦cÆÞTšj•§<¦Œo±RU•ñ€C´q·.㧒͆̚ò>ßwœ/3ù |9ªTQšw¼æL›fÂͦ½å£ëNy‡¾¨§^™°ªßw—d^-\+ŸjÍu_nÂkH6›âí”J»ÍñW9_9„™§$V™nÔÏM®)9ÚoéFÖS2¼PŠKey¦7lúévã°Û’hS¥³)J¸5)“t&}êD“.íÓ%¼ºïR)…Kû#mªíÕßU,SŠñÇ8¹þp@×eû:Õý1ÍAÞ0¼8AõòºC9«à›JÝ…nÚžNf0F÷w‚U ƒQeLÑU¿¾ž(Ñe‘dñæVùPs$bئéí„‹ávÝ»œM<,äº/ü]øPwißÚ WÑŠŠ T.B6ä%­ësÒök›çJîÒæ?æ[KA/~-¨jËTžꃘòJJ5 eñ²ô²¢ü&[y›«¾ÃVÝVV@ÝU.ý_𺬫¾ÊXnË-Ÿ)*o)-ð ¼ËUßSVݦí÷¸ª+ò¢û¬ý,Y[†ˤ¡(êÕ¯ŠoÞñaôGÉÀÎTtð`*œ;<„}P ˆ¯_É6éØ}<´ê©IÆŸ¼{œßµXÚù¦ú ¼3Ú šìÎvìx]!Âh„P ¸^*û…cóźȼ£ãl]òn©4r±†?Ùž©çgkÃ3ÎÈBeè¸ýûùXžT$Ñ¡Ô[%îß{Þ<`ô2ùh!)UJ¤4&š«,8„Ÿ»;J•ZŒ¿D Mdq®ûž© Äf…Sõ¡ öðiÛk³žÈ•šð[ˆ”€q ‚ºòOœ1 ¡D¥hÔà8ßøÆ/‚‰e0¼ð¦šKõÑ3Μù¹ÏÇþ¸A8ífk§Ýá9kÇù†®΀£ð EÉÅó=zôŒ ù¯G¶4{ô¸ÞQ ÁÅRR^¨9äQf¼¦¤×”ð©3>MÒ³X驞ðê“ÍÚ—>ãg3~mzõªømw• Í—(ó(¾Â0¾®áŽÕ3MÒk˜ôkÞk+ޝÕh%ÓuÔ ³t|ƒf¤)g%›t >áqÇ}†áÕ’5|`fc©%Ó¦ª+hfÞ÷˜†|Š*–’ÈáƒGo4±ñfSÊä`¦ZŒ¯f¼Mù˜d ŒE•hè“-ÆôÒP$[i_ñX«~À¡ͤ˜ÈgHmW‹º'Bõ„ÙÁ˜ê]ž;Ä˲lÐ^4нwl;ôíK˜pH'×¡ß ±®jÁ`°I(¾—OhXìPHÖ/È´G¢ª¾¨²‡ÌÀÅà¥\÷ez¸+ëŸCUл-T"$ŽÓ’—Ò¥_*”e_pŸ©,×i3$é’ÇÓ ^‘Û>WX?e­PÛ/«m—9ëu•ýŽÚ¹N[@#ÿÝ·ùÿ (r‡®ücý#]uCi¹ÆVܤ+'·˜ê+Té}µý&c_‹“œÁ%8Qˆ–‘ÜO6Ŧ£ooÙ–ˆóÝ)~Ï ~®éŸîè~º€&À€ì³°ZÁ"Ka¨`œß› îvO 9÷ϵ¦‚»GßN {ž®§·ýØWTI¡R ‘Š„7Z×>W—͸ùÚ0„òRiäœ=tÚYhèü¸6|ÖÕy±Fø™}“VŒ°#¨D"‘aR(XÀwšND¶û焳Öàµú®Z‚Í+Ì£ /•³Fæ\ÑGø”“?ÛÀ_ut.4ò¿qO9¶œ¬ ›YšÁD[Uóµ|+ÊBês+$ôÎmZ«¼ Æ£+ý3¶àɺŽSžèóžÏùZ¸øQCð\=̇‡#}T/”J))†ƒFà¤ÿëß¾¶ÄÇŸÙ!ÿ¾÷‰Fvïê&p)–Í´å\¬’JùŠ>ý˜·8ÓF'Ý‹•žìx³6Õló@ÄC²s)_I¢Ý2ÒNÆVJëDúQ¿qr|´É4¹Z=Õ¢uP™FcrƒjGCѱuLª¹l¼]>â4§|¹îkL4«“^Mº™mÔNùµ#­x«‘’ 2)θUÅñù´‹É8d“uÅGÛt•Œ¢@‹ ˜×ÊØxKÑT;=æRL4’n6Ѧ·•d^1¦ÛTÚ±&vÔ ÂY*’C²Y7µ^³®¯`ÄDË­%ºÞ¨¢/¢Œjº˜ƒ!Ð7¼•íK#Ä€@ö   So „@D ?åé. %ËeŠÊdðO,U’r‘–ÖíܨŠWÔý1@ˆâˆ:Ré4÷lÍu_MLuX0öDÙ¡.èƒ8JÈ‘ Ö¢rJ:I–|IÛ¯+Ëî©+®±«®ÒKO/xÝdÊ¡n°å×93<ß Í·”æÛÊUà§0ý”®xª‘;ßÎó–Ü‚qÝ`*n¨ª€Ä “›¬å*c¾O;ö`l>¶¼@†“…('–nw¿2±í‡À@BºshØ0èÎ9ýÃ{3¬4¦"ûÀdx7T*²*êŽw¦:º³2±„v?w„³»Àa@Vp°À›\Š=yþaÍ¦ÙÆ„ÝŒ#y7S^*Ì9Âg\„,ãŒ3r¾V8UŽè+!_Bò ‰ @"Åa¡A¤í?[Ï_rm]°ò+Q²S2BPÛrVHÌœ¯ã/8„K¶²_§OmÜgÀÿ€N&“`#iW{é\iu dqJ\º’ãi;)ÆH«{ܦÆÆnS×õ ñYƒ8q’7©ÛNëvìPc;±ë°fÒ¾k;ÓG™öU;šÀàÑ|gG ;¿g÷·Ã~?°ÓŽð5{ླcÊ?_¶é×5o^¯_uGZ´E/‰y˜„RòáJ¼Š®S‹—+[çêâ÷ì±Y³µ÷gÆ‚§Lº ÏËÂÛÆª¶Jyh´àrÖgñð­5ò|éóõ×Ùµžõ òÛß\æ#¨€bHžÄ­dÒ› =Ú„»(å“§=+Õžòa·6í1$õƒÙ5UÃMÊ„W7äSdšŠÎyµ V¯™m¥š·ò±fe¦aÃ-¨¡¼úòs[5v]Æ­I笣¢„—I{Ôcͪ_9Ôi·.³¹`·%^äã½XÿS—<³©0á+HlÒõÕóxßcøÌ+x¾ªÓN'}ú”Ïòj3CÊ]n4œuÏ6hNÛõ)OAÚ«JÔËr¿ž•ÓH½2áP¦½G›(1—Æ(J‚±½oªOwPAÍ™ èq‰|å4¢ìNÆÕ‡ƒtX{ªCi˜ y$"G)Ç)ŒÈ~ÉãH ®e$m L×6ÃùÁÉòcAÕ©8u’U DGc¹ÎÕhNu¨Ž‡á$§£ª¾V~‰ãppJÂ#+¹M›ÊK?U”<•›d浯§;4e”¥ó²âyÚ¸H/¥tQVúŠ,™¥]¾æü‚ç©´ì‘¥]6Ï|C‘ÏhÓ‚²ì3•u”2ˆy¯àRÁË" LjíFÛH´/Ñö“1÷h¨7ìJE{³U¾½3×ö¿Ù1Ø  tƒI–eò^¸/ÕÞ™UÛàß™™`O:´ºÀí¤ÛöÀ}½Ëö¸šœ”@$Ba^Õ†YG|¶:0ióOÚƒ·­¡–5¢Ä†¶½Y埮 €F¦+ý÷ñí­NZ+Ã0‘ˆ„ÅEóI’ÿººøÏ®øýêâ®à.m•„J)‚Ç[Ÿ4mɽåƒ0q¦Ú¹Q·Ç«Û?6±sÕ±¿TúïÛãwªY`ÏùŸ–­Ç9|!–Gphîßhž°°SµìÕ¥Ý[íý¹îÁeܰ²söдyǤ3²¯ÈIòù '~ñóƒ ‘eE,¿ÍçÙ³gÙã—_ÁšÿøâïR±DH >4à.lÓú4©ý[i\±k†#hDw¡A9äÖŒ4©F)*Ó"Mn¦µ97ä Q¢º}>å ¯ èË$Æ-Øn.-dܲ”#×¹† nÅpv:ÜŽ*Y§ÌøJŽ5çr$ù"FPF…nK™q§sëò ¦Óùä:¥9Þ$öœŠ€(zÈ!ÌØô Gq"+"&ãV']údƒvtåö'Ǩ2 Õ`öÒŒ§PÀå¨P!Ž`¼ÆrÃñ”>=Ñ Ä'ÂY œ ¯”F6‰h±…§wÉ´¢îRŽÈ0‚&)u>sŸSÂõ´ OB.ÂH¬Ê ~ëuÙ‰ DóN<{1 £cÁ\çŠø Îí–öÃM©ú£Ê³;¥»ZxŒáJi”áë¶Pø_–Oèò'Ó’Ê5¯§<‹Rبò'â²ÏEåŸK*þ&­\”šIÊ¡IåËïÿýãwùyD—CÊË"fØÞEQécqÙ¦ê c®ÀP™B1œÄȒ©À(ë‘{?ˆHù÷:‡£û'—‚ûrmÿ Û o€CFü]ï‡÷_ ô,¯<ÖÞu±mïûÞì²þ®$ÛSV[#é@øg¤­s,¼ïTpO‘@/\@QÿlIÓL]ô®É?c L9B¶àlÍšidj©mo×oÛ#SõÑÉÊö»µáu‘+®È!C—Ròø6s°Ä}ÅÆÞ¶Dgììµê¶`¡IF‘„€Àq¤„MÙB¹Îw°®È¸-ZL[‚“u±+ßø½©í#gt¦68YÝ~Ç›µ†»_³—Ò21ŠlD©mÚâßÙüŸÖÆšC–Àœ=²Úû3¾ž›¶ÐMKðV¥Üm‘p ð8Ü©‰É/ÿù¯e‡<þ|E4YN•¹RÈ'( Ã%ˆñP‹>¹I3Ü HÔë+ÖžºL“bÐ¥Kz ÒªDƒ*åV {”éå…fc¯OÁáÒ„ˆáQð‘£;Úh|Û›_-bò9ÃP@‚N9‹‡¾Ï„J$$)æ$ˆô‹‹ ‚O òqAq|r›±`¨Y9êo¨Ï¹õc?Pn¾ëÏœ­Ó~Ð"¾èÍ ‡}k¥é°Ë˜pk“NùH“ö Ä׋øüá¯S^ëlUžéõ‡€"Ê“¦?²‚aNÅäÇCTÄû’Z@‰(ØF!Êgƒ(Ô M“MÞ·]t°]ê¨ÐpHŠòPëFý¡ út}$° Ñ;9_øLTõKVÛ“ D4'£Ì‰°öDTÚZ/ÅÅr.)…×™×-Õ|"·,ȪžŠMk^O/xæ™JÈ‚Ì ™gªç5UËÍ tù7YÒH¶XÓwù¿y$¯xÀ”?Tš–(² )ƒ­›×TMHª¹"%èõ˜ ¡4”t`k4ݱÀ0Æö@qg–²ŒŠœêÏŒDû2±¾T´w(Òs>´7µsÿùo¥C=ïÅ,³4ƒ’¡îÕÖÈp¸wÌß ¹¸ûm¶¾EŒàF(Í>Uºî Ý­ ÌÚØI+{͘«É¹ÍW*ÖölÛZ‚ÓXÇ[µ¡©šÀt¥ÿŽ3>éŒ\µ®Zü7má¶ø\YûGµÛÿ`m+‰QG€ã8ŸwÈè¼UãÏuîŒÅË…ÛŸ°°÷jÂM±kµl›¢„K!v©òrùV€ÊŸlí³uÿf¿ÎŸ›8Ï8€ÿmâ€mI{¯v­Ý•V»’lù6ËÖ}û¶p ¤C¬û°9Ò–Ò4 I)6>0`›•e›«Ói¦“éL§“I§ñ;n§š™ôǶ€I_A'ù©“qk™NvžÙY­ŽçÑ»šý~”X°&æM‘?Öv\2…>´Gï¸v\6u|j‹_qFo,½ï£Kv}À¨2Çþà‰Q˜FPZIýóïÿøz1K‘'O·ÿ…"ß¾ý™FŸÜ€V€L–‰¡1ФÝÌYŸñÔ²¥§(ùB´i?`‰0êã‡]pˆ»p¸A×ZN¢„ Å!ݸWÈØu£^í©Æ isE èu¿ªP8¾¿žhÕešKF›xɳZa¤0ž1íRI.!½I]'ä -‡¸³®¯“>žTuGµ}©åÕv2I ‰myJËY«ÂpˆÂrp9ê^§Ü¿…îO©û:…íÆA¤TD¡×Êò¼pÇË`âHPßßÅuÇØÔRû ƒÛ˜ÃAÝàv¢'ÂôÄ´Gãºc)`-¥½"@ÁMDQËbÊË}ö{|GļǬêø¼ `ãgú«ºö>[óF²Ï> د‘ï,`ÏÁ*©7<`ªï)+ÁÃ[zÓ¾,…hpz!7Ÿ%™’<ü'Mï…÷Já=Ï‘î>Ÿ|°d<¸d]±Ôôï¼y£=¨0—’\A.Ä„¿¬&åoï ½–I½V!ßVòÐXÇnÀªþÈÏ*Ô:FSÉУç{ÄÜ”#42e\±Eæë«¥‘)kˆÚIshª¨#L2iç#“öè”9ü[rÞúÀºâˆÜ´$fí¡îDÜ`braQNlQ—]t„§ê¶.µï¼9¼Pø¯œun½îHþÎ1bÊ9#ÙÃSÎø´-|Ù›© ÎÕE¯E«‹ÍÖÆfœÉËžrÞþ¬6¾Òë3iKÌÖFfÌ‘«®Ø¼96Vó2Éá§iijþ·–c[\\ûGeyêÉ×—.~Ìȱ§Q ŸicGÌo›ËN,[zê†}Ɖäc%¯˜ñëÓ>c¦Þ yUçüØ#„ ‚Sî²Vö¶¬b.C‚dázÃÍÊ ‡µ¼˜À,µ¯jÂ'œ®/i2J~혓›p¤]ê±6݈[Øfa‹5$’NÒT1£ß¾A<ÕÌ_hâÎØô£6ã™FÃH½mÌŠÃJ„ÌI¦Ì©~³]/m‡ ’O=æ]-¦Ô„·â”ƒ=ç¤e;}k‰5*+^‹¾$RÜ[ƒ)º'ªíïÙ­îK.—F´= ð™EÝ©|‹Q‹E?ÓZ–ÝÖÊ¿w0GãLoŠ8ÑYÒ»#¿T‹a'Gˆ‚k³jŽDÁHÀ$ü»ÍÒûêß C;Ñîw¼³` )ö¦ôÝIìxœ?üc¨”W)HðÛÿXÊ Üß³•¨ªU§ç¼n3ew4•·5•Ÿ©+n³•_°U÷T•÷•å÷UëA=ƒ @È7µê?çõ¥ªú º Pܧªî ¦«Úò†0.Gp%'S ÷…èOûS¯½ßqp$¼;“808²;¼ÿ|$‹pf©é.qHŠî=ÔÒQ«Òã9ù$IÊ)âEFp¿‚LêÂ]¯Œ&œàVZ#Zâ‡ÀwÙîmWÁ8„ „)!¹9[DíB]ôCwhÖž±FoØb3æOÕÿT@D7,ÁëÎȬ+9gÉòãckðº+1eM×…€I@ÿ¹6:k‰“,ØÂsÕÁKæX9Í7Š•×\]ӮĤ}ɹäÉbì#{ÈMq0”kGØH‘)’iå¨UkøÄ‘œÞÐq§&rÑøùuõÆzÓ™ºÝ´v]®Þ:ïLÌØcxB+½>Sö$@XŠ«þädM°Ûà’Ãù‰á(öÎÛ‡Ÿi$Kˆ•Ù(L†Ã˜:¿@NC…CíE§½ì9¯pÚ·Ò©j:áâ% „¡¿ `§Ílº‘¢áÒkuFãÉv½@¢Dä”JuiŸ 9uã^~Ô#f|úQ¿8â3¤´#þ¥öå3-© ‡ïó‰oÔ,Qä*— H™¸ÙX>Ôž­g2n}zÕ4R$9ëx©¥PjÎÔsC^¹“3ä*H Æ·Ô•QƒqÍ`—ø«8ß_.¨º£Ô@:çwm&u×TÇõÄ5½IáX§ØÓ)öv)»cÂÀvmçF9£dxI.&à r“U<ce_ Šé[ža@iŽ&øý¯âZ5,ƒhB‰ä¯Y‡¡ïó­_2ënq•·øê[êõwU5_1–›¬iÕcëûú¿¬Ûœã®rÃ]¾êSµáoLÕW´e)&(Æ1Œ hÚ^a}!¸À#Û·\éîÕ=ý±],A„È`ˆFp àÅP]C" óhJAÓ  ido:±lê î>ËÚi,¼÷Ùp0Ùw>ºg0µû½øÏëøb˜ÜŽòw ŽÕRÇóV3–Ð-kò7¦Í<á ¸L„Ã(¡¤‹+ɬeÎÚ5gK-˜"Ó¶ðá+ !à‚î/v^3‡oØ¢W\Ùý5ÇŠÏyÍœ6/¹²h¼cÙfÒˆ‰r0AÐÂÂÂÇÁþñãÇË®‘F·Gp•œ’2ñmÚ«óê¥OUjÂo8Þ¬Ô@J*Ø\\|> ޶•{Ê)œÄJquÈ$ƒå”UhóuCÍÜX½öl«f¢™M׫G³Ñ¥ë ™ÆÂ±_§¿QœwÀÿVŠ{wîyæžÝÙûk{±½6Økï²6{øZ4×xïµM“rÚ‚PˆJ|Ûã½l „T}Ñ}©êš`L Bm ”Ò*i“Wô‡úK}Q©/,­cŠ}5Vóvæûyò­k[–Yç‚J>`Êg=¶+ÝúÅβó!ÓG»¹x]FKá+ïC1 BjY1›ÛLú ‹ÍêbKIfݵö¿bMûôxÐeK·r;M‹í†øvÕÒÎb“”‘ ;ÓÍôÛ'R…jÓôäÇÊ5'ÍC{J?Hª3ÏÏL¤ÄѸnömË™¤±ÅÍI"\iqL,F‹ ,ß0§”é~HøcÃTÁîÇ6½_:“½)Œ¨%‹d²ôG›:iiIrÞ1¹¾ãkÈUw Îo˜ª‡òö¿K® ¯­Wy)s_Øö½X÷€uüUqÞ—kÍm­ Z? Á·¬göýl!yü“ø‰‹‘á…‘`E±á®Šz€¸up†PymGG&‰$ŠÛy.9|)<œ® ½;^¨¹"—Ç!?rᣫgàñóƒ#ÙÈáw;ûŒ…_Š¥+Q檧gÃð‚ä¦/ñ{OßÉŠ& ¾rçp4As éȳL)É÷š«Ó®Ý\ÝM@¢Dß‚ŽÖ„nxâÐ!×<ûî4¦~€û\jŒÂ,{ãPAKõq#Ë"8"b„Õj}ôèógÏVåðìùVXLüò=#8œ‡Hí­TBjÚoͬ¹å×)×^’ï2†+IøîrEúH…ùt3ÙS%b"Ô ¥@KæÒ mÖùcºC•d:,¹9× Õ¤Ìû,ÙÀZç–,´(™&.ß`ýU›5,;סß_gñÛ¡?Pøál7 ¡ Bâ)hÈd~»Á1ÚZ™Ûe‡"Êøát[¾}£4bÎø•\›9ÛaŸ*Y¯z¥Í1ÒŽTÐ: Kiq:„gôxŸy"Q¨ö‡×4ŒÄ („é$;7(Ͳ£ˆujP:·Ÿ‹µrf%‰bç Ú‚±¯1(ãwÚOEŒgÅÉ„:Õ¯ÀëŒì~ôn6ÅÎ$¬? ²É@(Ajö±ü-ÁõO¹ák©ü/JåC}Õ·¬ó¾~û†×Ö«¼”ùV©~ W|MÂ×ÿFÞf ‘b–⢠Èï÷ \H CÀdûŽ\Ž+” F#?Š0‘åÍ(ó~GøRòÄxâ]T FôEÄÁ–7¡FŽu÷õÔNuG.÷-ÔÜU~@ЬjâduŸ‹ùxß§¥”@0ŽaQT{¨Äu-ðCèÿE~çî¹íM~éMŽT6(õ˜!C”Àp†¡IPDG@K* Ga˜†£Ë5àjcï wlÉ¿^þÚ“ú²!ºîñ„¿hŒÜqŮՇkvÁ.Iâp…¹{÷îU0òY2AËb«šöçw®u®ñlƒýÓ.!Û\2”_·ã6 ¥!å"NÆ$ÁZ¡qýV^ŽT›§»³eéœ ˆ™JÆW’ Ú²!Ýlp£4­hʵ›Ó­ð9˜}âbcYºS¬æ´¨ÀðrC™Ti*iœIèÇ¢òtªPí¯Ž% E䨱0Ô?“§’æÉ~îoqÛÊŽ+&0'e†‡¯˜€QX Ê|à ÇÙwàÍÀCÀ+Àê~äé0;7LÆåñ¸Ú!lF‹$FÃP$¶å k¾%ÕÝW·ßQuTçŸtÎ ¯­Wy)ógÅöÀTó¦ösÁ]-°4Rpq¸2J:ùF,ŸX)ë¹ðáùøÐÅÄñ‹}C…"A²y—@1€¢;Ëër{^M¼Ûåp”°WO…¸y‹Ž4ÒÛØv5u²Psó‘¡UŠ@“¬ÊžûKѡӡ>ÃX¸ÆF€ßî/¹7ž/Hn7Æ—¢˾þ婨\a%X¤8(L¦Hž¢p ǵ(‡"( +U .¹Â7šb7ݱÛu‘õ뮑ëî¾%Oô«ÚÈMwã^ÁÊ›X• (‡â„Õ°ZÌh¹®2ÇX¨|a—:ç7äƒrv‡šñÚ³kÖ¯äúœö²}ísÍŸ¶[Ï·nv³ MXH=‰€ä —4Z Œb›-üÉF9‚¡jÖg›k2/ä+Aý¥€)í³Î­hDÍul˜F2Íj¦ÕšÙY²èrj¾Õ~®0ÑðÿlÐò¬ÉfùÌO+§÷ƒ™‚iF™HŠç .cêd ÒB¹ ƒ†ÄŒ„‹2øy”QšÖKxOSÙ{1ëHRŒEt3ýP#ºÑ˜ej `:šŒ)3qÝdDžŠ›>ˆs^'½çi'h”*:Ì›Êîo8ç}Ññ7cÍ=]Õ†×Ö«¼”¹§/ÿ^®ýB®¯cYÁõZZÖPƒ¾îËN/î;º’Ô ¨‘Åø±ËááB©à-—ŸcXÇ÷ºüŸ ž:ּǀÀ² ŽEÌŇªxuª-äoK®÷p¡æþ—LVóÜ$G,OÅÞ)õÀ:ƒå»á xAò™¯ïóÑ{uñ?6|V×ëXô¯Ëu‘\uç^«³L”áÿ‡¡IP Å4Rú¹š®eOüf}dÙ½í뇴»¹³Ý5Ò½¹ã_5í/eŽ$Q–òîÝ»OŸo«ù7ûuúÛDzÇü?X•+ñ1÷øšñÌxÆNì’@Èe'v!”¹|Û ìR–3=ª,KˆsrűÇv¤Z©oVíª«jŽ‚v»+JYÚ­ºª*•}âM_P9 ªb}5zÆžñó³ß|?³°°°ˆ‡gÏr«‘…çOÚwíÆa <Ï¢Xž°‹IlѥꗺUÕ3MDÆÌ]p«\¥ëµT&QÉé*×YÎ6ò©fÝ9oñžje3[xÌLýØËf]üT½!ëagÜJÑΦêMI×›î«OÚK϶hœE¨ S`ìZ)ËeJ$Ÿ¬S²=åºñ­üôö‚™½è¤D‹rÖjL;t¢Nצ\¦¤Ç zѳ\áÓfÊiÌz )§Z„ПnÔÅjÖɾÇHHKÈH>é(>!rGíHD8R„©±(`†b$¤ù°£šÕ2 HFÈ<9)G {õq÷ú“=†±^  ÍH˜_DÐ?–3ƒáÂSaEÜÇEè±(7Ô”®§òI%„# K@'1Ãß”[¾£ÍÈ ™¬dIòw¢òZfV¢$QäÃ$D¹ÇÞšŠõŸïÜ9úA¶óàlìÑw(í;t1Ø—+ ø-éº|LA–ª¸ÎÞr­•ð W»3ᾄÿ`!ª–£ÀùQoûÕîœíû23¡> ð‹Àúbä8íoì€aXƒ+ðµÒÍ}ÕÒq§Òw§6´ì xKrúUEÛúCuø“ öJÝ\áœ3ÈqËümmôRÅν&KƒÖԮߜ¨ÚvùpînmèFM×¼5ð…¥ûšuÉu7o Þ5ƒißÙürDª5ˆ¼º¸ìž½x½4IÎ5òÝóM‹LP+`Ê­/L·±)ÇR·ªö¼G¸äÒ ±êUtžÊÁ1=eüD“ꜳàⵓÞÊ&-ÅS6Ót£á¬¾TW”²Q§›!T¡ÌW *¡Uä!kVïwo.ÛÆLºÙ7“q¾é¾b½.á°Œµ¨¾Ïئš.¨´C›±óI·PÇ73Õ'™íLºY+zøt£>Ñ(œ÷’^ƒø Ë¥]Ê(Â$êÀQH¸‹Mü9·NôÒi®"„ÍÇd¤l #c|êá÷rÕþÀ!à(ÂÄ]¡°**"É]v~((ÂÆcÚ±^r4BŸéÕ ©Á?ÑÅ#ìH”[4C®æQ÷RgÞåCúÑ(9î§'"üpf  10D†­V@ BWüCm~À”.{m­äÿ2jA¿f­L¾–T‘yä-«¹à?”ž ôˆÑ¾)ßÁË¡cWüý³Á~1œ€Œwî3ªY©1’È•‚#ÕC{Ïvþp -ÈÉ ™šOµõE哾 ¹Ú÷%EfB}`€"ñ¦ EXˆ€ H 4W¬]¬=s6ßoj»–oIæmÁÛÖÐýÚèçvÿ/+w}ZTûžnãÁÂê«Û¿´ùçíá;–à½]7¡_Õv}] ¹]¸Þ›³.žþnKèKGøNÅÒÏi ܨ _¯òµÊ´0K¥$N|ö³Ÿx¼î'Ož€ãÓ§Os«‘ç Ïÿýì™ÍlÅ Tà8!N¸ Ó[¹”‹™ròi>ã Z[HºrÕªgAÚKs›Äí79c+ì%¯>Ý ,$¤ì™u®GÔ(† .G!T-'WГí`ݤŸisrÉC¶‘›¥ìf§¦´Û˜tü·}9±쫟ôê²[µÙ.Û€QrÚ«ïµ@&L#““ˆ"_†²*šm)¡²ÛLSM Ñ®šu°™:}¢¾0ÓDçîOÈaŒ¢«ä|kž>_…a¬î­Ðœ Eh&bT<¤ õ€*GÇs¦üãݪÝ'ðÆp@Àƒ #1°ÖŒ„©Ñ3}yñ‹O{Èá°z$ BŸÙ N ú»Q[)w`¸š#A0$2Dއէco:òhLÌjT°ïI@#¸ñc yL—=dÊh7þQ»é¶â[uÕWTå²×ÙJÞª<¤6½ÊŸ5›QåßjóH[v_Øôµ¦ä/ªMRWüUiýжÅHŽã†¢8NKÑí…•  ¯D?LuøZþõ¼z?:’ñží>r¹ãðOƒÇ3/ýûõÛÔ}Çüm«´M„Ø>÷»Ïñõø–„„\¸ä'vìÜeH|ML€Iš4PÕiHÂ-øn®ëº‡íu·îF)tH+£T´›ªi•Öe?“ iHyE8H_ÿåcÙçÿ{°Î÷óøú»6:ÔJ‚çyŒ ŠHF¢9‰Wã(&Š"á6NsxGw28tÝ3´Œ¹Ú=÷ô§zG.vöÿ´ó­éà@¡lc:‹§9b­˜« ܰ§{íözOưBr¯Üc“ÿvE_¼²C†C#¥Pp˜VIQi …vKi2§ý“Ê=¿¯í¾]×s³Ê›©9ï”{>¬ñÿÊÝ«!(áDÉ#Ø—_µÌêXZ#óß>ì`IF«$Yáýr¼E/?iº4E’M¹©Érµ§±!äd[n¬I³Ë3®²3M¶ WÞa×*VNgqƒ³¬’'³8¥ üÏ 8«@ÊyëÉF[¬Ùz©MK4B`69ì0'Ü0°œp£ Kí«I4äÄ›lg9Éf1Y/§\yã.r‹‘e0CM(‹ Í‘z¥ŠeUê¾à„Ë–h‘fºx%ê0ÅšL‰f["óüx6‰z[¼ÍæßHщ‘Âp&½áx§îôn0hA7J;a4` ª'—‡"é„W7Š@`#íX`$‹ï%òäníI?|mQ,òÉž5ã{Ò 9Û'½ëÍéû¡:ߪâhÔ"Ù†vZN÷™ÆžðiÔg ÁçÇ0ºË0¸E%‚ ¬@#Ù"™õeûJªøD]ôWðP.} —|Á?ʾ”*2^¯²¢’FˆìQ–^5¥’ÅÜK¿JI…Ÿ ïë˪k¸¨Æ² Šbi†Q îµ½Ãà„‹žYß‹´<¬3¡gp2Û5p-8ë:¾ ‡ýýqÚ'ðádç>WáF ɲ)ÒªPñ,óÀa–X¥XÃh¶¼9³÷h¸cÿõàÈriä’(ºëhFºxûJðí=Ž×9ŒäpZ%²E(û~Õ›V{S±óãêàÚžŒ3`…äf¥ç†£ï—5ÁB”ç %†®² jxPU4‰âÅPUÄjú,ëÏ»ïÖ35çí ÿ\…ï|Ùf^…q%Œ~£½}~áñËÁÈ7ó °Õ­›†¿4¥D)ZI”sæH4;MgŒ:/%ËW Îô gš­‡1ÞP˜j[Û» w›¬¸h&R–šWñ$AÑ$¡§i‚@ Áš¼£ESn[¤ÉuÃMÖF­1‡9 ´pËáz[¨àÖÆ\Ú„{©}ÅT£%âÎ;çÈ7J©hp“·ä\‡ñÂI‚–U(03òíwµ*‹b{NÉĈ.bÀcnsvwdžÏ(kÖnˆ:‹Ïo'JEWHA½gZ*@#ò{ݺ>íTH}:ÝòpiX&Š@òT#‹I+eÌõ£~p˜ˆ¢9é·h&wëN…ôã!]‡“§Yx”ñJ\‡’¦|ë‘.Ãd¾&ŸÛ£™è6>·FL“=ì)?{p+A׫9œEž#ÆëçBå¿´×~¦-|¨/~Ä®û»T–ñú{•ÐPä¡~ý"Hžjä¾üŸlñ§šüû¦âÏ5Þ h:Ÿå†'v­aÍ™`"4|¡óÀlpx¦kà4Iÿö Hžj䃎Á‹ýáø\[Š%“·Ò}Þsà²oèòŽƒ×ûŽN÷ oÛ`7(HIIðxÚ!Pjœ«ÔØŽµûà>³žÁTW¼ëÐrinõö'}ƒ—<ƒW|Cžýë$`FÀiÊôN}ï«}²?Úè™Ë´VNþPëým…o¯­*›D4$R/èv˜ÖFV«I’!eVÌV*I–Z•ý½ƒñ×åÔÈ­rÐT"k†Ra‘È…ùùo^ŽFþ/ÉÂc«^¦HG•¸6Û2Ö*‡–˜ úÀºŒ±$Zä¨[ŸtšÂµ–”£øL«ºLü>©äI` a:JAQ"Éä ‚Y`•ŽÂÞþj«å’SŸ°ë®6¦ërãiŠèÃvsªÑœ™8-±&C´IŸÜ¼Ô¾†d«<íÌMº-á:ãŒ#wª‰ÊãX‰«T„Àe3ÉùÇ7Ï· J‰«Åìu®‚ÄVí…zkªYާÁc Û3Îg•u¥Þ4m7¥^×ü¸2ŒŽ² NÐn·Œ‡Ôãˆv²G,'—Y#Ïòf¢G:4MõEÄŸxô§wkÏörã~a"¨Þ«90óñ› àɉ`˜gádG£hv®Æpx§î\ŸfÔ§?ÓËŒûòF{ž[#'ºuS!a*P´o›N$+¼Æ’£Óþƒ¯zÄÝ5Ü7ÝÓß3¼ÒÈ«ü_@#°E5òôò¾¶ô®Tonsë¶B}¨©×HDâeÁ׋æiºñSÐ×=o_èØÅ?ü(òT#‹—¿ð~4•Vr‡)‘ÓZ0Ï¥]ý?÷D·ï‹#¡¡ñ®}¡šV»¹°LÎm)©Üß¼ã¬çÀµžÃ³;>Øs,á}n-©‘®dÏðÅÀÐÕÎÁïà®j7®Ba6–$«Dùgu]Ùèû¨Ê;W¸U×=WÈ8VHæj¼o ³Z ÇÙ%ÃûåÛ§]]&F ¼S.-¤D‰eµ$-2Ä9ÿw=ÓHUàF…¯Œ‘xœ@I‚&©¿Þ»·ðxþåhÐóøß_/,|ðyŽ€Ö¤ÂØWk;Ó‰6ZãnÉÿ‘lZ®öŠ€p@#–(4»ÃúN-¢VðO©V,JçðR«ÕôN•m²9?XG`x®fd.é°Å«*Å+î5gëå„cMj³!êÔ¥œ¦—9ÒqåD[M±¶¥öµEZL—ár“©6'œ¶#vÉ’qãÙ¯³Ø&î<àoûÚ9<žûòŒñ1¶IBB¹ÈIÛ‰ãdiÒ†$¾XŽZ¥(är ‰O’¥h+¤JûP©Û.ªv[È.,Ò.B »Òª}Ûm—BöoÌf%$¨,œ¬¯Fÿ™Ñüÿ¿[þ}†ÔIòÛP¢¤¨ÜQÂ-X´ã6žÀ18Cݶ+/Ø,Dë„ Y¶“ˆ!sÊùñâóŒÄ£*R/.6“•r*} 訄âÌ…ºÌÒAvÒ­÷ Ó~Ь5ç¼ÉÒˆjÒ«|–Ä®r:Å”¬N©'¼@&ì¬rÒ3íÅÃì9òD;¯”œ• E½-Ã)ƒ õÊm³ ™€—™öˆ3½?£ží}Ü´W3 8ä áe\†Ö Ê-4̓ҳ¸ø/{ .ú«|ÇCÅ®û𢔷¿7Ù\á ÉŸEÈ €CªŠîªr¾c‹î**Ëâï²0F‘å”Ï÷fÍG;•ïTKBˆ^J RR‚Àé&³íÑäÒ-aæ|àZM \¥šëvzå&½ìŒ—˜v¨>vÞK ¶<§J#0‚¤%R g4k\ñ÷ŠòïÙÝ÷U»RßþÞd3%N¾dƒ"”ñü‰+)' àfñ œ¡è¦¼‚€§?èú¤çýXÇñËÎ!ÐýW}£Qç+kd!I¤¿ÕÁC8E$ŠçsW‘9ä¾è:qÈÜü^±ÉUa;ûnoØ5–¾âZî¸á½Ú9ø±'^ðÉêÁ÷W€[ºú“¥‘سڢŽÕôV#)NS8Š•É…Ïª·K·ª\wËœkUÞßV»n—ºR΀M’¯k\Ñì Ã]-jþ}•§–ÖÐݬÞ~·¼çÛ2±Þ¨ÂðKÚ¿­öݬNÙsû¦Ì5’»G¥ñŸA=rlýéúÓŸ^“FþóÃë러ÿø·ïþ¡f²­(„"„œÐ\0Cõ ˆá: uت š“Õ=ÅåxëBC°N}Én*Ç)œ•bL_!ß•£‘Â2J+£Å 6íj½1ëC ì](i*KVvžoàVAUfí’);Ö˜6S‚b ‘žI…ÁvÅl7åÑNøÔ^~&ùÙÐH"²@|W˜ŠëìfMöfne«óå$gBõîü!r¬ƒœõj.Ιè¨À¦]úéÞW­ ¸…/7ë&¤!å`+¢f00“H ,í(¥]cKþ¬-ýgª{ß›l¶ü®0NPä¾|×=.ïsº(_N8DKPT²„Ìš[ñ[ñ ~„»O\ñŸºê*uõÇü#?[#ÿïûÎA ˆÝ9y,F"[Ò-Y»çÜý‘ÞѦ{´Ù²L”GI*]šË¨zªWúN¯º†®¸†?q\:Ð扸O‚ƒ Ç;Ž^ëû Y ºÀm®8OŽuô( Ã0'hœ*«¿eé»Wê¾Yíø²ô½{æƒ_w®Uö¤œ›$¿«êþ´ø]Å S]í !ˆ#yå7+]_U¸·32†Ä šþXæ¹SáK™FÊÝ开’Ò8õÅç_¬ÿ´þš,>"OxüôßÿZÜÑØ¦“ò$Î 06¶€$ tÞ%‹fɬ‹Ök£õ$ÉêžêH¶hÂVCЦŒÙóƒí|¡§P<3CÑY ]²‹Akv¨IjÅ,ºX­1X­¯P·i³Î¿£}¸‘Õ«&M¤F®ÕÅl/[L¥[4{É]¨cW¹ùF„HF•e±Bȶc¡I£æI)FŠAmÉ ( Íà[³s—[øpÕö˜M³d£ö”óã…ƒûŒ;Ù«»dU_4Sû*!Š•"ލÛM@ èœG?á7Œû˜¹ä dÒ»A‘DT3~&à=Ê zÚo ”÷5B;5*EQz¾×pÆ#œ?è"žõh§ü0š@/ؾj=ÙÓ>zÚ †ñ˜j®G9Ù¥ø •7êP’d’E Tº­“b¾áw=âóSÞþÞdSeC#”…UE@#€"w˜•r¨”À`9FdB9¯tä뮡ë]CËŽAÀ ãÄr×ÀU×ðÙ/· ¦î<Ž¿ìÃNû`G¹œûÉIÎÉIÎÉ…ábÂM$&! D¼Ôbr@íÔµŠ Û:£µŠ¯U WÄÑ™Ýî}föÖµU\V«¶«+hwÛ}ÜA‹û‹¼Ö‡í€ìƒg¾ùÏï&sòýÿ“ÿïû ðÉplÏúyÉáM,3€"ïÇäˆcúÛàþ»¾m¥$O"„Àqš"QÜBilíLuõ§£}ÉhŽCF»r€4Ï6€"éÐî…¢‘d|o¶õ'—¢ûÜÆRZ E©Á ‚ïÊþRÙv«*<îý¡.4^ºãìw,Yªþ¿éSGpÊÙ­C3Çï/«›¨Ò qßÈè>µ‡³k¶h0ŒQÈǬ›g¬±ßzÃKæsm…H2w™4bDfŸÌÎ='™››ƒqvvÆÓ'O‘81/³Ï"$_5'|bÒ^œñóçý\¢.?õÌ”ÿ_ŧ¦LC~Òð`HùJG6êwTÿ¨`i ô­«óÏøLYOþÞi>»AˆU°6£ˆ¢º\x³Örz‹¬H¦•J8DùR@n;ÙdÉlä“õúlƒ˜¨3§ëõ¹g~ÿçš’õyIŸ9ãÒ¾‚󛊬g=F„X®V(X§¨}ÏÃuÙxBÁ­$€P ôǶåÖƒâT‹˜òfæaW^Ò+d¼‹MÆ„¬­`£Ÿt#^ AsÊoNæj~4 k¾Â„¿xÄ/dBÖWÚ$ît+JY²’VÈÕ$®&”RDA5æþmÊãaáD'3Õ/ÜR¢Ã0´ó˜­-Õ.È †À ¨QR4µJómLDz? í](?©X_º£l€À[6ò”sb}cÁcý=ë_£pJKª¹ ÓP("‘”Óí·þäî™pÆÿV¾î^¯m»j¬0uF¯ºc—]‘ñÚŽ›kcKŽ‹¤öØ5{øjupܾˆ~ìh›¬m›p¶ÿÙš¨ ^\ø¥»õ–»ûwö`‰\%§hNЉ2’Â0¹ 3Kä¿v§jÂëÝçTUÇUO×åêö‰ÚÈ_í¡kîØ»bn¯¬Ï—Ò¹MñxüÉ<~ Ïçzüøñ|ñÅ›jFE`xH,tÁéM‚†4䯲;‹ÉK[1ÛdNçh$/]ǧêLéfÛÙÍE?õòc …é@^¶žK¸Í]Ê“\ÀÕÁPƒdé ™­Lo…èUî¼¢÷ܩͦD“6YoÊ6š€4ÒõbÂó¬ÏÍK ÐÔÃN.é·e¶ïò,/RH†”K_¶·e+‡¸Z¦0:*¯ÏQ>¼YŸjÒ¦½£üá:€í³ig¡[]mm‡©v Št@LŒç›aEç¼…Â2}Â…&>í7¦6X÷ûø5Š.W„R©¤q’‘ ð·EIPCpõUǺèvã`œ?[tìÆ†­ïÆ «‹(#US S)p9‚ЖílÒŽšºÅ#yGâêSݺb†c]º÷ÃÚ£QÕñy" |ÂDÊq°G|'¤)+¥$Ø §ßüò+¥8zIUô™Éù/~íŒÊvG´Ýçmߪ+f¸¥ËZ\qÖ»l錮ò¡®jš±N+sP:­µ~­¯¸£¶ÜåKoë+î©Ö¼ÃšiL¢’*%M ˜WEMC{F£ýcá¾  ý DûÛçc{ÏGû¡†1Þ3Ú5øj7‡œg&ÉáJèed£¥²©ÒN·‘Ñ´®ñœ‹ìδïZ(?€éÐnXãÅØ>˜™€%XõÅhß™Žå:#† ˜a•*ÅX‚Ö ®PPr™‹Ñ²®9c“5‘kkÃ\štuÞtt|â ;"×í‘I{tɱa‘ô{gû-{ç5Ñ©ÚÈTéë_:â“®èç•ퟯ‹_© N:#SÎÈøšà5ÿöƪÀqKC{D ”ÅÐV¡øãúøduÇxMû¢ÓHMä“uÑ+µ@#ãë¢×áx"m±(%àË…vý›_üê  ÁwOfç¾{n4òèÑ#ç€æž8jí€"4II©åÅ}>õhƒ1S§O{ #uù‰€~áÒòÝ8ì3y̯n´ŽÍzõÀ'Ã͆ôzqÀËT*qLB£ ‚¢YD)G©U DY‚æà15ê?ôŠé–Òáæ¼áFÝOŸj0&üàÓ”©×§}ÏNù†¼D=Ј.ãU&]ÆÑëЪ³„Ts4!c¶Z ‡¶Ñ^«’¡kUº÷ë-‰fc¦™Ëøu£þ¼”?Ø e]¿Ø4’c¿Lƒð#‘[ ÔóSØÓHn™BÆ ,g;(Ú :0l*‰z—­*$4â*Z-§H‚"Yèˆ@3r)ÜRZz6‰gÞÐj!ý™F u o¿&-xŒ&娜"à‚®%”r{ZUt§·ë†Þ1ê$‚^ʵ:ÿ@Xsî €¼=üÑ(;S‹.”õ`Xu4,Šª]åì*T¥¤Wh`o$r‚µÞÖÖÜÓ?à hKþ.TÜÓT/}\¾Ðbê6o»«){ÈW>äl÷Ù’¯Åò~°E_iò¿ÑÚî‹ÕŸ±5mœŽDV¢$!ã9¹Tf$Õ=ž–DÇî‹áþKÑ}9`ˆö.`úgbý@ Ép/‰H/(ß÷_öë,¸‰ûŽø{_Ú°¤ÝÕ^Z­Ž]iuX–|1¶eÉ’eݲ±9†ÓÖ--\i“ƒmpâC·,s Ó§LŸ:…!ሦt(’¦t:M'p Áô‘7 ¿°ó›ÿH³»¿•þÿý~Ö¢ª òPÇq0.Çe‘ZGÎ?pÒ¿AH¨„/`ýw#¥"CËÕϹða€"€t`ôv>rÈ$×y(ì2»)>„ !B –6¦B9Oá8ˆT©ã|æíPW-˜:ïZ ryѽf ^iê¼a Þnß1î4=mWªî›"´…ozún5¿´ô\¬ß~ªÆwÀД6´}Ö¼Þºk]©ÛµhŽþ®q—™RàÁ¦V ÜŽ+sÆ-wZºoƒÀE׈) þ”[–ÈbcèKk´`cà3k§"E|„$IŽã–þûcA#/^þðbéíP¤€WÛÒÒ¸îäø&D ÇP¾ª½œÊ¶r)»"ïÒÎ:ôq7—ó.[àfÚJS¾Ò™Õ¬…ÍØäy»lÞ)Kµ°;×cÈö=‚0¤@*‚)lŒïÑu¬vÀ©<ã*ç¬ò¬­"åa.EÒ­›o×e}€7š”[q±iÇS>éѦ=¥i—6ïarIʦJyËf}åÃ^ÌNêVëâ.nÔª8ÖPíÐfœLÂ&OÛ• eÖ¥šsèæ<꤇ʹ¾€{€@ pk°PÒ :{UƧžÙÈ„kQN@ PZ*[…0)E(A+Æ-#¿ÒnÐc¼ ‚’%|IA7ÚM…ØÉh±5¢xß_¢ E¹†Â0‚— «`ëhPÕŒÄÄÓ{Èɘ|,FǨ.'xóCD˜f›]{",?Ó-HÇÂÚ‰ÞŠ±eS“x*¤þ¤—9ÓŒÆTÍ”ó…H`ñ QÞ>š}Ä6|GW=r5wekW<.ßUQ둼övÃSéÚ¯%¹š¯U5˜ªÇÒÊIj(ê?§ë¯ù¥HBƒ”…!´’bo Í~t \òÏw*ø¡÷è²¥`h!0” ä¤ÃCàä`œéì?ݵߤÐS&&D4ŒÙ>ûæLß±‹±c›*Œ…i,¢Ô°h*rh¾û(8p¹ú9^ˆ‰š½åýƒç‚Ã#Û÷k)†€a`4¥2ûZÂsDG–J4 !BÂ(ˆä¯ª†È.mÃêv^m ÜjŽÞ³FWL»¯5í~`‹®8ŠU¦ÐÍ–ØõÆ@¾nk3©Pbb%x — IóázLúq…ýŠ5´híþÊÒs·6ðÁzo¿ÁrªÚõûúÝíûÀá_XÂ_˜‹®‘Esäz`O¤€sø®1|Ã9UÑBBÂD¢];v(ò¼Àƒ^þô–5¶Ÿž/ýíñ 8 ^cqB‡jæ:Ø„C‘wf]åsnEε\i Q–i+˜kÑ$mšœCs!üë(’§ä‹dˆ\‰TWK;MºYgÅ”GŸÙ¬Î¶VÎ9ô){É'Éû˜¼W9ïÕæ|š„ äuY®àeê}*@¬g½ºŒ[·i².ͼ›KØô9oE¼­b}‹üœC›pT&¼!TÞ®IÚI€¸Y{YÜkÈlž‘g<ÅÖhòõPðItkâòn6ÞÌåÜÊÜFzЈ×K "a'Å€lA¡8έ×w wMìH µ‡¤€%D¸)¤ïf³<{€ñ[#Ô™nº¡J†^˜N+ׄÚ$'ù>édüDH1Ñ+>ÅÚAó"“Áèj †uÙè©n|*ª:Ó[9¾Gu"´\ý(ÇÂäh3–N„e“±²]^9Ac–˜d(ºº#®*Œß³ÖÇÒuß*W>.ßUQ뉴îyÝSÙº§ÌÚ'ìÚ‡Tù²ê{…ùÓt _«AB¡€KD«aBM¬æôö¾Tl8¾Ðs|!4œó\îýM&0°\é¹kø‚è\øp6Z¨×¸<Œñ‰ÿÀ~×Ö­ëšö:6ìèŠ |äß»¹Ú$`(I ˆp‡Ñ+øÁ?¸\ý\ w—ˆ æûŽ¥w‚Æ<†˜-%(!D4—Z{†úÿm9Ônh“cjH a˜äcŒ¨–UŒU¹@Øý¥1ºØºo -6…®Zv¯<ŠS×ÌÁ?#“:»§„¾šÏS4ÅÇA CÃdá­Ð.âÎV¹î5w?ܺվھn ÿÕÒ÷UmðFc঳çsS°Ø}ܰ¾ƒ·¡?›bWœ=[h-È <àÒ…‹/|þòYÁ!ÏÞŽE^mÏžýÿj/ e26.F_UõKžt1WEÜ£)œ¶/WÚ0(“ÎÒ”§,í¥Mع«&Þ¢špÿ¬Š·þ9MóÕFõ‘Qžw©g]Ô‚µÊS ‹}ìÅYªEù©]›jß²i‡*aWÍ9Ài9à„£,ã{³FÜʤ½,ëÑÄí@úœ°¤4í”λ gH8Õç;ÄÓN}¼ÃؤJ¶ëSvCÊ¥‹;JgÝút›.Ý Î¯Î·[#ªWà&)Íx_SüVú´O—õqéVöCíQá4_ñ!ΈX«|~ !%]¡Žàôж™ƒ3"Ó#‰£ë7Y ¨Ì1 ÆWq´ôDgùh¤Ø‘º—{?€—qRžª,Uöog&z¤Ó{ññˆòìí©n´[ìØ@ó„@¿b•”@KsÑVîL/;Ù­‰r#aj¦w¹úQœ «ÏöÐ!f2$c“aIÿ6RË1BÃ… ®‚Ñ$Yù±ù;ªfÅãò]·¤µ`ÿwfý?$Õÿ$«þ-mø–µÜ7&Ê9X þûuúÔÆ}Æüu_´“Öáv÷·—VÚÕ}r`c #¡ Ç®ƒm¡k%!l1·À`l'¾aƒIq×þ NÇñíL›iÚz&õ´iû¢ïìBèOq_ôEý"3’ý&;ßíh¤}žÕ®öùü0ðs1)D1Èi»n÷Œ§ó6?²êLù‡½}©Ž‘µàHüxÏ-ßp¦¦¢­g³s|ˆ8]£‡<3§oÅ3ð:wNOĽý‰öÞµ@¤ÏÖ*ÎAH ‰D¨©Tfü½ëÞ¡[®HˆLõ³é$Ü}`ðd“®ÞÍàhªs´ÛrT,$I8IäÅLÉÇM§'ìãc¶ öóÃæáî]æ"+…J(N’8æÓ ¶Nΰ¾û׺¿ÞÿîÙ¥¼¨95[}ˆÃ°Ÿ`¿PC‹0"!hi *@¡„Þ%{$^Ñr×üjÿÌþmç÷ÆàÃ=®/ùû¦ÀÓÚì·ZëyØÀ?ªó=®ãí÷ýáÀé;îBÞVð‘ ÃüãÛ¿ïlO‚ôë[Û^¾|ùÝ÷ÛkD§¦¡F(! °Ía½<é„r(Š9 Òs?CÓÖ°êÇš`”1›6ÑlXjÖ-Z qû±#d›^ÓY[zã~É,Yª’%ëô×¹`±æx©âh9Û¹OuÍ®‹9 ›Ëc-Êe«>™öLAªY¹lçbf8»!œÞTW•0+b&MÒ Ç:ü¤j±I•hÒ.Ûd›Ž¢Dsñœ5«o•-Ú ³¶’…u‰&CÒI`XnÑ&òEøõF]2c*{SÒ¿L 5¢MØ^Sþ8ª9“z²EÙZÎ* ?;dÐŽ$Î#¤…Ž„@…@ˆãÐ(ÛÓ¤i?Œu”–æ‰$<´å!KKUM› íãF›*?T Í&qzët–ìóçtþúý:möʼ%eñW²¬ûÊÜÛÚ¼kšì[òLx¹¬Î¾£Ê\óz}™gæ¾,uIqGSp/Ñ´$/ºÇÜ“ç-©ò–UiwdéËê’]E+“’˜€ˆ1”').BÌÚô··x'ABǤ»cÂ^­–ÿÀ>ëï>åÚs.Ø{Þ~ßÑöÞî>{IuGRœaJ‚áQB‰R°Ä„4IDø­›"Á® G뤳ý¼§ ÔÑ^±uðUϸÈÛ ZXaRŒ«7ç9_û¸¿ÜuAèŠ8íۼœ„´,&M@R¥©As¨¯þ­K¸¯@ÞkÛ÷ÌÔ%×$K´tÔ/J0ð.†¥,ÓÉÝú{«û£šÀ´YX,q^7»g,î˱~Ìž…aÞä^(óÍ—zgK[š*rΚœ7‹œ€øÔ´Å÷—"W•\Oc˜LŒg“굚Þäš*s}bvOºfнýÙur '„cØm[¶®0¶'ߊäñxðcRVƸ{÷.…r) Ð#ëG´ÕúˆM­}Ñí¬«è"•PÐHJ¢”2Y—– óf l4Ú¦ [h†ãˆ34ä®='~XxŠh¥z¢*9bM?Y±aĪ·É&k“GªÓ#[Ti„<žf’¦áŽCcbŒ’äÔ5Øåx7Üt¢Ýér´?O#ÂɰŠýD[h´§Ô^#"%ÅÐ"LÊ1ª7·iކ”ÃAnГ2ÔÌ Š¡UÓˆbÀ£ôôC!nȧ8HÜÝðs=ÿ¯pó8’Å*%IÝëP.N´(ùeÃ!õ®-d¼$NÉÈQ’£Ê¡L¨ï÷úSš_{ÔÇBÔa7ð†>êU ùá+øAlÀ­ðFÀ?ßwΕ c$¦¾ã•׈H”Ä0Œfi’âh©IŠŽsë¿ÒZ–yã׊œëêÜ¿ó…ßÈ ?SïrÆ/eù· >W¿ÔÈÿhn© ï$-i ïªw™÷”YUä|ÉgßP”µ³I*>{…†uEPRDªæÝÖ×O9~u.Øû¾œõtBÅGW¯åÏy»Æ{Þ tÇãl‹»ª3  åy‚öåÛÎ7µû:„ÚÍr’ÂѰHZª·žöLø:#ÎÖI78('Œ`ãí\­ W³:N7î>½³Ó^l•­AâÅ&0F•ñú7önìë)ß{ ú@wy÷[µ}ÏÓÈ~Û~àJg}gS¡=ƒI“!4PÇ$$IJïVÿP☭üåtQ`1/ðq‘c¾*ôi¹÷’É1kñÍ™½WL®Ù ÿšóã©LÕ„,þkežÅÇL¥oºÌû§ ¯RÆ&b¤ˆ',Jý‡Vÿ”±ñ3‹ÿVEðbÑë—ÌŽ«yŽy³ÿóÒææÔb†Ó(ÎôZ͵T˜ª“¸¯:LþêDƒJJr%E±ß|pá¿xøð!häÉH‘ïjä_ßröåÅ¥¼”F œ¢âu]å²hî”U÷â5’ÝæQ–FëNÌIre›7¤F7«G,Šó•üd}jSsƒ&2kΉšSUú‰íD¥*Zšµ$Gm)‘zÃØk†6K¼>ND­£9Zž€ó-%h¸#š<ýöV¡ùDýÝÖ¦Hdû±]ÂÈžçiÄs<ì:ÕÙpl׎‘6ÏpXgJGQ‰\Ï8›‘¢=èåú5ƒ~æ°Gs,¨VK#š¡`âÑ 8A=èSö* a»(G«"Yi‚$†+svæÛä#;•ÃÍŠwÜ܉†ý>Ö¸# ôßì×ùS“ùð¿¡ZCò乯ÜÈ!H8 $$PPpE®Ož v " ë"‡œ ‡€ºÛ™þÒîÎì´;Ь‹«Õ­­k×¥Û{j;Ö£ÛoÌÌþàèŽT~ñ™Ï|çûL’o>Ï<Éó~}ÁJ Ò(TÒA=êQµ€‘惼dÂp™ƒ-ñÓñÕD+xô.D;ì>yÕ>Áå3ƒ\Êh+hv·ª¥ä,`8M°¨‘͈9Œ]‘¬)Š;Ö¤y_Érÿ(Ï]S‚‰þ>›³&/ØðØ}[/¬¿2…¿SäÞReß—mÿ›D¿¦(\ÑþL½Ã„‘Qމ0 §HšãF]Öiû‘ÜÝ—ùîŦöÙ¦c îä ƒ¬„X·”w‡æÝÁK-=ñS¾ëtc« "PO%eK­‘ËHU3õ}8D‡³e„"b‹ 9BÖYÇù€™÷=ñ®“µ¾IÔ%¾{ɼàïjÛßÈ$ 5I.hL+ÐØ‹íÝ5án[¤×ÒßWvò„µï„íÅ. ÷Ûúû€I~i+?VU•‚kãO3G!ˆÀ`œ‚õN/ù•É{«ôÈbÈÇOŒÎO˼·MÞ߸VAbZø çÇsuÍàº^äúÌ &Ž›eÞeƒk$ÝFB"CP±ðd~åWæ#7Џ«EŽ›ת…ûÄÊß)ö.¹ÏŠx^“$v<`k¶Qý_14ãÝ,tÝ4û?68iìq!лN£ý÷ƒæ a‡ÜqÒúﺶu;ä&=Œ¢„‰ Lh²@hŒÊ¼+-¸«öȹ/ÉúR}O£ÿ‹$û•½á±û¶^Xß(òþ)ÛñIÎ×Rý×ÒÂÉÎ •¢C Í, „rŒFqŠ%$nCÕgð'¾pÈ%.tÑs|³a‘ ‚Ó%׺¥ü9>–]pu^ä»Î{wïqH7A J˜T³|çÈ–tT‚a‹¡Z×Xýát©¼J’$ø‚D}aÙEøRݱ„FÀ\p@­£L–<‘ù¦ö)oG–\‰Á" ƒ–„0¼;¥º«:®ì ›#§ÊOôWœ:QÑû2ôíî •{J{ú­§z¬½á]a¿ÙgÖ”Òb08 )$ Ñ.©v&w÷ªÉwÝÒzÍÏ÷«…ö›Fþ–Ñs½Ð¹áüx®nïŒ+÷³ë·&þÃâf­`…EÚ-P$ÇöAÞå2ïj Þyg÷ËRîN‘÷ŠÁ½bk= Ì”Ó$ƒ RµQý_5sŸ—x®î°ß(iéÍ(!M“ÀÀ<çþ6®€8BxôäÉÓHâ{?~œ˜ %Lrïîš Y ¶±IÒMyÓÓfªÞ@:§œ³)gm©‹•ºXå&å„Ã’±á«ÓÏWÊJ²ö¨:+ä4­0$ÚpN¼fm]¨Ò^ÚÍÎWhçöè‡÷Êö¦m–}¥r!É0¡h„“TÁ~Kc¬Ó5vôàb¨a®³)ÚáœìpO\S@‘¦ØK5⊅ÆÛ]s] 3†hÀ ››voÆ’@܃Á‘TßÇ Ù•.ÝÈúP$^§9É„Ÿ™ðiÎúÓýÊ·dIJ^{´­5fœiM›xrS­ÙãÇd;ŸAQCP ±¸Frâ]§fÈŸ>àÓÔ[ÑŠÜ”SnM¸ ߦÛ ’J9R_v¼E5êO>Û¢äEC¯¬z4þÕ°WvÆ šL>ãkÂ1_ò©&©¯QËd›Q5̲I¨Bª—I.+õ÷T†ûRýŸÙ¬?)s~¯ÉþR–µá±û¶^Xgõ`²¾aò×ä% ò#͈Q)Æ0Ià$,B‹déïÕxÜÚ à1×ðC †o×¼'4ëìlXrw]°Ö+årŸá¬?PçoÈ·Üi=jÙ7ʵ™’³`‰ÅŠmÓÎö÷=áš‚‰ …P*«ì¬uÎ8ÚÊ…fÀj‰1A‘„LÖ­øðŒ'´/Ç€ “†À„bZ@lWmï*¯èî±…OXûzmý‘²Þ°µ§¯ò¥i3íßÓ×_u2lŠDJ{ã©<0Ûš l6#¢„RÀÀ8žx $phsÏ—4¬š[¾ØÁÝ2z¯™=¿68>7qÎç«Èµlt-›Ëî ·T\‡bB”B` {= k Ä.ËŠæÕ|TƯ”µ¬ù»ÙÜíÏÇ>“ (ÃB»,{Ãú·xo»?5p¿0rFƒ(ÁÐà.ôóÿûäéÇ¿Éã§OŸ<#Á›9ž>;¾“IbòŸo6×Ö³‹‘ „oÚ~Ø ž­RO[ÿßé¬[,UÏÛRf*5SâR–DqšŒI«™«K›Ü¥›¯ÖOPšÒ)CD*#7œ¯«‘ikÊ\Uf´Vë/B’1)p[LÑŒ±°8§4wo¿—‹†€=öÏvÔEÛšcÇt'ítÇ‚ÎhÀNçB/ÓHãl¨i2`o³O¶;f‚ŽÉo츼8ÜWÑÿدÓç&î3à¯ûª“àCÖÞ§V+Y·mlã c#_B’-aLGmŒîÃPð¥Ãò&Sð…/À–…/`&äèôE’¤™¡…ÉA’–4oÚ) ÐGvÓiÚð"­Mg¢ùŽfgG»û]Íìïù,† (.É ƒNáÔaÕd@9êÙ,&:ø1/F¼fÄ¡Ïyá›?„˜ô+†œšé£ä˜W?þо«EV` ¥N’JŠKG¥”\–Ýy@1TŒÔ- EÁNÚ\FçÈP’“`‚ýÈÀòÁFáŒàÆ}Âĺ©¾cOq2)%íh@7}D5ÙžTÓ˜—œ ð3~ùˆKiªKèL„ÅH‰œ}űô´†êãtk²ò‡ã=±ä¾ð·ÚÊ”Ýò­YS”~¤ªý…XÑŠóLVš“Ò$…c‹bù˜Ì_V¿â‰®úc³mÇ—‚‘ËþP`¸ìïƒY¿êƒF6†þ¦dékB⇻⮞¸§ä“ð„"ÍNPÂP9BöOϵÀÀ|[§©¤"g+õ¸0Ô€ýPìª#´q†¿ g"«¾è¦öì ¿ì³0ŽN®´4ÆiQ­ËØrzÏptWdÐ:° ô[ÂæHÌ6ð< 4öG­QÐ˰}¸× èeØöj¸¶oØÚß·;r`û<:Gh Cá4! ¨“clŸ¾ê—už[æ Päzõá5‹/õüøfÞ©õÜ©ñ½[ëzÏì»]éXØÖhÄ8Í–,Œ"qšÚB¢˜À0&Gp#§îÔU_3;ߨö|PÛ1Q¼nSBd¡ 6UöRªú¿µÓ±ftÝ5•ûAB%‰$O£ÿë_?û&=ž¬ƒäû¡ÈÓ¯Ùó䟮Ûzöçkñe“IŠâ±’–%vçÄíÿë鬸´S»²;÷BãÖø^¥»HI`t&Jሼ„U-'ªÙRÅK¥Î4!¯ËI9'þË(­êPWA2xšˆÑ<ÆãY ‡Éa·éì݇\Ó'Ü3ÎùðAPÇ…>ÿL¯{ªËs!â¾iînÌG[fºŸ§‘ýs½®¹¨gºÛ>Ô6ÝéŠ÷9¦Â†Ñ<'—’RÉdqÖRšsþgÔ˜S5²iÑŽegÝêsíIŠŒz¹Ùvn§ hN{sÇSاnú˜º§)ÔÂÍR K1‰â2Ž—wîgg: g‚ŠŸ{Q–†’Ò¨W NŠs Kæ«‹{Û 3G…õÎü9¿l2 õ}מy§½ê©jÒÇžuiƪ /¹1PN´+¦Úá7¤Ïš¦ã‰´ -Â0””Hg½XO"Kò¼„ŠGlå粪”Ýò­¹'VÅhe.–¯®F)¤$à…×jsO Ì#½¡D ²àî½âéYut^rõÂL¿ì _v†®¸ÂWÜô gϦMywhŕ̆–½p•«m½Ë‡{šó+IœÈÄQ“¦p¥µëuoìô~?¼‹i’H«?ÚxhÁÑ,æ ÃQpø¢«wãœP;áèÞ¬ž³­Ç·³jAâR)C2&X¶Z‡v÷Dë¢'NÕõ›ûêûûm1{?äyŸ <ÌÑXC¬¯>t²‹>‹²…²ÅòG|É#¶ø÷\ñ'ò’ûªÒß©K?K>—•¤|LÿŸæex(ßö {û}¡ü!WþvûgBчŠm÷U;ˆÅŸÉò¿å> ¨*~¥¬X$ ŒB F<Ë14—œæ¦ÍšÚ «žèåÖîå¶îq_—1¯(|ÐØXu$UsÉ^u8C¯ùb«îpÜճ⋂|¾ð¢/² ~pö,xCq_vÖè ¡&Šã¹„쨥9hß§¤8RÆ©%$œç5gd±µsÉMxBpàfõtA¥9OÏb ˜¹êŽ@O¸D]N9 S“BàÉ$2lI´!3 1˜£ &0Gc‡$MB8ûlò醧d³Í `BlcHHÛm{SUjoVÕj³I³›m÷ Ý@P¢ÞôjW­Ôw6UïzQÉÍèÕèóÈžy=¿ç[K[šókâ™A;€ËúiÓ˜ƒ¨2ˆ&S㤣Á™ˆüyÑ·*7úÄ1õf#}Ñ’³äNSÖf3Ÿl† ß/èï9aŸ}§Á¼â<œtg­‹× V›Œ«ãÝf>QgØpÜ>ÍŸ-@Õ°’I ¡À@˸$ÖVWuÏì0P$”˜ô­ŒvßúF`.xFr*òàOeHaÆû‰†Î½pŽ™÷jcaõ´O˜ € tóa1”Óñb͇@º™€êºo«FB-YOލÄj4w€@øX\a˜òã1_áÕ]g#e( ›ÑII%Nå^ìT/F1?3ç‡ 7Bœø)õ¬?]}Bà‹CÁMàÆ…¾Ü‰Þ¼à Þ(Ð,Í"$/%Y„`0Y…g™dñW¦ê휪ï4Å_ñ¹_ë v¶WLþsUÉ3Á¶£/ÛÑ”=g­»tÉcÝU•î{¬¿¡µ§µíjJyÛBé¶ÖþLk¡¶îqE»êâm¾hG(|Å[Ÿ©ì¿áŠÏP.;ù_­ä(ª<$o-ªœöœOô§+ÍAè¿MÆüƒÁ¨cF)5ÕÞ·Ov þ24!Š%piÑs¡¯¦µšË¦%ˆg²0¥+¯ìzGÿVxâWÞÑ»£)_Ôm±‹yE+”Ðã +Ãá‘G3¤' +€[ÝÃ÷cp9‘1½ÃéêË?šô ‹Èéºç‰Â™S}ãG[5r%Ǥˆ”ÀI¡óVvEëG~Þ2•.Œ6ŽM6L€F®8®\izoÂ5öNã@OUGžºX‰ðˆCiX›Éȃo•f*|ëŸÊ:EoÔøVx?«<<ø¸ÚóiEïcxY ðQåRéƒ1PäQÕþi¤&W2ý±Ö?_ì>ÅdggŠ“4™É†1ɲÌá 4~äÔŸkƒûÕç£c^¸u)ûi%Påh¶ ¿P ýÿËíûÄýïÿð;–¤RŒ¢0I!j¾ÕaªO5K´«õ9 '”~¥Þð#KÒ“æ)§iÝiŠ7ñ:]ÊeÙ8k¹æRõkuœœÈ h !$Ý‚nÞ‘½^o[>¦M6˜o;³fê-g”ñ:uÜ¡[mÊNœÜ/äÝre/» I·>åÒÑ;õ9+õ–8éhV¼ˆ’·tJˆ”c¹´Bü·ÉÕ”B!GX—b™Æ ˹÷ú»–¢m …;—^SpÈ¿¤I#í‰ñö«oójZ “Ÿ\Æ ˜ª,O?ãcnù?·áBºk^ÓtPKH¸þ¼¹þœéi>’3Þ­¯+“S˜”@GQÎU/?íÓÞ*§zM7û…kíòÙTFÀÇ °—©h‡õ[cëÔ.öÑ‹!aÆoº<€O€:éê`£ŸçÂì ?>ç¥D˜™¯‡ø¥ òt5Åq$B”Ã9ÄR2%õÖyŒ{ˆþ.ßåm_ó–§Bþ ¾à‰Ñú]É·¼í¹ÊöRUþJ}d?²ÃÛ÷=ÖßÐÚåìOU¥ß¨J¾S?S—ö¶Õ¶o5öoÀ!ûS¡rËoQ0zè ? ChD)Ak³ ¯´ãÁèz÷EðCºÒ<ˆnv ®t¾ ÀÀ•´T*ÕJ­œúà\ä~dr«sh³gøVx¤¡Ð®U°Œ uÈYŠT(.H‰¶’c+¾¡û¾Ñ»Ñ±Ö=JË¥2«”£(tÎ(è£ËL×À½àX²ãgÕ;´½›¾þ“þ¨xBotËÝò^ÚˆŒ¿ëj/du„,ƒ†[‡*8‰êDQkÔ9uDÓE‘×o5r¹æ½Ëµ—/7NŽ·Œ_rGš£'­gs•føÕPVžIË$˜Œ"™< z­Àñ &ð¸Â÷ Òóè¨ÿaµï“Zÿ'UHÿÏ+¼_Ø=P"Hªýú÷+å?>ÒùY•çË ÿ—å¾'ÕÁj ÛÉICEŒÒ!$+G‡H=Né>ª ¢ö«ÏOË»>w„;93hÒ•"±±ì·:þÛöº±ïÿùC‰Ñ,0* K‹¶«n>Ñ $Á úxcÎZ3”f¥N›J›F4I'쳓Múd¯Õn¸Ì©Ÿš—ÜÂZ›!Þ&Üv­† ·f½Á´ÑÌ/ËšjQ:u‡,™ÚwÊrÖ܇M eúúù_+ÑeXqª7[øÍFݚôâÐÇëØd­n£‰_mÎ~¿YY¡Á C*0g(F‰‘¸\®ÉÑÿYgmâäò`Ûò``uòš"€ Èë±x0Mi»5ØŸhì;C!™˜帄BUÇ+ØYŸ>3p‹aÍ͈H‚)Ÿ°NWÊC¬gÅúà´Ü\À´4=Ö%«/Šh>ðgC|,Ä/„Ê…`Ö\D8S³7j9‰Ð”V"®A&båé²¢ðfÍuŸy®>ÈÆ‚†)Ú42ÔÍ…@# & c~zÞ·E3ënG´§–*šU㙉¢*’ 09JeÐØ$e|¨°¾bì/ÙÒgÊ¢UñŽÆöTWúTkÛV—@€îðV'ûëohý•ïÞKméß„âWlþž²pO°¿ÐTî°åqM¾CÅà„Çqg!ÂÐ'Å‹8½¿Æ}'8’‚üíúmäʽ®¡t¥ùŠçâ/‚ã©ðX‹ÅNÉ1¸4-+7äNw¾ýapb¹ý|{E¸BŠ"Ô0C† (ŽÃ@¯àNU.†6z‡SÁÑóŽSFƒdÊ€Ü*„<¢3O‹Ü퟼绔ì9¬‡Fᢠ‡´õïºÛìºß3r?0ò±i² #™ÇUR®Rõ/êëô¹‰óŽøÐi‚YÇ®V»:V«•,Y>1 &¶%Ù’­ÓG >dÝ2—qldK²d›Ë€|_Ø–|à“LÞ´}ÑM ”r$`¦d€&¥iè4™ÉL›©ú[ò¶}§5;ßyf%ËÏó›ç÷yôAÛ@Ä:8l ["éÒHÄ>ÈhÄ2tÊ|2b4GCæpÌ4|ºi¤»Æo‘Wç#R”‹æ`H–Ã8—[#¤¦Êmë›5ž•mwë¼7Ì0 ÈLÂÄà|¦ÏL‹gRç¼]ÛySßb6ëüj½ŸV9ïÕuMmkl& %>'{K¬Âº©s?Ö82Uç}ƒ÷7ÚÖb.†çprQD&$¿~öÕw/È0;þÇõ"•zùËS?Æz‚|ì¸l!’+i,.ZÛ)O4€`†%{Ñ’]¾l–®ZÒÕÍ¥ ;½lU.Û ’6åš]–´P‹fù²µä’Y¾fÍOZ4—lê¹2±«à\‹¬A-A8.›ËÏÁíù¥³Íôº¹0Y¯™®Í”FdkM`3ÅŠE¾h tÊU³òj“tîm’î-Ëgç",† Yˆð²Å”D»Ïæ™¶-„Îôv%£sïµÏ÷€@ îÅ0Œí3} ‘ÎùþÎ4Qâ^í_8Ù¶)5jhVžˆËÉA¸>&9ÜR4Ö½X|Á¥˜Pã>¦‘Ρ/xÔÜΤK:{X~ÆYtÚ EgŠéàP’vìÜpœ”𘠜 ˆ’À^¡q;[ŒKòP–šTõÀlP°dÜ+œð*Ï{ÓVçk€)â¾ü1?= ')L”c^ò¼‹÷ɦŽõ´ªµ;„ð >GÄ&Dl‡ÇËA²5|dPÿNRõ”®ÿ±ýkqÅ_ÉŠ¿‰5ß·}+yë­y¨Øšñ¶þ3ÍwRÝRÍCªô Yú\¼íﲪ{²‹[øxy.:áãRŒ…á,^¾„ôUÙ§;{V½¡5ÇÉ+®Ðegÿª«?á ¦«›¯{BËîàRgXbwáÛ$ËaçñæM¨¦‹æœ½ñöc4c b6J!ÌÛ+d#pa¾Ëe«8xOãµö>`ÒjGßŶ£nëîµ¶¡½n(SsGÜCÙ° Ül8ÒVÿ’'˜ìŠ&}¢ÙŒÌ_§Ž(âÚÝLU” ø$/s„"â¡h6/«ÃnP7e•dÚ¯Hí_Ä—.-{.)ÿ§ ,ãmýgš/¥ í¾%+¿k7…Kdñ^1!AÁ!P å Ácc ‚l­6.¸ŽAÿ¨kø*8¤ãä5Oäòk<$á´i¤3¸ÚÙðE>r„ §›ò·JE\"\ÒXZÙQ×öà²ØE¸´­Ò<ëê…Õw•òI>z¬˜•“[,U\íŠ%tè èa–»ÂPù¯@Ô†k éèƒ%VœŒÞ÷EÀ'éª?éî_uᱬôÖ露xŒ< ŽŸ\ŠC¶U8Ûrz¨n$f:5hŠ˜ÂiÓˆuDMÑhýPÌ4Ž"ü÷7®@¯ñï—™vÇ¿¾*½J¥þõêE*e¨«çgçÁù^TªGS¾Ð¢H6K6`ƒzÙ `­˜ÓÖЗ!Mê•F$¯C/™è„™J6•_ÚSÔ­#ôT®”½ÍEøÁÃQŒÀÙ8. d åš±=É&Á’ØÈ E % {þB½*a-¼Ü¢œi¤Oè%:ÂÉ"ò !.Šrxb +Ûªnö¿Û™ˆîO†‹¡Àü€s¢§c¶×±<Ð6×ë™þ¤Œ€¸iŸéƒ¤K#‡fûÚ&OøV£­s½»C.Å ÌfÎÊÉjËŠCí…“GÈ n2î‘Mø¡5§«Ë+ã~˜Y9^p+gRSX%Ì_0êÆÝÐåU]ÊàÁ_Ê2 ç³ò²P.›áÞÆü™cÄ9gñ¹€z¦›Ž9ÀØ„›÷€jàß4P$Smšê”^ôÀl0-=î—ûÁN0%B ÞU•g¾õëç½w.juܽFç^¥üçMîûMî{:÷Ýæ\3·Z]À’[í®ûÍý7;·m›|¿jvþÜ2p³»ÕâØ«>G¥0 ‡??‰XꨕûúÕÈîñj§½—ú³‚•çÑ/¦øÊS‡Ê—»TY£vŬX³À dµí¿òe3VLZ¨,d0‚%1R,Ø'©cØãõ%YSÅŒ‘2°|Áwi‚BÞ”6Ì÷¨×:óµ®lµ]žígMÅë]åëoiV,êeSYÖZ¼nRn˜ÔYKiÆôƒŒ±lͨ\׫®ʳï–MYØ÷kx*Øbd8`ã1¨á4¿îVÇÙñ¾ÅÀÑ 'œ«AûÂè·‚!=â[ »VC}K£}™±þ%0÷è_ë[8bq]z—bötÀ½µÍ‡Ý™Dïù`ÿRø(¼,í[·-ÁüΕÀ{çFúG{/ŒÚ—ö…qpˆs)л<êΜçÇú.ø›©#gG+5òÑ‚&aC‡d × ÉËNyÊÎ °³.ɬ !ÙµDÚ é§šöä+ýeça õüPÙ)Öú‚ðe”°€D”ej¸Î¤=šÙÉ4W67gez@¶ð£Òá#ìa=Y£¥ö—›šöö0gìÜ rÖ 2)Mv9S¹a p cw çâ¹|õ¯N²³Å“äCÝX½þÙeQ(BËPt×ÜP¶%®yÁÖ>fk³UÏå5OeU¥_*+³µO¥µ_‰kÿ ‚ª—=—U?‘WÿNÙðHÞ°Å69Ž!(°ˤ½UÚõêåöÒ ‹|Õ¸“ÚyKÿo+E¶›i1Eÿd¾NŸÚ8Ï€ÿ ­cб«ÝÕ®V»º„PÂic@€Ä)ØÈ¶@èC $ßGb‡qâ|è÷N?$ž&©›4›æª/llwò©u;N™·“O¿(q5ÏhÞ•vÞ}ö•öy~ï.’Á…õêÜ “>~PiËMÖ+7Ìúsíƒäìd»•¾jIÊ”©ëê×ͺUH£2fÊ[iÍ]mS¤šÀ!’Ec~Ò¬_o“§äËõ3]â€,¾_Õ[µ»Ûþ‚A1¹PLbB”Ï£Ákõ%Çý®þH¨;èŽÙA@…=æ{‘F‰ÀáËýÖùAçrÐ:?ÔõÙcG#CÝɱ®ÅQolüð˜Óp¬E[]˜Sœ›_Q(+PêjŠj:-ãûŒß Z—üÇ㣳žÕ ÛrÀ™ uÎ ÚãA ˜ÄšðwE~厺"¾CsîÔô±‰>M¹–æñÅÅ"¾‚Õ•\î^²çÌy•3½;Ý0!½ädª›§m6˜ñªÞñÊì-|FˆíÚ-ÅVLk‚Ç™H/;ãZ€"r#oI§»°êŠïf„°ñ… D$ÆG³‹ÕŠºó½À Ñ9›ü‚3÷¢'à4ëz.@ò™J> › .˜’¤?³}ú ^õ›‰ö AÉ”rp5BÉÁË"¹¯È0~‘=)ÓüA^óXl¸/Þû­¬Èñ)úVRôµ´è+YÑײÒod¥·Ò½ü>S~›-€Þ}OV¼%/¸+-ºËÞa ^:?~ß±%·ØÐÈ–¤l[ºç‘´ì1»çSºMí_mI*À`pÂw¢Â;â’mIù6[ ±Åß~vï°÷$%éâ[âÒÇ¢ÊÇtõo™²"å«_ ä "öD$IRÛ:2‹_H+\†öY×H´{h£b£7 l°áˬF }_õ†9©®‘«®ñkÞ 0b]CëÞ((瀅âÿZ8lq+ 1Ljq’ÎFÏÛ*à«Vÿ¯] ç¨1¯˜B0 ÅÁÿÆÎO2ê¼çLS ÆÀ†LåŸžÐæ‡e$Wl>|’ö‰wÔYÕª0éÚŽpa÷”ƒH,@‘1 üxîL'Cõ¡ÓæS† À>9Óz.lO·© †›¦ÂÍã¡é–©pCødóÉLi$Ô†™A>  !Óð¡Òƒ¬žà`$F¨8˜”ËçXÔì»^íüSã‰/Ëí7}Ô;>Ú×ó—èÈÎj{>¯r¼tüÌñÇïõZÇ}öÏ«íŸÔöü¾Úþi­û¢¶Þëj ÿzòOèòOž[r_\¼-*z$«„ÃoÄEib)+¶÷¥å%å_*óï) ¿—”|O—>`öüUZù•¬ò¦´ü]F¨+ƒ•Â_A0Ž˜Šy•–‰rù4W°O©h>¼hÙpoØFSž±U÷` Ýj5Gn5ò®;Þ€i ;­.ú¾;ünßd¢kÚúû½“Ðî¡×N–>H&xÄ!Ã(Š(üìT±,÷¢}p³'pÍŠ<ÑÔ!G„B¾€æc:‚µ$ÝióÀ$€˜?ÙãO¹2D‘g9ozBÀ§L±é û^?ªÅ” ˆ^HýRЮoñ™ýaÓÄ?þ›pxªíd°.ßž6Ÿ–œm;ïÛ;zªùLØ85aš5BL†[¦CÍSc¡ ót¦42e:yÒxúTÃÙS¦s§ÛÎ…Íaw­gÁ~ Źå‘PHC¸FR5_tèãjLJǧ5®Ïj]¿©éú°¶ç‹†Þß5¸^:~æø¢Ú ëp½¦ç³:çͽ= ²?ú›(ÔLA®&SÐßÿÏ)òôéÓAÚ$íßÿÑPW/@ ô‹A¶j°J³Ü¬X7)â òdknâŸZ#ôz£f£]®×nš•Ñ:YÊ$½fÖ$[óWk]9"àã,ÊR8.±è%­™º.•j–¯¶ä¥Z€"š£*eT¯š´kMŠhf­U¼j’lî×]z]jÔ´@ JP’á,.à¦–ÔØßpÎùísÖT¸#6j‰ù»—‚]QŸmi´g9`]y‘Fl‹Ãp(Â2? ñÄ'í³6_wŽV™d!îTˆ ðüÁŸ ö‰EøkI¤ð aã U̯Õ9tÆB¶Xd] 8R¡g v.ØãAç¢ßu&Âð­eÞ÷æêézïA–& øÃÃÍZõê¿™¯óç&Î3àÿBg°u¬vµ·vµZÆ66>å36øec›p6²NK>BoÉòŒß–ñi;ù¹3™¶3Mˤ)dJÁ`âƒðc‡!ô‘ÍtÚLøM‰»óÌÎήfßG+½ûý¼šQ'3îÔþ‡ !Ÿi,¾ Õ•èDù®FâB ü¸K5çÓM7ðÞJü AºoŠÈ…IEg…iÐAO¹¹I·±,•É”J%/Ç%E'™Œ'JÇòP5 ‹P2FŽÚm5.žç§êãÆw42íúo~€F ¢Õù›šò “>äÑLû`\p´ Ç䌋Ÿ­7L¸5GåÙû%4h7`Œ(åÕRšQÆ2±‚2æ$Añ‰ÿ`ÒïsæGšÜ'PB$øW*ˆéô§ê¬Çš¬¢ùžÖüPÌy"ä|­ÊyÎäì9?~T`ŒmÁüX“ùHÌ|¤5Cmi³žŠY´)PÅ”MõÁG| Ô¦¶)d<Ô¼§=øO!mK•½ÅæÂe÷ÐF ü¸ˆþÆ(Žb$A1 ƒ‘´åd¸QÉVg Ô6¬5÷~Xßsí\û†­ã–+°êêZqv‚C®»ý»á rˆV”CÝpt9àþ»m¸ý7aÐ3-ë¶v¸ 'ëZá< ¼qó\Ä*Ð@‹õ%…ÉÉIbŸ,QoòV6[ß+OÉÑRª‰.iæXnѺ7ò"=Û;a ¨~¢×?t~Ó×»bkƒ;ï6|­18pÔžÄë`6ÉHe JAjs:-­ÁâàÛT°ô î·ôGÊG.Z/^¬î*ñ÷•ˇ*†úJzŠûz­½ý]–@´4·*¶Œôì;<Ð_6Øwd PtYêͺ¥ã±ÈÒLI¢«Qò¸1y#ïôí"ß§‘üõÝ=ìýcAÝ_òí{΃_Z#¹®¿yþTä¼]ìºg¶Ã£¸™}Z‹¯~ñü{ÈzHùW¯_ÿëå˽UÇÛ¶]¼zõê%tøêÉÚÊ*¡ÄYL…£r!Opõ˜q¥Ô¸V¦Y³šÂÕ?·F k• Ëe¦pQ²%9\±ÿÚ ýôÁJÄ11X Lvu,ÅĈϼTÅ­—Dk\aã(p˰\ ¯•ë¥ÂÕÝR±nµØtóøþ+Õq§3YÀär,Ûìb¤1Z‘qìpÍX˹ŎS Íu«NεÖ] 8Âû\{¤:À$põmqÎ\p.t‚΄»\«ý¶ñ¶ìãÅRNA+”ï¯]è<;× ²ÍµÙVý5ómÐ h$ÒI¸»öªLr.(8^¬& ¥D*P¬S¨ªrã'|šP=;å¡B.HXID#!/rG+Í#<Ø¡‚i>ã3LzµÍǼ„ÄØŠlý%W䳉Þç`­‰£¢œáð.ÇãÞ·FëÅé&í¨9 3*h˜eh^"ð†œö¨¯xuã.ÝO©)º&E<Ú1·qÂ?Ù2ŒºÅú²M¼ì¼ W¼¼ÿ,U•/Ó«I%‹âŒ‚f0š†iE Ž!ð.Õàû*zLuàSUö3&ÈñP“ñ7cê&Ÿ¹Å›·…ìmMÎS1gSk~ fÜÓ÷œ?.>í©ü€ÚÒ˜TÐö—꬇\ü¶ü=Ÿö‚M}Φ+doisîk2·ùÂûÜ;«ÒÏSb ö˜L/CcHŒÄ ^©”*#&É7%PX5ëh]r¶¯Ú;®Û:>rtßr÷ܨï‰d««jÃ'E à`cG&Q)`Ïoú×ì@Ž5ww¸®íº·8öv÷œpœ4>ŸZ[P~¹¦ 8ñ±=ð»ÿwΞw—§ò=FŽéh¦dd6)p˜ÂJ…eY§ŠâÓ¦›ý×êk;=H6]o¾Eô@n¹áò/ŸkË]²509*Cå´ÈIåH2—ôAiÓEkÿPñP¿uà'U<ÒßVØ>R92lê/îí*îöWÇ]“ÝÁ’®¾¢ÀhùðHÙp_Qp ¬¯¯¬7Z ZƒAko¯¥o·vÎôö@U Wö»2Îê)¬Ãx‚D%1RZAÆJõ$u>>ÿ÷æšÛy®Ïò÷òÝŸì=~ẓçºsÈó‡"ÇŸ‹w³í ÏÒ¥”YЦ†FHvHùHÖïÔÿç¶«‘7{pÓ¯¿yöµA§§"€¢dqƒå‰á#qâª%.\ùók¤:}¡"y¹Ì°\ž<^%֤˓œ•Š2NKè• Iâò¬Ö‘›±t\¿^µqÃGö/–'^µšÖ­ü†Eõa…þú»‰+'«“sÅ$N¡T(I†R’@ŽÄ05&WvÚêî¹6×Ü×jÇ©¥&÷²¿n¾½öJ‹}¦Õ1ߨ™kµ-u¾]#mð±³síu‹š± Õ…£Ä ‚8I`DvFVOWà‹;w_ï˜þQw>ÿûâì|jB‰`AJÁ±JƧèÃ-X(ÜU;ßæ\ê°-G‹PÐI]¸Ë¾â?=Ûâ\è>1Û–t8ƒ‘!†¨(F£Ú³¥¦±zÃl9å@ø‚FôS>.ä‰Všë¦ÔS‘͸›w MûçÏÇ:®ÊÄP#@ˆž÷3îd!#‘ã< oxŽfá­Èg,Yì„G¿ðk…½4r^‚¢:U\ Ÿ«WÍù@¦ÐÎS>¨ÈÍŽ|v÷Q)nÒ Ø€ûCÿü¨C=yJâ”×0áÖ„Üì¬G5ãÑÅ…šLSMºÉMó»ì¡ThžAà×ÄX­d4û ªPÈ*9)¡ˆØ \î#Ù ÕÏÄÜmun„"${úW\Ê3îàw\ò >eïùñ¿õX@Jÿ’O{¦Êø†Îü–1Çæ3¶E°GÖS6kS÷…öOÔæ[DbÅ™•J "aé¿™¯Ó˜6ï;à¯÷fë´€ç~?¾±MC8BCB 0ØCB’fËÁåã±ÍÑ€ïsÂB¸Ì’tj¥iï¦iÚ¦JÙÒeiºuZ¶t‡º*{1©åš÷{ju/ºF“&7Ìþ鯇Gèù_~žïça1Òn%#!¾Á b¡¨@ªr3Þ:çZ±õ$\î»Vÿ}[à-‹ÿ^«w£ÍËç¬Ã¿àð R‚ó©@OWšƒ1 kmÀÏ¢Õ3Ïy—.GúÏ;ió¤"h!"ùö Bë¬<¹èðÝmr¯s«Ž[Š«%4C J¥ ÃP¡¦XyZÌh:ªN?¨æß‚âåcó¥X’Æñ¯:°>@˜ÂFWô†õ*(H*ÀhŠ!( Þ¡”ˆ’«´Aè÷Õô ú_¤‚9:pêz¸2­ ÅŒ€ÀÍ«SÉ$Þ}ת'Òà„xK{GÌÃqC,j§M#æPÀä÷ÁÚP¤.Ššc‘Êx¨*2rr dì©Ï7)¥:°½Jˆ M`8 ¿Fª[+:ó¸Êõ°ÜþÛrÇžóà%ׯÊlï—ÙVayPa{¿Òõ“2‹–a"°J|ú‡T܃C>ÝÜü¿ÕHò ŠÀgw{4”bPþÕÃD²Æ‚Â…³šõ:ÝbM΢éëÖHÖj³¤WÜ©ÍГ¹†fŠJDKÊILümö¼Q§î3¯7k§õùwÒ7ž…úܯí’A±bÈ^m|mêì‘X½¶H%T!´ž™„”Ð Éàj[u廎±žk3aî¶§iÎ}~¾»mÞÛ>ëo¾Ö2}Køl‹`¨À±n™v¿H# … SW;ר·¨î¸ˆ£B¡£P’Tk´ãcüŽðœý»°G»Û›ŸÁŸëëëR #HJ$ävd¿m¨Û~;=:—B­·»áÀ2µÌy mžé†²/ù¹[îK«¡7†ÞT+¢å"ð àGI ¥àH$E*TP…¡J6-+ø¹²ô™¢ pòTqø‰²pÏùñ¥z–Uô‘¢è/ÒC ‘¿*JŸ©^ÿMVé#Més©þwÒ?’•L²6F}Œ å˜@„b»É? Qx® "Ãä0ЦbýÔ¹HRˆþ$µïíÏj«{Ãâ»oÞ³@×kßÎ PaÃæ‡‚ßp¡]±z—-ž´¥¹ÍݽŅ ÷%›wåj¬çts>!—â`p¯!ηû:Jf1Ÿ…!­´-=ïpáÅÖÞ†×^—Âã‡''¦ $MúúĕȲçÍÛ®(´pqž Ð L'ÕÝç,I×øášà¨;müŠÍØÝçŽVáߤÖÞ8˜LüBɹ`m`Ðt=R‹š£cô+UЫ÷GëkGÌCþo¼%ö÷Ÿ'w’ÉÏ’Ÿ|ð·a׈Çä9s#PŠâQÃW_äª_æh_C´Ac(lˆðç‡Â¦x¬"r½¦¯ÏvUq¹åR!#Á(‚¢ù õšë5-Oê.ÿôDÛžóà%×ãrû{Ç­*-¿.³=Ö·‡ €aÈ*Š ëLµ"ÛÛÛÉT’Ànmí¡7þëgww’ngk;¥‘÷~ùhÏ q1Ë <þ¼|¹&gAŸ³üµkäÕCþ|µfÍ”?ÿ†ð £’J±Å V„HOÔŽ™÷/4XlÈZ3«×MÙ‹•éêW¶Ú ^®Í^4ê–9+õyãuŠ‹¹ßR“@¡`g ‘Qš¹%К3õÖ™€u!xaÎÓ”ð·-šoûZfƒÍsakÂÛ2ß{qöÚÅywSÂÛ<ën›ñ:ç‚/ÒÈ©…nËjÈ>ÖSÖX‰BR(‚·EFˆVWèŸ~ø{þ§³½ ÙÜÙÜJî~š/noîní$w·þÉÿºžü‰õ{—dB\%BDœI %%º Cov,Ç.L\¶Í{¬3|/à%€ÎØæÜÖÙ^ëœ×9åmZ ›û:,«D œÂ•"ìùR PA5Áçiö¯Ù8—®4ß?êuu ‹Üñõ¤ .®u2“œ|ÄV8ÞÅL9ò9]a.ù¥SêdÚL¥DP„3:…:ƒÄ$"LDcGÂ6ÀxãÀ„K=ÁQñ&Iª¯ô:$U°Y.¸¬bŒãµ3ÊiFÚ1çþaWöX‡rœŸo’I‡rÌ¡oZÔ7íÙ“œjÒÆÞ²©Æ­ò.³¨:–°Ic(‰#$…³ .¥1‰° ‘ŒEx©Qâèa k"¥×Ùœ Õá=çÇÔ¡?É‹þ,/úHuômÉ5‡–dºaŠ-“À;„€Ãm"„Ý‚rRŠIåb–ŸAƒœA&¹rÕ¥’Š3­ g añlXü÷lÁ5+¤3äi`­Í»â ,;üKœo…ó¯sHð»VÿF›7¥ÈôT‚¯X<@‘»®pºÒœïÝâ[mêË[ i¸~l:F^üj~\£D(JIPBA³¡ó åŽèÚÅîûí‘YÎSSPŒÓ»+Æ*²ò笽÷¬þï[yÀt`÷!6ï.rT5¯†=”“t•ŸÔf@£ —4-@ôyÇ'Ýñê¾xÕ@ÜÜï©õ€FRõ%ÄN z«BqC¼¯:®÷=¸÷nr¾;›ðH‚ïÇÉwF~è« ƒXx$˜ûÓ¥‘Aã@¿±x6„"Æ0œé3öx"¯·6äm¼nžˆŽ˜bWLÙ’\ B3b^i’ Qq>JôdyTéÜs¼äzRÎ=(·>ª°=)±ü⸵B®c3Q¸×h’ºó/êË,¶ãŒã¯}hƒ¶EñZr¹ä’\^uË”eǺHêà)’‰â*©¬ƒ§(’rlH²xˆ"uR–uX2­ƒ²ÒJìF ´@ûP°QÇ­m¨p‘4¶Ž¤¶NQ»Mm«Å4AúF†‘ÁƒÙårvfgæûÿ¾Ä¥gà»ÉìÓçÏÁRž¾lÞø®Å¤©e0qœÃgx5×U‚­Öæ¬è ç4/œF.ÕŠgjr–ÞÈ]¬ÏòÝýͤðꋤKúoÕw…F²¤–.ióâ&¸]TåÄk%+ZABÁ]ª”&ê^›iȵV (JJS™Ma«Cf!Šà\s1•DÆèÏú=®XØ €Å[g»\ þæhgã·#¨qÎk[ìm™õÙc=ö¹€å‚¨P¿Øí˜ñÿÔÕÀ S¸ Fì¡W+?NÑlª¤pñë˯@÷ì¬'Ož„B!ŒÁBH>ÊBª0_ì=mŽë—ƒÇc>sÌ#´]è±Ä|–$ÍÑnë‚ÿ8ÜŒùë6ŸŽR©" ÊßGK;œ- ™¥“í$IÿK 1íF“ð@L&ýŒ˜?æ_Þ+—çOµŸÏ:ð¨K8áW§ÓÈ >ˆtÌÍ=z‹–#âP„Bã¡`4°x¦X2}‚rΑwÖ#s ŽUq”{¬2÷Ü;ؤ“{¡þ›3æáD=ҳάQ'>ÝÆŠ¶I§<¼Q›hæ„äŒæHÌ´#çììhr `ÓžÔÄ_¨à«r;Ž!†×¨yB:›‰Ò騮’…Á/K l›Ž°éL>Ââ" X4Îíàf̱sË>tSòˆ+ßâ–oñJ?å—m¥›ÄÑMâȆ xSxø3~Á6¯ð!;oƒ“³!,\—ÝÞ'ò?ç}Ê-|Ä‘módKdŸ²/ÐÂÂC[ÄÁ-¾lp] Û¯KŽüEtèhù‚‚Ml ž†þ×yÅ÷ðâûÈVØŽJ5žMC0*¤§H2úᜯFŽBÒŠ"»…ÅbñÓè9^qЩ4žipƒ/¯¶ö\2{÷Ê…¿«®Ú‚ñ†ŽZ{¯8‚+-§ÁÁ»(`´ó~“÷WöðKgžÊ&Ñ K+®šðp)? nÒÙ,˜e.ŒXO®:ƒ—Í>èdÞávyå)û•´× KÇ<—[ƒï[“xýì÷jü‹6oÜ\tú…à€[º–ÚWÌÝ?w÷_tøOÕ™13A§¡TJ¥¿B×ä«»´ºpD54¬Žôiƒúþ°n4 îU…úuƒºÁÞêÞ!ý@Ð4P÷õWG&ŒÓ~e°Ûä»võ÷;_|ùlç_; §;k¿¾9ØîQ÷D4#~ýH¯npÈ0Ôõú !¯>Ø« Õ|rþoõêC~­¿¯¶¯¯2|V=æ¯ê‹ôBƒP j&lÂÿ¶…×ô;Uûµ*ׇ@&UÎëò–Û*û¹ùF¥õO•Ž»åÖ;eÖ5Eë­2ërëMµë¥ãÄ÷ÔZ…ýC­ëºÜúg¹{IVw!30DK™L–²‰T2‘§O`<ò^"01r`2HG‘Œy£xY“·¨}Ñ4"YQITÒ¸žŸ0H§uw‘,¬Í޽½W4B,éó—  *bY%Jhù—4â„6¶F’0/¾•ßU‰”â8$‹11ƒ@ xyÂÓþ÷G_˜ FJ:g±!u•T¶Nz›£§- þ–¹.Ëì®Ñ/ÿ´Ì'Õ<ãµÎù-³>¨mó¨ÏvÛÇO£6“±ƒ fZ%Wþm{x#µRåkô|·¤n¦öI|)Ç%S0:¼]$lë išOÒˆcÁg›ï6ÏtÚæ}QoËlÀ1ßÓx¡Ó²8ípÏkš (ÎdÓèÊ¢ÑhûJ²#`ñ9Ú%µóÆÀ!)‰§Ü’iO!Æ{åμ¨[4êÈ=×.švƒ$õû¨aÑ9ÿXïŒC²Ð™ãmææfâTÆ« ëC¦ñ소ѶŒq7wæ„èd=Uȃ€,u0KlæM¹³'Úñq'/Úž$¨ónΈ%I ã­Ù;ÑÁ&n_/bŒØ2'\“®ŒóíøYpoê…ÓHá°3F>™D/a¨‰°êp…Œ%äÐaIAƒÎ„@’$X; KŒ1l„¦“pF:¦¿¢~Š#ŒàÒeNÁo8Å·yeŸð•e[BÅ_ àÊ}¢´É¯Ø&”ùŠø¥›"åºHqWT¾)?d—¯ äŸãòù6Wù€«ÜÀÊîcå÷Ø1K~Á-‰cÅ#Œl7Sh¸Ål”ÇJ§0÷ ›ABiéL¥2™ŒœOaK³¨¬N¢óÐ2)¬£DXù@CÛ¸åÔ¼;°ÒÛ“¾ 6ú²h¨cõ¾i{W¡iÕJX¼!+60CÜÙ¿BÛ©®êØO%çâX«hdÊÚñº¬Vp‹L&ã €¢¡ dÁÖ}Ù¸êêHXpà±6Í›ÃM˜ìwPaÕâú‚ž÷p Ë?àô o‡ú=WèWx¶áäðÛmÙަàJv—K*¬Jk±§_¬T '-^öW‡‚êþÁÚ!¸ ©Ãýšþ°*ª B;R{žì¯3NZLþÅî‹;’$±éß~žíücóŸ±Ó1¿ÚÖ „*ƒ}Êà°v°WÓœ3` Wõì„ }ƒ¦! ¥ˆfên£—»‡Ã¹!dEYœ:™ y AŒ¨ô—Gï–:¯—™oU;oWXnUY×”ö óªl€"7å¶ëÚ¶?j=kG­/'¾?\SZï¨Ük W ^@à8Ä ”BD")§HYÆ7²ÚJyþì‰$3“™Ž÷'Èó|UâKñ²úEÓˆ ^•³¤ÎXQ¡ñjâ]}æ¼&ïÝcÌ+ƽ¢‘Ü“(nÌ\Ñe/« UfBW°läÅtÃuÿ¡¾ÜŸšJÏ8þtº«@È9ï¹_BHHP]°C€¬—բܒW+B\D 䢠ufwúK§ý¥ÛÎnµV·3kw¦¿ÔÎÎv§?ì:ÝUQÓçÀŽÝéŽ3í,Ží™gÎ<9'ç=Ïû¼ïy¾Ÿ‡0ë¶qo*”A FwÓŒÂb±Ü»w/ ø<ñû[·E^ ô²l2—z¬­¶u~жà¯í>}¹³~Ö[?ë{ØæûE$,‰ùÀ2±ÆûàÜ j‹vÊPG"ÉìÈÔþÙß ûÿ¾ßÙB/v×&À«W¯qˆRÒ KÛÈ$MaNë¸ß6ß_;ã­‹uÛâ=µ—ê\èk"šïo‚xf½ĺš£Ý¥§,ÉŒ\Ò»TDB7uè­ì žô ·zÒ:çMKõw€©Æœ[¥Îâ´FËoɸàL»Ü¢ŸlAå{Sä) è0BªÚr±ó„nÔ“¶iÀ4‰7’ÕùyÊ1—öb3\‡ÌÓSÛd*‚MÛŽsšt}¿U=Ô´k´5}ºM=æ&]ì´[+ñIóŽ©6û0Ÿ§'3D„0F­È2̹TÊ™ஜ±æWM#ô´‹½äÇ¥“i/¸ÿtútW5oÚGe«ižaŒ& )\ÁbsâH¸L±EÓÆ“H €cS<…Ç“DËÎ|ˆ—`ì–ã?³öŽ5t¼¥Ö#R:Ò9Q/¨¸|-€1×{ºÖZbï ÂwÁ|aî[;ÙM}02ä†È¯ÛzÁ–ºÜ}á“Î\ĈŽ“r’¦9“…Ôí¥­Ãð#Á²Ð€12E@âC•ƒ¡Šh@Â46P>~ĆëQC0XÜ7\=Ü_ ûFŸ –ôFÁà±Àçwþžxšø*`òìëg‰ç_$~uå—þŠî‘ªÐ°q`Ø(Œ˜ÏyKzÃÕá­¢‘~s°¿t \:-ífwò8;>ƒª ó“¯ݽ}çÀþ|é«€9#R.—‰<§D¨1}÷ûÿXâü Èz¿Äñ¡Áþ‰±åîAûo‹ïš<;o4ü®ÂýÚqâûZ¡ýŽÁñQ‰ë½ý?IKÅrDÊ0… >xð`S&^Ç·ýÿ—ãYâëP4$Èšà•,iÒ«ç«Ô×*^5¨VLÙqSîB¹zÙ¤½nÉŒ³ËŸa«hD\1çÍ–ïY¨Ô,•WŒšÕ£š‰ªŒúÝÛ63U™O§Ê¡ÏMÃI¢ÈÊ}Ú‡bÜ ½©¡šÉ按o€ü-Tç´I·ê’G9Ú¤s)'ÝšX»Îwz{n‹“Њ"ŽqЏ”:CÖy¦Ñ‚²Ôªöã™SíôE‡vº]Q} Á‰rRê˜öèé¼,–ç…¼lUËQåt+(¾fÔ Š¥ô×@»›h6I&dŒ¡Èm™¼æì ÍT‹b•¾u”õ2@8D7Ñœq©xŒŽyƤôNz Ϻ¨]×ñNƉRÕ¡} Çó,í.MÂyáa¦ˆb%ƒüQ`CË(tSji¨Ð†àHÅB™â(Š¥)–¥¡œ§rÒh"!‡Áá‰pš¤8†•^‚Hd4§ y1UÓ–K*@èX–-Ðäœwœ=þ¶AEqÉ4AÈñ½‚X劽窵ç¦;Tø±b÷A€ÄTE`¾0÷­Š² ÙYqI#¯mdõ†'8Òt¶H“­Àå,‡! )! ×¹ ¶PEpÈ WL‘`ÅÐ@et°b \)H؉VEåý`ýÁó¦<º±Åý‹ñ³ñ Ù®"ã¯îÿùÜ/@!'À6‹Qâ³þ>5è/óEŒá¨q8j:7|tÔ{¨g«h$h Šœ+ ”j OŠ„´9¬6êŸ>¾ÿäÑã͆qyq)K§'p¤æ…d”Š‘8É C²‹ï\Ûÿ|À Î-£ ü~ý“9Tnš^?N|?ûC‘ý£bç½bg‡¾€ä•œYÞíp'¾…/ZÚïö¶ÿãÇ£g?ýô/*ŠÇå4¿]Žèíú‘JõÊ«E0íÒáœyËœÅª¬«Õ™sÆ •»–,[E#ÙË•ÚUsf¼,'^¥_:¡è(D¹@É*LNÉR8†F®SiƇGÿñðËõ„D/Önýñ“‡_|™©ÑB…O#Aʶk«Ý3àÐt÷¦YßËhÄ6#± ÐHílõJ .ÖcÝàýÞPñ¥Ö’`δv¬olõõÇÿÉ~ü+¶Ä†ó<áhhPÒ ‹á4–ʸ¹ù¤k"ôŸž÷ÖÎtA„4Ò!Õźâ¾Ú¹Î†9égÓlÀ6Õ›]¸“%‰¦Æ),%åŸÔ—{LTÙÇÿjÚÿ» 3sç¾ïÜ;¯;Ì0"ŠV òD¨*ó¾óR„yÁðP`˜qxƒ(¢®µlÓ&&›6»IÓ´»6v“¶i·ÿènûG×(ò˜þ.li»ýg1¶w~99÷œsçžó;çþ¾ŸŸª¾D“ôr@ q—jÄ%¨$Ȩ:!€m•:ƒ(«Ç½TÒ ´·Š¸#7é7´5{ RT®•`” ¥‹÷gzrG|Æ^; D÷hæ.’žj†¢©L„“€.J)ÎòíT%Á$„˜ÉR•‡Ø¸ JùèI_ö¨-Ì´h†#¨G8å%(Ê_?¨QX ³­¯›FŒ£â’uàÉ«MÒ Æ'Ü€LÊ ¯ ¨ìªˆgPaSn&%Wôu75n!{ë(¯Iq²€+ÊSäòŒF¡ÂhNN*d@„¥8Œf1œÀâf8›‰A/CÐiAËDV!i\*©†a%ÀcJ9¦‚‘R”ÊaHpC)&cP©‘Q’LF"Ñ Ø.¥ê`–áÔ OÑ÷zjg[oX;A…oÛ:ïØ7„ð¢+,ª¤# Ò *y³¹DZ6•t ºì!Ðл®®7E#‰“Í·”¡pNÁÉð2þÚoò2É”÷NÚ/ÁÌïÙÂ?vEïØB0á|íNð "•U(\°tÜsuG …@# Ž#¶e¾­0\÷vÍ5µÜº~è肅À" PÂz¡e«æÿ{|~ ÇÝ-B-xÝL6_(ÔçÑ™CÊ`#asÙmTs~côX(VÚ+ì-u›bÑÊX¹hx£»< @%@Xï±þžª>àŠØÙØ÷~ ‘eåYZ „×:ñ£èÑ© ]q,ÿåsh‡xõ ­¦Wÿ–žÞ UõDËûZ"¥]±šØVÑH¸¬»ß44Ro5µjޤ’Áå™è¥¶öõÕ50}«/Ä(øéã'ׯ¼%ËP㤊¤™ŒÅ€´¥ n>ÿÄÃ"ϯ ¿.v>,qÿîˆóÃëÃÃö?q¿qœøªVæ~ð¶ã½Bk­À09änðuðó÷7ebS#^ŠÅË–ÿ—KåÓŒ 𢜉óÚ¸o,ÅY‹¥¿¡§¡…q’Ó~eÂùýÀGp NS$ŠMƒ3FªWƒ(ƒÎB@Æä¨¢íd¶·Ž ŸQMžSZÌà Èsp2L¯ã9’ü&%ËñÕå$|ÊPÁ릑Wms±Ú1ߨ¿lç_ Jv›3ê3Žx³‡=@S†1Ÿ~̯{U£nvÄ®èkbÚO°¶£Úź²|ÝÁÝü.»ÏHð@g¨\.CQ„Â05F褘”Á¹íR¨Pœ£är‚5$ WRTžNÿ}îá¬Ü²]N.k*®ôUÖ‡ëí£– ÓÎÎëîð¢;rÓ¹e ݶŠz tqË\r òŽ3Ê»h \·v€ƒÁS*¢9C7lèÝxêÍÐLÌVTfÛŽí Aép‘IP)’¡ X)Öq¬qÉÝu×Y:ÝDá?rà AÑVoôÿLè»Ùt©½¶ @WAÒ„Ñ£ÌÎ8ãè|ÇojƒõÞ±o[Å’‰@bë[H_àd˜ ˆ<ÖÀ÷[›|¥ÙûE`[qJüé0þÔþº.s¨ÏÜ (2P>ÐcQ$jîé1EH†Ž õ˜za@¤¢+Tî« ”‡ºZº?}ø×ô2Pk ëë«  ~òÇ`U¨×ªŠ\©ïùøÝ¢T¬®?][`Yù<ýÑ»:Í¡ÁêX¤$­èÙ*ªé6õ¶–](Ôpprq œU=¯úôéf|Ua!þé“OlÍY¨2‘Ñ"[³29¤uªÜ‡{²ý¶Ôó¨Âÿq‘ë£Bë›Ç‰¯f»~SæîÝU‚0(#‘BUTVФøŸäãßeåü‚£’øþ/Þ“Ê¥ðµ*åò íö}ã ¯›Fôs&(u7«øÅJ~á¨î¦Y³hbË·ŠF ‹'v'jôµ{åèvL"á V)% „ˆ]RRrÿþ}qÁÖÓÏ^<[N‹*w/^ˆþxþüù¦sòv„ŠRì¼õv]©s<`™ €Ö;f‚_F#öišg‚MÓ¸uM…ü“‘Üãù@@ Œ¤%h¸=´¶ávñý+/¾ìÀ¼úÑmLíŸGk]4‘JÒé'Ož ٠ĸÁ$* ¬ÉNxµu.(òÒTÇ™Ù@ËtÐ1²Ít8f;-“-Sí-³Óãíµ¾SC­Ú¼,C(Š€|âpö™JÍeûÎñs$ª‡¨•›42áÛ*EV]ewWÒÏ]±eMøõã~nÔÁÄyÃ>:!’~Ý…z …P ¢¬KøÈ¤À§üycçÉ‚=à@,SFâ„„£øê¢ýƒ^~êk!Mù šïæSý-ˆ–ÓUÁ³µ€.” ÝN¢Ôn¼w瀩=Dž,ÌZˆ+í¤ÿµCÈu¨RnÜæÄåk7ÀCpf¹rF…½#î¼aÁ8êÒ$œlÒ¡;§Møø¤ÿ ó‚˜éŒç.MÒ­Nyàáߘ” L:Uq;téSݸGØa Þ]¯óž (J'!pݧ1„5%šÎ/øºnY;îØP.Y.Kˆœ` ‚äÝýõeþÜÄyÆñ! c »Ú]]–Y6Æ`ÜPŽÚÆ—¬Ë˜ á²-­vuØ&¬û–e— ÙØÆ—ä †LSÒÌ$-C;m a:-I3!C`HRši ÆVŸµͤu¦MìqºóèÕ«Õ³û¾Ï»û>ßÏCgHÿŒÑ7Óì¾dðÌ6{®4y.7º¦lÞ ‹;I».@má’ ¤çÃ'®4€ §E‚t%H'Ã$&7ð  øÃ¿ŒL›ÖŒFÎÛ¡Cæ’,…\"^e2›K`¸—¯?4Ùâh:>mõ_i‹ŒÙ¼9¹¸|*•%}äÉ™¶Ð€Ù¹Eœ gö•–d †Jýøñp¢Ù~‰ò1±›}“K¡AŒ@ ÌÒ½²Á¦—”YFó˜`V¯TÔÁ~—b gòy(ž)®/Ò¹Tö¨.ÒQ×ÖDAÓÃÚ€p‰_Žê¢Züôk¡úˆO°×8»öÜûè/©y&Az™{üxˆ#õä1PÉ\*NøôžÎºh´&âQ»ÞóFê €†FÁg.õÉ/>ñ©=§NE´+E#¾²PÇÞÎeûej¨¾àÊ•+ßH‰_/ÓR®¿ýŽª¢ŠýB†@Ld`ÀÞ(—©ä"mÊíoUoÖXÞ©2üºÚð‡jzÍqâ{Úí2ê­jC&å¢aæz ‘Ééó©ÅoªÆ¬pøÇÜ"ó4Rö¼¤…¢@ÄáahjÛ±Ú4’7¡’M«Ä3ªœIµrTUœÐ&Ô&´+E#y†-™J›³NŒˆTÊBPáoýc#æø1§R_Â׳ LÃlƧ°d´w D„²ùP0eˆXG;lô˜÷ÐÙãßB#¦!OÓ€£iØmõ‡ÜÖsÞ¶¸+3ŸÐ9DŽIî~ôéfÀÅ%Âø7¨ýÚ3I¿Qé)=}Ó`¾óO˜y.Ùµ_¾£8âr/[¿ÛÕ C‡vrÌspØÙ8è49çÚɦÁ“ô(Ã*@,‡‡½ôh¨ÁeÂò¥‹y«Ù|ž”=ת )èk•÷Ði‘öP +¥ÎÄ MqŠÚ¥ócVi¿ ï6æ“Ä͹=ð³U2ÐZÒÝ*Yñácy]tnoëÆî¢ÏZ`lUåáB)_¨à`خҬ3V| Eñº…jSüÌŒíßµ)D;6cp B‚Í'ø(t¤,>WŒçžxU£€²”ÝæìS&ŠˆÓ€X9§éÕ¦féz­¹qk^Ì–æ1)0I¯YÚG}”°Ÿ ˜eg͹q³"FKãfp¨õš¤qRÚkõ²Îe1“æÜkehäŒÂÏ>cˉ·Hlà÷‡;KÎÐ0\n¯-çuJqöµç^îz!ŠË ·$iϤÑ=IºÀ@ÝfÌ>ÐM83mòNÁ_¤‹‘Q@ ³{ŠvÓÎqÚ>avÌöÊ1M9àä„Én@#—LÞg$-ôŸ€ 8\4yA:Óz:µdkE# «—*ÓñÅ‹ÈÊçB~n.*j<1Ûì¾pÔD1nö` Û<Ûä‚HÙHÞó<²B¤\S,Êis‘aÒ~Î⟄™!±‹Î7(?¬\;A{ 3cdŒY“†›°xÇ ŽYÊ—l¶ÚTŽgr™ü Hh"Ù™_áipwjCQUhÄ« iuD´Œµ¿>T#†O¼u¾HC´½ÚÞÓññì§ó)H2€ ¾ý§k—ßüüÞƒ§™eqáÁÏ<ûþªh—êL°¶#𒯋 ÝûøÎâ†=xtöDÌ£±Õ!Mt¥h¤«6Ö®¶gó¤(Ÿ#àp$(qäÕÃK9z)ù-ÕeÏò!¤G¨"/ws©…Á¡!…T[>‹+D0!<Þúb>êÙPv}—áÃJúƒÍkŽßÓ>,·ôoR‹qÎb‰1¬tS £e_IÆ×ëÖtÿÿñ˜ŸŸŸ…} » ©XR2ºoãØnâ¼:oª^1Z¯H6”Œjò&«V›R–³ü„¶(Y_4¦SŽh”“õ¹ÓõYãyRSz®Îä×ÛH“ê-£7ÿTƒ–HÓ±@‹ (w õ{}ýü‹ÿuevkµÈOœ¾aG‰-æ6 {^i'‡ì†Á“Æ!»)é;<â8 r?ê3ºÈ~7™ð7 ;›Ú€”Ö2þRÉÅã7ÔïN-ü Y¿¾>£”tßår Ìô ;–½ÖlñH:Ùa’ËQ=â9z&Øã1Š6H6KÂåJx*TZöçÄlÀâ>FL N[òN›Uío5)dD¶‡–¦râ+F)Ë™ :pä¹B1ÃÆD˜ËÅ6+$§Œ Ê€IòþE¥°Û‚²÷˜ˆCÕrBÂBøë0~‚¿€ä²QõÖÂÓ-0a€Ÿìn ÂÉÛà*`dØ–£ÄÌòÜŒ¡…¸yµãZ}³ ùÆ (º#¿ä a­àÛl‰g €,:>N¹Á’´{ÊâKàÀ€Ñ•¦‹´ˆh¦% \@ãF'\>L9Ç­^¸„¹g³‚±øönÝhŠàê_Œ` ZÁçr£kÈäkóH€³îÅ2 È‚°…È:”›6~>ßWZ¾Úë0 dhrO}e°0X„ó&ûŠœQʩٲ\7ƒ„…×)kìÚö>RE:4ºàr*ï×yBj°2УïVqíu_M^ŸKýÄìîµ»ÑÚP—ºÓw°cñ³TêP©-@ °© vè£nu  ‹ti»œ{Ý×Go¤¤Þì¼l†ô¡ ÚV/;îrÈÐ…€LºpXªüQ]$PëkßëØ.Û.cKq¼¹¹\öåÿ¥þk]½ÿ~0äB*CP4ƒ-&à\Þ6DÛùò»5-ïU‘ïï"o•>8©6ß*#o—›þXi½Ynú}õÛêFµ Ú›µÔûU¦[Ƶ¢Žu–÷vïn£~WgùU yç'äÍjÓojɪcµ¸‚-FÙ|ŽŒ'ìëgPdá»èÈùxøðáÖ½( Ppμc?.œ~E:®RNëåãú‚D}ш:wªn­hdcBŸ“ÐH¦´Ùôÿ$¿îŸšÈï8€ÿNO4›ì&›l$$ àõô|8Œ’TîP¯<æaw•ÕëµsSï§v:ÕÚ«õª´;íµµv|èÔ!ýlbÛ›Îxs8£Ô¹å;;ßÙì÷Ë÷»›|߯oî”Q-Î/É?»@¢šÞMÄ´™Ó{×öÅ[ÅÃx@‰˜€õŠÑPúç?}š€7¶ü—vû·áˆxÂâð%ÂÝUtÔWó˜ÆÖ˜»6zÔ4î6O´U´Ö ;­cÛ¨·vÔ ¡&˜¸·Nòõ›¥åñ¡ŸøéIÃBòx>»BÃÿ¹rçεZp¸<.“Þi1‘±à»îª$™ž¥sÔY7ꬋº­ƒî­‘’Àø\©P˜&B¹ž{¸2{¤…Ò¹Ÿ>ܨêµAôƒCRE>`W 62T8N½èTÍíkÄ_Ï–py†‰XŽ€—ÓT¡jR6Iúm ‡ô^#;eWõÙUëz·i@²1~Âá±oÉEéoïTvS²h³dØ.°ñûI@ô €‘ 0;˜$ã83‚ Û•¶Ä7E#ÓÉ’Ê⧉œ”É„Ùq®!0cóÁÈq‹ .B=^ç8W= b™²y"ìAëš¼çjœ lh/t¸Åê¹hjë©mVcŒ(QqŽ@Êcs¹<üœw(ò€.?0{7`ž©šÖKöPouSG á Bæ±a8*È`£zõ†‘fïKÐH<É*˜&Ì*g“sŠ\ ž•o,b88JŒ¢Š`ßF¶É7ÛµõíåÉ|×vtè"톎g¦¿Îé6vwùZçùÎ Àf=\LÜüéo[u®^mWGQøH…çw¿ºx²øÅƒÙáòP¸8Èñ•¶ á’p‹îpàüH(âÑyýz¿¯ØÔ–« ˆ¯$Ô…€"aC¸CÿÅß¹'²ë>%W‰­â"1†!~ø£'ó ‰'_ka„­T`]½{÷®Ñh€ÕLë?a¡\ Ž«Òxû2Ö_Þ^ó-uMk»¶µî×ä'%öwXf·‘³…õ7 (Iê J´Ü(¦WJ#W‹èO è[;¨Ÿm¯»^HÎW4æwZ¢›ö­KCW Ps6‘qï޽䜟#IþOx}©÷8|jBS€bpÆ7ªØ~Å„.{ªD:£ ¨bù”a¥4’1¥SNê×N–ªNëÁHéq­ò=mn´(}ºTß½~´By K¬ÂP6,526ÑýÆëßýèÇ—áGÇ|¥Ë×ì< G†kÒVaJ‘µó€¤*Új9 ðpÖŒ´ZÇÜ–Q„{͘“÷ÕŽ¸Ìãn:æ­rÃ^¶ˆ@¸0ŒÞ½ó·Å…ÿþ´ž$_n;??gØ ¥—»&_»™^ÒH¶1׳4R Rb†Ýf‹…¬Cž ‰«%lvšX€#|¾ 3]~¨"»ß.k(¢3REvÒa€’q‚~Ñ©*öWJTYÒ×XRØà¢hfy°èµæœd\!믗ö’âቪ›odÑ{Ó„|áPX$æ €DBÑoT‡ÌÊ:½‹™ŽúDÃú0µ¾«>kКER,Éêoí¬´%¾)‰ÓLyê² 8qÖ”BN›©Œ†h†2iv¦Z£™¤Jê†3÷ù†¤vg¹5h¬=Yݵ:âv¦I½öíŠüžªF»f/Ž l ß‚ÍoÜU>cr½oõ]¬œ·§Í®ó&w¤¶q‘-Oã«Q*5o7 ÓÎi»ÿ…«,9 S(ÏyÒ šš©qÀIíY·çB®ò¾Cø0…íÒ­´†KCéaý±$9üÏJO±?Rv¬½$ìÑz'ñ¹Oç Âæ’íõ‘@Y¨·¸Ç_ä4Ÿ„Er‰…ÄGã—ý¥¾ˆ®x@ó€ÑßVâ–…ÞÛÐyi8²§k¹aŠ.,n‡>$í†ôì,:ªÆU®4KÙ÷ª0A ëÜWj$^©cii)u~¼ôäêÕ«Öæ£\Jˆ¾Ãã 1Ÿƒd¦±ª?/¤nÙ¯Z®Z³“¼©¡~Q`½^@E@&·Þ²HnR74äJi6»ÓvmueKÍ nhè_Ñ×5tr“x |… °Þp'¬þæç¾ŽÖ^‰#õúR/ôáýJ¹‚ÇE :…8Gá*V¿W&ïÊŒçÆK•ñ݊ɲ•ÒHÞT™2V QOÕ“†ì¸Q1³;}Ƹn¤"“ÞÈQq0Þj‚ƒ¤s° œXÍbeÉ2{»{ž:d)‘*KO–þ‹pÿ­ ›`ù‚½ Oˆ(¶å5÷{kÇÛª'Úª¢NÓ˜‹Šº,#NÓ¸»jÜiŽº-m ÓˆÃ4ä¬ ÚW‹Ø„¡þ¦o>É—žürÿØTåÑ£GBTˆ±¸‹…gtŸÛó1cly¦FFÔ„Ç:æywèhíé VÂ@ñ4V†g±V‹q¡ÊY™ÙKAÖ‹úŸªCž ëH þRUÙ×  šDš7Ø"”»%GÞi%†ࢬ‡”ôÛäI?ˆOÕƒõª>»$\B(ÂØ‘%ÃDÌv2ÅÓ›öÊNÐ9ѸMtÜ*8aÍ9(ì§`jÐV:À°|¶!ºÌ™É ¾âåÕÐ $U9K2|‘ò]"}-L}Æìf.6˜ÛLN¨ß˜¡½ñ:T±Ô9áÓ¸Õ=ióô™Wn.R ¥(Ê(d®Ï}sÀr”r¦10Z{ä’=4N:·gçÃA0žKŽ@:Ñà™¬>:J:-š²öýÔ¶ to QŽîªÆ1»çì¡vð Œä%hdæß™ž1¹ÎÕ¹> 1Ú]¾±(3‚0…qóXü°9%Ûà!„n!Ë¡[H€/ ÈœqúŒ“xúCJ&nÆŽcc㦙Ét2ÓãO6Ž Xý.ª©(™š‡t²ófg¥}o÷½Ý÷¾ßÏÎ=û³írD…¨ømb ‡{û$EQ 8!I’¨Ûð·3»ø¾¢ñó|Ãç{îïªû½ÂüY±ùA¡åQ¡õA¡ùÞ^ÃLžþaÞšiäþýìãíB¸è«b`é‹ëõ52„‡`$F¡è_ÿü—§ß`ÀñUd’Ÿâ–|ƒÿÎnÏg:O³™,Al45?#w´JvI¹a´8}ª4mªB6V±V‘ÊÇ”W*¡òhÅÆèÁœþ ah¯`›°y„ÇÆø¤™Â¤HÂ~ÌüøñãÄKó3¯.ûÏ%a)ÜþøŸ‰¦‘.‡ý7e_ýAðW;â­‹8 QŸeÄÝÐ׬jÑL¸Õƒ§LQOãnð”%âÝ£.Àð¹8|ŽÁ³]ÖÈË¢x¥-Ù*¹ÅbËÿW¬”'˜8£ÆeÔ9"­†ˆc%4Œº4ýÍP LUuÖù }.¥©Š€ÆbÈ ‘ñIÇd'g ç…-ÊÅç °@|'é1Cù+6nÏì²H5J©§h$ [Ó/˜E½K·î6ƒ.DçôdÄ?‰Š$I² ŒbÐþ“;,kU󊶡;rSû±!+à*ûØáÌÕéuV—.²‚S²›æ \<­‡†ÍZ[âç¢@t m B÷SÛJ Dïœ4¹§-^zÉ*48A/Wž)MËU êO™=³³YYC ø°Ä(.Žq¸.—ÅE(œÜ”– g¯éÝ7ëÝPTï8£¶‰R.E²IœÅbmgº+5%9Û âmË¢ZpßK/`pÍä ÝÐ{~Ð÷]¢ÈtRhà.½Sµe|AŠ)1+{GúŽCi‡$=@ AÑÌð©ü†•²R¿²ÓÇ•!G•ãö‡·!SÇ!€ÌÓqòÉóñ`töw³ðçRdyv£óz‹ÊÑVÖî/o´yžPY°­$Ô©ÁEþ²£MÙÞ^v4ÒVÖùªiS´ÁÚK:i€‘ö¹5»Õ²”t‚ÀàíöþÍ÷ñgÏžÒsåH Qý¿Ò…䩸4ÿÇ“o\-­b””°°.Jð`j$ŠæS©}¿,›Q5ÞÞ«}XdÉ3ÌìÒϘï›>Í×ÝÍÓ}Y`Y+$ ` úp§ÀxgWãÝf½t ®a†NZççççà]Áhã«Im?Ííù‹ ^Ü7ÂçQ0ù16)âqÖK²¦+rG’ •t¢T>VºVI¿T*›T¥–¦TfEoì¨L=³Nô‹46Ì^.çQLRÌ ŽªþøÓâ ß?KI¼ÈÝ«ÓÈübì{Hú‹ W“ep ˆlŒUuJÛ &ƒµCðÛ<ä¬v¨Çš‘VcÄ¥í?¥u5ûÓ~•E`(ÁÀx_~ñGXÏþ³vVÑ%K²xf¹9Ÿ=ß…1Ø|6ÂBe–ê†Wm“>â\I#šatÄ¢z4ë§ÛjÃMöÑ@¾ b:а¤l„Ëåi¹½:½Ç–uñ¨¼·4%=ÜY›¦HØúº³ª¤ËHž×Iûmé½ÖÔ^š@ è€(l6ˆ»Œë{lçLÂFÞ‰# œq¸ á—ïÂmÂA{v@ŸÙÕ( Óäà×—08L°+ GÞ Âeöƒ¹A}nØ.¹h¥zMâ‹V¨);k\kKü\4rYÛJkÄè™6º'¬žh£gÀäèÖžðVÖûª¼‡tþjC·îäøQߤÅ£™\1{¡ Pä²Ù;hn5ÈA…”à¯C ®ˆ ¸ÆF ÆKOAkò#ê“¿Õ¸'ë[n4uFê› ye“Íĸ‰æ d(>Jpù<8>ZTš®w€|®½ËF‚òÚE?ORbï·œQWoÙƒ ( Á`tŠE¶ò¶º”ÍþW 8¥]Õ0(  e¥ìïSvUP­µÐ¨ 4í?õA߇‰ï ‹ÏæA%àñ¹ØMw?øÄSæòªüû/8 ÒOåó+|ÀžvE;˜$¤ •A_‰®ìU‚寪‘`i›¯ÈwZu–VMeȦ°mmæ3@ 0aQµú]u±Ø÷KoâÛ‡Äå IœÀ>þtÒ„ÚïãsKäzð‡G¥JO(d²9°40&‡ƒ!^AÉnhïí4|µ×ú§<ëìNý<ÝgſŖÙ=kæ{ùº™ÓÃ<Ãl¾ù“|ÝÃ"ÛíG2Ù(ÂÇ9(‡BÑ¿}ýubi\±ç‹? µÿÓ-©(f£ G1 áQ¬·ùå©YÃãûäcå²qeæ„r­4"‹gL–çLWoî®ÊPoCä(“õ&Ž Å>6mÜ<=:‘xF/«.½ž$BËs5‹½òsY\XÚÁ+OäíÎ'p’Ã`Q8ž½cƒ:`3NkÚÁVë¨Ç0Òún¤Y3æjhÑ :ôQ·úô1DDS„àâ™òø|,ù„_†Ä*¶$±’c¡×ÝÒÏnÝâ£$hžEÞ…®Ï©tè¢î•4¢h6NùÁN5áãÖ ¿æb“qÜ[qX†ü;L¸(ƒÇåˆp"…ÁH´å©gôÙ}v‰ø¼NvIôÛ^wVx€7„çô’Á£’ ¦Ì~;ÿœ@"î6‰Ã4N2öõíòvž¿YÄàP DÀB9ÙR¹W›Þg—ž7¥È°EÞm%» ZÕTšˆd°àˈ`±(&!vædÙHRûm¸ifOãZ[â碑+÷‹r¡þxÓ~uÕ¯ 6 Óñ7ilBÊ¡A¼ÉÌFe9Û[öÕN5…ÆŒÎñP‚OZhrùRö[ëp&§z{aO­ý’=p¢ü7ÙüT0=|&çœÆ¨¸fõÕÓ¶ŒZÝÛ)œÅÝ{øø‚(’…PÕ&@<«K:çe½ ŒtÕâóL_»F&Ì´²®ÌêÿE~™?5•eqü˜zJ§’·¿—- ·ÒVD$! ±¥ÛT û*LCB²"²'Êĵqz–߻Ʃg”–Ö»,­êžŸ¬é)[ Kæ<"¶óS…%Å,·N½º÷%w9÷Ý{¾Ÿã2©È-†Åƒôð B–ˆïIÝ((öùJΰ:0 ò€yÕ>¨–¬¦þ@mÊ@gYgGip…·Ì×¢t Ÿ‹ýeft1º¸ôxdn)öhæ;ס怢-¨îô•t»•ƒÁ`©¿­Ø ðã€ÔA˜+Xè8ØÞ^„ŸÖJ#^µ×§ò‚0”]í(ÉRA:ÉP$† ™²'ß?aCørŒ\dCðüjÁpi¹ü­W’5è6?7cÌÇ%{åyýóÏ ²÷Ó ˆ@ ôÛ/âb|âÛVt%·êV¡éë¦Ù<ãW Û½BëlŽv£häv>L­ŸÍ3܆f®iFQoÌ܇!p XõÑVU/E£ #óË"÷?#ño777·Ü`íÏß~G“Òw³è'â•àò‡Û"šŒÉéTÑFшèšz+@QãnÎnîfú‚@#ÀÆá‹˜öÓ'ÿ+0ð³ø§yöR²c+Lgæ7Ù –<£ ‹p’ÿ8{')Š‹‰0"»9§RQ5ØR7å×¹õçZô#-uÐHm¸É4檱—4Us)„‘4NÙ,V–ÕçØçÊJÞ€I^‘Ìëù8ûÛ›7IÈ¡‚¦ñ½‡ Œ£žÚq×1XÒ*4¢wn>6î0Dܦ°½aØU{®¹rÜ~tÔ @"×&I”ŸÀñ›(¼þiƒ €D6ÔÒkŠÓˆ¨×˜,oÒÐ:iq›×F&MNøFWŽ·üÚèÒ·ٙǢCI¸J ŠØ*Ê´«,^…Ó¯înSô/Ã@;@ˆ§Äë/ ÀÓ£ð›ÕÔ¿­ÄïQùýJ¿_îëP´w(:ƒÅ¾â€·Òóýƒ¿-ÍC¶õâyìˆrOüc¨¦§KÕ(j÷(»‚å½.…;ÀÒŽøÄ£€¹U>˜(Å)oPñÃÖH#Nek燧]…nÄ’oÍD3I†3>Å ÷†XtXˆ"Ap{±4]F^Ò×ã!Ø…e!`G€®ÀXàØÜâò«Å…¹h—¿]–*òá lp£)EÞ•ÓÉgÞ/þ½Üð§âú™ýº™}ÚrëFÑÈLîÎí—Æ›…Æo÷Z¾ÈÕ‹I £pH „(~ëÆïbK/¹ëÅü|t­*òßP^z÷âÅ©S§’¹8… 1”‘§eM~,¾\šQl?ô¶èbÇXÑŽ‰âm“ª÷/¨eÀ9Eú¤R6U"»x(cJ“1Vš9¢–«3.¨ÄS…Ió‹ZkÈ=RÍ« P‹  ‘#«ªª=z‹½Äø™|CðXeOâÛ¯„B!ˆo8Žc„L¢5 ÕõãÞš;Èzݘ«æ¼Ó8á8±n2Žyw–äôBbäôôôóçÏ_­íõ»³¦ÂÒþŠ{q2a[K±žá <KF`¶÷õW:jFZ­ÃîÕhd5;:é¬jlóVÚuL:ƒ&𠌇bE¤Udu[RúÌT¿.%d˜SÎÔŠ-Â~¼L°¦ X@Ê¡.´­·Ú¦‡`^dÈ<Ѹ¥õ) Œæ"$Šòs· Ïè’GNÀ߼款zæœUÒgKë6§?EœÕ§L5À›ÔÚÒM ’—Ä%ÓvfÁ˜’.ƒ(l¤Ý&p‡¶ÐC&Á²ƒÐgÁµ”nƒ´×"é1§õ[$á`!°fÿt™6¸'tö)[[¤®åšÎùËúÀ Å^wð£ìÌí@š—È娢 "’4‘ˆðx<.\5Š2A¹,؛䚫Mí—jZ¦µÎQm³A^¾[œÉ$¢¿ª¶OjíîZëV©Œ½q‰ˆˆâ‘(D’Š1Íñ«ÏgzØu‹÷bÝ[¡«Ø’­LÊ*—îúTqx#¢wÀ.­÷>\48Á€v9ÀÆ.[=Ç•ºO/WlÞp]Ëá !²–Æ%„c›ðI9MŠF ¿"TuЬªòj¿¿´+PÔT½Ê¶ö²€;ÏyVy6¨öø”®Óå€+>`ŸÊïSýªv–Iúïÿæ~ì‡x"·¸°}öìY¤a‹°G':oM´Š¬Ò~kú€ ê,–ô­»:‹Xþeˆuüò6a‰Ô?Ù¯ó§&ó3àÃJŽ÷LÞ\ää)²Ø*,wrP±ZA!7I„ܸˆá–#œ®ºÛªÝ_¶3Ûjíì®´ÚªÓߜδÝÎ8Ž«èJúF†ÚÚŽm»~çÌ›äÍ7ßã}ŸçóÐ<6{…f< H`G-©IŸ%í¬--Ø(¨)ÁöîÄó³8ª½Â–ZI·Imá6ñJó!g‰Pw¢>³`¼Yß]ë¹6q-þ4¾úl"Ì7fǯŽüØYÓåWû½åÞ°*Ö…] g²4’"ÊH@v(Z¤˜ Š;„Fã`äƒ žAá¶Q¯­ÌdµBu=x.//C<‡g„b<„¤\@²ÒQâ0çbIýíRÛçæÛ…†û¦å÷ 7‹õ àÇ­"8äv‰à PäN¹õ7r[Aòeþ¶Âv«Ä´\aú´\ÿ„ÇEpºqãÆæ%w}Þl{¾Öâ/vg#§WWk8Û&„ ‚‘ªÍÈœÙ/YPIÉÒgA—ºP#ž¯ÏhÄSêôXUæ\uƬ.gAÇ_PŠ•Ò˜R:Q•j/`J!œN#™ôTç£x*—;22²6úÄËÊÊÊúàÿíÿOÚßSíálj„Ë`¡Û”€]’{|ÈÝxî¤~ªëÐX›a¼Ã<å6ºÝ6œ…Âhá+,*ÞXí—N^·}ób›Ö“x}¾ú«å_b(>A’BÜ2è4Ä|GÏ»ô£¯­ÛpgCôdÔ»q.xlÌ}ÈÝÄ–rp„®Þ#ékŸsç¬Â¡f€‡x°I2`Ÿ1ËÎX€ëTØêl+°d Ø2£Íi}VщZ²ø;(Ÿ½mÛ;üê÷¥C HðGì¼~Sv´El åË ²ÀX$¤'HU ¨0xnÉ{‚@ƒD[,$¨Tœý.ÂÈê·ã Yc`"‚~³`È&q$ÈqÆ $í·r¢‰>„Àe0 àøäMÛã[ ‘E‹gÚ´–…MȼCÆö<<I,¸¯¨$_vø{åázÛÔq?ð`Ñ៴¸z6W¦ç ¶£€F: Ö@вvMغiÿÈè¹hñ.Y<óK‹Æ`Höåö±¶zr)”-(ŠBaeV˜wø.Â"4:—¬Þ%cð`Fš3º ‡ÍžKfïV¯¬À¬¹ á‚ɽÐÐ ›'³Ç:ŒþèÑ¥²ì”wß‚š‹ÇD)”¤sxE‚ ˆo¿7¨]KâÁ+ƒMðUYÞ§òGT=§Õ§A§ªÚgñ;ŸÜYè¾àÓüUÁ€6¿õ)ü ‹^mol£ û•>¯ÚÓ¦é˜ôO?ùÃSªà€GñgOŸÅï~öÛΪ®îªH¯¶ÛUÖÒy’¥‘påi˜‹_ëû~~-•‚ã(ƒÃa×®[]kAróÛ$¶'OžÄ_Ävø—«W¯fåí‚ÃJa¢t:G( ÙMgµfìýi…égróçÅÆ{ÅÖûŽ›rËÍRÃÝ#hXPpÀy²4r«ÌrOnÿy©áŽÜv\¶›@kŒ¥Õj㛲a¶ÿ™¶¾)›ççŸ^ÿ ›@°˜8Êcìî? šW æ “¥éŒN«Î˜©ÊœÖdÍh3cÚ´µdRÅúPç;ÎëÒ=ÅœІ¾C TMÌÇPÐÁhkm}ôèQ"›¯&4òÒÝ߬oýæn¯\¹ÂA¹ŒbÐè(…UÔiZƼ çÇÜ 1wýX§}Ô»[]@â—‰‚FFGÆ`I“ò”ý cVãÏV ž‰ï«®m¢ `#´<Åwcô·~ÂixMŠ$42â´Nyê&]?ˆ¹ë¦K{Ìî…ËàÛ¥FçE“çc{0¦ï3t¨Òò`ã‚2%».4ù~höF–ô®ˆ²žOÇÙÎfbæòjÐÎ5£o©9P$ÚA2PœÍB<-˜nñ-®u $x\¶ø`Tp¬@2gpnõ:ÌZÝKvâïô®Ëf/ ¶¦|º¶e0C˜ #p:4ÊËáï:©8¨E„¨ì©Ã¥Èñª,цÊ ¿Ì Àéˆ>ýÓJ¢äÞßÇýÉÝñΉ¶ªŽ®*wPê,>ª õézýeþˆ¢§[ÝëÕ>°üñÞÃøJü«øŸ¡.ýúwÏÆípYDêÑEÜÊÎdi$XÙP†½Z·zG…8J¤lâG]Ýxãÿ(7ý‡íñãÇ›céFlÿêë¿øºÃi`cŠ¡))à¶“Ivï”/Yî–9~Qbü¢Èx¿Ôv¯¤ f€C–‹ð(’D|Qn¾»Çð¥¼é³}:Šq)6D`&Ž_¿~}ƒ"Ï×ÚËIá[Þ6'Ê™‘u:ãQLŠ¢’ý9ó5’¹’di$g¦jÇ´*s¦2s¾R6§ÍÈ%1uÆâ¾´éš¬Ô¹ g¼Í@l‚ýWêËý©©ôŒãÿA§»*sÍ9É DÄÛ¸ë e! à] ¹äW$ä+á"WÈQÐuÚ®Ó™þÒ®cí.[µí®?u;ÝéNoc­ÜIŸC”2»ãuÃhßyæÌÉ;'ïóœ÷9ïóý<ò ¸4§ ¢°ðÐï¾ú=œ‘éù9!Ä¥ÐâüBXÙWÒ±‘ß_ÓQÍSb)MÒ1˜WRÅ.ÖÐçhrÜÐ;~brƒLK/ܾPØp‹u Uº­»I'qo|JuŒÛÜcvwo¥{25š& D„v—Xƒ¦Kžã¦di*¡¥·Ý£Þìø/¸018€F®[]£œk€u®õ>> d6dÔZÛÇñçt'3èø÷ LA3ðj8&ÆQ&3é€WWÓ qûs¾ìeÉ Šø´~ož$¯SùZ­«)¿Ùéöæû¾øéàTòYÁ¦çB³s&‹B«úWèÙ—ÏîöÞme[/æVûü9 M¹­mS­Æí)ôý¼ûÓ{}Ÿ¹t|¶®!§±AÓ\—ÛT“å‹xsê šø\~—d‡ ЍXDÒøŸO…Vµ~/9!¢cfffõÏÿrÎì²®,_îÝ¿_”_@‰0JÊD¤Ðªà¸\LR>øtoé£LöáË£n*‹ Éã,ëãì£L \#E#O3-5¶û»ôI©#”uïÞ¯Vô:|bôCtäÝðF+ßÀËÈThñXA%d ©<ž–81IÒ%Œæ)Æ4ñ#š´áÂ…jó1ûdrTÝ…‹%EàÔ¦¤M€÷ïKÏ if9°ùYáLÍÌÏÀ)û>H‡Vqc¤ÆÊ‚+ŽàhOM=„¶ ]ÃPR”$â6«3iÎ:9£ƒ“mŒƒO˜Ä1Å&&&–¾‹÷+dþCÀ0Xp~á7¿~b*”hú)Lµ+ÅÚÅ—†AÞÔï,ë­y)íw”öUÌœî¬4ðgz.šGÜÅÁ‹úÏ‘¦Šm»¶`è\A1$‰ HŒ*6­âxz›Ø]ÛÍ@«;l@#p³Öj»µE i›IÕ]×mí+Wt°©˜Iî­Tw•ËšñÝöä6ÛÓ£ ±h³RYyBÞʪ;+v¶U¦Š~$Å1 “‹%buœºÙ 4Å´Îäx‡0øA’$ÎH†Æ°\´nž¡Nª.a:‹újgß6{¼ë4Š1ܶz@ˆïp>˜_ž©È9ªˆ!nq’ÜHÊÚõ•·8ï„‘‡Ç€†Ì5ð䤑r8ýa¶#IŠ‚,¨¢Ék”+ôYǶîƒ4Ii €‚ĸB •0AÎÉç—À3 ý`“œw ì¬ 2ióÀ"`Vw˜IÖœÊLü'6ïõ2+ÜÆ •„aRT‚£2%ɳÓójóœ,wKî倶 Ä¥q„Š€”{r¼¯Sùº¢zg¦«óHOM–³ÞXšz(4ÿüË?–¦—kèÂËâ¶´(”Ôo¿úë­ŽÛe—«rªwv­?×ëÍózr\uàNë äúÁ£/¯Á¯kŒx>rçxuþ#[ŽÉEr1ã¸È¤×‡ehu_#µGBK»ÜZ‚‹à¶Å¸„¦€ƒM»ycbÛ–m ìØ/óç&Î3ŽÿNˆ-iµ÷®V—%ë0ÛÛK¶$;ŽC‹Á²%Y²d0ø”o|`Ç'‡ï3 ¤þÆ´3)%¡C)G[Úédš63iI É[’åí³VPÒ¤%qŽ™vçÕ»’ö}ßç=¾ßσƒÎ#¸4†’håL…n˵¬ò+é%@# x¸á¹‘æ\+ùSjéål÷k ©¸!‚3 ³'ïÅÐâbd~¢f½æN÷Ý^Ÿ‡«È£m8üö/ÆÒ j$*£:‰j(­h$a¢@;žk˜~!i²@_—ŽïVˆe1´8%hVJËÀ]I¼Äëúýï cZ´\˜_^=]!8IáOácu;Ecù<™|ýùá®~t¢ ‹™Ù‘Ì]iÀÏ*L…–ààw€8!f)aQLFQÉÉÉáÏ û_­EÇü‡ºÂ—WßyW.ã S#X%ãjy+~¸’é+Ó÷û”e6† )d¨R©Ô;·0;µ¦ –³îwÓï·2ƒ^í ·±×ûtM‹$qXM<Ö ä 3 ¯ì•åïD5 …”ÜC¬Ã%2» úbûÝõ÷E¾w42卯PV?m?:[Z=í¨˜+©t‰—P(C‰h‚I+² &ÊjÀ©Ïí?èدÌÙ͹ëk÷:1$Ôjž("&+ýgíÕKë$Ž¿\™£B„©Iâ‚|会_4æ©vÖ\(oš?pôœ«~ÆY3n¯š÷4L»ëà{Àhü¼£î|Y·0çÝþ©ýG.T´@˜{“Ò´b’°”@Jú4ËÈ ¶4æÖ¶Z[Úr:;2;ÍM­Ö¶&k³?§î$m¶ö/rùK`CSF[W~OUÞÑ;Wþ (g˜ü1ØXÖtþ䛋„tn‘,ð‹pò«þû ÿÁå÷ßj{³«°½%§¡ÝÜÑlj,iÉóך5B³ÀB榵¢‘N[«·¿ÉÖæË:¤’hhœ¢”ÄŠŠŠû÷ï?*’Õ¿þ¢õ¨¤xÈñÂB¢6^›ÿðþÇ ]]šxƒ¨hH8T¢ÆƒŒº¸>€ä¦É 4òëtÇ­çÝPn¦»ÖŠFîl·ÿ"ÓÁ1$`„œÃ$è¥w.ðø‡fbm'ç{zAÜ¥_²æ¬!(K [³vÊÎÚ’G³ S¦ã–äÓyºùBí¤E7‘aœ²ÄOfçsµ3–¸ “aÒj³l³ê'3¦Ìª‘ å¤Iý†U=›“0eIÉfÎej¦sží+PænSbø%!Å!p·Ùl—.]Š äQxlæ2\ /ñÁO…þ‚ ®¾ó¤áF9!Úô(ÔWB|0$ÀÙ²ÐÇž?wá'Ï¥¤ òI8%•À.•a(‹‘„#Y„ÄÄ,*¥©Œ¡Ú[Wçvx„="»¸<¸¼ŽLs(ôX%$@{PøJ8\‚0ÃA4|ø£¿ÿm ½Cލf&1RIsùÞ¢¡*Çh}éH@Ü¡<)Š|I)­-­)÷—×=·/[Ä¢$‚Äã,ƒ¡Ìß•Ø]îÜSjðp¯—‚Gk|ª>O´"ëu} ”¢ô*z4‚ºº× ¬¢îtþ°2•³Ç‚‘á± }!–Ò,+"0AŸJTÃGŠÄ•äÐ8˺~!Õ*ä‡÷ú*»}Æþƒñ öhYiö3껡ËÍòáÃÞ”V¾ØFìHâXŠH •œÜ¾‘sÙtÝåÚ“‡¸ÿÓÈ*žZËæœgPÁ±$F=骙óú'ݵãî°ìywýœ£fÚ×°gk&ìy1‰+)6•Óûêg<õ@5@€如ZÍÄJe8%CðTMb]î gõw׬ÏØc»ènÚ –1oݬãÈ9Ÿ¨ôp†q…SM‰p”¦!cÃÞä—šÌuÇM-mY­-¶ö뻿ßÒRgn˜i557›G^Tn™>àÃg{ÏwætÏè˜<6ýÞí?F@Ü.ò‹ ü@З»×î5® r|Y±¯ËjjÎm¯2ÕdjvË {CŘ\LˆñÔ-Ûæ'f>¾{OÈ= ÊZUöåÕ©¬¦y Ñ¡‡jZUØH‰¼õ¨kf5·‡?ñÿEJø×÷ÿRôã}4Izg 'CÄ¥f¹q.­èzºûæçïv{ßM/þ•Éq#Ë{˜dgÙ]îk;]·2Êogz¯¦–~uÜ4ùn¤¹nî*»žéþMºóNºóöó®«YÎ[é>a›pd!^̱,Ã\ü/€Ç¿»–=~¸òó·!BÀi"—h;3æ^ÐŒf&ÎXu£Ùúñ<Ý´Í0c1ÎÚâÆ²´fý4ÔóÖÏäé', “6Ø~ÒÍ[çlÉã–Ä3&Ý”U>kÛ>P¨)Þ$Ò‹I0r0nZFIP‚étº‘‘‘ˆeG÷Id¿---E–#òÙ]!á4ño]üé¦)¿½q[ØÀð¼´ü•®øg••0t³ãYæ?ùðEEE”ŒÆQ‰—{’¢(9É)PŽB9)Æ)$誣å‰H¤2Š=äñݽw—_mlaa!Ú¸p˜VV¢² F¾YX\ð|ª©CY^ý3œ5¨¼17¿)9GPV‚%pJ46S±Eµ÷ ‰@Ü‹OU?¬-ì?UU6Ó¸wèpÉÉZß°ßTœÏiä¢uë@QáŠÅ¤LZ’®ÉNžö0®¤žò¤Ÿ¦Ç­ôrÃ^¶×þh>xð»ðpO„F”'\ú~_ÂÐA’øf»'ƒ~f}\J¢>íÙX%ò¢AfŠs%fýP%Ûï†Ë-ÛpTJAQ1y[5ƒ•Ú¾ M·Gq­ë«Ðµ8ÝõëÍ /~À—\ï@’u±®Âh h9A«2NJ¡(*Ù¬{¥Ð8øOöë=¨©ì ¸3v¦ÓéÚQIî½¹$7äEQpuëÖ  ! ¢[ò~bWy¢‚,‘÷[]ÿèLÿén;îè*¸kw}ìÎìhwÛé:³uUH é—Ä¡ÖÖZwÖqºã™CæÜsî9÷žû}¿³÷•Fþ{2Ú«‹ÊèhŒCR†Åá¼Æ"tŽkkGµ5@‘}í¨±î¸ñÀ&ñJ@J2‚Y˜¸qÐR7P1Ö1;ƒSÛã:RbÙ«*®È)ñ¼e>i¬ž´8A/k^½eUgöx†´Õƒ»öOêÆõv脹Lš]Ŧ â|”€D#âò Þf (òÖ¦ç–ú¦Ü†&eT—ÒíÈv=o–we7¸s|Ô:»(“E‡@Yl?­ »Qàà ÓSÓ&‹ƒ“ðÈD‘X ÉåF1Ëâ×ýN–0_O·\KÖ}’¬ÿ(Í8¥0^I5Lƒ+ Ç­4ÛÓ4r)Ãôi²ñzªéJŠ>?I3L§ë$gÚR¸<:" Xè…Î';÷ÝóÚÿu >Vï|(¹ûóÔ¹|Íf£8…ÇhdqC[Å™² •pD™Ð§‘idCyq#jé *n([6 ‡Äd‹ú”±#¹+‡ò%'3eýJù J|"íõþÂõý%bWOÊÁ(´Ée&ŠÄhœr»wïÞõ‡ÊâBZ4É“Nýôêõ¢¬B!‹æ"TÁ–­¼s¡o<÷|ÿŸO܇oáEîÝQ¥¦ÁkÂ%Ù4ŠPÎAhB˜¡PýØ¢ÿQõÞ¥VZ¢ûYjVDL"NŠ Š'DqN$VofJúԥˋ£‚©…¯2ÿ¯Ö]Cð ¡Kß–EþzçΡÖÖÕk×’Á#9p¯8Š,_Æ•pw¸¬»zêu½õa~€F † ±Øøj÷þ²S´}vm_½®»®ü„kÛ¾R\N‹.Á@Ä\>¤’È5Rqͯ%íQ‹AЬ•w•CZä·›Ä={…Çl1-ú„Žòž…;­aÄvÚ?P$0’7Ú+„m& &V–°âcP“ÇB™RZxÔjâvÛbÚŒÔÆDA¸‰‘]±EܳOÐbŠ?V)n5ƒFè.Ýmã·è'Ë宲˜µ‰†BQh„A°Y›Ïí«D+kv¿ÒÈ3ª®vÐæXE  8> ßúË”cí¹Rû9ƒ@2é1Õ˜3 ©åLš¦a:b&Q_P:šQ8Ëj«GK«ßµºÁ-§J÷›ê&ÌŽñ²š³eö—5¯I««o÷þ ‹ÈØˤ±Þ^`#|.F°0ˆ 8' 19«ù –4PÄï®I¯ƒ4ÝœsDÑ v4h*g“º 4R£®™hf,À߃À鯱Ž}íþ™`lñÏ~è®N_… ÓÄ´¢Í 6 »,p×ö³0P$¨‘v‹¤Ã 4"h5?»‚m€·ËL÷V`öbR½åà’JaOqT'9Q#¤³×sQ ”"`’Ùqd‹>æx¹ Ã&}Ç&íª±¼~¬`Ã+LŠDaH4ŽQkä|ç®Ø6«Ä£hRxl26’Íd2ãÕ›_iäY[g?krnߘ žƒ½ ÅeÝm80YZÒµ9Oí©ß¾^‹qØ(Æ€E¿,R¹òÍ~Kݸ¶ö´¾nÂP~N ïBLõ0Ùa}m°Ó\ÿ²æ€aŒ”UŸ1;ápÄêSY“rylЇ8“Éã‘{ :9fCU†­Yãq«œ¥Û­>’µ;ËÙ¤r=o–oP5¸s<.µË‘é„¶+×mßn÷~5ûÀ ®7§n~ùÙ—ðVç^àì;¿±4h@ U¹UæŽúûAMScVã‹ÖHÐZ*7\Ý• èò4¸“U¹óÍíRRL384‹â¡$Ü+ÐÂdPàX̰–QœÆ9kV¬.)ØÖq¸óâ{ïÍü=ì„°IwÈììl¸±˜;ïôz½ÿ¾Ïý¾ù9¾y¸Ä¿}}äÐa&Nb<¢1xROœLe‹ÚUð‘Âôa–i:Ãôy’ñó Ú†)¥q:µôi™R¯&ë0о’i¾²®ôšÂzzã6!^ ç<ÿãû€ ÌÎûÞçMk?¤7œ%ý’­ÅhTÉdá D¤Nˆ)¢G3dýq#jÙPž|°@2¨” ç‚C ®ÖăR†4‚þlùX>ÝŸ%Ö¬èÌ¡w$DJ¢YŒh>‰@—ÿƒý2mò¼ã¸Û²vꎊr8ö{~};I µ d„ÃNœªR!Á±ã#$!BB|ƹã$Nœ8IL.Æ¡iZÙþšz¬[§uŒneÚií6mÝþ˜Ö’Ûû½6¢¬LˆÒJ=~ì×zÞçø=ßï燢12–Ýœšzþ‡—>†ÝŽ€î<Q‘ŽFK$Øç¢‘à°J¡¤Á¾Iá"ÉHQRAb*Žþû_þ^~ÐåGÉ „Á?þøWmZ:`¨¥‘)Õº»Ötô=å"0+è™øæßæx& žøCk††×¹]ä®\DD‹DBŽAŠ–Keï]¿½2Ÿ¡ôÏÐûbdÙ¡©Ù|m¾Œ`i!"ãB€Žá8JQ„T#Ë9¼Ç:ê*ŸtÙö8± ,K²É%’h·5ä7uå··f{<™°$yP^޶áxý¥ï¿²psÔuiaÚ¨€ß©ç÷Vû»=ú}^½$óŸÜ|ÿ2(—¢IP$ŠK7¢2° ™/‹›Í.ý¶ö pÅ.ËõÝÖ+éå—³Mw£‘_eZßÎ4¿³³Päµóµíæw³kËã·‘(Ê’$nIA ã|äìÂK÷ZÅÿrYåñy)r¢p"7®]g0LNÑRBÆJÐxwÖ¦¹=‰gò¥ÓùI3ÅQVÊ&QOèUcºM“E©S/ÐSE[B/m:–!NFPñZ%FÊP–B9ŠCUq\GwË ¼$zAxú óèûïˆ(DÃì'?~ssr K3ÀË.ip #™õ­@¥ê„#D¾Î<´;#b ²ÌÀ!‹ãŒ˜AXqñ¡¯wv úÇžèûª/ôdï¬ 0#œz<0þTÿØcþ‰Çý³_é9/è™y¬d]©AˆÓ2t=D,Ì€äòÛ¿à/Ëòʿߗhä_½zÕår)4ÈàÞq8ÛN£(†Ä ®Œ“˜öY–¨£b¤Á0ÖXvºÞxÚq›EÊ‚ @#wþø 4rº±|è˜q¼Ñr­‡Ö2ã) ¼lœi©¶o+LgqT"æ-ƒ`\D »·ÄŸ<¬åFªãƒG“üÕjŸE1xäa»°¢Ï Ô5 $ªÀ‘hUôÛT~[¬¿J dâ·rKƒÕK²@Ul—yS 6Ñg‚R´ÈD%.ƒ'Š„1tÚæCQ’i/[³7qì„ÜÇΫ”/¿H“DÜzYZž÷\“ ËܺóÆŠ?¢‘ÿæÚ•Žs&û™jWFìfÇá¦ìP'¦îH¥ ¸úèÏ7à @#áå¥ðüRxaq%²Ýpâ ·¦±²r›K÷ÞûÚœ\È’xi")'@¦¾†Ë×fé…û7°‰%ÝÈŠ®}ðáý®bò6ÿ|Š"‹‹Á`"p Ñ8õ «¾dx¦3 9+L ú'‚¡ 0!èy¼gôéžñ§»‡×t?9ð=oF0>ö ‹+AcÁHT 凿ÿàVHó/[öç~öÓ·ŽØª29"ØOã$ŽÂ~¡b–¸{[ñÑÒ£ƒvÓP£aÂQ:ÞT>Ú`kªž4‡œ@&Qö Ï‘F,ÃðɲáúŠñ&ã„^}x´¡rÒaª7L;Ë&ìY潜ZŠ¢b–¤9 ‘˜<5Va-ŠóYÁâk¶ Ë{-Ð3hÕ@ Ñ*ë³ÄÔ*z+•>“r¨Š©â‚6MŸ%Åg•ÖÆû¬š.3Û[)®I®£K³6ª9 ÈÆl2€‚$µVAoóXÔ50>üM¼/§ðøŠbÏŠ„Ç‚×`, Š„‘çO’~D#÷®à×€3f{}^‰ £Ä(*ÁÿÉ~™µq_q\i“´™NÄ]«Õîj…Œ@§ë£®Û1—@HB`ðE|`,¬qÔõÄè¾vµ¸Œl0â0‡€8™üÑÌôδnS§š4q2Nÿ©SROíqgZcNõ- 43=ÃL<žiòӛ߮v÷ýÞoßï}??À&_*@å„–¬è¤çEŽÚ@Ü_·ùLjh¼É7buÃé5“gÌäõ™4:oÞ0{!ÞIÓS£‘©F 5ÖänÔØ.UHxÀ H v‚)kY³ßˆè™°!ìÑû“ÍTÐaCˆÒR Ë¡ŠÈºiDCÑA¯Á¬¤©ò0]ºð”º>þÕÀ"PÌ——o_ý¹¿ÖÔù#ºÊÀ€#Ö©Žb´A@À!ÆÐþ¤i„uZ(¯ÖÔQ!Ãè#¬•Gh-WÂ5eÐ[åw\®·±¨þðÎC꜒mÒ-rÁ& r[Ì–G®0…>h9/Å%…û ¦§§ïß¿¿VÞ“µ} Q’§kò Wnþ<ÆÀ^Nçàox²§¿/G™IËy k_ÄçoF ÿ˯—™ÿPl¾¡~$ü±°á–Ú2]·Y>Üg½^b>š¹-U˜‚að*Q‹É .`Ø0–‹æNÿÏ â^`¿ÂÜû©fçæþvû¯l">)#qLøB¾«X.N;¢&z›óºšr.ØÒ–¾$…¬ód„ì˜FU¸+M‘UH’*dÃ9EE€PO¾¦‘Ç[ÜâmòŽ×ÛÇ[ür1«'21­4>—8(˜NHk‹uý6×Ô fL5¸Þ²‡ìc­›'Þà|Óè¶y†­.xU¼Ù?fõŒ48€OâO/.˜íË'zhG¡LՊ݆ÀrNãC ÷ªö¾¦=ËT†‚ÚD¹*1xHüA Jã¥5~Z¤tŒ_Z¯Ê3eð Ÿ>@ŸS;}G»¶“Ñ„#zºç'a ‘ù³›¿¿Oê28Z?¥‹8tº†qkÜáJ:¤§‚ºð‰¼?aô “è0|BkhFË„4á°¶ÝWD×_èÐu‹$P ”ÓTu¨­ÒÞPdÚ¿½º$»d³*€D‚ˆ¡` @¡ÒA£Ñx÷îÝÄ*H¬!G$¹råJòtvvöóÅÿÛÒªÃü÷δYX^R˜íJ,Ýûç=·ÛI h:Bâ<$-Åž»±XšÑ»³òVqã£hä=µéãBÓïKÍYoïnÞû*–š"‘àB1œOffÌÏ-°"‘X\X‘¥¯pƒÉiN~‚œ9sFŠ€8˜H€ï–lï«Ê›¬Ø>Rž?X¦ÖmžÚ¯Õ(Gµ;®ÕnA3dY)r¨*$Iòx¼­[·NLL|†©+Ì9¿š!,þAþY^XœŸK,̲$œ_+ÙšŽ#p!¢|åŽï×Z¾ý³ËœžèwÚãœó¯sÚ;7Jä$ÁÍLåb„âw¿}'± ÃË+Ž’xùøHɬ[Z^I¢ÙÖ„à›d¼¥‚Ü]åœHŒsqüÑ¡ç»ûŸ¹8².ãœnˆ²$(W&I•ˆD5ºC,ç.Ïýùö'•†j9š&M§ p(ȸ/ÁÑø†¬Wò ͵Æî×@úƒ S1Çz)¢®×GÓ€ 襾ß~jÐ~rØN`„v"å넲ÎSê ˜ ŽE†c@ËJ¿8xÀÀPå¡€&@i”>à×{ýå>º‚½“ÒR´–aôië šÂ^­/XðUx=垎ýt)õ(õ÷먙ŸBE|ø×Üòèï’g¿?¨a¾4ÀÐ1¡ŠŒ ¢½ª=XìП•1Ay5ã¨pBøª}#­w–w5tH†p (˜ ¢öÓ^½oÝ~«Bv½~W}©R‹f“aD(äæª²ßýõ;ìžw‰-ìú脟*#ñ¢=/ß¼þ›Ä"\K¬I¨ÀâüB²ø/­Šÿg‚µÒ’WVÄä‹w¯}°Ð!e`$‘"xeËŽ_Ô¿[Úx«¤ù£Ë­Ë{%–é2ët‰ùýbãû:Ëã_ÊZoZ¥ýP€ Rùïr¹ÖŠØjÿ«Ù’ž<&ñòÎ;ª ¥KsB97¿­ £¿L9eȈëTÿa¿Îcâ¸î8€«QÒ4Ì^sî}ÀrǧœØ‚Í}›8®ãÚÀÞìvíØk–ÝeY°Y®vaY.sØnÔ?Ú?ZªJ=þhë$­«•©ýÑRu*|ý #Q„j·T‘ZžVoæ½ß¼ÝyßÏL”+ÆÊÒbÕ©r8©‰r‘¾ñ”«* EGGÇíÛ·Ù‘aazWFfú+ì\f¸ ?Žå0é½‡Ë Ëó¿üUn~ž)R!Î#`û§’ùy•ߤ}[‡Æ·ö\ÞÒEB“HïÌóÃßx·B¼« H>FîÛ³—|aaœÉÓ/™¥2ûküä£á!W€Sœ/¦¤/ØÎmëŒ!=Èà(Ú°F^îèOÐE|Nñy *±<ø¾«wx@œBa$Éa~½0Ý4‘LïÊ;P¼`în1G]ú˜[3â¬v0Ñ?²1Š0c ÑÛµ‘æÚóš!àÃw|@¢±×F›cnÍP4C„ÖD]p–.æ0Åì–8 ³ŸŽ¹ž4¾n¨4Rsž‰9à,[ÌS×ÖXf9AÁÁCe(Ü™¤@À£2TÉšâä.ƒ<~VÚgLº¤(-i—Œ—LÒÈæóc½F";ƒ¦½Í52M1y2W|:Ÿ°”ÁçéÑï©ûm™>}Â.¥R(’ó±Dµx÷Ù“ò.£8bS„L­ÚÝÒXþ­C)òÓÏ4òo4bqOÕ5_©³¿ÑOŸ2)y•ÀË+ß9x´å¤nÐb×;¦ŒŒ&õö)ƒc³êœ³x`vàÇex[V•o'ôvXÞÙº¦9“3Öà´–O©ÄLކ¢$AàÂT2¥&û;@‘Îê‹Ú,B˜ .aÑ^„>×(Kƒb?€¤­ÜÏ${‘—ΧY´ù½Åmí—*BðÏí•A°Š§´Õ[îuå;Ú+Ûž”ÚŠöiÿ4$ïýÇwas»õ›[î2OGéůK#ò×J –w®\‘×Wás•8m…ÉÙʬœäìƒÒ·Nî;AW{\%n¨–èÅ6XºÄÓZáÝè¼@ð«”vT;­%Öò½eo3‰Œ'€‡¹Hjbl|u‡Ï¯(–IÄx"GD‚0¾Wóù?>d´²Ò—V6’-®~]M«µ YU “’KË?ýÉ|Ρ,”Ëc¤ŒªaLâð/¤þY¶öw¹–ëùæëùõeëÿkþ$OÿóçoØ~›chÛY˜ÊÁ…B!dAFFØfÝì«Aùx¬.ûòštD()æ2%-áàøñÌ1åt•b¬jW \xP& Tº‚Š)>AææÍ›pîƒV‡b‡[¥ó§Üg¨ºü§ÏoÕÖš¥ ¤ çråœ×üWqŒâ¼•ûÒömá‘çº'h£³[úâHï$Ò?õBO éôð%2\„b‰†ŽÄØÁYJý“¶ÿêXZ •Å%¨Äf± xP¿@£ß.E#[C[zF‘ðÒ3ºQ ñ­ÝÝ;rK LŠÊIìÛ¯(ø$ ÷ W ÁñE(ª8~DßÕd‰zôÑ„@Ê:kã.mÌœ0FZ6ª‘šHxC;bflqÚuhû.è¢M†q DKMÜU3êÔ9MaWè‡ñM5F¼º¨ˆ\1Œ8Î 4'½O¿6Ònòj£vMÔQ£­#´iÀy¬I'K•I¹<5ŠCd‚×/¾ºçë ŠQ‚ÜÎI–* °•ü¨D oä¾h²n@ǑОFÂHGéBú&Pì¹0$~äÅZÁ“Èð"J˜¤Tݽ}‡ü?;Ø+e®ziùö—¥R*–H˜Ÿ²ÍéC†fþi¤w Eaö kdpjKxòùöwO.ŽbŒ#‰DJA ù7QŽî'GlJ× 7kãNã˜[aNyÒø0&Lhí€aà@Èu*t>3oÉO¸"’‡¡Ì¦”©–5ƒ˜V ØdC6UŸ%õ¢)5ܰéüX×Rz,É¡zYÈ(´©™òRBfu§1½×&´âa¼U8ŠJH † ù@V‰)q®€K¤)öy ²Þú” á™FžÞÆÌÎ+ÖÖ«F7”üˆè›Æmô”•¾j¢guŽ™Úæ«:ç5 é×·Àç›VªÕsÅæŠBlƒš¯Ú¼W òº–[ë?Ø/ó˜8®3€¶“Èjz$\»;÷ìì²^Àll\_!ÁœæXc.×qms-{€m|€aïƒ]./,k0^––ËŽsTîmÔ´UÛ´ª©©µi%·jSEVÛÃö›„ ;X"ªd©ÉèÓhæÍÌûÞ1o~¿9Wz4Ušè‘—à&Іÿ\Ƨæ™:0kQ/H`wYE¸ÂÐ)Çåý6{¾ ’B' ¹£Ôa­²´*ZUYêïm¯R¤•(ÒKd(ŠÓ‹Žì>ÒZz̤«¢ÛQÒeÌ6C…%öÕ¨ÝYÐs¾ðüÛcoç‚ï_ÿ½µ2„þ¼5ÓU)´u–t›r,]»A™ó5;ãv€À¢ÀqÎZ„Ñ ³8š|uûaÛ!«­ÔÓUÔ½†Ç¿D^xÌÍ’×aÉã†:eSØ!”9u©x $bg(=îÛ$MaR Á0Aá"R±,FŒÚ»{ÏÞ| ¸¿°¸p*ò–iÅoë/$ü/§{!ØÝ¾}Û Ó3 €2„H$Ki°£LF6¼§â7¹êÙê÷÷©ofªÞËRéS÷(€ô‰Ü•ñݹ¹¹•‰àðôUÖÞF‚¡¡ø|X‚÷¦g¯ ¸”`ä(õ¹ ¥þaš )š¢"…ÜË#oÔj]æîY ú¼#¨P5Ä QáÎýȥ⾊ €ùB¹f×l#î™°>ð™À·tLšf.ˆÀ²pT¼;µ¢­öÔ˜E=ª«¹Ô (¯7ÕëÀjBQ}ù<؈jtm*(ý†šQÝq¿îø˜±zÌXë7WûŒÕ¾vÕˆñÄiúgo|t÷ãÁŹO> ÍñÂÇÁÿôüx¬!`=6Úþý¡sj¿î\Õvüœð@Û”—Û•P2Ê¥QŽë«F[¡#Yõ¥˜ÃQ‘§ ~9e­ÌÖ' 4AÄzOᮺ§®„¬_ Ê$»ØÈí=ÚV~¹Y~ñD²K WÅ5 çRûšâꊿ$Žd0¾o&c˜„H4žb^Ìß7 uùÚFžÃD}ûTMÛtm;4JÞåË psweGÁª@wäv:ÊÆC†® /3™ Íæ\k÷—€/ŒîÒn}ŽÁZb³—ÛUÙ*yT…ÃJ'Á °%ŒKcZÊ0¸ME7Ý{ÄpPæj9g#Ž¢Îµæ…Ç-ÅVÈë<à€±…!…‘„áÕ•èN6¥³[¤8ßX±˜¤’R! Z”™˜¤Ü™™%ÄãY E 1Ø—••ýöÆ àÓ½…‹!¤–©<¼øBa+™WB!„ö¼“ܺu«¼¼œÂ–ƒa$ Š&¬ŠO{+«úÝüÆ›Í×rªwDS$в2ø­AgSËuòðâùûU¶‘àcÝŸŸŸ.Îß]\غç)+ $R A8…ÅÈ%r2 yªµùÿþ'0=8ÿy +ÕŽ«‡ß–B±¸ôÓŸ¼s¨² ¾ŸðÆJ£"cd2\^Rþ¼Ý¹¡ožß@\þuüë܈gqÏ"}3aÓˆÛÿM×ø3}ÓÈÀdpt£FË¢q0ûðúÅÉb?üÃùOV¾mü˶0ÿàå—2%b´V"olnA\“È¥ka½#È ÿ¹ 0×äZmäÙþ™u®Y¤k ñú_¨©§éMÉH%b1]Ó¦=pj®ó·Õ·Ô\jSNØ´^£ú²AíÕ©Fô` >}íH{õå–µÚˆÒËiLݨþ¸ßpÔ§;æÕ×z*¯åôHÇÕ÷~t;xçAp~iá>ô–Ph ÎŒ³î#ƒ- 3˜ØHÍàêy}mu>¤¨÷¶CÔ@#}úc£úê‘Vͨ±Þ«WÙ*uÊÍÛ’%Ba ŠÃb“R°[šžº2ÙÝ$÷4I¼'Ÿº~<›T·S¾™„w›fÁÄ"ZB°2œÙ)Ýz2¯ÉQÑc+u9ËÜÎÂŽ ûm ¼4!œ:y3éT8Š«¹Äb*3ŸQœ)ÙV’‚¦ÈhèɱŒ¢HŠÁ¤RbNéa~!W"–P”&ï¬ó`·=oUš÷õrõÖ «¥Âj,4Û÷;zJ/X Ìÿ+±åÙ:KPÿEó6fk'¡ÅÐZ–fWþèo‡o˯~þ y\‚ "JÆJÅQD½„ÁQé°æÛ»Šz`ϫښÂTl´°ÙJÁI,æ" È #ÔÑêÚ*ZSˆäX\ÂâÀz\LÒðIOaXwåÑ9†~ÝÔV±%EB Ę ¥%"Ú ëå\kë»w¹áCŽû÷ïóà'Ÿ‚ë3šmn¨ƒê>”Ú¯¦ƒ«ø^_ 9¯2ƒo =rRežn2袜U1ÓË9­æøU``µü<«µL6Á@‘HƒP$rØÐjß,̸&phiIœ/åKR1!hqÕ¶wÌïX<•.ËnÆRlgdG™ÝUb±Ë‘ì&™P$‰%Öb³MfuV;˜jSíÎ}ùdÿ5‚ñ„‡sHFAsEò y# ö ¡iŠÏÇ(6ÿ éõn½ê©ªí)u;ËŒÜ(b/qwïéqÈf™éyшó-—³ÒyXÖþýÔ­ˆÇ"œ‹ËÃà1(61$·nü¦`Ófã (LÄá•Ète' î2/ÁVn_ñ¾á³µÔâ®pÚ¡EJlîr·£È GK…¥]Þš•’™†‰pœ-àãÕÒœ§?®óÌ·~lu÷×Ó’,\˜Æ%E8pð¼¼¼Á¾þÄ|"‰‹‹šÙåÇ/ %ÒµXéÒÉØò{–Þ>ÑçìÜJgBSÆåa!‘ùëy;Éô. ‰ã©”èÚW“:['×LŠæcúÿsss"ü?6CWÆ V Z•ee<ŠKx:!Ü Lݾ}Ë»ÏÏ'â ~ö9ˆ¬ñ$Ì$qqiÁ™ûÿö¸Ü¹Ù9<œBÕ$íç`¢”ì‚ï¨[¾10¤ñbÿ4¢ŽþB‘¾ñ%™Zã›Z{jìÅžaÖ€ŸÕfùÇYÁ VOäß9`•u}£¯´ëó)‡¯ëÒ{“_ȳGÒ+Hý…sçCHú2_–—¾Úãg….°¼pcu޲¦Yþ•ÓH Ä:d L²úÏ|ëTèÛmíRÓ%ØkRžˆ¿‘VLõgŒF:šCzõ˜íЈmØx ¬MoÕ7"Å?‰€d…4´  •£†¦aƒó½¡ÿvó“ÅOç!?Qxãyø{ûî_Þ½rù?‰x ñIâÒ¯®6õUc¶†‘“ð *Ì`<•vFU{õA¸ w6›F͈±.lÚ?Á(ÂfEÀ ³6Ž0{Ì ‰†z å•$É4JIÇ·ç¥uì[uüxÂrú´é6éèáŒ>µ´O-´ýê[ê€FÒ¯ÞhO;ÕÄ’ëk÷5ÓÃZjX“׫ÝÔÛ’Õ§Éô*³[U²:›¾¦‘gÛ´ÂxFiê˜j±ži2<â…tÈ,É-pºj4ÖlºÐl†0N«Í“mV㞺 ³q!Aòšà`  €aä–ŒÍòZ{y'#wZÊÎ2[W)2k™ÍPùHCB€IÀ`ê©ô:d6W•ëØOŽ–JK²7dI0Z(¤0! ¨¢Ý…]nï/¯}øç?~ôÛ›·~qùJGsôƒÉ&$lBÀ‚\n®ºHý ²”[Aú=²n[¡Ó)·Û*ÌÏ‹F:å]†}Y^I*—R$†¥ˆEôÙñ)¤âñE¤Ä`0YLLNF ÖÂõ ¿¹ÜxÐ]íAlVá´î±­xëb‡·ÌÛYÞé,q‚ÁNѤ´Ó]âWÖÉtÕß«LO‘@·K‰)ÆþµÎ×w=è0Ç-îø ×gú®Ûz·ªª6£Ä0ð8JD¥» ¯_¿žÄ€¤Š}KÓÔR4G¯‰:ßÅyt|¬}p}>Žªë½Oï·;*$ˆ,ž@ò]&àQSQ–9_Hî?p( 2ºŒ=ëoròõX>’ñ¿sçŽ@ Àq<##Ãét~>; ÉH~t`±yHF® ¼L$f‰Ï!?èa¸<7Ÿxøþ¥+?xc'—³.ƒÂÅÙ¤D"a5œ|…ñ½ê;0c ÌŒŠ°z#+Uÿu?’¢Tšer™Òܹû3ó1D«Ë±69¥8ÎGãQ8ùYuM6ãò×Ó8ÍÒõ¬q®õEX, ©Åþ¼à›bùFÖöf œþæà8ëÔÈÚ]UbÎz‡ö‡ü©¶N{ÚQÔx4†Ÿªþ+5eQzÞûý?>ZJÅÂì¤c’ˆßúçmëÃ‡Æ —ÿp å 1øC{¨³)l« éëG ê1F25„tÏËm¯áõ¢m)B4)©%%i1Ÿ†.¬Ú±ÉVŸÛ¯Êö©_÷·n=õi²¸#eЦûÔ™ƒ-™K× VW¾ôöÕ ‘/›E4 @ѹf…ë!¢ÐO¨MZfBuüŒÆ8©±œm¶ûëNØQ,¥H¶ˆ+à³ùd %æñy¤„›^]ð60FWQçÓÔÓ*w˜J­ž¯µÒÊÈÍî —³Äî•y¬•&m±º€ÞLœ„ÆŒ )$Ž555W¯^M,+\IÕ™ûûÝ{{«ªq.€‹Ú®4ZBSBåîfÛ^‡­Øá.w¸jL)ã”yŸuGÙÊíf™ÙQ|eµÉ¬ÞÊnë[NÃÛú½Ûè‹ASIÆÃŽ9‚$„`aayWF•JåÒ=px›d‹½Æn+²uíé²”¬˜Žœ•.¦Ô 0”æ’{’f/µwÉÁUÛÑr-t¦”€“GÐøâÓ»‹ïm3ï½kÎÜý@çüÌä™1¸Ç}7ÕºúÛd Nq &‹Šæ‰$‘²®ñã»&fç¡„"À@"·¸\>¢±Ø†,$ž2ÓK’Onܸ±oß>PÏíÒÜ|Qº„ý_ö˨©ûàOѶÛuvm%^’—¼¼жjѺbµÖ¢ü©tvzò?„Z× !I ˆ !ŠÓy®»ºr¶uëõvkÏs·»µ®w›[¯þåD@·ïËÃè\]ÇÞæï¾Gò ¼|ß÷÷¾ßÏç d„öÂ_ÿFss.qý¿¼"Š?U*Ür.\ nIÈ]Áø mÃã4éÂ~xöܹ¼¼¼±f“„D@BW³d¢¸èÍÛÌOš;µúoó!ŽÃˆËG«ˆÃ?ÏÞ7[ú/nhæ&¾ {v1*`Ų‚ÝEÔuƒºI§31 ÒÜe~RÌ5§³¾9\õüJ’ýŒãqI9¨È…m}-Hà½E«o¶ù Î~¤µs!(³g¾½ |æ©Ò·%-!“3™†Â+’üùóç“1ŒñyR¶¤d}qSžÙ6¨Ùæ£Ï4@Ð’c4nmd¢%ç`ý.[•"[eêùÜœäAEn˜[¯¨LCŒãjkÄF¾U5ŽéZ¯«í¿ÚU™“”Ìç.+„ Å.äaIñ v‹eèâE¸ØQŠ®¤Ýtà²Zà Ì:Wiï¦eÆÑŠ…ØßCÚ\‘DŒ‰H1ž°nye·¡Ø¯)ó¨J|sFÿª.Ó™¯¿RcÔøù‘oû?Øóá‰ë¡ñiú’§¿™ºqìóÓgþô9ô ìÒMŠzçhsQ·z·W]Ü£-íRïõ ;U{æÎF~v¸¶Ø¯Ý*ëÖÔx ¹Õ;cWÅ¡$'CİE„T ôŒ‘Ëw¤Åµ”É<{Éîš{yâAår÷¾ØÎÂ] B²ÂYý YÿðÇ#¹Oé/QAUЇ}Ú¾*¿J«Ü·J,Ç8,LÈòÙ¡P‚“(_·±bK•>WoØbhβ™2Lª4uÃó=š (o´e6Ӹ̲€Š¬{#M$D* a·PŽÇÝ3DOÍÛãÆPì.-aÆ,`ñ“>^š˜$`ŽláÆ˜—MyFH´¾E—Þ0W6¢ÍÒ›s-iMæ4«yk“q»qoæÞ2F:Œ2 C¥rÉW_ÿyj*†ìm‰ ˜™½£G—.IŠ $±¼å–r8çló÷' å$Ûç0äØöm¨JˆYÆAy‚rÙÆ×Ò‡ÍꦡFPˆ‘ÚÆõæa­õºÎ:\§¿T§¹ª5Ö[‚¬SÆö?¼£Ù—š*ÁØq1x¬ˆ#HvnÛñåçh Qc#£TˆºkG¾s1Eˆ@Þ0$‡—°~0`ØDÝó4Öw,¦t'œ ¯H©™0Ž?}zpýÚûÇä’%`ËDD"Æ?™û&bjE:ÚôFuøgˆß˜ß˜çèEì=ˆÃG¼½wÖôoóG¹9¿Å͉žxúi¹”„~y}{>“í×Âô ä Ò´iý«pÿá<6‹/_d´Òù¸Â9ÀHÏÑYAn³Î\‹±g?m#-È¡žèKÀÓPÜš¥ŠNí®n•«QÖ”Î!ý»ê*;5ï}vÂóQ™G½ÛS§ìù'ûåÛÔyÆñCl­ºJƒÇ>wß’k®©2Z P ƒ8Î¥¤¥1Hâ\ÈR.N|;¾;qLÇqâø’2º0©Ò¤}ÙÔ¡Ñh›¦îËVuK'˜J !äæxωƒM£"(|È«G¯Î±||þÏûúyþ¿×`éú. u4ûôha~*ÌÑ>Å?Æÿ]éÕTÙS}êò> Cu@Ò§>Ô¬–žªAí©€ªl@[>¨« jÏô›NÙrî•áB†“(.ÂH!E’¼$*Mºµ¡8¹ãtZW}–»1­£Vâ¬ÚÚÝé=›ìª}Þ^ÿâÇMmP_ám© ²J¯®.dS «F#¾&øq·Bì ïEÈôLÈ /-16¦çdã8_(Bϧú[r"*Ù—³ý\izw#ÝS—ìix­³!óRmÚó÷ú?ÖhäYâÓzãeeóPµv¨Á`9V£ÈÙB2|>_LÐ$”*A PZB¥Þ‘wö`}[!k?liÉo1€éµqXrÈd?d|’{Ú60Ps¡ÅxÄ|<÷x† ƒÐ$‰“""5=ùË/ÿ χçæ9YˆÌ/ü—CbcÉË–ø¢cæÑ´ÕlI·€¿§Ð’]²Íù*ðh 38õ*Ñ€1Ï)´”´4).þ,ë (¬š@ ”b(¿tMMMF¢$µ°ÄK±±dÁ {62úõ(ÃÐÐxŠ@r¾àœuå:ꀎ¸‹b›©À¬Ïg­GlÆbã‡o¾/&Se‰„„!$ü„ßÕ^˜1^z 6N4Y£ñ@á ǽ&37³ÖZËC•iRc¹«³~«·N°-U–¶ó޾=øQÙ[¤P*"ù"2‰D) ¸„Ü–ýZO·‡£àƹù'ybl×bóáÅ•š™›ƒg¹ÛåL²6žb,/éééH”O碠¸Àý ÿ5úÝjCù.@IŒ¡…R“Œfòwxµî<ÒåBÜ#q=Ã?èö!ín¤cà‡ž‘õ®!¤ÓÇqHçeŽIÜ`߃qîgå—+vÿ÷K}ÃHkñ†^ÎûH&ÞJ£()–Êd²[·nŲˆ1ÉbuÏùܽ ƒ@Šc¼’ãHG$×`œër@@ÅŠõ´Cvþ <îô!ž«›Ïêh’¿`Hrû;oÔxõÊh¤Ú§©hVËý+üje_³²· £: >Ù{¾ÂßQåר‡»þ9vêg€$žŠ]ý^%«0˜å66ϲZ4b•·šä`úºæb•|ûaèêRŠCŠ¢ÜA/ φ£²¡†¹ÓN8²Ì‚cé„q¥ìçe„@˜H|˜ûPÄJõØ­QÀƒdMEfK‰åÜþsY¨§1!LEê}î³mc*ã´¶ÀbBkŸÐ·Þר¢(2mpN¨m€(5-“MÖImˤ©í¶ÖtOmÕ8^´ÿ­É¤—çËø›$$*ÃAb’˜fÀàöï{÷Æç¿_ò¾§±uˆn(‡1‹ŽÉÁçã-ž[c’§1À‹}²t /ÉÜÌl¯§';3‹Àp¨b(4™• ¨Í)™›O•¿ììDºBH×õ®ÄéE<ÈçSÌÚ=F¿Þ5çFKÀµ»‡×€ÊFWè¥Î»ÿzpŽkç*÷®.ÿæ´™(Á£PÇsrrÆÇÇ—g±H©ós‘ùŠÒ“$äਘ&TÖ"ž‘xPÛ1ﺼ¾+´®sãŠîâê_©ž¸ö_Ä»6´"ž+Ü@8ÁW ËHŒ·xæBÉ ¦Ätº<¨H¨ èÊ!V‹F|lå ©¬ßpÒ§…Ûê~ƒ2¨?ДªÊû4öÿ8Gö\|5öp€Ê)¯ªz@_á,Ñõܸv'2qóï·VMO`qöªk‚,`¤ ï=9Ð dRçg+Ú.ìÊ{‡Â0’$y -e)'œÙ¹-õãR{Eþ3”§öy{ý‹k4ò,q­FfOáT2@NS”P*áI¢$Å{Sa-Ò: lfy‹Qî0+.™òÛ½Þl/6Û Œæ|£%ßÈñ$÷4ç9 …ÖOäç*Ê&Rš&p^F¦ô¯ÿa¿Üc›º¯8þ#iÍ:µ’øm_¿ó¦dZÐRn-y‘„°®H@ÈÛyò$$ñûýÈËöÄvb;޶h£ÿŒn•Vu©ªÚQiÚ´¡µÕþkIJbãGìkSŠ&)ŒŸŽ®ÎýùúÞsν¿ß÷s>ùŒX†Éµšt/%vÔ(±A=)b“ú·R@’šI üeDcq§b9<&ó¶OQ¯R×èTIpÚ;fÐ×ToªÞ|åD %ŸKeAKEeÛšÛâÑdè±Tk¬Ý "‘ÈÕ€‘ò#‰08øð÷Àx,]Èäî¥î‘”n8žJ¶J¯¬T(kUªzÕPÅP}a½€– ØÎÁ^åþýªfY°¡½; ! D¢[–4’B‘o®(—¥¦%‰qiP’ކ¥¦å~ÕÒ fUnZ’éïHuËbuX¬»'ùô²¢aÿO `@øBàÈfa,óÜÙ†¯¾øòÑÒù0’¥œp8œˆÆSÝL ñNãñGÞéÿw|lÉ>”H ƒ¢…ñPb-KDï‚ ð»ªŽ'çä=cLŒE)Îfø»3OœJÓŽ¦ÏÒ&ÐȲyÖSít³9|h|!Ë tŸA¸ Mº‘Õ’î'è{Ë„?cœÀ„{¶ŒMgÛá‚™ts`ËÄâ6‹Ù]~4éɘò!“Ù 6dïÚ»{çv e:•$— &‚bI‚À›…Àÿzé.-‹Ec’øe?œ° üR²Asq™ýd’¬æ!þL‹™iø|Úè<šòm¿*'3ó‹¨;„t64T*™–µ*/uØe€ gÜr‘kXäêtˆ»œ’·Jä’5Ì µx›EçæÅvé/?úÍZr-kž?ýªÝ9Ôã>çh\±H֥Ľh3ñÙí¿öÌ(ÎÍIÏz% ®!à©Ù)Ù¬xZmW:ç$ΡV·¼Ã©8ÚRK/dÐYd:‡Cc0¹,6zS*•wäå²á†’Éó¥¶>îx§ï-˜¹(À» ­»ñžÇÚ‹&{A‹ -ÝÅÖž¼w—•°RËgƒ§4òd 'œvIÊàl!i‹]Òw»%ÑÀBÇ€ÿ¢Ì&êª9[ÆyQÀà@E¶S¹9\ƒCa òø§‹OþlP]«–W)T5jÀe¥B[£Û¨zê+t²’7öÉǸ´’ã–}þùŸ7k»­®”SóÈ<ÁQí5­Ò*Ùx¹U]­IÙcÆ©*×èª ºZ=$ BÉ ÜAZ+?uð­Š´˜F#aóèÑÃÁ`ð>%ÇêXoÄã¸*–ˆ:tˆœKæÒ9Bÿå'áqÆãFíëz}<]«¨‘ÃQW¹nGŽitÇ5ª:µ¼R4rúÈ[B:Æfr)tJ)5÷º¨ó®T¿2 ^V wÅú يİ#5€³¢¹}UõÉéöƒÂ]T š&‹Îásh$ÒK%¥&½æö·ÿ‰%Ö I$ƒ ‰<ƒÉèÃõy'OǣǃBAá¾ÿºB„6Ac)z%âkÜýíÖ­öæVL¥ìÌçs(lÖó¹!I°ãõºçÏ÷e™ñ Ë,2Í¢ šô>c]—F¶N8‘Ý‹ðÖYdqn³øÕ¦ÜhÜ…F\hÂ9áÝ:âØW:g‘ým„ûyöÙ±9ä Ë<29¶ŒûÐØì3öyâ×É@Öètö©3$.Ÿž·£˜Ç§©ïݸ E’ðˆEdë°Øsä“Aã쬨Cf3àĆiÄ:GîM³x3ÌÞL³{ëø\昙]™¶ÅôÉEäòfË Ïï}õ¾@KÂ( z.™Ïå°x̺ùÇëÿvì=×y§ªÇ¥èpÊšgÄmsòÍŠ§Û%n™hq‰â¦iÉÅ9m‹öÒërit!›Ñéàð™ì<*%[ˆ±_;ÀÕ4ïÃ/ï³öåÛ„æÎÂéÞ[wÞEpÞ[j»ÄR`íâÝ{oþô…'ÍOiäÉØ»rÈÝ'’x: &¯u+Ý"™_$»Ö!¿Þ)_ KêÎþt×Ëœ\›Á¢’I“ÆÁŒ< /‡s¤èpOU¤\¢«×iOè€FÔÕ*0 ‘¢è»èp[YˆQè&F'SýX,²Yûv0¸2p¥ŸEc`L‡Æ|­ìÀƒ±|ôñ9ä~œÕ8*+UŠj¥¦Ž˜QT(5•ºájÉ…Š‹¥y¥ùtBÙ³§leePäam}4Š$¾£‘h<êóù8,›Šñ)ìýÅûÔ'TÊr¥©jÌPi„"k굪*¥¾J¿^œ£Ç Šc2ÃÏ ð^4µú¾c—^á탾%p„D’¼QykX³*у} 6¼aY•—ź™häÎ’(—¥“ªŠºóIô6RÀæ1iL:†Ü¿ÿý_ß PöÕp6O¨L˜8O„B¡TãñÇÿàÜ}–‹F#Á{÷%l5ÇÕ¯ƒê1ŒÉ'q06›Á§‘y–ÇßùÒáíW.£±™4@à›PaH·Î#‹c=5Ï\1Ï!Û²Í#«k«ÅóÜÄ"丆Ì~d›CÓŽL£ù…>cVŸ©,™ÆÙÌQ/rø3§È4…Ìäô?g‚ÿú3Æ=Ä)<ÝìCv_–~äÙª“»(ä<6+—Å++ÚýéÍc‰`4L.ŒÄ¡ƒrYÙÅ?G)¾š69 P´QI·.@‚[p7Â]w Ü™d*¸•'}Ìq¦Œ±«NbÜü\å•8<è’€®™\¥kÕ_îq¨NÛ¯tø”çƒ3ÃínEÓô0H¶È%Û,õos‹ÅSV ±jbÿ¸ýåy»&›¼Ò&‡¸wJþþÍ×`9Ec© Bñ0(üç¯Fߙه§¯¶y6-ž.·´ÑÖßìn÷*HZgnu“Mü_öë=¦­ë øBóh²vƒøqß÷úÚØ<ŒEÞiÚP%¶¼0Ð*kyó~¦M_Œ¡?°yc6°¦ë¦J]¥­k•jÚ´-j—lÚ©¶tÓ”„4`0ì³éªªšˆª}ºº¶|Ï=ç\ŸïûÝB}™&5… %I,«“‰ëÉ$FÎA®eYnÿθºª¾sÊîŠø¶" €¢v•i¥Éö’dgi¢»LÑYÆu.» žhdyâJ¾ára¸Ô4\iö—› õ#ùzXŠ«…–‘Âúþ"Cmö©=É›0FN°4NÑ2)ÏÑp®ˆ‘¥ò;ówçùA8Ô'‡,–ÌPq·f5-V#uY¦—»åƒ(âô‰ÓZ³ÓK—¶ƒ7ÿ|C“¨f(d¥!“ª2«@¡& ˆ9]€“y–ÌÏ·H[¸ ߘL'1RÀ£Ñ¨¯_¿>÷-zü_„^hç‚À°±±±ø¸x9˳ZIð•{˦æŒfË+,²9K0¥çiô?ÃrB°d˜-™Býáz­ú LÄ4ñZœ­Ùtãus°Îù°ÆòÀ`½«³Œ*©ˆq]#P,¹¯³ÌƒäŽN˜Ü«4–¥î’S‚!Y†£p.£Y~ìå×~ÿ»?†Šätpn&8÷p Lšó×ÀöíOÚB þN_×È—×…êSø¯4:öû†“““I©”¦Ão¯@DŒ§ùÍ’Üü•v{„ÓºÞAŽ+ÈæCn?”éÕ­Q¶~Ô1°P5Ê9„àîAÔÝû”ÓiFŽËÈùÞŠKþg+.Šwîb¤´J„'ФŒ‘Š·ï{ºüÂjkrôFuúáªU—à^ÃÈ}9Ú=„.uE8½útûQ§µÑ.‘ÇIh9OÄñRj¯öGŸÿ}f˜{{ðmP.ä “ñ/D\r„ǹ8Š@Ààíèvz"\žðD@b£äò¬t¹%iGH©Œ"p^JR$ëê쀷ÅÆSŒŒÄqKÚ¹¡¼¥¶pМÓyñ¬¯þ¤×pÚcw](í7/Uõ?ã©9×[ÿëO?†É榇?x§ÌSÜ[è®ë~×7 LÎÍì§?Ÿº7¯]©L‚Á;Á1¯%¯GwÖ«[ªñ€Còú²Ñ”HÅñ¤„ÆI —¼öÀ‘(kSt—7ÊæAž‘È7}¨mµû¢í}Oµö §µù¢ÚF¬æ.°Ç jóBD:᣹Qçðš—(#‡£Õ2N“@”¦A$ÄÄàL\ì+ÇÕº~l÷Fô\EN8ñ¡.¤£om ²c$ÜíÈŠ¶+ëtoˆ±¤­1 Íq ›ú|êû~pãOذ™ÂE +ÿ>±º ä{öAäð£®áEk¤c9ûW¶ö?Ý2°ÊærŒDØGQËO×8HŽU{ö)™Æ¡1 ;W^Û8übôª\ ¾‚œˆH¶jŽ·¼^æòúL¹½:É©žÚüÞÚâ^ýRUÿÜÞª‚Ãù.ó¯nþö_s ‹Ó½ú~}W0_vÿ{òþ, e6x'0ÞôV'ø¤°½aôÃ÷C/A!¦Ì|úð³ânC~oÍ’éÈ«?ÕS3?Ç¢žÚ’^c¡ÇxªK—7¨Ïíª:ã­;ÓS·§ìUn»£ppHFÉ$XÍ(¡æRTÒ_ب?)sËÝ%Jw©Ê]ßV’ÔVšâ®Hi+×8–ÝO4²<á/Vhúyžñ­¼E:ó/6俸i‹ ‚‰”ÅÒAÇIiv#¡9¼5ó‚ö¼p¨¡AÛdÕ6[2šLéTç† !L‘†z­YÐ ÖLëch$ûÅl®¤IŠæÈââbØP¦`§—*oOM=‚>ùî{,MÑ +)õœl[õ‘šÅŽ34ý¬p¹×ÍY‚ùhýÙÝgvàÛy’QpŒº‡Q§¹úŸ15®ÉÈ"9U¢˜àÅD%OÛàî½Û“3Ó¡eõõÿ‡ýziã¾~@I–²¦KxÙ¾;ßÙ篒5IC›æ¹¬…„WB“¶YÒðÆB 4ã~Ø€c0¶1˜WYU5Ú?ûcSÿ˜¢mÚ¤DÛ‘úפn…”¼ïÙRE7%R•Ÿ¾:Ý™3÷»;¿ßÏOÄåA²‹….Ë´ü‰ÛPåÚ4TùTCmÕCò^uKQíh•8eõCÊJo[Í0°GQåRHÝšê.ÙÙ‹ð=<ŠÄa ! IŽ'£ÆbQ!æð h/i Å&õ9-}Ѩƒù¼@#%4]@wÒòBÙaá.Ê‘\;ùÏUM tÏŒŒž×t<’éíÖE¹q^iØ(Eæeô¢º@2‰€d­Í6£4ÿSÛ1¯±Íµê)szë×­sñ¥lV" ÛMf>?SÔñ³§îÝ»«N¸o¨Ÿë»êæ½÷ÿˆ $Dgggm¦Î”½{’ø>… XœTT´‹-N:plWmënc÷OÀÎñWz&·uO ý~dp8ªg42èGÆ®‘èN°Á 4â ½#¯Ú§b¬cŒ(ºíñVwyœ†âûŽÄ^•"öÄ=²]ßwù#Ž(“HH"Åé±\‹ëö"ƒ“€`‰séî޲…|!¤kéö#=}¯ýªŒgp!·x<Š…%ãx:%ØI  ⬠-1}#Hßøvç§1ÝÖè‹Á} qŒ#ƒ>ÄnßÖ®ÜÕØ„ØGá©X"*&øb’:qæôÓ™Ù`h5’Œ«a977ÝÂÙ(€Ó2eH¼úkw¤cÚr—LâÞ´î_é–CÔúõe.9Ök¤n%hçwûãr¤ ­†‡ - åšïÎ5Ok­§½{z(. Ë¡@çn©·}Ó4âRÔŽè`J×-Àú5ܬÔ#/QQê²NyƒGSçÓV*J»š\Í#¦á(+àQ<’ƒaÐy3P^¼çŸ=²·ñƒ½¶ÚÔÁÆ4WS¦ãæþ®ú­¶ÁKlQ4êFoj’;…WN¦'aïLŠb ’$x$.ØÏϾðFñ¼æÎ8ÄXhÔæêé|“é‚YW¤×ëTùjÐP$ÒÁ¡ýAèÏÑpÚF5²—J'1 %…)<&ËV˜D[Y lZÅf’3 †,&3N¢|>WŒR¿È>­9§Z¬çÇãd}ÀÍÂW`$Vu²(Âcc”åbhŠH8î ®€‹‹‹pÑ•`p‰Ìs9Z]ƒÎÏ`ieéË//P8› +±ƒdö_6€CÚÏë`«ÉgÞÅs5R¬·[é\]Óù[)d:g¥“hnfÖR{Çãv3  Zxª6Ï© KêQ$¢‘§rüpÈã6:b’99ýäŽþôÚøñ[]G@nYúD¿À|húÓmeå;Ç(vÆI‘$…{¹G"‘<|ø0.õë»êËñƒã;¶}÷3»{÷nNNŽBð¸hÒKgóS²zµ|G§qL#½SQ½Ñ=£Q@‚/â€_l×Ò=ŠtÇvN½Ò3…ôO2*°{ž×ÍczýHï0b÷ÆõLÇX'¡Ñ×hS|ZŽOÃ’y‰oS«¢‡¦£ìŸ#¶ ÄéížøYiµÇÒvïŽßs(ÞÔ‹X‡¢'.w4À®åðï`x0ˆ8‡¶Ù=Ûz?cœÐß÷ª¤Œ‹DìD¡P˜š$ÊHJLŠv^/ÝîDlþèþÏ~0ÉÀF5ôŠî‹î›Œî¡»ã*¤ìCoS‰d6Æ'qÒÑTŒœxïÌ“ù™&™»´ åƒ)KÞ7›ø(!Æx©@’yêàuk³tTwÕy»Æ§–xä›Õý%ƒm5nE™KV6¬¨ô(Ê-Ðîû~ë] ”™J 4 6j\òJOKåðm°ÁĽ»à°ïWú~ãÛ4Ї\ HʇÚ`>¥>EÙp[¥O^á‘I1:Æ\"ŠÌ òÿÌŸYï¬Eª_dñSTpŽOâÎ'P%Yïk‹ôô³úœ4b,²cÛB[­ë¶H“¦$2©Ñ4UU¦I›¶µj·.J œ&€÷{¶%•"Š©šú׿þüýÿ÷{¿ÿñýü9?Å“ˆ+ºw8”¡|ü¼lÿKµ޼ŒœkÛ£´ìqú)"£éäLš3ЏÂé#ÁÝŽÈ.çæšBÈÀõ¯/è É0â‹"£Ó98f 鎱 áÉS§ùEà £ñ˜h²`ÖÕÕ•Ú‰/‘om H$±ººšª{zz¤,<—Í`3„GJÚ•AÓ¥ Q&Úü0IH2Ý4® 0hlUýEãê– º%ª©Ÿè…4ÝcÄÀ9·¹kN¥+›Ôê¯'îÍ^ýEOÄVï“_òëäƒó«‹pß%67î&–Ť²5¨¾RöOZ>YüôÚ§ ]ô*Þ˜T5ÎhÀÛ† º)¨…Õã}-¼¥qlÛhª)¨išP‹'-¤òXý˜BœÃe 8(År8YB7?“ƒ³9Œ’œœºã/˜¤NÑ!Tè‘åº%ùÞŽBo'%Ùξ£:‹¼íNq‘SRHJ…ni¡G–íçzÚsG;Þö·,Ÿ”’퇲oš1¾-4ò¶˜xKB´Áy°ËmšY±vFJLµ©§D*蟕éÞ–ê F¤ž‘ÁÕ[h+#"y¤Kk»(=÷½—Џ9Ù(ޱPGa‡ 8Ã\œþ\æ3¯>-¯è3Õš(À¨°cèËu[¥‹­Zç±ÙÙ8£¦ò$œ²u8L‰D*-Ù®’<¼P·KeŸ•É€ü±ö»UšSjÛíÄ ½ý쀮š°ÖZ¬'m–*‹¹Úd¬1ª `¦J«­bÈ^>L”Œu–ú/9|øÉåb ­³³³©û*'¾T¯­ª©Ç¡†9oÞ¼ 7$—ÂbeÓø’r±î´ ÐøªÙVn7”ÆJp”±Úfª´ƒŸ°^Ö ³¦Vc>eÕVZOˆ,T€, ì­º0§¶.©l‹}¦e¥u…\PÙ—ú¬ëýsË]µêy­ÆÜQšÁæ5¶Û:Ûm‚êYTÛ–T`ðȜ¾UzYê1/kîhŒszë§„ÙSuú§Çesrx¹|:ïû¥eWÞûܮ˛ ë©õ‚ˆ&¡ âOl,'ép%%*ùûv”$šRå¡o‡ø¬$Hþ½²Ô+í0Ù9\ gÒy›O§ ™^Ù‰ït÷#n/âì Þà¶Ñˆ/r¿ÃÚá #®ØÎ‘XƹÆl åãxFE âÝí˜FŸ_VVvýúõû¡~p­¬¬$Èh8™Ì\A6gæ-i±÷ˆüDC@Û6©mò+ýŠÖpâÒXó˜\ÒnUÍÅAM㸼Á/o©[wü§ݪZ…á”ÁTe4œ4€´Yj¬–šÿ-Š€ P>—ÅâaÌW_y$˜º{I6âÛuŸSú E| ê÷¯]ÇPƒ<‹–öÕöªUCÄk:¢‚ô²UÀçƒ+M† #˜±Âf(7ëϚΗ](¤f3²àq CF.OϤPä+BùP&ûߘû(’êYXX¨««£Óääå²…´‚Îòv¢†€ ™_³ÚÏZ5F`$}¥ÅTc·ÖÚ(·ËõÖj³î¸ÁR=(zEÊgñجù΋¹Ï,Ê͛ǂÎþ‰‚øÜ`¾k°ÎkÍ˺Á/ÔÖ9¹i^aäXU ®(–öÕ~3؊º,·,), `*ûª­Óˆjà®Â/ZR›—åæE=ùûn­æx5—ÃÈãâéŸË‡dóLeÕGúpmssuíÞf*¼·±¾º¡I$à ‘(õÝWНM}ÿ/e#¹µî=ðùTX6)¸vêŠó„ 6-—ÃÂ4ž .7^ñ±ƒ -;F\ˆwq½ƒø~ŽŒÅ—»h„¢O8ŒîžD¼S¹PÀbÒ±¬}§ëw:Bˆëò_lŸ…„—"ä,BÆvzC´ÖÎÇ‹ïÍfÔ5¥ oš'9'‚8£ˆ3F5ÜÄJw‡(Ò CIV™Iƒ_‡“Üâ€{áôa?âCF'ÑÐrq‡v»¢éCQ„œþÙ£7Ñë.Ñò`X“Å!ÈÇ1!›•IÏãe—=4‰¤þypƒÝot´SjÂeRFǹÇJDƒ}AS½çMIÌÐÖ^ð÷C Bßèë”[UsÑ„ª5¨nšP–të¯þùƒµD ÎïݺûñÏ&ì±W€Þë`ñ8'Æ,­ƒ‡[ü¬7hižP6GÔÞ_Æ–aX2ÇûË??~÷ƒßÎÞøõÈe_ׄ©Õ ¬¢‡ pÈ^'Ú&kõõŠƒ*Ѥ¶1 nð+EA}GØÜ6ª©l=SpôÐSh€ƒeÑÙ\›róØ<4+‹ù|iž¨öé¡váh×ȯ· 6®3À ¶ã¸qÛqA—ÕîjWB _°I“Ž‹=žLœf\.B€/I\;6ÆŒÀ.6 »´º"@W!®·ÔžLÛiÚigê4íS;nkcÄD‚CHÛ`bóІ–â!¬—F6µ†À@b`d“n1Œtn-Q¤±P1g½Y¼äãÛjØ xË3Ž@=›=-[îïÐ-›šƒH{ä›®´v'ú7ø#/øF_ômi±ut“w „™KAóohf4ò ô#¤ÖÁ-žþÍžPólÀ•~ÄÃü"úöeSÒá"_*Äq K"Y)$ a§ð¶‰ùÜc¹9ápx†YÖøjYÿú\íaË=úiÃ@‘øÊ®¼TsQ*‰¸<¨ï8|nÚw+”C Ä9àÇ©´OS¬«i/t×?vBéÎvÖ©"Ö³ÞÚÞ®MÆç˜§™_¾¿gŽx]†Ú°ûO_~]žÃFÁ!‹L ·ýrö¶ëZWuØ^ÒÝP¬¿;35%^”Ù90½¹øÒ Yb~qÃ4äQu›+BzTUÄZÒU¯èÖ­—FÔ}†Š͹žúsýúÒ!ã™>í»=Ú VP_Ýc>Y~ß¡,œäÁK”˜G²QGùzß-¡dÓ.¿½7Pƒ·UŠ»kÒÚÕ¢– ©§2³­fO ZâSJÛÔ5@eW«*ëL÷V‚FÒÛÕÏÚÏ‹F†Uf0˜d¸L7Za¯4Aã÷.˜®ªèQ¥©¿\ªÔ…ª^E­ñ-ÅYû¥< jO@@(g’(¤Qr/-<(É~÷µÓuòzsMç8ìG\ö|§-ÇÆ4ÈÎp‚þ$§Ÿ¶FgNã‰àÁ0>:<:[`|¿_Ïš÷axYŽÿúWð¸(IðE•EfÖ\¶Èl —Ü 1šÌr‹£¡¬I£¬É~ÜùSYí©C?¡vb45á<4#CòÉ'7—™Z%®Ýe-p=Á±–[W£âÚeùþ/àiI‹á-âí©eÕæcf†"r«Mæ´ç7B@˜ηºòìö\+]h;ÿ#…”’²¸,’$„|Fl?œ‘>^V=a Ìjšb î…:ûRcÆè‚6¥wLií€YcãŒÎqü`rMšœwMŽÛÛ==©£§õ¶9ýq52Õàœ6¹'ŒŽ»ã”Æ<]o¹§±NZgŒ“Fw߉ÓûÅT2Éâ‹8ƒˆDqQ‰HÔÝÝÉL~9¾[ŒA˜ýz… ¬ØøäÿòXÝ<€ÕøüÖßÃN%’Äx2+eÎÂp–tûëÅÛh÷KMHèçˆ'’Ð܃t„ŽÞžÞO鼺^Ið÷lô!þH"ÀÀFº·h4˜Pº KNÊÈzÁàDú®nò!a¤}ñE6ûÈ·—wŒ þ¤©ïï`b`è›5Ò»¢‘¡DßÓCÌÿ¶…ÿ؆ÀØÆÖ¸{‚N@ƒHGx«o0Á'ô#‘ÄÖpbËâB‚£ˆ?°­FËÍÎãcX —‡¥’ý½ÔT¨DX{3$&ƒö³Ï?e>` ±‡UÀ*9þû<ºÓ$‹+_èõE!››ÊA f¦¿m©TvÊ{ €E¿¡4Ô Ö]i7›—÷è*úgÛ.W÷ÑΫ7î|:gJÿozÕAÃù.íÙ.]EeìÆoï,MÖgã±»±©ëŸý¹6ä8Ó®9Û¥Qãó‹E`>€‰Å³ ‘Å(Ì›þGM›IÙkVô®€$L+:µë¥‘óWÊ{4e½Z$A í|fTle•öTîSµY¹‡¸œÂqÅÅ|¡Š88ÅÅ0(¡$lŸD\šÿ}ý¹lïŬöK ´6#£½šjS JQ  "i]iœð¬ñ¼hdPeŒT™!ïUVf¸ª0\«0½_i-ÓG*ôµ¹ÿ’ÅV¢~çБW)‰(s¸›cà$.›‹cTl4oWNù Ý1¡È`È7ÚåwA³#×íÎoi*hvËÝ@«Ìf•C¬ÖBÛÓÖ HÊ–`(r¹>Ÿ™Ù¹h|ÝÊÞKXËñùÙ¹ƒÙ(>I`\‹(xUf>n±äÚ ›ô9ú(m)¤A#@2@šEn®À9éœ4!ŸÂ¹<.›%•¦ß¼ùW¦œ‚ܸð0p­QäÉL²¡_“ “ƒâ###<…ÅÛŽa .’&¥ŸØ\Ÿo´ÙE.:Çf>BÛ \ö"cËwŒ—rkŽHÞ”¦ˆ¡îà!É#9ìd>³NMJΓìqüZ3aþ'ùuÛÄ•|â%´´Ý†öxìÛñAnH)A-…Ý å°C-eYVrØ„„pʼno‰søŒ8>b'NBaEÿZ­vµ•ÐjWýkW•ØUÑ.H¨»r“„d¿±W)¢BÚTT•ÊÓÓäedgÞ¼÷}¿Ï=£tŒ·š¦ÔVpÈ„Šk5LªMÓZÓŒÎ<©¡ k­ã:jRß>¥µ€F&ÛÈÕjdºÕ×3´£5=P­3¤ížÊ°¨¦î]ÔÍšœw•”u—´CsØLž0–T›Ùë+ÊeúÃç°`.ÕëJ[™ŸA#ôrZZžomQ\\Àãó8x^f†–0!~yëÏ-—SaÄLw]cPA¤'†ô ŽFw8ÉMêL†ÿœ4‚x‚kìÃÃ}ÉA¼ƒiÝîŒ]2 3k=ÊE!}ÝH¥Ùûi38AA£ˆ3ÀpÄž+ˆ{éÆ\IwŒ Îþg^ß#Ã=€8CðÝ$OñfúûPŠ=–Öet†<ã Ý]p Ðq ÑãÞaÄ?´¶Ý³î2™ýöölq>++Gˆfåâ9(ÆÆ…‚BÙép4691;m~ñ1Ì,> KÿÛ°P¬,­Ä`e­œŸ¥‰baañB}£C—6Ê"w“ðø¥šæ>Rá×ÉÃzyX[ ñ+W›ÍÏ„ô¾ðuðF?Ôýû›þã—‘÷«~U]P+Ž5u#¶zŸÞûY¸ã³þó~S§­6¤«µÊý:ÛµÞ™åùøöYüòë[¦AW³ÇØ9ì»y÷ÖÂòc@þìòÂÕ/~Û2œjšS}ʆ°ñyi¤6¨–‡4gBôýà Ÿ hêúÕЃÚêˆö“°ê8ühP>Ú®èVIŽ sÁ$,xMœ'äCš†¶‰Å'˜,N.ÁÝQ*©)/¥N{Ï@xž:€Gž¯Iâm„Åq¢@Šßà¨û±ñÂh¤^;T¯»ZoøMÝáæ!ƒ u䜡ûTsýžÃ;Å› sp!Ê…`ÉËEqœÃÅ8<” âÍDiE™ô‡†JR'3èeÀ†Yf60’2“õp§y¯Å*µEÈ YAÆb2JÉZ#ªÊÖÍì7 #óu‰Hx-v@2·ütyò½Û£x¿o0Š¡LcÃz("ò«Þ?e9B™Ë)¸à‡©Âj™,‡­¶c@‘}›öå¡nxóY\\˜ Tt†\¢ãÕS¥Œ¿HžL²ßhñ¿¡H€/ÆQ4^.?›çˆöˆ÷žÜ^¥ªl#?&ÍGHýG†–ÊÖÆýçvä¿[Œˆs¹,—™-æÁ1S€1qB™«ÖÆ¡h‡¨Ú¾+xðÈïjÏþCg¹G¹]÷Õ– µuFk{ÔÖ1ßj›S¶Ï)­³mÔ´Ú:©1kÍ«ÕPgBm™ÒR3z\dê²a®…\PšµQ ÚŽ õµù¡Þñ7yëù·ßÃÑ .΄2“ËápØ‚VÓ‰šÛÿ*1‹ñöäŒ}·Œý‰5ú—–½žžÅ%ô^Æ ˆÖ8›“I^l|µê4Ã׃¸}I¾‘$÷0Ã9‚#ˆ;œf‹¦uŽ =£ˆ/Æp‡^éò?7¸ÃÉNи"ð’+B3 '’ެƈ’,Œ`³˜¬¼¢ôíÒ‡o÷JjÇ@ PÁ>„ôFÓÜ.¤Ë†„bˆ=šâ?óúN  ’$W˜á §8Â)Ý©]aÄKvÇRÜ‘dOñA‡ÇLêŒ"}A0öâ ­5Yßøðh†¸DÀÆ8l&_€ ¸9ü̬"\TWÛôÅ_¿š}ÐuÄòâã%PÅ ¸b™æî“ 6ïS&Y9ŸZãù¸I̤ J>›K°°ìŒ aHZ}¤©×XÛ§ýµ¯¥.FBº_m6NÈû5ðEEDSåoiëúu½ÚêˆRç µúcž‹Š^Þ§Vø5Š€º&ÔVQŸèkmèÑÝžøš~Ì…GcËSº!{Ó0uʯ:íÕhƒ¶Ûÿ 5ìæÄº^Ý ŸRÑä¾U«éY¤q²O`Õé NÐV÷*R'BmŸø• ”¦Ù>M¯­¦_SÔÔ š䛤Û8BŒ›%„õÍÂ%l]žpp`8^ aïÞ*<ûÑfÏ…-T]™óÜÆžs"w=á< &)ð4¹~tc¼(‰5èÁÑÚ66‘Á&­¦¹õXÍ;¢¢bL ÌDÙlز¸Ð%øl!ÌîÜð^ýN…Vª4í×µ åVk…:h³0Q2‹íÍ\IiàŒµ’24êʵúƒ: È„’Q?´F̺Ã[*r9‚Àø¶9¯xü›±GKÏS#‹ñh%C`üËò¹Çp6{«è­K—MåæŽCvr¿Ù"£ŒåfÝ!Csy³¬LòXBÈÛ½{×ÝŽG³¥å¸>žDH"^=uæÿo+qo%è=¡]¿~½¨ àâ°=! PA7 ¿t[nÙá;Û„[KˆbQŽHŒK€và àq8o–”\ý4ÐëI6HrÅx|‘@ìÌ"Ø9|“e ¹èfœ+å}ë]ß¾£ŸW_¼u¹ýŸ†Î»†îº®)Uç´’šRšÇU ëj5ò@MΑÓêÁ%㬺}AÛ ¼™o±N+m÷”æ)cÇ”Ê2Ñjºoh¿£·Ý¨núçefÁ«a²R<1ŠoåwXm÷ïß_™–ï²ä§Únܸ±ïƒ½l FBƒW}í‘“æÄîKu§v'w "ޤ'ì@Or!0ÃH’Òtñ'âÂÇRá$ïµt}· ìýŸ•nc8¼Hï•5]¡g]<Õe¸à'¢ˆzâ)F÷UTã !=!ÄD|ýˆ'ˆ¸Ó£¯vîâMö}úò˺ûXlnÑú×è<Æå‹rˆÒ¼R²½ãîÄ=› @;ðÃÂüãyù°Ïæ–èãÒ·yei9'Wj§j„ÄçþK~™7qžq\6P’6C,K«]I»:|˧¡4¤%àâÛ¸$Ällë–|pZ–vW‡>d[’m]–|B‡a¦ßú¥CÚ™BJÈ—3Ò cÀ`l£>k%-œši™¾óŸW«Ý÷Ú÷}þ¿"Ñ‘áQ‚'HAq&p¹lïŠBE?-X+ÃduxÙn®X5a›bª *„N)†`#HVEèꨀD A5AãÑ(YhT«C5‘&¹¿éü§¿e¸‹™åÌÇ»¢´ Ÿ:m¬Šjù›ÏùÞãGs“±- 2L34iƒäJш"l« PʰU4W kB ¬ƒ¾¬ Z€*ûOׄ²R›t£2`PûZ?¥è2äi¥¾½B'¸Ê6Œ{Å„ˆ]²M¢+ÝäPɼu©¾ZÐH¦[ûßfŒÿQ‘zë¸Îâ9\_¿»,7ëÇÌÎOF ‡ …8ŽÃ¼øß¸ù#aNÉ–‚ÅuÍe´­ÀÚZàtõ4çõXŠZÀm4œmö¼[ž Œ¸µÌÙRÔ b)µ˜ËÌÖýf¨·´ØóÏšFœÅ-'KÄ<1.à‹QLÊìݵûÎÝ»+Ïç¿U¼Ä½þ“ËWp„ã*àˆ<_–ß\ÜÖœkwæw´î³ÛË\u¹õ;¥;ˆW…B.$¤|aï}o÷×7o1Qhfn!é`8ÂÄ$SO°Äwf’oƼÐf¼Ùظ/3¹ØÕËoBQìc.ΆÁ QTÊ€pøfš$ÛP÷Hǹ<MQ¶;FÛ=SÛ}Êy›rÞ¤7-.ЋšeÚl²ÍЭ÷m÷)ÇmÊ~Ã<à.­|'Œ#1 ÌÈÇ[·n½páB|}–zDzÎÿK|clÌòñ4|êØ_n|©>xå¦òæhH…ìô¤W„Éü—÷ìgÙ\Os󗜣,ïVÿ«;$ð=ߨjßxBûð‹í¾„þQVç «o„ÕÜ~¡w|]ûðJ!Ê‹îðºZ#G´‰ÇKNå¦'¶w²ã ÁÄžó/ëOé"ö¹"iRîk½‰ž(« ÂŸà $¸ƒkº¢‰=#,ï²ÇÃZÝ{Ðe½é„@’ !¿!.—+•JÇäädl á¯`YJ)P.^¼˜ LSÊvDvåî¬uTsUÔª4õREÍŠ!²bà¤*Bê"”ÚoX)÷?棴ªj”¬ ·Dí`ÍB¤‚4ÿ‡¿¦ê§*†©Ê1sU ©ÞK_¾ñYì3ìÄîêC6À›š!ú¨ß ô—ÛoM€Œ_AʰY¢ö€› §:hu(Â$Øã©MÉj¿Iî7iBfŸ*1×äù™T&áñ“Q.[‚ &Aø™8&ðƒ`Å“Šˆ]oæ(öon–˺5i>]fO]†·VÚ«y´)úô>}†G›åÑeuë2zt™qðÖ‚R½úŽaO-ÜLïÑ ?³¼u™‹Øà­MóÕ¦xõ£ç…FuTDOé騆ÖPguô2®¦á ]ü5¢¥Gôæ!5 ¸2½yXGGÔ¦!-5¤1Œ©›&ÔÆójÓ9%9¡4ÑcÚUqBþnÙ;Òœ4”¡p 8wŠpˆ×P<ŒU‚â©Iâ×ÙóÒ÷Vï¨\)Z°Sæ"²¥˜n+¶¶åÛ…Ž¶ÂŽæ}®ŽÜfG~«½Ôa+h°q:©}-tiÇrÛoγ·°Wî:’’,¯ƒ PŒ‡ü|ïž›woÃQš_HRbçgg¦cL¨ž‰-É_ž¨ÇË¢U-¿-ív!ÄE8ÁGPœ#xCœS•Wu⃓šýªÂ­ù›ø2bƒ@Ì#¾Ãx{öützzziL[†g]žè&1V&“ÁfŽK‚‹ A™ÜæE$>|øÒ¥KÿÚLáÚµk>Ÿ¯¤¤Â5p äw,ÜA\ÀÜyH†@›žeÍ-þ¸þÊÜ3{²eÖìüº‰¾O·iܲاÌ]SË¥”§éá1묵ëê)ª~ÇÎ „ èŸUŒJĘè@Ùþ«Ÿü-6ûø€ÚãoÛÅoýhŽ·çŽQÄav{,vïÖ¤£Ã¹^¸AˆsÒ’qBB(sÊ“7¿»êø©Õ=Þ¤Ž§»óË X뉬鎰\ Äþ V`‚ÕZíŸ`u†×ÌÜÂòï;ÛY¡_­$º‡×u„Vuº¹þû޲úFYž‘Ä^ßÚòùél‚ãi¯ÉÖj`9Xž±÷ÙU£«º†º£ ™0p]Ý»|qYÑ\Þ—rÞâb(Ža(Ÿ/Iæ”——_¿~ufffq‘Ÿ“Ä– ñ•+W2eÙ|`II©„ÃÛ±}£¢ó´&d­è?-“5àÎýšAZ0ö&Y)‘û›ª"ä/'u!êó;}8; ›‰9æ§f§Û&ú«ýT…¿I°:Gz§b÷cç!ºþþ‹OTŽMð.Ј6L‡®Õ+pHKâdÂ0‰ß“Q…HeÐRŒ0ȧ5(R¢àE ‘š¾&uÖÍÊ>c]¿µäxÅyۉץˆ€‹"\/â ¤OB $”<›Ë^O ÈÛÓÞ/ÕR•íÒnêmÈöÕgúê€7€L€IRêÓúê€+ÒzuéÝÚŒ.Ì­ÛØSËPLJ0òè㈯ą·Ä<Ü¥Ûä~nhd\IUgU ~€ rFI‚öÐÒ£:óØÂc£*rDiS˜¢*܌˹é¬Üô‘œüµÚrNcÁc@5}jƒé üÀ¶Ý[ˆôÌ$^!ã(ÏdŒB>§O擌§rR¶§l;´½üDÑqse)¥WŠF6ÚËÚ[öÙì­ +ÉûÖ2ôÒ.ïìÒ÷Z>´šò ­yÖÎ_¸H–ÝE¾ƒÌ£LÅ[ŠÄlŽð!ÄþI}™7uœøaC$L¬ãÝ’ž.|Ôh!i(Psã£PnlcãÛ†B¨,É’¬Ë·uÙ’-Ë·MJïvš¦„$¥ÓL§Ét&Ã0é4e’ÛøFVÿ§çÑxhÜÖ‰B›ÞìîÛ·»ÿ¾ýÿÿû1Á‹»¾{ÿãa°©¹™ ›ö8ìøLÆàØ ”ªpƒeq'8yü„]1F) ¹’§PFÉ×óå1˜’ŠÂ•„TN3(Opòø±ññ1pe £ÜãA‘Pá) fÁ222âkõ¦J…+ ;”P" #@Ž9êv»ïܹÚ!œ÷UhÃ¡ÊØØøO{“­0¿`çŽïÈ©/_ʈ%À$ F3£Žòe&~ö›|Á÷7o,(ú‡¡~ªÜ2ªªÕYF®GÊMúºpÑȘ¥á#UÕ}}ã°¹ùW¹¯älÚ®äóqÆ@p&%$ÆÂ’Ú¤ ™c/«÷k@Yö7A úrâΗW&,PMæ|݉± ’…¡k%ŠøL—Ư>›‹8ZW?Ðâô.[Ú"íO8`ŒqtFÚYN@lˆ½ i¹ŸG9-Z‡ó¤ñ¼Ü‹H‹;\4²¬©ñ^E\O6v!ÖŽˆÖ눱晽‡†G“Q"Œ/¥V]*lô=Õ4ˆ´ ÍCËš_° .kêG܈»±w¬hìZ꺫œ=+Ü]+¿—)^+b¡ÅZÒT×Èyƒ…»K¾xáfæL ê!Ãüdd$))I{‰æÑJ+(z“ôÔ•¼ü.jóÛ´ùmÁèÜ©Îô–…‹FÎtWœî¨Èm×÷¿óÓ©À, :8¾¿üíN hŸî¾ù#Û»úÞ¸><;ÆÚÌÜܧ³cž_öµés»*sº+Yx𨗺.° ¨–ÝÊ~ u® ì’ã¹ú¶kÿ íœmSà ðaa‡>Ï«…p@rÒS~¶½²¤Ë\àÒ¦]ÊØ–¼SºAÎâ•.áó!¦ ErJ,âŒTâbM’bdIÏÇg§nÖäl®+M°_ˆsý@Œá,–»JX i.q•{(šKåA‰·—Ÿ$ÚJ:ÜÖ·œç†Á+K%0à«B#¯†H€+rYéÉ­¢*1ô•ê:ú ´°" ʵŒ¼QTõj¡~`r5C…º×K¯•TÁ‡-ÅjkÖ…¢G÷mÜž@I¥‚2Œ"ˆgI±€”`(à ER8%F%Œ@ümbDZ-Ç.§üPÄ OÓë“ æKuju¸h¤ú`½ñ%Kmrù Õ”fV¥i̹µ·_{oòÞ $rsãñ§~Ñü3]J…!I[ý²u©óפÖé,G¬e)åûã÷Å •A Áe½I‘ð“¡`Wþ™Àì4vfÀxoB¸fˆFü~ÿB/´¸C <y•‘‰ ø$¸SÒrÊ((†à¡ ‘T qÅëkëÀ´ç>:ác£ŽC8evrÍ©©©…› 5qÅ0>f _MNN‚vœLONÝ~÷÷žwIQqÒ‹/ÉqZŒÀ9$‰cŽŠˆu_Hãñ^Ñ »>05Ý/³Î”Yüºúa•aÔ&Q[‡ËãºÚQuÍÇ—ŒZÇ=“«åxænF$#E`ÑMCrD$H•žöÖ¹¹ÖñΰGR á¿øýÿwå›oJO‡scü8–H+HžÇñ¯§§"V+ÒÒ8V@ìv^EZ†¥7€‡ÅG/âè´õG8{Oï*Wëš+•¢˜4.WR$œäÓÊç‹#\4‚x;‘Z7bkGl=°=Äå^»{Ÿ,š/®YO’‚o½°ÌlAêÛ‘æeÎNÄîBjšwÒÜÔwGØ{‘æ.ÄîEìK]7¢Þ»ÜZ·V¶ù:ž’$Ú×{u6h !Bà* }Å/!ú}¤V}ð ët†Œ¤DB‰ ZÈÄJö_ 3Ü%݆ì6UF«*Û§¢+òUe5\NWeoÝÿ¼l“£ÊgQ„MD$FC‘à\oè¤$brÛIúne^ÚFûù„Æâ؆B€Š8gi¬³¨`½­HƒkÎ÷8Y‰³ƒÄÉš +À-_éÍ×€ôC½ÔÂH±®¿D?XP k‡€@…Å•sêkç4,ºéú.Z U¦Œâ¼½é·Çábœ*NR ŠHš†&ÆQ¸Õ)$‚Bi™P¾…Ùzä¹ÃÓ.è’ ÆTp‚1ÙÄÂCJ­%¹Ú°Ï.1¬³¤ÔS,ºtcuNí[ƒ·ñfÙK=´sÖ,'íê6SZUmrÍRç70[ÕX­iÕ‡*Hž„ýM\ÁÈá Nœ8qçî]?·>˜.„õ ÄîÏ.ƒ3άVsbb‚PȇGQŠòàô¡yøpúÍ77"ÿÓðÆÉì e!ݹà ñÌÂÁðëægà ‰öa¨><üÉ›oüÆ ÕíݵG†Q’¡ ±8UJ$ù‚Ÿç_×4L\1OèÌ£Z}¸hgZ]3©kÓ°L2¢­ýHcù@]U¹ÿå8£ D‚1 ¡8VHïÜ·çí·nqæˆñ±Qbx‹vêÌÑ“Ø:T*–<¡\È<ƒÅ|mÇÁ§´ºÕuÎåÎþHçµåö[ÒØÑÔ·(@X‡ˆßt5²º?¢¾qõ,·yWšW¦¤I¥’ 2üözÙÖ•Å—žlаëzzŸhð®ÀpwGÚ;Ÿ(¾( ¤1èZ &Çö¤#NRß»ºqDÔ˜¨mûŸ>–±Æ\ÑÚà´¼Ñ åð±;_*xúWœ—‹cEx4‰­;ynùŒþ¶Ã _xÂ~7ÀÐÀŽ`­Pô‹:ÍTi4 Z$ÁpMBÄ*‰½YéçlªÂs†Osª¥¬À«)ñªÃE#ù>ÕåvãŸî¾ÏòÐ$ë®®¿÷kˆæª>ÇŸG>„L.Ö1>˜eýèD`æÝ{ï›]ù.un[E¶÷ŸÔ— p×Ç7\¡t2iÆ#­ö´:,Ÿ` ÄBÇÆ'÷˜øÄ¶,[2бu_–-!lÙF²$ËòØÍզǤt(%˜”ÌÐi‡éšNSh€Á¦>e¡~«%*%‰;ÊdxóŸ·ow¿wì{ß÷ûhÑðàÓζ_?@@ †L@%e©—¾{•%]ªÒ-¨˜äÉT󨠌̯¯rÖKÝ À6E¾†·}õ¥=êý~ú…ò>SQûÑ|eùúÝé¢I(Eà<.—OQÖ\ˆ| ÃPŠaÈl…6—à-ILÜòê²²üª²T{ð„‚Û©¶É€1\µ§BÔ^ ‚ÛÄÎK;j—´+“0nyVh¤¯Z3P­¥%UŸ”ª¥šÓ•4u¼_®aÀnOViúk´}rm\ë‘« dÒ7óÒ—¾’FŠp¾˜KñHn2É…õ„|X# Y$%8(Eq‚T,éµ”×öm(øIÎaMžÆ°McL×·ÑàaÉmj̱€ Ò˜×-1ä™5ùz]¡éìÀï·ƒtš˜  œÞãpò ˜ºñÙß•ù@‹ÙÚ×g耠·6›·Ð@R—s4guv= ŸV -aÆ »h•úh=ÉN©[1˜… ÝØ¥ªèVWø50BP™ÔVÚ©*wk¤]új¯¡Ôr0½tûÒ +ã …±H‚EòqŠâÅóùŒ'ŽåP${„Ï‹£È—Ä\ÖòDÁÆWRr6Iêö¦jK–Ûd+Úhü´USí2êD5åV:å´œ54®8ÉÎÚ×g…F6†ª´ àw«tÔ?¨6¼+Õž’iOÖèú:wµÒZ¤8°mïžµ›ÒSW p. †Þ®8—®´¸Ar8þñèFJÀâC\^I-sÉëÒ7ªŽd1ìÔ™òæ,Csf£=³Ùþ–Õ’ 1ÝdÊ2sL†l£>Ë Ë2sÍÑ¢ÕvíÏo§o…9„>o£S3w§>éýýù¡³ãwFÁ‘ÒOÆCÊ]s¦eÖ]äÑødÉh 1e4Yv6)wªŠ_/Œ'¤˜Çã¡$h„ËC¹8ºnÕªF“ùÒ§`@‚&Šà¦ñßÒçc†¦'§© ÄêÐätp’~Dû•àà kz†‰tOÇ›ï´D’¯P8Ú^¿~}ÇŽ$I! ‚¢èš5k†‡‡ûêsÃGÁƒi„k„R˜42þ‹^eXúúùßn—á\ gcbJÄá°…«zãÆ/Ì­:k´hä¦Îòo­uªž†œ1uToÓZ&ŽÆUºQù¾Úv®üÐQåP\*R w–¶di³¥éö¿¾üz$z& ì:y¢Ždq»}qcÆÂ–VÄõó9­ýˆÝ…´»÷ÀœŽÓH‹q<‘"^:>ðœ½i˜çü­í‡%±ÉË„/‚s³E|R²|Qƒió.è@Žw"ÞÁ¨Ñˆó£E¶žE'úæ[Oγõ/:ªA1‰#ã^ޱ˜u÷-ÔÚ~´¯„Å‹g xcˆ¤…{K«qœœãèE:ºÿÇìiäD?±£½ÇqAüo>>>Ùá$"¼É2‡299Ý_ö˜+xxBY tåÊ•”¤dðç)”€„ÍE×doÙëô˜Š\G*zµÑ¢ˆÝêÓ-gþráNpd44elƒ ^ܯÚ×y°vÀ s©4½vÛûnǯ{«œÍUe ƒ¬O_ê©ûJõÿG¿ Ð5ƒ1 Š€Š]õ §ºÆ©Rtj^]µGSéR<È|O¤™_S% `¡²G_Þ­w«ËºéÙ•{B*=J ‘ªn`9­¼KWëÖÊ]ê·JêU•u«ŠzÕEU¾¶bÃî­+~œ,BY¼˜XŠÁ~£XìF1Éâ\.Aä²pP‚Ob©bôÕ4"½ &7ÉXº¬UžÖR“Ö*_Ú¦H=Q "q*DN¹Ð-ùîiT­cÀïÐvÊŽ—¼ÓX «Üš¿gÝæ7R^^AŠ%,BÈÂEÖ„/ªqp ,Åév"^€‰SðÔ×ã׬Ú}xs­>[iÉӲ̖Ü&ÜÆ £%Ó|,×jËi6¿e´äšMYC¦˜ÈÄ”c7AÑ¢GU[àz ŒÂ9¿3þQû‡ê|t§Ì­ï·ùCÓ3Áñ[ú\USú¬írõ†lÌ«9ÇÖ”mÕgÔÚÆM‡rmIÙšŒ&`1¬‘ˆÄ1 5J`(GH V¯\UU)ýÕ/~9zo„Á’ˆÛ‰äAO'‡ñàí¶¦fîܼ{éÂgÏŸ;w.7ÿqszb:8ŒÄ5°¾åûâG  ƒƒƒÉÉɰàå„< ®8›#‚»ãÀíÐгããã~ú_a@ë'E3Ìwæ?Ä—}PéÇWPGm¯wà!„Ýlv“ä5â *¾áyˆ‚¼´(V@ÞžŽ"!›÷   !œmçj;mgzÓ™›¶3éœý£3ÎÍÔj¯ÞÝ(jÒߥיrSoâõ™ovžÍî>»Ïïù½|ÚŒðƒûæý¾gÞôÑ­[I|> $,6Á!0t«øð±‡rK°hdž2ÌÉ3”ãK…îD5Kuø¨ÎR¥Ojœ»¬ðR¦ÇJ³©à‡i8¶B;pÙœ¨m‘™‡Üúèg>ïÒë_Š`7¯oÉë¿÷·ÏR£9á±ÑQ‘1©o ›³E=ëÌ®æÑ«˜@†n®Y-vdp v¯×›ßT1q>7<|;'ŒÎÀù¥!Úž }Sëz§ÖuyB-S›L®`ÑH¨i³m0 öéõ–)¤¿;˜Ž²"’Qbëî}.”GfæaÑ\Hxi€[l’Y_·ÅØ ßD,?¥Ÿp ƒŽ«çÕid«¨†¼…Åmã]S«ü ‹¾åçË/›ÿ¥?û¿áAlG«<¿rî‡@ DÍìlcü÷þþù‰ì“ìH4žÅábLŒ¹ípÑ» –6‘GUêü6ð_UéRVÙ ú+Ì?µ2%v(+‡o”»$-.IµíŠÈE•Û%UnuùUîh«—VØ©Z—²ÒÖ*k:$µ£í¢1-¾ž©SŠhj³……G+s^È>Pž}¨*çDÓés Q“uÍñk†ÚE#2G¸r¬¶K/I.PÂQ%ü#¦†e X£íFéKÕz.NiÍ„¬Æ)©¾Þ`oƒ{j²*·&{ÞzCÐ&oïMßÐjµŽm¶Œn0Ú‘¡Û è@ÌÓHïÄ&ƒõ “1ýøbv!öW¦ë4bšØhþ ÄêFúì¡}ŽÍTr¶™ÍFydB『#"<ãЕœÚØ7²E߉ô÷oîõ ¼7´Ï½Å2¾Þ<ò=“-Ô<Ú3u"v×fãØšïø¥T œÇÁˆh6q8.afæ!Ë/B&àí@ >𸾋8¬ãê)|ì Δœ†mÃ¥Ë]tùû5¢~êâ¸"X4òºuÉ¡:UÕvI£]doµ RàKv‰È)6ÙgÚjvߢ‘PÜ!$!5ÑûG&‹Àð@Ž©v,-¨l­oî•6 )jí”Щ¸è„¡ÚAB§ì¢½­jDøt ¨iäF°¾¿aPZ**ÏI~o7m;‹G° „`(gq Ö`iPˆË`òxFÆ°èŒ ù„$I(Ö ¸;†›šÂy/=±èÝøsÙÉõ%‰×Êbeå)¦Æ¤>ñ;Ýâ=-üÞf¾¥%eðjâà•XksLs‚¹>©¯1©¿)y@œ4 NìoŠëo¥õ‰a 0@äð3Üõjw‹Á%Rßl”O7É=uíî:É”X>Ù,w7JÝMÔd½dªQꪽ1QßîËàŸ ±ÂÕ@iΊ¨’*ñ©3Çr ÷:òÎŽT7Ž… ‚ã/D0A$ c @wt˜x$:$e3ر ^ “Ÿ{¤lOéÕ¬y¥ÎS‹"Ö’ê”V_b”ç«UyÊ΂c¾J¿h'[kô¨Oh“:O§Í×js•j]‘¾«¬Ã÷Ø¿¸8¿èŸ›óy»k ZŒ ’Øf<‚À›ÿ§÷¿úÓ·¿úxâcs^Y$"Òö¨ ÊB- e*ze:RTEšb°ÊÕœ+e{Ëq2·ò «8Ô]8² i“8‰£8TçŒ]{­²Ïþ|g™Þøžûçüsþ@Z¦Ôòð”ïþ½Ï.·ˆ Jš .Êè «’1¼(-Îö×:üÒ¼þEÈ0ÞT𢾿ÔëÎl~ÚìÞ'~ïâÒÒM§'–àÀt1ÃÄØÌmïÉüC…xèÌù¤öÛ$“‡Çì<"ú¯·ÿ3]ðƒè‰Óļ¦Xx>ŸuÇ ·â „ظO®)Ÿ·w/HÔ”ª'mªY©aFiœ‘h‚E)ké·mgwìác$+ %y…&3ÀØ2)õdæ1½j_cÒoÔÿc§ |ÛÓ§O3öíÒÛ‚ooÔl²"½#ÈÐDh3ÄêAzÇB­®5«s¯“®ìýŽ·Š+ÑH’ÉårÒÂT d̃húÖw ‡ŽÜÜØ5¢›±Œoés¼)ÑlËÈÚšréÔ#ÛF½¹µÎ<øÊ4Ò?‰ô¸7Ò¯v#@ÃãoX]oª­aפC²Ã"È3~kiŦËLî0ugä¾ã›͉<^¼î_Ì—yP”÷Ç_S'‰Ñ•Ý÷>ö}w—åPÔxPD’ "UåQ´¢rËX9ö¾X¹–cÙ…L;é1Ó&©Ig:Mgœ¶SÍ4Ók2©FkrØ>/«ÄNœ ÉožùíoÞÝý½Ïïxžïç17!î¤Óƒt ‹3¸G‘Τ}iö#žñ¥ÿ‡¾ÆW›¥„ £QiqAÑ\ý…h}´<ù|î™°ÈB{ôšÁkE.š›?|(D §xŽ¥×ÉÏzí'|Úo3¾ªùŒ}ÚÒ]i]Å€¶ržh‹|º ¯¡¬»¾ÐV%ÄGa*’ä )ÐÁ  2sF d@ ”ä)T © ÂVÍ+ÎVvi_ï3žôhËü¦ã=µ$`ùîêr¼«a±ü‡ù|*¼¦*Ÿõt·ñ„õŒæôñÄÙê¸ Â¦"œ•±Ê45-. Yƒ^IPFñRB†¥Ê14EÇ@FIŒäà âå(*6†IØÌ¥lWdîä$s‡SÇRÃk+Îåñgrgsùs‡Âµù1Öâ­Í§â›OKXQrP†JŽÙæ«ÔyOéÚò«l9ŇÊÀ¬‡J-Kê4ù§“²ËÒŽîÊ<²S“¶51y}\Bø–ÍtT4¦ _Ë©qNiö`9÷€h))Š# §ñF` Lã83Áª^… 2ÕF*&AŸ²~÷±WTî)=¿¿F@§Ë23Mæ ›-Ãñ´iÄ‘î4î³Ù²ö¬F‡ÆnN5šØÎeé y:ýaÝEØñ¨¹!×.Y3,ÎL»}Õ’cûÍЯAz?›ý rû?ÞÿÈUêþàò_@ê!ÀïO/|€jO-ÈóõoM¿Ac²jš´{M6źÇô¤~™ÒÌ–4“-ÓbÍ6rtµÙµ?̨ΌK‹SÆÂN†ãªpRIË€p¨"t!ÌyNŽ…Évl¿46~÷îÑ¡iH"NL.0‰ÓbV«gx 4 `F¼{p^€ô Îè°€8,+#á|ã’“þzóº˜^æSSS‡ÕV0¿Í<ýÓBâ æ1|ñ–y` XÅìµ?ŒÙ¸‰…„Å‹Ç1ì/Êk>ѵÜ6¶L˜:Yv6^¡b1%IǧïÞ335=9?;$¦™EUáùÀĽû·þõiRâNÅVy¦xcì'uŽ{µæÛ Æ ã?u¶;zǤ¾éiÓ`ÏuC«;¯(Iņ…R¤”ãá2ÈYš‰ŽŒêru‚·°™¢"|ëœûäää;o½ÉP¥  !iõ z Ò9ŒôŽ}Ç9⺄´­èô>– Ú{—¹Æ` K<( •Òϧæ }~Ä5Ò;†ô!íPwlESûʼR#H^Í®F±œô]=Ï·"®>¤{ü‰i¤Ó´„´ù—‚«nâö"îÁ—©n“¨7 D(/D¬(©AÀÿ¾#®ɶí2%ǯY©d¥Ea±;WÛÛDŽjƒ•Ž/sŒ }o.i\î}®ë"â~ì{;¼KÛýH–ÁT‘,š'Å[†\pèsbÝð“@›~VwàK¡÷ÆÛ·ÅAüF‚„”äÖ÷-šÚ> é©+÷ zÏ• 6zê€J}¦ª“¦"o-+Uóœ€â°ù‘*µ ÃF”rzÈ AáPLÁC•Á'Ρ´D¹%"9w_y{0I™ÇPê3” Š·~¼yìoW>ž¸u/0»ÓÙ[ó÷#ga‹>ÃÔ–~AŸaiú¾uâæ$|™}B펨ï³bÜÍŠÿš ÌÝeOä’¹ÀÍ«7±û­éfcªÞ”f´ižœš²K¶T‹mŸÑšj€í2e˜L€m}¦¶ZS]˜Tø½˜”*ZB °$ŠW0.—Ó‚ —…I¿»iëÏÞøiFÀ·~|=%i7‡~0G“ ʲ(KW—&¼fÓìoÑä^HÑh¢#yéj¸„p¾0-z³î꟯A~ Šd›à`öËÒÎ×Obf3`8”ùOï­‹\· GårV‰b[á½òš‹ûóZçíӴΨï¸\|v=L°<‹ãxŸ' bÈBI¸xeáƒÜ¾í¯ýé*àF‹!-YóVù™Û Ö;çõ÷µwµÿn°OÔZž6Ü©mÔ;ï:>Ð:ì»ÒbqB +W2´ä¤]W®\ ,hýÿ„é[ØàÐàè| '{?\`@ë©$,1éìGº$F–´Ž ÃË;|Uç.Ïòö¤mP’z„”ËU¡Ò•‡!½£Ë[/"-ÃHËÒí[îîYUuVŸ¼†RlJ"1)C“sV'àJˆc$Ä}é‰i¤kéð-kõ-íBºG€Î!¢¼ã’ÜØŽÄÏÕ#þŸ¿ÐôÄáÎ=JÓ´JŠÒ|±c7‹òаµDr&Òñ£e]¾%î‘%Íð÷QÄíG:=Kºoû±ãmS;íjËà-æ]r†ûãèÏ.^°ÕÚþô»ðÑ3îÙ}©›Î7ú @ðD§Ú³Ð}Ú”V`0ÉWr»ò]^…ß§òÛóíz¹N_¨ÓÕÖª,Þ¬Þž–#M¤ Q.GD8Š% %u&g&oßøl}RºŒ¤À=Ù·ŒñS9«ÏlÏý´ªá÷FïsSð…Á îùØè¼ïôÜ®¨;½ac)¦H1œ/Šƒe¤¥ÞþábÅ™{åÿ±úúã_Ë&ëP 3üxxÿÎ=ð3Ã%bÎÝNо¨ÕNkýOu®GZóK«ë©‘~zÎôÂrPH >MPäwÓ3†=‡·9÷F]v89_]ÇF_ÍàølVI^Mfç¸Þñì²í%Ý @2©Y|±YÆšèx¢Þ;AÚx±r÷Þ”5<°rHÄ쯯¯ƒ_ñÆøø8Ì`£þ|v9MsH¾¢¶‘uç®›H þ‹´^};/knDB½+E<<•"%)[ÞµyX6èìGzzWÚ]‚ü£RQº„ … h¡Ò6}«þc¤' î¿"0ßq ñö/˜F®ô"íý,z—†®ÅÁZ—¶Ût.mïD|mHÿPœ§ó;ÍÁ%!¤«—L^‡ó×.ß´ i¾òÞ™’âA·Ü@ZÃoyúðçËœýȵ!Ä׎tö½xí÷E‚W‘–~¤9ï½»}•ÈË–Pø*äþ $Ì+ ‰ÍßÈ`;¶™™‘§Ïe)æ¢ÐÁÊv®kè6}ã˜ñ_ªôb>&Å \Ä^ ÁeİEŒ †Ã ©#ø8äPŠRixrµaGjÎÁÌýG¶–î:Q¹÷ €‡¶X£?¬7Œf‹š¦UVÖÇN›ÜAËí6¥Ý¡v ¬›ó-V… dWº*wÌ|m ´Ø4¢Q^Š¢wòk–7&bæ7=Ñ437ÉÚß3 šaæò,s'pÇ®¤Íj«é°q죳ìÚô(3ñìËá¡æOíE–¥Ï¯p›U†¡æ! ‘3Ìî;@#.í-v˜ä¶…îàÍZàAƬ*—-ßÉ¢šÂí’»Þ¼j/€ ›4¥Õª¶Ò*º©Hw^}¾p‹:[´A Ça(ÀdÎ=vì/Ž’¼›°F–"KçògdÝ©¹>8þr Ò2== æÅ’Ø=§¦¦bàH]C£„’‘g)š»¦ëø™Ñ¦à3cÜäyd±;ì#Ã(í¾o´=7z÷É’e$† ùðëõX3sscSãÌ›k ÿñ•Ù`Ž~ò4#-|“ü“°ö7ë”É÷Bc‡<ÓÚ¦õöŦ‘i­õKƒí‰=ðXk1ØGMîûÖ€G} Cù±î#%)ùáÇ̼-@~ý£;fþ8Æ<ÔítM‘*N\‹®Û‚8|Ë:†–#Hgi»þZ0õ°Ýy}Y(€fçˆPž€¯Í{…ž^i±'|T+X—‡bhÁ„8àˆàEº‚´E`G|û'ñÖV$Ôövèæ‚i¤5×1Yâï‹k-õ_]ìC"7ãü7âá•…Ç1iªݸÄÕ¾ZyOâKx¼U÷òjO”.a+«J‘®>$té¸ 0󶽋ý38ð–ûÖké«ýæ’`4>| iíÿ¶Ã‹¦dCO™Œ¥°E›Æ:ˆ˜!ÆÎìÿxÄzx§lÇ0ƒ×ᤈ gâì>¥¨ÿßÐHUÔ\µTvjªûL§#Úª(]î!Q¤$®LÂMiT‚4Mͤ²·¦älKËÍMݶ-%g‹l³rƒJUP¼±øèæãå•Ö쯩?X^uѤ6™çaædáÁ!·¹o¾“.°Ú ìöB‡³ÀåÈw9ån·Ür)< X±€­«,tM¡­E.Kâ²[T¬™ÂÝìj‹»pÁ®½Pýjð̸‹ë£ì!™ø;óåÛÔyÆqChËÔÑB‚ïŽï„0n´(™(ê4–Ä×$4+Ý:n&Êe,‰ísŽís·}œ8q;q®Ð T:Ê@]WmÓ˜TíÒ%ëÔ}ئNP. ‰˜Äœ=ÇÞX? ‰HAìä¯ã£s}ò¼ïûü?q#ñÑùß~8ðók®}ò«?¨ÌÞŸÝŸJßà»ê"O¨†{?|U –éd’ŸºýÉMêM»k/kc¿Á°5Ô/‡¯š¬™æ‡±³À!d™—±R¸äŸkœ„ؼòß"ì~Ê`l¯‰ðUà„™„”²çrø$h â&‚Ýí'w“®Ýî=¯¼¾É¸ÈSg„Y. ¥J¡,PHT+Õ«dÞWËo‘ $8……¦°à„‹#CÈ 9Bñ „K½åméÚëX­•çÊrµZµB"Û¼qÓGF¢þ¼×·/zeÖžÀ@ýAN!‘k ‰óCÖê;žÐtý9Gh€¨i'žtá3—Àü óΑ“¥’3™e8¬â1yŸ4ô¹¢@ 0%&fi>ý×ß|:èFl¸¯š@Í`ª¦²†¶·Âü¸0Rð÷€¹:ê©$ð2³bc×Ç€cR þÝðEöµabß }ÐÿS°=~öìŸ&ÜV7i"2\á§+Csµœ‚7@~¼6Êg'Ù ?¸É‡Ûh²’…ìAb!Ïð ¿Å0áaÊ…QÞ;j©ßºú« ‰D/%8¡‘K·Èäç›ôwLüó˜[ û _ é $\ôäi<…n{˜(ž@é[næƒS®Ír9ô’ЀLåк ÝVHæ·¾ËqÃâ={ö¬F©–Š%+ z£T|ºtçMOp Ž!¾[Nz òhˆo`÷Ïî4G˜»žÈëk6õ¥T®“iÏKÁh§ç“Ff2¦™õwøÊ•+:V£2è”rô[åÐHã({Ç÷Äiäž‹š$Bã.:íòóîo._S¹I£/”Ke@#Û·½<“ú/;=-?züM¨äÐ>>˜äò¥÷t…A£—U©‹r1RÔzaAóQgô‘îÜÞ· 9‘·uõH¿S«hµ:™\“k,רebµ\¬Ñ.­¬Êñ‡¶^xŽu/©=o\+SÉ fW¨£®4²¸íG¢ð°¨mÞ&ê^é…Wå´õ tZæoUmZ®VÉJ6Ãm‹·¿Z¨W†¹EÁAQì]Qóż]•ËJm/b¨êëf­ø+Ë¿iEZžm}ûQß]‰?à ‰"çDíqQkÿbˆÄÙ¨5ÃRV½J½aÝú‘ÿɲúô¶K—/¯Y³F%SêÕjýzã[‘§Ï/ C]Σ1°Z°rì öxAª—I¡¬Ê•ï_ú‰ÐÜÎ IN ¿éìL~8¥æ*Ñý4T¹Lé€ÉL:5û³k¿Þúµ­ºòb©Ò •ÊÕ+¤/©÷±'ç+þúnïѨh€¡.ŽîÀ=¾ÛÓp ß}p9˜øïŽÄºnô`Ÿó@O£#ž•h“'1'\ÚÛçÜw:úÝ@/p¦.ê¬ïvê@ßì…KnG*ÐNÜ€À q€7H š˜Tßã>G÷ azéòµR•B·j›±xÜ-dãH;‡[¤-c%Í~Æ$+X÷ZpÂN<6X/ÇNbÍ$m%h«²<´Ý+˜cF`‹€YÁ³>0zpžß´pSÄVP‚Ì,œ¤,¬ÏLV–ª >iA«7Go5$Ò| ëÁ+˜PÙÜDmÁ`Y0li&̾^¤˜c†ŸâS÷îÌv’6sT?Ý)L¼Ðk¤'ÿžhx ¹º:ý™`ÍS|"ÉOðc|äT+UM{w‘¬•ñš(Èê\ãl6‚&?$h F€TC½:#Xްf®fòLT’€‚œ©…+kálaÔŽî,~¥Hf0*¡&©e±iíÆé g输™r÷PìrÚͦœLÒÉÜsGÙ»¾Àšl$ïctÒí™vÓ“XøÃcX©Xè¶ ÄA#àgجYÌo}[¸l³Ö922ÌX /4ê%Jqeñº¿4ÐIW@@ŸwÖÕ Ç7涇sÓ·)î3Œz€pS§¸áº“Jq¾V¥1(t›¶lÉ ô¼¹ðL&Êl Ù€!N¥\ñ/îË<6ªãŽãom.'´iðµçÛ·‡wm¯qŒi•Aœ¤'¾ ­h›ð±k\ Q°÷z{¿õµö¾öô®m@iˆE¤ÿ4iD«þÓH¨mUuUJ… Ø€½w³ÏÙ*h,ÙDéè§§ÙÙy3ó~3¿ß÷3&þ³ŠæÌÎÙÓ¦»Ê®»*Ëu¹Ö4rKCÆ4Ö95uWMÍv{ª£”Åõ‚‘øÃß|;E¯`oµœðØÊþÆêB¾8Ÿà”å²yÛwn°9±Á ˜ß9¼˜Ý¹&2†Þb€÷CÝÇpùAýöqÌHü–Í›­è\ÿ|cžt+ÎâÃyÈyqoæqMlêw¯ï1åìyµCñsŠñ¼Âlqö®¬Ï¹Ry(Ù'C!ÌáÁ\Á'ûdzxJ&+f>ñô3Û„O$ȳ¥›•ú ê³ù‡m. N,-æâ|.—S\’{øø†¾60†õ2¡õÎs©¯îJÁ0 °'(ƒ@¬×‡™‡D"Q¾@"áIʲYÛJe—?ûkŽÀ<èåLãHìQaLwN¦Ž:}Šèc‰DúEhYê†ÒB<º—=ØT%¿}ûö‰'ø\¾„/,ŠØ9[Ä%‚§~zÂoñju«Û|d˨ªÅ£iói@ñAàÚG;ìUh[Çt ¤ ¯¶= WøuÐD t°5¨>äSÂëŠ1F…]kAóŽkA—å£Ê7CԮʊbœà[jêè|H{‰vKŠ7Òyb)ã±}—ïÑ•p4JסD£Q’$aãàÁ»}[¹Ü¡jÕʃäaò|©œÐä#WLSÍòz³[½¼åñ›Â«&pžˆ¸üïÊvPÕ:CÕ\kZ-•7ÕÀÌ€.H:͆:“¾Ö „CCŽ¥Ú †ð£Ê ¶ÖÔñ0ÓUk߸”œG¬±\¸ò‡+†FƒmÏ€s¯ÓVk36´Õ$bª˜?ýè/ñ$R±Ä| àªìÑׯ}|5èÿD“ ‘»áä=0tü"Éù«‹>¹¿{° 𛵡‹&4KµZë‡a‘{ëiñÉúnsM7UÙm­ï9[¯Ú÷íW¤xÎÉËÆs”•zVSwÏœÖ΂|“]S·yuלÊ:¯¤ày[i™7Ùþ©1½UÕÀç²Äb!çìm»yó&¶Åä|<ºR}¡³„^:ÝѲ°”QèÂÖü}ú²Q‡ ™lönœ˜ê4E;¨¥aFKE:ªÎ•e¦Ã²SJ|œÇ‡”ñþ¥_'#(—>0õò;ËJ׿ônlØÿ §;›²­·Z7êMëmY®à¦¾ ØðElȇV²%¥L¡'DxŸ){vs‹"³Ï¾Áæ_-aôOeaƒ°æ ¹fwþÁæ%E\ºu KÇ~ú¥ÊŒ~Öÿ6£2ÃíãWìÄùRv>.å[ ‹YU?Ùdļo#°qÁv°ñÌÁsë†Î£wŠ8ÆhYçÏ ëõqŽŸÌIE¹L¡@Äc ¶ÊŠÿxåãÔ5 y5PMŒ>òT@·4“¤ -´ôÉT8 >‰¥¿æÃ‹´ÃÍ¥¬PV̱ ~>ö[ÌU~àçcÓpg“OuÔ¯“{4Ç‚FxõkÛCúCÃgÚÆÈ¶ É–[­pkÚÝZx"ójåî…§³Í§jõ©å~ jÿÚIS[Ûv»a·ñ‹ß|1ÂF— 0÷Ùë?ý#F§ÑX,™Vž"€Ã8`L¦MS o2ƒ¢44£qÒ™{cÓXéL“9W»cýn%¾P'%Éd8–ø£¥E"§ì£zgIßÔ[ú.؆+SU·^¨¡FÇ $PÿuÎ é'«ß9r6« ™X(Z¹råÝ/¿{–R>y±ÀÏJ>Ýq3:š‡ØÑ ÞR\"*‰å˜8¼§àÖ¦×â¼e"ïiÉa½óÎÔU~ ‚ü‡Áþg­s…SÁÚE©LÆä¹qƒOüàwþ3'ü7ý´Xм{åH8¦ÉtnN–ÈõVØû “†çKˆ›z2bp<0¹>×Ù¥ÈaU•L(¥Œ¢(èäàààäÒóâµa¶Þ‡Œ E"&—‰’ ñü5‘«ù»P]7òtÎô´Çø¨®ù:fº»QS+ò†âªÛÜ]±µÜ¨6ŒÜÁ—<—»#ÁÕ9Ã×ørI©:muŠXºH$Par"õyûŠâžoª¿ˆš."Whº4‚|`†`tÉ߉HÞ+È× Zø®·~íašQý%UŒÏÿjY ±`N’ÊT©j.6+U•<¯ð rPc ò/ ŽŠ‚¤@SÛ|p‹è<`’0€„¨^Â3÷•¦.Sc‰r‰H.Â4[7ß¹ÝÃÕÄQ ÛßßÏ> ¨“ß¾ªN>ŸMc\<ˆ ÃöÆßþ~âøÉKW€Cdb f± dž'É–®ã ùdY³å@“îH‡µ  -hª€‚XØPY2Cpäõ‡ZÅMzpHiÀ•—?'„ù-Ú‚€¾¬,nÒîsŸ,l¸PÚf. >÷ªZ2µhõGšõ ²`]¦–àA8h†|^_ŸñQîS^#ù‡=|ØÂ s/{t ™0[“%Ç 0‰Høºæ@nI4RÐfi¬<ÖbúFáÕü€-ðùO'ˆòÿ§K–Ýš ¥œ±g1t¶Ã¡a  JrÁ݈´ææl«)‹4Nß}¿i[mU»\d¾íá– Ü$êcÉB’̵ØwÚu[ôäÚ›× K7½xêã0hc„ Yƒö´#£Ê©©¶æÚª ÝœC"ì~þYm©ˆö sh 8„§È8Ìxªi¦O}ðSÀ¼,Æ™íŠPé4€“Ù:ý.í†Ô iÄÂy†‹Ó¤’m ÿé¼ù«s$PdXOß:­Ò3ƒ³OËLUÝnë¨{&çíJÓ!³ ÎôUR·LžËW$ ©L, ø›"\²zR*›ª=VÐ'%>nòå¥å’D±œP$)”*)Q½#¯òô0Þ72_VGÌ®»çÉÛ¦)5uß@Ý4ÓÃZïÙÛqL¤ pY¢Xg0LîŸ(ø¹ÿlm<3G³PyÙ1L,!p¥›û“CŽdŸ‰h«`{Ï]#÷IGß9KïyúÀºµB(ˈ”o­]ÿ¨X<¤×Äá ÔFà%aýºJ¦% å’Ù„P)8e@ !ÔÒ¼3kÚ^ñ†¯ŠoL ”û–_+”ûwTyäéz¥ö"r_Fõ]35󷿉ñd…ŒP‹p¦œ»67AkŒklŒ¯ o;ªkç ½¿cú4*ˆz©¶%¶®ƒCœNÔ‘ÿr½S{µ4¼tpŸlá¥x® ÓÖÌ:s [¼xμD¥rsLU3‚¯{‚\ø‚QfHÂ1µáxo×c÷Ô¶>ŒjxU·½žX©R-’ã‰$E¢ÌLÏè»Ó y¯ž<6ž`rþ~½ÀŸáq;mãßšüÊ¥ËPC1Fˆ¤É0ÄBÙ"E¬(„*iʺ;*‹Ê-'ƒÔÑó‘h,4W–µš@%!3Ä¡†Ê#óÑ€¥¨A_h9ž]þã {·ý ?#ûô¾|êD±O[Úd*è´í÷7WKZ‡:@¡¦Šç]=‹º’€4Õ|UÆ:à¾Z&p]»v PÇ „L>þð#£Þ›óæêï©•jq¢X+6ÿpóÛ»÷ë/?¸zëŸ71f”ÛH$2žÇØ_ò+ ·²H–¼µì¸ßX2 ëáIaeÍÆ§v˜§¯‘ @À<·èÿF¬Ù[Í…ÆFf’¶t+“IÑÚ4ÓNiö,§=§ŠÎu}[¡3(ߦ<˧W>eD_†ûA÷UÈa›¥ám?“Î@W-{̽ˎ =‹ÀÌa¦rSP„Nw‚L™ÖŸ5þ¢ö”O›g²fSp=¹¤²H[Ž™ÞÁðfŠ€Ix™@LWÿÍø5 ˆ=ƒ±¦s· ól–®“¼)%Y$’BY&–·˜¢Q½8xaKÚfHP´IH Aj ¥b©‘8ᇲø=»v›Œìõ/®ÁƒnLŽjff7¤®‡Ä’„B VÓi(ój‹|j˜o•Ÿ Ú“úÂÉ<¥<ß4rCr¬ ÂðZcËÊç N³Mæ³9ÛÊÑH¦Í¼×nʰ=+±çÚÁtYLËñ–аӸ\7úýˆ-ÇdÏ5ëvªÍJV›¯ùò³ë«„‚p¼þé5&Ÿ±ÉmòF6“›ˆ]Þ¬ÊÕ™ ¬Æ,3»ÇܬpÂ]&SÃäÒ0_@0ø º€4bÈ5ð€† Ö¤0³Ø“{ç¥f'¾"&¨„h1”#¨$fy**(«º­vŸÕ­ßц Ú(2ª³þGe ªªnc:û°Ê4 ¢³ß‚N= (2®²|§v¼/•D"!Ñk¿ÿÃÔ“ÓÈO%ÕýDÇïÄ»“|xvîÊ81ùJìjUñæ¶oÙ¶»*ëPƒqHc«cCLóPá¶Þ>¢µ<Ìÿ[zóh;~ÖdÚåkÖ¬BÑ8 §„x xÐÇV…n÷ô}6d1™1! yKÝ}‰[UÙUw+ú# ³>c¹å̆í…h”ÃÅqÂxOK@¾LGQ¤d}Âþê#5ÝÆ*¯áH·ªÄ«®èÑ”w×?mõ,r«Oz˜" T@$á)BL‚‘¯§½1 Îý€\ûã»ßÝ%!Ä"!lF¨-.ÄÁ O$,B&–À/ÀãPÅá4I–°a]ªÕj½yóæý ‡f§gzŸK,M¢•öú 7]êQ—ÏÑH…û14qæÇJSÕk„>$pÊyži$›£è°r“QÁêz:O§ÎÓh•:0BÏÈ}ž(Æœ<+áè(Ëx Í§¿þü+Èvœ²Ì„~çø ®¨÷©ìÇmÿºñO€n«BZÿw¨í¤K³‹vä63ú=LA¿—µ)í̆Íbí ;\×ehÍy¬%ßïŸgèŠè3 è?“­×çàÍ–|«N©+ÛY’ž²…ŠÆ)’#Äb0™ ¦zëŽou!uóˆÎ44ŽÖ›&µŽ1Ú(2nlÓ˜¦n´}¤Ž ÕÚ~d'ãZ;If§§9+ŸÂ0•KkOŸ™œ>©¾ð m>òyjjª¿¿ª¾ˆHB1…,ùÚtGk jlãŒcð©ÎÔ:n³Mß×냪‡ú?l²«ÌwèÆ µ³§ (EŒEc‚$Lœžž>66Æ+4?«Á³¼ÿ_}ùÈÆRJ$‘üv%x;¤5ÜVÁ“Qâö´idÄØL¿“IRTlŒP&‘nHJùaäÖÌô=ùx°æz°ÿÿÒfBÁIX-л;uãó+dl¼¥~…Ã\“…Çë9ýmŒhíãhÄå]Ü@ÚH{¤ù…ÖÞ[{"AýÁ\=áŽß >ϲ³GEÒµËs†ûÆ‹ˆëS¤Óáê žiˆh,rôE¶ÁõÁ…¢‘¥NïbŽÀäã"|9 ‡/v|Œ4.uwái[Pa”˜HŒ}ï0Òé_âì ‡µ_@L®—s*cßÈŒÚñ.rÆ@²ÄÕÏÑH«iç^Ž8{"Ú<üD#À*íw¤«¦ÆÝmû(ÂæY&W¼*x „’’¬½™Ã·†@øBÛóÂc-¬¢«W¯*•JXlÀ!p„ÅOb »÷fùŽ"£ÌR{Ôc(ò3Žt‘»¡Ò¯9ê¥9 ððÑå`^M©[ýn5ß;_[0–t¨×elÄ-_…c$!¦ÄP+‘'0BBéH„"QŽdlêžÍ…Žšª~h¤Ì§*u?u)ñÒ@#€L~Cœ(*%“‰(¥bßÔôôÌ\J¹téÒª•)\*@qˆƒÃ!‡$'$§mLÛºeÛúuH P€+|¸`JÐ?ÂÍM"!¢°°ðòåËüO©«ýjH‰‚rCee·ŽçÐñ2Ï£h„çž7€=ŽúõµŸ4”œWó@ÂxŽiÄ–c±ä‚ ³Úl]í®ÚÊ­Gm|¿`íþ‚×÷)Ö+ó_Ëߟz 8­¨zû):KeV.=¡óŒÀBàª:WíRµq42—îÆ¾¾Ó©íúæÊß ›™ A:‡ëÁñéÖšvFÉ6É[ØÝ&‹Ü¬ËÓér«ÜaÎa9Ë3±9F0›Òjͳ2àŠÅª°“‡@Ÿ'“y>YË7òisµ‡6\+XMF âÉXqt¢ÙRâDLt¥Þ4Í´Þù/õeÜÄ}Åñ•iÒ[ÚK»«Ë7J L)Iè”úD`3t°±-ËÁsÛÖ±º/ËØ€ñ!Y’-›£MšvÚšN;ÍA ÅôN;™Ò!%ÄÆ’,[ê[/¸NÍŒ;öt²ófç·ûÓè÷~oß{ßÏï¤yˆuŽ7Ø'4î‡ZècXã¹Çšg¸3V€Ïµö:û°Þ9¢uŒë\czÓX½íæs Ae&C=‰þöÉ_æ¬/Ó=ïoÑ(H WËW¯^ˆ ¸Î³JLîÈÝ0Ⱥ±MhLŸ‚ÿls¤ÞfÏþCïü;k‹XܱS³úß`ÕÚ»F›† m™i -¡¥É8†a7nÜàWŸqà¸fšóƒ¾ùÚNèГ¡ilÛ´1¬ë˜Ð»ïé QÖ ae]cö…¦‘ªS™¸P@Ñ´$MŽÓk!HßÉ'qN<¡/þšÀ/ÊŇšç(«Õj¾o§S«òMË›."­þå—Ïe¤Å·´½{6*àDù¿ZÛ¥%ž­‘s×ö.ëøÁJG×Êvߢ–ïÏ í¤³ië[ÑâYz·t\ž/JYÑ:ð\ó%¤Ù‡tzŸ¯R£hv*F 7K–¸. Þ+ËÏ÷%,èä5¤@ŒÒ)D!#ä²Ü•õúg›}‹=Ëšý+Zz–´œô!û‘ÎiéE:úQž½8Àí«­Ù…þiVáÈäys;Rz<ƒ~… Å×4¶d¥ÿîý ÷E'qNTÿ…èSO,3pçßÇß ;RGá"†KI #$AMŠ@aÖ–5 å¾¹ªÈbY@ÿ†·±Îg)8P,§ER‚¢ §¦ZõÎÛßÿ胵š-›_쉉 d^Lˆ2è×—«; ݺò[í7ðx£ê5Tú´B󥞕=ššn¬uÌc1˜\DQ²{/ô¯øÄÄ›ï4è$F“d$‘kE¹¯bWÙ³l`°là·Êß«ú¿•wæìúü2QÖ&œ3XJ*™”A­i– S2Q(JKÿú±¢t ³«QLBT_ÐVôzO«CF@¯ŠÞYi¤,`TuÕ^}OSÞ§ûޝAí5ýdððM#Âøô“£>ëžSµAýa˜Eé1(}FeÀPåÈi´« é5Acy@« êùÀ”=©@²`¦À*º5ÀH5Ý N#.E³­Ð ªj+°€òÂAgí…-æo»šö´Â¬9ßb.2Û÷Øë_;]´½àÕÜí/¦®O#¤bT$æR(‘ƒ@0BBˆIi1p#.@7çn¬ÙY¥Ý«5ï6YóìÍÅ-¶|—¥Èn.^pJ‡­ »!CS±ñÞ/ïB=ŽqÂUߣøxŽc“ax‘¸›è:Ù½Ðþpž¾ƒ9v;Á+ˆ*ŒÍ ›!ßè,̳9ò-€O¦»UÑ䆰³%'^–n I¨ )’aPÅ$“ -ÍLAUÛ¶Ÿ6\X×¼ ŸÆ1npŒhíG¿±UD bœåÚΩØ$ó±ècÕ›‘¼™¯&ü›hlrú´ áæºÝX"Òßß·†Ê‚”¡Ñäýësn×kâ–³O™FŒsö jœu}¦1E`pÚ~®p/”<ô *JŠÃ‰h„û´17Ÿ¢Íà\4›šF¦tá6;‡mÄã“”å)$ yžÆÈ0š¾w\?Ô` â@HëOøñ|Å?ª·<Ôš¢:×ÃǤ¶uLï¾krMÕ;·lxI§ÒJ¬to /"ñ©yƒÿË5ÃT| ¥§§Ó@^Á ò´/m/^ÞÙ³â\iíA¼œ¸ÏF`*€tô Ý àþeçýÇ~Nå—¹ú—3t†Ž ÒXÜÖ;_4‚\q áíG.…ž±:’whNÒ«ö+Ÿq·¬¬:&”¬CŤ4E@IÄ”˜â«I‘\˜µc‰ÁŽtõ.i !í!¤ÍÈ´ï[Ôv iïãvtÖ@Â!JkpqK{ LÕxîb€di¡‚ÄRqM¥Ä(fäÈ~sóT$öð9Ä}<æQ„{Ž'ÞùÞÛ¹9ëi”’´ £ óÃE©ô‹»¾^R_©j׿é7ÏU•€*ƒFe¯¹º¥É–Ð#bŽ­‹†#°(ë †Öde‹0òG…ÀC/I/l­vŸV{9©ôê*}úê$ò§˜¤¶×8_4rü¦O4¢ö˜ÄjZˆ¿®(å´cd4gm:ÑŒBKÂÒ kôÇ?=ÑÿÁÑkƒÊ+wÊ/ß©¸2X}嶪ÿWÊàí×ë®Þªí}ï€Õ·íÀQñ†W¾,”ËPFN‰ÐK’$ ³¥Ù¹˜A3Iz5ƒªÚt%U[ãתz`¬›•š‚ÆÊ.M§¡¦W_Ö£­èf;~<†<-oã‰)Ó[Æê€æp·®Úk®ô²Ê€ BWíÑð™kÛ4µ]úÚ€¥ªS§îµUujT=ð.°e]õªéOU=úê îU~¶Â3+Íóm®=M Ž–<h"¨¡%SIÇ.KS‘ÓoÐ)´u…Çw­Ëû•›ŽeK’ii #@–Ô’ŠCBÆH€C …€I(œ”‹¥0†¤ÊL’o—l=²óˆcŸË”gvîv;Š›, ,ý`–“¹Èb/rÁÖ ùúköP§ÑØŒâLCÉDâÖ»·š*› E¦…ö â Âc O&à›£Àl+²ž±…S±ÓZì²æ[í»,Ú"mÍ«ªµ)ÙY¢t)‰c8Š­ËÎÙµs§‡Be²p²ußþ¨ñì0ëÕÚçFlÃFûˆÆö£#'å*@19)Þºi×+¦â™äÉa6ño(¿„G^Y¢Ü\<†85>éð{$ÃÀ€gbEF·:ó}£sXk ÝC:Ç\ý34²ÎaÖöHk‹ÏÿºÑº‘ áHÌFáøÏö^||S>MLÆž¢ƒÓ‡yÿïëIÃ>u¤NŽSà¸ò{ÕWÝ¥‡E`õq¶‰§HæÑ¢ûç¦û{Œu?8c½ßè1¶º¿•g1™ˆøøOæˆ:y e}á®H$÷‰‰Ç¬{ýúuÇSE©)ÿä¾Îƒ¢<ï8€¿Ê£Ik–=Þcß÷Ý 55Ö«IFQ¨/DX`Axpì.{°'×Â.ì{°\»€&6flÒNÒFLMcKJÂØÖfÆ?’V‘åØþ^V¤3f†)þÑî¼³ó¾Ï¼ûîó>ïû<ßÏÏÃÉO¤§Ã[×´ vˆÝ+³ÕÈ|›T^á]Pëžow!• áRµMæ2¤Þîxoa•±6#Xuûâ*çœiÄîeÌ`óÁ¿D8¼K䆅ÉG—&§ÀE66q¨WA\Ë94ºj{tNÁ’ó1»¶c¸@EGmO@jëÃë:g'ÒÔiír„×´EÔ¶†×´„Ygî†Âá¢0íè©wH"ê¼/˜ÝQyù°P@zBM‹qɪØkï\…{20ä'S54`?ðàáÛ¾.ˆKXÕa‘ÎâD‘ËèŸ%îLמ:ã1œhÕ§yKµÌ:å!Ú2šä²&U\ÞAÅ“$dú–Í[Ÿôæ]hÂghh(35J]à7Ta$ÎW‹ãRrì%Þ²,§2ÃU’íeðÁÕpq®4’é.Îu*2\ŠÓn=æÒ& “÷ì ŽN$'ý§1aûÓ,S{AÇï²»>—vüéxûŸû¾Ìð}‘éëÍîüLÖy3½ó;©¾Ûé]·sºûO¶Ý’Õ”n~wkRÖt£(3—ùìÊr+¤MsÝÊl·VÖ¬Âe7–6|äÿjìë¿Þ½ñ×[—oþÚõÁ¥ªKîóõºB—ñ¤£4»AðÈhSÁd{T0ÎÙ`?0Œ›iÉôÌz=cƒx½9ÁX1…eñºòýeûUÊ䢣›n$Ö‹ØBŸ†‹Æð9BT(Æ…"BHb|f#˜ Ãx˜À!IS8ß°- k [ð*öÊ¡‡J“Ô†d³~¯Q»û™G¿.^ÃÜu‚‰ñU¼Fy@>rgˆËL¼‡ÓÁ‘`ïµ^ë)«z¿Z¯1&˜ŸyxI&F}ñ̳€ýС1Q[¯ÕÄéôI•æ‹.Ù¤IT«÷)_[õº0J"ä‰y\åÂÂ{#n÷ç}_ht1-qHÊ»œqr¬´âžR?‡S•ß/5<(5SR¾{õj…¯ ð|?øÕûãIž$È”´ßm™„†´ ÇÆÇóÏâÉÆh±˜ä²€"½4Ãr󤾿ŸÅÚo†‘Ró¬»ZbPe£JÓp±éžª¦<þ@,Á¥pRˆ’Gß„Bald4´Ø&ŸšÛ¡’0dªPça¹žžœ N¼uæ¬8“°˜B†±/îxcPYŠÿ–†EŠp*½‚T[êýˆ£5ÆXÉÚ¶C ÐÑ¥qt#¶Žyฅú¶p{ǼÚ¤Ò C¤œÓ2ÏÖDaÚë[g@âAjH]û|KCX–”Âh åBêñ0ŒâG».f O§'gJ†ññàã"ßí~gÅàl¶€"Q‚‹Qè†;Žhóó]Zi£2ÝÉDU¦KžÑX4ë w+ ×òjÁæ— šÏç ±”ÐëõS$øxö=êÌTðæõO·mØÂ欤ÅB ç²X$¾ôÚº4uÞ·ö„GíQf¸‹ —O4ËçJ#RWQN“ü˜³$ßUF¯ d†­[¹¦·ç§ qÙ{\Û–ÝÑ›æûCª¿ï˜¿/³ó¶¬ó/2–¯7ËwKÖýÇ4¿ÔÿeޝÿdG^[߉ö>™¯/Û×'äZÞÙ¾û0MPK‰ÓË0!\yÝÎ-ç\†9Ù¬Ìr=õ¾d®¢ŒÆ 'ÚTR§"·AuëÞfý @ 8 À@N½ß"u2&iÖÀ@嶨O7ë¯|ö›ÉµÀécÌ/¦Æ‚S#Á‰Ûw;?¾ªë´¦Õž—¶–æ¶•IåMšsNÝ)›ò¬GŸÙüS?kö›T{Õ€ ˆaŽ Í7ÍêDí¡¸ÔÕÔZ *{lž"P^´€æalçñE´hÓ†Miii‹åêÕ«===¿¿ñÉë==_‡ÍÕäL=rtíê5\6'¹ð ØüUÜ—2~ž¡LP‚F,IÖgþ¦½ZS¢R4bJÒ+â‹®Õ½¼ùjøFW)ËT¼W®K(SïRkã´†„§ŽÏj6 |3I‚‡bÐî-S'êMI¦=æò]&S¼®$¡(e[Ê l%Å¡h\¥ O ¥ZÍÄÔ4L×Êš*à4ÔS$‰ýVvÒð¾Ú8Z2gV› µ5UcÅ•öCÇI>›fs KLØZǘ¥læ3õý( •Z¡a–—i0zâòtáE Å%k5•˜Ô¦•Œ€™ÑÂÊ¿ÉË7â<Aˆ) C¸lM0íÆ&&fÖ¸JíÑÑÑÇ}f¬ õÈа¬è `9JƒÃci2eÕšoô–@±Úááû‡ÿýö­¼@2Z¢»¯ÒNjª¾–—'n؃²ø(”¹hRü>èa(DþŸ4Ò` øî+488¸iíú%¬¥"‚µäâ×ãFçóÖnÄÚ1kX=ó,íˆË‹Øë_Ô;{gdƒ{Ñæ±QB½rQÊá£e¾µЂ4y ÖçJ#5n¤¦©ó!¶.¤ÖÏìÔ1_Páø‘â‚$[ÆŠb<ŠÔ[®<§·…×vG:†rX°‚ÿødÒÐ…X»ÀQ 0€ 6x0ü°ÊZ€Rj¢@;p…Q ܯ­vÙÛžËÉ£$빘`F ¹K„´àT~ÁøØÃàô÷Àt°­¹EôoîË=¨©;‹ã×U[uk»> ûÌMAD«XºµÕºív}ì(ò«¶ÛZyä%‚BòIAQ!I€|­kÝq×ÙvZ·»Õ–—Öºkkw«ˆ²ç’Jeg˜ú›3w’ß½ó»çwîùïç4ašDiŒXD§ì—KÊó@A†ÒÜYV\™'+?ã·Ê‹«••ZIÁ¾¹<. / a¿¶rÕàð Ïç ü¯^f€‘ÌÀƒ{ŒZÊQ|MÅÂæ £ÃÖ§nÊ9ªÝí4$W(¤5jÚ ¤ñU*y¥þù•Ñ<’À0ŒÇ%’’â¤PPŒÓol•%»þ‘|öð†¤¡Yìi–¸›%®&y ƒÀ$© -bÏe¹÷óLoãnOsf]³¼¶K©oÞîmÏ<×!q^Û«£W'…pJpY¿‰Z¾LlÙ¿³R—å5%—Èé?ž7¦«Žý™<–Um¬¹ôAo`$nþ@çà}¦Ö õ 3Ý<£”8óR\°/…Ì•Ÿ^®ýKÓ%x,Ð; ×>¨ÑƒýC¡á!ÿHÿxóþ×¥rÂ{r2º3_üùVoçû__¾Óf8sDV©™lÑ'M›ÌŒdÇYŒqó–EBÞ–eÛ(’Ç,Bñy8òýf8Æ{uÙK&£ùüìºsw´ŒÚŽü'lˆ)ìÿ¾ýmÙ¡Ãl|%D¹ÜP!ÆÞ¿ß²¹À°nÒÕßkÆõg¤?ÁlNÔë·i/» Þ¢1n5k×ëìñEö¸BK¬åà[EùqªÉö'ˆ`àXLK°ëÖ›mñ¶‚D“dEòª°´ˆC°gËf-[¶ôã?9«LÆèLz% p:¹%{ºU ‘¾ ’B°»ëàûfÐw~É\óJ!É#84A h~ûµ6_o_FûY¨$O¶6£Ueh¨À{gvÊÅœ„C„a±Ñ1-м.Õo.éW‚ç¶G*+ÀÉøi¤ Û`ï3¼«Ð÷ꋆ”E4%æøŠO¡(.ˆˆ_Ôz­cˆÑ8¨½ƒcéàøOúúawz®]½†ƒq(Š ù$‡•µ¤]mý>ßö(Oø´'QdiäªVó+-= ýý|{aì&”*à þ %W>»<ª#ýAÐú© ȘàW<&[øqîÜ™0ZH )1ŸEгv+2çÓöŠqÓˆã4âh@²Õ¡¿I$W¬}&aÛs*ýÏÍö¹I›HZˆsyóß•>}¤9R5¥´ 9Ò0Q42£¸ 9T ?”Õ#EµÓÊN2\Tî©È'ÉHÅynk"r°)®›q¤)k˜·v3MFΓg#%5È!R]3¨ã`RÉôòúi¥uSÕ!åõÈ1†=¦® DùŸ¬y h­Ü5½¸)¬ax&OË,ÂQ,áI.•}×u7X«!Îí­mKDÑ(!äÓ,‚M,îÐeæ8ŒUIy.ȓ̩‘:5;ÝÚ].­Ä¡¯*ÉÜêô õú´71¦‹¢ðÃ÷ïÝ7Ä ?3‚,:šþ‘ÿÃÃýƒÌüGýð•å/3žS4Ç¡*r(n̺2ë¾½.SÚq%`ÒDÑÈ7lä[R©ûuâ>âñùa8Í&qO âPüð˜=®‹ÛO^Ý~ú¦¬¶U^weW}s¦·%£®5ÝsmWýu‰§#¹æjvýU¹§)¥®ñ=OcòÉkâSí²×eÞvñÉ–Þ&ñﯧ4´¥9?}CªÆÂ"DĈ<—‡ÇlX•íЃ‚K«Õ) ࢱüL¯ÑÀÆ¥šâ³Õ÷2DjÿöŸç[>Æ zý9Ç ²J¥Ô¥JuÁ‚J¹[›]m¾Úù/¸ègÄä³o:nt}õ0Ð÷}À‡û ¿ñuæThån}z™êbó'€(þ€¿'Ðkÿƒ#ËmœlÑÅé­I6ÓF‰eKANìž1#Y Ebs—âàK£¢ûU·ou‚³w´hŒÀÈ5äÉbüÑÛÛÛÚÖ¼xiNq „ò^ û•:Q r<Ùê_o1l0˜’¬†øØ5ÑbHÐéÞÔ™7ÙÍm– v[,C#pKŸ¨Ó'i&ÛŸà–IÀ‚(3ykœÉ`ÈÞ³zɺp®Ž*Ä0tÎeÑ$–.ßïêbRgEàZ\\(€Nç³ÑÐÊ·wôhí]³oâÔð®ÁP>PÙî«m½š"ão7ð±P!ô.K |ùþ»‘ jGPÖá‹ç!ɳì%ÙØBRȃ!Àc##¯ª¬ÃÆân•ùŽÒУaP¤Oak·ÒÕ¶½¡u‡·%ÍÛ ·RO|.oh‘{¿ü³Mrîvjí§ñ™‚'ŠÀx8Ê ã¾'•UfyM©Ž\`¿±üü÷åÅ}ð­ÏјŒàîöv÷îö@+hµ¦Ó45Èû¢m4*ï·Š Tî}·÷¾ãQäy܃7­McÇiœ´5)4 †Z£iši4ŠD9¸ãàú]L;8à ü“¿Y~Ü¿ýíw¿ûý|~Gm§AÞ±ëoÝû^¿Ç3â³¼ïªùCh ø†Çï·þÎ^à8eÙY!8‰­¢°™ú×ÄœŸž˜¸q÷V©C_l“œthš>èýÚ3F>îuû=u—Ú³ÚÕоôÓ295æ÷–·è2š$‹m#p û}žYý  ÈŒ®À`ÖI|þ¯|Ä!q&;r(’žõ“ *M½Øô·¦úÔ~£FlÒ%ÍÉÆêÕò8…Nl¦ô–´SŠE—@K‚6‰Òе‹½*Q ëq@E «ã5ÒÔ²ôˆ·› Nbt ‚‚"IÑvïüèÏú§!¸Ó³62Ec胋9çò¹»èµW«­·Ä°P4‘Rn‰q\]}W¦õ*,×NJ¢ ÅpÃÃD¡w>¿ O=<å;üßÒ’gãáááØØ½<œÛ ç3©QQCjÓ„ÌqYiéE¬µhô>äÀ)’åõ0•ngÅ™nZ9êºV×÷ÐBÒØ‰À©ºv0ZQÎt®ji[Ò|nI•ã{µpûíkµzÖö]Û¸—ÄPv̶èÁþH{™L &À¹2”—Y^ð®Ãp¤Eþ‹6åáViF›<Ë.Ío‘wj ª,ÐmÞôÏh)/sh±$T®p\ÈeqàùNú½ ¨lk$6pÄí¦«ßLáóù¼ÓÓ¾¾¾wÄìæ²yBx7q.І0Eì-q»2 ¥ e#9IŽMò¶KžçÒæž.¦#ÂáÀåØ˜ BÈÛÀÆ2«zrzoô~žïú´´çFÖÙ¡ŒžkÇÎíÈìÌùõ`~×`Aç`ö¹› +¹Ý׋:KàØs-÷lVÏÕ‚®›ù]×sºŠÎÝÌv ”vVÖuuëáŠ(Wˆ,’µqot‰]ÖWØ¡Él–ιÎ øÒ{ïóA|<ÀˆÉK×þ”eWjÞktû½ðå¬ëo¿/q*ó츩âV9ØÈ §‘vºM^ýâ¨MrØU–Õ¡,rh;._ôLx¡Lºý“¿½ñÇŸ·ÊJ\ú»w|S)®WfÍmG e#ÀG°c¢Þ ÖeìΈbm&PbÁILN¾uûö$ƒßërÃmOúûŸ¢1àÕ3}FH@bŸRéÛxòÓi§TÊ * 9‚ nÒÖxù~ébÓߘ@Ó,²$ŠJ·ê“Múx½æ YlU‹õªJ™¬Q'SZøf²É˜`6'Z{= "-1í7ƒŠßu"‚I²@/˜wƒ@ıè¨m•ºZp!¸ |Ó4.Ç=^_@Œpx$“äóجæÊU£*ÓÚˆWaUWV=¤,cà9ŠÊ¼W_GI؈€ä‹“ShvÏg€³Î`ÇSÙ·oß&ŠrP‚Àø¼„ïÇô—S "Þ êµyDn|¬¦[¾‘™Iô " Tó]ç…É#7»5•÷ËÔ>¹õkµq˜Òû+ô¨ê¦CG#qðPB( á¯ÆÑø<ðMû¿üâŸÒßd³Ð@¹æsxL.çøž„¯”U¥Å§0ŒWh'••¤–ÿ·»UÖƒñá» ·®N™’¢¡ÁäsA†††¡?p|üïl@Mzû®\ÙÈñ™ ¶Â—øä¶ƒbÄ~a½Éµâ ðºsiu×ÊæN¤Ê†ÔõÎe«­]/< ç“DkDêº?=†ó˜[^Y]”·6”Éd­};it¬°Ú–Õ:VVë;‘Æ6¤Áµ¼¾kEUR ¬Ÿsþùö¥¿:¿¢ñÜšªæŽ¾ôòv“³(Ë_/Ä‚¡zo߃T7#µ]/˜›Ð¨×DEãúBÿ°ˆ¼FùûÿöÎì¸GÀEa’E·‘D½)ɤŽWIœÞBFb(ƒÏ#ø€XñÏ”kš‰3í9Õ/pêökRÇ{£fLãF¼Yš~J-ÖjRuêd%6hSp¤öÓž MWÉ“¤ú4£6ŤM±˜R«4ñ4»Ûª×$Õ€ùhÅZmºF‘*£Ò(CšQ§¡’ÍÆd«!ÎhH ¨4eÆÞ£1›£ÿË}™7q_q|m tÒ–bÀ’%­V+i-ÛØÂ¸¡4BÊ$æòmŒsQc|a›3`Ë’V»ÒJZi%ùÆø’|Û@“iS aJziþh§¡-dhR˜`l°…d˶dõ­ÝaÚfœÄ ™Ìä7¿Ñ^Úß¾ßû½ßû~ª”â(¿§®ÀyÅ?tà wxä¡Ã?ß Î w竤ŠeQ¬BJ¦¦Ý7;CUÌ„Æ4B›LìiS³A ç%íw˜9«¤Woñ©Í~- #ŒÐµïk©Õ1ßOĉ ”;áìÔhaˆ_éà4ˆŽ§k>p‡ï ¥¦< 9SIexlÌÒ7~¶ñ££Ú0éÁh¤uÎêlâF«ÌÃzûƒÓO×Ý×ð$®b³—4!ŒT[Úš)m¯Úv×` WLš^Ë_§Š•Š$R±”ÊÁ]¹?éúë<9Áì© >^áðÀ›êÃGå2£q2EľEŠ‹;v}¦6zŽ{:Ö«·ù)û¨ÞîÓÙütÍ=½õŽT$µ%Pm½mæn³Æ[‡ôŽÌWr¸æÈs[Ï”ùLÏi-A-3`± ™øWî¹Ê2iªõi,^;N9üj›_ÃÒ5#”c²B×ý$wñˆ&£„B%bF'7÷ÌýmhPùj(¨©TC‰ªÄ±BùBUiEêZ–>¤¶q÷F²îù-gWÇl*Œ4öÚ̵èJ» E²Ì­\4’ï!sì‚üA`ì5†2>ÌÊïû»?ÝT3$<£åÂä”gviJJ´Å­di'ÍKg‡®¼ÛXØw´%mºâfMy½¿ËXp²jVSÛéÒV=hèÞNú@³rÝ*CU ¦R‰ ­Þ¼k_ßÕ½ý):õ§Âþ¿–õþíhä!Ì\ö^ y6¯4N.W‰„b¡8¥"ow«ú`3¿Å̾SI‹¶¼Cÿzkea¾¬—ÙӤѻ¹ðët*»òkíø%õÖ µÛzóΧüÝPøSÿPQ3UáÖvë ÚÔ@# g;ü£Ðäxàê­kî÷N7\袻kÛß{óŽw( Y<ò‡ƒ5ow–µSå­†ÿpp:Ç2t ^ßë®þºi„ͰY39ÓóÎ5;äÑR•J! 6¬]ÿEþ'¾¬€’þ7“'ù×`ž¥Ž«D²¤hå˳¹Ζm³fÛÍVS:kÉ´Y2,æt³9“qäÙMi&6å29ø›óE‡>UÿcÆWíûNŽËµ1Y n`ÒM¶t{MV=œXv°†\æXVeꪴĘåË1.Ba7¸B$Œy)ïÅ/_áámò‹¶)xòÒ¥K°¾*¥ D¯ Þ)?ì£í·iÃˆÑ 9FÛP¶!­T”n®ê?LY@7}¤ÈaTk÷UÛ?1pô¶­Q¨0A©Œ O%®¸?2NA˜N‚Vð$öÃáöÍ[Y[Sq±X& 8!j6oÿ'ÉNœ¾cÌ}­å[7W{µ¦0Yë}Ã8ÄØ‡ulØ\Wg¼ÇXƒU¬æHZznXc$»£3OÐÎÊ䧸úº³E‡7¨Tb¹'” ¡DŒ¢AlKÙââœuþ]ý>}[šB"‡zD ‹T¸@)‘ —¼º"ù7eÕ€">S—¶•{á#Õà€ ðϨÆþˆ—ÈÁIþwjj<<9ž¼æåžL„„CåÍ ‘º´‡:Ôaêÿã¹ ˆóè$¸rl òÊD(4žACØgS“7|··˜Š=äA·i JÌi¹zóú¾6 èî릞rlšLí$Éq¸JŠK ~ðþ3K?::žfŒÿ„Áì äÿpebb‚d¦ON¼{îíD¥‚ˆ¯”ÊŸ{êiWf­m Ë¥Û­™è¶4.á¦9ÇbLcÙ—jåÒ,ö,ÖF29Æo3¾Z§3)à`.Ãá̬³§×XÓ$L6©Ù¡ÎZ›•ˆ­Ä%±*,.S©–a8Š­fÝ;çÎóA5Á‡Vø Á/41Ñ–“»S#Ç•ñ¨x {™q€„øhnXg‡K8÷éç&ýÓ4Â$2HÖŒe×ß+éUIÿ&¿Ìc£¸¯8>ÆFiÓþ‘4>vvî=XclÈ JB „Ó`"‘Ëé“’¶@Øûï}ø^ß7¾0IÚ?ª6M¨ªF4I‰(m’DIq‰ØÆÞ]»ëÝí›Ý*T2ŠUªvô4ši~¿÷{¿ß{ßÏ“ÈP¡\H“(µ{K^àK_ÄÇ{æ[WÞÝ.˜#ËHhUp–cÉg·¼tCaŽj‚*ÛŒÑ9Yéüréþܱ:Æ\ÈZ=ªÔû4fXݨÙ}Ë`]PÕú•öi•Ù«æ&M–›:ýœ«Á÷SÓd¥Ã«0Á¤>]Õ¥Soäg®fÑTZÌ"„”°`(A4”E†—{zN‰gÐ5$jßµç–ÊT;¼œ P˜ n–s{56°YÓ¯²N3JÓ¸ÞìÕXƒJ§OçÊ“­eñT9™*OÕÉÄr1NìX•ùÞÕ´¦jVW=®²F5î¨Ê1©7OpÖ»F÷8ì‘©ê®Î ;åÕšýz딺rBWwnóöt1-Ũt”É^•õáÇW¢ß øŸ¼"(:|Ý .,Üøëõ•¬LŒAdxS“ó" HC?Ò8À[mw‚gqiìJ¬ú^SßödÉb:]ŠeŠ“ÉÈ4’ä}/'4÷ 5I\š›O>·-P¡©ñ€ÊǬ¾æZþàh„°¹?±þ<âîN¨éOj¼˜Ðø&Ò0Œ´½™àyq4¤dm¤YZD¤à)Ø#û SΨ›7 N 赪‘6øñ<â^V7”XןÐk^ê^VߟT3°è¼µç»."õžïWê1ñ”‘RF§‚ ¿V¯+mÓ‚oW€ôw«œì2elÌb0TJ‰€FFG¾ Ý艹™™‰Žè¥wßÛ½s0‰DHŠQ"]" ¨”Üv|ß«µºSmæ’Nmq‡&~¾:Ñ£«èÖ•·+ïA#¥mjÐbøô÷GÊ2”2(T=Š¡È WÑðg@#e®é»V~á/÷M#Åý×âñ~‰ $D*JÒtÖ‹YeÊònsQ»¾¼=F#ÝúCmo”ôË{¸SMú·®¼ïA_Až±ìà³$âÁ"ŽÎó­"ÄÈþó ‘²MQ‡²¢U÷›ëñ’ é4YÄÚÈ@^ƒóh„'<šê¾ü6ÌXÔ¦úI§ {$…_ÞÿìJY;¨ÿi±îqéó¸Ší§d©+‚Fqtëö­ÿ†ñgøXrC²»¾þ1N#Á8ÃÀÇP(C*4ÌBtnvîÓògž\µaMÆS`ð°>}öuÛ 7=³[¡Ë×Y L–¼JÓNÎuÀiÚ»¨ÿÿmf=`šü¨Þ[oßá2í°˜ò-†îÈs…kÉl©PLNáAR©Ø3éëœvÇôÝ)ȬHìt@Ðî"± ÍçFFFV?žIb$Ã02 Û–¾zBa›TX|Zç”Êâ78}œsLe˜2Z—ªþÀ! “FǔξÀUÏŸµ4î9®fàXyfJ²PB (V,”lÍûb4™÷Fƒ_y'ÕJ•ŒdaEŒ` ‚Å„æ-/ýsŒUÞÓF¿Á6ÁÙaÀY¥c©þÌií³z[èè\åß9ûë›^7 ²Ö =9ÆÕÌpæQ­f¶Òæ×Ø}7 Ê\¥{L¡ŸViŠ8ôg„³Oj¬ ‘q£y±Ü9¬s<¹Y‘ÒúœœÖÆí}Z‚a‡6oy21 4ÀOÀâØ©ã¬sVïW›'Y xɯuÁÀ‚ý˜ڬ°øžŠ5iß}”Žá"L&•§gfòÙæÆÜÿ«F pX ³|î Áf0¤T) ¥%8‰£Dü–‡4Ö¨ú¾ˆfߪº¶û—«ÂQÞ Hk'”i¤ígèL“(ˆþ`×j“ñ´ ¢^R “`I!IÖa9¨Ùõ­¶žÕu}«ÝHÝ Òz!²±o¥4‚€½¼ZÎ#KXÕÜÙØ-Øú„˜’‰ÄFK¿}BÑúÄÓZS®V@Ü”•&|çXN\©ëŽªé¸¯µ©kGª;#ë {}Hk?ÒÔµÜsrõ#ÞþûÝ>Þ?ÞWgƒx:LWÊ/&&úÀ‹O5j zª²;ؼ®•¡´G¹Bb~»{ôÙL"ü‹ýeåËGè³MîÇRþ¼~ãFqq1Ts)F*H )‘¼7å˜6ÿœ×¬òrÊ.NÙËeuª³»ØåúÉ;ħ…òß® œê0%¥>uІ=)yÁÜv|ðϹúñÀÕœþk¹﯈F ±ôQ†a8Jn?²;¯£RÙÊ *»•œô²ùÝ8¡Ìg½róÚBx<UöíëWO·s½úü.“²‘=ã5yÑÿÚ{—Â<9xE¼wã…톯:¯«êL3743 #>57óÁø'E &U“~^ØÂ·S^³²ž-èàr:*szøWïøy;ÔnxEÁpø•wßT:5ÿnØžrŸ3íNÜ {1Š$Ä"ôÝw~þÌ­P÷î^|ŽÒeÈBh‰üuÐxçíßœ+:»A.—JhØ‘Êhô‹¤¤?BŠó›SÉ)T&Ñ YøA˜£rZF ¥»SÏ.ãÒÍÖtמ_³;YM6Cs"5k›ü1Z%š€ô"“É ‘2b4ó™C—ÞüŸeÃwÁö%óÃya‰‚ÿ:=/-chÅ…ü’³4 8 ×Cj– w+?Í+ pM³eîEmõh…qTo¾×ê?£q€CÆ ÎQu„µÜ©²Z+@bÔXW²3U!Á Ž‘˜ '™Dñ©â¢âéµ¢‡·É© Ù£lõ¼Æ1VaœæÓ:;Ôî93À9Gî]GÃc@c›Öײ{0<ž’%ÆÂ²¥$OágŸHûHc×8gµà[p‰Rã £k¨R?arŒj- ZO¸Ô1ÁÕ±®+g´¯g6=õlóÁ£o”ü®ÜpKgxA`ƒqÖ>¦¶Më\S¬Ã¯wŽ«-@èP>Þ=ßÑ[!¢€Ú:nt³¦Ö}ÓàI&c‘ð—JÕ•¢òxB¤ ×ÎT|¨·Sb1)R¼¶>óy¿Þ $39ý:»ŸµMWÚg8÷$kkùKAC͇æÚ’GwƉDH&‘”Jåòë·>ž¹ûºç—ÿÛÇ|xi_á‡ø?˜üÃwnmÞô=Åa(·co´§áþêN¤¹'²vÙ*ŒT÷"žV¤ciyuµ«=ê¥\Ñ3/<`1E4]Œv¸ÑýG×&o’ÄFS(.'7Sxü:œ‰Ý™W´¦º=¢íÒ8ˆ4õ#ïJi$ÊÝYs8Ôu! ] =«ë»WÕv"ªÍŒìû„,Apøâf´"Þ××èõ$“"J`2mX+”Iã¥òIl:¦¦ihußçéCjû`†eûY;áö"í>¤®÷A÷+HíùUMëÓÒÅ´œ!édF‡­?¦Ï?ÙÉåvèT^ÝJi$½8“à1šB §Û³/taªÅ½Î‡%Å|š-ƒÁà§7a‰3zë­_g>,AÑxšN`¸Å ùÃŒ}'í¥§}&e».·Cí«4Ò¥tð±çù Û3÷Áž‚Kq’ÎäZŽþðPxþ²jà/À’o¦‘jpÿP¥‡ ¤ F"¤Ò”G€…­:PÒ§?éÓ*ÛÔù>]žã^kúýØ›scþðüPhLÛãÊn.ÏÙø|{©ªß=Ï®+«èsMÍO€@ûèöÍÂv#ü0ËÇ•ùlS ‹ÿêíëE>³ª›Ëï©‚ÿæ´Á€Tt z.'}ꬶʆK}0Ћs!8ä{ãb¶W£êXVq+¥çA.C»+i»^†)ŸÿæfÃK•qa ã™>.;Oææff!uÌ‚}ýïÚ¡b |¸‚  ?$óO „IèÛÄÑb|E&"’“ˆ ¸€p3^,BJ‚’$NaÒǘmÙ»²¬Ï-Ûÿÿ¶V•a¬Lg?þbŠl«LÄ0˜„–EòVÇð)Û/žäW€m~fn)Ý~®ý»Ã;37úŠõ«xžÿLªÀl ¼´„¡h‚ ¸Ö;[’¶ÿý ˤÖ4z†ï]#AÖ>Î9Æù‚k›V[F8”]( Î5UaÖ9ìû=²~}²MÀaŠmˆÃ¤Q)Ù{bóÖËó-ÖÒ¹zǸÆ: ¥VTpYÛk5Úîµ?ÓzkPãúØÐðô–­()ÊHÚò²²(+uçFF. èØ˜ò=ûÿf¬¾­wŒhÌÓjÓ¬Þ9¡wÜÒ[ýÖú‰2Ëë ¨ÍS:Ó|™uQ놠&ÕÖ)-H.ì~µ#\†±ß©²iL`ÀfâÕ9'*-SÀb‡óH¥ "ŠÀƒü•üƒnWÙÿ®sjKSvÖ8r¹¸¬èä—kPTçÇ¢Òfbg¼{9·½" ´5É„P5&‚ ˜Z3 ɲ€‹±^÷~¿²°ËeYØ » .#šØV§_Ò«µ­N“±ÚÎt’±©rßuwaÙ>fœ¶SœÒ1Ó™æÝwΜÝÙó>ïyÎyžÿïp?†·î=Uèþ$Un#ÒËòò/}çÍûrý•%¨2=–kᦂbËãV Õ¦$š°Ôpò¥ÞÞUÉÏIaàl"$ :ýÚõÂKÖò(_Ï„ /ã7$"¼‰Åçoþâ§$“Åe’lepy/TT#®+HßÕ5–ž p"ðbûà³q!=—Ûü‚èÝ̽¯ƒ)b¤¢YLÛ‘Rv|KiÙ6z*¾‰±awQ’Rô Vo’cDÿyÑb ö!¤ghM÷Ð7:‡’lƒH÷ Ò7„8®¾ØíÜ ’l(«ÜÐgC}ˆ{ô[g¬É¹\JÏdr™Ìô”ãG°o¿¼™DÙdêÚE›.(>¤wdMו„ΑÇÒÕ¿b\‡q BÐoöŒ"¾uöÀúvˆ;‚íÞ…l^ ¶¦àÄ:BxÙÐܯ|^4òFõQð/™L‡A\ûÑÁ·Rø_õk[rjp|Ú3)ûh_^1¶¸¸petä•‚’FÏ Y¹ v&J¤2’¹œ"AyƒCÖì×ðûWTÕ7E#õ^I3`‰[^ë’í¯+_¢‘4œàUH{jFï5Œ|"ôß:5v¯~tu(²À,ªk¾ #¹4nÉùZ¾WÖâR×z/ \¡OYçÕû”|¯JèÑŸu¥#öK£V`§¦€â¤¯Eà5ˆ›õ~¨íŸòʾj1¶¨ÞQìÍÜÅ™l%é(åDcOÁcDãÏDÔ ¶ÿõ¯n––!q&‹ @X MÅK¸8š—Ž•ïËÖT¿5x±êç’·'=M_SÄY 3ä|Ñ[wãlaCqÉK,ŒêÊf 8ÎIeíÁv¶¿ÿ?ÇŒÿpV½Vµ—½‡—Ìáb,’„;`$ÙØžžáwzbaªr¢aŠFbT¢CTÞ–r»œ^¨µyªÀVQøÀ¥$*6Ïõ:¨¸m(ƉK¤27îåÆâ’;Í-…eµê’šfÔ–I‰>&i[”[¦ÆI¹.*ÖÏÉŒSJÓœº}Zd¼ßª?_x¨ '‡Nâ\ŒÜ•³½öàáñÆÖ'*ÇÂ9CD¢ŸPk@ÐçÔÖ‡"ÝH¹º}R¢ ©L32Íj÷3!7\}·FUzlߎœLZÊ­óʸÌüP)­*,ÎFÙwrÕΗï·jÃ*Ë´R’êfås­–¸´3,2>Vi?7ª'šG2Õ”J7­¦îhVa€ýå†/5–Ç2$*(2tMIµÀ ³rŠC‚23Å$ÅŠ6@‘ ÊXõHa˜W˜£´·Oý°¦þ ¥-(뙑Y§¥æÌ-›œÌŽwNN(åþcÉ×p¨|Bf‹É­buH›4C¸ ¬cVe™TgTÆY©nFÙþ³sŠW0.Î妳XLfêIAíüb„êTOYˆ®¶kÿ¿™B‘™Šc‘v†žAûþYÄáF%ö Ý^¤wéö!ÝžD‡Ÿ:q|Ð5Hiq0è¾­=°ÖêG4öt^Á¡e%oLgg2 Ê×[½ íCHÿà¦7ËÓèøv&Vtqøz¯"ö+ˆ}<©}ø…®±Dk ¡'@­Öã‡X°ò:ÛðZÛðšîÒ5H…€ ؼ‰½ÕRÊzÛ(Ò1€ôøþ+ EŸƒ´…E¤m%61xfzÞæ÷Õˆg|£É±éà ÊΡѓJ%´ô¬m÷&vzžAÄ6¼2(‚m÷PIH²^F¬–ÑuZ;Še§£);·µi@Zï8ænßÑÖÖ …žrÝrá@2ŸUYñx8ýs•Åæ–MÁÓk—×¹~ýzNV6ÁÄ8‹ÅÀ8LœÇÀ3˜dIáñïžüÃyePi›[b—LQ±qZªQ~¬6O¨Ì“è<@s#Òöˆ¸-*±Å Áí!¹uNÚç È³ Ó„B·ZŠX5u¨­ € ³J(þ_äæ¿ŠL…9¯¦1¸™4Çñ,:þ“º a©ù‰L—ˆ^+Ä™´Í.Ð÷‰— šºæ[TÏmKZ#É´X¤°Ä2#6L‹ôayÛg*ݹ."6~.îx=ow/ëÏ"å´F4/2=RXy´-ŒtN.w|ïl”ÜÂNý}Ý釭êPœÌ`TÙžäƒT«,SR}XjšÐÚfðp´#ð‚‚‚¿“_æÁMw_Ÿ˜&`°e?=齧˲I 6“%@Bl &4!²ñms$$øÐiݲ|é²dë´$ËV(¤Ngš™˜i(-“ é$é1H9„Á¶eõ÷l ´SÈ8CòGº³ófßξßÛýíoßÏF"‘÷ýÑ¡òÿX†Ç×L|•ýdf^Š¡Ù€@\¨Ã‡aÔJèðÎl8<ÑOº …x’F’̤ïÆy¹D ÉÊ^8gëös'ò™­îœ[°-‹ÍI!ç%¿¶!Î`GæÞøî@r«•æ°ÓæE–²õ#KÙzÍg"S€FšFq úfÉtiÙ ÖÐlk=Èž!Ö³˳(? OÍΊS¨“ºüÈäENÿÜ—_2©ì4jæ¦BÔbÆH²öÅY<ÈìI6÷?Ìþ À•Ní3`I&ÞxªÅoqs–­Æ‡àAòØçW—»êKýºi«¡»‰Ö2´ÔÕPé“‚8–;¥e.\Ç âsqNnt²<Þp¸¯SS©L{ùòå=ÅÅBŸËb- 9ìôt‚Cš°rEµoÔ´×í÷(A¦E~Y‰Ÿ&¨j§¤Ö-+Ÿœ| JZ┈䵉+“…åýtgMèbYÿ ‘âþ‹Õ}g§K#¥á‹U¡³ÁEÁ?Õ~ðÙ.÷é°ø#y|6ádyȧ¹¥µÎé:_^•Zë›ü¦_ž>~ö_|½æ>}´Ú#© ¨Þÿô7CÑapË`,Úö+_‰­Öø0;{íÒÏŸ‚« Œoè1V:%ÕΆéΧÊ%!&Éâ,ä A@M#ú-ê­MùË^%‚+àòqê'>øhÍý·ü=€"±ÉùÆÒ<{ÑÎO«®4™@4AúGêtcÍQYë¨ÌxK¢».U_Sh¯«ô#êö«õªRý ¢m@j¤5ÚMÆïšFn7"šÖ©fD¢‹4jÆ¥mrKãó/åâütdêI´‡h ±ù§M#GÉßÝ‹Z‰ÿ¤Úù¼gæâ|Þ’Ybdr¢®cÈæJÙSNPÙl"•ÿx~ÉþD`$[(ž†.À$/,ü¡öíþ¤6Ïì–žD )G^‹Å;zÚ-øs«ÒŒ"¾UvÙ>Ðb—rºêS jîU”{eÅκJ¿¬Ì-©è–ïЀdÈãp9$µ{ç®ØdT?vÀ¾sç΃¯÷sãÉã'^X¶Œ‡³„$E0Òyl6Ÿ`1IŒ•E½²{sµ™žá^—´Â¯,óÉö:êAÐ+z¤•n±ÈUWÖ´ÊXœtŠ"8Loñšƒ*h ¯éŸŠ@-ë»T8Sþ¤²ÿÜîà…²Ÿÿ¹Ü÷Ñv©‹C¸! É%kóöu7‰Àù@#.Åtý¿Óu¸*¨¬v+÷wkJ;ÄÜêýUU@¾ÇQgû]ðø¥S—®}õÙØ×Ê_Ø+\’*¯øavxµç.ÝŒÝ9äP•w5V¹§;`ŠM°™$ྲྀ@õhÑnjQ*¶b ––AP ¦Ü§g|2þWÌLGôÞÖC’„§LÄ>8z,•Ã#p*§Xc)Ÿ¥}ýåÏÛkn÷G»bî=1ç®h×[.ј«dÈYúí®ô–ļ¥ƒ®õÛW ØDFññÔXËeERåFUËÖÕ&µ²@ùýЈz‹^U UoTòuÍzhŠ4áïêmê’Õ%9ŒEYL¸Ùrx ÇÓù.ËŸ{þHø}¢ÿSP¾ñ0Žßp&ÆÁVôÁCý`yŠL¦.'Ož|½hÌ®džIr16 ã<"ƒÄxÆzáéÚüþµ—.Ëš#Š–[òæ›bmD¢¾.U^‘Ê"ríM…ê5©v@i¼)o8Q´~×42"3FÔWÅÊ[rCLan0ý¡N»†Ê¤°ù¯fg½¶ø>ËÀX&±îÙÜ/ë £2ð´ù/b­½ èDí;CŠ–Û M74šÇFGcDlˆ(š¯J4×$š[JãmUó_•Æ yëh£þè¾·l‹ÏË!yÿ¬3Ýkb2óï÷¾óJÞ§ÓSŸ3G´jåßÞÕ)i¤'C½-kè¡Ê×åMC}¤Þptÿ{$s>Ï Ñ‘K)•ÊØ$…ޛǞ·e|4úÛ_˜Ž±(E°ÓS9)o½™dv&tõ¡Ö>ÔFŽ0²zLîm^Zˆ­þ»Õâ3ûH,',¤5¡î A·zfuÙfæožÃϦðá¼4ráÊ'%zÔJh;šh=oê‹7ORM'È:àGµ¡3Φ•:;ƒ`uø¹Ùß‚FfGux‘£uõ´“-ޏÆCDÎOž*ß—Üõ/îë<¸‰ë øú„´¥™bl{K†`cÓ”Æ&L†&$ŒÁÆ .ãC’O°1>u[§O,[¶Në²$Й í?í4ÓJ;N[s„#ÓNJJ⟲ú­ŽtÆLÝü‘7;+i÷i÷½o¿ï÷‘6*.¯4ðQŠÅïÝãñªÎUŽa¤g1ú™k{ÝÏù_Ä4´Æ8´¶{(ÆäCŒ6¤«/ÊÜXÝk?ÈgA1Ä8FîÈȨì•ì²kÄ¥:¡Éòûêó]R¦®9Ôoä@J„F¤¥×ÉT/ÖØÏöö¥žƒK‘œÇåÎܹs#ESñ¬×0’¤y8‡5£ ‰·÷Ð;âæšR§ú´CRêQÃmŸ4_º$gœõg¼²R‹"9=…„+8l™Raþ…00R08RQÜX©F ûo ˆ‡ÿPâ¿yÖÿÉéÁ«¼¿NÍ8°£ %8ÇÏ)6KDèHd•®tü <Â~yž­±¸_+v«A†ð EÎI©URÕ«,7É.úZò-"§ä9Yåü÷m¨ó¡¥…ÑÐä9‹²ÀÖ ò®8Ä6 MÐ$‰‚F ¿FÔ¹ÚçhÄÓç”îÒ,>k36ZR œ_z:¡‘b÷äàK¹q‰iwoßÙššÆÄ1•HpÈt÷粓KÞªP_É„]ö˜uOÙE“öâYWù¼³tÖ.\p-§‘9kѬ§dºó}Ìq—Lo qlc\bñ;"eŽJŸÝ¬ÉÖjë4Ùß„FôG[YM€¶Ü6ÃA6G£ß ÏV–ìgÒ›8IIŸ‚añKMìxcû•áË‹ó 02_±Ž<}­–ži§ òëÓÙ ž_d¶‘‘‘ªó•[’S ¤âIüc£8Iâ4@¨ ;®]w<#Ý™'ºY£ž”¶ÏÊÚ'¤úIuÛhcÓŒR?)UÉšÆTúÏåúqiË#Ië×­‘I™aVÚ<*‡{hÿ´Jé?)ÚŸöúÎÄ”]‰eÓúó±S©$ÇJ€çø ñG÷dšûšÖmçLfQjo2Œ*uÐ˺ŸI礼ãsy 32ý´ZóÃZÕ¿$Í!Yû¹jFÝ¡ºñàν±¿þæÁõó^- -ï9zY^#<’õ‘ÂynÈÕjëž§‘Üv]V“ú˜r37.„™JIÜ415=77÷Å‹ >)y_Ì|8˜Â1P{± ã¢n£~pÍP¦@=±µj>/3y=•„sùœ„µ{r£q~ˆôØ×¨qH}Í*é°FY}ˆ­ér­êö~c´!&ë*“;ÖäF.9¨ôú”Éc ¬T#§X“o•Ñ¿¦nl˜aUGq\F,—«çûg«ùÔVœÇ%9 ;ß\­Ò 67|]±=C±¨.Â<‘gÙþÍ6ø‹¨îa¤÷CÀRlbý¾ Kâ¡D"—Kál4‰LËÚUb“õ7æêWZ}D.¹Ø!Ù%Åýª3I™KS¨¬Äø8¢i’Jß±“¡B¸¦D‚üE…c¥P[KkEYù?îÿ=ò‘Y†‰q‘áëÒ äãPÐãóìßývª`™€ pŠGÆáQ8Ž%lÚ·ýhCQe¢Ê,Z$ùnU¹Sû^ÞaÅ)Šâü‡ýzjêJ~mµR­ïj÷™Ü$òµÕVwuív­vÚŠ Zl€  høäSIpIÑV>›^OnJÍD¬FW½šŸiòE5‚4u! n0 ¤oæh{78d­ÁƒtxŸjoZS A…{7”T0’±w­(Óáñ0.+g“GPg1svìc'ìŽÑj‘ö¤ùWË­¾•-Þåõ.8ŸñU{?R×µ µvlï?m´>—‘³)i;²y ¾%y<\˜”DmKØHdzH_pöŠ, ÙÇ¥ºàÒtTH]ʼ®ª¬º2*Y$ä @èPR11ê[Z/%$.Ð îA30‘™âAL;°ÿ'¾Þ¾)ÈQ*g‚Ìšž]^0Jp,2í‡ÝáÀ_ÿüÕåÒR”eÐH2‘ã· 4Ê%1k+Êùq|ÂÁ—qÔnPw’‰çy*Qæ½)ñݾpí³\ßW‹Õˆ´ÿV~ïYß]YÿÀÏ.7“I"”L6I/ÌÊwUgyÔ¹]à¥Ü±HÝUŒ1ª‚NÜàx“åPÉUòN]^§VÛNe±W/gίZè:ðÓ@Y§2ÇUží*ÏëT9µ%¶EÒf‚K ƒ‡alÐÍÆLiúÇkDŸVkI±SôW2 t"Má ey‚ëׯGƒ!ÄÆù™3W²6£‰/yãÐë|‚‚Ç^ÿ±¡xÜ^äw‰Ç’gáŒMðd¸/>t;ä B¹ ‘)»dÚ)_H#Óž¢Q[FÄžnË›êº0è*òŸaë¸ÿa¿Lc⺮8þ vÒ~±00ËÛgyŒÙ¼à¸%‹kbÇiœÆÀ€mêZµ[Ç,30ˆšeÞìû0ì‹`Ì ®ª(_Ú/#KÝ[/MG.‘Ç-6˰ÌÊô<ÆE|0i‰©RútçéÞ§y÷{Ï=çÿ;¢­R·#Ï 7š³¬@#¶#vs¶ù«FS¶àÇšeQ¼ªØíÂøP Fä:üùÏ áÀ"l è¾ÛœH€DªZÈ›>ß—¨laÃgM768·§¦¡aEDx=yòäÚââqPø9 á)ÿöx)6®tUüœÁ€&ï½÷ó’’â=»Ó1>ŸB ¢RœHz.¶ê»?a­^cã£ZÝŒÆ<]oö²Î¯šFµ Ù jÛ\1Ì6‡+›®Uh¨$‚áÉp ßÍÞWœõ×XÀ’™Û]•ùa½9 q.Õ[çµöiµi¦V?_gôh,OÍ•mAg{Äê=jý¼Öúq½Ñ‘"%6ˆÃÅR>WIaxÂÎ$æÌ ™`!ìÞiâuÓ¼Ú6¥7X+,ç¡¡ÉSo]`í@J0ç, Ö:E&ËëvJÅ<¨EITL¿uð ðÇ8'ôjý?Š<ñZ lpÎN'A8ÁH…ñ$/a‹¢8$ºmâÙ¦áè¶!¤àÄp’ ¢üηG£›÷(Ò|iàdºmié_F·¸b^z%•#ÂbIÉÖogÄe¾˜’@§ ÏÒ<æyK+ÒæÚòz^Eo'1&!Ùw4^ÝÕ (ÒtmiD:û7J#ë¶ÖÁèöšrôp­e†Ü'ÚÝ`yTËhtÓHT ¬Øtv<ÓÞ‡´öÁŠ¢.!ðbs÷ÄêL>t0†‘¢´˜ÁE ßÅ ŠÂO¯Ö~v÷Óìï½Iò„2 #@QJÆœ«­.èµöhÎ÷ª.ô²½šSƒú¢!miGUå@}QÏÅÂÞúR·¡´[§èÑ*ÜZ@‘ÒÞúÂ>ÕOúTÊcy§á…7ö"Nèq?zôhÄq«4ò%®à2d²°?Rå­Ìãõz!ãýáöM)A œO¢À.„°Â1"ÿÈñ÷u 2³?ä q)2ôÂk¾™drrR­V§¤¤uÒpìAÑ€O‘>ÜE((f[c$ “_eQŽÝ~{üåÈŸÖ£Ž²‘%#·cŽ~tfäfÑØÂñ§ÇþxzâÃ’Á[Ê«·Ž9ÜRj‡LˆSRRÌÇSOìS^RUô‹»UgÝÚ— ÈXb£êÿ?×Ü,‰‘"LHc"À9CžÑ˜g¶^WµíÙ6¹S—eÔ3ñ‡‰q1À%H–%{f8˜ ®hjŽA °Ì «oU CËœ¿0h$3™\t—øÜEÁþ"O§2Ô£Xp®Gëµ@Wq` p¾§Ø×U4²ä*¾k= ÄKx³GŸ«kÈqè²u°4{vú‘ç4æ6k™sl@/°ö,‹3Çk– Í–g´ÈõÆ, r»)ÏrÛuÄÀ´ÃH–Ã!wÀÝšgSý€ÝŸ–Ióq)!¢xÄñãÇ×ÊœêÕJö‰W`å܇ÖT\g¼¯Ÿ#™{þ0,‡‡G¯¤%ï`bTŠQ ïùm‡Ë$Fñy¿x÷gáåW„Á%m4®C‘Ð…fgg¯ŽO$oK‚Ú¡ø¨X„M—‡~Úl0ÅæëÌôÖªù\ㆆ{:Ûœ˜ÁÒ<­wò¶~¤½3`ÈwÇÒ1¼¹y8ªiç@ mƒi¤u€½mpKyU\Å´Œ—þ\ûLc7ÒÜŽh(Mc’ô-ÅŠØ}oÊ$iñ’¿})P$¦µië…ù7uon‰êF:ûž~Dµ ACš™ú÷áá¥Qn°´–•ÕuÂptSË0ÒzySÇ•è–qú-®oV_Œ}u?˜åŒXBà4ÉÇ$ 5Hnnεß|Ñè;·>Ü.K†“ üœŒKÅùƲª>Ýy·êXWEÁˆ©Ôe¬è6œëSÒž•«ÎþÈRYìÒ–¹åݬ¢¯öÄ•º"7[àV)‡ EªüÊ3ŒÜAãh!” „”äÈjÿÉóç¯Ü:5t»tìæz4R ø1rc…CþR2ñ1<áÙ«Uß.˜¸¡pý’É8L2©2œñytzò++ÍʵÂÅ–öëAÇýº¯!€R[sìÆ,‹å˜­â­ /'¾LðPZ„ŠD¢²²2ð oÑ©œ úWð’2𠜄ßÿöwœ³„¨Øé×÷x{KB®bÿeåRo§û\ÐU¼t¹`£4t•xÝo/ô*ü—Š==ʰ[1Û¥LK¤QIÛI¤éäZG¶Ý 7ÀÒ€Ö[—>ÛÄ!VŽÐÂ|Ä :ºl½5׈bȵhåhz¹†ÜÃ#4ø¼K.·-$¦Ã›Ü¯×­ÛEî¡$Ê$R’©©©ÕY\\üqٷȱ„ÒÊ`ÙÏmi(ä „!&¸¶|uüïdì’‘|È"Š“b OH¥ˆ;ÒÒðx\ˆ.¾’‘~ì‘P0ô/¾ðã_dgL04ýðQUù Ê$\ *[±÷À’¾TØ£2…XÛçš «¿Ÿm\Ò4zê­>ÖáãôÝ2ËZ¼zç”Æº¤i¥kï³&¯¡íÝ‚sù;RŨp-ó… †~ŸfþÅ~EußbZÓ¤ZÝ}çîÛ‹CñÀÁÚ¨-Ñx\«)^TDwATÐ@ {°×{{rß§€»€g:ý#m¦F3Žq“t:ö6mcD!,°ìËö»¬RÒ&ÎÐ:ítÒßü†yï±o÷÷~ï÷ý}?ßÖôŒÏ æQ­ùz¾zµD„“¤˜Ã]ÅýÁ¥: ´ökMÏJ#Ã% €dPÅxtÀƒ·Ä2¦±y´åý:ó=ãÖZ}æ†Ûe¿”çß:¥ÖÕyÔÖûzÛ]Û––‘Ÿ¸ ª)‚ϼÕXÝaù_M5ƒÅ&¯Þ6¤{ƒO: ¶Ã$|¡5Ž-•㑺¼hÛî”!ì×oþ æ?˜¦³}ûÿö”*iCmfÒ $S“¶s#PB§„Ò„…ær¤Å™WÕ³ r:M×u! ç!¿/¨ë_ÓDÈ×uΑ#‘|¡”,Þ•ŽÔw -—šúVô,JJ#ñx±0— 1K—ðÃqnZÆ lUXóù E*Z‘ºÞ°ê¤¼s^㤱ã™idÚHpÈ>ç ©à_-ÎyÍN¤¢±¯úú+Hû/Gëb¶ÏÌCã6Ð\‘˜‡I¨„…òa‡—Ðâƒé®]{{2X=Nñã^ß[·yØÕI’äÓtÌi¦ãlV&ÛY–×jÈd‹â“7qâø¤@DID$Σ‰ÈµÛÒtòœ6ua³îX«*×i:Ùª“› ±hRHQb—¢TAAAà_âÇ?´Põ•÷>¸ØÛ·Z D¹4JÄŬÝ}4Oš°•â$FÓ$A`WÆ®ª°×xÇ‚ùkrz$3Åą̃‚>™ xFFßþÍoKŠ•Û¶lÑHñ¸eË~®É‘$¡¢õ;ò\·³z>U¸î|“F2z?Éìù0çÒǹ—?‘;?T8?>uñ^¶ëwywä}×—m?K¯âa¤%Ä4uÀ˜¦MQ4©rÚ´Ù­š-Ꜣã¿m‰ÿ¸F iFS2cN¶CF6¥³‰G¢1 ‰c8…|ÂÕçz’¸¦×€*H‘'ëáÝë7`;…ÆÇIÝѾ¦¬©V…¯3w¨)ËÓvv¢éøXû±9k¤íôh{–§ý$Àf¸Eh;á?Ÿ¿õ¥UÀTŠÀc8ÒFLi&Ó>æ)1§š,iŒEÆÂ'õ)Óð1úý,›ä0§:@ à0 +³O÷ÚCêÂ#™5§˜­iV Ì ›Ê0),(¥X¦”,‹¾XHïO•…fT6;Äžnþ¾45Ý'ƒ ¯¯³+qÝD€p€·\ ðh EÿlcÌ;êw•?q0 ¢(Lj GùÔäÄäøØ4HæÜü³‡äŸ‚‘üåŸ,¥˜ã×~n¬rëì>;©dúusÖˆ[ÅŽ«¬¾R‹[iÑZ¡•2#Ë}3TjÐ[‡ŠMn¶öjvÁz)Í‘p ì¼‹~Q„­"зç¾Ô9†Jí7Ωâ)BBD¶e»¯·€FÔψ"ë¨ÖúE‰aÄ\ù¨Ä8®µûJÌ0òÁ2‹WU(µ?2X•Û7Ç IÓ8÷Õu«ï)ÿ¤Ò{-Õ#ZÛ€’}PVuåðIÖ$Çæ$ ˆWW9VÌLèí¥†a½cDëð0C*ö!cðºn²ÈÞv0KMcT ìÊò ¯g &@òïïÕßžs5[n3ÉåÎ7VÄ !FqnãÄ¿¼°¶ iíAê/…Õôͯq‘ÐЉÔv†Õºž«êyœÖ§ûßSm÷¢CGP>Ëã}/óðw€Ž.¤Ñ9¿º}iŠLÄK!sCœ¾pøÐwíÕH£ iêDê/E4¼ÔHe×|ø¡Úög¥ÈìA†Žƒë]HERíBû:çÂê ‹ª»‘ª¶EZÃó©‡ÂE+É%¼(“ (H|Q˜ŽÀÄ(•ñÓC°u3{p–3@áP KñÊå7 à i z¥0]«8ÞZzÜü-Dc¨ ¨ãEH–ræ%lÚpøì©Óͺ³­¦lk‘ ^ ÷E$¿lÅÀÀÀÌË þÊW=0×Wqv͉I(£6®ß@rÃ)É¥¥?9pª°ïý³Î÷vÈK#âÖJ¥b ÆãJ$4—žøã7¯Þ<)ÝüÓmö×B>Þ–§žû§ R˜ôM¾œ¸ 4¾D°<§ñ­3WþÓûÑ7iäØå{'ú>•;?ÈqÝVôÜÍîû}NャÎ^»pkW®Ž'Š¡Â#—cŸO&åeœ„¬Ý¬†ž×m:ÝiŠ(À$íe¡¿ÿÛ}Ž1î7ê“ ¶d‡uúϦÜW²}ÍV>‡Äq”/$Q‚ûλW'ã~ÿD(uÂËCNÓôý÷n’8!âÓ°µ²ÇvŽ7fN5gFÜÍrO{hÄÓ’1WL´œövÊÇ:r6ÞölcÆx“\öÊ:Š ù$! eë^ #càÑž¦‘:›lQ{ªݱÛfÛcƒo0ïe ÃœÂEÓÖ–b³§”[öÚ,I “b„°¯šIvŸY›®]ÎåóPÑÎíÛf¢Ö3„ÌÆÓ³Éìj.´Â!”kÄèéîN܏ަB›€ˆÅŠMH7¯Xsñœl¬é¨¿!s¤«è™-X”L;<885á…û}þ¯ÁÎÓ›ozOnéÓ™ôŽ+²N,)ZŒñPÍnÙŸÕ¶Qc…·”ñ¾x0Ï5Ë?RÝZÖÃ8–1Cz›Gg÷”ÙÜz›OËökMÃFÇ`ø¤|÷²hLÈÅ)4{æ7Å]'ò÷®HÞ (r«4êaYM@cï/±Ü(Ð8ÿ\eSYÜj‹[cVqk-#FÇ€Ö<¤³Ž–Ù†5íC£õK­}PY®Û±KIEJ©(EEœ—Äøyn¡!`¨ô•0㥖Q¥Õ­©ìÙæu“SeÔš50TÛh±îÆèe«=ÚÊkyÊuBz))ŽŽ†õ¼/MšüÐÚðÏý%~›,ÝP^›i¢©½ç| NHy8ÆçFñøß%9¬ªiêEê{êóóë»Ãº‘º®`¯îžÉò¡D§¡\ÿ|¡ž/^F‘/†‹£Úk†ËH󹿱_æÁMÜW(3 ÉбZí®vuúÄ\s¸ ‡ñÍÑB°oƒqbcÉÖ¹º±|àãS²e;¥“Ì´ý£ÓvfZ’à„’!a:™–0¾%K–Õ·’q™¶ÐqË´4oÞh~»Úß±¿ý½÷ý¼ÊV©X"Ëe’Q4ÿh>«£•ÕÚŪé˜×Ø Â8LÔÐÍ«~a4ÖàbYë˜^m°Áܬw².]f5\«tͯu,lhZTZöêÖ= ›R±HFQ$IBDKprED´¢ôô×wîÂ^y¼ÞÐióOø`Ó¼S~pP”¯ô¾)–‘ˆ€PbT(Цœ<–pVQ˜ÅÜp‰‹årBÎÃ7D¤ÃP0J,^›°%ólaĆXÆ•‘$ÅE ¡ýúÃßÂD¥üc‰ÿàÀ‡Æ™p{ vÎ[m* Kà5Éõoæ¶ý2Ëu+£÷nzçï².ütÓîÃK09,Œà¿&,–ãÅÇr2 ï}õu(ôBƒ0 Ðëcîÿ»s²üÂ"Ãd¡"ӹ׳»ûŸE#Y®ÛE½·ò×ò»?É¿rû­®™ÎOK®Ü>¨nDðX‚ D$/E¶ì}3½±<¯]UЦÉn®)tèÿ_iDK'€FÌ»l†=ú€±pWaœ|£§@›H‹Yuý³ƒx »þ`*ûè÷× ’ pxòtÊFKŽÿb†»-o¬%g¼¥x²)ËÝœ>[«ËmÉkɃî@#æŒÉK¹»7®€‰(!…„Ri@:™Ö%ëaÙÏz/xKR¥-¥Êœh5&˜ÍA7î6š’†D= 1MoHÕiÕô^e h0%ŸÙe 1î5êõô>ƒ!Õ¨O Ó”Iåqò8ˆMÓ^½zõñþùñåñx¦ º'ø @ÒÙ{yý¦„€“2@¼%N 8º<2ÜU|p¤é„·£Øï(Ô´dŒ´eíX%A¸JFâ²ÒS)Ÿ×ãž|άÏ6&{?YLiñ;ð)犅1\ôg9%ÃÊó Í ¬•yP3k•÷h­Tô ÉöPkRGÎÐn¥eXaòŸÒ{ô6ëjë§o«¤‡O ‡Wlñ*-ßžÓy­u÷Þ1¬I–p9kįNVLVÐZËp™ÙWfQ[}Z[@Y9¨¶¿(?g=kœÔØÏF5ÖG冡 “[o{¨£?È=¾‰ ¸[wô)Û![ƒ¸.Œ`óª÷¾_ÎÐËŸUºsåH9ÓeH¡/7ŽiÌ•º1ƒýÁiz\U9©4 iL£çlwΘâär\BJ JÀC7oŠ ¥ÁŽýHfk!ab´)X"ÄN< ¤/9Eñ¥|’çý8auëÜ&ñVUûüZל:« ˜¡#Ä34rhZ¯o\€ñš‹2rÃJ ¤äúhÁRŠcòµ¯œe¨¦ÚÉjêYPÕ:¯º†eUv°ª€"¬ VUë„"Ó‹©uL_ÛÌÍæn–½UçœÓÑù=- ÂÆÃ¹$%àó82!Ÿ"[âã:αaŸoòxÐóMx¾©@0}øƒÊdè(ú§\mT&\± •€”øÜ( “£ÆÃù’èW6%¢‰G‘øD±‚`‹å¤DL „ìE˜å p-ÊQÈCi:œNw¨êé‚*Ë7S ý[6ÌZ_}y7&*Z&’H”@å‰o[ózþÑz+Ãu/½ïË"×Í’îÓÍáëâ1D-ÄE@’‡S"’:UR ÝCã0ûl@ŠMJì ›ïÀŽuõôŠ…B9ÆÃpq|VEŽã£‚¾›Ï¢‘Ü®;…ÎÏNt|¼ïæÑžÏ3/Qünþ…÷Qk0\*# ¢äJWK‹êU¹íš\‡:ÄY—ÊÁgÚºÿ=NüwiD—¨³¦Z@¯AÙM{-údƒ&Usü‡'b±h)Oò„¢ÜØ•1ý7ú}ž Ei$d¿}ŸCP²›—O´Ÿd¤%k¢õ˜ûÒ‰©æœñ¶c³¥ë OGöDÇqßÅìÇ ™–¬±ÆÜ(!4 |¹|†F´IºçЈ9ÑnÚk£LÀ@–ýcšA›¤ÊK8¾?îÐb·on|C¼asä¶´M'«R+ ûHŒ$¶ÄJK’MŸDÃîR ôn£9ñ|ùUÊÚ}›R@’––J€3‘5£)ÿ<‚BÿO>@ÄûOúÞ[·zM$¶X$àघ Q/ —¡K¶J^í(;0è,iʺ›ºø£‰–ìñÖRwSAàÒÁ÷µ9+9óe˜‚‚ Ÿßè@]39k›á¢ÁÇ9yðRpZH>Æg¿rjëöû «WiTêGÔ&`’!µu¶*PZ û Ú<ª0ù´öÇj›G_ã-3{T6ÐýÇÚÊ•]³cWD7—mIÈôUеá¾B1®ª*Û™*$ü‹#EÑèüZû°Âæ6ÔWiŒRê}ŠF#sU¥ý›í°ÎîÑÙÇæñÓ´WaPi®“åçw¦ŽWÔ|P ”"Åøˆ@„@ò£°Ümñ¤«<šÊ‡gÔ´q ‚ÖšÁ«Í”ô˜Þ>¨0Ž–Û¼°çŒßhª2WJH>EŠ12÷r=ðä¼L+é“rõ;û—ötõ:ƒpps| `$0àõ˃ŒÁA8l!&JÙ…Š%ÕM¬‹í¬Ç\»‹Uãb5:YuÍOÓHH¦5}/Yí¼×·E¢+D¨ ‘`\9'ŠÇf qö²7^.U.jèfÆiì kp͵7Ï©uέïšÓØ^ïaUµ±»^Ô9ÂßúNÆŸ\.0;æµwÏ«®zéÐ[ìek¡¢8!0*åarËNßÿ›«?ö…jIÈ;nŸÇë÷2À´@05MŒ¹á424¸ƒ§ž×é‚z4†'’#CI’/%I—½\X° ¾™Åxc˜ÉÆ;”GŠ×aKQDŠ\^¸D‚¢%$a%}]=0Ò˜ßúLOCÈó³å³Œé;ÅГB§ÙDz@z#1be|ê)絬Î/ þÊ~Euß ÚNÒv’`ßÛ·ïØ –C1ˆšàˆI´ÕaA¼k¹A´TaÙewYö’EnXŽ]`YX´“ÔNŽé´¤MO@ÃŒÑ4­ÚjŒÜ×îöûØ”ÆÌP‡N&ù'?Þ¼YË›ßû¾ß÷ûýüz?É·K¬™ö᤾Á<û@¡ù½¨¬rNÀF6žˆ  çKh’ÊËɽýé-÷¦ÀÀЏ—³ëtÌ \†NL °s\½35·ûRºíêbÉ?w[b¹˜Þõ‘Ä>˜Ø;|ôÍ[GßÛÏÅ1˜-P™ìŸ\}"ÑT”m)ËéetÈ–˜ËÝIm.Él…ëåß?'¾[¨Åj]¬®"Z­Ý­©Ü­SF©´»uÚXƒd[Jk•ÊÇY›@_{app1¢‹ÉÂÂX³:„ /Í['âßkÌ1eÍ´¦8Z“§L¹s¦ÌqKÖR52Ý”5f:<Þ–5Óœù¨%ÓeÉiÎás|¡¶Ð$î¿A«Ð‹u€ЈNlXT#âJMŒšAË>…ô@iž8W¼NÆ ãcB.Æ£q.Ÿæó(‰Q4Êâþ‡6îÿUt¡z¿J«ÕÇèA#êF#Œdăب٣/ˆ,XM®Â½Q '0 3îœrw“'Rj‚Iy(½=¶W_~…í‹B*ûú¸"(ô¹W‚±Ž£»î·›†µt™­’‡–¼s¶³)y¶!eÌzòaç±Â­þ¨—H‚}±±wõø¿ÆÅ.ìÜñ:l.`&„/&â ÒB×^*”Î(«¡õ(*Ge•#%ÃR»üì)í¨\7^¦Ÿ+­ú\¦³fg¾Rê*oüG¹ác™ú3¥aªØxf×Á x^ðÚž» í— ÕJÕ¤Ôø‹°õ~Bÿ»}â¬bT®P¬}P¦y¨ÔÞ)“( _žZ²Ž;&Kk¯« 6lø]QÉg%•βj—Ìø°´ò†BIâ(â×~)»]Z¹Ž0Ü”x(c{L€êGþlßœµ/Þ-ªt¨ªïÊcªÓ@/˜$ÈíA©vD¦›TTH €w䆒bE9$E`LåìïêfŠêüâq—>¨Ž…FðÃxÒp‡nn~¸¯|õazzj”ÓõùýFmÙ&âá$ÄzÚ3dësÇåM¤±wymÿ²š^RÛòuйõzŽaˆ z-fÆ5í€LŸÌ Å5É„Ï57Ŭçcþ›®ùJåêï6‡ãE ù<ŒÄq,!ݳ©žyØFÀ[Ò`EZÚ¤RzGî¦Y"?Œ„ ,ß'ÉUAo¿qÞ1=ëÆ¢»³/Ðñ‰ÕrÑW;/'3½?þþ|ŠK`8œY•|º]Ò}9³ÿÓÛÅ\û_r»?HþõPZßÍDÛ¤¾Yý×$M¿Ý´W‚³É`6Ê£¹  €Îɇ“>üóŒp_` cŽ Š¤ó´hËþÛåôÞÅ4r¸k0÷Üõ̾+Éö¡Ô³7%—¢2Õ,THzñ|}¹¤06'-½SuÈzJb>•×\Io—¥µJ¡ƒKLÌùHW…Lò½sâ»Õˆ^lÐDiÑÊŠ=je¬J%®ÐG ‘Fèà ›ãV±iŒàñhŒƒ­Y³fèêƒY¤ÿYKNWlÌ.X P` ëc]ÚdKö\[ªÓ?cÊ™iNÔ‘³T8M9S© ‘9Sö¸9¼9ý¶>‰Kâ ’ƒGm,‘ƒF4{5 m”~±çÒ‰Uú=*itQBøÁü—üQŠMS$-€Eˆã£Hš`ï|œäå ‘í-~TDVª£4 08͸«F½M«‰Ö•Ç+^qŸÍÐ|š¦!ézzz¾éÅ#§ëÒ…‹ ‡â! ‰€p<’FéÕ<œ»E@ôäïÿÂ|r¢%ÃeNu´Äš²f[s%–´ sò¬IâlËŸ¿˜tµ:w5ú Šqi~ „åݷλëÇ’ÌÖÔÜ™w\A¢Áj _»þz©rLY¹§(Õè)fåU£¥§—Úå¡)ÿK¡‘êÇ‹ –¤$û©¸ð°û¥Æ ùE›ÙÏÛ&;Šj.e•°io!&"¨Î¸”G¥º‡Jýo"4í‹b/ùÁM&KucÒªIù™±âÊIiÅŒ\="ÕÊ´ð¿#ŒÜ cRøÜ0"ÓŽËõñ‡ƒ)¶MpI¾?›wüXá4ç_„c~éÌ9—þw !œ°{ E}Yn¨7ºé)ÃiOI}/R×ïYeöh®_L#Ëk-H“i°ýDfÀ6G?Ãy¤ÈgSR èõh´#u6¤¦ LâQ×¹²¶sECÒÒéaìZÖhº¦k¥²z…¾ij_Vk[^×Í¥©1žEšßDÎô uæ%k¤¶ iµ! ý+ª¬ËëÍH“©¶ mo7Ð÷Š·Gê«xØ) [˽}ǃýå‹¥¿Uìï) ;Äþ¾ÒqÛñ £ìwÕY‚Ç‚©1 "/%C^X 8D“­Óæ4¹dœ†l£!Ç ËjÐekô9*]NðoäoOÚÆ¥á:ʆQŽL&`R|Q °1FG&x‚ËÉFpI¦ØœßlØkÒè”9uÆ<£*G«Ï7ë÷ éºæ¦ª}U;bw¢Q  äĸ„«/‘×\^rÖxZMÏÖþLÈ5ä‚Ãd“mÃ`”ƒÓߌYë®Ìú·õ¤Ï. ô Y‹|ÖR¯mAŠóY‹fz+ZîÀ*0aFêkÉa虪ÁÌ×/Êž „gC!ð ½uëVfaF —Ë¡áÐ6`‚Ó+¶ný¤Z½X5¿­ÑÝU4LÉ´3ª&À wj5>•iJf¸¯h¯ix 5üA(ݵ’EãDé¦oÆ£ãP›þq¹ÊWÓY°9AQ>L’óžÛÒb“cQ•AÝÈÁ<%e@ß¿+ê˜T˜'2]@¦ó×4H¸¯l¼S×øK‘øe4%@Kâ&qï‹ÓuM÷4j¿¼yRcžx·þ£Z A¥lD‰ß‹ªÆUjO¹òåhºé̓žCGîÊ5Áj- ¨i¹qBÙ0.ÓŒ«ŒÀÕ†ªÆÕ(Ãrù“šT\€Q)>¦RÓÓv#ø–cáöuÊÏëó…ç¤ [ßœm6e´ÙEž¢¶°FšY¾/9c=œ(@x„Ô–Çd‘4…a€FSíÝó†ÑÐø—÷ÿ<ç¯ÿãÚþô}H`48sSFC–֘ѬÍÓªóUº,H‚>×`Ì2kÓõ YÍÁÑž²Í¬>›Ë ÐÀWñëâ®^¾ò¸xçjê) <)jP_ƒÎ3¸íLÁygPv'2ì’ô{ONºj¦Þô Ãö’°£ÌoMô‰ÊOè´(Ð+ù¤»&…K¡³˜‚æÀf£éÑ^$=©åGk(ô¸ zœ›I~û«_'Ç&ò9• z5‚ ‰Ñ•ôŽ¢ùvý¢Õ ˆW©ŸªÑyku øªÑ«2NÊ SÊ&¿Úx[Yÿ¹L§Ù“M8`FLÈãqxkV[ó¡2eÆË5š])ø À! ¡ãlœ 3¶3pKÆŸ±Û/ûÎhäLž>µùŽ\}G­»§5M*A…ù®¡ÙyàN*XMÛÎá;»§0>¨mú¢NTSv‚…3Q&aÊ;ö×wë÷nØ’°zíùªÚO5Æ)y¢Z=®5ûj Þjí¤®ùA™ŠI¹ðÉT½ùÃêšô˜$ÎKQ$í`pbB|pb2ä÷ÏM†?Øwo³áÇóÀ| ¾7r¦3h<ÎdÐÁH³¿jë^e9»´cjq-D#Ë`ôAnÈâYÕf[¡oš»!»{i—²Ø¡N;ÔÕuÏ­-6àϵ{–·ÛW,[Ái‹gSb-I‰$â£2D˜; æ>¨Ëö¼Åµ[—u,E€¯luBÝN¨ËuF"ÙÆÒ†å Ùìx4 erAWþì²ÓØr&4öõ¯&máÃÌu8 e%·/q__ˆFJ\c'\¥ k)Îea|œƒ1˜¶%ïd±´»^Ø%/ê•—êÊõ»Rl“ÿ/ûuÔdzÇüe=Ûµ+Øï}%À-j‹î¸ØêêjU”CEY»R¹B8ÎX@B. o!@¸1ÂÖi;Óiëôpmg:­ëtœ­m§e½9’¼Òç•]w»]¦²ãÌþ³Ï<óÎËKò¾yŸ÷ý=ßϓۡÉu–äw”æµk€R„¹ôÙ]U·!«Kÿ¥3ã9{nK þß©Šç@Â.]# âÍ\’YŸl8óv¶ž‚q“8¶sçŽøç=ú¼|rR²ŒbÁ1X\›¶ûq[&ïÊáÛÓ½-Ç'{ –ªO{¶ô–”ÙÎ<ëˆf{J I0$IÊ$r՞˫-®¶æ@µ-ÑbŠ3pI&Ãzÿé¸MñQÄ % J‚"LÒÅ€è§e(,Aqqáøø¨ó¹Yÿ‚F¼3ž»ü¥NcRd#¥Õ×$ØË*¸c\ùÁ .ÁTg²²Uª1äLIfãѲÜ]¹ëáðH\Á MãQ›"ûz„ ðóPˆríÚ5¥‚@q<Å^[÷2—º÷vë)Þ‘Ë;³f;”¾¶Tßù“³ŽtïùôiG¦§3wÑñq¦ñá;Š\êD)¼šÂe i˜bCÔ“'Ož]qzzõB™´FâAýÏOÍx Ô§)Œd$Ž£2GDû¢Öÿ2çìãŠÆ{Ë\iõRS~º”ùëÕVͬ •÷u懥æiHóŠIM™§¼Ò_XuרtpË60Â8Œ½Ê`UÇNþËlŸÓYáÆ›Lú 0ÝPc·ðgs?dwu\^ÁÙÅû’(:œJÃPÁÅ`)¦pœwúü “ÒÜïñù| Z˜¬Vs ÛÏm~¿pƒš"#ŠÂ‘ º‘ã‘;ÎôýQ龑9pCuq\yq,Í=’58–=0–Ýw3«çO*÷HzßÍt÷{ª‹w€I2úGTCãi½#J÷_ €ê¶3å,À¨Y˰ˆŒÆHXp.Wäe«‡/üô7x·k _ΠŽÁÊ"b{lAÿ»©—?XL#ªÁ‘‚¾÷2Ýcim?ÇâYLª#щ!+§Á¹Ñô›Þ|ýû?L̳+[5ÙúW™ÊeÌp–žì(IëÒ*ûŒù­Úi8Ýi<Õ©,Éu”¥ä»t_:3ž³gØÎà$E üÀ–4'š€F€+¾€F,ñU• 6°_v´ìÄ÷ÞQ a2œbI’¥©½{÷<š|ä›jÀ=L`‚ú`B¾•ßiÉ÷u(.%ïHõtd.U#¾Îl¯«ÀïHóväM:²·¥çîZtMÐX("Ë;¯7šâ,ÜaN{X“õVêîͱ™h¹T¡ÀrŒ<`q”!9#'P"” U*•W¯^j (Wxg?ÑÈÇýȡà +)•Ê‹cKl‰vàóQ ¸ŠªWÁÅWš×p‡lHâ+jŽYóbs¾ƒmb%¤œ¥DÈZ‚FÜ}ýÿ'Ô÷x< ;àHLLL#¸@¤áÔu‹rҙͷgÚòçSŽÔy§°Ü>Ž;³=ŽŒÅÆgÆ‘èQ{•÷§½N ÀDZ­ö£é÷S3ŒP׳³ß]¿¾5ú ðV°à², àFô»cêlÎ>QRî×Zgй¥¦¼ßX3¥1ŠLªê*' Vͳ†šiÈ벇Fó#M¥m_‚DŒ2x(2œ ƒ×ñ”‡Ú²)>Pa›.âîêx]ÃҚ‰ò†{eö©òú'ËDaé”ÉüÂ4b0ZL3ó\#øI¾s•Õ¯5ûtÀ¼ºº«êbFâh˜¥1f01ýCK¯©œ8Wq|ó&˜Û³Rl›‚½”uÊolž.`3e´~Xhô–×Né잢Ê)ƒÅk±yй CíÙ=û1Q0A"À\–èì° ¦b¯ÿì,ûU{1MàùyP 1÷ô¨öù‚ô`&%9‰†¢Tˆ*jê€Z¯,®×êšÞ5µCãPÇrkû+un¨ehemïòFw A]÷r[ïêZ÷ »ªíª{Ö8©g™p<ìå2Ó*[ãò¸Œ E™ðÕœªí†ì?YYwj[E@‡ûW¯·öBÕÎeíƒAzÛ¼¬þdˆˆ¤à˜·¶ßŸœ‡sy^˜ƒ>èϘ±$œ,x¦­µ^Ž,Ö ”ø4¨Õ Tï ƒì]PC—@’æ$`§¡wYËÀÊšžu«œ—¾®Ö…Dma(\AŠIpBÙ}`ÿ¯~ÿÛYPOËàíñl ý¼ç;÷Ï;ÿ##@1J‚×ÐxXÒ™Úìá[ÊáÑÌ¡›` (¢Í»pKåUõŽäŽæ ŽfŽg Œd¿¯z?sðVþÐ ¥ûÏÊ῞轕Ú5R8tSÝxå€Êùí7DN0ˆ$S°XOLÉ)\LJƒCe(‡HhfK²ê쥱¤ÞñÅ4’54’Ó;–70º-£˜Æ)¹øU ]J²a” ^+ ÇhLþ‡ý:nâºã¾ ͤØÄ¶´Ú{µ’/°áÖ\a’ZŽ8`âK¶ñ6Rcë²$ëò}ËÈ–,[–m ™É0SÚNg¦M( 0m§´4Ð&àß¶°ÕßZ¦¸ƒgÒÉ?Y¿ÑìȻڧ§÷~ßÏ ÅhV„q,#»n ß”“\"/hVp œ:¹CfWN²ìjy»*Û®Ìuj œêüU®]ñ­3ã9[Š6# b,Æ€FÊ÷é̲ò%S$Îd€~ËTWo‰åA¢LRÅmÚ/ æ$8C D E‡¹1ãy2ã™ß¾m'…S,%…­‡.ñõI{þ”5sÖY4g=²d´çŒ·ç{Yð!г®‚„ÍábVŠŠÂ®ð`þÉø“G¶‰‘"![ ˜à““!Ã$"6 KHHp»Ý††|НQ û¦¯O~&''«««9Kç0ºpw¡EVi<Æ8h¤2Á¢••«bõs|µñMs•¬B—¬ËÛu4,0nûQßÍå<÷·Å4’Ñ}-»ûæÉîO„ë¢á^ ¤(¢º¢úpF:#á0TÄ4‡S¡´Ò8‰ E¢`œA™õâ ;¢÷¦'déOŸ5Èú…¦ƒ–éÔdt(}í[gÆs¶Ä’T'Y gaÜHJ»O 1Ä›—ªÝ~a¿ÑüVEõþ:Ý^£þ@¹"Y)‹Œ A¥ád(€īө!zaö\þõï(\Ì¡„˜”Fúp,vÌyzÂqÊkK]*E¦ÛäC¶þôž;™îûá¹ý£ƒÇú)D$ÃDP"ª7Äú‹#ÑuoÈuΓ}×N¹nÉ]‹i$»ÿNZ×µƒJ+±!¤€ÆñÄ)sü¯3ysñÒÏŠ‹‹#ÂÂ%°‹¤i:Œä§%+Â<¸%h‚‘þ›ý2Šò>ãø¢éL¬Q`wßs/@¢xÅÄ£Úvâe”ÃH‰J,Ç.. Ñ "{ß» ×{ÁÂâ šé6íô²ÖÌÔ#Å#Ûô¤‰ ,×îº}^6!¶S3ÁIÇò›g~óλû¾ïï}Þßóý~’—Ì}õà®TQN±ñÔ‰6M¹]%l‘ òòNí3ÇŒoYâ<#9¢,‚¨0¤ëž†F2Uºƒ:eª üטnÖК߲(ÒU;×îä,g'¡\¨‹¿zõCÊÐ……@Mä$üˆÃøQ8ê:°ΗFf\Å#®ãaWÁ˜Kî(ú¬1Œ#Ø(I `ú<u.Éf8ŠÒ¹‰$Éd²QtÏŽöÖ–é@`jff¶ g{†¯¶÷£/j æÇ«õòåË t“ˆÅHÆO6¿©?`¬I·jÓ4¤ëa 2<@rt™fkF­v¿V–&;‘V±·•½‚À™(‹…xìÙµ{ðóû Ùd02éŒXœ—@_ò2'ì*Ÿª}{Ò]:êN´θË&Bk`ÆŒK8í,™rgÜ¢'ÒˆC8I]È· Ž’ë V3& @ž(¹ö‡«”üÎFÿ«*OqX$¤Žd`Xs%‚og î£¹S›¦« “2Ó Â0,§î+ Ÿ+A±y¾.?¡¬WÖ Kô~™y\l2œùH,?´q¡qµYCýˆL=#6Ä–~™u5J_Ç"“â“ÂÈ}kÖ÷ËUFË€Î4¤¦gJe ©ê&%ߊ@Œ*u¥æ_WÈããp‚nÊÍ¿¯«õ‹ÕCJ#Ř̬2À[ *­ŸœP§¯}™Ž"q –z©¬*,® ŠMSr3$mªÚ”š!o°¶¥uD_;&5 J´cR͹áÚú‹ŠÓk „ÉÂØ8‹‡òR÷ìyø` 1ü¥'<ŠÀñwãÿ0_QHø ‹”Cˆ’ƒkÝܺr%ûOŠ%)+ŸD#48l{TˬÏÖ{ÚzÙÎG×uÅ4tE5{¢šÝÏ›š–”+ž{K´øˆhiIeL£›¦,,ãÈËqKÛÞ 55ÑZm êÏÒZÚ—[ì4KÃ÷Θ†î[/ú¼iÄf_Ôä£5€Ñ;b…ÇéÌÄU`W(7[hCB!0»Ðt0<žó÷H"Z÷5X2÷\I!¨:È)IÆÅ2Ù ŒË¶lŒrØc,= ¨:hi6/µ¶†Îè&ïBxwÈR“wQƒ7ªÞEktRk†wozÿÃrŒ‹38 .ÄQyMÙgAC.ràV°<4R%B­Éh_Úß³R®æ¶‹!Åb 9î_N[/-” …ËæÐ©4_'“»\®Ë—/?Ü,$yöþ”õó1ðk—†6î|ÃT¯#Åfˆ‰¡ÞêÚ;à‘yI±Å,5ÛÌVá”éÝ2“½á¸MJB”\b£ÕXoyY´›ÏÀ1ŒÁ*c–q±ÊÊò«W¯@üôãOØ(‡ÇâÒqîþññöåXûl´=jI)3¡ÖLPµèoÏA-KãÍK‘ÞøxßjñÉZ³‘ž…@*:”Œ)ÿâïÝ…?3Dˆ­ØÒs|£ Š =…¡| —ƒÓé;YxPÞð/½eÎøa¿«_ÕµgÌ®ÛZÛ]=aôÌë=qÂ}×à½côÞÖ:Ò¦Á ˆeÆ4ppÜ$œù»ÄÐmÒ=§1ÌÍó„㟖aïž7¨ J9ƒ6.>&FfuÞÞÒ8eõ—{û3'ì9û–Ñý›#ýÊŸÿ쵑["ýë Cjí´V% ûŒÅ×z>iÕl¢âŒ>úfSNëXҹܰºo¶œv ©u%Ô.ý/÷ Q($ô¾_l¿aôÌ™<7kÜäÈó:Ä'nvß"íñã¦,á¾nv.i\WÕä«›ŸCK(<6 ­¨BxõÚ•µæçwãQåÜR:ßžŸ>Õj;ô¡¥ìò§7mYŒ!#¿*žx|4Š'‘¡àªT0:±nh>ƒŒùaÇQ{£ˆB§o®^ç !#“ëüSšØ°ï0¬¸®ñ_xìÔ42üë¢óOú"'À»ÈðE$paÍ422Œ†ŠÆbè »ð’Rð,Î)T°t:ý5“€¡?àtÿÍÈÀSÿy¼pÌ,. ž*CqN£a؆Ö€…& Xóüó;‡ OùC¡`,ðƒÉd†ÃáÂî6¬'³2“º‰Kͦj*F«€ KÁk»õ-ï|ª<ÿ…jòšòÿFM}Þwö¢—Ä<.4fLZI ¬-sÿá«°@ˆv¡uM%’¿ÿèc³Ñ´sûŽ<“`e~`i6Æäà(ŠÒÀhlf1VÂÝ,>Ù¶ÿ•×ÕmmŽ£‡ý†#1²3lNPF"ôí1}׃2¢QÆ´À'-ABÔwŸ±ÀZZ  à à–'¢ëíA-¨3LtGó×Ama-H±" “¼bà¤p¥p ®tL_שòXEgq±<³Lo©ur»UjùV‘r+È"·ZëlV¹Ã"tÛHi–%²Îb®7“ $ȾÇf’nÛ_É2Ji\.ûàÁƒàñélâ{6œfóÊ™Lz ëY5þ·¡öÜé·²¡¦…À¡\´çΈ"9ÑS¬æ¶!+4Ò'‰@ËÄ‘Wy :|È\§Ý1ŸËµ•ý²¸BÎktƒ^ƒYÂÅq!Cؾ£Ë*öx%£N±W¿‡´ì5$úÎ]â­’çÊ·°Q ÍSêVf¤FÞ/V[Ìv™…”º´õFùOk¹T6FeÂlqœY¹I@ïñ+it|#‹"¤<>¼o& Z Z+s±îdXè• u-E»2E*И )HV‹O6¬X·/ÄzRU&ؘ ´Ü™xûŽZ0Nx#޳h €QçatŒ¶‘É~¶˜y|—ô½£šë_Âê™ÕÀ óF÷j®R;òÒ¹ǜڶ@¸Kâz'¸ö¼Æ>«¶%ôî„ÎY¸5¯w/§5Ž‹{AcNÝ75õÏ–ñx•(çÏöÀhÝü*”ÆDŸáqèÃÍŠ¬ÖŽ7ú¾Ôºo|€:‹füÃ#§£ûºÎ’4ùþqÂ#Ö”ññ=‚òjÇ—Z2g95Gä'yÛ™:é¹ÚoøÓ ó6Þ&Gù-r Ö>Ozf´ä­cÖ”ÑwÓ踭·d Œf÷M£=£qýÝêkß¼UD+åp8ÐÊpqÎùÉÉl6ý)úÝx#ï³+ûZ¨íB&&`3ŠwŠÁ.ŸðO!ƒ#ÈàX‘?²ª«ú/"£“ˆ/†„Ï‘nê_ªú~i‹YòŠ ‰Ö‘cÅòf§ŒNÛðƒíRdô24ùøÐÅǽ“È`¸h$Š Æ¡ÓHdín>r|o0‚Œ…¢ç9('¼¸ù'¹ûñãáP$wOUü¦¿[Î5jä0q6”ÿ#­áÉ¡)dd h;»æùžF†§Ãññ§¥òr®--…*Q[[›J¥ ï-ør‡ “¹·Â;ÚEµ £ðiXÕÖݽÓ6_¼Ò9ùyÏ™kmÓŸýÏñãµ]øâØôùÏïâq¸8eƒƒÍÎÜM/e¾Ių3}+è«Í.9'æ.¿ÿÁ€Û#“HËù‚Ò D€Ëæ@©ç3°r4„t#ŠU ¸cC2³¬õÔõ%¬LÄ޲煃Dg_Ħ7´ÅLŠpž:Nªº3ªWÅŒp@h8¤+fê>mΓIH§ˆê{£DWH“§‘°N¹Â­¢)¢ë 뻃º®€Nz"z Ðá˜ñkné‰Ìà\9®†ã>uP›ŽðÊ*mõ6»Øk­óÙåŽUd³É¬€% 8ë¶z;S†á˜–Ñ›SÕŸÛºâæÎØI÷ˆÁµzÇù`°Ä€ÍŽ»Çø{Žö[œk⸳æ[TB‚HXÁ)ß©ÞÙh4>7ý5RôûøŸÇb­Hìú™ÙX$jj2Bí’BZÎ`RJ˜·KÐX8¿êLpyËÒ®ÚuIpæ‚ «_à»øTWèùýµ¤jB$Váp^ÍHÚ”ÏPê,IR¶DŒnÝ#8uù©žþå €9snuç¹gº.®ê>¿º%ðÄn~ꊠ»ouWxy ŸJ_GSˆÇÒP9T°E~˜›oB# ×Þ¿Ã\|úõ ‚¦œ`2VvxWt^\Ös^Ðøž˜F–u<ï½,8}îY£]‚(9¡J(B~õêÕG†1ÿèÇÌ::¹qý AÁˆSi'Õ{Œ½UW®—ÿæ†îìÇunT^üûÿ?“öÒ§G‡Ön;HÒ2‰h(ôTg'Lé—°÷ø%’ó1yÀ$‹Ÿ'ŸýãÓ÷޽™Ì{Kö¤§e©€ŠŠà¤U’ &§B*„’¦ÓJZŠP&‘aš×Öj­ÇjÕ¶2Ÿ¡f€¯ªýÆš°¥,È• àj¿¹*`® ñº^7ج ËBMÚ°I?ÈiÃ\Y¿¹<ÌjBü¢ªƒœÞoÒõA€7 né3TúS4AOm?·Ëp¡ÑZ5•D–m¼ck‹»¸ÃYàþJ¹ò] wä*r-Ê‘ëtnu¹òÜîmž…_ï+¿…/l>¾ãx6™¥ å4IÑ4 S]Hj …Èd}c# JÐÀ#r!Ò˜¿~4üv¼¿:(žÙ;Û[6¬]Òmýºé€v*TñW€\%?aQŒ%aSC]»¿LfïÅŠÃ…‰d˜_eXnoœBa)Ó uMAÕ[¹o•¬óe:# ÇÔH–L¬b¥ 5«’*±®R°8ƒ MЊ :ýX^ƒc«Ç³­Í^`¶ïrXP-RgªÒ¤R‘\Nggf]{ÿƒ ëÒ䌗$Mg’â/ü'§ÛwÇk§ô±`ÅLÝD_Õ¨O@2ÔÅûÊ—šŸXßÁ{~ýT¸aÌW5¬ˆõ–Æ|ÚX°fèÄ>FžDáêTB%ÅD?SkÞ)?2ìè¾{²%fò6L™œ1ÞDÖ<¶4L4·ŽrîÛ¼{¸Ù5ÌÙo›-fÛïü‚w íãF'˜ò0çs´TŒìcFþ–¥ýxÁŽýkÖŽ\¿Û[•"BXŠUS8E _Na,o””¨^Q'³Y¨âOÕµ7 üˆÕw19ÀÖG9×mÞñ­ÓˆÑ³µßij¾úÜîݘÂÒ2rßš×níÃ&+Œ$njþ¥C»~ƒ*I*M^‹#¿?f¸kòNµ5ElÞ‰&׸¥å¶Ñ „38&›[ÆšÜ#Ö.Û¦\€U•"‰ºÃ ‰âž¨6ßÓÈw(î›Ý|ÍŸ‰M¿ÝxTJ'³´Z3r„|®T/híYÙ1¸¬ëÝ%© #$8=(8t÷ÿ çÒ³m¡g´5?ÔdÂUHiN ŸÃÓhVõâjW몮÷V¶÷-ë>õôIËŠz³ µKà ºÎ |¿}bé¸ h?³ žÞÄÖ¿.“Q(I(%äøøøÂ{Ám‘%¶¼ÿ2à`6ólîsgdj;ØA’ì‚ÞÞ§;4òTÏÕ“Žy÷ÙUíç>âÇÛ¸BNIT8®«< Zù"JÍÎÇÂÀ¢ ¤ïÙ]ÂÒ ‰ )ñ£¼}GÞùKéÙ¿ê/ß(½ðçÊË×kÏ}çhäÐ…ë —>.jt‹h ‰â)ªbÙîŽîEÒø<ãÑ,}Ø×W3Ò8mf.þÏýûÃkCíÝÝ5‡íÜ©P«% †$Ãi™Ó`L¶\MaB tªr‡A8hÓÍ•!S]ˆ«ö*ƒÜ¡ 1Ñä€C*úŒ•~´¡G4Ágy_SEÀ\×o«ó7×ùø#~KƒÏª ñ•ÖŠy’é¡=hÓ…-€% ª´ÏTÌS :ßät‰0À¨TΨ<»lž‚Vk¾ÍQèþJy = G¾Ëžo·€¬öB[BÛí¶ Y·[,ÅÍ|1ÏqæBsÅýæÌMYt&#¥”r…X,ÊÍÝ2;=42=;_}ažgcGêÜp \D’º¼ ÃÁ£3¡ÒÙÞƒq_u$ܰ”ÛÞó•ƒÉLõ飡* °°5Ã~ôÁ‡ +˜HчÎ;_#` $¾$CqaÐŽ’&º1óE5­ŽÀ–ˆˆ!09A3R%ñB%ÚœÆî~)s{FJ6•Ä`p LJ¼Â®sîtºòŽb¾¥°­¹ÈRþÓr¥P–2«Hrra^þÐÐfiBβ4M1;sRoõÔOÊ#¾ÒhÏØ/ó ¦Ï4Žg¬Zwì8Z®¿;?¡ÕZ‘ Š­¸²®(¢‚]o”# BÕ ¹ï È%$^‹ú×Ö®ÿlwÛÚÝÙµk§¶ÝÙµ3*„\$Ù'Ç‘?tºÓý£ï<óò9Þß÷}ž÷ûy…l¥“v‰·K<Þ-ÙDsé}lBŸ­Üu^8Ö%r›ì.öv¶” ³W¡8!@h‚doOMR¶…N™¼@ˆOmv©ŒCJ}˜¦…e.×ÔšÀy=2x½Ù¥®Ö˜Õ†…έ4+Œ£êzˆ™aDª‡Ù£ª©ÖìJLŽgÃõÈiÈÛåU½jkwaÉ婇W¾Ý{¨hØ`ª³HIgQ¨ ˜qk,n«6Ãë=RC@>7ýX4¢04 £r­¯NíÑZÏ9Œ#¬d6ïÖ1±ÛÔ²§=Š6f¤$Óïñ²›o«LÃúsþjÔ¼¶=ª²¸$—\?¬Ðê ãÓ¨Ô<¢méÜ{„‡FsÃV„—ŠÄ€"A·/45œ|õýyüˆcòiÉGš‘H'2üd(7g7‹&áå$RÜee•ó[úísk[7£ÙÉhw.hq†íÕvÑt~™ðd ?5“„%& Ljñæ†\Çèìc4ô¼¹c?“Z\¬!†ŽÛ´u±Ñ4¯åå¬Ç XfEhJãË/n…ósrê¹óz¹ºƒ£œšš¡ÿXdÞ°.>Ÿ‹r(NŒ€Çc£qÍDi’ËCØ·=•ß\±óvsÅC‡ØÛ#ï)ýXq4+ {A$c‚Ò÷Ž™÷šu»tºl£i·$ÝŸþ›å¬D›‚$ÄQ¤V¡¸Ü×G4Å6›d¢kSþÝ&ô÷žœp”‡Ú H&œÞ® ¿]lŸ›F:Š'ç:DAGЈ§ó(lÆç(ô;Kï™+øÜ¨8ŒI Hɹ!þ(TÛ2¢4 ʵ ð¦Þ¥³†CnšËµ]r£Oekv×èýµÆq™% ·ø¥–Ôê—ׇȌA‰9TgWŸTš\Ó™m;9yàÞ=(f˜{üSÁÉÀóª?´ï¼Dò9ó„ÞAð3ÃÃÃkV¯ÆN’>‡Ä#y‡§UÕÚV¤öÄK5¿:æDí³êOÌ©9‰Ô;gTººÄ~|–Í…4õÁ›hy6dsT qÐèòÒY‡•± ¿ÀçÓØÊ5ϬæM®™5MQu§ºç–›pž(ðhTy÷ï߸Ç0n}³»giÁ°‹˜'`fçö8 ÃcBTôã’"¤¶eNMr´m.,¦ÆõÌë¯ï|y{&I-\ËÅc9ɯ½1æg<,Šøýþˆþ>ÞÂÃ]„³´Åd‡Bð1‰8>ÏqQÞñ÷Ü“7dǯç¹nåwÝ”¹.e¼ôǧLÞ{UÚ{+«÷Ÿ…®kù¦vIÒZ1-†lC¬\{“–.;x ðÌ'§ÇÆÆž¢ÊÇq‰œÛÈ~Ì$,ÈE² ë¬ Ë!ð9ü†;±Ñ Û…þ¿J$ ã'¢8–@f׫²:õ™E.€‡S“ãÐ4ªs›5ò¶’ô5ÉþfmJÁ®ù 9 ñe=O àPŠ&PpÁâa ,>j$Ë+˜EÁ"ˆBƒè¡h,I$q%¢hŒ&¹1qÜx® “ 8šø? @`"<*[åñø$ ¦fgc@Ä Á!F‹ ,/+Cvá/çÙ33b‚ Bk!? &¬CölÛMhIã\:å}ïMÐtŸ#m:µõ9³}ͲQ{ˆò¸]4BrQ¨7Aötu³Ó±ØÈ^’ç¸z|º]]²Lé²%KÁáBp- nÄQ8#µP ¢8±Ë…ÄûÛÞøÔ”þ ã€·Eh“O6e3BÍrÀ€‰æ<¯£€iØ~ј“€‘Ñ2šúÕâµú­¥å)õ¦­&CŠÉ´ÅbØaÔþZ»6~M<ìàˆPz[j*àìï:]8OH\šŠå‰ë¨9$í|ö´@{Ö˜S:áM5K§óϨ3¢%Ïß,›lL4ÉB-ö\À›#“iÊùϱ⟓<&Ó$ÊÿIÍν¬+ÍãŠòñbˤÂÐÚü‹Wa˜Nµ½ê2w‘Þ«2{ôUW •åßÞ·4iÇÏVØwïP—‡Šl}Í‹ŠÞY&ù(iÅu…O¡ók*î4Æ%‰<7mÙJ¯ÆæV›¿2Øö®ZÍÉñ«N¥ôëêF5%þ¢Ê …mLe+µ|¥Ôê¬nM¥[Qù¢iÄ£±G[†õÖ!ž9b¹y¸lqÍ¥MrÊ€Ò:¢5z4:·F?¨5ÀªuÆaÁ[jR通¼ÚòquùˆÒ2fª-*c45çß/~=N€£ÜxTH¡â%I‰—/÷3¡ÀÔ”òÁd LåÏ£ ?´ï¯±y=Ä\»rt²Í–$p9³Túyu]Hµkf}Rë@êíHUÇÌšÓÓªmM_TM;ÒÚŽTuÎnhå®ZGbœx¨ãbQÿмipÍþðÈ«”@Œ fh-ˆ½ ±7Í>ÚƒÔüaÌÕÐ8£¶onUR׉4{tÌ©î˜QëB껣l‡ºÎ¨jâ艪jäo~ç“büeJ˜Pw” ,0éóÃÁcBTêYZ0êÆfq?k0M‹¸  ób…¯¿TÝŠÔ÷ `Çœsa õÓÒxlN]ÛªœHó ¾jrDÙšÆOˆ¢ÃóWЏPÆòæ œ9}ŠUÓ'PýI”bÉ`$àû÷¿îI“D•l4.Þô›ÚéÔ_ÚýYAßÒÎ+Ù]Wòz¯g÷Þõ~žÞ}WÞ{'­óº¬÷š´÷’ìÄexÈpÝÈêù¼°ëoÒÖ~YÏmiÏíìÞ›™íý¹'®gu_ý®h$×u%Ëu-³ëXAÏ?rÎ$§zEœD“È<œ 0ŠËj.‡f¦íki¬¿{û¡Ë0Z„"œÁň¤ú¿º§Dþ>ü$ìÆ];S{h>‡â¹Ž²Ì6ÝþfµÔ©ÌïÐÉYQïo-Éwj2[U-¥ï~(ò\-„oÙÏP,‚"‘7 bA%L,`(é oàz‚Õ<îÁ–dˆo â)‹@Z¤gdÆ'„)à=¼\¼(hywê.«ÕzöìÙ¡¡¡oŸåi/€{ÜûË·Þ“8…SB’NŒ™×Q°i¼µÀk—›ßc:¤£öl_ËÁ†,Æ‘åvæ›vŽ;ó½ÎCºŒÉYŸrÏR‚‹qÅBW+U‘XøØ ®ždž`"ÆâaÀ?Å#áÇ-À–¨¶ã /ô÷«Š›×o¤9üRDãbŒ/q,nqH.Ç[JÅÊÞ”|üÑ·cÈ‘¨“2Îüé¨`²¹À ‹‰¦x¤ˆ Ö$¼V¶£Ü”b°¥JßÖëRúmfÃsñfEµ*Ü‹³Ñ9wî¬ðøñãl\pRÀÇ_%—/$cZ÷o€1ƒÍ9ÃÎãÈ :ä~»t²I dtÂCúxSæD[îtë™h•YŒ3§%s]EÅòø‹°Ø%Â…·º/Ë*˜âŠ¥i\W:;¬1M*ÓÒÈ£©üZQ«ÙJóyOçS|Šü^¶oBidŠ*¯«Ì+ph*‘•ì•Þ×V­5Tå½9pf¸t|-Û²kTgÐZþœ‘{^Vn]‹ª‹`ƒ ئàaÈXÕšöé!Ž)2”†»zãåCê/hEEHSñ™¶ì覭-ZòSÞµ SªêÓH©Õ[dô±ŽªMJ­ƒªÿ²_îAMÝY>qw»* Iî½¹y‡€¨Rµn¶Ö]­+ÐQ»‹"Þˆ"j ’@x!„]tÖÖîºÓmµnW¥>•ê:ã»;[‘GÞ¯=!”µnÓ™í´;³3=óËo~7wæ÷;÷Ü{Î÷sä.I½CR÷¤XöDª°–×:ÕÊj?<\´†Á$Q)v(¾Œø*/úÁƒÐåÍ·ÛýíºÔìmP@N’È•‹BF‰ë …?ië%Ôé š;z#‰éhÖOs‹ažê ¡IM¢ÇpÑ%k_CøqÌ击|_21+—N ¥£è¢ìÂÀz]@ Èošó„ºÚ9• O6ê *:B# ØpNZû§ôsTÚŒ„Æî¹Mº—‹ƒ¹Ñ\R0Š¢¡î•KW<®iÁ*q¹¾Í‡çüRæϹ (tÁiЙnÜ9ÿ”Ù¬›Ûj˜ßÐóM4¢ê Ï[us{æµöšõó´@VK¶n ÂBÃI,*Šî=°Çc·X/*©ÃáðÌè)P•+ÿà!(’Ôà ƒµiWžþŠ?õÏ쪻ºŸ5po×`²áfÖ™á,ãÍܶßmÉ®Ü$8ö*_°)©`·¸©°çÓ\àÀðYú¹‡©Rúî§õÞÊ==œÞs+¥çîwE#é=7aN;ó@Ð÷¹°ïnþé;Gz?Íi}ÃÞtÆš_,¥F`xhP(B '£á$ÀÉA( œþóÍÛJ%¥×/_òØ,^aój ØÌã²¢¹fÓ2óÒœNˆØl aá àÌ¥ÓK# qñ€, I¡ '²;¼4’¦•¤v§uIÓÛÄimâÔNI¶¦œ»Ž‡’IT”(³rՑÃ׮›§L›ÝKGnÏå/]ûóÕ›ŸÝ¸rù“~cßɺz…L^S­'ÓÒËízÚñ1±Ì*.3•*÷­[0è<ŒCÄ‘ ©¢'ÊÆÑ’ê1±Â"k-–ùvií÷M#ž’ºñŠ¿I•†]É‘(™Ë¡Ü((µÊÅ'?.ðÈN^äˆTöw «Š–‡Ë9D `}Ñ/cŸ–ÕËÇ+k§ÊjÌÒ:Siͨ¸Ò^ÙðôhÅXIÕ”¢aBZe+œ%µwe5?£Q€ÚÉx(°(“Õ~À‡"³Iñü_˜kÚ|EjìÊè—½M$&F!2#ÿH<`$¨º½@Ò¢ö§Âª>Bk7A¥ ¬ë T%4«ìu<„¸tûžÅõªàÍ»0´™LdõêðÅ!нÌ+‚;æÕšÛ›Ú~,L¦F¾¶@\º¨¶sN[Ac hí«ê!4wÌU óº½4R¯ŸsÓ©—bÁL6N¢’ƒ×®3O@„ŽÌf±úÊág6èß< rv· šºì#IZH¨ÙÄŒC áéšô Néæµæ6ù Ü^2ÔÝú…-uÆ€Ã✂eLV8ΉÁ88¹sç6h ËsoÁóU5qºÌW®^eP2‘Ç -FÙ‰2]vß êŸÑ5tèÌ}¡~0ëìÃä¾{¹gïçt\ܘr˜ ÇÒ94Ê£²9( A8´•¶‰Ž û®‹îþZ#s`$M?˜kÊí¿/ìùü»¢‘ñ¶°w(­ÿ^jÿH’áîþî!aïpÆéÀ’œ®?¥œ<›#‹|ƒR#è$ú 2NñV¡H4˜…YtJã²"Ö¥ EíjÍãG§ÕÍåU«˜äåùŒ¿4‹Åâ->n/Dó¢0eR©ìpVº¦\Ø]ž¡‘ˆtÒ mIfwyºN p’¥•Š´¥IUùK° €Щ¨HÞðÐØÁb2û²Ããrÿ{ñuk@ú¯üïöÌpËF¾?–}k?cvMÍî—³P4sË5S`ÓöB¾>ßáçvLüó‹7^‹„s‰‹¼‘ÇúKS¶¥+ÃÞ‘déÌ´hóœí"»:yJ Ê+´j…f-(¬ÐÑ–üLs06,§²iN!“ÛÛZ½|èõÆcsxgÃæ¶NyÑãxô×ÇïðA™Dº}ÓV6u aÓ™lF†°PŒE¥³0ÇX$¨5•ÁÄß\¥ÏNx\'òtæ;Tû=jw´piSÌšä ÀÔéOýÝY¶ö”ͯ¯eãt(4aäÐ~ee¼Lɯ’%Ƚ4§¨ÞQ]½S‘›M‹b 8Ž`{ttÔ™÷~{žF ƒX’ûv´Y›ïiK¶w¦xúŽLi2žµ ­º¶ µÐÕ•aU'ùóÇ©Øtùã­N]æÅãñ¡4,„Å¥¢PÒ H<^Ñh/Sþ£¤Ì,‘›Š”e'ý©9ðCi씉ü”MÇòÖ¿id½—s|¬Dù¬¢v²T9^¬9¡Œ[J§ÀKY‰¡Ã'®ãåS¥²²ø8Èx,<”Rw£¤‡»ÊG«­åS‰ÂRQo.ªú¾id¼Da•*M%õÇþÅ~¹5u¦qüÚam§V×\Ïýœ$„{Ñâ±V[]*꺵uY\᪵¢‚$„[Â=€@€$$!&$@;³ÛÙÛOuF»k/»íîìÌvœõ‚\LB®û¼Mk¦Û™î‡ÎôL><çò¾Ï“÷¼çÿÿ=™Y|.Â"àõñÔ?*›ÿ\R•ÊÙ#™€­Gr+AIm³Õ]'2³¹8#™f^¯¬õ+Ûî+ÔÿQ5=¨ ×é¯Õ.TjæêÛïÖ7ß©¬ÓT­·­ÙII(aq8)¸€ÇÁãNWÈ÷T~†ŸÖ¤ûq æ è0† $ÎŒçÇ1yi«jj¡n#’Ø;ÔcŒL# ê1Ƕ¬Ð:!½‘Ìzc³ñø1ƒP¿ó5ч4õ†0“‘ú:¤í]«i]—±ƒ—’ñjÞ1!‘”È%„ÜTèL{”vê³Du›c´€ClÀÖc;­Q=–¶(­ê…tN¨o(¶Fµ653ã&ÀÌx )(–†iØ\_pñ¯‚pHÐß»ßlÞ¸ô|yN|Yݼ²$µÅv™¢Ï[¡n;*‰´½ÃÑ}N¨Ç é­Ñ]£QícNÇÙ”¦Šc°ù«jjÃ>jõzÝO¨ |5ˆò¸–pà>xøà l&£2Þ/+¹šoH#Ŷ©RçT¡s"ß6)sÜ:n¹´õ€!` å£ÐXÎ' t Em^Æ%wŽ8P;ÇáM{¶•šÄæÙ ˆLNfR”eC5€FІT»‹¡—†§:ÚÚ—Sx\îåDaHxÂ/çáŒ}†ß˜ÿý÷d˜êñÿ]bžg‰¾#´ßÛ.Q¯?ä÷Üœ¾‘”¶¡’HJˆràö#ÛZOLÒ…~±ÇTî7Ê=ƒùn“Üc,õÅ~›|^/õ÷çûåfy6ÂX-$yÛx(§«¥aþÞ7!@ °þ¿L_°ôÉJDÛßÜLšÅJF!ƒ‹£q(Ì) ¹ ƒœv#ó7' Š÷oÿ}ÕoïôŠýú¼!/hz òÐPq`¨Ä­/|d,ö˜K@% F‘Ç$Žäþ}¡Ï(ykëÁ)œ›€Ä)Ö7R7ln8Øõ~usvSë¯5uÔd%¾³a°+ ·X,'ê7=u=9Oñ,¡¼„Dmâý[Wê2æ?ìÉ ˜ ½±Ç [’pÒ!ID1–úÅ®¹¿ÿXp¤,wçúµ0FØ›slë6O]ï]Eýœ²nN©~¤lŸStGróÏ$½Á`­Á˜ñ8bÊ‘ÎÖv?¬j} ÔzT=w*=Ú…3unUûÅ å.B È.½;-uòTÍÅò3é z™mI)›“…Ÿßo=ïUj½§5‹Ê¶™jÍÚ–9EÓÿ›FïU7.ª;¿>Srw6Ž£“µ!=](ÛCˆÁƒG¥³u JÍLUユ®«§[’¹k˜/ÿ!'ß[Ý2*lh@2s®ÙuVãR´Ì©;Šx´óuí׫{“Ò’0hÜ6<öñÇÞ o‰ƒÏ£Èrü3™ü$Že_Þ ÃV>Í ò¡¹ôF$«z-P‡y….|Þõ™BD鯢µ¨ß´êô©ÕÉi<”Éy}çê‚Jè\#T\B1) ~/: ÆWçU°™x< cœÏD¨5ŒÕ;ÞùE“ae¿ °ÆôY£;-1:;ÔmYÑmW¢u–¨#¤‡ºœ1ZklŸq¥¸8U"ŠËИÝá  ñ«ÿá4 õ‚ÏíùºÛšh3Æx(±f×¾¨¾þ¨n4h{IkŒéºØÐEF²ža¨×uY!£-诈‹i67FI.3-5åÁ‚¸I˜š‹a .÷³O?–åS»Íf œJ¦)6™TØó'ñÈ é'·#º¿s:ß~E4>!qNœ°_{óp‰KDX$F"ü”íæ¨úvJÏrS¶8Égÿ’Åáî>ZôÑðçRÛ”lük‘}Jæ¸&w^ý±hD Ä1U`»Zd»R ê—2û¤Üy¤“8¦ÅãÓ¹£“9¶¿‚š‹œ“eΉË•ƒ sÆáò¸ôLŒ I æc\ Þ}%GI­ŽàÀÔh‚¿7ëÝãeå†Aý—.ÏÜðÂ;ù‰Sƒý¼+ó-Åã0X,œ¹·ôH™¹1è\á°ªÔ¨”"Cu©¥¾Ô ’ T—šê¶çdñ(œ`p@—yñâŧÚõü;ó?¯iàtùÖ ï¾`—-O‡Dzæ[Áw3x½Þ§W–iö{†–h=¼8~O(°Øß§C`ðMR¿Šc|ÕÿaÐ,sõå·uenƒhÑ$wË]ƒb·Yh$d* Jþe¨ØŸN€/—O' °'€wÅò0hPt4 D„ppð¾Ø4±VHÆ#”¥‡™;’±“Yice{oµŠ‡Ê<rß ,<¹±`q@ì¹ôE3:飡R—ùļ±lÁX*ñ$ÁÁ¼Hî0É­—Ä 6D¶$nTyO­þMsÝzÍ!  ‘–}­MûšÔ‡êŠ3%ñ$^Ç4"“ÉÀÂùŸ/Ì{s3 {ö¼ƒrYŠÏZÇSØTö?õ~³Ü£Ë éjX’…ï (R=³å!ƒÔ¯MR¯>÷R›<•àK …l”õÇü’…ÚÖÙZõÝZµ«ºm®º+’›ß•-D0!AÏØu¯ª#¤Ðz*5®š¶‡ÊÎye›K¡qWÕ‡ê;ÕtŽKO¤19¯H*Ol=ÂKz•s !í‹òê»§ëæ:gU­÷«g«›þË~¹5}eq< ¶ëLë£I~ä—wµÖEwµuuݺ«[|Œ]+’@" õQ‘G@H„WäIt]÷]wÿqwfu[PÛ¿º£]D$wBöF¶Õ²SgìÌîLÏœÉü2÷þî=sÏýïç´ŒñÊ'¥ªo›FU¨CªÖñꊈ¼îÓj9’õB1JÉÄMñçç•aÀ2é”D¨j˜‘têrÿ®ìä}‰*$o™>[ ˜ä¡D9%möÕ4úeM_Tȃòæ™ê¦ëäG6dÀd¥RWzCss(’@âx(ø•;?ï#ýÎþ—m.Ió“º0ÐQ¦ÓÙl˜§¤Ñ7,­ªzEÀÀµ° ÷,ÒÙµYqÏbm?NkÃé:R¸"f¥â×ÜØ¼×Õ²êÄÙ× Nàš­8ÝÅäfýª‚£,)£SYdxk®Q½¨Ý‚ë²â:MÉú¾$°ˆÉ‰ë(Ò‡3Ú—´˜qŠ´}‹[[|¯»®Ÿpß»…®›×°´Øs[à¼#´'œïù´È}Wè¹[êá¶ÿþç¥õ›öÆÓÒ| 0JFè$„*FfÀp”ÓÈ JF£þ0k+çØñZ‰lÀÓ?62†@6û«K©+W±h 0“½i ¯­¢ÌVwÜTÁsHJM5¥ÖZMVb• á›jÄVùÛûÉ1D}åÊ•ÿ|U~Ž4æ§é)Ū➴罇_ks{¹|ÃSñRÕê=+õÖ©Ç% “R€"jµ*TßüàTÍlMë}Y›ro.à–„’è"pà™ÉC•²ÈÊ™J¥OÑú/©òÞy™W¢þ°¦áÛ¦‘éZíC©"p¡"$«‰Ö49ñP%cL íd§Vi|²¶iÝƒÊ ŠúøeDÒþÅùzŸT3#i—(ƒÕêxeãTâaµòA¥b²J("ÕÜSh9·€n…D¥ÒhÆ,‰I5>–Øüæî;ù±ØcŸKÜ“ö tšf»i=‘€¥c«,<-wæÜ2ÝÂ4ÒÝ·¤Ãž¤ a_ÒÙªmq­h1§ ø¯¾¹ Ÿ-£­ÅõÉzÏR•§s&wØ’ÔÍl(%“SY 85[“±ªèäâ6KBýõ½¯v¹+ ‹»ÀÊvœÎ‘`’¶¨$µÛ“´žEº_¾¤qàzËm/oÙM'3@!‚©Èëëß»>ù*#(â…ýþÂÂ| ‚(2ÂåÛ¶/mïZÒéÆu¸1èz^êðàº=‰à8‡$!:[r‡ci»k‘F÷Êá_°W0J@=?Û v™F"³ÀKáX8þL Îô¼ƒ),˜H£`øõo•;¯•|x›ï¾%p.¤þe½#çhѯ?ã[þ²#G!1H0†¥¯ßþ7¡õïEž±|ÏÝ÷ís—\FÞÌý~6gË{bÛµ¢¾¡"×pqÿàŠóú‹¢‘’„ƒ5¹}7ìáI@H‰ó ¦b÷°ìèÚKz‡Eαb×ïÃϸ®®ã:˜#îŒòz‡ äºÝ…gÓwLco^Ó` (•„<`‰ £€L1 hx)dlçŽmÈÈÐ&€ÑÝy?)s©öTØ+˺«Df©ÀVË5V á[$B£ô§…¹d">ƒÊ„H¤«W¯ÆŸ‘uPÖ€”ÏçÙy67úì+Ϣˋ²gùä9 ïl,ò¸J S„@èà¾íïâÆM<ŸYàLbáM‚°¹ dLâ(ÀgJÏ2òã®÷ÿ¬,åoco",M'Q<2ÐA@‰k0”I&ÐÐå´eÙ›éþ¬Ë§Þל÷Zx¾¡Ï, DA}qP_1ÎöpâzA\/˽–ÓSö3ÓÖRŸ…´ä‡ ùq[QÜÆ ]Ç#AÌ"Ž˜Ä ©ÀZ6ÑÍeÐI *‹¡ÛӷɲUMûërTʼUžB§¬ÏV+sZês•ÊCŠ­™¯c0-†as5РƽXüú‚‘sgÎ2Hšö“΀êÑÍ´!íi$¡îcq[ÉŒ©$ÜS:kYŽf§¦:ó£Á´¥xÖ^Õ½×-~‹Ž‡”E¡@Ä•†G?¯VMIÔ* «9L‚‰L*“ÿITá—h¦eŠûRùtm“·Z |F–l¯ªíŸ꽪Ž{Ò&Ù¾¼ *€Ó60)µûLH5÷«êµª@Mã£þÍ~¹5u¦qü`Kµu:ã,Êå$9!7Pjµvµ-nu­vÖêŠk©V*\H‚\´Xr¿C¸ „„KnPºÎììÎì¥íº³V·."xٶV \s%Ùç—í¬“љݙ¾óLæðrÎÉ›÷}žÿÿ÷(f…Ú9¹aJ®Ÿ’h§…jPû¤iä;‰~¢JíQê¼ç5ÖãùIÄ­ñ€yX FÞ¼ÍÞòÓ±r¹W¬R(aÜbÃäð†ÿ‚Ö+®þF¬†ßè-ẄÕóŠZÀ§€²nF¤ýBVS²ë (: ¿´´xqÉÊ °x»·\tË¥ŒŒ'P…?ŽÇ6€? [:©‡j†è I}=–­ HJØ”+’G¥£1˜c̶˜ÚÎØFûŠgL0‰ é°!Í®5bCb™0¶¡ ©ë‹5:cÇSuµ‰é;ɉäø8Z }S:FNLÆR‘Êê•õ–çê­ÏKZžt•ª}UsolcïŠbê~ªÎŒóI› ©·¯hq &Äâ$— 1F•’OEIDì¥õ›o þàÀ· li3& ë¨T*‘ÄX¹>=¥H€˜;W`Á!ÍÀHÖ§ëH³íà®hûÐÒk¶ÇÖX‘×3"U2! ü2‘~™ú—/GÐ=×ðI#SðIF£àLd7¤Péà8ð¯}Çö3-n[»[œg«*m¯â™ª€Fð°Hò­b¾UñfÞ‰@p¤RÇ÷µë¿\þQÀx”7WSö}Q]n÷–Ö¶<ù( Ežo¾@žŸ_Èc±"IÂ(tõ‰]A³ lb-txz ¬@GAÈúÞ¬‰ç1ñ¹+gÞV4ÓÎ ·täNuð'Ê®8¶óäÞmY;_zûg/ggnÎÛ“¦ÎÙý‰”ußTî³¾<ã1çøºrBýÑÝ/t@#úc:Õa)Јä Z™U«ÊÒKI÷ìÈd’V¡Ö._¹âõû#bè ?”èJÎ¥’“é$J…ÊH"°_OÿÊXî)t7 ô”ÎY;Úzü­Ì…Þw'ÇÓÅŸoç…[Oͼ–âT ¶;5 ÝžJûö|¯²úBç©¢¹ùz”„1hôD´û]îd…fV®qK”ž”Þ*Õ”Xõ@¦+¹ð §èO%g~Ÿ“çW{„õ·ÊŸž>ûϲª¡2X© Ÿ×-Ó-Õxd…n¡R(2!×y¤ÕÁrõ“¦‘ù ¥¯R7-ªmÍáa$Êê ™@°à3÷&1€àw¶¼p«Bég…53•MRõ™z®R àt_¡wKu^‘fZª™kŸ|Bµ»R-Ýõó41‰L£6¦Heegýa´wÀã áÅùˆ®>Z˜?¢ÈÿïðûýpªÝÖ.¼5HBAÛ1”˜Jc ýsÆ¾ÕÆÕO·õ ëêÆ‹ÑÜye}Òb­ï‰ièD€C>Š1¬T5e¤¿H"ÅmAQ"5©Ð®–6¬%nD_Þý“â²gÙg&éÀá-ñ k¶¿ºªÁŠú‘¦^¤Ë£7=ÛØƒt¸Z˪ Ò܈4wǶ÷Ä• ã6lI§’ðbÏØö÷±!_È Ê ãù„R6¢9‘9èr>v˜ÇÚc4[èÉéŒÄäT F‡ɇ•Gû]Ñ"¶¡1ÚÖß Mæ¸Wv¥a(Ø! Káóù^/¬'¼ì#KžZÄÙ÷ˆ´f¸{1sYT2}i-–DÉ8ÀdÙ/³~=Æê,¶²ì×£¹¡í3¾ëîû¶ñ\×-…F'¬I%cYªîû w`ŒÓ?šÛ}M0p›i»™o¿Ãv}•?p›Ûu]Ð}5pó8`CßM®c híæ rûöÛ=c‚‡Ùޫ޶m´Àu‡Û÷vß]–ëÇ1¨PÜ03XèØ®öÚoðœ7€@àm‹j¢þÞÎO+{÷ ä¯å¤g¾A¢¯'’èäÄT1…˜´‘ŒÒ“Ö¦âa (ýE ³Š{¶KÏ´Hs,çø½ü6«³ªÐ*ᘅp‘]ÉI¦  oàP ‘Ôâ™ ²ˆ×h?’NKf±ÔŽ-åRØï ûÂÁ@ØëÏE?Lü¬~ÿBÄéÂðä¢qÉ좎ˆ”ñôÀˆ¤„?’7¡` ’*x|xyü0ûð}ÁÈR}a|5ÞÈ÷à3ÁðÒÅR@ãøñå¿þñÒ¥šÚº¼S,ðY0n@50ˆÍë?×°ç-œpûÉÅ6¦×$ð´ ‚&~4·ý_‹P÷·&ƒLb$’hÄu3³ ‡[‡dڃͽ,K ¡=ªÖQÊ©P½­=ôú[Œ: ¥Ç^½úY(ôŸ#ª\ÆÈÒÒR"‘H&“!+­øÄ›vA ÷ÝÙŽÇrÎßšÿC×yt+mM\Æh²ÝïLÊUs*ÉÜùf·X7-ÑOеӲêI‘fF¬ó)êÜT^Ë„F©”¬í;&uaIÍDyÕwRÍ}µhZ$w+Z¤û³A–1 emÝî–7>.Š˜,Wxåµ³ýTUdIb-\@LŠªç$u³"ÃŒH?'­ž•ÀÍÚ‰Ö'“»EJ¯¬yúý´Ì0)Öø$:PçÖL ußJªËví¦añ¯Q°?}#W<Êöî!¢Ïo@ã\¹‚ ¤Ù}N>¡ÓÝJæú±_çAMÝyÀŸ®e­îŒ &yyW^^¡ žUwëY§­[EDPÇcë‚áH©‚ ‘“„„p#÷Smgÿ莥íªVäÑŠv»Ûé¬VE @Gö÷’Õmÿ°Sgì´Óñ7¿ù dÞ¼÷MÞï÷ý~¾㙺ÇbðÄœyÞýtÕH¦Ô‘¦ù&E“¼e»›ƒÁ(ø 9uê”ÍfûÿéùÚ_ŽßÒpg¼Æú ‹m& æ»vv–Ò7ÑÀ(«œ]m€t ÏÔHQ-TÖä*ÓÕP!IÓmñü÷ \?˜ãÃg1^%@uy¨K^—ë&~Àž޼Õëù¬Å>¬‹Vp^=t*3Ag¬s”u@2P¾Êm„Êͳ L³ÏXçY ¢úßW,ˆ8ÜœÁDpØ!—.[Þv¹ dꉱ‰iW»CçõÉi:³ON»s»«08§&èF¨¼ªv‰†3yl¦“d¬ÚiÔóJLÏ«‘ßWÏ*6@%u¯EŸ€¹ˋ•KV ¸B ŸøƒîD8nw%CPA­­­çã$— 39Kþª¨µö„[®=;ÞÜmè}f6v Œ·j{„g{X(Ê#Xl&z ïoÇ-ý‘Uíñ¦Þ£–>ACGüùþs—ÀØqÄØ—hí ×èÌ'Œí1¦ŽhsŸ ¾'ÊÐ+:Û®9RÛ'n1v‹>¼Þx3ÎÔmè€ "›®Ó—™o{­ýàï˜Æa½ÒZnüü܉0ß=bºiè5ö&šºë[y†¥Wn‰HYN¼±Í‹·Œ…ûR\o>†óa`B.‚zòWQû’…ñÕŠXCzD剸yTµ$¾.KP)Ž®Ëê’‹„Ù`·½ógrº‚ƒ30j<ýæì.'ÐTpí¨'5kzbbü©xGè>Í9þd>eÀ” $´%€2?Ö¦OL¸ï<9AóõÑÃÁK-í­—[ÚÚÚ®\¹rñ—._j¹ÖÕ=2:æºÈAÈ¥ {ÿþºçjÛÅO>þÈbÈS˲³$±‘á‡ö†íܾme` —Cà(ÆCx|”D^<Ea/o‚½H?tif蚯*ŽÛ+#‡'ÊŽŒUÅ×Ä;ª£qfüÄ9Y]»…<ãã¬Ý›iƒŠT! mpŽr—J¦Î –)‚幡UHvV°bû›ïù²ùÞ$·Ï>k~’!¦Ÿ:ôà™$%%ÁƒœäÂóÿž¼Ë^-˜j<:VB?ôyã¼I ¯ó0Šb“kªíXê0°‡$g(] J?¨ï£r=ͱò±$Û–‘c: \Ê`ƒ–£DNP؃¥33ï;©Ö‘,uÊŠº“”;øË ã°²í;dè^”FÜa giŽÀ¿`ŽKtö4=C;&ÑØ$4E‹•à+Œ¥ÊǤWã%_žVÛåE#)²‘ ÕX> VßÏÐŽgæÿK–›¸ñ­OŠïej†¥j[†®35+áuÕߤå:Nç:…ÿ9>&ËùîdúŒ"ÿaŠ|X¦JËžÎÐMJrîÉõÉo½ã‹¢^Ì%).‚ sSäû€omrròE×ãW0\ùÓd0¢l¤hŠ Ë"ÀC¡„ +gW˜ }9TQëQôLÌ*ªJ¡bÜÂêÙyePUÍT s1û <¾§ ÊC_ië ãœâ(C¬ÞÀ÷b€gyÁ—¿xÁ¦­¯j æŠä5BÆWôUót•ó*Œ¥FH n{~ŽÞ5AUæ¹gæGD1}—R ~0ËŸAâ0‘W^1îþ"Ž!Ón‘¸öí´«uœšv 5U—Ép&ÉœçO¡‹x+_‘ifÕA¥ÏG0=ò­¾lnqì¿ä>ºÐ)rÿ…ƒnsݬ4JìcNW{k³ÛÁúæÚµÞ8FÁ,æ³õýc'MW¢šº†ëóõHCW¼ñ™U^xîv¸áV\mw¬µ óÄQ„@øaéU15Ǭ‚š.Z–뇫ÛD–Î8KGŒ©ÿƒÆ‹~[B¸Þ«6…†j£¬½ –;1çþ i茳~%4 Àš® -·E–î(CG¬éÚQsÈÐ-4õŠ,·bΚnÍ_&œ»k¾ˆ‚z~n„7õEšo L77ôFnˆÎßYÂë{cÌ@D] ¦Nà“¿dVn‰ò[¾G½}°Å<ÃØž+6®;QªÕˆc$1.ˆê2Á]—‘T!§ù$†¶ hp|dÄá°[­ÖAô¦?mf2؇Ï'IœÍÆ`˜€aŽn\·fhÈá}{wï :¸¯J!-ÌÏk¾^ûù§¾ho¡!Ñ~õÓÏ/µqµ­µ½¥¥¥¹¹ùG)- çdsóŸE^ ŠCqP‚‡ÁôÄÙ®‰rØ,.bl&£8I¢\ÁžÍ€ ÇÙ˜7û’ÆXH"°DÌF`º¨q0I‹P\Ø$lÏå$C°có<‘½>Ñq&ÜYi+‹²ÕÄÕŲû‹3ã'Îéê8Ùþ \çc_‰Ø&ÔîÌËÞ­ÒìΖ»4"Ý©ÈRæ†èT;Õ²àì ËÖsF‚ÌÖÙÙ199A—0W‹JÛRàÌÌž={( ãQ>”çÂ?r+–¾?Sm/>oœ÷j’â¶4ÂdÌß·zý”¬f8S:,Î:­zœª|,V„€ê?˜¦8y(É [€pÑ(ˆaEAûï—?TÍ,n;–µÛw™?ß'ñµ8v9Yó¢4â¦XDzhá€ðÜó‘X1˜¦“éF¥Z@‘Ñ Í°D=š©’|rL¼FÂWÜMV9%z[ºúk‰48p…tãÛ¶Ì\˜o3reéÒÂÑ4åhzøðÛSªG©¹“²RÛi ЋM®JSŠ §*ÀýH”CYšád¹S¢»Ÿž—²õ] õòäc‹88â¿»õí‘ÁA÷ûzÉßüp—NzLÏ€&‚Í‚)œ.óˆ·¿GZ*TZý—ýzjêJ~Qëªl§ Hnîû•„€(>VíP´­ª[EñÑÖZ…@J}" $<„„‡„Gxò*»£µ³³ÿlgv×.vAå¥ÕºÓ?vv[ª$<²_–µ;ÝwêL;éôÌ7wΜ{sïɹ÷œïw®Ì+±úUÔ=5A×X‘j;rÉæWÕ–@Ì ôt°Œa¸(Ï„Ø>@*ë˜?76!Wƒ”ñË0iˆˆÄä‚À.G*+ˇHYý¿nã ë"ç§ŸW[TÛæ]´#•­H­ ¹hCÌö9—jü)ˆ°U”#IRÂòáèNlëN°vÁ£5Î~¥­[óþ("ÉÙÞÕsÒü»)&FXÃ3<0>Š˜ãÇNX´ÊæÌKžÆ¢S6dª[²2OÔæDFofx ù;+óW¯lˆ$†(*´Œá9œÂ) N-£h¨p$`€–+¤{P4KfhР„çÀŠåIHÀCÚC»L.ìžxÚ¤›ô¹κ¯ýñ$7€ç в$90 á)³Gš¤x‚a1J Y)ÍI-$#ûW… X–—R OSŒ/ £ϳÜjñâP<'ƒ¨€5kÍî•—ÏîžjO›hN™lÔø4Ò˜8R«<|ôqŽa,ÛèÎ0ËØd< §õÃi…c9µ†Áì‚ù†ñì’¯Òò€"pñD–q\g‚úß3óOE½‚áKe4ÎsÎìØôÚÈø˜ÇûïmÝì+›}w°Ò~ÝòSùq”oÌJ¨Îx­-­RABQbÅ!"YëŸSàWÞ‚”6ûÕØÿFæ\r"Äl[XnCÊÛü.Tþò`( Û4ìÕ-HiRgõ/®œ[÷빩z†“,‘ã˃Q $¤btÅ&?mRßä_l]¼ã€„g—á¶þ¬° ©´"UíÏU6Ì©nE*Û çœò6¤ªÊÿì*,JŽRXÊ)”cŰ|}ûÖj³ù£O:½“Óð—úúmVÛ»‡“b\D¡Á!TŽ1$·D¶zAºvaE3Üp~€ÄòÌ©v.Í/FQ.„Åø RÐUוñ'£:;M¾1Y<£põÌŒ{¼!RY¨À¡AAG¶'%Y?Vwøð níQwô)]=Im=OËΑÖÎã®{ [ÿ;ºL& \ÉN2ÿöœýzJ[gŠí–Æ> °ĵ}ªpÞ\¿W-AI)E¯{ýð馕Ö Ê/ÞLÙ™¨Kª¸’ìPwÜoºžlïQºîvÜVtÜKpÝQ9z“àøÇ×™þDÇ$×ÝD×íøöžDGœ¨m7¿oh\Àžîø¶.~ì= ¶^% ËuûŒãfrû-…µ7ÎñÙ‘ö;ÇÚ{“;úÕm»ÎâÒ0†"ŽÛvloJ£.¡)Ce1$[²õi*kV|}FR­î@ª"ˆAy‚†+) ãBƲ4Ø#àíEIhh!>4‘ÃEršð¥ ÔAø~B3&†Sr &† ÂXBNcàL†ÂƒQtêéón ¾Ž™ñ™ÉÑ?_û ®àCy‹ Ä,ŽÃÓ}¶¡YÀG±Vi0¤/ÀI \ا 8´À·-d(-#ƒ£B™½Q+c¢VœÛ¿±èÈvgÒþm„9Õk9ím֌Ծ;n‰›hˆóÔ+Ü šÑº$OcЧ6~Æ|ôgÆ·¦÷ö®“ʤ¡AÊ !û ®8¦ÔcÊCÉ.0Å”˜Þ0÷L‡Lgv¤rb˜C´qcÔ,Ef¦½ÓžéÙuâ}’ÙRZV&G)' ÂÙírÂcM±ÄNÕÖ~NYTSͪ’}/°Î r‚ŠX>¤-Öú²³'§’þHº<ð(»èA–òþ—ùÅWϦ­£ig0®%ÂI § ú¤_¤Xë‘ÄdÃO†² ß•Fåçøî .AýaŽ~$§`D ö(y¤3ŽfäéK¾ÌÌÉ+Ì(rŒdêò†2ŒÃú’AmPdò¼a\Wôyᅌ͛ÃAþ,ƒ24'¦lÙ9>4 ™òþg!ý:aýT~|eúß¥©Y ÏÈ(LQá‹R4 ê[‘ªŽ§fçʦymsËÚ‘šÖùU.¿²ÄìðÏ- zñe˜Ý˜ Y N}®ÌîWkó׿R¡k`Ý¦Ñ ""ré·ø²_/@MÜyÀ#Š:w½9És³›Ý<ª¢Wí€ÏVÔA­U‹òÊ;”„y‘—žæ $!Á«½Îx3w×ÎÕêY=AÄÚÞÌÙ»³7UÞwrĹv:ÃLi§3þç?›ì&“ÿfwÿïçOè(LÞŸQgYØìX”Ɇ諘ьåû34YÞ‹TYÑ`Â5›pMíK\¸'®½gi«™P ¡nØÅÛ€µ*…„§Œ€hkÈØZ*“F‚`& Ê™F¤$@Œ5da!qǹ:²­é¥&'×h}a\l#mMg`J,‘†:’“f&˜›ß¾…vŸÏ¹Á!o(\z¶ä†`ú*êËÉE¶Û‚î^ÏÃ\ë€Ð>"^ôûÛÐ|é,v rí7yŽa®ëÓ“^Ë.@iX,i^±7ïH]•´—ôjªØôgk€ýîgWˆ¬±dj4„åè‚ÎÁ“ŽóG bwó7Gê¯fÚ‡ùö!a׈È1‹ Žý~®}ˆã|ÀsÞçÚ„ÎA¡µWÐÙ'r ðºï ]÷¹¶»"×ýZ#p®a¾ktpb óììÎ;*×Uurå˜D9­ÐY¥‘iCç´@&“*ý¨\7^^ªªõ”©ÜšÑJ€ÐXµÆ]©ùBváôÎ]1Ä(:Dc2XÀØ»¶îôOy`Qœµû·BjnšÛþÜ~2-ø ÌæìJ!î0]ŠGã&˜¨é>–Áæ,­oŸ/6Û4w/m²ã.Hpu.\«+¢ÉŒÓ7G¿yè×láÍ…Hãû‘*#qÓ:&²VÂØªM¸³òÅmïAyg({Ó—Õi‹%x~IÄ…šHaáK¹EKõ‘zË¢Ö\ƒ}ñE'î’eA£iIS'Îpר½Po[hèŠh©[šÅY޽GŽ¡€Ò/T*¥ (FЉEãQ:¶á5+е„£ìE5šˆF î¢5²Å¹DoÅ5Ùp-ÎÕ¥°ˆ€Äc }h¤8*rýæíÐìu ~Ó!Áàó]° …=n¿ÿŸ¿B©4°®C©Tœc›”gï+qôŠÌŸtö‰]wÙ¶;Û]vW¿ÀñƒkÀƒïèÏïTëªÙûÅÝ…®{¢ËŸ2ñŸæ_~ˆ’×u‡Ýù÷üž{ÇÏê f¢2´í™oˆ:JsM%|“²ÀXÁ³Jr-傉È"dëR’À¡A€Ò’÷‰«Š,)¶Ý(îº-rÜôØúA=Œ[`º&ºôAFó­Êö ¹5µ¤1)Oº…+ÝΕíÈ9›–[ÌZ·™Š`d" <áà|ev‡fÙzoݸ! :ÆŠ‡£%Ùû|íù^³hÒÀ›2ò§ŒBŸõä„A0Ó.ž0æM›9^«ÀmâxÍì°Uà7±=­ÙÓÖ¢§-ü1ƒÀc)t·‹Ü&žÛÀž¹”çëÈô¶gyŒ¼@ûI·¡`Ò(œ¶ð<ݼ€™ãoq)tZ„~#ßgæyŒœß±?i' D2Ä„1dËêdíÛREºLuà¼æ J¾¿FyH'߯GGªr_ÏZ¯Ed<1†Éèí½å >ƒˆ6ï×:÷Æï÷?? ×êÔd29ŽÏD(%on5 š^øúxL¹a«hÔ(´sRWÃ$ŠÅãɉtìAIù˜J 0^1 €)‰hdD¢ž¨ÐKµîsÒ™2Ùc¥~°\ý!çÌUQñyEÿR5ý·Rç•égJk<íXyÍ„L÷}iÐh²Z4(ŒôD¢šÔ6|Q¥¼W¡»Ê/jN{ûCAÑ„²|:S­{Z¥|"—{«ôÿ)oeä޼ŒGR7n¤l U6L®~*‘MUiGË5#ÒÚÉJ¿úø§#•ª'eò€\?U¦ J&JÕ“Š:p|â¬bZvþ‘Z(Áa‚¸¡ÀûRöº½Þi¯TPИ«£¹úúNý¬‘Ÿ\óßÉ\ó{} ^?þèÚ†¸xŠŽc@ht4ÌÚð+¾tÆ5týý:jêÊ~%à‚GD!$ャÃRgTÚŽ¶u™ZµU÷j! ĵU¡„HBØ‚f%ì{¢cÏ´óe>h;:£¸¢NÏ©sÚ;( a™Óã™ãÎÑÓã=îyy/¼¼÷îûßÿï­;^çZ À›ÁšüSµ¶j'ÀÛãtv€Ÿõþ䜅ÄB“,mFù1€ûúO÷½ Èå J:…ž»_´  LѺ€Ù 80Úá4€õ& ³LÕxá9Þý ~ 5%h4³vîJ¢±#ó3 è(FI£Á5/BLKž›š’’Ìf'änL’”½cŠ9pwŒ:Ä .BS Ðx&«zæÛ³X,”FeÏ!VUÊÂ#ágXd |’Ï·£Æ …LJCáí»öÒÉ!R,kåæî ¼Ö…îëBÏ-~ûí÷å£þNžýZÞéï^Tóý?p¼ž«ŸµßÜëø¾ å äÁö*Wöò1zä~S1" Ã’²–w]º;³/EÐ$È¿¼Ï•ùλ¿ü—Àñ =ýwFÁÔm"¹ åÆ'–sé«vÂÊ 7a³–ää–4‰\Wa¹çzDgîpÝË„uos«·Õ·‹üWøþk‚–›…þn¾çÕR†°¥‡çï‚!h¹íÁõö@#qýw9Þë<ß5aà×q‰ïºRÔ9Tཻ,‡‡‘ç§§ TqË]ÇñBo9ßR%jþj¤À):$xY¡U–[¼EFT#¡}Áî£5‡]ßÎÜþ$ð½m?r[osZz`Ÿ@¯›ãï⺠|¼¶;yîëùޛ¶[|ÿu(¥"ÿU…þžb×e±ëÜüe›z&ƒÊHE±ðø 92Ž®F/œ?OÆÐDó‰oTæ“L…ù…¯Xõ}¹ì±"R£‡¤ P#Á Üî“U$U=ËÉ•?É”ý•uAÉË×ÔΓòÚG²HçGÓ©l$93y¶|ÛÖïªU*BÕu%Ša©Ö³C°š›Ff%%²Q¥¢O –*Fäu½•Š™:X)Ò*­í•Õ=¬ª,©‘5ö‰•}  {äê%¼©p¹ê¾XQöÁiÄDH”™NÅÐܵôõ†ÆB‘Y3’&Ï&Ò¨CžÖkŠüÿ´ÈX‡žvwv-Èz“œB¢¡‘¤†}bþá_©@aÐ>]s–pÊ4Ž):Aï'AçŽÕ{ "">iòhá!P{€Ñ5«A;;si6‰F¤ÌŒßv4Öè;€g3Ù§UŸJ£gÓ)ñ)É)o­Ž­2ü 0Ú@“~Ê)hýÀØ ,޽}–ʯòð6 ¶ ŽÈO\ É / ¾Î4óXMü§‡¦­ÏCÞ]øÞÚ«7MÛ͉?Q9£ÑàÏáŽÉªc卉n 2Ç4»€®ÏÎÔ[vlƒOŠ"‚ŠŒÌàÀ ô\U=w{T ÑMŸÑðø×g¾Ì@èD‰Ža9s¿ñ+ŽïÎ˪ÚÅž‹{u_/?¢{‹£\s çá9èØqê,2&†Íe,,°^ÜsæX@s)jVÆÉ^Ãûãõ}-WWì9ÁJIƒ¥P)d4ƒB¡SWn?XâýVä>_àíØÓþOꢥo’æ¡dfN…™ç½x¤ý×}‡ï»•ç”ì–.HžçŠ(ÐYäíæ¹»^µR Dž+‡}7!Nö·öð}—ŠÝÜ2]ïˆAãˆ3ºbá¶Éá‡Ö t®¨áQgŒÁ‰ÑEÐzãÔ>€{gèqÂûkèIôt*š°ggŒV«o‰·T𤬵)‹&™ÓÊ*cͧc –éÊÚÙjsœ&ôm@kÕ»b´PA=.€ûŸ!Ä9Sí‰S»€ÖýHh²NÕ4M=©™jÀãôxŒ®9Fg%蜱:_Œ¢È7YLÁ ¶ ؼ„z;hj:|Uõ¬¬EQ0htƒNŸR$B?çÎèhdáÍ h'À‰‰ÿ°_çAMžiÀ£b×vw§£9¾|_nB”«žkÕÕNÅ vue­Ö«‚$$!€ZL I¹Àp‡#9AéìîÌδÝîÌÎÎîj[@.µíÚ=f«ˆÊ‘p“}»lg:N‡ù«¾óLæÉûe¾7ïw¼ÏïÚÿó=dÁ㣘±‰iyùž[®çW ??ßÖå¸uÞùY®»3ßw krùu…M\O¡³K³½Yõ¿álÝÃ&cQtÖ›WRm,hëLØ~p'`IÂ÷ÏÈj™[ö®Ç6"?K9©ÿà”¾í`®út¡eFÓ"Âј=<{¯ãë4Ïsξ™Î¡`ë~z˜Ê¼[¨šTV JäOõÄÊ ±vP¡ (ŒS2ÝÐeé˜B;\¬™V™ÆÄ@MLslÓ&6‚Pñd&Úêr¹ç)²xG¾¿h?è6_dïÜá°£)(%˜¹žÊŽ#'Ä™pMŽÕ .\WeÁ…ð¨XbÇ™l’QÌΰ*×+& Ñh}9çbDü.$‚ÁÀð/KÇ™¼8“…°ïWQØ2…¾‹Z#‘€[À3agß ß¼ë•<)®¾ €«s¯ºýN\³Woó„K€0hMkèä`!ø'æVøW¡¸æ^Yå]Uí[Yí„àLnàÓÊÚ¶¥j&µRß°¢Á‰«p¯®j_Sc^ä8@ÇHP?“’Ceez&8¿¼ÍÍ·…+·ð-ÈZu¹Žà©,t#™Adn9>6pÝK®zÏŠ oŸÐ×/p÷Š|BODNÇp~RôVX”9d<…Áˆß»‡¢(6=ì¹–„׿ÊuÜÜ™ô.“°åЩ´–O2Œ®”‹ZaÝÇ—ÚzâR²(‹ƒ12MÇv'Ÿ.híÊm»Çmôe;þœéìÌn £‹nÜã·õ Ú{øž®åÖHž¯“çì;þ7‘·—ïëçù×> ³â˜DŒI¥h„´bQv£4ÃR ´ [d¹V9hDd+lò MJ2HEI ‘„Ä£ùΛ<Ï¡§œó…FžoLYDÍÂñ&Á{š2&yöóÃf~°Elà-¢©š³~37`=ë<ÆÓ{©ÔH&-ŠƒDÙÒˆþXyYЦøÄUþ~Þt{1†AŒP0 ¹|ùòÔÔÔÜÿÚ÷–¶éÙÙ™éÙOÿr“†¢:‹E£)O¾9cÏ[ê|gš2a"€«)s末àOšs;hkéT›B"#mé9êkþ"娼|F¢’–[#£2ã“bM@YñTR6\¤»ªš–ëG‹”ƒŠ2¿\e•†#ï2Háá üó·çr¾*Ñÿ³D;¢©zxU5.Õd†A©îR÷»‹E)ô •þ«HTþ.UÚÒyÛè”êTî}…î±LûX¥ýFY6*×ÍHô#ÊÊ2 p+¨2®ª†•Ú§%š Äð¥Êt$6£‘€‹1 £‹òrüÁÉ…•3çéù†îEû!·…g`áªíàƒ‡Io@2Á¤E„#L””xW[‹«ö„]?®q„4Rë’úØWü(D¨ì¶µµÍüü5›£ˆØºü°:Ûº£ið‹‰!öO²rpuvpEX„‰Fa /‰UaÍ83hÇ…«râ| 5•–—«a ÉZ –¬‘*ç «kE¥W{=¬Á÷ê¥K4„M§±€"p5þðûO‚ßÚf-¬u‹+ÞâFìÑ£G;6$Ð)$ £’9sÕY7n íüŽç¨¾§—çº *Èp÷¤·v ¼} ‘4}}˾#©"J¢`‘:¬Ô]ïðs=]'¼_óÚ¿à™<¤øm‘„ƒQ_Ýþ6Oç(ðvfú¾Ø>}ý¸B¦€Fà^ ¤&ƒµuGÒÛÜÂLûÇÂ_÷ƒyÒÛ?Ooïâ¶÷r½ý|ß½t{·Ðq;ÏÓ¿ÜÉñtƒ»ž˜/†³ýusò:!œƒÑÉdBÌÞÍ—šUÜÆ«B§"Ó&˲Hù-Rа$Û!»`‘ñ­²ìF‰AcƒF6ì>pÅu‹ëÈôݸoo^häùÆŒE8Ý"˜jæC2gA@_'š.Œ7fÁ!}ê˜9mÖžt¾?j~fõ×݇bxb$”06/™/=*$žûEì¡X‡g1#iôH,†ÅA‰™L2t‹/ãw“g´ÐÑ‘ÇOa»ÐX‰,x#æiCÎRç;Þ,šlâÎZA_Y£µ©3ž‹ê;©"¸ý11ÿV˜ž«‚%å#’ò'Rãrkd¸X7&¯)Õ+ts ÃØÅx±òA‰¾>.ÑÝãCC‘hû{"¿Ô8#5NJ´`•b¥¿Ô8!­WŒÊ4c2£_V5(Ö•ªŸ¨Uc*íP‘ò£ì+ƒêÚñ’Ê€D;¦Ò#UûK Ó%†€X?R=Ƈ…²i™_]ñPªù‡X•÷Úد÷¨¦î;àW¢³í¬‚ǽ7÷æ V¬Õ‚Ym©U&V;»Ú2ä‘„$P䕈 $€Hò"︵gÿm;ÝÐõt¾@ª³ëv¶ÓÍHxšýB¬óŸ¶‡sô/ùï¹çæwîɽ¿ïÍïûý„E&ƒ­‡"äâò²™`ægŸ~;¡sP?C…ti¼Èü BÇGsóS>¿wtìÀþ4‰…1(Lx5 “b6§Fž×…i/FžT°AÀ$$€"Áa*[„ÚuYƒó*g¸Æ)Ì‘ZëªöΗ«ê_-*‹R(¢ …(†1èÑH qÕÁLHk„ ½+$ tbb•üFô"ƒo‡p(ã•êÆ• ¤uƒ¯ŠT˜—×ä@ O˜Òº\a‹RÚ£Tî°7ÔẠÁÐè!ÒtC¤6ƒX´FT6Hk†Tf¨Ã¦é¶§Ä¯#¡ œ‚ œ<6è)þÉ ãŸ6<ø/ötÁ|yyùkF"(±cÇûE½W Ã×íÏÀ³êÎ÷ ßu“ëìç{yî› SÁ¼3«ã–Ìérºœ¿jŠß¦ÇrG QùÕý:ù\eý©Ü+j{Þ—´QÜ5LÖ4ÍJd>±Ì{®íRÙ¬´e²âì¿Î6ÿ–SF&’¶¬§ùEí3"¹·òìÃJ)¸~R*“¶ŒV6ÍžiñŠëü’&ŹùªÆ@MóÄ1¸À[w~¦^3Q&›«hžµŒ‰Gëä£âÆ ±Äl•Ü/‘?ll½W+óŠZ/—T¾GG T<†„cÔ’ÊŠià ó3¡š øñtE]/ø˜þŽ£¡]Ôé£ÉÁ½‡Ð82†¡  Œ1Âë)´R;–«ìHm]hÜÖ`¨¬á •wXÃ5.Hi…4î…jï†tæpKT-‹Lz‹ôÊJ&1&:õ`¸Ú)Pë$9•ÂbP×ESqZ4‚1ië (¶æµm/e –·é!å‚ytHïW»—©]ËÔp/He‚”æà xŒç …e¥Ò ˆ¡r.S:!…R¹ uÏ¢5Òa”&Ha…ôÖU e±08ŽLظ!ñ›¯ÿBûu̇µ’Ð$}}}0 3a2¨ `¯®íÌöÜ(´ óÜ·³íמUw.pô ]7…=C½C|ÏMž³Ÿg»Î5_Éé½›o½~Ò1ȶ òL_¦ðDxRÊöÔÙ=7=C”k’öd ›öœÐý¡Äô§­GØ (X%yOúIÏ𱞲7’ް (C)¯ïýè¿–ò³ÃþÂ3~ž.qîþä3å£ätaÆéöã‹œ×Øž¡Ìžç®‘<ÛH¡ë&ßq­øÓ;Çe.Jü™M^ûö‡ûÊmÍ9]›4W[)0×òô’Ün‰ÐXÃÓ?ÖHž©&ß Ý¶P%%Å)l¹“ç渿âØxž[KyÆÑs‡‘?Ó-áï.œ4Lé²fÍüqCÑ„åÌ}ñ¤±pƘÿ¨;ïû¾§å“}T˜€“„ :;Åâ°5ê:%Á0LŽ‹gªÕJ¯×X°G¨|ý?ë ã+ßÂK›žcRé$ŒN£Ò?~“â7/v½&ÞŒ.^ÏË™3ä<ê:î·• ~N'¯¥b Š%Ó™w*îIê½ÒæÉš Ï[#Þjù˜D6*n˜®•UÔ{ÚûJ«[2Žý»¼<À}i«ôý£ëNg¥oy¨ˆÂ×xááYÙƒ*鏸ÜqÓ¸´mBBæ«kÒðIå£åuSÒÖû¢Æok[¾­8믚Ê+wi«möÖÈÇDMS5Íÿ5ü§ºÞ_Ýâ«UþîdÅ.:ˆ§Ä’qZ&ªL?ZØ wÌ4Î~׆–Æ‹<æ'µÔçó…Nf§gÓ3¥§Ë(0þŠâ•JE˜[ÃkDrãJ¥=H@µ  À…ÒØ¢±¨,W9¡ &¨Ãì懲Q*31#—JÙHã½²ö°.gD»!êi$˜Ê3 3Vs¹á§*™)éDœBù§«“ßZ]Ó u؃æéèò£ ÈÇìi€vº¡N¤^‰Â<ªíA™€›ä)aJ÷¢5¢5CÏò6ÇK²˜Ä$м(Dð8¨¼IÊ €ÇãÀ‘…BÚJ¡ypÌÌÌD'Å(¬Í‡Ç—…½_å®ñ{†…ŽgÖA仆¸®Á\çp"pß*tuÝôŽZäYŠ.ŽÙþ|Òr9¯ërŽã:¯÷öNN-™ˆ1`Þ¸÷]nÍÆ¿¤Ö±xó;ðÍWy¾á;®6íÀÉd˜JÏnpñ»¯ œW9½ƒÝï“ög®%%P°x¦ÁD,–@KÜ}èPYkñoú{úŸ·Fò-Cü‹wÛ®—:.ÅïHʼnp(ñœ±s§©”ÓUÍ·Öå›D\mU±½g¬èÅ£$¤‘\SMž¶&-ë0x¡,8–L&§òkŽA®s¤1ß5°¤‘g>-gJŸâ3 G»x^`ÊR:a’Øxi[È ±aGwÑ?è© ´ÿýrj*½øå¡e·nÝQ„$7777OŠ«nwguÝnëÊÚQ׺u¬®/ˆ@Þyè. !! o „< /ò m¶Óç´ì–UVÅgÛÝéZ_˜„@B·_¤KÎê”íL;œ9ó%óÍýžç;çüÎÞ'M¢ÏßJƒ“™…N%Â(Ê@™0%p•JÙ²%»¿ßãóùbµÀtì†gøã¿U O1KNGg†>Ä„„PA[ôΪ‰nÑ|ë3q'»DÓæ¢) 7¨;„[ŠzßV¸c 6LBa¹iÇîÏµŠ¸Ÿ7ŒW5M*Õc•ªIYC°ºå\±tK*…öò²Þýœ±ZµÿDzç&#Ô÷Ö® «4ä1œx «Ô6‡T­Šú±ºöß);+þȼ}ïǼâ¯duwëÕ·kšîU7†Tmþº–¿W©nKk|Ê–1iý¤² “7ŒWÖ>hl¹§jöËZ/8¶ÖÃD ƒÅ$ €÷4ݺ‰é0°pàãÑȬ½…ÒAãÓM¶ ÿ÷^ìâ_§×X;¼5ŒÏDJŽ–‰©™KM!°ii(ª< €d±@/¤w©<ð€¾/©Ñþ­ ŽxMo|»=AçNjwhIÒÙôPaq’ª}±n:eN[—L Ñ3ÄÌ%û nÔuæ¥V-Š~—¼ä%:í墊„NÀŒ[­/tØ!£wÑ)oü)WŒ=Ÿè,qZk‚Æ–xÊë8¤±Æizâ;­ñZKL5ÆyÓHGÔî‰×övqH &™ âòƒõÆýâæÜ$455Ço¡Ph¶8”ÇãA„FWDÀ˜ksôgA²+² ç÷=#¥öÑg•…}×A&Íï»z¸ïj¾÷:¨s”çå{>)éû”×sŽ{ú˽Λ|ï5¡{¸ÀqµÌ1|Ø}KâÚ~ 7%’‰ Êf!)LDh黎ªÁpљ뻎7ƒ˜Ÿ “Øk_/3–ôÿ…ëâœgoã¤!X!… /OGV¬&'¯„SáTÒ öë(LÇà󦑢ÞK9î¿æ Üzí@Še 0J £TG&)1ÕðÌr­Zl©*2W‰M2¾Iε)MU"S¥¸[ʵ+…¶ºÜ‚¦‘“™¶n'WÔ{‘ë‘x¯ðhä™+@‘°YüPÏ»ªxÿ“²Í—•»}æâò=?ÌLMÆhËL€¼Ùé„ÁÚ܈剓üR–—NIa’Èl /öí×6—IJáø™oìaìJ#ÑÖQ3øT8¯ð¯!d¶}K¾Q@MF;õ Sità-¹ÙQ“p¾‡õ› ÂÖÒI HÔ& DM…Qã¯êHFêR:+“Af2–/-—NTÖùÿ ñW5å `¹€\}³Q›ÍZ<¾p󦻲¦PUóÏA˜¢±•4ôJ©ôau[øDóDeã}UÓƒÊÚHEÓ²ú½«™:–™’ªÿIÎ…:x¢)\Ù4)m Jë•Ê©ºÖ±ŠÚ¢u¬u¢Î'k¼¯h¼«¬‰V6€žî}_EIt˜Ì¤¦Hô,"ÅívA6^pNÌÄÒÌ\Dµ¾€" òT‰„§€Ãêµ: (F£P©d ¨1S¸y‹5H玩Ög°%´›Oºâ4}¶?¾³?©ÝûB»;ñT ‡ÄV+€„ÄN;Ôæ€ g Sor¡„Æ`“™dŒÈDÞÝ‘tÒ ºXçH8^Aƒ1*Bc-C“j?>cmd°ÅP$†%öøŽHçŒkí…̉jÛ¼©£ÓÐì<±Ó×˜Ê é- ÚžEmg ­ëE•Á°t”t„ù»³O» àV‘)ð;æó¿ùÆ›t2Ê Â4"å]^Ïù§|ç Ð3œï¼.ôÜXÅžË<÷ÈaÇå<×5®ç&×u™ë¼ q?ïlöÀu_x/ ÜŸîkq½µ¿ˆ¹f#аRWn\ÏùPâ9W`?_îzûÇ… t0©Äõ±Ä~>Ïñ×ñgž®ÿ;l%³aú÷%úbÛP¾ö×oì.bXkRà´5Ù…®+üÓ_䨝ìà}eûÁw„Uù¶ó¥¶?ð½7„î›±ƒ»GùîK<×E¡÷ßþY™ó3nß À?`càø ³ û®ðÃç0×y^4p™ëº(òŽ\ùö¡#ÞkûˆÐö9ß{Bg! aÀtl3çGsõ¼”ÆbQQl9…LA¹¦ß䀵z‡D½7þWh$`É[ó"Æœˆ© hOš‹qs!ÞÅtŠtåF»ó¦Mܰ!?bD­…AïIóà]qs>˜$dŒF^ ºó‚–â iÀV‚wøÍ<Ü\Жá=GÆ»8Q;Òœ7iÈ›1IB†ØÿqÛ¡‰nnä†ô¢€åØC“8jáD¼@×Q¿õèh½è®IüÞ¦5lÂR C04¥të†Õl„f KQ:‚2YÄÂoE»“F¢¨U<ÑÅŠ[%Q3?Ü]pÇ”Ï^öíWP #’Ò²²p|"2«‘@Κ-šðGùëq™KgCøb®|˜û>F/ ¸áÓÛv½¼%£i„%¿ªÉ ÄÏŒÊtá–W©L” # uÛ÷6ú x¹rLÖ<^Ýz¿ºåžJ¨nŽo˜”ÖßQÖÌ—:îÈêÆÍ~i½_Þø@Ùt[Vë“5„eÍ3Õõ·• !E;ÀÀ$aY‹4{+ f¤¡AY[ä£@(™¸‚Æ`(¹oo ÊÔþr%.¯ T•ß“WâªÖKeŠ BÊ26#k9éâÊ´-"mòUÕŽÂQ¨gäÍ«®»]Õ0£ÔW´Œ¯’7MÈT3'¿T©q²¨•ˆ¤¡,JG`²×뚊Ép8‚ðŒOxkL©¯ÖjÂZ””„( äƒ?”ŒkmÇ) VÛzE7¤èÚÐbÆXÒešº7É?é°bWi®XE@W!e¤3ãœÂúZpE/NmØø³£0BC¨:B㤜 †ß]¥ ßêÓPWæÐ¦mÛ{D¨ü°ß)ì㛇@" l¹}ãBÓè’^gf¯‹g6“ôM¬,¼Ð.6;y¦1®ÅÅ pŒ‰LŸåÿXhúCa÷'ù¶ÏA¶J&stb8Å 1b)¯'sòkúTÜû@`uG’ˆ,-éø™,ýgÙº.š%†£wí‹·n‰Š9Ýhâèïö³w'(0{4ýêÁ÷ÎÄ$þ*ñbïæ@†i(Í6!ìÿKªqDÐ÷€kä[ÆÁ™ÅL)æa°éÅæÛï¦[>9F¹ÆA‘m,gà^šaosÏHšûѸýT:…Lz;qO~çê(ú›G1¨Ì(r$Žœ(læ8FÅöQ!ÛD#þQH#ZTq<ªt·!÷qOÁÃ.ñ7z±·;N—ã1äyôÙ„{@#¨yÏ;Ïœ&k^›ýD#ÇÏë$nM†_/ðë3Bªôž;Ó–Ò‰Ü:®_ó_ÍŸëâ.ªÅ>uzÀÀŸÓ –Å’7Û)ðéxÀ0 êô ZäéWä,i.Lë²ÊŽïLbRߤP9G÷ÒQâv%Јèx‰Àdl‘]NžÒ”è2’XT&Â@wn§Î‚ah„n6Ú ^ ~1“tpHftÂKÙQd¡¢*ÕåªXôcÞ‰ö_W,¯‚—ÕÂrûvËÊ/vä²FBÏX% .¿ÙB®;C1,”BCP”vÙüUwñbgꥑ…îì?7ˆãh2ňaH6^æR™t¾KðÙ Ù¿*뿾^ ‚ÞWZ÷uÕÕjÄ]Õè)—û9®J_«vW4¸«åJ¤ž’šGåu€:_VzªeÓ  P>ŠBü4ﺷ¬îË+•E§~CgÁ0Œ’ñâ#Éj@k塊VgAÕñ„Ý„‘¾ÿí¿–5-”5/M—ÔÌßøGYÕB©Ì_ÕüÏâZ_YÉtE½¯HúeM“ô½“;##a"E˜T<¼ƒ=4x{…"XÍŸy Ïrñe{Ù¾o[ ù½XàŽ9ãbÙT%šDcÒP*™†O<öj[ûº&àèk:»! …Ré =Ôn€° ·AJ;&¥ÃC«×i}­ZN¸,$oß.“Aò¨ó#H£¡$‹ú)J§Òf,T\‚S÷o”™Öf^!¾}fÓá”0AÖ&iÓš¶®ðö^Ha ¯é€:´aJãj5²¾Íø ¯Ý°¼j]wÓ µš¡Ý–‚«1dv4•cã LÝõ<¿0^ÿS¨|15ÏfÓa|a‘Èô$IC^ßøEÓ˜¨wBhº# 0;…g¦uDd¾#2 fÙîf;Æ„Öa¾e;æk»®Dÿ½4ëýTÛƒ´ÞܾûܾIôéÖ‰‹ÝN¡ý~®åö®”4<‘Ä&¼NcÆ'§JÎ43znã\‹¡P2|”_Pàÿ gäÒ‡ËéuÆ>¾°…‚¢ç¤ËdžúcLdS"h[7ƒÇE!3@)"!noZ½¹Àr;Uæà4X²Œ·Ò­ãYVÀçJ¬Œ‰l#’^ß<̳ÜÉpñŒ bNIß(šg`Bhø=;áÌB„J‚áíQ‚æ¢<]éj5r2ï“̤“É 9þÈ9¡}XlBþ±hd¦»`V- ™sARÏ·s:Ñ‚–¿¤æzµ™Óíü`O>Ø 42«â¸Ui¡žçŸJ-é³µ"_{ª·ãò‚Ž·Ø#ôh¹!EšW—í7ä~RzI™yªæìþG ®·ëRH3ß!šéÊtwg.ôˆ=íi!Cî¼6w¦+ç‰>Ç-KB]éÞÖ³må)‡ß@að†ˆ##2^)II:ŸAbÒ™H m“[_2þfIõþ”FdÄ ÔÈ¡êó=&(ŸV0ßÉójøà¾ü]|pKjþ» Ú¨¬ÀùEWË0B,-þaßMÿ»º²eE#‹ÏDaè?Y=þ…÷Oÿ’Ç#(L§l¹zl¯G—Ò]ø¡42«{õYÕçÉ0•Ea±(Œ¤¸]¯¨~|­r±B6_Rû¸ªáqyûš4P.¾ZÌ•ËfJëÀ‚¿B¾XÞ(­›+ª™+»á-ª –·|SÕ8S,õÖÈUÖ?”*!ôTFaÊé'Õr_¹lª¤á̶x&F “@moãFòùæ9'N²£Yq0N‚A£ÙYî:¥¯¸f¦âæŸù¬´)PÙø¤ ÜWƒ ˆhúzýÒÆœ¤wwT2ü›ÉˆÞ¹}ÌZ¶Gp¹= Ëï[¾l/Û÷l~¿ÿéL_ ý{“û÷½…"€"”A,|\â+²&¨½ê0áÚŒa7 ë[tÚô8•ýVë†f0¤2à”Hi†ôvHg\£Pm¬©ß¬ÒikÓ¯ŠP&‹Af‚o©g9ë»-ëóê6¿s \+OÚJÅï!‘ qûq…a;Ôj‡ Öøš´Ò˜W«\« ì¡ÄÈ´Vik±@m6¨Ã®j#mÛMB˜[)(q½øJ üŽ9êâ `SLÀá $"‹N'Ò¢~~Jb½#î›äZ'3,™æQ‘yD丗juq,.QÿTf¯KhÂXbXG…öÉ­ží–À>(² ‹-£b³Kdþ™È°Žð¬÷þÍ~½5•Ýq¿Tݵu»Î*„$÷}oB¨ø¬¸(ëc]mµêÁ‚‹B IHx+"ò’7J”G äInûGgú×vlíVVy¿t]§3­;ED „éAgœÙ:SfvÿØÏÜ™Ü?îœss¿ïçÊìM ýû£+Úˆíû$ ¥y8³0­³owl(¤4N}tF^û¬©/¡ó‘ú6ÅÛ¹•Í&°@aU‡Àúè·ç•8ŽrP6ÉÛüqôÇÇcIPGbßo"Bv}‚<”bAÛ£²kå†;i7…íýbûp’µ7©½G æÁ6œdXúÓ:F“­MÃbûƒäÎ!‰ýî~lŠÃBA‘£DäJe–òTí…åj$¾>3€äc(IÁ¾$½IªþBÒ>,°vÿT42£Mõ€èoŒñê„®úh¯.Á«‰]7Ùt]¤W'ºðš“ç 2‡:áMý,´ˆ=êÄ…fW+ò¶Iæ4’©©C›â1É'ô©Ï›Î$„ÐA‚þžåm>ín,Ó¦µÒy½xºñô3•Ø ü$1”ÄòÛÀZ{ê£mJäŒZáÕ%δÄ7K÷ÀlÄãÒH_EŒ[—Ý_.ÁØû½ûß×ÏÁ ÆØìOÃŒ„1šâöM©Dî6ù¼A>Û*—³E8«¹µ)#µq8 ôÆAЭ[ÃÇ¿÷xܯâ Ô%hÿS&ßOºW9N°‹ ¯üx³Îgƒ®I<GÙaÔÚúŒ¹6ù\cô¥—F1×*xÒ”ù!xž‹²hš&¯žŠyQ\5_XíÌ-q”VM–V3¸@ .[#Ïò*¦J¯>-¹2HSP5“SذP|m²Hù"¯Ö‘_ã-ºæ,¨+%¿ÚE²‰C¡Ûžöä•8/Õ|‘‘ÎB¹0£¨÷‚S&@` võvŠÒÅ|ö¯òZgq-@ÎLq5€Óó¢+@#®KÕãùå3¥UŽÜâyeS5¹å1¡¡&3ÃAÄÉ{Žô…,.€ q¿^šï²ðm{ÛþÿöÝ/ˆep =‹“ÏŽ8„Ó´/‰â(ÆFpœÞöËÂ"HÝ©: Û ¥e¥Ò¸ò†É§Þ´dó*¥Í§Ñ²RmúEƒqUR Fè†ÁGs RjÞQßZ“užÃÛÒŠàS<¸¦ÑU×±7„s™¾²vŒÅÃü‚Y,ÆÎ=?¿vRš!5˸¢Ù Õë—«¨Þ!ZW© +–¼ÔµØ ~õéXÌåqpð]°1pÓì¬cÚ;ç}3GÀì,,zÿö×;“É' ÁÖq7'Uh„–{ýWŠ®Ç˘Â6”iïO2t'ßvþóŒi$Þ4$déO¶ÉìC"sÿ­qǽ$[·´ý+…¹'ÅÔ«0÷*¬})ö‰­Waé—™€F­}©·ú%úT^òÑÛ9ÝŸDMaQÁs=¥öË+.Zn'«þ°;ZöòsÏÛ¾ô#´†žc hirÃ1a†ùî˽ð˜4åòqŒògaX‹Åå£x ƒ4>‘¯M·ÞÙF¤ö~€œ¤ö>™}liZÚûR¬C2Ëa0åó¯S-ÿ8x® ÔIŠÏã²XAlÖ¯ã#2í×âÕ9rÓ¥åjDdÌ ;°šfùÒ0v2ëzŠu$Þ~÷§¢§I<¡Mp˜RŸëRÆ N]ötkŽCsq¦-Í¡‘Íë’´"w‹`N›ÒÜ¥O~S?CÊ´.è©‘Îëómi.mÚ‚þüLS̬Næ5ò#w‘åoVžÙëÒ¥Ý.ù¶IàÕœu7Çß«J<ºÁY,„ & f4ÁG዇w:ZÎ7é¾Gq ? DIw[ê¼*~Ê”}òÃ-$ÌÚˆ©Ñ³íOµÂ®ôãL„¶PÔž€"àMj¡«MºhL™k“¹´âyt®YîÖÉ"Ãi’»†yu5W½Þ¥8û¾7@±Z|Ù^W­W÷¯¹âr¹^­¸¦ž¿H$€=s‚Ô†`˜Ù*;>iLŸT%xõé?”F< ÂàF…^r‚Ë 0.…37ãܱ˥ãyeîüʩ²‰’ò™ ‡ê©ÂÚåjdº¸f2¿\®²ÏŠjž\®-ª0œ:]y*¦üÈÑo2.ŠLTy êž–Ö™Ï$wñqäqNéTQåb©ò?5Ãy5’]¤¿ïšKÂ0… ¼u~Á±mëÈ…Š'ŕΊ«S9%μ Ç媧—«™€FÜ…µ³…W&Š+gKkòkïå”ü.t'ÊXÈáù®÷ÇIÎáCGfΥʹè™_t¿^£×yk’·m¹ÍóòÔ¿Ú9àP/÷åY^˜pd(2)”Kaa%·0Ä ¨ÞµX¡ÖNHeïsÝ ²Þ§É5Z¡ Ô ÷©7CMöŸ5w¼[ß]·­hè\}RÀ&ÚAo _s]ž?&‘Ë%yþïaÁ!k£EPVÖ»G#PfÒþ±qþQòÕ5ÍÖºhGe\¶F; x БO½j¶­lÑ¿S^‰óvørI“AðH½Jëš›[:Ho>7à3 Lщã8ÅE1_˜Ü%˲tËn€Œ–[†“¬c²ö¡²ë`r™¤îRsOjטÄ:$4*ºÉì#"SüæKpÉl‹dÖQ¹ý¬cThë³öÆÙû’ w2l=KDé‹3÷&ÚSo}¤ïÍ´ßÏ2Þ¹ðùÃÓ†1‘¹÷˜ô|0X 6fãþŸà‚ÿKÁþty±B`ïÍjÿ2pÛ YÏÀcùj0D’ud¹@˜už¼ý÷[>+¶m ;Žú1ù¹)25Åô¥ôæˆÐ>"±õÉ-÷¥Ö‘ ÌÌHzç˜Hß ¦HÚù(½cH|Åo £I …™v(L¡+«óÎéKÏþ—ý:jêÎþZ;mY"xI^Þ‘GG¨X«Ö«"VkWq\uĹ "Š„åV ˆ 9HB¨þÓévö˜Ù²íz"¢âÒYw<*ጠGö‡îvÝÎÚfÚ?œñ;¿yóË›¼äý~ï}ßÏÏtb¶YNîÊIG2A"QêâÄÝJÇ Q{ç«¢‘@mJÀ|ÄcUŸná¯ã­Š¢1‘`2‚¾! ;òÙŠkuÙK(è“ÍB¿Aè5Š_ö;ÃMiã&à ø²¿Iìk<4Q¿? OóêeÖ¼ûÆcy{“¸ô0NF‘áqô`ƒuŠÍ™§9{C ŠÇÀ(3žÞ¾vé'Ëx†-¢²˜ìš]«ý¦,ÿùƒ ¬0&Î`S±E¦ôû†Í MJH,:~l뚉‰×˜ó·²Tœä›’({X/ò›à†Aó›eà4Ú¤N bUnã!!L: ŠiwíÊåçËÑsfüÐùñ”¿À’Ég1=95³vù'6ûªV’Á¦ÑèI„lýÒ6*½fá¸Y<Þœósi$pAô¤Eâ?¿ßs!kó‡\¥³hÎQmÜô°R;©9÷8W=RZ>TpzTU1”?;Š€æQ•ŠÎ>=~Æ_XwW]u:yÇ:ND$= f,â”[EŠN?Ò”{—{Šª»ŽgÀ(+nK Vh: hG²BéÌå,Ú÷Î’É&™"1ŽEOMŸ¾9`Ü÷TÏÿVµCÂCØôµ$5М9aPøŒÊÄh°½XO]tùèºGõ©¹Ï$7ˆ@›°H§,²iƒÐg”=ÔŠ÷~8ŠDq"ÂBB¶'oø"ÿ]¬þ³FM¿°dðûŸåïÔôøèpÈGËW°ÈAT:ǹôX*tf,…òûÕHQýpþ™Ñ’ÊÇùšQu¥göñjʨ%õ÷TåÇ’>B`˜cQÓc¸ÿ(x({¬©Îñ««¿/.]ÿþ2.Šf®Y?¢®}TTæ9¥ œƨ|PXq¿¨âqq…·°Ú_TíQ• æŸñŸV—ƒ;׌V–ªË†T¥C*ÍýÂÓžÒ:çÑbè#ØLàdŽ2Û?þÌ> ÈØÓ±©ÀÔÄÔÿd¨ ÿW¯ãuütL0|“h)¬w ¾8:>Þ¾KÎÄ´Ü£­åÛ{íý@#²–oFÒw¤¶^…£[êº.tw‰Û{3«`”›@ åÒØ(Nüæ„Df.Î2¤™N²¨sšJg«‘,£ú€%—ƒáj aÒÈ­ùÍ[÷«¢‘}ÎfÖ<&%˜d²1‹&Ф%qËXôP;Ž@ôòmCæ¬@4PîGš²_ª‘Fþ¤ùH‡F ú8>–B"0RIœn:ȵæFÓƒ1’I`QZ‚Ð w&~¿ëA]úPS¦rC,‰3P„nÉÜ1­=hàÿ‹ý2jãºãøb ¶›8¾@B»ÚC»+ 0g ®ã£>ëɧŽãÔ±$t€ÄeH±â÷! ˆC×J ’ ‰O›Ô“‰Çí4uœ Û“6Nb7qbÌ%#PŸ ÉòGfœÉtÆ¿ùÎŽv÷ÍÓû½÷ö}??A2jÊߊ |:}b°Iäi;ÊÈŽ Hd=.ˆß½e\—ä±åŒ²¸|"€ ‹@974G'̉“f…I´§Dtð‚*aÌ ™µe¹©Ë(ö½$©.½àÁ”1ÓÃÈÞ­ÍáQ4ÂYÃ'q&£¢¢ìv»·2úž:Ün÷fúû“jñ PäÖ­[F£Q”"ÄQŒ`…y­ƒ¹4A"8–}`Ç]ö“â¶${ôB^4ÍL2ƒøkKŠË˜âf2NÄŲ2¥¥Eo»{ºÞSÝzïTÉTEÃXQíx‰æÇÒȈªt¦¼ánQµr÷^ `ÓÍÛ°7lKåÁä·_QL×ÏçWÕŒV4¹_­UWd8J¡H w´-«šTª¿«¨ò(ëÝ…u#ÅåÃåÃ¥cêÚqµf¬¨~´´~²L3YÒ8|ªÊ¥Ö€[€7®²Ú‰ÊjWI]ÓÞç£9?Žã ¿»·×kó^p{fÝ ›_p¹9°?¬ÑâÂ=f’Çñ¨ì¨ÅÝ500 ö#Š¢Œ LyÕ–]O–ùiMþͶåZ»os70ýeZÀ m/Ôá„ N¨£×¯©ÛOçôkî„ VH×½âLßòæsPKßÊ–>¿VÝz:4 İ`ÿê:Hß éì>-}¨0¡¢Ã¹,„C>u²ÖçŒÕ_kõi9BMç!û~æ•­Ë_ƒ oBmíKÑdìòis@Úßö.¨Ù°ºÃüÔæ½aà˜#x “H$‹9‚a hfvv¾¹ù‚"µ€Ë£Q68)á°m ǵøþ›YöORÞ¼šf¹¢´ß”:n$ôŠ™‹;ޤ­Ch%0§ŒŠŠ=œ_“iú[Ÿ%:¿Ú¯ýOýÔ”ò¨´ó¹CNâAØKåâžqÿ§Ç”M „³3©kPrîn’õãØ-8Jc0ý»†·„ÖäýŸz÷ ülªýÅkŸ%Z¯‹ß’3g‰Q<—Æ9 =.l+”ØÔéÖ2©Q)î,Lî)ZŠ:2•ÌT ³¨d%s‘ÌR¬0—d2eÂ^¥¬4‹Äx$ÍG ”‡ bŸMÌp^;¯KC2ÇuÆ‚$öO¤ŽŸ‹F&;¥.³bŽ‘N›¤– ·1ÉcH·ä¿¸{ÄÇé‚ «è7ßêdc&1@svœ=ûù1sî “îa’&-’Û¶ÊÔ ?®?éa§Ñ@Õ¡vmÛ¿)öèŽMcà/ŒÇÏäDH8V$Æð u1ÁÔçÂi]úÙS‡®ª~»+6’¦ "s©ì÷ÓLú¤1eʤHÚÃÇÙ,R€;²ãçMY3f‘§C8¡Wî¥¨ðˆ€µï¨‡»Ò†ê¥‘ðZ {š‹s¿èȳ¥Œëdy»CÂØ+Žmæ/Œ¶¼1kÍ›e.}êRó0nV¸ÍR·Q8mÍ5Éö?Í]ÇEP˜ PˆhÏÎíeÅ…—.]üêëM/Ô .çÎèøÅ÷®üéÏïh_>t8:Ô[b0Bâ$† pn ¥Y<šƒ„ ¨÷óvÝoK™4§» R#!¯LÒGE#S¦´)“tèÖ%Ï1âÁ3Ò¨ '9d8øVøç-YÎ}µfNÕð  òžºf¢´æÇÒÈœ²a¤LsAšEFù0·?EúºôAiíDyã7®ª–UKU;ZPíR7\å‚–…^–NWzŠÊGŠ*ï7/Õÿtiõ]UÙƒêú‘Â*÷éªÁURó]iՇꖼ}/7Ø §XHLX”£¯ÿ'wÇñ8–ˆE¸=22Gƒ@98—À‚ú×Ù€Ú´¾jv@ún¨ÅêÛl…Ú{!­Õ¯±Ó@ˆ©j±AÚ.¨­ jµA­=Í u[!M£O‹Þ~äQ\6ÊÙw`YyÙ/ Ì:Õ™ÀØ„‚yA¨¼ð5Æe]}¾cEiùªÕÊÊ:ßÖVˆÑ/o2Bàùë Ï%iDkƒÚ¬«´vûêºV‹0 Î7P7EEDÞ¾}Ûó=x<\÷üü"Š,>\|{ç˯ø<šàrI„|q­ÅëPgÿ™Üu9¡ç£œ×oH:?õ Iûod:¯åZ.å¶Ÿ Ø œ+CH. tð¦=‡ò5¹Ö¿{ îÿ™F¶Ä+ØáϬ¡£¥Gšs(­çêŽca4Ÿ‡ ÏÆËåÎ'º¯Ëto“4ÍeÐüðEIï».é½êmï?¼)Û>TØoJ€zß9,A2Œ aŽØ#o8ýªC“bT¦™ r,%rKI£\ŠF–¢t³ @tFÀUb*N¶œ>,G06›M’RëÉ_ÉŒÛxdž’r^ýiø×˜1í¡I4eLêÌò×fRß+O" Cˆ.Ü&;øÀ˜3ª~6g‘Ì’g:R=FÉŒN<ÎHª_Ž ‘ÀpxµöÄs3­Çf»ä·“(‚ðÀ¤˜´d4%îÛÀƒ7²Öf¿ùy»ü/µ‰Ž¼#Ó­ -B—)ÓeË^Š£áQ [Ý"IæÒÉNì &ð@ÍØájO4€eþµ\ºqþ$ÌÙŒ¯þÖ| 0Æ}&/.„E®çDS¬+ÅGÆõñžî¼Ëuò[Mù_jófmJ-oN/œÕ gÉlgÆRó|FŸ2cL7¦Ý·);³oÂÖð`’(Œó1š‚q‡Ž ôº€dM4Åg­¢9àãáó8` BÃ/ˆ`?ÉnHÜ~§Eñoöë<¶éëø/)ÝÊ*®Žíßmÿ|ä´ XÇQJ€va°…hßvHÂÙ\>â„8qÎærûg'ÎáPF¥ýÙ¢I¨•:´ †Äþ˜¦Q I|ñ^ãŸ-•@U¥|õd=?Ëï÷¾Ïþ½ïç(tœ Ø”‹¡¥^«Äc{Á6¾* ˆr´"BK@.Oìg‹sF, Eù¼_(œ©ûüa¥>PÓìÒgj.¾¬Fæt-3õ¹Y™`6p§œ=”û¤º9ÐÐ4«nŸz4-s•º6·Úènh{¬itkº³H<c7ý1ª¦qZ£óÕ·„j»–›¦ZhlŸ­mé[ŸV5L© ÿÒþ©3IÚ”ŸÈ% á¢hVRÚ݉;Á×_qVb%þ7‚Á  ÈÒ+xë÷û§§§+**0$'y±ñ|Œ\‡ bÅJ¨½'ªÿ ¨Ó ™0`8HÀäˆêµ-²Áì„Ì£Pý«îÑ·úÇÞhl[_V¾!ï0d³c$ñ¶0a&‰Áì”4D¸™M¤!Ffìî¶}Qí4ÔgÿeKǪý¹Œ”Ôu$+‘ÃOؾ2ÔA¦Ñµ=WÖ‡ ~ë²év¾Õ;µ˜¡žáµmݰ`8¸€Pii6‚ŒB¡Ðsk=kÁpxéíRî _P_ò>>Êe"Ãtóž¼2çw’Ñ2û’+—ŒÜ–þi²düæb]½[⸣¸t§ çj,ÌàðÀq3qð,#$Ù<ßr ÷y›Ey©ý¼4"w|wÆùíQã`éØu©ó^ùÈÿ½\f æ%«ê<=>Y<4y¤TÃÃáT ÎÚyàE@0ƒhd±ôŸ›PŒÞzõü™Am0ñDþü¤Fzʪӵſ víi«Zi©•Øþ?E›m‘"rZ Т´k¥vØ®-¶kTƒºw²·Cò)‹›ˆq`25¯¶íÅžƒ5,uÀª~dÿ_·FÂf¥ÛªðÙŠýtqÀªZ0ôÚÆ;X0Â!ðl^ü´ ô²§='½…Ç&ÊfͲÀøJù<­hÏ߯ÃH›qîðoA Y3ÖS|&q$GŸÚÏûÍbÝÁ,±¸üœ½éce{¾Õü[ÝQŸ£lš–€Ëìrcá‹dc¨8;ÝmWÌõ•ø‡d· Çߥ֭a㈀*Ú—þ¥¦Àx|÷œƒ¸[öQ:@TÄœÓxx£êýÌæ¢½ŒŸ颰E6m?PD̲SI » d* ˆÜý%ËíCÄ\±Ë=fI˜–{ûON™å_ë‹~—›aƒÅ1 âáp.ÉfóQT@‰Î¥H Gpzppö¦˜ødvLFâ†O³…_Tü¡K ôŒJ<´\Ý3 õZd`Äo“½*‡,µ-ñÓª Uì3ÎÙT·úÎîç®å‰Å1fç‘cþºN—¦9Pi˜×_V#3Ã?*›`‚ˆÉrýB]°Úè­jðj[gª.úëÚç«çk 3U ‰~悱hçn€ˆ½Âwm×Óú–Gê‹ó•MË^BÛ¼Pmð\Ð?R×»ÚæjZ¿)WoCPàap~áàü"Ñìöøf]á`(ðúëÎJ¬ÄDèY,õA¶˜8ÂA8‘|f<ŸõÁ‘õ Myê¶C@— Ëe¨{ê WõÚ¡nGtÿxt‡ã;±ÕM}kv…c¸$Æú…¢ô “yõimü¾Ci¸d<¾ã3L éß®ÔD™c,1"%›ÚÈc2 M‰‡™§íxSß 5ÑÍÕc^^#c«ZÁb†!ëà†œ<›OÁœ];vN=~¼±”Q %&ôÌ! M0‡AeíêW_¾X‰p‹J‘µ}Y2zKæ¼¥p|bü^©óv㯢ËRǤtä~ñø]…óFÚÎR$&Œ‹¾ûžHïHÝWƒÂþ¨P&ŸüYkDâ¼/¿<)½r³èÒ­ŽÛλyê}EJtû‡’þ¯Ê9ÆlߟËd2X̘ߗÕ{¼Hä:`t”ÎIÑð]éð÷ûUZ¡’08~ÃöœßH-5R‡ZìPËA3&é:/·hdƒõËi¸hDf­UÒ…M'²ªKµ"Gâó,™G„ÉLäâƒÇMÚšó±Ò9!»%»¹¨çÄ’F¤?F"ý*¯Må*ØN-Êp¯È5t¦8;…‡ðÀÍU•³Ùm“Ï[ó=´ta 4`ùÍ.Zæ§ó…Û*/?Ä#„Ê=¶+Ãe*Ž˜å«jkºÃ;aBbÆ~Æ&ÉÞB%0"#S¹7nM2NîMŒ½ÖtjÞ*öôI®«óñF Ad¥â¾¾|ŸíôCK¹·¿âÂÁw2ù™o³xBðã°ã¸JáŒEæd ï÷Ê^¸h›ôa¿üßôgOµsfiÄ.öömJ¯õ¿½(Ëe-ñ=«þ@# R/«2‹lÁ¦ruFJ"Ù-ž¥Kô*5Å{n%“Ñõ›Aqyè¢8 'Š „‡q8 ,Ì0c³(äÃ_§×ìø‹¦ÈÓw6bRÌ%~›Lè¹ÍЖ( eÞ±Ï"ñYD¯N#" Ÿ½ÔÝ/,“ÏØË/Éwq`©ü8‘ÁÅž7<ª¬÷iZ¼µ­/«‘`Uã5Ñ9DÀã1 ïÑtL© >]›[Ý:UÓ8«5zô­ªôSúf—®%¢íø¡¾ÝT(¡0,™$œož«5>Ö\ºe©é˜ªªŸ×BÕÍÓ•tþÉt60-Áá`C™ªòRÏœËïö‚?ÿ\xÅ#+ñÓ(Í ÿ àç£áÈÕo®¥g¦ó˜bÁà¹Á)fFƪê‹kZL«{G Ž±¨Î±ÅŽÅ uØ£»ÑݣЀ3ºÏÎ8.%ÿÃ~ÇD™ÞqÖ]#Ë0ç;ïÌ;';\ŠZ]µZD«Ån×µ«+(0×;7·"ˆrXG¹™‹9™ ÐÖ¦é?›¦i¶+²€‹²j×þÑt«9‡9ß>#†)iMÖl6ñÉ/“wŽ÷ç÷¼ïÌ÷óÒâùt2›¶×ÐÓú˨˦ïkš‡2iL>‹ô“–´¬¤§wàZkÚqéG) üº]”0+·–Àjé\yéÊÊÖþ¥4ÝjÁu¹qZûêóUt*—Êes™l&‰øë_]‹`ôz™-À Yá`È?ïûáŽ0D£ƒ»/2´;+u ‰í÷Ôž»Š+w%ž/óú•#rטÚõ•Ð5.î4ö0‘TBB¨Ôƒ¥Mç¸Ì>šÝ¨gn;ˆšo¼Ì¸Y¤ÈwH#yžG9Ö;¢QAÿÚÿHÜ{WåÊsÝ(轩쿇چĮ‡Ìmxv ‘Ÿz¤Ñ³`ø‹ [`‰Ä5"tÝW{nóÒ‚3’³Y\– •[k¦ŠS™Ì^©´U«,5Jkx Š€’ŠXªF”æj™±J¬?+·Ö‚ú©äÌe< °aˆM!³ zÒÆÍ*×°Ò5,qÉúFe}‘iDfåùÖ4Ò­œ3(f͹>“ Ø£ë¤SöSY»x *â4Ùi“¹A[î¼ h/ô"òv ½|Þ(Ñÿûú,2D&!ÐÏvnð›U˜ëflMás¨ Bì­Š£˜.sÞ¢ÒÙ±‰ÅáÐâ‰9d2óhl~žµçcÎSS:uDäP`27aûF8cçÆã»Ì®š± ´‚}SùD*5ž sðoý€Sux߃®S~“4Ü#öòÂfQÐ$1Êfõò½sä…LbŸ6gÚ$˜±È¦­êiSN!“c©u˜è)šÖÊ0›2Ô-&ñ›”W â1sÑÓvõÈ…§0³þã½â]I'Þ‹ÏÝÎ;ü^bÎî ç2ÓÛi¿)ù`ô|æ³në- èÄa³2hQ `5T˜^2*å"T0Éü/\4§—x b_„FKÎç•Ë Gö™Ô^ƒ 3˃Fñ¬A䵪ŽmØ@ƒ‰kx0J+Oßï­kÿºúÞÓ^U#áªÆ?HK)L„KFØe\~æYƒæyÅ…É3¦kšgÏ6Î6Mžk­ÖÔ8È â©,„EA AèM3 ƒ«\ÜÞ€ßû:bæÍx3þ׿è…Èöû#$ƒ/ß a>>¸ç'É@ÿi„ä´w$y«ZÚ—uY–·»—wõãºúpmÎÕÀ'Öå\› gtÄhÚðÄ‘hñ·D+NâJÏ®=š ³×GXâ’_Ñîĵ÷ã:l8ÝÀ[Â|.N¥ÞÞlåù‹±yE)Dmæ'ëpÚk«5®¥4²¢Õ¾¬ç*®¥•ô£tð³"Á0OÌúøH €Ee½è[H™Hƒ S‘GMóE&¡Si„ÎJØZ`üDØw_áz4"p,8n)œŸ«ìcJ÷WB70ÉÔ=‰q±ë wë¹õº°ÿ±Ô3–oû]^ï§YWþ²Èÿ¨oÿg)m£EW ®Ï³íƒèÀ— åìÞÉÕqÅÀ¸È1"²˯>.´^—·¸_T8_Úì¸@/ÀP`C20*醉áð žA¦ÇÑàM{·ˆ/–æjÕæZ©©Rf­”˜+E=•¨¥v)(¬‘’šk€@ÀS°c‘¥^xé;á]†©$*$¸894˜A¡€S)6Ü ‘:‡¤žéÀ݈FÀ {—ì÷µkD/›3€(Ï™ïù,!ƒl¨*ÚŸLa² H²#óT‡»Nøµ¢)½ì¹EÖ § ª £dV/ uùS›8…Aæ"„Ÿ2çÏu0›*çÇÛù "L¢]~³d²ýf.|b-ŸèTß:½ßZ”IeÄCÌõIäµ^-:Ý ,¡Ú»Ì3–ú.ƒÅ£°ã‰1_kK0c.¦•<é” U}øIYÖkOüÍT8Ñ“´)BúL_GnX_áÕåô‚€Å Ò9# ^ôêr1“$¬“û»å*h.˜7(‚¥/b€ÿ¾OMEs&•¯;³ªÂöâH%fÌñ÷dûL"ŸU9mTÌö(AÖ‡ hP+ð™s€ßÂvÙŒ.Ç«êÀºÐô ƒà¹Y?]ßrroz2’H¡”nÙò¸¢ù牉ilÄxäxè´f²¶Ù{nÉãOÕ¶ú*Ûþ\ÓrxËf"Ïe#¢#ÌÔ„ä>»3â_ †ƒþ¸øý¯5rÞŒ7cé6þM#¾päI OÏ3Hd6‰DæÂ¬2ÄKyûÐGÑu ÑÆÞå­¶¨&óªnòó*­;ºÕ…kwGéík*jãö}Ä`A¬˜X&Mbr 3žJŽE`Òæí¸Ž¶ïuzVw8£ºuQ­m+[4ømép…Ñ)²Ö5kqí­8mÛª.+8æŠãRÁuDkô„Óet"‹È¤sˆŸ78øé6|>ßbk‹¯GnÂØÄߟ¥$%sL¥±8ò‰ù3ÙÀ#¹k,×ü™êê©ë ôÚ8ˆ³|ç=°­pÝ9V£%ÐX) "¸Í|ÿôe…{\à~X⺽;»$ãäÅüÞÛÇðB.ÿ3ï¾S‘»GPÛ Ìv'¿ÿ ±cuK<÷%ÎqéÀc™}PæÉu Š®<,ð *íwd‘eý‚®Aý«F€å¤Ž±ìz;™ÇÓ lÆ?د÷ ¨®;à7IkÒТ•×î}ïÝ]`©¨F¢®F#Ñ[[š(}Ý}‚TA`­à#"ö}w—]Ø]Pg’NÿË´L§QAÀV©é#šª<–}°¯ž•Äé?tj“Œÿø›ßììÜ;{眽çÜïçf¡¸AS`>¹½hwéÙ#ݱ8H¬ ´©^5E@«Íõ*ëq¹MKw&©´5©Ïýbýþ·I6FáήÖTÕpI.¸Œü¬ùR‰sPí–¸®Ñ®ap7Ÿ¡FBf:òË(á8Ãù8­“Ù•[Y”À©×Ix\w4Ò)™•þnõ”E6ìõ:J&š)“,f(zdªÀ˜EõÈfì«æýkøl6/#§¹pC¨«(æ?З•å ¬âÍ¿kÜ©+ܘ…¤b)x~VªÏ YD>†ë¬)^›žÇJL‡áŸW67é,‹uî‹ bÉ´¹0jT‡Å³úQ ·“¥0jQD»*ƒŒ, O›é˜^=k×D»hŸ$²2f*KB:E`@Oƒ€1*àyݦ˜TšU3% ðZÈ,5I©ÈÄZì3}°ø™ý€ ?@ôGEȤäLétÜt€ÍXAKgÌJŸ^×Hü⊀ Œ|¡}:Ã7¦³ìñè0•Iã7©Ã¶R¯A0RîÈÉNM†1ŠÇÆöæ­zpªÍW{úi5r¯¡Ù×Ô®n7ˆay?Êý½¬zª¹Õ_ÿáÃÚ¦Ù†³Ñc-×ß²bY ‰áä^ùkÜn<5Q{:¦mØÔòy}Ó|ןh8÷qùáÕ\œƒó¸|4…M¡èúµkF†FÀ‚žõÿ@"áXä¿í€çõ¼¾¥š³ÇD£ ªÁbŒÄ*ÇÂÓ³^pÀé衸ŒEe‰éhH–Åëw~ïðqÈhƒ€I.Ø!yÁyj³@.èB?ÔÕ ™»Z;ö‰2ð¥\6‹ÇA—¤¥ä¤apÞ»P«2~ôJ«eÁáø÷®X•XYµ·¥ýøÍLtŒ,I×A]žWÚz^ê` #é\ójDÿëÄ–6$w ‹/ÈaqùK{´*¾µæÈ‹ùýþ¹© z¼Ë€ÿÁÙh8RY^Á#)$ ‚,wåëU®Oåžq¥ã–úâ¨Ü=ªè‘÷ö«ÜwŽª¾áòÞìM2 !áUo¼YíþƒÄþWIßß$-}@(I$µdÙj©ãú\.Ç“Ý=ò$ÏœÿcKú‡e½CeîéÏg × Êq³ÜyWä¸]íPö (<{/ÿCâTzî(í#Of& zŽ^À'ÒÞA@¸íô Ù™h2 H,G€à…*7sƒdGqë!•­Qci(3kçÕˆ±hDf׊­ c]‰¾qwEá"n’¥80réâe§ÃÅJCHœHlj͇M%Ž«¥—nŠz®J<7dž›j÷-•säYiÄk,ò3ʰI RxÂr0`’E̲ѳJ.‰P0? Ê¶-Zù»D>»"¢“N›*ÝÊ-Wn›dÊc]û¶ŠüÙÀ^DvýÛ¼ñNÕ'…y<*!SˆìâüŸåÐ9C¿Å"SP"C±—ã(‚f pªK¶k²§K…×R2(ÃfuРˆÚˀ߼&PÇ £| ųFeP_:lÔÄÌŠ¨Y ô•FÀHh0@‘X÷¼ãyj0J@#`Ë€^³WLê^³Æo-›´ßmÒd‘)8‘ÁA©¥hªS.myZ„Ž}8QÛ|«FËÃár¹‰\r//û‰Ü[{òþ‰3ÿl>u³úhµpœ¶˜à Và¹w«N>ªoñ×™ÔžŠ9s¯ñÔçõÍ-ó]ßRP°*-ÃØ0Fr‘ôL„»×î‡þˆ‚‡˜ŽSä«a?™Å— §b·‡‡,æS© Åêݳ¿ÛÕ}cÀsœø2dŸ).Ý)öÜ•Z¯×›`BÒŠB’÷4Ù û®ï½<^â¹¶zç~„B¹jõòkŠ«W¬{gãö÷úŠ{†Ôî?«Ã¢¾Qµç/ f¨Ôý'±çÝ7®°Œì¡Ýƒ÷€¬ï}0`Lâ£{ÇT=Ãà'Ïœ%_³‹<×Uý#oUd¢(å ŸÏå¡(L`8E ØJç¾¶ù]%Å%­ J“Võ˜r¦QnÓÒÝÇ%öz‘µ´ÚÕŽh,¿¬¸Ð¸iÏ6ŒBI € T£ å!ðê(œÄa|æ‹*<®A©kLÓ3ªq Ë]7ókði5ÖR\·Ñȧ¿”…q„@ÙÆ‚õO›nµ?_¥²¨e(ž!Þ¼räWôChR/iÙ·•§`|ž$åxsAÄpHûS!EP‡Dñxq0"WÍMErþŽu›‚:å}óaíž 9x޲¹;I*Ú²f¸.B'žµk|&:È(A„|SÑü¼Ÿt¨S¶*kw½–É& s­[™ú7ûuÔdzÇüÅU·Õ IÞûHá´µ¬» UÑõÚª¨tv9rYO  G’pC8sduÛÎÎlëNgv¬hQ¹Ô¥¶ÿ¬]«€°\áJŸÈ”?:ãŽ;cw‡ß<“y’™¼ï“¼Ïó|?¼Ôv1o<_õB^<¶pTZüïÂÒ‰sù“YE¯Ò¸<<ëò°L¥:pX³X4Š1|‡ÛpöèqñîC›o”Ǭg»À¸6" d$«`JªšÎ¹òýåÈEå„´t"KõT¦Í.œÊ+W(F¥òAyqwVaæîƒ°;GÈ÷  G1°ç)rkKµTÿÿ5==½Ø_Œõ¡¡¡¤h±'FŠ \W>N»¢^k}ÊRj F ¤,Ñ/Óš–W¶@ePy+Tßüà\ݲ¼¢ÆY­Y^YéRßiuPR›¡º¶wªZÖ‹b0!³z=µië»G~CðÜX\îfóÚ’Šw*PµéÝ"½S¥~…FUé  s…Þ¥ÊèR®w.×ѯ—©Vm òÂhO‚B¯º¢@€ÿe- {A#ó/knÆñ!ˆ›ã!G=H”b»1|Ï­ÁG("¶ö‹ŒÝ‰–>Ð@€$ÙÒ¥ëŽ5ö\0Þ¤}·ŸLàd@ðþÓÍ·Úâ¯Ä)­$ߟFØ4‚3¨¿;Ò8ŽAq@‚@·Ü“\ûæ”i@tíq´å^rGo\ë­Ó×´öD·;â2NßÓÚ%2‚pìO0ö%šú“Ú¼uN¼aKìè‹5t ‚Žø$ÉFiRøÙÕö°È0†Ï縳<FÈ0›‘,ÀÝùè†}ûEÇ.g¤WÉRkåÉuò”†Üä&Efs~j­4©ìbHZ$½YÈ¡`á=ŠÜ`xpÈó«/ÿ 2l¶Ù-=mꌲvÇYÔ%š»ÁSH|õ8_W# lŽÉ4wýê@#`:ðiì³´£¯›bÿ¬—|º‰ƒ¹»b´¤ƒ'â.€]=q„AxÅCizþ^§"®}[Ÿþ>µÎg6ìK|î:yFìÞÚÄŠð½>ö¦óÚOFµñßÕ¥ö‹¾­J›hΘÔJ(2Ý,«‹jL™lˆŸi¿õøþ‰5{SÊpmìÆÌ@šEpRÛs4Ç¢§²‹ŸÈ.gÚd%/² ‡ÏæŽ*”SRå«4ò\ž÷âœÜ.W?‘–dï9äÉa!8N8|’ëMá<@°Œ`ÖVš¬ ./T”ŒËTCò‡/NæªÇrKGrŠÆäªùœÒ¡<åHvþØ…¼Éœâ®39|¼=6X(3Í×ÛÇb2ÏNÏØ—0²T?ªZ tЙ›slÒ`7TÔ2,w!ÎõÃ1Œ Û¦­+/JW×¶BÚv¨¸hdE£R7BUíËÕ&'µÒ´BÕG«}¤ ¤i_V÷9TTþ³ðHšñÞ¸öâÀÞn®Ð×õãP@§Š¨Ò°êŠÁ©Æè¤i^V ¾Õ.²¬Òä¬1,«Ò¹”i¹ûCÝ` Ü=}d†±Ï,þ„¹—eÿ¯F^®Á‰?ݸÆEÙ(î‡âã/Qw,R4Ð9g¸^E†ûÉ×ÿ!6Ü>‘™Ç§(pneQÞ§”†Óc‘u Óô·ÀÑ|gRÌÃ'8$áhx’¿O€+æ£ùCBÇ7Ú¯)Í"ÃŒ–Û m÷Nšï$º’twbÌw#Ì]¢¶>±î¡Dÿà´ñAª©_ï`‰åÑ[çĶX}'€œoðo6K€$ÁØçg¦fmÍzÝ®]»H ˜#¼ ô£H!9¸¹á×›w}rpoôáíaû÷…ìèï±QÈÁØx £vmÐ×??;è¿vÒ8 (ÂÔÎØü$Ã- ½x³C#€"ñ–n¼J#` ÌØ¦ªÊëpE ˜Â¹7²Â^7Å&ê%+ÓÒ÷löc³„(Ec|’ôq‡…‚KÐ|_¿.kN˜lŽÖ8p%*#ôƒ˜Lî‰-_É"_4Ÿ¯Ø«“ìÚ”áº[‹ÄÖ˜b«O›©K›«O±UŸšÓÆ,PdB+ P€d²^ôÖ³û§×æ«E#M’ÑÖäÊ“» `SÊË‹ûS~çdƒŠ’‘óùC åXvñ|¶jP^4’Uð*<Í+˜«f/)Ç/¨žæ–×…Çâ˜3̰ÙBÝ#QÛ>øcú™çŠ"û¥¼±K…@#㊒!iá`NÁìò YÁ 4ÿû󹳗Їs”SyUm‘â>X/(—„I§I*èÃÀÞî°dÀ¡lqc\ª¥úQØ{A²PàͤÝ~¯·'80u]çñàÂ4ÏwMx”KyÔü9¤¶¬VÞä¨mrªµ8Uš5æê6—2+¤6A•&¨Î¼ª¼v¥ªÑYm…š; êê•g2Öt£Áa6ýüP¨«´jhv.×A5¦¨¢Ò´¸ÔÏè¤W®1.¯jtMW`´ŸKù ¦¾øò†ƒ!ØF –ÛÿŒfÎ><ôÝÎ[yN#8Š{l;ÂØc"ñ¦žDKè€O@'ÉÜÑÒ%i»~xF1Á·„ˆ$ÖÞèŽ''ÍwËŒéò‹%àúüŒåf‚åæYóYUº¹3¬ÀìJýJˆÓBŽÛ/·8œš—Úúu¦õQ²q N×béIméŒ7ˆ-—ûuwÅú{k¿Øúð”±ï­sâ [ºµ'¶±ÓwoÅvR$ECƒÿš¶Ï‡a³Ùnß¼u €ÄaŠf0L£‡| 'Q”Ä1‚ÆŽ2J!àŽ/-às0œÓ8u,$ôÙ³g`S]8âñ)ØXe_šÐ1Ö ÆÐ/6öÄ[FzņWþŸ¯«p»iÇÄšV•ùƒ‘‰qþ"|ݳ·ÆŒÕF·¦þ^žzøý½^Þ4×ß“ @âÿÃ~™Ç6yÞqü ºjÒÚæ°ýú¶h`´Ú¦UX[¦¶”è€q|ÛIp¸Gˆ'&ØIpâ$¶ãøŒï+=þ[¥M¤m °påäê BTrùöëãÝc›¢i['!˜²¡üôÕãÇ~籞ßïù~žwtÖ:¿‘Ö}€Z˜Q?®å¥Œ‚¦*j`‡ UI§Ào¬œ3îjƤ_Óp-;ªc„t{CæJ!A+‹"`8€"Y-¸}?cBu¼€MѳæMG»†c Š1„"<]üÆ›ñ6ýtc»_ªÕË’v€"óÍÿE€æN*¦›Ûï×·†$³ÇÛ4wþMÚ1XÉ’oÞ¡x·fËÞ3u3²¾9±<ØØ•œˆ?åw™m–[da‰,ÐÔêo’¡÷¶N7«ö¿ù( ‡¡àÉx<(@.›373›øÅXŒÿ«&Ž H¶ÏÄC["€F É;³Ó¢ê}˜üB*™€`I)†ž¿ñíçÚ•?Ö~ uz >gN¯ê1A*+Ôç†úfúnì´_«vž©øƒŽ…Ò*Þa9†ƒã|zçC÷h•c¤fðªÈ|¦ì×[p…äU„b,‰R—®­ØÅV}¶ï“[|ç årûÒ^Ï$Ów÷Ñß7Î÷ŽeFŸd»'žTæ¯~rëçï Xl1Ú‘s_FRß“a2l}~vÆëuoß±B§©d,ž„©0‘N Ó*"ŒàW’¨4 ¡&¿²fVgD¾OÑÌÒ¢m29¸ ì·à¸]êữ°¼“\ǸÐ5ÊñMðí“OF’éÑSq…\ &I Ãdæ´øÃÇu±ù~bET¬h'eÛ6×ú™ˆ9cÅõlTµ5°3+dªJ˜¸‰~aÈÂõ›81û>¿Q0«ãÍ鄈ýHÐtÕscê=Iµ²cæ½@ +¤Û $jâeÛ°Ž5pÁ½ûÙSÊÀ7íALBÔxäO ¿_CYŽEd˜RŽÍ©m˜mR†¥±ü[ñ‰°Thhû!™>" J;ï7É-ŠPSûÜá¤Y’tÜ;&Ÿ“tÏŠ»âͽH}gðЉhú¶Öh£Òßxê^½tVÜ’hik™;*È”Q&޶lZÿ*žFÂÂD޼žX vçî.%bÛ`vo§ï‹±ÿé öülÒ>L]€Ö ‘h MZt%$ÔŒ¡i/æ¿üês@ZC®Öõ»r»MËz­KÕ¨× ”«v¬PÛWô ¤¿ª\iésA=¶¥0¨˜½iR9 ­êq/×dúªHmÊÜ :æ¼n[ŽÚ iÏsxl)à<¶°ügå“_ßÈšÿä?ý‹GXrë›oÊ×n(%®.~é%¶±NÊñ1œSYööÄqŽ‚>À ÐÚF8Þ©=®«|ÏÔ>Ó°È0Të¼T鞬óÞbw8qêêB,…X¾Sbäû&Yž\Ç=¡ûëjçdû&0A†é ¶ãl•m¤‚]SËDú¯vr9®³»­cÕÝb:/ð|—Y®‹ çÅ*÷(Ë=ÁrŽ ½ ÍO¬jוJËØ[5í$ „-¢á–†?zHÄh&’é$J§P MFÐøÐð°¢K¹å½÷_^µà±GÅJ $*™H`›Áò¹}ßÝ»ŸÈ<ô! èö­Û($2ŒÅ ai†¾q–{Šg4Âò2çÛ¯>5I&Â`ÜT¼ãd'†a"–J(üsýŽÇu±°‰52Q/a® «¢vßÄÈ‘°VGLûc}TS‰èªfÌ"?@Ž~^ÜPè…1 e¬EM5qéã¦ô Q¨™à}k`ÌÛ«&aX/L뇤eäEô€"q³(¦ã,¸}?c k¨“3Õ„•¬Ð€pW©SPŽ'á|Öú ÷›{æšs’¶ˆ´ã»yð˜ì‡h$Ù¢ —g$CšNÅ$íÓÇš§›ZQiW þ¤¿©mºA6/éˆËÔ&ż¸#(îœ˃':ÂYèˆ$*nŸ?¡¼&–{™Âõ<WP€Ç•ÒÊÊŠ(+ËVÿ|8ijuΕöóÿ”狱ÿ3’ö_vü@ õ#Y ‰&â—G.¾ýÖï¨8¦°[†# hE”‚m»rÝy½Hm4€ìKUÖ´–hìÚ x#§Û õØ¡>+dpåª\yJÔm[ÖéHÿÞï…úΩlàqHkYÚëT– ËãGõ­/lxÀãqØe7¨50çDÆæ’‰‡å–­»G(NuëpX˜ “Šqø•%«Í]"Ûד&€lÇ ¤®s”ç`û¦¸W«ã,Û0|ëÔoX "u%žR¾aóaÏ%Ž 8à„À>zØwV¨´üòݪu[_Ù´í]ÑIQßéÖÏÖlx_ðB½ì ûÌ.ÇhÍàÄæcê#ö/¹Î×z®€÷³½7¸¾ë|ïPÊBãÄ Ã}“Ýýi>L¡t"q]Y©?„d)$»"‰ÈŸÌ’¥W, ‘‘HäöíÛ=÷Õ—Ÿ>;|æîÝ»qÀ™«ñìR&S²,nÙÊÒz1ñõX/°û¸‘÷Ó3!´_j4’J¦O˜©¸BÞIÅãId,„9ÝðØ41£Æš`?¨Eõ,Dµ5ó-sÖP›0òQsõ¼qÿpÕÆé«üæºÄ?¢g%,܈þý:â:>˜å ÄÁ^ï13{ymŒÁG(ÎÑB A©Žˆµ÷Þõ$b¯¯=|Û°>ö>ìõ®½R þI¡HUZ…`lSu ‰T‰Ë°¶÷ïÑ·p¢´®dµ’âOŸžF³£™·zoæû}Ý¿!;hÉóêŽa&¡OÏ£GËÁ LÇ‹è…aµÀ£å„Š€Ä ¢¨FtB¿š·èåû9KÌŒÈÇ w ]ݧLÏ,„F§SÄ5E+]%ŠPyýƒù´¼i>Lœ–å-ž’Ÿ´ÎUV;!Uzª›'ʪŸ‘ÍNiuôX^¯T1U^‡U¶x+Î:¥5Ó²:¯¬Ö#­RœûâTeÕþƒLN& e=¤È{œrNFù~ÖNÎü{¶¥XŠÿã»wÎ$@?eÃ7ÛÏF‚XÄç‡@%O¦&N¬£2i± L˜SâZòÊŒ½/•Ô,ëp@mvè¼R™–NœïŠQÙcÎ÷.?gXÖf€Ôà¼jïYÖÚý‚Ê .€tæ—Z +õ/¶!-øÕµšW´ZW´ôEeÒi†Ôf’Ÿgˆ¬Tx ‚ ¿zó—w œ¥-ä ñ.`N#ø(2>>Ž¢(LŽeÒÁ$”D§¡É¯àUÿ!Z˜l·Á(êuȬO¸ö¿ÍžïÏ·‰­ÃëˆÄ1ÊïíçöÞå¨Û}‡2Ÿ:+ºp;Û6Tdâ÷ü¯ÿüÕôm0…šDŠcW’@›oØrøã”-o¥R 1ù¤áϼ‹ß|Ô`GTÒÆ}{% 'L_^¸Ë¶Ž²­#@#ù½ý‹Î‰ÿ2y¶¡\Ç·Eæ?¥n} |Ÿid2 AKJa ˆ6ôô; ã8ªˆ.žø.Û+<r™`y=Á¨…g¯ÿî;zùòe°ÈDxÊ»;wå÷ ×Íi$Û~3×v;ßúõÿP#Áè0 @, %îzÙ±…V±°ží7ð½æÂIµ  åFŒ·Z8m8Ñ ¸nƒÈ£ÍXø®¶Ì€EäÒs$€R0m5߯ût"@š@§ ¤G43*AD_„iEoÚç7@ÀƒÀõÑ'jøø½|?gé3J‚šãA}΄ö€êȶ(NDP ÃTiO ó‘´6"­÷•(#UÍßȪçÓÆ“ŠZwUƒ³¢vBVç”7L•VGÊÏ>Vœ}\¢ U4a¥užŠZ²ñQ©Â]Qï)mð)š•ÉR…[ÑôG^1'mKÊš8 eÐè(!€¤Z!Çßx‹Ba¼)‹6³GØ,H–b)žËøý¥Ï¶lÚLJ Ò©4„D¡RŒ.Ïä¼Ú¢ŽB¢Í(©MP›6¦Íò³v;¤²B­ÝÑ<ßsκ¢µëÅó²¶î›1f¨Uu^€T6‚²&”uø55‘B¡\½zÇR(š{ãæ›ä•+WÞÙ¾Ÿ$¨_ ”FG¨k“ÞIEê+Ŷ~Žy@Ø{Gà¸ꩨo(×6 ª›È>$èº)²Þ¨ØÇQðZÆéºÅ6}ÅíÀéRÒ3¾ë¸|5JbÀäM[ßÝÍ>¹iß!”E'ж1)0‚ÄfìÎö mƒ~Ë^KF`˜øö¾½oì?œ±ëОœ“Óç<Ç(Ïq¿ ÷6$‘}W¶ðy.P#SÑkj¨§Â$ Ì`‘ëÒ‹^¤é²‚ê£m¦_'òë 0 ³ÿEž•±‘ùz r]žé×J"ª#î΢€Q4e`cÚ¬ Žuˆ¿,;Ø|8Cÿñ±ûu_÷1—X+7¢áÏè?ñNuÜ€†í5I:¿¹hJËw넃ģåùô< A·‘1{ÛÙßgâ¹ô|—šÑ‹#‚`Ïm>c(:¸•O# Af]³•×ÿæýȽò³ÞÊ:weítù¼™/ïÉ”«êÜM²– ´Å'­›®T:• LÛ—4=”µ7~ÈIA¨"‰JO¤R©D"1==ýÚµkø†ë(—b)~"-áÈÃû²3³h(5ZëÉ0БšûæNBe5¤±@*ûŠ:ûÊvÔ¡iÖA*#¤µ@:ëò6kL‹RY ½m>@çŒ/hPk×Ëmæå¿ØIJ¤' à½;räˆßïÀG>Ÿï?Ouâá£Æú†´õˆ€&’HÉHúŽýgš$o€âži¿È4\xiŒkíçXDŽ1@!àu@ØÝuBï0Ï:@‚Ëd¾õÆ;yEL: Ó~-’‰?»“eê7nÞÎB`:Ùsª^`¾%6¦dÐHñ J••‹°b F)äu[s”¦âžÛ\û¨ðÂ×|Û(°xÏ|øDbsÈïâ[nr/ çô ˆ{‹m#N‹Î$`ø ÛÈ'½7ÒvH¡R“h(DQSSƒ;Ä=ûN†Cs»—ÉÓÓ³†á?}Ÿ%á/pÉÝ{O*•¿ŠE!X[$ç¯,iäÇ•Óz ¦É ëxnµÈ­•x5<§éxÅ&‹ZšulKœ4‰¼Æ‚£Ø§f;ÍnKáHÛï8o§!q¯¤&Ò’W¯>° ù¶£pÒÀëóB¹®±ÏtÜÛ™2p}ºkÄׯéD!$¨Í‹ÃúBL-Ä´o{6ðIÀPàR±CæB±xR-˜Ñåuz/qÕZâ*2Ú˜šÄ"£ëcã>ÝñÞÕ%d-žò&×å´T9Y¦tW5,T#’ڙʦ鲺‰OîŠoUãTyõTUµ·´ú‰¬¡¿¼&;}sju>Q#µ$®µ¶¹ºÝ1ÁðxŒ¢´¯¯/ÂZèë‚õ°–}k°¥ ÀéVß';ò·KDb`''Ä“4—ˆVlØzذÓÝ–ãéRºzäîn•§+»åj¶¯WåîÐzü9¾n­sB @#,BÀ´Yh<=¿.¬ÁIJ,„ã–%o*nÔ;?HÎ>!Ã`$Œ{饻•qu­aŠqˆÓAŮܖœ¹‹Y‹!²¹¼˜„Ÿïô´ªœj—?ËѹÍsM}¶ü¬ÖÑÎØ?P8¯äzz”M­*o›Æ×®óthlŒïÆSçÇc©µ_c|7S—™s~¥éœhå:ˆ$€GÓŒ¯KÞèïìbPdl4ô¤ “=Ù+{;Ð`‘ ýnK߆’|™Dˆ£Xâ&µóa¾½UW{~ËÛ–´ÊózG[ޝWýÎgÞn@#­³#×å×9;uÞn¥Û/o¹úÔùñX2î•vvKO†ç²êL‡Þòé’µAŒQœBx¼=ùù·nÞ †¾™9cc,)ª\Á;gû4ãã›=^&‚¸³‚Ç%d9§ßKwõNkäÙÊ¡ÓÊY ª¤A3Z›iß5k¾´ï«ÒllÎ\p³V?hÌŽ˜U·ù  ½°ž‹ófŒìY¿bkÒ<Cá"œôžPêÕàëFÍý&&Ш5Ë%¦ÚŸa«bتhPÝ7kG,º°-'ܨ1¦˜á¦ìqSVÄ,ÿÐÖMË"!x Ä$Åh>)ƒÉyêÌË<|,\V}iÿîÃ#Åå÷ŠËû‹*î:8x|ªùêPÙƒGF –”Ÿè/ªúxÏQýËkæqù(*ÄÄ4‰2‚^Ÿ¼¶µ³]Dì~øàäõ]ûátLÇÿ^€%ð`þOx'LR^vÂPJ$Ž‚…(‰aBÆ$ÌN‘sªOs|œZÆŒÇè2ùÁ)Û5Rcã˜là»"°)“ — ~ñ÷@ ðX7þŠƒÁÉ[ÇÙ®º®åK–Ó(@$Ž‘¢¹Tô²Í©™Õïíð¶ë›»®.…§7ËÓ#w÷Ÿ{°ü dòF¬7µg?R;/hO[#/LJß¹!ƒ*ZE.\žbþ½ÆÚ“^ê q _0ÆÈtc+Ór+ÓÝ•¼·‚ 8¾`~Òë™ï^Éò~¼4}'BQà©Á´ˆ'_­)Ê´´«|]öµçjŽ÷#¥­44g®ms^zêüx¼Ê»»r¼yžÎLë%ælŸÖÓ­3üv~rŠ˜¡ %¢`¾ L-„x9U§s\Ôz?™Öȳ•Ø0V/˜3"†´ˆ• Õ©UȰý«“Ê:yRîÚù÷ ¿ºãÞ—úJ¢DDƒù#†{SÂæí÷ŒÛ×,ÎCˆ(¯L]5`Ý6ÉCê{õê E9Ö ÖeOµ?÷#VͰE´¨ÃVõ`mÚ`MJÄÅ ˜rvnT©åk \,‹E #bqI’/R2©ÁQ›DÔ—%'û”Þ=X(2XRþÅÛÅý%Çú÷—† *§ª‘á ~TÜy»là­’Ðò»ÅÕn…~]tœ'DE4cRB´÷ÞááÁðÄ<ÊÎÓ¡¡!pÛã£çÄ阎ÿ‡~½ úȃRråò¥õ¯nâÑ4&[€R2¾‘Åp—®ü~AÙ_0:'(bpqê<£S]ÿ$Ìö¶×{C[µ©ª„–&å2¾½ØSB% |¬÷ž¾õ&Er*çŸÅ?ýôôÞ›ßÌ<ÍüÞïûyEœÏ[º®Äø‘ÀÒY죑gÍÅS‘ÏXä× ¼õݦ’ } ­Þ;-É$™8BRy³®Ðß\p¡|#ã a’ƒ-¼^»{Ò$¥UZÉf0L@‘õ‰ÐSe@/ %zñ¤®n‘Niå³]ߨð5‰h­˜n†›„´E²•ÝkPÜ<©ToZ CJ‡B± iI[ÆO9~üøOïÆ£.ÅEœÇ`Ýš8Rï©|×_©ñUUVqxâHíø¡šÇÕ³¥‘ŽMTU{öi<‡OºÕ”gmJ„¡hõ€,6B¥$¦ýã_ÿå/ ÐÁÀW«_ô\fžÖä9›³ï…¦Ýï”ê莈h}Ð:Méã'Þ‹ìc’)0AA(+!}ÁΜŸ¨‰i¶Ì«·?WkÿÁé¶½q&YP£ûùÖ@}pŒAAðº-›#o ÒQ‰t¿ìü_ N€ø§‘!#´?Š&)žC@LŒÉäQÀY0ÆŒO5¿LzêO%Ökê3n™µGæŒè,U7Eëe »‚¶^™Ý-u JÎöɬ—*ÍWvVä¶ËŠ3ƒíßÙD*7Ÿ»hÉv„;{…5˜“ˆ3<¾¼Þ)u¸7ä*ˆÁÌå[oT4¬ÜüÐ> ³ªÎ™/Û>y½â´òç¤æóJgÚ6ôãÇ×i¤c@lïV:ú•6·Ò>  K~v¤ÀÞµ×ÞYPëÊÜ¥zL‚)Žà$г0 pÅ–äçæ554öõôFA´á øC¡Ë/í/ß—±$…‘xç‘&üÌ¢šöb×€ÈÞ¸bŽFž-lÚûؤ~¨—ÿרj’oTfežÎY2H¼&ÕŽ_½Ì€SùdrÝÎ5ÁæœÏŒ‚¥‹I˜M%áp‹lû£ŒÖIîé+3ˆù<â"±®²l¿IÖËÀc=ºÂ€Y<¡Ÿõz¼Mr£„ÖËBEã ’‡ÖjJÊ7½L€#‹‘DÂà§S޳bHüDMíÄýGZ†®v T'6›M°S)Þ²w<á­¨¦½7YqôQå±ñõÎE€?:ttìmÍÄ‘÷ÿ"+ÍJJa2’ìA¸$[R |øùHÈ1¯œ«è`ˆþòPÍVpRû¶}ÎæìYµÐ´š?°"Z¦§h:С±›=oÙ¸î0B°y‹Hf¼ˆâÔ‹«6=_úî¼FWŒÖSß2¿Î4ü¤ìB¤!c)~çùCàÁ¯, ôTC¾H‚DÁ)öE$h‚:ä „þÑî›·JÔe’G²(@>|އpa'9c•`¿Àx5Ïõé‘»ÜQ³÷G[µõzŽc`ç¹¢Ž‰¥Kh¹&ë¸!² Éœ×å-}âö¾mbq*“Åâ¦ýZÚ1 i.¶u¯ÈÞÃÆ±‚¿*«ÔqMbùÏoDûAauÎÜ&løg©áüÉ‘¢S؇•gz¤u-•‹&¦¿©Û®#ß9~|ÍH\ÃBÇu¹kHÚÖ«p Zº$ÃÙgî7T­Õõ¶W6¾‰á\.F& à6I Át"Ø9=ƒ@pÖºõé‹—D‡` ÈôUÀ-•°X\k‘8z ­nY»[Ô~uŽFž-¿z¸È.Xa+XþÁÁÜègà/o[F=0ʧ´¹6u'1cWqá I5¡+56cÉc½¾ ñeã¦ßNš‹¿u-N’0Ž+W'y êp³$ •øM¢I]á¤I>ÛõLU>£Â¯Z}SSçÙ AÞa0Ãâa”d¢¥{Ëoß¾M‡½ðMÑ ÄѾ¬×^e#L ‡09¸bõ­êúÏß©Û,p¨v¼ª È· zÿ‘ÑŠƒU[6§â› %bœgÃ?‰ßÞÞ=†‘šÒÒCûŸ”>ŸÏ÷EÅ gLæ9›³ï“EwGQ€i4 ²(ŠÆq 0œ Q±ï§[·¿P[Ó`ŽÑžLó¾áGzëë[Ÿ«wÆÔµÅ4¶Ík4$/M'¹‹Å!¨=Jà0¨3BÇ·´(ÒD÷ïèèhYYCpQŒ‚PJ"0Îæ'oÏ+¯H[»”Ž~±µ‰òì°`Z‚¥ö2ç°Ô1$±Ší=û5¹½S鈨¤°­»òµ^)×­­4–Ø;sþ:"7|À[”¼cÄ"Ôkûs[º@LQëGñ/m|Â#Q?mÃï4â³BkW¾Ó]b»´&¿$ŽHÀÈøÔŒL~ZÌæ²lGvžþCÁoºÅç. ­Ÿ(£oÙûm#÷ººdö!±Ù-µ÷ËÚ;•öaikŸЂ­?2V¬Ù1$rŒlƒEŽn©³[is«¬·fRs¹ó&x¬ÂÚÿ–µWÙÖ:`>ÂŒñ¶^Ð9….7@YÓùõÒãÜ_îâ¡$uJ8á¢D< ã3±$Ábs‚ˆ€ ‰lˆ‰#xü|”¿|S¡üä9`Bðµ;FmÝKfK#b[„!EΡ—V¬LÀ1Â-‡B¾oH‘g‚F¦tâhëÕKÓ¢ìÑŠÀÖåѺ°>Ò÷ä“ÒÛ, Ä>­”6Â͹@Á'ZT~£Ä¯N6+Æ\ŸQè5€N±§)Ÿ6 BF_+kU„´ÙcͲ?W‰ëóWiòÖú› Bæ=!Cîc]ɘy÷XËÛãÚ]ÁV¥§1;¤UÒzeàT.mTÜi•zšòhsÁÝÕ–ÕK`.‹'òx ãc,>‰¢‰äÂÁZ­Ü×íÎ`£87b¡–ïð•÷wðw@ÿc¿Ìc£¸¯8îE-QÒ´ö®wgfgf/ØØ$\®šIh¸†l°wwööY›lcƒúæ06xO_{ÚÐ *µ"Q 4mpÀëc½vŒ©h¨K¢8¾w½gßf+7E¢R$úG#?=ž~šýýÞoö÷{ßÏã$aø*3¼†ƒ°û©ÜDúÓÜhæVæÆÏ)ŠùV‘»-Ë¥• @,’9½lN+ukÊcP.è9Ä‹:¹§U4(aï®ÖÌÐSCÍj$AuƬVqûlnök?çÑ~Âcãht4ŽÀÄét:ŸÏÏËËùúú<^x~tí:‹‰B"1!É?)Š]ŵî’ê¹#•óÇÜ%u“eU³¥å3Å•s%µsÇO}]ÚøåÉÆ/*êþQQ3YÜ8[\ç:QÿeÑÉÙêº/ŽWÌ—ÕŽ5¨óo‹MfGÒÙl‚†Á—@ø\Þ¯_sbbb©ï[âÿÒ…-Û²-Û’ÁÝ ßšÞÞÞÔÔT.AbA@E'14ñ©ØZλ+OG¨/E´tE4©#ZÚW6EV¶tü8óJàQtz Ç‹ypï~Ðð.zczáÜê# ¿øók‚É$™Åfã\&FÐ1¨É©¢ByëûRëXšùnšTÞžm¾ ¼AoË·”æ>…¹”NdqЬc({F€[à—vöJ:næÚìâÎ=Í,<)D;ë_Vÿ’ueLÖù‘ æw¹ú7ï+`!ñdÔ*’àîRÖÈ­=d»S`ü˜·îE‚Æ`(—ÅŠ…Úù å ?æ%òì5Y×ÜfϹü™¬ý3å{㇭ºúïݧLw“$ÖOEÖ~©mPb™ú( CaWõ K»ú%v¹Õ!뤬v€(i§ãQj.² -T7Îeé‡@zÑ #zö.· S6§Ðê”Ú9݃æ›ù†©3–Yåq[öÒÙ뢙1ÂÅYF`DÆ 4>B‹ea8´ÀÛ°e[Z™V~îJa÷ Ò6širNˆ€sÌß™FdV'ä?Ox~EX‘¼vã÷€FÀ}m à ‘%1‰F>£–º Ù †,Ýy­rN+ØpésüQ°™ÒH=š kÈ÷´AâÒH½ÍÀ*Ù‹íŠI­hJ-ö·åúÔâ 6ý“бŒHNí±|OgÞÌy‘K'Ý÷k3\-b_[¬åïTxÔY.}^x­év¹¿]ù•F%ÞH²Ù, ZÍ|’ýC’0É6“qN²- >ìî(8’úF’1NîÖ¤Y]Ö¬!Ú±‰ruöÎõACæCaÖ¶ÄzjïJñ‚Aµx!-Ø¡˜n•xÛ²ç›[E°/·žš5ˆgô¢9ȧ¥‚:™ç‚Ø×ž5£‘͵ÊàÍtJ- ´É.:²kÝæÓlúspÜX8þâîj ÃŽ=êt:çt B=Q *G L"Å0 ƒÆH_—2U~fº¨j±êŒûXÝdIõtyÍ×E'+Jë§ŽV/”6.–5ÌW»Šë/jœ¬¨PZå)­](¬p•48Ëj _Û¹6]ÉŒc,8œl2>!áìé3Aÿ¿û»pNé¡òµl˶lhz8øöÅ17ë^HHBQ&Çâ’‡òVqãé[_~âÄ©§šÚ"4Æ'[zVTwEhºVTT<»z3Š¢ ç솚:@‘Ðl@8ÿãMî¸×ëývà÷ÃÓã:0É~Å‘h„À9à|)¢q“7Ì“5ÿ>ÇxKe I›¸Û!±õK-·•æ[À$â.»Ð4*ê¾'6É{F¥6§ØØ/³ (»JË€ÌØb*j¾ºù@~LÊöŸ½ŸcìTÚRÞPa̸ƒõ†WóªA†9Œgø¼”ß´÷KzîŠkt&Î…d8ÏïïË«Û#+B‰ä5‡¾Šö«]ÙùÇ„mÀl“Sntu½¹GT=#bÓ°Ä2BYb ó-ª{à&ÒWZª®A…y ÛØŸ×Õ§êì}]¥.²ô=JÍaدØ6ò/,é”Xn?ÌvÊl‡¯–avd˜ìbË-Iw¯Ôä…æS‘þêþý«ÊâM»%oÞµ)e;“µ†¿æÅõ¯¼™”zð%eiz‹UÕ}2 „2ï qˆÀÆ “KLß™F(ÓP˜Y\.C9,îö»ƒï#Èÿ ¸4 ˆG/ƒ8pw·çøÚTÁv¹G- ¹VìÕJgôù3-B—F4gP.¶«@å}Ò]ZÅ¢>ËgȆÎ }:•WŸ5¯–{Z”@#c­ÒÄxLJ b?){kÞ@M¶Ò(‚ÚýAµÐ×)œÕÈ;rî7uòÝ%{6œ~{°ŠG¯¸Y%‹c< Ç8aœ¾2©-qJëÓ·Ñ ƒ³s-×­—ºµ2{…€ÇŠ}_‹ Ÿ«óç ™”¥ñé?brÉGþÞ$žmÚë·äÿ­5ïsu.,Ôgøšßò¨0b¹ÕBØuhû‰O'óëå¡/£•Í«%S%ð’ÿ|†§],Í8¼‰%œAÇ0çpHn ŽA’§È½wïÞ’Ö/Õ±ðH Á€Ï~÷Î8‰ÐLIDwfPS¥õ“ïTÍV4N–U-”ÕÍ”TÏ–Õ¹N6ΕÔμSá.ªž¨ž9^å-®ýêÝò¹òÆ™â†+TΖ8è6"ãQœË@8Fаb¸4…3Zúxkà²-Û÷Õº,o ”ñññtÁ>¥G2ž#x8NN¤ã äú•ûÓ"N7ý õòŠS—"ÎëžH¬a œ„;ž²~c¸Yp»½Pþ÷Éû‚þEß74~põ}Áû¸GXÑLŒ@Ñ6ÆCh Oy]H5ýQiZC:›irH¬ÃrÛ°Ü:Ôz#@!&± ‰ºì!,±:„ýÊnga=¿óŸì×{l÷ðý½M*BìóùîüNBDD… „Ð ZÁ y:~ž_qa<Ê# ¯ -ƒ@ž¶c;~Cè¶>”jl¥oâÄŽí$°M[ÕJ£!'~ûöu¼UUÕhBê?òÓWÖuºûÝé÷û~?ß?+ ŸkþÊã¶ |Uóç‹òòŠ„¯WDÖ‚lÉB:ðNôØo¿jnž¸0yøtèh¤u¢¹õë–ÖÉ·ß <7}êì×Í-á'Ÿ7·†O]ð¾u²z]Q.“. £g±p¡½\¸Ò¤ïMFãj¶KÌŽyŠÌùñB#UÓãñoŸÂRÉÙ¬ž¸ñÑÇK—¢4šzSE° Å/üÕO[~ÒݳðHË’Ü圬—x 2ÅÀGŸ¤o’˜p4úÎó›ŽãÛÙæM&"±Xâ¿þËÏÊ·—f³Ù&ƒE§áô,.›ƒà|wÅ+Ûªå—>ÔöÞÑ:ÇÄ®GÕö±Z›_æp“öû€ ˆÔæ%~…+\Ùo—=b‹›t¹ëœC•6Öõð¦ãyüBÊÙ[ð23‹Ãà®Ü©U[½š¾;ØêMÉtZS› pRç•:‡ÅöÏhôs TPk»­4Ë{Øk73˜†rôkPk‰¢•òöA#õ–@­ÙM^Uöyœc’þÑ* ÅµÇ)'Ø|)TØ2K¥øÀ/vÝŸ³š[F€"€Ò1 Søs®ëaª 4•# êó“F/™ÒN>ˆÒåQ؇d–AiÊix®Ð¨¶úk>ɵ€¢?†‘[݇OeõÁýÁ0Š~ŸÌ6¨v¸UöA™éhDn{Q(R1,wh(šƒ£Â,¯¨N&Bs®’‰FÒü€ŠÀiš%ÁNYX§œé‘…õdÜXÔ©'º¡:7;Ä”^ëC±BÄ{$Ó¦¦ë{w­ØúêJ.]ë !U28H!ÎmÛU’ÑÉ~ÉgÑÙ8MY²üi‡=|bâø™hó¹'Íï^¨®^Ãæ/Éä2 &‹%Àxt--/ ÿIy *Iå¢ïdÔ´Læq2?æÇÿ°wÒÛ–úfÅS‘˜‰Âþ C‡ÅQà8ÁFÑLÂ[º¨x3»¨˜À²&À üV•CÓJ b³÷Jýü ›ï{»Obv²áx ŒÇàÁ7oÜ(Û¹‹ËáAcˆ¡L.AôLcÉboÍkµÍ=ZÓ]•kTì¹|"—J°ÜæI‡Ì: 2IãDiõ'ª\¾*ë=ÅïÇ…®q¹ÝÝdùcYû@IÍÁÂ5%,<ËÊ_¶E^m¹Yëº'j5,dçrY(tpÒÓú†UZ}BçHùÂ` :Á[ÕÐïÖ¼?³nNÀDK,—‰dòÐ —½©¬®ýSqŸ¿îwŽÖ^þdýnÝõûe®"ûð>ó Ö:"µŽQÒp[xñrý€Úuk®j.¹:&´KùU¯È6d?Hlt®ëSîöØj«OÓ7¢µúá@aö¨z‡Á 4©kDâô*#õvß^ÛH½1 4 Áq½Ó+²Ü­³ß_®q<”Zî)¬HózÇP½Ã£°¸•v?XèE5"·r€… >4#¥‘²J*žs•üH4‘¦°ÅŽã½ªdg%eÅ»E‘κH·(Ü!„cÊ ‰éÄ”Ní*¨"]²¤žüçuU^ÊÈdáÁdçð²Y : £ó¹,XóK°¼µ8Í}Vyï¼cÐP¾`9A÷Ûªön`™/.ÌIèÕ±žšç]2٦Ǚ8®—¼þ¯¥kÏn‚–Åà.߸L0Ó¦HtÖM÷5þíbÃ/ )D±uË8SæCIƒæQ›8yiÇ2üý]ë§ 0áˆI¡ºªb]ÿf¿Ìc›¼Ï8þߘTMššÄ±ßûõë+wÂT…ŽA(é¸$i.Ç÷‰ÉEAM BÛ– är|ÄN›Ðªî¶+G $ØIÈÁ¤1•v IðùÆ~÷³ ÙØi•øcòè'ûyåã}~öïù~?O™×Rå7¤ÏîŸi‘Ó— €Cf[sí*À˜Ô×ZÊ´‹™¶¦¬Ò@[™·C>Û®}tNÑ\¶m-ñŠúy*%$‡t@P2/¥BW991vB!7ò0ÌÜó‘** Æ€¹\`‹ÉLB(h:p6^ÇÈ›ºÃ¾“ÍŽbŽ4¹ùÛ»§æêOÓÇšÕ'™ÃÁú³k‡êß^‘‘ ÇclÆ%>/¥¦ÿáŸ>ÓM€:>:¬D!Æë¼x$ƒ õ¼\Š¥ø?póçÍâó=ùpÛ‚~ „mÞí£½‘ôÆŸ®í|#[€ˆØ8,¢`Îb“‚á‰Mr'''ÌGF„p€§@ðeÕ¹0kD5':k„¯CÏn¥'" P È»ýôük_–äïÂ…8‚àÜD‡ã9,˜JÙ¸cOU£Îø™¡?êz…Õ©ìu©€_79“húG%ö‘|Ûˆä긲oPÖ}[aPZîëMƒ²þ¥ù®ÖrGe½#·;5WÇŠ.ÝÔÛoîS°a®çâ„hŶ2UËgJÓiÏÍÌíù"”Ëå`9e:ëí<ÃoqT˜±¨„;5µª ¿Ûa8žºމ…HÑ›²J•u\rexO³-9»dcv[Ý™—oŒ×õÖÏKí—ïËm®íš"“¤²¶åss0ê~—¾÷¶Öô…Þò%HdÖ2«s±÷+­£ ˰Ì씚ò^§€øq.9ÄýcRÛ¨ÒtOÝíÐt jÃÐ2(íÛï˯L”Úî•Zª+cJÛ7’ž!mï8€MïP„%\2ÓøB´û¡4¢² ƒ¢$Á‡ÙBäîÎc潋” üˆÒx4°æ.ˆýFµ§S7Ói˜é©š1êüJ¦«Ý]U³5 Ã…(O$J š4¹ŽúÂé ÚOëŠÖ ?a¡< †Î´è®~=‘‚` Á×jw2ÝŠ‡çd<,–O¥(ñø#…§]ìíVÙõo%A±œXhw&6gª¿xp=ñ~ÊGó×ó>Ñç´ªömß½ŠyÐø˜Õôy1mÖ|ñ~ñcSíSc…»Eæn-»£ÛÊç[ “L_TºÛuL·|¾[7s^JwéÁ#û•q·•Ó=wk`˜P§~ÆxèæûÊùëWAË çU1˜Ãæ(Îá¬YùÞ©Sžé9&ÜäŒ7ÈøÆ Ký&¿àûôsu‹ ȳ«³7wÅPÉÃCöæGÇߟ;Ñôô¼Ç~óä至ÇçŽ4¸5.:Þ9Ù¸cŸˆ—„ËàóD<†ÅÃ…|næ  ù½aÙôûýa-Š®à 5,AÈR,ÅÑV]p|Ð> ÁAy£EGýÝÿ”ñt~Ô“¾|†Æ‹`ƒ Ga(Æêêê˜øæéðGB‘ ú¥UíèpZHÀ]BóÁ(x‚þ@À•˜QذÀ&æA>ÿðáêÊj#a”@Q˜c‹ƒàTæælÕIMËç*‹¨Úê”™ï&(·G6˜‡•¶1©ið ùV…ePeø¶mªôÊ}©i@rù²wRsiDÚwWÜs£ºoJlú³0y…‰Dñ° Ž#$•øÚ¦­ü´t'y1q|29ï„Qf¹Ee„ ±Ù¥GÀ­÷ôO)?UTÓ,Â`®L7ti¬ûžãb$[˜°nKAõéU¥Ë7äíz·Sb•÷|µ©@˦)ÛŠ4‹¹¹l¡ëÆMùF^Æ.é/U'öÖ[ ÖE©@múFmU؇¥ýCâ~§ØvWbsHí.EÏ ÊâTÚ‡@.± %·…!°Ôr šÒî(ï¹­4»ØÆU]#2@šQ™m,iïEï(ø¸¶×õƒiÄâTÙ\åf ›•ÀìÉÝË„ü‹” G^ÀÏw©ŠLØiÔï«Ý½Aœ•\¼&ñÀ/Ò¬ºíßvôu˜íÔzŒ*O‡6lîí ¦¥x®»¢S³‹ãÂÎIC¿í¬dÚŠ˜ö²¿výuÖjg:]².ÐVT—³&‰c¼åÍ…)€y<ݺÍ+¹|Œ øäåæ§ªÙvéDKe ;†O¦òÐecM…³гùù›Â„³ýã½ RI4oÓÖâsñ¦¼ Lk)€wÛ~w‡œ¹PÈt(|åÞ6·³bÖ(óvÉé6m Uã3JæÛet¨¤ðz[J¼Ò§FùÜEiÀ\ñ]Oe_õ®¢×¨t$ž€ù$ORŠc…âܵY>niùþÉtäÿõ†|ð4µxÐúð.Št,ò‚Ÿ¦DÌ_@®ý—Cà„B¡DìÕ«j%}èÔw'Ïñ¼×ô}mÃß7N74› Ës„‰8P8 CœK"¼õ™Y×¾Žœ4/™¾ŠD%ˆ†ÂŠü÷2¢òµ„%K±/1hÌz­ŽK‚VzjšÇã¡éÂhüÿ…Ö‹êOT&&&jjjR’’AÁ(Œ€úIP;‚‚D$fV«?¾zÐ>Pn÷Èm#jó°®Ç¥5 è­.¹Å%ï•ÚFË­÷”6à³wÕö‡rÓ˜Þì2˜n©lÃE–úÇò¶r6J 9 «Êªêaa‹ÍæálËÓ”¼¦ VÒçÔ™¯ñ„ë…G±´M—µÖ¡â+)02]Å’(æÂ±bû}€C›òŠx\|%{™ !ÂI åð0hcIñÊÌœ´-»W'¥Çp9jù®çÕG¸Hë0@)­yPcu‚‚‹­ãŠÞI©ití¯JþÁ~7qpþ»™’V{k%Y–dÇ'P `Cˆ¡@lÇ€oke­nˆPÊQœLC±‰¡ ¶uK¶$˲C Ó é46Üà+>¦3mšvÊalÉ–,ÙÛç8C™vèL:ÌФþÍ›7;Ò›÷v÷½÷=4MN–.aH<…ý@ž™·¾XQÖv®¼ãsÿà—FÇõ‚²Ý¯ü¤©ä@•çªâWƒ:ß C×µÒNð@@;sTT¾>à4Ð=m`ðIŠ`<ÃÚÎÛ W¯éôhE{_¥XÕ=Xí½üM5 íïÑùFb†’;¶íÛËxåÏD#¬U4«Cv Û¦šl)™rj3€Æm ¸3m)ÚÓíêˆyWÔV9åÔMÙ¬[rjÃvú”jsÑR(L,‚ 1€ÏNÆ$0"{ßþÂe¡¶Êi³*Ôª ;kƒ­Õ¬£:f§Ç,Õ·O(P$5zNq¬8j/8”ù¥:7M Œ‰N–­ºçÙëÒnÄ0 ÅånÉYv”Gj½†B8NÑ9Ya÷>¶µ8b7mËâðD$ÆãuÕl šËï¶×,ZQB‚‹ÈQð)™í¬ÝrzOÆGadφ´¨SûHTA›Šu2¬]5í©#ãšrÕ­†°U7cgbVÅL«:faf¬ê9–Øé˜Su” ˜œP䯗‘Bƒ ’‚á“0Ã0Ayyy@`~?¾¼<…DgvëMb2‰“ÈbÈÎìÌÑw¢Ž7Lì;®?õÓÁ²¥+1æQ$¼ Š¢‚Áà?OC YÈBžUfÙñ±‡àúûó¶äðy€ ½í°V<>CŸ9Eæòèx2p„yø`¬áÇ2ÒÒ!.¬{)˜7 ‹¸h²|]añQ‡ÑI廯xô#tàíQ´õh¼=Z_Ê{Cè×t *Ún™¨ºú5ݽŠî¡ÒÀˆÎsqi-ƒy|T¸ü5ÕAÿï¶½ù®0'ÿyTšˆ%'$gl3¼et~ªúpØä»’±r;É“(NQ½»ÂuiWçîƒá²C­*¥A²P® ŒT$-ËÁq”Jøa\ÒryîVYN>$È|¹Ê@`Ù„0]H…òÉÅè’Ûót?+kô3m×T~`†!uGµ§Gí¤;µ}²¥kexb!átˆ“$Nr…b>Ÿ—¹¤ðæ7;n#m=âZ,.ÏÜPç¼Xá¬ñß©ñÍ5ep÷Ï££_5ž~`]×МÊ|}O"„®»OÕq]Óy“n»ªïú €q߬ûæù¶hdÖBG ‘ˆ­"êf´íyØqøï6SÄaœhUGÚ÷Þ¬ßù§÷´“vì];mQÎ8Õ“Íå!³rÒiøiþ’4|nhB8!A¥p‚J$1K–sŸûs³‘u«§lš)WMØ®ZéHKåŒÛøÐ¢ËHNa\5*òß3äë V­ð¸|œŸ%$‡OVO´–6Uñ‹eIÉ8Ý?Y3ëÞ5ŠáxH,{ã\<ÎŒyÕ÷ì{7É8\AR!Q®•…ÛÖYuÿóé[Ê–ŠÕ Eé­ôª¾&}Èl8>z¾&'—`‚&“ÉKFH_ŒKVlÔÖë=ËÊŽÏU[êÀØÁ®ªñ÷‚L¢÷_eº*;þ>E÷ˆöÌm“ýc[QX  ’;úõWª-×EÙ»h”àLhHŠã8Ńæ¼B¼ºò}‹Î3Ptü¢€¾ÅéÌ<ƒ·KÙ>Rꮸ6¢ôôÖºnþd÷RB#&ÉÚ,ÊÌKLYWxò½·»Ü3,÷j¯Œjܽjç}ÖÓóÎ{-„Ó(„’iç •íîqÇÀÁ'L‰Åh<‘{O4)Ü=ù姈 É-eu9Ø«U¾þª+p:`€ ƒ(`ø`=!”®Xá­²}XëíR].p¾ª4±hg¬Õa@ÅßUÛ$A‰”¼GFKøL&FÄI(IÔ剺.8§ö饒;¿8X&E…lu“J¹Võ×­µûòSŒ0~­óL`ƒy²ª&ÌQߟ3«#f`’kÕÙ‰‚8‘¨É@¯ q;RÃîÔ¡÷Ê·„[«¦MJÀH'öf#˜Áê÷fŒ•œCù‘2—!Q‘|ü \ ±X±5/]_¾]2tAÆY4!£&l2Û™nx{cÃÁÍÚœÕkˆâñ°äÝÉ ÁKUœ­:Ô¤˜sTOšÊg-ì”I3i­7)'-ZÀ<³MĤäÌ Î( ·hºÏªÿiæ:!P ¥¤|ŒÀIÃ¥”lÞ¼Ùh4~ýÍÓ¹…»»ˆ /Ä‘HäEµ‚0·*ÂeoÊÅ!&@¤yòD¯«KOË€aˆ"aåc| !I8tJÎŽ=ús¬ñ:ß`¥' pöV£÷*|4íªœ]€Lôî¡*Ó­}††5{­=T[ëë×´?f}+œAÖ`Û¬=ì¸ÄqÏpùa™} Ôß[iýlõÖ">O„Q""PÇáxšÙyô×J÷}m[÷ßR <„o-¯S;¾Pø‡inï?ìVw‰¤ ö+ÌÙ¨§Z5!»*lS†LeÓfÕ„½.øauGíþ]ëédô‡b8¸¼§(Tˆ%¢«„ŽZ}ûO×ç&ÇÁmpÏ&Âsÿᮾàh$šsžûô“ß‘B1A i’¦ f¢EDˆ}»hÿ­¾î…££²ØC€æææÛ˲–µ¬—¥™™™X b¯±j]Z°/]‘}oK±¶¸– ,ll|ÌÜlÌÙ°Aƒ‰Q†U ¦`ƱèÜ IÒÖ”W¼ï5x{Tî€Æß[æKá¼Ãzº—GËë\ÝG=7u®;†+£Ö^½¿¦= òõ•ûzÕ¶¾ê«£ÀÊužë’]ªð÷qÜÝû˦ÌBùêyëò ³d'Koè|Á÷@µ§OÉc`z$å >Öñ¥°ÆTûº´®G‡FÐ)Ø)½ªí^•ûK…7 k,sÕíÁêö~­»[áî+õ «ÁÜB P¥fäï;ÛTm¿¥q|QüîG4ž&N\IÑÌžzs·39cM¬~qð¬¹ÂÿpW¥ïž¶cTá‘û<4¾Ea]=1,y.\ –;oWz»k|=L^! 'RBé¡“¿ª48d¦UÇÙ5ÏšåcVƒrK:…Ó‰drCÑÚ)GM¨IjQOÙß:S*Û Å‰pøgd‘Æ¢pSiÁš7h*àòü¬½SÓ‘•)X…k¥´ïHg/™¶›6kCMŠy›:dÑÌØ«rL´T|kÑf¦¯‚ ÃÇíšmœ 7Ê9Sñ¸‘场)«žk‘‡Í7פ£ñàj aWƒ3—Ï´ÈGÁ³ ÞÝ Ûr¾bÛÃFu¤…å¬eÅx›6Ô¢œm”=kÑuÛž¾N¬LØÈÐ4Ÿ››uùãö£v]Ø$çÌŠg-Z@#œE6k,™uÂÍlØT¶éž¶Ö|þ«ý®Œ4‚ð‰ƒ‰’p’Fa„!qŒ—°nUÊçÎõ¿ÎFéc†›Ÿå@‚ò 0aÉø°xQÍa~>²ð͹¿è‚áŒR¤0 ’—ësyA‹ˆ1Pd.ÛÉ÷˜dYËZÖKÔb1.­Êÿ7á¾c¤Xö¶´,rÈâÀ ÂÓÜìh… -~òùõýŠECÃ-dp>,‚ùR`…(Æ&19[ØÓÇÌz×m@êön¥¿Oæ‘y‡*Ý=jo_Ô‹=CUþ‘Ú+Czï¿Ù/Óà&Î3Žì§ñ¡ÝÕjwuø]ޤœ.` ;@8Êm¬cW«Û6¶ Â@ÒJ` غmYÒJ2ÒtšÒ6-ÓÒàË’l& ™N‡q_:,iû§ž´¾tè4Íø?Ïì¼³ûî¾ÏîÎóþOÓÜÎÃæ@˜õ…OÈÌE`í¿ü`òê‚­Z®£:دs¶™Ý­&o›Îß«ôÜÛóó«Y%Ò¼ùzO»éjÂÛclê4xÛjšû7Ö^’bù ³–lÈ¡›î²þˆ¦e@Ôp!¶¹nÑ{Ø–!ƒ`á‚Õ(.c”„”ec²¹ÄÂoIä&“f‘…R-šÏØnt’¢|’šCP”Òò*0 ¼x}ÿY‹¡ù÷@ª`7  BE ¦PĬõ„Pø:ôø†¦çæ-*Ì¢t#ýÖ7•F’6j3d ݦzì0Ÿ.ß E³q‚T¬þî°ë0ïÔŽ¼§M¹jÒ6]ßóº"10n."<´c}ÊJÇíúºÒ%‚\ ø¤“¸T,#sŸ“ ) ~@—;yR9ÁÚtñeÜJ€ãG­š˜Û¬)[ÿ®H(®*[scï1I«"éÒ=¬×Œ5â-{cõª„Ñ”H¥ž/šÕ¨[;i§ãNfÔnNÔW&ÞÕN6i4Ç™±†Š¸ý`Ìzh¢Aw›5™4~}dׇo«¯¼¶iÐv$êz dÄ®·TðV%ßhµ˜'F¾‘‰Ú™‡ÎCIge×iʼn«–É%€ñ8)!…B2çyø 8"Ä…¤Xš_¶eË•_¼Ÿäc!ñd4ÅO×ᓘLC|µ‰˜®èg£T†1 ),èGsr ‡š=þÁƒ<¬ûD’O$“Ñnwÿ¶«<Ë|f4£ý§š²ò¯mIN%ö/¼ñDÓ(òåŽ1>‘™‘Ìti|†Jø»Ÿô}ëpqA‘'e*CrÁ_(D€#ˆD"AˆÂEÛô›O4ëÛt¾ˆšÔªÿÂz"ŒÜ\íÑžV­ç¶ÎVûúh—Êb¹C böµCèÜ!½ûS5×Í+ÜC†à}°x-w›õ·«ì<ë[TRB"øÊõÛÕÁ»Ê@Xªôö3ÁήgþVµX4{6g=]·k×ÃFÏÇZ_f µ¯Gïï6pÀ<¬¿‡öÞ‘a„ ¡rÐBòRVN~BIr(§Pr.%,«9®mÚæ7dN‘HˆäJVTïVºÃ/­Üfø¼tþŽÚú*w+°Ç®K•ýôúŽ‹¿eš;L-à< !o¿Áf½ý› '%$–·pIù…ßT»·°)+ЈrĪwUï*Âæä‚Ý/Ïû»ËÈ[öÄmƉËjÞ¾{Ô¦ŠÇ¾`$Ÿžä'MR™HdÎA㘮_(Ø©Vbº„Ÿ&Ÿ¬žY!žžŒ©=(âLùO‡2éA°*Gr2³$ãÉ/o_mgf4£Íè¿®T:Àù·½ºUB‰‘\ER±Dˆb`ÜE`„HT8oÕNý3W•ïÏ:'ãïÓúµ\ŸÎ×§õöêš#p„È ˆ?bâúÌžˆÑÝmfDh0tnˆößzÞPø»Nt\‘ ÃU·»ÂÙzÀq›ñܤa}!°fCS¸ÖÓVüŠ2 牨åß[§|Ûªl¼ù4+ßwîƒl¢¸ˆF•yãâÌo.Ù¦\¸ª4íþ%ÛM»~ìÕx#F.DŸ²ä‘-Z·EÛ|«Ú7”¿x£B–æ4þAí•ðžÃ?É—RÐE~gã>§³Â2{RÖ9¿ÁplmùÔ§¯Uº´×"¾>“¿UÑÒ§¶j®„ÔÞvMKŸÙwSèR#Z_HßÜÅr}»}å×ï+¯ôÓ> šˆ6ЫjêÖºÃ&n€ñ„4Ü}0ôÿB#“Ný°KËÛô#vý¤uoøä‚,‚,£³Ù+“Ví¸•‰ºÌq‹ÀàWÇv92R* I;Ñ ¿}lP®€*ÆÅ‡¶C|=›v2 ËÞ{õÇe†Hç y¢§èÔ%&m©±U&ì ¸u˜£6eû»5r åyÙ¹8ûÚ„».mQ<-Ï1»1î0¥œÚ´†ii‹*e¥Ó€–Š”Mµ«Gì˜S?á0&­€%†q;sh!¢VMÌÆÂ½cŽša{-IÂÁ>n`>¿¤óWmV­™_H YAà"1I‰„8¡d ph•úÆñxæ¯MaÆt/ð?ÔT&SY wttÌÐÅŒf4£¯¯Ò_ÄçŸÝ?÷ÎÙ’eË1ºZ2Ÿ‹QœÈEÅÐüy³q¹xÙ+¥ÚÊKÑÎ[l “y?¬ºÖ£âº"L¾°!ÐÃz»Xw—ÞÞÐx{hoHíË€¸3ãí„ÿó…ùÀ!0 ›» à$ÐÈÔ}ðžÁÛUV÷ŽtÁRQÖóTö ¸T^°fóÓhäÕƒgPŒ’ãˆ|é:£óOJO,Wí Õzo™\¿3pêÀ=MSçú(* Šªd®újHgïD©| Í’QRÖùGÖ׫ö÷~Ÿ>, òÄâå5žÎÚ_1—?\°t.ÉGá;`¹"RR´¼´¬ÂŒæ/ÞTúfðì×yLWð«ý£Ú ‡¹g >0Pm„¬¢() 4Ûn›³ ))ØØãñŒ1Ø¡!Ûv·i’¢®Ðª«F 3¾À7W´‡V9ö6›H —!æHJÔô­V-IxöwÙ(ýsÙHþêÉš7²Æ¿‘õÞïót¾[¬÷vÙkÆŸÖ¾÷jÃÃàí£;¯œüÈqòœóŒï¦Ñ~­öc»î\'c»b Ün™£Ý늜ÕûÇ¡ÉçE#Ñ^ú['#ðì’Ó$¸|ª)$¤ZH`ø|§EðXböƘƒŽ]Ò výŸÎÕ•`…R©GÄq¾1Á›–üm¤8‡@0Ïÿ•f7.õÔ }oõYK$Ű³`7.;Li—n±‡)WÀ*Eðëgëã6]âÒ1 ¡[êa.êö© BA ;HÚÍ&xfÑi~½¢XA (ÿÜ«‹—¸pçhª>X^š+òH¸F•{¿“ì4€Ä¢Óuh'·™„ÞKîfgã+nög·; Ë}VÁÓ´Ú]¿i©¼Àiî–˜Ûºìh^v4EæDÏé„Í*I84q§6êÒƒyÄ7 ÝÇ×ìº%ž}ȳ«뿜Ϳ?}¨­ZU*CåD rˆ’aJJ¦Î‘¢"ŠÂô'•;ßÿù{³‘°^«ñïVÐSÉ\ÿ/ïæÉ $ý$Å$“É--*›l²Éfó<¡ÈGZȘd9‘æ}û÷WIÀyœ‡"" ƒJ0)ð !!)yEYuÛ֋ºÎ«ÖPXïšlY`‡ç|“ÚÀ$ ë›h L°Á0çŸâ¼aÖ3 º<˜Ð†3É8 $3ÖïfµýáFðý‰SÞºO‡jÏûZzol¦‘’]U²î¤7Ø8ÿ°Ñ;fòŒ±ž)ËÀ,;t¿>pïÝÁ0Q¹,§ZèíŸÞ7Zûñ C* )«Ø €¤Ü3æÔ{Ž”â áµúØÐŒ®Ãár’ÉIõË{×ÿ:xð—6EYuL)Q’„Åoµû¯Øžk%£à|\^d Lq¾ÏÕÕµh¾HˆajŒT*`XŠBDQyÃÙnëàÇœÎaAý¡ñçE# Å/Ù¹d¯4î¸Ãëk:Z©À1Š€$ÃÖCñ®:Á]·êЀî·çL•<EUÊüÏ×ÕDùuɬð´éÀL ÁRYõKå¥ò—s±¥ &s^T²<ßÅÔ?öƨ]ÿ¸ß´ìhLõêÖøæ´­.ádBíÍ1—)a×­öênn³:×4 GÌ΄<æ¹G6&Æ€ˆ–슃YµÓI^—´‡Ó)Þ˜r˜»¬àw\Ô…,o6ìý± G0‘BnG9 Ã%„ä¼€Kò*Êwͧ¯_½–q{*‘Ì,–Ì5húOS$ƒ-̆F2Ó-×Q6Ùd“Í÷'olY™“Ôw÷S8G-ìË/ï··_¨¬¬ÀÅq“¡"¤PJ*a)Áa N*Ô{ªŽ´ý–¹xÙêù‡98fŽ0ƒó:ÿüBŒèB3thÞx2‚Cp’Žr‘ŒC þ0 iñL¶ /Ôûæ´C ôåZºK‡l¦¤ …Ä8¥ªýEp…aðŽqà;0äcÜ¡ý­oºÍûw‰²˜ÄÄ8"~ç³?0Á‰×Z{FÀ9wûžÃ†¡y}ð~«oVUAâ|ˆ4v_§}w^Ѿ¯@sŠÊª¶ùþF¦ÿÄ©žáÓè7(²µ y¦*PÌ3•g“M6Ùü¿%³Se6ϵ'Y¿ ÎyIpêÖâ©t|}œû°]%WQ8%“É0A11ŠH(·XIá³_çÏMœgÀÿ€NÛClI{ë°1Æ'G8p8¤¡b˜:Å`lkwµ«Ã²± MIÈ@šÐä€é¬ÓÈÒê²I§0Ó !”I lÉ–-Ù8éù ÓfX²N[}dQÓÆÓ™6 }çwÞ]­¤WÚ}÷ù,Ž*–—n|¦Ž{QyêW:‡ŸÆ•Âçj/cL)Œ)ãY“xð‡w©=c:$'ÆÐö µ¹Ç9÷$íž =AÚí½äøÊƼãÙ{äTÿ*Ýó;Ö7ó®çg<xo‹gTÓî4œarbQ(Bk¿XÚ@¿Iâ)•­ØoêCš“}(U ÅHT\Óío«Ü¡\ŠJd(¹~)]ã¼+¨u}²ìéȊĸ¤Dßwƒóúë_ëÅyq¾ªv›j`´Y”oª_ •mo;Î÷Ýèöú71/+Ge"lÕSû˜Þ+Êþ0cv¸Bªàâ‘i³*jP§ŒM ³.bÑ'z™wŸ §(öôŠŠCÏTׯ“/—•¢âbŒXZL ÞŽÝ)[ç=‹öK#1øøxS©¸PQô­*ô‘ÝëËŽ6lhÛzûÝñ3|Ê ÉØ»â=lÊÂÄ,ì=3›ìå“&.iRÒ½mð¸"nh‰Z#í³n¡yF-긕º¤ÍLÒÔšèiM§Y9ÐHv§‘»ûsÖÿÊþS-u;VËpÑ· —KÄrñ’2™”’.-(ÂQ‰x)!¢HK·¼î×_ü5(O¦ ƒ…‘=/øÜ©H§Ó¹A2™LÏež"™9¨üÏ–ì¿Ïü“EnV¹ùäA’O>ù|c7«¯~ˆƒ;X*{ †–N¤sƒ™ì öá給¼ª %1J!Gre’Ť¤Àp QR(_A­ÛQÇåÞv¾`¿|Xø¤Ý=ÄyF•îQ¥dÃj§ªpŽ"À’yd_êVÚ‡x!¬uê<÷&ßw]+Ò{î/p0möójv…UŽ«:ç5;Èúü*ßH«/D»F÷¼Ü#––Q¸b]íNTùÆží2ÊqT´d ‚(62GZüFeí6D,!%"|õV­p“v ®ß×!Çqس¶A§õ†šc:ß×óÁ’åë¡’vÇãÞs±LVZ.ÂÖlÜøk•nzŽ|ì)%k8nf~?ðùWl8R¨@5O6ðŽ™÷ÇtÎq­}¸ÙíX4%>iÔÍZ€F¦,q[«Gû}L‚ᤌBåÕèb”@ P¢œÄ+1b³üÑÞj™î=”éÑ$mºd¯jÆÂÞþ™Ê®Û<ÑrÏÚ=mäÀ 𱕈•Möñ)#1°q‹&fáb&æþ—š¹)—¶µG 4ŒS6  (uV ýBóœ2k65ÐeÆL§,ªh¯þ Û¡?[~tç$}¹kב]+Ÿ¬& )"Áq¥¨¬Y$EE†”\\$’‘GÓ‚Ó½™MÍNŦáLLg²dæœ>¿^`…þ_K|Ž÷_Ïúü/’CÈæê"”¿ôœNàk:“‰%(™ÌTúÚo®tñme%ÅI("G±)‘ˆâ")VHb…XÍ–êzÕΣ¿l¶|ÄzGXO$È!j1 !°°Ù2ð)“EÈ„Nq}Cj÷ï sîÉ5"„ôŽ@»s„÷L<´>¿Æ<àúLçð«V!ÌõÞü^ÿÖ½ôŠ-;W>Kk}“­ÎÍ{Êäx))–H¾#-%0 ‚a¥R‹JŸjñž‘Ý]oâ©@‘¹]u¬­?ÔxúÂÊÍÏQbI)ÊÊ;½AÎZßvE%2É¢Úïíd½“:G ê‰]58%®ñ'öפÆ3¶³ë‚¢(QIE-|øÕ&÷ ÞÒÙ‡[|ËFI£~ÖÚ5ðw-])»ò·/íÍžqEEÒRQü)ˆ”Ü_[Ñ£ÙΞýaú éá1KÓ=#Ÿ4©VzÖÂ|iPÅÏvÆŒZh ‡„»kV§lÌ¬ŽšuI«vƬŽðO¬—ƒÍx—éÕE{T9«¤,ÌŒ¹u¡yF­ºì1feÚBO™¸àëÍgš7iÖË@I¢‹)©X*C¥Û8Pš °òÊJ]{ç…‹—oÿíND"~ßß ’øtf&•™Í®Tföó0³à9úGâñøº.¿žÌOòŸVw>ùä“ÏÿGÒiàÈ}É$‰‹/l﨩ªÆ5’’€"Hh°‰¢(B)VÕíÚÝñjË[B·pý€gâ€g¼Õw‹öMО°R²®Q€Iñ´ý#*XbP ½w¸ÕT ·xç'L¨@)®0纄 i8à#ÐæÖ Ãjas rÞÁ…ôÒá×8ýzǵÆã&ÙêíE" HqyeÍÖÆÃaeFnmà:nªÝ“¶«²5ÛE E".‘)H1!CäÅ›öè]ŸªÜÃuìK„d1FÔ2‡Z\èpŒTm®GÐ̾×½ý3kh#Û%#"|ÙúÆ.­ý:í ©¼“Lï`»àX4±e%6Ò‹júÊd_÷­Óª®Ç¿ûz}•aÿ†ׇO4Muq³zƦJ˜ÔBÒÄ%Œ*賓4³Ð@,³&fkƒµh#mÔ¦±ª£&ÞïanÆ VQÇ,ì´ Žç¡Ålêi+?e¦£V:ac§-­1[×èIÆÞQ¯Ù±vu NI å(QŒÀUHÀ |ÊõÐàÊ\½rÕ±cÇ.]º”LfÿÔ\ŸO>ùä“ÏÃ’œF Ï=pHà©1•HN„Çßøéëk_÷üÜýŸ,ÂKPªŒ”“"ablYQTlY÷¼¶ñÅÓݦóÝö+m}×4žÎ7ÎxÇÕçþȸnÑŽ,9Ô®Æ1¢µ3Fx_@åb…!Nh]£m®°ÞùwöË5¶©ó À?÷oc!ŽÏ9ö±Ø!ÑnLÍÂ2 $tRË-ŒØ±ÏÕvì\HÃFÕÒi-í6Ú®äâ»ûøØq(ÚXÕUÛØŠ!ñ-‰´Ri¥ërñý²ÏX‹Âì×&éxOÍFÕÜœîÊ=zbé÷ŒúÊ¢Ž éÙÛ½c3¸ç&31wš ©€Ÿ?{á@§±Z¦Àખãú³¾)Ò=ó½Žó_*ª±ºàçL£1Üs«zg“°† åÉw‚†‰E½ª¹ã „5RE‹¦¯ÏûW‚Á¹á‹R\h«ØHÎi*ºMÀC²VmÞE­Yˆe3rö€ÃŒES°Q9 V  i;Pr³}VìIžr“k.â_NâKñOù;¾ê¤“NÄšIš©¬EŸ³òæ®’õDiøE (åË]]Y·!mÓ®\¶œYxƒ êŸýYëÓmõð.a&‰Q)&®CáZUbXƒX¢A("ÊaãΣ¡ëÊÄägŸ>…Z‰r¹n¨a !…Güÿ@<<<<<ÿ*}»’ƒf^>ÌåA{Ïe²•>_I@·ÿl95võc`ö>½ lCj¶að9Ékj”ˆ¸®üÇUZ-’nÉ‘úo=ÕÔÖ¬8õÚPŸíƒ3Ü-wºÓVûªñ{´‘ôÅqoLÃFˆ@” Á°6p‡æÊÁ°Ó@Wô•ð† lx3gê}!Ú7Ëxg™ÑíÓ®¨)p¯“×O.i¹09™ø ÑcýþÑÇyÝè 1®éàH¶›ŠC*‘îA¶Ôÿ‚䦨÷ÿFº¦4]‡UƒW‰Ñ°>kÒ¼ÒrŠ9øb·Öõg& }3GÞkxæð΃ÇÛ.™¸Û@¢¨ñ8ø@¥¶Š¤†éô•¶k–Δ]“s’Y3ž&ò ˆ‚ÏY´9™¶R)+“´ln562k%’êԈ˜LÁAdΦ]óô-;LË6ýªU—¶2yS› i€º$-ꢃ(ÙõŸ27/¨™£½ÏïûÎn±RZ…ÁÛ¥bH*•"¨¯Ù)‡„õ¨D‰±*x'Z÷\ë³—ßùM4ªØòcRÉyxxxx¶&À=J ÉŒÕt±˜/•²…l$z÷Ý·ÛÚZ@*ÁP „!\‡Š¥H**`× `YuínEÓѦÎþç^Ò]ëòý÷Ï09aÆæèÀ<Å-P¾yÒ» õÇp.†û#$¡}!êòÎ=³›Ùp˜Nvšàf˜@„ö‡Á%ÆÀ¼ÆïS£w¨Ñi­^í_¢G§vÅhÛ½ÿÓn¼Ônz·éx÷¤™Ö~  Ο,u² @ÿx‡—ÐqñÏínÿ^çŸ(˜tÅÿ>z»ß{Ãà¾üJ˜ŠÞ30z,¼Ul¤d7É9t„$$Ĭ-ÙËîQÑJ¤l89kg6µ‹1mëJY y‡)gÕ%/k2#Ú¼/ž* u”lÚ’‹ÊØñ”XsÐ+vfîmãÄÀÉWOjß¿»^ c"¡¼ª¯êP¬‘H †( ¡à+‘‹ ©Fªn:ÿʹ¯_øðaþÑ­\)ÇR.—æ¼~#³Ù솛Z¨HõÆ çááááy’]½’T„$ÿˆu3Éd2{~©P*fó`-GLÑR.]J­æÞ¿<;гï»{1‘#’:±¬–É L)”Ô 1HDXP¼C$F;÷îÛ÷cêG†óÄ›£½öºÙ)¦<ÐãÚ±%-Çý M Ñéƒ9PŠof# ·¨óÆu£ ¤'F%4\” Ìãl„r‡iÇÍ—Æ£¸'L?Q_þÞ³_W5о‚¾Z§TŠ„5âê¯að´aO³ªÛàœ¥ƒ‹øØ}=wßàMh=QÜ3qw;íaÓäÝÓã!}0†æLÞE"°HŒ/–_(˜f¢açÉ@\ŒWÙB6’·è€¤­TÆÁäLÁAgÍ8’5«1é0®Ù»Ò.ÓšC—uR2k¡6Û'9¬*¹è²oX5 2"ï¦WFT`5fÝ—6ÓÝËÆß¾üÂ[§¿O6×µ7~CK0!Tˆ°@$•@ˆ\(n@*‘a) !J‰ìèƒo¼üÚ&®~žÊ§€i”í·”/®×]ññ[X®ÕǪô?ltž' $›5íõçAÏ/ç…hñåÁ/O…òš4-ÀÀ-dóùôƒÿ7ûeúÜÄyÇñ¡i±±¤Ýg]>€4M$¡´a Ó™¦l0Á$>¤=´’%Ì‘6Óp$)-MÓĤ´`Ë’l,kÉΛÐf¦%Í0|è´|À ˜¦oʰ-iuõ'«xÚî;^0ÝÏ|gçÙgµ‡žç™ý}6‰ðœcãó›1aF "¤Ñ€¬jDd#†×tV}]F &„ɦMM¯´líz»ùý ¶ßü²'x½{ä+Ž3R”Q¦¡âƒ¨¬f#Ýò­éöáМs8åPf;FbŽÈŒKJ bÌIÙ†ÇY9ÅÉ3‡Ã)Gïè »ºê­M4iE:¬G&Álýζ¶c?£îÐ4+Æy)æIt‹³Œ2g“¦ÝÁÜÂ5:w@IrÊtg8æ‘v1Æ„Rò4دÌòbJÓ¼”`ái¥è“b#à¥Ag1àÊû„œvyÐHÞ[¯}ÑÏÝ÷Ú¡T¤äV»NÙk+¸¥ßw-ô9†Þ¾xgæ¬ëò‘×ß?°£ëåõÛÍuÏž²êk,$IÒæ=…a¸…0šõ„E‡êNê¾i¦ÖXpËŽ­;O¼óÞ_>¿ö{‹¹B9SªŒšª–‹¥J*R\Yo¥*å‡*R¥*$Ð ]=ª©ˆ†††ÆA6›ýGW^æ+/ÿ|Y-@í¬¤R–+A±TÈWÜdùÓ5_‘–Ê^.{n61 yŽº7nÞHQ‰C”U!#ŽWíê.aøº-M?ؽ­ãHóÉs¶ Ä9ƉÑÕläàg“íÊ8¯L±J”K¼%O¸ÆRÂð'ÇlJªLft<wHÓ¼2Ï„“-½—ZNžî?t\wŽ&;–eÞtF&@„ÀI:F§;" î‰2'™èM¢ct\¿âÄ©žPÚ®Äà²N)î‘âÝ¡œ„‡a#©'ÅFTP/“9Ï}Ý9¯ð Ë^ô<8ÊÚ˾.u ³p‘[òÙÕ!!ÛϨý«^gê,{éø¾OÚ·þdצ½[7 o™ µ4BàzŒÀ š¤¬nD˜‘",n1#‰€ÞyöÙöÎÎsgÏ}yõZ©¤VW)_Ìga[.ÜfË…L¹Y*–óå¥\9[QaXˆdE9TU­öT…deÅV°Ò©¡¡¡¡ñÎÝ»weY>vìØÎ;BP¥@O*~‚hTÛŽ,z¬',ˆ" È G´±á…—¿¿«¥í÷ég†‡¾è‰ÜäÃö±ä[cÓGÓÝrÜŠu+IAIØB“ ]JÔ‰»G®`Ü£¤¡(ø'Gy|ƒ ßf”9›4È3œ¼)ÍË3à]‘¤=œ]aåÈ /O rÚN@x%zÃK ˆCN:¥¤ Æ `#.9%(•@?íϺ¤˜KœÆè È@ZææÝ?.–2«LNÍÁ•?9ókJ_«£š°šë'^_ðñLnÀ®ú˜ìrr~ö_s`Õ€#3Àæý¬ê³eû:ò¾®¼·SâA*¼]?“õÛrûrlÙ lyЭö³y¯ppîb¿½0ä\h+Ø3¾vuоØß=K^®0Ô½4ÄÝóó×NíŽÝõQçþ‡›[¾÷üÓ¨Ž0à8"Á3!F‚‚6®3)º:Å+“[MkkëñãÇÇÆÆîܹ³" š-hhhhhýí¾–½Ö­¯ /h ­71ÂD)Ò„! šmÅñ=fÕQO£u[6lkÞÞÖ³ï𯘼oŽÛBqNJ°b|À%'øáI—>›·Ë©N)e“gmòœ]¹ÝºÅŽ}í¾æ Ý<¤LyäÉnq¼[žt+S|ð†32ÅËãñ¦Sžr+1—4%„&#㬜`¤8„S’¼œdÅJ8)®ÆÂHÉjX)Í(3lxÖ6švK΋aaÄñ}-Í0 «ŽO> CT,•Ï~ø›z ÇŒ Ýš?ÿlOÙË?2jÀ™ó YŸ£²õ ¹€¶Ø>yà|ÂRÀ•rç.zÀ^Ô>¦äs”]%¿÷ry¯¢öóK aÁkÏ Y¯­ìgK^[¡¯³4ì¹wž™û¸óOï¶´|ðæNáµ—ö¼¸î»ª é,ú:˜ #A›ŒVDXëôF0Iƒ@ r‚ôXƒÙ b¹¶¦Öj¶ìy}÷©'Å‘P*‘,æ °þky<Þõ§¡¡¡¡¡±LUHþ½îTJR ”J…b>§þýo_ÿñò•“ÇO´ìi6‘$8 Ô2d@˜£‘¦Ì˜žZ‡¬úº·€±”‘6á“fd ŸÛ¸íGÛZ˜W§^=ÖÛ|FrK_¹‚q˜r†=‘´KŽ»ÃIfø†K‰òJŒ•¢œ·+‰Ž‘˜MIÛGou*³Ý⼜ᆧ#3|hÎ!ÎóÒ¼ Ü9¤Iœ ÄJœRŒ§x)*(qW$éM: ^‰Ã•ÛBñCÊDÅ1ÔTÑ)ü@ë\¾´úðT†lä£3‚¬Å)“nÍçïµgöG&çå³ý\Áï„dúØ%/ZY80ï·LÖo[°f,øE?—ó²K˜Å~6ãsfîLàТ¿çÁ€ç^¿'õËö«ï¶Žmþ¸clj7¶ó¯½¸ç¥Æçê¿Ýˆ,M´Õ„fºµõ4iÄ §hÂ3b5$H²¶ÆjÐ5 ®3Ô›,à$úÚ:-7µµ¾qæç¿¸réòlz&—É¿ƒY©ÌøÃa¨ø×CïâÓÐÐÐÐЀú³Z¹)ýG `U£ óóóW®\éííÝ¿wÿúÆõF›3a’´Ð4Òë1½&)œÇiì&´Æ„×b5OAé·FÚ@Q:¨œþÉn™ÿFqÝü?hB!¶wæsìzÁæH Ð$4…¤j! ïÚÜ—Áfm“&=ÄQ5Á9l6ÐÐBHh*0fm RÕVUZÒv1 ”6äUU©jÓ$öî;ýÎŒ=lÖGª Urû>þúù;ß÷v<óÞJßÏ´YófÌ-»´îɪ­K^<¸lçÑê7~¹©õRí‘‹5­=O·_«íøcUÛ*Ûnlh¿ vQÓÑ[{êZUGïºäå5ï¯9yeCÛ•êäUˆªã½UǯU'¯C@’踺±½¬TwôfCòúÊŽ›‰Öžº£=ˆð(Wðy±Òr{ä–k»?Ь]»ÀF dåìä6|r¨vØÈ¼•H½^i¾Yeÿdcÿ¡õé7«¬·€{¤Ôõý´î¯Ößhˆwo_عu~çÖ§š%¯¬[ðÂêo<|õÜK¿žW„Â÷EY¾*‹Ri'J~(,Ó(QØG1&…dŽ)¡"Q™ɰψIÒDMcÌ)„AÌšñðŠeË_®©#Ù~ùRϧâšU žmº¦5xÊ`žC¿`ªétúÞ}ã@ h¹Ð‰ü1(ú•좷G;†ax½Ìùèoÿè|ïÜî†æçŸynñ‚Ò©Ñ)\":Q4ÌUÄŠ‰¦< b®È„Š W* UÕ/‚#…!ÎÔHDÆìHaªäiÓ”is¢³¿9ýÉŠ¹K7Í_·¹´nÇšm¯•¼’\½ÿW5GºjÛºkÚ/Õz?q¢gmÛyЕšŽíZÛz¢ªãfõ‰׵ݨj½³±írâø•D{ï@$¯­J~°)Ùûôñ«!ªRG˜ºbÉr÷}FÀt›t?,hÞ½W§²M‘gÍiY1oب^ðè²9Óⳋ*™{¤¸ü±)¥³&>QŒ£벤ÊHE”cFÇ l$¢‰Ëù EîæÈ˜kQ¦ËÃ…XÑ% {HeB ÜçS¡É÷ƒ¨rIáBØÉDBTg…}izy,¾±:±gßþŸý⮋½ÿìÏ€C€`øâaæ]½ôô 4öÞN3ȃ£ÑT@ ¸§ í89ú‘½Òí_ÐàlÛòfÝþ}m°»y± #õ—?ß9óÛw÷ïkÙ¾åù‹K¢S'3M“¥,LqD哈)æùay¼<á N9…V¬` ñ(?®ˆ±‰Œ*’ [‘)“yD)T ´0‰j4ÊP$¢O™>ã±Ùs¾>óÑ'fÆ7}uå÷æVnùZå–ùuõÛö­®}勾|ªlçÏWî·êðùš£—ëŽ]1q¤ç»­·ë¬;ôžŽJ¡ˆªWÄ*¬”9Òþ¤@Dl×Fw63)1*ÄyãaCcŒÊ2CH!„S¢r¦)œb¤Pa®`^(!]Æáb,M”BQ$M¢4‚Ï“x#¡T†P†$YWt‡©ÄÀ: 'ÏzjñªEe+ëZ^ÝÝr¦««ûÒïûŒ~× Ýí·3fÊ1RŽÑçXýÇ4x‚®Cf‚ÃrÉvÓ4³/}!bލ@ð_úQ¶œ˜†åd²§ Û®„8f&#„å…᤽ѱ§?m]ì¾ðö‰ä÷4½°ù[kâ gNÿJQ¤:,EcL)f* ¡N¸"H4¦¨”sL´iLÂfJW5ªªf!aÆ õƒ`Y¢&a9ñÝ,'êͧ“&è}“çÒ•a¡’’'׼_»^±¡±E£]aŠ®‡BœèÃÂ*ø†¢F„Ï—¨„ÂÃ\)HÒá5¥E 2&BÊG- ¢‚BDe,ñh¸¸tQ|Aéê5ëŸÝñÒî½ûœ:ùvçÙ3Þ¼n¦>r,s ÒýNÆ¿°Æ͇?p:ï0|ÙÈØFjÀFÀ(rô2çX}ñp<9rVÞ£¯’@ Ÿ´!¿õ mRÁ¥ßí2Ö@#³Ûr,Óh„¦}·)ºæÒgZ;NÚ4¡3zmÑm–®¢ô¥RwîÜé:×™lmûQóÞ›·­*«(‹—O™<ɘ1FA’Ì8Q1†÷P)h ñ#,cUFn êŸÕ1Ðû)Q 3Јâ‚q“qþ89\„îWI¾ªòX,6JÃM;žX™Æ]{ÁF0ÊÇЉÂIhØ#B—%ˆF:F’!*Ê—Äcåå±x¼,V[]ÝX_¿oWÓž¦†ƒo<Ûuöܹ3ÝÝÞ™}ŸþÝý·vÚ1ú\ë0Ràð¶áns:“²Àý2°Ë°§îþfüôÒ}Þ…“2`ÂuÃ;SÿE÷ð=Äù¬fä˜IÎú{ö `,tÏ[·n]¸páôéÓ‡njjjnÚµamåÒxøÊ¬«”C(„ÁˆC2$UE!r-HгÀ¬Æ(ÂÈ!‘ÊŠÀ Ýn>A/¾}ûv§ÇùóçÏLww·ÿ AÇÝ\ ‚1Šíá>qŒTÚ2LH 2–íØˆ«Wz/v_ø]g×oÞùõ±£­ûøZËîæM{š[_møÎ³ß^±lylqYYéb—”W”Çâþ—ñr¨ÛvgT_)HFìì‡÷B"ÁØ"ã14÷ ”À¯Ãhš¦_€Ü¯ŠɾƒaÁe*•ýy`q¶‡@žmCÉž…ÅBE@ [­<3ˆ_„¦sCÃôfs*ÃæþJL†_L1–¡À“øÏ6ºŠ8Yš”})`¬ðŸÙHŽr õ“ Ëòõ#ð¿ò¹àÿ‡@Brr˲‚)ÇsƒlÉQ¨XP÷oešfpÛàVA2,†ad/ðï6ÊúìYX,lD ‚1J Ý<ã©´e˜@d,Û±3nâUüâ@}°2bxŸõWÂmQ}áß”–à±Ï:ÒÝWÿ‹ük›_¡ endstream endobj 1 0 obj << /Type /Page /Parent 1704 0 R /Resources 8 0 R /Contents 9 0 R /Annots [ 2 0 R 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 2 0 obj << /A << /URI (http://www.synthesis.ch/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 156 670 280 684 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 3 0 obj << /A << /URI (http://sourceforge.net/projects/expat)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 206 617 400 631 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 4 0 obj << /A << /URI (http://sourceforge.net/projects/syncml-ctoolkit/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 181 571 426 585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 5 0 obj << /A << /URI (http://www.zlib.net/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 240 502 342 516 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 6 0 obj << /A << /URI (http://www.sqlite.org/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 252 456 365 470 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 7 0 obj << /A << /URI (http://www.pcre.org/license.txt)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 170 421 331 435 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 8 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT6 1665 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 9 0 obj << /Length 3400 /Filter /FlateDecode >> stream H‰œWÛrÛÈ}çWLùiPE@¸_öM–U.mQ»ŽÉMœ¬ò‘ˆ50(™þüÃþcrº{P¤Öë¤T"€¹ôôôœ>}æíbr±XøÊS‹‡‰ç+x„Yà$¾«$‹œ8uµØL.®ÚT-[ãªvYO.ÞÏ=õØN\ÇuiÌrb÷¯Ï“_õ‡Ü²'Ô=}­|eýsñã$c™J\'‹±H:±+kð|ŸMÑ[‹¥ß}´Ú¾kÙ^àÄÚMÕýAÍu·F‹¯ –t[¶êòýTýã?–á{‡¾È‰ti¹z¹žªùsÙ}-v t^¯,;ÓêßüËŽñîyg¾ëÄøX¼C{ðüüìXãé–V-hY˜Æ’^]lnišÖléz1ñT©&~;Aì© qÒTÅž† { Sµ+&“·‹!‡!îËhŒ‘v)"ðrñWhÎËsÜPŽŒßúx&aL/c@ƒ¬hÊvëÒ²± ná6j“×û¼’6eyÏg c¢sÛVÏV„mîø—'gº“æSе™û`Ù±nа“>>,y]í°vËjnÁýDÄ“zy+ãf˜­®ëG3¸.Ô_-;•u0ÍeS«À§BG&¸ýSÎö5˜óÇOû˜S¨(JnWÁ-/`(¶ýæþËÖÄOT ðíò¶h»-}/ogªmºç|W¨;=gܤºØ=;ÕìÔUUuwg©UÑ.wå}±¢Xê²Ve§hβÙlƒSòÉ|òFŸ<ñiW>®»b5UÀüZåU¥¸¥ìZZqå¨Wܶb$—äÕ«^oòƒª›NÝêÈ!6ÞÏÄ>—äFñç”èe±Å^Z‹ÒS5Xeg…hÒ|dd)…ÚJsóT®DàÐì¥IÉÆòjVìùd —îB ©ª\µ±fšc _½øbV)¤A~+‹rù ¶Æ³ Ìî]'~‘Oª~< 26Ù³Ï;€=ÔÊFô€ùO·ü9£•ù YÒ0ÖcÃàŒl( 'TÑ*Î%ÏU<Ž´m,ÚÙžøN5Fõðñ[p¸3ÃG#=ÜVÈ`§–¯îb+½´ÿV,-,tÀ/œ¿@¾ñ7íÓàåÜñÊØ‹xÈÀN1á! @Õ–A–KÆT¡ÂoW&C±fH]£Ï¥" Q–µX"íqÑóÅUcÁiüD:kQ)é7Kp£—eé”~3B¨§ Ò>¬1'/ÕÏ4·¨-¢1®ó¾&‹ûÝœLo†É®xL‡löÀÀjÖ­NQt^%¢„"6z? ž82¨æâx€N:†œ¤:~6M…?—¼,5œ! 'ëÿoÀ’ø½ÁŠ@b`‚¡ÃòtSÌ‹` BZ <ñËvœK¦€ª®½hTÈhC›Ê>²ÛaGŸËnä›e!^P9~íü9¾B?„:ïÿ‡¯(´…ß,>.Ö,Õ<‚BðtCB·§Ï”\ŠGÂ7¯ÑëûÍèBúZV#ÄFƒ‚q¨'ˆ_*§f 3Z½œüdÙˆRÿU5[ófFAåši=TR½ÄI<÷ nÔoÔú=·ÞÔœ Õ­¼+eO…#‹ŸÊ#»7ÎÌNæŽU/‘ ÉJ¶ü{ í{&a „IYÎÏÿ' `odȱjÛ×;d Ëjh϶©§êæííTÍšnßNÕmÞµûv-Cº\]5!Mª×‘Þ×f2ï6"8×-°ڷ±›S½Lu…©Ì.ÞÁh#iïNö/"Ú>v²k8“wò¨ò©ú‰c!ߟ-ªÑ©Fó4Óšž®6<Û©—NßÑZ,i°LÅvç`zh"àå;H`Š´k&2®!kpA¤æœ$ ~$ÁQ”“Ó2¬.™±D .@¤l—bQèEbTÒ‘fáˆUÑþtéf%¡ËQF¢_+ŽP¤ïO }»áªnj[j†¨1B:óñõ€Óf"Fǽè)Ó å–ÔsføªÈ²øbéQþÕââR•”á¾wêÂJ¨¼lçXlçzN T»®QWVMC×pÕqx¾Ív¶—9Á1bI%ݧ˜‰Ù0 _)76gî…}ÔÿUyÏ\ââçCG $@RÓãRz¶ü{ ²ˆ%½é»S¿›a×b‘\ϸ*t"7>UC웹ŒþXäµ]5û­zŸSv&äáÌ|cŽw c·äL¬Wgàh£³e† Å-PPZÒÎ>‹¼¤\ôÀÀø ÚàOFÈÿèé( ‚Aè¿0dg%?:¾j¢àU V¹´ä÷y[¨‚n½‘\zm~ù¼#ç8º¯ÀÛ¢RrŽq ý/ÆuUv…Ãâ „8 –èÜÃ.å‘úþ.ÕÞáit^ùú„¤Ù3oÀÈy? „W¯)ÕM ïw2y”ýÇAJé¦2Æ(>BêRíl—;æ9•˜£’"*tÒr½,œî ñ º^Åq,ßeVˆ±\ú=ÑòSƒ%ßÿ^Vø þ’¡lÇGe;漎%¯Ó¡l‡ÇJ;¡|NN³)sßÏÆhžë‚_Do ^=üF|mÓ-µ‘PrÕët·»Ê7÷¦WšWÅIî“t £^íœhãoef'î‘ìó;ìËÑÕ©]Jª\žå¦0!±ü3mÄÛx¸ZzcMë/0¿´Àf¦ lÍ‚nëD…Ñ]—ÛKËåzOï"ϰçDÏh¬´6ð*’k wqé ˆÜVªi}9³;ðU¢Ï&-©¨H#ׇ²~i»úÐìA²¸læÜirúÍœ7Љ$rE G>îÛ5û¦ºñ°!7Ë®U«f¹ßu^Ãê‰.QÌ¡¼óNÑâ¨:UÍÑ~vèê†Êiº ™ÛÙ #4ŸsïÈ ™ºÓçÕ~Å;=ô_kPþBñ›¼ÞçÕ5å…¤±a0˜õ7y‰…Ê:Ç€r‚C“—Ã\¢V™_3xæC]¾ŸªòAåÛ-œßWÅ”ãN¶·»æ©\+õær®næo¤£^©ï tÙ­›}§àè.¯%‡p´ 7Kây"csˆøå{¥®?A8~ø(¸¾žÏgWïnæW³Ë›[u9›EЮ·æ…þ›ÈúKÔa-í?~¢{ãâæšÔR‚b‡äšÒbH nKõ'ø_Æ«m9q†þŠÍLÛi¹”eú<ìlìÀòÿ?²GC/<ô…ÄŠ, éI^Â/_凒ؠp‡º·{²KIˆ­ž7H»Zº™?l˜¹Kâ¡êíM^0zc q ¿8¯PÝ0tŸaüZêATRµÁš®ÍÕ‰h,o7É¥%‚Ýf»kÇÎ3ƒ:º°‰„ÅMìÿžQE¾X X?3¦£ÔÓÉD¶©U;GÝVä±—‰$ ¡\U—ôkG}à[" Çj8SÏ®m%Õ¨ê?Nöë}(³.16{w•âÍ…–W+7UNãlo#¸³s‰o,k矨„2àÑÀµ˜â3;ü—Þs×ÛN$ÒŸ|,/È7'¯piÁ-–ürÊÇoø¼gäõ–‘J|Èb™A¿÷4È™K×ìO}šƒð‹áo+ÛMË8ØÉÝðÍ,~úúÌ}쇂 ‚‡…Ž6nl£¯r^þ2ÎþŸjP¯O”x}w5Êw‘n]ÌþïŒópuÍ©9øŒZ(±Ö0wÌ Ú+f®PoÌ$„à†}^»“¥£øîqt¿³ßØ‚ðÂÚdô4ú‰ÌtB7Îx¦¥AŠ`.¼·-{Y8‚ÈVÛ.:$F.3Yÿ¥^ȧ³V `î|.AFï!eÛß“óÙD­³bÏ[uø]{I"“úP¤äx‹4ðû¬Cc¥àQ Ϲá::*)¢ÓÈG×m©mL9s–AfTŠàGÝbuï+£D%ÔäI‚ßéJúÒãX„zÂb+<m] "}- #`ób–¾˜•áy"Õ2ÃQ«GèJµ§¦Õ0Å$ºÅĹKTEØapclŠMffón{ãÝV#scÍÚXCÑ„#8ø ÕÓW ÏX0Jз‹z‚‹ê®+ç‘ÈÆ¾„̶ƒfíÒ øsa$ÂÀã–¿½CË\EþeÇ‚8¢‰¡ÂåÔëúÒpßc¸ ä8î¬Ùò‘BOMw5NºÓžFð"ìEl !6¶(WÖÏs{|Ì€?÷9\ Ñ‹Œã¸ý`ŠÖwŽ endstream endobj 10 0 obj << /Type /Page /Parent 1704 0 R /Resources 13 0 R /Contents 14 0 R /Annots [ 11 0 R 12 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 11 0 obj << /Dest [ 399 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 301 655 370 669 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 12 0 obj << /Dest [ 399 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 422 655 434 669 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 13 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 14 0 obj << /Length 2208 /Filter /FlateDecode >> stream H‰ŒWÛ’ÛÆ}çWté%ƒ*Â…ɧ”lYŽËVÕ2¥$R@pHŽ`\–Å|ˆÿÁÿ˜‡œî€+’ŽT[µƒžîÓݧ¾[O^®×1E´ÞM¢˜Büág¶J‚E¦´X̓t&´>N^~ß.)oeOHm^N^þøѾ„Aòž|â—§ÉGõ>óü$˜©½æßXQB޿׬ÄÀŠa°JqH² ÒО!ïÇbŠ¯æ©µô{ŒU?=?J‚T…KÚœéá\v¬ÄJ{°¤ZÓÒ«§ô¯ÿzþ÷ žÍƒ¹2^¨òÔN¦ûn 1’¨¬ÜzþJÑoò_“è%²8 Rܬ_cM<8N—‘jùTÍÇÂ4Ž p"¸Ü-ÄÒëID†&ñ< ’4¢d,—”FÁlFˆq¶¤FOv“ïÖ#I„-á—h\x¹þÌùš¹|Í‚pfS&Wž‹™dÏš¸JÍ܆ô¶ì¡Ty+D°íóÎxKÄP•{¥1§A¸üä|Y˯ŠÂfFÛ|ðMþî'ª›Šh§”F—]KYK'Ý™—âôÖ› E­nžtƒ‡¦MÖê-Á™ª‡§)£ºÈº]ÕÉ”[í»¤ùQ%’+Žpq va]ª56—Ýà‰.÷¦ô¢eãÇÁRäE¡Z{s qð"eZ¹´û4 ·yUî̾oàRo—L¹§ŒÜµ‡#Uî MÿÀ!v7íL¡§t:˜ü@Çì8χcù½ùXxC<Æ0¿IX£ëÂäYÇgV ;Á c³s€ Zœá~ðÅ8&»Òy±Ê €gÄ…Ê-öœÝKÁ\ëBtƒì˜á±—¶2ž¹nN‡æ ]ó¾õüšvçEøO窧¬ht¶=Ó!{ÒtªšG`Šæ<ͺÑO¦Àx'ÿpñµ …ʼnôü%Pï`s¥Pjv;:54¼+é¶×?1#$cJ‘œ›Úç£hpž¯ØyI9Ãæ¯³ªœ¢uÖÚ$“(Fï€uÇ>¥h&˜Âñìè'UêÓ'òCVóÓ•ê°ñÅa¦H²îOÎý¬O¶—/¸äël¯)b·#ó1ð^¢7à Ǭì³"¸) ›…嘅¥#ãÁíĺ ³Â-T3Ãâú¢ÿ]Ó²ë‰ò½x@7Q5Ÿ)›É­+ˆ)DƒMÄ^˜GäJšÞÙUÞ…Mìù”˜9Õ÷¶xoŸ“îòØÝOT<&*v‰BWÀ]ÇÆì5‰' vupÙšva€olÓÈ5À©ýÍÙ¿ZB¿‰³{ðÐMb[oß›­v;ƒkÆ|ÞÒWÍsÍXÑ¥Û]Õ½jiS¡Fªd/3¶æFÎN›¹–qÇuÆŽPnS*²µÓêœl‡žÉÁ²(Îr(hø~¾_<#¸¡€«ô¯œÜš£yЊs‡zx漜ÒÖìМΧ­ëì7ûÜ„ñä£Z` F—ýHÀÒ oD §Ëœa°cƒ§·RgÇÅ0…®F-¼Ý'c¦G(÷GIzIŒã²Ñ‡ xÞRV)ããÂùºÛ*ïÀ" - F ‹™&èSæEÏÕ#wì¶½”Þ\ yÛ…)Ó U|Ϋ#zmëÌbw'Çm-áÇ®ª¿¨¥cÕvcVž±ªÃKÎr ¹áâ†fÈMoU1€£ÌE9PØ’[êªÛé12’ÿœ’6½)P=½„QLEÇÁQ;c©_ëÇÃë¿ÝRžðÀl´Ï—lÿ—²8S]±(CLJŠ W<ÄS,¡º¶9¹·¸l“ŒÚÇÌs ¡؉eÂÌTÎØ‰]»‰Q” ²?=^Š 9!qì2ð^ÎìÈ(Ž¿@ÈTŒâBìáî•wb¿Ú@@ŒˆÈšwIñ¦oËŠnêò“\·Ú×ø)¾dΑíÛRBBiå©’]u@%O¦Ï'IKÌÓVñ²ÝÂL”=e n+ÿ5ýAÆ•ë2è¼Fì¾xÅæ<žÙlÉM0WPØPˆüãܓّéЪڕ[Yêuƒ á®|ºH¶…jì.cåÓ\}]']é¥=Áe‘ªÂcÍÀz—]o´Li^¬dâJ×YÀ‹#ËаIÅÚd'Uçn¾x¬ÉP:â­ÇZƒ» =XëCÖL_0,{ÍZ“*Û©z2ú„ôËÿ^ûG—"&6¼6¨~íz ½Ã4YÊðÊ ÓQì¦T§m.`AäJÿTüê®·–ØÝÕhÎæî„¬³Ñò;Ù6«;©U¼Ëå*[lÍÊ’'¢ÐÖZàÝ_ª“¶1/Ô”ËÆØç÷+õBG¡£#©-+¤ rˆ`Ñó¥Fg¯ÔéËöA«4`CtûDÌL»]~èƒÆè“—x"àóÆ–+ju¦NÙ¹e&†ŠÔÜ•×Ùø¨8Gn¹ck¢c{Kµõø3†¥E]è«~æ™v˜\[Ï5¢¨?H€¶k̦·°âœsM~›Îh»¬DêÊðàüŠZø?!7ò÷gn%é7üÍ SmýÛe|¢éadñt¦~ÐÌò¡ÕTîvØ4 ‹ê½Y²VØ QÜêŒU¤hËQN3˜÷…î¨smŒ¸õ˜¥1[öBʈ¶…ÏÐ=à¹G±˜Ë·Ã\bfM¿”IÅ_†4>ânæÂî3zÿúÍ31óO«wñÉ úoK+TèâsÉA–?òçMVž¥6m.´ Ûú#t(ÊTèS4$•ýqà @ÊìX‰/ ª˜ Þ{ìëk»o¼KÍ·êb=ÕÉêªi´{PWåÖ}–{þ…}ù@sÊé΀þî^åj–´ÉòÇ6`t‡|RÍEL?gZ>6¬Vxm—Þ¸0¦€t:"íôé¹êEŒeÓ»âúÜkâó<™º‘0 \À±J N‰ºÿs·ý~XOþ7ø‹fá endstream endobj 15 0 obj << /Type /Page /Parent 1704 0 R /Resources 64 0 R /Contents 65 0 R /Annots [ 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 16 0 obj << /Dest [ 10 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 70 722 527 736 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 17 0 obj << /Dest [ 15 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 706 527 720 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 18 0 obj << /Dest [ 399 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 688 527 702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 19 0 obj << /Dest [ 399 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 671 527 685 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 20 0 obj << /Dest [ 399 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 658 527 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 21 0 obj << /Dest [ 399 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 644 527 658 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 22 0 obj << /Dest [ 411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 631 527 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 23 0 obj << /Dest [ 425 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 617 527 631 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 24 0 obj << /Dest [ 450 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 604 527 618 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 25 0 obj << /Dest [ 450 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 587 527 601 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 26 0 obj << /Dest [ 450 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 574 527 588 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 27 0 obj << /Dest [ 463 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 560 527 574 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 28 0 obj << /Dest [ 463 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 547 527 561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 29 0 obj << /Dest [ 469 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 533 527 547 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 30 0 obj << /Dest [ 469 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 516 527 530 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 31 0 obj << /Dest [ 469 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 502 527 516 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 32 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 489 527 503 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 33 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 475 527 489 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 34 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 462 527 476 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 35 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 448 527 462 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 36 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 435 527 449 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 37 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 418 527 432 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 38 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 405 527 419 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 39 0 obj << /Dest [ 507 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 391 527 405 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 40 0 obj << /Dest [ 519 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 378 527 392 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 41 0 obj << /Dest [ 519 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 361 527 375 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 42 0 obj << /Dest [ 519 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 347 527 361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 43 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 334 527 348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 44 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 320 527 334 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 45 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 307 527 321 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 46 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 293 527 307 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 47 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 280 527 294 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 48 0 obj << /Dest [ 529 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 266 527 280 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 49 0 obj << /Dest [ 529 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 253 527 267 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 50 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 239 527 253 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 51 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 226 527 240 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 52 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 212 527 226 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 53 0 obj << /Dest [ 543 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 199 527 213 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 54 0 obj << /Dest [ 547 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 185 527 199 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 55 0 obj << /Dest [ 547 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 172 527 186 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 56 0 obj << /Dest [ 554 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 158 527 172 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 57 0 obj << /Dest [ 554 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 145 527 159 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 58 0 obj << /Dest [ 559 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 131 527 145 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 59 0 obj << /Dest [ 559 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 118 527 132 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 60 0 obj << /Dest [ 563 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 104 527 118 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 61 0 obj << /Dest [ 563 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 91 527 105 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 62 0 obj << /Dest [ 567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 77 527 91 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 63 0 obj << /Dest [ 567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 64 527 78 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 64 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 65 0 obj << /Length 2319 /Filter /FlateDecode >> stream H‰ÌWÛrãÆ}çWté%ƒ*‹¹àöäò^ãÔ:qY´ŠJHH€‚Ò®?$ÿôCºgp£€¥DФ£­Z$àœ>}úôëÙäÕl&€Ãl1á<ü‡¿T,ÝPx„±ï‘'a¶š¼z³‰ ݘk<ؤùäÕ‡k·›‰çz]“N¦ÍáÃäö}âL¥«Ø­¦ß‚石¿LbsƒBÏ|ˆŒÜÀ³Ï0/Ì­èÈìþ+ðÓ©ðœ)—nÀ¼n>Ãõ缺ÃOÓÞ‰m² |óá+øÇïÎÔÇó¿ó]ŸeŽÇÒ»¯àú!«~ÓåÒÜD²$Ÿ;Ó˜ÁÌÿæÅ zƒLxn€'³·ø™yƒ‡‡ב.gzª¦Çâ­ñ‘.z.­?º3wz7›pÈ`"üÀ•ºQw•Ĩ"(õd1y=kÉ/ñvÙè˜öˆ|ËÙ¿¨^ª®—r=eKfŽ>Ceª×êÅæÏßy¥ójcnÓ»ý3EÚ©CЕ4¶4p¾Í«²˜oÓ*+r¬«‡aîy~°Ž1Þ]J7÷,pb³­NjKô˜œ©¹hŠŒsºÐ 0ºú…½!}V8Ó€åô_…ú‰PE»ç¬(–Tœ ]gà1õÊg´ómÁáq±àç;:L:|²4 L 5ø¾Æšž 5>Ñcœž#ªiÔ@,d¶=јÈ.G0åPÝ¡'¬’|›P×{1ºÂ9` arNÏâC”Á!(e‡’·(yƒR4(ÑÓï>»ü6Ë5`zäúA—+¤íní /,)õª/"/õ8~q(¬èPX¢å×°„¹±ðN¯\¶°°|t®Ëd 'ëNò['Æ—×V©Ô—"Qãgç+âcðYr7ŽwæÂ#‚LÕÍ‹ 9r#>ÖÎzdKèè=¶îﵺ!Kªm©‘‘H]’Œ>!¾ÿeBv)ø¸r…ÿ,J:ÅtŒt„Høsñ@ª^e·¥£p'•†ŽëˆÙóbEŠ·ÂPØm‡ØÃ_ÙvmÔf.Q¿:ÎT…øÅñìØT€^G¿†Þî0Ád¸Çàekð»7^s¿Ï¬cË„ñYgXçéáÉ<}àv˜¼àu²ÉRÀ“êu…’äù’Ç8ÐÚþ†8ruÑáT-NÕà„p‘Ýn˵ÂPÂñ¹p]•[Йܥ> ±±°ù)åòs3Aá–Zø¥Ø÷M4 åðwœc7TgS°qzyá*7pm©­Éáü”Œq±!S}h/z¢ôúé.|eWM‹ Ít¸Öå=Îp+جuš-°ˆ¤í&¡µJ Žò}‹0`<>¨ {¬©IÖjVs¸OÊ,¹YêI(i‘Ï3ÃfÌè[œ÷iÿj³§3ÞŒ–ŸÌoÚ…³Y]qšÂu±-S|ÕEQâ‹/·xX, ~Ç ö!É )Œðưë1#Øü¸ÉòÛÝä&Ãb0¬Í.Ö– EFƒôdOŽUîñS…žr¥?­QnWTµk– $Ën¶–OqŒQç@7×§0 ^¸ì› Mä{Ìøz«Àœº£!>sa&ÖÚž–´Px¤¦ü©«4÷åIW$ƒ˜¿q¯Â~‹Øoûp•-ñ«lAè$Ëû'WÕ¥N£ÔÇï²ÚkHô«ÊìÆ^ˆb ­suü¹dby®õò®ÖˤBƒ²õ\¡®»ªñJVgßd¬8áÞÁlgÈÉ; Ñúaø÷ŒÑ‹þµØ}fÙJÃo®½¸%Î1ËÇl‰Î†]íŸtÂÒ*†Aþd#_ØÀÙTÉj ¥^ã^§MûrVÕ1ŠÎ¹å™$?ñd“ÇÇÉCMÁP¤•þT™Œw¦ù2Šp¼ŒÇúÑFÙSe“ÙLýê¹±Ú/뺠뺮éj× \¸NËl]Q€ø˜ä·[Då #é6&N·NжH¢Áá绤‚4ÉáËdéù×vž??Åx¬G0 x·ºÑó9UÊ 4Ïhü°1á›p®!Ëi¥ èêDÓߪð…àö9 ndnV+“Ä3”{VÄèˆqŸ·´"â,з١èÔ†wó!¼^é¿)Çx'çÄÂÎYT¾# tL]þQuµõô]¯©g÷®ö5ݺ}Õ˜¤ÂÇ–9€·I•@õy­ÏSËCˆðý–‡}"„£"Œ–#,ÿY,ˆ½þÒþ‚qµþêcVé2YÖ#ô‚ Û‹¿o=¥kì4íÅ!qÚì0ëBGA§x.:h"øX¬­ïˆÊãþê)ü?ÈÄkð"îµ»¿Óî¦ÛÑ0йÏÇx ~_­Óæ°æÓÈ[~øÉ‰ÐXä«%'P”ûïRüXR¸Ç-¼Úùz×L)ÁH‡µ7h7z3¢e¦#¦ãEÀÇ"ÅõÞ‰iy%V–¡X@÷ØÖ~ Ëé\/²\Ïa±ÍS»6ñ0:­eà-i»•Δ~ Ñû{ â`qHxŸéåî±YóÜZ\ZYL½sn…ìµ68ÿ²6,G{ô¡Ü >P=ô¢à›²L>·äpC”z¡Kí„nÀò”¸BªÄùS½¡F¸QØ3ÒGÑaHLŽpcyhˆ[qQüü?Ý?¥Ý?ýçšÊËÊ"Â\ M®4Ä8¨™€e¦†£è£!Eºò Wé‹dÀpÕI E¢¡¼6ôlñAË–Õ4ËûÊáÁehé¨9Âpƒçî¾¢Ú&R-? >,‹Ü_n¶55´80äõ‚¼¤xŠ*"®à“X1¬â’#ø)'·3õÍX ¾´¦¼›Mþ7ËvY endstream endobj 66 0 obj << /Type /Page /Parent 1704 0 R /Resources 119 0 R /Contents 120 0 R /Annots [ 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 67 0 obj << /Dest [ 573 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 757 527 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 68 0 obj << /Dest [ 576 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 743 527 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 69 0 obj << /Dest [ 576 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 730 527 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 70 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 716 527 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 71 0 obj << /Dest [ 604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 703 527 717 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 72 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 689 527 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 73 0 obj << /Dest [ 638 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 676 527 690 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 74 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 662 527 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 75 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 646 527 660 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 76 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 632 527 646 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 77 0 obj << /Dest [ 669 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 619 527 633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 78 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 605 527 619 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 79 0 obj << /Dest [ 675 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 592 527 606 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 80 0 obj << /Dest [ 682 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 578 527 592 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 81 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 565 527 579 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 82 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 547 527 561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 83 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 534 527 548 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 84 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 520 527 534 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 85 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 507 527 521 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 86 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 493 527 507 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 87 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 480 527 494 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 88 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 466 527 480 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 89 0 obj << /Dest [ 697 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 453 527 467 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 90 0 obj << /Dest [ 697 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 439 527 453 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 91 0 obj << /Dest [ 697 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 426 527 440 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 92 0 obj << /Dest [ 697 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 412 527 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 93 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 399 527 413 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 94 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 385 527 399 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 95 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 372 527 386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 96 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 358 527 372 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 97 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 345 527 359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 98 0 obj << /Dest [ 721 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 331 527 345 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 99 0 obj << /Dest [ 721 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 318 527 332 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 100 0 obj << /Dest [ 724 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 304 527 318 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 101 0 obj << /Dest [ 724 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 291 527 305 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 102 0 obj << /Dest [ 724 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 277 527 291 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 103 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 264 527 278 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 104 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 250 527 264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 105 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 237 527 251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 106 0 obj << /Dest [ 733 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 223 527 237 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 107 0 obj << /Dest [ 733 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 210 527 224 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 108 0 obj << /Dest [ 737 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 196 527 210 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 109 0 obj << /Dest [ 737 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 183 527 197 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 110 0 obj << /Dest [ 742 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 169 527 183 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 111 0 obj << /Dest [ 742 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 156 527 170 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 112 0 obj << /Dest [ 748 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 142 527 156 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 113 0 obj << /Dest [ 748 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 129 527 143 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 114 0 obj << /Dest [ 748 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 115 527 129 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 115 0 obj << /Dest [ 748 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 102 527 116 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 116 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 88 527 102 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 117 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 75 527 89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 118 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 61 527 75 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 119 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 120 0 obj << /Length 3058 /Filter /FlateDecode >> stream H‰¼W]oÛÈ}÷¯˜Ç!1~3 t“]7‹¤»¨U hÑšÉÜI¤Öv~HÿCÿczîÌ¢,Y¶"Ú¬IކçÜ{Ï=÷‡ùÅÛùÜe‚ÍÂeþáà'ž¹NÈ¢$°ÃØñؼ¼xû±YÖª=k³êâíå•`Ëö±‡öd³þôöâ_ü×Ôšy¶Ï—’Ž.g³þ=ÿù"QHXäØIˆ—x±:úê~W=ŠÎ‚P?é¿.Vg®cÍ„g‡Ü‰Ùõ=»º¯º¬¸\Zxo‹–ýùò ûçÿ¬Y€ë¿vÀ ËáÙÍvu[tßd³RñxZåÖ,áì?ê¯ú0…^!s;ÄÅüÖÔÜÞÞÚ–g ÞÒ[%½Æ+mœ:—™¥õ¤ç‚ì BÛ ó";ŽY(lßgÀèǬ‘‹‹æžÀg—-Ó1‚¯œÿ6ŠRâkþ¢Ð±ñ¿¾¬ 1„‚NéóC[ø¶`W]STK¶ØTYWÔUKTøøxû•þSÜxÂŽ"C.}¢Ž¶þÎÛg âè!º‚Gê^$«pt¶ú6÷!êÉÙ&óÌ ì˜Í„ ¢ú7=‹Ëþfái4s)]7«´a?Þ­ÙZx× õuµÃ^ðÒìiÆ|Û#ÆÜÆ(¹?äGØ^ò,~¼§øñا´“ÌÂkP4l>¢£”;tˆWI&Í *8–Ešõ•{ܸ¶L“;þC:¾Õ•Dq¯ÀRJ©w2g ²“ð 6Æ| ,|qÆz¶’c5§Èò±ŸHñó ÍÛMÐY:°Oòz³d«Zi%3#Š<>J!ñ:z¤‰qí8ÚQúíïJ}4)î~%©OÈ~ACiÆu”¼¦&¢œ$Ïå1+ÞCV<;‡X‰{VÂqªÌ¶¾alÀŠI”%5«6kŠuG©áâñ¯B üÁóƒ=|ôý[|ŠŸ¤ßƒŒ4H/@޼Q AF(}nÙ°Ÿè¬Xu’ŽR€u}÷ås€p"”xï^wU CºÎhNw§©ü¾c.ÛŽQïøšþ.g¿¦m‹†ëqVÖ¹¤Èúó—kÍ|•±{Màh0eìˆ.û!m‹Œ-( #“˜ÞXçõ ¹Ç©Ëôz{àb®gFÔhßã¸Ý#•Á|ÎeÕ‹B6-+*MÉ8”½±Èý+“ùJ…k´ Ú´KÜOö(HüSë@ü}öñò3ûIGÿÊD_įþÀ9/ÍGáLÑà ØÕZfEºbõZõ* ùG5ù$üÒ¢ðϦZ¶FÃø`ìºayÚ¥×i+±¨‡¶wœNˆ9왓ï.b@ç÷èB@… =™e5u;ŸW‹biÍbåÞà†x“x|T¿`€M ö¼Ç÷v!ámÈ5!mv)+Ù ¢—«úå?Öy£q²_Ö½9ƒž…'áEVÆ 0Øw §÷—mRÎÆY£¿¼_™¬ZY¥¥üðF]Z1Ekżwì‹Þ€ŠI ¦ª·è²ïÍȽzCr±÷ez—ÕU¶ièl+Û–B<ÛEÖ¯²UQÕJtb˜ œøl8J>èË=õåe»l‹oD™Z ¿#i̾~a%¾8]ê‘’6¼t$¾OÖ‘¹ E}ýÛ€â®(7%ÊÌ@<Äœ‚ÙÛ¶fýé€ZY “ÏÐ2¹¦Þnia‚pIm]Ì S„6õ³“ž=; °ô͆!Õ‹-ª€ð!?®í‡&ÇÇÓÁI¶æ5Q¯´ªi *e½é>(’ÞQT|>8ÚÀäÜ2òrçtÛ¹莠2ÁÛGz4NtTÙŸËë •ù':šé‚]I“ðnp~ï‚ÓŽjÖtE-Ô R/×N=ÇïndÑåwÀë6#ínØ¢n˜bq]²E±¢¸$c‰ûm]’@×q¦ªmo‹ÝGmËÊRîAõÌvœÆ°¼h­ñh¡2·UAMÚ§ 0ÅrÛ+n{·¾÷8BÅiõ-F©1Î UßKļL;d‰}L ÜE)¯,êýUfÑäÖYTÝCj0}'ZS4Ýœqˆ'ߎCƒxrAbÀ÷ä  ûÏ"Ç;.~‚F¬E½Ê©ño…Ïã,¿¯Ò²°(@3;TÝüeþBŽ))ÏêQáªp&!ƒªÆïÕ09¯vÜã}QÐ,F NI‘ð.-×(òXµT.-ª™Ñ†tµ2Y”ð›ú–n·Hv°E_²¢"Ž@NìŸ\pÊK‡–éÄã‘êÀœ¦+Xº›F¦y‘“–>ÔŠB©~bŸ± ø'#|HÝ är7¨åÏèp&OÊC¤3 ßÑ}¡ÿJ ê XQR/~Ðûv(*úµ‚˜DˆGD¹§' Ñò„a4âé4Fá«q*w®f*ýDsàqS0£ÝúÔ̺å¨éwգ׆Çkµ%Ù­×Æ|»§¸Ð¡dÄTsÐj`(LׯiÈ*ïjyWè‚ÂVÜgH€ ÁnìcÐÎúÙÜ6E'™6wÐWÜ`î&…5“ˆ¾U_è¿àŠfKFÂy®Ú jGs&1Oj ’ÔjWSeK3dí¶]x²ýMÝ`w+fª´pÂm+ Çè….o®µ\|ZIi±`)²@ EÍô>º RŠiÔÀì±ÞtlÑÔ%S©lžeQ͵C=2*Ä¡Frw¢x;ñqeš\cÙ*L=qÎ7pŽïX¾±Tý•kvu_e0É=ȓ̳¯9˜Ä0ãïqÿ…]{[ðXw× Æ¼cKÝÛ+Ù OLß—úÇC0 .8Ç'cJùƒ3IzÒQЍ÷ÔrýWùÀQþµ ÕR6Æ[’~Æ|½®›Næb›á‘‚ö÷¯ŒWÌå#ïùPTÆŸ¢• “Ä þ‘„šfðÒ ŸI^²·•&}8Ö(™­ ¿R‰´üëUÏ›0 Dw~…W¤&|0tËÐÂvè†bSeÀ–ê€D=ïÎÎB‚¦É–ħèÞ»wçwžÜuaÅ ¸S«¦§bÈ¢èÿÊãoHBG&.èß63ÈØK=1„Þ:ÇÇëúÖ@âý“¡¤wšPŒ³¥–oß¡4uCx˜rÒ†ž¸¯7z—îŸml5~Xct‰½Ÿ»¥·Mþµ}Ï©„ÁÛÇ’‡\æy1»bh endstream endobj 121 0 obj << /Type /Page /Parent 1704 0 R /Resources 171 0 R /Contents 172 0 R /Annots [ 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 122 0 obj << /Dest [ 763 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 757 527 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 123 0 obj << /Dest [ 763 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 740 527 754 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 124 0 obj << /Dest [ 766 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 727 527 741 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 125 0 obj << /Dest [ 766 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 713 527 727 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 126 0 obj << /Dest [ 769 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 700 527 714 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 127 0 obj << /Dest [ 769 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 686 527 700 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 128 0 obj << /Dest [ 769 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 673 527 687 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 129 0 obj << /Dest [ 772 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 659 527 673 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 130 0 obj << /Dest [ 772 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 646 527 660 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 131 0 obj << /Dest [ 775 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 632 527 646 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 132 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 615 527 629 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 133 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 601 527 615 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 134 0 obj << /Dest [ 792 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 588 527 602 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 135 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 574 527 588 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 136 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 561 527 575 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 137 0 obj << /Dest [ 804 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 547 527 561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 138 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 534 527 548 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 139 0 obj << /Dest [ 827 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 520 527 534 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 140 0 obj << /Dest [ 831 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 507 527 521 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 141 0 obj << /Dest [ 842 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 493 527 507 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 142 0 obj << /Dest [ 854 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 480 527 494 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 143 0 obj << /Dest [ 854 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 466 527 480 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 144 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 453 527 467 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 145 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 439 527 453 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 146 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 426 527 440 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 147 0 obj << /Dest [ 865 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 412 527 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 148 0 obj << /Dest [ 865 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 399 527 413 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 149 0 obj << /Dest [ 865 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 385 527 399 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 150 0 obj << /Dest [ 865 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 372 527 386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 151 0 obj << /Dest [ 868 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 358 527 372 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 152 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 345 527 359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 153 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 331 527 345 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 154 0 obj << /Dest [ 882 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 318 527 332 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 155 0 obj << /Dest [ 882 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 304 527 318 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 156 0 obj << /Dest [ 885 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 277 527 291 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 157 0 obj << /Dest [ 885 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 250 527 264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 158 0 obj << /Dest [ 885 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 237 527 251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 159 0 obj << /Dest [ 890 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 223 527 237 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 160 0 obj << /Dest [ 890 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 210 527 224 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 161 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 183 527 197 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 162 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 169 527 183 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 163 0 obj << /Dest [ 910 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 156 527 170 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 164 0 obj << /Dest [ 917 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 142 527 156 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 165 0 obj << /Dest [ 922 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 129 527 143 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 166 0 obj << /Dest [ 922 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 115 527 129 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 167 0 obj << /Dest [ 927 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 102 527 116 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 168 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 88 527 102 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 169 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 72 527 86 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 170 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 58 527 72 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 171 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 172 0 obj << /Length 3331 /Filter /FlateDecode >> stream H‰ÌWÛnÛH}×WÔcˆ6ï w6 dL´‹ÁÌìE¶lîR$AQvœ™Ø܇­ªæM’mEëQ“l^ΩSU§ÞÏ'oçs$Ì—iƒ…ÿðÇ3°-‚È3ýÐr`¾š¼½^‡¬y뤘¼ýé‹„ÛõÄ2-‹ö$“i·|˜ü.>ÇÆÔ1]q«è×àƒñÏùß&? ‚À2#_Ωoéwðý6?ŠVž¯ŸôÏNm˘JÇô…Ââ¾<Íž±…2ðIb­á‡ŸÞÀoÿ5¦×xÍ3=‘–HîÞÀ—‡¬ù¦êœ∸Hi$àOþŸ?ŒÑ32Û2}<˜ÿˆçø LÃ1¥XÓ[½¯4qi!¸¤=uÇOº™O$d0±=ßt| N`†!øÒt]@Œnµš,'ïç=ŽÄ-Ö6Ó1‚_9ÿÅËÝWÇdàÑ{ÆTFCTZ.#ÍŽ‰œI³¦Žõ‰Bÿ¬©*}T¶T6Wï&\ÁœöËñ »[ášV²;Ñn[’‘ÝêÃM#Š\û dÛ÷Á¥É3›l—á¼ügL]úz_ßrŒHii&)<}¸óžíPï™:>nšJS´Qs*;¥ÒŠÙ5%Ìþ­T•”E¡’&+‹«wð×ùü3à0œ%¹‡?üà# …¿É?“=`òzL^‡É†Ùb³\ªºVMýH(õbý jD§/A¯ˆù$,K’‹'jÀ,ÄwÊ Sg ¸§àÆàQ¦ùÑyPªÛCu;¨̪ºlʤÌZR®V(Õ_[qdILуŠqùBïDp.¥Ó¹Á•g}9¦.ÌªJJn *&X¦¼ÂâŸÞßüúv~ýÖª¾Ç˜ÒN(˜ G¬ ÀWß º _`],|OdŸ³¬ŠÓ´6¨Ú¨õ±åÙºQ…2B.ý¶;}Ú‰Àhu¡¨9?ÏEm¿ˆÚ‡Y¹P_)PY¢ò§÷F€ ºùÚsPÄ+ÌAÛ‘¼ÿ3l£ˆö¿ó‘Àlmîj§ÍñWT!é¸È8ØZ$5Š5ÆR“¶r…òÞnì\— Úqð³_€%mKò5#2ªö“ëMAÈ L(ˆ±g’NÄ“ižCÈ…»Í C’Cg1 Jت–Á¥ò„cîˆP}SsZäŸëèã«’ÄŒŽ– Þ¤,šº$ĶÈA_#¡»,t[ûfÒZUªáCrq–Kp6vG¸ça?˜úèöïêè”ôßÊBõYL`‹U™RSøÇœSýþ/ÅGPo~ûôó ܪ‚Hr…~¦ ñAw ö±$0v©±ËýŠwá¸G0Û˼Œb`äxUéØë“ÈÀÆ8ÏŠ[@È·ÐºÉ 2¥{÷’Ü“¦ÙíàGÀKþÏíýŸÛ€U¿Q_›-ÿGóIˆ¸ÉFBû?4¾@µÓ[–­ÿ]Ø@ELƉN÷³]yÄÈ·ƒž}o¾ªùsÉüa,u„Õ*®ûŠŽ"šæ¨ÚW•ެŽ7ƒ_Ä:Èœ¾H‰XÅ> 8óþ±bÐ4IóÐÎ~=% 0œ#*«ÁíÔ°ÏÊ%KKv[£tcGV~ÖýPŠ…ÁI^ÃhJ@úNŠõ!Ø}8ö¾ï’ ÌŠ;ª_èRîvw$†6t6ä‹5Ö=ĬáO¥sj?‚6hMœ¯ :–¢hÏágëì{ĉѻ"Ï˵ªšG< ÄQãtI,[à-ñ¾RS÷îoŸ“ö>èSuñ rôƒ¬Š@O 64¹%.h¥¯§:ëïÉgÀ]Ì¿ƒïë¹ â¹ y䞈#!áï´€ iW*YÔGBdÀzµ,é²# ö²Ã˜ÒW?“Ò ïJŽƒ à—¿\>Ò@ѰmÌ,Y‹2Õ G§ªµ…žû jx’L\¹ÃJ[U#kŸ'zŠ—ü„Óû‰¡”bÂPãCiôf"Dw ?ƒts1¸8mb"ìÍB§:op Þ€ŒÆzžÍêÿø['>ÞLÔ«_°Øá´^ê΃öʺ-y¦ŸÑPãìžGF¢gçy”šˆêI°?ø]Ôxd(íqè­uŸÏ8‘x0º¿ŽëTg{M¹*ÒWýVí Þ.èž©i Ÿ£A[æÐùhtM…ýê ò£jCÒ´MÐxÉäã UJÅâEVÏѱ%á¢,8/{e À·¬jÇ¡Îü.²‚‹µÎ¦nHr¸)âE®Þ¦™¶½­‘^äÜ?è³wJ•dqÎ7%¥~ÛjÇdÿ!в˜êckÈ"Õ¥Àè­ƒå:kÔªuìT€‚“†³óÿtqÆ´xÊÐíîå±²œÝ {¦w¤Á{.¾ÇW‡!)w‘i‘•E®îUÞ†úúùmÀû¸¤±lÔ¶T^WKÅð ‘ÐÿSnÙ‚sF†ìÇüuqó[ÒŸ Û²gã%¿Ïs,ÎèÉÒ¸î*S\7ý¸öCž\J×`S¨")S•ÂBÏ»®NL_Ô<µ*(/ò.ç™Öíâ´ÇÃEg7 ØlSd„ÙŒS+ÍT£zŠËn±EeqqÅCÜ;Žü½Èh[„?_DЏÂp…°Ï7¯ãv/U§Ã!Ã!±kÁIU â¬Kb ĪËm=ÓYoE=8¢³iÔ¬¦ú|…Uz™%Ð>Tz,0__›“”áje¸çÒ1¶` #ÑXLXöâ–P¸--o8ê³rÓܖبǗÞÁõFS›Áª³B§¦Ü¿«²½‚¶.Qz­ÿg>¤y {ÉÞŽ ód¡£Ž¤ ÜkÎH‡£B߉~-’/T¶~óHÏÞnÑp?9F;|âì¬WÁŽÚ0½÷+|´¥¦"‰ã„jÕËõ²{a·@S—¢’ìÊ Uû÷}3㻤Ô\Hˆcð›y3ó„sïÃÀh+¬ôqå•Óå÷ê³™|YÉ"Ú55ü&åHL%Î]|fp! .N0qA£ëßì©VÄj¥¹S¼¢mÁ´Í…¶ã;Û5†³IpT¬µ2&Î^:_Cau9U›?tùã@ÀpSç$@÷¼‰P$ hn¥Ž¡(9ô2ƒS5ïÚȉ‰´¨pwiêÿ‰\Ï«©LÙx `FÖ¦"[& G" nÃav†lâXè7°=ÍöO¯ƒ9 ™Pƒ.õù¿È×þ¤Ù4þ+‰ˆÅÐ`¬3œ†Ãü›ëûEò‘(Ÿjù¾4‰%€AÆ– ­)$E62û¿S?›Q`ÓÙì*ðÕÞsB Ëäˆw¼SËåç»ÚšßBàmŸêøkªì‰2ybêhŒAtg Úb)sw€xhƒÙ0 Òwê¦ó᧤çêí†ò”“¢!®ò­0’ôF\&×<­oñrÛc­ïÉ=‚4é“<{9k 8Òå5©*÷<=xÏ}ª°.«Yýê~·u³¢’ëÃ[p·}ñÈ$¤Èi†áéýŠU·ƒÞ'çûlèó)–³± @>GuA:—šsì³{öÙ‰*È—è¨M;\)̸ïèà=jJ €厽![¥]û ê u™±Ç«t÷“š—:ÙÜqV¯ä3ù:N<ÜŒ™ÓÙåÁX<¾ù#ÀÄ?·/ endstream endobj 173 0 obj << /Type /Page /Parent 1704 0 R /Resources 217 0 R /Contents 218 0 R /Annots [ 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 174 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 757 527 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 175 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 743 527 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 176 0 obj << /Dest [ 948 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 730 527 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 177 0 obj << /Dest [ 948 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 716 527 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 178 0 obj << /Dest [ 952 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 703 527 717 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 179 0 obj << /Dest [ 952 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 689 527 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 180 0 obj << /Dest [ 952 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 676 527 690 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 181 0 obj << /Dest [ 956 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 662 527 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 182 0 obj << /Dest [ 956 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 649 527 663 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 183 0 obj << /Dest [ 956 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 635 527 649 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 184 0 obj << /Dest [ 961 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 622 527 636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 185 0 obj << /Dest [ 961 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 595 527 609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 186 0 obj << /Dest [ 961 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 568 527 582 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 187 0 obj << /Dest [ 966 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 541 527 555 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 188 0 obj << /Dest [ 970 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 514 527 528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 189 0 obj << /Dest [ 970 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 500 527 514 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 190 0 obj << /Dest [ 970 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 487 527 501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 191 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 473 527 487 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 192 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 460 527 474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 193 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 446 527 460 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 194 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 433 527 447 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 195 0 obj << /Dest [ 979 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 419 527 433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 196 0 obj << /Dest [ 979 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 392 527 406 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 197 0 obj << /Dest [ 979 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 379 527 393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 198 0 obj << /Dest [ 986 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 352 527 366 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 199 0 obj << /Dest [ 986 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 338 527 352 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 200 0 obj << /Dest [ 986 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 325 527 339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 201 0 obj << /Dest [ 991 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 311 527 325 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 202 0 obj << /Dest [ 991 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 298 527 312 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 203 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 284 527 298 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 204 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 271 527 285 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 205 0 obj << /Dest [ 1016 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 257 527 271 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 206 0 obj << /Dest [ 1026 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 244 527 258 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 207 0 obj << /Dest [ 1026 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 230 527 244 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 208 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 217 527 231 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 209 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 203 527 217 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 210 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 190 527 204 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 211 0 obj << /Dest [ 1038 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 176 527 190 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 212 0 obj << /Dest [ 1038 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 163 527 177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 213 0 obj << /Dest [ 1038 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 136 527 150 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 214 0 obj << /Dest [ 1042 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 109 527 123 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 215 0 obj << /Dest [ 1042 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 82 527 96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 216 0 obj << /Dest [ 1046 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 68 527 82 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 217 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 218 0 obj << /Length 3304 /Filter /FlateDecode >> stream H‰¼WÝnÛ8½÷Sðn( VEý;0tÚEwlÑfnv±ŠDÛœ‘%¯DÅIdßaßq/ö|¤$»I'µ§ I$Eñ|çû9ßÏד7××>ìz1>óð‹K8 ÜÄ÷b–Ì"7N½€]¯'oÞµ)Ë[³Æcm^MÞ|ø"زx®çÑš|2n·“òO™3 Ü/%]}Îæüëúo“™Ù`ÆÏÅøHº±g¿aÞ÷ÍVtÅv§ÿúúž3s/e7÷ìË}¥Wñ¹t°oUËÞ~¸`ÿøŸ3ðÜ`.r#®ç« öe«ôWÙ”f“€gUáLgœýÇü73è 2ßsc<\¿Ç˜9Áv»uÀ¼¥¯Jú,¶Æ']Üz—÷C+³Ó_®'‚)6ñ£Ø bÁ‚ÄMS 7 0†)käd1ùùz4F °ÄûÖ;K{dœòúwâ+}ÈWê[K&±çâogJo4å@ŠnÀæüw'[½Îî´ZË«K†;F·lQÃ0OÃú5lãLS‡9cà«sÙ¶ªZâ)uSî¾üJ<.<ßX0„gq±›ŽÆÎ­ÅbšESá-ZpþÎÁ…;pªêÁeV •g%kËzËŠz[‘¼êô1Å3øÚɨ³ðé8ªˆÍå–M••]SR»‘¹3-jqÏ~ûü‘u­,˜®Y–ȦŸ²V6·Ôù¯Xp6ºÄH—Å#]²È:½ºº˜;1¾Û8è˜Q M8Óç׎©à#öó_?²·xC‚å<Óª&N“ä>i±¥§c žwńͩ®ê*'/üõ}䤈 fØRV²1çf”Bøº.V"xð÷»åÎÃ?•µ”ÍóºjuVé9Ü0Ö#lu£*ËÜ’<‰íĈÛ1w"¾#ÌÍyaÀ[*\ —UÑÈvÓ5êê‚üÕÜÖUy¿…÷Š Èb!x"¡M8Ìñ‹~ûü ƒIjÙ5ƒƒFÝóG‘†M‰¤y«Ö›RR°!g4„h7²ÙRn1éØ*%商YßpÎàe ÎFÔS¥L8ì-œiˆ“±ùº+µÒ«Ffp¼-)Û›±)¯”Û)$Jy'©`#ÿðÎ2Qû.4EíD˜GŠæ-u²Ý÷K\UJ·y£6ƒëÙdH*ÓÈ-´€ +ZòzO’;;¹`°0²#¸€ve\í`Ùa Œƒ[k–à¥qÁ¼ø0®#q"K8Ý†Ä µŠYÙ¨ìE®áÈ!oíSf/Y×£™TNÀ7{¯š\dfd.Õ­,Ì­ê÷„*9mlì)ŒÌö˜H¸þf{’É‘ß~`4·d¥¼•å ”' îZä¿B²´vÙ'•3ˆ®—’ió*_˜" о+ÔgÄÃ…¾ˆÐìŸ"<`µ”Ó ,ܵöQ×ë¥Ô›N·{Ó)o”i(@µ¾²vcvpÔ ÇÛØº‹Í¾Ùë²ßëò ‘õ‚åãV¦ªÍ÷c8ޱt‡#Ý¡µE/È>HÍ@6ûÔiPO>Ü'DG´GhjŠ{BS"!%h;9¥¶ ÎòÜ´{oF;nS„#³©aÖ³±øè,-Æ["Þ³š«ñ¡ |”ƒ…o D!€Œk’@Öü¨ÈèÇP=ðšžM$=©SKØ6SzQ7¶Õ eÂÙM6M·î‹]Ù»>[Z49‹ê¬ 2h5{|Dž ^pD¾Ï,¼F–÷u%³¦¼_g›–tnQ0¸"µ"p›M]ª~¼X¬DÕKøóÑ6–PoWBC[BC[B©Zù›ò¦[æ«®úcݵê+µ˜mtfTÃbÞ,åßo~—9|›–1ZÄJµ†Ü]±„iÙj#<’Ù!mù†3xV)ÍÎÆe4bŽF.}a¹,d)é|KZÿˆ‚ŸŠ0G0+dYÄNTu5•wÊ`cʺ¬vHFšõV$áˆñH8ú>›w¤æI‰ZÆ´Z˯€j„¥6­åO- .2JQÚ|--¢Ì'¾WÎ!y>C´Mgqû›g®ˆE¦¥ªò²k!ÌCŒÆ@dò²,lÊî4u¥[6.¦-}:ûeã°Ñ©{ŒÌÐnêF×N¯4m‘©Ò¤QäU€êe‰0²µÐT°ÇÉÔ¾§àཀ{ep:ÓdºGg:\L&Џ±ykͼª·¹Î³Í¦©7Ò¨k”%ûÙ+{¹´¯±á«Ù¶èVeY £ÝfS`AÂÆì§á ¸U¹Ü/óþÄbO­*8Ôš2"ù@_¯Âô´ÌÿÝ?V·¡™t›Ûw †ºoÕ|*ÙWwÏ“¶sÌéCÏŒÑa-Ié¹<éû¤j€˜"Æ„'m1nK%^*÷´ŠlÝ«ázdö_°WÀ«…aòDö!¦¦æd_ÜS¦c3%Â=eÓX s-:£têÃmªnݧNòI 5¡F]CÖdëÖ®½²—K»òP·– %¢Â6" ·É[˜¾/ì·¾gldV¡‰C2·Hã?õ{¡þZ¾…s›•lYÖ2<عÊÖ²wZªXa€ƒüÙÎ9 g8´â Äí€N÷‘’?¦È”q‘çr£Qânap´Vs¾5£Y…èFu·³¬Ÿf-\Ñø%l2 ž bƒ&:ÍÑéÏØ¼¬— ¤z:¼©æ9ùRˆds«À$f¡²î ºõ¶é‰ªó ÖôLÌXg`É*»){ZŠ©ÑR¦‘ÙðÐ茸lIpÿ0 Qö(Ô[¯-‰6ª ÚÂÛ±µ«> Ð4JÎ{Üìyp¯dË7l•Ù,IPF|€ä¤=e¿ÜJf•gŸ<õ|¨ö8 OälÌö^¸ã,0U…_ÝæÚè«‹~ ¬jWýà¥ÕÿŸ›=c>uÊëTÐ6u«§¥Ñ\!_:”ïQÞì‹-åî´ÀzXý,¶WŠÈ§’I œµºn(|Pù)U”¬dï‡ $EM} Õ…(8¢„_È%èUØü[ôP†ˆ1ëï#sª3 †ÌçRe­á択#~É2L¼DŸ eSQ ¦0¥Bhš½RöfLdnÑÒá՚ȎéΨÒó¸5µ‰¦ ñ#»D¯±ËXÅNž‰`ß2ˆÞâUÍ1+åÛ‚k,”à Ú”ÐZiö Lð÷gOPÌ f6[h†cî/z‚7%¹‚Ïï­g)”ؤFfáÒD,ZA6:GFNñÞ«¦ÇMˆÞû+¬½ÔHmHø°Tí©UU©=µ=m.ØÉàeóïûÆcb²lªlCi³‰=æ½ç™7Ü œ¾&‰gˆE:—(FpœáRÐQÚ '”ÈÒ´ú†Õò}Òé§åÓ‘ÈlÆ gÆ»cª]sŠâ ðv4¼6¼c £13퉈d¥Éh“â„Ë %œW\G0a¸k åÙÕeÅ‘€+¡”(9³b2§>.!‚©®ïŽûÓ}:d[@ç+ Ü \&z#쥕¸ópÁaßÙš[÷Ga¼&áü%:ÙLÚX*?M¨1)”ézΈ8N¨VP&}—·¼Ð ß+d&ÆQ„CW5.ÎSÑ §bu{æ~ŽŠ}æñ8sLR0ªèÒò l9ÚâÓ”[uMÅßù…d…[²MþT7ûF`Üý…‹°Â¸EeDøÛÌ¢â;f®o_'£¬ïhK~$ú­DÒŸkZ[Òß2š×f¾Ž zæ®T1êÜÝÐâ&„% 4)OØ5\¥ž«tÌ•²ö‡Iú@´)îp™¥gíÞ+^jKmŠ\×yj2Ïv…Ýþ@þò£ØÈÏ?ÝçM `js­…{y_›–/EPkzaÛÅ‹dF#2ó²äZ¹ ŸÔ@®{1‹ÙB…bÑFž˜TS&3õ:&/vfÜòƒmÁëÜ´º.z×~yµ=Úý{ÞÇœÂ{ÚøNÔYô½ çnûÐRw.¤¯q²†@ÖAÆÂY˶˜Pù ÷@¨llPúÖRïI bìܳFá?Q¹BINÕó"r •«E<•Jl³L$5C³ßQ/!¯9õToù»qo«¬ ¯JëÉ©i†Ü4oDNö*Z^ßH>ýxó[€Íœ4 endstream endobj 219 0 obj << /Type /Page /Parent 1704 0 R /Resources 267 0 R /Contents 268 0 R /Annots [ 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 220 0 obj << /Dest [ 1046 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 757 527 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 221 0 obj << /Dest [ 1054 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 743 527 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 222 0 obj << /Dest [ 1054 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 730 527 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 223 0 obj << /Dest [ 1054 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 716 527 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 224 0 obj << /Dest [ 1066 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 703 527 717 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 225 0 obj << /Dest [ 1066 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 689 527 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 226 0 obj << /Dest [ 1066 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 676 527 690 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 227 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 662 527 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 228 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 649 527 663 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 229 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 635 527 649 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 230 0 obj << /Dest [ 1117 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 622 527 636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 231 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 595 527 609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 232 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 581 527 595 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 233 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 568 527 582 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 234 0 obj << /Dest [ 1135 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 554 527 568 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 235 0 obj << /Dest [ 1135 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 541 527 555 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 236 0 obj << /Dest [ 1144 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 514 527 528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 237 0 obj << /Dest [ 1144 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 500 527 514 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 238 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 487 527 501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 239 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 473 527 487 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 240 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 460 527 474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 241 0 obj << /Dest [ 1159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 446 527 460 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 242 0 obj << /Dest [ 1159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 433 527 447 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 243 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 419 527 433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 244 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 406 527 420 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 245 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 392 527 406 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 246 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 365 527 379 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 247 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 352 527 366 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 248 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 325 527 339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 249 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 311 527 325 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 250 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 125 284 527 298 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 251 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 271 527 285 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 252 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 257 527 271 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 253 0 obj << /Dest [ 1212 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 244 527 258 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 254 0 obj << /Dest [ 1225 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 230 527 244 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 255 0 obj << /Dest [ 1233 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 217 527 231 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 256 0 obj << /Dest [ 1241 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 203 527 217 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 257 0 obj << /Dest [ 1241 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 190 527 204 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 258 0 obj << /Dest [ 1249 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 176 527 190 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 259 0 obj << /Dest [ 1249 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 163 527 177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 260 0 obj << /Dest [ 1249 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 149 527 163 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 261 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 136 527 150 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 262 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 122 527 136 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 263 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 109 527 123 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 264 0 obj << /Dest [ 1259 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 95 527 109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 265 0 obj << /Dest [ 1259 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 82 527 96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 266 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 68 527 82 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 267 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 268 0 obj << /Length 3411 /Filter /FlateDecode >> stream H‰´WËŽÛÊÝë+Þ¤ X4ÉæÓ ÇÁ ‚àYå: Õša®D eÝñ‡äòYäTU“”4#ÏC²#‘ì»NU:õéfòáæ&R¡º™OÂHøÃO\?‹‚TeEâ§y`ÔÍròáO›\Už¨MÕL>üò%Tw›IàÍ©&Óþr7ùUÿ£ô¦Æõ¥ßH«\yÿºùë¤à •~‘â%&÷Ó@ÞÁë#ÞŠ®’Tvúo„§Ó(ð¦¡ñSäêöA}yhº{<‰´õ°“ÞÔõÇ_Þ«þÏ›&¸o1–ø‰®½@W÷ïÕ—]Ý}·í‚71ºlfÞ´Ðê?üÍcëÙ²(ðSÜÜ|Æ3>Án·ó=ã‡zCoµôZlWú¸ `\åÝóN¾™„ªV“(I}“†Êd~ž«4ôãXÁÆ8W­Ì'Ÿn0Lˆ)Á!#Ò!‚SÞü{ÏKE,øeiàã_–µptEè\†¾‰}¬¹Ún¼€áeúú£’;UªYÙy8®á³>ëÖddÁ4ÿg2cüÄ`N#8B_†ð=MB°†D+N– Ó{pÆ`žšÄÏÕ4$£i1Âr€ŠQW³—ø^3¯måîš HôGe¦êòva)ìä®’á¿ÿM}þ¢B?R²¶nîÎ@ANÑFá±½lÏh/ctÚh3VGfÇ0›,‰t‰c—Í%³ ½ålZ¯i,Ñ«¶»&Øv%¶­xîqtÞ4 5ì 3g`q>ÑóH$ê ‘Iì'ºªøÎ®;ñ(ì—'÷!b«ßTÝT«%¬TuÈrƒX c²|óöø)ŒÑp’RuE\P/lÓÍjº¬˜$ÊÖ‹ñ3ð±î‡¦D ý˜jV*« ˆÙ™ƒ$$ôk4-PÃÞ‹âß7ÑÊHÑ¥Bâ#dêj±:Èòr1»¢€%LA)“é[¹±ZÍ)UJ¹§¤@yÓ7„XBé¦ô”ä ;Ǚ،¡²Î!:¹ºª™cýM¼&Ks]ƒ#z<ò”£D¤Ë·~ŠGó‰KêNr&&û/Ãá%#å$yêŠéð›3‹ æ rzFåv‰)l¸&zd8fÓ‘)[.Ç=w˜ŸÍQà 0Áº¤\§ÿ¹GtØ'ØÎqéÙ“bôÐ/šFa|Žù#Eœiuô¼Õ¡«Ÿ°ºããw+áC+ìX7u·G–2Fþ6zM5õ䘪ÊÅDzkA0 ;Ø[•,,¯l¶,¦D<·¥¨¼i˜¿„i/†Ú+ñˆZ|€ZäP‹j°Op+ĶÃ&b{bÝÔ2…*o¦7•L”±D W²òp´‡±” …<ÌÐe:ôüí^·ŠÌ^¿~9ðK/uA1vSÅ~†µJ,ZµyÔÚrö@t‚€hk&^ˆ72™âç41T°ìîEüÙF•3’o…Æ^l¿úª»²½³,~Oì ±·,×òà«§ÊÖö=Ó$á<Œb ßI}î‡Ïå~Š'~=y˜1²cG¦~^¼²Ý8U@£˜´UÃWF+ÛÌäIE.ºæäßåâ»X|g·Õ–DVÙ± Á:n7™Ø`ALo…k(ž@¸´”ˆDy§Í©^ض{dôõS@ô¹ÝÛΰ”´:áœä§Aó‚DO,Z·vý(Ÿ”㨠+$ªŒ[o$ígÜåQ–Ñ7Z)^H~y0À䊙 I€É${ ‚¿A7]ÙmåJ¾b¡ƒgª[©û²™-¬#•êaU­fÖ]C7ÉÊM7¨×(>ÅmIz>$Ïu+ôxßVdÔ¾ÚúŠ@&§Mв9²¤LË·knd5J Àzrl †ýöj¿ËöðÃåÜ3`R1Æm§Üyé¨Ó' I´WHz Š Êã7|ÞRHŠ ’~GçÑ:ŒQæe½ î#W5w®Kmít˜ hƨºÙ5(øý½s>tÝÚmÕP ¿¾ˆ=é#.]H Z®æ&²mÛU×ïÙ~zh¥BtårMU÷°¶T5Yê9-*ì'3­Ôµ·Ö£Ql@&å/åÅ¡Z˜àR pÒþ¾! +éàßWN[Øë, •{j™Ïz™{h/ÉÀP?²šˆ.__E/€y& ºŠíA ·déjÛÁ剆ßåV.¿_Ð*‡•ð;M~¥OY]ÐíA>ÖÂüÀnÃnà,UÝ»peŽìÉ¥W¨ †»( ·e…fH¹aš ú&n¿µ žÎŽ¢d˜è–Ql€ÍA'²7~‘Üdb þtBˆ÷´gYgºPïÕöµÜ~tZ5‹øÔ@ Ô ÊÕ®æ(JÁX»6é8ö³Æ!fÔz²~ И+gbVÐi¹‡ T÷v=XvZqΩ‰)F/fRm¯åö#4áøeZ‰~a…]°^•¬; 5¯--š77LjèRŠ2³(>ÀR{Þ®–­]®:»jàËXl õv½^µ”B_äŠóB½ƒk &d¦»òAÑr%땬ƒž6øiªwO::?ß°8ÚIåÂ5šÐ†}M+¸ÂyÍ ¶ýeµ£üŸYó¬ƒvIiðŽÖpR”n¥7A!}ƒ!;  ýç$ÚÅýšŒ~MÌÏÅüHw+J»‡­gÔ<ÀωF̶2vMc꫆ƒ‡uÞ´ÀokÅöˆl×OìD›\õ@´ÛqBB°#v~{2wô}gäðôª”AÎ dךE±ßFÜ’ÏVb/ûH\£‚ç‘!-"ü¡mˆk/ÑÔÅòHo)¨³e¹†Ó¨­Ñ%+¸õš"–p§&†gýÁáêj/_—eÐÄCyN@/Fv”³ñÛ¢8~$ÚNÕ«³¤m#Ãß—R»Z;³s$B¤ hBɦŠXscÇF< õÌÉ–[WÀ\y“ÐÅÖ{ž‘ãðÞ4Íë,Þ^Ýú\îÇŒÐt:îSèF›š«åh™>dÁÌ¿¬ùŠSîs$tëðÍ›®’R;3¿½Ì8ÄŽÑòþç]ãéf9œØøË¨`î7…)¥{ƒ]ÉrƒœVèjלì[=$E@=Ë&‘þœý÷·æíë£ Üи­¿’·šŸžä ê0“ÿ; ¦SÕº<8ì‘øô‘h ãÖ4©fëOQ:¨j´†§UðýÏ ÷V"§ƒ’9YÛÈ#×ãÁ?ýþñG€‘4 endstream endobj 269 0 obj << /Type /Page /Parent 1704 0 R /Resources 315 0 R /Contents 316 0 R /Annots [ 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 270 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 757 527 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 271 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 743 527 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 272 0 obj << /Dest [ 1269 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 730 527 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 273 0 obj << /Dest [ 1269 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 703 527 717 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 274 0 obj << /Dest [ 1269 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 676 527 690 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 275 0 obj << /Dest [ 1273 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 662 527 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 276 0 obj << /Dest [ 1273 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 635 527 649 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 277 0 obj << /Dest [ 1273 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 622 527 636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 278 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 608 527 622 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 279 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 595 527 609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 280 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 581 527 595 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 281 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 568 527 582 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 282 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 554 527 568 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 283 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 541 527 555 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 284 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 527 527 541 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 285 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 514 527 528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 286 0 obj << /Dest [ 1291 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 500 527 514 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 287 0 obj << /Dest [ 1291 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 487 527 501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 288 0 obj << /Dest [ 1291 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 473 527 487 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 289 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 443 527 457 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 290 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 426 527 440 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 291 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 412 527 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 292 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 399 527 413 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 293 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 385 527 399 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 294 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 372 527 386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 295 0 obj << /Dest [ 1340 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 358 527 372 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 296 0 obj << /Dest [ 1347 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 345 527 359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 297 0 obj << /Dest [ 1347 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 331 527 345 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 298 0 obj << /Dest [ 1352 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 318 527 332 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 299 0 obj << /Dest [ 1352 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 304 527 318 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 300 0 obj << /Dest [ 1352 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 291 527 305 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 301 0 obj << /Dest [ 1352 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 264 527 278 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 302 0 obj << /Dest [ 1357 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 250 527 264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 303 0 obj << /Dest [ 1357 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 237 527 251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 304 0 obj << /Dest [ 1357 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 223 527 237 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 305 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 210 527 224 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 306 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 196 527 210 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 307 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 183 527 197 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 308 0 obj << /Dest [ 1371 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 156 527 170 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 309 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 142 527 156 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 310 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 129 527 143 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 311 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 115 527 129 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 312 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 102 527 116 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 313 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 75 527 89 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 314 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 61 527 75 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 315 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 316 0 obj << /Length 3327 /Filter /FlateDecode >> stream H‰ÄWÛnãÈ|×W4æ%$`qx¿ŠÌÌb‘E‚ÝÀÊKy IJâ‚"µ$eÙû!ù‡ücRçtó"[’/’“Y¬E‘ÍVWÕé:Õ_æ“Ïó¹-,1_L,[˜ønämú"ˆ<ÃMGÌדÏ_›P$ 1E“”“Ï?ÞZbÙLLÃ4iL2™v—»Éwí—XŸ:†«-3ú´5 ýŸóŸ&O‰À4"?℆oÊßà÷mžŠ®<_Îôow§¶©O-Çð53wâö±lW¸ck™Ž™´&oÄŸ~¼ÿø>õð½Æ3Ïð´\7µdu%nwyû{V<‰£ÅeªO#Mü‹ÿòÂ=#³MÃÇ—ù7Üãìv;Cw KkèW3úYLŸ4pi\¢n­x¦æKäbb{¾áø–p# …o®+€Ñ EM“/óž ÇÂsŸi“Á*翎TŠ\É_à›þ—¯ÿÑ E$—oYX Ͷ›T·ˆ­¸Í’"×#\ VË6/zk ÈÔj'¿>ªçÉ͵Àûq«©Û½&0MV¶¤¸›Tu*_é¶ÎË¥8='hséÊ8ú#M‚Y®ÇÜ¢`-SV¬ãa/S"µ’, U=åASËc4ðAÁ>Ar©Y}ŸÕ=5=€ct¨—ä7z̼ƒó)£Äé) JÂ1%¡˜•Um ”J¨Å´ÂHK2ɇG|@vG“ß$)eF¨{jIFÀ•³¨ï\45Þ5ž¤ÆVÔx’š€©±éâ8+.Xñ/U(ÇX‰ÄLBY9ivŸ—‹uü€[¹\ÿïÉy”À€|½]‹…b¡HÅ“±àcSÕm–мTûêz¨fìaŠWñ°åPák”4b]pÅìb.ÙGéžOLôtÊXZ¬Fð‡ô› V2a‰ðB;ÚT–³Ç„'fm­» / PF݇¢iÒE(]ÎÖºÒPÑÍ%~ w÷~Œ&¯éî{´5J To¾¶ÀsDT®åØ57¹¾€ž”}‚·aËœÉÒP/îÀ’»Ç’¯XŠ˜¥H±(Û–K§ ˜ï¢låmÑVœD̉tωŒ˜°™‰@“#ˆ wÄMó÷9~¥ó óòzJNxÉ:Ò<Êô¤®ê žV•-œ~Q)8ØÙÔÈð°~u—K=ä’—pù©å»oÁvh³Ø,ƒãörûëqÛVY™"°IëÌËDYĶÒó{Jí'žîà”R2»;° &KY)¦,†yô©ßÛ©û"_ƒŸFž p„©¶í»aE¥`É.^«.ß‚€½†ßŠ4[ÄÛ¢ò-‘¬â:–1¡Åqo0 ŽÓ^G‚{> /…HÇ‚¼ÜȆâu[°TükU"ÚKƒüª¢ è–K‡´ýÁïÁ?fÁ¾`)ȣⴻñ€0ÍnhkÙR¶Ôäq]ñÁGÅeG»b*fEVR&ž^ .v¸%¯Eü€£­‚ï ‰$•ì¸e‚tˆwäГ˜/©ûQÄÅuö«Âœ´rYtxC’o @Ã<òû£U&ÌÄ.oW(…ûÝ\©Iy?ç¿RNíáéš½9x(&º– §H×¢ÕOŸ¤d[-ÿöoùüó·/_Å]Ü ·Ñf½Íj@(Û¯…\2l)£9œ~9©õ¦LƒvryZϤNHvRøª<ƒŒÉ~Õ])),@â¶EdYÓ¢±Íôi$‚%“¦Éi‹!L½³á¾¦êŽí úËk€ °¿±ŒdÙ Ù3«UªR¹‹¹»Žb…©ç¾"a½º2!ûA·;èκ'¡w°=†í °yõ¢¼³”Ï8<ªª³>˯͞G »çCQuç”ꀉ8QCÆ=J UK²­›ª.ò;ÀÚ6ñ2ÕBÚ¼|"ðˆœ&b§ ´¸~¤øÎ>tí3Ú/œ¾,öûY›=´ëxss%ø2Þ¶«îzãúZ°±­ „ØR1e%Šª\JÅ=FŽ´ßÇyßÔç"M‰| ¡ŽòÁ2"t%p¢ËÑjè€Q3´µƒ"FЦ¯}·¸Hx}i=–Fí]ð}zrFs:}ŠÉkz”° *—·!Iü×ožHóeÖô0[3–Ðl“`¾•>ª!˜X.XeX6-™Óˆ\vCÇ›ô¿´WËr1¼ç+TœViv¥ìœœ›/®äÖB`•¼ .þÞ=3Z„ Á pBÒH¥Ùõt«ºSXŽBŠäZø‡DÌ͉ %)räþ'`aÊäzÊ„DÖÌ÷ºÀ‹!Bðšêoœ§J̳nÅÓ ½3,$è-ç¼ÖÕ´µÌ _x²eó$ÿïØ…kꟲgツL5 Ù”â8ðg?޶¼=Ò¿÷t15¯ AòmçS‡§¡FÔ_/KŒU¤þ\(äöâ·ÝªA]®Öþu«¦à|¶2õÀŒÏü²èƒ£6Gäg <Î?lΙ +sQAi (›vîÙ»—Ž%òtk<¹¹âÅKd]è½I®g¿,4w¤_Ù³Xìr*RNÐŽ$ˆ»¾ž/7â’„]ìZ×™¸ ßÃóð ž5ä ©™/C‡*Ÿš*¿loƒüz{ ½J’åïGÍ×E¢MÓûT}«8HA‹IW šØ~ú-á«ÄzÅœÚßvíó; #IñBܰc²9ŠgÂô°:SgPývéïd<âõ¸¸âA3ú>j'OnôSféC=€¸HŠÖ¬Im6Aw¿w0ÈÒdtzœXòaÞ…ip|}A4–dÿê/÷Œ-“1_Æ "üŠCcP–Ÿ;@W4À$FL*M‹úW·Ó¶™xp§¦ªC‰YzYG—1႒銴Øs+W³æ˜'ø&z´tšÉiË™={ŽÍ^ŽŸíÁgá´?-ë_¾½ 0/ÒzÁ endstream endobj 317 0 obj << /Type /Page /Parent 1704 0 R /Resources 359 0 R /Contents 360 0 R /Annots [ 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 318 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 743 527 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 319 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 730 527 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 320 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 716 527 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 321 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 689 527 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 322 0 obj << /Dest [ 1458 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 676 527 690 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 323 0 obj << /Dest [ 1466 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 662 527 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 324 0 obj << /Dest [ 1466 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 649 527 663 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 325 0 obj << /Dest [ 1466 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 635 527 649 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 326 0 obj << /Dest [ 1472 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 622 527 636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 327 0 obj << /Dest [ 1472 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 608 527 622 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 328 0 obj << /Dest [ 1472 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 595 527 609 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 329 0 obj << /Dest [ 1472 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 568 527 582 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 330 0 obj << /Dest [ 1476 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 554 527 568 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 331 0 obj << /Dest [ 1476 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 541 527 555 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 332 0 obj << /Dest [ 1485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 514 527 528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 333 0 obj << /Dest [ 1485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 500 527 514 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 334 0 obj << /Dest [ 1495 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 460 527 474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 335 0 obj << /Dest [ 1505 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 446 527 460 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 336 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 433 527 447 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 337 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 406 527 420 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 338 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 392 527 406 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 339 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 365 527 379 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 340 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 352 527 366 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 341 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 338 527 352 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 342 0 obj << /Dest [ 1552 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 308 527 322 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 343 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 274 527 288 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 344 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 257 527 271 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 345 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 244 527 258 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 346 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 230 527 244 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 347 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 217 527 231 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 348 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 203 527 217 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 349 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 190 527 204 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 350 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 176 527 190 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 351 0 obj << /Dest [ 1567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 163 527 177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 352 0 obj << /Dest [ 1567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 149 527 163 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 353 0 obj << /Dest [ 1567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 136 527 150 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 354 0 obj << /Dest [ 1567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 122 552 136 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 355 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 109 527 123 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 356 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 95 527 109 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 357 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 82 527 96 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 358 0 obj << /Dest [ 1579 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 68 527 82 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 359 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 360 0 obj << /Length 3097 /Filter /FlateDecode >> stream H‰ÔWÛŽãÆ}Ÿ¯hø©¬h6ï(dwÇl¼ˆª¥¡A‘2EíìøCòùÇ<äTWó¢ÕÜ¥]Äc¯Hv7›]çÔåÔë˳¯//}¡ÄåòLùÂø„iêz©‹$‹Ü8õq¹>ûúÍ6ÅÖ¬ñĶ¨Ï¾þö½«í™çz­)ÎfýíÍÙOò]îÌ7”+MW_ å ç_—=ËÌ™H<7‹ñ• uc?b6ðÍ^tżÕ|ŒÎ|Ï™©À¥—Š«[ñþ¶î®1âKí`'¹-·âOß¾ÿü¯3‹ðÜb.r#Y:ž,®_‰÷7e÷›n+³I ózáÌ2)þm~ÍÁŒùÆ4ßsc<\¾Å˜9ÁÍÍë®’[úª¦Ïbk|ÒÅ­ë ;tmvúæòL‰RœùQì±A⦩ˆ•†6†©hõÙòìõåF °ÄÛGc„Ú#DpÊË_&4e!ã—Äž‹ü PSÑÀÝÒñq4˜ä‹ùÖ‰qØÛºè Ú•îð?þê(üVì‰ä…3óå«é fqí(å¦RߨWª ¬qRùɲÝf‘wz²Æâ;S.N°ÒáFŸQÖgèsã. mHmö¢ÎA»¤d]^$Öy¯œ Ü€Ø)׺îœY˜àÖ=͸Í2¸”Š#c‚Fy5A䦃§ì.LÔY3³ˆlzÛáÂC¼¤SŽ‚œÜ–P(×nêòõæÖòÜ™IbÙ´ë¼£‹Àb½¥¼V”µ3Kqæ¦.¿ªÈo=ßM¤Kï‡O‡Àzô‚гãɹŸšŠ9q.s²"‘ݺY,K]-ºÛ†åì—¸œ Ì”˜ZÃ…]îÐ0Ý­Y—f1E>Ùîoû@þ½õñ¦mê¢[ç›Ü>Uýî+…_YÛ—ZZ|0mb‘¢]ß1ûÔ¸D("áŽ>¥Î‰FGI Èò 9yjlŽˆ/Ý”þ ƒrŸ£>@OÆÑÄA÷<4æM‘ÊN/ËŠü2–”™þþ}ID)ÙiÌó«œWBD+ “AC™ÓX XpôÔN,> ¹«’*Q§ Õû Hö ¸ÚñÃ-d³#$R‘8Ï„E˃ÿ¹Sv*æ¿îš®¬WÈIl¶†Å”Æ®›ñ··¯MF~C2ùØær‡"©ÅK6_¯w"&¼ÇiAùZ^ia @‘oðL¶¿¶XlŠaËì»À.1IþNHÂã!=Ã=ßB’‰ùÂ-"adrF š;Ýø‰"¦T+ñ¿|ƒH å„S*¿“Q|Hé|ÇBÏ1o+ƒ£âÆ rB¹§¨a×¹9¿æâ•·ÕmѬ×eçÍ8Ô4rž¨êº^ˆfI:·øá{±Ö\ãø×ž@[ ý±¸ÎMôFj‡—»¡¢%Á‰ÁKÆØHöLWb¾ÞU]‰ZÈb×ÒñCÙÔ¨šz¥[ÁƒÄn(7›¦íàåðˆÚ./›Z.äLÐeñó2¶ñâÑf?Ê·où.˜XÃ(²ßš¹»8©–iׂf*5xì¹í(FGŠ—ÏD÷(`¼=hæH‚F‹ÂVŸòé1ΊðsHW²ûª¬A±Ñ%Ô¾aX VðFvˆ˼"ïÈ&j%ØÏA¶Më?œ™šÐ§菱ÓIœO1¼?ÝEâ Z‰ŸdbŽ©Ò*ìË4«JEª²\oS®¨|!Ý—rDf«ó…øÏJ¾ŽJò\Ï‘æG®í¦ã€!᳕ÝX¢ÃSÅã}õHEŒAf1𠪟<ø«©+Õ…)8œ† ­.š·mÖåbjOtlíqÇòs¤ùþ£}…Š÷º6Ü4¦€¹Ü%è½'•¯Œœ$ÿmC‚¬”J¸ •±½]æ¿9)EÜf²‡m3ÎÜ=²nZÒˆŒ:#-ºæS䩃=ú§2dÂªŽ›i,pèFÏà{½B»d·]Õ ÚŒ¼ÎWz­'ðåþúpŠ£»Âi ¦ø0˜Ttª`Bo²&Ý a²áÆTXÞLh€<è ´&ºZ­Í† 5)K]ÊGE/ _9½É?é玟[ ïÛ6¿…ñ}»Ê±³,ëÒè,të|ÚˆB£Ï¢%/«¾(îµ±»ÀHÒðy‚ulJ³ÏÝ”újdþc«7ÚÈOä¯ 8‰ /3SÖÅ~TwȤz½é l=æ­Ž^u6-Bì°æñYš A ¨ücç˜?s8?sƒè}êNb2UŸÒ»áscòîvÉG»T7¥!ÃæñHÚ^iYVHÑSÈ´ƒvdÑæ…8n°c:´úÔÊÔîP¦9…§•¦(Vä…Fƒ‘ú2u0Šåþªi‰±Ž­¹jT&ßïK]ƒ(¯Êñ]®[‡U|‰õñqºá$½å}xâÄþ¡ÇÉ“œ8x´ÏòC“Eâžê†Ÿn¹[2<‹Ù´g6¶™)bÀ Ìr{g©UbSçZ YÛUú\¬ª†0äz‚ }˜ØêšpE×@ݱþ{`´JФ‡vÆ'Á°–ÎÙÔŸ©Vq°L¸òtý•½o Ó䎦p,ÝÈ dÏ,Ý÷€â XýÄxðÿ–ÕÔùΊ¦k ´¾D¨ˆF€¢C€Âì™ý€‚ +-BÊÂèQû˜ÛÙuYäK£“DŸ ó 6ÞÓš—G'°ÙõQ/§Û|Í®sA9ñÿ7®î€æî¸:Hªþ˜Tý!©ŽÐ ªy—o»:®/tJœxWí¨R®^‰ÄûÖ¬„ÓÀ›hýv£‹rYÓ¼›Q‰yÀ^À|IÏK¢PîO’¨uxK9Lp¸RúlFŽèˆä‚ãAy_Ð ˜üÐ ² ù6ºGƨžä’Do•%þ\•ÅŸ$Îßgrx94úKxOM¹Ú­–U¾rúÊK…_¡'ÕÛ;°yb½ÜÆKGŸN°‰>‰¥ ‚ÓÀ“ÈŸ‘S8£¼\+o¼ö?Þ«¦7a†Þù=&¢: mzE€´Ü8 åCš´=ìl?xvS’~iÀT8ÇRìç÷ìgeÉ•°œZŒ´a4ùáú4t¥Wr–E%Û¯tRg׿ÔöŒGøùñ’ÿ‹)Çx Z€BéÛæÝõE£Ý¢Ñ/UuïÁ÷rDæØ”®É6Yú•íw?¸]Â?7È?ÉBÖwµwÀK|™¸w&çôbOÇÏCp±æµÑUbDôšñaÕwQâÙʸ.eáÕÒĆºûØ$ñ¨”@‘ä%°û‹m1Tã&6H¥îûÞŠÉUZB£ï p‹…á2 Yæ>Û¥¼À©Á#¢ëj ç!4›py›çÃwÞ aQRÓÓ3àÈ͘ÁÆ›ûE1^õ~t5Ó endstream endobj 361 0 obj << /Type /Page /Parent 1706 0 R /Resources 397 0 R /Contents 398 0 R /Annots [ 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 362 0 obj << /Dest [ 1579 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 757 527 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 363 0 obj << /Dest [ 1583 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 727 527 741 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 364 0 obj << /Dest [ 1583 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 696 527 710 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 365 0 obj << /Dest [ 1583 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 682 527 696 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 366 0 obj << /Dest [ 1583 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 669 527 683 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 367 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 655 527 669 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 368 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 639 527 653 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 369 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 625 527 639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 370 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 612 527 626 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 371 0 obj << /Dest [ 1604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 598 527 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 372 0 obj << /Dest [ 1604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 585 527 599 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 373 0 obj << /Dest [ 1604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 571 527 585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 374 0 obj << /Dest [ 1604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 558 527 572 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 375 0 obj << /Dest [ 1610 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 544 527 558 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 376 0 obj << /Dest [ 1610 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 531 527 545 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 377 0 obj << /Dest [ 1610 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 517 527 531 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 378 0 obj << /Dest [ 1610 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 504 527 518 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 379 0 obj << /Dest [ 1613 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 490 527 504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 380 0 obj << /Dest [ 1613 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 477 527 491 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 381 0 obj << /Dest [ 1613 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 463 527 477 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 382 0 obj << /Dest [ 1613 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 450 527 464 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 383 0 obj << /Dest [ 1616 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 423 527 437 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 384 0 obj << /Dest [ 1616 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 409 527 423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 385 0 obj << /Dest [ 1616 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 396 527 410 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 386 0 obj << /Dest [ 1616 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 382 527 396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 387 0 obj << /Dest [ 1621 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 369 527 383 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 388 0 obj << /Dest [ 1621 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 355 527 369 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 389 0 obj << /Dest [ 1627 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 342 527 356 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 390 0 obj << /Dest [ 1627 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 95 328 527 342 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 391 0 obj << /Dest [ 1634 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 315 527 329 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 392 0 obj << /Dest [ 1637 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 298 527 312 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 393 0 obj << /Dest [ 1637 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 281 527 295 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 394 0 obj << /Dest [ 1643 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 268 527 282 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 395 0 obj << /Dest [ 1650 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 254 527 268 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 396 0 obj << /Dest [ 1650 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 83 237 527 251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 397 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 398 0 obj << /Length 2412 /Filter /FlateDecode >> stream H‰´WÙŽÛÈ}×WÔ[Š€E³Š»ÑhÀÛ ô†[1ò@Q%‰ŠTHªe͇äòyȹUÜzS/’mØ"«.É{î¹Ë©³ÉÛÙL2ÁfˉÌÁ_üxQd;‘°0öí r\6ÛLÞ~¬#–ÖÚÆauZLÞþz-تž8¶ãM:™v—ûÉwþ5±¦®íñ•¢_É™Ìúç쯓X¿!f¡cǾâFvà˜èHý.ºòóªÿJ¬N¥cM…k܉ØüÀ®E³ÆŠäÊ›xÕìý¯oØ?þgM}ÜWØómŸg–ÃÓõv½Ïš?U•ë—¸<)Ö4æì?ú혆¯¡IÇp3û„5íÁ~¿·-×¼¦¯*ú,^OÚ¸t€.m—ÖúMŸgÁ26‘~`»`nhG „íy ½ˆUj²œ|˜õÁpLœÛÑBíPDàåìM±gâŽæD qKr_x¶g öK–«Úò툳rÉ€ƒ-±RÎÿ`–pø¦\ìh*<ˆ€Œ€Ù?ï•ëÚ¾ÛÆš<–š|ã6Ù€v‡ òEð(Ò g…c’VÚ2ì‰êB„}ÏlO)ðl*@B÷9dªµÑñmÅåì"ÍõE¦ÿWEcøêå›v·V•^¸±¦L‘S!7k—±ÿÎX^[n:aÚ—¬UmÞZëUFiÃoÙ¥¿iÃ+öY¯+c_(6vj>þh2¾9¯XYûC—Ô€ï ‚oªk”žÁŸ–Å2[íª¤ÉÊ‚5ɪ>3ÏS7†ƒ"ŠïÒ§éèÓ´÷F‡áP„=ˆ6KÚ+Í!½ä>ò=ÇnoÙ…5õ¡¹%xV,uúë…-’f}iîÞ±¯¸a˲b[Uµ&YûÛ Xwm!•xÙÖ|¥9OVʰ‰’Jóld­ÈŸ7MV¬Ú%†¶ÃÝy6Y1bH¸=8ÓKÛX$ X1}÷¼¬¼ŒÂ¶Tãx(UÇ'?¿ó–cĈÉ$K;Õè=~åÑñ눾F%»˜·$&i“ݨËwLY¢Z€ð9Ïk-Ø<©•‰tˆ¢ØPmP ª4PA‹¯Ž…†=˜ÏÁKòYS®¡¹h=Uš®“b¥ªQ)U"Á+4¨ß>@f ²Ú²Þy&QIO 2~‡Çý~¢ƒjv\¿å$°©eRÊÃ×åfCÙghYfuŠ^t`÷Û <‰â»³]¾Åâhx^{púöàÈÞUÁ.j™ìò3<Ýä7Té:+t¨¯UÃÚ}’èÆ¤B~E…‹¶ú7˜kÿKV7IÕ°„ÕªîßïïÆ¬ ïÅbzyž`^ÌëÉX²CK» …–L{Ú¨f].ÈÏ3Lu`óh"ŸŒMÇæÞÂ¦Š´\dhžTÅ«ûHM±¯QåP8 œTz¤Xa+zqÍŸ å z·Pe‘’º—¤c~ikà‘Á©DRW Fy&‡æ=½Õ½Ûg…Ú×Ô°#^S)aÜVª©¨5C½€Íßk…ª‚Óf±1û¢ÕÍ'=yõˆÆCD´‡ùK±ÉŒd¥£Æ 0£§cñê÷¼Ý1`e•­²"ÉwU¶,)s}®Q4Á!oawfì÷o_:d#µÑkY•gbõq„!TñÝòV» <ºÛ(½c°¤iT y³(Л¤ÊôLáóÉ;#8·OY9¤ì01"v±Ý5 uM‘4u^îiráû|Ÿj}hªFÞ'˜¤Š}AJ(»n-¡AÅQX&}qÏÆÒ}åDLðÀšj ³‹¼L“|1ßá1ò4²…›—ð€¾Vê†DºñéÓ4¬ŸPOËÏD¥ñ^è »0rÅÌ>3õHž\±n…úÅ&AMAú¯‚Ð+ÃcÎ?‹…ûÙ¤ ôp×4Ì®*H¯]•É7µ)ÕªõZàÕëyò,öÎ5Ïl@M¨BƒÊmQµ%…¢ˆ9-Œ ©ÔÕC£‹Ž‚„|õ~3‡æŸÍrÌÓ(|ƒÂçeú¯z]Ö ØV0•¾à?z•ª§üqh=¥¾í¾2ånA Czeß:ŸPÀáŽ)l»ÙÈŒæ|Š_><[þ U%zÍ(¼¾§û((ôtI°»—ú°Òèsn•Ðd¥ûmY5»ö0o¨ ~ì„ÇÜ´?{ú^Ì)`f¡öW&g¡o¸Ñ‰>·aB^ê#=ÔZ3ç.²ÍwÞ„ ^ îÎþGûéBjÆ-y½úÎG”“ñïR.íHŒ(} o÷P4ŒJý{§tM~³Bä4ÍaèE}J… ä4Méº)+l?cJ‰BŸ×÷@ÍkÙ!õïöÕá˜0Æi †æ[Kh-¢Ï³[ü°Ò¬,-jI]rÕ–oKÒÕÈ•¿˜ƒZ_6íiü1]Ù”¤òÄlÂçaÆ5Îg£W b[áÀð$ Q¾)Á•Qtã‘n“øYWe‘ÓÄôÒÖ Ïº/Ï\A&âô éàpÇp)'QméÌGºGü’0Jt _Ê*¥s£¶A_ÇpÝ뛃± Ê“)<"6Â/øÙ©à­>â<É©6Ì’úѨÂ👠G?&¹Ûju“7]b$ÆŽj# Ú`å¶=ˆIÇ{D}"åÉãˆý#ö:Ä¡AìƒÎ‰‡ÄZȡͮ2 ´rÉæ;ødM#äÖC+&Û¨?ËB!s…ÎðS2˜ÜH—rtRøHžè!ÉQSëΑÍ>W2P|Îpˆ#÷¥8MIÁƒt4©aº'PÂcœ˜ÓåŠtªêºI ;ÙG0 ÝòŽ¡vå>ÖWJoÇí±º=Vɾ(Ž}U©Ršs”ôÜGjæ¬P‡£_ôHíIÿž‹mà\¨–÷s2sŒÆ¥s­täOÌÑ9ú>ß®“¹j²Ô@£¶’ä9j°Xf+öw´Á&YQ3qέPœ”ŽÁz–bÇéh¶?Ï&ÿE) † endstream endobj 399 0 obj << /Type /Page /Parent 1706 0 R /Resources 408 0 R /Contents 409 0 R /Annots [ 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 400 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 410 0 R >> /Type /Annot /Subtype /Link /Rect [ 197 625 331 639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 401 0 obj << /Dest [ 425 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 145 652 170 666 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 402 0 obj << /Dest [ 425 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 178 652 335 666 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 403 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 238 555 246 569 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 404 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 458 218 466 232 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 405 0 obj << /Dest [ 425 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 380 97 406 111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 406 0 obj << /Dest [ 425 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 413 97 534 111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 407 0 obj << /Dest [ 425 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 83 137 97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 408 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 409 0 obj << /Length 3362 /Filter /FlateDecode >> stream H‰¤WÛŽÛÈE^õyIhÞIå%ðú›¬k³@<Ñ"[w(R!©‘g?$ÿÌCNU7I]Æ»@ŒF¼4«««N:õÝjöbµ „/V›™ø‰²Ìõ2/é2v“Ì Åj?{ñªËDÞñOty={ñî£/¶ÝÌs=Öä³Åpyš}’”³ÝHn5ý’,;ÿ\ýy¶d K‘zî2Á.aæ&žÙ„ l‹®âĘúO€§‹Às~è&ÒËÄúI||ªûžR;°$»²/ßÍÅ?þë,bÜ·x»±,O滹øx*û_t[±‘PªºpK)þÍÿÙ1>>-ðÜ7«×xÆœN'× ]_v´«¦ma[º¸ôpºÜ>Ú±¥7«™/J1 âÄ _„©›e"ñÝ(8c”‰VÏ6³ïVc0BK¼ËhL¡ö("ðrõ3%,² ‹\/29ã«!žiºipPÞÔ7§ \ñ’#;ˆ O9~‚SôNâ¦ò÷ø«>ýÑeØ%rÃ0K¯¶J–)n϶BjìV^2ìå;G&EY‹~‡<í?«ª2»¼x{ƒÂqä<"d Ëßq0ÞÚX ¦6ac”ƒÆ}J%`©oqºrDÁ®Ê—"ß©C¯['r3 .÷º.t!”“RÊi‰ÿ:–ùƒhíºÇ‡ëAo5ÖeR Ç÷äi§zaÌÖÓñéÖ| {¥Õô¥ ¼Ú ¬V™9DˆÅæ ›Ç‹„¾äeC ÌªíËüX©vnÌ,Ì× ß¥#¿žª4Ÿ×+¾SÛVv.¹¡¸s”£?ÁÑH68ž³ ÷[*žÄÚ^‹YÕ:TêÍ?±¡ëQ4B.܉B÷ª¬:œ^‹{‰E) VÈdi>9TTS>®î~-º^:²Ò«M¿¶DéÁtŒåxŒ¥9ÆñÇ -T-ôÄzAî÷eM~¦r ïý²^ÐãHªªR}ÙÔî÷<ðm9Á=ƒ°±Ä2Ø~)ðÿDf⟳ÎG²âR`ü¤ÁEHмà>A=§Õª0„‚ƒrgIä›<6'JÉ›Ÿõä¹éZ•övË¢5‡·gçvÊ@ÿ$M“óö˜—(°MÓrMñÓ#C&§Úæ{û³9VÅŸU;,E‰ûسÎoÚTÙ×ÚÐ|V¨EYê&¿%Ô‚ ¡f³ò†³‚^+Ú@`ŽAŒ ðh')©ͯ ”±4ýß³Ò ‚ }l“B¹LGâÑ–‹æ;]ëÁ$é^Õ[ÍÝo Æ¢4¾E0ÆgUtÛZ(>G' 2®ûµn©u0?5õ#Z ½¸—k¬9ì6m³ß—õñ‹xÐm­«é«{ç×R¶ ®ÄZ0ê½Àv’Š‚¬TC¹¦¶t‰˜˜zätˆÛ錫¶Ðºj¨äQÜ$͹º9Šíc¯žÄšê‹êp&fô‹JZCÜ @ÞTG|ÓŸQ6`køÁ5$fH8#·æAõHñ4‡ºÞðöÀou^š¯‰ÃQX"G?²ô5Ëz–÷ü5D·.ÌSB´¢NËægÔ½{÷kþö£QcGŒŸ7H­Í\w‰˜ÄõÏט` µCƒ(7\Ræ?‹dº°o©øc; Pë†‹í ³Ê¼£ ñ…{U Pè zHðM=$þÕqé5EÝkôÜa†Iy2 Ï3 ÈTŸ¨‹u½s˜†Õ d€§«GEE™oÌCŠ’3 ˜>‚ó~°œÎ8õ呈µ\ñ’†&ƒnnJTФà~šÚ ®!€½kÙ™M¦²Ø¡kÃJÕ[†*ë:Ò ˆŠ¹ÌÍŠÖ"yaäˆ0ŸÙuÞsžc˦§Æ¬~°«ÍbóßšÈK1‚}*{-â7µn¶4§…‘œºóYhÏÙ9¶ßžnß°ü Qc<–ûCÓö ¼ÁQÛêzaƒÅ¦®ÑÔq¬9ËïDíÂ4ÑÐ8VÖèÒ4n¢Û}Ie¢­¶«pJ#£’mTQ> Ó$¥-mð➻ڮI2G,}E0¹â=bŽ\8T‰V¡˜1 F¸m~°ÕZ£éS—ôç^Øø%FS5EV§¨óO+NU¸ç¼€óâQUD“Ž(NÊ,ª:¡—C=ÙÇÆ&cBÞÞ™wˆŸf11þ¸â§¯Ðµ~¬ËGëY oÌ[âÛHL¯šÆ,(ÊR²€J|Vç݆SU Y'¸˜I]“À‰ZÛtš†´3JO4À#‹ïÈ„šl¯¿€Àß×CBÈŠí\¢ëQÊå°Í³cÉ5©INWÄ…ôÄã[¦e+„%®Ó°E 6&4Ÿ¤ÜÙË$çî¨ÏQì¾&§’± $´=®Aú’‘n«düÎÔ·(‹±þÈó«v6JˆaíËM ׳>jìWXõ½ÊwzÕe­K!Î'ŽkeODÓcƒS`¦GX.Éœ¶’aþLŠ™ªª¹Xcè˜ØÅpÄœf:g9Ìr0 äW™OÖ|åYDÓ;[ŠÆÍK꾕uª;@tƒâŽÀs¤»ù!‚^uBk„®»MÕ0Nï˜uØÂ'ÖM_Ò Š(»ž´Õ bªßµÍq»ã™êkóÑmƒ"MIrMAh`Íj­rffJÍ…V¬¡Ô( ­Þ7ô>"b!é((xÉŠª¯Ì1g™7Ú”σšíaðãfß°D\\×qm”GÞ@eÊL1eÕ ¾ôå8;v½}²wXkŽ+jòCÃÿ¯šÞ´ zï¯Xq2 m€£E·*-UœrHÁØXÂ6²q€þüÞ¾™gc¤í%d¿fÆ»oÞ¼©›¬ 3>ÝùË}MóYpÍò2 ‘Bd,Å&‘Jž™4A]Ì7Q¸FEQZÅ‹Í"d¬"냳™§cÙØvWU]î_0ï˜u…‡¢°Èm!•¶žº¤¡údwT¥$…p ¨/×f/2VØÂœ¯ˆq 8³¦<êØåh‚­#çÑ~r=%ô;gÜÒ·½·Üà(\ãî¹½Ø|ŽWrV·àգݡãrf8gŽØ–áÒ¬Ù­C:r͈û›}ÖÂÊ¿¤°¥‘–ñ¬öyþÏñ+§pÃYPV•×­ZpCÂyöA•Ò=ál§.Ç5>eaMPPžQd•" ©î¢í®\JEÆŒJ½ZhÖYó~‡†ÀåùÀf> endobj 411 0 obj << /Type /Page /Parent 1706 0 R /Resources 423 0 R /Contents 424 0 R /Annots [ 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 412 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 610 358 624 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 413 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 201 542 231 556 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 414 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 331 517 358 531 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 415 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 501 120 515 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 416 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 391 462 432 476 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 417 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 260 379 309 393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 418 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 233 352 263 366 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 419 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 446 339 475 353 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 420 0 obj << /Dest [ 1233 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 307 271 356 285 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 421 0 obj << /Dest [ 576 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 217 120 231 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 422 0 obj << /Dest [ 567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 456 94 478 108 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 423 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 424 0 obj << /Length 3453 /Filter /FlateDecode >> stream H‰ÄWÛrÛÈ­¼ò+¦ô’A–„p#n9[e[–£,;&ìÊÊÊEÄ ÀÂE\úCöòyÈéžH‘²+•r’òÖŠ˜KO_OŸ~ÎãØ®ˆ—×þáOE¶9NÇö$r|¯ç/ëH¤5ŸqDƒó×3WÜ×Çv:“FÝÏíà“|—X#ßä½¢¿ž®/¬¿Å?¦,a*BÇžNðŠÙG?Â<–E¿Æ-êVGžc\ßžH'ó˜íŠf…O* ’dÕâù롸ý§5ã»ÂÞØËÌrdºŠÙ6k¾¨*g!¾LŠ…5šJñÿŸcóÙ4ϱ'øˆ/°Æl·[ÛòmWÖôª¢g!OÚøéÀºÔ,­XÒ«xàŠL ¼ñÄö'®ðC;ŠÄĵƒ@ÀÆ •,/âÞ¾‹#Îcoì]íG eüw X`ØN€íûQ(ôgçÔp<¶CïÀ«nçTxMòlü³BxJܨ­¸TIÓVªÖ®8¿<ÉŠ^²3z I(É“¿cå.n°Ñ8°×:2mg¬wFûÄ9ÌÄ5}C)ÉkDR UÜg…E¹ÉC’åÉãêDÒ’Ç7MŲ¬º:$z¦üÒ®’*+Ûö& ήk[|¨3Ä­±F—žƒ0©.‚€±ÙÅŸaa[7åº[J6›¤ô!d–ðÐÏ𺀇ìB5öQ‘âÉ`*pÞ›ìv}˜/¹2¾¼~û<¾ºá>éË×Z mñ޼ùHç$B1aÞÞêk¼Ç[.Œ(Ü7è¡ü¨Qñèú‡™Y ¬IÇñø$?tº²˜@v~pe¯Œ~׬vn‹O.ZTÂOÞö޼x5»x›soo®9”üõ“þFéî&Ô¾¿²Fg:zÚÿ¼rÃÞ"2 žqyÞITO`T´_ë áwê AŸ'xÞ©J´ üÀ™Ê€= þ ÜG¶w@Ìž2X×r[ÖjˆPÏ4–h<†ìŸ`¹9£—€Ø£. ÄGxy냎="MØõ^/^±ëÞ°ÈW·¨'öë¡4n‘í»GÁ:íïEFzRÖuF¼¦)Ѻk}f’‘¼/ˆ©eÒ‚=0’Öd pžÐvLj£ªQ[×¹zP95ˆ¥ÿÖè¹MR4¯ž¤*§sXšg Wê!CÙQG¬Ñ𬔂LÍ­¼â—CvÜL ½PÈnvƒ6ÀXꕉ¨7*Í–èjè%pW$Í —³1=¾ÿH ¥"õfCC41!²ÍåÒkv”‘ ²áAFîÉžÛ |ÒÒ"bʉnKíåž#¾ì|œ”>¥‘«[(ôÀ”æ"G¶ÜI‘Á´1á±_+°š±NuúÃM•–a:N"½'JS"R <#MÚ&ÕŠP“F꟭™W9æ`?Ô‰üCýyF3ÆÿCœ¾wvÑ{…™h¡óHî2S9‘Ô^ ‘_ÜáˆC¢šÇß÷”}oŽJ½’pÄeg5´¸ײÊ0KÁã>_ˆƒÀ ÷Až”æo˜`ªŽ4âõð :3 *“M¢ E;dÙÓ•®~>2$«Àš —yiîôšÔYÝ”š-NWÉšcJ®í¹^)y2jQÛ„I†ÝhøyªN¬#ŒK0« «®Ó<I‚/òŽÑh½1¤×DO–ë¦"cxkˆb‚_e_HÿæÜuFšÊ=éf¤3ý†ÀØ<°_Åñ¨ Evê’5U$×b`º¹„Ê¡´]c[Z©¤Q"¾¥þËõÕë?ÅŒˆñíÕÅÓ®Ú·/'è¦Ô¼U<±=¼äyƒ3&©Î3~’GAŸQÞSL)¤¶ÙÊO õ]’²wCYtìv]. ù,¾=гNÁ³SB´ÇÑ!:žÅÐg*o©÷yòâ D“ëœÒ¤Ⱦ ùŽRòީŔ ™£‰…¾M$M*+Ò¼](bþ4?8zRí+Fèû>LÝÇ2‹p'å×=£™ž† -øØËŸäGtlî×>÷ëH÷kž9\VgÂõ¡<òl3¤ª—êÉÔ6L{H•íÜì•fšûdzRêEò fÄBYÄÒ"u=©½ƒu逗Â9Ä70r`¾„ŸŒÆÁTË`-ÙÙ¶)¿Côž†Ú¨‡ÚèphŠ04Ñdù£˜™öߘ{Ø4‡ýÖˆrM»YÓãs,áß&É *ïJå Å5Ñt Ï‚ÈT$?sœÀ7‚xЂ龪¦¾çªÙ’w3´[ˆÉšRŒ|¾ÓÁdù-H=7# ÍàÉ?B•SgôskF›ªDïej¸[£§Òg"¸B9ÜÑÏšN‚¹ÁÄ1¥Çviƒ«¹VM-ÐÏ*½ÜˆsEØð˜œ$É'.ÃHî(ýY¤È´†lȲ½_íIÈc (EA¨[2}ã ¦úZ¶i4+ µ -Š ßµ÷ÿWò+\V2[ <ºo-˜<ÑÝ]¨_7¼ÀgtØg!€iò/Ú«¥7m ßû+8®+ˆ‚M8.x1VýR¼IS)RÔB‘B‰Q•ßyÙ˜WNí vgv¼;o¾iñÀST£®yÿF}vþ»Ëü—"$G½c‹AñÄ«¬'pׯI`_›o1ZBb€ykΦù<Ë·UMA ™¸û<ïí½ç/»Íœr¢sË£¬Áf9R‘yxšÆYØ=³Ÿj;áán֥о5¸]IlÏèÓõ„}ÕU‡Â"ÑbÈVvb;ï‹ó$¤¿'!}¿5g¹Üа L³ø  f›Îh4„à†ÝíªjýAwfô™¯^·kìGàÉ5kh´Øbád[ :Óþ$º^¡˶o_¯ú%sc`É`97%3ƒÊî¬n–ÔŒûÌ‚<µd–\ðÏq-!ŠöÛè4ÓTPƒÁ—£,s¾ãÿ@Í$Z±ƒü7P‰ÓÃyÅ<*@©9‰‘U‹W ¹Ç˜?Àh_~¥¢aóùyE$€“ø2ø©çW¾„é§”5qÐ9åH^8ך‹Ä¿¾Ñ?œP/€ÝIRu䎂Y´cÒ Ju h<oY¹‡„àðk·ZW=p:AâF½­=Dˆ—ö'OIퟎNîÁu›¯³ òëæ[_eŽkšÜÞ¡ç T‰Õ•Ý¥Óœ>?R€Q˜}.XǧH2~r¨î¸}f±•¦y†j#%§f¢(Q(´¦w`§:NÊB®‚ÖìW Û  ›¸0Õß »N~R?ks¸3Á»Ôþ)Ó`' ‹TnfãT¶J ¹€€¶€‡¾Ú<£‘!Ô$z=³¼jݰ²”îZøF8Ž3jfÖæ<:âùS¤UJ´@.ç‹]rà ?»7็Új$ꬥÃÐjEÆÊ‘(>¹™÷ O(ÅïVø-}ƒ…e©DNãÄŠ¾l‰cå”݇\ä:‹x ñ·qä´d–øVcËÆYD°×c&€=í‘ÚUC¨ŒýòW€%5.H endstream endobj 425 0 obj << /Type /Page /Parent 1706 0 R /Resources 440 0 R /Contents 441 0 R /Annots [ 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 426 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 344 742 374 756 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 427 0 obj << /Dest [ 576 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 93 701 123 715 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 428 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 182 661 198 675 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 429 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 661 235 675 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 430 0 obj << /Dest [ 742 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 389 552 424 566 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 431 0 obj << /Dest [ 737 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 93 538 129 552 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 432 0 obj << /Dest [ 604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 93 525 123 539 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 433 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 481 471 511 485 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 434 0 obj << /Dest [ 604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 449 444 478 458 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 435 0 obj << /Dest [ 469 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 198 349 214 363 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 436 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 397 349 413 363 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 437 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 459 322 475 336 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 438 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 157 254 173 268 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 439 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 203 63 232 77 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 440 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 441 0 obj << /Length 3437 /Filter /FlateDecode >> stream H‰´WoÛÈEÿÕ§º,$†”D‘ ÛM¯µ“C¬´i㢠ɕĄ"’’ì||‡~ÇþÑ7³+R²œëáÐàp1µ?fwfÞ¼7ûjÖ{1› ɧټçÉÃø3Ž"׋¼ …ÓÀDÞˆf«Þ‹‹:¢¤–5ÕIÑ{ñúÖ§EÝó\Ïã5Io°ÿÜõ>ªŸbg0rÇj¡ùïP‘?&石?÷¦baJ¡çN'8e¹Ï"†b‹¿‚‰1õï!FCÏø#w¢¼ˆîéö±h–*íÀ’ª³šÎ_÷éÿq~W˜ Ü@eާ’eŸnwYóEW¹©¸HÁTÑWùW.&î‹kCÏàÇìcrƒÝnç:#×W5ŸªùX˜Æ‘.>=x—Ø¡¥Xºšõ|ʨ7 &îhâÓ(t£ˆ&¾;|GTéÞ¼÷jÖcäc‰w.ÔG·œ}ê½øãI¾ö ƒ)çMöªß˜Åc³gZ‡¬•Ù,²f\/03|$ÉŸ¿Øõ«b‰N©vcÄu³^—ˆmˆD4ŽÐ¼¬Èø?QHúIÏu‘Æ-‹F q–­bY6¶;k VA„ÝómÜIaªÐ\†¾R¡wlw««:+ Z•©®élç «Cäâ‘冀>ë›ÄØðˆ8s´7îG­qþdãgÃÈø’¥Øˆ‚“/ü:¾‹ñcž9Hw¤K³ö þ &Xâ`Ú‰àÔÆÌ”il>øfV–î§ vöÁ<‚´¦;%ã>p(ÏEÝ92Ò§‚]ôb`VsÜÝ`0 ¨³ßÆ*Í1²A¤U$fЬ( ³™ì]6I©Ø2à@ -ú“} 4:iê ]èJ*;Äٯܙª|Ú_¤·p)RH}ý’ί¯/ÏÿÎS‘º` …ê-.5TïßÌîÔÓ7ð¸9ÿË•YÔm/ØŸRàò#•RSÒóר/8pãçò­Ö`2±ÓÉÆ|†²X°+ÈøD|‘ ½¤wWïyp¤Þ½ÃP¤®Þ\8!BxeRü¯Ëó™,½2îýÏõoíü³Ïlkáp’•¶6$5X>qý±;ºsÜcŠÀŽñ”P Ã°Íæ¯ ‰Ù° ßЄì0Á‚œ¹¹¦•Ã;LˆöÈYÕu 8®õ© [ŠmA†LN°ù(‘‡Wšú\…ûY®â/¢¼ÿR}Ñ”g« 3.Ù3ózñ;ÍòE³pz¥©(wO"1Ú‹Á Ûf"šg‹Mßçúø(`èð¨ ;*°žnœ×H-g@Ú«øae~.ìèý‡–ÂBwvþ¨x9¶+…*°ÜaF7¨*0 Å…¡¯”"f׆õ%“ãtüZ ñ¢6/¶Ò.õýfAy¹Xd»=Q \8T¤¸ˆŒƒd&z‚ÔÅ4úYMø*)«Q¶cµ,w惚l¥Ígã°(Ä«5+½E/°¤U–ç™ÐÈ$˜Àî(_å›òâÒ+Éã`Êä³5`’8‘Œ×‘ÌÞu¾Û2Þ‚£$gºHPû#•—5’~F’ßèæTm³EÌç¾ÅgÙ°[fÉe’ÍËlå+€¼?mVkÆ è- Ýk·àÈ1Ô…Ê92ÿ,y‘ª<®…9¾`ñ>‡«”by)¢‡ U¦¾ÍŸdùøm$…ÿ'$…-’–t’‘¡ºæ>©à<Ë€ýI\hJm„,ÊÒ§ÐB›x€,¿Ëßvb<ãcîh6ö,Q#­sÔ®u5¨u-É}Ì­¨Ž>ÁÈi«Ì*„ƒ˜%Û;'\µ,݉às €×Þ³ ß›s°2Ø+f°²¯—Fße‘ð€¯8Ö4ß ¡ÊÊÂÌÐíÕL>n ‡SuûÚPÜåû›ŸÄì~ú3‚PšŸïð“;´ó7·×çfèê—j}ð½´þ[e'#ý€6IøIZ¶ŽÐ!ôH}³Ôàhx ‡]­ù]­%e.`›ˆœù3éõÌzÁ RLÊÕJ²gö™›ñ¾ÔŒ ^¸á¤%ej˜U›‰dÂ%ìMŸ€ãTVX2ö5ÎóGª?gë5לž2lCcN£0bZäKöÞ•e0 ‹Ún*7ÍzÓ°?ñ¶Ìر’VP{ª›8ËùE›ê9¿9ÁžÚäÍóUÚ…nâ{ægÑ:Z£a¡2ÿ"ÊÀ4Ä#.×’A3Èâ(!Ŭ/fÜ2°×ú†EcjÁ€&¹o¡Œ¥ †m“qXƒmÞ~¿$Ç¥D—W¯Þ¿¾ýÓÛ¿ý8»º1}?§ŒÖNýõU¨[™N„ßö½?óä¦6ùv¥¸í¤òícÕ <«§m*ì{²H(kôŠå•'2ˆdœÛE‰YTe‚8¶«ŒûBkÏj)J¦owØÍÔów—R¿­ißzÿvmÐMkVLæó*^éFWVñh^rðåu9Êï7YÞ 2+,KLçb’‰ )iÙñ˜†h¡Æ‚{Ú,±àÆÅ#Ç—ƒÅ˜çJ˜´m”@8úwµE Œma{ò$áœyVÎ:°1´êr¥íQpj}ܳZ¬v+Û®ìâ%âûðΪ&Ó©A·‰¿PJ©Ê•ÕŽÕŠ)%g_7µ<Ë0üõr¯¶wŠó‰oF¤˜›Aõº*`Ú:‘A¤!Iî€[BvGÓ`¹7ô¬´>]8N,lõ£ Ìl®ÙÙ­\ æ¶ ¯9¹èÙ Bs +©U}fÒgŸ¦#&€‚qPÓgýhýʳû*®‰sjÎùþO襥¨Eõa±˜&ClñDŠÂ£—ß©½¤ó¼-¹7×ÔÄ‹N PЊ….t•%ô_Ò«`·M ÞûȧEr‘ 1&¹Gê­•’c¥Šàu@5`a¨Ú|}gfplG=ô”ð¼°oßÎÌ›·¨dÛR³ppÉ µ¥ˆŠ…S9ŸºoÜoÒíõxxÝ$ò¾ï*x<ð TY>é]zé~ê¼+l×xÃê¤Ã«ð~´ô¦ja˜Ú+¿ä&º®íÜÛH€4z>…lþNÚ ÔÌ 8™Zvàé“î„dzJM •ÿŽ_À:mL}< °ŸyºjÜhð+<½Ü“ЛÚއl–»j¿·Õé&Ÿ/YcFøŽþãé?O°<ûÜñ÷Ø >Í9©ö)1|7A+: »(I²mà· a i^g˜S²ò«ç¬ T¤‰ì ½*n¸‚h(Ò³Xt!úYzrK¢º(ªã‚( ,tQOßÍp z@33m¨ Ê¿ M .ç·Y¯ü™²ÝÀñÇ.[%{?WóÞ¡äñ·.65ª 3ª9’ÁBçcKýå¦fмÕX`ÙZPØ]oI¼Rô_­‡è–wzÉ]D žBÁiš%îZ´î=‚cèòiúI ê= vÝ¡t’d>T2 k74šÝ;|¨ÌÔÂdh'@¢¬kã7>9Úî06mï¨J'âªÚ~~k›Ûæq=³píYØ…×`Ë0qÿîšÿ ð e4.¸a§dõ ÑèPÚ¡ñ,JWU­Ò{œpÈ߉€<ßFç¡j+¾É,BÁ2çÕ:ÖDbQÚÕˆÍOñ‹©•!–cödŸ‰Í«cÿÃEÿоÛÿïèýלøÔàêW=&¸§ ÖJUq´@ÜR8¯Â-C9´€òÁÚÕþd<õn\zgN—¼J£ä]W‹§®æ-÷²í~/;€ úñÓr #PƒVKßPøÁí?éÙË%Xr 䃃¦;d0tAþ+¯u¯±|(w _È>(¯LW€ÙЂƒ….â¾3CG-ßè€ ê£QÝvAp\ôo ¬ÚYõ¹pë?¾–+^±„™‰¤OÞ^<>ú+À]„WF endstream endobj 442 0 obj << /Type /Page /Parent 1706 0 R /Resources 445 0 R /Contents 446 0 R /Annots [ 443 0 R 444 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 443 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 110 165 152 179 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 444 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 110 151 152 165 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 445 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /F5 1671 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 446 0 obj << /Length 3329 /Filter /FlateDecode >> stream H‰¬W_Û¸G_ý)X¿”ÖZ‰ÔßÃf\²wH{IŠ‹{ÉŦ½ºÚ’!É»pÞï+ô;ô;ö¡¿!iÉöÊrözX¬Eq8äo~3œ};]O§‚ùlºù‚yøÃ#H×K¼ˆÅièF‰'Ùt=º~U'lVë5«gÅèúû>[Ö#Ïõ–xÇltT{ÄPN=p¼”ä¥ÈsñoTú}ñfÁvå¶b³²XäËm•5yY0ö9«Õœa £X­7+µ_äø8”nÂÍê¬fsµÊT py¬?“®Ç ¨±îjÏåÄw’(?j1ùÖ©ô—ÕŠ­ò)'³+‡öÚ±ûì¶•œX†YóX²r¦×̀ʇ¨rB¼™_»¬˜©ÚÛœ• '@ܱ/e¡ìØü¹j~±ò©Z=³¨t|<´µfe<Õâc» ×8Õjî2#¹×Š=f;(äG»µ‹Y‘Ä b*³KçêpqzóBSJ.@œ2•UŽO€V¹²ÈZå¢là±#Bf {x•­¬s4q…Æ8Ϭ¶Í·fƒl©XV8šˆÝcæÄô¼j§æ,[­K³´Ñ7'²Ù*Ÿô¹Ù]è ãfU4¬Þn6eÕaÍ«K<àfp‚»Ã±]¥²[«¬È‹¥û„)4]øØˆvBx•¢“"tà˜¦dŸÛT 3äj“ÙL ùÜ!w–¬1Gjx<(íáÒ,Ì—yP/–¬É‰ùµÒ!JÌÑŒŽzEáÂßë©Y¶RÈ$¾Ïíq°M­Ï\‚Žß²3»ÏŠ¥AÑ8>aÚ4É7JDZ Á©C &ãÜ·8%æwß¿»£ÓA#t„åæµ½3üÂN§Å|L¡¾ÑšPZåµÞ»¹Õ›™•åšÙY‡™IsN±üF[†²‘˜²!…ë¥m®œ™„iRÕõw¾Y3‘ˆDIdÄ&ôot¸3A¦ãE¶V/ÆÓ7oµMc3Ùì6˜¬› î°S³r —b¶PH5ãëÛ=[¿RT“Li tùT]¢X¸©0ÙÑÀ¢äìQöY”¨tLg䃼üâ4jŇx8Zz‰+‚³úÄíéQê¢þ±gÄàúõ/ˆ;j¤»—ú0#85­WŒ‚wP¿RWPÅ‹BÑÖ/Ž+šZªê8„P:uEé³"HLjßÖQÙÀÄ*·§Ð!] \aÄŸø`Ô†PKƒó<k/ñ€—úõ/ˆÛÓEJùçwˆ58#ׯA|H?Cgäßöw­m8!JѵCOJÇT—ªÚ’禠ŸA+2˶æU™nÉ,¤Jó–ZÊß™²aro~sM0Ò†êƒäè¬Ì^6íš7ʨ!/+Tv’H‚/6ÑgÚà K§ë¼Ø6J_ˆÖry°Ö¹‘‘T=&„cQ+Û6£ÀP[„öé+ ¯•Ù¾d"b:ü¨ä"«·µ<Õ(Ê¡6 ’ýµŒƒC¢Ã\+4’óúôþþu-AȆLÓ÷¸ú0î»È£¬`ëÒÖôÃŽÊ4=¶‡A+9ÛV¶SBÓØ¶‹ã›™-7¶É2ýÎŽQ~Ñ]Ô‹}/H>||ëšNÕuo®Ï(ߎuÁ¥>b… ²bÛMoƒãÅÛ±1íg^nwdõöó¦*9ºs“ì~Ò}âQòŸîÞMÇì·[Ý•Œ){–Úž#Ö Z÷•3 øË„ûÝë—?b¶Ðÿ,‹ù-YšðñÏÎÓ–æ“îMñM ÃyM­št¸XÖ/[‡ª*KµAŽ¢d¦\çîcŒs\ >5¡fÞÆ ÆßØ[³/ ¨õaîË> }>¹B™v_RÇ÷ åÃrCIžn¤eõÕË4ãv~»^Ãʬ)«Ý‹±?~’þà ªábʰV|>Þѿ îNOº*ì?I°gÄ­6¾ZÛ@7UÇÚýbú¦}êÊÉÚ)>uÆ)Æ ÆÇÇn¸ûñÛ÷ïZ'x`§ê { àì•öÃD60½.vó![mÛPAxÛOÝc;èi B´maÆUòN=wF>L_‚¾}3Û]‘Û“¶6ô†=×/ÞkéýÒ °ãŽÎ®;ëdƒ–Ï®7ká%ÃÌž“{<@»=|¯‹þI«y6A…¶ª£eMâÄ6Í—“¦VxýxâDÆ=6ǃ=#¾à”°»ŠÅ=QÕ'êb ÏýâV;ZqÞ˜~ñcdw1à´?O&{× tNN’ý¢¬öC”䢩÷o“É“{ÃÌ÷‹/€GI°+î§iP—ös¥è$&ÿöæÝëvô©%rØiýâV[ ;­_|áÎyÓž™Ì8œ¢ô…wXÿz"Övc¿¸¾´ †Lû.гRFkŽÞ8 B§ŒžúÀš^’ÏSu8¼²÷Ö,Ùo}Å–=†u7éí ZYÓ°ÿ‚¿î²–Qom‚ ñ†Ã±_<P߀Aò)m>2ÔÌFÑ0V™ÿq« ÆÞñK£ÎEtÛO’{F<œµdØ‘ J»¬uÚ}Èh˜­~q«³Õ/¾]j¶‚?¼:È`˜ç~ñ°¢ãy¨:Lß¿~ÿ‡)‡}Ö/nµÅ°ÏúÅ"Ü;“]¿¾8H_g¢KµAúÃNìבöe¢ÿ«6HOçªg‡CýÅÁîúŒêp´ç³«ÃÞŠKåAzÃÙ/)‘ôõåA¤º»¸TD:þgÄ­v2~gÄ­vµâãeií¥TiÅ‘¼=ºW{XÚž8¸Sq¢}F^O§Â~ Í5ðœðÈ…Aê&^|^HÁ7ÙqÅ^®UY“?¨ÕΉù•qÂY¾`»rËæ%+Jǧ©†JÍYs¯ØÔ ]Áß8nŸ¹Œ,/P ÖØ§,0&ÝŠe›Í*Ÿé¹+öë¶ÖZ#8Ó·‰Æw}IŸsQÔ‹ ¸J­Ë¥lKÖ&3¦³˜»>GxPBC]O]É]¡:åHŠV6W‹¼È MÍP©ò ³…ãK7ÀE°K¹Ög!¡,òå!HÑ‚L ¤Gð8U—™OT묅›p¤ˆµ†¾ë2K³>Œì7¬ÑN“ý÷­ äÇ-4$:n <_ƒÈ€«­#aš™›9Ø—ß²¬Ð“sýk,è¸? ³âæ„çF±Y39°×ŽD“¯Š|€ãg’à‘­7Ûfvk昕Ý;>|QnWsöŒÞgÎÄ÷©ÐóK $8Ԭ빬A¤8¸ò1_;§þWyÕô¦ Ñ¿2ÇuE¶‹qª ¥®„DK$‡ˆ‹m°äØ–?Šèéïí›Ý8¤Ú Þ]{fgfß{³°< ÕTÖû§w8»°¯ÙÑ·’w/ž5*k¤(7áh8™\Ðï .¶Œw}Юk .Öìá̈BÝ]Ç.¥¬ÐtÊòœçu,O”š=Oi]dų3¯NG]Ð53æS*k³âùÒbÜJMiz„~OcßÒx«/B´ÆÕhBG[ÒÚõŒ:ûî`ÂIeÆÙu’çÑ–±BšªÊÓ½µÚM ^Ê×—ôSóXlqt¹¦;\©À'ž½˜Ó›^e:gââúøÇÌ××øý­7´~î·†]Ñ;ÿ?Åd÷С›GÇ÷Ւʺð[€ƒYæ¼ë¬j!€§¯ºbo «ŒÕºQØ!–”—[íÌ;e¨ÃÊLʺXGêð ËøM„ ÐÖ‰Ë{Ü{‘™ø_ÌŸ¼†L"ÏðìÞ­¡êac ÿZøcŸøòP‚þÅÿ*Y@\nÙÂR8ˆ¡ú2yLfëY¸F¾ÎÖ+£ÊÎðÂD¼$’—KhT#Ú²„T|Týdù ‘’_ðŽ}г­íèß¾6ùn>ˆ>ôÀs#bS¬„ÉX-f›ùc=ð>¨€×gÛRÓU•ùǃ˜[P#-ÎÌ ÚìM}SqÓ5¦m¥æ¦‹>Y …h×Iö¤°`dÂú„fó|N–éÈäB•cõ«”E>8ä™áõÖÚûYßóÒ£¥×uµíÜ íÒ{`Ì»7СÜ5ÄŽu Æ©ÅJ¾NôÔ7‡&±öÈm7‚¤„à Dcz¿»œÿrÙŒÞ endstream endobj 447 0 obj << /Type /Page /Parent 1706 0 R /Resources 448 0 R /Contents 449 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 448 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 449 0 obj << /Length 909 /Filter /FlateDecode >> stream H‰¤VÝnÓ0¾ÏSœ;l´z¶“8 H]&ÐØ¦Ö å"K³5µÕZV•áxG.8¶»6ëšnšÖÚùŽÏÏwÎçæH{ûZK ¯µ6¦ùÈÛ?é ¸žzœqnlr¯u¿œ{_ÉEF[> Èua¾%¡€~Óï½ÄzH â,QÅ™â.ˆu ­/³ •sõGâÓ–ä´%|¦ár½Åh6Ä'’=‘i9…öÉ|ùK[!îo YHJÊI>܃޼œý*n+ëÄ'Ùh@[ ßöÓ&fË·¥IÎnô1>³ÌçsF}&ÈÔD-LXt!.9V—/ ­§T{Jðd¨˜¯ø‹cP‚`A ·…wåé¾@þ5ÕÜ0‚Yêïµ6a—âÀtIq†ÿî²&¢U/ÌÒ¤¿ÿ|QUP•? c¶2‘ ³;ŠéÄTÄb³ùƹµÉR #!îÜçÒl”Sªƒñ °j覧vÑ6‚h‹¾Ã3ù”¶{݃”#@úà0ßL²¥Oç*w»Òä‘ •döfå~Ùã[Ú®˜ÚäºLéÊ<d³l¶˜4BohKb£á®ƒB’U¶K’$3Hˆ5h&(ú„3ÀИ¹™!ˆcffS@žà²·ÅyB7“jÎAáâÜŒïŠƒÞØVX•£&†žÁØÙ–×å(«6fçúŽª«uÿ­pªLX&¡·Ü̔黬ŠÑM`uã¨è¦=ÚRÜ”ùú~Ñ9ÿpÑî¦}rÜÖéùÙéç>š¶õ;×¢NŸèv÷$ÕìX÷p¥û´O÷VóÌÍÜ ˆ|s9€âÚ(?NÔ xÄäƒãÌ矀×Ñ##\‹"ó<Ø<½62ÜA³ˆY(ÍÍÌuÓ·i7=ë¤uòúôÀHv}Ç¢ou¥Ž7à£5©×YÇ«LÍu7Öuï`}ûù'àUt‰úZñŠ!åÆñy¯Ýf “æþS‰½ÖÖ·Ùc™/åx[Lª •’¼˜_„g+Óð"ù?ålJå‘PV¤9kFMÃÚܯí§w£õȆö&‘4á»U¢p–y°E%[dq°1ÜJE&JcÂͰåÊÁ;ÈÚ~þ x=ªÝ8ÛèjÀ¶¿[Ý¿ô(|3Á#Éë—kíÿ``Äü endstream endobj 450 0 obj << /Type /Page /Parent 1706 0 R /Resources 454 0 R /Contents 455 0 R /Annots [ 451 0 R 452 0 R 453 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 451 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 313 228 321 242 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 452 0 obj << /Dest [ 763 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 504 139 511 153 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 453 0 obj << /Dest [ 775 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 299 111 313 125 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 454 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 455 0 obj << /Length 3169 /Filter /FlateDecode >> stream H‰œWË®ÛÈE¶úŠÞ¥ˆ´øIA€ñµgÆ ¶VgA‘-‰¹©!©+k>$ÿÌ"§ªš¤¬+OÃðÍêzœ:uúÕzöb½”¯ÖÛ™¨þá'JSo‘.b•¬–^œ.Bµ>Ì^‡,¼7ë×xÆœÏgÏ =_w´«¡ma[z¸\ ºÜ>Ú³¥7뙯J5 –±ƾ /MUì{Q¤c”ªÖ̶³Wë1¡%‹¯³1¥zA—ëRÁ"[°È[DR3¾ò™D¡—W õ—CB}[›ÐSžœ E@y‚c+ýTš³äá&FãALØÿ¨ÚÁTø@Œ¿­UÓ¦U}£NuÁ áa—yW™êLûdÚ?vX©òª4u뼩·åîÔf}ÙÔs•ÁÁ/'ö}&…Z5[… (Ç_èMÖ•¹ÚœÊª(ëÝPD×÷(Î×peS5ùc§hOÏͱïTYã{|b‘!èà*ÿN™zWÖö­Ý/÷¦:nO•7æç¦‘†irS‡‹èªxgë0¤ ˆrRl¥^q$ð‘ïÉQxòõÿ®HŒrCEx²­×ûoEgÔÑ´Û¦=tHDkÌšSVUuhZCU©LסLÇ å0ªÏºÇî¥ðGë g:ˆ)ÓúòƦ·í3bvp_òEuŸ5>:n„bŸÐ´uMEí%*IL]FT‚HŽmÓ;nŠ›&oP`Ù1lަV¥³Bõj‡¾+N]ß^TGèËÚ‚ÃŒLðÇ–b¦{£2ü¿ÅÑ7pžW&kUw4y¹-sÆ(SÞR~áȦ9õjßœ‡rë7y¬pImŒ*ÇÊІÜäª=ÕØRÉ]~Y^%o5ûªvëPâŒË_¹²x Ax`¤ùˆÂžÛ¸ËŽ$Ö 1šîѤUÓ£Û(Ë©¾jNzÀ´JɯUmLßíº…k§€Åè;bäDÁ3gâÞ±ìíæè¸F«í èÃ¥\ÁÆ'˜{_cÒ Q†h¦çw¢s9•|){Sç S ¨°4aõhXÐÿI0ªÈú YÈzB$fF¾o›ºüÍI¨D JŒq´¿FwÊè°*¬d¬„ú ßw¡M~Fâ'2jª-í] ýw5ê2?ó¾&o€öúB~ý_º¾>"XrÎkžòý¯Žmiú¬½ÌUô6Óº…Ù–lþr4…ìúOâ—?ùe÷ss6 ô9ysÈ…ų!‘¦.Š)2¦éÖîMËI‰ác›m*@·ì¥ºÓñØ´ø%œ„AØ:˜©ß¯ÒüNÚ(lȺ)² 5GI#¯…HŸM.Ù¹, ¸òÔ!rIÐ!ª¢u .V(/,Ê¿¥šºÏrŠw’þƒ- yÐ1–îÕÕŸØq˜ÛOYe \P±È&€ê{ôç?(+ìÆÃ#¤ºFkÅZø.£ËGôgUÒ¿™+™Çõé°1ö³FL)æ?Bö¤úá³>;i¨ ›±Z(s 9gÊjraòáàðKñâž‹úð¶<îŸkôŒ}Ôqâ¼i¾QÝ#}űÅ)Ǩ\PÆ.®»Â„¨›Kœ›/¸¨]ùtøÓðí (œ:‡Ô¦¥_ÔšøÁjKɦàœ,9Â20mKZªtXDVÌ©bP}Ö—æ¤rŒ3ôŒ áÖCÏØm©¡Ýè µüh¤}˜ŠÈÖ³N¸"{d¦2«ê¸o°‘€B„-¡ë&$omgt4¿¸-Ý"³r¿e©ùÒv<A˜E)ªÌáÞ¦÷õà U"Ø¡×Ð-Ç Ùr‘N_CÈa‡¹zÿöýW„n{/õ~ëPâÅë· 4Å¿¡„3eyPZ‰~6dì2ÜI¢L E?&å€úÑøpå“ðÆãgñ„•cçù¡’&©àÜ#kyL ,C˜fª¡Bcº¿-^X€ô°l²®ˆº³~øžzššŸ|lÎ,Ù\ccÇÌ>?ø;üã¶"˘´‡koÆçžºžMhŽÐ9èhnCÂÑÒàQ¿žèÌU¢IØ-i™/ìõ¦´¾º$œäœiÀÕ¡±[cd‘0¿O«1ó+‰ ;«2ÏÆGš'Gio”ý=m¡âJ™0Ü2Íðz…Dd¹Û÷$7±CÆ×E¹½(Æÿ R“¼2ÃåØÚ…O%é#k‹òE;JN*‘ HàwÓö\›5tP4æŠüÃëWîFúÃÇ*‘®ue)ÈÉà%ìúÒ*ºÑ<$•æí½Ü'–oÍK^Äß9*'}ç^ <1MÒæ¡d “¤òòVfÆ^\«Ìt-©XûÉÔ8åÓ-µÚUÍ&«F‘ø5ì°b99LI lRç8JtQ…1*ýì(¹9ña›Éýàã(*€5FQq•ÍïÌY2å,±ÒLý¹0›Ó µÔἚrfmÓŽÜN]QAÑV<ŸÿÛ{¹ô$ DQxï¯`ÙnJ 1®t­1îdÓ H`jZÐøï=çÞÛÒ¸@ã®03ÍÜG¿{OèhvwXÏ×À›ÊUžïF3Œÿ2–þ,G,¥+¶¨‘_#”F"º‚Õ±Þ¦ÃúHy 7ãtr±ö©+òuË=f>¤ïÓ³òñ‚lN¡ÝdB¡Ðm‘ØÏÀ•ÁŸÁ‚ǰBÁ’z—ÉÃ]E ËDŸ<…ƒÂK¨Ã*o]æ[”A¬H±iõ‡!eøü .ìÃ^bËí¼Š±³/T*® yË0ä‡jƒoÒ ÔϹVk_<ªŸ,ùBQ¥jT¶ÔÓ½¦iƒ%Ѭ¾5\g‘R=Ä¢xù’\T'oÇf “I£Â}4s¨¤t0xC16îmÍ¥^¦Oê\˜HÖ ì¶Î , ÎÙ1äQ 5SHÍÙ»RŒ(ašÿ…è§G±ê<­¿G oÑÑ|ˆGµ:’ã÷æëìóWt·.QuuÍ+ÁÜÆH½.Ò–!-\€XB]77Tmñ–s’*å‘®@qÒ§:;ù}ûv³ÿà3:¿ýqwØÂÇ nExïpÛš†ÿªê%%bÉÆÁ=€.QáÇ"{‡àG¾ãè$„˜ªH?‹?¥qÆ’xqŽsIúË~ x#ɶ¬Ô`Š$Õ60·¨ö…=|é¾’u<¼Ü|ô¢± endstream endobj 456 0 obj << /Type /Page /Parent 1706 0 R /Resources 461 0 R /Contents 462 0 R /Annots [ 457 0 R 458 0 R 459 0 R 460 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 457 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 428 673 442 687 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 458 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 463 673 476 687 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 459 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 424 658 438 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 460 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 458 658 472 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 461 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 462 0 obj << /Length 3017 /Filter /FlateDecode >> stream H‰¬WÙŽÛÈE^õ¿¤4ÙÜIx‡ƒ12ë)ã `K¥3\4"ÕrçCòùÇ<äÜ{‹¢¶¶Ñ@‹dUÝåÜíÔËÙäz6 U fËI*ø‰óÜós?UÙ4ñÒÜÔ¬ž\¿êr5ïx¯ºy3¹~÷1P÷ÝÄ÷|ŸöÌ'îð¸›ü¢*7òb}oè7Ô*È•óÙ_&S–0U™ïMSh‰r/õE Y=%©ˆúoˆ¯nè;ny©ösu÷¨>>6ý _BmHÒ]Ù©ï®Ôßÿç¸ Þ7XK¼D—ޝç«+õqWöÿ6›Š…DºhŽ;Õê?üŸ c÷ÙµÐ÷R¼Ì^ã[°Ûí<'òÝ‘VCj!*=<úðnn?­XÒ›Ù$P¥š„IêEi ¢ÌËs•^+øçjc&ËÉËÙŒ(ÀÿjŸ•³M®ßžÅ áb ³dJqã³ú²9–ÍÐi²Rư{~l]âA°#=’ëmcT»qb¯êmÕ—ëʨ›º¬ÍZ¾¶üÒKÀ3Õeen ½NÜôæsi#bèÊ èg:'ñrmæ}Ù6ò|¥v«r¾R 'hã†'§aÎëBÕÅz]6÷C]ìö…£G¡xtgú1*›Þe™n`Y¢ 'ÃÿÊ¡xª¥³¤Wµ ‹%EC¶$z¡ µ(ú‚7µ|VäÔNˆE¯î 9ÂVG8Ð6lëÞök¡}~C;í¯L¿v\¤]ÿ™ê&×ê“Y[€aŪ‡W…h\Hl2þT¹„þSŸcªM³(6ŸUëª(EA"=¢B™º(+ZmÚÞtŸï8ó =!af+d.eò;sîBïœ;H7B»\Sº¤5.·¶­t6iöùb–åؘRiÒÆ~[TµA¼ÒQ¸ ÇhY"Úª*»¾;Ë&w4öÐVd»úðþÃ÷õûŸÉhÆrMmIAâÛ%ª¢óDžgDî`D÷÷Öq:f½m¢ÀˆÈ倛c‚z@~㓼Àýêñ92ûÆî´{ìï­Tƒ˜ßøvä¡ÔLŠÒ”} ÍR‡¥¹µtêE‰˜*f¤ôĦTb 7ÐÍ£jr©$(`Ú>ïÅZpâËLêMÆ(|’ZŽQ@AˆRaû 3o:å(¤ß'ǧcŽOÅœyU𦷍K»Á7g:´  ØßRzŒX÷µ¿#¼‘æÝE€s/Ïö÷ûÙ^7U@Š fD9”CmŸOQN —oDù`ÆÎô;¶’ Íþ¨K«|p\ž:¶qRK0ž3š7öÈÆ x·Ýw+"öýöFÎÈè" ¾JEP4çmÓ£µÚ~½¢™>éj²¡·‹˜„‡X<úåì&=ÛÄ0Å04cq;ÐT™!Wf¬9Ù°bÙ|,ÄE+ZvxjƯ+‡Ù:ßK+¡_7¼Añ¬Ÿêö¡\kÚ˜¹}•ÿ…ŒsÙüh9Éãpêeñy£àüØ|dƒ+µ¤æaf–ͲÝÔµ@s &ÀÝšØdN‘bÐ`\ð8àJH‰ðòÆ¡ÒlkÕÓ{ª÷§ö³Cö÷Ìv8»€Å^1Ðæ…xm·Û Ueø!ÖÕò¤£ÈKòÓ”PdN»²ã˜dcÿ±=à­ ''à „¦¿¾~‰|Œõ+Ø -‹±i”£†×²µ%μ@d %½ìÁñÒ>•ͼÚRôù­¨*õño?B[¢•|ë-M25 ÈnkŒY`÷­Vg±¸Ru»(—|þQ>^],,?BÞ™MÏ1X˜ÊôFwÛNí‰S! ¢1Ÿ‘Kö”Õ$º-Ü¡\‹®+ïZƒ;nSÔÔ}Û“dQ—Ø…6ÉǹQzÔ?ÅcàÈ–N~£ÑH†ð2!Š÷ÃÅ‚~`õ‹ŸÞ[¢L•×ÿ©S,ÒSoA”îÚ~E\ 0rýµKq ½Ð€Í•õºÝôEÓKµØMé{¸Ô¡Î~=|°‹mùÞ¶\l;˜sѾÎWŦ˜u°Xënd- ÊB$ÃiÄÞ4ü⮈©‚>ŽKÙX;¸šžªN½8ú—€õ2Ë je6攳ãJ›}OÒ~^lG„æ˜ÁƒÔÄC¡a¾>6óùmk:á7<Â8áÎünUôÄòyB£ï2ݪÝ"MïÌÅŠóGþëüZÍ®DÖPËìr·2 IžJ±YP6LÄøîRàiQBk_lzHù¤q5RÅîIÅ]Å[ilp³ãéÏV¤AOGò=ê˜ÿ|ç‹T2: LšÝ<¤8íšœ)Èh4䛩qÉÛl+s‹“a®ù(üÃxœLgôÃé|~3êÖf^¢·ˆÆŽ’ÈÏ͆{9±#{'Q'}å¬X¨U(4 ²Ù€~þQý TõGº`’ yhË9ÜßyˆÉV€;Ê!€çYCô'AK 4¨?¢AGÇߤ¯â·!sônÚƒFWUj+kȸiŸ%™È{・‘ÅM‹ë©y(çÆTĸã´ÎG¹£ ÆËrŽBXe»ÝX`SËŽÇ“›æ×çÓŒÛþŠÇƒ¥®©^Ø©A.I©RјÊNašÓ¸X¯M1næÚj›¥ð”¹Æ ¦ê¢F U†Ä0šÔ¶©ìÒ TÙ(,Û<ˆ"ÐŒ¬2N]äÓÑè°MV„B¨mÀÔ6jKÔš=(`ÝŠ-ƒÈnO»5:O"âòNÀŒ…> ŸÏ‰ÏÛ²,Ô¢À¾­4sšÔ7ÖL`⑾%iWÊŠ“+ÿªl÷Ùˆ±Úë²v˜¤šµ`(td-ôVPÆuÎeÎ"HÆü˜©ù5¿ DauÊz{He޲çÎ=$FtײôèkI ÿ­ÞQ«ûRúþ˜À”ºÀÁSï “ÇÆl¨Ú¯Ž¹$ZÔ¼­kìp,H(¢D)WTI êÇj·}ÅÚFZ¦ïÚƒ\¢F]T]‹sæ2—¼Àä­}B¤‰°êš®—öÊÒ'‡y·'ÿ /÷ˆ3Öñ‹~Ѩg¦^÷ÏX· CÊ nÐNÃ,PUÛþ*»„ºÙ„á *lϦÜCÆì†É.J"È®1j7Ê|¦ÑªÖ=ô”Gí +²¸\õc|ßQŒÑgï¼¢8·Q—o”“ˆl±Pö¢»¯K7ö˜\cìï­å•v‘Å}ržŸ‡óñë·Á0Ö…$´ Fþð¹®@}_[.ñçg˜üÏäÓ·,÷Íl’GžŸ*Š}/ïôb\ùÿÆL–__MÒýjLùh=ñs/ŒŸ<þ•åÝDXx5à¡vúÒúËÙ$ "í+üä¸ ¤ÏêÊÏ©Pk¨{$‚÷OI» `¡¢$Uäü‰)——‡ÃH„üK§ŸX?r$ðq³$OÂ<#—"òDß,ÌÝöþ–òa46œBnþ´¾§Öõ™—±¾,öb_ô¹?º®àÅšåÑR6yqÝSðÂ<ö²pÔ—ž¤ÁSëOøŸ‚Ú‡ƒÿ×È‚ƒÌ¸ÀëÃñ$£•§?±þ„½<ñë7EÓÑ]UÐú?ãUƒ ÿâÉ“iK-4ÑÇÖÄDC"1áùniZ:o’aé0Ã:»>¯‡išvŸœÒÕ¼BÕ\”–îÞ»˜Ñy»gK˶V‚ˆ02È$Œÿ±ØºòÊ­¥9×pÞ|)§ã¤bÊ^æ,kKUk+ÆakÌ(ËÆúç@#^6Rš3Ý]jGZ»‰aÃ=DkûÖ ›²¦Y‡á@™³Š«]hR$Q§Š±áK¹nHFY€Îcõ¦ìèæ0éÒáÖõ»6••æÜ¥(PÅ?[ànÊҫܵ£ Wm߻ۭä½%Ú/KgiÂÖ!\ÉíÀ)·ZøØbx,·: ØÜè2šq5k-Ö8;^Þî5Ð ùyºŒ®1'8˜ ÌD3†¢b) Æ3‘D¤öÖü”ø+Àšy˜] endstream endobj 463 0 obj << /Type /Page /Parent 1706 0 R /Resources 464 0 R /Contents 465 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 464 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 465 0 obj << /Length 2585 /Filter /FlateDecode >> stream H‰¼WÛŽãÆE^õ½óÔ F’¢$j±`ìx ë À°‘Ý è¡ZR{)R&©ÑÈ’È?æ!§ªZ¢¤Ñìzí  ’}©{ªújÚ»™N«é¼'*Â4ËÂ(‹Fj<†£,¨éªwóu“©¼á3‘jò²wóí}¬M/ £ˆÎä½þþuÛ{¯ÿf‚þ LõÂÒ3Ñ*ž¨àÓ¿ô&La¢ÆQ8Ë G‘0a Ó¢·áHHý;Áj?‰‚~<G:ÊÔÃNÝïÊv‰•DÛ”tãu÷íµúû‚þß5ö†áP» ÒùòZÝo]û‹­ &2Цœý‰VÿâŒÕgÕ’(ácúg¬±Ûí6 a¬âj‰-Hƒeˆ×Úå~iÉ”¾™öbåT/ŽÂÁ(Vƒq˜ej‡iª cš©Úö潯¦c b‰N­Ñ™:"‹@ÊéO½›·ñ¹¿bÜ“%ÇÃI8Häò{ýæU¿ôAL7k›;SÈG½)¬¼Í«ÚïW+¿4³.÷ïýþí^™l€€ˆÕxã©X#5>»;vÓ$EHï£,LÒ¯fûÀ›=Æ›18¤ç—/nÃþGVŒlÅQŸŠõ››Ú®ªÖ’ÕnÉþGÖ"ÌTIË3¦/ìﯧI˜~âöåí‘‘§œAã8 ‡ÉAâf‡(Íÿ™WåÜ-Î…†úÉ‹V|i“È›ŸðßÅËŸÞÝóM²0K?á¾ö¿ºŒ_{`ã©Ï%Iž×Cœ Ä¾Äjŵ~°ªÒ0Ó6¯V+[ÎT[©MŒ´U€›8é¾oð^­ «ÈÔ¸k·Pþ«AiCG•ám€°ú­+j]¹²½V67Öó¸é¿ÔÏ×#â÷´Ç+Òf°×&J; NE›µ©ÛF}ÐÖ#@±S3Óš–ô˜ès¬×"éÌÎ]éZW•͇@m—._‚»UKˆ€œè`6Õd¼¶ÂÌëjxªM›/Cõ]©V¦Ü)³^.F¸a˜Úõ±´í;Ó‹¬«jf›`ŽÙNC­°àæÝL \ˆñ’¡ ú^Ë ˜[UÉI²Ÿ’CìŸLüãÉžrþ) JˆÈ¡#ŽÎ–­‚J[¸b¨Í.Er©¹4„¥#•†ƒA6Vò¹¾Šð¤«kñ¡®Å^eH#>~üþz0C}ݳx1ª‡“A8öÉξvn Ý)ÔJPŠ"ŽÁMÍTsŠLÖ%`eÚÖΔ+IˆkïwL¨¼É!£Z³XàLkŸZ%Tw°<Ñßɲ¹¶ªj®ì_ ÎøÈß^û¼ØÌ( ~p嬢ˆLõVrŠ×î® ,4Ð3„dnJd %#íZÎLb Áý. 0egOöÎÎ4*4hõ¾bޱ™Í8Ô¯÷ G¹gö/Ç Ú퟇ð{m¶‡ólÊ!±¯zü—’Ï5sçTt¿@ƒêÙm=ÖjÊ_•ˆþèìv~Ø´ª¬Äð0Î)¥3¨ùŠÜ—e¡#|VHµXK\Ä”Q\¾Cã„*ªš4`ûÁC1IB¬ÙK-ªZÛäÑ~PØL[û êjÛØZî£Uo]mçÕSø)8eˆñ1€wâ%xÉÀ |8ÿ©Y,ÉHjáá_T Ù*ïm]Í69ç‰2‘`Æ0,½1øý´ij“ƒŽÜn`9(jªMË÷PmŸÅ‹4t­y¢TË 9‘ ¥vÕFªX’¼sD½^¹Â™Zì†(7PwF–ëÝëçÞ:³ÔÍ[ |&ÑýÙñð8÷]®¿Ò¡ŽàÚ^I§ÇDô¸+%âRŽ8Bd³  !µFÚÉ£T¦]é˜Gš¢Ì‹Jî˜rQo/ ¦iòX‹y@GNs¨xÅ]0I_´Â›véšÛSàX:¡ÃÃÁo4‡&C×F­82Š­Ù5Tò,<]ÖÆÕÍkuÚ©w2zèѨëÆK¹vÛ•ò|°íÖÚòÍÈ/ÚþÏx¡bPÙ¼:Dš°ù€Š,!ýÕ×—ƒSŒ|ÀýŠ`”µ'\†}~µŸöÖÀ¿io»I„(“ °øS$¿ÃÊÒqø¤~ÁjfÏÈý­ §£&îK#r¯Í‰TÓ?^nФ©¸É!žC_ŽÙÔòÍøpԀ稊4*¦Š·÷¢õëW(tWújqp³¬(o[´:Ò }® m¼«Íð±|ç‘ Ò@;CõÂÈ…sýI•3o^JÃß㺠í$_šGß~·mí€èö‹R¢ðpÿOW¦ØØ+¿\rÀûÅäêö¬k{Éw ÇædšŠoûVtµ9i~Yd ~8€æØƒæ¬Ú<ÜrFâ½ÿ¼A’Sû®çb]êäÚ †æý~WB§Æ5ô–«{[?"¥©–Ž4w×|RÇvå2YÍ@GÛTT«R(Ä3âëZ5•ôV¿r|‘ÎÕã­[,[UTÕGª X?+‡gþŒ½Ûâ«n-9¸òæÜ—B4}qnù ©38<Š€Ç>z%CñI4i/!X|¿ËžO³\£3ÔhISz.šG]ÉÓ&…N¢ý<ÊÃ)¿ ¾-î?ïökÆX¦ÇNóªÏh%ÿŠúD¨ÝíïÞ ë/IÊWý¾¯ o¼*/¤|ôûÿ¯‚ñ6 >óbWMæœU‡.[~&ø íSn×í…¾\W_lØ x@L_ûs­“…s ¼©uÄè#ÅÌøt8Xm0á±mÎÌý^¯üøaeS'_ff0;n—2«!áK{R y–E‡J!sTS(ö“F=¬ Gèë´vHžŒ\I´VëBWdû‰†mPÈU{<,îñN4­žUï3°ú¥/À¡-IUš0«¢Åœ2›¶‚ÿ\ŽDÚQ׳4@ǦѢĘƒYB ¯TsìºÖÏ3ˆ%eS9˜Òp0ÈÆJ>ǘ•F˜®ââ¦\±òÒdÿG³× LƒŒÌ{¬¿æÒö<èSnÂl ù s'FιƒRóȲi Ÿ\Xuw€Ï?<örM&a”‰XöNǧïàžÖ÷SRžç>ñ+ê§Ù‰þž‡§w|\9r#O©l^5^!“ùÔ}ПÀƒœ,dUN~)0ÍRRNôeG¬l¨¥V…ªìši@x-¨ÀbŸÖæQ—">ÛÚ`>ŽíÒIÓ1Ðk“ƒ ÏÌ û—–UmWÕ#t™c8âdÆ]Qø© ³ö=¸Båžè5¨«BåKS{ÀPOû ö7ÓÞ=̨; endstream endobj 466 0 obj << /Type /Page /Parent 1706 0 R /Resources 467 0 R /Contents 468 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 467 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 468 0 obj << /Length 1382 /Filter /FlateDecode >> stream H‰¤VÍrÛ6ž^õ;ºœ±hðŸÌÍv›L;IÚ©yÈÔê"a‰ Eª"iÅ}¾Cß±‡î$ʉã:“ °Xì·ß· ]ç³Ë<÷Áƒü~æù ñ_ašº:Õ1$Y䯩 ßÎ.oúÊžm4ôe;»|sëÁºŸiWk²)g‹ãð0»S?Î"pCµ6ôöøœßòg{È Ñnã)AêÆZa>û¢Q‹«¿}œ]øÚYx+ÂênÛaƒ3¾2zR}ÝÃÕ› øõgá÷×"7Rµ£U¹¹€ÛC=üiö ; TÑVÎ"Sð?90†ÏÐ|íÆø‘‡sÁáppÀõTO§:]ã‘.5¢+íÔ†=}ŸÏ<¨aæG±Ä‰›¦{nb SØ›Ùýì:?%#ðÐD?ÍÆ”jMÁ(óßÏhòt, Lbíâ¿ìÁ´yበRüMÝ0mÕ;1‚€b";;y#_¦ráÖA\¡êÏM6¦…{\õíŒXnmŠa¨Û5`^àƒ“¡É;^|Ëæ ®e×(ÛJm]šæñ¶ÅGƒ&ÙŒhãYϘbŸ"}ìF¨ºöÛáHÑm|f†´æM²ó©ZíMñúaõP·CÛ±©wÊAQô›nl*XèZY€¥êÇrEU½7åÐíaW ›~鸜øË×¶P0‚ˆÂð+RT¢¾³PÌ0{VCBVZj+ÍÕ¡¬HäÑQï4B?7‹[ŽŠf4ý+»Û»qfµIGבp 9fÜG%zn*Ìb‰@Á 0½‘2 ³ƒ#ßX"(]LÏJŠ 1ÜñÛ:©0UX.h‹¤Õ-3~CŠT·¦gA¬ùj»¥èRÐi®]ÅÕ0µ(A{Óº`PDmp6uÏvÒŸ()VMÓЃzWå0ˆ'*Q9à$x:© ³õºí츺€Õ8pðŸ{¬)äcÊ›*‹§JÔè«?FÓ:—¼eÑÂJf¬ Œl_ ïsÅÞ©ºµ…&ê©XDÙ±Nv\'¦¬R¹±uZ”ƒ-M[¿5‡‘(<„`Ȭø;b4D¯$ˆI{Gñ†ÉI~8Ix¹à©ÜB7<“›o5VSO']XÌ(V¡ŠA·ë­$E–÷‰Iϯ¸9êJZÚˆ]Þ;ž Å«ƒlÿ ‡†X’lÂ⟰Ü!¼RÌÃi糘¾¸»Þ$‰9DÆ 7¿0LÅgõüB vÄ™máÅÔ>#øšEv¦(ÖÏQj"gb=EµÃ[Öòk¼¥ð“n%µä¶/7¦Z:GE¥¤(Ç£O|}=Ãé)Jï\,Ÿ>|x“?aòO˜èv&TôžpEÇ®p4 #K ÜÆœ*ç7Åu¬@ªú«Û›Ð…¯ä¹À4$ªì*ìð˜èË6æSQQñøTdÛ¢áö>ê©ÿ話j+ú÷Ý`¤9RL]9`Þwû-,—ýÖa¢ê¦X5¶?R?¡ösƒÝ0ãfHÜ Ñ¢‡÷?åл]·L%­QhÂ÷5.ÒçÄŽ\,—/R¡³ OvFEl©ˆŸPaE&E 2SS`àVTX©ôöT•Å¢‹B¾6Ç‚!¥…'‡6ÝÓuzeÿû>et“æ´”Þu×5uòµë48ëo§½V®0tRd…ïÑDÍ/`Žx¾Yè×å(ýšæ»Ÿ¤Å¹7ç7߆ë—lØOå`û»çjë{sÏtÎ|ôÖväS,‹æè‚ÒÄA 3ßzyÎÉ"Qh çÓÕüçÕz*éàü^´­A¦˜ðP5lg™Ä»ÿ­òò endstream endobj 469 0 obj << /Type /Page /Parent 1707 0 R /Resources 477 0 R /Contents 478 0 R /Annots [ 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 470 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 179 571 196 585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 471 0 obj << /Dest [ 697 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 288 499 304 513 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 472 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 329 457 346 471 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 473 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 227 280 242 294 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 474 0 obj << /Dest [ 697 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 278 239 294 253 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 475 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 199 185 215 199 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 476 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 419 104 436 118 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 477 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 478 0 obj << /Length 2942 /Filter /FlateDecode >> stream H‰¬WÛŽãÆE^õAšÁˆË›Hjðîf ;¶a` ÈN8TKbL‘II;û!ûþG?äTUó2Ò |Áb€Ùì®®ë©SoV³W«U |µÚÌü@yøÃO”¦®—z±J– 7N½P­ö³WoÛTå-ïñT›W³WßÜùjÛÎ<×óhO>›÷çÙýSæÌC7Ò[C¿V¯œÿ®¾›-YÂR%ž»ŒqK˜º±'—°€€eÑÓ"Q¿Xž3÷C7Ö^ªÕÝcÕí°hã@’n‹V}ýÍ­úϯÎ|÷ßîBާóÝ­º;Ý'Ó”,$ÔYµvæK­>óVŒÍgÓÏñ²z‡5Öà|>»Nèúº¥[ ] ѸÒÅ£ër»´cIÿXÍ|U¨Y°ˆÝ0öU˜¸iªbß"£T5f¶™½Y Î}lñžzctµG–«ÿQÀ"°Èõ"‰?õþL¢ÐM‚‰C= Ž/öD®z[W›ÂIaÓöH¾Âý:sðêÎÁæDË׺R'‡m˲´)Ø»øµ4­"_¦8®òš«uÑu•ñK‰ÕŠŸ6Å–"çâN0<—’ƒmAL©É¶ù£{`™ FÒãy¦4gUT Q{ÍžÝÁ?Cxó>Æìø"#UD5Ôê”ÁÜØèàŒV÷ºn”<ïê¦S7½Â~¯1R+´¢¥è)µ© -PtÄ *Nxà„y€åÆ¡üFÆâ™®uJì ¯Dî2•+&Ö~Ð7÷ŽÊ]j£2 |¨ ûù9§K|”K‚=‡–:x¨“Cõú˜›µB•ì$ó táé¹ïúaoJoH¥TîE9©ó¾W¦Ú|]„û൮VYYÖguÈšloº¦øÔoÙ›T¤µCo{‡—G#k¬ ˜)Ž#Ÿ©MQ~ß4õ^ÝÐåõ±“ÅÚÜô•LZƒÖɨub ²qPUƬ‹jK:â¡S€š«éuËÄ$ôÆUÿ’:™ÃªÄæ|©ìæœ^åY±=Dbo)/*Éú‰ò£Ë/«W³RyV©£Ž-b¶AV®‹ÍÆ4¦êTkºã¡% º¦.K|ZæÓäÓÚ}S"¤qš\K `ñ¢)° H=⊵º«Mh€jðOB•TrÞ!ºªÞ(Š˜ÜÁË[ ô –úm ˆýØ ,ŒMcè¤ËÊA•¢‚bmx9¥²è6ø´ñ×£,"ÉÓè¥aï<¡ ¥¨Ñ²Q7œx“> ‚r’ס†D˯­ï{Ü6ˆŸâŽþ Gའ*ßvžî‡ó™YƬð­ïß3xP1ǵÁ¥q0òÎød‘°¦:vWµ§„ù,6 .¢OC%ú웲ø™œ"R”|²ùQ@K^:ñôEÞíd‰Šêdå¦Á‰GûåPfÝü2Û?hº!e0Ù…Þ;æëF¬uUÈ.îëH{Ù‡r«å©0²`M½ÞÓ¤zgö‡aï-µ7ˆÍ‡² òEkã²XS’\Ù§L—»@U+XÕp“}`*ß°•å³U‰Ü³Ðp0ºú›nLTß&*œÂ9‘g* $Tç%ƒ:ŒàöˆóÏ·ÑŦ —ÒŽîÞq/ÒlþeóÌÛª'mõ}c“k ø ’¦Ü —8UèûÉ4-yÕ~½]”¹Ô9ù2:_ó»#Åš ’´Ï*¥:4õ f ¥Íku*2~ûüµßƒÛÀ¤ŠjI( õb¾\¥ð³LäƒÎʺb0Ô^­›Wå|¦Øžl×½7¬œ<¹¢£Š·’~6ê¼3U—uéctÑJ?hN:%ùºV¿Q.>d’˜JøÝÃßÈýÚ¦,Ÿ¡»›Ä'F„>íïÞýS}ýö·(+P¯ÏÊÖÀääÁÞcéRgøÜºÎY“g emº¬(éë‹uòerŽ<Ô=ñ8aà 4xAù(ÿïÜÙí¡æPLôW²Ì¸J˜Iœh®G@¢K9 Ê,Ê SG»kMè»6,^TRÃשþ¾ÂáéE(.#ªBZ>ËD®‡¼+š¤í´G$IXd8áb£—-#*ô¡g}¸‚*›¢iAÌεb8o-³Èƒ60¹Ê‡ôFê:Ô sˆqÙ'wI™(1vv„JTÞuU>ªè:)ϲÇŨÖbjö3lê•8ALÅÔ²RËÃý{ÖzØ"ãÃUǹ‹ö…³„€í®£€fëU>‹4cΉ^V™yû˜¢ClC¢tàÖI»×mœhu~$"€Eý.Ñð^ ê²#î™ݾýV.}7ò¦¬2XeÔ³ÊÀ¡‰´›w-¬1¦É5ã/˜X}BÄ!¼J³éo2É0?‰F&ùL¾}>ܨÀ˜+0î Ù¸[Ð9Yv qYt¦Éʶ÷ï?8 ãQŒDÙ¾‹ú †Q/H'ãj úÃH8Ÿú£3;¬Å©XŒlS\Âú¯÷šêòÒ€<âcz Èýᧇ1$ö˜¨ û‰¤ Ø›~ 6Ÿ^œåz×H‹'Àé¹a| œZÔ·ë'“$ço¬˜ø¢O’) *ºÖá‘“œ³`ò•ÑCBÎ ‰¢M7mÉa+oµ¿=QÒNþge©ÆîÈ姦œK´•RÉËÿDKi/x „¶ÛMœün·ˆ¹½¶#èÂeíáém¼Ó«²)íì¶Áä¶³+{\†Úg¹àç»Ö%ô â]xù –ƒaY‹q¶,…«.Û¶ÒÙl˜}gŒuKg ²nšAÖIH§%ºpc_ÎÍÇë'·ÃR„õ£*ÚþF›éÈäåä vð]vï00Æt41eÁ¡_½­ŠOÒ`ÖÔ-S!# +v²ÂX[ÂŽÊ3Ì~ ¢ }–ÍE—ï „$wE?u“ä¢ý]÷™n¤­rcùH1¥HV©ÃZ-´Ý¡2ùíbЇy·¿p˜¼ßÕ‘çcËŸv|Äþß ñTWͶt_4Ü&™€Ä£†¡&§M:ýì¡uBq—@ŠœT)•IÊÜ횈æ‘O€;]¡.Hÿd°ãÑϱ ¶0ª”%XåúVíê³9™Æveâ·`A“Õ“úx†ï›¹áqÁRoù9ç}ï˜8Ó2ÓA¢qK}Íé¿bNõuk0õ£hû:uÿp_³·7Ä3Î]ƒ¬ªúy[ª…Ûí×̸-èè-F‰¦ì Nzuª9XÂ)+†e¶Õ])Ë\…åÒŽŽhÓRgdõÃYðN–îrÒÈ,*üI`y±Sò=¶¿ì—µL;¼p6e)¬ÙËR+^¥¡œêb­,mž”79L<^‰¾¾íÑH‘^„ëzˆp –õH3D‚¾ Al‘ y ¦ø#ŠE½DÕšŽ&+£å1 T»òÇó. IÄëμD‚ƒ›†œ1r¹0Á·ùþŒÌÈP“áM2_hõÈ6CB Ú9ÎðSÆD^HvWìì ³ý ]Î/m˜.Ÿzüˆ¬?g­BJþ¿ð²IA†‚ðÞSW]h!ˆ^@ô^ âF´j±×wæM~Z©¸*)-$/ß›7SCBëÎ=ס‰]Ù0”} ý úg0 "I«„z×ö¡3ž¥~Pò`F”J0OyH\§ÈRY–iNè‰2×E6ÈáX`JµºvîüI3E5^[±0Q$4V2þ)M*–›ºö|e¼Æ÷¤Óª:ï¦êœÆˆ1Òº¹8oõñÏ÷CÁŽß%å ‚™6åíxÙœmêMŸ|–t5t¹QÅ|³/sótY}kbõ endstream endobj 479 0 obj << /Type /Page /Parent 1707 0 R /Resources 483 0 R /Contents 484 0 R /Annots [ 480 0 R 481 0 R 482 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 480 0 obj << /Dest [ 469 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 345 725 361 739 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 481 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 199 448 215 462 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 482 0 obj << /Dest [ 691 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 220 394 236 408 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 483 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 484 0 obj << /Length 2574 /Filter /FlateDecode >> stream H‰¬WÛŽÛÈE^õ !@šÀæMeÄ ìÚëÅvÖXk7@ŸEO‹Hõomßµl/p"éÆbsïÏe{À_* 'É&kÄ·?\‰¿þײø]ãÛÂYÈÌrez¸ïOYûOUç|H “rkÙ+)þÍÿ306ŸMó]'Âõ+¼c§ÓɱÇ“ ݪèZ+<º°.5¯|Ò÷ë™'21ó‘Dž–N‹ÈsÂPÀÆ0µšífß­g–¸·½1ºÚ%åúÂBÇ ± t‚ ^ ý³wêr±p–¾9‡XYŒ-µMØg­@˜«ÏÇ„Ëí\X1ÌHÚ¶Îð´”þÐÁűl•vÔ¥ .öW<#t3]÷mž‹6Ù7¢=$­hºã±ª[‘Vå.ÛwuÒfU)n’:K69®ñ\I¨Ê&«ðŒ»Kq-¥`­m‰4)Å!¹¶@R|I‘ˆ¹aÿúl­ä‘!'d[³é¿­zªmÏñførøX[W¹ÈvgˆCu¢ÍÀDp"i‚_zx½KÅï¬ÔT–£»4ÿg–'Éi7IÞ)ýJì°66kk‹ò@ÓŒ¨GÆÌ­´*©-ÎõܘñÚ`¡Ô‰–ä$?2–¤Úù;ŽÂ×&ÌÆØ!<{?èèì=ŽùœyYÍÅs±­DYµBcÓGŒ œCXþ6&)`brÞdå>W„CYK„íIÆQ•)~«+±é,Îï¶ÚÖg´®VM—·"Ù'YyÏ…¿)zßÂ3èÏÌv,5~, àÔÐÀz$UÚé½2»Qù™W:dW¯|O•È_:?Ím0‹ô$dÅïjµU»¬ä_j+^Vú‘b2}¶ó«RüšÐ Ÿ´Ø¸ÐØ\5ë Dr¨My|<±×%vUžW'p/ò¬ajA I“º¬HƒÐ ±W¥ª“+•ÆV¶Wô½V¢ÈÄþЊÉv›‘I.H&½\Ùp5:j¥EBÜpì¨ %ÑŠ*Å)Aë5‰+Ò™b*D$ U¶ø”iÌz7^SiföZ6‘œÒ¡Ê&Ó9íf·_[Î='M2¨O”¸O/­j\ nTm‘XBr}I|Þ‰+Ô¶å"õAþªê†å“6ë§V‹*s³c;‰YË^¸ƒ2«ÉH„ŠV^î¦í 1÷w]áæ ÄÁmàgAšìOÒg3ÄÁ öÕÚõF6lÛ-ù˜˜¦}1Æß-<Œ¤?"iDàÛ›¬8WŒHß¾-Іú*8s³¹WC§¨&©v}/ŠäSU_‰¢xQd%ž ±ÅTÓ¼hº¹B»y±é²|ËýT ‡xÄˉIÙí’´í,›z˜š6€Mýú%÷¼íwתMËür«’bPrÅÌ› Q]™¥ Å:ŠA­Š ÍÅ1©Û ÚÕ—‚»)6*¸kÜ‘±U7Y Ž´Ì -û±D¾øPBJ(ƒ)5ñ ð%.ólS'¨P÷’gëA·éþ^oHBpVʱ€*oF„‰]£¡Ä ^É龃þAk§÷îMŸvÑñ·¨AÌñ­L¾D±j~Šj«rï2íÑÓSG¿¥Í@f hÃЀ1ÍæÈíæÇàåÿÑwmƒ#GêosÊeî ÉSšÓâa"í‹äE#yf*ºEø=&¿À!º? 9ðÄDt’_¾é_3…(¼Dž7†¯çõùM‡ž[ ˜ùÄ”õ¢IÊšªFâ#Ê QÃÃTüPÎ^ŠgÞÚk2úžåDüô~,×’í/Y¹­NpÕ›¬ì>_‰ìÝ¡*ÕOïÿ…ˆøR<Ž2çù—ñ‡ŒÁRª[ü¯„ÿaPa£>d IYÀ|¡KȨùÂñDÛJzËÀŸ“)Oà›زϫMºÛ<&í®}P3 u8ŽG áhÎM« û”mû0mN&yèÒUš—ϯ¯5)4ÅRIñLµéCLjÎ4˜ò*âÁ?‰ça?À`TôÊ{qÔ-\B¥9– k§:k©Û@´"¾¬UÚVzΡOP™jY¤¹ˆZMÇ]æù²Ê‡£Ê÷7=]æ8GC!Ay„Âq¤óÌHÇ6€Ò¢„9a´€šàRDêdNôl¢‹„Ir¤ü™„\PeYñp3¸ß*ýëIù?mŸ:nðЩףI«i˜^6é~YèM"îL… Àt"@×U¡L6DÆbz: ʼF&&~wçÛ¢îãFÏ™þ”qèVš=E˜{(dõ‘™žeâ§Quú= j€Œ±ƒz½¯ÎmîÈÕÇŽZÄÇóÀ¥È5RôËÏ?ö݈> øº¦Ó¶.äÙB(¡ÅüG‡¾ðÕ½_~~#P3Ë6ÛûŽ[ÏKž ä½¾~®ƒ×%ŽjTnâI ëMõšmæFê‹ãäåvôÏ“æË€ÖÅS­éR®ô‚ÛN²Í+RÔtãO ÔÅ]ÁBÂ|ZÆGkáý–åBϘŸ©àéžEmmôôÜù”ø™¶SÔG¨º6Åz¡‹õƒ=­.€»'ŒwU™ŸŸëòÍЩ6H£d޲Í苃ÄÝ)TöC‚Iº¤æIФPM“ìU㈗z¢hTḴ©©r5×¹mS¬¸wãj1„¥Iê+ØÑ“éUö%® “@¢+iAÓš%å¶/·æg½ímãTW4³Ñ—ÉŽÞѬ_æi£·çê ™³ .5Dsq¨/ÍÅáäâ"Û0@V­iPÔç¬i±–ªºß˜Aƒ®Ÿ[”å˜h-h„l”¾_Ïþ7c† endstream endobj 485 0 obj << /Type /Page /Parent 1707 0 R /Resources 487 0 R /Contents 488 0 R /Annots [ 486 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 486 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 206 712 222 726 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 487 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 488 0 obj << /Length 2335 /Filter /FlateDecode >> stream H‰´WÛnãÈE^õ>5‹æý2° ìlö‚`wÀ dœZjYL(J)É·ì?ä󰧪šuñz^v°ØÕ·ºœ:Uýy2ºLB¨É|„ÊÇüÄyîù¹Ÿª¬H¼4÷#5YŽn¿ms5my¯Úi3ºýá1P/íÈ÷|ŸÖLGãþs?ú¢ÿVºãÈ‹õ‹¡ßP«0Rî¿&|B¡2ß+RÜå^êË%|@ÈgÑW’ÊQÿ !‡¾;"/Õ~®žßÔã[Ó- µqq’n«V}óÃúçÿÝq‚ñs‰—èÊõõtq£÷U÷_³©ùH—ÍÌZýÊY16ŸM }/Å`òÈXƒý~﹑è–n5t-ŽÆ•>}X7µ¢ŸôÝd¨JÂ$õ¢4PQæå¹J/ŽlŒsµ1£ùèóäàŒ(ÀÿÔGWûäh9ù7,¶‹=?Ƃ؋¢Q–¥ªfweU»Á¨ ¼\?׆î7ì“–i#«ßÔ?à‡LÿÌ£Ÿ\è£UW¾( JMËF=µµ×ÎT%§6¬*•LTŒØeU[ Ô¾|S¥ÕŠý8f3¡Jõ¦^É1@Q9ëºìæ«ÍÒa#Ù>õ¤[c€ŒôÉUÝJ-ËÿÕœŸë)Ù´j5W´¡W/ÛMIR53kÓÆ©žAÅH›¦SOͦ+á›&¤Vh³c*)rÀHÓJÀn¿·8àåÈ,×’ `$‚Ͳ´{ì²iƱ3ùaO 3ó€3ƒ|~DqD‰D‰oQâ|¢(%6J ;ƒ¼¨îDºZ *Ÿ|† ` è&!‘LS.ãáKHšjOMøŒ…PzÈj_Õ5üí$´Î*ëú ·%æ¡…ç’}Gt‹ÚÓz;3ÐQÔƒB¹~`ä•„_][Š*Å –­\@3Õ\‘t{¤aË®Ýh³$ gHôWw2Û®j^ X—Fp~8H½#‹GX—àxöULÔ²sqU >Ž„‰|‘^gt¬æÊ…OP4ŽR/)È9E|@Þ€§È⩹lH~×x Ü›»4œÐ̮싙Kž72pn8(ÈUC®•dSn°(G]kìŒ é4Dô׋¸©W (ÑϨ^ zB^±çOì8þº]jIt¦­¦ÍªSæµb QKÕ$),Šc*p'0ö³£J™¥.nýÒ'Ÿ(éYëqGÍ<»ä‹ýé~$ÄÐ?ç ÙóHv•G²#Ü;H±ÐÆÂf'Ý=…9Ñ»²ÞŠÀ!Š Xå¥e¤™U2f•HX%;a•H/×åfŠaî"xáÀX?9¡n‚™=Ž"Zw¼Éó ˆÊSIºäšêV€l¨d^fsHŒtÚ1ü ?ôî¬)U½X¯]ë)§Šû“r„ýâ©o¸>gº^ííÄtEæB¦X:™³ZQên%™Vv5jæ=âQeS½· éÜõ¾—ù›ÕdÑ¡#î‡Î·A÷ñ>]´ cÔP?Ñý eÕ+d­ïÜqjZëÁ¿× ¼AòMͺS{À·4'«ˆ´¡<·;3´]]5Îe ¿Ö!Ú%±NÁcñ ßà˜jºÝ_ÐZF¤[à"@×—r³gW9Ríì‡,&Â{P«zöî´s¸­¬å$&ÙH¿Yq'¶Ôøì¤ÞÀÊèÝÜݯ¶õŒ ç–œžo6­ž%¦œ|0§¹¤«XDD‰ÞôØÄŽ%–š'×;äå×ôð‰òžzø±§}Ÿ¢ñ5p¢¶¯¢Ùðh9háy¥m;TÉ#nùkËéŒ÷a/ç!ð3xµõ-éßÛ-557Àö#Ÿõ&Ï?z6Ñ ϶)÷¡?ÿ„ŽtƒX«ÕFMëŠZÍÓnt^QÞ*tÉ/m 7ºn@UcåR –­îYgØí]‡vrŒz"*þ áì@î€BG°4v¸æ¡¥£ˆS„R”Æ ")ËúÝ[nóºRÆÊnƒöë²[ØÅ®Ï/ºÖôxËÁ‹m´Mt¡eK†•²º9^4CQuäò×9æ¿h´¨¢ÒØ‘ꑼa¼a¨&1‰Êƒe 2ñlï‚VÅô‰YŸÂò=i”ê1·0to¤×ÖKÂ0©žªg¼d8Gg3â£ò¢…À~þ‚ó%4ëZ^ô¢Á'Ý˽½óúúJT Fž"6¬Ò—A§7+ðø°o附±ñ.+¥Wd‡F´/‘tïYW1l/ž¯ýCPjjL-ÄG¨töU…£â†»dåÔU³}år¤¨’A²,¥Öç6¦èÏ‚ñQYH‘D »4R™Âž7_ì’E¹{'F¡çb&'1ÂA1J-ñeˆÑy p‘ðhpxˆH'[åÍZÊÀ0.ùÝb¨ö ,á'à'zÒÍ<8£øËBÖ÷§uÖ§uh+ì±.> endobj 490 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 491 0 obj << /Length 3356 /Filter /FlateDecode >> stream H‰¼WÍŽÛÈF®zІOMD¤ÙEQ¾ÍŽå…ï:ðÈ^`Ö9p¤–Ä,E $5šÙÙwÈ;î!_U5%J£dr lhÈfuWuý|õÕóÁÛù_- ƒ/ó÷Xc ‡Cà£ÒjI-ކÊ!n·pK>i6•«A4N‚QbÔh¤©JLÇ wŒSUÛÁjðÃü茑Hxî“«Cò¬œÿ“»€ÅAKÌø©óç$“¨çÐðèÐÐÈuÆšç[«~÷Ò ÕUi`<9úu‘—kñɵü8*ŠÊ±•NŸœ’`"Š~ÉÛ‚Ã$Z–b„§ÅOLŽô'¸t¬•-×9L€{‡Ê3¡ÎÔ¢Úî ÛÚ›ýìM(jû˜7v©Z¶œŒ&{aªgŒ^ã¥QÖ–],}˜‡ìIO¦¥bZN*¶¶léÈMÖª¬(*… 2Gm÷‹ÚVµU«Â>åy‘·Ï$ ƒŒ†^üBç C[øˆn3ûSd O)—žLïŒNFFbdÖ4Õ"ÏÚ¼*Õ}‰š6ÛîT^BïV>-«C©ÚJQAL¡Üª,`wn‹¥*ì£7Õ\‡#]/=ÄùA%Ç^·ë窵ïÔ‡ªVm÷»F-Ûui©¦pcÓ$ПºèŠ›$È”¥õÄö ßv2[,„,\œ;m£Vû¢x¾Ts²Ë8»(qà’\ý°¡`âÐRí)$pÀ’|è¡N'¨Sé÷”Ë·–2~„H½råÅ:_ïk/† 9X*(ëC—Öö‰3tawÊÞŠ¤TÆÂö Ü)žOè /–^ˆçža×òÁŒO÷Ëý¸…Á&ÂYŒm8uÇÆCÝã^Hµ™#Âê;êŒ>}¾eè‹ô¼ä<½Ÿ½¿¹û:gÑÛ¡ú‚‡±ž‘…‘ÛwH˜h‘=ßfý-ÝÓÍÛì¶í€j¬Í†W™ãE#‡PtÆTö(noäížIôçŸgŸ?`!Ñò{Çu8#u©λ§ÿMú#þ·øe&zn¨^審o3®ïîì/äŸ)ÝÔð†3QÙ=ûîyÔ¬‡9P$C¸ðv½ðM| t,÷/+UTåÚÖl‘ʳ¼ "‰%•F)(rnÌ@4ÑÈ\ÊÓ‰¦ü…ãó5g(å´+AÊNIoùLï ÛÌgÆšQ†!– c¾ÍyYôq0c$‹¾Ò‘[WùD)N dùÂ^O€+•,n[d¥zpu,÷VR29ƒŸÕYQm]±>Ba&¢n‚RíaPT„ÏØ¹7W›e+»Í~³½»ÒURïWñ<9á¦c2Hœ˜\GN2úÓÍü£ÔÒ-`EKØd¤_ÄhË!_õÐTÔ ƒcC¾èÿ(¶Q:¹ ã8Íè“€ñ‘Œ:`PÙ°}~ì)µåx`‚?¶9^þU.0ŽLÆ}}ÉQŸ»ûI w¥† „ UD¡›HJí²ºmÞ½Ú¡Þ~p–°LB"ú/òÁytîÈ›:ãÅmø"ˆÃŽyDë}¼jÚIO¦=icºk‡T’U>a âGŠ>fÅÞ^8- ¦G*¯“%…æäƒêÆ+ÀvnRKÔvWsöÅZ ó$YPIü·Š¤ðê¾ä†@"Û¼(r·î^ºl™XŸ¼J“v™ðùå™è¥’׎Ù,¬ò㉉üÐà¿ Ãwü_QÙT"J%‡êÝYK¼E‘´¨_6hÓÙ±B;qæ9ŽOÁüG[ÓÝm°^Ü%ÓuI¾ª«­¼áÒM[“[Ø•Ü áh/²g:ÜX)çyZ,¤s)&[,ÅVHŒcc´¼õõw.R8œHä­è/1‡8òjŸü«$õå•-ZDÌv…¨.a«ÍËݾ%èBƒyD×Y½x7€#e¡~ŸPvLtœ³ÇƒË4R *½<ÍùÌ€òwÇÒÿ›}VË|åS]ù²ó"/ŠekKiò`Û‘ô»nŽ24ºQùÆô¤{qs?¢‰nÔB¸”€ .ŽJñ±k{c1QòºO‚kõ9w–Ëðò«¶Y]䶪c9Gé9X€‘;·ªBŽÈx3ÞÂ-e´„y¥“¤”uœ¸È,%Ÿ8·É±.0(:>ž×Ï@=¦dûtôÿýˈêÓ(ƒ[¶ö©=W6 Æqì^f¶ ¾ü6–ÜØn? ¿„´ÊwywØl·Û3y NBÜAÓç™;`T2CbfÈ$¼âL pË]Rp0YLj"¦á»©á„Xt†’”ç+aù_Eðd »&,Œ1%$ýÏfÿj& ‚Ü—ecÔ¬*ÛcÂÚéJ‰Wsë wiôÊ`¾¼f–*ÍAºá:2zW+à8XBÇ®ØÌù÷þ4ÄhxwŠK9Á|ñ÷ÂÖ ™¯Ÿ¢: |ðÓ¿öb%:4OœRi««¡…|Ê77 $ë™8O«.‡*3‡´n¬ÒBžàüPfYy&ô;àU§>©kŸš"@s÷ØúM‚¨È²ªfòˆ8ºÂQÑ1–cVîñ—Oš‰ß¤Eà'ÓÑDÓçÛõõ‰‹nÖ‰©A|õé묘± FóùŸ~¬wX7~ C·+k¤yÞ¾ÖËÍÈiúÜÃEm@3v¸ˆ½ø@ìÂ)¡l©0èM»¤Üf)†Ññ Ÿxz¸ S!ᨮÚB매Á·~µ{4¼¹ß@Å Tææ›·,(ŠN¯µÊþÊÉ<ˆµÕ +³ êoÁ¹&‘5†˜lmw›“¹ùY·V –qÒ÷ñÍ}RN¶² +ÉþgZªç#D{c_$ €Hœˆpi‰ñG*( ¬ÇYQîò¡*xÅÛ J,›Ý§¿¿Ö M endstream endobj 492 0 obj << /Type /Page /Parent 1707 0 R /Resources 505 0 R /Contents 506 0 R /Annots [ 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 493 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 110 739 133 753 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 494 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 353 653 402 667 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 495 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 599 169 613 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 496 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 480 599 521 613 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 497 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 434 586 475 600 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 498 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 482 400 509 414 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 499 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 387 349 401 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 500 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 299 360 326 374 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 501 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 446 360 474 374 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 502 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 124 139 138 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 503 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 270 111 319 125 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 504 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 463 84 504 98 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 505 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 506 0 obj << /Length 4270 /Filter /FlateDecode >> stream H‰¬WÛŽÛÈE^õ ?5ƒÍ›(*°XÛ³ ë$ÈÈ ²ž àP-‰1/ŠØyü!þ‡ücrªª)Jy×X,#‰ÍîêîªsNU½šžÏç‘ Õ|9 #à_I–ùA¤j:›øiÄj^ž¿î2Ut<'P]ÑŒžÿpªU7 ü  9ÅhÜÿÜ>è¿äÞ8ö½2ôiM”÷ÏùG3¶0SÓÀŸ¥Ø%Îü4MØ@Ķè×$Sÿ0:ŽoÆ~ªƒLÝ?ªÛÇÆ®1iãÁ’îÊN}÷ÕúéÞx‚ç-ÞMü‰.½@ë+u»/íg³­ØH¬ófágZ}áO>_Ÿ¯~ЇùŒñ öû½ïÅ~¨;ÚÕж0-}ü p»Â ­ÙÒÍ|ªR¢IêÇi¨â©Ÿe* ý$Q¸c’©­-G¯ægÄ!¦§Þ\GpÊù¿Â„(e E) |üËx ¯úXÐO:~ç‘G½q„›Ëƒõ"ªM­òmëÜ–E^U¾z‹·‘{«ŠÜ›"„º7ª}0[/Á¨|­˜·X˜†‚±£e³Rpzá6t[™Ú–µùÜ6æZy!ÂÑzag5K/Ñåj'q†¶Q6_õч>]à ,–Ñ­ôîŒQ™&wžÏ¾yþ½Ã2V&3Z?K\ ‰¤þÌKdBáâ,Î2Ç?Häl™ö˜ &ßä6ï¼qLXévk]SÑ=®8ž«5Ÿ¬/7:暟D€=Êæë0ÈØ €ÎÕÆlÇ ÚËzã >;߆7`¯î±zF@Œ ‡´z×™…Z¶[…ÐʤIp¼à ñRØl.Üçž3lfþ,>2šFò!K2IäŽY)BÍhYBQo<)Ö,ÍP™²®0Ž âå˜÷9ÙKȵäa_ý hÆi £ <ò.¿â{@“"-#´{¤óz#Õ܃v#»$÷ú̸Êqü²ÞTeQÚêQ٭ؤh ¤ ¦“[ÒÊÒ­p‹KAãA`ø–"%‡8ùÉq˜ÂÁ£!/9Ò±¥!4'¢D)”Ðøê»F™O…Ùˆ–nHEe”)Ë.Ì’¾¨9B tí68€WRLu¦.½±Îν{îúxªIx*×’ÐYŽx¶|¦îô²jÙµwžªÛ…QË*_õ`yQ{!‡ws-iQ¹sé Êù‰lì‡Xü…V¸W>¸3¯öˆë”âJ”wéH'@x}ñ$¦$ø3=†ÇúTçß‘Îk¤Æ.ûhœ5#¹µ‘ÄÖ¤¤ÇwÉ »Ë«C€eš[É v8=§œ1¯Z85ÌZ™û[·¨6ÇóÁò^~1…À ‡²`*§€NæÛÜ g„.‡7jYšj!9ž¼ïâ8¸ $–o‹§§8Ô3ðF=ƒâd8#Þ·Ë¥³iÿõéÓ§gðÝf#BÁuÓ£;„‘YwžGþ“ÐH…89Iš8fªŸª£?ýƬ¸>î² ‚-(àŸ”"µd„€CÑ)|¤7ìVzOaÊ$¬D­’Æ}lx¾)JYN˜‹É[=ÔUd¦O€v¦¯ Nã_¨˜zÀ"aÐd`PRýô=â%uY¨ë 6¹/«Ò> â6[Ƈ‡ Í’ª6)Ø–eeÄ¢zAGÛÙâúÂ&Hú”g¥[)_äœX—(Väyçqß´Tú@¿HšïwV5­ªÜX³2[¨~ÑÖµixÿEp:q2pì19»9?GuZÌŸâ 0èøl´s#èq™ÍŽïИ=¹ÅË$!ÆÔÿôŃêàæÄª§ôµ†G8ºˆ«=:æÕå*l2ÐÑõ1{SU¾š#ªJQ‚. .Õú+Ó HÂBSÀªMù‹ê…ªUÎ šp¦C©#«¬)Ö °Q)ZK´Ó•y ‰qo©)Dx@9•§ì*øÂ’yµ0eaz£ëÜ¢"eƒ˜Ú´NÜä÷•Oeþ7ªˆŽ)Lù@ƒ€œˆD³àdRJݱƥ}í¹z ×Tû¤ú31~JofC"K‚?¥r娹“â.s‚—*Þ³¢:£ ó÷µ¹\>³'3¹ éù®aöUm Ššjp—/'ŽÄY\iŸê+æÜíqwZÈ(QûˆÕõNŒÑݲM»ïÛzæÆÙjOÑyâÿ#Ñ<êÙ\·¶e¬N×±îêÒRâ:cVH©›XíL§ŽxÒ'/ÇÞ’õÕ«G\yéFw•…çû) µâŠÀ°†Ý' ýŠúŸ ‚†ã¨Ž;"šÍNçz¾˜Ší+™ó.½eæDwh‡võúT®ÑzUjáÐq†}Çɬ¥’–Ÿ =T*†£wU[ôE¶ë4?˜ž©ò “ >ô‹L´³ÔF"*Lc-? ´²d”<ìVý÷N¾w  5 ±a‹òÄ*¸ÏY,½1 ˪2ýø¨nï©ßÂk ;X³ˆºÍ¯hñÓ^æÐy}ûA×åjmYNPœv»åð&îÒIrp ²å˜Ãƒÿ³…N¶è2<Êd3]% åâз$%ŠðxªÜᯋútÁÏ´Û•z‚±ÆaKå‹E'•.͵DÇ ‘…(A[_‚¸øôÂD»MY{ª¹²•Š.Š.›_éJI ] µAõ-ÅYDäg!‘§‘‘9O{O‘ˆõíÍ_åù-Çç7j7?ýùO7wh_ÔQ£šú!úTŒÉH!]ŸtvÒ[n,å7”´]ëJQŸÉéh° 'í¡k-#õ‚4 ”ÕŸ­¡”ÿ@=¬Ck)ÚEü4=ƒòtØb*AzÁËðgéö‰¸Ì*7öšk L€àëe« Ú¥%æÊT$`}aAILmªX/Ö¦øxy&]j8¥4ö Õ®øÿ×–¼Óƒ&óíõ[kêo*y³#}Z¨ï9¡·\XI¥ Ìÿi/—Þ¶( ïû+^™µD½Ú&m ´;#@#oÆ%¥D•;é¯Ï¹!‡­,Ú¬l _3÷qÎw‰‚3z¿”+  NQ@ôY@T†'–Ý¥œžDYŸäg±Q¤èñ&6i¥““®RmÏfļÏjv%‹ þ.u» Í- ˜J‚FÈ{C¯ª9mAYÇ‹ëñÊZ"ÊjèBöoªAiÏìuÕ&ù¿Yà¹LYQƒ'i™xÒ3µÛ®/ÃGá!ax@x¶N˜­cI¨¿’lý=4Zýª°‚›˜vFÕ–àÃd`þ•~‰;?ü‰€_ðßC·mi¨K¿Mb$þ(!þÜB6rþI냎wî/4Ì ÔÏ4šO¿GNÖ62Š›(ùØd¤áèn(j“K¡Ô«×‡ZṂMNî<Œ¦~ÄCcòU¹`ÒÏ õÜ7S­&ß .ûwáûWàü“¬ýøî§¿þÅjhûÛ¹ü0y°öq(¶8+ÝšqÆµï ±ƒê‹É*š/ƒ&Ž»ÔÅœlPãÎó‡ × ŒÛ  !߈É8ÎL[h}³K8T-Eö‹§CdbþÍYÄÏJ~^@ÀP ÞÇk*ù–NÙz+sד{¦«ôÑ™Õõâ娣ÌiD ˜`œ]†Ç<'jäªY·Ã™ì°j«ôŸpGØ¢sçè/‚)j"Á\Áïï5Í ³xªÈ|ìcÝ!§uãÁݯÑE»¹¡ñ7}éVØ÷1ms9;Ës7eÜ-)ü;Ù:y&ÑA¿;þ,Z#Ó]ÿš¥ùÖW†AãÒÂ* õK.¨ªËŽ1ï‰|ÔÑÏ/8V¼#Æ•›ºDïæÕٕžƒQek¼ÓÒàc ¯íÖÕŽ Xn-‹fÿ¤ÃD‚Ò@‰hب…Š´‚¾´—RÈYqUU`DA_ÓÚÏ{|ÅDîÈ—µº”¨¸ò›žs‰ÿÿ䱃^A'=€Ï^Wf&!¿LOeZ!¤£[ò+'‘R»O£}dî?ýþŽÞái-pˤ…¸“¢gÞÒï$ªôt90òˆSmâ2¤ëùêÿ5æØ Z ÍÜ`ð†£y)3¥ô#/íÃ@ S’ÌM@¤Úk[]®õ¼ú·ÂÔÕ„’Ú3šúÙ:'EÒú†ŸŸÚ–‰SÁ§È.ÃÆ¢”´ ù lo¡š bçª.Êt l…@Ó©Ôīԃ%¦Ä.Í›ƒ;½%ðJ¬ä7‡n]ÒØKônnäÒ 0íÇ©v–ܲˆœid9ÝŽþ×jê0 ¡µÅs¨ûPW3*5€u·ç~êü’›LÞEÏŽE?ȱ"%݈ܨO¡Cd£²ª…©ª)û’ýc›4ë×H·ñUS3صìò9Û6N­bл8K˜9EÜ ÎÜУCñMåcs„“Þ/ x@½¥†‚ƒâ]Ù>¶>N…;æca€q(SƒÒ<¢ª$.ž\i6‘×ʨ×}+²Þ®ŠâÎ#¥„úœrÏû|mNwô1ú,5S¯%ÈàV­Ѐ»¹'RHY ãVì$§ŠÃpžÛ{ý™$5BñjÞnxãP+5oô× NW×5Âûy“ž®yÓˆp¬lIÁ/šÉ|ÛzCïŽšŽ±s¹.ŽýU)•YOFQ€ a:Ú|­í=Úà±Éòú"_mÊ ÛÉÝq߸} 3٥ͳ+³¢©ºûv n ¢ ©h+n³I«Šgžƒc¦ˆ T!§M|Ô8l3»Ð£ú¬/£e—ÁÛ®jƒ¢½„´a»¸Z°ïïø:X!» endstream endobj 507 0 obj << /Type /Page /Parent 1707 0 R /Resources 517 0 R /Contents 518 0 R /Annots [ 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 508 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 612 120 626 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 509 0 obj << /Dest [ 1634 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 359 598 372 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 510 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 242 552 264 566 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 511 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 494 508 523 522 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 512 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 269 446 291 460 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 513 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 433 247 447 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 514 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 257 392 286 406 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 515 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 198 328 228 342 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 516 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 224 120 238 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 517 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 518 0 obj << /Length 3070 /Filter /FlateDecode >> stream H‰¬WÛnÛHžê+~j&MREe8Ž“õ"N‚1'‹Éd± ©–Ô;)”åCæö÷aOu5IYV2ÁfÄb7Ù—:UçTÕótt‘¦¡Dº¡ðñ?Q’x~âÇb:›xqâEº]\5‰Èó/š¼]¼º IJùžïÓ7ùÈíw£_å»ÌqÇ^$—Š~C)ÂX8ÿLÿ>š™fbê{³§Œ/öù³Ahö¢§IÌ[ý'ĬúŽŒ½Xú‰¸ß‹»}Ù®0Jå`'ÙèF\¾:þ브k¼›x©_æ«sq·ÓígUf“±ÌʹãΤøÝü53æÓBß‹1H_`ÎÜ`·ÛyÎØ dC§*:[ãH>¬ËíÔÊìtŽ¡Å(œÄÞ8Äxê%‰ˆ/ŠlŒQ«Ñbô<íÁøÄŒÆµOˆà–é¿Éa‘uXäù>ˆ¼ñ8™ v N'o ŠwU?d›&ÞØIpe‘굟«R‰f£r3§:ÏZgJUÙèT°ô†3 ¾8N ¢>"è‘Lˆ {bc¦Dž•âÇ›ÑÆ ¼©T¹^8ÕN@ Ô\èRÌí$ÿ…B,¨1˜uƒ²»lÏ;=³×~ioí 7ðàökÎΕ1°¾´¨â,ëúïÄÚÌpÓbB1"Þ†éó½(³5.3¦Ëø0âÙl‡ëŸ2F¤+Eaß¾ª\j8d•5"÷[]´.Ì/tÓŠj!vU]ÌÝž+ÑvÎkÄnEPÅRç«ÑZ-\sÑùp™½A08ˆÏWµ*sà r•NIÓ)œå‰¨¢¿ÙùjWšƒMÐÍu¢I}âñ¦À•²Z‰³ŸÓ«³s»É³ww)ÏXcyEº0•×é™'n0Ó’.9þ ÌýÁÎ<ÛÎŒŒ^®ZÑdÚŒÊes.t{ƒ1çIÊ/ͭ݉pEJ N¸§Âæ‰0 ŠÅÕØdÚ)œaI@†’_Šz[(ûh®o¯NVä,ÿºUŸt^ñâ3šK mîSS³rFR*xtãLäíõ‡·o®íìN„ŸX8nŒã·q¬Ì ‡>ÚÛ¨/0÷©#gD^ôÑ^´ÛiXÿX ˆ™™Xj9¶´a1„v¬7^§ø6i„!²b_Jt)Çd—ßõл=öпì¤rjJŒ±låŠ>‘- ‚GI.7†[‡Ü`ÓÕ&rH¼DØ_eo¾Ê6-$0@Ý$§4Jï8áƒàÙrâR”Ûõ=öÁe¨ŽÐYÁØ‘C{ü8%4Ûͦª[(1$|QEµkž#‡KƧ‘ëºË‡MÆþÿRy01åÕÝ/wéõ­ýðÛöïb­Œ.e6XŠ*ïÌ†ÉœŽ»ú¸Ð'P˜:➯š}Óª5‚U=@š¶¶½¨ltÕµžÏ••#ÊàáQ'S'¶P%nÿ@åO(÷üƒí»”ù#œÐ8‘ Ø?:ÞQ‰D’ib2Œÿ”2)˜l_\¦×‘áÁàNÀ%\3±(ªŒÀâružµÊ­Jàô[[>±UXdì˜~·æZcã~ò5ˆ&ß^:.•)õ ´É¥ŠæÍ«#Ö ÄŽŒ„µ£7I‚šÅÆGv‚È Ù‰ô…+¦µQó@ÃSV-ΰ/ˆPm%ìˆ÷Û‘²°aÌì)u«ómÑ Ln|&B<þ“À4ÖÏËŸï®Jon¯MAó3=ôýDÔ(¹IrTémIó»nŸsÎ.œ'¶œø '§»ëÔŒøï ‰i—h8…DD—>70q©#2²Qn÷h*Uã :|³)öC Û‚N`¼dr`ÝSYÝ6Ô!å”1Cd|êÊV}jКzarŒô£K ‘å¦àX8%•IÔBEjù–üW±WÐUd¡föSÀûµ¯ùã½çvlßó€ÿšê)UùT‰PàöÒþý17h¥?éûµ÷é 4…Â_’Ï ®×œÀê)*K*ttn óㆅo<ýzŽx£v}¯Ôt I6Ÿ Ç]r0¼%x\:39JÇO{OÄ2A¼¨êuÖ"–3“ùQgÍÕÍ¥¡ˆ¾ÊL+È ( ¨ûá^í§—W"Œ¢ åˆt¥û«ÏaØF­”Ãä+ 'û·§š—WåB/·uf«´ø:Àˆ·EUdÔêÇsÑ(“+M¾Â]¨UšïKºt$×ÃùMNün,X<Ø~² gÖY½Ä’þ£ä„nm„ø‘ìVš=™så´28€YNýfÂAÊMKÐzk]n¶-…‰=êgæJ‡ÌŠøÀ¿¼>ÄpÜLr©S[™ÕÜñu ž%ÂÃ}¹}—QÒÐ(/u®Û‚3ƒ9ëw+Þ²ä%vE®4õµè3ê{®¸£ÍìZAæC¡[^¾v¨³w‚÷ÛL—´Á7VåC$32†Š† •©ºÛóÊdB„y¾$“¶ÖÊŠZeó½xL6~»GWS?EØTùP”Í•h³¥-úykrò;y€Ž;ÃDn´íKèt¯Am†Ýk©ªìQÒ鱯[ŸÒK÷q㘿[z2쇔Ì:s Ç(&gˆIÊx xÍÙ/¯ø0âƒã'ñf_èp´¡1¥{Ì¢ï(ÔOkxúáâÅå/FÅ^“À…TŽë¿¥bšÀ.pNhxäÅ_/0K850 SE"þˆ;3œ³·­,¨Sµ¤!+@"õƒk'G¥|4x%âc‰"©!ÍnÕÈÌ×Hî€}Ì© ®¢p,7†­ŠçZ݉Dòá*+ÀO’YSþѦ–«|%¬Àðµ]òÕ‡yÒ¦”´Yˆ§ì)¦Í;k?ŸÁPÔªY9gólox_èåª=û6šSVxPuCYWsÕò+A´%–xGaxÉøc²~W̹Cš8Ì—Tô²Ë¦h{U­sPva§Tûì¸Î:_jfû@„šN¾ZK ;D¥)ÕNðèá`©Jô•” ¹'È«õZÙtîõ›Ÿ‹¬º¨)z¡i:í\e( ‡"þ tcÈäÍäTÁ%H±\¯€C²Ãù¥jÁ•Bì•I ˆ¢BÝ#Ó嫬\¢àù_áeГ0Dỿ‚ã4’ÖËÙèQõè¥Â)áïûÞ¼m)PãìnwgwfÞ|<êv AÄ^¢ñá@¥HMuÀƒiƒµ ­âÌClraj“|“Ðþh‡ßxW²欪»ãlZnuæìbÜÈ›Ï Lä"^a'bÇ6ôJ •®ïRc †Ñ >÷—F@÷ëë®SåòÃ#÷ðÕO×ÖÊL”ç1Àˆ*ºúZ·É×ÿÆäL«.µêÜ¥¤Ñ¢æ€wN”ŠÌV¥,É¿ƒ×—Ðê_t A?² 1Äß(Î6qºuüÖ&º®Ïk˜ÏË :´0}@ÚȬêNq¤£^föÎ')íµ\E÷Z=®N·ÐúÆÌ^Ú³Gæc™eÇP÷ñyÏNf{öº&šÃg2%±"íz¼cÒZÇ -µ#áí\„ÕŽB{î1ŒEê 'eç€K‘NÞ³á‰×“¹ s¬ý–by¨p`%O¶Áð®Õ's™Ôµó|Ƀób,Zž>î~•ÂŒ endstream endobj 519 0 obj << /Type /Page /Parent 1707 0 R /Resources 523 0 R /Contents 524 0 R /Annots [ 520 0 R 521 0 R 522 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 520 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 410 0 R >> /Type /Annot /Subtype /Link /Rect [ 77 383 210 397 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 521 0 obj << /Dest [ 827 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 668 102 682 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 522 0 obj << /Dest [ 529 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 436 451 452 465 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 523 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 524 0 obj << /Length 2783 /Filter /FlateDecode >> stream H‰¬WÛŽã¸}÷W0óP€­ÖÝò¦1Á\7YÌ&‹Œé´DÛÊÈ’aÑíö~Hþ!ÿ¸{ªHÙn·=³d.Ö…%²XUçœâëéàf:D(¦óA‰qIòÜò ãIêgy‹éjpó¦ËEѱM º¢Ü|ÿ1‹nøA@6Å`Ôßîwò'åb?‘ M×HŠh,¼OLx†‰þ$Ã*qîg]„'ˆx.ºK3;Õÿ"¼E7 c?“A.f{ñqߘ%ÞDR{˜IvU'^}?ÿúÅ¥xÞ`,õSYy,–CñqW™Ÿõ¦æIb©šÒM¤ø/ÿ²c¼}ÞZø¦oñŽ=Øív¾û¡ìhUMËbj,éã6Àî ÷jÉ3½›BQ‰A”f~œ…"ûy.²ÐO=&¹ØèÁ|ðzzFÂ$xc¨Š¼œþ‡–¸„%~Øœñ]Ïqûãè$ Á! Ah·“ùâc±©Ö¦j⃇%ÅÖÞ`'cìt¡mT.UÈa©(£J±Þ^.ƒéR‹Ÿþî,ÿ&ô¦«Ú¦í\ Ž‚¢'9“šò‡»âÇB7‹ªÁ ÆæZ™íF %fÛª6£ªŠeµXÖ{ÖóyUTº1CñfÔ™}­ûTŽB?Œ9ƒäÌøèרúÕy)Šsï"?—Q¾)ì›>85ÅE-™uÆCp\¡nJû˜×ú±šUueö¢jØ3åe‰ÂKeg2­ÐºÚ£^=x“ËÖT…(•ñP<‘dÄ„r¦ì´ýzµÚ·[Ó/¥6§[Œú-†ÇЇ.ô3½o›RìÈݪó2)Ö-]è?P̯üÉݳYrVÈÀx´6P¢6^‚»Ò a@ äGž£m|ñ#T]·;žޱP¶0ͤµCœÔje°ý4Rjñ ê-ÞYÕÐÇ5{ F—ò÷f·f¨ˆ±Ë;‰ ‰Uëî(v©Äš´ú#Y5Â~A„À.…ß…Ö…”] 18!m6Ry\â^î–U±æ˜iQ¶®8Á(Kq«›íꥵº%´~ž#r\‚+b?½÷|Æòé.?Klk7ê1¬K–ÞˆRw€òLw6u ë¾l5U#ŠW2DzÑUûÏ¿;lIϸR ”´±•jö(–ªm’jú¬²£kŽªÉ‡¢mæÕb»Q”%Nü¶3íªú顉ÝZ†y™)kBp †=B‹†ˆÐø{ ¥(t×±…ÂL¦XÒWÁpŒYèb¦ê—çÓšåŠr…PhSøbÊ÷KT.jÇh±®UtŒû7€’¶s!Ùw̱<ñwaÝb«$Mv¾²e$/‘'þÁòXI²Ê-Wê«kÌ0›i/ƒå-. m¬çÀ(-y`Ÿ(‰¬•ÁŒ”‹ÒD½k;3i³I¡œ Ãà¿Pä…«ôg~¹^þÚm!lN‹Zu•Œ-³Â Õ:W~nÚ]­K"d$•ÏÑÂô_WŸQÿÐ[,̰i¡@¡{~,îå_õÜt¾ÑÑY§ÿ?(r'–îú± kÈ2ÁhvJy&Í0óñ™>§Â{*šI/Ê!vŽý…£PüÀeÔ|O‹éòO_—ådZMN;€ð¼€,“ªnˆŠ7U»íH:Ö0h2Š%JiŶëYÅQÐÎ q^q÷Eà^oZ(yQ”‹b¹i›ª³µÓ®A?Kö‘Ð÷ÒÂ,†¦p2 h êÔ¾cñžÈ¦pÏÚ>Ûû[Q$À%é=¥\ÇIŸÙXùÂï˶ýüÕQYc/´ïªy²ÔÆHó†Âa-="®vt—̽—ÈéDÍl6˜4Q+¶[׿….¿h±ŽÍh¯Gúã 4Ë™ò“# $}ǃ ³\2—Lhë¤tm^:>³8ÀOàZ Á{Ä  =;rì ÃC úã䛜´ûOu™Z'ÏäL±œØlA ƒ®Ê,i°£(öó3|¾}GÉ”*Š¥j"Y•J¢zGôÏdOVâ/ÊâÉC¶õ ˜èG]l‰E‘w€Ê Æ­[T”• ²ýÕ§Óº‡Æ< n„SØøyÔ8ÄH›A+ÚG9‹µp¡+²ÍA€º&U ¢oTUwJE žßÖп՚I!06BìÑ”(šQÆh£mbmFG½ðf/œûè:/Q™? +ØAi ðü¬[€žYÊ›pœaþšÊZ£¨«¹6ÕJi²Ëìr8° -êz¥ù¶a9s%Uð1±b‘YFážêN—‡àüvá{Ö¿N¹®[ÛSCгµ½u**½@~sé í2®·,lgkM©—]צ:ÂKC%Èmÿ¡c!ó! „*¡ãäëµrÆßâXK%›È·Ì$ï=ºÇ٠خpe“{/>¿©GˆðCBÁêI7ò¤]ˆl»ðn…f°$ÕEA£]ES‰_buÑAœ p’$ñ9ÅñÏ?|½ˆCLœ4*ÏUúU];ñ-œ"¢N%›pB*4»j)òùIa^qòÑ©^q ¦3mv; {ÕµîC˜œ5~ß=? œAòæ}è6 ‚U”•¼5º3– ^’ª-ý€ª-€ÿ š5ª5ür±}u4Í£I„ÎùÉx€u“«Ÿeødí$q£(œ,yþõ¥ñ'8 œ)ÍÐÕ÷£wòæl’Úq{×_•½¸^Ð!Óy2û)Oº2|ÅŸ,$;pÕ –¬ýøÇóuÇ%ò0svÇkãOVÎs[ïQBÙ…åíÍÕˆ’ø ɹ>J…áF¯ƕϿ2ܯæÜ«…qmáøD1ŽM.#§úÆJp'ÿÜîH͇$ë6`Pð¹Ñ ËÖóåfm5µÇ b"»Î¾îª$ÔÈ{yËV/ï=AzɆ¥X©=Éñ '‰‹Rž(mØ·½tbUDPóÒ>‚ÚÉwË Ç¥zÐB¹£íšD ì^Tè:Vš™T5Ä®L›`ùL~­OäÎ èévlc-Ý$Ô\f¬ Î‹z/ì½.ÚÔ¡´ç*6ÕL„O&¾xjÓãÎ\¯üæí«)G畘Aš¤*>knº4+m.‹ºíØ'8¾IK2­¸²=l„Pt‰uéIPsss’Ëšl_ÿ_ööwwäõ«»§ˆ ÇÙµ’¾2DX¢¡ë@ºôá—Æë¡+‰®CèÚøe. SÄ9ûVnuFÊÝáäâ†Õ\×{÷ÒBË>Üíõ¥›­)-¼ Sa(|•~EAÄf–EåMºGyúVš’9û'<ǘ|¼7í¡Œì¸(Ö§9®SîKñ5êæhLlÖ(UÛ‰LwFgºÓ¯O>ë];Ø5s_mÊ:Ì®®Üñ°VfA€9‚ÜÍóÈNOfÂD—Un›ÎÄBÌøË!«Þè[5CºüG~z ²™10N¼¿«ý'F&ž¦poq¶ÓúŸ endstream endobj 525 0 obj << /Type /Page /Parent 1707 0 R /Resources 527 0 R /Contents 528 0 R /Annots [ 526 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 526 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 213 226 235 240 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 527 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 528 0 obj << /Length 2492 /Filter /FlateDecode >> stream H‰¬WënÛÈÆþÕSLýk¸°hÞI%݉7^¤X,ZX@FEAQ#‹5EjI*ŠºØ×è;ôû£ß93¼X–oQކs;÷ï|ó~>¹™Ï=áŠùzâzÂÁ?üIb;‰‰xÚQâøb¾ÜÜ6‰ÈÞãˆ&+'7?ܻ⡙8¶ãОl2톇É'ù§Ôšúv ýzRx‰°þ6ÿãdÆ7ÌDìØ³RüÄŽ-„/ðø.…‘¾êßf§žcM]ߎ¤“ˆåQÜËvƒO* 7É&oÄ»®Å_ÿcMC|×X íPæ–#³Íµ¸?äí?U]ð%¾LË•5Iñ/þŸcóÙ4ϱ#|Ì¿Çkp8lË·]ÙTEbq5DÚ:°.3S¾éÃ|âŠ\L¼0²ýÈ~l'‰ˆ\;l Q«Ézò~Þ;Ãw±ÅyêÁÕyZÎÿA LÀÛ °!°}?‰…þ윇¡{#¯Æ½WcWÛYÓXBÿ.õÅ- §·¢¡H‡²µ\¨y,”ȪíV•ms-ÚMÚŠ¼ÓöÎ(눩k{± l¦£+¿a¿Þ·"<&ö½Ã;Sµ¿é0Ù)k³Þ•GѨŸ÷ªÌ,r¦"³MZ§Y«x¦nDÓ¦5éÈ6/²r#n¾ÈGøÂr]¹ê§¿½9ÑÚ‡ÿGÜ¡j]d‚QÐ=èÛÙ’°-‹+Ù Œi¬J¤þ¤c|¶µw¶5¶ÈüDæeÊðaƒïεú$G5gUQ•b!ß.,Qù GzVÒ²¨²G»ÃG¤%ŠÉž!y´½—õ)º.ƽ5W³Û}J%Ì;»b–vÒÌ ¤\Qé±Z‰œ’£ä¿pýj‹ŸªVéWÛ¹õøÂ•½#C¼¾’½!d Ò¢¨¾YUæ9•QÌp’²¢‘;«²8ŸÏü3”¦®À;·+@]Àíú$onfŽƒNB±6ãÎ]+I|à©+„º±àö1j"_] £~5ðú­‡2=¸xü+Ë#ÙžYD‘FÁóÃg–Ñý†råàr #$~ЕSDnD4¾[Zä™·§A‚#˜›ÉÒÁÖ»ãaüÂÙs‹çUöA ¼®e³Â}XûPò'—Å© O¬ zþÂúyUÜ6kUä/”x#Aªø%g]X"Èu|B;HrÐÁL“G€´}ß3- o,úãá:¯›ö7d» IsFÛóËç• f€4¯S6{¢ìꬲiY1*¿^]ǣľÆ ëgÃÄ ]}Æ€7]vÌ¥õîxÚÁ §Ï/Ÿ×2˜õ^íRžðøø²¯áä%%.¬Ÿ×Üí«·'¾BeöN†Z—W 1Íêeļpü+Ëì»’ËyiýýüµôÈŸùô ð{^â>{¡Evháíóq…å`<¾\ÓSm&s…ùúäÇbÈs0Côë\á–\¢Hˇ}ŠöIBñ¨ŽFò Ÿ‰U½jÐn›}êÒˆwׂžVòÃ÷„j3{a]‹æ¸]VEž1a¤ÎܦÌö?§už. Õ0?8íñŸäz_fmŽý¶k–‡ô¨ykHS‰ÉÝ&]ªv“[3ÐÝL«×ÑxM`•ž¬¯YCÅ!gf lž+ôn‰àT>ÅÎã 4á“,÷Û¥ª™døTug©yB@åªûr…QVÕ0—]´_Xö3³5ó8!mN4¤A¤\*|ÚDô°z”‰DNÐÃe¦éi w­Ù–ÖJ0E–ê ¥w‹'_¥þÊÛü³B ÷e‘?*’p»°~'~õ÷¸¯k’p‘úGšÛŸ¶©h;õŠtö‚§5ãÅ ÌË1våtäT,÷yÑN-®‹\BþŠtÖxø!ÖÙ-á­« ¹¿×»”þê ¢[eΧtžù½‡£Jß&–)X~$Ía3¹‚lŸ¾‹™jÁ ©¤§+VXÐùX~†>‘T2‚^užÙ ™)­¶*VæægÔy”¼cJ5¿Gþ«ð±Rë¼Ì©ò8QÞJ¡-£s¯‘È+Õò!¼`І2ø]Qˆm4Ó­¹S‡ÏLÖp71yz7a/%X4jÕ~é0nnÚšûÒœoÔêüf йæ¨e¤eƒ„ë¢âð¤¥ëvÄÀßfÊürr™I¯{$ ª‘™l*Šˆ1Ã"ì€ÙÍ.ç’C´ó- OÔy{Ô(D×ÜZSÀ¾¼¶èµ yóÒll JÆ5ç_6Ï«ý±¬¥X×ÕVÜö…›~Öù}J,è½EÚë·)cö±›{¤ye­º ôq4n³¾Vã®Vc ¯ÖÛÏo~Ìéë:pÈ™¯(^×N;ØîFCñú\¼0­¹T"ݠݘyºá­T‘do+À‰+õ4@‚¦P°¢t(-÷y™àÑ.!£ûQcäÅ'ÏÄoô3ѸÇÀá‡áI÷€d_ce:@Ô¡>F‰ ÄUÁšM©´µjO]ƒ$ë/¤Ìj‹ÕŽÊfnórž™?”âjz…B.Šê Vby«ü!Gß»rM¼²í«™QŽºÒ$ŽË‘k²râ¹ÄocœÞ‡‘w”¦ŸÑŽApûbê%DûBÖG½Á•UyH‰Mèö× j#3ÃÁLÓ2n§Ô¡<”©'¨‚ `y¥¬XfÄB¹…ñ é|±mp8Lš¨e-ôá#}”múÂf~pxr·«èM°¬pÕrßrõUY«¯ÝLXFΚ²Ú}Q³Â^0BÞæ¨{rIxD8ýEs8Ô©Á§§Ù‡«Â“üŸsÏïsÏ0Ê?ï+2“-a¼ók%ñ W>° údLÎ&#`ÇMFaòŸ±Ö7â˜T«¾´¢Ù×uEtHg_µ'ðú™tÑû ° m †R¼èùkQ•…!bS-ì bžiùW‹ÅE+Íu',Òfı™©iß;Í8ŒÑT5*-ÑCÞ0¶çD•N8ü¸SUQÓ!ì宬{·!;ܪÛJ,•м`EŽh+¾ª{rýw"cA\ endstream endobj 529 0 obj << /Type /Page /Parent 1707 0 R /Resources 535 0 R /Contents 536 0 R /Annots [ 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 530 0 obj << /Dest [ 529 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 333 319 349 333 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 531 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 164 249 185 263 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 532 0 obj << /Dest [ 567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 207 206 237 220 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 533 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 483 137 505 151 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 534 0 obj << /Dest [ 547 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 209 110 231 124 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 535 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 536 0 obj << /Length 3490 /Filter /FlateDecode >> stream H‰´WÛrÛÈ­¼ò+ºø’A"À­Ú­-»¼µ«uEt¥¼V†àPÄhÍ|Hþ!ÿ˜‡ôe@P”Ö©ò*e™À\0Ó—Ó§»˜^Ìçh˜¯F:‚ÿá#NÓ LÃfÙ4HÒpóÍèÅË6…¼å=!´y5zñæFÃ]; ƒ0¤=ùÈï_÷£êñüI«;KÏHA”÷ù£ŒOÈ`Y‚·LÒ å> â³èmšÈQÿŽpÖBÏד Qa ‹Üªn3‘²ž¤Ú¢…Ë7ðë<ŠãצÁT^¨òõÜì‹îŸ¶)ù‰2ÕÒó3ÿâ_ŒÕgÕ¢0Hp0…s,Á~¿¼I UK·ZºÆ+| Q»ÜM­ù¤«ùHC£hš“DÃd¤)$:ˆc@ã;Z~˜1Ѹ%|hÁÔ!Y¥œÿvâ&ôÛo–„þ—OÈÑà‹HÄo»¦¨î`Wm›:·mk—°ªQs”¸ûÅl¶¥Ëz·(íç]ÝyZ3Å®›(¨@­aaòOmiÚ5]kËU×ugyiU—e½§Kœ)} ŒdÁàT¢^ /Áã·^„§Û¼0%X™ÊÍÖÓ<‹Eé@¦ÝèóÎV¹—â›Ûþ\÷âµ1ßÍœçrqŸúîÅëØí bç\±èIaìÜþ¦Õøö¶CÛ!vZÔ¸A‹•EeÁVK9©ƒ„}&Iä~݇½‰$Ý™$YüŸ…ˆŽB8/Ž=?V··žOðåúnÕ~m øŠÑhhº}í/‹»¢ƒ5¦–èñ ³C¦J¨vC(U c­lsë‘b²\ñëHhŨf´åk·ÞxË2Èé1Smc}Í;ŸB#jutl,š\Þ¼|ûÖY/Ñ™ŸwŽ—áµFÐ_Úªƒ®&!g U Î0çO¾ÍÊéÓVÎŽVÎD¶Wc  ]±AÕëªE#"±¢ó=?%…écL±XƒûÂ`À9´Nåd(*xëÅhûñá/i‚[˜ÖæäÉœ¶1Èì]2EF· œ'aÆsê$Î"4_¢"¢ –ÉQÈ “£8Ù ŽS´?HÇq&'D¿"¤èšDYË¢f(*á@$•%d Óæ2‚b‡z•µ•:T›¹´)JÙqë‰ µÂí”þpŸ'§?‰=ˆ­Elòú¢CÝ6H®E]‘—𾪅¿’ü $LØìÚ˜^ÙcV2äYäѯ£éþÀ ·žÄ±³Ý€0Ò9ÓžP­‹Ò92e†‰‰Ò“mÐH§`Ž/eËë5¯ —{S7dN§T)”K6nå &íq=”1 õ –uÜcYÇ=ïûdæƒçGxûfQ—E~Ô÷ ¿³ IøêÙQ1zeøÞ›rlj ~”ü­6{¦ÀäK9Ïÿöþê!IFAš|© À‡ª®›z×" ›€)ªÎÞ![Õ+ÐÈzÙ;ÆÊá9‰%f~T¯/|?¡Æ„x"“«3ãOn\­ð µáËäYÜME««Ÿßy3„髽t™f'ŽL ¹úò; ™`ŒhgÑòú§yÙò*Ÿr2͘ˆõˆVc ¤îi!¦Ä¡,bšêOÜk°®rçåüïѪ‚µ¹zßÈI¦rû:.8E&#ƒsñ:gîÁ#ÝUí(„Mð€u6˜žÕþgõð.’:J½¿¾¼¹yûæúêÕÃÂ2îk¥{gÕþQ­­L¹©‘H‰¨Zƒ Ñ´€ÎŸSÑ«°Øu\-MgvíV…-—-s0Z†¿4K_ ÷?LLÓá§"Á²èÔ‘ï6ÖTÄЈìqGBQ~aëñÉUMo+ž6˜ î*ª´iÚÞã4W%F–IæÂ`ã@4|*ß éÆY£h™¸a'O»BD¤jWR .ÝbÇ‚îÜÄš.bëQöžQõ̇pÜcRˆ‰Ò¡“B -o¼H]‡iT.‘ÕzÃtßЧ˜b1›bC–ÿ̳?ñv̹÷EnYۣ惊lðÊn¶ÝA쀜Bµ¢¾ÿþŠJÔ;ú=*,RŒj?âäÍÒd,MBÒ¸,@{NÂ’-ßÉ@”JI) V ÷RÔÞâ…ï¯éj­.©Ñ˜)D*Á•Ê…žQôu,GŽž¤3aßÏÆÔç¥' ­+œÅIzT´ÁMÞÛŽX“ÇýÒµ$C¬à¼;¶|Ç+&q0‹N®ì߸¢¥€Àâ•JŒiÿÀfÒóÕ2Üv-4» ܰÚ¢º=¡g»µ´›?q[VîÉsG9õPqNdÙ1–]ÊnIiW¾R©…v R u?Ó-{š|‡˜ÔN¿^{1–)š‰ª¹.ö‚ÐIVœôqYßwýuzBí é{Ad«•‡ü\èJ1çØÎÎ Â!„.Ðùã # ¨LwØråîÆäê1Kc»<€KhX o1CÌúö /ª»u½»[wD<È3Hö‹Íw]Áe2Šh«û¢©« µ*ç1æ$<ô²(%¿-¢Ÿø´<``m]Ž÷† RtÕdÎ3¹µC[hêϰ|íYuUsÁˆ¹mê­mºÂ¶ç…YømÉÿQKú$9þRY¬·™ƒÀñ£Ô½ã8#…géVsY•5ô7EÄ 3.lY£2Ȭœm~ï“£ß(‹›žLítÊ;²è]*û1oT|ûL(Õá+<ËD罆bÿ²hœ}ú{K®µü}]`o&þjO4ØÓWýøíÒÒž‰†¶lçù_F_©KÀbÝ™FW›;êùÚl;Û´MI‰”f»ÂC+dÿ©v¦ Î ô¾¾x&(Ä\¯q‰mÕ í‹aÝK„1áF‡¾ávï„4(23®¬¨+b>ÐÂZÉ/ñAìø€C\¦‡[€®ÖÑʹ¸+ä&+åÈâÁ¹»Õþ6ŸäÄŠã‚}#ßw¬yßì§AýЩOõÏ´äí–b²ai÷Xt&JO2C]•âÆ >Ÿù ÇÎ=ÿɶ°-Mnƒgó§~Ò¡4R/xïMSH9ý˜Ü§_oo ÆÒ.ZŠÓ);hxiW}<£û±hƒÅÁÅ<íΩ(à4ãÒÂŒ‰‚–.nŸµ€¦â ÛSÕ0çÙµç˃k¹UBRåÎÓš–e—DøqgY»ìÃ>t{6)-sSžV"„•0àcJã!¢è”³8×Tˆû™<7œnd2Ï­!¿VZ T$r$HNÔWï’5p´'#&b¬Æl/Èïâiö‡ùáéöº®0îkÎÐík„µT2nêÆöë >±õ:eœt@XÊ';Ž3dN‚8:ùî$ké¾–¹„%ÙÓµ…‰¢ƒ šky´ý\MKë±Úº‘Ô´Äü}ýk]ãSQ•P/~³9å±¢„ݹ~P'Á49k×XR‘‹‘ª† ÀBŸNKÙÝÿ¥½ZzÔ„Â辿Â%$£A  IÛ¤™4馻I»7ˆ×2¦ê¿ïùpñjnºîÇ}œï<¼>þ˜â¦©à²°©2®eLAŒ²Á‡u>Ù ‚6áˆ}[÷˜•¦âå«>‡lèfè,Ôü^MdžîAVwñ`ñz«ç:ÒL:b…p1râUÍ“q'p£VB/Ã` ý\8ÎÏ•g‘I¬ç÷³jL¹•4Šï8ˆ$EÈA«3Ê” ø‚ø5ADC#4EƒgkJ¶në“"a×JüKòÊ9–î-q217ñ´ÙJX·¥áÊ$}â:eŸ¿øê•Ì„ góÎÒêk_óuRµ»5ÜVét8p9jA0H{?.Êð߶UN[ /t9‰Å,Iïè˳÷u †6ZL,ÓXâ ?oj(ëøÌTÅœ¨½Ì%ï8¹gïX¨„ö"hå°áı“’b³.cm(ÊlMÄS¤ ÈX+æšô•|Ôû}Ýз9‚w“ÌKY¯1/Ý[}H´»áôÏÂöÏmVY)¯ZÒR"nõÐþ…`Ý#XRåLb-=Úié¥^üÈŠEP–J7LF4Br›tè­|/&©PExaD‚¶"$:ù™b?,}ž¤³„sÒÎ$¬1­2ï/(eüì͈» s¢ü`‚ËP6æ/\öfcµ$‚à\/#G1¤BÅÁäœ)^«š_žGESÎî% ÚYÑ…¾˜^™컳 Û#îý•/Â/\â‰ì£a…L\s»¬΀]ñºê[È“"ß‘è£/Dq4•.+[´òZ{Ÿ2–ÿùzG& £üâLäóPËO€#d¡Óleú8ð } ïÆ†t·'?Zºm%ë>ƒThJŒUÛH­+’Kc¯2–)sÚûÓ˜#§xĆºÎA[tÁmWÈRD@憹j9‹Ç–Ò2;ÏÐYÕ^þ%,v·Dȉ¢¤Ÿårxå+ÈVýŒ",K‡Ÿ'NV‘'Ÿ¦/Ï_pªoEµQݯå>£þýzBt{êÃUû °¸W:7ƒ¡PÓúOÂz̸ ¹+ÏÚvyM‘°ûÊÿ'bmÌP›ÉлúÃÉSœ Ñö²‚_8Q±Õ“dJÏÔ£§Z‚î´¿=}ø#À‡Ïöá endstream endobj 537 0 obj << /Type /Page /Parent 1707 0 R /Resources 541 0 R /Contents 542 0 R /Annots [ 538 0 R 539 0 R 540 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 538 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 496 712 511 726 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 539 0 obj << /Dest [ 563 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 299 203 321 217 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 540 0 obj << /Dest [ 529 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 317 106 333 120 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 541 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 542 0 obj << /Length 2810 /Filter /FlateDecode >> stream H‰¤WÛŽãÆ}×W4üDC›wÚðCÖ›5bq€ü?PTÏ cŠTDj´ò‡äò~È©®¦HQä c#’Õ—ºœª:õa½º_¯}!Åúi%}áá~Â4u½Ô‹E’EnœzXïV÷ß·©(Z½ÆmQ¯îø,Ås»ò\Ï£5ÅÊéO«럹ính=+úõ-xÂþeýã*Ó'd"ñÜ,Æ-AêÆ_¢ðõYôÅ|Ôÿ||u|ÏvdàÆ–—ŠÍY|>×Ý ¾ø–²q’Õ–­øËwâ_¿ÛN„÷d‘Y¥íYÅËø|*»ßÔ¡Ò‡V^om'³Äõ_­˜6_›æ{nŒ—õG|ÓœN'×\iµt«¢kq4®tñèÁºÂ|zÑ'ýu½’¢+?ŠÝ –"HÜ4±tÃPÀÆ0µzZ}X_œH,ñ®½1¸Ú#@Ëõ¿)`¡ Xèz!„n¤‰à×Þ©I¹‰?ò*dÆ«žÏ6ÅnæJ;…Òâû¦îÔ—Nè·ŸóC™ë§­Òªlè/ë—–}5‡›ËÝ~Føa( ÙôHw¯qd g0T«_”Èv À(ñjžJ["ù¦2K.WKswr i ù‚­²C«¨pPè&½l'z#ZÙ°™œÒØøG”µhj%š'#‡rßµxÎá(DÝÚ¨ª©ŸE׈ÜHEÁŽtá> êM§x}^UdUéh%22Žte@ èkeÖH'åä„¢ a<€ëãPEC„awl;±1¯7žòý?áš‘[åÅ1Òøe£ž[J$ÑA᥄Ž­Mªª­+4|6• )Ri¢e¢@ #2Êšjl$Ïæõ¹wð&ç…:aíßæ]Þ÷ÊðhNRJÄnüh³ÑNêÂhò¥Q9tY醬EH¶ç:ß•…ÈùÿjëÜuÒ"eø»jžðëÓÍyuÊ{9 É‹ÖOíöÝYð×ÿÍ‘Úh¬Ú˜³‹_UÇKîÌÒ=` +Š’O‡½ˆ`‘weÀ™éøÜ¬ç¿)QjU^tìK×LÂ逿”P+µU[QkG!²9!"+œXÛGû›ña¾)7¦ú|’&ë݈V°>âôû{ÛAÙ¶XÚþ{ôo[îö•âçWFÂjje ^H'ÒMQѨ>Žªä»Ò(¾HC?DÇË#/uýpqû;âÑÝAl¤(´qx»{NŽ?”GtU]ãµÍ”ø«DÁxF,µgvçú¸Û¨Ãݹ9øñ[–ôîN ?˜}7>DÇIü^òÍDÓù¼¦R5ì5m»RÝ„s¢VnÂÏÙeÖðú‰~!ºhü†~ òyýdæúi¯_§*µAÅ6žRU¯ä×FɪmÞS÷Ž_6ÇŽ(×/ç)gj :Ý[ÆÌ‹çmñ††ý`i;F__4»=ò¦íëp¤Ò_ßOÕ’±¦ýÅñì òYÅ¢ÌÇâ‹“Ëj»|·7N™ÇÁ°j¢˜çòdÆa r³=‚Néòîñ¼U1ŠçÅÝï–¯+¤ä‡õ‚kÓ¢$‚Ë>_’Ïk¡´†DÙ¦‰·#ETU¶ÝÃ/Sß×#õ&ÕWŸp£2iôF4–äó*ƒãÆélU«þˆª u- ‚7õyYJ½ÁH—{ÃÂöwÄýÝaºÜf…æÇ®ž>G>HSÌžä®;nÈó\µgš4jEV§ †0o ž·ìPJfxL’ä…zŽgx,8«í„ k4è‡ ýdz$…¹PÂuhˆL{ò©™gD¼cK {ªZè†ÉHµ81W‚ fë<AtËx‹ÊO8<3÷’É» ©zòn¨˜øQd‡&ƶ'ï1©xMÞ Á6Ote[²÷Á„õ/u%ŒüRåòoY;þh&1f_4@˜ño0zä'6z°ÙZ0µl/fÔs~Ø¢‹´äžÓ‹ªÁs›=»<¶€f=‡ÍéxÙ»¬»ËËZ_y€† ClÖe]j «íù³P_”^Y0“>v4V¬õ¢¦Îf%seCíÕ(;8XÒñæHþ9b“´xñå.UÝ‘[ (ùöúü…×2_Շ΀6@?£6V·dŽºm¿E“lÎtUλ&óñ€çØ€‹§Í«ØæZs[’ËHšYºæøü‚@“6¸ˆeš›†7  ‡äaÞ =Êæ­Uw†ÿ1§ð„&z¾Žùãv@ ­²AA3ºjÈ Ëã~ÞCzÁo„â-—Pn´˜$}‹?Úîì<#ƒZß÷s•o¹=ôR== H†Žüt’4Lùï¦SÀéô‰Éø4h  ¬÷óBÂ3ÈÝ¡ ›ñïo˜*xZ3æÓˆ•wÄØÁÀ$ÎVLÍ0|µMQæ˜vo¨%ìÊ²Ñ 1JøšmÞ1¯£9¸ÀÌÀ©;¦­S*¸áˆJŽÆ C$9­J+ (H½È7 ¾È/wÀ³‘—ñJLŠú£–C™œTØ ¹ÚXs í”Ô0¯¦('¾)'9s,ÿUÄ\‹¦VýuPïþ?M± î,DÐ -5KAcì‰ XQ‰©Ù endstream endobj 543 0 obj << /Type /Page /Parent 1708 0 R /Resources 545 0 R /Contents 546 0 R /Annots [ 544 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 544 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 217 115 231 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 545 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 546 0 obj << /Length 2635 /Filter /FlateDecode >> stream H‰ÔWÛnãÈE^õ?57&Íæï³;“A‚Í$È{´©–Ä,EjEzdMßÈ?äóª¾Å–7y X$«/U§n§¾].î–Ë€0²\/X@|øƒŸ(ËËî‹8Tòòzå¸9%ÿ”ÿ¥bÒ|iZà{ ¼,ßÁ7©ÁñxôœÐc´Å[^ GÕ<ú`]¡?måIï— FJ²âÄ FÂÔË2’0/ŠØeä ëÅ·ËŒÁÿj-—[ÜýæÂ_È4ÎÑor/ý…Z©Åp§6HŸ2¸Ýó#m* Î¢Þøˆ¦/ìÞ:ÌK© k'kSð¬¨V¤Q€BZ¹²‘+IÁ«J¬°pÓ×å^–ªëð&=­îé¸ôLŠŽ,èйn¸væ ^íŒÔfƒÚLGV¼ã¤ìÄŽf™ Jšƒšõ[Â1ÒéÈöcY×e½(cJ&–^¶ †ª­há-Y‰½¨WЕÃ(œEšZ:Ežæ˜ÈÄeª§ÍK†”ÕyV4u'^ºG`ªÉlf>åEᤈ—ã˜f-é‡g¯K šïôʪ© ]®†™k‚@^ÖÍÖA„É0€ ÚA­ ùÌ%ªÄ9þ±Œ6¨XdûVE¥¬C ÝõXä^I,‚+X U¸QžÄëĺ<ð‘:êP ¤Bzª›ú´kž[X¼?ˆuù"ZrñâÝÜ’ȈŒrÊÇž“îÔ‰QXÑñÃFtø5¢7žA)Ó å^÷…ÈãypC(+1Ú¤2Áÿ/2ÿ,»6”º˜ø8À˜œœ>Ê­9žè³Mñ±Ñ( › &ÐyBuÍþçTW[âÑ5FCJ›¦-kÇàÂÍEƳüŠÝ”Œr~5NuPBfzø_fzSW'ò„e17iN¸ÊúB´CTtÚ?·êB1dC;ŸMµ’)PIK7ÞÄIõÙ³ä Ã:7™2b-#Jè7 O%ÝEŠD^2D¹› zLÆ0ã•.ÊèÝWŽ -—ò¶}Þa–o²v©Ç²U¿u£~5xê¥/OòíÝòÓòퟖêå¨?Ćd!thF’²Ò™Àˆ¼*“^AMÎ䱟MÖí¯ˆû»UÖI)‹°RNvÏËÊ „ø£$$I”zi É6Ѷ=º3€AIQžÐÐ~Ç+ˆp~P¯Uù£øZ=~u74Îd5Sj!Pµ-r³=ŠPbßn‘Ï[ìÑ7Vë0ùæÌÜ_OÕ!õ‚áüdê3‹Ülò\³Þ"ŸU?Î'Xw£äètìïøÚsí³ÉçÐÇ&Þ•áV; ·J£îÌÍéäNÑñÃQÌ͘g‘Ï›—æH´MLBæÚb*Î}¬RV§Øäf{šH†cÓÚ&Ÿ×:†á"™)¨ï—ž%´â$ÀÙî†En¶G@W‚+Û-òy+ 9E‘±Â„V¹¾¨¸Ü[uÖˆ·õ´’fQ=uq¤àUÿqT`tƒC qÕ³PŸI×À,â@$à,ñÙÁû9RÏ„`®H´ë³ÞVê_T~sB )/OjÔ¢óÑ‘„†Ò{•RŽCA¢µ+ô5ûîÍ£ã‘~PÐc¸MNGÀÏC˜[Ôkêë´ðÁhŠVGf&PÃëM<èœ á|{8ð“cAš¤&8‰Ã\ 4·%“a`ˆs{.ÈÔíütðCªn{ªþ#¬T* _ØT ˜¾ú®àâÕ‘;=i„‹+Ǽ•œíʨ•DÒÔ¼‚AäTó]‰ãCJ 0D] †U0VŒ—Á±/™ªkûq¬ÔÆû¤Omú{r"%Kù²u¤!3SÆÌ|+*ötjx•ƒÐ“¡ÀáGÏB7rú¯?ÉYˆ“/£âO¢ãÊX|’Ï\/_A,®Ä‹ €g´Õ@ꦊ-Ü™¡áÐvgN ²ëãŽM>¯b2wžfUL§*fÝöª‚q>8ý"jíRÌ-µgŒeû+bsw^Í›ÜB]LK "Ü>¦.®€"]}ñ«ïokÂW« ‘Ô:<”Ôv/Š’W¸üš‘ÐETR]§Ÿ[¨­@%x¥Ú9Ä8‘ãf‹%”«gR•m7ß…˜VèK1‚@#c@ŽžÌµ%ö<ºlÝ|…5<Ô Ëò‰@ûv è? I®Ç2N÷ò][$×7ò –ò HY0>‰«¯ê¿l‹5: èU¼C6€cÙmÁâ_ÉEØHB`]„Ë’Í·‡È¼#ź@щákü4{!YÜJÚms¬ ÃZ7ÈÄP&^ óƒvØ«¿¾„üµn«ntÿK×ÕuJ £ANºT=¢_Õ“ë¾™dË™-ü-"Ì;Ù“nnã5YŸ?¶"|žl—ÏV*–Ä N²{ ÂðñYm®ž]Æ|Yá¶8бuñ~„=Fû77ßþþýúÐöð¡ípê½¹»pG ³ÔLµ¶É-j…™Evµ–ï¿ÿ+;Ó«ƒ½ß‘Q ÊVz¥ûÚäÕ z²ìºjÁÏV-®{Å‘ób‹bP°‚+®DÅŸ­XÀF!;ƒ™E>Ò9LA‘ê½ôþÎÒ>ñkn²Èõö4œx‘¡V!Ö%´W…ùÍ×¥úÞ<ò"{ž—þgDÜÆv endstream endobj 547 0 obj << /Type /Page /Parent 1708 0 R /Resources 552 0 R /Contents 553 0 R /Annots [ 548 0 R 549 0 R 550 0 R 551 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 548 0 obj << /Dest [ 525 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 398 507 414 521 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 549 0 obj << /Dest [ 529 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 491 106 505 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 550 0 obj << /Dest [ 543 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 127 491 151 505 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 551 0 obj << /Dest [ 563 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 248 491 269 505 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 552 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 553 0 obj << /Length 3626 /Filter /FlateDecode >> stream H‰´WÝŽÛÆFoõ“‹6C[â’Ã_9vÛ±ƒ©]Ä*Pt7 (j´bM‘Iy½AÐÇè;ô{ÑïÌ )Š¢ÖÆ: ÃKR3s~¾ó÷Í‹Åäb±Ìe‹õÄÌÁ?<ü8¶Ø Y4ì0v<¶ØN.^Ö1KkµÇauZL.¾ç²ëzâØŽC{Òɬ}½™\ò¿&Ö̳}~-é)8ó³~^üy2Wæ,rìy-^l‡ŽV¢%‹Þ‚P‹ú¯À¯3áX3׳CîÄlyËÞÝÍ¿.-HâuV³çßOÙ?þgÍ|WX ì€g–ÃÓÍ”½»Éš_e•+!OŠ•5›söõW¦ÜW® Çñ±ø¿) nnnl˳]^“VIj!*m¼:ð.5?m”¤W‹‰Ë26Ah{¡Ë¼ÈŽcº¶ï3øèǬ’“õäÅ¢Ãs±Å9FãµCˆÀÊÅ¿&¯Ýa¼.dÌmOè³—üâ‘5ƒ$^'Û].Í{Ze»F¿7¥~&i*ëÚü¶1™Ëݦ,Ìg±ß.ee6-oõ3+Vòcënì!e\E.žL¹Øsô“«AØ­úÂGÒõ×'¶…öø'–;Ý*¦jÑ…xxtÁÙGYø-ÎYQ72YiLÊõ1FE²5>ºB K;•ÁÀ¢3ëíq_Øþ§Ç—Çýqc;y-+ão†V‹ØŽïÒ{f}\±ãÓ‹Q<ȹdºœ¦'êQÒ">ˆ‡9pf½=î¸ö]/ÚF‘u %Úægú±xõã/îåcççoô÷ÅE[^™©¡lXpu—(Iýļ4³@ /¿g혽 ƒY"Çm×ScÓÚí(€«‡æóÚ ìˆ3¶zÓåbË4Kr¶ÆTy©~©,÷¸B{`%wÖ,ÆBBã#§hXY@¦4gi¾Ë|ÅJ}|%õ“e–‹þ«ìΆfʲæk£m¯Ÿ²S_jåZJ~Ë´h™–Û­„)«–7¢ÃA€†>ldѶ‘&[Jv½‡‰øNHlFÒH+"ý+›iɈ‡oâ᫪f¾íyqÄôgš À/zÊu[ å̵¡í:söêã®ÂÀÏʢ zàÍ‘2PEtdœçõå%•dË}–7,©ÙèÍA󼼩ÙßîÓ p/ÙË)v5¬ ÷CŸþâHž³r'«¤)«š•kö’%’,O¬ /sye=1¿6+äEdˆZªÙÿƒæI9ä¹ár†@ÜÕ¶aS®ñçE»Ëí¶ùf›ö;¦}—\~DjR:TÈŸk†ˆ¢uyý³‡¸˜I[V75S`Å|m J¼„ÕYqËN^kLdûóž@78¸ÝÈj;tÐ:K²¬ØvŸ7ÙŽ${‰ `è8+‘õPæÑ¾C®;*×9"\¼Ge4åµDÙU ´{ƒŠ•QªÃ!º(k·ç‘×9tÉK RAT4_¨«Ç‘”…=NiºlöÌÀÁ¡è8_î™*"Ö©2ôEãbx"-C{gí+9ŽFr&3½U›'©àwÖê³a9•œè×HN*.œ'¹éÅCk*›É"ÍËÁÌ ¶Kª„®>µ¬§Ö7!äèÐ"”sË^j½Ïå Ës¿°g‰ëðð%Wˆà¸” qeMG´££>q[kôFR>$„ 6C'W(ü+w÷Eèk3ÃÎÌÐÜ×V+öŠûíR¯¨ŒR‹.‰.OYà¿ÚQ7r‹ì|L`–ÕûeS%(qÀ‡6]t¦›iøn“­–Ë5ðôik”º®m,j_´ŽÁ?C2~½¡}ß~û–ž¹ ¾,·;sá3×AÜèڣ7¥þ4÷E˜Š&ìª.ütʾ}6UÝì)žÏÔñóPç_={xðwþ"kn¨¬ž¿ù–þ‰ 8¤÷§ÿ²3àïo"Fç`ÿ|xüÎÿØm†OfüöÐæv(9?ªN™·á8ßÉ€è`@tdÀÛŸ€ßŒ~RëöFzïjð¦l¤¦D]K=ÑäÇTîö˜ã: Ò‚Ö$«,5Dýz­©!nšhLM¶•¸alwD«IP±ªÁMÖÝ‡Ž†£ g)ú%O*P¨²iNi|Þ²T›Ï3"ب¿¥dÙv—giÖ ·+j«XGC¢#©OôP›o{^1ý†h¿BÌqÓ q±=™!&ÉÁW\+&‚ÿ“sS©Ú/-‡Ÿ~—.ãSá;޵ŠCõ›è ¡N« ˜Ëâ:+ðµßíʪ±f±"'Š3(¢QzÁÖ1eζ2Ý$EVoë!wpî—qñxåÍ;pL´~xŒ€«¬A‹Ÿ%ºMü"?â6Q׸Z´e¨papbAàÜלè¸1H²@G„½üÔT¹EÚy\žÜb˜‹1"V_‰ø“Ó‹€ß¿ºê¢&ÅDÜ Qð€T«ë©n¸1¿sì03lPT2Ý%&ÒËGî{AxÚlµ ˜XÔœgêº¦ß fu/ص̋¨¼†}˜–Èמpi7+\7Bòr_u{èÑÿÑvË‹²˜ý*«’!ÄàWöqÊ„¶ Çq¾ !b#“éÙxp¢óGg£jHɱœs<š’#ˆ©4{EÀ6Ùì ³ù V§›¨´G$*̸éÀgs¿wêûw¤=}þ¿õªij¢÷þ •™ÄäïöÔ2:e†NË\œà4œˆIèô×÷­$Û²ì@aà€Mˆµë}ûÞ¾~èô\Žœ&º%Ì€b—W¿.Ç2 %ßH„0‘k‰€õ'c¾]C ášÕZçm€”¨­¯ÌÞËÑq[u:R7ÛŽTÐÕ§KH}8•ž·pòùK„ôϛÝÍÌ5WØ¥__ÿ5ÒDÿ,ÃóÔ™Óä¡ir-Ô… iwŸe"…™‰¼“t×ý5tNoÖ!ÖÙŒylÃTšc©p[ºEDê+ÉYÁ~—{샫”zÐk A˜q½¼@PJ‹ê¨ðõÁPÊÁNgœt.™?m¶UÙÏTI>ôÔü¬UÃ)[ž°s*ßÌ$0gÀw»„môµšÐä;|¼S^cKz¤+S7ùšàʳg‹IÀ¾ÕlUœŽåÑŸ¶µ±cµ.nÂ]ª%–j Qm8‹ÃØIɨ[¾ *®6  `2£‡]QzC Ð#¡ëTÚÒ ÑS€ŒÒÆÆb×:­e¥V÷^nð¶æ¼[ÒóZ±eIσÝ{ó`¯í¹Ú šÏîL¶VÍ·íõ4z€öN=$³N3“ö ÌvÌ7f•:hlKØCZlí_ÓNczn±±9.PŽŒõ±Ó‚/Ÿ˜!®‚±Žøê~1Ô(‰ÎÈO+#`gì$ØŽTþ˜ûò+»umŒÌœd±Æ€`Eͪ²8ÖŒ„¶ Hæ˜'§E¿þ¼ü‚W ù÷A'Fnذ z̤V(ÿlk3‘ Ž~yóá/Óx* endstream endobj 554 0 obj << /Type /Page /Parent 1708 0 R /Resources 557 0 R /Contents 558 0 R /Annots [ 555 0 R 556 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 555 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 424 730 454 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 556 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 634 266 648 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 557 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 558 0 obj << /Length 2944 /Filter /FlateDecode >> stream H‰´WÝ®ÛÆFoõ‹Üt X{È刓“Ä©c¶‚µ‹‚ÒY1–H…¤||Zô5ú}Ç^ô›Ýå(RÎMaøˆäìîÌÎ|3óͳÕâfµ’Ìc«í“ÌÅ?üI"ÜÄXœ†"J\Ÿ­‹›oê„mj½Æeõ¦XÜ|ÿÆc÷õ®Kk6‹eûø°xËΜ¥/~¯èWræûÌùÛêÇEªOHYìŠ4‚?‘k”è¤>‹žÂÈõ‰¯Ké:KÏw¶~do‹f‡/’+'ñ:¯Ù×ß?aý¯³ ñ^AŠçŽË7»'ìÍCÞüCU{}ˆÏ³âÎY¦œý[ÿÕ†éëë«IWDxY}‹oÚ‚‡‡áøÂã5iU¤GC¥À£‹Ûmì§>évµðXÎ2Œ„yÌE’°ÈAÀpÇ a•ZlÏV3|KÜsoô®vÉ#°rõÛ Lˆ’ö_¹ÿÍ–©Xðç ÛdËöuÉ6eÑdy¡ÏBðüXø±½0¶y¡Ž€¹ú7¯^:!n¸Â ùsóüË­¾fžPÄ^¿ßõz Sùв:dûý#Šˆõoo®/²å(+S90=€½ eCÂÙM¿°|M’ˆ£I^nÞ_Ôãa9¾lÎjáZ¡€rDz…¥‘ʞǾ¥346¡¬ñ¸Á<=Kä<šÏ•C 0@ohÜ¥ª>¶G‚k‘`j¢ÝT'…¶ _v8}h³3VZgJãÌÀ:3èa°ô¥@bt¥Ñ^ïáZ”³Ä@i8×ëAâ°Cö8ÓfÑ;ø’Ã6ûìõ-°É¿v¨¼ñ¿\3W€ùvÜ`ÕÇÜôB '0»7m••Uç³¶""@énýþ'[ÿ%Ö¨]ÀéÖD'ԽغÐŽFý³¯)®­)W)CÖ8pÀÈ<~A ”¡¨! ¿àSýÒ빆g¹†®I8›xC±uVà™Ärê})1­üמëVüB¯¹5l‚‚bؘeÔóR{ÂÑð„Ío72‚ gêû-Csù{e ;”æÌÖŽ³ÅÙkKAôzxT«bæËô‘“D'ì×Ìq'æ–¶È!m9£,’(‹]‚õ-‘šŽ2ÒØu-ÑÔ ôŒQ«õùGBkÇ9rqP»fµé:Yž™‚PP ‚½(zElª²ÿ_âiºÈ_ß®~yýò¼Ø"4¯<ÃìuBNö/N¶élÏ×4nŠÜHš®$\ä&" †Ü@õìåŒNÈ(6äe¸eÙ.ؘU„ÃâyÞ,©ï£œh\ú\#"¶,Ò<löŠè™-ìdd€•cêðÈÈ"Ó5­¾ƒKlR.äf ‡Ç¶þc\ Ýü-͈ŒL<ÜlQfs2¯…¶upþQP›|‹1Ñ`ÚE?õE8ìþÞ>êÆIP¬P¢éÆ ªrÖêÂm¶ÅrÓöã=¦ "0Š*D 1+CÙ0EIµ¢œ<*d^ë–H¤£b<ß½å¥fÌœôçšOÕ±t–)̯á'tFÞ„Î;E‹Ö¦BОRÛƒ\ßæ÷§*Ói»ÙeG„²~çˆÖ “q¶ôô§ñõé‚ý¦<(tÅìpÜÛùy›Ó^›8&¥Ã1Ì‹FÝVËÈ5z²þBï»]-¢à CO ÍE€Uÿ­ÔbûIaµÂ@‚ȉC$“ æ6_—ôRšj)z<Àv±yJþl5Èî³\„äeDSNn"RZ¯qG}á ?ꌢr2¶yZ<­©¹F+Ïž†_P¤š¤$òÝF#U3òI]Aš¢"[]ë§r¬ËM…]Ñ5#·Ûƒ¬}~÷ŒxÚИFŽ677& D÷l@tšgT ƒYûêP5ë?e{ó¸0H0sóœ“O[Ò¦ÖÚÖžwˆæÓ5Zº~«Jiaž·Ù¾VcHQB>™wߌ¼Ý†WöN §¯âSÂŒOÇ<…æ‡ØN=¾@à‰àšKgäÓvx™‚Ù¬$hà5gÍȧu¹>uw{çþ®ÿ_äJ&ΈÏTzPå“N?-”ùò©ÛBf]©ìýL\ôÊàŠ3ò3â~êÜœ-½‘£ý$Æï|Pç䓎ö#:Ôjû×HQì‹+ך·›Ã´ìÊîù´•~H£@«&¾ß–œ……ƨ\ñÕŒ|Ú Ôõ¾Õ¯Hýô³²PŸ!âûR\Éñ´Øw0Õw>«¹Ú9°§y(/íñR=Ì4#Ÿ´H¢‹xÑ',ò‡í*5á#7$uó6ÍȧmJ¼®…m¢øœl—*­}UVÜ_š#㸇ÆË™—½²Òy~5³ýâVwê øE@µå|÷ŒŽ‹·"¾ëA0> 3¯±k½ç÷¥Þí¤#ùvd‘•N6Ë~Ê6UY³Ñ”Ї¤;ÔC´é3ÃåßäÅF± ßDÅÁ¢4@KÂåbì Ï·TL©â€¡w—¬>eÕÐhAö3½Yã² ƒ˜úé;~ªOz¨Òùû€yc&¨óZë(· Mã€"B^k«;b^€YCšÚ5wjKõ Ûq);rЬóew¯X­6z쀖=~7ìt¥'+=²è¹fãÄD³|ÌRZSè ±9ÔÖªjôȃ©,+[Ë׬ÈJ\ºa:4+š±ôÓj?díðvª]À8ž¦¿ìC™ß±»ÓqŸo²ö~5 B{„¬Ù=š™O[Rœ¿ŸòÊŒe“Nð{k|c .”d{v—o·ªB˜:d9Þ3`$äËãQÕ¢CåA½GlÁ¢þÒ { Iö-Å7×IœÒœX¤¼ÔÒÚññü?ÂË aˆ¢W!]Ñ I)MÔèÎ tA´1´±-÷÷Ï 51óy:ÿ]±-NûQ@žQÅîh­i5bPo”J´q7khYúÕ6N¥Æàøí> endobj 560 0 obj << /Dest [ 559 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 425 250 456 264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 561 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 562 0 obj << /Length 1831 /Filter /FlateDecode >> stream H‰¤WÝnÛ6¾÷SœÁ@m¶BRÿm m·bC³ ‹lKz!Ët¬Õ–2IŽÛÝ÷ö{Ç]ìúMÚ銢­OäwþÏ‹éèt:åÀ`º1ÿáà C›†Ô‡ òl?¤L×£Ó—eI©¾¡P&ÙèôõƒÛrDmJå7ÉhÒ.·£kòSlMÛ%·B>9ÇëíôûQ¤Nˆ  vä#‹Ú>­IÔ\%Wž_õÇ·N­ slŸÐfàêCV-ñ '“H™–pñz ¿ÿkM<ü] æÙI-J’å®¶iõ—(Vê‡ÄÙÜšDþV•`J}¥§¶?¦¯ð’`»ÝÚ–c3RJV!iñh¤´qIQ»¤yµT'}31HaÄ=ßv|N`‡!øÌv]@Ý 1ZŒ^L;c8 ?¡­Ñ›šJ‹ ”Ó?njíøÔÆÿ½)o (WJü´ZâAEzW•cØ”iv ¨üziM|; oàì‹ë—ÖÄE»½º˜^\ÃÇ·oÏaV(F¨êAÞ‰ š…%m˜o²¹:§û ©6ñ Öí»"‡J¼¯à®÷"«ÊÖÖf£ÒÄ((s»ø‘K)ó]aIqòÙJ¬Kägj5ÔúÎbÈ$’©P ùåü‹a–,ãzgœT¢^5ÛWé;gc ÆÈ9`®É—j•6ÕÊâJK%Av»úõZ$ùz-²¹˜Ûµ˜?n“?®M]ôŒk;N@ý³óuí€}t>òj}‘–ÛÜ ¥—q‘ä·õճ C³—õ^ê¶|~ RXñ±>Œt–&?ˆ-¤`®>UÖ‡Êì4iÐÚæx#óeŒî-!‰3XJ³†$®“ý^Àæª#[j±–Ž·á—RÀ à ‡p)ë#³Œ 5žd1—ä0‹4K«<ƒ¸Qt¢äñât²°^ÖÄË*NÄ2_ÍkÿŠºú%l—¢½P.óÍj3åfVÊb–M«Mõ©Nõ9ÇŸC§FSƒS+$¨»L:h,vÔ–^Þ8ÐP`ÆG]6¥˜Ã š³jrcIŸ6)eº¾ÃƪÃ<_­â_Ýf°Àu¾ÅˆTʃ>©}‘C¯… WV„'Äc³Vúr¡1W*Ï—Š‹÷xæ$Ê!žsš*›Ô¥¶.r§ß²Æ0¶§¾ åWä¬ÖÏ;—_a•  sžïÙ +¶¬¬ƒúzõüu¹‹½nˆ{sÎ5n?wÜêØeòÝîn=Ž­¡ Fe‘Qáò&Öhë3å(¬à”é­çO.»¼xùóOÎe9W…¼mG­8³[Yñà‡¢h°‡b` ”ˆ‘f•¸ÅJ«äˆÇ³qòl—Չ̬ÌÀÊÂŽUög ™k?ŸY’w’fJ f DÃw”5aRëù¼~̾òö˜ñÖadÖ`;žvjO»‘Û1ìÅg§ÊÙ»qŸ¹4Ø.¼å©Rã†}P‘³SS޹‘9ttX»-0û^‡½ÐßI;a½ «‹“¾ô€|„‹PIž-R¼æÄ·%v›]üA8òVöP.=ÜnöÜ>á÷TÒR§®¢í«äàÅÑY]Ïd¬±ë ¬ft !ÆðšÛ““¦vìPa¦›©t  ·t:¶¹;ž|Í´Ùëbª›iu 6²ÈhY o£UHU_C7£²‡4¨¹‡¶[k`b¾¹‡˜pC*õsïR‰47¿íúý£™Ä¦–‡×¥¸ðÆ,@ûnÒûx…w,yñS¼mÿõ'X;Õµÿÿïfzü@#6£Ê5zÀúíGàŽ›¼˜p}.9<ú¤îëÈ‘ÒK:ÌÀŠ=ñÑÝ×á¾™Rƒ(©÷ÉÝ×Á+º‘Yƒé™¹ÌGŠWýÇ•+‡r3©Ó+²žóX±âv(×ofTÆzƒšcݰýÜrGt /ª¶³Y)UÜ÷íÐÝ/Uý<¸?}·èËn¨LqªÄ{Aã˜ÝÀ(pH\äÅ`D¼!8¦žpÛ¶O¢k %@>0ŒÈyŽ›“-l/D¯ŽöFTLÕû<‰•Í zWä÷é|8œâÐvq†¥(Ÿîéú™ƒçÎ:eFUÜÔè¸Ño?wÜü`4áúA‰Súyƒ§æk«ÓÏ, b,vŠ× {V/OOëç@Ì6"vÄb‘y¬ÑaúòÆÿà ̓ŒÓV5æ».X`dtX»Í7Ï$:ìÈpÁpýüႹѡá·›ß|óÕ‚‡‡ †= ÆL7ZÐc´Ÿjvn)³ñb·ƒ2v`¤Ñ‚zÖˆHÛ‘æ†7–1Ó’xµªWÛ´ZÖ«<‡Ó‹´ 69‚~(:ÔìïÀp`eÉ®AsÅÖo>Œ6¼axp&1ÀGú<‹‡ á¿ÓHó2 endstream endobj 563 0 obj << /Type /Page /Parent 1708 0 R /Resources 565 0 R /Contents 566 0 R /Annots [ 564 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 564 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 309 301 334 315 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 565 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 566 0 obj << /Length 2738 /Filter /FlateDecode >> stream H‰´WÍrÛȾó)&ºì Já`Öë*{mo%‡MjM_"åA#»È" ÑJÞcß!ï˜C¾žü‘„ä=¤T%¦g¦ÿ»¿~¿^\­×¾ðÄú~áùÂÅ~Â4UnêÆ"YE*NÝ@¬«ÅÕM*òÆœqE“׋«Ÿ>{â¡Y¸ÊuéL¾XvËÃâZþ=s– 僦__Š Î?×]¬Ì +‘¸jƒKªØe&æß¼E«(æ§þãcwé»ÎÒ T,ÝTÜ>‹ÏÏu»ÁŽ/µƒ—dS4âÝO—âÿu–¾÷ E*’…ãÊ|s)>Šö_z_šG™ÕwÎr%Åïæ¿̨oTó]ãcý{F‚Ãá œ@y²!®šØâi°TXºÐ.·[óÒÇõÂ…XøQ¬‚ØA¢ÒTÄž CÃTìõâ~ñ~Ý#ðpÄZc0µK”ë_Éa¡uX¨ÜBi"ø³3jE*ñGVÍZÕõY§Xy“Bfñé±ÎÛb[7l‡s1Ñ¿ë¯(6X><æy½ãiIï~rÈIpJ*í»N„µÈöNŠyV–úN<ò~Q?@ 8†-øˆ¨³J_Š{¼´’[v“e¹=àïx®Ìœ{"ßVU¶4üø-½³L²‡Ë‚w[±å§DOv–>~*ÝjÞ°"u Kæ1p>¼ñRF¡ÐèF H!¹‚hY+6Ù“õ–xf•ãy:› `ÚÀ½!~}lZðÜ]íÚg±ƒŠ,$%ЈÏçm¥Çú$ർïÙïuû¸¯E&ž²ò®QéùõÄ“¿üÌÓbcöZ“ ÿÀNfÖ¬ÍÜÇ{ —ùê|3Êî?˜Âl½¤Ï·Ä†yÐ:ãŠhÔ}o&ò…¸³©ìŽc˜çìD‰Î £1fJ ©– C!%÷–ÆÒ5yI·Zу„*÷Nj ïê±l‹]Ùù&¦67­§ƒo\ã™o«*¦—[¼+%Ê †hóƒþ:-ÙJ)ϼdjQ÷Qi‡ÊI«yPeŠ ÙÍË̦zA%ÚÐÔŠ‰ ÒQ +#%µntóiM?)çFVS²ä»cåܾäÎ)× i”¬¸fYµLTòúUÕN4•%o¨§ž­§¢hL\ ¶~sL-ÒgªP ‚p$}<ßb'Ç:&6Rû& Ý–Úà8é;ý1©ú£šAZ‰µ1ª„„]„Àxã̦ ²¤¡•q¯¢®0i .y¦¬ðdWYÊÐiRŸvEªD»®/Ú–Ç ¡î¿”XoŠêBÓqÕCœ>‘RJ’&OcIÏ¡ª2©…h Äá$SÊv–WÓpÏõR˜æ°)òi†•¶kƒ¤š“WûÂzÂg ×iBP)²n뼸7…“pŠéáyØèZäNÂiJ\–© •œ/ðK-$¤¤wíóì±Üî¹8ýQY"%ŒÌ™(·yVŠ'‡6->Ë‚PÄ$.†ÞÀñR°•F‚ÆèJÇÀ ÝQ‹j{w¬h‡<Ž4a5¡µ½KqûØŠ»­¶ºÕÛVd|ƒÿ±"^É{Sé ²„²ìî5Þ%3Ñ|çÆQ¤U ­g9î=Û‘MðöóeWóÏ'O†A˜b·1˜šJV6î’õ|šã¨]d{†ú7ÃyxêfÚë{½×u®/ c$F°×¹6×ùÿC)Ù5û¾ñœÎ¡­x¶å›G s(£7,cD˜U;‹Z{cÊ#J2Ô,ù`ÁûÙRÛåøŒ?&{ì û¬™9L6MNð&¢ŽJrÎ4rqLR=2'û6ìøfnâ=”üÀ3•TÒÆÄIÔ?b¢üdÐè‹Ör\µnPh`VSUsQ…lB©‰cC…7àßm J¨Àº@† %ã%þr„ì)ÒÇpA&j}8ï²ÓÙqüŒÃG1P¼œÄ<(ûïìðSƦ,) só±aèT?|Ë$võÉëð™Çã>,ä›&ßÛñ’N}\/Ò@¹)Î&(:˜T˜Š¥ù¿×‹ûשQÜSC‰;¡Gnªüpöú+äol1X%OoŸ£w×ãP¥aG&®ÏÐ߯5kWPpb@=/D;‹åÖŒÙËÛ7ºþñûõ»ë#£F0|úïú”75pÃÛOTè2ïkyu…(v]ÙÉÀ_vy(Ë‹Û祉Hþê  ‘¨QçE¡ÏˆJP5ìD-êV?è= €âº×8}w3¥d7αPˆ(/˜ÆÇ3CŸÊEé|÷ï#Oyî(ˆÎ¨?CŸr |b‹4Vñ‰£Z`§Î5å3¯ò ¥sÓ°>20€—]=ோìB™h…¶ô‚ÛfÈçÅNð¤ušÌ~È–Þ÷S#Åé'i:K¤ ÁÄùqþòËTË7¥Ìœ¯ÿió:žš endstream endobj 567 0 obj << /Type /Page /Parent 1708 0 R /Resources 571 0 R /Contents 572 0 R /Annots [ 568 0 R 569 0 R 570 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 568 0 obj << /Dest [ 567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 144 289 166 303 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 569 0 obj << /Dest [ 1659 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 247 97 261 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 570 0 obj << /Dest [ 1659 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 151 283 165 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 571 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 572 0 obj << /Length 2134 /Filter /FlateDecode >> stream H‰¬WÍr㸮\õȰʄÉ]gªfv2Sµ‡T*ÃSì9Ð4,1‘)—H¬¤òûûŽ9¤»RMÈsȸj²îýóuóC¹X–eÌ$+2füÁÊså‘fY‘ G +ËŸ»œÕí‰XW·‹åç/’­ºE$¢÷Ô‹pXî7ü¯U&Bñ•Áߘ³D³àkùË¢ Ë"Qh°’äBGÖ)ˆI®RmUýÃÛ0Ž‚P&Bó(gwöåÐökxs€&Þ5{ÿùŠýý¿A˜Âód©HyD¼^_±/û¦ÿ—ÙmHI«ö> Î~¥ÿ ]Ÿ®GBÃCùÞ‚ý~/‚DHÞ¡UƒfA5˜°Œàvµ{µ&M.’5l§Z$Z²$yδJ1¸£ÊÙÎ,Êщ„-ѹ7Ž®ŽÐ#€²üÇbùINã%“XHôd–"‰íá¾\!¨‚ËWíÊÜۇͶ®6vùCõƒ]4ýÝ™þy×;+÷öá¹­ûfÛ{ºçM?\2O Q$Ë2 ¿Œ.vr½7¥©¥*Vj§ò4ÊE¬¼Çß¶)’$”`AMÏŠ!.sÞUP jð®u–sÕOS‡¤£b¼èÄ®G~nR"#À reÈÿƒIpbIÅB]04/>·A=™‹Ô¥ÿúõÝõrˆý»‰Ñ8ù%«ùpê2Îb= ©G>Zv;Ô×#âëßßüüñ}ùþf=’âR`æÅóqÑ,^•Ûy½é¬íjÛ»¸;„;ó`v¦­Ý›§jW=šÞì&i¤‘ˆ/øÙ'÷ÀÕ ÙÁ½7õÎ<š¶¿åMÛ›',¨nƒ)ŒL¡o¼|rŒ7ºxýû<:ZG"¿pßyñ|¹êD‹âUtúõÀv–»áµ °ãÆìþè^«vMu·1æjÊ|Ze€ìbÜ9¦œž@ÞLüTuÝÀÎÛÝù1‰FvŸ`M(4~¬¹kT`òa¬þT…ò§I,¡‰â9oÖxäóY“vC²Ïp ȱ±ú/æ‘ÏóIšC×ßÁ‚icW÷šõɇã6k¿|rjè(Cë›S­ìtÜ%qñ<Øï·“„í&‰š¦ñ±¥Ï¡óÈ=è ÅÑ€®ëwM»r³L³Z÷Û(ðôuw寢SZl_±bš`·¼€Ò#÷ ¤ñcžS˜N§…W™â‘ÏnÑÜ=÷\{zn6}Ø´sQìžïÀS.Ž.Œæ¥ßUõ”S)Ïzø+ïxäó˜Už M1·“0޼Žx0­ì vÛG‡~‚QØ¿ý}rÆ,¡gn<´^ƒ$»Ú˜vÕ¯au„íäÔtpT9öh¨}òù¤RÐ/‡Ž?%M•EgMûÕå=òyúQJŸ-IS¥Ø•/˜õȇã ^8¡†©‰><•,Ž“Èõ²«wÍS40… ãèèóW_~)~Ý8©ÿëÆsü ñ`;.ŽóÐë¯|±,Kå¾"ML‰$É3f³È:(ÉŽM¬GQã‡è ‡^œˆ8ÈEÆÙÇ Sþ Ã@þñfKò¶c”ã`2ž~¸ŽvTŽ-—š;š‘d&–{°øžµÏwÀÆ mnÅÙsÀg7øð¼aô€Jn3ÏJYeÏFÄÆ€Õ· †&fÅuÆ"ávO§cþ„x“>ˆÑTlÓÁJÚ¾$ˆÌÕtÇ O§¼ewæü ‘ôxÏÌ ÑæÀñMóO3¢¶&CrNÂa¨üH÷äx\î0­?Š{6TU'&©=—à¹ðxðä\¹†ï paÐvYx28 ÔGê–Ÿ\ˆHo¬ i$e¿³{\æ@^Abân—eîlSj…ø,(\a0?o¶wÕÆ¡ÂLäèznᡌ…æ¶éB:Ú>ÉŸH$…ÕOJ³c²dVÿ-ù Z1‡ —èð;<³•i]WA‘:`HhÏCùŸº\ÂD[Ù„[~UUߪfƒZà2‹AµÙZct($úUmb*$6 Žìc_ˆvAî}1†A©)Ó>«Ø¦±â^¸’ÂfRŠXöŠØ˜FÒ¦Q½…Y襷sGm¤N‚q¼£tw Á•’JKc„áI‘c>L9YÛa8¹¤¬µÂÆ/â'9.¾x²Òº©63Jíž“háÁm ±¦A1ªÕc  àT»UmÑ×.¶tå±`oïÂîÜâÆA ‹OÀÅDL@%ìÞíÄ,àø ¥üª½ÚlÛ1ŽÏ޵föbÞÊýÚX¥°õ0ÀóߪMs/ ¡ W%†À°J¼tãcöH!˜ê{°ùŽÝò•-쪽gä°£ù T4ø°»'thSßbì ßÓ†bègÃc1%ç4G IA5g'Ü \‡Øì>ÑŽ3µ«¿™ È–µy»SÉ\ŽƒèÉ ¡”ë¦cs.z <ÆRçÌŽ ‚“5ý üëRÕqJß~˜Ÿ 8ޏ…^´”†äz§É¥´ƒ¿l{c•ô#ç?VíÍ5yŒ¯t|ÜbCÒÜ`Q@ "Õä–š·"L6 É)€K±×æ'½6çŽÚw[âÐGãŸè‘ uX•õ¼5éÌ —´6~Å Úµ±Í]SA´5÷¢Ær‹h6åóc$së’ëø‡SNÞ~Çúj… ÀTÂhHº‚+I äÒo‘¶=är`¨;X‘§„HöºŽ‰3 ¸`vZùHø7Ä£@0»È¾¬ À+cÝÁlû¿âñ endstream endobj 573 0 obj << /Type /Page /Parent 1708 0 R /Resources 574 0 R /Contents 575 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 574 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 575 0 obj << /Length 5170 /Filter /FlateDecode >> stream H‰ìWËŽÛÈÝë+jYZ4‹Ï¢,†(O qÛ·u³‡¦ìëyÖtŒ ÔÓ V _WQ1¯¢eW©›¾ZU­øàͱ ¼öæ!’sónAU‘ËŸ=JƬ~Û#a™Ÿ!›ø"“7)«üS{sBy×Üy.(W¶‘Ø\ÍÝî8·Ï—»?´Ø2'6U³ò2Ôe¿»‡a‹ÊN—ûñh2Å ñ<‘*+Be¡ùOWžŽ ¿1DJu@å1mÛCå@ÜÚœæ˜FW›Šª‘¼ÆH•:.‡GɄלlGzT39â#Zá¿GñÄp¥—0T¾úï2d.œÜÚ<ìW|Pºº!3µÂ NȦ_‹ XE­(:Ã6Ø~³kæ¦îÅ®΀åλbtÁÉŠô…ä0f\‡£¦`)lÈ”Õàs,)M8mPCÖ¯Þ®)ó”l&“ƒH~Sõ o?Œæ97ø å@¤´æ•Žc"Y½ phý_­ ”3€,‹¨ÀÖXxs£Xó©0Âúè•ÓHúº!úÇE2»¤’jª’†¤ù…–HX“.(Q"ÉòœMÅràï¡’¬lµÛšeã¡O pÏV{‡\o¤FÎk§ X‰5vF¡àá¯`RHÏi“v•fCm‡–[»Þpyë¥T [r÷+–»¿þåúÓëW·$ƒ$:ø^ħŸ»é.µñX‰Y ÔHÛXä¹1(( &Ũ*s³ÙÌ7lrùhýÿ´Pþˆª‡n Û¥Øw0'ö£î9ÖÀ®ÇµE ûmm‡g?F#OÅŠ‚?²Õ6µê£/0ˆGGð£|Ö³Ô@Ÿ,`Qa}þøÑËPÔzS}gÔèí¥$¨±Ø Rk®ÆIÐHV¤Ö6|àÔ1‡ýÞ~Û–ük?ëI,í; ¿þü±üïáÑüz˜6L,í†teà‡À@kiŽØÍ¯Ÿ¸N~¡Ç¯H|"ùe^4†ô ½¹&;ÿÆ#_{g§0ã³11œ£,·»x'Zw¼.sŘÃÙRCWlàò–â+ÖŽ>*$YýªCJåɱ+l·výuщ]³y2^ª@I$F'b7?–=õ#®ê·•‰©–”J*$‰gÅõŠéU<ÀˆùÙWöñüžF™ šiI,YÚìŸøáÞ¾ìDw(ùrM ˆ“œKâe¶û _رãÈå Ñá(ÒŽ à@te3 a:*ÌÄé‹¶ÞTärp_:tcãAšNTCåÖp7öžiœ›­@\´¨ìøÐ¹Àj&Ï5¥CÑí‹® ›Ûn‘Ñݤ¦§N°íáþ–¢j–èËúФWs©er¿Þ5VþiÝ{Ó~@îFÚÐ:§Ç^œX‚Á¶,T”[%z¬û5 Š(6œ¥„W å¾h‹Þ˜Ò¥y¼ç£PÒ‘#ÓS”=ùí¾oé#!&µÆYm¨)¼'¾Å6ë/·‰ùÑ æ§An ³VéÛ‚æ_FÕvß? Z¯3®ßÅË=üwißÜyg&åR7:딆ñi7ùÖ°R,oÞÜqäÒT«RΡ^y ì)@éeÆÇÿL䩈A”©ÉÅÖì8JF~Jâz53>0Csåçád艣JŒ£’WκÓLÖ#4#ÓIìªû¢'þLL€*h›Ia ›4 þTÎR–3Äà°ºD5Ôñ,cHtA~G!¦ ¥QEÞ_‚thc×,Þy/Q)³ Д¶m,×?Ü*îÓUV'ÏË5I€Šì˜3D4¹†‹ÂIå`Ü%Á¯L£:m%OÞ¥^Ñ z¨[rH^/l›K{Srì IPê?ÑOÙT)ë?ß¼º½}ÿîæšG½µµl˜,¼jTfø©žGŸÅÓæfðŽAädª­šå•Øöö±î*v4ÄS”¡5 ÙﺺηÀoÕ0?Ú£8-âøûçª-8õø,ÐTp“éÔ`FŸ‘J!Ä’öq_­ê¦A™Áë©pŒÜ`DS?Õ#ª£çjÂ蟨,‘¿·9êC‰ÞM•Ç÷-·ˆ5÷½Í3ä®5Î *.ÒÆ\:&RSrWçì(={Z˹«eCðlO‰‘²çâ ãÐ.ΩÎêöGVkUvaG£,(U éËéøW+sr*:ûh?.Á/Eé9XÏŠÀ˜¯–·$|ß_Aø!±#AÝ|ÈÁëÆfÖ†í`8>P#JâF¢‘ÊØÿ~¿ªê&›™89íeF|WwÕ÷zN¢Íž{WjªÌÒ°“âk؃†WRGÊhâºxøõÑœÝ`Rß\Ø‚Þc(Ä"õåª9SÑkCsNî…6°*Й…˜DA Yz*S߬ ˆ ¡ËzZaÙ$Zó vÇ*’„Žk¶5¨Q/Ah3“áÍ]¸™@ZEîÍ\ ¿.áËK€LfB9gãÅ=£ñ“ 9ìv J‡@Æ“ "†1±~2$éôÒ{/YjOô”BÁó3´™uqÏ »–6"Π¡xLã²3¼JÍÝ Õñ½êø~Âôu#¤õÇ4««þh>íi>uhîÊŸPý”äcÒÕ¡mï¼èJ̳QɸëH)äM>üô‘óÉÆe$ò>m >|€hM!rÄEå\µ´G¦”dðlÁ¼Š³~˜¢,y±Ðìc7B&JHÜìÌŒ2ð-—ì)v¤¹®Ñ6þ²¤¹Þƒ}âyƒõGP«®OÚL¡÷¸¯àèÈ9ÓzI>‘bù¿œC²å#)c¡á/Â>ç¹â&Óg‡v4XáÒ噿Î*f|ÌoŒ¸?=µßè†ûͰ䴹/„šVîOM;i@2À’r¥îáÚ}LÄt%S‹<.ìOþ6†Œ=ÐŽg¢Ú—“#x5Þà@‡Ë±jf¡#¿òJ?d”k| BZæ¿ùÂOöï@Ë#ÿíûûW¢˜Ì’Ü*¯(žÈ@X,çíŠÎ)¿%žÎ“a¼Ô½°ùõõØEJñ(1LF6÷˜È ‰€Òb :[Dž=U„Ó« ù}ò »ªmFž)¤9Ÿ­Gw¢ÔuîÓ-O ágeÉiÖ-¥Ôdî¥.‚¶ÕáP^†Ûæát{èÁÐ:¸01îûÜ7Ïüûd(é–ˆ…h¯ ȵ’K¬Ø“Õ|×.x¢›Q?ÑÝ»OÿtÆþ ê2X§ÙçBþ÷TPì¿xñù³X®).³úÊ˜Ž—ž(±&$ ˜k4¶¼¼›×c€€Û©¥¢¯µe9}æÛË‡ŠÆKÞP0q¯ª§¬¬³Éx»èÆÈ£Î Ø`[13®"2䣔ŠâC¨æ†(RsXÈ€Á:ȹo)uõ·Û 힯ÌpV˜8œ5ÄÁ.ˆ8„hßá)ÞÊó±‹ñjªNûW|6Ás©k9W2›°1ƒ¥9ÉÉ-‹³·ÁýRsÎËHÍï–k$;Ñ9٧͉³¼¤£Ïï—¯˜ëË s´J/u>2laÔ·éÍöi!qÌö1ñS+W™, “ÜÀ°‚ó¤ÞÔå®h«ßËÛ€BÏÝé*‹hÏ×Ö³÷Êmëý÷*G-¸¸ÚVå¦7ˆ|¾ôªþ‰KµÛÏ<²ôÞL-Øl`Ó9ºŒkæê©ußüia…®pÈ*·¦-fX)Õç•ÇsûõÖ«OÞ¹Ølˆ+Q‚¤¬ÁzS¬wº¼+ÍIß°”¬²Ì]Qî{Wqr„"[®Î»Öã ͹@–kO4¦q7hÄëC>Zu07ðXüZrÿ/es=̹ × D#€R«'"SMZKß 1lR€f¡IªÊKãNõn9SHê왣Lo Ï»ß~6d‹Ú[K -éÓL¶Ü\9j‰Öp;~ó÷V+ú½e tâɹ±í…ð<¦xÄ+WSs )™mŽJ–Ø”Á˜Nƒåºôšýé±¾%Æ­¤‚Øé£¸:b·Ð‹T!£±èÆG®ó[¼m÷ñÿwjÃg›¥÷ŸªÝ˸Hš±k—]¶>Ék¤sLNôòöI½ìkeË2fÄÛxÅ1ôRn‰„a¾ë¯¼ã…w³¸aÞ†·X£»+t¬rWðhû‚N³ -ôÂêËö¼+,Ì¥ÊVË8q´áÝáZŽœ·…®&Ïu(ÉWL%˜¦ïºg‡ØÝÙ¨ÜÉ…H•#“¨a.ç¿¥â?}f„L¼¡ÂŽ:-Oº]6TûÒ#ÊPB1ðW9¬{.7R\ÊcY·æÌ‰H'â+˜l55Q˜êÄÆÐ~gDÙÔ¿´Á‚°ÒL£ìÀZD]Ílýâr)¾BsšÆé]Èà‚-†¸UýÜ*3·E[Ö )³aoDÜÄ?%ɳ¿‹1q·¼h!]^ºþGûEÂím]è·ñãH–yê:„ÌÙÌíA‚×·@O<(…Z‘”.Ó¢eq#áë;•6ÚRÕmIQˆ£ô±Ë{÷Šè5ñßQ(ÿ-!ñïèrdÿÝÓ-‘oî|Cÿ¾ïÌå×B®À âIá›[b¸èé\§c<Ñ GºKgJ¹óA›NeDƒ”¿Uw ª$矂ÚÎijh ëæ8‘®âéG®ì*cÉoó¸ÖïfChŒÖdsïq‹­ÑùÇr\E¦$~{ áÙR¢‘̽Ì5¨å±¨#ÛÑÍáQÏÖ“uîý%xé½+¨Á±iÊf*»Ëh0Ôjؽ…tor,$Tú‡…±Â`$G`=RAù¬[×óp°ÆM…q+ ÀÞû^ëLk·A¾ÙÀBâZ½ñ!šÜDølSš#ãò.ÕY$¹8";ÔíÔj€aÇ>Fýš}zhl÷RÀ¶bu£$î7XKÞÚzxÒàd쑳^ƒMΨöd­µLþί"¤Ûx»¢û‡@Ú$Ù:„,P² ›¥CUïÌcj5+»€BɃÕì×wì[½ûWÿº»»õ&`¢aÏt?z šI§‡ÃÇg'JhÚ/OQǟİNÉ©Ì<¬¬(Å*rAL¥Eͳ_ˆh'Ã×9²ÜÁ‡è•<êBO-‘ž¬©ï íw–ö@¾Gš‚hù„˜‰!JÅÕÓµ%礻0.sÕO္VÌ\þiëÙ!P½Ã ÿFÕ§á ÁÈøý¹vˆgÈ;!šGû‡±«ÐË•û¤ô;äÿv=µUMÚ™Ô5e»ØY“ˆñsË‘X!æ_Œùj‹D+êùÛµ²?7¿Æ!ß}üÛÿ…„÷6 endstream endobj 576 0 obj << /Type /Page /Parent 1708 0 R /Resources 578 0 R /Contents 579 0 R /Annots [ 577 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 577 0 obj << /A << /URI (http://www.pcre.org/)/S /URI >> /Type /Annot /Subtype /Link /Rect [ 287 631 393 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 578 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 579 0 obj << /Length 4641 /Filter /FlateDecode >> stream H‰¬WÛnÛH}÷W4öaÐ$šÍ;ÈC&ñz3È­‚µƒ€¦ZgiRKRQ<²ÿ°ÿ¸{ªº)R—›`'‹l’Õu9Uçô/‹‹ËÅÂJ,VÊþá'LS×K½X$Y䯩ˆÅÓÅå«.EÇïx¢+ê‹Ëë[%» ÏõwæÊGM¿¾A*œ‹_/2¶‰Äs³»©{f6à³-ºŠbcêß>Vç¾çÌUàÆÒKÅó¸}®û5V|©X’]Ù‰—×3ñ÷ÿ8ó÷-žEn$KÇ“Åz&nweÿ§n+6ȼ^:óLŠñ_vŒÃçÐ|Ïq³x5ö`·Û¹Nà*ÙÑ®š¶…iléâÒCt…]Z³¥«Å…¥¸ð£Ø b%‚ÄMS+7 b SÑê‹ÕÅ/‹}2…W¼ÃlŒ©ö(#ðrñ,´ ]/Ä ¡i"ÌíÔ$ŠÜÄŸdÏlV=ßÄ»øÄwRx-nôã¶Ê[qõ…ï7­îăx˦«m]ðz»Î$ëpö›ûÈAÛÒŽò]ÓkѯóÑ›íôÚ‰÷è¶›MÓöâ)uÓ‹-ŠæiSVz)ʺoD^Uâ³n;v¡YÁ6ÐTyJ'æÊU—âLFL&&d¼_üöVèú±¬õL8Ê#©V; ʸB‘#Ù´šÍ¯šªjveýÈ0ÁOüË?çeådn" êò¡Òî$rÄ'G ¢£}îä‚àË}ÕF7É,æl‘PòMÞ÷º­má훾„æM¶®ü¡²ÊVVt} ¯Mÿ!{‚!ÂQ’¹)¹˜÷/r™ù‰ ÕÞ ¸H֨𠬙üÛ…¿Ðo&/Ñ0×â¿Ë¦±‹Ø;ýø4vc´-­Øï[ 7‚>TP|%Ç=Z{a}ÝÒ^‘œsñU?¬ýé<:ÂÕ½ªPê¦Æÿ­xÚV}¹©p½1ñßËrö4ëf_f¿ðÔË{Ç/+*JÞ—ŸuõlaD˜Ö_øºÈëŒ5O{(ê6º(W%`¾,[]ôÕ3Á´Z7¸@”[J—’½Xêª|*±w7y'ªÈÄo‰'î–]Ÿ£‰èc‘‹Ë<{Äxþñ,x_é¼Óˆa¥[f{Ôµnó v #̸É']÷yÏé{h¶c“Ãcn;.zF5øVMû„oP0BÇþÓu³£ÎåIy½kZ‡Êÿ s¹×á@²¼À%6:‡hÀü ðææÎ þ];"ýc¶œ9MÄšM؉"¶æ YÃpš|ƒ™J7‚Ç~ë„ûKóêIɸNÙÌ–Ì¡FxEýÊ›+±[—å¼ 0b¹6ö0hPÃ-Žzh}£é†©ª)¼ƒö£ùˆ ‰–&cIMÙºï7?_:JÉK¢ÇMAÆN ÒHº¹{4Cár E?…O¡q€A å…¸%NŒ÷”8òI!k$Dâ¶üV$‡¸ÑQQ‘s?vÁ¶#˜h35Ó“3Æãp61¹Š¯(0JÌ#úà†FN ¯(ű¼¶¿h5–Ÿ(ÍJþõ †9~ß½¾Gyç”pž½&Jà&^êS<¾Ÿº!‘|ìQôSvö'‰íh£DnþÀ8ípJü°‰ÏšH‡8èŠìÌ PcÂãá}Æ­Àc™wƦ•bÆÜ†¹b²CZ 1z„ÊÍü³–Â}–CKRw3†  –T"‹»ö¼‹YB²èÐð‰‡]Ì¥í‹*˜K ®¹BŸœÔ§AÓÇ{çq‘:l‚ ±ã3‹-·ü,:裕¨Oû“–(¨ùS&VÌP¨ ôºybJ_b—:£¯Lðs?r¡è&€²›*•ÚM›¢Ø¶hqP.ÿ¥ "亃­¸ùN4Ì‘ÚÌ q¬4uÜüðÀN ”ÝüžÑ2a7š x`ì97rÃzîü´3s<ñU¥'ð ’M$éèxîÓÈ:Еq †Ð4Ê8äRôþùðü½þ?’èwú Ò#™bròÓ>£û*AÐ Œ ›cÊ¿ZÆÈ•;‡ðñÈg•‚‰Â##F’]0ÀÊ·ç§ñHv”"m‹å̰-cÚ˜n(""Ÿåo(Ͳy«7cÅŒ¨Æ¼uJ#˜ɤý³à9è÷ð”:< >9”õÉ>Áÿ—«Æ ¿Ÿ«öü¦‡ƒÕŠcüKLÄÇþü/Œæ E†¤íŪlé ¡˜ 2Ãa /ÝÒD¼1¼ÁÏhÂ=æ1×z`!j…Àš¥ììK–Z()þqo¸žu똬ø, nêצÁ´ÙØ…šB·½\.ù¼ªœL>Ïè3V^'‰óϩ҉G¤ ÍuLb“ô©Ã¢tF(':£ÍŸÅú.–eU‰¢1‡°XæB¼Aaèz |ÐÐDôÍ èË–‚4½Nž-í„!Â,{=ŠÖ ]i:óÍ¿IG<Ø äRlìBkMàŒêdF»òO²¸}Ø [0…O7ì¾ÖFÞ¤lß×®‡JÀ÷Ô^`šfÙ>túŸ[Ä#¨~¡¬¨! ±sÅ›•Ⱥzn2ÅÀÛä]‡`0NëíCCýx½­£ƒ&`å½øœ·eþPiûqÚC†Gb>N©å²Üð­ùKã2’5œ×%‹¶ÈLS„KÚ’¥#Ú߸ºÜs5‹Iû5q/I ÏT 1þ¡™:tÊ G¨{rÙucÇz·ÑE¹z68ê{:‚¥Ñ¸÷ŽhX‚Ž£Î;Ò¸{=hAÀ,˜æi¬è»!4'’A™Xˆž6=8¸}/¨Q0m*8Ì!:”¼Ò9kj=„ “,Ù½ZÒQ-²I+ˆä§bQÜPP¾¼"zˆäµýý@«‘üΕ·ïßR ù?rqO¢/¢Ó#žgÁYxF„ —Øû!ãðà5‘á ÚÚ*ª} µèíâX,z7gÝRGn‘z°Ro"ê›7ØâRúd÷ØWrP…SQ>µËOçµãW“69éØiÛjÙ0ŒÞ>,²EWÜEw3ñ_Ö«m·m#ˆ¾÷+y YØ„x'ô¡q„¢@ì±Ò6­ƒ‚–h›€$ iÃýúž™Ù]ñ– )òbqÍåÎì\Î9s[×çV Bm¨À?ÙCÙÉt4–Š1*˜-úw}"ù yhŸ—ì.E.Ò<|':  @æŠØuçóT5¦=]€‹óبÆëÃü4/\@}ß[„EVõ¡³jK°NÒ#°Â«"$‰(ýå–K!Ò¬Â;U±'t=}TËWŒ¿ZâîyÎ2gŒµHû¯E5C}:ln|§¤7¹úü#°rŽÔ€5†|’kT3š+PBâ<¸4½•L «ð˜gÍ…Ìš•¼Ó[üò¤ž˜v(Ók¡az¹üA›†8¦ä¿ÊX"BÍZ³ò—c%ï’õ~€Ø!ýÈy~d&T!?Q%Væ)XNܽ…"þOAù¡­îU.‰;®…ix¼$í»ž÷“Î)Ï)4gäœÒð¼äàoÍÛÉIœiUóþÉ© ŠAdÓ̲U7ÕsÜ:£h¤Ð&½u]ž) gÜ­òTéN ‚©Iå“ d™á•žjŸjÝ*ŒÑ9a4œ¡ Q&àµ>²Nž:—Déz]ÊR›‘–¬A¤PšÐÍ·å¨Ë 5\¤o¶¥aV~Z ìަ‘½áeßt}þ´:Á7ÔR·v´¡©„a·×ÔÑws}ß„,–±¡ºßÓ=[XVEø^Ä-1Ê Ÿ™ ‚Ó¸¡*—Šéù°üeùÇß–ï9„oEæÿì’» «7ŽKÕ8ùtVED€:šFÂf’߬"À‹q0{„¹NnÆ"i"*àF%Iÿ‚_a@ZoîÐ><‰DsÏS 9=Á ¿æo–Y·¾QÜD‹ŒèsxæÂ̲‡­nÑbÍ…1r(JÙœCA` ‚“~-Tw1Y–¢ïõo#l?뤤$O`'L0çh'ÉÌ€†[GFhN¸Å®ÏM9ôÚsÑ]ýÓÄk7~X¯™IÄå\»œ‰Ëù¼ËzAr56Ò×øˆp …8eAêâ]6E!}þLMy3ìxb­§2Bƒ1yjôÍ™FØûÀ9l‘ԣю„—ÓÙÄðÄÈo*Ss[+k#J8£vVíÐÕ' ê ú‰5º,\3›²í46ð¢I!ì ¸P‘M†MÜÚ"Šöõó~}ù ·y,êš« jÕÜñ/ÔU´…°IË$Å'oÌ¿¨·]@¡öÊG{¨1ý¶<:–âÍ®ºhI÷’$½#@ž“†ÝnŸYÖÂ;ÁB€ðÑS4*Ô©7¯9`*7ˆ•ªôê¹îÔ¾,7J[£ÂÓm9‘¸º±6f‡þ¹:°°vÌOˆb*+ñ“Qž}ÎsÎy~󚼎œ+ò7sÞÑ…}‡sŸHî£iîs/ögh*64õJòJùoôxü´Åm1˜!^šDŠ‚<ÈI§žß^x6ç­Z£ Ñ)þò­i—Å‘ž†" Ä)¨žŠ×”Á }]tGÛ’q¡7I¶G‚(‰£ßÓøX¬× z-/åïÅ)—UíÒÊ_µR:ë¢ÁejU<ÖÕFÊæ®nvGmÊû¦€ýŠî‚Ihÿ•{k>õÃ,·ÝËcƒ¾gÛÉrÏ·’;™†æƒÝ§wCN)6^Ë­žõŽõ%ðV6˜§ö¤G)ÄRVTtˆì{îÇžÆFÞ½ÔNI¤^4,€ÃœÏrÿmjÒýDöÊÍɈc[š#ËGÉaâtá@¡dõP7Ò$íºkÕ]Mz–e-Å^¬~ˆ• Ж/hSŠ^#l¹úm)¸…™8«Õ»?e©ß. ¨\Q} ( Æœ½W׈†ó©÷¼Òß\¾Õƒ­¼Æ@à­ÚdZ5BˆÉ„aÕa@6Âh1d`‹ôi®ç¥MͰùP> endobj 581 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 327 654 357 668 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 582 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 583 0 obj << /Length 4394 /Filter /FlateDecode >> stream H‰œWÛrÛÈ}çWLíËR"ŒëpÊ^[µQâ[EÜJ9Q “‹­(’È?æ!§»g@ˆ¢m*e—ˆÛÌôtŸ>çÌ/³É‹Ù,R¡š-'a¤üÃO’ç~FeEê›<ˆÕl3yñ¦ËÕ¼ãoÕ͛ɋ_¯Cu×M?è›ùdê.ï'ÓŸJoû‰¾«è7Ò*.”÷÷Ù'ÏP¨,ð ƒUâÜ7,ÂD<]¥F¦úO„§Ó(ð¦aìäêöA]?4ý O"]y˜Iwu§^ÿz¡þú_ošâ~‡w©ŸêÚ ô|u¡®ïëþ_Õn͓ĺlÞ´Ðêßü—ãíóÖ¢À7¸™½Å3ŽàþþÞ÷b?Ô­ZѲ˜Kú¸ °»¹}´â™.g“PÕj¥ÆM¨âÌÏseB?Iö˜äjWM–“_fC2⟳qHu@A”³PÁòスLf&À:£T♤’ªÉ¹~wyùéýõ®›¾º«vjS¯×5r€”tÕ¼mÝ÷’71‚F⇅ÍÍÙY³"—YUç%HùÞêÈßlQ•TW˜oÒ¦æûÝ®jz\ïªr¡–íŽßÕ_«F5ûÍ-j—Ó”ƒ@`I¦¦¡ÆÃò©,š"•å;/E $z¾ô)\«×s¬X>¨EµE ^Hɪmxéíºì—-í?һͅjÚ^•"ëµ}½ÛØATl;ÁÞ£²o·í®÷¦XŠc"šýîÐóɸ=vU×®÷}8( 2󺪶usw¡º–¢HV16Òïùް‹¸T_o*,x·êÕ¢^.«¯\Å,6¦‰ŸE”¶¬ ´q ¡ ! %š¥ëËÍV½}=»üøáõM¦?{4XߌÞóä ·ØÏ‚<"ÌEiNXè€ûh ºHêC‹è¾#Ì™Ì7ÉÑ(A÷gámAøq*˜“ æ.üÀ‚î%š¨ßïî@ªëÔ|\Õ¥ LÑ£À|™ê]OÈri í"%È5úã Ç‘¤Éýü¡Ã>`¥ËÎ3Hš*PéÒ˃¾šz´tÛ¬Ô×r½÷ÂŬԾ_Õ¸/ákª¨`=ŠhÏöh»ëà¤Hd½y‹ê¶Œu®”êÐrÝ–=¤µë­ð:xÐùŒñ³-wýç«?´÷Õ×jwA±—™£µ|ø¨ïÂĆç–LhO•ZñæCÚ¼\l=à]PSÃ%º\«%ò¾|{g?‹Føé)ï`æå¯}¿cú°7M_#FU÷vJyÙn°6o™'î=š›¿PÈó|¥jàÞ.¼°£[TæPÕ?§£]]½Mn މ×feÑÐLb‹u³¨ä^ à±.lª”U[~Ò©ŠHëÕºbº¸f&ù˜tè í]·2Bâµ.è[‚õO¥—Oû¾¥9úN•¦îRÓ|­d—’€š æÙ´‹êT.¾¾)×R<ÐfiÖ}µ‘ñѼ+c¥ð%”žÀô}â \aú1‘¼n<’슥£“¥<Û"/jvõDÅ÷ï>ßh\än¸éyÄÿôÌÈÈÓ–ùq„3±!ñ=—ÂŒèéxÔyæD t"0¦0"0 —+m;”Hÿ[Ä•ÇÏ$®02o—Wܹ‰æî°aΊœ5°Ux0_Ø*2GÒ\l`!k°&Ú]‰Âc~,Ù.QðÌjÙ¾©{ûüÔâ$š9éÜ¢!©û1¼ôƒÒ†v—Îé\Q~c´Û4Ôo_ãF[Õ3¤yéŠgmÕ‡Õ:.)4&:u\ŠÁ3Ø\þ~¬xFwª§¢" <£¹Tá§ê§pɆ©Ï‡Kz ’t¨¥!4V ÆÈÓÊD±_dG¥6”» gO ìÝÈo~-ò=»¢ßBü@µ¡½ôtDêF}Ïž°ÑHóàyö$ ŽF=¯XÃÞ^>)–ík L„{Ã4ºUÖ¬tY=J.<+C_½Å•|ËF‘F[[FG2å`å™3ņ•0§¤Òb"'ÿÁtcoH»"§]9i#‹ <-±?KTÌ[‰BtüeI# Œ$$„„ð y½ñ¦â.{_ͰøŠË[9•>Dös§¨AeP#3À10¬ v¹>©râ¦î’h0àlßo+UÂÏ{ìåV<ÿÙè˜IH|šH¢œLj9,P~Û!÷JðÚÂÄ3ø„è¶I•zÖ3‚ê§WÄ7XlgâLåÉøæ½ »¤¨‰—¼èôl'ŸeÂRi>CÔr#,5õ#àcÒt„uª]*gÀXïšG€G°e'ü €o[”œq†·ÀǪÊP»o,Ècß„‡ÂK¹‡cL`Ï1û®Zî×T<©j?‘*˜ëC º-ç_o-=¤×lCcê>ù _•=6³…ÅÆA•¶dÆÛOEg gË[qHb­pØ“tÀiÓñN ÖÛ*çqQ:׊…mEjÀ„0q XZËl=ñ :V$Öõ’š>5tDš‰ëE Y‰C?å™¶^¹n¦'/?4žõÃhÞÆu,oë¨=*£¶ýøÀ¨ ¯\ ¤¹#Û‚OðqFó=ÕÊ‘êS®i£¿¥-ßÕý¤Àñ ½‘˜â9ºŸQ#=už” >-Èœî c³žXÕ§³6ú‘ì›çÊ~xýpdá)“Uý£ÂdäWS´Ø¬¸95ÛÉ‘²5û ±@¨//ÿD½Y°[#yø,?Dˆx:˜Ãæ!ù6%Æ9ú”J‘äÏð ì}~4ê J¤$èq,¶ýÞ©]Ȳ†¹GéUU}YÐ!ÏèrȤªè÷ÂG“lí SIo×?„‰ž€G ǰXàå`ŒWݾ¡pèÐpÁOÜY)Jøð)ÂW›–Æ+ß÷™Ì+{ C‰Á[d7¤;_Îg™þÔ†VÕBéšDT¿!˜ÀÀxþðöøA礚% s)ÍY|JßRl{”ŸÍIä§æhÔyL»m9®u¦²ÃYŠù¡#» Œºè ‚;ˆ×–mg J]ÔÍÑêlÀÝ<œgc òd€N‡t. Ñ’ …_GºÇj‘•Ç ªnP•/Ôä\žNmÚ®Çnä¶qdHG–)Å ¦+ògn&HRævS;·îãÕ°’»Š¢·UOö±Ë€ØTOF£3˜³b!j\øòÔÙ`ˆ’Ž›ž£Cëû«wï®®/ß|ü@2šé·à øñƒfQvÀ§ñjR¬äÅYîÇѹxÍJÉãQç_0œAŠøÂ%6žM¯‚ºr†]z”Rµw ½Ñ‚fúN«­3ÏyÑXø ؘ6Å~£Õm%ŒlA€sR¥\¯j9LÌí-¸a–ɆàAoFH¦ÛÆ]Hüv–%›ù§[ üâÿmÎàМ5™¹Øá‚#ÝŽ¡}@t?`Yü` ¤rÈÉ·ÕR+ûŒnŒµ\KÈn¾çë,±ipD쳫÷—¿}¸š¡jñC ›Zy{²¢Dx8?åɨìÙc³4zÔh¤øxèY-áIaYï%3 ©99…ënh†%µ‰=³¨}Só$t|t£í€ÇÒõúah—ÿÑ^;n"Qð¾_Á$EÆiÑN¤´ÊJç°šäÀ0LÌÆ–ÁÉÌßoÕ{ ´Á#e{{pwÓݯª^+j ƒ¯« 5’eÈb×Ä›q/÷çÞ+‹F|:üúà+ Õ±R¾ÁïEÿˆ—bø±¸¯u_Wú.vk*ÿÀR<:NMkT:³ÌLîͳÃEº§îX•õc ?3^ [› ŽD„®¦³›·xÀ¤öäuçûþTHÜxr`Æ*,*¼t¹ƒE3YnÌ|«©öáeÍÞ–!×";óVÑż­S,5ã|@]>íÄéÙ1Jd‚˜ŠûÂíÈ@õ¥µKëø³ôCŠPç¾rDÞ¬ÏÛ'©”.ö¿ò$ÝàÌï(;þä‘Á¡ÅÆÿ]ɳUòdBŠ=“à9­—S¾jß7èHýk¹öݶNK™¾š"X:›÷s~@n8´/åŒí”ÃÒ:úϸ×ñ“8!Ffê÷K‡¥Ý:Í?_ž`ÚìÚîøê^ME|Ë6œY´Ü)fÛ^Î}Y«Ŧ‰ZÛaëóúf!Ϊ\t#¹ó¿|áU‚Ëø#kÂÌaØ`åL–^¤›]À|º÷)†f‡^;‚èRã›~—Š­Eµcªçâ©n*ûŸÐ}ÎqŒN\9Iæâ›`ê) ööÞb÷[W¶zÔ é\¾ Øs4BÆuWE3Ù Yú‡íäqHŸhå&¥ÇØ`Õ ##’SÒ†ÏV+pôj^£Þ ¨ Ç“ðXÿozt{>â=,cãNTßñ‹ÒÇWáØA fåíÛÈlÍ‹¨m`/¼¿eLÑðûšË—æUo†l’çz”ݾî¼Ç³¼¤Âztõ×MGjÕ ÂLò‘+ä‹"¸éâ$Ûì<Ù·<¿6*Z‡XÛºÝ}ܽýKUu·hØ.MšYåàÒ·4¹ÿîí÷½8œér_lOŽËœºPl»øfŸÒʵz¥eÙžáNMD1Ú¯5†¿1Ù¢ *ÅZ¤vc#ãp>óÞjݶ¨ ÇÆÁ_ü,Õ³/½zíñxíÖ‡ÂøÁóÑûU‡ùê‚èˆ:Ùtw.÷+q‰ÿœ»žOõ5XtêéïnŸê‡¦þºw S5\&Uȃ’iWïyÉ„B4.É\Åo6ùÚ{¯VE‚ÞVy=ŸLzÒ‡op/\-š®!ƒŽ,¼X"N.Çö8—·®•ÏÇÍK[žv©yê¼Îlœ×U´.´Œ‹™Ä‘hÍ¡q=´«%Ò©e&á6ê“ XaáFb .6ìÅÜD¨L>Ï“–“& íÉ$ ü¨»jå\5¹)ÕL ÛbÊ]òtÖøxaà¤4Sš#$ö„­¿óžˆ%ÀÈï÷89†Ñä:DÌ Ifõ¶+Îÿ±¯Ë=w¨V+P8[oM´†=%K|fa&š@ø ÒÞ> endobj 585 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 268 695 298 709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 586 0 obj << /Dest [ 927 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 506 565 527 579 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 587 0 obj << /Dest [ 927 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 308 463 331 477 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 588 0 obj << /Dest [ 927 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 216 388 238 402 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 589 0 obj << /Dest [ 927 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 424 312 446 326 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 590 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 356 223 372 237 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 591 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 356 175 372 189 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 592 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 509 126 524 140 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 593 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 594 0 obj << /Length 5502 /Filter /FlateDecode >> stream H‰¬WëŽÛÆþ¯§¸@1VôÌð4{¤u›Â–´qp¥Ù]Ƶ¡(o7Òwè;öG¿sfxÅu×n`¬Å!gΜëw¾óÍjñ|µ2B‹ÕõB¡ð?qž‡*W©ÈŠ$Ls‰Õnñüå!ëïQⰮϿ}«ÅÍa¡B¥hÏz±ìï?È¿•Á2 cycé×H+ü¸úÓ¢` …ÈTX¤¸%ÊÃT¹KX€aYô”¤NÔ¿ Þ. –: S©rqõ Þ>Ôí-ÞiH’‡ê ^|{!þñŸ`™`Ýà[&² ”\ß^ˆ·÷Uû«m¶,$’e½ –…ÿâÿY16ŸM3*L±X½Â;Öàþþ> ¢PËÝjéZˆÆ•!¬[ûW·,érµÐ¢ “¤a”jeaž‹T‡q,`cœ‹Æ.®߬zgD[Ô©7W+ò´\ý< “6mE˜RâÏÛtì˜åÞïVA å_жÚÙ?·“ÊÝ[Š÷’5G>hŸYï «a¡NÞ>ˆas, ±}€g2yl×;#—õñ`›µßÔÚ¶h/9í½K‚ÓNÛ"vÒÅ×¢mŽö} î«íV\Ù # ×ûú£mZ»í^A‚(Ú†M¿bK.÷µÅî%ßFQ.ŒXêöø«tÖg)=Ò]×P2=ù’„”K8‘ã²[»þPÕ7bºA”PiS¹|W²>ëMé>#Ûà öq,CÑž;×q˜±NYÑéuÙž¦^¥¿¼øóå‹ €g_¿~hºþÅßÄQK ]R¹ p¢ˆ¤t¯KzsPÒ‹ßóÍœ,ŽÊ)]„1Њ Û`Öë¶Ú×Ï›.Ë 2*á,z1¦ðbzâVdw!ouW¸peé†VÀ@TUIo²îÍÏîÐÑá÷¡S„Àét¬~~’EF¹Û€=9…&#êRq Êêð¾Òý‘"Τzt™­Âô8»€Û1Þ-€_—T¥.(˜Éª…ˆD–W[Ë5ŸSaCfãêéHéIw‚pÁïDQq‹[>!Æ +ž•G÷ÂÉÛ”nÅ@“Ègl)öš´ïDºwP¦Ã(›@YgL’{k Ø>c 1¶!€,€QµØí7Ö½"¨_fl -­mÔßû ß1ˆÁ~yl4Ó.Y·ÆÁF-Nâcþ_Žz°Žž8Èåý®j Õ÷8Ø–Òð_+ÀÇ­›êúÚ6¶^[á=N0JwŽê¸1]ÙöÞ"¸Ÿ™ßfÓ¬ëPe¬4„»Š¾=yds¹9mBU|q)ÄÅp_ß¼ó®y£Ø[2¨ œ!¸ožàß@XUû~Îþª»+ë>‹ý5÷_±¡ÌŠeIgcùàv»HÇÒï9‹5ÞŽ<eg±6ŸˆµòCŒ]`J4)þ¨.î¤rUß¡>´îãµD/(ŠI¶G½S>|,·G §GÓ÷±! Ór$²™xç]¼+ª“fÜÔûÆn.8þeMD` g°Sÿiâx_Z+lqÚ[Ü50n8)9pkë›ö~uË5a”–¶¤*rïZ&«¥ûÐ^•çðG¿~»ðÝA4–‘ óiKR>€º¾¯]è/'åÛÓÄžîbwD»áWÄ× †-¯BJ¡ðç»ÆlÝŠ-¥•\—ÌʰåÁ nØ[w%˜$ùóÒþ“,›b˜¹DÙX±+7è Û}Iî ÁÏF™ô8½ó)ˆ[ /×£èb*fL|¯ïě˗ïÞ¼¹ü+/_ºZ¿üéÕ‹Õ%;öÝsǔԱªyþ¢sR‘¢–¢ô x^kGeÆ–c|Ò‘Ž;¦wh›ÊÏAÈ´Yr×ÌÊÃwC‰RŽèÉO×ýe¢Q¬b*ÊÄÚtʰ& 8È{{cç ^œÆçbœ:cZá£fÄ™è’(C,ïL—ˆqƒ4©—® 4¡éiAè¯õzv\rPS'Z¾AD»'lÓË®<¸*ý0QNç¹àÙÑK õŠ>ª‚‰#S9ßw~ÚîˆWF²ÃýÄ f_$½C‡Ì2ÖfßÒ f[z>n©û_ˆ=Tkî«ï›S…4¦&OÖМâñy¯":²m+o¾ݹBãlŽ[ËXè|"-û„ÅQKÆë Œ;~Nc „¸obPøxšU„<ÑøÅÖÿvbj´è…¸Æpññ%¡T"O¯ñ§jêÆ øE1ÜÓ4AAìâ Ì»Ÿwào™|}éäˆßHèõ¹ó¿Þ'$¦·ðè¿H½ÁØiË[ÿ¥3M5Èeê7LH‹ †öÁà' ÙZbh8¬›ên WƒÉöÇ 9‘¯z^=jô²i\_?>tØøsuÂ=š›óDàxëÓºA’{ꇩ45––ô4Q'ýHH 3—烡1G w m]óp-÷ÄÝ•”ƒ˜ý@„4¤_5 ¿Snj²0Í&ä´gåE60žÂn9f£Ú±Ñlôå÷ïðF®˜‘FžÌò½ÚSYù'U®ƒ'`‘ùßœ”—)+"×LÇ2>Ctǽˆ’¡ˆšr2¦!OaSe® (€ÖyüŒ’ª<Œgåu¼ZE=;LlRîZ_"å©Iâxê™l•‰4.‘^Eä(÷ùÙ¢Ó‹žz¾ãÉ*@LOÉêˆc=FUÁŠb≉Q4{|UÍ ÒoîhçÀøIT>/g¢óI:~8TV?%Ê#0±%ª#CñÝõ™1&'UÓæ?bºÁ2cbMŒúit·Ë&çEOw":^U²%–ž‚“/  4Wy1 „ûî?´G·¬™8ØM/‹ö; ™[ÏXóWê¤q÷Éí»w / l²õ>…­Ñ¡ÌÑ!ô4—4#~ú_öË­·qäˆÂïùÍ`,°›÷y3f5 #{!Ùdv€@–éYahI¡¤õúß頻nªyÑØÎå-/¢xkVwŸ:õU«Ÿ!¥²“’ª D-JÕsj{já³®ÜóR0³û~µ¾·àŽíZÖò¾-òD3Ò@¢ìá–Ø²r^ÓD(Û7•0QÕ—pÌ«Š°1 Nƒ`_Tè þ+$Ÿâ¬4ö±&•’@(ˆ52Èí†9¸b½ý«÷ ÀaöæoH'¥Ñ6êЋTü_ÌGزʯÂÈ´”§¨Ì\ÐAì¾ fù³(\ .L‹÷Â#9¯¸ÝV³×}.m?—¶ Ù„Ô ¡Ü"±J8Ûñ`ðJã^°ÞtÜ,$¤¬;ÎYjX$—–€á‚r8¢©ZÒÃÒÒhdÜMHÓpÃùÆíŽûp4ìvCuÙË%é Èu»vŽÚPúêp¥&r¥¦C{8¬—œ)M%å†y{u>Ÿ_üxEŸúaˆÖê[—¬µóõ¢ˆ=²54a2²wRñúŠ_£‚Oç›þs6»½œ­Q*ruÇ·1øï("šÉK\èbbŠÔÓ4lß0¥Êô‰'K…8'-_ÕQ&üB„±’°Çö ,ktµqdGŒ& dó(Õ8;ÇEŽ>: _4i$'VÌÐ=¸7é‰ÕզʴQ±Z ÊBêÒçäg§—[Æ:MËiKû2xßusQÅ^D%—âRIÅ$ì¹ uÞä“t­S·ÃQB\Û¿IÜÇnÖû"#Dì¾Òé@¢8*]¨-Á’FòbOHú#ú- iÕk† š>múÑ¿Œ­ÖQ`KëœïƒM;Û¡¶ÎdìUZ£FÃDáƒÍæÑò|eôÁà®Þ,¿‘/+»=bšuM­UZV¹u‚5"‚-ÈP@Ⱦ\Á_a0Ì+÷€¹Û2nnøIB!§¦,àë2€£¼4 `þ¿&|[ ÈA:û†Ø“· èÕ ‹}uÀ$ë€b-œ¾ßÞõ‡s%Ht7(ö»”¬4‘~['k¢F*½¯W—YY©`1Ø8¶Ï<Ÿ=¦PЯ¡…_•³›ÔX»Ù†€â pÏ¿ V¶ÇfGt:ÒÓ |vú³äGCXnú Ë´f‰ë]ˆ>¸QÈ%3ráäTí¹Qk(õ„=@›Õäj¬51zÃobpûÖ>¤—žká™Ù,ÌŠsð„WSµªkÿÜaK¸–-ÀQ¹-{ížvkÆÿ¸gCZQ–`yžä¸ÚÙ ï(ìLQ“‹¯p[‘RSAIjY“‘P{‘¢Ñh4 ¹ Ÿ¡‰ÙÃ-½S3ñsÒ·È9öï=µ+±Ò ìÀéæÌwEFìŠêN0%øé|6o1Æ]©&&ÕRWã¡ñ–;#ÏÇvßsò–€Á›QÑU¸¢ÂÄB%gE§ÊJlŒ Ð`LÓ ¦Kœ€—Çg¡],ÚÁS[߯Ö#!Éz#q‡’uzÕjÑìû˜§Rœ‡´qt–äkð—Q83E£ã˜Ô‹Ã6nW -r¤·Ït©ÑÂ*ýY•¹g¦g1nöÅ1_*̧ø„=‚&¹EàØ”´ž$×â0HáñU5Y9)Íè7^…|q G ç×zpù’@/¹|d4¶8Y»~hè2áqÛfz¡ñNLM·Ë§ˆ'`4.Á,²™ÐÑè^}êîdR$“¤èÏäeÄÓ-_ÅŽ¯Þ?…!©;<4.´¥™¤p­E/ËÔÝ}¨v[“9«?mÍʦ&åN ×Í FNü(æMi«æÑù»+.»`°ÖÚUûÞJÊÉê[í{°ô¸iû`£ÜÙ‰¼ì€ÍŠ™‘>EñúD]žµõë]ÚÄÚ<ŒÒ%ª_<€?gÆ/ 9 l>¼’9€"?9bÿ³”ÎðjÓ¦L_,F½›þÛZAnA;SÀŸbàëŒêí…(sns¨Ãä©x-\“"³Bd†£@¼ä“({òÒs üFÒóÝáDV8„2»ªvP!‘]X œÖ¶äbMÚΔm´Lãê°ˆÈÀŠx|æÂÆ 3âÈ0ÆÃ·z3JX8D㔩)bâǘ «ß·Õ`ˆl6Oˆ ó6oŒ5:[ã‹;iCm‹¡dó„¯k‚Z @#BÉpCM]ØÂ6yÄŠA-®ÖrÐÐWõ»kD1‡^ê–G»å‘¹M‚žð¯f|w0ϤÛ7è´K4^e1mÄàÝo¿q¢I;Ô7‘Ú.šÅcŸ£šàñ°ÛƒÌ[UÀVPqš=!Ïvƒ4¬Ù4ÕòÐ0 1¿Û%Šõ¼¥V×Ó[çâاj½ož1Œ÷pX/Éù00Aõެ™·}Þ¿¹ëgî/¯Árs¨ïyƼ‡|w¹¬äT~ L£uýŒümpRÚèX¹ÉºHTm¯‹˜øÉ'º£•H5ìt9I‹^ƒà´¢mkª¸ ñ9%cªfÓK*©:縱·–ÌRjÅê‹brkà‡Í(ÅÐxFÖ€â5&"«Úïz˜Ztößz6ØVàñx¸Ýr[™î¨ÕíÔÕ&¨7kZ‚Ýa»Ý4Öàê¶Hº¨rúÊ!|\ÚwÜîB*¶‡méÅüãåõù _¹À¯VW?~AðVÇÜÛô*pÞV`Ë&ÛfóÛê¾ÚI ¡„М¨õjÿü.¸;ìƒ-Zº¥Ïâ>‹» ®Òk_«uÕ,ê`ùëÓdZJcnq5‘‹Ïæ;ª~Z< ,²æö0–R­GY #9Š@·öÌêt}\ßà7¹6ÁIôR믉Üú̧7$ÕLC¡d©? Š¡Ë ‰ ,Ž\©3 È å·': ª&lÖ¥žÉk¥ç“¢è½õ*Â=)Õr¨3Lºì+–Ű“>ÐzI‰îs ­= S‹„±¼|ö¥5Q¤æ Ñpx–Sëb•Œòü_ÉoQ²q]H”çÐ>î±®@T|SS¦‹ :ß²nƒËëç—Ÿ§(‰¸óÃùüöæ´N]ÈÈ“Î4e´ãD7›²öx{æ7xßÑ~•bÓþ[ÿ‘M'E*ô÷l:<+‘åcJ§¶è(tG¨Q)€ÐeƒE}FQœ™ÌV̸jÙ: V{aIR¾_?0bõ®]˜B§ëªBëV /îÂ(Iy]=±pH‡û:'„¼hÞÚ3ûµ5ã’“­#^’-5†òLE9ƒ¥'ž±}óW»˜<õÇÅ7dá Àu·ÛÔ ´‰C¡\ · ±]¿Ød6V¬ªuHP°—| T¾†©ý˜ sŠáòš¯A·Ÿåß®'j*'š±ýc>¥šÞ°Ãô`ºíÐ&Ïå}_> endobj 596 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 509 743 524 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 597 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 481 694 497 708 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 598 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 509 646 524 660 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 599 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 445 124 459 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 600 0 obj << /Dest [ 1634 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 476 387 490 401 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 601 0 obj << /Dest [ 1634 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 316 334 330 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 602 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 603 0 obj << /Length 3170 /Filter /FlateDecode >> stream H‰ìW]sÛº¾êW`üpì˜ Áoæ-I•Œ;×IçŠÉLoÕZ†l¶©)»ÎéèìCÏ.@R’åÄíß:K,gÏž]¼-&¯Š"Jˉ „?|EYæù™Ÿˆ4½$óCQ¬'¯Þµ™X´<Çí¢ž¼ú0Sâ¦øžïÓœÅÄíï'‘*7ô"y£é;"RÂùkñÇIÎr‘ú^ž`—0óßl¶EOqbLý+À¨øŽ«B/‘~&®Äì¡în1HíÀ’l«V¼ùp.~ý·ãÆø½Å»Ø‹eåørq{.f÷U÷UoWl$”e}í¸¹ÿäOvŒÏG |/Áâcîïï='ô”liWMÛÂ4¶ôðèãt ;tË–¦ÅD‰JL‚8ñÂD‰0õ²L$Ê‹"3F™ØêÉrò¶À¦ø‡hŒPû„¼,þFËŽÖ#™&>ö±‹ ÉØ"¤±9Gç ¡—ɵ“xÂgKÃ¥Ù8‘—JñËôç7ÅÅ—©£”|3û\¼›K¼Žéžð”Æ]Äd? ÈÏ W^9êîyJNÊ®¥sާ }œ™;Ëaß c7ÅZšôšqS#˜^<Ėѱ„ý؈USßè­hw›M³íôµ¨j¸¯vx’ŽÛÀ3‹rKž(nµXîêEW5u¹ª:äPòÁIñi qT Wy*¶–”ʬ¥ `€B’N¯–7’¢2£¢î]vb2\k} §KûDÅÐ=@Ü—Ø;—¢±&ÌkwcÙÍꮪoDW­í@ÇÔ/×kx.íD-°l·ˆr×åßu+ªN4Wm³ÒöŽèë‚&?Í$3‹dœæü³iñë§ð8–ÓOïÊgó9 e6“‡!ˆé±i¶n»Òœ‹«]'6+ gÒV©VC’ËkðÙÉA,%Ê«f‡´U˜ÒW‡Ã\UCÅ£GWlw£k½-WÂQTuJÀC§‚ @B…#JHÆ›]1s7À gÏ,·äËfk&›A¤ä«¸3c~øžg¼{2¯Lð‚^ê|›X¼=Rd# íofVî9«âøö)ˆiIRÑz¾Œ«ähÕoã§ú¿Ž¿€Žû{I÷=l;y~4!Na– ó³ïLâúa`и¡Éómö$–DNF RÀeñµ©‘8nJž\•y¾¦ˆð¼†)2ízÙÁ.ÚkL°Ýþ‘kMƒM›%ÃÝè!1:¡dg¶_˜moË;-ÊawÕoŸ Ü4;Ä{‚ÞUð=F™r©Žij°h£vcu}qt–ˆˆ5Úê¹ežÈ Ø”d+’[û½ÖôM¾šï-ñݱ™Úyáãy¢ÝØÇ…ùBA%mZVv¸e »¾OL‰Ž„:ÑGÁ1ˆ"éË"½l* rµj÷Nj°äCûÚBû¾­6 Ò#rþŽ©ø>êå#²ÝûÐ2뙢åäàÒr«ktÔ¿îa[ÖóMÙ¶úúüˆ x¹àJÒl*"ǶY›Â³Ñ‹jICƒ5ïè8nžäÇœg,I}RÙóp¡M¹Û{òP­îD×ðøMu3õn}QEÜZM'NdS_·B—mGƒÇEÒµÇü—Å+TÇM†¢úŠ1´ÿ# ¦\¸ýãˆB-ôzÓ=ˆ;äsN£ûÚj&nÍ•…Õ=ÅNQb ª²9WçTš•éÂnÄ]IëÎÞóEèg'’Ÿ0+’o ^rÏ@~üpFúN2?˜OM[‡Ò‚nLÛ13aÇÚU'9°²VP%8B§Ú‘\æ@Îeå!ÉVM9Ö‚®ä«Üš¯n›¹ó´T£¨ø€–-_Q•€oÌèÆ#º\à 2gŸ)÷fÓ_ ž}Áíÿ%æsÃwfjh`0¦‡ÖÞKÝ Gx±#óôÏ£u'vví±~Þ/~ãlÄ83A Q69̰´3ßúú¥}Šâßç,¡ Lg$ºüóÌ0vj’á’WœÑy ÚhØË¾ÀfîÃ>©Sz} 2fº=ȵÿ4x?Hõצ¼n[ @]™²Dz)oªÚüªúä2Uu·âìíôÃÅÇ×_pû€¨ŠT¶zZÒŠ¦‰muË]]ß1Óë±|TŒ”-&Fv¹<&ÜùP1¥ô¸ë/@¨§ÛuÙ½0†{wŸ=¹êñŽb3)8­GúÕ%TÇd'^™É¶€–f¦×½Öæ¯b@€.ba¿Œ¬h»vn eW•Ýœ@ÁÝkÓÑ ªwC¨tîÒ> |¹h¶Ø5ŽâÝWÅ]ËeÐ^(¹G%WVÉI g2’‹®¼çë„‘ÎøˆY?áF,Pëèå Ÿ £¬ˆ½¡5ÃI ½´mŽ9YcÞ™OZª»C û.˜û q(g<ò)K€š™ÓðãÑÚ¡üèè†{ 81þQù8f‹mµéöºïî¶ìПwÐ ´g'ÄíD?Žûj´ß«ƒ~|mš[´âXν¸‚Gxž|3Lš ÍÁ…ùÒkn,2”ueq©£ãîÖÅ(ÿAYºÎ}A¡«$ë‚sⶃt2™Ô'MŽ’‹H‡î²HX-΂:q€Ö Îñ}Ñ¢=ôsv_ßçp=¹±b1tßíK»˜.æÖEºÒ¥Æz9¿t):ç~ Y.[ûÜeª»È­™Í(scľäSVÿ°+®Å炸ÈwÄá䔹olÞ¤ep*-qÚÌâ@“¢t‚Ò|¼™¦ÃÍ4=,_-9°CÐ*ŠOŽÈ @Ä*Q3ÔØ¹¤Þ—fî^-5OsX£¸ÒýÖAémÒ%Oÿ}ãùˆ ƒñÈOD¢' ˆ5ë±w²¿ì¸ÇN`”êË`È'¡ŸyypdÃÜMæÎ! ‚É7´×‡~g§š/¶:ÌžíjUÙAs¹åx$mP.5nÄcüJŽüc3uì¥ôŽí†)Ù¤àfƒÝÀÆ6MmçÛv¶ñ#+'dý%RÝð¥H|±‰é/çÒ¶ú¦% ùúaÚIºêXc¥Û°ÓQBO%h%ƨªäÄÉÇP)Ž-|2”ñ)åÉzåymŠŽ‘™vŒ5b9z ´•-žPèbñt“½ ˆžEsò^w2eu§× R„޲,’®Éô §µO0r5°\í8„`*5]Ô±"x9Ö»‚Ÿ.8˜—Üm™®S×Tâb»rËo¼áœ=³ä`TñrèC}2یϦQ‡04ô!1ð‘ÿ|·QdµæQM‰›"w\&÷-­PˆIøÓI!™Öµ,Ǿÿ‡ð69µÐ·é¡BßBˆ„E’’Ÿ¸‚ijâO²:Œb/ËNz4:DÌ:ô'LýÇù§Ü ò¬§t«»ÿt^í¼ Â@xï¯`„!(—B°Õ©CÛ¥J—ŒY’à$HW…(ê¿ïïÌÃI¥ª0gû»ïÑ„î *òö˜ætÀ¤@Í|&Â!Ó jЂKȼXFõr©@ ¾â¹Rƒ“i….ˆBÙ£JÜåÐ`Òhe;Ã>‘Þ¯í~[ó9ŽÈÈúÆ7 ] ôÕy5ë‹]ÊÚJk¨‰³‹íÈW5G2[×Sµ?Q¶)¤‚Ù·NrÜÇT×ààëÙlY4ÖPç…y‰†…Dîwò†­/´U¢¨Ihøy}I‹Â O'>š6Ú¹ñob1Žg‰v±ŽüS|8˜/Óì{+ië²§¿aš2jÜ$æ*Ly/é)Ö7É0Méc6æy²7UÓ™#:Uç'r (dñâ×wöIÏìÖòxõ¶!ŠD —ø‹ì¬…4è]ðEŽ©D_ýMsT¯9÷'Ñ[8YÿDˆW)¶¡ŒºÃ%>fAæË†Ì—¹RùD¨e¶íÔ«ÊËúáï÷È6 endstream endobj 604 0 obj << /Type /Page /Parent 1709 0 R /Resources 613 0 R /Contents 614 0 R /Annots [ 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 605 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 448 708 463 722 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 606 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 241 646 256 660 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 607 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 231 633 258 647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 608 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 464 329 494 343 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 609 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 326 280 350 294 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 610 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 417 253 448 267 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 611 0 obj << /Dest [ 917 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 436 240 472 254 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 612 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 130 151 144 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 613 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 614 0 obj << /Length 4039 /Filter /FlateDecode >> stream H‰œW]oÛÈ}ׯø¡CÉ!Y, dÅp±±‹µ\ ‰÷–)‹­D"7ù!ûúûÐsïR¥Åf‡œûuÎ=óã|òj>7*Tóå$4*À~â,óƒ,°*ÍßfA¤æ›É«7M¦ Ï T³¨'¯®îBõÜL?hÎb2í_&õß où±~.é×håý2ÿÛ$çr•~nqJ”ù6CxÃ{ÑSbe«ÿ¼šÀ›†‘ou©Ç/êîKÝ®ðÆèÒÃNº©õúêR}øŸ7M0Þá[â'ºò½X]ª»—ªýZîÖ¼I¤‹úÉ›æZýÊÿÙ0vŸ]3o1˜¿Å;¶àååÅ÷"?Ô ZÒ±ØGúx àݽZñN³ù$T•š˜Äú‘ U”úY¦lèDZ‚q¦våd9ùqÞ# 1%8ŽÆ!ÔEVÎÿE ËÆ ë"™Úç¸Å~’Šíw³ù;/öSýÓíëùõÍÕƒn«MÙ´Åæ“ú›Ë;E~d†¶3Qâgñh?ÉmÆ©‘}‹¶BìàóÆ3ˆwyØŠ26ö3¶Šyðœ'®ô?J\¸qH˜Kþ›…rÒ_TëQ)­pÑ|*2áYÔ‚:JVÛ—`…¬£äàå^FŠR¦—’-ï(s5çÕ×Ð{~;ûp{3{Ðì,;´ä¾É6›¸ ÅeS;úp…'s³”ÃpÉ FÆÏ¬‚…aÔÏ: Dœ.Þ¹ô]€b凨ý-×[œ«…ÿ ëm«Š¦Ù.ª¢-ŸT»EP¿ô1ô€j«u¡^Cؤ ìºwÍÁpŠ:2dBš÷lÄàØõlAÓîPo9j× H°äþnöóüú=ªËo¤ú†?S¡%r ;¤'ç£|aw@žwÙ•íœgib¬Q«R-ö;÷¶¬[µoÊÝ NtS– 'rM‘³HŠáªjÊ–XVœú ÙôÆ}éÑÑ Àê{¯CMþñøšëâ½ø'`zðÔVâ¡~Ø7< ‘6ø‘·- ¬$#ÿê+Ùhå!ƺTH~* ¿F´,Òûu«*ÙH]ÜýóNÌä£}!ÿÒ˜ËÁ-ɶ4ØkJ̓üðÐF8c­3´ùT.ÔY>M#aB›¦hÃVÇ8ÐíWªÿuf™q¼à[¨3ûa’Û®.˜íM)‡=Qš%’‚ K-pGDä\IPW%Z)…²ØÖmùŸÖ•5Ðcйz CWŽÌHãªü\¬÷™Zo G‘^kìMyÄþ2ó“GÊEµGgÒ´™¿ä³zYU‹•¤~«ºU½XïŸJ€Vj þ¹ª /E–¨~0v€Ç«Ä¡vþçÉ]M˜»9fÍK%Àðr l :Ô\A…6ÂÐ…‘i'vjõÈÁZVÏû]É_žÆHcìA¤Cÿ 7Ž! åúÞÆLÀ38,;g{p„eN©°·—ãÑx”bØÍm‚ B•ÊP±Y@™¬Ðh&_ßó2ø=¬H wÜlÄf¦XR` ,E×Ķo¼)‘Ê-QC¢oþ!ßg³DÿLžÓOÒý¸©df·Ð­x8:…8»( s EБéd‘ t/bǤ‰b!e˜~¬e¢É F[mÔÔ ø öÁ®²¼ÙÕ¡¨¯H¼›žØCLFc·¦Ã¶D¡K†úxù¸Ý®K€ä\„â<$}n«%OÛ{˜’!,S¿Ayå‚#Éb™ ¸×ÓY˜à;éI t†ü‹úå”ÕÒ¡ˆ:z‰¢NI1É €lJ’ ½¯f ž¡ïÅ<޾C|p \~C“9ª x.wÜ%p bE÷a³Bb1µbäcʉx ýA3ÌQÚ™Áêr,ü8?•ȰÊDš¤í$²“ÃdÞ=rÊè©áá;Ðé£Ìa¼v’¹dⲎ¸p£±Wà, PSb‘>µ“{"«ßt‰upêÿKŽÚ®løëÞ#¹r}©ÖkâP )}bÞʨSò‡†MÙ ÚëDßB@|¼uN$®}Ü·°ñÌ„zB&«2ÉŸ»HÄT©ÇúÓºMÒÜ)£§j¹,w$¿]ƒ˜™ý ]C×WL@÷)ÕªøL«PnÊ!ÔXºÞJ×ÄŸÁï±tJQés_|­ˆp*LZðþŽ‹‘ìp¶å‰+#›; Xp¤–ËåFýJiÐÛŠšº/2T,Ú=©d¤`½öèø'vðè$uç ꌚ—î5Ç‘Q‡øe]mçæÐœ!OYÀ|¡•PFñX¢ï£nÚ•¯®—"uO—A¥â7d4!Ýšnkj5Ñ¿-èêHŠâŽ@造zý®ú!GIBÓž–[­{Ü1žöð‡Â,˜€"x…º‹¹«-Ôe~eˆ;G Ñòµ‚%éP´)žÊaå8Ô‰$䩟DDY2&‘¦XnQø‹UQ?s!¬Êj70mœ±ôpãJà÷Õ-Vî^*¹:Ÿ¹´¨`¥‡Ó—VIÌæó•¦†]…|˜º|Ê‘ý½›˜4²î²š†éH (ÙA 8aœ@1"P PóN1ÝTÜ Ž&}•·7î5.ttí8:êš½=¯ZÐÞs ‰sLˆ=Ùža±F±Vn§ MƒoÔTzñ¹­8p¤¤·¢–Î?+©9õ†6J¢ßìüœö–Û,ëî3튫 'ˆÉo¡z]2¸¦Õ©ÉœãÍj»k"QáKÉÅ–@žê•Åç6å2ˆEÓNõ|~ûA†<)cMJC$zÌ9(Çä;dÇ£ f¡Ó•ï~º}=¿¾¹º¸TnmwTêÇÍbì˜Ý¬¤‡ŸŠ3\f‡''ýÉ®)‘éÌ»Ÿóâ7¯®œ™eýR- ÉØÎ¸“‚ÌÜ2â02I|*ÿ£°“ÿ82Ò"ñO…'ð8ãëÑ‘z(únéÑ5ë–ÅØ%S ZîëE[mIú¬½ ~Ë×4»‘4Dt0ìþæõÝÝõÕÍì­ßQJÜ“;Ã*¸.Ã42RÜQâA}‰Žc­Ù‰ó¶|Ü?Cðè6ó ‡O¹†õÍ„‡rîO‹¹±Å]ë8ðQ¿ýxõ~vw÷újö ›vWQ$ *`'žEWèî£ã9õ©M©ô‰êš¦x.G]Í$ØÌŒ7ø ¹vÆ}7{¡NtÕ–ÿg¼ÚvÛ6‚è{¿b¡' ˆ “%ʤ¨šEã¢R›¿ÐäZ"@q’²“¿ï93KŠ’4€añ²Ü9öÃ⺠€ÎBŒƒ½ï­xŦ‘Ÿt‹ÜÆÁ¥qŒˆi'Hu,ç¾Ô­Zµ4ˬ>ì^9ª‰F0OÛÔ ô÷8¯Ô^–6›ôàÍ.l†/¯ÛÙ²—ò€?xx—2oèsû\À0ðÐA2ªaŠpÅ,¤:Ì¿*‹¦}‡fJj~ƒ‘Ô9ín,ü=Xx^ó¤­ªzñ/pUe¿TËJLD c­üØ©ûÛ ðú=xåâ )ª¶!sMöcª‚¢õ¿È9\ºGµû¦e{<¥Eþ I O QiSK§ie¦X,(àÍŸ¸[/ŽÙ®kúX𾣋é?6 {9AÉ5 ;™ˆ¨°XkI±q,‡ú®•Q‰ôäãøÆüîjCVwÛ@!I éžßÌeèi3Œ¯ÝÁÖiKl1í«ëÊ‹ˆ‚“Ûó7Û‹ ž±ªý>-íyŸ¹ýØR©Y“±œ?`r‡m 0ˆˆeâŸ)´ùèbQ8ÕöÃQÌCq.O SÛ [q¢cúLÜVð|¹Ê‹¡Pîûu PP; ŽV¢ ´z!¥£/‰¨Ô2S­íˆMì_ÈM•YiP­nd-·[å%´~ÒÌvWÄßÚwè9,‘–ºšX‘É:B*¥.››Q霎ëÚþŒTú$¨îÞ¢|j3re>’ ˆå•~ÎÜ#èTÚ1¡”˜*WïÓRØ@‚Ù[Õà’í_3z•`Šªâ œS_{ƒsØê¶Y~øJµÿj×~ü{ýH°=çdèþùàôâþôâm71 r3bs#™¿ä²åV±ͺþ8ù Û3/€©‚V]Ðü š 1z¶©ø}$Ÿ Ž›´Ê9¤)Ù.¯9ì5 ×¯jÅâ@ÿK-Å´b/iy”gºƒ‡¶¼úø™ÄwL°àš¨ódŸV„×0ïw]*¾nCLvö²¶ôghiúZERÞ¢~å÷È “ݰj<Ò’ógAùÝOÕåù¯Úâ…ûÔj©– Dÿ¿ÈÏ^eþ @êÉè%êPº±MCÀMÅxbU¨É§‚~M3öÂõq8ÈÀ¡†Ò«h< ,Hºe„ôª8NØ6°ÄÁaN”Ò‰^¥±Žâý5mLÃ. }³¡ƒÁˆáùX²ˆ$h¼ƒ«Óº€4ÌvGD\(GÏÊ1I ÃÎY T‡©öX"i(^tüy§y¯{;_z3¹^mÄÑý&šsõ«Üüóéá/}|¯Yø²––øÁh©¸±Œ(ÓV©Æ*ÜÕÈi#ÃZN®¶Rù®.ˆ¢3T/ZÕ®ôèd€ê#¹a¤«Í/ÿ ©¬¢P endstream endobj 615 0 obj << /Type /Page /Parent 1709 0 R /Resources 622 0 R /Contents 623 0 R /Annots [ 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 616 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 215 681 244 695 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 617 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 324 619 351 633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 618 0 obj << /Dest [ 737 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 390 606 426 620 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 619 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 204 544 231 558 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 620 0 obj << /Dest [ 742 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 323 530 359 544 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 621 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 119 151 133 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 622 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 623 0 obj << /Length 4861 /Filter /FlateDecode >> stream H‰¬W[oÛÊ~÷¯XøiYX wy ÉI`œž8 "¥h›œJZÉliÒåÅŠûCúúûй,/¢”œS 0`-Éݙٹ|óÍëÕÅ‹ÕJ %V» ¥…ð$‰ë%^$â4t£ÄóÅêáâÅOM"6 íñD³)/^Ü.•Ø7žëy¸gs±è—‡‹/òcæ,|7{ƒ¿ZŠÀί«?^¤$!±ç¦hñ7òX Ð$ WaÄ¢þ­áíB{ÎBùn$½D¬ŸÅò¹lïá–ÆI²ÉñêöJüõ?Î"„ç¾…n(sÇ“›û+±<äí?M]_fåÖY¤Rü‹þ“at}ºšöÜVoàYp8\Çw•lP«Aµ Tº°ôàvûêž$½]](‘‹ F®)áÇn’ˆH¹A àŽA"js±»x½œá+Øâ{ctµ‡+WÀ%ó€õžŒ#ôØÃ …ç¾ÈåÛÕ›·¯?ßÞ½Z:`m qÚåW™—­Ù›šïO}7öRµ PƱXŠ XîCÖ8‹|ý÷ñ<¤åêàÜQ:)¿:/í]lò¿•u8êŒmèÔ&“h؊µ錤يª,žE[3›¶ªÈÄÖ¬»½“@ Äæ>+KSˆMUîò}Wg 2à ´P®ò}}ÆÅiÌúÚ¼*Åcmžòªk@I“=¾]]A¶€ÿ)$nG¿þâ ̹ª„)³uaDU‹mÞÐ’¬"ƒØ†Õl¦«>Óq…zKƒÉÉk²ÍÑðp… îѾµ{2üIdcÁ1ýjÉûÞò°‘¯IÚgüÉ[] ?|\ýüá½=àZEdä˜hàîX£Çâ=ÆUN¤êÒËÊú*›¶ÎË=¥ë<§|PJ© Õ¢r*ᜪÑ÷èæH–Ùƒ™gVª]¥Ï ðRv¦¢:óJ¬)^©¬ “•g“Ü|[;'òÂñ†Òá>d‰Ç®Ö’ß—ãÖ\/Mmìm9Â{H0-ó†DN ƒé@{ ÄÓó.Ê ïh°¦Ág­¨vU1î3|ç…ä¡‚ÝV¿ŠúœOÖmo™€¦ñUÀÅ‚ñ§ÒBÙ EjÃ…t:øë œ  LJ‡Ì&©ö¬=ª]ðÒ©/âÁýÕA‚lk’Ö™¯ŽØ×[ûóÕÑ\ÂÈ{ :FNl†M*5«©Íe†‡¹ftü £U880ްÓíÀ^_’4- ~‰Æ·ÙÞîÈKômB±¤…[‹PÚGl:B(Õ#”ŸX„D¹ Mš ̯H\tÈÔ.9oåp6ÁGÚBV‚Õ…oÀ†¬:íÀCSù–®¡dE‡ù+¥Ô%—è¥ÈZˆŒÂ÷ùºk \ªï£Ç™Ü@ÅóTÓjSôC,É…¥Ì ™²ÂeÔÇ÷†­ Á* 6…èË“G®²yÉ(«'A®™0È„’þO"ÀôEŒqš*i*,!˜’î¬/4´¤dÄÈ!·¨ùþùîXïC,`C(?½zwˆå’ºzÅ©·z BcvBHC¤MÕ÷± »¬Ø….‚»lƒ¦”¿ ³¬8Óœñû@¬¯•†sÓvæF![DpßÎA¦TR¾Š¬(ªCÃä(]_æíæ{ì€Jð­ån'uÞÂ{º @[ï$]ɤ›O{v mÑÖYÙlêü’yùL\ mß¡šloÀZPŒŸ7]]€Óªr&øÅ²ã]±º‡k © YÙ÷õóÅz¦’Ì·ìá± ¢Ae×EµÏKøk±$7 ¼,¨}läl‘ƒ|¥bÓk 7ˆO¦@èõå3Õü?¡oѱ˜Žhûï­—ô>Lµœ òžX"ûbó”oˆêtöcÍ!¶¸b ¦^{(Èõô æ@Ö">ûò†e¡ ë€þ€¼¿5m–|B`ûr]uíØÐ¼ctd5PªÞã©Ì D8t÷¦¦Ža@óÖý>ÁIN’È’ ùnyûæóÝGÄë’²‘ UÍf^¤^ÌŒ'ÄRû_h7ÔçNþfm.Fö߯&ʼn¹K«]wTŒ¢9ÌÊo‡˜èËØvø†.¬•‘IëYíéžVhm‡7 pPý@^„Y¶GþžÈþ5&ñ.gRZðÏðÉ–"?rAòšÊ²—kC]â‚ 7´£"h<É[­XµVd×KÙ2o öÕ7´s8ô€AŽäcѵZK<è[²>½æÏö&Õž¤ãÍ‹#´x û‹1ñ†P $à1¶Çü8Czχ&0@ €Ÿü©‡ˆ%ö\¿×sGzÞ9äB¤Œyø?ã:Ý›!Ö|Ô~8RMÈp–#°55•+wypì£EžYõïïÙ#’$í¹ñ#„^ŒDÖÆÒÊéñ„â– P‚¡{ŒP„¸}†e³?hëü{<<Iì¨Kê —ô,r‚p`@vÀ” ¸»Žž¨úxÕÌ1iÄAI¹©>™úçNkö ÿ6¬>H¾HÂDÆIë³0¥cl¦Z¼ €vs|òì,7=¨4%?œ‚R8€’e /EmÚ®.-&a`2´[#ÇfÑT²KhÚs¦—ºÁ”›©)Ñ{ʸòŠ~OX”r:¡òþwHk<ë V‰]M¾ü½®åí{DÍ@N¼ŽŒ»v°8Î;?öì¡'}[ŸG#„7‚JÀ+Ð8/±92`»ÄãÁä|ÊÍ1|ŒŠ¥ ðbº–ïÎR„3üH}‚²{ ØMü©2~¡²c =ÑdPc>²è—(àŠ—œyÂìÍÉAÀŸfÇ™5ÐuÔ¬ù±1Ó„ñüÑ¿þH9a¡Þ•P6ZœÖùiöúnøÉ^o„U¦*òÆ£™j¡ªåð÷Z:qÖµýd¦;æfŒé°¡E¿UA<]{'5S›ç¢cÜŠæ¸õ okÁëý›w¸òm!xêûD3Ïq-d$8ÍQ§ TF#”ÝÏ¡ÌOÜÈ;wP÷40Ò¶e‰/W‚íÁ$ÛÛßï”BwÔ3¹=1Ûcs|¨‹èì=*WùëiUÇjŽg° “±¨Kº4W6=–X·"³[¨¥›ÝV¢ì Íˇµ±CËÚ´cˆ6À 2ds“_( NÉÈ8SH«3æ‚“â”â ht…G$°Y1OsH»tZ\á©¿§Êt2Q–ŽÊ,'ëG½††ˆGàZšMŽ8#·ó1¶HÄx‡Á‡{œqÑw»5e·îMi&oÙVü袨@žÌ'Hi‚±ŠÆ™3¶F6­Ð|ÒÐè#Ó¥‰uÏp¸üË{úô*‰åÝ»?½ýÔÀQH~ ¡ð祘ÇHV<íß}jÅ=ðÑ81LÜËy(-¦W"ﺚ~tx2uƒËÓ è,±ú²-ž6b—wÔØ'‘J‡Ç³Þ8—¥vÀ¸T®wy%.•“BX\u‰£ ¼Ô—À5 £¨»ÿ²^-»mQt߯ ºh†€-ˆñÜÔ( ´N§]uCQtM”"U‘Rê¿ï=÷ÎP£!c i6–)‘œû<¶…lí«§/NNHpÖ4˜üÀã¡A#ë-Iý-&·š°må.Zf”5¢gwU»ÁSëê©`ëy¬»Ãþ2Ëi£ðh·Ÿ^Þüôpû…uyÿç™_òœ)ä@ù Q²­Íy4+ò¢'¹úºì6i‘Ów]$-F©·:I=ß{šŠœ€Âóøÿ'Ñy•§GÁtI³9s4I«=ÞO€†àÒ’ An•±§Ù9Ï\òÄeÙÑ"äÔ,¾rGžx9ßDF E‰ø¢÷ &Ïz艫Ä*cÑ‚¥ÇN•ï¾*z)XN® ÃÚK®zRï;¿¬t&i3¼:låqÞ™É;’¼3µqÁ6ºœðo:Ö²zG–X˜”`ë;ï€'vxi¤s.Îhœáwïûpóñ–°ÈРmLVBÍ!‰äefiãØq'kORöƒ†‘bœ9.d¨ýâqrRèœ'âΞ¹H}›‚¶ö&'¦Ä‘¤}¹fSr%a¾(fOR6pÚ’m³Úm<Í”­þ9ÍtÍ"ºçÂ#Ãé‘6'úÈ,–g±êg ŒO¯’o’kdv0MÌd¿®&÷[¤9ZÅ,-KÉÄ™Îäyb¸¸¦Îù4lÐæ1”9„ò+9‡'¯rƒ•÷£«–øØKÑLÒÉËèÁf$Ï™ŸsQp&¼K=¨·í@˜,'Ën»+h RµñIüª)´h'–B76ˆ‚Õ¹¥x‡¨#õž4Èý§Ñ^DêN»Œ’ ð;+õƒÀŽD¸"ËVj_릺šçؘ(¼ÆŒ3§¥· ÉÁ‰D» û‘k[ÌQœ\ƺëwÔž? 8‘D:àFâ dYôUÝöUÛ×C}t‹² Ô>Øë~ãÚÆ Zž ” *Âf@ÖöôìŸjØ*fp¦Îø§‹<¿pñ^6£:˜Ð¨÷ª<É™ÊåhÊlÄ#!¦²k‡¢nIÅ×­»+Dù6ð†¡»ž W®Ö~,Í‹°¦“µ™,)"HuÞ÷ï:há„ʇ¿Q8»³€JY·ß{Ûªh{ÚO~yâ» ¹˜Ô6_Ä—B苵åwfä·T7€”>ìÐZ.†=TM7×쥥ÙB[³I7§ÈtI5Üókjp´Ó*ZÆ×m$—Ô5‘æßg°$O6gUCZÍ•cU£Ì)RJn ÀáäµA4t“d«S±Ñ´^A©!=A›P=û™ºò¡"5uQQƒéô8©Aj²žógR,¾Ì[6ˆ1îë³.§Ëx  >¬û±£b×f&íÌ0Nä{dAà7Ö>ô\S­"¦cµ>yƒŠ}Vdа!©"*ß-&áÐ1ö€ØÛZ²™@ÆëQ¸ç®nç)P€N §w„jâ I[Ž`É,øS « ÐÏÛâoá;~á<ºOCUg&v|ІøìZ_1šO92…38w—bˆc¢Ñb&4 >Ü¢™ºÿ™àù‡£\pm"C„:á<ûö ²HİO ‡ì|°dÝÂyÛB çããÞ + øé$}±ÏU‡&¦jë‡%ßêÛéΦÖ/üñ \A-ו á– fg–Z³Dÿ2×¢Ÿ^\aXã¬z`¹ ¼PmWV¡g¼Ê’·³=È­ò×0ï ù¼Ô.Qˆ› ænx££ÿ¿|Žþ¦úw×Ôe=4xï³æô‡=:e kþ±!U³žOUó)’ÿÒH û$X5ì3qì©’¿{dbÏ%º.Þ-GF‘@M4Ï^q”H(²BâD,ÛŠï(ZyžJT ¨ë²í†ê¾mSë’jßR£9“•C@ µœD‚çs¡Ÿ±r ]e,²ß3¦WeEh#Ã×n¸ð¨*,Ã5^ WÀ%5µ8€tÌ[ מ|Àµ¬Ôn×É{¼ÐMxƒjêÓ¤7HÐÅñDêyáçXÄ;Æw4.Aô™žùäÁr[h&×HƾºâG½ÇC[5•f_ ‡}‹JEª÷†ý¡‚­y,šžðî¤×µ×œ-kµøkág{Rìå¾Þ ^ÓÉÃeÑp©ŽÅ¾ö…ÌyFgk>šÒܘRØÍû̪$è1ÎŒ ƒEÇeÇ¿B0̘PRéW¢Òˆå¹Áò+ï÷û›ôˆ:òp÷ËýíÏ(3 8]®j³R„…§¬S¤‹âž’ÍÁãÚåfíj=Àò±ãiçBÅ ˆ!•éÊ[¯…P$ÂGrÂ13åí§ïþê-" endstream endobj 624 0 obj << /Type /Page /Parent 1709 0 R /Resources 636 0 R /Contents 637 0 R /Annots [ 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 625 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 390 739 420 753 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 626 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 272 668 295 682 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 627 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 256 619 277 633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 628 0 obj << /Dest [ 1273 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 375 584 416 598 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 629 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 308 550 349 564 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 630 0 obj << /Dest [ 979 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 372 514 400 528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 631 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 483 436 511 450 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 632 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 233 361 268 375 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 633 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 347 170 361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 634 0 obj << /Dest [ 956 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 146 242 174 256 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 635 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 387 242 411 256 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 636 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 637 0 obj << /Length 4286 /Filter /FlateDecode >> stream H‰œWÛrÛÈ}çWÌ[)Æ@Êå*­Ìu”’,G¢*qVyAD JV>dÿ!ÿ˜‡œî€ɲ7µkj̵ÏéÓg~šÞÎfžrÕl9r=åà?ü âØvb'R“$´£ØñÕl3z{ÞÆ*k¹£Ú¬½ýxëªU;rlÇ¡>ÙhÜ7G¿èÏ©5öí@¯rúëiÊúûìO£„gHÔı“«ø±9²Oàñ\Ô #™ê?ÞŽ=Ç»¾i'Vó'uûTuk¼ñtna&Ý­:ûøFýí¿Ö8Äsƒo¡êÂrt¶~£n‹îßySò$¾N«…5N´ú•yc||>šçØfðŽwðøøh[¾íê–VÍiYL%m4œ.3¯Ö<Ót6rU¡F^Ù~ä*bDZŠ\1ÀƒX5ùh9úi6ÃwÑÅ9ŽÆ>ÔE»œýã&×›PWÀ96þÉB 4t“P¶Ÿ>¤E™Î-l5ÖEYtOªh­PùgU?VjÙÔkã ÇÃî6u—¿áörWe]QWŠNª›¼Û5•;½úl'zÆO_l%µÅ«p`#éŠYh ”¯y¾~&öcׯ¡(ä8µøà¢aG½/­@ïJUTê]Qeõ¦¨Vò%k¬ÀžèbÛ½WW½«wݪ~ñó½¶ÖD›)sE;µ“{Kuµ¢jËÅÖeÄÆò°Ë´S‹´KÕ¢ ïô$ðÀ#é4>8„ߢÇÁzòª+ŸÔ"ßæÕ¢¨Ž•B,×ò€e–E^.Z•6¹jwÛmÝtùBýª–u£ò¯éf[檚•;L³Rm-Ï›œ7iEh? «$gWnÑ–yµ«x)B‰C š]Š.Ž_SW#:ĈEÞf I vù×Ζµ %±HÉ!ñhåI2êò²æÍôÏwÓÛÙÕÙ_-°]Ï.®,PYO-Ê tB,V |•SŒû1ÿ}{âÄ”ÊóÛ#­Š’ØŽƒqYF~Ñ›ôkÇdd$ ·aN#o’€f/Íàq°ô½õμ©´‰ÈÃÁJP×5Ú×­!F¼&D0ÔeY?¶Ä­6ï8‚~ý§ÿ±» ñŒpE¬®xH˜)GfÕKöÜ$Ý>É©E‹¶yó7ª]×»r!«·D4µmê,7ÚÙ¶D˜þ¯]Þv”ó‘VóôÂúF h™H2)…ÿÛG,Ð1ObQЬ,ÆßNàqß4ä·Õ-²íä v@´MúL’lì,ÊLm“s`ÞËgЏè?KP𱃼Éðÿ›‹Ÿ˜d3fä-™è«))Åo!£ '*…tß öT ‘º¤‹@”%:á)âàK3|‹Œˆ`<Ô*–o !e/âÊQJ¦MW,‹¬Àì‰ÊsHQ¤'.Úý¤,â0ªÉÛm]µy»‡~à%v¬y-“D¶1‡ŽzUÕÊÓ¦,ˆBkЩÊ5Auè‹î1‰¢Æl8:·G91tw“~ÝØ¤ƒ²>• Yàçë›óé¥5&"_ŸŸ]’GØæTNs¯çu]æ=DÏHî‹S‰fû^/‰­ è²LWi¹Ëí élè½4îjÇñbhnO-ÿáŽÑ`%’ËD—›û‰$­ vFÜëÄ{à;ˆÑ5uYÔù[¸Cr‡Á1Vî^Óú b“åe¥%€²È¾‡MhH¼B ëôÀÂþNs[~o()}-OÓ›ÙÅôe‰rwnùúµLxt}X„šóÙ껱xªgã^+BîȽ‰{rtr´ÏN‹=æ3Û¢Û׌8¹uàÝOÜ{= O°}î;:± Çü·°®³.c—‘J>ni/ügðõ6—†X“"—±½-!ΰºÜïoD:Yøƒ-Ñ5|˜J!þĹ»"G6ÑÌÛŸÏäŽ{ðwFZ>a\ºür¯ ¹ ¾d±àpí„l®ŸœÚcÖ1Ýä颮ʧwŒû^äœ sŒ<žª£ÐµÏæ8Ž{º^p ýì’…8\²‚à âÀ±RMÁîà~pÙÅó*¾àä&½“ŒYÛ_™ÈN³ °1Ÿñk®D¾¾›¾È5ô•ùezÁßµz,ʰ* à]qQe³Ð y@6ä8#Ä"£n%#vZtª%†Ò¥”r2Ýnq\¢“J+ÓÈpI]!.ó—hO'ÙkÙïZºH»tž¶9)û-öä÷¥?-ÛZÁ;Œ¹DøR[¡iÛÕM®ö4÷Ý~oýÑžT½í “d>IÆ,g¬‰FÇ&2u:LGÆ®H]I„Ø(b­xÃ]¶³´²Ãqò\%¨  Ä¸voò^,TBÉñaúÓÝÇËëßMŽ –{Ï–#ïÓ9ÊêIBèêœtý^BÚ(ÓâŒÈ«©¸¦JŒOJ^h.íRÎŵPZµàë ˃ŸÊàùIW¶\Ä y7Ì‡Ö fH-k­ÄŠ)\Q5¾Æò2Ù0…5žp:ÐÛa6›ásý"òONÌ?°ïÁãF¨×dÔüÿq^m­qaô½¿B}Š ÎV£ûB[éÒ‚q\ò`(Š2öŠìjI[Ûÿ>ç»ÌêjÜŒW×ÑÌ|ç;— §ƒ¸ç®Dâ!—ŠáÈ;(øß¦1ˆ´ÆƒAþ[á²Qá’…Âq%ž/Ý¿ª­c^ýÑjW¬gkÔ—ùÆI0ÆÝ:¹/tbÅ=7¨|pšg¢Ïgÿ‹{Ø=&Ü—®ÒlB}Crï˜}"l…})šŽL¢ I/þÝ=-8åúúýÇ«¿Þ|‚[éòÛ‹i’†>ìxL5P󢌡2cŠDé{\°SPe9n2Ø‹‘4ŸË¤1N&?Y1r¹Dcó;g"Ѹ7@kѨHŸ“ÿÕE NáÀ>v-'fN7¨W´U(bÎĘБ„}ÕdAÉh{ˆÈ#¸q*>kHŠñöÄ Ø%o¢ÐÑ*¨»‰Ïæ‰Eü®mË®¸UB³¬õñ²<(vΟ•¼&Ü“açî8ÀÓarѳY;R›_e€ÅÏVuÕµ¥~ñØý~©`æuŒõÉqCäê§Ea£l ©ïg¾²åjVZÎs>¤Ò¢¿r¦NbÝ¢,í°–Ã-¨dá|ù¶ÿ$ueȇß-ÀBpã±€ÀÁȰÕ틸°aµ·wÍaOD&‰ÍÁ¾`$ø5y!vT|}?ÞѺR{hÕ4§º¦¾Ðîá„B _#’òÏU_wŽ¥ìѶU‹MÓ÷hïàÛ_/9笂ܹú¢æ»ùfzþ¼ïÖí»ß¾;"‡¨S œòÜÊ»B>ÁþRIÉVÌù¯–¾@#¾žn&C$=CDÑîà1ëÑCñä¹cw[O-!9öå?a4õKŽ´·Š–Á³È¼œ÷j+&Ïh&‰ÈÓO'.Œb‡Ññh‹øžU-“›å°Âšk¹ÙÓÎ÷ à‚j˜» JëgU £z2ºS—œ=­æ×Ûs?ä}¤•œsO÷[ï¨#”‡ý±‚cC{ó²ô‘pôž'._žQ^ˆB$?šq]¦\—ûz ®ËU†Q$7ó(æç(òí`5ŒÅ·M:ùq<¦è¼iKží£S¾›«7P¼?¯68wèFMHä÷’˜#¶$K.üA6Ì$7y¯œâÂΆÌégÌžéÌ/ö|b/E¦"š‡ÈA“q‡Î‹§¹¤¤y:¨YìöG»ì L]ÊVè^4ª¦¦%CVXAýÐ)¬Zò3ƒÌM4øŒ™bƒPµ;‘é13< õÖ<˜~Ÿ”Vûè¶ÈOÌC™.¨4’ÈÑ3ÀÍÿpEÕüYÐÂþD P¦ëܱ-ûxi³kÂcâ¿c%Ý|ø°ù²y{Aááü‘øŸ7·>#£ØÉkÏZ·Ä% { ¿r“ïƒöL¦ Ð"D€0_xí5 ´Q/™É"sØj.Èõ8ðÖD.ä‡ñú‹Sâ|þ)ÁôÐþ ¶âàÀbßNg›'0†pŠft$Ó•mgiGÅçG©öïlÀÁ”¾å÷ûæp"íÎýúÛÝ®¸ŸÌ,1ðd>PìLï´SS‡.~€qõ:‚ʦ,çÔ;v•x ðtc·k¹WGÛÒokûSÛÙ=•&ó_µ^»µ»õ•}„‚uÊ ·uÁ óakÏpÄŒQÔ©ÆÉ¡¥5fjiYãµ"ÞCÕm ™óêd0lFmY‰7­Ä²B±¦SCdCn G i˜»ÖÔÊkîži3ÇÑî^S±¼ –,šŽ•Þë'äQË3 TGy>c‚ ÕD|D“º~·~=ÉÁWäëÙ[aÑ¢¨”%W=|ȯö{K§€GUÈux«@Ü ]ÞÑKÆ‚:ËÒèÖ{“JîvÛóíö´ë~“Ã@(h¢ä°*A>$¬Èè6÷N•ö†ý³lÁŸ͑qÆí§›³vòd©{H˜öÕýV(¡cÃ1; ^Å?Eµcƒ‡‡ ªÞ®èî`[ÚÄÄÿyŠMPG>ÀˆRY¾^»(«ö‘¾d¸ÐÆßÚæ¡j.‘Î}óù§¨p endstream endobj 638 0 obj << /Type /Page /Parent 1709 0 R /Resources 650 0 R /Contents 651 0 R /Annots [ 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 639 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 418 699 426 713 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 640 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 487 619 523 633 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 641 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 484 584 520 598 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 642 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 395 550 436 564 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 643 0 obj << /Dest [ 1277 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 336 514 377 528 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 644 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 343 445 364 459 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 645 0 obj << /Dest [ 882 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 374 396 403 410 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 646 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 305 382 326 396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 647 0 obj << /Dest [ 882 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 379 334 409 348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 648 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 305 320 326 334 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 649 0 obj << /Dest [ 713 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 234 102 248 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 650 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 651 0 obj << /Length 3824 /Filter /FlateDecode >> stream H‰ÔWÛnÛH}×W4æ© X »y‚ž 1ëEâ1bff²ã} ©–Ì]ŠHÊŽçCöö÷aëÒ)ÉÉÌ>. ‹·îêê:çTUŸ/^å¹Jäë…Òƒ?¸Iâz‰‰8 Ý(ñ|‘o¯Þõ‰({㉾l¯~¼UbÓ/<×ópL¹XŽ·O‹ßäMá,}7ƒW-E çïù_)YHEì¹i«ø‰y¼Ðd ïˆMý[ÃÛ¥öœ¥òÝHz‰¸·ÏÍðo´4X’}Õ‹Ë/Äßþã,Cxîà[膲r\ˆÛ§jøÝt5ñeѬœe*ſ藣íÓÖ´çFðÿïȃ§§'×ñ]%{\Õà²`–táփݕöÕYÊò…•Xè0rýH ?v“DDÊ { Ñ™Åzñ}~†¯`ˆw)ÔF¼Ìÿ1ƒIé‡L‘çÂ?ϰ)ÅT:IÙýÛ¿dïÁýTòoæ,5Äñ×ìÝ§Ü Ýd|!åɧ¢zz+öÍPÕö+øÅƒ;¦®EÙn·A¼îj3;_ÁðFtNö š ä°çdž¦Û¡hÕF}©ÀU ¶ë©Ñeó¥ÀüʈvMNO3€³Ê’›X `ãoœ ”°Ž’­“À/8 [ÔtkÁð] ¨5 "K=•lE2ð(¦¤)÷ƒY¹"w`]ŠF* O1rämÕÓGÑîLG%‡ªÙþö \AÂÒÃ@´2[ûmÇFËj ! ¼¸ÒW`‹#‘( ̾qP–©R$ýq3žÝL¤v3ÃiœqÐ¥#ÄO"Àê­Ã/ÁKËd\>Ñ6–¤}½r”B4-î‚uohû¡äç#çۛ˕(ìࢮAÍÈh$ÿfÒ_‘Ðh'lÂNæ™{\6”ü¥¡ðªb F|© ¢tñÈCdÞÝ2vu8q•s]j•Fw¸Çëv0¯Å¾w–_³±ÆÈßeHÓ%cm3àøªÙÿ4v¦œeW$l”Ь«Í_Ʋ+†ªmø^¬«Úˆ?Ô”"Y ë¶Û:ಒ˙Êüƒç“RäÊìL³2Í€éeB¼ˆghŽ9%ê \LæóÌ`eÏ‚míÓ…Øc´U>ê‰÷Ý®7ç#·ßÆßW8%•÷dT'îìtcDpç Ì(Ø50qV@ãf%ªÁQ\ÒfN°ÓVë¡gùÙ—]µz@}DÄÞgŸ¡Ep@n”Ô|Œ{¿ï n„åÎsEÛÔÏ¢Û7=ÜÑ.»jz‰ @˜@›>CÄ›‰ »m‡Kî07)”ícée»¯‡ R®x,ºªhÀÛvÍšX#èDŠÙ®¦(hM4ëŠ3Nn¬Ñä4b*5·¿\ÞÜÉC½ {‰¦¢ãÅ®¯!µD!äžYÑñœø›¿ ¢ðŠûÚ(ZtV·BÅ…nb9uòB¼´ph›’³…ýÙ´l„˲î,ì ô‰ Úó±±91F‹ß9Ç2€8†3ÚÅp½¦ÒË'”s(‹?$ YPõ`ßN§¹6uÕ̶žçÚG UŒµÃ£V IEÉ#J¥Ae_oV Çåx 2§âl÷6:m²çÎ+ž{‹G°ÐìïBY}¾æ7Mgó´¶ø¿§ HOã w~êE•rQ@…©}²÷ÛvU­ŸÇ\Ξ©Ü`9 ‘Å *ÅÝ;*œò”J`±£*Î-Ér¼¥: ¼êlwƒ”¨kHxÐãJoÄ~·‚J©¨«(ë X5Ü.ÔÔL ‹³.¤)©,¿«ŠmšÒή¡›iÄûz •o÷µyKÇ…mZ '£ H¸ÔÈýj–±øO¥‡á¿Í>þœ½üyЩr½ñó k%sÜS ÇjI†ÿXù>xG/ÍÿþÉI€\®Ò#øãü±…U£1ΘfTØ@ð’ pÄxÆhdOʵšAßnñÖTš°ÔØ:Ù=š‘ÇëX"Ÿ›’qeÀðS œ¡jF™FSâPt•ƒõXáh%çø8§Ç£`–RrÄ%•ž KU*/©gQ2on1n û$ ”’?aC”Êw@Þä0xü˜_Ñ‹@~°Ö€<8+àue/5Û48(´c£À#_Î/”QäYAžþt~Ñ©æâv6ïüJæ f<‚è©kÇZzì©qx柧bcÙe‡M´™÷¶K½S|’nfÎrn$ÚЙb(FB•Ž$z’­¥ÌÈ®ÇSFÑ×·ÜõÎyEIƒÉþ¥f}›eÔÇì’ Ç%¶e¡¼ý”ÿQåðl }õ¿T@n{qÞW‘……ÔyéPÁ×JÇyÕ°8b’‡ž¦èsIøú€*$,ÿÕ©P1¯ý†JˆæR" Ùˆzír¬Z˜'BNèÇûi¬šê—‚€uˆ„„+Ý©oÕ„)Wh{bä;êÈQ¶x\R;‹ÉQоüÌ-ÉM†öåõ%?à ö-t°/@Å1 H©LÍ¥—°ûÅù”o´ŠØvfØwp SÂÙ|rØš±gžw楾’y¢f}™Òc‹Ë¹°†ö¶ÇÍ4¾³<¢ü¯4c¡›ªcEAÊÄŒ’ÐÆÝ’£r48 Q¿Ê³Pª/g‰Ì?ÓåÆÁò–9ž„à 1 '.i`»õÉ®}3LJO8=…£‚v¹ã(%t”•b|c†|‚~C¬l,‡ñЧ½k-&÷#6Êå¾ë  Õ`¶(+¨z:’@m¼$µq¸“t Û÷Øu³ nëX~Aë*H¾»®-MO‡ÈB¬X>ä'0¹`+àŠ°ºéß9®Èh.ÔòhÁ&ñ¨ 1°öÑ‚ÆHTÔ/Œz÷N¤LR?$LD‰*¹£“™)¡AáƒJ²IÅ'VÒ¸uóJÊIâ6› kƒ?€Öao"gû£°ã‘_Ä—Ž9¹Ñá6pý1Ò-ÿ|C‰=sÙkJåCñ!CÆÅ/óm~:¬›ÑŽ$ Ú„TÂ'µܪ]9˜5ìC†ñ†|K"e†3í2Ë@¸Z-χm D`8Ãõÿ̹I86q뎓§”C ‘rL_–È&@}]çêãl‡1ä æú·‚úZŸÜ› kŒÍð/Ðõm'ªí®ÆCUrXc€@Ž“è5h›g6ñ¢Šô¤"»¥{j}R¶ä3Þʼn2À•î÷ÂïaÞØ~<–$¡·ìwJÇV3wÎ’P5z4=Ó]U]=(4yÍ–Ý<¹Ã–Rp»W“DïQöž(ÂÉÝD`_Tá9Sx$,Ñ›#MŒÔ”¤bqä•ÌçÏ.4 ‹ôi=ÇÓϺ÷ãhÿÂ;$‰…$[ÑårPcVPÒ|á,ËK¥`ÎêåÀ“ij#?'³à-5Ò‘±¢8fg%¦Ý{ü{äþ©°ó8ÜrÀ!Ä8:ì^î7:WmáÞ\ L‚ÞÔãòÀÔþ…žû<*ø*WiÚ´)e©»ÖÜ4ÁòñCßIN3Á†ŸïO,Èk¥˜8ž *!Ù£«’~ˆ¬¶ç²K á‰6Û‡ëgÏ9xœM;¼óš¡«%> _î«™û¼t89$ÀÕUwñE¶Ì¶_Iª…ôSÜ÷…¯ ófµ+ý?N99jœÃlÙ {o…€»Tð™sYUHWï±ÈCŽHR·äéÐà>5U r†MUZòNž]@93ãôëÍÂÇãÉéLåÀ÷Ê!÷gÄÚ LêŠmš'v„;¢eˆë¥&ì„ÝotÎlòìúN¢Ó{íó© è'»®­§ñ‘OŒ¡#逗D6geÙ̼%žTò:kœÿCr»Xnñ÷yµ ±7øŠ6b?öªèj>‘Ä®0:ç+Œ&k#cí.<‚»®%šRiàk²ÔFr¬Hr{ÀÈgbÛJâcÿÐEj˜V'ç_gL°÷²Á’ûO¦ªQm_׃!û8Øqæå"gÜr¨_—'Î,”!JÆè(™.)±7SˆKFH]6>¨© ¼®IÀ1Á$B- MÉos Ô³ÅÏ´<ÓÊ !ByZg,QÖúúVe^p;bÉœ_¼Ó~ØÔ´J=°\’NÀ ›³ žú¶3¯DµeÙÆe)©3Ãá×j *u+Ù°ï‹sA¸°·d; Sƒ¦þ²ò h2[qUmç8ëÌFövj^¬}ª„²Õý©aÒ¯{%[þƒ8× a">ÇÙT’Ù£I^v“¼ˆ!XüÅgÒn«¥ G%ÛÅ·“ÿлëÊô²Ôáúpœ5×)Œo­’7õ›·jX-ÂÓyWÈæ]ÅŠ•Þ_Ÿ©ªVâTE£ŒÞ–¾÷¨L[Þ~¡ŸP¬¸4¬Øçšux^²þ7}tôxÏG“iZdÔ%eeþU~r­™‘ ¡ˆ'²™–ÄI“¡® MR¹¾©ÁUy¾>ýôß<È€E endstream endobj 652 0 obj << /Type /Page /Parent 1709 0 R /Resources 654 0 R /Contents 655 0 R /Annots [ 653 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 653 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 178 622 192 636 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 654 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 655 0 obj << /Length 1089 /Filter /FlateDecode >> stream H‰lUÛ’£6}ç+úQª5ÄÍøqw’Úš­¤2•á)©}A`6X¸×ùüCþ1éVÃz/®) K÷ésŽZïÊà¡,cÐP6Ž!Â?|¤E¡¢"Êa»ËT^D ”Çàáq* šüš¦Êï_4´S©(¢5U®¯—àOñld˜¨T´–ž±€4ù±üì|„l#µË1KR¨<â$>@ìcÑ[–s¨c ãH†:Q¹ˆ Ø_áåêæŽÄÂJŒ$¦n‚·ï7ðÇ2Ìð{ĹLe¢“‘¨x¹tóßvì}DWËp'àÿßóåûÒâHåøQþ„cÁårQ2QZL”ÕRZ )¾FX]µ |¤ŸË@CAœå*É5$[Uk•¦€5¦Œ6h‚wå2K¢oÙ¸Q#ˆ²üô•L+Û> endobj 657 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 568 145 582 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 658 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 278 455 295 469 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 659 0 obj << /Dest [ 1466 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 399 238 434 252 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 660 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 661 0 obj << /Length 4432 /Filter /FlateDecode >> stream H‰ÄWËŽÛÈE¶úŠB¯Š€Äfñ-#pà§<@Öj¬,Ød©Å˜"’ݲæCòùÇ,rî­¢H=l`&‹Œ-¾êqï=÷œS?¬f÷«•/”XmfÊþá'LS×K½X$ËÈS/«ÝìþÇ.yÇßx¢ËëÙý‡G%ž»™çz}“ÏÃåaöYþ5sÊgM¿¾a"œ¿¯~š-y†¥Hž.|ÏY¨À¥—Ч£x<ÖýO|©Ì$»²ï>ÌÅ/ÿqî[¼‹ÜH–Ž'óí\<ÊþWÝV‡æ{nŒ›Õ{<ã× \%;ZUÓ²˜Kº¸ô]nmy¦?¯fJ”bæG±ÄJ‰›¦"Vn Ħ¢Õ³Íì‡Õ)Â'Þy6ÆT{”ìrõ*Xh º^hjÆWC>“0p’P/êE&œÄeÕkäÈ)w&·Àpšz 4•ŠNWvÖ•#[G¹©ÄÔ‘Ô"3?ý–qqÜëŽ?ÍÆ Qñà„Òì 5¯úmÖ‹<«Å“/æ™.ÞØ=>Ø-zb¡\?±EÊM¥ä8G6EHµ­ã)yé$@äÉK}Šˆ7Q¢˜i8‰rIS–klVɼzáßÕK‡€ý ø…’·7&N¡’~z1§ÉW³iiGûP!—ÿz#¦†§rRºÅJï°›Hî5Ä|!ö‘™Ÿãåv|¥\åß 1 iûí)M[õ1•‡ª¥¿îé ñv]ÙÔH@*»7—ðIÜejò¾`wÀÕÝJ­# À‚Ø0D¡7e­;‘7uQöX¡›¦¥Û¯±P©‹m"ý*ç?1Æ@>½®{Ñ7 ¾…² t»²ïuA/øºp×ôZìù®ís‚]÷1€XvóShjhÔlp¼¢ßgYÖ„é)ˆôbÀö"3>u28«2~EYcw ˜¯Ã²©IJÕ±âa ¥\tº·ƒN‹…Ó*ħ,Ù:‹µ¤•0Ž*Pöz×Ù Ô=³ª á'®J8ëþ°wÓ‹á’æË,4ö²~Ô¹±<š^©s'¥wÅÚqÅ_šƒ~uÄÄ+”s‘]gDO’ŒmΉîÊW}pL#¾À…<¡¬Ä.Œ˜ãïf«nzÀë&Aš3Fbƒ@7mc¯¹z§‚\ð*`5­É¨u¾E®k€#Ð!t€kPF)všfO%ªƒd‚·Ò^ž‹œ:Â›à‘‰´Üp •u×gu®y{yUjT'’h“¬juV©ÇúŒÉ++‰Î3ˆXKŠ õÙ·úµl^º!¸ŽvD QG£dS¯CßE#(aVXÏãÈñ,röYçpù¯õ› ó-Êl Gý©âPVÏŽö.4÷[¥©±›8”dibDxk€…ckí='tŽYú­e&ŠcíÊ\ M“ ¨IR‘FÔ¥èX°6ÐÃX^¡Øwýè{˜dHucŒçˆÝØ[@6KY¼Ì©ÍHZŸtÕ8Aü@š—ªà QBW`y¡D!c©äF<—TŠŠ»Ü«¬ø6–dØîµGøè'«Ù#…ˆì2NƒQù¿JP"T$w™ª²nªæù8ÇÕµºaFš8=|\¯D(N §žâ`IžUrU¥øŒ+Õ©ûM\eíí3Øò]anŠ2h­ÔÐŽ<Ó9| UšL®åêÝÃÚ¹"êhBtcÚ½œsb¬%êö:/7¥³D˜%ë `-S8µv‘õÙSÖi†ö>Æ.°q&~üð‘Z·Ï¾^>p—ÑïóS· ŸŽ…Oǧ(¼V Réc*½ÏVYoÆÅ$.uØ­oyŸŠ¸áQÖ52Ñsv›LÌß(2¤ûŒãÕ¨¢Êî²&Ò]²Ñ㋎Ð2Ù2_0zäúS]¶vÀ^±ÈR\YËF¤fâ,R>Z ‘+Ç€¨ü¥Ì^·¼%6øîtÓ×dûRò¢„zºdç,©ò„Š?>°U3)£×oy_WááI±iƽቷ¶Zôö{A¡+½Ãh~ð´¥\â ÌØÄnœ†ðvŪcöÓô¯YR¢3ú ‚ ~;}ßôGQU&vfÐßQ8¹tëêáV¼‹A“ãÙ¥ŸÇ!àúóSä±J~ck!àØ±R‘VLv|Mƨ£g{kÝ:=¸p‚âM׸ æ@÷4«Ÿá¬Õÿ|Ñ]Ï¿m›ºü•pÕÔÕ‘l¶¾PMsV_Ó ‹±d÷òd½æQ=-¥iVHu‡Vî\S¿ÿñÄwÅPÆyÞ‡ÞÆ|IÊူKsÕ•æEwùEn~þ;d.ÛWÔzj¸gÝÝ2·A2%Žy¶ø‘b©TgæŽ=¦b·EžC\º‡ëê¦É„—¯[î$*Üx{à &µpˆýHQiŒyknweŇLbç†UfÅoßÑžIŒ2ð‚¶¼¦–d{ÏÑ1nåðR-Wðÿg >IP=º²[Xýƒ]ÛÓ ‘‰ŒÜàT™³PXÞ"k ÷¦U#B•eëwµÐ¯Ìm~X?svRUÓÍEò 8VTå-îÜ{k6‰ê9üÿ½çSä¦\Ë÷+~ðˆú03·o}˜@/(‡žyäñôà—µs'Û2ßÞö¤×€1Ž–¤o˼?;†P¥L\‚íkÀDAÀêÙ˜'&: ýôR‘ŸGµöÂmMX“û¬¹\(²Œ¤·F]›H6ŠÈ&QB‹°bVcô%éŒË?†L!væ–PÆ€™”pS>›º$úÍ·«ÄUê»Ç3öa 0r¢YendzF12ø†èê¶6U‡ À‰‹ª¤¿f»Å‰È¯d~9.»4Ëî+mZ%B<{&ÁªìAäy³Û°ïàÏÝ¥ÔDÎwÆ &͈ISi†2­²–`¶;ýŠ1ä›ÒÃÞ|rGŸ,ɾë3óð‹}'°yŒ,w{ÓÖâµ4o¸G”|*±­ãmiG. mÓ6uOº·DÞHè*>†øöμæGç¹(XO‰3`›¡m|Áa)8® ˜0/ö<X%«('Ž¢Ð2£-f°? ¶kˆ ×UAÙ ¥°Ë2|úã^Cù;Qè×27gBÄA_'L«´\ʯ¥Ý2y¥7Ÿ%A€ªj¾1ï4ÏjH¹¶Ãa'ììPä-ÊR±Ó^?éë¤ !ef{Ú<íayäülUÁDÇi9 `Dðè'=dÆi–„ëæ¥¿Í^ר%3:_oÒ>Wb©ÿÒ^-»A𞯘#Ø„ø¥  öKb9¬/#‰+r—"’²ìÉ÷¦ú1$%ÊF ›"gzÝU]Åü ´ –‚̤ßò(-b¾11áW>b¿šq!èjÜGß &i¬Š²‘ò˜•&‡)ËÀÿì=±\õæRÓO7JLpEå4ãe7Fµ­'t2Ï¥Oת˜Dºâ(F¶A ®<²M˰7_O° HtM£²Š d$,QÅt—„v‚%S\YÔl^"öŠæ/S˄ʅåñ…ƒÁd¹žØOÓiyR(Ù›a„Ä8ä>Ûß™_[‰rß¿žä(#À‡ ÛÝZR>ò¶ÈLö ¹¡&o¦hkáÐ$Bmœ,®‡^Úã,seɘ‘(VX&M¼öÄ¢^öˆ¸i[HÇ<¦šG¾„X™?&„œ‹>Ÿ-ŸøËÕÔ¢¬ÆSŽ¾ã²†¢Ë–4Ç—!g‘ðŒ•êÙJ8⚆ú”õÊ­H‘ë æXòž !öržl«¬eÖŸžPZcA+ÔPLÑùÏ…èH¾ú(‰P8!Á½ã¢š#ñ(ú°!)ßk úä·;þH"qDõŸ%‚‘²RIØHP´€ n{ö~œ%/„˜ØLRNЇ³Çþ’BÌÊgN²ÆCéj#|^˜‚æ‚s•¹k&býÅå HuúàÊhtºƒjù‚†,îB¸ÛRþ»H’¨0õ“à WÁf_Z_…‚ŠÌ(W A…Túð*±{’±Ûe,»¤™Ôc/» ]èLpq_„#ôgÛñäÔóåõœŒ#?š $HGLýò&h¾Ø÷Cwá¸ý²ªkP;’—l öYk·hGemÙÆ¸PhdöŽIpøXùQ|…Qô;ÍËÊ «Rx#¢ÆÅ•Ñë¶•÷ç©p?¹k]síÞÈçJOèeò‹vÌ;‡(¥ãž *BkÅø <ݱÃFÕG^‚%¦í2ôÔ³0ϳ–á×g¸Áj<íJ¥`Nì‚©¬u 1¸º÷§ú sÓró¸3…t²/BQCüi5„þ2þ?~Ú cqz1Û:Hµ\xÍÕŠ4}k+QÒµG8bvIQYóøÛ¯æO¿/¨®&´™\•Ũ‚È]‹£Ùq%t guÍ÷xµü8Ú ú´¡û†W¶„”^C>!EõY’Ø™ÃÉ"}–‰rAÚ¨<¥ô´f\INd™xñòÀÒv¹ÿ“Ìj¡mKDt¤ë¯×Wp˜ƒ_ÌÅâøÄ¬‚lqõ\@Ò¥bå騆ý‘öù 7¹@Œè‡Ä Ä@òZ¦Nò â^_,£z–ž“ø©–Ôõ¹(«qíÝv…áxö«c›Q0ºÐlï_—•N²ºš€û±—±•˜¡;˜à 1¢Š€/s VÔãä(‚ƒÔŠQ 2U;±fKGÆÝì¢D¶¸èí>¯Ýï÷ —^n¡þv¹D>”šχ—5#@0Ag¨[c÷{ªÙL¸fë$<ë†ýBìý+¥Í¢ž˜¨+ü;6uÛ!ïÒ:¶CÚÏù§]¼$F?Ó&7Á¬:˜ÜšÝñžH°á"`|P—€‘O9‘Ì×U2&̉GbÎaÂeœP"¼†­å³'rOzeY×ßLY|íd:ØIzLjðjå÷âDòˆ´Òež ÂØñóâ{óÄãHGžçõ€ÃÄÓ%ÞdoUo_©ûBhNÍïR$¡'ô\“efÉìÚ¢é…]²×¦º!¨`HHÕò‹û âD¯ŸE͉:%òºM … k©üwëê—#@—¡ÓºníÎì‹6ÛõTãõØÕî©5<È’Ô®2C˜’P¤;fûæ)G±t"ÌèpP Öä§÷4ø]ib[ñ¼‰. Wôw7•ÅÆ½e8r¦;s¶oÈ#Ú&qrÅð¬2~'÷œäœíí!£‚Íú]Ž7_ÚÐDi”Ì „‹·‹Ô+K)¾rÁ)*35Y—sÑÏmg²×û›÷<סMi‘9H´mý‚€D¸‘™âI/ôì<3€qò®K[Ë`5òBÅ"s™û:ežŸ ôù•Lš Iâ¼Hp™j$§Êù Oßý=ƒ¨Ry endstream endobj 662 0 obj << /Type /Page /Parent 1709 0 R /Resources 667 0 R /Contents 668 0 R /Annots [ 663 0 R 664 0 R 665 0 R 666 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 663 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 209 743 244 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 664 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 308 590 324 604 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 665 0 obj << /Dest [ 669 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 380 352 395 366 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 666 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 228 280 244 294 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 667 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 668 0 obj << /Length 4471 /Filter /FlateDecode >> stream H‰¼WÛŽÛÈE^õ # š‹Í;)Ã6`{3‹ ìë)ë<ÐTkĘ"‘²Ú*óYÉ·²cwÊ»²±ûªóÎîf¹é+7T¿sÝtöeņÌçòCeúÒ-}9AÅ~Ö¦nNw;õ^ˇƨ§s£òE ·Å»C÷\•µBMc×÷Þ;7êé³þïšSµAèžÊ?5%%àŒüP¤¦6Ÿz—|1¾ºâ,z.²=¹^„jFnf©’Û¡®^ä¦Á¤1ü¨o Š”êšº>œ‰µZ›%¬7êMþÑ,»¾ÍÛVí›i‡]¯:½ß*I¹ãGíìÛv¾E³!ƒå@®:Ñ-’¾D{PooøÕküöµ2õ]YÊlwnÄ+ÇOôÎŒõïÖº‡vŠ©œAj°.Ô¿!ü?¾úe‘íQi Ä—Ùø$©ô1°cYI,”-ø°½i6ì Q¹s™(Œ†¼`ä8›µÞuðCA×`Ô¢©X÷yÅqÞpYö&¯±Š’¢¡hEÎ=Ç UæóáhÚmAÆòá*‘Ì®ÁŠMÞå’ %»C8É¥åÜ4¶’0½ÒC<ƒ¸À…èBº[ébbäû,O‰=øüEaª;gI)±?Yp‹.R ê²ONÕÅ^ªÙªîx²oÑ~½+½êÀ&Ð}moâ½£xAnú­¶v›Š ´î„°‡nšÞ¯dš8X#-6pmЗ Cä²ä×™t"9öý˜hjÇn—@§ E#Ð"1öD½kövy¹7í #ÎvÕþ„æßc;ÕžŽoZ@R hÕyUÝ£¤™Ks’3Q›cÞ^egöY¼ÿ€,Þ8}°Sø\V2Kœjù |æØåèkA²«~D‹ïJûº°«M¼¾ÀüÄX)0â°ÖÇF ¥0ÂØómy”eªÊv¬¿³>û}_xvõIŽ=YnÙ*œ8U71À{CøÙ•õ"—4Ýõ~˜ºEló/¬>ñbÕÂ&ù<¶WCI * ’ &ß0 â~fÝ÷éŠÜÏ©)©sÊ»zÙ5ËÝÇòBLOˆÏÀ>¤µ6ò¸¤Ïô¶4HÕqÀ}A1L§çS5畺ΠE г”Lªä|TSMeš_Ï¿aäçýÀçäö5[òªéq‰Ü’—”'4D&AL:…Iï3‹Kzj¸ºrË@Ù÷÷÷tŸ ÄßcRu;û‚N!>­3Ÿ;SË3{úˆ5Mx&"!0àôµGÃ8…G34XwÙEp†Ž‚WZö¿²cÒ'#àüéóÒ€!.fÇ ½UÜ~àÊ!¥…æf½9+=ÑÔÖÕU¹…±9,Û®¼CùåªÅÔ¬®Ûzw5µ™ 6YXôîáÿ~Þ’A8´nŸ;…"ì1~ËCu5Eq^Jæ ]ŽÞOwjêþ‡æ!.ä„ÚAgb|Õ,¢jó©—ÓtÆ{Á0·‚~n ;D3}W,ZWò˜äôAî!׈9:a‹æj”ƒr§¾‡c®\IРyœ'g€ü6ý+0>ÎkbµÕE8Iãe0± '¹€àÕ¸Wv€Á€ñõ{´¼}VoH`ýŒWýÔt,ˆ|ìH°'°ÃP[€RÕ#ùö'žœZÛ[¸Ìβ‚h}0$3¥Vùv÷71}5Ñ¢lšÈQ¡ðDÓC s÷^ Rï‚T®†ö%©øL*™%•ùJ_}…UÐKEÕÐx‡®<äǼFH¡ÕÉ·ú Šàúp~^ò¬ÎßPÉ€ È@¾Wó.˾Òè˜HMµ+Rã*+ËåŒf‚4-°'¥¢OAj‰Hó¼I(ÐX+[Юg›ƒ¼‘§³ uðÜíÄÿ·ãËt¥“t f'I©Î½þÕ36ñA'>w@ÂðþUqޏ§…ކB«9ꀛ3,n¡" o+Ñ5N‘Hs. f¤6qœ½'àíLî$X³+°Æ#4§Y1Ñ‘âÜçöøùé©4‘P2þDÉQ™¢±b¶š#«õç[>ù¼ 2©ÙÓŒ!EtÃê‡GÊÝÑŸÙ5ÕjSÊצè’½&ìøz‹› ¿¹xSà=„NDp0Ùt¿|FG5¤´ÚÈnö©,Å©Œr÷ԮĢª”eÝsgºÚ±9kÛjõwƒ)F‰Â‡Z1äñ%¹ªOû†ÿp4³-k ZÖx ä/üEùQÃÕP~YáR‹ä¿7]^ZËöcH¶Ô ¯hÜwãÿ„Åš‹S¶Ð¯ˆ "0Ñ{¹á¾÷…|!†` † '¿'_ˆ!ú¸LG‘ôåc¡¢,£p`Ã=p%W@Ïñüè@&ü~²?»yúüFá‡ÅÞS\>ë¯q®Hõ³™O™ëmd¹êGz³);žWƒÇ¿}¿›SÈ„ Lj}ñÞä5y|T8™F·:¡ÎKûðZ}£~k{5@“¯fŒ>—¨Ö¤z4ˆ`ð‘ì= ZÔhEÕ„nI|\)á˜`6xŽ'ŒÐ&úUƒvôCЉyT0;ËÓš{“d ?”ùh¯¶·0úÞ_1ø¡ƒm,Y¶å¥)”&¡’>4OÉRÐZ³¶ˆemmy7 ùñ=çûFKb)% d-F£™ïr.¥>Ô»âhAm‹5*Q лsl´-êƒ+E³¡±ìݳ·9ųTUÍ4 µ_£4€ìƺ{qtÙW³Ýó86Ùt–V³01ÅÐ<….[p@>}I5$ ±ã­TÞ½4þMVÐMà‰†x(޳Eˆbµž6‡H»Y^×r|Úb[%ëQ0!Wçlwœ–ÅôAïëa“˜uꘔÃð¬h7Œ (ÀI«Ùú®ubžöÙxƒoUí6H ô3Jd#¦,Lž€ÇÊÓÅç{Pf^¤J­š{¼° ¯ymÞðZ% 3Â-¨‹'Õt}À¹—½v+ݹÔ0¬$ ‘†<Üãøyjâf7±/ñ[Ëý,þºòêÅÂÀíÝÑHµ³ÊKûÌ,ƒx·Æw  ¡cñ¬e¼¢¦r"_9(ã®—(œ)J[8lŽõ“³Œé_8Š\w‡žî ·iSK<ìŸ=]€_z¦³&#Ÿ”¹d.ÖÇ©ò?qhÏZ‰íLX=7‰Ö¥IýE‰ªZÚj´½´Ë¡ãuõ\͸—)‡ö<]™Þ¡Z?ÎI©ƒôeþŽ™«Q¿–,rVg§[Ñ#ÕxU†üµ"Y×Ã=js´×¿°õñ5G~Ö›§ö·öú¸Ôb™wº¥«b-T1D¬&L&ƒÏ{Õš GÞÜ}iºŸ²ÃÁ7,1èšCÁi‹è…k›Æ®gl«‰ ƒ {L—˜¯!„Q´öî9e±îD×± ÇOÒGªüP”õÞ)ªžŠÓ—‰F~i{ ôÙú'ú7Sͼ;R!4‡Ò›Z¢†š>Qˆ—€¯«€wÄ!|‰;.z¯þPõýœÃ¿R†+ïÕ´ ”Of¤0û¶¢sèPß•{q0¦%x5ðæ£T="[Í6í­õa>Ûm!t~<— dô5=…³UÜz­©œ bߌl‹ä#:½xÓŽªc¬YGlÃ[?\}çOاFJס¥b¿£êëkØÄ¼úë¤+÷Ñ×°“1 Ed•ôâ–Ä) Â{áËЫܺUdLQbÛD/eª©œ‰Üùk˜£Ç~Í-þÛ¡û^µqzâ:øEMq×B€ÛŒÐèË ¬ý¥øEÑ ¨8w å2¨8?E õÁßé|`eB‹¡w º±GGÁ,?ŠN¼s ˜ãåtfÞé×RÚKÿ½¶ O:[1 –­~õG§æ@ %29û5ØwÍ,xŒ†Ã‘ê8ËÎÏ%= Mâ9£+Œ•#!®{Tù±0_ÀxF§â"ˆŽ-¦­w'p™fôãÞÇŒ¾éÏíxdòl·/‡q»«->[‰˜øT— É^ò;n1¿@]ã!"ï¨Ð“³IÑŒ9K]÷UYºæÏÌ‚a V“œ*CnÍS½êGöœ§|z© )>)°ß£GþD†þˆW˜H"%½ «sóqHX»µÏø—çiúqL±¶ßçùY®ôï'Õûš Á΄ˆÒ|FºB dInŠí\‰qüĨqSºÐ Ý›wwTKnoˆ~OáÑ<çzÏ·"uêÏI¿˜‹#5%âZø P{zQªÊ)N¦gÿ‚M«??DPhÈòÜ¥R‰ú–Dï7vë\Ê´FôC°Bà‘x¸¶ú²fK[$òc_¤]&ƒQ Öµ•P¬ZŒ"p³f”Å5@Õ‡ Ûg¡úFBØôẨÞ9JoVRâ')ݬ…nžn¼B]W µ)ÑMƒ§RÑ7=U=‹ªHsª}{Í(óÙjÓÒÜq­¹cojÁÓØa¨iBõ´PÔDþn'xkodfd«7¥|h"ejÉ»€êR&tüÄ* l/+q“”æ°ºÇXÇ/ª‘„·4ÛXD¨¨þW…²ÞŒ> endobj 670 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 671 0 obj << /Length 3844 /Filter /FlateDecode >> stream H‰¬WínÛØEÿê).üër!2üþ0𒨼H‚"V ´›¶ ¥«˜ŠòJ´}Ž}‡¾côÌÌ%)Ù’Õ`ɹsgΜ9÷õdôb2 U &óQ*ø‰óÜós?UY‘xiîGj²½x³ÎÕtÍc|µž6£o¯õy=ò=ß§1Ó‘Û=nF?ë?•Žy±þlè7Ô*.”ó÷ÉO£‚W(Tæ{EŠ]¢ÜK}Ù„y-zJRYê?!¾º¡ï¸Aä¥ÚÏÕõƒºzhÚ| µq°’^WkõêíXýí¿Ž›à}[â%ºr|=½««MÕþˬj^$Òe3sÜB«ßø?;ÆÇ磅¾—âer†oìÁf³ñœÈ ôšv5´-–Æ–}œnj?ÝðJç“Q *5 “Ô‹Ò@E™—ç* ¼8V8cœ«•ÍG¯'}0¢CüÝh ¡ö)"ðròËèÅEð8_H2K ¯e®¾¸<wvúÃËsšò9 T–øUìÖ'G­IÚ[ã0*¶í‰Ÿ{a|pús·7b…„³•=ë3žíŸ~ÄÜG…áÀÆ öüøñ±öš_ï/.$+)Yqâe©M4°}Ñ#ãÝnˆ2*›µ“x¹>u\›j¼·NˆAªšžò…Cr S Ïßñ·3UãT!«“Rí ’¤;'ê“>q2ýJ]U à\,“m'hÐV}D]}Cñ¶x7Ë»z†bk§7RèNâòL×õ¸ÿD>N—‹Û’šI¦+ù¼l”}RS;’=ˆº°ôïöÃòÉñØÝê- §eMÓ¯Õ,±WÅo­eîĺú:VvWžÅ.í%bHb!‡¤y©´Út«ÕnpL, h–­5µc9èô»‡ö†Òq€2÷¦á®[5öØV5¤zhÒ±4éÜ6éÆös ±f:tŵAðgfoºüA£øAOgë-67R· ˜˶lå=§eCçº&Zž¼Í£ùcÂ$ãïf¹iºEÿÏ¨Š²ˆõ'AÖªî|XÎ4m%Æ.0$G²^ŽÄE_oíˆ=q_6’oP”÷¿ù)<}ïj‰Ô!ØÒÊA+3™XŸ!³ýÓ˜íÞ ˆW”o¶’gÖzسÓ˜·¢ç‡ÅÄ!ûÂM²ÌKãoVIjÜûHàÆ„5zÓ"C!*$ï¢-Ö*~^\8|\ïÊêr?æãÁ»X¼ãÂMhùXSt#Ô)‘IܳH8V×w­dÙÔÛgµëRñš…ãB¶i:©«–Øjµ±öœ‘ >'¶N© Qmf½®˜±UYCÍT»‚ºÙTíÍ®,–³jþ@LW6[ˆ¯«ÃÉ$¶iåtûtå™’W\ÊŠ”2 €V/ºƒCü‰?™99QÀåŒx‚{ÍÜqcêu†-«5úÅ”mèŠ_;Ož¬Û>ÎqyÚêèÁŽÀ†ã‚š óšHÅ. ¿ðÇ—nDZ0%r¦G"0-ø±ÿÖL­>´ƒ™|K6S–¯¹a×'ú ™k±Í¨ùÑ„þH5Z{Éou½ÜPÈ-Rº¸otôN›ÜÉ«™í‡ðÓ«zžPpEÉj<ÊëéS„ ´«ˆd_\ØLøƒ ÖKÜÑv þcƒL™Lr›=,’Ÿ J`›] °¼5+`¿¡ËD,ÌécOÅö:Q¿ŽÜÁ…öþ’V¤ßŸ;.•{vù¢œôÊ56@h á0×3…9 þÔ:ÂuÅDú‹£îß`.µyZj‰bÏi0Ϥ†AZÐlgËþÚ ‘|V1®ÚÊ>­Õ’¹ÌnÉ'wùÀ»Âî)Ì·aE¨Y8„D@ô“®«/Æ‚ð’eãä>«3ù|å¸}ç—WåwÌ‘PW~ͯ?aÑó7ƒ A4íô“`â 8!¡óXÍÔ¬â÷i[é$¬ÒA¿¼4åÂx]Ò›õB7—´D¥Å^˜ÿ~hnqGȼ¢„jî-ðïÔ.`wF—L¬s4+ª0•ô`cG±ê·J¹€vP Æ½æ&Qi3[y$Âw ý¡¬ Ó™° ‚YÄ52ƒHB ÉÉ~ÆŸ¼a ==[,±£»XÊ,eâì 8ÓãÄáÿÒÁeóO(õб'‰Ù[çœï¤{Y9Á–iH;}³‰Ï(×d}’hL=šç%ÁiÎ~Wšó>͹M³eÊ/æa³\Í%‚¢ØJòSµÎ÷5È\—5§ãÚº&Ì„¡¿õ­~:E:ãôeÍ’’<`Q@¼]276Ââ»jÊZ\·¢Ê•]wS )³ •Ær÷#t{¾jáÿ@b@*¶@ßÕÊxkp¾¡±)›•©Í¹å祌U‹»º­\$;×â/߯Ðûo<´Ý^+ó˜;>@k³I½:ûHíþM)DÓp³Im“šüp¬ºywŽÏì@Xdú‹ Œ½(ÛB¢Œi îäÓ6áÛ[YïâXÕv*õ?Â;‰ëR½Qi2¾Á’24.§Ó )«fÔŽ°Ð~·>9ãýâ«¡èî[BzÍ«¯ØŽ[]È­ŽŽxrሠ¾ð>üóâòãÕ^¥úäi%f^­ÄÂó¿AÆ}%ƃ´ jÓÌÊÕ©ºš¼¢ê ôG9Íd¬Î?œ=QíÔ”ýg´‹úrh…m§©Ëº*í'RV?–9½‚ÙÕ.ÌqÖtþ#ÑgOc‰kjzTSà`ßÕ‚´—©éN,ÑfÔÅ+R•ª"./é'ÕïD«þUlcõöò/b?—¾ÿái ÑÁ‡@*¤ÛrtdÍË.Ô‘´lfâ0p*Q'E»Ð2˜‹­¶£Ûÿ±^>;mA¿÷)öD7Rp½k;¶EU‰E „&pj/&¸4RbÓÐò"}ÞΟµ½± …C%Ûãõ|3ßü¦‡Ç WÆ|£6>µÊÀÜmnËq©8©Ÿ´²ÁÃr]Ü]aŸº+rt2CÅ`IK„öw=Wâ¦ÐÖBïçÏDoÐaud"'[ÒÓéäê¢ ‰®~žP¦=^Ñ"´@´HRqÒpr|™œN¦£dVmLí<ÄŽ¿7:þŸ$àGxNèFF‹(râ`®ö@ãj·¢ï#ïø&ÇZ9NŽÇ½jaºµ ºKù`¶º#XÇ\ád™°ÊÒÜšËb¾ßÆa2Ðü0ë)t¯”MŒ9<ª&À l9G yeîÏVUÖ»Sãƒw¨VnžR£NCèš”j Ž{µ ¿ér±ÿ^¬¸Šañz#ÅíX–â§WϨ­ï¬Íg;ÍŠ…Æ¥6…©›­xyYC»€L¥œHÕ gË~mˆ¬¡iа~/ÆðŒÑp_‹0uóÄ/Hx›‰ó ·ba¦MVpâÀBÜö2“ÀœmæYuÉûñ‰¡Ô·Ç œ•fF‘› ·[~2Ý,Š\”‘3{:QPBiz…¸£ÿooŠCð¿È¼ÊQö¨ë˜Cœ]ŸË¶^-;øvØE¾Èo¡¿€`2±N©Å|y‹ Xÿƒ³ vªÎP¦ä1¾6Ú‚ªö ùz¤a(ð%P $rŽÏ‡G\ËõUO]º1^Ý-oŽ<¨NÞ.e,+üè@raDéê&HIq1o¾šB̓L·Õ0ÿV¬Ä0›g«kSšb°ù u e«±p”¼€ì‡’ëi÷nOÁíñ1_îü"GÌ2³ ¸»Ù×v¦Ë{8ʆÆ(ZÜí„Ñ€|ùáfý]~ï5|À íRnnkÚzYüvð¡äòÝ¿=Ú_ˆ endstream endobj 672 0 obj << /Type /Page /Parent 1709 0 R /Resources 673 0 R /Contents 674 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 673 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 674 0 obj << /Length 2965 /Filter /FlateDecode >> stream H‰¤WënÛØFÿê)ŒnpXX4ï—ÆÀ‰Ã…cok]ìºhêÈb+‘ªHÅñbŸcßaß±?ú͜ËdÙÉvÄ"y.sûfæ›·“ÑÑdâ WLf#×þá'HÛIœHÄihG‰ã‹Értô®ND^óGÔy9::¿qÅ}=rlÇ¡=ùhÜ>>Œ~”ßeÖØ·y¯èד"t„õÉ_F)ߊرÓRüÄŽ-„/ðø.z #}Õ¯¾Ž=Ç»¾I'wâæ±læøâIeá&Yµ89??üׇx_c-´CYXŽÌç‡âæ¡h~Rë_âˬœZãTŠ_ø/+Ææ³ižcGx™œâkððð`[¾íÊš¤*‹«!ÒÆ£ëróiÎ7MF®(ÄÈ #Û\áÇv’ˆÈµƒ@ÀÆ k5šÞN:gø.¶8ÛÞè]íG åä_££÷OâÕ:2SŠŸ•Л½2Aæ–É$\ãÛ±“xtBÿä. …v¦Gòɇ“ïo.¬Fÿ`=yv(>œà5‘ß¿»þh¹.ž®¬¾™À7ÆÅûàæy6ý‰L¯—éi™â÷×X‰<+EU.ÅËe襩(Jñîü‚å‹™ÈbѨµرÙ"ÂPþ?^b‹8½®íiMÇ0À÷ÄØµ]Ÿ@ÐŽ{”ÇZ¡ã`v·{òÍ¡¸Û4¢¬R¡5Ú5VÇvìé8è[†º¾ªn10ÖX„YäO|f§¡å~÷l*Ôç•~2Ó‘г* %\*òªäÓ÷}$kŠª4žS¶˜ðæ¹åÂØÎÿ™¹]¬Ì—Í´kï¥v³ó¼Îyiï¼T«[LUÙäÁZaÉ•¬zÀšF8Zª Õ“zALÕÖþ²(ïE&–Ùçb¹YŠ¢QK¡› ?)q+aãÝ#°ÈFéÕ[ËòèºÊ\»sE^mÊæPèE¤»‡#úàŠ•±ÅRmÕØÂˆ7 i¶¨!Õ…Åc ®G}±Æ¨¢TEB¸ròlq}ŸŒÜ¾ë䉱E½ È/ ÔúZB¥Ëkƒ.6z½¯(%Á Iµ¯Ãš ¦Ð¦¶ªïžA¥@Í’/T Ÿ}ür¹ðž/c?°ÝÖ×qÇÔñ«ÄÅ‚“Óú/'Ph …7(è˜x/gT+L™àq£š†ÒNµRjúœúÏ&[ˆ¦‚R·²Z‹ƒf½Q‚žÀƒ[K+?ù“‰~ØrÏhYoVÐPuMý¿"#dÀM¦!’ÓòœçÉ%ï-êÐ>Z‘¸¡ßPògþÓ_è…ºzšŸž ’Î ùSfÛ©ƒnô¡r–ĸ-¢T"ê‘@j.¨ È"ù`¾Ú» ÚqŸ_N/úwfZâFƒLsL¦¾½þnrA˜ŠäõÕÍóyy¶ìÜĹ=¶ÜA¿1ÛêÔu—LBc¯îç²O—b¡ªõ §êîÙHäm\bC™´]Á Ò'yô5)ÔwÜqoáÐÀ­ä©‘ µ(8¼hMÜg»æº›- {¥uòc•Õð„¨›5eQ53Æzvl·ÒÞÏF‹b¹Z¨%š©@Is§ò¥Ê¹Á&šsÅ9}Ëë¢ZÑn½Y74êW¡é¸þž~v7t‡f =‘G•xÚT\;z‰µPb ½ØmÌ ®]Ô.J¨Àöý$úµeºaŒú²…aoPÑç­„ $„½G€ÐƒÁRÖ<2d¼ôÙ"nð<'í…ð¾7€x¯½c8×ßçª{`­GTƒP0Íšì.«ñ™¸j(y@Šd3³jÝÂßµa6 ì‡T*÷Q ·º\SdHHµˆ®DLõ|É%¤æS‘áÚ* 8~¯aaúQ"ßµ Å€‚i %ôö\Õ¼\™œ‡,=¤‹ÅrCœ„¢I¬‘IÔw/±†™«iàEñoe¸¹/‡†yÛ…îG¹ÊÖÙRQ…yäS4èï¨ò¾([ËÔq—ªx–çš´¬šZ,«ºܱb°cVBQ­’±Båá¼é[g Ô§[‰lœm{¾gÊe‡Ã[Šs.[Í+hDi–SýòeÕZ`øœ‹i1›ùfA¾]¡ Á¶y5­ÑüżzPŸ!ÔYµ@B°žÆÎ'NÚOÿ5 o˜lC†žO™±r¨˜ÏWLâI©¬8¡lЦ0ÄžãÙߤK”™«þüÔ1}áåÞU3êÕŒ´š¯ÎþúšüžÄŽü^â;R³„[™x ƒÂüb#$—ú J~R-Yør:¼* ŠbAâ¢Ð‘ÿdyþ®6®|mªÈØE@þSî×LU¦3+%ȡҷ¶¹Æ6WKsµm.Ë£ü÷|ÆB=!ŒÛGmá9f!ta¶Æ†¦0ôMkèýšê@ûµÅ¡fDfóöœÕÏÅòü¬‹å›oQ[Ùž³ˆ°k7Ð [üûåX»_ ön „#Î^[)Y&ÖÐ'n]÷Ž@5*ò[˜>¨øˆyyÑOÓïÕ儳ä5×v~[X,Lz™$ÛŠGÊ>à_І¯5H« XXcÁcÃÂÂq‹­B,õßm¶½%¾Î {’î’!á9ðù1… é AòugÚB¤Að¥ìXß›o°Í$9ꂯ-O¤þûIg}¢u¤yû­Ö_õ qüfËzâ¯ÿ¯ÍdÞ<íÎ÷Ç»÷kXå³ÀâÓ k\å÷Ù·‡î¼zw}Ŷ¿!Ó¢½®³‚$-f©²~)| ïÝÅi>ºrз|½;¸ªcµµ.ê¬3>Œ¤y{)fšüws€Ž™1ÊrþH¿Ü;­TÍ3‡‘þ5¶q˜:ÁºÍ _¸ ì¿o›íƒJuŽÊ–«×âKˆjô/4 ÐÉ8mCwrujR‹Ø9Èò\;I»í×£p €þ¬­qä3DtÏà÷êòã„á !•\â|Q3ÁŨQdæØ/‘:"Š)‘5ÀµlŠY¡Ööþ îé„W//Éï„ÇVàpÂÊjñ)[l4÷VL²‰,UÜ”¯RNøòǹH¨%Ñ£„‡)Ì¢zÓEÓÞºÔ£ËmÑõñê俆èn ϯÎNYGw ›æ¤ ?-]& [ZêåNU^0‡ …°hŒ½/ÕôÀân=¤jþ ãíESJ"§Ó‚¦ÅÃv˜ùd¾“+M[Ì—uC³«yi'#ü_òtrÅK)&ƒqDã<HCz‰‘šå—%Í\zÂ~kvW#ê⾤“ã¯,^?ß=Šæ¡º=y_4b®>‹rÃÅuy‰˜0 âô˜æhba¡¬[2§ø>7ßפâvšËéÇg½™óÓNŠÓÉ K{g¹¸çÕTÄ>NÞ“¯-’5ê»*sE£g OjyµÆØ¹ªÊ)ù Õ6‘9–ÀÇ´ñdQ”ùâ…W±jÃ0Ýýš:â(®,_Z²”:èè¹A¡‹kˆ!ŸwÖ!hb5lгN§wï$Þÿ²È@D6FÇòGž·/* 3˜×Qæ8€{ó}îƤbs!D"îºC€È‚:x¾—5’™PÜÆÃïØç dµ[+Ä>âĪyõÊÜ%¶Û·_Ÿë{x2¼ þ}¬Þ&[práÄÉ·]A¯¥&Äӆ㠅H-§·wÅñ9ZÛ„šÊ”ö^kþNkCaVPTÓšûÙóøGW b>DåÆj«*iò¯}biÛ^…šïí#/ḙԲ ³Á<)ó“ÿGe]Ú°³Œd`²êºJ¤“¨it¤Æ¢ƒI¨QB §Ù‘F endstream endobj 675 0 obj << /Type /Page /Parent 1710 0 R /Resources 680 0 R /Contents 681 0 R /Annots [ 676 0 R 677 0 R 678 0 R 679 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 676 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 468 569 498 583 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 677 0 obj << /Dest [ 669 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 238 542 254 556 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 678 0 obj << /Dest [ 910 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 376 481 412 495 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 679 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 190 232 231 246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 680 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 681 0 obj << /Length 3331 /Filter /FlateDecode >> stream H‰ŒWÛnãÈ}÷Wôc3ÑlÞ¹ð\v0AÖ³ˆµ@°v(ªeq—"‘²Gû!ù‡ücrªª)É’<;sɾVWÕ9uúÝôêz: •QÓÅ• U€¿xÄyîyª¬Hü4"5]]]¿ïsUõ<&P}Õ^]º3걿 ü  1ÕÕd|}¾º×?—Þ$òcýhéj•åýkú·«‚W(TøEŠ]¢ÜOÙ„y-zKRYê¿!Z'aàMLä§:ÈÕl§îví°DK¨­‡•t_÷êæÓõëÿ¼I‚ï ú?ѵèjùFÝ=×ÃvÓð"‘.Û¹7)´úÿ²a||>Zø)>¦ÐÆöìuêsH#“B6‰âØ#ëæõba7¶êr¨ÛG5³Ã³……f:1ºU§Q)|S9X•ä±_«ßDåer‡sš‘Ìà˜h¶ÚM·1~͉»HœmúYtlWt ²1Ó¼ ø!0 9@ÐB^ àé¹ìÂ.““üº××ó ñÊô„—dÔ G‚<$èÈË VÌÉ dΙY;$æ~t:G(êÍ~äaï§ó‡bb¹ð&Ž ,”WzÉ:®~ðN(aúqzä®Ë¥iºD­à¼^ÔHó’(ɪMÙ>RŠåìÜ í€a¤õÐÍËÝ"Š gâ¾9J¢0=ÂØÌ"¦F/:,›Ã1çïK^c¥Gù”¬Í]z`ÿ^I Ĥ¥‡$1zøÎ%¬“0$nqtó"9Ï39ŽG+ƒõBœ}ƒ2—èSò2~ç°Ùç°qxåj_hXêÞX.£˜²ÍÔ–ë¯<èÛî–®qð U7­¢raëz‰’pÒ|]ßQ§ªWëÆ®°ù³å°¸áj4„*m­Ç%úÑ£ì_ Ü„©Ü,Ç–¾I_2“ÙGcΡ콄ù™ê=ÅŒX*i´´G¢7OX¿µv.­®³rõš-~ÐnŽUoG8F¸Hô_i‡·´óà±ÈØ­­ å.ñ½Lj¥Ô>x¾ºi&GL}ƒi±oËÉÞ Ë¹T~¾}Ï«ä<ƒ¸@ž½ûøã—|TëÞnçÝ%^xP«²Erª-ÕwréÜ.ê–#r™ë“ƒ‰XPÎú®Ù"`oÖƒkTF' uä+ü“ÒQÞ|YÐêY±ÏÌ㔿njPß9!AÞ†ÄG êø¨ŽJ†þ}¶ààÎ3ç“GB/9E1¬GÓÒÉ 0N0Î S.ÀK`!×uÏJkn#²D¤g‘Ö )US¯êAI_ÇC7ÌU…ø- ,êyi[5'ÚH8KuÙÔÌ"¹~d]&ïjÝÉÊò+›Í Œš’–}¤ £¸P6ªnö›­“‘~aðÖ#áR-/Çÿ´È"þ”Ì`»*ëÆW#; ,J ÁCNŒÐ4HV=ÔàX`Ä?3‹s![PªáK¨ÆÕ|„*D+´ÖÜYr :gTð§ †˜¬På—®"Ћn"M9‚ö¨é$#°8;˜RדÀ\ë¹k‡a)vÑãçð§›Þ}þõœ_C3Ñ@Jчú¡¤ëë?¬džÿ]¨LPٽʀî?q\PÉß‹„Äé˜~@ \ÐíÜÐ>žŠh¥øt‰o‰éHZM’d|»¤Z'„!DUmv_MAœûj=ÉRzNaî9â=¨m[ñ%4cT)w>Ïô/’m¢6ލßÎgÅ@3ÈœB¤½å³ZÖöIª§·HæL‹ßJ“•)ªåœk°%è[<³ÌÝßBäÖSÝme†/FsJrCË‹K ¡Ící*Éi6¾¢>¼ûòóÔ›ò>³5_nïpyœPI#Qœê?ËÒÞŒ>ß*Ýeåû’3>Rl׸ÀÑ™p•9‘@¬,÷:Í„‡ø¸LQj–úŽÝ’ LŸ¡è~ùÜRÊ"øšù:Ñ2@¨BÐÅ/GqÄ•J>w‡¶Rö TNÕ@«ö@èTàt·[ÕHÔð™j;×*+¹Ñ£•ÁÞÄe É+ïnÌ¿·ÄŒÂ_ó(ºÍ#ì¡9£Ë×KÆ þmáº&ö²ìbÛpΆ,ëÕ3#a¼KÖ(lDÛ©O¿ð­ƒ+K>¡Ëe;+QìãšÛî÷ú•Áœ§‹ÐØ+8)õu[žp=»Tɧ~`UKšŸT-P‚ƒŒ ^LÌ•qÅgï—ݶ!¤©aÃB@‰s¦'4dzåëÖ×ÓMÚØ•ǵ[t3ìˆ{ÄÕß)ø€š³(,ÉóÕ[kÛ ˆB;o¨ Ûm½±ómÅv.uuTžÀÇÆ•¢¥ˆÅWpoŠÑuôF†Ü~¹¡Sdz:¥J$ °¥Ä 5áÞ@M®Ø—†…G²ß}Ì¡^œE†•ôH5ñƒ4¨qå}¸ÙŽíøê·  (Õô¤+šëìùC qØèÅ­¿”«½U½Ow£¿‹j£:¸*¿^¬„&À‡êXXTÇâ}Þ##,Ã&D†&É“JÒK+¼R Ñ—¤'‰S§%*ùaÉêŽY,FI¹¼„"Q#Ö9Â|nÌA£RgÇc‰e(Hév»šY÷ÝɌȤ”Äȳ‚;ìáÀÓ\3#ãA»mÜŠö+PêdðXcïõ|²*ÛÝ~OZoÕÉFÄt˜ì–¯ˆDYª•;”ü–¢!÷'uÈF±j;Ým븬~iMP“9TɱٳõIC}“ë­_ÆÚâ U'o£¾ñC[Æ&;±Ò@C¬å# L#áv!ZkDhHÄ\·_É2QûoÜ 7H”ŠštÿUbM:w=”qK—õf.ñàó™S§Fž'âMªÝÄfž/0¶knVÝ`‰cCòõÑp‰yÂ¥‰Q°ÒòI'gD˜ñŽ(†F …ŽuóÔœ‡Hƒ‚¹oU½*vã„~§ÌN3ïéWkΠ›E›%¨œþSc‹Åo}}+/“³À¥ƒ3ÆB.Sœ]0CjfLM;¤¦ õ­b³8¥fM·ù5MüQÓ/ß+ï>ô¨à¢ÐðPý!!ª)'è±nÃöºøŽ!Gº5hJɨMC¥J“`ZÂÉ7)X­7 b<dÈÇrqë$¡ ×â‹—Ð Ék%©HáÆf' 5Ï_ ®­‚ËoGáÐŽ³’L¤ð¢¡iQ“Á¸CPs%©p5òpÃ0Õ§·~ïa¡c¯n³t XXﯶçZ+"rGËà§Ø²&q/y¯ÉÚbkàV›=¥£úå|¨O¯wzªG£%KZÆÏÆÃ >n~|7÷ ìa{“'(!ÌŠ,É4:´š_›ýMy}Ôºn4Ó¥ŒÛ(_Æéìô+ÃÝÞXV ÌO¾8ümëéZeAî8GzU•åj±¡èÑÈr²Ç3š$,dpŠË“?Õ} ´î´}Rúi8wf@ôüë!r2$FÑ)$‚ðW€‘6X endstream endobj 682 0 obj << /Type /Page /Parent 1710 0 R /Resources 684 0 R /Contents 685 0 R /Annots [ 683 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 683 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 474 674 490 688 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 684 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 685 0 obj << /Length 829 /Filter /FlateDecode >> stream H‰dTËnÛ0¼ë+öHC½% (ФMÐ") D§&=04m«Q$C¢£¸Òè?öÐ%W~´µa‹ÏÝ™Y]ÔÁy]ÇA½ ¢$~ñ‘–¥¥Ì¡¨2‘—2ú98¿KУ?#aÔ]p~}Áj ¤ÒÑA¸NÁ=û¢x˜ˆ”­Œ{Æ ²ø·úSPùRT9¢$¥È%ø±åFYN¡~ŸÆ’‡Q"r&KxÜÁÝ®³k\‰™á‰Íï®Ïàëof8p/k¸dz}wSc˜¡õA¦º+?ý¿OÌ—ïK‹¥ÈqR¿Ç5ŸÁ4M‚'"b£C5C#¤À¡Äêô¼´ö‘>ÔA q–‹$ )DYB‰4¬1-a0Á2¸¨d$‘³q¤Z:F0Ëúû‰L{þŠ\ üÑ'@|Ô"¦ô?÷Ö€]+ Óºi ôÛú©I†<êÛÐmc: ›¡_lµáYíÜä¥YØŽf€¦³fX*ÍsQ0Ë~ÀˆfÄ`ÛôÝx¶'1Œfç¸Ã ¢èŒºdðÖ¦~à)jùÄCG 8kP#æÅÕ¼Àý[ê¹G•æ}!ªmûiä™(à¢ñ§)&*ŽJu+—,”UŠ¢n1†‡²kZ3<åŽÍÎÍ ™"Í©H’²š—©(âÇã³U0^"EpÕ´ÈØˆÄ.d®nнßë–Íj;`ÊS޼ü½¸ÇÌ ß“G‘«£ÈÏxXWÎP2ÿ4 OÈJxÏó¾åžÕNj7ß|4@£ £›es CT:ŽCG²†¥G¯ì°¤”uV½Â›30PˆÔcÿÂ+7àâÔ)ÉÁ)G£ìMÛ¡¹–(=Jì°Í«ugLÁõåGž±½õùV´iȘòëzZC»9g%lÛ.ÀûïY=Q¹"csÌÏÕJ°îÝѺ&q> endobj 687 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 475 88 489 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 688 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 439 283 455 297 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 689 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 690 0 obj << /Length 2294 /Filter /FlateDecode >> stream H‰ÌWÛŽÛF}×Wôcqx•¨1ˆdgwáM‚XyØÍ‡jIŒyÈæÈò‡ì?ì?æ!§ª›G#eÀÙ]‘¬îºuÕ©Óo–“ëå2¾X®'~ <üÃO”$®—x31_Äî,ñB±,'×_¶‰ÈZ^ã‰6«&×wï|±i'žëy´&›LûÇýäGù]êLC7’E¿q(œŸ–Ÿ,XÃBÌ=w1ƒ•0qgž1 ÖEOñ̨úO€¯ÓÀs¦~èΤ—ˆ‡ƒxw¨ô_©h’mÞŠ×wWâ_¿:Óï d±ËÜñd¶½ïö¹þ¨š‚•„2­VÎt!Å¿ù/;ÆáshçÎð²ü ߨƒý~ï:¡ëË–¬*2 Õ0éâÑCt™ý´eM_/'¾ÈÅ$ˆgn8óE8w“DÌ|7ŠbŒѨÉzòf9$#ô±Ä{šcª=ʼ\þBÙ‹\/2gÆO}>çQè΃QB!³ õNâŠ;U)JQ‚ ÒBÜõCê$ˆ üóe]­sNÉM7¬sü¹Ôx‘FRWâ[aûrçÀ’/u^W­Ifï]ä†a2?qq¶˜ãuìâ|p1î]ôáÊæU‘gªjU•–lTÝ^á7> ²zÅ+Õí¼5ßÈWrZàƒx’‘~ï…oœ@tšWj%òê†Oz.µ¶of*^£ÂlÕ:3x|°?Uös†¬:ª3ßÜžú7eMSß…‡Ðfò’ yI¬Ki%2ã–ñ(~Á#ï葬j½Í«M_HÏ ‡ƒaF»~”¯©™"©u“?tZµôêK²ì£‰^°Ì‡ £•ºh1èû¾5ø˜æN“EúàP£ÚFª›Ë¶N‹<âXóJÀòt¥ÊZ<ª¦5¥ 7NÂõŽéa±÷Ô/oqD¶…9‚¥XD§ûTt-¿(¡Óyi£Dg?¯„®J÷¡ÀŠ­ö³3 ðÓÀ-Q7"+rUi‘f(ßHš¿5koVtZP‘ Sìãíb×5Ù6ÅrÀÒX°rÅw…JŸ.^çE*î‘î¾í¹>FÛ~ä¬í/ÎÃúa&jo¥tÁ¡îÄ6}T@2xLfB™?"`Z¨ÝŠ>×€æDvõÊê5'b×Ô«Ð iF[~+Úm½¯ÈIZ1r4xZQb£ëº(ê=¥‰â$MY`¼Ë'}ýß"ƒÓª ¢UhÛ#â¨Û_j„D–(~͈‰a$ñõ‹¬.wiupñûêz¼¥Iˆ1ê‹8^¸h'†ýø¿(gƒ4 " â±<öyÑÅí/ˆÛ ©5R ô,:Ý}^޹uSÓ8<Ž9ÂfuüõûNƒðíÓ(~}7ýöûoâ!a¼€c”¯`áF]¾$äl±ðw’uvóïK{»‘™gSuAþæ<Åê'PìÇý§ÂÏßÖçÀ€›Ô6(Z#¦—p瓲ºA¯ê«cÿeZìmöuó„U=èp'oSM#>u|‘; è?u°s\(tÁKu ƺŒ±’Ó”d ŒÁã"LÝ3!) ‘’þ#³CªºòA™Õ@ˆ…‚bkÙn44ÍeªîìfŒÓ ªh@˜©xâŽÑùh(No!ÃÞ"ß…ÃüÏ.½êwžÇ/3ä¦ý£á9+¾©5͇TS d€&JÚ?ì¸4.ø•á“û˜Cæc?’æEÜKœ&//Ö˜¢ ÎedUصÖÒ½ãpPñè¼TS‡Hv‘—¹œ«G>ì´èLòa“½9oø´†A6\(è{ÙêzÇ%Gµ̦%þ ˆåWÄ(2Õha"¬øA«{ÇËÑl*Óƒ)p·Ç!´µØ4VIö¯iÈ®Tu0†hÞÐØQmKUÞÖhœµ²ë5ÏÝ®QíÕù<  ¥ÈßÛq?—‹ú€*0ê]Ñ9L7äU@A£%ú®Pf½P:s^sBëÏçpÏÆÄùHgCA9DÖÅ«2ý€ÒÎø­CïWüDü áSÅßÞPý³$ãEZXkÂË\:L|wüÿqéðsrégý‹SÕjƒš}Dƒ¼ÀrG¼ÚÆôg“ëð3ë üÕ¬P Œ d¢-êª8|ÊýÆ]N¾Rë´+ôÆzºQ0¢ùOÌäE`‡ °~mLMyí§{c{1ThOì·9¡ÙhšúĦƒžJY8£¹Òh2ovIa~ìÇûªÌy÷z*êDo[£Õ"Yöb«Ñ¾"¡f9Ý_¯vV™+]ìnphûTZóU/ê5ñ,¤M3-’6LëU_›·´Ü^]Ò>qm«FbŸ]çHü!‡Ã={IŽf›sO¤$¹wÐ ¾ÜŸLIÁèËÝÝg0*'TE ¯ÔšqæáÀô&d¦™©‰Â4Ç©›á™±:î¥]¡`¦Îél0IÆ`8 aÏâ7„o‰é²Ý´ùG,F%Ä_Ä;@Ü?ÞŠ’ù™¢sJïtƒ;$V¾ŒÇ˜¥oñøÂÁçDáÑîÃz Ã÷ÒpAºlÒÌ}8\ïOÿU|>ÅÁ!ðȦbň6óžÄÍÔóGë ‰kО¬È1ÒéõŠjä6öÖ¾|¶’”AžÔ^]»å¢ë…{Ëæ¶Ð¡Ù=ÏEi›¶¥L-*…´÷š™˜È@²7Š;¾¤î5f—ù›¢æp, Wÿ¨¸{®Nõ.ŒE^œHkÞ^’²ôÉ]ƺë­ÈË]¡Jä1í/ ì®>ßyÎñeèñÎL[\5@KûÑüM]A— €.[>=àŒäŠØ¬¶›5Sw«Îjz®£QEJ\~m.©îzÓ×lK™dWG£èmn儌ûçä~ÔÏÁÐÏv ÓŒR£iÑíãC^v%×Å„øvhîoªÚäÔ,†Í“¶3Ëû1_öÀm«µLAàoé*ðÙÑò¼_JUÖÍw5ö”OcÛ!mŒ­@iÂH¾Ùj”E×ÚÂ#~C G[E»­q7Ù(;¾^N~†6™ endstream endobj 691 0 obj << /Type /Page /Parent 1710 0 R /Resources 695 0 R /Contents 696 0 R /Annots [ 692 0 R 693 0 R 694 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 692 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 489 631 505 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 693 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 446 276 462 290 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 694 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 99 88 113 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 695 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 696 0 obj << /Length 2025 /Filter /FlateDecode >> stream H‰ä—ÛŽÛȆïõߤ ŒhžI Œl¯a$ˆƒr‘  È–Ô&9²öAòyÇ\ä¯jRÒÈsØEœÀ@|»›ÝÕÕUÕ_ß-g¯—Ë€|Z®g~@þâe™ëe^Bé"v“Ì iYÏ^¿ßeTìdŽG»¢™½þøÙ§Ín湞ÇsŠÙ|jîg?ª?æÎïMÿ³î*ª¼)ùBÑ?äW“ãËÑÏMÐYþ€1Ñ`¿ß»NèújÇ»jÞ¢±¥‹¦‡ÓãÐV$}XÎ|24 âÄ ŸÂÔÍ2J|7ŠgŒ2êôl={·<#ô1Å{h“©=¶´\þÄ‹F‡E®aBä†a–’íNFMãØMƒ3«zñdÕÉA™9ø¯èMiW?íÌÏúæÚIÝ;e8 †M=Èœš0AK³ßç…9ˆYëA±ì2’ŽÚ ލ“6þ¤Œouyß6}n]’i®Å¤©:Š4qÓÉ)%V„]þfç$n¦ã£)þZ´ÍÚ‰fss©ß\$±þ!K³æÉŽæÉF•ò† «–Õ(~A#{¨ùÔd¦éõFwtŸWƒ¦[Õ õ ÝvMŽï©Õ¡×»[çiõ‚£z~rvÚ·àpAß™ÕÜõ+é#°_P2•PjÚFOáôŒU|9’úA¯ó¡ê¯Ç£`\îà$Ø—[Â͈EQ“"Oþz‹ñ´N2ê7—ÕÇCzÇãÙ(÷NŠœ„ϧ&K_BÔÖñ#Rû|C¥îu¯gªv˜%ïl ×Äào´p/ÇtÑÃ/ÆÕˆûL¹dz]_Qeþ† â$ ¢¿’NNE^¡ `@€{ß8>ëP:lúÜnNºémë@º/\¸¸Àn#c:Ö Žq؃mó{íÒr œáßN÷Ô·”ßÝuíñ0.Fôé“)XZ׸ôÛ5ڡ㙕)òÞ´ móUyÇX: è#H^¨>—sîX2€6?Óì9“[{ª¶Á¥¿¢~k-Ï?Ûv¨JZi\ßÂNÒ9V*)/ÄÀEkßZ{™fS\úCÛ;€g6͆伧¡/€Ú[±=Sªæy¡bÉq&ˆ÷ÉNš27¼u®Øo–†QÍf{äœÃéã @ïnÈÞLèóndž¨ƒ U¶Ú®¡¦íáÊÁö8„—µ®[»æ0®çäMw“Üq™áÒ§q–p¹ÜŒæUÕ™àâ£>JO>/]ÛTÚouC¹“IV‚]ûrêÁŽP£uéH4MOb^ƪu¤Î˜ÝsðHsãÌ™z¼1î‘1¿$ÅIŒîy* Î`†Dƒ„‚íß0²ÍF:¦ÜníÜ\S¯¿ð5°M‰û%V38âÚ™GÐðÀ¬–÷ñrBŠ‘fƒï0!ß*!WRv9[”¯¨`×yt¾ú¹ ‰çÛæœ‹ãž7ñíâÛK'쳿’+YðOíÁ>õz¨˜ml%e‡î°Bf}@TÛ‘ÞaÖp”ᾘb{ÒýÝ`©[UìjØPÕnhm*=NAñHÐÁ·—9SÕݤLkÓ7º¤wæŒ=μȥ=%¶|NÈßà,šÖ-€Nwy×›bÀeD:Øí@và×hœ#:]´u­›Ñ XùÜ^L[šþBÄùû ñˆXL™6•rޱI®hmêkÆIº“¯¹m®$3 0<Œ+Ù€^½oOÓÿ¸)Ù^+‰|\Î2‡»G ? wqV$h‘Ç.ät[&äê“?DêÓÂEˆÐ{Á+÷×”Õ‘ç»Á–?V&r ~‡)«›aÚK1 »[:\3M¹d9R-9Q ¦Cì Û—J“±o™$¤ձä’îeÔ…iôðûê;AÝ7«½ÿ3Ô]ÖØÿ£òúT]cÃûÜ ’#Uå+‡µF®fŠ]¿pæ“'­+QOÑgù>Ň)·ŠO¿G)»êòîQ;’ á) ?]‚ÛïÇã§äÄâ,öàwg`iÌÅ.JÁÁY(mxE!æ·šN—AlßöÎï ð»â+“Ù…Ôwyc§¢„WMß[éê¯^[PêQóuÅýÄW«3Z«Ô÷¦@ B&ºiáÚÖÓ(§ùRßHµÍå/Ù2…!Ì¥!Šq¹G 6–û¼žõÕ]¸¢W'ß¼ýøêq"Ÿ€<æ ±ÁhK®Õðe ­­Ð(AŒë¼öà:¸FæDºª §BÌØyôR§ó’éÌo‘6Æœt?}.°”Îä«JKí‹pŒn_WaêÆÉ èL't¶¥®¸ð³ädNJÅ×"Œ¹ ý…­þBTX KµüV–°¯9èe€YÚäҬ픗Ápä}‡àü¿¨Ÿ<øwÎðipÿ5pòÕÀeœJ„&¯õ­óB5ƒS‚¬‘-ŸCè%•µ×j$-Cö!=íçd¢ìÓ_Ó³-Г‹ØD]2T"ÆWJkÁ'ö˜?tÿ š' óGãfê7tn,kä5Ù:;‚5°F ÖÂÒÖUœˆ|Ev>s4y‚£™å(WÇ‘²4ÍÏ*Û}mè³û,¡4õa9û÷¡Êë¤ endstream endobj 697 0 obj << /Type /Page /Parent 1710 0 R /Resources 704 0 R /Contents 705 0 R /Annots [ 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 698 0 obj << /Dest [ 469 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 348 685 356 699 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 699 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 587 109 601 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 700 0 obj << /Dest [ 485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 168 409 184 423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 701 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 190 382 205 396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 702 0 obj << /Dest [ 563 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 276 133 306 147 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 703 0 obj << /Dest [ 563 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 141 79 172 93 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 704 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 705 0 obj << /Length 2256 /Filter /FlateDecode >> stream H‰ÜWÉŽãÈ…¯úŠDaI£ÈfrW¡ÐÀ¬ ÌÁ0ÐòÅ]†AQ)‰ŠÔ0©Zü!þÿ£~™$Uªr/ÆxE%2—`dÄ‹/¿Y-Þ¬V‘Pbµ]¨H„øÃORAX„™È—ia,V‡Å›oM!*ÃkBaªvñæÝ{%vfaHkª…?>>,>Èß–ž‰Üiú¤HSáýaõãbÉ–"ƒe†¯ÄE…ö#l b[ô”fÖÔ_#ŒúQèù*2bý$Þ?µÃ#‘Ô,ISñõ»kñû¿y~Š÷siÊÚ eµ¿ïêáϺoØH,ËvãùK)þÂÿÙ1>>- ƒ /«ï0Æ<<<^(i諚> Óød€Ç§«ÜО-}¿Z(Q‹E”fAœ)çAQˆLI"pƤ½^l߬¦`Ä KÂçјCRDàåêO”°Ä%,  ’ Ž‹\Ø×1¨yšytÕ0"d^äRÜV]»­w÷%¿öooÄFóã¶nµ¨ø‘Vx…Üúrðr Ð[׊û²¯Ëu£mÜàRq‰¡ÉhIXšýPcr•ì·];”øâFÔí 3—“YÍ,ÈÇt>¬ »ýÖxYPÈ'÷ÓV¤cy PïÞ^úç³%_*&kÖ¡Ìæk‚M"‡¡¯×§AzU’\R€ËÇ]RË þôH޵åA_#PÍɃLºXÍD^î(6»áìÜœ´)dwµ·r'ª²k-N¡:J^6%3;eɈ;i4å”VìQ-©,ƒîE"¶]/vºÕ}Ù x;”C —ëî4!ß•Æì29“Î~¥Ö¯g¼ó`L Pœ+S, Ddz[7ˆ ê|çEO‘OD|€ Ç S¡„sZýóI·ƒ37Z2º:woÛ%IZnð½ºÝñ¿º“p–rW©¦ËÇà,Ÿ“¥æœ;,sI&{0fò­çG€•Ø—ÆKQþ¼]Ôy Ù4!$‘ä\ üñ>BÚrãÀ÷ƒÃø&%_¢ìÂÍ_1AüŒËщ9&ùÒÍ\¹™bڣ쌥bÆcù¹…(ˆ“þ¯°ÿÕ`¤ÒVÑmùÔk\)å±t½Q{'Å^o4½Ýyׄ½'6ºÜÔ-mÈäN|Ű ø˾$6fv婜ƒ1È:™(üY§8ú e,¢HæŒ_2~’!|µ(:‹ÚËâ¾¢p¤L:àD‚fÇÀ#K`†Âd@QíÀEy6“ÆÔ»–Þ‡³-ˆ¶}XsÉ7:¿é*9·kÁ¶µMû8§$–G·¹åÍœ¯htЦÀ>„éHƲðQ\ÔäL‘¡£H4." y&…ý9Â%tôªÞÖ µ#i!®îqøLRD¯¦ôë`²A¡C¬¡‘ýìš*¤ž~¹nZt®Õ3N¥Dr랈ëUµýR^•éòŠÎŽcÒ®ˆ_)ZIPçÚk¢[x.›óÚ«çá=µætçà˜´ÃÙ6uÙò΢[,ºók¢ ¢«É; ¸ˆM‡@¶ÝÀq²õ|j'"¹D¶/jÍÑrÉykN&?£±5«›®¸5U_xжü75]£öÝ8È» !·ÑÖ W{0­Ñ|Ú1nF욎PÄwÝš¦Œm"Œ*Âw!͸š“/:jÇ£!óeWydÏÔèKF#ÌÊ£/ —¼(àÈÿÑ<Ó[1í“ß> endobj 707 0 obj << /Dest [ 554 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 346 712 376 726 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 708 0 obj << /Dest [ 554 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 115 658 145 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 709 0 obj << /Dest [ 559 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 481 644 511 658 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 710 0 obj << /Dest [ 547 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 366 508 388 522 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 711 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 712 0 obj << /Length 2159 /Filter /FlateDecode >> stream H‰ÜWÛŽÛÈE^õý–& ÑlÞDöz³ÉÂÆ=Y‡jI½æEàe4“É?ä÷!§ª›¤¬ÇN6›‡Àƈ}¯>uêTõ›íâÅv %¶û… E€ø‰³Ì² ëMâ§Y‰mµxñM—‰¢ã9èŠzñâ»[%Ý"ðƒ€æ‹Õøy^ü(ÿ˜{«ÈåAÓo(E’ ï/ÛïÞa#Ö¿IqJ”ùi`á BÞ‹¾°‚·úGˆÞUx+ù© 2q÷(nëþˆžPj;ÉÎtâõwKñ矽U‚v‹±ÄO¤ñY—âölú¿é¶äM"™×;oµ‘âïü— ãëóÕÂÀOÑØ¾E[p>Ÿ}/ò•ìèTMÇbkéã3Àí ×uä¾Ý.”0b&©¥JDk?ËDªü8¸cœ‰V/ö‹7Û ŒHaJð)3Ô!+·?‘Ãbç°ØbLˆý(ÊÖÂ6GP×Iâ¯C·yE=qPæ“ånSåEÛ¼z)vhš±Ü/JõÔ!xŽ 6dפ™7DžÙjô¦²Ç~ÓÔ}nj½¦~Éè­å´­ãbê¯Güiᆷ°Ëo:/ŠÖK`•9õ¦>¼º6kŬ”¯"ÚÄ^; ¡/¶$¯Ea­±†$ÿÊÉÙ-ν~ÀŸFÜi1t|Ñ€­°ãÝRtZ‹Ô/”?úî‰ád Jéˆåkâo,û¾5wC¯;j*I*xä P%Ì”:¯4ŸxÄ‚«Óg?ŽÚQø?06±ì¼À㢸óNïáBâ¼#Ö(Ò›Nôǘ5€¸È8LfhSÙé¢7MÝÙV³§¥ä’½9 m¾rQ9›OÖ­g"¯­¡´…/nG°½ lQbß´0Î-;¦Š/.¶›ï&äÚRh§3ÆjÔF½™AŽÃ dçÕyÚ…/,áV—ŒùèU‡`ç±Fñ½9À~KÆ¢ƒ6_ŠóÑà6©Kˆ09 07e°¿Ö!­ÞëV×…¦g¼yÌ­cè¹cé­˜æn©C,òÅt寗4 —1~©.êB]"ˆH})›Z¡KÝ =¤߉¬òS <©4ÉÎç1ý ‹®å®ZLËÝ”/éP²Æ¼øÿP‡ž‡Û"iA€Îg30¡Èjf†ÆY;¨SÀ!2Ô¥©L¯wþç¿Ö(Á/*ƲnjýYiœ1S|aùVïó¡ì_~u¸bh7žÒ[Î`3&:‘/BS~îò¹_굟ö¯á%M l‡[÷„¬SLPV”‘2yðhŽÜ Õé«üoÔL×Rt¥{Oj¦è³2lå Ï£ ;‘—¥hN¶È± è-T,†ò5é*Dq¯Ûާ¹2ˆß7š^5ø*Þ¿º^]nŸ©2 ôr:‰®äá@‘|Ì;eˆ¥H¢DëÌ¡6{ƒJ­Gôëúh§Ò»MÂ2ÊàÅj2oÞï ö¦Ô8ëÖCÔc'lD"N%®lËâg+·ÍléÆ=«LD9 ª¡8rM’BïB.(cJ\ ²X?Ø&.…WãÚ{”P×rà ^¥ÏTŠs;¸ã'"Jv2F©ÌwO«B¦Õ¬ôjTz•€ˆ"IÔú,bpµ!Å[‚kÀ˜§²¡lP"˲9“ h¥#„›æ)®íxL® ñl‚ŸC‰'$VA;ST|ïõt®vçøò“‘|÷l!­Ös¶#xióðï\Œðì0#à7vØÉ?.„¦géTs^ÏN-’ïp#‘·±9‹£Ñm^ ½#6L=X\–\Ã?"G¶¹ß¾!L½C>Ã÷]ÙÁ@°‡S*Riuž=È Ô„31åY> Z]ï\N=´Íp²1K<3O '…m. ÝRDÃw0˜Ü·D¥­+AÐåí NMÃõUiñŸ©¢™’.…Þö¸$<ÁYè8<Ñ¡˜u©´ƒ•Ç<Àê,÷ÚšóB˜‹¦lìL¦L(wâ÷[Ì|Ï}ïx?~Œ Jù]GŒOÇÉâÞ¤dòlÝ”×vøq'îìÆÍ™Žv+l—ïòy=­³ÞX»G%ì-ó^–/蔇 Ùòá8`ì$þ ‡ã\bÃy7˜²_Á¼ïóûÜÖ6<_¼3õG÷ü„8ü„¼ƒV_© ýYCF!ÏV oï9ø€š„¡U£\Û•(̈¢¶Do  n&Ûã‚¸Ðæ·"-È]—ȇ¾©ÀB+9íH ó(ò'øpØN~ÑîíÖÖ H^ˆqi7§˜¬Í¢lÆE¤¾ˆ{ŠaªSŽØ_XçV£J¶_>Ïù>HgF¦öšNJ*ñYy}`eqnP劼ù+ãÿŒ¼¾.{ÝÖ Ç½¶rд  ôHvÿ„Zªu‘­Kƒ”cXsk‹`w 5^ciÅËÆ”=‰ñ“æëX‰¶’øívñÏ×ñ¢M endstream endobj 713 0 obj << /Type /Page /Parent 1710 0 R /Resources 715 0 R /Contents 716 0 R /Annots [ 714 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 714 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 254 617 262 631 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 715 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 716 0 obj << /Length 3016 /Filter /FlateDecode >> stream H‰ÜWÙnãÈE^õ½L1°hî¤ Ç@/Ó3 &ƒA¬¼¤4Y’8¡H¤Zv>$ÿÌCνU\,y4ú)h´U¬åÖ]Ï=õ~5»\­<áŠÕzæzÂÁ?üIb;‰‰xÚQâøbµ›]~h‘µ¼ÇmVÍ.¸uŦ9¶ãОl¶è‡ÇÙgùKj-|;E¿ža,¬¿¯þ4[²„¥ˆ{á?±#G_Â<–E£0Ò¢þãavá9ÖÂõíH:‰¸·U·ÅŒ'•I²-Zñî‡ ñ·ÿZ‹ß ÖB;”…åÈl{!nE÷/Õ”,Ä—i•[‹¥ÿ濬›Ï¦yŽácõs¬Áñx´-ßveK·*º¢q¥¡ë23µeI߯f®(ÄÌ #Û\áÇv’ˆÈµƒ@ÀÆ š­gïWƒ3|[œ§Þ]íG åêW X`ØN€ íûI,ôgïÔ8 íØ›xÕ¼ê¸Ú¦Äv]ÛµpŸ×e½Ù§ÝöæJ`"”‹FñJÖÕÍ£ %½°®+¦9/«ûÃFà¬Y,JÕj_BÍä4¯ݼ%åר›Û«f4ûPW]ZT*EuÅŽå Ö¤kdÇ}ˆ(gX–×9)uÓ;Ëh±àý ìÓí’dpIb.N+‘éËõ½á÷ºÞ÷4$k+ÎȲԎëj‘À EþäÑ£8n•™¤­EIÛY&ê~ž•ÛâK¬YY=ËÊýÃHÞ²Òï~á=zJëz„}GÎä½Û§d}±–¸êztåž/‹ºÒƒ ±/UªÇf‹Ø¥ÿTBOQòû²AVoÓŽ5{²µù¢±oêLéiý÷;ZD“8˜½ 'A³ƒKE†¿ .se+˜ôWkAvû—<<<ˆC•ãÀÄÂ1‚1m!ù$0ÉY\oT\(yIN×ÞåNuۢ°n~Úç!ŸàÂÏuÇ¢Þ#Å\‚:ŠÕ\Ïì9ˆe¿ØßñJ"µbfÞÀ ‚Õ*%˜’™¥JÜ+ЦËH–3ª5@º®×ªQU§¤í{qÛVà&S¢®Îº#: (˳dtc~!{OºSmt°Ä¥¾µkmñŠOž‡ ß?¤;äü•†ÁO®élvH»½`ôYöÔZ ‹K(Á®ûÃüXT¾7¿ùpuw ‘ÝÝa_{}Ù·Ýž5$>:£ ªÛhíD&tá­Å0êEòd9t(úÒá×W‡{#{é™U„5 N?¿–3rPKæaèÒ€9ÀË^+‹êð0¿¹ü’6äªKrÝ®|ÙmAL·¾¤ÿ‹«ì8½úŠçž?þÆrwtK^ñÝ ëïW¿•ð…È á‹vLŸ¦†s­ªô¾T7â:癢åï·Ù[ @¢ÿ öfTç‹«ZCýKŸò«¯§V:.ë}WÒ}Sv]=~Ê®ðlʵ„ 1×í>–í’à˜Þl)!¹øêuÆðä ½ÅX›m£ÝÙ*ðh8n‹ Lùq]k$ÕÊ»Ûm}(sê&½Bè¹NלÛÐ`1ê0²›pÔ!Ô~Ø Â¶€*`')ýÕawOÜ]÷¶jŸ6)Ó䳫÷EöDNIÀ=2,mè=¤ i/˜YµõŽ:ZJ±iêþ}žŠø#ñµ:õšYšØ! ú‹¾-]jî”ÑÕÄ&ÉzšVš%•h󰔯£v 3h±à–]mJÍL…3Ó¼ÑäÍû:'Ê u­£í{˜LùE·y0È“=íʰ1DòöÄ•Ö"aZEéÅF.Èô+S&Ÿ¼‰ÜÐ=¹üwºí„SI§Z¹‡šYêB«¦ýPÀC¦?-Kßv½éo3óœ»Ì)bI2ÄÎ|@ýðÒ‚†D†ˆtlˆÄ0ÅÓ;h‰“MOˆ¶3+M^sóÙäâÇÕŸ­EŒM?Yî5©Kß;Úêõ7tòWßr†Ó ÓmVÍÜå4xæ…Ún-Q[Ao‹XêoÖUT<÷z‡ÅÙ–ë9Ã0I#ñ?:ÃýK{éšëÇÚ'éc{Þ“öñ_øÈŠ˜’ Žyù+Cïi¸œoënþ+=j±îïˆ+±«­Ìm'ŠÝ¾nº„²``÷½žOj|º#à —Ÿ.Þ;ËÖïˆÈy^•¢G1ê•1– þ9AÝT™Úwe=Ízܘ0v¼3+>ŸqŸª×k]Z\à„nèDT;‚bEIX>’RÀ„ HÃ*OuÒý¤UÕÆtl!„´Fn»ë´úý´eõ#uðÌ­‹ÓfF|oêïxbÒ=û9F†­ÓLUfäNÒxl(®áú±˜H²›ž.Y]2Ì¡€€¬ô:ãé)–ëe†Ñ¯Àá;·OЈ˜˜£³1ú6äù’öMÝÕ†*œc’¾š¢WâDÑc)ÄP×%8#lbâ5DDþiÐ×&¿9ê:)ö”Ü›S`‹üŸ‹Û†N¢â“hVȹ”:†1 ÏxLoŒ; szýdsÎí€nDš*a’¬.‹/§3b› ™\ª‘èp—Ëè$Ä_Ý‘‘"¸–O £‡oÛBië<Æ€¹drräŽ?ÄX»´J7j§Piçñ%jIDùçZ³©´}9W›³„ùqÓ£ë7h±‰ÆÙ4ßÕü”•¾eá÷@ÅGM»™ïlSt¤ZäµÐ´†„m×P³å&H}¨CàEžv) “`.éªl[7àd]ÚlT‡Á.ÝãL‡1ÙØä„•°¢µ"?Ub¹·¨6G& Ú!Í„„hÌPèy#ë¿©‹µ‡Éâ³V¶ôN³ox½èa‡wÑÄÍ[@CI;z(£6“ÞÚÑüSßÿ â©7ÝYà>ªé]Öñ£4¨$4úܱ@[ìûÚÒ;y"D£¾†3¢í cTyU>Šbm¹L@æ Ù û¡I ÃÒ{Ï…›îd«—\Ky¤¸›º€M®|£8úÀ}#¬wÚÕµèzrmÑc¢>¤ÜëíîJ¬¸Ûm‘…á53žú.c¤ úiÀ·Ášèއą't³Î¡¨é‰„*Ü/ŸôHÒ\€Éó\gQ·|üΈÏÕ—"S‘_½éÂdyòr8ëní/Aĸw/è R¢Jwꂳ oD ¯«Ù ˆöÿ8/›œ ï=;!ÑdƒpoàÈÐF‡1Ó3 oïû¡¡EMŒ;~šªžšê÷¾*âå(Æ›³äÛ˜=)Ây¿8 Šs?ã[@›™Ç›ê3_›-H`ß|wÈ[ÇŸº«gûÁÉÉÝg+1âï;%+õ`¦nP0޺˳†‡@8ÃóëXŒú"xPÕEêì&…Â7ðcpØÃmWzaž Loתݚ‹©œ§8äÛŠöSBŒ¸N£/»2„éW'04õßœxƒþÿuâ 3ÈYÃ)zþ ?`Ö2­—F\O^ˆ<#ñdtêÊĻɑ¡§LÅö€œÌö´oܾN`rµ ÂHŸOǃNZò¤¦ÝHc¿Jcï½XC˜ãüaÑMrÛRn—Ø’Ü—c¥QeUS­£r°WüŽçä4–êêh~‘ mE¥‘Új%×—Ò]ýŒÇ§«O¢ùŽ endstream endobj 717 0 obj << /Type /Page /Parent 1710 0 R /Resources 719 0 R /Contents 720 0 R /Annots [ 718 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 718 0 obj << /Dest [ 748 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 368 661 403 675 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 719 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 720 0 obj << /Length 4121 /Filter /FlateDecode >> stream H‰¬WÉ’ÛÈ _û+Ê}qÁÑ„°/ºI3žÅ!Ùr4OV; P$ᪧõ!þÿ£~™Y·–ì+j…Z²2_¾|ùvyój¹ ”¯–ë?Pþá'Ê2×˼D¥yì&™ªåîæÕwC¦Êçxj(Û›W?Þûj3Üx®çÑœòf1=>Ý|Ô gº‘Þú ´Š3åümùÇ›œwÈUê¹y‚SÂÌM<9„7x/zŠÙê_Fç,üÐM´—©Õ³ºnÇ-Fm줇zPo~¼Sý·³ˆñÞã[ìÆºv<]nïÔýS=~6}Û„ºh+g‘kõOþˆñõùjç&xY~1¶àééÉuB××jèXl#]Õ“ÃÒF"©`¯ù„ +ö·ªk›g\€æ¬ ê–v  nU·ç›€ð·Ô“i…DàXØ„¿ˆµ?1ggÊ•-Ž9/*dÃ{g‘p&äGñÚ‹ wý nÿ&^ ðÜÜ? ¤?Ÿ:¥+€Où´åìCäuŽÄæ`_íŒc ÊÔ;-­[¸µT«æ`&#¯ K£Ÿ ÿ ljÇßÈàóvì‹v îŽõþöÂÈÐMãSìGs "qÙkuÏp‰ˆü‰¬ º=‹û}ÇdíÛ¯#аǽ:ŸV©åwd…¯?¨²Ûí­]E™®,ítŠÃƒÃ‘°È—ºe4Ð@6¥øÕšëÖU¢Ü·ÓtáVɾßy®ÄÇ\‰åŽã`Ÿ÷FukÕt »°'B±ß›¢§P£Bqmšn…¬¢,ŠAÕ8|3ØÈ\d®ŸºÅ×sl‘ÐÙdެ`à×òT.<…ÊYîš¿÷ããSÅnšQ'¡]œÇ–iýýt[~›h¯"-!€óI”ïßñí—]×<Ö#‚X™«K¦n_à÷ÿº¥Y÷’s¹/1ŒÒz’]/Ä÷µzÓ>«Ñ šÕas¹)Ü¡QU<Ñv£Z㊈yAK×úbÕ}¬nONÉ·¨½ºÜ™˜a-îfw¿¸â=^dþÞŒEݨaØt}›Ÿ6%8_TÄÅôHa/I¡ã°¶ÈSê­êá…lÛòµÆNŠÍ¾.eÉ|Qxk4²4HÉ`¨4=‰B%¨¥£‡œHÓtùXX…ÑÐ&â6ú<†{l¸ž —ÀSôçõ9Y²cÿá,´8;0Ì é¤Ü]` ®8ÚÕi ”,xe.½¨v*{ƒ T]û¼«?# à›aBãŽ<À«~7°ÉTïý Ïeǃ3 9p§ªz(V !'|œu zæÌ} ŠYfoÚŠ…‡pZ%€.œTŪ €À¯‹ÒÜñÂÛjUìë[~Æ,"}‡ê ÿ;RHvÕò÷0fWo¶£’)t›û¿¼cÊÇév]Ô ™p‘IŸvëlþ"Fù·$R?"•;ž§ZH;áÜtÎÔtâ–Ÿ¥ŽEz®P1j„ ‚’fYõg'–RÑJ0€Á˜&"ò4€f@Füùû·\A#}'6­ÝfETéÔEð™%ê_\`'?b'—; <(ܤ\áû„›•í†Ù™v”!Y¸X¢å b,†¿Jú¶­y7° nFìfØ7‡ k%€¼8=©“9FÆäjöÔ¶l•ý  èLu)jíE±ég³ì³¹ñDN ‰¯êŘõdvÉàaGN3( Ô…RŒö½’÷DÛ5CÇ(ÝÙ½PCd:o5 ªÓ·Öþöv£Ñ¾S­µ‘S¿f”šna»0»ƒ]±v|Í:DF§[ÞZõ'[L»[-{zÆ-$üÙ†,±|päT×YÐ#ùnO8‰Dhûϱ¬¶"ï*ëúï¤*Ù”¡iú,»SÝnhû\_«þŒÒ57ÍDð{nž\)¢Sd’@T«ÂIðS²¨å7†-:Ø7"é?¼™þY´† °i ºP¡4«ÿ}Ý>~Qýû©›ýâßsƒK‰ø«I-R“Ä»bµ,š)èm÷UpÇò½ʆvuõ]Jw¼âB ÖâÏ¡`Èü~£æE+éÏ&Ç¿YtpÊAÌÝIõ~|þ:SÁ1eQ‚‚¦ÀÉ\JD‚øc.ϧlîìê=–Ñå ÷Nïï+@Só6 ®C'å̓uʨ¶ãJÛ>9ÂÃù:ñtjËUSd®öµu%°'“™Lò˜%UœþÝÔöha5eZ+Åuwvý®…~e,ü£9òÕý—Ð- ‚à’;«3)Q}gÜ­•ЫÆíÓ¥d=ºp+-¯¬Æ!Kk;÷Òè{åªIçDWèú9`Ô… $˃öƒ¯\ê2 ÜlWºûJæ1qtÿ#òE¦õ›D »¹¨'0?ñgÝϾp#EC$sG&2X‹9ºŽŽ•G&Ü÷$½©vT¯?hv:2©bçS$Ä•t·¼AÙ+óréÐz¤ÜuzB6^ÏPÙ¨{{“’ŽÐÚ¾Us§O¸íË"k¼¢¼Q“§/±©º¢NÆE³¥vî*á`]r©ÊV/I‘m}èžâÎþ¤2H¼Do±y¹"û‹iĆM[©¬Fv¿oÉgDG‚ìOC&‘¯¶¡S(® ß¢d·+ªÀŠé XíÅIZ"Î%­4P…Fî$ϽHϹ-ÿ¡þÿ¢ðçôð¦Ñ{ýרƒÞ”oœÌø”°yÓ"œ ê’æã)Ý•C¿{Ö0æù¥ïÁäÚÇ¥PâLTîXÕÖ‘·r´k· Çd;·Mçýö¡J¯V4N¿göI,À÷Àxä/ô­ÞÎ`Kî[qK@«ãÆ”öÑ–¬‡6p‹ôæ3»œ+½J? Ñú]iQL2Á †¢¹•åV¶Üê„G0ó8!æKMÌç ¶ßÚ)¯Óì«É¡x•Û ‚ÿXdLràš˜Ð®(‹æ–à<yƒ(ÐÏoV¦ª ŽÏ `øÜ¾Ž¤v’ ~´õûŒÚ6؇¹W×`¯®ßÔi6ÈS`îöêì8¥™^}­Ë‹¸´xlìT¨u„‚eò 𘣃´ ^iy”6‡Ãixíæ°" Òçïyv¿TPØY°B•ëZýÊh˜èr¸'eÜï’6µ‚ ×Åõæ$ ¡æ€ÆÌx âpß̉µ˜¹–˜ï[> endobj 722 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 723 0 obj << /Length 2541 /Filter /FlateDecode >> stream H‰ÜWËnãÈE¶úŠ7)b,šÅ·N3Ó=3iÌA¬ƒ¸{A‘%‰ŠDÊ|ÈüCþ1‹œ{«Hʲ‰7 X¬÷}ž{î7ËÙår%–ë™ „?üDYæù™Ÿˆt{Iæ‡b¹›]~Ûe¢èx/º¢™]~­Ä¦›ùžïÓžb6>ïf7ò¹;½Hn4ýRÄ á~Y~š-ø†…H}o‘à•0óß<Â|}ʼn¹êïfçïÎUè%ÒÏÄêA\?4ý3Ô.n’]Õ‰¯¿¿ù‡;1>`-öbY¹¾,¶âú®êÿ¦5_ʼ)ÝùBŠ_ù? Æê³jï%,?`Ž%¸»»óÜÐS²£W5=‹«ñ¤‡OÚvjË7}\Δ¨Ä,ˆ/L”S/ËD¢¼(Ð1ÊÄAÏÖ³o–£1B…-þckL¦öÉ"rù×ÙåwOü52ä7>+c6Gf3Þ´ Ù[–ËÌ^ãù‘Yaã«„žº‘ήjª]NÖR°–ÃjMÁy‰=Ňbc¥wâÓ±ë…Cá–y,‡–¯ä§¹Yn0a)ìü¶í‡æ±AÑyâ)˜Myij=R·üw:J§iÐб{GÍüʼnfé×ôi”$—Ë¥› ¸·n «Ž?E…H‚^vÔ»ô´®E©×n„à€æ<ÖféQÃM)Ì‘m{gÏ:°ïq.„£®"«\úßšZ(s³)ÇÀ…DN^ÂiÃ`o÷C³¾~Î1KzÎvžGž"ëªpPÆ“92JïÚ^Wͺu<±Ü"Ñ6Õ­îp™hoõá¶Òwân‹g½Tæ½Àú6ßïuS¹ ¨ÓlDy’X{ôØéƒ€Æ¹÷8 °#Z¼ip˜ØÐ÷½nJ]>‰ŽEzÁÁK—ÐÖ`ìAHd šæ‡ÝÌcŽ£á!óº¼Dçį"¯w­Ù×»ì*ô-ùÑaôÐoÉ ú¾pS a¡·Gî™3…ÙVí{¸[à¾Î×÷m_OzOS-JÙšÉY30æÜå÷Õs¹–f'ÖœÂNEƒ5?޲ƋAã(^la®¶¹€ÉHý…¬]Š£cIœÉ JÞ#lÓT’ÒÖ×|æg”´— ˆk]EÁ­¤(íGnÌ»ªñîjJ›tñ8o”šPF"?’C2€@ßn4J=˜H5¶,khd$¹…BÉôâ®=֥؛ýmy,4'¶jñÔ®µW×¢ÎÍ܆0Z‰ºÝ˜Å'~ë| ¬‡ËÕ™s/8ñíd™SÏZ§t÷°-é×·œæ«¼Ó"'÷ƲÐ]'>K<`K%ƒ]¹Ê÷Õˆ|õqS5®­[°m&?»Oìzé[šÁ`&0¸>rÄád?™ 5,ñ'Á™8XHÜð`<=Èãñ54OMÛ#P‘¾©ŒáÇÔ•n(ŠpÂõ=ì§Piæ„Ì »mƒëö ®Ü6’!¡š –´˜ Â÷xvÇè ³Ñlç†9Am£çb sôE‡ç‹vçÎI¸½K~ÊûjUÕ — Oá¿Õ'`b¥¤GJ$R‘­°°MWµÍ»3·òãqðF¡m©PÕë]GÔ$~ƒ@pO¢<ˆGï#%Êë*ïàðšµKÄ…!yp\Ã#TpÏ„ëyBÕàM‹[j¢´Ø6D^r¢ÈDçƒðL£†b5f%”Ž{óa&‰p ßPmžy‹gTƒÌo©Ú€Cú•ôL;$ûiNh4ÁkÇ™á4èIœ´¤çLxÐ'õ¦èa)!\Ñ6·OYÇi”M¾„§2•R™¢úµpš ¸%'¿ÄÒŒ©o¡ 6,°Ô«ã†ÑÔa¶³ÇB4lf´å‘¡ŸñPHˆ!pH†çª³†þ“œ· ñ0IÑoAuh!ø'p#‰Jâ‹ÕNƒF–m£Qå±_‹öP‚v{]TëJ—¢kQSÍ-Z ¨£ÚÏA# ›bå6n ø‰3>9É}ƒŠ³¯ÐØZR:M<°'<‚ÙðâÈ4jð`L×QžÀ%WFwŽæM¶ûØô»‰D^¾ÚÂ,D‹¦Dùh ·‚' á««q2®F*þ£õØÏ¼ zñø+ËÃÛá‚zU³ª¸Ï{|ú…uô²SGše¦#…®éHa#”œ§F"ƒsej$j(‚}q•dVÿ…‘ž?þÊòðvˆ&# â<>ýÂ:Œ4eõd®Ô7æ ‹Ñ\#bX,Á- ‘†Y*Ìp<ƒHÚƒçgñ;ó¨Â¸â+Càœ›IÞ÷ÙZ=±F”‰åºªipˆÿ¼“Ù2’v¨Ù‹:„(ÓÑ¡ÝICuÂü¾m´z w<ï¨" :+« 5 Ï€Ìçõû34óþyŒÞÙH;2û0ÚÕÂ> endobj 725 0 obj << /ProcSet [ /PDF /Text /ImageC /ImageI ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /XObject << /Im4 727 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R /Cs11 1673 0 R >> >> endobj 726 0 obj << /Length 1975 /Filter /FlateDecode >> stream H‰ìWËnãØÝë+ Þ Xl¾E†žö`ÒÁ  5›´³ ÉK‰ŠTø°ÚùüCþ1‹œª{)Ò¯¶{dm‘÷Qïsªøýfñn³ñÉ£M±ð|rñ?a’8nâÆ´ZGNœ¸mö‹wº„²NθÔeõâÝŸ<Úv ×q]>“-–ããqñÙúSj/'´¶Š}‹b—ì¿nþ¸X‹„5­\gCK8±«•ˆ_dñSkQÿò±ºô]{éNl¹ ÝÞÓ§ûºßaÅ·” IVWvôþÇsúË¿íe„÷{‘Y¥íZÙîœ>Ëþª­DH`¥un/×ýSþŠa⾸æ»NŒ—Í5ÖÄ‚ãñèØãYkU¬¢¡ÒÁ£ ï2³´I?l•´ð£Ø b‚•“${N| jÕ¢X|¿9#ðpÄ})Ô.GVnþ6KÓ¿Uì:ø/Wô¨ÿû"„]n(‡“˜Õ#«r>Ž×ŽÏ*2dõã>¤ëfñçE ç­¢•ãÛ8³ôÕÝ(>í†~ˆª™ïGnâøá‹×_Ù6ºã8qØùoÝeËÌîË–½pý•íYT¼Øì&kŽú¿žÛGúŸf3ÆáÀŸgÓ¥¥ÇÚ¹ ï„4O×æÆŽœ ÏCU+º,š*/ëíí›\Q®ze¯P˜í¾¬U'G Le]öeZ‘9Nz«·¹ˆÓ^]ÐYÖT•í¹pìcë O¨üŒöZdZŸä¥=¥UE·U“ýjÓV°bûƒ“ýUx†*XS ù1¤ŸÓ™W¬Õ·¾T•Û{wÆk‘¥õ'¢?žiO[;IJ"õåÀbmzh±JElmózNgéÐ7gt,ÙEˆ®lþK»ôN!p,—C‘ ˆ€q º”±ç|îÚ)5H߉ uݽ„6°a©½¢C£ôßÒæ‚‚Š{ªT½íw÷çėЦ¥ºi÷HÑ O*¼÷¤¹gmÍeH¬ÖV- =åîÀ=,(cÁ®9Ö4ÆZîåŽö] Ñ]`–,íG2’1? ¯W*íìe8êõ,¶Ké4pe1#ZEYÛË„C€‡Cõe²EPk½VÖt –8¬æøPdk^©©˜‡{i›íÔ¸Ï ïJóªGŠo+Ä8m{j J雟õæOÜ"ëIâ–'PÍ0•7Ù°Wu®uGœ=®;óf~¸¼ÐßÌû3FWPt&z?KkÎ òQ4ƒ„'±rgL€iÃ>Àã›Þó|Iѧ†Ê‚¥JÚOhŠk ¸ßÛ-ãYÄ.µ´øûœ$†Zâ>-9Ì­ªJÕ!äÔ)²ˆA.á‡ù¶E–T €ª*Y÷™îó„þ{h›Û”KYΫ®×$Ô7´OE9aÎj²i¥mRwª½ïņ Èõ9ØUÑãÊ…iï«^µuÚ—wªº—c猧H Ê`S 8iCû®Õéy1.ˆ PÇ™~°5ú–±¬ÙÒc&ûlñ‘ªÙRQ¢ÞŽ»2Û‰$™m4­Œ8ã•3Ç„[Žó/ÌÂüT xTçbP=!64s[¨Û:›çDvÂhºìKÔxŸîWl›ÄÓÑ%¿ô(5„f< º« Â# v¡ñ:2±FÃ`DèÀ9a%=L%¹xvl‡…PvÒî&.zÚCŒ:á8MhýÐÔ=Ja.ë AÄÊ¢G¸Š1#M°ò'Å—‚™«Gº—rþ5.ü2äE¹Ö½¢×‹¦æ™Ñ4`ÔšîÒjà®…yö1)OÆÌ+>¹ðÙzÏÜÆÞ–èLHˆ’Mâ¶ùu“4ö¬º©Õb Sf]«"ªþÂ\0‚A†º^ˆzCà®QKí èÆâgJFSäÞæYúpcŸSa–ªŽ;žpýËƳÕmð±[&’™ò=›©¾Æ‰ô€Ñ$§¨R”'§ºm*f_X€#xÆ„JR¡{Ø9ÃÑͧ4iìC½Òäñ„ gI…„N¾¡Vè13¡zio{â7?…PUÎäshUQ~ðɳRɆ¶E;£ÜÜ@¿6Oµ >¹„Ué|ŸUC~j"¯Çj1£dªó,…åúqdDëP¥=r·G8š¶×¨ì%_róqµ £eȃéøæÌ~þ‰$3èûýÒ à@Œl§„£áô_­´¤n(Š2+Ù‚çŠqšðG‚»‘n“«Â$ Ð;Uú;¿æOQÎØ~j´ѬÄ`s4ÀKæó~ת4/ó+›ãAšãeQŸúxͯ©û!e=ånŸã—í³3וÅýß‹ÿ÷¿•ÅÇâ«1zÈâEZ1 ØU&fóÌcZ§Ÿ1®HqÈ 0¬¯¿p|[aV¬¦ý'ļLÜÓà8}LºÁ›ˆ[S0s/£Äú5ÚühKç¹¶%ÀñœKŸ%Go–OA –¿‚\¤òÛë…1<ÏnSåÆ3Ä®læB=»å“>š0á«`ËÓnw%È•SG›?çlUÊÉÚLÍoƒ²ç­rÉÿ¡ü»€²9pÜd=Îc É·ï‡Íâ?&‡y endstream endobj 727 0 obj << /Type /XObject /Subtype /Image /Width 700 /Height 148 /BitsPerComponent 8 /ColorSpace 1673 0 R /Length 6568 /Filter /FlateDecode >> stream H‰ì— [㸆•PwPnà„´a»¤] Ã03;t[e!Éøÿ?©:GwYväfg}Žmé\dóúø˜ Ífó@‹Ÿ4Âv¬þ•O§’^KMPvà(ÃÁWJwÔ+¥Kz“j-*{ÙšX0Kø&mWYõ{ÍšØØú¤p|¿Ëî!é{Q£·šß=©²Éýë»wïµø‰5—èM*QÜpkj‚÷ÂWÇâ¹ "ö› Ûãò’Þ¬lpãZY¯)Þ±yh8EUÀj¤NuiN¥7É“!·nkµÇ»Ð›¹®%ìRJÕyémÑŽª=iwºT:ôzºôXGQƒj_j¨BöyB:cÜbз&© ÒëñŸšŸ )q…3–¨Rå½(ÈS’m3T%*µŽÕh4*žžn?.wRøe¼ÜúôˆÂ¨5Ç pIï˜ÿÇÖ@湕²KÈþ ÿÞ£Ú듾ÜÃ}L†Ú(âZû°¡ÙѶlKŽM>;Ø ³“Î?¹%ÒðŸVu-ë¸×dk‘‚C[3•ÑyYµU›ÝŸJIÆSûŒšÑCâÈýXUÅÊwºÀÖb7ó}*ØítÈ?~ûŸ'dÂ({ÚÄvÁ;ÎÏ œ’»Ž¡Ùµâ ZbLOê ƒ<®dr˜ëdSX«ÔoVgsÌžª´½¬º ±[¥óiå´h8ÿù/yº#»úhŒI¹dÈ®˜hÛõUÚ ãÜ$vC’#:8sb̤ Òâ¥'ÇìUÿäU¡cÞõ=Û¨å×6­WŒŠÏä+ö²êª.»§•öݦ6Ú™]Õz4Ü®À‘ËnC£Ã.î;™ø`³Ø=¦|ÑFõ ÚÞ‡*dÚ„Q/Éa§KBì¶ 6‰>‚ðuä'ÐØö»àG-ÚŠXèÓµ ç<¨ìU”nÂZÍAG*›4PÈ röt;-½c2É“Iޝ®cÓ’Ç^–Ô%¹¼Ä=îÄ™5r©„ìž_FWç|îýH úàëéèšøÇ§8ËO‘ù÷£é¾ùxІŸ°èJ#¤…Ë®ìº9ÀÝXžÁÎe¬³‹ì¶i_8ÙìæP'å¶lѸ0bWÚìòr|†Ÿp‚]èwûvQg9¥P£iû$‡¹£IOTYÚžÐ\Yk,Îh>ì´¡²MpZû™MÏ¥²¡Y—e•¥¼c2©fæ´ßר‘—%$Å?W’«GŒ2æõˆ÷ŸG77£Ïbl°NCÇȯ#@÷˾½>Å €í?S«˜—³{XñÙðÊ®>ôú],»:ìvN”—Å.ì'ÖT‡`\ ±k 2­—"¯KÝ2váŽbó`µùÐ#²}ìÐnß2±ü<¢HH2›ší;ˆªN&w±ñ—%e½´€U×2T<ÖÙÈÇÑçs‚«ø ¯ùLöª»Þ¦€tSÝè’ñá 78ð”g^ Ï¥víTZ«¹‚t64ÃFÖb÷H¼û±›E€¥l‹ÏM»æŽE<¯+E%3ûŽÔâ­ÞV½àeýtÊ«.¼ówÔ蓯O(ŒºÆc©ß ÚÿÆÛ$œÂ[®¥WÒ)dáe Yó WY±ðng7à”ô£JÀ›í]ÊYMtEf¯Û.ÈóÉRÙM2’ÐíW{EÍ­ù4‹Ýöv³{I$½ Ið²æN­Ñ”ôצ*óy¯fW³qÂëÜš]5©É[˜¿vüw&}Ö›ÍZŘ“9äš֨Ùu©”÷w3µ:ûJ¬Û­½Ì'±RèÌpúµš[Öëeb×­Jk,¦œ‘µ)ªæ?">ÖåWÚƒSÍîj%6`&cžØÃóƵ5Œ±¥W®¼[±Vf‡âÿú5»óLjTMªEhPW<èÚu]U>_ üR›ç{QX£ 箋±¯ë™uUæJ±½Ñ˘L,͵á2ïï\ëÀ[äk »îæšð‡^6»â]½4ße8x/¶Ò`e6¬ÔGãnß±ùÂ^™*¾4·ctÇëê3™– zäÕïYÔàû²0¡u…¯Ä—^îzøï|m[=óüËu‰õ£Hv3÷E©*E°˜Gv»ë ðc2躷ÝÏØÆzDJØõ‡rÛŽOìùiÆÖO%ìòƒ>·K^9 káBëªxXÜ«qnÿ1É®¼Ž {€üÚ:±Käå/¼›»qî‰E±ÂuïQ^žþÏ~Ù.É­â`˜ŸÛÉœìæ«*UÙ¿¹a 6”±ïÿ’Vâ·=Ý';ÉÉôè©j#°¸ûmYT¯aŸ2¥ t¥Ÿv/»9·>$ £ràhÝg×î+ åÅíÎ ­ üç®öS׺Þ×mí¦YÝ…×)зĶK]ãjw‡ ow_.xÜZ] •µ ZHo°S:(-µÞ¥WÚìÒ,È–6Е~Úf?Lk_ïâoæŽ~õðYDÕÈ0îjÛh·áO×ΛŒéÃ'{aÜNS´ÚB3ﱲѮИŸ­Øç]E¹+CÕ“NŒÄ™GæNíÖÔÖ¸”Ù¾@z}ª]uœwé3‡«Ø)YúLŠcÚûR]$Ï»ÊuæQ8Ô®Ù%GuNJVÔ¸ëG‚O´«=øRB7Ú¥B hKˆl°´¡il‚(ÞêÉÚ}ˈ'¦^h¾ÅÝZ] U” ZHo°Sé×Rŵ;ŒÚÝÚw{¨]]Юwhly#´h\/ µÝƒ5´žy7±ýÒo‰ùŒh /Ì‹Ø(o¢š¬X±ÍýF»ƒò$I¯t¬8ºÁB½ÌL½rµõ~«¾s©WÆ®jéö˜<›ÚFqúe~6ÈÌÿªð¿,0Ãx:[ ò¦ßϱ̷}æç°³îln;¶”ªããOîŠa†a†a†a†a L)]¤Œƒ‚Qc«iÆnMð|ô“qQ˜ u´O£øÍ@1¦°Š%Ç)6„Z§¿÷€ÌãbL´Î´KZ¤Ó$Ù9ʉð‡ÚµÅ: i(¢ƒ Ú–0¶ gcËö·MqÒ0â]† ÀÜ™]F‹j#C•ñõp®ñƒGãl ªYhŒ jÔ®N‹fμo•Ú¿W»Á)]Â3åbçÊÛíºe™ÔÃLc1¦m§¨«eÙÆëíøÌCr¦]*{ñãï&ÃÇ(&¸x:óAs¬£ë:×I\ï¾]µkvÉÑw µQq~WÚÍÚ;Ö®öàç}Äe£ëF‰7ÔÄa~6ðvP5ÀC´Æ ƒaLP„Ýi—*M·VC%æ€EƒÒ[#lÔO_ïb‘µ;ŒÚÝL·hèM~J]ª‰æõMTƒnÈ²ÅØè5H[n¿økaþ| #ZƒÄ sç"6Ê›XX°ê|K´Ú”§òÕ+3r2Xrh"Š B]K XÐÖ{’d11´óZ&©9¨]õùža~%6hï¥ÎY|^c~¡<äM¿»XæÛ> óBX‰Yw6·ïa|™0 Ã0 Ã0 Ã0 Ã0 #‚)屋”ÑaP0jl5ÍkÛ8þÜ곩vÜŒöƒZ§èï€th¬qi€nÖˆ­6Ç``¢u.½ …)Ku&cªm¡ `ï]¯|¶º›a©Ã® .0‡=IêL´æ`£p^ßµ8óÚ¹#I—Ñ¢ÆÈPiT=3CÿwVo®&½@µ’4ê¢jWh\ƒ§lÝ=‚ ³Öá¾µ™×Æ@íß«Ý`Œ¤ )'æöyçk{¯Ý4Í-kLµéÖk0åڕƱ6÷ÚÅÌì„këæ‘8Ó.U‰øqžDc° ˜÷.f¦¬&©Tµ-¥B ܬQVhûhj%›Ð±f ;U Bš)•Òimò¨;A´T5ì´«1ñ*#~¦öfþ|NónH{¨;’ ê/ ªq¡z7ÖR_j‹LÚaJŽ2‚Ö$ÅÜ\|:«%;ŒêšeËÚ×Ú¥ªa§]\j ÿÖî#rC»ý§wÁ”šªÐ\t¥ÁÕ䣈}ä`ªtâ«ywv¥ºmò®ÏÚ¥?ÙX5ìµ;•sóxܩݒ[—-³kˆE¥¼›û;í:u¾ ûèiÊÚ¡Þ]£Æ‡TïŠP·tûÛÙ̃q¨]³“ïШ8¿ŠÇ]›Ý:íæ(ÚƒŸ›þN»ø¢_ê0šËFÆo ²b&Ã). ëF»ö±™Ç@|ûö²ÛÀ ·VCä€EƒÒ[#ìTÚ}½›?ÃX¢lé5žûU_1ô7íïO~J÷\Ôk+Î'aO1/Ð=Bˆ›Ú~ñ÷Æüã@F´É$&¹â"6Jž(1«Ö¦-Úí8¯t‰†Qú©_Ë‘\DŒP™±dESåšQs,ˆÅ€E‚ty"Œí#4µŽâô˼6(ÊÿÖ5ïjÌ£j€AÞô{A–ù¶ÃÜÄâ«ÞÏæw.9Þva†a†a^1ÿºâŸÞÃÜk—y­ìÅÊÚe^ 'Ú½\.Büû¯ËBïÝå]׊÷O]Ò„.Á,Îí`nOsȸàåSCO››—ä’év¼ï ñt¹|Ž+âåóåËç¯{p§qù&æÛ·owùÞëÇÜÍ©v…øJ?æêêÃåéòáciIŸ¾-SÂ/ž»Á¦=v,!Ÿhô}|Ÿt\×ËA¾†m½Û)l¯¸§‹øò!ßø|ù.þ{¥ÉN»ïN#ñn·òýŠdí¾0Ïh÷é)þêüù¿£‘[Ç÷vJPFvîÅv;Çò¯&Þ§wq¬Ü¿ õ°Wféú”:Ïjòë—ÓȧÞÍ"¿]¬Ýÿ›Ü{F»!ã}I?kÐnlß·ù5ùçnPh÷ì—ënä …ùY!7"EJÞÿ9c.&!éD“Ù¶’4Ãj¿ScH‡è¸1Ç<¹c÷À×)»ÊåHë{Ť‘§‘OÝdJd¬ ˜Ýéev}«ìör”û›3™÷ƒµ\ŒF¸·cHe‚ñ2Ÿu+ÎØU8 W ÙÖR¥ŠÂz¹lm:H¹Xvwl;ÁäÐÂnÐS`7è‘ήótÇ9Ø`G$л Ãò"b¡Ëì¾­;ì6r8²k!O ˆÍûÁ»h¤ìºt¼ù'œ …*<Öªì0¡ž€ìí^ã¬ïÛrK!6+%¤ô^6“ŸìVƒYV6Äž"oÒκÉÑÒºüIs ‘KÃÖc|•Y7t‡]=‰#»Ð®Øõæý`Ýl,È$×±KªíUÞ-P¢[ÑßAîÉ'}ñ@Îp\ž"»j¾ˆ…¬KnºK%ïŠø¡3»è»Iý»Øfˆ¹¬±‹Æ<’î|b]É>‡z·¹Á.ô5ÉÆìbd uÿmÇn.LËX%ä Ëì~@¯³;·î?±÷÷3²T¶QØ ær°Æ.5–¡FriÈdÁ®»Öï°»ÂT†D¨³ë#‹®…‡bÌ·t©òK¥Ëìþ!»_(Q²ë&\ºêÛ}4KŸ§‚¹LmÅ¥m e¬š…jpИÎ tŸœ™¡³öôF_·ËzWZøpEж]Ó—ìnÁÞ$ò6ººãM®Ð€ßa/òepÇ9PÈ%»"<ÞN¬7t‘w{3n ÆJ‹Nf3,.×½ŸeJµRöñ7Yiõ@÷I÷6JceŸYË5îàúRÏ"ïè× ÊZ__øþ‹Çr_ØÝŸI;äÈ#^÷3®s.«`¸óœ8aw!ß¡ev×õ[í—è#§y(èwD.•ë1»oŠÙý1²û‹àýÈaä3Q—;z`?VÖ »,Ö¯³Ëú«ú:è§OÄb½&f—õWÅì²X,Ö§ôoöyž¢ endstream endobj 728 0 obj << /Type /Page /Parent 1711 0 R /Resources 731 0 R /Contents 732 0 R /Annots [ 729 0 R 730 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 729 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 397 479 427 493 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 730 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 321 295 351 309 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 731 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 732 0 obj << /Length 2153 /Filter /FlateDecode >> stream H‰ìWÙŽãÆE^õýTˆ5ÜDRF¶Ç6ì‡ÄÀHé`@IE‰1›Hj4ñ?äý»—^f‰À/žEdoݺë9U_o¯6›Ø‹ ÿâ#Î2ãg~éze’Ì`s¿xõM—Á®cº]½xõý›ÝÂ7¾O2»…7¼^oÕO¹ö"«ƒ¥g¨ @ÿsóãbÍÖúfà.Qf_6a!뢷U"ªþâ¬úÚ "“(?ƒí¼y¨û#΄ÊjÔ¤º²ƒ¯¾_Â?~ÕÞ Ç-~[™•*µ¯vÇ%¼¹”ý¿m[±’Håõ^{k¿ð/Æî³k¡ol^ã[p¹\ŒŽL :ÚÕÒ¶¨·4øê£w;7udMßn”°W‰‰Ðï(5Y†0q ècœAkÅâëÍŒ(@ÿq4¦Pû´ró¯Yš†ø¥‰oð¿,y9›£í,l›¦²y E•:Ø5uß6” GPç÷š:ÛueSCÅŽ¥ªÁà&ÊÉçeÍÂû¼gá]«1˜™²yOkäkÙ²23Õ Z‹±“Â!»ôFÆý­ì¸ÓלHÍò‘ —lÔв²ä-ïMvM{=ß'r9ÛIâ$d¡Y¯&+xë˜z*Oö]³ßîH ;!“NˆM¸ìgï[õk0Ñ’ ©M°òeÂC¶aj¦ÔÄɤ"X9Nп˽Æ2ħ9jô2S½ŽÔ}%Þß«ô‰Kâ÷Ü4wÈ8½RPïÔåh[cî°ZCìCà=3ì |BÙéîIQÔ) Œ¬ ä·äàc6~x}§ üµô^DÖi²œ¶—ÖUËœì˜Ëj˜KÝŸª¨µ‡µ¯rR›ª{»‡ªüÙþ†ìí1»ïh«Ô…#)÷K±ï‡còb‡„±Áñ!6Q”¥ áے02i8ƒ+©¥yAg†ò‰[¬Üte}¨ì¡j¶9ÏTUÃÏÃírøèÊãt{ <…)ÁˆbÔø¥²C „‰£($c?H§® ¦¨HÁãš~«45a6s$üp%ô4<桬¯À“:Oyž´Šq³·Ûóáö‰Ë?„lŒ_æ6FŒrh#û®>³¯ô—7¼’ŽëÞçÕY3ˆØQÇ3c¢Ñ˜ ]x«¾""‰Uß·åöÜcýâ0P× JÑgLòSîØº©íÄ@X½¶E~®úk·À)F EñŒ#ã¯C‡îP`Ï$ªê,Y˜)C„;ÄÌãåíÿ 0†w„Ÿà|ÛjÎ ³;F£³=ô ôíÙBO yU•½ˆå4íìžöR\ÓÚ ydOÅ}( CU ;6çj[ÔÒ–}Šž,ž2‹eÛç@0¬ÄŠš „›P!þ,g-ƒi[R…¤ŠÊN¦ˆÏÐ4]åPÛˤĽ5š¸õ$fóÝÑíÝëv‘=R¯`¾ÙÀ­~Ï8˜Ò *±ìmüh… æ[:“ç"'6ï9OP1¢…î/ Òyä[‚ö„ÏHæ;7Ó„;2ssXòÄ ‹¤êt²õ¾o쇲£ÐÝR¡Èâƒw¨ÆcãúNsÐܤΠÄÈLŸ€ü·ªyoÛ¡2þÁâør„ޝÔhà†4',eŧ־/©où(©sG ¨÷¦@—5&r>f<:Ò™ì*ØK}~°”(L÷\JTÐÅÑ=Ú#Büên^Sç1€S¶Î·•Ýj«} uÅèZÏ©+¡7žQ× Ußä.©<äÌjj[Jï5…?Ô{ªZúCn,:Ï߯%Ú£#zýi F& {Ô¬ÚºÏòY”$t‚þƒÏþà³YkN| |¦évx”ïx@Ý©*M÷¸ü #l×”QOlN¨$)‚Å™À¢^£u5 ä|»Vî1ˆN×Á÷ÍÞ Š˜ƒÂìN/óÊòÁÙ3 †<ÔïOÝÅf]ä!È\ûE¾@åÂeCWu}ÞöÝòc…tD8Np8’ÃÄþ$TÀ~Î ŒáFé¿0I’+Ö2 ]^Éñá’? 3'ÏÑó?a`®±\çøœ91Ïw¸AsŠêÜyH9¼“ð¨n+»ëÉ^E×ñ…Øš²|ÌRɘR¼GˆóQ ÃËÆê÷²èÿ dé”èTt\mÏÄ…þŧl¶X÷á0Ø_-áJ>cà1í1¶k¨h¶Á´ë T;‘¬ùì^}Ãߣ߉Áz€DzcH¼"˵%Gu. +–·î¹wOA2ü8HNH‘L-È~o¸´ 0 Çæ"M9ÀžÕŘ ÃyÌáÂ×.~ß9/yÛ0ybÑŸ8ß¹æÅ£ ±zÊøÒÕ#mpMK=–ÂI`ç,6I<ËÙ„<¾CñÂЋ\x†ç¢Š” (2„ÿ2:8.E„ (hÒ –ñJbÛ!…©ðº+š~m;./ÎUµœÁ¥ÇF?ÎÑs˜BD>wçïYxï)¯.A°ŒåæÒãt_Þ#oŽ(ŒÿÈÅ­íæÞк¦´âí„gfû%ÚÊ·9Æ ±ióçÅ Þv-m¥ŽVž¼ á„­{7Ã×íeÄ|SX$u¢n¦º@QU jVˆìS•;>N #=ÛwI‹-#"ï@y)ñ>ú"EF¹HÝôtñRTøöC¾ë)»|lO䦆§wwkÄ ¹4f*ç%Ðìvg™p’tÿ ÕÞÀÜ-µ\¯ú#qœÂ;=œÐÎ<¾8:w[E–¡¬‘Ѿëöo7‹ÿõì5 endstream endobj 733 0 obj << /Type /Page /Parent 1711 0 R /Resources 735 0 R /Contents 736 0 R /Annots [ 734 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 734 0 obj << /Dest [ 721 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 439 238 469 252 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 735 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 736 0 obj << /Length 2449 /Filter /FlateDecode >> stream H‰ÜWÉŽãÈ…¯úŠ„.N››HªÑn`6ÏŒaZ‡» #KLItSd™K©Ê2ÿàôÁ/"’¤jóÌøfW"s‹ŒõÅ㗻śÝ.R¡Úa¤üã‘ä¹äAª²íÆOó V»óâÍW]®öï T·¯o¾ýªc·ü  =ûÅz|½,>ê?oû‰>ZzFZ¥‘òþ²ûÝb˶* ümŠ[âÜO¹„D,‹Þ6©ˆúg„Ùuxë0öSäêæA}x¨ûf"m=HÒ]Ù©/¾]©?ÿË[o0n±¶ñ7ºô½?­Ô‡KÙÿö ‰µ© o½ÕêGþeÅØ|6- üƒÝטc .—‹ïÅ~¨;ºÕÒµ+}¼°nï¦N,é›Ý"T¥ZD›ÔÓPÅ™Ÿç* ý$Q°1ÉUk‡Å—»Éqˆ-ÁcoÌ®È#Ðr÷·Å›ß>‹×èÈl³¥¸ñYý+ÙœÈfÜé rRv»Ü‰ñƒDVØùá–®ú¨—‡jèÈ‘‰>-Ù¦9Sà‡Üy‡N„Sè镼¥ÊÎÛø¹VF›¦Pûæ|Ûz B×xkاÏnáucû‹µµZÞ ¸y«å×-ËQ7(¼0D–4Ê`LP(Õ²¹µõ¾jF¹N,}µãáɃçµUUsä"½¬ì¤èg{ÛK¬Ùº5îˆG áÚ)¹]FÒm+u3ô,³¬M{6}ÙÔ"1ÖŠýGo'[¨¾QÈu +Í¡·­¢´Ñöζ,ále³ür儨œ•’‰†3\Ù;o‹YêZæÊZíìbaª9Àñ.£Éh2$™ IȽoM‡Ú å*Óõ¤GgŽE–çy‹êNÍP˜WweWÞëj9íÉ.ÿI^E™Ÿ¥W‰%wÏWÔôÈ´T÷Vš ùãâ„d3ÆCM‘D‹FaôFÂ(Y$DYÅõ<:©sSXuq›Ài¡ß_Ú²§ÍÐßm¦(Y¬‘ $CEVwM5œ­:—ÇE¯ {l KŒ4£ˆU·¶åp³õÞ¾.*]y¬½æ–yìŒ{ü¦º‚gýà?©>”äf¦g¨°Nýí†îŒ2®öÿBSY­¯jp©žé´¹B„`3§ÙFL媈4gŒ¼‡xA—q/åd*RZ .e`¤ƒÆ­$ I6nb ï«G1¥€vÍɪF}È<Ô'–lcKU8·¶Ðµ6ÎÓ¥x«²&P‚{(…P"Y-ûžJ5×µ"ˆ‚í¨Uò%vÊQÌ¡6eMZ¦ R)9*Õ.k ¿“ËšºzIsgÊ &(AÁpµøb¶Es \@óÊý€U‘úS(]Š„‰dBâÇqž)Ž&EcŒ’«^}UÕî‚Ü'|= Žz× 7ý©µ¦à1,৥؇úý[Uªx þ¨ÞË8¨¼N sa7ƒ,ÜòÞA–@ §ã8"Ó ̦ºxdõ¡mÎ ºà8ê—ŽÃßP‹ÇÿÂ+zòEþZ‹Ýd1µéÙáDrÓWMÝ#¤ˆoY¿ené§Õ’NÈÈtgBý®°7Ãñý“Ò\§#F3šæ“ßsw±ArÉårïæ§îûvä”_"á®Ã-ºõ†òYÆò‹ŽK ºRn—½5²ËôvùÔs³ÎW ^aßÂ-ú¾-Qö–©F¨Ióðÿ?jd |uSÛŸá*2ýµ=˜¡êߺ•I¢ë&Å’c?ØÒS™eGî@[\Nü ‰®bŽë< Ô” c†ìN ª… 8#O:IûFQkWꀪš³rÿÀ()\žaƒ©m3t@„v¨k»©Êºg½†± ÆžIèHVìò ÊL `úÀ’=j$žW•q Á|zÔÇC¤œ¬ fMAŠp¿ÕrK½göèæ^}ÒÓtÊT•*{{v×  ž7ÞëžrüïCùhL•÷ ÿ¹bª³2ÑmCºÉØÊXòKÌE¶ÌU4wQ“ŒÐ éO¥Ì˜ÕÔÄ×ŪL¯„bíN“ó˜õ\ŸìÍgK†Y9¡i­Ø¿ZEN+›‡«Cã³àÂx’¯d#Ù#)§:T´¼¶îÙ$˜äQ1¢²Ù3Oo5óÀg›öc"³þLe=Xú8u¹wg¹[ã»ìÄygUÚºï¨"Puwxɹäpê¬úòLbP'Ÿ<ÿª¯ÌŽžv©ïW½‰ë{xàà )‰ûçÊ_Í¥H¬#C"#Ǫ„ó*°d £%ŒÁÄ'‹²Û›¶ ®FW7/EI9Óó04¥Nç¯oZnÜ$D&(±üg†qA+Š’Î;1Ö±«:ðŽÉl^WòžŽ¹[#' èWœþn+í¼%ê“ ‰µÛ(̤·îk‹q¬‹ïÚ;MFð`¾GRd^Y³§Œh½ð‘Â+u2wµ2}¤DË…½È}²™dsµ'Œ°úì>Æjƒ7# .«KвL>džïÏÝiù-¥zÄNˆ·rµüë=þ–îäÀ þp(ïq´ ~ãÒD}Ïõ5[Mi+c¾õ»þÃï_Æñ+s5ìèn®åCN=‘u\6mè&¢Z•D"ñù™C@Å(K’Ïä1Î0p9zÛ”(È«/?|Yq”˜û:°ÏÙî\ßLŠ@…Ò)ðbÞÏß áfÎ{"ú1þ™„à‘Èùæ"ËÊz¹äZä’k|¡Ú á—QÛ8Ba§ÂìžrçäšÚFLÛÕ;Êð$Bc{(ñLô½G´ëýŠy¢â_ËÓÝp·øööžå0¥ÜkD¬)¨¼Õ ì‘á™^¯°ÝWx¸Å &̈?ô—P)v?Mu£ýPÝ9–‘s©Ñ9½Xº=5ß{ýïY> endobj 738 0 obj << /Dest [ 604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 128 123 142 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 739 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 319 128 346 142 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 740 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 741 0 obj << /Length 2652 /Filter /FlateDecode >> stream H‰ÄWëŽÛÆFÿê)ûkX¬hÞIÆëÄN]x]#+ÀÙÚ…AQ#‰)/ 9ZíöAò}ÇþèwÎ )­v¸EÒÆ±Å¹ÛœùÎw^Î'Ïæó@øb¾šøðð?Q–¹^æ%"Ån’y¡˜×“gßô™(zÞ㉾h&Ͼ»öźŸx®çÑžb2>÷“ò}îLC7’kE¿I(œ¿Íÿ<™±„™H=w–@K˜¹‰g”°€€eÑWœQÿ 0; e®ï»~è@¡/Êf©Ýë®tRD¯Y_<X‚“˜jÖB·bÁ[m)v½âÁ’«¶öÉÀW"éˆ ª…a ¦ðÝóS ©1'csȹ¨Úâïýà]všŽ£KÞÌ ²#—üÁ#ëÐ7m£ó²QKQ6Ïù^R{³‡,OÜt¸YJµƒ/–j±[_œX1åý0vœ˜n¿XqÞˆÂ(7zã_ӌυ>IFÞÜ K%eôÎŒFA, G‹üdô㣼¤ô¤Æµ-vZõ4ô%ÙERÙ./åDkÚF}E |¾ù­Zå»J?·¬`<ýà$Ð!PÅFLè}+œÐ›y²w Zn€e¡ÌИ9e!£¯Þá¶Ø:ïôb¢ñb"£f¾(pR©l–œË˜D/)§)í¼ZÔªïóµê‡ÛäTŽï 9z[ö墺wÅkäüŸæWo)e»šˆ®ÞŠª]÷çB“Z )ë)b˜ô-LÂ_¹iwÕR,”ØoJº±Dn Rã1Ų‚ˆN%ŠœapÈ¡Ïs@Ÿ/.Z¬œŸ-¼L€}‘›!ÈêN³I›x/ŠMn–òáðaeÙfìXËÒeÏçd KU€„ eíÐqs ó8°¤éÈó`̬øP bãyÙôªÓq®¡t]6 ÝM»UéÌàuƒ{hÄðEݪîÞè_:üÂr]¶¨°P¹cV 4Æ)<Ž(EêƒAÅä¸vhŒq ñ®®t—7}•ó„VÏq-HÒ~Óî–V«²`LeãL©褌8y¾a-Žâ‡õï káo kþá’}{É‹¶­äÜæÕÎAPQ­¿ŒhÁÿÑÂÿѦ ¦ÍGî®N+ø2p¨ðyz³Â#‹¥¥NšªmΑE[Ó+!¼iwzÝÒ¨…½ô—)W ÊEñIO ài†ì1Lu FjÕ¶,Ê&Ç›úðÒñMªâÕ¹þäˆ}YU„O=d¢1Zd¬&HPÁ º*Ƥ\€ýáŠß:±)ú!Ф9UGh7»´7s¥&qTKls½Fò–Ï©¢4bJV5`vƪ;ÚÁ#ž&ÇZ«ªÝÈÉÉE¤‡‹HùºVe¥D“sÌûb£jõü´ôüÚåò³ú(ïðßçþææÆIåÑ¿pàæ3cqÈ eýîÝ»ÏWW¦h]}¶·ìL3¸°&jIˆô4ÊÎ)#~ƒA¡¹èXa…6ÇHaf†Êñ£JLf„¾1ãÃFuH¿d|ó¯íSâýAzò~j¯-|ƒ3Ú'¸›î˶ gäú¢˜°ÈSr½€ .W¥ê¸œpbuírWPí¡ÛÝ™È&ó±ãšVlDnEY™üÆ|¹-?·ËEqÆâ>PÅJ@Û½Ýý†ùšªA$/ß›áÓIwà‚žÔº¾¤÷~v·ÕGjÈê^ã¡äá™ÝÂq¶-·êhã%øÃÆ”I†´€¨ƒ³a~ªŽ$œ?ý̯Üv©êöŒŸRÆOÉä+`†È‘û©$«øC(]¸'—=ñÉý›çóß%Ap@ÏÀ¢ç e:µ'üË›á—òFivbä1¤ÆŒ™w"¨ix1¯°+ôIKöäã ’;”ß:á¡ ý^N>nÎLÐqœk‡êÄJ¡pBPû`='@©ÌZ•?è4–Œ–µ2‹æ_{`­Î¾äXò›8f8ûHßÉ1À1tJöëû¦@a"Ó¦ÛF• ]4»z·ü»}äèÅHÜɶ««+² Ñ!.N${E¦eò§ýh ók‡d)À!• l&;‡H÷¹Ø›á†–J{nC ~Üõšªýñv{¶&L ÎìÄÒd3¸%>?Ôso-©í,z²mÈÂ`'x,Í6d Q]|k‡¸,ÑlsâvÔH]Ñ –™ˆ$Ò·$27ueœ>bÙé’LÌdAcàle†Ã2Þ1keVûÞîn×à®@Og¦z8‡<ÇÈ?.ìI+ÞŠÝ EßÖös0d÷büê©­ó‡ÃT$‡%£åµƒènØcÑ)-wÃ"Ø ÎÂzkgù.aú¹õ­oEÝbL„ç<¦¦h×&·g¤€!òý ØË]½5É2E}i¨]ïíÉz˜ 7wk'«Ý0[—ëfp°3wà‘,{í z v¶áænì:;C¯77O–rMëöy Г E~HÔHžšwk'NóíÐ'é• 5Q¡à'ÈZÊ·„8ÿ"—í¼X•ì4uj1¦{N¯™ ú$GDçà ~¾¿k5ˆ"2ì–ûT´Š»ji £¡f–øu† R *߈- ¨òû&LÎ<ðŠ:Þ§”·Ê\EcøÌmÙµM]ç (¢ÔäGÙ©Ÿve§€W¢j5˜¿È—Ë’ìAa«Q¶»ûs”ïu—/± pЊÉ8)+@ *Å-D¾sXÕ½Øou‡õô{8êܶ•Ò ^ÔyE¢á) ¼Ï×H£Ì0îJ ·À’Zºâ&l› ¸åÓÆ7îc×ÄÔ&¿ï·Ô”Å×úÒ–”¢*:ª' Óô~bù4£~|¹—bݶËábqAT©Þÿ—qñjA(5?œ]oA9À§‰\УF£sZ¨JñÕ"H?“Ÿ&„ºËk¢€âÊ{ŽÁ“ëÀàÀ€–§ìPAz8k”#€·Ü F&ð‰tM‚âÿmÛäD²/YXNaÖ¨J3º&qýjŽöpþ=íñåå»ë·—óWh‡ºr«Åj×ìÊW6‹Ÿ¤é唉 @ˆÑo>î Ç ñ} ‚Ú»²ÁmdmÃÓ nõ…8¨@žA„á'Ç}ºƒùòÃö9{ä+cŠiüž½öªpJƒä tI¨¢|¹ê¢m^<{0AÇ_Í'Yèz„x(8fbÊÿþ{E©\i„eMÍà²&F@£È›™ Ní¤¡v[ëk’%Aî‚HâvvÍøe‘Ä&kT‰é#,Ò=?”. endstream endobj 742 0 obj << /Type /Page /Parent 1711 0 R /Resources 746 0 R /Contents 747 0 R /Annots [ 743 0 R 744 0 R 745 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 743 0 obj << /Dest [ 737 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 262 379 297 393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 744 0 obj << /Dest [ 604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 285 102 299 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 745 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 298 285 325 299 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 746 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 747 0 obj << /Length 2771 /Filter /FlateDecode >> stream H‰´WÙŽÛÈE^õ…~I1hÑÜDQFm{Ƙ`Ú1bžN;0(ª$Õ€‹†K«{>dþ!ÿ˜‡œ{«Hª/d¼ˆµÞ­î=uêåròb¹ „/–›‰ñ‰’Äõ/óÅÌ/ËbòâU“ˆ¬á5žh²ròâÍ{_l›‰çz­É&Ó¾y˜ÜÈw©3 ÝHn})âH8ÿZþu²` 1÷ÜE -aâÆžQ–E­YlDý;Àè4𜩺±ô±ºïïËv‡‘@*’d£qùæTüó?Ît†~¹™;“Úñd¶;ïºýUÕ9 eZ®éBŠßø— c÷ÙµÀsct–¯1Æ× ]_6¤U‘Zˆ†JMÞevhÇ’¾[N|¡Å$˜Ånû"œ»I"bß"£DÔj²™¼\Á},ñFc µG•ËŸéÀ"{`‘ëEX¹a˜Ì…éöAÏfî<8Š*ÆlT±Š}J\ßwý™“ â¼h¶ë®Ø_œ‰5tü[8ØË=E;»úQ´uÊã›ÎD[ tfr£sgŽUЇ²1Ñ„¡Éã̬ ”a£u~oœol{U•mªKµº<ãÏå Ö&lìÎûC¢¬a ´[ž¯ÕªÛ^ôá²VLyý.‡´Ç%‚’XÅi)2£Üè}E¯?2Ÿš$cUU¹‚œÛ4ïÄú8$£1Á`Œ.ÜÈKJâH¶m­W]«êú’Lò鸾h’7çt)«R}C |޽|­6i—·gvƒŒŒ`SšåÐõÔ";EµÙk¦¼vpÉσðFµÃONü‰„K¤hä.eTKiv¯ÌØ©(TcšéÖŽ‰Ú‰°NeJß"_Œ 3VeþP^ɳ\;¾w4vÐy.VJP @Šï, åŒ:>g:–Ù:ï5ëR Ä>mw=‚ þßHZ”Ƚƒª‡uš6/pŽÐ4Ú‰ó¼Úî)E"™’)±lw¬Š§I¸ÙV±”<¯ºÜÚ1Ø!Ê~󜊕æŒÖŒ¤Er§ uvlZøù£ †ô3Ú³}‡?Ÿšëëk $~yýÉáB„¼}ûöÓÕ•3åÕ§ªk·•¶ETnÝÃê®ÈÅGYÕÂEë£óİߩH—YE¾Y÷deÈiy#?ìT ñP¸ßÛzàõA<ˆ’âzùÞB2 ÝÖáÖýíj°ºq<†ØÞq'äú‰Ðt~(pÀ‡^“·°¡lõF«Zlàç[]­»¬EºÒwf‡2yNÀM œíDjEX™©¹‡÷úSµ^e',îƒF¢Ç²\W»úTN,ßSæGòòé>M!²<°hp«êFWå©8¹Û·GjÈê¦E-¦9’]Ö`Ý^ïÕÑÂË}šíÌ!3m€A+ø»mÑÀOU“„ScÕò/ÏÊÉZՉŪŸÐ¢‚  ²{¦”ÉSÓªÍÜG‡¯gÎݤÐï;ü`äJåJ×”á¸ø%fòºÿR>À¨–Ø9§¤.MŸh´æŠ/y2Ím°3Ô¤ÿš½¯J.øˆ|í„ãòÄÉùÿÅIÌp¿Ïð¢aõ[Ã)N€åii†Ä p[æ—Á0u<°-ä©CÉ(´©—{Êþ™Ïx;G™0ù“OÙ"ÒÌôù)4¬Ï(ò¡èQ®¾T,û€áp¹2,·"˦”蔉>]p¢ìŠ ÿ³ÍœÏÀ·}›ŽWWWd‚Cì.E¦%ò—Î6ÊÌ|m—,’Ìå ËûÁÚ¡C<Ó%².µÝ·#?wM‹lÎŽ—Û½…á’À>;°f|°[so?Ðso-)ìhÓ°ý[Ba)XŒ–dK“s»uè’³ãvЈûý1𙈠´Ñ·´‘6Nî¹1“u«ÉD¾ˆ”sÓí§‘¢(kŠ*Í6]]•.™ëK±ÜÙ¡Î-(÷é}1tWv§oÅv½@ÑT…mö†ôýF -¤ÛœÍlF "ÙO-¬íE×ýûyZwý$ˆn§•õÖŽòYÂôSë[S‰¢êÅ<¹¢Hiߢ·»Ôfž‘&p‘ЂÎp0m Ú';ߨE?@µwkó®-ôv× K iäàIÝ´® Š°£%3¸ÓÕv„ª85¥Û¤2ODžsBó2b阰‘|lÞ­ø|Þó>*Ô¢¨Ð!Ät©§ôdÍ_ä´MAŸËÜ|ìpÃiÖ¿{{@ù&ŠdžLÃ뉌X:”%»(}h/e:ÍÌY™æù½Ø ûpðU¸Ì<Ôlq³ËºýñÀ¼“ûð’Ç~¢û,’I‚%±ÒeZßŸÚ {VœfÊö{,_ ž¤€3Ä’+^¾&êT¨vW`yB)õFÔö-jÿtåÐ1ÿˆß@~t¸L\±Ä]bîD¸áŽYZþ™8š¸ÕŠo±CÏúS\T~` %ë]+ÔZ·UͲáuVQ°æH5ú55gÖZÙEçXkÚæõqÄ´"mÕ•¡ãX„îT<°]<¿yú,Ñ{zä-Á%‘¹­^*T†æá(;J½ÅQåýI)%sì´,?'z™ð»*æª`òEWê,e Ú죂°¢ssž)=½ÇN…pŠ$œÒäÌzî@½ùèˆ- ÆŽ}Ò¡r9qw)å'¥$¡™é8@”–îÿò 2Ê4ëÉéÛªÅà ߈jÏ®fµÂÑQvçU F#šucL3W˜1q„†ˆæS\aÛ(´)ÛÈ•¶®~u×™/¯ ¢þ‚É7rוëZ­±×hTÓß‘!Ƨ Ì{UrÅTæÅ›xÜ‘ë´MéN-›ª!Ã}¾Æ—‚o_ —b[¡ô¬óÚˆ}çFýÝ!ˆú›eèsŽÿBé°à[¦3MÅá&……N“Ì´“&ùs•µú–qÑù /?b˜I£@¨»´Øµª À%Î~)tdõF× 1 H\_Þku ž÷˜A5þí«>¼z]Cæ¶ FDž@¿[^½óúWïD“ÕzßúµéÊŒõˆÿ|nûG ›d¨k¼pPeT_ v*b§âÑeyŠÎy^¡Zñ·møE‘Qøú ?¾Ü·dOÃT$ª9‘!Õ/ÃÎ×k4ÔTÇ<õ&saºsÏ]Ä^,‚º=" [C‹¡†lé&.!Bì€ œÛR€ÍřتRÕ¨&š²3‚¦,‘^.kAõžÀgPëÆEGjGb”¾ªÊà£è’>c&ÐgÈȯcw=÷Æœ¯ÕªÛ^ôq°VLyý#Äf¸¯R`„Qnôξ¢×Ÿ 132VU•ãÍî“ó£lûqHFcŽèn|”ñ—jÚ¶Ö«®5`áK2É•Ÿ1Éà¯,Aݾ!&£åkµI»¼={ø† Ý(‡ìëg¬g`aõªB%Ði ŠÒÄ«'¦ÀÆQñ{‚+4HÝ ­â¡MMPqT ­öu@9`†B®³!l„¦®¤Ín€ÖåeଫØË!tf Ô TË dÓóótÁ¹"V±"59âTˆšdpê+@m¬dBí€Ñ ¢ /¿Xó›/(+ë˜s°6 ÍX·(7¿\ –L© "TøU*$gBXÉ –¹Fi.²ÂļäThIâ£zZ endstream endobj 748 0 obj << /Type /Page /Parent 1711 0 R /Resources 752 0 R /Contents 753 0 R /Annots [ 749 0 R 750 0 R 751 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 749 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 461 706 491 720 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 750 0 obj << /Dest [ 728 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 385 528 420 542 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 751 0 obj << /Dest [ 754 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 270 127 292 141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 752 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 753 0 obj << /Length 2001 /Filter /FlateDecode >> stream H‰ìWÛŽãÆ}×W4öÅM`Äeó®Í`ß`¬£$@t»É²üµ8¥1ÇWæLÁq±ùºkMQ·Œÿ. L>êgéŒ~8¥‘¼­ôæ]18+–|žr2œrï*ås§¸hEi•[½ÉzU2G=±26]×hÈy,šøç9$³1Ñ\éU%|IKcúzs2È<*I&)äÁ6)Ș Ú®ÕŸbìå7z[œóÁ}àƒžC+ø*k"?XN•ÃÆ,ùèäQ0‡ƒmž#NȇVÒÇ­´¦ƒÈk uÉzîkctë .[ü¥èÈ^—Ýá Û ™²ízqì»êTšúQ Ý>ÖHØ\ö]‹f¸ÅÀ‡\ ϶N˜-Ç%Dðɯíð ²Dd©t•eù†·uMÑï´øÛ©öVHØò§ærÃ/ÑJHó2F C”RÎy>”ÿ…èr{jÓåOׯ2z?ʪ;#·X]w^6úÊ"kÌJ6Á¦Á*õ0x e ‘#Ua ’ÚÚmâj‹"dèÆ[QTUM†Y³ s0Ösj'ö%ÕÌ+Ê¥¨ Ôà‹î,6º,N´£EmÄ—Æ#EÑœ ”È m wê]wÔmÙtüD>†ò¸m:*¬Tî¼%uö­£:¬þnè*}gysbMOŠ„¼h»wóôÝ`ŸÆÔåKZçºi@'O·f,Ç‘¯˜‰Ár'¶š‡+ÆÛ£J¥áªÛв××2±ÞÇ‚‡¢=úÜðR±7“lL³Ð9 9)q ýÄt  §= ©*í3j“®@0´õi±’¿ˆ-¢ ¥ëX<³…šAW]„ÜÅ-²~[ïø-AOx*dŸé¢ëƒLÁ'İJ·¼mg[ª°2,¤o’@˜¡C…¿. <½6`:ιoÐO[þ…ÌE¯dMìðZEþªô`E,¯eºï LºE|ä–qOp†òwy ß·]V‘œ˜:J´éUt® þUµö莺߸›£u¡‰ýWrÌL1PøXÔ¥TSlàd„N£(Á>¼A±3†*Ÿ¦;j)äDσǣGÑÐý8Ü`jú@æŒy“g¿Á€ùjfÀV?çÀðuœ‡Ëùf8vop Ùƒ”½„º¡jé(šG³.ëm­«f5ozéæ½ƒ `*,ì¾ý÷Ä“ÇF$}Ù¸÷Ä{˜0Ali§ÐnËG®kzïŽcq\>Ÿ„^Iw j¨`§¹O¤â E9Ûì=r²[Ÿ0‰E²‚¥¹ôÅk³ïNfDÕÖí$j‡«d¸³+ŸOnŸÏÝ_¸o §'.R)¢¨ŠñýKä=ÓÒÈKt!Ù\X:ÆÐ¾ nF¿¢N1\£¨Eô›JÝÀ_â¼×í5–{÷ÉüÝʈrÜm™owºò?6ç±k9.É µEÖ± ↰šQ䶸~à&Ñ[©éRÄÖ [ÍÐ=±¸ÞŠB”Mã†[*=¼8ÝÇs}ÆÖ¢Ó‘ì©Ä»J?âfã¡3aB§@!y–÷²ó¾.÷“šÊYÙYÿâÖ raEM2ä¦}¶’ÒÂ^½ØÌ/Üw”Ñ´ Œ^Q~ÑÃÅ~Õ–6⣾fÔB&ÜŒ w5iKäJ ƒó¥È¨¹¿*—*nìàÆqãñ޶[4”v9+F׿mqß"õ©<žŒÃ¾¹scÁuëèÁsiñízñïMt^ endstream endobj 754 0 obj << /Type /Page /Parent 1711 0 R /Resources 758 0 R /Contents 759 0 R /Annots [ 755 0 R 756 0 R 757 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 755 0 obj << /Dest [ 507 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 548 295 562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 756 0 obj << /Dest [ 1634 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 428 324 442 338 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 757 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 221 283 229 297 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 758 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 759 0 obj << /Length 2178 /Filter /FlateDecode >> stream H‰ÌWmoÛÈþ®?Ñm>‘@ÄpùNs€_dÇEb_e:@ìM­,¶©’”uιÿpÿ±:3»"i™’R4(îr°HÎîÌì3Ï<»{ ÞE‘Å8‹fn1þÁ†˜óC×ðÓfÑbðî´ XRÑ“UI>xwqÃÙc50 ÓÄ1É`¸y\îµ_b}hŽö(ð×Ò˜ç1ýoÑ_!y™o¡QìÀðL„Xä Ÿ\OºúÝ‚¯CËÔ‡Ü6<Í ØÃ3»yÎë9|±4¡ƒ'­J+v|ñ–Ýý[ºð^‚Í5\-ÕM-™¿e7ë´þ&ÊŒœØZœOõa¨±ßè/%F˧¥Y¦áÁKtß(ƒõzmè¶Áµ £ ®!¤&¬.QŸæäi 8KÙÀr=Ãö8³}#˜Ç Ça°F'`¥Ì'Q†Íaˆùj,£`ÁU0Ç0à¶øL¾n@õ]×𭪦¿AÕt嚃Ûz€•9ÊÅ“(—«z*žÒœ¾Í~±ø©H§ì—Ûˆ3F¦™ r¶IÓ¶B$O˜oârö´Èë8ÍÅ”¥ùˆÐ󵯭â¢gøü‘Ò…œ~TéžhÏê'OþžùLw âéãÏÛù ÉÓÃRÑ›D"hTJqΙ–ÌÈ=wºs…æCQdü<ÅÙJç »“±šd¸×YÛ12×ÑêºLVµ¨ð•k˜ÆîOIÖWË‹\lxÒE%D!àSœê„Ìâ»"Ó£šX~Ð._Aˆåp5l (g©»àëIG …|aEž= m±µ31‹WY=RëQ¹€¨X2)N° 3Ä'Ì誈:¤±íÒ[ׄ‘ÙÆÞ4ÆFÄTU/g¬ž§,Ú¤ŽÙæi¢ÉgÔ7­fuk| Ãë|/¡±Ø:Í2F=Ö5åеr‡Ý•èˆYQ.â:-röfª©%á)Ðfo0H²Tä5KgázQ]fŽ\G^Ô¬ZŠ$¥Iœa% ý¸ú'táW ½AùB \V"Ÿ¦ù#»GЋÈäWÝh ÷=Òㆼv¥ÇkÎi¤Ç™ZUÏU-uºß ú” ž°*Ó)}°LšI;äÏä$†³¤›oDûCÚäzöP›¬©M=ÕGœ$DP¹iƒê"Û¾j•ìO_õïQÐÿ«hmKÃ}+ Cj‹!¬¥Š=YTj±‰+êŠRÀJ W§lV j·b)JhJh 5UŠË–®îÞJ¦Ì"‚Î÷á¼€(‘ªÕ(öƒ`+ùJÍ©žW:r‘Z·B‘Ôâyã_«ôÅ;d Bhù•&†UA'µŽCp¨ÆPkJήùòµgù©;Sµœ„ æÆjè’‚!³(6¸äÈmy’uhÚnƒ9,‰)”‡zËu<^1U)…–öˆÉ»Òz«JÊ…ª•¢¦ÜÔÿŒ9ÇYGÆx#^.¨ïh*f ôR£Jùê˜jENQÊp ¼p6–¬ªZ÷©<¸ŠFÁ¥`1=W€bs&5Û @‡›-„¶ÛéÀÏÑ¥>ô¡>ŸÈëøîúj|X m8ÜÛÞO èA­gKoLÕKIþÒœ}†ÂøÔ•–vùI‚(wcèBÔ¹ã"< I)ÁÃR=„\NÑjA—Â&*7ïXÞ}Ê·lr®s[;ívD{ð°[í°ÇEÞw„ëˆðÕß-Õí\;:= ÒG¢V«Ðñk «¦F|X¥Y=T*QãÕ!8fƒ{¥6›d/khu]î#Ö (YZÕ°|¸ßA¯ ûÀ’ën  ’ÒÕ %/Äž¢7!¸*nB ù³¤q¤V'b±dš•—¹Ë>G4õØáA›!Š!äC†F®Ð,ƒ]ò‰Ä[ÞÔ –«1 Tà+ðÖªµ¤‰ò¬¨9«’BoÖSÈ1ý‡@»e¾Ýè„â5ÐY$}'’Öç òp9(Oˆ%ì«å²(kAçÀs(Ò£ÈAh³‡Uø¿í«íªÝks8Ff¨ÉK¸#U õb†_°„ÄaN%lp×Ë9plÛ•†joΊ,+ÖTü/–t(V²šëŠÁ /õh— x×¹E|W|ÃE^ãÍÝ-øp´1¡Å ÅìTn9Þ°õ<¥ nNž6‡ËÛÂÃÞs,™«’<Ô3·Ñ)òGP>f1PuG7hŸ®J\ç4~ÎÒÇ9âcØ(+¶t}Bvý„ò‰“:}Ò7­02é¿­Àp£Ü¸ÏØرÛÀ“ÉíÇñè|2þëûO×Wч_~º¼ŠÆ“ÏÇßsë§“/gÇ_ÞùÍíV*®½'•>c*6ïVøúüüfO®?LëÕê=¤ê5ö‡äáëÑõÈä¯ZûxÕgìhvx5¾:ÛÅ*¾U}ÆÞh¡»Mb(àÇË‹ÑV8s—úŒ½á»ÃoÚ;8îáMŸ­7ªÏÿg{ÈÔgëÍÃí¡’dï+2¹ºÛ!Ò;¸?Hãîí¡ò~«Šëu9ŒŸ^ÎÝaþÏìÒ!ï endstream endobj 760 0 obj << /Type /Page /Parent 1711 0 R /Resources 761 0 R /Contents 762 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 761 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 762 0 obj << /Length 516 /Filter /FlateDecode >> stream H‰„T]kÛ0}ׯ¸2Ô²¾,Ëešåc[3ˆ(4%ë4kqÀ´?¤ÿaÿq»–ë41NŠÁ’utϹ÷\ÉG"ç$pK"$p|pÐÖ2n¹$™±\{"ÑçÒBVú=ÊlM¢ÉLÀcI8ã¼Þ“‘°VäŽþ¸BÅ4}ÌëQR0  ÷•¤ž!…„³Ô Š²ÌðFÄHÏUÏbÓPý•¸J„B1C¹…ŸÏ0{^oW¸"i -‹.'g0ÿ„1~o‹YL‹€Ólu³ªØ¾ä›ßžDÑûõC¦^ýÛ'æË÷¥IÎ ~¸!®ù ªªbb‚–µj^Ë"5J2œr¬.{[Zy¦‘# 26L*aÖ‚LkÀµ…MN–dàvf([ø¡ïVóÚÌÒý"ÑXtû…íòF&MÓM,uóéx<97=çh_ŠYY…$Gð™ìåó!›ª¥Æ³±ÇÜ2©†ï´½õDCSÓ î…ÑÈ;´}·ct=<^Þ~»š|q/ℽãìèõýjʪݸ«ï£ùôzÔ‘Óñ ¹>°_Nâ!–Ü],.>EAˆ‡>äËbo‹§üåÏ:¿hc«.Ò£Î÷C¾åèwOà)¬ÕSj¯V]ÏCàƒþŸVû7Iêð· Ôܬþ¿¼Ð Ø endstream endobj 763 0 obj << /Type /Page /Parent 1711 0 R /Resources 764 0 R /Contents 765 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 764 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 765 0 obj << /Length 2637 /Filter /FlateDecode >> stream H‰¤WënãÆFÿê)Nýk˜49¼®g³I6HRÚ¢Ù¢ $ZbK“ŠHÚ«>Hß¡ïØ=—!EÉ¢"0` çr.ß¹5Ÿ]Íç<˜?Î< .þáO$Ž›¸ÄièD‰ëÃüivõ¡I`Ùðše5»úöÁƒu3s×¥;Ë™Ý/_f?«û̲}'Pëœ~µ‚(ëoóïg)SH!v4B.~âD®0ašiÑ*Œ„Ô4îÚÚµlÏw"å&°ØÃþj7¸£Un!%Õ Ü}{ ý¯e‡ø½Ã³Ð Ua¹j¹¹„‡—¢ýW¾+™ˆ¯²jeÙ©‚óŒÕgÕ´ëDø1ÿ÷X‚——ÇòO5Ä5'¶HY:¸tQ»¥ÙÚ0¥ó™Ìt9~ä;I‘ç ŽA»|ö8ûj>€á{xÅ=FãµKˆ ”óÁc°Àq±¯z<ãÀwb=Ôu=Q'uà¦%€Ä¡ÙÖ¸ 5jÑÞZ¨¯®an‘ˆ)Úðø|°¼TW…#ÒkD¸Ã­H’*ã©Ö²É.E]ÁC¾äóÑã„Ê$§Þ7¨¡#òƒ^¯…QâC]µYQå+(ªk6C¬²Æ©Q‡ÞäYBBžß4Vä$jo~ªåß—¨‘|ëÛSùl¦d{Žç5Á5pMŒHYKK$ ß‘ÈÕƒDêf»«ÛzY—·—7›¶Ý"âímoóWbèA /"?«;òû@µí®XtmÞЧ§H­õ¶»ˆj÷Ûœ9ž¨;ò?÷À]Í7sm¶†¼Z–u“7•%´;q—ÖÞåeÖ¢}ØbÝí²-ïŒÈø=äZ–s‹¢xcyb$Úd¨š(V¬" _ÙðԨé/äÃ)z$»š9Z<˜!J0,ò'‹ÜïaÔÝ=fËTÉ–ÍëE&„ØJžZÁѧÐyÆÇ¸eˆ~V.ªUý"ÑPåž´>‚ÿXíßd ?¼Øäy§‚»m¶Dïd÷Ç»¢›°=Æ K;¹@:>…ê,ǤñȦ¨º/—ð#o2Køãü¥×¾Wzœ¢ôi„rŠ $Ky~jÊéO5†N»ÉZö6¬£Ë€r¤*‹²è³*ü‰£áq't­”J8ÅPiqE ¢î«6ÇgXkÙ$Ìá±(eWÂ-—Qñ–¬ØG ­%Ÿº²-¶B×¼4õø$ßj“oµkls3äš[ “%¥—Æ;Œʾj8•Ïþ†è¾ª©¶!¯ªná)k— <‰6L7rÌÝ ›¦h²mq ¦€°‘­{{œ"ž9“Ô”ª—E"0"lGlòñ§m¹‡f°uUï0;}V ËN°åh¿Çý…*ä%,³NV”Íz´óÝ®Þ}¶¤APç|ƒÒ&6Fq["ˆcxeXšÖ&mFJpØ×Ý+¸¹€V‰ñ›ª~A*èLä ^‡ìà«'I¥(A¬$SOÈ¢ÌÏ%.Tyj9œÊ ºÏ &!H^1· ö)†µÀjÔ­PynrèA†} :·Ü¤N†6Ég„»Å±dç Û· qš $yFnƒ²;ÀŰફ©´T«=´dSÊâïyÓ³±YPŠ•F¼“b1ãæ½ú)êwëU'~z¸»ÿ$Ý-P;UÎCƒßv Ö«ž:uªÕád´ñtßQaÑ!oO8 hµ2_ã*ôX0ßmPCw /¦+GÇö¨ëÛÔ]ËžQåè§-GY¢à©^–£—ì‰ltèH<“бëNF¹X'£n-«ö¨ŠÏ•;QRò¸ŸÁm=ê«b£›—šq½BŠ;9ᣌú~Œ4)ʹk(Z’eÅIA’d[ÒŽš®Q¾ÅŽ­· ‚ÓÐ/u<»W=ÎÙÌì±êã— Ý6¿6õÜëë’Ôµp`9Nwh×åvíÜ7ÜöcGâcÚñ ˆÑ: ð¨18Þ= £á4Ðü3:ÝÄÑÁäówŽG¼µ9Ĺ% ^?>sŒ“ÒaBð\,=4"V¥@FDç÷¶-¸Ô[ÎóòñÈ‘‚‹®Ée±Øø6fãÐl™oöuYÛö+lÃqêe$ÌNT˜8ŸÐÁÇTlÆœÑðÝ|~s5|’kŒ$Þbîp‚·Öý†÷0s$îÍÕðqÂÙ×4Ãô£SÛOœñO™ð|=û«C-?áé%<«L*> endobj 767 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 768 0 obj << /Length 2537 /Filter /FlateDecode >> stream H‰ÔWÛŽÛÈžê+:ó°h^$Š8ìñz=Án2ÈØ žfï0Çl·Û(Ì¢$èH«&µ •†1nWù©–ôíl(£é8²èê·›õÚ¶.Ñ$0ͽú¤õzXÖæQ+ÓáÚ#Ì+³¢M%{! š0 œZZïœVamÛ…Ã)ÑT­mÈñæ’ˆÈ<¨U¿{nj­úшOGˆï½-2Ô¯ ðºÜ0‰’ìp‹ý%ävét£ª²Qvé.¢"¨wªTµY§ªÙÈäj®[ŶË0¡Ä­lÓh³ÊÛ°ò1.Ýàü=Ñ(gp:­Õ™7ÁÖr¥#uk•qÇF¦{#‘ÆÞJ‘™†gÒ~àØIÐ8SÖª±N9‹Ú5Yœór@¦°¡l!ûžìi•~ÔlPpÍT?ˆÌï©Jp‡Vÿ´éÕ9Üw¼PóS›^7äú!* 'šûú¯ÇûÂí1à‰AÊ2#µ¡Ò {-hµêt×aW$‚÷9ùcR’æ¾+)È/gwzšÝlÖè€R#±ðºaSÞ¬Ë ?p™¡ì’g;Ýbæðá^Ô”GHð®B(æšÜîZ[×H"àÜ…9 ¨©z§þbòƒ5ùÞ_Ks/œÁóÚ9ªZŠÐì÷mÚÒ9m6óî@Eò­³¬˜(ùìÑ6!7GGp+fûd¥aAiøj¾Y.uÛjþtí®Dê' n¶ÕíëK%Ëá„öÖ%–R¤Ðk;±Qo‘aŽ·´²dt·7¸8…²½•„ÀÇMá´¢¯àóÒ4p¹i.8&Á^¬~Mò£à?mQ¯\ ; ¸”Û­õï.LW®ÍÅk¯N²¸“ŒRÂWÀ˜Jl³Æ_0+ïÍ¢!ɘ[[kÈy,ë ¹;íaîœ1–&$´®ËyH ¶˜»/Ÿ×uÒíS•ëÛ7bíMHíàE@ßÀ²Gbã ÿt¶M½“‰ËIÉDÞée¹©ÝåçÎ’|‘qx2ôÕÜGGíàÍ‚4Ÿªã“ç€ÒQ#x&1¯ Ð J\×/8’ƒUFØÚ =©…1°T„9Wiæ>Ž\œ¨8Ûè“=Â&ç%£ÑÑy¢$×~ÐRSL¡¯’=›Z>ûåð *«hÞ2è\/éžÂSÈþQà…5ýÁùN49dàD,œ…t®'ÇÓÙS«›J«ukç%hšABѵwŒóå@ @–ýZôɇüω’Âü¼Ô탖|DzÄtdèBRCI¯î‚Ò/Ë‚Òå §2MŸ†`ß=†Gíƒ5² IO/)V–É'%€n Åv {WHÙ{FêƒÝ2§¢µ”„@|fkeö“\TŽ»•|ò3î¡tPKo«Ü)½SrxÏvlCž[qˆ›ï?â9ÎU"[îýdŸìã^ l±ËÞTÊ‘vzu+s,‚ƒ–Ru¯e‡EVD> endobj 770 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 771 0 obj << /Length 1712 /Filter /FlateDecode >> stream H‰ìWÛnÛF}×W ü´Ì5ïà ;i’"‰š@ÓÆ} ¨•Å‚"’’ã~Hÿ¡ÿ؇ÎÌ.)ùÞA‘… ‰\-gΞ=gxœM²Ì²ùÄõÀÁ?ü ’D:‰Aœ†2J²åäà¤K èxŽ]QO^Ÿ»pÙMé84§˜ØÃåÕä“8Ë-Û—¸Tôí ˆ°~ɾŸ¤!Å{™F˜ÅOdäè$ÀãXtF:ÔŽÚžcÙ®/#á$0½†óëº_àˆ'”…‘DWvðâõ>üü§e‡xßâo¡ Ei9¢XìÃùUÙÿ¦ÚŠƒø"¯g– ø?/Ÿ—æ92›ì%Ž1‚««+iùÒeU”CcJ‰—®®0C Žô*›¸PÂÄ #éG.ø±Lˆ\€k hÕd>9ÎF2|§87ÙØRí#ˆ2û•6,0H'À ôý$};‡¡Œ½Vt`Õ‰õšRX‰€£E߯VMkÅ¢~o²ì 8=~õñ€¨tEfc'V,cqÆ×Щv£ZÀçz¨×g9Å[^<"Ln—ÔËK©´¶°Ü•«A4uŸ—µšAY2·±ÚJd<ìÎÁÞ qÔ·V€[õçáÓug!‚VH£=ô×+õlïóªß{~°Í¡mWº>…×Ä%#q‰Á˜×PhœbøDa(Òüè ¼“ͳ¹gÓ‰^ýèû¶œ®{ÕéÝ œ.íÁ£´Ð.cÍÔM­Lë2‰˜p“—–‡)«|Êû\YX³B>‘k»Ã&”5t=–Q^,•®ljhêêÚŠð?LüîH…x©æùºêÍJ ”o§X7|¬¯ÄT8$Frlž¹]ò60sãl3s `[RŽ”!j·‹•Tv|}~ úrÅãª(çXb)‘6L[(Пúâìà­EÛJ' ¥Gf*†"á º:\ÃÑÍ8EãßÞè˜úÓ„âtZEÅïš§6‡L“†èv‚ vŸZvŒðŽ9j€or<^Zzëyã)ò4¥oçP7Ð`ÆE‡J;(=âG5½°ÌZ´Ê ²·ëº.ëK¬ ÆØå,ã©X*XæÅc°\F3].Ðè9ÖtÄÕ€‘¦ªë1K§3bÚ;€¹>‰YÞδ®Ÿ”ܤ¿°$|hz=1c1P輇®AM5C èIÅûwPTV"Qªºï`Y^.zXä«¶™VjI ÑA^ªëhUzÝÔ~8X+$æ´¥Ó€„®†«”ð]ÓjýÎNΈ\¶æsѬY±"QÍþv™WÕ5R‚PˆBG"öAû;fF!ÞîšM¤õ$•¡EÕGå*ŸÍZ\.ZL…' K^Õ$Š”ï-šO°Ðл§$DŸôþ Fâ}-#ÑÈÂq™!ë×È[÷„Êÿ;Žâ}ƒŽâ¹£ †’?ÁAúËwRG\ˆg9öD¸¦Šë¦ÑxÓ±ìáÒ ÛLÄ63š [L4XŒËã³ÅŒ£í%0öâ³'`{GÕ$z2?0z‹ËÞ =‘èéi*˼g~ß‘yšÜð9ŽèK8­æ Øj/`¹®ÊU¥à®¼@Æ#À˜Rß®?9³onöQÙHÅHŠ3®µ™?#D¬²ì»Atøeø1-µ©# ÂÒ£Dwhèf²±Ã'¤¤[ž¸/ªL׫| =(«wÄ|+Œº".„)'*ž[]È?î÷ýͶìã”:&_“|Ao‰üJ»ážéÍï²úÿ›À×}…{TîóŸ>œ¼gÓ×½xÛíö¥¦s¿`¡0ZÂj=\‘ÐT©M^÷Ze®Ð3bó ŠÏÑJÏlx oЦz>¹¡cÜ¡ía™ÑØ+‹ÄÇ-¦?ø'bO‚¾ï-:(«™SÃo"~|D6©rï´-1CcO.!£¦ÿñTjÕ¯©ÑÄ 'L岬ò–cGWó™†L=­~'1/DkÛÒoòjmQGŽ=÷ö̾Þö˜mÝÛ»H³÷4¹^{3Ÿ—E™W Çˆ6»hÔyý ‡™‘Dh}œcs=k¨m7í~Cï(Lb€$î›gp?µØ´¸DèF›´wߟMÜÖ¾Ô{ªÕÓ’…ãîÕ ¾5*í}ùÑ-Ÿ™w³WÙä¯ñëг endstream endobj 772 0 obj << /Type /Page /Parent 1712 0 R /Resources 773 0 R /Contents 774 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 773 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 774 0 obj << /Length 2111 /Filter /FlateDecode >> stream H‰ÌWÛŽÛÈE^õ}j"‡wRƒ]ÞKYÀI û;8TkĘ"’’<ùüÃþã>äTU“¢4³Y?Ä1‘Ýì®®®:uªêÛõân½U ÖÛE*xÄyîù¹Ÿªl•xiîGj½_Ü}×çªìy¯ú²YÜýø6PýÂ÷|ŸÖ” w|=/Þ鿎y±~4ô µÊåü}ýÓbÅV*ó½UŠS¢ÜK}9„„,‹Þ’TDýbÖ }Ç "/Õ~®žÔÛ§fØa&ÔÆ$ÝW½zýãRýíWÇM0îð-ñ]9¾.wKõö\ ÿ2]ÍB"]4Ç]iõoþeÅøú|µÐ÷R ÖßcŽ58ŸÏžyîéTCÇB4Žôðêãv¥Ú±¤Ö‹@Uj&©¥Š2/ÏUxq¬pÇ8WYlß®'cD–ø×Ö¸˜Ú'‹@Ëõ?Éa±uXìù1Ä^å™’áhÔ,I¼,œYÕÏF«ú‰ÜiåeNNŽùz_|váQ±é_Ý+¼&úMñQ5Çýƒ|èT»•ùÞô}Õ6Šö`¹0·:˜ÎšÑ‹£(T.nëQXM d¢@oº6º¶„D“YOà’ù-*§›ù+/Ìg7 F¹ˆý®m†¢jÌFUÍ=»g&Ö‚=õ²ÑÁ¤PzA¯…Ü×CW4ý¡í5<Ì7_ªƒùê•“·:º, ÷…–Ómóé¶¹U«hT)ª‰VÉÑJd„,ƒ¶köC7"àÙÁÑ´)໼ӯ) b= ]õpLOÃ@ÓÉÐÿ;ö`¬è¦mÌožŽ‹ƒÀx**'Ä‘uñàP„Õ Íý§œåÎqñúP”;£`q`Ñí†^®ÕCÑÃ¥3mS?ý¶fÖH&pXÔÿÙœÁGš±q­tÎfzŽbÙª°1ˆ}ýVtÀïQ)",àùÏtb¡×Ѓ‰[¿7ÛâX÷ÖÊ“&qxÑ$`à€<·PRö—N7ö/rÙmþ-&à “¡Zï@šCñ¨ð8’y‡–1Úµ5ä°‡z•+¡Ž-¼èÆï5:ÔFYBèáZwÇFë¸9"or4…ïªF1¬„p¯½¦£‚¡ þ¢ä‘êæÑqc  –!0‘R öö¥;Ñüjœï8!0±È„ïû÷Î=­Ìõ\ð%ãÝýÑ:ƒ×„ÌcúòÅ0ˆÎYß„I Ì|íñwÚò,q&n“êoäáÂcýB $« ƒ ƒÑ:Ícm\Jƒ+Èé¶ ûIâdɶ¶Ë üUŽþ‚ 7‚¿¥x9Q"kßn¬‹\VⱉÈ'N'E Ä>…=C>"—„˜¢I%„¡Ÿ˜Ál¶mgƨyïxöî£Ñq`ÂvOo|óy<Xv|ÁᜧT3z€­Åx†ùF³ƒ*ÔPí [ÜZ©@êØä¡ãX÷N{¶USÙIŠ5ØaÉnrDx/~rÓõèéÆz…@l€En-‘}ƯEÓ¢†éFx×xŸLŸ}^Ó¿úTÓO9~Ìödx¡%>Ñ7¶2[‚`ˆñ{",FÚÈh©J$ðD’R%ÓG‡JªgŒ•ÄC»ÊjëYP ù’ƒy j!þr}¦ ä·âˆ)òˆbáPÈ^{z]›úÖµá5ç»ã+Ý×Äv{VDušCe®ÝÔš_wÐõ®Ì«ñÉzÐÕìö²ÝïMCöâ(?éJHß™.dÝP9\Ø~TcÎv=]Öœl¤Ëøâ'Œ×Þ(b>L#ïÕ‰Ùá6 \À†ëšnßSɹ7û¶Cuª<-QõÇrG9†Šú ìc«ƒCí¬ôñ±B*z¯ùc! ÌbÄ¥õ…É*ÏòÀT¼Mu©Ã‡üü'Ö5ØKÕ-‘] %)Ê{ãÐ/BiNXL7NÄn‚ÄþVd½ÐB„À ‹êꛥ÷¾'I|gEX4(—>á˜çæž $w^!ñaB+&¨Uªb0„ºh®¶‘ÞÏo&ö™ãå„:;UX yÃLIfš»hVb, ¡ÿèŸ(g±çî€õËTˆ}ý@Î86Ыr),ã¾èÖç¥&™(Ed¢ª)ë#)Áà‘¯¶e*Ë<¢T`Â…ªI€ÕS!R=WvÓr¢“k l]™¦x 5Ïm÷Òb-Y‚×í^?ÐV¨Ï/WMR©Î Õ‘èɶ‡>'ãŒiIþT ­è1ÕFrå¶Þpfà\-âˆÛÙ¦»JõÇ5H—ìýi­i”‚÷ãywI««±5Íqã\ZS›¦º#O5ä«\S“JýéTzÂ÷@Ržl|x’^µ¸ô¤IÎ=iàß6KþUî¼IfÏúÏ(ȽÐÿ2ûÏ(þ¿ýgxcÒÏß^ìËë?gÖøbúÏè¦ ûßöŸ¿Çørðj2†ó?m¹…c P¿’wŸz´@/éM#ù€ ö•V³!xV¶©}A/©þH1fÐÊ·`H©l›ì{+µm”)(°’œÖtD‘±>‰>×¢¤»´ô.U¿kµHÝ@(U=`$EJ´„š««}ZU­*‘Û4"½pÒ£´g­±¾±ÆK™.˜ÕË–•¨ TIA§ò¥RMVß$Så\ ç\ÝÙ®-ÖSËÇù|’ºÂÈH™æTÉkÛ ¾¤ìƒ~WÂdŽ_*…fª)qsÁÄåÏyWÕ”í š§¶ÚP k†cQ¿XÀø—JÙ·•²­kS|è¹ð®¥$¤ò…-Ü—éÒcùeyDFCê 9‘S7º¤¥> endobj 776 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 334 358 355 372 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 777 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 778 0 obj << /Length 3094 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õ¿¤ Œh’ºP2œfgÆŽß`+6Þ h‘­×)“Í‘µ’È?æ!§ªIJšQ¼q° ã¦Ô¬®:Uuêô÷‹ÁãÅ"¢«AQ€øÏf~0 ¦Ï'þtŒh±<¾ªg”Ô²' :)Ÿ¿é¶~ðžd0ì–»ÁGõV{Ñ?V·†?#EqDÞßÌÅœâÀŸOqÊhæOwˆˆÄ¯&Sgê_¾F7 GþT3Zîéý¾°k|)ãÁ’ª³š.Ÿ_Ðßþí 'x®ðÛÄŸ¨Ì T²¾ ÷»Ìþlª\ŒŒ”.Ro8WôOù+ŽIøZøS<,®ñx°Ûí|o䇪æS  Ó8ÒÇ2@tIûÕZ,Ý,!e4ˆ&S4 iû³MC<&Ä8žQe«Á÷‹ŒQˆ-Á)¨F^.~â„Û„ý`ìr&«Ïx<òãèÐ`ÒÚå.{±+zšj/œ- ÿÞéÓ~kêïžÐµ7;úIÓÂ>3µ µ5tm°a¬VY‘Y˜eȇ¼¡,j,|žÝ/²ÞÛhÊÅvð6ìœ ¯WeauV˜”²â‰ «Þl[»S?îòÅäL¸×ŸÖÞ”m?ŠäIY¬¼1BÉn¿»ïßP,qð#¶æà›õðÍZ—tA‰sËy4ù¸o^Š_ì 2yšgìÜXÙï.èé&Û˜måMPS¥©vWÎGŠ7¤Újë…ÜRÈÏW"ˆúÂé —Ü8ÌVÙ²±¦æÇPq!Úâëq‡*ÊÂH1Þƒë¨Lƒ{.ÒÚåu±FÃÖ&±YYPjP=¦&ô– k K(Y®A|­-é ‡†jj©B+&ëª,²Z³ Ÿ^•µeZH^½¤$Ï`£îûàbß}k°3¶Lõžj½ñ¸¡·Û²²tw¥«”~Tw¦r?JiO¸´å‘"?$P üàGOVwWøe¦tîͱÑ©®Î _ñ=Œz%WÇHŠóÕ›àiªÚ8ú3Lz1½7Ž º¿˜7œ HªÁ~]ÓÎä¹O,w¨6x†ý”YJäQØ:VHEI›&YÓ¦¬ä-ìXãC?t”ñ‹PFÊU“ç{Nâ*»m*½Ì m5‚çŽ3ÕcOèòÖ‚· Si[V´ÂÿW/^Ý ¯Ùë™zñŽ¿Úhk‘i.ŸÞ—-áK·ÉH)g´e÷p‚F‚>½_Ç Ñ®Øë¥q}@¨.·J™§Švî§Dx´ ʌݕ3RÃëï¹ gh¤˜ ŸÓ³Î€È7[d\õ¿Q{Ž'_µV†³¼~à‡`z”zôú1¦¦²{œ71 ™½ ¤|/“ª+{ÛeÄÉUš@¿BÛ¸Œp‰]@0y" Äx{G¨i‚tÕÿÊói¶Z!ý ÆBoD=Y +à5äKLm/D­£„6Y𿍗\×n7\¨›Õ*û"cr[ÁÑ/©\I:ô\ªHFkæŽÁ% ìNäƒ ã3+’¼I%åÌRQ~ÎÎy}8Ùedº2hsêF»Ì,&fsLì-&›ƒËEÏ}ÀêŠ8 è)kr³]ó½¨h6KŒ2n’sùQɨûo•…z¼Ë™¾WZ +@£q:ûeE<ÀN´˜µ‚0är =G–êÈýscŠÄàò"4e,G:î;÷W»ï%esi|–­1']Ö|Szë1·½{CŽU™MÙ»Z9ú¬µnˆÅ—fK©<„¾M“ªèYßYݺDÃlÌ0Í*ba îp<'€¼ê”yŽO„v:ßðK|4àÎT•OG'ˆ=PWw·Õ­þj¥-×î5ë4\9U·#«;PäÈ£âá.ø©A²µË¹P.Ì È}L¿,A½%.nwŽW%ª›É-V»LȈ«µÝT¦n%ÄãgmœvßËÃïêgãv?ž:(T—ƒ%?©€‡Óêo£÷9žp¹£òFèW„š0{J=óÈ ü¤·5Gâ²LîŽgq/Ãê$¼®Ò~…?ªãhçHvÂ7/ɽ혬ZŽT•I2Ú”G…gÉo‰¦üªãÿgBÎTí™Ø-SNl’¶¶Ê–•ëÓËË×ÏÿrùüqˆÀíè‚¥¶§W'geûÃÊ`ÙÎ7ÆngrwÈ»ôýšxŽÅo{(>7:ÏV{‰ž+ÝÃ÷Dž»,ú"\/xʘ^„œ^ñÁÁ¸ë Úä+è%žN Ayp¹y±zéñíë lØož5üû¸ŽÌ…¢#u󇿾Ñ9Rf¤Çx§éHzžA;$\"r‰³Ù/)kÝöÃ!Z´ï.³8Éʬé÷ãŒ?Têº'kN´0bm;d*I5ËvGÝЇśë7¢²>Ü|¸y½À¬4'ûœ¾:¯ÉÞ>\]¾” ËÍëëK\'êã5ˆ‘ÿ4^ÆJ Ã@íù’4ñ$C<©)è()i„#ˆ3‘=!ÏÞÞÉ’íÀÐ…`K‘t·zÏL¦•[úÆe¹Î«*õHŒ‡uE+céQ;‹ BAŽªN"6"ªš·¥;½…÷áLn“[.¹‹4Äøô?õ#Å5탻öâ®–î%ha¿ýmÏ a°ÿtƒ$õ‹‰¼ØK•ÜÎÁ-¤Ÿ¾¨¾ ÅöÌåä“¡“Ø$élxæÞÍVYV[…»Nzá a‹e;½”SµSq&4ÄîõÃ7}u;,vy¶Îö„b½„È„ ìd.a(œ½•šÆ°ªá~ Ì»í*êá é’fü§ ­øí| ÊÚdÏ"|¬PGžã·3Ì´wÿ7ímê±jkM7‘˜,|½ãyïyÞ¦!KÊÛî‹´XÚ£Ô“б]5R¢€â4ª{8ǯ6Òš~äõ…^1F2‡1a4}æ?ü˜éÏ j5ij@ölL¡ qÓ©ã¿f¯R€±?ZÉÇu Nò¥u>©\Ó¹§7ÖÓ"-QEÉT×Nê;A‘Ì7ˆ¡“r¯®³©­²Ÿï~°ó endstream endobj 779 0 obj << /Type /Page /Parent 1712 0 R /Resources 785 0 R /Contents 786 0 R /Annots [ 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 780 0 obj << /Dest [ 1046 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 469 716 510 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 781 0 obj << /Dest [ 792 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 77 553 98 567 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 782 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 553 259 567 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 783 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 472 259 486 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 784 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 123 64 131 78 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 785 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 786 0 obj << /Length 3100 /Filter /FlateDecode >> stream H‰ÄWÝŽÛÆEoõõÂÃX¢9"EI cÇ?‹¦ l(÷‚KŽ$6©Ô*Ûé;ô{Ñó}ßâjÕMqVäp~¾ßsÎ|½½X¯gʨõfdf*Àø‰–K?X±Z¬æ~¼ BµÞ^¼n–*mxN š´½øæ£QÛføA@sÒÑ´{<¾×ß%Þ4ô#½µô;Ój*ï¯ëßV¼ÃJ-ã”péÇÂÌx/zšÇ²Õ?gÎojB?ÖÁRÝ=¨e»ÃÈL[;é&oÔ«o&ê/ÿò¦s¼×ø6÷ç:÷î&êã)oÿnë‚7 uRfÞt¥Õ?ø/Æî³k³Àñ²~ƒ1¶àt:ù^èÝЩ–ŽÅÖ8ÒÇcïR7´ãÞ®GFåj4›Ç~.üåRÅÆ"£¥ªíh3úzÝ#4˜<ŽÆ9ÔEV®ÿ6H²Äñ[ÄÿeÉõ\¼o¢“¨´Úï«R¥IcU»KZü±ªIöVêj“–¦Õvck[¦6£0gù†_[•%mÒ>ls£<è¼ìV°Îpj|XFqÃéfÞBdÈÆ‹{Ôx1¢6ñ(v´OíÍ5Îê*­ÚÚ’G‘?Ä5Ucoá/ô=ÞB&ô%ó ¾ŒÕ>ßÛ©éÞ—š¾TüÔ6Q§]›io©wý9Gù…§äÍ©:û(ßÇ÷ÓffÌž£t†þ†¿At|$þòYŒU[QŒïóŒ"O¶,à/ívð½­›¼*Um••¦øÞ¿ÆŠlò¯ùc9òMïÂg¨¤¶j“—IQÐa—ÙõŒÑhÔ¦¶‰,i=*äªîvp‰~yÞôx8Tu{«äͦ-¬VŸ´{µjlŒï­0òò®†ëJy HûäŠÝ«ä>á”çEr‡ “l"³]’U’¦.QòW*¥Ü¢Ð)2ØzXÄÕåâÄ‹âE>ò(ì.J^;TŠãÈŸ-°4ˆtjdÑxK˜£^nr[d^ Ì ×M{{ƒØµ–gÔpe¥‘6Mal®i ¯ÈT‘óCÓö6./Q¹7 `2Ÿ 3\:«^We›ä%õ ÃÓB÷Û:°àqe YþrØK}{iÑ”×ö5(Yv6БfıaþÌ¢·AK4oï®ö›˜V}¯_æGºmëüîØÂt¼M'ÍgNæ:Dnƒtâ…ƒì½ì÷s®€_)6ùD*3‹Æ³ÀÝ¢Ë::¿7@i@`²­)J4Ù%Ž-¥ã×h<1Œp§sOPúÇc^côÌ6¿¿ŽÀÁìlá̵ØÎmLdûc™lAŒ(`e ˆlA¥ºØdG {ô@m,‹ ßEÒÚš`âÛ÷ß¾¾yÿÁ›FÔÀ;+ºÇ0,É[‚8 …µ×Qtu¶yåP6„#„¼{B€•€ÖR9®{bÝÊâ¸Ã"ÀPdH =–UŸ¼+`z®¿kÉ–J닎ÌzD2Ì5¤6¨à”M:BªˆÑÙDàÓZnt`RÌÐJaôVíÃ÷®ƒ¥~yAu·ªM¶ì(͇£w¶¨$4§_âÞ€GŽü¡j*Ê„‚мVÈ'Žáay$_ ùêf€4#rž–‹P$O}Q?æäÿú1ŸxîdЗb¾ å¿#@ûBÌ·8áB¬§6ŸPÿΑùK=§&ÄHß¶¦TøºL0ÑÐZ³%hM—÷VVo)ŤíÙ’kÜú3 ô´IÖ\Ë ¤ŸgZԵΎÚf!0ºq8E+^WÕ‰‚L|ÊMå"G“o\ÄÞ¹€±E³øÂØßp~Þ¹6B]» ê.qnµ‘þ¢/ãÇ)Å#_äÎ;ë5ÈãàF4(•§ 6¾ÐøG~2Ì’ÌdZGëõ|Ob“xÑI]'—åcÌ |Îý¸~Ã×ï>ü‘ïž ]@ùAUÈ úᓇ{̆«L>t¿òcERqŠZoºàË5ÛÑNÔ žÜ¢´¶`ÙLøïˆ*k[²eÀ)‡\¾£{©Û¹¯Ãù쳚…oŠ0DÄÝdc]ub$q:‘Œí4Ì}R‘>bOÄ ip·ÕAdHš?<Ü&c,ÜYX0F£ñQ.îDÓgA$Û “¡§Š'‹¥×¬'¼‚­Óa ›3‡G‚1-ªN¬ÒôHÀ€}%Uº`¾+cMS Xkvó(•©[=BtºC!r>èíŸß¼$ë·´éœØ]Ý¿bÇ–¢T³D¶øäyt ¯þß}Bi½Üa9`ÅóÄtÕ°SBÇUH¨ Éä[O3ýx‘=k<#ßpä%µP ;¾ø'7¹h…¦Eªjä”É))Yél/DôãsÎ$0 #7ªÞ@I:f{;¿¼ó_æ×òÒ¯AÚ…ý±hs\œHU]Úñ…áàòaº…-‡dɆ{Ó%aTo¾cg™¡£7UMä(r_Ül\Cs'¬¾Ž1GÀ*7ˆ–¢Ð€AThãaÊv=¾ä>Eâ×,§LžA˜÷'¯KÛÁﶬêIFžÀè¶NhÚ–ÏVpF¦ø—2võ¿Ô_ƒÚœCrŸ»òWèE#½h {ØUåEC‚Ðç?Ï[7"gð¯È ”žL¶Ü ”³‰²?¥öÐJêN;&RæôÀ‘F¤Ú8«³€ª{£p :„/§]çñEÏ@8 ` ¨:™î’:á-S¹·B›AÕÖig›Ý¨À÷W¦À¯&ê·`@ÍäÑs_}¬ƒö;Â`ù>0û%ÌÎØ5“˜á¨@j­"õR©1pY˜ñ˜ý—ÛÇhÏED+¤Í¨( xFŒ¼c¡lõøydèâ©ñ=ŽƒÀ[aCÇ€+æ–þ˜Ú—ãp#¤c«ƒkW°XþSdNâ"™MÙ•¹-ÛFe ûý ¸¯çDo!~º¥åqGAÏË´8f¹»‡†zKFì“v:°c pû‹¥Ü,uK5‡$µ( >5[¬(Ÿµ—8øÅxqNëârý£&zZ­ÔD‰ôWÃ/ªûu5w}u}´£bþ‰Ú$Öç&ƒHî·èдíêu¸¥ ŠãO~ï;*6@%Tç\ò'T¥ä†ÂøïÚËf§A ŠÂ{Ÿ‚°¢‰„`Ó&vïhÂB7´3†YPŒÆúôžs.„ÆâÒE“¶s™{˜¹?ßý•xåïåïìÁ¢4â§Â“«±CÜlÅuPùSË´ šVq¹UU)N!J†¶!»Ì›îC›è»|XP§ ÿáÇ<Š"Mzù7wáëþê¡0m:­É5Ù˜*nÖòÔÉ>¿I’õqN8»‹å¥s6 B]ì§•ma€øs7îè‡Ïà{‚(hC’ ä;ƒ»$}ç³Eú¶aÞ¡¼îð޼oÒOðhúrÜâL¾Ü?ªmh½”¡ñfuÛßàÀuøï—cÛÏTwÀÀ‹N§DÚN¸é<³XÑ`- ­Á¬è•ô›Å%4²e”– 1Âê Æ(¦÷l}¾Æ«•æ•="Ù©D:ÑÑÑ0Ž?é#ÞrÔ˜$™RÑÔŠª³cóÇú±^nf´Á÷ÀĽ©’”§—»#¼à endstream endobj 787 0 obj << /Type /Page /Parent 1712 0 R /Resources 790 0 R /Contents 791 0 R /Annots [ 788 0 R 789 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 788 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 146 730 154 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 789 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 164 661 172 675 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 790 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 791 0 obj << /Length 4074 /Filter /FlateDecode >> stream H‰¬WË²ÛÆ­lùS\ R$„ñ v–d¹œEœòe¥*Ñ͇—°@€…‡(úCòùÇ,rº{ðòRrìRY¾Ä¼gºÏ9Ýýf3{µÙÊW›ýÌ”‡ÿð³JS×K½X%ëÈS/T›ãìÕÛ6UyËs<ÕæÕìÕ¾zjgžëy4'Ÿ-‡Ïóìƒþ[æ,Cw¥Ÿ ýZ%+åükó—ÙšwX«Äs×1N S7öäÞ à½è+Še«ÿè]ž³ôC7Ö^ª¶õp©ºzmì¤Û¢Ußý°Pÿü¯³ŒÐn0¹‘.O燅z8ݯ¦)y“PgÕÎY®µú7ÿå‹ñóùiçÆhlÞ¡op>Ÿ]'t}ÝÒ©†ŽÅÖ8Òŧ‡×å¶ëÀ;}¿™ùªP³ ŠÝ0öU˜¸iªbß]­Þ¸JUcfûÙ›ÍhŒÐÇï¹5&S{dÜróË•›|/&±çâYCˆ&gDrØæÇ‡ŸÒØóÕ£î[³ïKµ¯••¥¢è¼>n‹ÊìÔ.ëŒrЩ®8õÉY“½È‹¡.{Óª¢RŸÞfÍNÑ~ë,W0CV¢iSa7Õ»¬yt\õÎ,­—¾‹›“]q9oAs2Õ®¨žT])˜YåuÕ™ÏÝBÕŽïÃó`׃iœ~Uë ]ÒWã*X.M¸)ÀN¶E³MÕe]QW­Êl¯ê¹»”ÅG£~~?§xOŒóRlèë  “MÌ1+JšO¯z0F]=+´pÉ3À\vêL£"6ô“©L“•Ø­#ßAeÛºïØÆm—O­Lþk]™Öew¿zoé‰#":'ˆéý'\É eñ* ¹bµë­ìÈÜŽ¤ã_FÄ1cŒÜ»Cjçñ´Õ䳕øl®^3j–0ÜZ×Uy&˜9€1ã²ù60ªŠønÃóÌ]±w8ò—=æ³7×C£Êêj5ï Út¥pøŠ½‰A²Û\Òd²Žq»ž`Ú¡?+ÏÙeøŸ2‚+¿WÒ‰6©<Ÿ%/Êʞζ]õS? ]ʳJmÊÚ¶x²,r|z;?"Á±!Ø×;õŒi¯F†Åb­µ&¥ºwø, à¡Ë*¡ÏæÏrOº§?Üdl»†¨Ó˜ScÚèÂî/ÑŸ®¹LÉœ¢ÕÓ[ÁrÐÁIÉêÍ»ïþ¡ Ü ÞpÈB"Á=^ß ïÌ=fÃ#©þìª5‘ͽg°Æ&ZhKŒ½¢+éN¢ß³ ¼MƒÀšƒ­ÂTº¡û’¤t±`ºc w$>3iÉS‰˜$Ô/ 3l†HßR™<ú’Åtúh|%¿Ièô–Ðˉz^ÀœO¦™?çîÊõâ«Éòèë7ƒº e¹ªúã?:^©-pM/oMó Š»Œayݱnù²€wÚ\Ù—;¼¶hë£Æ%ŸÿÜî/±QÇ¢ƒGeCu*%ÞtdÝÖ‰ µŒTÑ’É7²¤à|[ÖÛ3‚–éW%𵺖6à•ølg!5ï3Ѷ‹*íד³ô8ÕÛ_LΪ±†¤’™s'Á7ËÂJ³¾ô²ŒE´ èЂÚJ&Ö]â¾ú¨j‘Tuu¨*Á4sGÄÓž³w=yh-ÏÛ8Èùq¤„jøíé±+--³G H4© Ô¼„N‡få³¼ÀмëeÀØj;©«²“GàñÌqÉX¡¾EBøÇpð»C¤p ~‚ =ßyi2A䎺̑tïjŠmß›‡²YšºlÕ¡>«}aʨœ=fGj†¬3§‰ûf[p,mKLç~‚ÊH·t¢Ûr ×±b_4­dv[Îì?“Xýµ¶‹9šÒH ˆù亥E Þv<§ÊÄ|š×“VÚŽ•Ó´!6>j»ózÜ*Ò5¶¤5Ð-4¢ðèˆIîÆ™;D”Ðe 7pB,)\r¡ÎÃô²ý™]„îJ=Ë?d ff—Ÿ(4‘#˜[¥MIòήÞõ²´à(‰©•%æ‘Cæ\†¬fÁÉ·l$óÉõ²ü áÀßÓònüšÞîÙ·Ÿê†d¥Ñ‘Ôʶ‰(ë€*‡£)aëVS½?š~‘¦»ëÊPX¹Ú`=Ö]¹°FüæTu7‘‰Ìç §ð•%g»Ú·æ¸H¿…jûü0*`òÜ´þT>ù¶|bt@Kç?ÿwäD šk N`­HÔ?:Tnv8}æH8fHRd5áIWö›Üâ2¢ÖÁ „ˆ ˆ€×á ˜yqRF7-¤3ø‹6/Í”(Žî#RT5ÍÁ(7Þ«î\Û¨ñÉ>ñ-T›Av\¤ØPf:çë©Ì·—[/¶r+²w«·~|’§”Ø÷G½ÝsARp '‚‡R=é×}¬dL{~´’IuEvy£’xãÛýÇê<ïe»/ [7³M™‹–€¸Ð’{#`®ZÚ²?Ž5Ê£w¤›¡·åʵÞOŽ÷QšËDÀ }Hð­ç“ÚüŸ*z_”øq¡$y“Òo(Ø:3ˆ-§,AçƒdÕxGÜ”–¨j7î¦æòAaFÔ²ÊçÊj¨š£Ž“”ÈssqÒÂê%ò÷­y©–¬aØÑ ~%ÿæJ'¶ý mÜt(LæÂ¢+$§Á­6>Óõ9ë×Va„A1_ßÈ9‰Ò@d±d¡MÏ|)i|=ÔN´q"ÑN–Í…Ú’> ¨Ùí ªn\òP™;›•òQ;tô˜}á’NioÓ ‘{ ã—Ï‚c>”‰¶%¦Q³>/9‰”>JU ™¨·ò‘O@?=ª™w2K ÐÍ|.¤Ùãž ÎPËyŸÈ˜½¸ÿ”z§¹2Am¸E™o4Ì¾ÒØû™Èf@²Í•æW„$.²Þ LbjŒ!‹ÞéL‚tq¤X>¨v±Ã[‹ý…•{»|Áá+-ÔÞ2„LhÄb ŠªêÂõ2΋¸ùÔÔÛl[^…Hs4Ù¼´aôX<ÐUì÷Ð$JEîf$Éd‰dÒ3ë*Ρ:AÆ”æt¨I(~ÑOÏJC•'AÜÁ´Êt¹K²6e¨Ù@ÿä:F¬ÇôÖÖ*¦ël{u5A5ÑÞY¦hVÓ–\lRМ¥O Vîf· ªåÄÑÚrj:žšZXgMS^rŒVMa[9’“jçÉ:ºG¨§îúx—uãâ]OSbÝv¹³$8F V¥ú,P¯2ʭɳÞvK8g¾pÒÚØ3_ä Á.2UŒ×‡Ñºâ‰¦‡Œý$šc“L8:ËR@d˜*¯¿5ÝÙP0¥Ø3$žÓZ#EѤ"#vµ2aÈ-ÜEMûÛ`ߘ¼nd \éÔ ¯äíP¹ p䕸5Ñ{Ô÷F†€(¼Ê=%l܆ŒØõ®ŠÍo/8 !ÌQ„»ÉŒÓë :¸–NùÎ"Òh –!E€€ôÓv÷¢4ÒBi²]‡ ƒ™ˆª&;RMF•të:ÀˆWi.Ó[Ú>XQi£‹$öä… zL‰‚à7“p’+ <”SârI:·ùòÿh¯šÅ(xϯ°8i ˜1°·(3‘rØDŠ6{š‹zÁ’±FóïSUïùƒÝìarÁ¸Ýýºû}TÕ£¶oRàÖßêý]º{É4€n_f=5Ù¤—Ìå.±óNj»‰¾‡eŽ6ŽZìÌH_<6B/pÕä¸È#žDm£W€~ß¡iLAÛˆ„"RàÙ¾¡¢%£ö‡šfÁθÕ[×55Z­åE6Ŭn€‘£åÌàï0œÊ·z}¤æÀ÷r©IJÎ=äõÑçßîP»>x%&LG Âkxmùü£~HšwЬÎOÃ…E¬+ªê@(“^éðÌ`ë…žågÛ]UlŠD±Èêr%ûH»™2¹Èð‡|ù2ìt?Kœº!¾£Q4ˆ5% ÐøFÑ?¢.oÇð\?É”¦PS×Ù<\öj#Hö¸8‚7ߣ€ÊšÄ6l¿ªª9D7sóR.d¥k›QtÙ¼%Ú×ðîã›¸Ä m. L=Ü»ŠÀ³¾ørAU;&®šÕµkGàB@Y—X}­W‹Ý F¨ û2@ È¡0éâ¦?=‹6¦÷"šÑ"œ(Ìru0„Ùuˆz¢6¿wÙ0Z\ý²ÀE ç£0R¿šRH ¯¤÷€yo4MÜ z´*‘Ý6/ªß*®C{ƒü[P´D2PGý×yì+·•5DæuK™>;ÉdãØ-¼éëÞqÚE,õˆ1Ès¶e6‚¥vS“ßx ‰t|ŠHJi¼²‰­ûÕ³#úsKpVÿÝfÙÂÚ dç+—¥@Ç-âeðÉ!£ØO…ëè‘ü¬åš~zä&¿ÒßiÐN¿eûÕ>on—ÆK ?ß³3ÝB+½£ËåÙ¼?«¯ûj=ì@œ!¸#ô¦>‹Zá¡r•í»µO¿~y¾ ºãZÆ-Ÿq£IüHñ‰—›Å¿ÛãùIÅÀÚR‡íú³Ø†Á^ö§Š»Z ›WU ß§êlHþÏ"{3»[Ÿdc@éè”Çàs6°ÝØ["{&Ò+±Š™9Úb8Î&ñ,M½ñDáfnà ’ÓŠ›Âæ¼è£íÑÛE“ˆº„·ƒÞúEHîa ,ƒKô9‡QôgåË}È2ú§ G ,KiÜzŒ/Lßõ±&Üf—k ÙV«ÐëB%ò~ Þ ÉYI§í•££KšÀi?Š(¢+¦HÓS$ŠLuì&ç}Ò.øŽ¾pÎ`V=˜žãË9g4ÅiŸŽödzUš¼dúnÃ~Mô•ß:µ¥ ùìß €M&ÿ†c+º¥Ï0عÀtöI:[pLU3o@¹ûF?+±à—YÒÂ+ã6ž7š¾£ŽMpéîÝ”Q „”¤—›4m´õ“³>ÔâÝFÆEwã…߸Ìá66p/ †ÙMNã1dà–×e³7RøRKû[UÕ›Qí$^“?°=£Z‰ŠДÙ«Mr‚>]¤ôC׿ýŸÂg¢tŽËêjý¬§{ÆNy+;ˆ>XÕ|Éëh;xc„35‰Œ rŽ&‰ºB“±0í%î¾5O‘8<)•Óý4>µåNÖš7vL̉ñÑ =H0¾ÊêVîLç]þ[Œ;ïzÙÌ™?—ƒ5’`Ö¢Û]ý~n&ͦ½p$]8’Rȉ‰8qÜpâXŽNä v‹q$Û$n)4+%–ŽDG GÏð«™™óæ2~ög\z'·rÜ'i‰ùÛ>^`LwÞ?ï²Úå†f2nQº@E‚Jçñ†!e4µƒ¸*ŒØÖlÑJåá`£ÉI–'%Ík¨ÑvÙ‰ž¿üòïl&Ö endstream endobj 792 0 obj << /Type /Page /Parent 1712 0 R /Resources 793 0 R /Contents 794 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 793 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 794 0 obj << /Length 3033 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õ ½„ $Ù¼ˆ2’¶3³ëÄY/l!Ä,(ª5âš"’YùüCþ19UÝu£<Œ-‰ÝÍêêSUçT¿™ îf3)<1[<)\üá+ˆcÇÝHL¦¡Å®/fëÁÝÛ:iÍk\Q§Åàî»Ožxª®ãº´&ŒÛŸ»ÁgëÇÄûN`=)ú––˜„Âþûìƒ)[˜Š‰ëL#ìâÇNäêMØ€d[ô+Œ´©IŒŽ¥k=߉,7ó½ø´/šF¤¥lX²ê¬¯¿‰¿ýÛ‡x®0:¡•Ù®•®FâÓ.kþ¡ªœøVR,ìñÔÿäOvŒÏG“®áaöŒ±»Ýα}dzjÚUѶ0-ütqºÔ ­ØÒýlà‰L d9~ä âıˆ<'ÎÄ¢RƒåàÍì†ïa‰{ŠFµKˆÀËÙ/GaòÜH8‰\ÿl”Úûf•&«€—øE)f¨1ßCýåP°|lå¹ÖOö8ÂÐJ¿”aÆÊéCÑÒÐÍŠÇj[’MÀoL‰Ú¬(j^0×NÞ­›ªuÀ =Ùã@îÍ~³õw]ÖHõ ¿[íõÈxÌa¡‘ÊöðÙn´fCƸ9J#æíôÁh›b§˜õW ›”ÁÄ‚2…rÒ•Á¤Å>«íu Úï¢lÈY‘&z%ämòîÁ$,‡d^NL"¦:­_QÜ=zÒÉäªN£ŠvÜÀÌ ÍL|xÇÓ3ÚטŒ¶’Åb[À«1ƒ¡¿P>œB-´wëÈì©©˜ðäáäžÉºá+1³©WŒÊRüôSž}Qb¸Ìò\­7Í~ȉ‡J]1Dô°,ó¼ÜeÅ“XdË¥ªT‘ªW<“ˆç$·¹ü¶LJ´›”E¾×p"…c’RÜ)Ö®¦å&S ‘-EÖˆU‚L&Ó[²’Õ‚÷+ %Êù/*mØC´xx-ÜHKy„HÔ!bxlQ»g&áOd5B~VaEØÿòüù èöq»}\³9Lð•ø¨Øe{s)%ÚÔj>Ík>¢âtÔHIéÈè4¡=¯;„§«¯ rl5ó›b—§–þä”P0—ŠFèI=Z®‰.<ɬäQ]ph§ñ`Ó—<£_ê«=Åw²ÞØ 爹g©˦”zKL€zý¾¬HóíB7áŸnxTÇþ L‡³û÷C±©ÊªðØN}ÝäYš56áYÈ·:Ù’Wb]òܘò’8·Q¹ŽÄfE¹Tl×sU§‘D:LŽÒ(ì"rù·IqRëÒq½›91´#"ƒ Ô× ™Oð'© Z&&ý.(qU͉bÐäJ¤cL4„€¢SsÀzßjÏóèSôG¼¤K踂 e*³É½jÎJç v{³×:âSÉ49ö¥ãßdSIµJK”<([Eà¤å>|SŠz»Ù úÉÉñ4uÐ!ÁE)J£Oª³<ë,Îrä¢5Ï‘¿»U–k’¹&)]üݰ•%–YE¸Jp„Öjƒ täÝ:{Z‘ĉm±KŠÄ/‰bir$±Iן´¸%%Òjcެ·©-Ì -­¤Qk….—š™¯UM·«á®U±œZ&%( ø ºHO;šå©3š!/Ë Š¨íB£ÿ»"²[yV€9ÎLLã£B º#'²çAö¨Ô˜ =£þø~VÕ^lõƒZns:¨Xoó&Ónˆ“Êfí£ÅòøÃmð^7ÔÅç·(ÙGÛï–ú Í›æ=ñØT2‰ôI®0:DuDáÙ‹% g­9­¥ñ'¤P©I×Pg"ÈÙñ|¯žëÉ„ÖO,͵ÓsË»æbNò?5ä]îôø+¢%{8tÆzŒ$=¶rV­T;p'´.®’ge¸O|ÔÙo®çàgD±¬ 8s(¢‘ðz¯ÇTŠ[Úœ2ŸÚŽrۈŖ²?Ñú¶P(–çF†@òÒ$ç£×D$#êLW€""Àhmªã¤;‰_¶h]“ë¥=í|j_ µcóº¿Ùl¨~¸|Ûn¨¬²§¬€`c“,;ήˆÚ©‚B2бÔÙ†wM457¶­a uÀ=½¥[†kÕ}¥Ÿi›¡ÇõìTž;}Mì]²ñyÉŽ;:ìØ÷8/"MWI•¤ ùR²1©Y' ÝUÕ3WÕG´-$ƒ¥=޹ßëÑkä/‘–ëu2%uÈdœÙÚp³FyZÄñfŠ\bùñѶ©½'Vˆfnï«YÿTàb?ë8nE¸#Ø®Én¯vCNÆ¡(7MVÈé-‰tݨd¡;c"lÒgÎe¡³wD:¡‡QÕôÛ$4Ʊóý9Ù’Wvº$.ÕB:®Jц|àKÓ‚£ƒS"@¶Ç—Ï¢gó¾uh¦MÔQè­Žw)s&(¸¨»ýï5@3¥©ÂShÎÃ#¸¬cˆÀ;W÷ÃâKýÃT"ªöצbÛ{FÔÞ^¢¶™ž˜—™…#ö¡ }ovJfhveKmleD[ùšSѼ4oc¾4N1ê\ó0úf |&ªu£°œrK‹¤)ð¡ÏBÌ2ßfÐ¥D§âž3!zDümïwÕ /³ý¶O}À¤)ÃÙžg£qŒ™ ¹lvhHÑG”y¿]ÚZï—£!õ&CÌ-‰7ÒR7îÅÐ)òÁ 4˜o©Ä.}ÕX°$󿏫Ú㢥ퟆ)Ã0Ô?.¸ ŸÌˆ™A' ºe¼®]C5SàšrÚ¨•ìY·n—]æ½a¿G o·¸WI@·<Á=‹¦(¶XGVZkÄjSeÏHœˆî‹8nŒ¥nŒi.a!«¯ëãe;¾äka¦›‚^ùþÑ~ÕªŽ×Ö¸ðô蟭ßÎb#×µŠd­~7|K™“6Ãß³•ûÙ öqñD #–'óg¥ËoφÑa6Óx7º±#ƒÞ׿1}´·4“v._¾2ýf6º.þèÆåúŽ¡¶H.ra}@è÷êçf¿Ás“­UÝ 9†çp!/A#f[¦”S¯zæOÝ¢‹¹åÇt mÝ‚úB™°{¡ÐA’' ì!wç‘ó§q¿W'¯cãOÐÈ~l~øùýëO³xꦂҞcãÇ`ïà†O=ó=ØDüƒÝê Iò]²g0PàG[OP›G'ŽÎ2­o¾‘ Âê[ˆ<¼ûø2HÂI—¤W¹>݈÷äK |*‰þ{æ{ñ¦Î$ºÈïÞýõ%ˆøàº[‘ê™ïÁİš®¥Ç˜Ô9.]û"½DÅ‹œ[ \Ÿ¾Ž‰œJ'¼Q6³û÷?ÿáÏ÷§¼¢rÅ*q‹‹Žò–k=ó×a‘“Ø™^ÔšÖü XdþéeÀÈIèLd¾ôÍ÷zXýr`"Ét/0=ó=Àø1ÚùUôavÿ‚ ’ALûõ;Õ3߃‰·{!A‡Òþ¬UE:¤/bJ$}\nÐ\ßü‰Gÿ!¼\v†(ú+,m©:©ÁE©â3ºJ• Y‚P¥ðÿ½3cOÒÐÀ2ø‘ËØŽÏ ¼eÈ‘½¤%Ú­f¦Kƒ“¯ë~Çó­Ä-©už[f†?iÎï.Á§Š÷à2׎jŒ Në‚›‹ëâÞ=Š˜ê’}/™ faá{[V@Š…<ê@?ÜÌ™n@ÎJ›¡²@ðÝÜóÝÛ`.Çx²œÝîžzÛ´ÇØEþíJlê ™ÂÅ’ÿ À×Ò‘æ(éÙKO ò¨c<µô2ÁY5Óþ1ã¡[Í’á$öAm(v[[8Ö©~Ý ôè E!Mzåu3l…¢OÑË"Ÿ:ËS'Õú[Ž©máhþ 0‚±Ù endstream endobj 795 0 obj << /Type /Page /Parent 1712 0 R /Resources 802 0 R /Contents 803 0 R /Annots [ 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 796 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 324 743 354 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 797 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 688 306 702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 798 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 410 674 432 688 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 799 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 437 496 467 510 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 800 0 obj << /Dest [ 804 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 421 384 451 398 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 801 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 436 67 466 81 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 802 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 803 0 obj << /Length 2649 /Filter /FlateDecode >> stream H‰ÔWÝnÛÌEoõ ]- ‰á¿(Ã5àÄNà¢qŠDðE’^Pe± H¤¬*Òwè;ö¢gf–¤,;‰?àË#.÷‡³sfΜy=¼šÍ<åªÙjàzÊÁ?üql;±©É4´£ØñÕl3xõ¦ŽÕ¢æ5ŽªÅàÕ»O®º¯Ží8´f1·ûÁý÷Äûv ïSúõ´šDÊúÇ쯃)Ÿ0UÇžFøŠÛ‘#á<>‹žÂHŽú‡·cϱƮoGÚ‰Õü >Šf7žN-œ¤ë¬V—ïFêó­qˆq…¹Ðuf9z±©Oû¬ù–V9âë¤XZã©VÿæÿÙ0¾>_ÍsìƒÙÞ±ûýÞ¶|ÛÕ5}5¥Ïâh|ÒÆ£ƒÛ-Ì«5Ÿt=¸*S/Œl?r•?±ãXE® w bU¥ƒÕàõ¬s†ïb‰óؽ«ò¬œýó¦Ö“ȱñÇ[¾èKõþæýõøêæ£ÚVå*ËSµLWÌsu‘Ö Ö«´h²*UuSíÍOåJÑ=tÒož'uºTˤIšÃkw‹µJjõð&©–­»Æ® ;ÈKËu» GòZYYð¢MyZ,Âeä1uc…phcy´d³«1ŒÛá¢,š$+TY¤ê|+ûJ þÓ+À0Õ¸Ö…jkB¦¾jÙœ¦j4€“5Å¢¡5¦Ã¾Zö±Á¾u!ØŠWOïâõwñä.ç›l“²%¶$„%رNèóˆ"ò-½•ù¸ŸÌ„eM߃Çh:}r9&¹ˆlëj¿ÎˆfºÐ¡»ÆÈ+b L›[†æŠâk6vÙê’‰ ‡¡žÎžQ˜€Ý 2hi1U›ÝØš5>Š[wæÎþ|å-vP…8¢Ó}–çàïUZ¥=üµš\­ªrƒÃ²v˜I’€ ð«=šhÚ`šÍL˜¸DC`û~¼C”FúÍåÇ+Ë%±<©•¬'ýM`:‘òW©¬1)E})‹îó9dzRJ€}}m^ú_£"wùqhQ^ÛÖ‰=ÑK½ÈýUÈBvTÈŒêéêð„RƒéÑÆ¾juzÉ ›p;ª&¨Á&YѤ÷iÅ@B /HþÖj]î>|PR&,È ÷-4Í¡C¡ÂÈGöôø¨>+ZKФuäΤˆ¸’n e5Ã12]”ß¾ŸS˜¦ò =…`¢¸êE®Î3éòéÆV·eµIrRR‘>Dž’:·\: ÁT›µíµÓ)/‡ýmB#Úw›9|7˜2JN¡¼ïòéhá:Ζ ½WyrÀ’ÕKá¶ÎÃ'Œç[ÏCöÐW šGÃ5øŒŸcçgú=*¢â&CbM¤gðµy/·áçÑQÛgfÓ%›-®‘ÑŒa iMß(D1yàf5¡³C†C¶¤6™ÃJÔ€²5§(›5¥wxbÏC’ïúSÍ×Òñ³ØLzl&r_Úȉ±.š32¹`Ž©Œä¥¦üv„oŒ ñئ 4#…”QÃ.)ް@Û—;ˆôyú¤ZŽ{1r¬Eê´¡¶Î¥m8:(~§œ]…È«E¹C”WiÞÎQÎù6E\›†FLQÌ<„;0ˆ‚jÀ<Ð/š9&Ç ]¨úO¼©¶=ªâ¶ˆ/÷1±ŸÔÛJoB¨ ´Òß?%*)òÈÔàN ¦)5”è)"åuÓ™Ê㉠Vf ãPKÀ›6Ô ý´ðB¤nü»öÂä½êF˜MHÿ³–üCõ¿ç>±½±;=4–OLùc~gñÿTsŸŒ¤šÚêÉß$W䆚ÛYË`-VîÔãŸ%‹ºœx1Z¨%/CË1ÍÁC“m,êWÒoÐUõ Ý䤎n]¿çß@§€ú×5w¹µ²|u•ì\Òd‹4dÕ°ž7Å‹X^@¢„¶”2¥¶‰<ÐK™!îè 7,°ßó4ó!b€  2§.ÌK–@¼W€LgÁ÷…õáT¤  ÁÌàÑL±àó]£Ï¢-oXß]Yd¹±•´*©áMÚ¤2®y(ý\4(êë5›øÎñ‚Ì¢þ³,þ2l¾eË!÷ª(D< ß=¸Žì†° à]êBT)–+ gDíõlð¿Êž.ã endstream endobj 804 0 obj << /Type /Page /Parent 1712 0 R /Resources 808 0 R /Contents 809 0 R /Annots [ 805 0 R 806 0 R 807 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 805 0 obj << /Dest [ 922 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 227 701 263 715 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 806 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 701 313 715 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 807 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 392 688 422 702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 808 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT6 1665 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 809 0 obj << /Length 3484 /Filter /FlateDecode >> stream H‰ÌWÛŽÛÈE^õ =5‰æE¢(ÃkÀ;3»˜d/-8@ì"sAf8éÅÓÄov­—ÀzÖ‹àUÕV-ëÊfÐ"«ŽêÕ¶ñ&X íx ûޝ•Íîå¤úMÁîª2&'&ºûUOŸÅå\&³F›mY, [ÕÒ›1@x!³&÷ùàBèÈGþ,ì°ˆ^|ãöŒã)mÂÛ£mÔ’å‰,ÃÍCî܉i~0q+C·’ögœT1ߌý^WåqU7䄇Mýxr¶PpÄ q†Þxw½8Éî·+EpÕ­±ÊÖ2v[jWĺÌÝ·ªå†-ì×eô5ÑŒ ¶s·÷€€imS,mËÞ"1?b퀩既µ„¿mcÆlwÐu6e ņž€ð÷·ßߌ¯½qêÏôí[õQkh;RÆ¿÷R(HLÔjïÍ1¾³&¶ÃÍös„yurªQpÈGOÕ4›à]±Ÿju)"¶8™¾Ú_y,$öƒÑÓ\8QA^áHì’x L3ý >Ïlf[G0ZC€„™†pÒûS?Ä#S=!—!®B+™ÆìL‡2Kïl.€M‘mú°#mú%E$ûƒ®v› Õ~xw¤›c§°»2ñ's§.ëÍ9€¿T ð|†¸ÁlEË‚ìCÝx”~FzHµ[ÉÜond@q{dgá…úQpħ ])+QÞxFÞâOY’m€õë‘’Ûà !A‹4"Ip8|Ê óôY'Ìý8ý’Np¡W…)óÇW¤ÉÉèÁüÄÅù™Ù ük¼V´ü¡ê­-ê*+Uf-E׉.îvÖ¨eV)Ù²åýfY¬À²™>ÌqC»Ç`V¤zc£ÝkÙ¨2%ƒ‚àj¨L!„Ή #7É&÷ñ`¥ZÊ9 —·•îÖ‡`ødFÝÑ"uuÁºX®Hvò !ÎQ‚kê’ã¢,ËÏ L5¥V .sV9!ùêá‡"ØajGúÆð!^gÊú €[dÍRnºÄUâ§³gq•úñì áJïYïç`Çè|ë%ŽKjè8 UÇfÇ-aª…¹¦zäÁ”õ˜‹®sòg²Eþ:b†üiÜe[>Á8dy ¾éŽ+<‚âóX…X%'E†»Û÷Ÿ ¬ógmÊ3ú,Û3ø¦'NÅŠPhÃè‹´ZºêÊ8–P ™u‡ ¾‘î+ÃÃÚT´o|–ý8‹Ðt´¨î‘ŸT}÷ÐLÁ6ÖöÂtÉ'¤¤´ËHÉgî"Ãl‡¢,Ébe Š@‹µx(Ì5 g^Š[q·Rî)8Oô0!ß@æÓ'QxJϦdn%Nb"Æ,M±§XAÆ%‡yÜAÀmR¸Í.~tYMÆ;vÐÝ…ÕÑÉŒÎO¾3KVv([{JËŸcíß§]Éšc_}(ÍÞ”2ÿÄÏãcž¢7A§Îˆ«G?h=ê;iêÒXaH£J–Ì P”oú‹ªVe]Ý#ü"CIsÀý†×f®¡0Õ=ˆ¥²­78Qk¢—YYÊÝEæ†ìwÄ‘r‡9ÞPͦºÊw>ö^ÜWñ]óvjÄ OKÈ`Ûu-eU±©®ˆÂ¹ÙßV« ‚ɯz–k!Š®ÿ¥üCHžZåÁÜ_¨%m^n¤_ÖñÏ»œDTéT‚|²ã %ø^îÜ̹=‰þÝþß±þÓÝön/V­)ÍÒšœº”‡÷¹õ‰6ê…• Šš M©1å›þ²LD…œ‹ßˆ–d±Þš5µLpªKUØþ ‚ª¾óÆs¸ŽRdâšVZúè ȈYcœ ‘’³žµ·ê~ß™[¸D›“O‹VfœΖFHÅtè”O+Þ8¡Æ£;ÚnÿÅŸ…§Â*t•7 ù¨‡i˜R™KYkîs9?çr~*å<˜ÐýîÜ ºnWRw„Aº¦ 好ô´™ûÜÊoÍÒÙ|8<’J[IÁìÊuWÛµÚßPÉÛkTYîhÏ2Û©?±·ð{†[]J…¯ÆÆ VÓØö˜W§§:õéZ’š;Ð ÝD:õt§v‘h×RM—s;CÁ äŽÒÌeCìʸ¦®¤œÌÊÆd9Œï  D‡g>£ÐŠK׎)`ÃÉÁ38˜DZ€P(!4"­±$´'‹3€:v] ¬™qù‡sC‚hz£WRlÔ³‚ÑUŒÙ=pëó§ZÏUg©îzÞDŸâMïä×ä#à‰‡œõx'¥>š’&€íœQyWZwZž­$ºt×Áˬ»‘B.Ü€æÇ¾lM»Có4NÏë âj(ÑìPÕV57€UÿÚì¡@åÆÂ“B º½/–ðxÒ}ªÌÙÿö•òf]]R=Xü;êq;Fw‹Â wP¿žtÙŽ–ÒîqñÙãæò¸›_¨] u¶Ù–0êù—ªýY挛±µGA¤¢p%±,ä"“ÐÀïtûÝ>D,ÞA@åÁVïüôxÎ5ÈÅñ–ñûHµ@ï¯xÛïn~àÁµ|zdë·> endobj 811 0 obj << /Dest [ 922 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 227 700 263 714 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 812 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 700 313 714 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 813 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 309 686 337 700 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 814 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 245 450 275 464 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 815 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 816 0 obj << /Length 4010 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õ =5‰&)’¢ ǀמ]x±^,l âÉCÕÑ¡H¤FV>$ÿ°ÿ˜‡œªjŠš‘²³dacÔl»ërêTÕ7ËÑ‹å2R¡Z®Ga¤üÃOœe~©š/?Í‚™ZnG/Þ¶™Ê[– T›W£ß} Õ}; ü ™|4í—‡Ñgý“ñ¦3?Ö÷–~#­æ™òþ¾ü~´àjø‹·Ì2? ä> â³h•¤rÔÏv§QàMÙŸê SwGõéXuìDÚz8I·E«Þ|7Qû·7MðÜà]â'ºðo&êÓ¡èþi›’™iS­¼éB«ñ_VŒÍgÓ¢ÀOñ°|‡=Öàp8øÞÌuK·ZºGãJËÖånkÃ'Ý,G¡*Ô(JR–†j6÷³L¥¡Ç 6Æ™jìh=úfyrÆ,„HðØƒ«ò´\~½øö"^ó™8rž,(nü­þƒÇ"Œ;Aî”!ì~»7c÷&;}Ê KÄJTfkŸù3w‡?ŠóÆ/Õrƒèà?|§èU¯y½kêmº£ï$Ø›ˆ¥û™Vßî¾é6¦Sf·ó k+ð2M«°MAI!ªîì}QUEuOWp0¦‘?OÔ4ôÃ)ùYõáý‡›é»÷½iŒÛT}÷ÅæÝDµû|£L«ÆË›^ŽÕºn”Q-ínSË¥TÙoïlãóÑpBØ{!öƒä„™\€ó$dÓ€dU¢”=þkƒøóů R8ç ÕUy„öÛzõ$VÉ)V¡¸O5Zq¬È%¡~‰@øs­Þljn-\\ËÚ‰ÔŽu¹rÏ ÞrK ßLw†ž"]­Ü¢á êå'ˆBÞØ¶kмká.³_ È™þÙ@Œvò}kWê°±•ªjÕ<ºþäpðNè¼#øçTÙ{ | ¹õR9únúbmYŸ{y&o®jË’UÝ ^U´µãl![<ªèÑ@M¹äc˜Ï‹Î#¤"Wóggæ{y¿Œœ®ž¸Û5;]³Ô×êD­r8'&Ó¼ÐsêÏçÏæPe¢ùdÀ «Ê’ň(æ“ Nê`¾ïÔƒ¢$°ª%~7üFòOþr˜Ö^ËmM"’Ch&¸?0îÝyâÙr%͉O®d¿š-jŶfésÀÂè#þûàJêÎgTÓÒíj‡y€ò'Ö¨0ê¿ü/u`,5˜š_}¨˜•  D¤Ývö\ÊuD-P,D¢RwŽŒ¥zô¨*À½Lgûþ!æþÁ‘ÚN>¤.A¨ð)à²èII»$5 Œ\Â7ëj¢þ+.}q!r#Ä!oñoÆìC™Èn„ÇŒ@É +4HVÞYÔ9Þ¿Ú ÈršH¸Ær²m¼ˆÑ‹¥ê÷ÒË“%ð%`2%‹Ú£¹!!: ^¾ØÉ/ Z¨a„;¾,þaÕÇþ?»AÚi*‚"Ê^â•HSñ5(¼”LI!óIõkuTã>1é‚«e4‰XwK\¶ÐŸäçÍGùõe”RòD9žH ÷bi–È!Ž Èm$ ߢU5•{,¶[»*LGý,E;’[y% æÄêþJˆRñlãžù¿Wyf7íÜú¤£?U¯ëý‰üwŽñM'4ÚWh×ñð›ú€ðVÒ…%ñ\,Ÿ(ç­õ-FÓzí«o™ –. 1‘=@‡ .賓Sw4þñ帿F0v¤Î äŒ!nu÷©¤×ëV¯‹¦í&ª4ôw[¬Vt Ê'÷å3½öfºø:Qí~½.¾R¥¸š’G„É’Ã-ëáFƒ-nÆ€ã Eº„°P¬Yé‚\4ùFœ8ÇaWL6ƒQ¹—õGQK-tß¾kΩ ”À¶}­:Ù¸—†‹Ó/á©E«‚%+ë4’Ö—=Ú'd(Å™F&}j‘&U…ÑBNþ[-"˜êÆÀÄ̪‹Ç®Þž¹Gwò”$˜h€íÄÐj\ʶó[7V|¯Û¯;¨ufÔªdh@¸³×‡ªKDq_TmgÍŠçTUí·w`ošJι}S D}×}öØzÂ,£ì4XuÇ%᛫|6¤]èÒί¸Šuó×wo–üx#ÃØInê<<žGsÝøJ> ÿƺp‡ Ô©œ°€nVö†¨ÙþÆšüµGÙß¡ôR±F­s…XvÕ¥ñàÒX,9ézÀìXç˜)®½ÏºbËyˆ*YèMŸÌˆ‡:ÓÖ«]Ýò ðãÄó)¯×FЊàY6‡Aì†Toå‡CúÈxiÿ²) Õ¸tÒ€»‡/[Ù†ÜRsA³IR_ªûòŒâ¸øÓ7°á®¹îº¡ª®ª£Öûn·19Û•è“^t<ë½~ („ÊÔéÚ¢rò¨²ÈSIá3÷å'ê“ওÔaË.b2ºŠÚKΓÚç}½í›³’’õA:bZº¬†]–ØŒxÄ!öo¤wB€93—°ÕÀ”[ª÷‰”Ï.×§Oêîÿ¿AŽÎJ«E»c:°Ò£³RòYð è¤˸ l´uÇ™´GøeºŽú¤4×^GnÈå>w1/ÓZ>£ÒŒFwN嘙£¸‘ gä@óÚ«m7q$ˆ¾ç+,žÌб0vŒ™—™ EZ%Ò,o“Xã ò%,û!û½{ªªí6Æ0i^ ¡ÛåêêS§ÎðPö.ëFµkcH€œã©ÅF*ߺ½Ö;Wý Äw\ŸM‡Aqy§¼ |œ°$>—O•h#ðÓx'è‡fFFÄÓËxb  ‚R%_qþ‚¸›3\þî?.Ï_ȶxæ#ç¿ø› FnDɘüG”yâ;q€¢†E"¥Q#ÐmÉÃ6Û;n'‹ra–³ä€Âĸh·M†å‚¦I›iRô+»Íì"˜¥bÛÄ%a8uÑŽŸØ‡ÌŇò¡G0;XÓ¨w4ïªå;z%§ÆÊ­×丹þ¦53'éÖaÜ_US–{"^¡]×D¿<"˜CÂbÐe©Àó,Ì ;¨×RôKH÷JE7äþŒ÷ê<¯QIMóéÆ+÷DÑ.òoÊ´½†ŠÖɆÇ9j›µgÚk¹kcmt‚µP$NB¢†’±¨Â÷N£ª¨£Añï¢;ç¶Èë=J‘lú|çxºæÎ\°|e¯³é\Ìh¦ÑD KØQ‹Õ`“Wd–ØÝ¼u+“Ô•„n«—ÄÙ·Ž˜ÀOÛ¨"ÕÚwy_M9-ÅÊ%Öz]Ú\Ú«8JËøS‹pdIÖ‹Ri¼ÝUµ ÀDš¤s)` ×á|ÆŠz÷Í<ËÇå_ Æá Þ´Š+¤²Š`¶<2Qé1ë"2µøÂ)×u‚;É‹m˜Å%w&%Éw§Kè ùÜaØè3.'Æ—ØÜó_j)«x¦ßŸQ7·â`»iTOàp´ž¿<Ü¥ÇçCvŸ§{È.Ú½XÞè+0 ïó@¡ŽzÇŸEtóúÝEßo]›{½³|;õ­™{éáë«ú½®Z³gVà=:°úiycϘ"ð@êúèMïÖò]êƒôÆü¤*±¸òcTœÖÁ›1e çsq‘ê ‹—ë0üðõUõÞ9¸¾=ªcM{Ï^XþrLÀý endstream endobj 817 0 obj << /Type /Page /Parent 1712 0 R /Resources 819 0 R /Contents 820 0 R /Annots [ 818 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 818 0 obj << /Dest [ 795 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 376 132 406 146 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 819 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 820 0 obj << /Length 3260 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õ ½¤ŒhÞ/ƒ{ì5f±Ø ÖÚYO8RK¢—" ’EþüCþ19UÝ$%&ã kØÐH}­®:uêÔÛùäÕ|î WÌW×þáO$¶“8‘ˆÓÐŽÇóíäÕm›ˆEËkÑ.ÊÉ«]±n'Ží8´f1™õ_÷“OòÏ™5óí@®ýõ$NÖßçßOR>!±c§nñ;rô%|€ÇgÑ·0ÒGýËÃèÌs¬™ëÛ‘tñpe·Áˆ'•…“d›·â͇+ñë¿­Yˆß æB;”¹åÈÅæJ|ÜçÝÕ|ˆ/³riÍR)þÉŸl?ŸŸæ9v„ówc öû½mù¶+[ºUѵ8WÚøêàu 3´á“ÞÏ'®ÈÅÄ #Û\áÇv’ˆÈµƒ@àA"5YMÞÎgø.–8§Þ]íG`åüóäÕwîy¼ÒÔö8\œè½ò­=¿›ÿðþZmë¢:(E{aVŠ8®ˆc!lÊ‘A/Î&É0¸Þv<:‰íÏnaz¸›}Ï“ðho¾8 O^ðGŒþxcüñPµí™/‚À£gíyv–}¡gÿ‹/.oaº¿;Œí(è_ë“×Nw?3ÿör^#­“€üâû6°¢ý r°ÝÆ ^ç°Û§ }£˜o”X7Õ®^åªXŠ­Zl²2o·b›ý¦ZÑî%ºMÖ‰ù5‹(ð5g’ ©&~ú™²Ò•`a­º¼Ë«²û¼(¬„Ö<(ÑvU£–"/qê3’ìò9ÉodOÛÕf[ut$v/Õ?Ľ̚&;ˆºjÍðŠ-ì= ‘ÁêmV׸¶«ïiï-‘-U³ÌË5â †¸£!ÆA°9o´‹D—­¯„zT|oµ°"Öb×ÐÕ®›¥jú§æå¢ÚÒäãmÖ,m}#˜@1"ˆùI,ôÏž<£Ð±cïˆ=p!bðà7RÜjþ݇HCÂH¦¤]}Ùl«²Ò¨-(=re­—r×p×àQ×`27¤Y¿NK4Ð×yJo Ïoh¼•) üTƒ¨w­®×Ô=È]Ë,‰É×ýåýÏ$ñ=ùÑ¢èÈ»Ÿ~<À+a8´Eþ›Ò]"éâKÜÛ¬På’x6ÕìÈæI¦ô‚2çhÛùß2Åu‡$K’ugŠ9¢‚¡uìåXŸÜÔOÁu`b¼Ò%ÌÁ3#i  ~ÞµPDU}¸·ìaWV@{uÇ‚l¥ã‚²2úbâ³ÄŽG¤ÆCœ-Šð¡¡>eQ"ë?µeJ98‹ñ‰úº<ElÇÁKÙ  ¾¥Òqú”RÏ7¾ŠqMPØ ×)G8–Ó+æÕ€ ¯ÐZΉ¬móu©I•˵iÎ2{¶Ç¸6 O+¾;6šnßh" )sG¨EWjxV‰þ© ¹+è:s?ëOŠ‘'×eߣ™b„Ø,é a?HÓ¼*Q˜Ëº§5Õ·£ôÅšŠ²~Ë{4Ù}9ÝDÕRoŒ¬Ç‘•SqÍ7ÒQŽhåĉƒÜ>îp ~T{–Š€„Âu¯„úýÁX«@cR9&©þŠàA¡”‚‘°×Q —‚ÛžLtЕÈúm­ÑB‹byEâ6ÔüÝóù?4ZQÝá˜üŽÉs/ù»sH×m^’j¨Vܱ‘E”Ϊ3N °:2ì^R[…ÿK^b9kÄü×ÚAIVB*`^­IÛ‹šö‚š`7L—Ù¡ §»ŒPW®7Ý÷’³©ð^TZZìÑ DòÞbÍqÅ +/:I‹Dê$ G½©Í/³ ìø‰â ‰Døñ–9ŽÞ¦o yƒ*/ à mü³Íº–jähéë"„ð¡n¡} ÎqÇcôª…]4˜Wf[²È§‡PCËÁG ~™ß~mçPénHjõ€ãÕ z„JªÍš%T~¸e‚%yÙ©µ2?Ÿ´l÷}oUŸôXæÓpñ›À¿è6òVü/=%¡ÔŽý—HÈýøß’„´Ÿ%a7`OOñOŠŒá«é9ý8vrDXn0¦GÀO2죙;OˆÇxà“¼³ ‡}Y²¤ìL¦²Ü«xH+@1H)Â’i´ÌÞL ïÞüí‡ÿÐ^6; QÞû6–… ma ‰šˆ`bÜHb" ƒ€qlk§eáƒø¼Þ;wÚéµþ¤Ë6C™9óÝ{ÎU?ÄdïYsß³˜_›ò¦Möø€Ó]ªæ³­6¸ *\.s¾Á°Pþµ.ˆuM°ÒÿÐ]CÈÌ bBáXPëFœ¡¥+æT2ÕPðÞ “ë(YœîwìKXoO ùìzz{?ÃLq Ú'¦,èFˆÊ«« ŸE oæ‹%®éŸqÐÿ­¯Âë3Û£ÖQǃý¸¦%í¥b[ýwþðªÀ0e¥o> endobj 822 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 131 532 173 546 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 823 0 obj << /Dest [ 827 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 440 463 470 477 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 824 0 obj << /Dest [ 927 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 503 171 525 185 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 825 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 826 0 obj << /Length 4100 /Filter /FlateDecode >> stream H‰´WÛ’ÛÆ­¼ò+¦ø4HHw‚*¯ªV^J‘-Y*‰Iìhó€%‡KØ ÁÀåÒ’È?æ!§»¹¤JŽJª%03è™î>}úÌËiïÙt(_M=?Pþá'JS×K½DƱ›¤^¨¦«Þ³ïëTÍj^ã©z¶î={ýÉW÷uÏs=ÖÌzÃöq×û¬?dÎ0t#}oè7Ð*õ”ó¯é½1[«‘çŽì¦nâÉ&l `[ô'bê?F‡ç ýÐM´—ª»½ú´_7KŒÚ8°¤ë¼VׯêŸÿu†1Þ+ÌÅn¬sÇÓ³å@}ÚåÍï¦*ØH¨³õÜ޵ú7ÿ僱ûìZ๠^¦7ãìv;× ]_×´«¡ma[ºxôàÝÌ-ÙÒdÚóU®zAœ¸aâ«p䦩J|7Š|ŒRU™Þ¢÷rzFèc‰w.ÔE§œþÚ{öê,_c_9ŠÇ”7þVÿIG²{Z‡¬•.í®Ù™¾Ißø2Ãiñc:ÄgÝä+S#ĺq|­6ìpg/rc9úÆ?À‚)’ýçê•CY,„YŠð<ƒÅØMµBlU¹m6ÛF5¥º3*S²Í6N€µØRÝêyÖõž¼uÊ<8cäܬU¾€õ±XãÈV€dܾœÌ¬gf.FîØWCßõÃÖoÔ!{D.èEnйÚ2E§–ëb¯xеôm,Æn`4,=É"¡gЖAÂIø¿çMJS?dÅÖ4û95¹^ÐåËëòåuùš.á,û[oÌ,Ï 5+×NJá¬ê¼\«U976aÛÁD©-Õ߯ßþm¢6<Œ4“A¢«ÌAEè•ið¥*‡°Gá“°ÝI9I]®ŒÚTåÆTMnj€À¸÷.çàá@r€“ßg…AsiòÖ±®TàŒ5Õ«ön·…m›«H¿¬C´†²êä¤~wRßž”>b€ÇŒ´‘> xÌ(Šåu@ˆ° [ÐŽš¡^˜“WF*-©Á3Á!›±…2”×…¸¾WœöªÁñé4†SgÊ—b Ilw¦¶L¬EsØÄÒ$ùü;ÿc‹™)²è7ñï;'Ö“¾¸ laÆì’–1~<Œ‘“rZ%Ót¸u– ·•‡@pñ=d|höÔ±a´~‚¤ù±Á^Úmd|‹$ÖE6Ý¿¹–ÓOú2;=ëï{lXíòšÝnÍ…Q™zËÆ•Ymš½Ú-óÙRͲ­ä‡ÂŠ4Öj]¶å’UW‡ãRR£Þ5\ß6Ü-<Ðf>°›Ìͺl 6?°¡æbÊtÊ 9«tÏ/VDG_‰;â‚F߆¾ü„é‹òýÔBê­Ó|d@Ü@T ŸÂ[ÆHVwì}Ú?T6k¶W¯%6¶§ úÜ9@2}•ôƒ±Fß’ôýˆ£–m›ò;/ÈN—@ ¢HZr ,ÆœãHËóDº·,»qˆ;dú£¨"êÔêІÅüðiãvéê²¥WÙºQ¨•ÀòT{Æt×ø %îøÛ²Px`!$㜈PÑ&¢Ï&’Êpâm"¥öNw‰•.¨–Où*/2ÒÔwû–;ß꓾h‹e¹3",ÚŽ`çÔH±%¤Ñxª¢Ó7sþüpçÀR¸~ÊDçÝ=ë:¹9íÞà» |ñßö,©œ¶"H’lW©6y ŠðaižíJ¼ú®Í‘<ÒjLN¡;Q•¸¥,1òóâ„F.0ü­ª6F‘AÔNzë8ÞÎÑ&àv0\iÔñ¸h)œ‰K¬£”ø)¥€\íÄÀRá[Ô®f.![kóØßPÿçšêP$ÔžˆW—y#L²íï–˜ãòjÛ‚ PØÇö»ÉOô|stSáásy…ÑÓ;U(Éo)ª¤0ïòf•mžŠïXV·Dºr7YrÏj¯9¼Â·yØðšîÒxùæÁ×ǧmÐm̽ýàôÒc7áVr?ÚØ7Y`ÀŽ™ZoWw­)¸Ð‚.ó‚Û°¥VÏÖ"»¯ÕÝžÀ“W8Ï<Èç$ S2†èÕ®zÓXÇHÄu{h»+½–8C‘× Ývñ‰™®ÕðâãB_&™G”{a/s3CkO8(>:A¡r©þ5wP9…tcŸµíˆŠ# =±4Ï•÷(Ãô7Õ(Î]^$*³©lFúvßðÚH õ/ùGÒxg¥îBŸ,Šwf(iew²ŠÚel¥V´¢ý}À2ŸÖÉÇ{ùHm­÷WT$H9ùu»ž5t ÛªYªï ¢ÿš¢J™¨P×nLRJîV­,Û`\¾ vâÙÉŠ¢Ü)Ö&_ß«1£ë'– :mò9nkM¾ÈIð&D/IßTÃ)m)œùd¯–Ù\| ®ô‹)+²†6»¨•Î;Ý?Þüñ Šè¯ïß¡MÒ¤WþàÝ9¯¾ Pmׯe‚5J¬¯Â-~ÿ’»Ù¦Ö·HC¨'W‘@2»+¬:µX¥·XÚ ÐõÕ®ÜÊ© ‡fæ—cÚÁß³ðŸ•@¹)$HÅ¥êÃgHRéGÆ$˜Ÿ¬¾{ÿ’Ã6Öo'}R|è¸è%êŠsê=z ¡˜«#ƒHµyYkž÷bäVõýAÐg«ÒmÄ3ö+„_¶ßBÝv_êžDJ} ¦xø`8[2"s>Ë,Ç–¤Î/IJï1z리ŒšþòaaÑT9®¦&ˆ2o5Î0º¥ëLa6ËrmZ²#ŠZe9Ñ#žÍçˆpmê³ÎDn4þš6 Åñ·§ì¹^mI'åO›`šüaazÐ¥®/_žhѰûò‚~’ˬ\[[Óþf†½Ú@ˆV¤?¤ýÈd.ÜÜöÔ| Í6'fàëUh-¢Ù‚íÔµÓ'õ×!¾í†Ä£Y‘ƒ}€„¾è†¾Ü9™,çó\–Øk s`­Xl<øÒ.Õ¢*W8i°¸¡¾V!Pª’ʼn²Lº“$-»’§!¤‚G`+oÌ´yc*ôAnz2Œ€ýh,oÈÉ7x}À ]¤GãT¯å+iB!+À±„?dÃ×Jûj7¶ òu…\P‡~´~ë(¥KÄræ6Y•­LCÍ¡øíUûÛ¦‡¿ï¯8ñ¥XŠÑÀÁ˜hÚ‡v™)Zª´Ó*5Ò„ís‚B9Ï7þïûü^0œ¥Ýº(²áî8¿—ç%´¢p8f®†˜xËݶ(¨£Uä>ˆ×ͤ!·¦ƒ‹\ ò—ÆV‹ÀÌem-3ÐFÅÖ™E½¸ÍgвÂ9Šln‹¦ Å[5Þ‡ñ›ZƱìšVŸðçINQWŒ_¿ gþé ÞíKeÛ¸)úñ­]÷ÞibkOvlÇTl‡Š%zéˆJžˆå>ßúxÜœ¼GIOþ…"ÇLÇá2îÿIŒb—kôÒ€‹JfÕH£ÚÚ$brá6\¯Z®W¸:3 Ž)ÐËÉ6N¦ÏŽÈ$ö©&œ èY®¸¶·INµp­ØÀäŒ Hfõ–8[‘O”×V ËàŠyŒDú}È <⋌0k\Ñ·1ÂqNÐy? `Öjá¸B¹B£Ã´ð$-–œ#bl'ì+¹âKÇ|.|ïšgöôG‰ä9d“ÔÑÔ³LêX" «ß¨y¬I}kê”Ïž2]Léò%ƒNVþ´õôžD…¨†¨¹9š)xD¦éeÏO&®u¿”Ä0 @§ÿ¥‘Æm'u¡ó 2Éáw …È]®%»Æj+ôh0ÕÁÀ“%ÐÖv…ÞYⳄÚ9zù\mmE ôа‹wÒÞ²¼Êw–{Âõs=Û‰Kåqoi.| …µ 6§²˜ˆø‹¥²¨;_•`‹Wšø˜H £ðQó|¥ýw¦æO6¯ñb‰ö`~ù¤h`»7œ|t.Q9ÉÑJò4u$-Ì%òž÷–_cñ¢HúMü'±EÒP(ãˆË.ò ñ‰`§ÿƒ¤íþN…}e(zo³© Ûß"íè°“NÍ'4â?ØLíîšgí"Ϻòm¦µQoz³{“–ýkÉÏ,³¹½ýãú]µû’šI}hïlΦ‹4ž+!ƨjYæu’-´i 5M2Q™I¯É¯à'Í<“ +ãKìl¼Ý"ã_JšáG…1ž‡‹ñ6£˜³IŸ5Ÿ¼°¿«ˆ+S²qÎõؼ¶Ìè®×ùѽIú0ŠüL.;#hò'5©X4]$Ÿ²¾µÇŠ3mk7• `#là{é*MäTô6ðñ¾Pà4,E Plda¥˜dznŒèèˆÛ™U–l¡¬ê*î÷f’ww‹ÇÀ¼ƒ¦ ¹i~ ¦_«'©‚–¶B]l™`=×Ù‚ñÿÙS‚ þ¼pó¿æÓóÝJ:mµuÚJy·‚ôÝrИg 3‘O"Û®7«„³¸º"†°;¿–55+{v+™yÍC`\ÿF.ïFÒXø ‚#㉿Ö;™³åh›*ÇKUM^Ž›Šœ‡l(„Å8÷"iIå™+¶²"ˆIÐÙœêTû¬Ø-ÔÉÅ@${ÓE"/úv¥ÿõ Ïã—nð|‡úbÍ3féÿ›¤ì˜UPYQWK€„%ÀD$@¢ ‘@Ag²´â>˜ùHâPLÃp>ãˆ.ßÿðežÄÇâ endstream endobj 827 0 obj << /Type /Page /Parent 1713 0 R /Resources 829 0 R /Contents 830 0 R /Annots [ 828 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 828 0 obj << /Dest [ 827 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 167 686 197 700 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 829 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 830 0 obj << /Length 3228 /Filter /FlateDecode >> stream H‰¬WÝnãºFoý¬oJ–"ê_‹M€üív{rÎÄ.NÚM±Pd:Ö©,¹’¼^÷Aú}Ç^t†¤dY¡’¶hX¤†C~óÍpftµ˜œ-ad±š0‡Øð/Š,;²ƾD¶K›ÉÙu‘´klR§Åäì㜑çzb[¶kÒ‰Ù÷“/ôçÄ0]ˣϟ%#Æ_˜Äb‡˜„¶pŠY-8b/ùÜꟼ5Û0™kÔŽÈÓÌE³†7åìDë¬&—gäÏÿ2LæÈ|˧™aÓt=#ó}ÖüW¹ØÄ¥I±4̘’ˆ_L˜/Lsl+€ÉâÞ ûýÞ2\‹ÑOåx,l GZ0´ÁºT½Z‹nF22qüÀrFÜЊ"0ËóØèE¤â“ÕäjÑ‘á2XbŸ²q¤ÚFFåâ×ÉÙ‡þw "C?F¿ ]ú¹Ø“‹áLeÚåèvËö”dª$Q§Ã¤Dú5 ò¬àõp‹8RlÁ:t¡À”ÿ¦äIËÍSV SN¾%ùÇ.…Í€#Š•£Fð\V†¬x&X¸sNÒuR%iëwÒÁa^1ïȘ'“lIžC¬cˆC yð@† "7J¡éÀc›Hi‚S6|‰ê°N-ÛÌ )O3¢×£+XìàM1,EÜR=5µ¦ \1÷h8;R &ZÂDÓ«œŽzÉž}ÔVí•æ.ÀÙ!ÜéßD@DK1Ëór/‚à{²Ù怖¢ bu¹—#Ò”d'§\˜9Ýìò&Ûdß§dS.9É I“•2 a-WoÑ^_²çS ¨«Ôp4 m÷éΗ&¼çÅns!{¤5ç„ÙF ÇX®O‡ú¬é£a‘e%£ºá9ß®Kpt±3DÙ<ñ Á.nï¾þôǯnï ‘ÍIRUÉa&àö uœÚÇ ²Uáî.?Ρ|Y“„mcŠÒùôÀkõ¢9laa‡|zöfŽÃÔÈ´0m-‰×·P¹äð—Ï÷?¨!V2äyò¬èƒ´#X†ûôª·ÔE®lO”O5²ÕÖL=QŸѸ±™ÎXŸ½éQä_÷HV4ü™WÀGÃ(DLÑs´þH:b±¸ËɧùÄ’¡ð•ò™-yÑd«ƒœY*õ¤éÚ€"åŠü]‘ýmÇóÃ(ç¾ýŠA/e:ƒ\÷MΡËù_÷Ø8@Lr£ŽqÙõȱèiä°n*hòê¯to²çµJóëä¥ÕuÆQkd:ÔÌ“VÙνά4GC¬ãŽCÔÈZ5æ«id=ËÚ ëÅagµ, Ëq—ýJÝÐÈ”š'tL‡+½²5Ñé§BL Äñ_‚|€0 w<áédZ ,x zsÄÑqÆS¨N¦b‡Ú([UmEëšä¶‰¨¡c8íÑÌù¡À6ïùêAÅäƒ 5tÔ^0l£†¼-”ð»ÇÆÓ·Nvb\ ³‘÷ûþ<ƒD”ämÓހξ^eÄÌölUse.R3¸<ô\õ(Æèu²_)/™Îgnëƒgíóùt[ñU—¤d< tZ̺{[n<^Œt2=Nýƒ&¶úm“&¼®E‡u‡‹Ìü©Ã¡rf`mt½Zn4^çt2mh…ìÿZÎZ²O.7/‘:™Ökó_GWß?§Áåhƒ+/:™®’»þ±<Ò÷g⸋ÓÐ ÆK—N¦=ÆÓ÷üIšòm§EÛÛõ>fËÕ ãWm`ÆëY/6»@Ùœ†ŽhÂ{ÁSºÜ/‹:™ÖH÷¤,nË:k ãí¥ â[ž@ï& NÛÏšB6pšºézãuS'Ó´—®ôÞµ—CÇ»ã…Q'Óôð. ONR=üð (Dv¤6¿ýO‰q©tR,ÔÁ‰¼CªWCÜžíôJ$øÙjÈŠ³ÅÂ#Œ,Vø ³= Å³\7 ‰œÊOŒ€8¡;Á `ηmÛ'‹t"F@Û" ö[Èò(‰äâá…˜ï6\<á¶ÀE¤I×DÜᚈ°‘á×À£;Ù‹¬À–¾'³ö`&Ͻ.‹&Ö|I²âæ…´ÛÖ‘Ûb‡m7BÑqÄR]}D u1Dc =Ä좮4<ê €¤ ©!Ï÷ß8_™€Ú´(›uV< 5ÝÁNw08´¾ÐKÃô˦©²§]Ãkœ2Š'CNëdÞì£Ç¬>Þ0t˜´)!Éånì#zÛ>íücö´Xg5i’g€à§š$=ûfÀE§È>Ù&Ye‘Ë Ð\Ei æ Ä0+¢Ïà¢ZË·^-«mQ”þÉE«TÆ’¬GMè* x‘MÖÙȶR9È$Lÿ¾ç>Æ’íÐn ÆzÌÌ}œ{î™QÁåÝÍjswlªSq…%?ÅÝëø~$ÔÖÉc9ËáLá3›9Ô#6vΜú{Êœ§SwØut:ô=áœߟ:ß~$ýbôÆfÀ;F²v³!ùô´yzHî7Ï´mÌBœän/a6³`næ„g6ši˜go?Ç÷xLZ†)wÑpà²ðrðô¯pOŽNg­ÞòÅþT“íš6 ¯ºâÌ¢NÖ„dµNÕûvW¸$ÎñpgÐág¤ Dhܾµ;OÈw×…ØTÄ„@é*© úª`éŒZÆ-l¼9A™•5ßÅó( œ®›.]Da¶ï¸±L ][Yk.+/nì­æŽÊè³GN¥ÄK×jÍØ_³|V ¦ºÂçš{*½àä°ÿ²ÀË©ÀK+°Qfß0n…óvÝÚõMŠV²§äÏðŸpª¿_âÅ-xÿèØ[†8]3+ÒD¡¾O8»¤|ÿ Âü!GBÓ$^´6-z4)} vœUW1}ñ{\…i+S,TÑ ¤ºAñHt©—X“êH2 ¼HÛ¥4ƒYXª˜FkyÂ'IÓèþA|¶®»jh¼R›ëØ‹‹ÐCêIV-rɽ”Ñÿ™±ªÁužYöWÕç¼Q¤Âu1ïÈÒH,\¯±Ð·z1T@ø?‚˜Øh¯ÔÝ:›$wü)FgûFU¯PIªhzú?ŸUgFXÂþ¦=Oo endstream endobj 831 0 obj << /Type /Page /Parent 1713 0 R /Resources 834 0 R /Contents 835 0 R /Annots [ 832 0 R 833 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 832 0 obj << /Dest [ 842 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 467 742 497 756 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 833 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 346 488 376 502 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 834 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 835 0 obj << /Length 2921 /Filter /FlateDecode >> stream H‰ÌWënÛÈFÿê)ú5,$šÃ;Ä€ãhYd½A¬,ŠnŠ‚–F6»)P”÷Aú}ÇþèwÎð"Kb²@m7 ‹ä™9óÍ9ß¹½™.æsW(1_”+üÃǶ;¡ˆ’ÀcÇóõèâf‹Å–×8b»(Fßß)ñ°9¶ãКÅhÚ>îG¿È©5õl_>húu¥ˆ]aýeþÃ(a ‰ˆ; qŠÛ¡ca.뢧 4ªþéâëÔu¬©òìP:±¸wÏEýˆ/®Ô4Ém¶×ßOÄŸÿeM¼Wv 3Ë‘‹Ç‰¸Ûgõßu•³O¦ÅÒš&Rüƒÿ20¾>_Íuì/ó·øÆöû½my¶’[:UÓ±P#m<:¸Ý¢ùôÈšfó‘™¹Ah{¡^dDZ•íûwôcQéÑjôfÞÃSXâ¼´Foj‡,”ó¿.¾;ñWäCFAB~ã½òf±oãÌæB–Þí¶ã7’q#‰»=ÊHØ-Š0ü"7åÖšúÆ®0c•Ešó¥{¾­¢Æ|Dˆ¨çFdÌ9¾óGø ÿ§…(ÉK5ÊÄ}YæßÓº®²û]­…¥¹Ìbï÷–RpúÔµc)v[½u)ô—En%v$wK-ÊJdÅ"§ÇÔø– Çbªl嵸TKT ]Yt³:Í ñ”æ; …ºpÜ.¶V@èh,å œZ« ËÒZ,Ê¢6ºJKÁJùÁîڢͥ§ZEIÑõ;Ë´NÅgÙœ¨ÅX<;¶ì–­t·³²Û[Ù5÷¹-«ušçÏœKZ/ñ·¬É\÷€³Ñ‹l•éåDÀÈôñ1}ÒVH·x¥‹ÝúJäÙ¶Þ ΣXg_ôÒb®â¬ñÕ”ΰNÐC DN.¦;Ñ&ð™'EVÏ ¢³i·ÔR-_#;ºØ\˜= ©B Ê ™Ù¿{0˜%×åR¿ÔàÚ^ÜS_pLõÔ‡Ocd ¤™mù…¹F„Ò¾1ÆÎH ÃÍó†·‘À“D>}y,$ã) +“ÁlÏi~Íî’×çy¹o>–DÔ¥6â””‡r—×¢Åi‚ɵ£ä¥Ï]·sîXc{„ LÜ…%ÅÌJdž¥P8tæ×K£¸ó 3Ê:/ÿf:„ì·xÐd%YWi±¨#7¢Ì¸,î wn„•R2 Y—h"ø[mB]*8°Þk+Â59cD²EjEr¬„xh3L€ ƒÿ^%Ì{Pýw·„b×Éæ:Eº>²E@z[ø½-üÎûG]t·ÏбªÊuâÄ]Òº“Ä:­´ `8_î,¢«¦z°*w2’áY`ûîQnIúãs<1–bÇ7f9g†¬3”-uÉ9鯹j¨Ië‘Zˆ˜BŒ!šìËY\›ˆRÖ^‰=üˆhµ¦”Ò!œþzl%2S ´Á•Ð5æªõYfÊÂDp µŒï8ÿãùbÔd`ý Lš@í0?ÆÇÖåC©Ø¤æáE™ZŠæ«¹!%ó’Ò}S€ #ÌÑ%¥”™»úrMíà¿ÃDg-ù~ÇTTþOKÞ‘n|YX_/HÉT$N6è„”m (JOéèõl4窶WmýÆlÔ[“3Á9j~cÉÌ«¾%Ì·§FDN,W=ãÀµÌŠAºŽe´.a«˜d¬e«r©’;=6ïÈâFÊI·ûÏ©ÆÌù,3´ü¦™©U2{(Êê¤|GßJûÙ =¥¹$ÚÌ6¡3{4·³¯^¤|²,·¯YçÏÌ"<×ÀP`O¨Ú›ïyN•߀똇ì~£{Ílm‹6­_ŒÙ)åD” tÑ4¹©ÁW£·8L!z½©Ÿÿw®Q!»fSéUöåØ5þa쇽oÂÎ7Ôçâh(÷eõkóh~8uûrå)O€®¬( Œ¹hñ ªÛðÄc¹×OB B›FÃ¥ëŒ&¦±hÏK7›M« z¯ä- %‚l)‹ü¹s㑯¿†×'{ý%£&3pU)¶Á9C¾-†#,hˆg‹w+±-M¸Vzf‰K4Û›µi¥_f‚Óö÷ÐØÉ 'íD oƦû£Ñ%”MŸÊ%»x°ÅuÛZH!éz“ëK¦TÊ‘+ðß‚[ͦ}=nº]cSJaܯÂâ Q@­'îùzü†WŒ _ÏÎ>ªïITÓ“Á9#lùÓ”›Ù7°Ÿbؾ¬owë{„Déøy·ÜåK“±FFrË8ØKEÌDžhrù*c&—YêŽEiV°ŽsÓiWó†{…¶á0§L=?[Í$6ïÜLfl¶ꊮLŸ‘ÚBÜñWmÚž }”´ª÷•‘›AÇ$&öÎϘQ320»ù¨4CňHé­kT« ãX”ÅS#¥ÃšfÊ“"Úßä0780ÎшwìøSÏZ ~2ÌJ¹q{0%²iðÙæécvòÈk¸Nfî0‡ôŽp¸3³Ûµùùtw<·µê¾¹~ÏO³Û·×EV@Ž<ëûã/Ôº*0¼Á¶ºÊˆg8e«‹šsÎå‰%ŽŒtñjÇY“¶Z…:¿©Ê®jÌŒ¡ã4!r7¿žº_1´Ù|{¶+á»ØŒÈö1…ðßJVß–a'õ]Øå…R4Ó9?Êñl/Dåð’ZÉðk²é9Ù<«LçË×ãÛO?Î>¾»ùë´™íatý#0çÅ/±(d)Æ£b»?ËAë7ìÆ›Ÿ~üð~6?1Wt—Bþšäçq¹qDÉË4×ûÙ÷×§¸âS\n‘ q ÉÏçR7Âôé\òÕ{EéàÀا¢5|à€üÅ1ç#œ:ØÔ×V·ã#‘’Áj2,¥JÖH‡+ÙÀöoˆÛ³#‡.8XɆä0Æ¢fèÂwJ·s‘0¯Øh,¤úê6í› ~jú%n C+F #^mÒ ª¹mÖÕÕ%šA~6†ók³ÍS%–è‹ } «hZœ~¾ë½ÖbRqb{î&ÕBjÝ”ht²3HV\¢osº¶¿CDB? ºªë€¸Ëá^–0óCF,”ÏWÇЦ¬¤ë¢Œ}âÎ>qƒmÛ 2`‚o€1½| Æ4Ô‚^M^mÊ-Yªø ¯ƒ¢xÂýE^£xÑÈ‚ŽZÌ-½*IX ž_ÇÒFÎÁ`4!¯¥hÌ'b‹qw"Úu4¬€—æú\”…^oê³]9ƒ@½ ;éÂ&¨uá)\¸ì†()Ò6…¦éíý3‰Ú!LÉÌð)ÿ%výîÖ¶1Ϧ6ót¬7Ûztc<ùaª"³­EºÁ¥¸F!ó8=“«Ÿ{G6x\  p ~{h+Ã#RÏûì¬Bžm{·ðéÁtŸL¸ô³´Œz`  xñÒ]3i¤p” ¬ý(Â2€£‹’’؆©€sq1úËŠÖŒ‚Xæ¨TÝÎor@„ØU7,›ZF­‹‚H³üg2úb³ÿªÊ`T­ýÇ^Ô¨.t3C:aî…ƒ¾‰)ÆÄ`æD8Nã5ÁŒN…¦1æ"Ò‹ò`âJÛ endstream endobj 836 0 obj << /Type /Page /Parent 1713 0 R /Resources 840 0 R /Contents 841 0 R /Annots [ 837 0 R 838 0 R 839 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 837 0 obj << /Dest [ 842 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 116 659 145 673 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 838 0 obj << /Dest [ 922 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 227 547 263 561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 839 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 547 313 561 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 840 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 841 0 obj << /Length 3330 /Filter /FlateDecode >> stream H‰´WínÛÈEÿê)úÓaaÑü”(o6@>´[w“n(ÒºXÐäÈâ†"’²V}¾Cß±?zî½CQ–Æ P$09£áÌý8÷Ü3¯—£Ëå2P¾Z®F~ <üÃ#J×K¼©šÍcwšx¡ZnF—oÚDe-¯ñT›U£Ë?ùê®y®çÑšl4é_÷£¿é©3 ÝHßzZ%¡rþ¾üÓhÎ;ÌÕÌsçSœ&îÔ“Cxƒ€÷¢·x*[ý+Àì$𜉺Sí%êö >ªn™@;é¶hÕ«/Ô_ÿíLbŒü»±.Ogë õi_tÿ0MÉ›„:­rg2×êŸü— c÷ÙµÀs§,ßbŽ-Øï÷®º¾néTCÇbkéâÕƒw™ZóN‹åÈW…ñÔ §¾ gn’¨©ïF‘‚Q¢3Z^/Á},ñFcµG•Ë_G—?<ÊWÈY<§¼ñ·úw²8’Å8Ó:dwÒîz‘uõé®ÚQ°´[A¬UËŸ ÎðëZ–˜œ¬aóS{ÊBNyÇ'ÿâøšNPb±Â~¡nwÂiz¿6ÕiTŠªÄ2èy˳ ¡H}ÿÇŸß/zsÉPuk2g¹`Všëw¿ÐrW} Ž3™ th ¼U›]Û=]&C û¶„ÓrŸ:38h©VëôžB3յ㣠7F½0°Í…ú¥êÒ;^»`uѨ% N›—ß¡è} Öš?5´Ð¨}Q–äÏŽ‡9ÆÝš=¦€½ Ò™Jáðæ¢Ç!›˜´¬£)}¡6F‘æÐ9sj|ãHͬ¨Jè”fWYªVu£ä•’îk†¢¯)õ¾&β ãLfåAŠÄ~K$•è,«›œÙ­¦Ðˤ€üd±+Nô”c£?ðÓË™‹~<$&_Prc-E„——È ‚EÝ’Cåã,ÊR¢K&ÀxOÆ¥]Gë  Òȶ´Žl¾6œ™ö¿S¢Û_’ã7¾ü"ýšq¯+xñpÀ):vÑ îŽ¯ÔÒɺ޳‹…`•±¯,îÔûë÷‹É[êÎ×Ñѵªo5YçªcKMRW’ pC|ðhx$/,_&F™ëÅXei¥n‰Qg‚ £Oà÷­Ã ²‚2èƒ]I‡w‡íÃÏ…éçÂôá‘éId ¬sĆ<™+±ˆ9(ÑþBíóžÚç f‚ë––PÖõ—§‹(#ß–µØ+ÅŽ‡zñî;y!fr—¹ŽûôOp1ÔW~Fñ5æ œ–K¿ÇCäFáI:O€~Ò‚Ñz¡ ?l`ñù³ÀæÏluUPë›:?Ã\|ÄœpItää΄¸à „KÝ÷z%½ 5¥›ßíp‡‡G™Û±îìkË…Ù¥4 t•Û—†%b¿þBºfcÚ®)²NšçQáà0ó[ó ûýúÛÆLÐñn9:39õæý5¾Œ´T ”£–ñG²~£Ç5ì¿PƽsH«¹ä‰Pi ßÐ2Há&W€îÏúÇÙÒ@"ûÔùó„ºQà°o-]·áR_7(Ó†}ª «±¹(nÀd@èzÿ]o¬I¾Ô,€ÙdPžv©­ÃPê0ÖÒúÕ}A!út}¸˜èˆÂ€:ƒ52í`ñe–<¼] â¯@€@ÆßPÏf[\~¨ÐþÒ]Ùî<8ÑòƒŠíɘXŒWo­¸¸­ëÒ`‚ú 7—*¢è˜ üP_P­Xº{À×]cÒÜCpDÑòz5„RÂÌâkØL^¨Ïð¶Øs®‡î¢^óÏi{O÷²Ù`êLL¶XÄSýk‚?EìÂ!]¤d°vp{jªŽíG¥Œ Á9ÑãG¬Ï¿V߈ÌüÿÙߤ¼q!–¨“æËÍ}Q­z“Ýnzzm}¬üÕÀpH°§é’u?ú˜ÝÈZXEÇðÝ OGêç't“ t“ tƒ4#9iYÖ{0Aä6; ±Þ~²z³M»â¶(‹î`¯Yt ÅSmVüQêpÎ ÏÂŒA@Í H!cF_„|†ôò0qcÿ `õ!5„2¹e(00Š@´·*<†^L‰Ôaµ=S­¶ÝXÚ•Ô‚|¹Î˜íºþƒll¥I×쌕[»EcŸBv`#Ž,Vg“°N>ÌÍ‘›áÅËØãðÒE+—;âKÖ¢´½ EZ.€”ºÔòÔ©’'èf ‘@BšÐÕR(ÑãËޝ »·+sâ4ÜÁOí‘åAϰ»u ò' Äê¡çóñ„4î» †Dâ­etné´ˆÉ8aÞÆ6ñrñnÌ*ðÕÛ·¬ofJ†n ýu&+ ćD]«Ní× Æ/(_U¯ž{ñíLi¶ë·[DüÖ4rå¼t¨lk{½EóNó¼±÷QùË™ÛÛó`¾¹Jdf‡ÍB½•Ö¹­›®¿Ö~ªÑKäpN›AÞÐúá—©ì"ÉvUwƒ~ÊjjS7†:%€~^Ý•Qhb _|SÀ¨ÅÈuµRy`ÓÖY]u)ã‡î‹ º Zȼµã< ÄãˆÞŒ]õçºãÃ;ÙDŠ¥…Y­p“dПoσ$ÑWEi.ÛÝ­}åØaP÷y—š$2·®ó…ŠÛ Ú·r’Iàw;o½•™±’58'°½jf{Õq“ǽŠtùW›à=ÿ–nõl1êK³"PN¨Å +Ñ–gÍ2evB⃠éà³´i§Ú­É84ІÀŠMßY Þ€ ÛäT›9M[ºƒÉYúâ!}–¸7 ;Ô­Až´áêÆy%R×2G)dnÀƒ¦PvL†´Ž¯ôòÚ«`7m ˆÞù +'ûã]ìõ¥‘¨D¹DôBn‘¢´rÚª1DUåïûÞìÚÛzéïÌμyó+Çó—Ýoª@ü æÙÈsÎt°NäÄÌÌMf‘3N±4(˜y8ÚÁ€.Ó™¾¸ØÔjÁ@ùŸ0P´Š¥ÀÝ(yÁý úípìÀ´îûì¿€€sÆÁaÀ÷8ë"„}Dõ(TÑÓ¾î 㲫;­¾ofééB³s[G )(Øöÿæ™aJÕ ær…¹W[KoƒÊ&ž>OA²öÕëKwØvç0$›· ª]¤:Nã½d¼|u#ë;W’íXÈwd·>C³L…βçÙð ªÉµ€ .>{tŸÉzÀH*»¶Ò× ’Òœ0ó(w—‘åŸçúíµº‰°=Q}Is˜ø§eV—MfÜXËãîúr ZYåɽ|]EËx½zX$\hW ^ ¨ä$AÖÙ‹ëÏ›%ûœVéô\¸œ±£oÕÁï@£}Èmû!U)uNl¡o®èäé~±^Q¥s¿‘þðà!ü[Ø=&7ÎÙô“j´¶.ú“÷¶AArm² ÇÔÕquu'',7;K3«"ClÚ V”Ï_Õäå²µ0­5×HÌ™½ÈlªóàëÌ­oÈ/oT`mÝyÔüq3QZ:±šÐTZÙtn¨kfÇ¡\R#eð¹™’£ç]€@³é_ `‘a"Ù6ˆ¶®§5"«‘:),z§Âô"7Ÿ‚-ªd jŽVвá@9LI¦e* ØÇS¢J›*_—øvÚ¦äŽLÑ9UÖò¼`Bö3§V Ÿ&Çÿ:Ÿ¾Sú.Mö6ÃVö…·†û"ðúsã»Ìßë‹€ù¯„Ëi6 endstream endobj 842 0 obj << /Type /Page /Parent 1713 0 R /Resources 843 0 R /Contents 844 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 843 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 844 0 obj << /Length 3626 /Filter /FlateDecode >> stream H‰¬WÛŽÛÈE^õ ½¸H4o")c2€×k/v7k!ÎÆÎGjè¥HA¤FV>$ÿÌCNU5/#É6‚»‘Íª:ýÝbôt±”¯ë‘(ÿá'JS×K½X%ó™§^¨ÛÑÓuª–5ïñT½,GOxë«ûz乞G{–£iûx½×o2gº‘¾7ôh•FÊùÇâ§Ñœ%ÌUâ¹óZÂÔ=Q–EO³XDý;Àê4𜩺±öRuwRoOe³ÁJ IºÎkõü‡‰úûœé ï{|›¹3;ž^n&êí1oþiö uV®œé\«ñ_6ŒÝg×Ïñ²øklÁñxtÐõuMZ ©…h¨tñèÁ»¥]Ú°¤—‹‘¯r5 f±ƾ 7MUì»Q¤àc”ª½­Gß-º`„>¶x£Ñ‡Ú£ˆÀÊÅGJXd¹^„ ‘†i¢äµ j2›¹I0ˆª×EÕóÅ'غ‰}ZÝìª:oòª¼}¦–¯•ü·ÙW…ª›jŸñë½QØéÀÕPó~Eqd{³3r$wÄŸ¾ÖXØœžƒ¬34˜ØzCýÖNk拪l²¼4+•—Ï8Ú‰îÄZìÆnÒæ«¿Ùí™›êjgä¡AS}ºÜì2YɶCÂ4vË-üHõ¹íSÖ2õ]?$MÕ´‹jjÍÍJDMkg_±Ö:L§uY5›¼¼o}¡8èû1z¯ŸØ#Ý4ûüîИš^}Mš}xôÍ—E»Éê‰Â2Qõ¦:âu›b5Q¨§Ø¥bãjÞ™ ;òr¹7ˆé2%¶yI§DïYÀ¼ÞOvÐë]êã0"t±AM7Ù½ÂÏ¡šêÞ üöŠ"«QÐÕ7+ò™m9‰Ü&j'¢,~ÐÕ^Ý›Òì³¢8)>DXÍ€Ó9bU¢{ K©Ýž Òä*«¶!ôÆ“YAoa ®ÌÐTä2 9æî7ƒt†À‰Þ&ß’ü©Êö†+ˬ>8®ú‘2Gèô ßK èδN+«f(`²ÍA¨kÖ×y=´¹‹ªßÛì[›²â PD×N¤ ‡ZØÁ”KƒåPl7Y£è[îpÈl…=E%‡ ¨(®örqÑCãø{BHô$‰ÓÀšVY“!ò"?²¹’“fE1˜A•,«¬]"‚Úd¶Ã–«¢µž Zfò‚˜PSR}=}—³8(‡ÙîËÊjµ=M¾+ŒZ¼üóQ¦jœÂ§‡Ù~¥ª»Æ‰áìRf^ã:È0#WKàóÓ©7‘‹ã&/襀ÿ3õ`ö'€ÿhöëC¡ªÕ ²á¯E]©}Æ•²¬¶pá¡èP®Ì¾n¨ôàrÕÛêj-Î{Cæv~HT¤ $nMɸ,ªêwã1” JELÐà=é¥V¸FÃMt~¯ìƒ¤c•Ë%<Ò"=w Õ×ÔËVR«½\Nql7>ÐFX#o(‘Nh 컟ªG4‹ì’ò}ªöäTã:–êf‹šEö×0üÖU‹ eÚV4pÉíŽþõ#T-yw€D÷… ÜÔÕ–Šá'Ø»€ÓýI`tµ€ã¾€-¢äá@A•‰¨,÷ n\í¶~_ ¾ßNJ.ìT·^ e; õ„rJÑŠuÛ2ÅÓ“–¨ù!ˆ%±¾UU¿ùf'϶CH²cŒ_©v_Sjl)?Ò¾-Ÿhú|Ðò僃:°‚ÌgÛtÔƒ7âp—m+ø¤¸B$¤­ÐMâ1íÐõ[> å© Ëéùœ¶ÅoOØ‹)êu±¯»Îü! ЮYñdˆ ç€Î „ì(ݲÎW¶Þe‚ú± ½3×Om?l3ǹHµôˆ¿n6öåH•hÔâ6á r¶ã6×ôØ™3è †BˆgS˜¶)L9…Ä "C;wõy³äQf1 ‡Ñþ«’3Û*›^Í×% £Ú©_•˜ÛýÌìøf7–Õ¡l¸„².Á4Nÿ×Î{>ô IàCìź*ŠêHÝ#ëøÖ3Á+‹ŒÊIâ3¥mQ»-²ùô…€tÓ™ÓVî ·'4¬ˆÏ\ÕäL!0+Oªêmaëüí{d×\ìÂøË”˜HDfÚ¶ó¤eTò‘z¹TòuÆwÛ²7:ˆÃÑáY+Œ|¶|Ohû#Eö¥”cK›–íáNÂã笲ßwÌcÞ»Ð6é›`0ñèG;òæmÄ]c"˜Á¶¶„0Â!så¶ÝZMû™/—kýî¢&yRpðØ~_oíM4ЬÖU¯ $·!fÃËææ\oÙ­ 5Hùhˆw§dŒÄÝgÜ ¾Í'ãÆNªß9‰~ýëÏcI—$þVÉY9da=^€ÔDú·7lÊË1`3½L É ŸŒ³n„3]‚ˆtѤÁ£Ìš£|Í+~&âCýÒ}£cÛÌûË 6ù¿ìghÐx“ Ù+ù¥>µ}hÎsÑ—.f‹Ú6²X™êîWüsJP“ZêÓ¡&n…š`,»bU–= Úq2$”LÆa6DWü¾¸Û3Óâ’¥‡º|}zB©@‡±öÒ³ Íg;æZvÖ¶Œ0›ß¥1 ;’ÄîOãÅoo$ãÇ¡ŸâÞs4?+>G;‘hÐ(ÚÓ 2%“ÈÍÛö#•8×§>Ð1;H‹¶˜"gx>¡6ÙÑ ²{ŠdJ©W Ž¾tÊè¢k ­ÅCœîpü׿:ÓHÿLü'ÁÜæùs[˜ð­¨Á׋NùÍÀÛBõPj‰þF„~ T»Q—0âÿÓkhíÇ”R Ñ™nɉEçŒú ÚØ¡“bŸêsŒ"šWAŠYœþòúû—¿LøñÕó¿!ô;„ü’y«GüwÍÅ#Ä™™±„°Ó˜ ¯ÞѺËÉ6;ñ¤»c”‘]ŠMP0Ð}Ì7>K8¹~SšÉ~Îå*So¤/ë ×7/îÙßL¾£ÌDë‹üw´|älkÂäqÝ„ÓÄøåbKpªwÖ“ÊV+ÆXVèÝvQk gÝ@BL¼óŠ¿,{y¥ZuËbmËFæ÷ºÄX4S"«»fÙ)IÛíL"MRñ.[4²¼­àµð‘Øa9¤ºvüËsj_¸”>T9ÍjS˜‹Yû™›ÓnCü£üÎìk•7jU!BeåLçЃ™!òµ)k3 ï_…=½þñÆ;˜Öx#‰@šÀ¥ïÌ’Ÿ!CŒPÜóÔ²ÈalHž‰@}ò\ÒQP-ëkI¢)KÐZ¢&?TÕ\/7`¾ØI<œ€íµ5S÷UºHF "Æ“±›,Êtö_Ú«¦·i(Þù'W"Q>ê& n Î .íÅØ/íS¿Èvõß3³»Ž¿šR q©Úg÷y?fgfmLu›XùBÃNF³Y?÷F¿¤:£aZ Xb¬.l ª!]Òè.=¨u86÷îøéKZåv~ò(±¬`+l7Ë„bGï% œ¯áRôÄp§í4v! V=°ù͘DZeúwOõ¶¥uç]‘¯ØÞôj8Å xä‡ßS\Vßç4ìíŠÊꤊ¶1EËØò+‚¢t=óß;zÑCŸzã kŽéû=òV#v…\W¶¤Ï¾n@zVoÓŠ)•Ô;CBšIfY¨r‚˜ö=2Õ‡ïÀB˜›/Q¿bÄœùWÏæÑ·p‚¨WçòmbÃ)j“†&›Ö‹ ºsWg•?0jr{(i*ViÀq]"œ…Tö¬rˆóZ#|ç "»Ï1£¼s(y7WÅgdñxÒúÞ º¸ –¯?É›odœa¿_à{Ømœ¶íñƒ!ÊÒ";i£;é&—ÿº¸ÁbÊ[^Ó“æäk¥ D`ÓÏgÑ`'µH|9…laa6“FÝÆA­ˆJãÀ– uÂÄn;Ÿ3„mLÏ‚÷½è’³ÉN*àÿÌy@’13Ûbsì>ì"WfEà5„ìA¿`¥ËЖ:ˆÅOàŠ×Ä2Ù ;þáDhoâ[¼H:(&Êo:Xm˜ÌÒ&™ßLŒÒ…lÌFËW]k·¦ïe P,›©¶þÎôåô¿³ÕIp­öº»§dëËV¡Ä®x–vµ®«Mf¹¯zš³JÙ “0$}–|ÚßÄÄ‚K èåŒÈ›%¹ÖkÁ´¤{ó³œÎud -Æ]\ëvã+@¾Ù#sœQKµðÂÎÎjõFÍÝÕ<úå«rW)QÐÜ4RžhçÒæXa÷|Ǩtp iŸ-cÁì Þ˜ „m2ï­xƸMЃÚß—€tTy0 k¡ŽICÐZôx$i1 ;ûÛÝ_4t¹QK^ÑsÅù VzÕ–O}âÔ–³õø… <¤'‚ïA…KйßÓg“ͶBæVQ,+3ïéA#•+‡ÅEáèi/úòÞþ×.€ô¿äÖ´Ió²D…!‰‰½¿àFž|î¢uÛ¶îªG1Ê ë¥àì…*°€¾þ|÷G€œ<} endstream endobj 845 0 obj << /Type /Page /Parent 1713 0 R /Resources 849 0 R /Contents 850 0 R /Annots [ 846 0 R 847 0 R 848 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 846 0 obj << /Dest [ 831 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 334 592 364 606 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 847 0 obj << /Dest [ 804 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 116 345 145 359 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 848 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 338 331 373 345 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 849 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 850 0 obj << /Length 3825 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õ >5‰æMe8âÄ^ì&Ø5lÁf&ÕqM‘Z^,+’È?æ!§ªš"g,;~Ȱ†—fwÕ©ªS§^mfÏ6›Pj³Ÿ¡òñâ4õüÔOÔj½ô’ÔÔæ8{ö§6UyËk|ÕæÕìÙwïõÐÎ|Ï÷iM>[ —çÙ~›¹‹È‹õƒ¡¿¡VéR¹ÿØü0[ókµò½u‚S¢ÔK|9„7y/ºZ&²Õ¿C<]„¾»"/Ñ~ª¶õþRu< µq±“n‹Výñ»¹úûÜÅ÷ Þ-½¥.\_燹z.ºš¦äM"U;w±Öê_üˆ±ûìZè{ n6Æ3¶à|>{n亥S ‹­q¤‡KÞåöÑwz½™ªP³p™xQ¨h奩J/Ž|ŒSÕ˜Ù~öjs# °ÄŒÆµOˆÀÊÍ/“0!JŒß*ñ=ü—O€Z^cA—d~žuùÁ´n Õ¹nÜ%øØp[õÇ­‘'vÁ½îå Ðy©®Ô!“€—ÞJ;¾ûù­ã«×Þß~rƒH¿û‹sïº ®Ê³ }4Ê |)Gö7' Úd#oºNÞÛ¾3ªÞcÃD«È‚ãà)ż FÇqì9w…o²ŽÏÌpév#TØ9Õµ ÔµÚ%÷ˆ]ˆêj…Hª=º¶«Ê²>pWVžø™É Ú4¶›ªYÙÃtÞ‰–µÏÅàgol1±åáÊfP.i¤G|ö&¶k¼Ø&™DvRŠžÛ7Ž}“^¿ ä” ‡úN7ð*†ugú!õ© ŠÎˆQ×}CoÚ´¦B]5»8çÀ¤ —ÙÑd•½ìÀ·Ø3`§¦>™¦»¨:ÏûfX[S5†VVª®r3çÅ¥»F¾0H@€¼Ðׄc¬›Æ`½:e)(bqqè#²õNÛàEüm ëÆì<õcÝ1ÌšŒ´+¸cmowÅ~o°{§ö ˆoj¢Ù¶Ùg}ÙqDr˜kGíëùмB’>W7 ­‚¨Ýw4õI†"lWHc”> `x@YÆ!ç SbÁK’a˜+T—¡F’‹:{ÈŠj®ŠNQа Uu§ŽTè;c¿xqªåªXLŒŽ¾’]QW/•=„ ¢b5dŸ•Ó ÕQªU¦Ú~Ûš_{‚¹®Œ÷¤pÔ’‹!ù­‹!`ðuÖ4ÙåñHš`Ìû4â€óÞºÔ[Þý¤>‚ ãke ¹€sîä¬Ë˽{­“T¸Ú[~Ù©óÁTŒŰËd·¢NP_g§`:1åN û}ÉZùÍaÍ[=ùÈSßsD+a7)ôŸðIh×ch×6´bwBvË3b¢ç ¡U’øDÓ1¹2Tib«Ô~Ê`«2᪌¹*UQqâšÒ‘vu-ÙÌД›k]ÙoM¶£ìÁæ÷£­ùljuß/ï æ9ââÕ}¹oí³Î%3Û{wÈÀkž¬¼e:Í“tØ}hß“bHÁ ˆo O5³Hª›.CNÿˆ§è zÒ™çO(Å—NRk”A•A€‰ºZÀ-FBk›HPR-¥Æ‹D£ãc]¡ýÞ§ù˜FH s<-—2éd—m›XÝ4ÒÒµâîÀ_ A¬ûª3ͧèblP„Ž^nìMÖÜ–~ Ó)A…|(s®Õvõ©U¦2ôQ º š »I5céù¶ô&ì! 2äŽ2ŸŠ«^°[µ`<Æä Xzb´ÝA²&ã®Åä„iZnD­ùVEaKÐ0B4å®\ÖS¥ ‹[‰ɑYŠ®Âëlõ¢Áƒ’j$½páß4Š*ç{ýÇ`K%ÃÞT<7Ñ…žo3ÙiõP±9Ž"}EÒŠêò‹ í£d€ÌKÔbkŒ |x˜h¿KQ¢ÇÚK®u4¸ v§Ç¾›qg)¤Y´'(¥ý…l¦îéÁ ôîµψ ðw¸m¶-/Ê)*Y˜ Z ‡v#¢¬äŒ]kÊ=»:Ýtóó[škRýZ>uí5À~ÎÕQŠ6«H rCãä<«±–_4‘Þ–†ELÇl+¯x"äQc„z:sÆšS¿`…„Ô“´¯·Ÿa÷-A•@MzîúzwnÉ1¶ÚöwÀDL‰:Àò–PŠ$ȸÙÛ©®º*äÉ~Ê*Kýéd·¥»É—£hçפÜà`…Z“¼"LøÂšóò³HÝiiûh>8‘¼ˆƒ ARÈ eßÓá5?bU 5vt—J®uzJ¶ÖpÄ®z´¤Ô†ïI¦ARcƒáH¨v¾¨ù uQrog>¹YÈ«“|D ˜kD’óÈú¢ªÙ‰Ñ‡—T›/Љ”¦/Í0õ0ˆh„×]3,çC!T£ÏÃ䦨p¶'7‡Çp̨К1EÁFíŒ K¡ê¢£Yœ>Ɔý—óªém¢÷ü Ê¥D*„]cGN¤~*µ§ö–J7UlG`'ê¿ï›™]¾®ZE ˜aw–™73ïUœåÑ=vc QI™h{N(‘!ûÆÃÀ0 LÔK?u£H¹ ¤M¢²Þ2íÔ¼‰vö «0 ÙK=š]Àþ²OãYaù;ZÜ#• òŠñ‡Íè]Ò(Ô šôkãˆ?$ž:ë"1«Q½vÓQe>º9j€àa<'×ÌrAQ†¢äâ‰Z‰…—ʪ=¯ÚZzú ò ­Øƒ_G¹¡Hbæëzônó Xñµ§+÷•{»ò›H/þ~žÌÉ«ü_åU1¦!q—7bŸå†´N8VQfð¶ö¹JN™g ]8¢šQ%vœƒÇ£ä‘g Š[$•éH$±Ž•¤‚è5T4ÝÞ0  §Ü5b/p¦a¿äåÁo"D„žŽ?ÝëîåòÈv*äRXvu÷›vÙî™)ƒŠÓH]sûÖÑÙÓ¹í<‡å“g%íWhˆ½º‡³C¶“w_”ËQ`XU‚ó;ÔÌÊÇGÄX*…M£…:ë˜zƒ·1ñ’ƒf©õA&µ4ÒE„wÒJ‘l&¾`dPS¹#¨=À˜ñ• :dþ/¥Xo¢Í3Ö੟åg],MP  Í«"`vØ`LÛ`fHÆeð <ê<6È ¢/ WðW¹XISL÷rÍâhEݹŒd”N6§eÿdëg:¦‚{Ò'¾¢YêÚînmÇMœÖùÌCPwCÁ›#žN @y(7´ C˜Å`ŽhÖ•Ì„v7ÇŸ tO°Ç)œÿDäAù´¯Àȟˆw%¬Ë{;ÉՔ꺨rü›÷ǧy!¤ø $°•|{‹ö"J˜:ø¸™–’Ö‡à³áA–!£yC…gf`Øæ>VE’™.’bóÎeZ7s¾V$`œÁQA.‘Lp$üý9©P8iQe0T6Ú)â3ZêßnËê!(7Œ|°÷KßÅ•½${5ü˜›hý*Ž!|SðŦ9bØß»_ra?UsŸä]îÏ{¹aǽ—vüñÛY±HÒîW¬(Å$ƒ˜ãÿµ=»û»u™·ÖL#Kû2-Í.ÿ‹¹ç S¬ µž¿\=e÷í ™MñGÔg[åh™Ê¤‰ÑDê¶+ÄIµ³‰Kµ“«”Å­½‡¨ÅÕ­£Ñ)¦Œ3GX½#|üòöÓçêø–_zì9/Nxž2<…sœå­ã(ޝ©zN–ù 'SF¿0ËN,œ2NŸNë^XÖ^•I\våÖ^…ðz…>áÊ8ÌKŠöÈP}h¬¹Gõ*ƹÿ¡Â‹'Ч1eœ>ÁªDÀµòÉ3ÈCiüW¡=„o¡CÐӯ©c¦§`4eœLTÑCÑúÂçi„&\t6WÒ³Fê&bœo&Ó‹O[ßUÄôh¸vÆŒ ôDJ4‡ÑI–¹p.ŸlæM endstream endobj 851 0 obj << /Type /Page /Parent 1713 0 R /Resources 852 0 R /Contents 853 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 852 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 853 0 obj << /Length 1899 /Filter /FlateDecode >> stream H‰´WínÛ6ýï§àòKlEÔ·‹¶@’¦]·´)wíÖ …lÓ±:Yò$¹^ö {‡½ã~Œ¤HY¤¯˜bë0¬‘|HÝÃËs/yÎg£ÓÙÌCÍV#ì!—þGÿI⸉¡x:Qâúh¶^Ô ZÔ|Œ‹êE1:}qƒÑ]=r×ec£‰|Ü>XoR{â;uGØ_ÏBI„ì_fߦü S»Î4¢QüĉÜ6ÿ€Ç¿ÅžÂ¨ýÔ_ýuâ¹öûNd¹ šß£›û¢YÓ_<‹ØôKVÕèìÅýü·= é{E±Ð ­Ìv­ÅzŒnöYó©rþßJ‹¥=™ZèOþ/'Æ—Ï—æ¹ND_fÏèoœÁ~¿wlßÁVÍ¢–~š†tè£KW·?­ù—.g#Œ24òÂÈñ#ŒüØIa']c ŠŒV£óY— Ó!®šCª]–Êrö©·M2qä:ô>¥㢠vèÆÞœç»{Ú¬MYþ±t¹Ìš¬,Òœ†äáЭU” añТÜlHÑÔ·ö#žƒÓçXèÚ yˆDlçBîéão&{B“m¥u½ÛdÅxkÿ¬2’/ó¬nÚW¶øö‰ï?Qæy¹ïæñ µÜÿħ5„QìÓ$ˆïyoçDèC/ UØÇC7q¼`púp/6ŽŠÙodz!œŠö AL¹µ"tc:°ákIVYA–m^²¢ý[“ßv¤XGzЍôéÇE Oc0…ˆv«…ÙåÕÇo¯_]ŽÛàìõÝõß÷^_]Ÿ¿¼êãÏÏÞunnhàÜè÷Tngo߼àìÝÓÞ}í=ÐØES˜*ìh›oÉŸ#gM&OYùô‚$ØåÄhj˜0» ¯¬Ç۪ܒª¹o3S¤ò䄿ç䩞›Ð *”Öƒ ºå.kùŒ·×ßòC³‘ÂÅQëM%«dËá E­¡Þ0¥;±]ÓÖï›´Ú2|± ŒûËøœæ»>ž|¾ž“Ó# žI9('º&å@ Ì=Lbx ~z£¥ŸžKâlË#A hÄCoáKÒŠž¤î6G]x85hUþþTðûm¿Îë#etŠhÏDyXåyû4hÝÐct9$–01h)šß¦­ÏF²ÅJ“"¹JwyóääžÔ'úF´¿1 ²A912ˆÕ%Òs(æK¤›iŠîC-rVDÛ.ž®ÒÓFW®¤h®HWþe¥/>0Ôªk}±¯_2åÝEЇo4$-z‰vÚ„žI‰¨•ŽG/-,’«(‘Ðêè‹nX!6‰ áàÁ›‚³{Ü5 ‚ÇSSð‹Ë««ãàAbPbSpzÃbÇqà@ì04Åþñúå°çAdÂÒ¿'íSHÛAhʉA 8ÀýK8iì€åдä‰)æn2ípýx&aA ܲÅ_Ìw‚ µ *0ÑRq&w•Ÿ² q,jœM†aξbHŽ®pêEéNûünMÄà;R*mXkÖ8šŒ pTŒIÇ­œ"‹F$‹W޶ûy]ЧåRÞ+šò°B•­o2* 8À6î7ÖÃ5N»h`¾ÉÄ€ \A~¨T<:Û°ë´'K÷Nõɻޘ·]”É l.}Å!Õër_Ëv÷…7ußd–@PN4™%Èë€Yú‰²¦Îä› hR1HÿogòMŽ aÎÞtúPg:¤¯ß™€Ê2y5„à©^ ¨,~mú²ÊòL áÊòf®,øV癜ʉ&£‚y ñ×®,]¹ú’MN Dª8-­.„_„ûêúüåUÿPR®grS 8aï!å¶mé+Ò™\¨¶ï²z m3Ã4ª\K=“åA9Ñd—@N ž~u‰vÝV¨Éj ¬Pÿ+…väŒòÄ&K‚Ù’'seGí ´jØdÕ@PN4¹,XLßv[õ t—S¾Ø47H©Öi²i 8 ¿/ëƒT—¥vCؤÍb-÷â–°Ò„ÓmÜÑž˜Ì!ÐUÌa½%‹l•-RRÖÖ¼ü¬ßì±Éßà@tÅßÝZõ®K‰ˆÞíÚ>k´ÌV+R‘BäñàJ½â±ÉÒ LSqt¢×Ü\^\¿~&¸•Õ¯â"·.7¤cÓîs9ÏrEz·¶ÎÓdë@橸º}– ýÏÉp‹bEööýG|TQ*E“•ûr'×3r]äÀQ&“g{زÉHŠc{]6äèè8”Z%ÀT>lÊê0¾8QMI9,0'Ãÿí·¾A0Œ$Г;R`¹Lx²qUÿHoêÜøŸG¾« endstream endobj 854 0 obj << /Type /Page /Parent 1713 0 R /Resources 856 0 R /Contents 857 0 R /Annots [ 855 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 855 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 455 220 472 234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 856 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 857 0 obj << /Length 2037 /Filter /FlateDecode >> stream H‰ÌWÙŽÛFE^õ…~™"`±¹/mÀK'é ËæLÝl©$1¡H,YÝùüCþ1snUQ¤¨Å0 M²ÖSçž{ëèu6¹Î2¹,[L\9ø‡G$¶“8‹ÓÐŽÇgÙzrý¦MجUcÖΪÉõ—ï\¶l'Ží84f6™v¯»É=ÿgnM};àKAO³$fÖ³¯'©Z!e±c§vñ;rô&jO­Eoa¤—úÍCëÔs¬©ëÛwöðÄÞ=Ur… +ñ¶hÙ«/Ÿ±»ß­iˆï}¡òÂrølõŒ½ÛòÑ”jŸçÕÜš¦œýªþ*`êøêhžcGøÈÞ¢M!Øív¶åÛ.oiWAÛbiliãÕÁéf¦i¥VºÉ&.+ØÄ #Û\æÇv’°Èµƒ€áŒAÂ1YL^g{2|CœC6zªb(³Ÿ&×_¸ãx¹¡oÇÄ$þØN 'ßó¯êµxfM±ÿ¡n~6¯_äú¥nôó(KýVm×¢1ãÔ)éE<Ê&ïN•øP†ËâØÅ“©“ ÎóÑÞ0Ú÷^m ûC'±½àìôtï÷V¡SH'ŸìF NÑ$:5;š“¼1ääe[ë·VÖ˜ë÷¢q˜Ý|óã«ýG, QÎ!œ¥alGÁÚö©Î3 ýhú‡•0X–¢M.‹j9ÂV?ü$fÒD]e…ÒB=Æ„ðê<ƒqïñåóy!‹ºÊ¥(ÅfUWb¨È¶'}„É÷/`:Õy¤0ÀԶŲsCɺ¨ÚU½{qå\é†M#>ˆJ¶¹ÃòÜ °Nužå Ó9¯žLB®7òi¯«S½,D;¨ {§Ìéô嬓^{ªó,ê–%Ãdy¾©[Øä_\™4øÑ5L6b#rùâ*¸ŠÒ Ép²ó4¦®–(&CQͱFè^\uÁ½3%²³›_åÉÎCôî'…>ìeÉŸ_oò&_ )š—t pFäv²ó`;ÄMs8»iE=7Cy £sÕ÷|/U~Ó{¾òŸ™þ‘înï`¨UjÍ>ÓÿZ™ À\ªTœÀK`û>üŠþìŒJ˜Fvì œŠwNÅ µO€ðíÄJÈï<ÿ ‹µøÅl©P‰é±®çâåçìß™…ªãòÛooî¾ÿî†uõ¹Ö£Œ#±ß÷×7&?¢÷õÔ¾´¥ZNƒ,KÆÎ`<„GIÈݸ«q¿©+™(z¬¨>W–&6zƒˆÃw¦ˆ&Æ{ H÷5Nºi¬ÈkËã + çUŠ—ûE ¶©Zºî8nDKÝóWdÜ.eS­: Læ0‰Üž)uã‚fMÊžÖʼ¡ßlÑÔkEÆ>£Ôuãã.¾ãÜ=!9RÛn,m:d­šBUÉ" H*Mq[’Gb?Wõ®²÷ö§Ø7ßm7Ú7o`a”sK-*°ìù¶Z”u®>$ àÅçB]S A5¯-,áñM +·Ê«yYX ' %0>õ‚Ñ|¥Æ.{3&Ê̹NïEŒ­ “bñõ¦ý¨›óRçЇþ Üœ?ÊÞ?ßÍ üãusÓáU´€!‰xÙ í½ô¬ÑÁ޼w¡ß.X+ä32<¤ó;…4’«•·fU-Y»!õßÔ ý=/la3S«s}Ùà U5Ëîn©ôø°TŠCd*ZïX»],ŠÇ÷Ö±ã9]%w’N2×ÕMÿ-HÑ._’lLRX1v_[tþÃÔÄ!Tí3‹Ãj¹EÍxR tå³9šûÞ²áS ËwB0Í”ȶ¤¡ñ{ó+é=Ïêí°8ÀèJª!Dðñ­Í”ÇÆÿ­ÒƒcäÛRmöÖš¦üµj£ùøÂÛö3áÅr«Š™hÁªhÉZjàÏC\£&É—ÉIòÇ…—¬JrÔ ¶Þ¢Ä¡ ‰fC G¼’<^ \îšJdÎYŠˆ9+©"àtÖˆëc?JSo²Éÿ¹Ñ endstream endobj 858 0 obj << /Type /Page /Parent 1713 0 R /Resources 863 0 R /Contents 864 0 R /Annots [ 859 0 R 860 0 R 861 0 R 862 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 859 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 244 604 274 618 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 860 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 235 548 256 562 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 861 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 410 535 432 549 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 862 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 336 94 350 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 863 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 864 0 obj << /Length 2669 /Filter /FlateDecode >> stream H‰´WÉŽGÅ\ù ²€f©ö*6²lšƒÇ°x²4‡j2Ù¬q-²(ŠúÿÃüãü""k!›Vk02hVn‘‘±¼xñÝròr¹ ”¯–›‰(ø‰²Ìõ2/Qé,v“Ì Õ²š¼|}ÈÔêÀ{VçÕÓÍžAŸ~2J£W„ºd}ñpl!CŸp÷„Ïä‚—a’Š8RêNmH—² +A´¹ÊG¯×Aðñʽ7 Ó+EÀ§€|@!$.sè ðh;ÎK¹ô ÚF}Ð[“¯Íþƒ£(5ªÙåv%’|Ê2€q°­,~3œVœb®zÛvXp¸™7b®©jöª:–m±ƒVH-T›?J¬@)ù0F–»þÇ}·­~ |¤04ŽtãdGEPÛ\²_¡ò)š•õ²tiNEý¨ZrغŸÜ[·¿±^g-‚äJÁ¿qY{c«žd#£¯wA‘rG+/ìJÖŸñeE¿ŽCèR€*!ðS/¼¸WK6.Òf/¬É«£|´å¥z0JÆ;Þ%l " @?Ek !R‚íÖÎm<؉j ì+ Æ¡d©Yœê è±BŽÏžW’²¬[.Òl!%€Œ_¿×¬yªEÚ ÅŒUY7¸X©W†Â\æÙ5¡NÜ…_jÃ/Fj€Wmù‰óî2³ˆ\÷* +¤u(°‹ßëG¦ô¤ö ŒB²ÖFCXx£°Ø‚^"Zò~ëL3ødËH+Þ`h¨U^î  ¾>«µÙ(dp,ÌߩВÅxœ¹,xXÄ€L)Î Ý8º*¨ñ \,Ê=äÜ^«Ó¶Xm‰„ÁQfA J+è¥I(â07q©Ö‚&½*-Þ©š2 YGx©ã)ëÇ‹–¹ÅÆÆó§ö)ìÜFÜjO®Û›ÙŠ1¾˜® )¦´Úì› ² Ëád®¯ºuû*ò5 8JR«B5h³šŒý*ø "ФîÉ×=³VEØK ;Ð0·†GÄt©œÑë¹*˜ßñ™^­-åEU~œ·\EÄHn†Y*òüt ’C°e¶Ù¡ìgŸJr¸­xž&GèYâä›Òd6?¾¬1×€ŒC(Uâƒnh¾ƒ/Gà³°ÜÐïÛ<ÉgÜ@g¼¨+‡å™Ì‰:Zíò¶x(Jô¨…3}Àé=0jRLðb×ÁÙ+"7»‚x@`Ö%hLCðÅ+ró-(þl°ßÌÚ¯>VL%$ˆ’õ–Z¦HÑ`ž³¸sÄ9ó¼,›/RÁjמéÐÖ†\¶ IÆ#­n¤—vÒnùÍœO|"é`ȯêt¾ Ç›ÐÅXLíbI/ŠõúšÔ ôE@ˆšëÞâ)iü©iͽz[wÁuÁq×§·LsQEñ<‰Û[R·2¨´.öTí½jK 7Àà|-nŠsÐÉq™5PAðµ%«ªûµÜ•;0‚¿]ãLgZf­Ž‚¥¹§Wó,W+ì #Ûî…î§'Ér¾{Šn4Έ} Óð©ªU6õ£Ù+ q½7‰&aÂqé]ÊÅÙ(Ö‡NÏ·ùâ¢O%t(*,&§˜%’Ü+ ÅÓ-ˆC‡*˜h`)éD’WìÁžâ@èìYBMØŽD·\yE¥Ë2&á] “-!OêÜí×8NúÆ •}­,Ï’‘a+TØÚ­ÐvSÙË,ã«n·P Š'_ç\¤ç–bZ)‹+8 A<Ó‘µƒÍ\N“©ì¸•A×yó4ž˜ƒ€§ûપ( UâƒaÝeÒ÷C= š…ÔÁûº¶RrË.ìFLoFù?ÞJßÇuÉDÊ‘¥ê‹yÁ-‘"š•iÙ‚ñï#x}»ûøË)§Çˆ)”óZD6nzŸò¤ê°3«G…r“PÌŽí×ñ$3¢Bþ æàzpÞÎXjESCw9íÚ„ ½tÀ(ƒD™‘Ÿ™Õ+Û —1%RhˆÊ €–§u,߆ÞÍŽ4øXÒ=J[sÁ’{ܽúí U õ#?ZØ­Ú6'ÖÔ†åh}ê’:£üO2ð]јC&=+ˆF2@‘†¥û꾸W?y®z€Â 2wÄHê` ¡-+œlÏ2÷ŠÎ(–™ß›ëT=lhc‚aÁ!RáAZ<‘î÷«Üމ߅PÂû„_€ç·Ióòh”…jåÝQg•ÉkûÙnQrîþ*„5TÝ‹báH€÷æu{ôê^#‹;Á~ǵŸ«ˆïÝäLþ€&¾ÍSÖ€hEÀˆ•2bÍ$¹Þ'„ÜZÌ·B¬iˆÛŒx5w…wl75fñ>x4ìóñBÉ.å¾.ÍǼn)ÞɵÌÀÞ^Ø{óòÄäâ÷³^ƒ~­ÙM\Kozfh2<ÛdÅ¡•¾®-Ыߕùˆ: ¦R«b£v{# ´Ëåóª¾ËÛ䎢75¯³ @/×pãÇÌËɱK è endstream endobj 865 0 obj << /Type /Page /Parent 1713 0 R /Resources 866 0 R /Contents 867 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 866 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 867 0 obj << /Length 2275 /Filter /FlateDecode >> stream H‰ÜWÛnãÈE^õyjÍn^DŽÌŒ½ÈY3ÄÎ-µdn(R©hµ²ÿÌCNU7/¦¯Y,6Ùת®ªsúôÇÅä|±ÐB‰Åz¢´ð‡QšúA$b6ý$ B±ØNÎ?Õ©XÖ<'õ²œœóU‰M= ü  9ËÉ´ý(• ÷€è1ªF^‚ŠUHp^ãS4ÙFدý"EM%ÈGIÍÏ4Ë|íE€ÂÉ›jµk à‚käŽ'ßyž&ó’lÚ<`ÐCòîMQ•Ú>(9‰”æÅKyuËO…­F#lqÂv¬Üÿ²j|q=uÐí@çKú£:¡ýÛmb²hJ‘Ù–¶MÈwì\wFGT²1+J4ÂÞ¹¯V'јjdnHÃå†NÚm„x”Üâ0ˆ^sâð°Ï°?M°s<»óÐmÝ0ïœ \çöõwO>Í;[ƒ8t)·˜°7»=v!f4å ®J±E)æ;¶àÍÚÒM *` E¦lèĺ*VÔÜšåCVæv|ë‹P-Q0ݬóCÙÎo²¿µ›¾3a»"[®ìÐT۬ɗYáâ{?qUí=ÅÙ³! :ŒÚ†Ë«m”Kf›ÆE¶ô¨3+„]‘»¤+qtßE!²â˜y3Ì;µ1·¼ñ4çÖËÂ-¥ ·p~SÇsæ©£Žµô€©#T¢w‰ TG³E9]]îã†Xçð6åS ×…½NX‘:€Õv ¼%ZÜØ»à‹7‡ õ)ÕzÚØËúDo!%wVÑxŒU³¯Å\W{a~ȶ¸†Ï«!ܱumL}çùO.MK-ñ b z–$}¤Tû®ógó>T}ŽÜÝÒ)+ ®¤òÕrkFÑŽ|®Ý—¨HRœˆ8Ñ•å —ûÇi'5§Ü8®:(eq°‚{,+ˆD·ƒs )¸Ò|àþ·¼ˆÒÍK0ÑåXþÞlò²Ó4¼ù8NS;öqu„³n{ú´áBÎ5‰4þOzbÎCÖߊÛS1v&òF8%2ûßI.ºµµÜ”¶äžs8õƒù8øÌ¬ã¦|œàe¨ÞÚ»bÎ?vŸŽ–Ì>Ïzt›òVi:(GÈ¡)kI XYI<Ã}°E“D>.CŪx2ô Îô¾ø3a+„Ô$2Ä@‘·à#lA/SõTsåÁ#éCwÃÀÞîêÕÚã‘ U}\óýÂ) í(ô2†¤3| ˆŸgJÕ}¥ê¸+%I‡¾™C_úl©W5/¾«@<ÍC†‚§W…¤}êÈîÙ ík‡ä¹GDŒ`® ƒ°Ê^.½ÔuÒ´WBni_nPDd.vÈa4  ²_{”ìóŸYÚÖS{å­ÚcE9¬\[rdçøIúdo%¥öà ÊöØÑ­ÿáQ(X'Ùå=Ã"0±´¿ôC)ÙÆ…UóÏûlafÉíFµãbÒ‘Õ8íå N‹Èß}øzýÝçë/®xÓëÅ$ ý UBϦð£TLùwo&ë·Gã¤À^É£ñ8—G/.cx`;ŠÜ(ôS=]ýÜøÇÅ@$½£c@Ž.d§ª6W7ûj{qyÞwP`áIP“­ :õȇç‡_p!Ä“N·.䥵yÕìæò¼kŽìGd¨·ŒCøÂø#ÒÔj>Dµ²S^ž·mdQÍ_KÊ‹£\vô•‚x~ùíí0¢¿\/Œ#ïÔå*ê‡OР'åV³:O˜.Å%=åLsÚæ'z¸D$° CøñÀÎ_öZL‡ròEi®b0\ô#Í{ɦÜë‘£&(l¢´Ú”èXÓŒ£óËŠu+T\ZÞ«Õ§½xI«gEQk±®{*âœë€‡ë çÕsŠ7׳¥ÿÆRº«ST™s\Ž…¬-àγ°;ÓXvÅCö•:Ùu‡‡ãš¥KDrEÍwÁÙ5eS ‰q­‘hB¾öÆÍmPyn°¦[~W¸+G¼A…ð£CcBÀ×6]Ö¿ÄÁmaÉ>ョê•'ížqoÆGª¡5Xh`O²"åH2â¼ÉQšõÎ@L(¹´ù:_f”ßQÉj¼zZõ5º°Á²ÿúZkH endstream endobj 868 0 obj << /Type /Page /Parent 1713 0 R /Resources 872 0 R /Contents 873 0 R /Annots [ 869 0 R 870 0 R 871 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 869 0 obj << /Dest [ 868 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 262 728 292 742 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 870 0 obj << /Dest [ 868 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 441 688 471 702 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 871 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 160 509 181 523 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 872 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 873 0 obj << /Length 4132 /Filter /FlateDecode >> stream H‰¤WÛnãÈE^õýØ,š÷‹a˜uv°ÙÁŽò’qhªe3àE){œÉ?ä÷aOU5Eê2Àf‚ÁÈìf³».§Nþaµ¸^­å«ÕfáÊÃ?ü‰²Ìõ2/Qi»Iæ…jÕ,®ïûL•=¯ñT_¶‹ëŸ>ûê¹_x®çÑšr±ß_ô§ÂY†n¤Ÿ ý ´Ê=åücõ—EÎ;ä*õÜ<Á)aæ&žÂ¼=ʼnlõß³ËÀs–~è&ÚËÔÓ»úüÞ/˜ ´q°“î«^}øéJýý7gc¼Ã»Øuåxº|¹RŸßªáßfWó&¡.Úµ³Ìµúÿ²aì>»xn‚ÁêϘc ÞÞÞ\'t}ÝÓ©†ŽÅÖ8ÒÅ£ïJ;õÂ;ý¸ZøªR‹ NÜ0ñU˜ºY¦ß"£LíÌb³øauFèc‰w)ÔEV®þ¹¸þx–¯1iœSÞø[ý'YÉbœi²»¬V™ÝÆõ"yÃÁ÷s>ê©[¿Ûuö¸ÀõrZ6åÛ·ù¾Qeצz'ѪØ9‘›i£ûP f­ y§~ýˆ`fú> ‚ëŸùýƒ#)òü£2Má¤ÈtU+²D=êá¥TY´ªjK¼Êt¤‡z¿6Êñ=Ýìë¡ÚÖF–s–lñÒwÉ@ëŒÐ¢'²ú(ô®b°æºÅ®¾zu4^Ãa°åKCž>:®ƒ|iõ×n€«/ã2LJm’Ýv¨:˜' í°eý>îù ä8vTÑ(€w|´sOð«j±QŸ ,Ô¿Äý‹zåã¹ÂR½ëqR謹õf4¹’æOIóÅ}Ú““‘p28–þ÷ÎñY½uè—ü葦L#ò`Œú#7}tÔÐ)™”Õ¦¬6Yÿî ‘Vk3`_»¼êx%!”7ƒ`ÐÉ\Õ>³×Tc IejÃçµîÜËpôìp ¢L¼\91—&–i ‘Á|TÅÅ¿ñ«7ê­ªá:yí³JÖa! Šm.6•©×öíVö†Ï€ha¨†Hæ’(¢“¥äÔm]µ†ß5ø‰ÞÞ¹êa£å—R祓S©8%ÇW´)¢‹Ê(v»âýJJaã€èb ²Þ5Ø÷µÌ%vø Û°Á2ÔïÖw£dùü•¹= é'˜í‘ 9•ò²¼”Œ ›ò#v¨[ÊOS5fxß™´T\8púÞ®ª¼–™¢”uûv8[ýdêî×ë“zZWý‚ ØÞd‡ÊrõGó嵤{[„ Ö+Nˆ¸|5ÇœŸ"þíX»|èÄÎhDAzèD¥´£“F° |7MÉN,%†ÿNêrÔ»MxQzÊþùœýƒ)«ÁûSóþOGþO'þç·L9©¾§ƒ„sÚ²[wkª‰T¯]µâuT±±dmiukª¤}mA=öÊa¨·v$JÇŽç'dMùŒÄ“¶k—>ß?<¨ò¥Øå`v=•8—`ò¹Êa9±e?¼×fÆ™ ^k‡P¦ñáY>q¸ÿ|®V6c~$‰‰Ü0ÌR%ñÉã? …I.‰ óž&”ŒÎS¤™× ""à¦òø‰™è¹KõêÄÜsg8)šï§Ûò¾ PL7,ŽR}ØÖ¢)qÓd†¦)¾ÍÁ-UgQšD ˆP"UmîÀ·ëb F˜S‰Q‰*\ßÙ²õÒ äátØ…„soºÜl‹¡zªêjxç´B2¾¨Wä@ò5õñÀõZÑÉâÏT<%mñ¸ä–!D⥮üEx-*‡¨.žœÛ÷Ñ›oGOÜ8d`LÀú‰‚O Á°,P쥔o0•Á ý™ê<æ¾óÆJ²çF=´cŒâ1FWÒ!»ÌË]¼x–÷J½™Q\!ÙØb7c7\«uµ3åPCB>µêÖ®,†I¶ùNblé•Ýzü;oØÄ³UB<9‹3[nЖߊj%µ—õ/`ÿB÷+áÅYBµaæê¬~b7ÍçØ8Ôêˆô§ý ÚNÕ]ûlv¸`¿F®‰n×f}’{ø?'â`j¯M¾ HCéì2pðpÞƒÂtÖ„’Ik%Ҹ籒ÐEÿž€Á­ê†Œâ džƒÍŸä¡oå!á'ƒ6}¦[Õ‡Å9¥ð“ƒØ¦pÊ'¤‚ ’8¼Læð9Ó&UÈ¿12-¿…`ôÙœhâD~G7 Æ.~ƒ~7zÃL²Ã]qô«©ˆÖuCÂ–óš “kÁË%Gžôã0Š’?†â,]ü&ŸÙ1ŒÃ ÆálHâ™zôÁÊVÒÊÉÊ Â#’ ‚ ǶÞH‡[0ˆ¤ªL¸— ç²-:Cè ÎêÏËçG'Œ—OŒ—‹ ºíG‘nÐß!xU!cùýùªéQ܈‚÷ü kOFXÜþdå6‡•vr!‡r1`kÁ 03!¿>õêµíL†ÌN¤\LÓv·Ÿ_׫Weuê Ž‚lHclõWðÁvñ/v7¹Þ§¿â:ñuü¨[!Ŭ,f^e¯Ñ%R!ÍÍ›PÍÄ3üV;c( IJùé5#iï¡`€ÜS°r+ÎèC‡%ÿx2¸Ùí•~#•,êqÓ 9y³'ëaqÙë®8_z&&?ã½&P¢8u¬Q§ŒÚ0êQ§|„1§MÌ©ÿË—KBž´‰k%ÐÐŽ”Æ q‰á¦I/û…ÞéÅ2P0ù@j†Nj(ËÉ”…¿tLû*WÛ8h•ÉõÀ%u+•Í­¶ö Î )í É3Dä„bÚhA˜ë‚«j)=ºÂ{€$¾w8¢°Sïeæ æCz$NÇátIÔüÕ²ÞmZ£÷‘–Á&»S\¶"œ5\ÒJX‡ŠS×Hç+†rZQjÿ-hß"à c¬Ö$¶~ÑR¯€4õÅèXîmõCri¦âVÜÆº<—£ýýžÓP´þA¯ƒ¦- ëíJ5ˆôË$s(èˆÙ©.X ©L|ê¦È¶,®èNñM6NF?FÆ=òRŠ·Ãf•o1Û°ñá›Ý¾©¶“A8ïÃ&d½™»¦;~K¹)Wô8¯B»‰ÒnFÚÚÍìC:ÎÅØE|(äC–‘³†‘³F¸³ÿ #;H W.–é»Dh]b9m±œ:XŽ,G.–…Fǽ=hÆ™óc–åÒÙ>PœÁ9rØì Èá(ŒïÀYüLK ð–â[—›²1C Þ‰yšHŸ71äû}@ &¡Þwר¦ª}1%XI½U³å/©À,Þ¢¼¡l®”¬ŒÒ¬œ+c1™ñÿQξ‡JÔŒ$+M ³“7=á½Æ¯ðÞ¦§§jþô­!W´ø”ˆ4íû» l MiÂRÿe0öí˜^xóui›¶|ÖÖ«õ^^éÔ†-¿¬ÕŒy:)ÍÓ yJË×™fUÙnõZÖÏJÍü¿Cú˜Ë|Mùé÷!jÊ­ð9C1£)•t Þ Ò¥z¥Ì‰aùtÝ7(=Ü'MÂøBÎd]s²Gú\ä‹b?ò~ÝÖ…*ÿú™Ú?ö½æ7÷^Š=J}ñ’£“aCŽôëÍB-g]—ÕêA2'­U\Å¢]¾ÞÖR©ú®+öåNÖ¨ÇE–åJËÉvbïÎ.èÎ.ÐØ7ù÷ÂüRz%þ÷ÁP²¦9ÎùºLT—“à”ùD1HñG§¼E^ç³üìá‘7-°ófGu >N¢E˜oø€r[yKš-ްÙßÂßÔq¦+ ÊwkC•«‘-”NæîqHê½,”* Ͷ‹Sëeo2‘g£íoŒ6Ê*ý®¡,çÁaW\nmyìæ©ÿYc Õ±è ts¿S˜ ™¸´ÑÙÙÀÚÙ/ž0NB.2MóKYe£ä™œ©í®Ý I T½Ú.z³ürÁMèë•H™4M±nëïhK­µ1…q¨–CäÄ00M¿âÔWj?ê¶B¡]È#àÞ[µ²\ºM¥€|½¯×RËf†ïÛ×u)P–3õ^lüö\iîbÛËj¾¡sQ:ªiQ@híûo%öpœ?{vâ0P9PüY?xÏõfýàíëåƒk•†wx+óæ*påkâϘA$h¾=Võmdx±Õ –Ö{ŸP‡£8é[£A`4éÙxX€m,R‡BâÍ+0Л°“¶ OwÚüñÒþC)8i›=Z3|‡Ô¼QjZ¯ nÈÚ›Aö¨¹õJ †þª’:ìªãfhK€¹,Å®›Œm²fÅ^šTƒëRÀì-‘´…ö¨]¾Õ¡ ¯MðÚUq¥5)…{÷øÛOù‹ ™ endstream endobj 874 0 obj << /Type /Page /Parent 1714 0 R /Resources 880 0 R /Contents 881 0 R /Annots [ 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 875 0 obj << /Dest [ 1046 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 98 590 139 604 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 876 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 468 404 490 418 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 877 0 obj << /Dest [ 792 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 452 167 473 181 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 878 0 obj << /Dest [ 858 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 160 154 181 168 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 879 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 272 154 294 168 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 880 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 881 0 obj << /Length 3079 /Filter /FlateDecode >> stream H‰ÄWÛnãÈE^õ =5‹Ã;)Ã00ëÙYÌ;zÊ8”زH¤"Ròz?$ÿÌCNU5/¢'ž§I`À"›ÝÕu;§ª~ZÍÞ­VòÕj;óåá?Q–¹^æ%*]Æn’y¡ZfïšLmÞã©fSÍÞýòÅWOÍÌs=ölf‹îñyöUÿ%w¡é'C¿VK_9[ý:[²„¥J=w™à–0sO.aË¢§8Qÿ °º`5x~~vÐõuC·º¢q¥‹GÖmìÒŽ%ý¼šùªT³ NÜ0ñU˜ºY¦ß"£LÌl;ûiÕ;#ô±Å»öÆàj<-W§€E6`‘ëEعa˜¥J^;§¦qì¦ÁÈ«^Üyµ ôŽ RwEÞæíËÑÜߪ‚—`!Yµ-«²-ëJÕ¼ºulT¹Âk¬é¯·0¾q$țIÕ+,)¹ÅüN/_Ôz¨«6/+S¨²ºe了ks5qÓ.>”0"BŽ÷¶4Nâfú~ªÑ‚Ï’¾!ßd½o2«D^©(":ÄßÓ!ëpnœ1÷7rj¸4èx逘TŽ)g‘ľ§?mÕ:o ¡ÔóË&?sUŸÔ6-õ…‚ëM¾7HbvP~šßª»‹³Äº95Ywõµ¹ìç ¿™éæONLÑv ¸Ù!ø ÀÄ*ÁKj~(¦(ON„+éÂñû¡.ÈÞ»ÖRÍ S­|.«'úz1ò*߀MÜ[W¯vv€ì]&:†¤#ËZ&¢cÐë˜@ÃÖüÞ’fXs|dAy ’³k2M_Hƒ5˜ìzÔw{dá!?Þ+¹´vHžìArŽy[’÷C½i¾àu¹/Û"Ú)(AVGšà¸þZŸÙu`J0Œ|3J~wõy_¨µQ‡ú`´5 xG¦Oõ¶Ü›{UnÕ±–ÍôŸho1U-è M¯÷æÑéøä dø ñU¿'NÐÛS 5¡^}MÐðqÉÛÐðý!ßãºÊæfÈqRcŠMÂzSßFƒo#ñíj¨´ù!æÜˆ“ ƒ|Xçª#¸×‚¦UàÞ®ÔZ–¸V!¿NfkN¦Ú@JÓŸoÚúdTÞ09˜ªUÛút€œW^&cãÁîX”|¤œC„QsòÒ*š?:®z•FßôÂpÁa¾Í°Ä#]\¡æäæ¹(_jΘ¡¤bl`Ç\å(CßF•>«\–Œ²¿Dî™þǹ¼z/nmÔ?Ú ³rA:ÑûOœcmÉB鳉ѳ®ûZF_æ×i‰3¾|‘î€Ù‹SèZØ*%ÝkçÏ•8ÆC³) Ö!3@Ì4a¡§ ÛábNü¢Õ¹*@(Ï»r³ãqK¬sË‘¹e›Ìž ¬Z³ÿdA.âÇ~­’×6 ZËE§ÖAñ9W}E׬?k$ÅtOð‘ ø°=”ù=?÷€‰H?P)÷Q7 " [ÍŒI×/uA…‡ËX. 8?GQf4$ ’ú턈mù¤ˆŽw’PŽ5 ’RÜ@µpÞ"DS( ø– Ñ ã-—-»„!û#‰G¦9¦5ø¤Þ:h!SI–m½ß×ϨS<Ãމ±ÍÔ' Óº‰¥HÒ‘¡¯ë æ ¦t G®¤‘x@MD‚¸êÏuK¬ žÃ'»Šx#]4Õ¥|ßÔä¡ÛBêÛš¾RæèŽå»\õ'íÈ«¾ÍվϠ"3G)f$ Î”-×yzÌÕgþLmA¢?ÿ¼àýÁ ð&k¿Éü!½‚àÏç¼&8 ŒhJ !>–·ÎÚÕφ:ZG%á£/{~!¶Žô&—ï·s6Â8Q|}ux5ß¿.ÄdðPÇ|[ÇLtÞ—ì’G#r%¸ð–ä…ª\}lËCùG·™ìB7fÔöË‘¿Xâ ˜ø` î)™ŒRý$ûþ+zt"{Âíél¡ý•Ì7ã†{˜8ƒpHc'¥êG´¤À›@í …¤Ï"MÌ´—‡|ïpï"ÅØé:4ÄLmGcšþo*›ÏSˆîrÿJHè&S7-ºÇo"øÉTæTnÔçO€Æ‡O¿f’Œ.û€û¥ñ˜QRCS¾hiÊ”õ‚Z¸~„Ú¯zsF#t°ÍOc cŽÎ¨ª[ò-è¡‚ò²Q©"±>ýÿjƒÇ)£©ožJˆ—#:ý!Qf¨wL½£;*"‘ Ç'ZóŽŽrÞ"›%›Îå!9Ðʃ}¬-a)÷ît– @ìVqj€*JFÝù¡ÁT€‚Ê58Oª‘ õ™q±/ø­£åˆ$]÷þÒDŒ{ˆ¾+¦ñCˆV"“ˆ³Èh q¨“Þ2}/å" ‡§šM5£v;Çïoó»f.Ñ(÷™gê<ˆ—Ù6Ê¥„G§ÐõI½óú[27ˆGÀÉàdr 7ò¹äº |Ò—ÑØ÷hG)cÐ DýhÓ?"³ÅkþÒõ £Øô-6í¨x5ü¡¾.…ÖCÍsàr˜‰÷Iiy•ÜWv×2.™Ñcfô©f[³;n#8ô¥ÔǦÉz¯Šò›cª°Žg ©ÈÚM»¹™ ]TöÆP‡–ëܪ—ú ÷„x_ï¹RŠZõ &RS®c 5À”,ÕSÃì Á&Ï­ Döµ]ñ•oì´ÈʸÐP1ËúäZºßãFÉfƒ@@G$ïP_JQ²‹ûÂupùÝ9ŽbB¥7·#wôGª#}ón8RwL6~h‡Ú í»=öæ~@µe:Ð6„Yªä5õÜe†ø !&;ŒImŒ˜…=N“Á Û¾ (BiIS@‹€¤„[uä'òäRóW9JYž!»Zèñøq_6-™-Þv£WE¾gën“òÁ"@ÿ½ƒ®$Òm{*9”ŠÕˆ[æÛð›5Bs} ÄwZqiœTVïŠ=¿ƒu>ÊšS_FVÕÐÇëù “Œ‚I š1³4¶ë‹©Þâ(‘Wl±ÅÈéAÓñ/Õ÷ëÁ÷ukDùHzF¸!$põž4qQËÅK&:Nð>ŽpÚ#áù\ËYMDî,h2šÒ¹9É>ËáŽUð:ˆ£Þ†=aboèh=ÛÑr“ÖæOÔŸ[O¦,Å6@Câq³;E8ŒØÖ¤,Q%Õû¾×kú°pLý>Í3Å\åU¡æˆ\L¼J‹{| Åi®^M0¢jÜ£Á&E‘SÅG]›Óo i¨jm‡@šœÛ²š\Hgl;jO‚9‰¢z9\:ñmn7Ùþum×ÉMueYuìâoz?x£ ­¸àì¸N¡åÞ¸Ž0èÔá<®U¶8e/MXÔºÐìAÅ u¢Ê1‘Õ²Œ×£-I—²¶rö/ˆ,WIÙTrñ$ž»ëPD'ìA+‰ê‡mSþÃxì& ÃÐ;_8õ”¦%IÓ©p˜Äpã4iì´iqØçól'Y’± }±Ä~ö &ã™Ê–®»8è•ÉjßPé3+Á°¹Ó18…ìY‹‘Õë‰WŠÐÂ[nC,ÅAçÌ%Ë"=ÿ!‡È”Ssøyûº|rƒ±ÍK|JtIÇóKÂ$‡ÒðiaNë†ò°ãNôÞwù™¾oöìõp\yˆKßýÀYŒ;þ½žWÏQëj °Ý·ô5Uó'pŠkpœÉ­Ëøëq6z1½Õ–fo§;å´ÌÞf¢¦†~¶G?›Úø‡23»TÄØG÷tà,|/‡÷'•èHÚd‡ª?´Ž˜ 6ÏÐèᢾ ¼Ø¢³ð\óñÚX<ÙÁ½QþןËrVFƒ©uÊÕÒYè«—QÑôO0Ę€©Bl¿4­Àwsùº endstream endobj 882 0 obj << /Type /Page /Parent 1714 0 R /Resources 883 0 R /Contents 884 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 883 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 884 0 obj << /Length 2117 /Filter /FlateDecode >> stream H‰ÔWÛnã8}÷W~¢€˜)êÖp LgÓƒL ´Xìô>(6kaË¥Äùù‡ýÇ}ت"%ÙŽèì`bJ%VVÖåãb4],“l±IÅBøƒe"Ì„¥y,’,ŒØb7šÞÕ[ÖôMÈêe5šþøU²ÇzŠ0Äo–£I»<Ž~á-‚I$44ø«8Ë þ¹øi”“†œ¥¡È°e" ­R H®âĪú·‚·‰„‡{xe__«fo7hâuY³~¼aÿøO0‰áù²Xļ B¾Üܰ¯Ç²ùÕ¶¤$âEµ &9g¿ÑFǧ£©P$ð°ø ¼#ÇãQ‘¼F«Í‚j0)`Âé–îÕ†4Ý/F’•l¤âDD‰dQ*²Œ%RhÍàŒ:c3Z>.:gD> Ͻѻ:DÊÅ¿FÓOò2^.rdç"Rvï/|¶*š¢y}° WÅÎÜŽ«}cÆöÅCQߎó½Ï[àYÁ—,M%ü2{ù]iœtR­4ÐçT‡™PÚ»ýqg›¢CB ôåæA1øº÷˜ ä2 ×Ëžkç­ui¶«mY7ÎeÓ7î‰c<ö Ü#RxãŸaTêæPVs Íôi[”Õlzò‰p‚E+¡¯@{ÈLĪEòbu¹¯œUÊlzþêˆÊDv ‰Gîjäu›mY™]ñtŸÛñ׿}üéþnñ–¼póUÖJ. 摟+™"$—ðuë“êy‡P깜M»õ…B)®qcXì1žÂ¢ HYmL±2‡ùºØÖf6ížÏ$˜Á¯Â'÷@H´I ¡Øn÷G³{j^çÍá0œ¼¸@‘j4à‚O>L‡$Æ[SG‡K“I(²+ç{ F‰ÈÕUþ-îÿþ–|‰NÁعÇùŠà\’/ô’/‰È“~ó¹Ç|˜c]úôƒú‰º¼÷ȇ!Äy_]/ýÂë­ßù0â Ê{òýâ\a¡÷šôÉÏL¶åùÇá®´mã8:·Ø–h±ÐîkMiiEYÊìc·QöiÜvªiÛh†±m󠕃ÂdØ®¶Åoþ½Ü‡.-_±ýŸ¶¦¢VÅÁ"æî[ÛGžÌ‡^gºk8„l1H án_5PîÍŠ•Õj.SÞ©uNIàb¸öûå®õVVE×ù±‡šRèuA¨©ØÈ±yÄÔ"ôÛñË’pFì—Wã9œ’–¬ÕdÕ€¾âR‡“€’ fÔ£.ðÐ d­i«olæ—nšÐ@&#<” NÖ'sž)*¶´Þ±Ž‰ßq FµJ\€1’]ƒTN"Æ *>ÄêÐÉ„ÐY¥?àÀ¡y-ÑÃscj|”1JðÍ;‰ƒ¼ÚW†¸|ናÆ?ì!ÐFÙÎQg±¨)ü@'»bÍž­ÌÈÄš`’Ä LJâxê¨æ0á Õ:Þ%œ-Øç†¼~ØoÉé0hÍ6û#Cz µ²jÌáé`0 ƒU;NõÇ@—õ€¥üh*sm ÒDÁîÿÆ Xhà¶loá c1ß7ù1Å„)r‰ÏÕŒ•K±7¦J.vyÙK[pˆ -»=€M ›cÞ`ƒáÑ¢>G ¹ô,–*‡¶,|¿XF®Xž §7l—0–EXNÇŶZ~ùüåžQê“…ÐQŒ}€Ð2ì«€ìÑw%ÖÂ[a´×í´òÕUÙ—TV ¡ ¼¥(‚Šr…««PUwe@5 RE !´W+úCŠŸÅ¬»ÎB[èv¬M¯æ5˜hˆ`¥_VØ¢Ua…–p±_œÀú¼†ú!Å ““ê 4kö“úIü9Jæ@@¸M€±4.ŠXBí’ò¼xv’¶¢ÂýŽx`CÁ¾ÀWŸé–âêÞr¢'xÁ¨9‚»Ä@V:ÖªÚ“}”t—™c ¶ ÂLÍ7®ùr4c°Kã™ æà·Ý”ÚrÉ€–Dȱ-q¡-qüFýC½Ù?oWPOm ±¯¶¯l ÕÊåsÝìwt²z ^ÏÞ6n]2AL÷Pë Ê±ýœœ°­K‰òƒ#Ä'é.½ˆQµÒçVOîg0äűJÂE|Å7cû œhðñ¶sÄœt÷•Ô9N$ž¡Æ/ÅÊIý•gû;âÞ¶š²RaªoË“Ìízë°ÙôDr>sÊX›øÇ\ŸÜYØtíÔåì¸0›ž¿º€¢ "^A2,’'"WP èo)ƒDy:ì×Ð!™Ür<}Cœ0EJvÆ’Ëàzäg`²ÌV1ЩºM»¤p~ø>V>¶x…HT+ôótxóu©³›“›½<õˆÿ;÷4ì endstream endobj 885 0 obj << /Type /Page /Parent 1714 0 R /Resources 888 0 R /Contents 889 0 R /Annots [ 886 0 R 887 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 886 0 obj << /Dest [ 885 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 429 598 459 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 887 0 obj << /Dest [ 885 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 485 279 515 293 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 888 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 889 0 obj << /Length 2398 /Filter /FlateDecode >> stream H‰ÌW]oÛØ}ׯ¸È H4¿IŽ$›.¶hºE#4‹Æ} ¨+‹ŠTÉ++ÎÙÿÐÿ؇ž™¹¤dű“b± Èü¸œ;wæÌ™3/瓳ùZ³¥×óI *5 “Ô‹Ò@E™—ç* ¼8V8cœ«NOV“—ó1Q€%þýhBíSDàåüWJXl{~Œ±Ey¦ävj–$^EÏlT±ŠÏ¿/vsC]~ª¶[½\T ß/ SðÅ• Ÿ õº)µ>[V=þ»’ U¿ÕeUÔ6v^E¡ša¹d9Ù5ä]eòÝl;Ý÷z©`½49¢üÊ}‹òùº²TÞ£HÔ‚)‰ÁyÐ@ P—;‹ÝÈé‘Vj­Ë%“(3/"8vX.b݉ÃËvkªMõÉ6¹{ö8jmö­Ôîµ€Yf1ËÅžŽ—qfÁn…¬ÈïsW]ÈÅ NÌíVo d½§~–/û,»W+Sî7bzÙZ’èŒ> ,‘`1´há­n–ví)ø% Ɉ+ ®^w·ºc¬”u¥CÀßm·mgXÈKã;Õ‚gŽï±(åNF7sŒëK4¯ˆ½ßÁ1ÅG†¬º=B ·Â/æ(]J}_®õF{2¯è~èËC1ñ!¨lê1dáqûyW5KÝ›vQÕZÙÎç¦(?BæÏläð°žjŸw9’ܶʤ÷Ã=›``B=CÙרâ‡9è½{é³3´ËÙƶgªÜõ¦Ý0¦§Coé46ÕŒ|#õkMŒ¸ªn§{[ð)˜hd‚^íu]Oäo_x’y´ÐžýÑœ ^zß2BÅaD#ÙÑuÀct4B%PH±ŒPÒ”©£Kò¥_¨W-¯_ÊÔ"ø°’ÝašJrž¦ßâàÞˆ#ZÌ#ÚAßIñçÉ(Ê2 §ßá@}QòQø{DŸC¼Ùm =ßóοfù#Ç Ó~û cÄIrôfkîxSœN>ÉÒc™XYqIrL.·"Kô ÒIT‚zX´ÖjPÔÙ PåüÊò±\¯ÿyÓŠ"ù)¦Ÿüzª‚çP_Þj#7#+LyÊÃAj——…‡™18 ¶„ÏŸ“V÷Ke?¹ý%ç‚ñh$cgJ58JVÔ²b^»“'à„ýJ‘â&c Xz"fºb‰AZ?æ…ÙÙÝE#ò¢á:¦±r‰ZÓZ1­º$cñãÚ=ˆ½¯¡î0F'©;‹2>¢îT‰¸”áe[ ­ñ0q^ÔS»F7¼¦l—š/–äC*—²ÀÏhÒD’tCh‹ä{$Ýð; ÝôI7ú=I7HÕc忢mk ;·E½£‘‡dñWt€?”~£ÿŸ~E GòÕ é@ü{M_Â㔋£G¤ðO++ÆI‡®j°0nzmX¢u;}¤D E°-H;5âY‚†,ÖuS”ZŠéÁ`f º€la°v·p7YõÁ§–VOÑ©Š#I]êzj“˜$ØXQ¾ágÆ¥ÜÓL÷wŠNäüéþ;*Ì1JhYSÕ¬qe=›BšË5=ÛÀ–GbKBƒ™OËüÇŸ1ãlH1ëÕª*«‘PNðç%&à’'@]˜lDËéPg½V^t&ƒ„ä7<ë¡û-ˆÍÊzwx1S"éñ~‡ññÓêɾ$RžãÖéÔphÎ Lñyƒ…RÆXß½üSÍOŒ¿)zR †éЦ_AùôkûÁëùäê¯Ì endstream endobj 890 0 obj << /Type /Page /Parent 1714 0 R /Resources 896 0 R /Contents 897 0 R /Annots [ 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 891 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 374 220 403 234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 892 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 142 207 150 221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 893 0 obj << /Dest [ 910 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 278 207 313 221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 894 0 obj << /Dest [ 917 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 426 207 462 221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 895 0 obj << /Dest [ 922 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 166 193 202 207 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 896 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 897 0 obj << /Length 2272 /Filter /FlateDecode >> stream H‰ÔWÛnÛÊ}×W ÎK‡€Åð&Š INäÀNj¥§hÒ‡5’¦¡HBYv>¤ÿÐìC×Þ3ÔÅVííC‹ əٗµokÞN¯¦ÓDÄbºĉˆð?YQ„Qåb<…y¥bº¼z×¢ìxO$º²¼úp‹e7ˆÂ(¢=å`Ø?î_ä¯*¦a&—š~)&™þ:ýe0a 1ŽÂI-iæ‘S–EO£Ü‰úG‚¯Ã$ †qæ2*ÄìAÜ>Ôv…/‰Ô$ÉÎtâ͇ ñ—ÃÞ7X…#i‚H–« q»3ö»ÞT,$•ªžÉç¿l»Ï®%Q˜ãeú3¾±»Ý. Ò0–iÕ¤¢¡2ÄcïJÿiÅ’ÞO±0bŒò0Íc‘ŽÃ¢yf™€Y!6z°¼îÁHcl‰NÑ8@"°rú·£0õøó(Äÿ€QÒHOd>c¥ !<•7×¢¬Œ®­X4ñ›©çÍ®7ÍÌTZtÛ¶m6VÌL­6¢UÛñ>½V¦ä®TÖªrµ†„N˜Z@tà0aáv>)~Rm[™2ÈÃRLS¿º~7íp­»N-õOâ«„„¯(·mÖÂ>´úB VÂqŒC+Ä:—z£a’fÍZ·°»lê…YöæwX2š±ì‚‘ª;61íMtH‘mr§«*dˆQ™¯‰,Œ2 …iZŒ…{íqÏ'q˜Ǹï7Š»Ð? ÇB*Åå¶6e3×s~UV]]<ŽäåÌ,u=7Šj¤ëÕkñ9@:%üƧàŸ[¶@=“@ö¶ëwo`ž…£äÈÀ¸·Ï›÷®©­2µž#Н=Z{±¾-äÈ-_ „×xØy9W6È`¥ÿA¬‚ ~¯h+ž8dQ'³E_ä›;e‚Í¢R³€ª³ P+R¿~Þš3 ¶6Ë•uƒÖBAl“Pí®Í(HX…üËeU‰Î"µÔf.ÚM3ß–¶û÷6sÊ8UÅ>Ì…ÇQÕ”„¥ƒqôŒñho8=’ŒYÓTrîTµ¥TG[{@wu °0Oµž†èÙaÄŽ>rï¨ÕFç’uï>Ùð1 €HÙÉQSm ƒ¶C¾¹xJém/¨%H¾•KpNêÄBêJ¡Æ3ª$:&4]tbTY.m@ç½ô^‹·Ü²`÷ÜkE+¿ñs¶8¦Ò­QkAÏ͇MÖ™±¢\yEªžk™ñ¡èb_tNw£r‰Þí^”W¾ò‹p éýyŠ=¿'m…,ÄneÊ9‘;Ïéü+$×%Ÿ›œ¼º¶'2&:þÖK±À†X6ØK¯„ç?^ób(úö yì_‰vÌH”G(‘¬Ø?[êçÆÙ™ø—ê$¼ìÃgÎÅ—"x–xËOäH,—â=uÿZ4÷¹$ârÓXÿ±©”O%ÿ‡ sñ†—nYŠ“(\9ÁÀ‡$§ ùÆ}Lr“ë£3ÖVúɤtm/Û·½Ìy¿7ÃØð”Z*›v}ûV, 8XNÔ ÊR²#<lrÖ–O¥é®,Íqr¥±Vß´lêêA¸g†ÙàßÜßÞòóŸ ž1å 1FÅ”¿Rá$û?¦Ë|¦sBÞ²Öž%íurx×~ó7ˆÔÖٸ핣œ­‡Ýð<ê>©#j4¡b9TüäEǽ¥ h(kbL‘ª.üw¿}m†]íÆhKl ¤h ¿pûDe¾iñ©ùfÔïü—?ÝÜ~@¸ˆÓÝÞÜzyN^]îƒôƒ,(ûŒ²ct(“T€¿ A/MmlWnLk¯^ã úˆžDÄk rÒtÌ =jÄù0ýD»V—fáΔ‚eñ²%ÞÑ3`šŽ CG‡Îîú?Wå½}4èž2¨ŒîÑÿ ƒJÿ ê1gõÍ©÷ëi0§òâNo:D¢s÷sú?$G,#=B¨+©…Œäc+“­ý!‚6ÙÛ0ñ÷Î7áÃN’IgLþ-zZ¹s&“ègžTÒ…ESÏG¸ÆÈÿSâætôO;ÒæêÎ>¢PÉ£B;âQé3stʃÊq¢SâäiŠWnDA©ç0~§¾×å–HNS—¼ßÍÀæ)âNýÕ“°÷á땞ŒO>êg¨ëñhAsÑ‹ç>ëç¨WSjsg@LüÐ>%˜–X"õ¡pÄÑræ#çæâ™ë .5Û6ØFP¥^ù];·<¿ ¨ZàaŸ”HÇPøqpÂ+º• rèžéDÛt¡«å(ÔµètG¥OªÎÒÀ§Qì!sã0rõq{,¬‹¬Z]Q^qÍ3†¸Ÿ}Ž1ª²«f»\QFìLU!CÑàC Iöí5ñ®¯›Í•uFæäd¶v¯]ˆ¾½¿›E?Þ$}7ö}×1SŸ|A‚CðíbOˆ´•Bàêv¹„i<×e¥Ü~ÍAg*ÞO@EŒÁŽ8ó¥'P {±¨—ýù­ûÊ]€Ür:ܪhÝoSú³î¯“H€ƒì­ ù³ 5>$ÔØùK¶6[»lŽ£•ñõá’ß5G$ Iu‹ŽW]ˆKv,¡DܫւiÙ„Rýra*F-3v0óŸu^&6¿æ‡Xå‡áÈCR¸èe¯Ÿ¾A?WÙeë IÜJµ[u :\Éógİqìúß×  ¹»Uî„~þ¼#àljD%¸0q¢œ»«œÉ˵v_ú¸3l±Ï þƒÊø`2éeʤ*YÝûéà_n?Ï7 endstream endobj 898 0 obj << /Type /Page /Parent 1714 0 R /Resources 902 0 R /Contents 903 0 R /Annots [ 899 0 R 900 0 R 901 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 899 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 256 517 283 531 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 900 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 515 333 523 347 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 901 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 437 319 452 333 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 902 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 903 0 obj << /Length 2932 /Filter /FlateDecode >> stream H‰ÔWÛnãF}×W4üÔ,¯50 83ž`N6ˆ,Ñ>´©¶ÄX"’Eùý‡ýÇ}ØSUMQ–íñ Xìf1‹—fuuÕ©S§¾™ÞL§‘ Õô~F*À?ü$YæY0RãIê² VÓõàÍ»&SyÃkÕäåàÍ··¡Z4ƒÀZ“†ÝånðIÿ`¼aì'zaé7Òj’*ïïÓ¿ &la¢Æ?a—8óGlÂ"¶EWéHLý3ÂÓaxÃ0öG:ÈÔÝ^ÝîËv‰'‘¶,é¦hÔÕ·çêçyÃ÷5Þ¥~ª /Ðùò\ÝîŠöw[¯ØH¬M9÷†­þÁÙ1>>- ün¦ïñŒ=Øív¾û¡nhWKÛÂ4¶ôqàt¹{´dK×ÓA¨ 5ˆÒ‘Bý,S£ÐO…3&™ªíà~ðÍôŒ8Ä’àq4úPx9ý…–¸„%~`AâÇq6VrÛuœ¦þ8:ŠjvQí¿'/CŽÔEQæÕº(MÎ(x8m±á»öò\]TÛvQÞØë§ËÚË·êݶiñ:ÑÕZmŽ_Û¡‹¯ŸÄq¤ð, Â1EW<˜uE1òÇ™â©|~17­—À;÷³ßX;êK»eúÔÁ!›¢xD¹=ú¤¯>›Â‹¯•¹ó›+!ÒöíËÞ û¢;NiQª~$øÇú¯ê³­›¢*U•«ýËîĽ½ì`/s!2¥Ê%L¡ô bñQ„l“êºð†‰Þ´¯„D|˜|˜ˆ•Û¼¾Ø û[ë XâÌè•t¡¤”ˆ±9“R¬[GN-²Æ¦_ØàkŽŽNyEñ†¥¶.î¶-ŠÛ= ±Ñ+2 tY•¶+î/ĦÃË{{o¶«V‚½–‘£ò“ÇØ œÂ1¥-OÎN&tœ@¶ièB:õF8ïkœžn¬’_ä?ÂOú˜û„y¥Œ<µÊþfsÄm®î¹Œ*6$/•†ùj¯Pm†K_ý²-jkŒ|׺•jnójN<žVŽÖ(»c½àúK3-”7tÌ߀õÀ‰ºÊZHÐ.gžbð¤ºô¨ æäP«îì}UÞcmcÊ–Gž0}z\B…0^Ì=nloä@ TÃ9aÛg6Íqö±Î«Z,WlÜ–Ççè³ÕwåÐ1„xôƉâ2B\†DŽBr¦bMÄ÷´<£´Œ8-mIôg¨|.}õ$†¯€(íÝJ{E ¢L@9qg°17rœ_1€R,"_6+“[ŠE¾•—­£ ¿[9V‚_ò‡,Ô†ìT¹ÛÕ¿³`„Xï¬-!ÂV÷¥Y1PcíìÙÕüÉù‡=ˆŽ1´*€“ÚnjÛØR’=Ñ-(šr›0œBÀ‰\†¸É¿»QónQ÷‹xûêûªÅÁ<æ—%Ô½ö˜rÚ%¤PÑ·ÈÐC„5éQ7ËŽX¬¬pð sIèƒÑ_„}Þä«ÇÑ/Ö›•]ãh\bw¦ñRâ"®o #Ôhv‡QoÖ >ÊB¬7sr^PÀÎÿHçD×D IJ²N^ ÓñÝ9’—‘Loå‰åˆð¥ê~‘àÖQs¢_´N†õ•Ý*yiwò[´V¾ÌÝ=ŠRÑ.ÆÅy»0òeËBÑwVHM´™?K7Ï”)ööŒ\ÍIMÒ¦£cZÖV²Â^RÁ \Œ¨›°ŠÈ‚™çÐð5ê1³=R½ÔÔc@Ÿ°.î‹…“ÄaQ-±ÇfCŠp¤I?ò^^ ß8j{Ë •´ù!PC¼“±òbù¾>Ȕѓ„Aü¸Í;;GH$Pq¿ª“%3úªÄøÏ¥£ÿ”Jìg‘ÃX‚6áImÛm]Râîªjea÷³Ym_ÖFñÿƒnŒþ7º1þoéÆèå–ß×hß:¤°ôߊvIDÖ€wåæœZx‹RêXÄ“AMYV$²úþ‰ŠÜ9ªi12š’¾jˆý@}c¨¦gä‡lØŸ ªHƒmi`"y_}¨j(TC/ΞZ›‡NÒa(¥ ¢MQ“‚0`97æn =ªjS.¬Z¡ÞÇ¢ùb½.Z¦fúŽ<ôø¸«ê¶mž*)J_¯F胣h¯sVhpÞl6Ôƺr¿…ôòMI )&;cû‰´—X»ÇéPîi%:Ùão¾¸~½•פÆÇº¢dhæ>¶ÖEQ¯UÏÊÕ°Ñ]U;n['`bàÿ‘Ñ„O…½»sM\,^T.E,@ F”ªÌ¹[Aôtã†,Ù‹2w÷VîåFþŠÙªôÕGN¿_Ö4<˜Ò¬öN­:/)PàúÃX³q“‘4¬m÷Æùø• ÙæKeu;½â&ééû«éõLÏ<À Ô ¯¿ß=a8Ü~üùúæãwiºÁjYIæ’Ä‹àzéø[M៮Uqÿ|ªŸ&‹EÍiо˜žõãAÐËÍjõê$Y€´éŒ’kŒ]¼É*¥Ø}`æsîùœֳ .þÒ¬Ž3\æ’Ç•yäÝË3ÔÞž€cjÄ€GI›$ãÎUAý3Xt˜»„xøpÖÜñ½ ‚Øä‰ügéÝËnš>‘â–¡5tC‚Ô¤ïºé"á\%#BÑ@í Jý,>IòSâj—•#áõ¥ù ·— Jò[B‹P¨SG5jçhÈJN|äÉ!·²Úv¾mùÓõÌ#Éi_Ä®ÚèÌ<Œ@"I&2pƧ­’wµýu[Ô.‘NÓrõ‘èlð:6hê§|б/ͺÈÏeMÖº[èE1'†©%ï±â>u_£í##7œÑŸÎ0Ç> ê, ¤ãÅÚ©¢}ƒ"„Ç–!žog½ø Ó®íOÔ611é3}]oQÆ‘^¹^‡3}Ébù‹¡BçLäøÂ(©èþåF¨T.d4µl×Ètt²ð™,Þ}E{´~`‹8$ãï•l€áR¾È]¼ã§LžØÜ…欗ÒÏv¸ƒ(ãŠ0ÂL?NB-7]^q qŠ*-¯¨­¢ Q-…–ÊÏÖ#IwÁ`âþêA12)•ÆŽQñ”–ç²'Š`@£Uaæ»:LP‡nÿ¼’ $»÷Ðmâj«æçÏ—ÑS1-9$͵v‹¸~¢6j¹]P‡EP'ºžÖ†H‰½·µ¥Ë™ÞNz/ªòªñšKoDºš¼§‚¤ õÔ½ š<Š˜ÿ’äHöžÎF zµBM"s¹Å¸t@ÒMÚñÇPL=JxÔƒ=J{ív‡8s+!h7À™Åf'Ñ4@1¥ÓcÇ~¸4sä‹å$%Íza¢óz1?‘òDŸÑѸpª¾?ifda],–-ÁaÄ9T¿na?Óà|ÕTkd¡®r*|H^¢¢ùS[]¸®hÀ èY®Íeç×pÑÉ{áëP( ž{š¨y!½íÃÕÍíõ¿/›a ï=…KJ‚$Ø àÊzbJÂpçõ÷^§`4Æ-C™ÿùºO»£Ý Ó#KÅî&ËÁ…¦1Ãi¨È<¿B Œ³–H$„¾²ŠªêÞ½Q@ñcÆ'Öe”U&Vòjí¼Zæ ` ¶ãN{–“ª8ÕêÚºA‚UçT«W+¡Oúh;R¼2•éX›z`¢ ´QFr­˜¡AéZû£ …ˉ–(„°¬E”OÂBþïÃcÂÀ¤«iùàÿW:ÐNÇäµsØÉÎÖ”:ðáB‰+}ÔlgûH’OD—ʼnáŠ4·Í ë˹ endstream endobj 904 0 obj << /Type /Page /Parent 1714 0 R /Resources 908 0 R /Contents 909 0 R /Annots [ 905 0 R 906 0 R 907 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 905 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 311 650 352 664 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 906 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 208 637 223 651 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 907 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 323 557 365 571 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 908 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 909 0 obj << /Length 2928 /Filter /FlateDecode >> stream H‰”WÛrÛÈ}çWŒ÷a ¨!Ü/¶ä*Ù‚&²âˆpª²¦+C»  sål~#ÿÌCº{ Ðn¹,è™éÛéî3ï¢Ùi™Ì`Ñff˜L‡ðcû¾¦ûºË¼ÀÑ\_·Xô0;}_ú,)iÎÊ$›~X쾜隮ãšd6¯÷³/ʧX[š­Üsü5¸LýýyÐ ót-pA‹åk®.”Ð&…OŽ+Žú¯ _禮ΠKsÝgwÏlùœU[øb*\…“”2-ÙŇöÓÿÔ¹ïÈÍQRUW’í [îÓê;/vtˆ¥ÄÙZ ûý%ÃÈ}rÍÔ5^¢KøFì÷{Mµ4C)Q+Gµp4¨ÔàQïùiK'…ÑÌ`)›™Ž«Y®Á,Oó}æšm3ðÑöYÁg›Ù»¨ †eÀ½C¨uŒXýÜJS?ÏÕ5øO[ÄÍ V ý˜ÿ_øm9Ûä»]¾O³{¶yÊ’*ͳ’Ågñ·8ÝÅw;5Ð|…³4cà1[Ç• BàÔ¹ á­žU´@ôáÝSX’gÿµby¶{~]í°dLa"àθ£E¶S‹f'`á2Œ®TÌãâ: oÕ@¹@=Žr­ºô0å(+–˜b€êïy¡ÚZO •¥yºob¼LÝd`À ÌŠŒ1ŦðÆ»]7À&ääh…QlX©¯¥+²„5†€v ìâ†]å„W)ØÙ&ÝU¼H³´*Z>BÈ7Š–àÄcõVc‹ð”u¡êš!ÕP¹8‡ÐJÚùÎa©!íqjsÒ⹋èç P>‡'ïZ€Ö*Iü$^¹ü jÀI^¬å‡\Z978½•uTj7èÃGÔ+ñ—KC©TÄS.2ÇÙGH>J¡øK3”5X&–åªzŸî·„ͳ |`.TEÊÐA?¯km2#x-Œ˜¶Ôd˜28YÑÀª§*’ºC˜Æ\”©èªßñ#¶>!Û‰¯Rø bIÕo•:Çþ'A銀‹{±Y~-YY+†ÖP´wÏ‘_¥H—xO©¯BŠ ß#˜!6Ežˆr]YkYkx,‚o+”*ö‰$ð®$QO¿†£Ë¬ìÒ‡´bk¾¡Yã+O» "–(Êô;gbAÉ—w¸œ”[Ê pzûmšlY"%øÆò»z!:Že*õ{j®²†& ‚q„g·šžÙ…?/§Ùex¥¢"‚Ÿ¯ ¼AvI(]rl0Eñö‘P¼ËšŽÍVu…pMÂõÆJ=a¢ rìО,Æwè¥øÌ3Ö©®ŠÁ„Ü2ð ôt—®ÄG\¤Â­g´.½zYµ”–?Öæežf¯Têeµ? ,›ãO;IûXô?Äau‚5…ï–R‹¡ò¢4EÂ*,†‚‹ù|s±\Jñ‡›Pì»ü=…nšM󤑃•Œ öpÂà¸Y|T}x[`U»4jpîdÔ°@ïU„15ƒÑÉ£#ršé·‰Aq8î TØC{^>Ùc²VXIÝŠ’íb1{ð#¾±˜e|/¤˜CiòRNZñ‡º9?G{:G¯5š'.p!#&u$1´H».q`:~©ˆth¶H¢“‡ÆÂË:ÿÆ‹"]sêM.Í'@–?>+eŸó}4eÂ"¾ÄDÈ‘ùÝó\8w¶‰M”úÐðµ øíÖð5÷Ib‹SkÎñøçzãW„Ã"`vf§ˆÇ¼~ÄMë€òK‰™rZS…¯åC,ØÑÝŽK毓MI‚{IMäzs<ÅÂt ûêê±Ý!B×眇©¯ËÁ¶ÈX¼^§ØNˆB€öËY™¡.d‹–`uYAòSI›2š¼M«#¾J©Ý•¹ ®ÐmE^=îD)ï0·O½HKûÍÛ=pÙç°[m$+j9½ÕlZôY•ìåÔba}¾Pjgb“`+àLP@”â-‚®.ôYÅ€±0¸« í›Ü#fM€@;7’¼´Öcøœ¨øg÷ü8J /Ÿ× 8¯á\žB UÃQÄ7Æ¿ñ¬*EgD/ª|Ëו’âr¸_ˆÔ=,¹9¡‡UŸfP÷1ûö>Þñl éœ:.–nkãš! ä½ÄQø[˜9ˆã±Ü¿‹\¢\áÚkSÿ¥ß÷+;€!Ùfÿt?UÚü=)RˆùÙ«/ï//¢‹/x(\}KCþèè6ü2ºöµ./J·‘Ú0 ÜŽÜÑ}hD£Û_7º-¼ç’0èo<Ámµ À1@>îú¢œž<%Ùòäñ‰¦ß=¿çkñTåâWÄ’uœØ ¤°cá°tÂHèÜzmäâ& ?Àµ’”ß„áå]3ßô-ðabÔJ€Ü›=†Åõfœ=nÿ°xÜ׈ò‹!í$`]ÜFÑ9”øUyšËeáÍeOXÈã’išÖާOågP:îžã¶òsH‰ÐÞWíš“‰)‡û–6h·ý†d}Q^]¾ûÓÅÍåu¸üë§hyÇ?Šß:ø’»§J<çÙî¹ìËwò½*ùN~[ç0bEÂr¹q Øñz©\–<©àÀž×Ž=‰¨añ”×z R«.<^‡?EÿýöÛB¤|¥¾é¥¬â¢Ž‰ÄtnéL›P}çlw MƒÒq4Yf M@ì˜.®¯W-lÙËäCêQ’g‚½”uƒÃa){Îâ‡4V#A€W©¾ƒ–?‰Ùañ‘‹¦ ¬Œ|„¡pÀlíB•>ð“?Ò &â —ëòÈj}sÃâñÄn r·aôùöæ¸ w’òG§†iNáhPzdn3ûq›Ä‘òõëÛ³Ó£©ßö¶aO&yX\oÖÝÉX‹G·³‰uMW¦© \»&b7,MµåÛc÷ÜaÂeÚZ>»q½Ù7§b7"7ÞýœoPâé1.˺»"Óò¦øÌ°tÂÀŸ‘ñ<¿º¸^†oz)u')̈x\­c4ºohzk´I™¼ Ô¤CVr\þR¾Ø®Öéfà ؞6óc ïýð:“|kD<î©M|Ë–ð½zWÊ_7—çç?„o¢jfð¯#[¦¨Ñ°t|N[V›ÕA[Eìuq #ìùh ãTJ³ÞŒ+c,?‚¬=ɳFÄž˜þ|¶ñ7i@ÜŒ¢§žðÚÖ¸aKeË+¾–ØihXC«žyÕÀSÏ-k’Hˆ§ÜÒ[XÕ8L\-sŠå Kõžæ‘^£MsVÊeDîì¼ÅÓZäµgŠ1ÉGFÄÆè>¢³(™A½^dLr‰ñ±FÓ È Ü&ìp»¥@$í@¼=ïPÚ:Àf{¡Ð§8ðtÂ,ßïde¥ÜÞþóê6ü[C™»× ¹"ľÒYP³îZü¶ç yÔõÄ &ùLjx<©Ð&© òåNBM’°ŒˆG[®é™M>‚þÝÓçMñ“aé¸6÷ÀOÚè aˆwuÓ›$(#âÿ^.I‚0½’†@•ûñzƒ™­Ü§ãCHš›'E€¤«Û— úgÞF —üÍ}U5s»ÿþ¬s»òöëʾ:`‚&ÊÁà€,]ÒEŠÈÙt-µ.®s;Zª†>ÉÁ „ ÒY‚R£Z®d[Ûc Ðß8Øoâò6ö°äalêï6&sØd´S´ vC]½Ù$:3ÍÑß;=¿2rø4¦Bù¸æTñR¹½¼ƒŸ½GaQ&µÒ`;[ƒ«ó endstream endobj 910 0 obj << /Type /Page /Parent 1714 0 R /Resources 915 0 R /Contents 916 0 R /Annots [ 911 0 R 912 0 R 913 0 R 914 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 911 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 307 517 343 531 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 912 0 obj << /Dest [ 1042 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 187 170 201 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 913 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 173 170 187 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 914 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 486 89 522 103 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 915 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 916 0 obj << /Length 3646 /Filter /FlateDecode >> stream H‰ŒWÛnÛH}×W4ü²Ý€È°ygÈØÞY’qk±Ø÷¢Z³©!)+ž™Ø܇­KS”deÄÉf³ºúTSÕ?Í&¯f3_h1[N´/<ø—0M]/õb‘d‘§^ f›É«ë.EGs<ÑõäÕÏZ¬º‰çzÎ)&Îp»Ÿ|–sån(W¯¾Y"Ô¿g¿L2²‰Äs³V R7öx2à“-¼‹b6õ_FßSŽÜXz©˜?‹‡çº_È/K²+;ñîç©ø×ÿ”Ás ï"7’¥òd±žŠ‡}ÙÿnÚŠŒ2¯Êɤøƒ~É1Ú>mÍ÷Üf70Fì÷{W®–®jpY0 KºpëÁî ;´&K·³‰¥˜øQì±A⦩ˆµ†ö¦¢5“åä§ÙŒ@Ãïj/g_0`¡ Xèz!LÝ HÁ¨I¹‰„*€fQõ,ªàwäj­RØ–x³m›Ât]Ù›MWÐñ+·ýÛ×âz×õ*Ñf#¶Ç¯ù«z%–Mkatà ð¾õtbA’ÃçµËºh6e †2¹´¨üb Ødzž•‡y™ë§G;ÓÃÆ4Û¾nê>/k³eýšÂ“Œfm²Çn23.!üù›EÞ«Bj/Ï[£`EùVÁjé 2›­9M}–ïžòRù€Q•Ïæ\¥1óúÛÞ8#™Ž¹TÖâã'Lë@Þ‹'ÓveSw¢©«ço»ŒöÆÐ§¢¼ÃÄEßAÈ‹ÆFhCvE ™yÜïÚã?ošÊ€Ý§¼Ú™!U/ƒÄv²ƒW{õÀ&Ñ1óµWN `±{ñ÷Ü G÷B6¶ ù doe¨‡8’i¥5$,ð#Ðéø(3ÞaÀRß–ó]o:|Ô䡆…¾ã!¥˜¬›úG°2èÆ,ó]Õ3éŸ,áŒk w{\MØ0á’gûó;cañN“˜iå ·¸ÿÙ$Ö,É%P]à8f¾š Yˆ¹Y"‘3Ù€(‡²5R²‰.Àˆ˜ÿ(ûu溩èú¦%Ò ´ ãFóyÞ™G5ù Óã.—ž|Ù›6O¦îwy%|Ãn™Y+Lªoæ­+hkð‡‹n«¼0¢oD¹ÙVf„Íéz(y‹[\çOe³kÝ9#ÿ!ŠèÎ# J»b-r¾-àCårP¾˜¢Gx ÃÃÈK@Ö²W(‹¨ô]Ã3D¹ªí-~¸ÛRÆN!ôL_¸J,Aw0¨;׃-?`è#þ…R +Ö+WüUa¡=ùîŠç0 4´¸ºt H:±Ï‘€h¤¦´ùŽ/ÂÐB8á`Aų“`§›¼­«›^ìxÐ,8#Ê£iÆ, Nǯ¶°-M±Oe^ÑÅ!Ižó+QràbX_(̸'Ñq`…Ùäeå‘é‡x–Œ†Ë3…2³VZÒÖB†)d˜RÉ"I´Z‚ÔÖ¬ëfO©K±Ý—U%`_šÓ 2éÅ:%6Ä¿4Pa…ÝÔÎŽÁZ6UÕì)'YÅrWÎÅp¿ÔÞžÊÓ#èODB~£ÍcK?Q#Nk«ïzÉÎ#Kµe)ä÷~]ó‘ŠsÎÙ«|±¸29UÜU]µ9Š ´»¾¼šŠ«âÛ©Loaûk÷EO¢c7¦¢dg1g/>Ýþr{­°Sša?`;ùc ^(àßjÀ÷bBg ”ŒQxÖc­¬÷?Ô ïìsÑ,Ìyb‡ñ7lýXb=°Ÿ&‡ÄŽ)ccLëøÔ £·ÃÃhg®PãlVc΃ºÏ UVìh´°Xñmеƒ\ ¡yÄdK††_äåPtÖ¤ÇIGeK0|,ª¥´ƒÀõãcÉ€A–p?犬MmaÓ‡DÍŽ`ËΖ¥mxíÚ!¯]\;8êW‡î<Ël#°zfT;b®H¶~¹ÿ;eVHMƒ/§V Â{ͤ&XŸŒ5AUHËŠ^X{uÅž­Ù‘/üº€s ·} ÔÉÚ€“É\¦ÐÓä¼ÏŠvWöôÂÅEäœÎÂà5–m gÚ‚ï>þ-ì«—L ÝĉJËù¡].öbç ø=ƒ ËÃ?•ƒ÷ë5¾òåýGÔ£ˆ‹ 9 dà1E"k=J#¢OpÃs4 *¢OI_}yR8ТÖÔ…h¶gå,X‘>õ/۞ݫY±¤Ö¨!‹8‹+úoíG`³çêñÈ:8%ñéÃà§PÁàÿÕ•wHµ³(Ùí4´ÐÕ‚dòê{ˆã—ÁxL ¬‘®eh©û)a  Áï M¿¿‡ßëwïïnèZ‰Zò¨èr~zÂM=ž:t0¢Ï*²ƒÖ­%“¬1$W`!!ˆ¿”®ØþB³ª¦€ãÊøÈ…y¹oòä4Ólb³#·³÷˜L©¼‡ÍñÝVoöÖp éÛov5)Ì÷@¸ƒ0;n>Jr±\  ÷1ÀÊðÒW?$÷žíc¼ ú˜Ówh-öò|ääâµ#´º‘Ìn\ñ«m8q,¶é´g»¦FU1¿íÊvhÊôL¼OôÐQAoúdÚgÁÍÓ–{¦¢Ì±øØ†Š)Ä. šø;?îðä2›fQ.Ÿ‡öÚFù†kXer:¶l rbt‡;>Òñð3/¬ý¢AwŽ´œJH‡·{Ö˜”ž–0g¸µDB héDU*¬Ÿ!ЈtóÓí‡ûÙíÝ u)2/ç AŽÎ[Wg¸=èWkYŠ0Ûöu¤“a×#uh^k6˜wÔò {ü ì!/=éÐ{x;ÔUÝ¡Üoþœ2$?RÆOΚxîw%;ö‚3aäzé¥Ï¾Ë™c·Ñ†þ&iž2ÀÊ¥c¢0£Â3¢0?€pá¹:]I4_k¸l³ø–NtOö¡}¶eµÛÚ‘‚/%G1gmªøIØ—9hsgçwSÑíìø6@•¿é°xƇoªÒ~P÷¸çÑ-ÔJ˜Ë…°ï¾âš@‹ö U©—M»¡ûž”‹"$5$MjÛ©ƒ£ 8LOt¶Ð¦øˆ¸™ n¡²B"Ù®©ZØ&Jló~ý¨„ÙÌÍÛUhØþšÿ3^u-QôÝ_1ìS²t¥mÚh¡¢­,ˆ‚ È‚/Ód¬aÓ¤$©¥ÿ~ï¹÷¦iÜêî‹u&óqgæÜsÎå›Å w,âÎþ–‹YuWµ‹$CÕiåbVR.üªv Ž›ÇÞfÎ)wÿó&ZDO׬˜Ñ졽_”Ö• >§TŸ%ÒpDûAE†1ýH2‚CÐò‹Œ•¬ß÷¤íp²À[í?Ö —ÍÇåÄ™ › 3Ý£W§˜‚=˜ôìm†ùk–Ƶ©=d´Ýjïƒÿ“톾Y!©–è}“¾Üí\©FuœOŽœê± ÂF…vi.,_¥Ô/÷ð®¿?ø‚;ãâL$•ŸkêPi&  û³Ç€lnúŸllž˜¢ Dþ¦œ@‰;âðÄae+èØfõÉD4¦yr6¦9ä[¤JGñÓxVܸ|åxhYî ‹´ßïCƒ)©è‘*ÀkètL¼êáR([§²BVìäŸ}뎇ѼäJ*€ý•¡‰NŒß©l’ÊXX§k÷UÔêdh©âdsZÀC¹’ñE_¯„u@0êÓcQ‰²Ü›«Õ à ¼ˆ’tN© ‚¢Ö¬D7=¡#ô®#7òîè‰FÈV4Pp€[¦‰•Žš ÇÊ’•ÏH.J—æi]Åeº©9zçN¿bk9$ÖáàÅÿÔw9Ù ”TŸ?>‰s½ÅóÑÀ¶ÚÂùÀcú‚Τý‘S§Š§ ÿoÃ9>ÎyQÆ®2¶Íl÷îr“¾»¥ƒ2æEîÎM\;›W"¦¤£5ã›S!.֚פîái+FànDTøZkát‘éÕú³DCo½×ÜyAÕxØT'd u‚›ÓvÈN0_4#Ñ5jý¾ô'ç#O•£÷¤Ój3Ç\Ú›Ì!Ï}?kyñ@‘8â;# ³têK>Û¦,èV+Ò-B)bÈ¡°Y{†ÒUE¶åò“Ç&ÛÒ}¡J­k FG²tË&A*ž¶"€fÒ´ž+#ïaq T“×waSP¯à㇙GÞïÞLDk>öD•Ú¡k`–™›ð*›Ìrá;SP1Ç˧WÂaÉÇuO•¾³Š|´±ìj¬vììž;˜ê}.2;ƒáiii œƒd Ù(¿‚Nm Û<7Ô©Uø«ü Â#;£«4šD &7tØìŠnÏêz¦îqj5N2M¨dLLBÀ´ìTÏx™ÛٽϤI‹|EÏRŒ*£†°Õí’›aé\Û߈ɨjË[µ3A¤GŽé•©­žEgÜ|œV endstream endobj 917 0 obj << /Type /Page /Parent 1714 0 R /Resources 920 0 R /Contents 921 0 R /Annots [ 918 0 R 919 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 918 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 220 419 244 433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 919 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 157 379 193 393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 920 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 921 0 obj << /Length 3251 /Filter /FlateDecode >> stream H‰¬WÛnÜÈ}Ÿ¯h詘4ïÁ0 •´†ƒÄ¬Ù‰•ŠìÑp—"µ$G#ùCòùÇ<äTus87­; !»ÙÝÕU§Núi>{=ŸûÂóÅÌó…‹?ü„i긩‹$‹œ8u1¿Ÿ½>ïSQôü+ú¢™½~w퉻~æ:®Kß3{|\Ï>˫ܲ'”wŠ~})²TXÿœÿy–ñ™H\'‹qJ:±«á |Þ‹ž¢Xoõo£¶ïZ¶8±tSqû,®Ÿ›a‰_* ;ɾêÅÙ»Wâÿ±ìïæ"'’•åÊbùJ\¯«á‹êjÞ$ySZv&Å¿ø?Æ×ç«ù®ãe~1¶`½^;Vàx²§S‹­q¤ƒG·+ÌÐ’wºœÏ"V "/-ÏÃH)ªÅäÞ²U´Œ/”×ÊËg¡žlƒjr‹¿‰e2eª1°ê‚PޏúDè˜óëéIÂüöЩGrOá`³FY°a%|¨ת®1BÊÀÕÄ'[’ŒlÑ©ÎÆ˜{oÙ1ÀðNcâÃGà5D€/éÇ—¿\]œÑ¡œS~ûã8Ywº‡ÞÌ Â ½žAoà§½âœÜÁíJÿˆÎ 2EW%E A¡0´JOå4¤V-ù?”À þ›Õ€È-"q×´fŸRƒ˜7!$_þv°|3@¾³Ò ÂXéoA˜”,¥™ÉZ8'ÐÆ'áŠÃÉ„ÓxnÆ Ôõ Otj‚;›ý@“€ . üó9Œ8rB*Íú•þ¥¤8†8ÍB`œÂ· ÜžtÎЉq: ñØsbzTT c_¿‘¡’v{´ˆ‰=:â=Ûô0ºüåÊ åÅÙœ¿¾Ô©Ä.ܲvãs/Üä=’¹÷ùo”^H¡VÅ:ÓnÂLÛÔÏt)3AÙÌžà%‘#š2¦€ÐÔ˜s³i«ŠÕ@i¡ d((È Ÿx{äjrð49”SÚ…¦J„ŽKÉ:AFÒ¯cÁˆÆÄߪ½n8Ö^× GD&€ŠH¿A”•¾àw*±²zço™§OÅ9ˆºã3­ ôŠ?׋«¾mö¹á°”EiDd²Ì ó´]çm3äUGUÍ)áDŠ=ÄìÍ›2,âóóü ¬ ¿o©H¦ò€¼x«] xº¸ž=æ•E´Qç·)‹š©A¾l=I¦mÅT_}"r äGñ¨ºžà¡õ¢9þ´_ºÙ/5.N í&í¡è£{éEÞÆÎ,ûîky“HÝ Bu›¢#A°L)—ŒæàŽÐâÉ÷ÞÑv·dÜèUÜÑ>vIÛO?›Ðþ?^õ(ºé¦¢­KÕ™Ëí ÌÿPø&Òv i¿bÄgÒ¶ˆE3„ ÕújFÍGùm:ßéRIè·+P)¨6†Ä´©Î)S¡3'ÝOºhsM ›v<ÄÈËßšvÝ8{Ê}MôNÙf'£R® N:Ê`õ"M~ÇñW˜îˆ;´ÔŒÔ†ØáñÖTÉQwž†oá/Þ¢Ð3¢*ì4t<† ‰W-$ú 9²iõ ¾©öB-òU=h'¤_#3ƒ¢ÐÅih¦Ø§täÞýÜ r<½% >Ë9ôz¡öV½îc8u©«{ê€ ®~ÕL­׭jÕ;âÜ”AÍôÇÞØ í†¼Ž*(w"ޱV¬— ¨{æN¤÷ùP,¡PgSˆ¿uãpÑ¡k¹ÝP¢—éPZHAõu»èg‹WÞ0'H, ¶ÑöQytÈaÅJ³1™# ²X³z^`Á"/¨ºdªkõ ë·aÝjXk[iZKi™¼+92‡–ˆ$»=/t¿¤´Œ£5Ü0éWnA°ËÞÁâÑl¦G(ãù³u5,Ùs–Y÷tÀ½îñ¼ßbC±ÏOî6Y{œÝ~>((îaAùV>÷÷ÅšFã d¾(áõÖi± ¥žŠ´’ˆ´G£øÓp+ÂG“`Ròþ|s"õŠZ¤F:à²åçà"ö<ÿ ç‹ ì „çDÜ %Ì<´le[7ibQée"‡¶‚¬ª)‘üý)`| $Ò¬Áêdú tßEÑ5 ºsÌqpO*À[+`ÔDRKu4¥ÒÅØwèù[–¢Bëe×4UÔã^@–§æR˱\Ãx¼±pÐéaöïdâIþ(Œ7`ðã±W¤'-'Ž{*ïø7“8לý‘êš'ÿjÙÔP\YÔ?œÑK ?i‰wI?žü™§ÞÓT<ŽýŲ©¼ =yMÔéSç’l±ýXÛ’l”s„Mhò˜Ï=n'‘•ºI åBÔê7PÙ°$¶ r\"S Ðì¿T¢&LH5bð…Ù äȾ԰¸×(À¦~´‹„Mjy™ÓÔöhçFL0ÝoöfQhêJÏoÅ¢íx‚Çõèåè}ORšD4eg$ÍŽGu´1 ƒHÜÒNXœ€Ü†}Ï;i°ÕòŒíœ—Ä£Ž~Q@G? À¨ãçy­šÒ|Þn›úybè½:íÆ“ßã =“ÕeNéjôLä7£dtþØV¥Q˜_¨ ÑÓK]#a‹ª|oV­+ÄïN5ªÃþ¢\iaÿ¡¼95?Õt2î·>¨æºPoZÿLE· Ñ¿=ÕR;”âàÚL¯:÷öFük§ô|ó_«d7aˆÞù ¸q)Ä!j©D‰[X*0ê.)‹Š€R­Tõç;^€ÄÌ„ ±yæ1~³ØèM_SJ“VÜ͉4á¢Õ`4`E·Éé&KÛúÜ/ ËÛ¨œQÏõd¤pßã‘æ7à³o˜E#ƒ2ùmãO¢ *¦S”Éí@: ÞpU9ÚB˜;}Á_8Œ6㔇|t¯Â›ŠŠ ëôÓ®åÁNfòJ™!N•EõÕjU³œïôó·BÈ‹¹Þ™3Ö›iù­Ýiµõ¦7 ½ê„õ÷`ˆ!ybÁ3 ž~«;޹ÞÄb$šCQïÇ%˜i-Q@ó@0‚Gà§xÀijß ýh z¯Í!îðn¬fSû¬YèÑ$Œ á×òíKÝu6¿z»_¨zhÞIŽæüf‹Ùª–M0 ÅˆaA¥ªaCIâÕh8p4jÿgûöiEcXÖ7 +¡òíbŠ–%=õÇõÆd²dk²ÙÍ’+u§ÓKY´¯¥UË‘8‚Ä&ñÝ2£îi¹¹EÿG âÁ5+7GðF°r|„ÕÑhmõ9Û/’ƒ‰“ì[Éûj³:šXË>w‰›^ÉŽwy]µ9‹7ËÉÃy×±Qó»\l“Ãú”»ï£ÍÀÉIÃD ¯Y_uZó”õ7&=ÅŸJдœm½P¶àRDt?”WƒtßÅóQã7L§F¥dMqô_€Ù(§ endstream endobj 922 0 obj << /Type /Page /Parent 1714 0 R /Resources 925 0 R /Contents 926 0 R /Annots [ 923 0 R 924 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 923 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 478 343 492 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 924 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 157 356 193 370 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 925 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 926 0 obj << /Length 3164 /Filter /FlateDecode >> stream H‰¬WÛnÉ}çW4òÔ˜ãé¹×0 Ë´ÖW^Ht‰é‡Ù"'¹äȲä7òùÇ<äTuÏ…CJÚ bO_ªªërêôÛéèåtê %¦·#å ø ÓÔõR/I¹qêbº½<ß§b¾ç=žØÏ«ÑË‹k%–û‘çzí™ÆÍð~ôEþœ;ãÀ åRÓ¯/E– çëôO£Œ%d"ñÜ,†– ucÏ(a>Ë¢QQÿö1;ö=g¬7–^*nÄõCU¯0ãKí@’Ü{qvñBüõ?Î8Â÷k‘ÉÂñä|õB\ßõ?ô®d!Ì«…3ΤøÿgÃøú|5ßsc|LßaŽ-¸¿¿wÀUrOZ5©…h¨t1ôp»¹Z±¤Ét¤D!F~»A¬D¸i*b冡ÀÃTìôèvôvÚ:#PØâz£sµG•Ó¿^¾WÃx©0v#òdÃk¡9,ßM'Ÿ.?þe&¯&Ϧþ<9»þ<=ŸÉéÙÕÅdê¾›^c493ç †Íi€¸+‘$ ¿‚íìYûìj·«¡"súë‘—º~øèñg–[Ý^„»³xxøä2Ü|ÊYaúœu5y?¹š\žOúþ¸+JÜ8lÕL:µxhP໊ âΠ™óÃ@K=¡åÔâ¡IÏZ™VË?:‚à §Ñç7:¾À…ÓÏW—ÎiñõM…4J}õ„ÒS‹JUŒ"‰×Ëý¯_ß¼~9߬·ùNïç»b[¿9¼iœQ<–f¯RŠÛÕÇSü‘ãÏ,7îð²Þinà‘GÖß2–‡(ÆðOèAšóÙàm PJüàz-àzÊÀ -rUà‹¤x½Ö»¥q#OÔo^ "y~·¯7kQÔšçפR¬ñÅ ,qÌ +,K‡¨ÕšxÔm:sTc5æ|SÕyQé…(ªW ·‰lÅÚæ…5€M$aæøëE^;!,²?[ídø}Cæ¦rhà˜E®ßˆSlÑyö-/-­Ìoê!¥D—úÕãÖ ýk{cQ‰Ÿ¯¨Mò“ø¦wûbSíŦ*7Çï䥭¼Ôº(¯ÄܸÉx(zÂC,#èyhæ…””»Â‡r[?ãcCÖÚ)×\gl†þ^;ã®1ÆÄÏ„ ¹Ù’‡Ð[0ydmID¨±hG)ôv(ø-ŽRqï–gäoHªwÅÍ]­÷ô©ØBEYû´…œP²ÚTÚ4á'}ÓäË;}›ß•µqBú\DŒŽftOÚ„Á.V9¸Ÿ×ÞÌÐï0eMxÆýøLôð…Ü/öü!ÌÂïãg‡òA—pJQÌ‘T7ZÜ™M(¿z#è*²XoK½Ö¶ØÅšËX¨`)Kl„Wá-ìÏËåæ@x½Z›s®ø‰çuß>‹9ÑXÙYÀêïWº»þ9³¾á«•ߊjÙð¹Î]ä¿ó‰o|‚Œº-‹y½!êU^C£`éõý†`m½•6'Gl$zá0ß·;\Wçó•Ø€îxFMм,Ì%C6Éü-¯ê¾eÀt–)¿)€:wÅ,ã˜EðÇ­C$íº\ìyIlhÆëÎf³`l6ñHاä@Ž)ÕPd|‡ÄÏçs'ÁûmŽ›ÿvj!r+ôÀñ-7ÂÍL~Sjd÷‚n¯Ø°­Ù¥ùð÷¶ ”-ƒA”TÔù"²ä»¨*R`î°Š@ÊûEä·Ed9“·›ÛAΡ0S02¤,—=dïyµI…G[ dGÕÌ”ž¾´Çþ`&oÊk]×zgg´ÚaE)ƒÕoÝâ¢QagíºÌ0ì]θÆÂYI±Iåf³/*À6 ]<Z™µ˜æù0ÆS$Î`q\Ç^«E ]·&h”'eã7¼"&bÁDᆚ5§~ÅÛDìfnà—åÓ(¦ºT°~‹¾›Êš³:2y¯¿ëù]Jµ@«â5Ò0A–š}`/ÈÉÄ]$Í$½ Á _˜²m*Ôb&‡qP™›F¿K ÈÅqçíØ\]à1ÚôÕJºCªc4m9˜ýíö~» :–q Áö«Í]iùÓÂaª„пÞå%fe©ÚØ]ÐЃšôûtŠ %²NS;5b§Rëx3lα˼¯õ_Kˆ”5o Œ‡ïR®9 ëœà“¢{=1îR¤òCš>˜ŸËËfpqNÇ•üÑ!¶pfzû¥CѾ°ÞÍÈ ƒÐ¨ÔMžã²Îͽ˜4½Œ?="B©iöדéGRÉOŸ®?˜Ë™¼8ÿñŒ¾#˜9a+†FÀÌ~¬‡Y/L^ß9¹jN¹Þ¦ªhP–›{\ûWQ‹õfQ˜s”è¶ôЦTš ·ËcÌrYv¢àŽk?L~k;kgrcóyUì7&ŽÕü§B#ebôypzjS¯6÷¢¸’ìðZÛnªupÓm÷™QSžî‰o`7 Ûéõ¦Ö'[©aQ-¡"Sð¬^óí¶,L;')å†RK–‚:îM¾×ÿ;Jwïã¾½áq‰ÑåL‹Üšõy‘—£¦-•J˜àÒ1ŠyÖ‹9Z‡mºZäxŽÐK„•†–ô•™}¼Þ6ÚˆTÎÀ.áÁzE`áiÔôÀz¨y|ŠJhÒµ0ˆ$YS/´ì>Øun•0oLÏ0DZÅJs€ìGrò~ÍäTþÅ@õòÕqì1ꪖ7…Q[°~lÁ'ñãæ5Vk/KmÚñ¼„[ɉ•+SÏ´7“ï)EPws€€xôÎPØk*öWÃjWn|„ÕÅ™ÍW`qaañ’b«whÆkŠ”¡X-Ìã‚ÞR#žù®KÉ×ypÇEd3ÝìÙlM©æqóðTù “ÂÌ"3ô N9b$êõmêWr&á1õF4<‚ÍÒÌqÅ9PœÍXÙýâöÎä2…zC5îŒA L ÖÚnª›^ÔqúG›mY¯q3ÈL3Èšf5Í A3 Üçf‹éáHÍ€:ÄIF«£^à^Öà0·„CÆR´”¾íÔ¨ø¶(Ó·N7Ïû Áo,ISk {{ÖÐôý©rKòi*óe÷°=¤>,ä°+äÐȦTrŘ Ô@ë‚^8Û÷͵CÜÛ%m[- ðzáÝEqa’¬ó™Í9•©¤+È%ÞT¿˜Ð}°¼l&Àe…h徂 3}‚¥ÿßdœ+!ìSñ¦ÄÉ×TC ½wq\™G'Bú$$Í)™ÞeÚ»ü—ò²Ùm‚ð½O8Q©â˜`'JsIsÈ!—ª/@ j‘­òsèÛwvׯ@¥="À,ë™ñ·ýˆñØn¼m¹TÓB»u¦õÏó·x˜vÆuN¢É ÎL1Ì©™ÁÓ‰^K•]ýâOÙ(ÌyâU ú"»aÑ1­§µEÆ ×£¥(;zc…nÎE5NAÞCé ï“úñ™Kó„°8ÀqçôñA›¤’²¾w{“>*3š øÏãéEeIôSGôÕƒõßQ…¾8æã$x€cȵ(Î ¶HC4Sø†¶&’KPÈh{´qW»Å§þ¿ÆÎ1¹)¶\³¨«º,ª=‡FM±X.Ê%™Ya§¶›íúñyóÂýAØ—7ïg4¤Ò–BôŸvJê}´ÏÈÍ]Fƒ¦e#ÓÓ Œ¿ éøó Þ [åBí– ݽ·ÉS\WBîòÇÓ$¦Gu²> endobj 928 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 458 604 487 618 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 929 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 930 0 obj << /Length 2660 /Filter /FlateDecode >> stream H‰´WÛnãÈE^õ?5‘æM”dÄvvf6Ì,¶A2ÎEµ-®)RKRÒ*’È?æ!§ºš¢.v’5 ‹d_«NUªz7\Ïf!4{!ùøÃ#ž„^û §#/™øÍVƒëï› eYãS“•ƒëîzj¾çûÖd·{Ý ÔO铦À÷É™ý<˜šMSûÞ4ÁÁÑÄK|9×ì Ív~%¼û›úWˆQ7ô7ˆ¼Dùšïé~_¶KŒ„J;8I5yCßý0¤¿ýÛqGø®17òF*w|•-‡t¿ËÛèº0‡D*-Ž;UôOóëü}öçÑØhú^‚Ù{Œ v»çD^ ¾Uóµ8Wzxõ½PevhiNú0”Ó %^”½É„’HtŒ'TëÁãàÝìF`‰ŠF®Ïˆ(ƒ^o™¿qâ{ø—-@ÍàçW¶8múDxl½ ¶¢…~ÌKM­ãâfÈ(Ms½L·yµ©©z¤”þ°p ÜX¥mÚî1Ô\ó²?Òn™gKš;A RÇ5¸è†ª’€ =éR×yFW«|¥y}Õ¡ëÄfPÙ3’ÞI¬™ÛýZ{4s€Ëjztb/V•ù*Šj——O´M¹ØèƬ¥,-!:É×Zvf¹l…ùá2šxÞˆ,×­Ÿ¡Â±µt&æV¿c ¯?Æv[g E‰çÇvæÊÎL{™q{e¿©†]3P­qXx`Z/DžÃ‘ðï‰õ<¶_Ø›2®è†f@™Á‚ÒPy¬`4ÀŸfYU/ X÷˧/Ü÷Ÿî7Tô «ÂÌÁ°E…gã7CÒeVuãF¬÷§ÆTÑÁTçñüM­6E›»ˆ˜½ˆ± Ö‘ÒÅ–P8›YºæãáHª’U”-ÓÚa±Ò¬ÕòÆ+œ3ã@ˆ‘±OòÖö‘Q€èü€(:²Fƒoq¸:1Æ’Ã%‘ˆÛ¤È) yÖ”Kp¬kív¶!æ¦^¥mCÛïá zÁ1ðåŒø¨B³—4ñ¬}o÷öq{ÁŽåúÚ?à°otÛòÇ*}f'Y˪e/ɪ’¯çW#‹HF„Ìì;#Ž®fÍÁ”gi›W%\¦©(o©YV›bÁagÄšý^\¥wØÀ:ì¦q˜ŽA: à%b•->i»!N·ZrkÍ £Å€~2&ùì¨.‰"fÉ>WiÈulªèîîëçô˜ët1Uµ¨ÌLöLgQwIª‰?ÆÅ=©½^rÏ{CŠkÍÚÍSy1jpÈðj ã…†#Å–¼2d[`jÒ­¦ÝÌQÈé…WÓU]o }ÅFÚêZVp2ÃÉ«j¡MH=(»“Ó«¯{p†ÌÎ<—ÉáË úý¦Ø‰Ü«_6ùÉ7ŸÊHI^˜OcæÓ´`â)YSlõ5—ýËF—-ø€0ÂæHÝ$ÜlʳˆYÐRjWÊ’Ê\Í´/Ã7ǪDg¤`bÿ,ÉÀu[ÿ€Ç¹£ÄW÷mÍaÁþ±2Èmš—<’ —@‚¥cò_ÝH´õ¶ w˜ªÖÙ¦®A¡ú<¯tÌõÿgãr½U㣱ٔ‰“JǩӧÂ<¹L æ2ó8î„_ØÖ*³=«ÅÉ1îÆn-|ºG”zHï ·´Hób?4Á$?wZ?Ly±ÚËÖ!}‘«oMÈÁOQ-ñ¶¿¾X„“ƒ^üÊzÝÒ^CNä86ß¿ž~#p/ ‘{ wX¦œ¯ÉÈ"iÊ ™`o¥ŽÊÓšÃn~P¶0I3m`e´§ŠÁe$çò ùA;9P?/Ò½A¹°—·l‹[®|σÀíK…¾RP{>`ïÙ+Áà TÜè¬,»$𰋘OÐ'T%Ì2R­~ÒBä ˆÑ8Tç‘Ô:¨‰Ç¦–)N­Ý³N”þu}’$WØŒ!C !@SnVóîR®%À›eÞÚIy¬å*SüuB-zÞ‰•½Y*³HZwêë?é}Šc¾ƒª[øßÀŠþg°ØÖ©ù#½®¬ÒÏŽËj+n–ÆêË ñâK¥¬ÚklÚ–M©É,öƒ×TF¾Ža§õñ›‡Úq}oãÅÐÊþ†Þ·—XjýÛûM9<ã,¨Äaº½OÛ·å TŇ\2í„€; ÄÆãPc=Œx   Ûê©ér1)T’ý¹lmÌdëp &£¬)ÉN÷ŒoCf=Ï£Ó©ht;B}…¹·+£…ªLZ§G içÊ7d.“¢¨{ îHHŽ¿o¤@¦w¹¬o}¸ ä ¾:_afFêVå«\ å¥_ÉÆÓ姃MËÀbس—¼mz¹lž¤ b·I”´?’ôø­0-Ôþ@Õ& lcù9• èF‚[9LχìÒ!DgtvYÅ–* 7½P]ÐÑ3ɳm^mšnÛ|ÓR×FÚŠÈTO\vT+³mÌkl{ÙãJ,ùb›CiW–‡~÷)/YF½il]6(ÊJÄ^ Á*ÃiçtæÿFqðbGÀÑ<1fŒYG/³AxÌRÑð…íZ²Ü¶¿`ˆ±Ë‹‚Jˆ_;A Àk´«ó¶…wÎEÞ;íwŽƒM¾~æRg¤>0rØ%‡D#Uq¥pּ«ÌÓ LC’›Fse 'yÔ¦…5VÑ¿¶ì´FË †½~Â-u2–2MÔ)n¿~þМ;LxF=†a.z•àЫبÿ±:ÆŠšl©W,+ ÆaFaáK†•y€`XªÖ¦´¥uÕˆû6ù¼à´Ábr¸ÚÇW‰ ‘Äû§jÇØ)ç´µE°˜þ#b h^lTýQåH$6K‹¦âì§_4ñ ôi0ätÉòáÆy^€‰’€2µd nCx¶oàæ‚Òrq:‰Œ•¨“Îâˆxe ¥v-mMD§ŸE¾ðÌ÷%¤¯ûÇ+˽C¤ +»écþ„H*px,† Àfm…@Ó²ÚQJwÆ&‰±Æ¼¨¤ùϲ2ÁZŠ!ýŒ”Ô´Ì> endobj 932 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 709 346 723 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 933 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 506 709 519 723 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 934 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 420 599 433 613 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 935 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 326 584 340 598 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 936 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 470 571 483 585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 937 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 250 557 271 571 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 938 0 obj << /Dest [ 1583 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 327 528 340 542 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 939 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 138 486 151 500 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 940 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 134 178 156 192 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 941 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 942 0 obj << /Length 2702 /Filter /FlateDecode >> stream H‰´W]oÛÊE_õ+~Z&Ã¥(J6 ‰\´pnzk=5. šZIì¥H…¤¬øþþ‡þÇ>ôÌÌ’ú°E/.n,.—³3gfΜ}7¼™N#eÔt>0‘ ñþÄ“(ˆã0Qã‹QL¡š®onš‰ÊÞª&+o~º7jÑ Â öd¿û¹迤 «Lh”7ýçà‚?ºPã0¸H`x8 ’Pìò7N¿F }ýYÿ;ª…žo†A¢Ã‰z|V÷Ïe»ÄJ¤­KºÉõö§sõ·ÿxþÏ5Þ‚‘νPgËsu¿ÍÛßl]°‘¡NË™ç_hõ/þ×ûûôÏŽ˜£‰Â ÁÃôkìÁv» ¼a`tC§Z:¦qd€ŸaéÌ--ÙÒûéÀ¨\ ¢Q £†ã`2Q‰’ 1ÆUÛÁ|ðnÚƒ14Ø¢±C7$D4£‡Å.GqÆ’&þÕá9އÁ8Ú4w€†# ǘÀÃ[uÕXàÇŒ~ò¢ `ClpP××çê*ó¢ *r[zÙ"H<__ªŸlI𠶦…º·ü+£ êLÕ («›"çÃlÙª{(™î¶ÍËE#à#®ÉqíõEINö"2]@F⹩Ê6ÍK;SyyÉëÞ¬+é$w9¥"òùUã%ÁD?»?eö¬*ç^ŒòÅõ±>[TÜ·âIñĹ”–*·Ä£Ñw<}݇C±Ñ¦žk 4³MVçŸj—¨ôlÉïÖ(î8?èÆZÅK…$©©ÁyU«/³-*à¶"w«!2fýfm³|žgª±.nc Ó3e’®7(ਃÏLv-î&ðFpˆó “€/¡æ¢YZÏJV*ÞP{TX*CiÚA…œ•­Xyð<êÑAîù–ZŸê `mZÛУф¿Ù7w²"„µtû¼¶Üh»Ã"G] †;8[IEèkÊá-™—òFbmÓ…²eVTòlÝ2 QnÅó#â­'Î'—Qãµ2ئéÁ.H‘¶}7Ñò½JÛ¼*uʇçofÝÑí²FÑüš—3·PÍ_${¿2™Ê÷θBúàà䯢ñ¬?ÈkGWhx‡vOd]à õÝu·kï± hæAß:$|*%«$YTή-þ)AR P”µß<½€Å¦N™¡&Ï)ÍQ5D-f¯^V8aš0Ç3êRªè:)fK]ÊK™óAÃò A×—“jÈÄ»Ób9 ¾Fk3 1f`Ñ R²‡ºTVmÈ,<Á)ÔF1z–Æîg¦¢ž‹ˆæe£X{r¯É”AÚkÏð)WRq׊ «?k¸Îé2 ×Gœì¤O¶Çÿ˜ñð¢g¾ ~¶Ës,õ(8$·¶ö¨£uq¢]Š ü¦eRº"üÞ’]ƒì†ÖU‹Ž’LuI6”d!2ž¡/é>ÈQ0§ b«nõþ—;^|ƒÅXº}Ço<Gz¾8|ÈuQÔáD¿Èi°Ä=}é_¨è"}—Ëck‰ûP ©È¡Æ-ÌT÷«~¢­ /?2¢Lÿ&A%ù†9%“·…˜uÖÝ' kåÌ÷ûÝ÷Ü}¾”GlN:þÝyXC¾ˆ#<­X]±çkwæf!)?²üZ`£xúJd‘tLÿ8Ø¡¿›Ñúçª -Ó–W謆èe„êöýÇOp‰é»¬¶*EL›E^ú(mÔJ_¶LI2ÂM â‚R]bónÖDß™5Âݹ(ªrQØsõ¸É‹Ö'æ±_[ž–&Š@3SøÌ|  ¼o¶ùø÷jóý”sm ׉¾Ç(âizй'‰a™êYøÛ¦+ ªû¯²òûŽ™h1ïñü«ÑŠ-‘«ŠüQŽªAçÖÏÇÚ=:VŒ~÷“ÜGŽD%Ú­íHò'&Z´ÞzOGnhL$:õÝ`뇢êøÞôY†Õ,'Þ€HÊÚü‰è1|¥‘¢[µ]æÙ’ÂÃbê¶ G CEZ'7˜¢ˆâ'·Ê&Òù½kà…Pæ¨Vž?Ö+§f]A’Ôñ4o™>9ͤSÊâù¼kÙàš¹©Ô_í—u¶Çã}ßzáÑÝ+Ð#¬w@[0*ªG¥Õ¦íF9Yxm’w¾|äJêWn°ìO‘'ä¨Òª­hÄó"k‘7‚E>z–0idkUæ¿Y3¦êäƒYÖ 1i5Úú 6ÿ"dLÉ ËDцýÁ矺 „»xCŽWï]ULˆ–vUä`ÚUÑ)Ž;àA4ꌄÀ™J!ó¥·Hë«Ü9ìüŒ¾Pk îÿ¹{5 ÔŸ<¾'p½9T×b]n.:.§EE ßHaÔ§°S1{ÛŽûëX4ÿ`sEÇ͵«_¿€?ÈD%Åñÿç­}óIXïöÝD´Ú4-UîTsgÕì1;ƒ&TgÍ—âìÿǧ]Žv.G‡.˨ìGêƒfªë¯0¼‡g,ñ¬ÌÙïüDLï,¤i~&f»¸úÂŒ¾]˜{w͸¿™¸ÂüÄr…’]«§T®›ÅÆ-5r‰u˵çîj±\ßÜžîó'÷cFóÙi¡ù¦ÝtU·á`¡kºpoëýù¬œ®¶ò”S1¢þ—êöm»Msçk&χqT{±BñÈNVSF¿¸7î ü¬÷‹Z7FõÝP±§’ˆžŽ›]A’p¡€·‡“±’Ç1.³ „Ï0¾LBlå2Ó+cWø(2òj•~mÀ¾«‚î= x}~µÊKZç]+QÏ…«¶ëK"l~“‘°ºÐï\ˆA<M(ÎØ„ÃSÒf,tuÛlÖëªna«Cio6’¼é’ÐFÁ8Úì(®šŽD¯— …x4Öc²k±¡ÙK.‚cšúD¢ŸÜßkÇîùlè°^Îï›´”)Õ94zÅ!B¨ëyOÇ»¾×›¶ÎË&ü¦®1°ŠçKu†ôœs¯ã§‚2ÞN øßbHôÙ·ƒˆv}œìAò– ½€3iŽ4R×—Üaà E—ÔÊ¡ì9…áL|Ö·vžnŠVК¼vÄK†L‹¢ƒªQùj]ØPBI:im»š£&¹C¾Ãrߘ"SÈmËš@5¤æÏиòÜy–#t{ÛÏ °3“2‚¤·58²¬×ûªYV›bæ\%}…êçª^!<¨;2pRoŒvîv7 ¾¹ 5ß¶` ÚÊb»àŒ7Tj í®Xòײò8 [ú¾d¡æµ‹…¿£€Ä3ÖƒF-ž+8ÅšŒ@ÇPS|Ì»“ò•í8í_³Ã×8|É Åë aYƒ+š%c¨róžœtÒX“¬‰EáÇú#o¿cYG^ó£|ë\‡‘íÒ–]ôh.Â"UòΊùî‰úÈ©Ðrå'õ;ÜWk^’«Në\%AEwË…Ê[µÊËöE?ã¢6îà9û¼)È›"_å-à ǤäU‚-‹.Ž­ѯ›f™]·$ôN¸¿+‰‰>§h#‚Xžeã!.$­ñÙÕ̹K½+ºld+ÿT¦O]ኊ.®>ÝÈ0kH(“R6N“¼Ÿþ;æä½G endstream endobj 943 0 obj << /Type /Page /Parent 1716 0 R /Resources 946 0 R /Contents 947 0 R /Annots [ 944 0 R 945 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 944 0 obj << /Dest [ 1291 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 317 305 358 319 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 945 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 365 224 396 238 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 946 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 947 0 obj << /Length 2771 /Filter /FlateDecode >> stream H‰ÜWÙŽÛÊ}×Wô[š€D“”DJÆÜ¼åâ^ÄÙ¬ AfòÐCµFŒ¹è²ÉÑ(’È?æ!§ªZ”f±ÇÎ[Ã#ö^ë©SoW£W«U¢bµÚŒâDEø‡ŸÙ" g³(UÙr¦‹hªVÕèÕ;·P¹ã=‘ry=zõã§XݺQFQŒ=ùhrüÜôïÍ­Uq”¨`õ÷Ñ’-U…ËOaɽ|&áãô5Oéô•þW‚ÙI“x¦:Z¨›ƒút¨»-fmܤ]áÔ›Çê¯ÿ&sŒ[¬Íù.‚HçÛ±ú´/ºضäK¦ÚÔë`²ÔêŸü7øÛêçkÌÚ$Q˜b°z9–`¿ß‡Á4Œµ£W-=‹«ñdˆÏ(Ltî§¶|Ó‡Õ(V…%ó4œ¦±šfáb¡Ò–TÐq¶P­mFoWƒ1¦1¶D­q²nDÑl=øhæ}4 £6ÌÂét‘)šÍça–œY5ÊŽVæ¢S‡I°€ìêÂY犦îŠÊ6=Ïu—¯ÕЇÂÄ\oš6È`7õõ¦¨ ·å½v­üN ãh,Y†ÑâL°ø(W,b½ƒ¦¨qiQ¿fëfz¸Ö‡gfGÿààT®ãb.´mƒ¡rç/2»~,Þ„/šÄ!Åé{o¨Å`¨…—ÈÔ*©D ù ‰­³ÓEÝÙ[Ûª;Sö&zL"á&Ì!Ù.ˆµÍ‹Í¡¨oUWKh-Ö/j¿ÅB†µ|~YdÐ#NϬò†rb¦»®-núÎ:Æš´‰Ù§/k£ë¦¶ÇüŠùbvÆ•~o7¦/;1Øâ+Oˆ™†œ1¦"_4V×z®ª¢&¹¯ᑾѠ©äHt’iˆ°ÉYˆ­`Ä ©JºŽª3·J>wˆN5A<|¥w¶^S´7"ã®4@¦Â£”±5@=Õk‰èÉŠppŠ¥ÑgkwX%«§ú$£Ø‰¼BrµªØ<1Û³åêJã­6˜Œ(x/Õp¥ª-|×5jƒ…Xûe(/ä½DÓÞ~Nu/ó° ¦®ƒpˆÿoïy¶@8ïSzÄxO¡D»hí/½u]ex|rüÈàÊÄ+s/M~ >ãÝ|RíÚ3HNS9ÙnyÉçó8\ÌþÏ‘ü„¢•&{®ûÖtc×”`¦€͆ Æ+))޶m¼EÇ*úqTUÑ}Hÿ÷ðûy3E° iËpÙWÿn œMÎñlEˆ•Ë@ÄÞIBºNé_ú"ÿ\¢z&°Äóà‘\& [wä–€«§0*ÀCnÛôåšnô¾ÂµŒ ™'Ð ¿ý€<ÑþJ{‹jè4xØs`kÓ™ã]”+!wÓòrÝW7XFgæƒ6*b1Š áŠ­*M{kCõS­žÛåI å€hTY s㿳R-ƒ±O+‚­Ùq‰"˜W©Àaq'«d$ž–¿…˜‘³!;óÙ*Y",¿¬ú|ËuJ©$`ïùG¾í7àÕÀ…¼,ˆÍ4Œµ—{èóÏçj]2ÔºÄÇŠ• l[¢n鎥‹FxÅù$$…G¢ò“ÌmN'tÇÝOϵwtl®C®éÃ*‘•s)ŽBø!²6ÃÙ½l~pEH×Îô³ÞŒOi{Uÿ\t[?ì‡{¼—–쥌Š,wÉd¡¸;‘UÈ>µkœ|¡7Âê à yT ç¦ão:{î¦ nš W]JtLµ<çIFÊÖ·@|.''Ö´“ÅFª¡\2yìU"+ zǨsùOEYyú‘Ê(r:Ž=¤ÖÍ7Õe{(=®@¿#æ1½Ê‚ÎÙcçRø¸´÷9ëç/e×éœã|ˆXäœY$ÄWžËÖ'àiª¦Gž3Rhœq=h¹ÊÔno>Ž5‡X%£¼3ŽüÝíššìkïÁϨM¾BÏòžKaQƒ»ò¦ª 8  —Ð*u*[[)!™¨Î(7&ÿ|ÛB|*úäG»3-•DTkÍ:|j…gëÀI¸ÙI¸™÷Û¦ó`r¢?÷Ü6ÍtËÂ.©N'>™é’â4Õ{a—Gð\‘Ð"(dò®<¨‰èJ¨ëº¦©⥭-\óÙßäÆ+í}vd¶ÎךÙ3P•À¿B-&bKñÅ<̲ ¹ûbLO{îkÀmûZ*QepÛ¶ýuÉÒìlkžd؉MÎIk…˜k±¨ 8§¢ûŽªæ…ø¼›sÞMOP³†§Z65LK±QÙî»]ý Ö½åt:H²¡èKJâþ—ðã︩jP?iÙU_bǵ>BÂY>+¢Ti˜LÁY@ÔÎ0ó $xà|&áâ®yDÿ€¦ÔÝ·FÒS6ÉP·£Öö®È9f¬/&à/4É1’[¤¦“o‡8÷ÍÓ˜àZ ¬C$&²oÃ+æöiŸÉž9åcìó˜¸5è´ˆg±r1õBø‹ íŠRܰd7Xù$ø-ž,Q®Ù;Sö< (OÖ¨å5MeTÕw;ð„õˆÿY°Û¿¦ä.œõÍÙrXñ0!s,)Ó©„Z¤¡X~›êÔ…o2/™ÀÙŽK&yƒkjÎBº9T¿“#¤]C}%r·†œ¢(ø"x°ÄA7Œ:Ï%nz&õ R+ödSž[ÑìÈ6I²•2¸Ñ”jzX®!EEöô ±þÅõÕµî]T: ÊÒ"¦b<ÐÕ²¹6Í„òª í·eøã^ÖWš_5œ=ÓxvŒ÷uEýñMþáO>­>¾ùËê§<¾ÖÔK­]Þ»NmznQ@ºrß“9k\< Óë€"…ŽÝ“ÎÔ€öRª¡Xr¥|¬ÄääÿÇ´Þ”®!CSÙ6e oÚF‚± ÈìJ$sáÐ4ͤi‚H(`‘LN™’a†#)\gq¸`›T§Z—=§Í`õPõŠš'È¥ ¢aÂÆ._Ãë(‡Jò¤ܧäAû÷wFëf_"ú–ŽŠð?ƒ\³9Ä<“k°Š7Ê;€ôQÅ—v1{¡]œÆg­í…cÉ „]wþ÷Ò÷#Ä{Ô@NN%í¼¢½ƒ›r‘Jšoÿz¥¹q…áÖ½¤)â Éï,î];„ xØM!Üt@gß ÑÒXE?ÔÀRºª¯¾¬Ë)äâôÌ2o¨C@aïÚâ¦ï€[Æú5w)Ó—4Êè"]¤S~Ý„1ë¥ßÛ£-¾×h:‚‘ΦDÅÓô|‰ì=uÅj[pÓK„ëlM4iC<Œp`moúÿÔ])‚@Ýwж-:F'¨ H "H‰“¾ÿ¥U{u`˜yÿé=©‘JFL o•«ùi¨’Œ>Ìä”,jì¶Þ¼úo~òø“’¾‰,.v ‡Y ݈šˆ°O®&ê|”Š\(ÃÄiDAzµ “É\rª8ˆ±Ù¥^Ž|%‹Yܲ /h&4Ÿ endstream endobj 948 0 obj << /Type /Page /Parent 1716 0 R /Resources 950 0 R /Contents 951 0 R /Annots [ 949 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 949 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 281 730 311 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 950 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 951 0 obj << /Length 2766 /Filter /FlateDecode >> stream H‰ÜW]oÛÊE_õ+~é~‰¢ #@îMz‘"IÛXyiÜš\Yl(R—¤¬¸?¤ÿ¡ÿ±=3³¤(ÙqR (Š"p¨ýž™sæìO«É‹Õ*P¾Z­'~ <üÃ'J7мX-–s7N¼P­¶“?·‰ÊZžã©6«&/~¹öÕ];ñ\Ïó1'›ÌúŸ‡‰þczg”µÎꯓ%/Zª…ç.cl&nìɾ¼&àåôkÓêÏúzgçÌüе—¨ÛuýPuôÚ8ØI·E«^ý2Uþ§3›£Ý`lîÎuáx:ÛLÕõ¡èþfš’7 uZåÎl©Õßùç/«ßOøÆ|›Àsc4V¯ÑÇ× ]_·tª¡c±5ŽtñÓsÙ® ïôf5ñU¡&Á‰æáÜ•†Zmìh‹;Ze4jWVjÓK™±Ã½iJW«ÖvÕW¹|+;¡}ào¥Z1§-¬×êªUížÇ6ý†{`‡ø©ÎÚoí²›Þ9³Ð]ÐÜGý> Xó­]vΗÑÕ– uµ·§Ù¹öÃ6÷É­áuÊ xÖ †§Ÿääô¶nº¢ºÃíp3ºRQ)JŒQÛ"ÏK3UyÑfuU™Œ§V²gNÆPNv'†ÙuóE™.sÕéZµ«±Ûmi\õ©¥%´ÙÈ¢ÐfiÖ§êG²ùxæOŸÞ\¯Þ¿ý°zûþ;qÄœVîœÑœ¹nŠ]§Öû Õ•ºÑ­1*výÈoœ©“š Â[fj¥nÍ&½/j2=Ô{gFŸFei¥Ò²­1¬ÒÝìI§ùG§ùbí®,LNÙ“™¦Ká°Áy5€ °Ww¤ËXV_ŒÊÍŽŽÄg‘®rr ,ß#©b,hâUïè>í㊷Àm‘å¶Èõ"@(rÃ0Y(iö`Š wŒÀä-z0yL¾ïÎá$Ö•ùÚ™¦JKgGî›òå¥jŒ'zg²bý >}|§0ƒ°ŽÖä䮈ñ’fîŠxò€ ãúͽi““s:ìœû®—ŒA?`^¬ü¹®ÈŸpnQ]2I-ô°­ey$[OsXú£,ºjq' ¤aŸÞÛïKký™y3ÞhÈFñ[2ø-±!A2±J š?cì{ØJ°Þ—%@‰U»3ò+“‘ l\¶›]LøDˆÀwß6;Žôã‘^ÑÂHw]SÜî;øñ5ï#åŸ÷¦ä®êÊ0oÓ[|*»Þ§…P¾§·1Béø”ê—ÏŸå'Ç‚kÝ"^Ì+>âÞ8„÷{‡©F@ 0õ#9f…~mÖé¾ì.í}¬-@a0ºÞ²¼ªêN9!:@.:ãUO˜T¹3âðlë[¶]9Tä7ð˜½å†êÒ;ÕÿÞËWÈÅÒw³ƒj™GOé|Ø ¸Ç+¡2€p%jѯkœŠMK•¾ª®?ž0 Ø,4€Í]ýŽ:9]v¹§õ)"ÔrÏ£¢L…#Ç>.ëêÎH¡ä* Kuï]^{ŠHÿH–#P7[ @2ü¨êf›dª2EçÌ Fô†‰<ؘ_÷EÇp 3!c²š±ìëíÖT4©s“O•ݯ–;ª]iRÛÅ>ˆØÏÒV#;„¶´Ú…/æã\.¥g…’‹HƒPÑá" ¶ ¢‚¼O¹HŸ¤üvf6šþZwE¦vMýõAÕÃ%sÜ1#©±ÖÕsÛŽ+ŒEDÕ! <‰çß®E´øïñùêâ?rÄ,°2=Vû™lzB³1A¶Œn¾$0•’CQ–’Óaïj&€MÚ䳬F°¸JÁÁEg‡®®ë}“¤²¯_^½«³Oß¾T Ÿt ©ª;;·I;ÊdaÕCŠðäPíÎČ͓ êÑ+*)sbÄ~´£`ŒÑ‹bçÔ&šÆ _qU&º³à‚¤-ĺµ#•‚% -é™ifÜg$•îùûGôC1îEcý0 Ö ý£ØW(Óv&O¹cÏZ B™%z™^Y¼q_žžŽ^Ò({o‹ªr8OÈúˆžYg’ð–Â…N¢‹ŒRס,«øÿï+ˆÞ\Þÿ¯Ò8iˆía½›ŠëÄo•Ú’º½ö¬sU¥[ó¿©+fca1TnòFò½#˜®ô6Ÿó g×½Eg{ßɇ?¬Þ\ ¯Eáâ 4Ý ÓV¶ĺåûÔL´K™0×øsCÆð•Lkâ[‘&âÎPo^ÚMH Ò~Ëm!¯ Û¶Ÿ¨«²SÃijͱ÷£—Ì7Š)ô¥”1W]תX«‡z¯†"†-©ØíwÂòwMÊO—µ4iO¿­Jí£±.s¸ vùCÑ ™Ñ§ãzi¿t]YÒŽ€Ðl‹55ÿ‡YžUïËœiYÝÌÎYﳦÒÇP&ãèŸÂÖ¹¾ ‌¯Jm\¸CQšGUðßÓpV1 œ•MòÙÉ0žSjâT˜áÅÖÎ¨šÆž–X^¯¯fÔ j´Â½)hÓs2Ðà”`€¾À<“­ÞóúwßÜ(›LE/š;S™†Ÿ±ŒôVô?fÛÓé»´mu“Ë[ Þt3¨]Ü–Yó°£ZX“^yò st#—v­ èô„0þ{¹öºí|}2RwgF#ô—c˜o9Î ®Xs­lë4êsD=¤Ô¿ÀY$ŠÁÛœE±«dÒk'ÐsA ]“–wô9%)¦n¥"™*“^¸ÛNVÇBý4”D ‡”Ž)(?¡kç¨,­(Q {(MPÄuÝÔ[¾!XL髲UµÃ:™yƒ¯Ž¡}¢>?AÇÏQíeiö˜±'¬Õu¨\Ò3êú×€.ON„•?À€Ì9š4ÜÕÕé°2ǰ­‰U¨Å‰P[á…>¨´C/óÁÅDC©&È÷-`pð#êbh]\Ž\ ë! TSpQ›W ŒXn6D.áÑkX×.!† ‘ endstream endobj 952 0 obj << /Type /Page /Parent 1716 0 R /Resources 954 0 R /Contents 955 0 R /Annots [ 953 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 953 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 374 757 401 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 954 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 955 0 obj << /Length 2532 /Filter /FlateDecode >> stream H‰ÜWÛŽÛÈ}×W4æ© ŒhÞDJÆÀÀÚ³qv'‹±âÉEµDÆ)Sä(ʇäòyÈ©ª&)ÍÅÞl€ <›ÍªîªêS§ªß.'¯–Ë@ùj¹™øòðh¸QäÅ*YÌÜxî…j¹›¼zw˜«ìÀ2ž:dÕäÕû¾Ú&žëy>d²É´'ú§tk”ïEÊYþe²`¥…JD¼ËhŒÑõ("š£7žL¿$ö\üDÍ› á§!™ÿƒÁ¶CŽ«SÝ5j¶é*=83—â7Åôº6òªäÑ:®ÄXµ·’ò{$ùºY[ñ¢RngÓu±¥¸„zTW›ºÙ)о·Óƨ+ʯîk2E9øºëΔΌjÕMc¾tEc¦ö„¦¾ ×é`Ƚùèé\<]§]›¿Qm­®Ä= »r}íP൲“ªhUa‡Uݪ}-/V…„½*jrÂZöáwÊw=Z9ËMö™|VðÙÁy‘±›Xe8á†v¬î56:e©VæåMΜ ç¢Ñ¹È¢ðÂ_êtp+E´°ikš{Ç•åÌsI注IRöùå˲¿¯[£Ú§èmQ¹jÈ àI1sU>†Pdkfä"Q=…à†óDÉkOÒqºIpV弡Êõa@fu«ÅLÈåÍkõÁÁ×…¾ʘ)ú˜ÌáÔÖTÀaAÄ©®Ô®f­µyLO+Çl‘¸Þų̈Ç'ó®®Ú´¨ÌpÍAJôãØÄ(>¶VB1ô‡ø|Ò7Nw˜âû|c™ø‘yS^è)O!ÿ ËÄ*1hö ƒü±ú¶®êº4Xç!-;Šk ŸÄj4æŒ6ã3×¾£&#ÒmÛ«®%Î~¯9Âo˜ä%\Ιk,„¾Ÿ#úIßšMÚ•ík‹Õ—·8ƒ—h‡GDºÌÑCá/U‡½ÉŠ´Tõž1E% J¿©Ë³ÂÊäéCAýH "Uß>gk$Ò ›œéˆj€aâ'›ž)æâçà2¹«ÖÀ “jUË`£²BÆåx¤»ÕÓ9×]$CÞ]µäg.üºÎò –!ùéÔ#)XæóVÖ«eºs(¾ ŠBÖ‘ÒHî~`±[‡˜ö±¯J„­M¹Ù=_ÕŸ#zŸ˜0( >` Ö›:¯©Á¨HCÉ{hÁÎà .²ŽØUFS&µk’¦7Y7J·'ŠMç¼ùúÊ…µM¸F 6·Î\¯©—J4lI2\_XÜ}öÀ½ñšà…Š?" j ¿˜ ëê;`§û½©,²K)ô¨3,çrù’þfs-&.Ôêr×÷ì =Å¡­‘£0Ò!Z#îBÒ) b®ª³ºJ)åUK«ök+0ê2ÐÔªßh/@Î jäVÒ¬¥E%÷n¸ dü{¾ [‹¦8Ý>9ˆO¶3O¨3_™²>Rk²ä‚F¨ ù Ãwû†ï5ÏïìËÌ.¢ìa-²—¯öt­À‘j‡®®%o:+Dn ½,• dYÑS­! –é#Š/5<µCÙ³žð•PÃLÒpjxÒð sl­ƒ¨?âÁl9°B!ô~Ö ü’"y1^Ï‹ül¨_áPäç¨Ï(7„9žàjqµï¿À†ˆ¨Ï~Pnªí· {˜,Ü௰­—ý· »Œôp?f“ÒÆèÛ…õ¿Yσ__ÏYIʹÙíÛÓ£Š>[ÑG–é¬?|.óDciîÄ#ÄžCïiú3 éL !L[¹=Øœ,1“¥¾w S®^¸Û&£QÉPé‘\hZºR\Z‡ïÕ3å×õåA¸ÁEÊÆ2£!eÈ@ àæ`ª5®*û®)Þ\Kû}cßëª<s–ƒP±Ù˜Æð[EYZ‰¼¾s¸ŠÐëaÿóÝÖ 7 À<‰7VíKdzýëš7»Øçp` J}šnkŸµö³XÁ2ÕÖ™‹r8ý”‡ÏÒø7ØkU‡}-½n Ô„"ËÑw?àÜ{‘¦–æÁ”¨°¶`w?äãlÍ_[Û«ïÒ— ”€ÆÀ³sÀ ehjŸ=R$(ËPm×T†\‰õšÂèkêçÝ_Ú»¿å.ø$½»ZéíÕ .ƒ;sÞbÿ ¦õn¡ —¾.ƒÄóöD&Ù…Z.ŸrD-e>µçVkm{vùµ7 Y¡¿V´J>öwÑ霮»|×d%ÃüñJ±¶ 5Ûlï$)Íwüdýç.aÏ ':åë—ÎŒÙ誛øE*]+¦òµVËï@,<¨Ú7ãf î)DœãôeèCZ‰r}zî mc©æŸgçTsIM.3›íè¿_Nþ54 ¥ë endstream endobj 956 0 obj << /Type /Page /Parent 1716 0 R /Resources 959 0 R /Contents 960 0 R /Annots [ 957 0 R 958 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 957 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 407 598 434 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 958 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 365 132 396 146 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 959 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 960 0 obj << /Length 2462 /Filter /FlateDecode >> stream H‰ÌWÛnãÈ}×W4Ð$šwRÀggf±‹Iv±V 3yhQm‹ŠÔ’”4ÚÉ?äóS]MR–åñl°Ã"Ù—êªS·Ó¯“«Å"¾XÜOü@xøÃ#Ê7мD¤óØM2/‹ÍäêÛ6ykÖx¢Í«ÉÕww¾xh'žëy>Öä“Yÿz˜ÈŸÔƒ¾ gñÉÜlš‹Ôsç ‡™›x,×ì Ìvz‹ÚýAþ+Àè,𜙺‰ô2±<Š»cÕ­1Hí@’l‹VÜ~7û·3‹ñÝ`.vcY8žÌ×Sqw(º_uS!¡TÕʙͥø§ùuþ¾øab,6Öž›àcñcFƒÃáà:¡ëË–NÕt,DãH¯žÈÜ­¤·‹‰/ 1 âÄ _„©›e"ñ¤€Q&=¹Ÿ¼^ `„>–xÑÑõiЃ"ë£Èõ",ˆÜ0ÌRÁŸ=¨i»ip‚*@³¨zUßw}ÏÉ`”¸n‹Í¶ÔjDi`ç`ìÓæ«¹™Ž+̈]¶=ܼmQ=”ZìúÅÂzDÝ( A#žŸž¬K`t1¡±©Wº7,;¾ÁoîÙ‰5~oŒÏ¶|[W**½Eõʸ$µ*Œ1¸iïTl ýA‡òºu¿Ô“ ¾ööyC(D£«ÞÌ‚MPp°hD7³©Jä¬+A!–1ÅVI@ÚTj£§b«ÚöP7«3 FMÂAŠŸœØuK©É®kŠå®Ó-}ú’ôñ‘_ÈKMÐUuuîŸKøFùò¾W»²c“³ŽðÇ:ÁúVu'Z‘+·i¨óâi—™$†s´3«½1–ŒžÞ¨Ùˆêl„õƒ|W76jg± ]‘ËÝNuE]µS(:±)ÖXjÑ­U‡-jÄÆÚñ),PB<ÔJÔ÷b­ö(0#•hõV5ªÃ6…8Šäéq3)½tÕ¹êf¶àŒVÁˆGÀª’Ð!2§àŒ ˆÂ> ±•æ¥ Xñ:¨Á•+ÞÁTÖ4¶s0¥ßÏ­™Úª¹²ç±€)ÙmGDw¨aԃݫʲ>ˆ®[[ï ä²B*E½`ø ÅшS3(®Å £¿¢Ñ_ƒ€R=d€+n©òç|/ò²š¢kŽ„Ôðês©È?¡ìÄúœ½…J‡&°JlT—?¦„ª½4@ëæj«LîÛ|ËëͲ¨Ôew„¯,ŠQ–4ª: Z Š<, ƒ'fö×¥ó)¾¯z· mØ Y¿Þ8A\ï 6Ÿô‘~)oÄG+Nkñ :‘: ß|tXŸŠ`  M¹À‘‚ú3æ,b5½ì“lôI6ú:5­ù­72C Lö8Š{Uîl" ¹2Á#K=,\ Åo‚h£;èùQþáÏ0¢¨Oí*¥K»ã—…À%ïxáX°ª)tëžÕ±Ð üÓú;êïœ|S›ü‚z³ˆÀãTèß)Ì»ØUe?Þ뤆ÛqʇPÚÒc%úè›—tÎ,#Ÿ˜2Hu‰r{.+÷¬ ©›¦UyTg!ºg6zò´<ŽAÌUþígEíý#ôηØiu âå S t¹AS鮯ÎI(Pº^æ‹8Š\t%C{NÈÏ‹³q2ÌFAîy:{ôzvû ÓÃÙ!‰åYð§$:ß}y¼mä(YÆ%ö³qÂ’t†Î ‚ðèY-Ÿ›4™É/àsqó—gûsƒ¹!˜Ï¢óÌüëÅ×’Ô(`Ä)I S &©>ˆe’º±( õLd£Õ äï±¼5}³¨YahöÄIKÞ=5¬X1°ˆÍ-bó¾%ª9í ì‘ü8ð\þ¦WLj@ÀͱüKœ u¶Óåñ2™IF&6̆¸**þÖðêÂt(tmo $ÝxY”EwD¹³ëpk0O³yÅAoOagøa,ƒ¡Bô!¯!#Ëã3~ G?…¬ë_Aq‡RHpY>.Ç\ënèL¶ºšÚHJú%¼~O—)~%nƒY³^®Ü*^ ˜Òeæü4Axûæb‘XɈ‰|-Vª#Ÿô2YÛm–e­VƒNGTåÝôänÈ÷Bsz,»)SÅñ.“i†÷Ô'â\emoc]{ß!kÃ¥HäL©øåÁ™qicGgO°¬÷ñ$ Ú3×V~¥õªW°6µñ¥)67»êÙ 7–a/o€æÒBçâÊZ›ÛŒ¬:¾{é½¹ñ´æQcv½ë\,Ǻû5M9@ûϲӦ<–åtlÊw_·ºmQŠªèÚ¼) õßò…ªC{¾ãi¤Ou„6U,¬Ýv/·Þ F’tüÝZo0¦TŽ ˜G×§½}Þp\LÅ5anòJóPÕݼП´ÁÛ½*J£R-º”–޹Œ½z©!Žt(ì£Aüô³3£Rò£€®„n‹LïkÝÿ”(á‰]-ÚXBP Éʧ½Äž6ù;RC¶÷V&y‘1Dƒ0ÓÆ¤Ç^ØÙ…ï&~rê(‚Õ®kŠå®£;]Œ GÊø§it1°˜Ȫ®ô³ÇžÓ¤ßÌÒÇ©ˆÓ†\¢ßob2šËeymê9·úÉO[_Nq\A<*•fH 5rð°¦LA©ô¾o0 ¥ÐðÛÃi{¡WúgyT!†ó¸k(Ãfb{,„»âû¡%g\ë—Ú¶¯•¼•ÎÍ9¥©ú®C%›ÊS¡(iêWý´×žÄÀ^5…Ói{2ÐÇ€æp‡í¾#ô°.Ð÷r‡f¡ydŒzÔTžCt¼oê%¦ì3 õXöbZCÅžŽ¼È[žÏ»·wwßÿø§¿Üþl̼sÈ%o©7, %¼£JÊqÕrW”Ý vÝïÀÈüž† e9íɤ [ ÓW°:¸­þgWXkë endstream endobj 961 0 obj << /Type /Page /Parent 1716 0 R /Resources 964 0 R /Contents 965 0 R /Annots [ 962 0 R 963 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 962 0 obj << /Dest [ 1135 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 465 420 506 434 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 963 0 obj << /Dest [ 1144 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 406 113 420 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 964 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 965 0 obj << /Length 1858 /Filter /FlateDecode >> stream H‰ìWÛŽÛF}×WÔcÑlÞe LlÇHà`Œöeí}àP­ŠÔÈ“ÙØ܇œêâÍš›‚lƒ‘Ô·êªSU§ª¿[/^¬×>iZoÚ'ø Sß C/¦d¹qê´Þ/^¼nSÊ[»Ç£6¯/Þ]jºnžëy{òÅrøy\¨Ùµ! !Îú—ÅÊZQ⹫sAêÆžÈµg|{œE1Ÿþ¨þëcvé{ÎRn¬¼”®îèò®êv˜ñ•q IµEKïÎè_ÿs–Æ Ö"7R…ã©|wF—Ç¢ûÍ4¥¨¬Ú8Ë•¢ÿØOçßëÖbkï¹1ë7˜³G× \­Z¾Õðµ+]üô\_åýÔÎJz»^h*háG±Äš‚ÄMSŠ5$ئԘÅvñÝz#ÐØâ}‰Æ„®Çˆ(‹|ö> ]/ĆР‚4! &Qä&þ U/Põ"±IkWN åé¼5m[ÔÕ¶¨Šv×:XZ©¼)nºW/éRÖ[#%; TS8 Æ7`µÒÓÐuñW®—Îtу*Z4y]W]VTfCEõÒš¨Ql‘±› .cd rÞ:‰2¹©ºí¿_Aì;£ó¼,ت@™ªºW§Š/íKFe¸F‹¦rÁÅmV8HUfW‡PéÀ¡Ê¼|\UA~Œg¯Wµ¨èÃÏ¥úAW†·¥º*ï×ɟ䥣¼´Ç/«( ¾è ø¬Œ`fW‹Øq]†8ôÑa5ê°)—6\¬æsç,S@#ÊÄÏ)ƒ°„…–.úh„ qÿ&:ž;Š¡ U×5ÅÕ¡3-µU†àéÀ’4QU]™G¯`øø¨Þ˜mv(;±7}ÖÞ)koUÛ„ºKOìóFË„¼“õ'²õÅþµÃü·Ct‚ýZ; ù‚§}@Ð8!2 ĈDÀ¥ðû Z÷;Íg“µ wœ1‘2•á|â#”õ‚Œ’|Š8xíS?qÈs3ß°E˜©CYÞ}ràÙ}¿F]ME7Ü]m\º(Kr´§n³¹žÙU9œ¨·Nˆs;3ÐöI~Œô2ðËOìÕ~¨”#wø¶+C‡ÖàúKc(sb\É¥‚)¿ùQ€v"åmë†6™W¶î\à!×}%wGq„á³ÜŽÜ]uEgöm—uàd_ìBÛ«òkLn„®oÍfØzhOx^´wà JÙ„P{ÁCœÓ×ä¡*”Ž’D @ÝÚázÍõµÄ•!к~¾DDú¤ øV"¾•ˆo%â*ÑT"¢¡D0Áq‰H¬ç!ùæ agÛàÉ´%JdQõÛí¶Î&¤åâÙ´ü”O‘2EÖK;šrô6à/ΜkËp¼sU³6F?k06ü_…®ŸXþßÜ+_õÆÔ¥å\:'o‡3ͽò54ÄiŸ°ûIþö¿û9ù<8ÜÀrÆ,À3‚|ʼnn‰ÆF¼Zí•zOn)ßdsùe‚Èôó˜Cß¾g^»–vþTöÞY&ç¥}6¬ú{zyÚ#T“À3ÛéÓ\÷|'U·MâH{¿6½±72»ÃûdoædòN¹6¼5ÆšC½¾½8ã*Œæd/ HèRcöug\ú‡ÌçlSš3üƒMÏäÁ#œ=’8y}(7Ô5ÈyZY—·û¢cßð¥<Ï j¬Z§ÈÆ«ú`KÀ¶,ò®%Óåî  °aÿ<É=z{°8 1x¡Ë= tÓšŠÖ(«šÉÿŸo©ØÞe-þñÒ„+Y¢ã¨Gdï]úÁî£-Uµ¥o¤ØÎ&CCß_¼¿|{F5Î5÷Kûr^Û宦¥Oª=Xj’ÆU*D¯JÓ÷•·?T[Ë-Àggò_ÍFºÖ?ž?$³kaAD[(sB¢UÎq4‹ë2´<èvJÖ NïËžè ò‘¥—BÖÏÙòv½ø}-¯õ­ endstream endobj 966 0 obj << /Type /Page /Parent 1716 0 R /Resources 968 0 R /Contents 969 0 R /Annots [ 967 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 967 0 obj << /Dest [ 961 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 92 347 106 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 968 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 969 0 obj << /Length 3309 /Filter /FlateDecode >> stream H‰”WËnÛJÝë+zÙ,†l¾Ào"$ÃR™dŠL˜Ȥ!Rñõ|ÈüÃüã,æTU7EQrâ ÃR‹ìG=N:ýÇbòf±0*T‹»IhT€?|Źñã8HUV$~š‘Z†oôÊ>ºçf‹I¨*51IêGi¨¢ÌÏs•†ˆ¤‚q®¶åänòÇ¢FbJp}tŠˆæè!Gù8G.’Yà»ñ bZ÷UÏg‹ùârñyþM{±ëªîÊu¹Å8´®ó^‘Ÿ¹¡ Ã<òsbGÉÍWÝvXœë¥|íð‰hìwb« â£M8Ãl–þæ½µYÐ!è¡zoa…=º¹Ú³=†”ü&DFDLå†.+%œ€^®o¹¿Q\—.Ç™C¤àc_{£Nj\ñQoÌA Ô³¶´å•7EÒ ÓŒ.ןdÚûK¼t¯xüC~èxá‡é¯¿ñ¨![§¤.c®K£Å_Éùûe·¼8ˆñTÛØ]>ô€iÂâ©ï=P­Ñ—‹K@•lhR:xÇè—ZP×&ÔÅêa€ºP`G&‘±#°ÆØâä²×õ»ã5<ˆÒ“PC„–ÒŒ.è‹xên,Ó@·í«qïÌ› ØÓô;ðlo(„O!óµ?!Ó5Ÿœâü©¾†ô?Í O¾\ƒ c`€ñkþ/ühìÀÔ ø?cœ%Œ³Ââì?/¶ó?~~,qrF¡4ʪWs]&Z6yðˆÊ—Üz9hÇД:ì9TP³G&9Ë硲ˆHá7qÊŒ1[Œ†±ê‹ÍE\¥A|(®œD{°b¥[Ú~–ßðu¤ÓâÂâv¼Õ«pkáãwÛA¼¹FúTØ/~k•õQĺ­– y}³òžƒÞ¶’©×ˆDÄÀP á#‚Þ4Ñp…Ï2(G˜ÜWÉ^“× ìÆ<$<÷j>ÿ<»þ¼ø¦¿7ͦ\Öª'˜AⳂ:aª’´ðóxHN¼Ér³ižî–Õf·-Gü$W‹++ÒÂ4àzÕgê˜"¼ícŞĽn¶%ßµ ê:h©úq¼È¤P÷§6zðŒ^˜dxï¨r€±eGb•H×<‘a•<‘O(ZêHn’:¿fèíº î°Ò6ök-Ô€†d$ÛÙzâÀ¿äïH.7»ÒCë…}ŒtÇ—Ø™”ÂÓ£Œgô>ÑÁEM^Qã=ë§K)Ù—òõåzF“³ûí.µd°é±¹ûMÙûÍœª"¤cS‚7ú&pµÚyÁ’Õþ 3|ZC®îŽJ© Š`Ï|GÀN>ó‰50ΛVNỾ(~îvãD7Ýw¼È^‰8côh°³w4¤N€²%1çäz+…üsö‘“¾ßöËݵ ·®t¤ËÝ%5v—Ô‡¦+É`bpU­© n9OÕfC¢[­–;y-’ÜŽ‰¢B-?ZËÿÌ;à?Þ’K)3l;Rù>[Þ®ùKâ$ï˜Ùò^•±«PVZT¦$3ÛÇ#E dpÐç¥ä%‘¼$’—ˆòbï0Ÿ#즗ã¶Os˜K3ø‰Û ù‡·äQ&qÁåö±A™ø1¯Á¿¹€Ê¡{ù. ûaö{†eZŠ‹˜tà_cØ 8µòu„æJ3ÊŠ!¡¥=¡åRØ%L¨,·Ÿ;Á¶›¤Î?”–ËhÁNžH‰§Ê15Ðe¯B0y8î©.ý¹±éÿþL75M:ŽwôaÀ_t¿º!>J@bÔ߉;Éôº&–3úVÊm´É'7`)ÀÌÙ_ä͵ÈìÈ1Ý[N1RˆPezö(¤Òƒ³(2î6« ‚ãÞî(jzP y°¯Õ–¬D‚!fb Ñ,#‘,­KËÍtiú`ëЕÙ]c9ŠRêáf„ÀÛûJÇ )² .t¸Ö•}IZæ! •Øn€ã¡­iÇCT¸v»AËP>™ˆGD` /$¨8¢®é£nsòN£ceÑaáQîåÇ™GDuC`E[TñI…‹PŠ#´[óWÊ8‰D(¯L]ÞCK÷g°]¹.Yãè&§L‰Ù“¦é=–‡ºÜv«æv¬Ó£8%•tb—×±KdmϲlÈ.¹e—Ìr Ú} Î/7¥ÌBÅ'sŠë‡HF>B¯ PVĶJïëî RÜÝB‡*Á9àŠ!`8WœÚ£#V{7¹¬šº[VuUË»µ0 — *Õª/ÐtÎâ’I„ûhÖ ¾­$ªâCl‡‡©Û4ÌÔŽB¢“„|pk•Põ(Ø7ÔHj$B±pRGžu ÁuŽê¹„¢-œ02ÍU6>$¶Y“e‡|?îÕÚI«Zʶ­öŒpB“¸ - ÇPð1Ê3%?³À/è&Åà™`X±\Á@naŠ¢‡¯vm×<¬ËΣŽr¿¬ùù-ÜmWÛê±»x‹èï@k!E©CPtó öS)÷ I†Ž´ü8Š˜}bn6aØGÀ¶ãùs½úôQ‡1>ŒÛk;–!ûšuš"§;;h)ˆ6|'HEBªú-¶ÇžE TP:®âþ–K›œS©Ú"ýi¿/ˆ" Øé|µ©¨EDÒâÑw±jâ#ÁÀ}ùsYv±Þ,¿Ø‘Þx$Ê·/›:›vD;Uµº¾‘nþw[ B­jêÍóË6 ™÷ûY xî·Õ.áK~>¹þ üjW$ ½­H©ßÌw|Ìwì9ÅhïÊ–­üNTA†û]=FÃü‚ý SV˜2ïŸõ§PôÆÉ`žØYv Þ8ô3b}#ˆ3L -Ѫ“€oDeü’[]Ä5Èü¹¾83à:¹w?áHW”1€9SéŸN­ÒSSÕhl“¸òˆ8Ä$+R—¹¼d"J•f]åq <…iRzŠØY_Ù¥$ÇëÑdXìÔ½š ØÐ~Î<ékUö¢ Htcñe©1ü»íªŠ1æCGjCuëeÈšF®Q²pßm#Ûƒô>h®'¸ñ~S½R•ò•ÛñPÄ5¶¹>:‚ÀRè¸î+’µið:úö2§x-ÛÙƒÁ ,¬™îöç4Ôx¾[òvf«xƒÌð ñ¬œjO¨ Cøº¬š§f…Ð,t&<på_­ÜÏ»hy®ƒ¼Q銿qñ7M?Û½÷·”—ü å|sHÜ#›9ãQ*WZÝsþt/õ¤t{É/ªòJ³MÍÒú^p†&`Xç9B ‚!ˆRªÇé#ŠÐ™‚æß´Ö•]|‰f‹»_»Ù\ê endstream endobj 970 0 obj << /Type /Page /Parent 1716 0 R /Resources 972 0 R /Contents 973 0 R /Annots [ 971 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 971 0 obj << /Dest [ 961 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 387 530 414 544 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 972 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 973 0 obj << /Length 2135 /Filter /FlateDecode >> stream H‰ÔWÛnãF}×Wôc°8¼“2“É$˜Å1låeÇû@SM«ŠÔò"Gû!ûùÇ<ì©ê¦(߯^ HvaÀbßêÖ§NU³š½[­á‹U9óáá?Q¸Qä%"]Än’y¡Xmgï>t™(:Þ㉮¨g﾿öÅ]7ó\Ï󱧘ÍÇÏû™¼Ìï”ð½L8«Ÿg >´©ç.37ñŒ\>ðqúŠ:ýEþ`vxÎÜÝDBÎíA\ê~ƒ™@*’d§;ñþû3ñ÷ßyŒq‹µØ¥v=7…Ú°¤«™/´˜q↉/ÂÔÍ2‘øˆ¤€Q&Z5+g߬ŽÁ}lñFcŠ®G‘=ÜQdï(r½"7 ³T˜áÔ4ŽÝ48‰ªQõBã“ï»~êdn$Ųº¾Ùî†ÞI1nU7Tý!ª0N¥j»¢Õ;ZŒåŹøÀ»Å†S é·Òõhø³tævÚ¨ºQbç=?¥˜{Ò£=±±ZüðY\ý»+9$+DÑl·Pœ‘¢ÎÑãu!Ùc´Ý÷n¸ïÚ|£ìCS÷¹®ÕZèúœï0ÄÚ$HÜtDÁ–G„’eçPpœÖííï„Áô3Ä´Òdn(•™ªû‹Ç†ÏYVaºUãK‚÷û\;7¿uµ•ƒ0Juþ²©óñŠ^¶®Åå%F(°µÓM݉¦®/ÛNò²£¼ÌÆ/¯q3C¾ø+ácá‰_Ò%Á‘V)r׿cÃâhÆAÉf¨_{gNÐ3Æ$¯ƒL…EÌPê($£°1Õ¾?9½( m$û¾Õ·C¯:úl àëÀ2™ ë¦V/ªÂ`ðñE~«ÊéaüÍ^õwʶ”ý­aršU>òÏ;zf8Ç{Ñ`â÷Àø¿rˆr7@'·ãÈ«ª¹·ßægÇëªÐ¥Ƀ3bÜ®fªu"d#xIûF0)¡{µµ!˜2x÷g./‘$©h8 –WNÊA°.˜L˜GhÜíá–ÄsÆÛ‚0…„Bçýi¤@Ü*1tª*Q6­ÐÛ]¥¶ šYÀ‚\4+Ê¡.zà,¯tpOµ/>|¶üF¹… Ap÷C[‹Õ—ÀHþôQèÑC;˵@Ã1”/ÕÖŸx‡9Ú‰ºa`ù²ß0¯·â»÷Ÿ¯?ž‰çÚ§†Ig~Ê:FWÛ‰py±POj×»Ö”–ã¶VûOuy㈼U¢Ø¨âµv`A(]!ž^Ç+j ùäĸ ÎÅ|½Öt„+2¦f298TÌåP r/x—pW ˜"©JòRïP©o¶wŠ+bºiÀ1Ø4;`¾ó¢B #ãçìDqÃVQªPœÍÎÏ!OrÈ@úÞ €L¦ˆÛVi˜` ‡§^ ðdY@¨/³nª~«Ìˆ¢cúñÞxÒ´6 öÊ—@ÚÅùc¾f»¢ø Wû–«åmÓT ¹òéúò§"rãœ[ª³|•º‹l¢D¬_‹,5~‰+&,ÈøÄ4¡ÌM$@NIÏg 9¸6Ññ£B€Šñ„öD"cpŽï*F¦fÇ‘DšåæGfɈYH(sKFÜÂ͈‰4ÉÃ;y=kÉ™(óÊÁf£&lë³¼RfêÈUÚ[ƒÞµ{ ý[ºÀ( @ì§]àD ÁÔfè¶P¿—÷¹î‘‹]ŸóJ*á¤á÷tÔ+·í°³Ÿkã€Å5ìu‰Ú©Mg—Ø{ÞUŸîZÃ8cìøÞ Ë=åÙù!î@qY€÷«`¸@ëüu€X·Å>Æ m{=¦à>¯² …ñ-m×ŸÚæ„Úœ©Ëy@¡OºÝl1Ö”¯c‚FÁ›êë¤ô¨ll2î "Ó õÇß\lôÝt¯ŠM­Á2 Ÿ–q Å œŽÊêP”ˆîm'4m "tPfî )½ˆ‘iþ!gà% td´+©1;„ú5§–‡—F¸i’IÇóµzjáF"xÀ˜›|M¦¡µá!%ƒéýÑnu“5X,‰Âj|ÐnÑ?çwŠû®Z©ugh„R èêzàTcv~¶˜E“I¶¹©©ßrx|iþçdG$ï:…{]U¸éžôPq+Žj|T¬Éœ‚ˆXÞfÈ ­îZµ×Í8»Ë[n‘Ìš|RÕ¶z¯þKÞ âGÏÏ“”N&Þ]€©´´ª: ˆy[詛ʜv(õýz¦¬S5O1}ÆÜ4ï°K  3÷ä!÷”ƒÝÉˉáés•ØÀÝr÷»·¿d_$ßôÆûë™ïä÷*óqðcK|Yb]e2Éàácú{K×üLÝ]mt¾{ê"Ãdá Õ•¢SÌjucºÜ(€›‘ÜS ÄS­~£:ÎÛVÍl<Ôòémö<;,&Ûƶü °©n^†/ykꟃª{Ãɉ¡ÜDš%ó_›fí„ÉúD>Sêtwi—¢SA¹=ÑŠר@¦@$¶@àaÈ÷^‹õ°«´ÞÊcþAsëìÄËÁ/’ yÝØˆUÍüá:´ûM]êv‹œ]þï.ì›.Æ›®•*{Ñìé‰Õâõi)‰-6Jâ?ÜR×Q[MÏñ³¼Uwº®ù%Xò¦f{ÊßÁŸ]ÛìllfÉ®¦Åö£«`©@*Þª'ì±x#Ç·£éø‘7Žåå«Ù¬¼¯R endstream endobj 974 0 obj << /Type /Page /Parent 1716 0 R /Resources 977 0 R /Contents 978 0 R /Annots [ 975 0 R 976 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 975 0 obj << /Dest [ 1634 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 359 318 372 332 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 976 0 obj << /Dest [ 595 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 341 237 370 251 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 977 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 978 0 obj << /Length 2019 /Filter /FlateDecode >> stream H‰ìWÙŽÛÈ}×WÜ·‰æ&Š2 3¶3 ì8ˆä—qçM•¤sQHªeõ‡äòyȹ·Š’,wǃ Ȇnˆµ×]Ϲõírôd¹Œ(¤åzFàŸ$‹ü$ RšÍ§~š1-«Ñ“]FE'kêŠzôä»EH›nøAbM1š ÍÃHý1ßh ƒ9yËŸGsÙ4§YàÏSg~ØseO$Û¹5My÷{õ·£“(ð&aì§*ÈèöH‹cÝo1)íá$ՙ޾ùnL?ýÝ›LÑo17õ§Êx*¶cZL¯ÛR‰U^¯¼É\Ñ_å×ûóòÇ‘h,ÚDŸ¢³|‰1‘àp8ø^쇪ã[5_‹£q¥fàGªpC[9éÕr’¡Q4Mý8 )žùYFiKtL2jõh=úvy2FbIð©5ÎÖ Ø"J¬%ÎG‰$XøqœÍÈv£Î¦S]XsΪAdu C&Í 4=[éÛý¦Øî¥[¨ð Uþ±3÷úùSz·™ÑòûÖc/Üþ¬‹žÎ{¨3tP÷šJS™ÞÙÔOâ8¢ T™X”E­릥^w=6¦ÊÔ»*f×axÒ+˜ûQv¡W8¨åŽ|ÑÔ}nj½"S?çÌÔéXÝ©?Ü{Š·Sèñ!Ï:o¦tëM¡Ïû>Çapô˜ž¥ñ`¼Xi;T÷ϯŸÈ˜…è¸Æz ;y s²æ5V^+êô ¢†çIJ'TùGê ÞL¦oÖpN¦Ø/p‰í4 Ûz ŸÿZ†roa“ÛX5ô[ëRS#½zOÂYó:º\ñ¸’ñIÉ0%­tßp&&ªï[s»‡Ÿ¹*V•úeUƒ™Ä|ÝÔzˆû_°m(–Q/õ:ß—ýS·ÁûItq°¸!öƒlîs^Ìu£V†Uªü¶Ô«ÏŠ8‘Nz' mFgY†ôrN2m¹6á?§­ÙlË#b¾ØÖ¦ÈK8y;g;3(õ=’À§ÖÔéžú† þ ÕŒ‰ãCåeIx©£I©‘>[ ‰<Ìw;]˜µAð×ûê³Íz€¶³ø,Xz–Ña,\®Ywøå`pÍ­&Û•˜#È908¬púÜbÜP7T5­>‹b§v@V¸{Èñ‘êÓR¶Þܺôæ@#íݽ|t¿5îžá £ˆ)i{/Â% Q“ MÅïÕÆÅ4/MpFµ+u¥‘p½i öA'Iñæ5½\6x_ˆ’¨(]5½¦]ÞöFÛC|VyôÎv÷pÉq,Æ'<`ìð"k]Ú>{ƒÄK°öÛ ÀlŒ¶ÔÊX=Q»Æv{ïïñ5Ÿ¬D´ a6âJ÷À­‡*± Ñ^C‡­®‡(²#µvÇøÎïÙpºõ{…¬2ŸøA²¯`d‹?—*ÿ”濆¶¦ÉÔæª¶ÎÆËÒ3o… îM˜{À^¥æÌ‘Á £‘ÖP—]ñ=¼Z2¿ ¤d±&¦;YËb$Ú#„u ÞN ýÑt|)¦/ÄyÕ}™¾’yÆ4ÿ¿J_Ós¬Lì4M©qÎ]^îY*ÐÐÍÄÓfR§*!Z  «<"Kñëäž(ã2yø>Ì4i=0Ǧâ2Eð'y/ôst˜1§ÐæÎ0„ ‘ŸÛdâRá„Fˆˆªbµ‡6"žÝ lE²èЉ¢§U3Ò5h¾‡;zâü’ùþ¤#àlϬ´jÅy<—ãÝý½¼[`xÿ}sÐwnÕØil×UúŠèF9 w²Df5äÛÆÑ©Ì¼xaý±ðäžÞmµxL×Èy]’'Ö¥=²UG«ÿ²7­î¬F-ªÒòlÁ+§ã§”ÔÍ0☀å…š¤fÇRÞâq‚(wÏ«·AäÞûNƒþ*}ߨJ_?÷äÉó”(Rxöw­Üû@¬,ÙAØ#Ï7H÷’c_BÈ8FDF ðïŽñ?!ƒ³¨•MomWçhݨNã……ÅS3ÕõÌk\žÖvLÚál¨`¿€jÿJ0¿LíÚÙ) fMQ1sÍÞYÂFжQY£ÀöS¹qº÷&üÚpnà †£ÇaøÂǧpâQŠû•^s%H0d„^{“l–smŸ)—Ö?¨~Ý›˜Ó´}Ž2ËV$\Å£ ݶMmî¹¼8˜~KˆHÀ’NTÊÇG%: çò¸Ûïøx*¦¹Þ½ Á¸ñÔæÚ=$Þ-_Üx>ý¢˜ºëSn™Äý\ jÛÚØºë=Vú3 Äbç(‹ÁÞ-^ýɆÙò‡7¯¬µ~âÏ\½õ8ÿþàoº+Z³ƒµöuáPš"õl ¦ gn> endobj 980 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 416 757 446 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 981 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 464 703 505 717 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 982 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 369 288 399 302 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 983 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 485 274 512 288 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 984 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 985 0 obj << /Length 2428 /Filter /FlateDecode >> stream H‰ìWÝnÛȾ×S |5$†ÿ¢‚ @b»)Ú$X«-к9²¦Kq’²¬þ·Gàµ`~r?=’úïÖ¢ßèÎKýD ³ëµi„fÍcéVí,‹ü\öSQ½÷E½WnÜ·¥iîUkW €ÎCÔÖTJ\ûÞ¨¦ª<ˆK¿·NºBôoÿøü7ö“[Ï?èº+_4îjU5Äbú0’B@†D£M‘µ©èD¿LøO²O‰]«îµÙã ¤ƒ—à/Ì8 ÝSWbmÚmÑw¢Ö¿Â²Ë¢v×F²ðf1´jEè¾€³t/MéE§\¾À%' a›—AÝ‹î\Ùø¤ìbTváòçÌTkdÀ8'“"xƒ zèYé[yØh¶¤Üˆ½Ý¹/j^©Éó¡„eN\ëÖ¾Ùó¤¼nÊz_á6x€¶u=« oÎgŸss8®Õ[Ý«¦‡jX㳇ä5Ω¼°ÊÌ¥U±„ÇQ2¹4^ÿµˆG*ÅÕ’?^¿¿;o–ãÑ~0öeÇ{•]ëµ²¢+Ï;úËLo¶ý¦èÏþqj÷º¹eÑP8¸z­¡)’¸;ÕÎ*d|<—¥«âQ¢;i{·)â¹¥ Û}­%;¬Èü0¿õ¬ÞÖÄkâ ê7ñã8Ÿ û:Tr–%~”ŸAáY@r‡…%^K¹,•¯Š•i{Ó¼Xס§-þ&²[ºVÕë—Bµ­iņ¿üj2ÀJ0¼¶ó¨ó§dpR€–FgІd»¼¹4M_è†Sï%Í\žÄ:ŽA {BýWG§æòÞý¾†0¨9¯ÊZ{!g‹]jú×OŸñ§ ·.ÍUé‰uE.”V_«jú UÃt,“ÔÊXS+È!À$­@J_W&>)f¬Œ•ñ†x+A‚¶zµï‘úx %©DVþ¶J¶dcÅ,ñÛ>9\òJ­‹}Ý¿tœ``s4 ŽÙÖØGþ9SŪå°Ðj4ãýcYž ²tõ`FŽ ,À›!quÇ/¢R=cÀYá*d’û¢×jÐ~S¥Ò÷\‡pÛí_ÃÂì³ €‚xµuí¥ôYtrtèœGl%§ J¬ €W€a‚h‰®6&¡|/\ŸZŠSÌ{ÃÀì`dÇD+z‚vJÊNW3ëæÙÿýÆ4 \l˜Z ÜîjÕ{ÜÍ;ûVɌӕÀu²>’GÚA‘ A<ÌRI É 1H·1¢6Íg^n9¸,苲û¿ iÀ»X ¬Á™9yœ»*¤(rGÄ~WPÔðIñÙÂ}bªç ˆ,f¸ÁØÏt7_LäÄmÂל?Z8++£:×,Tº¤¦¯w¨ïS‡pUµ\™Éý•YÕj{¢ã蘆dŒxDkóS¥#«¥U^us(ûAl /—©‡Ñ'ágµÑÒuûÝžSžhà ½®‡ûI38%A8 xdÕ¯$b~¾n˜ ×,vüáV«ø>^L¢9 ÿçÅàÅً稸$$c"Üý à[ë…pH€¹ÍÿžÀ“ꡳP%ûºrƒ)µ¹tfDSNtTtl+|Neg#ÊñŽ~`æ³ýö—Øýˆ½À[¾xÏ`[[eH‹XWnl³ýY ”¢3[Õë­5®PyaÁ.®ÆÊXœwõ˜*¦yçŠþÕ RÈ僭Œ*{õœŠt s¯îŠÓ½Ó¯®nà'Ã`ˆ~" .Ûê»Mÿ¼Ã¾DšªwDB=ÍTçáȬáènì[Á!jÈìÊ€÷v¦ëô À~hÁ:4YP¬+UêJ‘£¦›E…º:G žÏ9ñˑ՜©§ØôصVwR °1B²lmû–0`És膷#*M\l;r«R«ýx! ù<{™eÜ9&Hû¼g¯—›(¡eÁŒÅn äÆ¿§áàTEŸ0èS8¡¥Òê†ë}SrPo~þð×K«Öå›ùðñšyæÛèÙ/Ö„ë7ûe4ûaîKü ña5…'Îow¹ý9Ø«©*lž º}gßdv¬)Í®®Y¯íÛ Ù±v´eu¤ÕŽ‘PwmȇÔ3¨‡‚ZÆ"^Õ®îî "Èÿú®ä†Šõz qvʧÏxzË}l*+ÊŸ+a[Ö¶¦ È›?-çrùóÕ5}Éä_Þ]’oSymO¿»º•·Þ6QùiöÍf#;k6úãNuú“ÒpЦŒz0xÍq㞃÷< mcoÓ+B7c³‘r‹ž„AüØíÍ7è@ÿôG‚êÊã‰ã]³þvcΑVÑÿQcÿ/5ѧ±ˆ´±˜|†Îb1ÐMOzŠèë=…«ÁgÚWÜ¢& iPDôbh#hô<5SÞM‰Î‹²~¸õ¸¸a *L‰\w<2ýwÒ´nÊz_á¾Os@ÏæDº•eê{ª0ÆãÂa¾Ì‡¥óÅÛ#–Ù·®ë ÆC¡ñfT£–®ÅEc.¦ÐÏžvµïÔ3¦î™Íþnc=åàÆAî!Ba6¼ùÉQ ¦1䤮5U4ÚŽ&L…ÝHjÍåVQ˜ÌyŒ£/„Ц®@"(:jÈXÃëåä?ˆœŠ' endstream endobj 986 0 obj << /Type /Page /Parent 1718 0 R /Resources 989 0 R /Contents 990 0 R /Annots [ 987 0 R 988 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 987 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 440 439 471 453 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 988 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 175 412 202 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 989 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 990 0 obj << /Length 2462 /Filter /FlateDecode >> stream H‰äWÛnÛÊ}×W üÒ!`1¼‰¤‚ €O잺HR#V ´qÆÔHâ Eêp(+:Òè?ö¡kïJ´¬y=8ÈE$ç¾öÚk¯ùi6z5›E"³Å(ŒD€?øIòÈO’ Ùtâ§y‹ÙzôêÉEa¸O LQ^ý|Š¥~„èSŒÆýãn$ïÔR‹0 …7ûe4åAS‘þ4ÅÄqî§—ÇD<œž&)þ"ÿáë8 ¼qû© rñ¸÷ûº[áK$µ‡™¤)¸úùRüó¿Þx‚÷m"K/ÅêRÜïÊî7ÝVö D¿ÈBoâSÜÆ±äÝ~£y5ZûA®Õ·Ïö)ó2?“ØX½hÚ5ï_ئïñ‘šŠj;×sD‹âÃ{ú(¼LV%Nmû#TJ7sˆÏQö‹ä‰¼ø¼Çÿ¡Ä”!cS©N·Ü@+àkð/-”J¡l£±Zð`û¿.:Mç£Y†¤²uc¹S{麤ÀÄòé%2Xò2>)Ða`xòÆ 1¡bíq/ë>ã‘"¡£Èn¥k¡žÃ]VêdÀ6LæÈ'˜®éÑ5!·Àù¹örùàùv)ˆHâD$ñƒ\Mü8Î3a_{Ö¦ŠiC'vOaèG™‡„@ÐÆ9Vz£ë횖ç…ÚVØìTv›–±l6ÕªµyûZ ÷YëÁsM;…ŸÄqDx$A˜"vù¼WÀ©Î¦m6ºíöbƒ¹BÊ:,V°Œ´¯ ÂŸŒxRÕ–;i#”‡‘õpäZó›9À”Ÿjí›ÏØ„ýÞB»µw R¹¬A¦²~Í Ôóú(á)DÁiØATúJ“¼1ÈŠ&óä~ßb2ÄõR¼)*0¤¶ŸêîíéÆÇ¼ÄX§0æn¯P‹Âî×nuò­ž=m×n±‰/ÅBÑrÎôŸÀNì1¶ï}‡C¼Ïí7>®•òbv¡+ª‰ìº¶|ÜvÚÐk(i×Ä÷2Ö躩5ëô÷a ùŒòÚóµà&Žý$À¤Aߨ¦Ë &43´ÇŒÑ$$Šä¶kÖ®µƒ&„²,<»ù1O}T¾ÃÙmm NƒyˆD .s Ö¯A?#VÍŽ¼Ï0Î@jÍB(ñáöÃÍøúö“ò˜’¤ZcdS©¨<‰Ù?înXÂÏ ô@Çßtè†JW"ßSéyz§Ú¹ˆü§-)äfW÷…i®ŸÊ•séTêâ‹Û•?;”«=¹ž\ꈈ—BU•Ø4ÔFÿJ[UH.I4>9ÅQw³£îfŽÜØPã ¥ˆË¡dùƒp šµße,úR)Q$É|6ÁpxÏØ°·u©?͇™6°¿Æ˜Œ¦ ¡k´ž°>ò£éÁÂÒ‘·_#8t°j3¥nVMiÎ f~QªÜïúd…ØÏ’A^…ÇÀ‡–ªZRµa.âo«Ý–-ÐÐþÒ'ghšµÍÁq_sRè£c"{îÍ×R‰ë{.ð,{«zdŠØÏƒ3Ù¬D 9‡ƒ$g-‚á¿P‡/yë¼è…Ó¡ ‹´ÍmâˆbQìÊÉ»·¾vÕ7+Â’¦nt=/ë¥h¬ZÀRi%¦UÒ¥‚¶Q‡Ó ·|O{H"ç# ¢9”š"„kI«í{Ý ã) wX˜Ú§‡ü¼I ŽÜ wo¾zÓ±Þ`s þF¥bQ¨H˜È£Ò+´J# [³e ‡sý¸].鸄F­wkkË-ó E€p;êhpÝšåœï®ôøvæ¬ÚÙ’hë‹ Œ?¨3Ç"d}&¬u+L x[ÍRLò¦„}(Â\¶å†÷³ØÖ[Ü›Ÿ?\ßüùêóû÷»óH²?ýíîîêÓÕ‡{”£µÒ‰Ÿ¢8ð ì©«ªÙ¹5Îà%à·ÈbE«wƒþ’?o ~b†‰"ÛBÒ{ ãQšq“2úPmtUêMÕ .ã³ 8C\íjÀ_$o/“¼J|)ÖʦòþQ?§öìk,?“«Käì/×7–z¿}G‰›J'·×ðôW?DæÄ5ü á' W24ü“ƒxÄG¿ŸÃ$#oTAÌ6º%kšuŠ«á"ôFߣ[ÁwE'n]hÑpÏ…õƒÂNa{ªŠ~÷"`kôñj$ .‚|3'Æî¥qQ¡sÖÂ?šqÿ?·ÊǦ©4æá …Wêß¿+§®ñÄ™ò{"@ŠúVF$žôf™ÌíÖ]&‰*8e(¨üÚû~ÀJ» µýâ–ö‚Þ&nŒ{¬<©÷‚Œ>·(“c[d÷A¢„ù°Õ¨*¿j^¥n옵ªÎÀ#Á‡:Ø®ënL*X²%¶ÙŠÐþc¹¡²Ú ßæ¨þƒúb{RØÁ{€\Ë¥væƒ[I6g-¹½ç:ý»x¶ö¿¼/Ý_}Dѵå‚~ êÆÝÖ¬®XŒZø–¦"…ábÁ—{ý`â7lai[­Œ+/,ifÅ•x©kÝrYo5Wþ_tѽÀo|¤ÙedAh‘öÉÞsúWCÏ—”D7²îöØÖ¹7BÜ>Õ…ý5—4UHÄ)í@ãEìDl»›%ÐM!úMXßü|Q;ÖuðÝÌ}ÎÿHÝ SãhXw^QR¦)h‰MRõ]”^B©Qa® ª,S{ÏëK\_ÑEtú[g‹Ê¡7ÇéTÞ^‰ q:ØÐªHœñTECiÕÑ5¨[±—%€+Ñ9{èï³`؉©`L]„„]äŠÅÍlô¿™lZ† endstream endobj 991 0 obj << /Type /Page /Parent 1718 0 R /Resources 1002 0 R /Contents 1003 0 R /Annots [ 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 992 0 obj << /Dest [ 991 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 359 743 386 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 993 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 716 347 730 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 994 0 obj << /Dest [ 986 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 566 99 580 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 995 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 249 566 277 580 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 996 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 495 566 517 580 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 997 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 338 539 365 553 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 998 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 386 539 413 553 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 999 0 obj << /Dest [ 463 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 455 389 470 403 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1000 0 obj << /Dest [ 1016 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 462 267 490 281 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1001 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 145 140 172 154 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1002 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1003 0 obj << /Length 2701 /Filter /FlateDecode >> stream H‰ÔWÛŽÛÈ}×W40Ò F4o¢(ÃÀëñ:ìfœ‡ìäC¶FL(RËËÈʇäòyÈ©ª¦¨ÑܼA 0Æ"›}©Ë©S§¿]N^/—òÕr5ñåá~¢$p£È‹Õ|1sãÄ Õr3yý¾MTÖòOµY5yýñÊW·íÄs=ÏÇœl2wý‡ôÖ(»9Ë¿N¼h¡æž»ˆ±q˜¸±'ûòš€—ÓÓ,¦Õ?éž3õC7Ö^¢nöêj_ukŒÚ8ØI·E«Þ}MHiàÎu·V]ÑÎ|éÔ Î/tQu­wë"[«Mß:>mÔ9r¢nŒÚ5N„Ç¢KoJsí¸ê;‡ÒUó±òM™ks:ÈÇAs|èR1Hö©ežQEuW—w&ÇÃ)œ”Ç@ö“NUëÄzOæºÊøÍÈ=ÒÀ€Ü×Õ+ë[eªŽLô^¥ô× dBV¬ðÉ·k` ´Vo±LÆkžÖ8>­ßÀz€ª;G€ø\»ú×–9>íP–$rz¦·[SåØîÖŸlCˆÜ w½ùÁ]z$w¯uO‘‹t‘¶²„J† gJGV·Ø®,*ÎÆïëÎñ)BÀ:í(¼iž]QWkh Ï Öœ©}Ý« V„ ì©ÒR¦ Úž‡IÀP[3IHÕÕ¿·3(½Ø¡3ÄüÑŒzcF=›QÔvuc8WEµª›MÊ–\vs]Áõx8(O¼´5ŠH‰0N ;àoˆ³Q3®¿ Hðé »È’]äzj*rÃ0™+yª+žÏÝypDOøféÉ ÄJJ´ç$pœÑa*xáàüüz‡/ÌÒÛwE··Ðã%é ÿ i‡UÉ)L™ù®—™â–Ø2/¥ÌEóÆFè°­eö\a©íÀµÚ¥MÞ¶Î\›†kòÎþžc38q¦ÞfeAÅRPi¨âO ŸòôJÐ’CÐkëH=bêìSýÙXð3Ù㦮Kƒ}îÒ²'«í§ Æø1#{¼£nxvMqÓw¦¥W_“Iäåó&IQꪮ sóó1^Öf•öe÷Æ.°‡nÈÆÓ±B×[ ¥ º¦·ÞMyòX;o¤Cœ2G2–U2¶ƒ·_ÚÁLÚ#רºQ¹ýÈa¡ÇoÉê&/ª[•fGF…:þ@ù¾>+˜em„9Á(ç¨ DVúŠ´ÙÖ˜ÇyaìgÐ)× Ö³ak©~*óýD~-ØËf Å„@"-]Æ÷´®ÌXª·o%Õ.DBN<îk»²³¿7vN;Ú!wS©¡Ð!iÔ¶ìoq”5%rƒy§3ÒL$Nƒ¿ q¶3¥FÑqˆ™¯UkºŽ’Çž<§vÅ©õEn„)ôd5xXVUv-ª5m‹¤µg å zË"² ÍfÍE¾!êdÕòû?^kÄtÕWÙôÑfýP’ È Tþu"2ÂÚ  Žâcuž­Mö·gç ¦Æ²BÅ*h>ο³À—9`@/Í)%½"WDÝÈj©‹ü‰D§ý@*G–Ô,¬L3å¸2«Ð èD¶®5ß|I7[ê´Û†qGµtK±n·ÔS 4ø‰‚i‘Ö4­2]ær~Q'‹’9^;ÙAhÕUèã8h‡ZkÔ1÷©w>*znÊ2È“_îckðÿÔÇ‚ÿV€ ,`Z4Ñ(Õ-•Ô×µ~ïÀ€…ž¶”&Õ Hf/´~íE=Œý£mèÙý‚ÿ¬ûù§ÀTð½‘B §M>¨SA_wj#EÝR½¡Bï×È0Õ‰ÏN;gøtçO<6žxìœ!:'õnŽeÉW^{ùqO©£—+é†o iw¸zF&»6}—ÝaQò!ëf´R¼‘¦ƒ¤ç½WeZe1 hã>½EF¢ïÚn°—7 Ô!<}±ÍL2$‚DP¨—>¸v¼‡7’åx-³ö|#)*ÑÿöÒÑtÊÞZ̪/Ouý{¶ªË²Þ1/ý¹7Ufìí„Ù|¸Ì »æoÀîC >ã͈VžÅô…,4Ò¯–¨À5€r[Cõû/‹QõJµ{\AÓ-?¥Œ‘ÚAÌ÷(—ý¦î[¹M¾jÍ’Š7y¬xù(Ø– !Ëlé¾½µí’bð’ÊéŠlC-!™ 3’H³­»µ©¬¾`W:Üݶ(µ¶Ï†–Ò‡æUÕZÃÏÖR ·Oìlr4ا\š/Nˆapª%B‹µYZ!ö¤gO(Cö Lpäð%&9°}Šªå—{ˆméÅÃJ¨Æ¯s0X;X]0¹¾èÚCÕ~ëmÛÕQUº!9Kµ‚Gêc‰Ô@;!ólóToóި󣥿ùf8Ú·gh)Éxx4¦DÓ‚ûd çfGwl¼bæ7ç P4'jñ‰ f"Ñ#! P¯ÁIÌÂã&õª¡˜4¤á0Ƭ1ÒÏÛUw­‹ô i•É åJÁ´sHòmàý¯ËaƒçrŒ`¾—ëòâ ñrßîGÔ1ÛÍ’…ø*Ñ·„™¥åàźÞArÅ"îí ‘ÃÖW“-ö„aÞR¥yngË€•ʲ4çÝäœü 3ÀÓ„ª˜ï‘tÂä!瞪LVfzSÜ®Ñ窬ìsƒZ»ßç¸õVêï?^ªzK¯-ÿ¾Â¸Ç¿è8ôÅ'!’3ÊFÏÊÆO‚ sW€8BuyXþtÉÀ¸•Ó2„£o{j¯¸+¢å¥êò‡—ªê77p‹þvMÄÖX™öë€tBŸD˜½€£±#ûó‡Þ03KÄ,}"Âb…¼¢iBÇCù“V4¯”Ǿ4ç$L¨5¨t»…²Ê9»u‘­Wò |Cl4'`ÑH&ë dœªqÑ ôÆœ?ìÏdõ˜ߦC0,øKô³µ“¶‰ þüLùx›Ó‘t„k–EöÜ”Î#ÛmLŠ‹¹Œˆ22Õ—,äR€±¥P-­´CP”7{œèø2??Ü"è+Á=ví9-yEüˆÅ1C$7¸B”¢É¾²q#äî“Ü ^Àûl´bfBu2ã–¦‘?#¨Üq ð7QÑ÷jÚ¦©ï@¥¹Äd(bN~f˜¯*ªÇSÿY :!úmÍ,3ˆÂã1ᣠkä´{£NÛò×ß0/ظå~KÞ®¨ß¦òÜäò»ÞÍŸ UïŒCàLç2õ»¢Ù:<žÄ:SWõª“a¨]»Ò~D^üðCe×ðæ$_ÁÜ íUèiÅ: Q·þ)˜1ô«Ïê~»>áˆ1̉Ï9D ù÷ Iì×.#$C endstream endobj 1004 0 obj << /Type /Page /Parent 1718 0 R /Resources 1006 0 R /Contents 1007 0 R /Annots [ 1005 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1005 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 442 305 463 319 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1006 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1007 0 obj << /Length 2087 /Filter /FlateDecode >> stream H‰¤WÛŽã6}÷W B¶FwËú!³ÉÌlìÃNçA-ÑÝZÈR¯HµÇùý‡ýÇ<¤ªHY’ï“ –H‘ŪS§.ü°š¼_­|æ±ÕzâùÌ…?x„‰ï„¡³ù"râÄ Øj3yÿ•°LÑ—©¬š¼ÿié±g5q×õ`M6™u¯Û ÿ5}–̃Xýg² M 6wE ‚ƒÄ‰]#—öø´ߢwæÿ÷avæ»bæNÌÝ„=íØrWé˜ñ¹ ‰«B±ïš²ÿ!fŒø9/„˳—)[n ý»lJð´ÊÅlÁÙÿèWü¶úyB“5¾ëÄ0Xýs¤Áv»uDàx\á©Ñp¤¯®ãóÌN½¤WlâG±Ä æN’°Ø$Ø&¬‘“õäÃjFàÁwŒF®‹ˆpB|”ú¨Cr»pÎJo?ów 1 ùÒÚû9tÂ…1Ô¬÷;èñ _êTÌB€SÈoËp<絘!ê¹4C¶®¦_À9lˆx·MiÀ—7ÝÂGî²bÍTkÙ‡ý¬Ôº-§,¯kÂ<Ét±±ßëVO™•]–¬&gà‡†u/MÝ(†[¹]×Tïη®žy’³3|¾7|n 3–ï8ŸW™y~úÈš†`jDÀ·àGÔæªGá  ×/ø ¿iû  ")Q'ÅZ‚ß!®¶k”&øH¨8+Œn•9íw2e7nöú3ÕÉQVH]±}}³´}1b5{±ÒÞ`žw ¾Õ·¶h[d`Ë‹õ—rR˜WºÃËGXΞ‚–Æ3â 9_PÀ°Àˆ5ß dÅò€¸¾ã%Câùà»±Ûùñ„Ù7;)‹t¸¯p ³9oaŠÛmö±? ˜l6L- B”âšAB)j¬ØÎi@qbN€¼9$Ì^Û¡×OgÓ9-µ*ãBÂï|`RÁl˜ ž$ØŒ©µ¥„›eÒ ÍïZ„¼-™|“Å7MÖU–¥uj¦´ AQoæ€jo’Uu5»~ÀPJª[L/ž]qž[IÏoÈ-…I!æ»Ñ+°y÷¸á |µôò’赫2H ¯M­ë¬.Ù›lTAø7Eõ ̹óÿnÊàáÝ1ðöˆá@Ý‘pÇ ðÅøûHuRau§gudÂ"˜÷&Ľ ëò_ÚlŠŒeu.‰d“ðBÀõ#=È0#óꀃß1ïÞsÜ)óááMYp/æ°ì=a è2rCMÙ,mU>_ŸN6Ÿ ö ¸”×bZ ×{½…!Ž·énÊ<ÕàƒÃG–Ù²ÉÊBB’òïÇÓJÄǸÞL½Aò’æõQœOa‡öé%µó+ö¹½}îÀ>½{%£2ý¾ª›MZN½{UÂDÀëí´/¥±J2UÂóÜ{àYÂÍbè689‡yÜVo¢v²º^—Hñ 5è÷Úc¨£H“YZ¤2–œü0=‰ÝQr/Ó¤otÍó½ãÍÆªÝ<‘?`g½–&œ•u––厥y¾7þ‹xÎDDù"ârƒì¸áBž9°A5£‹õ:Ð( :bHçF? ÞñQ5 *Ý‚š? ý2ub,B—ùÔÃ6Æ ÕéÐÊeIÄ’Xý±CÉFËíš-F@¡f^ì,®"uD´HnR êœH½øo@ÖÞÙW­}…²&‰l_C²ó൷‚·ïÓ]ªÍ§°³Êux®'ãrDøRR\^Íȼ‹-`‹03L10c^”À3$E(¼ |±…/¹)FýzòaØ£ž о±qý³Ì[§E‰ž¥V‹ áÐ/2ÿH©¼ø€8&W=î=*UTY½1ÝD#3Y¼QªÍêJcéÊé–ãÛ0ñ ÂyÄZK5¾šá’n)Ý+@j%5‰³¶ôBû•GÅ‚4÷HÚ®[~ÉÊ6G]1‡¤Õ› Œ }žða«TC3ñ"Ó‹ecàëQ¤äõ‡áuî/Á }ösm`U`ó£0æ;Àài÷Uhž”!¿Ìn„²AD0;ÍCøö …1IÝÃÅ)øôú~гýà?©Â.jMOd®8±CW¿~!œ2óI.%tZp+aØJ…VP ÝZ1’ôßVÂ…4ÁØ·R#O²´43f7K¡¥¤æ BD¦O¥¤}ßÑÌ!oÜÞ|‰á3…i®Íãü°” €Í–RQoÿðx¹UîwÆt]³uQå,¿7нֹ.—Oí3$¿ç5$“)ÜÓ$y ðnë•Æ]2^8AýÍ>ãKfà®a¡°Iuöɶ¨¨Id¦ ¼ZL‰2ÇÇzöð•MÇ@‹uYdZ±-àø´#º(ƒîM’qˆF¿ËP ³á´‡7¶kJØ{À e2å¡ìáZz?s<¥P§.ßR <ºåí+|ؤ9EÊÂ÷%Ÿã>œEßT›F=‘6ÅéR»q&9a‰M‡Øù-ð6á[1]k¸yP­Ó¾†QÀ<Ò­Êç}5£ÜJ ¶ºšñ‰}46rxäÓ€?Û©) QÕ²‰S›3ÒÊ,z­ÍXŸ®eÇ­r—i¿Q ó,: þÿ†ÉêM–5ÜÊrÓ¤¦9Õéma=êtýW;eóQ‡ô°¢™Z†MKÀ©¸ÙêõØÕ€“.psžŒÓ#ì¶Wj$êFcÑ–-ÿl®ä×K Jh?®&«% endstream endobj 1008 0 obj << /Type /Page /Parent 1718 0 R /Resources 1014 0 R /Contents 1015 0 R /Annots [ 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1009 0 obj << /Dest [ 463 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 295 658 310 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1010 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 158 379 186 393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1011 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 324 379 352 393 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1012 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 182 285 199 299 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1013 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 401 258 431 272 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1014 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1015 0 obj << /Length 3173 /Filter /FlateDecode >> stream H‰ÌWÛnÜÈ}Ÿ¯hÐDš÷ᆭ­ì:Ù]{=ã—Xy È W#Î,É‘¬ýüCþ19UÕ¼h$Ë6 Ùì®®®>uêÔw«Ù‹Õ*TZ­gA¨|üá'ÎB/ŽýT͉—f~¤V7³¯ÛL-ÏñU[Ô³ß/uÕÎ|Ï÷Ì)fnÿx7Óïó+£‚ VÎê×Ù‚-ÔÜ÷) G™—úb—ׄ¼œž’”VÒÿ 1ꆾã‘—j?S—÷jy_wŒ„Ú8°¤ÛªUgߟ¨¿ÿÛq¼7ø–x‰®_›µ¼«ºßM³e#‘ÎëÒqZý“ÿ;ÿXýuÆ'æÓ„¾—âeõcìÁÝÝçD^ [ÚÕж0-=<ú^¨ ;´aKç«Y *5 “Ô‹Ò@Es/ËT ’ gŒ3Õ˜ÙzöÝjF`Šÿ0ct}ŠˆæèáŽb{G±çǘ{Q”Í•¼öA'‰7'QÅ7U?”3…N§ÕËíîj›_šmûêTaŒD_ºê¶êî>«Éy¨4üÓHÌàNv ™Á‡páùÙć w!^ïê.¯jSªª>å@Îõ`Ö"1õæýU Ø`BF^¶Î\›ÆI¼LßÚßW0†3œ¨—Ŷrè ÚÈPݽ:vÜå-ð•ÀúÆF+¢•Y_óZ⯸š<ãê'ݙϺЯ ‹‰vÛ®©ê« çË{‡ÃÞAÊ{˶gd ÖÖ_:ÓÒk É:ÔóÁòç ›zW›:Ï9àÛÑoÌ:?l»S»À޼8Þá&û«TŽù _%¥iÔzר¶CŽåMIèYW[Cƒ7yw¢J³7uÙª]­ZÓàÎ^à–LÝ)<¶FùT.ï9„Æ‚"yàî³÷ÉÈ9‰¸´rR\øÆ ˆªåÕåWJ÷Ü8”ût61`Œ‚÷¸în“wªßüŽmt©UÞû³1jêÍÀG°Û©-R™1„(ZªóI?w rØŠr|°â G<õT„ àüÒ¨ƒ=ˆ¬8lU·ëý7ôW¡GáÀbŒÑg:D~I‰˜é>DŽ Ÿsšžã#œå°ON8g8‡å/‚Ó # ¶bPÇg²3's1øÿÆq‰˜÷[ûÕ£¯ñ˜2ߢÉ"ÄëWY4Y´ªñ׵žT‚tµïœ9ªÖ+„'%JâYü}MžÅYÕnZõ#ÐEƒù á÷q± áB)ž½ßµ+±ñâ(É(@qàOBtÌY¼ lÂÖBwÄ©n¿NÝIœŒeèvLÈŒ¨š0Ú)“uÊ¡’¨¿BË#EoóÊ¡ËDÍr¨˜oÛX›Ó/û"·7( ß„çýâÔH¿ë釈i{ÿ-Lý«/yËgÞÒ|]Bwh¦+u¹Ûm ìÞæÛ÷¹¿¼ZˆWK1IŽ!¿7C°Ä½ô¿vO0eM}Ñ›ÿ“jöi,gtÚì™-ÜqþéŽvSö>hË£ó}­$cI ú’Dêd#hòÂP h3eþ4¸€Ê}Uæ³)D’—`åé¼c;2ÝXv£ Òìù#€mº†±•ÈÜZ{Ðî-enÉ9*Cð kÓSoº&19)<§¤Êp\“D õ±´L¹oŒUC\šöÍ®w;ܶХ5=ü}jpH¼×9½fúÆXYß?=¦ŠÉu¢—ˆƒÎzË}¾Þ®±CEZ‡*îÖnƒû®OÙÞSJÁV­ÀsýQ69?”ÝÌê´Þ·#JKô -¡*oíR»‚ÙSnìBk®– ;bM=]Ç÷A–ôD+tÕä5…nywèào ëƒ{µ>4ˆt#Ÿ·Ù]öžȨ)9z»²U9£öIÿ¸<‡®Àœ¢AmaÀŸäý ø«148ؘ_MÑ”ôèÑFO뇲\xÆM ®.w¦Uõ®çM’(GE„;U̪r‡ÚFžÊ#; £Üa’GI UlLqm'å2fTmPÝðPJNÜæxMô¶Â û+G/)ÓBÉ4 ,‡ÊK‡bú*·†%ß)……vàÕb¹¼²h³­Î‚”îì®cè^>ý¶}%5" ÅAÌë =Q9K„Ú¡¥¥å&œÒ#àîÃײ²Ë$Tc<-ó Ç{ý'¹r8?^LäÕ¦gȵ$‘FD‡\5F>ä ­»€v¬1 »·f«ò°ÕTmÞQô•TF.tc®Ð¡l ¸g' z 6þØuöÂA …Oòl“·"Ò«:ߪ6¿Wù%#¹è9| A‘“SÐ*»;¾S8 +M}O¯yy(ðÄâ›RŠMÇ¥ &a¼O î>…Œ'biSbÀº±©ÛúQܘ/9pp‹ðïRþOcX¢Ó(ሜ”Ù¦âÅ|˜‚#oíБÞQò¸Ow²o|ǹIZ@3Wë>A#êè§o­ä¸ â(™Ä¡[ñóQÙ‰²äccäáÀ¹Ñ3˜|ëÓ?ÒùJ†,«ž¨gð“O<§ ¯dØ®é×>™Åñ˜Å±ˆ¨L)ÍYÀZa>hê¨B–±®¹cëgÈ3%`I°°ÓlÊÐW àj·+Õ~›œì†x*gÖÚïЃÌ3²Þe‘!C{ÛWö›jŸË,æ± ßQ³ô.Ø}/À‚×FYë2¡cf2’,°šìiÖ€ hTWÝõ;¥n¯eEÚ•s/\Œ‚ñ †œp_â…O¹¼ð¥ë¬0Rψ:«À6ù-CÇ.±£¸ Ëò—ùú:€œÙG¨Ít]Ð]Rš/nvÉͳ U‚±˜­&"rÛ³Ò‹¸n DoRu×ëÁé‘çÕñ|TâI¯Q‚¤oº:s…Ûän $aEqõû¿]è çH¡g^”Lš€1ö}Oz*¹Ɔ¹ TI‚£AÃTY± ›¥MNÄ$ª&Ö%¿¥º)¥® .«úÚª0ú&Ëz2p„hb ýîÚ{Ô*²Ï$ä£R¢Ð·yè°ÑÙÇÕ—çøäÀ¼ðüxÚš<’z§Š)S0Föd.™²áQò›˜¬©@Õ 9nœpAgqq˜cßy[ò=;ºÿåùŠýùì§ó‹Þ{ò@ñ¢égpn6ÿOÝåÓÓ Dñ»Ÿbã©$•tAÚbÒ“Cb±‰ÑKERI,4€¾½oÞRØV=µ¡û‡¾™yó³ñûÆ]–¤V0/ÁdOL¡ÃˆaýuŸBV uè¾UÌýkº“iwcÝ8›Š¼–³ÃŽåÖ‘ÀÒŸ«õCrGÍooô‡Qcðµ]"º»j68µ0=ë,46 ƒzï(—†‚¯/+õÚʬɂ!°îÊF=ýÈxÄ/íã%áb Gý]ÂÉK±Æ~ ¯XFzË ƒJB†C™Ù5Ͱo³Zàþ¸³õ5a|{æèÐ;jn–z¢ïú鞟±)”­4_†îtf%ˆßÞEëJþˆ0Ád±)ʢݕŸ5$)J•V˜;ijhXhÕõ‹3Vz±ßtš D¼ŠŠ•·Xq iÍlQ¤Ë[êƒà‚':-çÜú¢i÷™2ên "Òf=À–ÏÞÀóN;ZŽŠ&æX6û\õ¯ Â{xºOeÁžŠ$”;bæžøHefƒ! Eñcr'Y#®C<Mç4Hfnå0 œNòƒá‚þò4S ?rL.ãw2/$FRHiÍ“ÙÌ…n “œo¯Ï~z”Åì endstream endobj 1016 0 obj << /Type /Page /Parent 1718 0 R /Resources 1024 0 R /Contents 1025 0 R /Annots [ 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1017 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 245 708 271 722 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1018 0 obj << /Dest [ 1371 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 652 312 666 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1019 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 299 528 329 542 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1020 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 317 425 358 439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1021 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 344 349 394 363 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1022 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 473 274 522 288 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1023 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 216 133 244 147 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1024 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1025 0 obj << /Length 4144 /Filter /FlateDecode >> stream H‰œWÛrÛF}çWLåiP%ÂÜár\åÈŒãõ–½kQÞu¬<@àPBL2JQ>dÿaÿqöt÷€)ºjk+ŽˆË\Ýçœ>óÓ|òl>•QóåÄ„*Àø‰óÐã UY‘øiDj¾ž<;ïrUu<&P]µ™<{saÔM7 ü 0SM¦ÃåÃDÿ­¼±Ê˜Dyóß'O*TøEŠ…£ÜOY—ç„<®’”fÑÿñtÞÔD~ªƒ\]?ª‹ÇM‹'¡¶VÒ]Ý©WoÎÔ¯ÿñ¦ î[¼KüD×^ «Û3uñP÷ÚvÅ‹DºÜ,¼i¡Õ¿ø¯÷Ûü/þbþš0ðSÜÌ_ãGðððà{‘otG»ZÚKcK—êÊ=ºå•fó‰Qµš„IêG©QQæç¹J 2©ðq®Z;YN~šï’ ³±Ïn@Ñœ=Ô(?®ÑÉ, °Ï(•AáRÑ}H½éímÕåûwï½i†È?üÛÆÈ×û×Ȳ;ûôVœ{ÓÈÏôìJ_yüU#xD~â$ûÄ»}bÙç9¾°ß¶›NÍ?R=b}9£eVõRõ·(þ!•jY£R)ЋQ—^õõÚÒd sÕÂÞמ·µÅ¼FUÍfÊQMs?GVOX{-4{‰gc«ž·õ?×J~PG€H‰ñÝ÷Þ” iåÎWÃ'»l#ö,¤m²bÿÙ©Æ‘lÓ!¾Íº¼˜}|7û|"s¹x—ìVH†Ä½±½d¦Ú¶­ÝôjÛÙö«}TWÚ3F—”ÆHwª³=óÀË;Nn¨çØY®8ë‰~縙ɜÏòŠÃÂJªi©JÈè½]¨kŒÌõ#†hÞ]’‹B›Ã䆻܆ñ‹mç¥ ±;¶íûœD‚åÕ·ÕKõmkåÕ£Œ;Sn¶26øƒ!æeÚ7é•w\ð+Ìv¬¬„šZ1+¦*(Ð|ˆ3`è‹Ù|W WšÀ伃<$™<óM ¥E°S9ï$h.G¶ç_¦Og g‘i!­«àG‰û†ov’ú_ õ¿/W[be&Óe¯ºÛf»B¥,Ab¡ÊNý0äÈ ÌLŽ–ïSåpt0 (d<êü#­™F$1 ÿ]‚ÃÔ‘>Ìâý(° zÐÝõÜ€M¹¾ñ˜ù¯¡-ç3.†¤OÙQøq8®°?ðê+œ 1JѪ=)fò`þÚ]|"ªçúí¹TÑ=}Gœ†»Ïô“3=¨AðttÀÜ#©É÷R“K¬Øžâ|qc{L5¢3Hœ¦x ó‰ðÞ%z+?n1$†dŽ! 1Ø7É J %‡ß£šXR",ƒ\ /ƒìºzPV:IROk¦Êè{®„ˆHŽ PÕÔ¡–gªh)ŒÚˆ$ ¦åÇÓþ’œâÈwØ!ËŽÉÉ‘í“võ˜Eö¿Ð¾$;¤‡4!H{’ï{¯GþÅꌾáVƒftþ w£Ùù»W—s¹FAˆIL qß+J˜ûy€PÉÇvʵ UŒzÜ‘€%°ãÙÃG¤ÜG ’ßÕа@|Ç!ì³&iîl^"# @=Ù=Úm¹ýs"€>(;ù®Q"¨»õ"9 #ŽŒ'âO…5WÞs6ul†H¥‚§¦ ÄkNng¹ÝT}ÝlT¹r¾M#ŠŽÔ$”¹Q–;1Y5äU`QëõÝÊ®¡|”þª¡»Þ®¡‡2 <2ݬUuk«¯õFtåÆÃÔfé¡©W-“Ü.hr5,»‘n«_¬š›ÚÙª€# w‘ /ÉÓÍuOúdÈû†,û‚Rø[}׿ôÕ[|_O6âÏaÉX@Œõ6Ø·H[ ®ÇãäÇÊúVö]°­]7½ÚÀºì±›F¤ÍÍ¿óHMmU¿,Ú¬dY[ê±^I‹}±ÍN‚ø‰óåÖz(ÆÌHÜLá ©ÂäÄâ¶ÚD£È·äÐ ŸwBäõ†#¡’™z§Sf§¬Y1ÞÀ™› â-žX¶}ÇƒÈ 0Pë­d™ð‡|A~m´\©;©o)F[Êß)j#u_«•-åVõöm½–#‰C‹CÃG#CÑŒÁj¢<“ØÀr/ÕkÖÍEòã?³%yõWv#3nó"Á‚\\§ñ•†4\‘T¦ÚIôó»’îèŽ;ÔnââÊÃ*·ü> ±RÔK±;¼@%­‹…Âàæ¸ûx‰|uŒJNô`®ÒÜ™«ËŽÕg[®@ú’iO÷=K‰ö-· aYÆT—«±úY¾oV÷V¦*8”a(4…ê%/ì°V¯–l¦ËCìí¶Fåu+FAyœò^ꤊD;É}«å¢ìËkN¢•ô"‹³zö™@çüâïž¡:Jñ”í+ÿL2,îȯ¼3u× u"ŠôõJPýHçÅ{WMRÐg‹¡2w¬¨œ‡ˆQLxhTsýD.ö&WYá$º/]‡yÔeÅ'. yÊ rº‡¦]£¤ lÊYnŸƒ4Ý’xNÉ,=Ôi¹E†¥Ø¤dXeQ>Qéé¨Õ6a2DGSC}í~;d(-eÁ ¡¢ü´“—D•~ïø/dªaÄn\iÜTrYô¾õPޝbùÁ#ý9“lÄiôü’ŒÇ=åÃ*…‚C™\|–1l¼ÙÅɰm˜¤pÈn¿ái/Q)yÚ£€< íÆ¸C(?‡|ºéÞV:-»k›»¶.©­úêçzCT;3ïQ£Ò¦šz¤4¿„38%Ýkk´<õÀöbÛJ[m­ŒÚ2W=Z1ìž8=~ñ }4uÈï0FÇ®OqEUV•½ëE½ÐÙ凩“êßmÕK—D“¤†Ž  ½9ômË¥Œ÷XûÇ :è„ìg‹=¶o꺶 aJz€¿åúNñù*רEãÑûO2`&ÅùHoCh~’áçuÚD¿~EC³á©»ûUæ»1ïÝ:W›Ó¾§‰'ŠM*©lÇ>)7c?e £ä¥õîq¬íM Þ‘dPd¦ç_ò õš^S§trR6‹fBƒ{j‚1y |“^[y×Q“sÚ¼`ªìÖìú¦µ?Ô0׬Àé`<ùŽA.g4ôÓÛ±É88÷D-èµAiÈ1ƒt¥_ž¹Ov«¡áŸ±Œá€ØH€ñbºczâ/ƒ]¶÷Uqå\4X=ÖŒ7¾*)QÑCá7.˜ƒ’á+.N;”UèTßní™" ñ©ÓBIFLCôòìH–s·^TŒtF4V«ˆtFnÕC½Z‘ã\ÖX²ØR ÏÖ HúRP2Ï0©GéUÅ‘k3ú¿Œ—_o›JÅßï§@y)HNêå«(RnS]UºI+Õ‘"lHêÊ$·ùö÷ÌÌî²^¨Ò‡(–Ýawæ7çõ»Ú9§#S{²‡N¦|álÚŸ«?‚¨­¼Øl—1´ÛϾÛO߶ײ]·Ô3¿n¿Üü­ŸÝm5ùˆy"­çÉGùB|HrœxêðA † :Ø U`N¤NÞRJ|¢::BVåó+gj5;G"s”»G±1‡êX¯­ÏÛT¡/ùQ,S¨%™5e=–î”4Œ¥+¡s3DúÑCÒ^žÛTL2wÊÅ]OɸMàá:lçÜ›6W®ì¯næ"‘=|×O,šÅ’ØýæxLN].’‘e$•`¡Ax¨¥ÉI²uU i§ ‡¦¾˜|tõÆñ~N_ºÙ=Úã; /±“_Õ‹Ògƒ¶ŒH˜U{öJkÆ! -Ïø|tY0ÍùGÖ‚^íô8 ßœ<ŒòêÖõÜ u|d@!Ó¾@Mš½éÅsê­ÐM…tÅNÿê‰0ø\yù׌à$Êñ^J‚ó"’Hkü‹ïšë|7s±pêf0‹\¥`Ý.'ÿEg¡¶Pql,”¸Mñ;&Hr@Á¾¨ ŽbdËE°ôšîñìx¨aPÄ ±áAœ-‚3‘!ñv¨èIbÄs}øEUó@“ž‰7[H/’‡ó¾Dr²Ä’æ‡I~JGãy;½ŒÁcÝÏNÎE§=x/S÷óFHÇ7«,ü Ìüo‘{âÔç6Êö¥ˆ¨RRâƒ\·¤O öߨn¿l?Ö‘/ix}û••÷}Èigò<ý-Q—eÌCüZÓ‘åŽNÜaæIŒÜŸ{Ï998´­Ï_z¥e¦;œªúOΙ…3¡!ü°ÿãºØhÈO­M?2¹Y=‹Ë€Œ¸8[)Ke*Eö9Ô‹,ƒIÔW\&5)0`¢‘ª ÆŠ™œïuË'´NX B­ºo\iµƒ°¤möµ”¢4[Nˆ¥ ±DÒ0éÎ/Wй{àà~ ðÍØ‘Æ ‘©-Á#E_ßJ)W±·ÎZ›×‰¥ù¯µQB,?·Î!óÎÂV2ÕƒÕź´—®,͉â<(EWIªYá2†ÏzB{ff¸ŃNA.„æéE*ìŽFuãkÁÜžî¶óƒ°¨^ð¢nËèG3‡©r6ásD–öɃ1®ˆ]dH¤ê¯ïJBñb¾/hÿ±IŒÿð`êÐ2õQ)>ü”¿!qü‰é©¸˜_¥ ØŽW˜Û_µr2Ô®‘Ð>H‰ ëTQ*V.A¥Ëå;A2ùFJx”¡Ë•>B«æùì#ÖÒìÀØö]}þ©øf]u07_è§2&‡ Mïw‚6Š’+wŰ BW7È21¤ZI`^-®.Ö`ålÕ%•!Ö±.zÑÿ¯¤1MšOtÚŸmbó/Ž»—¨$ ì€dcísX˜àñxØè4Èܧ×+éÒ—ý±ù+.À$|­÷ΈK” eéÁç¶mºá*(êÛÝáËιtû¶:Ÿ«‚XÙ b½µ"1ItP=탡x¢LÊ‘§òŸÊ}@–\¢(óp*föì$Y¯É¤á™záRi’¼±sjt˜¢“ºø £Ê_ª[å$Ç¥¸™pS=ÏÇAŽ,káq]y›FGwÃÊõyBú0ZBBÊlÞ^,GÂÁú\ÊÆE´ãÝbÛãð;VÀÄ=_Щò³åûÚ$¬3qF€¥~QVHÌ£¾)~"!Q+ư<@†î£A^ÏÞl˜ú²ñwÿåY©öU;L)ðèx¬öÁ;zÑsóÓº{êHÇê>‚ÀšÝ µ›]µoº²—Ûµ‡ûCÅ‹TG.˜~U]D¤¹ž´0ÁËÇ¢+ƒ¦£Ǫ.‹Ž¬ôiû×ÿÆHÑ endstream endobj 1026 0 obj << /Type /Page /Parent 1718 0 R /Resources 1030 0 R /Contents 1031 0 R /Annots [ 1027 0 R 1028 0 R 1029 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1027 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 116 649 151 663 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1028 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 120 527 147 541 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1029 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 225 277 239 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1030 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1031 0 obj << /Length 2522 /Filter /FlateDecode >> stream H‰äWÛrÛÈ}çWLô4¨ Ü ºUÙòîfSönªÌ§Xy¡ˆ5 (ÄP´ü!ûùÇ<ätÏà"^$§*û”R‰¦gzúÞ§ßÍ'Wóy(1_N‚PøøÃ#ÎB/ŽýTLg‰—f~$æ›ÉÕm›‰¢å=¾h‹zrõÓ§@Ü·ßóý{Š‰Û½î'òoù½A gþÛdƇfbê{³Œ£ÌK}×τ|œÞ’”N–ÿ ±ê†¾ã‘—J?‹'ñé©Ö+¬„R9à$Ûªoºÿ·ã&øÞ‚–x‰¬_«Kñi_éoj»f&‘ÌëÒqgRüοÎ?æ°Æ¬Mè{)>æï±Æì÷{ω¼@¶t«¢kÁWzxõ½PviÅœ~˜OQ‰I˜¤^”"šzY&Ò–Ð1ÎÄVM–“wóÞQ€-þsk ÖõÉ"’­7x¦³ß4õ=üó³ÇnàaÉONÜa´y+®['ñ¦RmB?Úçã’¢Èká0[Së¼2ï›ÝZWk%®Ë\çæ¸nÌ9u#,¿B;l†ª©ÍŠÐ¥í३|xh7Ë9©¾°gN¼õÓƒ2G`\®¿4Z ½Êuç'R/²î):Á/¢Í7Ä‚/«{±¬ˆ¥ZVÎLÖªzßð -Wí¥hj%–ÍV°ž…nÅ|¼Í·å#=Y=ªDZÝÏæe«ú³.`éEÉ7F¤¶_ OŠÈTÚŵªKûº…ú©¼s¼;r©;äØbp*± ¤ Þ K€%Ei=#·Z¬h»§;o62 ¶̼$3YÀWNѱëœ&7ø”„ötWA¼ibS¨7‘;¶‘ȵÞV‹V—b¿‚‹À¬ ±R¹âIåƒç¢Z:ÈÙ)R© UÃë|£Ä®.Õ–˜+ŽU"tQšrŒÅ†ûj½6ZºAàEÑÈÜdÈpÈ“ÐȸP"/ gJ¡M¢E’XÎì/* Ä[ Æ–NÌ=•͆ÅBq*>òÂD±®BžøÑ!5¨•ØýB}å½$¹EEŒ½*s0+¦”ºØË¦^?qÙgÙ›å`Ø™‰Û¡Æ@,­¾jn/èM¹(h®­@UË!]ä­iÍf·Ý"MD«ÑEÐaN:~äcù°mÊ“'þÒìц¶—b¹Ó;ø©£pW*PÚ›MõM•Ãú¦º_iQ+¬‘4Öß"˜fTžƒç^;tZ8n~Ø;-ì*9Úˆì{ürwD³Ü>IÆ$6 VOS&«8F6Åf²‚…þäºÆ6Uݪ­6ïf£i£®(“Í÷Ju×=2b’a‚ë„!ãÈz†þLØ,3S`%`j§Àë«^¬rúèÎ8ñâ®C?-°?¥—θ§Ã/çai{AÆ]©»)=Œ‘3ôÓ~ŽfhÙçg?ö^róiòI£EWøª—£iÚ»ñ(CÎ)9 ñ|nž>ü2µ»wx~|>5ÏÑaTÜØV­˜÷ôê(› ó9õ­u¢JP‘ÝŒ±ÊgIÓ '£‰ë:_Wy{ó8Ÿ‡»Úñy$ º¦!`ÃŒ`XJ$j3¶1ÀGïæ6:‚Ì]O°€`pZ/–dæpkà·fÈT«ê7Ü™§G­&õ¦é؆QÕb0“?èSjZ˜4©n•Ì um(Êíó†•;”ßå›P[ÖwüÌŠŒ9ÁÎFo,ÂzEâ܆Ø_k'2`ƒ¦)*…+ȼ¹¥™ù-§= ™RžÖ"3­%¼Éxêœp ÒQo‹¾î °•Ú`8E@ØŒð,WŽ0À¶˜Ã¡® ìb[íZc<ôƒ³žÆäÍ!¹Ç ÈäÅ“8Ìœ[TM8°XWÀ帜ò²ìl{TnÊÌ¶­„i¹6•ê ~\刽Xýè„ñ¡?%]Nc¸5ò2’¾= &#uj€ÐïÎŒUh£)Ò?¿½Qˆ¾ö¿¯ÄþKEø¯¯†G¯K§Lº‹J‹]]ýs‡1—?ÌMj+ꦉTnÊLN}]ŠÍ®µs*Í(ßÔ¶ùÿ­­€Tÿ/¡4 endstream endobj 1032 0 obj << /Type /Page /Parent 1718 0 R /Resources 1036 0 R /Contents 1037 0 R /Annots [ 1033 0 R 1034 0 R 1035 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1033 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 252 322 279 336 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1034 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 105 308 146 322 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1035 0 obj << /Dest [ 910 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 312 130 348 144 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1036 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1037 0 obj << /Length 2253 /Filter /FlateDecode >> stream H‰ÜWÛŽÛÈ}×W4ö© ŒhÞDQŽ1€×3X8qÆ‹Œ€EâÉEµ¤Îò¢%[£Õ~Hþ!ÿ˜‡œêjŠI°×@€a ûRÕÕu9uúûùèÕ|‰PÌW£0þáO’E~’©˜Î&~š±˜W£WïºL݈®¨G¯~x ź~„ØSŒÆýç~$Ì×J„áTxóŒfVh&¦?K¡8Îü4`½V&²âô5IIú“üW„Ùqxã0öSdbq‡Úl0IåA“ìt'Þþp#þöoo<Á¸ÅÚÄŸHí²ØÜˆÇ½6¿©¶´Jb™×Ko<“âŸö×ûûü#{c{›(ðS æw˜³ì÷{ß‹ýPvtª¢c¡Gúø üHnjc5ÝÏG¡ÐbMR?NCOý,iO Ü1ÉD«F«Ñ÷ó£3â[‚—Þ¼G¤õÞ™ÞÓ4ðñŸEà5LõîœçÞWÞX?éÎDÿ—. [õËN·j)VMKž-þüA¨z­k%J½hóö 9 àòÔ,Eî¥~&·ÛR¹ÑMÍ˾8=L‰7Ë…9l•öfˆÜòöxl.âh¼ÐFÔ»jìÜ?}Ü‹¼N© Yñ5ªõ*Å~£‹ «BðvüÖ›F襪^y‰<¡8 ñËÜä¼Ëx44¬HA“ªE^xSŒøW±ïæ_¤B\¯…6gG:{¬Ý‹£ëµÛüÔ/)ñx÷'Qåõ./™Øx!r¦W28!&'p£¾ç„¥2¹7ŽÉ¬²îsÑìLÿ] .±,T×ÁÑ)6E> ‡,’|‡_”ïs^îÔ×árÚ$§¸<=ÂÌä—`)òï ¹lêòpûZ°F ¬äHZ_ò`L;ÛM Ï¿ø2'qü²iü@±½À3¡óó¢iJ=EJN8ê÷²»Ò7ŒÊÜ€¬ÿe³Z}*ŸÔû€ÉSK2cÆÆé%&O¥«uÓ›²¾¡š–jeSÇ-P-mâ2òžk·ÐZä;BÉ&7 Ýî½Z&xDLÂÊ ,8‰ š¨ä¾ÕF1ÜB™«—0tf>öUmMG[–À²ÆZAÑ”¢Ó]D¯kl'(èxBS«ðúã_ò£xVíÅû€œ7DOûgÅ•:#@ìô¢$Óx(:à1ø8ì8ºITÍR1ðàU GÂ÷eùhl•}ÎþO'…ÿ5.ñŽ(/óI>ÞÏ­÷oï>>|øë“|òDgÉžXíê†z)‰ãKÞmÏŒ¥{Û8ŧjøÝpEÙ…†Ü? ž@§g&~ú}MüTÒ™%Dq«J£Ó>Ëz'@̈́خ*•Q{4PàêÒN*~Hмh>Â΄yo†çkÇT·U`ÉÅP\bi”D~|+XKXýo°4þïbénvLÀÞEjOÒE›\ô/oûHM?úJ O‡0¥Î›*!H*’S¸Á{öUnSØRª‚|ËVáZnŸ‚àŸ˜t –w»¸š-‰ÎˆÒš…!$OÖ+p6A]˜¦§— ì9åÞ¾*-?Œä¡³pc—¨Jy4Ü:yžqG>««Dð k¥ªñÅOteRM8@Ô  ,ë¼ÅA3}Éh E^©òŸ•ûd@A»¨-x0Qå?NÒÞÕu ³qlØöŒ7[G}-É-œJþÕY‡®tF‡.ÄŒ¼·ÕÉïî?ÜÏïzÿðhÛÎs®ËœšÍ“¤^A~ ¢÷ÃÀM ^™þ:ͳ7#hl[½TÔorô.زUí…ǹFŽè9t±O^0y xL¾ ¸U4ʨÑ8E_ä]ïÜ—•ßÏGÿêù† endstream endobj 1038 0 obj << /Type /Page /Parent 1718 0 R /Resources 1040 0 R /Contents 1041 0 R /Annots [ 1039 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1039 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 631 272 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1040 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1041 0 obj << /Length 2073 /Filter /FlateDecode >> stream H‰ÜWÛŽãÆ}×Wö© Œ¸¼‹2Ö Ø^É‘‹‘ ž1è"•‚³‚ÉÙMÓa³©à¿ qo˦h©ßOMß!}[{_tõ]û@u?XÊb´ÔÃÜ00•mc±BòËšbs9uÛ”SÓÝÉ:°Ò–åÛáÞTÙ¥£¢³Âl[rŽ DUC¦Zºa£w‡P"Ù ÐV ¿¦ãXÍ{oáA]?‘ŽX™®æo&f¦„ôÆóéÚ^‚ý÷§­û=+‘®{`hG·|èj–‡¡ƒX1;³Åغõd 5“Ý‘JsŠÀÍŠëÐ¥éçÈNå ˆÏ¦WTýNPWè®I@…·L˜—8ÆžšZGôüZgÛ‘z,í繺i'@cÆC¹Õ±šbFç+~0d–éî,cõûNŽoelb/¹N3m9¿²þ/ÍÎÍ•ˆ u|ò»¦i[²7¤5ÒÁ©ÔöPf {7Ô0ÝÆæ¶…<ÕNÇô¤®|tðj \ U0‰u²™÷¥08 yø<õÑ™#——$‰a‹Ô6'IÃfÝZ©æ<ÇÎÄqØQTՕƨ,°(4‡QÉ‚ŠIQjtH‚úÂÌTÍ\93S5sÅfn䛃14óîrøD®SÍ™‚°G†V‡=òVRYô™Ov‰‹òr‹ô÷é/œÐlêEq•ºªûX§ÔTïa¨oX6ºé<áì;\ðÜ)Š;TÑÜ Ò\½ üóà:;ÝyYÔØçz®Þ˜ñéÏÌaM­×Eã­çâŽ$Ò¸ÓJsìíP½æPám'•çƒÕ Ú@žs¹1™y9OÎ8Šcÿ*¿J†"L8o™ñÆmhÁ3‚Æ )쟠åÓ©Vü'ÍR ôƒäY³äê¬ÒãÊuLƒÝ÷ÃtꉘáØØH¿LvÍD˜L `–E>€}pQ?éËë-Q’'~ô›i‰¢ßRKÿwZ¢èW¶DZË ˆ_Ö™<Ïk;I á2Øu&ˆ´7]ÿF3^§˜»C³ßV¿ÝdRn ”7 ®ì äñì`Ë~¨Î³œêƒå8~žÈ¾ØÃôêåŠû…]ñwfË-÷K|ˆ;$‡´@ýí¶œFe¬çäW½hÏìKÿ„Àâ&©nºF¬‹öø"=>£rî@å¥mî‘4LÒvW4í'¬rªO{·îþÔ¿ 8H®—ÀÜô‡“."aŒW\º5,H%*Yj -G:åê€[w#gƒE¼ ¼ë+÷)ØBÌ}‘8Ÿ¶­F註âýÊ/¸9ÆqÌ7ÑäL†É)Ý£KFÌ…æèÝ®øØ§¥f‡6ycwv‹; VÄ´ÌIoþ;ì¨;èê[î™ø­—ßšû,i¸¦Be«½~§9„ÁEâGOØËÏHP€®:†|eþørŠ¼Î¶QŽž$»°Ûeøÿæ½Seœ ÆŒœôxô¿»ëÆŸswÙÀ kƒ’† ù»žÑã°6Ì£½:zLo—4}ÎÄ蜉ÑÅRnKè‚Gmtå*Y?ж?"9:´^“»JÁz«ñ–90ÚJÏ '®¤b”‡½åZZQÇÆÂ¸Â9/7‹Ïï·#øw…'Þç„Þq÷æ­ŒOß~—N~Ð&*¨Î:{,š2Ýt`¦Ž ÚþbT“ÑÝËĵ>ë³vUí¤2%3ú[h{§}m¦DšŸÀq»½v hÌ› ¢øNWÉñOB]'ù±@eú]¯›V®bX;d,/å‹Xb÷Æí}±Ê\”—föci¥rÑáF˜äèªYu8^bv_k!@š0aefËWj®ßAƒÐp ©ôæáàÈÌÉ¢\Ûêи-³@©ÝÅLÏn)ðâ›Áàó3£8çF`¶â(qû¢ãžÇ9Êú0•ýnßz°pö˜„«ÞŽrm›¸˜z½ÀúzÊכſ•“½8 endstream endobj 1042 0 obj << /Type /Page /Parent 1718 0 R /Resources 1044 0 R /Contents 1045 0 R /Annots [ 1043 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1043 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 452 137 474 151 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1044 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1045 0 obj << /Length 2996 /Filter /FlateDecode >> stream H‰ÔWÛŽãÆE^õ ½¸ŒhÞDR‹Å¶7^làGA€xóÐCµF´)R!©Q”ñ?äóSUMRÒÌî"€ @C6ûR—S§N½ž}¹^G*Tëí,ŒT€?üKòÈO’ UÙjé§y«õ~öå7]®ŠŽçª+êÙ—ïîCõØÍ?BÌ)f‹áñ4Ó4V…áJyëŸf+^´RYà¯Rlç~Ⱦ¼&âåô´LiõúŸFQà-ÂØOu«‡³º?×ý#‘¶vÒ]Ù©¯ÞÝ©¿üË[,ñÞâÛÒ_êÒ t±»S÷§²ÿ‡m+Þ$Ö¦Þx‹•V¿ð¯÷×õïgì1{~Š—õ[Œ±§ÓÉ÷b?ÔjéXl#}<~¤ 7´ã~·ž…ªT³h™úqª8óó\¥!"©àc’«Öζ³¯×c0âS‚ëhLÑ ("š£‡%.G‰$˜øqœgJ^‡ fË¥ŸEQ –CTƒX| C?Nü•—û‰V¯Mu2箳õ¦j 3U¹yóJѪ¼ÌÏtSþR½«ð°Ôô»?½‹ÇPð¼E‚!UÖÊÍòpp®e©‹°ŸÄq¤Df_±-m‹Ä¶æ`[Ó— ŸRwꃮå¹GœµÞÔÕY™Í¦ûàù²=b“ßâw H°ò£ü" ápf(G~ÓÔ½)k»¯8«ƒÕSY¤~6à‚¦ÎR_oLo:Y×}ÓzKƾõÊk¶2úäþ¿áà)òåƒwëÅ‚ÏC´àÇ«|ŒUî 7µ*Äx±{ù9»—“ÝKÙã¡i*‹}žLuô ÕljGc$®F¾¢ºKtß·åñ·½†šLÐ>cR1Â릶Ê?ƒs÷£~k·æXõâuþ‰#„W">£Ùn?zÄ…gc¹ !úÞž¼E¬:(DŸ‰r<ÆFÇ>8ÂøÜ‡.J;˜l˜ªb,²áÞö}Y?ª~Wv ÕP%µê5?[›«SYUªÜVÚÀfDÿ(Ÿ,VZåžéK¨[ ‘–_ ¢â_œ¸‘rc(àƒ®°'¶/dŠ1Ü)¢`{:V|ñ»¸ðƒ%’éiZT%½ÕMÏeA„®/þðšµÙxœê9O8 õ~&ïî §LÕ5jÛ´jþ‘@|¨LaA@1V`žš¿•7æ&|ïíÜËô3únÑ0‘…c‹ï›ž‚izEàÓœ™Ã9àž{Œ§Û’¢•ë¢'â*ЦÝp2›a G¹ÄþÊÒ兀€í«àŠi7ê—[Fö“…¾kNö‰b(Ls{²8%8Ã${èA€è®¼ñBö»Î_6å/“=[kªÅ©i«Ë¡=…~XðvvQ’a4ÆÕÿÎVÞ i=xèµä2HØ<5%GêÐ6®Ý>àse÷Ýÿä×e Nº R§­ˆ•=m‘R¡´º¡¶2 ¿€~„£dàÂzÊÐâ÷ÂÎ]´ÂÜ_ÅŸ­á¢aȪMñ/; ·>«}ÓZ_ý¹ìw °Lh¨¨á‚.4Å$Ñïa`¢Qafp 05í|j8@þpÑï$*§ë­Ù¨f ½±x±'„!\2w¼çiW;I&4iDÎ;*×΃¸Š4e:Ò` Ž`lš¶÷o[1dc2Š©ÿ-³D`£„â·Ÿ€WÌ.-è¦òk´ÃmU"=K[×CJà™„"‰/ýȳÎã›;4æª9A×<Ñ>ž1öIµòLI½Þ–mff¥³·²k l…½ÕhR“Ž®©Žnø»#Á|þçÅL’…¤M1]tòQÅdNÅ,IÅüoÄÉ3Dj‰‚6äGÕfÿq™ðÿ§N8ünQmO¬ S½ðˆï¡9¨–QÉHǰɳÏ$ÄTÞáL‡Œõ΢€{óØ©î`‹r{Vè T½;°ReÕî²?’gù46?Y ŸLªÚ”Ûèj¨•$ºöèW=4ýÜÀ’ .g"Äh²ÈQ¾p‰ø¡nWt¡êÇrd ªÝГ Üqñ)Q-u‰ºi÷¦âªsw½]ÛÔeǾÜQhí‹Òd –‹Õk¢7°/èˆ#ø¡§^±ÔbY.Éù¦Y{Œ'nK-³G-…… »Õ4C~Èô£üçâuëgìºÀ1K[´‰©*Ìpâd$ÑY)ßÁ9tkêÕdœœë,Q}IUDÊãzÝ⥼…SÞ†V]ìh?¢/6|%áŠF‚Ôl=›•J¾“Kð£:x‹Ü…ËÐÈUãfó ïÉù¥(XtÅa3×ûš«½9à±Ûò‰x>Ôn#‹Ì)å]P&Äàò]f ޏì>뜷—V×Ù¯ñIâ%³ëÞ<’¬X" !ÉÜ?œ‚-:¼Ì¯Å‘ ­`X‹¬­ ;; æÎÍÞOGr°ûÐÁ«ãnò*¼Œx'’a¼Óãz¡$Ó?Úó›çµóÑ+Ì tÍZs‡@与lÙ²†ß*œKõKwPë$iáå’ (bE÷>Èj/´©Cm^9Šý6ºPñQz£<~à þ­à-Ç£$´¤(ú2¿&}¬ /E,‡PoŽÐ&5þ«mb]t’ÕD+ È\½Rk/"ed` †nÇß•qÉ1¬ iuÏÕoªäèNÈ„¹Ø• ÉM™Ãe’Ê¥o‰;óº?¸þB2ì³¼Í'`£Ž[4æx‹a£E>ø ‡è¹%¨Ö¨¦·ÇN‰´¤†ZJÉÌÛòq×ÏiHø¾ákéÏÖĨõo§ã‡\’ ¾ämH:¬^Þäý×O9)¯©[)5GúD}úºÍ'~:ÿ¯Ô{¾yO»fq•uðÃߎV^ˆ¥ÒÛ.¿¦å;üž]hmX`ö¹ø`ó³H{FÐ^>@ 2—K¹× ‚°¢ä¦À/z¦kšäÆŠk ¼¹»ðG€yâ[“‘Ã褜ÎhYí° 8Ó½ouµqµ+°KÂwÀJÍô9¶¦Æ›¸êáÉTB>bK:OFÀ¡chrö/¥Ð8#Œ;u„{O:µožLY™:/¥ÎKížÜDL9\Všög~«ÊŸm®Y28ÖDrôÙ—Êz½¿>kMJýGÝYÜ23íÞÌ«'+k/ÖÏa­¦Ý^àyÀúž”,væÑãŽÕŸp9Ò4 שׁ“9»Ï'Q»‘Ôç“Ì‘|ÞÄ TÁñÊþÛ,/•ëÄê‚M¼Úй¬ótªót È7¼ø‹Ž!ùLÎuöztøÂW¸¸Lnľøø¢âO¦ƒ,ù¾é­”•J®‚«i„¾³i,ÉŠ^Õ¨´®3mIÅfM-³™&dî »YuåþP‘ Tþ?µ%îSmMGS_TýÙdU&VQÑÉb±¦ÍùOðÕý¹F$®¦¸ï÷¤ê3ÂÆ½Ü3vÆ}94àâí±‚í#²µ¦?¶nÇ=ÔòŠfOµ›i”0ÀmÅ«mÛì…T_¼<§£¹’5Z¸4p"=—Ñ¿û®bÕ†a(¸÷+„'{H!éД†lJ·vIc ²•ANp¾¾wïdbêÐÁ ,Ézº{~ïn]:ª‚Qqµ)šnÿÔõnK_XÙXÿHÍ>A*®×¥fͲ¢ÅVTs¶q£qãC½¥›ƒÖמã½C±Y}WÖù‰WVQpjwù™9H­C?µ,±m®VwІA/Y'Ž^k²%Qñ Ó8¥-"ÚYküx§J˜X&}ìÂ@a~WKÎÒûé¦ÀÓ‰–,àûœá!X“UF±Pó&¼ sH­²âƒb N$Þˆx9$èÇmµx¾¹}Jó…µW×$§×9‚º?xû`ßuê^/ød†´aÐ7ªJ‘k²xYÎPû*¡§‚Éã}ŽMÍ+g÷µ_Û² TÇsž¸ätK Z\ëT¡ëb¨ÇýúKg™ô‡»·Ï‡_ uš3 endstream endobj 1046 0 obj << /Type /Page /Parent 1718 0 R /Resources 1052 0 R /Contents 1053 0 R /Annots [ 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1047 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 195 730 236 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1048 0 obj << /Dest [ 775 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 593 103 607 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1049 0 obj << /Dest [ 874 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 307 347 328 361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1050 0 obj << /Dest [ 1283 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 235 316 249 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1051 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 475 153 502 167 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1052 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1053 0 obj << /Length 3111 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õyIs!qIJ¢HcâÀ;± /œMÑKâÉCÙ1K‘IVùüCþ19UÕuÛûà…áÙìKuÕ©S§~X޾_.#ªåjF*À?üÌ’ÈŸÍ‚X-Ò¹'ÁT-7£ïïÚDe-Ï T›U£ïß߇ê©~„˜“&ýã~¤ÿjž,6 ”·ü×(åE©Z~cãiâÇìËk"^NOó˜VÒÿ0:‰oNýX‰z<¨ûCÕ­1iëa'Ý­zó~¬þñ?o2Ç{ƒos® /ÐÙz¬î÷E÷oÛ”¼ÉT›*÷&©Vÿá¿Þ?—?ŽøÆ|›(ðc¼,ÿ„1¶`¿ßûÞÔuK§Z:[ãHéÌ ­y§·ËQ¨ 5Šæ±?C5]øI¢âžT¸ã,Q­F?,Θ†˜œ{cðn@Ñì½!2½ÿqàã¿,ׂÁýÁTÌÿ©î¬ê֦ëLÖíL©Ú®1õb?ÑOµkm®Vu£ŒÂ3ÕÚ¶-êJÑýtf*eʶVVåvUT˜ëa¼¨T³«ºbcÕƒÎíÖVyQ=)Z&„>,…'ƒe§†áÔGu–µ8žOk”ýÅl¶¥}ð(л–ö$Ãïß.ïþòÓ»î–÷Ë¿Q˜§úÍòíû¿?hLm³¦ØvbðjWe™ iå‰9S+Ù~JÅœÛÜt¦õtÝÕ-ª¢“7„7ÂðW•A L‡þtæGáƒç+994s94óƒB5ó§Ód¡äµZœ†~”œ c½ofbŒì†^‚kªÛî°µín»­›îõ+…Á¹fkÉPžòûVá;?Ò$„Køx ðÓ-L.³ühV<óçщYaoU(FÝÕUg8þEõб¿ÐÇmyÄ€£ËJgÞáÌ¿˜@þõ(=íëK«&¼þ9ÉÑ;‰3Ìıcþ5;ÒSCv­· ~áôéñôcóI¿!ÈÍt×5Å㮳-½†šŽ)D_<>XpWue9/ny’á0 ÃM]–ð\ªŸè¢åÕ™'JMTJ”»*ë>í)ñA—ÙŸ½îü‘ç°ólÕ) ‰bpÉìmàš™v¯—{æ}Jq, a!™aÙ²æ5ííV=)³œŽã+^èß'¢Ã~K¹ ©Mcjj¿ˆÉµ‡ƒH3à)%Œ?Ï<ä£ !^F­šzfc'|TYYàæ¾—‚¸¯©á“Óp ÆÎcç.ð¹³k»“8ìÖ[èGÅ¡ÌhÝÁ>Ûæànà¡x0këȬcŽuyN,Kl$ÓÝWo®Ì‹ŽéÚçëq"wûÂÒ²+@°DeŦ(MW30%[+Óª¼X­lCÁT P'Ç–!¤ê•z¾3M_1øÒY÷rtÃÁ¡'7 ×þJ®œT2 WFŽ+p$þ¶Üð cÕ~g‹©ŸÌ¾)žzàŒÆ{'|z¾ñ_ÕÝšäsGß–ó®Û‘†«M[ÎܱÚ6Xkî´Ý…¾–ÑpHÔ'$eÎäyë@ïaW €ËIeTo e¡ž oÚTâBç ÓñZ‚yLӧ˜FMuPð&ôK¶k'/ Œ¹{ðtõÆ6“^BåLPÐý/Œ!%q•F/z`¨%…=%Á³WP/å¿;ZyeRY!¡§ºæ™¥Çp*=ú[ï (÷ ¢%ö´ê•‹ù;r6&Š/ìü#ìKo䯃…î¡×7’÷ôåæ”XÊé "©ŸfcÏwˆù—evÒ?’/n^á¢Óó#QmBfyÏE½k˃ӵ(c‘ÎO¡1ÈÏ[.+ í¾‘3ÀOT¹‘¿˜_ç².ª'd\‹²I¥PªZ>PtB ×TzCMuBàž(QÄ Ø! _æ°MÑâ7ßUsf_Æ(bt"hÎ"¡*­·äô' ½™ïÀ§ä3F‚6+H_$ÜÜY·Ð K%•W¬>tŸSíO»“7’¼®æåD%?6³NOP¹–iòjâðô«E˜ÃÇšñº¡\Ç>î…dr®näKç~É^·*™S:±6KõÞý>x¢ÆhËGÓÉqûãy,}Eª˜w‡@üèg{¤›ú]ýÏê7Oza6}¬çÛÀÒé ª®uò€«äWÂþ®Øk³“YGmÁc+Ÿ*¦ÐIcɲ¶fÊ jV³BÊ~ï6íì„ ÖWæQbRi$X¹`ì qœ Øùä e¯&Ÿà¨ã+¶¡ tíJÛdõ†$ä##—+Ê‹[ìåÕ%2†¬»Ø›xÃæãmŸ\+|õìO^Á‘}þ ™döi9Ih¨ÏK—th= Ú9“×õ‹1L‡À¥ç**<Ô!ƒ[>Lý`ŒïØòg/ÕwÞ„B㾩öƒi~&=ÍË=+I£—Áy-hDŽ0$"ÆGâþº¡üV8cgç„‘)0ÞYµ*Õ‚¹DR<Ì]íæPÑcLŽl‰bO)£²5Õ¢Êâ¼5ŸkУHK\Ô^!}?BZLûÅ$Ñ^ ¢ÿî„„ÇÜŠ^ ÂuE‚ë¹È¸úÆZ&nYJ8Òîgf¤8©ˆF)àN1ðεp÷˜¥}wAuSäø¤HZêuno2g¡'NºQÓ=é?]I_DN)-ÐIt+Gî}-ßNxNä+6 §ÎÈåw'Ч8uBBnp†¢ß²@?†`XLuË‘ä‘MÉw~tØ6e[óÍ º.0Ï€³6}GaÂýB¦â)J]Yý#'qÄŠøÃJ,Q”nÿHÖó žÝAŽV¤ú ýŠg«y‚ÌÝrFSp +M%6 ¥sîôõz‚ÈER¨»½,¾l1Òc‹‘Ëf'Ê@*·è±†9͉g°töEf ÿ§¼ r†à½¯È¤&ÂMâÚqë8r©ª€*U¤ ¡êó™õ’4¤E\¢4SÛkïîÌ8ø¡5´¤r{Ec²¦=Wã´lóMjOXtO¯Åu?@G¹r½é!ë»-¨+CêÕÃK௒‹£°Ì{Ûï“WGÇMc…·s9ÐHÁPó²*€7 BS®ûmB6*Í(*5O,·]Ÿº’=ƒ:ùìÛ®19–þPÞ¥óvGµîš±û¤ñ\Î{b?ˆ¬OüK v*•:`w§O¡\ 5 ~1mE¬K€•&rKSZ²8#}-J/Bdx–¬·dTËåŠ#³€—_:%Ú× ZΣ+bò挼íÄúÐ&ë `=Xdg?_ïMœÕÓ¼&<‘ÎôˆŸ%y›—EÀ™—­!çvFä³koaµOXµu_ õCÀ}ìÊЛ`Z³ö’Àÿ‚‘‚×Cš|µƒpÅÚ@ž™lgý`޳ endstream endobj 1054 0 obj << /Type /Page /Parent 1719 0 R /Resources 1064 0 R /Contents 1065 0 R /Annots [ 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1055 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 507 577 523 591 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1056 0 obj << /Dest [ 675 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 456 412 472 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1057 0 obj << /Dest [ 669 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 221 399 238 413 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1058 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 276 385 312 399 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1059 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 372 113 386 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1060 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 276 259 290 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1061 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 289 195 305 209 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1062 0 obj << /Dest [ 910 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 470 127 505 141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1063 0 obj << /Dest [ 1066 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 137 100 178 114 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1064 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1065 0 obj << /Length 2334 /Filter /FlateDecode >> stream H‰ÜWÛnãÈ}×W4üÔ ,šÍ»3cÏb“$ÖSÆA@S-‹;I”/ùý‡ýÇ<äTu“ºX¾ä!ØE`Àjö¥º.§NU˜Îf3_(1[Œ”/<üá'L}7 ½X$“ÈS/³õèìc›Š¼å=žhórtöã•·íÈs=OaO>÷Ãû‘üKv«!L göËh‡&"ñÜI ÁAêÆž‘Ëg|>N£(¦Óßäo>fǾçŒUàÆÒKÅÍ£¸z,»%f|©H’mÑŠ÷?žŠ¿ÿÛGøn°¹‘,OæËSqu_tÿÒÍŠ…2+çÎx"ůüßùÇì§[ÌÖøžãcv9ÖàþþÞuWÉ–nÕt-DãJCÏõen§–,ér6R¢#?ŠÝ V"HÜ4±‚'l SÑèÑbôa68#PØâí{cë]<"Ù{gŸÔaˆ”ƒÈ“I4qßþ&Ï7-…09Ϻ¬{¬õ»“»·ÈPâÅtôðË«ý½~ê¦á @zfýsgh3t=ì¡i"ÌgOvqR8·l‡5Ëvžo¸F)7]8ð¤çóVù‹bÕ9 >uÓNš—Êìf¥‰ó?˜òå8*•BÁBÁ‰Tv &+Ê[CrÐ3=$A¹0qG9Õ릌j«²ËŠRÏEQþÀÌ—ÈA¬-±›ôÜé²MyO¢çÕÖÁÙUC䬧‡ZùüX¹T:.¬ÒÁG©U$+En”1zD¯è¡¢mMŠŒŒ›ªZiȹËVNG!y^PFÅ;&½§ZÊ®kŠ›M§[úT’TB_QÉK˜Õ˪ԆÙ_ôâX|“z‘mV±:}á ã9®¥²*ù†svªŠ·½MoÑ,ýì„(ª !ï–E‹øÅR¬ê¢ù4?`&?è*ü%78Ê>ÅYm·=šme.ty[”'³<nÃ^FÝYÉ=ίÝf²s@LòYpþ ¢›©]¨g^,Š<늪´B®­žZ ÜÑWý­C Î#ÓUCrIßbº‡kÀ¦œ¿_i"·˜‚‘Wë5 Ú|ꌩ+øGÒ,ÒÒ¦ ©+ò¬ÎnŠUÑ*7ÙLðF+~®ïÌZ®1MÖlÏ®ê/EíZ²ßØù_L쬫rõxí¸~ÞB^4ï[@sÚÞ¨öØ+¥Ä^ìÌÊ[þ¤RÀ®à±’¿˜ÇæfèP3Õi±=C.K0r˜½…ÊB0úäCeþ‰Ê‚߇Êüÿ•G©l›Ïþ¢¶À~^#B³–Jûi~8ƒÀRŒÎC`ýYzA0h±;’šî@>‰¬m…mˆ ”ä&ÈÈêgè„q†7}mWAQgóæZ‚iªšSŒ€€ åhö?ÍÅ«Ï?¼<ûpùéëßœ1 ½$MÁƒß5  ¾¯@¹z3oø€(áç zuˬYÞm²•°œXoÚNÜ€ˆÖõJó;*”kX‹£ìI›–,Èêñ‰µnªº)È çÆmÞu7È϶¶äøC•D‚¸Ê»vç ¸ùÜ8èP¹tõ×/öü¡×@V¾‹§žÁɈ4Yëp5ËV«G±ÎØI쫽hµb±)sº2[¹â ZQ¹¢M]G €ôA#š…¤ï8ô$ÜGݤ¶aT6Œ$ó»F°¨ˆÆrΧBó³ºÖØÌ,îÖœ¸†´@Å{"rŠ8ï^£€ÂZÖt[*b.“ÃRñßTŠ@!1ö*E0ðÞ~¡ˆ@éPûu_×kÌÞáéÆQ” îxó¥Î¿Ãœ+¯‚ËÙÝéuûz]ð'œMM÷ÿ_]ØÇö-ü`¨!ª8®j3Ò„žDšÿüÈñ7ŸÔ!~Ïòñö>õ)§ÌÐ<-ÑEIJ° wZ}ÛÅsHšU_#µÍ”UmâúþnÙ‰‡ÀÄæ*$ûƒÄsbWâ€}#ñ¦T;F¦[]mˆ íÏáØ@˜1CÓìÄXöt耱*8>ÒÂì¥&8Ì è ÑR–¢6U®Í–^èR¯]A|*­XÖxL4¼Z6˪3Ý;é)@qþEçÄû÷Ô¢¢m[ö]z ÞÞ´€ï\‹Mʵ›ÒVìgNq/ð6 4†rÔ×í¨wPØbÇ«{¼U3Û †¡o¡´³ÙÊ *ÇtêG0A}ïdÊp »ÐÂϲ4Óò˜Y´ff†©-_¯+‡:€ù!V;á‹X±ùq~:TÙ\"ÇP*[¼ÊG»‹ ’à­"L¤-"ÖC]= jw–ºGEL1ØË·#ÅÉ[dÖÔ9Ô¶‘lô$”  0Ø8Ômí‚Þb­ug]į*ó Ä–º3e«§±XN‰çEÿ¬K¥ûô!w5/=”fü.\ò»±ÛšÇnqøä±»±I³o³²*bè$«¢l¥Fi"Ñ8q´îªb.îÌ­_/¾¹s÷Õ¯Ðwè²ÆL8õ‘YòMh0ú€§‡&  ¤ÃfѶV [ÐâÎ S²ÝNp ‘*ìñS¶<ˆÃ"czØÊVœc«,/Ï6¶Ü˜ŸÁ ;€šÌÛÒJANšAf@ €XñGûà§¹ƒË¶°T½±g8k7ˆ¶ Y‚¶XĦ}û6§iu…0hÑÏîSn¿Þó:÷¦ =15¶ì¦µâÖVРoZÕ視÷{Ò¡›i1)kX-ê¤ÄÉ©\õ4S1/¬æê¬™ï–+sû ¯(wÝ¢³¹¨pa·iJŠáÏL«½õÜ©°n„N;rÇÇâõŠFÍĨ‘šÓÝæÄö1¹Éøér6úÏâ5‚× endstream endobj 1066 0 obj << /Type /Page /Parent 1719 0 R /Resources 1072 0 R /Contents 1073 0 R /Annots [ 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1067 0 obj << /Dest [ 1054 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 426 652 467 666 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1068 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 555 259 569 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1069 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 289 474 305 488 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1070 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 270 259 284 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1071 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 289 189 305 203 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1072 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1073 0 obj << /Length 2341 /Filter /FlateDecode >> stream H‰ìWÛŽÛÈ}×WôcÑ¼Š”1À»qv7°ƒ$# @ì&¹jÍìaöÝj FbJp)ºEDsô£Äå(ñƒ?ŽóLÉpj–¦~Dï\T1‹} C?Nüpá出íleê~c»²h7w¯½ ‘Vn¨ê†gõª(ù¡4O½Ù(˳zøŽ˜]çâè'q)¼L‚0£(ŠK¶€!‡UÇÁ¥ü%ìF?‚¥å'~„ƒ¡xñ}S÷…­É˜ú5'#séœÐ¼ð³!„¯ÑŒúvSôEça‚î›Ö#¼˜»q¹³jÎëáìÉÇpæÎ¢V¥#v¤?cG˜Ne’Ê릩 öy.ª½rP¿lL<.N\zCðOtß·v½ïMGÃP“I!åù«&­njÙyáù ƒÉ¶ œ|q‰ùÉ£sP5¨¯~k;Œs ÈÌ—T­2’¨§ˆLV}£úÖK€©½¹ABËfgëGe{`KôÛ¢W›€ìÕS!/Ý' ºFqª[€”pI •ómÕÙ÷N}tó )ô½%coN5ŒbH?zª™Æ7"U(â F8xt<‚aT·/KÓuûJu}Ñï;–jM¿oØÕ°·UÄcd2Ÿ€³Æ}K¡§KHrZè§øv5ž¡hQ·USÕfÍ£ ?µä~®ï^+ SùÐ"‚XÑí×éU#+¼y‚0É,.ÔÌ@/k8Í¢s†ÿŸÖpü_­á ö²á-ñ†åæó“<‚S¦å—šRS;,f„Å ÈûÞùJ=¾ZêѸpêîA,v¬ê¢ì÷E%ÅUñê#P/ã~«dv'ÔÏî8Ù €ªšG[R‹>9èX:Cêgg±]Wæ¥ÑwW¢sÂlæ™êñ°µd(”À³h{m+Û!ôEÞ*ùGŽáªxÊBÅ-sõ1LQ%ú=5Ô¢~„Sè…zò˜³ÙñT·s dWŽ•§BjìwÝ%9¿(öëЗPÄúÎÐ zÔ¢“Õ—Û˜AHcÐ!’ßߊJ’FçÝ¥*Ä«rå²÷¨k®,+S©F¶•œ«9ý¦F‹,èX5ÊT)ƒpÄÄC³¯6ÄW“MYŒÜ•mk(°´Ú*æM3ýLGO2Ø>ôS+3ó´F2éT|QëP…Óuï^µl°Q}!¯>É!2¸‘B—V£jƒ´#Ú¥X` ðF¡PNËÐÒ2üõî’ʯg÷’h&À¦®Ž×K@nfã%öú}Óo† y%Ôâ_´À/_N,¶GJŽl:H¿mžZKÎüùG™ðöOoù[Y{Ù„ƒºÐnGÚýß)á¡á!Îf¾¶@™A¡»‡pê ¡ë ‹ìŒÕ@„Äzs.I‡Ö·&§ðkºÕÊŠ£°=];¨$rý™Ÿë5#"Vrú“Èu#K ïÎï‘òªúÏT}LÃSÉ$£$ŠÎ¤}Îj\ÝZâ>¦=ÙÚ£EÃÝ;¢ÖˆD!«jêßøŒÒD–ˆ¢=ô³j>ÊA ²çW5ÿ«šÿ¥ÔüéÕö¤D± rñ@Ê5¬ÈTÀG$šqºŒÄñR·ý‘¥ü$¼1£ÛWÔ¬U/}¹å®¶77_QõWš+vä¶=t¬€ÉNœ9É=òÖSn&Ç‘ñü«Ž‹Ÿâ"¼©Æ.=¥ü°c(ƒÎn ]!.9ôÒ’Ĭ‘ Ο9à4\S(©9Ù%d{E6¦d¡Œ?z‘”¯\À#€!ÿ¿º„'tž]]òáê’‹Œ ùêB–EñþÈŠÚ\ø{6æGÀP¦~´DX°ÛˆԻЩà|-8¾z=ù­ÁNÒ›•øšõ ð†oîÞ0Ü™F‰rgZ²Kúü-Ûy¶Ò‰DRåp‘ÿÂÑò=OyÇÇ©ùCi¸;ƒœRoÜ…®á¬¦—[ûlæ|Ð:•õÁh f7ÿ¦Û®¨77CÈË÷ï$¸ƒšÏX¹Úªb`‰P’V-Cú5µ—ºÊ«h‰ÿœn å·žFöû$ Ü]**‹\±érß0×ub6GærE›SkK9¸Ñp™u‘sœáQ3R`&ú&óG ×(T@3Å0Ò—å’û£‰od¶1ÌMGŽ'ñGEMá4Ÿ­{!ÿ¨`É4’¥y¢pûB¾ÃØX; öv5û÷Òòž… endstream endobj 1074 0 obj << /Type /Page /Parent 1719 0 R /Resources 1083 0 R /Contents 1084 0 R /Annots [ 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1075 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 712 259 726 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1076 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 380 671 395 685 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1077 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 535 259 549 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1078 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 380 494 395 508 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1079 0 obj << /Dest [ 1254 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 482 216 510 230 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1080 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 272 202 302 216 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1081 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 452 175 494 189 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1082 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 220 104 237 118 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1083 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1084 0 obj << /Length 2795 /Filter /FlateDecode >> stream H‰ìWÛŽÛÈ}×Wô[šÁˆæý20 ø2;ðÂk’ÉE¶F\S¤@R3«|Hþ!ÿ˜‡œêjR”FãñX †ÙlërªÎé7‹Ù‹Å®X¬f®'üÃOxv8‘ˆÓÐŽÇ‹ÍìÅÛ.y§÷8¢ËëÙ‹ëWÜu3Çv{òÙ|¸|˜ÉÏÙ‚1_X‹_g©~)±c§ û‰9lW¿ãé×é*Œèí¿Ë{X{Ž5w};’N"–{q³¯û5V<©,X’]Ù‰××âoÿ±æ!î[< íP––#óõ…¸y(ûª¶ÒF|™Õ…5O¥ø—þkýcñóLG¬£ñ;ÂÍâÖ´¶åÛ®ì諊> Óø¤KÇödn–ÖÚÒÕbæŠR̼0²ýÈ~l'‰ˆ\dR Æ ­š­foc2|[œãl²ëPF¤Îj˜¶`C`û~ ¾’‡¡{“¬â™ÉªãqL®kûí¦V¿ÅËMöUÝ—]¹¬”^Y•UoŸPí«KAOycÙ« ®\¸C÷æÎ œKN4z䥶“Lã‡{À;[X+‰DUkôºúmËWªƒk±ä¿ͦ·æV)ßZOûì>»Ñ$òׄ÷@ö}[.w=>€[W’ç(ð3ž;±FVÝÔJ£ë$AÜ9™˜<-`Š |•¾+Qê4&Ò¬Öê‹;¾Óõ½t‡„¦JÙOþH4VÉ DÚ‹ Éù$½€qp±o£,‡ˆ£ƒãÚ’¼H›hêj¯áü€‡Þáåàu`¢Fc x4„\ªá\Wy›MË,6 Zœũg(›?AÑFG‰††íß‹USU… ò—.Å_תÀ.u('tîa^†“z’íC îÃŽL¤²·fäh$Ûn«ò<ª½€fÿÕÞêL„çD~Uó-]ÅÒ,tA=Fò=‚¹žßÓa6J›[ó7u±Àí?.¹‹i˜¬-—KH±F@ª67«¦e˜'(‡Y$N%²žµJdEàûFd‚ëÒ%²¥ž_µÍr$¨îi¥ÔìÛf„SOû ö⡬*±tC—Ï}9²Ïi¹ƒC½C㦔{AÔ(Åæ—Ì»2+Ä2ñÅ2ÿJ€‡'üž ˆcÜa3?¹× ¢øF-³£m¢b‹½ÙcëFx|¡‡qìL ý0ƒ)¡C&Qi­Dݪķ#YQ¶ÐUJ?8I¼¬ófƒ]Ôë´]DEî½ÿ<µ‡¡k'ÁjÿAí?¨ýì4f ΧH4ÐO¨=œP»ËÔ‚ÚßðVš&±Ä Všçëùïay´x946§!áÃȦù6Œ¯p‰¾Ô¨G&æñLŸx#ÿ=eòÑþ7ÇI¢‚ÃÑ1ð§U ÚR"¹ÕH4ZÈ("] ÿl%‚I?ûx3½rÜßË۶Üdm lQRÌâåÕ¢˜Ï¡)ë̼uÊheUö{=¨Ú¦z’&ÉÄPÍ`¨â„ ýoÀO1Ó°ÝCÙ¯tKf¼ Ùoð¦BgW‚ŸšÜb8›3(Ë•©0 ¢×'@‘ >é×âíõ{­4–gxxï,¿?†8Å€ (3"›kâ zÚùX"$ûwÑpึ7¥º#¦2 ì‰pšy ”¥J `€Òíz:mtÛ–ÛLÜå-mÙö"Ïô»U÷—J_ëvç`¨øen暎Ԁ5ËsÕuÔípÁ"™H¤T=Oå~؉óÿBåÞñÙ„xŸ•8²Ê– ª†Ž@êòi8Eþ˜"3V€ÔÏ_ˆb|ùI #»²©;¦Š?^Yhþ$/º(¢cz. |‡R˜”=e+79áI»¡~ëI¢’‰ž “ã•ÈPå;rOG(|îµÒetQ³g;Sû-ÎjU^ŠãO‘³˜üÇÙþÃ4Ñ3RÌ€îZe»ª¿4Jç9¨ÅÇ݈¯éþÞöOÊ0Îû©{¸‹uÙ K5É­€¤¨Ê‘’Büºƒ€Z*=9x¤’~reO¿R$Î?¦?„˜„Öqî¢SIÙ1ßwû:êÿ„øx¹c3Ƙ§SÕ ºîè@Ø× }Â@G8Æ9‚ Wé@I_[•mÇg]œ Ë 'y Œ'õ¨->6½&?~§å°QO=}ôd¹X…²§ìúÖ,öåýŸc¡OÜʪÅöf½½Ó¦ún°]3g©è‘ò$Ù²íP¼ÈªVeÅÆ¿âø¹­¬ý˜åÐp•ªIñÚç™ûŒ§7èÿ±ð¾kš¶É,é…¦(W{£ÑQ8µUuA|Ðh‚­ÚP u_âHQ¥g²¢NšhTiéØÍó‰Š2WÀ®±×î*4$7Ö(Ñ“äBXR Ñcž'É=œÁÊêB|¡º¤òŠ\Žä/ŸWfå/¤üpõñµ.â/W·•Xí꼀胑 V°ðå¦ÙöšèÜK ¼×Ùbô½B6w9dHÇ]„9Eª»ïÞð¨úôyñþ çP~ÔwCþ]à =[5·–-Þ÷º¯ªŽ5ÑXX’ÒÀ'÷£¯¸­š§FÊ Mr¤ÕqÊ€Ua»QëFš¢K–,ôP[¨žSNóåð2¿‰É“m¶š–ÅU­Ÿ‰—YÞã-æ(>àÏä¼LúÇ…R£ÉÌNaÄ”Oéx”úÉØ<;7½Q·xîØ7Ì1ð!Q.0[³¼¥ }œ¡®§Ydö˜Å?†shq:®PBp•P‹où =`EúXåŠb‡7õ F©û3‚±žþÕrLDÞq• _hذøÁ ៞DCiÂÙÉšÇDï¦dóœÈ3ڒϯñOšÜ•×Äü®¼Züôþã¿3å3`à»B€«tÃÙÇÆæ¶d"ØÑ–À¦ Zžö*‘³ Z¯ ˜'AŇ…FÄY@Gh€…Ì®1’@Ç…@À ÀŽ*ÉOOF|´u áòØÎ endstream endobj 1085 0 obj << /Type /Page /Parent 1719 0 R /Resources 1096 0 R /Contents 1097 0 R /Annots [ 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1086 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 297 646 305 660 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1087 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 571 267 585 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1088 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 212 501 220 515 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1089 0 obj << /Dest [ 1066 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 349 439 390 453 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1090 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 439 376 455 390 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1091 0 obj << /Dest [ 1026 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 197 280 233 294 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1092 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 316 196 332 210 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1093 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 183 148 199 162 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1094 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 112 335 126 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1095 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 183 64 199 78 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1096 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1097 0 obj << /Length 4172 /Filter /FlateDecode >> stream H‰¤WÛnãÈ}×W4æ©Xvó>xÆ^ÃA²»ë)ã<Ðm1)C¤Vã|Hþ!ÿ˜‡œªê¦¨ËÌ8°Ø÷îªS§N}œMÞÏfV5{œ«"üá')l˜$Q¦ò2 ³"ŠÕìyòþSW¨yÇs"ÕÍÛÉû›;£žºIF‘Áœùdê?wýkõTc³D³LJ^Tª< Ë ÇE˜E²/¯±¼œ¾ÒŒVÑÿ¶èÚ(˜š8ÌtT¨‡Wu÷ÚöKôX]ØIwM§.o.ÔßþLS´7KÃT7A¤çË u·kúÖ›oëª]ÓR«ñÿàï³?OøÅü…³+ôñ v»]Ä¡ÑZÓ±ØG†øŒB«ç®kÉ;]Ï&F5jbÓ,Œ3£â<, •XRáI¡6õäqòq6#6˜Zco݈,¢ÙzðQqì#oÉ<‹pŽ[LÖÏœ%Ë"‘wtý&Hñú&°a¡Û'us=›]~ÆÿŸ\UßS¸[ÿevýù^cf¦ï~Ñq˜¦Î8tF9œa䌊ÎH4Y ô[i¶8ÒêNÁ|j¾Ý¸9m¯üþÆP„q±ß?40Œúúùe½©6¯ÎnAÚ|XP–4ª¯6O5¶‡ƒôc³êk "ƒ U‡£îC(iÚ'Ì0°†º×• ©¦Åì¶Z­^a<‡Gª¯X ÷ü˜¾ØÄ5ë •/uLcpMÍTÃà„ÐL¦pº¾!;íGùZ?ÝÂÔ1ÌRërë®®Nv(`Z¿Á°6õãÁ4Á³ÝÅÜzp+¹Ý:ȱb'}ð:.kÀ;!ƒÌ–~UkÎ×Ï/n•ì0L–šýA ‘zÛ©Øæ1H|ì‹T«úë ýÖ¬ hð„+®±nÕ6˜8@zë…ªäë.e˜%#¸¤\¾ð­ í1sc€fŒ²Ä_u€@FÍ×­€¢éz‡Ž5(Ïx!Ð}_ ûDöŠõÍ­4/%œ>ûa¸†ìTÀ˘WjвûàäI¦K³¿\< ¢­ð›Ð&Uy’˜Æqå U;@ÕxZuqzsM—È ÀIEÚwái¹Ü–%M7ÆsùÚýñµ„üý1Ñ4K‡çåpx–Œür'xMè,ÉÅþç’ ÕÐ1`B ޼v£?Ýò0ŠƒÖøU×nú=ð甈nÀ““€Å  ÂÕ¬~ã˵™Eñ¼¨°D¥ÖfÄ¿™ÊJ /¥%Ãö¨ªÜé) ‹Ô=…é?ÁyÞÌÌ6/Ã<;ÚN…;pdÆ#ZµV¼e¢¼ð´Ú1Õ™}稉àç8˵üw³ÎÐkòõ~½NG¥‡¡Ò¯Oƒaòh_‰ ˆ™'‡%о¿]æ­PrÓjý[½™ ÆaþtOÇ<¿”Gä̶Û4=8^Uí+ø& Àm(ŽSÍÝîêÈ‹h…?@2ÃÀŽ€|IT,Ù“$Ç-(Ô4câa`²ÔœE­ä]κ eݳȋM‘Ðʲ˜¤ÀyÖ#Q6XC¡äDV?^CGGû½zÆé/“¹‡^µXP€åDǶ¤Ž¦gA„ƒ°«Õ™LžØSäbMƒ-Órá¯RZŸAH rˆi%‡ÐW-^•ÿxReH#”S‹þC´˜‹ÒÁqTe|‚ã'%÷‹Ç¬¶±ÐVÏÍüÕ6ÌGö͇cã½Ta˜<ѵ‘{N³”-SŸ-)ÕÜ뻺V9ÆÐ¯dxXí†tÉÿZd…Œ¹F;¯y燺ßÕu˜3ùÔdƒ×ø‰öø‰9žˆ8JõÿþNÊ^ íüÌ©a9Ž{3:´#Ü“×û€ÃÉ¡fÄ1ó=ue+@Ýàª.²‰3àÿ!/ŽÎ £¬t(˜-QJˆlܶ󾊪m¿~®úf^­ðtCš‰BïJ±«7}§^ªME•Ar®¡·R ¼Ãï;µ~©7U ×mçKÕS,%¨(T½’Š"FÃ"gX _¹‚û–ÅÒjÌduw’$Õ®Y­ ûT¿ÙÖjÝ®pýGõ°–Ñ~)ovøwüH¯hëÅ;4ØpÆttÏ‘ÂH‰!tÍWý:uT»œ#VÏõé÷ŠW¦|¯@)Ãd%䨶Ü×'cŠ ¢cªO¨‰h@KBß)ß9hÌW ¶»€Ú—Pÿts ôõ섦C½ŒTçw\2Ówb|;2~ê\d÷.:—ÙLž…QL”¦¤ºG™MÔÇ.ϤT9Ic¦„‚²G‹ß”ÆÓr¯Ÿœ2²„niê'âÍgOšuâîTÜm½»‹ÁÝ`ä3ljíYbó5鑚OGÂ߇D4„„è®%vòs nX97ÇH?uy/ £òˆòâ=l5µ” i äŽ7h¢Qiá4)¼E*iõ”ÔÙ™!#*ë• Þ•t®`ÓB¿Êr3[ñSWK·è*Y¶q¿-k%õ³´x€_»8h©w²JúïèG´}9=&Û,ÝŠ~)cäæ\«á8µ!ñ[÷7çðòOD ™ß?t<׿LèA«¨½+ê# ‹¦c¯uN1á¨oH:ˆ9§ãâ‡@FÀ‰¹om.MUmdûe‚‘æw™àêênv9» ˆ?‘xHX

, if (aParamInfo) { q= va_arg( args, char* ); if (q==NULL) break; ii++; } // if ii++; if (!err) { bool ok= d->GetFunction( p,q, *m, FuncConnectionError ); if (!ok) err= DB_NotFound; } // if m++; } // while if (err) return err; // check if table is too small or too long while (ii*sizeof(p)Disconnect()) err= DB_NotFound; FreeAssignedObject(d); aMod= NULL; // no longer access return err; } // DisconnectModule #ifdef __cplusplus } // namespace #endif /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/DLL_interface.h0000755000373300037200000000621112424517753030032 0ustar00nightlyallusers00000000000000/* * File: DLL_interface.h * * Author: Beat Forster (bfo@synthesis.ch) * * * General interface to access the routines * of a DLL. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * */ #ifndef DLL_INTERFACE_H #define DLL_INTERFACE_H #include "target_options.h" #include "platform_DLL.h" #include using namespace std; #include "generic_types.h" #include "syerror.h" #ifdef __cplusplus namespace sysync { #endif // base class for (internal) routine access class TAccess { public: TAccess() { fMod= NULL; fJNI= false; fLIB= false; } virtual ~TAccess() { }; // virtual destructor virtual bool Connect ( cAppCharP aModName, ErrReport, void* ref= NULL ) { fModName= aModName; ref= NULL; // dummy to avoid warning return true; } // Connect virtual bool GetFunction ( cAppCharP aFuncName, cAppCharP, appPointer &aFunc, ErrMReport, void* ref= NULL ) { if (aFuncName!=NULL) aFunc= (appPointer)aFuncName; // interpret it as address ref= NULL; // dummy to avoid warning return true; } // GetFunction virtual bool Disconnect () { return true; } bool fJNI; bool fLIB; protected: appPointer fMod; string fModName; }; // TAccess #ifdef PLUGIN_DLL //! derived class for DLL access class TDLL : public TAccess { public: virtual bool Connect ( cAppCharP aModName, ErrReport aReport, void* ref= NULL ); virtual bool GetFunction( cAppCharP aFuncName, cAppCharP aParams, appPointer &aFunc, ErrMReport aReport, void* ref= NULL ); virtual bool Disconnect (); }; // TDLL #endif // PLUGIN_DLL // -------------------------------------------------------------------------- /*! General error reporting */ void Report_Error( cAppCharP aText, ... ); /*! Error output, if can't be found */ void ModuleConnectionError( void* /* ref */, cAppCharP aModName ); /*! Error output, if can't be found */ void FuncConnectionError ( void* /* ref */, cAppCharP aFuncName, cAppCharP aModName ); /*! Connects library/DLL/JNI . * is the module reference pointer. */ TSyError ConnectModule( appPointer &aMod, cAppCharP aModName, bool is_jni= false ); /*! Connects a list of functions to module . * The functions will be filled into with . An error will be * returned if the list of functions is too long or too short. * The open parameter list will be interpreted - as function names for DLLs * (or if module name is LIB/JNI) - as function pointers for libraries * is the module reference pointer. * must be true, if each element contains a second param with parameter info. */ TSyError ConnectFunctions( appPointer aMod, appPointer aField, memSize aFieldSize, bool aParamInfo, ... ); /*! Disconnect a connected unit * If mode is a library, =NULL can be passed */ TSyError DisconnectModule( appPointer &aMod ); #ifdef __cplusplus } // namespace #endif #endif /* DLL_INTERFACE_H */ /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/dbapi.cpp0000755000373300037200000023176212424517753027024 0ustar00nightlyallusers00000000000000/* * File: dbapi.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * Programming interface between Synthesis SyncML engine * and a database structure: C++ class interface * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #include "dbapi.h" #include "SDK_util.h" #include "SDK_support.h" #include "DLL_interface.h" #ifndef SYSYNC_ENGINE #include "stringutil.h" #endif #ifdef JNI_SUPPORT #include "JNI_interface.h" #endif // the simple demo adapter #ifdef DBAPI_DEMO namespace SDK_demodb { #include "dbapi_include.h" } // namespace #endif // more built-in adapters of the same kind can be used #ifdef DBAPI_EXAMPLE namespace example1 { #include "dbapi_include.h" } // namespace namespace example2 { #include "dbapi_include.h" } // namespace #endif // a silent adapter, which always returns OK #ifdef DBAPI_SILENT namespace silent { #include "dbapi_include.h" } // namespace #endif // the textdb adapter #ifdef DBAPI_TEXT namespace SDK_textdb { #include "dbapi_include.h" } // namespace #endif // the snowwhite/oceanblue adapter #ifdef DBAPI_SNOWWHITE namespace oceanblue { #include "dbapi_include.h" } // namespace #endif // the JNI bridge to Java #if defined JNI_SUPPORT && defined PLUGIN_DLL namespace SDK_jni { #include "dbapi_include.h" } // namespace #endif // the C# bridge #if defined CSHARP_SUPPORT && defined PLUGIN_DLL namespace SDK_csharp { #include "dbapi_include.h" } // namespace #endif // the bridge to OMA-DS 1.2 FILEOBJ #ifdef DBAPI_FILEOBJ namespace SDK_fileobj { #include "dbapi_include.h" } // namespace #endif // the dbapi logger bridge #ifdef DBAPI_LOGGER namespace logger { #include "dbapi_include.h" } // namespace #endif // some internal modules do not have the full set of routines #define DISABLE_PLUGIN_SESSIONAUTH 1 #define DISABLE_PLUGIN_DEVICEADMIN 1 #define DISABLE_PLUGIN_DATASTOREADMIN 1 #define DISABLE_PLUGIN_ADAPTITEM 1 // the bridge via tunnel to any datastore inside the engine #if defined DBAPI_TUNNEL && defined PLUGIN_DLL namespace SDK_tunnel { #include "dbapi_include.h" } // namespace #endif // iPhone plugins are AsKey only #define DISABLE_PLUGIN_DATASTOREDATA_STR // static plugins required for iPhoneOS (no DLLs allowed) #ifdef IPHONE_PLUGINS_STATIC #ifdef HARDCODED_CONTACTS namespace iPhone_addressbook { #include "dbapi_include.h" } // namespace #endif #ifdef HARDCODED_CALENDAR namespace iPhone_calendar { #include "dbapi_include.h" } // namespace #endif #ifdef HARDCODED_TODO namespace iPhone_todos { #include "dbapi_include.h" } // namespace #endif #ifdef HARDCODED_NOTES namespace iPhone_notes { #include "dbapi_include.h" } // namespace #endif #ifdef HARDCODED_EMAILS namespace iPhone_emails { #include "dbapi_include.h" } // namespace #endif #ifdef HARDCODED_CUSTOM namespace iPhone_dbplugin1 { #include "dbapi_include.h" } // namespace namespace iPhone_dbplugin2 { #include "dbapi_include.h" } // namespace namespace iPhone_dbplugin3 { #include "dbapi_include.h" } // namespace namespace iPhone_dbplugin4 { #include "dbapi_include.h" } // namespace #endif #endif #undef DISABLE_PLUGIN_DATASTOREDATA_STR #undef DISABLE_PLUGIN_ADAPTITEM #define DISABLE_PLUGIN_DATASTOREDATA 1 // the "adaptitem" module does not contain most of the routines #ifdef ADAPTITEM_SUPPORT namespace SDK_adapt { #include "dbapi_include.h" } // namespace #endif // the UI demo adapter is something special #define DISABLE_PLUGIN_ADAPTITEM 1 #define ENABLE_PLUGIN_UI 1 #ifdef UIAPI_DEMO namespace SDK_ui { #include "dbapi_include.h" } // namespace #endif #undef DISABLE_PLUGIN_ADAPTITEM #undef DISABLE_PLUGIN_SESSIONAUTH #undef DISABLE_PLUGIN_DEVICEADMIN #undef DISABLE_PLUGIN_DATASTOREADMIN #undef DISABLE_PLUGIN_DATASTOREDATA // all should be switched on now for "no_dbapi" // ------------------------------------------------------------ #define MyDB "DBApi" // identifier of the sandwich layer namespace no_dbapi { #include "dbapi_include.h" // combine the definitions of different namespaces using sysync::DB_Callback; using sysync::UI_Call_In; using sysync::ItemID; using sysync::MapID; using sysync::cItemID; using sysync::cMapID; using sysync::LOCERR_NOTIMP; using sysync::Password_Mode_Undefined; // default routines, if no context is available // all of them are returning false or 0 /* --- MODULE ------------------------------------------------------------------------------------ */ TSyError Module_CreateContext ( CContext* mc, cAppCharP /* moduleName */, cAppCharP /* subName */, cAppCharP /* mContextName */, DB_Callback /* mCB */ ) { *mc= 0; return LOCERR_OK; } CVersion Module_Version ( CContext /* mc */ ) /* invalid */ { return VP_BadVersion;} TSyError Module_Capabilities ( CContext /* mc */, appCharP *aCapaP ) { *aCapaP= NULL; return DB_NotFound; } TSyError Module_PluginParams ( CContext /* mc */, cAppCharP /* mConfigParams */, CVersion /* engineVersion */ ) { return DB_Error; } void Module_DisposeObj ( CContext /* mc */, void* /* memory */ ) { } TSyError Module_DeleteContext ( CContext /* mc */ ) { return LOCERR_OK; } /* --- SESSION ----------------------------------------------------------------------------------- */ TSyError Session_CreateContext ( CContext* /* sc */, cAppCharP /* sessionName */, DB_Callback /* sCB */ ) { return DB_Fatal; } TSyError Session_AdaptItem ( CContext /* sc */, appCharP* /* sItemData1 */, appCharP* /* sItemData2 */, appCharP* /* sLocalvars */, uInt32 /* sIdentifier */ ) { return DB_Forbidden; } TSyError Session_CheckDevice ( CContext /* sc */, cAppCharP /* aDeviceID */, appCharP* /* sDevKey */, appCharP* /* nonce */ ) { return DB_Forbidden; } sInt32 Session_PasswordMode ( CContext /* sc */ ) { return Password_Mode_Undefined; } TSyError Session_Login ( CContext /* sc */, cAppCharP /* sUsername */, appCharP* /* sPassword */, appCharP* /* sUsrKey */ ) { return DB_Forbidden; } TSyError Session_Logout ( CContext /* sc */ ) { return DB_Forbidden; } TSyError Session_GetNonce ( CContext /* sc */, appCharP* /* nonce */ ) { return DB_Forbidden; } TSyError Session_SaveNonce ( CContext /* sc */, cAppCharP /* nonce */ ) { return DB_Forbidden; } TSyError Session_SaveDeviceInfo ( CContext /* sc */, cAppCharP /* aDeviceInfo */ ) { return DB_Forbidden; } TSyError Session_GetDBTime ( CContext /* sc */, appCharP* /* currentDBTime */) { return DB_Forbidden; } void Session_DisposeObj ( CContext /* sc */, void* /* memory */ ) { } void Session_ThreadMayChangeNow( CContext /* sc */ ) { } void Session_DispItems ( CContext /* sc */, bool, cAppCharP ) { } TSyError Session_DeleteContext ( CContext /* sc */ ) { return DB_Fatal; } /* --- DATASTORE --------------------------------------------------------------------------------- */ /* ----- OPEN ------------------------ */ TSyError CreateContext ( CContext* /* co */, cAppCharP /* aContextName */, DB_Callback /* aCB */, cAppCharP /* sDevKey */, cAppCharP /* sUsrKey */ ) { return DB_Fatal; } uInt32 ContextSupport ( CContext /* co */, cAppCharP /* aContextRules */ ) { return 0; } uInt32 FilterSupport ( CContext /* co */, cAppCharP /* aFilterRules */ ) { return 0; } /* ----- ADMINISTRATION -------------- */ TSyError LoadAdminData ( CContext /* co */, cAppCharP /* aLocDB */, cAppCharP /* aRemDB */, appCharP* /* adminData */ ) { return DB_Forbidden; } TSyError LoadAdminDataAsKey( CContext /* co */, cAppCharP /* aLocDB */, cAppCharP /* aRemDB */, KeyH /* adminKey */ ) { return DB_Forbidden; } TSyError SaveAdminData ( CContext /* co */, cAppCharP /* adminData */ ) { return DB_Forbidden; } TSyError SaveAdminDataAsKey( CContext /* co */, KeyH /* adminKey */ ) { return DB_Forbidden; } bool ReadNextMapItem ( CContext /* co */, MapID /* mID */, bool /* aFirst */ ) { return false; } TSyError InsertMapItem ( CContext /* co */, cMapID /* mID */ ) { return DB_Forbidden; } TSyError UpdateMapItem ( CContext /* co */, cMapID /* mID */ ) { return DB_Forbidden; } TSyError DeleteMapItem ( CContext /* co */, cMapID /* mID */ ) { return DB_Forbidden; } /* ----- GENERAL --------------------- */ void DisposeObj ( CContext /* co */, void* /* memory */ ) { } void ThreadMayChangeNow ( CContext /* co */ ) { } void WriteLogData ( CContext /* co */, cAppCharP /* logData */ ) { } void DispItems ( CContext /* co */, bool, cAppCharP ) { } /* ----- "script-like" ADAPT --------- */ TSyError AdaptItem ( CContext /* co */, appCharP* /* aItemData1 */, appCharP* /* aItemData2 */, appCharP* /* aLocalvars */, uInt32 /* aIdentifier */ ) { return DB_Forbidden; } /* ----- READ ------------------------ */ TSyError StartDataRead ( CContext /* co */, cAppCharP /* lastToken */, cAppCharP /* resumeToken */ ) { return DB_Fatal; } TSyError ReadNextItem ( CContext /* co */, ItemID /* aID */, appCharP* /* aItemData */, sInt32* /* aStatus */, bool /* aFirst */ ) { return DB_Fatal; } TSyError ReadNextItemAsKey( CContext /* co */, ItemID /* aID */, KeyH /* aItemKey */, sInt32* /* aStatus */, bool /* aFirst */ ) { return DB_Fatal; } TSyError ReadItem ( CContext /* co */, cItemID /* aID */, appCharP* /* aItemData */ ) { return DB_Fatal; } TSyError ReadItemAsKey ( CContext /* co */, cItemID /* aID */, KeyH /* aItemKey */ ) { return DB_Fatal; } TSyError ReadBlob ( CContext /* co */, cItemID /* aID */, cAppCharP /* aBlobID */, appPointer* /* aBlkPtr */, memSize* /* aBlkSize */, memSize* /* aTotSize */, bool /* aFirst */, bool* /* aLast */ ) { return DB_Fatal; } TSyError EndDataRead ( CContext /* co */ ) { return DB_Fatal; } /* ----- WRITE ----------------------- */ TSyError StartDataWrite ( CContext /* co */ ) { return DB_Fatal; } TSyError InsertItem ( CContext /* co */, cAppCharP /* aItemData */, ItemID /* newID */ ) { return DB_Fatal; } TSyError InsertItemAsKey ( CContext /* co */, KeyH /* aItemKey */, ItemID /* newID */ ) { return DB_Fatal; } TSyError UpdateItem ( CContext /* co */, cAppCharP /* aItemData */, cItemID /* aID */, ItemID /* updID */ ) { return DB_Fatal; } TSyError UpdateItemAsKey ( CContext /* co */, KeyH /* aItemKey */, cItemID /* aID */, ItemID /* updID */ ) { return DB_Fatal; } TSyError MoveItem ( CContext /* co */, cItemID /* aID */, cAppCharP /* newParID */ ) { return DB_Fatal; } TSyError DeleteItem ( CContext /* co */, cItemID /* aID */ ) { return DB_Fatal; } TSyError FinalizeLocalID ( CContext /* co */, cItemID /* aID */, ItemID /* updID */ ) { return DB_Fatal; } TSyError DeleteSyncSet ( CContext /* co */ ) { return DB_Fatal; } TSyError WriteBlob ( CContext /* co */, cItemID /* aID */, cAppCharP /* aBlobID */, appPointer /* aBlkPtr */,memSize /* aBlkSize */, memSize /* aTotSize */, bool /* aFirst */, bool /* aLast */ ) { return DB_Fatal; } // There are older implementations, where "DeleteBlob" is not yet available. TSyError DeleteBlob ( CContext /* co */, cItemID /* aID */, cAppCharP /* aBlobID */ ) { return LOCERR_NOTIMP; } TSyError EndDataWrite ( CContext /* co */, bool /* success */, char** /* newToken */ ) { return DB_Fatal; } /* ----- CLOSE ----------------------- */ TSyError DeleteContext ( CContext /* co */ ) { return DB_Fatal; } /* ---- UI API ----------------------- */ TSyError UI_CreateContext ( CContext* /* co */, cAppCharP /* uiName */, UI_Call_In /* uCI */ ) { return DB_Fatal; } TSyError UI_RunContext ( CContext /* co */ ) { return DB_Fatal; } TSyError UI_DeleteContext ( CContext /* co */ ) { return DB_Fatal; } } // namespace no_dbapi /* ---- "TDB_Api_Str" implementation --------------------------------------- */ namespace sysync { TDB_Api_Str::TDB_Api_Str() { clear(); } // constructor TDB_Api_Str::TDB_Api_Str( string &s ) { clear(); fStr= (char*)s.c_str(); } // alternative constructor TDB_Api_Str::~TDB_Api_Str() { DisposeStr(); } // destructor void TDB_Api_Str::AssignStr( CContext aContext, DisposeProc aDisposeProc, bool itself ) { fContext= aContext; fItself = itself; if (fStr!=NULL) fDisposeProc= aDisposeProc; else { fDisposeProc= NULL; fStr= const_cast(""); /* this is okay because the string is not going to be disposed */ } } // AssignStr void TDB_Api_Str::DisposeStr() { // nothing to do, already disposed ? if (fStr !=NULL && fDisposeProc!=NULL) { void* ref= const_cast(fStr); if (fItself) ref= this; fDisposeProc( fContext,ref ); } // if clear(); // don't do it again !! } // DisposeStr /* Dispose a string which has been allocated with 'StrAlloc' * Used as handler for: * typedef void( *DisposeProc)( long aContext, void* s ); */ static void StrDispose_Handler( CContext /* aContext */, void* s ) { StrDispose( s ); } // StrDispose_Handler /* ---------- allocate local memory for a string ------------- */ void TDB_Api_Str::LocalAlloc( CContext aContext, cAppCharP str ) { fStr= StrAlloc( str ); AssignStr( aContext, (DisposeProc)StrDispose_Handler ); } // LocalAlloc /* ---- "DB_Api_Blk" implementation --------------------------------------- */ TDB_Api_Blk::TDB_Api_Blk() { clear(); } // constructor TDB_Api_Blk::~TDB_Api_Blk() { DisposeBlk(); } // destructor void TDB_Api_Blk::AssignBlk( CContext aContext, DisposeProc aDisposeProc, bool itself ) { fContext= aContext; fItself = itself; if (fPtr!=NULL) fDisposeProc= (DisposeProc)aDisposeProc; else { fDisposeProc= NULL; fSize= 0; } } // AssignBlk void TDB_Api_Blk::DisposeBlk() { // nothing to do, already disposed ? if (fPtr !=NULL && fDisposeProc!=NULL) { void* ref= fPtr; if (fItself) ref= this; fDisposeProc( fContext,ref ); } // if clear(); // don't do it again !! } // DisposeBlk // Returns true if is name or # static bool BuiltIn( string &ps, int &n, cAppCharP name ) { if (strucmp( ps.c_str(), name )==0) return true; string s= "#" + IntStr( n++ ); if (strucmp( ps.c_str(), s.c_str() )==0) { ps= name; return true; } return false; } // BuiltIn /* --- connect to library ------------------------------------------------- */ /*! These are the built-in linked libraries, which can be accessed directly * NOTE: Some of them are normally switched off with compile options * * SDK plugin modules can be also linked into the engine directly. * Normally the compiler must be able to link all SDK routines. * The SDK concept allows to have some routines unimplemented, * they will be provided by the "no_dbapi" built-in module. */ static TSyError DBApi_LibAssign( appPointer aMod, string &ps, appPointer aField, int aFSize, cAppCharP aKey= "" ) { TSyError err= DB_NotFound; int n= 0; // incremental counter starting with 0 // the blind adapter is always available and acts as default as well if (strucmp( ps.c_str(), "" )==0 || BuiltIn( ps,n, "no_dbapi" )) err= no_dbapi::AssignMethods( aMod, aField,aFSize, aKey ); #ifdef DBAPI_DEMO // demo (C) adapter, which will be delivered with SDK else if (BuiltIn( ps,n, "SDK_demodb" )) err= SDK_demodb::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef DBAPI_EXAMPLE // other (C++) linked versions of the demo adapter (for test) else if (BuiltIn( ps,n, "example1" )) err= example1::AssignMethods( aMod, aField,aFSize, aKey ); else if (BuiltIn( ps,n, "example2" )) err= example2::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef DBAPI_SILENT // a silent adapter, which always says, everthing is ok else if (BuiltIn( ps,n, "silent" )) err= silent::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef DBAPI_TEXT // "text_db" implementation, which emulates the "textdb" else if (BuiltIn( ps,n, "SDK_textdb" )) err= SDK_textdb::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef DBAPI_SNOWWHITE // "oceanblue/snowwhite" implementation else if (BuiltIn( ps,n, "snowwhite" )) err= oceanblue::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef PLUGIN_DLL // plugin bridges #ifdef JNI_SUPPORT // the Java (JNI) adapter else if (BuiltIn( ps,n, "JNI" )) err= SDK_jni::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef CSHARP_SUPPORT // the C# adapter else if (BuiltIn( ps,n, "CSHARP" )) err= SDK_csharp::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef DBAPI_TUNNEL // direct access to internal adapters else if (BuiltIn( ps,n, "tunnel" )) err= SDK_tunnel::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef DBAPI_LOGGER // dbapi logger bridge else if (BuiltIn( ps,n, "logger" )) err= logger::AssignMethods( aMod, aField,aFSize, aKey ); #endif #endif #ifdef DBAPI_FILEOBJ // dbapi fileobj else if (BuiltIn( ps,n, "FILEOBJ" )) err= SDK_fileobj::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef ADAPTITEM_SUPPORT // "script-like" adapt item else if (BuiltIn( ps,n, "ADAPTITEM" )) err= SDK_adapt::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef UIAPI_DEMO // demo (C++) UI interface adapter, which will be delivered with SDK else if (BuiltIn( ps,n, "SDK_ui" )) err= SDK_ui::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef IPHONE_PLUGINS_STATIC // iPhone OS does not allow DLL plugins at this time, so we must link them statically #ifdef HARDCODED_CONTACTS else if (BuiltIn( ps,n, "iPhone_addressbook")) err= iPhone_addressbook::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef HARDCODED_CALENDAR else if (BuiltIn( ps,n, "iPhone_calendar" )) err= iPhone_calendar::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef HARDCODED_TODO else if (BuiltIn( ps,n, "iPhone_todos" )) err= iPhone_todos::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef HARDCODED_NOTES else if (BuiltIn( ps,n, "iPhone_notes" )) err= iPhone_notes::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef HARDCODED_EMAILS else if (BuiltIn( ps,n, "iPhone_emails" )) err= iPhone_emails::AssignMethods( aMod, aField,aFSize, aKey ); #endif #ifdef HARDCODED_CUSTOM else if (BuiltIn( ps,n, "iPhone_dbplugin1" )) err= iPhone_dbplugin1::AssignMethods( aMod, aField,aFSize, aKey ); else if (BuiltIn( ps,n, "iPhone_dbplugin2" )) err= iPhone_dbplugin2::AssignMethods( aMod, aField,aFSize, aKey ); else if (BuiltIn( ps,n, "iPhone_dbplugin3" )) err= iPhone_dbplugin3::AssignMethods( aMod, aField,aFSize, aKey ); else if (BuiltIn( ps,n, "iPhone_dbplugin4" )) err= iPhone_dbplugin4::AssignMethods( aMod, aField,aFSize, aKey ); #endif #endif else if (strucmp( ps.c_str(), "#" )==0) err= LOCERR_UNKSUBSYSTEM; else if (!BuiltIn( ps,n, "" )) ModuleConnectionError( NULL, AddBracks( ps ).c_str() ); return err; } // DBApi_LibAssign /* ---- wrapper for DB_Callback -------------------------------------------- */ TDB_Api_Callback::TDB_Api_Callback() { InitCallback( &Callback, DB_Callback_Version, NULL,NULL ); } /* ---- "DB_Api_Config" implementation ------------------------------------- */ TDB_Api_Config::TDB_Api_Config() { fMod= NULL; clear(); fTSTversion= VP_BadVersion; } // constructor TDB_Api_Config::~TDB_Api_Config() { Disconnect(); } // destructor static void connect_no_dbapi( appPointer &aMod, API_Methods &m ) { string no_dbapi= ""; DisconnectModule( aMod ); // avoid memory leak ConnectModule ( aMod,"" ); // default: no db_api -> all methods return false //---- module -------------------------------- DBApi_LibAssign ( aMod,no_dbapi, &m.start, sizeof(m.start), Plugin_Start ); DBApi_LibAssign ( aMod,no_dbapi, &m.param, sizeof(m.param), Plugin_Param ); DBApi_LibAssign ( aMod,no_dbapi, &m, sizeof(m) ); //---- session ------------------------------- DBApi_LibAssign ( aMod,no_dbapi, &m.se, sizeof(m.se), Plugin_Session ); DBApi_LibAssign ( aMod,no_dbapi, &m.se.seAdapt, sizeof(m.se.seAdapt), Plugin_SE_Adapt ); DBApi_LibAssign ( aMod,no_dbapi, &m.se.seAuth, sizeof(m.se.seAuth), Plugin_SE_Auth ); DBApi_LibAssign ( aMod,no_dbapi, &m.se.dvAdmin, sizeof(m.se.dvAdmin), Plugin_DV_Admin ); DBApi_LibAssign ( aMod,no_dbapi, &m.se.dvTime, sizeof(m.se.dvTime), Plugin_DV_DBTime ); //---- datastore ----------------------------- DBApi_LibAssign ( aMod,no_dbapi, &m.ds, sizeof(m.ds), Plugin_Datastore ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsg, sizeof(m.ds.dsg), Plugin_DS_General ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsAdapt, sizeof(m.ds.dsAdapt), Plugin_DS_Adapt ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsAdm.str, sizeof(m.ds.dsAdm.str), Plugin_DS_Admin_Str ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsAdm.key, sizeof(m.ds.dsAdm.key), Plugin_DS_Admin_Key ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsAdm.map, sizeof(m.ds.dsAdm.map), Plugin_DS_Admin_Map ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsData, sizeof(m.ds.dsData), Plugin_DS_Data ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsData.str,sizeof(m.ds.dsData.str),Plugin_DS_Data_Str ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsData.key,sizeof(m.ds.dsData.key),Plugin_DS_Data_Key ); DBApi_LibAssign ( aMod,no_dbapi, &m.ds.dsBlob, sizeof(m.ds.dsBlob), Plugin_DS_Blob ); //---- ui context ---------------------------- DBApi_LibAssign ( aMod,no_dbapi, &m.ui, sizeof(m.ui), Plugin_UI ); DisconnectModule( aMod ); // no longer used, avoid memory leak } // connect_no_dbapi void TDB_Api_Config::clear() { connect_no_dbapi( fMod, m ); fConnected = false; fADMIN_Info= false; fSDKversion= VP_BadVersion; fMODversion= VP_BadVersion; mContext = 0; DB_Callback mCB= &fCB.Callback; mCB->cContext= 0; // set it to uninitialized default mCB->mContext= 0; } // clear // --------------------------------------------------------------------- //! Module string disposer void TDB_Api_Config::DisposeStr( TDB_Api_Str &s ) { fSList.remove( &s ); // remove it from the list first to avoid double free s.AssignStr( mContext, (DisposeProc)m.Module_DisposeObj ); s.DisposeStr(); } // DisposeStr //! Local wrapper, because it must be DisposeProc type and can't be C++ method static void Local_Module_DisposeStr( CContext mObj, void* memory ) { TDB_Api_Config* c= (TDB_Api_Config*)mObj; TDB_Api_Str* u= (TDB_Api_Str*)memory; c->DisposeStr( *u ); } // Local_Session_DisposeStr void TDB_Api_Config::AssignStr( TDB_Api_Str &s ) { if (s.fStr==NULL) return; s.AssignStr( (CContext)this, Local_Module_DisposeStr, true ); fSList.push_back( &s ); // add the element to the list } // AssignStr // --------------------------------------------------------------------- // general datastore access ? bool DSConnect( cAppCharP aItem ) { return FlagOK( aItem, Plugin_Datastore ) && ( FlagOK( aItem, Plugin_DS_Admin ) || FlagOK( aItem, Plugin_DS_Data ) || FlagOK( aItem, Plugin_DS_Adapt ) ); } // DSConnect TSyError TDB_Api_Config::DBApi_Assign( cAppCharP aItem, appPointer aField, memSize aFieldSize, cAppCharP aKey ) { TSyError err= LOCERR_OK; if (FlagOK( aItem,aKey )) { if (is_lib) err= DBApi_LibAssign( fMod, fPlugin, aField,aFieldSize, aKey ); else { err= DB_Forbidden; // only allowed, if PLUGIN_DLL is active #ifdef PLUGIN_DLL err= DBApi_DLLAssign( fMod, aField,aFieldSize, aKey, false ); #endif } // if DEBUG_Exotic_INT( &fCB.Callback,MyDB, "DBApi_Assign", "aKey='%s' (size=%d) err=%d", aKey, aFieldSize, err ); } // if return err; } // DBApi_Assign // Returns the engine's SDK version long TDB_Api_Config::EngineSDKVersion() { // If not changed ... if (fTSTversion==VP_BadVersion) return Plugin_Version( 0 ); // Called here it's the engine's SDK version else return fTSTversion; // modified for test } // EngineSDKVersion // Returns LOCERR_TOOOLD, if the version is too old TSyError TDB_Api_Config::MinVersionCheck( string capa, CVersion &vMin ) { TSyError err= LOCERR_OK; vMin= 0; string value; while (RemoveField( capa, CA_MinVersion, value )) { CVersion minVersion= VersionNr( value ); // the minimum required version of the plugin CVersion engVersion= EngineSDKVersion () | 0x000000ff; // the engine's version with max build number if (engVersion= %08X / err=%d", engVersion, minVersion, err ); if (err) break; } // while return err; } // MinVersionCheck // Connect to internally linked library or external DLL, dependent on and TSyError TDB_Api_Config::Connect( cAppCharP aModName, CContext &globContext, cAppCharP mContextName, bool aIsLib, bool allowDLL ) { TSyError err; string gcs; if (fConnected) Disconnect(); if (fConnected) return DB_Error; // still connected ? => error cAppCharP x= ""; DB_Callback mCB= &fCB.Callback; CContext* mc= &mCB->mContext; // store it at a temporary var *mc= 0; clear(); is_lib = IsLib( aModName ); fModName= aModName; // make a local copy if (aIsLib) { // && !is_lib) : special cases like "[aaa]!bbb" => "[[aaa]!bbb]" fModName= AddBracks( aModName ); is_lib = true; } // if GlobContext* g; GlobContext* gp; if (CB_OK( mCB,8 )) { // available ? mCB->gContext= globContext; for (int i= 1; i<=3; i++) { // create 3 empty elements gp= new GlobContext; // create and init a new record gp->ref = NULL; gp->next= NULL; gp->cnt = 0; strcpy( gp->refName,"" ); if (!mCB->gContext) mCB->gContext= (CContext)gp; // assign it else { g= (GlobContext*)mCB->gContext; // or add it to the end of the chain while (g->next!=NULL) g= (GlobContext*)g->next; g->next= gp; } // if } // for } // if do { // exit part if (!is_lib) { x= "(DLL)"; if (!allowDLL) { err= DB_Forbidden; break; } } // if WithSubSystem ( fModName, fModMain, fModSub ); bool in_bracks= CutBracks( fModMain ); // "[aaa xx]" => "aaa xx" fOptions= fModMain; NextToken ( fOptions, fModMain, " " ); // separate fModName= fModMain; CutBracks( fModMain ); fPlugin = fModMain; if (in_bracks) fModName = AddBracks( fModName ); /* this mode is no longer supported ( moduleName:globContext ) */ /* keep it for compatiblity */ if (globContext) { g= (GlobContext*)globContext; while (g!=NULL) { if (strcmp( g->refName,"" )!=0) { // at least one field is set fModMain+= ":" + RefStr( globContext ); break; } // if g= g->next; } // while } // if if (!fOptions.empty()) fModMain+= " " + fOptions; // create some downwards compatibility info if (CB_OK( mCB,4 )) { if (allowDLL) mCB->allow_DLL_legacy= 0xffff; // Assign DLL allowance info else mCB->allow_DLL_legacy= 0x0000; if (CB_OK( mCB,5 )) { mCB->allow_DLL= mCB->allow_DLL_legacy; } // if } // if // Connect "Module_CreateContext" and "Module_Version" first, to take decisions err= ConnectModule( fMod, fModName.c_str() ); if (err) break; err= DBApi_Assign( "", &m.start, sizeof(m.start), Plugin_Start ); if (err) break; Version_Func pv= (Version_Func)m.start.Module_Version; fSDKversion= pv( 0 ); // get the plugin's version before making the first tests DEBUG_INT( mCB,MyDB, "Connect", "fSDKversion=%s", VersionStr( fSDKversion ).c_str() ); string sn= fModSub; if (sn=="[#]" && !(fPlugin=="logger")) sn= ""; // remove the recursion breaker CreateM_Func p= (CreateM_Func)m.start.Module_CreateContext; err= p( &mContext, fModMain.c_str(), sn.c_str(), mContextName, mCB ); if (err==LOCERR_ALREADY) err= LOCERR_OK; // this is not an error, just avoid multiple assignment DEBUG_INT( mCB,MyDB, "Connect", "mContext=%08X err=%d", mContext,err ); if (err) break; fMODversion= pv( mContext ); // get the plugin's version before making the first tests mCB->cContext = mContext; // assign for the callback mechanism if (*mc==0) *mc= mContext; // assign for session & datastores, if not already in use (e.g. for JNI) //err= VersionCheck(); if (err) break; TDB_Api_Str aCapa; err= Capabilities( aCapa ); if (err) break; cAppCharP ca= aCapa.c_str(); CVersion vMin; err= MinVersionCheck( ca, vMin ); if (err) break; fADMIN_Info= FlagOK( ca, CA_ADMIN_Info, true ); GetField( ca, CA_Description, fDesc ); GetField( ca, CA_GlobContext, gcs ); // is there a global context inside ? // !Supported( VP_EngineVersionParam ): only JNI signature changes // !Supported( VP_MD5_Nonce_IN ): only JNI signature changes cAppCharP vda= Plugin_DS_Admin_Map; if (!Supported( VP_InsertMapItem )) vda= Plugin_DS_Admin_OLD; cAppCharP vdd= Plugin_DS_Data; if (!Supported( VP_FLI_DSS )) vdd= Plugin_DS_Data_OLD2; if (!Supported( VP_ResumeToken )) vdd= Plugin_DS_Data_OLD1; cAppCharP vdb= Plugin_DS_Blob; if (!Supported( VP_BLOB_JSignature )) vdb= Plugin_DS_Blob_OLD2; // new BLOB signature if (!Supported( VP_DeleteBlob )) vdb= Plugin_DS_Blob_OLD1; //---- module --------------------------------- if (!err) err= DBApi_Assign( "", &m.param, sizeof(m.param), Plugin_Param ); if (!err) err= DBApi_Assign( "", &m, sizeof(m) ); //---- session -------------------------------- if (!err && FlagOK ( ca, Plugin_Session )) { err= DBApi_Assign( ca, &m.se, sizeof(m.se), Plugin_Session ); if (!err && ( FlagOK ( ca, Plugin_SE_Auth ) || FlagOK ( ca, Plugin_DV_Admin ) )) { err= DBApi_Assign( ca, &m.se.seAuth, sizeof(m.se.seAuth), Plugin_SE_Auth ); if (!err) err= DBApi_Assign( ca, &m.se.dvAdmin, sizeof(m.se.dvAdmin), Plugin_DV_Admin ); if (!err && Supported( VP_GetDBTime )) { err= DBApi_Assign( ca, &m.se.dvTime, sizeof(m.se.dvTime), Plugin_DV_DBTime ); } // if } // if if (!err && Supported( VP_AdaptItem )) { err= DBApi_Assign( ca, &m.se.seAdapt, sizeof(m.se.seAdapt), Plugin_SE_Adapt ); } // if } // if //---- datastore ------------------------------ if (!err && FlagOK ( ca, Plugin_Datastore )) { if (!err && DSConnect( ca )) { err= DBApi_Assign( ca, &m.ds, sizeof(m.ds), Plugin_Datastore ); } // if if (!err && ( FlagOK ( ca, Plugin_DS_Admin ) || FlagOK ( ca, Plugin_DS_Data ) )) { err= DBApi_Assign( ca, &m.ds.dsg, sizeof(m.ds.dsg), Plugin_DS_General ); if (!err) err= DBApi_Assign( ca, &m.ds.dsBlob, sizeof(m.ds.dsBlob), vdb ); } // if if (!err && FlagOK ( ca, Plugin_DS_Admin )) { bool asK= FlagOK ( ca, CA_AdminAsKey, true ); if (asK) err= DBApi_Assign( ca, &m.ds.dsAdm.key, sizeof(m.ds.dsAdm.key),Plugin_DS_Admin_Key ); bool asS= !asK || FlagBoth( ca, CA_AdminAsKey ); if (asS) err= DBApi_Assign( ca, &m.ds.dsAdm.str, sizeof(m.ds.dsAdm.str),Plugin_DS_Admin_Str ); if (!err) err= DBApi_Assign( ca, &m.ds.dsAdm.map, sizeof(m.ds.dsAdm.map), vda ); } // if if (!err) err= DBApi_Assign( ca, &m.ds.dsData, sizeof(m.ds.dsData), vdd ); if (!err && FlagOK ( ca, Plugin_DS_Data )) { bool asK= FlagOK ( ca, CA_ItemAsKey, true ); if (asK) err= DBApi_Assign( ca, &m.ds.dsData.key,sizeof(m.ds.dsData.key),Plugin_DS_Data_Key ); bool asS= !asK || FlagBoth( ca, CA_ItemAsKey ); if (asS) err= DBApi_Assign( ca, &m.ds.dsData.str,sizeof(m.ds.dsData.str),Plugin_DS_Data_Str ); } // if if (!err && Supported( VP_AdaptItem )) { err= DBApi_Assign( ca, &m.ds.dsAdapt, sizeof(m.ds.dsAdapt), Plugin_DS_Adapt ); } // if } // if //---- ui context ----------------------------- if (!err && FlagOK( ca,Plugin_UI, true )) { err= DBApi_Assign( ca, &m.ui, sizeof(m.ui), Plugin_UI ); } // if } while (false); // end exit part if (err) clear(); if (CB_OK( mCB,8 )) { globContext= mCB->gContext; // available ? DeleteGlobContext ( globContext, mCB, true ); // remove elements with empty text and no ref mCB->gContext= globContext; // can be fully removed again (gContext==0) } else { // ---- the old fashioned way to do it ---- if (!gcs.empty()) { uIntPtr u; HexStrToUIntPtr( gcs.c_str(), u ); if (!globContext) globContext= (CContext)u; if (globContext!=(CContext)u) { // link it if more than one element GlobContext* gc= (GlobContext*)globContext; gc->next= (GlobContext*)u; } // if } // if // ----------------------------------------- } // if string s= "ok"; if (err) { char f[ 15 ]; sprintf( f, "err=%d", err ); s= f; } // if DEBUG_INT( mCB,MyDB,"Connect", "%s '%s' %-9s", s.c_str(), fModName.c_str(), x ); fConnected= !err; return err; } // Connect /* Get the plug-in's version number */ long TDB_Api_Config::Version() { return fMODversion; } /* Get the plug-in's capabilities */ TSyError TDB_Api_Config::Capabilities( TDB_Api_Str &aCapa ) { typedef TSyError (*CapabFunc)( CContext mContext, appCharP *mCapabilities ); aCapa.DisposeStr(); CapabFunc p= (CapabFunc)m.start.Module_Capabilities; TSyError err= p( mContext, const_cast(&aCapa.fStr) ); if (!err) AssignStr( aCapa ); return err; } // Capabilities /* Check, if is supported * NOTE: For the SyncML engine internally everything is supported * This will be reflected with the fact that the engine's * version is alway much much higher */ bool TDB_Api_Config::Supported( CVersion versionFeature ) { return Feature_Supported( versionFeature, fSDKversion ); } // Supported TSyError TDB_Api_Config::PluginParams( cAppCharP mConfigParams ) { typedef TSyError (*PlugProc)( CContext mContext, cAppCharP mConfigParams, CVersion engineVersion ); //typedef TSyError (*OLD_PlugProc)( CContext mContext, // cAppCharP mConfigParams ); // w/o TSyError err; if (!fConnected) return DB_Error; /* // new param supported for Plugin Version >= 1.0.X.4 if (Supported( VP_EngineVersionParam )) { PlugProc p= (PlugProc)m.param.Module_PluginParams; err= p( mContext, mConfigParams, EngineSDKVersion() ); } else { OLD_PlugProc p= (OLD_PlugProc)m.param.Module_PluginParams; // w/o the SDK version parameter err= p( mContext, mConfigParams ); } // if */ PlugProc p= (PlugProc)m.param.Module_PluginParams; err= p( mContext, mConfigParams, EngineSDKVersion() ); if (err==LOCERR_ALREADY) err= LOCERR_OK; return err; } // PluginParams // Set the SDK version // *** override the internal version number / for test only *** void TDB_Api_Config::SetVersion( long versionNr ) { fTSTversion= versionNr; DEBUG_INT( &fCB.Callback, MyDB,"SetVersion", "%08X", fTSTversion ); } // SetVersion TSyError TDB_Api_Config::Disconnect() { if (!fConnected) return DB_Error; // avoid double free // remove all still allocated elements before removing the content while (!fSList.empty()) DisposeStr( *fSList.front() ); Context_Func p= (Context_Func)m.Module_DeleteContext; TSyError err= p( mContext ); fModName= ""; DisconnectModule( fMod ); fConnected= false; return err; } // Disconnect /* ------------------------------------------------------------------------- */ void DispGlobContext( CContext &globContext, DB_Callback mCB ) { cAppCharP DGC= "DispGlobContext"; GlobContext* g= (GlobContext*)globContext; DEBUG_Exotic_DB ( mCB, MyDB,DGC, "g=%s mCB->gContext=%s", RefStr( g ).c_str(), RefStr( mCB->gContext ).c_str() ); while (g!=NULL) { GlobContext* nx= g->next; DEBUG_Exotic_DB( mCB, MyDB,DGC, "g=%s g->ref=%s g->cnt=%-3d '%s'", RefStr( g ).c_str(), RefStr( g->ref ).c_str(), g->cnt, g->refName ); g= nx; } // while DEBUG_Exotic_DB ( mCB, MyDB,DGC, "(eof)" ); } // DispGlobContext // mCB->gContext will not be touched here void DeleteGlobContext( CContext &globContext, DB_Callback mCB, bool emptyTextOnly ) { DispGlobContext( globContext, mCB ); DEBUG_Exotic_DB( mCB, "","DeleteGlobContext", "" ); GlobContext* ls= NULL; GlobContext* gs= (GlobContext*)globContext; GlobContext* g= gs; while (g!=NULL) { GlobContext* nx= g->next; bool remCond= g->ref==NULL && (!emptyTextOnly || strcmp( g->refName,"" )==0); if (remCond) { if (gs==g) gs = nx; // go forward if first element removed else ls->next= nx; delete g; g= ls; } // if ls= g; g = nx; } // while globContext= (CContext)gs; DispGlobContext( globContext, mCB ); } // DeleteGlobContext /* ---- "DB_Api_Session" implementation ------------------------------------ */ TDB_Api_Session::TDB_Api_Session() { sCreated= false; sContext= 0; appPointer modu= NULL; connect_no_dbapi( modu, sNo_dbapi ); // the empty connector is default as well dm= &sNo_dbapi; // and assign it sPwMode= Password_Mode_Undefined; } // constructor /* Create a context for a new session */ TSyError TDB_Api_Session::CreateContext( cAppCharP sessionName, TDB_Api_Config &config ) { if (sCreated) return DB_Forbidden; sSessionName= sessionName; // make a local copy dm= &config.m; // assign reference to the methods CreateS_Func p= (CreateS_Func)dm->se.Session_CreateContext; DB_Callback sCB= &fCB.Callback; CContext* sc= &sCB->sContext; // store it at a temporary var *sc= 0; // set it to check later, if changed string vers= VersionStr( config.fSDKversion ); if (config.fMODversion!=config.fSDKversion) vers+= " / " + VersionStr( config.fMODversion ); DEBUG_INT( sCB,MyDB,Se_CC, "desc='%s', vers=%s", config.fDesc.c_str(), vers.c_str() ); sCB->cContext= config.mContext; // inherit info sContext= 0; sCB->mContext= config.fCB.Callback.mContext; TSyError err= p( &sContext, sSessionName.c_str(), sCB ); if (!err) { sCreated= true; if (*sc==0) *sc= sContext; // assign for datastores, but only if not assigned in plug-in module } // if return LOCERR_OK; // workaround to avoid problems w/o a session return err; } // CreateContext // --------------------------------------------------------------------- void TDB_Api_Session::DisposeStr( TDB_Api_Str &s ) // Session str disposer { fSList.remove( &s ); // remove it from the list first to avoid double free s.AssignStr( sContext, (DisposeProc)dm->se.Session_DisposeObj ); s.DisposeStr(); } // DisposeStr static void Local_Session_DisposeStr( CContext sObj, void* memory ) /* Local wrapper, because it must be DisposeProc type and can't be C++ method */ { TDB_Api_Session* s= (TDB_Api_Session*)sObj; TDB_Api_Str* u= (TDB_Api_Str*)memory; s->DisposeStr ( *u ); } // Local_Session_DisposeStr void TDB_Api_Session::AssignStr( TDB_Api_Str &s ) { if (s.fStr==NULL) return; s.AssignStr( (CContext)this, Local_Session_DisposeStr, true ); fSList.push_back( &s ); // add the element to the list } // AssignStr // -------------------------------------------------------------------------------- TSyError TDB_Api_Session::CheckDevice( cAppCharP deviceID, TDB_Api_Str &sDevKey, TDB_Api_Str &nonce ) { typedef TSyError (*ChkDevFunc)( CContext sContext, cAppCharP deviceID, appCharP *sDevKey, appCharP *nonce ); sDevKey.DisposeStr(); nonce.DisposeStr(); ChkDevFunc p= (ChkDevFunc)dm->se.dvAdmin.Session_CheckDevice; TSyError err= p( sContext, deviceID, &sDevKey.fStr, &nonce.fStr ); if (!err) { AssignStr( sDevKey ); AssignStr( nonce ); } return err; } // CheckDevice TSyError TDB_Api_Session::GetNonce( TDB_Api_Str &nonce ) { typedef TSyError (*GetNcFunc)( CContext sContext, appCharP *nonce ); nonce.DisposeStr(); GetNcFunc p= (GetNcFunc)dm->se.dvAdmin.Session_GetNonce; TSyError err= p( sContext, &nonce.fStr ); if (!err) AssignStr( nonce ); return err; } // GetNonce TSyError TDB_Api_Session::SaveNonce( cAppCharP nonce ) { SvInfo_Func p= (SvInfo_Func)dm->se.dvAdmin.Session_SaveNonce; TSyError err= p( sContext, nonce ); return err; } // SaveNonce TSyError TDB_Api_Session::SaveDeviceInfo( cAppCharP aDeviceInfo ) { SvInfo_Func p= (SvInfo_Func)dm->se.dvAdmin.Session_SaveDeviceInfo; TSyError err= p( sContext, aDeviceInfo ); return err; } // SaveDeviceInfo TSyError TDB_Api_Session::GetDBTime( TDB_Api_Str ¤tDBTime ) { typedef TSyError (*DBTimeFunc)( CContext sContext, appCharP *currentDBTime ); currentDBTime.DisposeStr(); DBTimeFunc p= (DBTimeFunc)dm->se.dvTime.Session_GetDBTime; TSyError err= p( sContext, ¤tDBTime.fStr ); if (!err) AssignStr( currentDBTime ); return err; } // GetDBTime #ifdef SYSYNC_ENGINE // No 'lineartime_t' available for standalone TSyError TDB_Api_Session::GetDBTime( lineartime_t ¤tDBTime, GZones* g ) { timecontext_t tctx = 0; TDB_Api_Str s; TSyError err= GetDBTime( s ); currentDBTime= 0; if (!err && !ISO8601StrToTimestamp ( s.c_str(), currentDBTime, tctx )) return DB_Error; TzConvertTimestamp( currentDBTime, tctx, TCTX_UTC, g, TCTX_SYSTEM ); return err; } // GetDBTime #endif /* ---- Login Handling ---------------------------------------- */ sInt32 TDB_Api_Session::PasswordMode() { if (sContext==0) return Password_Mode_Undefined; PwMode_Func p= (PwMode_Func)dm->se.seAuth.Session_PasswordMode; sPwMode= p( sContext ); /* calculate it always if (sPwMode==Password_Mode_Undefined) { ... } // if */ return sPwMode; } // PasswordMode /*! XXX_IN modes */ TSyError TDB_Api_Session::Login( cAppCharP sUsername, cAppCharP sPassword, TDB_Api_Str &sUsrKey ) { switch (PasswordMode()) { case Password_ClrText_IN : case Password_MD5_Nonce_IN : break; default : return DB_Forbidden; // !sCreated is covered here } // switch sUsrKey.DisposeStr(); Login_Func p= (Login_Func)dm->se.seAuth.Session_Login; TSyError err= p( sContext, sUsername, (char**)&sPassword, &sUsrKey.fStr ); if (!err) AssignStr( sUsrKey ); return err; } // Login /*! XXX_OUT modes */ TSyError TDB_Api_Session::Login( cAppCharP sUsername, TDB_Api_Str &sPassword, TDB_Api_Str &sUsrKey ) { switch (PasswordMode()) { case Password_ClrText_OUT : case Password_MD5_OUT : break; default : return DB_Forbidden; // !sCreated is covered here } // switch sPassword.DisposeStr(); sUsrKey.DisposeStr(); Login_Func p= (Login_Func)dm->se.seAuth.Session_Login; TSyError err= p( sContext, sUsername, &sPassword.fStr, &sUsrKey.fStr ); if (!err) { AssignStr( sPassword ); AssignStr( sUsrKey ); } return err; } // Login (overloaded) TSyError TDB_Api_Session::Logout() { if (sContext==0) return LOCERR_OK; Context_Func p= (Context_Func)dm->se.seAuth.Session_Logout; return p( sContext ); } // Logout /* ---- General session routines ------------------------------- */ void TDB_Api_Session::AssignChanged( string &a, TDB_Api_Str &u ) { if (a.c_str()!=u.fStr) { a= u.fStr; AssignStr( u ); } // assign for destruction afterwards } // AssignChanged TSyError TDB_Api_Session::AdaptItem( string &sItemData1, string &sItemData2, string &sLocalVars, uInt32 sIdentifier ) { TDB_Api_Str updItemData1( sItemData1 ); TDB_Api_Str updItemData2( sItemData2 ); TDB_Api_Str updLocalVars( sLocalVars ); Adapt_Func p= (Adapt_Func)dm->se.seAdapt.Session_AdaptItem; TSyError err= p( sContext, &updItemData1.fStr, &updItemData2.fStr, &updLocalVars.fStr, sIdentifier ); AssignChanged( sItemData1, updItemData1 ); AssignChanged( sItemData2, updItemData2 ); AssignChanged( sLocalVars, updLocalVars ); return err; } // AdaptItem void TDB_Api_Session::ThreadMayChangeNow() { VoidProc p= (VoidProc)dm->se.Session_ThreadMayChangeNow; p( sContext ); } // ThreadMayChangeNow void TDB_Api_Session::DispItems( bool allFields, cAppCharP specificItem ) { DispProc p= (DispProc)dm->se.Session_DispItems; p( sContext, allFields,specificItem ); } // DispItems /* ---- Delete the session context ---------------------------- */ TSyError TDB_Api_Session::DeleteContext() { if (!sCreated) return DB_Forbidden; // remove all still allocated elements before removing the content while (!fSList.empty()) DisposeStr( *fSList.front() ); Context_Func p= (Context_Func)dm->se.Session_DeleteContext; TSyError err= p( sContext ); if (!err) sCreated= false; return err; } // DeleteContext /* ---- "DB_Api" implementation ------------------------------------------- */ TDB_Api::TDB_Api() { fCreated= false; appPointer modu= NULL; connect_no_dbapi( modu, fNo_dbapi ); // the empty connector is default as well dm= &fNo_dbapi; // and assign it } // constructor TDB_Api::~TDB_Api() { DeleteContext(); } // destructor // --- open section ------------------------------------- TSyError TDB_Api::CreateContext( cAppCharP aContextName, bool asAdmin, TDB_Api_Config* config, cAppCharP sDevKey, cAppCharP sUsrKey, TDB_Api_Session* session ) { if (fCreated || !config || !config->fConnected) return DB_Forbidden; string cNam= aContextName; if (cNam.empty()) return DB_NotFound; // empty is not allowed fConfig= config; // make a local copy /* inherit the context information of module and session */ fCB.Callback.cContext= config->mContext; fCB.Callback.mContext= config->fCB.Callback.mContext; if (session) { fCB.Callback.sContext= session->fCB.Callback.sContext; } fDevKey = sDevKey; fUsrKey = sUsrKey; if (config->fADMIN_Info && asAdmin) cNam+= ADMIN_Ident; fContext= 0; dm= &config->m; CreateD_Func p= (CreateD_Func)dm->ds.CreateContext; TSyError err= p( &fContext, cNam.c_str(), &fCB.Callback, fDevKey.c_str(), fUsrKey.c_str() ); if (!err) fCreated= true; return err; } // CreateContext TSyError TDB_Api::RunContext( cAppCharP aContextName, bool asAdmin, SequenceProc sequence, string &token, TDB_Api_Config* config, cAppCharP sDevKey, cAppCharP sUsrKey, TDB_Api_Session* session ) { TSyError err= CreateContext( aContextName, asAdmin, config, sDevKey,sUsrKey, session ); if (err) return err; TSyError dErr; TDB_Api_Str newToken; err= StartDataRead( token.c_str() ); // no sequence is allowed as well if (!err && sequence!=NULL) { err = sequence( *this ); dErr= EndDataWrite( !err, newToken ); if (!err) err= dErr; token= newToken.c_str(); newToken.DisposeStr(); } // if dErr= DeleteContext(); if (!err) err= dErr; return err; } // RunContext // --------------------------------------------------------------------- // returns the nth config data field, which is supported (and activated) // result= 0: no filter supported. uInt32 TDB_Api::ContextSupport( cAppCharP aContextRules ) { Text_Func p= (Text_Func)dm->ds.dsg.ContextSupport; return p( fContext,aContextRules ); } // ContextSupport // returns the nth filter rule, which is supported (and activated) // result= 0: no filter supported. uInt32 TDB_Api::FilterSupport ( cAppCharP aFilterRules ) { Text_Func p= (Text_Func)dm->ds.dsg.FilterSupport; return p( fContext,aFilterRules ); } // FilterSupport // --------------------------------------------------------------------- // Str disposer void TDB_Api::DisposeStr( TDB_Api_Str &s ) { fSList.remove( &s ); // remove it from the list first to avoid double free s.AssignStr( fContext, (DisposeProc)dm->ds.DisposeObj ); s.DisposeStr(); } // DisposeStr // Local wrapper, because it must be DisposeProc type and can't be C++ method static void Local_DisposeStr( CContext aObj, void* memory ) { TDB_Api* a= (TDB_Api*)aObj; TDB_Api_Str* u= (TDB_Api_Str*)memory; a->DisposeStr( *u ); } // Local_DisposeStr void TDB_Api::AssignStr( TDB_Api_Str &s ) { if (s.fStr==NULL) return; s.AssignStr( (CContext)this, Local_DisposeStr, true ); fSList.push_back( &s ); // add the element to the list } // AssignStr // --------------------------------------------------------------------- // Blk disposer void TDB_Api::DisposeBlk( TDB_Api_Blk &b ) { fBList.remove( &b ); // remove it from the list first to avoid double free b.AssignBlk( fContext, (DisposeProc)dm->ds.DisposeObj ); b.DisposeBlk(); } // DisposeBlk // Local wrapper, because it must be DisposeProc type and can't be C++ method static void Local_DisposeBlk( CContext aObj, void* memory ) { TDB_Api* a= (TDB_Api*)aObj; TDB_Api_Blk* u= (TDB_Api_Blk*)memory; a->DisposeBlk( *u ); } // Local_DisposeBlk void TDB_Api::AssignBlk( TDB_Api_Blk &b ) { if (b.fPtr==NULL) return; b.AssignBlk( (CContext)this, Local_DisposeBlk, true ); fBList.push_back( &b ); // add the element to the list } // AssignBlk // --------------------------------------------------------------------- void TDB_Api::GetItemID( TDB_Api_ItemID &aID, TDB_Api_Str &aItemID ) { aItemID= aID.item; fSList.remove( &aID.item ); aID.item.fStr= NULL; // avoid double delete AssignStr ( aItemID ); aID.parent.DisposeStr(); // not used } // GetItemID // --- admin section ------------------------------- // This function gets the stored information about the record with the four paramters: // , (taken from the session context) // , . TSyError TDB_Api::LoadAdminData( cAppCharP aLocDB, cAppCharP aRemDB, TDB_Api_Str &adminData ) { adminData.DisposeStr(); LoadAdm_SFunc p= (LoadAdm_SFunc)dm->ds.dsAdm.str.LoadAdminData; TSyError err= p( fContext, aLocDB,aRemDB, &adminData.fStr ); if (!err) AssignStr( adminData ); return err; } // LoadAdminData TSyError TDB_Api::LoadAdminDataAsKey( cAppCharP aLocDB, cAppCharP aRemDB, KeyH aAdminKey ) { LoadAdm_KFunc p= (LoadAdm_KFunc)dm->ds.dsAdm.key.LoadAdminDataAsKey; TSyError err= p( fContext, aLocDB,aRemDB, aAdminKey ); return err; } // LoadAdminDataAsKey //! This functions stores the new for this context TSyError TDB_Api::SaveAdminData( cAppCharP adminData ) { SaveAdm_SFunc p= (SaveAdm_SFunc)dm->ds.dsAdm.str.SaveAdminData; return p( fContext, adminData ); } // SaveAdminData TSyError TDB_Api::SaveAdminData_AsKey( KeyH adminKey ) { SaveAdm_KFunc p= (SaveAdm_KFunc)dm->ds.dsAdm.key.SaveAdminDataAsKey; return p( fContext, adminKey ); } // SaveAdminDataAsKey // --- Map table handling ---------------------------- //! Get a map item of this context bool TDB_Api::ReadNextMapItem( TDB_Api_MapID &mID, bool aFirst ) { MapID_Struct u; mID.localID.DisposeStr(); mID.remoteID.DisposeStr(); RdNMap_Func p= (RdNMap_Func)dm->ds.dsAdm.map.ReadNextMapItem; bool ok= p( fContext, &u, aFirst ); if (ok) { mID.localID.fStr = u.localID; AssignStr( mID.localID ); mID.remoteID.fStr= u.remoteID; AssignStr( mID.remoteID ); mID.flags = u.flags; mID.ident = u.ident; } // if return ok; } // ReadNextMapItem // Insert a map item of this context TSyError TDB_Api::InsertMapItem( MapID mID ) { InsMap_Func p= (InsMap_Func)dm->ds.dsAdm.map.InsertMapItem; return p( fContext, mID ); } // InsertMapItem // Update a map item of this context TSyError TDB_Api::UpdateMapItem( MapID mID ) { UpdMap_Func p= (UpdMap_Func)dm->ds.dsAdm.map.UpdateMapItem; return p( fContext, mID ); } // UpdateMapItem // Delete a map item of this context TSyError TDB_Api::DeleteMapItem( MapID mID ) { DelMap_Func p= (DelMap_Func)dm->ds.dsAdm.map.DeleteMapItem; return p( fContext, mID ); } // DeleteMapItem // --- general ----------------------------------------- void TDB_Api::ThreadMayChangeNow() { VoidProc p= (VoidProc)dm->ds.dsg.ThreadMayChangeNow; p( fContext ); } // ThreadMayChangeNow //! This functions gets the for this datastore void TDB_Api::WriteLogData( cAppCharP logData ) { SvInfo_Func p= (SvInfo_Func)dm->ds.dsg.WriteLogData; p( fContext, logData ); } // WriteLogData void TDB_Api::DispItems( bool allFields, cAppCharP specificItem ) { DispProc p= (DispProc)dm->ds.dsg.DispItems; p( fContext, allFields, specificItem ); } // DispItems void TDB_Api::AssignChanged( string &a, TDB_Api_Str &u ) { if (a.c_str()!=u.fStr) { a= u.fStr; AssignStr( u ); } // assign for destruction afterwards } // AssignChanged TSyError TDB_Api::AdaptItem( string &sItemData1, string &sItemData2, string &sLocalVars, uInt32 sIdentifier ) { TDB_Api_Str updItemData1( sItemData1 ); TDB_Api_Str updItemData2( sItemData2 ); TDB_Api_Str updLocalVars( sLocalVars ); Adapt_Func p= (Adapt_Func)dm->ds.dsAdapt.AdaptItem; TSyError err= p( fContext, &updItemData1.fStr, &updItemData2.fStr, &updLocalVars.fStr, sIdentifier ); AssignChanged( sItemData1, updItemData1 ); AssignChanged( sItemData2, updItemData2 ); AssignChanged( sLocalVars, updLocalVars ); return err; } // AdaptItem // --- read section ------------------------------------ TSyError TDB_Api::StartDataRead( cAppCharP lastToken, cAppCharP resumeToken ) { typedef TSyError (*OLD_SDR_Func)( CContext aContext, cAppCharP lastToken ); if (!fCreated) return DB_Fatal; // is not defined, if not created // new param supported for Plugin Version >= 1.0.6.X if (fConfig->Supported( VP_ResumeToken )) { SDR_Func p= (SDR_Func)dm->ds.dsData.StartDataRead; return p( fContext, lastToken,resumeToken ); } else { OLD_SDR_Func p= (OLD_SDR_Func)dm->ds.dsData.StartDataRead; return p( fContext, lastToken ); } // if } // StartDataRead // overloaded for using DB:Api_ItemID class TSyError TDB_Api::ReadNextItem( TDB_Api_ItemID &aID, TDB_Api_Str &aItemData, int &aStatus, bool aFirst ) { ItemID_Struct u; sInt32 lStatus; aID.item.DisposeStr(); aID.parent.DisposeStr(); aItemData.DisposeStr(); u.parent= NULL; // works correctly, even if not implemented on user side RdNItemSFunc p= (RdNItemSFunc)dm->ds.dsData.str.ReadNextItem; TSyError err= p( fContext, &u, &aItemData.fStr, &lStatus, aFirst ); aStatus= (int)lStatus; if (err || aStatus==ReadNextItem_EOF) return err; aID.item.fStr = u.item; AssignStr( aID.item ); aID.parent.fStr= u.parent; AssignStr( aID.parent ); AssignStr( aItemData ); // additional info for test //DEBUG_Exotic_DB( fCB, aID.item.c_str(), "ReadNextItem", aItemData.c_str() ); return LOCERR_OK; } // ReadNextItem // overloaded for mode w/o aParentID TSyError TDB_Api::ReadNextItem( TDB_Api_Str &aItemID, TDB_Api_Str &aItemData, int &aStatus, bool aFirst ) { TDB_Api_ItemID aID; TSyError err= ReadNextItem( aID, aItemData, aStatus, aFirst ); if (err || aStatus==ReadNextItem_EOF) return err; GetItemID ( aID, aItemID ); return LOCERR_OK; } // ReadNextItem TSyError TDB_Api::ReadNextItemAsKey( TDB_Api_ItemID &aID, KeyH aItemKey, int &aStatus, bool aFirst ) { ItemID_Struct u; sInt32 lStatus; aID.item.DisposeStr(); aID.parent.DisposeStr(); u.parent= NULL; // works correctly, even if not implemented on user side RdNItemKFunc p= (RdNItemKFunc)dm->ds.dsData.key.ReadNextItemAsKey; TSyError err= p( fContext, &u, aItemKey, &lStatus, aFirst ); aStatus= (int) lStatus; if (err || aStatus==ReadNextItem_EOF) return err; aID.item.fStr = u.item; AssignStr( aID.item ); aID.parent.fStr= u.parent; AssignStr( aID.parent ); return LOCERR_OK; } // ReadNextItemAsKey // overloaded for using ItemID_Struct TSyError TDB_Api::ReadItem( ItemID_Struct aID, TDB_Api_Str &aItemData ) { aItemData.DisposeStr(); Rd_ItemSFunc p= (Rd_ItemSFunc)dm->ds.dsData.str.ReadItem; TSyError err= p( fContext, &aID, &aItemData.fStr ); if (!err) AssignStr ( aItemData ); return err; } // ReadItem // overloaded for , call TSyError TDB_Api::ReadItem( cAppCharP aItemID, cAppCharP aParentID, TDB_Api_Str &aItemData ) { ItemID_Struct a; a.item = (char*) aItemID; a.parent= (char*)aParentID; return ReadItem( a, aItemData ); } // ReadItem // overloaded for mode w/o aParentID TSyError TDB_Api::ReadItem( cAppCharP aItemID, TDB_Api_Str &aItemData ) { return ReadItem( aItemID,"", aItemData ); } // ReadItem TSyError TDB_Api::ReadItemAsKey( ItemID_Struct aID, KeyH aItemKey ) { Rd_ItemKFunc p= (Rd_ItemKFunc)dm->ds.dsData.key.ReadItemAsKey; TSyError err= p( fContext, &aID, aItemKey ); return err; } // ReadItemAsKey // overloaded for using ItemID_Struct TSyError TDB_Api::ReadBlob( ItemID_Struct aID, cAppCharP aBlobID, memSize blkSize, TDB_Api_Blk &aBlk, memSize &totSize, bool aFirst, bool &aLast ) { typedef TSyError (*Rd_Blob_Func)( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer *blkPtr, memSize *blkSize, memSize *totSize, bool aFirst, bool *aLast ); aBlk.DisposeBlk(); aBlk.fSize= blkSize; Rd_Blob_Func p= (Rd_Blob_Func)dm->ds.dsBlob.ReadBlob; TSyError err= p( fContext, &aID,aBlobID, &aBlk.fPtr,&aBlk.fSize, &totSize, aFirst,&aLast ); if (!err) aBlk.AssignBlk( fContext, (DisposeProc)dm->ds.DisposeObj ); return err; } // ReadBlob // overloaded for , call TSyError TDB_Api::ReadBlob( cAppCharP aItemID, cAppCharP aParentID, cAppCharP aBlobID, memSize blkSize, TDB_Api_Blk &aBlk, memSize &totSize, bool aFirst, bool &aLast ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= (char*)aParentID; return ReadBlob( a, aBlobID, blkSize,aBlk,totSize, aFirst,aLast ); } // ReadBlob // overloaded for mode w/o aParentID TSyError TDB_Api::ReadBlob( cAppCharP aItemID, cAppCharP aBlobID, memSize blkSize, TDB_Api_Blk &aBlk, memSize &totSize, bool aFirst, bool &aLast ) { return ReadBlob( aItemID,"", aBlobID, blkSize,aBlk,totSize, aFirst,aLast ); } // ReadBlob TSyError TDB_Api::EndDataRead() { EDR_Func p= (EDR_Func)dm->ds.dsData.EndDataRead; return p( fContext ); } // EndDataRead // --- write section ---------------------------------------------------------------------- TSyError TDB_Api::StartDataWrite() { SDW_Func p= (SDW_Func)dm->ds.dsData.StartDataWrite; return p( fContext ); } // StartDataWrite // Assign to , ignore new parent void TDB_Api::Assign_ItemID( TDB_Api_ItemID &newID, ItemID_Struct &a, cAppCharP parentID ) { newID.item.fStr= a.item; AssignStr ( newID.item ); if (a.parent!=parentID) { // remove it, if explicitely allocated newID.parent.fStr= a.parent; // parent can't be changed !! AssignStr( newID.parent ); newID.parent.DisposeStr(); } // if newID.parent.LocalAlloc( fContext, parentID ); } // Assign_ItemID // ------------------------------------------------------------------------- // overloaded for call TSyError TDB_Api::InsertItem( cAppCharP aItemData, cAppCharP parentID, TDB_Api_ItemID &newID ) { newID.item.DisposeStr(); newID.parent.DisposeStr(); ItemID_Struct a; a.item = NULL; a.parent= (char*)parentID; // works correctly, even if not implemented on user side InsItemSFunc p= (InsItemSFunc)dm->ds.dsData.str.InsertItem; TSyError err= p( fContext, aItemData, &a ); if (!err || err==DB_DataMerged || err==DB_DataReplaced || err==DB_Conflict) { Assign_ItemID( newID, a, parentID ); } // if return err; } // InsertItem // overloaded for mode w/o aParentID TSyError TDB_Api::InsertItem( cAppCharP aItemData, TDB_Api_Str &newItemID ) { TDB_Api_ItemID nID; TSyError err= InsertItem( aItemData, "",nID ); if (!err || err==DB_DataMerged || err==DB_DataReplaced || err==DB_Conflict) { GetItemID( nID, newItemID ); } // if return err; } // InsertItem TSyError TDB_Api::InsertItemAsKey( KeyH aItemKey, cAppCharP parentID, TDB_Api_ItemID &newID ) { newID.item.DisposeStr(); newID.parent.DisposeStr(); ItemID_Struct a; a.item = NULL; a.parent= (char*)parentID; // works correctly, even if not implemented on user side InsItemKFunc p= (InsItemKFunc)dm->ds.dsData.key.InsertItemAsKey; TSyError err= p( fContext, aItemKey, &a ); if (!err || err==DB_DataMerged || err==DB_DataReplaced || err==DB_Conflict) { Assign_ItemID( newID, a, parentID ); } // if return err; } // InsertItemAsKey // ------------------------------------------------------------------------- // overloaded for using ItemID_Struct TSyError TDB_Api::UpdateItem( cAppCharP aItemData, ItemID_Struct aID, TDB_Api_ItemID &updID ) { updID.item.DisposeStr(); updID.parent.DisposeStr(); ItemID_Struct u; u.item = NULL; u.parent= (char*)aID.parent; // works correctly, even if not implemented on user side UpdItemSFunc p= (UpdItemSFunc)dm->ds.dsData.str.UpdateItem; TSyError err= p( fContext, aItemData, &aID,&u ); if (!err) { Assign_ItemID( updID, u, aID.parent ); } // if return err; } // UpdateItem // overloaded for , call TSyError TDB_Api::UpdateItem( cAppCharP aItemData, cAppCharP aItemID, cAppCharP aParentID, TDB_Api_ItemID &updID ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= (char*)aParentID; return UpdateItem( aItemData, a,updID ); } // UpdateItem // overloaded for mode w/o aParentID TSyError TDB_Api::UpdateItem( cAppCharP aItemData, cAppCharP aItemID, TDB_Api_Str &updItemID ) { TDB_Api_ItemID uID; TSyError err= UpdateItem( aItemData, aItemID,"", uID ); if (!err) GetItemID( uID, updItemID ); return err; } // UpdateItem TSyError TDB_Api::UpdateItem( cAppCharP aItemData, TDB_Api_ItemID &aID, TDB_Api_ItemID &updID ) { return UpdateItem( aItemData, (char*)aID.item.c_str(), (char*)aID.parent.c_str(), updID ); } // UpdateItem TSyError TDB_Api::UpdateItemAsKey( KeyH aItemKey, ItemID_Struct aID, TDB_Api_ItemID &updID ) { updID.item.DisposeStr(); updID.parent.DisposeStr(); ItemID_Struct u; u.item = NULL; u.parent= (char*)aID.parent; // works correctly, even if not implemented on user side UpdItemKFunc p= (UpdItemKFunc)dm->ds.dsData.key.UpdateItemAsKey; TSyError err= p( fContext, aItemKey, &aID,&u ); if (!err) { Assign_ItemID( updID, u, aID.parent ); } // if return err; } // UpdateItemAsKey TSyError TDB_Api::UpdateItemAsKey( KeyH aItemKey, TDB_Api_ItemID &aID, TDB_Api_ItemID &updID ) { ItemID_Struct a; a.item = (char*)aID.item.c_str(); a.parent= (char*)aID.parent.c_str(); return UpdateItemAsKey( aItemKey, a, updID ); } // UpdateItemAsKey // ------------------------------------------------------------------------- // overloaded for using ItemID_Struct TSyError TDB_Api::MoveItem( ItemID_Struct aID, cAppCharP newParID ) { MovItem_Func p= (MovItem_Func)dm->ds.dsData.ind.MoveItem; return p( fContext, &aID,newParID ); } // MoveItem // overloaded for , call TSyError TDB_Api::MoveItem( cAppCharP aItemID, cAppCharP aParentID, cAppCharP newParID ) { ItemID_Struct a; a.item = (appCharP) aItemID; a.parent= (appCharP)aParentID; return MoveItem( a, newParID ); } // MoveItem // ------------------------------------------------------------------------- // overloaded for using ItemID_Struct TSyError TDB_Api::DeleteItem( ItemID_Struct aID ) { DelItem_Func p= (DelItem_Func)dm->ds.dsData.ind.DeleteItem; return p( fContext, &aID ); } // DeleteItem // overloaded for , call TSyError TDB_Api::DeleteItem( cAppCharP aItemID, cAppCharP aParentID ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= (char*)aParentID; return DeleteItem( a ); } // DeleteItem // overloaded for using TDB_Api_ItemID // object will not be removed here TSyError TDB_Api::DeleteItem( TDB_Api_ItemID &aID ) { return DeleteItem( (char*)aID.item.c_str(), (char*)aID.parent.c_str() ); } // DeleteItem // ------------------------------------------------------------------------- TSyError TDB_Api::FinalizeLocalID( ItemID_Struct aID, TDB_Api_ItemID &updID ) { updID.item.DisposeStr(); updID.parent.DisposeStr(); if (!fConfig->Supported( VP_FLI_DSS )) return LOCERR_NOTIMP; ItemID_Struct u; u.item = NULL; u.parent= (char*)aID.parent; // works correctly, even if not implemented on user side FLI_Func p= (FLI_Func)dm->ds.dsData.ind.FinalizeLocalID; TSyError err= p( fContext, &aID,&u ); if (!err) { Assign_ItemID( updID, u, aID.parent ); } // if return err; } // FinalizeLocalID TSyError TDB_Api::FinalizeLocalID( TDB_Api_ItemID &aID, TDB_Api_ItemID &updID ) { return FinalizeLocalID( (char*)aID.item.c_str(), (char*)aID.parent.c_str(), updID ); } // FinalizeLocalID TSyError TDB_Api::FinalizeLocalID( cAppCharP aItemID, TDB_Api_Str &updItemID ) { TDB_Api_ItemID uID; TSyError err= FinalizeLocalID( aItemID,"", uID ); if (!err) GetItemID( uID, updItemID ); return err; } // FinalizeLocalID TSyError TDB_Api::FinalizeLocalID( cAppCharP aItemID, cAppCharP aParentID, TDB_Api_ItemID &updID ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= (char*)aParentID; return FinalizeLocalID( a, updID ); } // FinalizeLocalID TSyError TDB_Api::DeleteSyncSet() { if (!fConfig->Supported( VP_FLI_DSS )) return LOCERR_NOTIMP; DelSS_Func p= (DelSS_Func)dm->ds.dsData.ind.DeleteSyncSet; return p( fContext ); } // DeleteSyncSet // ------------------------------------------------------------------------- // overloaded for using ItemID_Struct TSyError TDB_Api::WriteBlob( ItemID_Struct aID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ) { typedef TSyError (*Wr_BlobFunc)( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ); Wr_BlobFunc p= (Wr_BlobFunc)dm->ds.dsBlob.WriteBlob; return p( fContext, &aID,aBlobID, blkPtr,blkSize,totSize, aFirst,aLast ); } // WriteBlob // overloaded for mode with and TSyError TDB_Api::WriteBlob( cAppCharP aItemID, cAppCharP aParentID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= (char*)aParentID; return WriteBlob( a,aBlobID, blkPtr,blkSize,totSize, aFirst,aLast ); } // WriteBlob // overloaded for mode w/o TSyError TDB_Api::WriteBlob( cAppCharP aItemID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ) { return WriteBlob( aItemID,"", aBlobID, blkPtr,blkSize,totSize, aFirst,aLast ); } // WriteBlob // overloaded for using TDB_Api_ItemID TSyError TDB_Api::WriteBlob( TDB_Api_ItemID &aID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ) { return WriteBlob( (char*)aID.item.c_str(), (char*)aID.parent.c_str(), aBlobID, blkPtr,blkSize,totSize, aFirst,aLast ); } // WriteBlob // ------------------------------------------------------------------------- // overloaded for using ItemID_Struct TSyError TDB_Api::DeleteBlob( ItemID_Struct aID, cAppCharP aBlobID ) { typedef TSyError (*DelBlobFunc)( CContext aContext, cItemID aID, cAppCharP aBlobID ); DelBlobFunc p= (DelBlobFunc)dm->ds.dsBlob.DeleteBlob; return p( fContext, &aID,aBlobID ); } // DeleteBlob // overloaded for mode with and TSyError TDB_Api::DeleteBlob( cAppCharP aItemID, cAppCharP aParentID, cAppCharP aBlobID ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= (char*)aParentID; return DeleteBlob( a,aBlobID ); } // DeleteBlob // overloaded for mode w/o TSyError TDB_Api::DeleteBlob( cAppCharP aItemID, cAppCharP aBlobID ) { return DeleteBlob( aItemID,"", aBlobID ); } // DeleteBlob // overloaded for using TDB_Api_ItemID TSyError TDB_Api::DeleteBlob( TDB_Api_ItemID &aID, cAppCharP aBlobID ) { return DeleteBlob( (char*)aID.item.c_str(), (char*)aID.parent.c_str(), aBlobID ); } // DeleteBlob // ------------------------------------------------------------------------- TSyError TDB_Api::EndDataWrite( bool success, TDB_Api_Str &newToken ) { newToken.DisposeStr(); EDW_Func p= (EDW_Func)dm->ds.dsData.EndDataWrite; TSyError err= p( fContext, success, &newToken.fStr ); if (!err) { AssignStr( newToken ); if (!success) err= DB_Fatal; } // if return err; } // EndDataWrite // --- close section -------------------------------- TSyError TDB_Api::DeleteContext() { if (!fCreated) return DB_Forbidden; // remove all still allocated elements before removing the content while (!fSList.empty()) DisposeStr( *fSList.front() ); while (!fBList.empty()) DisposeBlk( *fBList.front() ); Context_Func p= (Context_Func)dm->ds.DeleteContext; TSyError err= p( fContext ); if (!err) fCreated= false; return err; } // DeleteContext } // namespace /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/dbapi.h0000755000373300037200000005537112424517753026471 0ustar00nightlyallusers00000000000000/* * File: dbapi.h * * Author: Beat Forster (bfo@synthesis.ch) * * TDB_Api class * Bridge to user programmable interface * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * The "TDB_Api" class acts as a standard interface between * the SySync Server and a (user programmable) module "sync_dbapi". * * It is possible to have more than one (identical) interface module, * either packed into a DLL or directly linked to the server * (or combined). * * - In case of DLL, the object must be created with * = DLL file name, e.g "sync_dbapi.dll" * The constructor automatically creates the connection to the DLL, * the destructor releases the DLL. * * - In case of the directly linked module, it runs in a * specific namespace, which can be assigned by calling * = '['']', e.g. "[example1]". * (Of course an internal implementation for each namespace must * exist!) * * NOTE: The public method names are identical to the ones of the * user interface, but not all parameters are visible on the * object side, e.g. the context variable is held private * within the object. * The methods will be assigned internally (at API_Methods), * when the object is created. */ #ifndef DB_API_H #define DB_API_H // access to the definitions of the interface #include #include #include "sync_dbapiconnect.h" #include "sync_dbapidef.h" namespace sysync { /* -- Utility procs -- */ bool DSConnect( cAppCharP aItem ); /* -- handling for "sync_dbapi" returned strings -- */ class TDB_Api_Str { friend class TDB_Api_Config; friend class TDB_Api_Session; friend class TDB_Api; public: TDB_Api_Str(); // constructor TDB_Api_Str( string &s ); // alternative constructor ~TDB_Api_Str(); // destructor // the string reference cAppCharP c_str() const { return (fStr==NULL) ? "":fStr; } bool empty(void) { return *c_str()==0; } int length() const { return sizeof( c_str() ); }; // has the same effect as the destructor, but can be called earlier void DisposeStr(); private: void AssignStr ( CContext aContext, DisposeProc aDisposeProc, bool itself= false ); void LocalAlloc( CContext aContext, cAppCharP ); // if memory must be allocated locally CContext fContext; char* fStr; bool fItself; // if true: Dispose instead of DisposeProc fDisposeProc; void clear() { fDisposeProc= NULL; fStr= NULL; } }; // TDB_Api_Str /* -- handling for "sync_dbapi" returned itemID/parentID strings */ class TDB_Api_ItemID { public: TDB_Api_Str item; TDB_Api_Str parent; }; // TDB_Api_ItemID class TDB_Api_MapID { public: TDB_Api_Str localID; TDB_Api_Str remoteID; uInt16 flags; uInt8 ident; }; // TDB_Api_MapID /* -- handling for "sync_dbapi" returned blocks */ class TDB_Api_Blk { friend class TDB_Api_Config; friend class TDB_Api; public: TDB_Api_Blk(); // constructor ~TDB_Api_Blk(); // destructor appPointer fPtr; // the block reference memSize fSize; // the block size void DisposeBlk(); // has the same effect as the destructor, but can be called earlier protected: void AssignBlk( CContext aContext, DisposeProc aDisposeProc, bool itself= false ); private: CContext fContext; bool fItself; // if true: Dispose instead of DisposeProc fDisposeProc; void clear() { fDisposeProc= NULL; fPtr= NULL; fSize= 0; } }; // TDB_Api_Blk // -- internally used type definitions --------- typedef TSyError (*CreateM_Func)( CContext *mc, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB ); typedef CVersion (*Version_Func)( CContext mc ); typedef TSyError (*Context_Func)( CContext mc ); // --------------------------------------------- typedef TSyError (*CreateS_Func)( CContext *sc, cAppCharP sessionName, DB_Callback sCB ); typedef TSyError (*SvInfo_Func)( CContext sc, cAppCharP info ); typedef int (*PwMode_Func)( CContext sc ); typedef TSyError (*Login_Func)( CContext sc, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey ); // --------------------------------------------- typedef TSyError (*CreateD_Func)( CContext *ac, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ); typedef int (*Text_Func)( CContext ac, cAppCharP aText ); typedef void (*DispProc)( CContext ac, bool allFields, cAppCharP specificItem ); typedef TSyError (*LoadAdm_SFunc)( CContext ac, cAppCharP aLocDB, cAppCharP aRemDB, appCharP *adminData ); typedef TSyError (*LoadAdm_KFunc)( CContext ac, cAppCharP aLocDB, cAppCharP aRemDB, KeyH adminKey ); typedef TSyError (*SaveAdm_SFunc)( CContext sc, cAppCharP info ); typedef TSyError (*SaveAdm_KFunc)( CContext ac, KeyH adminKey ); typedef bool (*RdNMap_Func)( CContext ac, MapID mID, bool aFirst ); typedef TSyError (*InsMap_Func)( CContext ac, cMapID mID ); typedef TSyError (*UpdMap_Func)( CContext ac, cMapID mID ); typedef TSyError (*DelMap_Func)( CContext ac, cMapID mID ); typedef void (*VoidProc)( CContext ac ); typedef TSyError (*Adapt_Func)( CContext ac, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, sInt32 aIdentifier ); // --------------------------------------------- // wrapper for DB_Callback class TDB_Api_Callback { public: TDB_Api_Callback(); SDK_Interface_Struct Callback; }; // TDB_Api_Callback // the module context class class TDB_Api_Config { friend class TDB_Api_Session; friend class TDB_Api; friend class TUI_Api; public: TDB_Api_Config(); // constructor ~TDB_Api_Config(); // destructor // Connect to the plug-in with // must be 0 before called the first time TSyError Connect( cAppCharP moduleName, CContext &globContext, cAppCharP mContextName= "", bool aIsLib= false, bool allowDLL= true ); bool Connected() { return fConnected; } // read status of // The plug-in module's version, capabilities and plugin params from config file long Version(); // the plugin's SDK version number long EngineSDKVersion(); // the internal engine's SDK version number TSyError Capabilities( TDB_Api_Str &mCapabilities ); TSyError PluginParams( cAppCharP mConfigParams ); // Change the internal engine's SDK version; // *** override the version number / for test only *** void SetVersion( long versionNr ); /* Check the minimum required version */ TSyError MinVersionCheck( string capa, CVersion &vMin ); // Check, if MINVERSION is high enough // Disconnect the module(at the end TSyError Disconnect(); bool is_lib; // flag: as internal library TDB_Api_Callback fCB; // Callback wrapper cAppCharP ModName() { return fModName.c_str(); } // the cAppCharP ModOptions() { return fOptions.c_str(); } // the module's parameters cAppCharP ModPlugin() { return fPlugin.c_str(); } // the main module's name cAppCharP ModMainName() { return fModMain.c_str(); } // the main module's name (with optional extension ":..." cAppCharP ModSubName() { return fModSub.c_str(); } // the sub module's name (with params) void DisposeStr( TDB_Api_Str &s ); private: void AssignStr( TDB_Api_Str &s ); // for internal use void clear(); bool Supported( CVersion version_feature ); // Check, if is supported // Internal Api assignment TSyError DBApi_Assign( cAppCharP item, appPointer aField, memSize aFieldSize, cAppCharP aKey= "" ); CContext mContext; // the module's context API_Methods m; // set of Lib/DLL routines string fModName; // local copy of string fOptions; // local copy of module's paramters string fPlugin; // main part of w/o brackets w/o extension string fModMain; // main part of w/o brackets, with optional extension string fModSub; // sub part of w/o brackets string fDesc; // module's description bool fConnected; // if successful= API_Methods valid bool fADMIN_Info; // ADMIN info will be given with "CreateContext" CVersion fSDKversion; // The SDK's version (directly connected module) CVersion fMODversion; // The SDK's version (lowest of the chain) CVersion fTSTversion; // Modified version (*** for test only ***) appPointer fMod; // internal module reference list fSList; // list of currently allocated str objects of this session }; // class TDB_Api_Config // Display global context contents void DispGlobContext ( CContext &globContext, DB_Callback mCB ); // Delete the global context at the end void DeleteGlobContext( CContext &globContext, DB_Callback mCB, bool emptyTextOnly= false ); // the session context class class TDB_Api_Session { public: TDB_Api_Session(); // constructor TSyError CreateContext ( cAppCharP sessionName, TDB_Api_Config &config ); TSyError CheckDevice ( cAppCharP deviceID, TDB_Api_Str &sDevKey, TDB_Api_Str &nonce ); TSyError GetNonce ( TDB_Api_Str &nonce ); TSyError SaveNonce ( cAppCharP nonce ); TSyError SaveDeviceInfo( cAppCharP aDeviceInfo ); TSyError GetDBTime ( TDB_Api_Str ¤tDBTime ); #ifdef SYSYNC_ENGINE TSyError GetDBTime ( lineartime_t ¤tDBTime, GZones* g ); #endif sInt32 PasswordMode(); TSyError Login( cAppCharP sUsername, cAppCharP sPassword, TDB_Api_Str &sUsrKey ); // for password mode 0+3 TSyError Login( cAppCharP sUsername, TDB_Api_Str &sPassword, TDB_Api_Str &sUsrKey ); // for password mode 1+2 TSyError Logout(); TSyError AdaptItem( string &sItemData1, string &sItemData2, string &sLocalVars, uInt32 sIdentifier ); void ThreadMayChangeNow(); // notification for the context void DispItems( bool allFields= true, cAppCharP specificItem= "" ); // by default: all TSyError DeleteContext(); TDB_Api_Callback fCB; // Callback wrapper bool sCreated; CContext sContext; // the session context void DisposeStr( TDB_Api_Str &s ); private: void AssignStr ( TDB_Api_Str &s ); // for internal use void AssignChanged ( string &a, TDB_Api_Str &u ); API_Methods* dm; // local reference to the API methods API_Methods sNo_dbapi; // default connection for call methods string sSessionName; // local copy of sInt32 sPwMode; // local copy of password mode list fSList; // list of currently allocated str objects of this session }; // class TDB_Api_Session // for detailed description of the methods see // C interface definition at "sync_dbapi.h" // An object for each context must be created. // It is not possible to create more than one context per object // It is allowed to bind more than one context to the same module. class TDB_Api { public: TDB_Api(); // constructor ~TDB_Api(); // destructor // --- open section -------------------------------- //! Open a context, it is possible to do this w/o any session TSyError CreateContext( cAppCharP aContextName, bool asAdmin, TDB_Api_Config* config, cAppCharP sDevKey= "", cAppCharP sUsrKey= "", TDB_Api_Session* session= NULL ); /*! Gets true after calling 'CreateContext'. * Will return again false after 'DeleteContext' */ bool Created() { return fCreated; }; //! run a sequence: CreateContext -> StartDataRead -> sequence -> EndDataWrite -> DeleteContext //! as input: the token of the last session, "" if the first time. //! " as output: the new token, which must be given to the next session. typedef TSyError(*SequenceProc)( TDB_Api &dbApi ); TSyError RunContext( cAppCharP aContextName, bool asAdmin, SequenceProc sequence, string &token, TDB_Api_Config* config, cAppCharP sDevKey= "", cAppCharP sUsrKey= "", TDB_Api_Session* session= NULL ); //! returns the nth config data field, which is supported (and activated) //! result= 0: no filter supported. uInt32 ContextSupport( cAppCharP aContextRules ); //! returns the nth filter rule, which is supported (and activated) //! result= 0: no filter supported. uInt32 FilterSupport( cAppCharP aFilterRules ); // --- admin section ------------------------------- //! This function gets the stored information about the record with the four paramters: //! , (taken from the session context) //! , . //! And the same for AsKey (will be activated with ADMIN_AS_KEY) TSyError LoadAdminData ( cAppCharP aLocDB, cAppCharP aRemDB, TDB_Api_Str &adminData ); TSyError LoadAdminDataAsKey( cAppCharP aLocDB, cAppCharP aRemDB, KeyH adminKey ); //! This functions stores the new for this context //! And the same for AsKey (will be activated with ADMIN_AS_KEY) TSyError SaveAdminData ( cAppCharP adminData ); TSyError SaveAdminData_AsKey( KeyH adminKey ); // --- Map table handling //! Get a map item of this context bool ReadNextMapItem( TDB_Api_MapID &mID, bool aFirst= false ); //! Insert a map item of this context TSyError InsertMapItem( MapID mID ); //! Update a map item of this context TSyError UpdateMapItem( MapID mID ); //! Delete a map item of this context TSyError DeleteMapItem( MapID mID ); // --- utility section ----------------------------- //! Get the current context value CContext MyContext() { return fContext; } //! Notification for the context void ThreadMayChangeNow(); //! Write log information for the datastore access void WriteLogData( cAppCharP logData ); //! Display the current items (not used by the engine) void DispItems( bool allFields= true, cAppCharP specificItem= "" ); // by default: all //! Adapt ,, of script context, with TSyError AdaptItem( string &aItemData1, string &aItemData2, string &aLocalVars, uInt32 aIdentifier ); // --- read section -------------------------------- TSyError StartDataRead( cAppCharP lastToken, cAppCharP resumeToken= "" ); // / and will automatically be disposed at the beginning // 2 overloaded versions TSyError ReadNextItem ( TDB_Api_ItemID &aID, TDB_Api_Str &aItemData, int &aStatus, bool aFirst= false ); TSyError ReadNextItem ( TDB_Api_Str &aItemID, TDB_Api_Str &aItemData, int &aStatus, bool aFirst= false ); TSyError ReadNextItemAsKey( TDB_Api_ItemID &aID, KeyH aItemKey, int &aStatus, bool aFirst= false ); // will automatically be disposed at the beginning // 3 overloaded versions TSyError ReadItem ( ItemID_Struct aID, TDB_Api_Str &aItemData ); TSyError ReadItem ( cAppCharP aItemID, TDB_Api_Str &aItemData ); TSyError ReadItem ( cAppCharP aItemID, cAppCharP aParentID, TDB_Api_Str &aItemData ); TSyError ReadItemAsKey( ItemID_Struct aID, KeyH aItemKey ); // will automatically be disposed at the beginning // 3 overloaded versions TSyError ReadBlob( ItemID_Struct aID, cAppCharP aBlobID, memSize blkSize, TDB_Api_Blk &aBlk, memSize &totSize, bool aFirst, bool &aLast ); TSyError ReadBlob( cAppCharP aItemID, cAppCharP aBlobID, memSize blkSize, TDB_Api_Blk &aBlk, memSize &totSize, bool aFirst, bool &aLast ); TSyError ReadBlob( cAppCharP aItemID, cAppCharP aParentID, cAppCharP aBlobID, memSize blkSize, TDB_Api_Blk &aBlk, memSize &totSize, bool aFirst, bool &aLast ); TSyError EndDataRead(); // --- write section -------------------------------- TSyError StartDataWrite(); // will automatically be disposed at the beginning. // 2 overloaded versions TSyError InsertItem ( cAppCharP aItemData, cAppCharP parentID, TDB_Api_ItemID &newID ); TSyError InsertItem ( cAppCharP aItemData, TDB_Api_Str &newItemID ); TSyError InsertItemAsKey( KeyH aItemKey, cAppCharP parentID, TDB_Api_ItemID &newID ); TSyError FinalizeLocalID( ItemID_Struct aID, TDB_Api_ItemID &updID ); TSyError FinalizeLocalID( TDB_Api_ItemID &aID, TDB_Api_ItemID &updID );// obj will not be removed here TSyError FinalizeLocalID( cAppCharP aItemID, TDB_Api_Str &updItemID ); TSyError FinalizeLocalID( cAppCharP aItemID, cAppCharP aParentID, TDB_Api_ItemID &updID ); // will automatically be disposed at the beginning. // 4 overloaded versions TSyError UpdateItem( cAppCharP aItemData, ItemID_Struct aID, TDB_Api_ItemID &updID ); TSyError UpdateItem( cAppCharP aItemData, TDB_Api_ItemID &aID, TDB_Api_ItemID &updID ); // obj will not be removed here TSyError UpdateItem( cAppCharP aItemData, cAppCharP aItemID, TDB_Api_Str &updItemID ); TSyError UpdateItem( cAppCharP aItemData, cAppCharP aItemID, cAppCharP aParentID, TDB_Api_ItemID &updID ); TSyError UpdateItemAsKey( KeyH aItemKey, ItemID_Struct aID, TDB_Api_ItemID &updID ); TSyError UpdateItemAsKey( KeyH aItemKey, TDB_Api_ItemID &aID, TDB_Api_ItemID &updID ); // obj will not be removed here // 2 overloaded versions TSyError MoveItem ( ItemID_Struct aID, cAppCharP newParID ); TSyError MoveItem ( cAppCharP aItemID, cAppCharP aParentID, cAppCharP newParID ); // 3 overloaded versions TSyError DeleteItem( ItemID_Struct aID ); TSyError DeleteItem( cAppCharP aItemID, cAppCharP parentID="" ); TSyError DeleteItem( TDB_Api_ItemID &aID ); // obj will not be removed here TSyError DeleteSyncSet(); // , and can be omitted, their default values are 0,true,true // 4 overloaded versions TSyError WriteBlob ( ItemID_Struct aID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize= 0, bool aFirst= true, bool aLast= true ); TSyError WriteBlob ( cAppCharP aItemID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize= 0, bool aFirst= true, bool aLast= true ); TSyError WriteBlob ( cAppCharP aItemID, cAppCharP aParentID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize= 0, bool aFirst= true, bool aLast= true ); TSyError WriteBlob ( TDB_Api_ItemID &aID, cAppCharP aBlobID, // obj will not be removed here appPointer blkPtr, memSize blkSize, memSize totSize= 0, bool aFirst= true, bool aLast= true ); // 4 overloaded versions TSyError DeleteBlob( ItemID_Struct aID, cAppCharP aBlobID ); TSyError DeleteBlob( cAppCharP aItemID, cAppCharP aBlobID ); TSyError DeleteBlob( cAppCharP aItemID, cAppCharP aParentID, cAppCharP aBlobID ); TSyError DeleteBlob( TDB_Api_ItemID &aID, cAppCharP aBlobID ); // obj will not be removed here TSyError EndDataWrite( bool success, TDB_Api_Str &newToken ); // --- close section -------------------------------- TSyError DeleteContext(); TDB_Api_Callback fCB; // Callback wrapper CContext fContext; // local copy of the context void DisposeStr ( TDB_Api_Str &s ); void DisposeBlk ( TDB_Api_Blk &b ); private: void AssignStr ( TDB_Api_Str &s ); // for internal use only void AssignBlk ( TDB_Api_Blk &b ); void AssignChanged( string &a, TDB_Api_Str &u ); void GetItemID ( TDB_Api_ItemID &aID, TDB_Api_Str &aItem ); void Assign_ItemID( TDB_Api_ItemID &newID, ItemID_Struct &aID, cAppCharP parentID ); API_Methods* dm; // connection field reference API_Methods fNo_dbapi; // default connection for call methods list fSList; // list of currently allocated str objects of this datastore list fBList; // " " " " blk " " " " TDB_Api_Config* fConfig; // assigned module bool fCreated; // true, as long is valid (between 'CreateContext' // and 'DeleteContext') string fDevKey; // local copies string fUsrKey; }; // TDB_Api } // namespace #endif // DB_API_H /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/dbapi_include.h0000755000373300037200000003360412424517753030167 0ustar00nightlyallusers00000000000000/* * File: dbapi_include.h * * Author: Beat Forster * * DB_Api class * Bridge to user programmable interface * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ /* include definitions for each namespace */ #undef SYNC_DBAPI_H #include "sync_dbapi.h" #undef SYNC_UIAPI_H #include "sync_uiapi.h" #if defined __cplusplus using sysync::ConnectFunctions; using sysync::LOCERR_OK; using sysync::DB_NotFound; using sysync::DB_Forbidden; using sysync::DB_Error; using sysync::DB_Fatal; using sysync::VP_BadVersion; #endif static TSyError AssignMethods( appPointer aMod, appPointer aField, memSize aFieldSize, cAppCharP aKey= "" ) { // ---- module ----------------------------------------------------------------- if (strcmp( aKey,Plugin_Start )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- start of plugin connection Module_CreateContext, Module_Version, Module_Capabilities, NULL ); } // if if (strcmp( aKey,Plugin_Param )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- plugin params Module_PluginParams, NULL ); } // if // ---- session ---------------------------------------------------------------- #if !defined DISABLE_PLUGIN_SESSIONAUTH || !defined DISABLE_PLUGIN_DEVICEADMIN if (strcmp( aKey,Plugin_Session )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- session ---- Session_CreateContext, XX, /*-----* adaptitem */ XX, /*-----* session auth */ XX, /* */ XX, /*-----*/ XX, /*-----* device admin */ XX, /* */ XX, /* */ XX, /* */ XX, /*-----*(dbtime) */ Session_DisposeObj, Session_ThreadMayChangeNow, Session_DispItems, Session_DeleteContext, NULL ); } // if if (strcmp( aKey,Plugin_SE_Adapt )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- device admin (GetDBTime) ---- Session_AdaptItem, NULL ); } // if #endif #ifndef DISABLE_PLUGIN_SESSIONAUTH if (strcmp( aKey,Plugin_SE_Auth )==0 || // new AND old strcmp( aKey,Plugin_SE_Auth_OLD )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- session auth ---- Session_PasswordMode, Session_Login, Session_Logout, NULL ); } // if #endif #ifndef DISABLE_PLUGIN_DEVICEADMIN if (strcmp( aKey,Plugin_DV_Admin )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- device admin ---- Session_CheckDevice, Session_GetNonce, Session_SaveNonce, Session_SaveDeviceInfo, NULL ); } // if if (strcmp( aKey,Plugin_DV_DBTime )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- device admin (GetDBTime) ---- Session_GetDBTime, NULL ); } // if #endif // ---- datastore -------------------------------------------------------------- #if !defined DISABLE_PLUGIN_DATASTOREADMIN || !defined DISABLE_PLUGIN_DATASTOREDATA if (strcmp( aKey,Plugin_DS_General )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- general datastore routines ---- ContextSupport, FilterSupport, ThreadMayChangeNow, WriteLogData, DispItems, NULL ); } // if #endif /* #ifndef DISABLE_PLUGIN_DATASTOREADMIN if (strcmp( aKey,Plugin_DS_Admin )==0 || // new AND old strcmp( aKey,Plugin_DS_Admin_OLD )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- datastore admin ---- LoadAdminData, SaveAdminData, ReadNextMapItem, InsertMapItem, UpdateMapItem, DeleteMapItem, NULL ); } // if #endif */ #ifndef DISABLE_PLUGIN_DATASTOREADMIN #ifndef DISABLE_PLUGIN_DATASTOREADMIN_STR if (strcmp( aKey,Plugin_DS_Admin_Str )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- aItemData functions ---- LoadAdminData, SaveAdminData, NULL ); } // if #endif #ifndef DISABLE_PLUGIN_DATASTOREADMIN_KEY if (strcmp( aKey,Plugin_DS_Admin_Key )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- aItemKey functions ---- LoadAdminDataAsKey, SaveAdminDataAsKey, NULL ); } // if #endif if (strcmp( aKey,Plugin_DS_Admin_Map )==0 || // new AND old strcmp( aKey,Plugin_DS_Admin_OLD )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- datastore admin ---- ReadNextMapItem, InsertMapItem, UpdateMapItem, DeleteMapItem, NULL ); } // if #endif #ifndef DISABLE_PLUGIN_ADAPTITEM if (strcmp( aKey,Plugin_DS_Adapt )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, AdaptItem, NULL ); } // if #endif #ifndef DISABLE_PLUGIN_DATASTOREDATA if (strcmp( aKey,Plugin_DS_Data )==0 || // new AND old strcmp( aKey,Plugin_DS_Data_OLD1 )==0 || strcmp( aKey,Plugin_DS_Data_OLD2 )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- datastore data ---- StartDataRead, // read EndDataRead, StartDataWrite, // write EndDataWrite, /*-----*/ XX, /* */ XX, /* str */ XX, /* */ XX, /* */ /*-----*/ XX, /* */ XX, /* key */ XX, /* */ XX, /* */ /*-----*/ FinalizeLocalID, // ind MoveItem, DeleteItem, DeleteSyncSet, NULL ); } // if #ifndef DISABLE_PLUGIN_DATASTOREDATA_STR if (strcmp( aKey,Plugin_DS_Data_Str )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- aItemData routines ---- ReadNextItem, ReadItem, InsertItem, UpdateItem, NULL ); } // if #endif #ifndef DISABLE_PLUGIN_DATASTOREDATA_KEY if (strcmp( aKey,Plugin_DS_Data_Key )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- aItemKey routines ---- ReadNextItemAsKey, ReadItemAsKey, InsertItemAsKey, UpdateItemAsKey, NULL ); } // if #endif #endif #if !defined DISABLE_PLUGIN_DATASTOREADMIN || !defined DISABLE_PLUGIN_DATASTOREDATA if (strcmp( aKey,Plugin_DS_Blob )==0 || // new AND old strcmp( aKey,Plugin_DS_Blob_OLD1 )==0 || strcmp( aKey,Plugin_DS_Blob_OLD2 )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- BLOBs ---- ReadBlob, WriteBlob, DeleteBlob, NULL ); } // if #endif #if !defined DISABLE_PLUGIN_DATASTOREADMIN || !defined DISABLE_PLUGIN_DATASTOREDATA || !defined DISABLE_PLUGIN_ADAPTITEM if (strcmp( aKey,Plugin_Datastore )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, CreateContext, // open XX, /*+*---- general */ XX, /*+*/ XX, /*+*/ XX, /*+*/ XX, /*+*/ /* */ /*-----* admin */ XX, /* str */ XX, /* */ /*-----*/ XX, /* key */ XX, /* */ /*-----*/ XX, /* */ XX, /* map */ XX, /* */ XX, /* */ /*-----*/ /* */ /*-----* data read/write */ XX, /* rd */ XX, /* */ /*-----*/ XX, /* wr */ XX, /* */ /*-----*/ XX, /* */ XX, /* str */ XX, /* */ XX, /* */ /*-----*/ XX, /* */ XX, /* key */ XX, /* */ XX, /* */ /*-----*/ XX, /* */ XX, /* ind */ XX, /* */ XX, /* */ /*-----*/ /* */ XX, /*-----* blobs */ XX, /* */ XX, /*-----*/ XX, /*-----* adaptitem */ DisposeObj, DeleteContext, // close NULL ); } // if #endif #ifdef ENABLE_PLUGIN_UI // ---- ui context ------------------------------------------------ if (strcmp( aKey,Plugin_UI )==0) { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- ui ---- UI_CreateContext, UI_RunContext, UI_DeleteContext, NULL ); } // if #endif // default settings if (*aKey=='\0') { return ConnectFunctions( aMod, aField,aFieldSize, false, // ---- module ---- XX, /*-----* start */ XX, /* */ XX, /*-----*/ XX, /*-----* plugin params */ Module_DisposeObj, Module_DeleteContext, // ---- session ---- XX, /*+*/ /* */ XX, /*-*---* login */ XX, /* */ XX, /*-*---*/ /* */ XX, /*-*---* dev admin */ XX, /* */ XX, /* */ XX, /* */ XX, /*-*---*(db time) */ /* */ XX, /*-*---* adaptitem */ /* */ XX, /*+*/ XX, /*+*/ XX, /*+*/ XX, /*+*/ // ---- datastore ---- XX, /*-* open */ XX, /*+*---- general */ XX, /*+*/ XX, /*+*/ XX, /*+*/ XX, /*+*/ /* */ /*-----* admin */ XX, /* str */ XX, /* */ /*-----*/ XX, /* key */ XX, /* */ /*-----*/ XX, /* */ XX, /* map */ XX, /* */ XX, /* */ /*-----*/ /* */ /*-----* data read/write */ XX, /* rd */ XX, /* */ /*-----*/ XX, /* wr */ XX, /* */ /*-----*/ XX, /* */ XX, /* str */ XX, /* */ XX, /* */ /*-----*/ XX, /* */ XX, /* key */ XX, /* */ XX, /* */ /*-----*/ XX, /* */ XX, /* ind */ XX, /* */ XX, /* */ /*-----*/ /* */ XX, /*-----* blobs */ XX, /* */ XX, /*-----*/ XX, /*-----* "script-like" adapt */ XX, /*-* DisposeObj */ XX, /*-* close */ // ---- ui context ---- XX, /*-* open */ XX, /*-* run */ XX, /*-* close */ NULL ); } // if return DB_NotFound; } // AssignMethods /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/pluginapiagent.cpp0000644000373300037200000006501012424517753030740 0ustar00nightlyallusers00000000000000/** * @File pluginapiagent.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TPluginApiAgent * Plugin based agent (client or server session) API implementation * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-10-06 : luz : created from apidbagent */ // includes #include "pluginapiagent.h" #include "pluginapids.h" #ifdef SYSER_REGISTRATION #include "syserial.h" #endif #ifdef ENGINEINTERFACE_SUPPORT #include "engineentry.h" #endif namespace sysync { // Callback adaptor functions for session level logging // Note: appbase level logging functions are now in syncappbase.cpp as these are // needed even without DB plugins #ifdef SYDEBUG extern "C" void SessionLogDebugPuts(void *aCallbackRef, const char *aText) { if (aCallbackRef) { POBJDEBUGPUTSX(static_cast(aCallbackRef),DBG_DBAPI+DBG_PLUGIN,aText); } } // SessionLogDebugPuts extern "C" void SessionLogDebugExotic(void *aCallbackRef, const char *aText) { if (aCallbackRef) { POBJDEBUGPUTSX(static_cast(aCallbackRef),DBG_DBAPI+DBG_PLUGIN+DBG_EXOTIC,aText); } } // SessionLogDebugExotic extern "C" void SessionLogDebugBlock(void *aCallbackRef, const char *aTag, const char *aDesc, const char *aAttrText ) { if (aCallbackRef) { bool collapsed=false; if (aTag && aTag[0]=='-') { aTag++; collapsed=true; } static_cast(aCallbackRef)->getDbgLogger()->DebugOpenBlock(TDBG_LOCATION_NONE aTag,aDesc,collapsed,"%s",aAttrText); } } // SessionLogDebugBlock extern "C" void SessionLogDebugEndBlock(void *aCallbackRef, const char *aTag) { if (aCallbackRef) { if (aTag && aTag[0]=='-') aTag++; static_cast(aCallbackRef)->getDbgLogger()->DebugCloseBlock(TDBG_LOCATION_NONE aTag); } } // SessionLogDebugEndBlock extern "C" void SessionLogDebugEndThread(void *aCallbackRef) { if (aCallbackRef) { static_cast(aCallbackRef)->getDbgLogger()->DebugThreadOutputDone(false); // leave session thread record live until session dies } } // SessionLogDebugEndThread #endif #ifdef ENGINEINTERFACE_SUPPORT extern "C" TSyError SessionOpenSessionKey(void* aCB, SessionH aSessionH, KeyH *aKeyH, uInt16 aMode) { // Note: aSessionH must be NULL, as we are implicitly in a session context and cannot specify the session if (!aCB || !aKeyH || aSessionH!=NULL) return LOCERR_BADPARAM; DB_Callback cb = static_cast(aCB); if (!cb->callbackRef) return LOCERR_BADPARAM; // create settings key for the session TSyncSession *sessionP = static_cast(cb->callbackRef); *aKeyH = static_cast(sessionP->newSessionKey(sessionP->getSyncAppBase()->fEngineInterfaceP)); // done return LOCERR_OK; } // SessionOpenSessionKey #endif // ENGINEINTERFACE_SUPPORT // TApiParamConfig // =============== TApiParamConfig::TApiParamConfig(TConfigElement *aParentElement) : TConfigElement("plugin_config",aParentElement) { // nop so far } // TApiParamConfig::TPluginAgentConfig TApiParamConfig::~TApiParamConfig() { clear(); } // TApiParamConfig::~TApiParamConfig // init defaults void TApiParamConfig::clear(void) { // init defaults fConfigString.erase(); fLastTagName.erase(); fLastTagValue.erase(); // clear inherited inherited::clear(); } // TApiParamConfig::clear // store last tag's value void TApiParamConfig::storeLastTag(void) { // init defaults if (!fLastTagName.empty()) { fConfigString.append(fLastTagName); fConfigString+=':'; StrToCStrAppend(fLastTagValue.c_str(),fConfigString,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) fConfigString+="\r\n"; // CRLF at end } // done, erase them fLastTagName.erase(); fLastTagValue.erase(); } // TApiParamConfig::storeLastTag // config element parsing bool TApiParamConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // all elements will be passed 1:1 into DBAPI // - make sure previous element is stored storeLastTag(); // - remember name of this tag fLastTagName=aElementName; // - contents is always a string expectString(fLastTagValue); // ok return true; } // TApiParamConfig::localStartElement // resolve void TApiParamConfig::localResolve(bool aLastPass) { // make sure previous element is stored, if any storeLastTag(); // resolve inherited inherited::localResolve(aLastPass); } // TApiParamConfig::localResolve // TPluginAgentConfig // ================== TPluginAgentConfig::TPluginAgentConfig(TConfigElement *aParentElement) : inherited(aParentElement), fPluginParams(this) { // nop so far } // TPluginAgentConfig::TPluginAgentConfig TPluginAgentConfig::~TPluginAgentConfig() { clear(); // - disconnect from the API module fDBApiConfig.Disconnect(); } // TPluginAgentConfig::~TPluginAgentConfig // init defaults void TPluginAgentConfig::clear(void) { // init defaults // - API Module fLoginAPIModule.erase(); // - use api session auth or not? fApiSessionAuth=false; // - use api device admin or not? fApiDeviceAdmin=false; // - default to use all debug flags set (if debug for plugin is enabled at all) fPluginDbgMask=0xFFFF; // - clear plugin params fPluginParams.clear(); // clear inherited inherited::clear(); } // TPluginAgentConfig::clear // config element parsing bool TPluginAgentConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - API connection if (strucmp(aElementName,"plugin_module")==0) expectMacroString(fLoginAPIModule); else if (strucmp(aElementName,"plugin_sessionauth")==0) expectBool(fApiSessionAuth); else if (strucmp(aElementName,"plugin_deviceadmin")==0) expectBool(fApiDeviceAdmin); else if (strucmp(aElementName,"plugin_params")==0) expectChildParsing(fPluginParams); else if (strucmp(aElementName,"plugin_debugflags")==0) expectUInt16(fPluginDbgMask); else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TPluginAgentConfig::localStartElement // resolve void TPluginAgentConfig::localResolve(bool aLastPass) { // resolve plugin specific config leaf fPluginParams.Resolve(aLastPass); if (aLastPass) { if (!fLoginAPIModule.empty()) { // Determine if we may use non-built-in plugins bool allowDLL= true; // by default, it is allowed, but if PLUGIN_DLL is not set, it will be disabled anyway. #if defined(SYSER_REGISTRATION) && !defined(DLL_PLUGINS_ALWAYS_ALLOWED) // license flags present and DLL plugins not generally allowed: // -> license decides if DLL is allowed allowDLL= (getSyncAppBase()->fRegProductFlags & SYSER_PRODFLAG_SERVER_SDKAPI)!=0; // warn about DLL not allowed ONLY if this build actually supports DLL plugins #if defined(PLUGIN_DLL) if (!allowDLL) { SYSYNC_THROW(TConfigParseException("License does not allow using ")); } #endif // DLL support available in the code at all #endif // DLL plugins not generally allowed (or DLL support not compiled in) // Module level debug goes to appbase (global) log DB_Callback cb= &fDBApiConfig.fCB.Callback; cb->callbackRef = getSyncAppBase(); #ifdef ENGINEINTERFACE_SUPPORT cb->thisBase = getSyncAppBase()->fEngineInterfaceP; #endif #ifdef SYDEBUG cb->debugFlags= (getSyncAppBase()->getRootConfig()->fDebugConfig.fGlobalDebugLogs) && PDEBUGTEST(DBG_ADMIN+DBG_DBAPI+DBG_PLUGIN) ? fPluginDbgMask : 0; cb->DB_DebugPuts = AppBaseLogDebugPuts; cb->DB_DebugBlock = AppBaseLogDebugBlock; cb->DB_DebugEndBlock = AppBaseLogDebugEndBlock; cb->DB_DebugEndThread = AppBaseLogDebugEndThread; cb->DB_DebugExotic = AppBaseLogDebugExotic; #endif // check for required settings if (fDBApiConfig.Connect(fLoginAPIModule.c_str(), getSyncAppBase()->fApiInterModuleContext, "", false, allowDLL)!=LOCERR_OK) SYSYNC_THROW(TConfigParseException("Cannot connect to session handler module specified in ")); // now pass plugin-specific config if (fDBApiConfig.PluginParams(fPluginParams.fConfigString.c_str())!=LOCERR_OK) SYSYNC_THROW(TConfigParseException("Module does not understand params passed in ")); } } // resolve inherited inherited::localResolve(aLastPass); } // TPluginAgentConfig::localResolve // TPluginApiAgent // =============== TPluginApiAgent::TPluginApiAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID) : inherited(aAppBaseP, aSessionHandleP, aSessionID), fPluginAgentConfigP(NULL), fApiLocked(false) { // get config for agent and save direct link to agent config for easy reference fPluginAgentConfigP = static_cast(getRootConfig()->fAgentConfigP); // Note: Datastores are already created from config if (fPluginAgentConfigP->fDBApiConfig.Connected()) { TSyError dberr; DB_Callback cb= &fDBApiSession.fCB.Callback; cb->callbackRef = this; // the session #ifdef ENGINEINTERFACE_SUPPORT cb->thisBase = getSyncAppBase()->fEngineInterfaceP; #endif #ifdef SYDEBUG // Agent Context level debug goes to session log cb->debugFlags = getDbgMask() ? 0xFFFF : 0; cb->DB_DebugPuts = SessionLogDebugPuts; cb->DB_DebugBlock = SessionLogDebugBlock; cb->DB_DebugEndBlock = SessionLogDebugEndBlock; cb->DB_DebugEndThread= SessionLogDebugEndThread; cb->DB_DebugExotic = SessionLogDebugExotic; #endif // SYDEBUG #ifdef ENGINEINTERFACE_SUPPORT // Data module can use Get/SetValue for "AsKey" routines and for session script var access // Note: these are essentially context free and work without a global call-in structure // (which is not necessarily there, for example in no-library case) CB_Connect_KeyAccess(cb); // connect generic key access routines // Version of OpenSessionKey that implicitly opens a key for the current session (DB plugins // do not have a session handle, as their use is always implicitly in a session context). cb->ui.OpenSessionKey = SessionOpenSessionKey; #endif // ENGINEINTERFACE_SUPPORT // Now create the context for running this session // - use session ID as session name dberr=fDBApiSession.CreateContext(getLocalSessionID(),fPluginAgentConfigP->fDBApiConfig); if (dberr!=LOCERR_OK) SYSYNC_THROW(TSyncException("Error creating context for API session module",dberr)); } } // TPluginApiAgent::TPluginApiAgent TPluginApiAgent::~TPluginApiAgent() { // make sure everything is terminated BEFORE destruction of hierarchy begins TerminateSession(); } // TPluginApiAgent::~TPluginApiAgent // Terminate session void TPluginApiAgent::TerminateSession() { if (!fTerminated) { // Make sure datastores know that the agent will go down soon (and give them opportunity to disconnect contexts) announceDestruction(); // Note that the following will happen BEFORE destruction of // individual datastores, so make sure datastore have their inherited stuff (e.g. ODBC) // stuff finished before disposing environment InternalResetSession(); // now we can destroy the session level API context (no connected DB context exist any more) fDBApiSession.DeleteContext(); } inherited::TerminateSession(); } // TPluginApiAgent::TerminateSession // Reset session void TPluginApiAgent::InternalResetSession(void) { // reset all datastores now to make sure all Plugin access is over (including log writing) // before the Plugin Agent is destroyed. // (Note: TerminateDatastores() will be called again by ancestors) TerminateDatastores(); // logout api LogoutApi(); } // TPluginApiAgent::InternalResetSession // Virtual version void TPluginApiAgent::ResetSession(void) { // do my own stuff InternalResetSession(); // let ancestor do its stuff TStdLogicAgent::ResetSession(); } // TPluginApiAgent::ResetSession // get time of DB server lineartime_t TPluginApiAgent::getDatabaseNowAs(timecontext_t aTimecontext) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fPluginAgentConfigP->fApiDeviceAdmin) return inherited::getDatabaseNowAs(aTimecontext); #endif lineartime_t dbtime; #if defined RELEASE_VERSION && !defined _MSC_VER //#warning "GZones should not be passed NULL here" #endif if (fDBApiSession.GetDBTime( dbtime, NULL )!=LOCERR_OK) { dbtime=getSystemNowAs(TCTX_UTC); // just use time of this machine } // return it return dbtime; } // TPluginApiAgent::getDatabaseNowAs #ifdef SYSYNC_SERVER // info about requested auth type TAuthTypes TPluginApiAgent::requestedAuthType(void) { // if not checking via api, let inherited decide if (!fPluginAgentConfigP->fApiSessionAuth) return inherited::requestedAuthType(); // get default TAuthTypes auth = TSyncAgent::requestedAuthType(); // depending on possibilities of used module, we need to enforce basic int pwmode=fDBApiSession.PasswordMode(); if (pwmode==Password_ClrText_IN || (pwmode==Password_MD5_OUT && getSyncMLVersion()fApiDeviceAdmin) { // no device ID or no persistent nonce, use method of ancestor inherited::getAuthNonce(aDeviceID,aAuthNonce); } else { // we have a persistent nonce DEBUGPRINTFX(DBG_ADMIN,("getAuthNonce: current auth nonce='%s'",fLastNonce.c_str())); aAuthNonce=fLastNonce.c_str(); } } // TPluginApiAgent::getAuthNonce // get next nonce (to be sent to remote party for next auth of that remote party with us) // Must generate and persistently save a new nonce string which will be sent in // this session to the remote, and which will be used in the next session for // authenticating the remote device. void TPluginApiAgent::getNextNonce(const char *aDeviceID, string &aNextNonce) { if (!fPluginAgentConfigP->fApiDeviceAdmin) { // no persistent nonce, use method of ancestor inherited::getNextNonce(aDeviceID,aNextNonce); } else { // plugin is responsible for storing a persistent nonce per device // - check if plugin wants to generate the nonce itself TDB_Api_Str apiNonce; if (fDBApiSession.GetNonce(apiNonce)==LOCERR_OK) { // plugin has generated a nonce, use it aNextNonce = apiNonce.c_str(); } else { // plugin does not generate nonce itself, use our own generator // - create new one (pure 7bit ASCII) generateNonce(aNextNonce,aDeviceID,getSystemNowAs(TCTX_UTC)+rand()); } // - save it such that next CheckDevice() can retrieve it as fLastNonce (see below) TSyError sta=fDBApiSession.SaveNonce(aNextNonce.c_str()); if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("getNextNonce: SaveNonce failed with error = %hd",sta)); } } } // TPluginApiAgent::getNextNonce #endif // SYSYNC_CLIENT #ifndef BINFILE_ALWAYS_ACTIVE // check device related stuff // - Must retrieve device record for device identified by aDeviceID. // - If no such record exists, create a new one and set: // - fLastNonce to empty string // - If the record exists, the following fields must be retrieved from the DB: // - fLastNonce : opaque string used for MD5 auth // - In any case, the routine should set: // - fDeviceKey : identifier that can be used in other calls (like LoadAdminData/SaveAdminData // or dsLogSyncResult) to refer to this device void TPluginApiAgent::CheckDevice(const char *aDeviceID) { // do it here only if we have device info stuff implemented in ApiDB if (!fPluginAgentConfigP->fApiDeviceAdmin) { // let inherited process it inherited::CheckDevice(aDeviceID); } else { // Plugin will do the device checking and has stored the nonce generated in the previous session TDB_Api_Str lastNonce; TDB_Api_Str deviceKey; TSyError sta = fDBApiSession.CheckDevice(aDeviceID,deviceKey,lastNonce); if (sta!=LOCERR_OK) SYSYNC_THROW(TSyncException("TPluginApiAgent: checkdevice failed",sta)); #ifdef SYSYNC_SERVER if (IS_SERVER) { // save last nonce fLastNonce = lastNonce.c_str(); } #endif // SYSYNC_SERVER // device "key" is set to deviceID. Plugin internally maintains its key needed for storing Nonce or DevInf fDeviceKey = deviceKey.c_str(); } // if device table implemented in ApiDB } // TPluginApiAgent::CheckDevice // Device is now known as detailed as possible (i.e. we have the device information, if it was possible to get it) // The implementation can now save some of this information for logging and tracking purposes: // - getRemoteURI() : string, remote Device URI (usually IMEI or other globally unique ID) // - getRemoteDescName() : string, remote Device's descriptive name (constructed from DevInf and , or // as set by 's . // - getRemoteInfoString() : string, Remote Device Version Info ("Type (HWV, FWV, SWV) Oem") // - fUserKey : string, identifies user // - fDeviceKey : string, identifies device // - fDomainName : string, identifies domain (aka clientID, aka enterpriseID) // - fRemoteDevInf_mod : string, model name from remote devinf // - fRemoteDevInf_man : string, manufacturer name from remote devinf // - fRemoteDevInf_oem : string, OEM name from remote devinf // - fRemoteDevInf_fwv : string, firmware version from remote devinf // - fRemoteDevInf_swv : string, software version from remote devinf // - fRemoteDevInf_hwv : string, hardware version from remote devinf // fDeviceKey is normally used to re-identify the record in the database that was found or created at CheckDevice. void TPluginApiAgent::remoteAnalyzed(void) { // save basic device info used for associating targets and logentries with a device if (fPluginAgentConfigP->fApiDeviceAdmin) { // save device info stuff string devInf,val; devInf.erase(); // save as properties // - internals devInf += "REMOTE_URI:"; storeUTF8ToString(getRemoteURI(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nREMOTE_DESC:"; storeUTF8ToString(getRemoteDescName(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nREMOTE_INFO:"; storeUTF8ToString(getRemoteInfoString(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) #ifdef SCRIPT_SUPPORT devInf += "\r\nDOMAIN:"; storeUTF8ToString(fDomainName.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) #endif // - strictly from DevInf devInf += "\r\nMOD:"; storeUTF8ToString(fRemoteDevInf_mod.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nMAN:"; storeUTF8ToString(fRemoteDevInf_man.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nOEM:"; storeUTF8ToString(fRemoteDevInf_oem.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nFWV:"; storeUTF8ToString(fRemoteDevInf_fwv.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nSWV:"; storeUTF8ToString(fRemoteDevInf_swv.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\nHWV:"; storeUTF8ToString(fRemoteDevInf_hwv.c_str(),val,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode); StrToCStrAppend(val.c_str(),devInf,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) devInf += "\r\n"; // last line end // now store TSyError sta = fDBApiSession.SaveDeviceInfo(devInf.c_str()); if (sta!=LOCERR_OK) SYSYNC_THROW(TSyncException("TPluginApiAgent: SaveDeviceInfo failed",sta)); } // if device table implemented in ApiDB else { // let inherited process it inherited::remoteAnalyzed(); } } // TPluginApiAgent::remoteAnalyzed // check login information bool TPluginApiAgent::CheckLogin(const char *aOriginalUserName, const char *aModifiedUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID) { bool authok=false; string nonce; // - get nonce (if we have a device table, we should have read it by now) if (aAuthStringType==sectyp_md5_V10 || aAuthStringType==sectyp_md5_V11) getAuthNonce(aDeviceID,nonce); if (!fPluginAgentConfigP->fDBApiConfig.Connected() || !fPluginAgentConfigP->fApiSessionAuth) { // let inherited handle it (if direct ancestor is TCustomImplAgent, we'll fail here) return inherited::CheckLogin(aOriginalUserName, aModifiedUserName, aAuthString, aAuthStringType, aDeviceID); } // api auth required TDB_Api_Str userKey; TDB_Api_Str dbSecret; int pwmode = fDBApiSession.PasswordMode(); // check anonymous login if (aAuthStringType==sectyp_anonymous) { if (pwmode==Password_ClrText_IN || pwmode==Password_MD5_Nonce_IN) { // modes that pass in credential string - pass empty credential string to signal "anonymous" authok = fDBApiSession.Login(aModifiedUserName,"",userKey)==LOCERR_OK; } else { // modes that get credential string from API - check that API returns empty string to signal "anonymous" login is ok authok = fDBApiSession.Login(aModifiedUserName,dbSecret,userKey)==LOCERR_OK; authok = authok && dbSecret.empty(); // returned secret must be empty to allow anonymous login } } // check if we can auth at all else if (pwmode == Password_ClrText_IN) { // we can auth only if we have a cleartext password from the remote if (aAuthStringType!=sectyp_clearpass) return false; // auth not possible // login with clear text password authok = fDBApiSession.Login(aModifiedUserName,aAuthString,userKey)==LOCERR_OK; } else if (pwmode == Password_MD5_Nonce_IN) { if (aAuthStringType==sectyp_clearpass) { std::string p1, p2, p3; if (nonce == "") getAuthNonce(aDeviceID, nonce); p1 = aModifiedUserName; p1 += ":"; p1 += aAuthString; MD5B64(p1.c_str(), p1.length(), p2); p2 += ":"; p2 += nonce; MD5B64(p2.c_str(), p2.length(), p3); authok = fDBApiSession.Login(aModifiedUserName,p3.c_str(), userKey)==LOCERR_OK; } else { // login with MD5( MD5( user:pwd ):nonce ) authok = fDBApiSession.Login(aModifiedUserName,aAuthString,userKey)==LOCERR_OK; } } else { if (pwmode == Password_MD5_OUT) { // if the database has MD5, we can auth basic and SyncML 1.1 MD5, but not SyncML 1.0 MD5 if (aAuthStringType==sectyp_md5_V10) return false; // auth with SyncML 1.0 MD5 not possible } // get Secret and preliminary authok (w/o password check yet) from database authok = fDBApiSession.Login(aModifiedUserName,dbSecret,userKey)==LOCERR_OK; if (authok) { // check secret if (pwmode == Password_ClrText_OUT) { // we have the clear text password, check against what was transmitted from remote authok = checkAuthPlain(aOriginalUserName,dbSecret.c_str(),nonce.c_str(),aAuthString,aAuthStringType); } else { // whe have the MD5 of user:password, check against what was transmitted from remote // Note: this can't work with non-V1.1 type creds authok = checkAuthMD5(aOriginalUserName,dbSecret.c_str(),nonce.c_str(),aAuthString,aAuthStringType); } } } if (!authok) { // failed PDEBUGPRINTFX(DBG_ADMIN,( "==== api authentication for '%s' failed", aModifiedUserName )); return false; } else { // save user key as returned from dbapi login() fUserKey = userKey.c_str(); // authenticated successfully, sessionID is set PDEBUGPRINTFX(DBG_ADMIN,( "==== api authentication for '%s' (userkey='%s') successful", aModifiedUserName, fUserKey.c_str() )); return true; } } // TPluginApiAgent::CheckLogin #endif // not BINFILE_ALWAYS_ACTIVE // - logout api void TPluginApiAgent::LogoutApi(void) { if (fPluginAgentConfigP->fDBApiConfig.Connected() && fPluginAgentConfigP->fApiSessionAuth) { // log out from session fDBApiSession.Logout(); } } // TPluginApiAgent::LogoutApi #ifdef SYSYNC_SERVER void TPluginApiAgent::RequestEnded(bool &aHasData) { // first let ancestors finish their stuff // - this will include calling RequestEnded() in all datastores inherited::RequestEnded(aHasData); // let my API know as well, thread might change for next request (but not necessarily does!) if (fPluginAgentConfigP->fDBApiConfig.Connected()) { if (!fApiLocked) fDBApiSession.ThreadMayChangeNow(); } } // TPluginApiAgent::RequestEnded #endif // factory methods of Agent config // =============================== #ifdef SYSYNC_CLIENT TSyncAgent *TPluginAgentConfig::CreateClientSession(const char *aSessionID) { // return appropriate client session MP_RETURN_NEW(TPluginApiAgent,DBG_HOT,"TPluginApiAgent",TPluginApiAgent(getSyncAppBase(),NULL,aSessionID)); } // TPluginAgentConfig::CreateClientSession #endif #ifdef SYSYNC_SERVER TSyncAgent *TPluginAgentConfig::CreateServerSession(TSyncSessionHandle *aSessionHandle, const char *aSessionID) { // return XML2GO or ODBC-server session MP_RETURN_NEW(TPluginApiAgent,DBG_HOT,"TPluginApiAgent",TPluginApiAgent(getSyncAppBase(),aSessionHandle,aSessionID)); } // TPluginAgentConfig::CreateServerSession #endif } // namespace sysync /* end of TPluginApiAgent implementation */ // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/pluginapiagent.h0000755000373300037200000001272312424517753030413 0ustar00nightlyallusers00000000000000/** * @File pluginapiagent.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TPluginApiAgent * Plugin based agent (client or server session) API implementation * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-10-06 : luz : created from apidbagent */ #ifndef PLUGINAPIAGENT_H #define PLUGINAPIAGENT_H // includes #ifdef SQL_SUPPORT #include "odbcapiagent.h" #else #include "customimplagent.h" #endif namespace sysync { // plugin module generic config class TApiParamConfig: public TConfigElement { typedef TConfigElement inherited; public: TApiParamConfig(TConfigElement *aParentElement); virtual ~TApiParamConfig(); // Assembled tag:value type config lines string fConfigString; virtual void clear(); protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); private: void storeLastTag(void); string fLastTagName; string fLastTagValue; }; // TApiParamConfig } // namespace sysync #include "pluginapids.h" using namespace sysync; namespace sysync { // Session level callback adaptor functions #ifdef SYDEBUG extern "C" void SessionLogDebugPuts(void *aCallbackRef, const char *aText); extern "C" void SessionLogDebugExotic(void *aCallbackRef, const char *aText); extern "C" void SessionLogDebugBlock(void *aCallbackRef, const char *aTag, const char *aDesc, const char *aAttrText ); extern "C" void SessionLogDebugEndBlock(void *aCallbackRef, const char *aTag); extern "C" void SessionLogDebugEndThread(void *aCallbackRef); #endif // SYDEBUG #ifdef ENGINEINTERFACE_SUPPORT extern "C" TSyError SessionOpenSessionKey(void* aCB, SessionH aSessionH, KeyH *aKeyH, uInt16 aMode); #endif // ENGINEINTERFACE_SUPPORT // forward class TPluginDSConfig; #ifdef SCRIPT_SUPPORT class TScriptContext; #endif // config class TPluginAgentConfig : #ifdef SQL_SUPPORT public TOdbcAgentConfig #else public TCustomAgentConfig #endif { #ifdef SQL_SUPPORT typedef TOdbcAgentConfig inherited; #else typedef TCustomAgentConfig inherited; #endif public: TPluginAgentConfig(TConfigElement *aParentElement); virtual ~TPluginAgentConfig(); // properties // - name of the login module string fLoginAPIModule; // - use Api session auth or not? bool fApiSessionAuth; // - use api device admin or not? bool fApiDeviceAdmin; // - the DB API config object TDB_Api_Config fDBApiConfig; // - generic module params TApiParamConfig fPluginParams; // - debug mask uInt16 fPluginDbgMask; protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void clear(); virtual void localResolve(bool aLastPass); public: #ifdef SYSYNC_CLIENT // create appropriate session (=agent) for this client virtual TSyncAgent *CreateClientSession(const char *aSessionID); #endif #ifdef SYSYNC_SERVER // create appropriate session (=agent) for this server virtual TSyncAgent *CreateServerSession(TSyncSessionHandle *aSessionHandle, const char *aSessionID); #endif }; // TPluginAgentConfig class TPluginApiAgent : #ifdef SQL_SUPPORT public TODBCApiAgent #else public TCustomImplAgent #endif { #ifdef SQL_SUPPORT typedef TODBCApiAgent inherited; #else typedef TCustomImplAgent inherited; #endif public: TPluginApiAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID); virtual ~TPluginApiAgent(); virtual void TerminateSession(void); // Terminate session, like destructor, but without actually destructing object itself virtual void ResetSession(void); // Resets session (but unlike TerminateSession, session might be re-used) void InternalResetSession(void); // static implementation for calling through virtual destructor and virtual ResetSession(); // user authentication #ifdef SYSYNC_SERVER // - return auth type to be requested from remote virtual TAuthTypes requestedAuthType(void); // avoids MD5 when it cannot be checked // - get next nonce string top be sent to remote party for subsequent MD5 auth virtual void getNextNonce(const char *aDeviceID, string &aNextNonce); // - get nonce string, which is expected to be used by remote party for MD5 auth. virtual void getAuthNonce(const char *aDeviceID, string &aAuthNonce); #endif // SYSYNC_SERVER #ifndef BINFILE_ALWAYS_ACTIVE // - check device ID related stuff virtual void CheckDevice(const char *aDeviceID); // - remote device is analyzed, possibly save status virtual void remoteAnalyzed(void); // - check login for this session (everything else is done by CustomAgent's SessionLogin) virtual bool CheckLogin(const char *aOriginalUserName, const char *aModifiedUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID); #endif // not BINFILE_ALWAYS_ACTIVE // - logout void LogoutApi(void); // current database date & time virtual lineartime_t getDatabaseNowAs(timecontext_t aTimecontext); // agent config TPluginAgentConfig *fPluginAgentConfigP; // set while Api access is locked because of a thread using it bool fApiLocked; // get API session object TDB_Api_Session *getDBApiSession() { return &fDBApiSession; }; protected: #ifdef SYSYNC_SERVER // - request end, used to clean up virtual void RequestEnded(bool &aHasData); #endif private: TDB_Api_Session fDBApiSession; }; // TPluginApiAgent } // namespace sysync #endif // PLUGINAPIAGENT_H // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/pluginapids.cpp0000755000373300037200000033623112424517753030261 0ustar00nightlyallusers00000000000000/** * @File pluginapids.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TPluginApiDS * Plugin based datastore API implementation * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-10-06 : luz : created from apidbdatastore */ // includes #include "sysync.h" #include "pluginapids.h" #include "pluginapiagent.h" #ifdef SYSER_REGISTRATION #include "syserial.h" #endif #ifdef ENGINEINTERFACE_SUPPORT #include "engineentry.h" #endif #include "SDK_support.h" namespace sysync { // Config // ====== // Helpers // ======= // Field Map item // ============== TApiFieldMapItem::TApiFieldMapItem(const char *aElementName, TConfigElement *aParentElement) : inherited(aElementName,aParentElement) { /* nop for now */ } // TApiFieldMapItem::TApiFieldMapItem void TApiFieldMapItem::checkAttrs(const char **aAttributes) { /* nop for now */ inherited::checkAttrs(aAttributes); } // TApiFieldMapItem::checkAttrs #ifdef ARRAYDBTABLES_SUPPORT // Array Map item // =============== TApiFieldMapArrayItem::TApiFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement) : inherited(aCustomDSConfigP,aParentElement) { /* nop for now */ } // TApiFieldMapArrayItem::TApiFieldMapArrayItem void TApiFieldMapArrayItem::checkAttrs(const char **aAttributes) { /* nop for now */ inherited::checkAttrs(aAttributes); } // TApiFieldMapArrayItem::checkAttrs #endif // TPluginDSConfig // ============ TPluginDSConfig::TPluginDSConfig(const char* aName, TConfigElement *aParentElement) : inherited(aName,aParentElement), fPluginParams_Admin(this), fPluginParams_Data(this) { // nop so far clear(); } // TPluginDSConfig::TPluginDSConfig TPluginDSConfig::~TPluginDSConfig() { clear(); // disconnect from the API module fDBApiConfig_Data.Disconnect(); fDBApiConfig_Admin.Disconnect(); } // TPluginDSConfig::~TPluginDSConfig // init defaults void TPluginDSConfig::clear(void) { // init defaults fDBAPIModule_Admin.erase(); fDBAPIModule_Data.erase(); fDataModuleAlsoHandlesAdmin=false; fEarlyStartDataRead = false; // - default to use all debug flags set (if debug for plugin is enabled at all) fPluginDbgMask_Admin=0xFFFF; fPluginDbgMask_Data=0xFFFF; // - clear plugin params fPluginParams_Admin.clear(); fPluginParams_Data.clear(); // - clear capabilities fItemAsKey = false; fResumeSupported = true; fHasDeleteSyncSet = false; // clear inherited inherited::clear(); } // TPluginDSConfig::clear // config element parsing bool TPluginDSConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"plugin_module")==0) expectMacroString(fDBAPIModule_Data); else if (strucmp(aElementName,"plugin_datastoreadmin")==0) expectBool(fDataModuleAlsoHandlesAdmin); else if (strucmp(aElementName,"plugin_earlystartdataread")==0) expectBool(fEarlyStartDataRead); else if (strucmp(aElementName,"plugin_params")==0) expectChildParsing(fPluginParams_Data); else if (strucmp(aElementName,"plugin_debugflags")==0) expectUInt16(fPluginDbgMask_Data); else if (strucmp(aElementName,"plugin_module_admin")==0) expectMacroString(fDBAPIModule_Admin); else if (strucmp(aElementName,"plugin_params_admin")==0) expectChildParsing(fPluginParams_Admin); else if (strucmp(aElementName,"plugin_debugflags_admin")==0) expectUInt16(fPluginDbgMask_Admin); else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TPluginDSConfig::localStartElement // resolve void TPluginDSConfig::localResolve(bool aLastPass) { // resolve plugin specific config leaf fPluginParams_Admin.Resolve(aLastPass); fPluginParams_Data.Resolve(aLastPass); // try to resolve configured API-module name into set of function pointers if (aLastPass) { // Determine if we may use non-built-in plugins bool allowDLL= true; // by default, it is allowed, but if PLUGIN_DLL is not set, it will be disabled anyway. #if defined(SYSER_REGISTRATION) && !defined(DLL_PLUGINS_ALWAYS_ALLOWED) // license flags present and DLL plugins not generally allowed: // -> license decides if DLL is allowed allowDLL= (getSyncAppBase()->fRegProductFlags & SYSER_PRODFLAG_SERVER_SDKAPI)!=0; // warn about DLL not allowed ONLY if this build actually supports DLL plugins #if defined(PLUGIN_DLL) if (!allowDLL) { SYSYNC_THROW(TConfigParseException("License does not allow using ")); } #endif // DLL support available in the code at all #endif // DLL plugins not generally allowed (or DLL support not compiled in) // Connect module for handling data access if (!fDBAPIModule_Data.empty()) { // we have a module specified for data access DB_Callback cb= &fDBApiConfig_Data.fCB.Callback; cb->callbackRef = getSyncAppBase(); #ifdef ENGINEINTERFACE_SUPPORT cb->thisBase = getSyncAppBase()->fEngineInterfaceP; #endif #ifdef SYDEBUG // direct Module level debug to global log cb->debugFlags= (getSyncAppBase()->getRootConfig()->fDebugConfig.fGlobalDebugLogs) && PDEBUGTEST(DBG_DATA+DBG_DBAPI+DBG_PLUGIN) ? fPluginDbgMask_Data : 0; cb->DB_DebugPuts = AppBaseLogDebugPuts; cb->DB_DebugBlock = AppBaseLogDebugBlock; cb->DB_DebugEndBlock = AppBaseLogDebugEndBlock; cb->DB_DebugEndThread = AppBaseLogDebugEndThread; cb->DB_DebugExotic = AppBaseLogDebugExotic; #endif if (fDBApiConfig_Data.Connect(fDBAPIModule_Data.c_str(), getSyncAppBase()->fApiInterModuleContext, getName(), false, allowDLL)!=LOCERR_OK) SYSYNC_THROW(TConfigParseException("Cannot connect to datastore implementation module specified in ")); // now pass plugin-specific config if (fDBApiConfig_Data.PluginParams(fPluginParams_Data.fConfigString.c_str())!=LOCERR_OK) SYSYNC_THROW(TConfigParseException("Module does not understand params passed in ")); // Check module capabilities TDB_Api_Str capa; fDBApiConfig_Data.Capabilities(capa); string capaStr = capa.c_str(); // - check existence of DeleteSyncSet() fHasDeleteSyncSet = FlagOK(capaStr,CA_DeleteSyncSet,true); // - Check for new method for data access (as keys instead of as text items) fItemAsKey = FlagOK(capaStr,CA_ItemAsKey,true); // - Allow module to choose whether it wants to support suspend/resume. fResumeSupported = FlagOK(capaStr,CA_ResumeSupported,true); // Check if engine is compatible #ifndef DBAPI_TEXTITEMS if (!fItemAsKey) SYSYNC_THROW(TConfigParseException("This engine does not support data items in text format")); #endif #if !defined(DBAPI_ASKEYITEMS) || !defined(ENGINEINTERFACE_SUPPORT) if (fItemAsKey) SYSYNC_THROW(TConfigParseException("This engine does not support data items passed as key handles")); #endif } // connect module for handling admin access // - use same module and params as data if no separate module specified and plugin_datastoreadmin is set if (fDBAPIModule_Admin.empty() && fDataModuleAlsoHandlesAdmin) { fDBAPIModule_Admin=fDBAPIModule_Data; fPluginParams_Admin=fPluginParams_Data; fPluginDbgMask_Admin=fPluginDbgMask_Data; } // - now connect the admin module if (!fDBAPIModule_Admin.empty()) { // we have a module specified for data access DB_Callback cb= &fDBApiConfig_Admin.fCB.Callback; cb->callbackRef = getSyncAppBase(); #ifdef ENGINEINTERFACE_SUPPORT cb->thisBase = getSyncAppBase()->fEngineInterfaceP; #endif #ifdef SYDEBUG // direct Module level debug to global log cb->debugFlags= (getSyncAppBase()->getRootConfig()->fDebugConfig.fGlobalDebugLogs) && PDEBUGTEST(DBG_ADMIN+DBG_DBAPI+DBG_PLUGIN) ? fPluginDbgMask_Admin : 0; cb->DB_DebugPuts = AppBaseLogDebugPuts; cb->DB_DebugBlock = AppBaseLogDebugBlock; cb->DB_DebugEndBlock = AppBaseLogDebugEndBlock; cb->DB_DebugEndThread= AppBaseLogDebugEndThread; cb->DB_DebugExotic = AppBaseLogDebugExotic; #endif if (fDBApiConfig_Admin.Connect(fDBAPIModule_Admin.c_str(),getSyncAppBase()->fApiInterModuleContext,getName())!=LOCERR_OK) SYSYNC_THROW(TConfigParseException("Cannot connect to datastore implementation module specified in ")); // now pass plugin-specific config if (fDBApiConfig_Admin.PluginParams(fPluginParams_Admin.fConfigString.c_str())!=LOCERR_OK) SYSYNC_THROW(TConfigParseException("Module does not understand params passed in ")); } } // resolve inherited inherited::localResolve(aLastPass); } // TPluginDSConfig::localResolve // - create appropriate datastore from config, calls addTypeSupport as well TLocalEngineDS *TPluginDSConfig::newLocalDataStore(TSyncSession *aSessionP) { // Synccap defaults to normal set supported by the engine by default TLocalEngineDS *ldsP; if (IS_CLIENT) { ldsP = new TPluginApiDS(this,aSessionP,getName(),aSessionP->getSyncCapMask() & ~(isOneWayFromRemoteSupported() ? 0 : SCAP_MASK_ONEWAY_SERVER)); } else { ldsP = new TPluginApiDS(this,aSessionP,getName(),aSessionP->getSyncCapMask() & ~(isOneWayFromRemoteSupported() ? 0 : SCAP_MASK_ONEWAY_CLIENT)); } // do common stuff addTypes(ldsP,aSessionP); // return return ldsP; } // TPluginDSConfig::newLocalDataStore /* * Implementation of TPluginApiDS */ // constructor TPluginApiDS::TPluginApiDS( TPluginDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask ) : #ifdef SDK_ONLY_SUPPORT TCustomImplDS(aConfigP,aSessionP, aName, aCommonSyncCapMask) #else TODBCApiDS(aConfigP,aSessionP, aName, aCommonSyncCapMask) #endif { // save a type casted pointer to the agent fPluginAgentP=static_cast(aSessionP); // save pointer to config record fPluginDSConfigP=aConfigP; // make a local copy of the typed agent pointer (note that the agent itself does // NOT YET have its constructor completely run so we can't just copy the agents pointer) fPluginAgentConfigP = DYN_CAST( aSessionP->getRootConfig()->fAgentConfigP ); if (!fPluginAgentConfigP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TPluginApiDS finds no AgentConfig","api1"))); // Note: do not create context here because Agent is not yet initialized. // clear rest InternalResetDataStore(); } // TPluginApiDS::TPluginApiDS TPluginApiDS::~TPluginApiDS() { InternalResetDataStore(); } // TPluginApiDS::~TPluginApiDS /// @brief called while agent is still fully ok, so we must clean up such that later call of destructor does NOT access agent any more void TPluginApiDS::announceAgentDestruction(void) { // reset myself InternalResetDataStore(); // make sure we don't access the agent any more engTerminateDatastore(); fPluginAgentP = NULL; // destroy API context fDBApi_Data.DeleteContext(); fDBApi_Admin.DeleteContext(); // call inherited inherited::announceAgentDestruction(); } // TPluginApiDS::announceAgentDestruction /// @brief called to reset datastore /// @note must be safe to be called multiple times and even after announceAgentDestruction() void TPluginApiDS::InternalResetDataStore(void) { // filtering capabilities need to be evaluated first fAPICanFilter = false; fAPIFiltersTested = false; } // TPluginApiDS::InternalResetDataStore #ifdef DBAPI_TEXTITEMS // store API key/value pair field in mapped field, if one is defined bool TPluginApiDS::storeField( cAppCharP aName, cAppCharP aParams, cAppCharP aValue, TMultiFieldItem &aItem, uInt16 aSetNo, sInt16 aArrayIndex ) { TFieldMapList *fmlP = &(fPluginDSConfigP->fFieldMappings.fFieldMapList); TFieldMapList::iterator pos; TApiFieldMapItem *fmiP; string s; bool stored=false; // search field map list for matching map entry for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { fmiP = static_cast(*pos); // check name if ( fmiP->readable && fmiP->setNo==aSetNo && strucmp(fmiP->getName(),aName)==0 ) { // DB-readable field with matching name TDBFieldType dbfty = fmiP->dbfieldtype; TItemField *fieldP; sInt16 fid = fmiP->fid; // determine leaf field fieldP = getMappedFieldOrVar(aItem,fid,aArrayIndex); // continue only if we have a field if (!fieldP) continue; // check if the field is proxyable and input defines a BLOB id #ifdef STREAMFIELD_SUPPORT if (fieldP->isBasedOn(fty_string)) { // - check if params contain a BLOBID string blobid; if (paramScan(aParams,"BLOBID",blobid)) { // this field is a blob, create a proxy for it TApiBlobProxy *apiProxyP = new TApiBlobProxy(this,!fieldP->isBasedOn(fty_blob),blobid.c_str(),aItem.getLocalID()); // attach it to the string or blob field static_cast(fieldP)->setBlobProxy(apiProxyP); // check if we must read it right now if (paramScan(aParams,"READNOW",blobid)) static_cast(fieldP)->pullFromProxy(); // check next mapping continue; } } #endif // store according to database field type switch (dbfty) { case dbft_string: // for explicit strings, perform character set and line feed conversion s.erase(); // - convert from database charset to UTF-8 and to C-string linefeeds appendStringAsUTF8(aValue, s, fPluginDSConfigP->fDataCharSet, lem_cstr); fieldP->setAsString(s.c_str()); break; case dbft_blob: // blob is treated as 1:1 string if there's no proxy for it default: // for all other DB types, string w/o charset conversion is enough (these are by definition all single-line, ASCII-only) if (fieldP->isBasedOn(fty_timestamp)) { // interpret timestamps in dataTimeZone context (or as floating if this field is mapped in "f" mode) TTimestampField *tsfP = static_cast(fieldP); tsfP->setAsISO8601(aValue, fmiP->floating_ts ? TCTX_UNKNOWN : fPluginDSConfigP->fDataTimeZone, false); // modify time zone if params contain a TZNAME if (paramScan(aParams,"TZNAME",s)) { // convert to time zone context timecontext_t tctx; TimeZoneNameToContext(s.c_str(), tctx, tsfP->getGZones(), true); tsfP->moveToContext(tctx, true); // move to new context, bind floating (and float fixed, if TZNAME=FLOATING) } } else { // just set as string fieldP->setAsString(aValue); } break; } // switch // field successfully stored, do NOT exit loop // because there could be a second map for the same attribute! stored=true; } // if map found for attribute } // for all field mappings return stored; } // TPluginApiDS::storeField // - parse text data into item // Note: generic implementation, using virtual storeField() method // to differentiate between use with mapped fields in DBApi and // direct (unmapped) TMultiFieldItem access in Tunnel API. bool TPluginApiDS::parseDBItemData( TMultiFieldItem &aItem, cAppCharP aItemData, uInt16 aSetNo ) { bool stored = parseItemData(aItem,aItemData,aSetNo); if (stored) { // post-process stored = postReadProcessItem(aItem,aSetNo); } return stored; } // TPluginApiDS::parseItemData // generate text representations of item's fields (BLOBs and parametrized fields not included) // - returns true if at least one field appended bool TPluginApiDS::generateDBItemData( bool aAssignedOnly, TMultiFieldItem &aItem, uInt16 aSetNo, string &aDataFields ) { TFieldMapList *fmlP = &(fPluginDSConfigP->fFieldMappings.fFieldMapList); TFieldMapList::iterator pos; TApiFieldMapItem *fmiP; string val; bool createdone=false; // pre-process (run scripts) if (!preWriteProcessItem(aItem)) return false; // create text representation for all mapped and writable fields for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { fmiP = static_cast(*pos); if ( fmiP->writable && fmiP->setNo==aSetNo ) { // get field TItemField *basefieldP; sInt16 fid = fmiP->fid; // determine base field (might be array) basefieldP = getMappedBaseFieldOrVar(aItem,fid); if (generateItemFieldData( aAssignedOnly, fPluginDSConfigP->fDataCharSet, fPluginDSConfigP->fDataLineEndMode, fPluginDSConfigP->fDataTimeZone, basefieldP, fmiP->getName(), aDataFields )) createdone=true; // we now have at least one field } // if writable field } // for all field mappings PDEBUGPRINTFX(DBG_USERDATA+DBG_DBAPI+DBG_EXOTIC+DBG_HOT,("generateDBItemData generated string for DBApi:")); PDEBUGPUTSXX(DBG_USERDATA+DBG_DBAPI+DBG_EXOTIC,aDataFields.c_str(),0,true); return createdone; } // TPluginApiDS::generateDBItemData #endif // DBAPI_TEXTITEMS // - post process item after reading from DB (run script) bool TPluginApiDS::postReadProcessItem(TMultiFieldItem &aItem, uInt16 aSetNo) { #if defined(DBAPI_ASKEYITEMS) && defined(STREAMFIELD_SUPPORT) // for ItemKey mode, we need to create a BLOB proxy for each as_param mapped field if (fPluginDSConfigP->fItemAsKey) { // find all asParam fields that can have proxies and create BLOB proxies for these TFieldMapList *fmlP = &(fPluginDSConfigP->fFieldMappings.fFieldMapList); TFieldMapList::iterator pos; TApiFieldMapItem *fmiP; // post-process all mapped and writable fields for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { fmiP = static_cast(*pos); if ( fmiP->readable && fmiP->setNo==aSetNo ) { // get field TItemField *basefieldP, *leaffieldP; #ifdef ARRAYFIELD_SUPPORT uInt16 arrayIndex=0; #endif sInt16 fid = fmiP->fid; // determine base field (might be array) basefieldP = getMappedBaseFieldOrVar(aItem,fid); // ignore map if we have no field for it if (!basefieldP) continue; // We have a base field for this, check what to do if (fPluginDSConfigP->fUserZoneOutput && !fmiP->floating_ts && basefieldP->elementsBasedOn(fty_timestamp)) { // userzoneoutput requested for non-floating timestamp field, move it! #ifdef ARRAYFIELD_SUPPORT arrayIndex=0; #endif do { #ifdef ARRAYFIELD_SUPPORT if (basefieldP->isArray()) { leaffieldP = basefieldP->getArrayField(arrayIndex,true); // get existing leaf fields only arrayIndex++; } else leaffieldP = basefieldP; // leaf is base field // if no leaf field, we'll need to exit here (we're done with the array) if (leaffieldP==NULL) break; #else leaffieldP = basefieldP; // no arrays: leaf is always base field #endif static_cast(leaffieldP)->moveToContext(fSessionP->fUserTimeContext, false); } while(basefieldP->isArray()); // only arrays do loop all array elements } if (fmiP->as_param && basefieldP->elementsBasedOn(fty_string)) { // string based field (string or BLOB) mapped as parameter // unlike with textItems that get the BLOBID from the DB, // in asKey mode, BLOBID is just map name plus a possible array index. // Plugin must be able to identify the BLOB using this plus the item ID. // Plugin must also make sure an array element exists (value does not matter, can be empty) // for each element that should be proxied here. // - create the proxies (one for each array element) #ifdef ARRAYFIELD_SUPPORT arrayIndex=0; #endif do { // first check if there is an element at all string blobid = fmiP->getName(); // map name #ifdef ARRAYFIELD_SUPPORT if (basefieldP->isArray()) { leaffieldP = basefieldP->getArrayField(arrayIndex,true); // get existing leaf fields only StringObjAppendPrintf(blobid,"[%d]",arrayIndex); // add array index to blobid arrayIndex++; } else leaffieldP = basefieldP; // leaf is base field // if no leaf field, we'll need to exit here (we're done with the array) if (leaffieldP==NULL) break; #else leaffieldP = basefieldP; // no arrays: leaf is always base field #endif // this array element exists, create the proxy TApiBlobProxy *apiProxyP = new TApiBlobProxy(this,!leaffieldP->isBasedOn(fty_blob),blobid.c_str(),aItem.getLocalID()); // Note: we do not support "READNOW" proxies here, as they are useless in ItemKey context: if the // BLOB cannot be read later, no need for as_aparam map exists and plugin should just put the value // directly via the SetKeyValue() API. // attach proxy to the string or blob field static_cast(leaffieldP)->setBlobProxy(apiProxyP); } while(basefieldP->isArray()); // only arrays do loop all array elements } } // readable field mapping with explicit as_param mark } // for all field mappings } // if AsKey access #endif // DBAPI_ASKEYITEMS // execute afterread script now #ifdef SCRIPT_SUPPORT // process afterread script fPluginAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterReadScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) SYSYNC_THROW(TSyncException(" fatal error")); #endif // always ok for now %%% return true; } // TPluginApiDS::postReadProcessItem // - pre-process item before writing to DB (run script) bool TPluginApiDS::preWriteProcessItem(TMultiFieldItem &aItem) { #ifdef SCRIPT_SUPPORT // process beforewrite script fWriting=true; fDeleting=false; fParentKey=aItem.getLocalID(); fPluginAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fBeforeWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) SYSYNC_THROW(TSyncException(" fatal error")); #endif // always ok for now %%% return true; } // TPluginApiDS::preWriteProcessItem // - send BLOBs of this item one by one. Returns true if we have a blob at all bool TPluginApiDS::writeBlobs( bool aAssignedOnly, TMultiFieldItem &aItem, uInt16 aSetNo ) { TFieldMapList *fmlP = &(fPluginDSConfigP->fFieldMappings.fFieldMapList); TFieldMapList::iterator pos; TApiFieldMapItem *fmiP; string blobfieldname; bool blobwritten=false; TSyError dberr; // store all parametrized fields or BLOBs one by one for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { fmiP = static_cast(*pos); if ( fmiP->writable && fmiP->setNo==aSetNo ) { TItemField *basefieldP,*leaffieldP; sInt16 fid = fmiP->fid; // determine base field (might be array) basefieldP = getMappedBaseFieldOrVar(aItem,fid); // ignore map if we have no field for it if (!basefieldP) continue; // ignore map if field is not assigned and assignedonly flag is set if (aAssignedOnly && basefieldP->isUnassigned()) continue; // omit all non-BLOB normal fields // Note: in ItemKey mode, blobs must have the as_aparam flag to be written as blobs. // in textItem mode, all fty_blob based fields will ALWAYS be written as blobs. if (!(fmiP->as_param || (basefieldP->elementsBasedOn(fty_blob) && !fPluginDSConfigP->fItemAsKey))) continue; // yes, we want to write this field as a BLOB #ifdef ARRAYFIELD_SUPPORT uInt16 arrayIndex; for (arrayIndex=0; true; arrayIndex++) #endif { // first create BLOB ID blobfieldname=fmiP->getName(); #ifdef ARRAYFIELD_SUPPORT // append array index if this is an array field if (basefieldP->isArray()) { StringObjAppendPrintf(blobfieldname,"[%d]",arrayIndex); // calculate leaf field leaffieldP = basefieldP->getArrayField(arrayIndex,true); // get existing leaf fields only } else { leaffieldP = basefieldP; // leaf is base field } // if no leaf field, we'll need to exit here (we're done with the array) if (leaffieldP==NULL) break; #else leaffieldP = basefieldP; // leaf is base field #endif // Now write this BLOB or string field size_t maxBlobWriteBlockSz; size_t blobsize; void *bufferP = NULL; string strDB; bool isString = !leaffieldP->isBasedOn(fty_blob); if (!isString) { #ifdef STREAMFIELD_SUPPORT leaffieldP->resetStream(); // this might be the wrong place to do this ... blobsize = leaffieldP->getStreamSize(); maxBlobWriteBlockSz = 16000; // allocate buffer if (blobsize) bufferP = new unsigned char[blobsize>maxBlobWriteBlockSz ? maxBlobWriteBlockSz : blobsize]; #else // we cannot stream, but just read string contents blobsize = leaffieldP->getStringSize(); maxBlobWriteBlockSz = blobsize; // all at once bufferP = (void *) leaffieldP->getCStr(); // get pointer to string #endif } else { // is string -> first convert to DB charset blobsize = leaffieldP->getStringSize(); maxBlobWriteBlockSz = blobsize; string s; leaffieldP->getAsString(s); // convert to DB charset and linefeeds appendUTF8ToString( s.c_str(), strDB, fPluginDSConfigP->fDataCharSet, fPluginDSConfigP->fDataLineEndMode ); bufferP = (void *)strDB.c_str(); } SYSYNC_TRY { // now read from stream field and send to API bool first=true; bool last=false; size_t remaining=blobsize; size_t bytes,actualbytes; while (!last) { // it's the last block when we can write remaining bytes now last = remaining<=maxBlobWriteBlockSz; // calculate block size of this iteration bytes = last ? remaining : maxBlobWriteBlockSz; #ifdef STREAMFIELD_SUPPORT if (!isString) { // read these from the stream field actualbytes = leaffieldP->readStream(bufferP,bytes); // we need to read } else #endif { // we have it already in the buffer actualbytes = bytes; } if (actualbytesisArray()) break; #endif } // for all array elements } // if writable BLOB/parametrized field } // for all field mappings return blobwritten; } // TPluginApiDS::writeBlobs bool TPluginApiDS::deleteBlobs( bool aAssignedOnly, TMultiFieldItem &aItem, uInt16 aSetNo ) { TFieldMapList *fmlP = &(fPluginDSConfigP->fFieldMappings.fFieldMapList); TFieldMapList::iterator pos; TApiFieldMapItem *fmiP; string blobfieldname; bool blobdeleted=false; TSyError dberr; // store all parametrized fields or BLOBs one by one for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { fmiP = static_cast(*pos); if (fmiP->writable && fmiP->setNo==aSetNo) { // get field TItemField *basefieldP,*leaffieldP; sInt16 fid = fmiP->fid; // determine base field (might be array) basefieldP = getMappedBaseFieldOrVar(aItem,fid); // ignore map if we have no field for it if (!basefieldP) continue; // %%% what is this, obsolete?? // ignore map if field is not assigned and assignedonly flag is set //if (aAssignedOnly && basefieldP->isUnassigned()) continue; // omit all non-BLOB normal fields // Note: in ItemKey mode, blobs must have the as_aparam flag to be written as blobs. // in textItem mode, all fty_blob based fields will ALWAYS be written as blobs. if (!(fmiP->as_param || (basefieldP->elementsBasedOn(fty_blob) && !fPluginDSConfigP->fItemAsKey))) continue; // yes, we want to write this field as a BLOB #ifdef ARRAYFIELD_SUPPORT uInt16 arrayIndex; for (arrayIndex=0; true; arrayIndex++) #endif { // first create BLOB ID blobfieldname=fmiP->getName(); #ifdef ARRAYFIELD_SUPPORT // append array index if this is an array field if (basefieldP->isArray()) { StringObjAppendPrintf(blobfieldname,"[%d]",arrayIndex); // calculate leaf field leaffieldP= basefieldP->getArrayField(arrayIndex,true); // get existing leaf fields only } else { leaffieldP= basefieldP; // leaf is base field } // if no leaf field, we'll need to exit here (we're done with the array) if (leaffieldP==NULL) break; #else leaffieldP= basefieldP; // leaf is base field #endif SYSYNC_TRY { dberr= fDBApi_Data.DeleteBlob( aItem.getLocalID(),blobfieldname.c_str() ); if (dberr==LOCERR_NOTIMP) dberr= LOCERR_OK; // Not implemented is not an error if (dberr!=LOCERR_OK) SYSYNC_THROW(TSyncException("DBapi::DeleteBlob fatal error")); } SYSYNC_CATCH (...) SYSYNC_RETHROW; SYSYNC_ENDCATCH // we now have at least one field blobdeleted= true; #ifdef ARRAYFIELD_SUPPORT // non-array do not loop if (!basefieldP->isArray()) break; #endif } // for all array elements } // if writable BLOB/parametrized field } // for all field mappings return blobdeleted; } // TPluginApiDS::deleteBlobs /// returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps, tempGUIDs) bool TPluginApiDS::dsResumeSupportedInDB(void) { if (fPluginDSConfigP->fDBApiConfig_Admin.Connected()) { // we can do resume if plugin supports it return fPluginDSConfigP->fResumeSupported && fPluginDSConfigP->fDBApiConfig_Admin.Version()>=sInt32(VE_InsertMapItem); } return inherited::dsResumeSupportedInDB(); } // TPluginApiDS::dsResumeSupportedInDB #ifdef OBJECT_FILTERING // - returns true if DB implementation can also apply special filters like CGI-options // /dr(x,y) etc. during fetching bool TPluginApiDS::dsOptionFilterFetchesFromDB(void) { #ifndef SDK_ONLY_SUPPORT // if we are not connected, let immediate ancestor check it (e.g. SQL/ODBC) if (!fDBApi_Data.Created()) return inherited::dsOptionFilterFetchesFromDB(); #endif #ifdef SYSYNC_TARGET_OPTIONS string rangeFilter,s; // check range filtering // - date start end rangeFilter = "daterangestart:"; TimestampToISO8601Str(s, fDateRangeStart, TCTX_UTC, false, false); rangeFilter += s.c_str(); // - date range end rangeFilter += "\r\ndaterangeend:"; TimestampToISO8601Str(s, fDateRangeEnd, TCTX_UTC, false, false); rangeFilter += s.c_str(); // %%% tbd: // - attachments inhibit // - size limit #if (!defined _MSC_VER || defined WINCE) && !defined(__GNUC__) #warning "attachments and limit filters not yet supported" #endif // - let plugin know and check (we can filter at DBlevel if plugin understands both start/end) rangeFilter += "\r\n"; bool canfilter = (fDBApi_Data.FilterSupport(rangeFilter.c_str())>=2) || (fDateRangeStart==0 && fDateRangeEnd==0); // no range can always be "filtered" // if we can filter, that's sufficient if (canfilter) return true; #else // there is no range ever: yes, we can filter return true; #endif // otherwise, let implementation test (not immediate anchestor, which is a different API like ODBC) return TCustomImplDS::dsOptionFilterFetchesFromDB(); } // TPluginApiDS::dsOptionFilterFetchesFromDB // - returns true if DB implementation can filter the standard filters // (LocalDBFilter, TargetFilter and InvisibleFilter) during database fetch // - otherwise, fetched items will be filtered after being read from DB. bool TPluginApiDS::dsFilteredFetchesFromDB(bool aFilterChanged) { #ifndef SDK_ONLY_SUPPORT // if we are not connected, let immediate ancestor check it (e.g. SQL/ODBC) // Note that this can happen when dsFilteredFetchesFromDB() is called via Alertscript to resolve filter dependencies // before the DS is actually connected. In this case, the return value is not checked so that's ok. // Before actually laoding or zapping the sync set this is called once again with connected data plugin. if (!fDBApi_Data.Created()) return inherited::dsFilteredFetchesFromDB(aFilterChanged); #endif if (aFilterChanged || !fAPIFiltersTested) { fAPIFiltersTested = true; // Anyway, let DBApi know (even if all filters are empty) string filters; // - local DB filter (=static filter, from config) filters = "staticfilter:"; filters += fLocalDBFilter.c_str(); // - dynamic sync set filter filters += "\r\ndynamicfilter:"; filters += fSyncSetFilter.c_str(); // - invisible filter (those that MATCH this filter should NOT be included) filters += "\r\ninvisiblefilter:"; filters += fPluginDSConfigP->fInvisibleFilter.c_str(); // - let plugin know and check (we can filter at DBlevel if plugin understands both start/end) filters += "\r\n"; fAPICanFilter = (fDBApi_Data.FilterSupport(filters.c_str())>=3) || (fLocalDBFilter.empty() && fSyncSetFilter.empty() && fPluginDSConfigP->fInvisibleFilter.empty()); // no filter set = we can "filter" } // if we can filter, that's sufficient if (fAPICanFilter) return true; // otherwise, let implementation test (not immediate anchestor, which might be a different API like ODBC) return TCustomImplDS::dsFilteredFetchesFromDB(aFilterChanged); } // TPluginApiDS::dsFilteredFetchesFromDB #endif // can return 508 to force a slow sync. Other errors abort the sync localstatus TPluginApiDS::apiEarlyDataAccessStart(void) { TSyError dberr = LOCERR_OK; if (fPluginDSConfigP->fEarlyStartDataRead) { // prepare dberr = apiPrepareReadSyncSet(); if (dberr==LOCERR_OK) { // start the reading phase anyway (to make sure call order is always StartRead/EndRead/StartWrite/EndWrite) dberr = fDBApi_Data.StartDataRead(fPreviousToRemoteSyncIdentifier.c_str(),fPreviousSuspendIdentifier.c_str()); if (dberr!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("apiEarlyDataAccessStart - DBapi::StartDataRead error: %hd",dberr)); } } } return dberr; } // prepare for reading the sync set localstatus TPluginApiDS::apiPrepareReadSyncSet(void) { TSyError dberr = LOCERR_OK; #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) { // we need to create the context for the data plugin here, as loadAdminData is not called in BASED_ON_BINFILE_CLIENT case. dberr = connectDataPlugin(); if (dberr==LOCERR_OK) { if (!fDBApi_Data.Created()) { // - use datastore name as context name and link with session context dberr = fDBApi_Data.CreateContext( getName(), false, &(fPluginDSConfigP->fDBApiConfig_Data), "anydevice", // no real device key "singleuser", // no real user key NULL // no associated session level // fPluginAgentP->getDBApiSession() ); if (dberr==LOCERR_OK) { // make sure plugin now sees filters before starting to read sync set // Note: due to late instantiation of the data plugin, previous calls to engFilteredFetchesFromDB() were not // evaluated by the plugin, so we need to do that here explicitly once again engFilteredFetchesFromDB(false); } } } else if (dberr==LOCERR_NOTIMP) dberr=LOCERR_OK; // we just don't have a data plugin, that's ok } // binfile active #endif // BASED_ON_BINFILE_CLIENT return dberr; } // read sync set IDs and mod dates (and rest of data if technically unavoidable or // requested by aNeedAll) localstatus TPluginApiDS::apiReadSyncSet(bool aNeedAll) { TSyError dberr=LOCERR_OK; #ifdef SYDEBUG string ts1,ts2; #endif if (!fPluginDSConfigP->fEarlyStartDataRead) { // normal sequence, start data read is not called before starting to read the sync set dberr = apiPrepareReadSyncSet(); if (dberr!=LOCERR_OK) goto endread; } #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiReadSyncSet(aNeedAll); #endif // just let plugin know if we want data (if it actually does is the plugin's choice) if (aNeedAll) { // we'll need all data in the datastore in the end, let datastore know // Note: this is a suggestion to the plugin only - plugin does not need to follow it // and can return only ID/changed or all data for both states of this flag, // even changing on a item-by-item basis (can make sense for optimization). // The Plugin will return "1" here only in case it really follows the suggestion // an WILL return all data at ReadNextItem(). Otherwise, it may or may // not return data on a item by item basis (which is handled by the code // below). Therefore, at this time, the engine does not make use of the // ContextSupport() return value here. fDBApi_Data.ContextSupport("ReadNextItem:allfields\n\r"); } #ifdef SCRIPT_SUPPORT // process init script fParentKey.erase(); fWriting=false; fPluginAgentP->fScriptContextDatastore=this; if (!TScriptContext::executeTest(true,fScriptContextP,fPluginDSConfigP->fFieldMappings.fInitScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP)) { PDEBUGPRINTFX(DBG_ERROR,(" failed")); goto endread; } #endif // start reading // - read list of all local IDs that are in the current sync set DeleteSyncSet(); #ifdef SYDEBUG StringObjTimestamp(ts1,getPreviousToRemoteSyncCmpRef()); StringObjTimestamp(ts2,getPreviousSuspendCmpRef()); PDEBUGPRINTFX(DBG_DATA,( "Now reading local sync set: report changes since reference1 at %s, and since reference2 at %s", ts1.c_str(), ts2.c_str() )); #endif if (!fPluginDSConfigP->fEarlyStartDataRead) { // start the reading phase anyway (to make sure call order is always StartRead/EndRead/StartWrite/EndWrite) dberr = fDBApi_Data.StartDataRead(fPreviousToRemoteSyncIdentifier.c_str(),fPreviousSuspendIdentifier.c_str()); if (dberr!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("DBapi::StartDataRead fatal error: %hd",dberr)); goto endread; } } // we don't need to load the syncset if we are only refreshing from remote // but we also must load it if we can't zap without it on slow refresh, or when we can't retrieve items on non-slow refresh // (we won't retrieve anything in case of slow refresh, because after zapping there's nothing left by definition) if (!fRefreshOnly || (fRefreshOnly && fCacheData) || (fSlowSync && apiNeedSyncSetToZap()) || (!fSlowSync && implNeedSyncSetToRetrieve())) { SYSYNC_TRY { // true for initial ReadNextItem*() call, false later on bool firstReadNextItem=true; // read the items #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) TMultiFieldItem *mfitemP = NULL; #endif #ifdef DBAPI_TEXTITEMS TDB_Api_Str itemData; #endif do { // read next item int itemstatus; TSyncSetItem *syncSetItemP=NULL; TDB_Api_ItemID itemAndParentID; // two API variants #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { // ALWAYS prepare a multifield item, in case plugin wants to return data (it normally does not // unless queried with ContextSupport("ReadNextItem:allfields"), but it's a per-item decision // of the plugin itself (and probably overall optimization considerations for speed or memory) // if it wants to follow the recommendation set with "ReadNextItem:allfields". // Note: check for canCreateItemForRemote() should be always true now as loading syncset has been // moved within the progress of client sync session to a point where types ARE known. // Pre-3.2 engines however called this routine early so types could be unknown here. if (mfitemP==NULL && canCreateItemForRemote()) { mfitemP = (TMultiFieldItem *) newItemForRemote( ity_multifield ); } // as key (Note: will be functional key but w/o any fields in case we pass NULL item pointer) TDBItemKey *itemKeyP = newDBItemKey(mfitemP); dberr=fDBApi_Data.ReadNextItemAsKey(itemAndParentID, (KeyH)itemKeyP, itemstatus, firstReadNextItem); // check if plugin wrote something to our key. If so, we assume this is the item and save // it, EVEN IF we did not request getting item data. if (!itemKeyP->isWritten()) { // nothing in this item, forget it delete itemKeyP; // key first if (mfitemP) delete mfitemP; // then item if we had one at all mfitemP=NULL; } else { // got item, delete the key delete itemKeyP; // post-process (run scripts, create BLOB proxies if needed) postReadProcessItem(*mfitemP,0); } } else #endif #ifdef DBAPI_TEXTITEMS { // as text item dberr=fDBApi_Data.ReadNextItem(itemAndParentID, itemData, itemstatus, firstReadNextItem); } #else return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect #endif firstReadNextItem=false; if (dberr!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("DBapi::ReadNextItem fatal error = %hd",dberr)); #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (mfitemP) delete mfitemP; #endif goto endread; } // check if we have seen all items if (itemstatus==ReadNextItem_EOF) break; // we have received an item // - save returned data as item in the syncsetlist syncSetItemP = new TSyncSetItem; // - copy item object ID syncSetItemP->localid = itemAndParentID.item.c_str(); // - copy parent ID // %%% tbd, now empty syncSetItemP->containerid = ""; // - set modified status syncSetItemP->isModifiedAfterSuspend = itemstatus==ReadNextItem_Resumed; syncSetItemP->isModified = syncSetItemP->isModifiedAfterSuspend || itemstatus==ReadNextItem_Changed; #ifdef SYDEBUG PDEBUGPRINTFX(DBG_DATA+DBG_EXOTIC,( "read local item info in sync set: localid='%s'%s%s", syncSetItemP->localid.c_str(), syncSetItemP->isModified ? ", MODIFIED since reference1" : "", syncSetItemP->isModifiedAfterSuspend ? " AND since reference2" : "" )); #endif // no data yet, no item yet syncSetItemP->itemP = NULL; // two API variants #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { // as key if (mfitemP) { // we have read some data syncSetItemP->itemP = mfitemP; mfitemP = NULL; // now owned by syncSetItem syncSetItemP->itemP->setLocalID(itemAndParentID.item.c_str()); } } else #endif #ifdef DBAPI_TEXTITEMS { // as text item // - if we have received actual item data already, create and store an item here if (!itemData.empty()) { // store data in new item now // - create new empty TMultiFieldItem syncSetItemP->itemP = (TMultiFieldItem *) newItemForRemote( ity_multifield ); // - set localid as we might need it for reading specials or arrays syncSetItemP->itemP->setLocalID(itemAndParentID.item.c_str()); // - read data into item parseItemData(*(syncSetItemP->itemP),itemData.c_str(),0); } } #else return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect #endif // now save syncset item fSyncSetList.push_back(syncSetItemP); } while (true); } // try SYSYNC_CATCH (...) dberr=LOCERR_EXCEPTION; SYSYNC_ENDCATCH } else { PDEBUGPRINTFX(DBG_DATA+DBG_EXOTIC,("skipped reading sync set because of refresh-from-peer sync")); } // if we need the syncset at all endread: // then end read here if (dberr==LOCERR_OK) { dberr=fDBApi_Data.EndDataRead(); if (dberr!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("DBapi::EndDataRead failed, err=%hd",dberr)); } } return dberr; } // TPluginApiDS::apiReadSyncSet // Check if we need the syncset to zap bool TPluginApiDS::apiNeedSyncSetToZap(void) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiNeedSyncSetToZap(); #endif // only if we have deleteSyncSet on API level AND api can also apply all filters, we don't need the syncset to zap the datastore return !(fPluginDSConfigP->fHasDeleteSyncSet && engFilteredFetchesFromDB(false)); } // TPluginApiDS::apiNeedSyncSetToZap // Zap all data in syncset (note that everything outside the sync set will remain intact) localstatus TPluginApiDS::apiZapSyncSet(void) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiZapSyncSet(); #endif TSyError dberr = LOCERR_OK; // API must be able to process current filters in order to execute a zap - otherwise we would delete // more than the sync set defined by local filters. bool apiCanZap = engFilteredFetchesFromDB(false); if (apiCanZap) { // try to use plugin's specialized implementation dberr = fDBApi_Data.DeleteSyncSet(); apiCanZap = dberr!=LOCERR_NOTIMP; // API claims to be able to zap (but still might have failed with a DBerr in this case!) } // do it one by one if DeleteAllItems() is not implemented or plugin cannot apply current filters if (!apiCanZap) { dberr = zapSyncSetOneByOne(); } // return status return dberr; } // TPluginApiDS::apiZapSyncSet // fetch actual record from DB by localID. SyncSetItem might be passed to give additional information // such as containerid localstatus TPluginApiDS::apiFetchItem(TMultiFieldItem &aItem, bool aReadPhase, TSyncSetItem *aSyncSetItemP) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiFetchItem(aItem, aReadPhase, aSyncSetItemP); #endif TSyError dberr=LOCERR_OK; ItemID_Struct itemAndParentID; // set up item ID and parent ID itemAndParentID.item=(appCharP)aItem.getLocalID(); itemAndParentID.parent=const_cast(""); // two API variants #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { // get key TDBItemKey *itemKeyP = newDBItemKey(&aItem); // let plugin use it to fill item dberr=fDBApi_Data.ReadItemAsKey(itemAndParentID,(KeyH)itemKeyP); if (itemKeyP->isWritten()) { // post-process (run scripts, create BLOB proxies if needed) postReadProcessItem(aItem,0); } // done with the key delete itemKeyP; } else #endif #ifdef DBAPI_TEXTITEMS { TDB_Api_Str itemData; // read the item in text form from the DB dberr=fDBApi_Data.ReadItem(itemAndParentID,itemData); if (dberr==LOCERR_OK) { // put it into aItem parseItemData(aItem,itemData.c_str(),0); } } #else return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect #endif // return status return dberr; } // TPluginApiDS::apiFetchItem // start of write localstatus TPluginApiDS::apiStartDataWrite(void) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiStartDataWrite(); #endif TSyError dberr=fDBApi_Data.StartDataWrite(); if (dberr!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("DBapi::StartDataWrite returns dberr=%hd",dberr)); } return dberr; } // TPluginApiDS::apiStartDataWrite struct TPluginItemAux : public TSyncItemAux { #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) TDBItemKey *fItemKeyP; #endif #ifdef DBAPI_TEXTITEMS string fItemData; #endif }; // add new item to datastore, returns created localID localstatus TPluginApiDS::apiAddItem(TMultiFieldItem &aItem, string &aLocalID) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiAddItem(aItem, aLocalID); #endif TSyError dberr=LOCERR_OK; TDB_Api_ItemID itemAndParentID; #ifdef SCRIPT_SUPPORT fInserting=true; // flag for script, we are inserting new record #endif TPluginItemAux *aux = static_cast(aItem.getAux(TSyncItem::PLUGIN_API)); if (aux) { // Continue operation. #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { dberr=fDBApi_Data.InsertItemAsKey((KeyH)aux->fItemKeyP,"",itemAndParentID); if (dberr == LOCERR_AGAIN) return dberr; // done with the key delete aux->fItemKeyP; aux->fItemKeyP=NULL; } else #endif #ifdef DBAPI_TEXTITEMS { dberr=fDBApi_Data.InsertItem(aux->fItemData.c_str(),"",itemAndParentID); if (dberr == LOCERR_AGAIN) return dberr; } #else return LOCERR_WRONGUSAGE; #endif } else { // Two API variants for starting the operation. #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { // preprocess if (!preWriteProcessItem(aItem)) return 510; // DB error // get key TDBItemKey *itemKeyP = newDBItemKey(&aItem); // let plugin use it to obtain data to write dberr=fDBApi_Data.InsertItemAsKey((KeyH)itemKeyP,"",itemAndParentID); if (dberr == LOCERR_AGAIN) { TPluginItemAux *aux=new TPluginItemAux; aux->fItemKeyP=itemKeyP; aItem.setAux(TSyncItem::PLUGIN_API, aux); return LOCERR_AGAIN; } // done with the key delete itemKeyP; } else #endif #ifdef DBAPI_TEXTITEMS { string itemData; generateDBItemData( false, // all fields, not only assigned ones aItem, 0, // we do not use different sets for now itemData // here we'll get the data ); // now insert main record dberr=fDBApi_Data.InsertItem(itemData.c_str(),"",itemAndParentID); if (dberr == LOCERR_AGAIN) { TPluginItemAux *aux=new TPluginItemAux; aux->fItemData=itemData; aItem.setAux(TSyncItem::PLUGIN_API, aux); return LOCERR_AGAIN; } } #else return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect #endif } // now check result if (dberr==LOCERR_OK || dberr==DB_Conflict || dberr==DB_DataReplaced || dberr==DB_DataMerged) { // save new ID aLocalID = itemAndParentID.item.c_str(); aItem.setLocalID(aLocalID.c_str()); // make sure item itself has correct ID as well if (dberr!=DB_Conflict) { // now write all the BLOBs writeBlobs(false,aItem,0); #ifdef SCRIPT_SUPPORT // process overall afterwrite script fWriting=true; fInserting=true; fDeleting=false; fPluginAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) { PDEBUGPRINTFX(DBG_ERROR,(" failed")); dberr = LOCERR_WRONGUSAGE; } #endif } } // return status return dberr; } // TPluginApiDS::apiAddItem #ifdef SYSYNC_CLIENT /// finalize local ID (for datastores that can't efficiently produce these at insert) bool TPluginApiDS::dsFinalizeLocalID(string &aLocalID) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::dsFinalizeLocalID(aLocalID); #else // still check for DBAPi to be ready at this point, because when peer messes up protocol, we // can get here before the datastore has been initialized at all if (!fDBApi_Data.Created()) return false; // no dataset loaded -> all localids are final (from last session) #endif TDB_Api_Str finalizedID; localstatus sta = fDBApi_Data.FinalizeLocalID(aLocalID.c_str(),finalizedID); if (sta==LOCERR_OK && !finalizedID.empty()) { // pass modified ID back aLocalID = finalizedID.c_str(); // ID was updated return true; } // no change - ID is ok as-is return false; } // TPluginApiDS::dsFinalizeLocalID #endif // SYSYNC_CLIENT // update existing item in datastore, returns 404 if item not found localstatus TPluginApiDS::apiUpdateItem(TMultiFieldItem &aItem) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiUpdateItem(aItem); #endif TSyError dberr=LOCERR_OK; TDB_Api_ItemID updItemAndParentID; ItemID_Struct itemAndParentID; // set up item ID and parent ID itemAndParentID.item=(appCharP)aItem.getLocalID(); itemAndParentID.parent=const_cast(""); #ifdef SCRIPT_SUPPORT fInserting=false; // flag for script, we are updating, not inserting now #endif TPluginItemAux *aux = static_cast(aItem.getAux(TSyncItem::PLUGIN_API)); if (aux) { // Continue operation. #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { dberr=fDBApi_Data.UpdateItemAsKey((KeyH)aux->fItemKeyP,itemAndParentID,updItemAndParentID); if (dberr == LOCERR_AGAIN) return dberr; // done with the key delete aux->fItemKeyP; aux->fItemKeyP=NULL; } else #endif #ifdef DBAPI_TEXTITEMS { dberr=fDBApi_Data.UpdateItem(aux->fItemData.c_str(),itemAndParentID,updItemAndParentID); if (dberr == LOCERR_AGAIN) return dberr; } #else return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect #endif } else { // Two API variants for starting the operation. #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) if (fPluginDSConfigP->fItemAsKey) { // preprocess if (!preWriteProcessItem(aItem)) return 510; // DB error // get key TDBItemKey *itemKeyP = newDBItemKey(&aItem); // let plugin use it to obtain data to write dberr=fDBApi_Data.UpdateItemAsKey((KeyH)itemKeyP,itemAndParentID,updItemAndParentID); if (dberr == LOCERR_AGAIN) { TPluginItemAux *aux=new TPluginItemAux; aux->fItemKeyP=itemKeyP; aItem.setAux(TSyncItem::PLUGIN_API, aux); return LOCERR_AGAIN; } // done with the key delete itemKeyP; } else #endif #ifdef DBAPI_TEXTITEMS { string itemData; generateDBItemData( true, // only assigned fields aItem, 0, // we do not use different sets for now itemData // here we'll get the data ); // now update main record dberr=fDBApi_Data.UpdateItem(itemData.c_str(),itemAndParentID,updItemAndParentID); if (dberr == LOCERR_AGAIN) { TPluginItemAux *aux=new TPluginItemAux; aux->fItemData=itemData; aItem.setAux(TSyncItem::PLUGIN_API, aux); return LOCERR_AGAIN; } } #else return LOCERR_WRONGUSAGE; // completely wrong usage - should never happen as compatibility is tested at module connect #endif } if (dberr==LOCERR_OK) { // check if ID has changed if (!updItemAndParentID.item.empty() && strcmp(updItemAndParentID.item.c_str(),aItem.getLocalID())!=0) { if (IS_SERVER) { // update item ID and Map dsLocalIdHasChanged(aItem.getLocalID(),updItemAndParentID.item.c_str()); } // - update in this item we have here as well aItem.setLocalID(updItemAndParentID.item.c_str()); aItem.updateLocalIDDependencies(); } // now write all the BLOBs writeBlobs(true,aItem,0); #ifdef SCRIPT_SUPPORT // process overall afterwrite script fWriting=true; fInserting=false; fDeleting=false; fPluginAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) { PDEBUGPRINTFX(DBG_ERROR,(" failed")); dberr = LOCERR_WRONGUSAGE; } #endif } // return status return dberr; } // TPluginApiDS::apiUpdateItem // delete existing item in datastore, returns 211 if not existing any more localstatus TPluginApiDS::apiDeleteItem(TMultiFieldItem &aItem) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiDeleteItem(aItem); #endif TSyError dberr=LOCERR_OK; // delete item dberr=fDBApi_Data.DeleteItem( aItem.getLocalID() ); if (dberr==LOCERR_OK) { deleteBlobs(true,aItem,0); // Item related blobs must be removed as well #ifdef SCRIPT_SUPPORT // process overall afterwrite script fWriting=true; fInserting=false; fDeleting=true; fPluginAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fPluginDSConfigP->fFieldMappings.fAfterWriteScript,fPluginDSConfigP->getDSFuncTableP(),fPluginAgentP,&aItem,true)) { PDEBUGPRINTFX(DBG_ERROR,(" failed")); dberr = LOCERR_WRONGUSAGE; } #endif } // if // return status return dberr; } // TPluginApiDS::apiDeleteItem // - end DB data write sequence (but not yet admin data), returns DB-specific identifier for this sync (if any) localstatus TPluginApiDS::apiEndDataWrite(string &aThisSyncIdentifier) { #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Data.Created()) return inherited::apiEndDataWrite(aThisSyncIdentifier); #endif // nothing special to do in ODBC case, as we do not have a separate sync identifier TDB_Api_Str newSyncIdentifier; TSyError sta = fDBApi_Data.EndDataWrite(true, newSyncIdentifier); aThisSyncIdentifier=newSyncIdentifier.c_str(); return sta; } // TPluginApiDS::apiEndDataWrite // must be called before starting a thread. If returns false, starting a thread now // is not allowed and must be postponed. // Includes ThreadMayChange() call bool TPluginApiDS::startingThread(void) { // %%% tbd: if modules are completely independent, we might not need this in all cases if (!dbAccessLocked()) { static_cast(fSessionP)->fApiLocked=true; // Now post possible thread change to the API // - on the database level ThreadMayChangeNow(); // - on the session level as well (to make sure, and because we will post a change back // at the end of the thread, which will be called FROM the new thread, which constitutes // executing something in the session context. static_cast(fSessionP)->getDBApiSession()->ThreadMayChangeNow(); return true; } else return false; } // TPluginApiDS::startingThread // - must be called when a thread's activity has ended // BUT THE CALL MUST BE FROM THE ENDING THREAD, not the main thread! void TPluginApiDS::endingThread(void) { // thread may change for the API now again // - on the database level ThreadMayChangeNow(); // - on the session level as well static_cast(fSessionP)->getDBApiSession()->ThreadMayChangeNow(); // Now other threads are allowed to access the API again static_cast(fSessionP)->fApiLocked=false; } // TPluginApiDS::endingThread // should be called before doing DB accesses that might be locked (e.g. because another thread is using the DB resources) bool TPluginApiDS::dbAccessLocked(void) { return static_cast(fSessionP)->fApiLocked; } // TPluginApiDS::dbAccessLocked // - alert possible thread change to plugins // Does not check if API is locked or not, see dsThreadMayChangeNow() void TPluginApiDS::ThreadMayChangeNow(void) { // let API know, thread might change for next request (but not necessarily does!) if (fDBApi_Data.Created()) fDBApi_Data.ThreadMayChangeNow(); if (fDBApi_Admin.Created()) fDBApi_Admin.ThreadMayChangeNow(); } // TPluginApiDS::ThreadMayChangeNow // - engine Thread might change void TPluginApiDS::dsThreadMayChangeNow(void) { // Do not post thread change infos when DB access is locked. // If it is locked, the thread that locked it will call a // ThreadMayChangeNow() to the API when the thread terminates (in endingThread()). if (!dbAccessLocked()) { ThreadMayChangeNow(); } // let ancestor do it's own stuff inherited::dsThreadMayChangeNow(); } // TPluginApiDS::dsThreadMayChangeNow // - connect data handling part of plugin, Returns LOCERR_NOTIMPL when no data plugin is selected // Note: this is either called as part of apiLoadAdminData (even if plugin is NOT responsible for data!) // or directly before startDataRead (in BASED_ON_BINFILE_CLIENT binfileDSActive() case) TSyError TPluginApiDS::connectDataPlugin(void) { TSyError err = LOCERR_NOTIMP; // filtering capabilities need to be reevaluated anyway fAPICanFilter = false; fAPIFiltersTested = false; // only connect if we have plugin data support if (fPluginDSConfigP->fDBApiConfig_Data.Connected()) { err = LOCERR_OK; DB_Callback cb= &fDBApi_Data.fCB.Callback; cb->callbackRef = fSessionP; // the session #ifdef ENGINEINTERFACE_SUPPORT cb->thisBase = fPluginDSConfigP->getSyncAppBase()->fEngineInterfaceP; #endif #ifdef SYDEBUG // Datastore Data access debug goes to session log cb->debugFlags = PDEBUGTEST(DBG_DATA+DBG_DBAPI+DBG_PLUGIN) ? 0xFFFF : 0; cb->DB_DebugPuts = SessionLogDebugPuts; cb->DB_DebugBlock = SessionLogDebugBlock; cb->DB_DebugEndBlock = SessionLogDebugEndBlock; cb->DB_DebugEndThread = SessionLogDebugEndThread; cb->DB_DebugExotic = SessionLogDebugExotic; #endif // SYDEBUG #ifdef ENGINEINTERFACE_SUPPORT // Data module can use Get/SetValue for "AsKey" routines and for session script var access // Note: these are essentially context free and work without a global call-in structure // (which is not necessarily there, for example in no-library case) CB_Connect_KeyAccess(cb); // connect generic key access routines // Version of OpenSessionKey that implicitly opens a key for the current session (DB plugins // do not have a session handle, as their use is always implicitly in a session context). cb->ui.OpenSessionKey = SessionOpenSessionKey; #endif // ENGINEINTERFACE_SUPPORT } return err; } // connectDataPlugin #ifndef BINFILE_ALWAYS_ACTIVE /// @brief save admin data /// Must save the following items: /// - fRemoteSyncAnchor = anchor string used by remote party for this session /// - fThisLocalAnchor = anchor (beginning of session) timestamp for this sync /// - fThisSync = timestamp for this sync (same as fThisLocalAnchor unless fSyncTimeStampAtEnd config is set) /// - fLastToRemoteLocalAnchor = timestamp for anchor (beginning of session) of last session that sent data to remote /// (same as fThisLocalAnchor unless we did a refrehs-from-remote session) /// - fLastToRemoteSync = timestamp for last session that sent data to remote /// (same as fThisSync unless we did a refresh-from-remote session) /// - fLastToRemoteSyncIdentifier = string identifying last session that sent data to remote (needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier). /// - fMapTable = list containing map entries. For each entry the implementation must: /// - if changed==false: the entry hasn't been changed, so no DB operation is required /// - if changed==true and remoteid is not empty: /// - if added==true, add the entry as a new record to the DB /// - if added==false, update the entry in the DB with matching localid /// - if changed==true and remoteid is empty and added==false: delete the entry(s) in the DB with matching localid /// For resumable datastores (fConfigP->fResumeSupport==true): /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// /// For datastores that can resume in middle of a chunked item (fConfigP->fResumeItemSupport==true): /// - fPartialItemState = state of partial item (TPartialItemState enum): /// - if pi_state_none: save params, delete BLOB data (empty data) /// - if pi_state_save_incoming: save params+BLOB, save as in DB such that we will get pi_state_loaded_incoming when loaded again /// - if pi_state_save_outgoing: save params+BLOB, save as in DB such that we will get pi_state_loaded_outgoing when loaded again /// - if pi_state_loaded_incoming: no need to save, as params+BLOB have not changed since last save (but currently saved params+BLOB in DB must be retained) /// - if pi_state_loaded_outgoing: no need to save, as params+BLOB have not changed since last save (but currently saved params+BLOB in DB must be retained) /// /// - fLastItemStatus = status code (TSyError) of last item /// - fLastSourceURI = item ID (string, if limited in length should be long enough for large IDs, >=64 chars recommended) /// - fLastTargetURI = item ID (string, if limited in length should be long enough for large IDs, >=64 chars recommended) /// - fPITotalSize = uInt32, total item size /// - fPIUnconfirmedSize= uInt32, unconfirmed part of item size /// - fPIStoredSize = uInt32, size of BLOB to store, 0=none /// - fPIStoredDataP = void *, BLOB data, NULL if none /// /// @param aDataCommitted[in] indicates if data has been committed to the database already or not /// @param aSessionFinished[in] indicates if this is a final, end-of-session admin save (otherwise, it's only a resume state save) localstatus TPluginApiDS::apiSaveAdminData(bool aDataCommitted, bool aSessionFinished) { // security - don't use API when locked if (dbAccessLocked()) return 503; // service unavailable const char* PIStored = "PIStored"; // blob name field #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Admin.Created()) return inherited::apiSaveAdminData(aDataCommitted, aSessionFinished); #endif localstatus sta=LOCERR_OK; TMapContainer::iterator pos; // save the entire map list differentially pos=fMapTable.begin(); PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("apiSaveAdminData: internal map table has %ld entries (normal and others)",(long)fMapTable.size())); while (pos!=fMapTable.end()) { DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "apiSaveAdminData: entryType=%s, localid='%s', remoteID='%s', mapflags=0x%lX, changed=%d, deleted=%d, added=%d, markforresume=%d, savedmark=%d", MapEntryTypeNames[(*pos).entrytype], (*pos).localid.c_str(), (*pos).remoteid.c_str(), (long)(*pos).mapflags, (int)(*pos).changed, (int)(*pos).deleted, (int)(*pos).added, (int)(*pos).markforresume, (int)(*pos).savedmark )); // check if item has changed since map table was read, or if its markforresume has changed // or if this is a successful end of a session, when we can safely assume that any pending maps // are from adds to the client that have never reached the client (otherwise, we'd have got // a map for it, even if the add was in a previous session or session attempt) if ( (*pos).changed || (*pos).added || (*pos).deleted || // update of DB needed ((*pos).markforresume!=(*pos).savedmark) // mark for resume changed ) { // make sure it does not get written again if not really modified again (*pos).changed=false; // update new mapflags w/o changing mapflag_useforresume in the actual flags (as we still need it while session goes on) uInt32 newmapflags = (*pos).mapflags & ~mapflag_useforresume; if ((*pos).markforresume) newmapflags |= mapflag_useforresume; // remember last saved state (*pos).savedmark=(*pos).markforresume; // do something! MapID_Struct mapid; mapid.ident=(int)(*pos).entrytype; mapid.localID=(char *)((*pos).localid.c_str()); mapid.remoteID=(char *)((*pos).remoteid.c_str()); mapid.flags=newmapflags; if ((*pos).deleted) { if (!(*pos).added) { // delete this entry (only needed if it was not also added since last save - otherwise, map entry was never saved to the DB yet) sta=fDBApi_Admin.DeleteMapItem(&mapid); if (sta!=LOCERR_OK) break; } // now remove it from the list, such that we don't try to delete it again TMapContainer::iterator delpos=pos++; // that's the next to have a look at fMapTable.erase(delpos); // remove it now continue; // pos is already updated } // deleted else if ((*pos).added) { // add a new entry sta=fDBApi_Admin.InsertMapItem(&mapid); if (sta!=LOCERR_OK) break; // is now added, don't add again later (*pos).added=false; } else { // explicitly changed or needs update because of resume mark or pendingmap flag // change existing entry sta=fDBApi_Admin.UpdateMapItem(&mapid); if (sta!=LOCERR_OK) break; } } // if something changed // anyway - reset mark for resume, it must be reconstructed before next save (*pos).markforresume=false; // next pos++; } // while if (sta!=LOCERR_OK) return sta; // collect admin data in a string string adminData,s; adminData.erase(); // add remote sync anchor adminData+="remotesyncanchor:"; StrToCStrAppend(fLastRemoteAnchor.c_str(),adminData,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) /* not needed any more // add local anchor adminData+="\r\nlastlocalanchor:"; timeStampToISO8601(fThisLocalAnchor,s,true,true); adminData+=s.c_str(); */ // add last sync time adminData+="\r\nlastsync:"; TimestampToISO8601Str(s, fPreviousSyncTime, TCTX_UTC, false, false); adminData+=s.c_str(); /* not needed any more // add local anchor of last sync with sending data to remote adminData+="\r\nlasttoremotelocalanchor:"; timeStampToISO8601(fLastToRemoteLocalAnchor,s,true,true); adminData+=s.c_str(); */ // add last to remote sync time adminData+="\r\nlasttoremotesync:"; TimestampToISO8601Str(s, fPreviousToRemoteSyncCmpRef, TCTX_UTC, false, false); adminData+=s.c_str(); // add identifier needed by datastore to identify records changes since last to-remote-sync if (fPluginDSConfigP->fStoreSyncIdentifiers) { adminData+="\r\nlasttoremotesyncid:"; StrToCStrAppend(fPreviousToRemoteSyncIdentifier.c_str(),adminData,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) } // add resume alert code adminData+="\r\nresumealertcode:"; StringObjAppendPrintf(adminData,"%hd",fResumeAlertCode); // add last suspend time adminData+="\r\nlastsuspend:"; TimestampToISO8601Str(s, fPreviousSuspendCmpRef, TCTX_UTC, false, false); adminData+=s.c_str(); // add identifier needed by datastore to identify records changes since last suspend if (fPluginDSConfigP->fStoreSyncIdentifiers) { adminData+="\r\nlastsuspendid:"; StrToCStrAppend(fPreviousSuspendIdentifier.c_str(),adminData,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) } /// For datastores that can resume in middle of a chunked item (fConfigP->fResumeItemSupport==true): void* blPtr = fPIStoredDataP; // position memSize blSize= fPIStoredSize; // actualbytes if (dsResumeChunkedSupportedInDB()) { /// - fPartialItemState = state of partial item (TPartialItemState enum): /// - if pi_state_none: save params, delete BLOB data (empty data) /// - if pi_state_save_incoming: save params+BLOB, save as in DB such that we will get pi_state_loaded_incoming when loaded again /// - if pi_state_save_outgoing: save params+BLOB, save as in DB such that we will get pi_state_loaded_outgoing when loaded again /// - if pi_state_loaded_incoming or /// pi_state_loaded_outgoing: no need to save, as params+BLOB have not changed since last save /// (but currently saved params+BLOB in DB must be retained) if ( fPartialItemState!=pi_state_loaded_incoming && fPartialItemState!=pi_state_loaded_outgoing ) { // and create the new status for these cases TPartialItemState pp= fPartialItemState; if (pp==pi_state_save_incoming) pp= pi_state_loaded_incoming; // adapt them before if (pp==pi_state_save_outgoing) pp= pi_state_loaded_outgoing; adminData+="\r\npartialitemstate:"; StringObjAppendPrintf( adminData,"%d",pp ); // - fLastItemStatus = status code (TSyError) of last item adminData+="\r\nlastitemstatus:"; StringObjAppendPrintf( adminData,"%hd",fLastItemStatus ); // - fLastSourceURI = item ID (string, if limited in length should be long enough for large IDs, >=64 chars recommended) adminData+="\r\nlastsourceURI:"; StrToCStrAppend( fLastSourceURI.c_str(), adminData,true ); // - fLastTargetURI = item ID (string, if limited in length should be long enough for large IDs, >=64 chars recommended) adminData+="\r\nlasttargetURI:"; StrToCStrAppend( fLastTargetURI.c_str(), adminData,true ); // - fPITotalSize = uInt32, total item size adminData+="\r\ntotalsize:"; StringObjAppendPrintf( adminData,"%ld", (long)fPITotalSize ); // - fPIUnconfirmedSize= uInt32, unconfirmed part of item size adminData+="\r\nunconfirmedsize:"; StringObjAppendPrintf( adminData,"%ld", (long)fPIUnconfirmedSize ); // - fPIStoredSize = uInt32, size of BLOB to store, store it as well to make ReadBlob easier (mallloc) adminData+="\r\nstoredsize:"; StringObjAppendPrintf( adminData,"%ld", (long)blSize ); // - fPIStoredSize = uInt32, size of BLOB to store, 0=none // - fPIStoredDataP = void *, BLOB data, NULL if none adminData+="\r\nstored;BLOBID="; adminData+= PIStored; } // if } // if // CRLF at end adminData+="\r\n"; // save admin data sta= fDBApi_Admin.SaveAdminData(adminData.c_str()); if (sta) return sta; // now write all the BLOBs, currently there is only the PIStored object of ResumeChunkedSupport if (dsResumeChunkedSupportedInDB()) { TPartialItemState pis= fPartialItemState; if ( blSize==0 && (pis==pi_state_save_incoming || pis==pi_state_save_outgoing) ) pis= pi_state_none; // delete blob, if size==0 // handle BLOB switch (pis) { // make sure BLOB is deleted when it is empty case pi_state_none: sta = fDBApi_Admin.DeleteBlob( "", // aItem.getLocalID() PIStored // blobfieldname.c_str() ); if (sta==DB_NotFound) sta= LOCERR_OK; // no error, if not existing break; // save BLOB contents case pi_state_save_incoming: // Write the whole BLOB at once case pi_state_save_outgoing: sta = fDBApi_Admin.WriteBlob ( "", // aItem.getLocalID() PIStored, // blobfieldname.c_str() blPtr, // bufferP blSize, // actualbytes blSize, // blobsize true, // first true // last ); break; case pi_state_loaded_incoming: case pi_state_loaded_outgoing: // do nothing, as the blob is saved already break; } // switch } // if return sta; } // TPluginApiDS::apiSaveAdminData /// @brief Load admin data from Plugin-implemented database /// Must search for existing target record matching the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// - if there is a matching record: load it /// - if there is no matching record, set fFirstTimeSync=true. The implementation may already create a /// new record with the key (aDeviceID,aDatabaseID,aRemoteDBID) and initialize it with the data from /// the items as shown below. At least, fTargetKey must be set to a value that will allow apiSaveAdminData to /// update the record. In case implementation chooses not create the record only in apiSaveAdminData, it must /// buffer the triple (aDeviceID,aDatabaseID,aRemoteDBID) such that it is available at apiSaveAdminData. /// If a record exists implementation must load the following items: /// - fTargetKey = some key value that can be used to re-identify the target record later at SaveAdminData. /// If the database implementation has other means to re-identify the target, this can be /// left unassigned. /// - fLastRemoteAnchor = anchor string used by remote party for last session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of last session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT && binfileDSActive()) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT && binfileDSActive()). Needs /// only be saved if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must load all map entries /// related to the current sync target identified by the triple of (aDeviceID,aDatabaseID,aRemoteDBID) /// or by fTargetKey. The entries added to fMapTable must have "changed", "added" and "deleted" flags /// set to false. /// For resumable datastores (fConfigP->fResumeSupport==true): /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps = map. The implementation must load all all pending maps (client only) into /// fPendingAddMaps (and fUnconfirmedMaps must be left empty). /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) /// /// For datastores that can resume in middle of a chunked item (fConfigP->fResumeItemSupport==true): /// - fPartialItemState = state of partial item (TPartialItemState enum): /// - after load, value must always be pi_state_none, pi_state_loaded_incoming or pi_state_loaded_outgoing. /// - pi_state_save_xxx MUST NOT be set after loading (see apiSaveAdminData comments) /// - fLastItemStatus = status code (TSyError) of last item /// - fLastSourceURI = item ID (string, if limited in length should be long enough for large IDs, >=64 chars recommended) /// - fLastTargetURI = item ID (string, if limited in length should be long enough for large IDs, >=64 chars recommended) /// - fPITotalSize = uInt32, total item size /// - fPIUnconfirmedSize= uInt32, unconfirmed part of item size /// - fPIStoredSize = uInt32, size of BLOB, 0=none /// - fPIStoredDataP = void *, BLOB data. /// - If this is not NULL on entry AND fPIStoredDataAllocated is set, /// the current block must be freed using smlLibFree() (and NOT JUST free()!!). /// - If no BLOB is loaded, this must be set to NULL /// - If a BLOB is loaded, an appropriate memory block should be allocated for it /// using smlLibMalloc() (and NOT JUST malloc()!!) /// - fPIStoredDataAllocated: MUST BE SET to true when a memory block was allocated into fPIStoredDataP. /// @param aDeviceID[in] remote device URI (device ID) /// @param aDatabaseID[in] local database ID /// @param aRemoteDBID[in] database ID of remote device localstatus TPluginApiDS::apiLoadAdminData( const char *aDeviceID, const char *aDatabaseID, const char *aRemoteDBID ) { // security - don't use API when locked if (dbAccessLocked()) return 503; // service unavailable const char* PIStored = "PIStored"; // blob name field TSyError err = LOCERR_OK; // In any case - this is the time to create the contexts for the datastore // - admin if selected if (fPluginDSConfigP->fDBApiConfig_Admin.Connected()) { DB_Callback cb= &fDBApi_Admin.fCB.Callback; cb->callbackRef = fSessionP; // the session #ifdef ENGINEINTERFACE_SUPPORT cb->thisBase = fSessionP->getSyncAppBase()->fEngineInterfaceP; #endif #ifdef SYDEBUG // Datastore Admin debug goes to session log cb->debugFlags = PDEBUGTEST(DBG_ADMIN+DBG_DBAPI+DBG_PLUGIN) ? 0xFFFF : 0; cb->DB_DebugPuts = SessionLogDebugPuts; cb->DB_DebugBlock = SessionLogDebugBlock; cb->DB_DebugEndBlock = SessionLogDebugEndBlock; cb->DB_DebugEndThread = SessionLogDebugEndThread; cb->DB_DebugExotic = SessionLogDebugExotic; #endif // SYDEBUG #ifdef ENGINEINTERFACE_SUPPORT // Admin module can use Get/SetValue for session script var access // Note: these are essentially context free and work without a global call-in structure // (which is not necessarily there, for example in no-library case) CB_Connect_KeyAccess(cb); // connect generic key access routines // Version of OpenSessionKey that implicitly opens a key for the current session (DB plugins // do not have a session handle, as their use is always implicitly in a session context). cb->ui.OpenSessionKey = SessionOpenSessionKey; #endif // ENGINEINTERFACE_SUPPORT if (!fDBApi_Admin.Created()) { // - use datastore name as context name and link with session context err= fDBApi_Admin.CreateContext( getName(), true, &(fPluginDSConfigP->fDBApiConfig_Admin), fPluginAgentP->fDeviceKey.c_str(), fPluginAgentP->fUserKey.c_str(), fPluginAgentP->getDBApiSession() ); } if (err!=LOCERR_OK) SYSYNC_THROW(TSyncException("Error creating context for plugin module handling admin",err)); } // - data if selected err = connectDataPlugin(); if (err==LOCERR_OK) { if (!fDBApi_Data.Created()) { // - use datastore name as context name and link with session context err= fDBApi_Data.CreateContext( getName(), false, &(fPluginDSConfigP->fDBApiConfig_Data), fPluginAgentP->fDeviceKey.c_str(), fPluginAgentP->fUserKey.c_str(), fPluginAgentP->getDBApiSession() ); } } else if (err==LOCERR_NOTIMP) err=LOCERR_OK; // we just don't have a data plugin, that's ok, inherited (SQL) will handle data if (err!=LOCERR_OK) SYSYNC_THROW(TSyncException("Error creating context for plugin module handling data",err)); // Perform actual loading of admin data #ifndef SDK_ONLY_SUPPORT // only handle here if we are in charge - otherwise let ancestor handle it if (!fDBApi_Admin.Created()) return inherited::apiLoadAdminData(aDeviceID, aDatabaseID, aRemoteDBID); #endif // find and read (or create) the admin data TDB_Api_Str adminData; err=fDBApi_Admin.LoadAdminData(aDatabaseID,aRemoteDBID,adminData); if (err==404) { // this means that this admin data set did not exists before fFirstTimeSync=true; } else if (err!=LOCERR_OK) return err; // failed else fFirstTimeSync=false; // we already have admin data, so it can't be first sync // parse data const char *p = adminData.c_str(); // second check: if empty adminData returned, this is treated as first sync as well if (*p==0) fFirstTimeSync=true; const char *q; string fieldname,value; lineartime_t *ltP; string *strP; uInt16 *usP; uInt32 *ulP; // read all fields while(*p) { // find name for (q=p; *q && (*q!=':' && *q!=';');) q++; fieldname.assign(p,q-p); p=q; // p should now point to ':' or ';' if (*p==':' || *p==';') { p++; // consume colon or semicolon // get value value.erase(); p += CStrToStrAppend(p, value, true); // stop at quote or ctrl char // analyze and store now // - no storage location found yet ltP=NULL; strP=NULL; usP=NULL; ulP=NULL; // - find where we need to store this if (strucmp(fieldname.c_str(),"remotesyncanchor")==0) { strP=&fLastRemoteAnchor; } else if (strucmp(fieldname.c_str(),"lastsync")==0) { ltP=&fPreviousSyncTime; } else if (strucmp(fieldname.c_str(),"lasttoremotesync")==0) { ltP=&fPreviousToRemoteSyncCmpRef; } else if (strucmp(fieldname.c_str(),"lasttoremotesyncid")==0) { strP=&fPreviousToRemoteSyncIdentifier; } else if (strucmp(fieldname.c_str(),"resumealertcode")==0) { usP=&fResumeAlertCode; } else if (strucmp(fieldname.c_str(),"lastsuspend")==0) { ltP=&fPreviousSuspendCmpRef; } else if (strucmp(fieldname.c_str(),"lastsuspendid")==0) { strP=&fPreviousSuspendIdentifier; } /// For datastores that can resume in middle of a chunked item (fConfigP->fResumeItemSupport==true): else { if (dsResumeChunkedSupportedInDB()) { if (strucmp(fieldname.c_str(),"partialitemstate")==0) { usP = (TSyError*)&fPartialItemState; // enum } else if (strucmp(fieldname.c_str(),"lastitemstatus")==0) { usP= &fLastItemStatus; // status code (TSyError) of last item } else if (strucmp(fieldname.c_str(),"lastsourceURI" )==0) { strP= &fLastSourceURI; // item ID (string, if limited in len should be long enough for large IDs, >=64 chars recommended) } else if (strucmp(fieldname.c_str(),"lasttargetURI" )==0) { strP= &fLastTargetURI; // item ID (string, if limited in len should be long enough for large IDs, >=64 chars recommended) } else if (strucmp(fieldname.c_str(),"totalsize" )==0) { ulP= &fPITotalSize; // uInt32, total item size } else if (strucmp(fieldname.c_str(),"unconfirmedsize")==0) { ulP= &fPIUnconfirmedSize; // uInt32, unconfirmed part of item size } else if (strucmp(fieldname.c_str(),"storedsize")==0) { ulP= &fPIStoredSize; // uInt32, size of BLOB, 0=none } /// - fPIStoredDataP = void *, BLOB data. /// - If this is not NULL on entry AND fPIStoredDataAllocated is set, /// the current block must be freed using smlLibFree() (and NOT JUST free()!!). /// - If no BLOB is loaded, this must be set to NULL /// - If a BLOB is loaded, an appropriate memory block should be allocated for it /// using smlLibMalloc() (and NOT JUST malloc()!!) /// - fPIStoredDataAllocated: MUST BE SET to true when a memory block was allocated into fPIStoredDataP. else if (strucmp(fieldname.c_str(),"stored")==0) { if ( fPIStoredDataP!=NULL && fPIStoredDataAllocated ) smlLibFree(fPIStoredDataP); fPIStoredDataP= NULL; fPIStoredDataAllocated= false; TDB_Api_Blk b; memSize totSize; bool last; if (fPIStoredSize>0) { fPIStoredDataP= smlLibMalloc( fPIStoredSize ); // now prepare for the full blob fPIStoredDataAllocated= true; unsigned char* dp = (unsigned char*)fPIStoredDataP; unsigned char* lim = dp + fPIStoredSize; bool first= true; do { err= fDBApi_Admin.ReadBlob( "", // fParentObjectID.c_str(), // the item ID PIStored, // fBlobID.c_str(), // the ID of the blob 0, // neededBytes, // how much we need b, // blobData, // blob data totSize, // totalsize, // will receive total size or 0 if unknown first, // first, last // last ); if (err) break; memSize rema= b.fSize; if (dp+rema > lim) rema= lim-dp; // avoid overflow memcpy( dp, b.fPtr, rema ); dp+= rema; fDBApi_Admin.DisposeBlk( b ); // we have now a copy => remove it first= false; } while (!last); } // if } } // if (dsResume ...) } // if // - store if (strP) { // - is a string (*strP) = value; } else if (usP) { // - is a uInt16 StrToUShort(value.c_str(),*usP); } else if (ulP) { // - is a uInt32 StrToULong(value.c_str(),*ulP); } else if (ltP) { // - is a ISO8601 lineartime_t tim; timecontext_t tctx; if (ISO8601StrToTimestamp(value.c_str(), tim, tctx)!=0) { // converted ok, now make sure we get UTC TzConvertTimestamp(tim,tctx,TCTX_UTC,getSessionZones(),fPluginDSConfigP->fDataTimeZone); *ltP=tim; } else { // no valid date/time = empty *ltP=0; } } } // skip everything up to next end of line (in case value was terminated by a quote or other ctrl char) while (*p && *p!='\r' && *p!='\n') p++; // skip all line end chars up to beginning of next line or end of record while (*p && (*p=='\r' || *p=='\n')) p++; // p now points to next line's beginning }; // then read maps bool firstEntry=true; fMapTable.clear(); TDB_Api_MapID mapid; TMapEntry mapEntry; while (fDBApi_Admin.ReadNextMapItem(mapid, firstEntry)) { // get entry mapEntry.localid=mapid.localID.c_str(); mapEntry.remoteid=mapid.remoteID.c_str(); mapEntry.mapflags=mapid.flags; // check for old API which did not support entry types if (fPluginDSConfigP->fDBApiConfig_Admin.Version()=numMapEntryTypes) mapEntry.entrytype = mapentry_invalid; else mapEntry.entrytype = (TMapEntryType)mapid.ident; } PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "read map entry (type=%s): localid='%s', remoteid='%s', mapflags=0x%lX", MapEntryTypeNames[mapEntry.entrytype], mapEntry.localid.c_str(), mapEntry.remoteid.c_str(), (long)mapEntry.mapflags )); // save entry in list mapEntry.changed=false; // not yet changed mapEntry.added=false; // already there // remember saved state of suspend mark mapEntry.markforresume=false; // not yet marked for this session (mark of last session is in mapflag_useforresume!) mapEntry.savedmark=mapEntry.mapflags & mapflag_useforresume; // IMPORTANT: non-normal entries must be saved as deleted in the main map - they will be re-activated at the // next save if needed mapEntry.deleted = mapEntry.entrytype!=mapentry_normal; // only normal ones may be saved as existing in the main map // save to main map list anyway to allow differential updates to map table (instead of writing everything all the time) fMapTable.push_back(mapEntry); // now save special maps to extra lists according to type // Note: in the main map, these are marked deleted. Before the next saveAdminData, these will // be re-added (=re-activated) from the extra lists if they still exist. switch (mapEntry.entrytype) { #ifdef SYSYNC_SERVER case mapentry_tempidmap: if (IS_SERVER) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "fTempGUIDMap: restore mapping from %s to %s", mapEntry.remoteid.c_str(), mapEntry.localid.c_str() )); fTempGUIDMap[mapEntry.remoteid]=mapEntry.localid; // tempGUIDs are accessed by remoteID=tempID } break; #endif #ifdef SYSYNC_CLIENT case mapentry_pendingmap: if (IS_CLIENT) fPendingAddMaps[mapEntry.localid]=mapEntry.remoteid; break; #endif case mapentry_invalid: case mapentry_normal: case numMapEntryTypes: default: // nothing to do or should not occur break; } // next is not first entry any more firstEntry=false; } return LOCERR_OK; } // TPluginApiDS::apiLoadAdminData #endif // not BINFILE_ALWAYS_ACTIVE /// @brief log datastore sync result, called at end of sync with this datastore /// Available log information is: /// - fCurrentSyncTime : timestamp of start this sync session (anchor time) /// - fCurrentSyncCmpRef : timestamp used by next session to detect changes since this one /// (end of session time of last session that send data to remote) /// - fTargetKey : string, identifies target (user/device/datastore/remotedatastore)-tuple /// - fSessionP->fUserKey : string, identifies user /// - fSessionP->fDeviceKey : string, identifies device /// - fSessionP->fDomainName : string, identifies domain (aka clientID, aka enterpriseID) /// - getName() : string, local datastore's configured name (such as "contacts", "events" etc.) /// - getRemoteDBPath() : string, remote datastore's path (things like EriCalDB or "Z:\System\Contacts.cdb") /// - getRemoteViewOfLocalURI() : string, shows how remote specifies local datastore URI (including cgi, or /// in case of symbian "calendar", this can be different from getName(), as "calendar" /// is internally split-processed by "events" and "tasks". /// - fSessionP->getRemoteURI() : string, remote Device URI (usually IMEI or other globally unique ID) /// - fSessionP->getRemoteDescName() : string, remote Device's descriptive name (constructed from DevInf and , or /// as set by 's . /// - fSessionP->getRemoteInfoString() : string, Remote Device Version Info ("Type (HWV, FWV, SWV) Oem") /// - fSessionP->getSyncUserName() : string, User name as sent by the device /// - fSessionP->getLocalSessionID() : string, the local session ID (the one that is used to construct log file names) /// - fAbortStatusCode : TSyError, if == 0, sync with this datastore was ok, if <>0, there was an error. /// - fSessionP->getAbortReasonStatus() : TSyError, shows status of entire session at the point when datastore finishes syncing. /// - fSyncMode : TSyncModes, (smo_twoway,smo_fromserver,smo_fromclient) /// - isSlowSync() : boolean, true if slow sync (or refresh from sync, which is a one-way-slow-sync) /// - isFirstTimeSync() : boolean, true if first time sync of this device with this datastore /// - isResuming() : boolean, true if this is a resumed session /// - SyncMLVerDTDNames[fSessionP->getSyncMLVersion()] : SyncML version string ("1.0", "1.1". "1.2" ...) /// - fLocalItemsAdded : number of locally added Items /// - fRemoteItemsAdded : number of remotely added Items /// - fLocalItemsDeleted : number of locally deleted Items /// - fRemoteItemsDeleted : number of remotely deleted Items /// - fLocalItemsError : number of locally rejected Items (caused error to be sent to remote) /// - fRemoteItemsError : number of remotely rejected Items (returned error, will be resent) /// - fLocalItemsUpdated : number of locally updated Items /// - fRemoteItemsUpdated : number of remotely updated Items /// - fSlowSyncMatches : number of items matched in Slow Sync /// - fConflictsServerWins : number of server won conflicts /// - fConflictsClientWins : number of client won conflicts /// - fConflictsDuplicated : number of conflicts solved by duplicating item /// - fSessionP->getIncomingBytes() : total number of incoming bytes in this session so far /// - fSessionP->getOutgoingBytes() : total number of outgoing bytes in this session so far /// - fIncomingDataBytes : net incoming data bytes for this datastore (= payload data, without SyncML protocol overhead) /// - fOutgoingDataBytes : net outgoing data bytes for this datastore (= payload data, without SyncML protocol overhead) void TPluginApiDS::dsLogSyncResult(void) { // security - don't use API when locked if (dbAccessLocked()) return; // format for DB Api string logData,s; logData.erase(); logData+="lastsync:"; TimestampToISO8601Str(s,fCurrentSyncTime,TCTX_UTC); logData+=s.c_str(); logData+="\r\ntargetkey:"; StrToCStrAppend(fTargetKey.c_str(),logData,true); #ifndef BINFILE_ALWAYS_ACTIVE logData+="\r\nuserkey:"; StrToCStrAppend(fPluginAgentP->fUserKey.c_str(),logData,true); logData+="\r\ndevicekey:"; StrToCStrAppend(fPluginAgentP->fDeviceKey.c_str(),logData,true); #ifdef SCRIPT_SUPPORT logData+="\r\ndomain:"; StrToCStrAppend(fPluginAgentP->fDomainName.c_str(),logData,true); #endif #endif // BINFILE_ALWAYS_ACTIVE logData+="\r\ndsname:"; StrToCStrAppend(getName(),logData,true); #ifndef MINIMAL_CODE logData+="\r\ndsremotepath:"; StrToCStrAppend(getRemoteDBPath(),logData,true); #endif logData+="\r\ndslocalpath:"; StrToCStrAppend(getRemoteViewOfLocalURI(),logData,true); logData+="\r\nfolderkey:"; StrToCStrAppend(fFolderKey.c_str(),logData,true); logData+="\r\nremoteuri:"; StrToCStrAppend(fSessionP->getRemoteURI(),logData,true); logData+="\r\nremotedesc:"; StrToCStrAppend(fSessionP->getRemoteDescName(),logData,true); logData+="\r\nremoteinfo:"; StrToCStrAppend(fSessionP->getRemoteInfoString(),logData,true); logData+="\r\nremoteuser:"; StrToCStrAppend(fSessionP->getSyncUserName(),logData,true); logData+="\r\nsessionid:"; StrToCStrAppend(fSessionP->getLocalSessionID(),logData,true); logData+="\r\nsyncstatus:"; StringObjAppendPrintf(logData,"%hd",fAbortStatusCode); logData+="\r\nsessionstatus:"; StringObjAppendPrintf(logData,"%hd",fSessionP->getAbortReasonStatus()); logData+="\r\nsyncmlvers:"; StrToCStrAppend(SyncMLVerDTDNames[fSessionP->getSyncMLVersion()],logData,true); logData+="\r\nsyncmode:"; StringObjAppendPrintf(logData,"%hd",(uInt16)fSyncMode); logData+="\r\nsynctype:"; StringObjAppendPrintf(logData,"%d",(fSlowSync ? (fFirstTimeSync ? 2 : 1) : 0) + (isResuming() ? 10 : 0)); logData+="\r\nlocaladded:"; StringObjAppendPrintf(logData,"%ld",(long)fLocalItemsAdded); logData+="\r\ndeviceadded:"; StringObjAppendPrintf(logData,"%ld",(long)fRemoteItemsAdded); logData+="\r\nlocaldeleted:"; StringObjAppendPrintf(logData,"%ld",(long)fLocalItemsDeleted); logData+="\r\ndevicedeleted:"; StringObjAppendPrintf(logData,"%ld",(long)fRemoteItemsDeleted); logData+="\r\nlocalrejected:"; StringObjAppendPrintf(logData,"%ld",(long)fLocalItemsError); logData+="\r\ndevicerejected:"; StringObjAppendPrintf(logData,"%ld",(long)fRemoteItemsError); logData+="\r\nlocalupdated:"; StringObjAppendPrintf(logData,"%ld",(long)fLocalItemsUpdated); logData+="\r\ndeviceupdated:"; StringObjAppendPrintf(logData,"%ld",(long)fRemoteItemsUpdated); #ifdef SYSYNC_SERVER if (IS_SERVER) { logData+="\r\nslowsyncmatches:"; StringObjAppendPrintf(logData,"%ld",(long)fSlowSyncMatches); logData+="\r\nserverwins:"; StringObjAppendPrintf(logData,"%ld",(long)fConflictsServerWins); logData+="\r\nclientwins:"; StringObjAppendPrintf(logData,"%ld",(long)fConflictsClientWins); logData+="\r\nduplicated:"; StringObjAppendPrintf(logData,"%ld",(long)fConflictsDuplicated); } // server #endif // SYSYNC_SERVER logData+="\r\nsessionbytesin:"; StringObjAppendPrintf(logData,"%ld",(long)fSessionP->getIncomingBytes()); logData+="\r\nsessionbytesout:"; StringObjAppendPrintf(logData,"%ld",(long)fSessionP->getOutgoingBytes()); logData+="\r\ndatabytesin:"; StringObjAppendPrintf(logData,"%ld",(long)fIncomingDataBytes); logData+="\r\ndatabytesout:"; StringObjAppendPrintf(logData,"%ld",(long)fOutgoingDataBytes); logData+="\r\n"; if (fDBApi_Admin.Created()) { fDBApi_Admin.WriteLogData(logData.c_str()); if (fPluginDSConfigP->fDBAPIModule_Data != fPluginDSConfigP->fDBAPIModule_Admin) { // admin and data are different modules, show log to data module as well if (fDBApi_Data.Created()) fDBApi_Data.WriteLogData(logData.c_str()); } } else if (fDBApi_Data.Created()) { fDBApi_Data.WriteLogData(logData.c_str()); } // anyway: let ancestor save log info as well (if it is configured so) inherited::dsLogSyncResult(); } // TPluginApiDS::dsLogSyncResult #ifdef STREAMFIELD_SUPPORT // TApiBlobProxy // ============= TApiBlobProxy::TApiBlobProxy( TPluginApiDS *aApiDsP, bool aIsStringBLOB, const char *aBlobID, const char *aParentID ) { // save values fApiDsP = aApiDsP; fIsStringBLOB = aIsStringBLOB; fBlobID = aBlobID; fParentObjectID = aParentID; fBlobSize = 0; fBlobSizeKnown = false; fFetchedSize = 0; fBufferSize = 0; fBlobBuffer = NULL; // nothing retrieved yet } // TApiBlobProxy::TApiBlobProxy TApiBlobProxy::~TApiBlobProxy() { if (fBlobBuffer) delete [] (char *)fBlobBuffer; // gcc 3.2.2 needs cast to suppress warning fBlobBuffer=NULL; } // TApiBlobProxy::~TApiBlobProxy // fetch BLOB from DPAPI void TApiBlobProxy::fetchBlob(size_t aNeededSize, bool aNeedsTotalSize, bool aNeedsAllData) { TSyError dberr=LOCERR_OK; if (fBufferSize==0 || aNeededSize>fFetchedSize) { // if do not have anything yet or not enough yet, we need to read uInt8P bufP = NULL; bool last = false; bool first = fFetchedSize==0; // first if we haven't fetched anything so far TDB_Api_Blk blobData; memSize neededBytes = aNeededSize-fFetchedSize; // how much we need to read more memSize totalsize = 0; // not known if (fIsStringBLOB) aNeedsAllData = true; // strings must be fetched entirely, as they need to be converted before we can measure size or get data if (!fBlobBuffer && aNeededSize==0 && (aNeedsTotalSize || aNeedsAllData)) neededBytes=200; // just read a bit to possibly obtain the total size do { // read a block dberr = fApiDsP->fDBApi_Data.ReadBlob( fParentObjectID.c_str(), // the item ID fBlobID.c_str(), // the ID of the blob neededBytes, // how much we need blobData, // blob data totalsize, // will receive total size or 0 if unknown first, last ); if (dberr!=LOCERR_OK) SYSYNC_THROW(TSyncException("ReadBlob fatal error",dberr)); // sanity check if (blobData.fSize>neededBytes) SYSYNC_THROW(TSyncException("ReadBlob returned more data than requested")); // check if we know the total size reliably now if (totalsize) { // non-zero return means we know the total size now fBlobSize = totalsize; fBlobSizeKnown = true; } else { // could be unknown size OR zero blob if (neededBytes>0 && blobData.fSize==0) { // we tried to read, but got nothing, and total size is zero -> this means explicit zero size fBlobSize = 0; fBlobSizeKnown = true; } } // calculate how large the buffer needs to be size_t newBufSiz = (aNeededSize ? aNeededSize : fFetchedSize+blobData.fSize) + 1; // +1 for string terminator possibly needed if (fBufferSize will be set back to 0 here !! // check end of data from API if (last) { if (!fBlobSizeKnown) { fBlobSize = fFetchedSize; fBlobSizeKnown = true; } // end of BLOB: done fetching ANYWAY break; } // the BLOB is bigger than what we have fetched so far // - check if we are done even if not at end of blob if (!aNeedsAllData && fFetchedSize>=aNeededSize && (!aNeedsTotalSize || fBlobSizeKnown)) break; // we have what was requested // - we need to load more data if (aNeedsAllData) { if (fBlobSizeKnown) neededBytes = fBlobSize-fFetchedSize; // try to get rest in one chunk else neededBytes = 4096; // we don't know how much is coming, continue reading in 4k chunks } // we need to continue until we get the total size or last first=false; } while(true); // for strings, we need to convert the data and re-adjust the size if (fIsStringBLOB) { // we KNOW that we have the entire BLOB text here (because we set aNeedsAllData above when this is a string BLOB) // - set a terminator *((char *)fBlobBuffer+fFetchedSize) = 0; // set terminator // - convert to UTF8 and internal linefeeds string strUtf8; appendStringAsUTF8((const char *)fBlobBuffer, strUtf8, fApiDsP->fPluginDSConfigP->fDataCharSet, lem_cstr); // set actual size fBlobSize=strUtf8.size(); // copy from string to buffer if (fBlobSize+1<=fBufferSize) { bufP = fBlobBuffer; // use old buffer } else { fBufferSize=fBlobSize+1; bufP = new unsigned char [fBufferSize]; delete [] (unsigned char *)fBlobBuffer; fBlobBuffer = bufP; } memcpy(bufP,strUtf8.c_str(),strUtf8.size()); fFetchedSize=strUtf8.size(); *((char *)fBlobBuffer+fFetchedSize)=0; // set terminator } // if } } // TApiBlobProxy::fetchBlob // returns size of entire blob size_t TApiBlobProxy::getBlobSize(TStringField *aFieldP) { fetchBlob(0,true,false); // only needs the size, but no data return fBlobSize; } // TApiBlobProxy::getBlobSize // read from Blob from specified stream position and update stream pos size_t TApiBlobProxy::readBlobStream(TStringField *aFieldP, size_t &aPos, void *aBuffer, size_t aMaxBytes) { if (fFetchedSize fetch more fetchBlob(aPos+aMaxBytes,false,false); // fetch at least up to the given size (unless blob is actually smaller) } } // now copy from our buffer if (aPos>fFetchedSize) return 0; // position obviously out of range if (aPos+aMaxBytes>fFetchedSize) aMaxBytes=fFetchedSize-aPos; // reduce to what we have if (aMaxBytes==0) return 0; // safety // copy data from fBlobBuffer (which contains beginning or all of the BLOB) to caller's buffer memcpy(aBuffer,(char *)fBlobBuffer+aPos,aMaxBytes); aPos += aMaxBytes; return aMaxBytes; // return number of bytes actually read } // TApiBlobProxy::readBlobStream #endif // STREAMFIELD_SUPPORT } // namespace sysync /* end of TPluginApiDS implementation */ // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/pluginapids.h0000755000373300037200000004503312424517753027723 0ustar00nightlyallusers00000000000000/** * @File pluginapids.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TPluginApiDS * Plugin based datastore API implementation * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-10-06 : luz : created from apidbdatastore */ #ifndef PLUGINAPIDS_H #define PLUGINAPIDS_H // includes #ifdef SQL_SUPPORT #include "odbcapids.h" #undef SDK_ONLY_SUPPORT #else #include "customimplds.h" #define SDK_ONLY_SUPPORT 1 #endif #include "dbapi.h" #include "pluginapiagent.h" using namespace sysync; namespace sysync { // single field mapping class TApiFieldMapItem: #ifdef SDK_ONLY_SUPPORT public TFieldMapItem #else public TODBCFieldMapItem #endif { #ifdef SDK_ONLY_SUPPORT typedef TFieldMapItem inherited; #else typedef TODBCFieldMapItem inherited; #endif public: TApiFieldMapItem(const char *aElementName, TConfigElement *aParentElement); // - parser for extra attributes (for derived classes) virtual void checkAttrs(const char **aAttributes); // properties }; // TApiFieldMapItem #ifdef ARRAYDBTABLES_SUPPORT // array mapping class TApiFieldMapArrayItem: #ifdef SDK_ONLY_SUPPORT public TFieldMapArrayItem #else public TODBCFieldMapArrayItem #endif { #ifdef SDK_ONLY_SUPPORT typedef TFieldMapArrayItem inherited; #else typedef TODBCFieldMapArrayItem inherited; #endif public: TApiFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement); // - parser for extra attributes (for derived classes) virtual void checkAttrs(const char **aAttributes); // properties }; // TApiFieldMapArrayItem #endif class TPluginDSConfig: #ifdef SDK_ONLY_SUPPORT public TCustomDSConfig #else public TOdbcDSConfig #endif { #ifdef SDK_ONLY_SUPPORT typedef TCustomDSConfig inherited; #else typedef TOdbcDSConfig inherited; #endif public: TPluginDSConfig(const char* aName, TConfigElement *aParentElement); virtual ~TPluginDSConfig(); // properties /// name of the DB API modules /// @{ string fDBAPIModule_Data; ///< name of the module which handles data - if fDataModuleAlsoHandlesAdmin is set this is used for admin as well string fDBAPIModule_Admin; ///< name of the module which handles admin /// @} /// flag to handle admin in same API module as data /// @Note this is only needed for old-style configs where we had only ONE module /// per datastore for both admin and data. Now the normal way is to configure /// either fDBAPIModule_Data or fDBAPIModule_Admin to select plugin handling of /// either data or admin independently. bool fDataModuleAlsoHandlesAdmin; // wants startDataRead() called as early as possible bool fEarlyStartDataRead; // - config object for API module TDB_Api_Config fDBApiConfig_Data; TDB_Api_Config fDBApiConfig_Admin; // - generic module params TApiParamConfig fPluginParams_Admin; TApiParamConfig fPluginParams_Data; // - debug flags uInt16 fPluginDbgMask_Data; uInt16 fPluginDbgMask_Admin; // capabilities of connected plugin bool fItemAsKey; // supports items as key bool fResumeSupported; // extends version check in dsResumeSupportedInDB(), not supported if false bool fHasDeleteSyncSet; // implements deleting sync set using DeleteSyncSet() // public methods // - create appropriate datastore from config, calls addTypeSupport as well virtual TLocalEngineDS *newLocalDataStore(TSyncSession *aSessionP); // factory functions for field map items virtual TFieldMapItem *newFieldMapItem(const char *aElementName, TConfigElement *aParentElement) { return new TApiFieldMapItem(aElementName,aParentElement); }; #ifdef ARRAYDBTABLES_SUPPORT virtual TFieldMapArrayItem *newFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement) { return new TApiFieldMapArrayItem(aCustomDSConfigP,aParentElement); }; #endif protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void clear(); virtual void localResolve(bool aLastPass); private: }; // TPluginDSConfig // forward class TPluginAgentConfig; class TPluginApiAgent; #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) class TDBItemKey; #endif // DBAPI_ASKEYITEMS + ENGINEINTERFACE_SUPPORT class TPluginApiDS: #ifdef SDK_ONLY_SUPPORT public TCustomImplDS #else public TODBCApiDS #endif { #ifdef SDK_ONLY_SUPPORT typedef TCustomImplDS inherited; #else typedef TODBCApiDS inherited; #endif friend class TApiBlobProxy; private: void InternalResetDataStore(void); // reset for re-use without re-creation public: TPluginApiDS( TPluginDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual void announceAgentDestruction(void); virtual void dsResetDataStore(void) { InternalResetDataStore(); inherited::dsResetDataStore(); }; virtual ~TPluginApiDS(); // override TSyncDataStore: the plugin must be able to return 404 // when an item is not found during delete virtual bool dsDeleteDetectsItemPresence() const { return true; } #ifndef BINFILE_ALWAYS_ACTIVE /// @name apiXXXX methods defining the interface from TCustomImplDS to TXXXApi actual API implementations /// @{ // /// @brief Load admin data from ODBC database /// @param aDeviceID[in] remote device URI (device ID) /// @param aDatabaseID[in] local database ID /// @param aRemoteDBID[in] database ID of remote device /// Must search for existing target record matching the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// - if there is a matching record: load it /// - if there is no matching record, set fFirstTimeSync=true. The implementation may already create a /// new record with the key (aDeviceID,aDatabaseID,aRemoteDBID) and initialize it with the data from /// the items as shown below. At least, fTargetKey must be set to a value that will allow apiSaveAdminData to /// update the record. In case implementation chooses not create the record only in apiSaveAdminData, it must /// buffer the triple (aDeviceID,aDatabaseID,aRemoteDBID) such that it is available at apiSaveAdminData. /// If a record exists implementation must load the following items: /// - fTargetKey = some key value that can be used to re-identify the target record later at SaveAdminData. /// If the database implementation has other means to re-identify the target, this can be /// left unassigned. /// - fLastRemoteAnchor = anchor string used by remote party for last session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of last session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT). Needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must load all map entries /// related to the current sync target identified by the triple of (aDeviceID,aDatabaseID,aRemoteDBID) /// or by fTargetKey. The entries added to fMapTable must have "changed", "added" and "deleted" flags /// set to false. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps = map. The implementation must load all all pending maps (client only) into /// fPendingAddMaps (and fUnconfirmedMaps must be left empty). /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) virtual localstatus apiLoadAdminData( const char *aDeviceID, // remote device URI (device ID) const char *aDatabaseID, // database ID const char *aRemoteDBID // database ID of remote device ); /// @brief Save admin data to ODBC database /// @param[in] aSessionFinished if true, this is a end-of-session save (and not only a suspend save) - but not necessarily a successful one /// @param[in] aSuccessful if true, this is a successful end-of-session /// Must save to the target record addressed at LoadAdminData() by the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// Implementation must save the following items: /// - fLastRemoteAnchor = anchor string used by remote party for this session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of this session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT). Needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must save all map entries /// that have changed, are new or are deleted. See below for additional resume requirements. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps and fUnconfirmedMaps = map. The implementation must save all entries as /// pending maps (client only). Note that fPendingAddMaps might contain temporary localIDs, /// so call dsFinalizeLocalID() to ensure these are converted to final before saving. /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) virtual localstatus apiSaveAdminData(bool aSessionFinished, bool aSuccessful); /// read sync set IDs and mod dates. /// @param[in] if set, all data fields are needed, so ReadSyncSet MAY /// read items here already. Note that ReadSyncSet MAY read items here /// even if aNeedAll is not set (if it is more efficient than reading /// them separately afterwards). #endif // not BINFILE_ALWAYS_ACTIVE /// perform early data access start (if datastore requests it by setting fEarlyStartDataRead config flag) virtual localstatus apiEarlyDataAccessStart(void); /// read the sync set virtual localstatus apiReadSyncSet(bool aNeedAll); /// Zap all data in syncset (note that everything outside the sync set will remain intact) virtual localstatus apiZapSyncSet(void); virtual bool apiNeedSyncSetToZap(void); /// fetch record contents from DB by localID. virtual localstatus apiFetchItem(TMultiFieldItem &aItem, bool aReadPhase, TSyncSetItem *aSyncSetItemP); /// add new item to datastore, returns created localID virtual localstatus apiAddItem(TMultiFieldItem &aItem, string &aLocalID); /// update existing item in datastore, returns 404 if item not found virtual localstatus apiUpdateItem(TMultiFieldItem &aItem); /// delete existing item in datastore, returns 211 if not existing any more virtual localstatus apiDeleteItem(TMultiFieldItem &aItem); /// end of syncset read virtual localstatus apiEndDataRead(void) { return LOCERR_OK; /* NOP at this time */ }; /// start of write virtual localstatus apiStartDataWrite(void); /// end DB data write sequence (but not yet admin data) virtual localstatus apiEndDataWrite(string &aThisSyncIdentifier); /// @} /// @name dsXXXX virtuals defined by TLocalEngineDS /// These are usually designed such that they should always call inherited::dsXXX to let the entire chain /// of ancestors see the calls /// @{ // /// end of message handling // virtual void dsEndOfMessage(void); #ifdef OBJECT_FILTERING /// test expression filtering capability of datastore /// @return true if DB implementation can filter the standard filters /// (LocalDBFilter, TargetFilter and InvisibleFilter) during database fetch /// otherwise, fetched items will be filtered after being read from DB. virtual bool dsFilteredFetchesFromDB(bool aFilterChanged=false); /// test special option filtering capability of datastore /// @return true if DB implementation can also apply special filters like CGI-options /// /dr(x,y) etc. during fetching virtual bool dsOptionFilterFetchesFromDB(void); #endif /// alert possible thread change virtual void dsThreadMayChangeNow(void); /// returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps, tempGUIDs) virtual bool dsResumeSupportedInDB(void); #ifdef SYSYNC_CLIENT /// finalize local ID (for datastores that can't efficiently produce these at insert) virtual bool dsFinalizeLocalID(string &aLocalID); #endif /// @} // - must be called before starting a thread. If returns false, starting a thread now // is not allowed and must be postponed. virtual bool startingThread(void); // - must be called when a thread's activity has ended // BUT THE CALL MUST BE FROM THE ENDING THREAD, not the main thread! virtual void endingThread(void); // - should be called before doing DB accesses that might be locked (e.g. because another thread is using the DB resources) virtual bool dbAccessLocked(void); // - log datastore sync result, Called at end of sync with this datastore virtual void dsLogSyncResult(void); private: // - connect data handling part of plugin. Returns LOCERR_NOTIMPL when no data plugin is selected TSyError connectDataPlugin(void); // - prepare for reading syncset (is called early when fEarlyStartDataRead is set, otherwise from within apiReadSyncSet) localstatus apiPrepareReadSyncSet(void); // - alert possible thread change to plugins // Does not check if API is locked or not, see dsThreadMayChangeNow() void ThreadMayChangeNow(void); #ifdef DBAPI_TEXTITEMS // Text item handling // - store itemdata field into mapped TItemField virtual bool storeField( cAppCharP aName, cAppCharP aParams, cAppCharP aValue, TMultiFieldItem &aItem, uInt16 aSetNo, sInt16 aArrayIndex ); // - parse itemdata into item using DB mappings bool parseDBItemData( TMultiFieldItem &aItem, cAppCharP aItemData, uInt16 aSetNo ); // - create itemdata from mapped fields bool generateDBItemData( bool aAssignedOnly, TMultiFieldItem &aItem, uInt16 aSetNo, string &aDataFields ); #endif // - post process item after reading from DB (run script) bool postReadProcessItem(TMultiFieldItem &aItem, uInt16 aSetNo); // - pre-process item before writing to DB (run script) bool preWriteProcessItem(TMultiFieldItem &aItem); // - send BLOBs of this item one by one bool writeBlobs( bool aAssignedOnly, TMultiFieldItem &aItem, uInt16 aSetNo ); // - delete BLOBs of this item one by one bool deleteBlobs( bool aAssignedOnly, TMultiFieldItem &aItem, uInt16 aSetNo ); private: // agent (typed pointers for convenience) TPluginApiAgent *fPluginAgentP; // config (typed pointers for convenience) TPluginAgentConfig *fPluginAgentConfigP; // the actual API access instances TDB_Api fDBApi_Data; ///< access to data TDB_Api fDBApi_Admin; ///< access to admin // config pointer TPluginDSConfig *fPluginDSConfigP; // filter testing bool fAPICanFilter; bool fAPIFiltersTested; }; // TPluginApiDS #ifdef STREAMFIELD_SUPPORT // proxy for loading blobs class TApiBlobProxy : public TBlobProxy, noncopyable { typedef TBlobProxy inherited; public: TApiBlobProxy(TPluginApiDS *aApiDsP, bool aIsStringBLOB, const char *aBlobID, const char *aParentID); virtual ~TApiBlobProxy(); // - returns size of entire blob virtual size_t getBlobSize(TStringField *aFieldP); // - read from Blob from specified stream position and update stream pos virtual size_t readBlobStream(TStringField *aFieldP, size_t &aPos, void *aBuffer, size_t aMaxBytes); // - dependency on a local ID virtual void setParentLocalID(const char *aParentLocalID) { fParentObjectID=aParentLocalID; }; private: // fetch BLOB from DPAPI void fetchBlob(size_t aNeededSize, bool aNeedsTotalSize, bool aNeedsAllData); // Vars TPluginApiDS *fApiDsP; // datastore which can be asked to retrieve data bool fIsStringBLOB; // if set, the blob must be treated as a string (applying DB charset conversions) string fBlobID; // object ID of blob string fParentObjectID; // id of parent object (will be updated in case parent signals ID change) size_t fBlobSize; // total size of the BLOB bool fBlobSizeKnown; // set if fBlobSize is valid (can also be 0 for KNOWN empty blob) size_t fFetchedSize; // how much we have already retrieved (and is in fBlobBuffer) size_t fBufferSize; // how much room we have in the buffer uInt8P fBlobBuffer; // buffer for blob already retrieved (NULL if nothing yet) }; // TApiBlobProxy #endif } // namespace sysync #endif // PLUGINAPIDS_H // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/plugindb.h0000755000373300037200000000046512424517753027210 0ustar00nightlyallusers00000000000000/* * Common include file for all Plugin DB sources */ #ifndef PLUGINDB_H #define PLUGINDB_H // precompiled portion #include "plugindb_precomp.h" // other common includes #include "sysync.h" // Items used by ODBC DB interface #include "multifielditem.h" #include "mimediritemtype.h" #endif /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/plugindb_precomp.h0000755000373300037200000000032612424517753030731 0ustar00nightlyallusers00000000000000/* * precompiled/precompilable headers */ #ifndef PLUGINDB_PRECOMP_H #define PLUGINDB_PRECOMP_H /* Specific headers for Plugin DB interface */ #ifdef _WIN32 #include #endif #endif /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/sync_dbapiconnect.cpp0000755000373300037200000004457112424517753031432 0ustar00nightlyallusers00000000000000/* * File: sync_dbapiconnect.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * C/C++ Programming interface between * the Synthesis SyncML engine * and the database layer * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * * This module contains the method table and connection * routines, which are used e.g. for the JNI plugin. * */ #include "sync_include.h" #include "sync_dbapidef.h" #include "sync_dbapiconnect.h" #include "DLL_interface.h" #ifdef __cplusplus namespace sysync { #endif // Support functions for creating Java signatures string LCP( string jP, string className ) { if (jP.empty()) jP = className; else jP+= '/' + className; return "L" + jP + ";"; } // LCP string JCS ( void ) { return LCP( "java/lang", "String" ); } static string Sgn ( string s, string ret ){ return "(" + s + ")" + ret; } string SgnS ( string s ) { return Sgn( s, "S" ); } string SgnI ( string s ) { return Sgn( s, "I" ); } string SgnV ( string s ) { return Sgn( s, "V" ); } class JSgn { public: JSgn() { f64bit= false; } bool f64bit; string fvr; string fr; string SgnS_V( string s= "" ) { return Sgn( fvr + s,"S" ); } string SgnS_X( string s= "" ) { return Sgn( fr + s,"S" ); } string SgnI_X( string s= "" ) { return Sgn( fr + s,"I" ); } string SgnZ_X( string s= "" ) { return Sgn( fr + s,"Z" ); } string SgnV_X( string s= "" ) { return Sgn( fr + s,"V" ); } }; // JSgn /*! connect the list of these functions, including JNI signatures, if required */ TSyError DBApi_DLLAssign( appPointer aMod, appPointer aField, memSize aFieldSize, string aKey, bool a64bit, string jP ) { bool keyCur, keyOld, keyOld2; string js1, js2, js3, js4, js5; string jt = JCS(); string jvt= LCP( jP, c_VAR_String ); string jvl= LCP( jP, c_VAR_long ); string jvi= LCP( jP, c_VAR_int ); string jdc= LCP( jP, c_JNI_DB_Callback ); string jmi= LCP( jP, c_JNI_MapID ); string jii= LCP( jP, c_JNI_ItemID ); JSgn j; j.f64bit= a64bit; if (j.f64bit) { j.fvr= jvl; j.fr= "J"; } else { j.fvr= jvi; j.fr= "I"; } string js_ = j.SgnS_X(); // "(I)S" string jsT = j.SgnS_X( jt ); // "(ILjava/lang/String;)S" string jsvT= j.SgnS_X( jvt ); // "(ILVAR_String;)S" string jsA = j.SgnS_X( jvt + jvt + jvt + "I" ); // "(ILVAR_String;LVAR_String;LVAR_String;I)S" // ----------------------------------------------------------------------------------------- if (strcmp( aKey.c_str(),Plugin_Start )==0) { // "(LVAR_xxx; ... (VAR_xxx = VAR_int/VAR_long) js1= j.SgnS_V( jt // ... Ljava/lang/String; ... + jt // ... Ljava/lang/String; ... + jt // ... Ljava/lang/String; ... + jdc ); // ... LDB_Callback;)S" js2= j.SgnI_X(); return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- start of plugin connection Mo_CC, js1.c_str(), Mo_Ve, js2.c_str(), Mo_Ca,jsvT.c_str(), NULL ); } // if /* // compatibility to older version ( w/o ) keyOld= strcmp( aKey.c_str(),Plugin_Param_OLD )==0; keyCur= strcmp( aKey.c_str(),Plugin_Param )==0; if (keyCur || keyOld) { // additional param for newer version if (keyCur) js1= j.SgnS_X( jt + "I" ); // "(ILjava/lang/String;I)S" else js1= jsT; // "(ILjava/lang/String;)S" */ if (strcmp( aKey.c_str(),Plugin_Param )==0) { // additional param for newer version js1= j.SgnS_X( jt + "I" ); // "(ILjava/lang/String;I)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- start of plugin connection Mo_PP, js1.c_str(), NULL ); } // if // ---- session --------------------------------------------------- if (strcmp( aKey.c_str(),Plugin_Session )==0) { // "(LVAR_xxx; ... (VAR_xxx = VAR_int/VAR_long) js1= j.SgnS_V( jt // ... Ljava/lang/String; ... + jdc ); // ... LDB_Callback;)S" js2= j.SgnV_X(); js3= j.SgnV_X( "Z" + jt ); return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- session ---- Se_CC, js1.c_str(), "", "", /*-----* adaptitem */ "", "", /*-----* session auth */ "", "", /* */ "", "", /*-----*/ "", "", /*-----* device admin */ "", "", /* */ "", "", /* */ "", "", /*-----*/ "", "", /*-----* dbtime */ Se_DO, "", /*~~~~~*/ Se_TC, js2.c_str(), Se_DI, js3.c_str(), Se_DC, js_.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_SE_Adapt )==0) { return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- device admin (GetDBTime) ---- "Session_AdaptItem", jsA.c_str(), NULL ); } // if // The correct signature with VAR_String can be used now keyOld= strcmp( aKey.c_str(),Plugin_SE_Auth_OLD )==0; keyCur= strcmp( aKey.c_str(),Plugin_SE_Auth )==0; if (keyCur || keyOld) { js1= j.SgnI_X(); if (keyCur) js2= j.SgnS_X( jt // "(ILjava/lang/String; ... + jvt // ... LVAR_String; ... + jvt ); // ... LVAR_String;)S" if (keyOld) js2= j.SgnS_X( jt // "(ILjava/lang/String; ... + jt // ... Ljava/lang/String; ... + jvt ); // ... LVAR_String;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- session auth ---- Se_PM, js1.c_str(), Se_LI, js2.c_str(), Se_LO, js_.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DV_Admin )==0) { js1= j.SgnS_X( jt + jvt + jvt ); // "(ILjava/lang/String;LVAR_String;LVAR_String;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- device admin ---- Se_CD, js1.c_str(), Se_GN,jsvT.c_str(), Se_SN, jsT.c_str(), Se_SD, jsT.c_str(), // the same NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DV_DBTime )==0) { return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- device admin (GetDBTime) ---- Se_GT, jsvT.c_str(), NULL ); } // if // ---- datastore ------------------------------------------------- if (strcmp( aKey.c_str(),Plugin_DS_General )==0) { js1= j.SgnI_X( jt ); js2= j.SgnV_X( ); js3= j.SgnV_X( jt ); js4= j.SgnV_X( "Z" + jt ); return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- datastore general ---- Da_CS, js1.c_str(), Da_FS, js1.c_str(), Da_TC, js2.c_str(), Da_WL, js3.c_str(), Da_DI, js4.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DS_Admin_Str )==0) { js1= j.SgnS_X( jt + jt + jvt ); // "(ILjava/lang/String;Ljava/lang/String;LVAR_String;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- datastore admin asStr ---- Da_LA, js1.c_str(), Da_SA, jsT.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DS_Admin_Key )==0) { js1= j.SgnS_X( jt + jt + j.fr ); // "(ILjava/lang/String;Ljava/lang/String;I)S" js2= j.SgnS_X ( j.fr ); // "(II)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- datastore admin asKey ---- Da_LAK, js1.c_str(), Da_SAK, js2.c_str(), NULL ); } // if // "InsertMapItem" can be used now keyOld= strcmp( aKey.c_str(),Plugin_DS_Admin_OLD )==0; keyCur= strcmp( aKey.c_str(),Plugin_DS_Admin_Map )==0; if (keyCur || keyOld) { cAppCharP proc_insM= ""; if (keyCur) proc_insM= Da_IM; js1= j.SgnZ_X( jmi + "Z" ); // "(ILMapID;Z)Z" js2= j.SgnS_X( jmi ); // "(ILMapID;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- datastore admin ---- Da_RM, js1.c_str(), proc_insM, js2.c_str(), Da_UM, js2.c_str(), // 2nd Da_DM, js2.c_str(), // 3rd NULL ); } // if // "DeleteBlob" can be used now keyOld = strcmp( aKey.c_str(),Plugin_DS_Data_OLD1 )==0; keyOld2= strcmp( aKey.c_str(),Plugin_DS_Data_OLD2 )==0; keyCur = strcmp( aKey.c_str(),Plugin_DS_Data )==0; if (keyCur || keyOld || keyOld2) { if (keyOld) js1= jsT; // "(ILjava/lang/String;)S" else js1= j.SgnS_X( jt + jt ); // "(ILjava/lang/String;Ljava/lang/String;)S" cAppCharP proc_fli= ""; if (keyCur) proc_fli= Da_FLI; cAppCharP proc_dss= ""; if (keyCur) proc_dss= Da_DSS; js2= j.SgnS_X( "Z" + jvt ); // "(IZLVAR_String;)S" js3= j.SgnS_X( jii + jii ); // "(ILItemID;LItemID;)S" js4= j.SgnS_X( jii + jt ); // "(ILItemID;Ljava/lang/String;)S" js5= j.SgnS_X( jii ); // "(ILItemID;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- datastore data ---- Da_SR, js1.c_str(), // read Da_ER, js_.c_str(), Da_SW, js_.c_str(), // write Da_EW, js2.c_str(), /*-----*/ "", "", /* */ "", "", /* str */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* key */ "", "", /* */ "", "", /* */ /*-----*/ proc_fli, js3.c_str(), // independent Da_MvI, js4.c_str(), Da_DeI, js5.c_str(), proc_dss, js_.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DS_Data_Str )==0) { js1= j.SgnS_X( jii + jvt + jvi + "Z" ); // "(ILItemID;LVAR_String;LVAR_int;Z)S" js2= j.SgnS_X( jii + jvt ); // "(ILItemID;LVAR_String;)S" js3= j.SgnS_X( jt + jii ); // "(ILjava/lang/String;LItemID;)S" js4= j.SgnS_X( jt + jii + jii ); // "(ILjava/lang/String;LItemID;LItemID;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- aItemData routines ---- Da_RN, js1.c_str(), Da_RI, js2.c_str(), Da_II, js3.c_str(), Da_UI, js4.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DS_Data_Key )==0) { js1= j.SgnS_X( jii + j.fr + jvi + "Z" ); // "(ILItemID;ILVAR_int;Z)S" js2= j.SgnS_X( jii + j.fr ); // "(ILItemID;I)S" js3= j.SgnS_X( j.fr + jii ); // "(IILItemID;)S" js4= j.SgnS_X( j.fr + jii + jii ); // "(IILItemID;LItemID;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- aItemKey routines ---- Da_RNK, js1.c_str(), Da_RIK, js2.c_str(), Da_IIK, js3.c_str(), Da_UIK, js4.c_str(), NULL ); } // if keyOld = strcmp( aKey.c_str(),Plugin_DS_Blob_OLD1 )==0; keyOld2= strcmp( aKey.c_str(),Plugin_DS_Blob_OLD2 )==0; keyCur = strcmp( aKey.c_str(),Plugin_DS_Blob )==0; if (keyCur || keyOld || keyOld2) { cAppCharP proc_delB= ""; if (keyCur) proc_delB= Da_DB; string bvsz= j.fvr; string bsz= j.fr; if (!keyCur) { bvsz= jvi; bsz= "I"; } js1 = j.SgnS_X( jii // "(ILItemID;Ljava/lang/String;LVAR_byteArray; ... + jt // ... LVAR_int;LVAR_int;ZLVAR_boolean;)S" + LCP( jP, c_VAR_byteArray ) + bvsz + bvsz + "Z" + LCP( jP, c_VAR_bool ) ); js2 = j.SgnS_X( jii + jt + "[B" + bsz + bsz + "ZZ" ); // "(ILItemID;Ljava/lang/String;[BIIZZ)S" js3 = j.SgnS_X( jii + jt ); // "(ILItemID;Ljava/lang/String;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- datastore data ---- Da_RB, js1.c_str(), Da_WB, js2.c_str(), proc_delB, js3.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_DS_Adapt )==0) { return ConnectFunctions( aMod, aField,aFieldSize, true, "AdaptItem", jsA.c_str(), NULL ); } // if if (strcmp( aKey.c_str(),Plugin_Datastore )==0) { // "(LVAR_xxx; ... (VAR_xxx = VAR_int/VAR_long) js1= j.SgnS_V( jt // ... Ljava/lang/String; ... + jdc // ... LDB_Callback; ... + jt // ... Ljava/lang/String; ... + jt ); // ... Ljava/lang/String;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, Da_CC, js1.c_str(), "", "", /*-----* general */ "", "", /* */ "", "", /* */ "", "", /* */ "", "", /*-----*/ /*-----* admin */ "", "", /* str */ "", "", /* */ /*-----*/ "", "", /* key */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* map */ "", "", /* */ "", "", /* */ /*-----*/ /*-----* data read/write */ "", "", /* rd */ "", "", /* */ /*-----*/ "", "", /* wr */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* str */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* key */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* ind */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /*-----* blobs */ "", "", /* */ "", "", /*-----*/ "", "", /*-----* adaptitem */ Da_DO, "", /*~~~~~*/ // general Da_DC, js_.c_str(), // close NULL ); } // if // ---- ui context ------------------------------------------------ if (strcmp( aKey.c_str(),Plugin_UI )==0) { // "(LVAR_xxx; ... (VAR_xxx = VAR_int/VAR_long) js1= j.SgnS_V( jt // ... Ljava/lang/String; ... + jdc ); // ... LDB_Callback;)S" return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- ui context ---- "UI_CreateContext", js1.c_str(), "UI_RunContext", js_.c_str(), "UI_DeleteContext", js_.c_str(), NULL ); } // if // default settings if (strcmp( aKey.c_str(),"" )==0) { return ConnectFunctions( aMod, aField,aFieldSize, true, // ---- module -------------------------------------------------- "", "", /*-----* start */ "", "", /* */ "", "", /*-----*/ "", "", /*-----* plugin params */ Mo_DO, "", /*~~~~~*/ Mo_DC, js_.c_str(), // ---- session ------------------------------------------------- "", "", /*+*/ "", "", /*-*---* adaptitem */ /* */ "", "", /*-*---* session auth */ "", "", /* */ "", "", /*-*---*/ /* */ "", "", /*-*---* device admin */ "", "", /* */ "", "", /* */ "", "", /* */ "", "", /*-*---*(dbtime) */ /* */ "", "", /*+*/ "", "", /*+*/ "", "", /*+*/ "", "", /*+*/ // ---- datastore ----------------------------------------------- "", "", /*-* open */ "", "", /*-----* general */ "", "", /* */ "", "", /* */ "", "", /* */ "", "", /*-----*/ /*-----* admin */ "", "", /* str */ "", "", /* */ /*-----*/ "", "", /* key */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* map */ "", "", /* */ "", "", /* */ /*-----*/ /*-----* data read/write */ "", "", /* rd */ "", "", /* */ /*-----*/ "", "", /* wr */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* str */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* key */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /* */ "", "", /* ind */ "", "", /* */ "", "", /* */ /*-----*/ "", "", /*-----* blobs */ "", "", /* */ "", "", /*-----*/ "", "", /*-----* adaptitem */ "", "", /*-* general */ "", "", /*-* close */ // ---- ui context ------------------------------------------------ "", "", /*-* open */ "", "", /*-* run */ "", "", /*-* close */ NULL ); } // if return DB_NotFound; } // DBApi_DLLAssign #if defined __cplusplus } // namespace */ #endif /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/sync_dbapiconnect.h0000755000373300037200000001426012424517753031067 0ustar00nightlyallusers00000000000000/* * File: sync_dbapiconnect.h * * Author: Beat Forster (bfo@synthesis.ch) * * C/C++ Programming interface between * the Synthesis SyncML engine * and the database layer * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * * This module contains the method table and connection * routines, which are used e.g. for the JNI plugin. * */ #ifndef SYNC_DBAPICONNECT_H #define SYNC_DBAPICONNECT_H #include "sync_include.h" #include #ifdef __cplusplus namespace sysync { #endif /* -- configuration for the DB_Api class ------------------------------------------- */ /* ---- MODULE ---------------- */ typedef struct { /* start */ void* Module_CreateContext; void* Module_Version; void* Module_Capabilities; } Start_Methods; typedef struct { /* plugin params */ void* Module_PluginParams; } Param_Methods; /* ---- SESSION --------------- */ typedef struct { void* Session_PasswordMode; /* session auth */ void* Session_Login; void* Session_Logout; } SE_Auth__Methods; typedef struct { void* Session_CheckDevice; /* device admin */ void* Session_GetNonce; void* Session_SaveNonce; void* Session_SaveDeviceInfo; } DV_Admin_Methods; typedef struct { void* Session_GetDBTime; /* dbtime */ } DV_Time__Methods; typedef struct { void* Session_AdaptItem; /* adaptitem */ } SE_Adapt_Methods; typedef struct { /* --- session handling --- */ void* Session_CreateContext; /* open */ SE_Adapt_Methods seAdapt; /* adaptitem */ SE_Auth__Methods seAuth; /* auth */ DV_Admin_Methods dvAdmin; /* admin */ DV_Time__Methods dvTime; /* dbtime */ void* Session_DisposeObj; /* general */ void* Session_ThreadMayChangeNow; void* Session_DispItems; void* Session_DeleteContext; /* close */ } SE_Methods; /* ---- DATASTORE ------------- */ typedef struct { void* ContextSupport; /* general */ void* FilterSupport; void* ThreadMayChangeNow; void* WriteLogData; void* DispItems; } DS_General_Methods; typedef struct { void* LoadAdminData; /* datastore admin str */ void* SaveAdminData; } DS_Adm_Str_Methods; typedef struct { void* LoadAdminDataAsKey; /* datastore admin key */ void* SaveAdminDataAsKey; } DS_Adm_Key_Methods; typedef struct { void* ReadNextMapItem; /* datastore admin map */ void* InsertMapItem; void* UpdateMapItem; void* DeleteMapItem; } DS_Adm_Map_Methods; typedef struct { DS_Adm_Str_Methods str; /* datastore admin */ DS_Adm_Key_Methods key; DS_Adm_Map_Methods map; } DS_Adm_Methods; typedef struct { /* string read/write */ void* ReadNextItem; void* ReadItem; void* InsertItem; void* UpdateItem; } DS_Str_Methods; typedef struct { /* key read/write */ void* ReadNextItemAsKey; void* ReadItemAsKey; void* InsertItemAsKey; void* UpdateItemAsKey; } DS_Key_Methods; typedef struct { /* independent */ void* FinalizeLocalID; void* MoveItem; void* DeleteItem; void* DeleteSyncSet; } DS_Ind_Methods; typedef struct { void* StartDataRead; /* read */ void* EndDataRead; void* StartDataWrite; /* write */ void* EndDataWrite; DS_Str_Methods str; DS_Key_Methods key; DS_Ind_Methods ind; } DS_Data_Methods; typedef struct { /* BLOBs */ void* ReadBlob; void* WriteBlob; void* DeleteBlob; } DS_Blob_Methods; typedef struct { /* adaptitem */ void* AdaptItem; } DS_Adapt_Methods; typedef struct { /* --- datastore handling --- */ void* CreateContext; /* open */ DS_General_Methods dsg; /* general */ DS_Adm_Methods dsAdm; /* data admin */ DS_Data_Methods dsData; /* data rd/wr */ DS_Blob_Methods dsBlob; /* BLOBs */ DS_Adapt_Methods dsAdapt; /* adaptitem */ void* DisposeObj; void* DeleteContext; /* close */ } DS_Methods; typedef struct { /* --- ui context handling --- */ void* UI_CreateContext; /* open */ void* UI_RunContext; /* run */ void* UI_DeleteContext; /* close */ } UI_Methods; /* ======= configuration for the DB_Api class ====== */ typedef struct { /* -- module ------------------------------------- */ Start_Methods start; /* start */ Param_Methods param; /* params */ void* Module_DisposeObj; /* general */ void* Module_DeleteContext; /* -- session ------------------------------------ */ SE_Methods se; /* -- datastore ---------------------------------- */ DS_Methods ds; /* -- ui context --------------------------------- */ UI_Methods ui; } API_Methods; // the Java interface classes #define c_VAR_short "VAR_short" #define c_VAR_int "VAR_int" #define c_VAR_long "VAR_long" #define c_VAR_bool "VAR_boolean" #define c_VAR_String "VAR_String" #define c_VAR_byteArray "VAR_byteArray" #define c_JNI_ItemID "ItemID" #define c_JNI_MapID "MapID" #define c_JNI_TPI "TEngineProgressInfo" #define c_JNI_DB_Callback "DB_Callback" #define c_JNI_JCallback "JCallback" #define c_JNI_JCallback64 "JCallback64" #ifdef __cplusplus // Support functions for creating Java signatures string LCP ( string jP, string className ); // "L/; string JCS ( void ); // "Ljava/lang/String;" string SgnS( string s= "" ); // "()S" string SgnI( string s= "" ); // "()I" string SgnV( string s= "" ); // "()V" /*! Assign the DB_API interface functions and JNI signatures */ /* (Call ConnectFunctions) */ TSyError DBApi_DLLAssign( appPointer aMod, appPointer aField, memSize aFieldSize, string aKey, bool a64bit, string jP= "" ); #endif #if defined __cplusplus } // namespace */ #endif #endif /* SYNC_DBAPICONNECT_H */ /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/0000755000373300037200000000000012424517753025361 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/odbcapiagent.cpp0000644000373300037200000040502512424517753030513 0ustar00nightlyallusers00000000000000/** * @File odbcapiagent.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TODBCApiAgent * ODBC based agent (client or server session) implementation * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-10-06 : luz : created from odbcdbagent */ #include "prefix_file.h" #ifdef SQL_SUPPORT // includes #include "odbcapids.h" #include "odbcapiagent.h" #ifdef SYSYNC_TOOL #include "syncsessiondispatch.h" #endif namespace sysync { // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL // execute SQL command int execSQL(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" execsql []")); CONSOLEPRINTF((" Execute SQL statement via ODBC on the server database")); return EXIT_SUCCESS; } TODBCApiAgent *odbcagentP = NULL; const char *sql = NULL; // show only one row by default sInt32 maxrows=1; // check for argument if (argc<1) { CONSOLEPRINTF(("argument containing SQL statement required")); return EXIT_FAILURE; } sql = argv[0]; if (argc>=2) { // second arg is maxrows StrToLong(argv[1],maxrows); } // get ODBC session to work with odbcagentP = dynamic_cast( static_cast(getSyncAppBase())->getSySyToolSession() ); if (!odbcagentP) { CONSOLEPRINTF(("Config does not contain an ODBC server section")); return EXIT_FAILURE; } // execute query // - show DB where we will exec it CONSOLEPRINTF(("Connecting to ODBC with connection string = '%s'",odbcagentP->fConfigP->fDBConnStr.c_str())); SQLRETURN res; SQLHSTMT statement=odbcagentP->newStatementHandle(odbcagentP->getODBCConnectionHandle()); try { // set parameter const int paramsiz=100; SQLCHAR paramval[paramsiz]; SQLINTEGER lenorind=SQL_NULL_DATA; res=SQLBindParameter( statement, 1, // parameter index SQL_PARAM_OUTPUT, // inout SQL_C_CHAR, // we want it as string SQL_INTEGER, // parameter type paramsiz, // column size 0, // decimal digits ¶mval, // parameter value paramsiz, // value buffer size (SQLLEN*)&lenorind // length or indicator ); odbcagentP->checkStatementError(res,statement); // issue res = SafeSQLExecDirect( statement, (SQLCHAR *)sql, SQL_NTS ); odbcagentP->checkStatementError(res,statement); // show param if (lenorind!=SQL_NULL_DATA || lenorind!=SQL_NO_TOTAL) { CONSOLEPRINTF(("Returned parameter = '%s'",paramval)); } // - get number of result columns SQLSMALLINT numcolumns; SQLSMALLINT stringlength; // - get number of columns res = SafeSQLNumResultCols(statement,&numcolumns); odbcagentP->checkStatementError(res,statement); // - fetch result row(s) int rownum=0; while (true) { // try to fetch row res=SafeSQLFetch(statement); if (!odbcagentP->checkStatementHasData(res,statement)) break; // done // we have a row to show if (rownum>=maxrows) { CONSOLEPRINTF(("\nMore rows in result than allowed to display")); break; } // Show Row no rownum++; CONSOLEPRINTF(("\nResult Row #%d: ",rownum)); // fetch data for (int i=1; i<=numcolumns; i++) { // - get name of the column const int maxnamelen=100; SQLCHAR colname[maxnamelen]; SQLSMALLINT colnamelen; SQLINTEGER dummy; res=SQLColAttribute ( statement, // statement handle i, // column number SQL_DESC_BASE_COLUMN_NAME, // return column base name colname, // col name return buffer maxnamelen, // col name return buffer size &colnamelen, // no string length expected (SQLLEN*)&dummy // dummy ); if (res!=SQL_SUCCESS) { strcpy((char *)colname,""); } // - get data of the column in this row const int maxdatalen=100; SQLCHAR databuf[maxdatalen]; SQLINTEGER actualLength; res = SQLGetData( statement, // statement handle i, // column number SQL_C_CHAR, // target type: string &databuf, // Target Value buffer pointer maxdatalen, // max size of value (SQLLEN*)&actualLength ); if (res!=SQL_SUCCESS) break; // no more columns if (actualLength==SQL_NULL_DATA || actualLength==SQL_NO_TOTAL) { strcpy((char *)databuf,""); } CONSOLEPRINTF((" %3d. %20s : %s",i,colname,databuf)); } } CONSOLEPRINTF(("")); SafeSQLCloseCursor(statement); // dispose statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); } catch (exception &e) { // dispose statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); // show error CONSOLEPRINTF(("ODBC Error : %s",e.what())); return EXIT_FAILURE; } catch (...) { // dispose statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); // show error CONSOLEPRINTF(("ODBC caused unknown exception")); return EXIT_FAILURE; } return EXIT_SUCCESS; } // execSQL #endif // SYSYNC_TOOL // names for transaction isolation modes const char *TxnIsolModeNames[numTxnIsolModes] = { // Note: these MUST be in the same order as // Win32/ODBC defined SQL_TXN_READ_UNCOMMITTED..SQL_TXN_SERIALIZABLE // bits appear in the transaction bitmasks. "read-uncommitted", "read-committed", "repeatable", "serializable", // special values "none", "default" }; // Config TOdbcAgentConfig::TOdbcAgentConfig(TConfigElement *aParentElement) : TCustomAgentConfig(aParentElement) { // nop so far } // TOdbcAgentConfig::TOdbcAgentConfig TOdbcAgentConfig::~TOdbcAgentConfig() { clear(); } // TOdbcAgentConfig::~TOdbcAgentConfig // init defaults void TOdbcAgentConfig::clear(void) { // init defaults #ifdef ODBCAPI_SUPPORT // - ODBC data source fDataSource.erase(); fUsername.erase(); fPassword.erase(); #ifdef SCRIPT_SUPPORT fAfterConnectScript.erase(); #endif // - usually, SQLSetConnectAttr() is not problematic fNoConnectAttrs=false; // - use medium timeout by default fODBCTimeout=30; // - use DB default fODBCTxnMode=txni_default; // - cursor library usage fUseCursorLib=false; // use driver (this is also the ODBC default) // - device table fGetDeviceSQL.erase(); fNewDeviceSQL.erase(); fSaveNonceSQL.erase(); fSaveInfoSQL.erase(); fSaveDevInfSQL.erase(); fLoadDevInfSQL.erase(); // - auth fUserKeySQL.erase(); fClearTextPw=true; // otherwise, Nonce auth is not possible fMD5UserPass=false; // exclusive with ClearTextPw fMD5UPAsHex=false; // - datetime fGetCurrentDateTimeSQL.erase(); // - statement to save log info fWriteLogSQL.erase(); #endif // ODBCAPI_SUPPORT fQuotingMode=qm_duplsingle; // default to what was hard-coded before it became configurable in 2.1.1.5 // clear inherited inherited::clear(); } // TOdbcAgentConfig::clear #ifdef SCRIPT_SUPPORT // ODBC agent specific script functions // ==================================== class TODBCCommonFuncs { public: // string DBLITERAL(variant value, string dbfieldtype) static void func_DBLiteral(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); string tname,literal; TItemField *fieldP = aFuncContextP->getLocalVar(0); // the field to be converted aFuncContextP->getLocalVar(1)->getAsString(tname); // DB type string // search DB type, default to string sInt16 ty; TDBFieldType dbfty=dbft_string; if (StrToEnum(DBFieldTypeNames,numDBfieldTypes,ty,tname.c_str())) dbfty=(TDBFieldType)ty; // now create literal literal.erase(); TOdbcAgentConfig *cfgP = static_cast(aFuncContextP->getCallerContext())->fConfigP; timecontext_t tctx; TCharSets chs; TLineEndModes lem; TQuotingModes qm; if (agentP->fScriptContextDatastore) { TOdbcDSConfig *dsCfgP = static_cast( static_cast(agentP->fScriptContextDatastore)->fConfigP ); tctx=dsCfgP->fDataTimeZone; chs=dsCfgP->fDataCharSet; lem=dsCfgP->fDataLineEndMode; qm=dsCfgP->fQuotingMode; } else { tctx=cfgP->fCurrentDateTimeZone; chs=cfgP->fDataCharSet; lem=cfgP->fDataLineEndMode; qm=cfgP->fQuotingMode; } sInt32 s=0; agentP->appendFieldValueLiteral( *fieldP,dbfty,0,literal, chs, lem, qm, tctx, s ); // return it aTermP->setAsString(literal); }; // func_DBLiteral #ifdef ODBCAPI_SUPPORT // SETDBCONNECTSTRING(string dbconnectstring) // sets DB connect string, useful in to switch database // depending on user static void func_SetDBConnectString(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); // - close the current script statement (if any) agentP->commitAndCloseScriptStatement(); // - close the current connection (if any) agentP->closeODBCConnection(agentP->fODBCConnectionHandle); // - assign new DB connection string which will be used for next connection aFuncContextP->getLocalVar(0)->getAsString(agentP->fSessionDBConnStr); // override default DB connect string from config } // func_SetDBConnectString // SETDBPASSWORD(string password) // sets password, useful when using SETDBCONNECTSTRING() to switch databases // depending on user static void func_SetDBPassword(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); // - assign new DB connection password which will be used for next connection aFuncContextP->getLocalVar(0)->getAsString(agentP->fSessionDBPassword); // override default DB password from config } // func_SetDBPassword #endif // ODBCAPI_SUPPORT // integer SQLEXECUTE(string statement) // executes statement, returns 0 or ODBC error code static void func_SQLExecute(TItemField *&aTermP, TScriptContext *aFuncContextP) { string sql; #ifdef ODBCAPI_SUPPORT SQLRETURN res; #endif TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); TODBCApiDS *datastoreP = static_cast(agentP->fScriptContextDatastore); aFuncContextP->getLocalVar(0)->getAsString(sql); // get SQL to be executed bool ok = true; // assume ok SQLHSTMT stmt = SQL_NULL_HANDLE; try { if (datastoreP) { // do datastore-level substitutions and parameter mapping datastoreP->resetSQLParameterMaps(); datastoreP->DoDataSubstitutions( sql, datastoreP->fConfigP->fFieldMappings.fFieldMapList, 0, // standard set false, // not for write false, // not for update aFuncContextP->fTargetItemP // item in this context, if any ); #ifdef SQLITE_SUPPORT if (!datastoreP->fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT stmt = agentP->getScriptStatement(); #endif // ODBCAPI_SUPPORT } } else { #ifdef ODBCAPI_SUPPORT // do agent-level substitutions and parameter mapping stmt=agentP->getScriptStatement(); agentP->resetSQLParameterMaps(); agentP->DoSQLSubstitutions(sql); #else // %%% no session level SQLEXECUTE for now aTermP->setAsBoolean(false); POBJDEBUGPUTSX(aFuncContextP->getSession(),DBG_ERROR,"SQLEXECUTE() can only be used in datastore context for non-ODBC!"); return; #endif } // execute SQL statement #ifdef SYDEBUG if (POBJDEBUGTEST(aFuncContextP->getSession(),DBG_SCRIPTS+DBG_DBAPI)) { POBJDEBUGPUTSX(aFuncContextP->getSession(),DBG_DBAPI,"SQL issued by SQLEXECUTE() script function:"); POBJDEBUGPUTSX(aFuncContextP->getSession(),DBG_DBAPI,sql.c_str()); } else { POBJDEBUGPUTSX(aFuncContextP->getSession(),DBG_DBAPI,"SQLEXECUTE() executes a statement (hidden because script debugging is off)"); } #endif if (datastoreP) { datastoreP->prepareSQLStatement(stmt,sql.c_str(),true,NULL); datastoreP->bindSQLParameters(stmt,true); // execute in datastore datastoreP->execSQLStatement(stmt, sql, true, NULL, true); // do datastore-level parameter mapping datastoreP->saveAndCleanupSQLParameters(stmt,true); } #ifdef ODBCAPI_SUPPORT else { agentP->bindSQLParameters(stmt); // execute res = SafeSQLExecDirect( stmt, (SQLCHAR *)sql.c_str(), SQL_NTS ); agentP->checkStatementHasData(res,stmt); // treat NO_DATA error as ok // do agent-level parameter mapping agentP->saveAndCleanupSQLParameters(stmt); } #endif // ODBCAPI_SUPPORT } catch (exception &e) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_ERROR,( "SQLEXECUTE() caused Error: %s", e.what() )); ok=false; } // return ok status aTermP->setAsBoolean(ok); }; // func_SQLExecute // integer SQLFETCHROW() // fetches next row, returns true if data found static void func_SQLFetchRow(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef ODBCAPI_SUPPORT SQLRETURN res; #endif TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); TODBCApiDS *datastoreP = static_cast(agentP->fScriptContextDatastore); bool ok = true; // assume ok try { if (datastoreP) { ok=datastoreP->fetchNextRow(agentP->fScriptStatement,true); // always data access } #ifdef ODBCAPI_SUPPORT else { // - fetch result row res=SafeSQLFetch(agentP->getScriptStatement()); ok=agentP->checkStatementHasData(res,agentP->getScriptStatement()); } #endif } catch (exception &e) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_ERROR,( "SQLFETCHROW() caused Error: %s", e.what() )); ok=false; } // return ok status aTermP->setAsBoolean(ok); }; // func_SQLFetchRow // integer SQLGETCOLUMN(integer index, &field, string dbtype) // gets value of next column into specified variable // returns true if successful static void func_SQLGetColumn(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); TODBCApiDS *datastoreP = static_cast(agentP->fScriptContextDatastore); bool ok = true; // assume ok // get column index sInt16 colindex = aFuncContextP->getLocalVar(0)->getAsInteger(); // get field reference TItemField *fldP = aFuncContextP->getLocalVar(1); // get DB type for field string tname; aFuncContextP->getLocalVar(2)->getAsString(tname); // DB type string sInt16 ty; TDBFieldType dbfty=dbft_string; // default to string if (StrToEnum(DBFieldTypeNames,numDBfieldTypes,ty,tname.c_str())) dbfty=(TDBFieldType)ty; // get DB params TOdbcAgentConfig *cfgP = agentP->fConfigP; timecontext_t tctx; bool uzo; #ifdef SQLITE_SUPPORT bool sqlite=false; #endif TCharSets chs; if (datastoreP) { TOdbcDSConfig *dsCfgP = static_cast(datastoreP->fConfigP); tctx=dsCfgP->fDataTimeZone; chs=dsCfgP->fDataCharSet; uzo=dsCfgP->fUserZoneOutput; #ifdef SQLITE_SUPPORT sqlite=datastoreP->fUseSQLite; #endif } else { tctx=cfgP->fCurrentDateTimeZone; chs=cfgP->fDataCharSet; uzo=false; #ifdef SQLITE_SUPPORT sqlite=false; // no SQLite support at agent level #endif } // get value now try { #ifdef SQLITE_SUPPORT if (sqlite && datastoreP) { // - get column value as field if (!agentP->getSQLiteColValueAsField( datastoreP->fSQLiteStmtP, colindex-1, // SQLITE colindex starts at 0, not 1 like in ODBC dbfty, fldP, chs, tctx, uzo )) fldP->unAssign(); // NULL -> unassigned } else #endif { #ifdef ODBCAPI_SUPPORT // - get column value as field if (!agentP->getColumnValueAsField( agentP->getScriptStatement(), colindex, dbfty, fldP, chs, tctx, uzo )) fldP->unAssign(); // NULL -> unassigned #endif } } catch (exception &e) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_ERROR,( "SQLGETCOLUMN() caused Error: %s", e.what() )); ok=false; } // return ok status aTermP->setAsBoolean(ok); }; // func_SQLGetColumn // SQLCOMMIT() // commits agent-level transactions static void func_SQLCommit(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); TODBCApiDS *datastoreP = static_cast(agentP->fScriptContextDatastore); if (datastoreP) { // we might need finalizing (for SQLite...) datastoreP->finalizeSQLStatement(agentP->fScriptStatement, true); } #ifdef ODBCAPI_SUPPORT try { agentP->commitAndCloseScriptStatement(); } catch (exception &e) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_ERROR,( "SQLCOMMIT() caused Error: %s", e.what() )); } #endif // ODBCAPI_SUPPORT }; // func_SQLCommit // SQLROLLBACK() // rollback agent-level transactions static void func_SQLRollback(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiAgent *agentP = static_cast(aFuncContextP->getCallerContext()); TODBCApiDS *datastoreP = static_cast(agentP->fScriptContextDatastore); if (datastoreP) { // we might need finalizing (for SQLite...) datastoreP->finalizeSQLStatement(agentP->fScriptStatement, true); } #ifdef ODBCAPI_SUPPORT try { if (agentP->fScriptStatement!=SQL_NULL_HANDLE) { // only roll back if we have used a statement at all in scripts SafeSQLFreeHandle(SQL_HANDLE_STMT,agentP->fScriptStatement); agentP->fScriptStatement=SQL_NULL_HANDLE; SafeSQLEndTran(SQL_HANDLE_DBC,agentP->getODBCConnectionHandle(),SQL_ROLLBACK); } } catch (exception &e) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_ERROR,( "SQLROLLBACK() caused Error: %s", e.what() )); } #endif // ODBCAPI_SUPPORT }; // func_SQLRollback }; // TODBCCommonFuncs const uInt8 param_DBLiteral[] = { VAL(fty_none), VAL(fty_string) }; const uInt8 param_OneString[] = { VAL(fty_string) }; const uInt8 param_SQLGetColumn[] = { VAL(fty_integer), REF(fty_none), VAL(fty_string) }; // builtin function defs for ODBC database and login contexts const TBuiltInFuncDef ODBCAgentAndDSFuncDefs[] = { // generic DB access { "DBLITERAL", TODBCCommonFuncs::func_DBLiteral, fty_string, 2, param_DBLiteral }, // note that there's a second version of this in ODBCDatastore #ifdef ODBCAPI_SUPPORT { "SETDBCONNECTSTRING", TODBCCommonFuncs::func_SetDBConnectString, fty_none, 1, param_OneString }, { "SETDBPASSWORD", TODBCCommonFuncs::func_SetDBPassword, fty_none, 1, param_OneString }, #endif // ODBCAPI_SUPPORT { "SQLEXECUTE", TODBCCommonFuncs::func_SQLExecute, fty_integer, 1, param_OneString }, { "SQLFETCHROW", TODBCCommonFuncs::func_SQLFetchRow, fty_integer, 0, NULL }, { "SQLGETCOLUMN", TODBCCommonFuncs::func_SQLGetColumn, fty_integer, 3, param_SQLGetColumn }, { "SQLCOMMIT", TODBCCommonFuncs::func_SQLCommit, fty_none, 0, NULL }, { "SQLROLLBACK", TODBCCommonFuncs::func_SQLRollback, fty_none, 0, NULL } }; #ifdef BINFILE_ALWAYS_ACTIVE // Binfile based version just has the SQL access functions // function table for connectionscript const TFuncTable ODBCAgentFuncTable = { sizeof(ODBCAgentAndDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of table ODBCAgentAndDSFuncDefs, // table pointer NULL // no chain func }; #else // Full range of functions for non-binfile-based version // chain from ODBC agent funcs to Custom agent Funcs extern const TFuncTable CustomAgentFuncTable2; static void *ODBCAgentChainFunc1(void *&aCtx) { // caller context remains unchanged // -> no change needed // next table is Custom Agent's general function table return (void *)&CustomAgentFuncTable2; } // ODBCAgentChainFunc1 // function table which is chained from login-context function table const TFuncTable ODBCAgentFuncTable2 = { sizeof(ODBCAgentAndDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of table ODBCAgentAndDSFuncDefs, // table pointer ODBCAgentChainFunc1 // chain to non-ODBC specific agent Funcs }; // chain from login context agent funcs to general agent funcs extern const TFuncTable ODBCDSFuncTable2; static void *ODBCAgentChainFunc(void *&aCtx) { // caller context remains unchanged // -> no change needed // next table is Agent's general function table return (void *)&ODBCAgentFuncTable2; } // ODBCAgentChainFunc // function table for login context scripts // Note: ODBC agent has no login-context specific functions, but is just using those from customImplAgent const TFuncTable ODBCAgentFuncTable = { sizeof(CustomAgentFuncDefs) / sizeof(TBuiltInFuncDef), // size of table CustomAgentFuncDefs, // table pointer ODBCAgentChainFunc // chain to general agent funcs. }; #endif // not BASED_ON_BINFILE_CLIENT // chain from agent funcs to ODBC local datastore funcs (when chained via ODBCDSFuncTable1 extern const TFuncTable ODBCDSFuncTable2; static void *ODBCDSChainFunc1(void *&aCtx) { // caller context for datastore-level functions is the datastore pointer if (aCtx) aCtx = static_cast(aCtx)->fScriptContextDatastore; // next table is ODBC datastore's return (void *)&ODBCDSFuncTable2; } // ODBCDSChainFunc1 // function table for linking in Custom agent level functions between ODBC agent and ODBC DS level functions const TFuncTable ODBCAgentFuncTable3 = { sizeof(CustomAgentAndDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of agent's table CustomAgentAndDSFuncDefs, // table pointer to agent's general purpose (non login-context specific) funcs ODBCDSChainFunc1 // NOW finally chain back to ODBC datastore level DB functions }; // chain from ODBC agent funcs to generic agent funcs and THEN back to ODBC DS funcs extern const TFuncTable ODBCDSFuncTable2; static void *ODBCDSChainFunc2(void *&aCtx) { // caller context remains unchanged // -> no change needed // next table is Agent's general function table return (void *)&ODBCAgentFuncTable3; } // ODBCDSChainFunc2 // function table which is used by ODBC datastore scripts to access agent-level funcs and then chain // back to datastore level funcs const TFuncTable ODBCDSFuncTable1 = { sizeof(ODBCAgentAndDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of agent's table ODBCAgentAndDSFuncDefs, // table pointer to agent's general purpose (non login-context specific) funcs ODBCDSChainFunc2 // first chain to Custom Agent level functions, but then back to ODBC datastore level DB functions }; #endif // config element parsing bool TOdbcAgentConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements #ifdef ODBCAPI_SUPPORT // - ODBC connection if (strucmp(aElementName,"datasource")==0) expectString(fDataSource); else if (strucmp(aElementName,"dbuser")==0) expectString(fUsername); else if (strucmp(aElementName,"dbpass")==0) expectString(fPassword); else if (strucmp(aElementName,"dbconnectionstring")==0) expectString(fDBConnStr); // - odbc timeout else if (strucmp(aElementName,"dbtimeout")==0) expectInt32(fODBCTimeout); // - transaction mode else if (strucmp(aElementName,"transactionmode")==0) expectEnum(sizeof(fODBCTxnMode),&fODBCTxnMode,TxnIsolModeNames,numTxnIsolModes); // - preventing use of SQLSetConnectAttr() else if (strucmp(aElementName,"preventconnectattrs")==0) expectBool(fNoConnectAttrs); // - cursor library usage else if (strucmp(aElementName,"usecursorlib")==0) expectBool(fUseCursorLib); #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"afterconnectscript")==0) expectScript(fAfterConnectScript,aLine,getAgentFuncTableP()); #endif #ifdef HAS_SQL_ADMIN // - device table else if (strucmp(aElementName,"getdevicesql")==0) expectString(fGetDeviceSQL); else if (strucmp(aElementName,"newdevicesql")==0) expectString(fNewDeviceSQL); else if (strucmp(aElementName,"savenoncesql")==0) expectString(fSaveNonceSQL); else if (strucmp(aElementName,"saveinfosql")==0) expectString(fSaveInfoSQL); else if (strucmp(aElementName,"savedevinfsql")==0) expectString(fSaveDevInfSQL); else if (strucmp(aElementName,"loaddevinfsql")==0) expectString(fLoadDevInfSQL); // - user auth SQL else if (strucmp(aElementName,"userkeysql")==0) expectString(fUserKeySQL); else if (strucmp(aElementName,"cleartextpw")==0) expectBool(fClearTextPw); else if (strucmp(aElementName,"md5userpass")==0) expectBool(fMD5UserPass); else if (strucmp(aElementName,"md5hex")==0) expectBool(fMD5UPAsHex); // - database time SQL else if (strucmp(aElementName,"timestampsql")==0) expectString(fGetCurrentDateTimeSQL); // - statement to save log info else if (strucmp(aElementName,"writelogsql")==0) expectString(fWriteLogSQL); else #endif // HAS_SQL_ADMIN #endif // ODBCAPI_SUPPORT // - quoting mode if (strucmp(aElementName,"quotingmode")==0) expectEnum(sizeof(fQuotingMode),&fQuotingMode,quotingModeNames,numQuotingModes); // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TOdbcAgentConfig::localStartElement // resolve void TOdbcAgentConfig::localResolve(bool aLastPass) { if (aLastPass) { #ifdef ODBCAPI_SUPPORT // check for required settings // - create fDBConnStr from dsn,user,pw if none specified explicitly if (fDBConnStr.empty()) { // Note: we do not add the password here as fDBConnStr is shown in logs. StringObjPrintf(fDBConnStr,"DSN=%s;UID=%s;",fDataSource.c_str(),fUsername.c_str()); } #ifdef HAS_SQL_ADMIN if (fClearTextPw && fMD5UserPass) throw TConfigParseException("only one of 'cleartextpw' and 'md5userpass' can be set"); #ifdef SYSYNC_SERVER if (IS_SERVER) { if (fAutoNonce && !fClearTextPw && !fMD5UserPass) throw TConfigParseException("if 'autononce' is set, 'cleartextpw' or 'md5userpass' MUST be set as well"); } #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT if (IS_CLIENT) { #ifndef NO_LOCAL_DBLOGIN if (fNoLocalDBLogin && !fUserKeySQL.empty()) throw TConfigParseException("'nolocaldblogin' is not allowed when 'userkeysql' is defined"); #endif } #endif // SYSYNC_CLIENT #endif // HAS_SQL_ADMIN #endif // ODBCAPI_SUPPORT } // resolve inherited // - Note: this resolves the ancestor's scripts first inherited::localResolve(aLastPass); } // TOdbcAgentConfig::localResolve #ifdef SCRIPT_SUPPORT // resolve scripts void TOdbcAgentConfig::ResolveAPIScripts(void) { #ifdef ODBCAPI_SUPPORT // afterconnect script has it's own context as it might be called nested in other scripts (e.g. triggered by SQLEXECUTE) TScriptContext *ctxP = NULL; TScriptContext::resolveScript(getSyncAppBase(),fAfterConnectScript,ctxP,NULL); if (ctxP) delete ctxP; #endif } // TOdbcAgentConfig::localResolve #endif /* public TODBCApiAgent members */ // private init routine for both client and server constructor TODBCApiAgent::TODBCApiAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID) : TCustomImplAgent(aAppBaseP, aSessionHandleP, aSessionID) { // init basics #ifdef ODBCAPI_SUPPORT fODBCConnectionHandle = SQL_NULL_HANDLE; fODBCEnvironmentHandle = SQL_NULL_HANDLE; #ifdef SCRIPT_SUPPORT fScriptStatement = SQL_NULL_HANDLE; fAfterConnectContext = NULL; #endif #endif // ODBCAPI_SUPPORT // get config for agent and save direct link to agent config for easy reference fConfigP = static_cast(getRootConfig()->fAgentConfigP); // Note: Datastores are already created from config #ifdef ODBCAPI_SUPPORT // - assign default DB connection string and password fSessionDBConnStr = fConfigP->fDBConnStr; fSessionDBPassword = fConfigP->fPassword; #ifdef SCRIPT_SUPPORT // - rebuild afterconnect script TScriptContext::rebuildContext(getSyncAppBase(),fConfigP->fAfterConnectScript,fAfterConnectContext,this,true); #endif #endif } // TODBCApiAgent::TODBCApiAgent // destructor TODBCApiAgent::~TODBCApiAgent() { // make sure everything is terminated BEFORE destruction of hierarchy begins TerminateSession(); } // TODBCApiAgent::~TODBCApiAgent // Terminate session void TODBCApiAgent::TerminateSession() { if (!fTerminated) { string msg,state; // Note that the following will happen BEFORE destruction of // individual datastores, so make sure datastore have their ODBC // stuff finished before disposing environment InternalResetSession(); #ifdef ODBCAPI_SUPPORT #ifdef SCRIPT_SUPPORT // get rid of afterconnect context if (fAfterConnectContext) delete fAfterConnectContext; #endif SQLRETURN res; if (fODBCEnvironmentHandle!=SQL_NULL_HANDLE) { // release the enviroment res=SafeSQLFreeHandle(SQL_HANDLE_ENV,fODBCEnvironmentHandle); if (getODBCError(res,msg,state,SQL_HANDLE_ENV,fODBCEnvironmentHandle)) { DEBUGPRINTFX(DBG_ERROR,("~TODBCApiAgent: SQLFreeHandle(ENV) failed: %s",msg.c_str())); } fODBCEnvironmentHandle=SQL_NULL_HANDLE; } #endif // Make sure datastores know that the agent will go down soon announceDestruction(); } inherited::TerminateSession(); } // TODBCApiAgent::TerminateSession // Reset session void TODBCApiAgent::InternalResetSession(void) { // reset all datastores now to make sure ODBC is reset before we close the // global connection and the environment handle (if called by destructor)! // (Note: TerminateDatastores() will be called again by ancestors) TerminateDatastores(); #ifdef ODBCAPI_SUPPORT #ifdef SCRIPT_SUPPORT // commit connection (possible scripted statements) commitAndCloseScriptStatement(); #endif // clear parameter maps resetSQLParameterMaps(); // close session level connection if not already closed closeODBCConnection(fODBCConnectionHandle); #endif // ODBCAPI_SUPPORT } // TODBCApiAgent::InternalResetSession // Virtual version void TODBCApiAgent::ResetSession(void) { // do my own stuff InternalResetSession(); // let ancestor do its stuff inherited::ResetSession(); } // TODBCApiAgent::ResetSession #ifdef ODBCAPI_SUPPORT #ifdef SCRIPT_SUPPORT // commit and close possibly open script statement void TODBCApiAgent::commitAndCloseScriptStatement(void) { if (fODBCConnectionHandle!=SQL_NULL_HANDLE) { // free script statement, if any still open if (fScriptStatement!=SQL_NULL_HANDLE) { PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Script statement exists -> closing it now")); SafeSQLFreeHandle(SQL_HANDLE_STMT,fScriptStatement); fScriptStatement=SQL_NULL_HANDLE; } // now commit transaction SafeSQLEndTran(SQL_HANDLE_DBC,fODBCConnectionHandle,SQL_COMMIT); } } // TODBCApiAgent::commitAndCloseScriptStatement // get statement for executing scripted SQL HSTMT TODBCApiAgent::getScriptStatement(void) { if (fScriptStatement==SQL_NULL_HANDLE) { fScriptStatement=newStatementHandle(getODBCConnectionHandle()); } return fScriptStatement; } // TODBCApiAgent::getScriptStatement #endif #endif // ODBCAPI_SUPPORT #ifdef ODBCAPI_SUPPORT #if !defined(NO_AV_GUARDING) // && !__option(microsoft_exceptions) #ifndef _WIN32 #error "AV Guarding is only for Win32" #endif // SEH-aware versions of ODBC calls (to avoid that crashing drivers blame our server) // ================================================================================== // Special exception returning the SEH code TODBCSEHexception::TODBCSEHexception(uInt32 aCode) { StringObjPrintf(fMessage,"ODBC Driver caused SEH/AV Code=%08lX",aCode); } // TODBCSEHexception::TODBCSEHexception // define what object is to be thrown #define SEH_THROWN_OBJECT TODBCSEHexception(GetExceptionCode()) SQLRETURN SafeSQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE * OutputHandlePtr) { __try { /* #ifndef RELEASE_VERSION // %%% causes AV InputHandle=0; *((char *)(InputHandle)) = 'X'; #else #error "throw that out!! %%%%" #endif */ return SQLAllocHandle(HandleType,InputHandle,OutputHandlePtr); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLAllocHandle SQLRETURN SafeSQLFreeHandle( SQLSMALLINT HandleType, SQLHANDLE Handle) { __try { return SQLFreeHandle(HandleType,Handle); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLFreeHandle SQLRETURN SafeSQLSetEnvAttr( SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength) { __try { return SQLSetEnvAttr(EnvironmentHandle,Attribute,ValuePtr,StringLength); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLSetEnvAttr SQLRETURN SafeSQLSetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength) { __try { return SQLSetConnectAttr(ConnectionHandle,Attribute,ValuePtr,StringLength); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLSetConnectAttr SQLRETURN SafeSQLConnect( SQLHDBC ConnectionHandle, SQLCHAR * ServerName, SQLSMALLINT NameLength1, SQLCHAR * UserName, SQLSMALLINT NameLength2, SQLCHAR * Authentication, SQLSMALLINT NameLength3) { __try { return SQLConnect(ConnectionHandle,ServerName,NameLength1,UserName,NameLength2,Authentication,NameLength3); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLConnect SQLRETURN SafeSQLDriverConnect( SQLHDBC ConnectionHandle, SQLHWND WindowHandle, SQLCHAR * InConnectionString, SQLSMALLINT StringLength1, SQLCHAR * OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT * StringLength2Ptr, SQLUSMALLINT DriverCompletion) { __try { return SQLDriverConnect(ConnectionHandle,WindowHandle,InConnectionString,StringLength1,OutConnectionString,BufferLength,StringLength2Ptr,DriverCompletion); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLDriverConnect SQLRETURN SafeSQLGetInfo( SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr, SQLSMALLINT BufferLength, SQLSMALLINT * StringLengthPtr) { __try { return SQLGetInfo(ConnectionHandle,InfoType,InfoValuePtr,BufferLength,StringLengthPtr); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLGetInfo SQLRETURN SafeSQLEndTran( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType) { __try { return SQLEndTran(HandleType,Handle,CompletionType); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLEndTran SQLRETURN SafeSQLExecDirect( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength) { __try { return SQLExecDirect(StatementHandle,StatementText,TextLength); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLExecDirect #ifdef ODBC_UNICODE SQLRETURN SafeSQLExecDirectW( SQLHSTMT StatementHandle, SQLWCHAR * StatementText, SQLINTEGER TextLength) { __try { return SQLExecDirectW(StatementHandle,StatementText,TextLength); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLExecDirectW #endif SQLRETURN SafeSQLFetch( SQLHSTMT StatementHandle) { __try { return SQLFetch(StatementHandle); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLFetch SQLRETURN SafeSQLNumResultCols( SQLHSTMT StatementHandle, SQLSMALLINT * ColumnCountPtr) { __try { return SQLNumResultCols(StatementHandle,ColumnCountPtr); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLNumResultCols SQLRETURN SafeSQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLLEN * StrLen_or_IndPtr) { __try { return SQLGetData(StatementHandle,ColumnNumber,TargetType,TargetValuePtr,BufferLength,StrLen_or_IndPtr); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SQLRETURN SafeSQLCloseCursor( SQLHSTMT StatementHandle) { __try { return SQLCloseCursor(StatementHandle); } __except(EXCEPTION_EXECUTE_HANDLER) { throw SEH_THROWN_OBJECT; } } // SafeSQLCloseCursor #endif // AV Guarding #endif // ODBCAPI_SUPPORT // append field value as literal to SQL text // - returns true if field(s) were not empty // - even non-existing or empty field will append at least NULL or '' to SQL bool TODBCApiAgent::appendFieldValueLiteral( TItemField &aField,TDBFieldType aDBFieldType, uInt32 aMaxSize, string &aSQL, TCharSets aDataCharSet, TLineEndModes aDataLineEndMode, TQuotingModes aQuotingMode, timecontext_t aTimeContext, sInt32 &aRecordSize ) { bool dat=false; bool tim=false; bool intts=false; string val; TTimestampField *tsFldP; sInt32 factor; sInt32 sz; sInt16 moffs; lineartime_t ts; timecontext_t tctx; bool isempty=aField.isEmpty(); if ( isempty && aDBFieldType!=dbft_string ) { // non-string field does not have a value: NULL aSQL+="NULL"; } else { switch (aDBFieldType) { // numeric time offsets case dbft_uctoffsfortime_hours: factor = 0; // special case, float goto timezone; case dbft_uctoffsfortime_mins: factor = 1; goto timezone; case dbft_uctoffsfortime_secs: factor = SecsPerMin;; goto timezone; case dbft_zonename: factor = -1; // name, not offset timezone: // get field if (!aField.isBasedOn(fty_timestamp)) goto nullfield; // no timestamp -> no zone tsFldP = static_cast(&aField); // get name or offset tctx = tsFldP->getTimeContext(); if (factor>=0) { // offset requested if (tsFldP->isFloating()) goto nullfield; // floating -> no offset if (!TzResolveToOffset(tctx,moffs,tsFldP->getTimestampAs(TCTX_UNKNOWN),false,tsFldP->getGZones())) goto nullfield; // cannot calc offset -> no zone if (factor==0) StringObjAppendPrintf(aSQL,"%g",(sInt32)moffs/60.0); // make hours with fraction else StringObjAppendPrintf(aSQL,"%ld",(long)moffs * factor); // mins or seconds } else { // name requested if (!TCTX_IS_DURATION(tctx) && !TCTX_IS_DATEONLY(tctx) && TCTX_IS_UNKNOWN(tctx)) goto nullfield; // really floating (not duration or dateonly) -> no zone (and not "FLOATING" string we'd get from TimeZoneContextToName) TimeZoneContextToName(tctx, val, tsFldP->getGZones()); goto asstring; } break; // date and time values case dbft_lineardate: case dbft_unixdate_s: case dbft_unixdate_ms: case dbft_unixdate_us: intts=true; // integer timestamp case dbft_date: // date-only field dat=true; goto settimestamp; case dbft_timefordate: case dbft_time: tim=true; goto settimestamp; case dbft_lineartime: case dbft_unixtime_s: case dbft_nsdate_s: case dbft_unixtime_ms: case dbft_unixtime_us: intts=true; // integer timestamp case dbft_dateonly: // date-only, but stored as timestamp case dbft_timestamp: dat=true; tim=true; settimestamp: // get timestamp in DB time zone if (aField.isBasedOn(fty_timestamp)) { // get it from field in specified zone (or floating) ts=static_cast(&aField)->getTimestampAs(aTimeContext,&tctx); } else { // try to convert ISO8601 string representation aField.getAsString(val); ISO8601StrToTimestamp(val.c_str(), ts, tctx); TzConvertTimestamp(ts,tctx,aTimeContext,getSessionZones(),aTimeContext); } // remove time part on date-only if (dat & !tim) ts = lineartime2dateonlyTime(ts); if (intts) { // Timestamp represented as integer in the DB // - add as integer timestamp // sInt64 ii = lineartimeToDbInt(ts,aDBFieldType); // PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,( // "ts=%lld -> dbInteger=%lld/0x%llX (UnixToLineartimeOffset=%lld, secondToLinearTimeFactor=%lld)", // ts,ii,ii,UnixToLineartimeOffset,secondToLinearTimeFactor // )); // StringObjAppendPrintf(aSQL,PRINTF_LLD,PRINTF_LLD_ARG(ii)); StringObjAppendPrintf(aSQL,PRINTF_LLD,PRINTF_LLD_ARG(lineartimeToDbInt(ts,aDBFieldType))); } else { // add as ODBC date/time literal lineartimeToODBCLiteralAppend(ts, aSQL, dat, tim); } break; case dbft_numeric: // numeric fields are copied to SQL w/o quotes aField.getAsString(val); aSQL.append(val); // just append break; case dbft_blob: // BLOBs cannot be written literally (should never occur, as we automatically parametrize them) throw TSyncException("FATAL: BLOB fields must be written with parameters"); break; case dbft_string: default: // Database field is string (or unknown), add it as string literal aField.getAsString(val); // only net string sizes are counted sz=val.size(); // net size of string if (sz>sInt32(aMaxSize)) sz=aMaxSize; // limit to what can be actually stored aRecordSize+=sz; // add to count asstring: stringToODBCLiteralAppend( val.c_str(), aSQL, aDataCharSet, aDataLineEndMode, aQuotingMode, aMaxSize ); break; nullfield: aSQL+="NULL"; break; } // switch } // field has a value return !isempty; } // TODBCApiAgent::appendFieldValueLiteral // - make ODBC string literal from UTF8 string void TODBCApiAgent::stringToODBCLiteralAppend( cAppCharP aText, string &aLiteral, TCharSets aCharSet, TLineEndModes aLineEndMode, TQuotingModes aQuotingMode, size_t aMaxBytes ) { aLiteral+='\''; appendUTF8ToString( aText,aLiteral, aCharSet, // charset aLineEndMode, // line end mode aQuotingMode, // quoting mode aMaxBytes // max size (0 if unlimited) ); aLiteral+='\''; } // TODBCApiAgent::stringToODBCLiteralAppend // - make ODBC date/time literals from lineartime_t void TODBCApiAgent::lineartimeToODBCLiteralAppend( lineartime_t aTimestamp, string &aString, bool aWithDate, bool aWithTime, timecontext_t aTsContext, timecontext_t aDBContext ) { // make correct zone if needed if (!TCTX_IS_UNKNOWN(aTsContext)) { TzConvertTimestamp(aTimestamp,aTsContext,aDBContext,getSessionZones(),TCTX_UNKNOWN); } // calculate components sInt16 y,mo,d,h,mi,s,ms; lineartime2date(aTimestamp,&y,&mo,&d); lineartime2time(aTimestamp,&h,&mi,&s,&ms); // create prefix aString+='{'; if (aWithDate && aWithTime) aString+="ts"; else if (aWithTime) aString+="t"; else aString+="d"; aString+=" '"; // add date if selected if (aWithDate) { StringObjAppendPrintf( aString,"%04d-%02d-%02d", y, mo, d ); } // add time if selected if (aWithTime) { if (aWithDate) aString+=' '; // separate StringObjAppendPrintf(aString, "%02d:%02d:%02d", h, mi, s ); // microseconds, if any if (ms!=0) { StringObjAppendPrintf(aString,".%03d",ms); } } // suffix aString+="'}"; } // TODBCApiAgent::lineartimeToODBCLiteralAppend // - make integer-based literals from lineartime_t void TODBCApiAgent::lineartimeToIntLiteralAppend( lineartime_t aTimestamp, string &aString, TDBFieldType aDbfty, timecontext_t aTsContext, timecontext_t aDBContext ) { // make correct zone if needed if (!TCTX_IS_UNKNOWN(aTsContext)) { TzConvertTimestamp(aTimestamp,aTsContext,aDBContext,getSessionZones(),TCTX_UNKNOWN); } // - add as integer timestamp StringObjAppendPrintf(aString,PRINTF_LLD,PRINTF_LLD_ARG(lineartimeToDbInt(aTimestamp,aDbfty))); } // TODBCApiAgent::lineartimeToIntLiteralAppend /*%%% obsolete // - make ODBC date/time literals from UTC timestamp void TODBCApiAgent::timeStampToODBCLiteralAppend(lineartime_t aTimeStamp, string &aString, bool aAsUTC, bool aWithDate, bool aWithTime) { if (aTimeStamp!=0) { if (!aAsUTC) aTimeStamp=makeLocalTimestamp(aTimeStamp); // convert to local time struct tm tim; lineartime2tm(aTimeStamp,&tim); // format as ODBC date/time literal tmToODBCLiteralAppend(tim,aString,aWithDate,aWithTime); } else { aString.append("NULL"); } } // TODBCApiAgent::timeStampToODBCLiteralAppend // - make ODBC date/time literals from struct tm void TODBCApiAgent::tmToODBCLiteralAppend(const struct tm &tim, string &aString, bool aWithDate, bool aWithTime) { // create prefix aString+='{'; if (aWithDate && aWithTime) aString+="ts"; else if (aWithTime) aString+="t"; else aString+="d"; aString+=" '"; // add date if selected if (aWithDate) { StringObjAppendPrintf( aString,"%04d-%02d-%02d", tim.tm_year+1900, tim.tm_mon+1, tim.tm_mday ); } // add time if selected if (aWithTime) { if (aWithDate) aString+=' '; // separate StringObjAppendPrintf(aString, "%02d:%02d:%02d", tim.tm_hour, tim.tm_min, tim.tm_sec ); } // suffix aString+="'}"; } // TODBCApiAgent::tmToODBCLiteralAppend */ // - return quoted version of string if aDoQuote is set // bfo: Problems with XCode (expicit qualification), already within namespace ? //const char *sysync::quoteString(string &aIn, string &aOut, TQuotingModes aQuoteMode) const char *quoteString(string &aIn, string &aOut, TQuotingModes aQuoteMode) { return quoteString(aIn.c_str(),aOut,aQuoteMode); } // TODBCApiAgent::quoteString // - return quoted version of string if aDoQuote is set // bfo: Problems with XCode (expicit qualification), already within namespace ? //const char *sysync::quoteString(const char *aIn, string &aOut, TQuotingModes aQuoteMode) const char *quoteString(const char *aIn, string &aOut, TQuotingModes aQuoteMode) { aOut.erase(); quoteStringAppend(aIn,aOut,aQuoteMode); return aOut.c_str(); } // TODBCApiAgent::quoteString // - append quoted version of string if aDoQuote is set // bfo: Problems with XCode (expicit qualification), already within namespace ? //void sysync::quoteStringAppend(const char *aIn, string &aOut, TQuotingModes aQuoteMode) void quoteStringAppend(const char *aIn, string &aOut, TQuotingModes aQuoteMode) { if ((!aQuoteMode)!=qm_none) aOut.append(aIn); else { sInt16 n=strlen(aIn); aOut.reserve(n+2); aOut+='\''; appendUTF8ToString( aIn, aOut, chs_ascii, // charset lem_cstr, // line end mode aQuoteMode, // quoting mode 0 // max size (0 if unlimited) ); aOut+='\''; } } // TODBCApiAgent::quoteStringAppend // - append quoted version of string if aDoQuote is set // bfo: Problems with XCode (expicit qualification), already within namespace ? //void sysync::quoteStringAppend(string &aIn, string &aOut, TQuotingModes aQuoteMode) void quoteStringAppend(string &aIn, string &aOut, TQuotingModes aQuoteMode) { quoteStringAppend(aIn.c_str(),aOut,aQuoteMode); } // TODBCApiAgent::quoteStringAppend // reset all mapped parameters void TODBCApiAgent::resetSQLParameterMaps(TParameterMapList &aParamMapList) { TParameterMapList::iterator pos; for (pos=aParamMapList.begin();pos!=aParamMapList.end();++pos) { // clean up entry if (pos->mybuffer && pos->ParameterValuePtr) { // delete buffer if we have allocated one sysync_free(pos->ParameterValuePtr); pos->ParameterValuePtr=NULL; pos->mybuffer=false; } } // now clear list aParamMapList.clear(); } // TODBCApiAgent::resetSQLParameterMaps // parsing of %p(mode,var_or_field[,dbfieldtype[,maxcolsize]]) sequence bool TODBCApiAgent::ParseParamSubst( string &aSQL, // string to parse string::size_type &i, // input=position where % sequence starts in aSQL, output = if result==false: where to continue parsing, else: where to substitute string::size_type &n, // input=number of chars of % sequence possibly with "(" but nothing more, if result==true: output=number of chars to substitute at i in aSQL TParameterMapList &aParameterMaps, // parameter maps list to add params to TMultiFieldItem *aItemP // the involved item for field params #ifdef SCRIPT_SUPPORT ,TScriptContext *aScriptContextP // the script context for variable params #endif ) { string::size_type j,k,h; // %p(mode,fieldname,dbfieldtype) = field as SQL parameter, where mode can be "i","o" or "io" j=i+n; // find closing paranthesis k = aSQL.find(")",j); if (k==string::npos) { i=j; n=0; return false; } // no closing paranthesis, do not substitute // get mode bool paramin=false,paramout=false; paramin=false; paramout=false; if (tolower(aSQL[j]=='i')) { paramin=true; if (tolower(aSQL[j+1])=='o') { paramout=true; ++j; } ++j; } else if (tolower(aSQL[j]=='o')) { paramout=true; ++j; } // now get item field or variable name if (aSQL[j]!=',') { i=k+1; n=0; return false; } // continue after closing paranthesis ++j; // extract name (without possible array index) h = aSQL.find(",",j); if (h==string::npos) { h=k; } // no second comma, only field name, use default dbfieldtype string fldname; fldname.assign(aSQL,j,h-j); j=h+1; // after , or ) // get fieldtype (default if none specified) TDBFieldType dbfty=dbft_string; // default to string uInt32 colmaxsize=0; if (hgetIdentifierIndex(OBJ_AUTO, aItemP ? aItemP->getFieldDefinitions() : NULL ,fldname.c_str()); fldP=aScriptContextP->getFieldOrVar(aItemP,idx,0); } else #endif if (aItemP) fldP = aItemP->getArrayField(fldname.c_str(),0,true); if (!fldP) { i=k+1; n=0; return false; } // no suitable mapping // now map as parameter TParameterMap map; // assign basics map.inparam=paramin; map.outparam=paramout; map.parammode=param_field; map.mybuffer=false; map.ParameterValuePtr=NULL; map.BufferLength=0; map.StrLen_or_Ind=SQL_NULL_DATA; // note that this is not zero (but -1) map.itemP=aItemP; map.fieldP=fldP; map.maxSize=colmaxsize; map.dbFieldType=dbfty; // save in list aParameterMaps.push_back(map); // set substitution parameters n=k+1-i; // ok, substitute return true; } // TODBCApiAgent::ParseParamSubst // do generic substitutions void TODBCApiAgent::DoSQLSubstitutions(string &aSQL) { #ifndef BINFILE_ALWAYS_ACTIVE if (!binfilesActive()) { // substitute: %u = userkey StringSubst(aSQL,"%u",fUserKey,2,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // substitute: %d = devicekey StringSubst(aSQL,"%d",fDeviceKey,2,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); #ifdef SCRIPT_SUPPORT // substitute: %C = domain name (such as company selector) StringSubst(aSQL,"%C",fDomainName,2,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); #endif } #endif // not BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT // substitute %sv(sessionvarname) = session variable by name string::size_type i=0; while((i=aSQL.find("%sv(",i))!=string::npos) { string s; // skip lead-in string::size_type j=i+4; // find closing paranthesis string::size_type k = aSQL.find(")",j); if (k==string::npos) { i=j; continue; } // no closing paranthesis sInt32 m = k; // assume end of name is here // extract name s.assign(aSQL,j,m-j); // find session var with this name if (!fSessionScriptContextP) { i=j; continue; } TItemField *fldP = fSessionScriptContextP->getFieldOrVar( NULL, fSessionScriptContextP->getIdentifierIndex(OBJ_LOCAL,NULL,s.c_str(),s.size()) ); if (!fldP) { i=j; continue; } // field not found, no action // get field contents fldP->getAsString(s); // subsititute (starting with "%v(", ending with ")" ) aSQL.replace(i,k+1-i,s); i+=s.size(); } // substitute %p(mode,var_or_field[,dbfieldtype]) = map field to parameter // - as the only source of params in session-level SQL is the %p() sequence, we // can clear the list here (to make sure no param from another call remains active) // - if this is called from Datastore context, %p() sequences are already substituted, and // therefore no parameter list mixing will occur resetSQLParameterMaps(); i=0; while((i=aSQL.find("%p(",i))!=string::npos) { string::size_type n=3; // size of base sequence %p( if (!ParseParamSubst( aSQL,i,n, fParameterMaps, NULL #ifdef SCRIPT_SUPPORT ,fAgentContext #endif )) break; // subsititute param spec with single question mark aSQL.replace(i,n,"?"); i+=1; } #endif } // TODBCApiAgent::DoSQLSubstitutions // reset all mapped parameters void TODBCApiAgent::resetSQLParameterMaps(void) { resetSQLParameterMaps(fParameterMaps); } // TODBCApiAgent::resetSQLParameterMaps // add parameter definition to the session level parameter list void TODBCApiAgent::addSQLParameterMap( bool aInParam, bool aOutParam, TParamMode aParamMode, TItemField *aFieldP, TDBFieldType aDbFieldType ) { TParameterMap map; // assign basics map.inparam=aInParam; map.outparam=aOutParam; map.parammode=aParamMode; map.mybuffer=false; map.ParameterValuePtr=NULL; map.BufferLength=0; map.StrLen_or_Ind=SQL_NULL_DATA; // note that this is not zero (but -1) map.itemP=NULL; // no item map.fieldP=aFieldP; map.maxSize=std_paramsize; map.dbFieldType=aDbFieldType; map.outSiz=0; // save in list fParameterMaps.push_back(map); } // TODBCApiAgent::addSQLParameterMap // ODBC Utils // ========== #ifdef ODBCAPI_SUPPORT // get existing or create new ODBC environment handle SQLHENV TODBCApiAgent::getODBCEnvironmentHandle(void) { if (fODBCEnvironmentHandle==SQL_NULL_HANDLE) { // create one environment handle for the session if (SafeSQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &fODBCEnvironmentHandle ) != SQL_SUCCESS) { // problem throw TSyncException("Cannot allocated ODBC environment handle"); } // Set ODBC 3.0 (needed, else function sequence error will occur) if (SafeSQLSetEnvAttr( fODBCEnvironmentHandle, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0 ) != SQL_SUCCESS) { // problem throw TSyncException("Cannot set environment to ODBC 3.0"); } } // return the handle return fODBCEnvironmentHandle; } // TODBCApiAgent::getODBCEnvironmentHandle // check for connection-level error void TODBCApiAgent::checkConnectionError(SQLRETURN aResult) { checkODBCError(aResult,SQL_HANDLE_DBC,fODBCConnectionHandle); } // TODBCApiAgent::checkConnectionError // get handle to open connection SQLHDBC TODBCApiAgent::getODBCConnectionHandle(void) { SQLRETURN res; if (fODBCConnectionHandle==SQL_NULL_HANDLE) { // no connection exists, allocate new Connection Handle PDEBUGPRINTFX(DBG_DBAPI,("Trying to open new ODBC connection with ConnStr = '%s'",fSessionDBConnStr.c_str())); // - get environment handle (session global) SQLHENV envhandle=getODBCEnvironmentHandle(); if (envhandle==SQL_NULL_HANDLE) throw TSyncException("No environment handle available"); // - allocate connection handle res=SafeSQLAllocHandle( SQL_HANDLE_DBC, envhandle, &fODBCConnectionHandle ); checkODBCError(res,SQL_HANDLE_ENV,envhandle); try { // Some ODBC drivers (apparently MyODBC 3.51 on Mac OS X 10.5.2) crash when using SQLSetConnectAttr if (!fConfigP->fNoConnectAttrs) { // Set Connection attributes // - Make sure no dialog boxes are ever shown res=SafeSQLSetConnectAttr(fODBCConnectionHandle,SQL_ATTR_QUIET_MODE,NULL,0); checkConnectionError(res); // - Cursor library usage (default is NO) res=SafeSQLSetConnectAttr(fODBCConnectionHandle,SQL_ATTR_ODBC_CURSORS,(void*)(fConfigP->fUseCursorLib ? SQL_CUR_USE_ODBC : SQL_CUR_USE_DRIVER),0); checkConnectionError(res); // - Commit mode manually res=SafeSQLSetConnectAttr(fODBCConnectionHandle,SQL_ATTR_AUTOCOMMIT,(void*)SQL_AUTOCOMMIT_OFF,0); checkConnectionError(res); // - Set a timeout res=SafeSQLSetConnectAttr(fODBCConnectionHandle,SQL_ATTR_CONNECTION_TIMEOUT,(void*)fConfigP->fODBCTimeout,0); checkConnectionError(res); } // Now connect, before setting transaction stuff // - append password to configured connection string string connstr; connstr=fSessionDBConnStr.c_str(); if (!fSessionDBPassword.empty()) { connstr+="PWD="; connstr+=fSessionDBPassword; connstr+=';'; } const SQLSMALLINT outStrMax=1024; SQLCHAR outStr[outStrMax]; SQLSMALLINT outStrSiz; res=SafeSQLDriverConnect( fODBCConnectionHandle, // connection handle NULL, // no windows handle (SQLCHAR *)connstr.c_str(), // input string connstr.size(), outStr, // output string outStrMax, &outStrSiz, SQL_DRIVER_NOPROMPT ); checkConnectionError(res); // Note: the following may show the password, so it MUST NOT be a PDEBUGxxx, but a DEBUGxxx ! DEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQLDriverConnect returns connection string = '%s'",outStr)); // Now configure transactions #ifdef SYDEBUG if (PDEBUGMASK) { string msg,state; // - check what DB can offer for isolation levels SQLUINTEGER txnmask; res=SafeSQLGetInfo(fODBCConnectionHandle,SQL_TXN_ISOLATION_OPTION,&txnmask,0,NULL); if (getODBCError(res,msg,state,SQL_HANDLE_DBC,fODBCConnectionHandle)) { PDEBUGPRINTFX(DBG_ERROR,("SQLGetInfo for SQL_TXN_ISOLATION_OPTION failed: %s",msg.c_str())); } else { PDEBUGPRINTFX(DBG_DBAPI,("ODBC source's Transaction support mask = 0x%04lX",txnmask)); } // - check standard isolation level SQLUINTEGER txn; res=SafeSQLGetInfo(fODBCConnectionHandle,SQL_DEFAULT_TXN_ISOLATION,&txn,0,NULL); if (getODBCError(res,msg,state,SQL_HANDLE_DBC,fODBCConnectionHandle)) { DEBUGPRINTFX(DBG_ERROR,("SQLGetInfo for SQL_DEFAULT_TXN_ISOLATION failed: %s",msg.c_str())); } else { DEBUGPRINTF(("ODBC source's standard isolation mask = 0x%04lX",txn)); } } #endif // - set isolation level if (fConfigP->fODBCTxnMode!=txni_default) { SQLUINTEGER txnmode = 0; // none by default if (fConfigP->fODBCTxnModefODBCTxnMode); } PDEBUGPRINTFX(DBG_DBAPI,("Setting SQL_ATTR_TXN_ISOLATION to = 0x%04lX",txnmode)); res=SafeSQLSetConnectAttr(fODBCConnectionHandle,SQL_ATTR_TXN_ISOLATION,(void*)txnmode,0); checkConnectionError(res); } // done! PDEBUGPRINTFX(DBG_DBAPI,("Created and opened new ODBC connection (timeout=%ld sec)",fConfigP->fODBCTimeout)); #ifdef SCRIPT_SUPPORT // save datastore context (as this script can be executed implicitly from another scripts SQLEXECUTE()) TCustomImplDS *currScriptDS = fScriptContextDatastore; // now execute afterconnect script, if any fScriptContextDatastore=NULL; // connecting is not datastore related TScriptContext::execute( fAfterConnectContext, fConfigP->fAfterConnectScript, fConfigP->getAgentFuncTableP(), // context function table (void *)this // context data (myself) ); // restore datastore context as it was before fScriptContextDatastore = currScriptDS; #endif } catch(...) { // connection is not usable, dispose handle again SafeSQLFreeHandle(SQL_HANDLE_DBC,fODBCConnectionHandle); fODBCConnectionHandle=SQL_NULL_HANDLE; throw; } } PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Session: using connection handle 0x%lX",(uIntArch)fODBCConnectionHandle)); return fODBCConnectionHandle; } // TODBCApiAgent::getODBCConnectionHandle // pull connection handle out of session into another object (datastore) SQLHDBC TODBCApiAgent::pullODBCConnectionHandle(void) { #ifdef SCRIPT_SUPPORT // make sure possible script statement gets disposed, as connection will be owned by datastore from now on // Note: the script statement must be closed here already, because creating a new connection with getODBCConnectionHandle() // might trigger afterconnectscript, which in turn may use SQLEXECUTE() will ask for the current script statement. // If the script statement was not closed before that, SQLEXECUTE() would execute on the old statement and hence on // the old connection rather than on the new one. commitAndCloseScriptStatement(); #endif SQLHDBC connhandle = getODBCConnectionHandle(); fODBCConnectionHandle = SQL_NULL_HANDLE; // owner is caller, must do closing and disposing return connhandle; } // TODBCApiAgent::pullODBCConnectionHandle // close connection void TODBCApiAgent::closeODBCConnection(SQLHDBC &aConnHandle) { string msg,state; SQLRETURN res; if (aConnHandle!=SQL_NULL_HANDLE) { // Roll back to make sure we don't leave a unfinished transaction res=SafeSQLEndTran(SQL_HANDLE_DBC,aConnHandle,SQL_ROLLBACK); if (getODBCError(res,msg,state,SQL_HANDLE_DBC,aConnHandle)) { PDEBUGPRINTFX(DBG_ERROR,("closeODBCConnection: SQLEndTran failed: %s",msg.c_str())); } // Actually disconnect res=SQLDisconnect(aConnHandle); if (getODBCError(res,msg,state,SQL_HANDLE_DBC,aConnHandle)) { PDEBUGPRINTFX(DBG_ERROR,("closeODBCConnection: SQLDisconnect failed: %s",msg.c_str())); } // free the connection handle res=SafeSQLFreeHandle(SQL_HANDLE_DBC,aConnHandle); if (getODBCError(res,msg,state,SQL_HANDLE_DBC,aConnHandle)) { PDEBUGPRINTFX(DBG_ERROR,("closeODBCConnection: SQLFreeHandle(DBC) failed: %s",msg.c_str())); } aConnHandle=SQL_NULL_HANDLE; } } // TODBCApiAgent::closeODBCConnection // check if aResult signals error and throw exception if so void TODBCApiAgent::checkODBCError(SQLRETURN aResult,SQLSMALLINT aHandleType,SQLHANDLE aHandle) { string msg,state; if (getODBCError(aResult,msg,state,aHandleType,aHandle)) { // error throw TSyncException(msg.c_str()); } } // TODBCApiAgent::checkODBCError // - check if aResult signals error and throw exception if so void TODBCApiAgent::checkStatementError(SQLRETURN aResult,SQLHSTMT aHandle) { checkODBCError(aResult,SQL_HANDLE_STMT,aHandle); } // TODBCApiAgent::checkStatementError // - check if aResult signals error and throw exception if so // does not report NO_DATA error, but returns false if NO_DATA condition exists bool TODBCApiAgent::checkStatementHasData(SQLRETURN aResult,SQLHSTMT aHandle) { if (aResult==SQL_NO_DATA) return false; // signal NO DATA else checkStatementError(aResult,aHandle); return true; // signal ok } // TODBCApiAgent::checkStatementHasData // get ODBC error message for given result code // - returns false if no error bool TODBCApiAgent::getODBCError(SQLRETURN aResult,string &aMessage,string &aSQLState, SQLSMALLINT aHandleType,SQLHANDLE aHandle) { aSQLState.erase(); if(aResult==SQL_SUCCESS) return false; // no error else { StringObjPrintf(aMessage,"ODBC SQL return code = %ld\n",(sInt32)aResult); // get Diag Info SQLCHAR sqlstate[6]; // buffer for state message sqlstate[5]=0; // terminate SQLINTEGER nativeerror; SQLSMALLINT msgsize,recno; SQLRETURN res; recno=1; // message buffer sInt16 maxmsgsize = 200; SQLCHAR *messageP = (SQLCHAR *) malloc(maxmsgsize); do { if (messageP==NULL) { StringObjAppendPrintf(aMessage,"- SQLGetDiagRec[%hd] failed because needed buffer of %ld bytes cannot be allocated",(sInt16)recno,(sInt32)maxmsgsize); break; // don't continue } msgsize=0; // just to make sure res=SQLGetDiagRec( aHandleType, // handle Type aHandle, // statement handle recno, // record number sqlstate, // state buffer &nativeerror, // native error code messageP, // message buffer, gets message maxmsgsize, // message buffer size &msgsize // gets size of message buffer ); if (res==SQL_NO_DATA) break; // seen all diagnostic info if (res==SQL_SUCCESS_WITH_INFO) { if (msgsize>maxmsgsize) { // buffer is too small, allocate a bigger one and try again free(messageP); maxmsgsize=msgsize+1; // make buffer large enough for message messageP = (SQLCHAR *) malloc(maxmsgsize); // try again continue; } // SQL_SUCCESS_WITH_INFO, but buffer is large enough - strange... StringObjAppendPrintf(aMessage,"- SQLGetDiagRec[%hd] said SQL_SUCCESS_WITH_INFO, but buffer is large enough\n",(sInt16)recno); } // info found, append it to error text message else if (res==SQL_SUCCESS) { StringObjAppendPrintf(aMessage,"- SQLState = '%s', NativeError=%ld, Message = %s\n",sqlstate,(sInt32)nativeerror,messageP); // save latest SQLState aSQLState.assign((const char *)sqlstate,5); } else { StringObjAppendPrintf(aMessage,"- SQLGetDiagRec[%hd] failed, Result=%ld\n",(sInt16)recno,(sInt32)res); break; // abort on error, too } recno++; } while(true); // get rid of message buffer free(messageP); // if it's success with Info, this is not considered an error, but do show info in log if (aResult==SQL_SUCCESS_WITH_INFO) { // show info as exotics in debug logs, but treat as success // (note: MS-SQL is verbose here...) PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQL_SUCCESS_WITH_INFO: %s",aMessage.c_str())); return false; // this is no error } else { return true; // treat as error error } } } // TODBCApiAgent::getODBCError // get new statement handle SQLHSTMT TODBCApiAgent::newStatementHandle(SQLHDBC aConnection) { SQLRETURN res; SQLHSTMT statement; // Allocate Statement Handle res=SafeSQLAllocHandle(SQL_HANDLE_STMT,aConnection,&statement); checkODBCError(res,SQL_HANDLE_DBC,aConnection); // Statement Attributes // - row array size (ODBC 3.0, not really needed as default is 1 anyway) res=SQLSetStmtAttr( statement, SQL_ATTR_ROW_ARRAY_SIZE, (void*)1, SQL_IS_UINTEGER ); checkStatementError(res,statement); return statement; } // TODBCApiAgent::newStatementHandle /* About SQLGetData from WIN32_SDK: If the driver does not support extensions to SQLGetData, the function can only return data for unbound columns with a number greater than that of the last bound column. Furthermore, within a row of data, the value of the ColumnNumber argument in each call to SQLGetData must be greater than or equal to the value of ColumnNumber in the previous call; that is, data must be retrieved in increasing column number order. Finally, if no extensions are supported, SQLGetData cannot be called if the rowset size is greater than 1. */ // get value, returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsULong( SQLHSTMT aStatement, sInt16 aColNumber, uInt32 &aLongValue ) { SQLRETURN res; SQLINTEGER ind; SQLSMALLINT numcols; // check if there aColNumber is in range res = SafeSQLNumResultCols(aStatement,&numcols); checkStatementError(res,aStatement); if (aColNumber<1 || aColNumber>numcols) throw TSyncException(DEBUGTEXT("getColumnValueAsULong with bad col index","odds1")); aLongValue=0; res = SafeSQLGetData( aStatement, // statement handle aColNumber, // column number SQL_C_ULONG, // target type: unsigned long &aLongValue, // where to store the long 4, // max size of value (not used here) (SQLLEN*)&ind // indicator ); checkStatementError(res,aStatement); // return true if real data returned return (ind!=SQL_NULL_DATA && ind!=SQL_NO_TOTAL); } // TODBCApiAgent::getColumnValueAsULong // get value, returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsLong( SQLHSTMT aStatement, sInt16 aColNumber, sInt32 &aLongValue ) { SQLRETURN res; SQLINTEGER ind; SQLSMALLINT numcols; // check if there aColNumber is in range res = SafeSQLNumResultCols(aStatement,&numcols); checkStatementError(res,aStatement); if (aColNumber<1 || aColNumber>numcols) throw TSyncException(DEBUGTEXT("getColumnValueAsLong with bad col index","odds2")); aLongValue=0; res = SafeSQLGetData( aStatement, // statement handle aColNumber, // column number SQL_C_LONG, // target type: signed long &aLongValue, // where to store the long 4, // max size of value (not used here) (SQLLEN*)&ind // indicator ); checkStatementError(res,aStatement); // return true if real data returned return (ind!=SQL_NULL_DATA && ind!=SQL_NO_TOTAL); } // TODBCApiAgent::getColumnValueAsLong // get value, returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsDouble( SQLHSTMT aStatement, sInt16 aColNumber, double &aDoubleValue ) { SQLRETURN res; SQLINTEGER ind; SQLSMALLINT numcols; // check if there aColNumber is in range res = SafeSQLNumResultCols(aStatement,&numcols); checkStatementError(res,aStatement); if (aColNumber<1 || aColNumber>numcols) throw TSyncException(DEBUGTEXT("getColumnValueAsDouble with bad col index","odds3")); aDoubleValue=0; res = SafeSQLGetData( aStatement, // statement handle aColNumber, // column number SQL_C_DOUBLE, // target type: signed long &aDoubleValue, // where to store the double 8, // max size of value (not used here) (SQLLEN*)&ind // indicator ); checkStatementError(res,aStatement); // return true if real data returned return (ind!=SQL_NULL_DATA && ind!=SQL_NO_TOTAL); } // TODBCApiAgent::getColumnValueAsDouble // get value, returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsString( SQLHSTMT aStatement, sInt16 aColNumber, string &aStringValue, TCharSets aCharSet, // real charset, including UTF16! bool aAsBlob ) { SQLRETURN res; sInt32 maxstringlen=512; // enough to start with for most fields sInt32 nextbuflen; uInt8 *strbufP=NULL; SQLINTEGER siz; SQLSMALLINT numcols; bool gotData=false; #ifdef ODBC_UNICODE string wStr; #endif // check if there aColNumber is in range res = SafeSQLNumResultCols(aStatement,&numcols); checkStatementError(res,aStatement); if (aColNumber<1 || aColNumber>numcols) throw TSyncException(DEBUGTEXT("getColumnValueAsString with bad col index","odds4")); // get data // - start with empty string aStringValue.erase(); strbufP = new uInt8[maxstringlen+1]; try { bool gotAllData=false; do { // make sure we have the buffer if (!strbufP) throw TSyncException(DEBUGTEXT("getColumnValueAsString can't allocate enough buffer memory","odds4a")); strbufP[maxstringlen]=0; // make sure we have ALWAYS a terminator (for appendStringAsUTF8) nextbuflen=maxstringlen; // default to same size we already have // now get data res = SafeSQLGetData( aStatement, // statement handle aColNumber, // column number aAsBlob ? SQL_C_BINARY : #ifdef ODBC_UNICODE (aCharSet==chs_utf16 ? SQL_C_WCHAR : SQL_C_CHAR), // target type: Binary, 8-bit or 16-bit string #else SQL_C_CHAR, // no 16-bit chars #endif strbufP, // where to store the data maxstringlen, // max size of string (SQLLEN*)&siz // returns real remaining size of data (=what we got in this call + what still remains to be fetched) ); if (res==SQL_NO_DATA) { // no (more) data gotAllData=true; break; } if (res!=SQL_SUCCESS && res!=SQL_SUCCESS_WITH_INFO) { checkStatementError(res,aStatement); break; } // determine size if (siz==SQL_NULL_DATA) { // NULL data gotAllData=true; break; } else if (siz==SQL_NO_TOTAL) { // we do not know how much is remaining, so it's certainly at least a full buffer PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQLGetData returned SQL_NO_TOTAL and %ld bytes of data",maxstringlen)); siz=maxstringlen; nextbuflen=maxstringlen*2; // suggest next buffer twice as big as current one } else { // what we get is either the rest or a full buffer if (siz>maxstringlen) { PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQLGetData returned %ld bytes of %ld total remaining",maxstringlen,siz)); // that's how much we need for the remaining data. Plus one to avoid extra loop // at end for drivers that do not return state '01004' nextbuflen=siz-maxstringlen+1; // that's how much we got this time: one buffer full siz=maxstringlen; } } gotData=true; // not NULL // now copy data if (res==SQL_SUCCESS_WITH_INFO) { // probably data truncated string msg,sqlstate; getODBCError(res,msg,sqlstate,SQL_HANDLE_STMT,aStatement); if (sqlstate=="01004") { // data truncated. PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQLGetData returns state '01004' (truncated) -> more data to be fetched")); // - do not yet exit loop gotAllData=false; // not all... gotData=true; // ...but some } else { // otherwise treat as success PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQLGetData returns state '%s' -> ignore",sqlstate.c_str())); res=SQL_SUCCESS; } } if (res==SQL_SUCCESS) { // it seems that not all drivers return SQL_SUCCESS_WITH_INFO when there is more data to read // so only stop reading here already if we haven't got one buffer full. Otherwise, // loop one more time to try getting more. We'll get SQL_NULL_DATA or SQL_NO_DATA then and exit the loop. if (siz try to get more",(uInt32)siz)); } } // copy what we already have if (aAsBlob) aStringValue.append((const char *)strbufP,siz); // assign all data 1:1 to string #ifdef ODBC_UNICODE else if (aCharSet==chs_utf16) wStr.append((const char *)strbufP,siz); // assign all data 1:1 to wide string buffer, will be converted later #endif else appendStringAsUTF8((const char *)strbufP, aStringValue, aCharSet, lem_cstr); // Convert to app-charset (UTF8) and C-type lineends // get a bigger buffer in case there's more to fetch and we haven't got 64k already if (!gotAllData) { if (maxstringlen<65536 && nextbuflen>maxstringlen) { // we could need a larger buffer maxstringlen = nextbuflen>65536 ? 65536 : nextbuflen; delete [] strbufP; strbufP = new uInt8[maxstringlen+1]; PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Allocating bigger buffer for next call to SQLGetData: %ld bytes",(uInt32)maxstringlen)); } } } while(!gotAllData); // done, we don't need the buffer any more delete [] strbufP; } catch (...) { // clean up buffer delete [] strbufP; throw; } // convert from Unicode to UTF-8 if we got unicode here #ifdef ODBC_UNICODE if (aCharSet==chs_utf16) { appendUTF16AsUTF8((const uInt16 *)wStr.c_str(), wStr.size()/2, ODBC_BIGENDIAN, aStringValue, true, false); } #endif // done return gotData; } // TODBCApiAgent::getColumnValueAsString // returns true if successfully and filled aODBCTimestamp bool TODBCApiAgent::getColumnAsODBCTimestamp( SQLHSTMT aStatement, sInt16 aColNumber, SQL_TIMESTAMP_STRUCT &aODBCTimestamp ) { SQLRETURN res; SQLINTEGER ind; SQLSMALLINT numcols; // check if there aColNumber is in range res = SafeSQLNumResultCols(aStatement,&numcols); checkStatementError(res,aStatement); if (aColNumber<1 || aColNumber>numcols) throw TSyncException(DEBUGTEXT("getColumnAsODBCTimestamp with bad col index","odds5")); // get data res = SafeSQLGetData( aStatement, // statement handle aColNumber, // column number SQL_C_TYPE_TIMESTAMP, // target type: timestamp &aODBCTimestamp, // where to store the timestamp 0, // n/a (SQLLEN*)&ind // returns indication if NULL ); checkStatementError(res,aStatement); // return true if data filled in return (ind!=SQL_NULL_DATA && ind!=SQL_NO_TOTAL); } // TODBCApiAgent::getColumnAsODBCTimestamp // get value (UTC timestamp), returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsTimestamp( SQLHSTMT aStatement, sInt16 aColNumber, lineartime_t &aTimestamp ) { SQL_TIMESTAMP_STRUCT odbctimestamp; if (getColumnAsODBCTimestamp(aStatement,aColNumber,odbctimestamp)) { // there is a timestamp DEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,( "ODBCTimestamp: %04hd-%02hd-%02hd %02hd:%02hd:%02hd.%03ld", odbctimestamp.year,odbctimestamp.month,odbctimestamp.day, odbctimestamp.hour,odbctimestamp.minute,odbctimestamp.second, odbctimestamp.fraction / 1000000 )); aTimestamp = date2lineartime(odbctimestamp.year,odbctimestamp.month,odbctimestamp.day) + time2lineartime(odbctimestamp.hour,odbctimestamp.minute,odbctimestamp.second, odbctimestamp.fraction / 1000000); return true; } // no data aTimestamp=0; return false; } // TODBCApiAgent::getColumnValueAsTimestamp // get value, returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsTime( SQLHSTMT aStatement, sInt16 aColNumber, lineartime_t &aTime ) { SQL_TIMESTAMP_STRUCT odbctimestamp; if (getColumnAsODBCTimestamp(aStatement,aColNumber,odbctimestamp)) { // there is a timestamp aTime = time2lineartime( odbctimestamp.hour, odbctimestamp.minute, odbctimestamp.second, odbctimestamp.fraction / 1000000 ); return true; } // no data aTime=0; return false; } // TODBCApiAgent::getColumnValueAsTime // get value, returns false if no Data or Null bool TODBCApiAgent::getColumnValueAsDate( SQLHSTMT aStatement, sInt16 aColNumber, lineartime_t &aDate ) { SQL_TIMESTAMP_STRUCT odbctimestamp; if (getColumnAsODBCTimestamp(aStatement,aColNumber,odbctimestamp)) { // there is a timestamp aDate = date2lineartime( odbctimestamp.year, odbctimestamp.month, odbctimestamp.day ); return true; } // no data aDate=0; return false; } // TODBCApiAgent::getColumnValueAsDate // get column value as database field bool TODBCApiAgent::getColumnValueAsField( SQLHSTMT aStatement, sInt16 aColIndex, TDBFieldType aDbfty, TItemField *aFieldP, TCharSets aDataCharSet, timecontext_t aTimecontext, bool aMoveToUserContext ) { string val; lineartime_t ts, basedate=0; // no base date yet sInt32 dbts; timecontext_t tctx = TCTX_UNKNOWN; sInt16 moffs=0; sInt32 i=0; double hrs=0; bool notnull=false; // default to empty // get pointer if assigning into timestamp field TTimestampField *tsfP = NULL; if (aFieldP->isBasedOn(fty_timestamp)) { tsfP = static_cast(aFieldP); } // field available in multifielditem switch (aDbfty) { case dbft_uctoffsfortime_hours: notnull=getColumnValueAsDouble(aStatement,aColIndex,hrs); if (!notnull) goto assignzone; // assign TCTX_UNKNOWN moffs=(sInt16)(hrs*MinsPerHour); // convert to minutes goto assignoffs; case dbft_uctoffsfortime_mins: notnull=getColumnValueAsLong(aStatement,aColIndex,i); if (!notnull) goto assignzone; // assign TCTX_UNKNOWN moffs=i; // these are minutes goto assignoffs; case dbft_uctoffsfortime_secs: notnull=getColumnValueAsLong(aStatement,aColIndex,i); if (!notnull) goto assignzone; // assign TCTX_UNKNOWN moffs = i / SecsPerMin; goto assignoffs; case dbft_zonename: // get zone name as string notnull=getColumnValueAsString(aStatement,aColIndex,val,aDataCharSet, lem_cstr); if (!notnull) goto assignzone; // assign TCTX_UNKNOWN // convert to context TimeZoneNameToContext(val.c_str(), tctx, getSessionZones(), true); goto assignzone; assignoffs: tctx = TCTX_MINOFFSET(moffs); assignzone: // zone works only for timestamps // - move to new zone or assign zone if timestamp is still empty or floating if (tsfP) { // first move to original context (to compensate for possible move to // fUserTimeContext done when reading timestamp with aMoveToUserContext) // Note: this is important for cases where the new zone is floating or dateonly // Note: if timestamp field had the "f" flag, it is still floating here, and will not be // moved to non-floating aTimecontext(=DB context) here. tsfP->moveToContext(aTimecontext,false); // now move to specified zone, or assign zone if timestamp is still floating here tsfP->moveToContext(tctx,true); } break; case dbft_lineardate: case dbft_unixdate_s: case dbft_unixdate_ms: case dbft_unixdate_us: notnull=getColumnValueAsLong(aStatement,aColIndex,dbts); if (notnull) ts=dbIntToLineartime(dbts,aDbfty); goto dateonly; case dbft_dateonly: case dbft_date: notnull=getColumnValueAsDate(aStatement,aColIndex,ts); dateonly: tctx = TCTX_UNKNOWN | TCTX_DATEONLY; // dates are always floating goto assignval; case dbft_timefordate: // get base date used to build up datetime if (tsfP) { basedate = tsfP->getTimestampAs(TCTX_UNKNOWN); // unconverted, as-is } // otherwise handle like time case dbft_time: notnull=getColumnValueAsTime(aStatement,aColIndex,ts); // combine with date ts+=basedate; goto assigntimeval; case dbft_timestamp: notnull=getColumnValueAsTimestamp(aStatement,aColIndex,ts); goto assigntimeval; case dbft_lineartime: case dbft_unixtime_s: case dbft_nsdate_s: case dbft_unixtime_ms: case dbft_unixtime_us: notnull=getColumnValueAsLong(aStatement,aColIndex,dbts); if (notnull) ts=dbIntToLineartime(dbts,aDbfty); assigntimeval: // time values will be put into aTimecontext (usually , but can // be TCTX_UNKNOWN for field explicitly marked floating in DB with tctx = aTimecontext; assignval: // something convertible to lineartime_t if (notnull) { // first, if output in user zone is selected, move timestamp to user zone // Note: before moving to a field-specific zone, this will be reverted such that // field-specific TZ=DATE conversion will be done in the original (DB) TZ context if (aMoveToUserContext) { if (TzConvertTimestamp(ts,tctx,fUserTimeContext,getSessionZones())) tctx = fUserTimeContext; // moved to user zone } // now store in item field if (tsfP) { // assign timestamp and context passed (TCTX_UNKNOWN for floating) tsfP->setTimestampAndContext(ts,tctx); } else { // destination is NOT timestamp, assign ISO date/time string, // either UTC or qualified with local zone offset bool dateonly = aDbfty==dbft_date || aDbfty==dbft_dateonly; tctx = dateonly ? TCTX_UNKNOWN | TCTX_DATEONLY : aTimecontext; // - aWithTime, NOT aAsUTC, aWithOffset, offset, NOT aShowOffset TimestampToISO8601Str(val, ts, tctx, false, false); aFieldP->setAsString(val.c_str()); } } else aFieldP->assignEmpty(); // NULL value: not assigned break; case dbft_blob: // Database field is BLOB, assign it to item as binary string if ((notnull=getColumnValueAsString(aStatement,aColIndex,val,chs_unknown,true))) aFieldP->setAsString(val.c_str(),val.size()); else aFieldP->assignEmpty(); // NULL value: not assigned break; case dbft_string: case dbft_numeric: default: // Database field is string (or unknown), assign to item as string if ((notnull=getColumnValueAsString(aStatement,aColIndex,val,aDataCharSet))) aFieldP->setAsString(val.c_str()); else aFieldP->assignEmpty(); // NULL value: not assigned break; } // switch return notnull; } // TODBCApiAgent::getColumnValueAsField // bind parameters (and values for IN-Params) to the statement void TODBCApiAgent::bindSQLParameters( TSyncSession *aSessionP, SQLHSTMT aStatement, TParameterMapList &aParamMapList, // the list of mapped parameters TCharSets aDataCharSet, TLineEndModes aDataLineEndMode ) { SQLSMALLINT valueType,paramType; SQLUSMALLINT paramNo=1; SQLUINTEGER colSiz; string s1,s2; TParameterMapList::iterator pos; bool copyvalue; for (pos=aParamMapList.begin();pos!=aParamMapList.end();++pos) { // bind parameter to statement copyvalue=false; colSiz=std_paramsize; switch (pos->parammode) { case param_localid_str: case param_localid_int: case param_remoteid_str: case param_remoteid_int: pos->StrLen_or_Ind=0; // no size indication known yet // a item id, always as string valueType=SQL_C_CHAR; // but column could also be integer paramType=pos->parammode==param_localid_int || pos->parammode==param_remoteid_int ? SQL_INTEGER : SQL_VARCHAR; // get input value (if any) if (pos->inparam) { if (pos->itemP) { // item available pos->ParameterValuePtr=(void *)( pos->parammode==param_localid_str || pos->parammode==param_localid_int ? pos->itemP->getLocalID() : pos->itemP->getRemoteID() ); } else { // no item pos->ParameterValuePtr=(void *)""; // empty value } pos->StrLen_or_Ind = strlen((const char *)pos->ParameterValuePtr); // actual length } // maximum value size pos->BufferLength=std_paramsize+1; // %%% fixed value for ids, should be enough for all cases colSiz=std_paramsize; break; case param_field: pos->StrLen_or_Ind=0; // no size indication known for field yet (for buffer we use predefined values) case param_buffer: // determine value type and pointer switch (pos->dbFieldType) { case dbft_numeric: valueType=SQL_C_CHAR; paramType=SQL_INTEGER; break; case dbft_blob: valueType=SQL_C_BINARY; paramType=SQL_LONGVARBINARY; break; case dbft_string: default: #ifdef ODBC_UNICODE if (aDataCharSet==chs_utf16) { // 16-bit string valueType=SQL_C_WCHAR; paramType=SQL_WVARCHAR; } else #endif { // 8-bit string valueType=SQL_C_CHAR; paramType=SQL_VARCHAR; } break; } // that's all for param with already prepared buffer if (pos->parammode==param_buffer) break; // get maximum value size colSiz=pos->maxSize; if (pos->maxSize==0) { // no max size specified colSiz=std_paramsize; // default to standard size } // %%%no longer, we calc it below now%%% pos->BufferLength=colSiz+1; if (pos->inparam) { if (pos->fieldP) { // get actual value to pass as param into string s2 switch (pos->dbFieldType) { default: case dbft_string: case dbft_numeric: // get as app string pos->fieldP->getAsString(s1); // convert to database string s2.erase(); #ifdef ODBC_UNICODE if (aDataCharSet==chs_utf16) { // 16-bit string appendUTF8ToUTF16ByteString( s1.c_str(), s2, ODBC_BIGENDIAN, aDataLineEndMode, pos->maxSize // max size (0 = unlimited) ); } else #endif // ODBC_UNICODE { // 8-bit string appendUTF8ToString( s1.c_str(), s2, aDataCharSet, aDataLineEndMode, qm_none, // no quoting needed pos->maxSize // max size (0 = unlimited) ); } break; case dbft_blob: #ifndef _MSC_VER // does not understand warnings #warning "maybe we should store blobs using SQLPutData and SQL_DATA_AT_EXEC mode" #endif // get as unconverted binary chunk if (pos->fieldP->isBasedOn(fty_blob)) static_cast(pos->fieldP)->getBlobAsString(s2); else pos->fieldP->getAsString(s2); break; } // switch // s2 now contains the value pos->ParameterValuePtr=(void *)s2.c_str(); // value // default to full length of input string pos->StrLen_or_Ind=s2.size(); // size pos->BufferLength=s2.size(); // default to as long as string is // limit to max size if (pos->maxSize!=0 && pos->maxSizeBufferLength=pos->maxSize; pos->StrLen_or_Ind=pos->maxSize; } // expand buffer to colsiz if input is larger than default column size if (colSizBufferLength) colSiz=pos->BufferLength; // buffer for output must be at least colsiz (which is maxsize, or std_paramsize if no maxsize specified) if (pos->outparam) { // input/output param, make buffer minimally as large as indicated by colsiz if (pos->BufferLengthBufferLength=colSiz; } // plus one for terminator pos->BufferLength+=1; copyvalue=true; // we need to copy it } // if field } // if inparam break; } // switch parammode // if this is an out param, create a buffer of BufferLength if (pos->parammode!=param_buffer) { if (pos->outparam || copyvalue) { // create buffer void *bP = sysync_malloc(pos->BufferLength); pos->mybuffer=true; // this is now a buffer allocated by myself if (pos->inparam) { // init buffer with input value memcpy(bP,pos->ParameterValuePtr,pos->StrLen_or_Ind+1); } // pass buffer, not original value pos->ParameterValuePtr = bP; // make sure buffer contains a NUL terminator *((uInt8 *)bP+pos->StrLen_or_Ind)=0; } if (pos->outparam && !pos->inparam) pos->StrLen_or_Ind=SQL_NULL_DATA; // out only has no indicator for input } // now actually bind to parameter POBJDEBUGPRINTFX(aSessionP,DBG_DBAPI+DBG_EXOTIC,( "SQLBind: sizeof(SQLLEN)=%d, sizeof(SQLINTEGER)=%d, paramNo=%hd, in=%d, out=%d, parammode=%hd, valuetype=%hd, paramtype=%hd, lenorind=%d, valptr=%X, bufsiz=%d, maxcol=%d, colsiz=%d", sizeof(SQLLEN), sizeof(SQLINTEGER), // to debug, as there can be problematic 32bit/64bit mismatches between these (uInt16)paramNo, (int)pos->inparam, (int)pos->outparam, (uInt16)(pos->outparam ? (pos->inparam ? SQL_PARAM_INPUT_OUTPUT : SQL_PARAM_OUTPUT ) : SQL_PARAM_INPUT), // type of param (uInt16)valueType, (uInt16)paramType, (int)pos->StrLen_or_Ind, pos->ParameterValuePtr, (int)pos->BufferLength, (int)pos->maxSize, (int)colSiz )); /* SQLRETURN SQL_API SQLBindParameter( SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT fParamType, SQLSMALLINT fCType, SQLSMALLINT fSqlType, SQLULEN cbColDef, SQLSMALLINT ibScale, SQLPOINTER rgbValue, SQLLEN cbValueMax, SQLLEN *pcbValue); */ SQLRETURN res=SQLBindParameter( aStatement, paramNo, // parameter number pos->outparam ? (pos->inparam ? SQL_PARAM_INPUT_OUTPUT : SQL_PARAM_OUTPUT ) : SQL_PARAM_INPUT, // type of param valueType, // value type: how we want it represented paramType, // parameter type (integer or char) (colSiz==0 ? 1 : colSiz), // column size, relevant for char parameter only (must never be 0, even for zero length input-only params) 0, // decimal digits pos->ParameterValuePtr, // parameter value pos->BufferLength, // value buffer size (for output params) &(pos->StrLen_or_Ind) // length or indicator ); checkStatementError(res,aStatement); // next param paramNo++; } // for all parametermaps } // TODBCApiAgent::bindSQLParameters // save out parameter values and clean up void TODBCApiAgent::saveAndCleanupSQLParameters( TSyncSession *aSessionP, SQLHSTMT aStatement, TParameterMapList &aParamMapList, // the list of mapped parameters TCharSets aDataCharSet, TLineEndModes aDataLineEndMode ) { SQLUSMALLINT paramNo=1; string s,s2; TParameterMapList::iterator pos; for (pos=aParamMapList.begin();pos!=aParamMapList.end();++pos) { // save output parameter value if (pos->outparam) { switch (pos->parammode) { case param_localid_str: case param_localid_int: case param_remoteid_str: case param_remoteid_int: // id output params are always strings POBJDEBUGPRINTFX(aSessionP,DBG_DBAPI+DBG_EXOTIC,( "Postprocessing Item ID param: in=%d, out=%d, lenorind=%ld, valptr=%lX, bufsiz=%ld", (int)pos->inparam, (int)pos->outparam, pos->StrLen_or_Ind, pos->ParameterValuePtr, pos->BufferLength )); /* Note: len or ind does not contain a useful value DEBUGPRINTFX(DBG_DBAPI,("%%%% saving remote or localid out param: len=%ld, '%s'",pos->StrLen_or_Ind, s.c_str())); if (pos->StrLen_or_Ind==SQL_NULL_DATA || pos->StrLen_or_Ind==SQL_NO_TOTAL) s.erase(); else s.assign((const char *)pos->ParameterValuePtr,pos->StrLen_or_Ind); */ // SQL_C_CHAR is null terminated, so just assign s=(const char *)pos->ParameterValuePtr; // assign to item if (pos->itemP) { if (pos->parammode==param_localid_str || pos->parammode==param_localid_int) pos->itemP->setLocalID(s.c_str()); else pos->itemP->setRemoteID(s.c_str()); } break; case param_buffer: // buffer will be processed externally if (pos->outSiz) { if (pos->StrLen_or_Ind==SQL_NULL_DATA || pos->StrLen_or_Ind==SQL_NO_TOTAL) *(pos->outSiz) = 0; // no output else *(pos->outSiz) = pos->StrLen_or_Ind; // indicate how much is in buffer } case param_field: // get value field if (pos->fieldP) { POBJDEBUGPRINTFX(aSessionP,DBG_DBAPI+DBG_EXOTIC,( "Postprocessing field param: in=%d, out=%d, lenorind=%ld, valptr=%lX, bufsiz=%ld", (int)pos->inparam, (int)pos->outparam, pos->StrLen_or_Ind, pos->ParameterValuePtr, pos->BufferLength )); // check for NULL if (pos->StrLen_or_Ind==SQL_NULL_DATA || pos->StrLen_or_Ind==SQL_NO_TOTAL) pos->fieldP->assignEmpty(); // NULL is empty else { // save value according to type switch (pos->dbFieldType) { default: case dbft_string: case dbft_numeric: // get as db string /* Note: len or ind does not contain a useful value DEBUGPRINTFX(DBG_DBAPI,("%%%% saving remote or localid out param: len=%ld, '%s'",pos->StrLen_or_Ind, s.c_str())); if (pos->StrLen_or_Ind==SQL_NULL_DATA || pos->StrLen_or_Ind==SQL_NO_TOTAL) s.erase(); else s.assign((const char *)pos->ParameterValuePtr,pos->StrLen_or_Ind); */ #ifdef ODBC_UNICODE if (aDataCharSet==chs_utf16) { // SQL_C_WCHAR is null terminated, so just assign appendUTF16AsUTF8( (const uInt16 *)pos->ParameterValuePtr, pos->StrLen_or_Ind, // num of 16-bit chars ODBC_BIGENDIAN, s2, true, // convert line ends false // no filemaker CRs ); } else #endif { // SQL_C_CHAR is null terminated, so just assign s=(const char *)pos->ParameterValuePtr; // convert to app string s2.erase(); appendStringAsUTF8( (const char *)s.c_str(), s2, aDataCharSet, aDataLineEndMode ); } pos->fieldP->setAsString(s2); break; case dbft_blob: // save as it comes from DB pos->fieldP->setAsString((const char *)pos->ParameterValuePtr,pos->StrLen_or_Ind); break; } // switch } // if not NULL } // if field break; } // switch parammode } // if outparam // if there is a buffer, free it if (pos->mybuffer && pos->ParameterValuePtr) { // delete buffer if we have allocated one sysync_free(pos->ParameterValuePtr); pos->ParameterValuePtr=NULL; pos->mybuffer=false; } // next param paramNo++; } // for all parametermaps } // TODBCApiAgent::saveAndCleanupSQLParameters // Parameter handling for session level statements // bind parameters (and values for IN-Params) to the statement void TODBCApiAgent::bindSQLParameters( SQLHSTMT aStatement ) { bindSQLParameters( this, aStatement, fParameterMaps, fConfigP->fDataCharSet, fConfigP->fDataLineEndMode ); } // TODBCApiAgent::bindSQLParameters // save out parameter values and clean up void TODBCApiAgent::saveAndCleanupSQLParameters( SQLHSTMT aStatement ) { saveAndCleanupSQLParameters( this, aStatement, fParameterMaps, fConfigP->fDataCharSet, fConfigP->fDataLineEndMode ); } // TODBCApiAgent::bindSQLParameters #endif // ODBCAPI_SUPPORT // SQLite utils // ============ #ifdef SQLITE_SUPPORT // get SQLite error message for given result code // - returns false if no error bool TODBCApiAgent::getSQLiteError(int aRc,string &aMessage, sqlite3 *aDb) { if (aRc == SQLITE_OK || aRc == SQLITE_ROW) return false; // no error StringObjPrintf(aMessage,"SQLite Error %d : %s",aRc,aDb==NULL ? "" : sqlite3_errmsg(aDb)); return true; } // getSQLiteError // check if aResult signals error and throw exception if so void TODBCApiAgent::checkSQLiteError(int aRc, sqlite3 *aDb) { string msg; if (getSQLiteError(aRc,msg,aDb)) { // error throw TSyncException(msg.c_str()); } } // TODBCApiAgent::checkSQLiteError // - check if aRc signals error and throw exception if so // returns true if data available, false if not bool TODBCApiAgent::checkSQLiteHasData(int aRc, sqlite3 *aDb) { if (aRc==SQLITE_DONE) return false; // signal NO DATA else if (aRc==SQLITE_ROW) return true; // signal data else checkSQLiteError(aRc,aDb); return true; // signal ok } // TODBCApiAgent::checkStatementHasData // get column value from SQLite result bool TODBCApiAgent::getSQLiteColValueAsField( sqlite3_stmt *aStatement, sInt16 aColIndex, TDBFieldType aDbfty, TItemField *aFieldP, TCharSets aDataCharSet, timecontext_t aTimecontext, bool aMoveToUserContext ) { string val; lineartime_t ts; timecontext_t tctx = TCTX_UNKNOWN; sInt16 moffs=0; size_t siz; double hrs=0; // get pointer if assigning into timestamp field TTimestampField *tsfP = NULL; if (aFieldP->isBasedOn(fty_timestamp)) { tsfP = static_cast(aFieldP); } // determine if NULL bool notnull=sqlite3_column_type(aStatement,aColIndex)!=SQLITE_NULL; // if column is not null // field available in multifielditem switch (aDbfty) { case dbft_uctoffsfortime_hours: if (!notnull) goto assignzone; // assign TCTX_UNKNOWN hrs = sqlite3_column_double(aStatement,aColIndex); moffs=(sInt16)(hrs*MinsPerHour); // convert to minutes goto assignoffs; case dbft_uctoffsfortime_mins: if (!notnull) goto assignzone; // assign TCTX_UNKNOWN moffs = sqlite3_column_int(aStatement,aColIndex); goto assignoffs; case dbft_uctoffsfortime_secs: if (!notnull) goto assignzone; // assign TCTX_UNKNOWN moffs = sqlite3_column_int(aStatement,aColIndex); moffs /= SecsPerMin; goto assignoffs; case dbft_zonename: if (!notnull) goto assignzone; // assign TCTX_UNKNOWN // get zone name as string appendStringAsUTF8((const char *)sqlite3_column_text(aStatement,aColIndex), val, aDataCharSet, lem_cstr); // convert to context TimeZoneNameToContext(val.c_str(), tctx, getSessionZones(), true); goto assignzone; assignoffs: tctx = TCTX_MINOFFSET(moffs); assignzone: // zone works only for timestamps // - move to new zone or assign zone if timestamp is still empty or floating if (tsfP) { // first move to original context (to compensate for possible move to // fUserTimeContext done when reading timestamp with aMoveToUserContext) // Note: this is important for cases where the new zone is floating or dateonly // Note: if timestamp field had the "f" flag, it is still floating here, and will not be // moved to non-floating aTimecontext(=DB context) here. tsfP->moveToContext(aTimecontext,false); // now move to specified zone, or assign zone if timestamp is still floating here tsfP->moveToContext(tctx,true); } break; case dbft_lineardate: case dbft_unixdate_s: case dbft_unixdate_ms: case dbft_unixdate_us: if (notnull) ts = dbIntToLineartime(sqlite3_column_int64(aStatement,aColIndex),aDbfty); tctx = TCTX_UNKNOWN | TCTX_DATEONLY; // dates are always floating goto assignval; case dbft_lineartime: case dbft_unixtime_s: case dbft_nsdate_s: case dbft_unixtime_ms: case dbft_unixtime_us: if (notnull) ts = dbIntToLineartime(sqlite3_column_int64(aStatement,aColIndex),aDbfty); // time values will be put into aTimecontext (usually , but can // be TCTX_UNKNOWN for field explicitly marked floating in DB with tctx = aTimecontext; assignval: // something convertible to lineartime_t if (notnull) { // first, if output in user zone is selected, move timestamp to user zone // Note: before moving to a field-specific zone, this will be reverted such that // field-specific TZ=DATE conversion will be done in the original (DB) TZ context if (aMoveToUserContext) { if (TzConvertTimestamp(ts,tctx,fUserTimeContext,getSessionZones())) tctx = fUserTimeContext; // moved to user zone } // now store in item field if (tsfP) { // assign timestamp and context (TCTX_UNKNOWN for floating) tsfP->setTimestampAndContext(ts,tctx); } else { // destination is NOT timestamp, assign ISO date/time string, // either UTC or qualified with local zone offset bool dateonly = aDbfty==dbft_date || aDbfty==dbft_dateonly; tctx = dateonly ? TCTX_UNKNOWN | TCTX_DATEONLY : aTimecontext; // - aWithTime, NOT aAsUTC, aWithOffset, offset, NOT aShowOffset TimestampToISO8601Str(val, ts, tctx, false, false); aFieldP->setAsString(val.c_str()); } } else aFieldP->assignEmpty(); // NULL value: not assigned break; case dbft_blob: // Database field is BLOB, assign it to item as binary string siz=0; if (notnull) { siz = sqlite3_column_bytes(aStatement,aColIndex); } if (siz>0) aFieldP->setAsString((cAppCharP)sqlite3_column_blob(aStatement,aColIndex),siz); else aFieldP->assignEmpty(); // NULL or empty value: not assigned break; case dbft_string: case dbft_numeric: default: // Database field is string (or unknown), assign to item as string if (notnull) { appendStringAsUTF8((const char *)sqlite3_column_text(aStatement,aColIndex), val, aDataCharSet, lem_cstr); // Convert to app-charset (UTF8) and C-type lineends aFieldP->setAsString(val.c_str()); } else aFieldP->assignEmpty(); // NULL value: not assigned break; } // switch return notnull; } // TODBCApiAgent::getSQLiteColValueAsField // - prepare SQLite statement void TODBCApiAgent::prepareSQLiteStatement( cAppCharP aSQL, sqlite3 *aDB, sqlite3_stmt *&aStatement ) { const char *sqltail; // discard possibly existing one if (aStatement) { sqlite3_finalize(aStatement); aStatement=NULL; } // make new one #if (SQLITE_VERSION_NUMBER>=3003009) // use new recommended v2 call with SQLite >=3.3.9 int rc = sqlite3_prepare_v2( aDB, /* Database handle */ aSQL, /* SQL statement, UTF-8 encoded */ -1, /* null terminated string */ &aStatement, /* OUT: Statement handle */ &sqltail /* OUT: Pointer to unused portion of zSql */ ); #else // use now deprecated call for older SQLite3 version compatibility int rc = sqlite3_prepare( aDB, /* Database handle */ aSQL, /* SQL statement, UTF-8 encoded */ -1, /* null terminated string */ &aStatement, /* OUT: Statement handle */ &sqltail /* OUT: Pointer to unused portion of zSql */ ); #endif checkSQLiteError(rc,aDB); } // TODBCApiAgent::prepareSQLiteStatement // bind parameter values to the statement (only IN-params for strings and BLOBs are supported at all) void TODBCApiAgent::bindSQLiteParameters( TSyncSession *aSessionP, sqlite3_stmt *aStatement, TParameterMapList &aParamMapList, // the list of mapped parameters TCharSets aDataCharSet, TLineEndModes aDataLineEndMode ) { string s1,s2; TParameterMapList::iterator pos; int paramno=1; int rc; for (pos=aParamMapList.begin();pos!=aParamMapList.end();++pos) { // bind parameter to statement rc=SQLITE_OK; if (pos->inparam) { // SQLite only supports input params switch (pos->parammode) { case param_field: if (pos->fieldP) { // get actual value to pass as param into string s2 switch (pos->dbFieldType) { default: case dbft_string: case dbft_numeric: // get as app string pos->fieldP->getAsString(s1); // convert to database string s2.erase(); appendUTF8ToString( s1.c_str(), s2, aDataCharSet, aDataLineEndMode, qm_none, // no quoting needed pos->maxSize // max size (0 = unlimited) ); // s2 is on the stack and will be deallocated on routine exit rc=sqlite3_bind_text(aStatement,paramno++,s2.c_str(),s2.size(),SQLITE_TRANSIENT); break; case dbft_blob: // get as unconverted binary chunk if (pos->fieldP->isBasedOn(fty_blob)) { void *ptr; size_t sz; static_cast(pos->fieldP)->getBlobDataPtrSz(ptr,sz); // BLOB buffer remains static as until statement is finalized rc=sqlite3_bind_blob(aStatement,paramno++,ptr,sz,SQLITE_STATIC); } else { pos->fieldP->getAsString(s2); // s2 is on the stack and will be deallocated on routine exit rc=sqlite3_bind_blob(aStatement,paramno++,s2.c_str(),s2.size(),SQLITE_TRANSIENT); } break; } // switch } // if field break; case param_buffer: // we already have buffer pointers switch (pos->dbFieldType) { default: case dbft_string: case dbft_numeric: // external buffer remains stable until statement finalizes rc=sqlite3_bind_text(aStatement,paramno++,(const char *)pos->ParameterValuePtr,pos->StrLen_or_Ind,SQLITE_STATIC); break; case dbft_blob: // external buffer remains stable until statement finalizes rc=sqlite3_bind_blob(aStatement,paramno++,pos->ParameterValuePtr,pos->StrLen_or_Ind,SQLITE_STATIC); break; } // switch break; case param_localid_int: case param_localid_str: case param_remoteid_int: case param_remoteid_str: // invalid break; } // switch parammode if (rc==SQLITE_OK) { POBJDEBUGPRINTFX(aSessionP,DBG_DBAPI+DBG_EXOTIC,( "Bound Param #%d to SQLite statement", paramno )); } else { } } // if inparam else { POBJDEBUGPRINTFX(aSessionP,DBG_ERROR,("SQLite only supports IN params")); } } // for all parametermaps } // TODBCApiAgent::bindSQLiteParameters #endif // SQLITE_SUPPORT // Session level DB access // ======================= #ifdef ODBCAPI_SUPPORT // get database time lineartime_t TODBCApiAgent::getDatabaseNowAs(timecontext_t aTimecontext) { lineartime_t now; if (fConfigP->fGetCurrentDateTimeSQL.empty()) { return inherited::getDatabaseNowAs(aTimecontext); // just use base class' implementation } else { // query database for current time SQLRETURN res; SQLHSTMT statement=newStatementHandle(getODBCConnectionHandle()); try { // issue PDEBUGPUTSX(DBG_DBAPI,"SQL for getting current date/time:"); PDEBUGPUTSX(DBG_DBAPI,fConfigP->fGetCurrentDateTimeSQL.c_str()); TP_DEFIDX(li); TP_SWITCH(li,fTPInfo,TP_database); res = SafeSQLExecDirect( statement, (SQLCHAR *)fConfigP->fGetCurrentDateTimeSQL.c_str(), SQL_NTS ); TP_START(fTPInfo,li); checkStatementError(res,statement); // - fetch result row res=SafeSQLFetch(statement); if (!checkStatementHasData(res,statement)) throw TSyncException("no data getting date/time from database"); // get datetime (in database time context) if (!getColumnValueAsTimestamp(statement,1,now)) throw TSyncException("bad data getting date/time from database"); SafeSQLCloseCursor(statement); // dispose statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); } catch (...) { // dispose statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); throw; } // convert to requested zone TzConvertTimestamp(now,fConfigP->fCurrentDateTimeZone,aTimecontext,getSessionZones(),TCTX_UNKNOWN); return now; } } // TODBCApiAgent::getDatabaseNowAs #ifdef SYSYNC_SERVER // info about requested auth type TAuthTypes TODBCApiAgent::requestedAuthType(void) { TAuthTypes auth = TSyncAgent::requestedAuthType(); // make sure that we don't request MD5 if we cannot check it: // either we need plain text passwords in the DB or SyncML V1.1 MD5 schema if (auth==auth_md5 && fSyncMLVersionfClearTextPw) { PDEBUGPRINTFX(DBG_ADMIN,("Switching down to Basic Auth because server cannot check pre-V1.1 MD5")); auth=auth_basic; // force basic auth, this can be checked } return auth; } // TODBCApiAgent::requestedAuthType // %%% note: make the following available in clients as well if they support more than // pseudo-auth by local config (that is, real nonce is needed) // - get nonce string, which is expected to be used by remote party for MD5 auth. void TODBCApiAgent::getAuthNonce(const char *aDeviceID, string &aAuthNonce) { if (!aDeviceID || fConfigP->fSaveNonceSQL.empty()) { // no device ID or no persistent nonce, use method of ancestor TStdLogicAgent::getAuthNonce(aDeviceID,aAuthNonce); } else { // we have a persistent nonce DEBUGPRINTFX(DBG_ADMIN,("getAuthNonce: current auth nonce='%s'",fLastNonce.c_str())); aAuthNonce=fLastNonce.c_str(); } } // TODBCApiAgent::getAuthNonce // get next nonce (to be sent to remote party) void TODBCApiAgent::getNextNonce(const char *aDeviceID, string &aNextNonce) { SQLRETURN res; SQLHSTMT statement; string sql; if (fConfigP->fSaveNonceSQL.empty()) { // no persistent nonce, use method of ancestor TStdLogicAgent::getNextNonce(aDeviceID,aNextNonce); } else { // we have persistent nonce, create a new one and save it // - create one (pure 7bit ASCII) generateNonce(aNextNonce,aDeviceID,getSystemNowAs(TCTX_UTC)+rand()); // - save it try { statement=newStatementHandle(getODBCConnectionHandle()); try { // get SQL sql = fConfigP->fSaveNonceSQL; // - substitute: %N = new nonce StringSubst(sql,"%N",aNextNonce,2,chs_ascii,lem_none,fConfigP->fQuotingMode); // - standard substitutions: %u=userkey, %d=devicekey resetSQLParameterMaps(); DoSQLSubstitutions(sql); bindSQLParameters(statement); // - issue PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,"SQL for saving nonce"); PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,sql.c_str()); TP_DEFIDX(li); TP_SWITCH(li,fTPInfo,TP_database); res = SafeSQLExecDirect( statement, (SQLCHAR *)sql.c_str(), SQL_NTS ); TP_START(fTPInfo,li); checkStatementError(res,statement); saveAndCleanupSQLParameters(statement); // commit saved nonce SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); } // try catch (exception &e) { // release the statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_ROLLBACK); throw; } } catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,("Failed saving nonce: %s",e.what())); aNextNonce=fLastNonce; // return last nonce again } } } // TODBCApiAgent::getNextNonce #endif // SYSYNC_SERVER #ifdef HAS_SQL_ADMIN // cleanup what is needed after login void TODBCApiAgent::LoginCleanUp(void) { SQLRETURN res; try { // close the transaction as well if (fODBCConnectionHandle!=SQL_NULL_HANDLE) { res=SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_ROLLBACK); checkODBCError(res,SQL_HANDLE_DBC,getODBCConnectionHandle()); } } catch (exception &e) { // log error PDEBUGPRINTFX(DBG_ERROR,("TODBCApiAgent::LoginCleanUp: Exception: %s",e.what())); } } // TODBCApiAgent::LoginCleanUp // check device related stuff void TODBCApiAgent::CheckDevice(const char *aDeviceID) { // first let ancestor if (!fConfigP->fGetDeviceSQL.empty()) { SQLRETURN res; SQLHSTMT statement; string sql; statement=newStatementHandle(getODBCConnectionHandle()); try { bool creatednew=false; do { // get SQL sql = fConfigP->fGetDeviceSQL; // substitute: %D = deviceID StringSubst(sql,"%D",aDeviceID,2,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // issue PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,"SQL for getting device key (and last nonce sent to device)"); PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,sql.c_str()); TP_DEFIDX(li); TP_SWITCH(li,fTPInfo,TP_database); res = SafeSQLExecDirect( statement, (SQLCHAR *)sql.c_str(), SQL_NTS ); TP_START(fTPInfo,li); checkStatementHasData(res,statement); // - fetch result row res=SafeSQLFetch(statement); if (!checkStatementHasData(res,statement)) { if (creatednew) { throw TSyncException("Fatal: inserted device record cannot be found again"); } PDEBUGPRINTFX(DBG_ADMIN,("Unknown device '%.30s', creating new record",aDeviceID)); if (IS_SERVER) { #ifdef SYSYNC_SERVER // device does not exist yet fLastNonce.erase(); #endif } // create new device SafeSQLCloseCursor(statement); // - get SQL sql = fConfigP->fNewDeviceSQL; string dk; // temp device key // - substitute: %D = deviceID StringSubst(sql,"%D",aDeviceID,2,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // - issue PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,"SQL for inserting new device (and last nonce sent to device)"); PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,sql.c_str()); TP_DEFIDX(li); TP_SWITCH(li,fTPInfo,TP_database); res = SafeSQLExecDirect( statement, (SQLCHAR *)sql.c_str(), SQL_NTS ); TP_START(fTPInfo,li); checkStatementError(res,statement); // commit new device SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); // try again to get device key creatednew=true; continue; } else { // device exists, read key and nonce #ifdef SCRIPT_SUPPORT fUnknowndevice=false; // we have seen it once before at least #endif // - device key getColumnValueAsString(statement,1,fDeviceKey,chs_ascii); // - nonce if (IS_CLIENT) { string dummy; getColumnValueAsString(statement,2,dummy,chs_ascii); } else { #ifdef SYSYNC_SERVER getColumnValueAsString(statement,2,fLastNonce,chs_ascii); #endif } // - done for now SafeSQLCloseCursor(statement); PDEBUGPRINTFX(DBG_ADMIN,("Device '%.30s' found, fDeviceKey='%.30s'",aDeviceID,fDeviceKey.c_str())); if (IS_SERVER) { #ifdef SYSYNC_SERVER DEBUGPRINTFX(DBG_ADMIN,("Last nonce saved for device='%.30s'",fLastNonce.c_str())); #endif } break; } } while (true); // do until device found or created new } // try catch (...) { // release the statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_ROLLBACK); throw; } // release the statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); } // if device table implemented } // TODBCApiAgent::CheckDevice // check credential string bool TODBCApiAgent::CheckLogin(const char *aOriginalUserName, const char *aModifiedUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID) { bool authok = false; string nonce; SQLRETURN res; SQLHSTMT statement; // - if no userkey query, we cannot proceed and must fail auth now if (fConfigP->fUserKeySQL.empty()) return false; // - get nonce (if we have a device table, we should have read it by now) if (aAuthStringType==sectyp_md5_V10 || aAuthStringType==sectyp_md5_V11) getAuthNonce(aDeviceID,nonce); // - try to obtain an appropriate user key statement=newStatementHandle(getODBCConnectionHandle()); try { // get SQL string sql = fConfigP->fUserKeySQL; string uk; // temp user key // substitute: %U = original username as sent by remote, // %dU = username modified for DB search, // %M = authstring, %N = Nonce string StringSubst(sql,"%U",aOriginalUserName,2,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); StringSubst(sql,"%dU",aModifiedUserName,3,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // %%% probably obsolete StringSubst(sql,"%M",aAuthString,2,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); StringSubst(sql,"%N",nonce,2,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // now do the standard stuff resetSQLParameterMaps(); DoSQLSubstitutions(sql); bindSQLParameters(statement); // issue PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,"SQL for getting user key (and password/md5userpass if not checked in query):"); PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,sql.c_str()); TP_DEFIDX(li); TP_SWITCH(li,fTPInfo,TP_database); res = SafeSQLExecDirect( statement, (SQLCHAR *)sql.c_str(), SQL_NTS ); TP_START(fTPInfo,li); checkStatementHasData(res,statement); saveAndCleanupSQLParameters(statement); // - fetch result row res=SafeSQLFetch(statement); if (fConfigP->fClearTextPw || fConfigP->fMD5UserPass) { authok=false; // go though all returned rows until match (same username might be used with 2 different pws) while (checkStatementHasData(res,statement)) { // read in ascending index order!! string secret; SQLSMALLINT col=1; // - user key getColumnValueAsString(statement,col,uk,chs_ascii); col++; #ifdef SCRIPT_SUPPORT TItemField *hfP; // also store it in first local context var if (fAgentContext) { hfP=fAgentContext->getLocalVar(0); if (hfP) hfP->setAsString(uk.c_str()); } #endif // also store it in fUserKey already for USERKEY() function fUserKey=uk; // - password or md5userpass getColumnValueAsString(statement,col,secret,chs_ascii); // - convert from hex to b64 if needed if (fConfigP->fMD5UPAsHex && secret.size()>=32) { uInt8 md5[16]; cAppCharP p=secret.c_str(); for (int k=0; k<16; k++) { uInt16 h; if (HexStrToUShort(p+(k*2),h,2)<2) break; md5[k]=(uInt8)h; } p = b64::encode(&md5[0],16); secret = p; // save converted string b64::free((void *)p); } col++; #ifdef SCRIPT_SUPPORT // also store it in second local context var if (fAgentContext) { hfP=fAgentContext->getLocalVar(1); if (hfP) hfP->setAsString(secret.c_str()); // if result set has more columns, save them as well SQLSMALLINT numcols; // - get number of columns res = SafeSQLNumResultCols(statement,&numcols); checkStatementError(res,statement); // - save remaining columns into defined variables while (col<=numcols) { // check if enough variables if (col>fAgentContext->getNumLocals()) break; // get variable hfP=fAgentContext->getLocalVar(col-1); if (!hfP) break; // timestamp is special if (hfP->getType()==fty_timestamp) { // get as timestamp lineartime_t ts; if (!getColumnValueAsTimestamp(statement,col,ts)) break; static_cast(hfP)->setTimestampAndContext(ts,fConfigP->fCurrentDateTimeZone); } else { // get and assign as string string v; if (!getColumnValueAsString(statement,col,v,chs_ascii)) break; hfP->setAsString(v.c_str()); } col++; } } #endif // make standard auth check if (fConfigP->fClearTextPw) { // we have the clear text password, check against what was transmitted from remote authok=checkAuthPlain(aOriginalUserName,secret.c_str(),nonce.c_str(),aAuthString,aAuthStringType); } else { // whe have the MD5 of user:password, check against what was transmitted from remote // Note: this can't work with non-V1.1 type creds authok=checkAuthMD5(aOriginalUserName,secret.c_str(),nonce.c_str(),aAuthString,aAuthStringType); } #ifdef SCRIPT_SUPPORT // if there is a script, call it to perform decision // - refresh auth status fStandardAuthOK=authok; // for AUTHOK() func // - call script (if any) fScriptContextDatastore=NULL; authok=TScriptContext::executeTest( authok, // default for no script, no result or script error is current auth fAgentContext, fConfigP->fLoginCheckScript, fConfigP->getAgentFuncTableP(), // context function table (void *)this // context data (myself) ); #endif if (authok) break; // found, authorized // fetch next res=SafeSQLFetch(statement); } } else { // AuthString was checked in SQL query // - no record found -> no auth if (res==SQL_NO_DATA) authok=false; } if (authok) { // now assign user key fUserKey=uk; PDEBUGPRINTFX(DBG_ADMIN,("Auth successful, fUserKey='%s'",fUserKey.c_str())); } else { // we do not have a valid user key fUserKey.erase(); } } catch (...) { // release the statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_ROLLBACK); throw; } // release the statement handle SafeSQLCloseCursor(statement); SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); // return auth status return authok; } // TODBCApiAgent::CheckLogin // do something with the analyzed data void TODBCApiAgent::remoteAnalyzed(void) { SQLRETURN res; SQLHSTMT statement; string sql; // call ancestor first inherited::remoteAnalyzed(); if (!fConfigP->fSaveInfoSQL.empty()) { // save info string statement=newStatementHandle(getODBCConnectionHandle()); try { // get SQL sql = fConfigP->fSaveInfoSQL; // %nR Remote name: [Manufacturer ]Model") StringSubst(sql,"%nR",getRemoteDescName(),3,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // %vR Remote Device Version Info ("Type (HWV, FWV, SWV) Oem") StringSubst(sql,"%vR",getRemoteInfoString(),3,-1,fConfigP->fDataCharSet,fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // - standard substitutions: %u=userkey, %d=devicekey resetSQLParameterMaps(); DoSQLSubstitutions(sql); bindSQLParameters(statement); // - issue PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,"SQL for saving device info"); PDEBUGPUTSX(DBG_ADMIN+DBG_DBAPI,sql.c_str()); TP_DEFIDX(li); TP_SWITCH(li,fTPInfo,TP_database); res = SafeSQLExecDirect( statement, (SQLCHAR *)sql.c_str(), SQL_NTS ); TP_START(fTPInfo,li); checkStatementError(res,statement); saveAndCleanupSQLParameters(statement); // commit new device SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); } // try catch (exception &e) { // release the statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_ROLLBACK); PDEBUGPRINTFX(DBG_ERROR,("Failed saving device info: %s",e.what())); } } } // TODBCApiAgent::remoteAnalyzed #endif // HAS_SQL_ADMIN #endif // ODBCAPI_SUPPORT #ifdef SYSYNC_SERVER void TODBCApiAgent::RequestEnded(bool &aHasData) { // first let ancestors finish their stuff inherited::RequestEnded(aHasData); #ifdef ODBCAPI_SUPPORT // now close the ODBC connection if there is one left at the session level // and no script statement is still unfinished #ifdef SCRIPT_SUPPORT if (!fScriptStatement) #endif { closeODBCConnection(fODBCConnectionHandle); } #endif } // TODBCApiAgent::RequestEnded #endif // SYSYNC_SERVER // factory methods of Agent config // =============================== #ifdef SYSYNC_CLIENT TSyncAgent *TOdbcAgentConfig::CreateClientSession(const char *aSessionID) { // return appropriate client session MP_RETURN_NEW(TODBCApiAgent,DBG_HOT,"TODBCApiAgent",TODBCApiAgent(getSyncAppBase(),NULL,aSessionID)); } // TOdbcAgentConfig::CreateClientSession #endif #ifdef SYSYNC_SERVER TSyncAgent *TOdbcAgentConfig::CreateServerSession(TSyncSessionHandle *aSessionHandle, const char *aSessionID) { // return XML2GO or ODBC-server session MP_RETURN_NEW(TODBCApiAgent,DBG_HOT,"TODBCApiAgent",TODBCApiAgent(getSyncAppBase(),aSessionHandle,aSessionID)); } // TOdbcAgentConfig::CreateServerSession #endif } // namespace sysync /* end of TODBCApiAgent implementation */ #endif // SQL_SUPPORT // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/odbcapiagent.h0000755000373300037200000004606212424517753030165 0ustar00nightlyallusers00000000000000/** * @File odbcapiagent.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TODBCApiAgent * ODBC based agent (client or server session) implementation * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-10-06 : luz : created from odbcdbagent */ #ifdef SQL_SUPPORT #ifndef ODBCAPIAGENT_H #define ODBCAPIAGENT_H // includes #ifdef SQLITE_SUPPORT #include "sqlite3.h" #endif #include "odbcdb.h" #include "customimplagent.h" #include "customimplds.h" #include "multifielditem.h" #include "scriptcontext.h" using namespace sysync; namespace sysync { // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL // - execute SQL command int execSQL(int argc, const char *argv[]); #endif // SYSYNC_TOOL #ifdef SCRIPT_SUPPORT // publish as derivates might need it extern const TFuncTable ODBCAgentFuncTable; // publish as ODBCDBDatastore uses this (chains back to Datastore level funcs) extern const TFuncTable ODBCDSFuncTable1; #endif // supported transaction isolation levels typedef enum { // Note: these MUST be in the same order as // Win32/ODBC defined SQL_TXN_READ_UNCOMMITTED..SQL_TXN_SERIALIZABLE // bits appear in the transaction bitmasks. txni_uncommitted, // read uncommitted (dirty reads possible) txni_committed, // read committed only txni_repeatable, // repeatable txni_serializable, // no dirty reads, repeatable, no phantoms // special values txni_none, // no transactions txni_default // default of data source } TTxnIsolModes; const sInt16 numTxnIsolModes = txni_default-txni_uncommitted+1; // standard size for parameter buffers if not specified const size_t std_paramsize = 512; // parameter value type typedef enum { param_field, param_localid_str, param_localid_int, param_remoteid_str, param_remoteid_int, param_buffer } TParamMode; // parameter mapping entry typedef struct { // parameter specification bool inparam; bool outparam; TParamMode parammode; // value source/target TDBFieldType dbFieldType; // field info for param_field TItemField *fieldP; size_t maxSize; TMultiFieldItem *itemP; // can be null if no item available // size info for param_buffer uInt32 *outSiz; // Parameter value buffer bool mybuffer; #ifdef ODBCAPI_SUPPORT SQLPOINTER ParameterValuePtr; SQLLEN BufferLength; SQLLEN StrLen_or_Ind; #elif defined(SQLITE_SUPPORT) appPointer ParameterValuePtr; memSize BufferLength; memSize StrLen_or_Ind; #endif } TParameterMap; // parameter mapping list typedef std::list TParameterMapList; #ifdef WIN32 // windows, has SEH, leave it on (unless set by target options etc.) #else // non-windows, no SEH anyway #define NO_AV_GUARDING #endif #ifdef ODBCAPI_SUPPORT #if defined(NO_AV_GUARDING) // || __option(microsoft_exceptions) // SEH is on (or we can't catch AV at all), we don't need extra crash-guarding #define SafeSQLAllocHandle SQLAllocHandle #define SafeSQLFreeHandle SQLFreeHandle #define SafeSQLSetEnvAttr SQLSetEnvAttr #define SafeSQLSetConnectAttr SQLSetConnectAttr #define SafeSQLConnect SQLConnect #define SafeSQLDriverConnect SQLDriverConnect #define SafeSQLGetInfo SQLGetInfo #define SafeSQLEndTran SQLEndTran #define SafeSQLExecDirect SQLExecDirect #define SafeSQLFetch SQLFetch #define SafeSQLNumResultCols SQLNumResultCols #define SafeSQLGetData SQLGetData #define SafeSQLCloseCursor SQLCloseCursor #ifdef ODBC_UNICODE #define SafeSQLExecDirectW SQLExecDirectW #endif #else // special exception for SEH class TODBCSEHexception : public TSyncException { typedef TSyncException inherited; public: TODBCSEHexception(uInt32 aCode); }; // TODBCSEHexception // prototypes SQLRETURN SafeSQLAllocHandle( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE * OutputHandlePtr); SQLRETURN SafeSQLFreeHandle( SQLSMALLINT HandleType, SQLHANDLE Handle); SQLRETURN SafeSQLSetEnvAttr( SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength); SQLRETURN SafeSQLSetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength); SQLRETURN SafeSQLConnect( SQLHDBC ConnectionHandle, SQLCHAR * ServerName, SQLSMALLINT NameLength1, SQLCHAR * UserName, SQLSMALLINT NameLength2, SQLCHAR * Authentication, SQLSMALLINT NameLength3); SQLRETURN SafeSQLDriverConnect( SQLHDBC ConnectionHandle, SQLHWND WindowHandle, SQLCHAR * InConnectionString, SQLSMALLINT StringLength1, SQLCHAR * OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT * StringLength2Ptr, SQLUSMALLINT DriverCompletion); SQLRETURN SafeSQLGetInfo( SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr, SQLSMALLINT BufferLength, SQLSMALLINT * StringLengthPtr); SQLRETURN SafeSQLEndTran( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType); SQLRETURN SafeSQLExecDirect( SQLHSTMT StatementHandle, SQLCHAR * StatementText, SQLINTEGER TextLength); #ifdef ODBC_UNICODE SQLRETURN SafeSQLExecDirectW( SQLHSTMT StatementHandle, SQLWCHAR * StatementText, SQLINTEGER TextLength); #endif SQLRETURN SafeSQLFetch( SQLHSTMT StatementHandle); SQLRETURN SafeSQLNumResultCols( SQLHSTMT StatementHandle, SQLSMALLINT * ColumnCountPtr); SQLRETURN SafeSQLGetData( SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValuePtr, SQLINTEGER BufferLength, SQLLEN * StrLen_or_IndPtr); SQLRETURN SafeSQLCloseCursor( SQLHSTMT StatementHandle); #endif #endif // ODBCAPI_SUPPORT // ODBC Utils // - return quoted version of string if aDoQuote is set const char *quoteString(string &aIn, string &aOut, TQuotingModes aQuoteMode); const char *quoteString(const char *aIn, string &aOut, TQuotingModes aQuoteMode); void quoteStringAppend(string &aIn, string &aOut, TQuotingModes aQuoteMode); void quoteStringAppend(const char *aIn, string &aOut, TQuotingModes aQuoteMode); // forward class TODBCDSConfig; #ifdef SCRIPT_SUPPORT class TScriptContext; #endif class TOdbcAgentConfig : public TCustomAgentConfig { typedef TCustomAgentConfig inherited; public: TOdbcAgentConfig(TConfigElement *aParentElement); virtual ~TOdbcAgentConfig(); // properties #ifdef ODBCAPI_SUPPORT // - ODBC datasource string fDataSource; #ifdef SCRIPT_SUPPORT // - scripts string fAfterConnectScript; // called after opening an ODBC connection #endif // - Server username / password string fUsername; string fPassword; // - connection string string fDBConnStr; // - preventing use of SQLSetConnectAttr (for drivers that crash when using it) bool fNoConnectAttrs; // - timeout sInt32 fODBCTimeout; // - transaction isolation mode sInt16 fODBCTxnMode; // - cursor library usage bool fUseCursorLib; // - statements to maintain device table string fGetDeviceSQL; // if set, fGetDeviceSQL must return device key and last saved nonce string fNewDeviceSQL; // create new device entry string fSaveNonceSQL; // save nonce into existing device entry string fSaveInfoSQL; // save extra device info string fSaveDevInfSQL; // save device information (such as name) into existing device entry string fLoadDevInfSQL; // load cached device information from DB // - statement to obtain user key (and password if fClearTextPw) from Database // replacements: %U=username, %M=user:pw: MD5 string fUserKeySQL; bool fClearTextPw; // if set, fUserKeySQL must return clear text PW in second column. bool fMD5UserPass; // if set, fUserKeySQL must return MD5B64("user:password") or HEX(MD5("user:password"))in second column. bool fMD5UPAsHex; // if set, format expected from DB is a hex string (not B64) // - statement to obtain database server's date and time (if none, local time is used) string fGetCurrentDateTimeSQL; // - statement to save log info string fWriteLogSQL; #endif // ODBCAPI_SUPPORT // - Literal string quoting mode TQuotingModes fQuotingMode; #ifdef SCRIPT_SUPPORT // provided to allow derivates to add API specific script functions to scripts called from customagent virtual const TFuncTable *getAgentFuncTableP(void) { return &ODBCAgentFuncTable; }; #endif protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void clear(); virtual void localResolve(bool aLastPass); #ifdef SCRIPT_SUPPORT virtual void ResolveAPIScripts(void); #endif #ifdef SYSYNC_CLIENT // create appropriate session (=agent) for this client virtual TSyncAgent *CreateClientSession(const char *aSessionID); #endif public: #ifdef SYSYNC_SERVER // create appropriate session (=agent) for this server virtual TSyncAgent *CreateServerSession(TSyncSessionHandle *aSessionHandle, const char *aSessionID); #endif }; // TOdbcAgentConfig class TODBCApiDS; class TODBCApiAgent: public TCustomImplAgent { friend class TODBCCommonFuncs; friend class TODBCAgentFuncs; typedef TCustomImplAgent inherited; public: TODBCApiAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID); virtual ~TODBCApiAgent(); virtual void TerminateSession(void); // Terminate session, like destructor, but without actually destructing object itself virtual void ResetSession(void); // Resets session (but unlike TerminateSession, session might be re-used) void InternalResetSession(void); // static implementation for calling through virtual destructor and virtual ResetSession(); #ifdef HAS_SQL_ADMIN // Note: %%% for now, login is supported by ODBC only // user authentication #ifdef SYSYNC_SERVER // - return auth type to be requested from remote virtual TAuthTypes requestedAuthType(void); // avoids MD5 when it cannot be checked // - get next nonce string top be sent to remote party for subsequent MD5 auth virtual void getNextNonce(const char *aDeviceID, string &aNextNonce); // - get nonce string, which is expected to be used by remote party for MD5 auth. virtual void getAuthNonce(const char *aDeviceID, string &aAuthNonce); #endif // SYSYNC_SERVER // - clean up after all login activity is over (including finishscript) virtual void LoginCleanUp(void); #endif // HAS_SQL_ADMIN #ifdef ODBCAPI_SUPPORT // current date & time virtual lineartime_t getDatabaseNowAs(timecontext_t aTimecontext); #endif // SQL generic // - do substitutions (%x-type) in a SQL string void DoSQLSubstitutions(string &aSQL); // Parameter handling // - reset all mapped parameters void resetSQLParameterMaps(void); // - add parameter definition to the session level parameter list void addSQLParameterMap( bool aInParam, bool aOutParam, TParamMode aParamMode, TItemField *aFieldP, TDBFieldType aDbFieldType ); #ifdef ODBCAPI_SUPPORT // ODBC SQLHENV getODBCEnvironmentHandle(void); // - get handle to open connection (open it if not already open) SQLHDBC getODBCConnectionHandle(void); // - pull (=take ownership of) connection handle out of session into another object (datastore) SQLHDBC pullODBCConnectionHandle(void); // - check for connection-level error void checkConnectionError(SQLRETURN aResult); #endif // ODBCAPI_SUPPORT // SQL based agent config TOdbcAgentConfig *fConfigP; // %%% Script statement is always defined, as we need it as dummy even in SQLite only case for now #ifdef SCRIPT_SUPPORT HSTMT fScriptStatement; #endif // SQL generic utils // - make ODBC string from field bool appendFieldValueLiteral( TItemField &aField,TDBFieldType aDBFieldType, uInt32 aMaxSize, string &aSQL, TCharSets aDataCharSet, TLineEndModes aDataLineEndMode, TQuotingModes aQuotingMode, timecontext_t aTimeContext, sInt32 &aRecordSize ); // - make ODBC string literal from UTF8 string void stringToODBCLiteralAppend( cAppCharP aText, string &aLiteral, TCharSets aCharSet, TLineEndModes aLineEndMode, TQuotingModes aQuotingMode, size_t aMaxBytes=0 ); // - make ODBC date/time literals from lineartime_t void lineartimeToODBCLiteralAppend( lineartime_t aTimestamp, string &aString, bool aWithDate, bool aWithTime, timecontext_t aTsContext=TCTX_UNKNOWN, timecontext_t aDBContext=TCTX_UNKNOWN ); // - make integer-based literals from lineartime_t void lineartimeToIntLiteralAppend( lineartime_t aTimestamp, string &aString, TDBFieldType aDbfty, timecontext_t aTsContext=TCTX_UNKNOWN, timecontext_t aDBContext=TCTX_UNKNOWN ); /* obsolete // - make ODBC date/time literal from timestamp void timeStampToODBCLiteralAppend(lineartime_t aTimeStamp, string &aString, bool aAsUTC, bool aWithDate, bool aWithTime); // - make ODBC date/time literal from struct tm void tmToODBCLiteralAppend(const struct tm &tim, string &aString, bool aWithDate, bool aWithTime); */ #ifdef ODBCAPI_SUPPORT // ODBC utils // - commit and close possibly open script statement void commitAndCloseScriptStatement(void); #ifdef SCRIPT_SUPPORT // - get statement for executing scripted SQL HSTMT getScriptStatement(void); #endif // - close connection void closeODBCConnection(SQLHDBC &aConnHandle); // - check if aResult signals error and throw exception if so void checkODBCError(SQLRETURN aResult,SQLSMALLINT aHandleType,SQLHANDLE aHandle); // - check if aResult signals error and throw exception if so void checkStatementError(SQLRETURN aResult,SQLHSTMT aHandle); // - check if aResult is NO_DATA, return False if so, throw exception on error bool checkStatementHasData(SQLRETURN aResult,SQLHSTMT aHandle); // - get ODBC error message for given result code, returns false if no error bool getODBCError(SQLRETURN aResult, string &aMessage, string &aSQLState, SQLSMALLINT aHandleType, SQLHANDLE aHandle); // - get new statement handle SQLHSTMT newStatementHandle(SQLHDBC aConnection); // - get column value as database field bool getColumnValueAsField( SQLHSTMT aStatement, sInt16 aColIndex, TDBFieldType aDbfty, TItemField *aFieldP, TCharSets aDataCharSet, timecontext_t aTimecontext, bool aMoveToUserContext ); // - get integer value, returns false if no Data or Null bool getColumnValueAsULong( SQLHSTMT aStatement, sInt16 aColNumber, uInt32 &aLongValue ); bool getColumnValueAsLong( SQLHSTMT aStatement, sInt16 aColNumber, sInt32 &aLongValue ); // - get double value, returns false if no Data or Null bool getColumnValueAsDouble( SQLHSTMT aStatement, sInt16 aColNumber, double &aDoubleValue ); // - get string value, returns false if no Data or Null bool getColumnValueAsString( SQLHSTMT aStatement, sInt16 aColNumber, string &aStringValue, TCharSets aCharSet, bool aAsBlob=false ); // - get time/date values, returns false if no Data or Null bool getColumnAsODBCTimestamp( SQLHSTMT aStatement, sInt16 aColNumber, SQL_TIMESTAMP_STRUCT &aODBCTimestamp ); bool getColumnValueAsTimestamp( SQLHSTMT aStatement, sInt16 aColNumber, lineartime_t &aTimestamp ); bool getColumnValueAsTime( SQLHSTMT aStatement, sInt16 aColNumber, lineartime_t &aTime ); bool getColumnValueAsDate( SQLHSTMT aStatement, sInt16 aColNumber, lineartime_t &aDate ); // - bind parameters (and values for IN-Params) to the statement void bindSQLParameters( TSyncSession *aSessionP, SQLHSTMT aStatement, TParameterMapList &aParamMapList, // the list of mapped parameters TCharSets aDataCharSet, TLineEndModes aDataLineEndMode ); // - save out parameter values and clean up void saveAndCleanupSQLParameters( TSyncSession *aSessionP, SQLHSTMT aStatement, TParameterMapList &aParamMapList, // the list of mapped parameters TCharSets aDataCharSet, TLineEndModes aDataLineEndMode ); // - bind parameters (and values for IN-Params) to the statement for session level SQL void bindSQLParameters( SQLHSTMT aStatement ); // - save out parameter values and clean up for session level SQL void saveAndCleanupSQLParameters( SQLHSTMT aStatement ); #endif // ODBCAPI_SUPPORT // SQLite utils #ifdef SQLITE_SUPPORT // - get SQLite error message for given result code; returns false if no error bool getSQLiteError(int aRc,string &aMessage, sqlite3 *aDb); // - check if aResult signals error and throw exception if so void checkSQLiteError(int aRc, sqlite3 *aDb); // - check if aRc signals error and throw exception if so; returns true if data available, false if not bool checkSQLiteHasData(int aRc, sqlite3 *aDb); // - get column value into field bool getSQLiteColValueAsField( sqlite3_stmt *aStatement, sInt16 aColIndex, TDBFieldType aDbfty, TItemField *aFieldP, TCharSets aDataCharSet, timecontext_t aTimecontext, bool aMoveToUserContext ); // - prepare SQLite statement void prepareSQLiteStatement( cAppCharP aSQL, sqlite3 *aDB, sqlite3_stmt *&aStatement ); // - bind SQLite parameters (we have ONLY in-params)! void bindSQLiteParameters( TSyncSession *aSessionP, sqlite3_stmt *aStatement, TParameterMapList &aParamMapList, // the list of mapped parameters TCharSets aDataCharSet, TLineEndModes aDataLineEndMode ); #endif // SQLITE_SUPPORT // parameter handling routines // - reset all mapped parameters void resetSQLParameterMaps(TParameterMapList &aParamMapList); // - parsing of %p(fieldname,mode[,dbfieldtype]) sequence in SQL statements bool ParseParamSubst( string &aSQL, // string to parse string::size_type &i, // position where % sequence starts in aSQL string::size_type &n, // input=number of chars of % sequence without parameters, if result==true: output=number of chars to substitute at i in aSQL TParameterMapList &aParameterMaps, // parameter maps list to add params to TMultiFieldItem *aItemP // the involved item for field params #ifdef SCRIPT_SUPPORT ,TScriptContext *aScriptContextP // the script context for variable params #endif ); protected: #ifdef HAS_SQL_ADMIN // - check device ID related stuff virtual void CheckDevice(const char *aDeviceID); // - check user/pw (part of SessionLogin process) virtual bool CheckLogin(const char *aOriginalUserName, const char *aModifiedUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID); // - remote device is analyzed, possibly save status virtual void remoteAnalyzed(void); #endif // HAS_SQL_ADMIN #ifdef SYSYNC_SERVER // - request end, used to clean up virtual void RequestEnded(bool &aHasData); #endif private: #ifdef ODBCAPI_SUPPORT // ODBC vars // - session-specific connection string string fSessionDBConnStr; string fSessionDBPassword; // - handles SQLHDBC fODBCConnectionHandle; SQLHENV fODBCEnvironmentHandle; #ifdef SCRIPT_SUPPORT // private context for afterconnect script as it might be called nested in other scripts (e.g. triggered by SQLEXECUTE) TScriptContext *fAfterConnectContext; #endif // SCRIPT_SUPPORT #endif // ODBCAPI_SUPPORT // parameter list for execution of commands TParameterMapList fParameterMaps; }; // TODBCApiAgent } // namespace sysync #endif // ODBCAPIAGENT_H #endif // SQL_SUPPORT // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/odbcapids.cpp0000755000373300037200000050667512424517753030043 0ustar00nightlyallusers00000000000000/** * @File odbcapids.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TODBCApiDS * ODBC based datastore API implementation * @Note Currently also contains what will later become TCustomImplDS * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-16 : luz : created from odbcdbdatastore */ #include "prefix_file.h" #ifdef SQL_SUPPORT // includes #include "sysync.h" #include "odbcapids.h" #include "odbcapiagent.h" // sanity check for current implementation - either SQLite or ODBC must be enabled #if !defined(ODBCAPI_SUPPORT) && !defined(SQLITE_SUPPORT) #error "ODBC or SQLite API must be enabled" #endif namespace sysync { // special ID mode names const char * const SpecialIDModeNames[numSpecialIDModes] = { "none", "unixmsrnd6" }; #ifdef SCRIPT_SUPPORT class TODBCDSfuncs { public: // ODBC datastore specific script functions // ======================================== // SETSQLFILTER(string filter) static void func_SetSQLFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { aFuncContextP->getLocalVar(0)->getAsString( static_cast(aFuncContextP->getCallerContext())->fSQLFilter ); }; // func_SetSQLFilter // ADDBYUPDATING(string idtoupdate) static void func_AddByUpdating(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiDS *dsP = static_cast(aFuncContextP->getCallerContext()); // only if inserting, convert to updating an existing record if (dsP->fInserting) { string localid; aFuncContextP->getLocalVar(0)->getAsString(localid); aFuncContextP->fParentContextP->fTargetItemP->setLocalID(localid.c_str()); // switch off inserting from here on, such that UPDATE SQL will be used dsP->fInserting = false; } }; // func_AddByUpdating #ifdef SQLITE_SUPPORT // integer SQLITELASTID() // get ROWID created by last insert static void func_SQLGetLastID(TItemField *&aTermP, TScriptContext *aFuncContextP) { TODBCApiDS *dsP = static_cast(aFuncContextP->getCallerContext()); if (dsP->fUseSQLite && dsP->fSQLiteP) { aTermP->setAsInteger( sqlite3_last_insert_rowid(dsP->fSQLiteP) ); } else { aTermP->unAssign(); } }; // func_SQLGetLastID #endif // SQLITE_SUPPORT }; // TODBCDSfuncs const uInt8 param_OneStr[] = { VAL(fty_string) }; // builtin function table for datastore level const TBuiltInFuncDef ODBCDSFuncDefs[] = { { "SETSQLFILTER", TODBCDSfuncs::func_SetSQLFilter, fty_none, 1, param_OneStr }, { "ADDBYUPDATING", TODBCDSfuncs::func_AddByUpdating, fty_none, 1, param_OneStr }, #ifdef SQLITE_SUPPORT { "SQLITELASTID", TODBCDSfuncs::func_SQLGetLastID, fty_integer, 0, NULL }, #endif }; // chain to generic local datastore funcs static void *ODBCDSChainFunc2(void *&aCtx) { // context pointer for datastore-level funcs is the datastore // -> no change needed // next table is customimplds's (and then the localdatastore's from there) return (void *)&CustomDSFuncTable2; } // ODBCDSChainFunc const TFuncTable ODBCDSFuncTable2 = { sizeof(ODBCDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of table ODBCDSFuncDefs, // table pointer ODBCDSChainFunc2 // chain generic DB functions }; #endif // SCRIPT_SUPPORT // Config // ====== TOdbcDSConfig::TOdbcDSConfig(const char* aName, TConfigElement *aParentElement) : inherited(aName,aParentElement) { // nop so far clear(); // except ensure we have a decent rand() srand((uInt32)time(NULL)); } // TOdbcDSConfig::TOdbcDSConfig TOdbcDSConfig::~TOdbcDSConfig() { // nop so far } // TOdbcDSConfig::~TOdbcDSConfig // init defaults void TOdbcDSConfig::clear(void) { // init defaults // - commit modes fCommitItems=false; // commit item changes all at end of write by default // - retries fInsertRetries=0; // none fUpdateRetries=0; // none // - folder key #ifdef HAS_SQL_ADMIN fFolderKeySQL.erase(); // - Sync target table fGetSyncTargetSQL.erase(); fNewSyncTargetSQL.erase(); fUpdateSyncTargetSQL.erase(); fDeleteSyncTargetSQL.erase(); fSyncTimestamp=true; #ifdef OLD_1_0_5_CONFIG_COMPATIBLE // Compatibility with old config files // - layout of map table fMapTableName.erase(); fRemoteIDMapField.erase(); fLocalIDMapField.erase(); fStringLocalID=true; fTargetKeyMapField.erase(); fStringTargetkey=true; // - layout of data table fLocalTableName.erase(); // - name of folderkey subselection field in data table, empty if none fFolderKeyField.erase(); fStringFolderkey=true; // - name of field which contains Local ID (GUID) fLocalIDField.erase(); // - mod date/time fModifiedDateField.erase(); fModifiedTimeField.erase(); #endif // OLD_1_0_5_CONFIG_COMPATIBLE // Map table access, new version // - SQL to fetch all map entries of a target fMapFetchAllSQL.erase(); // - SQL to insert new map entry by localid fMapInsertSQL.erase(); // - SQL to update existing map entry by localid fMapUpdateSQL.erase(); // - SQL to delete a map entry by localid fMapDeleteSQL.erase(); #endif // HAS_SQL_ADMIN // Data table access, new version // - SQL to fetch local ID and timestamp from data table fLocalIDAndTimestampFetchSQL.erase(); fModifiedTimestamp=true; // - SQL to fetch actual data fields from data table. SQL result must // contain mapped fields in the same order as they appear in fDataFetchSQL.erase(); // - SQL to insert new data in a record, including modification date fDataInsertSQL.erase(); // - SQL to update actual data in a record, including modification date fDataUpdateSQL.erase(); // - SQL to delete a record fDataDeleteSQL.erase(); // - SQL statement(s) to zap entire sync set fDataZapSQL.erase(); // Data table options // - try to translate filters to SQL if possible fFilterOnDBLevel=false; // don't try // - quoting mode for string literals fQuotingMode=qm_duplsingle; // default to what was hard-coded before it became configurable in 2.1.1.5 // - Obtaining ID for new records fDetermineNewIDOnce=false; fObtainNewIDAfterInsert=false; fObtainNewLocalIDSql.erase(); #ifdef SCRIPT_SUPPORT fLocalIDScript.erase(); #endif fMinNextID=1000000; fSpecialIDMode=sidm_none; fInsertReturnsID=false; fInsertIDAsOutParam=false; fIgnoreAffectedCount=false; fLastModDBFieldType=dbft_timestamp; // default to what we always had before 3.1 engine for ODBC // SQLite support #ifdef SQLITE_SUPPORT fSQLiteFileName.erase(); fSQLiteBusyTimeout=15; // 15 secs #endif // clear inherited inherited::clear(); } // TOdbcDSConfig::clear // config element parsing bool TOdbcDSConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // commit modes if (strucmp(aElementName,"commititems")==0) expectBool(fCommitItems); // retries else if (strucmp(aElementName,"insertretries")==0) expectInt16(fInsertRetries); else if (strucmp(aElementName,"updateretries")==0) expectInt16(fUpdateRetries); #ifdef HAS_SQL_ADMIN // - folder key else if (strucmp(aElementName,"folderkeysql")==0) expectString(fFolderKeySQL); // - Sync target table handling else if (strucmp(aElementName,"synctargetgetsql")==0) expectString(fGetSyncTargetSQL); else if (strucmp(aElementName,"synctargetnewsql")==0) expectString(fNewSyncTargetSQL); else if (strucmp(aElementName,"synctargetupdatesql")==0) expectString(fUpdateSyncTargetSQL); else if (strucmp(aElementName,"synctargetdeletesql")==0) expectString(fDeleteSyncTargetSQL); else if (strucmp(aElementName,"synctimestamp")==0) expectBool(fSyncTimestamp); #ifdef OLD_1_0_5_CONFIG_COMPATIBLE // Compatibility with old config files // - layout of map table else if (strucmp(aElementName,"maptablename")==0) expectString(fMapTableName); else if (strucmp(aElementName,"remoteidmapfield")==0) expectString(fRemoteIDMapField); else if (strucmp(aElementName,"localidmapfield")==0) expectString(fLocalIDMapField); else if (strucmp(aElementName,"stringlocalid")==0) expectBool(fStringLocalID); else if (strucmp(aElementName,"targetkeymapfield")==0) expectString(fTargetKeyMapField); else if (strucmp(aElementName,"stringtargetkey")==0) expectBool(fStringTargetkey); // - layout of data table else if (strucmp(aElementName,"datatablename")==0) { ReportError(false,"Warning: old-style config - use full SQL statements with %%xx replacement sequences instead"); expectString(fLocalTableName); } else if (strucmp(aElementName,"folderkeyfield")==0) expectString(fFolderKeyField); else if (strucmp(aElementName,"stringfolderkey")==0) expectBool(fStringFolderkey); else if (strucmp(aElementName,"localidfield")==0) expectString(fLocalIDField); else if (strucmp(aElementName,"moddatefield")==0) expectString(fModifiedDateField); else if (strucmp(aElementName,"modtimefield")==0) expectString(fModifiedTimeField); // Note: was never documented so will be phased out right now // else if (strucmp(aElementName,"genselectcond")==0) // expectString(fGeneralSelectCondition); #endif // OLD_1_0_5_CONFIG_COMPATIBLE // Map table access, new version else if (strucmp(aElementName,"selectmapallsql")==0) expectString(fMapFetchAllSQL); else if (strucmp(aElementName,"insertmapsql")==0) expectString(fMapInsertSQL); else if (strucmp(aElementName,"updatemapsql")==0) expectString(fMapUpdateSQL); else if (strucmp(aElementName,"deletemapsql")==0) expectString(fMapDeleteSQL); #endif // HAS_SQL_ADMIN // Data table access, new version else if (strucmp(aElementName,"quotingmode")==0) expectEnum(sizeof(fQuotingMode),&fQuotingMode,quotingModeNames,numQuotingModes); else if (strucmp(aElementName,"dbcanfilter")==0) expectBool(fFilterOnDBLevel); else if (strucmp(aElementName,"selectidandmodifiedsql")==0) expectString(fLocalIDAndTimestampFetchSQL); else if (strucmp(aElementName,"modtimestamp")==0) expectBool(fModifiedTimestamp); else if (strucmp(aElementName,"selectdatasql")==0) expectString(fDataFetchSQL); else if (strucmp(aElementName,"insertdatasql")==0) expectString(fDataInsertSQL); else if (strucmp(aElementName,"updatedatasql")==0) expectString(fDataUpdateSQL); else if (strucmp(aElementName,"deletedatasql")==0) expectString(fDataDeleteSQL); else if (strucmp(aElementName,"zapdatasql")==0) expectString(fDataZapSQL); // - Obtaining ID for new records else if (strucmp(aElementName,"determineidonce")==0) expectBool(fDetermineNewIDOnce); else if (strucmp(aElementName,"obtainidafterinsert")==0) expectBool(fObtainNewIDAfterInsert); else if (strucmp(aElementName,"obtainlocalidsql")==0) expectString(fObtainNewLocalIDSql); else if (strucmp(aElementName,"minnextid")==0) expectInt32(fMinNextID); #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"localidscript")==0) expectScript(fLocalIDScript, aLine, getDSFuncTableP()); #endif else if (strucmp(aElementName,"specialidmode")==0) expectEnum(sizeof(fSpecialIDMode),&fSpecialIDMode,SpecialIDModeNames,numSpecialIDModes); else if (strucmp(aElementName,"insertreturnsid")==0) expectBool(fInsertReturnsID); else if (strucmp(aElementName,"idasoutparam")==0) // %%% possibly obsolete, replaced by %pkos and %pkoi expectBool(fInsertIDAsOutParam); else if (strucmp(aElementName,"ignoreaffectedcount")==0) expectBool(fIgnoreAffectedCount); else if (strucmp(aElementName,"lastmodfieldtype")==0) expectEnum(sizeof(fLastModDBFieldType),&fLastModDBFieldType,DBFieldTypeNames,numDBfieldTypes); // - SQLite support #ifdef SQLITE_SUPPORT else if (strucmp(aElementName,"sqlitefile")==0) expectMacroString(fSQLiteFileName); else if (strucmp(aElementName,"sqlitebusytimeout")==0) expectUInt32(fSQLiteBusyTimeout); #endif // - field mappings else if (strucmp(aElementName,"fieldmap")==0) { // check reference argument const char* ref = getAttr(aAttributes,"fieldlist"); if (!ref) { ReportError(true,"fieldmap missing 'fieldlist' attribute"); } else { // look for field list TMultiFieldDatatypesConfig *mfcfgP = dynamic_cast(getSyncAppBase()->getRootConfig()->fDatatypesConfigP); if (!mfcfgP) throw TConfigParseException("no multifield config"); TFieldListConfig *cfgP = mfcfgP->getFieldList(ref); if (!cfgP) return fail("fieldlist '%s' not defined for fieldmap",ref); // - store field list reference in map fFieldMappings.fFieldListP=cfgP; // - let element handle parsing expectChildParsing(fFieldMappings); } } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TOdbcDSConfig::localStartElement // resolve void TOdbcDSConfig::localResolve(bool aLastPass) { if (aLastPass) { #ifndef ODBC_UNICODE // make sure we don't try to use UTF-16 if (fDataCharSet==chs_utf16) SYSYNC_THROW(TConfigParseException("UTF-16 wide character set can only be used on ODBC-Unicode enabled platforms")); #endif #ifdef SQLITE_SUPPORT // %%% NOP at this time #endif #ifdef OLD_1_0_5_CONFIG_COMPATIBLE // generate new settings from old ones if (fLocalIDAndTimestampFetchSQL.empty()) { // SELECT localid,modifieddate(,modifiedtime)... fLocalIDAndTimestampFetchSQL="SELECT "; fLocalIDAndTimestampFetchSQL+=fLocalIDField; fLocalIDAndTimestampFetchSQL+=", "; fLocalIDAndTimestampFetchSQL += fModifiedDateField; if (!fModifiedTimestamp && !fModifiedTimeField.empty()) { fLocalIDAndTimestampFetchSQL += ", "; fLocalIDAndTimestampFetchSQL += fModifiedTimeField; } // ...FROM datatable fLocalIDAndTimestampFetchSQL+=" FROM "; fLocalIDAndTimestampFetchSQL+=fLocalTableName; // ...WHERE folderkey=x... fLocalIDAndTimestampFetchSQL+=" WHERE "; fLocalIDAndTimestampFetchSQL+=fFolderKeyField; fLocalIDAndTimestampFetchSQL+='='; quoteStringAppend("%f",fLocalIDAndTimestampFetchSQL,fStringFolderkey ? qm_backslash : qm_none); // ...AND filterclause fLocalIDAndTimestampFetchSQL+="%AF"; PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fLocalIDAndTimestampFetchSQL.c_str())); } if (fDataFetchSQL.empty()) { // SELECT %N FROM datatable WHERE localid=%k AND folderkey=%f fDataFetchSQL="SELECT %N FROM "; fDataFetchSQL+=fLocalTableName; fDataFetchSQL+=" WHERE "; fDataFetchSQL+=fLocalIDField; fDataFetchSQL+='='; quoteStringAppend("%k",fDataFetchSQL,fStringLocalID ? qm_backslash : qm_none); fDataFetchSQL+=" AND "; fDataFetchSQL+=fFolderKeyField; fDataFetchSQL+='='; quoteStringAppend("%f",fDataFetchSQL,fStringFolderkey ? qm_backslash : qm_none); PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fDataFetchSQL.c_str())); } if (fDataInsertSQL.empty()) { // INSERT INTO datatable (keyfield,modtimestamp,folderkey,%N) VALUES (%k,%M,%f,%v) fDataInsertSQL="INSERT INTO "; fDataInsertSQL+=fLocalTableName; fDataInsertSQL+=" ("; if (fDetermineNewIDOnce || !fObtainNewIDAfterInsert) { // insert key only if previously generated separately fDataInsertSQL+=fLocalIDField; fDataInsertSQL+=", "; } fDataInsertSQL += fModifiedDateField; if (!fModifiedTimestamp && !fModifiedTimeField.empty()) { fDataInsertSQL += ", "; fDataInsertSQL += fModifiedTimeField; } if (!fFolderKeyField.empty()) { fDataInsertSQL += ", "; fDataInsertSQL+=fFolderKeyField; } fDataInsertSQL+=", %N) VALUES ("; if (fDetermineNewIDOnce || !fObtainNewIDAfterInsert) { // insert key only if previously generated separately quoteStringAppend("%k",fDataInsertSQL,fStringLocalID ? qm_backslash : qm_none); fDataInsertSQL += ", "; } if (!fModifiedTimestamp) { fDataInsertSQL += "%dM"; if (!fModifiedTimeField.empty()) fDataInsertSQL += ", %tM"; } else { fDataInsertSQL += "%M"; } if (!fFolderKeyField.empty()) { fDataInsertSQL += ", %f"; } fDataInsertSQL+=", %v)"; PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fDataInsertSQL.c_str())); } if (fDataUpdateSQL.empty()) { // UPDATE datatable SET modtimestamp=%M, %V WHERE localid=%k fDataUpdateSQL="UPDATE "; fDataUpdateSQL+=fLocalTableName; fDataUpdateSQL+=" SET "; if (!fModifiedTimestamp) { fDataUpdateSQL += fModifiedDateField; fDataUpdateSQL += "=%dM"; if (!fModifiedTimeField.empty()) { fDataUpdateSQL += ", "; fDataUpdateSQL += fModifiedTimeField; fDataUpdateSQL += "=%tM"; } } else { fDataUpdateSQL += fModifiedDateField; fDataUpdateSQL += "=%M"; } fDataUpdateSQL += ", %V WHERE "; fDataUpdateSQL+=fLocalIDField; fDataUpdateSQL += "="; quoteStringAppend("%k",fDataUpdateSQL,fStringLocalID ? qm_backslash : qm_none); PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fDataUpdateSQL.c_str())); } if (fDataDeleteSQL.empty()) { // DELETE FROM datatable WHERE localid=%k fDataDeleteSQL="DELETE FROM "; fDataDeleteSQL+=fLocalTableName; fDataDeleteSQL+=" WHERE "; fDataDeleteSQL+=fLocalIDField; fDataDeleteSQL+="="; quoteStringAppend("%k",fDataDeleteSQL,fStringLocalID ? qm_backslash : qm_none); PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fDataDeleteSQL.c_str())); } if (fDataZapSQL.empty() && !fLocalTableName.empty()) { // DELETE FROM datatable fDataZapSQL="DELETE FROM "; fDataZapSQL+=fLocalTableName; // ...WHERE folderkey=x... fDataZapSQL+=" WHERE "; fDataZapSQL+=fFolderKeyField; fDataZapSQL+='='; quoteStringAppend("%f",fDataZapSQL,fStringFolderkey ? qm_backslash : qm_none); // ...AND filterclause fDataZapSQL+="%AF"; PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fDataZapSQL.c_str())); } // Map table if (fMapFetchAllSQL.empty()) { // SELECT localid,remoteid FROM maptable WHERE targetkey=%t fMapFetchAllSQL="SELECT "; fMapFetchAllSQL+=fLocalIDMapField; fMapFetchAllSQL+=", "; fMapFetchAllSQL+=fRemoteIDMapField; fMapFetchAllSQL+=" FROM "; fMapFetchAllSQL+=fMapTableName; fMapFetchAllSQL+=" WHERE "; fMapFetchAllSQL+=fTargetKeyMapField; fMapFetchAllSQL+="="; quoteStringAppend("%t",fMapFetchAllSQL,fStringTargetkey ? qm_backslash : qm_none); PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fMapFetchAllSQL.c_str())); } if (fMapInsertSQL.empty()) { // INSERT INTO maptable (targetkey,localid,remoteid) VALUES (%t,%k,%r) fMapInsertSQL="INSERT INTO "; fMapInsertSQL+=fMapTableName; fMapInsertSQL+=" ("; fMapInsertSQL+=fTargetKeyMapField; fMapInsertSQL+=", "; fMapInsertSQL+=fLocalIDMapField; fMapInsertSQL+=", "; fMapInsertSQL+=fRemoteIDMapField; fMapInsertSQL+=") VALUES ("; quoteStringAppend("%t",fMapInsertSQL,fStringTargetkey ? qm_backslash : qm_none); fMapInsertSQL+=", "; quoteStringAppend("%k",fMapInsertSQL,fStringLocalID ? qm_backslash : qm_none); fMapInsertSQL+=", '%r')"; PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fMapInsertSQL.c_str())); } if (fMapUpdateSQL.empty()) { // UPDATE maptable SET remoteid=%r WHERE targetkey=%t AND localid=%k fMapUpdateSQL="UPDATE "; fMapUpdateSQL+=fMapTableName; fMapUpdateSQL+=" SET "; fMapUpdateSQL+=fRemoteIDMapField; fMapUpdateSQL+="='%r' WHERE "; // is always a string fMapUpdateSQL+=fTargetKeyMapField; fMapUpdateSQL+="="; quoteStringAppend("%t",fMapUpdateSQL,fStringTargetkey ? qm_backslash : qm_none); fMapUpdateSQL+=" AND "; fMapUpdateSQL+=fLocalIDMapField; fMapUpdateSQL+="="; quoteStringAppend("%k",fMapUpdateSQL,fStringLocalID ? qm_backslash : qm_none); PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fMapUpdateSQL.c_str())); } if (fMapDeleteSQL.empty()) { // DELETE FROM maptable WHERE targetkey=%t AND localid=%k fMapDeleteSQL="DELETE FROM "; fMapDeleteSQL+=fMapTableName; fMapDeleteSQL+=" WHERE "; fMapDeleteSQL+=fTargetKeyMapField; fMapDeleteSQL+="="; quoteStringAppend("%t",fMapDeleteSQL,fStringTargetkey ? qm_backslash : qm_none); // up to here, this is a DELETE all for one target, so we // can use this to extend fDeleteSyncTargetSQL fDeleteSyncTargetSQL+=" %GO "; fDeleteSyncTargetSQL+=fMapDeleteSQL; // now add clause for single item fMapDeleteSQL+=" AND "; fMapDeleteSQL+=fLocalIDMapField; fMapDeleteSQL+="="; quoteStringAppend("%k",fMapDeleteSQL,fStringLocalID ? qm_backslash : qm_none); PDEBUGPRINTFX(DBG_EXOTIC,(" %s",fMapDeleteSQL.c_str())); } #endif } // resolve inherited inherited::localResolve(aLastPass); } // TOdbcDSConfig::localResolve #ifdef SCRIPT_SUPPORT void TOdbcDSConfig::apiResolveScripts(void) { // resolve scripts which are API specific (in SAME ORDER AS IN apiRebuildScriptContexts()!) TScriptContext::resolveScript(getSyncAppBase(),fLocalIDScript,fResolveContextP,NULL); } #endif // - create appropriate datastore from config, calls addTypeSupport as well TLocalEngineDS *TOdbcDSConfig::newLocalDataStore(TSyncSession *aSessionP) { // Synccap defaults to normal set supported by the engine by default TLocalEngineDS *ldsP; if (IS_CLIENT) { ldsP = new TODBCApiDS(this,aSessionP,getName(),aSessionP->getSyncCapMask() & ~(isOneWayFromRemoteSupported() ? 0 : SCAP_MASK_ONEWAY_SERVER)); } else { ldsP = new TODBCApiDS(this,aSessionP,getName(),aSessionP->getSyncCapMask() & ~(isOneWayFromRemoteSupported() ? 0 : SCAP_MASK_ONEWAY_CLIENT)); } // do common stuff addTypes(ldsP,aSessionP); // return return ldsP; } // TOdbcDSConfig::newLocalDataStore // Field Map item // ============== TODBCFieldMapItem::TODBCFieldMapItem(const char *aElementName, TConfigElement *aParentElement) : inherited(aElementName,aParentElement) { #ifdef STREAMFIELD_SUPPORT fReadBlobSQL.erase(); fKeyFieldName.erase(); #endif } // TODBCFieldMapItem::TODBCFieldMapItem void TODBCFieldMapItem::checkAttrs(const char **aAttributes) { #ifdef STREAMFIELD_SUPPORT AssignString(fReadBlobSQL,getAttr(aAttributes,"readblobsql")); AssignString(fKeyFieldName,getAttr(aAttributes,"keyfield")); #endif inherited::checkAttrs(aAttributes); } // TODBCFieldMapItem::checkAttrs #ifdef ARRAYDBTABLES_SUPPORT // array container // =============== TODBCFieldMapArrayItem::TODBCFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement) : inherited(aCustomDSConfigP,aParentElement) { clear(); } // TODBCFieldMapArrayItem::TODBCFieldMapArrayItem TODBCFieldMapArrayItem::~TODBCFieldMapArrayItem() { // nop so far clear(); } // TODBCFieldMapArrayItem::~TODBCFieldMapArrayItem // init defaults void TODBCFieldMapArrayItem::clear(void) { // init defaults // - clear values fSelectArraySQL.erase(); fInsertElementSQL.erase(); fDeleteArraySQL.erase(); fAlwaysCleanArray=false; // clear inherited inherited::clear(); } // TODBCFieldMapArrayItem::clear // config element parsing bool TODBCFieldMapArrayItem::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { if (strucmp(aElementName,"selectarraysql")==0) expectString(fSelectArraySQL); else if (strucmp(aElementName,"deletearraysql")==0) expectString(fDeleteArraySQL); else if (strucmp(aElementName,"insertelementsql")==0) expectString(fInsertElementSQL); else if (strucmp(aElementName,"alwaysclean")==0) expectBool(fAlwaysCleanArray); // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TODBCFieldMapArrayItem::localStartElement // resolve void TODBCFieldMapArrayItem::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings // %%% tbd } // resolve inherited inherited::localResolve(aLastPass); } // TODBCFieldMapArrayItem::localResolve #endif // ARRAYDBTABLES_SUPPORT /* * Implementation of TODBCApiDS */ // constructor TODBCApiDS::TODBCApiDS( TOdbcDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask ) : inherited(aConfigP,aSessionP, aName, aCommonSyncCapMask) #ifdef ODBCAPI_SUPPORT ,fODBCConnectionHandle(SQL_NULL_HANDLE) // no connection yet ,fODBCReadStatement(SQL_NULL_HANDLE) // no active statements either ,fODBCWriteStatement(SQL_NULL_HANDLE) #ifdef SCRIPT_SUPPORT ,fODBCScriptStatement(SQL_NULL_HANDLE) #endif #endif // ODBCAPI_SUPPORT #ifdef SQLITE_SUPPORT ,fSQLiteP(NULL) ,fSQLiteStmtP(NULL) ,fStepRc(SQLITE_OK) #endif { // save pointer to config record fConfigP=aConfigP; // make a local copy of the typed agent pointer fAgentP=static_cast(fSessionP); // make a local copy of the typed agent config pointer fAgentConfigP = dynamic_cast( aSessionP->getRootConfig()->fAgentConfigP ); if (!fAgentConfigP) throw TSyncException(DEBUGTEXT("TODBCApiDS finds no AgentConfig","odds7")); // init other stuff fODBCAdminData=false; // not known yet if we'll get admin data (target, map) from ODBC or not // - SQLite support #ifdef SQLITE_SUPPORT fUseSQLite = !fConfigP->fSQLiteFileName.empty(); // if we have a SQLite file name, use it instead of ODBC #endif // clear rest InternalResetDataStore(); } // TODBCApiDS::TODBCApiDS TODBCApiDS::~TODBCApiDS() { InternalResetDataStore(); } // TODBCApiDS::~TODBCApiDS /// @brief called while agent is still fully ok, so we must clean up such that later call of destructor does NOT access agent any more void TODBCApiDS::announceAgentDestruction(void) { // reset myself InternalResetDataStore(); // make sure we don't access the agent any more engTerminateDatastore(); fAgentP = NULL; // call inherited inherited::announceAgentDestruction(); } // TODBCApiDS::announceAgentDestruction /// @brief called to reset datastore /// @note must be safe to be called multiple times and even after announceAgentDestruction() void TODBCApiDS::InternalResetDataStore(void) { #ifdef OBJECT_FILTERING fFilterExpressionTested=false; // not tested yet fFilterWorksOnDBLevel=true; // but assume it works #endif #ifdef SCRIPT_SUPPORT // no SQL filter in place yet fSQLFilter.erase(); #endif #ifdef SQLITE_SUPPORT // clean up SQLite if (fSQLiteP) { // stop it in case something is still running sqlite3_interrupt(fSQLiteP); // if we have a statement, finalize it if (fSQLiteStmtP) { // discard it sqlite3_finalize(fSQLiteStmtP); fSQLiteStmtP=NULL; } int sqrc = sqlite3_close(fSQLiteP); if (sqrc!=SQLITE_OK) { PDEBUGPRINTFX(DBG_ERROR,("Error closing SQLite data file: sqlite3_close() returns %d",sqrc)); } else { PDEBUGPRINTFX(DBG_DBAPI,("Closed SQLite data file")); } fSQLiteP=NULL; } #endif // Clear map table and sync set lists if (fAgentP) { #ifdef ODBCAPI_SUPPORT // no active statements any more if (fODBCReadStatement) { SafeSQLFreeHandle(SQL_HANDLE_STMT,fODBCReadStatement); fODBCReadStatement=SQL_NULL_HANDLE; } if (fODBCWriteStatement) { SafeSQLFreeHandle(SQL_HANDLE_STMT,fODBCWriteStatement); fODBCWriteStatement=SQL_NULL_HANDLE; } // make sure connection is closed (and open transaction rolled back) fAgentP->closeODBCConnection(fODBCConnectionHandle); #endif // ODBCAPI_SUPPORT // clear parameter maps resetSQLParameterMaps(); } } // TODBCApiDS::InternalResetDataStore #ifdef SCRIPT_SUPPORT // called to rebuild script context for API level scripts in the datastore context // Note: rebuild order must be SAME AS resolve order in apiResolveScripts() void TODBCApiDS::apiRebuildScriptContexts(void) { // local ID generation script TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fLocalIDScript,fScriptContextP,fSessionP); } // TODBCApiDS::apiRebuildScriptContexts #endif #ifdef ODBCAPI_SUPPORT // - get (DB level) ODBC handle SQLHDBC TODBCApiDS::getODBCConnectionHandle(void) { if (fODBCConnectionHandle==SQL_NULL_HANDLE && fAgentP) { // get a handle PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Datastore %s does not own a DB connection yet -> pulling connection from session level",getName())); fODBCConnectionHandle = fAgentP->pullODBCConnectionHandle(); } PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Datastore %s: using connection handle 0x%lX",getName(),(uIntArch)fODBCConnectionHandle)); return fODBCConnectionHandle; } // TODBCApiDS::getODBCConnectionHandle // - check for connection-level error void TODBCApiDS::checkConnectionError(SQLRETURN aResult) { if (!fAgentP) return; if (fODBCConnectionHandle!=SQL_NULL_HANDLE) { // check on local connection fAgentP->checkODBCError(aResult,SQL_HANDLE_DBC,fODBCConnectionHandle); } // check on session level fAgentP->checkConnectionError(aResult); } // TODBCApiDS::checkConnectionError #endif // ODBCAPI_SUPPORT // helper for mapping field names bool TODBCApiDS::addFieldNameList(string &aSQL, bool aForWrite, bool aForUpdate, bool aAssignedOnly, TMultiFieldItem *aItemP, TFieldMapList &fml, uInt16 aSetNo, char aFirstSep) { TFieldMapList::iterator pos; TODBCFieldMapItem *fmiP; bool doit; bool allfields=true; // all fields listed (no array fields) for (pos=fml.begin(); pos!=fml.end(); pos++) { fmiP = (TODBCFieldMapItem *)*pos; if (!fmiP->isArray()) { doit= aSetNo==fmiP->setNo && (aForWrite ? (fmiP->writable && ((aForUpdate && fmiP->for_update) || (!aForUpdate && fmiP->for_insert))) : fmiP->readable #ifdef STREAMFIELD_SUPPORT && (fmiP->fReadBlobSQL.empty() || !fmiP->fKeyFieldName.empty()) // only read fields here that don't use a proxy or read a key FOR the proxy #endif ); if (doit && aAssignedOnly && aForWrite && aItemP) { // check base field is assigned // This should cover all cases (remember that MimeDirItem assigns empty values // to all "available" fields before parsing data) // - array fields are "assigned" if they have an element assigned or // been called assignEmpty() // - field blocks addressed by repeating properties will either be assigned all // or not at all, so we can safely check base field ID only // - negative FIDs except VARIDX_UNDEFINED address local vars, which // should be assigned only if they may also be written TItemField *fieldP=getMappedFieldOrVar(*aItemP,fmiP->fid,0,true); // existing only if (!fieldP || !(fieldP->isAssigned())) doit=false; // avoid writing unassigned or non-existing (array) fields } if (doit) { // add comma if (aFirstSep) { aSQL+=aFirstSep; aSQL+=' '; } aFirstSep=','; // further names are always comma separated #ifdef STREAMFIELD_SUPPORT if (fmiP->readable && !aForWrite && !fmiP->fKeyFieldName.empty()) { // the actual field contents will be read via proxy, but we read the record key here instead aSQL+=fmiP->fKeyFieldName; } else #endif { // just add field name aSQL+=fmiP->fElementName; } } } else allfields=false; // at least one array field } return allfields; } // TODBCApiDS::addFieldNameList // helper for mapping field values // - returns aNoData=true if there is no field (e.g. array index too high) for any of the values // - returns false if not all fields could be listed (i.e. there are array fields) bool TODBCApiDS::addFieldNameValueList(string &aSQL, bool aAssignedOnly, bool &aNoData, bool &aAllEmpty, TMultiFieldItem &aItem ,bool aForUpdate, TFieldMapList &fml, uInt16 aSetNo, sInt16 aRepOffset, char aFirstSep) { TFieldMapList::iterator pos; TODBCFieldMapItem *fmiP; bool allfields=true; bool doit; aNoData = true; // assume no data aAllEmpty = true; // assume empty fields only for (pos=fml.begin(); pos!=fml.end(); pos++) { fmiP = (TODBCFieldMapItem *)*pos; if (fmiP->isArray()) { allfields=false; // at least one array field } else if (aSetNo==fmiP->setNo && fmiP->writable && ((aForUpdate && fmiP->for_update) || (!aForUpdate && fmiP->for_insert)) ) { doit=true; if (aAssignedOnly) { // check base field is assigned (see notes in addFieldNameList()) TItemField *fieldP=getMappedFieldOrVar(aItem,fmiP->fid,0,true); // get existing fields only (for arrays) if (!fieldP || !(fieldP->isAssigned())) doit=false; // avoid writing unassigned fields } if (doit) { // add comma if (aFirstSep) { aSQL+=aFirstSep; aSQL+=' '; } aFirstSep=','; // further names are always comma separated // add field name and equal sign if for update if (aForUpdate) { // add field name aSQL+=fmiP->fElementName; aSQL+='='; } // check how to add field value if (fmiP->as_param || fmiP->dbfieldtype==dbft_blob) { // either explicitly marked as param or BLOB: pass value as in-param addSQLParameterMap(true,false,param_field,fmiP,&aItem,aRepOffset); // in-param // add parameter placeholder into SQL aSQL+='?'; } else { // add field value as literal // - get base field sInt16 fid=fmiP->fid; if (fid==VARIDX_UNDEFINED) return false; // field does not exist #ifndef SCRIPT_SUPPORT // check index before using it (should not be required, as map indices are resolved if (!aItem.getItemType()->isFieldIndexValid(fid)) return false; // field does not exist #endif if (appendFieldsLiteral(aItem,fid,aRepOffset,*fmiP,aSQL)) aAllEmpty=false; } } } } aNoData=false; // data for all non-array fields found return allfields; } // TODBCApiDS::addFieldNameValueList // helper for filling ODBC results into mapped fields // - if mapped field is an array, aRepOffset will be used as array index // - if mapped field is not an array, aRepOffset will be added to the base fid void TODBCApiDS::fillFieldsFromSQLResult(SQLHSTMT aStatement, sInt16 &aColIndex, TMultiFieldItem &aItem, TFieldMapList &fml, uInt16 aSetNo, sInt16 aRepOffset) { sInt16 fid; TFieldMapList::iterator pos; TODBCFieldMapItem *fmiP; bool notnull=false; // default to empty // get data for all mapped fields for (pos=fml.begin(); pos!=fml.end(); pos++) { fmiP = (TODBCFieldMapItem *)*pos; try { if ( !fmiP->isArray() && aSetNo==fmiP->setNo && fmiP->readable ) { // was specified in SELECT, so we can read it if ((fid=fmiP->fid)!=VARIDX_UNDEFINED) { TItemField *fieldP; TDBFieldType dbfty = fmiP->dbfieldtype; // single field mapping fieldP=getMappedFieldOrVar(aItem,fid,aRepOffset); if (fieldP) { #ifdef STREAMFIELD_SUPPORT if (!fmiP->fReadBlobSQL.empty()) { // retrieve key for this field if map specifies a "keyfield" string key; #ifdef SQLITE_SUPPORT // - always for data access if (fUseSQLite) { if (!fmiP->fKeyFieldName.empty()) { key = (const char *)sqlite3_column_text(fSQLiteStmtP,aColIndex-1); // read something, next column aColIndex++; } } else #endif { #ifdef ODBCAPI_SUPPORT if (!fmiP->fKeyFieldName.empty()) { fAgentP->getColumnValueAsString(aStatement,aColIndex,key,chs_ascii); // read something, next column aColIndex++; } #endif // ODBCAPI_SUPPORT } // use proxy for this field if (!fieldP->isBasedOn(fty_string)) { throw TSyncException(" allowed for string or BLOB fields only!"); } // create and install a proxy for this field PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,( "Installed proxy for '%s' to retrieve data later when needed. MasterKey='%s', 'DetailKey='%s'", fmiP->getName(), aItem.getLocalID(), key.c_str() )); TODBCFieldProxy *odbcProxyP = new TODBCFieldProxy(this,fmiP,aItem.getLocalID(),key.c_str()); // attach it to the string or blob field static_cast(fieldP)->setBlobProxy(odbcProxyP); } else #endif // STREAMFIELD_SUPPORT { // Note: this will also select fields that may not // be available for the current remote party, but these // will be suppressed by the TMultiFieldItemType descendant. // As different items COULD theoretically use different // formats, filtering here already would be complicated. // so we live with reading probably more fields than really // needed. #ifdef SQLITE_SUPPORT // - always for data access if (fUseSQLite) { // SQLite notnull = fAgentP->getSQLiteColValueAsField( fSQLiteStmtP, // local sqlite statement aColIndex-1, // SQLITE colindex starts at 0, not 1 like in ODBC dbfty, fieldP, fConfigP->fDataCharSet, fmiP->floating_ts ? TCTX_UNKNOWN : fConfigP->fDataTimeZone, fConfigP->fUserZoneOutput ); } else #endif { #ifdef ODBCAPI_SUPPORT // ODBC notnull=fAgentP->getColumnValueAsField( aStatement, aColIndex, dbfty, fieldP, fConfigP->fDataCharSet, // real charset, including UTF16 fmiP->floating_ts ? TCTX_UNKNOWN : fConfigP->fDataTimeZone, fConfigP->fUserZoneOutput ); #endif // ODBCAPI_SUPPORT } // next column aColIndex++; } } // if field available else { // this can happen with array maps mapping to field blocks with a too high fMaxRepeat // it should not happen with array fields. throw TSyncException(DEBUGTEXT("FATAL: Field in map not found in item","odds6")); } } // if fid specified else { // no field mapped, skip column aColIndex++; } } // if readable, not array and correct set number (and thus SELECTed) field } catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,( "fillFieldsFromSQLResult field='%s', colindex=%hd, fid=%hd%s, setno=%hd, dbfty=%s,failed: %s", fmiP->fElementName.c_str(), aColIndex, fmiP->fid, fmiP->isArray() ? " (array)" : "", fmiP->setNo, DBFieldTypeNames[fmiP->dbfieldtype], e.what() )); throw; } } // field loop } // TODBCApiDS::fillFieldsFromSQLResult #ifdef ARRAYDBTABLES_SUPPORT // read an array field // NOTE: non-array fields are already read when this is called void TODBCApiDS::readArray(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapArrayItem *aMapItemP) { string sql; sInt16 colindex,i; uInt16 setno; TODBCFieldMapArrayItem *fmaiP = dynamic_cast(aMapItemP); if (!fmaiP) return; // do nothing #ifdef SCRIPT_SUPPORT // process init script fArrIdx=0; // start at array index=0 fParentKey=aItem.getLocalID(); fWriting=false; fInserting=false; fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::executeTest( true, // read array if script returns nothing or no script present fScriptContextP, // context fmaiP->fInitScript, // the script fConfigP->getDSFuncTableP(),fAgentP, // funcdefs/context &aItem,true // target item, writeable )) { // prevented array reading by script returning false return; // do nothing for this array } #else fArrIdx=0; // start at array index=0 #endif // SCRIPT_SUPPORT // process SQL statement(s) i=0; while (getNextSQLStatement(fmaiP->fSelectArraySQL,i,sql,setno)) { // Apply substitutions resetSQLParameterMaps(); DoDataSubstitutions(sql,fmaiP->fArrayFieldMapList,setno,false,false,&aItem,fArrIdx*fmaiP->fRepeatInc); prepareSQLStatement(aStatement, sql.c_str(),true,"reading array"); // - prepare parameters bindSQLParameters(aStatement,true); // Execute try { execSQLStatement(aStatement,sql,true,NULL,true); } catch (exception &e) { PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI,( "readarray:execSQLStatement sql='%s' failed: %s", sql.c_str(), e.what() )); throw; } // get out params saveAndCleanupSQLParameters(aStatement,true); // Fetch // - fetch result(s) now, at most fMaxRepeat while (fmaiP->fMaxRepeat==0 || fArrIdxfMaxRepeat) { colindex=1; // ODBC style, fillFieldsFromSQLResult will adjust for SQLite if needed if (!fetchNextRow(aStatement,true)) break; // all available rows fetched // now fill data into array's mapped fields (array fields or field blocks) fillFieldsFromSQLResult(aStatement,colindex,aItem,fmaiP->fArrayFieldMapList,setno,fArrIdx*fmaiP->fRepeatInc); #ifdef SCRIPT_SUPPORT // process afterread script fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fmaiP->fAfterReadScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif // increment array index/count fArrIdx++; } // no more records finalizeSQLStatement(aStatement,true); // save size of array in "sizefrom" field (if it's not an array) TItemField *fldP = getMappedBaseFieldOrVar(aItem,fmaiP->fid); if (fldP && !fldP->isArray()) fldP->setAsInteger(fArrIdx); // make pass filter if there are no items in the array #ifdef OBJECT_FILTERING if (fArrIdx==0) aItem.makePassFilter(fmaiP->fNoItemsFilter.c_str()); // item is made pass filter, if possible #endif #ifdef SCRIPT_SUPPORT // process finish script, can perform more elaborated stuff that makePassFilter can fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fmaiP->fFinishScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif } } // TODBCApiDS::readArray // write or delete an array field // NOTE: non-array fields are already written when this is called void TODBCApiDS::writeArray(bool aDelete, bool aInsert, SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapArrayItem *aMapItemP) { string sql; sInt16 i; uInt16 setno; bool done, allempty; TODBCFieldMapArrayItem *fmaiP = dynamic_cast(aMapItemP); PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI+DBG_EXOTIC,("Writing Array, fmaiP=0x%lX",(long)fmaiP)); if (!fmaiP) return; // do nothing PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI+DBG_EXOTIC,("Writing Array")); // Check initscript first. If it returns false, we do not insert anything bool doit; #ifdef SCRIPT_SUPPORT // process init script fArrIdx=0; // start at array index=0 fParentKey=aItem.getLocalID(); fWriting=true; fInserting=aInsert; fDeleting=aDelete; fAgentP->fScriptContextDatastore=this; doit = TScriptContext::executeTest( true, // write array if script returns nothing or no script present fScriptContextP, // context fmaiP->fInitScript, // the script &ODBCDSFuncTable1,fAgentP, // funcdefs/context &aItem,true // target item, writeable ); #else doit=true; // no script, always do it fArrIdx=0; // start at array index=0 #endif // SCRIPT_SUPPORT PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI+DBG_EXOTIC,("Writing Array: doit=%d, aDelete=%d, aInsert=%d",(int) doit,(int) aDelete,(int) aInsert)); // check if we need delete first if (doit && aDelete) { i=0; while (getNextSQLStatement(fmaiP->fDeleteArraySQL,i,sql,setno)) { // apply data substitutions resetSQLParameterMaps(); DoDataSubstitutions(sql,fmaiP->fArrayFieldMapList,setno,true,false,&aItem,0); // - prepare parameters prepareSQLStatement(aStatement, sql.c_str(),true,"array erase"); bindSQLParameters(aStatement,true); // issue execSQLStatement(aStatement,sql,true,NULL,true); // get out params saveAndCleanupSQLParameters(aStatement,true); // done finalizeSQLStatement(aStatement,true); } } // check if we need to insert the array elements doit=doit && aInsert; #ifdef OBJECT_FILTERING if (doit) { // test filter doit = fmaiP->fNoItemsFilter.empty() || // no filter, always generate !aItem.testFilter(fmaiP->fNoItemsFilter.c_str()); // if item passes filter, array should not be written } #endif if (doit) { // do array write sInt32 numElements=0; // unlimited to begin with // - see if we have a sizefrom field TItemField *fldP = getMappedBaseFieldOrVar(aItem,fmaiP->fid); if (fldP) { if (fldP->isArray()) numElements=fldP->arraySize(); // number of detail records to write is size of this array else numElements=fldP->getAsInteger(); // number of detail records to write are specified in integer variable } else { // entire array (=up to INSERT statement that would contain only empty fields) // Note: we cannot use the size of a single array field, as there might be // more than one with different sizes. End of array is when // DoDataSubstitutions() returns allempty==true numElements=REP_ARRAY; // this is a big number } // - limit to maxrepeat if (fmaiP->fMaxRepeat!=0 && numElements>fmaiP->fMaxRepeat) numElements=fmaiP->fMaxRepeat; // - now write #ifdef SCRIPT_SUPPORT fDeleting=false; // no longer deleting records #endif while (fArrIdxfScriptContextDatastore=this; if (!TScriptContext::executeTest(true,fScriptContextP,fmaiP->fBeforeWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) goto endarray; #endif // perform insert statement(s) i=0; bool firststatement=true; while (getNextSQLStatement(fmaiP->fInsertElementSQL,i,sql,setno)) { // do substitutions and find out if empty resetSQLParameterMaps(); DoDataSubstitutions(sql,fmaiP->fArrayFieldMapList,setno,true,false,&aItem,fArrIdx*fmaiP->fRepeatInc,&allempty,&done); // stop here if FIRST STATEMENT in (unlimited) array insert is all empty if (firststatement && fmaiP->fMaxRepeat==0 && allempty) goto endarray; // store if not empty or empty storage allowed if (fmaiP->fStoreEmpty || !allempty) { // - prepare parameters prepareSQLStatement(aStatement, sql.c_str(),true,"array element insert"); bindSQLParameters(aStatement,true); // issue execSQLStatement(aStatement,sql,false,NULL,true); // get out params saveAndCleanupSQLParameters(aStatement,true); // no more records finalizeSQLStatement(aStatement,true); } firststatement=false; } #ifdef SCRIPT_SUPPORT // process afterwrite script, end of array if it returns false fAgentP->fScriptContextDatastore=this; if (!TScriptContext::executeTest(true,fScriptContextP,fmaiP->fAfterWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) goto endarray; #endif // next fArrIdx++; } // while endarray: #ifdef SCRIPT_SUPPORT // process finish script fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fmaiP->fFinishScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif ; } } // TODBCApiDS::writeArray // read array fields. // - if aStatement is passed NULL, routine will allocate/destroy its // own statement for reading the array fields void TODBCApiDS::readArrayFields(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapList &fml) { TFieldMapList::iterator pos; // get data for all array table fields for (pos=fml.begin(); pos!=fml.end(); pos++) { if ((*pos)->isArray()) { readArray(aStatement,aItem,(TFieldMapArrayItem *)*pos); } } } // TODBCApiDS::readArrayFields void TODBCApiDS::writeArrayFields(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapList &fml, bool aInsert) { TFieldMapList::iterator pos; // write all array table fields for (pos=fml.begin(); pos!=fml.end(); pos++) { if ((*pos)->isArray()) { // delete first, then insert writeArray(!aInsert || static_cast(*pos)->fAlwaysCleanArray,true,aStatement,aItem,(TFieldMapArrayItem *)*pos); } } } // TODBCApiDS::writeArrayFields void TODBCApiDS::deleteArrayFields(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapList &fml) { TFieldMapList::iterator pos; // delete all array table fields for (pos=fml.begin(); pos!=fml.end(); pos++) { if ((*pos)->isArray()) { // only delete, no insert writeArray(true,false,aStatement,aItem,(TFieldMapArrayItem *)*pos); } } } // TODBCApiDS::deleteArrayFields #endif // ARRAYDBTABLES_SUPPORT // append field value(s) as single literal to SQL text // - returns true if field(s) were not empty // - even non-existing or empty field will append at least NULL or '' to SQL bool TODBCApiDS::appendFieldsLiteral(TMultiFieldItem &aItem, sInt16 aFid, sInt16 aRepOffset,TODBCFieldMapItem &aFieldMapping, string &aSQL) { string val; bool notempty=false; TItemField *fieldP; // get mapped item field or local script variable fieldP=getMappedFieldOrVar(aItem,aFid,aRepOffset,true); // existing (array fields) only // now process single field if (!fieldP) goto novalue; // no data -> empty notempty=appendFieldValueLiteral(*fieldP, aFieldMapping.dbfieldtype, aFieldMapping.maxsize, aFieldMapping.floating_ts, aSQL); return notempty; novalue: // no value was produced aSQL+="NULL"; return false; } // TODBCApiDS::appendFieldsLiteral // append field value as literal to SQL text // - returns true if field(s) were not empty // - even non-existing or empty field will append at least NULL or '' to SQL bool TODBCApiDS::appendFieldValueLiteral(TItemField &aField,TDBFieldType aDBFieldType, uInt32 aMaxSize, bool aIsFloating, string &aSQL) { return fAgentP->appendFieldValueLiteral( aField, aDBFieldType, aMaxSize, aSQL, fConfigP->sqlPrepCharSet(), fConfigP->fDataLineEndMode, fConfigP->fQuotingMode, aIsFloating ? TCTX_UNKNOWN : fConfigP->fDataTimeZone, fRecordSize ); } // TODBCApiDS::appendFieldValueLiteral // issue single (or multiple) data update statements // NOTE: returns false if no rows affected. If no information about rows affected // is found, returns false if all statements return SQL_NODATA. // If config fIgnoreAffectedCount is set, always returns true (unless we have an error). bool TODBCApiDS::IssueDataWriteSQL( SQLHSTMT aStatement, const string &aSQL, const char *aComment, bool aForUpdate, TFieldMapList &aFieldMapList, // field map list for %N,%V and %v TMultiFieldItem *aItemP // item to read values and localid from ) { uInt16 setno=0; // default to 0 string sql; bool d,hasdata=false; SQLLEN affectedRows,totalAffected=-1; sInt16 i=0; // add field values fRecordSize=0; // reset count, appendFieldValueLiteral will update size while (getNextSQLStatement(aSQL,i,sql,setno)) { // - do substitutions resetSQLParameterMaps(); PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("SQL before substitutions: %s",aSQL.c_str())); DoDataSubstitutions( sql, // string to apply substitutions to aFieldMapList, // field map list for %N,%V and %v setno, // set number true, // for write aForUpdate, // for update? aItemP // item to read values and localid from ); // - prepare parameters prepareSQLStatement(aStatement, sql.c_str(),true,aComment); bindSQLParameters(aStatement,true); // - execute it d = execSQLStatement(aStatement,sql,true,NULL,true); // - get number of affected rows #ifdef SQLITE_SUPPORT if (fUseSQLite) { affectedRows = sqlite3_changes(fSQLiteP); } else #endif { #ifdef ODBCAPI_SUPPORT SQLRETURN res = SQLRowCount(aStatement,&affectedRows); if (res!=SQL_SUCCESS && res!=SQL_SUCCESS_WITH_INFO) affectedRows = -1; // unknown #else affectedRows=0; // no API, no rows affected #endif } // - count affected rows if (totalAffected<0) totalAffected = affectedRows; else if (affectedRows>0) totalAffected += affectedRows; PDEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("IssueDataWriteSQL: Statement reports %ld affected rows - totalAffected=%ld",affectedRows,totalAffected)); // get out params saveAndCleanupSQLParameters(aStatement,true); // done with statement finalizeSQLStatement(aStatement,true); hasdata = hasdata || d; } if (fConfigP->fIgnoreAffectedCount) return true; // assume always successful else if (totalAffected<0) return hasdata; // no reliable info about affected rows - use hasdata instead else return totalAffected>0; // assume modified something if any row was affected } // TODBCApiDS::IssueDataWriteSQL #ifdef HAS_SQL_ADMIN // issue single (or multiple) map access statements // NOTE: if all return SQL_NODATA, function will return false. bool TODBCApiDS::IssueMapSQL( SQLHSTMT aStatement, const string &aSQL, const char *aComment, TMapEntryType aEntryType, const char *aLocalID, const char *aRemoteID, uInt32 aMapFlags ) { uInt16 setno=0; // default to 0 string sql; bool d,hasdata=false; sInt16 i=0; while (getNextSQLStatement(aSQL,i,sql,setno)) { // - do substitutions DoMapSubstitutions(sql,aEntryType,aLocalID,aRemoteID,aMapFlags); // - execute it d = execSQLStatement(aStatement,sql,true,aComment,false); hasdata = hasdata || d; } return hasdata; } // TODBCApiDS::IssueMapSQL #endif // HAS_SQL_ADMIN // execute SQL statement as-is, without any substitutions bool TODBCApiDS::execSQLStatement(SQLHSTMT aStatement, string &aSQL, bool aNoDataAllowed, const char *aComment, bool aForData) { #ifdef ODBCAPI_SUPPORT SQLRETURN res; #endif // show what statement will be executed #ifdef SYDEBUG if (aComment && PDEBUGTEST(DBG_DBAPI)) { PDEBUGPRINTFX(DBG_DBAPI,("SQL for %s:",aComment)); PDEBUGPUTSX(DBG_DBAPI,aSQL.c_str()); } #endif // avoid executing empty statement if (aSQL.empty()) return true; // "ok", nothing to execute #ifdef SQLITE_SUPPORT if (fUseSQLite && aForData) { // execute (possibly already prepared) statement in SQLite if (!fSQLiteStmtP) { // not yet prepared, do it now fAgentP->prepareSQLiteStatement(aSQL.c_str(),fSQLiteP,fSQLiteStmtP); } // do first step fStepRc = sqlite3_step(fSQLiteStmtP); // clean up right now if we don't have data if (fStepRc!=SQLITE_ROW) { fStepRc=sqlite3_finalize(fSQLiteStmtP); fSQLiteStmtP=NULL; fAgentP->checkSQLiteError(fStepRc,fSQLiteP); } // check if we MUST have data here if (!aNoDataAllowed) { if (fStepRc!=SQLITE_ROW) { // we're not happy because we have no data return false; } } return true; // ok } #endif { #ifdef ODBCAPI_SUPPORT // execute statement TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); #ifdef ODBC_UNICODE if (fConfigP->fDataCharSet==chs_utf16) { // aSQL is UTF-8 here // make UCS2 string to pass to wide char API string wSQL; appendUTF8ToUTF16ByteString(aSQL.c_str(), wSQL, ODBC_BIGENDIAN); wSQL += (char)0; // together with the implicit 8-bit NUL terminator, this makes a 16-bit NUL terminator // execute it with the "W" version res = SafeSQLExecDirectW( aStatement, (SQLWCHAR *)wSQL.c_str(), wSQL.size()/2 // actual number of Unicode chars ); } else #endif // ODBC_UNICODE { res = SafeSQLExecDirect( aStatement, (SQLCHAR *)aSQL.c_str(), aSQL.size() ); } TP_START(fSessionP->fTPInfo,li); // check if (aNoDataAllowed) return fAgentP->checkStatementHasData(res,aStatement); else { fAgentP->checkStatementError(res,aStatement); return true; } #endif // ODBCAPI_SUPPORT } // should never happen return false; } // TODBCApiDS::execSQLStatement // get next statment from statement list // - may begin with %GO(setno) bool TODBCApiDS::getNextSQLStatement(const string &aSQL, sInt16 &aStartAt, string &aOneSQL, uInt16 &aSetNo) { aSetNo=0; // default to set 0 string::size_type e; bool foundone=false; sInt32 n=aSQL.size(); // check for %GO while (aStartAtstring::size_type(aStartAt)) { // Not-empty statement aOneSQL.assign(aSQL,aStartAt,e-aStartAt); // Next statement starts here aStartAt=e; // statement found foundone=true; break; } } // while more in input and empty statement return foundone; } // TODBCApiDS::getNextSQLStatement // inform logic of coming state change localstatus TODBCApiDS::dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { // let inherited do its stuff as well return inherited::dsBeforeStateChange(aOldState,aNewState); } // TODBCApiDS::dsBeforeStateChange // inform logic of happened state change localstatus TODBCApiDS::dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { // let inherited do its stuff as well return inherited::dsAfterStateChange(aOldState,aNewState); } // TODBCApiDS::dsAfterStateChange #ifdef ODBCAPI_SUPPORT // Routine mapping #define lineartimeToLiteralAppend lineartimeToODBCLiteralAppend #endif // ODBCAPI_SUPPORT #ifdef HAS_SQL_ADMIN // log datastore sync result // - Called at end of sync with this datastore void TODBCApiDS::dsLogSyncResult(void) { uInt16 setno=0; // default to 0 string sql; sInt16 i=0; // if we have a SQL statement and logging of this session is enabled, log if (fSessionP->logEnabled() && !fAgentConfigP->fWriteLogSQL.empty()) { // execute SQL statement for logging try { SQLHSTMT statement=fAgentP->newStatementHandle(getODBCConnectionHandle()); try { while (getNextSQLStatement(fAgentConfigP->fWriteLogSQL,i,sql,setno)) { // - do substitutions DoLogSubstitutions(sql,false); execSQLStatement(statement,sql,true,"Log Entry Write",false); finalizeSQLStatement(statement,false); } // release the statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); // commit the transaction (this is called AFTER the data transactions probably have been // rolled back in EndDataWrite SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); } catch (exception &e) { // release the statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); throw; } } catch (exception &e) { // release the statement handle PDEBUGPRINTFX(DBG_ERROR,("Failed to issue Log SQL statement: %s",e.what())); } } // let ancestor process TStdLogicDS::dsLogSyncResult(); } // TODBCApiDS::dsLogSyncResult // Do logfile SQL/plaintext substitutions void TODBCApiDS::DoLogSubstitutions(string &aLog,bool aPlaintext) { string s; size_t i; // logging if (!aPlaintext) { // only for SQL text // Note: we need to do free form strings here to ensure correct DB string escaping // %rD Datastore remote path StringSubst(aLog,"%rD",getRemoteDBPath(),3,chs_ascii,lem_cstr,fConfigP->fQuotingMode); // %nR Remote name: [Manufacturer ]Model") StringSubst(aLog,"%nR",fSessionP->getRemoteDescName(),3,chs_ascii,lem_cstr,fConfigP->fQuotingMode); // %vR Remote Device Version Info ("Type (HWV, FWV, SWV) Oem") StringSubst(aLog,"%vR",fSessionP->getRemoteInfoString(),3,chs_ascii,lem_cstr,fConfigP->fQuotingMode); // %U User Name StringSubst(aLog,"%U",fSessionP->getSyncUserName(),2,chs_ascii,lem_cstr,fConfigP->fQuotingMode); // %lD Datastore local path (complete with all CGI) StringSubst(aLog,"%lD",getRemoteViewOfLocalURI(),3,chs_ascii,lem_cstr,fConfigP->fQuotingMode); // %iR Remote Device ID (URI) StringSubst(aLog,"%iR",fSessionP->getRemoteURI(),3,chs_ascii,lem_cstr,fConfigP->fQuotingMode); // %dT Sync date i=0; while((i=aLog.find("%dT",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fCurrentSyncTime, s, true, false, TCTX_UTC, fConfigP->fDataTimeZone); aLog.replace(i,3,s); i+=s.size(); } // %tT Sync time i=0; while((i=aLog.find("%tT",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fCurrentSyncTime, s, false, true, TCTX_UTC, fConfigP->fDataTimeZone); aLog.replace(i,3,s); i+=s.size(); } // %T Sync timestamp i=0; while((i=aLog.find("%T",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fCurrentSyncTime, s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); aLog.replace(i,2,s); i+=s.size(); } // %ssT Sync start time timestamp i=0; while((i=aLog.find("%ssT",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fSessionP->getSessionStarted(), s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); aLog.replace(i,4,s); i+=s.size(); } // %seT Sync end time timestamp i=0; while((i=aLog.find("%seT",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(getEndOfSyncTime(), s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); aLog.replace(i,4,s); i+=s.size(); } } // - let ancestor process its own substitutions TStdLogicDS::DoLogSubstitutions(aLog,aPlaintext); // %t Target Key // %f Folder Key // %u User key // %d device key // - let standard SQL substitution handle this DoSQLSubstitutions(aLog); } // TODBCApiDS::DoLogSubstitutions // do substitutions for map table access void TODBCApiDS::DoMapSubstitutions( string &aSQL, // string to apply substitutions to TMapEntryType aEntryType, // the entry type const char *aLocalID, // local ID const char *aRemoteID, // remote ID uInt32 aMapFlags // map flags ) { // can be empty, but we don't do NULLs if (!aLocalID) aLocalID=""; if (!aRemoteID) aRemoteID=""; // %k = data key (local ID) StringSubst(aSQL,"%k",aLocalID,2,-1,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // %r = remote ID (always a string) StringSubst(aSQL,"%r",aRemoteID,2,-1,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // %x = flags (a uInt32) StringSubst(aSQL,"%x",(sInt32)aMapFlags,2); // %e = entry type (a small number, uInt8 is enough) StringSubst(aSQL,"%e",(sInt32)aEntryType,2); // now substitute standard: %f=folderkey, %u=userkey, %t=targetkey DoSQLSubstitutions(aSQL); } // TODBCApiDS::DoMapSubstitutions #endif // HAS_SQL_ADMIN // Do the SQL substitutions common for all SQL statements void TODBCApiDS::DoSQLSubstitutions(string &aSQL) { string::size_type i; // let session substitute session level stuff first fAgentP->DoSQLSubstitutions(aSQL); StringSubst(aSQL,"%f",fFolderKey,2,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); StringSubst(aSQL,"%t",fTargetKey,2,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // ID generator // - new ID i=0; while((i=aSQL.find("%X",i))!=string::npos) { // - generate new one nextLocalID(fConfigP->fSpecialIDMode,SQL_NULL_HANDLE); // - use it aSQL.replace(i,2,fLastGeneratedLocalID); i+=fLastGeneratedLocalID.size(); } // last used ID StringSubst(aSQL,"%x",fLastGeneratedLocalID,2,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); } // TODBCApiDS::DoSQLSubstitutions typedef struct { const char *substTag; int substCode; } TSubstHandlerDef; typedef enum { dsh_datakey, dsh_datakey_outparam_string, dsh_datakey_outparam_integer, dsh_fieldnamelist, dsh_fieldnamelist_a, dsh_namevaluelist, dsh_namevaluelist_a, dsh_valuelist, dsh_valuelist_a, dsh_param, dsh_field, dsh_recordsize, dsh_moddate, dsh_modtime, dsh_moddatetime, dsh_andfilter, dsh_wherefilter, // number of enums dsh_NUMENTRIES } TDataSubstHandlers; static TSubstHandlerDef DataSubstHandlers[dsh_NUMENTRIES] = { { "k", dsh_datakey }, { "pkos", dsh_datakey_outparam_string }, { "pkoi", dsh_datakey_outparam_integer }, { "N", dsh_fieldnamelist }, { "aN", dsh_fieldnamelist_a }, { "V", dsh_namevaluelist }, { "aV", dsh_namevaluelist_a }, { "v", dsh_valuelist }, { "av", dsh_valuelist_a }, { "p(", dsh_param }, { "d(", dsh_field }, { "S", dsh_recordsize }, { "dM", dsh_moddate }, { "tM", dsh_modtime }, { "M", dsh_moddatetime }, { "AF", dsh_andfilter }, { "WF", dsh_wherefilter } }; // do substitutions for data table access void TODBCApiDS::DoDataSubstitutions( string &aSQL, // string to apply substitutions to TFieldMapList &aFieldMapList, // field map list for %N,%V and %v uInt16 aSetNo, // Map Set number bool aForWrite, // set if read-enabled or write-enabled fields are shown in %N,%V and %v bool aForUpdate, // set if for update (only assigned fields will be shown if !fUpdateAllFields) TMultiFieldItem *aItemP, // item to read values and localid from sInt16 aRepOffset, // array index/repeat offset bool *aAllEmptyP, // true if all %V or %v empty bool *aDoneP // true if no data at specified aRepOffset ) { string::size_type i,j,k,m,m2,n; string s,s2; string inStr; int handlerid; // default settings of flags bool done=true; // default, in case %V or %v is missing (which could limit repetitions for arrays) bool allempty=false; // not all empty unless we see that %V has all empty fields // substitute one by one in the order the escape sequences appear in the SQL string // (this is important for correct parameter mapping!!) i=0; inStr=aSQL; aSQL.erase(); // will be rebuilt later while((i=inStr.find("%",i))!=string::npos) { // potential escape sequence found // - search in table for (handlerid=0; handleridgetLocalID(); break; case dsh_datakey_outparam_string: // generated key output (string key) addSQLParameterMap(false,true,param_localid_str,NULL,aItemP,aRepOffset); goto paramsubst; case dsh_datakey_outparam_integer: // generated key output (integer key) addSQLParameterMap(false,true,param_localid_int,NULL,aItemP,aRepOffset); goto paramsubst; case dsh_fieldnamelist: case dsh_fieldnamelist_a: // %N and %aN = field name list addFieldNameList(s,aForWrite,aForUpdate,substCode!=dsh_fieldnamelist_a && !fConfigP->fUpdateAllFields && aForUpdate && aItemP,aItemP,aFieldMapList,aSetNo); break; case dsh_namevaluelist: case dsh_namevaluelist_a: if (!aItemP) break; // needs an item // %V,%aV = data field=value list addFieldNameValueList(s,substCode!=dsh_namevaluelist_a && !fConfigP->fUpdateAllFields && aForUpdate,done,allempty,*aItemP,true,aFieldMapList,aSetNo,aRepOffset,allempty); break; case dsh_valuelist: case dsh_valuelist_a: if (!aItemP) break; // needs an item // %v,%av = data value list addFieldNameValueList(s,substCode!=dsh_valuelist_a && !fConfigP->fUpdateAllFields && aForUpdate,done,allempty,*aItemP,false,aFieldMapList,aSetNo,aRepOffset,allempty); break; case dsh_param: // handle with global routine used in different substitution places // i=start of % sequence, n=size of matched basic sequence = %+identifier+( = %p( if (!fAgentP->ParseParamSubst( inStr,i,n, fParameterMaps, aItemP #ifdef SCRIPT_SUPPORT ,fScriptContextP #endif )) break; // i=start of % sequence, n=size of entire sequence including params and closing paranthesis paramsubst: s="?"; break; case dsh_field: // init options upc=false; lowc=false; asci=false; // skip lead-in j=i+n; // find closing paranthesis k = inStr.find(")",j); if (k==string::npos) { i=j; n=0; break; } // no closing paranthesis m = k; // assume end of name is here m2 = k; // look for dbfieldtype dbfty=dbft_numeric; // default to numeric (no quotes, to be compatible with old %d() definition) m2 = inStr.find(",",j); if (m2!=string::npos) { // get dbfieldtype if (StrToEnum(DBFieldTypeNames,numDBfieldTypes,ty,inStr.c_str()+m2+1,k-m2-1)) dbfty=(TDBFieldType)ty; } else m2=k; // set end of name to closing paranthesis again #ifdef ARRAYFIELD_SUPPORT // also look for array index m = inStr.find("#",j); if (m!=string::npos && mgetIdentifierIndex(OBJ_AUTO, aItemP->getFieldDefinitions(),s.c_str()); fldP=fScriptContextP->getFieldOrVar(aItemP,idx,arrindex); } else #endif fldP = aItemP->getArrayField(s.c_str(),arrindex,true); if (!fldP) { i=k+1; n=0; break; } // field not found, no action // produce DB literal sz=0; s.erase(); fAgentP->appendFieldValueLiteral( *fldP, dbfty, 0, // unlimited s, asci ? chs_ascii : fConfigP->sqlPrepCharSet(), fConfigP->fDataLineEndMode, fConfigP->fQuotingMode, fConfigP->fDataTimeZone, sz ); // apply options if (upc) StringUpper(s); else if (lowc) StringLower(s); fRecordSize+=s.size(); // set substitution parameters n=k+1-i; break; case dsh_recordsize: if (aItemP) StringObjPrintf(s,"%ld",(long)fRecordSize); break; #ifdef ODBCAPI_SUPPORT case dsh_moddate: // %dM = modified date fAgentP->lineartimeToODBCLiteralAppend(fCurrentSyncTime,s,true,false,TCTX_UTC,fConfigP->fDataTimeZone); break; case dsh_modtime: // %tM = modified time fAgentP->lineartimeToODBCLiteralAppend(fCurrentSyncTime,s,false,true,TCTX_UTC,fConfigP->fDataTimeZone); break; #endif // ODBCAPI_SUPPORT case dsh_moddatetime: // %M = modified datetimestamp #ifdef SQLITE_SUPPORT if (fUseSQLite) { // integer timestamp modes fAgentP->lineartimeToIntLiteralAppend(fCurrentSyncTime,s,fConfigP->fLastModDBFieldType,TCTX_UTC,fConfigP->fDataTimeZone); } #ifdef ODBCAPI_SUPPORT else #endif #endif #ifdef ODBCAPI_SUPPORT { if (fConfigP->fLastModDBFieldType==dbft_timestamp) fAgentP->lineartimeToODBCLiteralAppend(fCurrentSyncTime,s,true,true,TCTX_UTC,fConfigP->fDataTimeZone); else fAgentP->lineartimeToIntLiteralAppend(fCurrentSyncTime,s,fConfigP->fLastModDBFieldType,TCTX_UTC,fConfigP->fDataTimeZone); } #endif // ODBCAPI_SUPPORT ; // make sure we can't else out the break break; #ifdef OBJECT_FILTERING case dsh_andfilter: if (fFilterWorksOnDBLevel && fFilterExpressionTested) appendFiltersClause(s,"AND"); break; case dsh_wherefilter: if (fFilterWorksOnDBLevel && fFilterExpressionTested) appendFiltersClause(s,"WHERE"); break; #endif default: i+=n; // continue parsing after unhandled tag n=0; // no replacement break; } // switch // apply substitution if any (n>0) // - i=pos of %, n=size of text to be replaced, s=replacement string // Note: if n==0, i must point to where parsing should continue if (n>0) { // get everything up to this % sequence string intermediateStr; intermediateStr.assign(inStr,0,i); // have non-processed sequences processed for the other substitution possibilities now // %f=folderkey, %u=userkey, %d=devicekey, %t=targetkey, %C=domain // Note: it is important that %t and %d is checked here, after %d(), %tL and %tS above!! //DEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Intermediate before applying basic substitutions: '%s'",intermediateStr.c_str())); DoSQLSubstitutions(intermediateStr); //DEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Intermediate after applying basic substitutions: '%s'",intermediateStr.c_str())); // add it to the output string aSQL+=intermediateStr; // add the substitution (will NOT BE PROCESSED AGAIN!!) aSQL+=s; // have the rest of the inStr processed inStr.erase(0,i+n); // remove already processed stuff and escape sequence now // reset parsing position in inStr i=0; //DEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("- substitution with '%s' done, SQL so far: '%s'",s.c_str(),aSQL.c_str())); //DEBUGPRINTFX(DBG_DBAPI+DBG_EXOTIC,("Remaining input string to process: '%s'",inStr.c_str())); } // sequence substitution done break; } } // for if (handlerid>=dsh_NUMENTRIES) { // unknown sequence // - check if this is an explicit literal % (two % in sequence) if (inStr[i+1]=='%') { // yes, replace %% by % in output inStr.replace(i,2,"%"); i+=1; } else { // no, just leave % in input as it is i+=1; } } } // while % found in string // process rest of inStr (not containing any of the above sequences, but probably some from // parent implementation // have non-processed sequences processed for the other substitution possibilities now // %f=folderkey, %u=userkey, %d=devicekey, %t=targetkey, %C=domain // Note: it is important that %t and %d is checked here, after %d(), %tL and %tS above!! DoSQLSubstitutions(inStr); // Append end of inStr to output aSQL+=inStr; // return flags if (aAllEmptyP) *aAllEmptyP=allempty; if (aDoneP) *aDoneP=done; } // TODBCApiDS::DoDataSubstitutions // insert additional data selection conditions, if any. Returns true if something appended bool TODBCApiDS::appendFiltersClause(string &aSQL, const char *linktext) { #ifndef OBJECT_FILTERING return false; // no filters #else if ( (!fConfigP->fFilterOnDBLevel || (fLocalDBFilter.empty() && fSyncSetFilter.empty() && fConfigP->fInvisibleFilter.empty())) #ifdef SCRIPT_SUPPORT && fSQLFilter.empty() #endif ) return false; // no filter clause needed // some conditions, add link text if (linktext) { aSQL+=' '; aSQL+=linktext; aSQL+=' '; } linktext=NULL; // link within paranthesis #ifdef SCRIPT_SUPPORT // - Explicit SQL filter if (!fSQLFilter.empty()) { if (linktext) aSQL+=linktext; linktext=" AND "; aSQL+='('; aSQL+=fSQLFilter; aSQL+=')'; } #endif // - hardcoded filter conditions if (!fLocalDBFilter.empty()) { if (linktext) aSQL+=linktext; linktext=" AND "; aSQL+='('; if (!appendFilterConditions(aSQL,fLocalDBFilter)) throw TSyncException(" incompatible with SQL database"); aSQL+=')'; } // - filter invisible items if (!fConfigP->fInvisibleFilter.empty()) { if (linktext) aSQL+=linktext; linktext=" AND "; aSQL+="NOT ("; if (!appendFilterConditions(aSQL,fConfigP->fInvisibleFilter)) throw TSyncException(" incompatible with SQL database"); aSQL+=')'; } // - sync set filter conditions if (!fSyncSetFilter.empty()) { if (linktext) aSQL+=linktext; linktext=" AND "; aSQL+='('; if (!appendFilterConditions(aSQL,fSyncSetFilter)) throw TSyncException("sync set filter incompatible with SQL database"); aSQL+=')'; } return true; // something appended #endif // OBJECT_FILTERING } // TODBCApiDS::appendFiltersClause // reset all mapped parameters void TODBCApiDS::resetSQLParameterMaps(void) { #ifdef SQLITE_SUPPORT if (fUseSQLite) { // resetting the parameter map finalizes any possibly running statement if (fSQLiteStmtP) { sqlite3_finalize(fSQLiteStmtP); fSQLiteStmtP=NULL; } } #endif fAgentP->resetSQLParameterMaps(fParameterMaps); } // TODBCApiDS::resetSQLParameterMaps // add parameter definition to the datastore level parameter list void TODBCApiDS::addSQLParameterMap( bool aInParam, bool aOutParam, TParamMode aParamMode, TODBCFieldMapItem *aFieldMapP, TMultiFieldItem *aItemP, sInt16 aRepOffset ) { TParameterMap map; // assign basics map.inparam=aInParam; map.outparam=aOutParam; map.parammode=aParamMode; map.mybuffer=false; map.ParameterValuePtr=NULL; map.BufferLength=0; map.StrLen_or_Ind=SQL_NULL_DATA; // note that this is not zero (but -1) map.itemP=aItemP; map.outSiz=NULL; // get things from field map if (aFieldMapP) { map.fieldP=getMappedFieldOrVar(*aItemP,aFieldMapP->fid,aRepOffset); map.maxSize=aFieldMapP->maxsize; map.dbFieldType=aFieldMapP->dbfieldtype; } else { map.fieldP=NULL; map.maxSize=0; map.dbFieldType=dbft_string; } // save in list fParameterMaps.push_back(map); } // TODBCApiDS::addSQLParameterMap // prepare SQL statment as far as needed for parameter binding void TODBCApiDS::prepareSQLStatement(SQLHSTMT aStatement, cAppCharP aSQL, bool aForData, cAppCharP aComment) { // show what statement will be executed #ifdef SYDEBUG if (aComment && aSQL && PDEBUGTEST(DBG_DBAPI)) { PDEBUGPRINTFX(DBG_DBAPI,("SQL for %s:",aComment)); PDEBUGPUTSX(DBG_DBAPI,aSQL); } #endif #ifdef SQLITE_SUPPORT if (fUseSQLite && aForData) { // bind params fAgentP->prepareSQLiteStatement( aSQL, fSQLiteP, fSQLiteStmtP ); } #endif } // TODBCApiDS::prepareSQLStatement // bind parameters (and values for IN-Params) to the statement void TODBCApiDS::bindSQLParameters(SQLHSTMT aStatement, bool aForData) { #ifdef SQLITE_SUPPORT if (fUseSQLite && aForData) { // bind params fAgentP->bindSQLiteParameters( fSessionP, fSQLiteStmtP, fParameterMaps, fConfigP->fDataCharSet, fConfigP->fDataLineEndMode ); } else #endif { #ifdef ODBCAPI_SUPPORT fAgentP->bindSQLParameters( fSessionP, aStatement, fParameterMaps, fConfigP->fDataCharSet, // actual charset, including utf16, bindSQLiteParameters handles UTF16 case fConfigP->fDataLineEndMode ); #endif } } // TODBCApiDS::bindSQLParameters // save out parameter values and clean up void TODBCApiDS::saveAndCleanupSQLParameters( SQLHSTMT aStatement, bool aForData ) { #ifdef SQLITE_SUPPORT if (fUseSQLite && aForData) { // NOP here because SQLite has no out params return; } else #endif { #ifdef ODBCAPI_SUPPORT fAgentP->saveAndCleanupSQLParameters( fSessionP, aStatement, fParameterMaps, fConfigP->fDataCharSet, // actual charset, including utf16, saveAndCleanupSQLParameters handles UTF16 case fConfigP->fDataLineEndMode ); #endif } } // TODBCApiDS::bindSQLParameters // Fetch next row from SQL statement, returns true if there is any bool TODBCApiDS::fetchNextRow(SQLHSTMT aStatement, bool aForData) { #ifdef SQLITE_SUPPORT if (fUseSQLite && aForData) { int rc = fStepRc; if (rc!=SQLITE_ROW) { if (rc==SQLITE_OK) { // last step was ok, we need to do next step first rc = sqlite3_step(fSQLiteStmtP); } } // clean up right now if we don't have data if (rc!=SQLITE_ROW) { rc=sqlite3_finalize(fSQLiteStmtP); fStepRc = rc; fSQLiteStmtP=NULL; fAgentP->checkSQLiteError(rc,fSQLiteP); return false; // no more data } else { // we are reporting data now, make sure we fetch data in next call fStepRc=SQLITE_OK; } // more data found return true; // ok } else #endif #ifdef ODBCAPI_SUPPORT { if (aStatement==SQL_NULL_HANDLE) return false; // no statement, nothing fetched SQLRETURN res=SafeSQLFetch(aStatement); // check for end return fAgentP->checkStatementHasData(res,aStatement); } #else return false; // no API, no result #endif // ODBCAPI_SUPPORT } // TODBCApiDS::fetchNextRow // SQL statement complete, finalize it void TODBCApiDS::finalizeSQLStatement(SQLHSTMT aStatement, bool aForData) { #ifdef SQLITE_SUPPORT if (fUseSQLite && aForData) { // finalize if not already done if (fSQLiteStmtP) { sqlite3_finalize(fSQLiteStmtP); fSQLiteStmtP=NULL; } } else #endif { #ifdef ODBCAPI_SUPPORT // just close cursor of the statement SafeSQLCloseCursor(aStatement); #endif // ODBCAPI_SUPPORT } } // TODBCApiDS::prepareSQLStatement #ifdef OBJECT_FILTERING // - returns true if DB implementation can filter the standard filters // (LocalDBFilter, TargetFilter and InvisibleFilter) during database fetch // - otherwise, fetched items will be filtered after being read from DB. bool TODBCApiDS::dsFilteredFetchesFromDB(bool aFilterChanged) { // can do filtering while fetching from DB, such that items that get (in)visible // because of changed filter conditions are correctly detected as added/deleted if (aFilterChanged || !fFilterExpressionTested) { fFilterExpressionTested=true; if (fConfigP->fFilterOnDBLevel) { // try to dummy-append the filterclause to check if this will work string s; try { appendFiltersClause(s,""); fFilterWorksOnDBLevel=true; } catch(exception &e) { PDEBUGPRINTFX(DBG_FILTER+DBG_HOT,("%s -> filter will be applied to fetched records",e.what())); fFilterWorksOnDBLevel=false; } } else fFilterWorksOnDBLevel=false; // reject all DB level filtering } // if we can filter, that's sufficient if (fFilterWorksOnDBLevel) return true; // otherwise, let ancestor test return inherited::dsFilteredFetchesFromDB(aFilterChanged); } // TODBCApiDS::dsfilteredFetchesFromDB // - appends logical condition to SQL from filter string bool TODBCApiDS::appendFilterConditions(string &aSQL, const string &aFilter) { const char *p=aFilter.c_str(); return appendFilterTerm(aSQL,p,p+aFilter.size()); } // TODBCApiDS::appendFilterConditions // - appends logical condition term to SQL from filter string bool TODBCApiDS::appendFilterTerm(string &aSQL, const char *&aPos, const char *aStop) { char c=0; const char *st; string str,cmp,val; bool result; sInt16 fid; bool specialValue; bool caseInsensitive; // determine max length if (aStop==NULL) aStop=aPos+strlen(aPos); // empty expression is ok do { result=true; // process simple term () // - get first non-space while (aPos<=aStop) { c=*aPos; if (c!=' ') break; aPos++; } // Term starts here, first char is c, aPos points to it // - check subexpression paranthesis if (c=='(') { // boolean term is grouped subexpression aSQL+='('; aPos++; result=appendFilterTerm(aSQL,aPos,aStop); // check if matching paranthesis if (*(aPos++)!=')') { PDEBUGPRINTFX(DBG_EXOTIC,("Filter expression syntax error at: %s",--aPos)); aPos=aStop; // skip rest return false; // always fail } aSQL+=')'; } else if (c==0) { // empty term, is ok return true; } else { // must be simple boolean term // - remember start of ident st=aPos; // - search end of ident while (isFilterIdent(c)) c=*(++aPos); // - c/aPos=char after ident, get ident str.assign(st,aPos-st); // - check for subscript index uInt16 subsIndex=0; // no index (is 1-based in DS 1.2 filter specs) if (c=='[') { // expect numeric index aPos++; // next aPos+=StrToUShort(aPos,subsIndex); if (*aPos!=']') { PDEBUGPRINTFX(DBG_ERROR,("Filter expression error (missing \"]\") at: %s",--aPos)); return false; // syntax error, does not pass } c=*(++aPos); // process next after subscript } // - get operator while (isspace(c)) c=*(++aPos); if (c==':') c=*(++aPos); // ignore assign-to-make-true modifier specialValue = c=='*'; // special-value modifier if (specialValue) c=*(++aPos); caseInsensitive = c=='^'; // case insensitive modifier if (caseInsensitive) c=*(++aPos); aPos++; // one char at least cmp.erase(); bool cmplike=c=='%' || c=='$'; if (cmplike) cmp= (c=='%') ? " LIKE " : " NOT LIKE "; // "contains" special case, use SQL LIKE %val% else { cmp+=c; // simply use first char as is if (c=='>' || c=='<') { if (*aPos=='=' || *aPos=='>') { c=*aPos++; cmp+=c; // >=, <= and <> } } } // - get comparison value while (isspace(c)) c=*(++aPos); st=aPos; // should start here while (aPos(getLocalSendType()); if (mfitP) fid=mfitP->getFilterIdentifierFieldIndex(str.c_str(),subsIndex); else return false; // field not known, bad syntax if (fid==FID_NOT_SUPPORTED) return false; // unknown field // search for map for that field id to obtain DB field name TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; TFieldMapList::iterator mainpos; TFieldMapList::iterator pos; bool mainfound=false; for (pos=fml.begin(); pos!=fml.end(); pos++) { // check field id, but search in setNo==0 only (fields of other sets are // not available when SELECTing syncset. if ((*pos)->setNo==0 && fid==(*pos)->fid) { if ((*pos)->isArray()) return false; // array fields cannot be used in filters // found if (mainfound) break; // second match just breaks loop (time for date, possibly) // main mainpos=pos; // save position of main field mainfound=true; // search for further fields with same fid (possibly needed for timefordate) } } if (!mainfound) { PDEBUGPRINTFX(DBG_EXOTIC,("Could not find DB field for fid=%hd",fid)); return false; // no such field } // - translate for special values if (specialValue) { if ((*mainpos)->dbfieldtype==dbft_string && val=="E") { // Empty is not NULL for strings val="''"; } else if (val=="N" || val=="E") { // for other types, NULL and EMPTY are the same val="NULL"; if (cmp!="=") cmp=" IS NOT "; else cmp=" IS "; } // now append (no check for caseInsensitive needed as NULL check does not need it aSQL+=(*mainpos)->fElementName; aSQL+=cmp; aSQL+=val; } else { // create field to convert value string correctly TItemField *valfldP = newItemField( mfitP->getFieldDefinition(fid)->type, getSessionZones() ); // assign value as string valfldP->setAsString(val.c_str()); // check for special case when timestamp is mapped to separate date/time fields if ( pos!=fml.end() && ( // if there is another map with the same fid ((*mainpos)->dbfieldtype==dbft_date && (*pos)->dbfieldtype==dbft_timefordate) ) ) { // separate date & time aSQL+='('; if (cmp=="=" || cmp=="<>") { // (datefield=val AND timefield=val) // (datefield<>val OR timefield<>val) aSQL+=(*mainpos)->fElementName; aSQL+=cmp; appendFieldValueLiteral(*valfldP, (*mainpos)->dbfieldtype,(*mainpos)->maxsize, (*mainpos)->floating_ts, aSQL); if (cmp=="=") aSQL+=" AND "; else aSQL+=" OR "; // - time field aSQL+=(*pos)->fElementName; aSQL+=cmp; appendFieldValueLiteral(*valfldP, (*pos)->dbfieldtype,(*pos)->maxsize, (*mainpos)->floating_ts, aSQL); } else { // (datefield >< val OR (datefield = val AND timefield >< val)) aSQL+=(*mainpos)->fElementName; aSQL+=cmp; appendFieldValueLiteral(*valfldP, (*mainpos)->dbfieldtype,(*mainpos)->maxsize, (*mainpos)->floating_ts, aSQL); aSQL+=" OR ("; aSQL+=(*mainpos)->fElementName; aSQL+='='; appendFieldValueLiteral(*valfldP, (*mainpos)->dbfieldtype,(*mainpos)->maxsize, (*mainpos)->floating_ts, aSQL); aSQL+=" AND "; // - time field aSQL+=(*pos)->fElementName; aSQL+=cmp; appendFieldValueLiteral(*valfldP, (*pos)->dbfieldtype,(*pos)->maxsize, (*mainpos)->floating_ts, aSQL); aSQL+=')'; } aSQL+=')'; } else { // standard case // field ><= val if (caseInsensitive) { aSQL+="LOWER("; aSQL+=(*mainpos)->fElementName; aSQL+=')'; aSQL+=cmp; // operator aSQL+="LOWER("; appendFieldValueLiteral(*valfldP, (*mainpos)->dbfieldtype,(*mainpos)->maxsize, (*mainpos)->floating_ts, aSQL); aSQL+=')'; } else { aSQL+=(*mainpos)->fElementName; aSQL+=cmp; appendFieldValueLiteral(*valfldP, (*mainpos)->dbfieldtype,(*mainpos)->maxsize, (*mainpos)->floating_ts, aSQL); } } // field can be deleted now delete valfldP; } // not special value } // refers to field } // simple boolean term // now check logical operators // - skip spaces c=*aPos++; while (c==' ') c=*(++aPos); // - check char at aPos if (c=='|') aSQL+=" OR "; else if (c=='&') aSQL+= " AND "; else { aPos--; // let caller check it break; // end of logical term } } while (true); // process terms until all done // conversion ok return true; } // TODBCApiDS::appendFilterTerm #endif // OBJECT_FILTERING #ifdef ODBCAPI_SUPPORT // get one or two successive columns as time stamp depending on config void TODBCApiDS::getColumnsAsTimestamp( SQLHSTMT aStatement, sInt16 &aColNumber, // will be updated by 1 or 2 bool aCombined, lineartime_t &aTimestamp, timecontext_t aTargetContext ) { lineartime_t t; if (aCombined) { // combined date/time fAgentP->getColumnValueAsTimestamp(aStatement,aColNumber++,aTimestamp); } else { // date, then time fAgentP->getColumnValueAsDate(aStatement,aColNumber++,aTimestamp); fAgentP->getColumnValueAsTime(aStatement,aColNumber++,t); aTimestamp+=t; // add time to date } // convert to target zone requested if (!TCTX_IS_UNKNOWN(aTargetContext)) { TzConvertTimestamp(aTimestamp,fConfigP->fDataTimeZone,aTargetContext,getSessionZones(),TCTX_UNKNOWN); } } // TODBCApiDS::getColumnsAsTimestamp #endif // ODBCAPI_SUPPORT // - get a column as integer based timestamp lineartime_t TODBCApiDS::dbIntToLineartimeAs( sInt64 aDBInt, TDBFieldType aDbfty, timecontext_t aTargetContext ) { lineartime_t ts = dbIntToLineartime(aDBInt, aDbfty); // convert to target zone requested if (!TCTX_IS_UNKNOWN(aTargetContext)) { TzConvertTimestamp(ts,fConfigP->fDataTimeZone,aTargetContext,getSessionZones(),TCTX_UNKNOWN); } return ts; } // TODBCApiDS::dbIntToLineartimeAs // create local ID with special algorithm void TODBCApiDS::createLocalID(string &aLocalID,TSpecialIDMode aSpecialIDMode) { lineartime_t unixms; switch (aSpecialIDMode) { case sidm_unixmsrnd6: // ID is generated by UNIX time in milliseconds, with 6 digits of random // appended. // - get Unix time in milliseconds: unixms = (getSession()->getSystemNowAs(TCTX_SYSTEM)-UnixToLineartimeOffset) // unix time in lineartime_t units *(1000/secondToLinearTimeFactor); // convert into ms unixms*=1000000; // room for 6 more digits // - add random number between 0 and 999999 unixms+=(sInt32)rand()*1000000/RAND_MAX; // - make numeric ID out of this StringObjPrintf(aLocalID,"%lld",(long long)unixms); break; default: aLocalID=""; } } // TODBCApiDS::createLocalID #ifdef HAS_SQL_ADMIN // update sync target localstatus TODBCApiDS::updateSyncTarget(SQLHSTMT aStatement, bool aSessionFinished) { string sql,s; localstatus sta=LOCERR_OK; resetSQLParameterMaps(); sql = fConfigP->fUpdateSyncTargetSQL; sInt32 i; // Suspend/Resume // - alert code for next resume StringSubst(sql,"%SUA",fResumeAlertCode,4); // - suspend reference time i=0; while((i=sql.find("%dSU",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousSuspendCmpRef, s, true, false, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,4,s); i+=s.size(); } // - suspend reference time i=0; while((i=sql.find("%tSU",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousSuspendCmpRef, s, false, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,4,s); i+=s.size(); } // - suspend reference time i=0; while((i=sql.find("%SU",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousSuspendCmpRef, s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // - last suspend identifier (for derived datastores that might need another token than time) StringSubst(sql,"%iSU",fPreviousSuspendIdentifier,4,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // - anchor StringSubst(sql,"%A",fLastRemoteAnchor,2,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // Suspend/Resume in mid-chunk // - lastitem StringSubst(sql,"%pSU",fLastSourceURI,4,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); StringSubst(sql,"%pTU",fLastTargetURI,4,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // - lastitemstatus StringSubst(sql,"%pSt",fLastItemStatus,4); // - partial item State/Mode long pista; if (fPartialItemState==pi_state_save_incoming) pista=(long)pi_state_loaded_incoming; else if (fPartialItemState==pi_state_save_outgoing) pista=(long)pi_state_loaded_outgoing; else pista=(long)pi_state_none; StringSubst(sql,"%pM",pista,3); // - size info StringSubst(sql,"%pTS",fPITotalSize,4); StringSubst(sql,"%pUS",fPIUnconfirmedSize,4); StringSubst(sql,"%pSS",fPIStoredSize,4); // - buffered data i=0; while((i=sql.find("%pDAT",i))!=string::npos) { sql.replace(i,5,"?"); i+=1; // now bind data to param TParameterMap map; map.inparam=true; map.outparam=false; map.parammode=param_buffer; map.outSiz=NULL; map.dbFieldType=dbft_blob; // - pass the buffer map.mybuffer=false; // not owned by ODBC api if (fPIStoredDataP) { map.BufferLength=fPIStoredSize; map.StrLen_or_Ind=fPIStoredSize; map.ParameterValuePtr=fPIStoredDataP; // the BLOB data to store } else { map.BufferLength=0; map.StrLen_or_Ind=SQL_NULL_DATA; // no data map.ParameterValuePtr=NULL; } // save in list fParameterMaps.push_back(map); } // - last to remote sync reference date // Note: If we DON'T HAVE fSyncTimeStampAtEnd, but HAVE fOneWayFromRemoteSupported, // we MUST NOT store the reference time here, but save save session start time. // The reference time will be saved under %dRS lineartime_t dltime; if (!fConfigP->fSyncTimeStampAtEnd && fConfigP->fOneWayFromRemoteSupported) dltime = fPreviousSyncTime; else dltime = fPreviousToRemoteSyncCmpRef; i=0; while((i=sql.find("%dL",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(dltime, s, true, false, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // - last to remote sync reference time i=0; while((i=sql.find("%tL",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(dltime, s, false, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // - last to remote sync reference date/timestamp i=0; while((i=sql.find("%L",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(dltime, s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,2,s); i+=s.size(); } // - last sync session start date i=0; while((i=sql.find("%dS",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousSyncTime, s, true, false, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // - last sync session start time i=0; while((i=sql.find("%tS",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousSyncTime, s, false, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // - last sync session start date/timestamp i=0; while((i=sql.find("%S",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousSyncTime, s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,2,s); i+=s.size(); } // - last sync with data to remote date i=0; while((i=sql.find("%dRL",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousToRemoteSyncCmpRef, s, true, false, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,4,s); i+=s.size(); } // - last sync with data to remote time i=0; while((i=sql.find("%tRL",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousToRemoteSyncCmpRef, s, false, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,4,s); i+=s.size(); } // - last sync with data to remote date/timestamp i=0; while((i=sql.find("%RL",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousToRemoteSyncCmpRef, s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // - last sync with data to remote identifier (for derived datastores that might need another token than time) StringSubst(sql,"%iRL",fPreviousToRemoteSyncIdentifier,4,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // - last anchor for sync with data to remote date // Note: this is only needed if we DON'T HAVE fSyncTimeStampAtEnd, but HAVE fOneWayFromRemoteSupported, // because then the %L cannot be used as reference time (it must save session time) i=0; while((i=sql.find("%dRS",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousToRemoteSyncCmpRef, s, true, false, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,4,s); i+=s.size(); } // - last server anchor with data to remote time i=0; while((i=sql.find("%tRS",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousToRemoteSyncCmpRef, s, false, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,4,s); i+=s.size(); } // - last server anchor with data to remote date/timestamp i=0; while((i=sql.find("%RS",i))!=string::npos) { s.erase(); fAgentP->lineartimeToLiteralAppend(fPreviousToRemoteSyncCmpRef, s, true, true, TCTX_UTC, fConfigP->fDataTimeZone); sql.replace(i,3,s); i+=s.size(); } // now substitute standard: %f=folderkey, %u=userkey, %d=devicekey, %t=targetkey // - Note: it is important that %t,%d is checked here, after %dL, %dS, %tL and %tS above!! DoSQLSubstitutions(sql); // - bind possible params bindSQLParameters(aStatement,false); // - issue execSQLStatement(aStatement,sql,false,"updating anchor/lastsync",false); return LOCERR_OK; } // TODBCApiDS::updateSyncTarget // update map changes from memory list into actual map table localstatus TODBCApiDS::updateODBCMap(SQLHSTMT aStatement, bool aSessionFinishedSuccessfully) { string sql,s; localstatus sta=LOCERR_OK; TMapContainer::iterator pos; // now save the entire list differentially pos=fMapTable.begin(); DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("updateODBCMap: internal map table has %ld entries (normal and others)",fMapTable.size())); while (pos!=fMapTable.end()) { DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "updateODBCMap: entryType=%s, localid='%s', remoteID='%s', mapflags=0x%lX, changed=%d, deleted=%d, added=%d, markforresume=%d, savedmark=%d", MapEntryTypeNames[(*pos).entrytype], (*pos).localid.c_str(), (*pos).remoteid.c_str(), (*pos).mapflags, (int)(*pos).changed, (int)(*pos).deleted, (int)(*pos).added, (int)(*pos).markforresume, (int)(*pos).savedmark )); try { // check if item has changed since map table was read, or if its markforresume has changed // or if this is a successful end of a session, when we can safely assume that any pending maps // are from adds to the client that have never reached the client (otherwise, we'd have got // a map for it, even if the add was in a previous session or session attempt) if ( (*pos).changed || (*pos).added || (*pos).deleted || // update of DB needed ((*pos).markforresume!=(*pos).savedmark) // mark for resume changed ) { // make sure it does not get written again if not really modified again (*pos).changed=false; // update new mapflags w/o changing mapflag_useforresume in the actual flags (as we still need it while session goes on) uInt32 newmapflags = (*pos).mapflags & ~mapflag_useforresume; if ((*pos).markforresume) newmapflags |= mapflag_useforresume; // remember last saved state (*pos).savedmark=(*pos).markforresume; // do something! if ((*pos).deleted) { if (!(*pos).added) { // delete this entry (only needed if it was not also added since last save - otherwise, map entry was never saved to the DB yet) IssueMapSQL(aStatement,fConfigP->fMapDeleteSQL,"deleting a map entry",(*pos).entrytype,(*pos).localid.c_str(),NULL,newmapflags); } // now remove it from the list, such that we don't try to delete it again TMapContainer::iterator delpos=pos++; // that's the next to have a look at fMapTable.erase(delpos); // remove it now continue; // pos is already updated } // deleted else if ((*pos).added) { // add a new entry IssueMapSQL(aStatement,fConfigP->fMapInsertSQL,"inserting a map entry",(*pos).entrytype,(*pos).localid.c_str(),(*pos).remoteid.c_str(),newmapflags); // is now added, don't add again later (*pos).added=false; } else { // explicitly changed or needs update because of resume mark or pendingmap flag // change existing entry IssueMapSQL(aStatement,fConfigP->fMapUpdateSQL,"changing a map entry",(*pos).entrytype,(*pos).localid.c_str(),(*pos).remoteid.c_str(),newmapflags); } } // if something changed // anyway - reset mark for resume, it must be reconstructed before next save (*pos).markforresume=false; // next pos++; } // catch exceptions, but nevertheless continue writing catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,("******** TODBCApiDS::updateODBCMap exception: %s",e.what())); sta=510; break; } catch (...) { DEBUGPRINTFX(DBG_ERROR,("******** TODBCApiDS::updateODBCMap unknown exception")); sta=510; break; } } // while return sta; } // TODBCApiDS::updateMap #endif // HAS_SQL_ADMIN // called when message processing void TODBCApiDS::dsEndOfMessage(void) { string msg,state; #ifdef ODBCAPI_SUPPORT SQLRETURN res; // commit data if not anyway committed at end of every item if ( fODBCConnectionHandle!=SQL_NULL_HANDLE && !fConfigP->fCommitItems ) { DEBUGPRINTFX(DBG_DATA+DBG_DBAPI,("dsEndOfMessage - committing transactions at end of message")); res=SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); if (fAgentP->getODBCError(res,msg,state,SQL_HANDLE_DBC,getODBCConnectionHandle())) { DEBUGPRINTFX(DBG_ERROR,("dsEndOfMessage: SQLEndTran failed: %s",msg.c_str())); } } #endif // ODBCAPI_SUPPORT // let ancestor do things inherited::dsEndOfMessage(); } // TODBCApiDS::dsEndOfMessage // Simple DB API access interface methods // Zap all data in syncset (note that everything outside the sync set will remain intact) localstatus TODBCApiDS::apiZapSyncSet(void) { localstatus sta = LOCERR_OK; try { string sql=fConfigP->fDataZapSQL; if (sql.empty()) { // we have no statement that can zap everything at once, so we'll have to do // use generic one by one syncset deletion sta = zapSyncSetOneByOne(); } else { // we have SQL statement(s) for zapping, use it sInt16 i=0; uInt16 setno; while (getNextSQLStatement(fConfigP->fDataZapSQL,i,sql,setno)) { DoDataSubstitutions(sql,fConfigP->fFieldMappings.fFieldMapList,0,false,false); // - issue prepareSQLStatement(fODBCWriteStatement, sql.c_str(), true, "slow-refresh from remote: deleting all records in sync set first"); execSQLStatement(fODBCWriteStatement, sql, true, NULL, true); finalizeSQLStatement(fODBCWriteStatement, true); } // while more statements } } catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,("apiZapSyncSet exception: %s",e.what())); return 510; } // done return sta; } // TODBCApiDS::apiZapSyncSet // read sync set IDs and mod dates. // - If aNeedAll is set, all data fields are needed, so apiReadSyncSet MAY // read items here already. Note that apiReadSyncSet MAY read items here // even if aNeedAll is not set (if it is more efficient than reading // them separately afterwards). localstatus TODBCApiDS::apiReadSyncSet(bool aNeedAll) { string sql; localstatus sta = LOCERR_OK; // get field map list TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; #ifdef SQLITE_SUPPORT // start reading if (fUseSQLite) { // open the SQLite file PDEBUGPRINTFX(DBG_DBAPI,("Opening SQLite3 file '%s'",fConfigP->fSQLiteFileName.c_str())); int rc = sqlite3_open(fConfigP->fSQLiteFileName.c_str(), &fSQLiteP); fAgentP->checkSQLiteError(rc,fSQLiteP); // set the database (lock) timeout rc = sqlite3_busy_timeout(fSQLiteP, fConfigP->fSQLiteBusyTimeout*1000); fAgentP->checkSQLiteError(rc,fSQLiteP); } else #endif #ifdef ODBCAPI_SUPPORT { fODBCReadStatement = fAgentP->newStatementHandle(getODBCConnectionHandle()); } #else return 510; // no API -> DB error #endif // ODBCAPI_SUPPORT #ifdef SCRIPT_SUPPORT // process mappings init script fWriting=false; fInserting=false; fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::executeTest(true,fScriptContextP,fConfigP->fFieldMappings.fInitScript,fConfigP->getDSFuncTableP(),fAgentP)) throw TSyncException(" failed"); #endif // read list of all local IDs that are in the current sync set DeleteSyncSet(); #ifdef SYDEBUG string ts; StringObjTimestamp(ts,getPreviousToRemoteSyncCmpRef()); PDEBUGPRINTFX(DBG_DATA,( "Now reading local sync set: last sync to remote was at %s", ts.c_str() )); #endif // we don't need to load the syncset if we are only refreshing from remote // but we also must load it if we can't zap without it on slow refresh // or if the syncset is needed to retrieve items if (!fRefreshOnly || (fSlowSync && apiNeedSyncSetToZap()) || implNeedSyncSetToRetrieve()) { // %%% add checking for aNeedAll and decide to use another (tbd) SQL to get all // records with all fields with this single query // - SELECT localid,modifieddate(,modifiedtime) FROM data WHERE // NOTE: this must always be a SINGLE statement (no %GO() are allowed) ! // Expects 2 or 3 (when date&time are separate) columns: localid,modifieddate(,modifiedtime) sql=fConfigP->fLocalIDAndTimestampFetchSQL; DoDataSubstitutions(sql,fml,0,false); // - prepare prepareSQLStatement(fODBCReadStatement, sql.c_str(), true, "reading of all localIDs/moddates in sync set"); // - issue execSQLStatement(fODBCReadStatement, sql, true, NULL, true); // - fetch data while (fetchNextRow(fODBCReadStatement, true)) { // get local ID and mod date TSyncSetItem *syncsetitemP = new TSyncSetItem; if (!syncsetitemP) throw TSyncException(DEBUGTEXT("cannot allocate new syncsetitem","odds12")); syncsetitemP->isModified=false; syncsetitemP->isModifiedAfterSuspend=false; lineartime_t lastmodified = 0; #ifdef SQLITE_SUPPORT if (fUseSQLite) { // SQLite sInt16 col=0; // SQLite has 0 based column index // - localid syncsetitemP->localid = (const char *)sqlite3_column_text(fSQLiteStmtP,col++); // - modified timestamp lastmodified = dbIntToLineartimeAs(sqlite3_column_int64(fSQLiteStmtP,col++), fConfigP->fLastModDBFieldType, TCTX_UTC); } else #endif { #ifdef ODBCAPI_SUPPORT // ODBC sInt16 col=1; // ODBC has 1 based column index fAgentP->getColumnValueAsString(fODBCReadStatement, col++, syncsetitemP->localid, chs_ascii); // get modified timestamp if (fConfigP->fLastModDBFieldType==dbft_timestamp) getColumnsAsTimestamp(fODBCReadStatement, col, fConfigP->fModifiedTimestamp, lastmodified, TCTX_UTC); else { uInt32 u; fAgentP->getColumnValueAsULong(fODBCReadStatement, col, u); lastmodified = dbIntToLineartimeAs(u, fConfigP->fLastModDBFieldType, TCTX_UTC); } #endif // ODBCAPI_SUPPORT } // compare now syncsetitemP->isModified = lastmodified > getPreviousToRemoteSyncCmpRef(); syncsetitemP->isModifiedAfterSuspend = lastmodified > getPreviousSuspendCmpRef(); #ifdef SYDEBUG StringObjTimestamp(ts,lastmodified); PDEBUGPRINTFX(DBG_DATA+DBG_EXOTIC,( "read local item info in sync set: localid='%s', last modified %s%s%s", syncsetitemP->localid.c_str(), ts.c_str(), syncsetitemP->isModified ? " -> MODIFIED since last sync" : "", syncsetitemP->isModifiedAfterSuspend ? " AND since last suspend" : "" )); #endif // %%% for now, we do not read item contents yet syncsetitemP->itemP=NULL; // no item data // save ID in list fSyncSetList.push_back(syncsetitemP); } // - no more records finalizeSQLStatement(fODBCReadStatement, true); } // not refreshing PDEBUGPRINTFX(DBG_DATA,( "Fetched %ld items from database (not necessarily all visible in SyncSet!)", (long)fSyncSetList.size() )); return sta; } // TODBCApiDS::apiReadSyncSet // fetch actual record from DB by localID localstatus TODBCApiDS::apiFetchItem(TMultiFieldItem &aItem, bool aReadPhase, TSyncSetItem *aSyncSetItemP) { // decide what statement to use SQLHSTMT statement = SQL_NULL_HANDLE; #ifdef SQLITE_SUPPORT if (!fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT if (aReadPhase) statement = fODBCReadStatement; // we can reuse the statement that is already here else statement = fAgentP->newStatementHandle(getODBCConnectionHandle()); #endif // ODBCAPI_SUPPORT } // get field map list TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; // assume ok localstatus sta=LOCERR_OK; // now fetch try { string sql; TMultiFieldItem *myitemP = (TMultiFieldItem *)&aItem; // execute statements needed to fetch record data sInt16 i=0; uInt16 setno; while (getNextSQLStatement(fConfigP->fDataFetchSQL,i,sql,setno)) { // - something like: SELECT %N FROM datatable WHERE localid=%k AND folderkey=%f resetSQLParameterMaps(); DoDataSubstitutions(sql,fml,setno,false,false,myitemP); // item needed for %k // - prepare parameters prepareSQLStatement(statement, sql.c_str(), true, "getting item data"); bindSQLParameters(statement,true); // - issue execSQLStatement(statement,sql,true,NULL,true); // fetch if (!fetchNextRow(statement,true)) { // - close cursor anyway finalizeSQLStatement(statement,true); // No data for select statement // This is ignored for all setno except setno=0 if (setno==0) { // this record cannot be found sta=404; // not found break; // no need to execute further statements } // setno==0, that is, non-optional data // if optional data is not present, just NOP } // has no data else { // - fill item with fields from SQL query sInt16 col=1; fillFieldsFromSQLResult(statement,col,*myitemP,fml,setno,0); // close cursor of main fetch finalizeSQLStatement(statement,true); // get out params saveAndCleanupSQLParameters(statement,true); } } // while more statements // Finish reading record (if one fetched at all, and not converted to delete etc.) if (sta==LOCERR_OK) { #ifdef ARRAYDBTABLES_SUPPORT // - also read array fields from auxiliary tables, if any if (fHasArrayFields) { // get data from linked array tables as well readArrayFields( statement, *myitemP, fml ); } #endif #ifdef SCRIPT_SUPPORT // - finally process afterread script of entire record fArrIdx=0; // base item fParentKey=myitemP->getLocalID(); fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fAfterReadScript,fConfigP->getDSFuncTableP(),fAgentP,myitemP,true)) throw TSyncException(" failed"); #endif } #ifdef SQLITE_SUPPORT if (!fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT // dispose statement handle if we have allocated it if (!aReadPhase) SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); #endif } } catch (...) { #ifdef SQLITE_SUPPORT if (!fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT // dispose statement handle if we have allocated it if (!aReadPhase) SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); #endif } // re-throw throw; } // return status return sta; } // TODBCApiDS::apiFetchItem /// end of syncset reading phase localstatus TODBCApiDS::apiEndDataRead(void) { #ifdef ODBCAPI_SUPPORT SQLRETURN res=SQL_SUCCESS; #endif localstatus sta = LOCERR_OK; #ifdef ODBCAPI_SUPPORT // release the statement handle (if any) try { DEBUGPRINTFX(DBG_DATA+DBG_DBAPI,("EndDataRead: committing read phase")); if (fODBCReadStatement!=SQL_NULL_HANDLE) { res=SafeSQLFreeHandle(SQL_HANDLE_STMT,fODBCReadStatement); fODBCReadStatement=SQL_NULL_HANDLE; checkConnectionError(res); // Commit the transaction (to make sure a new one begins when starting to write) SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); checkConnectionError(res); } } catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,("******** EndDataRead exception: %s",e.what())); sta=510; } #endif // ODBCAPI_SUPPORT return sta; } // TODBCApiDS::apiEndDataRead // start of data write localstatus TODBCApiDS::apiStartDataWrite(void) { // create statement handle for writing if we don't have one already #ifdef SQLITE_SUPPORT if (!fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT // for ODBC only if (fODBCWriteStatement==SQL_NULL_HANDLE) fODBCWriteStatement = fAgentP->newStatementHandle(getODBCConnectionHandle()); #endif } return LOCERR_OK; } // TODBCApiDS::apiStartDataWrite // generate new LocalID into fLastGeneratedLocalID. // - can be used with %X,%x escape in SQL statements. void TODBCApiDS::nextLocalID(TSpecialIDMode aMode,SQLHSTMT aStatement) { if (aMode!=sidm_none) { createLocalID(fLastGeneratedLocalID,aMode); } else { if (fConfigP->fDetermineNewIDOnce) { // we use incremented starting value StringObjPrintf(fLastGeneratedLocalID,"%ld",(long)fNextLocalID++); } else { #ifdef SCRIPT_SUPPORT // first check for script if (!fConfigP->fLocalIDScript.empty()) { // call script tro obtain new localID TItemField *resP=NULL; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::executeWithResult( resP, // can be default result or NULL, will contain result or NULL if no result fScriptContextP, fConfigP->fLocalIDScript, fConfigP->getDSFuncTableP(), // context function table fAgentP, // context data (myself) NULL, false, NULL, false )) throw TSyncException(" failed"); if (resP) { // get ID resP->getAsString(fLastGeneratedLocalID); delete resP; } } #endif // get new statement if none was passed string sql=fConfigP->fObtainNewLocalIDSql; // obtainNewLocalIDSql can be empty, for example if ID is returned in an // out param from the inserting statement(s) or generated by fLocalIDScript if (!sql.empty()) { #ifdef SQLITE_SUPPORT if (fUseSQLite) { throw TSyncException("SQLite does not support "); } else #endif { #ifdef ODBCAPI_SUPPORT // there is a statement to execute SQLHSTMT statement=aStatement; if (!statement) statement=fAgentP->newStatementHandle(getODBCConnectionHandle()); // issue the SQL try { // execute query BEFORE insert to get unique ID value for new record DoSQLSubstitutions(sql); execSQLStatement(statement,sql,true,"getting local ID for new record",true); // - fetch result row SQLRETURN res=SafeSQLFetch(statement); fAgentP->checkStatementError(res,statement); // - get value of first field as string if (!fAgentP->getColumnValueAsString(statement,1,fLastGeneratedLocalID,chs_ascii)) { throw TSyncException("Failed getting new localID"); } // close cursor (for re-using statement handle, this is needed) SafeSQLCloseCursor(statement); } catch (...) { if (!aStatement) SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); throw; } // get rid of local statement if (!aStatement) SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); #endif } } } } PDEBUGPRINTFX(DBG_DATA,("Generated new localID: %s",fLastGeneratedLocalID.c_str())); } // TODBCApiDS::nextLocalID // private helper: start writing item void TODBCApiDS::startWriteItem(void) { // make sure transaction is complete if we are in item commit mode #ifdef ODBCAPI_SUPPORT SQLRETURN res; if (fConfigP->fCommitItems) { PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI,("startWriteItem: commititems=true, item processing starts with new transaction")); res=SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); checkConnectionError(res); } #endif } // TODBCApiDS::startWriteItem // private helper: end writing item void TODBCApiDS::endWriteItem(void) { #ifdef ODBCAPI_SUPPORT SQLRETURN res; if (fConfigP->fCommitItems) { PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI,("endWriteItem: commititems=true, commit changes to DB")); res=SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); checkConnectionError(res); } #endif } // TODBCApiDS::endWriteItem // add new item to datastore, returns created localID localstatus TODBCApiDS::apiAddItem(TMultiFieldItem &aItem, string &aLocalID) { localstatus sta=LOCERR_OK; startWriteItem(); // get field map list TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; try { // determine ID aLocalID.erase(); // make sure we don't assign bogus ID (fObtainNewIDAfterInsert case) if (fConfigP->fSpecialIDMode==sidm_none && !fConfigP->fObtainNewIDAfterInsert) { // No repeatable ID creator, and not obtain-after-insert: do it once here // - create next local ID using standard method nextLocalID(sidm_none,fODBCWriteStatement); // - use it aLocalID=fLastGeneratedLocalID; } // if no special algorithm for IDs (such as system time/random based) // add new record sInt16 rep=0; do { try { // - make sure we have a new ID in case it is time based if (fConfigP->fSpecialIDMode!=sidm_none) { // - create next local ID using special method nextLocalID(fConfigP->fSpecialIDMode,fODBCWriteStatement); // - use it aLocalID=fLastGeneratedLocalID; } // - assign localID to be used (empty here if fObtainNewIDAfterInsert=true) aItem.setLocalID(aLocalID.c_str()); #ifdef SCRIPT_SUPPORT // - process beforewrite script fWriting=true; fInserting=true; // might be reset by ADDBYUPDATING() fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fBeforeWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); if (!fInserting) { // inserting was turned off by beforewritescript, in particular by ADDBYUPDATING() // -> perform an update using the localid set by ADDBYUPDATING() PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI,("Updating existing DB row '%s' instead of inserting (ADDBYUPDATING)",aItem.getLocalID())); // - return localID to caller (for caller, this looks like a regular add) aLocalID = aItem.getLocalID(); // - perform update instead of insert if (!IssueDataWriteSQL( fODBCWriteStatement, fConfigP->fDataUpdateSQL, "updating instead of inserting", true, // for update fml, // field map &aItem // item to read values and localid from )) { // not found in data table - do a normal add (even if ADDBYUPDATING() wanted an update) fInserting = true; // revert back to inserting PDEBUGPRINTFX(DBG_ERROR,("Updating existing not possible -> reverting to insert")); } } // check if we still need to insert if (fInserting) #endif { // Normal insert // - issue statement(s) #ifdef ODBCAPI_SUPPORT bool hasdata= #endif IssueDataWriteSQL( fODBCWriteStatement, fConfigP->fDataInsertSQL, "adding record", false, // not for update fml, // field map &aItem // item to read values and localid from ); // copy ID in case we've got it via an output param aLocalID=aItem.getLocalID(); #ifdef SQLITE_SUPPORT if (!fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT if (fConfigP->fInsertReturnsID) { // insert statement should return ID of record inserted if (hasdata) { SQLRETURN res=SafeSQLFetch(fODBCWriteStatement); if (fAgentP->checkStatementHasData(res,fODBCWriteStatement)) { // get id (must be in first result column of first and only result row) if (!fAgentP->getColumnValueAsString(fODBCWriteStatement,1,fLastGeneratedLocalID,chs_ascii)) { throw TSyncException("Failed getting localID from result set"); } // - use it aLocalID=fLastGeneratedLocalID; } else hasdata=false; // - close cursor anyway SafeSQLCloseCursor(fODBCWriteStatement); } if (!hasdata) throw TSyncException(" statement did not return insert ID"); } #endif // ODBCAPI_SUPPORT } } // normal insert // done ok break; } catch (TSyncException &e) { // error while issuing write if (++rep>fConfigP->fInsertRetries) throw; // error, let it show PDEBUGPRINTFX(DBG_DATA+DBG_DBAPI,( "Insert failed with localid='%s': %s --> retrying", aLocalID.c_str(), e.what() )); // repeat once more continue; } } while(true); // check if we want to use local ID created implicitly by inserting row #ifdef SCRIPT_SUPPORT if (fInserting) // only if really inserting (but not in ADDBYUPDATING() case) #endif { if (!fConfigP->fInsertReturnsID && fConfigP->fSpecialIDMode==sidm_none && fConfigP->fObtainNewIDAfterInsert) { // determine new ID AFTER insert #ifdef SQLITE_SUPPORT if (fUseSQLite) { // For SQLite, localID is always autocreated ROWID, get it now StringObjPrintf(aLocalID,"%lld",sqlite3_last_insert_rowid(fSQLiteP)); PDEBUGPRINTFX(DBG_DBAPI,("sqlite3_last_insert_rowid() returned %s",aLocalID.c_str())); } else #endif // SQLITE_SUPPORT { #ifdef ODBCAPI_SUPPORT // get local ID using standard method (SQL statement to get ID) nextLocalID(sidm_none,fODBCWriteStatement); // - use it aLocalID=fLastGeneratedLocalID; #endif // ODBCAPI_SUPPORT } } // make sure localID is known now aItem.setLocalID(aLocalID.c_str()); } // determine ID of inserted record // also write array fields, if any #ifdef ARRAYDBTABLES_SUPPORT if (fHasArrayFields) { // write data to linked array tables as well // - now write writeArrayFields( fODBCWriteStatement, aItem, fml, #ifdef SCRIPT_SUPPORT fInserting // if really performed insert (i.e. not ADDBYUPDATING()), child record cleaning is not necessary (but can be forced by fAlwaysCleanArray) #else true // is an insert, so child record cleaning not necessary (but can be forced by fAlwaysCleanArray) #endif ); } #endif #ifdef SCRIPT_SUPPORT // process oevrall afterwrite script // Note: fInserting is still valid from above (and can be false in ADDBYUPDATING() case) fWriting=true; fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fAfterWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif } catch (...) { endWriteItem(); throw; } // end writing endWriteItem(); return sta; } // TODBCApiDS::apiAddItem // update existing item in datastore, returns 404 if item not found localstatus TODBCApiDS::apiUpdateItem(TMultiFieldItem &aItem) { localstatus sta=LOCERR_OK; startWriteItem(); // get field map list TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; try { // update record with this localID #ifdef SCRIPT_SUPPORT // - process beforewrite script fWriting=true; fInserting=false; fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fBeforeWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif // - issue if (!IssueDataWriteSQL( fODBCWriteStatement, fConfigP->fDataUpdateSQL, "replacing record", true, // for update fml, // field map &aItem // item to read values and localid from )) { // not found in data table sta=404; } else { // also write array fields, if any #ifdef ARRAYDBTABLES_SUPPORT if (fHasArrayFields) { // write data to linked array tables as well writeArrayFields( fODBCWriteStatement, aItem, // item to read values from fml, false // is not an insert, update needs erasing first in all cases! ); } #endif #ifdef SCRIPT_SUPPORT // process oevrall afterwrite script fWriting=true; fInserting=false; fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fAfterWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif } } catch (...) { endWriteItem(); throw; } // end writing endWriteItem(); return sta; } // TODBCApiDS::apiUpdateItem // delete existing item in datastore, returns 211 if not existing any more localstatus TODBCApiDS::apiDeleteItem(TMultiFieldItem &aItem) { localstatus sta=LOCERR_OK; startWriteItem(); // get field map list TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; try { // - issue statements for delete (could be UPDATE or DELETE) if (!IssueDataWriteSQL( fODBCWriteStatement, fConfigP->fDataDeleteSQL, "deleting record", false, // not for update fml, // field map &aItem // item to read values and localid from )) { sta=211; // item not deleted, was not there any more } else { // also delete array fields, if any #ifdef ARRAYDBTABLES_SUPPORT // get data from linked array tables as well deleteArrayFields( fODBCWriteStatement, aItem, fConfigP->fFieldMappings.fFieldMapList ); #endif #ifdef SCRIPT_SUPPORT // process overall afterwrite script fWriting=true; fInserting=false; fDeleting=true; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fAfterWriteScript,fConfigP->getDSFuncTableP(),fAgentP,&aItem,true)) throw TSyncException(" failed"); #endif } } catch (...) { endWriteItem(); throw; } // end writing endWriteItem(); return sta; } // TODBCApiDS::apiDeleteItem /// @brief Load admin data from ODBC database /// Must search for existing target record matching the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// - if there is a matching record: load it /// - if there is no matching record, set fFirstTimeSync=true. The implementation may already create a /// new record with the key (aDeviceID,aDatabaseID,aRemoteDBID) and initialize it with the data from /// the items as shown below. At least, fTargetKey must be set to a value that will allow apiSaveAdminData to /// update the record. In case implementation chooses not create the record only in apiSaveAdminData, it must /// buffer the triple (aDeviceID,aDatabaseID,aRemoteDBID) such that it is available at apiSaveAdminData. /// If a record exists implementation must load the following items: /// - fTargetKey = some key value that can be used to re-identify the target record later at SaveAdminData. /// If the database implementation has other means to re-identify the target, this can be /// left unassigned. /// - fLastRemoteAnchor = anchor string used by remote party for last session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of last session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote (needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier). /// - fMapTable = list containing map entries. The implementation must load all map entries /// related to the current sync target identified by the triple of (aDeviceID,aDatabaseID,aRemoteDBID) /// or by fTargetKey. The entries added to fMapTable must have "changed", "added" and "deleted" flags /// set to false. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps = map. The implementation must load all all pending maps (client only) into /// fPendingAddMaps (and fUnconfirmedMaps must be left empty). /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) localstatus TODBCApiDS::apiLoadAdminData( const char *aDeviceID, // remote device URI (device ID) const char *aDatabaseID, // database ID const char *aRemoteDBID // database ID of remote device ) { #ifndef HAS_SQL_ADMIN return 510; // must use plugin, no ODBC #else // HAS_SQL_ADMIN localstatus sta=0; // assume ok string sql; // ODBC based target/map fODBCAdminData=true; // determine Folder key, if any sta=LOCERR_OK; // - determine folder name, if any string bname,foldername; analyzeName(aDatabaseID,&bname,&foldername); // - search on foldername SQLRETURN res; SQLHSTMT statement=fAgentP->newStatementHandle(getODBCConnectionHandle()); try { // get SQL sql = fConfigP->fFolderKeySQL; if (!sql.empty()) { // substitute: %F = foldername StringSubst(sql,"%F",foldername,2,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); DoSQLSubstitutions(sql); // for %u = userkey, %d=devicekey // issue execSQLStatement(statement,sql,true,"getting folder key",false); // - fetch result row res=SafeSQLFetch(statement); if (!fAgentP->checkStatementHasData(res,statement)) { // No data: user does not have permission for this folder PDEBUGPRINTFX(DBG_ERROR,("apiLoadAdminData: User has no permission for acessing folder '%s'",foldername.c_str())); sta=403; } else { // get folder key fAgentP->getColumnValueAsString(statement,1,fFolderKey,chs_ascii); PDEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: Folder key is '%s'",fFolderKey.c_str())); } SafeSQLCloseCursor(statement); } // if folderkeySQL else { // no folderkey, just copy user key fFolderKey=fAgentP->getUserKey(); } if (sta==LOCERR_OK) { // now determine sync target key bool madenew=false; do { // get SQL sql=fConfigP->fGetSyncTargetSQL; // substitute standard: %f=folderkey, %u=userkey, %d=devicekey, %t=targetkey DoSQLSubstitutions(sql); // substitute specific: %D=deviceid, %P=devicedbpath StringSubst(sql,"%D",aDeviceID,2,-1,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); StringSubst(sql,"%P",aRemoteDBID,2,-1,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // issue execSQLStatement(statement,sql,true,"getting target info",false); // - fetch result row res=SafeSQLFetch(statement); if (!fAgentP->checkStatementHasData(res,statement)) { if (madenew) throw TSyncException("apiLoadAdminData: new created SyncTarget is not accessible"); // target does not yet exist, create new DEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: Target does not yet exist, create new")); SafeSQLCloseCursor(statement); // create new sync target entry sql=fConfigP->fNewSyncTargetSQL; // substitute standard: %f=folderkey, %u=userkey, %d=devicekey, %t=targetkey DoSQLSubstitutions(sql); // substitute specific: %D=deviceid, %P=devicedbpath StringSubst(sql,"%D",aDeviceID,2,-1,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); StringSubst(sql,"%P",aRemoteDBID,2,-1,fConfigP->sqlPrepCharSet(),fConfigP->fDataLineEndMode,fConfigP->fQuotingMode); // now issue execSQLStatement(statement,sql,false,"creating new target info",false); // try to read again madenew=true; continue; } else { // get data: IN ASCENDING COL ORDER!!! sInt16 col=1; fAgentP->getColumnValueAsString(statement,col++,fTargetKey,chs_ascii); fAgentP->getColumnValueAsString(statement,col++,fLastRemoteAnchor,chs_ascii); PDEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: Target key is '%s'",fTargetKey.c_str())); PDEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: Saved Remote Sync Anchor is '%s'",fLastRemoteAnchor.c_str())); // first sync if target record is new or if remote anchor is (still) empty // NOTE: this is because only a successful sync makes next attempt non-firsttime! fFirstTimeSync=madenew || fLastRemoteAnchor.empty(); // last to remote sync reference date/time OR start of last session date/time // Note: If we DON'T HAVE fSyncTimeStampAtEnd, but HAVE fOneWayFromRemoteSupported, // this is NOT the reference time here, but the session start time; // the reference time is saved separately (see below) lineartime_t dltime; getColumnsAsTimestamp(statement,col,fConfigP->fSyncTimestamp,dltime, TCTX_UTC); if (!fConfigP->fSyncTimeStampAtEnd && fConfigP->fOneWayFromRemoteSupported) fPreviousSyncTime = dltime; else { fPreviousToRemoteSyncCmpRef = dltime; } // In case we DON'T HAVE fSyncTimeStampAtEnd, and DON'T HAVE fOneWayFromRemoteSupported, // the above loaded fPreviousToRemoteSyncCmpRef is the ONLY time we get, so for this // case we won't get separate session start time below, so initialize it here. fPreviousSyncTime = dltime; // check for separate start-of-session time if (fConfigP->fSyncTimeStampAtEnd) { // @note For new V3.0 architecture, this is now a bit the wrong way around, as // we only need the anchor (fPreviousSyncTime) and a reference for the // last-to-remote sync (fPreviousToRemoteSyncCmpRef). However, to remain compatible with // existing DB schemas we need to swap values a bit. // In case database cannot explicitly set modification timestamps, we need the start-of-session // (which is used for creation of anchor for remote) and we need a comparison reference. // - override anchor time with separately stored value getColumnsAsTimestamp(statement,col,fConfigP->fSyncTimestamp,fPreviousSyncTime, TCTX_UTC); } // get date and time of last two-way-sync if database has it stored separately // Note: when we have fSyncTimeStampAtEnd, fPreviousToRemoteSyncCmpRef is already set here, // but we'll get it again (it is redundantly stored if we have both fSyncTimeStampAtEnd and fPreviousToRemoteSyncCmpRef) // - get from DB if available if (fConfigP->fOneWayFromRemoteSupported) { // one-way from remote is supported: we have a separate date for last sync that sent changes to remote // - override fPreviousToRemoteSyncCmpRef (when one-way-from-remote is supported, this is not // necessarily same as start of last session (fPreviousSyncTime) any more) getColumnsAsTimestamp(statement,col,fConfigP->fSyncTimestamp,fPreviousToRemoteSyncCmpRef, TCTX_UTC); if (fConfigP->fSyncTimeStampAtEnd) { // Note: for V3.0, this may be redundant and already loaded in case we also have fSyncTimeStampAtEnd getColumnsAsTimestamp(statement,col,fConfigP->fSyncTimestamp,fPreviousToRemoteSyncCmpRef, TCTX_UTC); } } // get opaque reference identifier from DB, if it stores them // (otherwise, implMakeAdminReady will create ISO timestamp strings as standard identifiers) if (fConfigP->fStoreSyncIdentifiers) { // we have stored the identifier (and do now know its meaning, it's just a string that // the DB implementation needs to sort out changed items in the datastore fAgentP->getColumnValueAsString(statement,col++,fPreviousToRemoteSyncIdentifier,chs_ascii); } // Summarize #ifdef SYDEBUG string ts; StringObjTimestamp(ts,fPreviousSyncTime); DEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: start time of last sync is: %s",ts.c_str())); StringObjTimestamp(ts,fPreviousToRemoteSyncCmpRef); DEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: compare reference time of last-to-remote-sync is: %s",ts.c_str())); DEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: stored reference identifier of last-to-remote-sync is: '%s'",fPreviousToRemoteSyncIdentifier.c_str())); #endif // Resume support if there if (fConfigP->fResumeSupport) { // next column is alert code for resuming uInt32 templong; fAgentP->getColumnValueAsULong(statement,col++,templong); fResumeAlertCode=templong; PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("apiLoadAdminData: fResumeAlertCode is %hd",fResumeAlertCode)); // next column(s) is/are last suspend date/time getColumnsAsTimestamp(statement,col,fConfigP->fSyncTimestamp,fPreviousSuspendCmpRef, TCTX_UTC); #ifdef SYDEBUG StringObjTimestamp(ts,fPreviousSuspendCmpRef); PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("apiLoadAdminData: compare reference time of last suspend is %s",ts.c_str())); #endif // Get last suspend identifier from DB if (fConfigP->fStoreSyncIdentifiers) { // next line is opaque string idenifier of last sync with transfer to remote fAgentP->getColumnValueAsString(statement,col++,fPreviousSuspendIdentifier,chs_ascii); PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("apiLoadAdminData: stored reference identifier of last suspend is '%s'",fPreviousSuspendIdentifier.c_str())); } // get partial item suspend data, if any: // - Source,Target,LastStatus,PIState,Totalsize,Unconfirmedsize,StoredSize,BLOB if (fConfigP->fResumeItemSupport) { // - last item URIs fAgentP->getColumnValueAsString(statement,col++,fLastSourceURI,chs_ascii); fAgentP->getColumnValueAsString(statement,col++,fLastTargetURI,chs_ascii); // - last status fAgentP->getColumnValueAsULong(statement,col++,templong); fLastItemStatus=templong; // - partial item state fAgentP->getColumnValueAsULong(statement,col++,templong); fPartialItemState=(TPartialItemState)templong; // - sizes fAgentP->getColumnValueAsULong(statement,col++,fPITotalSize); fAgentP->getColumnValueAsULong(statement,col++,fPIUnconfirmedSize); fAgentP->getColumnValueAsULong(statement,col++,fPIStoredSize); // - the BLOB data itself string blob; fAgentP->getColumnValueAsString(statement,col++,blob,chs_ascii,true); // - move it into data if (fPIStoredDataP && fPIStoredDataAllocated) smlLibFree(fPIStoredDataP); fPIStoredDataAllocated=false; fPIStoredDataP=smlLibMalloc(blob.size()+1); // plus terminator for string interpretation if (fPIStoredDataP) { fPIStoredDataAllocated=true; smlLibMemcpy(fPIStoredDataP,blob.c_str(),blob.size()); if (fPIStoredSize>blob.size()) fPIStoredSize=blob.size(); // security *((uInt8 *)fPIStoredDataP+fPIStoredSize)=0; // string terminator } PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "apiLoadAdminData: partial item resume info: src='%s', targ='%s', lastStatus=%hd, state=%hd, totalSz=%ld, unconfSz=%ld, storedSz=%ld", fLastSourceURI.c_str(), fLastTargetURI.c_str(), fLastItemStatus, (TSyError)fPartialItemState, fPITotalSize, fPIUnconfirmedSize, fPIStoredSize )); } } SafeSQLCloseCursor(statement); // now read current map entries of target sql=fConfigP->fMapFetchAllSQL; DoSQLSubstitutions(sql); // only folderkey,targetkey,userkey is available // - issue execSQLStatement(statement,sql,true,"reading map into internal list",false); // - fetch results do { res=SafeSQLFetch(statement); // check for end if (!fAgentP->checkStatementHasData(res,statement)) break; // get map entry TMapEntry entry; fAgentP->getColumnValueAsString(statement,1,entry.localid,chs_ascii); fAgentP->getColumnValueAsString(statement,2,entry.remoteid,chs_ascii); if (fConfigP->fResumeSupport) { // we have a separate entry type uInt32 et; fAgentP->getColumnValueAsULong(statement,3,et); if (et>=numMapEntryTypes) entry.entrytype = mapentry_invalid; else entry.entrytype = (TMapEntryType)et; // and some map flags fAgentP->getColumnValueAsULong(statement,4,entry.mapflags); } else { entry.mapflags=0; // no flags stored entry.entrytype=mapentry_normal; // normal entry } PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "read map entry (type=%s): localid='%s', remoteid='%s', mapflags=0x%lX", MapEntryTypeNames[entry.entrytype], entry.localid.c_str(), entry.remoteid.c_str(), entry.mapflags )); // save entry in list entry.changed=false; // not yet changed entry.added=false; // already there // remember saved state of suspend mark entry.markforresume=false; // not yet marked for this session (mark of last session is in mapflag_useforresume!) entry.savedmark=entry.mapflags & mapflag_useforresume; // IMPORTANT: non-normal entries must be saved as deleted in the main map - they will be re-activated at the // next save if needed entry.deleted = entry.entrytype!=mapentry_normal; // only normal ones may be saved as existing in the main map // save to main map list anyway to allow differential SQL updates to map table (instead of writing everything all the time) fMapTable.push_back(entry); // now save special maps to extra lists according to type // Note: in the main map, these are marked deleted. Before the next saveAdminData, these will // be re-added (=re-activated) from the extra lists if they still exist. switch (entry.entrytype) { #ifdef SYSYNC_SERVER case mapentry_tempidmap: if (IS_SERVER) fTempGUIDMap[entry.remoteid]=entry.localid; // tempGUIDs are accessed by remoteID=tempID break; #endif #ifdef SYSYNC_CLIENT case mapentry_pendingmap: if (IS_CLIENT) fPendingAddMaps[entry.localid]=entry.remoteid; break; #endif } } while(true); // no more records SafeSQLCloseCursor(statement); // done break; } // target record found } while(true); } // if ok if (sta==LOCERR_OK) { // determine how to create new IDs for database fNextLocalID=-1; // no global ID, must be determined at actual insert // for some databases w/o usable ID variable (FMPro), starting point for ids // might be some "SELECT MAX()" query, which would be executed here if (fConfigP->fDetermineNewIDOnce) { uInt32 maxid; SQLRETURN res; sql=fConfigP->fObtainNewLocalIDSql.c_str(); DoSQLSubstitutions(sql); execSQLStatement(statement,sql,true,"Next-to-be-used localID (determined once in makeAdminReady)",false); // - fetch result row res=SafeSQLFetch(statement); fAgentP->checkStatementError(res,statement); // - get value of first field as long if (fAgentP->getColumnValueAsULong(statement,1,maxid)) { // next ID found if (maxidfMinNextID) maxid=fConfigP->fMinNextID; // don't use value smaller than defined minimum } else { // no max value found, start at MinNextID maxid=fConfigP->fMinNextID; } SafeSQLCloseCursor(statement); // now assign fNextLocalID=maxid; #ifdef SYDEBUG PDEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: next local ID is %ld",fNextLocalID)); #endif } } // if ok // release the statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); } catch (...) { // release the statement handle SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); throw; } PDEBUGPRINTFX(DBG_ADMIN,("apiLoadAdminData: Number of map entries read = %ld",fMapTable.size())); return sta; #endif // HAS_SQL_ADMIN } // TODBCApiDS::apiLoadAdminData /// @brief Save admin data to ODBC database /// @param[in] aSessionFinished if true, this is a end-of-session save (and not only a suspend save) /// Must save to the target record addressed at LoadAdminData() by the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// Implementation must save the following items: /// - fLastRemoteAnchor = anchor string used by remote party for this session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of this session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote (needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier). /// - fMapTable = list containing map entries. The implementation must save all map entries /// that have changed, are new or are deleted. See below for additional resume requirements. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps and fUnconfirmedMaps = map. The implementation must save all entries as /// pending maps (client only). Note that fPendingAddMaps might contain temporary localIDs, /// so call dsFinalizeLocalID() to ensure these are converted to final before saving. /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) localstatus TODBCApiDS::apiSaveAdminData(bool aSessionFinished, bool aSuccessful) { #ifndef HAS_SQL_ADMIN return 510; // must use plugin, no ODBC #else SQLRETURN res; localstatus sta=LOCERR_OK; try { // if data is not handled by ODBC, we might have no write statement here, so open one if (fODBCWriteStatement==SQL_NULL_HANDLE) fODBCWriteStatement = fAgentP->newStatementHandle(getODBCConnectionHandle()); // now save target head record admin data sta=updateSyncTarget(fODBCWriteStatement,aSessionFinished && aSuccessful); if (sta==LOCERR_OK) { // then apply Map modifications (target detail records) sta=updateODBCMap(fODBCWriteStatement,aSessionFinished && aSuccessful); } // dispose of Write statement handle if (fODBCWriteStatement!=SQL_NULL_HANDLE && aSessionFinished) { DEBUGPRINTFX(DBG_DBAPI,("SaveAdminData: End of session - Freeing Write statement handle...")); res=SafeSQLFreeHandle(SQL_HANDLE_STMT,fODBCWriteStatement); fODBCWriteStatement=SQL_NULL_HANDLE; checkConnectionError(res); } // commit transaction if (fODBCConnectionHandle!=SQL_NULL_HANDLE) { // commit DB transaction DEBUGPRINTFX(DBG_DBAPI,("SaveAdminData(commit): Committing DB transaction...")); res=SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); checkConnectionError(res); } } catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,("******** SaveAdminData exception: %s",e.what())); sta=510; // failed, DB error } // return status return sta; #endif // HAS_SQL_ADMIN } // TODBCApiDS::apiSaveAdminData // - end DB data write sequence (but not yet admin data) localstatus TODBCApiDS::apiEndDataWrite(string &aThisSyncIdentifier) { // we do not have a separate sync identifier aThisSyncIdentifier.erase(); // make sure we commit the transaction here in case admin data is not in ODBC #ifdef ODBCAPI_SUPPORT try { SQLRETURN res; if (fODBCWriteStatement!=SQL_NULL_HANDLE) { DEBUGPRINTFX(DBG_DBAPI,("EndDBDataWrite: we have no ODBC admin data, freeing Write statement handle now...")); res=SafeSQLFreeHandle(SQL_HANDLE_STMT,fODBCWriteStatement); fODBCWriteStatement=SQL_NULL_HANDLE; checkConnectionError(res); } // commit DB transaction if (fODBCConnectionHandle!=SQL_NULL_HANDLE) { DEBUGPRINTFX(DBG_DBAPI,("EndDBDataWrite: ...and commit DB transaction")); res=SafeSQLEndTran(SQL_HANDLE_DBC,getODBCConnectionHandle(),SQL_COMMIT); checkConnectionError(res); } } catch (exception &e) { PDEBUGPRINTFX(DBG_ERROR,("******** EndDBDataWrite exception: %s",e.what())); return 510; } #endif // ODBCAPI_SUPPORT return LOCERR_OK; } // TODBCApiDS::apiEndDataWrite /* end of TODBCApiDS implementation */ #ifdef STREAMFIELD_SUPPORT // TODBCFieldProxy // =============== TODBCFieldProxy::TODBCFieldProxy( TODBCApiDS *aODBCdsP, TODBCFieldMapItem *aFieldMapP, const char *aMasterKey, const char *aDetailKey ) { // save values fODBCdsP = aODBCdsP; fFieldMapP = aFieldMapP; fMasterKey = aMasterKey; fDetailKey = aDetailKey; fFetched = false; fValue.erase(); } // TODBCFieldProxy::TODBCFieldProxy TODBCFieldProxy::~TODBCFieldProxy() { // nop at this time } // TODBCFieldProxy::~TODBCFieldProxy // fetch BLOB from DPAPI void TODBCFieldProxy::fetchBlob(void) { if (!fFetched) { // if do not have anything yet and need something, read it now string sql = fFieldMapP->fReadBlobSQL; // the only possible substitutions are %k and %K StringSubst(sql,"%k",fMasterKey,2); // the localID of the entire record StringSubst(sql,"%K",fDetailKey,2); // the key of this specific array element // fetch now SQLHSTMT statement = 0; #ifdef SQLITE_SUPPORT if (!fODBCdsP->fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT statement=fODBCdsP->fAgentP->newStatementHandle(fODBCdsP->getODBCConnectionHandle()); #endif } try { fODBCdsP->prepareSQLStatement(statement, sql.c_str(), true, "Proxy Field Fetch"); fODBCdsP->execSQLStatement(statement, sql, true, NULL, true); if (!fODBCdsP->fetchNextRow(statement, true)) { // no data fValue.erase(); } else { // get data #ifdef SQLITE_SUPPORT if (fODBCdsP->fUseSQLite) { size_t siz = sqlite3_column_bytes(fODBCdsP->fSQLiteStmtP,0); if (siz>0) { if (fFieldMapP->dbfieldtype==dbft_blob) fValue.assign((cAppCharP)sqlite3_column_blob(fODBCdsP->fSQLiteStmtP,0),siz); else appendStringAsUTF8((const char *)sqlite3_column_text(fODBCdsP->fSQLiteStmtP,0), fValue, fODBCdsP->fConfigP->sqlPrepCharSet(), lem_cstr); // Convert to app-charset (UTF8) and C-type lineends } else { fValue.erase(); } } else #endif { #ifdef ODBCAPI_SUPPORT // pass in actual charset (including utf16 - getColumnValueAsString handles UTF16 case internally) fODBCdsP->fAgentP->getColumnValueAsString(statement,1,fValue,fODBCdsP->fConfigP->fDataCharSet,fFieldMapP->dbfieldtype==dbft_blob); #endif } } // fetched now fFetched=true; // done fODBCdsP->finalizeSQLStatement(statement,true); // release the statement handle #ifdef SQLITE_SUPPORT if (!fODBCdsP->fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); #endif } } catch (exception &e) { // release the statement handle #ifdef SQLITE_SUPPORT if (!fODBCdsP->fUseSQLite) #endif { #ifdef ODBCAPI_SUPPORT SafeSQLFreeHandle(SQL_HANDLE_STMT,statement); #endif } throw; } } } // TODBCFieldProxy::fetchBlob // returns size of entire blob size_t TODBCFieldProxy::getBlobSize(TStringField *aFieldP) { fetchBlob(); return fValue.size(); } // TODBCFieldProxy::getBlobSize // read from Blob from specified stream position and update stream pos size_t TODBCFieldProxy::readBlobStream(TStringField *aFieldP, size_t &aPos, void *aBuffer, size_t aMaxBytes) { if (!fFetched) { // we need to read the body fetchBlob(); } // now copy from our value if (aPos>fValue.size()) return 0; if (aPos+aMaxBytes>fValue.size()) aMaxBytes=fValue.size()-aPos; if (aMaxBytes==0) return 0; // copy data from ODBC answer buffer to caller's buffer memcpy(aBuffer,fValue.c_str()+aPos,aMaxBytes); aPos+= aMaxBytes; return aMaxBytes; // return number of bytes actually read } // TODBCFieldProxy::readBlobStream #endif // STREAMFIELD_SUPPORT } // namespace #endif // SQL_SUPPORT // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/odbcapids.h0000755000373300037200000007756412424517753027510 0ustar00nightlyallusers00000000000000/** * @File odbcapids.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TODBCApiDS * ODBC based datastore API implementation * @Note Currently also contains what will later become TCustomImplDS * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-16 : luz : created from odbcdbdatastore */ #include "prefix_file.h" #ifndef ODBCAPIDS_H #define ODBCAPIDS_H #ifdef SQL_SUPPORT // includes #include "odbcdb.h" #include "stdlogicds.h" #include "multifielditem.h" #include "odbcapiagent.h" using namespace sysync; namespace sysync { #ifdef SCRIPT_SUPPORT // publish as derivates might need it extern const TFuncTable ODBCDSFuncTable2; #endif // the datastore config // special ID generation modes typedef enum { sidm_none, // none sidm_unixmsrnd6 // UNIX milliseconds and 6-digit random } TSpecialIDMode; const sInt16 numSpecialIDModes = sidm_unixmsrnd6-sidm_none+1; // ODBC variant of field map class TODBCFieldMapItem : public TFieldMapItem { typedef TFieldMapItem inherited; public: TODBCFieldMapItem(const char *aElementName, TConfigElement *aParentElement); // - parser for extra attributes (for derived classes) virtual void checkAttrs(const char **aAttributes); #ifdef STREAMFIELD_SUPPORT // properties string fReadBlobSQL; // read field when needed trough field proxy string fKeyFieldName; // if set, this field name will be used in %N when reading the record rather than the actual data field -> to get record key for array elements for proxies #endif }; // TODBCFieldMapItem #ifdef ARRAYDBTABLES_SUPPORT // special field map item: Array map class TODBCFieldMapArrayItem : public TFieldMapArrayItem { typedef TFieldMapArrayItem inherited; public: TODBCFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement); virtual ~TODBCFieldMapArrayItem(); // SQL properties // %k = record key of associated main table record // %i = index of current element (0 based) // %N = field name list for INSERT and SELECT // %V = value list for INSERT // %d([opt]fieldname#arrayindex) // %dM,%tM,%M = modified date/time/timestamp // %f=folderkey, %u=userkey, %t=targetkey // %S = size of record (sum of all field literal sizes) // - SQL for selecting all elements of the array // NOTE: %N must be first in (and is probably entire) SELECT field list! string fSelectArraySQL; // - SQL for clearing the array, must clear all subrecords of the array string fDeleteArraySQL; bool fAlwaysCleanArray; // if set, fDeleteArraySQL will be executed even if master record is inserted new // - SQL to insert a new array element string fInsertElementSQL; // Methods virtual void clear(); protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); }; // TODBCFieldMapArrayItem #endif class TOdbcDSConfig: public TCustomDSConfig { typedef TCustomDSConfig inherited; public: TOdbcDSConfig(const char* aName, TConfigElement *aParentElement); virtual ~TOdbcDSConfig(); // properties // - set this if every item modification needs to be committed separately // (for DBs such as Achil where any insert will block the size accumulation // record). bool fCommitItems; // - define how many times an insert is retried in case of ODBC error, 0=no retry sInt16 fInsertRetries; // - define how many times an update is retried in case of ODBC error, 0=no retry sInt16 fUpdateRetries; #ifdef HAS_SQL_ADMIN // - statement to obtain folder key from Database, empty if none // replacements: %F=foldername, %u=userkey, %d=devicekey // Note: see fFolderKeyField and %f substitute to use folderkey for subselecting data string fFolderKeySQL; // - sqls for handling Sync Target Table // - replacements: %f=folderkey, %u=userkey, %D=deviceID, %P=deviceDBpath string fGetSyncTargetSQL; // must return SYNCTARGETKEY,ANCHOR,LASTSYNC string fNewSyncTargetSQL; // - additional replacements: %L=last sync timestamp, %dL=last sync date, %tL=last sync time string fUpdateSyncTargetSQL; string fDeleteSyncTargetSQL; // should also delete all associated map entries! bool fSyncTimestamp; // if set, target table SELECT expects single timestamp, date & time otherwise #ifdef OLD_1_0_5_CONFIG_COMPATIBLE // Map table access, old version // - layout of map table string fMapTableName; // name string fRemoteIDMapField; // remote ID string fLocalIDMapField; // local ID bool fStringLocalID; // if set, local ID is quoted as string literal in SQL string fTargetKeyMapField; // target key bool fStringTargetkey; // if set, target key is quoted as string literal in SQL // Data table access, old version // - name of table containing the data string fLocalTableName; /* never documented (only used in achil), so not supported any more // - additional constant insert values (appended to INSERT field/value lists, resp.) // %d([opt]fieldname#arrayindex) // %dM,%tM,%M = modified date/time/timestamp // %f=folderkey, %u=userkey, %t=targetkey // %S = size of record (sum of all field literal sizes) string fConstInsFields; string fConstInsValues; // - additional constant update terms (appended to UPDATE SET list) // %d([opt]fieldname#arrayindex) // %dM,%tM,%M = modified date/time/timestamp // %f=folderkey, %u=userkey, %t=targetkey // %S = size of record (sum of all field literal sizes) string fConstUpdates; */ // - name of folderkey subselection field in data table, empty if none string fFolderKeyField; bool fStringFolderkey; // if set, folder key is quoted as string literal in SQL // - name of field which contains Local ID (GUID) string fLocalIDField; // - modified date & time fields string fModifiedDateField; // this field is used as modified date or datetime string fModifiedTimeField; // if set, this field is used as modified time // - additional select clause (to be used for all selects BUT NOT INSERTS!) // NOTE: can contain %x-type substitutions (see DoSQLSubstitutions()) // Note: was never documented so will be phased out right now // string fGeneralSelectCondition; #endif // OLD_1_0_5_CONFIG_COMPATIBLE // Map table access, new version // Substitutions: // from agent's DoSQLSubstitutions: // %u = userkey // %d = devicekey // from datastore's DoSQLSubstitutions: // %f = folderkey // %t = targetkey // from DoMapSubstitutions: // %e = entry type // %k = data key (local ID) // %r = remote ID (always a string) // - SQL to fetch all map entries of a target: order= localid,remoteid string fMapFetchAllSQL; // - SQL to insert new map entry by localid string fMapInsertSQL; // - SQL to update existing map entry by localid string fMapUpdateSQL; // - SQL to delete a map entry by localid string fMapDeleteSQL; // Data table access, new version // Substitutions: // from agent's DoSQLSubstitutions: // %u = userkey // %d = devicekey // from datastore's DoSQLSubstitutions: // %f = folderkey // %t = targetkey // from DoDataSubstitutions: // %dM,%tM,%M = modified date,time,timestamp // %d([opts]fieldname#arrindex) = contents of field, opts l=lowercase, u=uppercase, a=ascii-only // %S = size of all string field literal sizes // %AF = filter conditions preceeded by AND (can be empty) // %WF = filter conditions preceeded by WHERE (can be empty) // %k = data key (local ID) // %N = data field name list // %aN = data field name list with all field, regardless of possible unassigned state of fields in update statements // %V = data field=value list // %aV = data field=value list with all field // %v = data value list // %aV = data value list with all field // for Array fields only: // %i = 0 based index of array elements #endif // HAS_SQL_ADMIN // - single(!) SQL statement to fetch local ID and timestamp from data table string fLocalIDAndTimestampFetchSQL; bool fModifiedTimestamp; // if set, above statement returns separate date and time // Note: the following data access SQL strings may consist of multiple SQL statements // separated by %GO or %GO(setno). Default setno=0 without preceeding %GO(setno) // - SQL statement(s) to fetch actual data fields from data table. SQL result must // contain mapped fields in the same order as they appear in // Note: Statement(s) executed with setno==0 returning no data are interpreted // as "record does not exist (any more)". Statements with setno!=0 returning // no data are just ignored (assuming optional data not present) string fDataFetchSQL; // - SQL statement(s) to insert new data in a record, including modification date string fDataInsertSQL; // - SQL statement(s) to update actual data in a record, including modification date string fDataUpdateSQL; // - SQL statement(s) to delete a record string fDataDeleteSQL; // - SQL statement(s) to zap entire sync set string fDataZapSQL; // Data table options // - try to translate filters to SQL if possible bool fFilterOnDBLevel; // - Literal string quoting mode TQuotingModes fQuotingMode; // Local ID generation // - if set, fObtainNextIDSql is executed only ONCE per write phase, and // IDs generated by incrementing the ID by 1 for every record added. // This is NOT MULTI-USER-SAFE, but can be useful for slow DBs like FMPro // Setting this excludes fObtainNextIDAfterInsert bool fDetermineNewIDOnce; // - if set, fObtainNewLocalIDSql is used AFTER inserting without a GUID // to obtain the GUID generated by the DB (such as MS-SQL autoincrement) bool fObtainNewIDAfterInsert; // - This SQL query is used to obtain the local ID // for adds. It is expected to return the ID in the first result column. // - if (fDetermineNextIDOnce), it is executed once at implimplSyncLogin, // further IDs are generated by incrementing it (for single-User DBs only!) // - if (fObtainNextIDAfterInsert), this is executed AFTER inserting // without a local ID specified in INSERT statement to determine DB-assigned ID string fObtainNewLocalIDSql; #ifdef SCRIPT_SUPPORT // - This script is called when a new localID must be generated (fObtainNextIDAfterInsert == false) // before adding a record. If it returns non-undefined, the return value is used as localID string fLocalIDScript; #endif // - if This specifies the minimum ID to be used if fObtainNextIDSql // returns something lower. This is also dangerous, but also needed // for FMPro to keep FMPro generated IDs far (much lower) from Sync // generated IDs sInt32 fMinNextID; // - specifies special ID calculation method TSpecialIDMode fSpecialIDMode; // - if set, the fDataInsertSQL statement is expected to return the new ID as // the first column of the result set (for example if insert is implemented // with a stored procedue) bool fInsertReturnsID; bool fInsertIDAsOutParam; // - if set, SQLRowCount result is ignored and write statements are always assumed to be successful // (unless they fail with an error, of course) bool fIgnoreAffectedCount; // - type of the last-modified date column TDBFieldType fLastModDBFieldType; // SQLite support #ifdef SQLITE_SUPPORT // - name of the SQLite file that contains the user data for this datastore string fSQLiteFileName; // - busy timeout, 0 = no wait uInt32 fSQLiteBusyTimeout; #endif // public methods // - return charset used to create SQL statments (will return UTF-8 when using UTF-16/UCS-2 // to allow SQL statement construction in 8-bit mode, and only converting before // actually calling ODBC TCharSets sqlPrepCharSet(void) { return fDataCharSet==chs_utf16 ? chs_utf8 : fDataCharSet; }; // - create appropriate datastore from config, calls addTypeSupport as well virtual TLocalEngineDS *newLocalDataStore(TSyncSession *aSessionP); #ifdef SCRIPT_SUPPORT // provided to allow derivates to add API specific script functions to scripts called from CustomImplDS virtual const TFuncTable *getDSFuncTableP(void) { return &ODBCDSFuncTable1; }; #endif // factory functions for field map items virtual TFieldMapItem *newFieldMapItem(const char *aElementName, TConfigElement *aParentElement) { return new TODBCFieldMapItem(aElementName,aParentElement); }; #ifdef ARRAYDBTABLES_SUPPORT virtual TFieldMapArrayItem *newFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement) { return new TODBCFieldMapArrayItem(aCustomDSConfigP,aParentElement); }; #endif protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void clear(); virtual void localResolve(bool aLastPass); #ifdef SCRIPT_SUPPORT virtual void apiResolveScripts(void); #endif }; // TOdbcDSConfig class TODBCApiDS: public TCustomImplDS { friend class TODBCDSfuncs; friend class TODBCCommonFuncs; friend class TODBCFieldProxy; typedef TCustomImplDS inherited; private: void InternalResetDataStore(void); // reset for re-use without re-creation public: TODBCApiDS( TOdbcDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual void announceAgentDestruction(void); virtual void dsResetDataStore(void) { InternalResetDataStore(); inherited::dsResetDataStore(); }; virtual ~TODBCApiDS(); /// @name apiXXXX methods defining the interface from TCustomImplDS to TXXXApi actual API implementations /// @{ // /// @brief Load admin data from ODBC database /// @param aDeviceID[in] remote device URI (device ID) /// @param aDatabaseID[in] local database ID /// @param aRemoteDBID[in] database ID of remote device /// Must search for existing target record matching the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// - if there is a matching record: load it /// - if there is no matching record, set fFirstTimeSync=true. The implementation may already create a /// new record with the key (aDeviceID,aDatabaseID,aRemoteDBID) and initialize it with the data from /// the items as shown below. At least, fTargetKey must be set to a value that will allow apiSaveAdminData to /// update the record. In case implementation chooses not create the record only in apiSaveAdminData, it must /// buffer the triple (aDeviceID,aDatabaseID,aRemoteDBID) such that it is available at apiSaveAdminData. /// If a record exists implementation must load the following items: /// - fTargetKey = some key value that can be used to re-identify the target record later at SaveAdminData. /// If the database implementation has other means to re-identify the target, this can be /// left unassigned. /// - fLastRemoteAnchor = anchor string used by remote party for last session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of last session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT). Needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must load all map entries /// related to the current sync target identified by the triple of (aDeviceID,aDatabaseID,aRemoteDBID) /// or by fTargetKey. The entries added to fMapTable must have "changed", "added" and "deleted" flags /// set to false. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps = map. The implementation must load all all pending maps (client only) into /// fPendingAddMaps (and fUnconfirmedMaps must be left empty). /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) virtual localstatus apiLoadAdminData( const char *aDeviceID, // remote device URI (device ID) const char *aDatabaseID, // database ID const char *aRemoteDBID // database ID of remote device ); /// @brief Save admin data to ODBC database /// @param[in] aSessionFinished if true, this is a end-of-session save (and not only a suspend save) - but not necessarily a successful one /// @param[in] aSuccessful if true, this is a successful end-of-session /// Must save to the target record addressed at LoadAdminData() by the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// Implementation must save the following items: /// - fLastRemoteAnchor = anchor string used by remote party for this session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of this session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT). Needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must save all map entries /// that have changed, are new or are deleted. See below for additional resume requirements. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps and fUnconfirmedMaps = map. The implementation must save all entries as /// pending maps (client only). Note that fPendingAddMaps might contain temporary localIDs, /// so call dsFinalizeLocalID() to ensure these are converted to final before saving. /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) virtual localstatus apiSaveAdminData(bool aSessionFinished, bool aSuccessful); /// read sync set IDs and mod dates. /// @param[in] if set, all data fields are needed, so ReadSyncSet MAY /// read items here already. Note that ReadSyncSet MAY read items here /// even if aNeedAll is not set (if it is more efficient than reading /// them separately afterwards). virtual localstatus apiReadSyncSet(bool aNeedAll); /// Zap all data in syncset (note that everything outside the sync set will remain intact) virtual localstatus apiZapSyncSet(void); virtual bool apiNeedSyncSetToZap(void) { return fConfigP->fDataZapSQL.empty(); }; // we need it if we don't have a zap SQL /// fetch record contents from DB by localID. virtual localstatus apiFetchItem(TMultiFieldItem &aItem, bool aReadPhase, TSyncSetItem *aSyncSetItemP); /// add new item to datastore, returns created localID virtual localstatus apiAddItem(TMultiFieldItem &aItem, string &aLocalID); /// update existing item in datastore, returns 404 if item not found virtual localstatus apiUpdateItem(TMultiFieldItem &aItem); /// delete existing item in datastore, returns 211 if not existing any more virtual localstatus apiDeleteItem(TMultiFieldItem &aItem); /// end of syncset reading phase virtual localstatus apiEndDataRead(void); /// start of write virtual localstatus apiStartDataWrite(void); /// end DB data write sequence (but not yet admin data) virtual localstatus apiEndDataWrite(string &aThisSyncIdentifier); /// @} public: /// @name dsXXXX virtuals defined by TLocalEngineDS /// These are usually designed such that they should always call inherited::dsXXX to let the entire chain /// of ancestors see the calls /// @{ // /// end of message handling virtual void dsEndOfMessage(void); /// inform logic of coming state change virtual localstatus dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); /// inform logic of happened state change virtual localstatus dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); // log datastore sync result #ifdef HAS_SQL_ADMIN // - Called at end of sync with this datastore virtual void dsLogSyncResult(void); #endif // HAS_SQL_ADMIN /// @} /// @name dsHelpers private/protected helper routines /// @{ // private: #ifdef HAS_SQL_ADMIN /// update sync target head record localstatus updateSyncTarget(SQLHSTMT aStatement, bool aSessionFinishedSuccessfully); /// update map changes from memory list into actual map table localstatus updateODBCMap(SQLHSTMT aStatement, bool aSessionFinishedSuccessfully); // - log substitutions virtual void DoLogSubstitutions(string &aLog,bool aPlaintext); #endif // HAS_SQL_ADMIN /// @} // Publics for context funcs // - generate new LocalID into fLastGeneratedLocalID. void nextLocalID(TSpecialIDMode aMode,SQLHSTMT aStatement); // agent TODBCApiAgent *fAgentP; // access to agent (casted fSessionP for convenience) // config (typed pointers for convenience) TOdbcDSConfig *fConfigP; TOdbcAgentConfig *fAgentConfigP; protected: // some vars string fLastGeneratedLocalID; #ifdef SCRIPT_SUPPORT string fSQLFilter; // run-time calculated filter expression for SELECT WHERE clause SQLHSTMT fODBCScriptStatement; // statement used for executing SQL in scripts virtual void apiRebuildScriptContexts(void); #endif #ifdef OBJECT_FILTERING // - returns true if DB implementation can filter the standard filters // (LocalDBFilter, TargetFilter and InvisibleFilter) during database fetch // - otherwise, fetched items will be filtered after being read from DB. virtual bool dsFilteredFetchesFromDB(bool aFilterChanged=false); #endif protected: #ifdef ODBCAPI_SUPPORT // ODBC // - get (session level) ODBC handle SQLHDBC getODBCConnectionHandle(void); // - check for connection-level error void checkConnectionError(SQLRETURN aResult); #ifdef HAS_SQL_ADMIN // - issue single (or multiple) map access statements // NOTE: if all return SQL_NODATA, function will return false. bool IssueMapSQL( SQLHSTMT aStatement, const string &aSQL, const char *aComment, TMapEntryType aEntryType, const char *aLocalID, const char *aRemoteID, uInt32 aMapFlags ); // - do substitutions for map table access void DoMapSubstitutions( string &aSQL, // string to apply substitutions to TMapEntryType aEntryType, // the entry type const char *aLocalID, // local ID const char *aRemoteID, // remote ID uInt32 aMapFlags // map flags ); #endif // HAS_SQL_ADMIN #endif // ODBCAPI_SUPPORT // Generic SQL // - get next statement and setno from statement list (may begin with %GO(setno)) bool getNextSQLStatement(const string &aSQL, sInt16 &aStartAt, string &aOneSQL, uInt16 &aSetNo); // - execute single SQL statements bool execSQLStatement(SQLHSTMT aStatement, string &aSQL, bool aNoDataAllowed, const char *aComment, bool aForData); // - issue single (or multiple) data write (or delete) statements // NOTE: if all return SQL_NODATA, function will return false. bool IssueDataWriteSQL( SQLHSTMT aStatement, const string &aSQL, const char *aComment, bool aForUpdate, // for update TFieldMapList &aFieldMapList, // field map list for %N,%V and %v TMultiFieldItem *aItemP // item to read values and localid from ); // - do standard substitutions (%x-type) in a SQL string void DoSQLSubstitutions(string &aSQL); // insert additional data selection conditions, if any. bool appendFiltersClause(string &aSQL, const char *linktext); public: // - do substitutions for data table access void DoDataSubstitutions( string &aSQL, // string to apply substitutions to TFieldMapList &aFieldMapList, // field map list for %N,%V and %v uInt16 aSetNo, // Map Set number bool aForWrite, // set if read-enabled or write-enabled fields are shown in %N,%V and %v bool aForUpdate=false, // set if for update (only assigned fields will be shown if !fUpdateAllFields) TMultiFieldItem *aItemP=NULL, // item to read values and localid from sInt16 aRepOffset=0, // array index/repeat offset bool *aAllEmptyP=NULL, // true if all %V or %v empty bool *aDoneP=NULL // true if no data at specified aRepOffset ); // Parameter handling // - reset all mapped parameters void resetSQLParameterMaps(void); // - add parameter definition to the datastore level parameter list void addSQLParameterMap( bool aInParam, bool aOutParam, TParamMode aParamMode, TODBCFieldMapItem *aFieldMapP, TMultiFieldItem *aItemP, sInt16 aRepOffset ); // - prepare SQL statment as far as needed for parameter binding void prepareSQLStatement(SQLHSTMT aStatement, cAppCharP aSQL, bool aForData, cAppCharP aComment); // - bind parameters (and values for IN-Params) to the statement void bindSQLParameters(SQLHSTMT aStatement, bool aForData); // - save out parameter values and clean up void saveAndCleanupSQLParameters(SQLHSTMT aStatement, bool aForData); // - fetch next row from SQL statement, returns true if there is any bool fetchNextRow(SQLHSTMT aStatement, bool aForData); // - SQL statement complete, finalize it void finalizeSQLStatement(SQLHSTMT aStatement, bool aForData); protected: #ifdef OBJECT_FILTERING // - convert filter expression into SQL WHERE clause condition bool appendFilterConditions(string &aSQL, const string &aFilter); // - appends logical condition term to SQL from filter string bool appendFilterTerm(string &aSQL, const char *&aPos, const char *aStop); #endif #ifdef ODBCAPI_SUPPORT // - get one or two successive columns as time stamp depending on config void getColumnsAsTimestamp( SQLHSTMT aStatement, sInt16 &aColNumber, // will be updated by 1 or 2 bool aCombined, lineartime_t &aTimestamp, timecontext_t aTargetContext ); #endif // - get a column as integer based timestamp lineartime_t dbIntToLineartimeAs( sInt64 aDBInt, TDBFieldType aDbfty, timecontext_t aTargetContext ); // - helpers for mapping field values bool addFieldNameList(string &aSQL, bool aForWrite, bool aForUpdate, bool aAssignedOnly, TMultiFieldItem *aItemP, TFieldMapList &fml,uInt16 aSetNo, char aFirstSep=0); bool addFieldNameValueList(string &aSQL, bool aAssignedOnly, bool &aNoData, bool &aAllEmpty, TMultiFieldItem &aItem, bool aForUpdate,TFieldMapList &fml, uInt16 aSetNo, sInt16 aRepOffset=0, char aFirstSep=0); void fillFieldsFromSQLResult(SQLHSTMT aStatement, sInt16 &aColIndex, TMultiFieldItem &aItem, TFieldMapList &fml, uInt16 aSetNo, sInt16 aRepOffset=0); // - add field value as literal to SQL text bool appendFieldsLiteral(TMultiFieldItem &aItem, sInt16 aFid, sInt16 aRepOffset,TODBCFieldMapItem &aFieldMapping, string &aSQL); public: bool appendFieldValueLiteral(TItemField &aField,TDBFieldType aDBFieldType, uInt32 aMaxSize, bool aIsFloating, string &aSQL); protected: #ifdef ARRAYDBTABLES_SUPPORT // array table field access basic functions void readArray(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapArrayItem *aMapItemP); void writeArray(bool aDelete, bool aInsert, SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapArrayItem *aMapItemP); // accessing all array fields of a item void readArrayFields(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapList &fml); void writeArrayFields(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapList &fml, bool aInsert); void deleteArrayFields(SQLHSTMT aStatement, TMultiFieldItem &aItem, TFieldMapList &fml); #endif // other private utils // - private helper: start writing item void startWriteItem(void); // - private helper: end writing item void endWriteItem(void); // - create local ID with special algorithm void createLocalID(string &aLocalID,TSpecialIDMode aSpecialIDMode); protected: // Fully ODBC based DB bool fODBCAdminData; // set if admin data is actually in ODBC tables (and not managed in derived class' implementation) // StartDataRead/GetItem vars sInt32 fNextLocalID; // Parameters TParameterMapList fParameterMaps; // Sum of all string sizes per record sInt32 fRecordSize; // Filtering #ifdef OBJECT_FILTERING bool fFilterExpressionTested; bool fFilterWorksOnDBLevel; // set if filter can be executed by DB #endif // ODBC #ifdef ODBCAPI_SUPPORT SQLHDBC fODBCConnectionHandle; #endif // Note: %%% we need the statements as dummies even if ODBC is not compiled in SQLHSTMT fODBCReadStatement; SQLHSTMT fODBCWriteStatement; // SQLite #ifdef SQLITE_SUPPORT bool fUseSQLite; sqlite3 *fSQLiteP; sqlite3_stmt *fSQLiteStmtP; int fStepRc; #endif }; // TODBCApiDS #ifdef STREAMFIELD_SUPPORT // proxy for loading blobs class TODBCFieldProxy : public TBlobProxy { typedef TBlobProxy inherited; public: TODBCFieldProxy(TODBCApiDS *aODBCdsP, TODBCFieldMapItem *aFieldMapP, const char *aMasterKey, const char *aDetailKey); virtual ~TODBCFieldProxy(); // - returns size of entire blob virtual size_t getBlobSize(TStringField *aFieldP); // - read from Blob from specified stream position and update stream pos virtual size_t readBlobStream(TStringField *aFieldP, size_t &aPos, void *aBuffer, size_t aMaxBytes); // - dependency on a local ID virtual void setParentLocalID(const char *aParentLocalID) { fMasterKey=aParentLocalID; }; private: // fetch BLOB from DPAPI void fetchBlob(void); // Vars TODBCApiDS *fODBCdsP; // datastore which can be asked to retrieve data TODBCFieldMapItem *fFieldMapP; // field map item config (contains SQL needed to fetch BLOB field) string fMasterKey; // key of master (main) record containing the field to be retrieved string fDetailKey; // optional key of detail record, available only when "keyfield" attribute is present in bool fFetched; // already fetched (if value is empty, fBlobBuffer may still be NULL) string fValue; // string or binary value }; // TODBCFieldProxy #endif } // namespace sysync #endif // ODBCAPIDS_H #endif // SQL_SUPPORT // eof syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/odbcdb.h0000755000373300037200000000124612424517753026755 0ustar00nightlyallusers00000000000000/* * Common include file for all ODBC_H sources */ #ifndef ODBCDB_H #define ODBCDB_H // precompiled portion #include "odbcdb_precomp.h" // derived defines and sanity checks #ifdef ODBC_SUPPORT #error "ODBC_SUPPORT no longer exists, is now called SQL_SUPPORT. ODBCAPI_SUPPORT exists." #endif // SQL based admin #if defined (SQL_SUPPORT) && defined(ODBCAPI_SUPPORT) && !defined(BINFILE_ALWAYS_ACTIVE) #define HAS_SQL_ADMIN 1 #endif // other common includes #include "sysync.h" // Items used by ODBC DB interface #include "multifielditem.h" #include "mimediritemtype.h" #define TEXTMAP_FILE_EXTENSION ".txt" #define USERAUTH_FILE_EXTENSION ".txt" #endif /* eof */ syncevolution-1.5/src/synthesis/src/DB_interfaces/odbc_db/odbcdb_precomp.h0000755000373300037200000000203112424517753030473 0ustar00nightlyallusers00000000000000/* * precompiled/precompilable headers */ #ifndef ODBCDB_PRECOMP_H #define ODBCDB_PRECOMP_H /* Specific headers for ODBC DB interface */ #ifdef ODBCAPI_SUPPORT // Real ODBC support, include headers #ifdef _WIN32 #include #include #include #else // ODBC HEADERS (MacOSX and Linux: in /usr/include) #include #include #ifdef OBDC_UNICODE // unicode ODBC #include #endif // it seems that SQLLEN is not defined on all platforms, in particular, Mac OS X #ifdef MACOSX #ifndef SQLLEN #define SQLLEN SQLINTEGER #endif // SQLLEN #endif // MACOSX #endif // not _WIN32 #else // Some fake definitions to make SQLite-only versions compile w/o having ODBC headers #define HSTMT long #define SQLHSTMT HSTMT #define SQL_NULL_HANDLE 0 #define SQLRETURN long #define SQL_NULL_DATA (-1) #define SQLLEN long #define SQL_SUCCESS 0 #endif // ODBCAPI_SUPPORT #endif // ODBCDB_PRECOMP_H /* eof */ syncevolution-1.5/src/synthesis/src/Doxyfile0000644000373300037200000016405612424517753023037 0ustar00nightlyallusers00000000000000# Doxyfile 1.5.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = libsynthesis # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, # and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = $(INPUT) # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = NO # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentstion. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = YES # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to FRAME, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hiererachy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NONE # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = $(INCLUDE_PATH) # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = $(PREDEFINED) # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = libsynthesis.tags # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = YES # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is enabled by default, which results in a transparent # background. Warning: Depending on the platform used, enabling this option # may lead to badly anti-aliased labels on the edges of a graph (i.e. they # become hard to read). DOT_TRANSPARENT = YES # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO syncevolution-1.5/src/synthesis/src/Makefile.am.in0000644000373300037200000001733512424517753023767 0ustar00nightlyallusers00000000000000# The Makefile.am is generated from Makefile.am.in by autogen.sh # because the list of files to compile has to be determined # dynamically. # # When adding new files or changing options rerun autogen.sh. # Beware that changes made to Makefile.am will get lost, always # edit Makefile.am.in! The following rule ensures that make # itself will rebuild its makefiles when Makefile.am.in is edited. $(srcdir)/Makefile.am: $(srcdir)/Makefile.am.in $(srcdir)/gen-makefile-am.sh cd $(srcdir) && sh ./gen-makefile-am.sh # versioning for *all* libs # # CURRENT - most recent interface version # REVISION - minor version number of that interface implementation # AGE - number of previous interface versions supported in addition # to the current one # # When adding to the interface, increment CURRENT and AGE and reset # REVISION to zero. When breaking the interface in a backwards # incompatible way, increment CURRENT and reset AGE and REVISION to # zero. When fixing something without interface change, increment # REVISION. ENGINE_CURRENT = 6 ENGINE_REVISION = 0 ENGINE_AGE = 6 CLEANFILES = EXTRA_DIST = lib_LTLIBRARIES = libsmltk.la libsynthesis.la libsynthesissdk.la libsynthesisstubs.la nobase_include_HEADERS = @LIBSYNTHESISSDK_HEADERS@ synthesis/target_options.h # Configuration header files are searched in this order: # - Targets/ReleasedProducts/autotools: files only used when compiling with autotools # - Targets/ReleasedProducts/[combiEngine_opensource_linux|serverEngine_opensource_linux|SDK]: files also used with Synthesis Linux makefile # # Always included first via -include: # - config.h: configure result (top directory) # - Targets/ReleasedProducts/combiEngine_opensource_linux/clientengine_demo_x86_linux_prefix.h resp. Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource_linux_prefix.h # # Included as needed: # - define.h: hard-coded SyncML Toolkit config (from search path above) libsynthesis_la_SOURCES = @LIBSYNTHESIS_SOURCES@ \ $(XMLPARSE_SOURCES) libsynthesis_la_CPPFLAGS = -I$(srcdir)/sysync_SDK/Sources libsynthesis_la_CFLAGS = \ $(SYNTHESIS_WFLAGS) \ -include $(top_builddir)/config.h \ -include $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h \ -I$(srcdir)/Targets/ReleasedProducts/clientEngine_autotools/ \ -I$(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/ \ -I$(srcdir)/platform_adapters/linux/ \ -I$(srcdir)/platform_adapters/unix_common/ \ -I$(srcdir)/platform_adapters/ \ -I$(srcdir)/syncapps/clientEngine_custom/ \ -I$(srcdir)/syncapps/serverEngine_custom/ \ -I$(srcdir)/sysync/ \ -I$(srcdir)/Transport_interfaces/engine/ \ -I$(srcdir)/ \ -I$(srcdir)/syncml_tk/src/sml/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/ \ -I$(srcdir)/syncml_tk/src/sml/wsm/inc/ \ -I$(srcdir)/syncml_tk/src/sml/xlt/inc \ -I$(srcdir)/syncml_tk/src/sml/xlt/all \ -I$(srcdir)/DB_interfaces/odbc_db/ \ -I$(srcdir)/DB_interfaces/api_db/ \ -I$(srcdir)/sysync_SDK/Sources/ \ $(PCRE_CFLAGS) \ $(DLT_CFLAGS) \ $(SQLITE3_CFLAGS) \ $(ZLIB_CFLAGS) \ $(XMLPARSE_CFLAGS) \ $(XMLPARSE_CFLAGS_BUILTIN) \ $(LIBICAL_CFLAGS) \ $(LIBECAL_CFLAGS) libsynthesis_la_CXXFLAGS = $(libsynthesis_la_CFLAGS) libsynthesis_la_LIBADD = $(PCRE_LIBS) $(DLT_LIBS) $(SQLITE3_LIBS) $(XMLPARSE_LIBS) $(LIBICAL_LIBS) $(LIBECAL_LIBS) libsmltk.la -lz -ldl -lpthread libsynthesis_la_LDFLAGS = -version-info $(ENGINE_CURRENT):$(ENGINE_REVISION):$(ENGINE_AGE) \ -Wl,--version-script=$(srcdir)/synthesis-linker.map libsynthesis_la_DEPENDENCIES = $(srcdir)/synthesis-linker.map libsmltk.la if COND_XMLPARSE XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/expat -I$(srcdir)/expat/xmltok -I$(srcdir)/expat/xmlparse XMLPARSE_SOURCES = \ expat/xmlparse/xmlparse.c \ expat/xmlparse/xmlparse.h \ expat/xmltok/ascii.h \ expat/xmltok/asciitab.h \ expat/xmltok/iasciitab.h \ expat/xmltok/latin1tab.h \ expat/xmltok/nametab.h \ expat/xmltok/utf8tab.h \ expat/xmltok/xmldef.h \ expat/xmltok/xmlrole.c \ expat/xmltok/xmlrole.h \ expat/xmltok/xmltok.c \ expat/xmltok/xmltok.h \ expat/xmltok/xmltok_impl.h EXTRA_DIST += \ expat/xmltok/xmltok_impl.c \ expat/xmltok/xmltok_ns.c else # add path to xmlparse.h which includes the system's xmltok/xmlparse.h XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/Targets/ReleasedProducts/clientEngine_autotools/systemxml endif libsynthesissdk_la_LIBADD = libsmltk.la # san.cpp calls sml* functions directly libsynthesissdk_la_LDFLAGS = -static libsynthesissdk_la_CFLAGS = $(PIC_CXXFLAGS) $(SYNTHESIS_WFLAGS) libsynthesissdk_la_CXXFLAGS = $(PIC_CXXFLAGS) $(SYNTHESIS_WFLAGS) libsynthesissdk_la_SOURCES = @LIBSYNTHESISSDK_HEADERS@ if COND_STATIC libsynthesissdk_la_SOURCES += @LIBSYNTHESISSDK_SOURCES_SDK_ONLY@ else libsynthesissdk_la_SOURCES += @LIBSYNTHESISSDK_SOURCES_BOTH@ endif libsynthesissdk_la_CPPFLAGS = \ -D_GNU_SOURCE=1 \ -include $(top_builddir)/config.h \ -I$(srcdir)/Targets/ReleasedProducts/SDK \ -I$(srcdir)/sysync_SDK/Sources \ -I$(srcdir)/platform_adapters/linux/ \ -I$(srcdir)/platform_adapters/unix_common/ \ -I$(srcdir)/platform_adapters/ \ -I$(srcdir)/sysync/ \ -I$(srcdir)/syncml_tk/src/sml/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ libsynthesisstubs_la_LDFLAGS = -static libsynthesisstubs_la_CFLAGS = $(libsynthesissdk_la_CXXFLAGS) libsynthesisstubs_la_CXXFLAGS = $(libsynthesissdk_la_CXXFLAGS) libsynthesisstubs_la_SOURCES = sysync_SDK/Sources/enginestubs.c libsynthesisstubs_la_CPPFLAGS = $(libsynthesissdk_la_CPPFLAGS) # All files needed by libsynthesissdk.a come from either # sysync_SDK/Sources (shared between engine and SDK) or # sysync_SDK/SDK (only in SDK). We patch the files so that # they include their own files via #include "synthesis/..." vpath %.cpp $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK vpath %.c $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK vpath %.h $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK @LIBSYNTHESISSDK_HEADERS@: synthesis/%: % mkdir -p synthesis sed -e 's;# *include *";#include "synthesis/;' -e 's/defined(HAVE_STDINT_H)/1/' $< >$@ synthesis/target_options.h: $(srcdir)/Targets/ReleasedProducts/SDK/target_options.h mkdir -p synthesis cp $< $@ # ensure that the header file is in place before compiling the SDK @LIBSYNTHESISSDK_SOURCES@: synthesis/target_options.h # libsmltk: compiled just like libsynthesis libsmltk_la_SOURCES = @LIBSMLTK_SOURCES@ libsmltk_la_CFLAGS = $(libsynthesis_la_CFLAGS) libsmltk_la_CXXFLAGS = $(libsmltk_la_CFLAGS) # versioning: same as of engine! changes in libsmltk are not tracked separately. libsmltk_la_LDFLAGS = -version-info $(ENGINE_CURRENT):$(ENGINE_REVISION):$(ENGINE_AGE) \ -Wl,--version-script=$(srcdir)/smltk-linker.map libsmltk_la_DEPENDENCIES = $(srcdir)/smltk-linker.map # Doxygen for complete source code as used in autotools build. # The dependency on the libs ensures that doxygen is invoked # anew when any input file for those changes, reusing the # automatic dependency tracking. A side effect (both good # and bad) is that doxygen will not be invoked on code # which does not compile. html/index.html: Doxyfile libsynthesis.la libsynthesissdk.la rm -rf html INPUT="$(srcdir)/platform_adapters $(srcdir)/syncml_tk $(srcdir)/sysync_SDK $(srcdir)/sysync $(srcdir)/DB_interfaces" \ INCLUDE_PATH="$(srcdir)/Targets/ReleasedProducts/autotools $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux $(srcdir)/sysync_SDK/Sources" \ PREDEFINED="`cat $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h | grep '^#define' | grep '1 *$$' | sed -e 's/#define //' -e 's/ 1//'`" \ doxygen $< .PHONY: doxygen doxygen: html/index.html clean-doxygen: rm -rf html if COND_DOXYGEN all: doxygen clean-local: clean-doxygen endifsyncevolution-1.5/src/synthesis/src/Targets/0000755000373300037200000000000012424517753022726 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/0000755000373300037200000000000012424517753026176 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/SDK/0000755000373300037200000000000012424517753026617 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/SDK/define.h0000644000373300037200000000777412424517753030241 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/SDK/target_options.h0000644000373300037200000000235012424517753032031 0ustar00nightlyallusers00000000000000/* * File: target_options.h * * Author: Beat Forster (bfo@synthesis.ch), * Patrick Ohly (patrick.ohly@intel.com) * * Programming interface between Synthesis SyncML engine * and a database structure or client. * * Options for the client side which links against * libsynthesissdk. * * Copyright (c) 2009-2011 by Synthesis AG + plan44.ch * */ #ifndef TARGET_OPTIONS_H #define TARGET_OPTIONS_H /* - find out target platform */ #if defined (__MACH__) && defined(__APPLE__) #define MACOSX #else #if defined __MWERKS__ || defined _MSC_VER #ifndef _WIN32 #define _WIN32 #endif #else #define LINUX #endif #endif /* - we are not at the SyncML engine's side here */ #undef SYSYNC_ENGINE /* - but we link directly to the module */ #define DBAPI_LINKED 1 /* * The libsynthesis shared library uses SySync_ as prefix for C * functions. TEngineModuleBridge checks for the name with and without * the prefix, so clients are compatible with the current shared * libraries and (potentially older) commercial releases. */ #define SYSYNC_EXTERNAL(_x) SySync_ ## _x #define SYSYNC_PREFIX "SySync_" /* activate debug output */ #define SYDEBUG 2 #define NOWSM 1 #endif /* TARGET_OPTIONS_H */ /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_DEMO_linux/0000755000373300037200000000000012424517753032625 5ustar00nightlyallusers00000000000000clientengine_demo++.pch0000755000373300037200000000314312424517753037044 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_DEMO_linux/* precompiled headers source file * =============================== * * CVS: * $Author: bfo $ * $Date: 2007/11/08 15:58:02 $ * $Revision: 1.1 $ * $Source: /usr/local/cvsroot/sysync/Source/Targets/ReleasedProducts/clientEngine_DEMO_linux/clientengine_demo++.pch,v $ * $State: Exp $ * $Name: $ (Tag) * $Locker: $ (who has reserved checkout) * Log: * $Log: clientengine_demo++.pch,v $ * Revision 1.1 2007/11/08 15:58:02 bfo * project files added * * Revision 1.1 2007/10/02 10:12:57 luz * Added clientEngine_DEMO target to xcode * * Revision 1.1 2007/09/13 18:55:30 luz * New DEMO client engine (SQLite, TextDB but no ODBC nor DBPlugins) release target * * Revision 1.1 2007/09/05 14:03:05 luz * client engine with custom datastores (SQL, ODBC, SQLite and PluginAPI) * * Revision 1.2 2007/04/25 11:59:30 luz * Moved platform specific includes to syncclient_outlook_precomp.h - it belongs there so that file can be used in MW precompiled header source files (.pch) as well as in prefix_file.h for VC++. * * Revision 1.1 2004/02/04 14:24:06 luz * 2.0.5.3 s2g/ONE client release (and Oracle release candidate) checkin * * */ // SySync is a C++ project, make sure precomp headers // are compiled as C++! #pragma cplusplus on // determine target file name #pragma precompile_target "clientengine_demo_x86_linux++.mch" // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "clientengine_custom_precomp.h" // eof clientengine_demo.pch0000755000373300037200000000230312424517753036713 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_DEMO_linux/* precompiled headers source file * =============================== * * CVS: * $Author: bfo $ * $Date: 2007/11/08 15:58:02 $ * $Revision: 1.1 $ * $Source: /usr/local/cvsroot/sysync/Source/Targets/ReleasedProducts/clientEngine_DEMO_linux/clientengine_demo.pch,v $ * $State: Exp $ * $Name: $ (Tag) * $Locker: $ (who has reserved checkout) * Log: * $Log: clientengine_demo.pch,v $ * Revision 1.1 2007/11/08 15:58:02 bfo * project files added * * Revision 1.1 2007/10/02 10:12:57 luz * Added clientEngine_DEMO target to xcode * * Revision 1.1 2007/09/13 18:55:30 luz * New DEMO client engine (SQLite, TextDB but no ODBC nor DBPlugins) release target * * Revision 1.1 2007/09/05 14:03:05 luz * client engine with custom datastores (SQL, ODBC, SQLite and PluginAPI) * * */ // C-version for SyncML toolkit files #pragma cplusplus off // determine target file name #pragma precompile_target "clientengine_demo_x86_linux.mch" // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // standard SyncML TK stuff #include "smltk_precomp.h" // eof clientengine_demo_x86_linux_prefix.h0000644000373300037200000000106612424517753041673 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_DEMO_linux/* prefix file * =========== * */ #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - precompilable headers #include "clientengine_custom_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" #endif /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_DEMO_linux/define.h0000755000373300037200000000777412424517753034252 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif target_options.h0000755000373300037200000001345212424517753035770 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_DEMO_linux/* Target options * ============== * * */ // SYNCML CLIENT ENGINE LIBRARY DEMO Linux // ####################################### // - define to make release version // define platform #define LINUX // Release version status #undef RELEASE_VERSION #define RELEASE_SYDEBUG 2 // extended DBG included //#define OPTIONAL_SYDEBUG 1 // now include platform independent product options (which include global_options.h) #include "product_options.h" // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync Client Library DEMO Linux" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware // String used to construct logfile names #define TARGETID "sysynclib_linux" // Configuration // ============= // Default profile #undef HARD_CODED_SERVER_URI #undef HARD_CODED_DBNAMES #define DEFAULT_SERVER_URI "" #define DEFAULT_LOCALDB_PROFILE "" #define DEFAULT_SERVER_USER "" #define DEFAULT_SERVER_PASSWD "" #define DEFAULT_ENCODING SML_WBXML #define DEFAULT_TRANSPORT_USER NULL #define DEFAULT_TRANSPORT_PASSWD NULL #define DEFAULT_SOCKS_HOST NULL #define DEFAULT_PROXY_HOST NULL #define DEFAULT_DATASTORES_ENABLED false #define DEFAULT_EVENTS_DAYSBEFORE 30 #define DEFAULT_EVENTS_DAYSAFTER 90 #define DEFAULT_EVENTS_LIMITED false #define DEFAULT_EMAILS_LIMITED true #define DEFAULT_EMAILS_HDRONLY true #define DEFAULT_EMAILS_MAXKB 2 #define DEFAULT_EMAILS_ONLYLAST true #define DEFAULT_EMAILS_DAYSBEFORE 10 // Eval limit options // ================== // Note: Hard expiration date settings moved to product_options.h // - if defined, server will stop working after defined date #undef VERSION_COMMENTS #define VERSION_COMMENTS "Demo Version Expiring after " EXPIRY_DATE_STRING #define EXPIRES_AFTER_DATE 1 // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // - if defined, software will run without valid license until hard // expiry date (EXPIRES_AFTER_DATE) and then continue only with a valid license #define NO_LICENSE_UNTIL_HARDEXPIRY 1 // - Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_DEMO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_CLIENT_LIB_WIN32 #define SYSER_EXTRA_ID SYSER_EXTRA_ID_NONE // - if defined, software can be registered #define SYSER_REGISTRATION 1 // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_CLIENT_DEMO // a permanent DEMO license #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_CLIENT_LIB_LINUX // ..or a library license for MacOSX #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_CLIENT_LIB_ALL // ..or for all platforms #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_CLIENT_LIB_DESK // ..or for desktop platforms #define SYSER_PRODUCT_CODE_ALT4 SYSER_PRODCODE_CLIENT_ODBC_PRO_LINUX // ..or a PRO console client for MacOSX // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // Database support options // ======================== // - if defined, SQL support is included #define SQL_SUPPORT 1 #undef ODBCAPI_SUPPORT #define SQLITE_SUPPORT 1 // - if defined, ODBC DB mapping of arrays to aux tables is supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included #define SDK_SUPPORT 1 #undef PLUGIN_DLL // - define what SDK modules are linked in //#define DBAPI_DEMO 1 #define DBAPI_TEXT 1 #define FILEOBJ_SUPPORT 1 #define ADAPTITEM_SUPPORT 1 #define JNI_SUPPORT 1 // JNI needed for GUI, but without PLUGIN_DLL, JNI is not available for DB plugins (correct for DEMO!) // Datastore Options // ----------------- // - link in customimplds on top of binfile #define BASED_ON_BINFILE_CLIENT 1 // - SQL and API datastores have changedetection, so build binfile for that #define CHANGEDETECTION_AVAILABLE 1 // - we need a separate changelog mechanism #define CHECKSUM_CHANGELOG 1 // - string localIDs with sufficiently large size #define STRING_LOCALID_MAXLEN 256 // SySync options // ============== // - enhanced profile record #define ENHANCED_PROFILES_2004 1 #define CLIENTFEATURES_2008 1 // - NO support for automatic syncing (timed, IPP, server alerted...) #undef AUTOSYNC_SUPPORT // - support for intelligent push & poll (IPP) //#define IPP_SUPPORT 1 //#define IPP_SUPPORT_ALWAYS 1 // regardless of license flags // - support for timed sync #undef TIMEDSYNC_SUPPORT // - support for WAP push alerted sync #undef SERVERALERT_SUPPORT // - support for Proxy #define PROXY_SUPPORT 1 // - support for multiple profiles #define MULTI_PROFILE_SUPPORT 1 // - show progress events #define PROGRESS_EVENTS 1 // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT #define REGEX_SUPPORT // - client does not need target options #undef SYSYNC_TARGET_OPTIONS // - filters #define OBJECT_FILTERING // - client does not need superdatastores #undef SUPERDATASTORES // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "synthesis.ch/SySyncLib" // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_autotools/0000755000373300037200000000000012424517753032713 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_autotools/systemxml/0000755000373300037200000000000012424517753034760 5ustar00nightlyallusers00000000000000xmlparse.h0000644000373300037200000000015512424517753036706 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_autotools/systemxml/* redirect #include as used in the source to xmltok/xmlparse.h */ #include syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_ios/0000755000373300037200000000000012424517753033716 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_ios/define.h0000644000373300037200000001003512424517753035320 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif prefix_file.h0000644000373300037200000000101212424517753036276 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_ios#ifndef __PREFIX_FILE_H #define __PREFIX_FILE_H #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "clientengine_custom_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - SML toolkit WITHOUT xpt part #include "smltk_precomp.h" #endif #endifsyncml_tk_prefix_file.h0000644000373300037200000000033412424517753040367 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_ios#ifndef __SMLTK_PREFIX_FILE_H #define __SMLTK_PREFIX_FILE_H // C version use // - target options can incfluence everything #include "target_options.h" // - SML toolkit WITHOUT xpt part #include "smltk_precomp.h" #endiftarget_options.h0000644000373300037200000001512212424517753037052 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_ios/* Target options * ============== */ // SYNCML CLIENT ENGINE LIBRARY OPENSOURCE iOS // ########################################### // define platform // - we are on MACOSX (but on the mobile variant aka iOS of it) #define MACOSX 1 #define MOBOSX 1 // - XCode does support exceptions #define TARGET_HAS_EXCEPTIONS 1 // Release version status #if !DEBUG #define RELEASE_VERSION #endif #define RELEASE_SYDEBUG 1 // no extended DBG included //#define OPTIONAL_SYDEBUG 1 // Eval limit options // ================== // Opensource version does not have any licensing checks #define NEVER_EXPIRES_IS_OK 1 // to explicitly override check in SyncAppBase // now include platform independent product options (which include global_options.h) #include "product_options.h" // turn on console for XCode debug builds #if DEBUG #define CONSOLEINFO 1 // sysync enables console output with this #define CONSOLEDBG 1 // our Cocoa wrapper code and plugins enables some debug message with this #define SYDEBUG_LOCATION "" // source code links enabled #endif // enable tunnel API for direct access to backend datastores #define DBAPI_TUNNEL_SUPPORT 1 // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync Client Library Opensource iOS" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware #define SYNCML_CLIENT_DEVTYP "pda"; // iPhone and iPod Touch can be seen as PDA (better than "smartphone", the iPod is not a phone) // String used to construct logfile names #define TARGETID "sysynclib_client_iphoneos" // Configuration // ============= // Default profile #undef HARD_CODED_SERVER_URI #undef HARD_CODED_DBNAMES #define DEFAULT_SERVER_URI "http://" #define DEFAULT_LOCALDB_PROFILE "" #define DEFAULT_SERVER_USER "" #define DEFAULT_SERVER_PASSWD "" #define DEFAULT_ENCODING SML_WBXML #define DEFAULT_TRANSPORT_USER NULL #define DEFAULT_TRANSPORT_PASSWD NULL #define DEFAULT_SOCKS_HOST NULL #define DEFAULT_PROXY_HOST NULL #define DEFAULT_DATASTORES_ENABLED false #define DEFAULT_EVENTS_DAYSBEFORE 30 #define DEFAULT_EVENTS_DAYSAFTER 90 #define DEFAULT_EVENTS_LIMITED false #define DEFAULT_EMAILS_LIMITED true #define DEFAULT_EMAILS_HDRONLY true #define DEFAULT_EMAILS_MAXKB 2 #define DEFAULT_EMAILS_ONLYLAST true #define DEFAULT_EMAILS_DAYSBEFORE 10 // Eval limit options // ================== // Note: Hard expiration date settings moved to product_options.h // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // Engine does not have auto-demo // Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_CLIENT_LIB_IPHONEOS #define SYSER_EXTRA_ID SYSER_EXTRA_ID_NONE // This is a static library hard-linked with the plan44.ch app sold via AppStore and thus needs no licensing // and may not expire #undef SYSER_REGISTRATION #undef VERSION_COMMENTS #define VERSION_COMMENTS "plan44.ch libsynthesis opensource" #undef EXPIRES_AFTER_DATE // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODUCT_CODE // license specifically for the product we are #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_CLIENT_PDA_PRO // a PRO license for a PDA client works as well #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_CLIENT_LIB_ALL #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_CLIENT_LIB_MOBILE #undef SYSER_PRODUCT_CODE_ALT4 // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // for the internal version, DLL plugins are always allowed // (even with licenses that do not have SYSER_PRODFLAG_SERVER_SDKAPI set) // because we do not use a license at all! #define DLL_PLUGINS_ALWAYS_ALLOWED 1 // SySync options // ============== // - we can rely on iOS devices to have a unique device ID // (disables userhash-for-Oracle server workarounds we need e.g. for WinMobile with all those crappy // OEM implementations like MotoQ and SGH i780 that return same ID for all devices). #define GUARANTEED_UNIQUE_DEVICID 1 // - enhanced profile record #define ENHANCED_PROFILES_2004 1 #define CLIENTFEATURES_2008 1 // - support for Proxy #define PROXY_SUPPORT 1 // - support for multiple profiles #define MULTI_PROFILE_SUPPORT 1 // - show progress events #define PROGRESS_EVENTS 1 // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT #define REGEX_SUPPORT // - client does not need target options #undef SYSYNC_TARGET_OPTIONS // - filters #define OBJECT_FILTERING // - client does not need superdatastores #undef SUPERDATASTORES // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "plan44.ch/sysynclib_client" #if RELEASE_SYDEBUG>0 // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 #else #undef MSGDUMP #endif // Datastore Options // ----------------- // - link in customimplds on top of binfile #define BASED_ON_BINFILE_CLIENT 1 // - SQL and API datastores have changedetection, so build binfile for that #define CHANGEDETECTION_AVAILABLE 1 // - we need a separate changelog mechanism #define CHECKSUM_CHANGELOG 1 // - string localIDs with sufficiently large size #define STRING_LOCALID_MAXLEN 256 // - supports SQL, but no ODBC, SQLite and DBApi #define SQL_SUPPORT 1 #undef ODBCAPI_SUPPORT #define SQLITE_SUPPORT 1 // - master detail (array) tables supported #define ARRAYDBTABLES_SUPPORT 1 // - Plugin SDK support is included #define SDK_SUPPORT 1 #undef PLUGIN_DLL // no external dylib plugins, iOS SDK does not allow them #define IPHONE_PLUGINS_STATIC 1 // iOS SDK needs statically linked plugins // - always link 4 custom plugins. A separate project provides a set of // 4 dummy plugins that can be linked if no real custom plugins are needed // (e.g. in a SQLite3 only sync) #define HARDCODED_CUSTOM 1 // - always link the TAB separate text file plugin #define DBAPI_TEXT 1 /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_linux/0000755000373300037200000000000012424517753034263 5ustar00nightlyallusers00000000000000clientengine_demo++.pch0000644000373300037200000000075012424517753040500 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_linux/* precompiled headers source file * =============================== * * */ // SySync is a C++ project, make sure precomp headers // are compiled as C++! #pragma cplusplus on // determine target file name #pragma precompile_target "clientengine_demo_x86_linux++.mch" // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "clientengine_custom_precomp.h" // eof clientengine_demo.pch0000644000373300037200000000067312424517753040356 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_linux/* precompiled headers source file * =============================== * */ // C-version for SyncML toolkit files #pragma cplusplus off // determine target file name #pragma precompile_target "clientengine_demo_x86_linux.mch" // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // standard SyncML TK stuff #include "smltk_precomp.h" // eof clientengine_demo_x86_linux_prefix.h0000644000373300037200000000172612424517753043334 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_linux/* prefix file * =========== * */ // override default in global_options.h: // use SySync_ as prefix for external C functions #define SYSYNC_EXTERNAL(_x) SySync_ ## _x #define SYSYNC_PREFIX "SySync_" // required before time.h to get tm_gmtoff in struct tm: // this is used to find standard and daylight saving offset // of the system, see timezones.cpp #define _BSD_SOURCE 1 #define USE_TM_GMTOFF 1 // required for vasprintf #define _GNU_SOURCE 1 #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - precompilable headers #include "clientengine_custom_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" #endif /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_linux/define.h0000755000373300037200000000777412424517753035710 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif target_options.h0000755000373300037200000001362312424517753037426 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/clientEngine_opensource_linux/* Target options * ============== * * */ // SYNCML CLIENT ENGINE LIBRARY OPENSOURCE LINUX // ############################################# // define platform #define LINUX // Release version status #define RELEASE_VERSION #define RELEASE_SYDEBUG 2 // extended DBG included //#define OPTIONAL_SYDEBUG 1 // Eval limit options // ================== // OpenSource Library does not have any expiry mechanisms #define NEVER_EXPIRES_IS_OK 1 // to explicitly override check in SyncAppBase // now include platform independent product options (which include global_options.h) #include "product_options.h" // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync Client Library OpenSource Linux" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware #define SYNCML_CLIENT_DEVTYP "pda"; // Linux mobiles are probably more "PDA"s than pure "smartphones" // String used to construct logfile names #define TARGETID "sysynclib_linux" // Configuration // ============= // Default profile #undef HARD_CODED_SERVER_URI #undef HARD_CODED_DBNAMES #define DEFAULT_SERVER_URI "http://" #define DEFAULT_LOCALDB_PROFILE "" #define DEFAULT_SERVER_USER "" #define DEFAULT_SERVER_PASSWD "" #define DEFAULT_ENCODING SML_WBXML #define DEFAULT_TRANSPORT_USER NULL #define DEFAULT_TRANSPORT_PASSWD NULL #define DEFAULT_SOCKS_HOST NULL #define DEFAULT_PROXY_HOST NULL #define DEFAULT_DATASTORES_ENABLED false #define DEFAULT_EVENTS_DAYSBEFORE 30 #define DEFAULT_EVENTS_DAYSAFTER 90 #define DEFAULT_EVENTS_LIMITED false #define DEFAULT_EMAILS_LIMITED true #define DEFAULT_EMAILS_HDRONLY true #define DEFAULT_EMAILS_MAXKB 2 #define DEFAULT_EMAILS_ONLYLAST true #define DEFAULT_EMAILS_DAYSBEFORE 10 // Eval limit options // ================== // Note: Hard expiration date settings moved to product_options.h // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // Engine does not have auto-demo // Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_CLIENT_LIB_LINUX #define SYSER_EXTRA_ID SYSER_EXTRA_ID_NONE // This is the opensource Linux library, and needs no registration #undef SYSER_REGISTRATION #undef VERSION_COMMENTS #define VERSION_COMMENTS "Synthesis OpenSource" #undef EXPIRES_AFTER_DATE // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_CLIENT_DEMO // a permanent DEMO license #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_CLIENT_LIB_LINUX // ..or a library license for Linux #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_CLIENT_LIB_ALL // ..or for all platforms #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_CLIENT_LIB_DESK // ..or for desktop platforms #define SYSER_PRODUCT_CODE_ALT4 SYSER_PRODCODE_CLIENT_ODBC_PRO_LINUX // ..or a PRO console client for Linux // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // for the opensource version, DLL plugins are always allowed // (even with licenses that do not have SYSER_PRODFLAG_SERVER_SDKAPI set) // because we do not use a license at all! #define DLL_PLUGINS_ALWAYS_ALLOWED 1 // Database support options // ======================== // - if defined, SQL support is included #define SQL_SUPPORT 1 #undef ODBCAPI_SUPPORT #define SQLITE_SUPPORT 1 // - if defined, ODBC DB mapping of arrays to aux tables is supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included #define SDK_SUPPORT 1 // - id defined, code allows calling of subsequent DLLs #define PLUGIN_DLL 1 // Datastore Options // ----------------- // - link in customimplds on top of binfile #define BASED_ON_BINFILE_CLIENT 1 // - SQL and API datastores have changedetection, so build binfile for that #define CHANGEDETECTION_AVAILABLE 1 // - we need a separate changelog mechanism #define CHECKSUM_CHANGELOG 1 // - string localIDs with sufficiently large size #define STRING_LOCALID_MAXLEN 256 // SySync options // ============== // - enhanced profile record #define ENHANCED_PROFILES_2004 1 #define CLIENTFEATURES_2008 1 // - NO support for automatic syncing (timed, IPP, server alerted...) #undef AUTOSYNC_SUPPORT // - support for intelligent push & poll (IPP) //#define IPP_SUPPORT 1 //#define IPP_SUPPORT_ALWAYS 1 // regardless of license flags // - support for timed sync #undef TIMEDSYNC_SUPPORT // - support for WAP push alerted sync #undef SERVERALERT_SUPPORT // - support for Proxy #define PROXY_SUPPORT 1 // - support for multiple profiles #define MULTI_PROFILE_SUPPORT 1 // - show progress events #define PROGRESS_EVENTS 1 // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT #define REGEX_SUPPORT // - client does not need target options #undef SYSYNC_TARGET_OPTIONS // - filters #define OBJECT_FILTERING // - client does not need superdatastores #undef SUPERDATASTORES // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "synthesis.ch/SySyncLib" // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 // - enable support for remote rules, despite being a client #undef NO_REMOTE_RULES /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_ios/0000755000373300037200000000000012424517753033531 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_ios/define.h0000644000373300037200000001003512424517753035133 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif prefix_file.h0000644000373300037200000000101212424517753036111 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_ios#ifndef __PREFIX_FILE_H #define __PREFIX_FILE_H #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "serverengine_custom_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - SML toolkit WITHOUT xpt part #include "smltk_precomp.h" #endif #endifsyncml_tk_prefix_file.h0000644000373300037200000000033412424517753040202 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_ios#ifndef __SMLTK_PREFIX_FILE_H #define __SMLTK_PREFIX_FILE_H // C version use // - target options can incfluence everything #include "target_options.h" // - SML toolkit WITHOUT xpt part #include "smltk_precomp.h" #endiftarget_options.h0000644000373300037200000001535212424517753036672 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_ios/* Target options * ============== */ // SYNCML UNIFIED CLIENT/SERVER ENGINE LIBRARY OPENSOURCE iOS // ########################################################## // define platform // - we are on MACOSX (but on the mobile variant aka iPhoneOS of it) #define MACOSX 1 #define MOBOSX 1 // - XCode does support exceptions #define TARGET_HAS_EXCEPTIONS 1 // Release version status #if !DEBUG #define RELEASE_VERSION #endif #define RELEASE_SYDEBUG 1 // no extended DBG included //#define OPTIONAL_SYDEBUG 1 // Eval limit options // ================== // Opensource version does not have any licensing checks #define NEVER_EXPIRES_IS_OK 1 // to explicitly override check in SyncAppBase // now include platform independent product options (which include global_options.h) #include "combi_product_options.h" // turn on console and source linking for XCode debug builds #if DEBUG #define CONSOLEINFO 1 // sysync enables console output with this #define CONSOLEDBG 1 // our Cocoa wrapper code and plugins enables some debug message with this #define SYDEBUG_LOCATION "" // source code links enabled #endif // enable tunnel API for direct access to backend datastores #define DBAPI_TUNNEL_SUPPORT 1 // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync SyncML Library Opensource iOS" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware #define SYNCML_CLIENT_DEVTYP "pda"; // iPhone and iPod Touch can be seen as PDA (better than "smartphone", the iPod is not a phone) // String used to construct logfile names #define TARGETID "sysynclib_combi_iphoneos" // Configuration // ============= // Default profile #undef HARD_CODED_SERVER_URI #undef HARD_CODED_DBNAMES #define DEFAULT_SERVER_URI "http://" #define DEFAULT_LOCALDB_PROFILE "" #define DEFAULT_SERVER_USER "" #define DEFAULT_SERVER_PASSWD "" #define DEFAULT_ENCODING SML_WBXML #define DEFAULT_TRANSPORT_USER NULL #define DEFAULT_TRANSPORT_PASSWD NULL #define DEFAULT_SOCKS_HOST NULL #define DEFAULT_PROXY_HOST NULL #define DEFAULT_DATASTORES_ENABLED false #define DEFAULT_EVENTS_DAYSBEFORE 30 #define DEFAULT_EVENTS_DAYSAFTER 90 #define DEFAULT_EVENTS_LIMITED false #define DEFAULT_EMAILS_LIMITED true #define DEFAULT_EMAILS_HDRONLY true #define DEFAULT_EMAILS_MAXKB 2 #define DEFAULT_EMAILS_ONLYLAST true #define DEFAULT_EMAILS_DAYSBEFORE 10 // Eval limit options // ================== // Note: Hard expiration date settings moved to product_options.h // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // Engine does not have auto-demo // Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_SERVER_LIB_IPHONEOS // needs a server=unilib license #define SYSER_EXTRA_ID SYSER_EXTRA_ID_NONE // This is a static library hard-linked with the plan44.ch app sold via AppStore and thus needs no licensing // and may not expire #undef SYSER_REGISTRATION #undef VERSION_COMMENTS #define VERSION_COMMENTS "plan44.ch libsynthesis opensource" #undef EXPIRES_AFTER_DATE // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODUCT_CODE // license specifically for the product we are #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_CLIENT_PDA_PRO // a PRO license for a PDA client works for unilib as well #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_SERVER_LIB_MOBILE // server=unilib license needed #define SYSER_PRODUCT_CODE_ALT4 SYSER_PRODCODE_SERVER_LIB_ALL // server=unilib license needed // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // for the internal version, DLL plugins are always allowed // (even with licenses that do not have SYSER_PRODFLAG_SERVER_SDKAPI set) // because we do not use a license at all! #define DLL_PLUGINS_ALWAYS_ALLOWED 1 // SySync options // ============== // - we can rely on iOS devices to have a unique device ID // (disables userhash-for-Oracle server workarounds we need e.g. for WinMobile with all those crappy // OEM implementations like MotoQ and SGH i780 that return same ID for all devices). #define GUARANTEED_UNIQUE_DEVICID 1 // - enhanced profile record #define ENHANCED_PROFILES_2004 1 #define CLIENTFEATURES_2008 1 // - support for Proxy #define PROXY_SUPPORT 1 // - support for multiple profiles #define MULTI_PROFILE_SUPPORT 1 // - show progress events #define PROGRESS_EVENTS 1 // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT #define REGEX_SUPPORT // - server does support target options #define SYSYNC_TARGET_OPTIONS // - filters #define OBJECT_FILTERING 1 // - superdatastores #define SUPERDATASTORES 1 // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "plan44.ch/sysynclib_combi" #if RELEASE_SYDEBUG>0 // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 #else #undef MSGDUMP #endif // Datastore Options // ----------------- // - link in customimplds on top of binfile #define BASED_ON_BINFILE_CLIENT 1 // - SQL and API datastores have changedetection, so build binfile for that #define CHANGEDETECTION_AVAILABLE 1 // - we need a separate changelog mechanism #define CHECKSUM_CHANGELOG 1 // - string localIDs with sufficiently large size #define STRING_LOCALID_MAXLEN 256 // - supports SQL, but no ODBC, SQLite and DBApi #define SQL_SUPPORT 1 #undef ODBCAPI_SUPPORT #define SQLITE_SUPPORT 1 // - master detail (array) tables supported #define ARRAYDBTABLES_SUPPORT 1 // - Plugin SDK support is included #define SDK_SUPPORT 1 #undef PLUGIN_DLL // no external dylib plugins, iOS SDK does not allow them #define IPHONE_PLUGINS_STATIC 1 // iOS SDK needs statically linked plugins // - always link 4 custom plugins. A separate project provides a set of // 4 dummy plugins that can be linked if no real custom plugins are needed // (e.g. in a SQLite3 only sync) #define HARDCODED_CUSTOM 1 // - always link the TAB separate text file plugin (required for server admin data) #define DBAPI_TEXT 1 /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_linux/0000755000373300037200000000000012424517753034076 5ustar00nightlyallusers00000000000000combiengine_demo++.pch0000644000373300037200000000074412424517753040131 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_linux/* precompiled headers source file * =============================== * */ // SySync is a C++ project, make sure precomp headers // are compiled as C++! #pragma cplusplus on // determine target file name #pragma precompile_target "combiengine_opensource_linux++.mch" // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "combiengine_custom_precomp.h" // eof combiengine_demo.pch0000644000373300037200000000067312424517753040004 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_linux/* precompiled headers source file * =============================== * */ // C-version for SyncML toolkit files #pragma cplusplus off // determine target file name #pragma precompile_target "combiengine_opensource_linux.mch" // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // standard SyncML TK stuff #include "smltk_precomp.h" // eof combiengine_opensource_linux_prefix.h0000644000373300037200000000217612424517753043513 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_linux/* prefix file * =========== * */ // override default in global_options.h: // always use SySync_ as prefix for external C functions // - client #define SYSYNC_EXTERNAL(_x) SySync_ ## _x #define SYSYNC_PREFIX "SySync_" // - server #define SYSYNC_EXTERNAL_SRV(_x) SySync_srv_ ## _x #define SYSYNC_PREFIX_SRV "SySync_srv_" // required before time.h to get tm_gmtoff in struct tm: // this is used to find standard and daylight saving offset // of the system, see timezones.cpp #define _BSD_SOURCE 1 #define USE_TM_GMTOFF 1 // required for vasprintf #define _GNU_SOURCE 1 #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - precompilable headers (use those of server, but client is the same) #include "serverengine_custom_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" #endif /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_linux/define.h0000644000373300037200000000777412424517753035520 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif target_options.h0000644000373300037200000001541512424517753037237 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/combiEngine_opensource_linux/* Target options * ============== * */ // Many of the options below can also be configured via config.h. // If ONOFF_ is defined, then the feature is on if // ONOFF_ is != 0, otherwise it is off. If that // define is not set, then the default setting in this file applies. #ifdef HAVE_CONFIG_H # include #endif // SYNCML SERVER ENGINE LIBRARY OPENSOURCE LINUX // ############################################# // define platform #define LINUX // Release version status #define RELEASE_VERSION #define RELEASE_SYDEBUG 2 // extended DBG included //#define OPTIONAL_SYDEBUG 1 // enable printing to console via libc by default, // might be turned off again in product_options.h #define CONSOLEINFO #define CONSOLEINFO_LIBC // enable replacing SMLTK memory functions by setting global variables #define SML_LIB_MEMORY_FUNCTION_POINTERS // Eval limit options // ================== // OpenSource Library does not have any expiry mechanisms #define NEVER_EXPIRES_IS_OK 1 // to explicitly override check in SyncAppBase // now include platform independent product options (which include global_options.h) #include "combi_product_options.h" // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync SyncML Library OpenSource Linux" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware // String used to construct logfile names #define TARGETID "sysynclib_uni_linux" // Configuration // ============= // Default profile #undef HARD_CODED_SERVER_URI #undef HARD_CODED_DBNAMES #define DEFAULT_SERVER_URI "" #define DEFAULT_LOCALDB_PROFILE "" #define DEFAULT_SERVER_USER "" #define DEFAULT_SERVER_PASSWD "" #define DEFAULT_ENCODING SML_WBXML #define DEFAULT_TRANSPORT_USER NULL #define DEFAULT_TRANSPORT_PASSWD NULL #define DEFAULT_SOCKS_HOST NULL #define DEFAULT_PROXY_HOST NULL #define DEFAULT_DATASTORES_ENABLED false #define DEFAULT_EVENTS_DAYSBEFORE 30 #define DEFAULT_EVENTS_DAYSAFTER 90 #define DEFAULT_EVENTS_LIMITED false #define DEFAULT_EMAILS_LIMITED true #define DEFAULT_EMAILS_HDRONLY true #define DEFAULT_EMAILS_MAXKB 2 #define DEFAULT_EMAILS_ONLYLAST true #define DEFAULT_EMAILS_DAYSBEFORE 10 // Note: Hard expiration date settings moved to product_options.h // This is the opensource Linux library, and needs no registration #undef SYSER_REGISTRATION #undef VERSION_COMMENTS #define VERSION_COMMENTS "Synthesis OpenSource" #undef EXPIRES_AFTER_DATE // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // Engine does not have auto-demo // Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_SERVER_LIB_LINUX #define SYSER_EXTRA_ID SYSER_EXTRA_ID_NONE // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_SERVER_DEMO // a permanent DEMO license #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_SERVER_LIB_LINUX // ..or a library license for Linux #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_SERVER_LIB_ALL // ..or for all platforms #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_SERVER_LIB_DESK // ..or for desktop platforms #define SYSER_PRODUCT_CODE_ALT4 SYSER_PRODCODE_SERVER_ODBC_PRO_LINUX // ..or a PRO server for Linux // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // for the opensource version, DLL plugins are always allowed // (even with licenses that do not have SYSER_PRODFLAG_SERVER_SDKAPI set) // because we do not use a license at all! #define DLL_PLUGINS_ALWAYS_ALLOWED 1 // SySync options // ============== // - enhanced profile record #define ENHANCED_PROFILES_2004 1 #define CLIENTFEATURES_2008 1 // - NO support for automatic syncing (timed, IPP, server alerted...) #undef AUTOSYNC_SUPPORT // - support for intelligent push & poll (IPP) //#define IPP_SUPPORT 1 //#define IPP_SUPPORT_ALWAYS 1 // regardless of license flags // - support for timed sync #undef TIMEDSYNC_SUPPORT // - support for WAP push alerted sync #undef SERVERALERT_SUPPORT // - support for Proxy #define PROXY_SUPPORT 1 // - support for multiple profiles #define MULTI_PROFILE_SUPPORT 1 // - show progress events #define PROGRESS_EVENTS 1 // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT 1 #define REGEX_SUPPORT 1 #if defined(ONOFF_REGEX_SUPPORT) # if ONOFF_REGEX_SUPPORT # define REGEX_SUPPORT 1 # else # undef REGEX_SUPPORT # endif #endif // - server does support target options #define SYSYNC_TARGET_OPTIONS 1 // - filters #define OBJECT_FILTERING 1 // - server does need superdatastores #define SUPERDATASTORES 1 // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "synthesis.ch/SySyncLib_uni" // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 // Database support options // ======================== // - link in customimplds on top of binfile #define BASED_ON_BINFILE_CLIENT 1 // - SQL and API datastores have changedetection, so build binfile for that #define CHANGEDETECTION_AVAILABLE 1 // - we need a separate changelog mechanism #define CHECKSUM_CHANGELOG 1 // - string localIDs with sufficiently large size #define STRING_LOCALID_MAXLEN 256 // - multithreaded #define MULTI_THREAD_SUPPORT 1 #define MULTI_THREAD_DATASTORE 1 // - if defined, SQL support is included #undef ODBCAPI_SUPPORT #define SQLITE_SUPPORT 1 #if defined(ONOFF_SQLITE_SUPPORT) # if ONOFF_SQLITE_SUPPORT # define SQLITE_SUPPORT 1 # else # undef SQLITE_SUPPORT # endif #endif #if defined(SQLITE_SUPPORT) || defined(ODBCAPI_SUPPORT) # define SQL_SUPPORT 1 #else # undef SQL_SUPPORT #endif // - if defined, ODBC DB mapping of arrays to aux tables is supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included #define SDK_SUPPORT 1 // - id defined, code allows calling of subsequent DLLs #define PLUGIN_DLL 1 // - define what SDK modules are linked in //#define DBAPI_DEMO 1 #define DBAPI_TEXT 1 //#define DBAPI_SILENT 1 //#define DBAPI_EXAMPLE 1 /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/serverEngine_opensource_linux/0000755000373300037200000000000012424517753034313 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/serverEngine_opensource_linux/define.h0000644000373300037200000000777412424517753035735 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: win */ /* target OS: win */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif serverengine_opensource++.pch0000644000373300037200000000074712424517753042024 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/serverEngine_opensource_linux/* precompiled headers source file * =============================== * */ // SySync is a C++ project, make sure precomp headers // are compiled as C++! #pragma cplusplus on // determine target file name #pragma precompile_target "serverengine_opensource_linux++.mch" // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "serverengine_custom_precomp.h" // eof serverengine_opensource.pch0000644000373300037200000000067512424517753041676 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/serverEngine_opensource_linux/* precompiled headers source file * =============================== * */ // C-version for SyncML toolkit files #pragma cplusplus off // determine target file name #pragma precompile_target "serverengine_opensource_linux.mch" // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // standard SyncML TK stuff #include "smltk_precomp.h" // eof serverengine_opensource_linux_prefix.h0000644000373300037200000000166112424517753044143 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/serverEngine_opensource_linux/* prefix file * =========== * */ // override default in global_options.h: // use SySync_srv_ as prefix for external C functions #define SYSYNC_EXTERNAL(_x) SySync_srv_ ## _x #define SYSYNC_PREFIX "SySync_srv_" // required before time.h to get tm_gmtoff in struct tm: // this is used to find standard and daylight saving offset // of the system, see timezones.cpp #define _BSD_SOURCE 1 #define USE_TM_GMTOFF 1 #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - precompilable headers #include "serverengine_custom_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" #endif /* eof */ target_options.h0000644000373300037200000001035512424517753037452 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/serverEngine_opensource_linux/* Target options * ============== * */ // SYNCML SERVER ENGINE LIBRARY OPENSOURCE LINUX // ############################################# // define platform #define LINUX // Release version status #define RELEASE_VERSION #define RELEASE_SYDEBUG 2 // extended DBG included //#define OPTIONAL_SYDEBUG 1 // Eval limit options // ================== // OpenSource Library does not have any expiry mechanisms #define NEVER_EXPIRES_IS_OK 1 // to explicitly override check in SyncAppBase // now include platform independent product options (which include global_options.h) #include "product_options.h" // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync Server Library OpenSource Linux" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware // String used to construct logfile names #define TARGETID "sysynclib_srv_linux" // Note: Hard expiration date settings moved to product_options.h // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // Engine does not have auto-demo // Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_SERVER_LIB_LINUX #define SYSER_EXTRA_ID SYSER_EXTRA_ID_NONE // This is the opensource Linux library, and needs no registration #undef SYSER_REGISTRATION #undef VERSION_COMMENTS #define VERSION_COMMENTS "Synthesis OpenSource" #undef EXPIRES_AFTER_DATE // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_SERVER_DEMO // a permanent DEMO license #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_SERVER_LIB_LINUX // ..or a library license for Linux #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_SERVER_LIB_ALL // ..or for all platforms #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_SERVER_LIB_DESK // ..or for desktop platforms #define SYSER_PRODUCT_CODE_ALT4 SYSER_PRODCODE_SERVER_ODBC_PRO_LINUX // ..or a PRO server for Linux // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // for the opensource version, DLL plugins are always allowed // (even with licenses that do not have SYSER_PRODFLAG_SERVER_SDKAPI set) // because we do not use a license at all! #define DLL_PLUGINS_ALWAYS_ALLOWED 1 // Database support options // ======================== // - if defined, SQL support is included #define SQL_SUPPORT 1 #undef ODBCAPI_SUPPORT #define SQLITE_SUPPORT 1 // - if defined, ODBC DB mapping of arrays to aux tables is supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included #define SDK_SUPPORT 1 // - id defined, code allows calling of subsequent DLLs #define PLUGIN_DLL 1 // - define what SDK modules are linked in //#define DBAPI_DEMO 1 #define DBAPI_TEXT 1 //#define DBAPI_SILENT 1 //#define DBAPI_EXAMPLE 1 // SySync options // ============== // - no progress events (server engine code does not handle them at this time) #undef PROGRESS_EVENTS // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT 1 #define REGEX_SUPPORT 1 // - server does support target options #define SYSYNC_TARGET_OPTIONS 1 // - filters #define OBJECT_FILTERING 1 // - server does need superdatastores #define SUPERDATASTORES 1 // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "synthesis.ch/SySyncLib_srv" // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/sysytool_linux/0000755000373300037200000000000012424517753031322 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/sysytool_linux/define.h0000755000373300037200000000777612424517753032751 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: mac os x */ /* target OS: mac os x */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for MacOS X Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H //#define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif sysytool_linux_x86_prefix.h0000755000373300037200000000116212424517753036625 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/sysytool_linux/* prefix file * =========== * */ #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - precompilable headers #include "sysytool_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - SML toolkit including xpt part #include "smltk_precomp_xpt.h" #endif /* eof */ syncevolution-1.5/src/synthesis/src/Targets/ReleasedProducts/sysytool_linux/target_options.h0000755000373300037200000001146112424517753034542 0ustar00nightlyallusers00000000000000/* Target options * ============== * * */ // Most hyperglobal definitions, might even influence global_options.h: // - THIS IS THE DIAGNOSTIC TOOL #define SYSYNC_TOOL // - this is the LINUX version of the sysytool #define LINUX // now include global switches #include "global_options.h" // - is a standalone APP #define STANDALONE_APP 1 // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync SyncML Diagnostic Tool" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware // String used to construct logfile names #define TARGETID "sysytool" // general comments #define VERSION_COMMENTS "Internal Synthesis AG Version" // Eval limit options // ================== // - if defined, server will have a restriction on concurrent sessions // from different devices. #define VERSION_COMMENTS "Limited to 1 simultaneous sync sessions" // - if defined, software will stop working as demo after defined date #define EXPIRES_AFTER_DATE 1 // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // - variant #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO // - if defined, software can be registered #define SYSER_REGISTRATION 1 // - define allowed product codes (any server) #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_SERVER_PRO #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_SERVER_STD #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_SERVER_DEMO #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_SERVER_XML2GO #undef SYSER_PRODUCT_CODE_ALT4 // - define needed product flags #define SYSER_NEEDED_PRODUCT_FLAGS 0 // no ISAPI/APACHE flag needed for XPT #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // Database support options // ======================== // - if defined, SQL support is included #define SQL_SUPPORT 1 #define ODBCAPI_SUPPORT 1 #define SQLITE_SUPPORT 1 // - if defined, ODBC DB mapping of arrays to aux tables is supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included //#define SDK_SUPPORT 1 //#define PLUGIN_DLL 1 // - define what SDK modules are linked in //#define DBAPI_DEMO 1 #define DBAPI_TEXT 1 #define FILEOBJ_SUPPORT 1 #define ADAPTITEM_SUPPORT 1 #define JNI_SUPPORT 1 // SySync options // ============== // - if defined, debug code is included (not necessarily enabled, see gDebug) // if 1, only "public" debugging is enabled, if >1, all debugging is enabled #ifdef RELEASE_VERSION #define SYDEBUG 1 #else #define SYDEBUG 2 #endif #define CONSOLEINFO 1 // %%% include all profiling //#define TIME_PROFILING 1 //#define MEMORY_PROFILING 1 // - if defined, support for configurable types will be included #define CONFIGURABLE_TYPE_SUPPORT 1 // - if defined, object filtering will be included #define OBJECT_FILTERING 1 // - if defined, procedure interpreter features will be included #define SCRIPT_SUPPORT 1 // - if defined, superdatastores will be included #define SUPERDATASTORES 1 // - if defined, array field support will be included #define ARRAYFIELD_SUPPORT 1 // do not modify remote IDs in any way while processing them #define DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS 1 // ODBC options // ============ // No SEH around ODBC calls #define NO_AV_GUARDING 1 // if both text and ODBC maps are supported, mode can be switched // in config. #define USE_TEXTMAPS 1 #define USE_ODBCMAPS 1 // SyncML Toolkit options // ====================== // if defined, the entire complicated and thread-unsafe workspace manager // is completely bypassed #define NOWSM 1 /* correct tagging of payload with 1sec for lock, 2=log all lock enter/leave ops */ //#define __DEBUG_LOCKS 1 // we want the toolkit linked static #define __LINK_TOOLKIT_STATIC__ 1 // we want the XPT linked static #define LINK_TRANSPORT_STATICALLY 1 // - select transports #define INCLUDE_HTTP_STATICALLY //#define INCLUDE_OBEX_STATICALLY //#define INCLUDE_WSP_STATICALLY // Verbose XPT debug only if high debug level #if SYDEBUG>2 // switch on tracing for XPT #define TRACE 1 #define TRACE_TO_STDOUT 1 // use global localOutput() function // Debug options for OBEX (smlobex) // - define one or several of these //#define DEBUGALL // also hex-dumps all!! IrDA traffic #define DEBUGFLOW #define DEBUGINFO #define DEBUGERROR #endif syncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/0000755000373300037200000000000012424517753026146 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/clientengine_dbg++.pch0000755000373300037200000000242312424517753032254 0ustar00nightlyallusers00000000000000/* precompiled headers source file * =============================== * * CVS: * $Author: luz $ * $Date: 2007/09/05 14:03:05 $ * $Revision: 1.1 $ * $Source: /usr/local/cvsroot/sysync/Source/Targets/clientEngine_dbg/clientengine_dbg++.pch,v $ * $State: Exp $ * $Name: $ (Tag) * $Locker: $ (who has reserved checkout) * Log: * $Log: clientengine_dbg++.pch,v $ * Revision 1.1 2007/09/05 14:03:05 luz * client engine with custom datastores (SQL, ODBC, SQLite and PluginAPI) * * Revision 1.2 2007/04/25 11:59:30 luz * Moved platform specific includes to syncclient_outlook_precomp.h - it belongs there so that file can be used in MW precompiled header source files (.pch) as well as in prefix_file.h for VC++. * * Revision 1.1 2004/02/04 14:24:06 luz * 2.0.5.3 s2g/ONE client release (and Oracle release candidate) checkin * * */ // SySync is a C++ project, make sure precomp headers // are compiled as C++! #pragma cplusplus on // determine target file name #pragma precompile_target "clientengine_dbg_x86++.mch" // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "clientengine_custom_precomp.h" // eof syncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/clientengine_dbg.pch0000755000373300037200000000163312424517753032130 0ustar00nightlyallusers00000000000000/* precompiled headers source file * =============================== * * CVS: * $Author: luz $ * $Date: 2007/09/05 14:03:05 $ * $Revision: 1.1 $ * $Source: /usr/local/cvsroot/sysync/Source/Targets/clientEngine_dbg/clientengine_dbg.pch,v $ * $State: Exp $ * $Name: $ (Tag) * $Locker: $ (who has reserved checkout) * Log: * $Log: clientengine_dbg.pch,v $ * Revision 1.1 2007/09/05 14:03:05 luz * client engine with custom datastores (SQL, ODBC, SQLite and PluginAPI) * * */ // C-version for SyncML toolkit files #pragma cplusplus off // determine target file name #if __INTEL__ #pragma precompile_target "clientengine_dbg_x86.mch" #else #error "undefined target, cannot set precompiled header file name" #endif // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // eof syncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/clientengine_dbg_x86++.mch0000755000373300037200002006374412424517753032775 0ustar00nightlyallusers00000000000000Îúï¾#Ë$¶nˆG5ÆQ²ûfNX6 yP¿=ô.ð8@^1ØHGh«n‹ ¬n<µn hW4ð€ÐdH”ìx˜ÜLDlü\  t  ` l ä < X ð 0ÈhHdŒDÐ Ð,XðÈÌL¸ŒX xÄ8à< ¼ d!°!0"¼"T# #$¤$ü$<%@&Ð&˜'4(¸(@)4*ð*p+,|,L-Ð-D./Ì/<0l0à0°1 2€2ä2(3\3 4¬4à445È5p607€7 8è8Ð9<:è:Ä;4<¼<(=>´>?4?Ü?Ô@lAÈAðALBLCèCpE8F0G„GÀGÜGÌ>4?€?¼@A$B¼B CÈCÌ>ì>l?(@Ä@A\AüA BDCˆCøCPDDðD¼ELF,G\H(I´I¤J$KˆKäKHL\LèLM|MN¨N OLOØOPŒPQTQüQ`RôRXSäS,T´TLU0VÀVWdWÀWXX YTYàY„Z[œ[ô[œ\(]È]4^L^¼_X`¼` aLab,b„bøb¬c>œ?à?Ô@ AHAÐA?„?Ì?X@\A¤AôAœBCXCÜChDÔD€E8FÜF¨G°HIàI¤JDK¨K LLLÌLHM¼MTNOØOàPˆQäQ€RSˆSðSÈT,UˆU,VÄVWüWHXèX8YÔYZðZŒ[(\Ü\^ˆ^h_ð_d`adaÄaTbÐbPcd dhef„fØfdgøgXhüh8idi|iüijDjkHk´k lHmàm,nXn„no@o p¤päpHqàq rœrst´t u¼uäuÈv wdw(xðx¼yz0zœz@{œ{„|´}ˆ~ Xü¤€@˜‚€‚ƒÀƒ„p…†t†4‡؇0ˆ܈øˆt‰HŠ‹ü‹\Œp°\À ¨t‘Б’’““¤“”à”•ЕD–p–ð–”—˜À˜0™ ™ š¸š›4›„›è›Hœœœˆž4žœžôž,Ÿ\ŸxŸ4 ð ¸¡ô¡D¢´¢D£Ì£€¤¥„¥4¦¼¦Œ§l¨بÈ©ªLª««Ø«€¬ ¬@­¬­˜®4¯´¯d°À°ô°8±0²¼²l³À³l´ü´pµ(¶ ¶ä¶\· ¸l¸ì¸D¹Ô¹4ºغ4»Ä»d¼$½ؽ,¾h¾˜¾à¾L¿пHÀ¤ÀXÁ¸Ál¬Âü¨ÃÄ|ÄôÄ0Å„ÅÌÅ`ÆüÆDǴǘÈÉ”É4ʸÊôÊ,Ë,ÌdÌ¬Ì ÍÈÍÎXÎàÎ<Ï@ÐxÐ<ѰÑÒÔÒ€Ó4Ô<ÕèÕDÖ˜Ö@×”×(ØTبØÙÔÙLÚäÚ„ÛäÛ´Ü8ÝÈÝlÞŒÞ4ßà¬à`áèá<â@ãÈãäôäxåÀådæ4ç¨çPèàè„é é<êüêtëXì”ìäì\í¨íîœî´îtï@ð„ðDñ¸ñ,òóŒó¼óô<ô`ôõðõTö÷¨÷ødøù ù$úœú û0ü€üðüPýÌý¬þìþhÿØÿ€<¤à\hDPÀlÜÀü„  ¬ Ì P ¼  T ð ˜ 8ˆ<ðPœ¸àT,(|ô´4ÌðdllÜ\ÔPhìÄL \°(8äT „ Ì P!x!t"ø"¬#$Œ$L%¨% &°&@'ˆ'(¸(P) *˜*+”+Ü+,|,X-Ü-<.Ü.L/$0T0Ô01ì1À2ü2ˆ3ä3h4ð4|56L6œ67À7”89Ð9:Œ:d;ì;p<==<>\>¼>ð>l?@ä@lA B BlBàBpC D`DxDàDE˜E¸EDFÄF8GˆGHH4IJdJÐJÐK8L˜L\MdNNO`?À?h@Ì@´ABÜBØCLDÌDLEhFàFPG€G H°H´IJpJKK”K°KXL¤LM¤MxNÀNôN(O€OÜO@PQÔQ@R S|S4ThT`U”UhVW WÄW(XìX,Y|Y0Z[Ø[L\,]è]X^ø^À_h`€aÔabàb`c°c€düdxe”eÀef´fÌghdh$i¼iäi`jÈj,kàk$l¸lm˜m n`nToäo@pðp¸q$rlrørsÈsÔtˆu,vÈvœwxyŒyðy€z{T{|||}D}h~Ì~Ô€¨€ Ü´‚Dƒ܃L„Ü„ …d†ä†ˆxˆ‰Š\ŠŠØŠ„‹0Œ¸ŒHÄHŽÀŽ\À¼œ‘<’œ’“ˆ“”„”ˆ•Ø•d–ð–À—€˜ȘX™À™„šÀš4›¸›4œ¸œÐ0žäždŸàŸ 4 à „¡d¢(£P¤à¤L¥L¦À¦\§t¨©¼©ªàª(«¼«4¬ ¬ü¬­L­¼­®l®ø®\¯ü¯̰±P±œ±²”²$³ ´µ\¶œ¶ø¶8·€·¨·T¹ ¹ ºàº`»è»˜¼̼0½p½ì½D¾ľ@¿ÀHÀÀHÁÌÁ´Â8Ã|ÃØÃ ÄPÄ(Å´ÅàÅ8ÆôƈÇxÈÌȈÉôÉtÊ`ËÐËÌ|Ì¤ÌøÌ<ÍÈÍ(ÎlÎ`Ï,МÐ,Ñ„ÑHÒpÒ¸ÒÜÒLÓ°ÓtÔèÔPÕøÕÄÖנ׸נØ|ÙÈÙ8ÚÛÐÛPÜ$ÝœÝèÝ„Þ(ߌßà4áâ´âôâ¼ãXäåÌå,æDæÜæˆçÄçÄè éLéŒé<êë(ë4ì¬ì`íî`îÄî˜ïPðxðìð(ñ¼ñŒòÄò0ó¨óäó¸ôõüõ¸öØöè÷DøÐølù ùTúÐú(ûàûdüàüTýÜýþœþ@ÿxÿ¸ÿPøh 8 ¬Lütäpü ´€à@ ¬ ( Ü \ ´  X P ä Œ Ð\´ €”ÈLÌ$|ØP0ØDœ´Èh¸ü˜PH˜ä€Ìì4ìdhÈØ t!ð!4""À"#€#H$ô$%È%@&„&p'´'@()Ð)*<+,|,¼, -°-D.¤.L/|/ô/Ä0(1à1h2P3„3Ä34l4¤45(6ä6h7¸7l8„8°8\9”9:´:è:„;Ì;,<¬<L= =>L>Œ?œ@à@AXApAäAPB¨BtChD¸D@E E\FØF|G°GHH¸HIJ\J¸J˜KPLÄL€MpN¸N0OpO´O0PQ¨Q,R”RôR8S¼SUœU|V8WÈW XˆXÌX YhY8Z¨Z4[°[Ä\]ì]^<_(`a$a¤ab´b`c$ddde eDfàfHgÈgÜ>8?¼?˜@A”A”BLC`CèC@DèD4EÔE,F¤FG`G ð> °? 0@ ¬@ ,A ÈA dB ÐB $C èC \D ÌD ðD ¸E œF ”G üG ÈH hI ¼I ŒJ $K äK ¼L lM (N ÜN O  O øO ÈP üP tQ äQ R ¤R ¨S (T ÜT XU ÀU V ÌV W W ØW üW „X @Y ˜Y äY ,Z °Z ˆ[ \ Ü\ Œ] ü] Ð^ `_ ì_ P` ”` °` \a Xb c hc èc \d €d àd le 0? ô? |@ PA pA B ÔB HC hC ”C D xD dE ÈE èE dF 8G ¼G ¨H üH I äI ”J èJ tK àK œL 8M ˜M $N øN ¨O xP üP dQ ìQ R S ÜS $T T @U 8V lV ´V °W @X ¼X |> (? |? ä? 0@ ø@ DA ÀA @B XB ˆC D E ˜E àE ôE xF ø> Ì? L@ œ@ Ø@ ¸A @B ÈB TC ÀC `D ¤D DE ÜE °F `G ¬G H tH I ÈI ¤J xK üK HL ðL M  M tN ÐN O ÀO

? ¸? Ø? d@ TA B ¨B `C ôC œD lE F |F hG 0H DH øH I I ôI @J \J èJ ØK l?¸@dAÐA„BøBDDÐDEðEDFGtG4HÄH¤IPJÀJ,KàK¤LäLDMìMˆNüNTOPÔPÌQhR¨RŒST4TdTUV´VWôW,YxY YÔY¬ZüZ[¬[È[\`\Ì\0]¨]<^è^ü^”_Ü_„`è`ha¼aäa,b|b4cØcxdød„eøeœf°güg´hixiÐiXjtjÌjXk@l¤lm4mðm”npo´o¼pHqèqtrÐrœsØsøt°uôutv¤vôvwtwìwŒxÐxy”y0z¬zðz,{{è{@|¸|,}T}¼}x~8`€À€(ˆü¤‚4ƒ„|„…p…0†x†8‡h‡0ˆ¬ˆĈd‰ð‰4ŠðŠL‹Ø‹,ŒDŒdŒìŒP̨ŽüŽ‘À‘¬’“p“Ì“ ”””•¬•H–<—˜¬˜@™„™ü™š”š››Lœ0ž¸žÔžDŸèŸp Ô €¡4¢¸¢¨£\¤¼¤¥¦|¦§h§̧X¨¨°©ª«L«Ì«h¬¨¬T­ð­x®® ¯è¯t°$±|±Œ²³p³´L´дtµ¬µH¶„·з¤¸ô¸H¹¹ º º» ¼è¼L½¸½|¾<¿|À€Á(ÂÌÂXÄÄ<ÅÌŘÆÇøÇÈÈüÈÉÊ ÊÔÊDˠ˰Ë$ÌØÌlÍ,ÎÐÎHÏhψÏÐÐÜÐPÑ Ò|Ò ÒÜÒÓ Ô0Ô ÔÕ˜ÕàՌִÖ(×ÜפØ,ÙôÙXÚÛpÛ`ÜDÝÐÝ„ÞÐވߠßðßlàáâ”âÀãHäÌäå˜åæPæçtçè¬èéŒé(ê¼êëxë,ìí”íäí(îdîÔî@ï8ðñ¬ñ<òÐòHóäó@ôÀôõ`õ8öˆöäöp÷høÌø€ù°ù0úàúû°ûüDüàüˆýDþ¨þÿ ˜`@¼°øDÄP䄸 L € 4 \ È ( „  ¼ œðtLx¼€Pä,´à4¬| @¤ðìdÀpäx¤\x4 l Ì Œ!Ì!"#(#@$Ì$t%ø%è&Ð'¤()ˆ)`*œ*t+¬+H,T- -T.Ø.œ/0 0¸01\1Ð1l2¨2 3¬384¨4 5€5ä5(6x6œ6¬6\7ü7P8,9::Ì:0;0<€<= =>Œ>à>€?ð?@@€@Ð@,A`BCÄCLDôD8EôEFlF GôGlHI˜IJK€K¸KLLL”LMÌMxNÜN¼O\P´PäP QxQèQRÀR S˜SÜSôS`TèT¤UàU\VÔV|W´WˆX XYÐY|Z„[Ô[<\Ä\ø]P^_,_Œ_`8`4a¤aüa”b°>?<@ AlA´AB¸BìBDC,><>\>Œ>œ>¼> ?,?<>L>\>Œ>¼>Ì>ì> ?,?0>P>p>°>À>?P?p?? ?Ð?à?ð?@@P@€@°@ð@A APApA€A AôA$B4BtB„B¤BäB4C”CÄCÔCäCDD”DÔDôDEDETEtE¨EØEøE(FHFXFxF¨FØFøFXGxGˆG¨GÈGèGHH(HHHXH¨H¸HÈHøHI8IHIhI˜IÀIÐIJJ J@JPJtJ”J´JÄJÔJ$K4KdK¤KÔKôK$LTLdL„L”L´LôLTMtM”MÔMäMN$NDNtN”NÄNÔNOO$O4OdOtO”O´OôO$PTPdPÔPQTQdQtQ”Q¤Q´QÔQR$RTR„R”R¤RäRS4STS„S”S¤SÄST$>4>T>t>”>Ä>ä>?T?d?”?ô?@4@D@T@„@”@´@ä@AADAdAtA¤AÄAäAôABTBdB”B¤B´BC4CDCdC”C¤CÄCôCD4DTD”D¤DÄDäDôD4ETE„EÄEÔEäEFDFTFdF”F´FÔFäFG$G4GdGtG¸GØGH(HxH˜H¸HÈHðH I0I@I`I€I°IàIJ`JpJJðJ K@KPK€K°KÐK0L`LpLLÐLðLM@M€MM°MÀMÐMäMNTNtN„N´NÔNôN$O4OtO”O¤OÄOôOPPDPdP„P¤P´PÔPQ4QdQ¤QÄQôQR4RTRtR„R´RäRS$STS„SäST$ThT¸TÈTèTU8UxUˆU¨UèUV8VHVxV¬VÌVðV0W@WpW€WW WàWðWTX”XÄXÔXäXYY4YDYTYtY„Y¤YÄYôY$ZDZ”ZÄZÔZôZ[T[„[¤[Ä[ä[ô[\4\T\t\¤\Ä\ô\$]4]D]t]„]¤]´]Ô]ä]^$^D^t^„^¤^_D_d_”_ä_`4`T`d`”`aaTada„a”a´aôa$bDb„b´bÔbc$c¤cÔcdDdTd„dÄd$eTete„e¤eÔeôef4fhf¨fÈføfLgœgÌgügh,h`„H`XN`üd`èk`dp`fÔFfØKfPPfPRfVf\f _fXeftnfÔsfˆzfè}f ƒf$…fdˆf„fä–f0f@¤f@®fà²fŒ¶f»fH¿f8ÃfDÇfäÌf`Òf`Öf,ÛfÔàfÈäf@æfôîfÜòfÜ÷f(úfÈg(g|gìgdg0g\$gà)gø.gì2g„7gà;gPDgtKgQgäXgd_gbgXhgngˆrghug}g(gØ„gl‹g‘gÜ—gè™gÈžgT£gŒ¤gø©g¯gl°gL´g4»gèÀg8ÊgèÍgtÔgŒØgÜgßgHægTîgóg4üghp h´hh h¼!h¼*h$.hœ6h¬:h @h„Ch(Eh HhÀMhäTh^h(bh`ehInputIterator2ãð å>LANG_ESTONIAN!å>SPAPI_E_KEY_DOES_NOT_EXISTã4!å>GetPaletteEntriesP!å>IBM_Magstar_3590é >Continueá€!å?MKF_MOUSEKEYSONâ”!å?IOC_INë?CMSG_CTRL_ADD_CRLÀ!å @@6838Ü!å@HANGEUL_CHARSETâø!å@EMRPOLYBEZIERTO16"å@tagMCI_OPEN_PARMSWë @SQL_NUMERICâ<"åAaL"å A@6839d"å AEnumPropsAã€"åAVFT2_DRV_DISPLAYáœ"åAmciGetDeviceIDWêACLSID_PSInPlaceActiveÈ"åBbÜ"å BKillTimerô"å BIChannelHooká#åBGetFuncCustDataâ4#åBEnumDependentServicesWëBSQL_CP_STRICT_MATCHâ`#åCcx#å CGetDCOrgExã#åCLPJOB_INFO_1WèCcacâ¸#å DFLT_EPSILONâÄ#åDdè#åDERROR_INVALID_DWP_HANDLEé DDNS_ERROR_RECORD_ALREADY_EXISTSâ $åEe4$åEwcsncmpâP$åEWM_NOTIFYFORMATâh$å E_JOB_INFO_2Wá|$åEVarAddëESQL_ATTR_CURSOR_SENSITIVITYâ¸$åFwcsrevãÄ$åFfà$åFVirtualQueryExëFTIMEFMT_ENUMPROCW%åGtm_mdayâ%åGgèG_CERT_CHAIN_ELEMENTâL%å H@6830X%åHht%åHCreateWindowExAâ¸%å9HIOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxyáä%åHIXMLDocument2_get_dtdURL_Proxyãô%åHcahâ&åHSQL_DESC_CASE_SENSITIVEêHSQL_EXPRESSIONS_IN_ORDERBYãP&å I@6831\&åIit&å ILANG_RUSSIANáœ&åIIXMLElement_get_type_Proxyã¬&åIcaiêIPIDMSI_STATUS_INPROGRESSáð&åJDEFAULT_EMAILS_MAXKBá'å Jstrncollá'å J@6832 'åJj8'å JlcsEndpointsáT'åJDMPAPER_A_PLUSãh'å JWidenPathˆ'åJPCERT_TRUST_STATUSë JlVerb¨'å K@6833´'åKkÌ'åKpfnUnmarshallä'å KPJOB_INFO_1Aáø'å KpuintValá(å Kday_secondëKSQL_OSCC_NOT_COMPLIANTãD(å L@6834P(åLlp(åLIMAGE_REL_BASED_HIGHá”(åLTAPE_ABSOLUTE_POSITIONã¨(åLTIME_MSêLcalâÄ(åMmÔ(å M@6835ð(åMCBN_SELENDCANCELá)åMtagMCI_OVLY_OPEN_PARMSAâ,)å MPF_VOICEVIEWé M_CPS_URLSL)åNn\)å N@6836|)åNFILE_WRITE_ATTRIBUTES¤)åN_IMAGE_SEPARATE_DEBUG_HEADERáÀ)åNVER_PRODUCT_TYPEáÔ)å NDebugInfoø)åNDRAGDROP_E_NOTREGISTEREDá*å NcaBlueGammaêNMCI_ANIM_OPEN_NOSTATICãD*å O@6837`*åOnext_permutationál*åOo„*å OWM_KEYLASTã´*å$OIRpcChannelBuffer_IsConnected_ProxyâÔ*åOSafeArrayPutElementêOOFN_SHARENOWARNâü*åPp +åPcapâ(+åPTIMEFMT_ENUMPROCA@+åPMCI_ANIM_RECTT+å PFARSTRUCTèPdwModemModelSizeáŒ+åQTCI_SRCCHARSETã¤+åQSetBoundsRectÈ+åQPERF_COUNTER_DEFINITIONâÔ+åQqè+å Qclipdataé Qcaclipdataã ,åRr0,åR_TOKEN_INFORMATION_CLASSáD,å RbVersioná`,åRDIALOPTION_QUIETéRSQL_ATTR_MAX_ROWSˆ,åSs¨,åSOF_SHARE_DENY_NONEãÈ,åSERROR_BAD_USERNAMEãä,åSCTRY_SOUTH_AFRICAø,å SMMVERSION -åSRpcServerInqDefaultPrincNameá8-å S_JOB_INFO_2Aé SSC_HANDLEX-åTth-å TCLSIDˆ-åTMMIOERR_CANNOTCLOSEâ¬-åTMS_DEF_DH_SCHANNEL_PROVêTEnumDependentServicesAãä-åUisspaceâð-åUu.å UWNNC_NET_DCEá,.åUCHANGER_EXCHANGE_MEDIAëULPJOB_INFO_1AP.åVvp.åVtagMCI_OPEN_PARMSAã„.åVbuflenã .åVpPrintProcessorâÌ.å VITypeInfo_ReleaseFuncDesc_Proxyâð.åVCLSID_InternetZoneManagerèVSQL_SR_DELETE_TABLEâ/åWw4/å WEnumPropsWãT/åWHKEY_PERFORMANCE_DATAp/åWmciGetDeviceIDAâ”/åWCertRegisterPhysicalStore¨/åWFR_DOWNêWIMC_GETCOMPOSITIONFONTãØ/åXxð/å XPROFILE_USERá0å XDLGC_BUTTONâ 0åXSO_DISCOPTLENèXtagRemSTGMEDIUMâH0åYyèYERROR_REPARSE_TAG_INVALIDx0åZzœ0åZ_CRYPT_RC2_CBC_PARAMETERS°0å ZcVersioné#ZIBindCtx_RemoteSetBindOptions_Stubãü0å[GMEM_DISCARDABLEá$1å[FindCloseChangeNotificationâL1åYPE_E_DLLFUNCTIONNOTFOUNDãp1å[tagMCI_OVLY_OPEN_PARMSWâ„1å [wLibFlagsè [IXMLDOMEntity_get_systemId_StubâÌ1å\PENHMETAHEADERãè1å\SS_ENHMETAFILEë\CMSG_SIGNER_CERT_ID_PARAM 2å]fstreamâ82å ]is_pointerãh2å$]ERROR_CLUSTER_SYSTEM_CONFIG_CHANGEDê ]PJOB_INFO_1Wáœ2å^CreateWindowExWâÀ2å^MCI_GETDEVCAPS_CAN_PLAYê^SERVICE_STATUS_PROCESSã3å _AsyncIPipeLong_Finish_Push_Stubê _IPropertyBagá@3å `FillMemoryë`TF_REUSE_SOCKETâl3å a@6829x3åaA 3åaIMAGE_SYM_CLASS_FAR_EXTERNALá¼3åaTYPE_E_SIZETOOBIGè3å a__IRpcProxyBuffer_FWD_DEFINED__â4åaHACCEL_UserMarshalë aSQL_NC_LOWã@4åbERROR_CREATE_FAILEDâT4å bLR_SHAREDl4å bREGISTERINGâ4åbPRINTER_STATUS_OFFLINEëb??_7IMarshal@@6B@À4å c_PRSHT_H_ècDeletePrinterDriverâ 5å dERROR_ITERATED_DATA_EXCEEDS_64kê!dIXTLRuntime_formatIndex_ProxyP5åeCreateProcessAãp5åeSEC_E_CERT_UNKNOWNã5åe??_7IEnumSTATSTG@@6B@¬5åeBegin_OnRenameëeSQL_ATTR_NOSCANâÜ5å fPlaySound6å!fCERT_STORE_SAVE_TO_FILENAME_W(6åf??_7IFillLockBytes@@6B@âP6åfIOleCacheControl_OnStop_ProxyèfIOInetThreadSwitchã€6å h@6820˜6å hLANG_SERBIANá°6å hTokenGroupsâÌ6åhIMAGE_ROM_HEADERSè6åhWriteFileGatherâ7åhMETA_SETMAPPERFLAGSêhCMSG_SIGNER_INFO_CMS_VERSIONá@7å i@6821L7åiI`7å iPDWORD32éiGRADIENT_FILL_RECT_Vá7å j@6822´7åjERROR_INVALID_CATEGORYãÐ7åjtagMIDIOUTCAPSAâø7åjIDataAdviseHolder_Advise_StubèjIME_ESC_SET_EUDC_DICTIONARYâ48åk_wcssetâD8å k@6823d8åkERROR_DS_DS_REQUIREDáx8å kWM_ENABLE8å kHELPWININFOâ°8åkVP_FLAGS_TV_STANDARDáÈ8å kPARSE_DOMAINékMDM_AUTO_ML_DEFAULTâø8å l@68249ålWSAEINPROGRESSã<9ålTRUST_E_SUBJECT_FORM_UNKNOWNá`9ålIXMLDocument_put_URL_StubŒ9å%lIXMLElement_removeAttribute_Proxy¸9ålINET_E_AUTHENTICATION_REQUIREDëlPSD_NOWARNINGô9åmERROR_UNSUPPORTED_TYPEã :åmSetICMProfile,:åmEMRSETARCDIRECTIONë mifaceH:ånNp:å!nERROR_INVALID_KEYBOARD_HANDLE”:ånRPC_S_INVALID_STRING_UUID´:ånERROR_DS_CLIENT_LOOPáÌ:ånDM_BITSPERPELèntagEMRANGLEARCãø:åoptr_á;åoANONYMOUS_LOGON_LUIDá8;åoIMAGE_REL_BASED_DIR64X;åoSECURITY_SQOS_PRESENTl;å oFW_BLACKáˆ;åoClientToScreenã ;å oPSU_DEFAULTêoSQL_DTC_ENLIST_EXPENSIVEáÐ;åpPä;å pNPPATTERN <åpCRL_REASON_SUPERSEDED_FLAGë!pCERT_STORE_SAVE_TO_FILENAME_AD<åqltoaáh<åqERROR_NOT_ENOUGH_MEMORYâŒ<åqBSM_INSTALLABLEDRIVERSã˜<åqQ¬<åqppdataë qDelayÔ<å rLPCOMMPROPãø<årERROR_TOO_MANY_SEMAPHORES=å rlStructSizeêrHC_SYSMODALON4=åsSL=å sZeroMemoryãh=åsCreateProcessWã€=åsHCBT_MOVESIZEœ=åsPCRYPT_DER_BLOBâ¸=åsPROXY_CALCSIZEãÔ=åsIID_AsyncIUnknowná>åsIErrorInfo_GetHelpContext_StubësSQL_RESET_PARAMSá(>åtT8>å tclsidp>å+tAsyncIAdviseSink_Begin_RemoteOnRename_Stubã”>åtPD_ENABLESETUPTEMPLATEëtSQL_DESC_CATALOG_NAMEÀ>åuUØ>å uQS_ALLINPUTâô>åudwBytesRecordedêuPUBLICKEYSTRUCã?åvVè vRPC_MGR_EPVâP?åwGenericExecuteãl?åwSetAclInformationŒ?åwGRADIENT_FILL_RECT_Há¨?åwSPI_GETFILTERKEYSÄ?åwOFN_ENABLESIZINGéwGL_ID_UNKNOWNè?åxX@åxSECURITY_DESCRIPTOR_RELATIVEá0@åxCRYPT_E_ASN1_BADTAGâP@åxGetCharacterPlacementp@åxWS_OVERLAPPEDWINDOWâŒ@åxSPLDS_PRINT_COLORœ@åxPushá°@å xVAR_CONSTèxSystemTimeToVariantTimeâà@åyYô@å ynew_valueAåyERROR_CANT_DISABLE_MANDATORYá4Aå yTRANSPARENTâHAåyEMR_ARCêyLPMCI_ANIM_WINDOW_PARMSâ€Aå zLLONG_MAX°Aå#zPRINTER_NOTIFY_FIELD_BYTES_PRINTEDë zIID_IStorageé!{IXMLDOMNode_get_dataType_StubBå|LOCALE_SMONTHNAME12â,Bå|tagMIDIOUTCAPSWê|SQL_SG_DELETE_TABLEâhBå}SourceIdentifieráŒBå}GetThreadPriorityBoostã°Bå}DNS_ERROR_NO_ZONE_INFOãÈBå }PEXTLOGFONTâèBå}LOCALE_SMONTHNAME13âCå}WN_BAD_PASSWORDâ0Cå }MIXERCONTROL_CONTROLTYPE_CUSTOMê}pfnStreamOutputâ\Cå ~lldivxCå~__copy_backwardâœCå~_IMAGE_DEBUG_DIRECTORYã°Cå ~HINSTANCEÈCå ~MF_UNCHECKEDé~LOCALE_SMONTHNAME10âDåDESKTOP_CLIENTã DåOBJECT_FILTERINGá4Dåright_ã\DåRPC_X_BYTE_COUNT_TOO_SMALLã|DåCLIENTSITE_E_FIRSTãŒDåelfwá¬DåLOCALE_SMONTHNAME11âÈDåSEARCH_ALL_NO_SEQìDå__IPersist_FWD_DEFINED__á Eå)IXMLDOMCharacterData_substringData_ProxyáDEåIMC_SETCOMPOSITIONFONTë SQL_MAXIMUM_CATALOG_NAME_LENGTHâEå€SYSYNC_VERSION_MAJORá°Eå€__unavailable_fileãÀEå €@6858àEå€OLE_E_CANT_GETMONIKERøEå €EMRWIDENPATHáFå€PCRYPT_BIT_BLOBê€IPersistMoniker_Load_StubHFå @6859dFåTRUETYPE_FONTTYPE|FåANSI_VAR_FONTFå MCI_STOPá¸FåMCI_VD_GETDEVCAPS_SLOW_RATEâàFå__XMLDocument_FWD_DEFINED__â Gå BINDSTATUS_FILTERREPORTMIMETYPEêNI_SETCANDIDATE_PAGESTARTDGå ‚WM_TIMERádGå‚_TAPE_GET_STATISTICSé‚SCardIsValidContextâ Gå„SW_SCROLLCHILDRENè„SQLInstallDriverExWê…NTE_BAD_PROV_TYPEüGå†IMAGE_REL_PPC_BRTAKENHå†WS_EX_DLGMODALFRAMEê†SESSION_ESTABLISHEDâLHå ‡@7047pHå‡SCARD_PROTOCOL_DEFAULTë‡SQL_RETRIEVE_DATA¤Hå ˆCharsWrittená´Hå ˆ@6850ÄHå ˆ@7048ÜHåˆHashAlgorithmIå"ˆCERT_STORE_CTRL_COMMIT_FORCE_FLAGèˆImmUnregisterWordAã8Iå ‰@6851HIå ‰@7049dIå‰CreateSemaphoreWáxIå‰SetMenuâIå‰EnumFormatEtcè‰IDataFilter_DoEncode_StubÄIå Š@6852àIåŠMAX_ACL_REVISIONáJå!ŠERROR_INVALID_SHOWWIN_COMMAND$JåŠDMPAPER_A4_EXTRAáexception°ªå >RIP_INFOá̪å>GetLogColorSpaceWäªå >SW_MAXIMIZEâ«å>CERT_CHAIN_FIND_BY_ISSUERè >UIDeactivateáH«å?RPC_X_PIPE_DISCIPLINE_ERRORât«å%?ERROR_CLUSTER_NETINTERFACE_EXISTS”«å?PAGESETUPDLGORDMOTIFá°«å?waveOutGetPitchâÌ«å?TIMERR_NOERRORãô«å???_7IXMLDOMDocumentType@@6B@á¬å?MDM_SHIFT_X75_DATAë?SQL_CONVERT_VARBINARYL¬å@value_contextl¬å@IID_IXMLDOMCommentë@LPSERVICE_DESCRIPTIONWã°¬åAIMAGE_REL_BASED_REL32ЬåAERROR_UNKNOWN_PRODUCTð¬åACAT_E_NODESCRIPTIONâ­å APS_JOIN_MASKá­åALineDDAâL­å)ACMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARAp­åASPLDS_BYTES_PER_MINUTEëAMKSYS_OBJREFMONIKERâ°­åBshort_array_from_ndré&BIInternetProtocol_UnlockRequest_Proxyá®åCINPLACE_E_NOTOOLSPACEèCHDBCá ®åD_W64áP®å)D_JOBOBJECT_SECURITY_LIMIT_INFORMATION`®åDId〮åDNTE_PROVIDER_DLL_FAIL”®å DUuidIsNil¤®åDmemidèDget_resolveExternalsáØ®åEmyTypeãè®å Edelim¯åEWS_EX_TOOLWINDOWé,EIXMLDOMDocument_createDocumentFragment_StubâL¯åFIfãt¯åF_ACCESS_ALLOWED_OBJECT_ACE㌯å FQUERYCONTEXTá°¯åFURLACTION_HTML_JAVA_RUNêFSQL_INITIALLY_DEFERREDãô¯åI_STDCALL_SUPPORTEDã°åIremove_volatileâ<°åIERROR_DS_OBJECT_CLASS_REQUIREDãT°åIRC_STRETCHBLTp°åILOCALE_ITLZERO㜰å!IIOleObject_GetClipboardData_Stubé$IITypeInfo_GetRefTypeOfImplType_Stubâè°åJMAXIMUM_ALLOWEDã±å JGetTopWindowá±å JSBS_SIZEGRIPá4±åJWAVE_FORMAT_2S08áH±å JcChannelsè JAF_CHAOSáx±åKRPC_AUTHZ_HANDLEá”±åKDRIVER_INFO_5Wë KDiscardCacheáÀ±å LLC_MARKERÔ±å LGCW_ATOMáð±åLIMalloc_Free_Stub²åLIDispatch_RemoteInvoke_ProxyéLremoveAttributeâD²åMEDOMál²åMSCARD_W_SECURITY_VIOLATION㔲åMCOMADMIN_E_COMP_MOVE_LOCKEDêMget_urlâIJåNunary_functionãà²åNBACKUP_OBJECT_IDé%NSORTED_CTL_EXT_HASH_BUCKET_OFFSET$³åOLPCHARSETINFO<³å OPMIXERCAPSãP³åOsendtoãt³åOSERIAL_LSRMST_LSR_DATAë'OIXMLElementCollection_get_length_Proxyã¼³åQwcsnsetâð³å(Q_JOBOBJECT_BASIC_ACCOUNTING_INFORMATIONâ´å QPCHARSETINFOá´å QRT_STRING0´åQbExtraãP´åQszOID_OIWSEC_mdc2RSAát´åQCreatePropertySheetPageâ”´åQJOB_STATUS_PAPEROUTê QvtReturnáÄ´åRCriticalSectionâä´åRDdeImpersonateClientéR??_7ISynchronizeHandle@@6B@â0µåSACCESS_DENIED_ACE_TYPEë!SITypeLib_ReleaseTLibAttr_StubxµåTIMAGE_REL_IA64_SREL32Œµå TEV_EVENT2¤µå TBS_HATCHEDã´µåTcditéTLeftáܵå UEM_SETMODIFYáøµåUPID_MAX_READONLYéUID_DEFAULTINSTã(¶å Vis_iec559P¶åVSUBLANG_ARABIC_SAUDI_ARABIAêVLPSERVICE_DESCRIPTIONA㈶å Wshift_in᜶å WEV_EVENT1´¶å WGetColorSetê WSQL_IS_DAYãä¶å XDefHookProcê XnBaseShiftã·åYPEVENTSFORLOGFILE<·åYPERF_COUNTER_BULK_COUNTâd·åYPCMSG_KEY_TRANS_ENCRYPT_INFOá„·åYPSNRET_MESSAGEHANDLED¨·åY__IUnknown_FWD_DEFINED__éYIStream_CopyTo_Proxyáè·åZDCX_LOCKWINDOWUPDATEéZSQL_CONVERT_LONGVARBINARY ¸å [SM_CYEDGEè%[IXMLElement2_get_attributes_Proxyd¸å \waveInGetIDâ|¸å \dwDataOffseté\NdrRpcSmSetClientToOsfãÀ¸å]tagEMRSELECTOBJECTãè¸å]MIXERCONTROL_CT_CLASS_LISTãü¸å]ncb_rtoê]DRIVER_INFO_5Aã(¹å^sinâ@¹å ^e32_fpagetabáX¹å^_COMMTIMEOUTS|¹å^REMOTE_NAME_INFO_LEVELë^VariantCopyIndë_GetMetaFileBitsExȹå`WINAPIãä¹å`REG_REFRESH_HIVEáø¹å `HeapWalkáºå `EMRANGLEARCâ4ºå`CertFindCertificateInCRLáTºå`VERIFY_INFORMATIONãhºå`Extentsê `apDispatchëaLPOPENFILENAMEW⼺åbPointerToLinenumbersáÔºå bNPCWPSTRUCTâøºåbLOCALE_IPOSSYMPRECEDESã »åbszOID_KP_TIME_STAMP_SIGNINGê bV_ERRORREFã\»åcTAPE_SELECT_PARTITIONSãx»åcCTRY_SAUDI_ARABIA »åcMCI_WAVE_SET_BITSPERSAMPLEãØ»å-cCERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAGáè»åcDST_Sè/cIInternetZoneManager_GetZoneActionPolicy_Proxyã\¼å,dJOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTIONâp¼å dSpinCount”¼ådTRUST_E_BASIC_CONSTRAINTS°¼ådWAVE_FORMAT_2S16édDISK_GEOMETRYܼå eGUID_NULLð¼åeLOWORDã½å eHeapUnlockã,½åeERROR_WINDOW_NOT_COMBOBOXD½åeSS_WHITEFRAMEèeSCardForgetCardTypeâ|½åfthread_handleŒ½åfnlenᨽåf_HRESULT_DEFINEDáؽå$fCOMADMIN_E_CAN_NOT_EXPORT_APP_PROXYâð½åfLPKERNINGPAIR¾å fIContinueè fNODE_COMMENTá0¾å grgbGreenáD¾å gHORZSIZEáX¾å gGetPixeláp¾å gNRC_NAMTFULêgcDigᘾå hHINSTANCE__â°¾å hSTARTUPINFOâоåhMOUSEEVENTF_LEFTDOWNáø¾å!hCMSG_KEY_AGREE_RECIPIENT_INFO$¿å"hIMarshal_ReleaseMarshalData_ProxyèhMDM_PROTOCOLID_V110âp¿å iERROR_DEPENDENCY_ALREADY_EXISTS‿åiHi㬿åiIXMLElement2_put_tagName_ProxyëiCloseServiceHandleãì¿åjGetSystemPowerStatusáÀåjcAccumRedBits$ÀåjChangeDisplaySettingsLÀåjMIXERCONTROL_CT_CLASS_MASKëjCMSG_ENCODING_TYPE_MASKâˆÀå k_P_NOWAIT0ã¬ÀåkGetNamedPipeHandleStateWékDRIVER_INFO_4WãÜÀå lLLONG_MINèl__IStorage_FWD_DEFINED__áÁå mdwFileTypeëm_CERT_SIGNED_CONTENT_INFOLÁånINãdÁånEffectiveOnly€ÁånEMRPOLYPOLYGON16á˜Áå nShellAboutWâ¼ÁånCERT_COMPARE_NAME_STR_AâØÁånLPCPROPSHEETPAGEAènIEnumMoniker_Reset_Proxyá$Âå!oCriticalSectionDefaultTimeout<Âå ohWindowMenuâ\ÂåoCERT_RDN_TYPE_MASKã€ÂåodwMsgAndCertEncodingTypeéoODBC_CONFIG_DRIVER_MAXëpRpcNsBindingLookupNextãìÂåqERROR_DS_ALIAS_PROBLEMãÃåqGETDEVICEUNITSãÃåqdwLoopsâ@ÃåqCERT_QUERY_FORMAT_BINARYé#qITypeInfo2_GetAllVarCustData_ProxyãÃårSEF_SACL_AUTO_INHERIT¸ÃårIXTLRuntime_childNumber_StubérdwInactivityTimeoutêsV_I2REFâüÃåtSidâÄåtIMAGE_REL_IA64_SREL22<ÄåtERROR_NO_SYSTEM_MENUá\ÄåtNdrUserMarshalFreeë tdwHandleTypeá”ÄåuPointerToSymbolTableá¨ÄåulHeightâ¼ÄåurclClipâÔÄåuJOY_RETURNPOVüÄåuSQL_FN_STR_CHARACTER_LENGTHêuwinnt.hâ,Ååvint_frac_digitsâTÅåvCERT_STORE_PROV_READ_CTL_FUNCè1vCERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG°ÅåwSERVICE_RECOGNIZER_DRIVERÄÅå wWSAEINTRéwLPOPENFILENAMEAâôÅå xdmDuplexá ÆåxDMDITHER_FINE$Æå xShellAboutAâHÆåxCERT_COMPARE_NAME_STR_WâdÆåxLPCPROPSHEETPAGEWèxSQL_FUNC_EXISTSâ¤ÆåySYSYNC_VERSION_MINOR_TXTáÄÆåy_ACCESS_ALLOWED_ACEâàÆåySS_ENDELLIPSISãôÆå ypIBindCtxÇåyVarImpëySQL_ATTR_IMP_PARAM_DESCâ@Çå zhStdInputXÇåzDMPAPER_15X11|ÇåzDMDISPLAYFLAGS_TEXTMODEâ˜ÇåzCreateColorSpaceézPCANDIDATEFORMãÔÇå{NdrServerInitializeê{SQL_PARAM_BIND_BY_COLUMNá Èå |Signature(Èå|FS_CASE_SENSITIVEPÈå|ERROR_BAD_DESCRIPTOR_FORMATâ`Èå|DST_Lè|ISequentialStream_Read_Stubâ¸Èå#}IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARYãÜÈå}GetNamedPipeHandleStateAáìÈå }DST_MÉå}DRIVER_INFO_4Aã,Éå}IPropertyBag_Write_ProxyáDÉå }get_nodeNameáhÉå}OleCreateLinkFromDataExê}SQL_OJ_NESTED¨Éå~GetSecurityDescriptorGroupãÀÉå~RpcEndFinallyè~FADF_DISPATCHìÉå int2typeáÊå lWidthOffsetáÊå mixerMessageá<Êå_CERT_REVOCATION_PARAèMO_5_RWâpÊå€PEMRSTROKEANDFILLPATHˆÊå €tagVARFLAGSâ°Êå€URLPOLICY_ACTIVEX_CHECK_LISTé€MDM_PROTOCOLID_X75ãðÊåPEXCEPTION_RECORD64âËåVER_SERVICEPACKMAJORá4ËåERROR_OUT_OF_STRUCTURESâPËåDMICM_CONTRASTãhËå midiInStopãˆËåPRINTER_ALL_ACCESSëSQL_GD_ANY_ORDERá´Ëå‚iteráÔËå‚get_temporary_bufferáøËå‚IMAGE_SCN_MEM_NOT_PAGEDâÌå‚tagEMREXTSELECTCLIPRGNã<Ìå‚DFCS_SCROLLCOMBOBOXê‚SQLInstallODBCWâ|ÌåƒERROR_DS_DRA_OUT_OF_MEMâ¤ÌåƒCONVERT10_S_NO_PRESENTATIONâ¸Ìå ƒScrollDCé ƒITypeLib2_GetLibStatistics_StubâÍå„IMAGE_SCN_MEM_FARDATAÍå „hResDataá@Íå„ObjectPrivilegeAuditAlarmWãhÍå„LPPRINTER_NOTIFY_OPTIONS_TYPEè0„AsyncIAdviseSink_Begin_RemoteOnDataChange_Proxyâ´Íå …hFileÜÍå…MsgWaitForMultipleObjectsExâÎå…MIXERCONTROLDETAILS_LISTTEXTWè …get_nodeTypeá4Îå †ne_autodataâPÎå†_OSVERSIONINFOWâ€Îå#†ERROR_INSTALL_LANGUAGE_UNSUPPORTEDãœÎå†SBM_GETSCROLLINFO´Îå †DOC_INFO_1Wê †GetFileTitleáðÎå‡RPC_S_UNKNOWN_MGR_TYPEãÏå‡DC_TEXTâÏå ‡LPFILTERKEYSá@Ïå‡PRINTER_STATUS_PAPER_OUTé‡PropVariantInitâŒÏå#ˆFILE_ATTRIBUTE_NOT_CONTENT_INDEXEDã´ÏåˆERROR_SET_POWER_STATE_FAILEDáÈÏå ˆCAL_HIJRIàÏå ˆMMIO_FHOPENâøÏå ˆSHFILEINFOAâ(Ðå#ˆ__ICancelMethodCalls_FWD_DEFINED__ã@Ðå ˆCoInitializeáxÐå,ˆIInternetSecurityManager_MapUrlToZone_Proxyê ˆSQL_SP_LIKEâ°Ðå‰PEMRSETVIEWPORTEXTEXé‰NDR_LITTLE_ENDIANàÐå ŠMF_LINKSáüÐåŠWAVE_FORMAT_4S08éŠPATHNAME_BUFFERâ@Ñå!‹ERROR_INSTALL_PACKAGE_INVALIDlÑå!‹ERROR_DS_REFERRAL_LIMIT_EXCEEDEDáˆÑå‹FOF_CONFIRMMOUSEá¬Ñå‹CertCompareCertificateãÈÑå‹DRIVER_INFO_3Wë%‹__IPersistStream_INTERFACE_DEFINED__á ÒåŒMIXERCONTROL_CT_CLASS_TIMEã<ÒåŒCRYPT_IMPORT_KEYáXÒåŒSafeArrayCopyDataèŒSQL_ROWSET_SIZE_DEFAULTâÒå MEM_IMAGE¨ÒåGetFileSizeExÄÒåEMR_POLYPOLYLINEáìÒåIViewObject2_GetExtent_ProxyáÓåLPENCODINGFILTERFACTORYê%IPropertyStorage_WriteMultiple_ProxyádÓåŽCERT_FIRST_USER_PROP_IDâxÓå ŽReadCountèŽOLEIVERB_SHOW¨ÓåLimitEmsPagesÈÓåICM_REGISTERICMATCHERèÓåPCERT_REVOCATION_PARAè VarR8FromIntáÔåLANG_BELARUSIANâ8Ôå_OSVERSIONINFOAâTÔåRemHENHMETAFILEâlÔå DOC_INFO_1Aâ„ÔåDeleteVarDescèREGKIND_DEFAULTâÈÔå‘SUBLANG_GERMAN_LIECHTENSTEINáðÔå‘TAPE_DRIVE_WRITE_FILEMARKSãÕå‘STORAGE_BUS_RESET_REQUESTè‘??_7AsyncIMultiQI@@6B@ã`Õå’ObjectPrivilegeAuditAlarmAã„Õå’CRYPT_E_NO_REVOCATION_DLL¤Õå’DFCS_BUTTONRADIOIMAGEè’lpstrReplaceWitháÐÕå“cosâðÕå“SCARD_E_INVALID_ATRãÖå “cySrc(Öå!“MIXERCONTROLDETAILS_LISTTEXTADÖå“DisconnectObjecté“SQL_DS_RESTRICTâ€Öå”IMAGE_REL_IA64_UREL32Öå”Textá¤Öå ”BS_CENTER¼Öå ”LPNUMBERFMTâØÖå”MCI_MSF_SECONDãøÖå”FOF_NOCONFIRMMKDIRã×å”SafeArrayGetIIDê”IGP_SETCOMPSTRãH×å •_BASETSD_H_âh×å•IMAGE_SYM_TYPE_MOEã€×å•CBS_UPPERCASE˜×å•XTYPF_NOBLOCKè!•IWaitMultiple_WaitMultiple_Proxyáä×å–ASYNC_MODE_DEFAULTë–SQLSetDescRec$Øå—OSS_INDEFINITE_NOT_SUPPORTEDáHØå—NETSCAPE_SSL_CA_CERT_TYPEdØå—MEMCTX_UNKNOWNë#—ISoftDistExt_ProcessSoftDist_Proxyã¨Øå ˜WNDCLASSáÄØå˜ScrollWindowExãìØå˜mciGetDeviceIDFromElementIDâÙå˜FOF_NOCOPYSECURITYATTRIBS4Ùå˜X509_BASIC_CONSTRAINTS2ê ˜CERT_SYSTEM_STORE_LOCATION_MASKâxÙå™IN_CLASSB_MAXè ™szExtraInfoâ¨ÙåšDRV_MCI_FIRSTèšSO_DONTLINGERØÙå›COLOR_BTNFACEôÙå›CTRL_LOGOFF_EVENTÚå›SPLDS_PRINT_NUMBER_UPè!›ITypeInfo2_GetTypeFlags_ProxyTÚå œDragObjectã|ÚåœRPC_C_SECURITY_QOS_VERSIONã”Úå œszOID_DSALGâ¬Úå œpOtherNameãÐÚåœIDropTarget_Drop_Proxyë!œODBC_ERROR_INVALID_KEYWORD_VALUEáÛåPrivilegeCheckã0ÛåPMONHSZSTRUCTLÛåPLAINTEXTKEYBLOBápÛåPCERT_SIGNED_CONTENT_INFOŒÛåDRIVER_INFO_3AëitemáÀÛåžWRITE_WATCH_FLAG_RESETãØÛå žSC_MAXIMIZEâðÛå žEM_CANUNDOã ÜåžCascadeWindowsã$Üå žSHFILEINFOWê5žIInternetProtocolSinkStackable_CommitSwitch_Proxy€ÜåŸPDERR_PRINTERNOTFOUNDœÜåŸwaveOutSetPitchâ¸ÜåŸMCIERR_INTERNALâÔÜåŸCRYPT_MODE_CBCOFMðÜåŸCALLTYPE_NESTEDâ,Ýå0ŸIInternetSecurityManager_QueryCustomPolicy_StubâHÝåŸSQL_TIMESTAMP_LENèŸSQL_LOCK_RECORDâ|Ýå  _splitpathã Ýå SUBLANG_ENGLISH_CARIBBEANè RPC_C_STATS_PKTS_INâÔÝå ¡__io_EOFáìÝå ¡MAXHALF_PTRâÞå¡VER_MINORVERSIONá Þå ¡NUMBERFMTAã0Þå¡ctl1á`Þå#¡IXMLDOMDocument_createElement_Stubã„Þå¡MDM_PROTOCOL_V110_38DOT4K¨Þå¡SQL_GETDATA_EXTENSIONSë¡SQL_COLUMN_IGNOREÜÞå£WAVECAPS_SYNCßå £PCERT_X942_DH_VALIDATION_PARAMSê£SQL_CODE_DAY_TO_HOURáDßå¤WAVE_FORMAT_4S16á`ßå¤RPC_IF_ID_VECTORáxßå¤PSM_GETRESULTè¤SQLDescribeColAâ¨ßå ¥FS_ARABICÈßå¥RPC_C_PROFILE_ALL_ELTôßå!¥IRpcChannelBuffer_GetBuffer_Stubáàå¥SQL_NO_COLUMN_NUMBERé¥SQL_FN_TD_EXTRACTHàå ¦GetClipRgnã`àå ¦__unknwn_h__áxàå ¦VariantInitê¦SQL_ALL_CATALOGSá¨àå§mem_funâÀàå §SO_SNDLOWATâèàå§NdrComplexStructBufferSizeãáå§FILE_DEVICE_TAPE_FILE_SYSTEMá0áå§IID_ISequentialStreamè§SQL_SR_CASCADEãláå¨METRICS_USEDEFAULTã„áå ¨dwProvTypeë¨IID_ITypeCompÈáå%©JOB_OBJECT_LIMIT_SCHEDULING_CLASSðáå©CreateScalableFontResourceë%©ITypeInfo2_GetDocumentation2_StubHâå!ªIMAGE_SCN_CNT_UNINITIALIZED_DATAá\âå ªWINADVAPIxâåªCTLCOLOR_STATICâ”âåªLPHIGHCONTRASTWâ°âåªLPMIDIOUTCAPSAãÀâåªblobéªBLOBáìâå«_MSL_NEEDS_EXTRASáãå«VK_LWINâãå«DRIVER_INFO_2Wã<ãå«SQL_ATTR_ODBC_CURSORSXãå«SQL_BATCH_SUPPORTè«SQL_DT_RESTRICTâãå¬first_param_typeé ¬CTRY_PRCHINAáÀãå ­VK_OEM_ENLWâØãå ­PrivateKeyë­SQL_PARAM_TYPE_DEFAULTãäå®NPMIDIOUTCAPSAë ®__IOleCache_INTERFACE_DEFINED__âdäå¯WSA_QOS_EUNKOWNPSOBJáŒäå¯IOCTL_SERENUM_REMOVE_HARDWAREè¯lpBinaryPathNameáÀäå°DMBIN_ONLYONEè °RegOpenKeyExáôäå±SPI_GETMOUSEKEYSáåå±I_RpcStopMonitorAssociationâ8åå±STATFLAG_DEFAULTé±SQL_ATTR_ROW_ARRAY_SIZEâˆåå²COMQC_E_APPLICATION_NOT_QUEUEDã¤åå²OIBDG_DATAONLYë²SQLDescribeColWâäåå³ERROR_DS_UNKNOWN_ERRORäæå³GCPCLASS_NEUTRALáæå ³cxSrc$æå ³VT_CLSIDáLæå³IViewObject2_GetExtent_Stubê³V_I4REFâ€æå´IMAGE_REL_IA64_UREL22˜æå ´fRtsControlê´ExtractThumbnailáØæåµERROR_MESSAGE_SYNC_ONLYâôæåµWSAECONNABORTEDâ çå µszAbstractã(çåµMDM_COMPRESSIONêµMDM_GEN_V120_PROTOCOL_DATAãpçå¶DDD_RAW_TARGET_PATHâ çå%¶ERROR_CTX_MODEM_RESPONSE_NO_DIALTONEá¼çå¶GetStockObjectãìçå%¶IXMLDOMDocument_createAttribute_Stubé¶SQL_AGGREGATE_FUNCTIONSâ,èå·MSGBOXCALLBACKë ·NUMBERFMTWã\èå ¸__pos_procãxèå¸AUDIT_EVENT_TYPEáŒèå ¸FW_LIGHTá¨èå¸tagEMRPIXELFORMAT¼èå¸VK_HOMEâØèå¸NPMIDIOUTCAPSWë ¸wIDLFlagséå ¹ReparseGuidâ$éå¹VER_CONDITION_MASKãDéå¹PSP_USEHEADERTITLEë¹BINDSTRING_LANGUAGEâ„éåºMCI_STATUS_POSITIONâœéå ºtagIDLDESCëºSQL_PARC_BATCHãÌéå »bV4Heightìéå»ILLUMINANT_MAX_INDEXáêå »SWP_NOSIZEã êå»FloppyClassGuidâ@êå»WriteFmtUserTypeStgê»SQL_DV_RESTRICTâpêå ¼EV_RXCHARŒêå¼TTPOLYGONHEADERâ¨êå¼LPHIGHCONTRASTAâÄêå¼LPMIDIOUTCAPSWë¼FOF_NOERRORUIáëå½CB_GETDROPPEDCONTROLRECTáëå½DRIVER_INFO_2Aã8ëå½SERVICE_STATE_ALLè½SQL_LIKE_ONLYpëå¾PFD_TYPE_COLORINDEXâˆëå ¾DlgDirListë¾get_nodeTypedValueã¼ëå ¿PATPAINTáÐëå¿MO_3_RWê¿IErrorInfo_GetHelpFile_StubâìåÀLOCALE_SMONTHNAME3ã0ìå ÀLPOFNOTIFYë À_dwOptionsã\ìåÁwcsncatâ|ìåÁLOCALE_SMONTHNAME2ë ÁMCI_STEPá¤ìåÂ_IOSFWDâ¸ìåÂ_POINTLâØìåÂERROR_NO_MORE_ITEMSâøìåÂWM_NCRBUTTONDBLCLKãíåÂLOCALE_SMONTHNAME1ã,íå ÂPF_CHAOSáDíåÂMS_DEF_PROV_AlíåÂUSER_MARSHAL_CB_BUFFER_SIZEê#ÂITypeInfo_LocalReleaseVarDesc_Stubë ÃGGL_PRIVATEâÐíåÄOSS_UNIMPLEMENTEDàíåÄcmdãîåÄLOCALE_SMONTHNAME7ãîå ÄExtractIconâ4îåÄABN_WINDOWARRANGEèÄDeletePrinterConnectionâpîåÅ?$to_signed@G„îåÅResultã îåÅENUMLOGFONTEXAãÀîåÅLOCALE_SMONTHNAME6ãèîåÅszOID_RSA_SMIMEalgCMS3DESwrapè ÅCacheïåÆ?$to_signed@D$ïåÆPST_FAXâHïåÆPAN_LETT_NORMAL_FLATTENEDhïåÆLOCALE_SMONTHNAME5ãïåÆCertEnumSubjectInSortedCTLã¸ïåÆaGenericBindingRoutinePairsâÐïå ÆDOC_INFO_3Wê!ÆIXMLDOMDocument_get_url_ProxyðåÇ?$to_signed@E0ðåÇSECURITY_INFORMATIONáDðå ÇPFPO_DATAhðåÇAccessCheckAndAuditAlarmWˆðåÇCLIPBRD_E_CANT_SETã ðå ÇPC_RECTANGLEá´ðå ÇSetPixeláÌðå ÇVK_OEM_RESETáìðåÇLOCALE_SMONTHNAME4äñåÇMO_5_WOâ(ñåÇIInternetHostSecurityManageré(ÇIInternetSecurityMgrSite_GetWindow_Stubâtñå ÈDate_Formatsá˜ñåÈSetThreadExecutionStateâ´ñåÈdwCharacteristicsèÈGetDriverModuleHandleìñåÉ?$to_signed@KòåÉFILE_CASE_PRESERVED_NAMES8òåÉERROR_DS_CANT_REM_MISSING_ATTèÉSQL_FN_STR_INSERThòå ÊstrtoulláˆòåÊLOCALE_SMONTHNAME9ã¨òåÊCommDlgExtendedErroréÊSQL_DESC_BIND_TYPEãàòåË?$to_signed@Iøòå Ë_DWORDLONG_âóå ËIsEqualGUIDâ,óåËgmptGlyphOriginâHóåËcaColorfulnessãhóåËLOCALE_SMONTHNAME8ã„óåËMM_STREAM_DONEã óåËDRIVER_INFO_1WëË__IMarshal_INTERFACE_DEFINED__ãìóåÌDebugDirectorySizeãôå ÌPostMessageâôåÌwInputã@ôåÌCERT_FIND_NO_CTL_USAGE_FLAGâTôåÌtagBLOBâhôåÌpointlëÌMODEMSETTINGS”ôå ÍlfWeightá¨ôåÍPathIdë ÍActionCodeë!ÏMCIERR_WAVE_OUTPUTUNSPECIFIEDõåÐIMAGE_FILE_EXECUTABLE_IMAGEâ õåÐcmpâ8õå ÐDOC_INFO_3Aâ\õåÐZAFLAGS_UNC_AS_INTRANETêÐIGP_UIã”õåÑPSID_IDENTIFIER_AUTHORITY¨õåÑHWINSTAâÌõåÑAccessCheckAndAuditAlarmAðõåÑCO_E_FAILEDTOCREATEFILEâöåÑ_CRYPT_VERIFY_MESSAGE_PARAã8öåÑCERT_CHAIN_POLICY_SSLhöå%ÑIInternetThreadSwitch_Continue_ProxyéÑIDataFilter_DoDecode_Stubœöå ÒDVD_R°öå ÒcMemberséÒSERVICE_STATUS_HANDLE__âðöåÓENUMLOGFONTEXWã÷åÓmidievent_tagè ÓGetJavaTrustá<÷åÔrcNormalPositionáL÷åÔGuidád÷åÔMS_DEF_PROV_W„÷åÔNdrContextHandleSizeéÔSQL_SR_REFERENCES_COLUMNáÄ÷åÕCS_E_INVALID_PATHÜ÷åÕSelectPaletteð÷å ÕcfFormaté ÕInitCacheøåÖatofá,øå Ö__copy_memãPøåÖGetSystemDefaultLangIDë ÖSQLROWCOUNTâ„øå×PBITMAPFILEHEADERè×USERCLASSTYPE_APPNAMEÀøåØOSS_BAD_ENCRULESáÜøåØLPLOGCOLORSPACEêØCAL_GREGORIAN_ARABICá ùåÙatoiéÙIOCTL_DISK_FORMAT_TRACKS_EXâLùåÚDMPAPER_10X11lùåÚPERF_SAMPLE_COUNTERêÚSQL_ATTR_ROW_OPERATION_PTRã¤ùåÜatolá¼ùåÜtagBINDSTATUSÐùå ÜnMaxPageéÜODBC_ERROR_INVALID_DSNãúåÝATOMáúåÝdwModeëÝDRIVER_INFO_1AãLúå ÞSM_CXHTHUMBêÞIMallocSpy_PostRealloc_StubâŒúåßDMPAPER_10X14 úå ßcSignersé ßPARSE_ANCHORáÔúåàLOCALE_SDAYNAME1áìúå àNRC_REMTFULê àpwszNameáûåáDEFAULT_QUALITYâ<ûåáMCI_OVLY_OPEN_PARMSâTûå á_NTDDSTOR_H_áhûå áEnumJobsá„ûåáLPCREATETYPELIBê!áIInternetProtocolRoot_Start_StubáÈûå âGetFontDataâÜûåâPWR_OKëâLOCALE_SDAYNAME3á üå ãkey_compá$üå ãCompressionâLüå!ãRPC_S_NOT_ALL_OBJS_UNEXPORTEDhüåãLOCALE_SDAYNAME2á€üå ãLPHMIXEROBJâ”üåãAddJobAêãSetFuncAndParamNamesáÈüå äDCB_RESETèüåäGETSETPAPERMETRICSäýå äPMDINEXTMENUáýåäLOCALE_SDAYNAME5á<ýåäTAPE_GET_STATISTICSâTýå äPMEDIA_TYPEêäIMC_GETCANDIDATEPOSâ”ýååhas_trivial_copy_ctorèåLOCALE_SDAYNAME4áÌýåæLOCALE_SDAYNAME7áäýåærgpRecipientsüýå æDOC_INFO_2WêæSQL_AT_ADD_COLUMN_DEFAULT<þåç_MSL_WCHAR_MINãdþåçPF_ALPHA_BYTE_INSTRUCTIONSã„þåçEnumResourceNamesWã þåçLOCALE_SDAYNAME6á´þå çrgpChaináÜþåçIPersistStorage_IsDirty_ProxyèçDROPEFFECT_NONEêèGETCOLORTABLE(ÿåéadd_referenceDÿåéPROFILE_SERVERãXÿå éRT_DIALOGlÿåércPaintêéMftWritesLazyWriterêêLPOUTLINETEXTMETRICAáÄÿåëtagMETARECORDäÿåëNPOUTLINETEXTMETRICAáüÿå ëKP_MODE_BITSéëSQL_SCC_ISO92_CLI0äìCreateDesktopHä ìWN_BAD_LEVELádäìDdeUninitializeê ìdwEventStateáŒäífdimá¨äíSEC_I_RENEGOTIATE¼ä íDEVMODEWáÔä ícSignerStoreéíIOleLink_BindIfRunning_Stubâä îHandleToLongá,äîUnlockSegmentDä îMK_E_SYNTAXâ`äîQUERYDIBSUPPORTâ|äîLPNEWTEXTMETRICWá”ä îhwndSourceë îSubjectUsageáÀäïmbsrtowcsØä ï_TAPE_ERASEâôäïIsDialogMessageâ äïsndPlaySoundW4äïCERT_ID_ISSUER_SERIAL_NUMBERáDäïLoã\ä ïVarR4FromIntá|äïSQL_API_SQLGETDATAãœäïSQL_CUR_USE_DRIVERë ïSQL_CN_ANYãÔäðIMAGE_SCN_LNK_OTHERâüäðREG_FULL_RESOURCE_DESCRIPTORáäðtagBITMAP$ä ðARW_LEFTé ðDOC_INFO_2Aâ\äñEnumResourceNamesAãxäñRPC_BLOCKING_FNêñSQL_ATTR_FETCH_BOOKMARK_PTRâ¸ä òPtrToShortãÔäòdwProcessorTypeâôäòRPC_S_NO_MORE_MEMBERS ä!òERROR_DS_CANT_MOVE_ACCOUNT_GROUPá<äòSTG_E_OLDFORMATâPäòVK_SCROLLpäòSPI_SETFASTTASKSWITCH”äòRPC_C_NS_SYNTAX_DEFAULTâ¨äòtimevalâÌäò_CMSG_SIGNER_ENCODE_INFOáìäòUPDFCACHE_NORMALCACHEè òSQL_AF_ALLã$äóGetUserDefaultLCIDëóCoGetStandardMarshaláXä ôFillRectá|äôCERT_KEYGEN_REQUEST_INFOéôResumeã¨ä õWSAEMSGSIZEâ¼äõAddJobWêõDD_DEFSCROLLDELAYáäöERROR_DS_SEC_DESC_TOO_SHORTâä öSCODE_CODEã0ä öeSweepAngleê*öIXMLDOMNamedNodeMap_setNamedItem_Stubä$÷CryptVerifyDetachedMessageSignatureâ¨ä÷HintsClustersÄä÷LPOINETPROTOCOLê÷ODBC_ERROR_INVALID_BUFF_LENâüäøflipáäøLPNEWTEXTMETRICAá@äøPFN_CERT_STORE_PROV_FIND_CERTèøGetMarshalSizeMaxtäùsndPlaySoundAŒä ùdwCallbackã¤äùMCIERR_DRIVERè ù__CGUID_H__âÜäú_MSL_IMP_EXP_RUNTIMEâäúERROR_EVENTLOG_CANT_START(äúERROR_DS_DUP_SCHEMA_ID_GUIDâ@äúLPMDINEXTMENUèúNdrComplexArrayMarshallâ|ä ûfilelengthãœäûNumberOfAuxSymbolsã°ä ûDEVMODEAáÐäûRpcMgmtEpEltInqNextâìäûLPADDJOB_INFO_1êûGetZoneActionPolicyâ äü_doserrno8 äüFirstEntryRVAP äüDMPAPER_11X17èüLPOUTLINETEXTMETRICWá äýNPOUTLINETEXTMETRICWᬠäýCurrentBlockSizeéýIXMLAttribute_get_name_Proxyáð äþSTG_S_MONITORINGéþPFILESYSTEM_STATISTICSã( ä ÿ.drectveá< ä ÿh_lengtháT ä ÿALG_TYPE_ANYáx äÿCERT_FIND_ENHKEY_USAGEã ä ÿpStartPageã° äÿPropSheet_SetCurSelê)ÿIXMLDocument2_get_fileModifiedDate_Proxyá åEMR_SETWINDOWORGEXã å PWINDOWPOSã8 åDATEFMT_ENUMPROCAP å MIDI_UNCACHEêUSER_MARSHAL_FC_HYPER„ ä UserNameᜠä SetVarNameë%IInternetBindInfo_GetBindString_StubáÜ äRBãø äMapGenericMaskë WINOLEAPIècCertsã@ äSECTION_EXTEND_SIZEâX ä WM_PAINTICONé IRecordInfo∠ä CLSID_NULL㤠äTKF_HOTKEYSOUNDê CFS_RECTáÐ ä TOKEN_READãø äERROR_DS_EXISTS_IN_MAY_HAVEêCO_E_INIT_TLS0 ä_MSL_IMP_EXP_SIOUXãL ä__msl_ctype_mapâd äWM_MOUSEFIRSTŒ äCERT_ALT_NAME_EDI_PARTY_NAMEá´ äCERT_STORE_CRL_CONTEXT_FLAGêCryptMemReallocâä ä is_moduloèSQL_CA_CONSTRAINT_DEFERRABLEá(ä SP_HANDSHAKINGãLä PAN_LETT_OBLIQUE_CONTACTádä PM_CLOSE_PROCè SQL_ATTR_TRACEFILEã¨ä ERROR_INVALID_LB_MESSAGEáÀä WSANO_DATAãØä pending_sessâä SPLDS_PRINT_MEDIA_SUPPORTEDê IXMLDOMEntityReferenceãDä SE_CREATE_TOKEN_NAMEálä PIMAGE_ARCHIVE_MEMBER_HEADERá€ä fDummy2â˜ä FindWindowExá°ä TOGGLEKEYSãÈä CALLBACK_NULLìä MCI_GETDEVCAPS_USES_FILESè FreePropVariantArrayáä hypotDä IMAGE_DEBUG_TYPE_OMAP_TO_SRCá\ä FindResourceWtä cDepthBitsãä EMR_DELETEOBJECTá¤ä BF_SOFTâ¼ä cbCustomDataé CommDlg_OpenSave_GetSpecáä ERROR_DS_CANT_MOD_OBJ_CLASSâ,ä PCRYPT_PRIVATE_KEY_INFOê SMEXF_HANDLERhäSPAPI_E_WRONG_INF_STYLEâ„äCTRY_AUSTRALIAã¤äCTRY_UNITED_STATESë INADDR_NONEâääTAPE_SPACE_SEQUENTIAL_SMKSãätagEMRSETCOLORADJUSTMENTá$äRESOURCETYPE_DISK<ä NETRESOURCEâXäHDATA_APPOWNEDãpä MM_JOY2MOVEê pchEndReadãœäENOTDIRâ¸äSPAPI_E_NO_BACKUPÌä STATFLAGélhashval2ôä__MSL__ê SERVERCALLãä len12<äScaleViewportExtExãXäMM_JOY1BUTTONDOWNè!CERT_TRUST_HAS_NAME_MATCH_ISSUERá˜äMF_REMOVEÀä"IBindCtx_EnumObjectParam_StubàäPARSE_ROOTDOCUMENTëlhashval1äptlEndë GetClassURLâ8äPIMAGE_SYMBOLXäRvaToFirstByteOfDataá€ä"CERT_STORE_PROV_FIND_CRL_FUNC¸ä,__ITimeAndNoticeControl_INTERFACE_DEFINED__ê_tagPROTOCOLFILTERDATAãðä_getdrive äDATEFMT_ENUMPROCWè ReadClassStmá@äPSIDENT_PSCENTRICèCryptVerifyDetachedMessageHashã€ä PAUXCAPSáœäX509_ASN_ENCODING´ätagPENDINGMSGè0ICreateTypeInfo2_SetFuncHelpStringContext_ProxyêMDM_BEARERMODE_ISDNâ(äFindResourceA<ä VarCyCmpéSQL_API_SQLPROCEDURECOLUMNSâxäbV4Planes¨ä#IXMLDOMCharacterData_get_data_StubãÀä ReadClassStgé FindTextáøäCOMADMIN_E_NOTDELETEABLEá ä DeviceKeyèdwRegPolicySettingsâTäSE_PROF_SINGLE_PROCESS_NAMEâpäDOWNLOADHEADERãˆäVFF_CURNEDESTÀä,IOleClientSite_RequestNewObjectLayout_Proxyê SQL_MAXIMUM_COLUMNS_IN_GROUP_BYâäGetTapeParametersèLPD_SHARE_DEPTHâLä PAN_XHEIGHT_CONSTANT_SMALLë VT_STORAGEãxä!__dest_osä !MF_SENDMSGSâ¬ä!SCARD_RESET_CARDáÌä!??_7IEnumVARIANT@@6B@øä !IXMLDocument2_get_fileSize_Stubâä!VarNumFromParseNumë!SQLManageDataSourcesáXä"SizeOfOptionalHeaderálä "wButtonsá„ä"MMIO_FINDRIFFè"midl_allocate°ä#PCWSTRãÈä#FindNextFileAèä#USER_MARSHAL_CB_TYPEé #FSCTL_OPBATCH_ACK_CLOSE_PENDINGâ<ä"$??_Edomain_error@std@@UAE@I@ZXä$LPTTPOLYGONHEADERxä$RPC_SYNTAX_IDENTIFIERè$CADATEã ä %PCF_RLSDá¼ä%XST_ADVDATASENTâÔä%CP_WINUNICODE ä+%IRpcChannelBuffer2_GetProtocolVersion_Stubã(ä%VarUintFromDateê%CDN_SHAREVIOLATIONã`ä &WNDCLASSEXWê&SQL_DIAG_DROP_TABLEâ¤ä'MSSIPOTF_E_NOHEADTABLEë'tagMCI_ANIM_WINDOW_PARMSWèä(IMAGE_ORDINAL_FLAG32áä(ERROR_DDE_FAILã ä(szlMillimetersë(ODBC_CONFIG_SYS_DSNâ\ä)OffsetModuleNameáxä)SEC_E_TIME_SKEWê)ITypeInfo_GetMops_Stubã°ä *wCharStráÐä*wSettableStopParityâðä*MCI_MODE_NOT_READYãä!*IAdviseSink_RemoteOnRename_Proxyá4ä *CF_ANSIONLYê*SQL_TIMEDATE_FUNCTIONSãxä+IMAGE_REL_IA64_IMM22áŒä+RGN_ORë+NdrPointerBufferSizeáÈä,CREATE_FOR_IMPORTÜä,FS_LATIN2ôä ,LZOpenFileWâ ä ,WAVE_MAPPERâ4ä,szOID_AUTO_ENROLL_CTL_USAGEâTä,SCARD_SYSTEM_READERSá€ä,Finish_QueryMultipleInterfacesë,SQL_DESC_UNNAMEDá°ä -lfHeightáÄä -PLOGFONTáÜä -HTSIZELASTãðä-HashIdë-PID_FIRST_USABLEá0ä.ERROR_ONLY_IF_CONNECTEDâPä.EnumPrinterDriversAê.SQL_DIAG_NATIVEâ€ä /FS_LATIN1è/PFN_CMSG_EXPORT_KEY_TRANSÌä0pointer_to_binary_functionãää0InitializeSidè 0WNDCLASSEXAâ ä1tagMCI_ANIM_WINDOW_PARMSAD ä1CertVerifyTimeValidityë1bP1â| ä2PROCESSOR_ARCHITECTURE_ARM㜠ä2short_from_ndr_tempâ´ ä 2MIDLVersionâÔ ä2ELEMENT_STATUS_IMPEXPä ä2bP2ê*2__IXMLHttpRequest_INTERFACE_DEFINED__$!ä3srcâänPIMAGE_FILE_HEADERã4>änEMR_SETARCDIRECTIONênRpcMgmtEpUnregisterâ€>ä oIMAGE_SEPARATE_DEBUG_FLAGS_MASKâ”>ä oMETA_PIEá¬>äoMSG_MAXIOVLENèoCLSID_XMLDSOControlâà>äpLPPATTERNü>äpHELP_TCARD_DATAâ?äpVIF_CANNOTCREATEépMIDIERR_LASTERRORL?ä qcbClsExtraã\?äqedt1éqFSCTL_IS_PATHNAME_VALIDâ?ä rlen22¬?ärchoose_replaceãÌ?ärERROR_NO_SCROLLBARSâü?ä$rERROR_UNABLE_TO_EJECT_MOUNTED_MEDIAâ,@ä$rERROR_CTX_WINSTATION_ALREADY_EXISTSâD@ä rWVR_ALIGNTOPád@ärDMLERR_ADVACKTIMEOUTát@äredt2á@ärLPSHNAMEMAPPINGê&rCHANGER_PREDISMOUNT_ALIGN_TO_SLOTè@ä sRPC_E_CLIENT_CANTUNMARSHAL_DATAâAäsDESKTOPVERTRESësedt3á4AätOpenBackupEventLogAâhAä)tERROR_CLUSTER_NO_RPC_PACKAGES_REGISTEREDá”Aä&tERROR_CTX_WINSTATION_NAME_INVALID´AätCRYPT_E_UNKNOWN_ALGOáÐAätlsCsbSupportedãäAätmessageâôAätedt4áBätGetCatalogFileë tnMaxFileá4Bäuedt5áPBäuSCHANNEL_MAC_KEYá€Bä%uICreateTypeInfo_SetTypeIdldesc_ProxyáœBäuPI_CLSIDLOOKUPëuSQL_MULT_RESULT_SETSáÐBäviRelativeàBävedt6âCävPMCI_ANIM_STEP_PARMSévSQL_TYPE_TIMESTAMPã@CäwEXPIRES_AFTER_DATEãPCäwedt7áxCä"wMIXERCONTROL_CT_UNITS_BOOLEAN˜CäwRpcNsBindingSelectë*wITypeFactory_CreateFromTypeInfo_ProxyØCäxPTCHáìCäxrclBoxãDäxCTRY_CARIBBEANãDäxedt8éxPRINTER_ERROR_OUTOFTONERá\DäySTG_E_DOCFILECORRUPTálDäyedt9é ydurationá˜Dä zstructnameã°Dä zSTGM_DIRECTâÈDä zGetDestCtxë zPROPSET_BEHAVIOR_CASE_SENSITIVEâ Eä {IID_IMultiQIá_DisposeThreadDataãܤä>FLT_DIGâü¤ä>ERROR_PROC_NOT_FOUNDá,¥ä*>ERROR_DS_FILTER_USES_CONTRUCTED_ATTRSD¥ä >EMR_PAINTRGNá`¥ä>tagWNDCLASSEXAë>MSHLFLAGS_NOPINGᘥä?RtlCompareMemoryá°¥ä ?MAKE_HRESULTáÌ¥ä?VIFF_FORCEINSTALLð¥ä?MCI_DEVTYPE_DIGITAL_VIDEOè???_7IPersistStorage@@6B@á4¦ä@SYSER_VERSCHECK_MASKáL¦ä @lpBaseOfDllâx¦ä@ERROR_SUCCESS_REBOOT_INITIATED㔦ä@RPC_S_ZERO_DIVIDE°¦ä@wglGetProcAddresșä@_CRYPT_BIT_BLOBâø¦ä!@CMSG_SP3_COMPATIBLE_ENCRYPT_FLAGá§ä@CLSID_CCDOptionButton@§ä@__IXMLDocument2_FWD_DEFINED__è@SQL_SP_MATCH_PARTIALáx§ä APOINTER_32㜧äAIMAGE_FILE_MACHINE_THUMBá¼§äATAPE_SPACE_SETMARKSâܧäAFILE_MAP_ALL_ACCESSêAIID_IClassFactory¨ä BExtTextOutã$¨äBWNDCLASSA@¨äBSM_CXSIZEFRAMEãX¨ä BIDH_CANCELãx¨äBIMoniker_Enum_Stub㔨äBIsLoggingEnabledAèBVarUI2FromIntÀ¨äCNT_TIBãÔ¨äCOpenMutexè¨äCUpperLeft ©äCwaveOutGetPlaybackRateã(©äCIOleCacheControlé CVarUI2FromI4á\©äD_PRINTER_INFO_4Wá„©äDIXMLDocument2_get_URL_ProxyêDMDM_PROTOCOL_HDLCPPP_128K_CHAPãÄ©äEMOUSEKEYSØ©ä EAF_CCITTáð©ä ESectorNumberá ªäESEARCH_ALTERNATEá,ªäESCARD_READER_EJECTSâLªäEPRINTPROCESSOR_INFO_1è EVarUI2FromI2é FVarUI2FromI1ᔪäGOSS_MEM_ERROR°ªäGpPrimitiveHandleáäªä(G__AsyncIAdviseSink2_INTERFACE_DEFINED__â«äGVARFLAG_FDISPLAYBINDá0«äGITypeInfo_ReleaseTypeAttr_StubëGSQL_CA2_CRC_EXACTh«äHInt64ShrlMod32ëHImmGetStatusWindowPos¤«äIWSA_QOS_EFLOWDESC¸«ä IitemData2è5ICERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAGá ¬äJitemData1(¬äJSM_CYSIZEFRAMEë JhyperT¬äKLPPCMWAVEFORMATât¬äKSO_SYNCHRONOUS_ALERTሬä KSZM_FLAGSèKSQL_PRED_BASICã̬äLCRYPTPROTECT_LOCAL_MACHINEãì¬äLIMalloc_Realloc_Proxy$­ä,LIRpcChannelBuffer2_GetProtocolVersion_ProxyêLSQLGetStmtOptioná`­äMSERVICE_ERROR_SEVEREိäMCERT_COMPARE_SHIFTë MSTGFMT_FILEêNLB_GETTOPINDEXãØ­äOSUBLANG_NORWEGIAN_NYNORSKð­äONPCHARSETINFO®äOEMREOFã$®äOSendMessageTimeoutAâ<®ä OTIME_SMPTEãd®äOIBindHost_CreateMoniker_ProxyèOOLEIVERB_OPEN®ä Pdigits10ᬮäPCB_GETTOPINDEXãÄ®äPMMIO_FINDLISTèPMCI_FORMAT_BYTESáô®äQVT_BOOLêQSQL_SC_SQL92_FULL ¯äR_TEBá<¯äRI_RpcRequestMutexX¯äR_PRINTER_INFO_4Aáp¯ä RtagLIBFLAGSêRSQL_LOGIN_TIMEOUT¨¯äS_OBJECT_TYPE_LISTÀ¯äSDataDirectoryä¯äSERROR_TOO_MANY_MODULESä°äSCONNDLG_PERSISTâ°ä SABE_BOTTOMëS_CERT_SIMPLE_CHAINã`°äTERROR_DS_WRONG_OM_OBJ_CLASSât°ä TWNDCLASSWèTIsLoggingEnabledW¨°ä Ue32_objtabãÀ°ä UShellExecuteéUIBinding_GetBindResult_Proxyâ±ä VGCLP_HICONSMá±äVMOD_WINâ,±äV_MCIDEVICEID_<±äVbyrefèVFR_RAWãp±äWJOB_OBJECT_ALL_ACCESSè WSetEventᨱäXERROR_DS_BAD_NAME_SYNTAXáıäXSQL_API_SQLSETPOSèXSQL_CT_CONSTRAINT_DEFERRABLEéYSendMessageTimeoutWâ0²äZDIGSIG_E_EXTENSIBILITYëZVarUI1FromIntè[SQL_FN_TD_TIMESTAMPDIFF☲ä!\_JOBOBJECT_BASIC_PROCESS_ID_LISTá°²ä \SC_MINIMIZEâвä\midiStreamPositionë"\ILockBytes_RemoteWriteAt_Stub³ä]RPC_S_MAX_CALLS_TOO_SMALL0³ä]FW_BOLDâD³ä]BLACK_PEN\³ä ]EnumMetaFileáx³ä]ShowOwnedPopups⨳ä#]MIXER_GETCONTROLDETAILSF_QUERYMASKë!]IXMLDOMNode_get_definition_Proxyáì³ä ^_SIZEOF_LONGé ^dwContextIdâ$´ä_IMAGE_IMPORT_BY_NAMEá@´ä_CryptGenRandomãX´ä_BindToStorageè_SQL_ISV_CHARACTER_SETS㌴ä `asinh°´ä`round_toward_neg_infinityÜ´ä `CERT_STORE_PROV_WRITE_CERT_FUNCâµä`ICreateTypeInfo2_SetName_Proxyã(µä`ImmSetStatusWindowPosè `SQL_TRANSACTION_REPEATABLE_READâlµä bDataSelectoráµäbCO_E_SETSERLHNDLFAILED㬵äbWINSTAENUMPROCAâĵä bLPCWPSTRUCTâäµäbRpcNsMgmtInqExpAgeë%bIInternetZoneManager_LogAction_Proxyá,¶äc__sort_switch<¶äcSysâP¶äcMoveFileW|¶äcERROR_FLOPPY_ID_MARK_NOT_FOUND㜶äcNTE_BAD_KEYSET_PARAMá´¶ä cMMIO_RWMODEâضäcCRYPT_FORMAT_SEMICOLONë ccbstgmedDataâ·ä dasinl$·ädERROR_NO_NET_OR_BAD_PATHá@·äd_PRINTER_INFO_5WédQueryContinueDragp·äeUserIDã·äeGetWindowsDirectoryAá¼·äeSetSecurityDescriptorRMControlãà·äePAN_STRAIGHT_ARMS_WEDGEâø·ä eWN_BAD_VALUEé eJOYCAPSWá¸ä fisinf4¸äfENHMETAHEADERP¸äfLBS_EXTENDEDSELâd¸äfS_un_w〸äffHasNewCorrDescê fPAGESETUPDLGᬸägwcsrchrâȸäg_TOKEN_STATISTICSè¸äglpProcessAttributesêgFMFD_URLASFILENAMEã$¹ähTHREAD_TERMINATEáD¹ähCDERR_REGISTERMSGFAIL`¹ähALG_CLASS_HASHëhSCS_CAP_COMPSTRâ¹äiPolygonâ°¹äiMMIOERR_PATHNOTFOUNDéiPRINTER_ENUM_ICONMASKð¹äj_MSL_MATH_CONFIG_HãºäjSUBLANG_SPANISH_BOLIVIAâ,ºäjDEBUG_PROCESSHºäjSHGNLI_NOUNIQUEâdºäjAsyncIPipeLongㄺäjIStream_Revert_StubêjSQLSetConnectOptionAé#kERROR_DS_SENSITIVE_GROUP_VIOLATIONãìºä lcall_traitsâ»älFindFirstChangeNotificationAá,»ä lGetMetaFileAélCLSID_CCDFontPropertyPaged»ämRpcExcept€»ämtagSAFEARRAYBOUNDèmSafeArrayDestroyDescriptor㸻ä nasinfлä nFS_CYRILLICâä»änHideCaretø»änIDC_ARROW¼ä nnBlockAlignâ4¼änPCERT_REVOCATION_STATUSâP¼änElementAddressã|¼ä nPRINTER_NOTIFY_FIELD_UNTIL_TIME⤼änLPSERVICE_FAILURE_ACTIONSWë nSQL_MAXIMUM_COLUMNS_IN_ORDER_BYâè¼ä oPEMRELLIPSEê oMIXERCONTROL_CT_SC_METER_POLLEDâ0½äpREPLACE_PRIMARYâX½äpIMallocSpy_PostDidAlloc_Proxyè)pIRunningObjectTable_NoteChangeTime_Proxyá´½äqSECURITY_RESTRICTED_CODE_RIDá̽äqGetWriteWatchä½ä qPMIXERLINEëqCoRevokeClassObjectâ(¾ärIMAGE_FILE_MACHINE_ALPHAáD¾är_PRINTER_INFO_5Aá\¾ärVarUI4FromIntè rSQL_TC_DML㌾ä sPARITY_SPACEᬾäsGetWindowsDirectoryWáؾä sERROR_DS_NO_CHECKPOINT_WITH_PDCâð¾ä sSIZEPALETTEâ¿äsVK_DOWNâ¿ä sJOYCAPSAá,¿äsS_un_bãH¿äsCTL_FIND_MD5_HASHt¿ä"sIRpcChannelBuffer_GetBuffer_ProxyèsCHANGEKIND_ADDMEMBERᨿä tllroundláÈ¿ätSERVICE_KERNEL_DRIVERä¿ätWINSTAENUMPROCWâÀätSCardGetProviderIdëtSQL_MAX_TABLES_IN_SELECTá<ÀäuMoveFileAdÀäuERROR_EA_LIST_INCONSISTENTãŒÀäuCO_E_WRONG_SERVER_IDENTITYã¤ÀäuSYQUEST_EZ135èuNonCachedWriteBytesâäÀäv_MSL_FLOAT_WIN32_HäÁävWM_MDIGETACTIVEâÁävCALINFO_ENUMPROCé vsin_familyãLÁä wWM_NEXTMENUâtÁäwGetMenuCheckMarkDimensionsãŒÁä wMNC_EXECUTEâ¬ÁäwCRYPT_MODE_CBCOFMIëwSQL_DIAG_MESSAGE_TEXTøÁäxIRunnableObject_IsRunning_StubëxLPSERVICE_FAILURE_ACTIONSAã<ÂäyWSA_QOS_RECEIVERSdÂäyODBC_ERROR_CREATE_DSN_FAILEDéySQLInstallerErrorWã¬ÂäzFindFirstChangeNotificationWáÄÂä zGetMetaFileWáøÂä(z__ISynchronizeEvent_INTERFACE_DEFINED__â(Ãä%zIOleInPlaceFrame_EnableModeless_StubézIMN_SETSENTENCEMODEâ\Ãä{gmtime_tmxÃä{RPC_X_PIPE_EMPTYáÃä{RDW_UPDATENOW¤Ãä{NumDigitsÄÃä{MIDIERR_DONT_CONTINUEÜÃä {NRC_MAXAPPSâøÃä{LOCK_UNLOCK_DOORé0{IInternetZoneManager_CreateZoneEnumerator_ProxyâDÄä |IsPOD\Ää |PTEXTMETRICâpÄä|ABM_NEWê|SQLSetConnectOptionWá Ää}Symâ´Ää}cbInQueâÔÄä}PSINJECT_DOCNEEDEDRESðÄä}RegCreateKeyExë }SQL_CVT_BITâÅä ~llroundfá@Åä~ThisPeriodTotalUserTimeâlÅä ~JOBOBJECT_BASIC_PROCESS_ID_LISTâŒÅä~META_SETTEXTCHAREXTRA´Åä~__IOleWindow_FWD_DEFINED__ë~IME_CMODE_LANGUAGEãüÅäPSECURITY_QUALITY_OF_SERVICEáÆäHTASK__â,ÆäSetCommTimeoutsâLÆäCHANGEKIND_SETNAMESêIID_ITypeFactoryáxÆä€stopá”Æä€LANG_SLOVENIANãÀÆä€ERROR_DS_NCNAME_MISSING_CR_REFãØÆä€PROP_SM_CYDLGðÆä €STDMSHLFLAGSé€SQL_HANDLE_STMTâ4Çä"IO_REPARSE_TAG_RESERVED_RANGEHÇäszTitleâlÇäMIXERLINE_TARGETTYPE_AUXáˆÇäChangerTransporté_MONITOR_INFO_2Aá¼Çä ‚child2_ptrë‚_DCBáäÇäƒSetDlgItemIntÈäƒ__RPCNDR_H_VERSION__éƒSERVICE_RUNS_IN_SYSTEM_PROCESSãDÈä„memmoveâXÈä„e32_cpuâtÈä„GetWorldTransformŒÈä„dwFileSubtypeÀÈä.„CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAGÜÈä„_PRINTER_INFO_2Wé„IOLETypes_v0_0_c_ifspecâÉä †atanf@Éä#†SUBLANG_SPANISH_DOMINICAN_REPUBLICãTÉä†DDEPOKEê†IID_IErrorInfoã˜Éä‡szOID_INFOSEC_SuiteAKMandSigáÀÉä‡CERT_STORE_CTL_CONTEXT_FLAGê‡PCERT_CHAIN_ELEMENTâðÉä ˆatanhÊäˆwConvstâ ÊäˆdwStoreProvFlagsá8ÊäˆTapeClassGuidPÊä ˆulSectorSizeá€Êä#ˆIOleLink_GetSourceDisplayName_Stubëˆlptcompâ°Êä‰__TestForErrorãÈÊä ‰CreateFileWâäÊä‰SKF_STICKYKEYSONé ‰SetConsoleCPáËä Šremove_nodesá0ËäŠMCI_SYSINFO_PARMSèŠMCI_ANIM_STATUS_HPALápËä‹?$__num_bits@$0DPPP@áËä‹SHFILEINFO_DEFINEDë ‹pInterfaceã¸Ëä ŒatanlÌËä ŒOF_PARSEáôËäŒERROR_PROTOCOL_UNREACHABLEãÌäŒERROR_CONTROL_ID_NOT_FOUNDã4Ìä ŒCLIP_TO_PATHáPÌäŒHELP_FORCEFILEëŒwireHENHMETAFILEá„Ìä I_UuidCreateá´Ìä%CERT_ACCESS_STATE_WRITE_PERSIST_FLAGéOFN_LONGNAMESàÌäŽ_fastcalløÌä ŽDMPAPER_B5ë ŽInflateRectâ4ÍäSetEnvironmentVariableë DMPAPER_B4ã`ÍäfBinaryâ|ÍätagSTYLESTRUCTã ÍäCertVerifyCRLTimeValidityè'IXMLHttpRequest_setRequestHeader_ProxyãèÍä ‘pvRecordé‘SQLGUIDâÎä’_P_NOWAIT,Îä’EMR_POLYBEZIERã<Îä’_rãTÎä’CTRY_ZIMBABWEpÎä’RpcBindingCopyãŒÎä’_tagBLOB_DEFINEDáœÎä’CD_Ré’_PRINTER_INFO_2AáÔÎä“WAIT_GRANDCHILDâèÎä “capacityáøÎä“_sã Ïä “cElementsè“SQL_API_SQLCOLATTRIBUTEâPÏä”IMAGE_REL_CEF_ADDR64ádÏä”HIBYTEãxÏä”_FILETIME˜Ïä”ReadEncryptedFileRawá¸Ïä”iWindowsEffectMSecãÈÏä”UuidáÜÏä”KP_INFOâÐä”CRYPT_HASH_ALG_OID_GROUP_IDâÐä”oInstè”IRecordInfo_GetName_Stubá\Ðä•EVENT_E_NOT_ALL_REMOVEDâpÐä •DATA_BLOBè%•IXMLDOMNamedNodeMap_get_length_ProxyáÀÐä–DOMAIN_USER_RID_ADMINØÐä –WM_DDE_POKEâøÐä–MAX_VOLUME_ID_SIZEãÑä–SCARD_PCI_RAW<Ñä!–IViewObject_RemoteGetAdvise_Stubá`Ñä–CreateILockBytesOnHGlobalè –SQL_CL_STARTá”Ñä—SCHANNEL_ENC_KEYé—_MONITOR_INFO_2WáÄÑä˜UintToPtrðÑä˜WININETINFO_OPTION_LOCK_HANDLEë˜LockServiceDatabaseâ8Òä™PROCESSOR_ARCHITECTURE_MSILâdÒä™ERROR_DS_NAME_ERROR_NO_MAPPINGãxÒä ™dwDevNumáŒÒä ™HashMaské™SetHelpFileNameâÀÒä šrotate_leftâèÒä"šNdrConformantStringBufferSize ÓäšIID_IForegroundTransferêšcstdlibâ<Óä›SM_CXFIXEDFRAMEâXÓä›vDriverVersionãpÓä ›MMIO_DELETEâœÓä!›IOleAdviseHolder_SendOnSave_Stubé›DROPEFFECT_COPYâÔÓäœdmDisplayFlagsãìÓä œfIncUpdateãüÓäœPulláÔäœSQLRemoveTranslatorê œSQL_C_CHARëERROR_TOO_MANY_MUXWAITERS|Ôäž_CERT_REVOCATION_STATUSâ¤Ôä"ž_GENERIC_BINDING_ROUTINE_PAIRÀÔäžPROXY_SENDRECEIVEäÔäžIID_IRunningObjectTableâÕä*ž__IForegroundTransfer_INTERFACE_DEFINED__èž__IViewObject_FWD_DEFINED__âXÕä ŸCreateFileAâpÕä ŸeMiterLimitêŸSTGTY_STORAGE¼Õä. ??_C?0??what@bad_cast@std@@UBEPBDXZ@4QBDBØÕä tagWAVEINCAPSWãøÕä RPC_C_EP_MATCH_BY_IFáÖä WinExecErrorW,Öä CryptFindOIDInfoáDÖä PROP_SM_CXDLG\Öä VarDateFromI4è SQLRemoveTranslatorWáœÖä¢ERROR_BAD_EXE_FORMATá¸Öä¢PEMRSELECTPALETTEÐÖä ¢MNC_SELECTãðÖä¢szOID_SEARCH_GUIDEë.¢AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARAT×ä#£JOB_OBJECT_MSG_ACTIVE_PROCESS_ZEROã€×ä £COMADMIN_E_APPLID_MATCHES_CLSIDê£PERF_100NSEC_MULTI_TIMERáÀ×ä¤dwMajorVersionãà×ä¤_SYSTEM_POWER_STATUSáø×ä ¤BS_GROUPBOXâØä¤RpcServerUseProtseqAá4Øä¤SHELLEXECUTEINFOá`Øä&¤CMSG_RECIPIENT_ENCRYPTED_KEY_INFOØä*¤CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAG Øä¤Sendé.¤IInternetSession_RegisterMimeFilter_ProxyèØä ¥RevisionâÙä ¥VkKeyScanExâÙä¥_INC_SHELLAPI@Ùä¥CERT_VERIFY_UPDATED_CTL_FLAGádÙä¥JOB_NOTIFY_FIELD_STATUSê¥VarDateFromI1ŒÙä¦xlená°Ùä¦SetEnvironmentVariableAâÈÙä ¦bV4GammaRedâàÙä ¦NUMRESERVEDâøÙä ¦PPOLYTEXTWãÚä¦GetWindowTextLengthAá0Úä ¦CALG_DH_SFãHÚä¦VarDateFromI2è¦StartServiceCtrlDispatcherAâ„Úä§DT_LEFTâ¤Úä§PCRYPT_DECODE_PARAãÐÚä&§SCARD_ATTR_SUPRESS_T1_IFS_REQUESTôÚä§PropSheet_GetTabControlâÛä§DCOM_NONE Ûä §_wireBRECORDé§IME_ESC_QUERY_SUPPORTdÛä¨TRUST_E_PROVIDER_UNKNOWNá„Ûä¨ELEMENT_STATUS_INENABè¨??_7IForegroundTransfer@@6B@áÀÛä©UHALF_PTRÜÛä©SizeOfHeapCommitâÜä©LPCRITICAL_SECTION_DEBUGá(Üä©ERROR_EVENTLOG_FILE_CORRUPTâ@Üä ©NRC_SNUMOUTâdÜä©PERF_DISPLAY_NO_SUFFIXã|Üä©ALG_CLASS_ALLè©SQL_CONVERT_FLOAT¬Üäªcount_oneÀÜäªFARPROCâØÜä ªMENU_EVENTãôÜäªPeekConsoleInputá Ýä ª_GDI_OBJECTê"ªIEnumSTATPROPSETSTG_Skip_StubTÝä«IMAGE_SYM_TYPE_NULLâtÝä«EMR_REALIZEPALETTEë«tagEMRARC˜Ýä ¬execl°Ýä ¬dwMemoryLoadé ¬SM_CYCAPTIONáìÝä­ERROR_DS_DRA_PREEMPTEDã Þä­RPC_DISPATCH_FUNCTION4Þä­CertCreateSelfSignCertificateè­LPPRINTPROCESSOR_INFO_1ê®BINDVERB_CUSTOMâ˜Þä¯SizeOfUninitializedDataê¯_NOTIFYICONDATAWáØÞä°DOMAIN_ALIAS_RID_ADMINSâüÞä°SetEnvironmentVariableWâßä°ERROR_MOD_NOT_FOUNDâ4ßä °PPOLYTEXTAãHßä°VK_ZOOMâhßä°GetWindowTextLengthWáßä°BINDF_NOPROGRESSIVERENDERINGé°StartServiceCtrlDispatcherWâÐßä±TCP_BSDURGENTè±CHANGER_VOLUME_UNDEFINEâ àä ²MEM_COMMITã8àä²ERROR_DS_CANT_REMOVE_ATT_CACHEãXàä²WSA_QOS_EPROVSPECBUFátàä²DEFAULT_CHARSETâ”àä²DM_DISPLAYFREQUENCYâ´àä²RpcServerUseProtseqWáÐàä²IXMLDOMElementë"²SQL_CA2_SENSITIVITY_ADDITIONSáä³_MSL_MATH_CDECLâ0áä³LPNEWTEXTMETRICâLáä³DMPAPER_A4SMALLâtáä³_CERT_STORE_PROV_FIND_INFOãŒáä³_LCID_DEFINED°áä³IEnumMoniker_Reset_Stubê³VAR_DATEVALUEONLYàáä ´_strspnpáâä´ERROR_WINDOW_OF_OTHER_THREADáâä ´ABE_LEFTáHâä´IDataObject_RemoteSetData_Stubë´URLACTION_JAVA_PERMISSIONSã”âäµPBT_APMQUERYSTANDBYFAILED¨âäµCALG_SEALÈâäµCRYPT_VERIFYCONTEXTâàâäµSQL_C_UBIGINTèµSQL_SQL92_REVOKEá ãä ¶execv4ãä¶??_Gbad_typeid@std@@UAE@I@ZâPãä¶MOUSEEVENTF_WHEELhãä¶tagSTICKYKEYS„ãä¶tagWAVEINCAPSAãœãä ¶NRC_DUPNAMEâ´ãä¶WinExecErrorAè¶PFN_CMSG_STREAM_OUTPUTë·CERT_VERIFY_REV_CHAIN_FLAGã ää¸SetUserObjectSecurity8ää ¸CTRY_UKRAINEáHää ¸pHashhää¸??_7IPipeByte@@6B@ã|ää ¸aVarianté&¸ITypeInfo_RemoteGetTypeAttr_ProxyÐää"¹CONVERT10_E_STG_DIB_TO_BITMAPìää¹_NOTIFYICONDATAAáåä¹IID_IOleWindowë¹PSTYLEBUF8åäºEMR_PIXELFORMATâTåäºdwMaxUnscaledXãxåäºRPC_C_AUTHN_LEVEL_CONNECTåä ºBLOBHEADERã åäºLo32éºIDLFLAG_FRETVALâàåä»ERROR_NO_SUCH_PRIVILEGEâüåä»dwMaxUnscaledYë»MCIERR_WAVE_SETINPUTINUSEè¼dispidã`æä ½PSECURITY_CONTEXT_TRACKING_MODEâ|æä½WSAENETUNREACHë½DFCS_SCROLLSIZEGRIPRIGHTáÌæä¾MIXERCONTROL_CT_UNITS_DECIBELSãøæä¾szOID_PKIX_KP_EMAIL_PROTECTIONãçä¾SetVarHelpContextè¾ITypeLib_RemoteIsName_StubãXçäÀ_MSL_THREADSAFEâpçäÀWSA_E_NO_MOREŒçäÀFmtStringOffsetêÀSQL_MAX_DRIVER_CONNECTIONSãÔçäÁERROR_ADAP_HDW_ERRãìçä ÁCTRY_EGYPTãèä ÁWaitMultipleáèä ÁwParamFlagsêÁSQL_CONVERT_INTEGERêÂPAGE_READWRITEãxèäÃMCI_OVLY_SAVE_PARMSWáèä Ãt1_timeoutsâ¨èä Ã_PRIVKEYVER3áÔèä ÃFSCTL_FILESYSTEM_GET_STATISTICSêÃSQL_CURSOR_FORWARD_ONLYâ éäÄDELETEã0éäÄERROR_BAD_THREADID_ADDRâTéäÄMSSIPOTF_E_FILETOOSMALLâhéä ÄPolyDrawá€éä ÄGCLP_WNDPROCá°éä$ÄIInternetZoneManager_LogAction_StubêÄIEnumSTATPROPSTG_Skip_StubãìéäÅCOMSTATâêäÅSKF_HOTKEYSOUNDâ êä ÅDRV_RESERVEDáTêä(ÅSCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNCâtêäÅPSM_ISDIALOGMESSAGEêÅSQLGetTypeInfoWâ¨êä Æguard_backãÌêäÆFEATURESETTING_PROTOCOLâèêäÆDLGC_RADIOBUTTONáëäÆCAL_SERASTRINGëÆDRVCNF_OK0ëä ÇLPMMCKINFOãHëä Çncb_lengthãdëäÇszOID_RSA_dataãŒëäÇCryptFreeOIDFunctionAddressêÇURL_OID_GET_OBJECT_URL_FUNCâØëäÈDdeCreateStringHandleWëÈIRpcStubBuffer_Connect_Proxyáìä ÉMinorVersioná8ìäÉSetColorAdjustmentãTìäÉSWP_SHOWWINDOWãlìäÉMAP_FOLDCZONE„ìäÉEncryptedHash¨ìäÉ_GET_CHANGER_PARAMETERSê)É__ISynchronizeHandle_INTERFACE_DEFINED__âíäÊERROR_CONNECTION_INVALIDáíäÊAsciiChar@íä&ÊMIXERLINE_COMPONENTTYPE_SRC_FIRSTxíä-ÊCRYPT_ENCODE_NO_SIGNATURE_BYTE_REVERSAL_FLAGéÊulCntChar¬íäËTIMER_MODIFY_STATEãÈíäËNPPCMWAVEFORMATâäíäËAUXCAPS_CDAUDIOêËICreateTypeInfo_SetMops_ProxyèÌCommDlg_OpenSave_GetSpecAPîäÍCLIENTFEATURES_2008âpîäÍDC_DATATYPE_PRODUCEDá”îäÍLCMAP_TRADITIONAL_CHINESE¨îä ÍPF_CCITTéÍImmGetCandidateWindowðîäÎERROR_DEPENDENCY_NOT_FOUNDãïä ÎKLF_REORDERâ,ïäÎPERF_COUNTER_TIMER_INVãDïä ÎlpVendorInfoá\ïä ÎKP_PREHASHãxïäÎParseDisplayNameá”ïäÎIsAsyncMonikerë ÎSQL_SUCCESSâÀïäÏERROR_CRCàïäÏwaveOutPrepareHeaderáøïä ÏdwDeviceIDëÏMCI_OVLY_WINDOW_STATEèÐSETWALLPAPER_DEFAULTéÑSetZoneCustomPolicyâhðä Òatan2ŒðäÒ_SYSTEM_AUDIT_OBJECT_ACEá ðäÒs_impnoêÒSQLTablePrivilegesãèðäÓEVENT_E_INVALID_PER_USER_SIDáñäÓPNONCLIENTMETRICSñä ÓpUsageParaëÓSQLGetTypeInfoAâXñäÔPAN_ARMSTYLE_INDEXãhñäÔeventè ÔCERT_SYSTEM_STORE_LOCAL_MACHINEâ´ñäÕBasicLimitInformationÜñä"ÕJOB_OBJECT_LIMIT_PROCESS_TIMEôñä ÕlpfilenameãòäÕMCI_OVLY_SAVE_PARMSAáDòä&ÕCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARAèÕSQL_SP_ISNULL|òäÖFileTimeToSystemTimeé ÖSTM_MSGMAXã¼òä×RPC_S_NOT_ALL_OBJS_EXPORTEDâÔòä ×NPMMCKINFOãìòä ×LittleEndianáóä ×IProgressNotify_OnProgress_Stubâ@óä"×__IUrlMon_INTERFACE_DEFINED__dóä×PSD_ENABLEPAGESETUPHOOKê×LPENUM_SERVICE_STATUSœóä ØAveragePPMã¼óäØURLACTION_JAVA_MAXë ØPIDMSI_OWNERáèóäÙTIME_MIDIôäÙRPC_C_VERS_EXACTéÙReadFmtUserTypeStgã@ôäÚPGENERIC_MAPPINGálôäÚICreateTypeInfo_SetSchema_Stubãœôä#ÚIPersistMoniker_SaveCompleted_Stubã¼ôäÚ??_7ISoftDistExt@@6B@èÚCommDlg_OpenSave_GetSpecWøôäÛbinary_searchè Û_WINDEF_éÜLPSAFEARRAY_UserUnmarshalDõä ÝSetCursorè ÝHDDEDATA__ãxõäÞDRAGDROP_S_FIRSTá˜õäÞEMR_INTERSECTCLIPRECT¼õäÞDdeCreateStringHandleAãÔõä ÞidldescTypeêÞODBC_REMOVE_DRIVERë.ß__IRunningObjectTable_INTERFACE_DEFINED__LöäàPIMAGE_RESOURCE_DIRECTORYxöäàDNS_ERROR_RCODE_SERVER_FAILUREãŒöä àelfMatchéàFO_COPYâ¸öä áStorageClassáÐöäáFatalAppExitAèöä áVIEW_E_DRAWâ÷äáGetColorAdjustmentã÷äáJOYCAPSâ8÷äá_MONITOR_INFO_1Aé!áIXMLDocument2_get_fileSize_Proxyá|÷ä âMoveFromSlotéâGL_LEVEL_ERRORã¸÷äãKP_EFFECTIVE_KEYLENâÔ÷äãpTrustListInfoëãLPSAFEARRAY_UserMarshalâøääSetCurrentDirectoryâ@øä"äRPC_S_UNSUPPORTED_NAME_SYNTAXdøääNdrVaryingArrayUnmarshall€øää_PRINTER_INFO_1WéäDeleteãÀøäåACCESS_ALLOWED_OBJECT_ACE_TYPEãàøäåUIRestrictionsClassâøøä åGMEM_SHAREëåImmSetCandidateWindow,ùäæWCHAR_MIN<ùäæSelféæAsyncIMultiQIlùä çPOINTER_64ã„ùä çChangeMenuëçtagCLIENTCREATESTRUCTÄùäèabnormal_terminationáäùäèERROR_NOT_SAME_DEVICEüùä èDMPAPER_A3ãúäèRT_FONTâ0úäèODBC_REMOVE_SYS_DSNê èSQL_CODE_DAYálúäéSTATUS_ABANDONED_WAIT_0â„úä éDMPAPER_A2ã¨úäéRpcServerUseProtseqEpExAééNDRSContextMarshallExøúä#êIS_TEXT_UNICODE_REVERSE_STATISTICSëêMENUITEMTEMPLATEHEADERã<ûäëERROR_DS_GC_REQUIREDáXûäë_CRYPT_URL_ARRAYá|ûäëSQL_CONVERT_LONGVARCHARêëSQLForeignKeysWâ¬ûäìwcsncpyâÔûäìCRYPT_LAST_ALG_OID_GROUP_IDêìPRINTER_STATUS_NOT_AVAILABLEáüäíLZStartâ(üä íMIXERCAPSWã8üäíatimeèíIDataObject_DUnadvise_Proxyâxüäî_STATIC_FILES”üäîEXT_DEVICE_CAPSâ¬üä îDMPAPER_A5ãÄüä îWM_SETCURSORáÜüäîWSANO_ADDRESSüüäîPIDSI_DOC_SECURITYëîdwRequiredSizeë ïDMPAPER_A4ãPýäðSCARD_E_CANT_DISPOSEá`ýäðHDWPáˆýäðMIXERCONTROL_CONTROLTYPE_MUXá°ýäðPSTORAGE_BUS_RESET_REQUESTëðCLSID_DOMDocumentäýäñconst_pointerþäñ__iterator2pointerã,þä"ñERROR_SUCCESS_REBOOT_REQUIREDLþäñWSAESOCKTNOSUPPORTãlþäñLOCALE_SINTLSYMBOLãŒþäñMCI_ANIM_INFO_TEXTã¬þäñIOCTL_DISK_LOAD_MEDIAÐþäñTransmissionRetryTimeouté ñdwActualSizeáÿä òERROR_DS_DRA_SOURCE_REINSTALLEDâ(ÿäòKP_KEYVALTÿä!òNdrNonConformantStringUnmarshallápÿäò_ROTFLAGS_DEFINEDŒÿäò_PRINTER_INFO_1AéòIID_IOleInPlaceActiveObjectâÈÿäó__io_procàÿä óSecondEmptyâäóDRAGDROP_S_USEDEFAULTCURSORSáäóWM_UNDOâ0ä óFO_DELETEè*óCERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAGˆäôSECURITY_WORLD_SID_AUTHORITYá¤äôMapViewOfFileExâ´ä ôEventÌä ôncb_lana_numáää ô_WINSPOOL_ëôLPFINDREPLACEäöSPLDS_PRIORITYëöIEnumFORMATETC_Clone_StubTä÷FatalAppExitWlä ÷PCMSG_ATTRë÷_MONITOR_INFO_1Wá¤äøSHFileOperationêøSQL_SCOPE_SESSIONÔä ùDrawTextáìäùVTBIT_DECIMALèùIME_PROP_SPECIAL_UIâ äú_MSL_C9X_<äúwNullCharDetectedè$úStgOpenAsyncDocfileOnIFillLockBytesâ”äûRTL_CRITICAL_SECTION_DEBUGã¬ä ûMIXERCAPSAãÈäûSEE_MASK_HMONITORèûCRYPT_MODE_OFBãä!üERROR_REPARSE_ATTRIBUTE_CONFLICTá4äüERROR_CTX_SHADOW_DENIEDâLä üSW_MINIMIZEâhäüCF_PRIVATELASTã€äüALG_CLASS_ANY”ä üHMAC_INFOèüAsyncIPipeByte_Begin_Push_StubãØä ýwrite_procãìäýspliceãäýTokenSessionIdã ä ýIDI_ASTERISKá@äýSetContainedObjectã\äýSQL_PARAM_IGNOREéýSQLForeignKeysAâœäþRPC_S_INVALID_RPC_PROTSEQ´ä þve_valuenameáÌä þgrfKeyStateêþIID_IPersistMonikerâäÿRpcServerUseProtseqEpExWéÿOnObjectAvailable<å@7101éGetImplTypeCustDataâlä @7100ŒäSPI_SETKEYBOARDDELAYéCONSOLE_SCREEN_BUFFER_INFOãÄä @7103Ôä HTASKääccë UI_CAP_2700â0ä.?$basic_istream@_WU?$char_traits@_W@std@@@ä @7102|ä/_JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATIONã¨äIMAGE_REL_ALPHA_INLINE_REFLONGã¸äcbãÔäCallNamedPipeAë??_7IOleClientSite@@6B@âä @7105 äEMRPOLYLINETO4äHTLEFTãLä hItemHandleâpäCreateConsoleScreenBuffer¤ä(MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZERâÐäGET_CERT_UNICODE_RDN_ERR_INDEXãôäURLMON_OPTION_USERAGENTêPROPSETFLAG_NONSIMPLEHä.?$basic_ostream@_WU?$char_traits@_W@std@@Xä @7104|ä__scaled_random_numberã¨äIMAGE_SEPARATE_DEBUG_SIGNATUREã¼äuuid_tãØäASYNC_STGMEDIUMâøäNODE_DOCUMENT_TYPEëURLACTION_COOKIES$ ä @7107L äPROCESSOR_ARCHITECTURE_ALPHAáh äSCS_OS216_BINARYéIXMLDOMNode_put_nodeValue_Stubã¼ äSYSYNC_MAIN_VERSION_STRINGãÌ ä @7106è ätagICONMETRICSAâ äMCI_DEVTYPE_FIRST_USERë$IOleInPlaceObject_UIDeactivate_StubâL ä @7109| ä$PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY☠äWM_STYLECHANGED⸠äMCI_ANIM_PLAY_SPEEDêRpcNsEntryExpandNameWè ä @7108 ä GetProcessAffinityMaskë IXTLRuntimeâ8 ä vswprintfH ä @6913d ä PIMAGE_VXD_HEADER| ä IsCharAlpha✠ä SPI_SETHIGHCONTRASTâ´ ä VIF_WRITEPROTÈ ä fsActioné fractionáü ä _ACCESS_DENIED_ACEã ä ISPTR$ ä NRC_NOCALLã8 ä TYSPECë LPPRINTER_INFO_7Aˆ ä. ?$basic_fstream@_WU?$char_traits@_W@std@@œ ä WSADATAê SQL_CA1_LOCK_EXCLUSIVEë SUBLANG_SPANISH_URUGUAYâü ä__RPC_WIN32__è#__IRootStorage_INTERFACE_DEFINED__ã@ änTrackPos\ äLPREGISTERWORDAêIMN_CLOSECANDIDATEã” ä _strnicoll㤠älen1á´ äa1ãÔ äIDLE_PRIORITY_CLASSâð äPSM_INDEXTOHWNDâ ä$__IWaitMultiple_INTERFACE_DEFINED__âDäAllowForegroundTransferêITypeMarshal_Unmarshal_StubâˆäMEMORYSTATUSEXã¨äGetSystemDirectoryãÌäNTE_PROV_TYPE_NO_MATCHãèätagICONMETRICSWêIXTLRuntime_depth_Stubãäa3ã,äcsãdä,__IXMLDOMImplementation_INTERFACE_DEFINED__êcElemsãˆälen2á˜äa2ã´äFILE_SHARE_WRITEáÈäcchBufferèäCLIP_DEFAULT_PRECISâäPBT_APMBATTERYLOWè__IMalloc_FWD_DEFINED__âPäIMAGE_REL_BASED_MIPS_JMPADDRáhä DLGC_STATICê EncryptedKeyá”äS_SERDVNA°äCallNamedPipeWãÈä bV4BitCountâØäyExté XST_DATARCVDâäcwãä NULLREGIONã8äRegisterWindowMessageLä MK_SHIFTápäDestroyAcceleratorTableâ”äSPI_GETNONCLIENTMETRICSâ°äCMSG_CTRL_DEL_CRLèCompressionRatioReadsôäERROR_DS_RANGE_CONSTRAINTè val_buff_ptráäcyã@äSPI_ICONVERTICALSPACINGâTäPD_5_RWê%__MIDL_itf_urlmon_0188_v0_0_c_ifspecá”äcxã¬äInvalidateRgnèLPREGISTERWORDWâÜäV_CYREFâøäIMN_SETOPENSTATUSèSQL_LOCK_TYPESã,ä MM_ISOTROPICáTä"MIXERCONTROL_CONTROLTYPE_MONOhä dwActioná˜ä$ICreateTypeLib_SaveAllChanges_Proxyê LPMETHODDATAéICreateTypeLib_SetName_Stubâä/PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATIONã(äCC_NONEâ8ärclâLä pfxStartéLPPRINTER_INFO_7W€ä not_this_oneá äMETA_SETPOLYFILLMODEá´ädwValueâÔäRpcNsEntryExpandNameAèFinish_AddRefäERROR_TOKEN_ALREADY_IN_USEã4äCERT_STORE_ADD_NEWë ActualCountâ\ä @7111|ä RTS_CONTROL_HANDSHAKE˜ä DISP_E_DIVBYZEROá°ä LPMIDIINCAPSé GetClientSiteÜä !isxdigitáìä !@7110 ä!TOKEN_QUERY_SOURCEã ä!MF_HELPâ8ä !IID_IMonikeré!MDM_PROTOCOL_V110_28DOT8Klä "@7113„ä"GetBrushOrgEx”ä "htask°ä"URLDownloadToFileè"MDM_PROTOCOL_V120_56Kää #LONG_MAXáôä #@7112$ä%#IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTORáXä*#IXMLDOMDocument_get_validateOnParse_Proxyè#SQL_API_SQLENDTRANãˆä $@7115 ä $second_falseá¼ä$XST_EXECACKRCVDâÔä$DdeAccessDataáä $MIXERCONTROL_CONTROLTYPE_TREBLEâ$ä$RPC_NCA_FLAGS_IDEMPOTENTáHä$PKCS_SMIME_CAPABILITIESê$MDM_PROTOCOLID_ANALOGxä %@7114œä%ERROR_DS_NO_SUCH_OBJECTâ´ä %ve_valuelenê%MDM_SHIFT_PROTOCOLINFOãèä&@7117è"&szOID_INFOSEC_mosaicIntegrity ä'@7116è'LPOSVERSIONINFOEXWãPä (@7119pä(LPSYSTEM_POWER_STATUSè (LPDISPATCHã˜ä )@6900¨ä )@7118Èä)SPI_GETKEYBOARDDELAYé )IXMLDOMNamedNodeMap_reset_Proxyâ ä*WaitCommEvent(ä*_DISPLAY_DEVICEWá@ä *MIXERLINEAã\ä*MCI_VD_SPIN_UPãtä*byte_from_ndrˆä *ppunkValé!*INET_E_CANNOT_INSTANTIATE_OBJECTáÐä+tagWAVEOUTCAPSAâüä"+CRYPT_X942_KEY_LENGTH_BYTE_LENGTHè+SZ_URLCONTEXT4ä,SYSER_VARIANT_CODEãTä,UNIVERSAL_NAME_INFOâxä,RpcBindingSetAuthInfoExAé,FR_MATCHALEFHAMZA°ä-SCARD_S_SUCCESSâÄä-iActiveâÔä -JobIdðä-PROVIDOR_INFO_1Wé-AddressOfMemberâ(ä.ETO_GLYPH_INDEXâ<ä.bReserved\ä.tagMEASUREITEMSTRUCTátä .szOID_MEMBERáˆä.aRecordâ´ä .CommDlg_OpenSave_GetFolderPathWê.SQL_UNICODE_LONGVARCHARâèä/mblenáä/PAGE_NOACCESS(ä/ERROR_DS_UNKNOWN_OPERATIONë/SCARD_W_UNSUPPORTED_CARDápä0FILE_NOTIFY_INFORMATIONâ„ä 0IsZoomedáœä 0BN_SETFOCUSâ´ä 0NPMIDIINCAPSáÔä0RPC_NCA_FLAGS_MAYBEê0SHGFI_LINKOVERLAYä1LPOSVERSIONINFOEXAã0ä1STARTF_USEPOSITIONãPä1GetLastActivePopupãhä 1DDE_FACKREQâ|ä1VT_UI1ã¤ä1IStorage_OpenStorage_ProxyãÔä%1IAsyncRpcChannelBuffer_Receive_Proxyé 1VarDecIntáä 2wSuiteMaskãä 2_WINNLS_é2VT_UI2ãLä3ERROR_CANNOT_IMPERSONATEé3ExtEscape€ä4SUBLANG_ARABIC_OMANâ”ä4VT_UI4ãÄä#4__IEnumUnknown_INTERFACE_DEFINED__ë4COINITãèä5xExtá ä5SetStretchBltMode, ä5URLACTION_NETWORK_CURR_MAXë5SQL_API_SQLSTATISTICS` ä6dmScaleâ| ä6DM_PANNINGWIDTH☠ä6CONNECTDLGSTRUCTé6WAVECAPS_LRVOLUMEÈ ä7DC_DUPLEX!ä27CRYPT_UNICODE_NAME_ENCODE_ENABLE_T61_UNICODE_FLAGè7USER_MARSHAL_FC_FLOAT4!ä8byãT!ä8SORT_KOREAN_UNICODEâx!ä8MESSAGE_RESOURCE_UNICODEáœ!ä8CreateIconFromResourceExáÀ!ä8PCRYPT_SEQUENCE_OF_ANYãä!ä8sz_CERT_STORE_PROV_SYSTEMø!ä8VT_UI8ã0"ä.8IInternetZoneManager_SetZoneActionPolicy_Stubè 8CommDlg_OpenSave_GetFolderPathAâl"ä9bxã”"ä9ERROR_CANT_DELETE_LAST_ITEMâ¬"ä9CloseMetaFileÔ"ä9IRpcChannelBuffer3_Send_Stubé9IHttpNegotiateã#ä:RpcBindingSetAuthInfoExWá8#ä:CryptEnumProviderTypesë:IViewObject_Draw_Stubt#ä;VerifyVersionInfoˆ#ä ;FIOASYNCá¤#ä;PROVIDOR_INFO_1Aé;SQL_CVT_DECIMALâà#ä<SUBLANG_SYS_DEFAULTâü#ä<_DISPLAY_DEVICEAá$ä<LOCALE_IDIGITSã8$ä<CFERR_CHOOSEFONTCODESP$ä <MIXERLINEWãl$ä<MKSYS_FILEMONIKER|$ä<wCodeè <OFN_EXPLORERá¬$ä=PURGE_TXABORTÈ$ä=tagWAVEOUTCAPSWê=IID_IMarshal2ð$ä>c_ã%ä>PAN_LETT_NORMAL_ROUNDEDâ0%ä>WS_TILEDWINDOWãH%ä>MS_SCARD_PROV|%ä)>IXMLHttpRequest_get_responseStream_Proxyé">BSCF_AVAILABLEDATASIZEUNKNOWN¸%ä?HSTR__ãÌ%ä ?JOB_READé?VarUintFromIntãø%ä @@7121&ä@WM_LBUTTONDBLCLKá(&ä@PC_5_WOâ<&ä @BOOKMARKé@SQL_CVT_WVARCHARáh&ä A@7120ˆ&äA_IMAGE_NT_HEADERS64â &äAGMEM_MOVEABLEÈ&äACOMADMIN_E_ALREADYINSTALLEDâô&ä ADISPLAY_DEVICE_MIRRORING_DRIVERâ'ä ANPAUXCAPSè/AIInternetSecurityManager_GetZoneMappings_ProxyãT'ä B@7123x'äBGetOpenClipboardWindowã”'äBMenuItemFromPoint¬'ä BPMIDIINCAPSAáÌ'äBUSER_MARSHAL_FC_BYTEáì'äB_wireSAFEARRAY_UNIONáü'äBCACêBSQLULENâ (äC@7122èCbV4CSTypeD(ä D@7125d(äDSCARD_W_CHV_BLOCKEDâ€(äDMKF_HOTKEYSOUNDâ˜(ä DLOCALE_SLISTáÀ(äDPERF_PRECISION_OBJECT_TIMERêDCMSG_ENCRYPTED_ENCODE_INFOãü(äEwcssetã )ä E@71240)äEIMAGE_REL_MIPS_JMPADDR16áD)äEMM_TEXTât)ä#E_CMSG_RECIPIENT_ENCRYPTED_KEY_INFOã )ä"ECERT_VERIFY_ALLOW_MORE_USAGE_FLAGèENODE_PROCESSING_INSTRUCTIONâØ)ä F@7127ì)ä FDataTypeâ*ä FFS_JOHABá*äFhmenuNext4*äFMCI_ANIM_PLAY_REVERSEèFIID_IEnumSTATPROPSETSTGâh*ä G@7126|*äGDM_DUPLEX”*äGPEMRSETPIXELV°*äGHSHELL_LANGUAGEâÌ*äGCreateMDIWindowWáô*äGIStorage_SetStateBits_Stubã+äGURLPOLICY_DISALLOWë GOFNOTIFYEXAâ@+äH__int8ãP+ä H@7129h+ä HCreateHitsã€+ä HtagSYSKINDãœ+äHulavrPacketSizeêHCAIâ¼+ä I@7128Ü+äIIMAGE_SYM_ABSOLUTEä,äIERROR_WAIT_NO_CHILDRENã,ä ILPWINDOWPOSâ0,ä ISCardStateãH,äIPROPSHEETPAGEx,ä#ISPLREG_RESTART_JOB_ON_POOL_ENABLEDëICAHâ¤,äJRemoveDirectoryâÀ,äJLGRPID_SUPPORTEDáØ,ä JVFT2_UNKNOWNáð,äJRegSetValueEx-äJLPMIDIINCAPSWè JEndMonitorã<-äKPEMRRESIZEPALETTEX-äKLPPRINTER_INFO_5A„-ä!K__IPSFactoryBuffer_FWD_DEFINED__éKSetObjectRectsã¸-ä LFreeResourceáÜ-äLRPC_S_INTERFACE_NOT_FOUNDü-äLNTE_FIXEDPARAMETERã.ä LUP_WORD_BLOBéLSQL_INTERVAL_MONTHãL.äMPEMRINVERTRGNd.ä Mi64NumItemsâ”.ä%MCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARAá°.äMPROVIDOR_INFO_2WáÀ.äMCALêMCF_FORCEFONTEXISTø.äNFACILITY_WIN32ã/äNPMCI_WAVE_OPEN_PARMSáD/ä!NGET_CERT_UNICODE_VALUE_ERR_INDEXéNpMsgé OKF_DLGMODEã|/äPc1ã”/äPGetBoundsRect¨/äPWC_DIALOGÀ/äPFreeDDElParamÔ/ä PXST_NULLâ0äPI_RpcBindingInqDynamicEndpointë PpvFindParaã(0äQapã<0ä QCBR_2400áX0äQCreateMDIWindowAáh0ä QVT_R8˜0ä$QIInternetThreadSwitch_Continue_Stubâ°0ä QOFNOTIFYEXWêQMDM_V110_SPEED_19DOT2Kãè0äRPO_RENAMEø0äRc3ã1ä R_userHBITMAPéRSQL_SR_SELECT_TABLEâ@1äSc2ãd1äSDBG_EXCEPTION_NOT_HANDLED„1äSLOCALE_STIMEFORMATãœ1ä SNRC_SABORTã´1äSrgCertEncodedÐ1äSSERIAL_LSRMST_MSTèSIOleInPlaceFrameá2äTFILE_ATTRIBUTE_SPARSE_FILEã,2äTCloseEventLog<2ä TiTypeT2äTpalNumEntriesl2ä TPMIDIINCAPSWá|2äTc5ëTPUREá 2ä U__n64_osá°2äUatãÈ2ä Une_cmoventãø2ä*UMIXERLINE_COMPONENTTYPE_DST_UNDEFINED3äUc4ëUFILE_DEVICE_PARALLEL_PORT\3ä#VERROR_DS_NOTIFY_FILTER_TOO_COMPLEXã|3äVRpcNsGroupMbrInqDoneéVc7ã¤3ä WS_PERIOD512êWc6ãÌ3äXdmOrientationü3ä%X__MIDL_itf_urlmon_0189_v0_0_c_ifspecéXSQL_COLUMN_LABELá04äYCertOpenStore@4äYc8ãh4äYIXMLHttpRequest_abort_ProxyâŒ4äYCFSTR_MIME_X_REALAUDIOë YOleConvertIStorageToOLESTREAMExâÐ4ä ZUpperIndexëZSCARD_ATTR_CHARACTERISTICSã5ä[AlternateVolumeID05ä[PROVIDOR_INFO_2Aé [SQL_NC_ENDã`5ä\LPMIDIINCAPSAè\CryptHashDataˆ5ä]NULLá˜5ä ]VT_R4¬5ä]ByNameë]LPPRINTER_INFO_5WÜ5ä^hInstanceô5ä ^hStdOutputã6ä^DMPAPER_ENV_PERSONALá06ä^SetMetaFileBitsExD6ä ^pCrlInfoád6ä^SCardListReaderGroupsè0^IInternetHostSecurityManager_GetSecurityId_Stubâ´6ä_ostreamâÈ6ä_MHDR_DONEÜ6ä _X509_BITSè_OleCreateLinkFromData7ä`IsArrayâ 7ä `@692907ä `@7131H7ä`GetKBCodePaged7ä`PADDJOB_INFO_1Wâ€7ä`SQL_INTERVAL_HOURè`SQL_CCOL_CREATE_COLLATION¼7äa_EM_UNDERFLOWÌ7ä a@6928Ü7ä a@7130ü7äaLPMIXERCONTROLDETAILS8äaALG_SID_SKIPJACKé astgmedDataã@8ä b@7133\8äbdwSettableBaudãx8äbSCardListReaderséb__IStorage_INTERFACE_DEFINED__ã´8ä c@7132à8ä cJOB_OBJECT_SECURITY_VALID_FLAGSêcSERVICE_DESCRIPTIONâ9ä d@7135(9ä dCTRY_BAHRAINáH9ädWNetGetUniversalNameá`9ä dXST_POKESENTá„9ädPPRINTER_NOTIFY_OPTIONSê dIXMLDOMDocument_nodeFromID_StubâÀ9ä e@7134Ô9äepBufferêeHISTOGRAM_BUCKET_SIZE:ä f@7137 :äfftCreationTimeãH:äfRPC_S_NO_PROTSEQS_REGISTEREDéftagMCI_ANIM_STEP_PARMSã|:ä gsqrtfŒ:ä g@7136¤:ä gTOKEN_WRITEâÌ:ägRpcServerRegisterAuthInfoWãü:ä%gPCERT_REGISTRY_STORE_CLIENT_GPT_PARAégXMLHTTPRequestã,;äh_wcsrevâ<;ä h@7139\;ähPAN_FAMILY_DECORATIVEp;ähPT_LINETOˆ;ä hLPD_STEREOã ;ä hBSF_NOHANGëhIOCTL_SMARTCARD_CONFISCATEãØ;ä i@7138ì;äiXoffLimê"iCERT_NAME_STR_NO_QUOTING_FLAG(<äjsetlocaleH<äjTAPE_DRIVE_FILEMARKSá`<ä jRPC_E_RETRYâˆ<äjPEMREXTCREATEFONTINDIRECTWã¤<äjCTRY_PUERTO_RICOáÈ<äjDeletePrinterDriverExAëjIStream_Stat_Stubø<ä kLPCRECTLá=äkotmsStrikeoutPosition0=ä kCP_INSTALLEDá\=ä kMIXERCONTROL_CONTROLTYPE_SLIDERâ„=äkCERT_KEY_CERT_SIGN_KEY_USAGEá =äkLPPRINTER_INFO_4AèkDeletePrinterØ=älERROR_RESOURCE_ONLINEá>älERROR_DEPENDENCY_NOT_ALLOWEDá>älGetICMProfile4>älcStoreProvFuncãX>älFUNCFLAG_FDEFAULTCOLLELEMèlSQL_CATALOG_NAME_SEPARATORã>ä msqrtl¨>ämERROR_TIMEOUTèmPAN_MIDLINE_LOW_SERIFEDâÜ>än@6927ènPMSGáü>ä o@6926 ?äoIMAGE_REL_ALPHA_SECRELHIáMSSIPOTF_E_OUTOFMEMRANGEá ­ä >VK_F7¸­ä>SC_NEXTWINDOWЭä >CTRY_QATARãè­ä >LPTYPELIB2ä®ä >get_lengthë>SQL_ALL_EXCEPT_LIKEâ@®ä?TOKEN_DEFAULT_DACLã\®ä?GlobalDeleteAtomáx®ä?SetPaletteEntriesˆ®ä ?VK_F6¬®ä?CRYPT_DECODE_NOCOPY_FLAGáÄ®ä ?F5_180_512ë ?SPLDS_FLAGSâø®ä@GetExitCodeThread¯ä@LPTTPOLYCURVE,¯ä@WM_MBUTTONDBLCLKáL¯ä@get_validateOnParseê @SQLDrivers〯äAEM_SETLIMITTEXT☯ä ACapabilitiesá°¯ä A_CRL_ENTRYë$ACRYPT_VERIFY_CERT_SIGN_ISSUER_CHAINêBSOFTDIST_ADSTATE_AVAILABLEã°äC_lseekã8°äC_RGNDATAHEADERãP°äCLR_MONOCHROMEl°äCEnumCalendarInfoá„°ä CNPTIMECAPS㜰ä CAF_IMPLINKã´°äCPCCRL_CONTEXT̰ä CtagSTATSTGãä°ä CDISCARDCACHEéCSetFuncCustDataâ±äDalloc_ptr_refèDMCI_CUEâ<±äEidã\±äELOCALE_INEGSEPBYSPACEt±ä ERpcEndExceptሱäEs_hostã´±ä&EszOID_CERT_POLICIES_95_QUALIFIER1رäECERT_QUERY_CONTENT_CTLãð±ä EVARIANT_BOOLéEsizelèFMulDivã0²äGFLT_MIN_10_EXPãH²äGMB_RTLREADINGh²äGSCARD_ATTR_MAX_IFSDêGSQL_CODE_HOUR”²ä HlcsIntentèHIID_IThumbnailExtractorâà²ä"I_MSL_CMATH_DEFINED_MATH_ITEMSü²äINumberOfSymbolsâ ³äIMCI_GETDEVCAPS_HAS_AUDIOá4³ä IpAuthInfoèICLSID_CCDScrollBarãx³äJGetPrivateProfileSectionWèJPEMRSELECTCOLORSPACEá´³äKMCI_MODE_RECORDêKIOCTL_DISK_HISTOGRAM_DATAð³äLReadEventLogA´ä"LERROR_DS_NONEXISTENT_POSS_SUP<´äLIOCTL_STORAGE_RESET_BUSâX´äL_userSTGMEDIUMãx´äLwireASYNC_STGMEDIUMêLget_URLâ ´ä MLC_CTYPEá°´äMceiláØ´ä"MSTATUS_FLOAT_DENORMAL_OPERANDô´äMPSYSTEM_ALARM_ACE µäMRtlMoveMemory(µäMMETA_POLYPOLYGONáHµäMSZDDESYS_ITEM_HELPã`µä MlpFileList㈵äMCMSG_HASHED_DATA_CMS_VERSIONéM??_7IPipeLong@@6B@ëNcreateTextNodeãصäOSB_PAGEUPôµäOWVR_ALIGNRIGHTã¶äOinë+OCERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBEDã`¶äPIMAGE_SNAP_BY_ORDINAL64â„¶äPIMAGE_DEBUG_TYPE_FIXUP㤶äPSTARTF_USECOUNTCHARSáÀ¶äPAddAuditAccessAceܶäPFACILITY_SCARDã·äPERROR_DS_DRA_ACCESS_DENIEDëP__DOMDocument_FWD_DEFINED__â<·äQ_dupáP·äQwcscmpãl·äQOF_SHARE_COMPATâ”·äQ_BY_HANDLE_FILE_INFORMATIONêQHC_ACTION¸·äRisãØ·äRSID_AND_ATTRIBUTESãì·ä RAutoLoadé RDNS_REGISTERá,¸äSERROR_SCREEN_ALREADY_LOCKEDê SLPTIMECAPSãX¸ä T_wcsspnpát¸äTDCBA_FACEUPNONEê TFADF_STATIC⤸ä Ufrac_digitsâ´¸äUbitâĸäUleftáÔ¸äUSIDâø¸äUERROR_NO_MEDIA_IN_DRIVEâ ¹äUMCI_CUTâ4¹äUCMSG_ENVELOPED_ENCODE_INFOëU_CHANGER_SET_POSITIONx¹äVGetUserObjectInformationá ¹äVRESOURCEDISPLAYTYPE_NETWORKâ̹ä!VCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRáì¹äVIExternalConnectionâºäVOnLinkSrcChangeêVV_DECIMAL@ºäWSPAPI_E_NO_DEVICE_ICONë WihPenpºäXERROR_INVALID_LIBRARY˜ºäXIXMLDocument2_put_async_ProxyèXMDM_PROTOCOLID_DEFAULTãغäYWS_EX_RTLREADINGáôºäYWS_EX_LTRREADINGá»äYCB_SHOWDROPDOWNâ@»ä%YIRunnableObject_GetRunningClass_StubéYSQL_C_INTERVAL_MINUTEx»äZReadEventLogWŒ»ä ZSM_CXEDGEè#ZIBindCtx_RemoteGetBindOptions_StubãÜ»ä[SPAPI_E_DI_NOFILECOPYè.[IXMLDOMDocument_put_validateOnParse_Proxy(¼ä \PCRE_STATICâL¼ä\__copy_longs_rev_alignedáp¼ä\GetPrivateProfileSectionA˜¼ä\MCIERR_INVALID_DEVICE_NAMEë\ncb_stoâ¼¼ä ]FLOATؼä]PRGNDATAHEADERãì¼ä]GWL_STYLE½ä%]szOID_PKCS_12_KEY_PROVIDER_NAME_ATTRé]PARTITION_XINT13_EXTENDEDT½ä ^HKL_NEXTé^PRINTACTION_OPENNETPRNã½ä_REGEX_SUPPORT¨½ä _gethostnameâнä_CRYPT_ENCRYPT_MESSAGE_PARAã¾ä2__AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA4¾ä _ICancelMethodCalls_Cancel_ProxyâX¾ä_BINDSTATUS_ACCEPTRANGESê_MDM_MASK_HDLCPPP_SPEED㜾ä`ERROR_DS_SERVER_DOWNé`NdrClientInitializeNewãè¾ä"aOSS_COMPARATOR_DLL_NOT_LINKED¿äaLPNONCLIENTMETRICSAâ(¿äaLOCALE_RETURN_NUMBERá@¿ä aMM_WIM_DATAâ`¿äamciGetErrorStringAã|¿äaPMIDL_XMIT_TYPE✿äa_STORAGE_MEDIA_TYPE⼿äaPRINTER_ENUM_VALUESWé$aIXMLDOMDocument_get_readyState_Stubâü¿äbrhsâÀä b_DOCINFOAèbNdrByteCountPointerMarshallâ\ÀäcIMAGE_RESOURCE_DIRECTORYápÀä cS_NORMALá”ÀäcNMPWAIT_USE_DEFAULT_WAITá¬Àä cREASON_OTHERáÄÀä cSetVersionëcPSD_ENABLEPAGESETUPTEMPLATEãÁädgeteuidâ(Áäd__IBlockingLock_FWD_DEFINED__è#dIOleInPlaceUIWindow_GetBorder_StubãhÁä eSIZEL€Áä eWSAEISCONNã˜ÁäeFinish_OnSave°Áä e__oleidl_h__éeSQL_QUIET_MODEãðÁäfEXCEPTION_NONCONTINUABLEá ÂäfPAN_CONTRAST_HIGH Âä fDrawStateèfEC_RIGHTMARGINã\ÂägEMRSCALEVIEWPORTEXTEXpÂä gcRDNAttráˆÂä g_DWORD_BLOBê%gPRINTER_NOTIFY_FIELD_PRINT_PROCESSORáÌÂäh_status87ìÂähPCOMPAREITEMSTRUCTë hCADV_LATEACKá$ÃäiCB_GETDROPPEDSTATEã@ÃäiCRYPT_INITIATORâTÃäiOLEVERBâhÃä iVarDecAddèiSQL_FN_NUM_TRUNCATEâ ÃäjOSVERSIONINFO´ÃäjSM_CYMENUÔÃäjszOID_STREET_ADDRESSáôÃäjIStorage_Revert_ProxyèjIME_ESC_GET_EUDC_DICTIONARYâ0Ää kN_TSHIFTékDISCDLGSTRUCTAãtÄämPBY_HANDLE_FILE_INFORMATIONâÄämERROR_BROKEN_PIPEÀÄä$mERROR_DS_COUNTING_AB_INDICES_FAILEDâÜÄämWH_SYSMSGFILTERâüÄämBeginDeferWindowPosê mFinish_Pushâ8ÅänFILE_SUPPORTS_ENCRYPTIONáPÅä npchEndWriteâhÅä nPSP_DEFAULTâ”Åä"nURLACTION_DOWNLOAD_SIGNED_ACTIVEXènSafeArrayRedimãÈÅä oSYSTEM_LUIDâàÅäoFILE_TRAVERSEÆä.o__InlineInterlockedCompareExchangePointer<Æä"oERROR_HOST_NODE_NOT_AVAILABLEXÆäodwRecipientChoice|ÆäoPROPSHEETHEADER_V1_SIZEâ¼Æä5oIGlobalInterfaceTable_RevokeInterfaceFromGlobal_StubáÐÆä otdescElemèoSQL_DESC_COUNTãüÆäpj1ã ÇäpIMAGE_DEBUG_TYPE_CODEVIEW8Çä pFACILITY_RPCépGetCharABCWidthsFloat|Çäq_DisposeThreadDataIndexâœÇäqDMLERR_POSTMSG_FAILED´Çä q_CTL_ENTRYãÐÇäqURLZONE_TRUSTEDâôÇäqMDM_V110_SPEED_12DOT0KëqSQL_CREATE_TRANSLATIONã4ÈärSCRIPT_SUPPORTãTÈärGRADIENT_FILL_OP_FLAGpÈärIPPORT_RESERVEDê"rFMTID_AudioSummaryInformation¸Èäs__file_orientationãÈÈäsj2ãØÈäshrãôÈäsMETA_EXTFLOODFILLÉäsRC_GDI20_OUTPUTêsPCCTL_CONTEXT<ÉätReferenceXÉätSCARD_W_WRONG_CHVlÉä t_DOCINFOWètPCTL_USAGE_MATCHé umidiConnectâ°Éä vsize_ÄÉävIE_MEMORYàÉävGetAclInformationôÉävMIDIEVENTÊävCMSG_MAX_LENGTH_FLAGá0ÊävuserHMETAFILEPICTèvOLESTREAMdÊäwLPNONCLIENTMETRICSWâ„ÊäwmciGetErrorStringWã¤ÊäwRPC_C_OPT_MQ_DELIVERYÄÊäwSCARD_ATTR_MAXINPUTâäÊäwPRINTER_ENUM_VALUESAé0wURLACTION_INFODELIVERY_NO_EDITING_SUBSCRIPTIONSâ<ËäxERROR_NOT_JOINEDáPËä xDST_TEXTéxRpcNsBindingImportBeginâ˜ËäySCHED_E_CANNOT_OPEN_TASKá°ËäyGRADIENT_RECTÈËäyEMRPOLYBEZIERàËä yToUnicodeExâôËä yCLIPDATAáÌäyMDMSPKRFLAG_DIALéyIGP_GETIMEVERSIONDÌä zis_void_impâlÌä"zDNS_WARNING_PTR_CREATE_FAILED„Ìä zHS_DIAGCROSSá ÌäzDMPAPER_LEDGERã¼ÌäzNOTIFYICONDATAãÔÌäzcbCertEncodedìÌä z__wtypes_h__áÍä zpServerInfoêzPENDINGMSG_WAITDEFPROCESSHÍä{ERROR_NOT_CONTAINERâ`Íä {PLOGBRUSH32âxÍä {FADF_VARIANTé{get_value Íä|referenceÔÍä'|PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARAë|IPersistStream_IsDirty_Stubâ Îä}ERROR_DS_NAME_TOO_LONGã<Îä}CF_ENHMETAFILEãXÎä}DISCDLGSTRUCTWã|Îä}LPOLEINPLACEACTIVEOBJECTé}OleDuplicateDataá¨Îä~i_ãÀÎä ~JOB_EXECUTEâàÎä~IStream_Commit_Stubê ~PIDDSI_SCALEáÏä DeleteAtomã8ÏäERROR_OBJECT_ALREADY_EXISTSâXÏätagMCI_VD_STEP_PARMSéCERT_STORE_PROV_CLOSE_FUNCã Ïä€SPAPI_E_INVALID_CLASS¸Ïä €_DRAWPATRECTáØÏä€tagCBTACTIVATESTRUCTáìÏä €WS_CHILDâÐä €mtOptioné€CryptHashSessionKeyâ8Ðä mtNoObjectsâLÐäfAckReqâpÐäszOID_RSA_DES_EDE3_CBCã„ÐäSTGMOVEê PSN_WIZNEXTâÀÐäƒAclRevisionInformationãäÐäƒHasOverlappedIoCompletedáüÐä ƒLoadImageAã,Ñä#ƒCHANGER_PREDISMOUNT_ALIGN_TO_DRIVEëƒRegisterMediaTypesã`Ñä„OperationpÑä„hMemáÑä„SCHED_S_TASK_READYã¬Ñä„CBS_AUTOHSCROLLâÄÑä „EnumPrintersé!„SQL_TRANSACTION_READ_UNCOMMITTEDáÒä…EVENT_E_QUERYSYNTAXâ(Òä …IFID_DEFINEDáLÒä…CERT_QUERY_CONTENT_CRLã`Òä…pCorrInfoxÒä …IID_IStreamê…OFN_NODEREFERENCELINKSã´Òä†GCP_DIACRITICàÒä†RPC_C_PROTSEQ_MAX_REQS_DEFAULTäÓä†DocumentPropertiesAê†IBindCtx_EnumObjectParam_Proxyã@Óä‡strrchrâhÓä‡SUBLANG_CHINESE_SIMPLIFIEDã€Óä ‡LB_GETCOUNTâœÓä‡SBM_SETSCROLLINFOè%‡_CERT_REGISTRY_STORE_CLIENT_GPT_PARAáìÓäˆIMAGE_THUNK_DATA32äÔä ˆwErrorRetèˆCoAddRefServerProcess@Ôä‰EnumSystemLocalesAãXÔä ‰userHPALETTEátÔä‰FirstSlotNumberâ”Ôä‰_wireSAFEARR_UNKNOWNá¸Ôä‰dwTemplateCurrentLevelë‰MDM_SHIFT_V120_SPEEDâÕäŠSE_GROUP_USE_FOR_DENY_ONLYã(ÕäŠ_IMAGE_ARCHIVE_MEMBER_HEADERáDÕäŠMMIO_READWRITEãhÕäŠCryptRetrieveObjectByUrlWˆÕäŠSCardIntroduceReaderAèŠEnumPrinterDataExWãôÕä?‹?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@ã Öä‹ntmCellHeight,Öä‹_GLYPHMETRICSFLOATãDÖä ‹PSH_MODELESSá`Öä‹IID_IWaitMultipleè‹CS_NOMOVECARETã˜ÖäŒCOLOR_BTNSHADOWâ°ÖäŒUserFileReadsÐÖäŒSCardListInterfacesWéŒSQL_TXN_SERIALIZABLEá×ä ne_aligná ×äSTARTF_USEHOTKEYá8×äEnumDesktopsWT×ätagMENUITEMINFOWád×ädmhdá|×ä IPPROTO_IGMPá˜×äPROPSHEETHEADERWá°×äTKIND_COCLASSèIEnumVARIANT_RemoteNext_StubéŽdwStyleâØäSE_SACL_PRESENTâ0ØäGetPriorityClipboardFormatãHØä UpdateWindowádØäCertStrToNameAã|Øä AbortPrinterá¬Øä&IXMLDOMCharacterData_appendData_Proxyè$IXMLDOMEntity_get_notationName_StubâôØä SQL_SUPPORTâ ÙäSTATUS_WAIT_04ÙäFRS_ERR_CHILD_TO_PARENT_COMMáPÙäCUR_BLOB_VERSIONáhÙädwLongNameLenˆÙäSCARD_PROTOCOL_RAWã¨ÙäEnumPrintProcessorsâÈÙäDocumentPropertiesWêRegisterInterfaceInGlobalüÙä‘opã,Úä#‘IMAGE_AXP64_RUNTIME_FUNCTION_ENTRYãHÚä‘DRVCONFIGINFOEXâhÚä‘SYMMETRICWRAPKEYBLOBáÚä‘IRecordInfo_GetField_Proxyã´Úä‘INET_E_INVALID_REQUESTãÈÚä‘_pdataë‘MDM_SHIFT_V110_SPEEDáøÚä’osã Ûä’lpClassâ(Ûä’EMRCREATEPALETTEáHÛä’RPC_SETFILTER_FUNCãpÛä’CMSG_RECIPIENT_COUNT_PARAMë’IIDFromStringœÛä“__EQUALâ°Ûä“GetYValueÈÛä “LZOpenFileë “guidVersionâôÛä”lpNameãÜä”ERROR_BAD_LENGTHé ”NRC_NOSAPSã8Üä•TEXTáLÜä •dwLengthádÜä •LoadImageWë•PRINTER_CONTROL_SET_STATUSã°Üä–CO_E_NETACCESSAPIFAILEDâÐÜä–CRYPT_E_PENDING_CLOSEäÜä –PostAllocè–IID_ITypeInfo(Ýä—CERT_CHAIN_POLICY_AUTHENTICODEãHÝä—IDummyHICONIncluderâpÝä—IXMLError_GetErrorInfo_Stubê—SQL_ACTIVE_CONNECTIONSã´Ýä˜PIPE_ACCESS_OUTBOUNDáÐÝä˜WNNC_NET_SYMFONETüÝä˜CMSG_OID_IMPORT_MAIL_LIST_FUNCë˜IErrorInfo_GetSource_Stub8Þä ™CTRY_ESTONIAáPÞä ™ncb_retcodeê™CertStrToNameWã”ÞäšERROR_DS_NC_STILL_HAS_DSASã´ÞäšSCardListInterfacesAáÜÞäšIXMLDOMNode_put_dataType_StubèšBINDF_DONTPUTINCACHEáßä›_EVENTLOGRECORDâ0ßä›EnumDesktopsALßä›tagMENUITEMINFOAáxßä!›RPC_CONTEXT_HANDLE_DEFAULT_GUARDáßä ›TCP_NODELAYâ¬ßä›PROPSHEETHEADERAé ›SQLPrepareãÜßä œ_SW_DENORMALáðßäœ_RECTLãàä œFreeConsoleâ,àäœCryptRetrieveObjectByUrlALàäœSCardIntroduceReaderWèœEnumPrinterDataExAãŒàäSetMenuItemBitmapsã¤àä MCI_SEQ_FILEáÀàäPROVIDOR_INFO_1âðàä$ICreateTypeLib_SetHelpFileName_Stubâ áä#IXMLDOMCharacterData_put_data_StubëPIDMSI_SOURCEPáä žReplyMessageáláäžPROVIDOR_INFO_2êžIID_IPropertyStorageá¤áä Ÿ_SIZEOF_INTâÄáäŸEnumSystemLocalesWëŸIID_IRpcProxyBufferê! ERROR_CLUSTER_NODE_SHUTTING_DOWNá,âä¡KLF_NOTELLSHELLâDâä¡_NETRESOURCEAhâä¡RpcNsProfileEltRemoveWãâä¡CERT_ALT_NAME_REGISTERED_IDâ¬âä¡varDefaultValueê¡MDMSPKRFLAG_ONãèâä¢SE_SYSTEMTIME_NAMEäãä¢CreateDialogW4ãä'¢CRL_REASON_CESSATION_OF_OPERATION_FLAGãHãä¢nUsersãtãä!¢ICreateTypeInfo_AddImplType_Stubé¢WriteClassStm ãä£_makepath°ãä £c_strÜãä£DOMAIN_GROUP_RID_SCHEMA_ADMINSäää£TAPE_DRIVE_COMPRESSIONãää£LPGCP_RESULTS4ää£LB_GETSELCOUNTë£RpcBindingToStringBindingAã€ää¤PIMAGE_OPTIONAL_HEADER32áää ¤HFILE¸ää¤ERROR_PRINT_MONITOR_IN_USEãØää¤DialogBoxIndirectWãøää¤_CERT_POLICIES_INFOâ åä¤SPLDS_PRINT_PAGES_PER_MINUTEé¤SQL_ISV_DOMAINSâPåä¥strtodãhåä¥PPSINJECTDATA”åä ¥CERT_OFFLINE_CRL_SIGN_KEY_USAGEâÄåä#¥PCMSG_RECIPIENT_ENCRYPTED_KEY_INFOë¥PCHANGER_SET_POSITIONáæä¦PFN_CRYPT_ALLOCê¦SAFEARR_UNKNOWNâ@æä§SCARD_W_CANCELLED_BY_USER`æä§UNIVERSAL_NAME_INFOWá„æä§MS_DEF_DH_SCHANNEL_PROV_Aè§PROPSETHDR_OSVER_MINORãÀæä ¨CONTEXT_i386áìæä ¨EXCEPTION_DATATYPE_MISALIGNMENTâçä¨RPC_S_NOTHING_TO_EXPORTâ$çä ¨lpszIconé¨WriteClassStg`çä©STARTF_FORCEONFEEDBACKã„çä©ERROR_CONNECTION_ABORTEDá˜çä ©fOptionsá¬çä©paramHë©DeletePropertyNamesâàçäªstrtokãôçä ªLDBL_MAXáèäªDefineDosDeviceAé"ªIXMLDocument_get_dtdURL_ProxyXèä«ERROR_DEV_NOT_EXISTê«ERROR_IS_SUBSTEDáŒèä ¬SetStdHandleá°èä¬szOID_ORGANIZATION_NAMEâÐèä¬IOCTL_SMARTCARD_EJECTôèä¬ITypeInfo_GetVarDesc_Stub éä¬SETRGBSTRINGWè¬ImmIsUIMessageAâ<éä­strtolãPéä­paramLë&­AsyncIPipeDouble_Finish_Pull_Stub”éä ®GenericAllã¨éä ®HMETAFILEè ®_NAME_BUFFERáäéä¯ERROR_CTX_LICENSE_EXPIREDêä¯DNS_ERROR_NO_CREATE_CACHE_DATAã0êä¯tagMCI_INFO_PARMSAãHêä ¯pszTemplateâ`êä ¯SERVER_READâ„êä¯IEnumOLEVERB_Skip_Stubë¯SQL_IS_HOUR_TO_SECONDÈêä°WSA_QOS_RESERVED_PETYPEâØêä°l1ë&°IXMLDOMNode_get_nextSibling_Proxy$ëä±UNIVERSAL_NAME_INFOAá<ëä ±MM_MIM_DATAâ\ëä±RPC_C_NS_SYNTAX_DCEâ€ëä±MS_DEF_DH_SCHANNEL_PROV_Wè±IInternetSessioná¼ëä²DialogBoxIndirectAë ²CertIsRDNAttrsInCertificateNameâøëä³l2ãìä³NTE_BAD_KEYSETã(ìä³mtVersionTìä³USER_MARSHAL_ROUTINE_QUADRUPLEãdìä³SNBê³cParamsâŒìä´MERGECOPY¤ìä´CreateDialogAÀìä´MCIERR_SET_DRIVEé´SPLDS_SHORT_SERVER_NAMEâíäµDLGC_DEFPUSHBUTTONã$íäµVP_MODE_TV_PLAYBACKâLíäµRpcBindingToStringBindingWãhíäµSQL_SPEC_STRINGêµSQL_DESC_BASE_COLUMN_NAMEœíä¶nwã´íä ¶_TOKEN_TYPEê¶DRAWSTATEPROCìíä·SECURITY_DESCRIPTORâîä·COMADMIN_E_ROLE_DOES_NOT_EXISTã0îä·_NETRESOURCEWTîä·RpcNsProfileEltRemoveAãpîä·LocalProcStringâŒîä·FORMAT_PARAMETERS´îä·SCARD_READER_TYPE_KEYBOARDãÐîä·CLSID_CCDCheckBoxè·ProcessSoftDistâïä¸LPENUMSTATPROPSTG0ïä¸SQL_ATTR_CONNECTION_POOLINGê¸SQL_CP_ONE_PER_HENVâxïä¹IMAGE_RUNTIME_FUNCTION_ENTRYá ïä¹InitializeSecurityDescriptoráÀïä¹EMRDELETECOLORSPACEâØïä¹hbrBackgroundøïä¹tagMCI_INFO_PARMSWã,ðä(¹IRunnableObject_SetContainedObject_Stubê¹SQL_BEST_ROWIDãdðäºrandom_shuffleã€ðäºCO_E_PATHTOOLONGá˜ðä ºNRC_BRIDGEã°ðäºSETRGBSTRINGAÌðäºImmIsUIMessageWêºSQL_CONVERT_DOUBLEãñä»GetTimeZoneInformationã8ñä»DestroyPrivateObjectSecurityáPñä »DOUBLE_CLICKá|ñä!»LPIINTERNETPROTOCOLSINKStackableé»SQL_CA2_MAX_ROWS_UPDATEâ¼ñä¼DefineDosDeviceWáÔñä¼PEMRSETBKMODEìñä ¼CONVCONTEXTâòä¼MCI_SEEK_TO_START(òä¼CLSCTX_REMOTE_SERVERé¼IID_IOleInPlaceObject`òä ½LOCALE_SDATEáxòä ½recv_successé½PKCS_CONTENT_INFO¨òä¾newnodeâÄòä¾EMR_POLYBEZIERTOáìòä¾IRecordInfo_PutField_Proxyäóä ¾VarDecAbsè¾IME_REGWORD_STYLE_USER_FIRSTáHóä¿TOKEN_SOURCE_LENGTHê¿NRC_ENVNOTDEFtóäÀHTHELPëÀIID_IWinInetHttpInfoá°óäÁ?$to_unsigned@Fê ÁMousePosáèóäÂExceptionContinueSearchâôäÂTOKEN_DUPLICATEâ$ôäÂFRS_ERR_INTERNAL_APIáDôäÂMCI_WAVE_OPEN_PARMSAáXôä ÂSQL_ERRORè ÂSQL_C_DATEãŒôäÃ?$to_unsigned@Dâ¤ôä ÃGetVersionãÄôäÃCLIPBRD_E_BAD_DATAãäôäÃCRYPT_E_ASN1_ERRORã õäÃSERVICE_ACCEPT_NETBINDCHANGEéÃSQLPrimaryKeysãDõäÄ?$to_unsigned@CâXõä ÄFILE_ENDápõä ÄbSerifStyleê ÄlpstrSchemaâœõäÅresultãÀõäÅIMAGE_REL_PPC_ADDR32NBãØõäÅGM_COMPATIBLEðõäÅWM_FONTCHANGEè ÅCTRY_INDIAã,öäÆAuditEventObjectAccessãLöäÆInterlockedExchangeâdöä ÆGetTextFaceAáˆöäÆPORT_STATUS_OUT_OF_MEMORYèÆ??_7ITypeInfo@@6B@ã¸öäÇmfãÜöäÇSPI_SETSCREENSAVETIMEOUTéÇLPICONMETRICSAã÷äÈIMAGE_SUBSYSTEM_UNKNOWNâ0÷äÈS_SERQFULD÷ä ÈSetTimeráT÷ä ÈHMIDIt÷äÈALG_SID_SSL3SHAMD5ã¤÷ä$ÈCERT_STORE_CERTIFICATE_CONTEXT_FLAGêÈ_pchBufâä÷ä&ÉSECURITY_CREATOR_OWNER_SERVER_RIDøä%ÉERROR_RESOURCE_PROPERTY_UNCHANGEABLEá8øäÉCERT_ACCESS_STATE_PROP_ID`øäÉSCARD_ATTR_CURRENT_IO_STATEâ€øäÉREGCLS_MULTIPLEUSEë ÉSetTimesá¸øäÊERROR_GRACEFUL_DISCONNECTÔøäÊCWP_SKIPDISABLEDéÊIBindCtx_GetBindOptions_StubáùäËLookupAccountName0ùä ËLogonUserAãHùäËDT_SINGLELINE\ùä ËMCI_SEEKátùä ËPF_IMPLINKãùäËLPPRINTER_INFO_9AèËPPRINTER_ENUM_VALUESáÈùä ÌMonthNamesãÜùä ÌStopBitsáìùäÌmmëÌSQL_INFO_FIRSTã$úäÍ?$to_unsigned@Jâ<úäÍDRIVERVERSION`úäÍSPI_GETSCREENSAVETIMEOUTá€úäÍCRYPT_IMPL_HARDWAREêÍ_CERT_CHAIN_CONTEXTê#ÎIXMLDOMNotation_get_publicId_ProxyãìúäÏ?$to_unsigned@HâûäÏ?$chooser@$0A@ã,ûäÏRPC_NCA_FLAGS_BROADCASTâPûäÏMDM_HDLCPPP_ML_DEFAULTãhûäÏSQLSETPOSIROW„ûäÏSQL_DESC_LABELëÏSQL_COLUMN_NUMBER_UNKNOWN¸ûäÐo1ãàûä"ÐRPC_X_SS_CHAR_TRANS_OPEN_FAILøûä ÐGetTextFaceWá üäÐKEY_EVENT$üä ÐrgAltEntryãXüä(ÐSTGC_DANGEROUSLYCOMMITMERELYTODISKCACHEêÐCLSID_PSEnumeratorsâ üäÑIS_TEXT_UNICODE_UNICODE_MASKá°üäÑnMaxáÌüäÑLPICONMETRICSWãèüäÑPKCS_TIME_REQUESTøüäÑmpãýäÑMSHCTX_INPROCèÑSPLREG_EVENT_LOGá<ýäÒmsã\ýäÒIMAGE_SIZEOF_SYMBOLâ€ýäÒCRYPT_OID_INFO_OID_KEYãœýäÒNDR_CHAR_REP_MASKèÒGetBindStringÄýäÓo2ãàýäÓMCI_SEQ_SET_PORTáþäÓszOID_ENHANCED_KEY_USAGEá0þä"ÓIBindCtx_ReleaseBoundObjects_StubèÓdwSpeakerVolumeâhþäÔnext_file_structá þä,ÔERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAINâ¸þäÔMOD_WAVETABLEØþäÔMCI_WAVE_OPEN_PARMSWéÔBYTE_BLOBÿäÕSYSYNC_ENGINEÿäÕGUIDá$ÿä ÕihPalDÿäÕtagDCOM_CALL_STATEëÕguidátÿäÖAreAllAccessesGranted˜ÿäÖSCHED_S_TASK_HAS_NOT_RUNá¬ÿäÖCFSEPCHARÀÿäÖdwSlaveâØÿä ÖPNAME_BUFFERáðÿä ÖHeaderLengtháä ÖMAX_SID_SIZEá$äÖSCardGetAttribë#ÖIXMLDOMNode_get_namespaceURI_Proxyë×??_7ISurrogate@@6B@â ä ØIMAGE_COMDAT_SELECT_EXACT_MATCHêØRPC_E_INVALID_CALLDATAãÔäÙmxãðäÙPCF_TOTALTIMEOUTSä ÙLBS_STANDARDé*ÙCRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNCPä ÚLANG_TELUGUâdäÚTIMEVALêÚ_CHANGER_ELEMENT_STATUSâ¤äÛSORT_KOREAN_KSCâÈäÛPAGE_EXECUTE_WRITECOPYãèäÛTHREAD_PRIORITY_IDLEáäÛERROR_DS_AUX_CLS_TEST_FAILã(ä ÛEMR_FILLPATHáDäÛLPD_SWAP_EXCHANGEèÛIEnumFORMATETC_Skip_StubáxäÜPSIZEèÜCoGetTreatAsClass¬ä ÝLogonUserWãÀä ÝLPCIEXYZáÜäÝWN_EXTENDED_ERRORáäÝPSTORAGE_DEVICE_NUMBERãäÝLPPRINTER_INFO_9W<äÝIUnknown_AddRef_StubáTä ÝPARSEACTIONâpäÝSQL_AUTOCOMMIT_ONèÝSQL_DESC_SCHEMA_NAMEá¬äÞSTGTY_PROPERTYãÀäÞOLEUPDATEØä ÞSQLRowCountâôäÞSQL_CONVERT_TIMEéÞSQL_ROW_PROCEEDâ4äßCONTEXT_DEBUG_REGISTERSâPäßLPMCI_SEEK_PARMSéßIEnumSTATPROPSTG_Reset_StubâŒä àNEARPROCá¨äàDESKTOPENUMPROCWáÀäàLB_FINDSTRINGÜäàPPRINTER_INFO_2âøäàPMONITOR_INFO_2ê%àITypeLib_RemoteGetTypeInfoCount_Stubá@äáPC_NOCOLLAPSE\äáEM_GETLIMITTEXTâtäáBS_PUSHBUTTONˆäáAF_OSIã¤äá_PROPSHEETPAGEWâÀäáPPRINTER_INFO_3êáIMoniker_Reduce_StubáäâSUBLANG_SPANISH_MODERNëâITypeMarshal_Marshal_Stub8äãlbãLäãUOI_FLAGShäãMapWindowPointsâ„äãPPRINTER_INFO_1êãPMONITOR_INFO_1âÄääPerProcessUserTimeLimitâÜääLPDRVCALLBACKüääPMCI_OVLY_LOAD_PARMSAèäPPRINTER_INFO_6â(ä åfmodl8ä åmodflTäåQueryDosDeviceã€ä åERROR_DS_NAME_ERROR_DOMAIN_ONLYâ˜äåVS_FF_PATCHED´äåMCI_TMSF_TRACKëåPPRINTER_INFO_7âøäæRPC_S_UNKNOWN_AUTHZ_SERVICEâä æHRESULT_CODEá(ä æPEMRFILLRGNâXä#æCERT_FIND_PROP_ONLY_CTL_USAGE_FLAGãtäæPPRINTER_INFO_4êæIViewObject_Freeze_Stubâ¨äçfmináÄäçCreateDIBSectionáàäçWM_CHILDACTIVATEáüäçPPRINTER_INFO_5â äçAddPrintProcessorè!çIOleItemContainer_GetObject_Stubáh äè??_7range_error@std@@6B@á„ äèSUBLANG_ITALIANâ  äèERROR_BAD_FORMATáÄ äèSPAPI_E_FILEQUEUE_LOCKEDáÜ ä èWM_DRAWITEMâü äèI_RpcNsRaiseException äèPropSheet_InsertPageá, äèliã` ä(è__IParseDisplayName_INTERFACE_DEFINED__êèVAR_PERINSTANCE☠äéwlower_map_ptrã° ä éislessequalâÈ ä édo_replaceãì äéERROR_INVALID_COLORSPACEééSETCOLORTABLE$ äêdwOpenEncodingTypeã< äêuserHMETAFILEX äêPPRINTER_INFO_8êêDATA_E_FORMATETCጠä ëStatusWordã  äëHGDIOBJâ¼ äëRUSSIAN_CHARSETâØ äëLPWAVEOUTCAPSAãô äëScsiInformationâ ä ëMAXPROPPAGESá( äëLPPRINTER_INFO_8AèëPPRINTER_INFO_9â\ ä ìAclRevisionâp äìPOINTLã„ äì_lread㤠äìLookupPrivilegeValueAÔ ä#ì__IAdviseSink2_INTERFACE_DEFINED__ãì ä ì_INC_COMMDLGéìSQL_SP_MATCH_UNIQUE_PARTIALâ, ä í__strerrorëíVarBstrFromBoolê*îCERT_QUERY_CONTENT_PKCS7_SIGNED_EMBEDˆ ä ïfmodf˜ ä ïmodff¼ äïERROR_CLIPBOARD_NOT_OPENáÔ ä ïLPPOLYTEXTWâä äïDDELNáäïNPWAVEOUTCAPSAë"ïPRINTER_NOTIFY_INFO_DISCARDED8äðn1ãLäðIDHELPëðdwKeySpectäñTokenUser˜äñERROR_CONTROLLING_IEPORTá°ä ñMCI_SEQ_MIDIéñCertGetNameStringàäòHeaderääòCERT_E_UNTRUSTEDROOTáä òtagEMRBITBLTá8äòPMCI_OVLY_LOAD_PARMSWèòCRYPT_CONTENT_INFOãläówcschrã„ä ótvalue_typeâ”äón2ã¤äóneará´äóNEARáÔäóTAPE_DRIVE_INITIATORáèäóPOINTSãäószOID_CERT_EXTENSIONSèóLPOINETPRIORITYêôSizePtrOffsetArrayãTäõltëõBINDSTATUS_PROTOCOLCLASSIDã äöIMAGE_SNAP_BY_ORDINAL32â¼äöICM_QUERYPROFILEáØäöDESKTOPENUMPROCAéöfrmr_recvä÷EMR_SETBRUSHORGEX$ä÷_PROPSHEETPAGEAâTä%÷IXMLDOMCharacterData_deleteData_Stubé÷SC_LOCKâ„äøis_specializedã äøDC_ORIENTATIONã´äøCBR_110âÌä øPDRAWPATRECTáàäøBlendOpê øPEMRFRAMERGNáä ùLPPOLYTEXTAâ$ä ùDeleteDCá@äùNPWAVEOUTCAPSWëùFlipápäúLookupPrivilegeValueWˆä úCTRY_FRANCEâ ä úPDRVCALLBACKáÀäúLPMCI_GENERIC_PARMSâÔäúpAsyncãøäúCMSG_KEY_AGREE_VERSIONãäúPRINTER_CHANGE_DELETE_JOBè úGCS_COMPATTRá\ä"ûIMAGE_NT_OPTIONAL_HDR64_MAGICtä ûGMEM_LOWERãˆä ûbcPlaneséûIOCTL_CHANGER_MOVE_MEDIUMÌäüERROR_DIR_NOT_ROOTãèäüLPMOUSEHOOKSTRUCTäüBDR_SUNKENINNERâäüfrmr_xmitDä!üIRecordInfo_PutFieldNoCopy_Proxyé üCLEANLOCALSTORAGE_UserUnmarshalâ„äýCE_MODEâœäýRPC_E_TIMEOUT°äýGCL_STYLEÌäýLPWAVEOUTCAPSWãèäýLPPRINTER_INFO_8WèýIID_IXMLElement2áäþm_ã(äþcdwParamsDäþRPC_C_VERS_ALLã\ä þcbNDRContextáxäþWDT_REMOTE_CALLêþget_JavaDSOCompatibleèÿPROBE_ALIGNMENTâÌå iLayerTypeìCryptGetObjectUrl äCO_E_RUNAS_LOGON_FAILUREá(äRASTER_FONTTYPEê ChooseColorAádäSYSYNC_BUILDNUMBER_TXTãtä lseekäis_fundamentalã¸ä_IMAGE_BOUND_FORWARDER_REFãÈäscãäämixerGetDevCapsWáä-AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARAéSQL_SR_GRANT_OPTION_FORâ\äIMAGE_REL_PPC_NEG|äDLL_PROCESS_DETACHãœäRPC_S_INVALID_TIMEOUTèWINSTA_EXITWINDOWSãàäIMAGE_REL_MIPS_JMPADDRëcadateãäERROR_WRONG_PASSWORDá4äPEMRGLSBOUNDEDRECORDáTäRPC_C_OPT_MQ_JOURNALáxäCERT_STORE_SAVE_TO_MEMORYœäCERT_CHAIN_POLICY_NT_AUTHèLPPROVIDOR_INFO_1àäERROR_DS_INVALID_SEARCH_FLAGâäENHMETA_STOCK_OBJECTáäRPC_C_VERS_UPTOâ8äLPPROVIDOR_INFO_2èrgdispidNamedArgslä IsCharAlphaAáäFRERR_BUFFERLENGTHZEROãÔä7CRYPT_SORTED_CTL_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAGãääcbBufáä??_7IStream@@6B@éSQL_SC_SQL92_ENTRYã<äEMR_SELECTOBJECTáXä_WAVEFORMATEX_ë'_CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARAã¨ä LPDRVCONFIGINFOEXÐä _LPCATALOGFILEINFO_DEFINEDë CHOOSECOLORAáä ACCESS_MAX_LEVELá$ä STG_E_BADBASEADDRESSá@ä ENDSESSION_LOGOFF\ä UNLOCK_ELEMENTã€ä IStream_LockRegion_Stubâ°ä$ IOleInPlaceSite_OnUIDeactivate_StubâÈä OInetParseUrlè PUAF_FORCEUI_FOREGROUNDâä EMREXTCREATEFONTINDIRECTWè IOCTL_STORAGE_EJECT_MEDIALä LT_DONT_CAREáhä IMessageFilterë tagStorageLayoutá¤ä GetDevicePowerStateâ¼ä MOD_MAPPERë PCERT_CHAIN_CONTEXTâìäcur_áüä tree_äGetFileAttributesAã8äGetEnhMetaFileãTäwVirtualKeyCodeâläPFORM_INFO_1AèVarCyFromBool”äsnã°äPFN_CMSG_ALLOCãÀä VT_CFÔä MEMBERIDé!ICreateTypeInfo2_Invalidate_Stubáä _strdateáDä$PROTECTED_SACL_SECURITY_INFORMATIONê VT_CYlä IsCharAlphaWá˜ä"CertAddEnhancedKeyUsageIdentifierèSQL_CUR_USE_ODBCáØäGetPrivateProfileStructâøäPSINJECT_PAGESATENDâäDATE_SHORTDATEëpfltValâ<äCE_DNSãPäBoundsãhä SE_ERR_SHAREáˆäSQL_COLUMN_TABLE_NAME¨äSQL_COLATT_OPT_MAXëSQLColumnPrivilegesâäälpDebugStringDataüäEMR_ABORTPATH ämixerGetDevCapsAé lpszVerbNameá@ ästãl äERROR_NO_BROWSER_SERVERS_FOUND㘠ä!ICreateTypeInfo_AddVarDesc_ProxyéVarDecFromStrÌ ä_MSL_VA_LIST_Hãì äCRYPT_IMPL_UNKNOWNë BufferStartâ !äRestrictedSidsãD!äPCRYPT_SMIME_CAPABILITIESX!ä TYPEDESCé ChooseColorWáˆ!ä MEM_RESERVEâ¨!äGetFileAttributesWãÌ!äERROR_NOT_LOGON_PROCESSâä!ä METAHEADERãü!ä lpCaretPosã "äCreateEllipticRgnIndirect@"äMMIOERR_FILENOTFOUNDáX"äPFORM_INFO_1Wˆ"ä%__MIDL_itf_urlmon_0180_v0_0_c_ifspecé%__MIDL_itf_urlmon_0182_v0_0_s_ifspecáØ"äSUBLANG_FRENCH_SWISSáô"äEMRPIXELFORMATã#äCAL_ICALINTVALUEáD#ä'CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNCãl#äJOB_CONTROL_SENT_TO_PRINTERêWM_PSD_PAGESETUPDLGêCLSID_CCDTextBoxPropertyPageáà#ä _DN_SAVE_OPERANDS_FLUSH_RESULTSâð#äszã$ä VER_GREATERâ0$ä"SEF_DEFAULT_OWNER_FROM_PARENTH$äMMIO_ALLOCBUFèRpcSsAllocatex$ä F5_1Pt2_512êSQL_FN_STR_LENGTH¤$äcUrléSQL_MAX_USER_NAME_LENì$äDeCommitFreeBlockThresholdã%äCOMPRESSION_ENGINE_STANDARDê SM_CYVTHUMBâP%äCERT_RDN_PRINTABLE_STRINGd%äDVD_RWã„%ädataRepresentationë CHOOSECOLORWá¸%ä ?$__char@$0BP@ãØ%ä ERROR_INDEX_ABSENTãð%ä WM_SETTEXTã$&ä) CERT_PHYSICAL_STORE_PREDEFINED_ENUM_FLAGáL&ä IOCTL_STORAGE_CHECK_VERIFY2âd&ä POPENCARDNAMEè SQL_MAX_SCHEMA_NAME_LENâ &ä !DMNUP_SYSTEMá¼&ä!_PRINTER_INFO_3âØ&ä!GetTypeInfoCounté!SERVICE_CONTROL_CONTINUEá 'ä"rcã 'ä"SELECTDIB8'ä"uuid_vector_tè#"CRYPT_CONTENT_INFO_SEQUENCE_OF_ANYãŒ'ä#REG_OPENED_EXISTING_KEYâ¤'ä #VK_RBUTTONã¸'ä#MF_INSERTä'ä #szOID_PKIX_POLICY_QUALIFIER_CPSâô'ä#pbAtrè#SQL_API_SQLMORERESULTSã@(ä"$??_Gdomain_error@std@@UAE@I@ZX(ä$UInt32x32To64|(ä$IMAGE_SCN_MEM_NOT_CACHEDá¨(ä!$FRS_ERR_PARENT_INSUFFICIENT_PRIVáÈ(ä$CDERR_DIALOGFAILUREâä(ä$MCI_HMS_MINUTEä)ä$_PRINTER_INFO_6â)ä $pConfigFileâ0)ä $pValueNameãL)ä$AddPrintProvidorAx)ä!$IROTData_GetComparisonData_Proxyé$SCS_SETRECONVERTSTRINGã´)ä %WM_GETTEXTãÌ)ä %CTRY_DEFAULTáÜ)ä%rdë%_FLAGGED_WORD_BLOBã*ä&SetFileAttributesAãD*ä&tMIXERCONTROLDETAILS_UNSIGNEDè&CRYPT_USERDATAãt*ä'e_oemidâ˜*ä'ERROR_DS_NAMING_VIOLATION´*ä'GetCharABCWidthsAØ*ä'szOID_EMBEDDED_NT_CRYPTOé+'CRYPT_OID_SYSTEM_STORE_LOCATION_VALUE_NAMEã$+ä(FLT_MAXâ8+ä(peGreenê(PHELPWININFOWd+ä )PPATTERNáx+ä )DrawEdgeá+ä )DestroyMenuâ´+ä)CRYPT_RC2_CBC_PARAMETERSáÌ+ä )BytesWrittené)CLSID_CCDXObjectPropertyPageá,ä *S_SEROFMá4,ä *ERROR_DS_OBJ_STRING_NAME_EXISTSâP,ä*PostAppMessageAâh,ä *STM_SETICONâ„,ä*DdeQueryConvInfoá ,ä*WAVE_FORMAT_PCMâ¼,ä*CHANGER_TO_IEPORTÐ,ä *LPSTREAMá-ä-*AsyncIAdviseSink_Finish_RemoteOnRename_Proxyé*SQL_WCHAR<-ä+ERROR_SPL_NO_STARTDOC`-ä+ERROR_PROMOTION_ACTIVEãˆ-ä+MCI_OVLY_WHERE_DESTINATIONã¨-ä+HACCEL_UserUnmarshaláÌ-ä+SQL_DESCRIBE_PARAMETERë+SQL_CA1_LOCK_NO_CHANGEã.ä,va_copyâ.ä ,PBYTE<.ä,ERROR_DS_DRA_RPC_CANCELLEDãT.ä ,_RPC_IF_IDãl.ä ,BusTypeScsiâ„.ä ,F3_1Pt2_512â”.ä,hpageè,STGMEDIUMÄ.ä-WSA_QOS_SENDERSâÜ.ä -SERIALKEYSWâø.ä-RPCFLG_LOCAL_CALL/ä-PPRINTER_DEFAULTSè-ICreateTypeLib_SetLcid_StubâP/ä.PATCOPYâd/ä .SC_HOTKEYè .NUMLOCK_ONë /STM_GETICONâ¤/ä0p1ãÄ/ä0SetFileAttributesWãØ/ä 0VK_OEM_2â0ä0MCIERR_UNRECOGNIZED_COMMANDâ00ä#0USER_MARSHAL_UNMARSHALLING_ROUTINEë0_FORMAT_EX_PARAMETERSl0ä1GetCharABCWidthsW€0ä 1VK_OEM_3áœ0ä1PRPC_ASYNC_STATEá°0ä 1CTL_INFOé1SCARD_CTL_CODEãä0ä 2__win32_osãø0ä2SETDTRã1ä2OSS_MUTEX_NOT_CREATED41ä2AddPrintProvidorWD1ä2tdescè2NUMPRS_LEADING_WHITEát1ä3p2ãˆ1ä 3VK_OEM_1á¤1ä3tagMONCBSTRUCTãÀ1ä3NCBCHAINSENDNAãÜ1ä3RpcNsGroupDeleteáø1ä3FuncVerifyImageê3SQL_PACKET_SIZEâ02ä4_MSL_LOCALE_NONEáT2ä4PIMAGE_OPTIONAL_HEADERãp2ä4TAPE_ERASE_LONGâ„2ä 4VK_OEM_6áœ2ä 4tagHELPINFOâ¸2ä4szOID_SERIALIZEDáÐ2ä 4CLSCTX_ALLã3ä-4AsyncIAdviseSink2_Begin_OnLinkSrcChange_Stubé4BINDF_IGNORESECURITYPROBLEMâD3ä5isdigitâX3ä5atan2lãl3ä5PLONG32â|3ä5RECTá3ä 5VK_OEM_7á¬3ä5MIDICAPS_CACHEã¼3ä5rtë#5IPersistMoniker_GetCurMoniker_Stubä4ä 6REG_NONEá4ä 6VK_OEM_4á84ä6PropSheet_SetFinishTextâd4ä"6ICreateTypeInfo2_Invalidate_Proxyè 6DoDecodeáœ4ä7ullAvailExtendedVirtualâ´4ä 7DMTT_BITMAPâÈ4ä 7VK_OEM_5áè4ä7SE_ERR_DLLNOTFOUNDãø4ä7recvá 5ä7NdrInterfacePointerBufferSizeè7PUAFáP5ä8IsProcessRestrictedâh5ä 8ERROR_LOCKEDá”5ä 8ICreateTypeLib_SetVersion_Proxyâ¸5ä8ITypeInfo_GetNames_Stubê 8VarCyFromUI2áô5ä9ERROR_NESTING_NOT_ALLOWED 6ä9SCROLLLOCK_ONè%9__MIDL_itf_objidl_0054_v0_0_c_ifspecáT6ä:p_cs_precedesl6ä:GENERIC_WRITE€6ä :VK_OEM_8á˜6ä:iScrollHeightÀ6ä:CERT_STORE_TIME_VALIDITY_FLAGè":NdrConformantStructMemorySize7ä;ERROR_INVALID_FLAGSâ7ä ;EVENTMSGá47ä ;SERIALKEYSAâL7ä;PSM_UNCHANGEDl7ä;HandleInComingCallë ;VarCyFromUI1á¨7ä<REALTIME_PRIORITY_CLASSâÀ7ä<ResizePaletteè<PostAppMessageWâø7ä=tagEMRGLSRECORDâ 8ä=Simpleë=SPLDS_PRINT_COLLATEâD8ä>PHELPWININFOA`8ä>MIDICAPS_LRVOLUME8ä#>I_RpcServerRegisterForwardFunctionã¬8ä>NdrServerMarshallÌ8ä>SERIAL_IOC_MCR_RTSë >VarCyFromUI4áø8ä?atan2fã9ä?PSINJECT_BEGINPROLOGá,9ä?BI_PNGãP9ä?OUT_SCREEN_OUTLINE_PRECISè ?CreateCallë @GET_CERT_UNICODE_ATTR_ERR_INDEXâ¬9ä AWS_SYSMENUãÀ9ä ALPAUXCAPSè)A__ICancelMethodCalls_INTERFACE_DEFINED__á :ä BCERTSRV_E_UNSUPPORTED_CERT_TYPEâD:äBwaveOutSetPlaybackRateã\:ä BNCBDGRECVBCâˆ:äB__IPersistStream_FWD_DEFINED__ë+BICreateTypeInfo2_DeleteVarDescByMemId_Stubãà:äCCRYPT_E_HASH_VALUEãü:äCPGRADIENT_RECTã;äCPEMRPOLYBEZIERëCCERT_RDN_BMP_STRINGâ`;äDInterlockedCompareExchangeã„;äDIsValidSecurityDescriptor¤;äDSetWinMetaFileBitsãÀ;äDGetKerningPairsâÜ;äDX509_DH_PUBLICKEYèDRootIndexWriteBytesâ<äEstricmpâ<<äEIMAGE_ARCHIVE_LONGNAMES_MEMBERãd<äEEMR_CREATEDIBPATTERNBRUSHPTâ|<ä ElpWindowNameá <äEVP_CP_TYPE_APS_TRIGGERãÀ<äEMCI_VD_GETDEVCAPS_CAVÜ<äEPRINTER_INFO_9Wâì<äEStaté"EIOleObject_InitFromData_Proxy(=äFNPPOINTâH=äFSTRETCH_DELETESCANSâ`=ä FelfReservedâˆ=äF__IEnumMoniker_FWD_DEFINED__á´=ä!FIXMLDOMEntity_get_publicId_Proxyáè=ä'FIInternetSession_GetSessionOption_StubëFdwControlsAcceptedã(>äGHTTP_KEEP_CONNECTIONá@>ä GDCTT_BITMAPâd>äGWNetDisconnectDialog1WëGUPDFCACHE_IFBLANKORONSAVECACHEã´>äHFRS_ERR_INSUFFICIENT_PRIVÜ>äHszOID_AUTHORITY_INFO_ACCESSâ ?ä*HCERT_CHAIN_POLICY_TRUST_TESTROOT_FLAGFLT_MINâH»ä>ERROR_LOCAL_USER_SESSION_KEYád»ä>PEMRPOLYLINETOãx»ä >lpszClassè>SQL_CVT_VARBINARY¨»ä ?LockFileé ?wvsprintfAãä»ä@MESSAGE_RESOURCE_ENTRYãü»ä @TECHNOLOGYã(¼ä!@PCERT_KEY_USAGE_RESTRICTION_INFOé@MONITOR_INFO_1Aâh¼äAERROR_DS_NAME_UNPARSEABLEˆ¼äAWM_WINDOWPOSCHANGINGᨼäAVS_FF_PRIVATEBUILDã̼äASND_ALIAS_SYSTEMDEFAULTê ArgCertStoreâô¼ä Btrunc½äBcmykéBCMYKá,½ä CCS_VREDRAWã@½ä CcbBufferéCHPROPSHEETPAGEãl½äDhereጽäDIMAGE_REL_PPC_IMGLUEᨽäDPSPROTOCOL_ASCIIáȽäDMCI_WAVE_SET_CHANNELSèDtagCANDIDATELISTâ¾äENORM_IGNORECASEâ ¾äELOCALE_SENGCOUNTRYã4¾äEMCI_SETâT¾äERpcBindingInqAuthInfop¾äEPRINTER_INFO_1W☾äEIRecordInfo_RecordCopy_Proxyé!EIID_IInternetHostSecurityManageráä¾äFTIME_ZONE_ID_INVALIDá¿äFIPersistFile_Save_Proxyâ ¿ä FGetDestCtxExé!FSID_SInternetHostSecurityManagerál¿äGTAPE_CREATE_PARTITIONŒ¿äGAddAccessDeniedAce㨿äGGetClassLongPtr⼿äGES_LEFTâÜ¿äGRpcEpResolveBindingâø¿äGCALG_SSL3_SHAMD5áÀäGszOID_POSTAL_ADDRESSá@ÀäGCERT_STORE_OPEN_EXISTING_FLAGè GszCodeBaseã|ÀäHHSHELL_WINDOWDESTROYEDã”ÀäHWM_TIMECHANGE¬Àä HReadRequestâÜÀä*HIPersistStorage_HandsOffStorage_ProxyôÀä HLPADVISESINKé HtagVARKINDã Áä ISHRT_MAXáHÁäIEXCEPTION_PRIV_INSTRUCTIONã\ÁäICharLowerxÁäIEnumThreadWindows˜ÁäIRESOURCETYPE_RESERVEDèIOLECONTF_ONLYUSERØÁäJSE_IMPERSONATION_STATEãÂä JJOB_OBJECT_LIMIT_ACTIVE_PROCESSâ$ÂäJFILE_SEGMENT_ELEMENTá@ÂäJCombineTransformá\ÂäJPEMRSETMETARGNãxÂäJESB_ENABLE_BOTHâÂä JSSWF_CUSTOMâ¬ÂäJCRYPT_URL_ARRAYê"JCHANGER_VOLUME_IDENTIFICATIONìÂä KIOMEGA_ZIPëKTYMED_ISTREAMÃä LlstrcatAá@Ãä"LERROR_DS_DRA_SCHEMA_INFO_SHIP\ÃäLCO_E_APPDIDNTREGápÃäLSB_CTLãÃäLRpcProtocolSequenceâ¬ÃäLObjectHelpTitleâÌÃäL_tagHIT_LOGGING_INFOéLSQL_NULL_HDBCáÄäMIMAGE_ENHMETAFILE(ÄäMMIXERCONTROL_CT_CLASS_SWITCHá8Ää MntohlLÄä MhContextáxÄäMIXMLDocument_get_doctype_ProxyëMSQLSetStmtOptioná¬ÄäNGCP_MAXEXTENTÌÄäNWM_CTLCOLORLISTBOXãðÄäNALG_TYPE_SECURECHANNELëNIID_IInternetBindInfoDÅä.OERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBERXÅä OPDEVMODEéODlgDirSelectComboBoxExã˜ÅäPround_to_nearestá¬ÅäPszPnameâÌÅäPLOCK_UNLOCK_KEYPADëPGetBindOptionsãÆäQERROR_NETNAME_DELETEDèQPSM_CANCELTOCLOSEHÆäRSID_IDENTIFIER_AUTHORITYálÆäRDNS_ERROR_DS_UNAVAILABLEáˆÆäRCRYPT_E_REVOKEDê RntohsÄÆäSERROR_DS_NONSAFE_SCHEMA_CHANGEãØÆä SMF_GRAYEDèSPRINTER_INFO_1AâÇäTRPC_C_PROTECT_LEVEL_DEFAULTê TbstrHelpFileá`Çä UIS_TEXT_UNICODE_REVERSE_ASCII16âxÇä UXTYP_EXECUTEé USO_KEEPALIVEá°ÇäVGCPGLYPH_LINKAFTERãØÇäVCERT_TRUST_IS_COMPLEX_CHAINêVMONITOR_INFO_1WâÈä WEXDEV,ÈäWLookupIconIdFromDirectoryExêWNCBACTIONpÈä%X__MIDL_itf_urlmon_0185_v0_0_c_ifspecé%X__MIDL_itf_urlmon_0187_v0_0_s_ifspecá°Èä YldexpÀÈä Ylog10ØÈä YWSATRY_AGAINáôÈäYCONVERT10_S_FIRSTÉäYEMR_SETWINDOWEXTEXëYSQL_AT_CONSTRAINT_DEFERRABLEádÉä"ZFILE_NOTIFY_CHANGE_LAST_WRITExÉä ZlstrcatWéZ??_7IProgressNotify@@6B@á°Éä [_COMMPROPè[ERROR_DS_DRA_NAME_COLLISIONê\ERROR_CTX_PD_NOT_FOUNDã Êä ]front(Êä]PTAPE_WRITE_MARKSDÊä]MakeAbsoluteSD2âTÊä ]tymedxÊä]IBinding_Suspend_Proxyë]lpLogFontœÊä^x_ã´Êä ^e32_objmapãÐÊä^ERROR_GEN_FAILUREøÊä^ERROR_CLUSTER_INVALID_NODEãËä ^__RPCNSI_H__á0Ëä^SEE_MASK_INVOKEIDLISTHËä ^pszProviderê^IStream_Seek_Proxyã”Ëä _COMQC_E_NO_QUEUEABLE_INTERFACESâ°Ëä_WM_IME_KEYLASTãÄËä_KP_MODEâøËä._ISynchronizeContainer_AddSynchronize_StubÌä_CFSTR_MIME_JPEGâ<Ìä_IInternetProtocol_Read_Stubê_SQL_C_TYPE_DATEâˆÌä$`PROTECTED_DACL_SECURITY_INFORMATIONâ¬Ìä`TAPE_DRIVE_ABS_BLK_IMMEDáÔÌä"`ERROR_CLEANER_CARTRIDGE_SPENTôÌä`tmDigitizedAspectXãÍä`MCI_WAVE_SET_ANYINPUT(Íä `NextJobIdè`ODBC_BOTH_DSN`ÍäatmDigitizedAspectYã|ÍäaDATATYPES_INFO_1W ÍäaIOleCache_Uncache_ProxyâÔÍä(aIXMLDOMNode_transformNodeToObject_ProxyãÎä!aIXMLDOMElement_getAttribute_Stubé+aURLACTION_INFODELIVERY_NO_EDITING_CHANNELSãPÎä b__open_modesáxÎäbFILE_SUPPORTS_REPARSE_POINTSá¤ÎäbPMIXERCONTROLDETAILS_LISTTEXTAãÌÎäbIOleObject_GetMoniker_StubëbImmConfigureIMEâüÎä coptimizeáÏäcQS_POSTMESSAGEã<Ïäc__MIDL_DECLSPEC_DLLEXPORTTÏä cFUNC_VIRTUALécSQL_FD_FETCH_PRIORãŒÏä dTAPE_UNLOCKâ°ÏädERROR_CTX_WD_NOT_FOUNDãÌÏädDdeUnaccessDataêdCryptReleaseContextãÐäecuseridâÐäelog2lè eSQL_C_BINARYáPÐäfERROR_WMI_ALREADY_DISABLEDãdÐäfSB_HORZâˆÐäfNdrXmitOrRepAsBufferSizeéfGL_ID_CHOOSECANDIDATEÄÐägLookupAccountSidAðÐä gERROR_PATCH_PACKAGE_UNSUPPORTEDâÑägDRAFTMODEÑä gLPFNDEVMODEâ0Ñä gSS_BITMAPègCLSID_CCDGeneralPropertyPageápÑä hGetAtomNameAá˜ÑähIMallocSpy_PreDidAlloc_StubêhSQL_INTERVAL_SECONDâÔÑäiLPFONTSIGNATUREãÒä iICreateTypeInfo_SetVarName_StubêiIXTLRuntime_uniqueID_Proxyã<ÒäjOF_CREATEXÒäjREGCLS_SUSPENDEDéjCF_SCALABLEONLYâˆÒäkislowerê kwHour¬Òäm_NT_TIBâÄÒä mVK_HANGEULë mSQLSMALLINTâÓänRPC_X_SS_CHAR_TRANS_SHORT_FILEã Óä nMF_OWNERDRAWá8Óä nEM_LIMITTEXTá\ÓänszOID_RSA_digestedDataën??_7ICreateErrorInfo@@6B@Óä olog2f¨Óä ofOutxDsrFlowáÔÓäoERROR_CLUSTER_NODE_UNREACHABLEë oFS_GREEKáÔäp_TAPE_GET_POSITIONã0Ôä"pERROR_DS_COULDNT_CONTACT_FSMOPÔäpCreateDIBPatternBrushlÔäpWM_CTLCOLOREDITâœÔä%pCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFOá´Ôä p_COAUTHINFOêpSQL_PT_PROCEDUREáìÔäq_MSL_ANSI_PARMS_HüÔä qstripÕäqRandomAccessIterator2,ÕäqxpãHÕäqLookupAccountSidWhÕäqdwMaximumWindowSizeâ„ÕäqPCRYPT_URL_INFOâ ÕäqAsyncIPipeDoubleé qIFillLockBytes_SetFillSize_StubâìÕärRandomAccessIterator1Öä!rMIXERLINE_COMPONENTTYPE_SRC_LASTá<ÖärPRINTER_CHANGE_PRINTERërpullValâhÖäsENUMPAPERBINS|ÖäspszFileâ˜ÖäsAddPrintProvidorésPIDDSI_SLIDECOUNTÄÖä tNOWSMÜÖätset_terminate×ätPMIXERCONTROLDETAILS_LISTTEXTWã$×ätSEE_MASK_IDLISTâ<×ä tJOB_INFO_3ëtSQL_FN_NUM_ASINâp×ä u_INC_WINDOWSáŒ×äuEnumICMProfilesê uJOB_INFO_2ãÌ×ä"vACCESS_DENIED_OBJECT_ACE_TYPEà×ävCharToOemØävPFN_CMSG_IMPORT_KEY_TRANSØä vJOB_INFO_1ëvVARFLAG_FDEFAULTCOLLELEMá\ØäwLPGLYPHMETRICSãpØä wVK_SPACEá”ØäwPCERT_KEYGEN_REQUEST_INFO°ØäwSCARD_READERSTATEÌØäwDATATYPES_INFO_1AäØä wSTDOLE2_LCIDé wSQL_AA_TRUEâÙäxgethostbyaddr0ÙäxSetBindOptionsë xCC_SYSCALLã`Ùä yDRIVE_REMOTEá|ÙäyMK_E_NEEDGENERICáœÙäyPFD_GENERIC_FORMATëySC_MOVEâÄÙä zSetupCommèziFSGrafEffectøÙä{CONTEXT_E_ABORTEDÚä{PBT_APMRESUMESTANDBYá,Úä {wMaxAxesáLÚä{szOID_CRL_DIST_POINTSè{szOID_NETSCAPE_BASE_URLâ”Úä|IMAGE_REL_ALPHA_GPRELLOâ¬Úä |LocalDiscardáÈÚä|OpenInputDesktopáÜÚä|cMsgCrlê|FILE_DEVICE_WAVE_INâÛä}PEMRSETBRUSHORGEX8Ûä}CryptEnumProvidersãdÛä }CryptFindCertificateKeyProvInfoê }TYMEDŒÛä ~GetAtomNameWé~DFCS_BUTTONPUSHâØÛä#SCHED_E_UNSUPPORTED_ACCOUNT_OPTIONë%SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTEá,Üä€PARTITION_ENTRY_UNUSEDë€CHANGER_STORAGE_DRIVEdÜä node_alloc_â„ÜäPIMAGE_NT_HEADERS64âœÜä dmPaperWidthé PFNCALLBACKâàÜä ‚IMAGE_CE_RUNTIME_FUNCTION_ENTRYãÝä‚CO_E_INIT_CLASS_CACHE Ýä‚tagEMRSELECTCLIPPATHá8Ýä‚GetDlgItemIntXÝä‚MCI_RECORD_OVERWRITEé‚tagSQL_INTERVAL_STRUCTëƒMDM_PROTOCOL_V120_112Kã´Ýä „LPPOINTSáÌÝä „RemovePropAâèÝä„CTRL_CLOSE_EVENTâÞä „SHGNLI_PIDLâ Þä„PCTL_FIND_USAGE_PARAé„HaveWriteAccessâLÞä…rendáhÞä…PCF_PARITY_CHECKáŒÞä…CERT_STORE_PROV_SYSTEM_Wá¨Þä…PRINTER_INFO_7Wê…SQL_SP_UNIQUEàÞä†SCARD_E_NO_SERVICEãßä#†FindFirstPrinterChangeNotificationë†ILockBytes_LockRegion_Proxyâ\ßä‡_CERT_KEYGEN_REQUEST_INFOè‡CERT_COMPARE_ISSUER_OFãœßäˆiFSGrafEffectMSec´ßä ˆKP_PADDINGãÔßäˆEncryptedPrivateKeyêˆdwDevSpecificSize àä$‰JOBOBJECT_ASSOCIATE_COMPLETION_PORTâDàä‰WINSTA_ACCESSCLIPBOARDãdàä‰VS_FFI_FILEFLAGSMASKé‰LPCANCELMETHODCALLSâ¨àäŠERROR_SHARING_VIOLATIONêŠmixerGetControlDetailsAâààä‹make_heap áä‹IMAGE_WEAK_EXTERN_SEARCH_ALIASã(áä‹GetFileSecurityWáHáä‹dmDisplayFrequencyãdáä‹ExcludeClipRectâ„áä‹ENUM_SERVICE_STATUSAé‹SQL_SCROLL_KEYSET_DRIVENáÄáäŒWSA_QOS_BAD_STYLEèŒgmfptGlyphOrigináøáä __msl_alnumââä PUINT(âäSetDefaultCommConfigAèCryptUnregisterOIDInfoãhâäŽGetModuleHandleAá€âä ŽbV4GammaBlueé ŽpShareNameã°âä _MSL_STDIO_HáÐâä_SINGLE_LIST_ENTRYãðâäIMAGE_SCN_SCALE_INDEX ãäCRYPT_FORMAT_X509èNdrFixedArrayBufferSizeâLãäVOS_OS216_PM16ëMDM_AUTO_ML_NONEé‘SPI_SETKEYBOARDPREFâ¤ãä’THREAD_ALL_ACCESSÄãä’PEMREXTSELECTCLIPRGNáÜãä ’RemovePropWê’lpstrInitialDirâää“_SYS_GUID_OPERATORS_á0ää“PURGE_TXCLEARHää “GW_HWNDPREVâlää“CERT_STORE_PROV_SYSTEM_Aáˆää“PRINTER_INFO_7Aê“__IPropertyBag_FWD_DEFINED__áÐää”CloseWindowStationë”SQL_SNVF_BIT_LENGTHâåä•CRYPT_E_BAD_ENCODEã$åä•DS_CENTER4åä•UUIDáDåä •n_netXåä•dwNameLen|åä•PSM_GETCURRENTPAGEHWNDë$•IRunningObjectTable_IsRunning_ProxyâÐåä–ERROR_CTX_SHADOW_DISABLEDìåä–SPI_SETDRAGWIDTHâæä –ABL_5_WOé–VarR8FromBool0æä —aPolyCountsâTæä—SCARD_ATTR_CURRENT_CLKë—dwTagIdâæä˜THREAD_BASE_PRIORITY_LOWRTã°æä˜FILE_ATTRIBUTE_DEVICEÌæä˜GetModuleHandleWáøæä˜_CMSG_KEY_TRANS_RECIPIENT_INFOã(çä%˜__MIDL_itf_urlmon_0184_v0_0_s_ifspecé%˜__MIDL_itf_urlmon_0186_v0_0_c_ifspecátçä™ERROR_FAIL_I24ã˜çä™tagEMRSETVIEWPORTEXTEXãÄçä™PCMSG_KEY_AGREE_RECIPIENT_INFOãäçä™JOB_ACCESS_ADMINISTERèä%™__IHttpNegotiate_INTERFACE_DEFINED__é™dwTemplateMinLevelãXèäšPROCESSOR_HITACHI_SH3EãxèäšALG_CLASS_SIGNATUREâ”èäšCRYPT_NEWKEYSETâ°èäš_REASSIGN_BLOCKSé1šIForegroundTransfer_AllowForegroundTransfer_Stubá éä›SetDefaultCommConfigW(éä›CDS_SET_PRIMARYê ›IID_IOInetã\éäœLGRPID_CYRILLICâ€éäœmixerGetControlDetailsWâ”éä œPSN_HELPá¨éäœDISPIDãàéä,œIXMLDOMProcessingInstruction_get_data_ProxyêœSFLOATã êä LANG_ITALIANá(êäGetFileSecurityAáDêäSCARD_E_NO_ACCESSdêäDMPAPER_TABLOID_EXTRAxêä MMRESULTá êä_FULL_PTR_TO_REFID_ELEMENTãÄêäQUERY_IS_CACHED_OR_MAPPEDÜêäOLEIVERB_HIDEèENUM_SERVICE_STATUSWáëä žmultimapá0ëäžERROR_DIR_NOT_EMPTYâPëäžPDERR_SETUPFAILUREã„ëä)žCRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAGá¬ëäžIOleObject_SetHostNames_StubáÀëäžWordStrê žgrfBindInfoFáüëäŸFSCTL_MARK_AS_SYSTEM_HIVEèŸSQLInstallerErrorDìä! _IMAGE_CE_RUNTIME_FUNCTION_ENTRYápìä  ERROR_DS_CANT_RETRIEVE_INSTANCEâŒìä WGL_SWAP_OVERLAY7¨ìä WS_EX_APPWINDOWâ¼ìä CP_ACPãÔìä  CTRY_MEXICOâôìä ALG_SID_PCT1_MASTERâíä NTFS_STATISTICSâ,íä _ADDJOB_INFO_1Wê% JOB_NOTIFY_FIELD_SECURITY_DESCRIPTORáxíä¡WGL_SWAP_OVERLAY6˜íä¡szOID_CRL_REASON_CODEè¡SERVICE_ENUMERATE_DEPENDENTSáÜíä¢WGL_SWAP_OVERLAY5îä ¢IXMLDocument2_get_mimeType_Stubê¢GL_ID_NOCONVERTâ@îä£SetFileSecurityWá\îä£WGL_SWAP_OVERLAY4€îä£RegQueryMultipleValuesAâœîä£JOYERR_NOERRORë£RPC_AUTH_KEY_RETRIEVAL_FNäîä¤IMAGE_SCN_ALIGN_16BYTESãïä¤WGL_SWAP_OVERLAY3è¤WM_COPYâ,ïä ¥__num_bitsãHïä¥WGL_SWAP_OVERLAY2hïä¥RPCFLG_AUTO_COMPLETEáxïä¥sendá˜ïä¥szOID_OIWSEC_desMACâ¸ïä¥CERT_STORE_ADD_NEWERáÔïä¥PartitionEntryãôïä¥IID_IPersistStorageê¥IMN_SETCANDIDATEPOSê¦WGL_SWAP_OVERLAY1Dðä§NewInstâ\ðä §OSS_TOO_LONGáŒðä*§CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC¤ðä§OPENCARDNAMEWè§PIDDSI_NOTECOUNTáÜðä¨SCODE_SEVERITYäñä¨SPI_SETICONTITLELOGFONTâñä ¨chx11,ñä¨PMCI_LOAD_PARMSWé¨_cchBufâPñä ©chx10lñä©JOY_CAL_READVONLYè#©__ISynchronizeHandle_FWD_DEFINED__ã°ñäªCIEXYZãÀñäªchx13èªGetOpenCardNameAáôñä «R2_NOTXORPENá òä «SetWindowPosáòä «chx12@òä«CERT_STORE_SIGNATURE_FLAGXòä«nMaxFileTitleè«CommDlg_OpenSave_HideControláœòä¬__inplace_mergeâ¬òä¬chx15è¬CHANGER_REPORT_IEPORT_STATEâøòä­_TIME_ZONE_INFORMATIONã óä ­DT_CENTERè ­chx148óä®WGL_SWAP_OVERLAY9è®IMoniker_ComposeWith_Stubxóä¯WGL_SWAP_OVERLAY8ˆóä ¯chx16¨óä¯LPSCARD_T0_REQUESTë¯szHREFãÜóä°SW_SHOWMINNOACTIVEãôä°NdrConformantArrayMemorySizeé°VarBoolFromDecã4ôä±strnsetâLôä ±result_firstádôä ±CWPRETSTRUCTé±OPENCARDNAMEA˜ôä²NPWAVEFORMATEXã°ôä ²MCI_ESCAPEãÜôä ²PCRYPT_DECRYPT_PRIVATE_KEY_FUNCãõä²__IMoniker_FWD_DEFINED__áõä ²_xml_errorë²SQL_BP_TRANSACTIONãHõä³PEMRá€õä,³IXMLDOMProcessingInstruction_put_data_Proxyê³??_7ICodeInstall@@6B@´õä ´_getegidáÌõä ´__io_resultsáøõä ´IXMLDOMNode_put_nodeValue_Proxyâ$öä!´IXMLElement2_get_attributes_Stubá@öä´SQL_ACCESS_MODEê´SQL_NOT_DEFERRABLEãtöäµConditionˆöäµnot_eofâ¤öäµSetFileSecurityAáÀöäµBS_DIBPATTERN8X8áÜöäµSW_SHOWNOACTIVATEèµRegQueryMultipleValuesWâ÷ä ¶DRIVE_CDROMâ4÷ä¶STG_E_INCOMPLETEáP÷ä¶LPWAVEFORMATEXãx÷ä¶CERT_STORE_SAVE_TO_FILENAMEâŒ÷ä ¶MediaTypeè¶_ADDJOB_INFO_1AâÐ÷ä·??_Ebad_typeid@std@@UAE@I@Zâø÷ä"·ERROR_DS_NAME_ERROR_RESOLVING øä·SCARD_E_INSUFFICIENT_BUFFERâ4øä ·dwExStyleè·CERT_ID_SHA1_HASHtøä¸STATUS_FLOAT_UNDERFLOWã øä ¸ERROR_UNABLE_TO_REMOVE_REPLACEDê¸HSHELL_GETMINRECTàøä¹_CERT_FORTEZZA_DATA_PROPáøøä ¹ReuseBufferâùä¹STORAGE_BUS_TYPEá,ùä¹SQLFreeHandleè¹SQL_FN_NUM_ACOSâdùäºTAPE_STATISTICSêºSQLGetDiagFieldê»LPDLGTEMPLATEÔùä/¼IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWAREãôùä¼IMAGE_TLS_DIRECTORY64úä¼SWP_NOSENDCHANGINGãDúä%¼CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNEDé¼GetOpenCardNameWá|úä½char_coll_seq_ptr úä½ERROR_COLORSPACE_MISMATCHè ½IMallocSpy_PreHeapMinimize_Stubâìúä¾ARRAYFIELD_SUPPORTãûä¾IMAGE_REL_SH3_DIRECT32_NB,ûä¾PMCI_LOAD_PARMSAáDûä ¾CC_FASTCALLâlûä¾IInternetProtocol_Seek_Stubê¾GetHGlobalFromStreamá ûä¿tree_type¸ûä ¿iLayerPlaneê¿CFSTR_MIME_MPEGâðûäÀCreateWindowExãüä ÀpszUsernameâ0üä"ÀI_RpcServerUnregisterEndpointLüäÀISynchronizeEventèÀlpszStyle|üäÁUnmapViewOfFileâ¤üäÁERROR_FILENAME_EXCED_RANGEãÔüä#ÁERROR_DS_INVALID_LDAP_DISPLAY_NAMEãèüäÁPF_OSIë ÁLogFileReadsá(ýäÂIMAGE_SYM_CLASS_END_OF_STRUCTèÂSetMailslotInfoâ\ýä Ã__mips_bareâ€ýäÃIMAGE_DIRECTORY_ENTRY_IAT˜ýä ÃCTRY_KUWAITâ¼ýäÃNdrInterfacePointerFreeâìýä#ÃCHANGER_PREDISMOUNT_EJECT_REQUIREDã þä)Ã__IRpcChannelBuffer3_INTERFACE_DEFINED__é ÃlpLockOwnerâLþäÄPSIZELãlþäÄCB_SETDROPPEDWIDTHëÄSQL_SRJO_UNION_JOINâœþäÅquotáÄþä"ÅERROR_INSTALL_TEMP_UNWRITABLEèþäÅCONVERT10_E_OLESTREAM_GETáÿä ÅSND_RESOURCEáÿäÅPRINTER_INFO_5WêÅPUAF_CHECK_TIFSâPÿäÆRtlFillMemoryhÿä ÆVK_SEPARATORáÿäÆIOleInPlaceSite_Scroll_ProxyéÆSQLInstallDriverExãÈÿä Çround_styleâäÿäÇSubAuthorityCountä(ÇERROR_FAILED_SERVICE_CONTROLLER_CONNECTâDäÇ__IBindCtx_INTERFACE_DEFINED__ë#Ç__IViewObject2_INTERFACE_DEFINED__ãŒä ÈReportEventêÈXMLDSOControl¼ä ÉdwMaxTxQueueáÔäÉUSERCLASSTYPEèÉSQL_STATIC_SENSITIVITYãäÊ_IMAGE_VXD_HEADER8äÊOLE_E_NOT_INPLACEACTIVEâXäÊSTG_E_INVALIDFUNCTIONpäÊDT_RASPRINTER„ä ÊEN_UPDATEè ÊVariantCopyâ¼äËRpcServerTestCancelêËCLSIDFromStringâðä ÌdmPositionë ÌIDataAdviseHolder_Unadvise_Stubâ@äÍTAPE_DRIVE_ERASE_BOP_ONLY\äÍObjectNameTitleêÍCryptQueryObjectáäÎSUBLANG_DUTCH¨ä ÎVK_OEM_CUSELéÎISynchronize_Wait_StubãôäÏPIMAGE_SEPARATE_DEBUG_HEADERá äÏBLENDFUNCTIONèÏQUERYROPSUPPORTâDäÐSORTIDFROMLCIDãdäÐ_TAPE_SET_POSITIONë ÐdummyŒä ÑLockSegmentê ÑTC_CP_STROKEá¼ä ÒcrBkColorSrcé%ÒIXMLDOMDocument_get_readyState_ProxyâäÓGetKValueäÓSM_MIDEASTENABLED<äÓCRYPT_USER_PROTECTEDáXäÓPRINTER_INFO_5AâŒä)Ó__IRpcChannelBuffer2_INTERFACE_DEFINED__éÓSQL_KEYSET_SIZEê ÔpbstrValáÐäÕungetwcâèäÕRtlZeroMemoryáäÕwSettableData äÕGetHandleInformationáHäÕGetSecurityDescriptorOwnerã`äÕRpcTestCancel„äÕIStorage_SetClass_StubëÕintValã°ä Ö_STDEXCEPTãÀäÖ_tagáÜäÖerror_status_tëÖFMTID_DiscardableInformationáä×__neutral,ä×getenvãHä×MM_STREAM_ERRORê×SQL_FN_TD_NOW|äØERROR_BAD_PIPEã˜äØEMREXTFLOODFILLâÈä%Ø__MIDL_itf_urlmon_0185_v0_0_s_ifspecáøä%Ø__MIDL_itf_urlmon_0187_v0_0_c_ifspecéØCF_SELECTSCRIPTâ$äÙ_MAPéÙWINSTAENUMPROCã\äÚIMAGE_RELOCATIONáˆä ÚERROR_DEVICE_ALREADY_REMEMBEREDâ¤äÚszOID_RSA_SHA1RSA¼ä ÚVT_SAFEARRAYéÚIWinInetInfo_QueryOption_ProxyãäÛERROR_ACCESS_DENIEDâ0äÛERROR_DS_SUB_CLS_TEST_FAILãDä ÛptlPixeláläÛszOID_KEY_USAGE_RESTRICTIONâ”äÛCMSG_KEY_TRANS_CMS_VERSIONã¬ä Û_midl_addpëÛ??_7IPropertySetStorage@@6B@áèä Üwistreamá äÜSEC_E_CANNOT_INSTALLéÜCRYPT_CREDENTIALS@ äÝset_differenceã\ äÝWM_STYLECHANGINGát ä ÝWS_MINIMIZEêÝVerInstallFile㨠ä ÞResetEventãÀ ä ÞCreatePipeëÞSQL_UNSEARCHABLEáü äßSetHandleInformationéßCHANGEKIND_INVALIDATE0 ä àSEC_E_OKéàIXMLDocument_get_root_Stubãl äá_ultoa㈠äáMUTANT_ALL_ACCESS´ ä áIMAGE_SUBSYSTEM_EFI_APPLICATIONâÜ äáDNS_ERROR_ZONE_ALREADY_EXISTSèáIS_INTRESOURCEã äâstringbuf, äâ_JOBOBJECTINFOCLASSâ@ ä âtmItalicá\ äâSWP_FRAMECHANGEDáp äâDDE_FBUSYœ ä âCryptVerifyCertificateSignatureêâIStorage_Commit_ProxyèãSPAPI_E_NO_DEVICE_SELECTEDä ääExtendedRegisters$ äätagMCI_OVLY_LOAD_PARMSAêäSQLMoreResultsãX ä åPAGE_EXECUTEáp ä åMAXINTATOMã äåMCI_VD_GETDEVCAPS_CLV¤ äåMP_8mmãÀ äåPRINTER_INFO_4WêåAddPrinterConnectionAü äæ?$is_void_imp@Xê æBaseOfCodeã( äçSCHAR_MIN< äçSB_LINEUPT ä çFILEOPENORDê*çIXMLHttpRequest_get_responseXML_Proxyœ ä è_MSL_CMATHã° äèRDW_ERASEÐ äèHKEY_CURRENT_CONFIGâô äè_RPC_NOTIFICATION_TYPESâ(ä'èPCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARAãHäèFILE_DEVICE_MIDI_INâpäèFMTID_UserDefinedPropertiesêèGL_LEVEL_NOGUIDELINEáôäXé?$__wrap_iterator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PB$$CBDâäéMETA_CREATEREGION,äéEMR_SETMAPMODEãLäétagMCI_LOAD_PARMSWã`ä épwcsNameá|äéREGKIND_REGISTERééMOD_IGNORE_ALL_MODIFIERâ¸äêQDI_GETDIBITSÐä êTC_SCROLLBLTáèä êCTRY_BELIZEêêLOCALE_ENUMPROCWáä ëWriteFileExâ8äëWNNC_NET_MSNETãXäëIOCTL_STORAGE_BASEãpäëAddConnectionŒäëPropVariantCopyê ëCF_NOSIZESELá¼ä ìlcsFilenameâÔä ìSO_RCVLOWATêìszOID_OIWSEC_desECBâ ä í_MSL_CTIMEã,äíVerifyVersionInfoWã<äíwMidá`äíRpcMgmtIsServerListeningá€äíIsHashValCompatibleê íSC_HANDLE__â¸äîGDICOMMENT_BEGINGROUPè îEnumPortsWãää ï_execlpeáüä ïNPPOLYTEXTWê ïMFS_ENABLEDâ(äðlpDataãTäðIEnumFORMATETC_RemoteNext_StubãdäðDummyè ðTKIND_RECORDáœäñIMPORT_OBJECT_ORDINAL¸äñERROR_PRINTQ_FULLÐä ñMIM_LONGDATAáèäñMCI_MAKE_TMSFèñMCI_ANIM_OPEN_PARMSâäòlessá@äòIMAGE_ARCHIVE_MEMBER_HEADERâdäòtagMCI_OVLY_LOAD_PARMSWêòFLAG_STGMEDIUM_UserUnmarshalá¬äó_MSL_UNISTD_WIN32_HâÈäóPMCI_STATUS_PARMSìäó_CMSG_SIGNED_ENCODE_INFOáäóPRINTER_INFO_4Aâ(äóAddPrinterConnectionWLäóPSD_INTHOUSANDTHSOFINCHESèóSQL_HANDLE_SENVê ôEXPENTRYáäõselectã¨ä õSTDMETHODIMPáÐäõSE_PRIVILEGE_USED_FOR_ACCESSáèä õHP_HASHVALãäõCLSID_CCDLabelã äõDeleteTypeInfoã<äõCDN_INCLUDEITEMâPäõintvalëõSQL_MAX_LENGTH_DEFAULTã¤ä%öERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAINáÌäöCHANGER_SERIAL_NUMBER_VALIDê öPIDSI_AUTHORáøä÷_ultowãä÷_MSL_WSTRING_Hã<ä"÷ERROR_DS_DRA_INCONSISTENT_DITXä÷ReleaseCaptureãxä÷X509_DSS_PARAMETERSâŒä ÷MOD_LEFTé÷SQL_FD_FETCH_LASTÄäøPDRAWITEMSTRUCTâàäørgCmsRecipientsâøäøpTransmitTypeè øEnumPortsAã$äùlcsCSTypeHäùPAN_MIDLINE_HIGH_SERIFEDá`ä ùNPPOLYTEXTAâxäùANIMATIONINFO¨ä&ùIInternetBindInfo_GetBindString_Proxyè ùVarCyFromDecáääúIMAGE_REL_ALPHA_GPRELHIâäúSEC_E_ILLEGAL_MESSAGE äúMAKEINTRESOURCEâ@äúRpcServerUseProtseqIf`äúCRYPT_OID_FUNC_ENTRYéúpUnká„äûODDPARITY¤äûVerifyVersionInfoAëûSTYLE_DESCRIPTION_SIZEãÜäüset_colorðäüPFLOATã äüLOCALE_ENUMPROCAá8ä"üAsyncIPipeDouble_Begin_Push_ProxyèüSOFTDIST_FLAG_USAGE_EMAIL„äþERROR_DS_CROSS_DOM_MOVE_ERRORèþVP_TV_STANDARD_NTSC_433âÈäÿtagMCI_LOAD_PARMSAãèäÿCERT_NAME_RDN_TYPEëÿtagSTREAM_SEEKãå @72024åERROR_NO_USER_KEYSãLå HTSIZEFIRSTâpåMDM_PROTOCOL_V110_57DOT6Ké%SQL_SQL92_FOREIGN_KEY_UPDATE_RULE¬ä @7203Ää EV_RX80FULLâääOpenEncryptedFileRawAèPEMRSTRETCHBLTãä @72000äCS_E_NO_CLASSSTOREãPäPERF_DETAIL_WIZARDãxä"BINDINFO_OPTIONS_BINDTOOBJECT˜äBINDSTRING_PASSWORDâ¼äSQL_ATTR_ENABLE_AUTO_IPDé SQL_BP_DROPâää @7201 äPIMAGE_BOUND_FORWARDER_REFã äWIZ_CYDLG`ä6IGlobalInterfaceTable_RevokeInterfaceFromGlobal_ProxyèSQL_ATTR_CURSOR_TYPEáä @7206¸äEXCEPTION_CONTINUE_EXECUTIONáèä*PJOBOBJECT_EXTENDED_LIMIT_INFORMATIONøä hIconäCRYPT_LAST_OID_GROUP_IDêCMSG_CMS_RECIPIENT_COUNT_PARAMãXä @7207pä ReleaseMutexáˆätagTOGGLEKEYS¬äRpcNetworkIsProtseqValidAèIXMLDOMNode_get_prefix_Proxyáèä wmemmoveáøä @7204äDOF_SHELLDATA äIfIdáPä$CERT_CHAIN_POLICY_BASIC_CONSTRAINTSâ|ä IXMLElementCollection_item_Stubâ”äVarUI1FromStrèSQL_ATTR_LOGIN_TIMEOUTãÈä @7205ðä"JOB_OBJECT_LIMIT_BREAKAWAY_OKäPPRINTPROCESSOR_INFO_1ë ReadPrinterâTäERROR_FLOPPY_UNKNOWN_ERRORãläBS_AUTO3STATE„ä iMenuHeightâ°ä __IContinue_INTERFACE_DEFINED__êPIDMSI_PRODUCTIONää SidTypeDomainá ä CO_E_SCM_ERRORã ä MIDIMAPPERã4 ä _CERT_RDN_ATTRë PI_DATAPROGRESSâ` ä @7208€ ä tagUSEROBJECTFLAGSë DD_DEFSCROLLINSET¬ ä @7209È ä POSVERSIONINFOEXAè ä _PALETTEENTRY_DEFINEDü ä HOOKPROCá!ä szOID_LICENSESã,!ä cAltEntry@!ä parrayë SQL_SG_UPDATE_COLUMNé ILockBytes_SetSize_Proxyáœ!ä STG_E_INUSEâ¸!ä NTE_BAD_SIGNATUREØ!ä CLIP_STROKE_PRECISãø!ä MIXER_OBJECTF_MIDIINá "ä MCIERR_DEVICE_NOT_INSTALLEDâH"ä CRYPT_FORMAT_RDN_SEMICOLONãx"ä$ CERT_ALT_NAME_VALUE_ERR_INDEX_SHIFTâ "ä CERT_STORE_PROV_COLLECTIONãÀ"ä USAGE_MATCH_TYPE_ANDáä"ä IPersist_GetClassID_Stubáü"ä szCustomVerbé SQL_AT_ADD_COLUMN_COLLATIONâ8#ä CBS_SORTáP#ä midiInStartâp#äPSM_SETHEADERSUBTITLEèImmGetDescriptionAã¤#äPASCALãÀ#äPTOKEN_PRIVILEGESØ#ä SIOCSLOWATãð#ä NO_PRIORITYâ$ä??_7ICallFactory@@6B@P$ä4IOleInPlaceActiveObject_OnFrameWindowActivate_Proxyê2IXMLDOMProcessingInstruction_get_target_Proxyœ$ä @no_name@èSTG_E_INVALIDHEADERâà$äOSS_CANT_OPEN_TRACE_FILEá%äHSHELL_WINDOWACTIVATEDã%ädwCPKeyâ<%äPROPSHEETPAGEA_V1_SIZEë SQL_DOUBLEãl%ä _MSL_CSTDLIBá%äWin32ServiceOwnProcessã¨%ä iVertSpacingáÀ%äMCI_OVLY_RECTÜ%äCERT_DSS_R_LENë#NETSCAPE_SSL_CLIENT_AUTH_CERT_TYPEã$&äNEWTEXTMETRIC<&ä MM_LOMETRICâ`&äRESOURCEDISPLAYTYPE_ROOTá€&ä_NETCONNECTINFOSTRUCT˜&ä MMIOM_SEEKëRpcNetworkIsProtseqValidWà&äRpcNsEntryObjectInqBeginé(IOleInPlaceSite_DeactivateAndUndo_Proxyâ$'äend_á@'äERROR_PATH_BUSYât'ä'ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBERãŒ'ä GetRandomRgná°'äwglGetLayerPaletteEntriesèVIDEOPARAMETERSâä'ä dSignatureãø'äIsEqualâ(ä PENDINGMSGë tagOLEUPDATEá<(äCONTEXTâX(äSTD_ERROR_HANDLEáx(äOpenEncryptedFileRawW”(äNRC_OSRESNOTAVã°(äPCERT_RDN_ATTRãØ(äCERT_KEY_IDENTIFIER_PROP_IDâô(äLPSTDMARSHALINFOá )ä!IStorage_RemoteEnumElements_Stubé IOleLink_GetSourceMoniker_Proxyâ`)ä spawnlpeáŒ)ä!SPAPI_E_DEVICE_INTERFACE_REMOVEDá¤)ä WM_DROPFILESéImmGetDescriptionWãä)äIMAGE_SYM_TYPE_VOIDã*äReportSetmarksã*äPC_NONEê IXMLDOMDocument_get_async_ProxyâP*äPCHêINET_E_USE_DEFAULT_SETTINGã¨*ä#IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRYãÀ*äLockSemaphoreÜ*äRecognizerTypeãø*äIDHOT_SNAPDESKTOPè.URLACTION_INFODELIVERY_NO_CHANNEL_LOGGING@+ä_SW_TOPâd+äAccessCheckAndAuditAlarmá|+ä dwReserved2êPRINTER_CONTROL_PURGE¸+äPOSVERSIONINFOEXWä+ä CRYPT_OID_ENCODE_OBJECT_EX_FUNCêSQL_SNVF_OCTET_LENGTH,äinitá4,äJOB_OBJECT_TERMINATEáL,ä ExitProcessâd,ä dwReserved0âx,äLC_NONEâ˜,äPRPC_PROTSEQ_ENDPOINT°,äVarUI2FromStrèSQL_NULLABLE_UNKNOWNáì,ä_REFCOUNTEDPTR_Hâ-äPrivilege-ä dwReserved1â0-ätagSERVERCALLèBINDF_PULLDATAã\-ä @7212p-ä S_SERDVLáŒ-ä tagLOGCOLORSPACEA¨-ä LPCDLGTEMPLATEãÄ-ä CONNDLG_USE_MRUâÔ-ä stc12ø-ä CryptFlushTimeValidObject,.ä( IBindStatusCallback_OnStartBinding_Stubê CF_SCREENFONTSãX.ä !@7213x.ä!TYPE_E_INVALIDSTATEâˆ.ä !stc13°.ä!PRINTER_STATUS_PAPER_PROBLEMáÔ.ä!MDM_PROTOCOL_V110_14DOT4Kè!SQL_UNSPECIFIEDã/ä "@7210 /ä"SUBLANG_ENGLISH_AUSâD/ä"BSF_NOTIMEOUTIFNOTHUNGãT/ä "stc10„/ä$"PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPEâœ/ä "wireHPALETTEé "VarUI4FromR4áÄ/ä #@7211Ô/ä #stc11ø/ä#LPMCI_VD_ESCAPE_PARMSAã(0ä%#NdrConformantVaryingStructMemorySizeá<0ä #WIZ_CXDLGè #DEVNAMESád0ä$lroundfât0ä $@7216„0ä $stc16˜0ä$__RPC_FARÄ0ä&$RPC_CONTEXT_HANDLE_DONT_SERIALIZEà0ä$RCRYPT_SUCCEEDEDáü0ä$FINDMSGSTRINGAë$SQLGetDiagRec01ä%max_exponent10ã@1ä %@7217h1ä"%CACHE_S_SOMECACHES_NOTUPDATEDˆ1ä%META_OFFSETCLIPRGNã 1ä%otmMacLineGap°1ä %stc17Ì1ä%_midl_unmarsh_upáô1ä%IXMLElement2_get_type_Stubë%IME_CONFIG_REGISTERWORDâ(2ä &@7214@2ä&FACILITY_NULLd2ä&TYPE_E_CANTLOADLIBRARYãt2ä &stc14œ2ä&CRYPTPROTECT_PROMPT_RESERVEDá¸2ä&NdrSH_UPDecisionáÈ2ä&Startè &PSBTN_BACKãð2ä '@72153ä'scBaseã3ä 'nVirtKeyá(3ä 'stc15@3ä 'KP_ADMIN_PINáp3ä&'IHttpSecurity_OnSecurityProblem_Proxyè'SQL_CT_COLUMN_DEFAULT¤3ä (PULONG64é(RPC_ADDRESS_CHANGE_TYPEê )UNIQUE_NAMEâð3ä*@7218á4ä *stc184ä*waveOutBreakLoopá04ä*PF_DLIãP4ä*IRpcChannelBuffer2ë*??_7IBindProtocol@@6B@ã„4ä +@7219œ4ä +VK_OEM_PLUSâ°4ä +hwndNextáÄ4ä+RDW_FRAMEÔ4ä +stc19ü4ä+PFN_CERT_STORE_PROV_CONTROLâ5ä+IRpcChannelBuffer3ã@5ä+IEnumVARIANT_Skip_Proxyê+CHANGEKIND_MAXãp5ä,BOOLEANâŒ5ä,CRYPT_E_MSG_ERROR¤5ä ,RemoveMenuãÄ5ä,REASON_SERVICEHANGãà5ä,PSH_RTLREADINGë,LIBFLAG_FRESTRICTEDâ6ä -wDayOfYearã<6ä-DISPATCH_PROPERTYPUTREFê-SQL_FD_FETCH_ABSOLUTE|6ä.SETTINGS_BFI_PREFIXâ6ä.stdoutã¤6ä.lroundlâ´6ä .ACCELÌ6ä .Begin_Pullãä6ä .VarUI4FromR8é.VarUI4FromStr7ä/__binder1st_const_ref47ä/OLE_E_OLEVERBX7ä/PMCI_ANIM_WINDOW_PARMSWâp7ä /MIDL_uhyperê/JOB_CONTROL_LAST_PAGE_EJECTEDè0EACCESã¼7ä1absâÔ7ä 1cbWndExtraãè7ä 1GetOEMCPâ8ä 1pszOldPathë1tagREGCLS,8ä2__wStringReadD8ä 2SO_DISCDATAât8ä&2ICreateTypeInfo_SetTypeDescAlias_Stubè2FINDMSGSTRINGWã´8ä3DNS_ERROR_TRY_AGAIN_LATERè 3ENABLEDUPLEXé 4NTE_BAD_LENâ9ä5DMPAPER_ENV_INVITEã9ä5StartPage<9ä5LPMCI_VD_ESCAPE_PARMSWë(5CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAGâŒ9ä6tagLOGCOLORSPACEW¬9ä6WM_DESTROYCLIPBOARDê#6IID_IInternetProtocolSinkStackableãô9ä7max_child_ptr :ä 7MEMORYSTATUSá4:ä"7MSSIPOTF_E_FAILED_HINTS_CHECKH:ä7dwTempoâp:ä7MCI_STATUS_NUMBER_OF_TRACKSê$7IOplockStorage_CreateStorageEx_StubâÄ:ä8PAN_LETT_OBLIQUE_WEIGHTEDà:ä8DialogBoxParamãü:ä8PARTITION_NTFTë8math_x87_inlines.hã<;ä9ERROR_NO_SUCH_DOMAINá`;ä9PMCI_ANIM_WINDOW_PARMSAâ„;ä9CMSG_VERIFY_SIGNER_CHAINé!9ICreateTypeInfo_AddFuncDesc_StubáÐ;ä:PAN_SERIF_EXAGGERATEDä;ä:EMRBITBLT<ä:VP_TV_STANDARD_SECAM_K1ê :HWAVEOUTá4<ä;n_cs_precedesH<ä ;max_sessád<ä;PROTOCOL_LOADEDê ;pszTitleáœ<ä<AUDIT_ALLOW_NO_PRIVILEGEá´<ä <BN_DISABLEãÈ<ä <LANA_ENUMè<CLSCTX_INPROC_SERVERâ=ä =REG_BINARYã=ä=VS_USER_DEFINEDê=SNB_UserUnmarshalL=ä>isequalâ\=ä >LowId|=ä>LBS_OWNERDRAWFIXEDã¤=ä>CRYPT_ALGORITHM_IDENTIFIERã¸=ä>_CERT_RDNÔ=ä>USER_MARSHAL_CBê>SQL_BP_DELETE>ä ?SYSTEM_INFOâ$>ä?GetForegroundWindowâ@>ä?dwControlKeyStatel>ä!?CertAddCertificateContextToStoreáŒ>ä???_7IAdviseSink2@@6B@è ?extras.há´>ä@bufferãÄ>ä @@7222ô>ä%@ERROR_CLUSTER_NETINTERFACE_NOT_FOUNDá?ä@stc22è @SQL_CVT_REALá,?ä A@7223X?äAIMAGE_FILE_LOCAL_SYMS_STRIPPEDãh?äAstc23èASQLSetDescFieldWá”?ä B@7220¤?äBstc20è"BIPropertyBag_RemoteRead_ProxyÜ?ä C@7221ð?äCVK_LEFTã@ä Cstc21$@äC_PERF_INSTANCE_DEFINITION<@ä CTailLengthëCSQL_FETCH_FIRSTâ€@äDLPCREATE_THREAD_DEBUG_INFOã¤@äDERROR_BAD_DRIVER_LEVELã´@ä Dstc26È@äDCRYPT_MACô@ä&DPCMSG_CTRL_KEY_TRANS_DECRYPT_PARA(Aä(DIXMLDOMCharacterData_substringData_StubâDAäDPIDDSI_DOCPARTSêDVarBoolFromCylAä Estc27AäEIXMLDOMNode_get_xml_ProxyèEtagOFNAâ´Aä Fstc24ÐAäFCryptMsgDuplicateèFSQL_FN_TSI_FRAC_SECONDãBäGWN_BAD_DEV_TYPEâ Bä Gstc25 iValáˆÀä%> ICreateErrorInfo_SetHelpContext_Stubé> SQL_FETCH_PREVãÈÀä? ERROR_CONNECTION_UNAVAILáèÀä? TRUST_E_BAD_DIGESTäÁä ? adapter_typeáÁä ? TapeInfoá<Áä? IStorage_EnumElements_Proxyê? SQL_FN_TD_MINUTEátÁä@ CTRY_KAZAKSTANãœÁä@ ReadConsoleOutputCharacterWê@ CounterHelpTitleáØÁäA META_SETVIEWPORTEXTâðÁäA FixBrushOrgExÂä A WNetGetUserâ(ÂäA _CRYPT_OID_FUNC_ENTRYHÂäA PRINTER_CHANGE_ALLëA MDM_PROTOCOL_V110_19DOT2K”ÂäB ERROR_NO_TRUST_SAM_ACCOUNTë B BusTypeRAIDâÀÂäC EDEADLKâàÂäC SHGetDiskFreeSpaceExAèC GetDocumentationá ÃäD PROCESS_SET_INFORMATIONâ@ÃäD PRTL_OSVERSIONINFOEXW\ÃäD ERROR_INVALID_DLL|ÃäD ERROR_FUNCTION_FAILEDè D ERROR_DS_DSA_MUST_BE_INT_MASTERâÀÃä E EMR_ELLIPSEâÜÃäE LPMCI_SAVE_PARMSáüÃäE PIDMSI_STATUS_VALUEêE SQL_SP_IN(Ää F LPCOLORREFã<ÄäF MCI_PUTâXÄäF CERT_HASH_PROP_IDèF PCERT_CHAIN_ENGINE_CONFIG˜ÄäG dmDefaultSourceâ°ÄäG getservbyportÌÄäG PCERT_KEY_CONTEXTèG SCardIntroduceReaderGroupWãÅäH lpstrDeviceTypeêH SCARD_STATE_PRESENTâPÅäI CreateFileMappingWãlÅäI GetFieldNoCopyëI VarBoolFromI4œÅä J DataPaddingâ°ÅäJ MWT_MAXêJ PAN_SERIF_FLAREDáøÅä&K @class$7690clientEngine_dbg___pchÆäK I_RpcClearMutexâ0ÆäK SHFILEOPSTRUCTAâLÆäK PERF_TEXT_UNICODEèK DATADIRâxÆä L PROV_DSS_DHâÆä L OnProgressã¬ÆäL OnDataAvailableâÌÆäL VAR_CALENDAR_HIJRIãäÆäL VarBoolFromI1è L SQL_DATE_LENá$ÇäM DONT_RESOLVE_DLL_REFERENCESêM CO_E_OBJNOTCONNECTEDáTÇäN cOIDáhÇä N pFileExtáŒÇäN PRINTER_ATTRIBUTE_DIRECTá¤Çä N LPENUMSTRINGéN iidâÌÇä O TokenPrimaryáàÇä O e32_res3áôÇäO FSHIFTãÈäO WIM_CLOSE(ÈäO IMoniker_IsEqual_StubLÈäO IID_IBindStatusCallbackâ€Èä'O URLACTION_CHANNEL_SOFTDIST_PERMISSIONSëO VarBoolFromI2¬ÈäP res_argâÈÈäP SUBLANG_KOREANãèÈäP WM_IME_COMPOSITIONëP SQL_FETCH_BY_BOOKMARK Éä Q CTRY_GREECEâHÉäQ SCardIntroduceReaderGroupAãlÉäQ IMallocSpy_PreAlloc_Proxyè"Q ILockBytes_UnlockRegion_Proxy´ÉäR ERROR_DS_COMPARE_TRUEØÉäR ICM_UNREGISTERICMATCHERâðÉä R pMonitorNameáÊäR CLSID_IdentityUnmarshalêR CoUnmarshalHresultãTÊäS ERROR_PRODUCT_VERSIONxÊäS MCI_INFO_MEDIA_IDENTITYâœÊäS GET_CHANGER_PARAMETERSëS OleGetIconOfClassàÊäT TAPE_DRIVE_SEQUENTIAL_SMKSë T nextNodeáËäU SHGetDiskFreeSpaceExWèU VolumeTagInfoPËäV NO_PROPAGATE_INHERIT_ACEáhËä V _WINERROR_ãËäV ReadConsoleOutputCharacterAâ¸ËäV I_RpcGetAssociationContextãÌËä V wireHWNDáìËäV SCARD_ATTR_ESC_CANCELüËäV llValè$V ITypeInfo2_GetFuncIndexOfMemId_StubâDÌä W ZAWPROXYAPIêW MCI_ANIM_WHERE_SOURCEˆÌäX FRS_ERR_SYSVOL_IS_BUSYëX CertDeleteCTLFromStoreãØÌä!Y SID_IDENTIFIER_AUTHORITY_DEFINEDáðÌä Y cBlueShiftäÍäY MB_OKèY JOB_STATUS_RESTARTãLÍäZ ERROR_DS_ATT_NOT_DEF_IN_SCHEMAãdÍäZ CTLCOLOR_EDIT€ÍäZ CERT_RDN_ANY_TYPE¤ÍäZ IID_IInternetProtocolSinkèZ SQL_API_SQLSETSTMTATTRãôÍä"[ @class$7691clientEngine_dbg___pchè [ PJOYCAPSá$Îä\ currency_symbolâ<Îä \ S_PERIOD1024é\ EMRSETCOLORSPACEá|Îä] TokenImpersonationLevelâ¤Îä] ERROR_DEVICE_NOT_AVAILABLEãÀÎä] SHFILEOPSTRUCTWê] SQL_FETCH_RELATIVEãÏä^ SCHED_E_NO_SECURITY_SERVICESá(Ïä^ CRYPT_E_ASN1_INTERNALè^ LCTYPEã\Ïä_ CreateFileMappingAã„Ïä_ ERROR_DISK_OPERATION_FAILEDâ¨Ïä_ ERROR_DS_SYNTAX_MISMATCHáØÏä#_ MIXER_SETCONTROLDETAILSF_QUERYMASKãÐä&_ BINDSTATUS_CACHEFILENAMEAVAILABLE Ðä_ LPCOMPOSITIONFORMè_ SQL_API_SQLPREPAREã\Ðä` GetNextCodeBaseê` NPCANDIDATEFORMâ Ðäa IMAGE_DIRECTORY_ENTRY_EXPORTá´Ðäa EV_DSRãØÐäa SEC_E_ALGORITHM_MISMATCHáÑä a SCARD_ATTR_VENDOR_IFD_SERIAL_NOâ Ñäa PADDJOB_INFO_1ëa SQL_FN_NUM_COSã\Ñäb DEFAULT_UNREACHABLEâˆÑä&b ERROR_DOMAIN_CONTROLLER_NOT_FOUNDœÑäb VK_MENUêb hwndOwnerÔÑäc BASED_ON_BINFILE_CLIENTâìÑä c TYMED_MFPICTéc CLSID_MkProtocolá(Òäd PSIDENT_GDICENTRICãDÒäd EMR_POLYBEZIER16á\Òäd WM_INITDIALOG|Òäd VP_CP_CMD_DEACTIVATEáœÒäd ReadConsoleOutputWã¸Òäd DdeNameServiceëd NdrNsGetBufferãüÒä"e ERROR_INVALID_OPLOCK_PROTOCOLÓäe DMPAPER_LEGAL0Óäe MENUITEMTEMPLATEáTÓäe IMallocSpy_PreAlloc_StubálÓä e __oaidl_h__êe SQL_SQ_IN¤Óäf PRPC_SYNTAX_IDENTIFIERã¼Óä f tagEXTCONNãØÓäf PutFieldNoCopyãøÓäf SERVICE_CONTROL_STOPáÔäf SQL_QUALIFIER_USAGEêf SQL_FN_NUM_COTã|ÔäBg ?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@Ôä g distanceá¤Ôäg __rbitsâÐÔäg GetSecurityDescriptorRMControlãäÔä g VFT_FONTáøÔä g SOCK_RAWáÕäg _CRYPT_OID_INFOêg ITypeLib2_GetCustData_Stubã`Õäh ??_Ebad_cast@std@@UAE@I@ZtÕäh ENOLCKãœÕäh IMAGE_NT_OPTIONAL_HDR_MAGICâ´Õä h pvCompletioné(h IPropertyStorage_ReadPropertyNames_StubãÖä i mmioSetInfoâ(Öäi PRINTER_CHANGE_CONFIGURE_PORTèi PARAMFLAG_FOUTã`Öäj COMPAREITEMSTRUCT€Öäj PCRYPT_KEY_PROV_PARAMè j STGFMT_ANYã°Öä k mon_groupingáØÖäk PrivilegedServiceAuditAlarmâðÖä k CreateFontWâ×ä"k @class$7692clientEngine_dbg___pchèk SQL_QUERY_TIMEOUT_DEFAULT\×äl tagCWPRETSTRUCTât×ä l mmioGetInfoêl IME_CMODE_JAPANESEã´×äm GetTextExtentPoint32AÔ×äm GDICOMMENT_IDENTIFIERä×ä m HSZ__Øäm XTYP_XACT_COMPLETEëm CLSID_ManualResetEventãDØän ENUMRESNAMEPROCAé n _text|Øäo ERROR_CALL_NOT_IMPLEMENTEDã”Øä o ETO_CLIPPEDêo CancelãÈØäp WSA_QOS_EPSFLOWSPECâìØäp midiOutUnprepareHeaderãÙäp CERT_RDN_DISABLE_IE4_UTF8_FLAGãLÙä'p __ICreateTypeInfo2_INTERFACE_DEFINED__ãlÙäp SERVICE_START_PENDINGèp SQL_DIAG_DROP_ASSERTIONâ¬Ùäq PAN_SERIF_THINëq PFN_CERT_ENUM_SYSTEM_STOREãðÙär FILE_READ_DATAãÚär dwOptions$Úär ReadConsoleOutputAër SQL_DIAG_CREATE_TRANSLATIONâpÚäs CRL_REASON_CA_COMPROMISEá˜Úäs __ITypeMarshal_FWD_DEFINED__á¸Úäs LPOINETPROTOCOLROOTâÐÚä s URLZONEREGës VarCmpãôÚä t scanf Ûä t wDayOfWeekã(Ûät PARTITION_FAT32âHÛät ELEMENT_STATUS_SVALIDlÛät PRINTER_STATUS_IO_ACTIVEé t get_fileSizeá¬Ûäu PROCESSOR_ARCHITECTURE_SHXãÀÛäu nHeightêu _CERT_KEY_ATTRIBUTES_INFOøÛäv strspnpâÜäv DLL_THREAD_DETACH0Üäv WM_CTLCOLORDLGãLÜäv RpcServerListenâtÜä"v CHANGER_KEYPAD_ENABLE_DISABLE˜Üäv IOleCache_InitCache_Stubév IME_CAND_UNKNOWNáÔÜäw IMPORT_OBJECT_CODEãìÜäw WM_NEXTDLGCTLÝäw CERT_STORE_PROV_READ_CRL_FUNCèw ??_7IPersistMoniker@@6B@áPÝä x PARITY_NONEâlÝäx ENUMRESNAMEPROCWáŒÝäx ERROR_INVALID_CLEANER°Ýäx szOID_PKIX_KP_IPSEC_USERé x rgbCounterãÜÝäy to_signedüÝäy SEE_MASK_DOENVSUBSTâÞäy DISK_LOGGING_DUMPHÞä$y CHANGER_DEVICE_REINITIALIZE_CAPABLEêy DestroyPropertySheetPageéz AbnormalTerminationâ¤Þä { _MSL_CLIMITSáÌÞä{ RPC_S_WRONG_KIND_OF_BINDINGâìÞä{ GetTextExtentPoint32Wßä"{ @class$7693clientEngine_dbg___pchè{ SQL_DRIVER_HENVâXßä| SYSER_PRODUCT_CODE_ALT1â€ßä| SetSecurityDescriptorGroupã¨ßä| CERTSRV_E_BAD_REQUESTSUBJECTáÀßä | CLOSECHANNELáÔßä | VK_LMENUáðßä| BSF_POSTMESSAGEê | CP_OEMCPáàä } CreateFontAâ4àä } DLGTEMPLATEâ\àä} CERT_COMPARE_SIGNATURE_HASHâtàä } DOMDocumentâŒàä } setNamedItemé} SERVICE_STOP_PENDINGáÐàä~ SYSER_PRODUCT_CODE_ALT3âäàä~ insertãáä~ ERROR_BUFFER_OVERFLOW áä~ SYMBOL_CHARSETã8áä ~ midiInGetIDê"~ IBindCtx_GetObjectParam_Proxy„áä SYSER_PRODUCT_CODE_ALT2â˜áä WOM_CLOSE¸áä SCARD_SHARE_SHAREDë$ ITypeInfo2_GetAllParamCustData_Stubâüáä € INFINITYá âä€ PMENUITEMTEMPLATEHEADERê€ dwErrorControlãXâä GetTempFileNameWáhâä qosâˆâä szOID_OIWSEC_rsaXchgá¨âä CRL_DIST_POINT_NAMEâØâä% CRYPT_OID_REG_FUNC_NAME_VALUE_NAME_Aáðâä IRpcHelperã(ãä, IInternetSession_UnregisterMimeFilter_Proxyê GCS_COMPSTRâpãä$‚ PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRYâãä‚ EMR_SETPOLYFILLMODEâ¬ãä‚ PEMRPIXELFORMATê‚ WN_ACCESS_DENIEDáäãäƒ VER_MAJORVERSIONâääƒ PARSE_FRIENDLYëƒ SQL_RESULT_COLã<ää„ RPC_E_INVALID_OBJECTáXää„ bSetPageDeviceãtää„ LoadAcceleratorsW ää „ sz_CERT_STORE_PROV_SMART_CARD_Wâ¸ää „ MAX_PRIORITYáÔää„ CreateInstanceë„ SQL_API_SQLDRIVERSã åä … DECIMAL_DIGâ(åä… LANG_USER_DEFAULT@åä … DO_PRINTFILEáTåä … MIXERCAPSè… PCERT_KEY_ATTRIBUTES_INFO åä† ERROR_DS_MASTERDSA_REQUIREDê† JOB_STATUS_DELETEDãÐåä‡ xNumáäåä‡ VK_HELPâæä‡ _TRANSMIT_FILE_BUFFERSã@æä,‡ IXMLDOMDocument_createEntityReference_Proxyê‡ _LPPERSISTMONIKER_DEFINED°æä?ˆ ?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@ãÄæäˆ ENDDOCãàæäˆ lfOutPrecisionãçäˆ PAN_MIDLINE_HIGH_TRIMMEDáçäˆ EndDocëˆ PP_CLIENT_HWNDãPçä‰ GetEnhMetaFileAâhçä‰ HELP_MULTIKEYŒçä‰ tagMCI_WAVE_OPEN_PARMSAê‰ OFN_NOLONGNAMESâÈçäŠ PIPE_ACCESS_INBOUNDâäçäŠ tagCBT_CREATEWNDAôçä Š HDROPèäŠ URL_OID_CTL_NEXT_UPDATEâ0èä Š NdrSH_IfFreeéŠ IsRecognizedPartitionhèä ‹ DC_TRUETYPEâ„èä‹ TC_OP_CHARACTERâ èä‹ SPI_SETCURSORSã¸èä ‹ MF_POSTMSGSê‹ IME_ESC_SEQUENCE_TO_INTERNALáøèäŒ MEM_4MB_PAGESéä Œ _CTL_CONTEXTá<éä Œ CERT_CREATE_CONTEXT_NOCOPY_FLAGâ\éäŒ FILE_DEVICE_TERMSRVêŒ DPD_DELETE_SPECIFIC_VERSIONê EMRSETMITERLIMITá¼éäŽ set_intersectionáÔéä Ž MS_DEF_PROVâèéäŽ RevokeãüéäŽ IBindHost(êä!Ž URLACTION_HTML_SUBMIT_FORMS_FROMéŽ SQL_CLOSEPêä HACCELãlêä ALL_TRANSPORTSã˜êä szOID_INTERNATIONAL_ISDN_NUMBERâ¼êä BINDSTATUS_RAWMIMETYPEãàêä ImmSetCompositionFontWë SQL_SP_BETWEENãëä CSHARP_SUPPORTã,ëä GprMaskâ@ëä C1_XDIGIT`ëä ??_7IRecordInfo@@6B@é lpwstrãˆëä‘ CprMaskâ¬ëä‘ GetSidIdentifierAuthorityÈëä‘ MCI_DEVTYPE_OTHERìëä‘ IOCTL_STORAGE_LOAD_MEDIAáìä‘ IXMLDocument2_put_async_Stubá0ìä‘ IID_IAsyncMonikerè"‘ INET_E_CODE_DOWNLOAD_DECLINEDtìä’ LoadAcceleratorsAè’ I_RpcNsSendReceiveãÀìä“ __XMLHTTPRequest_FWD_DEFINED__ë“ IRecordInfo_GetField_Stubáíä” ALG_TYPE_STREAMâíä” PVTableProvStrucá0íä ” cbAtrLené ” SOFTDIST_FLAG_USAGE_AUTOINSTALLâpíä • MAXDWORDáŒíä• SMTO_ABORTIFHUNGé• DCX_NORESETATTRSáÐíä"– DNS_ERROR_ZONE_DOES_NOT_EXISTìíä– MCI_SEQ_OFFSETë$– CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAGâ8îä— AddressOfNamesãTîä— GetTempFileNameAápîä— DdeQueryStringë!— SQL_AT_CONSTRAINT_NON_DEFERRABLEé ˜ ACLineStatusáÄîä™ iosâèîä™ SUBLANG_CHINESE_HONGKONGáïä™ ERROR_NO_TOKENã(ïä™ COMADMIN_E_OBJECTEXISTSâ<ïä ™ xformSrcáPïä ™ SetParentè™ ImmSetCompositionFontAãœïäš IMAGE_REL_SH3_SIZEOF_SECTIONá´ïä š IE_BYTESIZEâØïäš ERROR_NO_TRACKING_SERVICEôïäš MCI_BREAK_PARMSâðäš _CRYPT_KEY_PROV_PARAM(ðä š tagMEMCTXè š SysStringLenádðä› ERROR_ACTIVE_CONNECTIONSé› SQL_ATTR_MAX_LENGTHâ˜ðä œ INFINITEá´ðäœ tagCBT_CREATEWNDWÌðä œ CF_OEMTEXTãäðäœ GetWindowTask ñäœ PFULL_PTR_TO_REFID_ELEMENTã$ñä œ NdrGetBufferéœ GL_ID_READINGCONFLICTXñä alloc_ãtñä ERROR_NOT_EMPTYâ˜ñä SPAPI_E_LINE_NOT_FOUNDë EMRSETCOLORADJUSTMENTÐñä ž _MSL_CSTDDEFáèñä ž e32_datapageâòä ž iStartScanãòäž lValéž SQL_FN_NUM_ATAN2áDòä Ÿ __GetAwCharâtòä%Ÿ JOBOBJECT_SECURITY_LIMIT_INFORMATIONáœòä"Ÿ IMPORT_OBJECT_NAME_UNDECORATEÀòäŸ PAN_CONTRAST_MEDIUM_LOWâÜòäŸ GetEnhMetaFileWãóäŸ tagMCI_WAVE_OPEN_PARMSWêŸ PF_LATã,óä   ODA_SELECTãDóä  SPI_GETBORDERhóä  PFN_CRYPT_ENUM_KEYID_PROPè  IEnumString_Clone_Stubã¨óä¡ SORT_CHINESE_PRCPè ¡ C1_DIGITáÔóä¢ TimeDateStampè'¢ IDataObject_GetCanonicalFormatEtc_Stubã ôä £ EMRSETBKMODEé£ LPNETRESOURCEAë¤ I_RpcSetServerContextListxôä ¥ SetCommStateá¤ôä¥ GetPrivateProfileSectionNamesWãÀôä¥ WM_COMPAREITEMãØôä ¥ lfMenuFontãõä¥ _CRYPT_KEY_VERIFY_MESSAGE_PARAë ¥ __RPCNDR_H__á4õä ¦ LANG_TAMILã\õä¦ ACCESS_DS_OBJECT_TYPE_NAME_Wáxõä¦ DMORIENT_PORTRAIT”õä¦ ChoosePixelFormat¸õä¦ ??_7IBlockingLock@@6B@ãØõä¦ IID_ICatalogFileInfoé¦ SQL_CC_DELETEáöä§ yNumáöä§ MCI_MODE_SEEK8öä§ LPTYPECHANGEEVENTSë§ SQLInstallDriveráhöä¨ CharStrâ”öä ¨ ERROR_DS_OBJ_CLASS_NOT_SUBCLASSâ¬öä¨ RPCOLEMESSAGEÔöä¨ __IXMLElement2_FWD_DEFINED__é!¨ __ICreateErrorInfo_FWD_DEFINED__á ÷ä© IMAGE_SNAP_BY_ORDINALL÷ä© NdrEncapsulatedUnionBufferSizeã€÷ä)© IXMLDOMDocument_createCDATASection_Proxyé"© IXMLElement2_get_parent_ProxyÀ÷ä ª HWND_DESKTOPáÔ÷ä ª VOS__BASEè ª LPMIXERCONTROLDETAILS_LISTTEXTAâ øä« ContextTrackingModeâLøä"« CHANGER_INIT_ELEM_STAT_WITH_RANGEè « wireVARIANTâ|øä ¬ _MSL_WMEM_Hâ”øä ¬ XCLASS_MASKâ¬øä ¬ VT_RESERVEDâÈøä¬ PROPSHEETPAGEAãôøä¬ ZAFLAGS_INCLUDE_PROXY_OVERRIDEë¬ SQL_FN_NUM_SINã8ùä­ ERROR_DS_DRA_SINK_DISABLEDãXùä­ APPCMD_FILTERINITSã„ùä­ ITypeLib2_GetAllCustData_Proxyë­ CreateURLMonikerá´ùä® dwFullãØùä® I_RpcGetServerContextListèùä® Loadá úä® MDM_SHIFT_HDLCPPP_AUTHë® SQL_CB_DELETEDúä¯ EXCEPTION_RECORD32ã`úä¯ RPC_E_SERVERFAULT|úä¯ CRYPT_E_NO_MATCHé¯ DeletePrinterDataExAáÄúä° ACCESS_DS_OBJECT_TYPE_NAME_Aáðúä° ERROR_DS_DRA_BAD_INSTANCE_TYPEãûä° TYPE_E_BADMODULEKINDá<ûä ° szOID_ENROLL_CERTTYPE_EXTENSIONâTûä ° MftReadBytesápûä° IID_IOleObjectë%° __IXMLDOMComment_INTERFACE_DEFINED__áÀûä± PCRYPT_OID_FUNC_ENTRYÜûä± LPHTTPNEGOTIATEâüä(± __IInternetBindInfo_INTERFACE_DEFINED__ê± SQL_IS_DAY_TO_HOURã\üä ² JOB_OBJECT_MSG_JOB_MEMORY_LIMITê² SQL_ASYNC_ENABLE_DEFAULTá¬üä³ GetPrivateProfileSectionNamesAãÈüä³ _SHQUERYRBINFOë³ IStorage_CreateStorage_Proxyáýä´ ERROR_INVALID_TRANSFORMâ0ýä´ WM_EXITMENULOOPê´ USER_MARSHAL_FC_SMALLdýäµ elementâtýä µ node_ýäµ LPNETRESOURCEWã°ýäµ PFORMAT_PARAMETERSëµ SQL_FN_STR_UCASEáèýä¶ ERROR_READ_FAULTáþä¶ CERT_FIND_OR_CTL_USAGE_FLAGâ4þä¶ _CERT_CHAIN_ENGINE_CONFIGXþä¶ PRINTER_CHANGE_ADD_PORTâþä,¶ AsyncIAdviseSink_Finish_RemoteOnRename_Stubê¶ SQLGetFunctionsâÈþä· FACILITY_CONTROLé· RPC_CONTEXT_HANDLE_FLAGSâÿä¸ modulusâÿä¸ lopnStyle,ÿä ¸ STICKYKEYSãHÿä¸ dwFileFlagsMaskê¸ szOID_OIWSEC_dsaSHA1á€ÿä ¹ idFirstChildáœÿä¹ FKF_CONFIRMHOTKEY¼ÿä¹ DeletePrinterDataExWé¹ tagOLEGETMONIKERáôÿäº CRYPT_E_NO_SIGNER ä º PSINJECTDATAá$ä º RT_PLUGPLAYâLä"º MIXERCONTROL_CONTROLF_UNIFORMhäº PROPSHEETPAGEWëº CreateBinding˜ä» _MSL_WSTDIO_H¼ä» EVENTLOG_INFORMATION_TYPEØä» SERVICE_TYPE_ALLáôä» FILE_TYPE_PIPEã ä » EVENT_E_LASTá$ä » _PSHNOTIFYë » SQL_DTC_DONEáPä¼ nearbyintlä¼ __red_black_treeá€ä¼ BAUD_9600˜ä ¼ bV4RedMaskãÄä&¼ MIXERCONTROL_CT_SC_SWITCH_BOOLEANðä ¼ LPMIXERCONTROLDETAILS_LISTTEXTWê ¼ _CRL_CONTEXTáä½ ENODEVã4ä ½ dwContrastãXä½ MIXER_SHORT_NAME_CHARSãxä½ PP_KEY_TYPE_SUBTYPEâŒä½ Elementê ½ LPIINTERNETâ¸ä¾ GWLP_IDê¾ IXMLDocument2_get_async_Stubáüä¿ SetFilePointerExáä¿ MCI_ANIM_REALIZE_NORM<ä¿ RpcNsProfileDeleteë¿ HlinkNavigateStringâxäÀ EVENTLOGRECORDãŒäÀ PST_LATâ¨äÀ OpenSemaphoreAãÄäÀ OffsetWindowOrgExØä À styleOldáðä À waveInStopã äÀ LPSHNAMEMAPPINGAá(äÀ _userHENHMETAFILEHäÀ VARFLAG_FUIDEFAULTëÀ URLACTION_ACTIVEX_MIN|äÁ encode_wc˜äÁ MinorImageVersion¸äÁ ERROR_TAG_NOT_FOUNDâØäÁ MMIOERR_OUTOFMEMORYâôäÁ CounterNameTitleáäÁ ALG_SID_RSA_ENTRUSTâ0äÁ FILE_DEVICE_MODEMèÁ SetJobWâpä PIMAGE_BOUND_IMPORT_DESCRIPTORãŒä LGRPID_INSTALLEDá¨ä RegSetValueExAãÐä _CMSG_ENVELOPED_ENCODE_INFOâôä PRINTER_STATUS_PRINTINGâä IGlobalInterfaceTable4ä CoUnmarshalInterfaceé _wireSAFEARRAYãläà FILE_IS_ENCRYPTEDˆäà ROT_COMPARE_MAXâ¤äà SCARD_ATR_LENGTHéà SQL_CATALOG_TERMáääÄ PAN_CONTRAST_MEDIUM_HIGHâäÄ NRC_NORESOURCESâ äÄ _PERF_COUNTER_BLOCKâ8ä Ä PCRL_CONTEXTáLäÄ GetJobWêÄ IMoniker_Reduce_ProxyŒäÅ PIMAGE_TLS_CALLBACKâ¨äÅ NumberOfObjectsâÀä Å SQLAllocStmtéÅ SQL_ROW_UPDATEDâäÆ BY_HANDLE_FILE_INFORMATIONã$äÆ DV_E_DVTARGETDEVICEâLäÆ _PRINTER_NOTIFY_OPTIONS_TYPEátäÆ IXMLElement_addChild_ProxyëÆ SQL_COLUMN_LENGTH¨ä Ç __lower_mapê Ç SM_CLEANBOOTáÔäÈ __freadêÈ _CRYPT_ENCRYPT_MESSAGE_PARAâ äÉ IsDBCSLeadByteã( ä É magicD äÉ PARAMFLAG_FOPTãd äÉ PARSE_URL_FROM_PATHêÉ QUERY_CONTENT_TYPE㘠äÊ EILSEQ㬠äÊ wMonthãÐ äÊ SetUserObjectInformationAð äÊ SizePtrLengthArrayëÊ IMarshal2, äË IMAGE_SUBSYSTEM_WINDOWS_CUIâD ä Ë MH_CLEANUPãp ä&Ë @class$7698clientEngine_dbg___pchŒ äË CRYPT_DATA_KEYëË _remoteMETAFILEPICTêÍ ??_7IEnumUnknown@@6B@à äÎ HRESULTâü äÎ ProcessLocksListá äÎ LPARAMã4 äÎ ERROR_RESOURCE_NOT_ONLINEèÎ PSBTN_APPLYNOWãx äÏ FILE_NOTIFY_CHANGE_CREATION⌠äÏ LRESULTâ  ä Ï LoadMenuWèÏ CALLBACK_EVENTãà äÐ RPC_S_INVALID_ASYNC_CALLáü äÐ BATTERY_FLAG_LOWéÐ ??_7IOleInPlaceFrame@@6B@8 ä Ñ MCI_UPDATEëÑ CertOIDToAlgIdãl äÒ SHNAMEMAPPING„ ä Ò PP_ENUMALGS⨠äÒ CRYPT_KEYID_MACHINE_FLAGáÀ ä Ò SEARCH_ALLãÔ äÒ GetJobAêÒ SQL_ROW_UPDATESâ ä Ó EndAddressã, äÓ DNS_ERROR_INVALID_DATAãL äÓ WH_JOURNALPLAYBACKã| ä$Ó IPropertyStorage_WriteMultiple_StubêÓ BstrFromVectorã´ äÔ SYSYNC_SUBVERSIONÐ äÔ KEY_ALL_ACCESSãð äÔ ERROR_VC_DISCONNECTED äÔ RegSetValueExWëÔ IXMLDOMDocument_put_async_StubãPä Õ MF_DEFAULTãdäÕ HDRVR__êÕ TARGET_IS_NT40_OR_LATERâ°äÖ EVENTLOG_START_PAIRED_EVENTâÌäÖ OpenSemaphoreWãìäÖ RPC_S_NO_PRINC_NAMEâäÖ LPSHNAMEMAPPINGWá ä Ö TrustStatusêÖ SCARD_T1_MAX_IFSáTä × EC_ENABLEONEápä× rghSignerStoreãˆä × pSignerInfoâ ä× data_into_ndrÀä× USER_MARSHAL_FC_ULONGÔä× SetJobAê× INET_E_NO_SESSIONäØ ERROR_JOURNAL_NOT_ACTIVEá0äØ PRPC_SECURITY_QOSèØ URLACTION_SCRIPT_MINádäÙ P_NOWAIT0ˆäÙ JOB_OBJECT_LIMIT_JOB_TIMEè Ù LoadMenuAèÚ _RemotableHandleéÛ NdrConformantArrayUnmarshalláäÜ SetUserObjectInformationW äÜ ScreenToClientã<äÜ VarBstrFromIntë Ü msl_utilityâpäÝ DRIVE_REMOVABLEâ”äÝ FRS_ERR_STARTING_SERVICEá°äÝ MAXSTRETCHBLTMODEÈä Ý lpClassNameâÜä Ý SOCK_RDMáôä Ý getNamedIteméÝ tagSTATPROPSTGëÞ CertControlStoreá@äß __readãdäß LOCKFILE_EXCLUSIVE_LOCKâŒäß COMADMIN_E_BADREGISTRYLIBIDâ¨äß ENABLE_LINE_INPUTÀä ß STGM_WRITEãÜäß NPCOMPOSITIONFORMøäß SQL_CREATE_SCHEMAè%ß SQL_CA_CONSTRAINT_INITIALLY_DEFERREDáDäà LPCMENUITEMINFOAá`äà DMLERR_SYS_ERRORéà LPCANDIDATEFORMâ”ä á NFR_UNICODEâ¨ä á PtInRectá¸äá LockáÐä á SystemTimeëá SQL_BS_SELECT_EXPLICITëâ TAPE_DRIVE_SPACE_IMMEDIATEã<äã allocator_referenceâ\äã META_SELECTPALETTEãpäã BS_HOLLOW„äã SW_MAXãœä ã CP_SUPPORTEDéã tagMIXERCAPSWØää szOID_OIWSEC_dsaCommSHA1áøää pszPrivateKeyObjIdãää POPENCARDNAME_EXéä ??_7IPropertyBag@@6B@Xäå IMAGE_REL_ALPHA_LITERALâ€äå CO_E_INIT_SCM_MUTEX_EXISTSã˜ä å PMONCBSTRUCTá°ä å WHDR_INQUEUEéå CommFaultOffsetsáÜäæ ceillèæ BF_LEFTâäç lResultâä ç PJOYINFOEXãHäç IXMLDocument2_get_doctype_Stubëç PID_MIN_READONLYáŒäè PF_FLOATING_POINT_EMULATEDã¬äè SizeOfInitializedDataÀäè DI_NORMALÔäè h_addrãðäè CryptSetProvideráäè _ROT_COMPARE_MAX_DEFINEDá4äè PVERIFY_INFORMATIONâLä è SC_DLG_NO_UIéè SQL_LOCK_EXCLUSIVEãŒäé EMAIL_FORMAT_SUPPORTáœä é Magic¸äé MCI_VD_SPIN_DOWNáÔäé max_dgram_sizeãä$é NdrConformantVaryingArrayBufferSizeâ0ä"é IXMLDOMNode_selectSingleNode_Stubè/é IInternetZoneManager_SetZoneCustomPolicy_Proxyã€äê execlpãœäê ReleaseConnection¸äê OleSaveToStreamêê _SERVICE_FAILURE_ACTIONSAøäë ERROR_SEM_IS_SETáäë DISP_E_NONAMEDARGSã4äë DispatchMessageê"ë ITypeInfo_ReleaseVarDesc_Stublä ì ceilf|äì hMFâ äì IEnumOLEVERB_Clone_Proxyá¸äì OleInitializeèì CDM_GETFILEPATHâìä í OSS_BAD_ARGâä í LeadingZeroâ0ä!í I_RpcLaunchDatagramReceiveThreadéí userFLAG_STGMEDIUMë î FACILITY_ITFá|äï VK_ADDã”ä ï BN_CLICKEDã¬äï MCI_SET_AUDIOÀä ï FIONREADéï IXMLDOMNode_replaceChild_Proxyë ð S_PERIOD2048á$äñ _FILE_SEGMENT_ELEMENTDäñ WriteProfileStringã`äñ ERROR_NO_NETWORKá„äñ ERROR_INSTALL_USEREXITã¤äñ IID_AsyncIPipeLongëñ CoInternetQueryInfoâääò PROCESS_CREATE_THREADäò ERROR_GLOBAL_ONLY_HOOKã,äò SPLDS_PRINT_MEDIA_READYêò GetClassFileOrMimeãpäó IMAGE_SYM_CLASS_EXTERNALé#ó ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTSã¼äô ERROR_PIPE_BUSYâääô RPC_S_SERVER_OUT_OF_MEMORYãüä ô PCTL_CONTEXTá$äô PCRYPT_ENCRYPT_MESSAGE_PARAâ@äô MIDL_INTERFACEëô lpLoadOrderGroupátäõ tagMIXERCAPSAŒäõ CreateStorage ä õ PROPSPECé õ szArgÀä ö tanhlÔäö is_voidâìä ö ntmAvgWidthâäö LPCMENUITEMINFOWéö LPOLEITEMCONTAINERã@ä ÷ __m56800_osâdä÷ ERROR_INVALID_DOMAIN_ROLEˆä÷ PBT_APMPOWERSTATUSCHANGEáœä÷ WinHelpâ¼ä÷ RIGHT_CTRL_PRESSEDãèä!÷ IFillLockBytes_SetFillSize_Proxyáä!÷ IRecordInfo_GetFieldNoCopy_Proxyé÷ ??_7IHttpNegotiate@@6B@âdä&ø CERT_STORE_CTRL_COMMIT_CLEAR_FLAG”ä#ø CRYPTPROTECT_LAST_RESERVED_FLAGVALã°äø DRIVER_USERMODEê*ø IXMLDOMNamedNodeMap_getQualifiedItem_Stubá äù META_RECTANGLEã äù VK_NONAME8 äù PropSheet_RecalcPageSizesèù DATATYPES_INFO_1ál äú GetMessagePosèú hHEnhMetaFile  äû SPI_SETHANDHELDêû IXMLDOMDocument_get_async_StubãÜ ä ü tanhfø äü OLE_E_CANTCONVERT!äü tagBITMAPFILEHEADERâ,!äü FD_ZEROêü _SERVICE_FAILURE_ACTIONSWd!ä ý HTCAPTIONèý StartTime !äþ ERROR_INVALID_SEPARATOR_FILEá¸!ä þ LB_GETTEXTãÌ!ä þ C1_BLANKáè!äþ WNNC_NET_POWERLANá"ä þ SO_SNDTIMEOâ("äþ PCMSG_ENVELOPED_ENCODE_INFOâP"äþ IXMLDOMNode_cloneNode_Proxyêþ URLOSTRM_GETNEWESTVERSIONˆ"äÿ execleã "ä ÿ dwTotalPhysâÀ"äÿ ERROR_CTX_INVALID_WDáØ"ä ÿ ODT_STATICëÿ tagMCI_RECORD_PARMSâ #å FF_SCRIPT #å VK_ACCEPT8#å IDropTargetâd#å __IOLETypes_INTERFACE_DEFINED__âx#å IDLDESCë& IXMLDOMImplementation_hasFeature_ProxyãÀ#ä lpProcãÐ#ä Arcâì#ä GetOpenCardNameê SQL_ISV_TABLE_PRIVILEGESá($ä  _strcasecmpâP$ä LookupPrivilegeDisplayNameãp$ä SetWindowPlacementë LPMCI_BREAK_PARMSœ$ä  __UHI´$ä _QUOTA_LIMITSÈ$ä BF_TOPãè$ä LGRPID_WESTERN_EUROPE%ä WNetCancelConnectionW,%ä CLSID_CStdPropertyFrameê OLEINPLACEFRAMEINFOâl%ä CUST_SYNC_FIRMWAREãˆ%ä ReparseDataLengthè PPERF_COUNTER_BLOCKâ¸%ä ArgâÔ%ä DHPRIVKEY_VER3ã&ä& ICreateTypeLib2_SetHelpStringDll_Stubè MDM_DIAGNOSTICSâ@&ä SERVICE_ERROR_NORMALá\&ä OemToCharBuffWãx&ä IN_CLASSA_HOSTã”&ä CRYPT_VOLATILEë CTL_FIND_USAGEãÔ&ä IMAGE_OPTIONAL_HEADER32âð&ä ICM_ADDPROFILEã'ä  CTRY_CZECHã 'ä  FORM_INFO_1Wé removeAttributeNodeâP'ä PSZâh'ä  LBN_SETFOCUSé dwAdvertisedVersionLSœ'ä LPCWSTRâ¼'ä ERROR_ARENA_TRASHEDâì'ä& ICreateTypeInfo2_SetFuncCustData_Stubè* IInternetProtocolInfo_CombineUrl_StubD(ä" PIMAGE_RUNTIME_FUNCTION_ENTRYd(ä ClosingRecordNumberâŒ(ä" SPAPI_E_NON_WINDOWS_NT_DRIVER¤(ä HIGHCONTRASTWè AF_DLIãÔ(ä DRIVE_NO_ROOT_DIRá)ä! ERROR_DS_NO_TREE_DELETE_ABOVE_NCá )ä RpcBindingSetOptionâ<)ä ALG_SID_3DES_112é pSepFileát)ä pointer_to_unary_functionˆ)ä HKEY__ã°)ä ERROR_DS_EXISTS_IN_MUST_HAVEáÀ)ä GreenÜ)ä ARW_BOTTOMRIGHTâü)ä MonikerBindToStorageé lpOFN *ä lstrcpynAH*ä" ERROR_NO_SHUTDOWN_IN_PROGRESSp*ä RPC_C_PROTECT_LEVEL_CONNECTê CryptExportPublicKeyInfoExã°*ä  XTYP_ERRORãÈ*ä MONCONVSTRUCTà*ä  MIDI_MAPPERâ+ä PFN_CMSG_EXPORT_MAIL_LISTè  pbCrlEncodedá@+ä GetThreadSelectorEntryãX+ä  VALID_NTFTãp+ä  DISPPARAMSë IID_IOInetProtocolSinkã°+ä ELF_VENDOR_SIZEâÌ+ä OemToCharBuffAë HSZâô+ä  FORM_INFO_1Aé SQL_CA1_POS_POSITIONá4,ä IdentifierAuthorityâL,ä  DC_SMALLCAPâh,ä CryptDecodeObjectè DragEnter,ä wNextChar¬,ä IMAGE_SCN_GPRELâÔ,ä DNS_STATUS_PACKET_UNSECUREãì,ä  BM_SETCHECKâ-ä CAL_GREGORIAN_XLIT_ENGLISHã8-ä CLSID_DeCompMimeFilterë SQL_FETCH_BOOKMARKãx-ä RPC_S_ADDRESS_ERRORâœ-ä FlushConsoleInputBufferâÄ-ä CERT_STORE_PROV_FIND_CTL_FUNCè  ClosePrinteráü-ä SCARD_E_INVALID_CHVâ.ä WNetCancelConnectionAè LPCPROPSHEETHEADERãX.ä PROCESSOR_ARM920á|.ä ERROR_NOT_EXPORT_FORMATâ .ä CMSG_VERIFY_SIGNER_PUBKEY¼.ä XMLELEMTYPE_DTDê IID_IXMLDOMParseErrorð.ä ne_imptab/ä  SearchPathã(/ä LPPRINTER_DEFAULTSë IRecordInfo_GetGuid_Stubá\/ä __nbá„/ä" IMAGE_RESOURCE_NAME_IS_STRINGœ/ä  PMIDIINCAPSâ¸/ä _RPC_SECURITY_QOSð/ä+ _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARAã 0ä SCARD_PROTOCOL_T1è  IGP_SELECTã80ä  hMonitoré SCARD_PROTOCOL_T0x0ä THREAD_PRIORITY_HIGHESTâ˜0ä CryptSetProviderExãÀ0ä CryptGetMessageSignerCountë V_UNKNOWNè0ä  lstrcpynWè LB_GETANCHORINDEX1ä PULONGã@1ä ERROR_EXCEPTION_IN_SERVICEãd1ä PAN_MIDLINE_LOW_TRIMMEDâ€1ä SS_ELLIPSISMASKâ˜1ä HIGHCONTRASTAÄ1ä! SPLREG_RESTART_JOB_ON_POOL_ERRORé ??_7IExternalConnection@@6B@á2ä WINSTA_READSCREEN 2ä  MF_SEPARATORá02ä dwToá\2ä  RPC_C_AUTHN_LEVEL_PKT_INTEGRITYâx2ä StgIsStorageFileá”2ä SetZoneAttributes¨2ä  DoEncodeé  SQLDECIMALãÜ2ä MM_ANISOTROPICë NdrGetPartialBufferâ3ä  SB_PAGEDOWNâ03ä MCI_STATUS_LENGTHP3ä CHANGER_VOLUME_ASSERTh3ä NumberOfDoorsè SQL_XOPEN_CLI_YEARã¤3ä OptionalHeaderãÀ3ä REMOTE_NAME_INFOáÔ3ä LPPERSISTè pvará 4ä! BATTERY_PERCENTAGE_UNKNOWNã(4ä! LPPALETTEENTRYã@4ä ! HELPWININFOAáT4ä ! funckindé! tagCACã”4ä " ERROR_DS_ATT_VAL_ALREADY_EXISTSâ¬4ä" MAP_COMPOSITEÐ4ä" pResolvehCryptProvFuncë" REGISTERWORDENUMPROCW5ä # CTRY_AUSTRIAá 5ä # OpenDriverã45ä# paDetailsT5ä# IPPORT_ROUTESERVERë# __IDropTarget_FWD_DEFINED__â”5ä $ VK_MBUTTONã¨5ä$ FrameRectÀ5ä $ DeleteFormãà5ä$ MDM_MASK_PROTOCOLIDê$ SQL_MAX_CURSOR_NAME_LENâ6ä % GetUpdateRgná46ä% GetNextWindowè% VarBoolFromR8d6ä & _searchenvã|6ä & MAKEINTATOMê& AddPrinterDriverExAâÄ6ä"' LOAD_WITH_ALTERED_SEARCH_PATHô6ä#' ERROR_DS_CR_IMPOSSIBLE_TO_VALIDATEë' RPC_C_VERS_COMPATIBLEL7ä+( ERROR_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBERãh7ä( X509_UNICODE_NAME€7ä( NdrClientCall 7ä( _VERIFY_INFORMATIONê( dwAdvertisedVersionMSä7ä) ERROR_WORKING_SET_QUOTAã8ä) CRYPT_E_OSS_ERROR8ä) HCF_CONFIRMHOTKEY08ä ) SND_LOOPáD8ä) ABE_TOPâ`8ä) CryptMsgGetParamáx8ä) VarBoolFromR4è) OLEIVERB_PRIMARYá°8ä* FILE_ALL_ACCESSâÌ8ä* EPT_S_CANT_CREATEì8ä* GetWindowPlacementã9ä* HISTOGRAM_BUCKETé* tagCAHã89ä+ InvalidateRectãP9ä + PDISK_EXTENTá9ä3+ AsyncIMultiQI_Finish_QueryMultipleInterfaces_Proxyã¼9ä+ IXMLDOMNode_get_nodeName_Proxyë+ tagCAIãè9ä , ENUMLOGFONTWé , SQL_ISV_CONSTRAINT_COLUMN_USAGEâ8:ä- wglRealizeLayerPaletteãT:ä- CERT_CHAIN_PARAât:ä- AddPrinterConnectioné- CoFileTimeNow¨:ä. CopyEnhMetaFileWáÄ:ä. tagEMRFRAMERGNãÜ:ä . VK_OEM_ATTNâô:ä . SCARD_PCI_T1á(;ä(. ITypeInfo2_GetAllImplTypeCustData_ProxyâP;ä. ITypeInfo_GetDllEntry_Proxyê. tagCALãx;ä/ __TEXTã”;ä/ PROCESSOR_PPC_620°;ä/ ExportedNamesSizeÔ;ä/ LANGUAGEGROUP_ENUMPROCAê / SCARD_PCI_T0á <ä0 dwProvCapabilitiesã<ä 0 cbAtr<<ä0 AddPrinterDriverExWâT<ä0 get_specifiedè0 OFN_FILEMUSTEXIST<ä1 ACCESS_ALLOWED_ACEãÀ<ä$1 SPAPI_E_NO_DEFAULT_DEVICE_INTERFACEâÔ<ä 1 _WINCON_á=ä$1 PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANYê1 __propidl_h__D=ä"2 szOID_PRIVATEKEY_USAGE_PERIODX=ä2 Memoryãx=ä2 StorageManagerNameë 2 SQL_UB_OFFã´=ä3 FEATURESETTING_CUSTPAPERáÐ=ä3 LB_SETANCHORINDEXø=ä3 IOleLink_UnbindSource_Stubã>ä3 _SC_STATUS_TYPEê3 SQL_INTERVAL_DAY_TO_MINUTEë4 REGISTERWORDENUMPROCAt>ä 5 TransmitFileá >ä5 IXMLDOMNode_get_lastChild_Stubë5 CD_LBSELCHANGEãØ>ä7 DMPAPER_ENV_DLë 7 HELPWININFOWâ?ä 8 _dup2 ?ä8 OF_SHARE_DENY_READã MM_WOM_OPENâXBä> MCIERR_INVALID_FILEê> cchUsedâŒBä? IMAGE_REL_IA64_DIR64á¤Bä ? ValidateRectá¼Bä ? OPENCARDNAMEé? IEnumOLEVERB_Reset_StubâüBä@ ?$restrict_to@$00Cä@ IMAGE_REL_MIPS_SECREL4Cä@ hbmpUncheckedPCä@ LBS_HASSTRINGSë@ LPPRINTER_ENUM_VALUES„CäA do_insert CäA WM_RBUTTONDBLCLKá¼CäA MCI_ALL_DEVICE_IDàCäA RPC_C_OPT_MQ_AUTHN_LEVELé!A IOleContainer_LockContainer_Stubá Dä B e_lfanewá8Dä B VK_NUMLOCKãPDä B VK_OEM_MINUSéB _authè C e_maxallocãŒDä D scalblnfá°DäD ERROR_DEVICE_DOOR_OPENãÌDäD SORT_STRINGSORTêD stdexceptüDäE WM_NCMBUTTONUPëE SHGFI_SYSICONINDEXã8EäF IN_CLASSC_HOSTã\EäF CLSCTX_INPROC_HANDLERX86é2F IOleInPlaceActiveObject_OnDocWindowActivate_ProxyèG VARIANT_UserUnmarshalØEäH _MSL_INTEGRAL_MATHãüEäH CreateAcceleratorTableAâ0Fä*H IXMLDOMDocument_put_ontransformnode_ProxyèH lpReadingdFäI THREAD_GET_CONTEXTãxFäI interfaceFäI OnLowResourceè)I IHttpNegotiate_BeginningTransaction_StubáÜFä J cStencilBitsáðFä J BindingHáGäJ PSOCKADDR GäJ VARFLAG_FREADONLYè J SQL_IC_LOWERáPGäK UserDiskReadshGä K STGTY_REPEATéK GetAllParamCustDataâ¬GäL GetSidSubAuthorityCountâÐGäL RPC_S_UNSUPPORTED_TYPEãäGä L LoadMenuéL SQL_DIAG_REVOKEâHäM SWP_HIDEWINDOWã8HäM dwLockDurationãXHäM SQL_INVALID_HANDLEãtHäM SQL_DIAG_GRANTëM SQL_CODE_SECONDâ¤Hä N scalblnláÈHäN SetNamedPipeHandleStateâàHäN FACILITY_CERTôHäN BS_NULLâIäN IUnknown_Release_ProxyëN GetObjectParamãPIäO __ReadProcActionspIäO tagEMROFFSETCLIPRGNâŒIäO C2_OTHERNEUTRALâ¤IäO WN_BAD_HANDLEÀIäO X509_ENUMERATEDâðIä%O OLEMISC_RENDERINGISDEVICEINDEPENDENTé O VarUI4FromCyá(JäP DISP_E_NOTACOLLECTIONHJäP MetaDataWriteBytesëP tagPENDINGTYPEãxJä Q Categoryá˜JäQ RpcServerInqBindingsá´JäQ SCARD_PROTOCOL_TxèQ GetTypeInfoTypeãKä#R EXCEPTION_NONCONTINUABLE_EXCEPTIONã KäR WSASERVICE_NOT_FOUNDá4Kä R bXHeightáLKä R WNFMT_INENUMálKäR DdeCreateDataHandleâ”Kä"R MCI_ANIM_GETDEVCAPS_SLOW_RATE¨Kä R hInstAppéR SPLDS_PRINT_DUPLEX_SUPPORTEDáäKä S QS_INPUTáøKäS asDataãLä S _DISK_EXTENTéS __IPipeDouble_FWD_DEFINED__â\LäT EXCEPTION_EXECUTE_HANDLERtLä T DMNUP_ONEUPêT SQL_SC_SQL92_INTERMEDIATE´LäU CreateDirectoryâÐLäU ILLUMINANT_NTSCâèLä U EWX_POWEROFFáMäU StartHeadNumberâ(MäU ELEMENT_STATUS_AVOLTAGãHMäU STGMEDIUM_UserFreeëU SQL_UNION„MäV IMAGE_FILE_MACHINE_WCEMIPSV2á¨MäV DisableThreadLibraryCallsÀMä V STM_GETIMAGEáàMäV CDERR_FINDRESFAILUREá Nä3V IGlobalInterfaceTable_GetInterfaceFromGlobal_ProxyãHNäV IAsyncManager_GetState_ProxyéV CFSTR_MIME_WAVëW FILE_NOTIFY_CHANGE_LAST_ACCESSã¬NäX WSAETOOMANYREFSâÔNäX PERF_PRECISION_SYSTEM_TIMERâèNä X cCPSURLséX IXMLDOMNode_get_text_Proxyã$Oä Y TotalSizeè Y SQL_UNICODEâTOä Z FLT_MAX_EXPâlOä Z FeaturesLowâOäZ otmptSuperscriptOffsetë Z PSH_USEHICONá¼Oä[ SP_RLSDâØOä[ FLOODFILLSURFACEáðOä[ ADDJOB_INFO_1è"[ __IAsyncManager_FWD_DEFINED__8Pä\ iWindowsEffectOrdinalè*\ CRYPT_OID_OPEN_SYSTEM_STORE_PROV_FUNC|Pä] EventIDâ¤Pä] CRYPT_E_INVALID_IA5_STRINGãÄPä] MCI_SET_AUDIO_LEFTãàPä] DISPID_EVALUATEê] VarDateFromUdateáQä^ MapViewOfFile8Qä^ CO_E_INITIALIZATIONFAILED\Qä^ CreateAcceleratorTableWê^ CBS_HASSTRINGSãˆQä _ valueÀQä._ PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARAè"_ ITypeComp_RemoteBindType_StubRä` RpcMgmtEpEltInqDoneâ@Rä+` PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARAë` IME_HOTKEY_DSWITCH_FIRSTá|Räa EMR_CREATEPENè.a IBindHost_RemoteMonikerBindToObject_ProxyÄRäb _wcsnicmpðRä!b IMAGE_SIZEOF_ROM_OPTIONAL_HEADERáSäb IMAGE_BOUND_FORWARDER_REF4Säb GetSystemDirectoryAâ`Sä&b PENCRYPTION_CERTIFICATE_HASH_LIST„Säb NdrCorrelationInitializeéb IID_IPropertySetStorageâÀSä c less_equalãäSäc ERROR_NON_MDICHILD_WINDOWáTäc DMBIN_CASSETTEëc WN_ALREADY_CONNECTEDá8Tä d cStreamNameâPTä d CURRENCYFMTâpTäd IID_IRpcChannelBufferè"d IRpcStubBuffer_CountRefs_Stub°Täe time_cmpt_ptrÈTä e guard_frontâàTä e FW_DONTCAREâøTä e VK_SNAPSHOTâ(Uä$e MIXERLINE_COMPONENTTYPE_DST_VOICEINâDUäe VendorSpecificëe SQL_SNVF_POSITION|Uäf CB_GETITEMDATAãœUäf WNetCancelConnection2¸Uäf IN_CLASSB_HOSTãÌUäf BusTypeêf SQL_TYPE_TIMEøUä g _wcsicmpá Vä"g ERROR_INSTALL_PACKAGE_VERSION _GUIDDEF_H_â¼Åä> IMAGE_REL_ALPHA_PAIRáäÅä> __IOleCache2_FWD_DEFINED__ãÆä!> IOleClientSite_GetContainer_Stubá8Æä> _ENUM_SERVICE_STATUS_PROCESSWè> SQLDataSourcesãhÆä? HELP_QUIT€Æä? CertNameToStrœÆä? LPPERSISTSTORAGEé? StartServiceAÔÆä@ DISP_CHANGE_RESTARTâìÆä @ IID_IBindCtxáÇä@ IDataObject_EnumFormatEtc_Stubë@ GetMopsâHÇäA TAPE_ERASE_SHORTálÇäA RPC_S_OUT_OF_RESOURCESã€Çä A KEYARRAYéA MIXERLINE_LINEF_DISCONNECTEDé B VarUI4FromI4áäÇäC SUBLANG_NORWEGIAN_BOKMALáüÇä C LPLOGBRUSH32áÈäC PFNPROCESSPOLICIESAêC CERT_SIGNATURE_HASH_PROP_IDâ`ÈäD JOYCAPS_POVCTSãxÈäD MCI_BREAK_KEY¨Èä&D __IInternetProtocolRoot_FWD_DEFINED__è D VarUI4FromI2áØÈä E HCOLORSPACEâøÈäE _OUTLINETEXTMETRICAâÉäE WM_NCLBUTTONUPëE SetMopsâ<ÉäF is_PODãdÉä"F ??_7invalid_argument@std@@6B@ˆÉäF WT_EXECUTEINTIMERTHREADâ Éä F FACILITY_AAFá´ÉäF BS_LEFTâÌÉä F SE_ERR_PNFãèÉäF MS_DEF_DSS_PROV_Wè!F IXMLDocument_createElement_Proxyá,ÊäG SizeOfHeadersè G VarUI4FromI1áXÊä H S_SERDMDéH SQL_PC_NOT_PSEUDOÊäI SHOW_ICONWINDOWâ°ÊäI WindowBufferSizeEventèI put_URLâàÊäJ PMONLINKSTRUCTãËäJ ReLayoutDocfileOnILockBytesê J SQLCopyDescâ@ËäK GetCurrentPositionExá\ËäK GetLogColorSpaceáˆËä&K @class$7680clientEngine_dbg___pch¤ËäK PROV_ENUMALGS_EXéK IDataObject_SetData_StubáèËäM CheckColorsInGamutãüËä M FD_ISSETá ÌäM CRYPT_RC2_56BIT_VERSIONêM VarI4FromBoolLÌäN puiValëN SQL_TYPE_DATE€ÌäO Int64ShllMod32ã ÌäO IMAGE_REL_PPC_IFGLUEáÄÌäO DNS_ERROR_INVALID_TYPEãäÌäO tagEMRPOLYTEXTOUTAäÍäO RPC_C_AUTHN_MSNâÍäO CMSG_CRL_PARAMëO NUMPRS_EXPONENTâ`ÍäP ERROR_NO_IMPERSONATION_TOKENáŒÍä P ERROR_UNABLE_TO_INVENTORY_DRIVEâ ÍäP CTRY_OMAN¼ÍäP MS_DEF_DSS_PROV_Aè$P IOleInPlaceUIWindow_GetBorder_ProxyâÎäQ DEFAULT_LOCALDB_PROFILEâ$Îä Q categoryá@ÎäQ PF_PAE_ENABLEDã\ÎäQ I_RpcSendReceiveáxÎäQ CRYPT_MODE_ECBã”ÎäQ _COAUTHIDENTITYâÀÎä!Q IXMLDOMDocument_nodeFromID_ProxyéQ QUERY_IS_SAFEðÎäR cbContextInfoè*R IRunnableObject_RemoteIsRunning_Proxy8Ïä S NPLOGBRUSH32áXÏäS _OUTLINETEXTMETRICWâ€ÏäS NdrConformantArrayMarshallëS pProtocolÄÏä#T PJOBOBJECT_BASIC_LIMIT_INFORMATIONãàÏäT TransparentBltãøÏä T SIZE_MAXHIDEé T ByteOffsetã,ÐäU FILE_TYPE_DISKãDÐä U CTRY_LATVIAêU PFNPROCESSPOLICIESWâtÐä V srand˜ÐäV OUTPUT_DEBUG_STRING_EVENT¸ÐäV DESKTOP_HOOKCONTROLâÔÐäV PCRYPT_HASH_BLOBáüÐä"V IOCTL_DISK_GET_DRIVE_GEOMETRY(ÑäV ISurrogate_FreeSurrogate_ProxyãLÑäV ??_7IOleInPlaceSite@@6B@áhÑäV CFSTR_MIME_GIFã”Ñä V IID_IOInetProtocolSinkStackableêV URLZONE_LOCAL_MACHINEÜÑäW STATUS_INVALID_DISPOSITIONãüÑäW SECURITY_PROXY_RIDãÒäW bottomë W GCL_HMODULEâDÒäX _set_newpoolsizeádÒäX SetDebugErrorLevelã€ÒäX ReLayoutDocfileê"X IXMLDocument_get_charset_StubÈÒäY IMAGE_SYM_TYPE_WORDâðÒäY ERROR_DUPLICATE_SERVICE_NAMEáÓäY sz_CERT_STORE_PROV_COLLECTIONè Y F5_320_1024âDÓäZ fflushãXÓäZ FF_MODERNpÓäZ ExtractIconExœÓä&Z PFN_CERT_DLL_OPEN_STORE_PROV_FUNC´ÓäZ PROP_LG_CXDLGÔÓäZ HBITMAP_UserMarshalêZ FR_MATCHKASHIDAâÔä[ SCHED_E_SERVICE_NOT_RUNNINGâDÔä&[ @class$7681clientEngine_dbg___pch\Ôä[ URLACTION_MINè[ SQL_ATTR_READONLY”Ôä\ can_derive_fromâ¬Ôä \ CAT_E_FIRSTâÄÔä \ CRYPT_OAEPãèÔä\ CoDosDateTimeToFileTimeê'\ ICreateTypeLib2_SetHelpStringDll_Proxyã,Õä] _NEWáTÕä] ExceptionContinueExecutionã€Õä] IRootStorage_SwitchToFile_Stubã˜Õä ] LPOLEUPDATEê] SQL_DYNAMIC_CURSOR_ATTRIBUTES1ãäÕä^ CS_E_INTERNAL_ERRORâüÕä ^ CTRY_MOROCCOáÖä^ dwMsgEncodingType0Öä ^ PENDINGTYPEâPÖä^ ??_7ITypeLib2@@6B@ã|Öä^ MDM_PROTOCOL_HDLCPPP_112K_CHAPãœÖä^ SQL_MAX_NUMERIC_LENê^ SQL_DYNAMIC_CURSOR_ATTRIBUTES2ãÜÖä_ iCtrlIdê _ PDATA_BLOBã×ä` SYSER_REGISTRATIONã,×ä ` SyntaxGUIDë` ObtainUserAgentStringèa OFN_ENABLETEMPLATEã×äb _EXCEPTION_DISPOSITIONã¤×ä b S_SERDLNá¸×äb PEMREOFâÐ×ä b WM_MOUSEMOVEáô×äb __MIDL_IAdviseSink_0003êb BINDINFO_OPTIONSá(Øä c PUHALF_PTRã<Øäc GW_MAXãlØä%c IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTSáŒØäc PDATATYPES_INFO_1Wëc __MIDL_IAdviseSink_0002âØØäd ERROR_INVALID_MONITOR_HANDLEáðØä d DV_E_LINDEXâÙä d PCONVCONTEXTé d OnUIActivateá8Ùä e min_elementê e GCP_RESULTSâxÙäf ERROR_DOMAIN_LIMIT_EXCEEDEDâ˜Ùäf SendNotifyMessageWã¸Ùäf MMIOERR_CANNOTWRITEâØÙäf CertFindCTLInStoreãôÙäf MSHCTX_CROSSCTXêf PRINTER_ENUM_ICON8ã4Úäg IMAGE_REL_MIPS_PAIRâ\Úäg SERVICE_FILE_SYSTEM_DRIVERãtÚä g cAlphaShiftêg GetCharWidth32Aâ°Úäh VER_PLATFORM_WIN32sâÐÚäh PRINTER_ENUM_ICON6ëh IRpcStubBuffer_CountRefs_ProxyãÛäi DMPAPER_LETTERã,Ûäi ReleaseDCLÛäi ALG_SID_CYLINK_MEKã`Ûä i pStubMsgáxÛä i fCheckBoundsá Ûäi PRINTER_STATUS_INITIALIZINGâÀÛäi PRINTER_ENUM_ICON7ëi ??_7ISynchronizeEvent@@6B@äÜä j EXPIRY_DAYãÜäj InitializeAclDÜä&j ERROR_SESSION_CREDENTIAL_CONFLICTXÜäj KP_KEYLEN|Üäj PRINTER_STATUS_PROCESSINGèj PRINTER_ENUM_ICON4ãÈÜä&k @class$7682clientEngine_dbg___pchàÜä k auxSetVolumeáüÜäk RPC_OBJECT_INQ_FNèk PRINTER_ENUM_ICON5ã0Ýä l POLYTEXTWèl PRINTER_ENUM_ICON2ãlÝäm LANG_VIETNAMESEâ€Ýäm iButtonâ Ýäm PRINTER_ENUM_ICON3ëm SQL_DESC_ARRAY_STATUS_PTRÜÝä n SYSYNC_FPIãðÝän PNT_TIBâ Þän WM_RENDERFORMATâ$Þä n put_dataTypeá<Þä n CommitSwitchén SQL_API_SQLNATIVESQLá„Þäo SECURITY_LOCAL_SID_AUTHORITYá Þäo short_from_ndrãÀÞäo PRINTER_ENUM_ICON1ãäÞäo PRINTER_CHANGE_ADD_FORMâ ßäo SC_MANAGER_MODIFY_BOOT_CONFIGèo SQL_IS_SECONDDßäp SendNotifyMessageAëp IXMLDocument_get_root_Proxyâˆßäq GetCharWidth32Wêq MIDL_FORMAT_STRINGã¼ßär floormaskäßär FORMAT_MESSAGE_ARGUMENT_ARRAYèr RegDeleteValueã(àäs EXCEPTION_MAXIMUM_PARAMETERSá@àä s IDC_UPARROWâ`àäs PERF_OBJ_TIME_TIMERâˆàäs szOID_RSA_SMIMEalgCMSRC2wrapé+s IXMLDOMDocument_createEntityReference_Stubãààät EM_EMPTYUNDOBUFFERäáät RpcProtseqEndpointãáä t ALG_SID_CASTáLáä(t CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAGâ€áä(t IClassFactory_RemoteCreateInstance_Stubâ¨áät IXMLDOMNode_cloneNode_StubãÐáät BINDINFO_OPTIONS_WININETFLAGét MAX_ZONE_DESCRIPTIONáâäu _GLYPHMETRICS(âäu PSCARD_READERSTATEëu PDATATYPES_INFO_1Aãlâäv ERROR_CANT_OPEN_ANONYMOUSèv wFmtá¤âäw ERROR_DATABASE_BACKUP_CORRUPTèw CONNECT_REFCOUNTáÔâäx Versionâìâä x lpOverlappedâãä x ST_INLISTèx PSM_INSERTPAGEã8ãäy MKF_CONFIRMHOTKEY\ãäy CLSCTX_INPROC_HANDLER16êy SQL_DATABASE_NAMEŒãäz POLYTEXTA¤ãäz PROP_LG_CYDLGèz __IDataFilter_FWD_DEFINED__âìãä{ RPC_S_NO_CALL_ACTIVEáää { EVENT_S_LASTá ää{ TT_POLYGON_TYPEâ8ää{ GWL_HINSTANCEè{ PROV_INTEL_SECãhää| FP_ZEROâ„ää| numeric_limitsãœää | otmDescentë| SQL_API_SQLGETSTMTOPTIONáÔää} INT_MINê} MDM_MASK_EXTENDEDINFO åä~ BS_USERBUTTON$åä ~ IOCPARM_MASKé$~ IAsyncRpcChannelBuffer_Receive_Stubâtåä PIMAGE_FUNCTION_ENTRYˆåä  WriteFileè  MB_ICONHANDâÀåä€ LookupPrivilegeNameAé$€ IDataObject_RemoteGetDataHere_Proxyâæä GetAtomNameâ(æä EMRSETPOLYFILLMODEë! IPersistMoniker_GetClassID_Proxyáhæä‚ ENOTTYã€æä‚ RegRestoreKeyœæä‚ tagMIDIINCAPSWã°æä ‚ hkeyClassè#‚ IRunningObjectTable_IsRunning_Stubãçäƒ _InitializeThreadDataIndexã$çäƒ DBL_MIN_10_EXPã@çäƒ GlobalGetAtomNameXçäƒ GDI_NONREMOTE„çäƒ __IROTData_INTERFACE_DEFINED__ã¸çä)ƒ __IInternetSecurityMgrSite_FWD_DEFINED__é ƒ NPSTYLEBUFãüçä!„ ERROR_DS_WRONG_LINKED_ATT_SYNTAXáèä„ InformationLevelá0èä „ IID_IROTDataé!„ ILayoutStorage_BeginMonitor_Stubá€èä… IMAGE_REL_IA64_GPREL22ã”èä… HRSRC__â¸èä… GetEnvironmentVariableë… KEYEVENTF_EXTENDEDKEYôèä† dwMinorVersionã éä † TTPOLYCURVEâ éä† BS_TEXTâLéä† MIXERCONTROL_CONTROLF_MULTIPLEãpéä† RPC_C_IMP_LEVEL_IDENTIFYé† IID_IEnumSTATPROPSTGá¨éä‡ COLOR_DESKTOPÀéä ‡ SignedInfoë‡ ITypeLib2_GetCustData_Proxyâüéäˆ Sectionâ$êä"ˆ COMADMIN_E_COREQCOMPINSTALLED<êä ˆ dmPelsHeightáTêä ˆ PWNDCLASSAãdêäˆ _NCBéˆ winbase.h¬êä(‰ ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZEâÀêä ‰ VTA_LEFTáàêä‰ tagEMRSELECTPALETTEãëä‰ PMCI_WAVE_OPEN_PARMSAëä ‰ remote_nameâ,ëä‰ NIF_TIPê*‰ ICatalogFileInfo_GetCatalogFile_Proxylëä Š fOutX”ëäŠ ERROR_INVALID_TARGET_HANDLEâ¼ëäŠ GDICOMMENT_WINDOWS_METAFILEâàëäŠ InitiateSystemShutdownëŠ LPOLEVERB ìä‹ GetObjectTypeè‹ WN_NOT_AUTHENTICATEDé Œ CryptGenKeyâ\ìä choose_append„ìä THREAD_DIRECT_IMPERSONATIONâ ìä EMR_SETBKCOLORë LPVIDEOPARAMETERSÌìäŽ x_tâììäŽ IMAGE_REL_MIPS_REFLOâíäŽ ciCharsetíä Ž XTYPF_ACKREQéŽ IPropertyStorage_Enum_Stubã`íä _IMAGE_FUNCTION_ENTRY€íä RESOURCE_REMEMBEREDâœíä tagMCI_SET_PARMSá¼íä MCI_OVLY_WHERE_SOURCEè pboolValáìíä ExceptionHandleré PRODUCT_ID_LENGTHîä ‘ IDH_HELPé ‘ tagOLERENDERáPîä’ is_function_impâpîä’ DESKTOP_READOBJECTSâŒîä’ CRYPT_OID_REGPATH´îä’ __ICallFactory_FWD_DEFINED__é’ RenameElementàîä “ _wcsnsetáïä“ PFILE_NOTIFY_INFORMATIONáïä “ WNDCLASSEXã8ïä“ DELETEITEMSTRUCTé “ LPSTYLEBUFãpïä” IMAGE_SYM_CLASS_FILEáïä” SZDDESYS_ITEM_FORMATS¬ïä” tagMIDIINCAPSAãèïä1” AsyncIMultiQI_Begin_QueryMultipleInterfaces_Stubé ” V_UNKNOWNREFáðä• SZDDESYS_TOPICã8ðä• PSCARD_T0_REQUESTè• VarR4FromBoolxðä– JOB_OBJECT_SECURITY_NO_ADMINáðä – ulOffStartã°ðä– LookupPrivilegeNameWáÐðä– SPI_GETACCESSTIMEOUTé– OLERENDER_DRAWãñä — MCI_WAVE_PCMáñä— PARTITION_IFSHñä!— __IMallocSpy_INTERFACE_DEFINED__ádñä— DeactivateAndUndoè— OleDestroyMenuDescriptorá ñä ˜ SM_RESERVED4á¸ñä ˜ dwFileDateMSáÜñä˜ MIXERLINE_LINEF_ACTIVEãòä ˜ __ITypeComp_INTERFACE_DEFINED__ê˜ SQL_PC_NON_PSEUDO8òä™ destroyâ\òä™ IMAGE_REL_ALPHA_GPDISPã„òä™ IS_TEXT_UNICODE_NULL_BYTESã òä™ MMSYSERR_BADDBãÌòä ™ PRINTER_NOTIFY_FIELD_SHARE_NAMEâüòä%™ ITypeInfo2_GetImplTypeCustData_Proxyáóä™ IME_ESC_AUTOMATAé™ SQL_UB_VARIABLEêš MonikerRelativePathTopóä› DMICMMETHOD_NONEáŒóä› WM_ENTERMENULOOPá¨óä› MM_STREAM_CLOSEâÄóä› PROP_MED_CYDLGë$› __AsyncIUnknown_INTERFACE_DEFINED__âôäœ IO_REPARSE_TAG_RESERVED_ONEâ0ôäœ MenuEventXôäœ MIXERCONTROL_CT_CLASS_SLIDERéœ IXMLElement2_get_text_Proxyâ˜ôä SM_RESERVED1á¬ôä VOS_OS232Èôä NumberMediaSidesé EMBDHLP_DELAYCREATEâõäž __uninitialized_copy_helperâ(õä ž equal_rangeâHõäž SEC_E_INTERNAL_ERRORá`õä ž HC_GETNEXTãxõä ž PWNDCLASSWãõä ž SM_RESERVED2á¨õä ž timeSetEventáÀõä ž PROV_STT_MERéž tagDISCARDCACHEâôõä Ÿ CBR_128000ãöäŸ DI_ROPS_READ_DESTINATIONá0öä Ÿ SM_RESERVED3áPöäŸ PMCI_WAVE_OPEN_PARMSWxöäŸ PCRYPT_KEY_SIGN_MESSAGE_PARAáŒöäŸ MK_ALTã°öäŸ SQL_COLUMN_AUTO_INCREMENTèŸ SQL_POSITION_TOâàöä  DM_COPYâøöä   RevertToSelfá÷ä  VK_OEM_FJ_LOYAã4÷ä  PDERR_PRINTERCODESë  MCI_ANIM_PUT_DESTINATIONál÷ä¡ BITSPIXEL€÷ä¡ BS_BOTTOM˜÷ä ¡ STN_ENABLEã°÷ä¡ MoveFromDriveè¡ SC_GROUP_IDENTIFIERAáè÷ä ¢ FileHeaderãøä¢ RpcStringFreeAã$øä¢ CERT_RDN_FLAGS_MASKê¢ PRINTER_ERROR_OUTOFPAPERápøä"£ CMSG_ENVELOPE_ALGORITHM_PARAM˜øä£ PCRYPT_PASSWORD_CREDENTIALSê£ HCERTCHAINENGINEáÐøä¤ LPRUNNABLEOBJECTé$¤ IOleInPlaceFrame_SetStatusText_Stubâùä¥ SQLFetchScrollë¥ SQL_CATALOG_USAGELùä¦ MCI_WHEREpùä¦ RPC_C_BINDING_MAX_TIMEOUT¨ùä,¦ AsyncIAdviseSink_Finish_RemoteOnClose_Proxyê¦ IME_SMODE_PHRASEPREDICTâèùä§ PIPE_TYPE_BYTEãúä§ ERROR_DS_INIT_FAILURE úä § BST_CHECKEDâ<úä§ ENABLE_ECHO_INPUTè"§ OleConvertIStorageToOLESTREAM„úä¨ __pointer_plus_bitãœúä¨ DMPAPER_ENV_9è¨ SPI_SETDESKPATTERNë© UuidFromStringãüúäª SUBLANG_GERMAN_AUSTRIANâ ûäª DlgDirSelectComboBoxExWâ<ûäª JOY_CAL_READUONLYdûä"ª IOleCache2_DiscardCache_Proxy”ûä*ª IOleInPlaceSite_OnPosRectChange_Proxy°ûäª PARSE_LOCATIONë ª _bearermodeâäûä« LDBL_MAX_10_EXPâüä« IMAGE_SYM_CLASS_FUNCTIONá(üä« SCARD_E_NO_SMARTCARDé« IID_IDirectWriterLock`üä ¬ _MSLCONFIGã|üä¬ IMAGE_ARCHIVE_END˜üä¬ lpStartAddressã°üä ¬ CS_NOCLOSEãÐüä¬ PCCERT_CHAIN_CONTEXTáèüä¬ NdrSH_IfAllocýä!¬ IMallocSpy_PostHeapMinimize_Stubé¬ URLACTION_SHELL_VERBáLýä® VK_OEM_PERIODdýä® PCWPRETSTRUCTýä® IOleObject_SetClientSite_Proxyë® ITypeInfo_GetTypeAttr_StubãÌýä¯ LC_ALLãìýä¯ AddAccessAllowedAceâþä ¯ GRAY_BRUSHãþä ¯ WM_PASTEé¯ MCI_OVLY_LOAD_PARMSAáTþä° TokenPrimaryGrouppþä° DSSPRIVKEY_VER3âœþä ° CMSG_ENVELOPED_DATA_CMS_VERSIONâÄþä° CCERT_STORE_PROV_FIND_INFOë° PDRIVER_INFO_1ã ÿä± ERROR_INSTALL_PACKAGE_REJECTEDã<ÿä#± ERROR_DS_SAM_NEED_BOOTKEY_PASSWORDë± TYSPEC_FILENAMEâlÿä ² inserteráˆÿä² const_mem_fun1_tá´ÿä ² ERROR_VOLUME_CONTAINS_SYS_FILESâÌÿä ² HWND_TOPMOSTáèÿä² PDRIVER_INFO_3ë ² SetClassáä³ iFSGrafEffectColorã<ä³ RpcSmEnableAllocateâXä³ PDRIVER_INFO_2ã€ä³ ITypeMarshal_Marshal_Proxyã¨ä³ IXMLElement2_put_text_ProxyâÈä³ RegisterMimeFilterë³ LPPAGESETUPHOOKâä´ BATTERY_FLAG_CHARGINGä´ WS_OVERLAPPED<ä´ LZERROR_UNKNOWNALGãXä´ RpcStringFreeWãxä´ IOCTL_DISK_RELEASEã”ä´ PDRIVER_INFO_5ãÔä4´ AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Stubâðä´ ITypeChangeEventsè´ SQL_C_SBIGINT$äµ dwStreamNameSizeá8äµ dwYSizeâXäµ BatteryLifePercentã€äµ sz_CERT_STORE_PROV_SYSTEM_Wêµ PDRIVER_INFO_4ãÄä¶ _MSL_FORCE_ENUMS_ALWAYS_INTâÔä¶ charTè¶ lpfnPageSetupHookä· JobObjectBasicLimitInformationã<ä· OF_SHARE_DENY_WRITEâ`ä· DNS_ERROR_INVALID_NAMEã€ä· NumberStorageElementsœä· PDRIVER_INFO_6ãÀä· URLACTION_SHELL_CURR_MAXé· SC_GROUP_IDENTIFIERWâä¸ LR_COPYFROMRESOURCEâä ¸ CP_SYMBOLè ¸ dwFileDateLSáXä&¹ ERROR_DS_CONFIDENTIALITY_REQUIREDxä¹ MCI_OVLY_LOAD_PARMSWé ¹ PIN_ADDRá äº __reverseÀäº IMAGE_SYM_TYPE_LONGâÜäº MB_SYSTEMMODALãôäº WNetCloseEnumèº SQL_ATTR_TXN_ISOLATIONã0ä» TRANSFORM_CTMDä» bcWidthâ\ä» EMR_RESTOREDCpä» MIXERLINEä» RpcSmSetThreadHandleá¬ä» PROP_MED_CXDLGë » CALPWSTRáää¼ DlgDirSelectComboBoxExAê ¼ IUrlMon_AsyncGetClassBits_Proxyâ4ä½ TAPE_DRIVE_REPORT_SMKSãLä ½ WINSPOOLAPIê ½ ICodeInstallá„ä¾ SORTVERSIONFROMLCIDâ¤ä¾ SPI_SETACCESSTIMEOUTé¾ PRINTER_NOTIFY_OPTIONS_TYPEâää ¿ denorm_minãä¿ SUBLANG_AZERI_LATINâä¿ ne_segtab,ä¿ AF_LATãHä¿ EndCylinderNumberè¿ IStorage_OpenStream_Proxy„ä À caRedGammaã¬äÀ RPC_C_PROFILE_MATCH_BY_BOTHâÄä À IRootStorageéÀ SQL_SFKD_CASCADEáäÁ ERROR_DS_DRA_MISSING_PARENTâ$äÁ R2_NOTMERGEPENãDäÁ SPI_GETMOUSETRAILSë Á cbElementsã€ä _REPARSE_GUID_DATA_BUFFERœä HEAP_MAXIMUM_TAGáÈä ITypeInfo_RemoteGetNames_Proxyãôä& IXMLDOMElement_setAttribute_Proxy ä SQL_C_DEFAULTè SQL_FN_STR_OCTET_LENGTHâP äà SUBLANG_ARABIC_KUWAITd äà EndHeader€ äà GetTapePositionâ” äà VK_NEXT⨠äà WM_MOVINGÈ äà CERT_FIND_ISSUER_ATTRì äà _CHANGER_EXCHANGE_MEDIUMá äà __IAuthenticate_FWD_DEFINED__è(à __ISupportErrorInfo_INTERFACE_DEFINED__â` ä Ä TokenSource⌠ä!Ä IXMLHttpRequest_get_status_ProxyéÄ SQLExecDirectWãÈ äÅ ERROR_DS_DRA_SHUTDOWNè äÅ LPMCI_WAVE_OPEN_PARMS äÅ SHGNLI_PREFIXNAMEè Å szCardNameëÆ FILE_DEVICE_SERIAL_PORTê#Ç IXMLDocument2_get_readyState_Proxy〠ä È WIN32¬ äÈ IXMLDOMNode_insertBefore_ProxyëÈ VarFormatPercentáð äÉ ERROR_INVALID_MSGBOX_STYLEã äÉ SEC_E_NOT_OWNERâ$ ä É WH_MINHOOKãD äÉ LPMCI_STATUS_PARMSãd äÉ FUNCFLAG_FDEFAULTBIND” ä%É IInternetZoneManager_GetZoneAt_ProxyéÉ SQL_DS_DROP_SCHEMAãÄ ä Ê _TEMPä äÊ IMAGE_SYM_TYPE_FLOATâ äÊ szOID_SUR_NAMEë Ê Begin_Pushã4 äË _OSVERSIONINFOEXAè Ë OpenDesktopAá` ä Ì CS_OWNDCá| äÌ RegisterHotKey㜠äÌ _PRINTER_ENUM_VALUESAè$Ì ICreateTypeInfo_SetTypeIdldesc_Stubâä ä Í __dolphin_osáø ä Í strncmpiéÍ ??_7IInternetProtocolSink@@6B@ãHäÏ SE_SYSTEM_PROFILE_NAMEãdäÏ _TOKEN_PRIVILEGESŒäÏ TAPE_DRIVE_GET_LOGICAL_BLKã äÏ Rectangle°ä Ï styleÈä Ï WM_MBUTTONUPáèäÏ pvEncryptionAuxInfoêÏ SQL_LOCK_NO_CHANGEã äÐ IPPORT_SUPDUPHäÐ PFN_FREE_ENCODED_OBJECT_FUNCéÐ OBJECTDESCRIPTORáˆäÑ FILE_ATTRIBUTE_ARCHIVEã°äÑ IMAGE_COMDAT_SELECT_NEWESTãÈä Ñ NUMBRUSHESãääÑ PPCMWAVEFORMATëÑ CMSG_CTRL_DEL_SIGNERá,ä"Ò ERROR_LOGON_SESSION_COLLISIONDä Ò TC_OP_STROKEá\ä Ò BINDSTATUSëÒ SQLExecDirectAãŒäÓ set_union°äÓ ERROR_SETMARK_DETECTEDãÔäÓ PMCI_ANIM_WINDOW_PARMSãðäÓ NonCachedReadsã äÓ LPSERVICEPROVIDERèÓ SQL_ATTR_RETRIEVE_DATAãDä Ô tagACCELádäÔ DVASPECT_THUMBNAILã€äÔ FILE_DEVICE_SMBâ˜ä Ô IsConnectedê.Ô SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATEôäÕ PCERT_AUTHORITY_KEY_ID2_INFOáäÕ CRL_REASON_REMOVE_FROM_CRLã8äÕ PROXY_UNMARSHALâ\äÕ SCARD_PROTOCOL_UNDEFINEDáŒä&Õ IXMLElementCollection_get_length_Stubè"Õ BINDINFOF_URLENCODEDEXTRAINFOÐäÖ IMAGE_NT_HEADERSáðäÖ CreateObjrefMonikerâ$ä'Ö __IXMLDOMEntityReference_FWD_DEFINED__ë'Ö IXMLDOMNamedNodeMap_get__newEnum_Proxyãtä× pszHeaderSubTitleä× LPWININETHTTPINFOè × SQL_C_SHORTâ¼äØ decode_mbääØ PERF_COUNTER_MULTI_TIMER_INVáäØ _MIDL_STUB_MESSAGEã,äØ FILE_DEVICE_FULLSCREEN_VIDEOéØ SQL_MAX_COLUMNS_IN_INDEXéÙ VOS_OS216xäÚ FiberData¤ä!Ú IS_TEXT_UNICODE_NOT_UNICODE_MASKáÄäÚ _PRINTER_ENUM_VALUESWìäÚ IRpcProxyBuffer_Connect_StubâäÚ syskindêÚ SQL_BS_ROW_COUNT_PROC<äÛ ReadProcessMemoryXäÛ DRAGDROP_E_FIRSTátäÛ LPDRAWTEXTPARAMSá ä&Û @class$7689clientEngine_dbg___pch´äÛ h_aliasesÐäÛ JOB_STATUS_PAUSEDìäÛ IXMLDOMCommentëÛ URLACTION_SHELL_MINâ,äÜ IMAGE_SYM_UNDEFINEDê Ü GW_OWNERá\äÝ _MSL_MATH_X87_HâxäÝ _OSVERSIONINFOEXW”äÝ LPBITMAPV4HEADERá¬ä Ý SB_LINEDOWNâÐäÝ ActivateKeyboardLayoutãèä Ý OpenDesktopWáäÝ CLIENTCREATESTRUCTã ä Ý iMinAnimateâDäÝ SCARD_READER_TYPE_SERIALáhäÝ __IUrlMon_FWD_DEFINED__â˜ä$Ý ISequentialStream_RemoteWrite_ProxyêÝ IID_ISynchronizeHandleãØäÞ denorm_presentãðäÞ CTRY_MALAYSIAäÞ FNERR_SUBCLASSFAILURE0äÞ PCRYPT_CREDENTIALSëÞ LPCREATETYPELIB2é ß wfstreamá€äà WT_EXECUTEONLYONCEã”ä à SBS_HORZá°äà tagMULTIKEYHELPAáÈäà CTRY_VIET_NAMàä à formatIndexêà SQL_DIAG_DROP_VIEWã äá GetProcessIoCountersáDäá FRS_ERR_STOPPING_SERVICEá`äá tagPALETTEENTRYâ„äá CB_GETHORIZONTALEXTENTã´ä*á CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFOÐäá RecoveredReadsãðäá IID_AsyncIAdviseSink2$ä(á ICreateTypeInfo_SetFuncHelpContext_Stubêá SQL_ROW_IDENTIFIERëâ RpcNsGroupMbrInqNextAèã PostThreadMessageWã˜ää _P_DETACH´ää PEMRPOLYLINE16ãÜää CMSG_SIGNER_CERT_INFO_PARAMê ä tagSTGMEDIUMáäå __MSL_CALLINGCONV_WIN32_H_ã@äå IMAGE_SCN_ALIGN_64BYTESâTäå HMENU__âtäå ERROR_PATH_NOT_FOUNDáŒä å METARECORDã¤ä å dwLayerMaskâÄäå RpcNsBindingExportPnPèå DRIVER_KERNELMODEôä æ dwContextèæ Mft2WritesLazyWriterá4äç MCI_VD_STEP_FRAMESã`ä"ç IInternetProtocolRoot_Start_Proxyèç SQL_PT_FUNCTIONâ äè IsProcessorFeaturePresent´äè LC_STYLEDÐäè WM_MEASUREITEMãèä è SOUNDSENTRYãä è CTRY_GERMANYá$äè RpcAsyncInitializeHandleá<äè LoadTypeLibExè è CHOOSEFONTWêé SPI_SETMOUSETRAILSãœä"ê EXCEPTION_INVALID_DISPOSITION¼äê PMIXERCONTROLDETAILSáàäê TYPEFLAG_FDISPATCHABLEã ä&ê IXMLDOMElement_getAttribute_Proxy ä ê V_UINTREFè ê cmathHä ë MajorVersionápäë ERROR_DS_DRA_SOURCE_DISABLEDáŒäë MCI_MODE_PAUSEã¨äë CMSG_DATA_FLAGãÔä&ë IFillLockBytes_RemoteFillAt_Proxyøäë IDataObject_GetData_Stubéë SQL_SCCO_READ_ONLYã0ä ì otmMacAscentáTäì RpcStringBindingParseWãpäì HandsOffStorageêì SQLProcedureColumnsWá¤äí SW_SHOWNA¸äí PMMCKINFOÌä í name_numéí ADDJOB_INFO_1Aã äî OpenWindowStationAã0 äî RPC_C_OPT_SECURITY_CALLBACKâP äî CHANGER_SET_POSITIONál äî CLSID_CSystemPage€ äî pulValë î dwOutFlags㨠ä ï ctimeÈ äï EMRSCALEWINDOWEXTEXê&ï CERT_UNICODE_VALUE_ERR_INDEX_MASK!äð LnSzá(!äð MCIERR_BAD_TIME_FORMATãD!äð PP_SIGNATURE_ALGéð STGFMT_STORAGEãx!äñ META_SETPIXELœ!äñ CryptSignMessageWithKeyâ°!äñ uintValêñ BINDF_ASYNCSTORAGEãø!ä"ò ERROR_DISK_RECALIBRATE_FAILED$"ä ò ERROR_INSTALL_REMOTE_DISALLOWEDêò OLEMISC_SUPPORTSMULTILEVELUNDOãp"äó GetCurrentThreadIdãŒ"äó CONTEXT_OID_PKCS7èó CLSID_SoftDistExtÌ"äô is_dynamically_allocatedáô"äô TAPE_DRIVE_SEQUENTIAL_FMKSã#äô WSA_QOS_EFILTERSTYLEá@#äô EVENT_E_ALL_SUBSCRIBERS_FAILEDã`#äô RpcNsGroupMbrInqNextW|#äô PSM_REBOOTSYSTEMá”#äô FUNC_DISPATCHèô BINDSTATUS_BEGINUPLOADDATAãÜ#äõ PostThreadMessageAãô#ä õ IDLFLAG_FINê õ LPOLESTREAMâ$ä ö _tell8$äö tagMULTIKEYHELPWáX$äö ID_PSRESTARTWINDOWSâˆ$ä#ö ICreateErrorInfo_SetHelpFile_Proxyëö SQL_SSF_UPPER¸$ä ÷ insert_multiáØ$ä÷ PSINJECT_PAGENUMBERâì$ä ÷ FW_HEAVYâ%ä÷ EM_UNDOâ%ä ÷ Positioné÷ URLOpenPullStreamd%ä(ø IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVERâˆ%äø WT_EXECUTEINWAITTHREADã¤%äø DM_ORIENTATIONãÄ%äø OpenWindowStationWãà%äø SWP_NOREPOSITIONâ&äø tMIXERCONTROLDETAILSá&äø TYPEFLAG_FHIDDENé ø SQL_CVT_GUIDéù CRYPT_IMPL_REMOVABLEáx&äú IMAGE_REL_PPC_ABSOLUTEãˆ&ä ú dmNup¬&äú RpcStringBindingParseAëú SQLProcedureColumnsAáì&äû _MSL_DO_NOT_INLINEã'ä û wHighVersioná'äû dwPromptFlags8'äû NDR_BIG_ENDIANãT'äû ADDJOB_INFO_1Wãh'ä û VarCyAbsé û V_DISPATCHã 'äü WINSTA_ENUMDESKTOPSâÀ'äü CERT_KEY_SPEC_PROP_IDèü IRecordInfo_RecordCreate_Proxyã(ä ý PrepareTapeâ((äý LCS_WINDOWS_COLOR_SPACEâD(äý CERT_OID_NAME_STRèý FULL_PTR_TO_REFID_ELEMENTŒ(äþ LOCALE_INEGSYMPRECEDESã¤(ä þ get_baseNameé þ CHOOSEFONTAâÐ(ä ÿ copysignáì(äÿ FIND_NAME_BUFFERé ÿ SQLBindColã)å __mcore_bareá8)å GetModuleHandleâ`)å ERROR_DS_NAME_VALUE_TOO_LONGáx)å lfOrientationˆ)å rgrcê SafeArrayCreateVectorExâÌ)ä SecurityLimitFlagsãì)ä DNS_ERROR_BAD_PACKETá *ä VIEW_S_ALREADY_FROZEN(*ä PMIXERCONTROLWë MSG_OOBâT*ä  S_WHITEVOICEáx*ä SHInvokePrinterCommandWê  CERT_CHAINã¨*ä  FILENAME_MAXáÌ*ä SetProcessAffinityMaskãè*ä SetMessageQueueâ+ä& MIXERCONTROL_CONTROLTYPE_UNSIGNED(+ä  CALG_MACá<+ä  pvSubjectè SCardLocateCardsAl+ä  VK_FINALá„+ä  DT_CALCRECTâ˜+ä booleanâ¼+ä MDM_PROTOCOL_V110_4DOT8Ké SQL_NO_ACTIONè+ä BlockSize ,ä PTAPE_CREATE_PARTITIONã,ä  iIconH,ä  _CERT_CHAIN_FIND_BY_ISSUER_PARAâh,ä PropSheet_IndexToHwndè" IXMLDocument_get_doctype_Stub´,ä TAPE_DRIVE_LOCK_UNLOCKãÔ,ä MCI_OVLY_OPEN_PARMSAáì,ä  VAR_STATICã-ä GetUrlPolicyPermissionsê SQL_FD_FETCH_RELATIVEH-ä  SPI_SETMOUSEáh-ä CERT_RDN_UTF8_STRINGá„-ä LPOPENCARDNAMEWâœ-ä  PSM_SETTITLEé MAX_SIZE_SECURITY_IDáÐ-ä  wcstombsé MCI_OVLY_PUT_VIDEOã.ä MAXCHARê SQL_NO_NULLSá<.ä PFLOATING_SAVE_AREAâX.ä DNS_STATUS_FQDNâp.ä SSGF_DISPLAYáˆ.ä tagTYPEKINDâ¨.ä INVOKE_PROPERTYPUTREFè SQL_ATTR_ANSI_APPì.ä DNS_ERROR_RCODE_NAME_ERRORã/ä szOID_PKIX_KP_TIMESTAMP_SIGNINGê GetTypeKindâP/ä IMAGE_REL_MIPS_GPRELáh/ä ntmFontSigã„/ä EMR_POLYTEXTOUTWé& AsyncIUnknown_Finish_Release_StubØ/ä NETSCAPE_SMIME_CA_CERT_TYPEâì/ä cChainã0ä pDependentFilesâ40ä ??_7IReleaseMarshalBuffers@@6B@âl0ä, ICreateTypeInfo2_SetHelpStringContext_Proxyâ˜0ä ITypeComp_RemoteBindType_Proxyë CHANGEKIND_CHANGEFAILEDâà0ä SUBLANG_ARABIC_ALGERIAãü0ä PORT_TYPE_READë, IEncodingFilterFactory_FindBestFilter_ProxyâD1ä ACLâ`1ä DCBA_FACEUPLEFTâx1ä  pbCtlEncodedá˜1ä createCDATASectionë V_VTáÄ1ä GetLongPathNameâä1ä MCI_OVLY_OPEN_PARMSWá2ä" IOleAdviseHolder_EnumAdvise_Proxyè SQL_CA2_MAX_ROWS_INSERTâ`2ä EVENTLOG_PAIRED_EVENT_INACTIVEã|2ä OSS_DATA_ERRORë LPOPENCARDNAMEAâ¬2ä shuffleâÌ2ä IID_IEnumFORMATETCë! __IInternetSession_FWD_DEFINED__á 3ä ERROR_INVALID_SERVICE_LOCKã<3ä CERT_DSS_S_LENãl3ä% SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLEé RetCodeâ”3ä  leftmostá¼3ä ERROR_DS_CONTROL_NOT_FOUNDãÔ3ä  GWL_USERDATAáø3ä SHInvokePrinterCommandAê CHANGER_ELEMENT_LISTá44ä LPCWAVEFORMATEXâh4ä( MIXERCONTROL_CONTROLTYPE_MULTIPLESELECTâ”4ä! CMSG_CTRL_KEY_TRANS_DECRYPT_PARAá°4ä SCardLocateCardsWè) IXMLDOMDocument_put_validateOnParse_Stubâ5ä HINSTANCE_ERRORâ5ä tagMETAHEADERè# MAX_PERF_OBJECTS_IN_QUERY_FUNCTIONãd5ä EMRPOLYPOLYLINE16€5ä PMIXERCONTROLAë Connectâ¬5ä  wShowWindowâÈ5ä rgPolicyQualifierð5ä BINDSTATUS_USINGCACHEDCOPYë lpPageSetupTemplateNameê CDN_SELCHANGEH6ä EMR_POLYTEXTOUTAé MIDI_IO_STATUSãx6ä wcsnicoll¤6ä& IMAGE_SIZEOF_NT_OPTIONAL64_HEADERÀ6ä SHGFI_OPENICONãÜ6ä KP_SERVER_RANDOMâ7ä NDRSContextUnmarshallExâ(7ä IInternetProtocol_Read_ProxyáD7ä wReplaceWithLenê SQL_OSC_MINIMUMâx7ä coll_cmpt_ptr”7ä OLE_E_NOTRUNNINGé RpcServerUseProtseqâØ7ä DEFAULT_EMAILS_HDRONLYë3 AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Stubã,8ä is_enumâT8ä _CRYPT_KEY_SIGN_MESSAGE_PARAé dwDialOptionsŒ8ä PFD_UNDERLAY_PLANEã¨8ä dwStrucVersionã¼8ä connectê  SQL_INTERVALáð8ä FileSystemTypeã 9ä CONTROL_C_EXITã9ä ABCâ@9ä RPC_C_NS_DEFAULT_EXP_AGEáh9ä CMSG_ENVELOPED_RECIPIENT_V0ê' ITypeLib2_RemoteGetDocumentation2_Stubë! ES_USER_PRESENTâØ9ä" SERVICE_AUTO_STARTãô9ä" CTRY_PHILIPPINESá:ä" MM_SNDBLST_WAVEIN8:ä" CMSG_ENVELOPED_RECIPIENT_V2ê" CHANGER_VOLUME_SEARCHp:ä# _MSL_EXTRAS_H:ä# CBS_OWNERDRAWVARIABLE¸:ä# CMSG_ENVELOPED_RECIPIENT_V3âì:ä(# IRpcChannelBuffer3_GetCallContext_Proxyê # VarUI1FromR4á;ä $ SC_DEFAULTãD;ä$ CMSG_ENVELOPED_RECIPIENT_V4ê&$ IBindCtx_RegisterObjectBound_Stub€;ä % HICON¨;ä% ERROR_DS_ALIASED_OBJ_MISSINGáÈ;ä% CALG_SCHANNEL_MAC_KEYä;ä% IDataAdviseHolderè% OpenStorageEx<ä& _MSL_FILENAME_MAX4<ä& GetProfileSectionP<ä& VIF_OUTOFSPACEã|<ä& __IPersist_INTERFACE_DEFINED__ë& PIDMSI_COPYRIGHTá¼<ä' _NDR_USER_MARSHAL_INFOë' SQL_ROW_SUCCESS_WITH_INFOø<ä ( DataLengthã=ä( SCARD_CLASS_POWER_MGMTã8=ä( EnumPrinterDataExè( V_R8REFâ`=ä) scalblnât=ä) first2ãŒ=ä) ACL_REVISION1´=ä) COMADMIN_E_BADREGISTRYPROGIDáÌ=ä) CBN_SELCHANGEè ) mmioRenameWâô=ä * _itoa>ä* first1ã >ä* ACL_REVISION2@>ä* PKCS_RSA_PRIVATE_KEYál>ä* ITypeLib_GetDocumentation_Stubë* SERVICE_CONTROL_SHUTDOWNá¨>ä+ ACL_REVISION3È>ä+ EMRSELECTCOLORSPACEâà>ä + LPCPINFOEXAâ?ä+ COMMON_LVB_GRID_LVERTICAL ?ä+ MEVT_EVENTPARMã8?ä+ auxOutMessageè"+ szOID_INFOSEC_SuiteAIntegrityx?ä, ACL_REVISION4ˆ?ä , ArcTo ?ä , WM_AFXLASTë, CRL_REASON_SUPERSEDEDä?ä- JOB_OBJECT_UI_VALID_FLAGS@ä- PAN_PROP_MONOSPACEDâ,@ä- I_RpcServerInqTransportTypeê1- IOleInPlaceActiveObject_OnDocWindowActivate_Stubá„@ä. _PUBLICKEYSTRUCâ°@ä". CERT_NEXT_UPDATE_LOCATION_PROP_IDè. SQLGetTranslatoráà@ä/ lshiftãô@ä/ pascalã Aä/ SB_THUMBTRACK GMEM_VALID_FLAGSáìIä> waveInAddBufferê> CERT_KEY_AGREEMENT_KEY_USAGEá$Jä? sortá __GREATERTHANÌÐä > e32_dirtabãäÐä > OEM_CHARSETâÑä> GetKeyboardLayoutListè> IOleObject_GetUserType_StubâLÑä? SetForegroundWindowâdÑä ? DrawIconExë? SQL_DIAG_UPDATE_WHERE˜Ñä@ streamoff¬Ñä@ EV_ERRãÄÑä @ META_POLYGONáèÑä@ _MIDL_STUBLESS_PROXY_INFOÒä'@ IExternalConnection_AddConnection_Stubë @ ITypeInfo_GetImplTypeFlags_StubâXÒäA wctobè A elfVersionã€Òä B PHKEYœÒäB szOID_OIWDIR_md2éB AddSynchronizeëC TAPE_DRIVE_CLEAN_REQUESTSðÒäD lstrcmpiAÓä D LPTEXTMETRICá(ÓäD _MENU_EVENT_RECORDëD MDM_PROTOCOL_V110_2DOT4KáhÓäE SidTypeInvalidã„ÓäE CoCreateInstanceé E GUID_CUSTOM_CONFIRMOBJECTSAFETYâÄÓäF EFAULTãØÓäF PST_RS422ìÓäF dwMaxBaudÔäF FormatMessageWã(ÔäF FRS_ERR_SERVICE_COMMáPÔäF IViewObject_GetAdvise_StubëF SetUrlPolicyPermissionsâÔäG _MSL_INT32_TYPEâ¤ÔäG PST_RS423¸ÔäG WM_HELPâÐÔä G SIZE_MAXSHOWé G AddPrinterAãÕä H BAUD_19200ã4Õä'H PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFOëH PIDMSI_SUPPLIERâdÕäI _fseekãxÕäI KF_REPEAT”ÕäI PCERT_EXTENSIONâ¬Õä I OffsetArrayâàÕä'I IXMLHttpRequest_get_responseBody_ProxyëI VarDecFromInt Öä J exponentá Öä J includesá8Öä J bV4SizeImageá\ÖäJ TIME_CALLBACK_FUNCTIONãxÖäJ ASSERT_ALTERNATEá¤Öä!J ICreateTypeLib2_SetCustData_StubéJ SQL_SR_UPDATE_COLUMNáØÖä K max_childè"K __IClassFactory_FWD_DEFINED__ ×äL ERROR_DS_LOOP_DETECTá8×ä L SS_RIGHTJUSTá\×äL CRYPTPROTECT_PROMPTSTRUCTˆ×ä"L SOFTDIST_FLAG_DELETE_SUBSCRIPTIONèL VarI2FromBoolè M FW_SEMIBOLDâÌ×äN removeãÜ×äN nodeáø×äN TerminateProcessá Øä"N RPC_S_UNSUPPORTED_AUTHN_LEVELHØäN ERROR_DS_ATT_ALREADY_EXISTSâtØä!N ERROR_DS_SAM_NEED_BOOTKEY_FLOPPYéN MIXERLINE_TARGETTYPE_UNDEFINEDã°ØäO IIDâØØä"O GetPrivateProfileSectionNamesøØäO PAN_SERIF_OBTUSE_COVEÙäO CP_THREAD_ACP0ÙäO RpcAsyncGetCallHandle@Ùä O ulVal`ÙäO put_resolveExternalséO SQL_INDEX_HASHEDá˜ÙäP FormatMessageAã¸ÙäP PEMRINTERSECTCLIPRECTèP QICâìÙäQ SCardForgetReaderGroupãÚä Q PSWIZB_NEXTâÚä Q AddPrinterWêQ StgOpenStorageExálÚä(R PJOBOBJECT_BASIC_ACCOUNTING_INFORMATIONâ€ÚäR lstrcmpiW°Úä#R COMADMIN_E_COMPFILE_NOTINSTALLABLEãÌÚäR BS_MONOPATTERNãèÚäR destination_addréR CMSG_OID_EXPORT_MAIL_LIST_FUNCã4ÛäS _abnormal_terminationLÛäS SC_SCREENSAVEhÛäS SPIF_SENDCHANGEâ„ÛäS FKF_FILTERKEYSONá´Ûä%S ITypeInfo_RemoteCreateInstance_ProxyéS PIDSI_REVNUMBERâäÛä T EXTERN_CáÜäT HEAP_MAKE_TAG_FLAGSâÜä T NPTEXTMETRICé'T IXMLDOMDocumentType_get_notations_StubãxÜä"U PSECURITY_IMPERSONATION_LEVEL¤Üä&U JOBOBJECT_BASIC_LIMIT_INFORMATION¸ÜäU ne_cmodâÜÜäU SERVICE_ERROR_CRITICALãüÜäU szOID_OIWSEC_shaRSAê"U CRL_DIST_POINT_ERR_INDEX_MASKLÝäV CRYPT_E_UNEXPECTED_MSG_TYPEâ`ÝäV PatBltã|ÝäV szOID_RSA_RC2CBCéV _LPBINDHOST_DEFINEDâ´Ýä W PCF_DTRDSRãÔÝäW SEC_E_INVALID_HANDLEé W rgbtBlueáÞä*X ?$basic_ios@_WU?$char_traits@_W@std@@0Þä X offBitsMaskâDÞäX dwFormatsdÞäX CERT_FIND_ISSUER_STRéX PI_MIMEVERIFICATIONâ¼Þä,Y ?$basic_streambuf@_WU?$char_traits@_W@std@@âÔÞä Y ?$__char@$00áðÞäY WNNC_CRED_MANAGERßäY CRYPT_ACQUIRE_CACHE_FLAGéY CC_PASCAL<ßäZ LimitHiâTßä Z SW_RESTOREãlßä Z FullPtrRefIdéZ FILE_DEVICE_STREAMSâ¤ßä [ ?$__char@$02áÄßä[ MOUSEEVENTF_RIGHTUPâäßä[ CreateIconIndirectãüßä [ midiOutGetIDé [ ReportResultá0àä\ LPCOMMTIMEOUTSãPàä\ ERROR_INVALID_SEGDPLálàä\ LPBITMAPCOREINFOáˆàä\ GB2312_CHARSETã¬àä\ SetUserObjectInformationáÀàä\ MOD_SHIFTØàä\ MCI_MODE_PLAYðàä \ SCardControlááä \ NODE_TEXTè*\ __MIDL_itf_propidl_0000_v0_0_s_ifspecTáä] MAXLOGICALLOGNAMESIZEláä ] DDL_ARCHIVEâ€áä] wireHDCâ¸áä-] __IReleaseMarshalBuffers_INTERFACE_DEFINED__áÔáä] tagSTDMSHLFLAGSâðáä] CFSTR_MIME_X_WAVé ] CHOOSEFONTã âä^ RELEASE_MONTH<âä^ SizeOfHeapReserve\âä^ DNS_ERROR_SECURE_BASE|âä^ DFCS_BUTTONRADIOMASKáœâä^ IsCharAlphaNumericë ^ GetScrollPosáÌâä _ ?$__char@$06é_ DNS_WARNING_DOMAIN_UNDELETEDá ãä ` IMAGE_SYM_CLASS_MEMBER_OF_UNIONâPãä#` _IMAGE_IA64_RUNTIME_FUNCTION_ENTRYãtãä` ERROR_REVISION_MISMATCHâœãä` FROM_LEFT_3RD_BUTTON_PRESSEDé` NDR_NOTIFY_ROUTINEãØãäa GCPCLASS_HEBREWâôãäa WNNC_NET_FTP_NFSáääa MCIERR_FILE_READá8ääa PFN_CERT_STORE_PROV_WRITE_CTLèa URLPOLICY_JAVA_MEDIUMpää b rdFunctionã„ääb SB_LEFTâ ääb WM_PAINTCLIPBOARD¼ääb C2_ARABICNUMBERâÔää b CTRY_MONACOâøääb RpcSmDestroyClientContextèb IErrorInfo_GetGUID_Stubâ0åäc WB_LEFTâdåä'c szOID_PKIX_POLICY_QUALIFIER_USERNOTICEã„åäc PropSheet_UnChangedâ°åä"c IEnumSTATPROPSTG_RemoteNext_Proxyèc SQL_IS_INTEGERãèåäd _IC_PROJECTIVEãæäd HP_TLS1PRF_LABELéd SQL_DL_SQL92_INTERVAL_SECONDé e ExtCreatePenáhæäf GetEnhMetaFilePixelFormat€æäf EMRSETBKCOLOR˜æä f _BYTE_BLOBã´æäf _DRIVER_INFO_6Aêf IXMLElement2_put_text_Stubãìæä g logblüæäg logláçäg LPD_TRANSPARENTâ,çä g FVIRTKEYáDçä g SBM_SETRANGEádçäg CertFindCRLInStoreëg __ITypeInfo_FWD_DEFINED__è6h AsyncIMultiQI_Begin_QueryMultipleInterfaces_Proxyèçäi ??_Gbad_cast@std@@UAE@I@Zøçäi logbáèäi float_denorm_styleã<èäi IS_TEXT_UNICODE_SIGNATURETèä i MARKPARITYãtèäi RPC_E_DISCONNECTEDãˆèäi SetBkMode¨èäi LCID_ALTERNATE_SORTSéi ICreateTypeInfoâÜèä j PARITY_EVENâôèäj GlobalDiscardéä j RGN_COPYé j bstrSourceã8éä k LB_SETCURSELék guiddef.htéäl ERROR_LOGIN_TIME_RESTRICTIONél SQL_PRED_CHARœéä m logbf¬éäm logfáÄéä m NTM_REGULARâÜéä m WM_INITMENUâøéäm PCMSG_SIGNER_INFO êäm IPersistStorage_Load_Proxyëm CLSID_ComBindingádêä"n ERROR_DS_CONFIG_PARAM_MISSING€êän WSA_E_CANCELLEDâ êän VIF_CANNOTDELETECURâÌêä n MIXERCONTROL_CONTROLTYPE_VOLUMEâàêän dwItemën IViewObject_SetAdvise_Stubëo VerSetConditionMaskâPëäp JOB_OBJECT_UILIMIT_HANDLESãtëäp GCPCLASS_NUMERICSEPARATOR”ëäp CAL_SABBREVMONTHNAME6¸ëäp CERT_RDN_VIDEOTEX_STRINGáÔëäp _DRIVER_INFO_6Wâüëäp IBindCtx_GetObjectParam_Stubé+p IXMLDOMDocument_getElementsByTagName_Proxyã\ìä"q ERROR_SERVER_HAS_OPEN_HANDLES|ìäq CAL_SABBREVMONTHNAME7è$q SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTHâÌìär SetTokenInformationâäìä r GetCharWidtháüìär GetUpdateRectíär CAL_SABBREVMONTHNAME4<íär RESOURCE_CONNECTEDër RPC_NOTIFICATION_TYPESãtíä s _strnsetá”íäs CAL_SABBREVMONTHNAME5¨íä s MCI_COPYáÜíä*s IXMLDOMDocument_put_ondataavailable_Proxyè1s IInternetProtocolSinkStackable_CommitSwitch_Stubá8îät CAL_SABBREVMONTHNAME2èt CertSerializeCRLStoreElementápîä u lconvŒîäu WS_CLIPCHILDRENâ¤îä u CharPrevExAêu CAL_SABBREVMONTHNAME3Øîäv getegidâøîäv VER_SUITE_TERMINALãïäv IMAGE_OPTIONAL_HEADER(ïäv PieâDïäv VP_FLAGS_CONTRAST\ïäv PKCS_UTC_TIMExïäv MDM_X75_DATA_128Kèv SQL_FETCH_ABSOLUTEã¬ïäw atanhlãÐïäw WINSTA_ACCESSGLOBALATOMSáðïäw CAL_SABBREVMONTHNAME1ðäw _loaddsâðä w KeyId,ðä w RunsReturnedéw IEnumOLEVERB_Clone_Stubêx CertSerializeCTLStoreElementá¨ðä$y CONVERT10_E_OLESTREAM_BITMAP_TO_DIBâ¼ðä y PTIMECAPSè%y ISynchronizeMutex_ReleaseMutex_Proxyá ñäz PCRYPT_CONTENT_INFOêz PRINTER_ERROR_JAMLñä{ SUBLANG_ARABIC_LEBANONãlñä{ ERROR_ALREADY_EXISTSá„ñä { NO_ADDRESSã ñä{ RemotableHandleê{ MDMSPKRFLAG_OFFâÜñä| AreAnyAccessesGrantedüñä| ERROR_INVALID_NAMEãòä | DM_FORMNAMEâ@òä!| __IRpcHelper_INTERFACE_DEFINED__áXòä | IXMLElementê)| ITypeInfo2_RemoteGetDocumentation2_Proxyá òä} atanhfë} SERVICE_ACCEPT_SHUTDOWNâäòä~ CAL_SABBREVMONTHNAME8óä~ RPC_IMPORT_CONTEXT_Pé~ IPropertySetStorage_Enum_ProxyãLóä SetSwapAreaSizeâdóä  GetTextColorá„óä CAL_SABBREVMONTHNAME9è CRYPT_DONT_CACHE_RESULTâ¸óä€ posâÌóä€ cScansë € C3_DIACRITICáüóä DATA_S_LASTâôä PDERR_DNDMMISMATCHã4ôä MAX_MONITORSá\ôä FILE_DEVICE_DISK_FILE_SYSTEMáxôä GetPrinterDataExWœôä IME_SMODE_PLAURALCLAUSEê SQLGetTranslatorWÐôä ‚ MONHSZSTRUCTáôôä‚ ___MISSING_ALIGNMENT__ë‚ SQL_FN_STR_LOCATE_2â<õäƒ ERROR_PASSWORD_MUST_CHANGEãXõäƒ PERF_SIZE_LARGEâtõäƒ CERT_FIND_HASHã”õäƒ PRINTER_CHANGE_PORTâÀõäƒ IPersistStream_GetSizeMax_Stubãàõäƒ IID_IOleAdviseHolderéƒ URLZONE_INTERNETá öä„ powâ,öä„ DISP_CHANGE_BADFLAGSáPöä„ NdrByteCountPointerFreeâlöä„ SCS_CHANGECLAUSEá”öä„ SQL_QU_PRIVILEGE_DEFINITIONê„ SQL_ISV_USAGE_PRIVILEGESé… SUBLANG_ENGLISH_USä÷ä† PROVIDER_KEEPS_VALUE_LENGTHâ÷ä † ST_ISLOCALã8÷ä† CMSG_CTRL_DEL_CERTãT÷ä† _DRIVER_INFO_1Aâh÷ä † AddPortWáˆ÷ä† HICON_UserUnmarshalâ°÷ä† URLACTION_HTML_USERDATA_SAVEáÌ÷ä† SQL_DRIVER_HLIBê† SQL_ASYNC_MODEã øä‡ IMAGE_REL_I386_DIR32NBã(øä‡ VK_OEM_NEC_EQUALé‡ SectorsPerTrackâtøä#ˆ JOB_OBJECT_LIMIT_PRESERVE_JOB_TIMEãŒøä ˆ CharToOemWã¬øäˆ PMCI_OVLY_SAVE_PARMSW¼øäˆ IOCê ˆ _WINSVC_áðøä‰ PRINTER_ENUM_NETWORKáùä‰ IInternetProtocolSink,ùä‰ LPCODEBASEHOLDãLùä‰ SQL_API_SQLALLOCSTMTé‰ SQLSetConnectAttrWã€ùä Š __wcstoulèŠ dwModemVersionOffsetá´ùä‹ WM_NULLâÔùä‹ SendDlgItemMessageãôùä‹ ChangeClipboardChaináúä‹ LOCALE_SNATIVECTRYNAMEã<úä‹ NdrClientContextMarshallé ‹ SCardStatusWátúäŒ COLOR_ACTIVECAPTIONâ¤úä&Œ CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALIDèŒ ??_7IXMLDOMImplementation@@6B@ãèúä mapped_typeâüúä PST_RS449ûä IOC_VOIDé PageSetupDlgW@ûäŽ num_bits_wordXûä Ž LANG_SLOVAKâtûäŽ HRESULT_FACILITYá”ûäŽ midiStreamPropertyãÄûä#Ž __IEnumMoniker_INTERFACE_DEFINED__ëŽ MKRREDUCE_TOUSERáøûä RASTERCAPSã üä SO_LINGER$üä CryptEncryptáHüä NdrVaryingArrayMemorySizeè PIDDSI_MANAGERã€üä _PACKEDEVENTINFOáœüä _DRIVER_INFO_1Wâ°üä AddPortAáÈüä IID_IOleLinké IMN_PRIVATEâôüä‘ IDH_OKãýä‘ CERT_DSS_SIGNATURE_LENã4ýä‘ PIDDSI_LINECOUNTé‘ WM_PSD_ENVSTAMPRECTâxýä’ CBF_SKIP_ALLNOTIFICATIONSŒýä’ PF_MAXã¬ýä’ PRINTER_STATUS_PAUSEDè$’ SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTEâìýä “ frexpüýä“ ciACPè“ MMSYSERR_INVALFLAGã8þä” SE_SACL_DEFAULTED\þä” INET_E_DOWNLOAD_FAILUREâ€þä” dwPreferredModemOptionsê” SQLSetStmtAttrã¼þä• TranslateAcceleratoráÐþä• dwEventâèþä • DefaultScaleáÿä• ITypeLib_ReleaseTLibAttr_Proxyë • IEnumSTATPROPSETSTG_Clone_Proxyâ`ÿä– HKEY_LOCAL_MACHINEë – MCI_STATUSã”ÿä— GetPrinterDataExAè— get_preserveWhiteSpaceãØÿä˜ LPEXCEPTION_POINTERSáüÿä˜ RPC_S_PRF_ELT_NOT_REMOVEDä˜ DT_BOTTOM0ä˜ UnregisterMimeFilteré˜ SQL_DIAG_ALTER_DOMAINdä ™ __usableá|ä ™ ENUM_S_LASTâ”ä™ DispatchTable¸ä™ szOID_YESNO_TRUST_ATTRãää!™ NdrNonConformantStringMemorySizeé ™ rgboundsáäš BatteryLifeTimeâ4äš WriteConsoleOutputãLäš IN_CLASSA_MAXèš OleGetIconOfFileá€ä › __msl_xdigitá°ä#› ERROR_INSTALL_PLATFORM_UNSUPPORTEDãÈä › HaveIidStrãìä› ITypeLib_FindName_Proxyâä› PageSetupDlgAè› SQL_ODBC_KEYWORDSè œ MAKEWPARAMãXä SUBLANG_ENGLISH_UKãpä SND_ALIAS_IDá”ä RpcNsMgmtEntryInqIfIdsãÄä# CERT_FILE_STORE_COMMIT_ENABLE_FLAGãÜä SCardStatusAé# IOleInPlaceFrame_InsertMenus_Proxyã0äž ERROR_CAN_NOT_COMPLETEãXäž ERROR_FLOPPY_WRONG_CYLINDERâpä ž CharToOemAãäž PMCI_OVLY_SAVE_PARMSAèž dwActiveProtocoláÌäŸ EXCEPTION_DEBUG_INFOáìäŸ NumberCleanerSlotsãä Ÿ pszMfgNameã,äŸ ICreateTypeLib_SetGuid_StubêŸ SQLSetConnectAttrAãlä  TYPE_E_CIRCULARTYPEâ„ä   HWND_BOTTOMâ ä  pszDisplayTextã¼ä  SPLREG_DS_PRESENTÜä  MDM_PROTOCOL_X75_64Ké  SQL_CP_RELAXED_MATCHáä¡ PENHMETARECORDã@ä"¡ PFN_CERT_STORE_PROV_WRITE_CRLXä¡ IME_CAND_CODEè¡ SQL_INTERVAL_DAYáä¢ RPC_S_FP_OVERFLOW¨ä ¢ dwBrightnessáÄä¢ IClientSecurityê¢ MDM_FLOWCONTROL_SOFTâä£ SND_ALIAS_STARTâä£ I_RpcFreeHä'£ CERT_POLICY_QUALIFIER_NOTICE_REFERENCEë£ URLACTION_HTML_FONT_DOWNLOADá ä*¤ CREDENTIAL_OID_PASSWORD_CREDENTIALS_AÔä*¤ IInternetSession_UnregisterNameSpace_Stubè¤ SQL_SU_PRIVILEGE_DEFINITIONê¥ JOB_POSITION_UNSPECIFIEDá@ä¦ PIMAGE_THUNK_DATA64â\ä¦ STG_E_NOTCURRENTáxä¦ EMR_POLYLINETO16é/¦ __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__ãÈä § _cuseridáØä§ BOOLáüä§ ERROR_CLUSTER_NODE_EXISTSä § NTE_BAD_UIDâ(ä§ iStartã@ä § LOCALE_IDATEáhä§ MCI_WAVE_SET_AVGBYTESPERSECê§ LPOFNHOOKPROC”ä¨ TlsFreeâ°ä¨ META_SETRELABSãÌä¨ PSP_USEREFPARENTé¨ V_R4REFâ ä © IMAGE_DIRECTORY_ENTRY_EXCEPTIONê(© IOleInPlaceSite_OnInPlaceActivate_ProxyâX äª UserSidOffsett äª SCARD_E_TIMEOUTâ äª CryptSignHashAëª SZ_ASYNC_CALLEEâÐ ä« ACCESS_PROPERTY_SET_GUIDáà ä« e_ipáø ä « TC_SA_DOUBLEá ä « EqualRgné« PlayEnhMetaFileâH ä¬ AddressOfCallBacksãp ä"¬ SPAPI_E_INVALID_FILTER_DRIVER„ ä ¬ hKeyBaseá¤ ä¬ UserIndexReadBytesãÀ ä¬ DROPEFFECT_SCROLLè¬ SQL_FN_STR_LCASEâ ä­ DEFAULT_TRANSPORT_PASSWDá ä­ GetMenuString8 ä­ MCI_SEQ_SET_MASTERë­ ROTFLAGS_ALLOWANYCLIENTâp ä® wStyleã„ ä ® LOGFONTWáœ ä ® NPJOYINFOEXê® CreateMonikerÈ ä¯ isprintâÜ ä¯ ENOMEMãð ä¯ haccelë¯ loadá ä° LPWSTRã4 ä° FILE_READ_ATTRIBUTESé° PMIDL_STUBLESS_PROXY_INFO| ä± REPARSE_GUID_DATA_BUFFERá  ä± SetTimeZoneInformationãÀ ä± POSTSCRIPT_IDENTIFYâà ä± EMRSETVIEWPORTORGEXâø ä± HTBOTTOMRIGHT ä± CRYPT_VERIFY_MESSAGE_PARA8 ä± TYPEFLAG_FCONTROLè ± MDMVOL_LOWãt ä² IMAGE_SYM_CLASS_ARGUMENTáŒ ä ² RegEnumValueá´ ä² PCERT_STORE_PROV_FIND_INFOë*² CREDENTIAL_OID_PASSWORD_CREDENTIALS_Wü ä ³ ODT_BUTTONãä ³ XTYP_ADVSTOPá0ä³ cUsageIdentifierádä)³ CIP_TRUST_VERIFICATION_COMPONENT_MISSINGé³ NI_FINALIZECONVERSIONRESULTâ°ä´ RPC_X_WRONG_PIPE_VERSIONáÐä´ DMICMMETHOD_DEVICEãôä´ ENABLE_PROCESSED_INPUTë ´ tagOLECONTFâ,äµ const_mem_fun1_ref_táTäµ __ISurrogate_FWD_DEFINED__ãpäµ IXMLHttpRequestâ ä&µ IXMLHttpRequest_get_responseBody_Stubè$µ IEnumSTATPROPSETSTG_RemoteNext_Stubâää¶ ALG_IDë¶ REGULAR_FONTTYPEá ä· PTOKEN_DEFAULT_DACLâ@ä· WSAVERNOTSUPPORTEDë· MARSHAL_E_LASTãpä ¸ LOGFONTAáœä ¸ CERT_SYSTEM_STORE_RELOCATE_FLAGê ¸ get_dtdURLãÔä¹ SECURITY_ANONYMOUSãðä¹ CERT_COMPARE_HASHè¹ CreateURLBindingá(äº SE_DACL_DEFAULTED@ä º AmaskValueãdäº CertVerifyCRLRevocationêº PropVariantClearé » BAUD_56Ká¬ä ¼ COMMCONFIGë¼ CryptSignHashWãèä½ LookupPrivilegeValueáä½ PCRYPT_ATTR_BLOBá,ä½ InterfaceSupportsErrorInfoë½ SQL_DIAG_RETURNCODEâpä¾ NOTIFYICONDATAA_V1_SIZEâ¤ä)¾ PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTORé¾ IXMLElement_get_parent_StubâÜä¿ INTâôä ¿ CTRY_URUGUAYáä ¿ lMinimumé¿ OtherExceptionsâDäÀ MaxJobObjectInfoClassTä À wFunchä À ctrlCodeé À NUMPARSEáäÁ PPOINTLâ¨ä Á LPWNDCLASSAâÄäÁ WM_DDE_INITIATEê Á dwReturnáüä SE_DACL_AUTO_INHERIT_REQá ä IEnumSTATSTG_Clone_Stubê$ SQL_SQL92_RELATIONAL_JOIN_OPERATORSâhä à MAXLONG_PTRâ|äà S_FALSEâ äà RPC_C_AUTHN_GSS_KERBEROSá´äà CTL_ENTRYää%à CERT_PROT_ROOT_INHIBIT_PURGE_LM_FLAGáä$à OBSOLETE_IOCTL_STORAGE_RESET_DEVICEêà dwConfigVersionâDäÄ _execlpâdäÄ ERROR_NO_VOLUME_LABELˆäÄ PAN_MIDLINE_LOW_POINTEDâ¤äÄ CONTEXT_OID_CTLâÀäÄ FILE_DEVICE_DISKé Ä _OLESTREAMää"Å CO_E_ACTIVATIONFAILED_TIMEOUTäÅ BDR_OUTER(ä Å FNOINVERTèÅ SCARD_ALL_READERShäÆ RegisterClipboardFormatAá€ä Æ LPMOUSEKEYSêÆ _DRIVER_INFO_3Aâ¸äÇ DLL_THREAD_ATTACHÔäÇ STG_E_REVERTEDãìä Ç SBM_GETRANGEâäÇ ncb_event äÇ CALG_SCHANNEL_ENC_KEY<äÇ SERVER_EXECUTEãXäÇ IID_IEnumSTATSTGátäÇ ReleaseVarDescãœäÇ ??_7IEnumSTATPROPSETSTG@@6B@éÇ VarIntFromStrèÈ DUPLICATEääÉ CUST_SYNC_MODELêÉ CMSG_HASHED_ENCODE_INFOâ(äÊ SidTypeWellKnownGroup@äÊ OpenSemaphoreèÊ ERROR_DS_SCHEMA_ALLOC_FAILEDá|äË _Arrayã˜äË OSVERSIONINFOAëË IOCTL_CHANGER_BASEãÜäÌ PRINTER_ENUM_CONNECTIONSéÌ URLTEMPLATE_MEDIUMãäÎ lParamã,äÎ STG_E_SEEKERRORâHäÎ PERF_TYPE_NUMBERá`äÎ SCARD_PRESENTè-Î IXMLHttpRequest_put_onreadystatechange_Proxyá¬ä Ï wcstoulláÈäÏ CreateMailslotWâàäÏ VirtualUnlocküäÏ ERROR_DS_DUP_OIDá$äÏ COMADMIN_E_APPLICATIONEXISTSá4äÏ uhValèÏ SQL_ALTER_TABLEâdäÐ LPTSTRãˆäÐ _SE_IMPERSONATION_STATEâ¬äÐ CO_E_SERVER_EXEC_FAILUREáÈäÐ EMR_STRETCHBLTãìäÐ RegisterClipboardFormatWáä Ð iTimeOutMSecá äÐ _DRIVER_INFO_3WêÐ IDataFilter_DoDecode_Proxyã\äÑ _execleâtä Ñ EDGE_RAISEDêÑ QueryServiceLockStatusãÀäÒ IMAGE_NT_OPTIONAL_HDR32_MAGICèÒ IMAGE_REL_SH3_PCREL8_LONG äÓ PRIVILEGE_SET_ALL_NECESSARYâ äÓ EMRFORMAT8ä Ó IsCharLowerâ\äÓ CERT_FIND_SIGNATURE_HASHéÓ MDM_V110_SPEED_DEFAULTã´ä)Ô IXMLDOMDocument_put_ondataavailable_Stubé Ô OPENFILENAMEéÕ MCI_NOTIFY_FAILUREëÖ MFT_RADIOCHECKã ä × LPWNDCLASSWê × HWND_TOPáHäØ MK_S_USâ`ä Ø DRV_ENABLEãpäØ hmsâäØ PartitionClassGuidã°äØ SCARD_STATE_UNAWAREê/Ø IInternetSecurityManager_GetSecuritySite_Proxyãä Ù _MSL_CFLOATâ äÙ CreateMailslotAâDäÙ RPC_S_GRP_ELT_NOT_REMOVEDèÙ GetTextExtentPoint32á€äÚ SYSER_EXTRA_IDã äÚ PSID_AND_ATTRIBUTESâÄäÚ _MESSAGE_RESOURCE_ENTRYâàäÚ wPacketVersionãôäÚ CBR_300â ä Ú WC_SEPCHARSâ äÚ n_aliasesLäÚ IRpcStubBuffer_Disconnect_StubëÚ SQL_POS_REFRESHâxäÛ compá”äÛ MA_ACTIVATEANDEAT´äÛ PERF_DISPLAY_SECONDSéÛ __SQLDATEääÜ GetSystemMetricsá äÜ SBS_SIZEBOXBOTTOMRIGHTALIGNâ$ ä Ü mmtime_tagã@ äÜ CRYPT_CREATE_SALTd äÜ CertSetCRLContextPropertyˆ äÜ NdrEncapsulatedUnionFreeᨠäÜ STGM_DELETEONRELEASEé*Ü __MIDL_itf_propidl_0000_v0_0_c_ifspecô äÝ OSVERSIONINFOWã !ä Ý ERROR_DYNLINK_FROM_INVALID_RINGâ@!äÝ wglSwapLayerBuffersâ`!äÝ CBF_FAIL_CONNECTIONSéÝ pvarRightˆ!äÞ PPOINTSâ !ä Þ IAdviseSink2áÈ!äÞ IOleLink_GetBoundSource_ProxyèÞ ITypeInfo_GetIDsOfNames_Stubâ"ä ß rfind"äß FILE_TYPE_UNKNOWNè ß SetTextColoráT"äà WSA_QOS_NO_RECEIVERSáp"äà WS_MINIMIZEBOXëà URLACTION_NETWORK_MAX¤"ä á CWPSTRUCTèá FR_HIDEMATCHCASEáÔ"ä â ne_magicáì"äâ UuidCreateNilèâ MKRREDUCE$#äã IMAGE_REL_BASED_HIGHADJâ@#äã ERROR_DISCARDEDâ`#äã ERROR_LIBRARY_OFFLINEèã CS_E_INVALID_VERSIONá #ää _IMAGE_IMPORT_BY_NAME¸#ä ä iKernAmountâÌ#ää NCBCALLâà#ää sockproto $ää CERT_NON_REPUDIATION_KEY_USAGEã$$ää SCERR_NOGUIDSèä MDM_PROTOCOL_V110_1DOT2Káp$äå TAPE_DRIVE_WRITE_SHORT_FMKSâœ$ä!å SPAPI_E_NO_SUCH_DEVICE_INTERFACEáÄ$äå CHANGER_STATUS_NON_VOLATILEâÜ$ä å tagPARAMDATAéå ODBC_USER_DSN%äæ MB_ICONWARNINGã,%äæ WC_COMPOSITECHECKH%äæ _DRIVER_INFO_2Aâp%äæ ??_7IInternetBindInfo@@6B@ëæ WM_PSD_GREEKTEXTRECTá´%äç RpcServerUseProtseqEpAëç V_ARRAYâà%äè OLE_E_NOCACHEá&äè LR_LOADMAP3DCOLORSã$&äè _CRYPT_SIGN_MESSAGE_PARAéè VarUI1FromBoolãT&äé ne_heapê*é CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED˜&äê do_assign´&äê LANG_HUNGARIANãÈ&ä ê Affinityáð&ä"ê IS_TEXT_UNICODE_ILLEGAL_CHARS'ä ê szCSDVersioná 'äê dmPaperLength8'ä ê EM_SETHANDLEáT'äê _SHFILEOPSTRUCTAéê GetOpenFileNameâ”'äë PHTTPSPolicyCallbackDataéë LPSERVICE_TABLE_ENTRYÌ'ä ì _CW_DEFAULTâì'äì CMSG_ENCODED_MESSAGEâ(äì IPipeLong$(äì _LPCODEINSTALL_DEFINEDëì SQL_FN_NUM_RANDâX(ä í e32_debuglenát(äí FILE_TYPE_CHARã”(äí ERROR_DISK_CORRUPTã´(äí LPBITMAPFILEHEADERãà(ä í IPropertyStorage_SetTimes_Proxyã)äí SQL_MODE_READ_ONLYëí SQL_CODE_YEAR0)ä î PtInRegionãH)ä î MCI_UNFREEZEáh)äî LPMCI_RECORD_PARMSãx)ä î pFrom˜)äî szOID_KEY_ATTRIBUTESé,î IExternalConnection_ReleaseConnection_Proxyâð)äï ICM_SETDEFAULTPROFILEè ï uiVal*ä ð ?$store_as@Má,*äð __slabã¨*ävð ?$reverse_iterator@V?$__wrap_iterator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PB$$CBD@std@@Ì*äð NETPROPERTY_PERSISTENTãè*äð _DRIVER_INFO_2Wâ+äð ITypeInfo2_GetAllCustData_Stubë"ð IXMLDOMNode_replaceChild_Stub\+äñ IMAGE_SYM_TYPE_ENUMâ€+äñ RpcServerUseProtseqEpWã¨+äñ _STORAGE_BUS_RESET_REQUESTãÜ+ä'ñ __IReleaseMarshalBuffers_FWD_DEFINED__ë&ñ IXMLDOMNotation_get_publicId_Stub ,ä ò ?$store_as@OáD,äò sz_CERT_STORE_PROV_PKCS7áX,ä ò wireHFONTèò IDispatch_Invoke_Proxyã¨,ä!ó RPC_C_OPT_MQ_TIME_TO_REACH_QUEUEéó CRL_ENTRYÔ,ä ô ?$store_as@Iáô,äô RPC_BINDING_VECTORë ô F8_256_128ã(-äõ FLT_MAX_10_EXPã@-ä õ ?$store_as@HáX-ä õ FW_DEMIBOLDâl-äõ DEVMODEâ-äõ szOID_PKCS_7_ENVELOPEDëõ VarParseNumFromStrãÄ-ä ö TimeZoneáØ-ä ö WS_GROUPáü-äö VP_CP_TYPE_MACROVISIONã.äö DDE_FNOTPROCESSEDè&ö FMTID_MediaFileSummaryInformation\.ä ÷ ?$store_as@Já|.ä÷ CLSID_StaticMetafileé÷ IOleObject_SetExtent_Proxyã¼.ä ø ?$store_as@EáÐ.ä ø bmPlanesáè.äø COLOR_ADJ_MIN/äø IPersistStorage_InitNew_Stubá /äø cDimsè ø IXMLDOMDocument_put_async_Proxyâ`/ä ù biPlaneséù RewritePartitioná¬/ä%ú CertSerializeCertificateStoreElementáÔ/äú CertFindSubjectInSortedCTLëú CLSCTX_INPROC_HANDLER 0ä û ?$store_as@Fá00äû MCI_SYSINFO_INSTALLNAMEâX0äû RPC_C_MGMT_IS_SERVER_LISTENâx0äû SEE_MASK_NO_CONSOLEâ¤0äû CERT_FIND_OR_ENHKEY_USAGE_FLAGëû I_NsClientBindSearcháÜ0ä ü PS_DASHDOTãô0ä ü InvertRectã1äü _SHFILEOPSTRUCTWé ü dwStartTypeâD1äý MakeProcInstanceá\1ä ý RectInRegionát1ä ý WAVEFORMATã”1äý LPMCI_ANIM_STEP_PARMSÀ1ä ý NdrUserMarshalSimpleTypeConvertêý TYPEFLAG_FRESTRICTEDáø1ä þ ?$store_as@Cá2äþ SE_GROUP_LOGON_ID42äþ ContinueDebugEventãL2ä þ SetScrollPoséþ SQL_ASYNC_ENABLEáŒ2äÿ REG_QWORD_LITTLE_ENDIANâ¤2ä ÿ PS_USERSTYLEáÈ2äÿ PERF_COUNTER_MULTI_BASEâà2äÿ PROV_STT_BRND3äÿ PRINTER_CHANGE_SET_FORMâ(3äÿ IOleObject_Update_Proxyêÿ IXMLDOMNode_get_prefix_Stubâl3åMETA_DIBBITBLTìLOCK_ONLYONCEœ3äGetCharWidthA´3ä PDROPSTRUCTê aBstrð3ä EXCEPTION_ARRAY_BOUNDS_EXCEEDEDâ4äcbDataë szOID_PKIXã<4äuser_se_translatorãL4äcoshé??_7IOleWindow@@6B@âŒ4äSORT_JAPANESE_XJISëcbOuterString¸4äFuncLenâØ4äFILE_USER_DISALLOWEDáð4ä HELP_COMMANDá5ä pResourceèSQLGetEnvAttr45ä SubSystemTibáT5äWT_EXECUTEDELETEWAITál5ä StateFlagsã€5äxDenomã 5äSZDDESYS_ITEM_RTNMSGá¼5äDRVCNF_RESTARTãÐ5ä NCB_POSTáì5äPDRIVER_INFO_3Aâü5äEnumé!ILayoutStorage_LayoutScript_Stubá86ä div_tH6äcoslá\6äfrexplã|6äEnumResourceLanguages˜6äStartingOffsetã¬6äPPERF_BINÄ6ä CompleteCalléMDM_SHIFT_AUTO_SPEEDáô6ä fseek7ätagWINDOWPLACEMENTã<7äSCARD_ATTR_DEVICE_SYSTEM_NAMEèIOleContainer_EnumObjects_Stubã7ä COMADMIN_E_COMPFILE_BADTLBë IOleObject_InitFromData_StubáÐ7ä IMAGE_SYMBOLáð7ä ERROR_FILE_NOT_FOUNDá8ä META_RESIZEPALETTEã$8ä OnStopãP8ä! ??_7IXMLDOMDocumentFragment@@6B@é PIDSI_TEMPLATEë WNDENUMPROCâ˜8ä SS_NOTIFYè MM_JOY1MOVEâÈ8ä PROXY_SUPPORTØ8ä cosfáì8ä frexpfã 9ä ?$__num_bits@$0PPP@â(9ä CreateNamedPipeAáD9ä ERROR_BAD_COMMANDè CS_INSERTCHARp9ä ptlOffsetèPRINTER_NOTIFY_OPTIONSã¨9äfloat_tâÄ9äCLSID_PSBindCtxâä9ätagCLEANLOCALSTORAGEéSQL_DD_DROP_DOMAINã:ä wstringbufã0:äPUINT_PTRH:ä GCP_LIGATEãd:äWNNC_NET_HOB_NFSáx:ädwDelayâ˜:äRpcBindingInqObjectêPDRIVER_INFO_3WâÄ:ä PCSTRØ:ä CopyImageèhszâ;äbalance_insertã;äTOKEN_EXECUTE0;ä ne_stacká`;ä#ERROR_DS_AUTH_METHOD_NOT_SUPPORTEDëIRecordInfo_PutField_Stub¤;äWNNC_NET_LANTASTICëCRYPT_GET_URL_FROM_PROPERTYâä;ä GetWindowRgnâ<äLPMCI_INFO_PARMSá<ä InvalidateëOleCreateT<äERROR_DS_OBJ_CLASS_VIOLATIONáh<ä ICONINFOá|<äCERT_BLOBœ<äLPOLEMENUGROUPWIDTHSépsfâÄ<ä LPHELPINFOãà<äRPC_C_AUTHN_NONEáô<ä ObjectIdá=äCoIsHandlerConnectedá0=äReactivateAndUndoèCIP_NEED_REBOOTâh=äPROCESSOR_ARM820á€=äGetCharWidthWèXMLDOMDocumentEventsá¸=ä __msl_upperâÌ=äLONG32ãÜ=ä cBitsü=äCERT_RDN_OCTET_STRINGèURLTEMPLATE_HIGHá0>ä not_equal_toéSQL_C_BOOKMARKã`>äANSI_NULL€>ä_SID_AND_ATTRIBUTESâ¤>äEXIT_THREAD_DEBUG_EVENTâÔ>ä$ERROR_UNABLE_TO_INVENTORY_TRANSPORTâð>äEMRSETTEXTCOLORâ?ä IsRectEmptyâ,?äRpcServerUseProtseqEpExâ\?ä%__MIDL_itf_urlmon_0190_v0_0_c_ifspecé%__MIDL_itf_urlmon_0192_v0_0_s_ifspecá¨?äCreateNamedPipeWáÀ?ä PC_POLYGONãä?äBF_DIAGONAL_ENDTOPRIGHTâø?ärgValueâ@ä__IXMLError_FWD_DEFINED__T@ä,IXMLHttpRequest_getAllResponseHeaders_Proxyâx@ä??_7ICatalogFileInfo@@6B@èSQL_API_SQLFREECONNECTã°@äbasic_iosÌ@äGetCurrentTimeë WOM_DONEáô@äHWINSTA__Aä AnsiLowerèXLAT_SIDEDAäERROR_DS_ATT_IS_NOT_ON_OBJëfValueë NRC_NAMERRã„Aä __memrchrœAä cColorBitsã¬Aä edt13ÐAä IOleObject_Advise_Stubë XML_ERRORøAä !AnyPopupáBä !edt12$Bä!MIDL_user_freeë!!szOID_ENROLLMENT_NAME_VALUE_PAIRáhBä "GCLP_HCURSORá|Bä"AnsiToOemŒBä"edt11è"SequenceNumberãÄBä#tagCREATESTRUCTWáÔBä #edt10äBä#wVmaxáCä#CERT_REQUEST_V1â$Cä#szOID_CERT_POLICIES_95ãHCä#_CERT_CHAIN_POLICY_STATUS`Cä #STGTY_STREAMé #CF_APPLYáCä$DBAPI_TEXTITEMSâ¨Cä $VK_LBUTTONãÄCä$VerQueryValueAãÜCä$tagMIXERLINEAôCä$TIME_PERIODIC Dä$PCRYPT_KEY_VERIFY_MESSAGE_PARAãDDä$IID_IWindowForBindingUIê$SQLInstallDriverManagerWáŒDä%PEMRSCALEVIEWPORTEXTEXãœDä%edt16è%RpcNsGroupDeleteWäDä!&DNS_ERROR_ZONE_HAS_NO_SOA_RECORDâEä&GETEXTENTTABLEãEä&yDenomã$Eä&edt15è&PDRIVER_INFO_2AâXEä 'FLUSHOUTPUTâpEä 'ValidateRgnâ€Eä'edt14è'CFSTR_MIME_FRACTALSâ¼Eä(LANG_AFRIKAANSãàEä(SE_TAKE_OWNERSHIP_NAMEäFä(VFT2_FONT_TRUETYPEã0Fä#(CERT_CHAIN_USE_LOCAL_MACHINE_STOREãHFä(ResetPrinterAè(idldescâ€Fä)LOCALE_SMONTHOUSANDSEPã Fä)STORAGE_MEDIA_TYPEã¼Fä)LPENUMFORMATETCê)PIDSI_LASTPRINTEDôFä*?$__char@$0HP@ãGä*RPC_E_INVALID_STD_NAMEã4Gä*CAL_GREGORIAN_USáTGä*FormatStringOffsetë*__IEnumString_FWD_DEFINED__â˜Gä+CBT_CREATEWNDAë+OFN_SHAREWARNØGä,ERROR_INVALID_PRIMARY_GROUPâøGä,DISP_CHANGE_BADMODEâ Hä,HCONV__â4Hä,CERT_AUTHORITY_KEY_ID2_INFOê ,PolicyIdátHä-CryptInstallOIDFunctionAddressã”Hä-CreateAsyncBindCtxExé-SQLGetInstalledDriversWâÜHä.ERROR_NO_DATA_DETECTEDãôHä .VK_OEM_AUTOâIä.PWR_SUSPENDRESUME4Iä.mixerGetControlDetailsãPIä.RpcEpRegisterWãlIä.RPC_S_INVALID_ARGè.PORT_STATUS_WARMING_UPã¨Iä /PassByValueâÀIä /dmICMIntentâÜIä/MM_PC_JOYSTICKãôIä /JOYERR_PARMSé/SQLDOUBLE,Jä0PERF_INSTANCE_DEFINITIONá@Jä 0CRL_INFOé0PDRIVER_INFO_2Wâ€Jä1TAPE_DRIVE_LOAD_UNLOADã˜Jä 1iMenuWidthë1char_array_from_ndrâÐJä 2unexpectedãìJä2?$__char@$0PP@ãKä2tagMDINEXTMENUã(Kä2DFCS_CAPTIONRESTOREâDKä2VerQueryValueWã\Kä2tagMIXERLINEW„Kä2__IMallocSpy_FWD_DEFINED__ë2memoryãÄKä 3DNS_ERROR_RECORD_DOES_NOT_EXISTâàKä3RpcNsGroupDeleteA Lä!3ENCRYPTION_CERTIFICATE_HASH_LISTá4Lä3IBindCtx_SetBindOptions_Proxyè3OLERENDER_ASISãpLä4ERROR_INVALID_TIMEã”Lä4_CRYPT_HASH_MESSAGE_PARAé*4IXMLElementCollection_put_length_StubàLä5EMR_POLYLINE16ãüLä5tagCREATESTRUCTAá Mä5CBF_SKIP_CONNECT_CONFIRMS@Mä5IMalloc_Realloc_Stubá\Mä5OLECLOSE_NOSAVEê5__IDispatch_FWD_DEFINED__”Mä6__filesâÄMä#6VER_SUITE_SMALLBUSINESS_RESTRICTEDãäMä6fAnyOperationsAbortedNä 6CHANGER_DRIVE_CLEANING_REQUIREDâ,Nä6LPCLASSFACTORYãLNä6LPDATAADVISEHOLDERë6MDM_HDLCPPP_SPEED_DEFAULT„Nä7Createã¤Nä7PFNPROPSHEETCALLBACKé7fltValãÔNä8find_or_insertãðNä8WNCON_SLOWLINKã Oä8RpcEpRegisterAë8SIGNATURE_RESOURCE_NUMBERHOä 9VirtualAllocé"9IBindCtx_GetBindOptions_ProxyOä:ERROR_INVALID_INDEXê:ERROR_DIR_EFS_DISALLOWEDáÔOä;ERROR_TOO_MANY_SESSâìOä;OUT_TT_PRECISPä ;GCLP_HICONãPä ;NFR_ANSIé ;tagSTGMOVEãDPä<_MEMORYâdPä<SUBLANG_SERBIAN_LATINˆPä<ERROR_DISK_RESET_FAILEDâœPä<hwndToã°Pä <RPCRTAPIáÌPä<ALG_SID_RIPEMDë(<__IXMLDOMDocumentFragment_FWD_DEFINED__âQä =__min,Qä=CBT_CREATEWNDWã@Qä=DT_NOCLIPTQä=TransportlQä=SCardTransmitè6=IXMLDOMDocument_createProcessingInstruction_ProxyÀQä >CBR_115200ãàQä>MEDIA_WRITE_PROTECTEDøQä>ResetPrinterWè)>IOleInPlaceObject_ReactivateAndUndo_Stubá@Rä ?OBJECTIDáTRä?lpCommentpRä?RPC_STATS_VECTORé?__IPipeLong_FWD_DEFINED__¸Rä@ERROR_ENVVAR_NOT_FOUNDãÔRä@DRV_EXITSESSIONê@LPFNGETCLASSOBJECTãSäARGN_MINâ Sä AoffBmiMaskë AGetCPInfoExAáLSäBabDataã`SäBnMaxRdrâŒSä BIOleObject_SetColorScheme_Proxyâ¤Sä BPD_RETURNICê BOpenServiceAáÌSäCswapáøSäC_IMAGE_BOUND_IMPORT_DESCRIPTORãTäCGetDiskFreeSpaceExWâETO_RTLREADINGãhàä >_SHFILEINFOWá|àä >cMsgCertá”àä >PDOC_INFO_2Wé>LPROOTSTORAGEØàä?ERROR_DESTINATION_ELEMENT_FULLë ?EMRMASKBLTãáä!@CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTRá@áä@CHANGER_ELEMENT_STATUSãXáä@LPDOC_INFO_1Wè@tagOLELINKBINDãŒáäALMEM_MOVEABLE¤áä ADATA_E_LASTâÀáäADDE_FADVRESERVEDáÜáäADceErrorInqTextWáâä AIRpcProxyBuffer_Disconnect_StubêACreateTypeLib4âäBSS_LEFTêBCALG_AGREEDKEY_ANYã|âäCCOMADMIN_E_REGISTRARFAILEDãâä CSRCPAINTá¤âäCLPHMIDIâ¼âäCLPCODEINSTALLè CVarUI1FromI4áôâäDraw_storage_iteratorá ãä DGWL_EXSTYLEâ$ãä DCS_HREDRAWã<ãä DVarR4CmpR8ëDNI_OPENCANDIDATEá€ãäEDNS_ERROR_NEED_WINS_SERVERSâœãäE_CRYPT_BLOB_ARRAYè EVarUI1FromI2áÐãäFDISPLAY_DEVICEãðãäFRpcMgmtEpEltInqNextAáääFLPSHELLEXECUTEINFOWâ0ääFszOID_OIWSEC_desOFBâTääFCERT_TRUST_IS_SELF_SIGNEDlää F_DOC_INFO_2Wá„ää FtagCACLSIDë FVarUI1FromI1áÄääGPACCESS_ALLOWED_OBJECT_ACEëGBINDF_RESYNCHRONIZEâåä%HERROR_DS_STRING_SD_CONVERSION_FAILEDá0åäHSPI_GETANIMATIONáLåäHPP_SIGNATURE_PINádåä HPDOC_INFO_1Aáåä&H__ISupportErrorInfo_FWD_DEFINED__¸åäHIXMLDOMDocument_abort_Proxyâèåä*HIXMLDOMParseError_get_errorCode_ProxyæäHSQL_FD_FETCH_BOOKMARKèHSQL_CV_CREATE_VIEWãLæäIPAN_FAMILY_TEXT_DISPLAYâdæä IlpszOutputã€æäIMapVirtualKeyAë IszOID_PKCSã¬æä JFLOAT128áÀæä JVER_LESSáäæäJPRINTER_STATUS_POWER_SAVEèJSwitchãçäKhas_quiet_NaN8çä"KMIXERCONTROL_CONTROLTYPE_MUTEXçäKMCI_SEQ_SET_OFFSETëKBINDF_PRAGMA_NO_CACHE¬çä'LERROR_CLUSTER_INVALID_NETWORK_PROVIDERãÀçäLDCB_SETâÜçäLDialogBoxParamWâôçä LXST_ADVSENTâèäLFUNCFLAG_FIMMEDIATEBINDê LIWinInetHttpInfo_QueryInfo_Stubâtèä*MERROR_DS_MEMBERSHIP_EVALUATED_LOCALLYèäMEM_SETREADONLYëMRpcServerInqIfãÄèä NwDeviceTypeê NPCPS_URLSáéäOSCHED_S_TASK_NOT_SCHEDULEDãéäOMDICREATESTRUCTWá4éä O_HMAC_InfoãLéä OSetPrinterAêOPIDMSI_PROJECTãxéä Pminus éäPPRTL_CRITICAL_SECTION_DEBUGâ¸éä PLPOVERLAPPEDáäéä!PMIXERCONTROL_CONTROLTYPE_PERCENTáêäPRpcMgmtEpEltInqNextWá(êäPRpcNotificationTypeApcãHêäPLPSHELLEXECUTEINFOAâ`êä P_DOC_INFO_2Aáxêä PTestCancelëP??_7ISupportErrorInfo@@6B@ãÄêäQ?$__two_complement@_J$00éQSQL_SFKU_NO_ACTIONëRUILANGUAGE_ENUMPROCâëäSe32_level0ëä SDFC_BUTTONãHëä SLOCALE_S2359éScreateAttributeâ€ëäTVOS_OS232_PM32ã ëäTMCI_GETDEVCAPS_ITEMâÄëäTCERT_STORE_PROV_MEMORYãèëäTIMoniker_IsRunning_ProxyâìäTFreeSurrogateèTITypeComp_Bind_Proxyá4ìä UKEY_READáTìäUNORMAL_PRIORITY_CLASSèUwUminèVLPDOC_INFO_1A”ìä WUniquifierã¸ìäWIMAGE_SIZEOF_SHORT_NAMEâÜìäWERROR_ENCRYPTION_FAILEDâðìäWRGN_MAXâ íäWWM_ACTIVATEAPPã íäWBottomã8íä W__RPC_USERãTíäWDceErrorInqTextAáxíäWPFN_CMSG_IMPORT_MAIL_LISTœíäWIOleObject_Unadvise_Proxy°íäWullValë WcallconváØíäXENOERRãôíäXABN_POSCHANGEDã îä XALG_SID_SHA1éXSQL_PRED_SEARCHABLEâ<îä YEINTRTîä YENUM_E_LASTâpîäYMDICREATESTRUCTAá”îäYCertDeleteCRLFromStoreë YSetPrinterWâÈîäZDialogBoxParamAâàîäZOpenClipboardüîäZVP_CP_CMD_CHANGEáïäZPRINTER_CHANGE_FORMâ@ïäZIDropTarget_DragOver_Stubpïä%Z__MIDL_itf_urlmon_0195_v0_0_c_ifspecé%Z__MIDL_itf_urlmon_0197_v0_0_s_ifspecá¼ïä[BACKGROUND_BLUEê[URLZONE_UNTRUSTEDôïä\CONVERT10_E_FIRSTðä\tagEMRFILLPATHã(ðä\MMIO_FINDPROCTðä!\CERT_UNICODE_ATTR_ERR_INDEX_MASKáhðä\VT_BLOBê*\__MIDL_itf_propidl_0109_v0_0_s_ifspec´ðä]WM_SETTINGCHANGEáÈðä ]addChildé]VarDecSubøðä^META_SETBKMODEã ñä^lValueã$ñä ^PDOC_INFO_1WáLñä^ITypeInfo2_GetCustData_Stubê^SQLGetDescFieldâŒñä_ERROR_PRODUCT_UNINSTALLED¨ñä_DM_DISPLAYFLAGSâÄñä_MapVirtualKeyWë_HYPER_SIZEDARRãôñä`HMIXEROBJòä `PTIMEVALá(òä`szOID_LICENSE_SERVERáXòä$`CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OIDâ€òä`__IViewObject2_FWD_DEFINED__é `SQL_MAX_ROWSá¼òäaGetCharacterPlacementAëaAF_DECnetôòäbIMPORT_OBJECT_NAME_TYPEêbGetPrinterDriverDirectoryAãDóäcCO_E_INIT_MEMORY_ALLOCATORãdóäcMEM_E_INVALID_ROOTãŒóäcCRYPT_E_MISSING_PUBKEY_PARAâ óä chwndItemáÐóä%c__MIDL_itf_objidl_0081_v0_0_c_ifspecécVarUintFromSträôä dMAKEROP4áôädFW_EXTRALIGHT8ôädEMRGLSBOUNDEDRECORDâhôä$d_CMSG_CTRL_VERIFY_SIGNATURE_EX_PARAâˆôädCryptMsgCountersignâ°ôädSTUB_CALL_SERVER_NO_HRESULTâÄôä dSTDMETHODèdLPPERSISTMONIKERáõä2eJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION0õä eHintsHonoredáPõäe??_7ILockBytes@@6B@êe??_7IXMLDOMText@@6B@á˜õäftagEMRCREATEDIBPATTERNBRUSHPTè f_DOC_INFO_3WáÈõä gDMPAPER_NOTEáàõä gST_BLOCKEDãüõägCLEANER_CARTRIDGEè gLPDATAOBJECTá0öähhas_denorm_lossâLöähSUBLANG_SPANISHâpöähERROR_ACCOUNT_LOCKED_OUTáŒöähR2_MERGENOTPENëhLOCALE_SABBREVDAYNAME4ãÔöäiLOCALE_SABBREVDAYNAME5ãüöäiPRINTER_STATUS_MANUAL_FEEDë$i__MIDL_itf_msxml_0000_v0_0_s_ifspecâH÷äjSetMapperFlagsãd÷äjMF_RIGHTJUSTIFYêjLOCALE_SABBREVDAYNAME6ã¤÷äkwServicePackMinorÄ÷äkERROR_CTX_NO_OUTBUFâè÷äkLOCALE_SABBREVDAYNAME7ãøäkmidl_user_freeã,øäkICreateTypeInfo_LayOut_ProxyékGetContainingTypeLibá`øälTokenTypeˆøäl_RTL_CRITICAL_SECTION_DEBUGâœøälVTA_RIGHTÄøälNdrServerInitializeMarshallêlSQL_MAXIMUM_INDEX_SIZEãùäm__generic_iteratorãùämHWND__ã8ùämLBS_MULTICOLUMNâ\ùämLOCALE_SABBREVDAYNAME1ãpùä mVT_ARRAYáˆùämIXMLDocument2èm??_7ICreateTypeInfo2@@6B@¼ùänmoveáØùänGetCaretBlinkTimeüùänLOCALE_SABBREVDAYNAME2ã úän??_7ILayoutStorage@@6B@â8úä nISoftDistExténZAFLAGS_REQUIRE_VERIFICATIONátúä ohProcessá˜úäoLOCALE_SABBREVDAYNAME3ã´úäoVFT2_DRV_LANGUAGEè oCRYPT_Y_ONLYáðúäpIMAGE_FILE_MACHINE_R4000á ûäpbiClrImportantã$ûä pMCI_SET_OFFê p_DOC_INFO_3AáTûä qCTLCOLOR_MAXáxûäqLOCALE_IDEFAULTLANGUAGEâ˜ûäqPROV_EC_ECNRA_FULLã¸ûäqCoGetObjectContextëqSetTypeIdldescãøûärERROR_FUNCTION_NOT_CALLEDüärSubjectPublicKeyInfoé rIDataObject_EnumFormatEtc_ProxyâhüäsPIMAGE_IMPORT_DESCRIPTORáüäsFillConsoleOutputAttributeë*sICreateErrorInfo_SetDescription_ProxyàüätRESTRICTED_POINTERãøüä tEMRSETROP2ëtGetPrinterDriverDirectoryWã4ýäuis_empty1Lýä uMB_TYPEMASKê#uIBindCtx_RegisterObjectBound_Proxyãýävis_empty2¸ýä"vMCI_VD_GETDEVCAPS_NORMAL_RATEäýä!v__ISurrogate_INTERFACE_DEFINED__évODBC_VS_FLAG_RETCODEá þäwMARSHAL_S_LASTãDþäwGetCharacterPlacementWã\þä wpDriverPathêw__IXMLDOMText_FWD_DEFINED__â¤þäxSECURITY_NT_AUTHORITYÐþä xERROR_DEPENDENT_RESOURCE_EXISTSâøþäxMCIERR_MISSING_DEVICE_NAMEãÿäxdwInterfaceCountá4ÿäxtdDriverNameOffsetãLÿä xLPVIEWOBJECTáxÿä xIXMLDOMNode_get_parentNode_StubêxOFN_ENABLETEMPLATEHANDLEá´ÿä zGlobalUnlockáÔÿäzCRYPT_SEQUENCE_OF_ANYèzSQL_ATTR_DISCONNECT_BEHAVIORáä{ST_ISSELF,ä{PCERT_NAME_VALUEáLä{PRINTER_ENUM_LOCALãxä{AsyncIPipeByte_Begin_Pull_Stubë {widthœä |reservedáÌä$|ERROR_CTX_MODEM_RESPONSE_NO_CARRIERê|SysReAllocStringLenâä}has_extensionä}XTYP_MASK<ä}IOleObject_Close_ProxyãXä}GL_ID_CANNOTSAVEé}SQL_API_SQLSETSTMTOPTIONá”ä ~bFamilyTypeê~pMimeType¼äREG_QWORDÐäOBJ_PENâääRT_CURSORøä _WIN32_IEè GetPriorityâ(ä €WMSZ_BOTTOMâ@ä €SWP_NOZORDERá\ä€LPPROPERTYSTORAGEè€MDM_GEN_EXTENDEDINFOá”ä child1_ptrã°äAuthenticationIdáÌäLOGCOLORSPACEAëShell_NotifyIconWè‚StartDocPrinterAá$äƒEnumSystemCodePagesAáDäƒ_CTL_FIND_USAGE_PARAáTäƒV_I8éƒSQL_SDF_CURRENT_TIMESTAMP¤ä „ERROR_DS_ATTRIBUTE_OWNED_BY_SAMâÄä„PP_KEYSET_SEC_DESCRê „_userHGLOBALáìä…lopnáä…GDICOMMENT_MULTIFORMATSâ0ä…tagMCI_SAVE_PARMSAãLä…CryptDestroyKeyâtä…FILE_DEVICE_SERIAL_MOUSE_PORTè…SQL_FN_STR_RIGHTá´ä†ERROR_RESOURCE_NOT_FOUNDáÔä†CRYPT_IMPL_SOFTWAREê†IViewObject_RemoteDraw_Stubâä‡FACILITY_NT_BITâ,ä ‡ABCFLOATáPä‡SERVER_ACCESS_ADMINISTERé‡??_7IPersist@@6B@ŒäˆEnumDisplaySettingsWá´äˆFillConsoleOutputCharacterãÈäˆmixerOpenèäˆPMCI_SYSINFO_PARMSã äˆtagMCI_OVLY_SAVE_PARMSWêˆOleSetClipboardâ@ä ‰CHARSETINFOâTä‰rgBlobãpä‰WDT_INPROC_CALLâä‰DeletePrintProvidorWé‰V_I2áÀäŠotmptSubscriptSizeãØä ŠLB_SETLOCALEáðä ŠXTYP_MONITORáäŠMIXERCONTROL_CT_CLASS_CUSTOMá8äŠCMSG_CONTENT_PARAMãPä ŠLPPSHNOTIFYâ`äŠV_I1éŠ_IMM_SDK_DEFINED_¤ä"‹IMAGE_SEPARATE_DEBUG_MISMATCH¸ä‹wSecondâØä‹GlobalMemoryStatusë‹SQL_SC_NON_UNIQUEäŒPSECURITY_INFORMATION8äŒIMAGE_REL_MIPS_REFWORDNBádä!ŒERROR_CLUSTERLOG_EXCEEDS_MAXSIZEá€äŒLPMESSAGEFILTERê"ŒIOleAdviseHolder_Advise_ProxyÈäMakeSelfRelativeSDëVK_PROCESSKEYøä ŽGetFreeSpaceá ä ŽMAKELRESULTâ, äŽRESOURCEUSAGE_ALLX ä ŽCMSG_KEY_TRANS_PKCS_1_5_VERSIONêŽGL_ID_INPUTCODE⌠ä SubAuthorityá° äTotalTerminatedProcessesáÈ ä fOutxCtsFlowáÜ äCopySidâì älgplá äVFT2_DRV_INSTALLABLEá$ ä PlaySoundAãT ä*__IProgressNotify_INTERFACE_DEFINED__t äFUNCFLAG_FDISPLAYBIND„ äV_I4éSERVICE_FAILURE_ACTIONSWáÌ äIMAGE_FILE_MACHINE_R3000áÜ äS_OKáð äpunkValêOnCodeInstallProblemá$ ä‘vsscanfâH ä‘PEMRMODIFYWORLDTRANSFORMé‘NotBeforet ä’PURGE_RXCLEAR” ä’TYPE_E_REGISTRYACCESS¸ ä’MsgWaitForMultipleObjectsÌ ä ’dwCPTypeé’ShellExecuteExã ä“tagMCI_SAVE_PARMSWã$ ä“CryptSetProvParam8 ä“tagCLSCTXh ä$“__IEnumSTATDATA_INTERFACE_DEFINED__†ä“FindMediaTypeè “VarI4FromDecá¨ ä ”HDC__È ä”TYPE_E_DUPLICATEIDãÜ ä”MONO_FONTø ä”StartDocPrinterWá ä”IID_IEnumVARIANTá0 ä”PIDSI_COMMENTSë ”SQLFetchá` ä•LCS_GM_BUSINESSâx ä •InsertMenu㘠ä•EnumSystemCodePagesWáÄ ä&•IXMLDocument2_createElement_ProxyÜ ä •ReplaceTextê•IME_SMODE_CONVERSATIONãä–wcsspnpâ,ä –OffsetToDataáLä–ERROR_DEVICE_REMOVEDá`ä–SRCANDã|ä–BINDF_FWD_BACKë–MDM_GEN_AUTO_PROTOCOL_DATAãÀä—LOGCOLORSPACEWãØä—elpBrushStyleüä—PAN_XHEIGHT_CONSTANT_STDáä—EnumTaskWindowsâ4ä—Shell_NotifyIconAtä5—IInternetZoneManager_CopyTemplatePoliciesToZone_Stubé—SQL_DIAG_CURSOR_ROW_COUNT¼ä˜LOCALE_SABBREVMONTHNAME10Üä˜PFNPROCESSPOLICIESãä ˜CERT_TRUST_HAS_KEY_MATCH_ISSUERê˜VarDecFromBoolãDä™NumberOfRelocationsâlä™FindFirstChangeNotificationâˆä™IsBadStringPtrã¬ä™LOCALE_SABBREVMONTHNAME11Èä™BACKGROUND_REDãÜä ™PHSZPAIRáôä ™PlaySoundWãä™IXMLDocument2_get_root_Proxyé™SERVICE_FAILURE_ACTIONSAáTäšfHasSEHâxäšTAPE_DRIVE_EOT_WZ_SIZEã˜äšPROCESS_HEAP_ENTRYã°ä šWM_IME_KEYUPáÔäšLOCALE_SABBREVMONTHNAME12ìä špDriverNameâä%š__MIDL_itf_urlmon_0194_v0_0_s_ifspecé%š__MIDL_itf_urlmon_0196_v0_0_c_ifspecáhä›IsTokenRestricted˜ä$›CO_E_INIT_UNACCEPTED_USER_ALLOCATORâ¬ä›cbWidthâÐä›LOCALE_SABBREVMONTHNAME13øä›MIXERCONTROL_CT_UNITS_MASKãä›tagQUERYCONTEXTê›PreventMediaRemovalâ`ä!œIMAGE_NUMBEROF_DIRECTORY_ENTRIESátäœfXoffSent”äœSC_ACTION_RUN_COMMANDèœMDM_SET_EXTENDEDINFOáÌä GranularityâìäDISC_UPDATE_PROFILEêOFN_NOREADONLYRETURNá8ä žIMAGE_DIRECTORY_ENTRY_GLOBALPTRâXäžEnumDisplaySettingsAá|äžtagMCI_OVLY_SAVE_PARMSAê#žICreateTypeLib_SaveAllChanges_StubãÌäŸMCI_OVLY_WINDOW_HWNDáää ŸSIMPLEBLOBã äŸCRYPT_DECRYPT_MESSAGE_PARAã4äŸPRINTER_NOTIFY_FIELD_LOCATIONèŸDeletePrintProvidorAádä ?Cã|ä  KERNINGPAIRê ScrollConsoleScreenBufferWã´ä¡?Bë ¡WM_QUEUESYNCáää¢__UngetAwCharôä¢?Aã(ä(¢ERROR_CLUSTER_NODE_ALREADY_HAS_DFS_ROOTâDä¢FILE_DEVICE_TAPEé¢ZAFLAGS_NO_UItä£DEFAULT_PITCHä£VIF_CANNOTDELETEá ä£wZmaxè £VarI2FromDecé¤?GãØä¥?Fãôä¥WM_CTLCOLORMSGBOXä¥CRYPT_DECODE_PARAè¥reserved28ä ¦_geteuidáHä¦?Eã\ä ¦reserved1è¦IViewObject_GetAdvise_Proxyâ”ä§?Dã¨ä§reserved0Øä*§PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFOôä§_NDR_PIPE_DESCãä§PSH_USEHBMHEADERé$§IRunningObjectTable_GetObject_ProxyâXä ¨__lower_mapCálä¨VK_ATTNâ”ä¨MCIERR_UNRECOGNIZED_KEYWORDâ°ä¨CertFindRDNAttrâÔä¨IEnumUnknown_Clone_Stubê¨SQL_TXN_READ_COMMITTEDã ä©delimiter0ä©REG_WHOLE_HIVE_VOLATILEâPä©RPC_PROTSEQ_VECTORWâpä©CryptEnumOIDFunctioné©IID_IOInetSession¤ä ªMB_LEN_MAXãÔä$ªERROR_DS_UNAVAILABLE_CRIT_EXTENSIONâèä ªReserved5èªSQL_API_SQLFETCHáä«?Hã,ä «OffsetRectã\ä*«_CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO|ä«CertGetCRLFromStoreâä«Reserved4¼ä"«IWaitMultiple_AddSynchronize_Stubè «monthÜä¬?Oãüä¬ERROR_BAD_TOKEN_TYPEá$ä¬RPC_S_INVALID_STRING_BINDINGá8ä ¬dwStatusáLä¬Reserved3dä ¬VT_DECIMALãä&¬IBindCtx_RegisterObjectParam_Stub´ä¬IXMLHttpRequest_send_StubÐä¬PD_PRINTTOFILEë¬SQL_INSERT_STATEMENTâä­?Nãä­TAPE_DRIVE_SELECT0ä­Reserved2Lä­FLAGGED_BYTE_BLOBlä­SCARD_SCOPE_TERMINALá”ä­PropSheet_GetCurrentPageHwndé­OLEGETMONIKER_UNASSIGNãÈä®?MãÜä®Reserved1ôä®LPSTARTUPINFOè ®LPJOYINFOEXâ ä¯secondã@ä¯IMAGE_NT_HEADERS32ãTä¯XonLimãhä¯CBR_19200„ä¯NEWTEXTMETRICEXAá˜ä¯Reserved0Èä%¯ITypeInfo_LocalReleaseFuncDesc_Proxyé¯REGISTERWORDAðä°R_OKá ä°_IMAGE_OS2_HEADERè °DRAGINFOá0ä±?Rë±VOS_DOS_WINDOWS32`ä²AF_MAXã€ä²KP_KEYEXCHANGE_PINë+²IOleInPlaceActiveObject_ResizeBorder_ProxyãÈä³?Pãèä³MM_SNDBLST_WAVEOUTë%³__MIDL_itf_objidl_0000_v0_0_s_ifspecá,ä´dwXSizeâ\ä$´IInternetPriority_GetPriority_Proxyâ|ä´LPOINETTHREADSWITCHâœä´MDM_GET_EXTENDEDINFOé´wszArgãÈä µ_MSL_NULL_HâÜäµsscanfãôä µcbReserved2â äµERROR_LOG_FILE_FULLâ$ ä µwRmin< ä µSO_RCVTIMEOêµELEMENT_STATUS_INVERTt ä ¶free_bufferâ ä¶TrackPopupMenu㸠ä¶ScrollConsoleScreenBufferAãä ä ¶CertAddSerializedElementToStoreê'¶IMultiQI_QueryMultipleInterfaces_Proxyã0!ä ·WSAStartupë ·GetClassFileá`!ä ¸PEMRANGLEARCá|!ä¸WNNC_NET_LANMANâ˜!ä¸midiOutShortMsgâÐ!ä,¸ICreateTypeInfo2_DeleteVarDescByMemId_Proxyâ "ä0¸IInternetProtocolSinkStackable_SwitchSink_Proxyê¸_LPDATAFILTER_DEFINED<"ä¹?Zã\"ä¹ERROR_DUP_DOMAINNAMEáx"ä¹NEWTEXTMETRICEXWáˆ"ä¹hourá¤"ä¹PNDR_PIPE_DESCã¼"ä ¹FixedMediaãÜ"ä¹ReleaseBoundObjectsê¹REGISTERWORDW#äº?YëºSQL_WLONGVARCHARá<#ä»ERROR_BAD_NETPATHP#ä»CAL_KOREAp#ä»MCI_OVLY_OPEN_PARENTé »VarI1FromDecé,¼CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAGâØ#ä ½BF_TOPRIGHTê½MDM_MASK_V120_MLá$ä ¾__mem$ä ¾LONGLONGé¾cctype.win32.hãD$ä¿rootád$ä¿ERROR_PRINTER_DELETED„$ä¿PSINJECT_ENDPROLOGãœ$ä ¿xmit_successá¼$ä¿RPC_PROTSEQ_VECTORAê¿RpcSmFreeø$äÀJOB_OBJECT_LIMIT_RESERVED6ëÀStartDocPrinterâ$%ä ÁwYear<%ä ÁNPWNDCLASSAâ\%äÁArrangeIconicWindowsáp%ä ÁC1_SPACEáœ%ä!ÁITypeInfo_GetImplTypeFlags_ProxyéÁSID_SInternetSecurityManageráì%äÂJOB_OBJECT_LIMIT_RESERVED4ã&äÂtagDRAWITEMSTRUCTèÂMIXERLINE_TARGETTYPE_MIDIINâX&äÃJOB_OBJECT_LIMIT_RESERVED5ãx&äÃSystemTimeToFileTimeáŒ&äÃBI_RLE8â¬&äÃWM_NCLBUTTONDBLCLKã¼&ä ÃwYmaxÔ&äÃpvHashAuxInfoì&ä ÃMKSYS_NONEë(ÃICodeInstall_OnCodeInstallProblem_Proxyâ@'äÄ_COMPONENT_NAME_LENâh'äÄJOB_OBJECT_LIMIT_RESERVED2ã„'äÄPMCI_SAVE_PARMSAá¨'äÄPROTOCOL_ADDRESS_CHANGEâÈ'äÄCERT_REVOCATION_PARAáì'äÄCERT_NAME_STR_CRLF_FLAGâ(ä Ä_CY_DEFINEDê*Ä__IGlobalInterfaceTable_FWD_DEFINED__\(äÅJOB_OBJECT_LIMIT_RESERVED3ãt(ä ÅCTRY_ROMANIAáŒ(ä ÅUuidToStringá°(äÅCERT_CHAIN_ENGINE_CONFIGáÈ(ä ÅSCARDHANDLEêÅSQL_DIAG_DYNAMIC_UPDATE_CURSORã)äÆMF_ENDã()äÆLPREMOTE_NAME_INFOWâD)äÆDceErrorInqTextâl)äÆIOCTL_DISK_GET_DRIVE_LAYOUTêÆSafeArrayAllocDataã´)äÇJOB_OBJECT_LIMIT_RESERVED1ãÔ)äÇERROR_INVALID_DRIVEâø)äÇERROR_PROFILE_NOT_FOUNDâ*äÇFLOODFILLBORDERêÇUserFileWriteBytesã\*äÈIO_COMPLETION_MODIFY_STATEãt*ä ÈdwMaxRxQueueáŒ*ä ÈChooseFontWêÈSERVICE_CHANGE_CONFIGÈ*äÉERROR_CANTOPENãè*äÉMSSIPOTF_E_BADVERSIONè ÉbmBitsPixelâ+äÊSUBLANG_DEFAULTâ<+äÊ_FLOATING_SAVE_AREAâl+ä*ÊPIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY+äÊERROR_DS_MISSING_SUPREFâ¬+äÊMSGF_SCROLLBARëÊCRYPT_DELETEKEYSETãà+ä ËULONG_PTRá,äËEMRSTROKEANDFILLPATHá8,ä-ËICreateTypeInfo2_DeleteFuncDescByMemId_ProxyéËSQL_CA1_POS_UPDATEã€,ä"ÌERROR_DS_CANT_ADD_SYSTEM_ONLY˜,ä ÌEMR_FILLRGNê ÌPKCS_CTLáÔ,ä"ÍSECURITY_DESCRIPTOR_REVISION1è,ä ÍwsprintfAá-äÍEC_LEFTMARGIN -äÍRpcNsGroupMbrInqNextéÍSetSourceMonikerá`-äÎERROR_DS_KEY_NOT_UNIQUEâ€-äÎUP_FLAGGED_WORD_BLOBá˜-ä ÎuSTGMEDIUMë ÎSTDOLE_LCIDâÀ-ä ÏftellØ-äÏSE_DEBUG_NAMEì-äÏBI_RLE4â .äÏTRANSPORT_TYPE_LPCëÏCryptContextAddRefã<.äÐ?3ã\.äÐGCPCLASS_POSTBOUNDLTR|.äÐLPREMOTE_NAME_INFOAâ”.ä ÐNCBDGSENDBCêÐPCRYPT_VERIFY_MESSAGE_PARAãÌ.äÑ?2ëÑSERVICE_PAUSE_PENDINGü.äÒ?1ã/äÒPMCI_SAVE_PARMSWáD/äÒPCRYPT_RESOLVE_HCRYPTPROV_FUNCëÒ_midl_marsh_upãp/äÓ?0ãˆ/ä ÓFW_EXTRABOLDá˜/äÓs_lhá´/äÓX509_ANY_STRINGâØ/äÓCERT_STORE_PROV_FIND_INFOá0äÓIStorage_CreateStream_ProxyêÓ??_7IXMLDOMNamedNodeMap@@6B@áH0äÔWSA_QOS_EPOLICYOBJãl0äÔCS_E_ADMIN_LIMIT_EXCEEDED„0äÔVFT2_DRV_COMM¬0äÔCMSG_ENCODE_SORTED_CTL_FLAGâØ0ä"ÔTARGET_IS_NT351_OR_WIN95_OR_LATERèÔIXMLHttpRequest_open_Proxyã1äÕ?6ã(1ä ÕLIST_ENTRYëÕDRAGDROP_E_ALREADYREGISTEREDá`1äÖ?5ãŒ1äÖJOB_OBJECT_MSG_END_OF_JOB_TIMEã°1äÖIMAGE_REL_I386_ABSOLUTEâÔ1äÖI_RpcGetBufferWithObjecté#ÖODBC_ERROR_OUTPUT_STRING_TRUNCATEDã2ä×?4ã42ä×SE_RM_CONTROL_VALIDâ\2ä×SetSecurityDescriptorOwnerãt2ä ×NPWNDCLASSWâŒ2ä ×GCL_MENUNAMEá¸2ä×IAdviseSink_OnViewChange_Proxyãô2ä/×IBindStatusCallback_RemoteOnDataAvailable_Stubë ×SQL_CD_TRUEâ,3äØtagMCI_STATUS_PARMSâH3äØDISK_LOGGING_STOPh3äØIStorage_CopyTo_Stubáœ3ä*ØICreateTypeInfo2_SetImplTypeCustData_StubèØSQL_INTERVAL_HOUR_TO_MINUTEâØ3äÙVXATape_14ä Ù__ITypeLib2_INTERFACE_DEFINED__â,4äÙIID_IXMLDOMDocumentFragmentâL4äÙCLSID_StdURLMonikerêÙSQLTablesp4äÚ?9ã„4äÚVXATape_2´4ä%Ú__MIDL_itf_urlmon_0195_v0_0_s_ifspecáä4ä%Ú__MIDL_itf_urlmon_0197_v0_0_c_ifspecéÚSQL_SG_INSERT_TABLEâ5äÛ?8ã05äÛGETSETPRINTORIENTD5ä ÛwsprintfWèÛ__IAdviseSink_FWD_DEFINED__â„5ä ÜOpenThreadã¼5ä+ÜIDirectWriterLock_WaitForWriteAccess_Proxyãì5ä&Ü__MIDL_itf_propidl_0109_v0_0_c_ifspecá6ä ÜCF_TTONLYèÜSQLFreeConnectã06ä ÝwostreamáH6ä ÝMEVT_F_SHORTé+ÝCERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISEãœ6äÞSERVICE_DISABLEDá¸6äÞPEMRSETTEXTALIGNáà6ä"ÞI_RpcServerInqAddressChangeFnü6äÞBitmapReadBytesâ7ä ÞFUNC_STATICê ÞChooseFontAâX7äß__AsyncIPipeByte_FWD_DEFINED__ã€7äßIRecordInfo_RecordClear_ProxyèßSQL_CCS_CREATE_CHARACTER_SETáÐ7äàSYSER_NEEDED_PRODUCT_FLAGSãè7ä àerase_multiâ 8äàEMR_SCALEVIEWPORTEXTEXã 8äàLPIN_ADDRD8äàJOB_NOTIFY_FIELD_DEVMODEéàSetExtent8ä-áCRYPT_DECODE_NO_SIGNATURE_BYTE_REVERSAL_FLAGá¨8ä á_pszExpectedéáSQL_API_SQLDESCRIBEPARAMáÜ8ä â_wtoiø8äâSetDIBitsToDevice9äâUnmarshalInterfaceã89äâITypeLib_IsName_Proxyd9äâURLACTION_CHANNEL_SOFTDIST_MAXã|9ä âPD_RETURNDCâ9ä âcActionséâSQLDriverConnectáÈ9äãcaReferenceBlackáØ9äãwXmaxá:äãCALLTYPE_ASYNC_CALLPENDINGã0:ä%ã__MIDL_itf_objidl_0081_v0_0_s_ifspecéãImmGetContexth:ääLPLOAD_DLL_DEBUG_INFO€:ä äGetDataHereâ”:ä äHOLEMENUé ä_tagDATAINFOáÌ:äåERROR_NETWORK_BUSYëåGetSourceMonikerâ;äæDT_RASDISPLAY;äæsmpteè æCombineUrlã@;äçFailedCreatesèçSQL_DESC_LITERAL_PREFIXâ€;äèLANG_BULGARIANã˜;ä èExitThreadã¼;äèSPI_SETMOUSEBUTTONSWAPãØ;äèSPI_SETANIMATIONáì;äèwNotesã<äèCRYPT_DER_BLOBëèFeatures14<ä éPKSPIN_LOCKâL<ä éWAIT_FAILEDâl<äéLPNONCLIENTMETRICSã<äéSEE_MASK_NOCLOSEPROCESSâ¤<äéFeatures0À<äéLPPROPSHEETPAGEâð<ä$é__MIDL_itf_msxml_0000_v0_0_c_ifspecêéSQL_ROW_DELETEDâ0=äêPERSIST_E_SIZEINDEFINITEáH=ä êMETA_LINETOâx=ä$êCERT_ACCESS_STATE_SYSTEM_STORE_FLAGâ”=äêCreateErrorInfoêêSQL_API_SQLPUTDATAãÐ=äëWSAEDESTADDRREQâì=äëmciSendCommandã>ä*ëCRYPT_OID_IMPORT_PUBLIC_KEY_INFO_FUNCD>äëJOB_NOTIFY_FIELD_START_TIMEêëwmem.hã„>ä ì_IMAGE_RESOURCE_DIRECTORY_ENTRYâœ>ä ìSC_SEPARATORáÄ>äìCTL_FIND_NO_LIST_ID_CBDATAë ìDeletePortAâô>ä íbuffer_modeâ?äíMIIM_CHECKMARKSêíSPLREG_PORT_THREAD_PRIORITYâP?ä îIsReferenceâd?äîLPSIZELâŒ?äîIOCTL_DISK_SET_DRIVE_LAYOUTê$îITypeInfo2_GetAllFuncCustData_ProxyâÐ?äïrshiftãà?äïVOIDá@äïSUBLANG_MALAY_MALAYSIAã$@äïSEMAPHORE_ALL_ACCESSáD@äïFILE_ADD_SUBDIRECTORYl@äïFORMAT_MESSAGE_FROM_STRINGã€@ä ïCBM_INITé ïwTypeFlagsã¬@äðDBL_MAXâÄ@äðSET_POLY_MODEà@äðPS_INSIDEFRAMEãô@äðpintValêðSQL_SR_INSERT_TABLEâ,Aäñbasic_filebufTAäñRPC_C_PROFILE_MATCH_BY_MBRãpAäñPCHANGER_ELEMENTéñIOleObject_DoVerb_Stubã¨AäòCF_MAXãÀAä òCB_SETLOCALEáäAäòPPERF_COUNTER_DEFINITIONáBä!òCertResyncCertificateChainEngineá0BäòCLSID_PSClientSiteãPBäòOLEMENUGROUPWIDTHSã€Bä&ò__ICreateTypeInfo_INTERFACE_DEFINED__èòSYSKINDâ°BäóPFONTSIGNATUREãÈBäótimeKillEventìBäóCRYPT_RC2_128BIT_VERSIONáCäóCryptMsgCountersignEncodedë+óICreateTypeInfo2_SetImplTypeCustData_Proxyë ôMAKEWORDátCä õ_execvpeá”CäõAddressOfNameOrdinals°CäõVOS_DOS_WINDOWS16ÌCäõHGLOBAL_UserSizeéõVarDateFromIntäDä öBarCodeScanâDä öcbValueNameêöIXMLElement2_get_parent_StubáTDä÷HTZOOMãpDä÷LOCALE_ILANGUAGEáˆDä÷PROV_FORTEZZA¬Dä÷_CMSG_CMS_RECIPIENT_INFOáÀDä÷pllValë÷SQL_TIMEDATE_DIFF_INTERVALSãEä øbV4BlueMaskâEäøfDontCallFreeInstèøVarUintFromI2\EäùERROR_POTENTIAL_FILE_FOUNDãˆEäùSCHED_S_TASK_NO_VALID_TRIGGERSã¤EäùICM_QUERYMATCHãÄEäùGetNextDlgGroupItemê ùMid32ôEäúIMAGE_REL_PPC_TOCDEFNFäúMCI_ANIM_PLAY_SCANë úDeletePortWâTFäûURL_OID_CERTIFICATE_ISSUERãxFäû__IBindCtx_FWD_DEFINED__áFäûVarUintFromI1è ûV_UI8REFá¸Fä üVK_CRSELáÔFäüPDISK_PERFORMANCEüFäüBINDSTATUS_LOADINGMIMEHANDLERèüPIDDSI_LINKSDIRTY,GäýOBJ_PALâHGäýtagDEBUGHOOKINFOé ýSQL_NC_STARTátGäþpFileName˜GäþMCI_STATUS_CURRENT_TRACKá¼GäþCreateDataAdviseHolderãÜGäþIOleInPlaceUIWindowâôGä þLPVARIANTARGáHäþLPOINETâ HäþVarUintFromI4èþSQLSetDescFieldê(ÿIExternalConnection_AddConnection_Proxyâ€Hå @7404¸Hå*ERROR_DS_NAME_ERROR_NO_SYNTACTICAL_MAPPINGãÌHå nSizeLasté%IClassFactory_CreateInstance_StubIä generate_nã Iä @7405@IäERROR_SEM_OWNER_DIEDáTIäCharNextWxIäpPrivateKeyUsagePeriodã IäJOB_STATUS_USER_INTERVENTIONéput_ondataavailableâÐIä @7406øIä"ERROR_DS_MISSING_REQUIRED_ATTJä PEMRPOLYDRAWá,JäDCX_PARENTCLIPãLJäSPLDS_VERSION_NUMBERéIPersistMoniker_IsDirty_Stubá„Jä @7407¤JäSUBLANG_UZBEK_LATINâ´Jä_c_âÌJäMONHSZSTRUCTWè(IXMLDOMDocument_get_implementation_StubâKä @7400(Kä GetTextAlignáDKäTRANSPORT_TYPE_CNlKäFILE_DEVICE_DFS_FILE_SYSTEMê PARSE_DECODEá”Kä @7401¸KäIMAGE_SCN_ALIGN_128BYTESáÐKäFACILITY_SSPIèSCARD_ATTR_ESC_RESETâLä@7402è COMMPROPá$Lä @74034LänPosá\LäMAXIMUM_ATTR_STRING_LENGTHëSQL_HANDLE_DBCã˜LäCO_E_ACTIVATIONFAILED´LäPRIVATEKEYBLOBãàLäIRecordInfo_RecordDestroy_StubãøLäSQL_SSF_LOWERèSQL_FN_TD_SECONDá,Mä MAKESORTLCIDáHMä DCX_INTERSECTRGNá\Mä _COORDãpMä IP_TTLë SQL_CA2_MAX_ROWS_AFFECTS_ALLá´Mä IsDaylightSavingáÌMä mem_fun_refâàMä tagEMREOFðMä fIconNä WSASetBlockingHookã(Nä cProvParamãLNä TIME_VALID_OID_FLUSH_CRLádNä ChangerKeypadˆNä CLSID_CFormPropertyPageâ°Nä IErrorInfo_GetHelpFile_ProxyáØNä IPropertyStorage_Revert_Stubé SQL_ATTR_QUERY_TIMEOUTãOä BaudRateá,Oä PWIN32_FIND_DATAáPOä STG_LAYOUT_INTERLEAVEDã„Oä' __IOleCacheControl_INTERFACE_DEFINED__ã¤Oä GetSoftwareUpdateInfoè SQL_NULL_DATAÌOä @7408äOä fdwSupportãPä IOCTL_STORAGE_LOAD_MEDIA2è* IXMLDocument_get_fileUpdatedDate_StubHPä @7409`Pä DefDlgProcãxPä BitmapReadsâ˜Pä CreateStreamOnHGlobalè SQL_API_SQLBINDPARAMáÌPächooserâðPäERROR_DS_OBJ_NOT_FOUNDã QäGCL_CBCLSEXTRAã(QäODA_DRAWENTIREëNCBâPQä APIPRIVATEãtQäSTANDARD_RIGHTS_EXECUTEâQäSP_OUTOFMEMORYã¨Qä BF_TOPLEFTãÄQäTPM_BOTTOMALIGNâèQäIEnumOLEVERB_Skip_ProxyêODBC_ERROR_OUT_OF_MEMRä CmptNameáSID_AND_ATTRIBUTES_ARRAYáðiä>ERROR_IO_PENDINGájä >META_PATBLTâjä>lbColorê>BIND_MAYBOTHERUSERãXjä?DMPAPER_ENV_ITALYtjä?GCP_DISPLAYZWGãŒjä ?MIDIPROP_GETá¨jä?MCI_VD_PLAY_FASTé ?BindMonikerâÐjä @@7424äjä@lstrcatê@KEYEVENTF_KEYUPâkä A@7425$käADC_PAPERS@käAPAN_PROP_MODERNâ`käAImmAssociateContextêASQL_PROCEDURE_TERMãkäBNANâ kä B@7426ÄkäBPIMAGE_BASE_RELOCATIONãàkäBDMPAPER_QUARTOãükäBSWP_NOACTIVATEãlä BVS_FF_DEBUGêBCD_LBSELNOITEMSâ@lä C@7427TläCDimensionpläCDLGC_WANTCHARSãˆläCLPENUMSTATSTGèCSQL_MAX_TABLE_NAME_LENã¼lä D@7420ÜläDCERT_E_CN_NO_MATCHãôlä DMEVT_VERSIONámäD__IRootStorage_FWD_DEFINED__áDmäDICreateTypeInfo_LayOut_Stubâ\mäDcreateCommentèDSQLDATEâ€mä E@7421œmäEGetGraphicsModeâ´mä EIDataFilterâÔmäEITypeInfo_Invoke_StubèEATTR_CONVERTEDänä F@7422$näFERROR_NO_SYSTEM_RESOURCESLnäFSPAPI_E_REMOTE_COMM_FAILUREâtnäFCLSID_SynchronizeContainerë FLPELEMDESCãœnä G@7423¸näGERROR_OPEN_FILESáÜnäGSPI_SETDOUBLECLKHEIGHTãoä,GCRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAGâGetWindowLong(öä>MCI_DEVTYPE_ANIMATIONLöä>CryptRetrieveObjectByUrláxöä >ITypeInfo_AddressOfMember_Proxyê>IOInetBindInfoã´öä?CRYPT_E_DELETED_PREVé?MCI_WAVE_GETDEVCAPS_OUTPUTSâìöä@Fillá÷ä@SM_CYKANJIWINDOWé@IN_CLASSB<÷äAEMR_POLYPOLYLINE16ãP÷äAIN_CLASSC€÷ä#AITypeInfo2_GetAllFuncCustData_Stubãœ÷äAAfterTypeChangeâÄ÷äAIXMLDOMDocument_abort_StubëA_tagPROTOCOLDATAéBSQL_DRIVER_HSTMTá,øä$CJOB_OBJECT_MSG_ACTIVE_PROCESS_LIMITâDøä CCombineRgnã`øäCPMENUITEMTEMPLATEtøäCIN_CLASSAˆøäCARRAYDESC°øä"CIXMLDOMNodeList_get_item_Stubàøä&CIXMLHttpRequest_setRequestHeader_StubèCIID_IInternetProtocolRootùä DDMPAPER_9X11á8ùäDGetDlgItemTextWâPùäDDestroyCursor|ùäDRPC_C_LISTEN_MAX_CALLS_DEFAULTãœùäDCryptVerifySignatureAÈùä DszOID_NETSCAPE_CERT_RENEWAL_URLâðùäDPORT_STATUS_USER_INTERVENTIONèDSQL_ASYNC_ENABLE_OFFá(úä ELPSERIALKEYSá<úäENetbiosâXúäEszOID_DSALG_RSAâlúäEExtraInfoúäECERT_COMPARE_SUBJECT_CERT¨úä ETotalPagesëEVarUintFromDecãÜúä FTAPE_REWINDâûäFSPAPI_E_DEVINFO_DATA_LOCKEDêFMS_STRONG_PROV_Wá4ûäGfsetposâPûäGQS_MOUSEBUTTONãdûäGDSS_UNION„ûäGJOB_CONTROL_DELETEãœûä GGetTypeInfoêGPIDMSI_EDITORÈûäHHGLOBALâäûäHALG_TYPE_BLOCKãüûä HXLAT_SERVERâüä HExtentLengtháHüä'HIDirectWriterLock_HaveWriteAccess_StubëHSQL_MAXIMUM_DRIVER_CONNECTIONSã„üäIFileá¤üäIWSAEPROTONOSUPPORTëIpLocationÐüä JLPRIP_INFOãðüäJDMPAPER_FANFOLD_USãýä JGetKeyStateê JBINDF8ýäKERROR_ALREADY_WAITINGTýäKRpcMgmtInqStatsâpýäKpvExtraPolicyPara”ýäKINET_E_CONNECTION_TIMEOUTèKVarR4FromUintÌýäLRPC_X_INVALID_BUFFERáäýäLPSM_INDEXTOIDüýä LLPSAFEARRAYêLcbSizeVft8þäMMSSIPOTF_E_BAD_OFFSET_TABLEâ`þäMEMRCREATEDIBPATTERNBRUSHPTã€þäMCountClipboardFormats˜þäMHMETAFILEPICTè&M@class$7751clientEngine_dbg___pchøþä(NIThumbnailExtractor_OnFileUpdated_Proxyê NHDC_UserFreeéOEnumTimeFormatsWá@ÿäPfile_kind`ÿäPMinorSubsystemVersion„ÿäPIMAGE_SCN_MEM_DISCARDABLE˜ÿäPGCP_ERROR°ÿä PVK_NUMPAD7ãÌÿäPMS_STRONG_PROV_AáðÿäPUSER_MARSHAL_CB_SIGNATURE äPDeletePrinterKeyá( äPIPSFactoryBufferé+PIExternalConnection_ReleaseConnection_Stubã„ äQSTATUS_ACCESS_VIOLATION✠ä QPACCESS_MASKáÀ äQIsReparseTagHighLatencyâÜ äQWAIT_ABANDONEDãô ä QVK_NUMPAD6ã äQPERF_COUNTER_QUEUELEN, äQCacheClustersèQLPBINDPROTOCOLãh äRDISP_E_PARAMNOTFOUNDဠä RVK_NUMPAD5㜠äRGetDlgItemTextAâ´ ä RLPSCROLLINFOáÔ äRCryptVerifySignatureWè&RSQL_CT_CONSTRAINT_NAME_DEFINITION$ äSERROR_SETCOUNT_ON_BAD_LBá< ä SVK_NUMPAD4ëSEM_SETPASSWORDCHAR〠äTIMAGE_REL_IA64_SECREL22ê TVK_NUMPAD3ã° ä UVK_NUMPAD2ãÌ äUCRYPT_FLAG_TLS1âì äULPPRINTER_NOTIFY_INFOèULoadRegTypeLibã  ä VVK_NUMPAD1ã8 ä VSM_CXVSCROLLáP äVRPC_VAR_ENTRYp äVSetFuncHelpContextëVMDM_PROTOCOL_GPRS¤ ä WVK_NUMPAD0ã¼ ä WIAdviseSinkê&W??_7IInternetSecurityMgrSite@@6B@ äXpguidPrimaryProviderá äXpcyValëXVARFLAG_FREQUESTEDITáT ä Ye32_autodataá| äYCOMADMIN_E_DLLREGISTERSERVERá” ä YlfEscapementᬠä YDMBIN_LASTãÈ äYEnumTimeFormatsAéYLogFileWriteBytesô äZlpfná äZWNNC_NET_AS400ã  äZopená8 äZDeleteServiceT äZSQL_NULL_HANDLEê&ZSQL_AT_CONSTRAINT_NAME_DEFINITION ä [_X86_¬ ä[CLIPBRD_S_FIRSTâÄ ä [StretchBltë[iBaudRateð ä \MFENUMPROCã ä \StartParamã0 ä\PROTOCOLFLAG_NO_PICS_CHECKãP ä\SC_GROUP_IDENTIFIERâl ä\SQLGetTypeInfoë \SQL_AF_MIN㘠ä]hwndBreakÄ ä"]@class$7750clientEngine_dbg___pchè]IID_IXMLDOMEntityü ä^BinaryOperationâ ä^TAPE_LOGICAL_BLOCKã4 ä ^VK_NUMPAD9ãL ä ^SM_CYVSCROLLé^HELP_CONTEXTMENUဠä _VK_NUMPAD8㘠ä _ShowWindowë_VP_CP_CMD_ACTIVATEãÌ ä`hGlobalâà ä `OLECLOSEé*`__IPersistMoniker_INTERFACE_DEFINED__, äaTokenPrivilegesâP äaRPC_S_ENTRY_TYPE_MISMATCHh ä aARW_TOPRIGHTá„ äaCERT_KEY_CONTEXTá´ ä$aIPersistMoniker_GetCurMoniker_ProxyêatagCADATEÜ ä bVK_RMENUáø äbtagMCI_SEEK_PARMS$ ä!bCRYPT_OID_ENUM_SYSTEM_STORE_FUNCáL äbLPOPENCARD_SEARCH_CRITERIAAêbLPREGISTERWORD〠äcchoose_insertœ äcSetComputerNameâÈ äcGCPCLASS_LATINNUMERICSEPARATORãà ä cmmioRenameãô äcncb_numâ ä c_UUID_VECTORá0 äcI_RpcGetCurrentCallHandle` ä#cIXMLDOMNamedNodeMap_get_item_Proxyë cVarDecRoundâ  ädERROR_RESMON_ONLINE_FAILEDëdDefDriverProcÔ äeIP_MULTICAST_IFê etagSTYLEBUFWá ä*fSYNCFEST_ALLOW_ALERT_WITHOUT_ITEMLIST@ äfreturn_temporary_bufferâd äfSCARD_E_WRITE_TOO_MANYã„ äfLoadKeyboardLayoutWêfNPREGISTERWORDã´ ägidle_procÈ ägPPELARRAYä ägRPC_C_DONT_FAILâ ägSQL_CONCUR_TIMESTAMPégODBCGetTryWaitValueâP ähIMAGE_RESOURCE_DIRECTORY_ENTRYãx ä"hERROR_DS_STRONG_AUTH_REQUIRED ähMSGBOXPARAMSWèhSO_DISCDATALENãÐ äiASYNC_STGMEDIUM_UserFreeéiSSHORTã äj_userHMETAFILEPICTã8 ä.jIXMLDSOControl_get_JavaDSOCompatible_Stubl ä(jIInternetSession_RegisterNameSpace_StubêjLPOINETPROTOCOLSINK⤠ä kclose_procãÄ äkCreateEnhMetaFileWãÜ ä kPolyTextOutWâ äkRegisterClipboardFormatâ ä kIDC_SIZENWSEá4 äkCommonPrefixWithé*kIXMLDOMElement_getAttributeNode_Proxy„ älIMAGE_SECTION_HEADERᬠälERROR_INVALID_PRINT_MONITORâÀ äl_CTL_INFOØ ä lPagesPrintedélSQLTIMEâ äm_EXCEPTION_RECORD  ämDECLSPEC_UUID8 ä mMAKEFOURCCãT ämpVoidResolveFuncဠä"m@class$7753clientEngine_dbg___pchèmIErrorLog_AddError_Stubâ¼ ä nFIRMWARE_PTRáØ änAllocationBaseãì änUnicodeâ  änCRYPT_E_ASN1_CHOICEâ( änLPWINDOWPLACEMENTè#n_CERT_POLICY_QUALIFIER_USER_NOTICEë otagPELARRAYâ” äpKEY_ENUMERATE_SUB_KEYS㬠ä pLMEM_FIXEDãÌ äpLoadKeyboardLayoutAâì äpwaveOutGetErrorTextâ$ ä2pCERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG< ä pVarCyFromI1êptagDATE_STRUCTãt äqWNNC_NET_9TILES⬠ä.qAsyncIAdviseSink2_Begin_OnLinkSrcChange_Proxyèq??_7IInternetProtocolInfo@@6B@ãü är?$__two_complement@D$00â ärSUBLANG_URDU_PAKISTAN< ärFILE_VOLUME_QUOTASã\ ärDMLERR_SERVER_DIEDãl ärfIVâ” ärCERT_TRUST_IS_UNTRUSTED_ROOTᬠä rINVOKEKINDãÐ ärImmSetConversionStatusãð ärGCL_REVERSECONVERSIONèrIME_CMODE_SYMBOLá4 äsITypeInfo_GetTypeComp_ProxyâX äs??_7IAuthenticate@@6B@ãp ä sVarCyFromI2ê stagSTYLEBUFAᬠätIMAGE_REL_IA64_SECREL32âÐ ät_IMAGE_IMPORT_DESCRIPTORáø ätLPOPENCARD_SEARCH_CRITERIAWâ ätCLIPFORMAT_UserFreeâ( ätSF_I8è ttypekindá\ äuLOCALE_USER_DEFAULTâp ä uPSERVENTé uVarCyFromI4â´ ä!vTIME_VALID_OID_GET_CRL_FROM_CERTáÌ ä vget_entitiesévSQL_DELETE_BY_BOOKMARKã äwERROR_DS_INSUFF_ACCESS_RIGHTSèwWSAAsyncGetProtoByNumberá\ äxANON_OBJECT_HEADERã| äxSPI_GETSCREENREADERâ” äxgetservbyname´ äxPCRYPT_KEY_PROV_INFOáÐ äxLPOLECONTAINERãà ä xSF_I4ð äx_idêxSQL_FN_NUM_MODã  äy_PC_64ã4 äy__lbitsâ\ äy_CMSG_KEY_AGREE_ENCRYPT_INFOéyPRINTER_NOTIFY_FIELD_SEPFILEᜠä z__move_mem㸠äzPEMRSETCOLORSPACEÐ ä zHeapMinimizeézIXMLDOMParseError_get_url_Stubã ä {cbPrologá$ ä{HDESK__âH ä{CertDuplicateCRLContextê{SafeArrayGetElemsizeሠä|MKF_REPLACENUMBERSã° ä|JOB_NOTIFY_FIELD_TOTAL_BYTESé|SQL_DESC_TABLE_NAMEâð ä}IMAGE_REL_I386_REL32á ä }BS_SOLIDá$ ä}CreateEnhMetaFileAã< ä }PolyTextOutAá\ ä}WN_NOT_INITIALIZING∠ä"}@class$7752clientEngine_dbg___pchè }SF_I1° ä~MSGBOXPARAMSAä ä*~IThumbnailExtractor_ExtractThumbnail_Stubè~SF_I2èMCI_ANIM_STATUS_FORWARDâ4 ä€_MSL_LOCALE_CUTF8P ä€WS_EX_CLIENTEDGEáh ä€pi_R3_allvals€ ä €__RPC_STUB㬠ä"€ICreateErrorInfo_SetHelpFile_Stubè€SQL_COLUMN_MONEYáä äDISP_E_OVERFLOWâ  ä"PRINTER_NOTIFY_FIELD_PRIORITY8 ä!AsyncIPipeDouble_Begin_Push_Stubé$IOleAdviseHolder_SendOnRename_Proxy⌠ä‚GetSecurityDescriptorSacl° ä‚TYPEFLAG_FOLEAUTOMATIONê‚lpDependenciesë ƒpMemoryListâ ä„SYSYNC_VERSION_MINORá ä „WM_MENUCHARâ, ä„_PSPáH ä„CDM_GETFOLDERPATHè„SQL_API_SQLGETENVATTR„ ä…PagedPoolLimit㬠ä"…ERROR_RESOURCE_DATA_NOT_FOUNDÀ ä…WM_SIZINGô ä(…__IOleItemContainer_INTERFACE_DEFINED__â  ä …VarI2FromStré…SQLConfigDriverWáL ä†TAPE_DRIVE_WRITE_SETMARKSl ä†ERROR_DS_NO_CHAININGé†RegisterServiceCtrlHandlerW⤠ä‡fNCâÄ ä‡LPPROPSHEETHEADERAë‡LPOLEINPLACEOBJECTãô äˆexitá äˆCreateCompatibleBitmapã, ä ˆPaintRgná< äˆBindéˆSQL_MAX_CATALOG_NAME_LENáp ä‰_asmáˆ ä ‰ENUM_E_FIRSTá  ä ‰NPDEVMODEWãÈ ä‰szOID_LOCAL_MACHINE_KEYSETë‰SQL_ATTR_PARAM_BIND_OFFSET_PTRã  äŠSCHED_E_ACCOUNT_NAME_NOT_FOUNDãL ä"ŠMultinetGetConnectionPerformanceAèŠ_VTableProvStrucá ä"‹??_Gout_of_range@std@@UAE@I@Z° ä‹THREAD_IMPERSONATEãÄ ä‹IE_OPENâØ ä‹PF_BANãø ä‹CERT_DSS_PARAMETERSâ  ä‹CDN_FIRST, ä‹IME_ESC_SYNC_HOTKEYê‹SQL_MAXIMUM_CURSOR_NAME_LENGTHãl äŒDC_BINS⌠äŒRPC_S_CALL_FAILED_DNEèŒGetBindResultÈ ä?$__red_black_tree@$00ãä äMM_MPU401_MIDIINâ äRPC_ASYNC_EVENTâ äMIDL_STUB_DESCã< äIsContainerPartitionád äIEnumSTATPROPSTG_Next_ProxyêSQL_STRING_FUNCTIONSá˜ ä ŽMAXUIDLENè&ŽSQL_SQL92_FOREIGN_KEY_DELETE_RULEè äERROR_DS_DRA_ABANDON_SYNCá! ä LPDEVMODEAã! ä MWMO_WAITALLá@! äPCRYPT_ATTRIBUTE_TYPE_VALUEâd! äELEMENT_STATUS_NOT_BUSëReleaseFuncDescâœ! äDISP_E_BADINDEXâ´! ä EC_ENABLEALLáØ! äIEnumMoniker_Next_StubëRegisterServiceCtrlHandlerAâ" ä ‘SO_BROADCASTé‘LPPROPSHEETHEADERWã\" ä’?$__two_complement@C$00â€" ä’OSS_PER_DLL_NOT_LINKEDë’SCARD_E_CANCELLEDÀ" ä“ERROR_MAX_THRDS_REACHEDâÜ" ä“DESKTOPENUMPROCâô" ä “ALG_TYPE_DHâ# ä“PRINTER_ATTRIBUTE_DEFAULT0# ä “AddVarDescë“VarI4FromUint\# ä”DWORD_PTR|# ä”DESKTOP_CREATEMENUë”wOutputâ¤# ä•_STRINGâÄ# ä•IMAGE_ORDINAL_FLAGãÜ# ä•PEMRRESTOREDCè•PRINTACTION_OPENá$ ä–PCRYPT_UINT_BLOBáD$ ä#–IBindCtx_ReleaseBoundObjects_Proxyë–??_7IXMLDSOControl@@6B@âˆ$ ä—IMAGE_REL_PPC_SECTION´$ ä —DNS_ERROR_RCODE_NOT_IMPLEMENTEDâÐ$ ä—GLYPHMETRICSFLOATì$ ä—MCI_STATUS_ITEMâ % ä—CLSID_HttpSProtocolê—SafeArrayUnlockâH% ä˜CRYPT_E_ASN1_BADARGSáh% ä˜PERF_NUMBER_DECIMALâŒ% ä˜szOID_BASIC_CONSTRAINTS2á´% ä˜__AsyncIMultiQI_FWD_DEFINED__è˜IID_IOleCache2ãä% ä™EEXISTã& ä™META_SELECTCLIPREGION& ä ™LPDEVMODEWë!™__IXMLDOMAttribute_FWD_DEFINED__áh& äšIMAGE_SCN_TYPE_NO_PAD& äšSTREAM_CONTAINS_PROPERTIESã¬& äšPCOPYDATASTRUCTêšSQL_SR_UPDATE_TABLEâà& ä›stringãô& ä ›VERTSIZEé ›itemDataá(' äœLvaToFirstLinenumberáT' ä&œMultinetGetConnectionPerformanceW|' äœCERT_STORE_PROV_SMART_CARDë$œ__IPropertySetStorage_FWD_DEFINED__âÀ' ä iHorzGapé VarI1FromStráô' äž__ANSI_OVERLOAD__( äžMCIERR_SEQ_NOMIDIPRESENTá8( äžNdrSH_StringMarshalláP( ä žSQL_ROLLBACKéžSQL_SSF_TRIM_TRAILING( äŸSYSYNC_VERSION_UINT32¤( äŸfildesãÄ( äŸ__unary_true_valueãè( äŸERROR_DS_NOT_SUPPORTEDã ) äŸMETA_CREATEPATTERNBRUSHâ$) ä ŸNPDEVMODEAã@) äŸILLUMINANT_D75ãX) ä ŸjoyGetPosExê Ÿ_CERT_X942_DH_VALIDATION_PARAMSâ˜) ä EMFILEã´) ä SE_GROUP_RESOURCEÔ) ä IMAGE_SYM_TYPE_INTãì) ä  NOTSRCCOPYë  SQLHDESCá* ä¡dmCollate0* ä¡BDR_RAISEDOUTERê¡PSM_SETHEADERSUBTITLEWãh* ä¢buf_begâ€* ä ¢ObjectTypeã¨* ä¢TRUST_E_SUBJECT_NOT_TRUSTEDâÄ* ä¢PAN_CULTURE_LATINì* ä¢MCIERR_SEQ_PORT_NONEXISTENTâ+ ä$¢ITypeInfo_LocalReleaseFuncDesc_Stubê¢SQL_AT_SET_COLUMN_DEFAULTd+ ä£ERROR_CONNECTION_REFUSEDá„+ ä£ERROR_PAGEFILE_QUOTAá˜+ ä £iArrangeá¸+ ä£SCARD_ATTR_CURRENT_WáÐ+ ä £tagPROPSPECê£SQL_GET_BOOKMARKá, ä¤IDataObject_DUnadvise_Stubã,, ä ¤PUAF_TRUSTEDé ¤LPPRINTDLGAâd, ä¥DBG_TERMINATE_PROCESSx, ä ¥WinHelpAáŒ, ä ¥StubInfoá¨, ä¥pszRegisteredIDâ¼, ä¥IsDirtyê¥SQL_DIAG_CREATE_INDEXð, ä¦PUINT64â- ä¦ERROR_WMI_INSTANCE_NOT_FOUNDá<- ä¦TYPE_E_ELEMENTNOTFOUNDë¦CRYPT_MODE_CTSãt- ä§_exception_infoâ˜- ä§CERT_STORE_PROV_SYSTEMã°- ä §MIDL_memsetê§tagODBC_VS_ARGSâä- ä¨lHeightOffset. ä¨UnhookWindowsHookExê¨_MODEMDEVCAPS0. ä©USHORTãH. ä ©GetCursorPosá`. ä ©MAXPNAMELENâx. ä ©F3_2Pt88_512é©INET_E_DATA_NOT_AVAILABLEÀ. äªCONFIGURABLE_TYPE_SUPPORTì. ä!ªIMAGE_COMDAT_SELECT_NODUPLICATESá/ äªSCARD_E_NOT_TRANSACTEDëªLCID_SUPPORTEDãP/ ä«SUBLANG_SPANISH_ARGENTINAh/ ä «PMETARECORDâ„/ ä«PEMRSETMITERLIMIT¤/ ä«_FORMAT_PARAMETERSãØ/ ä(«??_7IInternetProtocolSinkStackable@@6B@ê«SQLInstallTranslatorW 0 ä¬SECURITY_CREATOR_GROUP_RIDë(¬ITypeInfo2_RemoteGetDocumentation2_Stubê­SafeArrayGetVartypeâ”0 ä®IMAGE_REL_ARM_GPREL12è®PCERT_ISSUER_SERIAL_NUMBERãÐ0 ä¯mallocãä0 ä¯mbtowcä1 ä¯HELP_SETPOPUP_POS 1 ä¯RPC_C_MQ_JOURNAL_NONE<1 ä¯PIDSI_CREATE_DTMé¯ConfigTranslatorá€1 ä°IMAGE_SCN_NO_DEFER_SPEC_EXCâ 1 ä°DISP_E_UNKNOWNLCIDã´1 ä°peFlagsâà1 ä°szOID_ORGANIZATIONAL_UNIT_NAMEä2 ä°SCARD_ATTR_CURRENT_Dé°SQL_SG_UPDATE_TABLEâH2 ä±_WIN32_FILE_ATTRIBUTE_DATAãd2 ä±CertFindExtensionè±SafeArrayGetDimâœ2 ä²GCPCLASS_ARABICâ°2 ä ²BSM_VXDSáÐ2 ä²RpcNsEntryExpandNameáð2 ä²szOID_POST_OFFICE_BOX3 ä²CertUnregisterPhysicalStoreâ83 ä²SCARD_ATTR_CURRENT_Fé ²LPPRINTDLGWâd3 ä ³WinHelpWá„3 ä³RpcServerRegisterIfê³_CRYPT_ATTRIBUTE_TYPE_VALUEâØ3 ä ´ERROR_INSTALL_TRANSFORM_FAILUREâð3 ä ´DEVICEDATAã4 ä´CF_GDIOBJLAST 4 ä ´BS_CHECKBOXâ44 ä´OLECHARâT4 ä´??_7IContinue@@6B@ãh4 ä ´OFNOTIFYé ´SQL_IC_UPPERá˜4 ä µMB_CUR_MAXã´4 äµWS_EX_STATICEDGEáÌ4 ä µNLS_DBCSCHARáø4 ä&µPCRYPT_ENROLLMENT_NAME_VALUE_PAIR5 äµNdrComplexArrayUnmarshallè µVarI4FromStré¶URLACTION_HTML_MINã|5 ä·_EVENTLOG_FULL_INFORMATIONã”5 ä ·WSAEPROCLIMâ¬5 ä·MSG_DONTROUTEÐ5 ä·PSM_SETHEADERSUBTITLEAë·IDataObject_DAdvise_Stubá 6 ä ¸_MSL_BUFSIZâ46 ä¸ERROR_DS_CANT_ADD_ATT_VALUESáL6 ä ¸DetailLevelê¸SCARD_CLASS_PERFá 6 ä,¹ITimeAndNoticeControl_SuppressChanges_Proxyê¹BSCF_DATAFULLYAVAILABLEâä6 äºIMAGE_SCN_LNK_REMOVEáô6 äºHPENá7 ä ºnErrCodeá(7 äºPSINJECT_ENDSTREAMãH7 äºPEMRSETSTRETCHBLTMODEl7 äºLOCALE_IFIRSTDAYOFWEEKãŒ7 äºJOY_RETURNCENTEREDã¸7 ä&º_CRYPT_ENROLLMENT_NAME_VALUE_PAIRÜ7 äºFILE_DEVICE_BUS_EXTENDERéºSCARD_ATTR_CURRENT_Ná8 ä»INCREFã88 ä»ERROR_RESOURCE_NOT_AVAILABLEá\8 ä»ERROR_DS_CANT_ADD_TO_GCâ|8 ä»CS_E_OBJECT_NOTFOUNDáœ8 ä»PSINJECT_PAGETRAILERé »PathToRegionáÐ8 ä¼NCCALCSIZE_PARAMSä8 ä ¼GetCPInfoá9 ä¼PubKeyAlgorithmê¼SQL_CU_DML_STATEMENTS49 ä½ENOEXECâT9 ä½IMAGE_REL_PPC_REFHIâp9 ä½OSVERSIONINFOEXâ”9 ä½ERROR_JOURNAL_HOOK_SETã¨9 ä ½max_ncbsáÄ9 ä½PERF_TYPE_COUNTERà9 ä½IPPORT_DAYTIMEë½DefaultPriorityâ : ä¾szOID_OIWSEC_keyHashSealá<: ä¾szOID_OIWDIR_CRPTh: ä"¾__IDataFilter_INTERFACE_DEFINED__è¾SQL_COLLATION_SEQœ: ä¿_MSL_STRING_H¸: ä¿DMDITHER_LINEARTáÔ: ä¿ILLUMINANT_D65ë#¿PRINTER_NOTIFY_FIELD_PAGES_PRINTEDã; äÀSleepExâ0; äÀMIM_LONGERRORèÀCF_FIXEDPITCHONLYt; ä"ÁJOB_OBJECT_POST_AT_END_OF_JOBˆ; äÁSUCCEEDEDœ; äÁdmSizeã¸; äÁPBT_APMSUSPENDãÌ; ä ÁxHotSpotáì; äÁLPMCI_ANIM_PLAY_PARMS < äÁpvExtraPolicyStatusâ < äÁcOffsetêÁScrollãP< äÂKLF_SETFORPROCESSh< ä ÂSTN_DISABLEâ€< ä ÂNCBADDNAMEã¨< äÂRPC_C_CANCEL_INFINITE_TIMEOUTè ÂSQL_C_INTERVAL_MINUTE_TO_SECONDâä< äÃ_m_ã= äÃMapVirtualKeyExâ = äÃMCI_SYSINFO_PARMSAãD= äÃSERIAL_IOC_FCR_XMIT_RESETd= äÃREGISTERWORDENUMPROCéÃSQL_CONVERT_BINARYã˜= äÄlstrcmpâ°= ä ÄCloseDriverâà= ä#ÄIPropertyStorage_ReadMultiple_Stubãü= äÄOleLoadFromStream> äÄMDM_PROTOCOL_X75_BTXéÄSQL_DESC_BASE_TABLE_NAMEáh> äÅTAPE_DRIVE_FORMAT_IMMEDIATEâ> äÅFillConsoleOutputCharacterWâÄ> ä)ÅCRYPT_OID_UNREGISTER_PHYSICAL_STORE_FUNCé ÅIXMLDOMNode_get_lastChild_Proxyâ? äÇTAPE_DRIVE_TAPE_REMAINING4? äÇEMR_SETMAPPERFLAGSãl? ä-ÇCERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICYá”? äÇIOCTL_STORAGE_GET_MEDIA_TYPESèÇSQLWriteFileDSNWáÈ? ä ÈCTLCOLOR_BTNáè? äÈPRPC_CLIENT_INTERFACE@ äÈSERVICE_USER_DEFINED_CONTROLéÈSQL_API_SQLCOLUMNSãL@ äÉCRYPT_E_BAD_LENâh@ äÉGetSysModalWindow|@ ä ÉyHotSpotá”@ ä É_LZEXPAND_ëÉPHILIPS_12_WOÈ@ äÊMETA_SETTEXTALIGNä@ äÊSystemNameOffsetá A äÊUSER_MARSHAL_CB_UNMARSHALLëÊChangeServiceConfig2WHA äËPAGE_EXECUTE_READhA äËPRTL_RESOURCE_DEBUGâ”A äËERROR_CLUSTER_JOIN_IN_PROGRESSã¨A äËDECIMALêËGL_ID_PRIVATE_FIRSTâøA ä#ÌJOB_OBJECT_UILIMIT_DISPLAYSETTINGSã B äÌCRYPT_PASSWORD_CREDENTIALSAâPAN_STRAIGHT_ARMS_HORZã ä>RT_ICONâ0 ä>SetClassLongAL ä>GetThreadLocaleê>CHANGER_POSITION_TO_ELEMENTâ„ ä?_sc☠ä ?DOCINFOAḠä?CertRDNValueToStrAãø ä3?IOleInPlaceActiveObject_OnFrameWindowActivate_Stubë ?ITypeLib_GetDocumentation_Proxyâ@€ ä@SUBLANG_FRENCHãT€ ä@GetAceãp€ ä@LPMENUITEMINFOA⌀ ä@waveOutMessage㤀 ä @pAlgorithmãЀ ä@SPLDS_PRINT_STAPLING_SUPPORTEDä ä%@__IOleClientSite_INTERFACE_DEFINED__é@IXMLElement_removeChild_StubáH äA_MSL_DEFAULT_LOCALEâ\ äAXST_INIT2x äALPDRIVER_INFO_5Aé ASQL_SO_MIXEDᤠä BgenerateáÌ äBPSECURITY_DESCRIPTOR_CONTROLáä ä Be32_fixupsumáø äBHRGN__ã‚ äBGetCommandLineã<‚ äBSetConsoleActiveScreenBufferáP‚ äBXST_INIT1h‚ ä Bwavehdr_tag∂ äBszOID_OIWSEC_dsaComméBOnCloseâ´‚ ä C__ctype_mapCáØ‚ äCszOID_PKIX_KP_CLIENT_AUTHø‚ äCLPOPENCARDNAMEW_EXã(ƒ ä#C__ITypeMarshal_INTERFACE_DEFINED__ë CSQLUSMALLINTálƒ ä DFRS_ERR_SYSVOL_POPULATE_TIMEOUT⌃ äDSEC_E_NOT_SUPPORTED⤃ ä DDMTT_SUBDEVâÀƒ äDPMSGBOXPARAMSAëD_SET_PARTITION_INFORMATIONä„ ä EReadConsoleAéECMSG_BARE_CONTENT_PARAMâ8„ äFnothrow_tL„ ä FLB_SETSELè FPromptActionáx„ äGP_OVERLAYˆ„ äGHGLRCè GGGO_METRICS⼄ äHSE_SELF_RELATIVEáì„ ä#HDISPLAY_DEVICE_ATTACHED_TO_DESKTOPã… äH_PRINTPROCESSOR_INFO_1AêHIID_IEnumGenericáX… äIERROR_CTX_MODEM_RESPONSE_VOICEãx… äINdrFullPointerFreeã… ä IpNotifyNameê ISOFTDISTINFOáÌ… äJ?$__two_complement@_K$0A@èJERROR_SERVICE_NEVER_STARTEDâ † äKVirtualFreeEx(† äKDMBIN_ENVMANUALâD† äKPIDMSI_STATUS_NEWèKSQL_CA2_SIMULATE_NON_UNIQUE⌆ äL__throws_bad_alloc㨆 äLTIME_NOSECONDSãÔ† ä"LIMallocSpy_PostHeapMinimize_ProxyèLSQLSetConfigModeᇠäMtagMCI_ANIM_OPEN_PARMSWê MConfigDriveráH‡ äNIsBadHugeWritePtrt‡ äNDNS_ERROR_NODE_CREATION_FAILED㌇ äNCREATESTRUCTAè N__ICreateTypeInfo_FWD_DEFINED__ê OCRLIssuerèPpaXExtäˆ äQ_MSL_BEGIN_EXTERN_Câ ˆ äQ__LPGUID_DEFINED__ã<ˆ äQReuseDDElParamëQCERT_CREATE_CONTEXT_PARAáxˆ ä RfFixedDisk㔈 äRPMSGBOXPARAMSW㨈 äRMCI_TOãĈ äRJOB_CONTROL_PAUSEèRSQL_FN_TD_YEARë SReadConsoleWá(‰ ä$T__IHttpSecurity_INTERFACE_DEFINED__êTCreateStdProgressIndicatorãl‰ äUSET_MIRROR_MODE⌉ äUMCI_DEVTYPE_CD_AUDIOéUSQL_SQL_CONFORMANCEâĉ ä VEWX_REBOOTãà‰ äVLPMENUITEMINFOWâø‰ ä VwireHBRUSH㊠äVPSCB_PRECREATEã0Š äVSTGM_TRANSACTEDêV??_7IClassFactory@@6B@ãtŠ äWPEMRSELECTCLIPPATH㌊ ä WVK_ICO_CLEARá°Š äWInitiateSystemShutdownExáÈŠ ä WMCI_FREEZEãÜŠ äWFO_RENAMEüŠ äWWSAAsyncGetHostByName‹ äWLPDRIVER_INFO_5Wé WVarI1FromR4âT‹ äXObjectDeleteAuditAlarmãl‹ äXCREATESTRUCTW|‹ äX_pdêXSQL_IS_MINUTE°‹ äYdwAvailPageFileâÄ‹ äYCtlTypeâà‹ äYDMLERR_NO_ERRORê&YPSSL_EXTRA_CERT_CHAIN_POLICY_PARA(Œ äZbV4XPelsPerMeterá@Œ ä ZAppendMenuã`Œ äZUP_FLAGGED_BYTE_BLOBé ZIBindingᔌ ä[EFS_USE_RECOVERY_KEYS¨Œ ä [IS_ERRORáÀŒ ä [CP_RECTANGLEáÔŒ ä [MCI_OPENáøŒ ä[tagMCI_ANIM_OPEN_PARMSAê [VarI1FromR8â0 ä\WriteTransferCountãX ä\PCRYPT_PKCS8_EXPORT_PARAMSãt ä\MIDL_wchar_strcpyˆ ä\VARENUMê\ELEMENT_STATUS_FULLâÌ ä]RPC_S_OBJECT_NOT_FOUNDë]OutputDebugStr㎠ä^tagEMREXTCREATEPENã,Ž ä^WINDOW_BUFFER_SIZE_EVENTé^_PRINTPROCESSOR_INFO_1WâtŽ ä__IMAGE_TLS_DIRECTORY32㎠ä_SWP_NOCOPYBITS㬎 ä_GetKeyboardTypeâÈŽ ä_CryptGetKeyParamáèŽ ä__CLIENT_CALL_RETURNâ ä_PRINTER_ERROR_INFORMATIONè_QUERY_EXPIRATION_DATE@ ä `_MAX_EXTáX ä `PostGetSizeâx ä`IID_IRpcStubBufferë`PREGISTERWORD° äaunexpected_handlerãÄ äaNPRGNDATAÜ ä aIDANI_OPENãø äaMIDIERR_NOTREADYá äaLPDRIVER_INFO_4AáH ä.aAsyncIAdviseSink_Begin_OnViewChange_Proxyd äaFADF_HAVEVARTYPEéaVarMul㨠ä#bCRYPT_OID_FIND_LOCALIZED_NAME_FUNCëbCERT_STORE_ADD_ALWAYSä äciFSTextEffectMSecá‘ äcCTL_FIND_SUBJECTécIOInetProtocolSinkStackableâH‘ ädMinorLinkerVersionë dNO_ERRORát‘ ä eREGDB_S_LASTᘑ äeFEATURESETTING_NEGATIVEâ°‘ ä eEN_ERRSPACEâÈ‘ ä ePP_PROVTYPEâè‘ äeCERT_REVOCATION_INFOéeIPipeByte_Pull_Stubâ ’ ä f__file_modesá4’ äfAllocatorD’ äfGPTRád’ äfRPC_DISPATCH_TABLEëf??_7IDataObject@@6B@ᬒ ägCERT_STORE_PROV_FILENAME_AãØ’ ä gIRunningObjectTable_Revoke_Stubê*gSQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT$“ ähCLOCKS_PER_SECãL“ ähPROCESS_HEAP_ENTRY_MOVEABLEâp“ ähLOCALE_SNATIVELANGNAME㌓ ähPSH_PROPSHEETPAGEèhSQL_DTC_UNENLIST_EXPENSIVEãÜ“ äiCALLTYPE_TOPLEVEL_CALLPENDINGè iVarBstrCatã” äjLPPOINTFX$” äjtagEMREXTTEXTOUTA<” ä jtimecaps_tagáP” ä jFD_CLOSEé jSQLExecute㌔ äkBuildCommDCBAndTimeoutsWá°” äkERROR_DS_NO_CHAINED_EVALékIXMLHttpRequest_send_Proxyãì” älisgraphâü” äl@338é lSTATUS_NONCONTINUABLE_EXCEPTIONâ@• ä mGenericReadâT• ämlstrcpyâl• ä mMWT_IDENTITYပ ä mpbAtrMaskèmITypeLib_GetTypeInfoType_ProxyãÀ• änallocatorØ• ä nCSDVersionãð• ä nLPMETAHEADERá– änEPS_SIGNATURE$– änHWND_BROADCASTã@– änPredictFailureënSQLReadFileDSNWê oEND_PATHá„– äpllrint㘖 äppaYExtëpIPipeLong_Push_ProxyáЖ ä qTPM_VERTICALáø– ä"qMCI_WAVE_STATUS_BITSPERSAMPLE — äqCERT_STORE_PROV_FILENAME_Wã0— ä qUsageP— äqUSER_CALL_IS_ASYNCãt— äqERROR_TRAY_MALFUNCTIONëqIID_IOplockStorageã´— ärUPDFCACHE_ONLYIFBLANKèrDIID_XMLDOMDocumentEventsô— äsERROR_NO_SITENAME˜ ä sProductIdèsIMM_ERROR_GENERALètCERT_STORE_DELETE_FLAGã\˜ ä uI_RpcSendè#u__IXMLElement2_INTERFACE_DEFINED__ã°˜ ävSYSTEM_AUDIT_OBJECT_ACEâȘ ä vMETA_BITBLTêvlpServiceNameü˜ äwERROR_IS_JOINEDâ™ äwLPDRIVER_INFO_4Wá0™ ä wtagBIND_OPTSé-wIEncodingFilterFactory_GetDefaultFilter_Stubá|™ äxLC_WIDEêxSTG_TOEND´™ äyIMAGE_DIRECTORY_ENTRY_TLSЙ äyWM_CTLCOLORBTNëySPI_GETDEFAULTINPUTLANGâš äzFS_FILE_ENCRYPTIONã4š äzCertFreeCRLContextã\š äzCryptInstallCancelRetrievalêzPrinterPropertiesœš ä{IMAGE_DEBUG_MISC_EXENAMEᬚ ä{HKL__è{SQL_MAX_COLUMNS_IN_ORDER_BYê|ITypeInfo_GetVarDesc_Proxyã › ä}BuildCommDCBAndTimeoutsAé%}AsyncIAdviseSink_Begin_OnClose_Proxyál› ä~DDE_FACKRESERVEDé~QueryUsersOnEncryptedFile¨› ä TMPF_DEVICEâ¼› äPC_WIDEâà› äIEnumSTATDATA_Reset_Proxyè&__IDataObject_INTERFACE_DEFINED__ œ ä €__mac_osáLœ ä&€CO_E_REMOTE_COMMUNICATION_FAILUREdœ ä€pi_R0_allvalstœ ä€rad14è%€__IXMLDOMCharacterData_FWD_DEFINED__Ἔ ä e32_ddkverãÌœ ä rad15øœ äCERT_CHAIN_FIND_BY_ISSUER_PARAëLPDRIVER_INFO_3Aá( ä ‚offsetofá8 ä‚@346áH ä ‚fabsfX ä ‚rad16p ä ‚MM_MIM_CLOSEá„ ä ‚LPWAVEHDRè$‚URLPOLICY_AUTHENTICATE_CLEARTEXT_OKâÜ äƒDNS_ERROR_NBSTAT_INIT_FAILEDáô ä ƒLPMMIOINFOãž äƒPFN_CMSG_EXPORT_ENCRYPT_KEYâDž ä"ƒURLACTION_AUTHENTICATE_CLIENTdž äƒURLZONEREG_DEFAULTë ƒVarCyFromIntᔞ ä „ciexyzBlueã°ž ä„GetTextMetricsWâÀž ä „KF_UPØž ä„LBN_SELCANCELèž ä„rad10è„KP_P០ä…SCHED_E_TASK_NOT_RUNNINGá8Ÿ ä…GETPRINTINGOFFSETHŸ ä …rad11XŸ ä…KP_QátŸ ä…VT_STORED_OBJECTá Ÿ ä…??_7IGlobalInterfaceTable@@6B@ë…tagURLTEMPLATEãØŸ ä†ERROR_NOT_FOUNDâèŸ ä†rad12è †grfStateBitsá  ä ‡QuadPartá0  ä‡AddressOfRawDataáP  ä‡RESOURCETYPE_UNKNOWNá`  ä ‡rad13”  ä)‡__IInternetSecurityManager_FWD_DEFINED__é ‡GetMonikerã¼  ä ˆfabslР äˆLPDOCINFOð  äˆParentObjectInstanceéˆIOCTL_CHANGER_SET_POSITIONã0¡ ä ‰DATA_E_FIRSTáH¡ ä ‰WM_COMMANDãp¡ ä‰IPersistFile_IsDirty_Proxyã¡ ä‰IPipeLong_Pull_Proxyá°¡ ä‰SQL_API_SQLDISCONNECTè‰SQL_SSF_TRANSLATEð¡ äŠ??_7exception@std@@6B@ã¢ ä ŠszShortNameêŠMS_ENH_DSS_DH_PROVã<¢ ä‹char_typeX¢ ä‹SELECTPAPERSOURCEt¢ ä‹COLOR_MENUTEXTë‹??_7IXMLElementCollection@@6B@ã´¢ äŒnGlyphsâÈ¢ ä ŒSO_ERRORáØ¢ äŒKP_Xáô¢ äŒkeyLocatorInfo㣠äŒwMethodêŒ__IBinding_FWD_DEFINED__áL£ äIMAGE_SYM_TYPE_PCODEáp£ äIMAGE_REL_BASED_SECTION✣ ä COMADMIN_E_COMPFILE_LOADDLLFAILâ´£ ä PFD_STEREOãУ ätagEMRCREATEPENâ࣠äKP_Yáø£ ä PP_UI_PROMPTéNODE_NOTATION0¤ äŽSERVICE_SYSTEM_STARTáH¤ ä ŽPSYSTEMTIMEâh¤ äŽWriteProcessMemory㌤ äŽObjectPrivilegeAuditAlarm¤¤ ä ŽMessageBeep⼤ ä ŽVIF_MISMATCHáä¤ äŽCRYPTPROTECT_PROMPT_STRONGëŽSERVER_ROUTINEã ¥ äCONVERT10_E_STG_FMTêIAuthenticateL¥ ärclsid1âl¥ äGetAcceptExSockaddrsé BORDERWIDTHSᘥ ä‘LPJOYINFOÀ¥ ä‘NdrInterfacePointerUnmarshallè‘MSHLFLAGS_NORMALáø¥ ä’GetTextMetricsAâ(¦ ä%’IXMLDOMCharacterData_appendData_Stubé ’SQL_IC_MIXEDáT¦ ä“rclsid2âl¦ ä “BM_GETIMAGEΩ ä “NPMMIOINFO㔦 ä“KP_Gá´¦ ä“CERT_STORE_PROV_LDAPé“CAPROPVARIANTø¦ ä!”??_Eunderflow_error@std@@UAE@I@Zá § ä ”LONG_PTRé”TF_WRITE_BEHINDâL§ ä•LOAD_LIBRARY_AS_DATAFILEál§ ä•BATTERY_FLAG_CRITICALè•IXMLDocument2_put_charset_Stub㬧 ä –__fwriteé–??_7IBinding@@6B@ܧ ä—VK_DIVIDEô§ ä—PROXY_MARSHALè—LPDRIVER_INFO_3Wá8¨ ä˜TAPE_DRIVE_LOAD_UNLD_IMMEDãP¨ ä ˜PARITY_MARKâl¨ ä˜GetCurrentProcessˆ¨ ä˜PSH_NOAPPLYNOWë$˜IXMLDOMDocument_get_parseError_Stubą̂ ä™SIZE_Tãä¨ ä ™OPENCHANNELâ© ä™PRINTER_ATTRIBUTE_LOCALê ™__urlmon_h__éšEndHeadNumberT© ä›__extended_hugeâp© ä›ERROR_NOT_READY∩ ä ›SS_OWNERDRAWé›X509_CERT_TO_BE_SIGNEDãÔ© äœCLIENTENGINE_CUSTOM_PRECOMP_H᪠ä!œ??_Gunderflow_error@std@@UAE@I@Z᪠äœDI_MASKêœSCONTEXT_QUEUEëERROR_DS_DATABASE_ERRORâ|ª äžIMAGE_SIZEOF_BASE_RELOCATIONᜪ äžX509_DH_PARAMETERS㸪 äžIOleInPlaceObjectè(ž__DOMFreeThreadedDocument_FWD_DEFINED__â« ä ŸNLS_HIRAGANAá(« äŸ_CERT_ACCESS_DESCRIPTIONéŸuArrayStructsX« ä  xmit_aborts∫ ä* _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO « ä  NIKON_12_RWê  get__newEnumáà« ä¡ERROR_BAD_VALIDATION_CLASSä¬ ä¡dwDistPointNameChoice¬ ä¡LPDRIVER_INFO_2Aé¡BINDF_FREE_THREADEDâ\¬ ä¢?$__num_bits@$0PP@ãt¬ ä ¢NONZEROLHND⤬ ä$¢ERROR_DS_DRA_EXTN_CONNECTION_FAILED⸬ ä ¢recvfromáÔ¬ ä¢PrinterMessageBoxè¢SQL_SS_ADDITIONSé£SQL_DATE_STRUCTâ$­ ä ¤RegOpenKeyWâD­ ä¤SPLDS_PRINTER_MODELê¤LPSTORAGEl­ ä ¥R2_WHITEር ä¥PEMRSETTEXTCOLORá°­ ä¥PMIXERCONTROLDETAILS_SIGNEDê¥MDM_PROTOCOL_HDLCPPP_112Kø­ ä¦RegisterWindowMessageAã(® ä#¦CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRLãX® ä%¦__AsyncIPipeLong_INTERFACE_DEFINED__é"¦ITypeLib_RemoteFindName_Proxyœ® ä§CLIPBRD_S_LAST㬮 ä§aptsáÀ® ä §hbmColoré§rgbColorsø® ä¨SCARD_E_INVALID_HANDLEã ¯ ä¨methodã(¯ ä¨pUnkForReleaseãH¯ ä¨GL_ID_INPUTREADINGë¨SQL_INITIALLY_IMMEDIATE  ä ©IDC_ICONé©NdrFullPointerQueryPointerãȯ äªinput_iterator_tagãì¯ äªSetSystemTimeAdjustmentêªWM_VKEYTOITEM° ä «DaylightNameá@° ä«ERROR_DS_FILTER_UNKNOWNâ\° ä«ANSI_FIXED_FONTât° ä «CloseFigure✰ ä«CERT_QUERY_FORMAT_FLAG_ALLë «SCardCancelâ̰ ä¬ATF_TIMEOUTONà° ä¬HashAlgid± ä/¬AsyncIAdviseSink2_Finish_OnLinkSrcChange_Proxyã4± ä ¬INVOKE_FUNCâP± ä¬LBSELCHSTRINGAë¬ODBC_REMOVE_DSN∱ ä­PEXCEPTION_RECORD ± ä ­TRUST_E_FAILáÀ± ä­I_RpcFreePipeBufferâܱ ä­NODE_ATTRIBUTEë­SQL_ACCESSIBLE_TABLES$² ä®TYPE_E_INCONSISTENTPROPFUNCSá<² ä®LPCURSORSHAPEL² ä®expráp² ä®PPRINTPROCESSOR_INFO_1Wê ®IMEVER_0310ê¯VER_SUITE_SMALLBUSINESSâ¼² ä°expláಠä°THREAD_SET_INFORMATIONã³ ä°RegisterWindowMessageWã$³ ä°MCIERR_DEVICE_LOCKEDáD³ ä°X509_PUBLIC_KEY_INFOé"°IXMLDOMDocument_loadXML_Proxy”³ ä±PTAPE_GET_MEDIA_PARAMETERSã¼³ ä±PERF_PRECISION_100NS_TIMERãà³ ä±SQL_ODBC_API_CONFORMANCEé±SQL_LCK_EXCLUSIVE´ ä²__file_handle0´ ä²VER_BUILDNUMBERâH´ ä ²RegOpenKeyAâ`´ ä ²MM_MOM_CLOSEá|´ ä²MCI_INFO_PRODUCT᜴ ä²??_7IEnumOLEVERB@@6B@è²IME_ESC_GETHELPFILENAMEâä´ ä³RPC_C_PARM_BUFFER_LENGTHâµ ä³SCARD_T1_REQUESTá µ ä³tdDeviceNameOffsetë+³IInternetSecurityManager_MapUrlToZone_Stubãpµ ä´SetCommConfig˜µ ä´IOCTL_STORAGE_CHECK_VERIFYë!´StgGetIFillLockBytesOnILockBytesáܵ ä µDaylightBiasâ¶ äµSCARD_E_DUPLICATE_READERá¶ äµBITMAPëµSQL_ENTIRE_ROWSETH¶ ä ¶_IO_COUNTERSá`¶ ä ¶HELP_TCARDë!¶RESOURCEDISPLAYTYPE_NDSCONTAINERá°¶ ä·NETSCAPE_SIGN_CERT_TYPEâ̶ ä·LPDRIVER_INFO_2Wé ·MODEMDEVCAPSáø¶ ä¸size_tã· ä ¸PACE_HEADERâ · ä¸aptlá8· ä¸CALLBACK_TASKL· ä¸PSCODEë¸PPRINTPROCESSOR_INFO_1Aâ„· ä ¹store_asᨷ ä¹STATUS_INTEGER_OVERFLOWê ¹FR_FINDNEXTâз äºexpfáð· äº?$__num_bits@$0HP@㸠äºERROR_INVALID_MINALLOCSIZEëºLBSELCHSTRINGWãL¸ ä »FLT_MANT_DIGáh¸ ä»reverse_iteratorḠä»PTAPE_SET_MEDIA_PARAMETERSë»IUrlMonâĸ ä¼SECURITY_BATCH_RIDãè¸ ä¼UNIVERSAL_NAME_INFO_LEVEL¹ ä$¼IViewObject_RemoteGetColorSet_Proxyâ8¹ ä¼??_7IXTLRuntime@@6B@áP¹ ä ¼PARSE_ESCAPEáp¹ ä¼NI_IMEMENUSELECTEDë¼SQL_OU_DML_STATEMENTS¸¹ ä"½RPC_E_CANTCALLOUT_INASYNCCALLй ä ½tmStruckOutâð¹ ä½RPC_C_MQ_PERMANENTã$º ä*½CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAGè½IID_ICreateTypeInfo2áXº ä¾bitmaskê*¾CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAG¨º ä¿hyper_from_ndr_tempâ̺ ä¿VariantTimeToSystemTimeê ¿SQL_IS_HOURâüº äÀdwProvSubType» äÀMMTIMEã,» äÀrgCertPolicyIdëÀ??_7IDropTarget@@6B@ád» ä ÁDS_S_SUCCESSéÁLPDRIVER_INFO_1Aᬻ ä ÂERROR_NONPAGED_SYSTEM_RESOURCESâÌ» äÂWNetCancelConnectionáü» ä#ÂMIXERCONTROL_CONTROLTYPE_MILLITIMEã¼ äÂUSER_MARSHAL_FC_SHORT@¼ äÂPDRIVE_LAYOUT_INFORMATIONè ÂInsertMenusâp¼ äÃCRYPT_SUCCEEDèÃ??_7IWinInetHttpInfo@@6B@°¼ äÄCreateProcessInfoȼ ä ÄpPrinterNameéÄSQL_SR_USAGE_ON_COLLATION½ ä ÅSETLINECAPã,½ äÅPAN_XHEIGHT_CONSTANT_LARGEëÅDFCS_INACTIVEX½ ä ÆOBJ_BRUSHèÆEM_SCROLL”½ äÇtMIXERCONTROLDETAILS_BOOLEANé&ÇICreateTypeInfo_SetDocString_Stubн ä È_gcvtô½ äÈSPI_GETWINDOWSEXTENSIONâ¾ äÈHOSTENTê"Èsz_CERT_STORE_PROV_SMART_CARDH¾ ä ÉIMAGE_BITMAPál¾ äÉRPC_C_MQ_CLEAR_ON_OPEN㌾ äÉTAPE_RESET_STATISTICS¤¾ äÉHWND_UserSizeèÉSC_MANAGER_ALL_ACCESSྠäÊmax_sess_pkt_sizeá¿ äÊFSCTL_DISMOUNT_VOLUME¿ äÊVarBoolFromIntë ÊSQL_AM_NONEâT¿ äËPCERT_ALT_NAME_ENTRYဿ ä ËCERT_STORE_PROV_NO_PERSIST_FLAGâ ¿ äËBeginningTransactionáÀ¿ äËMDM_HDLCPPP_AUTH_CHAPèËSQL_FN_STR_SOUNDEXã À ä ÌERROR_SERVICE_MARKED_FOR_DELETEâ(À äÌPSINJECT_TRAILERá<À äÌVK_RETURN\À äÌSM_MENUDROPALIGNMENTátÀ äÌDATE_LONGDATEœÀ ä"ÌOLEVERBATTRIB_ONCONTAINERMENU´À ä ÌSF_UNKNOWNãØÀ äÌSQL_PARAM_INPUT_OUTPUTëÌSQL_SP_QUANTIFIED_COMPARISONé ÍVT_VARIANTã0Á äÎLANG_GUJARATIHÁ ä ÎPIO_COUNTERSá`Á ä ÎdshSectionãxÁ äÎWM_CANCELMODEÁ ä ÎIEnumVARIANTéÎSQLInstallODBCãÈÁ äÏLPENUMLOGFONTEXWáäÁ äÏEMRPOLYBEZIER16âüÁ ä ÏMB_USERICONâ äÏMCI_USER_MESSAGESD ä Ï__IMarshal2_INTERFACE_DEFINED__ê+ÏIXMLHttpRequest_getAllResponseHeaders_StubãœÂ äÐERROR_SEVERITY_ERRORáÀ äÐSUBLANG_SPANISH_GUATEMALAÔ ä ÐAceCountáè ä ÐHMIDISTRMèÐIEnumUnknown_Skip_Proxyâ à äÑVALENTã8à ä ÑdwAttributesáhà ä&ÑCMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAGèÑCryptVerifyMessageSignatureâ¤Ã ä ÒgrfFlagsé ÒCTRL_C_EVENTáØÃ äÓFILE_SHARE_DELETEìà äÓ_lopenãÄ ä!ÓERROR_DS_SECURITY_ILLEGAL_MODIFYá4Ä äÓtagPROPVARIANTëÓQueryServiceStatusãpÄ äÔis_member_pointerŒÄ äÔDdeConnectListã¬Ä äÔPCERT_TRUST_LIST_INFOè ÔSQL_RD_OFFãÜÄ äÕSKF_AVAILABLEøÄ äÕPCRYPT_ATTRIBUTEéÕfMDIAppâ$Å äÖWM_MDICASCADE@Å äÖVIF_CANNOTREADDSTèÖIRecordInfo_GetSize_Stubá€Å ä×APPDATA_SUBDIRã Å ä×TAPE_DRIVE_PADDINGãÄÅ ä×GetEnhMetaFileDescriptionèÅ ä×szOID_ISSUER_ALT_NAME2ãÆ ä×szOID_PKCS_7_DATA Æ ä×LPDRIVER_INFO_1Wé$×IInternetProtocolRoot_Suspend_ProxyâhÆ ä Ø__msl_spaceâxÆ äØwhatáŒÆ äØControlâ°Æ äØPSINJECT_BEGINDEFAULTSë ØMOM_OPENáàÆ äÙLPENUMLOGFONTEXAâÇ äÙDCTT_DOWNLOAD_OUTLINEÇ ä ÙAuthFlagsèÙPCCRYPT_OID_INFOáLÇ äÚDRAGDROP_S_DROPâ`Ç äÚBS_ICONâ|Ç äÚDlgDirSelectExã˜Ç äÚLCMAP_KATAKANAãÀÇ ä"ÚRPC_C_NOTIFY_ON_SEND_COMPLETEàÇ äÚCertEnumSystemStoreê*ÚIOleInPlaceUIWindow_SetActiveObject_ProxyèÛcbInnerStringèÜSQL_BS_ROW_COUNT_EXPLICIT`È äÝSig1á€È äÝLookupPrivilegeNameâ¨È äÝERROR_CLASS_ALREADY_EXISTSãÄÈ äÝPFD_OVERLAY_PLANEè ÝCAL_HEBREWãìÈ äÞSig2âÉ äÞMK_S_LAST É äÞDMTT_DOWNLOAD_OUTLINE8É ä ÞC3_HALFWIDTHéÞdwOptDataSizehÉ ä ßwstreambufãxÉ äßBitsáœÉ äßACL_REVISION_INFORMATIONá´É ä ßWH_MAXHOOKãÐÉ äßSendNotifyMessageèßhPrintTemplateãÊ äà__wOutStrCtrl Ê äàtagENHMETARECORDáDÊ äàRpcNsProfileEltInqBeginWéàszOID_X957_DSAãtÊ äáULONGLONGŒÊ äáUserSidLength¨Ê äáotmPanoseNumberâÈÊ äáPERF_COUNTER_TIMERãË ä0áISoftDistExt_AsyncInstallDistributionUnit_ProxyêáSQL_C_TIMESTAMPâDË äâERROR_DS_OBJ_TOO_LARGEãXË äâDDS_4mmâ€Ë äâSQL_C_INTERVAL_YEAR_TO_MONTHéâSQL_CU_INDEX_DEFINITIONâ´Ë äã_t_âØË äãERROR_NOT_CHILD_WINDOWë ãNODE_ENTITYâ Ì ääNEWTEXTMETRICAã,Ì äätagEMRSETTEXTCOLORãPÌ ääRESOURCEDISPLAYTYPE_FILEéäSQL_SC_TRY_UNIQUEŒÌ äåEnterCriticalSectioná¤Ì äåR2_NOTMASKPENèåWSAIsBlockingÐÌ ä æ__localeáøÌ äæPIMAGE_COFF_SYMBOLS_HEADERã Í äæCE_TXFULL$Í ä æInsertMenuWâDÍ äæmidiOutPrepareHeaderé.æAsyncIAdviseSink_Finish_OnDataChange_Stub”Í äçGetGlyphOutlineAá°Í äçExtSelectClipRgnáÀÍ äçcptséçLOCALE_USE_CP_ACPüÍ äèTIME_ZONE_INFORMATIONÎ äèOpenFileMappingAá4Î äèCreateMetaFileAâHÎ äècyDestëèGetNumberFormatâ|Î ä éPRF_CHILDRENáœÎ äéCMSG_VERSION_PARAMã¼Î äéCMSG_HASHED_DATA_V0âØÎ äéNumberOfBucketsêéNdrSimpleStructFreeâÏ ä êreplace_ifëê_SERVICE_DESCRIPTIONAPÏ äëCMSG_HASHED_DATA_V2âdÏ äëTravanëëLPBINDINGœÏ äìEVENTLOG_BACKWARDS_READâÀÏ äìGetPrivateProfileStructAáäÏ äìSCHED_S_TASK_NO_MORE_RUNSüÏ ä ìNTE_BAD_HASHá Ð äìSPI_SCREENSAVERRUNNINGã@Ð äìWAVERR_STILLPLAYINGêìPARSE_SECURITY_URLãxÐ ä ípfnDlgProcëí__MSXML_LIBRARY_DEFINED__¬Ð äîexp2áÀÐ ä îLOGBRUSHáØÐ ä îParamNumberâÑ ä%îNdrConformantVaryingStructBufferSizeé-îIOleInPlaceUIWindow_RequestBorderSpace_ProxyádÑ äïRPC_X_INVALID_PIPE_OBJECT„Ñ äïDNS_ERROR_SETUP_BASEéïImmIsUIMessageã´Ñ äðrgbRedë ðInsertMenuAâäÑ ä ñDeviceNameäÒ äñGetGlyphOutlineWáÒ äñiArcDirection8Ò äñSetMenuContextHelpIdáLÒ ä ñLoadIconápÒ äñRPC_MGMT_AUTHORIZATION_FNŒÒ äñPPERF_OBJECT_TYPE Ò äñSOCKETã¼Ò äñCFSTR_MIME_NULLê ñUDATEèÒ äòNEWTEXTMETRICWãüÒ äòjoyGetPosÓ ä ònode_countã0Ó äòDragQueryPointëòRegisterServiceCtrlHandlerExápÓ äóMM_DRVM_ERROR”Ó äóMCI_GETDEVCAPS_CAN_RECORD´Ó äóMCI_VD_ESCAPE_STRINGáÔÓ äóMCI_SEQ_STATUS_PORTâèÓ äóVarEqvëóEnumServicesStatusExá,Ô äôSE_INC_BASE_PRIORITY_NAMEHÔ äôDM_OUT_DEFAULTã`Ô äôSetMiterLimit|Ô äôLCMAP_LOWERCASEê"ôIXMLElement_put_tagName_Proxy¼Ô äõframe_controlèõCryptMsgSignCTLâøÔ äöSCARD_E_DIR_NOT_FOUNDÕ äöPFD_SWAP_EXCHANGE0Õ äöWINDOWPLACEMENTâDÕ äödwUserãhÕ äöRpcNsProfileEltInqBeginAéö__MIDL_DECLSPEC_DLLIMPORTè÷bmBitsã°Õ äøcptláÌÕ äøRegQueryInfoKeyêø_XMIT_ROUTINE_QUINTUPLEâÖ äùANYSIZE_ARRAY,Ö äù_IMAGE_TLS_DIRECTORY64ãHÖ äùJOB_STATUS_ERRORá\Ö äùSetDataêùSetStatusText¤Ö ä%úJOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OKáÈÖ äúGetPrivateProfileStructWáèÖ äúwglGetCurrentContextéúCALG_SKIPJACK × äûSYSTEM_ALARM_ACE_TYPE<× äûEMR_POLYPOLYGONâ\× äûGetMenuContextHelpIdáx× äûWAVECAPS_PITCHëûImmSetOpenStatusá¨× äüGetDataâØ× ä*üIXMLDOMCharacterData_insertData_Proxyè× äüdepthèü_SERVICE_DESCRIPTIONW$Ø äýgetprotobynumberá<Ø ä ýOpenStorageêýIWindowForBindingUIâpØ ä þmakepatháØ äþSE_LOCK_MEMORY_NAMEâ¬Ø äþWT_EXECUTEDEFAULTÈØ äþOpenFileMappingWáäØ äþEqualPrefixSidäÙ äþMETAFILE_DRIVERâÙ äþCreateMetaFileWâ8Ù äþEMRSTRETCHDIBITSáTÙ äþNdrServerCall2ã€Ù ä!þPRINTER_NOTIFY_FIELD_TOTAL_BYTESéþput_value°Ù äÿFILE_ACTION_ADDEDÐÙ äÿPEMRREALIZEPALETTEãäÙ äÿNCBUNLINKÚ äÿX509_CRL_REASON_CODEéÿbstrDescriptionâ8Ú å push_frontãLÚ å DC_DRIVERé LPJOB_INFO_1á€Ú ä?$__num_bits@$0P@¨Ú äFILE_ACTION_RENAMED_OLD_NAMEáØÚ ä#IMAGE_FILE_REMOVABLE_RUN_FROM_SWAPãìÚ ä LocalFreeáÛ ä C1_UPPERáÛ ä NPJOYCAPSWã@Û äCMSG_KEY_AGREE_ENCRYPT_INFOâdÛ äPFN_IMPORT_PRIV_KEY_FUNCé WINOLEAPI_ã”Û ä LPJOB_INFO_3éPIDDSI_COMPANYãÈÛ ä __va_startãðÛ äERROR_DRIVE_MEDIA_MISMATCHãÜ ä SPAPI_E_DEVICE_INTERFACE_ACTIVEê LPJOB_INFO_2áPÜ äfirst_referenceâpÜ äIStorage_Revert_StubáˆÜ ä CreateStubã Ü ä UnknownStrã´Ü ä hreftypeéSQL_INTERVAL_DAY_TO_SECONDãøÜ äMMIO_EXCLUSIVEã4Ý ä6CRYPT_UNICODE_NAME_ENCODE_DISABLE_CHECK_TYPE_FLAGPÝ äpRpcChannelBufferxÝ äNdrInterfacePointerMarshallêwireSTGMEDIUM¨Ý äistringstream¸Ý äLPTRéPRF_CHECKVISIBLEáäÝ äphhkáüÝ ä LPJOYCAPSAëQUERY_REFRESH8Þ äBidirectionalIterator1ãXÞ äGetTextExtentPointWâpÞ ä EMRPOLYGON16á„Þ äHTHSCROLL¤Þ äCERT_COMPARE_EXISTINGÄÞ ä_wireSAFEARR_BRECORDé hstmtøÞ ä IMAGE_REL_MIPS_REFWORDãß ä ERROR_INVALID_SERVICENAMEè ClosePß ä BidirectionalIterator3ë DFCS_SCROLLUPŒß ä BidirectionalIterator2ã¨ß ä HCBT_CLICKSKIPPEDÐß ä" BINDINFO_OPTIONS_DISABLE_UTF8øß ä SQL_MAX_COLUMNS_IN_GROUP_BYê SQL_FN_TD_WEEKã8à ä ERROR_BAD_QUERY_SYNTAXãTà ä CheckRadioButtonátà ä tagMINIMIZEDMETRICSê# ICreateTypeInfo_SetDocString_Proxyë SZDDESYS_ITEM_TOPICSé SOL_SOCKETãôà ä ReadFileExëdwInFlags á ä PP_IMPTYPEëSQL_DESC_UNSIGNEDdá äERROR_NETLOGON_NOT_STARTEDã€á äCO_E_APPNOTFOUNDá˜á ä LPJOYCAPSWã¬á ä ncb_nameáÌá äCFSTR_MIME_X_BITMAPâðá äURLACTION_HTML_CURR_MAXêSQL_INDEX_KEYWORDSã8â äIRpcStubBuffer_Invoke_StubëSQL_CS_DEFAULT_CHARACTER_SETátâ ä dwFramesáŒâ ä SHGFI_ICONëSQL_API_SQLFOREIGNKEYSãÔâ äCRYPT_E_SECURITY_SETTINGSüâ äDMLERR_DLL_NOT_INITIALIZEDëdwTemplateRecommended4ã ä DM_IN_PROMPTáXã ätagEMRCREATECOLORSPACEãxã äGetFileVersionInfoãœã äPRINTER_STATUS_PAGE_PUNTé3__IInternetHostSecurityManager_INTERFACE_DEFINED__ãüã äNdrSH_TLUPDecisionãä äISynchronizeContainerèPROPSETFLAG_DEFAULTâ\ä äERROR_UNKNOWN_PORTãxä äCRYPT_E_ASN1_NYIáä ä NPJOYCAPSAã°ä äSPLREG_RETRY_POPUPãÄä ä tagSTGTYéIME_CMODE_ROMANãå äERROR_INSTALL_FAILUREå äEMR_MINâ,å ä DT_WORDBREAKá@å äMCI_CLOSEdå äIDataObject_DAdvise_Proxy|å ä AddFuncDescê IGP_SENTENCEá´å äTRUST_E_TIME_STAMPë SQL_DESC_DATETIME_INTERVAL_CODEâüå äOUT_RASTER_PRECISè GetClassInfoéCERT_EFSBLOB_REGPATHáLæ ä SYSPAL_ERRORáhæ äSCARD_COLD_RESETá„æ äcguidInterfacesâ¨æ äIAdviseSink_OnClose_Proxyè SQL_C_DOUBLEáìæ ä"@class$7645clientEngine_dbg___pchèPRINTER_STATUS_DOOR_OPENá0ç äGetTextExtentPointAêPIDDSI_HEADINGPAIRã|ç ä!CRYPT_E_STREAM_INSUFFICIENT_DATAáœç äszOID_PKCS_7_DIGESTEDÈç äCMSG_OID_IMPORT_KEY_AGREE_FUNCãôç ä&CERT_SYSTEM_STORE_CURRENT_SERVICEè äFirstDriveNumberéVARIANT_LOCALBOOLè COLOR_WINDOWFRAME`è ä!CreateRectRgn|è ä!EMR_SETMITERLIMIT˜è ä!DFCS_BUTTON3STATE°è ä !midiInCloseâÈè ä !MMIOM_WRITEâèè ä!SHFreeNameMappingsë!HlinkSimpleNavigateToStringâ4é ä"GetOldestEventLogRecordâ\é ä"CreateDialogIndirectParamWã|é ä"WNetUseConnectionAã”é ä "PF_APPLETALKá¬é ä "szOID_OIWSECé2"SORTED_CTL_EXT_HASHED_SUBJECT_IDENTIFIER_FLAGøé ä#Regionãê ä #META_CHORDã(ê ä#CTRY_HONDURAS8ê ä#uiLoáPê ä #NRC_IFBUSYãhê ä #FORM_PRINTERé!#ITypeInfo_RemoteGetTypeAttr_Stubá°ê ä$WNetAddConnectionÐê ä$WNetDisconnectDialogáôê ä$RpcBindingSetAuthInfoWã$ë ä$$NdrConformantVaryingArrayMemorySizeê$BINDSTRING_PTR_BIND_CONTEXTê%dwContextHelpIdâˆë ä&SPI_SETPOWEROFFACTIVE¤ë ä&MKF_HOTKEYACTIVEáÈë ä&CLSID_InProcFreeMarshalerè&&IXMLDOMNotation_get_systemId_Stubì ä'PIMAGE_DOS_HEADER,ì ä'HCBT_KEYSKIPPEDâDì ä 'wCountryIDãXì ä'lpfnCheck|ì ä'IID_IOleInPlaceUIWindowâ˜ì ä'SAFEARR_BRECORDâ¸ì ä'SQL_ISV_TRANSLATIONSé 'SQL_ENSUREãèì ä (DIFFERENCEãí ä(EnumSystemLocalesí ä(ImageableArea,í ä(pIIDá\í ä#(IInternetProtocolRoot_Suspend_Stubãlí ä(HSTMTè (SQLPrepareAâ”í ä )closeÄí ä%)ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATIONáèí ä)NdrFixedArrayUnmarshallâî ä)LPCSCARD_IO_REQUESTê)Timeá0î ä *SO_OOBINLINEáPî ä*VARFLAG_FNONBROWSABLEè*SQL_CA1_POSITIONED_UPDATE˜î ä+IMAGE_REL_ALPHA_SECRELã¼î ä+REGDB_E_BADTHREADINGMODELÔî ä +CopyCursorãðî ä+ABN_FULLSCREENAPPè+szOID_X21_ADDRESS8ï ä&,ACE_INHERITED_OBJECT_TYPE_PRESENTHï ä,LPTxé#,RPC_C_QOS_CAPABILITIES_MUTUAL_AUTHã¤ï ä"-@class$7646clientEngine_dbg___pchè&-@class$7747clientEngine_dbg___pchìï ä/front_inserterãð ä/tagEMRELLIPSEð ä /lppos,ð ä /dwFileFlagsâHð ä/PMONHSZSTRUCTAë/PMCI_OVLY_WINDOW_PARMSAâ€ð ä0getpidë0PD_PRINTSETUP´ð ä1NumberParametersáÐð ä1dwFlickerFilterâìð ä1MetaDataWritesë 1BindTypeáñ ä 2RPC_E_FAULTâ<ñ ä2RpcBindingSetAuthInfoAãPñ ä2listenãhñ ä2DHPUBKEY_VER3€ñ ä 2PostReallocâ˜ñ ä 2VT_HARDTYPEâ¼ñ ä2SQL_ODBC_SQL_CONFORMANCEé2SQL_CA1_POS_REFRESHâøñ ä3SS_LEFTNOWORDWRAPò ä 3_BIN_COUNTë 3SQLINTERVALâPò ä4CreateDialogIndirectParamAãpò ä4WNetUseConnectionWãŒò ä4DDE_FAPPSTATUSë4chx8á°ò ä5wcstollâàò ä$5JOB_OBJECT_UILIMIT_SYSTEMPARAMETERSãó ä5SCARD_W_RESET_CARDãó ä 5DST_COMPLEXê5chx9é6ISurrogate_LoadDllServer_Proxyãpó ä7RPC_S_WAITONTIMER˜ó ä7COMADMIN_E_OBJECTNOTPOOLABLEá¬ó ä7FW_MEDIUMÌó ä7FOCUS_EVENT_RECORDãôó ä7WN_CONNECTED_OTHER_PASSWORDê7SQL_CB_NON_NULLâ$ô ä8LC_TIMEâ@ô ä8biXPelsPerMeterâTô ä 8WM_TCARDádô ä8chx4á€ô ä8ALG_SID_TLS1PRFâ”ô ä 8VTBIT_UI4è8SQL_CVT_LONGVARCHARâÐô ä9PMONHSZSTRUCTWãàô ä9chx5áõ ä9PMCI_OVLY_WINDOW_PARMSWâ4õ ä#9CERT_STORE_SET_LOCALIZED_NAME_FLAGãXõ ä9GetInterfaceFromGlobalë9CFSTR_MIME_TEXTâ„õ ä:chx6á°õ ä:IOleAdviseHolder_Unadvise_Stubë :LPOLEOBJECTâØõ ä ;__rawèõ ä;chx7é ;ITypeInfo2_GetVarCustData_Proxyâ,ö ä<FILE_MAP_READXö ä!<ERROR_DS_RDN_DOESNT_MATCH_SCHEMAápö ä <SM_CYSMSIZEâö ä<PP_KEYEXCHANGE_ALGã¸ö ä<CRYPT_GET_URL_FROM_EXTENSIONáÔö ä<IID_IEnumStringê <CF_USESTYLEâ÷ ä&=@class$7647clientEngine_dbg___pch8÷ ä=CREATE_SHARED_WOW_VDMT÷ ä=GCP_GLYPHSHAPEãp÷ ä=tagEMRPOLYLINEã€÷ ä=chx1á˜÷ ä=REPLACEDLGORD´÷ ä=waveOutGetVolumeáÔ÷ ä=IStorage_Stat_Proxyê=VTBIT_UI1ø ä>EASTEUROPE_CHARSETãø ä>chx2áDø ä >szOID_AUTHORITY_REVOCATION_LISTâ`ø ä>NdrAsyncStubCallátø ä>BytesReadˆø ä >VTBIT_UI2è >SQLPrepareWâ¼ø ä?LOCALE_INEGCURRâÌø ä?chx3áàø ä?WSARecvExøø ä?NODE_DOCUMENTè?selectSingleNodeá0ù ä@GetStringTypeWãLù ä@tagMIXERCONTROLWá€ù ä(@IStdMarshalInfo_GetClassForHandler_Stubê@SQLBulkOperations¸ù äACERT_E_EXPIREDãÔù äAPFD_NEED_PALETTEé ApszStatusáú ä BCreateEventWá(ú äBERROR_CLUSTER_NETWORK_EXISTSáHú äBLPMCI_VD_ESCAPE_PARMStú äB__IMessageFilter_FWD_DEFINED__ãŒú äBINTERFACEDATAèBGL_ID_TYPINGERRORè CCF_DSPTEXTãÜú äDERROR_DISK_FULLâôú ä DCTRY_JAMAICAáû äDCreateDataCacheê%D__MIDL_itf_oleidl_0000_v0_0_s_ifspecá\û äEMARSHAL_E_FIRSTâxû äEWNNC_NET_SERNETâû ä EwaveOutCloseá¤û äEPAUXCAPSW¸û ä EDIBINDEXéERpcNsBindingImportNextãôû ä FFRAME_NONFPOáü äFDCBA_FACEDOWNLEFT(ü äFMEVT_SHORTMSGèFPINNACLE_APEX_5_RWãdü äHDECLSPEC_IMPORTâtü äHCOORDè$HSCARD_ATTR_USER_TO_CARD_AUTH_DEVICEâ¼ü ä I_EM_DENORMALáÐü äIMIM_CLOSEðü äILPMCI_SEQ_SET_PARMSê IJOB_WRITEè.JIBindStatusCallback_OnDataAvailable_Proxy\ý äKERROR_MEMBER_NOT_IN_GROUP|ý äKDNS_ERROR_RCODE_LASTáœý äKPMCI_ANIM_RECT_PARMSáÀý äKtagMCI_OVLY_RECT_PARMSë KPBIN_COUNTãðý ä LFLT_MIN_EXPê LFillPathá0þ ä MSE_PRIVILEGE_ENABLED_BY_DEFAULTâ\þ ä&M@class$7640clientEngine_dbg___pch„þ äMNumberOfModuleForwarderRefsâœþ ä MbProportionâ´þ ä MtagAUXCAPSWâÐþ äMRootIndexReadsëMSQL_PROCEDURESãÿ äNPrologEndAddressá$ÿ äNCreateFileMapping@ÿ äNKP_SCHANNEL_ALGâ\ÿ äNCHANGER_ELEMENTâxÿ äNVarUI4FromDateëNSQL_SEARCHABLEã¬ÿ ä OLANG_UZBEKãÔÿ äOmciGetDeviceIDFromElementIDAá ä'OCRYPT_OID_REGISTER_PHYSICAL_STORE_FUNCëOVAR_LOCALBOOL8 ä PSE_ERR_FNFëPPD_HIDEPRINTTOFILE〠äQDEFAULT_DATASTORES_ENABLED㘠ä QPCF_RTSCTSã´ äQWN_WINDOWS_ERRORáÌ ä QJOYSTICKID2âè äQMCI_OVLY_OPEN_WSá äQCMSG_CMS_RECIPIENT_INDEX_PARAMã( ä QBinRangeéQIMalloc_DidAlloc_Stubd äRLANG_UKRAINIANã| ä RJOYSTICKID1êR_CERT_AUTHORITY_INFO_ACCESSâÀ äSGCL_HBRBACKGROUNDÔ ä SPAUXCAPSAè SSMEXF_SERVERá ä TCreateEventAá$ äTPEMRSETWINDOWORGEXã< äTSHGetFileInfoP ä TSO_RCVBUFèTIPropertyStorage_SetTimes_Stub㤠äVSTATUS_DATATYPE_MISALIGNMENTáÀ äVGetStringTypeAãÜ äVtagMIXERCONTROLAáü äVX942_DH_PARAMETERSëVIInternetThreadSwitch4 ä Wlogic_errorâT äWDISABLE_MAX_PRIVILEGEp äWtagEMRRESTOREDCêWJOB_CONTROL_RESUMEã° äXERROR_INVALID_STATEâÐ äXDMPAPER_LETTER_PLUSê%XIInternetProtocolRoot_Terminate_Stubá  äYERROR_INVALID_LEVELâH äYmciGetDeviceIDFromElementIDWé YLockRegionãt äZfreopen⌠ä Z_MSL_ERRNOã  äZHBITMAP__¼ äZbV4YPelsPerMeteré ZCALLTYPEáð ä[output_iterator_tagâ ä[CACHE_S_FIRST  ä [midiInOpenã8 ä [tagAUXCAPSAê[RPC_X_INVALID_TAGè\MSSIPOTF_E_FILEâ” ä]SUBLANG_ARABIC_BAHRAINãÀ ä&]@class$7641clientEngine_dbg___pchà ä]MaximumPartitionCountü ä]PSINJECT_PAGEBBOX ä]DMBIN_ENVELOPEã, ä]WM_APPë]MIXERR_INVALVALUEl ä^MAX_VOLUME_TEMPLATE_SIZEé&^IXMLDOMNamedNodeMap_nextNode_StubÌ ä'_DNS_ERROR_SECONDARY_REQUIRES_MASTER_IPãà ä_LPNMHDRê_NdrNsSendReceiveé`OLDFONTENUMPROCWá, äabinary_ioH äais_integral_impâh äaERROR_PROCESS_ABORTED äaERROR_UNKNOWN_PRINTER_DRIVERá° äaPFD_DRAW_TO_WINDOWãÌ äaEMRSETTEXTALIGNâà äaCERT_IDêaIID_IPSFactoryã  äbGetSecurityDescriptorDaclèbSCHED_E_TRIGGER_NOT_FOUND` äc__encode_mbyteãx ä cDataOffsetã” äcCompletionPortã¼ äcERROR_NO_WILDCARD_CHARACTERSáØ äcSCARD_SPECIFICëcCFSTR_MIME_PJPEGá ädhKeyEncryptionKey< ädNdrEncapsulatedUnionMemorySizeë dWINSCARDAPIâ| äeHEAP_REALLOC_IN_PLACE_ONLY㜠äeInterlockedDecrementáÄ äeJOB_NOTIFY_FIELD_SUBMITTEDãä äeIID_AsyncIPipeByteëePODBC_VS_ARGS äfAddressOfEntryPointâ4 ä fSystemLoadãT äfERROR_INVALID_PROFILEl ä fHCONVLIST__†ä fSQL_TRUEéfSQL_CONVERT_BIGINT㸠ä g_MSL_ERRORãÔ ägFindResourceExëgSetConsoleCursorPositionéhERROR_PRINT_CANCELLED4 äjCharUpperBuffWãX äjWINDOW_BUFFER_SIZE_RECORDt äjauxGetDevCapsA㘠äjRpcNsProfileEltInqNextãÄ ä jCERT_NAME_FRIENDLY_DISPLAY_TYPEêjSQL_SCROLL_CONCURRENCYã äkLPWIN32_FILE_ATTRIBUTE_DATAâ4 äkWNetGetResourceParentWãd ä$kPCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA⌠äkWRITE_COMPRESSION_INFO_VALIDék_DATATYPES_INFO_1AãÈ älTAPE_GET_POSITIONØ älHashélIXMLDOMNode_put_text_Stub ä mround_errorâ@ ä&m@class$7642clientEngine_dbg___pchh ämLPEVENTLOG_FULL_INFORMATIONêmMCI_SAVE_PARMSW✠ä nSKF_TRISTATEáÄ änPCERT_AUTHORITY_INFO_ACCESSâà änLPREMFORMATETCë$nSetSoftwareUpdateAdvertisementStateâ0 äoPAN_CONTRAST_VERY_LOWP äoOffsetViewportOrgExâx äoszOID_PKIX_KP_IPSEC_TUNNELëopMallocFreeStruct¤ ä printl¼ ä pHMETAFILE__âØ äpSPI_SETSHOWSOUNDSèpSubjectAlgorithmá  ä qSCARD_W_EOFêqRCRYPT_FAILEDD ärPIMAGE_TLS_DIRECTORYá\ ä rIMAGE_ICONã| ärIID_IOleInPlaceSiteê rSQL_OJ_LEFTâ´ äsPKCS_7_ASN_ENCODINGêsSQLROWSETSIZEètTPM_HORIZONTALã äuPCERT_PUBLIC_KEY_INFOèuCMSG_SIGNER_AUTH_ATTR_PARAMâX ävTAPE_PSEUDO_LOGICAL_POSITIONát ävOLDFONTENUMPROCAᘠävWINSTA_WRITEATTRIBUTES㬠ävIP_TOSãÈ ävCRYPT_MODE_CBCãð ävNdrServerContextUnmarshallëvSQL_AT_ADD_COLUMN4 äwszOID_INFOSEC_SuiteASignatureè wSetLibFlagsât äxMIXERLINE_TARGETTYPE_MIDIOUTጠä xLPDOC_INFO_1ᤠä xGetSizeMaxã¼ ä xCPS_COMPLETEéxIME_ESC_PRIVATE_LASTáð äyMOM_CLOSE äymidiOutGetErrorTextâ( ä ySwitchSinkã@ ä ySQL_CB_NULLê"ySQL_GB_GROUP_BY_EQUALS_SELECTx ä zrintfŒ äzLB_MSGMAX  äzBIN_RANGE¸ ä zLPDOC_INFO_3áØ äzNODE_ENTITY_REFERENCEð ä zSQL_OJ_FULLêzSQL_CODE_MINUTEâ$ ä{RT_GROUP_ICON@ ä{MCI_DEVTYPE_VCRâ\ ä{MCI_SAVE_PARMSAê {LPDOC_INFO_2á ä|CharUpperBuffA㬠ä|auxGetDevCapsWë |removeChildâð ä&}@class$7643clientEngine_dbg___pch ä }DMBIN_UPPERâ, ä}WNetGetResourceParentAãL ä}_DATATYPES_INFO_1Wãx ä&}ISequentialStream_RemoteRead_Stub˜ ä}CFSTR_MIME_X_MSVIDEOé}SQL_CDO_CREATE_DOMAINØ ä~ERROR_SHARING_PAUSEDáô ä~offDescriptionã ä~RPC_C_USE_INTRANET_PORTê ~FOF_SILENTãH ä tagCALPSTRëSQL_FETCH_FIRST_SYSTEMã| ä €first  ä€CO_E_FAILEDTOGETWINDIRãÀ ä€ColorMatchToTargetãÜ ä€LCMAP_HIRAGANAë€MSHLFLAGS_TABLESTRONG ä NameStringëGMEM_NOT_BANKEDâ\ ä!‚AuditEventDirectoryServiceAccessáp ä ‚ReadFileᘠä‚CRYPT_E_STREAM_MSG_NOT_READYá° ä‚ES_WANTRETURNè ‚WritePrinteráØ ä ƒE2BIGø äƒCreateHalftonePalette$ ä!ƒPRINTER_STATUS_USER_INTERVENTIONá< ä ƒFILEOKSTRINGéƒSQL_ASYNC_ENABLE_ON†ä„POSTSCRIPT_PASSTHROUGH㘠ä„DNS_FILTEROFF¼ ä„CERT_CHAIN_POLICY_BASEãà ä„DPD_DELETE_UNUSED_FILESâð ä„_ichá ä„SQL_API_SQLGETDIAGRECè„SQL_FN_NUM_EXPãD ä …NTE_BAD_DATAá` ä…PAN_SERIF_SQUAREé…_CERT_PUBLIC_KEY_INFO˜ ä †BackupWriteê†DEBUGHOOKINFOÐ ä‡?$__num_bits@$0HPPP@áè ä ‡palPalEntryâ ä‡SPI_GETFONTSMOOTHINGé&‡__IViewObject_INTERFACE_DEFINED__T äˆ?$is_floating_imp@Mât äˆERROR_MEDIA_OFFLINE☠äˆDialogBoxIndirectParamAâ¨ ä ˆs_netÄ äˆHOST_NOT_FOUNDãä äˆPCERT_RDN_VALUE_BLOBáô äˆLPHKLèˆSQL_FD_FETCH_FIRSTã, ä‰islessgreaterD ä ‰__vector_impá` ä‰SCS_PIF_BINARYë ‰pcRefParent☠äŠ?$is_floating_imp@Oâ´ äŠMCI_DEVTYPE_LASTáÔ äŠ_CERT_ALT_NAME_INFOêŠCERT_FRIENDLY_NAME_PROP_IDã ä ‹double_tá0 ä‹?$is_floating_imp@Nâ` ä%‹IInternetSession_CreateBinding_Proxyé ‹URLTEMPLATEâ äŒ__stable_sort  ä ŒHTTOP¼ äŒSPI_SETTOGGLEKEYSè)ŒAsyncIAdviseSink_Begin_OnDataChange_Stubá$ ä*IXMLDOMNamedNodeMap_removeNamedItem_ProxyèLPQUERY_SERVICE_LOCK_STATUSAál äŽVER_SUITE_EMBEDDEDNTጠäŽIsCharAlphaNumericW⬠äŽFinish_QueryInterfaceØ ä"ŽICreateTypeInfo_AddImplType_ProxyèŽSQL_SIMULATE_CURSORâ$ ä!MultinetGetConnectionPerformanceáD äMCI_SEQ_STATUS_TEMPOá\ ä GetContainerá ä)IOleInPlaceSite_CanInPlaceActivate_ProxyéSQL_DATA_SOURCE_NAMEáÄ äappendãÜ ä IPPORT_SMTPêFILE_SPECIAL_ACCESSâ  ä’DOMAIN_GROUP_RID_USERSãD ä’DNS_ERROR_SECONDARY_DATAé!’CERT_INFO_SUBJECT_UNIQUE_ID_FLAGጠä“SINGLE_LIST_ENTRY¤ ä“_TAPE_PREPAREÀ ä“FlushViewOfFileâØ ä “iMaxSocketsâð ä “SCardConnecté!“IXMLDocument2_get_mimeType_ProxyáD ä”RPC_E_SERVERCALL_RETRYLATERâ\ ä ”MF_SYSMENUë”PARAMFLAG_FINè •TEXTCAPSᜠä–hCursorê –CMSG_HASHEDâØ ä—OLEMISC_ACTSLIKEBUTTONë—CDN_FOLDERCHANGEá ä˜TA_MASKâ( ä˜IsCharAlphaNumericAâ< ä˜EnumPropsh ä ˜MCI_OVLY_GETDEVCAPS_CAN_STRETCHê˜CryptHashPublicKeyInfoã´ ä™FRS_ERR_PARENT_TO_CHILD_COMMáÐ ä™lpRemainingPathê™CTL_FIND_SUBJECT_PARA! ä šdwNumberá ! äšRPC_C_AUTHN_MQã ä&ÙSEF_DEFAULT_DESCRIPTOR_FOR_OBJECT@> ä ÙEMR_SAVEDCã\> äÙPFIND_NAME_BUFFERt> ä ÙSOCKADDR_INâˆ> äÙCertIndex > ä ÙBufferSizeë#Ù__ICodeInstall_INTERFACE_DEFINED__ãô> äÚVER_NT_DOMAIN_CONTROLLERá ? ä ÚMMIO_TOUPPERéÚURLPOLICY_LOG_ON_ALLOWãD? äÛwcsrtombsp? ä&ÛITypeInfo2_GetParamCustData_Proxy˜? äÛBINDSTATUS_MIMETYPEAVAILABLEáÔ? ä0ÛIInternetSecurityManager_ProcessUrlAction_ProxyêÛSQL_OJ_NOT_ORDEREDã@ äÜLPLAYERPLANEDESCRIPTORã<@ äÜcRecipientEncryptedKeysâT@ ä ÜtagREGKINDëÜSQL_DL_SQL92_INTERVAL_MONTHâœ@ äÝIMAGE_SCN_LNK_INFOã¼@ äÝPTHREAD_START_ROUTINEÐ@ äÝp_aliasesü@ ä&Ý@class$7748clientEngine_dbg___pch$A äÝIEnumOLEVERB_RemoteNext_Stubá8A ä ÝpStorageé ÝPROPVARIANTêÞREGDB_E_CLASSNOTREGâA äßCheckTokenMembershipá¸A äßWNetGetResourceInformationãÔA äßget_XMLDocumentâüA äßIXMLElement2_get_type_ProxyêßFR_DIALOGTERM0B äàbasic_iostreamãPB äàPROCESS_VM_OPERATIONátB äàCryptCreateAsyncHandleã˜B äà__ITypeLib2_FWD_DEFINED__°B ä àLoadTypeLibêàSQL_DESC_LITERAL_SUFFIXâèB äáLC_LASTâC äáRPC_S_COMM_FAILUREã C ä áHCRYPTASYNCâ0C äámtimeèáVarIntFromDecèâRegisterEventSourceê!ãCERT_SYSTEM_STORE_LOCATION_SHIFTá´C ääERROR_INVALID_ACCESSáÌC ä äVkKeyScanExWáèC ääBS_AUTOCHECKBOXê äSendReceiveâ(D äålpMinimumApplicationAddressâXD ä&åCOMQC_E_QUEUING_SERVICE_NOT_AVAILABLEèåAPD_STRICT_DOWNGRADEáD ä æCDS_GLOBALã´D äæCERT_STORE_PROV_FILENAMEáàD ä&æIMarshal_UnmarshalInterface_ProxyE äæSTGMEDIUM_UserUnmarshalâ8E ä(æIXMLHttpRequest_get_responseStream_StubêæLPENUM_SERVICE_STATUS_PROCESSAã|E ä çWAVECALLBACKáE äç__RPC_H__°E äçPERF_DISPLAY_PER_SECé çPORT_INFO_3AéèSCARD_W_REMOVED_CARDáüE äéREFIIDãF äéWNNC_NET_FARALLONERROR_QUORUM_RESOURCEèõ ä >lpszPortáö ä>PCRYPT_CSP_PROVIDERâ(ö ä>PositionCapabilitiesáTö ä >AsyncIUnknown_Begin_AddRef_Stubê>SERVERCALL_RETRYLATERö ä?GetMenuStringWã¨ö ä?SetWindowLongè ?CALG_SHAáàö ä@FILE_ATTRIBUTE_READONLYâüö ä@EDITWORDBREAKPROC÷ ä@SSGF_NONE(÷ ä @lpstrAliasë @CC_CDECLáL÷ äAfilláp÷ äAVER_SUITE_SINGLEUSERTSãŒ÷ äALPSTARTUPINFOWã¬÷ äARPC_E_INVALID_OBJREFé!A__ICreateTypeInfo2_FWD_DEFINED__âø äBSEM_NOALIGNMENTFAULTEXCEPTãø ä BBACKUP_DATAâ@ø äBDISPLAY_DEVICE_MODESPRUNEDã\ø äBWM_NCRBUTTONUPãtø äBMCI_SEQ_SMPTE¬ø ä+BCERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAGãÄø ä BSTGMOVE_COPYáØø äBtagOIFIêBSQLRemoveDefaultDataSourceã ù äCWORKERCALLBACKFUNCãHù äCERROR_DS_RECALCSCHEMA_FAILEDá\ù äCfResponse|ù äCPERF_COUNTER_DELTAãœù äCszOID_OIWSEC_shaDSAêCPSD_MINMARGINSãÌù ä DNextCharáàù äDHeapAllocüù äDSetGraphicsModeâú äDSSWF_NONE,ú äDLPSOUNDSENTRYAëDX509_MULTI_BYTE_INTEGERâhú äE?$__char@$0A@„ú äEtagNEWTEXTMETRICAèEBINDSTRING_HEADERSã¸ú äFPtrToLongäú ä&FERROR_DS_SCHEMA_UPDATE_DISALLOWEDû äFtagEMRSETMAPPERFLAGSá(û äFSPI_SETGRIDGRANULARITYãDû äFRPC_X_NO_MEMORYâXû äFLPCOLESTRtû äFExchangeFromSlotáû äFVarDecFromUintëFSQL_API_SQLROWCOUNTâÈû ä GMessageBoxExéGCryptSetProviderWôû äHFILEáü äHfileá$ü äHCS_E_PACKAGE_NOTFOUND8ü äHmtTypeãPü ä HCLR_INVALIDâhü ä HGCL_HICONSMâ€ü äHPINPUT_RECORD”ü äHVFT_APPê$HICreateTypeLib_CreateTypeInfo_ProxyêIImmediateðü äJOLEOBJ_E_LASTè!JPRINTER_NOTIFY_FIELD_SERVER_NAMEáHý äKclass_has_trivial_default_ctorãXý ä Kbeginxý äKMIXERLINECONTROLSWã”ý äKCMSG_SIGNER_INFOá´ý äKPIDMSI_STATUS_DRAFTêKSQL_FETCH_NEXTãüý ä&L@class$7573clientEngine_dbg___pchþ äLERROR_LABEL_TOO_LONGáHþ ä!LRPC_C_MQ_AUTHN_LEVEL_PKT_PRIVACYá`þ äL_CMS_KEY_INFOè LwFuncFlagsã”þ äMX509_EXTENSIONSê'MIXMLDocument_get_fileModifiedDate_Stubãèþ äNIMAGE_SCN_CNT_CODEãüþ äNtagSIZEâÿ ä NPLOGPALETTEê NULISet32áXÿ ä%OERROR_DEVICE_REINITIALIZATION_NEEDEDátÿ äOStrokeAndFillPathˆÿ äOHTERRORâ¤ÿ äOSetLastErrorExãÀÿ äOCBF_FAIL_ADVISESáÜÿ äOCOLORMGMTDLGORDâðÿ äOwChannels ä O__IXMLHttpRequest_FWD_DEFINED__êOVarUI2FromDateãP ä PPlayMetaFileáh ä PEM_GETMODIFYሠäPMB_ERR_INVALID_CHARSᨠäPNdrCorrelationFreeë"PICreateTypeInfo_SetGuid_Proxyè ä Q__io_statesâü äQHUGE_VALL äQOutputIteratorã@ äQDOMAIN_GROUP_RID_CERT_ADMINSád äQWin32ServiceShareProcessሠäQERROR_SERVICE_START_HANGá  ä QWM_SYNCPAINTá° äQFALTáÌ äQCryptSetProviderAè QCAFLTð äRSETXONã ä RCM_IN_GAMUTâ( äRTranslateCharsetInfoáD äRLPSOUNDSENTRYWãT äR_IOâx äRCLSCTX_INPROC_SERVER16ë RVarR4FromUI4ḠäSERROR_BOOT_ALREADY_ACCEPTEDâØ äSTYPE_E_TYPEMISMATCHâð ä SMETAFILEPICTá  äStagNEWTEXTMETRICW$ ä SEMR_POLYDRAWá@ äSMCIERR_NO_WINDOWád äSszOID_PKIX_KP_SERVER_AUTHŒ ä"Ssz_CERT_STORE_PROV_PHYSICAL_W° äSCTL_FIND_NO_SIGNER_PTRëSIEnumVARIANT_Clone_Stubâì ä TDM_TTOPTIONã äTDSS_RIGHT( äTCERT_AUTHORITY_KEY_ID_INFOë TVarR4FromUI2áX ä UBS_PATTERNë UQS_MOUSEMOVEá” äVSID_MAX_SUB_AUTHORITIESâ° äVLOCK_EXCLUSIVEëVSQL_SG_INSERT_COLUMNáì äWLPSTARTUPINFOAã äWDMBIN_TRACTOR( äWTAPE_RETURN_STATISTICSã< äWMiniQicâT ä WpEnvironmenté WVarR4FromUI1á” äXERROR_RESOURCE_NAME_NOT_FOUNDèXSQLRemoveDriverâÐ äYVS_FF_SPECIALBUILDãô äYNdrServerInitializeNewã äYget_ownerDocumentèYSQL_API_SQLTABLEPRIVILEGESã` äZERROR_TOO_MANY_SEM_REQUESTS†äZPMENU_EVENT_RECORDëZpwszServerNameã° ä[HUGE_VALFÄ ä[CE_PTOãä ä[DosDateTimeToFileTime ä[tagMCI_ANIM_RECT_PARMSã( ä[PMCI_OVLY_RECT_PARMSáD ä[OPENCARDNAME_EXâh ä[IEncodingFilterFactoryã„ ä[tagPARAMDESCEXë[Opená¼ ä"\ERROR_CLUSTER_NODE_ALREADY_UPÔ ä \SQL_C_USHORTé\SQLAllocHandleStd ä]ihBrushâ  ä]ATF_ONOFFFEEDBACK@ ä]MIXERLINECONTROLSAë]RPC_C_AUTHN_DCE_PRIVATEâ| ä^EMRSETICMMODE  ä^CLSID_CCDCommandButtonë^SQL_AT_ADD_COLUMN_SINGLEáÜ ä _first_falseâü ä_LOCALE_SYSTEM_DEFAULTè_VP_TV_STANDARD_PAL_60è`PST_RS232L äbERROR_INVALID_CMMl äbRPC_BUFFER_NONOTIFY☠äbFILE_DEVICE_MULTI_UNC_PROVIDER㬠äbPSN_RESETä ä+bAsyncIAdviseSink_Finish_RemoteOnSave_Proxyã ä$bITypeInfo2_GetVarIndexOfMemId_Proxyâ4 äbImmEnumRegisterWordêbSQL_MAX_BINARY_LITERAL_LENãt äcJOY_CAL_READ3  ä!cCERT_VERIFY_TRUSTED_SIGNERS_FLAGáÌ ä!c_LPIINTERNETPROTOCOLSINK_DEFINEDáì äcACTIVEOBJECT_STRONGêcSQLGetInstalledDriversã0 ädERROR_INVALID_MEMBERáH ädJOY_CAL_READ4h ädtagMCI_BREAK_PARMSã ädCHANGER_READ_ELEMENT_STATUSêdUnRegisterTypeLibÐ äeIMAGE_SCN_MEM_PURGEABLEâô äeCO_E_SERVER_START_TIMEOUT äeR2_NOTCOPYPEN ä ePWR_FAILá8 äeJOY_CAL_READ5` äeSORTED_CTL_EXT_FLAGS_OFFSETâx äetagCSPLATFORMèeGetIIDFromOBJREFᬠä f_MSL_INLINEâÄ äfJOY_CAL_READ6ä äfMCI_OPEN_ELEMENT_IDâ äfURLMON_OPTION_URL_ENCODINGë fPSD_MARGINSâL ä"hACCESS_MAX_MS_OBJECT_ACE_TYPEt ähGROUP_SECURITY_INFORMATIONã” ähREFERENCE_BLACK_MAXêhSQL_SCCO_OPT_ROWVERâØ äiJOB_OBJECT_LIMIT_AFFINITYô äiVIF_BUFFTOOSMALLé iVarCyRoundã, äjIMAGE_SCN_LNK_COMDATáH äj_NETINFOSTRUCTãh äjLPRUNNINGOBJECTTABLEéjPIDDSI_HIDDENCOUNTã° äkFILE_ACTION_RENAMED_NEW_NAMEékOleSaveâà älptMaxTrackSizeëlOPENCARDNAME_AëmSPLDS_PRINT_LANGUAGEá8 änSTDAPIVCALLTYPEâ` änIMAGE_REL_SH3_DIRECT8_LONGãt änGDI_ERROR˜ änSPI_GETGRIDGRANULARITYã´ änVerLanguageNameAénMCIERR_NULL_PARAMETER_BLOCKêoDeletePrinterDataWã äp_MCW_RCêpPREMSECURITY_ATTRIBUTESâ\ ä"qIMAGE_REL_SH3_STARTOF_SECTIONt ä qDM_COLLATE㌠ä qPEMRMASKBLT✠äqwID⬠äqRefIdè qcafltä ärLOCALE_IDEFAULTANSICODEPAGEã ärWNNC_NET_DECORBâ$ ärPCERT_SYSTEM_STORE_INFOêrSTATFLAG_NONAMEâd äsTYPE_E_LIBNOTREGISTERED†äsUserIndexWrites☠ä sOnResponseãÌ ä*sIBindHost_RemoteMonikerBindToStorage_StubèsSERVICE_STATUSã ätx_is_left_childâ( ätIMAGE_REL_ALPHA_BRADDRã@ ä tMK_S_FIRSTã\ ätPAN_WEIGHT_BOLDâx ätEnumDateFormatsêt??_7IDataFilter@@6B@á´ äuDCBA_FACEUPCENTERè uComputerNameáä ävTOKEN_CONTROL  ä"vSCHED_E_SERVICE_NOT_INSTALLED, ävIOleLink_Update_Stubé2vIInternetZoneManager_SetZoneCustomPolicy_Stubx äwlpVerb㘠äwPORT_STATUS_TYPE_INFOèwSQL_SERVER_NAMEâÌ ä xe32_borderãè äxVerLanguageNameWá äxtagRemHPALETTEã ä xELEMENT_TYPEá@ äxDeviceNotSelectedTimeouté xSetPrinterãx äyRPC_E_SYS_CALL_FAILED äyC3_NONSPACING° äyMCI_INFO_MEDIA_UPCãÐ äyDeletePrinterDataAãô äyIStream_RemoteSeek_Stubâ äydblValã  ä yGetTypeCompêySOFTDIST_ADSTATE_DOWNLOADEDâd äzGETSCALINGFACTORá| ä zGWL_WNDPROC✠äzCopyAcceleratorTableáÀ äzWAVECAPS_SAMPLEACCURATEâà äzMCI_ANIM_STEP_REVERSEü äzCRYPT_CREATE_IVâ ä zBSTRBLOBá, äzOPENCARDNAME_Wã@ ä zlpvardescèzSQL_FN_NUM_LOGãp ä{refCount_Œ ä{C2_RIGHTTOLEFTã´ ä{MIXERCONTROL_CONTROLTYPE_PANáÔ ä{UserKeyingMaterialë{_DISK_HISTOGRAMâ ä|_RC_UPã ä|mid1á( ä|WH_MAXã@ ä |SMTO_BLOCKãX ä |mmioFOURCC㈠ä%|IXMLDOMNode_put_nodeTypedValue_Proxyá´ ä&|__IXTLRuntime_INTERFACE_DEFINED__Ü ä|URLPOLICY_NOTIFY_ON_DISALLOWé|SQL_TXN_CAPABLEâ  ä}wcsxfrmâ$ ä }Default_Bigê&}ERROR_DS_ATTRIBUTE_TYPE_UNDEFINEDp ä~_InitializeThreadDataè~ihCSá  ä__create_or_truncateá° ämid2áÈ ä LANG_BENGALIáð äSPAPI_E_NO_CLASS_DRIVER_LISTá ä otmFillerèSPLDS_DRIVER_NAME< ä€SCS_DOS_BINARYãl ä$€CERT_PHYSICAL_STORE_ENTERPRISE_NAMEê€_REMSECURITY_ATTRIBUTES⬠äDMPAPER_TABLOIDâÄ ä NCBFINDNAMEêpCertInfoô ä‚LANG_PORTUGUESEâ ä‚MMIO_DEFAULTBUFFERã< ä‚CERT_STORE_ALL_CONTEXT_FLAGâ` ä‚_CERT_SYSTEM_STORE_INFOâx ä ‚put_lengthë‚RegisterDragDropᨠäƒbinder1stÐ äƒPIMAGE_ROM_OPTIONAL_HEADERë0ƒAsyncIAdviseSink_Begin_RemoteOnViewChange_Proxyâ( ä„GetViewportOrgExáD ä„_BYTE_SIZEDARRë'„IXMLDocument2_get_fileUpdatedDate_Stubã” ä…ENUMRESLANGPROCâ´ ä…LPMCI_WAVE_SET_PARMSáÌ ä …CRYPT_ONLINEáè ä…X509_NDR_ENCODING  ä…CRYPT_OID_INFO_SIGN_KEYâH ä0…AsyncIAdviseSink_Finish_RemoteOnViewChange_Stubê'…IXMLDOMCharacterData_replaceData_Proxyã  ä†RPC_S_PROTSEQ_NOT_FOUNDâ¼ ä†DV_E_FORMATETCãÔ ä †EnumMonitorsé†SQL_PT_UNKNOWNã ä‡EV_CTSã ä‡CreateProcess0 ä ‡LINECAPSáD ä ‡ctlFirsté ‡CRYPT_SFáp ä ˆEncryptFileAá” äˆERROR_BAD_USER_PROFILE㸠äˆPSD_DISABLEPAGEPAINTINGêˆSQL_API_SQLTRANSACTâè ä ‰__stdü ä‰__treeã ä ‰N_TMASK2á$ ä‰UnionRect< ä ‰IPPROTO_ICMPáL ä‰bindád ä ‰ALG_SID_ANYê‰SQL_NEED_DATA  äŠSUBLANG_SPANISH_HONDURASé ŠN_TMASK1áÜ ä"‹??_Eout_of_range@std@@UAE@I@Zø ä‹GetLongPathNameWá ä‹BeginUpdateResourceWá@ ä‹MCI_VD_GETDEVCAPS_FAST_RATEê‹IBlockingLock_Unlock_Stub| ä ŒWHDR_ENDLOOPéŒSQL_AM_STATEMENTᬠämake_pairÔ äIMAGE_REL_SH3_DIRECT8_WORDãì ä CIEXYZTRIPLEá äCTRY_VENEZUELAã0 äRESOURCEDISPLAYTYPE_SERVERãP äCMSG_CMS_SIGNER_INFOá„ ä'CRYPT_OID_IMPORT_PRIVATE_KEY_INFO_FUNCë*CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAGÐ äŽPPACKEDEVENTINFOéŽLBS_DISABLENOSCROLLâ! äWNetGetConnectionAã@! ä&IXMLDOMImplementation_hasFeature_Stubè_pszáh! ä CREATESTRUCTéIInternetProtocolRootœ! ä‘copy_bits¼! ä‘ERROR_TRUST_FAILUREâÜ! ä‘dwImpersonationLevelé‘SQL_MAX_QUALIFIER_NAME_LENã" ä ’CloseHandleâ<" ä’DeregisterEventSourceT" ä’offPalEntriesx" ä’BF_DIAGONAL_ENDTOPLEFTë’SQL_API_SQLGETTYPEINFOã°" ä“E_ABORTâÌ" ä“RpcBindingFreeãè" ä“WSAGETASYNCERRORá # ä“??_7IMessageFilter@@6B@ê“SQL_HANDLE_ENVãL# ä”_FILE_NOTIFY_INFORMATIONád# ä ”GlobalAllocâ|# ä”MapDialogRect”# ä ”BlockNumberê”SQL_SYSTEM_FUNCTIONSáÈ# ä•signbitâä# ä•dwFillAttributeâü# ä •dmPelsWidthê•SQL_SPEC_MAJORã<$ ä–ERROR_DS_EPOCH_MISMATCHâ`$ ä–IP_DEFAULT_MULTICAST_LOOPè–IBindStatusCallbackâ˜$ ä —RegOpenKeyë—XST_ADVACKRCVDãÌ$ ä ™CE_OVERRUNãì$ ä™WNetGetConnectionWã% ä ™ABM_GETSTATEá,% ä™_CMSG_CONTENT_ENCRYPT_INFOãL% ä™get_fileUpdatedDateê™PROPSETFLAG_CASE_SENSITIVEã˜% äš_MSL_USES_EXIT_PROCESSã¸% äšIMAGE_REL_ARM_GPREL7áÔ% äšOFS_MAXPATHNAMEâô% äšERROR_LOGON_FAILUREâ& äšCALG_SCHANNEL_MASTER_HASHèšdwRevocationResultãP& ä ›PLIST_ENTRYâp& ä›PAN_BENT_ARMS_WEDGEê›CreateDialogIndirectParam¬& ä œODT_LISTBOXâÌ& äœCONNDLG_CONN_POINTë œSQL_C_SSHORTâ' äGetLongPathNameAá ' äBeginUpdateResourceAá4' ä ODA_FOCUSètagRemHGLOBALd' ä žEncryptFileWáˆ' äžRPC_S_NO_ENDPOINT_FOUNDâ¨' äžCO_E_ACESINWRONGORDERèž__IRpcHelper_FWD_DEFINED__ãä' äŸne_csipâ( äŸtagEMRCREATEPALETTEê ŸWinExecErroráH( ä! PJOBOBJECT_BASIC_UI_RESTRICTIONSáp( ä DNS_ERROR_INVALID_ZONE_TYPEâˆ( ä  CharUpperAë  IXMLDOMNodeList_get_length_StubâÈ( ä¡szlStrokeè( ä¡SHOW_OPENNOACTIVATEã) ä ¡XTYPF_NODATAá ) ä¡MCI_FORMAT_SAMPLESë ¡SHDOCAPI_è¢SW_FORCEMINIMIZEé"£__IRecordInfo_INTERFACE_DEFINED__è¤EMR_SETVIEWPORTORGEXá¼) ä¥RPC_IF_CALLBACK_FNãÜ) ä¥CounterHelpTitleIndexø) ä¥CERT_OTHER_NAMEê¥PCERT_DH_PARAMETERSâ,* ä¦EMRLINETOD* ä¦tagEMRFILLRGNX* ä¦tv_secãh* ä¦HIMCCè¦ODBC_INSTALL_DRIVERâ * ä §KSPIN_LOCKã¸* ä §LockRunningâÌ* ä§LPBINDPTRè* ä§GetActiveObjectê§SQL_SP_EXISTS(+ ä"¨RPC_E_SERVER_CANTMARSHAL_DATAD+ ä¨RPC_E_NO_CONTEXTáX+ ä ¨rclFrameé¨MCI_VD_ESCAPE_PARMSâ”+ ä©timeGetSystemTime¤+ ä ©cbOIDÌ+ ä©CERT_BASIC_CONSTRAINTS_INFOâü+ ä$©ITypeInfo_LocalAddressOfMember_Stubê©SQL_SG_WITH_GRANT_OPTIONá4, ä ª_MMIOINFOè)ªIInternetSession_RegisterNameSpace_Proxyé«FIONBIOâ”, ä¬PRIVILEGE_SET¬, ä ¬ONESTOPBITãÈ, ä¬SetViewportOrgExé ¬PDISK_RECORDá- ä­SEC_I_COMPLETE_AND_CONTINUEê­MKRREDUCE_THROUGHUSERD- ä®RegisterClassExAé®CRYPT_LITTLE_ENDIANâx- ä¯wctombã - ä¯OSS_MEM_MGR_DLL_NOT_LINKEDã¼- ä¯mciGetErrorStringÔ- ä ¯IPPORT_FTPãè- ä ¯pszOEMUrlá. ä ¯ICallFactoryé¯SQL_SQ_EXISTS@. ä°ERROR_DS_NAME_TYPE_UNKNOWNë°ReleaseTLibAttrâ„. ä±SUBLANG_ENGLISH_SOUTH_AFRICAá . ä±EMR_SETTEXTCOLORé±IOleCacheControl_OnRun_Stubâì. ä²ERROR_WMI_DP_NOT_FOUNDã/ ä²CertSaveStore / ä²VarUI2FromDispë²_OLESTREAMVTBLã\/ ä³CHANGER_MOVE_MEDIUMâ|/ ä³PRINTER_ENUM_SHAREDê³GCS_COMPREADCLAUSEë´IME_CMODE_HANJACONVERTãà/ äµ__copy_longs_alignedâ0 äµGetUserDefaultLangIDá(0 äµCRYPT_CACHE_ONLY_RETRIEVALãT0 ä&µ_CRYPT_ASYNC_RETRIEVAL_COMPLETIONd0 ä µindex|0 ä µBIND_FLAGSë"µPSD_INHUNDREDTHSOFMILLIMETERS¸0 ä¶second_âÔ0 ä¶__merge_backwardáì0 ä ¶CharUpperWä1 ä ¶DT_RIGHTá 1 ä¶PDDEML_MSG_HOOK_DATAá81 ä ¶VT_UINT_PTRê¶SERVICE_CONTROL_INTERROGATEâ„1 ä·MSSIPOTF_E_TABLE_TAGORDERè·IAdviseSink_OnClose_StubáÄ1 ä¸RegisterClassExWé ¸PID_ILLEGALâð1 ä¹iscntrlâ2 ä ¹bKeyDowná,2 ä¹CERT_IE_DIRTY_FLAGS_REGPATHâL2 ä¹ReleaseMarshalBufferé ¹IXMLDOMDocument_createNode_Stubâ 2 äºCMSG_SIGNED_DATA_CMS_VERSIONáÌ2 ä&ºPCRYPT_ASYNC_RETRIEVAL_COMPLETIONè2 äºSetBorderSpaceëºcstringê »fDsrHoldá83 ä¼CERT_STORE_PROV_DELETED_FLAGé¼pwszServerPrincNameâl3 ä½PLOGPENâ3 ä½CERT_STORE_READONLY_FLAGá¬3 ä½IsMatchingTypeë½SQL_SU_DML_STATEMENTSä3 ä ¾LimitFlagsãü3 ä¾cCertPolicyId$4 ä¾ENCRYPTION_CERTIFICATE_LISTâ44 ä¾bInsé¾IOleLink_GetUpdateOptions_Stubãt4 ä¿wstringâ 4 ä&¿??_Ginvalid_argument@std@@UAE@I@Z¸4 ä¿ne_pretthunksÔ4 ä¿WSAECONNREFUSEDê¿CERT_E_UNTRUSTEDTESTROOTá$5 äÀERROR_DS_DRA_OBJ_IS_REP_SOURCEãH5 äÀTRUST_E_NO_SIGNER_CERTãh5 äÀtagEMRPOLYPOLYLINE16á|5 ä ÀxHotspotá5 äÀLZInitëÀSQL_DROP_DOMAINâÄ5 ä ÁLPNUMBERFMTWáÜ5 ä ÁCAFILETIMEëÁSQL_LOGIN_TIMEOUT_DEFAULT6 äÂPMCI_SAVE_PARMSâ@6 äÂCERT_INFO_SUBJECT_FLAGãX6 äÂOLEGETMONIKERè ÂCFS_DEFAULTêÃchar_buffer_overflowá¤6 ä ÄByteSizeáÈ6 äÄPCHANGER_EXCHANGE_MEDIUMéÄSQL_DIAG_ROW_NUMBERêÅSPLDS_PRINTER_LOCATIONSâ7 ä ÆEFPOS07 äÆR2_LASTâL7 äÆEM_GETLINECOUNTâ|7 ä*ÆPRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY˜7 äÆVarIntFromBoolã´7 äÆCF_NOSCRIPTSELëÆSQL_NON_NULLABLE_COLUMNSâ8 äÇERROR_QUORUM_DISK_NOT_FOUNDâ 8 äÇWriteConsoleInputWã<8 äÇAPPCMD_CLIENTONLYèÇMMSYSERR_KEYNOTFOUNDáx8 äÈDMPAPER_ESHEETãŒ8 ä ÈyHotspotá 8 äÈdwFromë3ÈIOleInPlaceActiveObject_TranslateAccelerator_Proxyãð8 äÉ_MTêÉMCIERR_DEVICE_NOT_READYâ(9 ä ÊpvSigneré ÊpAutoHandleâd9 äËsecond_const_referenceãˆ9 äËIMAGE_SCN_ALIGN_2048BYTES¤9 äËEMREXTTEXTOUTAã¸9 ä ËLR_COLORáÐ9 ä ËCTRY_BELGIUMé ËABM_QUERYPOSâ: äÌGMEM_ZEROINIT0: ä$ÌAsyncIAdviseSink_Begin_OnSave_ProxyêÌCC_FPFASTCALLh: äÍMessageBoxIndirectAêÍSQL_AD_ADD_DOMAIN_DEFAULT¤: ä ÎSizeOfDataë ÎVTA_BOTTOMãØ: äÏdwClassContextëÏSQL_DROP_VIEW ; äÐPP_CONTEXT_INFOâ(; äÐOleCreateFromDataèÐImmRegisterWordâd; äÑWriteConsoleInputAëÑRPC_C_OPT_MAX_OPTIONSœ; ä ÒNTE_SYS_ERRâ´; äÒLPFXPT16DOT16È; ä ÒbContrastèÒFORMATETCð; äÓFloatSave< äÓMIDIERR_UNPREPAREDã0< äÓrpc_binding_handle_táT< äÓX509_ENHANCED_KEY_USAGEâp< äÓtagRPCOLEMESSAGEá < ä%ÓILayoutStorage_ReLayoutDocfile_Proxyé%ÓURLPOLICY_CREDENTIALS_ANONYMOUS_ONLYáè< ä ÔLANG_ORIYAä= ä Ôsp_protocolâ= ä Ô_DISK_RECORDá8= äÔWaitForWriteAccessãd= ä"ÔIXMLDOMNamedNodeMap_get_item_StubèÔSQL_CONVERT_TINYINTâ˜= äÕstrtollâ°= äÕTKF_AVAILABLEØ= äÕCRYPT_REGISTER_FIRST_INDEXãì= ä ÕPSUACTIONèÕMDM_V120_SPEED_DEFAULTã > äÖlabsá<> äÖ_MSL_CTYPE_API_HáP> äÖpTypesë ÖIXMLDocument2_put_charset_Proxyâ˜> ä×RDW_ALLCHILDRENâ°> ä ×LPNUMBERFMTAáÐ> ä×IMalloc_GetSize_Stubá? ä)×IAsyncRpcChannelBuffer_GetDestCtxEx_Stubé×DESCKIND_IMPLICITAPPOBJâH? äØLOGON32_LOGON_SERVICE`? ä ØGetPrinterëØSQLWriteDSNToIniW? äÙatexitã¤? äÙMIIM_IDâÄ? äÙGetMenuDefaultItemëÙReleaseMarshalDataãü? ä ÚGCL_WNDPROCê.ÚIXMLDOMElement_getElementsByTagName_ProxyD@ äÛprintfã`@ äÛPOSTSCRIPT_IGNORE€@ äÛMessageBoxIndirectWâ˜@ äÛszDescriptionÈ@ ä&ÛCRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAGè%ÛAsyncIAdviseSink_Finish_OnSave_ProxyáA äÜSEC_E_MESSAGE_ALTERED0A äÜSetWindowWordèÜpBlobDataXA äÝstrtoldâlA äÝVER_EQUALˆA äÝGetCharWidthFloat¤A äÝEMREXTTEXTOUTWëÝPCRL_DIST_POINTâØA ä Þout_stream_âèA ä ÞcJobs$B ä/ÞIRpcStubBuffer_DebugServerQueryInterface_ProxyëÞOleRegEnumVerbsê ßDRV_CANCELãxB äàPeakProcessMemoryUsedŒB äàOffsetã¬B äàObjectOpenAuditAlarmWÔB ä"àERROR_DS_MISSING_EXPECTED_ATTìB äàCharLowerBuffC äàCOLOR_HIGHLIGHTâ,C äàszOID_TELEPHONE_NUMBERãTC äàIRecordInfo_RecordCreate_Stubè)àIPropertyStorage_ReadPropertyNames_ProxyáœC äáwFirstã¸C äáCALLBACK_WINDOWâäC ä!áITypeLib_GetTypeInfoOfGuid_ProxyéáURLZONEREG_HKLMâ D äâ__convert_iteratorãDD äâSECURITY_IMPERSONATIONãdD äâERROR_CORE_RESOURCEâxD äâFloodFillD äâLPD_SWAP_COPY¬D äâNDR_IEEE_FLOATãÀD ä âOLECONTFáôD ä(âIXMLDOMElement_removeAttributeNode_Stubê"âSQL_CDO_CONSTRAINT_DEFERRABLEDE ä"ãACCESS_MIN_MS_OBJECT_ACE_TYPE\E äãDT_CHARSTREAM„E äãCreateScalableFontResourceWêãAnsiUpperÄE ä!äCRYPT_ENROLLMENT_NAME_VALUE_PAIRéäSQL_CA1_RELATIVEéåCB_OKAYâ F ä æ__msl_lowerâ F äæPLOGFONTADF äæLB_GETHORIZONTALEXTENTã`F äæVFT2_DRV_SYSTEMê æDdeAddDataã”F äçfind_last_not_ofá¼F äçPROCESSOR_ARCHITECTURE_INTELáØF äçGetShortPathNameáðF äçWriteConsoleWG äçHGLOBAL_UserMarshalê çITypeLib_GetTypeInfoCount_ProxyâTG ä èe32_ldrsizeâhG ä èlstrlenAá|G äè_hreadã˜G äèDMPAPER_DSHEETã´G äèPARTITION_XINT13áàG ä&èIPSFactoryBuffer_CreateProxy_Stub H ä&è__IDropTarget_INTERFACE_DEFINED__FAILED_ACCESS_ACE_FLAGãpt ä>GetSidSubAuthorityã”t ä>ERROR_INVALID_EA_HANDLEâ¸t ä>SPAPI_E_SECTION_NOT_FOUNDØt ä>RPC_S_ACCESS_DENIEDâu ä$>_CRYPT_CONTENT_INFO_SEQUENCE_OF_ANYâ$u ä>put_XMLDocumentâVarDecFromCyé>IME_SMODE_NONEãtu ä?tagHANDLETABLEãŒu ä?GetClassLongA¤u ä ?MCI_SYSINFOê?SHGFI_ATTR_SPECIFIEDáØu ä@renameãðu ä@runtime_errorv ä @CopyMetaFileá0v ä@WNetGetNetworkInformationWë@MIXERR_INVALLINEéADRAGINFOWxv ä BREG_MULTI_SZáv ä BLC_POLYLINEâ¨v ä BGetIconInfoâÔv ä&BszOID_INFOSEC_sdnsConfidentialityôv äBCHANGER_SET_ACCESSëBIEnumSTATSTG_Reset_Proxyá0w ä CPrimaryGroupáPw äCRPC_E_CALL_CANCELEDâdw ä ClCustDataèCCommDlg_OpenSave_GetFilePathá¬w äDGlobalMemoryStatusExáÈw äDInsertMenuItemãàw äDMCI_INFO_NAMEáx äDFILE_DEVICE_MIDI_OUTéDSERVICE_ACCEPT_POWEREVENTDx äECO_S_NOTALLINTERFACES\x ä EEnumObjectsâxx äEGetTimeFormatAãx ä EIRpcOptionsêEFINDMSGSTRINGÈx äFSUBLANG_ARABIC_JORDANèFPABCáðx ä Ge32_frectabây äGPFN_EXPORT_PRIV_KEY_FUNCá4y äGSCardUIDlgSelectCardáTy äGURLACTION_SCRIPT_RUNáxy äGVarTokenizeFormatStringêGSQL_DESC_MINIMUM_SCALEã¼y äHPAN_LETTERFORM_INDEXáèy ä"HPFN_CERT_STORE_PROV_FREE_FIND_CRLèHPRINTER_CHANGE_SET_PRINTERëICBR_56000@z äJVENDOR_ID_LENGTHé'JSQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATEãŒz äKCriticalError°z äKERROR_DS_DRA_DN_EXISTSëKPICONINFOàz äLPTOKEN_CONTROLãøz ä LPCERT_CHAINâ { äLalDataã<{ ä#LIRpcChannelBuffer_SendReceive_Stubã\{ äLSC_MANAGER_CONNECTëLSQL_COLUMN_OWNER_NAME”{ äMptMaxPosition¸{ äMszOID_RSA_envelopedDataêMSQLGetConfigModeáè{ ä NUINT_PTRá| äNCBS_DISABLENOSCROLLâ | äNRegOpenKeyExW8| äNNETINFOSTRUCT\| äNCryptGetDefaultProviderAáp| ä NIMonikeréNITypeComp_RemoteBind_Proxyã¬| ä OC_ASSERTáÈ| äOotmTextMetricsãà| ä OLPEVENTMSGãø| ä OMIDIERR_BASEá } ä OPMIDIHDRá,} äOSCardDlgExtendedErrorD} ä OVariantStrëOVarUI1FromDateã€} äPGetFontLanguageInfoâ˜} ä PGetClassWordá´} äPdwBufferSecondsâÌ} ä PALG_TYPE_DSSáô} äPIID_IReleaseMarshalBuffersã~ äPPD_ENABLESETUPHOOKëPSQL_MAXIMUM_COLUMNS_IN_INDEXáP~ äQclock_tâd~ äQlrintlã„~ äQDNS_INFO_NO_RECORDSâ°~ ä!QIXMLDOMNode_get_attributes_ProxyéQLPPRINTHOOKPROCâè~ äR_TOKEN_CONTROLã  äRSECURITY_CONTEXT_TRACKING, äRDATE_USE_ALT_CALENDARèRNUMPRS_TRAILING_MINUS` ä Swhat_argáx äSSectionNumber˜ äSFILE_FLAG_OVERLAPPEDá¼ äSERROR_INVALID_PARAMETERâØ äSGetTimeFormatWë SCMS_KEY_INFOá € äTPIPE_CLIENT_ENDâ0€ äTPEMRCREATEBRUSHINDIRECTâP€ äT_CRL_DIST_POINTS_INFO|€ ä TIMarshal_MarshalInterface_Proxyê TCF_EFFECTSã°€ äU__insertion_sortáЀ äUOLE_E_NOCONNECTIONãä€ äUAF_SNAä äUDEVICE_MEDIA_INFOèU??_7ITypeMarshal@@6B@8 äVargument_type` äVWNetGetNetworkInformationAãx ä VwPeriodMinã” äVJOY_BUTTON4CHG㸠äVRpcProtseqEndpointCountâÜ äVCryptImportPublicKeyInfoáø äVtagSTATPROPSETSTG‚ ä VVarI4FromR4êVSQL_SO_DYNAMICãD‚ ä WDSS_NORMALãX‚ äWDRAGINFOA|‚ äWCMSG_SIGNED_ENCODE_INFOâ´‚ ä.WIInternetSecurityManager_GetSecuritySite_Stubè+WIPropertyStorage_DeletePropertyNames_ProxyムäXIMAGE_THUNK_DATAá ƒ äXRegOpenKeyExADƒ äXCryptGetDefaultProviderWéXPCERT_REQUEST_INFO〃 äYmon_decimal_point˜ƒ ä YotmpFaceNameá´ƒ äYCRYPT_OBJID_BLOBé YPERF_BINá؃ äZcap_áìƒ äZMS_NBFë ZVarI4FromR8â„ ä[lrintfãD„ ä![JobObjectEndOfJobTimeInformationáh„ ä[FILE_NOTIFY_CHANGE_SIZEê[ERROR_BAD_ENVIRONMENT´„ ä!]PCMSG_KEY_AGREE_KEY_ENCRYPT_INFOáÜ„ ä]BINDSTATUS_ENDDOWNLOADDATAã… ä.]IInternetSecurityManager_SetSecuritySite_Stubè]SQL_DL_SQL92_TIMED… ä ^NLS_ROMANè^SQL_DL_SQL92_TIMESTAMP㈅ ä_IMAGE_FIRST_SECTION⬅ ä_ERROR_RESOURCE_DISABLEDâÄ… ä _NPEVENTMSGãØ… ä_FOURCCãü… ä_szOID_RSA_messageDigest↠ä _dwAuthTypeã0† ä_SCARD_T0_COMMANDé_URLACTION_ACTIVEX_RUNh† ä `CE_RXPARITY℆ ä`WNNC_NET_LOCUSë`PRINTER_STATUS_OUT_OF_MEMORYáÔ† ä"aEXCEPTION_ILLEGAL_INSTRUCTIONð† äaLPDISCDLGSTRUCTWᇠä aUUID_DEFINEDá,‡ äaI_RpcServerUseProtseqEp2W\‡ ä$aszOID_INFOSEC_mosaicConfidentialityâp‡ äaulKindëaSQLColAttributesW´‡ äbSECURITY_LOGON_IDS_RID_COUNTá̇ ä bPM_NOYIELDãð‡ äbNETSCAPE_SMIME_CERT_TYPEébSQL_QU_INDEX_DEFINITIONâ(ˆ äc_RIP_INFO<ˆ ä cBS_BITMAPècfPortTypehˆ ä d__io_modesㄈ ädPEMRSETICMMODE㘈 ä dOpenIconá´ˆ ädCTRY_UZBEKISTANâ؈ ädLOCALE_SABBREVMONTHNAME8é"d__IXMLAttribute_FWD_DEFINED__‰ äeszLogicalLogFileá@‰ äeLOCALE_SABBREVMONTHNAME9áT‰ ä eNCBHANGUPèe_CERT_DH_PARAMETERS∉ ä fPINT_PTRᬉ äfMCI_STATUS_TIME_FORMATë'fIRpcStubBuffer_DebugServerRelease_Stubãü‰ ägtagHIGHCONTRASTAég_ELEMENT_TYPE8Š ähGetQueuedCompletionStatus\Š ähSEM_NOOPENFILEERRORBOXãxŠ ähSetThreadToken㌊ ährdParmã°Š ähLOCALE_SABBREVMONTHNAME4áÌŠ ähRpcNsGroupMbrAddWìŠ äh_tagBSTRBLOB_DEFINEDá ‹ ähIID_IFillLockBytesë hVarIntFromI1áD‹ äiconst_mem_fun_ref_tâ\‹ ä iLANG_LATVIANál‹ äiPACLጋ äiCRYPT_E_ASN1_NOEODã°‹ äiLOCALE_SABBREVMONTHNAME5éiATTR_TARGET_NOTCONVERTEDáü‹ äjERROR_DS_NAME_TOO_MANY_PARTSá Œ äjLOCALE_SABBREVMONTHNAME6á8Œ ä jLPCMMCKINFOâPŒ ä jclosesocketâ|Œ ä!jCRYPT_OID_CREATE_COM_OBJECT_FUNCé jFORM_INFO_1⸌ äkEXCEPTION_CONTINUE_SEARCHÔŒ äkOUT_DEVICE_PRECISøŒ äkLOCALE_SABBREVMONTHNAME7á( ä#kCRYPT_MESSAGE_KEYID_RECIPIENT_FLAGë kVarIntFromI2ád älIMAGE_SYM_CLASS_SECTION⌠ä"lERROR_DS_NONEXISTENT_MAY_HAVE° älCERT_RSA_PUBLIC_KEY_OBJIDÔ älOPENCARD_SEARCH_CRITERIAél??_7ICreateTypeInfo@@6B@ᎠämERROR_SIGNAL_REFUSEDá4Ž ämSCODE_FACILITYãXŽ ämLOCALE_SABBREVMONTHNAME1é mVarIntFromI4ᄎ änis_object¨Ž änLOCALE_SABBREVMONTHNAME2áÄŽ ändwProviderVersionØŽ änPCRL_INFOôŽ änIProgressNotifyênCoGetInterfaceAndReleaseStreamã< äoWINSTA_ENUMERATEá` äoLOCALE_SABBREVMONTHNAME3á| äoCMS_SIGNER_INFOâ´ ä.oICreateTypeInfo2_SetVarHelpStringContext_StubèoIRecordInfo_GetFieldNames_Stubãô ä p_strcmpiépERROR_QUORUM_OWNER_ALIVEá4 äq_MSL_IMP_EXP_CãP äqtagHIGHCONTRASTWál äqMCI_SET_AUDIO_ALLèqpSigner✠ärwostringstreamã° ä rMAXSHORTáÔ ärPIMAGE_ARCHITECTURE_ENTRYô ärCRYPT_FORMAT_RDN_CRLF ‘ ä rCERT_NAME_DISABLE_IE4_UTF8_FLAGêrSF_BSTRâ\‘ äsDOMAIN_ALIAS_RID_PRINT_OPS】 äsERROR_NODE_NOT_AVAILABLEá ‘ äsSEC_E_TARGET_UNKNOWNé sIPropertyStorage_SetClass_Proxyâä‘ ä tdwPlatformIdáü‘ ä tWM_ENTERIDLEá’ ätGetACPë)tIClassFactory_RemoteCreateInstance_Proxyáh’ äuIMAGE_REL_ARM_BRANCH11ã„’ äutagMONCONVSTRUCTéuLINKSRCDESCRIPTORèvfpsâÈ’ äwLANG_SANSKRITä’ äwLPDISCDLGSTRUCTAá“ äwI_RpcServerUseProtseqEp2AèwSQLColAttributesA<“ äxPEMRROUNDRECT`“ äxILockBytes_SetSize_Stubâ“ ä#xIAdviseSink2_OnLinkSrcChange_ProxyëxPCOMPOSITIONFORMáÈ“ äySymbolTableIndexáì“ äyIMAGE_DEBUG_TYPE_BORLANDá” äyFRS_ERR_INVALID_API_SEQUENCEá4” äyPSINJECT_ENDPAGESETUPT” äyCRYPT_X942_OTHER_INFO„” ä$y__IXMLAttribute_INTERFACE_DEFINED__êyODBC_ERROR_INVALID_INFã¼” äzPAN_ANYâØ” äzWS_CHILDWINDOWë"zMDM_PROTOCOL_HDLCPPP_112K_PAP• ä {NdrOleFreeë#{IXMLDSOControl_get_readyState_Stubãl• ä|InitializeCriticalSectionŒ• ä|ERROR_DS_DRA_BAD_DN⬕ ä|DNS_ERROR_NO_PACKETâÌ• ä|PSINJECT_BOUNDINGBOXáä• ä |PTRIVERTEXãü• ä |SSWF_WINDOWâ– ä|GetDateFormat,– ä |dwOEMVersioné |SQL_DBMS_VERá\– ä }has_infinityá|– ä}SEM_NOGPFAULTERRORBOX – ä}STARTF_FORCEOFFFEEDBACKâÌ– ä }RPC_E_SERVER_CANTUNMARSHAL_DATAâì– ä}MOUSEEVENTF_LEFTUPã— ä }LPTOGGLEKEYSá8— ä.}_CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO`— ä}JOB_NOTIFY_FIELD_TOTAL_PAGESé}IAdviseSink_OnRename_Proxyã — ä~bV4GammaGreen¼— ä~DOF_EXECUTABLEãØ— ä~RpcNsGroupMbrAddAè~MDM_SHIFT_BEARERMODEá ˜ äCreatePrivateObjectSecurityâ8˜ ä DM_PELSWIDTHáP˜ ä EDGE_ETCHEDâh˜ ä lpParametersá|˜ äPreFreeâ ˜ äCLSID_CGridPropertyPage⼘ äpfnDeferredFillInܘ äSOFTKEYBOARD_TYPE_T1éSQL_ATTR_ROW_STATUS_PTRâ™ ä€BDR_SUNKENOUTERê&€__IInternetBindInfo_FWD_DEFINED__h™ äERROR_EXTENDED_ERRORá„™ äWM_IME_CONTROLëpidlᨙ ä‚FLT_RADIXÌ™ ä‚ERROR_NO_LOGON_SERVERSãä™ ä ‚MINMAXINFOäš ä‚GetClipboardDataá,š ä‚IAdviseSink_RemoteOnSave_Proxyë ‚VarR4FromR8âpš ä ƒMCI_OVLY_GETDEVCAPS_MAX_WINDOWS‚ äƒsignéƒSQL_NO_DATA_FOUNDè„WNNC_NET_COGENTâÔš ä…REGDB_E_IIDNOTREGðš ä…ISequentialStreamè…LPSAFEARRAY_UserFreeé†_RPC_TRANSFER_SYNTAXáP› ä‡IMAGE_REL_PPC_ADDR32ál› ä‡CALINFO_ENUMPROCAˆ› ä‡_SHNAMEMAPPINGAâ › ä ‡PM_OPEN_PROCá¼› ä‡SQL_CUR_DEFAULTê‡SQL_OUTER_JOINSâð› ä ˆ__distanceã œ äˆ_PRIVILEGE_SETã0œ äˆERROR_DS_COMPARE_FALSEã\œ ä&ˆPFN_CERT_STORE_PROV_FREE_FIND_CTL„œ äˆIXTLRuntime_formatTime_StubêˆSQL_CREATE_VIEW⸜ ä ‰LongToHandleáØœ ä‰IMAGE_REL_PPC_REL24âðœ ä‰EventCategory ä‰SERVICE_LOAD_TYPE( ä‰SW_SHOWMINIMIZEDá@ ä ‰MSGBOXPARAMSé ‰nSizeMaxál ä ŠDMBIN_FIRSTâ„ äŠOLEVERBATTRIBèŠRegisterServiceCtrlHandlerãÈ ä‹DdeEnableCallbackè‹SQL_SRVC_NULLø ä ŒWM_KILLFOCUSáž ä ŒLTO_AccelisêŒWM_PSD_MARGINRECT<ž ä@248ádž äSECURITY_TERMINAL_SERVER_RIDᄞ äSZDDE_ITEM_ITEMLIST⨞ äCERT_RDN_GENERAL_STRINGâÈž äNdrPointerUnmarshalláðž äLPOINETPROTOCOLSINKSTACKABLE០ä VarR8FromR4êSQL_INDEX_CLUSTEREDâ<Ÿ äŽ__msizeâ\Ÿ äŽSTATUS_STACK_OVERFLOW€Ÿ äŽSEC_E_SECPKG_NOT_FOUND㤟 äŽGetWindowContextHelpIdë ŽSF_ERRORáП ä _MSL_IMP_EXPáôŸ ä_GET_FILEEX_INFO_LEVELSâ  äCO_E_MSI_ERRORã<  ä&CERT_POLICY_QUALIFIER_USER_NOTICEP  äNDRcopyêSQL_FN_NUM_ROUNDဠ äepsilonâ  ärad5éURL_OID_CRL_ISSUERãÌ  ä‘CALINFO_ENUMPROCWÜ  ä‘rad4áü  ä‘RpcBindingVectorFreeé‘_SHNAMEMAPPINGWâ8¡ ä’LPD_TYPE_COLORINDEXâH¡ ä’rad7á\¡ ä ’ALGIDDEFအ ä’GET_CMSG_ENCODING_TYPEë’PCERT_CHAIN_PARAἡ ä“PGRADIENT_TRIANGLEãÌ¡ ä“rad6é“SCardEndTransactionâ¢ ä ”iCtrlSpeedã$¢ ä”XTYP_CONNECT_CONFIRMá4¢ ä”rad1áX¢ ä”CreateFormatEnumeratorãt¢ ä”tagSQL_DAY_SECONDè”ODBC_ERROR_USER_CANCELEDá°¢ ä•SM_SHOWSOUNDSÄ¢ ä•DRV_CLOSEä¢ ä•CERT_NAME_ATTR_TYPEê•SQL_ROW_IGNORE㣠ä–PPRIVILEGE_SETã@£ ä–RPC_E_CANTPOST_INSENDCALLX£ ä –TC_SA_CONTINáh£ ä–rad3á„£ ä–JOY_BUTTON2CHG㘣 ä –DidAllocé–OLESTREAMVTBLÌ£ ä—_MSL_SIZE_T_TYPEáä£ ä —buffer_ptrãô£ ä—rad2é —VarCyFixá$¤ ä˜PCRITICAL_SECTIONH¤ ä˜PAN_LETT_OBLIQUE_SQUAREâd¤ ä˜SPI_GETWORKAREA․ ä˜HMENU_UserMarshal”¤ ä˜pscodeë˜minuteãȤ ä™RPC_S_INVALID_BOUNDâà¤ ä ™dmICMMethodê™PSD_RETURNDEFAULT¥ äšWNNC_NET_CLEARCASEã8¥ äšxmit_buf_unavailáT¥ äšIID_IRootStorageéšSQL_DRIVER_NOPROMPT⥠ä›fDsrSensitivityâ´¥ ä›EVENT_E_INTERNALEXCEPTIONè›_CMSG_MAIL_LIST_ENCRYPT_INFOáì¥ äœrad9ᦠäœIEnumSTATSTG_RemoteNext_StubéœOleCreateFromFileX¦ äERROR_DHCP_ADDRESS_CONFLICTât¦ äWNetUseConnection„¦ ärad8á ¦ äPIDSI_CHARCOUNTê pvarLeftáЦ äžLB_SETCOLUMNWIDTHá§ ä$žCMSG_CONTENT_ENCRYPT_FREE_PARA_FLAGâ§ ä žSTGM_SIMPLEêžSQL_SR_RESTRICTâX§ äŸszOID_SUBJECT_ALT_NAMEãt§ äŸpvOidSpecificInfo”§ äŸBINDSPEED_IMMEDIATEêŸSQL_MAX_ROWS_DEFAULTáÔ§ ä RPC_S_FP_UNDERFLOWãì§ ä BYTE_SIZEDARRᨠä get_xmlê SQL_API_SQLDESCRIBECOLãD¨ ä¡IMAGE_REL_PPC_ADDR24áX¨ ä¡tagCAUBê¡SQL_ODBC_INTERFACE_CONFORMANCE㜨 ä¢DMPAPER_FIRST´¨ ä ¢HELP_WM_HELPé¢ITypeInfo2_GetVarCustData_Stubãð¨ ä£@256á © ä£TAPE_FILEMARKSã © ä£dwCountâ4© ä£LineToãP© ä£WM_SIZECLIPBOARDဩ ä#£RPC_C_MQ_AUTHN_LEVEL_PKT_INTEGRITY㜩 ä£_CERT_EXTENSIONSé£PSWIZB_DISABLEDFINISHÜ© ä¤SCHED_S_TASK_RUNNINGáô© ä ¤tmBreakCharâ ª ä ¤WM_VSCROLLã,ª ä¤PCRL_DIST_POINTS_INFOè¤INET_E_CANNOT_CONNECTlª ä¥RPC_X_NO_MORE_ENTRIES„ª ä ¥PR_JOBSTATUSá°ª ä ¥MIXER_SETCONTROLDETAILSF_CUSTOMâ̪ ä¥CRYPT_MODE_CFBPê¥CryptDecodeMessageä« ä¦tagDECã« ä ¦AddFormAé ¦OFN_SHOWHELPáH« ä§SQLITE_SUPPORTãx« ä*§ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE¨« ä%§ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NCáÀ« ä §pArrayInfoë§RequestTypeChangeø« ä¨_TCHAR_DEFINEDã ¬ ä¨Methodã0¬ ä¨ERROR_PASSWORD_EXPIREDãT¬ ä¨LPMCI_OVLY_LOAD_PARMSAãt¬ ä¨IPipeLong_Pull_Stubê¨tag_inner_PROPVARIANT¸¬ ä©ENCAPSULATED_POSTSCRIPTâЬ ä ©SIZEZOOMHIDEáè¬ ä©CreateWindowW­ ä©VFF_BUFFTOOSMALLá­ ä ©RP_INIFILEãD­ ä©??_7IOleInPlaceUIWindow@@6B@é!©IAuthenticate_Authenticate_Proxyር äªLANG_KASHMIRI¤­ äªSetClipboardDataáÀ­ äªWN_NOT_LOGGED_ONáì­ äªRPC_C_MQ_USE_EXISTING_SECURITYã® ä ªcbCtlContentá® äªtagCAUIêªSQL_CA1_BOOKMARKáP® ä«MEVT_F_CALLBACKâh® ä«pProtocolSink|® ä «tagCAFLTé«tagCAUH⨮ ä¬CRYPT_NO_SALTÜ® ä)¬AsyncIAdviseSink_Begin_OnViewChange_Stub⯠ä¬CoReleaseServerProcessã,¯ ä¬IOleInPlaceFrame_SetMenu_Proxyë¬__IXMLDOMComment_FWD_DEFINED__ㄯ ä ­ERROR_CTX_CLIENT_LICENSE_IN_USE✯ ä ­pszProvNameê ­tagMSHLFLAGSáį ä ®LPABCܯ ä®WM_SYSCOMMAND° ä®MCI_ANIM_WHERE_DESTINATIONë®QueryServiceConfigãT° ä%¯IXMLDSOControl_get_XMLDocument_Proxyé¯tagCAUL⌰ ä°FILE_FLAG_OPEN_NO_RECALLá ° ä °AddFormWé°PIDSI_THUMBNAILâÔ° ä ±LANG_NEUTRALá± ä$±ERROR_CLUSTER_RESTYPE_NOT_SUPPORTEDâ± ä±EMR_WIDENPATH@± ä±tagEMRSETPALETTEENTRIESâ`± ä±wglDescribeLayerPlane|± ä±ESB_DISABLE_UP㜱 ä±WNetDisconnectDialog1°± ä ±LPHMIXERáı ä±MCI_PAUSEè± ä±IS_CERT_RDN_CHAR_STRINGê±SysAllocStringLen(² ä²WS_EX_OVERLAPPEDWINDOWãD² ä²FILE_DEVICE_DFSâ`² ä²FindMimeFromDataá² ä$²IInternetThreadSwitch_Prepare_Proxyê²VarUI1FromDispãȲ ä³remove_pointerë ³GetClassLongáô² ä´SSIZE_Tâ ³ ä ´MEM_RELEASEê ´Linenumberã<³ äµGetCommConfigT³ ä µtagTPMPARAMSéµSPLDS_PRINT_RATE_UNITˆ³ ä¶tagPOINTS¤³ ä¶JOY_BUTTON3CHGã̳ ä¶IXMLElement_getAttribute_Stubè¶IPropertyStorage_Enum_Proxyê·ERROR_SOME_NOT_MAPPED8´ ä¸ERROR_INVALID_USER_BUFFERT´ ä¸MB_SETFOREGROUNDál´ ä ¸ChangerDriveጴ ä¸SCARD_LOCAL_READERSê¸LPFNPSPCALLBACKâÌ´ ä¹SORT_HUNGARIAN_DEFAULTãè´ ä¹JOB_OBJECT_QUERYáµ ä¹IMAGE_REL_PPC_GPRELâ0µ ä"¹ERROR_CTX_MODEM_INF_NOT_FOUNDPµ ä¹PP_SIG_KEYSIZE_INCãpµ ä¹STGM_SHARE_DENY_WRITEè¹PD_RETURNDEFAULT᜵ ä ºISTAG°µ ä ºVK_EXSELé)ºIInternetProtocolSink_ReportResult_Proxyá¶ ä»TAPE_SHORT_FILEMARKSá¶ ä »FeaturesHighá8¶ ä»SM_CYMINSPACINGâT¶ ä»PDISK_HISTOGRAMâl¶ ä»IHttpSecurityœ¶ ä$»IXMLDOMDocument_createTextNode_Stubâ¼¶ ä»IPropertySetStorageê»SQL_SFKU_SET_DEFAULTáð¶ ä¼wMinuteâ· ä¼NDR_LOCAL_DATA_REPRESENTATIONè¼StgOpenStorageãX· ä½PSID_AND_ATTRIBUTES_ARRAYp· ä ½SerialNumberá · ä#½CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESSë½SQL_DIAG_COLUMN_NUMBERë¾LPMCI_OVLY_LOAD_PARMSWä¸ ä¿CreateWindowAè¿mmioSendMessageâ8¸ äÀtmInternalLeadingT¸ äÀPROPENUMPROCEXëÀabsoluteChildNumber┸ äÁIMAGE_REL_PPC_ADDR14ᤸ ä ÁPRECTĸ äÁERROR_NO_SIGNAL_SENTéÁWN_BAD_PROVIDERâø¸ ä ÂCTRY_NORWAYâ¹ äÂCALG_CYLINK_MEKâH¹ ä*Â__IXMLDOMCDATASection_INTERFACE_DEFINED__èÂSQL_SUBQUERIESã|¹ ä ÃPtrToUshort✹ äÃIMAGE_REL_PPC_ADDR16ḹ äÃMCI_SEEK_PARMSëÃLPOPENCARDNAME_EXð¹ äÅERROR_DISK_CHANGEº ä ÅnRgnSizeá(º äÅPERF_COUNTER_LARGE_DELTAáXº ä$ÅCREDENTIAL_OID_PASSWORD_CREDENTIALSâ|º äÅCONTEXT_OID_CERTIFICATEêÅPIDSI_LASTAUTHORᬺ äÆPartitionȺ äÆPAN_SERIF_ROUNDEDèÆPRPC_SERVER_INTERFACE» äÇszOID_DEVICE_SERIAL_NUMBERã0» äÇIOCTL_STORAGE_RESERVEH» ä ÇSNB_UserSizeáX» äÇCAUBéÇcaubျ äÈchoose_assign» ä È_TREE¤» ä ÈPJOYINFOáÈ» äÈCHANGER_STORAGE_TRANSPORTø» ä$ÈIOleLink_GetSourceDisplayName_ProxyêÈOleCreateDefaultHandlerâ8¼ äÉMEDIA_WRITE_ONCEáH¼ äÉCAULéÉcaulál¼ äÊStackBase„¼ ä ÊMft2Writesë!ÊIRecordInfo_IsMatchingType_Proxyáļ äËfill_nãð¼ ä ËSCHED_E_SERVICE_NOT_LOCALSYSTEMâ ½ äËCRYPT_DATA_BLOBâ,½ äËSCardGetStatusChangeé ËSQLGetInfoã\½ ä ÌQS_ALLEVENTSá|½ äÌDMLERR_POKEACKTIMEOUT¨½ äÌX509_CERT_REQUEST_TO_BE_SIGNEDãÔ½ ä!ÌICreateTypeLib_SetLibFlags_Proxyáä½ äÌCAUIéÌcauiá¾ äÍCP_REGION ¾ ä ÍWSACleanupã0¾ äÍCAUHéÍcauháT¾ äÎpartition„¾ ä$ÎERROR_REMOTE_SESSION_LIMIT_EXCEEDEDâ ¾ äÎRT_ACCELERATORãľ äÎMMIOERR_SHARINGVIOLATIONéÎSCARD_ATTR_DEFAULT_DATA_RATEá ¿ äÏERROR_NOTIFY_ENUM_DIR ¿ äÏMCI_TRACKD¿ äÏMCI_GETDEVCAPS_CAN_SAVEâp¿ äÏAsyncIPipeLong_Begin_Push_Stub㘿 äÏIID_IInternetSecurityManageré ÏSQLUBIGINTãп äÐBACKUP_SECURITY_DATAáð¿ äÐCFERR_MAXLESSTHANMINáÀ äÐXTYP_REGISTERèÐRPC_C_VERS_MAJOR_ONLY<À äÑrfmtid1âXÀ äÑPAGE_WRITECOPYã|À äÑERROR_NO_RECOVERY_PROGRAMÀ äÑsocketã¬À äÑKEY_TYPE_SUBTYPEáÄÀ äÑVARIANT_FALSEèÑ_pidáèÀ äÒrfmtid2âÁ äÒCreateTapePartitionâ Á ä ÒHOLLOW_BRUSHá@Á äÒMCI_WAVE_STATUS_LEVELdÁ äÒSPLDS_PRINT_MIN_Y_EXTENTá„Á äÒIStream_SetSize_Stubá¬Á äÒIEnumVARIANT_RemoteNext_ProxyèÒODBC_VS_FLAG_UNICODE_ARGéÓSQL_FD_FETCH_NEXT  äÔERROR_UNEXP_NET_ERRâ( äÔwglDeleteContextéÔCERT_ALT_NAME_URL\ äÕWM_GETDLGCODEèÕCertCreateCTLContextá äÖENOTEMPTY¨Â ä ÖCONTEXT_FULLáÈ äÖRPC_S_NO_ENTRY_NAMEâà äÖLCSGAMUTMATCHøÂ äÖtimeEndPeriodà äÖCertAddEncodedCRLToStoreá0à äÖadwDataâXà äÖIStorage_RenameElement_StubêÖSQL_DIAG_CLASS_ORIGINà ä×LANG_ALBANIAN´Ã ä×FILE_ATTRIBUTE_OFFLINEãÌà ä ×S_WHITE512ãäà ä ×CS_CLASSDCãÄ ä×SERVER_ACCESS_ENUMERATEê×IBinding_Abort_Stubâ@Ä ä Ø_SW_INEXACTâPÄ äØBYTEáhÄ ä ØCF_DSPBITMAPáxÄ äØbyteá˜Ä äØIPipeDouble_Pull_Stub°Ä ä ØDISPID_VALUEéØget_responseBodyáÜÄ äÙOUTâüÄ äÙ_PRINTER_NOTIFY_INFOéÙlpServiceStartNameãDÅ äÚclass_has_trivial_copy_ctorâ`Å äÚconst_iteratorã|Å äÚfind_first_not_of˜Å äÚBITMAPINFOHEADERá´Å äÚPSESSION_HEADERêÚSPLDS_PRINT_MIN_X_EXTENTáìÅ ä ÛPWAVEHDRáÆ ä ÛszOID_TITLEê ÛIXMLDOMAttribute_put_value_StubâXÆ äÜSTATUS_ILLEGAL_INSTRUCTIONã|Æ äÜMOVEFILE_REPLACE_EXISTING”Æ äÜDMCOLOR_COLORèÜMCI_OVLY_LOAD_PARMSâÜÆ äÝSetUnhandledExceptionFilterãÇ äÝGetComponentIDFromCLSSPECèÝSQLForeignKeysã,Ç äÞbitsáPÇ äÞUnhandledExceptionFilterádÇ äÞSS_ICONê ÞPID_BEHAVIORá¨Ç äßERROR_DS_CANT_FIND_NC_IN_CACHEãÈÇ äßGetProtocolVersionãÜÇ ä ßRecordStrèßFaultInIEFeatureá È äàDC_FIELDS,È äàPIPE_ACCESS_DUPLEXãPÈ äàCO_E_CLSREG_INCONSISTENTádÈ ä àWM_CLOSEá|È ä àwaveOutOpenâÈ äàhostentâ¸È äàNdrServerInitializeUnmarshallèàSQL_NAMEDðÈ äáSND_ALIAS_SYSTEMASTERISKáÉ ä!áSPLREG_SCHEDULER_THREAD_PRIORITYá8É äáIRpcProxyBufferâTÉ äáCFSTR_MIME_PDFëáOpenSCManagerWã˜É äâCryptUninstallCancelRetrievalèâSQL_SU_INDEX_DEFINITIONêã@276áðÉ ää_ImageArchitectureEntryâÊ ääTAPE_DRIVE_RELATIVE_BLKSáDÊ ä$äERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPSâ`Ê ääcAccumBlueBitsã€Ê ääJOY_CAL_READXYONLYëäAuthorityCertSerialNumber¼Ê ä åLC_NUMERICãÌÊ äånthâìÊ äåpEphemeralAlgorithmâ Ë äåPSCARD_READERSTATEAâ<Ë ä#åIPSFactoryBuffer_CreateProxy_ProxyãXË äåLPOLECLIENTSITEê å_SC_ACTIONãË äæEMR_EXTSELECTCLIPRGNá°Ë äæBitmapWritesUserLevelèæget_notationNameáðË äçIMAGE_FILE_MACHINE_ARMã Ì äçRtlEqualMemoryã8Ì äçERROR_INVALID_COMBOBOX_MESSAGEãTÌ äçmidiOutMessageã|Ì äçRPC_C_OPT_BINDING_NONCAUSALâ Ì äçpszContentEncryptionObjIdØÌ ä-çCERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAGáðÌ ä çGDI_OBJECTëçIID_ICodeInstalléèERROR_OPLOCK_NOT_GRANTEDáPÍ äéIMAGE_REL_PPC_REL14âdÍ äécxDestãtÍ ä éu_intÍ äéMftBitmapReadsë%éIXMLHttpRequest_get_statusText_ProxyáØÍ ä êout_of_rangeáüÍ äêLANGGROUPLOCALE_ENUMPROCA,Î ä*êIOleInPlaceObject_SetObjectRects_StubLÎ äêINET_E_INVALID_URLëêNUMPRS_DECIMALã€Î ä ëlower_sizeã¤Î äëLPPIXELFORMATDESCRIPTORâÔÎ ä&ëCERT_STORE_PROV_SET_CTL_PROPERTY_FUNCèëVarI2FromDateè ìwaveOutPauseá Ï äíGetProcAddressã8Ï äíGetBinaryType`Ï äíDNS_ERROR_NAME_NOT_IN_ZONEãtÏ ä ímtStringáÏ äíIID_IPipeDoubleâÄÏ ä)íIXMLDOMDocument_put_ontransformnode_Stubé%íIInternetProtocolInfo_QueryInfo_StubáÐ äîSE_ENABLE_DELEGATION_NAME@Ð äîRpcServerUseAllProtseqsIfExêîQueryServiceStatusExá„Ð äï_MSL_CALLINGCONV_3DCALLâ¤Ð äïGetFileAttributesExAáÌÐ äïERROR_INFLOOP_IN_RELOC_CHAINéïSQL_INTERVAL_HOUR_TO_SECONDâÑ ä ðtbase(Ñ äðERROR_MEDIA_UNAVAILABLEâ@Ñ ä ðSetClassWordáTÑ äðIDABORTêðMEDIA_READ_ONLYâˆÑ ä ñGUID_DEFINEDá¨Ñ äñDNS_ERROR_NO_MEMORYê$ñCRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTEâðÑ ä òLATENCY_TIMEáÒ ä òRelocCountã(Ò äòRPC_S_INTERNAL_ERRORéòCODEPAGE_ENUMPROCdÒ äóFOF_WANTMAPPINGHANDLE„Ò äóPSCARD_READERSTATEWê!ó_LPIINTERNETPROTOCOLINFO_DEFINEDáÈÒ ä ôdwExtraInfoâäÒ äôSM_CXMAXIMIZEDãüÒ ä ôWN_BAD_USERê ôIXMLDOMAttribute_get_value_Stubâ<Ó äõstrtoulâXÓ äõLANG_MALAYALAMãpÓ äõGetMiterLimitˆÓ ä õKP_CLEAR_KEYá´Ó ä"õCryptUnregisterDefaultOIDFunctionèõPENDINGMSG_WAITNOPROCESSáüÓ äöCHANGEDETECTION_AVAILABLEÔ ä öCERT_E_ROLEâ,Ô ä öSM_CMETRICSâHÔ äöJOY_BUTTON1CHGã\Ô äöCacheMissˆÔ ä öPRINTER_NOTIFY_FIELD_START_TIMEêöGetRefTypeOfImplTypeáÄÔ ä÷LEFT_ALT_PRESSEDé÷OpenSCManagerAãøÔ ä øXCLASS_FLAGSéøPCMSG_KEY_AGREE_ENCRYPT_INFOéùGetFileAttributesExWá\Õ äúGetArcDirectionâtÕ ä úMM_MOM_DONEâŒÕ ä úMCI_NOTIFYã¼Õ ä%úIInternetProtocolRoot_Continue_ProxyáÔÕ ä úV_ISVECTORëúImmGetOpenStatusáÖ äûQueryMultipleInterfacesê$ûIXMLDOMNode_get_nodeTypeString_Stubâ\Ö äüSETMITERLIMITxÖ äüSM_CYMAXIMIZEDãÖ ä üszKeyphraseâ´Ö äüLANGGROUPLOCALE_ENUMPROCWðÖ ä0üIInternetZoneManager_DestroyZoneEnumerator_StubêüNI_SETCANDIDATE_PAGESIZEá,× äýGetClientRectX× äýPRINTER_ATTRIBUTE_WORK_OFFLINEë'ýURLPOLICY_CREDENTIALS_MUST_PROMPT_USERã´× äþCOMPRESSION_ENGINE_MAXIMUMãÌ× ä þPDIBSECTIONâì× äþ_CRYPT_CSP_PROVIDERê þCompareUrlã(Ø äÿIMAGE_REL_ALPHA_REFQUADâDØ äÿDefineHandleTablepØ ä ÿERROR_HOST_NODE_NOT_GROUP_OWNERâ”Ø äÿCRYPT_E_NO_DECRYPT_CERTâ¸Ø äÿLookupIconIdFromDirectoryÌØ ä ÿPSN_APPLYèÿLPMONIKERøØ å BACKUP_LINKâ,Ù å&CRYPT_OID_UNREGISTER_SYSTEM_STORE_FUNCã@Ù åVarCyNegêSQLTCHARádÙ ä@284áˆÙ äERROR_DECRYPTION_FAILEDâ¤Ù äCRYPT_E_BAD_MSGâ¸Ù ä TA_CENTERè PriorityáøÙ äOSS_COMPARATOR_CODE_NOT_LINKEDãÚ ä DT_INTERNALâ(Ú ä CTRY_PANAMAê"SCardSetCardTypeProviderNameAlÚ äSetWindowLongPtráˆÚ äWN_BAD_LOCALNAMEéALG_SID_SAFERSK64ÀÚ äUnlockResourceãÜÚ ätagTEXTMETRICWãôÚ ä midiOutCloseáÛ äFILE_WRITE_ACCESSè!IInternetProtocolRoot_Abort_StubádÛ äIMAGE_REL_BASED_IA64_IMM64ã€Û äFILE_READ_ONLYã¤Û äERROR_CHILD_NOT_COMPLETEá¼Û ä CS_PARENTDCâÜÛ äRpcServerUnregisterIfôÛ ä Destination1á Ü ä PARSE_SITEë*URLPOLICY_CREDENTIALS_SILENT_LOGON_OKLÜ ä lmaskpÜ äPAN_CONTRAST_VERY_HIGHãÜ äBusTypeMaxReservedë Destination2á¼Ü äoffBmiSrcÜÜ äDdeFreeStringHandleâøÜ äPEFS_HASH_BLOBëSQL_DROP_SCHEMAâ(Ý äresizeã<Ý ärdSizeãXÝ ämidiInGetNumDevséSQL_PS_POSITIONED_UPDATEáœÝ ä META_DIBSTRETCHBLTã¸Ý ä SS_ETCHEDFRAMEë LPMIDIOUTCAPSðÝ ä FEATURESETTING_NUPë CreateDialogParamAã0Þ ä PEMRSETWORLDTRANSFORMHÞ ä CERT_FIND_ANYhÞ ä CryptCloseAsyncHandleè ADVFCACHE_NOHANDLERâ¤Þ ä CreateColorSpaceAÀÞ ä DFCS_CAPTIONMINâÜÞ ä IID_IEnumCallbackß ä IXMLDOMNode_get_attributes_Stubê SQL_NULL_HDESCã@ß ä DataIsDirectoryâ\ß ä LPMEMORYSTATUSEXé BINDSPEED_INDEFINITEá¤ß äTAPE_DRIVE_WRITE_LONG_FMKSãÀß äPT_CLOSEFIGUREãØß ä SetBkColorëSafeArrayCreateEx à ä IsEqualIIDã$à ä bV4Endpointsá@à äcMultipleItemsãXà äEndDocPrinterxà äDIALOPTION_DIALTONEê SQL_TC_NONEâ¤à äne_expver¸à ä CPS_URLSáÐà ä SQL_OJ_RIGHTé SQL_IK_ASCëSetFilePointerã$á äSE_CHANGE_NOTIFY_NAME@á ätagTEXTMETRICAãXá äCOLOR_3DLIGHTtá ä??_7IUrlMon@@6B@áˆá äSQLLENë SQL_VARCHARâ¸á äServiceStatusèSQL_SETPOS_MAX_OPTION_VALUEâôá äPFLOAT128 â ä ERROR_CLUSTER_RESNAME_NOT_FOUNDâDâ ä_PARTITION_INFORMATIONãlâ äSCardSetCardTypeProviderNameWè??_7IXMLDOMNode@@6B@á â ä ESIGPARMá¸â äR2_MASKPENNOTÌâ ä SetFocusé"IXMLElement_get_tagName_Proxyã änum_words$ã äNumberOfIdEntries@ã ä_PROV_ENUMALGSëSQL_FN_STR_REPLACEãtã ä_strncollŒã ä WSAEALREADYâ°ã äCO_E_ALREADYINITIALIZEDâÌã äVerLanguageNameâäã ä PMIDIOUTCAPSépchBuffer ä ä JobTokená,ä äERROR_DUPLICATE_TAGê ByObjectIdãhä äEXIT_PROCESS_DEBUG_INFOâ„ä ä_EFS_HASH_BLOBã¨ä äIID_IInternetProtocolInfoè _protÌä äwcrtombâèä äCreateColorSpaceWüä äCBR_BLOCKå äwVoicesâ0å äCreatePointerMonikeráTå äURLACTION_DOWNLOAD_MAXëSQL_DD_CASCADEãˆå ä_MSLGLOBALS_H¤å älpszDCIAliasNameáÈå äPRINTER_STATUS_PAPER_JAMáüå ä(IAdviseSink2_RemoteOnLinkSrcChange_StubêOFN_NONETWORKBUTTONâ<æ ädwDebugInfoFileOffset\æ äCreateDialogParamWë_CHANGER_READ_ELEMENT_STATUSá°æ ä!IMAGE_WEAK_EXTERN_SEARCH_LIBRARYáÐæ äLPMINIMIZEDMETRICSëCRL_V1ãøæ ä_getpidâç äwioséCRL_V2ã0ç äENOSPCãTç äRpcInterfaceInformationêBINDSTATUS_ENCODINGâç ä GLOBAL_OPTIONS_Há¬ç ä int_n_cs_precedesÄç ä _MSL_LOCALE_Cèç ä IMAGE_FUNCTION_ENTRY64ã è ä EXCEPTION_FLT_STACK_CHECK8è ä" CO_E_ACTIVATIONFAILED_EVENTLOGGEDè CryptRegisterDefaultOIDFunctionâ„è ä!BATTERY_LIFE_UNKNOWNáœè ä!PMULTIKEYHELP¸è ä!RESOURCE_CONTEXTáÌè ä!lpNextãèè ä!RpcRaiseExceptionáé ä !SCS_SETSTRë !SQL_CA1_BULK_DELETE_BY_BOOKMARKâPé ä"SECURITY_LOGON_IDS_RIDë "LBS_NOTIFYãŒé ä#SUBLANG_SPANISH_NICARAGUA¬é ä#TAPE_LONG_FILEMARKSâÌé ä#LPDLGITEMTEMPLATEWãèé ä#_CERT_POLICY_IDãê ä#BootIndicatorè#SQL_CONVERT_GUIDá4ê ä $BuildCommDCBé$_XFORM_âdê ä%CRYPT_MODE_OFBPâ˜ê ä(%__ISequentialStream_INTERFACE_DEFINED__ê%MDM_V120_ML_2(ë än'?$reverse_iterator@V?$__wrap_iterator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAD@std@@è!'URLACTION_HTML_SUBFRAME_NAVIGATEádë ä(timeá|ë ä (LockResourceá˜ë ä(tagEXTLOGFONTAë (SO_DEBUGáÄë ä )DC_MINEXTENTáìë ä)ERROR_CLEANER_SLOT_NOT_SETãì ä)DISP_E_EXCEPTIONá$ì ä)LCS_GM_GRAPHICSâ<ì ä )CTRY_SYRIAãhì ä&)CERT_FIND_OPTIONAL_CTL_USAGE_FLAG”ì ä&)CERT_STORE_LOCALIZED_NAME_PROP_IDÀì ä)IOCTL_DISK_HISTOGRAM_STRUCTUREãÜì ä)SEARCH_PRIMARYãí ä)FMTID_ImageSummaryInformationè)CFSTR_MIME_X_ARTé*STG_E_INVALIDPARAMETERã`í ä+_ULARGE_INTEGERâ|í ä+TMPF_FIXED_PITCHá˜í ä+GetWindowLongPtrá¸í ä+MCI_ANIM_PLAY_PARMSâØí ä+FOF_SIMPLEPROGRESSãî ä!+CERT_DEFAULT_OID_PUBLIC_KEY_XCHGá$î ä+PSM_RECALCPAGESIZESê+SQL_SCROLL_FORWARD_ONLYâtî ä&,@class$7666clientEngine_dbg___pchœî ä",ERROR_AUTODATASEG_EXCEEDS_64kÄî ä,CRYPT_SIGN_ALG_OID_GROUP_IDâèî ä,CERT_CTL_USAGE_PROP_IDãï ä,FUNCFLAG_FUIDEFAULTê,SQLProceduresAã@ï ä-__double_epsilonálï ä&-ERROR_CLUSTER_NO_SECURITY_CONTEXT¬ï ä5-__IInternetProtocolSinkStackable_INTERFACE_DEFINED__é-ImmGetRegisterWordStyleAé.SQL_ATTR_CONNECTION_TIMEOUTâð ä/IMAGE_DEBUG_MISCá,ð ä /JOY_POVLEFTâLð ä/SQL_SCROLL_OPTIONSë/SQL_CT_CREATE_TABLEâ„ð ä 0__msl_copyë0IViewObject_RemoteDraw_Proxyá¼ð ä 1LPINTÜð ä1_RTL_CRITICAL_SECTIONøð ä1SetFileApisToANSIñ ä1ERROR_DS_DRA_BAD_NCâ0ñ ä 1HANDLETABLEâXñ ä1PAN_MIDLINE_STANDARD_SERIFEDáxñ ä1MMSYSERR_NOTSUPPORTEDè 1VT_FILETIMEâ¤ñ ä2BaseOfBss¸ñ ä 2NameTypeáÔñ ä2??_7IMultiQI@@6B@áò ä 2IFillLockBytes_FillAppend_Proxyê2CLSID_CCDFormDialogâ4ò ä3BASETYPESLò ä 3tagPOINTFXãhò ä3SERKF_INDICATORâ€ò ä 3VarDecFromI4é3OpenSCManager´ò ä4PAN_WEIGHT_NORDâÌò ä4MCI_MSF_FRAMEè4ASYNCHãôò ä5strcollâó ä5SPAPI_E_INVALID_MACHINENAMEâ<ó ä5LPDLGITEMTEMPLATEAãXó ä5ExchangeFromDrivepó ä 5VarDecFromI2é5SELECT_CAP_CONVERSION¬ó ä6NdrSendReceiveãÄó ä 6SZM_DELETEãÜó ä 6VarDecFromI1é6VarUI1FromUintãô ä7pairá ô ä 7CTRY_HUNGARYá<ô ä7WNetEnumResourceáhô ä!7MIXERCONTROL_CT_SC_LIST_MULTIPLEáˆô ä7szOID_OIWSEC_md4RSA2á¨ô ä7CryptExportPKCS8Exë7get_childNodesãØô ä 8PRF_OWNEDè8CLSID_AggStdMarshalâ õ ä9CERT_CONTEXT_REVOCATION_TYPEá<õ ä9hRestrictedOtheráTõ ä9LogFileWritesè9IXMLDOMText_splitText_Proxyê:SQLProceduresWã¸õ ä;basic_istringstreamâàõ ä;PROPSETHDR_OSVERSION_UNKNOWNé;ImmGetRegisterWordStyleWá0ö ä&<@class$7667clientEngine_dbg___pchPö ä<ERROR_NO_MORE_DEVICEShö ä <SM_CXSMSIZEâ|ö ä <sockaddré<NdrConformantStringUnmarshallè=dwActiveProcessorMaskäö ä>RPC_S_NO_INTERFACESã÷ ä>tagEXTLOGFONTWë>FADF_EMBEDDED4÷ ä?SetThreadLocaleê ?IAdviseSink_RemoteOnClose_Proxyâx÷ ä @__float_nanâ”÷ ä@tagEMRSTRETCHBLTá¬÷ ä @MK_CONTROLãÈ÷ ä@GetWindowLongWãà÷ ä @wPeriodMaxäø ä@MCI_VD_STEP_REVERSEâø ä @RPC_MESSAGEâDø ä@IRpcChannelBuffer3_Cancel_Stubë1@URLACTION_INFODELIVERY_NO_REMOVING_SUBSCRIPTIONSá¬ø ä!AERROR_UNABLE_TO_MOVE_REPLACEMENTáÜø ä%Asz_CERT_STORE_PROV_SYSTEM_REGISTRY_Wáìø äApuuidè ASQL_GD_BOUNDáù ä Brandom_nextâ8ù äBMK_E_NOTBINDABLEáLù äBEMRSAVEDChù äBPERF_AVERAGE_BASEŒù äBNdrVaryingArrayBufferSize°ù äBREAD_ELEMENT_ADDRESS_INFOèBHBITMAP_UserUnmarshalìù äC_ThreadLocalDataáüù äCtanféCSQL_CT_TABLE_CONSTRAINTâHú ä"DERROR_RESOURCE_LANG_NOT_FOUNDlú äDCERT_STORE_PROV_LDAP_Wã„ú äDLPPERSISTFILE´ú ä&DIOleWindow_ContextSensitiveHelp_ProxyèDOLEVERBATTRIB_NEVERDIRTIESäû äEIMAGE_REL_PPC_SECRELLOãû äEGMEM_DISCARDEDã4û ä EIPPROTO_NDëESQL_C_STINYINTã€û ä#FCERT_ALT_NAME_ENTRY_ERR_INDEX_MASKã û äF??_7IViewObject@@6B@éFSQLBindParameteráÔû äGIID_IRpcProxyáü ä GICreateTypeInfo_SetVersion_StubêGBINDSTRING_USER_AGENT4ü äHfcloseãLü ä HFirstEmptyãtü äHIOleCache2_UpdateCache_Stubâ¬ü ä,HIXMLDOMDocument_put_onreadystatechange_StubêHSQL_QUALIFIER_NAME_SEPARATORáèü ä I_RC_CHOPéItanláý äJRemovableDiskInfoèJITypeLib_GetTypeComp_ProxyãXý äKLB_SETTOPINDEXã€ý äKCERT_STORE_UPDATE_KEYID_FLAGá ý äKVOLUME_DISK_EXTENTSâ¸ý ä KTYMED_NULLãäý ä"KILayoutStorage_BeginMonitor_ProxyèKGL_ID_NOMODULEãþ äLHENHMETAFILE__ëLPSECURITY_ATTRIBUTESáLþ äMtanhá`þ äMBaseHiãŒþ ä MDMPAPER_LETTER_EXTRA_TRANSVERSEâ¨þ äMpi_key_contextã¼þ äMPPROTOENTìþ ä*MCERT_NAME_STR_ENABLE_T61_UNICODE_FLAGÿ äMDestroyElementã$ÿ äM_tagRemBINDINFOâ8ÿ ä MVarDecMulèMSQL_COLUMN_DISPLAY_SIZEâ€ÿ äNDNS_STATUS_DOTTED_NAMEã”ÿ äNnPolysã°ÿ äNESB_DISABLE_BOTHáÔÿ äNFRERR_FINDREPLACECODESãìÿ ä NcAttributeå äNtagTYSPEC0 ä#NIOplockStorage_OpenStorageEx_ProxyëNSetTypeDescAliasád ä O_controlfpã„ äOPFD_DRAW_TO_BITMAP㨠äOMIXERLINE_LINEF_SOURCEãÄ äOCERT_SIMPLE_CHAINÜ ä OSQL_COMMITëOSQLDescribeColã äPERROR_FILE_NOT_ENCRYPTEDá< äPCRYPT_E_ASN1_PDU_TYPEX äPpVoidDecryptFuncáp ä PF3_128Mb_512ሠä PtagEXCEPINFOá´ ä"PIInternetProtocolRoot_Abort_ProxyèPWM_PSD_YAFULLPAGERECTè äQldexplãü äQlog10lã  äQlrintèQLPTOP_LEVEL_EXCEPTION_FILTERáL ä RDebugStringâx äRERROR_DS_NONEXISTENT_MUST_HAVEã  äR_ENCRYPTION_CERTIFICATE_HASHéRSCARD_PROVIDER_PRIMARYãà äSLMEM_DISCARDEDãø äSIsTextUnicode äSGetKernelObjectSecurityê SRGN_DIFFáP äTOUT_DEFAULT_PRECISãl äTpszContentType㘠ä!TNdrNonConformantStringBufferSizeá¼ äTRpcSmSetClientAllocFreeêTSQL_ADD_RECORDãô äUCB_SETTOPINDEXã, ä,UCERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAGêU_midl_ma8d äVIMAGE_REL_BASED_HIGH3ADJဠäVDCX_EXCLUDERGN㜠äVGetWindowLongAë VFADF_UNKNOWNáÄ äWMAT2é WSQL_TC_ALLãð äXptSizeã  äXEMRPOLYPOLYGONëXIPersistStreamã< ä Y_midl_ma4è$YURLPOLICY_CHANNEL_SOFTDIST_PRECACHE†äZSP_PARITY  äZRequestWakeupLatencyá¼ äZPBITMAPV4HEADERâÐ ä ZUOI_TYPEéZPRINTEROP_FLAGSã ä[ldexpfã ä[log10fã, ä [getpeernameâD ä [CERT_CONTEXTé[StgCreatePropSetStg∠ä\LPEXIT_THREAD_DEBUG_INFOᬠä\DNS_ERROR_RCODE_NOTZONEâÔ ä"\sz_CERT_STORE_PROV_SERIALIZEDè ä\_midl_ma1 ä!\ITypeLib2_GetDocumentation2_Stubá8 ä\LPSERVICE_MAIN_FUNCTIONâT ä\IME_CMODE_FIXEDê\SQL_COLUMN_NULLABLEê]PAN_SERIF_BONE㨠ä ^MAXINT_PTRãÀ ä ^pOtherAttrë^??_7IMoniker@@6B@ð ä__spawnvpe  ä_RPC_S_CALLPENDING$ ä _SET_CLIP_BOXá8 ä__midl_ma2P ä _tagFUNCKINDê._IXMLDOMDocument_get_resolveExternals_Stub˜ ä `off_typeá° ä `multipliesãÄ ä `PF_HYLINKè `VarIntFromCyáô ä aPeekMessageâ äa_RPC_SYNTAX_IDENTIFIERã4 äaPERF_TYPE_ZEROë#aIXMLDOMNodeList_get__newEnum_Proxy㈠äbERROR_DS_INTERNAL_FAILURE¬ äbOSS_BERDER_DLL_NOT_LINKEDÈ äbDFCS_CAPTIONCLOSEèbISC_SHOWUICANDIDATEWINDOW äcERROR_MEDIA_CHANGEDâ0 äcTIME_NOMINUTESORSECONDSâH ä cLPCPINFOEXãh äcszOID_DN_QUALIFIERëcFILE_DEVICE_NAMED_PIPEã° ädIRunnableObject_Run_Stubé dIXMLDocument_createElement_Stubâô äe?$__char@$0P@ äedwProviderSubTypeèe_CERT_NAME_VALUEé fCOLORONCOLORá\ ägIEnumSTATDATAˆ ä gURLACTION_SHELL_INSTALL_DTITEMSêgSQLInstallTranslatorExãÈ ähSetWindowLongWãà ä hEM_GETLINEãü ähMETHOD_OUT_DIRECT ähGetTimeOfLastChangeêhGetZoneMappingsâT äiDT_END_ELLIPSISâp äiCERT_NAME_INFOã” äiSERIAL_IOC_FCR_RCVR_RESETèiGL_ID_INPUTSYMBOLÔ äjRpcSsDontSerializeContextô äjCERT_TRUST_NO_ERRORâ ä jIMarshal_GetMarshalSizeMax_StubâD äjFLAG_STGMEDIUM_UserFreeêjSQL_OPT_TRACEFILE| äk_MSL_WCTRANS_H㘠äkWaitForDebugEvent° ä kEnumWindowsêkSTGOPTIONS_VERSIONãè älMCI_INFO_FILEá älWINCRYPT32APIèlCERT_DESCRIPTION_PROP_IDá@ ämWSANO_RECOVERYã` äm??_7IRpcHelper@@6B@ê(mIXMLDocument2_get_fileUpdatedDate_Proxyê(nCERT_STORE_ADD_NEWER_INHERIT_PROPERTIESâÜ ä oTagIndexéoCertNameToStrAã äpGetLogicalDrivesépRPC_C_MGMT_INQ_PRINC_NAMEX äqEMR_GLSBOUNDEDRECORDál ä qEMRCHORDጠäqRDW_NOINTERNALPAINT⨠äqSPI_GETSHOWSOUNDSÄ äqSTGFMT_DOCFILEëqtagCOINITð ä rLBS_NODATAã ä rSE_ERR_OOMã( ärCRL_FIND_ISSUED_BYã@ ä rCreateProxyê"rITypeLib2_GetAllCustData_Stubˆ äsKEY_CREATE_SUB_KEYësNTM_NONNEGATIVE_ACãÈ ätCO_E_OLE1DDE_DISABLEDÜ ätp_protoâø ätCRYPT_FORMAT_CRLF ätSQL_BIND_TYPEètSQL_PARC_NO_BATCHP äuERROR_ALREADY_ASSIGNEDãh äuCBT_CREATEWND€ ä udwProtocols⨠äuNdrNonEncapsulatedUnionFreeâÐ äuIMallocSpy_PreRealloc_Proxyâì äuCLSID_CCDFormKrnl ä usetAttributeá  äuSQL_C_UTINYINTëuSQL_DL_SQL92_DATEX ävSidTypeUnknownãl ä vLPHANDLEévRpcAsyncCleanupThread¬ äw_MSL_TIME_T_DEFINEDâÄ äwpszObjectGUIDè"wIXMLDocument_put_charset_Stub äxSetHandleCountëxIPipeByte, ä yCONST< äyUINTá` äySPI_SETDEFAULTINPUTLANG⌠äyMCIERR_WAVE_SETINPUTUNSUITABLEã° äyRPC_C_PROFILE_MATCH_BY_IFÐ äyPP_KEYX_KEYSIZE_INCâì äyCertNameToStrWë*y__IRpcProxyBuffer_INTERFACE_DEFINED__4 äz_TOKEN_SOURCET äzPROCESSOR_INTEL_IA64áx äzCertDuplicateCTLContextê zPSN_WIZBACKê{DMDITHER_ERRORDIFFUSIONâÐ ä|WSA_QOS_EFLOWSPECè ä |RpcFinallyë|szOID_NETSCAPE_CERT_TYPEá$ ä}LCS_GM_IMAGES< ä }WS_EX_RIGHTâT ä }TKIND_ALIASâx ä}IRecordInfo_GetName_Proxyè}SQL_SRJO_EXCEPT_JOINá´ ä~DIB_RGB_COLORSãÐ ä~SetWindowLongAãä ä~MF_MASKê~KP_SIGNATURE_PINá< ä2ERROR_DS_COULDNT_IDENTIFY_OBJECTS_FOR_TREE_DELETEè DFCS_PUSHEDâl ä €result_typeâ ä€RpcBindingInqAuthClientWá´ ä€PTRANSMIT_FILE_BUFFERSë€lpstrCustomFilterà ärandéLPZONEATTRIBUTESá  ä‚RPC_X_WRONG_STUB_VERSIONá@ ä‚TYPE_E_AMBIGUOUSNAMEáX ä ‚DlgDirListWâh ä‚THIS_è#‚__IRpcChannelBuffer3_FWD_DEFINED__ã° äƒDefWindowProcÄ ä ƒLPHWAVEINè$ƒITypeInfo2_GetImplTypeCustData_Stubâ ä„SECURITY_CREATOR_OWNER_RIDã@ ä„IMAGE_SYM_CLASS_REGISTERá\ ä„PIPE_TYPE_MESSAGE| ä„ERROR_NET_WRITE_FAULTœ ä„DoEnvironmentSubstAâ¼ ä„PP_KEYEXCHANGE_PINãà ä„NDRSContextUnmarshall2ãü ä„LPCREATETYPEINFOé"„URLACTION_SCRIPT_SAFE_ACTIVEXD ä…EnumFontFamiliesExAâh ä…IID_IInternetThreadSwitchè …MOD_ON_KEYUPá” ä †AceFlagsá´ ä†POUTLINETEXTMETRICãä ä$†__AsyncIMultiQI_INTERFACE_DEFINED__ê †get_targetã$ ä‡MajorOperatingSystemVersionâ< ä‡NAMEENUMPROCAd ä‡CERT_IE30_RESERVED_PROP_IDã„ ä‡IMalloc_Alloc_Proxyê‡??_7IOleCache2@@6B@âÀ äˆprev_permutationáà äˆCreateProcessAsUserAá äˆPCMSG_RECIPIENT_ENCODE_INFOâ, äˆCryptCancelAsyncRetrievalè ˆPFN_CANCEL_ASYNC_RETRIEVAL_FUNCâh ä‰_ACLé‰SEC_IMAGE” äŠOLEOBJ_S_LAST¬ äŠENUMLOGFONTEXè Šget_doctypeâà ä‹SAFEARR_VARIANTâ  ä ‹IAuthenticate_Authenticate_Stubê‹SQL_DDL_INDEXH äŒIMAGE_REL_ALPHA_SECTIONêŒRpcServerUseProtseqIfExâ„ ä WRITE_OWNER✠ä S_THRESHOLDâ´ ä S_STACCATOãÐ äAC_LINE_UNKNOWNâè äMULTIKEYHELPW äSPI_GETTOGGLEKEYS ä LPMIXERCAPSAá< äRpcAsyncRegisterInfoéSQL_POS_DELETEã| äŽDOMAIN_ALIAS_RID_USERSã ä ŽSPHANDLEéŽRPC_C_NO_CREDENTIALSáÄ äCTRY_IRANè äTIME_CALLBACK_EVENT_PULSEèLogFileReadBytesá äCTRY_IRAQ0 ä JOY_BUTTON20áL äpszOrganizationêget_lastChild| ä‘NAMEENUMPROCW” ä ‘dwCPCommandâ¬ ä ‘JOY_BUTTON21áÄ ä ‘rgPolicyInfoáÜ ä ‘Authenticateé‘cauuidã ä ’PASSTHROUGHâ ä’VOS__PM324 ä ’JOY_BUTTON22áT ä’DoEnvironmentSubstWâl ä’VarI2FromUint ä’EMBDHLP_INPROC_HANDLERë’SQL_COLUMN_QUALIFIER_NAMEÔ ä“EnumFontFamiliesExWâì ä “JOY_BUTTON23á ä“MCIERR_HARDWAREâ( ä“IStream_Clone_Proxyê"“BINDINFOF_URLENCODESTGMEDDATAx ä”??_Erange_error@std@@UAE@I@Zá” ä”insert_node_atã¬ ä ”HANDLE_PTRãÄ ä ”e32_rsrccntâÜ ä ”DlgDirListAâø ä”midiOutLongMsgã! ä ”JOY_BUTTON24á,! ä”GetSaveFileNameê”PSD_ENABLEPAGEPAINTHOOKâh! ä •JOY_BUTTON25á€! ä •tagSF_TYPEë•SQL_IC_SENSITIVEá´! ä –BS_PUSHLIKEâÌ! ä–CTRY_PAKISTANì! ä–DMLERR_EXECACKTIMEOUT" ä –JOY_BUTTON26á(" ä–RpcBindingInqAuthClientAé–BINDSTATUS_CLASSIDAVAILABLEâp" ä—_MSL_EXTRAS_WIN32_HâŒ" ä—ftLastWriteTimeâ¤" ä —dwStreamIdã¼" ä —JOY_BUTTON27áÔ" ä—CoTaskMemFreeè—ODBC_ERROR_LOAD_LIB_FAILEDã# ä˜BidirectionalIterator4# ä ˜VK_CONTROLãP# ä˜GWL_HWNDPARENTãh# ä ˜JOY_BUTTON28é˜RevokeBindStatusCallbackáœ# ä™rintá°# ä™EMRPIEãÈ# ä ™JOY_BUTTON29é ™SignerIdáð# äšInitNewê(šIOleItemContainer_GetObjectStorage_Stubâ@$ ä›DIGSIG_E_CRYPTOâX$ ä›MULTIKEYHELPAp$ ä ›LPMIXERCAPSWé ›SCARDCONTEXTá¤$ äœKEY_CREATE_LINKâ¼$ ä œDrawEscapeëœAccessLocationãð$ ä LANG_CZECHëPORT_STATUS_PAPER_JAM$% äž_MCW_EMâD% äžCreateProcessAsUserWá\% äžMK_E_NOOBJECTt% ä žDWLP_DLGPROCá˜% äžCLSCTX_ESERVER_HANDLERã¬% ä žulCntStréžUPDFCACHE_ALLä% äŸSTARTF_USESTDHANDLESá& äŸERROR_UNHANDLED_ERROR & äŸOInetCombineUrlâ4& ä ŸnSizeMinéŸSQLRemoveDriverManagerãl& ä gmtimeã€& ä NPRECTã & ä ERROR_IS_JOIN_TARGETáÄ& ä CO_E_CANTDETERMINECLASSê PRINTER_NOTIFY_INFO_DATAáø& ä¡sinlá ' ä ¡MCI_SAVEá ' ä ¡RpcSsFreeè¡CDN_TYPECHANGEã\' ä¢PAN_FAMILYTYPE_INDEXáp' ä ¢UOI_NAMEáˆ' ä ¢CreateMenuã¬' ä¢ALG_CLASS_DATA_ENCRYPTë¢_SCARD_IO_REQUESTÜ' ä£wctransê£OLE_E_INVALIDHWND ( ä"¤CryptSetKeyIdentifierProperty8( ä ¤VT_DISPATCHâP( ä¤MoveElementToŒ( ä6¤IReleaseMarshalBuffers_ReleaseMarshalBuffer_Proxy¬( ä¤_wireSAFEARR_VARIANTé¤OLEIVERB_UIACTIVATEâÜ( ä¥sinhé¥JOY_CAL_READZONLY) ä¦_ABCá ) ä ¦MIDICALLBACKá8) ä ¦SO_CONNDATAê¦CERT_FIND_CERT_IDx) ä§SUBLANG_ENGLISH_TRINIDADáœ) ä§THREAD_QUERY_INFORMATIONá¸) ä§EMRPOLYTEXTOUTWê§CLSID_CCDGroupBoxè) ä ¨FileNameá* ä¨IMAGE_SYM_TYPE_CHARâ * ä ¨AlphaBlendë ¨SQL_OV_ODBC3áL* ä©rebindã\* ä©tailát* ä ©val_contextâŒ* ä ©VT_HRESULTë ©SQL_OV_ODBC2á¼* ä ªSERVER_NAMEâÐ* äªvalue_ãü* äªMIXERCONTROL_CONTROLTYPE_FADERã+ äªPROV_DH_SCHANNELá4+ äªrgpvStoreProvFuncèªSQL_MAX_MESSAGE_LENGTHã€+ ä«SYSYNC_FULL_VERSION_STRINGã+ ä«sinfáÀ+ ä&«CERT_STORE_PROV_GET_CTL_PROPERTY_FUNCè«ITypeMarshal_Size_Proxyâü+ ä ¬PP_CERTCHAINé ¬ReadMultipleá4, ä­WideCharToMultiByteâP, ä­CDERR_NOTEMPLATEé­JOY_CAL_READRONLY„, ä ®GetBkColorë®VARIANT_UserSizeá¼, ä¯ENUMRESTYPEPROCAáÜ, ä¯small_array_from_ndráô, ä¯hSCardContext- ä¯PRINTER_FONTTYPEé&¯SQL_CDO_CONSTRAINT_NON_DEFERRABLE`- ä°_MSL_USING_MW_C_HEADERSâ„- ä°PERSIST_E_NOTSELFSIZINGê °JOY_BUTTON30á¸- ä±EMRPOLYTEXTOUTAâÐ- ä ±JOY_BUTTON31áè- ä ±IPPROTO_IPã. ä!±ITypeLib2_GetLibStatistics_Proxyé±SQL_MULTIPLE_ACTIVE_TXNâ\. ä²RESOURCEDISPLAYTYPE_GROUPt. ä ²JOY_BUTTON32á . ä"²IMoniker_RemoteBindToStorage_Stubè²FR_NOWHOLEWORDãØ. ä³mem_fun1_ref_tãè. ä³__nâ/ ä³COLOR_INFOTEXTã/ ä ³PWAVEFORMATâ4/ ä ³IPersistFileé ³OnRunl/ ä´??_Grange_error@std@@UAE@I@ZáŒ/ ä´OF_SHARE_EXCLUSIVEë´_CMSG_RECIPIENT_ENCODE_INFOâÜ/ äµSERVICE_INTERACTIVE_PROCESSâð/ äµBLACKNESS0 ä µGetFocuséµSQL_ATTR_APP_ROW_DESCX0 ä)¶?$basic_ofstream@DU?$char_traits@D@std@@áx0 ä¶VER_SUITE_ENTERPRISEá˜0 ä¶ERROR_WMI_TRY_AGAINê¶HIST_NO_OF_BUCKETSãÐ0 ä·_SID_NAME_USEè0 ä ·dwStreamIDã1 ä&·CertGetCertificateContextProperty@1 ä ·PRINTER_NOTIFY_FIELD_PARAMETERSê·DefineFuncAsDllEntryá|1 ä¸LANG_ICELANDICãœ1 ä¸LPSHELLEXECUTEINFOã¼1 ä¸MSHLFLAGS_TABLEWEAKâà1 ä¸__IErrorLog_FWD_DEFINED__è¸SQL_INDEX_UNIQUEá2 ä¹remove_all_bounds42 ä¹ENUMRESTYPEPROCWá`2 ä¹ERROR_CTX_CLIENT_QUERY_TIMEOUTã„2 ä¹ERROR_DS_NAMING_MASTER_GCœ2 ä ¹SETKERNTRACKá¸2 ä¹DLGWINDOWEXTRAãÐ2 ä¹MMSYSERR_BASEô2 ä¹__IMarshal2_FWD_DEFINED__ 3 ä ¹tagBINDSPEEDé¹IXMLDOMNodeList_reset_ProxyâL3 ä ºBufferLengthád3 ä ºAlphaFormatâ„3 äºLBS_NOINTEGRALHEIGHTá¼3 ä.º__IXMLDOMDocumentFragment_INTERFACE_DEFINED__èºSQL_SFKD_SET_DEFAULTá4 ä»SECURITY_DESCRIPTOR_CONTROLâ4 ä »LongNameá44 ä»SM_CXMINSPACINGâL4 ä »SC_ARRANGEãl4 ä»CMSG_CERT_COUNT_PARAMè»SPLDS_PRINT_NOTIFYë ¼szOID_INFOSEC_mosaicKMandUpdSigâÌ4 ä½_MCW_DNâð4 ä½GetPrivateProfileStringâ 5 ä½PERF_QUERY_GLOBAL45 ä½IOCTL_DISK_REQUEST_STRUCTUREé½SQL_FN_STR_LOCATEd5 ä¾EISDIRã„5 ä¾IMAGE_REL_ALPHA_MATCH˜5 ä ¾PATINVERTè ¾RemovePropãÀ5 ä¿__bâà5 ä¿RPC_E_THREAD_NOT_INIT6 ä¿SPAPI_E_CANT_LOAD_CLASS_ICONá(6 ä¿PRINTER_NOTIFY_INFOâH6 ä¿IMoniker_Enum_Proxyê"¿_LPBINDSTATUSCALLBACK_DEFINED„6 äÀnegateã˜6 ä ÀlstrcmpAéÀBS_RADIOBUTTONãÔ6 äÁ_MSL_SIZE_T_DEFINEDâä6 ä ÁLPIID7 äÁPRTL_CRITICAL_SECTION$7 äÁVIETNAMESE_CHARSETã<7 ä ÁPALETTEINDEXáT7 ä ÁGWLP_WNDPROCé ÁSQLConnectãˆ7 äÂ_LOCALE_NAME_LENá°7 äÂCRL_REASON_CERTIFICATE_HOLDê#Â__IRpcChannelBuffer2_FWD_DEFINED__ã8 äÃIMAGE_REL_PPC_SECRELHIã8 ä ÃHPALETTE__ãL8 ä$ÃERROR_QUORUM_RESOURCE_ONLINE_FAILEDâ\8 äÃdwPOVèÃPSM_SETFINISHTEXTAã”8 ä Äparent_ptrã¬8 ä Ä__vector_podáÐ8 äÄASYNC_MODE_COMPATIBILITYé&ÄSQL_SQL92_NUMERIC_VALUE_FUNCTIONS9 äÅDEFAULT_SERVER_PASSWD09 ä ÅhwndFromáH9 ä ÅlpDialogFuncáp9 äÅI_RpcSsDontSerializeContextâ„9 äÅCALG_SHA1¨9 äÅMftBitmapWritesLazyWriterÀ9 ä ÅdwTrackFlagsáä9 äÅIID_ISynchronizeContainerèÅIMC_OPENSTATUSWINDOWá : äÆis_reference_impáH: äÆMinorOperatingSystemVersionâd: äÆResultFromScodeâ„: äÆDMPAPER_LETTERSMALLâ : äÆIssuerUniqueIdãÈ: äÆ_ENCRYPTION_CERTIFICATE_LISTáü: ä*ÆAsyncIAdviseSink_Finish_OnViewChange_StubèÆIME_CMODE_FULLSHAPEâ0; äÇolddataâT; äÇIPersistFile_Load_StubëÇIXTLRuntime_depth_Proxyâ”; äÈ_MSL_WPRINTF_Hã°; äÈGetClassInfoExAâÈ; äÈTPM_RETURNCMDì; äÈPDERR_DEFAULTDIFFERENTã< äÈ__IMarshal_FWD_DEFINED__á$< äÈtdSizeãH< äÈIXMLDOMDocument_save_StubèÈMkParseDisplayNameExáˆ< äÉNumberOfNamedEntriesá < äÉSetSystemTimeÈ< ä"ÉIXMLDOMNodeList_nextNode_Stubà< äÉVarUI4FromUI2èÉlpstblã= äÊERROR_NO_SUCH_SITEã4= äÊDISP_E_MEMBERNOTFOUNDP= äÊEnumFontFamiliesAx= äÊMCIERR_WAVE_SETOUTPUTINUSEã˜= äÊRpcMgmtInqComTimeoutá´= äÊIPPORT_BIFFUDPëÊVarUI4FromUI1à= ä ËSelectioná> äËWSA_QOS_ESDMODEOBJã> äËCF_BITMAP8> äËCRYPT_OID_INFO_ALGID_KEYéËFORM_USERx> ä&Ì@class$7668clientEngine_dbg___pch˜> äÌDeletePrinterDataExâÀ> äÌ__IAdviseSink2_FWD_DEFINED__áÔ> äÌ_MCX_H_êÌSQL_CODE_HOUR_TO_SECONDâ? äÍERROR_WMI_GUID_NOT_FOUNDá0? äÍEMR_CHORDH? ä ÍPROXY_PHASEâx? ä#ÍICreateTypeInfo2_SetCustData_Proxyã¤? ä ÍIXMLElement2_get_children_ProxyêÍSQL_AT_DROP_COLUMN_DEFAULTãÜ? äÎmaskáø? äÎSTATUS_PENDINGã @ äÎDOMAIN_ALIAS_RID_ACCOUNT_OPSéÎPROCESSOR_ARCHITECTURE_UNKNOWNãl@ äÏERROR_WMI_READ_ONLYâ„@ äÏVarUI4FromUI4è ÏCPS_CANCELã¼@ äÐGCPCLASS_POSTBOUNDRTLèÐLPSAFEARRAYBOUNDáô@ äÑREG_NO_LAZY_FLUSHA äÑPIPE_READMODE_MESSAGE,A ä Ñsockaddr_inâTA äÑ_CERT_BASIC_CONSTRAINTS_INFOátA äÑ_MIDL_SERVER_INFO_ã”A äÑSERVERCALL_ISHANDLEDéÑIOleObject_EnumVerbs_StubÔA äÒbasic_ofstreamãìA ä ÒWSAENOMOREãB äÒCALLBACK_THREADâ(B äÒCryptUnprotectDataë ÒBusTypeAtaã`B äÓCO_E_WRONGOSFORAPPãtB äÓWM_USERâŒB ä ÓWN_MORE_DATAá¬B äÓOFN_ALLOWMULTISELECTéÓSQL_DATA_AT_EXECáèB äÔDllCharacteristicsãC äÔENABLERELATIVEWIDTHSá C äÔFKF_AVAILABLE@C äÔLOCALE_FONTSIGNATUREéÔAVATAR_F2pC äÕRpcCallCompleteâC äÕPSM_SETFINISHTEXTWã¨C ä ÕgetAttributeé ÕSQL_US_UNIONáÔC äÖPST_X25âèC ä ÖlstrcmpWáD äÖGetTextMetricsãD äÖVOS__PM164D äÖMMIO_SHAREMODEë ÖMCI_ANIM_GETDEVCAPS_CAN_REVERSEâtD ä ×clearerré%×IXMLDSOControl_put_XMLDocument_Proxyá¼D ä Øe32_worderãØD äØ_HRESULT_TYPEDEF_ðD ä ØDMPAPER_LASTáE äØGetCursor(E äØCOLOR_INACTIVECAPTIONTEXTèØCLEANLOCALSTORAGETE äÙPINTápE äÙSizeofResourceã„E äÙPABCFLOAT E äÙCTRY_SINGAPOREã¸E ä Ù_WINNETWK_ëÙALG_SID_AGREED_KEY_ANYãðE ä ÚidThreadá F äÚPP_ENUMELECTROOTS(F äÚszOID_DSALG_SIGNáHF äÚCMSG_DETACHED_FLAGãpF äÚPFN_CMSG_IMPORT_ENCRYPT_KEYâŒF äÚDISK_PERFORMANCEéÚSQL_CT_GLOBAL_TEMPORARYâÈF ä ÛtagRGBTRIPLEáäF äÛGetKeyboardStateáG ä&ÛMIXERCONTROL_CT_SC_TIME_MICROSECS0G äÛCryptDuplicateHashë%Û_CHANGER_SEND_VOLUME_TAG_INFORMATIONáxG ä Ü_MSL_CSTDIOâ”G äÜEnumFontFamiliesWè ÜLoadCursorãÌG äÝERROR_EA_FILE_CORRUPTàG ä ÝXTYP_POKEèÝRpcNotificationTypeEventá$H äÞCONTEXT_E_NOCONTEXTâEcxê>SQL_FETCH_FIRST_USERáˆy ä?WM_PALETTEISCHANGINGá¤y ä?SPI_SETSTICKYKEYSè?ELEMENT_STATUS_ACCESSØy ä@wcslenãðy ä@LARGE_INTEGERáz ä @@7626z ä @DSS_DISABLEDá,z ä @UniqueIDá@z ä@WORD_BLOBxz ä-@IXMLDOMDocument_createDocumentFragment_Proxyé@URLZONE_PREDEFINED_MINã´z ä AdwReservedãÐz äAFS_CHINESETRADãèz äAFOF_FILESONLY { äAHashEncryptionAlgorithmâ${ äAMEMCTX_SHAREDè ASQL_SMALLINTáP{ äB__int32â`{ ä BAlgidˆ{ äBIStream_UnlockRegion_Proxyã¨{ äBCoFreeUnusedLibrariesèBSQL_UB_DEFAULTãÜ{ ä Cis_boundedëCIStream_Clone_Stubã | äDDEFAULT_EMAILS_LIMITEDã0| ä DrmdirH| äDXST_CONNECTED\| ä DPI_FLAGSéDOleNoteObjectVisibleáŒ| ä Esputc´| äEERROR_DS_REFUSING_FSMO_ROLESéESQL_DIAG_DROP_SCHEMAáì| ä FVK_OEM_102ã } äF_REMOTE_NAME_INFOAã,} äFCMSG_ENCRYPT_PARAMãL} äFNODE_CDATA_SECTIONëFSQL_COLUMN_TYPEâx} ä G@7621˜} äGRpcNsBindingExportAâÀ} äGPropSheet_SetHeaderSubTitleê&GICreateTypeInfo_SetAlignment_Stub~ äHREG_NOTIFY_CHANGE_SECURITYã4~ äHOutputDebugStringWãL~ ä HSavedHandleâ€~ ä(HIXMLDocument2_get_fileModifiedDate_Stubâ”~ ä HVTBIT_CYéHOleTranslateAcceleratorâÐ~ äICopyMetaFileWô~ äIMCIERR_NO_CLOSING_QUOTEêI__VARIANT_NAME_1éJ__VARIANT_NAME_2áH äK__VARIANT_NAME_3éK_QUERY_SERVICE_LOCK_STATUSAâ„ äLCreateICA  äL__VARIANT_NAME_4éLcwcharãÐ äMLMEM_DISCARDABLEáì äMPDRVCONFIGINFOã € äMMCI_ANIM_PUT_SOURCEêMV_DISPATCHREF@€ äNERROR_BAD_UNITãd€ äNERROR_RING2_STACK_IN_USEá|€ äNFF_DECORATIVEœ€ äNPAN_FAMILY_PICTORIALḀ äNwglCreateContextáЀ ä NLPHWAVEOUTãô€ äNALG_CLASS_KEY_EXCHANGEë NCERT_UNICODE_RDN_ERR_INDEX_MASKâ< äOExceptionRecordâT ä OALG_SID_HMACá| äOSPLDS_PRINT_NETWORK_ADDRESSêOapUnknown¨ äPthousands_sepÌ äPGetExceptionInformationâì äP_REMOTE_NAME_INFOWë!PIXMLDOMNode_get_firstChild_Proxyá,‚ äQEraseTapeL‚ äQRpcNsBindingExportWâd‚ ä QALG_SID_RC2∂ äQGET_CERT_ENCODING_TYPE㜂 äQAddRefã´‚ ä Q__tagBRECORDéQLPSUPPORTERRORINFOムä#RERROR_DS_SRC_OBJ_NOT_GROUP_OR_USERã ƒ äRMSGF_DIALOGBOXã<ƒ äRVFT2_DRV_KEYBOARDPƒ ä RNCBTRACEádƒ ä RsignscaleèRODBC_ERROR_INVALID_HWND✃ äSlocaltime¼ƒ äSFILE_DEVICE_8042_PORTøƒ ä/SAsyncIAdviseSink_Begin_RemoteOnViewChange_Stubë SprecisionèT_CERT_TRUST_STATUSãL„ äUPST_NETWORK_BRIDGEëUSEC_E_DECRYPT_FAILURE|„ äVmaxâ „ äVIMAGE_REL_ALPHA_ABSOLUTEáÄ„ äVOSS_REAL_DLL_NOT_LINKEDâÜ„ ä VALG_SID_RC5ê VPP_KEYSPECã… äWFOF_MULTIDESTFILESã,… ä WALG_SID_RC4âP… äW_PREVENT_MEDIA_REMOVALë WLPDEVNAMES㈅ äXLPSCARD_IO_REQUESTã°… äXIDropTarget_DragEnter_StubëXSQL_TABLE_STATãð… äYLOGON32_PROVIDER_WINNT35á † ä&YMIXERLINE_COMPONENTTYPE_DST_TELEPHONEè YMMIO_WRITEãL† äZCreateICW\† ä ZfVirt€† äZtagMCI_ANIM_PLAY_PARMS㜆 äZDUMMYUNIONNAME3êZIStream_Commit_Proxyáä† ä[ERROR_MAGAZINE_NOT_PRESENT㇠ä[ERROR_INVALID_HOOK_FILTER$‡ ä[RPC_S_INVALID_TAGH‡ ä[DNS_ERROR_NON_RFC_NAMEãX‡ ä [fTypep‡ ä [HMIXEROBJ__∇ ä[cDestinations¤‡ ä[DUMMYUNIONNAME2ê[LayOutã̇ ä\?B?BPBDâà‡ ä\Iterator1ø‡ ä\NTE_BAD_ALGID ˆ ä \WM_POWERá(ˆ ä\DUMMYUNIONNAME5âPˆ ä\PERF_COUNTER_HISTOGRAM_TYPEê\STGMOVE_SHALLOWCOPY⌈ ä]DUMMYUNIONNAME4â°ˆ ä]CertFreeCertificateChaináЈ ä]PORT_TYPE_REDIRECTEDáøˆ ä]_QUERY_SERVICE_LOCK_STATUSW≠ä]IME_SMODE_SINGLECONVERTê]SQL_CONCAT_NULL_BEHAVIORáP‰ ä^mapâh‰ ä^SidsToDisable€‰ ä^DRIVE_RAMDISK ‰ ä^OutputDebugStringA㼉 ä^QS_ALLPOSTMESSAGE؉ ä^IPPORT_NETSTATë^SetLcid㊠ä_Iterator2Š ä_CopyMetaFileA,Š ä _AngleArcé_LOCK_UNLOCK_IEPORTãhŠ ä`GetProfileIntW㌊ ä`LCS_GM_ABS_COLORIMETRICê`RpcAsyncCancelCallãÔŠ äaMCIERR_SEQ_DIV_INCOMPATIBLEâèŠ äaDomainã‹ ä*aCERT_PHYSICAL_STORE_OPEN_DISABLE_FLAG<‹ äaPROPSHEETHEADERW_V1_SIZEáT‹ ä aOpenPrinterAé aCDN_LASTá|‹ äbstrcatã ‹ äbXMIT_ROUTINE_QUINTUPLEãЋ ä%bICreateTypeInfo2_DeleteImplType_Stubáè‹ äbGetFieldNamesŒ äbACTIVEOBJECT_WEAKèbSQLCreateDataSourceWáHŒ äcIMAGE_REL_BASED_ABSOLUTEádŒ äcLPWIN32_STREAM_IDècBALTIC_CHARSET㌠ädabcBé dtagELEMDESC⸌ äeabcCáÐŒ ä eEMRBEGINPATHéeSCARD_READER_SWALLOWS äftagEMRSETDIBITSTODEVICEâ0 äfPMCI_PLAY_PARMSâT äfLPPRINTER_ENUM_VALUESWãh äfREGKINDê fFR_SHOWHELP⤠ägOSS_CONSTRAINT_VIOLATEDâ´ ägabcAégGCS_DELTASTARTãì äh_loc_time_cmpt㎠ähSB_THUMBPOSITIONá0Ž ähIPersistStorage_InitNew_ProxyèhSERVICE_STOPPEDâhŽ äi__decode_mbyteëiBSM_ALLCOMPONENTS Ž äjGMEM_NOCOMPACTãÀŽ äjwaveOutGetPositionãØŽ äjtree_into_ndrôŽ äjGetPrinterDriverA äjQueryServiceLockStatusWêjtagTIMESTAMP_STRUCTâL äkdwTypeãd ä kWSAENETDOWN∠äkSCardForgetReaderGroupWê kIMarshal_GetUnmarshalClass_StubâÈ ä lVK_KANJIáà ä lPRF_CLIENTãø ä lMB_TASKMODALá älMessageBoxIndirectã0 ä lCRYPT_READëlVarIdivâX äm_INT32ëmIAsyncManager_GetState_Stub☠ä nWAIT_TIMEOUTá° ä ntagEMRLINETOénRpcSmClientFreeâô äoJOB_OBJECT_LIMIT_VALID_FLAGSá‘ äoHCBT_DESTROYWNDâ,‘ äoGET_USER_DATA_REPL‘ äoSPLREG_MAJOR_VERSIONáx‘ äo__IUnknown_INTERFACE_DEFINED__㘑 äoPSU_SECURITY_URL_ONLYèoSQL_CONCUR_READ_ONLYáÜ‘ äpLPPRINTER_ENUM_VALUESAëp??_7ISynchronizeContainer@@6B@ã$’ äqExcludeUpdateRgná<’ ä qBM_SETSTYLEâT’ äqMCIERR_SET_CDè$q__IXMLDOMDocumentType_FWD_DEFINED__â ’ ärFILEOBJ_SUPPORTâÄ’ ärIS_TEXT_UNICODE_ASCII16âØ’ ä rPHOSTENTáì’ ä rDSSPUBKEYè)rIPropertyStorage_WritePropertyNames_Stubá0“ äsfreeáH“ äsBF_BOTTOMLEFTd“ äsDISPATCH_METHOD– äsOFN_NOVALIDATEë sSQL_RESTRICTᬓ ät__maskãÈ“ ätSizeOfStackCommitÜ“ ä tWN_CANCELètIPersistStream_IsDirty_Proxyá(” äuIMAGE_OS2_SIGNATURE_LEãD” äuSetEventHandleëudwModemVersionSizeã|” ävbase_iterator˜” ävGetProfileIntA㸔 ävWN_NO_MORE_ENTRIESãÔ” ävMCI_SYSINFO_NAMEáð” ävCERT_COMPARE_ATTRèv_tagStartParamã$• ä wwaveOutWriteáD• äwPERF_LARGE_RAW_BASEâ\• ä wOpenPrinterWé%w__MIDL_itf_unknwn_0005_v0_0_s_ifspecá • äxBAUD_7200À• äxERROR_NO_LOG_SPACEãÜ• äxERROR_DS_DUP_RDNéxMCIERR_FLAGS_NOT_COMPATIBLEê ysbuf_,– äzPTOKEN_SOURCEP– äzFILE_ATTRIBUTE_COMPRESSEDx– äzERROR_INVALID_SUB_AUTHORITY⤖ ä&zERROR_DS_SRC_AND_DST_NC_IDENTICALÀ– äzMWT_RIGHTMULTIPLYèzGCP_JUSTIFYINð– ä{SETDIBSCALING— ä{idFromë{??_7IHttpSecurity@@6B@ãD— ä|_EmptyMemberOptâh— ä|IMAGE_SUBSYSTEM_OS2_CUIâ„— ä|LMEM_NOCOMPACT㨗 ä|ERROR_OBJECT_NOT_FOUNDã¼— ä|WHITENESSÜ— ä|SCARD_DEFAULT_READERSø— ä|GetPrinterDriverWè|QueryServiceLockStatusAâ8˜ ä}PSINJECT_VMSAVEâP˜ ä}hszSvcPartnert˜ ä}SCardForgetReaderGroupAê}MDM_V110_SPEED_4DOT8K¤˜ ä~EaxâИ ä~PIMAGE_LOAD_CONFIG_DIRECTORY32ãè˜ ä~DMDITHER_NONEè~ISequentialStream_Read_Proxyá,™ ä_MSL_END_EXTERN_CP™ äPIMAGE_EXPORT_DIRECTORYâh™ äDV_E_STATDATAˆ™ ä_FOCUS_EVENT_RECORDâ ™ äDragQueryFileÄ™ äIXMLElement_get_text_Stubè.__IWindowForBindingUI_INTERFACE_DEFINED__š ä€pBufá4š ä"€IOleAutomationTypes_v1_0_s_ifspecè€IXMLDOMNode_get_dataType_Proxyã|š äTOKEN_STATISTICSéNotifyRoutineTable㸚 ä‚_EM_ZERODIVIDEãÌš ä‚LoadDllâèš ä‚pv_value_contextá › ä‚szOID_ENROLLMENT_AGENTã$› ä ‚NdrFcShortë‚SQL_CB_PRESERVEê ƒModifyMenuãl› ä „GCP_DBCSማ ä„GetWindowOrgExã › ä „EMR_PLGBLTãÔ› ä(„IDataAdviseHolder_SendOnDataChange_Stubê„GetAdviseœ ä …IOleObject_GetUserClassID_Proxyê…XMLELEMTYPE_COMMENTâLœ ä†SM_PENWINDOWSdœ ä †_BIN_TYPES〜 ä†LPSCARDCONTEXTë†PRINTER_ATTRIBUTE_NETWORKÀœ ä‡SelectClipPathãØœ ä ‡SC_VSCROLLãðœ ä ‡NRC_PENDINGê‡INET_E_REDIRECTINGã0 äˆpszCurrentDirectoryâH äˆPUBLICKEYBLOBh äˆszOID_PKIX_CA_ISSUERSè!ˆURLACTION_SCRIPT_OVERRIDE_SAFETYá¨ ä ‰fd_countáÔ ä ‰IStorage_RemoteOpenStream_Proxyê#‰IInternetProtocolRoot_Resume_Proxyã$ž äŠmidistrmbuffver_tagâ4ž ä ŠpbValdž ä&ŠIXMLDOMCharacterData_get_length_ProxyèŠSQL_CC_PRESERVE☞ ä ‹LPBINDHOSTã´ž ä‹SafeArrayCreateâО ä‹CreateServiceWë%‹SQL_AT_CONSTRAINT_INITIALLY_DEFERRED០äŒSHFileOperationWéŒ_wireSAFEARR_DISPATCH\Ÿ äRPC_SERVER_INTERFACEሟ ä&PKCS_CONTENT_INFO_SEQUENCE_OF_ANY¨Ÿ ädwDriverAttributesëStgCreateDocfileOnILockBytesáèŸ ä ŽtmLastCharã  äŽNPOUTLINETEXTMETRICâ$  äŽBS_RIGHTBUTTONã@  äŽRegQueryInfoKeyAá`  äŽPSM_SETHEADERTITLEAêŽGetDCOMProtocolVersionã   äSORT_CHINESE_PRCáÄ  ä_IMAGE_EXPORT_DIRECTORYâà  äLPMCI_LOAD_PARMSWá¡ ärghAdditionalStoreã¡ äPI_CLASSINSTALLêdwInstalledVersionMSéERROR_DS_DRA_GENERICál¡ ä‘mf_⌡ ä‘SE_GROUP_DEFAULTED㬡 ä‘WNNC_NET_MANGOSOFTãÌ¡ ä‘CryptMsgOpenToEncodeáè¡ ä‘SetVarCustData㢠ä)‘IXMLDOMDocument_get_implementation_Proxyé‘SQL_DESC_AUTO_UNIQUE_VALUEã\¢ ä ’e32_pagesizeát¢ ä ’C3_VOWELMARKᔢ ä’RpcMgmtSetComTimeoutáÄ¢ ä$’CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATEâô¢ ä&’IOleInPlaceFrame_EnableModeless_Proxyè’BINDSTATUS_PROXYDETECTING0£ ä “ReparseTagãT£ ä“IMAGE_REL_BASED_HIGHLOWâp£ ä“lfSmCaptionFontê “_tagBINDINFOᜣ ä”setvbufâ°£ ä ”FLI_MASKé”CRGBᤠä;•?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@ã(¤ ä•TAPE_DRIVE_TENSIONãL¤ ä•CERT_FIND_SUBJECT_NAMEã`¤ ä•mFlagsë•STGMEDIUM_UserMarshalœ¤ ä–ClearCommErrorë–MIXER_OBJECTF_MIDIOUTФ ä—S_SERMACTø¤ ä—MCIERR_ILLEGAL_FOR_AUTO_OPENá ¥ ä —DHPUBKEYá4¥ ä—SCARD_ATTR_VENDOR_IFD_TYPEë2—IRpcStubBuffer_DebugServerQueryInterface_Stubˆ¥ ä˜FACILITY_SECURITY´¥ ä ˜DNS_ERROR_FILE_WRITEBACK_FAILEDâÌ¥ ä ˜DS_ABSALIGNâè¥ ä˜RegQueryInfoKeyWé˜PSM_SETHEADERTITLEWâ0¦ ä™ERROR_DS_DRA_SCHEMA_MISMATCHáP¦ ä™WM_CTLCOLORSCROLLBARád¦ ä ™hszTopicဦ ä™LPMCI_LOAD_PARMSAè ™PSBTN_HELPã´¦ äšSHFileOperationAáЦ äšILayoutStorageëšV_DATEãø¦ ä ›auto_ptrá§ ä›THREAD_SUSPEND_RESUME0§ ä ›SetFileTimeâD§ ä›fdwLineâ`§ ä›PERF_COUNTER_BASE€§ ä›HCCE_LOCAL_MACHINEë2›IInternetSecurityManager_GetZoneMappings_Stub̧ äœRipInfoêœPEMREXCLUDECLIPRECT㨠äGlobalFix$¨ äRPC_C_OPT_MQ_ACKNOWLEDGEá<¨ äTF_DISCONNECTèCreateServiceA〨 äžERROR_INVALID_PIXEL_FORMAT㤨 äžSTG_E_EXTANTMARSHALLINGSáȨ äžCERT_RDN_ISO646_STRINGãì¨ äžCoRegisterMessageFilterâ© äžUPDFCACHE_ALLBUTNODATACACHEêžLPQUERY_SERVICE_LOCK_STATUSâ`© äŸIMAGE_REL_PPC_SECREL16ã„© äŸEVENT_E_USER_EXCEPTION㤩 äŸLoadCursorFromFileãÄ© äŸIEnumSTATPROPSETSTGêŸIEnumSTATPROPSETSTG_Reset_Stubãª ä  key_type᪠ä MessageBoxExA@ª ä LPUNIVERSAL_NAME_INFOWãXª ä  __WINEFS_H__áxª ä DeletePrinterDriverExè SQL_TRANSLATE_OPTIONá°ª ä ¡GetUserNameWáЪ ä¡dwPathLenConstraintâôª ä¡??_7IXMLDOMNodeList@@6B@é ¡__MIDL_IBindStatusCallback_0006âH« ä¢CERT_CREATE_SELFSIGN_NO_SIGNát« ä ¢IOleLink_SetUpdateOptions_Proxyê ¢__MIDL_IBindStatusCallback_0005âÀ« ä£_DisposeAllThreadDataà« ä£CRYPT_E_NOT_DECRYPTEDü« ä£MCI_MSF_MINUTE㬠ä£ActualCountArrayá4¬ ä£LPCREATETYPEINFO2è £__MIDL_IBindStatusCallback_0004ât¬ ä¤number㔬 ä¤lpProcessInformationáÀ¬ ä ¤__MIDL_IBindStatusCallback_0003âଠä¤BINDF_GETCLASSOBJECTé ¤SQL_ARD_TYPEá­ ä¥_TOKEN_PRIMARY_GROUPá<­ ä¥LANGGROUPLOCALE_ENUMPROCé ¥__MIDL_IBindStatusCallback_0002â„­ ä¦NPDEBUGHOOKINFO⨭ ä¦RegNotifyChangeKeyValueâÌ­ ä¦InitiateSystemShutdownExWè ¦__MIDL_IBindStatusCallback_0001â ® ä§e32_eipâ0® ä§ERROR_INVALID_DOMAINNAMEáL® ä§RPC_S_NO_BINDINGSh® ä§MWT_LEFTMULTIPLYá„® ä§DeleteColorSpace᤮ ä§pvKeyEncryptionKeyë §IXMLElement2áì® ä$¨szOID_PHYSICAL_DELIVERY_OFFICE_NAMEê¨SQL_CS_CREATE_SCHEMAá<¯ ä$©IAdviseSink_RemoteOnViewChange_StubâX¯ ä©HACCEL_UserSizeê©ImmGetCandidateListCountWè ªpcVal¨¯ ä«_SIZEOF_LONG_LONGЯ ä«ERROR_INVALID_HANDLE_STATEãä¯ ä«VK_ENDãü¯ ä «SO_DONTROUTEé«OleFlushClipboard4° ä¬SetWindowOrgExãP° ä¬NDR_ASCII_CHARãh° ä¬LPFORM_INFO_1è¬IServiceProviderᤰ ä­EndUpdateResourceAã¼° ä ­BLACK_BRUSHê ­DMBIN_USERãè° ä ®bitmaskxá± ä®PERF_RAW_FRACTIONè®SAFEARR_DISPATCHá4± ä ¯bitmaskyáH± ä¯BeginPath|± ä'¯CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH㜱 ä¯CryptHashCertificateé¯dwInstalledVersionLSáà± ä°InitiateSystemShutdownExAè °WN_SUCCESSë ±CRYPT_X942_PUB_INFO_BYTE_LENGTHâ@² ä²SEVERITY_ERRORã`² ä²CryptEncodeObjectExℲ ä²CERT_PRIVATE_KEY_VALIDITYœ² ä ²PFORM_INFO_1é$²__IClassFactory_INTERFACE_DEFINED__âä² ä³SECTION_QUERYø² ä ³OF_EXISTá ³ ä ³DM_COPIESè³VS_FIXEDFILEINFOá<³ ä´RIP_EVENTd³ ä´ERROR_UNABLE_TO_LOCK_MEDIA〳 ä´MULTIFILEOPENORDᘳ ä´__RPCDCEP_H__¬³ ä´GetSourceij ä ´PROPVAR_PAD2é´SQL_QUICKô³ äµOBJECT_TYPE_LISTá´ äµCS_BYTEALIGNWINDOWã(´ äµTRY_AGAIND´ äµPP_ENUMMANDROOTSáp´ ä µIXMLDocument_get_mimeType_Proxy∴ ä µPROPVAR_PAD3é µCDM_GETSPECâ´´ ä¶MS_DSR_ONд ä¶INPLACE_S_FIRSTâè´ ä¶MessageBoxExW µ ä¶LPUNIVERSAL_NAME_INFOAãDµ ä,¶IOleInPlaceFrame_TranslateAccelerator_Proxyâxµ ä*¶ICreateTypeInfo_SetFuncAndParamNames_Stubè ¶SQL_BP_CLOSEᬵ ä·tmpnam_temp_nameáĵ ä·PSID_NAME_USEൠä·dwCommittedSizeâøµ ä ·GetUserNameAá¶ ä·HS_HORIZONTAL@¶ ä$·IXMLDSOControl_get_readyState_Proxyê ·PROPVAR_PAD1ál¶ ä¸BAUD_1200Œ¶ ä¸OUT_OUTLINE_PRECIS㤶 ä ¸DEREGISTEREDáÀ¶ ä¸RevocationDateë¸SERIAL_IOC_MCR_OUT2âü¶ ä¹LOCALE_IMONLZEROá· ä¹NdrMarshSCtxtHdlé¹GetVarCustDataãX· äºlexicographical_compareât· äºCLIP_TT_ALWAYSã”· äºGetCanonicalFormatEtcèºGetCurMonikerÌ· ä»EndUpdateResourceWãà· ä»CreatePenü· ä»wglCopyContextã¸ ä »hwndPartnerâ0¸ ä»LPMIDICALLBACKë»SERIAL_IOC_MCR_OUT1âh¸ ä ¼_MSL_CTYPE_Háx¸ ä ¼FCHAR˜¸ ä¼LR_LOADTRANSPARENT㸸 ä¼FILE_DEVICE_SCREENãܸ ä¼IOCTL_DISK_IS_WRITABLEã ¹ ä$¼ICreateTypeLib2_DeleteTypeInfo_Stubê¼IXMLDOMNode_selectNodes_StubáP¹ ä½VirtualProtectãd¹ ä½LINGERãx¹ ä½cLocks㔹 ä½MDM_MASK_AUTO_MLé½ImmDestroyContextع ä"¾CO_E_FAILEDTOOPENPROCESSTOKENð¹ ä¾dwDisplayTypeº ä¾SCardIntroduceReaderá<º ä"¾IOleCache2_RemoteUpdateCache_Stubè¾SQL_COLUMN_NAMEâlº ä¿dwTrack∺ ä¿LPOINETBINDINFOê¿ImmGetCandidateListCountAĺ ä À_MSL_TIME_HâÔº äÀsbufáøº äÀIMAGE_REL_MIPS_SECTIONã» äÀMB_DEFBUTTON3èÀSQL_FN_TD_CURRENT_TIMEãL» äÁMK_E_NOPREFIXh» äÁBITMAPV4HEADER〻 äÁMB_DEFBUTTON2œ» äÁSQL_OAC_LEVEL2ëÁirowá¼» ä ÂCountÔ» äÂMB_DEFBUTTON1è» äÂLZCloseâ¼ ä&ÂMIXERLINE_COMPONENTTYPE_DST_FIRST(¼ äÂNRC_INUSE@¼ ä ÂLPDRAGINFOWâl¼ ä ÂszOID_PREFERRED_DELIVERY_METHOD⌼ äÂCERT_ALT_NAME_INFO㨼 äÂSQL_OAC_LEVEL1ëÂwszCorrelationãؼ äÃPointerã½ äÃSE_SYSTEM_ENVIRONMENT_NAMEã½ äÃDC_COPIES4½ äÃSTG_E_INVALIDHANDLEâH½ äÃPEMRARCâd½ äÃPEMRPOLYPOLYGON‽ äÃWM_HANDHELDFIRSTé&ÃCHANGER_IEPORT_USER_CONTROL_CLOSEȽ äÄisgreaterequalãä½ äÄForwarderStringâ¾ äÄERROR_WMI_DP_FAILEDâ,¾ äÄERROR_DS_INVALID_DN_SYNTAXãD¾ ä ÄPTEXTMETRICAá`¾ äÄ_ADAPTER_STATUSâ|¾ äÄpszAccessMethodâ¾ äÄVT_RECORD°¾ äÄSCARD_CLASS_ICC_STATEèÄPRINTPROCESSOR_INFO_1Wãø¾ äÅERROR_BAD_INHERITANCE_ACL¿ äÅPPSFEATURE_OUTPUT8¿ äÅLPMCI_WAVE_OPEN_PARMSAã\¿ äÅRpcNsBindingUnexportPnPAáx¿ äÅPropertySheetA㔿 äÅCoTaskMemAllocëÅCALPSTRâÈ¿ äÆSTG_S_MULTIPLEOPENSâà¿ ä ÆLPDIBSECTIONáÀ äÆSE_ERR_ASSOCINCOMPLETEã$À äÆ_SHELLEXECUTEINFOAëÆSERVICES_ACTIVE_DATABASEAhÀ äÇLPSECURITY_ATTRIBUTESÀ äÇDNS_STATUS_SINGLE_PART_NAMEâ¬À äÇDRAWTEXTPARAMSãÄÀ äÇMB_DEFBUTTON4àÀ äÇMCI_VD_PLAY_SCANé ÇpAdvSinkáÁ äÈ__sort132,Á äÈTAPE_DRIVE_ERASE_SHORTãTÁ äÈRpcMgmtStopServerListeningãxÁ äÈRpcBindingInqAuthInfoAã˜Á äÈMS_DEF_DSS_DH_PROV_Wá¸Á äÈszOID_OIWDIR_md2RSAê'È__ICatalogFileInfo_INTERFACE_DEFINED__ã äÉDNS_ERROR_AXFRã$ äÉMAKEINTRESOURCEAáD äÉNLS_IME_CONVERSIONã\ ä ÉWAVERR_SYNCâˆÂ ä!ÉBINDSTATUS_ENDDOWNLOADCOMPONENTSéÉCreateTypeLib2ãÀ äÊFOF_NORECURSIONâì ä&ÊCMSG_HASHED_DATA_PKCS_1_5_VERSIONà äÊF5_1Pt23_1024à ä ÊnMinPageéÊSQL_DB_DEFAULTãHà äËpointerâpà äËPF_COMPARE_EXCHANGE_DOUBLEãˆÃ ä ËPolyPolylineá Ã äËGetMenuItemID¼Ã äËRPC_BUFFER_EXTRAé ËSIOCSHIWATãìà ä ÌPCF_XONXOFFâÄ äÌLPTEXTMETRICWÄ ä ÌWM_IME_CHARâ8Ä äÌTotalByteLengthêÌCERT_ARCHIVED_PROP_IDlÄ äÍ_getcwdâ”Ä äÍSUBLANG_ENGLISH_PHILIPPINESâ°Ä äÍPHYSICALHEIGHTëÍDMRES_LOWØÄ äÎLongToPtrôÄ äÎBackupEventLogWêÎHlinkNavigateMonikerá$Å äÏEdiâHÅ äÏGetFileVersionInfoSizeëÏlpszLoggedUrlNamexÅ ä Ðget_sizeáÅ ä ÐUuidCreateã°Å äÐ_SHELLEXECUTEINFOWëÐSERVICES_ACTIVE_DATABASEWáÆ äÑERROR_DS_ATT_SCHEMA_REQ_SYNTAXã Æ äÑFirstTransportNumberé!ÑIXMLDOMNode_get_parentNode_ProxyálÆ äÒSTG_E_ACCESSDENIEDã„Æ ä ÒPTEXTMETRICWá Æ äÒWS_EX_TRANSPARENT¸Æ ä ÒDestroyCaretáÈÆ äÒbRedáìÆ äÒPRINTPROCESSOR_INFO_1AãÇ äÒ??_7IEnumFORMATETC@@6B@êÒVarDecFixHÇ äÓERROR_UNKNOWN_REVISIONãdÇ äÓShowWindowAsyncâˆÇ äÓLPMCI_WAVE_OPEN_PARMSWã¬Ç äÓRpcNsBindingUnexportPnPWéÓPropertySheetWãÜÇ äÔmemberãôÇ ä ÔLPDRAGINFOAêÔCRYPT_VERIFY_CONTEXT_SIGNATUREã4È äÕwstrrevâ\È äÕCRYPT_E_ISSUER_SERIALNUMBERâ€È äÕRpcServerUseAllProtseqsâ´È ä'ÕCRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETIONãÌÈ ä ÕComposeWithâðÈ äÕURLACTION_COOKIES_SESSION É ä$ÕICatalogFileInfo_GetJavaTrust_Proxyâ@É äÕGetServiceDisplayName`É äÕdwModemModelOffsetëÕSQL_API_SQLERRORé#Ö__IEnumOLEVERB_INTERFACE_DEFINED__ë×MediaInfoCountãÜÉ äØLANG_URDUÊ äØPIMAGE_LOAD_CONFIG_DIRECTORY64ã$Ê äØBackupEventLogAâ<Ê ä ØNRC_INCOMPãPÊ äØABE_RIGHTpÊ äØCHANGER_CLEANER_SLOTá„Ê ä ØHyperStréØ_LPIINTERNETSESSION_DEFINEDâÌÊ äÙWSA_QOS_EFILTERCOUNTáèÊ äÙWH_CALLWNDPROCãË äÙCHANGER_TO_SLOTêÙIME_CMODE_NOCONVERSIONãHË äÚSUBLANG_DUTCH_BELGIANtË äÚJOB_OBJECT_UILIMIT_GLOBALATOMSãŒË äÚdwBuildNumber¤Ë äÚLPTEXTMETRICA¸Ë äÚ_ABCFLOATÐË ä ÚLPHMIDIOUTëÚCTL_USAGEÌ äÛIMAGE_RESOURCE_DATA_ENTRYÌ äÛdsBmá,Ì äÛDC_ICONâPÌ äÛPCTL_FIND_SUBJECT_PARAëÛOLEWHICHMK_CONTAINERá¤Ì ä.Ü?$basic_filebuf@_WU?$char_traits@_W@std@@ÀÌ äÜMMIOM_WRITEFLUSHé ÜCRYPT_NEXTë#ÝCRYPT_DEFAULT_CONTEXT_PROCESS_FLAGãÍ äÞEdxâ4Í äÞLPMDICREATESTRUCTPÍ äÞWHDR_BEGINLOOPãtÍ äÞRpcBindingInqAuthInfoWã˜Í äÞRpcNsBindingImportDoneã¸Í äÞMS_DEF_DSS_DH_PROV_AéÞINET_E_OBJECT_NOT_FOUNDâðÍ äß_strrevâÎ ä ß_MAX_DRIVEã$Î äßMAKEINTRESOURCEWá@Î äßRPC_C_MQ_EXPRESSáhÎ äß??_7AsyncIAdviseSink2@@6B@ã Î ä,ßIInternetZoneManager_SetZoneAttributes_StubêßSQL_PARAM_PROCEEDÜÎ äàuninitialized_fill_náôÎ äàLPEXTLOGFONTAÏ ä àCreateDCá Ï ä àEnableWindowá<Ï äàLOCALE_STHOUSANDá\Ï äàLPOPENCARDNAME_EXAãtÏ ä àLayoutTypeëàGetObjectStorageéáSQL_UNKNOWN_TYPEá¼Ï ä âcountàÏ äâcompressed_pair_switchãüÏ äâERROR_NOT_OWNERâ,Ð ä$âMIXERLINE_COMPONENTTYPE_SRC_WAVEOUTâHÐ äâPERF_SIZE_ZEROëâLPINTERFACEDATAâ„Ð äãSPLDS_DRIVER_VERSIONéã??_7IOleInPlaceObject@@6B@ãÀÐ ää__int64âÔÐ ä äbitmask2áøÐ ääERROR_TOO_MANY_OPEN_FILES$Ñ ääSPAPI_E_DEVINST_ALREADY_EXISTSã<Ñ ääPMIXERCONTROL\Ñ ääPERF_INVERSE_COUNTERáxÑ ääSCARD_STATE_EMPTYÑ ääSQL_VARBINARY¨Ñ ä äSQL_IK_DESCêäSQL_SRJO_CROSS_JOINâàÑ ä åLGRPID_GREEKáüÑ äåWNetGetLastErrorAÒ äåIPPORT_TIMESERVERDÒ äåCERT_STORE_PROV_WRITE_ADD_FLAGã\Ò ä åCRL_FIND_ANYéåMoveFromIePortã˜Ò äæszOID_OEM_WHQL_CRYPTO¸Ò äæNdrPointerMemorySizeé æAsyncIPipeByte_Begin_Push_ProxyâøÒ äçwmemsetâ Ó ä çbitmask1á,Ó äçPROCESSOR_INTEL_486âDÓ äçGetWindowTextèçLPADDJOB_INFO_1WáxÓ ä èPEXTLOGFONTWáÓ ä èUnlockRegionéèSQL_CP_ONE_PER_DRIVERÀÓ ä êqsortàÓ äêPCERT_DSS_PARAMETERSáüÓ äêIOplockStorageë êSQLValidDSNWá4Ô äëWSA_QOS_EPSFILTERSPECLÔ ä ëENUMLOGFONTâ€Ô ä'ëCERT_MAX_ASN_ENCODED_DSS_SIGNATURE_LENã Ô äëDISPATCH_PROPERTYPUTé ëSQLErroráÈÔ äìCLRRTSãÜÔ ä ìIsWindowáøÔ äìKeyWrapAlgorithmáÕ äìget_implementationã0Õ äìWINOLEAUTAPI_èìSQL_API_SQLPARAMDATAéíCOMMON_LVB_SBCSDBCSâÕ äîSECURITY_DIALUP_RIDêîRegQueryValueExAáØÕ ä!ïERROR_DS_NO_REQUESTED_ATTS_FOUNDáðÕ äïtmDefaultCharÖ äïPERF_COUNTER_LARGE_RAWCOUNTâ8Ö äïCRL_DIST_POINTS_INFOé&ïCERT_TRUST_HAS_EXACT_MATCH_ISSUERxÖ äðexpm1fã”Ö äðOUT_STRING_PRECIS¬Ö ä ðRequestSizeâÌÖ äðMftWritesUserLevelëðIEnumString_Reset_Proxyâ× ä ñ_COMMCONFIGâ,× äñRpcNsProfileEltInqDoneãH× äñLPADDJOB_INFO_1AéñNI_CLOSECANDIDATEx× äòstrsetã”× äòLB_SETTABSTOPSã¨× äòtagCRGBâÄ× äòPCERT_NAME_INFOê(òIInternetProtocolSink_ReportResult_StubâØ äóERROR_NOT_LOGGED_ONâ8Ø äóWM_VSCROLLCLIPBOARDâTØ äóWNetGetLastErrorWŒØ ä+óIInternetSession_UnregisterMimeFilter_StubëóSQLBIGINTÀØ äôSUBLANG_ARABIC_IRAQâäØ äôERROR_INVALID_HOOK_HANDLEáÙ äôAPPCLASS_STANDARDèô??_7ICreateTypeLib2@@6B@é õSM_CYSCREENâXÙ äöERROR_CANTREADãpÙ äöLPEXTLOGFONTWˆÙ äöPFD_TYPE_RGBAœÙ äöVT_DATEâ¼Ù äöLPOPENCARDNAME_EXWëöSQL_ATTR_AUTO_IPDôÙ ä÷exception_codeãÚ ä÷szOID_RSA_preferSignedDataã<Ú ä÷lpDisplayInformationé%÷__MIDL_itf_unknwn_0005_v0_0_c_ifspecá€Ú ä ønew_sizeáœÚ äøRegQueryValueExWáÀÚ äøszOID_RENEWAL_CERTIFICATEÜÚ äøNdrOleAllocateëøURLTEMPLATE_PREDEFINED_MAXãÛ ä ùPolyBezierToá4Û ä ùPPOINTFLOATâPÛ äù_CMSG_STREAM_INFOèùMDM_X75_DATA_BTXá€Û äúexpm1lã”Û äú_Memberâ´Û äúLMEM_INVALID_HANDLEâÌÛ ä úDebugBreakãìÛ äúWS_EX_CONTROLPARENTâÜ äúF3_1Pt23_10240Ü ä úOleMetafilePictFromIconAndLabelêúSQL_SR_REFERENCES_TABLEâdÜ ä ûquote€Ü äûSECURITY_NULL_RIDœÜ äûCTLCOLOR_LISTBOXéûIRpcStubBufferãàÜ äüSTATUS_ARRAY_BOUNDS_EXCEEDEDáÝ äüERROR_DS_DECODING_ERRORâ$Ý äüRpcAsyncGetCallStatus8Ý äüpfnFreeâXÝ äüAPD_COPY_ALL_FILESë&ü__ISynchronizeMutex_FWD_DEFINED__´Ý ä%ýIXMLDOMDocument_get_parseError_ProxyéýOleDoAutoConvertáìÝ äþftLastAccessTimeáÞ ä þPEXTLOGFONTAá Þ äþotmusMinimumPPEMá4Þ äþMIIM_DATALÞ ä þIID_IPersisté þelemdescVarâ„Þ äÿRvaToFirstByteOfCodeá¤Þ äÿDISP_CHANGE_BADPARAMá¼Þ ä ÿpServerNameê ÿSQLFreeStmtâèÞ åBaseLowãß å CO_E_FIRSTã$ß åOSS_CANT_CLOSE_TRACE_FILE@ß åBSF_FORCEIFHUNGâ`ß åMCI_SET_DOOR_CLOSEDâ€ß åRPC_C_AUTHN_LEVEL_PKT ß åFOF_RENAMEONCOLLISIONéSHGFI_DISPLAYNAMEÐß ä max_sizeáøß äVER_PLATFORM_WIN32_WINDOWSãà ä BI_BITFIELDSá,à äVP_FLAGS_POSITIONXà ä"IXMLDocument2_get_readyState_StubèV_ISBYREFˆà ä_set_newnonptrmax¨à äSCHED_E_INVALID_TASKáÐà äCRYPT_E_INVALID_X500_STRINGâðà äGCP_NEUTRALOVERRIDEâá äBACKGROUND_INTENSITYá,á äFILE_DEVICE_KSãLá äSCardReleaseContextâ|á ä$IInternetBindInfo_GetBindInfo_Proxyê.URLPOLICY_AUTHENTICATE_CHALLENGE_RESPONSEÄá ä _getppidáàá äMK_E_UNAVAILABLEáüá äAnimatePaletteãâ äHTCLOSEâ(â ä MessageBoxWâ@â ä FoldStringAêCERT_STORE_CTL_CONTEXTã„â äIMPORT_OBJECT_HEADERéERROR_CTX_CONSOLE_DISCONNECTáÄâ ä e32_impmodãèâ äERROR_ALREADY_REGISTEREDáüâ äEndPathâã äTIMERPROC,ã äEnumDateFormatsWáPã äRPC_C_AUTHN_LEVEL_CALLãdã änPagesë SQL_CVT_TIMEá¨ã ä IMAGE_SYM_CLASS_END_OF_FUNCTIONâÐã ä"ERROR_INVALID_SERVICE_ACCOUNTèã äwaveInMessageä äRpcNsGroupMbrRemoveWéGetSessionOptioná<ä ä @temp_ptr@ëITypeLib_GetLibAttr_Stubá|ä änDebugInfoSizeã ä äPCERT_PHYSICAL_STORE_INFO¸ä ä hbmWatermarkáÔä äLPPROPSHEETHEADERè VarCyMuláüä ä AclSizeâå ä ERROR_HOOK_NEEDS_HMOD8å ä STG_S_RETRYNOWãPå ä FlashWindowê MIXER_OBJECTF_WAVEINá„å ä otmAscentè dwPositionXâ´å ä RC_BITMAP64âÐå ä MFT_RIGHTJUSTIFYáèå ä dwPositionYâüå ä dwAudioâ æ ä TYPEFLAG_FNONEXTENSIBLEâ8æ ä CDN_INITDONEé CPS_CONVERTâpæ ä STARTF_USESHOWWINDOWá„æ ä SW_SHOWê URLPOLICY_JAVA_CUSTOMÄæ ä ModifyWorldTransformáØæ ä AddJobãøæ ä ??_7IMallocSpy@@6B@âç ä LPERRORINFOê SQLTRANSIDãDç äGetPriorityClassé CTRY_BELARUSátç äungetc_buffer”ç äERROR_TOO_MANY_NAMESá¨ç ä SS_RIGHTáÔç ä"@class$7715clientEngine_dbg___pchè IROTData_GetComparisonData_Stubâ è äCHECKSUM_CHANGELOGãDè äSCARD_E_SERVICE_STOPPEDâdè äRpcNsGroupMbrRemoveAáxè ä MaxCountá¨è ä*__ITimeAndNoticeControl_FWD_DEFINED__Äè äGetComparisonDataøè ä'ITypeInfo_RemoteGetDocumentation_Proxyë formatNumberá(é ä PF_DATAKITësecurityAttributesã\é äwcstodã|é äAdjustTokenPrivileges”é ä get_charsetâ¨é ä DATAINFOéSQL_C_TINYINTÔé äE_FAILãðé äEnumDateFormatsAáê ä CERT_SYSTEM_STORE_RELOCATE_PARAâ8ê äUserIndexReadsã`ê ä"IXMLDOMNode_removeChild_Proxy„ê äINET_E_REDIRECT_FAILEDãœê äCC_ENABLEHOOKèSQL_TYPE_NULLÈê ä_lwriteâìê äERROR_BEGINNING_OF_MEDIAâë äcbBitsSrcë ä dwBitLené*__IXMLElementCollection_FWD_DEFINED__të ä#DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOTãŒë ä MessageBoxAâ¤ë ä FoldStringWê PROV_RNGáÔë äGetExceptionCodeáüë äIMAGE_RESOURCE_DIR_STRING_Uâì äWSAEUSERS(ì ä CB_GETCURSELéSPLDS_PRINT_END_TIMEáhì äCLIENT_CALL_RETURNã„ì äget_firstChildëSQL_ATTR_PARAM_OPERATION_PTRáÐì äSTATUS_FLOAT_STACK_CHECKáðì äSourceConstantAlphaêPSM_HWNDTOINDEXâ(í äMK_E_CANTOPENFILEèDragLeavePí äwcstolãhí ä logical_andâ„í äPC_POLYPOLYGONã˜í ä iVertGapá´í äWAVE_FORMAT_1M16éNdrServerInitializePartialãüí äSE_OWNER_DEFAULTEDãî äSetSystemPowerStateâ<î äLPGRADIENT_TRIANGLEâlî ä%__MIDL_itf_wtypes_0000_v0_0_s_ifspecéSendOnDataChangeáœî äwcstokãÀî ä??_7length_error@std@@6B@Üî äPST_PARALLELPORTéRPC_S_CALL_IN_PROGRESSã ï äIMAGE_NT_SIGNATUREëERROR_CANT_ACCESS_FILEãlï äPLUID_AND_ATTRIBUTES_ARRAYã„ï äREGDB_E_FIRSTè IErrorInfo_GetHelpContext_ProxyâÐï ä FILE_NAMED_STREAMSãèï ä FACILITY_URTáð ä DISK_HISTOGRAMë& ODBC_ERROR_INVALID_PARAM_SEQUENCELð ä!int_p_cs_precedeslð ä!__LPCGUID_DEFINED__â˜ð ä&!COMADMIN_E_COMPFILE_CLASSNOTAVAIL°ð ä !EMRELLIPSEãÄð ä !VK_RIGHTáàð ä!dwlDriverVersioné!PPROVIDOR_INFO_2áñ ä"OtherOperationCountâ0ñ ä "HACCEL__á@ñ ä"frm4é"PPROVIDOR_INFO_1ápñ ä#LANGIDã˜ñ ä#DBG_UNREFERENCED_PARAMETERã¬ñ ä#_OFSTRUCTÈñ ä#ERROR_FULL_BACKUPäñ ä#EnumICMProfilesAáüñ ä #ABM_SETPOSã$ò ä#CHANGER_CARTRIDGE_MAGAZINEãDò ä#PropSheet_PressButtonxò ä)#AsyncIUnknown_Begin_QueryInterface_Proxyé#Finish_OnViewChangeâ¨ò ä$frm2áÐò ä$szOID_PRESENTATION_ADDRESSãôò ä$SCARD_T1_EPILOGUE_LENGTHáó ä$IEnumFORMATETC_Clone_Proxyã@ó ä$COINIT_APARTMENTTHREADEDá\ó ä$memidConstructorátó ä$SQL_CVT_WCHARè$SQL_SO_STATIC°ó ä%FILE_FLAG_DELETE_ON_CLOSEÈó ä %MF_MENUBREAKáØó ä%frm3âô ä%ICreateTypeInfo_SetMops_Stubé%QueryServiceObjectSecurityãDô ä&SetPriorityClassá\ô ä &PC_EXPLICITê&SND_ASYNC„ô ä 'COLORRESá”ô ä'frm1á¸ô ä'tagMCI_OVLY_WINDOW_PARMSAÌô ä'AF_PUPãìô ä'pszUsageIdentifierë 'rtMargináõ ä(Remaining(õ ä(Vertex2âDõ ä(SetWindowsHookWâ`õ ä(LR_DEFAULTSIZEã|õ ä(midiOutSetVolumeá”õ ä(IPPORT_SYSTATè(_SERVICE_STATUSâØõ ä)ERROR_DEVICE_NOT_PARTITIONEDáüõ ä)SPAPI_E_NO_COMPAT_DRIVERSö ä)Vertex3ê)MCIERR_UNNAMED_RESOURCEâPö ä*LBS_MULTIPLESELâdö ä*OnSaveë*VectorFromBstrãœö ä+int_n_sign_posnâ¸ö ä+ForwardIteratorâÌö ä+PINT64ãàö ä+Vertex1âôö ä +HKL_PREVá÷ ä+MCIERR_CANNOT_LOAD_DRIVERD÷ ä!+CertVerifyCertificateChainPolicyá€÷ ä1+ILayoutStorage_ReLayoutDocfileOnILockBytes_Proxyáœ÷ ä+DCOM_CALL_STATEê +LPCHOOSEFONTáØ÷ ä,LOGON32_LOGON_INTERACTIVEáø ä",ERROR_BAD_LOGON_SESSION_STATEø ä ,_devicemodeAé,HCF_HOTKEYACTIVEáHø ä-UINT32ãhø ä-RpcSsDisableAllocateá”ø ä -CHANGER_PREMOUNT_EJECT_REQUIREDê -elemdescFuncáÈø ä.CreateDIBitmapãÜø ä .NF_QUERYáðø ä .fReleaseá ù ä.PDRVCONFIGINFOEXá$ù ä._SCHANNEL_ALGè.SetSessionOptionálù ä&/@class$7717clientEngine_dbg___pchŒù ä/PRINTER_ERROR_SEVEREá ù ä /IBindCtxé/TYPEFLAG_FCANCREATEê0CCH_MAX_PROPSTG_NAMEáøù ä 1AccessCheckâ$ú ä 1DNS_ERROR_DATAFILE_OPEN_FAILUREâ<ú ä 1GCP_CLASSINâ`ú ä1tagMCI_OVLY_WINDOW_PARMSWè!1_CERT_SYSTEM_STORE_RELOCATE_PARAá ú ä 2COLORREFá¸ú ä 2TEXTMETRICë 2DT_PLOTTERãðú ä3WSA_QOS_ESERVICETYPEáû ä3CERT_STORE_CRL_CONTEXTã8û ä3WMI_DISK_GEOMETRY_GUIDãdû ä 3IMarshal_DisconnectObject_Proxyâû ä3IMoniker_CommonPrefixWith_Stubã¨û ä 3LPOLEWINDOWê3_speedãÜû ä4MaximumAllocationSizeøû ä4WAVE_FORMAT_1M08é4pwszChallengeStringâ@ü ä5CO_E_WRONGTRUSTEENAMESYNTAXâ\ü ä5EnumICMProfilesWátü ä5EMR_RECTANGLEœü ä5PD_ENABLESETUPTEMPLATEHANDLEé*5SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATEèü ä6ERROR_SWAPERRORê6BINDSTATUS_FINDINGRESOURCEã0ý ä7IMAGE_REL_I386_SEG12áHý ä 7dwAvailPhysâ`ý ä7PC_WIDESTYLEDý ä%7__MIDL_itf_unknwn_0000_v0_0_s_ifspecé*7SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATEèý ä8TAPE_DRIVE_WRITE_MARK_IMMEDâþ ä8DNS_ERROR_RECORD_TIMED_OUTã$þ ä8VK_BACKâHþ ä8ERROR_LABEL_UNREADABLEãlþ ä8IOleInPlaceActiveObjectê8SQL_CA1_SELECT_FOR_UPDATEè9RpcMgmtInqIfIdsâÄþ ä :ne_swapareaâäþ ä:LOGON32_LOGON_BATCHâüþ ä :_devicemodeWá$ÿ ä":CMSG_CMS_RECIPIENT_INFO_PARAMDÿ ä:SCARD_ATTR_MAX_CLKãlÿ ä:IMPLTYPEFLAG_FDEFAULTVTABLEê:GetSecurityId”ÿ ä;fromá´ÿ ä;MCIERR_CREATEWINDOWâÌÿ ä;CF_ENABLEHOOKðÿ ä;MDM_PROTOCOL_ANALOG_RLPê;SQL_CA2_LOCK_CONCURRENCYá4 ä<SERVERALERT_SUPPORTâ` ä <IMAGE_COMDAT_SELECT_ASSOCIATIVE†ä<Finish_OnDataChangeê <TIME_STRUCTâ° ä=DM_REPOSITIONÈ ä =CTRY_JAPANë=MDM_V110_SPEED_2DOT4K ä>TYPE_E_OUTOFBOUNDSã$ ä>SetWindowsHookAê>SuspendâX ä?PROCESSOR_STRONGARMâl ä ?cbDetailsè&?@class$7716clientEngine_dbg___pch¨ ä@minâÐ ä@PAN_MIDLINE_STANDARD_TRIMMEDáä ä @CreateICá ä@EMRSETWORLDTRANSFORMá ä @itemActionã< ä@SWP_ASYNCWINDOWPOSã` ä@RpcNsBindingLookupBeginAát ä @cCustDataè @uniqueIDᬠäAPMEMORY_BASIC_INFORMATIONÄ ä AlpImageNameâè äAObjectDeleteAuditAlarmWâ äASESSION_HEADERëA_NDR_PIPE_MESSAGE< äBTYPE_E_INVALIDIDé BCodePageNameál ä CPRLIST_ENTRYጠäCRTL_RESOURCE_DEBUG㤠äC_STARTUPINFOWÄ äCtagMCI_VD_PLAY_PARMSáè äCRpcNsBindingUnexportPnPâ äCIXMLDocument2_get_root_Stubê$CIInternetSession_CreateBinding_StubâT äDstrchrãh äDSSTF_NONE| ä DCmdByteséDWaitForPrinterChangeáÄ äEERROR_DS_TIMELIMIT_EXCEEDEDâØ äEcBlueBitsð ä EMM_MCINOTIFYá äEMCI_OVLY_WINDOW_PARMSAã8 äEIWinTypes_v0_1_s_ifspecâx ä5EIGlobalInterfaceTable_RegisterInterfaceInGlobal_Stubá  äEURLOSTRM_USECACHEDCOPY_ONLY⸠ä EVariantClearáÌ ä EVarDecNegèEdwModemManufacturerOffset ä FTC_SO_ABLEã$ äFGetPrinterDataWê"FIPersistFile_GetCurFile_Proxyh äGiterator_category„ äGMCI_INFO_PARMSWê GpParametersâÌ ä*HJOBOBJECT_END_OF_JOB_TIME_INFORMATIONè äHPEMRPOLYPOLYGON16ü äH_ICONINFO( ä"H__IDropSource_INTERFACE_DEFINED__èHLPQUERY_SERVICE_CONFIGAât äIERROR_SEVERITY_INFORMATIONALéIIXMLDOMNode_get_parsed_Stub⬠äJmidâÌ äJDdeClientTransactionáì äJwaveInGetErrorTextWâ ä"JIUnknown_QueryInterface_Proxy$ äJplValèJSQL_SNVF_CHAR_LENGTHád äKPMCI_SYSINFO_PARMSAê4KBASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAG⸠äLGetHandleÌ äLMSGF_USERà ä LKP_ALGIDáü äLCERT_COMPARE_ANYá äLCIP_NEWER_VERSION_EXISTSéLSysFreeString` ä"MFORMAT_MESSAGE_MAX_WIDTH_MASKx ä MLPPELARRAYã” äMMCI_SEQ_DIV_PPQNá° äMSCARD_WARM_RESETáÌ äMCALLTYPE_ASYNCë MVarR8Roundã äNPROCESS_HEAP_REGIONâ ä NWSAENOTSOCKâ4 äNlpszClassName` ä"NCERT_QUERY_CONTENT_SERIALIZED_CRLèNIID_IDummyHICONIncluder☠äOdetailsâÄ ä&O@class$7711clientEngine_dbg___pchà äOSE_ERR_DDEBUSYãø ä O_CERT_CHAINâ$ ä!OIXMLDOMAttribute_get_value_ProxyáT ä#OIBinding_RemoteGetBindResult_ProxyëOSQL_API_SQLALLOCHANDLESTD˜ äPRPC_S_INVALID_BINDING¼ äPVP_TV_STANDARD_SECAM_KãØ äPGetPrinterDataAâð ä PlpszFileNameéPIsIIDSupportedã äQwmemchrâ@ äQIMAGE_SCN_MEM_SHAREDá` äQtagEMRSETCOLORSPACEâx ä QSM_CXHSCROLLá” äQMCI_INFO_PARMSAâÄ ä#QCHANGER_BAR_CODE_SCANNER_INSTALLEDëQIBinding_SetPriority_Proxyã äRERROR_INVALID_SECURITY_DESCRé&RCERT_CREATE_CONTEXT_NO_ENTRY_FLAGX äSPFD_SWAP_COPY| äSVP_TV_STANDARD_SECAM_H㜠äSCONNDLG_NOT_PERSISTêSMCI_OVLY_WINDOW_PARMSWãÜ äTWNNC_NET_IBMALãø äTWAVE_FORMAT_2M08á  ä THP_ALGIDá$ ä TXLAT_CLIENTêTILockBytes_WriteAt_Proxyáp äUJOB_OBJECT_UILIMIT_DESKTOP㈠äU_STARTUPINFOA¨ äUCOMM_FAULT_OFFSETSëUNdrCorrelationPassãô ä VERROR_DS_DRA_REF_ALREADY_EXISTSâ äVotmsUnderscoreSizeã8 äVRpcNsBindingLookupBeginWá\ äVCMSG_RECIPIENT_INFO_PARAMx äVpfnFindCallback✠äVURLZONE_PREDEFINED_MAXëVSQLBrowseConnectáÜ äWObjectDeleteAuditAlarmAã äWVP_TV_STANDARD_SECAM_Lã ä WINPUT_RECORDá0 ä WWAVERR_BASEâX ä"WNdrConformantStringMemorySizel ä WtagMKSYSéWMDMVOLFLAG_LOWã° äXFILE_FLAG_BACKUP_SEMANTICSãÜ ä&XERROR_DS_CANT_DEL_MASTER_CROSSREFð ä XhwndSinká ä XMB_COMPOSITEá$ äXMENU_EVENT_RECORD@ äXPMCI_SEEK_PARMSâT ä XFD_WRITEé&XSQL_AD_CONSTRAINT_NAME_DEFINITION˜ ä YSM_CYHSCROLLá¼ äYVP_TV_STANDARD_SECAM_Bãì ä%YCERT_SYSTEM_STORE_CURRENT_SERVICE_IDá ä YBitmapWritesFlushForLogFileFullâH ä%YPRINTER_CHANGE_DELETE_PRINTER_DRIVERál äYIEnumSTATSTG_Next_StubëYCreateAsyncBindCtx㤠ä ZWM_MDINEXTë,ZURLACTION_INFODELIVERY_NO_REMOVING_CHANNELSâð ä[uniqueã ä[SUBLANG_ENGLISH_JAMAICAâ, ä [lpszMenuNameáL ä[RPC_C_FULL_CERT_CHAINd ä [SHGFI_PIDLã| ä [PROV_STT_ISSᬠä%[__MIDL_itf_wtypes_0003_v0_0_c_ifspecé [UI_CAP_ROT90áÜ ä \OLE_E_LASTãð ä\VK_CANCEL ä \rgchMemberã, ä\VP_TV_STANDARD_SECAM_GãP ä\LOCALE_SABBREVLANGNAMEãp ä\waveInGetErrorTextAê\SCARD_READER_TYPE_PCMCIAᬠä ]NPPELARRAYãÔ ä"]MCIERR_NONAPPLICABLE_FUNCTIONô ä]PMCI_SYSINFO_PARMSWâ  ä ]STUB_THUNKë]IID_IAsyncManager@ ä ^PDWORD_PTRãl ä^PISECURITY_DESCRIPTOR_RELATIVE㈠ä^CLIPBRD_E_FIRSTâ  ä ^FreeBuffer㸠ä ^CC_RGBINITë^LPQUERY_SERVICE_CONFIGWâø ä_ClearCommBreakã ä_ImpersonateSelfâ, ä_MFT_SEPARATORD ä _SC_RESTOREãh ä_VP_TV_STANDARD_SECAM_Dã ä_LPMIXERCONTROLDETAILS_SIGNEDá¼ ä"_@class$7710clientEngine_dbg___pchè_??_7IEnumSTATPROPSTG@@6B@ø ä `HeapReAllocâ ä`CLIPBRD_E_CANT_CLOSEá8 ä`GCLP_HBRBACKGROUNDãL ä`HWAVEINâd ä`__RPCNSIP_H__€ ä`LPPRINTER_INFO_5á” ä `get_typeé `VTBIT_I1áÄ äaLPPRINTER_INFO_4áü ä,aAsyncIAdviseSink_Begin_RemoteOnRename_Proxyâ$ ä"aIAdviseSink_OnDataChange_StubP ä aITypeInfo2_GetAllCustData_Proxy†ä&aIXMLDOMElement_setAttributeNode_Proxyè"aIME_ITHOTKEY_RESEND_RESULTSTR¼ äb_OBJECTIDè ä bSPAPI_E_NO_SUCH_INTERFACE_CLASSâ äbNDR_USER_MARSHAL_INFOèbLPPRINTER_INFO_7á@ äcjoyGetDevCapsWã` äcPCRYPT_INTEGER_BLOBâ| äcLPPRINTER_INFO_6ᘠäcIID_IStubManagerá¼ äc??_7IPropertyStorage@@6B@è cVTBIT_I2áì ädLPPRINTER_INFO_1á ädLPMONITOR_INFO_1á, ädIRunnableObject_Run_ProxyD ä dLPTYPEINFOëdSQL_TRANSACTION_SERIALIZABLEá” äeERROR_DS_SIZELIMIT_EXCEEDEDâ° äeSPLDS_PRINT_RATEáÐ äePROPSETHDR_OSVER_KINDè eVTBIT_I4á äfCreatorBackTraceIndex  äfGetProfileStringá< äfGetSiteDirectoryAT ä fICMENUMPROCâp äfLPPRINTER_INFO_3é fIViewObjectâ  ägPELEMENT_TYPE¼ ägMoveFromTransportØ ägLPPRINTER_INFO_2égLPMONITOR_INFO_2é hElementTypeâ$ ä i__m56800E_osá8 äiOF_VERIFYX äiSEC_E_WRONG_PRINCIPALx äiMetaDataDiskWritesëiIME_KHOTKEY_HANJACONVERTḠäjCALLBACK_FUNCTIONÔ äjPARTITION_FAT_12á ä$jIWindowForBindingUI_GetWindow_ProxyêjOleDrawâ8 äk_LDT_ENTRY_DEFINEDã` äkERROR_DS_CODE_INCONSISTENCYâ| äkAC_LINE_ONLINEã” ä kiContextTypeᬠä kIDC_SIZENESWékRequestedUsageãä älGENERIC_EXECUTEâø ä lelpColorá  älGetBkMode  ä lpi_flagsáL älPFN_CERT_STORE_PROV_DELETE_CTLã\ ä lcBlobx älLPPRINTER_INFO_9ᤠäl__IOleClientSite_FWD_DEFINED__ãÄ älSQL_CREATE_COLLATIONélSQL_AT_DROP_COLUMN_RESTRICTã ämWA_ACTIVE  ämwaveInUnprepareHeader4 ä m_CRL_INFOèmLPPRINTER_INFO_8ál änMETA_SETWINDOWORG„ änVK_OEM_FINISHœ ä nLB_GETCURSELá¼ änVP_MODE_WIN_GRAPHICSáì ä#nCRYPT_LOCALIZED_NAME_ENCODING_TYPEënPARTITION_FAT_16á ä oJNI_SUPPORTâ@ äoLGRPID_CENTRAL_EUROPEd äotagMCI_VD_ESCAPE_PARMSAâ ä!oIBindCtx_RevokeObjectParam_ProxyᬠäoHDC_UserMarshalêoSQL_CATALOG_NAMEáä äpGetSiteDirectoryW! ä'pERROR_DS_CANT_TREE_DELETE_CRITICAL_OBJã0! äpOBJ_ENHMETADC@! ä phConvX! ä pszOID_PKCS_3épCRYPT_DEFAULT_OIDˆ! ä qiUsageSrcè qszOID_PKCS_2á¸! ä rszOID_PKCS_1érIMarshal_DisconnectObject_Stubã" äsDISP_E_UNKNOWNNAMEã$" äsCRYPT_E_NOT_IN_CTLã<" ä snLanguageIDê$s__IXMLDOMEntity_INTERFACE_DEFINED__â€" ät_NBitsã" ä tclear¬" ätRT_GROUP_CURSORâÈ" ätWS_CLIPSIBLINGSâÜ" ä tCAL_THAIáô" ä tszOID_PKCS_7á# ätUnregisterNameSpaceê t__ODBCINST_HáH# äuGetProcessTimesât# ä uERROR_INVALID_AT_INTERRUPT_TIMEâœ# äuERROR_PATCH_TARGET_NOT_FOUNDáÀ# äuCRYPT_E_NOT_CHAR_STRINGâÜ# äujoyGetDevCapsAãô# ä uszOID_PKCS_6á $ ä!uJOB_NOTIFY_FIELD_PRINT_PROCESSORé uTLIBATTRáD$ ävEipâd$ ävREG_CREATED_NEW_KEYâx$ ävdwSupport$ ä vszOID_PKCS_5á´$ ävCRYPT_FORMAT_STR_NO_HEXâä$ ä$v__IAsyncManager_INTERFACE_DEFINED__ê vAddErrorá% ä wszOID_PKCS_4éwCERT_ENCODING_TYPE_MASKâT% äxGetCurrentProcessIdâx% äxRESOURCEUSAGE_CONNECTABLEèxIDispatch_GetIDsOfNames_StubáÄ% äytagMCI_VD_ESCAPE_PARMSWê yIDataObjectâô% ä zFILE_BEGINã& äzPIPE_READMODE_BYTEã$& ä zFIXEDD& äzCONNECT_UPDATE_RECENT`& äzWAVE_FORMAT_2M16áx& ä zszOID_PKCS_9á¤& ä zIEnumFORMATETC_RemoteNext_ProxyêzBegin_OnLinkSrcChangeä& ä{KP_HIGHEST_VERSIONãü& ä {szOID_PKCS_8é{SQL_DIAG_DYNAMIC_FUNCTION4' ä |ULONG_MAXè |dwMaxLenát' ä!}RPC_C_OPT_MQ_TIME_TO_BE_RECEIVEDá ' ä}_CRYPT_TIME_STAMP_REQUEST_INFOãÀ' ä}CMSG_LENGTH_ONLY_FLAGì' ä}IOleClientSite_ShowObject_Stubë}ByteStrâ( ä~Generator4( ä~EnumFontFamiliesExãh( ä*~PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFOè2~IXMLDOMNamedNodeMap_removeQualifiedItem_Proxy¼( äEVENTSFORLOGFILEáÜ( äSYSPAL_NOSTATIC256ãô( ä NRC_CMDTMOã ) ä&@class$7712clientEngine_dbg___pch@) ä_CRYPT_KEY_PROV_INFOá`) äSPLREG_ARCHITECTUREâ”) ä'IOleInPlaceSite_DeactivateAndUndo_Stubã¸) äWM_CHOOSEFONT_SETLOGFONTéSQL_SP_ISNOTNULLáä) ä€eofã* ä€POINTER_64_INTã* ä €IsValidSidã4* ä€CO_E_RELOAD_DLLâT* ä€tagEMRSETMITERLIMITâp* ä€BSM_APPLICATIONSá”* ä€CERT_POLICY95_QUALIFIER1é€HMENU_UserFreeëSORT_CHINESE_UNICODEáô* ä‚PFD_SUPPORT_DIRECTDRAWã+ ä‚WM_GETTEXTLENGTHá,+ ä‚WS_EX_MDICHILDã<+ ä‚EndâX+ ä‚IID_ISurrogateë‚VarUintFromBoolâˆ+ äƒLPCVOIDâ¤+ äƒALG_SID_DH_EPHEMáÌ+ ä"ƒCMSG_INNER_CONTENT_TYPE_PARAMð+ äƒIEnumMoniker_Skip_Proxyâ, äƒCABOOLëƒMDM_GET_PROTOCOLINFOá8, ä„PUSHORTâP, ä „ZERO_PADDINGé„IMallocâ„, ä…RPC_S_INCOMPLETE_NAME¤, ä…EMR_SETWORLDTRANSFORM¼, ä …RPC_IF_OLEãà, ä…IID_ICancelMethodCallsë …CF_WYSIWYGã- ä †__set_errnoâ4- ä†LOCALE_IOPTIONALCALENDARé†iframe_xmit_errâx- ä‡ERROR_SPOOL_FILE_NOT_FOUNDã”- ä‡CRYPT_E_ASN1_RULEè ‡BS_RIGHTéˆWM_CHARê‰GetEnvironmentStringsAä. äŠRTL_CRITICAL_SECTIONá. äŠRPC_S_NO_PROTSEQS<. äŠDMPAPER_LETTER_EXTRAéŠLISTEN_OUTSTANDINGãx. ä‹ODBCAPI_SUPPORTâŒ. ä‹P_WAITã . ä‹UINT64ãÄ. ä‹SCARD_E_ICC_INSTALLATIONáÜ. ä ‹LPWAVEFORMATáô. ä ‹REGISTEREDë%‹SQL_CT_CONSTRAINT_INITIALLY_DEFERREDá ä«SECURITY_INTERACTIVE_RIDá4> ä«CO_E_IIDREG_INCONSISTENTáX> ä«CRYPT_E_ALREADY_DECRYPTEDt> ä«_FIND_NAME_HEADERè«MDM_SET_PROTOCOLINFOá´> ä¬CONTAINER_INHERIT_ACEÜ> ä"¬MCI_VD_GETDEVCAPS_CAN_REVERSE? ä¬PFN_CERT_STORE_PROV_DELETE_CRLë ¬unistd.há8? ä­LPCOLORADJUSTMENTT? ä­UnregisterClassâx? ä­SEE_MASK_CONNECTNETDRVãœ? ä­NdrMapCommAndFaultStatusé­IID_IXMLAttributeè®ImmGetConversionListWð? ä ¯CONTEXT_i486á@ ä¯SM_CYDRAG @ ä¯SM_CXMENUCHECKã<@ ä¯DROPEFFECT_LINKê¯URLACTION_CROSS_DOMAIN_DATAât@ ä°envâ@ ä°FLT_EVAL_METHODâ¼@ ä °ERROR_REMOTE_STORAGE_NOT_ACTIVEâè@ ä!°CERTSRV_E_INVALID_CA_CERTIFICATEâA ä °GCP_REORDERâA ä °BitmapWritesá,A ä °get_lineé°SQLWritePrivateProfileStringáxA ä±_MEMORY_BASIC_INFORMATIONŒA ä ±IDC_WAITá¨A ä±GetExpandedNameAá¼A ä±PF_ECMAâàA ä±??_7IPersistStream@@6B@ê+±IDirectWriterLock_ReleaseWriteAccess_Proxyã,B ä²hStdError@B ä²VK_KANAâlB ä ²MIXERCONTROL_CONTROLTYPE_SIGNEDâŒB ä²JOB_STATUS_OFFLINEë²SysStringByteLená¸B ä ³_FILEÌB ä³GroupIDâôB ä³IS_TEXT_UNICODE_STATISTICSãC ä³PDEVMODEW C ä ³DS_NOIDLEMSGá8C ä ³SBM_SETPOSë³MDM_GEN_V110_PROTOCOL_DATAãˆC ä"´ERROR_DS_INCORRECT_ROLE_OWNER¤C ä´QS_SENDMESSAGEãÈC ä´CERT_FIND_ISSUER_STR_Aë&´IRpcChannelBuffer_GetDestCtx_StubD äµPointerToRawDataá(D ä µPMIXERCAPSAâLD äµCertRegisterSystemStoreâ€D ä*µPFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNCèµCOLOROKSTRINGWã´D ä ¶dwExitCodeãÈD ä¶FUNCFLAGSøD ä$¶IXMLDOMNode_get_ownerDocument_Proxyâ0E ä+¶IXMLDSOControl_get_JavaDSOCompatible_ProxyãPE ä¶QUERY_SERVICE_CONFIGWè¶SQL_NNC_NON_NULLá„E ä ·__undef_osãœE ä·LookupContextÌE ä%·__MIDL_itf_unknwn_0000_v0_0_c_ifspecâF ä*·IPropertyStorage_WritePropertyNames_Proxyè·MDM_GEN_PROTOCOLINFOá8F ä ¸SM_ARRANGEã\F ä¸??_7IEnumSTATDATA@@6B@ë¸ImmGetConversionListAœF ä¹ERROR_NO_SPOOL_SPACEáÄF ä¹ERROR_HWNDS_HAVE_DIFF_PARENTáÜF ä ¹PSINJECT_EOFáôF ä¹SW_SHOWNORMAL G ä ¹WM_QUERYOPENá(G ä¹IsDBCSLeadByteExáHG ä¹DMLERR_MEMORY_ERRORê¹ConnectToPrinterDlgâ€G ä ºEMR_POLYLINEáœG äºWAVE_FORMAT_4M16á¬G ä ºpbOIDÌG äºNdrPipeSendReceiveãðG äºMAXIMUM_SMARTCARD_READERSH ä ºCoGetMallocêº__IXMLDOMNode_FWD_DEFINED__ê »N_BTMASKálH ä¼??_Glogic_error@std@@UAE@I@ZáH ä¼ERROR_INVALID_ICON_HANDLE¤H ä¼TC_NORMAL¸H ä¼EM_GETSELØH ä¼ALG_CLASS_MSG_ENCRYPTè¼CERT_RDN_ENCODED_BLOBè½tm_secã I ä¾__dataãHI ä¾RPC_S_INVALID_ASYNC_HANDLEãdI ä¾IPPORT_DISCARDã|I ä ¾AF_NETBIOSë¾LPBINDCTX¤I ä ¿ES_RIGHTáÈI ä¿FSCTL_OPLOCK_BREAK_NOTIFYè ¿__IXMLDOMNodeList_FWD_DEFINED__âJ ä Àbad_castá$J äÀWAVERR_BADFORMATéÀMDM_ERROR_CONTROLèÁSPLDS_USER_KEYãpJ äÂlroundãJ äÂERROR_EA_TABLE_FULLâ¬J äÂLoadMenuIndirectAÈJ äÂGetScrollRangeëÂDeletePrintProcessorWK äÃTOKEN_PRIMARY_GROUPâ0K ä"ÃIMAGE_COMDAT_SELECT_SAME_SIZEXK ä"ÃHEAP_DISABLE_COALESCE_ON_FREElK äÃBAUD_128K„K äÃClearEventLog¬K äÃ_CERT_AUTHORITY_KEY_ID_INFOê Ã__IServerSecurity_FWD_DEFINED__âìK äÄperrorãL äÄSetDefaultPrinter$L äÄSPLDS_SERVER_NAMEè Äget_versionâ\L äÅPAN_PROP_CONDENSEDãxL äÅSetMenuItemInfoWá¤L äÅMIXERCONTROL_CT_SC_LIST_SINGLEãÈL äÅIWinTypes_v0_1_c_ifspecêÅJOB_STATUS_DELETINGâøL ä ÆSleep(M ä*ÆERROR_DS_BUILD_HIERARCHY_TABLE_FAILEDSetProcessWorkingSetSizeáĆ ä>SetConsoleCursorInfoá܆ ä >MMIOM_RENAMEáü† ä>ELEMENT_STATUS_EXENABè >StgSetTimesâ,‡ ä ?BEGIN_PATHãL‡ ä?EMR_SETPALETTEENTRIESd‡ ä ?dwCPStandardé?_CRYPT_SEQUENCE_OF_ANYã ‡ ä @FP_INFINITE⸇ ä @mixerCloseë@IOleLink_BindIfRunning_Proxyáü‡ äAinsert_iteratorêADBG_CONTROL_C,ˆ ä B__FileReadãHˆ äBEMROFFSETCLIPRGNá`ˆ ä BCTRY_LEBANONéBSHAREVISTRINGA㔈 ä C__float_min⬈ ä CSetLastErroré CRDW_VALIDATEáìˆ äDDNS_ERROR_RCODE_FORMAT_ERRORéDSQL_PARAM_TYPE_UNKNOWNã,‰ äEGetProcessHeapsâD‰ ä EPolylineToã`‰ äEHELP_PARTIALKEYâ|‰ äECONNECT_PROMPT㜉 äECryptGetAsyncParamëEITypeLib_GetTypeInfo_Proxyãà‰ äFPEMREXTTEXTOUTWâø‰ ä FCTRY_JORDAN⊠äFCRL_DIST_POINTã,Š ä FtagSTATFLAGêFSQLGetAvailableDrivers《 ä#GCERT_QUERY_CONTENT_SERIALIZED_CERT㸊 ä-GIXMLDOMDocument_putref_documentElement_Proxyé*GIXMLHttpRequest_get_responseText_StubüŠ äHstrspnã$‹ äHERROR_DS_DNS_LOOKUP_FAILUREâ<‹ ä HOLE_E_STATICáT‹ äH_INPUT_RECORD€‹ äHAsyncIPipeLong_Begin_Pull_StubëHFUNCFLAG_FBINDABLEã´‹ ä ICE_FRAMEáÌ‹ ä IHC_NOREMOVEâè‹ äILB_GETITEMRECTäŒ ä IlpvarValueë-IIInternetZoneManager_GetZoneAttributes_ProxyáPŒ ä JSTARTUPINFOAálŒ äJdwComponentTypeêJGetDisplayName㨌 äKRPC_S_SERVER_TOO_BUSYÀŒ ä KSIOCGHIWATëKSQLPostInstallerErrorá äLERROR_DS_CANT_STARTâ äLPCMS_KEY_INFO4 äLSetImplTypeFlagsáP äLGetLibStatisticséLLPCHOOSECOLOR˜ ä#MERROR_NOLOGON_SERVER_TRUST_ACCOUNTëMOFN_EXTENSIONDIFFERENTãÐ äNrgbBlueâì äNLPMETAFILEPICT㎠ä NSelectObjectá Ž äNGCL_CBWNDEXTRAë"N__IXMLDOMEntity_FWD_DEFINED__\Ž äOstrcpyã|Ž äOWINSTA_READATTRIBUTES”Ž ä OSOUNDSENTRYWá´Ž äOCryptSignCertificateéOFILE_DEVICE_CD_ROMãüŽ äPERROR_DS_SCHEMA_NOT_LOADEDã äPPEMREXTTEXTOUTAâ0 ä PMOUSE_MOVEDâT äPCMSG_ENVELOPED_DATA_V2ãl äPGUID_TRISTATE˜ ä&PICreateTypeLib_SetDocString_ProxyÀ äPIXMLElement2_addChild_Proxyê4PIInternetProtocolSinkStackable_RollbackSwitch_Proxyâ ä Qkeep_0 äQPOSTSCRIPT_INJECTIONáD äQGetRgnBox\ ä QWS_CAPTIONãt äQDT_EXPANDTABSè&QCRYPT_PRIVATE_KEY_BLOB_AND_PARAMS¼ äRSM_CXDOUBLECLKãÜ äRWNNC_NET_PATHWORKSãô äRszOID_RSA_MD5‘ äRCMSG_ENVELOPED_DATA_V0ëRNdrFieldOffsetëSszOID_RSA_MD4d‘ ä TDC_BINNAMES⌑ äTDNS_ERROR_ZONE_NOT_SECONDARYᤑ ä TGCP_KASHIDAâÈ‘ äTSetProcessWindowStationâà‘ äTOemToCharBuffø‘ äTSetLocaleInfo ’ äTAccessã4’ äTSCARD_ATTR_ICC_TYPE_PER_ATRâP’ äTSHAREVISTRINGWëTSQL_ISV_COLUMN_PRIVILEGESŒ’ äUszOID_RSA_MD2è#U__ITypeFactory_INTERFACE_DEFINED__ãÐ’ äVwcsdupëVRPC_C_PROFILE_DEFAULT_ELT“ äWTAPE_DRIVE_ABSOLUTE_BLKâ8“ äWSEC_E_UNTRUSTED_ROOTá`“ äWCERT_ENCIPHER_ONLY_KEY_USAGEá|“ äWCryptHashMessageᜓ äWPDEVICE_MEDIA_INFOëWpUserNameГ äXERROR_INTERNAL_ERRORáø“ ä"XIEnumSTATDATA_RemoteNext_Stub” äXILockBytes_ReadAt_Proxyê,XIBindStatusCallback_RemoteGetBindInfo_Proxyâx” äYRPC_S_INVALID_NAME_SYNTAX” ä YSOUNDSENTRYAᬔ äYMCI_SAVE_PARMSãÀ” ä YUnadviseáÜ” äYURLPOLICY_QUERYâ• ä"YIEnumSTATPROPSETSTG_Next_Stub(• äYdwNegotiatedModemOptionséYSQL_CONVERT_WCHARX• äZwmemcpyât• äZRecursionCount㔕 äZERROR_MEMBER_IN_ALIAS°• äZSM_CYDOUBLECLKãØ• äZI_RpcBindingInqWireIdForSnegoèZCERT_REQUEST_INFO– ä[_getlogin(– ä[SECTION_MAP_EXECUTEâ<– ä[sa_dataê([IOleInPlaceSite_CanInPlaceActivate_Stub∖ ä \STARTUPINFOWᨖ ä\MCI_SYSINFO_QUANTITYá¼– ä\pDigestê\_NDR_CORRELATION_INFOð– ä ]swprintfá— ä]IsReparseTagNameSurrogate0— ä]EM_POSFROMCHARãL— ä]CTRY_TATARSTANãl— ä]ReservedForRuntimeã”— ä]IFillLockBytes_FillAt_Stub㬗 ä ]MDM_CELLULARé]SQL_INDEX_OTHERâð— ä"^SYSER_FORBIDDEN_PRODUCT_FLAGS˜ ä^search㘠ä ^upper_boundâ8˜ ä^_AUDIT_EVENT_TYPEè^offBitsâh˜ ä_SetConsoleTitle⌘ ä_IOCTL_SERENUM_PORT_DESCê_IPipeDouble_Push_StubÀ˜ ä`scalbnãؘ ä `FILE_READ_EAáð˜ ä `midihdr_tagâ™ ä!`CERT_STORE_NO_CRYPT_RELEASE_FLAGá8™ ä`CertFindAttributeè `StackTopál™ äaMETA_SCALEWINDOWEXTâ™ äaSCARD_T1_PROLOGUE_LENGTHé#aSQL_CDO_CONSTRAINT_NAME_DEFINITIONãÔ™ ä bMIIM_TYPEèbRPC_C_AUTHN_GSS_SCHANNELáš ä cNTM_ITALICã(š ä cDOF_DOCUMENTáPš äcEnumPrintProcessorDatatypesAáhš äctagMETHODDATAš äcSQL_PARAM_BIND_TYPE_DEFAULTêcSQL_C_INTERVAL_DAYãÄš ä dfUnicodeáÔš ädcAttrèdGetImplTypeFlagsá› ä fTOKEN_USERã › ä fLoaderFlagsâ8› ä fnDescriptionáX› äfPEMRSETDIBITSTODEVICEl› ä fDDE_FACKá„› ä fLPMALLOCSPY⬛ äfIXMLDocument_put_URL_ProxyãÌ› äfLPHANDLER_FUNCTIONë fATTR_INPUT㜠ä gSID_RECOMMENDED_SUB_AUTHORITIESâ(œ ä gEMRROUNDRECTá@œ ä gWH_MSGFILTERá`œ ägWSACancelBlockingCall|œ ägMEDIA_ERASEABLEêgCHANGER_EXCHANGE_MEDIUM⼜ ähMAP_FOLDDIGITSë'hIXMLDocument_get_fileUpdatedDate_Proxyã äi__uncheck_iteratorã0 äiMediaCharacteristicsé iSID_BindHostát äjERROR_INVALID_GROUP_ATTRIBUTESëjSCS_QUERYRECONVERTSTRINGá´ äkPFIND_NAME_HEADERØ äkCertCompareIntegerBlobãð ä kBindToObjectáž ä kSAFEARR_BSTRékIID_IInternetSecurityMgrSiteáPž älERROR_DEVICE_IN_USEâ|ž älCRL_DIST_POINT_ERR_INDEX_SHIFTëlSQL_DTC_TRANSITION_COSTêmDDL_EXCLUSIVEÔž änMCI_STATUS_READYénCLSCTX_LOCAL_SERVER⟠äoVirtualProtectExá$Ÿ ä opwszValueèoSQL_API_SQLGETFUNCTIONSâhŸ äp_IMAGE_FILE_HEADERㄟ äpSERVICE_ADAPTER⬟ äpSERIAL_IOC_FCR_FIFO_ENABLEãÄŸ ä pSwitchToFileáØŸ ä pParseUrlép_pinfoã  ä qparam_typeã$  äq__partition_const_ref<  äqFindFirstFilel  ä#qSPAPI_E_DEVINSTALL_QUEUE_NONNATIVE〠 ä qBINDSPEEDèqPSD_NONETWORKBUTTONâ´  ä rSONY_DTFérCreateStdDispatchø  äsJOB_NOTIFY_FIELD_DRIVER_NAMEá ¡ äsJOB_NOTIFY_FIELD_UNTIL_TIMEêsSQL_FN_NUM_ATANâT¡ ät__handle_openh¡ ä tvsprintfሡ ätERROR_NOT_DOS_DISK㤡 ätWN_BAD_PROFILEãÀ¡ ätIID_ISynchronizeé tLPCFHOOKPROCáì¡ ä uvwprintfᢠäuLANG_LITHUANIANâ ¢ äuIsBadWritePtr0¢ ä uwZposP¢ äuLPMCI_OVLY_SAVE_PARMSd¢ ä upfnAllocᔢ ä#uCERT_SYSTEM_STORE_LOCAL_MACHINE_IDã°¢ äuPRINTER_ENUM_NAMEèuEnumPrintProcessorDatatypesWáì¢ ävulOffsets£ ävERROR_BUS_RESETâ0£ ä"vOSS_CONSTRAINT_DLL_NOT_LINKEDD£ ä v__TVOUT__èvMCI_DEVTYPE_SEQUENCER„£ äwMCI_OVLY_PUT_FRAME㜣 äwStorageLayout¼£ äwPLINKSRCDESCRIPTORë%wIXMLDOMNode_get_nodeTypedValue_Proxyᤠä xMFT_BITMAP㤠äxSKF_INDICATOR8¤ äxVOS__WINDOWS16ãP¤ ä xWN_NET_ERRORáp¤ äxPERF_SAMPLE_FRACTIONé#xAsyncIUnknown_Finish_Release_ProxyãÀ¤ äySBM_SETRANGEREDRAWãì¤ äyIInternetProtocolSinkStackable㥠ä ySQL_DEFAULTê ySQL_UB_FIXEDá0¥ äz_accessâD¥ ä zHighWordá`¥ äzPSPROTOCOL_BINARY„¥ äzCERT_COMPARE_ENHKEY_USAGE°¥ ä&zIAsyncManager_GetCallContext_StubÈ¥ ä zIXMLDocumentáØ¥ äz_pidlèzSQL_MAX_STATEMENT_LEN¦ ä{PERF_COUNTER_RATE8¦ ä{CRYPT_FORMAT_RDN_REVERSEáh¦ ä%{CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFOሦ ä{pwszStoreDirectoryë{get_nodeTypeString㼦 ä|CLK_TCKâܦ ä|ERROR_SPECIAL_USERãð¦ ä |wsprintfá§ ä |FD_ACCEPTè|URLZONE_USER_MAXá<§ ä}_RefCountedPtrã\§ ä}CertAddCTLLinkToStore€§ ä}NdrSimpleStructBufferSize˜§ ä}PSH_WATERMARK¸§ ä}IStream_Stat_Proxyë }SQLINTEGERãð§ ä~STATUS_CONTROL_C_EXITè~SQL_API_SQLBINDPARAMETERá(¨ äbsearchâ@¨ ä GetUserNameêERROR_REQUEST_ABORTEDx¨ ä€DC_PAPERNAMES˜¨ ä€MOVEFILE_COPY_ALLOWED´¨ ä€CO_E_ERRORINDLLâب ä€OSS_OID_DLL_NOT_LINKEDë€GetServiceKeyNameAã© äIMAGE_SYM_CLASS_NULLá8© äERROR_DS_PARAM_ERRORáT© äPNDR_PIPE_MESSAGEp© äID_PSREBOOTSYSTEMè IPipeDouble⬩ ä‚IMAGE_SCN_ALIGN_8192BYTESÔ© ä‚PostQueuedCompletionStatusãð© ä‚bStrokeVariation᪠ä‚CTRY_LIECHTENSTEINã4ª ä‚SO_SYNCHRONOUS_NONALERTê‚SQL_DIAG_DROP_DOMAINáhª ä ƒcbOutQueጪ äƒMCIERR_CUSTOM_DRIVER_BASE¬ª äƒMCI_DEVTYPE_VIDEODISCèƒPRSPEC_PROPIDèª ä„REG_LEGAL_CHANGE_FILTERâ« ä„ERROR_IS_JOIN_PATHã« ä„offDataâ<« ä„IBinding_Suspend_Stubè„BINDSTATUS_SENDINGREQUEST|« ä…_MSL_IMP_EXP_CPPá « ä…ACCESS_DENIED_OBJECT_ACEá´« ä…VK_ESCAPEÔ« ä…DATEFMT_ENUMPROCEXA㬠ä…IXMLElement2_get_children_Stub㬠ä…HELPMSGSTRINGè…SQL_CURSOR_KEYSET_DRIVENáT¬ ä†InputIteratorp¬ ä†ALG_SID_RSA_ANY⌬ ä†rgNoticeNumbersâ°¬ ä†CreatePropertySheetPageWé †ImmNotifyIMEáà¬ ä ‡is_class_impá­ ä‡SCardRemoveReaderFromGroupWê ‡GetUserTypeâ8­ ä ˆhrPreviousãL­ äˆRGN_XORâh­ äˆGetPrinterDataë$ˆ__IDummyHICONIncluder_FWD_DEFINED__ê‰IID_IXMLDOMCharacterDataáØ­ äŠPSPROTOCOL_BCPãð­ äŠlpDescriptionèŠSQL_SNVF_CHARACTER_LENGTH<® ä‹ERROR_INVALID_PASSWORDNAMEã\® ä‹CTRL_SHUTDOWN_EVENTâp® ä‹iMethodê ‹CDN_FILEOKã ® ä ŒDATA_S_FIRSTáÀ® äŒCS_E_SCHEMA_MISMATCHáà® äŒ_CONNECTDLGSTRUCTWëŒLPENUM_SERVICE_STATUSA㯠äunlinkã,¯ ä strftimeáD¯ ä _IC_AFFINEã\¯ äES_CONTINUOUSx¯ äBS_DIBPATTERNPT┯ äLPCREATESTRUCT㼯 äLPOPENCARD_SEARCH_CRITERIAãô¯ ä+IBindHost_RemoteMonikerBindToStorage_Proxyë SQL_SVE_CASEá$° ä ŽSTILL_ACTIVEá@° äŽEMR_FLATTENPATHêŽRPC_ASYNC_STATEâp° ä SRCERASEጰ äLPDISCDLGSTRUCT⨰ äFindExecutableAâÔ° ä!IMarshal_GetMarshalSizeMax_Proxyáì° äIID_IPipeByteèVarDateFromDecã$± äbasic_streambufâD± äIMAGE_DATA_DIRECTORYá`± äLPCIEXYZTRIPLEãx± ä PS_TYPE_MASKጱ äEllipse⸱ ä SCARD_ATTR_DEVICE_FRIENDLY_NAMEâÔ± äPROPSHEETHEADERêCreatePropertySheetPageAá² ä‘SUBLANG_GERMAN_LUXEMBOURG8² ä‘GRADIENT_TRIANGLEP² ä ‘lpstrCommandál² ä‘ALG_SID_DSS_ANY┲ ä‘IOCTL_SMARTCARD_IS_PRESENTã¼² ä‘SCardRemoveReaderFromGroupAê ‘URL_ENCODINGáè² ä’ptMaxSize³ ä’MCI_ANIM_REALIZE_BKGD ³ ä ’CRYPT_SGCKEYé’PSNRET_NOERRORã\³ ä“DATEFMT_ENUMPROCEXW″ ä“_STORAGE_PREDICT_FAILUREᬳ ä “IDummyHICONIncluder_Dummy_Proxyâij ä“LPPARAMDESCEXܳ ä “BINDVERB_GETáü³ ä“URLTEMPLATE_MEDLOWë“ODBC_ERROR_GENERAL_ERRã<´ ä”_MSL_TIME_WIN32_HX´ ä”NTE_BAD_PROVIDERál´ ä”pProgIdâ´ ä”IOleCache_Uncache_Stubë”CFSTR_MIME_QUICKTIMEé•ITypeInfo_ReleaseVarDesc_Proxyäµ ä–PROCESS_QUERY_INFORMATION0µ ä$–ERROR_CLUSTER_LAST_INTERNAL_NETWORKâHµ ä –PEMRPOLYGONâ`µ ä–PMSGBOXPARAMS„µ ä–NdrUnMarshConfStringHdr⨵ ä–MediumChangerClassGuidãÀµ ä –pDescriptionáÔµ ä–nCopiesâôµ ä–GetServiceKeyNameWë–SQL_API_SQLGETDESCREC,¶ ä—GlobalReAllocL¶ ä—MultiByteToWideCharâl¶ ä—MCI_FORMAT_SMPTE_30ê —I_RPC_MUTEX✶ ä ˜_LIST_ENTRYâ°¶ ä˜PBITMAPâ̶ ä˜CBS_DROPDOWNLISTáä¶ ä ˜SaveObjectãø¶ ä ˜EXCEPINFOè ˜GetHelpFileâ,· ä™HWND_NOTOPMOSTãH· ä™FindExecutableWâd· ä™getprotobynameë™MDM_SHIFT_HDLCPPP_SPEED⨷ äštagMOUSEHOOKSTRUCTãÈ· äš_CONNECTDLGSTRUCTAãä· äšWSAGetLastErrorêšLPENUM_SERVICE_STATUSWã(¸ ä›PRINTER_STATUS_ERRORé›SQL_NOSCAN_DEFAULTã`¸ ä œwChannelMaskᄸ äœODBC_REMOVE_DEFAULT_DSNê œSQL_SVE_CASTἸ äWNNC_NET_EXTENDNETãܸ äszOID_RSA_signingTimeð¸ ähInprocêS_ASYNCHRONOUSã ¹ äžHBITMAPâ8¹ äžPSM_IDTOINDEXè'ž__IOleAdviseHolder_INTERFACE_DEFINED__ëŸDynamicCharged㘹 ä prevá´¹ ä FACILITY_SETUPAPIä¹ ä# MIXERCONTROL_CONTROLTYPE_QSOUNDPANãø¹ ä EndTimeê SetPrinterDataã,º ä¡dmSpecVersionLº ä¡REFERENCE_WHITE_MAXâlº ä¡MOUSE_EVENT_RECORD㺠ä¡I_RpcServerUseProtseqEp2Ἲ ä¡CMSG_CMS_ENCAPSULATED_CTL_FLAGë¡SC_MANAGER_CREATE_SERVICEøº ä ¢StackLimitã» ä¢LPCRITICAL_SECTIONã4» ä¢DdeQueryStringWâD» ä ¢dwRetT» ä¢grp4á|» ä¢RpcServerInqDefaultPrincNameAè¢SetConvertStg°» ä£OSS_MORE_INPUTãл ä£PSP_USEHEADERSUBTITLEì» ä£_tagOIBDG_FLAGSê£SQL_QUALIFIER_LOCATIONã(¼ ä¤CallNamedPipeP¼ ä"¤COMADMIN_E_APP_FILE_WRITEFAILh¼ ä ¤WHITEONBLACKáx¼ ä¤grp2ᘼ ä¤RPC_C_MGMT_INQ_STATSᬼ ä¤u_charãÔ¼ ä¤IXMLDOMNode_appendChild_Proxyè ¤SQL_KEYWORDSá½ ä¥DMPAPER_FANFOLD_LGL_GERMANã(½ ä ¥DrawIconé¥grp3áT½ ä¦InjectionPointãd½ ä¦uvp‽ ä¦LPPROPSHEETPAGEWé!¦IOleItemContainer_IsRunning_StubáÀ½ ä§_sleepãܽ ä§DETACHED_PROCESSáì½ ä§grp1á¾ ä§PCERT_X942_DH_PARAMETERSé§Unknownâ8¾ ä ¨DRV_USERáP¾ ä ¨pAttributesê¨IXMLDOMElement_normalize_Proxy㔾 ä ©ONE5STOPBITSᨾ ä ©PMMIOINFOè©CONFIRMSAFETYܾ äªFACILITY_DISPATCHü¾ äªFILE_DEVICE_CHANGERâ,¿ ä%ªIOleInPlaceSite_OnUIDeactivate_Proxyé ªSQL_CN_NONEâ\¿ ä «WC_DISCARDNSé«DESCKIND_TYPECOMP ¿ ä"¬SECURITY_NON_UNIQUE_AUTHORITY¼¿ ä¬MCI_SEEK_TO_ENDê¬PNDR_CORRELATION_INFOð¿ ä­sbumpcãÀ ä­RoundRect À ä­ESB_DISABLE_LTUPá0À ä ­MKSYS\À ä ­IXMLDOMNode_get_specified_Proxyâ|À ä­IME_SMODE_AUTOMATICê­SQL_INSENSITIVEâ¬À ä®PurgeCommÄÀ ä®SM_CXMENUSIZEäÀ ä®RESOURCETYPE_PRINTã Á ä®IXMLDOMDocument_loadXML_Stubé"®IXTLRuntime_formatNumber_StubPÁ ä¯DT_PATH_ELLIPSISé¯SetActiveWindowâŒÁ ä°?$__num_bits@$0BP@ã´Á ä°ERROR_CLUSTER_SHUTTING_DOWNâÐÁ ä°LPPROPSHEETPAGEAáäÁ ä°pHelpFile  ä/°__IInternetProtocolSinkStackable_FWD_DEFINED__ë°MDM_PROTOCOLID_HDLCPPPãd ä±WM_WINDOWPOSCHANGEDâ€Â ä±GetKeyNameTextë'±ICreateTypeInfo_SetFuncDocString_ProxyãÄ ä²predé²MCI_FORMAT_SMPTE_25âüÂ ä ³SetCaptureãà ä³BS_DEFPUSHBUTTONá8à ä³MCI_FORMAT_SMPTE_24ê³PP_UNIQUE_CONTAINERâlà ä´PSIZE_TâŒÃ ä´RPC_S_SEC_PKG_ERRORâ°Ã ä´CONNECT_UPDATE_PROFILEãÌà ä´DdeQueryStringAâôà ä´RpcServerInqDefaultPrincNameWè´transformNodeÄ ä µsgetc<Ä äµCreateDialogIndirectéµSQL_SP_COMPARISONlÄ ä¶hBitmapâ”Ä ä¶CRYPTPROTECT_DEFAULT_PROVIDERè¶dwServiceTypeØÄ ä ·AsyncIPipeByte_Finish_Pull_Stubê·SQL_CA_CREATE_ASSERTIONâÅ ä¸PROCESSOR_HITACHI_SH44Å ä ¸BackupReadãLÅ ä¸SSF_INDICATOR|Å ä#¸CRYPT_INSTALL_OID_FUNC_BEFORE_FLAGãœÅ ä¸FSCTL_SET_COMPRESSIONè¸SQL_CREATE_ASSERTIONé¹ERROR_CTX_INVALID_MODEMNAMEâ Æ äºPIMAGE_RESOURCE_DATA_ENTRYã(Æ äºTYPE_E_IOERRORã@Æ ä ºGGO_BEZIERã\Æ äºSHGFI_ATTRIBUTESéºIEnumString_Next_Proxyã”Æ ä»pIOProcâÀÆ ä!»USER_MARSHAL_MARSHALLING_ROUTINEé»SPLDS_ASSET_NUMBERãôÆ ä ¼buf_sizeé¼FILE_WRITE_EA,Ç ä½SUBLANG_GERMAN_SWISSáTÇ ä"½EVENT_E_COMPLUS_NOT_INSTALLEDlÇ ä ½ENHANCED_KEYá”Ç ä½szOID_PKIX_KP_CODE_SIGNINGã¸Ç ä½IXMLElement_get_type_Stubè½SQL_SQ_COMPARISONôÇ ä¾SYSYNC_BUILDNUMBERã È ä ¾DMBIN_MIDDLEá(È ä¾WM_LBUTTONDOWNë ¾iBorderWidthá`È ä¿PROCESSOR_HITACHI_SH3€È ä¿BufferConformanceMarkè¿CoMarshalHresultá¼È äÀERROR_GROUP_EXISTSãØÈ äÀRevokeObjectBoundè$À__IBindStatusCallback_FWD_DEFINED__â,É äÁENUM_REGISTRY_SETTINGSãDÉ ä ÁIPPORT_WHOISé ÁVarI1FromIntálÉ ä Âacosl„É ä ÂmtHeaderSizeé ÂPD_SELECTIONá´É äÃe32_fixupsizeØÉ äÃLANGUAGEGROUP_ENUMPROCãðÉ ä ÃRegSaveKeyãÊ äÃIMalloc_Alloc_StubëÃSQLRemoveDSNFromIniâPÊ äÄEXCEPTION_BREAKPOINTálÊ äÄImmGetDescriptionèÄSQL_SFKU_CASCADEáœÊ äÅFindAtomA´Ê ä ÅXTYP_REQUESTáÔÊ äÅRPC_BUFFER_PARTIALë ÅpUserSidáøÊ ä Æacosh Ë äÆOLEOBJ_S_CANNOT_DOVERB_NOWã<Ë äÆPACTION_HEADERãhË ä ÆI_RpcBindingInqDynamicEndpointWâˆË äÆCERT_STORE_PROV_INFOá¤Ë äÆDISPID_NEWENUMë'ÆIInternetProtocolInfo_CombineUrl_ProxyãìË ä Çequal_toáÌ ä ÇVER_NUM_BITS_PER_CONDITION_MASKêÇWM_POWERBROADCASTDÌ ä ÈacosfhÌ äÈERROR_REGISTRY_RECOVEREDá€Ì ä ÈdmDeviceNameá”Ì ä ÈAnsiNextá°Ì äÈLPMSGBOXPARAMSWâÌÌ äÈDLGC_HASSETSELãôÌ ä"ÈICreateErrorInfo_SetGUID_Stub$Í ä%ÈIXMLDOMNode_get_previousSibling_StubáPÍ ä"ÈIDataFilter_SetEncodingLevel_Stubè'È__IEnumSTATPROPSTG_INTERFACE_DEFINED__ã”Í ä Énext_¼Í äÉFORMAT_MESSAGE_FROM_HMODULEêÉLPMCI_INFO_PARMSAôÍ äÊSHNAMEMAPPINGWãÎ ä ÊLPLINGERá$Î äÊDSPRINT_UNPUBLISHèÊSQL_MAX_PROCEDURE_NAME_LENã`Î äË_wcsuprâ„Î äËsz_CERT_STORE_PROV_MEMORY°Î ä ËCERT_REGISTRY_STORE_REMOTE_FLAGâÄÎ äËMediaInfoÜÎ ä ËF3_120M_512ê'ËICreateTypeInfo2_SetFuncCustData_Proxyã(Ï äÌNPTEXTMETRICWHÏ äÌ_CERT_ALT_NAME_ENTRYádÏ äÌPPRINTER_INFO_8Aé$Ì__IXMLDOMCDATASection_FWD_DEFINED__â´Ï äÎSUBLANG_ARABIC_QATARáÌÏ äÎS_PERIODVOICEìÏ äÎPSFEATURE_CUSTPAPERâÐ äÎI_RpcNsBindingSetEntryNameAâ0Ð äÎCRYPT_ATTRIBUTESáLÐ äÎHCERTSTOREPROVãtÐ äÎCryptUninstallDefaultContextá˜Ð äÎFILE_DEVICE_MASS_STORAGEá´Ð äÎCoTaskMemReallocéÎSQL_SG_USAGE_ON_COLLATIONðÐ ä ÏEntryCountã Ñ äÏCHECKJPEGFORMATâ,Ñ äÏDMCOLOR_MONOCHROMEãHÑ äÏotmsCapEmHeightê ÏCC_STDCALLãtÑ äÐiMaxSpeedŒÑ ä ÐmmioAscendã¬Ñ äÐLPMCI_OVLY_RECT_PARMSØÑ ä ÐI_RpcBindingInqDynamicEndpointAêÐIMoniker_RelativePathTo_Stubá4Ò ä(Ñ?$basic_filebuf@DU?$char_traits@D@std@@âLÒ ä ÑBS_MULTILINEádÒ äÑSCARD_UNKNOWNèÑ__IOplockStorage_FWD_DEFINED__ã°Ò äÒGetPrivateProfileIntáÐÒ äÒWAVECAPS_PLAYBACKRATEôÒ äÒCERT_STORE_SAVE_TO_FILEâ Ó äÒCERT_VERIFY_NO_TIME_CHECK_FLAGëÒIStream_Revert_Proxyá\Ó äÓIMAGE_AUX_SYMBOLápÓ äÓFindAtomWˆÓ äÓLGRPID_KOREANèÓPCERT_PRIVATE_KEY_VALIDITYãÄÓ äÔstrstrë&ÔIBindStatusCallback_GetBindInfo_ProxyèÕSORT_HUNGARIAN_TECHNICALá8Ô äÖLUID_AND_ATTRIBUTESâXÔ äÖSERVICE_ERROR_TYPEãlÔ äÖGetWindowŒÔ äÖmidiOutCachePatchesêÖCycleDetectionModulusÄÔ ä ×NameIsStringáèÔ ä×TAPE_DRIVE_SET_PADDINGäÕ ä ×PEXTLOGPENë×SQL_DIAG_SQLSTATE8Õ äØ_ACTION_HEADERëØI_RpcNsBindingSetEntryNameWâ|Õ äÙ__nec_eabi_bareâÕ ä ÙMIM_OPENá´Õ äÙURLACTION_SCRIPT_PASTEë ÙVarI2FromIntáÜÕ ä ÚabortôÕ äÚNPTEXTMETRICAÖ äÚPAN_SERIF_NORMAL_SANS(Ö äÚREGSAMãDÖ äÚPPRINTER_INFO_8Wé ÚrpcFlagsátÖ äÛPMOUSEHOOKSTRUCTé ÛMOD_SWSYNTHâ¬Ö äÜGetSidLengthRequiredáÄÖ äÜPOLYFILL_LASTØÖ äÜOemToCharôÖ äÜSHNAMEMAPPINGAã× äÜMIDL_SERVER_INFOá(× ä ÜNdrStubCallê*Ü__ISynchronizeContainer_FWD_DEFINED__p× ä ÝSM_CYSMICONâˆ× ä ÝPSBTN_NEXTëÝBstrStrâ¸× äÞLPMSGBOXPARAMSAê ÞdwOffsetáð× äßERROR_DS_CANT_RETRIEVE_DNØ ä ßdsOffsetá Ø äßLPMCI_INFO_PARMSW4Ø äßMEMCTXãTØ äßPSN_QUERYINITIALFOCUSè+ßICreateTypeInfo2_SetHelpStringContext_Stubã¤Ø äàNPEXTLOGFONTAÈØ äàDMLERR_INVALIDPARAMETERêàLPCPROPSHEETHEADERWâøØ äá@177áÙ ä á__how(Ù äá_CRYPT_ENCODE_PARAãDÙ äáPOPENCARDNAME_WêáSTGM_NOSCRATCHã€Ù äâDOMAIN_USER_RID_GUEST Ù äâSERVICE_BOOT_STARTë âbcBitCountãÐÙ ä ãGetLastErroráäÙ äãhIconSmâüÙ ä ãSTUB_PHASEëãSQL_CTR_CREATE_TRANSLATIONã<Ú ääwglShareListsTÚ ä äOpenDesktopâlÚ ä äSND_NOWAITãÚ ääNdrUserMarshalMarshallã¸Ú ääMftWritesFlushForLogFileFulléäIME_CMODE_KATAKANAãðÚ ä åbad_typeidë åSZM_CREATEã,Û äæDNS_ERROR_RCODE_BADSIGëæIUrlMon_AsyncGetClassBits_StubãpÛ ä çPtrToUlongãœÛ ä!çERROR_DS_SOURCE_DOMAIN_IN_FORESTá´Û äçRGB_GAMMA_MINè çSIZEICONICãàÛ äèPPROVIDERøÛ ä èMEVT_COMMENTáÜ äèGET_MEDIA_TYPESêèINET_E_RESOURCE_NOT_FOUNDPÜ ä ékeybd_eventâhÜ ä éES_MULTILINEáˆÜ äéDlgDirListComboBoxWâ¨Ü äéGetFileVersionInfoAâÈÜ äéCERT_RDN_VALUE_BLOBâèÜ äé_LPIINTERNETBINDINFOáÝ äéCoInternetGetProtocolFlagsë éVarI4FromIntáDÝ äêCreateHatchBrushá`Ý äêHSHELL_TASKMANãˆÝ ä"êszOID_NETSCAPE_CERT_EXTENSION¸Ý ä%êICreateTypeInfo_SetVarDocString_Stubé!êIBindProtocol_CreateBinding_Stubá Þ äëGetSecurityDescriptorLengthâ0Þ äëERROR_INVALID_COLORINDEXáHÞ ä ëWSAENOTCONNâdÞ äëDispatchMessageWá|Þ ä ëIDC_SIZENSã˜Þ äëDS_SETFOREGROUNDá´Þ äëWNFMT_MULTILINEêëShellExecuteWìÞ äìCO_E_BAD_SERVER_NAMEáß äìLPD_SHARE_ACCUMâß äìDDEDATAâ8ß äìPPRINTER_INFO_9AéìControlServiceãtß äíNORM_IGNOREKANATYPEâˆß äíPMMTIMEâ ß äípvSystemStoreèíAddPrinterDriveráÜß äîPRPC_DISPATCH_TABLEêîURLACTION_HTML_SUBMIT_FORMSâà ä ïFIELD_OFFSETá4à ä ïTOKEN_OWNERêïERROR_TOO_MANY_POSTSálà ä ðisNonUniqueâ”à äðCO_E_INIT_SCM_EXEC_FAILUREã¨à ä ðPEMRTEXTáÐà äð_LPIINTERNETPROTOCOL_DEFINEDéðSQL_NONSCROLLABLEá äñMCIERR_GET_CD8á ä'ñICreateTypeInfo_SetImplTypeFlags_Proxyë!ñICreateTypeInfo_SetVarName_Proxyá„á äòC2_COMMONSEPARATORëòLIBFLAG_FCONTROLáÐá ä#óJOB_OBJECT_SET_SECURITY_ATTRIBUTESëóPS_STYLE_MASKâ äôCMSG_CMS_SIGNER_INFO_PARAMëôVAR_TIMEVALUEONLYDâ ä õ_P_OVERLAYãXâ ä õfwprintfáxâ äõallocator_param_typeá”â äõistream_iteratorá´â äõGetTabbedTextExtentâÈâ äõCB_DIRëõVARIANT_UserFreeá ã äöPAN_BENT_ARMS_SINGLE_SERIFã$ã äöNPEXTLOGFONTWDã äöPBT_APMQUERYSTANDBYâdã äöLPCPROPSHEETHEADERAâ”ã ä#öIInternetBindInfo_GetBindInfo_StubëöIME_JHOTKEY_CLOSE_OPENãÌã ä ÷ExChangeáäã ä ÷CACHE_S_LASTáä ä÷PFD_SUPPORT_OPENGLãä ä÷dwDataã4ä ä÷pszSystemStoreë÷POPENCARDNAME_Aâhä ä øOLE_S_STATICá€ä ä øSOCK_DGRAMã¬ä ä øCERT_PROT_ROOT_ONLY_LM_GPT_FLAGâØä ä!ø__IOleAdviseHolder_FWD_DEFINED__áüä äøBSCF_LASTDATANOTIFICATIONèøSQL_FN_TD_HOURã0å ä ùLowerRightãPå äùCOLOR_INACTIVEBORDERálå äùPrimaryVolumeIDâ„å äùIXMLAttributeèùVARFLAG_FBINDABLEÀå äúEMRSETPALETTEENTRIESáäå äúNdrVaryingArrayMarshallãæ äúPPRINTER_INFO_9Wé úAbort$æ äû__fillãHæ äûSCARD_ATTR_CURRENT_IFSDê ûSCARD_ATTR_ICC_INTERFACE_STATUSâ˜æ äüIMAGE_SYM_CLASS_STATICã¬æ äüPVALENTâÈæ äüPFNGETPROFILEPATHàæ ä üWM_DDE_DATAâüæ äümidiStreamPauseâç äüMCIERR_CANNOT_USE_ALL@ç äüszOID_NETSCAPE_DATA_TYPEéüSCARD_ATTR_CURRENT_IFSCâŒç äýERROR_UNABLE_TO_UNLOAD_MEDIAá¨ç äýDispatchMessageAáÀç äýdwDestinationäç äýRPC_C_PROTECT_LEVEL_CALLáüç äýShellExecuteA è äýILockBytes_ReadAt_StubãPè ä&ý__IInternetThreadSwitch_FWD_DEFINED__è4ýIInternetHostSecurityManager_QueryCustomPolicy_Stubâ°è äþArbitraryUserPointeráÐè äþRpcServerRegisterIfExèè ä þCRYPT_PSTOREáé äþREVISION_LENGTHê þnFilterIndexá<é äÿDlgDirListComboBoxAâ\é äÿGetFileVersionInfoWâpé ä ÿPSM_APPLYè ÿ_data é åIMAGE_BASE_RELOCATIONéPCSCardIntroduceCardTypeéMCI_LOAD_PARMSAâðé ä _LISTê äCRYPT_OID_FORMAT_OBJECT_FUNCá8ê äINVOKE_PROPERTYPUTãPê ä_tagPSUACTIONèIME_ITHOTKEY_UISTYLE_TOGGLEâê ä OPEN_ALWAYSâ¬ê äWNNC_NET_BWNFSãÄê ä waveInCloseê SQLWCHARáìê äferrorãë äWritePrivateProfileString4ë äERROR_OPERATION_ABORTEDâPë äERROR_IRQ_BUSYã|ë ä ERROR_DOMAIN_TRUST_INCONSISTENTâœë äFNERR_FILENAMECODESâÈë äMIXER_GETLINECONTROLSF_ONEBYIDãäë äPADAPTER_STATUSâì äBitmapWritesLazyWriterã ì ä pOutputFileâ4ì ä LIBFLAGSétagVersionedStreamãhì ä_rmdirãŒì ä_IMAGE_OPTIONAL_HEADER64á¨ì ä_PSFEATURE_OUTPUTÀì ä AppendMenuAâÜì äPTAPE_STATISTICSâí äSPLDS_PRINT_SHARE_NAMEãí äpVersionedStreamá8í äPID_MODIFY_TIMEêSQL_API_SQLCONNECTãxí äDISP_E_ARRAYISLOCKEDéFinish_Releaseã°í äint_curr_symbolâÈí ä LB_ERRSPACEâÜí äPF_PUPãøí ä_CRYPT_HASH_INFOá î äNdrClientContextUnmarshallãDî äIEnumUnknown_Reset_ProxyéIID_IDataAdviseHolder|î ä DeviceStringé!ITypeInfo_GetDocumentation_ProxyáÀî ä CC_INTERIORSáÔî ä WH_DEBUGáðî ä WM_CAPTURECHANGEDï ä WM_DDE_LASTê- IInternetZoneManager_SetZoneAttributes_Proxyá`ï ä SetDeviceGammaRampã€ï ä VS_FF_INFOINFERREDãœï ä RpcServerYieldë IOCTL_STORAGE_RESET_DEVICEãäï ä WS_EX_RIGHTSCROLLBARáð ä# QueryRecoveryAgentsOnEncryptedFileë SQL_CHARáDð ä META_DELETEOBJECTlð ä __IRecordInfo_FWD_DEFINED__ê ImmGetGuideLineâ ð ä is_union_impáÄð ä ERROR_NOT_A_REPARSE_POINTÔð ä fMaskôð ä C2_EUROPETERMINATORâñ ä IP_MULTICAST_LOOP(ñ ä IEnumOLEVERBé SQL_UPDATEãlñ äERROR_INVALID_STARTING_CODESEGã€ñ ä bfOffBitsèPubInfoâ°ñ äLoadLibraryExAãÄñ äHTVSCROLLàñ äPDLGITEMTEMPLATEAøñ ä dwFindFlagsêPROPSETFLAG_ANSIé"THREAD_PRIORITY_TIME_CRITICALLò ä comp_lò äSND_ALIAS_SYSTEMHANDáŒò ähStoreProvFuncAddr2êget_parentNodeã¼ò ä_wcsncollÐò ätoupperâäò äLOBYTEëEndDialogó äMETA_INVERTREGION,ó ä AppendMenuWê DDL_DRIVESã`ó äDuplicateHandleâxó ä FXPT16DOT16âœó äGetProcessWindowStationâ¸ó äTKF_HOTKEYACTIVEáÔó äLOCALE_SCOUNTRYâèó äLZSeekãô ä"MIXER_GETLINEINFOF_TARGETTYPE,ô äMCI_SEQ_MAPPERãPô äCMSG_KEY_AGREE_RECIPIENTéWritesãˆô äERROR_NO_TRUST_LSA_SECRETœô äLB_DIRëBINDSTATUS_DECODINGâØô äOLE_E_ENUM_NOMOREìô äptDropëSCardBeginTransaction4õ ä"ERROR_PRINTER_HAS_JOBS_QUEUEDLõ ä SETCOPYCOUNTádõ ä RegFlushKeyâ€õ äMCI_LOAD_PARMSWêSQL_CV_CHECK_OPTIONâ´õ ä_daylightÔõ äIOCTL_DISK_RESERVEëCFSTR_MIME_RAWDATAãö äLoadLibraryExWã0ö äERROR_MEMBER_IN_GROUPTö äGetSystemPaletteEntriesâpö äPDLGITEMTEMPLATEWö äFreePrinterNotifyInfo´ö äTYPEFLAG_FAGGREGATABLEãÜö äURLACTION_INFODELIVERY_MAXëSQLRETURN÷ ä__saveã÷ ä waveInOpenëNdrServerContextNewMarshallâ\÷ äWM_ENDSESSION€÷ ä_SEC_WINNT_AUTH_IDENTITYá ÷ äBufferVarianceMarkëNI_CHANGECANDIDATELISTãü÷ ä+ICreateTypeLib2_SetHelpStringContext_ProxyëPD_NOSELECTIONã8ø äIMAGE_SYM_TYPE_DOUBLETø äHELP_HELPONHELPâtø ä_CRYPT_OBJID_TABLEã”ø äCTL_FIND_SHA1_HASHã´ø äSERVICE_QUERY_STATUSéSQLCloseCursoräù ä%IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRYáù ä CTRY_SWEDENêMCI_FORMAT_MSFãLù ä SetCaretPosâdù äPERF_RAW_BASEèPNTFS_STATISTICSá¬ù ä! IS_TEXT_UNICODE_REVERSE_CONTROLSáÈù ä OR_INVALID_OIDë F3_20Pt8_512áôù ä !NEWFRAMEá ú ä"!CMSG_DEFAULT_INSTALLABLE_FUNC_OIDè!SQL_COLUMN_SEARCHABLE`ú ä"GetDeviceGammaRampã|ú ä"RecoveredWritesâ¤ú ä"_READ_ELEMENT_ADDRESS_INFOë"SQL_OPT_TRACE_ONáèú ä#CMSG_RECIPIENT_ENCODE_INFOã û ä#CMSG_CONTENTS_OCTETS_FLAG8û ä #CryptCreateKeyIdentifierFromCSPê#LPSERVICE_MAIN_FUNCTIONAátû ä $OpenMutexAãŒû ä $CBN_ERRSPACEá´û ä$WNetGetResourceInformationWâÜû ä$PORT_STATUS_OUTPUT_BIN_FULLê$SQL_SSF_TRIM_BOTHü ä%CB_FINDSTRINGEXACTã0ü ä %TIMECALLBACKáHü ä %tagJOYCAPSAâdü ä%I_RpcFreeBufferâ„ü ä%CRYPT_NDR_ENCODINGë%??_7IBindHost@@6B@ãèü ä8&?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@ãý ä &OVERLAPPEDã ý ä&GetCharWidthFloatWã@ý ä&tagEMREXTFLOODFILLãTý ä&SND_ALIAS€ý ä&szOID_INFOSEC_mosaicUpdatedSigë&&ICreateTypeInfo_SetTypeFlags_StubÈý ä'PCF_INTTIMEOUTSâèý ä'_RASTERIZER_STATUSãüý ä'SIF_ALLâþ ä'PMINIMIZEDMETRICSè'ENUM_SERVICE_STATUS_PROCESSâXþ ä (ALG_SID_SEALé(RevokeActiveObjectã”þ ä)RELEASE_SYDEBUGê,)__IInternetProtocolInfo_INTERFACE_DEFINED__âèþ ä*RPC_E_CLIENT_DIEDÿ ä*MCIERR_PARAM_OVERFLOW(ÿ ä*SCARD_STATE_IGNOREë*IID_IOleCacheControlá`ÿ ä+FILE_MAP_COPYxÿ ä +RT_ANIICONãŒÿ ä +szOID_OIWè+GetUserClassIDã¸ÿ ä ,INT32Üÿ ä,FILE_VOLUME_IS_COMPRESSEDøÿ ä,PS_ENDCAP_ROUNDâä,DFCS_MENUBULLETê,PPRINTER_INFO_7AáDä-streambufXä-PJOYCAPSApä -MMIO_DIRTYãŒä-_LPCBYTE_DEFINEDá¨ä-SPLREG_REMOTE_FAXè-SQL_DESC_LENGTHâðä!.ERROR_DS_SINGLE_VALUE_CONSTRAINTáä.CreateFontIndirectë.IOleCache_InitCache_ProxyPä/MCI_DEVTYPE_DATâtä/RpcMgmtWaitServerListenâ ä /__IOleInPlaceSite_FWD_DEFINED__â¸ä /lpsaActionsê/SQL_DC_DROP_COLLATIONøä0GetCharWidthFloatAë0MIXER_OBJECTF_AUXè 1remove_allãDä 2LC_COLLATEã`ä2TOKEN_IMPERSONATExä 2OpenMutexWã¤ä!2CO_E_RUNAS_CREATEPROCESS_FAILUREá¼ä 2itemHeightãää2WNetGetResourceInformationAãä2_CERT_NAME_INFOê2LPFNADDPROPSHEETPAGEá8ä 3SBM_GETPOSãPä 3tagJOYCAPSWê3SCardListCardsãä4SecurityIdentificationã´ä4IMAGE_FILE_MACHINE_SH3EâÐä4ENHMETA_SIGNATUREää 4NICFlagsé4IPipeByte_Pull_Proxyáä 5LPKEYARRAYã@ä5LPSERVICE_MAIN_FUNCTIONWé5IME_CAND_MEANINGá”ä+6ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCHã¨ä6VK_F19ãÈä6_CMSG_CMS_SIGNER_INFOèä6PRINTER_ERROR_WARNINGä6CoGetClassObjecté 6IXMLDOMParseError_get_line_StubâDä7VK_F18ã\ä 7CTRY_ALGERIAáˆä 7_USER_MARSHAL_ROUTINE_QUADRUPLEê7SQL_IS_INSERT_SEARCHEDãÐä8ERROR_DS_OBJ_GUID_EXISTSé8VK_F17ãä#9ERROR_DS_UNABLE_TO_SURRENDER_ROLESã,ä 9PolyBezierã@ä9VK_F16ã\ä9dwButtonNumberë9PCMSG_STREAM_INFOŒä:VK_F15ã´ä:HSHELL_ACTIVATESHELLWINDOWãØä:RpcMgmtSetAuthorizationFnôä:PPRINTER_INFO_7Wáä:MDM_PROTOCOL_HDLCPPP_128K_PAPè :TraceReturnâHä;PlgBltã\ä;VK_F14ãpä;PJOYCAPSW”ä;MCI_SEQ_DIV_SMPTE_30DROPé;szOID_DSALG_CRPTáØä"<SPAPI_E_NO_ASSOCIATED_SERVICEìä<VK_F13ãä<CreateDialogParamä<EM_SETSEL<ä<byte_array_from_ndrê<Hi32á`ä =E_HANDLEátä=VK_F12ë =PROTOCOLDATAá°ä>THREAD_PRIORITY_NORMALãÔä>_UNLOAD_DLL_DEBUG_INFOãèä>VK_F11ä ä >MULTIKEYHELPé >OnShowWindowá< ä?ERROR_MEDIA_NOT_AVAILABLEP ä?VK_F10ãh ä?MCI_BREAK_OFF„ ä?NDRSContextValueé?CANDIDATELIST¸ ä@MARSHAL_S_FIRSTâÌ ä @VK_PAUSEáà ä@NCBLISTEN ä@RPC_X_SS_CONTEXT_MISMATCH$ ä@CERT_INFO_ISSUER_FLAGL ä@CLEANLOCALSTORAGE_UserSizeë @put_dataሠä"A??_Elength_error@std@@UAE@I@Z° äALPPRINTER_NOTIFY_INFO_DATAë/A__IInternetSecurityMgrSite_INTERFACE_DEFINED__ã äBRPC_IF_HANDLE@ ä1BIReleaseMarshalBuffers_ReleaseMarshalBuffer_Stubé"BIPropertySetStorage_Open_Stub„ äCOLE_E_NOSTORAGE⤠äCmidiInGetErrorTextWâÄ äCSERIAL_NUMBER_LENGTHéCpszzPreviousNamesá äDCRYPT_E_INVALID_INDEX äDLPMENUTEMPLATEã8 äDDFCS_ADJUSTRECTâT äDI_RpcBindingCopyál äDPCERT_CONTEXT€ ä DwireBSTRá” äDBINDPTRêDNUMPRS_USE_ALLëELPMDICREATESTRUCTAãä äFContainer ä*FUNPROTECTED_SACL_SECURITY_INFORMATION< äFSCARD_E_NO_READERS_AVAILABLEáX äFMDICREATESTRUCTêFRpcSendCompleteâ” äG__get_MSL_init_countéGGetWindowRectÈ äHMATH_ERREXCEPTãÜ ä HIDC_SIZEáô ä HGetCPInfoExâäHVarDateFromUI4ëHSQL_SRJO_RIGHT_OUTER_JOINPäILB_SELITEMRANGEEXxä"ICMSG_MAIL_LIST_RECIPIENT_INFOä IIID_IProxyëILPIINTERNETPROTOCOLINFOâØäJFSCTL_IS_VOLUME_MOUNTEDâðä JGetPrinterAê'J__IPropertyStorage_INTERFACE_DEFINED__ãPäKLPMIXERCONTROLDETAILS_LISTTEXTãxäKRpcBindingServerFromClientãŒäKInverseâÀä'KIRpcHelper_GetDCOMProtocolVersion_StubãÜäKISupportErrorInfoè%KIXTLRuntime_absoluteChildNumber_Stubá,äLINPLACE_E_NOTUNDOABLE@äLRC_BITBLTXä LES_LOWERCASEátäLPPRINTER_INFO_4AéL__IRpcOptions_FWD_DEFINED__âÀäMhas_trivial_assignmentãàäMCreatePatternBrushãøä MMENUITEMINFOáäMmmioCreateChunkâ4äMPCERT_SIMPLE_CHAINãPäMSetFuncDocStringápäMPIDMSI_STATUS_REVIEWéMVarDateFromUI1ã äNcontainer´äNHC_SKIPâÐäNLCMAP_HALFWIDTHâøäNIStream_RemoteCopyTo_ProxyãäNVarDateFromUI2ëNVarFormatNumberâDä Ois_constáhäOTAPE_DRIVE_VARIABLE_BLOCKŒäOMSSIPOTF_E_TABLES_OVERLAP°äOWN_CANNOT_OPEN_PROFILEãÜä"O@class$7701clientEngine_dbg___pchè OLPOLELINKè PDRIVE_FIXEDâäQFP_NANã<äQMMIOERR_INVALIDFILEâTä QPROV_STT_ACQé QLPFORMATETCâ„ä RFXPT2DOT30ã¤äRPDERR_GETDEVMODEFAILá¸ä R_midl_fa4è RSQL_CA1_BULK_UPDATE_BY_BOOKMARKâôä Sam_pmäSESB_DISABLE_RTDNá0äSLPMDICREATESTRUCTWãXäSCMSG_SP3_COMPATIBLE_AUX_INFOéSCRYPT_DONT_VERIFY_SIGNATUREâ˜ä TRegUnLoadKeyéT_midl_fa2Ää U__float_maxâìäUERROR_INVALID_WINDOW_STYLEãäUVFT2_DRV_NETWORKá ä U_MMRESULT_ã@äUmidiInGetErrorTextAâPäUHintsè"UPRINTER_CHANGE_PRINTER_DRIVERä VSCardStatusâ¨ä VShowObjectëVSC_ACTION_REBOOTáàäWCO_E_CLASSSTRINGáä%WCERT_CHAIN_REVOCATION_CHECK_END_CERTéWPRINTER_NOTIFY_FIELD_CJOBSãPäXszOID_PKIX_PEèXIErrorInfo_GetGUID_ProxyáˆäZ_writeã¤äZszOID_OIWSEC_sha1èZPPRINTER_INFO_4WáÔä[VK_F24ãä#[IXMLDOMParseError_get_srcText_Stubë[OleCreateStaticFromDataâLä\PROCESS_CREATE_PROCESSãpä\SEC_E_INCOMPLETE_MESSAGEá„ä\VK_F23ãœä \LBN_ERRSPACEá´ä \GetPrinterWê\BINDSTATUS_CLSIDCANINSTANTIATEë]VK_F22ãä^CREATE_DEFAULT_ERROR_MODE0ä^CACHE_E_FIRSTDä^VK_F21ãlä^WriteConsoleOutputAttributeâä^MCI_GETDEVCAPS_HAS_VIDEOá¤ä^_midl_fa8Ää^CdChangerClassGuidãÔä^Skipáôä^SQL_IS_YEAR_TO_MONTHé^SQL_QUERY_TIMEOUT0ä_RPC_S_STRING_TOO_LONGPä_RPC_E_UNSECURE_CALLâdä_VK_F20ãœä+_IEncodingFilterFactory_FindBestFilter_Stubë_SQL_API_ALL_FUNCTIONSØä`DuplicateTokenãüä`DNS_ERROR_RCODE_BADKEYãä `rgUnauthAttrá<ä`FILE_DEVICE_NETWORK_BROWSERâXä`Finish_OnCloseë `SQL_AF_COUNTáŒäa__TestForwcsErrorè ammioOpenébDT_MODIFYSTRINGâØäcIsBadStringPtrWâøäcMft2WritesUserLevelêcMKSYS_ANTIMONIKER0äd_LARGE_INTEGERãHädWaitNamedPipeèdERROR_NO_MORE_FILESâxä eBytes˜äeDeviceCapabilitiesëeMSHLFLAGSÄä fNPLOGPALETTEáàäfSS_REALSIZEIMAGEé fVOS_UNKNOWNâägSECURITY_DELEGATIONâ4ägPEMREXTFLOODFILLáLä gPRPC_RUNDOWNáhägICreateErrorInfoé gLockRequestâ”ähEndPageâ¬ä hDRIVERPROCãÈähDVTARGETDEVICEãìähIEnumSTATDATA_Clone_Proxyè$hIXMLHttpRequest_get_statusText_Stubâ,ä iwhat_Dä iBM_SETSTATEâ\ä iNPAUXCAPSAëi??_7IServiceProvider@@6B@”ä je_lfarlcá¨äjREG_DWORD¸ä jCtlIDÌäjpszURLãôäjNdrComplexStructMemorySizeãäjPRINTER_CHANGE_TIMEOUTëjURLZONE_USER_MINáHäk_cdeclã\ä kAuthAttrsè kpwszRegPathâŒälMENUTEMPLATEW¤ä lSS_NOPREFIXâÐä&lCERT_UNICODE_ATTR_ERR_INDEX_SHIFTðälpszPolicyQualifierIdélPPRINTER_INFO_5Aá0ämRPC_E_OUT_OF_RESOURCESëmIDI_ERRORlän_IMAGE_RESOURCE_DIR_STRING_UáänRPC_X_NULL_REF_POINTERã¨ä nDM_LOGPIXELSáÀänMIDIPROPTEMPOènSQL_MAX_INDEX_SIZEä äoTLS_OUT_OF_INDEXESã äoWMSZ_LEFT, ä oPeekMessageAáD ä oLPAUXCAPSWãd äoPMCI_VD_ESCAPE_PARMSAŒ äoCRYPT_PUBKEY_ALG_OID_GROUP_IDèoFinish_OnRenameâÄ äpULARGE_INTEGERãè äpIMAGE_REL_IA64_LTOFF22ëpSPLDS_PORT_NAMEâ!äqHHOOK__â0!ä qLC_INTERIORSáL!äqLPACCESSTIMEOUTâx!äqIOCTL_SMARTCARD_GET_LAST_ERRORã¤!ä!q__IServiceProvider_FWD_DEFINED__áÈ!äq_LPHTTPNEGOTIATE_DEFINEDéqMDM_MASK_X75_DATAá"ärNTM_TT_OPENTYPEâ"ä rDC_COLLATEã,"ärMNC_CLOSED"ä rdwAuthzSvcërabVariablePortion|"äsGetMenuItemInfoâ¬"ä%sCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFOáÈ"äsVolumeClassGuidêsCLIPFORMAT_UserMarshalã#ä twStructSizeâ#äts_protoâD#ätCRYPT_OID_OPEN_STORE_PROV_FUNCã\#ä tDISK_RECORDâp#ätREGCLSã„#ätcScodesêtSQL_IS_USMALLINTáÄ#äuACCESS_ALLOWED_ACE_TYPEâÜ#ä uDefaultDaclâø#äuIsBadStringPtrAê uNTE_FAILá$ävexpâD$ävRPC_S_GROUP_MEMBER_NOT_FOUNDá\$ä vLPLOGPALETTEát$ävWMSZ_TOPRIGHTœ$ävMCI_WAVE_GETDEVCAPS_INPUTSëvIOCTL_CHANGER_GET_STATUSáÜ$äwMETA_RESTOREDCãø$äwHELPINFO_MENUITEM%äwXST_UNADVACKRCVDá,%äwDRVCONFIGINFOD%ä wHCERTSTOREëwHlinkSimpleNavigateToMonikeréxCERT_POLICY_IDã %ä yPeekMessageWá¸%ä yLPAUXCAPSAãØ%äyPMCI_VD_ESCAPE_PARMSW&ä$yCRYPT_VERIFY_CERT_SIGN_SUBJECT_CERTêyMDM_SHIFT_HDLCPPP_MLáD&äzPLARGE_INTEGERãX&äzE_POINTERp&äzMENUTEMPLATEA˜&ä"zszOID_INFOSEC_mosaicSignature¼&äz_CERT_CHAIN_POLICY_PARAâØ&äzPPRINTER_INFO_5Wé zSetPriorityâ'ä{basic_stringstreamã0'ä{CO_E_SERVER_STOPPINGáP'ä{??_7IOleCache@@6B@ë{SQL_ATTR_TRANSLATE_OPTION”'ä|SetTextCharacterExtraè|tagINVOKEKINDÀ'ä }TPMPARAMSè }SCARD_ATTR_CURRENT_EBC_ENCODINGâ(ä~LUID_AND_ATTRIBUTES_ARRAY,(ä~DMMEDIA_GLOSSYãH(ä~SHOW_FULLSCREENâ\(ä ~Qualifierè~IXMLDocument_get_mimeType_Stubã¤(äLPDRAWITEMSTRUCTá¼(ä DCX_WINDOWãÔ(ä NPAUXCAPSWãð(äPCCERT_CONTEXTëCERT_NAME_STR_COMMA_FLAGá0)äBytesPerSectorãD)ä BIN_COUNTèIOleInPlaceSite_Scroll_Stubâ€)ä‚guidOneâ¨)ä‚_IMAGE_ROM_OPTIONAL_HEADERã¼)ä‚VkKeyScanØ)ä‚tagANIMATIONINFOáø)ä‚OFN_SHAREFALLTHROUGHé‚algorithm0*äƒ__copy_longs_unalignedãX*äƒLGRPID_TRADITIONAL_CHINESEëƒSQL_C_INTERVAL_DAY_TO_HOURã˜*ä „FixupInstRVAá´*ä„ERROR_NOT_SUBSTEDÐ*ä„OUTLINETEXTMETRICì*ä„EMRSELECTPALETTEá+ä„XTYP_DISCONNECTâ +ä„PSCARDCONTEXTè „TRACE_ONáX+ä…NumberOfProcessIdsInListáh+ä …e_resˆ+ä…MESSAGE_RESOURCE_DATAè …lpDecimalSepá¸+ä †MINLONG_PTRâÜ+ä†ERROR_INIT_STATUS_NEEDEDáø+ä†IXMLDOMNodeListâ(,ä&†ICreateTypeInfo2_DeleteImplType_Proxyè†VarDateFromDispâp,ä!‡ERROR_DS_CANT_REPLACE_HIDDEN_RECá”,ä‡MCIERR_DEVICE_ORD_LENGTHá´,ä‡RpcSsSetThreadHandleé‡PORT_STATUS_PAPER_PROBLEMè ˆVARIANTARGã-ä‰ES_DISPLAY_REQUIREDâ(-ä‰TMPF_TRUETYPED-ä‰KLF_SUBSTITUTE_OKè‰PMONITOR_INFO_2Wát-äŠpush_heap„-ä ŠINT64¤-äŠWM_ASKCBFORMATNAMEãÀ-äŠGetDesktopWindowáÔ-äŠAlgorithmø-äŠPCERT_CHAIN_POLICY_PARAêŠCLSCTX_NO_CUSTOM_MARSHALé‹WSAEINVALIDPROVIDERâT.äŒ__unique_copyt.äŒSUBLANG_LITHUANIANãœ.äŒERROR_DS_COULDNT_UPDATE_SPNSá´.ä ŒICMENUMPROCWáÐ.äŒPPRINTER_INFO_2AéŒSIMULATED_FONTTYPEã/ä?$__num_bits@$0BPPP@á4/äSUBLANG_FRENCH_CANADIANêCreateZoneEnumeratoráp/äŽtagMETAFILEPICTêŽ??_7IXMLDOMCDATASection@@6B@á°/ä LB_GETLOCALEáÄ/äPVALUEWâè/äCERT_RDN_VISIBLE_STRINGêLPIINTERNETBINDINFOâ0äyrefá80äERROR_SHARED_POLICYê PerfTimeád0ä ‘szPathNameãŒ0ä‘OSS_CANT_OPEN_TRACE_WINDOWã¤0ä ‘PC_INTERIORSé ‘IXMLDocument2_get_doctype_Proxyê’_MSL_USE_INLINEâ1ä“_MSL_CALLINGCONV_CDECLã<1ä!“COMADMIN_E_OBJECT_PARENT_MISSINGé “WM_DDE_FIRSTé”NO_DATAâ|1ä•uFlagsã”1ä•PS_DASHDOTDOT¨1ä•IssuerãÄ1ä•szOID_KEY_USAGEê)•IAdviseSink2_RemoteOnLinkSrcChange_Proxyá$2ä!–DNS_ERROR_ZONE_HAS_NO_NS_RECORDSáH2ä–COMADMIN_E_CANTCOPYFILEê&–CRL_REASON_CESSATION_OF_OPERATION˜2ä—REG_OPTION_NON_VOLATILEê—iWaitMSecÄ2ä ˜is_referenceáà2ä˜LANG_NORWEGIANãø2ä ˜getsocknameâ3ä˜ALG_SID_DH_SANDFá<3ä˜PCMSG_CONTENT_ENCRYPT_INFOãT3ä˜Begin_Releaseè˜OleCreateMenuDescriptorâŒ3ä™DM_MODIFY¤3ä ™DT_VCENTERãÄ3ä™MDIS_ALLCHILDSTYLESâè3ä™SPI_GETLOWPOWERTIMEOUTãü3ä™PVALUEAâ 4ä™CMSG_MAIL_LIST_RECIPIENTáL4ä™USER_CALL_NEW_CORRELATION_DESCë™SQL_CODE_DAY_TO_SECONDãˆ4ä šICMENUMPROCAá¬4äšCERT_ALT_NAME_RFC822_NAMEà4ä.šCMSG_CONTENT_ENCRYPT_RELEASE_CONTEXT_FLAGü4äšPPRINTER_INFO_2Wé šPIDSI_TITLEâ85ä›SUBLANG_SPANISH_COLOMBIAé›SP_NOTREPORTEDãl5ä œOLE_S_LASTã„5ä œelfFullNameâœ5ä œALG_SID_DESXá¸5äœfHasExtensionsãÐ5ä œSNB_UserFreeé&œSQL_DL_SQL92_INTERVAL_DAY_TO_HOUR6ä GetTempPathâ(6ä LPPANOSEáP6äBF_DIAGONAL_ENDBOTTOMRIGHTãl6äPRINTER_ENUM_HIDEœ6ä#_LPINTERNETSECURITYMGRSITE_DEFINEDëSQL_CONVERT_BITêžtagDELETEITEMSTRUCTâì6äŸptr_funâ 7äŸERROR_GROUP_NOT_FOUND(7äŸSTRETCH_ANDSCANSá@7ä ŸcaBrightnessá\7äŸCertSerialNumberéŸPMONITOR_INFO_2Aá7ä PROPENUMPROCWÈ7ä, __IGlobalInterfaceTable_INTERFACE_DEFINED__âô7ä! __IEnumSTATPROPSTG_FWD_DEFINED__é MDM_ANALOG_RLP_OFFã<8ä¡DOMAIN_GROUP_RID_COMPUTERSë¡SCARD_READER_TYPE_PARALELLã|8ä ¢change_sizeê¢VFT_STATIC_LIBã°8ä ¤WVR_VREDRAWâÔ8ä¤USER_MARSHAL_FC_USMALLë¤SQL_NEED_LONG_DATA_LENã9ä¥WSAEAFNOSUPPORTâ09ä¥WS_MAXIMIZEBOXãP9ä¥LoadCursorFromFileWâx9ä¥WriteConsoleOutputCharacterâ”9ä¥PUBLICKEYBLOBEXâ¼9ä¥CRYPT_FIRST_ALG_OID_GROUP_IDáÜ9ä¥IID_IOInetBindInfoë¥SERVICE_ACCEPT_PARAMCHANGEã$:ä¦SetTextJustificationá@:ä¦JOY_CAL_READYONLYè%¦IXMLHttpRequest_get_readyState_Proxyá˜:ä§JOB_OBJECT_LIMIT_WORKINGSETâÄ:ä §IMAGE_SYM_CLASS_TYPE_DEFINITIONâä:ä§GetModuleFileNameAä;ä§LB_SETCARETINDEXá;ä §LPCPINFOá0;ä§PNOTIFYICONDATAAé§GGL_INDEXt;ä%¨JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESSé¨_PSFEATURE_CUSTPAPERá¬;ä ©SM_CYCURSORâÄ;ä ©FOURCC_DOSë©rgSignersø;äªCERT_ALT_NAME_ENTRYâ<ä ªMEDIA_TYPEë ªBinCountá<<ä «locale_nameê«SCardListReaderGroupsAãˆ<ä¬ERROR_CLUSTER_NODE_NOT_FOUNDá˜<ä ¬_MAT2¼<ä¬GetFileVersionInfoSizeAâä<ä¬CertFreeCertificateContextë)¬IOleItemContainer_GetObjectStorage_Proxyá8=ä­PAN_SERIF_TRIANGLEãX=ä­CRYPT_DELETE_KEYSETâp=ä ­LowerIndexë ­QueryGetDataá¬=ä®MSSIPOTF_E_CANTGETOBJECTáÄ=ä ®TC_EA_DOUBLEáÜ=ä®SM_CYMENUSIZEè®PERF_DETAIL_ADVANCEDá>ä¯LANG_ROMANIAN<>ä"¯ERROR_CLUSTER_NODE_NOT_PAUSEDP>ä ¯CancelDCát>ä¯LPNETCONNECTINFOSTRUCTã>ä¯MCI_VD_MEDIA_CLVá¼>ä!¯CERT_REGISTRY_STORE_ROAMING_PARAé$¯IDropSource_QueryContinueDrag_Proxyâü>ä°xrefá?ä°_LUID_AND_ATTRIBUTESá4?ä °AC_SRC_OVERâL?ä °PBIN_RANGEë°SERIAL_IOC_FCR_RES2â„?ä ±e32_startobjá¤?ä±GetModuleFileNameWãÌ?ä±ERROR_CLUSTER_NODE_NOT_READYáð?ä±SPI_SETLOWPOWERTIMEOUTã@ä±HWAVE__â @ä±PNOTIFYICONDATAWá8@ä ±w2kReservedâX@ä±_FLAGGED_BYTE_BLOBãx@ä±APD_COPY_NEW_FILESã¤@ä!±__IInternalUnknown_FWD_DEFINED__é±OleRunãè@ä#²IRpcChannelBuffer_FreeBuffer_ProxyãAä²tagUSERCLASSTYPEá(Aä²_LPAUTHENTICATION_DEFINEDLAä²SQL_ISV_KEY_COLUMN_USAGEé ²SQL_ROWVERãAä³TYPE_E_QUALIFIEDNAMEDISALLOWEDã°Aä³LoadCursorFromFileAê³SERIAL_IOC_FCR_RES1âèAä ´value_typeãBä´CO_E_FAILEDTOGENUUIDá,Bä´PAN_LETT_NORMAL_CONTACTâ@Bä ´dwMinLenálBä!´CMSG_CTRL_KEY_AGREE_DECRYPT_PARAé ´SQL_QL_ENDã˜BäµfuFlagsâ¸BäµWNNC_NET_RDR2SAMPLEâØBäµszOID_RSA_signedDataéµCoRegisterClassObjectCä¶MAX_NATURAL_ALIGNMENTPSINJECT_ENDSETUP¨‡ä>EMRCREATEBRUSHINDIRECTãÀ‡ä >MB_ICONSTOPâ܇ä>SPI_GETSTICKYKEYSü‡ä>ALG_SID_SSL2_MASTERâˆä>CoBuildVersionë >_URLZONEREGâHˆä ?__msl_alphaâ`ˆä ?LPFNDEVCAPSâˆä#?PRINTER_NOTIFY_FIELD_STATUS_STRINGë?tagDOMNodeTypeë @e32_stackobjá؈ä ASEEK_ENDáôˆäAfloat_from_ndrã‰ä"AIAdviseSink_OnViewChange_StubH‰ä"AITypeLib2_GetDocumentation2_ProxyèAnMaxCustFilter〉äBOLEOBJ_E_NOVERBSᔉäBPS_DOTã°‰äBLPCDLGTEMPLATEAâĉä BdwHotKeyé!BIXMLDocument2_createElement_StubáŠäCDCOM_CALL_CANCELEDëCITypeLib_FindName_StubãTŠäD?$numeric_limits@_WâlŠä DSPACEPARITY┊äDERROR_MEDIUM_NOT_ACCESSIBLEâ°ŠäDDdeDisconnectListЊäDmidiOutGetDevCapsAëDDeletePrinterDriverWá‹äEWINAPIVâ$‹äESPI_SETICONTITLEWRAPéEPSET_PARTITION_INFORMATIONãh‹äFPAN_WEIGHT_LIGHTá|‹äFve_type┋ä FMCIERR_BASE⨋ä FTKIND_MAXè%F__MIDL_itf_urlmon_0179_v0_0_c_ifspecáð‹ä GSizeOfBlockâ ŒäGSetPrinterDataWêGSERVICE_DESCRIPTIONWé HIgnoreErrorêICFSTR_MIME_RICHTEXTâtŒä JwTypeœŒä"JDNS_ERROR_NAME_DOES_NOT_EXIST´ŒäJDestroyWindowÔŒäJCDS_UPDATEREGISTRYëJGetMiscStatusä#KERROR_CANNOT_DETECT_DRIVER_FAILUREã8äKHRESULT_SEVERITYé Kncb_commandâxäLIMAGE_FILE_MACHINE_ALPHA64ãŒäLcCtlStore°äLCRYPT_SIGN_MESSAGE_PARAêLPSH_NOCONTEXTHELPàä MstricolláüäMPROCESS_VM_READâŽäMRPC_S_ENTRY_NOT_FOUND8ŽäMDRAGDROP_S_LASTâHŽä Mlpstr`Žä MhCryptProv㌎äMIOCTL_STORAGE_EJECTION_CONTROLëMReleaseStgMediumáÈŽäNMUTANT_QUERY_STATEãäŽäNGetConsoleTitleWé NRegCreateKeyéOPM_QUERY_PROC,ä PEMRCREATEPENá\ä#PPCRYPT_PRIVATE_KEY_BLOB_AND_PARAMSã„äPITypeInfo_GetFuncDesc_Stubã¬äPIBinding_GetPriority_ProxyãÈäPBINDSTRING_URLãääPSQL_UNICODE_CHARéPSQL_FN_TD_MONTHNAMEâ äQCONTAINING_RECORD8ä QbmWidthBytesáXäQtagLOCALESIGNATUREãpä QShowCursorãäQmidiInUnprepareHeader¸äQMIXERCONTROL_CT_CLASS_FADERâÔäQSetPrinterDataAâüäQISequentialStream_Write_ProxyèQSERVICE_DESCRIPTIONAáD‘ä"RRPC_S_INVALID_ENDPOINT_FORMATd‘äRmidiOutGetDevCapsWãx‘äRpvBase㘑äRDeletePrinterDriverAéRSQL_FN_TD_CURRENT_TIMESTAMPâä‘äSERROR_ACCOUNT_RESTRICTIONø‘äSihFontã’ä SLPHMIDISTRMâ,’äSIMPLINK_HIGHEXPERX’äSCryptMsgCalculateEncodedLengthã„’ä!S__IOleObject_INTERFACE_DEFINED__éSSQL_OU_PROCEDURE_INVOCATIONâÀ’äTpaRGBsãÜ’äTLPCDLGTEMPLATEWâø’äTLPMCI_SET_PARMSê TSQLROWOFFSETá(“ä U__double_maxáL“äUERROR_INVALID_MENU_HANDLEèUIOleObject_Unadvise_Stubሓä VPMETAHEADERâ “ä VPF_FIREFOXë!VCMSG_CTRL_MAIL_LIST_DECRYPT_PARAáè“äWCBTACTIVATESTRUCTèWSQL_DIAG_CREATE_ASSERTION,”äX?$numeric_limits@_Kâ@”äXTC_CR_ANY\”äXGetConsoleTitleAá|”äXtagMCI_WAVE_SET_PARMSè XcPolicyInfo⤔äYtanâÄ”äY?$numeric_limits@_JâÜ”ä Ynode_pointeráô”ä YDM_GETDEFIDêYpPresentedTypeã,•äZLPDISPLAY_DEVICEáP•äZMCIERR_INVALID_DEVICE_IDáx•äZIOleObject_GetMiscStatus_Stubè'ZICreateTypeInfo2_SetParamCustData_Stub㼕ä [PWORDØ•ä[DefaultBlockSizeáô•ä[CRYPT_E_ASN1_UTF8 –ä [ST_CONNECTEDá0–ä[PCTL_VERIFY_USAGE_STATUSé [userContextâp–ä\REG_NOTIFY_CHANGE_ATTRIBUTESᘖä\FindNextChangeNotificationã¼–ä\tagEMRCREATEBRUSHINDIRECTÜ–ä\EMRCREATEMONOBRUSHãø–ä\TPM_RIGHTALIGNã—ä\cSubtreesConstraintê\IEnumOLEVERB_Next_Stubã\—ä]?$numeric_limits@_Nâp—ä]rguid2㘗ä]PERF_COUNTER_QUEUELEN_TYPE㸗ä]PCRYPT_DIGEST_BLOBãà—ä]_CRYPT_PKCS8_EXPORT_PARAMSë]IOleObject_EnumAdvise_Stubã(˜ä^STDMETHODVCALLTYPEã<˜ä^rguid1ã`˜ä^ERROR_SERIAL_NO_DEVICE〘ä^MMIOERR_CHUNKNOTFOUND˜ä^dayê^SQL_TC_DDL_IGNOREÔ˜ä_ERROR_CLUSTER_INVALID_REQUESTá™ä_CERT_SYSTEM_STORE_CURRENT_USERã™ä__STORAGE_BUS_TYPEè_SQL_ISV_TABLE_CONSTRAINTST™ä `_clear87ál™ä `BKMODE_LASTê `RuntimeInfo✙äaGETTECHNOLOGY°™äaWAVEHDRâЙäaPNDR_ASYNC_MESSAGEë!aIFillLockBytes_RemoteFillAt_StubébReleaseWriteAccessã<šäcIMAGE_REL_ARM_SECRELáTšä cDrawTextExãtšäcRPCLT_PDU_FILTER_FUNCècPIDMSI_STATUS_PROOFâÀšä dLPOVERLAPPED_COMPLETION_ROUTINEâàšädEMRCREATECOLORSPACEâøšä dHCRYPTPROVëdLPENUMSTATDATAã@›äeERROR_CONNECTED_OTHER_PASSWORDãX›ä eCOLOR_WINDOWáp›ä eXTYP_SHIFTëeSQL_ATTR_ASYNC_ENABLE¬›äf_TIME_T_DEFINEDâÄ›äfremove_boundsÔ›ä fNTAPIø›äfGetCompressedFileSizeWãœä fVK_OEM_CLEARá,œäfSetConsoleTitleWéfSQL_IDENTIFIER_CASEâ`œä g_CPPRTTIá|œägdifference_typeâ œägSUBLANG_ARABIC_MOROCCO㼜ägICM_DELETEPROFILEÜœägAddPrintProcessorAãüœägImmEnumRegisterWordAáägSQL_DIAG_CALLègSQL_UPDATE_RECORDHä hDBL_MANT_DIGá`ä hCURSORSHAPEâ|ähLGRPID_GEORGIANâ˜ähHICON_UserFreeãÈä$hICreateTypeInfo_SetHelpContext_StubâäähSQLAllocHandleäžähSQL_CURSOR_STATICè hSQL_BINARYã<žäiMSSIPOTF_E_TABLE_CHECKSUMTžäiFONTENUMPROCWtžäiRPC_C_AUTHZ_DEFAULT⤞ä%iICreateTypeLib2_DeleteTypeInfo_ProxyéiVarNegëjPI_SYNCHRONOUSãôžäkCLASS_E_NOTLICENSEDâŸäkDOCINFOâ(Ÿäk_CONSOLE_CURSOR_INFOékPPROVIDOR_INFO_2WhŸäl_MSL_CALLINGCONV_SSE2CALL€ŸälGWLP_USERDATA¤ŸälCRL_DIST_POINT_NO_NAMEãÌŸälIEnumUnknown_RemoteNext_ProxyèlDISPID_COLLECTãøŸä mLPSTR ämEMRRESIZEPALETTEá4 ämSPI_GETICONTITLEWRAPáL ämMCI_OPEN_TYPEèm_CMSG_HASHED_ENCODE_INFOጠänRemHMETAFILEPICTá´ änIXMLDOMNode_appendChild_StubénSQL_C_INTERVAL_SECONDô äoERROR_DC_NOT_FOUNDã¡äoERROR_NO_RECOVERY_POLICYá8¡äoILLUMINANT_DAYLIGHTâd¡äoIDummyHICONIncluder_Dummy_StubëoVarBoolFromDisp┡äpcdwLocals¸¡äpGetCompressedFileSizeAãÔ¡äpFACILITY_WINDOWSáø¡äpDNS_ERROR_DATABASE_BASEâ¢äpSetConsoleTitleAá$¢äpscr7épTagâD¢äqscr6á\¢ä qMM_MCISIGNALáx¢äqSCARD_STATE_INUSE˜¢äqAddPrintProcessorWëqImmEnumRegisterWordWáÌ¢är_tzsetãà¢ärLPBOOLã£ärSACL_SECURITY_INFORMATION £ärwglMakeCurrentã8£ä rDC_INBUTTONâT£ärRESOURCE_RECENTâd£ärscr5áx£ärJOYINFO∣ärFreeércreateEntityReferenceÔ£ä sCOMADMIN_E_COMPFILE_NOREGISTRARâð£äsEMR_EXTFLOODFILLá¤ä shbmpCheckedâ¤ässcr4á0¤ä sfdwControlësIOCTL_CHANGER_GET_PRODUCT_DATAãx¤ätSYSTEM_FIXED_FONTŒ¤ätLB_ERR㜤ätscr3étJOY_CAL_READALWAYSãÔ¤ä u_SW_SQRTNEGâä¤äuscr2éuMCI_VD_STATUS_MEDIA_TYPEá,¥äv??_7bad_typeid@std@@6B@âD¥ävLDBL_MANT_DIGl¥ä"vCO_E_TRUSTEEDOESNTMATCHCLIENTŒ¥ävMB_ABORTRETRYIGNORE✥ävscr1á°¥ävpvDataãä¥ä*vITypeInfo_RemoteGetContainingTypeLib_StubèvBINDF_GETFROMCACHE_IF_NET_FAILã0¦äwERROR_DATABASE_FULLâD¦äwlbHatchâd¦äwURLPOLICY_JAVA_HIGHê wlpstrDefExt☦äxPointerToRefId㼦äxMSHCTX_DIFFERENTMACHINEâÔ¦äxRegisterAsyncð¦äxget_nextSiblingê xget_prefixã,§äyERROR_DS_SHUTTING_DOWNã@§ä yCB_MSGMAXèyCryptSignAndEncryptMessageã|§äzfwriteã”§ä zODS_SELECTEDé,zCERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICYâä§ä {OffsetHighã ¨ä{RESOURCEDISPLAYTYPE_GENERICâ8¨ä{SQL_DIAG_DYNAMIC_FUNCTION_CODEë{SQL_COLUMN_TYPE_NAMEáp¨ä |DCB_ENABLEë|tagSQL_NUMERIC_STRUCT¤¨ä}mbrtowc⼨ä }UOI_USER_SIDáШä }Groupingáð¨ä}DrvGetModuleHandleã©ä}CMSG_SIGNED_DATA_V3â0©ä}CertAddCRLLinkToStoreL©ä}PPROVIDOR_INFO_2Ap©ä}IStream_UnlockRegion_Stubœ©ä"}ITypeInfo_RemoteGetFuncDesc_Proxyè }SQL_TIMEáØ©ä~SCardGetCardTypeProviderNameáø©ä~EMBDHLP_INPROC_SERVERè~SQL_COLUMN_UPDATABLEá@ªäCREATE_UNICODE_ENVIRONMENTãXªäFONTENUMPROCAtªäDMLERR_LOW_MEMORY„ªäscr8ᤪäCMSG_SIGNED_DATA_V1âܪä-IXMLDOMProcessingInstruction_get_target_StubéCFSTR_MIME_X_SGI_MOVIEã$«ä€SPI_ICONHORIZONTALSPACINGè€CERT_STORE_CREATE_NEW_FLAGãh«äe32_instpreloadâ„«äREG_RESOURCE_LIST¨«äszOID_RSA_extCertAttrsëNdrXmitOrRepAsMarshallãà«ä‚HLOCALãü«ä‚otmItalicAngleã¬ä ‚NF_REQUERYã(¬ä ‚CharNextáL¬ä‚PropSheet_RestartWindowsé‚OleGetAutoConvert„¬äƒPST_TCPIP_TELNETéƒWSA_QOS_ADMISSION_FAILURE̬ä„SEC_E_SECURITY_QOS_FAILEDܬä „ticksü¬ä„MIXER_OBJECTF_HMIXERá,­ä$„IPersistMoniker_SaveCompleted_Proxyê„URLACTION_SHELL_WEBVIEW_VERBád­ä…Arg2át­ä…PSTRáŒ­ä …IPPROTO_GGPâÀ­ä'…CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLYë%…IXMLDOMDocument_createTextNode_Proxyâ®ä†Arg1á®ä†BS_PATTERN8X80®ä †TC_RA_ABLEãH®ä †dwTVStandardé%†__MIDL_itf_urlmon_0178_v0_0_s_ifspecé ‡TC_VA_ABLEã´®äˆIMAGE_ARCHIVE_START_SIZEáЮäˆGetDiskFreeSpaceAè®äˆRPC_E_NO_SYNCèˆOIBDG_APARTMENTTHREADEDâ4¯ä‰ERROR_CONNECTION_COUNT_LIMITáH¯ä‰POINTFXâh¯ä‰AbortSystemShutdown∯ä‰NT351_INTERFACE_SIZEá ¯ä ‰HP_HASHSIZE⼯ä‰IDirectWriterLockЯä ‰VarRoundé ‰SQLFreeEnvã°äŠSKF_TWOKEYSOFFã °äŠLOCALE_SCURRENCYáH°äŠCMSG_CTRL_VERIFY_SIGNATUREëŠICreateTypeLib_SetVersion_Stubã°ä‹LPLOGCOLORSPACEWᤰä‹tmCharSet¸°ä ‹GetPropWáаä ‹AUX_MAPPERãè°ä ‹tagARRAYDESCáø°ä‹CADBLè ‹SQL_ISV_REFERENTIAL_CONSTRAINTSâ<±äŒtagMINMAXINFOd±äŒRPC_C_IMP_LEVEL_IMPERSONATEêŒCALG_RSA_KEYX±ächild_ptr°±äOBJECT_INHERIT_ACEãбäRvaToLastByteOfCodeâä±ä FatalExitá²äPAN_CONTRAST_NONE²äWS_POPUPWINDOWã8²ä_CMS_DH_KEY_INFOá`²äNdrContextHandleInitializeë CommDlg_OpenSave_SetControlText⬲äŽ__stable_sort_copyãIJä ŽGlobalFlagsâà²äŽWSAEADDRNOTAVAILâ³äŽSCardForgetCardTypeWéŽGCS_COMPCLAUSEã4³ä MM_JOY2ZMOVEáP³äCID_CDfsVolumeëSQL_ATTR_QUIET_MODEℳä_strncmpi¬³äSUBLANG_CHINESE_TRADITIONALâÔ³äCOMPRESSION_FORMAT_DEFAULTãð³äQDI_STRETCHDIBã´äCALG_3DES_112èpstgá8´ä‘ERROR_INVALID_HANDLEé‘SYS_MACâl´ä’WS_EX_PALETTEWINDOW⌴ä’MCI_NOTIFY_ABORTEDã´´ä’ASYNC_STGMEDIUM_UserUnmarshalè’VarBoolFromDateâè´ä“PTAPE_PREPAREáµä“dwXCountCharsµä“CF_WAVEâ$µä“rct4á4µä“ico4áLµä “lpDirectoryê“SQL_CU_PROCEDURE_INVOCATION⌵ä”BST_UNCHECKEDœµä”rct3é”ico3áÀµä•isupperâèµä•WSA_QOS_TRAFFIC_CTRL_ERRORã¶ä•SHIFTJIS_CHARSETá¶ä•rct2á$¶ä•ico2é•CRYPT_PKCS8_IMPORT_PARAMS`¶ä–value_comparet¶ä–SP_BAUD☶ä–META_OFFSETVIEWPORTORG㨶ä–rct1Ḷä–ico1áô¶ä0–CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAGâ·ä–PFN_CRYPT_ENUM_OID_INFOâ4·ä–CMSG_RC2_AUX_INFOT·ä–IID_ITypeChangeEventsp·ä–GetAltMonthNamesé–SQL_BITâœ·ä —WS_VISIBLEë)—URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETYáð·ä˜REG_OPTION_OPEN_LINKá¸ä ˜WSAEREMOTEã(¸ä˜SCardForgetCardTypeAáT¸ä˜__IFillLockBytes_FWD_DEFINED__ㄸä%˜__IEnumFORMATETC_INTERFACE_DEFINED__é˜SQL_IS_HOUR_TO_MINUTE¼¸ä™GetTapeStatusиä™CopyToë™SQL_MAX_IDENTIFIER_LENã¹ä šmerge ¹äšMETA_ROUNDRECTã8¹äšlElementIndexèšpstmá`¹ä ›KODAK_14_WOâx¹ä›BindIfRunningè›FR_ENABLEHOOK¬¹äœAllocationProtectĹä œRecipientIdâä¹äœSCARD_READER_TYPE_USBºäœIID_IRpcChannelBuffer2ëœVarBstrFromCy8ºä SP_APPABORTâTºäLPLOGCOLORSPACEAáhºä GetPropAá|ºälingerëIID_IRpcChannelBuffer3㸺äžGMEM_DDESHAREÔºäžGetDiskFreeSpaceWøºäžERROR_INVALID_FORM_SIZEê žLPEXTLOGPENâ0»äŸERROR_SEEK_ON_DEVICEáX»äŸERROR_CHILD_MUST_BE_VOLATILEáx»äŸMCI_OVLY_SAVE_PARMSâ»ä ŸcExtension㬻äŸCTL_FIND_EXISTINGÌ»äŸCERT_TRUST_LIST_INFOáì»äŸSCARD_CLASS_SECURITYé(ŸIBindStatusCallback_OnLowResource_Proxyâ4¼ä BI_JPEGâP¼ä tmAveCharWidthãp¼ä WGL_SWAP_UNDERLAY7㌼ä SIZE_MINIMIZEDã¤¼ä  fNullHGlobaláÀ¼ä VT_USERDEFINEDãмä Drawé  SQLParamDataá½ä¡ERROR_INVALID_ACL$½ä¡WGL_SWAP_UNDERLAY6ë¡IViewObject_Unfreeze_Proxyãl½ä¢_MSL_STDARG_WIN32_Hℽä¢ERROR_NO_DATA¤½ä¢WGL_SWAP_UNDERLAY5ë¢EXPORTãȽä £fminlؽä£LCIDáè½ä£lcidá¾ä&£FRS_ERR_INVALID_SERVICE_PARAMETER4¾ä£WGL_SWAP_UNDERLAY4ãH¾ä £HC_NOREMé'£__IAsyncRpcChannelBuffer_FWD_DEFINED__ãŒ¾ä ¤Flink ¾ä¤Numberã¸¾ä ¤dmLogPixelsâؾä¤WGL_SWAP_UNDERLAY3ãì¾ä¤HCBT_QSã¿ä¤cStepsã(¿ä¤CRYPT_OID_FIND_OID_INFO_FUNCé¤lpadescâT¿ä ¥__dup_coreãt¿ä¥WGL_SWAP_UNDERLAY2㌿ä¥CAL_GREGORIAN°¿ä¥WNetCancelConnection2WãÜ¿ä¥CERT_STORE_PROV_READ_CERT_FUNCãü¿ä¥CertEnumPhysicalStore Àä¥__IContinue_FWD_DEFINED__TÀä(¥ICreateTypeInfo2_SetParamCustData_Proxyê"¥ITypeInfo_GetIDsOfNames_Proxy Àä¦IMAGE_REL_ALPHA_REFLONGâÀÀä¦WGL_SWAP_UNDERLAY1ãÜÀä¦ReadConsoleInputáøÀä¦CMSG_RC4_AUX_INFOÁä¦PFN_CMSG_IMPORT_KEY_AGREEHÁä¦JOB_NOTIFY_FIELD_STATUS_STRINGãdÁä¦VarBstrFromDecë¦nFileExtensionã¤Áä§ERROR_DS_GCVERIFY_ERRORâÀÁä§SC_MONITORPOWERâèÁä§szOID_PKCS_9_MESSAGE_DIGESTâÂä§CFS_CANDIDATEPOSé§SQL_API_SQLGETDESCFIELDâDÂä¨CLIENTSITE_S_LAST\Âä ¨BS_VCENTERãxÂä¨MCI_OPEN_PARMSAâ”Âä¨MCI_VD_STEP_PARMS°Âä¨_SESSION_BUFFERê¨SQL_FETCH_PRIORâÜÂä ©fminfüÂä©IMAGE_SYM_CLASS_BLOCKÃä©TransmitCommChará8Ãä©EnumWindowStationsë©SCardForgetReaderWãpÃä ªfind_last_ofá˜ÃäªERROR_CLASS_DOES_NOT_EXISTã°Ãä ªWSAESHUTDOWNáÔÃäªMK_E_ENUMERATION_FAILEDâìÃäªSM_CYMINTRACKáÄäªtv_usecâÄäªCertAlgIdToOIDãDÄäªIOCTL_STORAGE_MEDIA_REMOVALâhÄäªOLEGETMONIKER_TEMPFORUSERèªOleSetAutoConvert˜Ää «wctype_tá¬Ää«hThreadâÀÄä «IE_NOPENáèÄä«PTOP_LEVEL_EXCEPTION_FILTERãÅä «R2_MERGEPENâÅä«IDC_IBEAM,Åä «NRC_GOODRETê «cadbl`Åä¬IMAGE_FILE_MACHINE_IA64â„Åä¬FILE_DEVICE_INPORT_PORTâ Åä¬LPPORT_INFO_1Wë ¬__IDispatch_INTERFACE_DEFINED__âÜÅä ­WCHARôÅä­AddressOfDataÆä­IDropTarget_DragOver_ProxyãHÆä!­IXMLDOMEntity_get_systemId_ProxyádÆä­LHashValOfNameã„Æä­CDM_SETCONTROLTEXTë­STYLEBUFW¸Æä®WGL_SWAP_UNDERLAY9ãÌÆä®LBS_NOSELðÆä®CERT_ALT_NAME_IP_ADDRESSé!®IXMLDOMAttribute_put_value_Proxyá<Çä¯ES_SYSTEM_REQUIREDãTÇä ¯e32_itermapâtÇä¯DMPAPER_B5_TRANSVERSE”Çä¯WGL_SWAP_UNDERLAY8ã¸Çä¯ENABLE_PROCESSED_OUTPUTâÐÇä ¯STK_DATA_D3ê¯__IPersistFile_FWD_DEFINED__á(Èä#°DOMAIN_GROUP_RID_ENTERPRISE_ADMINSã<Èä°AceTypeâdÈä°_TAPE_GET_MEDIA_PARAMETERSãÈä °SPAPI_E_BAD_SERVICE_INSTALLSECTâ¨Èä °DC_HASDEFIDê°SQL_CVT_LONGVARBINARYàÈä±DV_E_DVASPECTè±szOID_OIWDIR_HASHÉä²strcmpiâ$Éä ²difftimeáDÉä²IP_MAX_MEMBERSHIPSãXÉä²pFieldsâ|Éä²IEnumUnknown_Next_Proxyê²SQL_C_BIT¨Éä³EM_GETMARGINSÌÉä³WNetCancelConnection2AãìÉä³RpcNsProfileEltAddë$³IXMLDOMParseError_get_srcText_Proxyâ0Êä´LogonUserPÊä´EVENT_E_INTERNALERRORlÊä´cPolicyQualifieré.´AsyncIAdviseSink_Begin_RemoteOnClose_StubÄÊäµEXIT_PROCESS_DEBUG_EVENTéµpcuráìÊä ¶LPSYSTEMTIMEáËä¶CMSG_SIGNER_UNAUTH_ATTR_PARAMè%¶__XMLDOMDocumentEvents_FWD_DEFINED__ádËä·MAXIMUM_WAIT_OBJECTSáxËä·FS_THAIâŒËä ·CharUpperè ·free_ncbsè ¸PLONGÄËä ¹P_DETACHáØËä ¹CHAR_MINáðËä ¹LANG_SWEDISHáÌä ¹name_countë¹POPENCARDNAMEA_EXLÌäº_TAPE_SET_MEDIA_PARAMETERSãlÌäºCLASSFACTORY_S_FIRSTáŒÌäºCOMADMIN_E_SESSIONã ÌäºbfTypeã¼ÌäºCAL_SSHORTDATEëºLPPORT_INFO_1AãôÌä»POSTSCRIPT_DATAâ Íä »WaitMessageâ0Íä»CERT_STORE_SAVE_AS_PKCS7áXÍä»IDropTarget_DragLeave_Proxyê»STYLEBUFA„Íä¼_MSL_OFFSETOFœÍä¼balance_erase´Íä ¼PCF_SETXCHARáØÍä¼ERROR_DS_SEC_DESC_INVALIDðÍä¼DrawFocusRectè6¼IForegroundTransfer_AllowForegroundTransfer_ProxyDÎä ½_CPPUNWINDãdÎä½IO_REPARSE_TAG_SISãxÎä½Blocksã˜Îä½ERROR_POINT_NOT_FOUND¬Îä ½WM_CLEARé½SQL_CA2_MAX_ROWS_CATALOGáøÎä¾DEFAULT_IMPERSONATION_LEVELâÏä ¾WSAENOBUFSã,Ïä¾MCI_OPEN_PARMSWê¾Shell_NotifyIconé¿SCardForgetReaderAëÀLPMCI_ANIM_RECT_PARMS˜ÏäÁlenâ¸ÏäÁPMCI_SEQ_SET_PARMSãÜÏäÁNdrConformantStructFreeãÐäÁPRINTER_STATUS_WARMING_UPèÁDAdviseâ4ÐäÂWM_QUERYENDSESSIONãTÐäÂLOCALE_SNATIVEDIGITSátÐäÂTRANSMIT_FILE_BUFFERSèÂLPFNCANUNLOADNOWá¤ÐäÃmemsetãÀÐäÃPC_WINDPOLYGONëÃAsyncIAdviseSink2Ñä"ÄCOMADMIN_E_CLSIDORIIDMISMATCH$ÑäÄBROADCAST_QUERY_DENYá@ÑäÄCMSG_ALL_FLAGSëÄdecâlÑäÅcompressed_pairâŒÑäÅERROR_NO_SUCH_PACKAGE°ÑäÅMETA_CREATEPENINDIRECTãÔÑäÅRPC_C_MQ_JOURNAL_ALWAYSâðÑäÅGetDefaultPrinterèÅCLSIDFromProgIDEx$ÒäÆbasic_istreamLÒäÆERROR_DS_CANT_RETRIEVE_CHILDé%Æ__MIDL_itf_urlmon_0179_v0_0_s_ifspecéÇAllocateLocallyUniqueIdâ¼ÒäÈGetCommPropertiesèÈMIDI_CACHE_BESTFITãüÒäÉPMCI_VD_ESCAPE_PARMSéÉtagDVTARGETDEVICE0ÓäÊSYSYNC_CLIENTHÓä Ê_control87ã`Óä ÊScrollWindowáœÓä/ÊCERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGSãÌÓä*ÊPRINTER_CHANGE_DELETE_PRINT_PROCESSORäÓä ÊSendOnRenameéÊIOleObject_GetClientSite_StubèËIPropertyBag_Read_StubãLÔäÌDuplicateTokenExálÔäÌERROR_SPECIAL_ACCOUNTˆÔäÌLPPORT_INFO_2WëÌVarR8FromDispÄÔäÍ?$__two_complement@G$0A@áØÔä ÍN_BTSHFTáìÔä ÍMF_APPENDèÍ__IXMLDOMElement_FWD_DEFINED__ã0Õä ÎfpclassifyãHÕä ÎDecryptFileâdÕäÎWM_MDIICONARRANGExÕä ÎNotAfteréÎSQL_DB_RETURN_TO_POOLÀÕäÏERROR_FLOPPY_BAD_REGISTERSëÏImmSetCompositionFontüÕäÐ_SIZE_T_DEFINEDâ,Öä%ÐJOBOBJECT_EXTENDED_LIMIT_INFORMATIONáXÖä Ð__IClassActivator_FWD_DEFINED__âtÖäÐDiscardUndoStateéÐVarCyFromUintèÑDNS_ERROR_DATAFILE_PARSINGãØÖäÒSEM_FAILCRITICALERRORSãôÖäÒDATEFMT_ENUMPROCá×äÒIOC_OUTêÒPCHANGER_MOVE_MEDIUMáD×äÓCreateDirectoryExd×äÓGetSystemPaletteUseâ€×äÓwaveOutGetNumDevs˜×ä ÓdwSignerTypeáÄ×ä"ÓISoftDistExt_ProcessSoftDist_Stubè ÓPD_COLLATEãØäÔIMAGE_FILE_NET_RUN_FROM_SWAPá ØäÔdwCurrentTxQueueá8Øä ÔbLetterformâTØäÔSM_CXFULLSCREENâlØäÔMKF_AVAILABLEè-Ô__IXMLDOMEntityReference_INTERFACE_DEFINED__á¸ØäÕsubstrãÜØäÕACCESS_MAX_MS_V3_ACE_TYPEøØäÕLPCBT_CREATEWNDâ ÙäÕrgbAtrëÕSCARD_SHARE_EXCLUSIVEHÙäÖDECLSPEC_NORETURN`ÙäÖ_TOKEN_GROUPS„ÙäÖFILE_ATTRIBUTE_DIRECTORYá˜ÙäÖCLSCTXã¼ÙäÖURLPOLICY_JAVA_PROHIBITâÔÙäÖSHAREVISTRINGèÖGL_ID_NODICTIONARYãÚä×THREAD_BASE_PRIORITY_MINá8Úä×ERROR_TOO_MANY_SIDSê×DDEML_MSG_HOOK_DATAâlÚä ØpaYCountáˆÚäØESB_DISABLE_LEFTá ÚäØhNameMappingsÈÚäØCRYPT_RDN_ATTR_OID_GROUP_IDâàÚä ØCryptMemFreeéØSafeArrayGetUBoundãÛä ÙSWP_NOREDRAWá@ÛäÙSCardSetReaderCapabilitiesë*ÙIInternetProtocolRoot_Terminate_ProxyÛäÚCertEnumCRLsInStoreâ¨Ûä ÚDISK_LOGGINGáÈÛäÚSCARD_STATE_CHANGEDâèÛäÚPROPSHEETPAGE_V1_SIZEÜäÚLPPORT_INFO_2Aã(ÜäÚIPipeDouble_Pull_Proxyã@Üä ÚdwPageStartêÚSQL_BATCH_ROW_COUNTâ|ÜäÛ_MSL_WCSTOUL_Hã˜ÜäÛ__extended_minã°Üä ÛOBJ_METAFILEáÄÜäÛPXFORMãÜÜä ÛMCI_SEQ_NONEáÝäÛCryptGetOIDFunctionAddressã,ÝäÛIEnumOLEVERB_RemoteNext_ProxyèÛIID_IDispatchXÝäÜ_strsetâlÝäÜINT_PTRâ„Ýä ÜNRC_CANOCCRâ¤ÝäÜMS_DEF_DSS_DH_PROVëÜSQL_TRANSACTION_READ_COMMITTEDãäÝäÝ__writingôÝä ÝcolorÞäÝWRITE_DAC,ÞäÝACCESS_MAX_MS_V2_ACE_TYPEHÞäÝWN_DEVICE_ERRORâdÞäÝIOCTL_DISK_BASEêÝSCARD_STATE_EXCLUSIVE˜Þä ÞDRV_FREEá°Þä ÞAF_FIREFOXëÞ_CERT_REVOCATION_INFOðÞäßDEFAULT_SERVER_URIãßäßERROR_DS_INVALID_DMDá<ßä&ßCOMADMIN_E_CAN_NOT_EXPORT_SYS_APP`ßäßotmsUnderscorePositionëßIOleObject_EnumAdvise_Proxyê à__slab_sizeâ¼ßäáPROV_EC_ECNRA_SIGØßäáSCardForgetReaderè áCF_LIMITSIZEá àäâMETA_PAINTREGIONá0àäâSPI_GETMINIMIZEDMETRICSâDàä âcbmxctrlé"âIOleObject_SetClientSite_Stub€àäãgetcwdãàä ãround¸àäãTAPE_DRIVE_LOCK_UNLK_IMMEDãøàä3ãCRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAGëãFMTID_SummaryInformationá,áä ä_execDáä änew_handlerâXáä äis_unioná€áääCO_E_THREADINGMODEL_CHANGEDâ áääCreateCompatibleDCã¸áä äALG_SID_IDEAáèáä#äSPLDS_PRINT_ORIENTATIONS_SUPPORTEDë%äIRunnableObject_RemoteIsRunning_StubáDâä!åX509_KEYGEN_REQUEST_TO_BE_SIGNEDádâäåIMoniker_Hash_Proxyâ|âä åinsertDataë åMDMVOL_HIGHâÄâä#æIMAGE_DIRECTORY_ENTRY_DELAY_IMPORTãØâäæGetDCExâðâäæSetWindowText ãä$æCRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOBâHãä"æMft2WritesFlushForLogFileFull|ãä)æAsyncIAdviseSink_Begin_RemoteOnSave_Stubá¨ãä æITypeInfo_GetDocumentation_Stubê æGGL_STRINGãèãäç_IMAGE_COFF_SYMBOLS_HEADERã ääçSPI_SETMENUDROPALIGNMENTá(ääçwaveInGetDevCapsWèçImmGetCompositionFonthääèILLUMINANT_TUNGSTENâ|ääèRT_RCDATA”ää èEnumPropsExAá¬ää èMM_DRVM_DATAéèSQL_ODBC_SQL_OPT_IEFáðääéIMAGE_REL_ALPHA_LITUSEëéResetDCâ,åä"êDISPLAY_DEVICE_VGA_COMPATIBLELåäêPMCI_WAVE_SET_PARMSâlåäêCertEnumCTLsInStoreâ„åä êDensityCodeêêBINDINFOF°åä ëPEMRPOLYLINEáÐåäëTranslateMDISysAcceláèåäëRPC_NS_HANDLEèëGET_ALG_CLASSæäìGlobalFlagsCleará4æä ìICONMETRICSêìLPPORT_INFO_3WãtæäíACCESS_MAX_MS_V4_ACE_TYPEæäíTIMER_ALL_ACCESSá´æäíSPI_GETMENUDROPALIGNMENTáÔæäíSHERB_NOPROGRESSUIãèæäíu_shortâçäíCoTreatAsClassëícalpstrâ8çäîDMDITHER_GRAYSCALEãPçä îLPMARSHAL2ëîIEnumVARIANT_Skip_Stubã¬çä+ï??_C?0??what@bad_alloc@std@@UBEPBDXZ@4QBDBã¼çä ïPCWCHäçäïPIMAGE_RESOURCE_DIR_STRING_Uáüçä ïMM_JOY1ZMOVEéïMCI_NOTIFY_SUCCESSFUL0èäñstrrevãLèäñ__unusedAlignmenthèäñwaveInGetDevCapsA€èä ñNRC_TOOMANYêñCRL_DIST_POINT_ISSUER_RDN_NAMEãÀèä òFCONTROLáäèäòMCI_GETDEVCAPS_CAN_EJECTéòIStorage_OpenStream_Stubáéäóx_tailã<éäóHARDWAREHOOKSTRUCTãPéä óSIF_PAGEáléäóIFillLockBytesëóSQL_DIAG_DELETE_WHERE éäônumeratorÈéäôFILE_SUPPORTS_SPARSE_FILESãðéäôIMAGE_DIRECTORY_ENTRY_IMPORTáêä ôlpszTextéôSCardCancelTransactionã8êä õchdirTêäõstreambuf_typeãlêä õSM_CXSCREENâ€êäõIDC_CROSS”êäõMIDIHDRêõSCARD_ATTR_ESC_AUTHREQUESTãàêäö_ACCESS_DENIED_OBJECT_ACEèöMCIERR_WAVE_INPUTSUNSUITABLEá0ëä"÷NdrConformantStructBufferSize\ëä÷ODBC_ERROR_USAGE_UPDATE_FAILEDë÷SQL_RETURN_VALUEá˜ëäøSUBLANG_SPANISH_CHILE´ëäøIMAGE_LINENUMBERáÈëä øpaXCountáÜëäødwScopeâìäøCRYPT_ENCRYPT_ALG_OID_GROUP_IDëøPSN_TRANSLATEACCELERATORáDìä ùPAGE_GUARDãXìä ùIE_BADIDápìä ùDM_SETDEFIDâˆìä ùhConvPartnerá¨ìäùMCI_INFO_COPYRIGHTãÀìä ùAT_SIGNATUREáÐìäùcRDNé$ùIInternetProtocolInfo_ParseUrl_StubâíäúcFileName0íäúLPWAVECALLBACKãPíäúI_RpcBindingInqConnIdxíäúNdrInterfacePointerMemorySizeèúLPPORT_INFO_3Aã¬íä ûFindWindowãÌíäûWNetConnectionDialog1è ûALG_SID_KEAâ îäüIMAGE_ARCHIVE_LINKER_MEMBERêüTerminateThreadâ8îä ýColorLîä ýCO_S_LASTè ý__tagVARIANTátîäþeDyâˆîäþWM_SIZEâ îä þEnumPropsExWá¼îäþKP_CLIENT_RANDOMéþSQL_CODE_DATEáïä ÿERROR_DS_NC_MUST_HAVE_NC_PARENTâïäÿeDxê*ÿIRunnableObject_GetRunningClass_ProxyPïå EFBIGdïåAceSizeâ|ïåSTG_E_UNKNOWN¤ïåSCARD_E_READER_UNSUPPORTEDãÄïåRpcNsBindingExportãÜïåEnvelopedInfoðåPRINTER_STATUS_SERVER_UNKNOWNé'IInternetZoneManager_PromptAction_ProxyâPðä DestinationâpðäERROR_REQ_NOT_ACCEPâ”ðäCO_E_FAILEDTOGETSECCTXã¸ðäMSSIPOTF_E_PCONST_CHECKâÜðäLPMCI_GETDEVCAPS_PARMSãôðä PSOCKADDR_INéCERT_FIND_ISSUER_NAME8ñäDACL_SECURITY_INFORMATIONTñäCreateDesktopWãpñäPSP_HIDEHEADERã”ñäCLIPFORMAT_UserUnmarshalé CoCreateGuidáÀñä_UINT32âÜñäGetFullPathNameWáüñäDLGC_UNDEFPUSHBUTTONáòä tagPARAMDESCéIXMLElement_get_tagName_Stubá`òäIMAGE_SCN_LNK_NRELOC_OVFLˆòäFROM_LEFT_1ST_BUTTON_PRESSEDá¨òäPRINTER_STATUS_BUSYê"PRINTER_CHANGE_DELETE_PRINTERìòäEM_LINEFROMCHARâóäWNetGetLastErrorá$óäIID_IPropertyBagéSQL_UPDATE_BY_BOOKMARKãdóäCALG_PCT1_MASTERáxóäpClipData”óäSetPrinterDataExáÀóä!AsyncIPipeDouble_Begin_Pull_StubéLPSERVICE_TABLE_ENTRYAãüóäwstringstream$ôäERROR_DS_CANT_RETRIEVE_ATTSêPSCONTEXT_QUEUEâXôä n_sign_posnâpôä CCHFORMNAMEâôäwaveInGetErrorTextã¬ôäMCI_INFO_PARMSëSYS_WIN32àôä SYSYNC_VERSION_STRINGè- __IAsyncRpcChannelBuffer_INTERFACE_DEFINED__á,õä bfSizeã@õä cAuthAttrè _CHANGER_SET_ACCESSâxõä DBG_CONTINUEá˜õä ERROR_TAG_NOT_PRESENTÀõä DISPLAY_DEVICE_MULTI_DRIVERâÔõä SB_RIGHTáðõä ODS_COMBOBOXEDITá öä SwapMouseButtonê& CMSG_SIGNED_DATA_PKCS_1_5_VERSIONPöä BaseOfDataãpöä SetMessageExtraInfoê SQLColumnsã¨öä bOEMCopyProtectionãÈöä CONSOLE_CURSOR_INFOê CDM_HIDECONTROLâ÷ä&@class$7634clientEngine_dbg___pch$÷ä SW_ERASEáP÷ä"@class$7735clientEngine_dbg___pchèMftWritesUserRequestá÷äis_member_pointer_imp¸÷äWN_DEVICE_ALREADY_REMEMBEREDáä÷äMCI_OVLY_WINDOW_ENABLE_STRETCHãü÷ä max_cfg_sessáøäSO_TYPEâ<øäNdrEncapsulatedUnionUnmarshallãLøä@7788èBINDF_DIRECT_READ„øäSetHelpStringDllá¨øäLPSERVICE_TABLE_ENTRYWëSQL_SPECIAL_CHARACTERSãèøä__selection_sortá ùäIMAGE_REL_SH3_DIRECT32ã0ùäERROR_PORT_UNREACHABLEãDùä cRedBitsá`ùäVP_COMMAND_SETëMMIOERR_CANNOTSEEKã”ùäEINVALëRPC_S_UNKNOWN_IFáÌùäMB_ICONASTERISKâìùäNDRCContextBindingã úäAddPrinterDriverExëLPIINTERNETPROTOCOLROOTâPúäLPHARDWAREHOOKSTRUCTálúäCreateDesktopAãˆúäLR_LOADFROMFILEâ¤úäSTREAM_SEEK_SETâÈúäMDM_GEN_X75_PROTOCOL_DATAè SQL_IGNOREãøúä is_integerëGetFullPathNameAá4ûäEMR_POLYBEZIERTO16ãPûäVP_FLAGS_TV_MODEápûäXST_ADVDATAACKRCVDãŒûä??_7IStorage@@6B@èIMC_SETCOMPOSITIONWINDOWáÈûä PulseEventãàûä EDGE_SUNKENãüäSPOOL_FILE_TEMPORARYéSQL_SCHEMA_TERMâ,üäasinéRpcTryFinally\üä CertIssuerãpüä AllocateáœüäIXMLDOMNamedNodeMap_reset_Stubã¼üäSQL_FN_STR_POSITIONêSQL_PS_SELECT_FOR_UPDATEâýäREGDB_E_KEYMISSINGãýäMK_E_NOSTORAGEã8ýäIDC_APPSTARTINGâTýäszOID_OIWSEC_shaápýäGetUpdateOptionséLPPROPVARIANTœýätls_lconv¼ýäERROR_INVALID_OWNERâØýäDefinitionLengthâþäPRINTER_NOTIFY_FIELD_DEVMODEá þäSafeArrayPtrOfIndexêIMC_GETCOMPOSITIONWINDOWá`þäQDI_DIBTOSCREENâ”þä'IInternetProtocolSink_ReportData_ProxyëPUAF_NOUIÈþäSYSYNC_PLATFORM_NAMEáôþä&@class$7635clientEngine_dbg___pchÿäPAN_LETT_OBLIQUE_OFF_CENTERâ8ÿäSetPolyFillModeâPÿä caGreenGammaálÿäMCI_STRING_OFFSETèCertAddCTLContextToStoreá¬ÿäERROR_CONTINUEãÄÿä HTBOTTOMLEFTáôÿä#MIXERLINE_COMPONENTTYPE_DST_WAVEINëLPSOCKADDR_IN$ä max_elementâDä ERROR_OLD_WIN_VERSION\ä WM_CHARTOITEMxä KP_VERIFY_PARAMSé PCERT_ENHKEY_USAGEã´ä!CreateDirectoryAáÐä!LPCBT_CREATEWNDWáìä!LB_ITEMFROMPOINTáä !CTRY_IRELANDá$ä!NdrUnMarshCCtxtHdlã8ä !ulUnused1è!IRpcStubBuffer_Connect_Stubâ„ä"APPLICATION_ERROR_MASKã¨ä"DMICM_ABS_COLORIMETRICãÀä "lBufOffsetãôä)"IInternetSession_RegisterMimeFilter_Stubáä"PSD_DISABLEPAPERá(ä "SQL_DATETIMEé "SQL_C_FLOATâdä#ERROR_HOST_UNREACHABLEã„ä#OSS_TABLE_MISMATCHã˜ä#IsMenuë#NdrDcomAsyncClientCallãÐä $BAUD_110áðä$PFD_DEPTH_DONTCAREã ä$MCI_STATUS_MODEâ4ä$CRYPT_ATTRIBUTE_TYPE_VALUEãTä$szOID_TELEX_NUMBERã|ä$CERT_PROT_ROOT_FLAGS_REGPATHé($__IDataAdviseHolder_INTERFACE_DEFINED__âØä%ERROR_DS_CANT_DELETE_DSA_OBJé%CMSG_ENVELOPED_FLAGâ ä &S_LEGATOá(ä&RealizePaletteë&MM_SNDBLST_MIDIINdä'ERROR_NO_SUCH_USERã€ä'GetWindowLongPtrA´ä*'AsyncIUnknown_Finish_QueryInterface_Proxyè '@7790Øä(__cmath__üä(ChangeDisplaySettingsAãä(WNNC_NET_SUN_PC_NFSê((__IInternetProtocol_INTERFACE_DEFINED__â|ä )ERROR_DS_INAPPROPRIATE_MATCHINGâ”ä )IsCharLowerAá°ä)WSAAsyncSelectë*)CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAGáä*SizeOfZeroFillãä*AUXCAPS_LRVOLUMEá<ä*MIXERR_INVALCONTROLâdä*IStorage_RenameElement_Proxyé*PENDINGTYPE_TOPLEVELá¨ä+FILE_CREATE_PIPE_INSTANCE¼ä +WB_RIGHTáÔä+NPWAVEOUTCAPSüä+CRYPT_OID_REG_DLL_VALUE_NAMEé +cImplTypesã(ä,PHANDLEâDä,GetBinaryTypeWã\ä ,PEVENTMSGMSGá€ä,CertGetEnhancedKeyUsageâœä,FindCertsByIssuerè,get_statusTextãÌä-_inlineâìä-CERT_DH_PARAMETERSë-FSCTL_QUERY_RETRIEVAL_POINTERSã,ä.spawnleâXä&.@class$7636clientEngine_dbg___pch„ä&.@class$7737clientEngine_dbg___pch¨ä.SCARD_READER_TYPE_VENDORáÈä._PRINTER_DEFAULTSAãää.GetPrinterDataExé.IID_IBindProtocol ä /nFileSizeLowá4 ä/GetQueueStatusë /tagCLIPDATAâl ä0OSS_OPEN_TYPE_ERRORê0FW_THINâ  ä1MK_E_INVALIDEXTENSION¸ ä 1hWndActiveãÌ ä 1ICON_BIGáè ä1GetWindowLongPtrWá ä 1BinsRangesã ä 1DOMNodeTypeê1SC_ACTION_RESTARTH ä 2putwchará` ä 2STOPBITS_15∠ä2OSS_TRACE_FILE_ALREADY_OPENâ  ä2LPEVENTMSGMSG¸ ä2GetInputStateÐ ä2CTRY_COLOMBIAô ä2_CTL_VERIFY_USAGE_PARAã ä 2ChangerSlotâD ä+2ITimeAndNoticeControl_SuppressChanges_Stubë 2VarI2FromI1ât ä 3ShiftCountã” ä3dwStreamAttributes㬠ä 3EN_HSCROLLë3SetUpdateOptionsáä ä4is_pointer_impãø ä4TA_BOTTOM ä4caFlagsê4IXMLDOMParseErrorD ä5PROCESS_TERMINATE` ä5PPATHNAME_BUFFERé5PropSheet_IsDialogMessage¨ ä6RPC_E_CANTCALLOUT_AGAINâÈ ä6CryptDecryptMessageâì ä6CERT_QUERY_CONTENT_CERTê6LPOLESTREAMVTBLâ ä 7STOPBITS_10â< ä7CreateDirectoryWáX ä7LPCBT_CREATEWNDAဠä7ReadConsoleOutputAttribute㘠ä 7VarI2FromI4ê7ODBC_ERROR_INVALID_STRãÐ ä 8nCmdShowáè ä 8PJOB_INFO_1ê8_PRINTER_DEFAULTSWã$ä9SPI_SETLANGTOGGLE<ä 9PHCRYPTASYNCá\ä9IXMLDOMImplementation|ä9VARIANT_UserMarshalê9ODBC_INSTALL_COMPLETE¬ä:FromáÄä :_INC_EXCPTãàä:GetBinaryTypeAãä:ERROR_INVALID_PRIORITYã ä:E_ACCESSDENIEDã@ä:SCARD_F_COMM_ERRORãXä:elpNumEntrieslä:h_nameã„ä :PJOB_INFO_3âÈä8:IOleInPlaceActiveObject_RemoteTranslateAccelerator_StubâÜä:ZAFLAGSê:VarNotãä;spawnlpâä ;EN_MAXTEXTã@ä;PCRYPT_X942_OTHER_INFOãXä ;PJOB_INFO_2ê;IID_IAdviseSinkâ˜ä<SUBLANG_UZBEK_CYRILLICã¬ä <srWindowáØä<I_RpcConnectionSetSockBuffSizeää"<NdrServerContextNewUnmarshall0ä#<MftBitmapWritesFlushForLogFileFullë<AsyncGetClassBitsdä =domain_errorá„ä=ObjectOpenAuditAlarmáœä =C3_FULLWIDTHá¼ä=RpcNsMgmtSetExpAgeãðä(=CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERTê=SQL_CONVERT_NUMERICâ<ä&>@class$7637clientEngine_dbg___pch`ä>ChangeDisplaySettingsWã€ä>CDERR_LOADSTRFAILUREáœä>WM_DDE_REQUESTã¼ä>MCI_VD_MEDIA_OTHERãÜä>CERT_PUBLIC_KEY_INFOáðä >Histogramè>SCardSetCardTypeProviderNameá,ä ?wcsnicmpáLä?IMAGE_SYM_TYPE_SHORTádä ?IsCharLowerWé?SC_SIZEâ¤ä!@ERROR_DS_SECURITY_CHECKING_ERRORé @PDOC_INFO_1âÜäARPC_S_INVALID_NAF_IDáøäAOLE_E_INVALIDRECTäATRUST_E_CERT_SIGNATUREã@äAPPIXELFORMATDESCRIPTORãdäACERT_SYSTEM_STORE_USERSêA??_7IROTData@@6B@ äBtagTTPOLYGONHEADERãÀäBwaveOutGetDevCapsWãàäBMCI_VD_SEEK_REVERSEâäBNdrFixedArrayMemorySizeâä BPDOC_INFO_3â0ä BFUNCDESCéBDIALOPTION_BILLINGãhä C__double_mináˆäCMIXER_OBJECTF_HANDLEá ä CALG_SID_SHAâÌä!CTIME_VALID_OID_FLUSH_OBJECT_FUNCé CPDOC_INFO_2âüä DAC_SRC_ALPHAé DEM_FMTLINESê EAddMonitorAâLäFNTE_BAD_PUBLIC_KEYã|ä#FCRYPT_PARAM_CANCEL_ASYNC_RETRIEVALã˜äFIRpcChannelBufferèFFADF_FIXEDSIZEãÈäGbSetFocusøä#GCERT_ALT_NAME_VALUE_ERR_INDEX_MASKëGSQL_GB_NOT_SUPPORTEDá(äHEIOâ<äHremove_if\äHNORM_IGNORESYMBOLSãtäHCAL_SDAYNAME2˜äHITypeMarshal_Free_StubãÈä%HIEnumSTATPROPSETSTG_RemoteNext_ProxyéHVarR8FromUintøä IGCLP_HMODULEáäICAL_SDAYNAME3èIJOB_STATUS_BLOCKED_DEVQâLä Jremove_constápäJPIMAGE_FUNCTION_ENTRY64âŒäJESB_DISABLE_RIGHTèJMDM_MASK_PROTOCOLINFOÜä*KPJOBOBJECT_SECURITY_LIMIT_INFORMATIONôäKCAL_SDAYNAME1èKckidá äL__unique_copy_aux8äLCAL_SDAYNAME6TäLMCI_SYSINFO_OPENáhäLSetJobëLSYS_WIN16äMSYDEBUGâ¨ä MMoveFileExãÈäMWSA_QOS_EFLOWCOUNTãÜäMVK_INSERTôäMCAL_SDAYNAME7èMDistPointName$äNCAL_SDAYNAME4èNSQL_FN_STR_CONCAT\äOSetThreadContextátäOCAL_SDAYNAME5è$ONdrConformantVaryingArrayUnmarshallâÀäPdwAvailableModesáØä P__RPCDCE_H__é PFR_MATCHDIACâäQdivâäQERROR_MORE_WRITESDäQRPC_E_CONNECTION_TERMINATEDâTä QHCONVhäQiCodePage€ä QNDR_SCONTEXTá”äQnFontType°äQSERVICE_INACTIVEáÐäQSQL_OPT_TRACE_DEFAULTèQSQL_CONCUR_ROWVERáäRnothrowâ@ä6RIGlobalInterfaceTable_RegisterInterfaceInGlobal_ProxyèROleQueryCreateFromDataãtä SPBOOLŒä SbV4ClrUsedã¨äSABS_ALWAYSONTOPê SAddMonitorWâÜäTGetFullPathNameâøäTSPCLPASSTHROUGH2áäTySrcáäTCF_LOCALE<äTwaveOutGetDevCapsAãXäTLPSOFTDISTINFOëTVarCyFromDisp”äUIMAGE_REL_SH3_DIRECT16ã¼äUCERT_PUBKEY_ALG_PARA_PROP_IDáÐä USF_RECORDè USQL_DATEáäVCO_E_FAILEDTOIMPERSONATEá0äVI_RpcNsInterfaceUnexportedãLäVStartingElementê!VSCARD_ATTR_CURRENT_PROTOCOL_TYPEáä WSTOPBITS_20ê WWIM_DATAá¼ä XGLOBALHANDLEáÐäXrgbtGreenðäXszOID_PRODUCT_UPDATEáä&X__AsyncIAdviseSink2_FWD_DEFINED__DäXIEnumUnknown_RemoteNext_StubéXUnlockRequestèYRPC_C_AUTHZ_DCEê ZLPTYPECOMPã¬ä[binary_convertãÀä [fCtsHoldáää[ImpersonateAnonymousToken ä[CERT_STORE_CTRL_AUTO_RESYNCâ ä [VT_LPWSTRè[lpWordãH ä\VK_TABãX ä\Callsè\pdblVal∠ä]CTRY_MACEDONIA㬠ä]SCARD_CLASS_IFD_PROTOCOLé]VarDateFromUdateExãø ä&^@class$7631clientEngine_dbg___pch !ä^CERT_COMPARE_KEY_IDENTIFIERâD!ä^IOCTL_STORAGE_MCN_CONTROLl!ä^IDropTarget_DragLeave_Stubë^BINDSTRING_EXTRA_URLá¨!ä_szOID_OIWDIR_SIGNè_SQL_API_SQLGETSTMTATTRãø!ä&`JobObjectSecurityLimitInformation "ä`RestoreDC("ä`pwszSystemStoreâ\"ä(`IXMLDOMDocumentType_get_notations_Proxyê'`IXMLElementCollection_put_length_Proxyã¤"ä aSAVE_CTMá¼"ä aDRV_MCI_LASTáØ"äaIP_MULTICAST_TTLáô"äaVarBstrFromUI4ëaSQL_COLUMN_ALIASé bWS_SIZEBOXãL#äcallocator_const_reference`#äccurrentâx#ä c__nullstringá#ä cModifiedIdã´#äcDNS_ERROR_OPERATION_BASEáÐ#äcSPI_SETPENWINDOWSð#äcSERKF_SERIALKEYSONã$äcMftWrites $äcOnInPlaceActivateècSQL_DIAG_CREATE_TABLE\$ädreplace_copy_ifât$ä dHGDI_ERRORã”$ädNdrComplexStructFreeá°$ädNonCachedWritesêdVarBstrFromUI1ãà$ä eOPTIONALá%äeIMAGE_SCN_ALIGN_512BYTESá%ä eMAX_LANAá4%äePropSheet_AddPageP%äetagXMLEMEM_TYPEêeODBC_VS_FLAG_UNICODE_CORá%äftagCURSORSHAPEã¼%ä!fCMSG_KEY_AGREE_STATIC_KEY_CHOICEáÜ%äfVarFormatFromTokensêfGCL_CONVERSIONã&ägGetThreadContextá4&ägERROR_FILE_READ_ONLYáL&ä gPALETTERGBãl&ägEnumWindowStationsWâŒ&ägtagMIXERLINECONTROLSA¤&ä ggetsockoptã´&ägDropáÐ&ägVarBstrFromUI2ë gSC_ENUM_TYPEá'äh_SW_UNEMULATEDã0'ä!hMAXIMUM_REPARSE_DATA_BUFFER_SIZEáL'ähINPLACE_S_LASTãl'ähCRYPT_MACHINE_KEYSETá'ähSCardIntroduceCardTypeAâ¨'ä hPSH_DEFAULTêhITypeInfo_GetFuncDesc_Proxyâø'ä"i_SECURITY_IMPERSONATION_LEVEL(äiERROR_CANCELLEDâ0(äiPNEWTEXTMETRICWâL(äiWC_DEFAULTCHARãx(ä"iX509_BITS_WITHOUT_TRAILING_ZEROESè iITypeInfo_RemoteGetVarDesc_StubâÄ(äj_SHCREATEPROCESSINFOWà(äj_CTL_USAGE_MATCHáø(ä jEnumAdviseëjSQL_DATA_SOURCE_READ_ONLY8)äkSYSTEM_ALARM_ACEáT)äkPORT_TYPE_WRITEê(k__IInternetPriority_INTERFACE_DEFINED__â )ä lBAUD_38400ãÄ)älERROR_WINDOW_NOT_DIALOGâì)älSPAPI_E_INVALID_COINSTALLERâ*ä lPEMRLINETOã*älVK_NONCONVERTD*älCOMMON_LVB_GRID_HORIZONTALëlUuidFromStringAâ|*ämSTG_S_CONVERTEDêmIBinding_Abort_Proxyá´*ä nCRYPT_FAILEDáà*ä"n@class$7733clientEngine_dbg___pchá+äntagRemHENHMETAFILEã(+ä"nIMoniker_RelativePathTo_ProxyT+änIOleClientSite_GetMoniker_StubënPARSE_CANONICALIZEã”+äoCERT_E_PATHLENCONSTêoSBS_LEFTALIGNÄ+ä pPST_SCANNERâÜ+ä pGlobalHandleáø+äpVFT2_FONT_RASTERá$,äpCRYPTPROTECT_PROMPT_ON_PROTECTëpIEnumVARIANT_Clone_Proxyád,äq_MSL_VA_LIST_TYPEˆ,äqERROR_EAS_NOT_SUPPORTEDâ ,ä qMK_E_FIRSTãÀ,äqEnumWindowStationsAâà,äqtagMIXERLINECONTROLSWø,äqtree_size_ndr(-ä$qSQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1êqSQL_CA2_OPT_ROWVER_CONCURRENCYãp-ärJOYCAPS_POV4DIRê$rSQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2â¼-äs_open_osfhandleâÌ-äs_STDáè-äsCreateSolidBrusháø-äsuIDâ4.ä/sAsyncIAdviseSink_Begin_RemoteOnDataChange_StubësMDM_MASK_BEARERMODEâl.ä tETO_OPAQUEã|.ätxSrcá´.ä-tIXMLDOMNamedNodeMap_removeQualifiedItem_StubétSQL_CA2_CRC_APPROXIMATEâì.äumemchrãü.äuSbz2á/äuTOKEN_ALL_ACCESS_Pãä –EncryptFileâL>ä–ERROR_INSTALL_SUSPEND\>ä–hKeyáp>ä–AF_IPXë–SERVICE_PAUSEDã¬>ä—DESKTOP_CREATEWINDOWáÈ>ä—cNoticeNumbersë—VarBstrFromI2ô>ä™LPLONGã?ä ™MoveFileá?ä™ODS_FOCUSD?ä™SCardGetReaderCapabilitiesãh?ä™LPSERVICE_STATUS_PROCESSé ™SQLSetParamâ˜?ä šCTRY_TUNISIAá¸?äšPSHCREATEPROCESSINFOWÔ?äšOriginatorCertIdéšCLSID_PSDragDropá@ä›__palm_os@ä›exp2lè›PRINTER_NOTIFY_FIELD_PORT_NAMEãT@ä œ_CRTAPI2áh@ä œGetParentè œILockBytesã˜@ä VK_OEM_COMMAá°@ä lpstrReturnêPP_CHANGE_PASSWORDãü@ä žIMAGE_SIZEOF_ARCHIVE_MEMBER_HDRâAä žMOD_FMSYNTHê žtagOLEMISCã@Aä Ÿ_CRTAPI1ádAäŸSPAPI_E_DI_DONT_INSTALLâ€AäŸSET_SCREEN_ANGLEá AäŸCreateFontIndirectWâÄAäŸRESOURCEDISPLAYTYPE_TREEáàAäŸMMSYSERR_NOERRORáBäŸ??_7IDirectWriterLock@@6B@ã4Bä"ŸIXMLDOMDocument_get_doctype_Proxyè Ÿ??_7IEncodingFilterFactory@@6B@â€Bä __OBJECTID_DEFINEDã¤Bä IMAGE_COMDAT_SELECT_ANYâÈBä RPC_X_SS_HANDLES_MISMATCHàBä  WINUSERAPIãüBä WN_BAD_NETNAMEë mmioStringToFOURCCAâ@Cä¡ERROR_FILEMARK_DETECTEDâXCä ¡GetMetaFileâxCä¡NdrUnMarshSCtxtHdlãCä ¡pfnMarshallâ¬Cä¡pwcsElementNameê ¡appendChildâäCä¢ImpersonationLevelãDä¢TAPE_DRIVE_RESERVED_BITâ(Dä¢RPC_S_UUID_NO_ADDRESSè¢SCARD_E_INVALID_PARAMETER`Dä£ENFILEã€Dä£SetThreadAffinityMask”Dä£nCountã°Dä£EMRSELECTOBJECTâàDä%£__ILayoutStorage_INTERFACE_DEFINED__é£caboolãEä ¤BAUD_150é*¤IRpcChannelBuffer3_RegisterAsync_StubLEä¥_P_WAITâdEä ¥TAPE_TENSIONá„Eä¥CLIPBRD_E_CANT_EMPTYáœEä¥SPI_SETBORDER¼Eä¥RpcNsBindingUnexportAÐEä ¥cAccDescrè¥PORT_STATUS_POWER_SAVEë¦CERT_SET_KEY_CONTEXT_PROP_IDá,Fä§TopâHFä§RpcObjectSetTypeé§FILE_DEVICE_FILE_SYSTEMâ˜Fä&¨ERROR_CLUSTERLOG_NOT_ENOUGH_SPACE´Fä¨NumberIEElementsáäFä#¨IMoniker_RemoteBindToStorage_Proxyë¨ITypeInfo2_GetTypeKind_Proxyá$Gä ©EXPIRY_YEARâInterlockedIncrementé>ioRequest¸Žä?ERROR_INTERNAL_DB_CORRUPTIONáÔŽä?IsWindowUnicodeâôŽä?RpcNsProfileEltAddWê?SCardListCardsWâ,ä@BITMAPCOREINFOë!@IWinInetHttpInfo_QueryInfo_ProxyápäAtagDROPSTRUCTŒäACompareStringAã°äA??_7AsyncIAdviseSink@@6B@Èä AtagTYPEDESCêAIXMLHttpRequest_open_StubäBIS_TEXT_UNICODE_NOT_ASCII_MASKëBdwGroupIdLäC__WReadProcActionsã`ä CiteratoráˆäCREAD_COMPRESSION_INFO_VALIDâ¼ä'C__AsyncIAdviseSink_INTERFACE_DEFINED__ëCSQL_CA1_BULK_ADDáðä DRPC_VERSIONâ‘äDCryptSetAsyncParamë DSQL_OJ_INNERáP‘äESUBLANG_SPANISH_COSTA_RICAãp‘äEIMAGE_SYM_TYPE_UNIONé EDispCallFuncᬑäFSCARD_E_UNKNOWN_RES_MNGâÌ‘äFITypeComp_Bind_Stubâü‘ä%F__MIDL_itf_urlmon_0171_v0_0_c_ifspecá,’ä%F__MIDL_itf_urlmon_0173_v0_0_s_ifspecé"FSQL_INTERVAL_MINUTE_TO_SECOND|’äGszOID_INFOSEC_mosaicKMandSigéGGetRunningObjectTable¸’äHCREATE_SUSPENDEDáÔ’äHERROR_BAD_DRIVERáè’ä HCopyRectáü’ä HdwDrivesá“äHCdRomClassGuidã0“ä HLPPARAMDESCê%HSQL_DL_SQL92_INTERVAL_HOUR_TO_SECONDá|“äIconst_reference☓äIUnwindInfoAddress°“ä ICTRY_FINLANDáØ“ä"IMIXERCONTROL_CONTROLTYPE_BASSô“äI_GET_MEDIA_TYPESéIIME_CMODE_CHINESED”ä.JERROR_DS_MISSING_INFRASTRUCTURE_CONTAINER\”ä JDeleteObjectáx”äJMMIO_INSTALLPROCᘔäJPMCI_ANIM_PLAY_PARMSéJVarBstrFromDateâÄ”äKDplâä”äKERROR_BAD_DEV_TYPEä•äKUpdateICMRegKeyWá•äKtagRemHBITMAPè KURLMON_OPTION_USERAGENT_REFRESHâd•äLTHREAD_SET_CONTEXT㌕äLMCI_WAVE_STATUS_BLOCKALIGNëLpPipeDesc´•äM_TYPEINFOЕäMEMRCLOSEFIGUREãì•äMEXTCONN_CALLABLEâ–äMPrepareâ–äMlpstrFileTitleë M__SQLEXTáH–ä NDMBIN_MANUALéNNdrConformantArrayFreeëOIMAGE_REL_CEF_ABSOLUTEã°–äPSYSER_PRODUCT_CODEãÌ–äPset_new_handlerâÜ–äPDr7âø–äPnSamplesPerSecã—äPSetZoneMappingëPSQL_AT_DROP_COLUMNãD—äQDr6â\—äQPOINTTOPOINTSèQZAFLAGS_CUSTOM_EDIT⤗äR_TAPE_SET_DRIVE_PARAMETERSã¼—ä RS_WHITE1024âä—ä"RERROR_SERVICE_REQUEST_TIMEOUT˜ä!R??_7IOleInPlaceActiveObject@@6B@éRSQL_ISV_CHECK_CONSTRAINTSP˜äS_SW_ZERODIVIDEãt˜äSERROR_UNKNOWN_PROPERTY㌘ä SWindowFromDCá°˜äSCMSG_CMS_RECIPIENT_INFOâИäSSCARD_SCOPE_SYSTEMë)SISynchronizeContainer_WaitMultiple_Proxyá™äTaccessã(™äTDr3âL™äTSetProcessPriorityBoostâp™äTRPC_X_SS_IN_NULL_CONTEXTሙä TES_READONLYâ ™ä TWNNC_NET_CSCá´™äTdwZposëTRemSNBãØ™äUDr2âô™äUSE_DACL_PROTECTEDšäUPTOKEN_INFORMATION_CLASSá<šäURPC_E_FULLSIC_REQUIREDãXšäUEMRSELECTCLIPPATHpšäUGetLocaleInfo”šäURPC_S_ASYNC_CALL_PENDINGáÀšä!UIDataAdviseHolder_Unadvise_ProxyáØšäUput_nodeValueèUSQL_SFKD_NO_ACTIONã›äVDr1êVERROR_LUIDS_EXHAUSTED8›äWDr0â\›äWSERVICE_WIN32_OWN_PROCESSx›äWCompareStringW㘛äWSCARD_STATE_UNKNOWNâ°›ä WVarI2FromR4êWSC_ACTIONì›äX_TAPE_GET_DRIVE_PARAMETERSãœä XR2_COPYPENãœäXWNDPROCâ8œäXSND_ALIAS_SYSTEMEXITé XcUnusedBitsâlœäYIMAGE_ARCHIVE_PADˆœäYETO_NUMERICSLATINèYWHDR_DONE°œäZPrologLenÄœäZLocalSizeìœäZERROR_DS_DRA_OBJ_NC_MISMATCHáüœä ZxformäZMOUSE_WHEELED(äZs_nameãDäZpszCredentialsOidè.ZIOleInPlaceActiveObject_ResizeBorder_StubŒä [snprintfá¬ä[TRUST_E_SYSTEM_ERRORáÀä [tmAscentáÜä[MIDICAPS_STREAMãžä[szOID_NT_PRINCIPAL_NAMEâ4žä'[IBindStatusCallback_OnLowResource_Stubë [VarI2FromR8âlžä\MCI_NOTIFY_SUPERSEDEDŒžä\PSH_WIZARDHASFINISHê\GetVarIndexOfMemIdãÈžä]UpdateICMRegKeyAé]MCI_OVLY_PUT_SOURCEâŸä^SUBLANG_ITALIAN_SWISSŸä^DCB_DIRTY@Ÿä^META_INTERSECTCLIPRECTë^PSP_USEICONIDpŸä _UnlockFileExᜟä_ERROR_DS_BAD_ATT_SCHEMA_SYNTAX㼟ä_EMR_CREATEMONOBRUSHâØŸä_ColorAdjustmentê_SQL_INTERVAL_MINUTEâ ä`IMAGE_SCN_ALIGN_2BYTESã8 ä`SCARD_E_NOT_READY\ ä`SPLDS_PRINT_MAX_Y_EXTENTé"`IME_THOTKEY_IME_NONIME_TOGGLE” ä afmaxf´ äaDD_DEFSCROLLINTERVALé aMSLstring.hâä ä bMoveWindowë bHELPINFOá¡äcDEFAULT_PROXY_HOSTã0¡äcEMR_INVERTRGNL¡äcPRF_ERASEBKGNDãh¡äcCB_SETITEMDATA㘡ä%cIOleInPlaceSite_OnPosRectChange_StubécSQL_ATTR_READWRITE_UNKNOWNãÔ¡äd_Singleã¢ä&dRPC_E_CANTCALLOUT_ININPUTSYNCCALL¢ädST_TERMINATED0¢ä dPMIXERLINEAâH¢ädszOID_PKCS_10d¢ädIOleClientSiteã¢ä&dIXMLDOMNodeList_get__newEnum_Stub¨¢ä dget_parentëdURLOpenPullStreamAãÜ¢ä eCLRBREAKáü¢äeERROR_JOIN_TO_JOINã£äePEVENTMSG,£äeGetKeyNameTextWâL£äeMCI_ANIM_STATUS_HWNDéePF_DECnetx£äfLOG_ONEPX_MIN¤£äfEVENTLOG_END_ALL_PAIRED_EVENTSãÈ£äfGetCharABCWidthsFloatWãè£äfENUM_ALL_CALENDARSä¤äfszOID_PKCS_12èfLPAUTHENTICATIONá0¤ägparent_âH¤ä gMB_NOFOCUSã`¤ägMetaDataReads€¤ägIID_IXMLDOMNotationêg_rlpᬤähCLIENTSITE_E_LASTĤähSM_CYMAXTRACKܤä hSO_DISCOPTä¥ähSPLDS_PRINT_MAX_X_EXTENTé.hIXMLDSOControl_put_JavaDSOCompatible_Stub\¥äiIMAGE_FILE_BYTES_REVERSED_LOá|¥äiERROR_FILE_INVALID㔥äiEMR_SETPIXELV¬¥ä ipszCaptionãÜ¥ä%i__IInternetZoneManager_FWD_DEFINED__é iSetCustDataâ ¦ä j__fill_memã0¦äjIMAGE_DEBUG_TYPE_CLSIDãT¦äjINVALID_SET_FILE_POINTERál¦ä jptPositionëjLoadIconW¦ä kfmaxl¬¦äkERROR_DS_IS_LEAFáȦäkListIdentifierãä¦äk_PROPSHEETHEADERWèkDeleteMonitor§älszlCorner(§älmciSendStringèlDeleteImplTypeã\§ä mtagEVENTMSGât§ä mwMaxButtons☧ämCertVerifyValidityNesting¸§ämSCARD_READERSTATEAãЧä mPSH_WIZARDãô§ämIEnumOLEVERB_Next_Proxyâ,¨ä+mIBindStatusCallback_RemoteGetBindInfo_StubëmSQL_ATTR_TRACEã\¨änspawnve
änCRITICAL_SECTION_DEBUGã ¨änMCI_SEQ_STATUS_SLAVEἨänDriveCleanTimeoutè nGetErrorInfoáä¨äoPCCHâ©äowServicePackMajor0©ä#oERROR_DS_PDC_OPERATION_IN_PROGRESSëoPCTL_INFO`©äpSCS_32BIT_BINARYá„©äpERROR_INVALID_EVENTNAME⨩äpGetCharABCWidthsFloatAëpIID_IXMLDOMNamedNodeMapâà©ä qvfprintfâªäqUSER_CALL_CTXT_MASKê qSTGM_CONVERTá@ªärTAPE_DRIVE_SET_COMPRESSIONãhªärERROR_DS_BAD_INSTANCE_TYPEㄪärSetMenuItemInfo✪ä rPMIXERLINEWêrURLOpenPullStreamWãЪäsllrintlâèªäsPACCESS_TOKEN«äsLPMEASUREITEMSTRUCTâ$«äsGetClipboardOwner@«äsGetKeyNameTextAâ\«äsMMSYSERR_NOMEMãp«ä sSTGM_READè sSQL_CVT_CHARé tpwszProvNameἫäuDECLSPEC_ALIGNãÔ«ä uPIPE_NOWAITâð«äuFACILITY_COMPLUSá¬äuTYMED_HGLOBALè%uIXMLDOMElement_setAttributeNode_StubáP¬ävLANG_GEORGIANx¬ävERROR_DS_CONSTRUCTED_ATT_MODévSQL_API_ODBC3_ALL_FUNCTIONS⼬äwWM_SYSCOLORCHANGEè wTPM_NONOTIFYáè¬äx_wcsdupâ­äxACCESS_OBJECT_GUIDã ­ä xDATADIR_SETêx_SC_ENUM_TYPEL­äyllrintfâp­äyPIMAGE_DEBUG_DIRECTORYã­äySetConsoleWindowInfoᬭäyMIDIPROPTIMEDIVâÈ­äyPOPENCARDNAMEW_EXèyStringFromGUID2âü­ä zEXIT_SUCCESSá ®ä zXFORM<®ä#zIBindCtx_RegisterObjectParam_ProxyëzIBindProtocolh®ä{spawnvpâ„®ä{SE_SACL_PROTECTED˜®ä{CC_WIDE⬮ä{SetDIBitsÌ®ä{MMSYSERR_BADERRNUMãä®ä {_userBITMAPâ¯ä{SCARD_READERSTATEWã(¯ä{dwModemManufacturerSizeâD¯ä{SQL_RD_DEFAULTë{SQL_API_SQLBULKOPERATIONS”¯ä!|IMAGE_SYM_CLASS_MEMBER_OF_STRUCTáįä$|ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEADâدä |LoadIconAè|tagCABSTRBLOB°ä }NOMINMAXá$°ä}ActiveProcessLimitãL°ä"}SPAPI_E_EXPECTED_SECTION_NAMEt°ä}SPAPI_E_NO_ASSOCIATED_CLASSâ°ä}LB_SETITEMDATA㬰ä}MIXERR_LASTERRORáȰä}NDR_LOCAL_ENDIANé}_PROPSHEETHEADERAø°ä~memcpyã ±ä ~REG_LINKá,±ä~WN_NO_MORE_DEVICESãH±ä~CALG_TLS1_MASTERál±ä~??_7IOleCacheControl@@6B@˜±ä ~__IXMLDOMNotation_FWD_DEFINED__ê~IPropertyStorage_Stat_Stubãè±äERROR_DS_ATT_SCHEMA_REQ_IDä²ä REGISTERWORDé%SQL_DESC_DATETIME_INTERVAL_PRECISIONáD²ä€RUNDLGORDd²ä€RPC_S_OUT_OF_THREADSé,€__IInternetProtocolRoot_INTERFACE_DEFINED__⸲äENUMRESTYPEPROCâÔ²äGGO_GRAY8_BITMAPáð²äCMSG_SIGNED_FLAGéDSPRINT_UPDATEã$³ä ‚DecryptFileAá@³ä‚META_EXTTEXTOUTâT³ä‚RGNDATAâp³ä‚MCI_STATUS_STARTጳä‚IME_CMODE_EUDCë‚SQL_SCOPE_TRANSACTIONгä„SetWindowContextHelpIdãè³ä „QueryOptionê!„__MIDL_IInternetZoneManager_0001á0´ä…DFCS_BUTTONCHECKé…IRecordInfo_RecordCopy_Stubât´ä†RELEASE_MONTH_TXT˜´ä†IMAGE_SUBSYSTEM_NATIVE㸴ä†ERROR_RPL_NOT_ALLOWEDà´ä†RpcBindingFromStringBindingAâµä†RpcSsGetThreadHandleá4µä(†IRpcHelper_GetDCOMProtocolVersion_Proxyâdµä#†IWaitMultiple_AddSynchronize_Proxy㔵ä%†__MIDL_itf_urlmon_0170_v0_0_s_ifspecáĵä%†__MIDL_itf_urlmon_0172_v0_0_c_ifspecé"†RegisterServiceCtrlHandlerExAüµä ‡LPCCH ¶ä‡QueryPerformanceCounterâP¶ä%‡CertRemoveEnhancedKeyUsageIdentifierá|¶ä!‡__MIDL_IInternetZoneManager_0002é‡VARCMP_GT¤¶äˆ_PUBKEYâȶäˆPropSheet_SetHeaderTitleéˆIPropertyStorage_SetClass_Stubã·ä‰isnanè ‰LCMapStringAá8·äŠCONNDLG_RO_PATHêŠSQL_ATTR_CONNECTION_DEADát·ä ‹__float_hugeᘷä‹CERT_E_REVOCATION_FAILURE¬·ä ‹SP_ERRORé‹SQL_DRIVER_VERãÜ·äŒptlCenterø·äŒlpszActivePortã¸äŒNdrRpcSsDefaultAllocateâ4¸ä Œget_systemIdé ŒIXMLDOMEntity_get_publicId_Stubâ|¸äDRAGDROP_E_LASTê SONY_12_WOã´¸äŽRequestDeviceWakeupâ̸ä ŽBlendFlagsãè¸äŽCallMsgFilterAëŽIEnumFORMATETC_Skip_Proxy4¹ä"IMAGE_LOAD_CONFIG_DIRECTORY32T¹älpszDCISectionNameëDllGetClassObjectˆ¹ä SID_DEFINEDâ°¹äRpcBindingFromStringBindingWá̹äNumberOfElementsáä¹ä tagLOCKTYPEê"RegisterServiceCtrlHandlerExW,ºä‘STG_E_DOCFILETOOLARGELºä‘MARSHALINTERFACE_MINáxºä"‘ICreateTypeLib2_SetCustData_Proxyè‘SQL_ISV_TABLESã¨ºä ’LC_FIRSTáÀºä ’SetEndOfFileáܺä’dwCursorPositioné ’SetFillSizeâ»ä“GetSystemWindowsDirectoryè “_BIN_RESULTSáH»ä ”DecryptFileWá`»ä ”DestroyIconâx»ä”SO_ACCEPTCONN»ä ”STGM_CREATEê ”SQL_GD_BLOCKáÀ»ä •EVENPARITYãô»ä*•IPropertyStorage_DeletePropertyNames_Stubè •SQL_CV_LOCALá0¼ä–CHANGER_VOLUME_REPLACEë'–AsyncIAdviseSink_Finish_OnRename_Proxyㄼä—LPEXCEPTION_RECORD㬼ä—DNS_ERROR_WINS_INIT_FAILEDãÔ¼ä—COMADMIN_E_CAN_NOT_START_APPáè¼ä —WMSZ_TOPáø¼ä —szTip½ä—dwAcquirePrivateKeyFlagsá<½ä—CHANGER_PRODUCT_DATAé—SPLDS_PRINTER_NAME_ALIASESㄽä˜ERROR_IS_SUBST_PATH⬽ä˜PAN_MIDLINE_STANDARD_POINTEDáȽä˜CallMsgFilterWãè½ä˜ABM_WINDOWPOSCHANGEDá¾ä˜PCERT_POLICY_QUALIFIER_INFOâ,¾ä˜URLTEMPLATE_LOWê˜SQL_CURSOR_ROLLBACK_BEHAVIORál¾ä ™Metrowerksã„¾ä ™OBJ_BITMAPë™GetCharWidth32ãÀ¾äšGetWindowsDirectoryâؾä šIOleWindowãì¾äšsfTypeã ¿äštransformNodeToObjectèšURL_ENCODING_NONEH¿ä›IMAGE_REL_PPC_SECRELé›BAUD_USER|¿äœNdrMarshConfStringHdr¨¿äœIXMLDOMAttribute_get_name_StubëœMDM_BEARERMODE_ANALOGèMCI_BREAKô¿ä žLANG_ENGLISHá Àä žNPEXTLOGPENâ(ÀäžMAX_DEFAULTCHARêžLPWININETINFOTÀäŸtype_infohÀäŸRGBQUADâ€Àä ŸLCMapStringWéŸADVF_PRIMEFIRSTâÀÀä IMAGE_SCN_ALIGN_4BYTESãÔÀä DDEADVISEìÀä  NIM_MODIFYäÁä  VT_CARRAYè rgvargë&¡OLEMISC_IGNOREACTIVATEWHENVISIBLEXÁä ¢PARITY_ODDãlÁä¢CharPrevWˆÁä¢midiStreamStopã Áä¢auxGetNumDevs´Áä ¢StubDescé ¢VT_ERRORáÜÁä£_unlinkãÂä£DOMAIN_GROUP_RID_GUESTSâ Âä£ERROR_BAD_NET_NAMEã4Âä£RgnDataâLÂä £WM_HSCROLLãhÂä£SBS_RIGHTALIGNë£GetConvertStg”Âä¤islessã¤Âä¤PresáÀÂä¤OpenThreadTokenâØÂä ¤DDL_SYSTEMãèÂä ¤wCapsÃä¤_CERT_POLICY_QUALIFIER_INFOâ4Ãä¤CERT_AUTO_ENROLL_PROP_IDáhÃä'¤__IWinInetHttpInfo_INTERFACE_DEFINED__ã€Ãä ¤QUERYOPTIONê¤SQL_DESC_FIXED_PREC_SCALE¼Ãä¥?$allocator@Xè ¥IErrorInfoãðÃä¦R2_MERGEPENNOTãÄä¦DRAFT_QUALITY,Ää¦RIGHTMOST_BUTTON_PRESSEDá\Ää*¦CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC€Ää¦PFN_CERT_STORE_PROV_CLOSE˜Ää¦DESCKIND_NONEè¦ImmSetCompositionWindowâÐÄä§RGN_ANDâèÄä §SS_GRAYRECTâøÄä§tvpâÅä§MftWriteBytesè§_LPSOFTDISTEXT_DEFINEDãLÅä ¨RESTORE_CTMâpÅä¨PFD_GENERIC_ACCELERATEDâŒÅä¨HDC_UserUnmarshal¬Åä¨GetFuncIndexOfMemIdâÄÅä¨PMODEMDEVCAPSè¨SQL_DIAG_ROW_COUNTã Æä©Begin_QueryMultipleInterfacesè©IAdviseSink_OnSave_Stubâ@Æä ªfwideTÆäªputcharâ|ÆäªGetNumberOfEventLogRecordsãÆäªlopnColor¨Æä ªdwCommandIdâÈÆäªVIF_ACCESSVIOLATIONêªCertGetNameStringAäÇä«PAGE_READONLY,Çä«I_RpcConnectionInqSockBuffSizeë«CMSG_ENCRYPTEDãhÇä¬HEAP_CREATE_ALIGN_16áxÇä ¬NPABCŒÇä¬DWLP_USER¤Çä ¬SLE_WARNINGê¬ImmGetCompositionWindowâðÇä­SPAPI_E_DEVINFO_LIST_LOCKEDâÈä­MA_NOACTIVATEANDEATâ(Èä­DDL_DIRECTORYè­__RPCASYNC_H__ãhÈä®BF_DIAGONAL_ENDBOTTOMLEFT Èä,®IXMLDOMDocument_get_preserveWhiteSpace_StubâÀÈä®SQL_API_SQLEXECUTEë®SQL_MAX_DSN_LENGTHãôÈä¯bad_allocÉä¯_SYS_GUID_OPERATOR_EQ_ë¯mmioStringToFOURCCãXÉä°MMSYSERR_HANDLEBUSYê°PFN_RPCNOTIFICATION_ROUTINEâœÉä±SM_CXMINIMIZEDãÀÉä±CBF_FAIL_SELFCONNECTIONSáÜÉä±mixerGetNumDevsâøÉä±MCI_FORMAT_FRAMES$Êä!±PCERT_SYSTEM_STORE_RELOCATE_PARAé ±CertDuplicateCertificateContextê²LGRPIDë³LPPARSEDISPLAYNAMEãœÊä ´e32_objcntã°Êä´cbRegsãÄÊä´CharPrevAÜÊä ´EXTCONN_WEAKáøÊä´_STGMEDIUM_UNIONé%´IInternetProtocol_UnlockRequest_StubáPËäµIMAGE_DEBUG_TYPE_RESERVED10âhËä µEMRENDPATHã|Ëä µpRecInfoé$µITypeInfo_RemoteCreateInstance_StubâÐËä¶DMPAPER_LETTER_TRANSVERSEäËä¶TRIVERTEXüËä ¶HIDE_WINDOWâÌä¶DdeQueryNextServerë¶OLEMISC_INVISIBLEATRUNTIMEãdÌä·PI_DOCFILECLSIDLOOKUP|Ìä·URLOpenStreamœÌä·SOFTDIST_ADSTATE_NONEè·VarBstrFromDispâÜÌä¸SPAPI_E_GENERAL_SYNTAXãôÌä ¸GetMetaRgnãÍä¸pshHelpâ(Íä¸IMalloc_Free_Proxyë*¸IXTLRuntime_absoluteChildNumber_ProxypÍä¹?$allocator@DÍä¹OSS_NEGATIVE_UINTEGER¤Íä¹BDR_INNERÀÍä¹SM_CYMINIMIZEDãØÍä ¹SOCKET_ERRORáìÍä¹VARDESCê¹IOInetProtocolSinkëºSNB_UserMarshalâLÎä»PSINJECT_ENDPAGECOMMENTSé»RootIndexWritesâ„Îä¼DMBIN_SMALLFMTã¨Îä¼CreateDIBPatternBrushPtâÈÎä¼CertGetNameStringWãìÎä¼IEnumSTATDATA_Reset_StubáÏä¼PARAMFLAG_FLCIDê ¼SQL_INTEGERâ8Ïä ½CTRY_ISRAELâ`Ïä½PCERT_BASIC_CONSTRAINTS2_INFOè½IOleLink_BindToSource_Stubã Ïä ¾node_allocã°Ïä¾dwYê¾ABORTPROCàÏä¿wProcessorLevelâðÏä¿dwXâÐä¿MM_DRVM_CLOSEÐä ¿PROV_SSLáHÐä&¿CERT_QUERY_CONTENT_PKCS7_UNSIGNEDdÐä¿OLEMISC_ALIGNABLEè¿IMN_GUIDELINEœÐäÀVP_TV_STANDARD_PAL_Má¸ÐäÀTIMEFMT_ENUMPROCáÌÐä ÀRPCNSAPIáèÐäÀLPOCNCONNPROCAãÑäÀINET_E_NO_VALID_MEDIAèÀWriteHitLoggingâ@ÑäÁLPOSVERSIONINFOWáXÑäÁWM_MDISETMENUˆÑä#ÁI_RpcBindingToStaticStringBindingWë.Á__IBindStatusCallback_INTERFACE_DEFINED__ØÑäÂRemoveDirectoryAáôÑäÂMIDIPROP_TEMPOã Òä ÂmidiOutOpenêÂVARCMP_EQ@ÒäÃSUBLANG_ARABIC_YEMENáhÒäÃSTATUS_GUARD_PAGE_VIOLATIONâÒäÃJobObjectBasicProcessIdListâ¸ÒäÃIMAGE_COMDAT_SELECT_LARGESTâÌÒä ÃSC_CLOSEáìÒäÃVP_TV_STANDARD_PAL_NáÓä!ÃCertCreateCertificateChainEngineé-Ã__IXMLDOMProcessingInstruction_FWD_DEFINED__álÓäÄPFD_MAIN_PLANEã€Óä ÄHTOBJECTá ÓäÄVP_TV_STANDARD_PAL_IáÄÓäÄLPMCI_OVLY_SAVE_PARMSWãäÓäÄRPC_C_EP_MATCH_BY_OBJèÄSQLSetCursorNameA ÔäÅVP_TV_STANDARD_PAL_Há@ÔäÅWNNC_NET_OBJECT_DIREáTÔäÅMetricsâdÔäÅBSTRátÔäÅbSw2á ÔäÅIDropSource_GiveFeedback_Proxyã¼ÔäÅSetVarDocStringêÅSQL_CONVERT_FUNCTIONSðÔäÆEvtCharâÕäÆPSINJECT_VMRESTOREã$ÕäÆMF_STRINGLÕäÆMIXERLINE_TARGETTYPE_WAVEINâ\ÕäÆbSw1átÕä ÆchildNumberâ¤Õä%Æ__MIDL_itf_urlmon_0171_v0_0_s_ifspecé%Æ__MIDL_itf_urlmon_0173_v0_0_c_ifspecáôÕäÇERROR_INVALID_MEDIAâ ÖäÇlcsGammaGreen4ÖäÇCMSG_RECIPIENT_INDEX_PARAMãPÖäÇ_SCONTEXT_QUEUEâhÖä ÇDispatchStrê%ÇITypeInfo_LocalAddressOfMember_Proxyá´ÖäÈIPPORT_WHOSERVERáØÖäÈ??_7IXMLDocument2@@6B@ëÈIME_CMODE_NATIVEá×äÉWriteProfileSectionâ,×ä ÉCreateFontãL×äÉVP_TV_STANDARD_PAL_Dáx×äÉCRYPT_DECODE_TO_BE_SIGNED_FLAGëÉENCRYPTION_CERTIFICATEã¼×äÊVP_TV_STANDARD_PAL_GáØ×äÊPDERR_INITFAILUREø×äÊPCHANGER_SET_ACCESSâ ØäÊSignalã<Øä$ÊIOleLink_SetSourceDisplayName_Proxyê ÊSetDocStringápØäËWM_IME_KEYDOWNã„ØäËHTRIGHTâ¸Øä)ËIXMLDOMDocument_get_documentElement_StubáØØäËIID_IXMLHttpRequestê ËV_INTÙäÌSUBLANG_SWEDISHâÙäÌLMEM_ZEROINIT8ÙäÌSW_SHOWMAXIMIZEDáXÙäÌPERF_MULTI_COUNTERëÌCMSG_CTRL_DECRYPT_PARAã˜ÙäÍHELP_CONTEXTPOPUP´ÙäÍMM_JOY2BUTTONUPâàÙäÍCERT_STORE_CERTIFICATE_CONTEXTë ÍSQL_BIGINTãÚä ÎiBounceMSecâ(Úä ÎMM_MIM_ERRORáDÚäÎhRestrictedRootâ`ÚäÎURLPOLICY_ALLOWê ÎSetErrorInfoá˜ÚäÏACL_SIZE_INFORMATIONáÀÚäÏERROR_INVALID_WINDOW_HANDLEâàÚäÏVP_TV_STANDARD_PAL_BáüÚäÏWN_FUNCTION_BUSYá(Ûä&ÏSQL_MAXIMUM_CONCURRENT_ACTIVITIESDÛäÏSQL_SSF_CONVERTê Ïmath_x87.hãxÛäÐQueryInterfaceã˜ÛäÐODBC_CONFIG_DRIVERëÐSQL_TABLE_TERMãàÛä Ñ??_Eoverflow_error@std@@UAE@I@ZâüÛäÑGGO_GRAY2_BITMAPáÜäÑEMR_GLSRECORDèÑPP_ENUMALGS_EXãLÜäÒCF_UNICODETEXTãdÜä ÒHIGHCONTRASTá|Üä ÒCTRY_SLOVAKâ ÜäÒLPMCI_OVLY_SAVE_PARMSAãÐÜä$ÒCERT_REGISTRY_STORE_SERIALIZED_FLAGâôÜäÒSQL_API_SQLCLOSECURSORëÒSQLSetCursorNameW ÝäÓ_SIDá8Ýä ÓWIN31_CLASSâlÝä.Ó__IDummyHICONIncluder_INTERFACE_DEFINED__„Ýä ÓAddImplTypeâ´Ýä#ÓITypeInfo2_GetDocumentation2_ProxyëÓLPBINDSTATUSCALLBACKáôÝäÔ__create_if_necessaryèÔRemoveDirectoryWá ÞäÕdw2â<ÞäÕI_RpcWindowProcâhÞä!ÕCRYPT_OID_VERIFY_REVOCATION_FUNCáœÞä'ÕCERT_QUERY_CONTENT_FLAG_SERIALIZED_CTLë*Õ??_7IInternetHostSecurityManager@@6B@ìÞäÖUSER_MARSHAL_FC_LONGáßäÖLPOCNCONNPROCWë ÖLPOFNOTIFYEXá0ßä×dupâHßä×_SW_UNDERFLOWdßä×LPOSVERSIONINFOAé ×_PUBKEYVER3â˜ßäØARW_STARTRIGHTã¼ßäØMCIERR_MUST_USE_SHAREABLEØßäØSEARCH_PRI_NO_SEQôßäØLPPERSISTSTREAMâ$àä%ØIAdviseSink_RemoteOnViewChange_ProxyéØIEnumSTATSTG_Next_ProxyâhàäÙ__stable_partitionãŒàäÙERROR_MEDIA_INCOMPATIBLEá¬àäÙCRYPT_E_ASN1_MEMORYâÀàä ÙPOLYTEXTéÙIXMLElementCollectionøàä ÚMaxCharCountááä Ú_Base áä ÚEMRPOLYDRAWê Ú__IPersistStorage_FWD_DEFINED__âháäÛSYSTEM_AUDIT_ACEáˆáäÛLOAD_DLL_DEBUG_EVENTáœáäÛcbRgnData¸áäÛmidiOutGetNumDevsØáäÛPSH_USEHBMWATERMARKâðáä ÛformatTimeë ÛBINDSTRINGã(âäÜCO_E_ACNOTINITIALIZEDè ÜLCS_sRGBáPâäÝCS_E_LASThâä ÝSM_CXSMICONâ„âäÝHANGUP_COMPLETEêÝIME_ESC_PRIVATE_HOTKEYãÐâäÞCRYPT_E_ATTRIBUTES_MISSINGãìâäÞDM_DEFAULTSOURCEá ãäÞPPRINTER_NOTIFY_INFOéÞGetAllVarCustDataLãäßDNS_ERROR_UNSECURE_PACKEThãäßMB_PRECOMPOSEDëßSQL_API_SQLCOLUMNPRIVILEGESâ¸ãäàRPC_S_TYPE_ALREADY_REGISTEREDèàFUNCFLAG_FHIDDENáèãäáne_revãøãä áISFCNääáGGO_GRAY4_BITMAPá8ääáPFD_NEED_SYSTEM_PALETTEâHääáLunêáIStorage_CopyTo_Proxy€ää âUNALIGNED64â”ää âCC_CHORDá¸ääâGetWindowThreadProcessIdáäää âMCI_ANIM_GETDEVCAPS_MAX_WINDOWSâåä*âCryptDecryptAndVerifyMessageSignatureDåä#âIDataObject_RemoteGetDataHere_StubëâIPipeByte_Push_Stubâ„åäãMK_E_NO_NORMALIZEDëãRPC_IF_AUTOLISTEN¸åä äCTL_FIND_ANYáØåääDISPID_CONSTRUCTORë/äIInternetZoneManager_CreateZoneEnumerator_Stubã(æäåwcsuprãPæäåIMAGE_FILE_AGGRESIVE_WS_TRIMádæä åVK_JUNJAá|æä å_DRAGINFOAëåCERT_RDN_T61_STRINGâ¼æäæOriginalFirstThunkãàæäæNOTIFYICONDATA_V1_SIZEãüæäæPP_ENUMCONTAINERS çäæCRL_REASON_UNSPECIFIEDëætagPSDWâLçä ç__must_existáhçäçset_unexpectedã€çä çOpenEventLogá˜çä çMETA_TEXTOUTá°çä çaPalEntriesâÌçäçrgguidInterfaceséçCLSID_XMLDocumentáèä èMEM_PHYSICALá èäèGCP_NUMERICOVERRIDEâ@èäèSPI_SETLOWPOWERACTIVEXèä èSTUB_MARSHALáxèäèCHANGER_OPEN_IEPORTâ˜èäèDI_MEMORYMAP_WRITEë/èISoftDistExt_AsyncInstallDistributionUnit_Stubãìèä éHCBT_MINMAXâ éäéWAVE_INVALIDFORMATëéMKRREDUCE_ONEèêdwExtendedStyleâléä ëGCPCLASS_LATINNUMERICTERMINATORâœéä$ëszOID_SUPPORTED_APPLICATION_CONTEXTê ëPBIN_RESULTSáÌéä ìSQLUINTEGERâìéäìSQL_OJ_CAPABILITIESêìSQLGetCursorNameAè#í__ISoftDistExt_INTERFACE_DEFINED__ãPêä îLANG_FARSIãtêäîERROR_NO_USER_SESSION_KEYè-îIXMLDOMDocument_put_preserveWhiteSpace_ProxyáÔêäïIMAGE_FILE_BYTES_REVERSED_HIáðêäïmidiInGetDevCapsWëäïIEnumSTATDATA_Next_Stubâ4ëäïBINDF_ASYNCHRONOUSãLëä ïMDMSPKR_OFFêïSQL_SCHEMA_USAGEáŒëäð__uncheck_const_iteratorá ëäðWSAEDQUOT¸ëä ðLOGPIXELSYãÜëäðDISCARDCACHE_SAVEIFDIRTYáìä,ðIXMLDOMDocument_put_preserveWhiteSpace_Stubâ(ìäðtagPSDAêðSQL_TIMESTAMPXìä ñLOGPIXELSXãtìäñDFCS_BUTTONRADIOáŒìä ñDRV_DISABLEâ¤ìä ñMCI_MAKE_MSFéñVarBstrFromR4ÜìäóDNS_ERROR_NO_TCPIPãôìä óWSAEDISCONãíä ófractíä ó_DRAGINFOWëóSERVICE_RUNNINGâ\íäôwaveOutUnprepareHeaderãŒíä$ôMIXERLINE_COMPONENTTYPE_SRC_DIGITALâ íäôFD_CLRãÈíäôPCRYPT_PKCS8_IMPORT_PARAMSãðíäôPFN_CERT_STORE_PROV_READ_CTLáîäôPFULL_PTR_XLAT_TABLESè$ôIXMLDOMNode_put_nodeTypedValue_StubâPîä õothertîäõTHREAD_SET_THREAD_TOKENêõSQL_SUCCEEDED îä öHALF_PTRéöERROR_SECTOR_NOT_FOUNDãäîä÷FEATURESETTING_OUTPUTè÷PublicKeyïä ø_MSLstringã(ïä ølpszDocNameâDïäøWS_EX_CONTEXTHELPXïäøCF_TIFFêøCAL_SABBREVMONTHNAME10ã¤ïäù??_7bad_exception@std@@6B@ãÐïä ùERROR_PATCH_PACKAGE_OPEN_FAILEDâìïäùELF_CULTURE_LATINðäùCAL_SABBREVMONTHNAME11ëùmidiInGetDevCapsAPðäúCAL_SABBREVMONTHNAME12ãlðäúLZERROR_GLOBLOCKá˜ðä!úCERT_STORE_PROV_DELETE_CERT_FUNCéúSQLGetCursorNameWØðäûCAL_SABBREVMONTHNAME13ëûSQL_API_SQLALLOCCONNECTâñä üMB_TOPMOSTã,ñä üLoadBitmapãDñä ü_INC_CDERRãtñä$üMIXERLINE_COMPONENTTYPE_DST_DIGITALâˆñäüpchNextâ¬ñäüCERT_RDN_NUMERIC_STRINGâØñäüPCRYPT_TIME_STAMP_REQUEST_INFOãôñäüPARTITION_XENIX_1òäüPSD_DISABLEPRINTERã<òäüSQL_MAXIMUM_TABLES_IN_SELECTéüSQL_BIND_BY_COLUMNãxòäýEMRREALIZEPALETTE òäýGET_CRL_DIST_POINT_ERR_INDEXáÌòäýIXMLDocument_get_fileSize_StubëýVarBstrFromR8üòä þS_WHITE2048âóä þFOURCC_MEMã0óäþFILE_DEVICE_VDMêþIME_ESC_HANJA_MODEã`óä ÿESRCH„óäÿERROR_USER_MAPPED_FILEãœóä ÿlpOutStringâ¸óäÿDWLP_MSGRESULTãÔóäÿPARTITION_XENIX_2è ÿHUGEPüóå lpReservedãôåERROR_INSTALL_NOTUSED4ôå DT_RASCAMERAáPôåGetKerningPairsAêSPLDS_DESCRIPTIONˆôäSetFileSecurityâ¤ôäEndDeferWindowPos¼ôä CTRY_ICELANDáÔôä _MCIERROR_ãüôäCERT_STORE_PROV_EXTERNAL_FLAGèSQL_CT_COMMIT_PRESERVEã8õä WM_GETHOTKEYá\õäCTRY_DOMINICAN_REPUBLICâxõäCONNECT_RESERVEDá”õäIID_IEnumMonikeréSTREAM_SEEK_CURâÐõäWS_EX_LEFTSCROLLBARâäõäIDCLOSEâöäPCERT_POLICY95_QUALIFIER1èQUERY_IS_SECUREâ<öä ne_cbenttabâtöä+ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDEDãöäPAN_MIDLINE_INDEX¨öäMCI_LOAD_FILEÌöäNdrRpcSsEnableAllocateë!CHANGER_IEPORT_USER_CONTROL_OPENá÷äCreatePenIndirect(÷ä MIM_ERRORèSHGetDiskFreeSpaceãl÷äSECURITY_NT_NON_UNIQUEãŒ÷äOUT_PS_ONLY_PRECISã¤÷ä gmfBlackBoxXáÄ÷äPFNGETPROFILEPATHWãô÷ä%__MIDL_itf_urlmon_0174_v0_0_c_ifspecé%__MIDL_itf_urlmon_0176_v0_0_s_ifspecá<øä gmfBlackBoxYáXøäGetDateFormatAãxøäPERF_DETAIL_EXPERTãøäget_notationsèSQL_SUCCESS_WITH_INFOÈøänFileSizeHighèøäGetVolumeInformationAùäRPC_S_INTERFACE_NOT_EXPORTEDá,ùäMETA_SELECTOBJECT@ùäBS_NOTIFY`ùäConvertDefaultLocaleé"SCardGetCardTypeProviderNameAœùä SM_CXMINá¸ùä szOID_SEE_ALSOë IMalloc_HeapMinimize_Stubðùä _chdriveá úä tinyness_beforeâ4úä _WINDOW_BUFFER_SIZE_RECORDãPúä MCI_ANIM_OPEN_WSáhúä VT_ILLEGALë ODBC_ERROR_REMOVE_DSN_FAILEDá¨úä ERROR_BADKEYáÄúä STRETCH_ORSCANSâðúä __IInternet_INTERFACE_DEFINED__ê tagCASCODEã ûä GCP_JUSTIFYâ4ûä lpConnResPûä UnrecoveredReadsé FirstCleanerSlotAddressâŒûä __unorientedá°ûä IMAGE_REL_MIPS_SECRELHIê SetConsoleCtrlHandlerôûäERROR_DS_GC_NOT_AVAILABLEüäSM_CMOUSEBUTTONSéRpcNsProfileEltInqNextAêPP_SESSION_KEYSIZEãlüä EMR_SETROP2âŒüäPFNGETPROFILEPATHAã¨üäSEE_MASK_UNICODEáàüä,__IInternetProtocolSink_INTERFACE_DEFINED__ê"IME_CHOTKEY_IME_NONIME_TOGGLE ýä TileWindowsâ@ýäLOCALE_IPOSSEPBYSPACE\ýäGetDateFormatWã|ýäMM_MIXM_LINE_CHANGEâýä rgRDNAttrè+ISynchronizeContainer_AddSynchronize_Proxyãøýä$JobObjectBasicAccountingInformationêOleCreateLinkExâ<þäSetProcessShutdownParametersáXþäCDS_FULLSCREENãtþäMCI_HMS_SECONDã”þäGCS_RESULTREADCLAUSEéSQL_NOSCAN_ONÐþäGetProcessPriorityBoostâøþäERROR_DS_RIDMGR_INIT_ERRORãÿä DrawMenuBarâ,ÿäCAL_SMONTHNAME9ê#IInternetProtocolSink_Switch_ProxyãpÿäTAPE_LOADˆÿä CC_ELLIPSESâ¤ÿäWM_HANDHELDLASTêCAL_SMONTHNAME8âÜÿäis_extension_impá$ä=?$__pointer_plus_bit@Unode_base@?$__red_black_tree@$00@std@@áHäWSA_QOS_POLICY_FAILUREãhäTYPE_E_NAMECONFLICTâ„äGetKerningPairsWé MEVT_F_LONGâ¸äSP_PARITY_CHECKâÐäPEMRPOLYGON16ìäWM_IME_SETCONTEXTä FD_SETSIZEã,äCMSG_CTRL_ADD_CMS_SIGNER_INFOènFromPagedäIS_TEXT_UNICODE_CONTROLSáˆäEXCEPTION_FLT_UNDERFLOWâ¤äDM_PANNINGHEIGHTáÀäCAL_SMONTHNAME5âääRpcNsProfileEltInqNextWâüä HP_HMAC_INFOá äCERT_SYSTEM_STORE_INFOã@äIMalloc_GetSize_Proxy`äIID_AsyncIPipeDoubleé??_7ITypeFactory@@6B@œäRPC_E_TOO_LATEã¸ätmPitchAndFamilyáÔäCAL_SMONTHNAME4âä#IInternetProtocol_LockRequest_Stubã,äIID_IEncodingFilterFactoryë&PSD_ENABLEPAGESETUPTEMPLATEHANDLEtäSECTION_MAP_READáŒä MOD_CONTROLâ¨äCAL_SMONTHNAME7êREMSECURITY_ATTRIBUTESãàätear_downðä PVOIDä LANG_PUNJABIá(äSidTypeDeletedAccount@ä SendMessageâTäSetPropâpäCAL_SMONTHNAME6ê__ICodeInstall_FWD_DEFINED__á¬äe32_osãÐäHEAP_GENERATE_EXCEPTIONSáìäGETSETPAPERBINSâä cAccumBitsã(äiFSTextEffectColorBitsãDäCAL_SMONTHNAME1âläRPC_S_INVALID_SECURITY_DESCâ”äCERT_LAST_RESERVED_PROP_IDã´äChangeServiceConfig2éSQL_GD_ANY_COLUMNìätagENHMETAHEADERéSPI_GETSCREENSAVEACTIVEâ0äGetVolumeInformationWDäGetPropâ`äCAL_SMONTHNAME3â„äCMSG_CTRL_DEL_ATTR_CERTâ¬ä"SCardGetCardTypeProviderNameWÈälpstrCardNamesëMDM_V120_ML_NONEáäIMAGE_SCN_CNT_INITIALIZED_DATAã,äSetThreadPriority@äSW_HIDEâ\äCAL_SMONTHNAME2êSQL_DROP_TABLEãœä SECURITY_DYNAMIC_TRACKINGÀä IMAGE_SCN_ALIGN_8BYTESãìä ERROR_DS_ADD_REPLICA_INHIBITEDãä BusTypeSsaë SQL_ISV_COLUMNSâ4ä!mbrlenãPä!UnregisterHotKeyá|ä"!CERT_CHAIN_REVOCATION_CHECK_CHAINè!IMPLTYPEFLAG_FRESTRICTEDá¸ä "__msl_printâØä"__MSL_FIX_ITERATORS__ðä "GetLengthSidâ ä "frame ä"LPMCI_VD_STEP_PARMSâ< ä"PasswordLengthã` ä"RpcNsEntryObjectInqDoneâx ä"LPVIEWOBJECT2è$"URLPOLICY_CHANNEL_SOFTDIST_PROHIBITâÈ ä#PROCESSOR_ALPHA_21064Ü ä #EnumVerbsè#__ITypeLib_INTERFACE_DEFINED__ã$ ä$CONTEXT_S_LASTã8 ä $pAsyncMsgè$SCardAddReaderToGroupt ä%waveInGetDevCapsᤠä#%IXMLDOMNotation_get_systemId_Proxyë%ImmGetCandidateListAáä ä&PFNRECONCILEPROFILEã ä&LPMCI_OPEN_PARMSW ä&CERT_NAME_BLOBë &CoInternetCreateSecurityManagerâh ä'SECURITY_SERVICE_RIDሠä'PIMAGE_SECTION_HEADER  ä 'DDL_HIDDEN㸠ä 'wTechnologyâÜ ä'CryptGetOIDFunctionValueáô ä 'cCertStoreã ä'OLEMISC_WANTSTOMENUMERGEé'PRINTDLGAH ä(operation_typeã` ä (KEY_EXECUTEâ| ä(BITMAPCOREHEADERá ä (SM_DEBUGé(LPDECIMAL¸ ä )SM_CYMINáð ä-)_AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUSá ä )OpenStreamë!)ICreateTypeInfo_SetVersion_ProxyáL ä *_SIZEOF_SHRTé*tagNONCLIENTMETRICSWá„ ä +__file_stateᬠä+IMAGE_FILE_MACHINE_MIPSFPU16áÄ ä +DOWNLOADFACEáØ ä+WS_BORDERð ä+LPWAVEOUTCAPSä+RpcServerUseProtseqIfAë+RPCOLEDATAREPè,KP_CMS_KEY_INFOâ\ä-pop_frontxä-STG_E_READFAULTâ”ä-EMRFLATTENPATHã°ä-bAppReturnCodeë-SaveCompletedìä.SYSER_PRODUCT_CODE_MAINê .unique_groupá ä/CREATE_FORCEDOSâLä/HANDLE_FLAG_PROTECT_FROM_CLOSEãdä /OBJ_REGIONã|ä/szDisplayName¬ä$/ICreateTypeLib_SetHelpContext_Proxyê/IRecordInfo_GetSize_Proxyìä0LPMCI_OPEN_PARMSAáä0NRC_ILLNNä0CryptMsgCloseè0MDM_PROTOCOLID_AUTOâLä1VK_APPSê1PRINTDLGWxä2NPEVENTMSGMSGä 2SetSysColorsá¬ä2RPC_C_AUTHN_WINNTè2CertEnumSystemStoreLocationâää 3tzsetôä3PSIDáä3PAN_STROKE_GRADUAL_TRANâ4ä3CryptMsgUpdateã`ä!3__IErrorInfo_INTERFACE_DEFINED__á|ä3VarBstrFromUintê3ImmGetCandidateListWá¸ä4_MSL_DEBUG_ERRORáØä4EMR_SETSTRETCHBLTMODEìä 4WM_CREATEè"4MIXERCONTROL_CT_UNITS_PERCENT,ä 5LOGBRUSH32ãDä 5PWAVEOUTCAPSátä%5IXMLDOMElement_getAttributeNode_StubáŒä5SQL_DBMS_NAMEè5SQL_API_SQLPROCEDURESÜä#6IMAGE_DIRECTORY_ENTRY_ARCHITECTUREãüä6CS_DELETE_TRANSFORMâä6DMBIN_LARGECAPACITYâ4ä 6WNetOpenEnumáTä6CERT_FIND_EXISTINGë6??_7ICancelMethodCalls@@6B@âœä7PAN_LETT_NORMAL_BOXEDè$7URLACTION_DOWNLOAD_UNSIGNED_ACTIVEXê8GL_LEVEL_INFORMATIONáä9HCOLORSPACE__ ä9OLERENDER_NONEë9SQL_API_SQLSETSCROLLOPTIONSâlä;DOMAIN_USER_RID_KRBTGTã„ä ;DragDetectã ä;HELP_SETCONTENTSé;DCOM_CALL_COMPLETEãää<TAPE_DRIVE_END_OF_DATAë<tagNONCLIENTMETRICSAá$ä=CreateProcessAsUserâ<ä =OLE_S_USEREGá`ä=RpcServerUseProtseqIfWã„ä=RPC_C_INFINITE_TIMEOUTë =Flip2Àä&>@class$7627clientEngine_dbg___pchÜä>EMR_CREATEPALETTEìä>Flip1è>DosDateTimeToVariantTimeá$ä ?fRestoreé?RSA1024BIT_KEYã\ä@fTXContinueOnXofflä@psh7é@lst7á¤ä"A??_Glength_error@std@@UAE@I@Z¼äAPRIMARYLANGIDØäAlpCreateParamsãèäApsh6éAlst6áä BDisableLoadâ0äBtagMDICREATESTRUCTWâ@äBpsh5áPäBlst5ádäBAF_UNSPEC|äBPropertySheetèBSQL_CURSOR_SENSITIVITYã´ä CIteratoráÌä C__find_endãÜäCpsh4áìäClst4áäCMIXER_OBJECTF_HWAVEOUTã0äCRPC_C_STATS_PKTS_OUTéCIForegroundTransferâtäDPMESSAGE_RESOURCE_BLOCKâäDVFFF_ISSHAREDFILE äDpsh3á°äDlst3éDremoveNamedItemâàäE_spawnlpeðä EERRORäErclBoundsäECF_SYLKâ(äEpsh2á8äElst2éEIStorage_SetClass_ProxyâxäFOutputDebugString¨ä%FERROR_DESTROY_OBJECT_OF_OTHER_THREADáÐäFERROR_DS_GOVERNSID_MISSINGãàäFpsh1áðäFlst1á äFszOID_POSTAL_CODE<ä%F__MIDL_itf_urlmon_0175_v0_0_c_ifspecé%F__MIDL_itf_urlmon_0177_v0_0_s_ifspecáäGERROR_DS_GENERIC_ERRORã¨ä GRC_DEVBITSãÈäGIRunningObjectTableâääGget_namespaceURIéGSQL_API_SQLPARAMOPTIONSâ$äHdwProviderOffsetáHäHPMCI_ANIM_UPDATE_PARMSëHFUNCFLAG_FRESTRICTEDáäIERROR_DS_CROSS_NC_DN_RENAMEâ¨ä IWS_EX_LEFTã¼äISIF_POSêIdwAvailableTVStandardáäJIMAGE_SCN_ALIGN_1024BYTESä JwRepeatCountéJszOID_OIWSEC_desCFBâXäK_SECURITY_ATTRIBUTESápä KBLACKONWHITEáŒäKNTM_PS_OPENTYPEâ¤ä KSetMapModeã¼ä KEM_SETRECTNPáØäKLB_INITSTORAGEãôäKMMSYSERR_MOREDATAèKCERT_INFO_VERSION_FLAGã,äLPM_REMOVEDä LGiveFeedbackádäLPIDMSI_STATUS_EDITëLSQL_DROP_TRANSLATIONá°äN_MSL_MALLOC_IS_ALTIVEC_ALIGNEDãÔäNOLE_E_ADVISENOTSUPPORTEDáèäNPT_MOVETOäNLPD_SUPPORT_OPENGLã$äNMWMO_ALERTABLEã4äNpsh9áDäNlst9ádäNPERF_DELTA_COUNTERã„äNPCTL_ANY_SUBJECT_INFOèNPSCARD_READERSTATE_Wá¼ä OstrcasecmpãØäOSetClassLongPtrWáèäOpsh8áøäOlst8áäORPC_C_BIND_TO_ALL_NICSã0ä OhCrlStoreè/OCERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOTã€ä Paemrtextá äPVP_FLAGS_MAX_UNSCALED°ä PnShowÐäPNdrComplexArrayFreeâèä PIEnumStringêPSQL_API_SQLCANCEL$ äQTAPE_LOGICAL_POSITION\ ä-QPAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUSéQEnumPrintProcessorDatatypesâ  äROBJ_COLORSPACEã¼ äROEM_FIXED_FONTë RVK_RCONTROLâè äSlog1plãü ä SES_NUMBERèSFreezeã0!äTtagMDICREATESTRUCTAêTdwRposãd!äUinternal_allocatorã€!äUCB_INITSTORAGEãœ!äUmidiStreamCloseâÀ!äUIEnumSTATSTG_Clone_ProxyéUBINDF_RESERVED_1áô!ä V__GetACharã"äVSTDMETHODCALLTYPE,"äVEMRSETWINDOWORGEXH"äVBINDF_RESERVED_2é$VIPropertyStorage_ReadMultiple_Proxyâ”"äWCryptExportPKCS8á¤"äWNCTPéWBINDF_RESERVED_3áÐ"ä Xerrnoä"äXHICON__â #ä"XMCI_ANIM_GETDEVCAPS_FAST_RATE<#ä$XCMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICEâ\#äXPSCARD_READERSTATE_AéXSQL_CVT_INTERVAL_YEAR_MONTHâ˜#äYlog1pfã´#äYSetClassLongPtrAáÜ#äYFSCTL_REQUEST_OPLOCK_LEVEL_2éYSQL_DB_DISCONNECT $äZTAPE_LOCK($äZ_WIN32_STREAM_IDá<$äZDeleteAceP$äZmmioWritet$äZCERT_RDN_UNIVERSAL_STRING $ä"ZCERT_TRUST_IS_NOT_SIGNATURE_VALIDèZFSCTL_REQUEST_OPLOCK_LEVEL_1áè$ä[GETVECTORBRUSHSIZEä%ä [EMR_MASKBLTâ%ä[EMRSETBRUSHORGEXé[IOleContainerP%ä\FORMATDLGORD31ãp%ä\MMSYSERR_INVALPARAMê\g_rgSCardRawPciâ¤%ä ]min_exponentáÀ%ä]FORMATDLGORD30ãä%ä]CERT_STORE_MANIFOLD_FLAGé ]BINDSTATUS_INSTALLINGCOMPONENTSâ,&ä^GetConsoleTitleâL&ä^X509_MULTI_BYTE_UINTé^CryptRegisterOIDInfoáˆ&ä_IMAGE_FILE_SYSTEM¤&ä_timeBeginPeriodê_CRYPT_SEC_DESCRâä&ä`LPMCI_WAVE_DELETE_PARMSâü&ä`PFN_CMSG_FREEè`SERVICE_QUERY_CONFIGáD'äaSTATUS_FLOAT_DIVIDE_BY_ZEROâl'äaDOMAIN_GROUP_RID_CONTROLLERSá˜'ä"aICreateTypeInfo2_SetCustData_StubèaSQL_LCK_UNLOCKãÐ'äbDragQueryFileWãø'äbIMallocSpy_PreGetSize_Stubã,(ä'bIRpcChannelBuffer3_RegisterAsync_ProxyëbCLSID_CCDPropertyPagep(äcFILE_SYSTEM_NOT_SUPPORTâŒ(äcGetStartupInfoWâœ(äcwCmdá¼(äcWNNC_NET_DOCUSPACEãÐ(ä cCERT_RDNáì(äcpValidationParams)äcPSH_USEPSTARTPAGEèc??_7IXMLAttribute@@6B@ãL)ädERROR_LOCK_VIOLATIONát)ädERROR_INVALID_PRINTER_STATEâ”)ädMK_E_EXCEEDEDDEADLINE¼)ädCryptUnregisterOIDFunctionãä)ädCERT_TRUST_IS_NOT_TIME_NESTEDá*ädRetryRejectedCallèdSQL_CURRENT_QUALIFIER0*ä eerrorL*äeGENERIC_MAPPINGêeFR_ENABLETEMPLATE*ä"fRPC_S_INVALID_NETWORK_OPTIONS¬*äftagDRAWTEXTPARAMSÈ*äfPropSheet_Changedð*äfIXMLElement_removeChild_ProxyèfSQL_DIAG_NUMBERâ@+ä)gJobObjectBasicAndIoAccountingInformationá\+ägGetClassLongPtrWát+ä gLPPROTOENTë gBegin_OnSaveá¤+ä hTT_PRIM_LINEá¼+ähSM_CXMAXTRACKÔ+ä hMB_OKCANCELâì+ä hXTYP_ADVREQâ,ähMCI_WAVE_STATUS_AVGBYTESPERSECã4,ähPSESSION_BUFFERâL,ä hIID_IUrlMonâp,ähITypeInfo_Invoke_ProxyãŒ,ähSQL_AM_CONNECTIONèhSQL_TXN_REPEATABLE_READâÄ,äifilebufâä,äiPlayEnhMetaFileRecordü,äiCryptSignHash-ä iIWinInetInfoéiSQL_ISV_SCHEMATAáD-äjDrawTextWp-ä jszOID_PKCS_7_SIGNEDANDENVELOPEDâˆ-äjPSN_SETACTIVE¬-äjIInternetSecurityManageráÌ-äjPROTOCOLFILTERDATAëjSQL_OPT_TRACE.äkDNS_ERROR_RCODE_NOTAUTHâ .ä kCSPLATFORMã@.äkISynchronizeHandleëkIEnumString_Next_Stubx.ä lDC_MAXEXTENTáœ.älERROR_DS_NOT_AN_OBJECTãÄ.älSCARD_E_READER_UNAVAILABLEëlSHQueryRecycleBinWã/äm__pointer2iteratorã/ä mSET_SPREADãP/ä'mCERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAGëmCERT_QUERY_CONTENT_FLAG_CRLâ˜/änPTAPE_GET_POSITIONã°/änlpBaseOfImageÈ/ä nWNetGetUserAáà/ä nauxGetVolumeénIID_IXMLDOMAttributeá 0äoDUPLICATE_SAME_ACCESS80ä oXST_REQSENTâP0ä oNRC_DUPENVãp0äoSHEmptyRecycleBinWãœ0ä!oCryptEnumKeyIdentifierPropertiesáÈ0ä oIRpcChannelBuffer3_Cancel_ProxyêoChangeServiceConfigAâ1äpLOG_ONEPX_MAX(1äpERROR_NO_SUPPORTING_DRIVESëpRegQueryValueh1äqERROR_NO_MORE_SEARCH_HANDLESá„1äqGetClassLongPtrAáœ1ä qVT_BSTR_BLOBé qtagCADBLáÐ1ärTIME_ZONE_ID_STANDARDà1ä rfTximü1ärSW_SHOWDEFAULTërRPC_NCA_FLAGS_DEFAULTèsERROR_NOT_CONNECTEDâP2ät__writeâl2ätDragQueryFileAëtCRL_REASON_KEY_COMPROMISE¤2äuGroupsãÌ2äuABOVE_NORMAL_PRIORITY_CLASSâè2äuGetStartupInfoAâ3äuVS_FF_PRERELEASEá3ä uRegDeleteKeyá43ä uLPCCHOOKPROCáX3äuNotifyBootConfigStatusëuSQL_MAX_CONCURRENT_ACTIVITIESèvFADF_RESERVED¬3äwnewcapãØ3äwERROR_DS_BACKLINK_WITHOUT_LINKãð3ä wFW_ULTRABOLDá 4äwKP_PRECOMP_SHAëwPFN_CERT_STORE_PROV_FIND_CRLáH4ä xtest_bitál4äxEVENTLOG_AUDIT_FAILUREã4äxSEC_E_NO_IMPERSONATIONã¨4ä xWNetGetUserWáÀ4ä xPRPC_POLICYê#xCMSG_CTRL_VERIFY_SIGNATURE_EX_PARAä5ä ystdin,5äyERROR_DS_CANT_FIND_EXPECTED_NCãD5ä yWM_GETICONã`5äySM_CYSMCAPTIONãx5äyFKF_INDICATOR˜5äySHEmptyRecycleBinAãÀ5äyIPropertyBag_RemoteRead_StubáØ5äydwResetPeriodèyChangeServiceConfigWá6ä z_MSL_CSTDARGá(6äzdwControlTypeH6äzSHQueryRecycleBinAë zODBC_VS_ARGSáx6ä {SidTypeGroupá”6ä{TAPE_WRITE_MARKSá¬6ä {GlobalFreeãÜ6ä#{ERROR_CLUSTER_LOCAL_NODE_NOT_FOUNDãô6ä {IPPORT_TFTPê{FUNCFLAG_FSOURCEá(7ä |WM_SETICONã<7ä|DrawTextAP7ä |C1_PUNCTé!|CMSG_SIGNER_HASH_ALGORITHM_PARAMá˜7ä}_MSL_USING_MSL_Cá¼7ä}SCHED_S_TASK_TERMINATEDâØ7ä}WGL_FONT_POLYGONSè%}IOleInPlaceFrame_SetStatusText_Proxyá$8ä~DMLERR_DLL_USAGEá88ä~ip_mreqê~SQL_SQL92_DATETIME_FUNCTIONSá|8äTPM_VCENTERALIGNá”8ä hCertStoreã°8äFILE_DEVICE_NULLáÌ8äIOCTL_DISK_VERIFYèOFN_ENABLEHOOKä9ä€_loc_num_cmptè €caContrastã89äOtherTransferCountã`9ä"DNS_ERROR_RESPONSE_CODES_BASEx9ä MF_BYCOMMANDá”9äPMCI_LOAD_PARMSâ¬9ä WIZ_BODYCXë#IXMLElement2_removeAttribute_Proxyä:ä‚PF_PPC_MOVEMEM_64BIT_OKâ:ä ‚RC_DI_BITMAPé‚LPMCI_ANIM_WINDOW_PARMSWá\:äƒRemoveFontResourceãt:ä ƒMMIOM_OPENã”:äƒRPC_CLIENT_INTERFACEá°:äƒPSP_DLGINDIRECTâØ:äƒIStorage_SetStateBits_ProxyêƒSQL_DIAG_CREATE_COLLATION$;ä„ERROR_DS_SRC_GUID_MISMATCHãD;ä„PWR_SUSPENDREQUESTãX;ä „UserInfoát;ä„PREASSIGN_BLOCKSé%„IPersistStorage_HandsOffStorage_Stubá´;ä…HSTRáÌ;ä…GetVersionExAì;ä…small_from_ndr_tempê…ITypeInfo_CreateInstance_Proxyã,<ä†copysignfX<ä&†ERROR_CANNOT_DETECT_PROCESS_ABORTp<ä†SW_INVALIDATE <ä%†__MIDL_itf_urlmon_0174_v0_0_s_ifspecé%†__MIDL_itf_urlmon_0176_v0_0_c_ifspecáä<ä‡pvalueWâü<ä ‡dwOpenFlagsâ=ä‡CFSTR_MIME_BASICAUDIOH=ä ‡IHttpNegotiate_OnResponse_Proxyê‡SQLConfigDataSourceWá„=äˆconst_mem_fun_tâœ=ä ˆPEMRSAVEDCã¼=äˆMCI_WAVE_DELETE_PARMSÜ=äˆCoRegisterSurrogateâ>äˆ_LPINTERNETZONEMANAGER_DEFINEDëˆSQLDataSourcesAâ<>ä ‰ACCESS_MASKâ\>ä‰MK_E_CONNECTMANUALLYáp>ä‰VOS_DOSâ”>ä‰PRINTER_STATUS_WAITINGë‰SQL_FN_TD_MONTHâÌ>äŠIsBadHugeReadPtráä>ä ŠDrawStateAã?äŠLPSCARD_READERSTATEAé ŠlpstrRdrá> CERT_ALT_NAME_ENTRY_ERR_INDEX_SHIFT) & CERT_ALT_NAME_ENTRY_ERR_INDEX_MASK)"2ß.16.840.1.101.2.1.1.21"10x8000_HRESULT_TYPEDEF_(0x80010129L)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_DATA ( MDM_X75_DATA_128K ) )"2.5.4.15"0x002_HRESULT_TYPEDEF_(0x80090018L)1781L512(CERT_COMPßARE_MD5_HASH << CERT_COMPARE_SHIFT)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_PIAFS, MDM_PIAFS_OUTGOING )1913L60x00000010(MCIERR_BASE + 34)0x00030000438L((DWORD)0x00000100)20UL0x00000080CALINFO_ENUMPROCEXA3740x0010ß10x21F0x170x01000000L_HRESULT_TYPEDEF_(0x8011042EL)((LPCSTR) 12)(MMIOERR_BASE + 8)0x000F_HRESULT_TYPEDEF_(0x00040180L)((DWORD)0x00000000)71222(TEXT("image/tiff"))0x20000x00000008132SCARD_ATTR_VALUE(SCARD_CLAßSS_IFD_PROTOCOL, 0x0209)(MIDIERR_BASE + 2)0x00000002L130x00540x00000008L( PARAMFLAG_NONE )((LPCSTR) 25)010891152670x00020x00000002(MIDIERR_BASE + 6)_HRESULT_TYPEDEF_(0x80028019L)((DWORD)0x0004)0xffU0x003ß70xffffU0x00020x00000010L5071LSQL_CP_STRICT_MATCHIInternet0x0002BN_DOUBLECLICKED0x0000CharPrevA(BF_BOTTOM | BF_RIGHT)0x00000002L0x1F0xffffffffUIInternetProtocolInfo0x00040000L6(1)_MSL_THREADSAFE_HRESULT_TßYPEDEF_(0x00041302L)9603L5056L0x00F000000x000000020x21210L0x0000000830x0003f0000x00000000L535L"1.3.14.3.2.11"0x00000200101100L((DWORD)0x00000020)220x000000082008_HRESULT_TYPEDEF_(0x800300F0L)29L43COßLOR_BTNHIGHLIGHT(0x00000008L)0x5RPC_X_WRONG_PIPE_ORDER0x0013GetSiteDirectoryA0x00140x080x000000040x0000001F(2<<4)8401L1020L0x00150x00000080L0x00000003L660x01175064L0x00004004L0x00000001ConfigurePortA(WMß_USER + 104)8_HRESULT_TYPEDEF_(0x80091003L)641789L0x130x11024CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)18_HRESULT_TYPEDEF_(0x80004012L)0x496550x000000040x3B6(BßDR_RAISEDOUTER | BDR_RAISEDINNER)V_UNION(, pcVal)0xff00000064420x00040000LCryptVerifySignatureA0x001400000x10x000000068234L((DWORD )0x00000102L)0x21"1.3.6.1.5.5.7.48.1"3CharToOemBuffA0L((LONG)0x80000002)0ßx000877_HRESULT_TYPEDEF_(0x800B0108L)FatalAppExitA40x00D00x0001(0x0020)0x00070x01000x031_HRESULT_TYPEDEF_(0x800C0200L)0x00020139L0x000000080x000000020x00040000L13(READ_CONTROL)0x01009553L_HRESULT_TYPEDßEF_(0x80004001L)0x800000100x2005120x00000001480x0004E000L0ReadEventLogA0x616sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W0x00100x00020000L(MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)0x000000020x000000000x00000002L_HRESULßT_TYPEDEF_(0x8011042AL)ERROR_SUCCESS0x000000800x000000402_HRESULT_TYPEDEF_(0x8000400FL)1150x08060x00001000GetDiskFreeSpaceExA0x00000004(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF)SQL_BIND_TYPE0xFFFF000096ß7180x000000120x00000080midiInGetDevCapsA1058L10x04000000L0x00000001L0x000000010x00D129707L"3"_HRESULT_TYPEDEF_(0x80030105L)0x03250x0000040013690x0(0)15505046L1917LTEXT("bytesPerMinute")0x0000F000_HßRESULT_TYPEDEF_(0x80040161L)1605L7_HRESULT_TYPEDEF_(0x800401A1L)_HRESULT_TYPEDEF_(0x8009001DL)0x00000080L50x000016050x000000250x08008315L50x000000200x0010L(0x02000000L)(-32)4_HRESULT_TYPEDEF_(0x8011042DL)_HßRESULT_TYPEDEF_(0x8010006AL)33(3*4)0x00000007((BYTE )0x01)0x00000040CreatePropertySheetPageA"1.3.14.3.2.14"MAKEINTRESOURCE(6)(0x1)20x10000x0013-2( 0xbfffffff )0x00B90x010x0800CallNextHookEx(*, , , )àß3(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)710x00000400L460x70000000L0x00000002(0x00000002L)__stdcallV_UNION(, pscode)"1.3.6.1.4.1.311.ß10.3.2"0x000000540x00080x00200000L9661L0x00000080_HRESULT_TYPEDEF_(0x80096019L)0x00000400SCardForgetCardTypeA0x00000009L1423L((WORD)((DWORD_PTR)() & 0xffff))_HRESULT_TYPEDEF_(0x8011044AL)0x0e40x40x0002500ß3L0xFFFF00000xF0000000LChangeDisplaySettingsA1(~LLONG_MAX)71000x000000FF1428241L0x02V_UNION(, piVal)1437L0x00110x00200000L0x00000040l0x0004910004L0x00000008((*(((UWORD*) ()) + (() >> 4)) & (1 << (ß() & 0x000F)) ) ? SQL_TRUE : SQL_FALSE )83100130x00004000L"2"CreateColorSpaceA0x00000004460UL1361LFILE_CASE_SENSITIVE_SEARCH0x00000008L1( 0x400 )}0x30x000100000x00000002L(STANDARD_RIGHTS_REQUIRED | PRINTßER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE)284L0x00000200x00050x08000000_HRESULT_TYPEDEF_(0x000401C0L)8446L0x00008000GetFileTitleA0x00EA1623L0x000000100x00081716L0x00000200L0x001061141L0x00002000(unsigned ßlong)0X00000010L0x000002000x200000000x00028260L1620L1UL0x00800x60000000L7SEC_IMAGE(-1L)0x00008000VarR8FromI450x230x820000000x050x0001_HRESULT_TYPEDEF_(0x80092011L)0x00000002L_HRESULT_TYPEDEF_(0x80100015Lß)0x000000140x0200((BYTE)(((WORD)()) >> 8))0x00000300L0x00140x00020x2000L0x000B0x00000000L0x04_HRESULT_TYPEDEF_(0x8009300DL)0x00FF0000((LPCSTR) 15)0x0800mciGetDeviceIDFromElementIDA65536(u_int)(~SO_LINGER)ßDRV_RESERVEDTEXT("printNumberUp")5158"2.5.8"1L0x80x00C60xF0300x01SQLSetPos(,,SQL_POSITION,)199(MCIERR_BASE + 21)0x100B20x09SQL_IGNORE81MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOßL_DATA ( MDM_V110_SPEED_38DOT4K ) )0x04A00x0000001((HALF_PTR)(MAXUHALF_PTR >> 1))80x0010(WM_USER + 135)0x000008000x00100000L(-1)10x00000040L"%"0x00000020L0x000000200x1003-1CreateScalableFontResourceA0x00000ß0806DECLSPEC_IMPORT0x000000800x00000002L121SQL_ODBC_CURSORS0x5B186SQL_PARAM_INPUT_OUTPUT0xF4CTL_CODE(FILE_DEVICE_SERENUM,129,METHOD_BUFFERED,FILE_ANY_ACCESS)11024LRegOpenKeyExA12754_HRESULT_TYPEDEF_(0x80110ß600L)V_UNION(, plVal)38431L0x0012(((()<tv_sec || ()->tv_usßec)0x000000020x0000100010x000810x0004(DWORD)0x005500090x0002((WCHAR)0)"1.2.840.113549.1.9.8"4306LMM_TEXT0x0100(27)3080x00010000L100000x00010x80000000x01000x0c0x00000002L0x00080x00000x93FIELD_OFFSET(ßREPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)(MCIERR_BASE + 39)SQL_BIND_BY_COLUMN( (() << 16) | (() << 14) | (() << 2) | () )0x20001620x01A2L"Flags"((DWORD)0x0008)(-1)V_UNION(, boolVal)(TEXT("audio/x-aßiff"))0x0000000021344L748555L127L65200x0001((HRESULT) (((unsigned long)()<<31) | ((unsigned long)()<<16) | ((unsigned long)())) )0x00000010L0x800000001767L1641L0xFFFF0000SECTION_ALL_ACCESS8L0x01c2VarßUI2FromI428444SM_CXFRAMEExtTextOutAOpenMutexAMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_CHAP, MDM_HDLCPPP_ML_2 ) )0x000000020x2100x00001000Làß_HRESULT_TYPEDEF_(0x8009300EL)0x0000020011026L__int64SM_CYFRAME20x100x43160x000000020x018E(-2L)0x00080x0280x00400x015b0x00000008L10330x00000010214L8476LShellExecuteA0x000200000x0008(-34)(STANDARD_ßRIGHTS_REQUIRED | SYNCHRONIZE | 0x1F )0x00000080L688335LVarUI1FromI4_HRESULT_TYPEDEF_(0x800B0007L)0x00004000L0xF0200x0000000FL77001742L40x00000002LSQL_TXN_REPEATABLE_READ2_HRESULT_TYPEDEF_(0x80010133L)CRYPT_ßFORMAT_RDN_SEMICOLON0x00000003_HRESULT_TYPEDEF_(0x8009001FL)1122L1203LERROR_INVALID_PARAMETER30x0800L(fpclassify() == FP_INFINITE)0x000000010x00000001(4 << 13)0x000C(0x0001)0x00ff0000(MMIOERR_BASE + 11)0x00ß00000040x000000010x108505L} __except () {SQL_MAX_COLUMNS_IN_ORDER_BY0x11MAKEINTRESOURCE(32512)0x00000004L0x00000000L0xA(0x0000000CL)1VarUI4FromI40x018420x281048551L((WORD)0x1000)106SCardGetProviderIdAß0x00000001_HRESULT_TYPEDEF_(0x80004015L)255LCALINFO_ENUMPROCA0x022961020x02131811005L0x00070x020x36(MIDIERR_BASE + 7)0x01001918L0x000000000x00001000LRegCreateKeyExA50x00030x010831888412L0x245IO_REßPARSE_TAG_RESERVED_ONE0x00000001( 475 )0x80000x07(1 << CERT_STORE_CTL_CONTEXT)"2.16.840.1.101.2.1.1.18"0x000000010x00004004L0x0009L40971421L1233L0x000001000x002000000x113__fastcall12SetEnvironmentVariableAàß263216_WAIT_GRANDCHILD118((BYTE)((DWORD_PTR)() >> 8))0x0002_HRESULT_TYPEDEF_(0x8004020BL)SQL_QL_START(&g_rgSCardRawPci)36(WM_DDE_FIRST+7)(0x000001F4L)0x0000000165534UIntToPtr()8472L8( 1 )0x00000200SßM_CXDLGFRAMESQL_CHAR152L2121"2.5.4.14"3193L(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER | PERF_DISPLAY_PERCENT)_HRESULT_TYPEDEF_(0x80110446L)ß40x000000010x00000007L0x0A0x1VkKeyScanExA(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_SANDF)1060x0003(HWND)SNDMSG(, PSM_GETTABCONTROL, 0, 0)SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0007)0x000000000x00000020_HRßESULT_TYPEDEF_(0x800B0001L)60(7 << 13)0x000000000x081500LPeekConsoleInputA0x0008520x000048461L0xFB126L(0x00000220L)0x010000000x70000x00000010L0x00400000L111018L8403L0x1000((DWORD)0x00000002)10_MSL_CDßECL0x00001C0001408L162(SQL_BIGINT+SQL_UNSIGNED_OFFSET)0xF0000000(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_SEAL)0x00030x0d0x08000x00000001380_HRESULT_TYPEDEF_(0x800401C6L)( PARAMFLAG_FRETVAL )2104(MCIERßR_BASE + 67)1313L0x001010051L"1.3.6.1.5.5.7.3.4"0x00040000L010110L1612057L0x040ULCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)(-24)_HRESULT_TYPEDEF_(0x8009700BL)159L(0x00010000L)(ßWM_USER + 117)"SchemeDllRetrieveEncodedObject"0x08000x000000100x00010x000000040x00406"UrlDllGetObjectUrl""1.2.840.113549.1.7.1"0x000000100x00400x80x00001000L1229L10x0002(int)SNDMSG(, CDM_GETSPEC, (WPARAM)ß, (LPARAM)(LPSTR))AF_CCITT0x04000000211034(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)0x000000085002L0x00040000Lß23L((LPWSTR)-1)S_un.S_un_b.s_b4_HRESULT_TYPEDEF_(0x80040207L)(CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)60x00000004L0x000000020x01740x000020001923L0x00000008L0x00001Cff30x0010(int)ßSNDMSG(, CDM_GETSPEC, (WPARAM), (LPARAM)(LPWSTR))2300x00040100L0x00029002L_HRESULT_TYPEDEF_(0x80040140L)0x00000002191737LSetCurrentDirectoryA0x2000(0x5)_MSL_WCHAR_MINChangeMenuA36MAKEINTRESOURCE(8)81ß7L_abnormal_termination66((DWORD )0x00000080L)0x0020628547L0x00001000CRYPT_SIGN_ALG_OID_GROUP_ID0x00000013LWSANO_DATA0x002011409949(MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1)_HRESULT_TYPEDEF_(0x8010000EL)CTßL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)0x00010000L0x0000001510044L3010L308459L0x40x00030x0304_HRESULT_TYPEDEF_(0x00040102L){0,0,0,0,0,1}TEXT("priority")2SHFileOperationA0x00020000(1ß << VT_DECIMAL)DrawTextA30x00200000(0)0x02FF67044L4391L1MAKEINTRESOURCE(32516)1704L230x000000010x0009( 1 )0x10000001(( >> CERT_UNICODE_RDN_ERR_INDEX_SHIFT) & CERT_UNICODE_RDN_ERR_INDEX_MASK)(MIXERLINE_COMßPONENTTYPE_SRC_FIRST + 4)100x00001A02UUID0x4944520x1000SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT0x00010000L0x007D0x00000040L67IsCharAlphaA0x14((() & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHßFT))0x00000080L0x0e0x0004(WM_USER + 130)0x00000040_HRESULT_TYPEDEF_(0x8009001BL)GetSystemDirectoryA0x000900x000000020x010056(-1)13410x0004RegisterWindowMessageA18322L24780x0008V_UNION(, pcyVal)(MIXßERCONTROL_CONTROLTYPE_BOOLEAN + 3)700x010611375L_HRESULT_TYPEDEF_(0x80020012L)0x02MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_28DOT8K ) )0x00004000L(0x0010)MDM_GEN_PROTOCßOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_56K, MDM_V120_ML_NONE ) )URLDownloadToFileA1005140x7fffffffL0x7((LPCSTR) 42)0x00000001(MIXERCONTROL_CONTROLTYPE_FADER + 3)10MDM_SHIFT_PROTOCOßLID8240L"2.16.840.1.101.2.1.1.6"22_HRESULT_TYPEDEF_(0x800C0010L){ *() = *(*(char __RPC_FAR * __RPC_FAR *)&()->Buffer)++; }0x00010000LOLESTR("URL Context")40x80000000SYSER_VARIANT_PRONO_ERRORSQL_WLONGVARCHAR(ßint)SNDMSG(, CDM_GETFOLDERPATH, (WPARAM), (LPARAM)(LPWSTR))"2.5.4.31"0x0010_HRESULT_TYPEDEF_(0x80100065L)8365L0x010x0000080000x0000000460x80000x000000041368L0x08530x00001A030x00080x08000000L10CERT_RDNß_ENABLE_T61_UNICODE_FLAG7(int)SNDMSG(, CDM_GETFOLDERPATH, (WPARAM), (LPARAM)(LPSTR))sz_CERT_STORE_PROV_SYSTEM_W0x00010x14335LCryptEnumProviderTypesA0x00000004L_IOW('f', 125, u_long)VerifyVersionInfoA0x000800ß000x20000x000000110x020x0001MS_SCARD_PROV_AWS_OVERLAPPEDWINDOW6VarUI4FromI4(STANDARD_RIGHTS_READ | JOB_ACCESS_ADMINISTER)0x00800000L0x02030x00000008_HRESULT_TYPEDEF_(0x80110404L)0x0002SQLUINTEGER1(PERF_SIZE_ßLARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT )0x0000000C0x00000010_HRESULT_TYPEDEF_(0x8010006CL)0x810x00100x00020000L0x00200000L0x0380x00001000ßLcharTEXT("RestartJobOnPoolEnabled")PROPSHEETPAGEA128L(SHORT)-1RegSetValueExA0x00000000L0x00000002RemoveDirectoryA(100 + SQL_CODE_MONTH)_HRESULT_TYPEDEF_(0x80090025L)1759L0x00010000L( & CERT_UNICODE_VALUE_ERRß_INDEX_MASK)70x0800I_RpcBindingInqDynamicEndpointA0(MAKEINTATOM(0x8002))0x724000x00001000L0x0014((BYTE )0x03)0x180x00001003((DWORD )0x80010001L)= 00x000002000x00000016(MIXERLINE_COMPONENTTYPE_DST_FIRST + 0)ß118377L018(TEXT("audio/x-pn-realaudio"))SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, 0x0150)0x00040LSCardListReaderGroupsA38((LPCSTR) 26)0x000000010x00000001L(100 + SQL_CODE_HOUR)10(1U << 4)SCardListReadersA0x00ß00000f7WNetGetUniversalNameA973sizeof(HISTOGRAM_BUCKET)1714L(STANDARD_RIGHTS_WRITE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT)SCARD_CTL_CODE( 4)0x000000080x000000020x0240x100000001_HßRESULT_TYPEDEF_(0x80010109L)0x800400000x04(MIXERCONTROL_CT_CLASS_SLIDER | MIXERCONTROL_CT_UNITS_SIGNED)0x00000001SQL_QUALIFIER_NAME_SEPARATORGetICMProfileA5069L5019L131460L30x2_HRESULT_TYPEDEF_(0x80100025L)0x00ß1210x04780xE31390L0x00002000L0x047799((DWORD)0x0010)(WM_USER+2)0x030D41000x012170x00100000L510x0400L0x00000400L0x50TEXT("DsDriver")0x04703510x04720x04711117L0x110x0474WS_MINIMIZE(MCIERR_BASE + 4ß3)0x04730x0005RpcNsGroupMbrInqBeginA0x0476200x0200(-1)50x047511291252L30x0000004020xffffffff100LOCALE_ENUMPROCA10063L0x0008L5008L0x0000000200x000000040x008064142L(0x00000003L)CERT_STORE_PROV_PHYSßICAL_W0x00000200_HRESULT_TYPEDEF_(0x80094007L)5067L0x1160x00000020L524005L650x00040140L0x00000200L0x000000010x0000001E0x000000041(SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVEßR)0x0001WNetGetResourceParentASWP_FRAMECHANGED72011785L1740L0x00200000L0x000000010x00004001L60x10x000000080x9OPENCARDNAME_EXA3const20x00004000L8432L49852LIsEqualGUID(, )EnumPortsA0x00000400( ß& (15 << 9))0x0003SIZE_RESTORED0x000A23NO_ERROR1490x000080001384L0x00800000_HRESULT_TYPEDEF_(0x80004002L)0x0000000D0x110x002000000x0080CreateDialogA8493L7035L0x010x000004000x20x0040MAXCHAR5(PERF_SIZßE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_NOSHOW)0x0204GetStartupInfoA0x078362L(* (long double *) __extended_min)50x00100000LCMSG_ENVELOPED_RECIPIENT_V40x3CC(STANDARD_RIGHTS_WRITE | PRINTERß_ACCESS_USE)0x000000011040x01001346L720x000002001_HRESULT_TYPEDEF_(0x80093015L)TEXT("printAttributes")0x001B10022L(((()<Internal != STATUS_PENDING)SQL_TXN_READ_UNCOMMITTEDEnumPrintersA0x0040L_HRESULT_TYPEDEF_(0x00041300L)0x001000003_HRESULT_TYPEDEF_(0x80040203L)100x01000x00E90x018B0x020x0ß0x00000002(0x00000010L)0x40000x000004000x00000008L1620x00000200(0x0010)EnumPrintProcessorsA0x0001000028011L((DWORD )0x00000000L)10x0_HRESULT_TYPEDEF_(0x800C000CL)0xB17LZOpenFileA((BYTE)(()>> 8))0x4000ß0x3724L4__TEXT()_HRESULT_TYPEDEF_(0x8009200FL)_HRESULT_TYPEDEF_(0x8001012BL)0((LPCSTR) 2)"CryptMsgDllImportMailList"0x001500000x00000002372BINDF_NOWRITECACHE8546L0x0001((void *)0xFFFFF00D)(1U << 1)0x000000ß04L0x400245073L0x0000000490x000000800x04CreateDialogParamW(, , , , 0L)TEXT("SeSystemtimePrivilege")0x01900x00020000(0x00000206L)0x00000400LTEXT("printPagesPerMinute")DialogBoxIndirectParamW(, , ,ß , 0L)3008L0x02HIBYTE(LOWORD( () ))"Microsoft DH SChannel Cryptographic Provider"_HRESULT_TYPEDEF_(0x8010006EL)1754LSTATUS_DATATYPE_MISALIGNMENT0x000100001236L0x00000040(* (long double *) __extended_max)135Lß55LL"commdlg_SetRGBColor"SCARD_CTL_CODE( 6)"2.5.4.10"(STANDARD_RIGHTS_READ | SERVER_ACCESS_ENUMERATE)9713L7056L11031LL"Microsoft DH SChannel Cryptographic Provider"30x3C3DialogBoxIndirectParamA(, , , , 0L)àß_HRESULT_TYPEDEF_(0x80090016L)TEXT("shortServerName")(MCIERR_BASE + 53)CreateDialogParamA(, , , , 0L)(DWORD)0x00C000CA22"03.52"0x00020x00100x04_HRESULT_TYPEDEF_(0x80110447L)2UL201159"commdlg_SetRGBColoßr"0x23_HRESULT_TYPEDEF_(0x80010135L)0x00000400L0x00020x00000100L((LPCSTR) 33)0x0000001D0x8000000050x34821SQL_DATE(-1)8004L(0x0002)0x00000010_HRESULT_TYPEDEF_(0x80093100L)_HRESULT_TYPEDEF_(0x800401D3L)291àß0x001D10x000A915(1 << CERT_STORE_CERTIFICATE_CONTEXT)8(-4)0SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0302)145089L(0x00000002L)0x00021226LAF_IMPLINK0x08070x00000020LookupAccountNameA01140(-2)SQL_COLUMNß_LABELSQLUSMALLINT0x00x000000020x00011773LTEXT("EventLog")((LPCSTR) 18)0x000F(unsigned long)0X0000000FL118"2.5.29.37"0x00020000L68514L1256'+'_HRESULT_TYPEDEF_(0x00041303L)_HRESULT_TYPEDEF_(0x8001010CL)4ß"CryptDllExportPublicKeyInfoEx"(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)((DWORD)0x0040)0x4a0x00000200628389LTHREAD_BASE_PRIORITY_IDLE0x800x0SQL_COLUMN_OWNER_NAME1ULERROR_EXTENDED_ERROR066(CONTEXT_i386 |ß 0x00000010L)0x018FAF_ISO0x00000000L0x00D50x040x031((BYTE)())0x00000004L8473LQueryDosDeviceACERT_FIND_PROP_ONLY_ENHKEY_USAGE_FLAG(() & 0xFFFF)1750LAddPrintProcessorA0x0022SNDMSG(, PSM_INSERTPAGE, (WPARßAM)(), (LPARAM)())0x002B_HRESULT_TYPEDEF_(0x800F0216L)11L0x0142017LDV_E_FORMATETC1002040x00000040L100x011418L9CertGetNameStringA0x40034329L_HRESULT_TYPEDEF_(0x800B0109L)LPIINTERNETPRIORITY"1.3.6.1.4.1ß.311.2.1.14"0x00000004near3(( & IMAGE_ORDINAL_FLAG32) != 0)13110170x00100x00000400CMSG_ENVELOPED_RECIPIENT_V333CTL_CODE(IOCTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS)GMEM_NOT_BANKED0x20b0x000ß8144L(-26)_HRESULT_TYPEDEF_(0x8001011FL)0x8000( 0x52746457 )201TYPE_ALIGNMENT( DWORD )0x0001_HRESULT_TYPEDEF_(0x8000401AL)0x00000010L"7"0x0040L1709L00x01000x0003((LPCSTR) 6)231323L50x800000008500L0x0ß0000001L0x100000x400137CoInternetParseUrl10x80000000_HRESULT_TYPEDEF_(0x80030110L)4CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)5GetEnhMetaFileA(0x40000000L)1UL0x000000013GetPrivatePßrofileStructASQL_COLUMN_LABEL15260x0800686118L4(MMIOERR_BASE + 1)1362L0x2000(WM_USER )6"ContextDllCreateObjectContext"0x000000010x040x000100000x2020U0x00000010L1079(0x0000)432CTL_CODE(IOCTL_STORAGE_ßBASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)0x10x000C1611L0x000000031UUID_VECTOR4161"1.3.6.1.5.5.7.2.1"0x00000000L0x02(0x00000002L)0x00010000((BYTE)(((WORD)()) >> 8))0xFFFF8009L0x04000000(ULONGLONG)((UßLONGLONG)(DWORD)() * (DWORD)())00x000D1L"SystemStoreLocation""1.3.6.1.4.1.311.10.3.8"8247L(* (float *) __float_max)(-8)0x0410x0170PostThreadMessageA((DWORD), , , )8305L(-2)0x00000040L100020x00040ß000L8221L3003L8455L = 0x10000000UL11006L0x00200xF150(DWORD)0x00F000210x0171(MCIERR_BASE + 5)0xBFCTL_CODE(FILE_DEVICE_SMARTCARD, (), METHOD_BUFFERED, FILE_ANY_ACCESS)0xC00x0001_HRESULT_TYPEDEF_(0x8009302ßDL)53112RpcNsGroupDeleteA0x720xBA(CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER )"1.3.6.1.4.1.311.10.3.3.1"0xDD1L00x00040xDESNDMSG(, PSM_SETFINISHTEXT, 0, (LPARAM))0xDB( 0 )320xDC12ß12L0x0040215L0x000000020xDF(0x40000000L)(WM_USER + 109)1004LPostThreadMessageW((DWORD), , , )0x00000100TEXT("printCollate")((DWORD)0x00000002)0x000295L14(( >> CERT_UNICODE_ATTR_ERR_INDEX_SHIFT) & CEßRT_UNICODE_ATTR_ERR_INDEX_MASK)0x00080000L0x23_HRESULT_TYPEDEF_(0x80094800L)12_HRESULT_TYPEDEF_(0x80091007L)X509_MULTI_BYTE_UINTGetKerningPairsA0x00020000L0x000194"// "COLORONCOLOR( UPDFCACHE_IFBLANßK | UPDFCACHE_ONSAVECACHE )0x0000001L10x00004000"1.3.6.1.5.5.7.1.1"8007L3((() &= ~MDM_MASK_PROTOCOLDATA), (() |= ((()<Buffer, (unsigned int)(()-())); *(unsigned long __RPC_FAR *)&()->Buffer += (()-()); }155074L3808248ßL0x21748L0x40000000UL0x00000019((BYTE)(((WORD)()) >> 8))11015LFindAtomA1002LOpenEventA((LPCSTR)1)_HRESULT_TYPEDEF_(0x00030201L)9607LSQL_CURSOR_FORWARD_ONLY0x000000040x010x00002000L_HRESULT_TYPEDEF_(0x80090ß300L)0x081010StartServiceA0x0103_HRESULT_TYPEDEF_(0x80093008L)0x0000000260x0000L1OPENCARDNAME_EXW0x0400MAKEINTRESOURCE(2)(~SHRT_MAX)TEXT("DsPresentForUser")0x40000x0000000BL00x10x04292((()&MDM_MASK_PROßTOCOLDATA) >> MDM_SHIFT_PROTOCOLDATA)0x0415RpcServerUseProtseqExA_HRESULT_TYPEDEF_(0x80040170L)8220L( 0x1 )8512L201L0x00000006LPOPENCARDNAMEW76901316L0x0080TEXT("printStartTime")"2.5.4.40"0x00000004CTL_CODEß(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)((LPCSTR) 3)_HRESULT_TYPEDEF_(0x800F0201L)0x80000000LRpcServerUseProtseqEpA0x211163PageSetupDlgA770x0000000A0x00000005(CF_SCREENFONTS | CF_PRINTERFOßNTS)LPOPENCARDNAMEA_HRESULT_TYPEDEF_(0x80097012L)GetTempFileNameASQL_QUALIFIER_LOCATION0x0428257L60x00000008L_HRESULT_TYPEDEF_(0x800B0111L)MIDL_user_allocate(4)SQL_TYPE_TIMETEXT("printMemory")_HRESULT_TYPEDEF_ß(0x8010000FL)_HRESULT_TYPEDEF_(0x80040066L)8392L1503LINET_E_USE_EXTEND_BINDING4205L0x000000402930x00010000L(JOYERR_BASE+7)10_HRESULT_TYPEDEF_(0x80110449L)0x0840(WM_USER + 112)"Microsoft RSA SChannel Cryptograßphic Provider"0x000121764L0x00000010COLOR_BTNSHADOW"2.5.4.27"(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7)0x00021728LTEXT("SeMachineAccountPrivilege")0x0002"0.9.2342.19200300.100.1.25"0x80000000UL(WVR_HREDRAW | WVR_VßREDRAW)15020x0002151110042L0x000004000x000fffff(()->pvRecord)0x150x0000001B0"1.2.840.113549.1.9.7"(MCI_CD_OFFSET + 1)0xA0000000(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL3_MASTER)230x0000008ß07005L1434L12_HRESULT_TYPEDEF_(0x800F0214L)20CTL_CODE(FILE_DEVICE_SERENUM,131,METHOD_BUFFERED,FILE_ANY_ACCESS)0x0001L21244L0x00000000((LPCSTR)2)L"Microsoft RSA SChannel Cryptographic Provider"23(ALG_CLASS_MSG_EßNCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL2_MASTER)6_HRESULT_TYPEDEF_(0x80100066L)4321L4103MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_AUTO, MDM_GEN_AUTO_PROTOCOL_DATA ( MDM_AUTO_SPEED_DEFAULT, MDM_AUTO_ML_2 ) )0x0000100D0x00ß000008L0x800000046243323(-4)CreateFileA50x00001000L5028LIInternetProtocolRoot0xD"CryptMsgDllExportEncryptKey"TEXT("printBinNames")__declspec(thread)0x00000020L0x000B0x00100000L8394L10x010D1247L40x0008ß0000_HRESULT_TYPEDEF_(0x00040130L)0x21(-2)390x00100x0007"2.16.840.1.101.2.1.1.5"0x0103100x2d0x00000001"1.2.840.113549.3.4"25411SC_MAXIMIZE18_HRESULT_TYPEDEF_(0x80092020L)10062L4324LMDM_GEN_PROTOCOLINFO( ßMDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_MSCHAP, MDM_HDLCPPP_ML_2 ) )LoadImageA8const IID &MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_ANALOG, MDM_GEN_ANALOG_PROTOCOL_DATA ß( MDM_ANALOG_V34 ) )0x00031402L1152L98393LExpandEnvironmentStringsA_MSL_FILENAME_MAX9SNDMSG(, PSM_SETTITLE, , (LPARAM)(LPCTSTR))CharPrevA(sizeof(SECURITY_DESCRIPTOR))0x10x0000000740x40x0080L( 0x0001 )ß30518541L0x000000300x00000FF0L0x80000000160EXTERN_C DECLSPEC_IMPORT  STDAPICALLTYPE0x00000001(unsigned long)0X00000100L0x01000000UL8520L0x0000010030x0100L0x000000800x0B0x00010x00000006L255110L0x00020xßEESQL_CONCUR_READ_ONLY(1U << 31)10x00000011L122((BYTE)(()>>24))0x00100000L0x101RpcMgmtInqServerPrincNameA0x0080130x0040L100x000020000x000B0x00080000OpenWindowStationA3FILE_FILE_COMPRESSION0x00080000Lß1201150x00000200((LPCSTR) 7)0x020000x000f0xF2(0x00000008L)0GetCurrentDirectoryA"1.3.6.1.4.1.311.20.3"_HRESULT_TYPEDEF_(0x80040181L)"2.5.4.37"1069L85140x00080x000000172EDEADLK(CERT_COMPARE_SHA1_HASH << ßCERT_COMPARE_SHIFT)0x02((LPCSTR)2)IID_IInternetProtocol0x0080(PVOID)InterlockedExchange((PLONG)(), (LONG)())0x0C1( 0x0002 )0x7f0x1(MCIERR_BASE + 16)0x0004((BYTE)(()>>16))1158L2250(-4)0x0000000230x00ß0300000x0000003910x00080000LDECLSPEC_IMPORT1412L8374L1380x0000000830x0002(0x0200)1580x2(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED | PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS)32DoEnvironmentSubßstA_HRESULT_TYPEDEF_(0x80092021L)5"1.2.840.113549.3"0x00000005L0x00040000L4322L(-1021)true11221_HRESULT_TYPEDEF_(0x8011043CL)5025L0x80000000SQL_COLUMN_COUNT113(RPC_C_AUTHN_LEVEL_PKT_PRIVACY)0x00000010_MSL_WßEOF(MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)"1.2.840.10046.2.1"0x04"1.3.14.3.2.17"0x00000200378206L1054L0x01((DWORD)0x00000040)14720x020x00000008L0x0004(WM_USER + 103)_HRESULT_TYPEDEF_(0x80092005L)0x000BCERßT_STORE_PROV_SYSTEM_REGISTRY_W255_HRESULT_TYPEDEF_(0x80100067L)0x000018021372L4sndAlias('S', '?')((BYTE)(()>>16))0x70010x021765L4002L0x080000001374L108L40x8000000815520x02000000L2UL91018L(0x0002)0x00ß000004L1011636L0x0(0x0000022AL)(( HKEY ) (ULONG_PTR)((LONG)0x80000006) )GlobalAddAtomAMAKEINTRESOURCE(17)_HRESULT_TYPEDEF_(0x8009001AL)5062L_HRESULT_TYPEDEF_(0x80010140L)8332L02CTL_CODE(IOCTL_DISK_BASE, 0x0010,ß METHOD_BUFFERED, FILE_ANY_ACCESS)_HRESULT_TYPEDEF_(0x8011040AL)5012L1612L10x00010x0000000828"1.3.6.1.5.5.7.3.5"WriteConsoleInputA671L_HRESULT_TYPEDEF_(0x80028018L)0x000000010x20000x02601_HRESULT_TYPEDEF_(0ßx00090315L)0x000000087007L95500x0000002810x000000801SCARD_CTL_CODE( 5)_HRESULT_TYPEDEF_(0x800F020EL)0x00040x200x00081209LCreateWindowA0x0002(-1)0x00000020L0x26(unsigned long)0X0000FF00L( 1 << CERT_QUERY_CßONTENT_PKCS10)0x00040x000400000x000000030x30030x00020x00000800L1303L(* (float *) __float_min)2sndAlias('S', 'D')0x00000008L0x00468350L((COLORREF)((((BYTE)()|((WORD)((BYTE)())<<8))|(((DWORD)(BYTE)())<<16))ß|(((DWORD)(BYTE)())<<24)))0x00010x00020000L00x000ERpcBindingInqAuthInfoA0x080D0x000010020x00000001IID_IInternetHostSecurityManager((DWORD)0xFFFFFFFF)0x00004000"2.5.4.16"(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SIDß_SSL3SHAMD5)0x0000LGetClassLongPtrA0x001E20x00000008CharLowerASTATUS_PRIVILEGED_INSTRUCTION0x7fff0x0010000040x00000x0000000802_HRESULT_TYPEDEF_(0x800401FEL)8542L0x20000000L3(6 << 9)0x01340x00100000LDlgDßirSelectComboBoxExA8518L0x04(WM_USER + 107)64L_HRESULT_TYPEDEF_(0x80092010L)9717L0x00000001L8508L(RPC_C_AUTHN_LEVEL_DEFAULT)0x0008(0x0050 | XCLASS_FLAGS )0x00100x000100000x40000x77180x00040000L90x000401C0Làß11002L0x000000108458L7003L0x0000000c5039L31LSQL_TYPE_DATE(TEXT("image/jpeg"))40x010F_HRESULT_TYPEDEF_(0x80110601L)00x04000000L4333L0x80002000(0x80000000L)0x00001D01ImmConfigureIMEA0x000000800x00000008L__ßdeclspec(dllexport)0x00087004L4LSQL_BINARY0x0000002804212L0x0000000EL71637L(100 + SQL_CODE_SECOND)0x00020000L0x000010000x15"1.2.840.113549.1.7.5"0x00C50x00000100L1774L0x00000008L5051L10x01338367L0x000ß000FF(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)0x00000007AddPrintProvidorA310x00000004L0x000000041EnumICMProfilesACharToOemA(0x6)1L0x00000x200xF0100x00000040_HRESULT_TYPEDEF_(0x800401E2L)4"2.16.840.1.113730.1ß.2""2.5.29.31"0x0008_HRESULT_TYPEDEF_(0x8004E002L)0x00000025LocalReAlloc( (), 0, LMEM_MOVEABLE )0x0016CryptEnumProvidersA0x00100x00002000L_HRESULT_TYPEDEF_(0x80041314L)0x000010000x000x00000200L_HRESULT_TYPEDEßF_(0x80004009L)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_56K, MDM_V120_ML_2 ) )0x00000000120x00000100L((LPCSTR) 10)((DWORD)0x0008)_HRESULT_TYPEDEF_(0x8010001DL)1230x0000ß003FL0x0004L32L(-1L)311012L(__msl_alpha | __msl_digit)0x00020x000000010x10x00020002L69(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)((LPCSTR) 9)30x00040x00000001L(WM_USER + 118)0x0800L_HRESULT_TYPEDEF_(0ßx80092002L)767051LSCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0202)0x00000040150x0000001083L0x00000008(1 << 13)10004IID_IInternet0x00000010(PSN_FIRST-5)0x0005(-3L)52_HRESULT_TYPEDEF_(0x80100027L)0x100x20ßx1001145LCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS)0x0C45200x00040000L0x000000808407L0x0008"2.5.29.21"0x000000400x000000200x00000020(0)0x000000100x03010x000000080x005000000x000ß96"1.3.14.3.2.10"0x08000000UL0x000000040x000000020x0000000819_HRESULT_TYPEDEF_(0x80093010L)0x041a34((() >> 31) & 0x1)0x08000000l0x04190x041c(void)SNDMSG(, CDM_HIDECONTROL, (WPARAM), 0)0x000000010x041bß100x000008000x041e0x041d0x000000010x000002000x041f0x0000010070x00000008L0x0805710148CERT_STORE_SAVE_TO_FILENAME_W_HRESULT_TYPEDEF_(0x80030201L)53_HRESULT_TYPEDEF_(0x80100008L)8469L51175L((DWORD )0xC000ß0093L)0x00000002L( 1 << CERT_QUERY_CONTENT_PKCS7_SIGNED)0x04000x80002021L0x00101(TEXT("video/mpeg"))I_RpcServerUnregisterEndpointACreateWindowExAAF_OSI8479L206L0x00660x000200009651290x00000200L0x01600x00ß040004L_HRESULT_TYPEDEF_(0x800401C0L)1632L0x6Cmemset((),(),())1063LReportEventA830x04002_HRESULT_TYPEDEF_(0x80030001L)_HRESULT_TYPEDEF_(0x80040010L)0x000000400xEF0x0140((WORD )((((DWORD)()) >> 16) & 0ßxf))0x00000004GlobalFix((HANDLE)())80x0000000274((BYTE)())memset((),0,())0x00000001L0x3D70x00400000L230L"1.2.840.113549.1.1.5"1202L( += )CMSG_ENVELOPED_RECIPIENT_V2"2.5.29.4"8391L5L_HRESULT_TYPßEDEF_(0x80090307L)VerInstallFileA0x20000000L0x007C0((HRESULT)0x00000000L)(((ULONG_PTR)() >> 16) == 0)9609L10(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE| MUTANT_QUERY_STATE)0x40000x0020_HRESULT_TYPEDEF_(0x800F0211L)0ßx00010000L0xC0000x1015360(~SCHAR_MAX)0x000000000x0000000d(( HKEY ) (ULONG_PTR)((LONG)0x80000005) )0x00040x0400170x06FF5010x0001000020x00200000LFILE_DEVICE_MASS_STORAGE0x00010000"1.3.14.3.2.6"0x1004((BOOLß) ((0x00ff0000 & ()) == (0x00ff0000 & ())))0x00000002MF_ENABLED((DWORD)(((BYTE)() | ((WORD)()<<8)) | (((DWORD)(BYTE)() | ((WORD)()<<8))<<16)))MM_MIM_LONGDATA61L50x00000004CALLBACK0UL(CDN_FIRST - 0x0007)àß0x0002(0x80000000L)HRESULT STDMETHODCALLTYPE0x00000004L0x040000008537L0x00000004L0x8000((LPCSTR) 39)8443L7RpcServerUseProtseqIfAMAKEINTRESOURCEA_HRESULT_TYPEDEF_(0x80090326L)0x00173210x000000010x0001000082ß16L2157MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_57DOT6K ) )HTLEFT6006L0x04000x00000004L15400_HRESULT_TYPEDEF_(0x80040168L)SQL_CURSOR_TYPE140338-1SQL_LOGIN_TIMEOUTàß((LPCSTR) 5)0x00020x000008000x0000000AL0x00000006L1124L((UINT)-1)_HRESULT_TYPEDEF_(0x80080002L)( 11 )0x00001000L"1.3.6.1.4.1.311.10.6.1"0x00000080L0x00000000((LPCSTR) 11)00x0100(MCIERR_BASE + 50)0x40000000Lß2_HRESULT_TYPEDEF_(0x80090006L)_HRESULT_TYPEDEF_(0x80030100L)PSM_SETHEADERSUBTITLEA0x0100L0_IOW('s', 2, u_long)__stdcall_HRESULT_TYPEDEF_(0x800300FBL)8CCSIZEOF_STRUCT(PROPSHEETPAGEA, pcRefParent)4_HRESULT_TYPEDEFß_(0x8009301BL)0x80200x00010000L20x000000072RpcNsEntryObjectInqBeginA8516L148L200x35((DWORD)-12)0x0233_HRESULT_TYPEDEF_(0x800F021CL)00x0001_HRESULT_TYPEDEF_(0x800C0012L)0x00001D06(-2)3AccessCheckAndAuditAßlarmA(7U << 11)0x00000010L"CryptDllEncodeObjectEx"20(0x0008)0x000000010x044b0x00000004(-9)0MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_14DOT4K ) )0x000000400x044c_HREßSULT_TYPEDEF_(0x80028029L)(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)0x04490x000000400x032760x044a"commdlg_FindReplace"(() == CRYPßT_SUCCEED)0x20000000UL0x044f2(*(*(unsigned long **)&)++)0x04500x0220_HRESULT_TYPEDEF_(0x00040172L)00x040x044d_HRESULT_TYPEDEF_(0x80029C4AL)00x00000400L310x044e0x00AF_DLI0x04510x04520x04000xBB0x0000080ß02_HRESULT_TYPEDEF_(0x80091001L)0x00000010L0x8(&__std(__files[1]))"sysynclib_"7unsigned __int64_HRESULT_TYPEDEF_(0x80040000L)13L"commdlg_FindReplace"0x7002289554L_HRESULT_TYPEDEF_(0x80090004L)0x1470x03070xß00000003L_HRESULT_TYPEDEF_(0x80097011L)0x80DialogBoxParamA1031355L0x2000940x1100( 3 )0x00000002L0x0010L0x00000040L0x04555047L0x04560x00080x045320x04540x250x0000000D0x00200x0459119L0x045a0x0000000ß1L0x045715460x0458ERROR_BAD_DEV_TYPE1324L0x00000007L"2.5.29.1"0x045b0x045c0x00000005LCMSG_ENVELOPED_DATA_V090x00210x00000200lERROR_OUTOFMEMORY0x00000100L1055LAdvancedDocumentPropertiesA_HRESULT_TYPEDEF_(0xß80030003L)181_HRESULT_TYPEDEF_(0x8010002FL)(4 + MCI_SEQ_OFFSET)_HRESULT_TYPEDEF_(0x80091005L)0x00000100l0x00000004l(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6)CreateMetaFileA0x000000400x00000001l2550x00000002l((LPCSßTR) 14)0x00000020l_HRESULT_TYPEDEF_(0x000401E2L)0x060x00000004L10x00000010l_HRESULT_TYPEDEF_(0x80100018L)0x00800x000000020x00000008lMWT_IDENTITY8419L0x00000001L1200x01419604L(MCI_VD_OFFSET + 1)_HRESULT_TYPEßDEF_(0x8010002CL)0x00202560x045f0x000a0x960x00035053L( 0x0040 )MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_12DOT0K ) )MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V1ß20_PROTOCOL_DATA ( MDM_V120_SPEED_64K, MDM_V120_ML_NONE ) )0x00000008"2.16.840.1.101.2.1.1.14"0x045d10091L0x045e0x10050x10x00000003381(PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_HEX | PERF_DISPLAY_NO_SUFFIX)ß0x20000x00400x02FC(~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED))033_HRESULT_TYPEDEF_(0x800C0017L)0x0000000010xFFFFFFFFL230x00000001LCopyEnhMetaFileA1105L0x5A4D0x0138((STATUS_ABANDONED_WAIT_0 ) + 0 )0x000Fß100x000000F0L17_HRESULT_TYPEDEF_(0x80097016L)0x00000004IInternetPriority0x000A((int)0x80000000)PostAppMessageA(0x00000000L)"1.2.840.113549.1.9.6"6500010024L0x80000x720x10000000WritePrivateProfileSectionA(2 +ß MCI_SEQ_OFFSET)0x0002L1(1 + MCI_SEQ_OFFSET)0x00000008L0x1C120x000AGetPrinterDriverDirectoryA(CERT_COMPARE_ISSUER_OF << CERT_COMPARE_SHIFT)385_HRESULT_TYPEDEF_(0x80020001L)_HRESULT_TYPEDEF_(0x00040002L)0x0004019ß0L0x8RegQueryValueExA650010x000B(-8)SIZE_MAXIMIZED(-9)SQL_TYPE_TIMESTAMP0x90x0000C000L16101L( 1 )01206L0x00400000L10x00001000((LPCSTR) 49)AddFontResourceA20x3BF0x00000010210104L(-11)2_HRESULT_TYPEßDEF_(0x8009000DL)_HRESULT_TYPEDEF_(0x80010138L)(MCIERR_BASE + 11)1356L((HCERTCHAINENGINE)NULL)0x360x0226( 0xfff )0x4028207L(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COßUNTER | PERF_DISPLAY_PER_SEC)5256mixerGetDevCapsA0x00000000120x00000800(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_TEK)_HRESULT_TYPEDEF_(0x80004013L)0x00000020FILE_VOLUME_IS_COMPRESSED2(0x80000000L)0x0153(-1ß00)0x00000100L0x00000002L148213L(-16)0xffffffffffffffffULL2(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DES)SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0142)"1.3.6.1.4.1.311.10.1""1.2.840.10040"SHGetNewLinkInfoAGßetWindowTextLengthATEXT("SeUndockPrivilege")5(-15)0x1AauxGetDevCapsA0x0008"2.5.4.43"0x00000004SetPortA0x060x00200000L_HRESULT_TYPEDEF_(0x80092012L)(WM_USER + 131)7_HRESULT_TYPEDEF_(0x800300FCL)ERROR_INSUFFICIßENT_BUFFER4211L02_HRESULT_TYPEDEF_(0x80092013L)1(-6)DialogBoxIndirectA0x3fOpenFileMappingA(0x7)0x3e(0xA0000003)0x00000020L3(int)SNDMSG(, CDM_GETFILEPATH, (WPARAM), (LPARAM)(LPSTR))105_HRESULT_TYPEDEF_ß(0x8001011AL)TEXT("SeRestorePrivilege")0x00030000WNetGetNetworkInformationA0x0000_HRESULT_TYPEDEF_(0x00040182L)(1U << 10)0x000000020x00000020((fpclassify() > FP_INFINITE))0x3BC0x00101060L0x000400001793L(int)ßSNDMSG(, CDM_GETFILEPATH, (WPARAM), (LPARAM)(LPWSTR))0x800000400x00040000L0x00000005284400x00000200L0x00000001L".GroupPolicy"sz_CERT_STORE_PROV_PHYSICAL_W8447LMMIO_READ1(CERT_COMPARE_PUBLIC_KEY << CERT_COMPßARE_SHIFT)__std(vsnprintf)( 4 )10x00002000L0x000000040x02(-22)0x02329130x00000080L(MCIERR_BASE + 83)DialogBoxParamA(, , , , 0L)(SQL_C_LONG+SQL_SIGNED_OFFSET)10x000000020x00000001(MATH_ERRNO|MATH_ERRßEXCEPT)10x0000000250x00001D03{().Lo64 = 0; ().Hi32 = 0; ().signscale = 0;}198301L0x00000010((WORD )() >> 10)(TEXT("application/postscript"))7120x046b0x040bRpcNsGroupMbrRemoveA0x046c0x040c35021L0x0ß080( 0x8 )0x000002000x04690x0409220x10000x046a0x040a(-1 * (int)())0x046f0x040f30x0110x000015ff0x046d0x040d0x000000020x046e0x040e0x0000000E0x030EI_RpcNsBindingSetEntryNameA100x0008SQL_C_CHAR_HRESUßLT_TYPEDEF_(0x800C000DL)0x0101L2RpcNetworkIsProtseqValidA20x0020487L4L0x00080x20"1.3.14.3.2.19"DialogBoxParamW(, , , , 0L)10x000013ff26_HRESULT_TYPEDEF_(0x8002802EL)240x0004IsLoggingEnabledA0x0002àß0x00000008L0x00200000L0x0a_WAIT_CHILD0x00080000GetTextExtentPointA_HRESULT_TYPEDEF_(0x80110419L)9504L0x02825014L113EnumPropsExA2((BYTE)(()>>16))0x0008((DWORD )0xC0000006L)1(MIXERCONTROL_CONTROLTYPE_BOOLEANß + 5)5_HRESULT_TYPEDEF_(0x80010130L)1921L0x00030x000000040x00038487L8306L0x0005RPC_BINDING_VECTORmidiOutGetDevCapsA0x00000009"CryptMsgDllImportKeyTrans"19L(-3L)IDI_EXCLAMATION68513L(MCIERR_BASE + 13)0x000ß00010LOWORD()CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)0x01000000LCTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)X509_UNICODE_NAME_VALUE(STANDARD_RIGHTS_REQUIRED|SYßNCHRONIZE|0x3)10x000400000x3f0x10x05(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)(0x1F)(-1)(-12)0x00000800L140x000ß01004DeletePortA(MCIERR_BASE + 15)0x0000charERROR_NO_LOGON_SERVERS(MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT))290x00000001L310x000000000x00020x0000000117_HRESULT_TYPEDEF_(0x80004021L)0x0001120x00001_HREßSULT_TYPEDEF_(0x800401EBL)10093L210x12(CDM_FIRST + 0x0003)0x20000000snprintf996L6L8486L115037LCP_WINANSI(CERT_COMPARE_NAME_STR_A << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)BN_UNHILITE0x800000001655MAKELßONG(,)0x00000004L9((LONG)0x80000000)39560L60LDECLSPEC_IMPORT0x00080000LGetTextFaceA0x00070x001000000x00000004L0x040010xffffff000x3BMAKEINTRESOURCE(32515)40_HRESULT_TYPEDEF_(0x80010126L)(~((UINT_PTR)0)ß)8336L(CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)8( (() & 0x80000000) )(0x01000000L)0x000000010x00055L".LocalMachineGroupPolicy"7002L0x00000010TEXT("NetPopup")0x0010_HRESULT_TYPEDßEF_(0x80010106L)7017LCreateEventA((DWORD)(((BYTE)() | ((WORD)()<<8)) | (((DWORD)(BYTE)())<<16)))7045L0x000000800x000000040x00000100L0x4000_HRESULT_TYPEDEF_(0x8004E00FL)GetPrintProcessorDirectoryA18382L0xF1ß30"sysynclib_win32"0x40x80000x400x0004(*(double*) __double_huge)518_HRESULT_TYPEDEF_(0x8004E006L)70x000122422(STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE)0x00000010àß20x8004E000LSQL_CB_DELETE(MMIOERR_BASE + 10)1(( HKEY ) (ULONG_PTR)((LONG)0x80000001) )17_HRESULT_TYPEDEF_(0x8001013DL)((DWORD)0x0080)0x885362GetFileAttributesA0x1221180x000000040x0004( 200 )GetFileAttribußtesExA_HRESULT_TYPEDEF_(0x8009000EL)0x00000080L(MCIERR_BASE + 54)10066L(-1021)SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0124)0x0203L_HRESULT_TYPEDEF_(0x80040007L)0x0004L_HRESULT_TYPEDEF_(0x80030021L)(0x00000225L)SßQL_FETCH_PRIOR0x00000800L_HRESULT_TYPEDEF_(0x80096010L)1201L7MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_19DOT2K ) )0x7777FFFFWNetGetUserA0x020E1787L358342L1627L1154L(ß0x0200)0x00000400L42CERT_SHA1_HASH_PROP_ID0x08420x0000002014MWT_RIGHTMULTIPLY0x0000000010((DWORD)0x00000008)13_HRESULT_TYPEDEF_(0x800401FDL)0x000000010x000000020x00001E05MM_WIM_CLOSE0x0470x010F0x013068ß230L0x00000800L1638L0x80200000SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA003)(0x4)0x00020000LDECLSPEC_IMPORT8015L0x000008000x00000000L1020018303L164319L_HRESULT_TYPEDEF_(0x80093101L)_HRESULT_TYPEDEF_(ß0x80041312L)190x0000000FL8384L1127L0x00000040LSCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0103)_HRESULT_TYPEDEF_(0x80090331L)0x001000x121908L10x00020x01108500x00000004L5301L0x00000080L920x0000000130x0ß0000004LIMAGE_NT_OPTIONAL_HDR32_MAGIC77( 0x2 )0x0020000040ULPrivilegedServiceAuditAlarmAIME_CMODE_NATIVE(0x0080 | XCLASS_NOTIFICATION )0x434944470x0004120L240x000000020x0100000011027L779( 0x0001 )LPIINTERßNETPROTOCOLROOT20x000001000x008000000x0B40x00000x100000000x0136350x0028"1.3.6.1.5.5.7.3.7"4310L((WORD)0x0100)0x0800000020x00000200_abnormal_termination41701L10x000000100xA44112_HRESULT_TYPEDEF_(0x800ß94001L)SYSER_PRODCODE_CLIENT_ODBC_PRO_WIN320x00000003142111LSYSER_PRODCODE_CLIENT_LIB_DESK2MM_WOM_CLOSESYSER_PRODCODE_CLIENT_LIB_ALL(*(float*) __float_huge)0x0008"FuncName""1.3.14.3.2.22"ERROR_ACCESS_DENIED19ß30x00000027199"SmartCard"_HRESULT_TYPEDEF_(0x80010114L)0x544E5250L(MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))170x000001008314L0x2F15110x000400000x0201L( (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FßAT_12)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FAT_16)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_IFS)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_HUGE)) || (( & PARTITION_NTFT) ß&& (( & ~0xC0) == PARTITION_FAT32)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FAT32_XINT13)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_XINT13)) || (( & ~PARTITION_NTFT) == PARTITION_FAT_12) ||ß (( & ~PARTITION_NTFT) == PARTITION_FAT_16) || (( & ~PARTITION_NTFT) == PARTITION_IFS) || (( & ~PARTITION_NTFT) == PARTITION_HUGE) || (( & ~PARTITION_NTFT) == PARTITION_FAT32) || (( & ~PARTITION_NTFT) == PARTITION_ßFAT32_XINT13) || (( & ~PARTITION_NTFT) == PARTITION_XINT13) )((LPCSTR)4)0x000000010x10010x04000000870x00000001150x000000020x000000380x10x8000000000x00001602MS_DEF_PROV_A0x00000800L"2.5.4.25""M\0\0\0"0x008ß01_HRESULT_TYPEDEF_(0x800C0100L)CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)5210x00000004(4 << 9)0x00000004L0x00020xffffffff0x112169601L0x00080000LDdeQueryStringA_HRESULT_TYPEDEF_(0xß80110438L)1008L0x031172L(-11)0x000DSQL_MAX_LENGTH2402L0x00000023((HANDLE)(DWORD_PTR)GetWindowThreadProcessId(, NULL))70xFFFFFFFF_HRESULT_TYPEDEF_(0x800F0102L)4307L0x00000010LAF_LAT550x00020x00040x00x00ß39SQL_CB_DELETE1L"Directory Service Object"0x49(MCI_STRING_OFFSET + 16)8372LIMAGE_SNAP_BY_ORDINAL32()0x00000000L((HWND)0)0x000000020x00002000L0xFC000x00000020L8457L00x3_HRESULT_TYPEDEF_(0x80092009L)_HRESUßLT_TYPEDEF_(0x80010105L)"1.3.6.1.4.1.311.20.2"_HRESULT_TYPEDEF_(0x800288BDL)8445L"Directory Service Object"SQL_ASYNC_ENABLE_OFF1030x02122020L0x00001000L0x00100000CERT_FIND_OR_ENHKEY_USAGE_FLAG30L0x30000000UL10àß"1.3.14.3.2.27"0x000000080x00000001LMAKEINTRESOURCE(19)_HRESULT_TYPEDEF_(0x8009200EL)0L0x8004021FL0x0003(SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS)0x00040x00000000L((DWORD)0x00ß000800)101619(-12)RpcNsProfileDeleteA0x00010000L0x00001200((DWORD)0x00000101)0x0000002b3(MMIOERR_BASE + 2)2012L0x000004000x00000001SQL_QUALIFIER_TERM33204810x38723_HRESULT_TYPEDEF_(0x80040065L)67( 0xß10 )880x000008004345004L0x00050000l0x000000400x021915L0x0854110x00x0000002011ERROR_INVALID_DATA240L((STANDARD_RIGHTS_ALL | KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | KEßY_NOTIFY | KEY_CREATE_LINK) & (~SYNCHRONIZE))000x00001000L2541822L0x0001_HRESULT_TYPEDEF_(0x800C0003L)9ST_BLOCKNEXT0x000014001179L0x00000004_P_NOWAIT0VarBstrFromI4448002L20x00000010L1310x00000001L0x0002àß_HRESULT_TYPEDEF_(0x8011041EL)0x000000020x400f0x00000001L20x808000000x0000000211BS_NULL0x0234"1.3.14.3.2.28"0x00000010_HRESULT_TYPEDEF_(0x8000400EL)0x00040x0001( 0x80000000 )10x02CryptSetProviderAh_addr_lißst[0]0x000310x00020000L1DispatchMessageA_HRESULT_TYPEDEF_(0x80020007L)102L(CDM_FIRST + 0x0001)_HRESULT_TYPEDEF_(0x80093006L)4_IOR('f', 127, u_long)0x00000800L00x6B21602L1222LWriteProfileStringATEXT("printMßediaReady")1429L(0x0002)8205L0x0002struct DECLSPEC_UUID() DECLSPEC_NOVTABLEERROR_NOT_ENOUGH_SERVER_MEMORY231L0x0004WinHelpA0x000A1354L100x000000020xFFFFFFFF0x2SNDMSG(, PSM_RECALCPAGESIZES, 0, 0)0xFC0x04ß1B78(((fd_set FAR *)())->fd_count=0)_HRESULT_TYPEDEF_(0x80040011L)20x30x10050x000F00000x00400x01891799L57049L0x1E(4<<4)0x00010000LGetOpenCardNameALookupPrivilegeDisplayNameA0x00010x0002( sizeof()==8 ?ß *(1+(_UINT32*)&) : (*(_UINT32*)&))NULL0x0000080030x000010000x00ffffff0x00000001420147L13_HRESULT_TYPEDEF_(0x800F022DL)98501L10x0001L8385L(RPC_C_AUTHN_LEVEL_CONNECT)1116L((UINT)-1)(0x0000 | XCLASS_NOßTIFICATION | XTYPF_NOBLOCK )IID_IInternetProtocolSink0xC040x00000200L0x00028110x00F1DNS_ERROR_UNSECURE_PACKET0x00008000201768LLPCPROPSHEETHEADERA_HRESULT_TYPEDEF_(0x8010002AL)16008L2336SearchPathA0x0000001ß80x000000020x800000000x00000001V_UNION(, punkVal)CryptSetProviderExATHREAD_BASE_PRIORITY_MAX0x019DTEXT("RestartJobOnPoolError")0x0000C000L111064L50x00000800L0x0200L8100000x004000000x00000001L30xFF0x000ß000408323L52043310x000f0000DeleteFormA0x04GetWindow(, )(LPTSTR)((ULONG_PTR)((WORD)()))28495L0x00000008((LPCSTR) 20)8517L(0L)10x00080x00000008_HRESULT_TYPEDEF_(0x80093000L)1453L1899L(STANDARD_RIGHTßS_REQUIRED | SYNCHRONIZE | 0x1FF)0x00000080LAddPrinterConnectionA(&g_rgSCardT1Pci)0xF0(&g_rgSCardT0Pci)6200x00001000_HRESULT_TYPEDEF_(0x800F021AL)0UL"2.5.29.16"(100 + SQL_CODE_DAY_TO_MINUTE)0x019C3027(TIMEßRR_BASE+1)0x150x00000030"1.3.6.1.4.1.311.13.2.3"_HRESULT_TYPEDEF_(0x80093201L)0x020x00004000L1383L120x1000210x007B(-13)(MCIERR_BASE + 40)0x3BB0x00050x0040L0x000B6((MCIDEVICEID)-1)0x02060xBD0x900x00001ß0001166L0x0000040000x00A80x000000ffstruct(0x0008)20x00000100L59LoadMenuA1732L648(-2)0x0080111((LPCSTR) 29)ERROR_INVALID_HANDLE0x000B_HRESULT_TYPEDEF_(0x80020011L)SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1TEßXT("printDuplexSupported")0x00004003L0x1010108LSTATUS_NONCONTINUABLE_EXCEPTION(QS_MOUSE | QS_KEY)0x00000004L21960x200000000x00000008ILLUMINANT_CCreateDirectoryA(TEXT("audio/wav"))0x00060x01730x01690x0000002ß0(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT )10059LSQL_WCHAR0x000000021281((DWORD)0x0040)"CertDllOpenSystemStoreProv"( -5 )0x00000001ßL_HRESULT_TYPEDEF_(0x80092022L)0x0200L_HRESULT_TYPEDEF_(0x8004E025L)0x1003856ERROR_ALREADY_ASSIGNED141445L0x00000020L(MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)0x2C0920x0000ffffWNetCancelConnection2A0x01500x000ß00008LMF_MENUBREAK1613L128366Lstrcpy(,)0x00000009L70x00000040L12_HRESULT_TYPEDEF_(0x8001012FL)6040x7fffffff0x00000001603660170CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)MAKELONGß(,)0x00102330x00000001"\\SQL.LOG""2.16.840.1.113730.1.12"GetExpandedNameA_HRESULT_TYPEDEF_(0x000401E7L)(BDR_RAISEDOUTER | BDR_SUNKENINNER)0x710x00000008L256_HRESULT_TYPEDEF_(0x80040204L)0x00070000virtual ß STDMETHODVCALLTYPE 0x32SQL_LIKE_ONLY20x01995060x00018_HRESULT_TYPEDEF_(0x80090311L)300x10000000ULSetFormA0x00000000L0x00000200L10041L(SHORT)-21EnumFontFamiliesA0x00081804L160GetFormA0x80010x0001000ß0(-14)0x000010000x00008000L"1.2.840.113549.1.3.1"_HRESULT_TYPEDEF_(0x800B0100L)9718L9708L(0x0000FFFFL)0x00001603GetPrinterDriverA(((DWORD)( & 0xffff0000)) >> 16)(MMIOERR_BASE + 3)5930x0156MAKEINTRESOURCE(4)ß0x3CA0x01460x00000001(0x00000001L)(*(_UINT32*)&)RpcNetworkInqProtseqsA(BF_LEFT | BF_TOP | BF_RIGHT | BF_BOTTOM)2S_un.S_addr0x00008000L91231L8CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)àßMAKEINTRESOURCE(11)0x000008000x00000010LSetWindowsHookA320x2A3529340_IOR('s', 3, u_long)0x400d33(-7)0xff0x00000008((() &= ~MDM_MASK_BEARERMODE), (() |= ((()<> MDM_SHIFT_BEARERMODE)SNDMSG(, PSM_REBOOTSYSTEM, 0, 0L)60x00000200_HRESULT_TYPEDEF_(0x80040153L)((DWORD)-1)4"2.5.4.42"(MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1)_HRESULT_TYPEDEF_(0x8004E026L)SEC_WINNT_AUßTH_IDENTITY_A31MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_64K, MDM_V120_ML_2 ) )(CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT)0x0004L0x00000010LSCARD_ATTR_VALUE(SCARD_CLAßSS_SYSTEM, 0x0006)70x0002L1341LEndUpdateResourceA0x001_HRESULT_TYPEDEF_(0x8009030EL)((DWORD )0xC00002B5L)5150x0000010040513(CONTEXT_i386 | 0x00000008L)0x0000120500x800000x0000400BL0x000019ff0x00000012_ßHRESULT_TYPEDEF_(0x80100021L)( 0x0004 )0x000000040x02019709L36L0x0202(100 + SQL_CODE_YEAR_TO_MONTH)14_HRESULT_TYPEDEF_(0x80090010L)5050LTEXT("printKeepPrintedJobs")0x200000x000000080x00000003L0x80040200L1005Làß(0x0020)0x010x00001C00SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004)(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_PERCENT)0x000001000x2000x4d5918325L((DWORD )0xC0000090L){0,0,0,0,0,3}1ß01657006L1342LRPC_X_ENUM_VALUE_OUT_OF_RANGE920x00000020(STANDARD_RIGHTS_REQUIRED | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE)(0x00000002L)0x020x014C0x00000002L80x0a8543L30x080A55_HRESULT_TYPEDEF_(ß0x80041311L)_HRESULT_TYPEDEF_(0x80004018L)0x004B15(CERT_SYSTEM_STORE_SERVICES_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)MAKEINTRESOURCE(20)820x00A0410x40_HRESULT_TYPEDEF_(0x00040171L)_HRESULT_TYPEDEF_(0x8004016AL)15ß50x870x0308_HRESULT_TYPEDEF_(0x8004E023L)153"CryptDllEncodeObject"0x00800x0231(0<<4)8waveOutGetDevCapsA0x3C7100420x00000004L1250x00000200RpcNsGroupMbrAddAMAKEINTRESOURCE(32651)610241007100120x10000x00ß081187025L(-5)2SQL_CP_OFF0x00000004970x01720x1007_HRESULT_TYPEDEF_(0x800401F8L)570x0002L0x00000002LChangeServiceConfigA10x001000x00060x000DEnumDisplaySettingsA0x00010x004EGetOutlineTextMetricsA_HRESULßT_TYPEDEF_(0x80100029L)0x00000008L0x002000000x00001D00160x000000040x00000001L(CDN_FIRST - 0x0004)1(0x0)0x8012(MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_SIGNED)5029L0xß100A((HRESULT)() <= 0 ? ((HRESULT)()) : ((HRESULT) ((() & 0x0000FFFF) | (FACILITY_WIN32 << 16) | 0x80000000)))EXTERN_C const GUID FAR 0x000000801407L0x0142_HRESULT_TYPEDEF_(0x8000400BL)0x000008000x0032(0x010ß0)0x00000002L0x00040x00040x0008AbnormalTermination()(-8)"Status"0x002100001397L0x0001GetNamedPipeHandleStateA0x001F00000x000000020x00000002(TEXT("application/octet-stream"))( 0x50746457 )0x00805060L1200xß000000040xFEEF04BDLExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)0x00008000DlgDirListComboBoxA240x0004130( 0 )4008434L40x00000001L_HRESULT_TYPEDEF_(0x800B0106L)(0x001F0000L)_HRESULT_TYPEDEF_(0x80030004L)1160L0x00040ß00020x0004( 0x10 )41630x00000020161RpcServerRegisterAuthInfoAERROR_NOT_CONTAINER0x00A4116088sndAlias('S', 'W')struct __ { int unused; }; typedef struct __ *sz_CERT_STORE_PROV_LDAP_W0x0001RegEnumKeyExßA218_HRESULT_TYPEDEF_(0x80094003L)CommDlg_OpenSave_GetFolderPathA0x00000002LOLDFONTENUMPROCA4208L0x000x020x03(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES)(0x00000227L)0x8X509_MULTI_BYTE_UINT0x000000041ß(PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE | PERF_DISPLAY_NO_SUFFIX)0x0005((LPCSTR) 52)0x00200x080x00000004_HRESULT_TYPEDEF_(0x800F0224L)0x00080000L63(STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTESß | FILE_EXECUTE | SYNCHRONIZE)RegLoadKeyA_HRESULT_TYPEDEF_(0x8004130AL)84SQL_INTERVAL_DAY_TO_SECOND0x700444TEXT("OSVersion")1130L0x0040L0x0120x000CCertNameToStrA0x0002L10x00008000L1721L0L150x010x00000100ßL0x00400x00A2L"Microsoft Base DSS Cryptographic Provider"30x00000100L180x000000201(-10)2GetLogColorSpaceA52__WSAFDIsSet((SOCKET)(), (fd_set FAR *)())910x080014189551L0x000D"Microsoft Base DSS Cryptogrßaphic Provider"9684325L1309L29""43710x0001IID_IInternetProtocolSinkStackable(TEXT("image/gif"))CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0008L8(-16)(0x00000008L)((DWORD )0xC0000026ßL)"Collection"1078L0x000D0x40000000252ExtractIconExA(3<<4)00x00001000_HRESULT_TYPEDEF_(0x80041315L)0x000000400x80040160L14414516MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDßM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_CHAP, MDM_HDLCPPP_ML_2 ) )212_HRESULT_TYPEDEF_(0x8004016FL)10x000000400x0200(-6)CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)5_HRESULT_TYPEDEF_(0x80040068L)1ß461L0x00800000(MMIOERR_BASE + 6)1357L0x000000020x00250x0020000000x004000000x000080001210x000800000x0000400091219L310x001000000x00020000210x000400000x2a620x0305"-//Synthesis AG//NONSGML SyncML Engine Vß" SYSYNC_FULL_VERSION_STRING "//EN"0x00200x000100000x00010000{0,0,0,0,0,2}RegDeleteValueA0x00002000"1.2.840.113549.1.9.16.3.7"(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_OBJECT_TIMER | PERF_DELTA_ßCOUNTER | PERF_DISPLAY_PERCENT)MAKEINTRESOURCE(32516)150x0000001060x00CD1347L0x000000405087L(WM_USER + 119)0x0040160x0000000821822(-6)240x0004021FL1725L463(MDM_MASK_BEARERMODE|MDM_MASK_PROTOCOLINFO)(~INßT_MAX)0x7f0x00000008L0x00000010LGetAtomNameARegRestoreKeyA25GlobalGetAtomNameA(-308)8528L0x0001GetEnvironmentVariableA0x000920x00000002L0x00000000LCOLOR_BACKGROUND_HRESULT_TYPEDEF_(0x80110435L)0x00000004TAß_BOTTOM5030LInitiateSystemShutdownA0x80000001114LERROR_NOT_AUTHENTICATED25(0x0200)0x00080x00050x00020000L0x000000031628445"Software\\Microsoft\\Cryptography\\OID"0x0001LV_UNION(, ppunkVal)"Formats"0x0067ß"System"600x000000010x07(MCI_WAVE_OFFSET + 0)10x00000001L272UL0x10090x02(MMSYSERR_BASE + 14)0x10000x00062150x3D50x021110x40000000L(1)0x00010000L0x00030000L247251_HRESULT_TYPEDEF_(0x80090304L)SQLSetßPos(,,SQL_POSITION,SQL_LOCK_NO_CHANGE)11( 0x20 )260x000000021280000x00040000L0x10000x952'+'20x00000800L120x000000010xFF00000015SQL_QUALIFIER_USAGE0x000890x08430x00040x00018532L0x000000002119UuißdFromStringA0x04000000l0x03_HRESULT_TYPEDEF_(0x8010000CL)0x00653080x000018040x0200"`\n"0xBE0x030220x1FCMSG_ENVELOPED_DATA_V28529L1625L((HWND)-1)4337L(SQL_BIGINT+SQL_SIGNED_OFFSET)CTL_CODE(IOCTL_DISK_BASE, ß0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)(-8)0x00000000L0x08"System"0L'+'0x00001805ERROR_INVALID_NAME0x00000020420x40008237LSQL_TXN_ISOLATION0x00001000L0x0005227344107DECLSPEC_IMPORT0x0008000061((WORD ß)((((DWORD)()) >> 20) & 0xf))140x010x00000001L49428460L0x00400000L990x0FFF(CERT_COMPARE_ATTR << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)0x02160x220x0d0x0000000028463L0x0000001b0x00000001LWH_MIN_HRESUßLT_TYPEDEF_(0x80090306L)1438L"2.5.4.4"0x00060x00201800x02080x00200000TEXT("SeSystemProfilePrivilege")9571670x000000200x000000021366LSQL_RETRIEVE_DATA1103L0x00000040L0x0000002e0x000000008SQL_SMALLINT98àß0x00000034(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PERF_TIMER_TICK | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)0x00020000L0x00000008L0x0F000x000018000x00000ß0010x80040100L4(SHORT)00x0110x30016036840x0000L0x0000000810x015d8003L730x00000001RpcNsBindingExportPnPA3L0x0070000020x00010000L490x002C3293V_UNION(, puintVal)STATUS_INVALID_DISPOSITION0x0000000ß1L(1 << CMSG_DATA)(MCI_STRING_OFFSET + 17)8456L8100x0000FFFF015(MCIERR_BASE + 37)0x041F1640L1126L((LPCSTR)4)(WM_USER + 106)_HRESULT_TYPEDEF_(0x80040201L)11019L0x80080000( PARAMFLAG_FIN )0x00000004L0x2URLßOpenPullStreamA0x00C79001000x01000000LSWP_NOOWNERZORDER0x00000001L0x000000041180x0000V_UNION(, pdispVal)(unsigned long)0X00000000L__declspec(weak)60x0001L2'Win '0x000000568349LGetModuleHandleA120x1_HßRESULT_TYPEDEF_(0x00040140L)9502L7(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC)(MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_UNSIGNED)_MSL_FILENAME_MAX3MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PßROTOCOL_DATA ( MDM_V110_SPEED_4DOT8K ) )0x000004000x18(HWND)SNDMSG(, PSM_INDEXTOHWND, (WPARAM)(), 0)0x00000020L( & URLPOLICY_MASK_PERMISSIONS)0x80000004512PSM_SETTITLEA1340x00100000L00x7f11539557L"1.3.ß6.1.5.5.7.3.8"9003L970x00060x020x00020x05(()->vt)0x00020x00000100LGetLongPathNameA_HRESULT_TYPEDEF_(0x80093005L)0x00100x00000100L201071L(-21)8258L(MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_MULTßIPLE | MIXERCONTROL_CT_UNITS_BOOLEAN)(8L)32(CDN_FIRST - 0x0001)0x00000020L960x0000220x000000002240RpcServerUseProtseqA_HRESULT_TYPEDEF_(0x80040005L)true10(-1)0-1STATUS_CONTROL_C_EXIT((DWORD)0x00000004)0x00ß20000027630x0000000230x0020L40xF160(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MAC_KEY)8334L0x0000000BL0x00000100LGetProfileSectionA2566V_UNION(, pdblVal)EnumPrinterDataExA41_HRESULT_ßTYPEDEF_(0x80110412L)(1)0x00000005((LPCSTR) 43)(2)"2.16.840.1.101.2.1.1.15"((DWORD)(()&0x00FFFFFFL))0x0800(3)40x037F(4)90x000000FF100x00001202"CertDllEnumPhysicalStore"5__stdcallSQL_COLUMN_TYPE52PolyTeßxtOutA4302LTEXT("printMaxResolutionSupported")_HRESULT_TYPEDEF_(0x8002802AL)1304L_HRESULT_TYPEDEF_(0x80010132L)SetFileAttributesACreateMutexA400x000000080x000c_HRESULT_TYPEDEF_(0x80090022L)0x00011707L((BYTE)((ß)>>24))4316L0x00072"1.3.6.1.4.1.311.13.2.2"0x00020x080x7F72(MCIERR_BASE + 66)0x00F50x80LoadLibraryA7(MCIERR_BASE + 64)0x0002_HRESULT_TYPEDEF_(0x80110402L)167EnumPrinterKeyA1818LSQL_C_BINARY8"1.3.6.1.4.ß1.311.10.1.1"85550x0002(CONTEXT_i386 | 0x00000004L)_HRESULT_TYPEDEF_(0x80040008L)_HRESULT_TYPEDEF_(0x80040001L)1SQL_COLUMN_SEARCHABLE0x00000x40001315LSQL_MAX_USER_NAME_LEN0x10CTL_CODE(IOCTL_CHANGER_BASE, 0x000ß6, METHOD_BUFFERED, FILE_READ_ACCESS)0x000008009006L0x40000(0x0008)-1OpenEncryptedFileRawA771(0x00000229L)CTL_CODE(FILE_DEVICE_SERENUM,128,METHOD_BUFFERED,FILE_ANY_ACCESS)1074L(WAVERR_BASE + 3)(-12)0xFFFFFFFF(AßLG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY)0x00000100L0x001044ERROR_CONNECTION_UNAVAIL20(( HKEY ) (ULONG_PTR)((LONG)0x80000000) )GetModuleFileNameA8DeletePrintProcessorATEXT("printSeparatorFile")0x0008000ß0256"1.2.840.113549"COLOR_BTNHIGHLIGHT0x004A0x000000030x80000000L(0x00000208L)0x0002L-150x00080x00000010LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_9DOT6K ) )0x0000000ßfL70x0220010mmioFOURCC('L', 'I', 'S', 'T')0x00000010L0x001000000_HRESULT_TYPEDEF_(0x80100001L)10011(MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1)160L0x0080"CryptMsgDllImportEncryptKey"0x00000003(MIXERCONTROL_CONTßROLTYPE_BOOLEAN + 0x00002277)8449L0x000000800x01060x00000010L6(1U << 5)1((LPCSTR) 30)_HRESULT_TYPEDEF_(0x80080001L)_HRESULT_TYPEDEF_(0x80040165L)SystemParametersInfoA0xEA_HRESULT_TYPEDEF_(0x80090320L)216L0x000ß20x00000000ERROR( & 0xffff)190x00004001LV_UNION(, pbstrVal)RpcEpRegisterA0x71IInternetProtocol2161"2.5.4.22"11319L0x380x004030x00000001SQL_FILE_QUALIFIERMM_MIM_MOREDATA_HRESULT_TYPEDEF_(0x8010000BL)àß0x00000001ChooseFontACTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)92(() & N_BTMASK)(0x8)5EnumDependentServicesA3005LSTATUS_INTEGER_OVERFLOW0x0E414(-10)0x00000010LIsEqualGUID(, )0xß00000008L5038L0x000400000x00004003L(MCIERR_BASE + 8)1007L((DWORD)0x00040000)0x8000370x000b630x0004011FL7024L( & (511))wglUseFontBitmapsA1436L1387L1926L0x000000230x800001000x03( 2 )LBSELCHSTRINGA5((ßDWORD)0x0100)VarUI4FromR8"1.3.6.1.4.1.311.20.2.2"30x00B6WS_OVERLAPPED481798L2490x0B23_HRESULT_TYPEDEF_(0x80093012L)0x015468515L0120x80040140L0x0380(MMSYSERR_BASE + 1)0x400a0x00000004L_HRESULT_TYPEDEF_(0ßx80100022L)"1.3.6.1.4.1.311.10.3.6"MAKEINTRESOURCE(21)_HRESULT_TYPEDEF_(0x80094002L)0x000000100x00000800L1395L0x00000010LImmEscapeAVarUI4FromR4CreateMDIWindowA0x01050_HRESULT_TYPEDEF_(0x8003001DL)760x440x0000ß0004L0x00000080L(-8)10x000000040x00CESQL_QU_PRIVILEGE_DEFINITION0x20000000(JOYERR_BASE+6)0x000000404_HRESULT_TYPEDEF_(0x80110414L)1217L1009L0x00000x00020000L105130x200x40000x00000010x00000040299L0x000ß0000210_HRESULT_TYPEDEF_(0x8004006DL)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_MSCHAP, MDM_HDLCPPP_ML_2 ) )9719L5063L0x0001900018SETRGBSTRIßNGAEnumFontsA1752L0x05__int32DEFINE_GUID(, , , , 0xC0,0,0,0,0,0,0,0x46)0x90x000000040x02090x8004014FL8309L(0x0200)((USHORT) (0x0000ffff & ()))1703L200x00000100(1U << 0)0x0010LIDI_ASTERISK0x000000ß011205L"1.2.840.113549.3.9"3_HRESULT_TYPEDEF_(0x80004007L)8496L8380L1779L520231720L(STANDARD_RIGHTS_EXECUTE | PRINTER_ACCESS_USE)0x4000( 0x2 )0(unsigned long)0X000000F0L(WM_USER + 102)528454L__declspec(dßllimport)0x2460x03110x00000004L( 0x0001 )0SQL_SCCO_OPT_ROWVER::SendMessage130x001300008437LGetMessageA1446L0x060x00000021(100 + SQL_CODE_YEAR)1756L0x02000x00021121L1CreateNamedPipeA(TEXT("image/x-wmf")ß)CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)181928L0x0001(CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT)0x00200x0(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2)0x00000002ßL1312L(-5)0x0020L0x00000002(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD4)( & 0xffff)(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)MAKEINTRESOURCE(32648)1409LlstrlenA0x000100000x0012TEXT("printStatus")0x00020000àß1746L20xFFFFFFFF7_HRESULT_TYPEDEF_(0x80094004L)0x020x00004000L8369L( 0 )"1.2.840.113549.1.9.3"0x01842004L8438L1173L21"1.2.840.113549.1.7.6""2.5.4.7"0x00000020L((DWORD )0x000000C0L)(MMIOERR_BASE + 14)0x00ß000x00000400L30x11V_UNION(, dblVal)2(0x00000001L)47_HRESULT_TYPEDEF_(0x8009030DL)0x00200x00000028_HRESULT_TYPEDEF_(0x800C0300L)0x000000800x060x020000000x040000000x000300000x1450x080000000x2f0x10000000àß0CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG0x200000008005L = __va_start()(MCI_STRING_OFFSET + 13)0x400000000x00001000L0(SHORT)100643V_UNION(, fltVal)234L0x08550x000014L01391L_HRESULT_TYPEDEF_(0x80093014L)ß0x00200x00001A000x00000400((ULONG)(ULONG_PTR)() )0x000200000x00000008534L((LPCSTR)5)0x8000((BYTE)((()>>24)&0xFF))0x2B1816L1IInternetSessionSTATUS_FLOAT_DIVIDE_BY_ZERO0x800000000x17MS_DEF_DSS_PROV_A224ß0x400000000x0000000A_HRESULT_TYPEDEF_(0x8009001EL)170x4((LPCSTR)2)900x000151"1.2.840.113549.1.9.16.3.5"1780x000000000x00000080LSCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102)0x000000040x000000001300L0x040ß00x000000010x40000000MFS_GRAYED1000LoadAcceleratorsA41090x001E0UL0x1f(0x8)CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS)10240x014EmmioFOURCC('R', 'I', 'F', 'F')AddAtomA0xffff00000x000004ß000x002700000x00000010L22(MMSYSERR_BASE + 13)210x01_HRESULT_TYPEDEF_(0x800401F7L)(WM_USER + 108)0xFFFF0x00000080_HRESULT_TYPEDEF_(0x8009100CL)const GUID &0x080x00000004998L0x0a5(0x00100000L)0x0000000520xß0000000c_HRESULT_TYPEDEF_(0x80030002L)0x000000020x000260x4001151300x011751L0x000019702L0x002A14_HRESULT_TYPEDEF_(0x000401E8L)AF_INET_HRESULT_TYPEDEF_(0x8009300BL)0x00110xFD189L(0x0001)0x00000001L(WM_USßER + 105)1056L180LCreateMailslotA0x000E1RegQueryMultipleValuesA(THREAD_PRIORITY_LOWEST+1)00xC000000F600x00090x80000000(1U << 3)96000x00000040L00x00000000CopyFileA0x0000000170x000000080x00011403L0x000ß00002L0x00004000LCTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS)8343L1376L(0x00000222L)0x120x400x00000080((HRESULT) )1MM_MOM_POSITIONCB8425L2550820x03240x0080"1.3.14.7.2.2.1"0x0200000ß0MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_2DOT4K ) )(() = (() & ~(URLPOLICY_MASK_PERMISSIONS)) | ())8006L((DWORD)0x00000003)1430x0053((DWORD)0x00000004)int0x00000ß003L((DWORD)0x00002000)VarDecFromI40x40000x00004000L0x90x00000x000000080x00000400L8246L60008530L8318L1821L2(((PRPC_ASYNC_STATE) )->RuntimeInfo)33GetPrivateProfileSectionNamesA0x00000002SCardForgetReadeßrGroupA"CryptMsgDllExportMailList"9_HRESULT_TYPEDEF_(0x80110429L)0x00000009L0x00000001SPIF_SENDWININICHANGE0xF140((DWORD)(() + (() << 18)))extern "C"0x7F"1.3.14.3.2.15"0x00000003"1.2.840.113549.3.2"_HRESULTß_TYPEDEF_(0x8009200AL)_HRESULT_TYPEDEF_(0x80090301L)((DWORD)0x0001)CERT_FIND_ISSUER_STR_W0x10xFFFF00000x0000001e90x0010(MCI_STRING_OFFSET + 14)0x0004SetUserObjectInformationA134198L(TEXT("audio/x-wav"))0x0020ß256IsCharAlphaNumericA0x0002980019716L0x00081306L0x000B0x00020000(MCIERR_BASE + 92)0x000C00002330x00060x03096(-6)SNDMSG(, PSM_UNCHANGED, (WPARAM), 0L)"1.3.6.1.5.5.7.2.2"00x00000100L0x0006(0U << 12)àß0x00E2TRUE0x000010000x00000004_HRESULT_TYPEDEF_(0x80010108L)30x00085GlobalReAlloc( (), 0, GMEM_MOVEABLE )((WORD)0x0400)0x018611239L0x01160x00000040L(MIXERCONTROL_CONTROLTYPE_FADER + 1)0x00004000L10111L842ß7L60x0000002780x000000010x00000200L0x000000281811L0x000000010x00000025GetCharWidthA0x08520x000000260x000000230x000000240x02000000L50x2((LPCSTR) 17)0x00800x000000100x000000220x0020L_HRESULT_TYPEDEF_(0x8ß00401C3L)0x000000020x00000001WSANO_ADDRESS183L0x0c0x00010000L123L0x000000040x000000290x000000080x0000002a()0x00020x00010x0000000840x10090x0004013FL0x00010000L0x00700000CERT_FIND_SHA1_HASH0x0000010019ß07L0x00080000L0x00000010L(GCS_COMPREADCLAUSE|GCS_COMPCLAUSE)-40x0110021760x00001606110x00040x10x920x00070x0000004030x000000400x00000008SendDlgItemMessageA0x00000x0004000020x20000000((DWORD)0x00000005)ß((() >> 16) & 0x1fff)0x1b0x0000000E0x0080380x000E(WM_USER+5)0x00000005(CERT_DSS_R_LEN + CERT_DSS_S_LEN)284430x00000800L0x00000001AF_MAX0x003c0000(MMSYSERR_BASE + 10)_HRESULT_TYPEDEF_(0x800C0008L)(0x0020)TrßanslateAcceleratorA0x0814(( HKEY ) (ULONG_PTR)((LONG)0x80000002) )30x000000081927L"1.3.6.1.4.1.311.10.4.1"0x000401BFL128WriteConsoleOutputA"ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,""ASC,ASSERTION,ßAT,AUTHORIZATION,AVG,""BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,""CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,""COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINßT,""CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,""CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,""DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,""DEFERRED,DELETE,DESC,ßDESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,""DISTINCT,DOMAIN,DOUBLE,DROP,""ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,""EXISTS,EXTERNAL,EXTRACT,""FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,""GET,ßGLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,""IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,""INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,""JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LßIKE,LOCAL,LOWER,""MATCH,MAX,MIN,MINUTE,MODULE,MONTH,""NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,""OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,""PAD,PARTIAL,PASCAL,PLI,POSITION,PßRECISION,PREPARE,PRESERVE,""PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,""READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS""SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_USER,SET,SIZE,""SMALLINT,SOME,SPAßCE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,""SUBSTRING,SUM,SYSTEM_USER,""TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,""TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,""UNION,UNIQUE,UNKNOßWN,UPDATE,UPPER,USAGE,USER,USING,""VALUE,VALUES,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,WRITE,""YEAR,ZONE"1633L0x0400((WPARAM)(DWORD)MAKELONG(, ))0x10000RpcNsMgmtEntryInqIfIdsA0x00110000L0x021123L1003ßL1ULMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_DATA ( MDM_X75_DATA_64K ) )TEXT("DsPresent")((HWND)1)_HRESULT_TYPEDEF_(0x80029C84L)(100 + SQL_CODE_DAY)0x00020x000000201771L0x000016040SQL_OU_PRIßVILEGE_DEFINITION((LPCSTR)1)089_HRESULT_TYPEDEF_(0x80030101L)0x00080000L0x00000021_HRESULT_TYPEDEF_(0x80090001L)5040LV_UNION(, pfltVal)0x000000400x01053OLESTR("AsyncCallee")_HRESULT_TYPEDEF_(0x8010000AL)0x00ß00004010x00000040L( 0x80000000 )_HRESULT_TYPEDEF_(0x800F022CL)0x20x00080000LGetMenuStringANULL12( 0x0080 )0x00000000174117((LPCSTR)2)RegEnumValueA0x00090x0014(0x0040 | XCLASS_NOTIFICATION)40x000141832Lß0x04000x8004012FL10092L0x80000000CERT_COMPARE_SHA1_HASH( SecurityAnonymous << 16 )(0x0008)((DWORD)0x00008000)1LookupPrivilegeValueA0x0CFIELD_OFFSET(NOTIFYICONDATAA, szTip[64])598(WM_DDE_FIRST)161(0x0100)CTL_CßODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)0x416((HRESULT)0x00000001L)((LONG_PTR)(MAXULONG_PTR >> 1))0x00000007((LPCSTR)3)12125LTEXT("SCard$AllReaders\000")0x02(BDR_RAISEßDOUTER | BDR_SUNKENOUTER)_HRESULT_TYPEDEF_(0x8004E024L)VarI4FromStr(STANDARD_RIGHTS_EXECUTE | SERVER_ACCESS_ENUMERATE)(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_ENC_KEY)0x00E3_HRESULT_TYPEDEF_(0x800ß30102L)20x06"SySync Client Library PROTO Win32"8415LOpenSemaphoreAFILE_DEVICE_CHANGER0x0000000420x00000000_HRESULT_TYPEDEF_(0x80030019L)86_HRESULT_TYPEDEF_(0x8011040BL)8379L77_HRESULT_TYPEDEF_(0x80080005L)QueßryServiceLockStatusA(BDR_RAISEDOUTER | BDR_RAISEDINNER)0x000A0x10b0x0(CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT)IsCharLowerA(1)0x00080x00000200L((HWND)0)0x000000000x0002_HRESULT_TYPEDEF_(0x000401E6L)GetßTextExtentPoint32A1929L0x00000002L0x00000020300SYSER_EXTRA_ID_PROTO0x3000000020x04000000L0x000000040x0004L0x00002000196L0x00000x00001Bff0x00020000L11008L0x00008000_HRESULT_TYPEDEF_(0x80040167L)4305L157L4àßMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_1DOT2K ) )0x80000x400x1010x00000010_HRESULT_TYPEDEF_(0x800F0225L)0x84000000(WM_USER+4)0x00000200MB_ICONEXCLAMATIONV_UNION(, ßparray)0x1000_HRESULT_TYPEDEF_(0x80040006L)( 1 << CERT_QUERY_FORMAT_BASE64_ENCODED)GetOpenFileNameA0x00BC0x01000x0e0x00020000L29( _RC_NEAR | _PC_64 | _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW | _EM_UNDERFLOW | _EßM_INEXACT | _EM_DENORMAL)11UL1393L0x0002"2.5.29.2"0x0845410x000A"PKCS7"7"1.2.840.113549.1.7.3"FW_SEMIBOLD380x00000x00020x00020000L(SHORT)-1000x100x0000800030x00000800L3()4(0xC0000000L)0x00020000ß9(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW)7( 11 )0x0940"1.3.6.1.5.5.7"STATUS_ARRAY_BOUNDS_EXCEEDED0x00x0102L7void CALLBACK0x0002"ReturnMessage"0x0000000ß80x0EnumResourceLanguagesASCARD_ATTR_DEVICE_SYSTEM_NAME_A_HRESULT_TYPEDEF_(0x80110428L)0x00000007L0x01392L0x3A00x00000100L0x200022L10x00000001L0x003200000x00208231L(STANDARD_RIGHTS_EXECUTE)0x000000010x000Aß00008212L0208020x0200SQL_C_ULONGRpcServerUseProtseqEpExA4327L4((CHAR)0)14(BF_DIAGONAL | BF_TOP | BF_RIGHT)1MM_WOM_DONEGetTickCount()CharLowerA8310L0x170x048c"1.3.6.1.4.1.311.13.2.1"0x048b0x048aCharToOeßmA(-12)0x00000200L"2.5.29.3"00x04890x00010x0110x048f0x048e2579605L(TEXT("application/fractals"))0x048d60x000000080x00000003LTEXT("SeTakeOwnershipPrivilege")0x360x0000000bL0x000000172_HRESULT_TYPEDEF_(0ßx80010122L)0-21308L11ERROR_INVALID_PARAMETERmixerGetControlDetailsA20xF31104L(JOYERR_BASE+5)120x800000010x00039701L1901L0x00040000870x00x000100000x000000200x29A0x000000046010L1413L1(-14)469L6DECßLSPEC_IMPORT1128L0x020x00000100((() < ()) ? () : ())0x000001001152000x000B203LRGN_AND0x000002000x000002000x000000011827LSQL_INTERVAL_MONTHIMAGE_FILE_MACHINE_ALPHA64MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLIDß_PIAFS, MDM_PIAFS_INCOMING )((((ULONG)()) << 16) | ((ULONG)()))320x00040000AF_UNSPEC0x00510x00000008L"1.2.840.113549.1.9.20"0x800000000x00040x000010000x00021850LMAKEINTRESOURCE(23)0x8004011FL(0x00000001L)àß0x00004000LRegReplaceKeyA0x01000000163STATUS_FLOAT_INVALID_OPERATION14DWORD1L6V_UNION(, uiVal)0x004000000x100000000x00000002L0x00041329L90V_UNION(, bVal)0x010000004313L50(2 << 9)595((DWORD)-10)0xß00110x000C13V_UNION(, ulVal)(CERT_COMPARE_ATTR << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)0x08530x0000000382LNULL( 0x20 )RpcStringFreeA((UHALF_PTR)~0)V_UNION(, ullVal)0x00000001(PERF_SIZE_LARGE | PERF_TßYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER | PERF_DISPLAY_PERCENT)0xF09010x080B0x00000001L(DS_SETFONT | DS_FIXEDSYS)0x80000000L0x018A_HRESULT_TYPEDEF_(0x80110437L)10ßx02VarI4FromDate(0x0030 | XCLASS_BOOL )1774102CCSIZEOF_STRUCT(PROPSHEETHEADERA, pfnCallback)1460x02220x1024AddMonitorA42844210210x000000020x130x000000250x400000001165L57600_HRESULT_TYPEDEF_(0x8009300FL)ß(CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)0x0004014FL0x40((UINT)(UINT_PTR) () )(0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)(*(_INT32*)&)VerQueryValueA4320L4IID_IBindHost0x804331L_HRESULT_TYPEDEF_(0x80040110ßL)V_UNION(, pulVal)0x00008000420x0223CERT_FIND_VALID_ENHKEY_USAGE_FLAG0x0002(0x10)_HRESULT_TYPEDEF_(0x80020010L)0x00000400L0x00000100LNULL(-11)0x00000020L_HRESULT_TYPEDEF_(0x8004130FL)((WORD)0x0008)0x000E1ß23(0x00000007L)(0 != ( & CRL_DIST_POINT_ERR_CRL_ISSUER_BIT))0x01550x00001000L95001UL0x7(MCIERR_BASE + 9)IME_CMODE_NATIVE0x0000000025CoInternetCompareUrlwglUseFontOutlinesA0x040x000400000x0001_HRESULT_TYPEDßEF_(0x80110433L)CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)0x00010x80000000S_un.S_un_w.s_w2337_HRESULT_TYPEDEF_(0x800F0203L)((WORD)0x0001)0x00000001((WORD)0x0002)(0x4)39( 0x1 )(WM_USER ß+ 101)"CertDllVerifyCertificateChainPolicy"((WORD)0x0004)0x000820x0000002L_HRESULT_TYPEDEF_(0x8004016CL)180x000000020x10001(REG_OPTION_RESERVED | REG_OPTION_NON_VOLATILE | REG_OPTION_VOLATILE | REG_OPTION_CREATE_LßINK | REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK)_HRESULT_TYPEDEF_(0x80010001L)9005Lconst IID &FreeEnvironmentStringsA120x13TEXT("SeSecurityPrivilege")470x000000020xfVarI4FromDisp_HRESULT_TYPEDEF_(0x000302ß05L)10240x000000080x000000060x00000004GetClassNameA0x0200SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003)240x01000x20000x80000000LV_UNION(, cyVal)1(QS_MOUSEMOVE | QS_MOUSEBUTTON)"1.3.14.7.2"0x00000002(ALG_CLASßS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY)(WM_DDE_FIRST+2)0xF90x000000020x0006GetKeyboardLayoutNameA3((LPCSTR) 12)9L0x070x00300x0000005A_HRESULT_TYPEDEF_(0x80093013L)_HRESULT_TYPEDEF_(0x8001010EL)((DWORD )0xß80000004L)WriteConsoleA0x0850CoInternetQueryInfo0x0031_HRESULT_TYPEDEF_(0x80110411L)0x0000002014_HRESULT_TYPEDEF_(0x8004006CL)8465L0x800000080x8000000010x0008L320x00000002L0x000000010x00100x00001000SCARD_ßATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0005)0x00000800_HRESULT_TYPEDEF_(0x8004E003L)0x21607L2V_UNION(, puiVal)0x00020x3C6505011L40x019191826L((LPCSTR) 13)mciGetDeviceIDA7022L5017L(0x0080)6"2.16.840.1.101.2.1ß.1.7"00x10x0000004000x00000002L0x00A9TEXT("SchedulerThreadPriorityDefault")6((DWORD )0xC0000094L)36(MCIERR_BASE + 18)0x00000002L0x2GetDlgItemTextACOLOROKSTRINGA0x00000031MM_MOM_DONE(PERF_SIZE_ZERO | PERF_DISßPLAY_NOSHOW)0x04_HRESULT_TYPEDEF_(0x000401E4L)((HRESULT) (() | FACILITY_NT_BIT))1343L0x0080L600x000000220x000008000x001256L8470L0x000001000x0000002025075L0x000000000x00000200LSHGetDiskFreeSpaceExA40x000ß1L10V_UNION(, pbVal)"2.5.4.26"PostThreadMessageA3RpcStringBindingParseA0x41"1.3.6.1.4.1.311.10.3.4"4_HRESULT_TYPEDEF_(0x8004000EL)920x20x3CGUID_NULLV_UNION(, pvarVal)0x02(-2)0x08560x0010SetDlgItemTexßtA0x203((LPCSTR) 16)"2.16.840.1.101.2.1.1.8"0x015e_HRESULT_TYPEDEF_(0x80028CA3L)(MIDIERR_BASE + 4)2402_HRESULT_TYPEDEF_(0x80010131L)0x0002(0x00000004L)(* (double *) __double_min)0x0000000450x00028013L7050Làß0x000x0000000B0x0000000211_HRESULT_TYPEDEF_(0x80041313L)0x05TEXT("DNSMachineName")(( HKEY ) (ULONG_PTR)((LONG)0x80000003) )3410045L7012L0x00008000L0x000110x00000100((BYTE)0x02)_HRESULT_TYPEDEF_(0x80040160L)EßRROR_OUTOFMEMORY58L( sizeof()==8 ? *(1+(_INT32*)&) : (*(_INT32*)&))VarUI4FromCy2STATUS_IN_PAGE_ERROR STDMETHODCALLTYPE0x00001E00SNDMSG(, PSM_GETRESULT, 0, 0)0x0002"1.3.14.3.2.29"0x0001_HRESULT_TYPEDEF_(ß0x80028027L)65L0x002300000x00010000L39_HRESULT_TYPEDEF_(0x8011043BL)5015L0x0007ffff1L".Default"0x00000001L2(DWORD)0x00BB0226STATUS_FLOAT_OVERFLOW((LPCSTR) 500)(SND_ALIAS_START + (DWORD)(BYTE)() | ((DWORD)(BYßTE)() << 8))_HRESULT_TYPEDEF_(0x800401FCL)6HRESULT STDMETHODVCALLTYPE11CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)8860x0001((LPARAM)(DWORD)MAKELONG(, ))3EnumSystemCodePagesA0xE42ß1237LSTATUS_GUARD_PAGE_VIOLATIONSCARD_ATTR_VALUE(SCARD_CLASS_PERF, 0x0003)0x0008LDECLSPEC_IMPORT391UL0x400006PSM_SETHEADERTITLEA0x206870x0002000010106L380x01014((DWORD)-1)_HRESULT_TYPEDEF_(0x80110408L)505ß2L1017L0x00000400L0x000000010x0400L630x00000010L_HRESULT_TYPEDEF_(0x80030050L)( 0x0020 )0x047c20x047b0x00030x047a0x00060000(MMSYSERR_BASE + 5)0x0479(MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_DECIBßELS)0x047f240x015138506L8355L5065L1215LFindExecutableA0x047e"SysItems"0x2000((LPCSTR) 45)0x0000000040x047d267L((LONG)(((WORD)((DWORD_PTR)() & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)() & 0xffff))) << 16))ßVarI4FromUI40x0000000f(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_EPHEM)0L_HRESULT_TYPEDEF_(0x000401A0L)13L((DWORD )0x80000003L)0x00081831L0x040000000x00040(0x00000020L)0x014B0x00040x00000008L136_HRESULT_ßTYPEDEF_(0x00040200L)1424L50x00008000LSQL_TXN_CAPABLE0x00020000MS_DEF_RSA_SIG_PROV_A0x0027182L0x006000000x010x00000200AF_UNIX0x0020_HRESULT_TYPEDEF_(0x80110413L)30xFASetVolumeLabelA0x00000002_HRESULT_TYPEDßEF_(0x8009001CL)LPIINTERNETPROTOCOLINFO17(MCIERR_BASE + 86)489018L_HRESULT_TYPEDEF_(0x00040202L)0x0366(MCIERR_BASE + 26)1444L122L((() > ()) ? () : ())GlobalFindAtomA0x000400000x000220x0000000eL_HRESUßLT_TYPEDEF_(0x8009310AL)(MCI_CD_OFFSET + 0)170x000001000x3C40x2b0x000000010x000200000x00040x000000040x00010x00010x00000100L(PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX)(WM_ßDDE_FIRST+3)TEXT("SeSyncAgentPrivilege")__declspec(selectany)"2.5.29.14"0x80000000NULL(LONGLONG)((LONGLONG)(LONG)() * (LONG)())0x0004ImmGetRegisterWordStyleA191L(-3)0x000000010x00801161L9(~(DDE_FACKREQ | DßDE_FDEFERUPD))0x8004013FL0x0002(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_AGREED_KEY_ANY)0x00000000L(DWORD)0x00EE0086_HRESULT_TYPEDEF_(0x80110423L)0x00100x0002(-20)9616L0x00000008"1.3.14.3.2.8"0x00000001L0x000ß00080L33728522L"1.2.840.113549.1"20x0100000040x01000000L(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)11(DCB_RESET | DCB_ACCUMULATE)5049L0x00CF8201L0x00000006L_HRESULT_TYPEDEF_(0x00041305L)(MIXERCONTROL_CT_CLASS_NUMßBER | MIXERCONTROL_CT_UNITS_PERCENT)0x00000002LUILANGUAGE_ENUMPROCA0x000000294((LPCSTR) 2)0x00000100L0x00030003L0x00000020((STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIßZE))__stdcall0x001CRGN_COPY6000L8SQL_SEARCHABLE40x000000100x800401BFL40x000700000x00040x00100x003F0x000400000x800401C0LWM_WININICHANGE0x01020x00200000L1614L11"1.3.6.1.4.1.311.10.6.2"12VarUI4FromStrß_HRESULT_TYPEDEF_(0x8009202CL)_HRESULT_TYPEDEF_(0x80080009L)_HRESULT_TYPEDEF_(0x80004008L)virtual HRESULT STDMETHODCALLTYPE 200(DWORD)(((() << 8) & 0xFF000000) | ())0x0008180x00000034121909L0x010x000000200ßx000000350x000000360x00004000LMIDL_user_free0x000000377008LSQL_MAX_INDEX_SIZETA_TOP0x000000310x0200L0x000000320x000000010x00000003L0x000000330x00004000L0x0166170x0000000971626L0x0000000FL0x00000004L0x00ß004005L0x0004012FL0x00000080(MCIERR_BASE + 36)5001L{0,0,0,0,0,5}1140x000000020x01007013L510x000000110x00F00x0501MAKEINTRESOURCE(1)1( 11 )((()&MDM_MASK_PROTOCOLINFO ) |((()<Buffer)++; }0x00070x00000001L0x00000100LEnumPrinterDriversA"2.16.840.1.101.2.1.ß1.11"0x000000010x07FF0x000000068510L28far11801L0x080C0x00800000L_HRESULT_TYPEDEF_(0x80110410L)0x0000020003520x0000L0x2()->tv_sec = ()->tv_usec = 00x00000004L0x1e1009V_UNION(, bstrVal)0x00000004_HRßESULT_TYPEDEF_(0x800F022FL)0x000004000x800000000x000eGetCompressedFileSizeA_HRESULT_TYPEDEF_(0x80040166L)0x000A0x010000000x00000020L0x00000008L0x000000021415L0x200000000x00000x0000040054(MCIERR_BASE + 44)0xß800401DFL0x0040836_HRESULT_TYPEDEF_(0x8009200BL)8552L1254L1452L0x000000370x00080x0143__stdcall0x40000000110x800008001511(-4)((DWORD)-11)0x00000008L171CallMsgFilterA1155L0x0003335_HRESULT_TYPEDEF_(0xß80040151L)0x00000001L0x000000100x8000290x0007(0x3<<6)0x00800x0F27((DWORD) 'V')90x01817011L((LPCSTR)1)870x0080LLookupAccountSidA320x520x000000080x00D7770x00BE140x00000004L0x00002000_IOR('s', 7, u_loßng)84CertOpenSystemStoreA(MCIERR_BASE + 24)COLOR_BTNFACE950xF0800x000004000x0004((void) 0)0x10x800000x4000VarUI4FromUI40x00020000LLPOPENCARDNAME_EXA((LPCSTR) 34)515VarUI4FromUI20x00001D06(MCIERR_BASE + 9ß3)8317LCommConfigDialogA0x000000100x0000010190x00800000LVarUI4FromUI1"2.16.840.1.101.2.1.1.17"(MCIERR_BASE + 31)0x00000800DECLSPEC_IMPORT0x00000001LSCARD_CTL_CODE( 3)ChooseColorA0x000000010x01A00x100000100àß0x3002DialogBoxIndirectParamASQL_U_UNION_ALL0x000E0x020x00000005L0x00000001L_HRESULT_TYPEDEF_(0x800F0222L)((LPCSTR)3)DefineDosDeviceARpcNsProfileEltInqBeginA0x00000000L50x200000000x00000001LBuildCommDCBAndTimeßoutsA((INT)(INT_PTR) () )00x000000590x08002560x4000000021169L0x000000080x00010x0c30x598558L((DWORD)0x00000020)1099380x00011260x000017ff0x40100x030x00000000L-10x0080L230x00000200L9651L((DWORD )ß0x40010008L)20x8004015FL9614L0x0008__try {BN_HILITE21629L0x00FF0x0040_HRESULT_TYPEDEF_(0x80100009L)0x00090x011F0x110(TEXT("image/x-png"))0x6E0x1000260x08000x02L0x00000004BeginUpdateResourceA0x00004000àß183161100x00FF"TimeValidDllGetObject"0x00013((DWORD)0x00000080)20x40000x800401A0L10064L0x002016628548L17(MCIERR_BASE + 85)0x0001TEXT("SeTcbPrivilege")(0x0001)1PSM_SETFINISHTEXTASIZE_MAXSHOW_HRESULT_TßYPEDEF_(0x800B0002L)"Synthesis SyncML Client/" SYSYNC_FULL_VERSION_STRING " [en] (" SYSYNC_PLATFORM_NAME "; I)"_HRESULT_TYPEDEF_(0x800F0001L)8402L(0x0000000AL)0x00000004L"1.3.6.1.4.1.311.10.7.1"39704L0x000000080x00ß100000SQL_CB_CLOSE0x00000001L0x0000003(TEXT("video/avi"))2ULCreateAcceleratorTableA(0x7<<3)"2.16.840.1.101.2.1.1.9"0x00000000L0x0010L(SQL_C_LONG+SQL_UNSIGNED_OFFSET)1MF_MENUBARBREAK1455L3UL1_HRESULT_TYPEDEF_ß(0x80010111L)0x00400000LPSCARD_READERSTATEWGetCurrencyFormatA0x00008000L60x010000000x0187320x400x00000800EnumPrinterDataA((LPCSTR)1)40x000004000x10000000L0x10080x00000004_HRESULT_TYPEDEF_(0x80070057L)0x000ß00020SCardListCards0x000000020x00000400L_HRESULT_TYPEDEF_(0x80093108L)_HRESULT_TYPEDEF_(0x80093103L)20x00000100L0x0285((VARIANT_BOOL)-1)_HRESULT_TYPEDEF_(0x8009300AL)SCardRemoveReaderFromGroupALPSCARD_READERSTATEßA0x00000001_HRESULT_TYPEDEF_(0x80030008L)2005L"OffloadModExpo"_HRESULT_TYPEDEF_(0x80100014L)11520x00100x2000130x00000008{ *() = *(*(char __RPC_FAR * __RPC_FAR *)&()->Buffer)++; }8544L0x00008000L118L0x0040ß1381L1379L0x00010x00020x00004006L0x8000GetTextExtentExPointA0x02FB(MCIERR_BASE + 45)_HRESULT_TYPEDEF_(0x8010001CL)1075LGetObjectA84326L0x00001000"2.16.840.1.101.2.1.1.16"0x000010000x00000008__stdcall0x000dàß_HRESULT_TYPEDEF_(0x800F0210L)1L0x0194(MCIERR_BASE + 81)1018326L(0x7fffffffffffffff)320x0210001CryptAcquireContextATextOutA0x00002000LTabbedTextOutA143L0x00040000L255CharUpperBuffA0x020000x0008140x0000ß10090x00060x00000010L24210L11114L0xffff211073L_HRESULT_TYPEDEF_(0x8001012DL)SQL_QU_TABLE_DEFINITION0SECURITY_ENTERPRISE_CONTROLLERS_RIDSetWindowsHookExA11158LSTATUS_USER_APC1150x001F(-1)0x00004009L114ß38471L1398LSQL_OJ_CAPABILITIES(SOCKET)(~0)39L(-5)0x000401F0L210x000000080x0800(MMSYSERR_BASE + 21)186L(STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHROßNIZE)1050x0000020010_HRESULT_TYPEDEF_(0x80090310L)8357L0x01000000(CONTEXT_i386 | 0x00000020L)0x00000002_HRESULT_TYPEDEF_(0x80093020L)5024L0x00023L169"1.3.6.1.5.5.7.48"0x00000001sndAlias('S', '!')RegisterClaßssExA(MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_UNSIGNED)0x01969((WORD)0x0010)156280x10x0000000AL0x00000008(0x00000223L)2(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELßTA_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)3011LSQL_ROW_NUMBER_HRESULT_TYPEDEF_(0x80093017L)0x00000008L_HRESULT_TYPEDEF_(0x8009000AL)0x00040150Làß0x00000200L50x00005045L((HFILE)-1)((LPCSTR) 13)(2U << 8)7MAKEINTRESOURCE(16)10x00000001L0x01210022(WM_USER + 116)0x0008GetDriveTypeA10190x00000800L(int)SNDMSG(, PSM_HWNDTOINDEX, (WPARAM)(), 0)(PSN_FIRßST-9)4"File"0x158395L0x0000000dL(0xFFFFFFFF)20x800x0002(GMEM_MOVEABLE | GMEM_ZEROINIT)0x00000x00000008ERROR_NOT_CONNECTED150x00000001L(-()+SQL_LEN_BINARY_ATTR_OFFSET)0x0008L0x00078239L0x000000800x000Cß0_HRESULT_TYPEDEF_(0x8000FFFFL)213_HRESULT_TYPEDEF_(0x800F0223L)_HRESULT_TYPEDEF_(0x80093003L)1459L2212985_HRESULT_TYPEDEF_(0x80090012L)_HRESULT_TYPEDEF_(0x80010112L)70x0010()"ExpoOffload"60U0x04ff13ß0x000000200x00020x00000010L88556L0x00110110xFFFF000054IInternetBindInfoCryptRetrieveObjectByUrlA519GetWindowLongA0x00004002L_HRESULT_TYPEDEF_(0x80092008L)(((long)() & 0xc0000000) == 0x80000000)18(((long)(ß) & 0xe0000000) == 0xc0000000)905(((long)() & 0x80000000) == 0)30UL8"2.16.840.1.113730.1.7"123444VarUI4FromDec11"2.5.8.1.1"L"Microsoft Strong Cryptographic Provider"_HRESULT_TYPEDEF_(0x800F0213L)0L0x00000ß002L50x00100x0004SQL_MAX_DRIVER_CONNECTIONS(3 << 9)10043L39VarR4FromUI4_HRESULT_TYPEDEF_(0x800C000BL)1904L(WM_USER + 134)ERROR_INVALID_USER_BUFFER_HRESULT_TYPEDEF_(0x80097005L)DeletePrinterKeyA'USRC'"Microsofßt Strong Cryptographic Provider"0x670x80000x020000000x000500000x66((STATUS_ABANDONED_WAIT_0 ) + 0 )( (() & 0x40000000) )((DWORD )0xC0000005L)0x00002000L0x65_HRESULT_TYPEDEF_(0x80020004L)0x00CC0x641433L0x630ßx000C0x00080x62MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_GPRS, 0 )__cdecl20x610x60DMBIN_FORMSOURCE_HRESULT_TYPEDEF_(0x8011041AL)0x00008000L0L0x000B00000x000401D0L0x00000008LSC_GROUP_IDENTIFIERA0x000000010x000a20àß0x692L0x00010x680x0003L1922L"CertDllEnumSystemStore"0xA5mmioRenameA7SetComputerNameA5018L2_HRESULT_TYPEDEF_(0x80100028L)1SQL_CONCUR_ROWVER0x40x70068232LLPIINTERNETPROTOCOLSINKMAKEINTRESOURCE(32642)RegistßerClipboardFormatA3007L((DWORD)(BYTE)() | ((DWORD)(BYTE)() << 8) | ((DWORD)(BYTE)() << 16) | ((DWORD)(BYTE)() << 24 ))__declspec(uuid())_HRESULT_TYPEDEF_(0x8009310CL)POINTER_320x00000100waveOutGetErrorTextAß0x0000(0x0008)0x000900000x04000x00020x000000200x400e0x000000200x010x000E(MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT))6((LPCSTR)3)8344L0x00000800L700x08(3U << 8)SQL_COLUMN_TABLE_NAME0x160x00000080ERROR_ALREßADY_INITIALIZED00x00140x00004002L9__stdcall0x00000200L20x0E_HRESULT_TYPEDEF_(0x8002000AL)1012(CDM_FIRST + 0x0002)0x012020x02141812L8327L0x810000003417"1.3.6.1.4.1.311.17.2"0x800401B0Lasm_HRESULT_TYPEDEßF_(0x80041310L)SQL_MAX_CURSOR_NAME_LEN0x1007(0U-601U)AF_BAN(-2)(0x0100)1727L650(( == PARTITION_EXTENDED) || ( == PARTITION_XINT13_EXTENDED))11156640x000080000x00018462L0_HRESULT_TYPEDEF_(0x8002000BL)0xß0020_HRESULT_TYPEDEF_(0x80100002L)_HRESULT_TYPEDEF_(0x8009302BL)VarI4FromUI40x00000004(5 << 9)164L0x0004L0IMAGE_ORDINAL_FLAG320x00000100L9004L0x000C"2.5.29.19"0x00010000_HRESULT_TYPEDEF_(0x80093109L)0x012C17àß0x00002000L0x000000040x000000086CERT_STORE_PROV_SMART_CARD_W0x00000080L1(MCIERR_BASE + 87)70x01F98256L(((uInt32)SYSYNC_VERSION_MAJOR<<24)+((uInt32)SYSYNC_VERSION_MINOR<<16)+((uInt32)SYSYNC_SUBVERSION<<8)+(uInt32)SßYSYNC_BUILDNUMBER)(DWORD)0x003300080x0004(0x20000000L)24(WM_USER + 128)0x00010x00000100L(MCIERR_BASE + 82)0_HRESULT_TYPEDEF_(0x800B0004L)13SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0206)1454L1225L(-1)((DWOßRD )0x40010004L)5_HRESULT_TYPEDEF_(0x8002802BL)4201Lmemset(,,)CERT_STORE_PROV_SYSTEM_W_HRESULT_TYPEDEF_(0x800C0007L)320x00000002_HRESULT_TYPEDEF_(0x80100016L)110x0b(0x00000001L)0x00060x0000000cL00x000dàß0x00000800LSCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0204)"2.5.4.11"_HRESULT_TYPEDEF_(0x8002000CL)0x00004000SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0203)"2.5.4.18"RpcNsEntryExpandNameA0x00000001210x0000000ß2L0x03FF191624L0x000100000x00020000L30x00001600(WM_USER + 127)0x410067L0x7ffe8320L4096SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0205)0x0000002a0x00000400l0x0000100C200x00000800103_HRESULT_TYPEDEF_(0x8ß0040169L)8550L5006L(((()&~N_BTMASK)<= 0)1SQL_INTERVAL_MINUTE_TO_SECOND-10x3030x0000010054REGISTERWORDENUMPROCA((DWORD)0x00000004)MapVirtualKeyExA23MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_DATA ( MßDM_X75_DATA_BTX ) )lstrcmpA"CertDllUnregisterPhysicalStore"0xC0000000CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)(CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID << CERT_SYSTEM_STORE_LOCATION_SßHIFT)160x00000200400x01003(NULL)_HRESULT_TYPEDEF_(0x80092001L)0x012E0x000080005041L0x200x00000010790x0006SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0002)10x00000002L"1.3.14.3.2.16"(PERF_SIZE_DWORD | PERF_TYPE_ßNUMBER | PERF_NUMBER_HEX | PERF_DISPLAY_NO_SUFFIX)((DWORD)0x00020000)9007L0x00040000LSQL_ALL_EXCEPT_LIKE(2*4)0x000000000x0001(BDR_SUNKENOUTER | BDR_SUNKENINNER)0x00200x00000005L0x4b0x00000007L1322L"2.5.29.17"(ß(BYTE)(((WORD)()) >> 8))SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, 0x0131)0x0000000FL0x022141_HRESULT_TYPEDEF_(0x80093027L)0x1000x00000002L108(MMSYSERR_BASE + 17)1328L0x00000024160x0D0x25_HRESULT_TYPEDEF_(0xß8000400CL)0x00000008L1747L0x4011_HRESULT_TYPEDEF_(0x80110448L)_HRESULT_TYPEDEF_(0x800F0205L)10013L8468LCERT_FIND_SUBJECT_STR_W(int)SNDMSG(, PSM_IDTOINDEX, 0, (LPARAM)())0x00000002L_HRESULT_TYPEDEF_(0x80030070Lß)8554L( 1 << CERT_QUERY_CONTENT_PFX)8480LGetVolumeInformationADeleteFileA0x000x00000200L"1.2.840.113549.1.9.16.3"0x0000(LMEM_FIXED)00x020A800x001011456L(0x40)51L(1 << CMSG_HASHED)SHInvokePrinterCommandA0ßx0003L0x00100000LCharToOemBuffA8331LOpenPrinterA(0U << 8)0x000040000x0000001FL9SQL_NUMERIC2(-3)0x000000400x000000080x00000004L0x0e0x57"0"MapVirtualKeyA1363L8_HRESULT_TYPEDEF_(0x800F020AL)SQL_INTERVAL_DAßY_TO_MINUTE_HRESULT_TYPEDEF_(0x80097007L)10052L9751L8304L0xEC0x00350x00040000L0xED10xEB1302L0x00000000L0x0fMM_WOM_OPEN1377L((DWORD)0xE73CF52E)::std0x00080000L_HRESULT_TYPEDEF_(0x800F0209L)0x00x37SCARD_AßTTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303)(WORD) -11_HRESULT_TYPEDEF_(0x8001FFFFL)1431L1040MAKEINTRESOURCE(32514)0x7fff{ ().x = (LONG)(SHORT)LOWORD(*(LONG*)&); ().y = (LONG)(SHORT)HIWORD(*(LONG*)&); }1749L1ß10MDM_SHIFT_BEARERMODE0x40x00000026(MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN)0x0000000BL144001L0x00000002_HRESULT_TYPEDEF_(0x8000000AL)IID_IInternetProtocolRoßot"2.16.840.1.113730.1.3"0x0000400AL40x00000009290x01010x00080000L18240x00004008Lunsigned short0x010x000200000x000000011808L0x0000000C0x00040000L8008L_HRESULT_TYPEDEF_(0x800C000EL)VarI4FromUI20x00000001"ß2.5"(MCIERR_BASE + 25)10070L275LVarI4FromUI10x000000000x0800000070((LPCSTR) 35)VarI4FromUI4(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)8533L59510109L0x04000x00000002L0x030F8373L00x0000000155242640x000ß80000L0x10000x00200000(MMSYSERR_BASE + 18)8484L19"EncodingType "(MCIERR_BASE + 48)DeletePrinterDataA4121_HRESULT_TYPEDEF_(0x80110401L)91(-4)TEXT("SeCreatePagefilePrivilege")CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, ßMETHOD_BUFFERED, FILE_ANY_ACCESS)0x00004003L103( 0x1 )1110x00F70x0000004L(MCIERR_BASE + 49)_HRESULT_TYPEDEF_(0x80090309L)104VarUI4FromUI439(0x00000001L)0x00100x00080x08000000L0x000000226002L1715L1250L0xß00000400MAKEINTRESOURCE(3)2TEXT("printStaplingSupported")0x010x00000008L4_MSL_LOCALE_C"1.3.14.3.2.20"3GetCommandLineALPOPENCARDNAME_EXW"1.3.6.1.5.5.7.3.2"3SEC_E_UNSUPPORTED_FUNCTION8014L30x01850_P_OVERLAYß0x00000001(0x8000)7016L1077L0x00004000L60x000000029703Lextern "C" {0x00000100L10x00000008L11851641100x00010000L20x000000020x00040x0844InitiateSystemShutdownExA0xE6ObjectDeleteAuditAlarmA0AppendMenuA0ßx08031((unsigned long)() >> 31 == SEVERITY_ERROR)(0x1)0x00000001OutputDebugString1710L0x00040x800000000x0100256( 0x80 )(MIDIERR_BASE + 3)14"CryptDllFindLocalizedName"IInternetProtocolSinkStackable40L160ßx050050x0004015FL(GMEM_FIXED | GMEM_ZEROINIT)0x00004000L((LPCSTR) 7)0x00000002L0x000000080x000000040x0010_MSL_CLOCKS_PER_SEC0x208328L((DWORD )0xC0000025L)1lstrcpyA((HWND)0xffff)0x4653504540980x000000100x0ß100((LPCSTR) 8)0x00004006L0x0040L( 0x80000000 )(-2)1919L0x000000100x0922134L0xFFFFFFFFL16890x01359FILE_SUPPORTS_ENCRYPTION991(~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS))160x080x042d_HRESULT_TYPEDEF_(0x800ß0401DL)10x042e0x000000000x3C20x042f_MSL_OFFSETOF(, )VarCyFromI40x00001A019617L110x042930x8000130x042a13_HRESULT_TYPEDEF_(0x8004130BL)0x042b1168L0x042c0xFFFFFFFFCTL_CODE(IOCTL_CHANGER_BASE, 0x0007, MßETHOD_BUFFERED, FILE_READ_ACCESS)0x00000010L90x01110x80040130LMS_ENH_DSS_DH_PROV_A718140x100721150x00000002_HRESULT_TYPEDEF_(0x80110425L)60x80000x080x00000002LObjectPrivilegeAuditAlarmA0x00000001_HRESULT_ßTYPEDEF_(0x800401C4L)4CERT_STORE_PROV_LDAP_W120x00F60x040x040x000000020x6F0x00000080((WORD)0x0800)0x800000200x000000404110((LPCSTR) 2)0x0000000DL21L0x00018409L((LPCSTR) 47)80x000400001348L0x00000001LPßrinterMessageBoxA8466L(LMEM_MOVEABLE)TEXT("printerModel")MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_DEFAULT, MDM_HDLCPPP_ML_2 ) )1630x000401DFßL60x00000024_HRESULT_TYPEDEF_(0x80100003L)MAKEINTRESOURCE(32641)0x002ECERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED118254L3"commdlg_LBSelChangedNotify"0x0000000119_HRESULT_TYPEDEF_(0x800Bß010BL)0x0003000A_HRESULT_TYPEDEF_(0x80029C83L)0x00000001((LPCSTR) 8)(MCIERR_BASE + 32)(0x0020)0x00000002L9(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_ßDISPLAY_PERCENT )0x100b0x00000100L0x3C80x00000042CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)0_HRESULT_TYPEDEF_(0x8010001BL)0x0000000B0x80000x100x00020000l0x00000008((DWORD )0xC000009ß5L)L"commdlg_LBSelChangedNotify"195L240x00000001L0x00180x00000001(0x00000003L)0x000000200x0001_HRESULT_TYPEDEF_(0x80010004L)0x00000001NO_ERROR6(MIXERCONTROL_CT_CLASS_TIME | MIXERCONTROL_CT_SC_TIME_MILLISECS | MßIXERCONTROL_CT_UNITS_UNSIGNED)WNetCancelConnectionA1451LTRUE0x00000004L0x01004210x00B52sz_CERT_STORE_PROV_SMART_CARD_W92(STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMßERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG)2L0x000200VarBoolFromI4CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00020000L0x30x420x00002ß000L0x00000002400x0D181072L0x001F0x47(DRV_MCI_FIRST + 0x400)0x00000080L0x040xC00000000x0000000108423L0x000000040UL0x000000020x00020000L0x0227"1.2.840.113549.1.7.1""2.5.29.18"GetEnhMetaFileDescriptionA0ßx00040000"synthesis.ch\\SySyncLib"MM_MOM_OPEN120x01000x0000008L0x10x00200000DlgDirSelectExA0x00000040L_HRESULT_TYPEDEF_(0x00040100L)0x00000002L811410LLookupPrivilegeNameA0x004040x000401EFLSendNotifyMessageßAWH_MAX"1.2.840.10040.4.1"SQL_TIMESTAMP(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)SQL_QU_INDEX_DEFINITIONSQL_INTERVAL_YEAR_TO_MONTH8312L1442ßL1UL0x0000000480x01000x40000000GetNumberFormatA0300x00000010L2(WAVERR_BASE + 1)SPI_SETSCREENSAVERRUNNING_HRESULT_TYPEDEF_(0x80090002L)_HRESULT_TYPEDEF_(0x00041304L)0x0008ImmIsUIMessageA98501830LNULLLoadIcßonARegisterServiceCtrlHandlerExAEnumServicesStatusExA0x00004003L0x00000100L0x00000001L0x3D30x00000100DM_UPDATETEXT("SeIncreaseBasePriorityPrivilege")__declspec(dllimport)0x00000200_HRESULT_TYPEDEF_(0x80100023L)RßegQueryInfoKeyA0x000000021(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_SKIPJACK)0x000010000x00018(0x3)0x1820490x00000000TEXT("SeLockMemoryPrivilege")X509_ENUMERATED0x700x0000000111EXTERN_C DECLSPEC_IMPORT ß STDAPICALLTYPE0x00010x04000x000000040x0000000F_HRESULT_TYPEDEF_(0x800F021BL)4303L(__std(va_list)) ((long) (&) + ((((long) (& + 1) - (long) (&))+3)/4*4))(100 + SQL_CODE_DAY_TO_SECOND)CERT_RDN_DISABLE_CHECK_TYßPE_FLAG0x000000100x00000001L(LMEM_FIXED | LMEM_ZEROINIT)1361213L0x00020x00000x00000080L9761615L"Topics"0xffffSQL_COLUMN_UNSIGNED31480x00001607(TEXT("image/x-xbitmap"))_HRESULT_TYPEDEF_(0x800401F5L)1792Lß0x00000004L600x0000001000x4003_HRESULT_TYPEDEF_(0x80092026L)0x00080000GetFileVersionInfoADM_PROMPT( 0 )0x0010TEXT("RetryPopup")_HRESULT_TYPEDEF_(0x80093134L)1796L0x0000000c0x08040x0000001011603L1007_HRESULßT_TYPEDEF_(0x80096005L)GetClassInfoA6CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\EFS"SQL_DOUBLE100x004000000x0000000C0x10(CERT_SYSTEM_STORE_CURRENT_SERVICE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)"CryptMsgDllImportKßeyAgree""1.2.840.113549.1.7.5"_HRESULT_TYPEDEF_(0x80091011L)6MMIO_WRITE0x0008580x1"1.3.14.3.2"AF_APPLETALK0x000000020x215040x0830WNetAddConnectionA0x000000048610x00040000L7EnumSystemLocalesA118492L0x00ß002000L0x0100"2.5.4.24"0x0000002((HCURSOR)CopyIcon((HICON)()))_HRESULT_TYPEDEF_(0x80040156L)0x000F10x800x20x000000400x00001000L15VT_RESERVED_HRESULT_TYPEDEF_(0x80010104L)0x0000000CL0x04170x00ff0x04180x00ß00_HRESULT_TYPEDEF_(0x80100068L)0x000000080x0001ERROR_CONNECTED_OTHER_PASSWORD500_HRESULT_TYPEDEF_(0x8011043FL)_HRESULT_TYPEDEF_(0x80010116L)0x00000200L(1 << VT_UI4)100x04130x00520x10(TEXT("text/plain"))0x0000ß00020x04140x04150x04160x00000080L0x0000000214538307LSECTION_MAP_READ(1 << VT_UI1)15410x04100x00100x00001000(1 << VT_UI2)"2.5.4.38"0x04112380x04120x0000001C0x00000080_HRESULT_TYPEDEF_(0x800B0101L)0x0000ß00215044L0x00811112LMAKELONG((),0x10FF)0x001D00000x80040120L((BYTE)0x00)0x01023SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0140)__declspec(dllimport)(STANDARD_RIGHTS_WRITE | JOB_ACCESS_ADMINISTER)MM_MIM_CLOSE(1ßU << 1)DNS_ERROR_RCODE_BADTIME1321L(-125)21(0x00000001L)320CreateFileMappingA((DWORD)0x00000010)"CertDllRegisterPhysicalStore"0x430x001000002340x00010000L1ERROR_UNEXP_NET_ERR((DWORD)0x0002)false00x22(-1ß0)0x1002SHGetFileInfoA((LPCSTR) 50)((DWORD )0x80000002L)20x1595023L124L(_GetThreadLocalData(_MSL_TRUE)->errno)RPC_S_INVALID_TAG0x00040170L_HRESULT_TYPEDEF_(0x80097013L)(MIXERR_BASE + 2)0x800051060x0f40961ß2L0x000000041797L1067L_HRESULT_TYPEDEF_(0x80041309L)(TEXT("image/pjpeg"))61417L0x100x000000105312011LFindResourceExAthrow ()63L435RpcNsProfileEltInqNextA0x000000100x00000080"1.3.6.1.5.5.7.3.6"357(ß() == CRYPT_FAILED)_HRESULT_TYPEDEF_(0x8010006DL)0x00000001L1SQLUINTEGER0x000100000x0000L90x00000001L180x0010L2L"2.16.840.1.101.2.1.1.13"0x0FFF0x000130x00010x0000midiOutGetErrorTextAMM_MOM_CLOSE50x000ß00004L0x01B0513MAKEINTRESOURCE((ULONG_PTR)RT_ICON + DIFFERENCE)0x00000001L(TEXT("video/x-msvideo"))10x00040x270L320x00100000_HRESULT_TYPEDEF_(0x80010134L)0x10000x1000L_HRESULT_TYPEDEF_(0x80091010L)1ULFILEOKSßTRINGA0x0010000070x00000100L10110x00000001((LPCSTR) 1)0x000841156_HRESULT_TYPEDEF_(0x80090005L)740x00000002LWSAHOST_NOT_FOUNDS_un.S_un_b.s_b14304L311MCI_DEVTYPE_SEQUENCER5312100x0000004020x00004002LMßultinetGetConnectionPerformanceA(FILE_ANY_ACCESS)25109712L(0x00000201L)SCardConnectA( 0x1 )0x00002000L_HRESULT_TYPEDEF_(0x8001010AL)345(CDN_FIRST - 0x0002)0x00004001LEnumPropsA(TA_BASELINE+TA_CENTER+TA_UPDATECßP+TA_RTLREADING)8012L0x4110071606L0x000000010x000000010x0400STATUS_FLOAT_INEXACT_RESULT0x7f0000010TEXT("SeIncreaseQuotaPrivilege")0x00000080L45800x00000030L18444L1769L(0x00000002L)00x0100CTL_CODE(IOCTßL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)94TEXT("SeBackupPrivilege")0x020x000000030__stdcall16210x0022000020x10040x6D75::0x00000001DRV_MCI_FIRST_HRESULT_TYPEDEF_(0x800F021DL)(-6L)FW_NORMAL1ß783LTEXT("printSpooling")0x00020000L0x00000020L3989753L((LPCSTR) 24)0x014A0x00010x00004006L0x00040000L_HRESULT_TYPEDEF_(0x800401FBL)(THREAD_PRIORITY_HIGHEST-1)0x11F((LPCSTR) 31)0x00000800l"2.16.840.1.101.2.1ß"CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)MUTANT_ALL_ACCESS(GCS_COMPREADATTR|GCS_COMPATTR)(()->)void_HRESULT_TYPEDEF_(0x8001011BL)0x0001((DWORD)0x00000010)111((DWßORD )0x40000005L)01UL0x00010x10000x000200009710x298559LGetProfileIntA_HRESULT_TYPEDEF_(0x80090017L)"1.2.840.113549.1.9.15"0x40000x00020U0x0004103RpcNsBindingLookupBeginA0x070x00080x0000000BL_HRESULT_TYPEDßEF_(0x80040111L)030UL0x0040_HRESULT_TYPEDEF_(0x80091006L)0x21440x0419_HRESULT_TYPEDEF_(0x80092025L)_HRESULT_TYPEDEF_(0x8001010BL)0x00000008L_HRESULT_TYPEDEF_(0x00090313L)40x2E2"CryptDllExportPrivateKeyInfoExß"14330x040x400x00100x00000020x00000010L0x00000010L0x00000200_HRESULT_TYPEDEF_(0x80040154L)0x00000040WNetGetResourceInformationA28(0x0008)VarI4FromDec1820LLC_ALLRegisterEventSourceA160x00000003L12L0x0000ß0002_HRESULT_TYPEDEF_(0x80110602L)CERT_STORE_PROV_FILENAME_W0x000000080x10000000_HRESULT_TYPEDEF_(0x80100069L)0x00120000const IID &0x00000004(MMIOERR_BASE + 12)0(MIXERLINE_COMPONENTTYPE_DST_FIRST + 5)1WNetGetProßviderNameA8539L0x00000002__stdcall1118451L1211002SQL_WVARCHAR0x0001L8251L0x050x10000SCARD_CTL_CODE(12)_HRESULT_TYPEDEF_(0x8004E007L)0x00081726LSECTION_MAP_WRITE4ERROR_RETRY4_HRESULT_TYPEDEF_(0x8011044ßDL)0ULERROR_TIMEOUT1925L(0xC0000004)SQL_COLUMN_DISPLAY_SIZE0x00008214LEnumServicesStatusA(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4)32(MAXLONG)1370x00000004L0xFFFFFFFF1090x000000020x00000000L0x02098252L0x000Cß0x00000008ScrollConsoleScreenBufferA20(__std(wint_t))(0xFFFF)ImmUnregisterWordA0x40000000PERF_LARGE_RAW_BASE20x6A(()=VerSetConditionMask((),(),()))(0x00000002L)PostMessage(, PSM_SETWIZBUTTONS, 0, (LPARAMß))(-2)1BackupEventLogA0x0050CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)0x02001317L0x40000x1((LPCSTR) 6)10x08000000L10885(* (long double *) __extended_epsilon)0x0080191160x0020àß0x000000040x0000001060x001A0x0007374_HRESULT_TYPEDEF_(0x80030020L)1230L68520x0020SQL_CONCURRENCY20x000000030x0001_HRESULT_TYPEDEF_(0x8011040FL)0x00004000L1"1.3.14.3.2.3"0x00023012L0x0000002030x045078ßL1621L0x080x000008000x140x00004000( 0x1 )CertAddEncodedCertificateToSystemStoreA0x00100x00008000_HRESULT_TYPEDEF_(0x00041308L)I_RpcServerUseProtseq2A0x000010100x3"1.3.6.1.4.1.311.25.1"0x0f43((DWORD )0xC00002Bß4L)80x00000400_HRESULT_TYPEDEF_(0x80090003L)_HRESULT_TYPEDEF_(0x8001011CL)0x000000100x00A70x000008000x000000080x5F0x000010005068L0x2256550x0000200000x00000008L8452L0x0F72__cdecl00x80040180L0x80100000Lß"EFSBlob"154MF_OWNERDRAW1788L0x03510x00021079L0x0000FFFF0x0000002030RegisterClassA11030Lthrow()ERROR_DEVICE_IN_USE_HRESULT_TYPEDEF_(0x80020013L)VarUI2FromUI43196501WSAGetLastError()"1.3.14.3.2.2"254L73ß0x0004L256MF_UNCHECKED0x01031807L128namespace std {0x000000019561L(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_KEA)"1.2.840.113549.1.1.3"2_HRESULT_TYPEDEF_(0x8011041DL)10100x00000001LEXTERN_C DECLSPEC_IMPORT HRßESULT STDAPICALLTYPE25600x000001002560x00040x000000400x00000200V_UNION(, pdecVal)LPCPROPSHEETPAGEASCARD_CTL_CODE(11)20x20L0x00400000IID_IInternetProtocolInfo5BINDF_PULLDATA1_HRESULT_TYPEDEF_(0x800F0226L)ß(CONTEXT_i386 | 0x00000002L)0x00D2(1<<4)0x00000080LGetExceptionCode()(PSN_FIRST-1)420x00300x00000002SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0001)( CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG | CERT_CHAIN_POLICY_IGNßORE_CTL_NOT_TIME_VALID_FLAG | CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG )120UL0x0D0x00000001MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_DEFAUßLT, MDM_HDLCPPP_ML_DEFAULT ) )RPC_S_INVALID_BOUND(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0)(DWORD)0x00CC0020"1.3.6.1.4.1.311.10.5.1"_HRESULT_TYPEDEF_(0x80092004L)0x00000008LVIEW_E_DRAW0x010020481241L400x000000100x0ßa43HIWORD()0x00000080L0x00000001L"1.2.840.113549.1.1.4"1GetComputerNameA1794LSTATUS_INTEGER_DIVIDE_BY_ZERO0x830013541450x190x00000008LAddPrinterA3700x0000L8222L0x00080000L0x4000L(-1)((SCODE) (((unsigßned long)()<<31) | ((unsigned long)()<<16) | ((unsigned long)())) )0x8025L55TEXT("DefaultSpoolDirectory")7037L(MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_BOOLEAN)1382LßWNetAddConnection2A4WNetAddConnection3A10x0080150x61MS_DEF_RSA_SCHANNEL_PROV_A1AF_SNA0x00000020LMAKEINTRESOURCE(7)(void)SNDMSG(, CDM_SETDEFEXT, 0, (LPARAM)(LPSTR))17MS_STRONG_PROV_A_HRESULT_TYPEDEF_(0x0009ß0320L)0x010000000x0000002160x000000010x000000200x0000002071HTGROWBOX0x0000001f00x00000800(0x0000)0x0000001e0x020x00000004L0x00000004L0x000000530x002D52IID_IBindHostBINDF_GETNEWESTVERSION(WORD)08203L(ß 10 )0x00000010L0x1FFF(CERT_SHA1_HASH_PROP_ID == () || CERT_MD5_HASH_PROP_ID == () || CERT_SIGNATURE_HASH_PROP_ID == ())330x00011013131L470x0f((LPCSTR) 40)"1.2.840.113549.1.1.2"0x000100000x00000002L70xß00400000L18363LSCARD_CTL_CODE( 2)0x80000000ShellAboutA1439L0x01A1((LPCSTR) 6)0x20010x00023001L4214LDECLSPEC_IMPORT994L170L0x800x0001(MMSYSERR_BASE + 2)0x04000000L0x01015LTEXT("SeAssignPrimaryTokenPrivilßege")VarI1FromUI40x0002L10014L0x00000x00000004284410x006999"2.5.29.8"0x00000x00000x0000140225920_HRESULT_TYPEDEF_(0x80080010L)640x00000040L90x00000008(-()+SQL_LEN_DATA_AT_EXEC_OFFSET)((DWORD )0xC00002Cß9L)_HRESULT_TYPEDEF_(0x800401FFL)4800130x00000001LSQL_INTERVAL_YEAR0x00020x000128SendMessageCallbackA20x00000008LLOBYTE(LOWORD( () ))0x30000000LRegSetValueA0x00002000RpcBindingSetAuthInfoExA359GetDefaultCßommConfigAfalse0x00001000L0x0000003347053L0x0000001d40x0000000FL_HRESULT_TYPEDEF_(0x800F0232L)0x00000020L2_HRESULT_TYPEDEF_(0x800B0105L)0x00008000L_MSL_MATH_ERRHANDLING790x00800000SetDefaultCommConfigA0x000ß2CERT_QUERY_CONTENT_FLAG_CERT | CERT_QUERY_CONTENT_FLAG_CTL | CERT_QUERY_CONTENT_FLAG_CRL | CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL | CERT_ßQUERY_CONTENT_FLAG_SERIALIZED_CRL | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | CERT_QUERY_CONTENT_FLAG_PKCS10 | CERT_QUERY_CONTENT_FLAG_PFX_HßRESULT_TYPEDEF_(0x00090312L)0x8000CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)320x00000010L(-6)1214L233L0x010x00000020L((LPCSTR) 1)630x0CMM_TWIPS0x00020000L80x80040161L0x00090x00087ß30x0418SQL_CB_CLOSE1006_HRESULT_TYPEDEF_(0x800F022AL)0x00000010(READ_CONTROL)1367L0x14EXTERN_C HRESULT STDAPICALLTYPE0x8000CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0400L0xf0x8004ß0110L_HRESULT_TYPEDEF_(0x80110409L)8235L110065L_HRESULT_TYPEDEF_(0x80010103L)0x0000000414209L10x000400x00(MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT))0x00040x0000008SQL_USE_BOOKMARKSSCAßRD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020c)(NULL)0x02051622L0x0000000A7_HRESULT_TYPEDEF_(0x80080006L)20x000000080x00080000L21753L0x000B0x00000x0214SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0121)0x07ReadCoßnsoleOutputA0x80400000_P_NOWAITIID_IInternetThreadSwitch0x00000002L10x00000100Lstrlen()SecurityDelegation0x45000x0d330x040x800401CFL0x000020000x0000_HRESULT_TYPEDEF_(0x80096003L)1331L__stdcallImmInstallIMßEA_HRESULT_TYPEDEF_(0x80093009L)0x00000008L0x00000000LSC_MINIMIZEImmGetConversionListA0x00000008L"2.16.840.1.113730.2.5"41200x0001_HRESULT_TYPEDEF_(0x80040069L)0x0000200016L( 0xffffffff )2266L"1.2.840.113549.ß1.9.14"8491L( 5 )(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)0x00080000L0x0002(CDM_FIRST + 0x0006)"Microsoft RSA Signature Cryptographic Provider"80TA_LEFT(0x00000012L)CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METßHOD_BUFFERED, FILE_ANY_ACCESS)0x010000000x00400x10x0001000022560x00000001FormatMessageA((DWORD)0x00001000)0x00080x000000020x40000x0FFF190L0x0000000000x00800x00000003L_HRESULT_TYPEDEF_(0x800F020BL)2PostMesßsage(, PSM_CANCELTOCLOSE, 0, 0L)89L7000111560x00000008L0x000001008(DWORD)(-1)0x001090x03170x800310x00100x001010x2SQL_OU_TABLE_DEFINITION(0U-299U)60x00000004(V_VT()&VT_ARRAY)0x0001L155LSNDMSG(ß, PSM_SETCURSELID, 0, (LPARAM))9L"Microsoft RSA Signature Cryptographic Provider"(SQL_IK_ASC | SQL_IK_DESC)29RpcNsBindingUnexportA(0x000F0000L)L"CryptFlags"7_HRESULT_TYPEDEF_(0x8009000FL)VarI4FromR868245L(PERFß_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)4110035L8016L90x000000024336Linterface DECLSPEC_NOVTABLE  : public 9555L((DWORD)0x00000010)(1 ß<< CMSG_ENCRYPTED)MF_UNHILITE24((HRESULT)()<0)L".LocalMachine"0x04000x0100101195_HRESULT_TYPEDEF_(0x800F022EL)_HRESULT_TYPEDEF_(0x800401D0L)6VarI4FromR40x000000808535LSCARD_ATTR_VALUE(SCARD_CLASS_PERF, 0x000ß2)50x0000004092600x00C2CreateEnhMetaFileA80x00000400L65_HRESULT_TYPEDEF_(0x8009300CL)9652L2CertRDNValueToStrA120x0000004WSANO_RECOVERY27_HRESULT_TYPEDEF_(0x80080004L)0x000200000x000b0x000000010x0001(MßIDIERR_BASE + 5)50x02000x014c0x390x0006(int)SNDMSG(, CDM_GETFOLDERIDLIST, (WPARAM), (LPARAM)(LPVOID))0x050x80000400(MCIERR_BASE + 84)8371L0x800040000x800x100000001000(-5)8224L((HANDLE)-1)70x00A10xF5àß724338LGetDiskFreeSpaceA0x26(0x00000004L)0x0FFFFFFF0x4ReadConsoleA_HRESULT_TYPEDEF_(0x80030013L)5_HRESULT_TYPEDEF_(0x8004006AL)80x00040000L0x00000004L0x00000100L2(3U << 8)0x00000002L2568521L(1)0x00000001àß0x00000002LTEXT("SeUnsolicitedInputPrivilege")(-20)0x00040004L0x0602_HRESULT_TYPEDEF_(0x8000401CL)(*() = ())"1.2.840.10040.4.3"44640x01(WM_USER + 113)0x00002000L25620x010015324_HRESULT_TYPEDEF_(0x8001ß0117L)((STATUS_WAIT_0 ) + 0 )2162L0x00000001L*(*(  **)&)++5020L(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA)SetWindowLongA00x00000001_HRESULT_TYPEDEF_(0x8001011DL)0x000001000x00010x40040x00A50x080000000xß000000010x00040x00000001"1.3.14.3.2.13"(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)8396L((LPCSTR) 28)020VarDecFromUI4RPC_S_OUT_OF_MEMORY198509L((LONG)(ßLONG_PTR) () )MessageBoxExA0x00000001L(-34)0xFFFFFFFF_HRESULT_TYPEDEF_(0x80040164L)0x000x8004018FL10x0010154L((LPCSTR) 5)(().HighPart = 0, ().LowPart = ())0x0000002015510x00004000(-2)1164L0x00000008àß0x00B80x100x00881070L(0x00000205L)(*(long double*)__extended_huge)(IOC_VOID|(()<<8)|())02((PCERT_INFO) -1)"Physical""1.3.6.1.5.5.7.3.1"(MCIERR_BASE + 90)56_HRESULT_TYPEDEF_(0x80028CA0L)1076L0x80000x00004ß000L0x000230x00000080L(15)0L81814L700x00000020L103L0x0200(*(float*) __float_huge)(SQL_C_SHORT+SQL_UNSIGNED_OFFSET)5061L10x000000020x00000020L0x00040000(MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))((DWORD)ß0x00000001)112ImmEnumRegisterWordA(PSN_FIRST-3)0x000000100x000100002010L0x00x20x00040000l0x00080000l1388L(0*4)0x00400000l(-1)4_HRESULT_TYPEDEF_(0x8000401EL)0x000200000x000000020x100000040x00000800L0x0080ß0000l__inline0x00000004L(WORD)4000(0x00000002L)(0x8)0x00040000L0x000000100x000000090x000010000x00000005OPENCARDNAMEATEXT("printLanguage")(MCIERR_BASE + 41)18(0xFFFFFFFFL)0x0005__cdecl(3U << 10)0x00008000Lß0x000C0x002000000x00001004_HRESULT_TYPEDEF_(0x8002801DL)EnumDateFormatsA80x000401E0L0x00070x0001_HRESULT_TYPEDEF_(0x8004130CL)133SetPrinterA0x000000020x00000400L0x0001_HRESULT_TYPEDEF_(0x80010100L)0x00000400ßLOPENCARDNAMEW0x000002000x00010000L0x0020CopyAcceleratorTableA(-4)14(MIXERCONTROL_CONTROLTYPE_SLIDER + 1)0x0002460x20MAKEFOURCC(, , , )0x000112(2U << 10)8204LTEXT("driverName")_HRESULT_TYPEDEF_(0x80ß0F0218L)0x45L".Enterprise"10x783(~0UL)81920x1640x000000020x00000080ENUMRESLANGPROCA0EnumMonitorsA_HRESULT_TYPEDEF_(0x80040064L)1744L0x000001000x040030CreateProcessA0x0008230x000800001253L99(0)10x0ß0F0::std::0x00C00x120x00004003L20x000000080x00008000"CryptDllImportPrivateKeyInfoEx"0x00000002580x00040x1000L341790L47(BF_DIAGONAL | BF_TOP | BF_LEFT)1HIWORD()_HRESULT_TYPEDEF_(0x80004004L)513((int)ß(__HI()&0x80000000))18483L13RegOpenKeyA( 8 )0x000000040x0002(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MASTER_HASH)1326L1280x00070CreateDialogIndirectParamA8(SQL_C_SHORT+SQL_SIGNED_OFFSETß)0x0000000220x0004_HRESULT_TYPEDEF_(0x8001013AL)1708LWinExecErrorA9611LEXTERN_C DECLSPEC_IMPORT  STDAPICALLTYPE90x00044111210x00000001L_HRESULT_TYPEDEF_(0x8001011EL)_HRESULT_TYPEDEF_(0x8001000DL)0x0000001ß0L_IOW('f', 126, u_long)0_HRESULT_TYPEDEF_(0x00090314L)0x000000010x00000002L21mciGetErrorStringA_HRESULT_TYPEDEF_(0x80093026L)8351L240x074204L0x00040x000000200x00400x000000080x000000020x00000004VT_UI40x00ß000002_HRESULT_TYPEDEF_(0x80097006L)( 0xffffffff )L"Software\\Microsoft\\Cryptography\\IEDirtyFlags"CMSG_SIGNED_DATA_V30x2SQL_OU_DML_STATEMENTS0x00008000_HRESULT_TYPEDEF_(0x800B010DL)10061L139_HRESULT_TYPEDEF_(0x8ß0096002L)8450L15UL0x00007(-1248)TEXT("printerLocations")750x00800000LVarI4FromBool0x0F0x00BA1640(MMSYSERR_BASE + 15)0x00000010L5086L26(MCIERR_BASE + 20)10x00000002320x00020x00C000000x00400x00000008LßTA_RIGHT143ImmRegisterWordA1112_HRESULT_TYPEDEF_(0x80090021L)0x00030000((LPCSTR) 36)RPC_BINDING_HANDLE(MIDIERR_BASE + 0)680x480x000x000000020x0080GetPrinterA50x00000002(-24)0x438_HRESULT_TYPEDEF_(0x8009ß030FL)GetCharWidthFloatA1DRVCNF_CANCEL"2.5.4.20"13CharLowerBuffA8411L0x00010000l0x00000080L(unsigned long)0X00000000L0x000004005026L( SecurityImpersonation << 16 )CharUpperA4(0x5)0x00000004L00x00000007L0xß01930x0020GetShortPathNameA00x0E25720x3153SQLSetPos(,,SQL_DELETE,SQL_LOCK_NO_CHANGE)350x0000000231132LSTATUS_FLOAT_DENORMAL_OPERAND0x0008SQL_LOCK_UNLOCK0x000003000x0000000225810020x00000006ResetPrßinterA0x00020000"!\n"(0x0400)1_HRESULT_TYPEDEF_(0x80080011L)0x0013CompareStringA_HRESULT_TYPEDEF_(0x800F1000L)0x0003(0x0004)ERROR_INVALID_ADDRESS0x00010x010000008311L11_HRESULT_TYPEDEF_(0x80030112L)0x0ß0000000L_HRESULT_TYPEDEF_(0x80010139L)1337L0x000A_HRESULT_TYPEDEF_(0x800401E9L)SQLSetPos(,,SQL_REFRESH,)0x000200000x16(STANDARD_RIGHTS_READ | PRINTER_ACCESS_USE)7(1U << 0)1281(-8)SCARD_ATTR_VALUE(SCARD_CLßASS_COMMUNICATIONS, 0x0110)315(0x00000002L)0x00000020((LPCSTR) 14)0x00000002LRT_VERSION210L9_HRESULT_TYPEDEF_(0x80094801L)1351L144000x00D000000x00001fff0x0020_HRESULT_TYPEDEF_(0x8011041FL)_HRESULT_TYPEDEF_(ß0x8002000EL)0x00000020L0x00001000"1.2.840.113549.1.7.6"0x0000000113MB_ICONASTERISK(TEXT("text/html"))0x0003L0x0003(1U << 12)"1.3.6.1.4.1.311.10.3.3"0x000000080x0010SetClassLongA0x0000000142SQL_GUID0x000401ßCFL__stdcall6{0,0,0,0,0,0}(IOC_IN|(((long)sizeof()&IOCPARM_MASK)<<16)|(()<<8)|())RpcProtseqVectorFreeA0x000210x00170000321SCARD_CTL_CODE( 7)0x40000000x00020x00000002L0x000800000x0149(IOC_OUT|(((long)sißzeof()&IOCPARM_MASK)<<16)|(()<<8)|())4207L0x0021_HRESULT_TYPEDEF_(0x8001000AL)__int640x04360x00020x0001(TEXT("image/xbm"))0x00000010"2.16.840.1.113730.1.8"0x00080000CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHßOD_BUFFERED, FILE_READ_ACCESS)STATUS_STACK_OVERFLOW800x4000840x00000002L0x6CERT_FIND_ENHKEY_USAGE_HRESULT_TYPEDEF_(0x80100026L)0x000100000x000001000x3BDL"DS"30x0c0x0000000272L0x00000010IsCharUpperAEnumDeskßtopsA0x0020SCARD_READERSTATEWsizeof(DISK_HISTOGRAM)88380x00000F001419L(HPROPSHEETPAGE)SNDMSG(, PSM_INDEXTOPAGE, (WPARAM)(), 0)0x00000002_HRESULT_TYPEDEF_(0x8007000EL)SQL_MAX_IDENTIFIER_LEN0x0200((HRESULT)0x8ß0040000L)"""2.5.8.2"EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE"1.2.840.113549.1.9.1"0x02_HRESULT_TYPEDEF_(0x8010002DL)0x0b10x000000049600256000XcvDataWSCARD_READERSTATEA0x00000002_HRESULT_TYPEDEF_(0x800B0ß006L)0x00000080L(CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT)0x000000010x004100x000000028504L0x100000000x000100000x0008"DS"0x0000000140x0000ERROR_ACCESS_DENIED_HRESULT_TYPEDEF_(0x800F0101L)278L(0x80)0x0000ß200000x0810(MIXERR_BASE + 0)CopyMetaFileA"2.16.840.1.101.2.1.1.3"2( 7 )CommDlg_OpenSave_GetFilePathA_HRESULT_TYPEDEF_(0x80010002L)0x000000400x0000000e0x00001000LInsertMenuItemAFINDMSGSTRINGA_HRESULT_TYPEDEF_(0xß00080012L)0x0b310x00001400SCardUIDlgSelectCardA0x000000027560000x00000040L88441L160x0001"1.2.840.113549.1.7.3"0x0800L64typedef char __C_ASSERT__[()?1:-1]SQL_MAX_COLUMNS_IN_INDEX0x00002000(1 << 9)9501L0ßx00200x000000040x0004000087L0x400000000x00000100L0x0000000011_HRESULT_TYPEDEF_(0x80040004L)0x00000004L0x08000x0000"MNBF"10L0x000000080x00000002L0x00000004L0x004000000x00001200"1.2.840.113549.1.9.4"4309L(ß(PIMAGE_SECTION_HEADER) ((ULONG_PTR) + FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + ((PIMAGE_NT_HEADERS)())->FileHeader.SizeOfOptionalHeader ))0x002000000x000600000x0004"2.16.840.1.101.2.1.1.4"STATUS_ILLEGAL_IßNSTRUCTION0x00000008L0x200x0002(3L)0x00000080L0x0000004B70x120x0000004C0x00000006LVarI4FromI10x000000470x80000x030x00000048_HRESULT_TYPEDEF_(0x80093202L)0x26"CryptDllCreateCOMObject"0x000000498347LVarI4FßromI20x40x0000004A50szOID_RSA_RSA8387L0x0068VarI4FromI40x00000044((() >> 16) & 0x1fff)156L0x00000045((LPCSTR) 501)0x000000460x0100L5034L0x00000000L_MSL_IMP_EXP0x000100000x02000x7fff_HRESULT_TYPEDEF_(0ßx80090303L)5036L(0x00000226L)0x01210x00040x4f101028001L9MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_PAP, MDM_HDLCPPP_ML_2 ) )(WS_CHILD)01ß8GetDateFormatA299503L8439L0x140x0004_HRESULT_TYPEDEF_(0x8001000EL)0x000000800x0002120x8001250x0001(BDR_SUNKENOUTER | BDR_RAISEDINNER)0x00080000L0x00020x02831208L1311L2SQL_NO_DATA0x00004003L0x00110000àß_HRESULT_TYPEDEF_(0x80040155L)38SQL_CUR_USE_DRIVER0x00021348229L20x0006((HANDLE)(LONG_PTR) ())RegisterServiceCtrlHandlerADMBIN_UPPER0x00000002L(WM_USER+3)0x00081LPIINTERNETPROTOCOLSINKSTACKABLE10"TopicItemßList"(0x0000000DL)_HRESULT_TYPEDEF_(0x80090305L)((DWORD )0xC00000FDL)0x00400000L_HRESULT_TYPEDEF_(0x80004023L)((LPCSTR)5)0x04240x0423( & CMSG_ENCODING_TYPE_MASK)0x042610x0425160x0420(0x0070 | XCLASS_NOTIFICAßTION | XTYPF_NOBLOCK)130x0004700x02000x04220x00000100_HRESULT_TYPEDEF_(0x80010003L)0x0421__typeof__(sizeof(0))48150x000004001734L00x00160000_HRESULT_TYPEDEF_(0x80040205L)0x04280x00000010L0x0427WNetUseConßnectionA4100L0x00000040L0x08000000L0x000000010x01950UL"2.5.29.7"81770L1520x00030x000cDMPAPER_LETTER0x000000080x00080x030B1L_HRESULT_TYPEDEF_(0x800C0004L)0x0115_HRESULT_TYPEDEF_(0x00041301L)70x00000001Lß0x00001772L0x000000108553L8502L11330L0x020x0004CreateWindowExW(0L, , , , , ,, , ,  ,  ,  )SIZE_MAXHIDE41160x00000008L0x0004ERROR_NOT_LOGGED_ON0x600x40000000L0x000000107052LQueryServiceCoßnfigA0x00040000L0x01120x00000011L0x00100000((() & CERT_RDN_TYPE_MASK) >= CERT_RDN_NUMERIC_STRING)0x0809WNetDisconnectDialog1A0x0001665079L0x000x00000006(WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)GetClassLongA0x800ß0TEXT("printRateUnit")0x04001301LLPFNPSPCALLBACKATEXT("SCard$LocalReaders\000")0x00010000L1784L0x000004000x00000020L347009L0x0015(0x0004)0x00xF8(()==IMAGE_SYM_CLASS_STRUCT_TAG || ()==IMAGE_SYM_CLASS_UNIONß_TAG || ()==IMAGE_SYM_CLASS_ENUM_TAG)0x00000004L482L(unsigned long)0X00000010L(-1247)0x20000000CreateWindowExA(0L, , , , , ,, , ,  ,  ,  )ERROR_BAD_PROVIDER205L0x000595(ALG_CLASS_DATA_ENCRYPTß|ALG_TYPE_BLOCK|ALG_SID_CYLINK_MEK)470x0004((unsigned short)(ULONG_PTR)() )0x00000008L((LPCSTR)1)CREDENTIAL_OID_PASSWORD_CREDENTIALS_A(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | PERF_DELTA_COUNTER | ßPERF_DISPLAY_NO_SUFFIX)107L15CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)"2.5.4.5"0x000080000x00000002SCardGetStatusChangeA6200L((LPCSTR) 4)0x400b(QS_INPUT | QS_POSTMESSAGE | QS_TIMER | ßQS_PAINT | QS_HOTKEY)2SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0123)(MMIOERR_BASE + 13)MAKEINTRESOURCE(9)1220L0x00000009L0x00000010L1022L4(0x00A0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)0x20020x00000003((VARIANT_BßOOL)0)1082L0x080x00000001LTEXT("printMinYExtent")0x00004007LNULL_BRUSH0x00000001L759L0x008781735L(CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)390x000000020x004040x000010000x1c( 0 )0x0082(1U << ß5)TEXT("printMinXExtent")"2.5.4.12"20x00000001((DWORD )0xC000001DL)( 0x80000003 )0x00000003L8421L00x0010_HRESULT_TYPEDEF_(0x8000401FL)0x000000031(TEXT("application/pdf"))TEXT("SchedulerThreadPriority")sndAliaßs('S', '*')SQL_OU_INDEX_DEFINITION0x00020000l8549L0x800200000x08750x0000040091422L(!memcmp((),(),()))0x01c0300L0x00070x0100_HRESULT_TYPEDEF_(0x800C0002L)129706LGetBinaryTypeATEXT("SeEnableDelegationPßrivilege")(100 + SQL_CODE_HOUR_TO_SECOND)202L10x0000000434308L0x00000004ERROR_OUTOFMEMORYCODEPAGE_ENUMPROCA1766L0x0020ERROR_BAD_USERNAME61270x4c0x100x010076_HRESULT_TYPEDEF_(0x800B0103L)10x00020x4000(Vß_VT()&VT_VECTOR)0x00000001L0x3C90x001762230x000100000x00000400(0x0100)(PSN_FIRST-2)_HRESULT_TYPEDEF_(0x8009200CL)5016L((),TRUE)0x0002"CertDllUnregisterSystemStore"0x000000056_HRESULT_TYPEDEF_(0x8009200DLß)6001L5070x00001000_HRESULT_TYPEDEF_(0x80093025L)7ERROR_BAD_DEVICESetWindowLongPtrA( 0x0002 )((), 0)0x000000000x0080129L8991400x00000002L0x00000012L0x0b410(CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)00x0ß0010x010x8800000000x00000100IsEqualGUID(, )0x00000001L0x00000002L12SQLINTEGER22TEXT("SeChangeNotifyPrivilege")SQL_ADD5080L5260x00000100LVerLanguageNameA_HRESULT_TYPEDEF_(0x800401F1L)10037L2014L0x0000ß0004L0x000011FF((HDDEDATA)0xffffffffL)0x000200000x0000000802128_HRESULT_TYPEDEF_(0x8004E022L)STATUS_FLOAT_STACK_CHECK10x00040000L(GCS_COMPREADSTR|GCS_COMPSTR)0x000000050xFFFFFFFF0x0001L(0x00000005L)1733L0ßx13BuildCommDCBA0x280x000016070x0001(TEXT("image/x-jg"))0x1CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS)0x1000CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG9630x00000002L_HRESULT_TYPEDEF_(0x80020009Lß)4332L4_HRESULT_TYPEDEF_(0x80030057L)0L(WM_USER + 136)szOID_RSA_RSA0x0100GetWindowLongPtrA0x01CERT_ENHKEY_USAGE_PROP_ID4199L5059L1130x00000001L4427000(MMSYSERR_BASE + 8)48440LOpenSCManagerA0x000000040xß80((BYTE)(()>>16))110x00000001_HRESULT_TYPEDEF_(0x800F0220L)VarUI1FromUI4"1.3.14.3.2.4"0x01000000LWNetEnumResourceA360x00000020L10xFFFFFFFF521248L( 0x4 )1817L0x00001D050x00020000L0x00080x00000008L"SystßemRegistry"1176L(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000002)_HRESULT_TYPEDEF_(0x800401E8L)0x00001000L((LPCSTR) 16)1815L(SQL_TINYINT+SQL_SIGNED_OFFSET)770x40000x00130ßxFF41(3U << 10)0x000000010x000004000x019760x00020000560x40000x00039558L00x80000000L0x00000008(WM_USER+6)_HRESULT_TYPEDEF_(0x80093133L)6007L18388L40x4000SQLSetPos(,,SQL_ADD,SQL_LOCK_NO_CHANGE)0*(*(ß  **)&)++0x800000000x015c( 0x200 )0x00000040L1120x00020000*(*(  **)&)++3((DWORD)0x0001)70x0800LPSERVICE_MAIN_FUNCTIONA*(*(  **)&)++"Serialized"9010L8((INT_PTR)(MAXUINT_PTR >> 1))*(*(  **)&)ß++4108_HRESULT_TYPEDEF_(0x80010115L)VarI4FromCyAF_HYLINK0x00000C00PeekMessageA0x000000010x0000_HRESULT_TYPEDEF_(0x8009302AL)8430L0x00000011"2.5.4.46"0x000000011110L30x0000180020x00C40x00000027((DWORD)0x00ß000002)0x000080001050x00000000113DECLSPEC_IMPORT0x00000200L11003L715560x0010103180x2000L0x00010000(0x0004)25CRYPT_FORMAT_RDN_CRLF_HRESULT_TYPEDEF_(0x80004016L)0x00000001L(SQL_TINYINT+SQL_UNSIGNED_OFFßSET)85L352(MCIERR_BASE + 73)90const(PSN_FIRST-6)22005"2.16.840.1.113730.1.1"} __finally {11017L0x00000004L0x00001000L0x00000004L330xFF00000000x02008503L_HRESULT_TYPEDEF_(0x8002802CL)1829LDefWindowProcAàß0x000014053288L0x000000040x0004(0x00000000L)0x080070x10000000x0004018FL170RpcServerUseProtseqIfExA0x000E0x00000008L520xFF21(0x00080000L)((RPC_AUTH_IDENTITY_HANDLE) ~0UL)(0x00000221L)0x00209810x00080000ßl9640x00100000l170x0000LVarI2FromUI40x00200000l0x00000003L19(MCIERR_BASE + 6)0x00400000l0x00040000GetSaveFileNameA0x00800000l30x01000000l0x02000000l0x4005920x00001000L130x04000000l0x08000000l(-8)0x11ß0x10000000l_HRESULT_TYPEDEF_(0x800B0008L)(0x0020)20x05( ( DWORD )~UPDFCACHE_ONLYIFBLANK )DWLP_MSGRESULT + sizeof(LRESULT)_HRESULT_TYPEDEF_(0x800401E5L)0x001fUCoInternetCombineUrl0xFFFFFFFF0x00000100_HRESULT_TYPEDßEF_(0x800401F2L)133L(CDN_FIRST - 0x0006)0x0813(3 << 13)20_HRESULT_TYPEDEF_(0x8004000FL)(-4L)0x01000000l(CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)0x7000(0x0040)0x0b3UL0x00022UL51218(MIXERCONTROL_CT_CLASS_ßFADER | MIXERCONTROL_CT_UNITS_UNSIGNED)"Synthesis SyncML Server/" SYSYNC_FULL_VERSION_STRING22SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT "." SYSYNC_BUILDNUMBER_TXT90x02000000l0x0003àß0x00000100L0x4000{ NDRcopy ( (((char __RPC_FAR *)())+()), ()->Buffer, (unsigned int)(()-())); *(unsigned long __RPC_FAR *)&()->Buffer += (()-()); }0x20000000l_HRESULT_TYPEDEF_(0x800B000BL)13700x400000ß00l0x000010000x80000000l0x00000005230x0000001010010(DWORD)0x000000420x00000100244203L0x000000020x0A00x0f0307708523L7040L0x00000004L0x0100LTEXT("printNotify")110xF11047"2.16.840.1.101.2.1.1.20"0x000ß00020LCTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS)((LONG)0x80000001)GetPrivateProfileStringA0URemovePropA(DWORD)0x005A00490x000D21_HRESULT_TYPEDEF_(0x800F020CL)_HRESULT_TYPEDEF_(0x8001010FL)ß0x00000004L(-4)((COLORREF)(0x01000000 | (DWORD)(WORD)()))163648(WM_USER + 115)5027L0x00141590x00000001L0x0022(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)""0x00082((HRESULT) ())0x100C0x0100L512(MCIERßR_BASE + 65)_HRESULT_TYPEDEF_(0x80020003L)1249L0x000000003211029L12DeletePrinterDataExA0x00000200L464200L0xFFFF(0x00000224L)((DWORD )0x00000103L)0x0004(*() = ())4213L0x100x00000002(0x00000004L)(CALLBßACK_TASK)10102L(-2)0x00000200ERROR_MORE_DATA0x0400_HRESULT_TYPEDEF_(0x800401FAL)0x000000580x00000002768SQL_U_UNION(WM_USER + 121)0x00004001L0x000000700x00000002LGetTextMetricsA((DWORD)0x00000103)19DMPAPER_Aß3_EXTRA_TRANSVERSE((HRESULT))3650x00000008L0x00000004"2.5.8.3"260x00000000LLoadCursorA(0x0090 | XCLASS_FLAGS )276L20x0020_HRESULT_TYPEDEF_(0x8004E004L)0x00040000"2.5.29.32"0x00060x0000C000L9(IOC_IN|IOC_ßOUT)0x00CB_HRESULT_TYPEDEF_(0x80010128L)SQL_MAX_COLUMNS_IN_SELECT3( 0x2 )_HRESULT_TYPEDEF_(0x800F020DL)2L(~MAXHALF_PTR)0x000000800x0400DRVCNF_OKEXTERN_C  STDAPICALLTYPE0x019B0x0002_HRESULT_TYPEDEF_(0x8000402ß4L)1616LlstrcmpiASTATUS_SINGLE_STEP8140x00000006L80x0004_HRESULT_TYPEDEF_(0x80110403L)EXTERN_C HRESULT STDAPIVCALLTYPE0x021032_HRESULT_TYPEDEF_(0x8000401BL)10x00000200l0x400000000x00000400l583((LPCSTR) 3ß)0x00000800l0x00001000lERROR_NOT_ENOUGH_MEMORYGetCharABCWidthsA0x0040( (RpcExceptionCode() == STATUS_ACCESS_VIOLATION) || (RpcExceptionCode() == STATUS_DATATYPE_MISALIGNMENT) || (RpcExceptionCode() == RPC_X_BAD_STUB_DAßTA) || (RpcExceptionCode() == RPC_S_INVALID_BOUND) )0x00100000L0x00002000l0x00004000l0x00f7_HRESULT_TYPEDEF_(0x80110436L)RpcBindingFromStringBindingA0x00008000l0x00010000l0x00001000L0x00020000l0x00C1100x00100000ßL0x00040000l0x000A0x00000800ChangeDisplaySettingsExA_HRESULT_TYPEDEF_(0x80010010L)(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9)_HRESULT_TYPEDEF_(0x80100006L)_HRESULT_TYPEDEF_(0x80092028L)(WM_USER + 114)0x0626"1.2.840.11ß3549.1.9.2"_HRESULT_TYPEDEF_(0x80094006L)(WM_USER + 200)0x0014SQL_CB_PRESERVE0x10000000L3(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)_ßHRESULT_TYPEDEF_(0x80090329L)32256short0x00800000L1730L0x00000400L_HRESULT_TYPEDEF_(0x8011040CL)1227L2_HRESULT_TYPEDEF_(0x80090328L)0720(PSN_FIRST-8)1762L0x000800004((BYTE)0x80)FindNextFileA0x00000001L0ßx014D( PARAMFLAG_FLCID )0x0012MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_DEFAULT, MDM_HDLCPPP_ML_DEFAULT ) )CF_ANSIONLYRpcBindingSetAuthInfoA0xßA0_HRESULT_TYPEDEF_(0x800401E7L)0x40x000020000x0004DdeCreateStringHandleASTATUS_ACCESS_VIOLATION0x000000800x01174L310x01680x0000000100x00008000L5085L1062L0x00008000L0x33(DWORD)0x0066004620x000010000x2SßetWindowLongA6_HRESULT_TYPEDEF_(0x80100007L)0x0000000e0x000F30721795L0x00000004"CryptMsgDllGenEncryptKey"0x00000010CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)0x0000000f0x00200x0360V_UNIßON(, pparray)0x000000120x000000021314L0x00008000L"1.3.6.1.5.5.7.3"0x00000011112070x00000014(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE0x000000130x00000004L0x00004ß000SetWindowLongW0x0002L0xE18219L0x00200000L10060x000000221168526L(void)0(0x0010 | XCLASS_FLAGS )0x8004017FL(NDRCContextMarshall( (NDR_CCONTEXT),  ),+20)HALFTONE11(-12)0x7008(MCIERR_BASE + 19)0x021ß97( 0x0002 )310x00000008590x03100x002050x00800x00100000LSQL_UB_OFFlong2true318433L2260xE2SNDMSG(, PSM_SETHEADERSUBTITLE, (WPARAM)(), (LPARAM)())(1 << VT_CY)(0x00000008L)(MCIERR_BASE + 38)V_UNIONß(, ppdispVal)0x00020000L0x0F000x3FF(5 << 13)5(5<<4)207L20LTEXT("printNetworkAddress")9(struct _EXCEPTION_POINTERS *)_exception_info( & CERT_ENCODING_TYPE_MASK)230x790x00000002L08538L0x00000027_HRESULTß_TYPEDEF_(0x80090330L)((DWORD)0x00000100)3913_HRESULT_TYPEDEF_(0x8009301FL)0x000010x000100x00000001(MIXERLINE_COMPONENTTYPE_DST_FIRST + 6)19556L1733L1426L1163L0x800000000x0048_HRESULT_TYPEDEF_(0x80090008L)ß220x00020x0004150x010060x010x00000008L(0U-699U)CCSIZEOF_STRUCT(PROPSHEETHEADERW, pfnCallback)0x2(MCIERR_BASE + 80)0x118600x000000010x000000800x0100_HRESULT_TYPEDEF_(0x80093011L)0x0000000140x000000000x00ß1010050L0x0008MessageBoxIndirectA0x00002000L0x00000004L0x19258L1TEXT("MajorVersion")(() >> 16)40x0007ffff(MCIERR_BASE + 52)0x00F40x0001110x000001000x1(BF_BOTTOM | BF_LEFT)ERROR_CANCELLED0x454C30x000ß00400LERROR_NO_MORE_ITEMS(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW )(MCIERR_BASE + 28)8378L1019L((DWORD)0x00000400)0x00200000L38485L1335L0x0000080032TEXT("SCard$DefaultReaderßs\000")(DWORD)0x00FF00624312L0x001050x32001DragQueryFileA_HRESULT_TYPEDEF_(0x80040067L)}2(unsigned char)( & 0xff), (unsigned char)( >> 8)"1.3.6.1.4.1.311.20.2.1"(1U << 2)ModifyMenuA790x00010x0000001041àß_HRESULT_TYPEDEF_(0x800C0014L)0xff0xF0700x00001401"1.3.6.1.5.5.7.48.2"0x6SQL_CB_PRESERVE0x00010000L((LPCSTR) 23)(WM_USER + 125)BS_LEFTTEXT0x28436LSQL_COLUMN_AUTO_INCREMENT0x001C0000(0x0002)0x000000100x00043àß0x103B(CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)0x800000020x30000000LSCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0101)(MCIERR_BASE + 47)(-3)(WM_USER + 126)0x01L9654L960x01378418LV_UNION(ß, date)((HCERTCHAINENGINE)0x1)0x00030000(0x0002)0x014( UPDFCACHE_ALL & ( DWORD )~UPDFCACHE_NODATACACHE )9_HRESULT_TYPEDEF_(0x80030108L)2000LLoadCursorFromFileA_HRESULT_TYPEDEF_(0x80040208L)0x000F107DeletePrinßterDriverExA1((BYTE)())_HRESULT_TYPEDEF_(0x8009100AL)(-99)LANGGROUPLOCALE_ENUMPROCA21718L1212L0x00000001L"2.5.4.19"0x00100x231609L8(unsigned long)0X00000000L2564(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERFß_COUNTER_FRACTION | PERF_DISPLAY_PERCENT)L"Software\\Policies\\Microsoft\\SystemCertificates"NO_ERROR(512/8)10x00000100L0x000040000x0001015371108L9(CDM_FIRST + 0x0000)25WSATRY_AGAIN0x20000x00000001L0x000401Aß0L((DWORD)0x0020)0((DWORD)0x00000008)0x058((DWORD)0x00000040)(NdrSContextMarshall((NDR_SCONTEXT),, (NDR_RUNDOWN))0x00000027(2<<4)((DWORD)0x00000004)CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANYß_ACCESS)0x0000001c0x0020(0x3<<6)1SCardIntroduceReaderA_HRESULT_TYPEDEF_(0x8001013CL)LPIINTERNETBINDINFO0x00040000L0x00000200L0x000A0x00020x00000100L_HRESULT_TYPEDEF_(0x800401EEL)0x0001"2.5.4.28"0x160x0000000ß0L0x00000000L0x800001000x0358_HRESULT_TYPEDEF_(0x80030006L)18TEXT("SeSystemEnvironmentPrivilege")98242L4209L1340L"ServicesActive"27_HRESULT_TYPEDEF_(0x00030204L)0x00080000L0x00000300L9559L"1.3.14.7.2.3.1"L"ßMicrosoft Base DSS and Diffie-Hellman Cryptographic Provider"0x00000010(WAVERR_BASE + 3)0x00800000(LPSTR)((ULONG_PTR)((WORD)()))9752LSQL_DB_RETURN_TO_POOLCMSG_HASHED_DATA_V00x1000_IOW('s', 0, u_long)0x000040002ß190x0286((DWORD)0x0010)(-2)1110x0d((VOID *)(LONG_PTR)((long)))GetFileVersionInfoSizeAL"ServicesActive"8416L0x00000020L_HRESULT_TYPEDEF_(0x80030005L)1305L0x0000002010GetServiceDisplayNameA0x00001A03((LPCSTRß)1)_HRESULT_TYPEDEF_(0x8009100DL)0x0000004020x060x200x01000x02411021L0x000000200x020x0004250x00000002_HRESULT_TYPEDEF_(0x800C0006L)"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"0x000000040ß0(LPWSTR)((ULONG_PTR)((WORD)()))30x0000000FCreateDCA00x00000200(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8)288LTEXT("driverVersion")0x00000002L0x00000002L(-3)0x000000100x01000000_HRESULT_TYPEDEF_(0x800F0207L)4Lßlong long00x1370x0004"1.3.6.1.4.1.311.10.3.7"GetWindowTextA4861UL0x4(2 + 2*(2 + 20 +1))11028L48EXTERN_C DECLSPEC_IMPORT  STDAPICALLTYPE40x0300(0x00000001L)0x00000001(PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PßERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX)8308L10x00110x01920x030A1245L0x00000000L1404L0x0211000101012L"1.2.840.113549.1.9.15.1"_exception_code"1.3.6.1.4.1.311.13.1"0x40x00000400L0x00010000L0x80002(0xß00000000L)0x000000048253L((DWORD )0xC000008CL)0x00000020-50x0000002000x000840x00000200L0x00000020_HRESULT_TYPEDEF_(0x8009302EL)0x800401F0L(V_VT()&VT_BYREF)0x00203L10x000100000x0000002f0x00800x02000000Lß_HRESULT_TYPEDEF_(0x80092023L)_HRESULT_TYPEDEF_(0x8004130EL)320_HRESULT_TYPEDEF_(0x800401E3L)7041L0x00010000L31242L1057L(BYTE )-1LPPROPSHEETHEADERA0x20000000L_HRESULT_TYPEDEF_(0x00030202L)1428L0x0002(CDN_FIRSßT - 0x0000)MF_RIGHTJUSTIFY80x0080000050x00000001DWORDAddJobA3750x00000002L68L_HRESULT_TYPEDEF_(0x8010001EL)1AF_DATAKITSQL_TINYINT00x00000010_HRESULT_TYPEDEF_(0x800C0014L)_HRESULT_TYPEDEF_(0x80004005L)1102Làß219710LTEXT("printEndTime")0x014710068L_exception_code19(WM_USER + 129)((DWORD )0xC0000092L)_HRESULT_TYPEDEF_(0x800401EAL)0x00000004256(0x0001)1791L((DWORD)0x00000002)1920L0x000045500x80040150L14190x00040ß0000x27_HRESULT_TYPEDEF_(0x80110427L)0x0437PostMessage(, PSM_PRESSBUTTON, (WPARAM), 0)0x000001000x000000034004L()0x00000010L0x00200000L2"2.5.4.29"0x04350x04360x00000040L0x040000000x00010x0240x04341ß08110x0040(MCIERR_BASE + 42)_HRESULT_TYPEDEF_(0x800F0228L)1107L0x0008L(MCIERR_BASE + 10)00x000000041365L20x0008000030x20000000310x00080000L9653L0{ 0x25007f51, 0x57c2, 0x11d1, { 0xa5, 0x28, 0x0, 0xa0, 0xc9,ß 0x6, 0x29, 0x10 } }211016L0x000000010x00000040L0x0002000043_HRESULT_TYPEDEF_(0x8001012CL)999L0x00020000L640x00090x00008000L0x000000010x089705L0x90000000( 0x8 )SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0122)àß3640x00000002LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_ANALOG, MDM_GEN_ANALOG_PROTOCOL_DATA ( MDM_ANALOG_RLP_ON ) )0x00000008L(MCIERR_BASE + 91)510x281(WM_USER+2)_HRESULT_TYPEDEF_(0x80028CA1L)25770x4000CreateICA2ß_HRESULT_TYPEDEF_(0x800288CFL)RpcNsBindingUnexportPnPA00x10x3B98226L0x000010000x400000000x00000002L0x400000000740962(0 + MCI_SEQ_OFFSET)0x000000FF710038L0x000173300x10001702L0x00000001210x100000000xß81338L0x000000200x08000x000004000x00010x000000100x003400000x00000040198448L0x00000001320x40000x00000001L0x020x000000028375L0x020000000x4000000040x010030x00001D020x02240x00000002110x0000000080x0001àß0x080x400x000000030x04000x03((HRESULT)0x800400FFL)(MCIERR_BASE + 46)0x000000010x800401D0L0x02000xF120MF_SEPARATOR(1 << VT_I1)(-10)_HRESULT_TYPEDEF_(0x800401D4L)0x200_HRESULT_TYPEDEF_(0x800F021EL)(1 << VT_I2)àßSQL_TXN_SERIALIZABLE(1 << VT_I4)HIWORD( () )TEXT("printRate")8227LICMENUMPROCAGetProfileStringA0x51_HRESULT_TYPEDEF_(0x80090322L)0x00000400160x010x00030000lMAKEINTRESOURCE(32643)0x018408L0x00000800L129(0xß20000000L)10x0400x00010x01880xF10x020B100030x00021"DEFAULT""1.2.840.113549.1.3"128560L"1.2.840.113549.1.2""1.2.840.113549.1.1"_HRESULT_TYPEDEF_(0x8009202AL)_HRESULT_TYPEDEF_(0x80020006L)"1.2.840.113549.1.7ß"70x04000000LMAKEINTRESOURCE((ULONG_PTR)RT_CURSOR + DIFFERENCE)0x06"1.2.840.113549.1.6"_HRESULT_TYPEDEF_(0x80092024L)1642L104L0x0010"1.2.840.113549.1.5"(0x00000001L)0x0000FFFF"1.2.840.113549.1.4"0x00000001"1.2ß.840.113549.1.9"0x000000400x000000020x0000000007"1.2.840.113549.1.8"410xffffffffUL0x000000028EnumFontFamiliesExA0x00000002L(WM_USER + 101)TEXT("Architecture")0x0530x00000008_HRESULT_TYPEDEF_(0x80004022L)0xß1VarUI4FromBool0x00000040L0x000E0x00002000(()&MDM_MASK_PROTOCOLINFO)4230x00008000L0x0002351755L0x0000100B0x00000200L_HRESULT_TYPEDEF_(0x8009310DL)3002L0x0102GetEnvironmentStrings0x01501719L0x00000020Làß0x04_HRESULT_TYPEDEF_(0x80100020L)_P_WAIT10x00000800L0x000401B0LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_DATA ( MDM_X75_DATA_T_70 ) )(unsigned char)( & 0xff), (unsigned char)(( & 0x0000ff00) ß>> 8), (unsigned char)(( & 0x00ff0000) >> 16), (unsigned char)( >> 24)0x00000010(0x00000009L)6(()->tv_sec  ()->tv_sec || ()->tv_sec == ()->tv_sec && ()->tv_usec  ()->tv_usec)0x00000010LTHREAD_BASE_PßRIORITY_MIN0x00000040L31360L1059L256630x000040000x0001100x0000SQL_INTERVAL_HOUR_TO_MINUTE0x000001000x000000020x00200000310x001800000x0284110x00028010L(100 + SQL_CODE_DAY_TO_HOUR)90x00001000L_HRESULT_TßYPEDEF_(0x80020005L)0x0000000810StartServiceCtrlDispatcherA0x70098338L0x000000800x14ERROR_NO_NETWORK(0x00020000L)119(WAVERR_BASE + 2)(CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)8202Lß5933"commdlg_ColorOK"573_HRESULT_TYPEDEF_(0x80092007L)5621001721900L1115L1((() &= ~MDM_MASK_PROTOCOLINFO), (() |= (()&MDM_MASK_PROTOCOLINFO)))_HRESULT_TYPEDEF_(0x80091009L)_HRESULT_TYPEDEF_(0x80004020L)ß(0x00000004L)0x00004002L(0x2)0x00000080UnregisterClassA0x00001406( 4 )71690x000100000x0002_HRESULT_TYPEDEF_(0x80094005L)4351L2AF_ECMAMAKEINTRESOURCE(32514)0x00000020(MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTRßOL_CT_UNITS_SIGNED)0x15((()<> 16))IMAGE_SIZEOF_NT_OPTIONAL32_HEADER( 1 << CERT_QUERY_ßCONTENT_PKCS7_UNSIGNED)0x00000020"2.16.840.1.113730.4.1"00x410x00020000L((DWORD)0x00000004)"2.16.840.1.113730"(TIMERR_BASE+33)8370L0x0000000283_HRESULT_TYPEDEF_(0x80010125L)6DocumentPropertiesAEXTERN_C constß IID DECLSPEC_SELECTANY  = {,,,{,,,, , , , }}0x0000001A0x00BDFileEncryptionStatusA(CERT_COMPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT)20x041910LLPOCNCONNPROCALoadStringA0x00000080SQL_QL_END_HREßSULT_TYPEDEF_(0x800F0002L)0x000000184"2.16.840.1.101.2.1.1.1"0x000000003110x100x000000030x200040x200000x00010x00000001"2.5.29.35"0x03180x00040000CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_REAßD_ACCESS)UpdateResourceA_MSL_BUFSIZ_HRESULT_TYPEDEF_(0x800F021FL)"1.3.6.1.4.1.311.10.3.5"0x40000000GetFileSecurityA0x12VarDateFromUI40x00001407_HRESULT_TYPEDEF_(0x80010107L)1333L5SQL_CURRENT_QUALIFIER(1 << VT_ßR4)0x00000080LDRVCNF_RESTART0x4001167L(1 << VT_R8)"2.5.4.33"MM_WIM_OPEN108489L((WORD )())20x000200000x00200000L90x00080x000B0x00001D00(MCI_VD_OFFSET + 3)0x80000x0000400CL_HRESULT_TYPEDEF_(0x80090308L)ß0x00000004200x00004000"1.2.840.113549.1.1.6"0x730x00004001L_HRESULT_TYPEDEF_(0x800B0005L)0x00000001L(WM_USER + 102)0x800000000340x000000020x00080000"2008"0x80x00060xffffU5586L0x00000040L0x0000000113SßNDMSG(, PSM_INDEXTOID, (WPARAM)(), 0)(WM_DDE_FIRST+1)((DWORD)0x0200)170x0100SQL_AUTOCOMMIT_ON0x00BB0x000000400x39"2.5.4.8"FILE_UNICODE_ON_DISK10x000002000xF0508210x000000000x00000004_HRESULT_TYPEDEF_(0x8ß001013BL)0UL0x020080x00000004SNDMSG(, PSM_APPLY, 0, 0L)4750x00010000((LPCSTR) 4)190x00207((DWORD)0x00000001)0x0000000aLRpcNsProfileEltRemoveA0x000008006_HRESULT_TYPEDEF_(0x80020008L)8209L_HRESULT_TYPEDEFß_(0x80092027L)(* (double *) __double_epsilon)2_HRESULT_TYPEDEF_(0x800C0016L)0x097054L((DWORD )0x40010003L)1111018TEXT("printOwner")321640x00000010(0x20000000L)0x00000001_HRESULT_TYPEDEF_(0x8009030CL)0L0x40ß0000000x00000004L40x80000x00000002L0x00000001800x00000004L0UL0x0000001065040962((DWORD )0x40010005L)"commdlg_ShareViolation"9610x000809001L0x000000100x0105L9625_HRESULT_TYPEDEF_(0x8004000BL)8524L0x0ß19830x0008_IOR('s', 1, u_long)1723L8531L0x000004001809L(-18)0x000000020x0002L20x00018414L0x000000400x00C00000L4118(LONG_PTR)(& ((( __RPC_FAR *)0)->))0"1.2.840.113549.2.5"0x000D000036"1.2.840.113549.ß2.4"0x00000020LL"commdlg_ShareViolation"SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0304)SetLocaleInfoAOemToCharBuffA0x04009613L12"1.2.840.113549.2.2"00x01_HRESULT_TYPEDEF_(0x80090325L)0x800010001359L1220x0117ß36L371378L0x00080x00000100L30x0000000870x00D6( (() & 0x20000000) )0CTL_CODE(FILE_DEVICE_SERENUM,130,METHOD_BUFFERED,FILE_ANY_ACCESS)SetConsoleTitleA0x00000001( 0x0008 )0x00000010L30x0410140x00000010SQL_ßINTERVAL_DAYSQL_PARAM_BIND_BY_COLUMN0x80020x00000001L0x000x80000x00000001(-1)(1)0x000000800x000200001345L1750242404L0x80000x00000007L44((DWORD)0x00000001)0x000000040x00200000_HRESULT_TYPEDEF_(0x800F0230Lß)FindFirstFileA0x00000008L0x120x08ERROR_BAD_PROFILE26L0x0000000820x27523_HRESULT_TYPEDEF_(0x80093023L)1111L0x00080000L(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DELTA_COUNTER | PERF_DELßTA_BASE | PERF_DISPLAY_PERCENT)ERROR_UNEXP_NET_ERR0x00000001L0x00000020MF_BITMAPSQL_UB_ON990x00E61051030x08000x000100000x08wsprintfA1373L_MSL_CLOCKS_PER_SEC0x0000800072((DWORD )0xC000013AL)1235LGetUserNaßmeA_HRESULT_TYPEDEF_(0x8009301AL)_HRESULT_TYPEDEF_(0x800401F9L)0x0000000216(ID_PSRESTARTWINDOWS | 0x1)8255L0x0000270x20410x00E00000( 1 )514(MCIERR_BASE + 256)147L(REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATßTRIBUTES | REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_SECURITY)1ULHELPMSGSTRINGA0x1B_MSL_IMP_EXP0GetPrinterDataA30x00000004L1(CDN_FIRST - 0x0005)61216L_HRESULT_TYPEDEF_(0x8004016EL)0x00040130L0x00000001L6àß((DWORD)0x80000000)(1U << 12)65STATUS_PENDING(DWORD)0x00440328PROPSHEETHEADERASCARD_ATTR_DEVICE_FRIENDLY_NAME_A0x000F0000SCARD_CTL_CODE(10)00x0400x000020000x00020000L1(TEXT("video/quicktime"))_HRESULT_TYPEDEFß_(0x80090013L)1009((=_midl_unma4(,unsigned long), (_midl_addp(,4)), (=_midl_unma4(,unsigned long))5066L(0x0400)60x0003L0x0((HWND)-2)SQL_NOSCAN_OFF0x000000020x00000002L7MK_S_ASYNCHRONOUS"1.2.840.113549ß.1.9.5"0x00290000(WM_USER + 133)SetPrinterDataA(MIXERCONTROL_CONTROLTYPE_SLIDER + 2)150x00020x00008000I_RpcServerUseProtseqEp2A(WORD)100000x04331140x00002000_HRESULT_TYPEDEF_(0x80093004L)8920x04312_HRESULT_ßTYPEDEF_(0x80110407L)CallNamedPipeA0x0432410x04300x000000080x400010x00000x0000003020x000000100x00000200L{0,0,0,0,0,4}10x0004ESB_DISABLE_LEFT0x00000002540x000040000x15022LGetKeyNameTextA0x004753640xß00000001L0x000000011825L0x00001000LCreateDialogIndirectA{ 0xdf9d8cd0, 0x1501, 0x11d1, {0x8c, 0x7a, 0x00, 0xc0, 0x4f, 0xc2, 0x97, 0xeb} }0x00000001L127CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DßATA | FILE_WRITE_DATA)10x00000004100057010L0x0000008003_HRESULT_TYPEDEF_(0x80028CA2L)TEXT("assetNumber")( 0x0010 )0x00000001L"1.3.6.1.5.5.7.3.3"0x0100_HRESULT_TYPEDEF_(0x8004020CL)0x020x020137100031318LVaßrI1FromI443((DWORD)-2)0x00000001RegSaveKeyALANGUAGEGROUP_ENUMPROCA0x00000001LImmGetDescriptionASTATUS_BREAKPOINT0x00002000(0x00B0 | XCLASS_DATA )( -4 )_HRESULT_TYPEDEF_(0x00040181L)0x021830x0008CharNextA1014ßL0x00000800330x000000040x10000"Memory"0x00000004L0x0000002d30x101411900x00002000L0x410x0002GetPrivateProfileIntA0x00080x140x80000400VarI2FromI40x00001407MM_MIM_OPEN7117OemToCharA2150(PSN_FIRSTß-13)8405L0x40060x00100000LPOPENCARDNAMEW0x00000000(0x000001F5L)0x00000001L0x00020x00002000LOpenDesktopA9016LSIZE_MINIMIZED(WORD)025008534L((ULONG)(ULONG_PTR) () )_HRESULT_TYPEDEF_(0x800C0005L)((BYTE)0x82)ßVarI4FromI40x0004L"2.16.840.1.113730.1"70x010x200LMAKEINTRESOURCE(32645)10057L2022L0x00000100_HRESULT_TYPEDEF_(0x80004014L)AddPrinterDriverA0x000100000x00001601298L((LONG)(LONG_PTR)&((( *)0)->))0_HRESULTß_TYPEDEF_(0x80004011L)(MCIERR_BASE + 51)0x00070x0000000F(0x0010)((DWORD)0x00000001)390x0145GetTabbedTextExtentA00x300x000110POPENCARDNAMEA0x000000200x0004017FL0x00000400L0x82_HRESULT_TYPEDEF_(0x00040001L)ß11SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0301)SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0208)SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0207)"2.16.840.1.113730.2"(MCIERR_BASE + 23)(WM_DDE_FIRST+5)PFNGETPROFILEßPATHA0x0003(RPC_C_AUTHN_LEVEL_CALL)1109L40x00000002(WM_USER + 110)SCardIntroduceCardType(, , , , , , , )0x202"CryptDllFormatObject"0x0010000040x00000001L0x30001810L1119L995LWritePrivateProfilßeStringA7( 0x80000001 )TEXT("printShareName")_HRESULT_TYPEDEF_(0x8002000DL)AF_PUP(-2)(WM_DDE_FIRST+8)0x02159128CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)0x00000010L10x00000000LImmGßetGuideLineA0x01f0240x00054390L188L( 2 )7THREAD_BASE_PRIORITY_LOWRTsndAlias('S', 'H')((BYTE)((DWORD_PTR)() & 0xff))0x40000x012A2655350x00000004L0x000000060x000000040x018D1786L_HRESULT_TYPEDEF_(0x800400ß02L)0x00000002L173009L(TEXT("application/octet-stream"))CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)0x00001Dff1320L0x0013_SEC_WINNT_AUTH_IDENTITY_A0x00160x000000040x000410x0004L0x00072àß46(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000003)1911L0x004013((LPCSTR) 1)11UL0x000000100x00000020L4(-1)0x000000020x0158"2.16.840.1.101.2.1.1.19"0x00010000L(SIF_RAßNGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)((DWORD)0x0080)220x00000001(MCIERR_BASE + 12)_HRESULT_TYPEDEF_(0x80010008L)"1.3.14"MAKEINTRESOURCE(22)SECTION_QUERY0x00020x000000000x000080001003TEXT("RemoteFax")0x10000ß000CreateFontIndirectA8321L0x00000001L5170x50000000L_HRESULT_TYPEDEF_(0x80004019L)(0x0004)0x01SCardListCardsA0x00E10x464D45200x01a40x00030x400000000x828540L0x00000002L2130x810x808361L0x7F8435LMDM_GEN_ßPROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_PAP, MDM_HDLCPPP_ML_2 ) )30x7E"2.5.8.1"(3 + MCI_SEQ_OFFSET)0x7D{ NDRcopy ( (((char __RPC_FAR *)())+()), ß()->Buffer, (unsigned int)(()-())); *(unsigned long __RPC_FAR *)&()->Buffer += (()-()); }0x00B1CreateDialogParamA0x7C_HRESULT_TYPEDEF_(0x800F0219L)0x7B_HRESULT_TYPEDEF_(0x80070006L)0x7A0(&()->userConteßxt)0x00000400L0x794318L4ERROR_INVALID_HANDLE0x110x130x00040120L32_HRESULT_TYPEDEF_(0x80040012L)0x10000x2000_HRESULT_TYPEDEF_(0x80091008L)_HRESULT_TYPEDEF_(0x8010002EL)(0x10000000L)0x00000100LGetCPInfoExAMAKßEINTRESOURCE(32640)20x0183CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0010L1_HRESULT_TYPEDEF_(0x800401A0L)0x004000002ERROR_CANNOT_OPEN_PROFILE_HRESULT_TYPEDEF_(0x80097009L)0x000008003àß8(MMIOERR_BASE + 16)10x00020000L( = (RPC_BUFPTR )((ULONG_PTR)(+3) & ~0x3))0x10050x00000100ESB_DISABLE_RIGHT( = (RPC_BUFPTR )((ULONG_PTR)(+1) & ~0x1))RegUnLoadKeyA0x700000000x00000006L2002LSCardStatusA0xß140x10000000_HRESULT_TYPEDEF_(0x800401F3L)"1.3.6.1.5.5.7.1""1.3.14.3.2.26"0x87(-2)0x86_HRESULT_TYPEDEF_(0x80090318L)(0x0080)0x850( = (RPC_BUFPTR )((ULONG_PTR)(+7) & ~0x7))0x00000003L0x840x80040170L0x04000ß00000x83_HRESULT_TYPEDEF_(0x80010118L)1743L0x00000002L0x000000139017LmmioOpenA0x0001000018LWaitNamedPipeADeviceCapabilitiesA0x00000000L0x00000800L( SecurityDelegation << 16 )0x00F30x80000000( 4 )__cdecl16àß0x00000080LIDI_HAND_HRESULT_TYPEDEF_(0x80010101L)1020x00020000L1780L31(DWORD)0xFFFFFFFFTEXT("portName")0x000A0x7SCARD_CTL_CODE(15)1281220x00040000GetMenuItemInfoA(-7)"CertDllOpenStoreProv"_HRESULT_TYPEDEFß_(0x80090020L)(0x0)CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)0x00004001L51898L140x00020x01270x62"2.16.840.1.101.2.1.1.2"_HRESULT_TYPEDEF_(0x80004003L)SQL_TRANSLATE_OPTION_HRESULT_TYßPEDEF_(0x80080008L)SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020b)330x040000000x00000001L2VkKeyScanASQL_INTERVAL_DAY_TO_HOUR0x00090x00000001L(0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)137L0x00000011(~MAXLßONG_PTR)5(MCIERR_BASE + 55)8424L0x000000020x04((DWORD)0x00000002)0x030C10105L0x80008525L0x010x0390x01A68218L128_HRESULT_TYPEDEF_(0x80093018L)10x03E0_HRESULT_TYPEDEF_(0x80110808L)0WSANO_DATA"2.5.29.15"ß45_HRESULT_TYPEDEF_(0x8011040DL)9606L(0x00000000L)10x14100x02003790x00010x0000000480x00000002L0x0000800020x40000x090x00000400L4((HRESULT)0x000400FFL)550x01000000(BF_DIAGONAL | BF_BOTTOM | BF_RIGHT)GeßtTempPathABLACKONWHITE5013L0x10x02(0x00000203L)0x00000007L11140x02000x00000008IID_IInternetBindInfoCRYPT_HASH_ALG_OID_GROUP_ID0xAWriteConsoleOutputCharacterA0x00010000L10047L0x00200000l0x000000020x019E0x0ß00D0x000000018mmioFOURCC('D', 'O', 'S', ' ')145042L0x000110200550x00000200_HRESULT_TYPEDEF_(0x80097002L)(MCI_VD_OFFSET + 2)5058L0x18((DWORD)0x00000020)0x000x00000008815072L20x00000800L((DWORD)0x00000010ß)_HRESULT_TYPEDEF_(0x80028028L)0x00022_HRESULT_TYPEDEF_(0x80010136L)"1.2.840.113549.1.7.2"0x002500000x00000040L0x00100000L15((LPCSTR) 19)0x3D00x000100001406Lsizeof(DWORD)12(WORD)60000x00000001L0x00011181Lß"%"0x00000001LFIELD_OFFSET(NOTIFYICONDATAW, szTip[64])_HRESULT_TYPEDEF_(0x8001000FL)200x00001000L1178L149L0x000000020x10x000400000x0207SCARD_CTL_CODE(16)(u_long)0xffffffff0x08416480x00000002L4334L2MF_DEFAßULT911060x00000080200x00000005360x050x494f0x00000000L65390x0010(()->pRecInfo)(MIDIERR_BASE + 1)50x00F2LoadKeyboardLayoutA20x020000000x1003MessageBoxA((LPCSTR) 15)_HRESULT_TYPEDEF_(0x80092029L)320xß00100000L_HRESULT_TYPEDEF_(0x8002000FL)typename Allocator::rebind<>::other0x00800x0( -7 )8442L1"1.2.840.113549.1.7.5"0x00010000LGetServiceKeyNameA0x08000U0x000FGetClipboardFormatNameA10TA_BASELINE0x0000002ß0L0x018C1052L0x00000400x0010"CryptMsgDllExportKeyAgree"0x00000009L0x0000_HRESULT_TYPEDEF_(0x80093105L)CallWindowProcA11283_HRESULT_TYPEDEF_(0x80090321L)_HRESULT_TYPEDEF_(0x80030202L)13SYSYNC_OEMDialogBoxA0ßxA10x0300(MMIOERR_BASE + 15)0x00000001L0x0000004070x0d0x00000100LMAKEINTRESOURCE(32513)FW_EXTRALIGHT0x0000L0x0008CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)(-2L)0àß271828L(1U << 3)8_HRESULT_TYPEDEF_(0x800B0102L)8320x000000FF12SQL_MAX_STATEMENT_LEN0x00000020L64615_HRESULT_TYPEDEF_(0x8004E027L)0L10x0300(WORD)65000_HRESULT_TYPEDEF_(0x800300FAL)1106L0x000500000x00000ß1000x00x0100'PSOC'0x000F10x000000040x015A0x0008L_HRESULT_TYPEDEF_(0x800C0013L)0x2030x00100x00004007L0x00000001_HRESULT_TYPEDEF_(0x8009700DL)0x000110x03000x10000x00001201RpcBindingInqAuthInfoExA0x0000000ß20x00020x000240x026610014(((int)((LPBYTE)(&((*)0)->) - ((LPBYTE)((*)0)))) + sizeof(((*)0)->))( 0x40 )"1.3.14.3.2.24"0x00000400L0x00004002L2565120x800000000x0001_HRESULT_TYPEDEF_(0x80093107L)1017(2)àß1824L1051L80L0x0400208L"2.16.840.1.113730.1.13""1.2.840.10046"_HRESULT_TYPEDEF_(0x80030103L)6100x00000002SQL_MAX_ROW_SIZE(((int)((LPBYTE)(&((*)0)->) - ((LPBYTE)((*)0)))) + sizeof(((*)0)->))0x20xC0EF(ß(DWORD )0xC0000017L)(WM_DDE_FIRST+4)_HRESULT_TYPEDEF_(0x80097018L)TEXT("printQueue")0x0144(((()>>N_TSHIFT)&~N_BTMASK)|(()&N_BTMASK))0x00D3_HRESULT_TYPEDEF_(0x800F0215L)140LSML_WBXML1396L52000x0003( 0x20 )(ß(DWORD)0x00000008)7038L1745L3006L( -3 )8200LmidiInGetErrorTextA5009L_HRESULT_TYPEDEF_(0x8004000AL)ExtractAssociatedIconA0x40020x000000030x11OemToCharBuffA197L0x000000010x000000400x1a11013L8404L(0x0002)0ßx000000011240x000000100x00080x00030x008E((LPCSTR) 32)1711L0x0100L10048LV_UNION(, scode)0x0001*((  *))++_HRESULT_TYPEDEF_(0x800300FFL)*((  *))++0x00000020(WM_USER+1)*((  *))++0x00000020((DWORDß )0xC0000091L)0xffffffffTEXT("MinorVersion")*((  *))++0x00000000L0x00040180L1140L5400x03424328L199_HRESULT_TYPEDEF_(0x80093021L)_HRESULT_TYPEDEF_(0x8001012AL)_HRESULT_TYPEDEF_(0x80010102L)1153LSQL_INTERVßAL_HOUR5031448L((DWORD)0x00000006)2"2.5.4.23"1EnumTimeFormatsA0x0003( ().cbSize - sizeof(().ulClipFmt) )12000x00000010L_HRESULT_TYPEDEF_(0x80090019L)"1.3.14.3.2.25"290x000000020x00000100L_HRESULT_TYPEDEFß_(0x80010007L)30x80000000558MB_ICONHAND170x130x000122_HRESULT_TYPEDEF_(0x80040180L)4323L426__cdecl2563(TEXT("text/richtext"))0x000000019714L((() >> 31) & 0x1)1080L0x020000000x0284CTL_CODE(IOCTL_STOßRAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0004010FL1761L(0x0010)RegCreateKeyA0x00010x00010000LSQL_WCHAR0x50000000L(( *)( (PCHAR)() - (ULONG_PTR)(&(( *)0)->)))0x00080000L1706L0x00000002L15813ß27LSQLINTEGER1401LAF_FIREFOX60x00000010(WM_USER+0)(MCIERR_BASE + 1)0x0001_HRESULT_TYPEDEF_(0x8009310EL)0x0008L(0x00000002L)(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_TIMER_TICK | PERF_DELßTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)4(MMIOERR_BASE + 9)1118L__cdecl0x00008000L(CERT_SYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)5048L220DrawTextExA0x000F4452108L280xFE__stdcallSQLSetPoßs(,,SQL_UPDATE,SQL_LOCK_NO_CHANGE)720x06(-2)3UL0x0010530xffffffff_HRESULT_TYPEDEF_(0x8009700CL)_HRESULT_TYPEDEF_(0x80040112L)( -8 )0(-21)30x00002000L25SQL_INTERVAL_SECONDILLUMINANT_C6003L1425L0x0496ß970080x000001000x3CB0x04950x04940x000000040x0010(0x00000008L)tzsetCTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)0x049353_HRESULT_TYPEDEF_(0x80110434L)0x00010000l0x0492(-1)160x000040ß04L0x04910U0x04900x00000002L_HRESULT_TYPEDEF_(0x80010127L)530x000100004314L0x01628364L(CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)0x000114120x000000000x00041034100ßx0001LSCardGetCardTypeProviderNameA(TEXT("video/x-sgi-movie"))10x04970x40070x000004000x0000200013"1.2.840.113549.1.9.9"( 8 )SNDMSG(, PSM_RESTARTWINDOWS, 0, 0L)CharNextA411010L((DWORD)0x00000102)0x00001805(ßMIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)_HRESULT_TYPEDEF_(0x80090332L)0x8000000030x0000200070x00004000_HRESULT_TYPEDEF_(0x80010120L)80x00040x40AbortSystemShutdownA1238L10x000000140x000001000x00001000L((UINTß)-1)(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA_ANY)3(void)SNDMSG(, CDM_SETCONTROLTEXT, (WPARAM), (LPARAM)(LPSTR))(WS_POPUP | WS_BORDER | WS_SYSMENU)2(0x1)0x002010049LSQL_QUIET_MODE0x3A3(ALG_CLASS_DATA_ßENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES_112)8(0x0001)0x016L0x0004(WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)SQL_QU_PROCEDURE_INVOCATION0x043f0x043b120x043e0x043a0x00000x043d0x043912811014L(-7)CERT_RDßN_DISABLE_IE4_UTF8_FLAG0x043c0x04380x0211((DWORD)0x0002)0x000012030x10000000L10071L(0x00000008L)100050x061C0x000001000x20(-2)1903L0x2000551021L132L10x004000004L0x002000001336L0x00100000232LHC_NOREMßOVE0x000800008017L"CryptDllFindOIDInfo"20x00040000110x000200000x0BReadConsoleInputA0x000100000x000110080x0040"1.2.840.113549.1.9.4"0xF1708417L40x00000C00L0x0004019FLEnumWindowStationsA0x0064CTL_CODE(IOßCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)35_HRESULT_TYPEDEF_(0x800401EFL)10058L1411L0x00MAKEINTRESOURCE(32513)15(-3)0x0000000a0x0200(CDM_FIRST + 0x0004)LHashValOfNameSys(SYS_WIN32, , )80xß4000L0x010000000x00010x0080000062((DWORD)0x00000001)0x00040000L0x534B_HRESULT_TYPEDEF_(0x800F0217L)(0x00000207L)"1.3.14.7.2.2"_HRESULT_TYPEDEF_(0x8004006BL)SQL_BIT20RpcNsProfileEltAddA0x00D4_HRESULT_TYPEDEF_(ß0x80040206L)LogonUserA510CharUpperA0x00010000L64POPENCARDNAME_EXA0x1dSCHAR_MIN_P_DETACH0x00000005_HRESULT_TYPEDEF_(0x8011042CL)0x00040110L2378354L((DWORD)0x0020)((__std(size_t)) &((( *) 0)->))0x0000080ß0L0x03031171L(0x80000007)Shell_NotifyIconA10055LSecurityImpersonation0x000100000x000000130x00114(~0UL)0x424D5144_HRESULT_TYPEDEF_(0x80110418L)GetDefaultPrinterA20x02FA1364L8422L20x04000000( CERT_CHAIN_POßLICY_IGNORE_END_REV_UNKNOWN_FLAG | CERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAG | CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG | CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG )11371L0x00000100L40UL0x0228DecryßptFileA((sizeof() == sizeof(float)) ? __fpclassifyf((float)()) : (sizeof() == sizeof(double)) ? __fpclassifyd((double)()) : __fpclassifyl((long double)()) )ImmSetCompositionFontA1125LVarCyFromUI49655L0x400000ß00DATEFMT_ENUMPROCA0x00010x00000010CreateDirectoryExA0x00000002160x08001(0x4)0x00000010SHAREVISTRINGA0x000000000x000000101389L-250x0001SCardSetAttrib0x0008120PROPSHEETPAGEA_V1_SIZE0x00000002655339SQLß_TXN_READ_COMMITTEDMS_DEF_DSS_DH_PROV_A0x240x00000080FILE_DEVICE_DISKERROR_GEN_FAILURE(0x3)(0x00040000L)190x0006_HRESULT_TYPEDEF_(0x8011044CL)8360L"http://www.synthesis.ch/sync"0x00002000LSCardForgetReaderA15ß430x012BCERT_RDN_ENABLE_UTF8_UNICODE_FLAG0x80000080TEXT("printOrientationsSupported")5_HRESULT_TYPEDEF_(0x8004E028L)0x00000002((LPCSTR) 21)0x000000031SetWindowTextA13ImmGetCompositionFontA28730x3D2MAKEINTRESßOURCE(10)ILLUMINANT_AResetDCA0x00050x00000010( & (7 << 13))0x0000000227(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE| TIMER_QUERY_STATE|TIMER_MODIFY_STATE)(0x8)100x00010x3A220x220x00000007L0x08190x000210x000000ß40SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA005)MAKEINTRESOURCE(32515)0(MCIERR_BASE + 72)517(PSN_FIRST-12)20x0d20x00002000L(WM_USER+1)(-1)0x1004WNetConnectionDialog1AFindWindowA"/ "0x00ß0401FFL1210x00058494L0x00800000RpcNsBindingExportA_HRESULT_TYPEDEF_(0x8010001AL)_HRESULT_TYPEDEF_(0x800300FDL)27(CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)_HRESULT_TYPEDEF_(0x80097017L)_HRESßULT_TYPEDEF_(0x80010124L)71L0x00000800(0x00000004L)0x00200x000000040x000002000x00010x010000005WNetGetLastErrorA0x00C9SetPrinterDataExA(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_PCT1_MASTER)8481LwaveßInGetErrorTextA32SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXTCMSG_SIGNED_DATA_V10x100070x000000022013L((DWORD )0x00010002L)(CDM_FIRST + 0x0005)0x00040x10080x00100000LERROR_DEVIßCE_ALREADY_REMEMBERED94(MMIOERR_BASE + 7)0x00021234L0x00021717L22AddPrinterDriverExA0x00000040L(-6)((()<> MDM_ßSHIFT_PROTOCOLID)0x00100x000000010x00000008__stdcall1610L850x000E0000_HRESULT_TYPEDEF_(0x80097004L)20()0x00000100L0x000000000x00000002L0x00000000QueryServiceConfig2A5RpcNsMgmtEntryDeleteAENUMRESNAMEPROCAß0x01000x00000004(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000001)5084L0x00080000LAF_NS0x0104(struct _EXCEPTION_POINTERS *)_exception_infoDeletePrintProvidorA0xC0xFFFFFFFFßV_UNION(, pintVal)0x800x00000040l(MMSYSERR_BASE + 6)3(SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS)0x0010000000x00000020l"2.5.29.5"0x00000010l0x01000000L0x00080x00040x00021240L0x000000800x00010ßx00000001L0x00002000L((DWORD)-1)327672( 1 << CERT_QUERY_CONTENT_SERIALIZED_STORE)10LoadMenuIndirectA10009L5057L0x00000010L0x80008000450x00000100l0x00000080l0x50001(-5L)0x00000005L70x040x0000002((((WORD ß)()) << 10) | (WORD )())0x00240000FindResourceAImmGetIMEFileNameAURLOpenBlockingStreamACTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)CCSIZEOF_STRUCT(PROPSHEETPAGEW, pcRefParent)mixerGetLineConßtrolsA1024( 1 << CERT_QUERY_CONTENT_SERIALIZED_CRL)3170x00000400L40x800000100x000000010x00000008268TEXT("printerName")0x0003LCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00000400L( ß4 )14_HRESULT_TYPEDEF_(0x80010012L)0xffff( 0x100 )0x000000240x4001((STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE))0x000000800x0000800011120x00010000(0x00000000L)1549RegEnumKeyAàß30x00000001(WM_USER + 132)0x00008000((DWORD)0x00000001)0x0f1802L2560x8(MCIERR_BASE + 71)240x0000005200x000100000x08000x000000010x0008121218L__inline0x00060x10x40GetTimeFormatA((HRESULT)0x00040000L)13ß32L(MCI_STRING_OFFSET + 18)_HRESULT_TYPEDEF_(0x800401ECL)0x0200"2.5.4.36"0x00004001L11CreateSemaphoreA00x00000080LRpcBindingInqAuthClientA0x000000070x150x81131L0x00010x0007CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3ß, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00000040(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1)0xffff10x800401FFL1358L0xF0000x00010000L0x000000200x00000020L0x00090x05(100 + SQL_CODE_MINUTE_TO_SECOND)_HRESULT_TYPEDEF_(0x801ß0002BL)"2.16.840.1.101.2.1.1.12"0x00004000L2001L0x00000004IME_CMODE_NATIVE(MIXERCONTROL_CONTROLTYPE_FADER + 2)3580x000100008497L0x1000000266L0x00004005L(0x0010)40x00000x00000002LSYSER_PRODCODE_CLIENT_OUTLOOKß_PRO(MAKELONG((short)(().x), (short)(().y)))0x00000004L1053L521608L(1U << 2)0x002600000x0800L1775L0x00000002LERROR_IO_PENDINGGetLocaleInfoA_HRESULT_TYPEDEF_(0x80010121L)(0x1000)1334L0x000000040x00000010àßsndAlias('S', 'E')130x000000010x0800"\n"0x00048545L"1.3.6.1.4.1.311.20.2.3"0x0008_HRESULT_TYPEDEF_(0x80096001L)0x000000100x00020x00020000L0x000000040x0416DCB_ACCUMULATE0x02(100 + SQL_CODE_MINUTE)938400L0xß70TEXT("printMaxYExtent")_HRESULT_TYPEDEF_(0x80100010L)0x00200000( 50 )20x01510x00000008L73NULL"1.2.840.113549.1.10"0x0020_HRESULT_TYPEDEF_(0x8001010DL)AF_DECnet0x00004003L138L9"1.2.840.113549.1.12"0xffffffßff0x0004qword ptr 0xbfd2bec3330188660x00008000LTEXT("printMaxXExtent")0x7003600x8004019FL151006L0x0080((DWORD)-1)11DeleteMonitorA8243LmciSendStringASQL_OPT_TRACE0x000000200x00004007L8490L1211L00x0002000ß0L(() & 0x00ff)SetMenuItemInfoA8313L0x800002000x00000001L0x00000000L(MMSYSERR_BASE + 7)170x000000019998475L0x370x0080L0x00150POPENCARDNAME_EXW024SQL_RD_ON(MMSYSERR_BASE + 9)16(0x2000)8376L0x0008NDRß_LITTLE_ENDIAN(MIXERR_BASE + 2)0x019A_HRESULT_TYPEDEF_(0x800F0200L)_HRESULT_TYPEDEF_(0x800F0000L)(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_TLS1_MASTER)ERROR_NO_MORE_DEVICES( 6 )268399LERROR_MAX_THRDS_REßACHED15450x00000002(1 << CMSG_SIGNED)6ENUMRESTYPEPROCA10x02000x00000200L0x0a320x00004006L1"1"2SNDMSG(, PSM_SETHEADERTITLE, (WPARAM)(), (LPARAM)())(fpclassify() == FP_NAN)12090x000000017(-1)_HRESUßLT_TYPEDEF_(0x800B010EL)0x8004010FL0x00020000L500_HRESULT_TYPEDEF_(0x80030111L)0GetSystemWindowsDirectoryA0x00000004L0x00001000L0x00020x00000008L20x00800000TEXT("printerNameAliases")3_HRESULT_TYPEDEF_(0x801104ß4BL)9615L240x00000093146LGetCharWidth32A7GetWindowsDirectoryA((DWORD)0x10000000)0x000B0x0(_midl_ma4( , unsigned long) = , _midl_ma4( , unsigned long) = 0, _midl_ma4( , unsigned long) = )0x081120x090ßx000000010x00300000((WORD)0x0200)0x0004L0x011467L(0x00000202L)SQL_COLUMN_MONEY210x0004"CryptMsgDllGenContentEncryptKey"0x00021140x00000005L130x0000100041000x00000200L60x020x00000003DWLP_DLGPROC + sizeoßf(DLGPROC)0x000100000x00104_HRESULT_TYPEDEF_(0x800F0212L)3212(BF_DIAGONAL | BF_BOTTOM | BF_LEFT)mmioStringToFOURCCA(MMSYSERR_BASE + 12)30x0000100057100540x00000000URLOpenStreamAPI_CLSIDLOOKUPpsh15_HRESULTß_TYPEDEF_(0x800F0003L)IInternetProtocolSink(-1)58(BDR_RAISEDINNER | BDR_SUNKENINNER)_HRESULT_TYPEDEF_(0x80093002L)1074( 0x4 )99720x000D960x3D1_HRESULT_TYPEDEF_(0x800C000AL)DECLSPEC_IMPORTTIMEFMT_ENUMPROCA0xß00400x023010x00000002L0x00800xF0606((DWORD )0x80000001L)0x0920x0020190480x003000000x001020x00000000L201184300L0x00015130x20x0008CreateFontAWriteProfileSectionA0x10060x00020000V_UNION(, intVal)ß110x02900x0200000030x00400x01(-5)10x3B80x0008L0x000x3C50x00000001LSQL_MAX_CONCURRENT_ACTIVITIESERROR_BUSY0x00041400L45322102410030x2000042113NULL( 1 << CERT_QUERY_CONTENT_SERIALIZED_CTL)"CertDllVeßrifyRevocation"8(1U << 4)0x5(MCIERR_BASE + 35)0x0001L_HRESULT_TYPEDEF_(0x80093106L)4315L0x000100006'sRGB'_HRESULT_TYPEDEF_(0x8001013FL)0x100a0x05490x8004016FL0x00000200L_HRESULT_TYPEDEF_(0x8009100FL)560x00ß0000019505L1712L0x000001005((() & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))0x00004008L40x0001_HRESULT_TYPEDEF_(0x80080007L)( -6 )050x170x001002NOTIFYICONDATAA_V1_SIZE0x0521OpenEventLogA0x00000ß0010x00000008850x01000000L0x4000000x000000001"2.5.4.30"61151394L0x29SQL_OWNER_USAGE0x000000000x8000119010069L((DWORD)(((BYTE)() | ((WORD)()<<8)) | (((DWORD)(BYTE)())<<16)))0x00050x0004880x00000004àß10101L9851Ldo { u_int __i; for (__i = 0; __i < ((fd_set FAR *)())->fd_count ; __i++) { if (((fd_set FAR *)())->fd_array[__i] == ) { while (__i < ((fd_set FAR *)())->fd_count-1) { ((fd_set FAR *)())->fd_array[__i]ß = ((fd_set FAR *)())->fd_array[__i+1]; __i++; } ((fd_set FAR *)())->fd_count--; break; } } } while(0)(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1)((()&(~1))==0)(0x0080)27L10x0000002b60x00000400L0x0000002c01635L3àß(-6)0x0000002d10x0000002e0ULSQL_MAX_TABLES_IN_SELECT0x000000200x023(MIXERLINE_COMPONENTTYPE_DST_FIRST + 1)LoadBitmapA0x00040000L(( >> CRL_DIST_POINT_ERR_INDEX_SHIFT) & CRL_DIST_POINT_ERR_INDEX_MASK)0x10080x00ß00002cmmioFOURCC('M', 'E', 'M', ' ')60x0301224L3TEXT("description")31634L0x00000002L0x1354SetFileSecurityA0xFF00000010x003380x00004000L0x800000800x00000100L85076LSHGetDiskFreeSpaceExMM_MIM_ERROR10(0ßx00000015L)13000x00004000L0x012D1924L"2.5.4.34"28200x00010000LWHITEONBLACK1010L0x00010000L0x000D438217L200x100x00004000200x3D00x000000551UL0x0400((BYTE)(()>>16))0x000000040x0000001d8211L0x000000ß1c0x035F80L0x80000000L_HRESULT_TYPEDEF_(0x8002802DL)11011L20640x0281((DWORD)0x0020)0x00050x000000190x10000000LSTATUS_FLOAT_UNDERFLOW0x00040x000200000x00000018_HRESULT_TYPEDEF_(0x80010119L)0x0000001b0x0002àß0x00040x0000001aSetPropASendMessageA0x460x00000001LChangeServiceConfig2A0x00007FFFERROR_INVALID_SECURITY_DESCR0x00000015290x00000004160x1150x00000017GetPropA1410x0000001600x000000400x00000040L8302L0x00ß400000(TRUE)( 0x4 )0x200000000x000100000x004021064SCardAddReaderToGroupA0x0004E02FLwaveInGetDevCapsAPFNRECONCILEPROFILEA0x0002(0x00000006L)22((KEY_READ) & (~SYNCHRONIZE))2920x00800000L5140x046637_HRESULTß_TYPEDEF_(0x8003001EL)SYSER_PRODCODE_CLIENT_LIB_WIN3280x000000020x000020000x60x130x5D10VarBstrFromUI430x00050000L0x000121_MSL_ERROR(, )6717(CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)WNetOpenEnumA110ßx00000003L70x0000100440x00000004690x0005L(0x000001F6L)0x80010000INFINITE_HRESULT_TYPEDEF_(0x00040000L)CreateProcessAsUserA490x040000000x04660x04060x04650x0405((WORD )() & 0x3ff)10001PropertySheetA00x0ß4640x04043(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)0x04630x04030x04620x04020x00010x04610x040140"2.5.4.17"0x04600x04008410L1435LOutputDebugStringA640x80008341L0x00040x00000000L8368L"1.3.14.3.2.9"0ßx00B000001(MMSYSERR_BASE + 21)0x01A80x00B40x0002000011420x0001PSCARD_READERSTATEW0x004000000x04680x04080x00020x000000200x06_HRESULT_TYPEDEF_(0x80040003L)00x4000000010x04670x0407SetClassLongW50x0010EnßumPrintProcessorDatatypesA1L0xA310140x2000L0x0161__stdcall0x00080000LPSCARD_READERSTATEA10x00004002L_MSL_ERRNO1ULCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)SetClassLongACTL_CODE(FILßE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00000008113L7827(MMSYSERR_BASE + 11)15430x000001001544((LPCSTR) 38)GetConsoleTitleA0x000000010x10000x00010x00000004L(0x00000204L)((DWORD )0xC000008ßEL)0x000000400x001B000061090x00000002_HRESULT_TYPEDEF_(0x800401E1L)1906L33L0x000002002SNDMSG(, PSM_CHANGED, (WPARAM), 0L)1724LGetClassLongW0x00000004L10x00004004L(0x0020 | XCLASS_DATA | XTYPF_NOBLOCK )0ßx00000001L5910x00002000LCryptSignHashA104(PSN_FIRST-0)"1.2.840.113549.1.7.4"9009L_HRESULT_TYPEDEF_(0x80100017L)8352L5( 1 << CERT_QUERY_CONTENT_CRL)0x0004000041060x3050x00000002RegQueryValueA4339Lqword ptrß 0x3fda82795703f2d4GetClassLongA113L0x000000001012250L11RegDeleteKeyA0x00000002L0x00008000( 0xf008 )25FW_EXTRABOLD8482L_HRESULT_TYPEDEF_(0x8009030BL)0x00100x00000020510x007F8420L(&__std(__files[0]))69ß5043L80x00100x00801_HRESULT_TYPEDEF_(0x00041306L)1550x40040x00000020CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)0x000000150x0010L1840x00000000L90000x00804100x000000013RemoveFontResoßurceA18488L{ *() = *(*(char __RPC_FAR * __RPC_FAR *)())++; }0x00021081L(TEXT("audio/basic"))0x00000020L0x000020000x00010000L_HRESULT_TYPEDEF_(0x800401E0L)0x0415EnumResourceNamesA384000x000C}0x2( 0x800000ß00 )L1916L0x20000000UL4SQL_INTEGER0x00000080l0x0148SQL_COLUMN_TYPE_NAME2(0x8)0x1000000018EnumFormsA0x00001011_HRESULT_TYPEDEF_(0x800300FEL)09618LSQL_COLUMN_UPDATABLE((DWORD)0x00000004)0x0086()(0)SNßDMSG(, PSM_QUERYSIBLINGS, , )CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)10x00040000L_HRESULT_TYPEDEF_(0x80100005L)9552L140x0001173L120x00100x4000_HRESULT_TYPEDEF_(0x8001012EL)_ßHRESULT_TYPEDEF_(0x800401F6L)0x0000000238MAKEINTRESOURCE(32512)0x00000003671162L1640xA20x0000FFFF(MCIERR_BASE + 69)_HRESULT_TYPEDEF_(0x80100011L)DefFrameProcASQL_AUTOCOMMIT0x019F_HRESULT_TYPEDEF_(0x80010005L)ß0x000000040x00100000l55CF_NOVECTORFONTSCertStrToNameAszOID_RSA_RSA0x14_HRESULT_TYPEDEF_(0x80100019L)0x800401AFLCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)3"2.5.4.6"130x000000018CTL_ßCODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)"1.2.840.113549.1.7.4"0x000100001601L( 1 << CERT_QUERY_CONTENT_CTL)0x00000080L0x0004_HRESULT_TYPEDEF_(0x80091004L)32853551369L1129L0x00040x0000ß00080x00400x000561"Demo expires after " EXPIRY_DATE_STRING " if not registered"0x00020000L_HRESULT_TYPEDEF_(0x80100012L)0x00400000L3AF_IPX370x0000200000x00048233LGetPrivateProfileSectionACTL_CODE(FILE_DEVICE_ßFILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)(-1)2TEXT("BeepEnabled")0x0001"%"ERROR_NONE_MAPPEDMB_ICONHAND0x0400L0x000240x01001030x00000F00L0x20000xFFFFFFFFCreateServiceA0x00AF_ISO0x00010000L0x3D1dßo { if (((fd_set FAR *)())->fd_count < FD_SETSIZE) ((fd_set FAR *)())->fd_array[((fd_set FAR *)())->fd_count++]=();} while(0)80x0000000032MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_ANALOG, MDM_GEN_ANALOG_PROTOCOL_DATA ß( MDM_ANALOG_RLP_OFF ) )388477L0x00000020(TEXT("image/bmp"))0x00000019((VOID *)(INT_PTR)((int)))0x0400(-3L)14"1.3.14.3.2.7"290x01000000GetJobA0x421538153L0x0400"1.3.6.1.4.1.311.10.3.1"_HRESULT_TYPEDEF_(ß0x80040209L)60x00000400141L28L0x00020x01820virtual HRESULT STDMETHODVCALLTYPE 0x150x000000403()0x153004L(PSN_FIRST-10)0x00000001100x000900x0002sz_CERT_STORE_PROV_FILENAME_W0x00000040L(1*4)(MIXER_OßBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)5virtual  STDMETHODCALLTYPE 0x00000001320x107 STDMETHODVCALLTYPE10060L612UL(().HighPart = () < 0 ? -1 : 0, ().LowPart = ())60x00020x001A000080x80000020(2)8ß_HRESULT_TYPEDEF_(0x800401F4L)0x00023300x00010000L0x00FF0x00020000(8<<4)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_DEFAULT, MDM_HDLCPPP_ML_2 ß) )0CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_ANY|ALG_SID_MD5)(MIXERLINE_COMPONENTTYPE_DST_FIRST + 3)0x000023280x0004L(~MAXINT_PTR)0x1000àß_HRESULT_TYPEDEF_(0x80093022L)0x000000010x454C4946L(-5)0x00000040L_HRESULT_TYPEDEF_(0x80092003L)8329L0x00801(-3)1004((LPCSTR) 3)0x100x00000001((BYTE)())(MCIERR_BASE + 33)_HRESULT_TYPEDEF_(0x00030206L)FILE_ßCASE_PRESERVED_NAMES25_HRESULT_TYPEDEF_(0x80090024L)0x800000((DWORD)((((DWORD)((WORD )())) << 16) | ((DWORD)((WORD )()))))SCardIntroduceCardTypeA(MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_SINGLE | MIXERCcONTROL_CT_UNITS_BOOLEAN)TA_CENTER1353L"LocalizedNames"0x0310x00000004( 2 )1713L70x000000ffâ`ºáÌ~äpºøâØ~䀺¸âÛ~亠âæ~ä ºxâí~ä°ºPâ èâ"äкdá$è@á&è¬á)å»áHèÐáTä »áZè¨á_èHáuäP»Ðáä`»¬áƒäp»Œá†ä€»pá‘ä»Dá“ä »(á¬ä°»¸á°è”á·äл áÂèìáÍè˜áH€èáX€ä¼ ád€ä ¼Ìág€ä0¼¨át€è”á{€äP¼Èá€è|ᎀäp¼, ᙀèüᛀä¼À á¢€è¨ á¤€ä°¼X ᯀè áÀèt áÅ€äà¼0 áÌ€è áÝ€å½L á߀ä½0 áæ€ä ½¼ áò€è| áý€ä@½œ áè| áä`½ü íä á è< íÜ á âÜ?åð á ä´½\á&è0á-äÔ½(á3ää½ á?äô½øáFèØáHä¾,áSä$¾ á_ä4¾¼ákèŒáwäT¾øá†äd¾ á‰ètá”䄾0á¨èá³ä¤¾Ôá¾ä´¾´áÚäľ áåè|áèä侜áíäô¾Xá ‚éá‚ä¿díá‚èœá‚äD¿Tá'‚äT¿@á2‚è(á9‚ät¿„á;‚è\áI‚䔿XáO‚䤿<áZ‚è á]‚èèáy‚äÔ¿Œá…‚ètá ‚äô¿¤á£‚äÀᨂâÜ?åᾂä(ÀDáÒ‚ä8Àìáé‚èÈáô‚äXÀìáý‚èÌáƒèdáƒäˆÀhá(ƒä˜Àá@ƒä¨ÀìáBƒä¸ÀÌáaƒè¸áhƒäÜÀDásƒâÜ?áìÀÈᇃèŒáãƒä Átá„èXá„ä,ÁXá„ä<Á0á„èá„ä\Áá%„èxáM„ä|ÁðáT„èØá`„äœÁìág„è|ᮄèẄäÌÁ°éÜÁœáÀ„äìÁ€áÄäüÁTáâ„è8é  áè„èX áê„ä<Âð áñ„èØ á…ä\”!á…äl€!á…èd!á#…äŒÂ"á.…èÀ!á0…èd"á4…è4#á@…äÌÂè#áD…äÜÂÄ#áJ…è #áP…äüÂ|$án…è4$ás…äÃ&áz…èô%á}…è\&á—…äLÃ8'ᜅèÐ&ៅè(á¡…ä|Ô(ᨅäŒÃp(ᯅèP(á²…ä¬Ã)á´…èÔ(áÁ…äÌÃ*áÄ…äÜÃÔ)áÐ…äìä)áï…è\)áù…ä ÄÔ*á†èl*á†ä,Ä@+á †è(+á†èp+á†ä\Ä`,á†èD,á,†ä|Äø,á7†äŒÄÈ,áU†äœÄ¨,áX†èˆ,á^†ä¼Äˆ-ái†èh-჆äÜÄ.á–†èð-ᡆèð.ᬆä Ũ/ḆäÅ”/ῆè4/áʆä<Å0áô†äLÅð/áû†èØ/á‡èH0á ‡ä|Å$1á‡èà0á2‡äœÅè1á9‡èÌ1á<‡è82áH‡èœ2áN‡äÜÅ@3áZ‡è(3á_‡äüÅ4ám‡ä Ƽ3鯠3áo‡èx3áއä<Æl4ᕇäLÆT4á ‡ä\Æ@4᥇è 4ᬇä|ÆÀ4ᲇè¬4íà4áLJ䬯¬5á̇èP5áׇäÌÆP6áö‡äÜÆÜ5á ˆèÈ5áˆäüÆ7áˆä Çè6á-ˆè€6á4ˆè`7á9ˆä<Çø7áDˆè7áKˆä\ÇÈ8áPˆälÇ8áTˆä|Çd8á[ˆèD8ábˆäœÇ¸9áhˆä¬ÇŒ9ásˆä¼Ç9á’ˆèø8᱈äÜÇô9ḈèÐ9áLjäüÇ´:á͈ä È”:áÙˆäÈp:á߈èH:áåˆä<È ;áëˆäLÈX;á÷ˆä\È8;â‰älÈ;á ‰èø:á‰äŒÈ <á‰èä;á‰ä¬Èh<á$‰èD<á/‰äÌÈ=á2‰èÔ<á4‰äìÈá>á9‰äüÈh=á;‰è4=á=‰äÉ”>áK‰èp>áe‰èÀ>áp‰è?Έä\ÉÄ?áĉälɨ?áωä|ÉŒ?áÚ‰èl?á݉äœÉp@áè‰ä¬ÉP@áû‰ä¼É0@áWŠè@ánŠäÜÉ4AáŠäìÉAáŠèô@á’Šä Ê€AᘊèlAáŠä,Ê,BᲊèðAᾊäLÊCáÉŠä\ÊèBá‹älÊÈBá‹èŒBá)‹äŒÊÈCá/‹è°Cá:‹ä¬ÊDEáF‹ä¼Ê Eá_‹äÌÊÈDéÜʬDáf‹äìÊŒDáj‹äüÊ\Dáu‹ä Ë4Dá‹äËDíèCᇋä<ËÀEቋèpEᨋä\Ë G᪋äl˸Fé|ËF᱋äŒË|FὋäœËdFáÄ‹èHFáÇ‹è0GáÍ‹è„GáÔ‹èÀGáÛ‹äìËHáú‹äüËüGáÿ‹èÜGá ŒäÌpHáŒèLHáŒèÜHá ŒäLÌ“ä°ÕTqáD“äÀÕ qáP“äÐÕüpáo“èØpáu“äôÕ ráw“âÜ?áÖôqáÊ“èÀqáä“ä$Ö˜ráæ“èLráí“äDÖ€sá ”èsáh”ädÖ,tás”ätÖtáy”ä„Öàsᘔè sáž”ä¤Ö tí€tᢔäÄÖLuáДäÔÖuéäÖütá•èÔtá•è´uá•ä× vá$•ä$ׄvá7•ä4×pváB•äD×TváD•è@váH•èÀvá\•ät׸wá^•ä„×€wáb•è@wám•ä¤×xá•èÐwá…•è\xጕäÔ×ty᎕ää×Hyᔕäô×yᙕè¼xᥕäØzáÄ•ä$ØøyáÒ•ä4Øäyáå•äDØÄyáì•è¨yá –èÀzá–ätØ {á!–èôzá#–䔨œ{á'–èT{á<–èð{áC–äÄØ°|áN–äÔØŒ|áR–èt|á…–èü|éÙt}ᘖè8}ᤖèÀ}á§–ä4Ù¨~á®–äDÙ~ẖäTÙt~áÍ–è\~áÛ–ätÙháÝ–ä„ÙHáá–ä”Ù0áã–ä¤Ùáæ–éáè–äÄÙ€áë–èÜáí–ääÙááô–äôÙ¬€áÿ–äÚ\€á—äÚ4€á1—è €áA—ä4ÚDáG—èáN—è¨áV—ädÚ`‚á]—è8‚ái—ä„Úè‚áo—ä”ÚԂთä¤Ú¼‚á—ä´Ú¨‚ᔗ蔂ᥗäÔÚ|ƒá¬—è`ƒá¶—äôÚ„áÍ—äÛT„áÙ—è„áÞ—ä$Û…áê—èÀ„â˜äDÛp…á ˜äTÛH…á˜è0…í¼…á˜ä„Û˜†á"˜èl†áA˜ä¤Û,‡áG˜èð†áM˜èl‡áX˜äÔÛ$ˆác˜ääÛȇág˜è¤‡ám˜äÜðˆáx˜äÜœˆáz˜ä$Ü„ˆá…˜èdˆá‘˜äDÜl‰á–˜è ‰á¦˜ädÜlŠá±˜ätÜXŠá³˜ä„Ü8Šáµ˜ä”Ü$Šá»˜ä¤Ü ŠáϘèà‰éÄÜ`‹áјäÔÜD‹áÓ˜é‹áÞ˜äôÜŒáã˜èè‹á™äÝ´Œá™è|Œá™ä4Ýáá ™èäŒá™äTÝ„á+™ädÝ\á/™è<áF™ä„ÝŽáM™èØá_™ä¤Ý¼é´Ý˜áf™äÄÝ`ák™äÔÝ$áv™ääÝá™äôÝìŽáˆ™äÞȎ᎙討ᔙä$ÞÈá›™ä4Þ„á§™äDÞdá³™äTÞHá¶™èá½™ätÞH‘áÙè ‘áÏ™ä”Þá’áÚ™ä¤Þè‘áé™ä´ÞÔ‘áù™äÄÞ´‘áû™èt‘ášääÞ¤’í(’ášäßl“á#šäß(“á(šè“á,šä4ßà“á1šäDßÌ“ášè “ášädß„”ᯚätßl”᳚ä„ßP”á¶šè0”Ṛä¤ß$•áÄšèð”áÊšè\•áîšâÜ?áØß•á›èp•éøß –á ›èè•á›è@–á›ä(àÄ–á›ä8à„–á4›è`–á?›äXàà—áC›ähàÀ—áN›äxगáT›èˆ—áj›è,˜áo›ä¨à`˜á„›èH˜á†›äÈàè™á•›äØà°™éèàh™á˜›äøàP™á«›äá8™á²›äá™áµ›èð˜áÔ›éšáâ›èDšáä›äXᨚáë›è„šáò›äxá›áû›é›áœä˜á¨›é¨át›á œèX›áœäÈáhœáœèà›á/œäèáá6œäøáÀœá8œèœœá=œäâ˜áHœä(â„áSœä8âhá_œèHábœäXâžáqœèìáxœäx⸞á~œäˆâ”žáœèXžé¨â؟᨜ä¸âŒŸá®œäÈâxŸá²œäØâ\Ÿá½œäèâ$ŸáÀœäøâŸáÌœèìžáΜä㘠áÜœä(ãx áàœä8ã4 áãœè áäXãX¡áähã¡áäxãø áCèä áNèÄ¡áYèð¡áeä¸ã¸¢á„舢á’èD£éèãá¤áäøãè£á¨ää¼£áªè˜£áÉä(äð¤áÌä8äܤáÎäH䔤áÕèt¤áàè0¥áôäx䤥íp¥áÿä˜äŒ¦á1žä¨ä8¦á?žè¦áJžäÈäø¦áNžè̦áQžäèä¨á\žäøä̧ágžèŒ§áyžäåd¨ážèH¨ážä8å©ážäHåШᙞ蔨ᤞähåh©á«žäxåH©á­žè$©á³žè¤©á·žèø©áÖžèªí<ªáÝžäØåäªáèžè̪áêžäøå¬áìžäæô«áïžäæ°«áóžä(æt«á÷žä8æH«áüžè «áŸäXæL­áŸähæð¬áŸäxæЬá*Ÿäˆæ°¬áIŸè¬áOŸèà­áQŸä¸æ`®ápŸè®íè®áŸäèæ°¯á›ŸèŒ¯áŸäçT°á¨Ÿäç<°á³Ÿä(ç°áºŸèÔ¯éHçH±áÀŸäXç±áŸähçá±áÍŸḛ̀áÕŸäˆçÀ±áãŸè¬±áéŸä¨çl²áëŸä¸çD²á  è4²á) äØçà²á, èIJá2 èP³á= äèt´áK äèP´áV ä(è0´áo è´á è µá’ äX茵ᘠähèxµáš èXµá¡ äˆèøµá¨ ä˜èܵá« èĵẠè(¶áÁ èˆ¶áÆ è̶áÍ âŒá<üÔÝ øè„·ééd·áí è·áï ä(éè·ág¡èÈ·áj¡è ¸áv¡èÀ¸áy¡èX¹á…¡äxéȹá¡è´¹áž¡äœé »á¨¡âÜ?á¬éøºá¼¡èÔºáÕ¡äÌé »áà¡äÜéx»áç¡äìé\»áó¡è8»á÷¡ä ꔼáú¡äêp¼á¢è$¼á$¢ä<êD½á/¢äLê,½áD¢ä\ê½áP¢èܼáV¢âD(á€ê¨½áy¢èŒ½é êX¾á˜¢è0¾á¢äÀê$¿áŸ¢è°¾á£¢èD¿áª¢äðêLÀá°¢åë$ÀỢèÀáÇ¢èpÀáÞ¢ä0ëÜÀíÈÀáà¢äPë˜Ááí¢è<Áépë€Âáï¢è<Âáó¢äëÃáþ¢ä ëìÂâ£èÈÂá£èpÃá £èØÃá£âÜ?áäëÄá!£èüÃá'£äìÔÄá.£è¼Äá:£ä$ìTÅáF£è,ÅáM£äDì°ÅáO£èŒÅáV£älìdÆáa£â ypq |ì$Æá¸£èôÅảäœìÇá¼£ä¬ìÄÆá£è€ÆáΣäÌì|ÇáÒ£äÜìXÇáä£è@Çáï£èÔÇáò£ä í(Èáö£è Èáü£ä,íhÉá¤èˆÈá#¤äLíÀÉá%¤è¨Éá/¤älí°Êá1¤èˆÊá5¤äŒíˆËá@¤äœíhËáL¤ä¬í4Ëᘤä¼íËᚤèðÊឤäÜíÌᨤèÔËᯤäüí|ÌẤèXÌáÙ¤èäÌáߤä,î´Îáê¤ä<î€Îáø¤èPÎáÿ¤ä\îÏá¥älîðÎá¥èÌÎá¥äŒîxÐá¥äœîøÏé¬îÈÏá)¥ä¼î´Ïá0¥äÌîŒÏá2¥è\Ïá8¥è°ÐáC¥äüîàÐá^¥èÌÐái¥äïÈÑé,ïlÑát¥ä<ï@Ñá{¥èÑá¥ä\ïXÒᇥälï Òá‹¥èøÑá’¥äŒï¨Òឥè|Òá ¥ä¬ïxÓ᪥è@Óá°¥äÌïèÓụäÜï¨ÓáÇ¥èÓåâ@ƒåÔáÉ¥äðÈÔáÎ¥è ÔáÙ¥ä0ð„ÕáÞ¥è`Õáå¥äPðDÖá¦èÐÕá¦äpð×á/¦ä€ðØÖá:¦ä”ð¼ÖáA¦â tl ¤ðÖá]¦è`Öái¦äÄð€×áp¦äÔðh×áw¦ääðH×á¦è0×íÄ×ᆦäñ$Øá’¦èü×á—¦ä4ñ4ÙᶦäDñÙáÁ¦äTñìØáϦèÄØáÖ¦è`Ùáó¦ä„ñ¨Ùáù¦èÙá §ä¤ñôÙá§ä´ñØÙá0§èÀÙá2§äÔñÐÚá5§ääñ|Úá7§èTÚá?§è0ÛáB§äòØÛáF§ä$òÀÛáM§èœÛáT§äPòHÝáY§â ÄÞ œ» œá`ò,Ýáz§äpò¸Üá}§ä€òœÜá§è`Üá’§ä ò Ýá™§è|Ýá›§äÀò¨Þá §äÐò„Þá«§äàò`Þá®§äðò Þá¨åóìÝá¨èÔÝá"¨ä óßáB¨èÄÞáD¨ä@ó`ßáK¨è(ßá[¨ä`óàáf¨äpóôßár¨ä€ó¨ßáw¨è”ßáy¨ä óxàá…¨èHàéÀó0áቨäÐóèàᕨè¨àá ¨èLá᧨åôÈá᪨èœááƨä ô\âáѨä0ôHâáÓ¨èâáã¨äPôXãáî¨ä`ô<ãáú¨äpôãáþ¨ä€ôìâá©èÐâá©èãá©ä°ôØãá©è¨ãá0©èäéàôdäá5©èDäáw©åõÀäá~©è¨äጩä õ8åᎩèØäá‘©è\åᔩäTõLæá³©âÜ?ádõäåáÆ©èÀåáÈ©è`æáΩäœõ(çáÕ©â ¨û ¼V ¬õ çá;ªä¼õØæáFªè´æáMªäÜõìçáSªäìõpçáWªèPçá]ªä ö¨èáhªèxèámªä,ö$éáqªèéá|ªäLöœéá~ªèdéဪälö@êጪä|öìéᘪèÌé៪äœöÄêá­ªè\êá´ªä¼ö8ëỪäÌöëὪèÜêááªäìöpëáèªèPëáôªè¨ëáöªèøëá«ä,÷|ìá«è\ìá«äL÷,íá%«ä\÷íáR«äl÷øìá[«ä|÷Øìáf«äŒ÷¸ìám«èìíœíár«ä¼÷4îá}«äÌ÷îá–«äÜ÷áîá «äì÷àíá­«è´íá¸«ä øÀîá׫è îáó«ä,øHïáþ«ä<ø$ïá ¬èïá ¬ä\øÌðá¬älø´ðá*¬ä|øˆðá/¬èhðá1¬äœø8òáP¬ä¬øòá\¬èìñáb¬äÌø¨òám¬èhòáp¬äìø óéüøhóá{¬ä ùHóá¬èàòé,ùôጬèìó᫬èÀôḬä\ù\õáˬèèôáÖ¬ä|ùöáݬèÌõáê¬äœù„÷á ­èL÷á­è¨÷áC­èPøáb­äÜùÜøán­è¤øáq­è ùá­ä úlùáé­äúLùáì­è4ùáf®èÐùái®è4úák®ètúán®älúÔúáq®è¸úáv®äŒúTûá®äœú<ûîûá‹®ä¼úÜûá®èÈûᘮäÜúLüáš®è$ü᥮äüúTýá«®ä ûáýá²®äûÈüá½®è´üáÀ®è”ýáÇ®äLûüýáÒ®è°ýáÞ®älûÜþáé®ä|û„þáï®äŒû<þáú®è þáü®èøþáþ®ä¼ûDÿâ¯è(ÿá¯äÜûüÿá¯èäÿá*¯ä üû0,¯è@¯èŒO¯ä ,üDn¯ä <ü,s¯ä Pü’¯â/åü¬¯âL%á tüœůä „ü|̯ä ”ü\Яä ¤üDÓ¯ä ´ü ߯èØá¯ä Ôüò¯ä äüÔú¯è´á°èx °ä ýì°ä $ý̰ä 4ýp"°ä DýP$°ä Tý<'°ä dý ,°ä týôK°ä „ýÔQ°è W°âð*á ¨ý¼p°èw°äÌýá~°â¸äØްä ìýÄ”°è¨–°ä þ¤ìŒª°ä,þá½°ä <þÜðè¼ɰè°Ö°è8 ë°èÔ î°ä Œþ  ±ä ¨þ ±âÔYá„.T0 ¸þT Q±è< ƒ±ä ØþP ‡±ä èþ8 бèä Œ±èø ±ä ÿ@ ¿±è Ʊä 8ÿ¤ ͱä Hÿˆ Ô±èp ß±ä hÿø é±ä xÿÐ ²è¸ ²ä ˜ÿŒ 3²ä ¨ÿd Q²ä ¸ÿL S²è Z²èä g²ä èÿds²ä øÿ(…²è ‡²ä Ø—²ä (¨³²è„º²ä HÈÀ²ä X°̲ä h€زè$æ²ä ˆ¼³ä ˜³ä ¨t&³è)³èà+³ä ؤ1³ä è„<³ä øh>³èDA³ä X`³ä (<f³ä 8m³è¼x³ä Xœ{³èˆš³èà³ä ˆX¨³è<³³è„¹³ä¸€ìXųè$ȳè€ʳèðÕ³è<Ù³èÀܳèÔæ³ä 8À´ä Hp!´ä XT(´è,-´èU´è$`´ä ˜b´ä ¨xd´èdo´èlz´èè´ä è(È´ä ø Ý´ä ¼ì´ä  ñ´èŒô´è`µè€µä X &µä hè(µèÈ.µè\9µä ˜4Xµä ¨[µèÐgµä Èx€µèX‚µä 耉µä ø4޵ä  ®µä ôŵä (Èеè¬ܵä HðàµèÄèµä hPöµè øµèlþµä˜ä è ¨´  ¶èT ¶ä Èt!¶ä ØT!"¶è$!5¶ä øD"7¶è"H¶ä #N¶èŒ"h¶èT#ˆ¶ä HÄ#“¶ä X°#–¶èˆ# ¶ä x¤$¦¶ä ˆ„$µ¶ä ˜\$»¶èD$Á¶èÐ$öä È4%ʶè%ܶèl%é¶è¤%ï¶ä &ÿ¶ä ì% ·èÔ%·ä 8L&·è4&"·ä X˜'0·ä h0'8·è'?·ä ˆÀ'D·è°'c·ä ¨P(j·ä ¸(q·èô'x·ä ØÈ(ƒ·è€(Š·ä øX)‘·è8)˜·ä 8*·ä ((*¤·è *«·ä HÄ*¼·ä X|*Ñ·è\*Ø·ä x0+÷·ä ˆü*¸èà*¸ä ¨Ð+¸èl+#¸ä Ȱ,*¸äØ|,è èd,.¸ä ø(,0¸ä  ,I¸èø+T¸èì,V¸è@-]¸ä H.b¸è¼-d¸ä hŒ.k¸èP.w¸ä ˆÔ.‚¸è¨.‹¸èD/š¸ä ÄÄ/ ¸âÔYáT0 „.Ôˆ/˸èp/иäô,0ìø/׸ä  <1Þ¸ä $ 1à¸ä 4 ð0ä¸ä D Ì0þ¸è|0 ¹ä d ¸1¹èt1ì$2,¹èœ23¹ä ¤ d3R¹ä ´ @3W¹ä Ä  3q¹èè2¹ä ä 4‚¹èø3޹ä  |4•¹è\4œ¹ä $ œ5¡¹èü4£¹ä D  6®¹ä T 6±¹èÌ5¸¹ä t È6Á¹ä „ Œ6ùèd6Źä¤ P7ì<7ä¹ä Ä @8ë¹ä Ô 8ø¹é8þ¹è 8áºä  @9ºä  9+ºèü82ºèÄ99ºä D œ:Dºä T €:Pºä d X:Xºè@:cºèÀ:jºä ” ø:qºèØ:ºè8;”ºè¼; ºèÔ;è ä °<§ºä ô €<²ºè\<·ºä  ,=źä $ =Ⱥä 4 ì<غèÈ<÷ºè˜=üºè>»ä t ”> »ä „ €> »èT>»ä ¤ ?»ä ´ ü>.»èà>:»ä Ô \?A»èL?‰»ä ô @»ä  d@›»ä  D@¢»ä $ ,@©»ä 4 ü?°»ä D Ì?¶»è¬?¼»ä d A»ä t è@É»è¼@Í»ä ” äAì»ä ¤ ”Aó»ä ´ hA¼è4A¼ä Ô œB¼ä ä 4B!¼è$B,¼äáC3¼èÐB6¼ä $PC=¼ä 4@CI¼è CP¼ä TDR¼ä dD]¼èìCd¼ä „\Df¼èÓè0ËIÓèpËè H04ÌUÓä X0Ì]Óä h0ôËbÓä x0ÌËhÓè¸ËnÓä ˜0´ÌyÓè„Ì„Óä ¸0à̈ÓèÌÌ‹Óä Ø04Í–ÓèÍ™Óäø0pÎè 1<αÓä 1εÓèüÍ·Óä 81 ϹÓè¸Î»Óä X1ÜÏÌÓä h1ÈÏÎÓä |1PÏÑÓâ/å0ÏðÓè8Ð÷Óä ¬1`ÑÔä ¼1øÐ#Ôä Ì1ØÐ6Ôä Ü1ÀÐ9Ôè ÐJÔèxÑXÔä 2ÄÑcÔè°ÑiÔâ€028ÒwÔèÒ}Ôä P2œÓÔä `2XÓ…Ôè ÓÔèÔžÔè4Ô§Ôä 2ÕìäÔè À2,Ö¬ÔèØÕ°Ôä à2ÐÖ²Ôä ð2¸Ö½Ôè|Ö¿Ôä 3€×ÄÔä 3T×RÕè$×qÕä @3`ØsÕèà×~Õä `3@ÙŠÕä p3ÙÕä€3áÙìèØ“Õä  3Ú ÕèÈÙÖÕä À3 ÛÚÕä Ô3ÐÚáÕâÔYá ä3¤Ú ÖèpÚ8Öä 4dÛCÖè@ÛNÖä $4|ÜmÖä 44dÜpÖä D4@ÜzÖä T4(Ü…ÖéÜŠÖä t4ØÜÖèÀÜ¢Öä ”4TÝ©Öè4ݬÖè°Ý³ÖèÈݵÖä Ô44ß»Öä ä4üÞÀÖè´ÞÅÖä 5ÐßÓÖè¸ßÞÖä $5ÐàåÖä 45tàñÖä D5XàýÖä T58àÿÖä d5 à×èôß ×ä „5°á×ä”5táè ¤50á'×èøà*×ä Ä5Hâ5×ä Ô5â@×èàáB×ä ô5àâH×ä 6ÈâL×ä 6¨âm×ä $6”âx×èpâ®×ä D6„ãµ×è4ãº×èØãÁ×è äÌ×è¨äÐ×ä ”6 åï×ä ¤6TåØèåØä Ä6üå Øè¼åØä ä6|æ$Øè`æ+Øä 7Ìæ2Øè æFØä $7ŒçRØä 47XçTØè<ç[Øä T7è]Øä d7Ôç`Øè´çcØè<ègØä ”7ÔèlØè¨èpØä ´7h鏨ä Ä70龨ä Ô7 éÝØèøèâØä ô7TêðØä8 êáÙä 8ê!Ùèìé(Ùä 48ë3Ùä D8èê:Ùä T8ÌêEÙè¨êLÙä t8ŒëNÙèHëcÙä”8¨ìè ¤8TìzÙè8ì…Ùä Ä8@íŒÙä Ô8íÙèÜìœÙä ô8Èí¢ÙèŒí¤Ùè î«Ùâ”i@! dd09”îçÙä @9pîðÙä P9PîûÙè0îþÙäp9”ïáÚä €9DïÚä 9ïÚä  9ðî”ÚèÈîŸÚä À9øï¥Úè¬ï±ÚèðµÚèŒðÂÚèÀðÓÚä :hñòÚè8ñ;Ûä 0:Dò=Ûè´ñIÛè|òTÛä `:@ó[Ûäp:óì”òfÛä :¼ólÛèœóxÛä °:èóƒÛèÔó…Ûè¼ôŒÛâ ”i@! ddäøôè ü:ÔõÉÛä ;xõËÛè\õÎÛèôõè <;ŒöÚÛèLöáÛèÐöçÛè|÷Üè˜÷Üä Œ;øÜèø÷Üä ¬;àø/Üè”ø6Üèù<Üä Ü;lùKÜèTùè ü;0úWÜä <úYÜä <üù[Üä ,<äùnÜä <<ÄùpÜè¤ùtÜä \<lúŠÜèHúÜèÈú£Üä Œ<XûªÜèû­Üä ¬<Ôû³Üè¬û¾Üä Ì<ÜüÚÜä Ü<ÄüæÜä ì<¬üñÜä ü<”üøÜä =xüûÜè`üáÝèýÝä <=`ýÝè0ý0Ýä \=ŒþOÝä l=lþ”Ýä |=Lþ Ýä Œ=,þ«Ýèþ²Ýä¬=Tÿè ¼=ÿ¸Ýèèþ»Ýä Ü=0ÁÝä ì=ÅÝä ü=ÌÝèàÿÓÝä>Ìì`òÝèüáÞä L>¤ÞèˆÞä l>ì$Þä |>Ô/ÞèÀAÞè è ¬>ÈKÞè¬MÞä Ì>hXÞä Ü>L\Þä ì>4cÞä ü>eÞèäkÞä ?@qÞèsÞèxŠÞèlÞèä“Þè|žÞä |?ô¥Þä Œ?ЫÞä  ?¤¶ÞâÜ?á °?pßè +ßä Ð?ø.ßä à?¨9ßè|>ßå @L Eßè$ Gßä @è Ißè” Pßä @@˜ †ßè| ’ßä `@œ ™ßä p@| ¥ßèd ¨ßä @ µßèü ºßâÌ/åœ ößèÀ àäÔ@ü ìä ì\ àäAð è AÔ àè´ àä 4A¨)àèˆHàè,èdAè tAè\àä „AÈcàè˜eàä ¤APpàè(wàä ÄAØyàè€{àä äA”€àä ôApƒàä B8†àä Bàé¤àèЦàè¬àä TBø¯àä dBܲàèȹàâÜ?á ˆB,Íàèôàèöàè€øàä ÈBÿàèìáä èB|áè\&áä C8+áä C Žáèìšáä 8C°£áè”âä XCX'âä hCô,âèÐ/âä ˆCH;âä ˜C$?âä¨CáMâä ¸CÔXâè }âä ØC´€âèx•âèè›â訴âä Dˆ·âä 0D\ÖââÂìrä@ãä PDü!ãèÐ7ãä pDx9ãèDãè”Vãä  D´_ãä ¼Dˆpãâ”i@! ddÌD\³ãè ¾ãä ìD(ÅãäüDáäãèèêãä EÔïãä ,E´ûãè„ää LEPäèäéì(ääŒE”ì` ää ¬E, %äè (ää ÌE˜ 3äè` :ää ìE!Fää üEÈ Iäè´ jää (F0"läâ”i@! dd8FÀ!®ää HFT!Êäè4!Ñäèl"Õäè#Ûää ˆF¤#óää ˜Ft#ÿäèX#åä ¸F|$)åä ÈF$4åä ØFü#;åèÀ#Fåè”$Kåä G0%Råä G%båèð$våä 8GÌ%xåè¸%…åä XG<&´åèø%Àåä xGÈ&Çåä ˆG &Òåèˆ&ñåä ¨Gü'øåè¬'æä ÈG˜(æä ØG€(†æä èGd(‘æèD(œæä Ht)»æä H0)¿æè )Áæä 8H*Èæèì)Ôæä XHô*àæä hH”*åæèh*çæè,+óæä ˜HH,øæä ¨H0,çä ¸HÜ+'çè¼+,çä ØHØ,6çä èHÀ,Eçä øH¤,Qçèˆ,\çèX-è (I.mçä 8IÜ-„çè¸-£çèÀ.©çä lI/µçâÜ?åÜ.ÞçèT/àçä œIÔ/ççä ¬IÀ/èè”/ èä ÌI°0èè(0#èä ìI1(èèÔ04èä J´1;èä J„1Ièä ,Jd1Nèè@1Yèä LJ|2oèèì1sèä lJ3~èä |JÈ2‰èèŒ2±èè,3´èèŒ3ºèèü3¼èèh4¿èèÐ4Þèè05éèx5éä KD6éèô50éä ,KÈ63éè´6Aéä LK€7Léèd7Xéä lKü7néè¤7qéäŒKx8ì\8{éè´8éä ¼KH9˜éä ÌK(9šéè9°éèÔ9´éè :ÍéèŒ:Óéä L ;2êä ,Lˆ;Eêä çêäìLá>ëä üLØ=ëè¸=ëä M¨>ëè>"ëä Mëä |Mü?Tëä ŒMì?Vëä œMÔ?]ëè|?bëä ¼Ml@hëä ÌM\@tëä ÜM<@{ëè(@~ëèÔ@è NÜAŽëä N°Ašëè˜A¡ëä ÷èTD÷ä Ð]\‚J÷âÈ5xà n09 ä8‚y÷èà‚˜÷å ^¤ƒÁ÷è,ƒÄ÷èôƒË÷ä 0^ЄÖ÷ä @^h„Ø÷èP„Þ÷ä `^Ð…æ÷ä p^°…é÷ä €^…ë÷ä ^x…ð÷è …ô÷ä °^ †ö÷èô…øä Ð^x†øä à^P†;øè0†=øå _”‡Gøè$‡Yøä _ˆˆ\øèˆ^øèðˆaøä P_Ô‰iøè4‰tøè Š{øè<Š€øä _¨Š‚øèPŠ„øä À_Ü‹‡øâ|,á¸$áð*áL-á Ð_À‹Õøä à_ ‹Ùøè€‹àøå `@Œåøè Œìøä `„è 0` ùä @`ØŒmùä P`ÀŒ’ùä ``¨ŒùèpŒ©ùä €`8Ž¿ùä `ŽÅùä  `ðÉùè¼Îùä À`LÑùä Ð`ØÕùä à`Ààùä ð`¤ëùå a|íùä a\óùèDøùâ8ðä¿ ”zä pn$ÃJèÃUä nôÃ\ä  n´Ãcè ÃmèÄpä ÐnÀÄrä ànÄtètÄzå ohÅä oPÅŠèÅ•ä 0oÐÆ ä @oXÆ¥ä Poƾä `oÈÅÄè°ÅÏä €o8ÇÞä o ÇõèüÆ÷ä °oôÇùä ÀoÐÇýè|Çä àoTÈä ðo4È èÈè pôÈèØÈè<É&ä @pôÉEè°ÉPä `päÊUä pp¤Ê`è„Ê•ä pPË—ä  p<˰è Ë·ä Àp̼ä ÐpôËÈètËÓäðpÔÌé q„Ìòä qlÌôèDÌöä 0q`Íüè(Íä Pq Î èüÍä pqàÎè¨Î ä qXÏRèÏTä °qØÏZè€Ïfä Ðq„Ð…èLГä ðqüШèÀгâÔârÄÑÖä $r¬Ñïä 4rÑýèpÑä TrxÒ$ä dr(Ò/ätrÒìðÑ1ä ”r´ÒPèœÒSä ´r€ÓZä ÄrhÓaè@Óhè¸Ômä ôr(ÕqèØÔ|ä s`ÖŠè,Ö‘ä 4sÐÖœè|Ö¨ä Tsd׫è×­èì×¸ä „sˆÙÁä ”shÙÖä ¤s4Ùáä ´s Ùãä ÄsôØéèÜØÿä äsÈÚä ôsÚèHÚ$èHÛ(ä $t°Û+ä 8tœÛ7âô¼äˆÛJä XtÜQèôÛVä xtdÜZè(Ü\âTÜ œt°ÜgèŒÜ†ä ¼tpÝ¥èüܧä ÜtÐÝ´ä ìt´ÝÐè”ÝÛè Þæä uÜÞêèlÞýä ä ¬u¬âDä ¼uhâOèâQäÜuáã\ä üuèâaâÈ5àÛn09 äÈâˆä vä¦ä ,vÜã­è°ã¸ä Lv åÆä \vøäÒä |v¸äîâÈ5xà n09 ää èhå ä °v„æ% â¨aÀv`æ< èæk ä àvìæŠ ä ðvÀæ è¨æ­ ä w`ç¸ è<ç¾ èàçÉ ä @wXèì è8èñ ä `wôèõ ä pw°è èŒè ä wHê* ä  wäé[ èÀéa è¤êg ä Ðw\ën ä àw<ëž è$ë  èœë¦ âÈ5xà n09 äøëÒ ä 0xÀìñ ä @x¤ì ä `xŒì âÈ5àÛn09 äxìC ä €xhíU ä xLíX ä  xí` èäìg ä ÀxŒîn èìís ä àx0ï’ èï– è,ðš ä yÌðœ ä y˜ðŸ ä 0y€ðµ èdðº ä Py|ñÙ è8ñå èìñì ä €yxòø èHò ä yáó è¨ò ä ÀyHó è(ó# è`ó% ä ðyXô( å zDô1 ä zô6 èèó< ä 0zäôE ä @zÄôP è¤ôo èDõŽ ä pzðõ ä €zØõ“ ä zÀõš èœõœ èdö£ è¸ö¥ ä Ðzt÷¨ ä àzT÷Î ä ðz÷Ð èøöÕ ä {8ø× ä {ø ä 0{ä÷ è¸÷ ä P{¸ø è”ø% ä p{\ù+ ä €{Hù6 ä {0ù= èüøH èìù[ ä À{`ú] ä Ð{<ú_ è$úb ä ð{„ûd å |hûi ä |Pûz ä |,û‡ èû‹ ä @|øû– è¸û ä `|ý£ ä p|Ìü´ èxü ä |€ýÉ ä  |\ýä è<ýæ ä À|àýé èÄýõ ä à| þèhþèìþ ä }ðÿ ä }˜ÿètÿä @} 2ètQä `}Sä p}ðsèÔ¤è8´ä  }(¹ä °}Ää À}èÇä Ð}ÈÍä à}¤çèˆìå ~pðä ~TèÀ ä 0~ôèØ!è$è¨Aä p~tHä €~\Oä ~@[è(bèàgè8lä Ô~˜nâää~€{ä ô~T‡è8ä (ä (øÃâÈÈäÐÓä HüÙèÄìäh, è „ü óâÔYáT0 „.”Ä *ä ¤  1ä ´„ Pèh Tä Ôì YèÈ [èX aä €ô pè  tä $€ì xä4€Ô ì¤ ìH „äd€á‡è˜ Œè8’ä ”€°”ä ¤€˜§èt®èà´ä Ô€Óä ä€èçäô€´áä ¤ è”è $ è|â`­äì5ä X 8è„<ä x?ä ˆøFä ˜ÔQèpmä ¸ˆpä È\¸è4Èä èèÎè¬Õä ‚œÚä ‚„àèpÿä 8‚\ä H‚Dè(è˜âèÎ|‚ 2èè9ä œ‚Xè@dä ¼‚œhä Ì‚|pä Ü‚\vè@xè¼ä ƒx†ä ƒT“ä ,ƒ4•èô—äLƒáä \ƒàŸè¸ªä|ƒá°ä Œƒ¼èlÄ䬃<ì Ëè¨è ܃°Îä ìƒ@áä üƒ$ãä „îèè èè¤WèYèiè˜wä |„ø{ä Œ„Ø†è´ˆä ¬„ˆ¡ä ¼„h²ä Ì„Pµè(¸èä¿è@ Âä …Ì Èè° è ,… "Êä <…¨!Ýèp!ãä \…l#êä l…D#õä |…#÷ä Œ…ô"è¸""ä ¬…0$'ä ¼…$2ä Ì…ð#7è´#9èx$<è¤$Hä †%Lèì$Nè,%Wä <†d&Yä L†$&\ä \†ð%£ä l†Ø%§è¸%®ä Œ†Ø&´èˆ&¿ä ¬† 'Áè 'Íä ̆ô'Ðä ܆¸'Óä 솤'çä ü†Œ'óèh'øä ‡x)ä 0‡È(â`@‡¨(-ä P‡|(4ä `‡X(:è@(Eâ0"á¼"á ˆ‡´)wèœ)yèD*€ä ¸‡Ø*‚ä ȇ´*™èt*²è+¸ä ø‡-Òä ˆ ,×ä ˆ„,Üä (ˆP,Þä Hˆ4,åâÜE ˆ^<üXˆ,èô+ä xˆÌ-ä ˆˆ¨-&ä ˜ˆ`-,ä ¨ˆ<-8è->ä Ȉ.Dèð-JâX•!ðˆÜ.Rè¨._ä ‰d/fä ‰P/mè¡ä (>Ïè>Úä0Üä P´>çè>ûèœ?ä ˆ´@â0ìál‹ ˜0@hä ¨@kèü?wä Èô@{èÔ@Èè,AÊä Ž¬AÎâä¿ X=¸4Lc ŽpAaèHAdä 8ŽôAjèÐAmèTBoä hŽøBuèÔByèlC䘎Dì¤CŒä ¼Ž”D—â(QätD³èÄDºèìDÄè,EÊä èEÕä  Eáè€Eáä <Gä L FèxF)ä lH.ä|Hè ŒäG:èÌGYä ¬LI^ä ¼4IcèØHqä Ü,Jxè J—ä üK¢è¨J¤ä ìK¬ä ,ÐK®ä <€K¿ä LlKÆèXKÙä lpLåä |TLþä Œ4LèLä ¬ÐLä ¼´Lè˜Lä àŒM â0ìå$MYå ‘`N^ä ‘@Naä ‘äMxèÀM—ä @‘xOä P‘O¥èäN«ä p‘„P°ä €‘4P»ä ‘üOËèàOÏèQÑèœQ×ä БðQÞèÈQõäð‘ØRáå ’ R ä ’€RSè6ä ø± ÓU6ä ²Ó\6èÜÒh6ä (²ÔÓn6è¨Óz6ä H²´Ô€6ä X²PÔ‚6èÔ‰6èÐÔè ˆ²Ö6èìÕš6ä ¨²˜ÖÃ6ä ¸²|ÖÎ6èPÖà6ä Ø²<×ã6ä è²×ï6è´Öú6ä ³p×ü6èX×è (³Ì× 7è¤×7ä H³äØ7ä X³ÌØ!7è\Ø(7ä x³œÙ-7ä ˆ³|Ù47ä ˜³`Ù?7èHÙ^7ä ¸³LÚ`7ä ȳ,Úx7ä Ø³øÙ„7èÜÙ‹7ä ø³ÜÚª7ä ´”Úµ7âL%åpÚÜ7èÛã7èŒÛ÷7ä L´ØÛþ7è¨Û 8ä l´,Ü)8èÜ48ä Œ´8Ý98èàÜE8è|Ýd8ä ¼´èÝÒ8èÌÝÞ8ä Ü´¨Þà8ä ì´hÞì8èLÞú8èÀÞ 9è\ß)9èœß,9ä <µDà.9è à:9è„àB9ä lµ„áF9èààL9è¨áN9èàáU9ä ¬µðâq9ä ¼µÐâx9è˜âè ܵLãƒ9è0ã‡9èhã“9èˆã–9䶈äè ,¶HäÇ9ä <¶0äÔ9ä L¶äÖ9èøãìÐäÝ9ä |¶Xåé9ä Œ¶åù9èðä:ä ¬¶Ðå :è¬å#:è0æ):ä ܶæ\:èhæg:äü¶äçè ·Äçj:èXçu:ä ,·xèy:ä <·Xè„:è4èŽ:ä \·(é”:è é¢:ä |·€é­:è@é»:ä œ·ÄêÂ:ä ¬·DêÈ:ä ¼·(êË:èôéê:ä Ü·Pëï:ä ì·0ëó:èëú:èØëÿ:ä ¸,íF;ä ,¸ÔìK;ä <¸¼ìM;ä L¸¨ìP;ä \¸ŒìR;ä l¸pì^;èDìi;ä Œ¸˜ío;ä œ¸xív;è\í‚;ä ¼¸î;èÀí˜;ä ܸ€î£;è@î§;äü¸áï²;ä ¹äî¹;èÀîÄ;ä ,¹ôïÏ;ä <¹˜ïÖ;ä L¹xïØ;ä \¹Hïè;è,ïõ;èðá<ä Œ¹¤ð <ä œ¹\ð<èDð<ä¼¹áñ8<ä ̹Üð?<èÀðB<â ¸ð¹lñé ºPñW<è@ñc<è°ñj<ä 8ºXòq<â”ià Hºò¢<ä Xº ò­<èÜñ´<ä xº¬ò·<èœòÂ<ä ˜º óÉ<èøòÐ<èóÛ<ä Ⱥxóæ<è\óí<è¼óø<ä øºõú<ä»Üôì˜ô=ä (»@ö =è$ö=ä H»Àö=è¤ö=ä h»P÷=ä x»÷5=é÷T=ä ˜»4øV=ä ¨»ø÷X=èÐ÷w=ä È» ø}=ä Ø»tø=èPø…=è,ù›=ä ¼ú§=ä ¼ôùÏ=è˜ùÖ=è|úÝ=ä H¼ìúã=èÌúê=è¸ûì=ä x¼ü>èÔû >ä ˜¼Ôü0>ä ¨¼¤ü7>è|ü=>éýB>äؼìýè è¼¼ýI>ä ø¼€ýT>ä ½\ýX>èDý[>ä (½lþ]>èLþi>ä H½èþp>ä X½Äþ|>èœþ›>ä x½Pÿ¡>è8ÿ¦>â8ð”zÜö¤½Dè´½ìäÿ½>ètÃ>èÔÐ>ä ô½pÓ>ä ¾XÚ>ä ¾8Ü>èû>è?ä D¾%?èx*?è /?è(2?âؽˆ¾ŒY?ètd?â/á ¬¾Œ|?ä¼¾Xè ̾~?äܾá‰?èìŒ?âô¼äЙ?â8ð”zä˜è (¿H­?è,¹?ä H¿ø¿?è`Ë?èè x¿ˆÐ?è\ç?ä  ¿”í?âð*á@)á °¿lø?ä À¿D@ä п@èè%@èè(@å Àt G@ä À\ W@è@ c@èÀ j@è l@ä TÀÜ ƒ@â,ÎdÀ´ ¢@ä tÀˆ ¨@èl «@ä ”À\ æ@è@ í@è¼ ô@ä ÄÀp Aä ÔÀX Aè@ &Aä ôÀ< +Aä Á( 0Aè 2Aä $Áp?Aä 4Á(JAä DÁ° UAä TÁœ Aè„ è tÁ|†Aä „ÁAèôAä ¤ÁЗAä ´Á¸›Aè ¦Aä ÔÁŒ¨Aä äÁ8´AèÍAä ÂÔØAè¼çAä ,Â`îAâàÌäôì˜$Bèü/Bä |ÂÐ:BâL-á¸(á|,á¸$á ŒÂ¸’B蜢Bä ¬ÂL¦Bä ¼Â(¨BèŒìh³Bä ìÂP¼Bä ü ÀBä ÃÐÕBä èÜBèêBä <ÃÌCä LäCètCä lÃŒ!Cä |Ãx-Cä ŒÃX4Cä œÃBCèøì$HCä Ìà JCä ÜÃaCä ìÃärCèÀ‘Cä Ĥ˜Cèp›Cè8Cä <Ä„¨Cè\³CèȹCä lÄp»Cä |ÄL¿Cä ŒÄ4"Dè)Dè¬/Dä ¼Ä¼6Dä ÌĘBDä ÜÄ0EDèIDä üÄ`hDè xDä Å|Dä ,ÅøDèDä LÅ”„Dä \Å –Dèø£DèȪDä ŒÅ°µDäœÅ„è ¬ÅTÁDè,ÍDäÌÅá ÓDèäÞDè€ ýDä üÅ@!Eä Æü EèÈ è ,Æü")Eä <Æ "5Eä LÆx"@Eä \ÆH"NEä lÆ "PEä |Æø!WEä ŒÆØ!jEä œÆ¸!vEä ¬Æœ!xEè„!—Eä ÌÆP#¶Eè$#ÍEä ìÆØ#ÕEä üÆÀ#×Eè#ìEèœ$öEä ,Ç<%Fä <Ç%Fä LÇà$DFè¼$FFä lÇÜ%eFä |ÇÀ%jFä ŒÇ¨%mFèT%è ¬Ç€&yFä ¼Ç<&{Fè$&†Fè¼&ˆFä ìÇ@'¢Fè$'¨Fä Ȱ(­Fä Èx(°Fè<(µFä <ÈŒ)ÂFè`)ÉFä\Èá*èFèÄ)êFèP*ñFä ŒÈø*GèÜ*Gä ¬È|+ Gä ¼È@+"Gè,+Jè˜7]Jä dÌt8`Jè,8wJä „Ì´8~Jè8JèÌ8‡Jä ´Ì<9¦Jèä8ªJèŒ9­Jä äÌH:´Jè :ÀJä Íà:ßJä ÍÄ:äJè :ôJä 4Í`;÷Jè;ùJä TÍä;ÿJè°;Kä tÍœ<Kèx< Kä”Íá=Kèè<Kä ´ÍÔ=Kè\=$Kä ÔÍ?,Kä äÍô>8KèÄ>?Kä ÎX?EKè,?LKè”?SKä 4Î<@ZKä DÎð?\KèÜ?cKä dÎ(AhKä tδ@sKä „Î¤@zKè€@Kè\A†Kä ´ÎÐAKè¤A™KäÔÎPä ÔÓVAPèˆU`PèlVkPèÄVmPäÔìWè $ÔpWyPä 4ÔTW|Pä DÔ8WˆPèW™PèXŸPätÔ¸Xè „ÔœX¦Pä ”Ô€X­Pä ¤Ô\XÏPèHXÖPèèXÙPäÔÔ„Yè äÔ\YåPè8YèPä ÕÔZQä Õ¸ZQä $ÕlZ$Qä 4ÕTZ+Qä DÕ8Z=QèZMQä dÕl[[Qä tÕ@[rQä „Õ,[xQè[Qä ¤Õ\†Qä ´Õ´[‹QèŒ[–Qä ÔÕx\²Qèd\ÇQä ôÕp]ÏQä ÖP]ÑQä Ö8]æQè ]òQä4ÖD^í^÷Qä TÖD_úQä dÖü^Rä tÖÜ^Rä „ÖÄ^KRè ^ORä ¤Öˆ_nRèh_Rä ÄÖ8`™Rä ÔÖ`Rè`®Rä ôÖ`´Rè|`»RéaÀRä $׌aÏRä 4פaÔRèdaçRèüaëRä dרb÷Rä t×€búRèlbÿRä ”×cSèìbSä ´×ìc Sä Ä×ÌcSä Ô× cSä äׄc&Sä ô×hc4SèPcESä ØtdGSä $ØPdMSä 4Ø8dXSä DØdZSèdaSä dØÜdgSä tØÄdiSè dˆSä ”ØÜe§Sè„eºSä ´ØLfÀSä ÄØfÙSèfÞSä äØ@gåSä ôØgïSä ÙøfôSèØföSèˆgüSè htTä DÙÔhvTè”hzTèüh‹Tè i–Tèüi™Tä ”Ù0j¤TèjØTä ´Ùœj÷Tè\jUä ÔÙkUèkUèHk,Uèxl3Uä Úm:Uä $ÚÌlFUè lRUä DÚtmUUä TÚ`m[UèHmaUèàmwUèDnyUèXn­Uä ¤ÚünÜUä ´ÚänóUä ÄÚÈnVè¨nVè$o*Vä ôÚˆoDVètoFVä Û$pLVè pQVè¤p`Vä DÛqgVèäprVädÛŒqè tÛxq}Vè\q†Vä ”Ûr‹Vèàq—Vä ´Ûhr¶Vè@rÆVèœrÈVä äÛ4sçVèsWä Ü@tWä Ü(t Wét Wè´t*Wä Dܤu,Wä TÜLu1Wè4uDWä tÜLvIWä „ÜüuZWèäu`WèÈveWè wrWä ÄÜx~Wä àÜèw€Wâ ”i@! ddä¨wÀWå ݰxÃWä ÝDxÅWè(xäWä 0݈yÿWä @Ýdy Xä PÝLy%Xä `Ý,y,XèðxKXä €ÝèyVXè¼yaXè0zlXâÌ/å¸zXä ÄÝh{“Xè@{šXääÝT|è ôÝ$| Xèì{«Xä ÞŒ}±Xâ”i@! dd0Þ}òXèÀ|ýXä PÞ~ Yä `Þø}Yä pÞä}YèÈ}&YèÜ~1Yä  Þ0AYè _Yä ÀÞ€eYèXoYäàÞx€ìD€qY褀¡Yè²Yè@¸Yä 0ßкYä @߸ÆYè˜ÑYä `ß`‚ÖYä pß(‚ÜYä €ß‚ãYé‚åYä  ßè‚èYä °ß˜‚ôY耂ZâÈ5xà n09 àߨƒ+Zä ðßxƒJZå àXƒLZä à4ƒWZèƒbZä 0àôƒ~Zä @ààƒ€ZèÀƒ‹Zä `à…Zä t༄˜Zâ@фऄÌZä ”àP„ÏZä ¤à,„ÕZè„àZ⨀Èàà…ôZèp…[ä èàT†[ä øàD†[è4†![ä áô†([ä (áä†=[ä 8áÔ†D[ä HáÀ†K[èt†M[ä háÀ‡S[ä xሇZ[ä ˆáp‡b[ä ˜á`‡m[ä ¨áP‡t[è4‡{[ä Èáˆ~[äØáህ[èð‡Œ[ä üáȈ“[âÌ/á ⸈¤[ä ⨈«[ä ,∈²[ä <âTˆ´[è0ˆ¹[ä \âT‰»[ä lâ‰Æ[èøˆÍ[ä Œâ(ŠÔ[ä œâŠß[ä ¬âŠæ[ä ¼âì‰í[è̉ø[ä Ü┊ÿ[ä ìâhŠ\èHŠ\ä ãä‹%\ä ãÀ‹0\èL‹O\ä <ã ŒW\èü‹Y\ä \ãs\ä lãØŒu\ä |㸌|\ä Œã”Œ\è\Œìp„\ä ¼ã䎋\ä Ìã`Ž\ä Üãü‘\ä üãС\âÈ5xà n09 ä°Å\ä ä<Ç\ä ,ä$Ò\èÕ\ä Lä¬ô\èl÷\ä läðþ\èØ]ä ŒäŒ]ä œä`#]ä ¬ä$/]è 4]ä Ìä ‘@]ä ÜäìK]ä ìäÄ_]è¨~]ä 嘑„]èt‘‹]èô‘‘]è0’•]é“¢]ä `åP“¤]âää“·]褓¾]ä åÄ”Ô]ä  å””Ö]ä °åx”ý]ä ÀåT”ÿ]ä Ðå,”^è”$^èü”+^å æŒ•6^ä æ\•=^è0•C^ä 0æ(–I^è–P^èT–c^èp–v^ä pæ0—^èð–^ä æð—¡^褗§^ä °æ,˜·^蘹^虿^ä àæd™Ò^èH™Ý^âüçà™è^è ™/_ä $çš;_ä 4çlšƒ_ä Dç(š›_è šÆ_è›È_è„›Ó_ä „çhØ_ä ”çüœÜ_ä ¤çØœá_蜜q`ä Ä瀞x`è4ž}`è Ÿƒ`ä ôç `ä èðŸ’`ä èØŸ`è´Ÿ©`ä 4èØ ¼`äD訠è Tè„ Ã`ä dèh È`ä tèH ß`è4 aä ”è˜¡aä ¤èP¡aä ´è$¡!aä Äè¡,aèð 3aä äèØ¡>a踡Aaä é„¢`aä éh¢gaèD¢jaä 4éð¢qaä DéТsaè´¢’aä d騣™aè„£œaä „é`¤¡aä ”é¤¶aä ¤éì£ÁaèÌ£è ÄéؤÊa耤Ïaè¥Òa褥Øaè4¦Ûa輦áaä $ê´¨ìaä 4ꀨ5bèl¨Abä Tê ©Lbä dê,©Pbä |ê©Rbâp.á *äø¨bbèÜ©è ¬êlªnbèLªpbä Ì꼫ƒbä ÜêT«…bä ìê4«‹bè«bä ëd¬ŸbèØ««b耬¸bä <ë­¿bä Lëä¬Êbè̬Öbä l눭Ýbä |ëp­ßbèX­êbä œëü®ïbä ¬ëÔ®cä ¼ë°® c蘮(cèT¯9cä ìëð¯?cè´¯ˆcä ì °Šcâ°äd°¢cèÔ°°cè±»cä Pìä±Âcä `ì±Äcä pìp±àcèL±æcä ì ²ñcä  ìˆ²dä °ìh² dä ÀìH²(dè0².dä ìì³;dâL%á¸(á|,á üìè²dè¼²‡dä í0´’dä ,í´dä <íü³©dèÀ³°dä \íÔ´Ïdä l혴ëdèl´ídä Œíµódèü´údä ¬í¸µ e舵eèD¶eä Üí´¶eè ¶#eä üí·>eä îø¶Beèä¶aeä,îÌ·è <ceè\·jeä \î@¸neè ¸qe脸Íeä Œî¹Øeèì¸Úeä ¬î¤¹æeä ¼îl¹ôeèD¹fäÜîẠfèä¹4fä ü6fä ï`º8fèHºWfè»gfä <ïP»kfè4»ofè¼rfä lï°½…fä |Šfä ŒïX½fä œï@½fè$½›fä ¼ï¾¢fèؽªfèh¾¿f謾Þfä üï¿êfä ðø¾ýfèà¾gä ,𬿠gä <ðd¿;gèL¿Cgä \ðÀbgä lðø¿jgèп‰gèˆÀ—gä œð<Á§gä ¬ðÈÀ³gè¤ÀÒgèXÁØgä ÜðHÂÚgä ìð(Â=hä üððÁHhè¸ÁUhèlÂ\hè¬Âbhä <ñ|Ãehä Lñ\Ãkhä \ñ@ÃqhèüÂwhä |ñüÀhè¨ÃŒhä œñ<Ähè(ĦhèÅ­hä Ìñ°Å¸hèœÅ»hè0ÆÍhä üñ䯨hä ò¬ÆÛhè`Æïhä ,ò$ÇòhèüÆièhÇiä \òLÈ'iä lòôÇ2ièàÇ?iä ŒòèÈDiä œòÈÈFiè¬ÈMièÉRiä Ìò´ÉUiè”ÉWiä ìòTÊ]iè4Êiiè¸Êoiä óÌËziä,óPËì,˯iä LóD̵iè,ÌÁièdÌÑiä|óáÍ×iä ŒóðÌâiè¬Ìè ¬ó¤Íîiä ¼ódÍóiä ÌóLÍõiè Í÷iè$Îýiä üóÀÎÿiè|Îjä ôÏjèàÎ&jä <ô ÐEjä Lô¨ÏHjä \ô„ÏTjè\ÏZjä |ô Ñ`jä ŒôØÐljä œô´Ðžjä ¬ô Ð½jèxÐÄjä ÌôˆÑÆjä Üô\ÑËjè<Ñì°ÑÑjä õ\ÒÓjä õDÒÚjä ,õ(ÒájèÒäjä LõlÓæjä\õTÓè lõüÒòjèÔÒôjä ŒõÔùjä œõøÓkèØÓkä ¼õäÔkèÐÔkä ÜõtÕ!kè`Õ?kä üõ(ÖBkéÖJkè€ÖUkä ,ö×Wkè°Ö[kèt×xkä \öä׉kè´×©kä |ö|Ø´kèTØ»kä œölÙÀkä ¬öLÙÃkä¼öÙè ÌöìØÎkè¨ØÙkèÙàkä üö$ÚâkèÔÙåkä ÷˜Úðkä,÷pÚìLÚlä L÷HÛ lä \÷(Ûlè Û lè„Û%lä Œ÷˜Ü'lä œ÷LÜ.lä ¬÷Ü9lèøÛ@lä Ì÷ìÜBlèÔÜDlä ì÷ŒÝKlä ü÷lÝ_lè8Ýelä øÞtlä ,øüÝlèÜÝlèlÞŒlä \øß¢lä lø¤Þ¤lèŒÞè Œøðߪlä œøÔ߬lä ¬øÀß·lä ¼ø¨ß¼lä Ìø€ßÁlè4ßàlä ìøŒàmè4àmä ùámä ùäàmè¬àmä <ù˜á9mä Lù„á;mè`áHmèèáfmä |ù(ãmä Œù¨â†mèhâ‘mä ¬ù¬ã¡mèpãµmäÌùáä¸mèÈãºmä ìùÔäÄmä üù äÇmä útäÊmèäÖmä ,ú(åõmä <ú ånèôä-nä \ú å0nèxå;nä|ú@æìÐåAnä œúçFnä ¬úàæHnè°æJnä ÌúŒçMnèPçXnä ðú0è`nâä­á ûôçxqè¨ç„qä û¸èqä 0û è–qä @û„è¡qä Pûhè¤qèPè¯qä pû\é²qä €û<é½qä ûéÈqèàèÌqä °û(ê×qä ÀûüéÙqè¼éäqä àûàêòqä ðûlêþqèPê rä ü,ërèüêrä 0ü0ìrä @üÈë;rè¬ëƒrè”ìè pü0í‡rèäì’rä üŒí›rä  üpí§rè\í®rä Àüìí¹rä ÐüÐí½rè¨íÂrä ðüpîÈrèTîÔrä ýïärä ýèîsèÄî sä @ý´ïsä Pýœïsètïsä pýdð!sè@ð0sä ý$ñ6sä ¤ýÌðAsâà­´ý´ðysè„ð{sä Ôýtñ†sèXñ¥sä ôýò«sè¸ñèþáó·sèœò¾sä 4þ,óÀsèóÂsä Tþ¨óÉsèŒóÐsätþõì¤ôÔsä ”þØõÛsä ¤þ\õésä ´þ4õësèõtéö tääþÔöèôþ¬öìhö%té÷+tâ`­(ÿÀ÷Gtè¨÷Stè ø]tä Xÿôøhtä hÿ|øttèdøè ˆÿ8ù{tèù‡tä ¨ÿ útèèùtä Èÿ`ú“tèDú²täèÿpûè øÿûÑtä ðúètä Äúuèœú uèÜûè H\ü(uè0ü=uä h0ý@uä xýBuèðüIuè°ýOuä ¨4þ[uä ¸èýfuèÌý…uä ØÈþ‰uè¬þ–uèHÿ™uè€ÿ©uä $´uä ( ÀuèØÿÔuä H$óuä Xôöuä hØvä x¼ vä ˆ˜Zvè€è ¨˜avèlmvä ÈXvä Ø4„vè‡v褊vä vèü¤vä (H°vèx»vä HÏvä XôÚvä h¸Üvè˜ïvä ˆÐõvèpáwä ¨¤ wä ¸ˆwä Èl!wèP&wä èä(wèÀ-wèÀ/wä t1wè3wè¨Rwè( Uwè„ ^wä hp awä x, lwè nwä ˜4 pwè rwä ¸  xwèP „wä Øà wè¼ ”wè šwä Ô ¡wä ¨ ¤wä („ ¨wèl ³wä H, µwè ·wä hÐ Êwä x´ Ïwè˜ gxä ˜dixè8kxä ¸ wxä ÈÌ{xèˆxä èÔˆxä ø §xè<©xä 0¶xèðÁxä 8dÇxèPÒxè Ýxä hÈëxä x”íxä ˆpïxèTõxä ¨ø÷xä ¸Üyä Ȩyä ØŒyä èdyè@9yèDDyä ÐKyè|WyèôYyä H„dyä Xpoyä h\ryè<zyè´yä ˜˜‘yä ¨Xœyè4»yèÜÂyèHÉyä èLØyä ø4Úyäðè Ôßyä (Àñyä8¬ázèdzä Xœ zèlzä xzä ˆø(zèÜGzè¸LzèÔazèP€zä Ø¬‚zä è”™zä ø|¥zèh§zèì¬zä (`®zä 8D´zè$ºzä XÎzä häæzèÄìzä ˆpõzèLûzä ¬${âÌ/á ¼¼-{è L{ä ÜœQ{ä ìˆX{ä üda{ä @h{è(n{ä , ”q{ä < d|{è8‡{ä `  ‹{âÔYáp á ±{èä¶{è„ ½{ä ¤ !À{â8iåÜ ã{èP!|ä Ô P"|ä ä è!|ä ô Ì!|ä  ¸!|ä   !!|èx!(|ä 4 À".|è "0|äT 8#è d  #6|èø";|ä „ ì#B|èÐ#N|è($_|ä ´ È${|ä Ä ´$‚|èŒ$‰|âÌ/åL%Â|è&Ç|ä  ”&Ò|ä  x&Ô|ä ( \&ß|è &ê|ä H ð&õ|èÔ&ù|èP'û|èœ'ý|äˆ ¤(á}èd(}ä ¨  )"}ä ¸ Ô($}è¸(*}ä Ø À),}èˆ)4}ä ø H*:}è *V}ä  È*\}è˜*g}ä 8 p+—}è@+±}è”+¶}èô+¸}è4,Ä}ä ˆ 8-Ë}ä ˜ ì,Í}ä ¨ Ô,Ð}ä ¸ ¬,×}è,ñ}ä Ø œ-ü}èX-ÿ}ä ø .~èÜ-~ä  |.8~ä ( X.:~è<.@~èð.E~ä X  0Q~ä h ð/\~è\/g~è80r~ä œ À0}~âÜ?á ¬ x0’~èT0¦~èè0¿~ä Ü ˜1Æ~ä ì d1ä~ä ü @1ð~è1ó~ä 02ù~ä ,2û~èì1èÀ2ä \h3ä l03ä |3"èü2.èä30ä ¬”45èh4@äÌT5è Ü45Fèð4Jä üà5Mä À5Pä ¨5[è|5gè6lâà­Œ(äd6~âP&á hô6 ä xÄ6¢èœ6¨ä ˜L7³è7Áä ¸x8Çä È08Ìä Ø8Îäèá8Õä øä7àèÀ7ÿä °8€è”8 €èè9<€èT:H€ä XÜ:^€èÄ:p€ä xÔ;u€ä ˆx;‡€èd;‹€âTÜ äT<Ž€ä¼=èÌÀ<ì<™€ä ìx=¸€è=¼€ä >È€ä ´=ç€è=î€è >ð€è¼>ò€ä \P?õ€ä lè‚@èÈ‚Kèè‚jä ´#ðƒvä Ä#Œƒxä Ô#`ƒƒèDƒ±ä ô#\„Ðä $@„êè „ìä $$<…îä 4$…\è…Žä T$(†–ä d$ä…¢ä t$´…Ïä „$œ…Ñä ”$|…Ùè`…ßä ´$܆òä Ä$¨†÷ä Ô$ˆ†ùè`†‘èP‡.‘蔇1‘èø‡3‘è@ˆ>‘èèˆ@‘äD%„‰è T%d‰B‘è‰F‘ä t%TŠc‘ä „%0Šn‘èÔ‰p‘ä ¤%¼Šw‘蜊y‘ä Ä%´‹…‘ä Ô%”‹‘ä ä%X‹›‘è$‹º‘ä &TŒÅ‘ä & ŒБä $&ü‹בèÔ‹Ý‘èpŒá‘ä T& è‘ä d& ’ä t&øŒ ’èÔŒ)’ä ”&x/’èHL’èÔT’ä Ä& Ž_’èŽk’ä ä&w’èôŽ}’è`†’ä 'T‹’ä $'(–’ä 4'ðÃ’ä D'°“ä T'˜#“è€)“ä t'‘.“ä „'¼2“è8“èX‘N“ä ´'h’\“ä Ä'ü‘a“ä Ô'Бc“謑i“茒o“èÜ’“è,““ä $(p“›“èL“ë“ä D(X”ù“è”þ“ä d(x•”ä t(Ø””踔”ä”(ø•è¤(ȕ정”èH–”è – ”ä ä(8—'”ä ô(—)”ä )Ü–+”è´–J”ä $)˜—i”è„—p”ä D)˜s”蘷”ä d)ܘË”èÀ˜Δèø˜Õ”ä ”)™Ø”ä ¤)t™Ý”èL™ü”è š•ä Ô)pš•ä ä)Tš$•è$š+•ä *h›J•ä *@›N•ä $*(›e•ä 4*ôšl•èÜšs•ä T*œz•ä d*È›|•è°›•ä „*Tœ••è œš•ä ¤*`žœ•ä ´*<ž¨•ä Ä*„¬•äÔ*Pè ä*4·•ä ô* É•ä +à•訜â•ä $+Øžç•ä 4+¸žì•耞ò•ä T+Ÿù•äd+tŸá–èPŸ–ä „+ôŸ –èÄŸ–ä ¤+È¡–ä´+H¡è Ä+ø –ä Ô+¨ '–è *–ä ô+0¢1–è¢8–ä ,´¢W–è¢Z–ä 4,d£b–ä D, £n–èØ¢ƒ–ä d,˜¤…–ä t,|¤Œ–ä „,\¤Ž–è8¤•–ä ¤,x¥œ–ä ´,X¥±–ä Ä,D¥¸–ä Ô,$¥¿–è¥Ö–èÀ¥õ–ä -¬¦—ä -x¦ —馗è̦—ä D- ¨%—ä T-ا1—ä d-\§F—è§H—ä „-L¨N—è(¨S—ä ¤-”¨V—èp¨µ—ä Ä-(©»—èð¨—âÌ/á .Œ©3˜ ⌂ D(á2øƒ4…l?AÄ@üAtADC BøC(.Ì©N˜è¤©Y˜ä H.4ª_˜èªf˜ä h.°ª…˜ä x.˜ª˜è|ª—˜ä ˜.˜« ˜ä ¨. «¬˜é«³˜è¬º˜ä Ø.„¬Á˜æL¬ט訬ܘä /­å˜èà¬ð˜ä (/°®ö˜ä 8/®ý˜ä H/Ì­™èœ­!™è¯,™ä x/ü¯7™ä ˆ/À¯Z™ä ˜/ˆ¯i™èX¯p™è<°v™è¨°x™ä Ø/\±{™ä è/$±†™å 0 ±’™âœz ¸šäô°¸™ä 0¤±Ùä 00±×™èx±Ù™äP0²ìè±Û™ä p0d³â™ä €0H³æ™ä 0ø²ì™è̲ð™è€³ö™ä À0´ø™ä Ð0гšèœ³#šè,´1šå1 µìÄ´Pšä 1lµìLµVšä @1\¶ašä P14¶cšä `1¶jšè µsšä €1x·ušä 1H·yšä  1ä¶„šä °1ж‡šè¬¶‰šä Ð1À·¤šè¤·¸šä ð1 ¸¿šèô·Ášä 2¹Åšä 2`¸Èšä 42D¸ÛšâŒ‚ ä0¸è T2l¹›èH¹*›ä t2ä¹1›ä „2̹?›è¤¹C›ä ¤2ìºb›ä ´2¨º‚›ä Ä2ŒºŽ›ä Ô2dºŸ›ä ä2Dº¥›ä ô2 ºª›èü¹¯›ä 3X»´›è»é›ä 430¼÷›äD3è»ìÈ»û›ä d3x¼œèP¼œä „3|¾œè\¾tœä ¤3ì¾{œè¬¾‰œä Ä3P¿œä Ô34¿•œè¿ œè„¿¿œä 4ÀËœèÀ¿Μè4ÀèüÀ(ä D40ÂGä T4ÂJäd4ðÁè t4„ÁeèpÁlèŒÂoèÃè”ÇèdÄäÔ4TÅì Å”äô4¼Åè 5œÅ–è„Åè $5hÆèTÆ¬è´Æ´ä T5€Ç¶ä d5HÇÂè,ÇÈä „5ÈËèÀÇÎä¤5xÈè ´5`ÈÓèDÈßèøÈæä ä5ÌÉíä ô5´Éžä 6 Éžä 6ˆÉ(žèdÉ+žä 46XÊ6žèDÊ8žètÊ>žè@Ë@žä t6üËRžèèËUžâZ8iåLÌ„žä ¬6͇žä¼6áÍŽžä Ì6äÌ‘žä Ü6 Ì”žè€Ìšžä ü6 Í¡žä 7ŒÍÍžä 7`ÍÑžè8Íמä <7\ÎÝžä L7$ÎßžèìÍážèàÏäžä |7,ÐæžèÐêžä œ7hÑñžä ¬7LÑŸä ¼7ÔÐ(Ÿä Ì7˜ÐlŸètÐtŸä ì7ÒvŸä ü7ÜÑ|Ÿè´ÑŠŸä 8ðÒ Ÿä ,8ÈÒ­Ÿè¨Ò³Ÿä L8ÔÓºŸä \8œÓÅŸä l8XÓÉŸèDÓØŸä Œ8\Ôߟä œ8DÔáŸèðÓìŸä ¼8¬Ô  è”Ô ä Ü8˜Õ" èÕè ü8œÖ& ä 9|Ö* ä 9PÖ- ä ,9äÕ¾ èÄÕ èôÖá èL×ã ä l9¸×î è×õ ä Œ9<Øú è(Ø;¡ä ¬9ØØ=¡è°Ø\¡ä Ì9ôÙb¡ä Ü9˜Ùm¡èPÙ€¡ä ü94Ú†¡èÚ‘¡ä :°Ú˜¡èÚ£¡ä <: Û¥¡ä L:xÛ°¡ä \:,Û»¡èüÚ¾¡ä |:|ÜÀ¡ä Œ:XÜË¡ä œ:DÜÖ¡ä ¬:ÜØ¡èèÛÞ¡èüÜá¡è0Ýì¡ä ì: Ý÷¡ä ü:€Ýú¡èPÝ¢ä ;<Þ ¢ä ,;ðÝ ¢èÄÝ¢ä L;äÞa¢ä \;ÀÞh¢ä l; Þs¢è\Þ~¢ä Œ;äߌ¢è¼ßœ¢ä ¬;`à§¢ä ¼;@àâä Ì;(à=£éàT£ä ì;áW£äü;ááb£èÀàd£èHâk£ä ,<¤âq£è|â|£äL<áã‚£èìâ’£ä l<\㙣è㜣äŒ<¤ãìŒã§£ä ¬<8ä«£ä ¼< 䮣ä Ì<ä³£ä Ü<ìã¶£èÌã£ä ü<œäÈ£èTäË£ä =ÔäÍ£èÀäù£ä <= å¤èôä ¤èˆå¤èðå!¤ä |=hæ.¤èTæ=¤äœ=„çè¬=Xçè ¼=$ç@¤èçS¤èÐçZ¤ä ì=¸è`¤ä ü=”èg¤è\è¤ä >L醤ä ,> 鈤è 锤èé ¤èü鱤ä l>ëФä |>¬êÛ¤èxêå¤ä œ>¼ëë¤ä ¬>”ë¥èlë¥è ì¥ä Ü>„ì+¥è\ì.¥äü>áí7¥èÌì>¥ä ?œíE¥è`íQ¥èìí\¥èî_¥ä\?Œîè l?pîe¥èPä ?èï–¥âÜ?á  ?pﬥèPï¶¥éð½¥ä Ð?°ðÆ¥èPðÉ¥äð?ñé @ñÔ¥èìðÙ¥ä @òï¥ä0@Üñè @@¸ññ¥èˆñý¥ä`@óá¦ä p@üò¦ä €@ ò ¦ä @„ò¦ä  @\ò%¦è8ò,¦äÀ@Äóè Ð@¨ó3¦ä à@Œó7¦ä ð@pó=¦èTóD¦ä A0ôF¦èôóR¦ä 0AÈôV¦ä @A˜ôb¦è€ôn¦ä `A¨õq¦ä pAxõs¦ä €AHõv¦è(õx¦ä ¨A°ö—¦âÄÞ œ» ¸AŒöȦä ÈAxö˦ä ØAöÔ¦ä èAôõצèÜõâ¦ä B4÷é¦ä B÷õ¦ä (Bøöü¦èÌö§ä HB°÷§ä XB€÷§ä hBl÷ §èX÷§ä ˆB$ø§èø#§èHø.§èù1§ä ÈB¨ùE§ä ØBLùL§è8ùN§ä øB úU§ä Cú\§ä Cèùc§èÌùi§ä 8Cœút§è„úw§è¼úz§ä hC ûЧèØú–§ä ˆCü›§ä ˜Cäûº§èÈûÁ§ä ¸Cýŧä ÈC˜üЧä ØC`ü×§èHüì4ýݧä Dþâ§ä Dìýé§è¸ýë§èpþð§ä HD ÿ¨èàþ ¨ä hD´ÿ¨èˆÿ¨ä ˆDð$¨ä ˜DXC¨ä ¨Dˆ¨ä ¸D¨è䙨èXž¨èœ§¨ä øDÀ©¨ä Eœ®¨ä E<¹¨ę̀ä8EáרèàÚ¨è,á¨ä hEôç¨ä xEÀù¨è ©ä ˜E ©ä ¨ED©è©ä ÈE4©è(©ä èE„3©èd6©âؽ F]©èä`©ä ,FÄe©è„q©ä LF$s©ä \Fv©èàx©ä |F ~©ä ŒFôŠ©è€©ä¬F è¼Fì è ÌF¨ ”©ä ÜF” Ö©ä ìF€ Ý©è0 â©ä Gè ç©è¨ ó©è ù©èp è LG” ªä \G ªä lGð ªèÈ 6ªä ŒGä <ªèÄ FªèL MªèÌ Tªä ÌGèWªä ÜG°Yªä ìGd`ªè$kªèŒªä Häªä ,H°‘ªä ø²ä ¸S >³è>³ä ØS8?³ä ìS?/³âÌ/á üSà>K³è>R³ä T ?V³ä ,Tˆ?X³è`?_³ä LTä?c³èÀ?e³è„@p³ä |ThAs³ä ŒT A~³ä œTô@™³èà@›³èôA¥³ä ÌT¸Bµ³ä ÜTTB¸³ä ìT0BųèBè U0C˳èðBï³èôC´ä »è´fD»ä ^LhI»ä ^0hP»èhR»ä 8^i]»ä H^Àhp»ä X^œh€»èthŸ»ä x^¤iª»èXi¶»è¼iû»ä ¬^jþ»âÌ/åäiè Ì^àj¼èÈj¼ä ì^¬k¼ä ü^Pk/¼è,k5¼è$lM¼èülR¼ä <_dmT¼ä L_LmW¼è0mè l_èm]¼è˜mi¼â(À ÔÀ ”_@n}¼è n‰¼ä´_áo¼ä Ä_¸nš¼ä Ô_˜n¦¼ä ä_xn¸¼è`n¾¼èhoÒ¼ä ` pÙ¼èôoÛ¼ä 4`¼pݼä D`„pä¼ä T`dpç¼è@pó¼ä x`lqù¼âÌ/á ˆ`Pq½ä ˜`,q½ä ¨` q½èðpìHr%½ä Ø`¼r+½ä è`„r6½èlrA½èørF½ä a°sL½ä (aÃä ¼i@–DÃä Ìi–KÃä Üiü•RÃèØ•XÃ舖ZÃä jx—kÃè—Ãä ,j4˜ÝÃä Þè EÞâD(áL%á  †”gÞä °†poÞä À†X‡Þè8“Þä à†0˜Þè žÞå ‡Ü¤Þä ‡¼¨Þä ‡ ßä 0‡lßèLßä P‡X>ßè@Sßä p‡ÄZßèteßä ‡Hkßèävßä °‡Ôxßèp”ßèü ßäà‡xè ð‡\¢ßè@¥ßä ˆ@Äßä ˆ(Ðßä 0ˆüÛßèØúßäTˆÌáàâÜ?á dˆ°àè” àèà'àä ”ˆ )àèX ?àä ´ˆà ^àè¬ iàä ÔˆÀ kàä 䈤 wàèH †àä ‰8 ¥àä ‰ ©àä$‰á µàèÜ ÄàèÈ Éàè Ìàä d‰8 ×àä t‰à âàè  åàä ”‰´ êàä ¤‰t öàèP áä ĉd áä Ô‰ü áèä 1áä ô‰Ð3áä Š°:áèŒ<áè,ìäBáä DŠ@Iáè Uáèp\áä tŠÔgáè´~áè šá耣áä ´Š,·áèȹáä ÔŠpÏáèLÔáèÜýáè¨âä ‹ âèØâä 4‹äâä D‹´yâä T‹|}âä d‹h€âèP—âä „‹¤·âä ”‹ˆÂâä ¤‹dÎâèDÑâä Ä‹(Öâä Ô‹óâää‹áøâèØãä Œœ;ãä Œ Hãä$Œá|ãä 4ŒÔÄãä DŒ¸Ëãèœêãè´ìãèÈñãä „Œ@äè(äè˜*äè¸>ää ÄŒHIää ÔŒ,KäèVää ôŒ4uää üxäèà—ää $¬ä舠ää Dt¿äè\×ää dÀûäè˜åä „\åä ”8 åä ¤ @åèäMåèÌQåèìXåè dåä ônåä ŽHyåè4€åä $ŽDŸåä 4Ž µåèìè TŽL»åä dŽôÇåä tŽàÒåèdÖå䔎´è ¤Ž”ëåèxöåä ÄŽˆ øåä ÔŽ$ æèäæä ôŽ@!æèô "æé"'æä $p".æä 4T"9æè4"Eæè¤"Læä d`#Wæä t@#væä „$#|æé#æä ¤$$ƒæä ´ $åæä Äà#ìæè¸#ñæä äÜ$öæä ôœ$øæä p$çèH$"çä $p%-çä 4%9çèô$Dçè´%WçâÜ?á hà%kçèÈ%rçèT&‘çä ˜T'ºçä ¨ 'Ëçä ¸È&Òçè˜&Ùçä Ø$(Þçäèá(è øÌ'êçè´'íçä‘á)]èä (‘à(_èä 8‘t(cèèX(ièä X‘x)pèè0){èèÐ)‚èè¨*„è䘑¨+ì<+†èè ,èè|,•èä Ø‘l-—èä è‘@-®èè -ºèä ’ü-½èä ’Ø-ÄèèÄ-ËèèÐ.×èä H’x0ãèä X’X0èèä h’00óèè 0õèèÄ0éè(1éâ¬#È5°’L2éèø1 éä Ð’à2éä à’È2#éä ð’¤2%éå “Œ2Šéèh2ŒéèP3“éä 0“4šéèÄ3ªéèl4Çéä `“Ø4Ëéè¸4Óéä €“¼5Õéä “ 5ãéä  “€5êéè45úéä À“Ä6êè\6 êè7 êèh7@êå ”P8_êä ”ð7kêèÐ7rêä 0”˜8uêè„8{êä P”D9‡êä `”(9Žêè°8’êèä9”êä ”H: êè0:«êä °”0;²êè;¸êä Д¤;Òêè„;Ýêè,<èêèÄ<îêèL=ðêä •Ü=õêè =÷êè0>þêä P•? ëä `•¤>#ëä p•€>)ëèL>+ëä •x@5ëä •ø?è °•À?8ëè¨?Zëä ЕÌ@\ëè°@hëæô@wëèA‚ëèXAˆëèœAëä 0–$B”ëèøA­ëä P–|B´ëä `–hB»ëèPBÆëä €–`CÌëä–áCØëä  –äBãëèÄBåëä À–ÜCìëä ЖCóëètCøëèŒDúëå —Eìä —äDìè¸D ìä 0—€Eìä @—pE1ìè@E8ìä`—áF:ìä p—àEEìä €—¼EQìè Erìä  —¼Fwìè\FƒìäÀ—TGè ЗGŽìèôFìè˜G¯ìå ˜ØG±ìè°G´ìä ˜lIºìä 0˜PI½ìä @˜IÕìä P˜ôHíìä `˜ÜHïìè¸Hôìä €˜ÜIúìèÀI íè\J íä°˜\KìKíè˜KíèPL%íäð˜\Mé ™üL+íèÄL6íä ™LN9íä 0™äM=íè”MHíä P™ OSíèÔNYíä p™OdíèpOjíä ™Ppíä  ™ìOríä °™ÔOxíè´OzíäЙÌPè à™°P~íä ð™œP€íå šdPíä šDP–íè0Pè 0š,Q›íéQ¦íâ0"á¼"á XšÀQÄíè¨QÏíèpRè ˆš¸RÖíè”RÝíèôRâíèŒSêíä ÈšøTõíäØšLTáîèT îä øš|UîèU$îä ›TV?îä 0›8V€îâP°$¢äðU¨îä P›W«îä `›ÈV¶îè¨VÀîä €›¬WÇîä ›XWÓîè8Wëîä °›ðWöîèÈWýîä ЛPXïè8XïèœXïå œ Yïä œìX*ïèÌX6ïèLYDïä@œZè PœÐYPïä `œ¬Y_ïä pœYjïèhYmïè8Zoïä  œ[Žïä °œøZ‘ïè¨Z—ïèp[šïä 䜴\œïâÜ?á ôœX\¯ïä 4\ºïä \Åïä $ì[ÑïèÈ[Øïä Dd]Þïä XT]áïâÜ?åø\óïè]þïä ˆh^ðä ˜^ðèì]ðèÈ^ðä ȸ_ðä ØŒ_"ðèh_)ðä øà`0ðä žÐ`3ðâÜ?á ž`Fðä ,ž|`‰ðä <žD`ðè(`›ðèaŸðä lžta¤ðä |žüä X¬¬žJüä h¬”žqü耞vüä Œ¬Ÿ•üâÌ/å잺üèdŸÀü伬 ìäŸÈüä ܬP¡Ëüä ì¬8¡Öüä ü¬” áüèt èüä­è¡ìp¡ìüä <­D£òüä L­ £ýüä \­¼¢ýä l­Œ¢ ýè`¢ýèì£ý䜭t¤è ¬­T¤'ýä ¼­8¤=ýè¤?ýè¥Gýä 𭤦JýâÜ?â ®¦]ýèø¥hýä ®ð¦{ýä 0®Ц}ý踦”ýä P®Œ§™ýä `®p§²ýä p®P§´ýä €®$§Óýè§è  ®€¨Õýä °®L¨×ýä À®4¨Ûýèì§àýä ä®ä¨êýâÜ?嘨ÿýä ¯p©þä ¯X© þä $¯@©þè$©þä D¯dª'þä T¯,ª-þä d¯ü©;þä t¯Ø©Tþè´©[þä ”¯¤ªzþ茪þä ´¯ˆ«þä įd«‘þä Ô¯D«“þä ä¯ «•þäô¯«ìäªì¬«´þä $°€¬»þèl¬Éþä D°¼­åþä T°P­ðþä d°8­òþä t°ü¬ùþä „°جÿþ踬ÿèô­ ÿè\¯ÿäݰè Ô°د ÿ謯#ÿè,°Bÿä ±±Gÿä ±а^ÿè´°ˆÿä 4±t±‹ÿèH±’ÿä T±@²˜ÿè챤ÿèp²«ÿä „±d³­ÿä ”±<³¸ÿè³Åÿä ´±ȳäÿä ı¨³öÿ蘳úÿâÌ/áè±áµ1ä ø±¼´>ä ²d´@èL´Uâ œ ,²pµjä @²PµuâÔY嵕ä `²8¶œä p²¶¬ä €²ĵ³èœµÒä  ²<·Öä °² ·áä À²ä¶íä в¼¶ðä ಌ¶è\¶å ³¸ ä ³Ø·"ä ³„·.ä 0³p·:èX·<謸Nä `³\¹dä x³H¹sâ̤áP¥á ˆ³ ¹´ä ˜³ ¹Óèô¸Õä ¸³ø¹ðäȳйè Ø³¨¹óè¹:äø³Ⱥè ´lº>èTºEâD(áL%á 0´L»gä @´»ièüº~ä `´ »ƒèˆ»…輋è(½§è¤½Òä °´L¾Úè¾êä д¿í褾ñè0¿ùå µÄ¿ûä µœ¿èP¿èä¿è@ÀèÀÀ$ä `µ,Á+ä pµÁ.èüÀ5ä µôÁ7ä  µÌÁCä °µ¤Ábè€Áhè`Ânä àµÐÂzä ðµ¸Â…è˜Âä ¶LÃä ¶ Üèô»ä @¶ÃÆèdÃÍä `¶HÄÏè,ÄÖè|ÄÝä ¶ÔÄää  ¶´Äïè¤Ää À¶tÆ ä жdÆJä à¶LÆQä ð¶4ÆTå ·ÆYä ·ðÅ]ä ·ÌÅcä 0· Åiè|Åoä P·Çuä `·Ç…ä p·àÆŒèÈÆ—ä ·ÔÇžä  ·´Ç¬ä °·¤Ç¸ä À·tÇ¿è`ÇÄâ0"á¼"á è·É%ä ø·ìÈ2ä ¸ÔÈ=ä ¸ÀÈsä (¸ Èvä 8¸€È•èdÈ™ä X¸€É¯ä h¸\ɶè4ɼèüÉÇä ˜¸äÊÎè ÊÐèìËÞè$Ìåè ÍìèHÍøä ø¸ìÍüèÈÍèLÎ!ä (¹(Ð#ä 8¹Ð/äH¹ÐÏè X¹tÏ?ä h¹TÏJä x¹8Ï`䈹áÏgèÜÎlä ¨¹¬Ðwä ¸¹„Ð|èpÐ‡ä Ø¹dÑèÑ–ä ø¹DÒµä ºÒ·èÐѼä(º(Óè 8ºÐÒÌè|Ò×ä Xº$Ôöä hºØÓä xº°Óä ˆº˜Ó$ètÓ'ä ¨ºlÔ-èDÔLä ȺÕSä ØºðÔfä èºÌÔlè¤Ôqâ0"á¼"å¸Õä »XÖŸè@ÖªèØÖ±ä P»°×³ä`»€×ì$׿èØÞè|ØòèLÙõä°»ìÙáè¸Ùä л°Ú ä à»ÚèhÚ!å ¼ŒÛ(ä ¼8Û3è Û:èÜAä @¼$ÝMä P¼Ý¡ä `¼Ðܲè°ÜÏä €¼øÝåä ¼ÀÝñè|Ýüè€Þ â0"á¼"á ȼ¬ß/ ä Ø¼ˆß6 éßO ä ø¼ àT èüßY è4àd è¬àk èðàq ä H½¤ás ä X½Œá” ètá  ä x½4â§ è âã ä ˜½|âï èTâ ä ¸½<ã ä Ƚ ã' èôâ. èXã4 ä ø½0ä: èäE ä ¾æT ä (¾èå` ä8¾dåè H¾0ål ä X¾åo èäär ä x¾€æx è(æ‹ ä ˜¾Àæ è¬æ˜ ä ¸¾8çš èç¦ ä Ø¾ÜçÍ ä 辬çÐ èxçí ä ¿tèó èDèú ä(¿Léá èØè è¸é+ èÄêj èäêv ä x¿0ë‹ èë– ä ˜¿ ë˜ ä ¨¿€ë¥ èdë± ä È¿4ì½ è ìÈ ä è¿ í* ä ø¿ðì4 ä ÀÜì; ä À¸ìD è”ìJ ä 8À îL ä HÀôí[ ä XÀØí] èÄíg ä xÀ<îi è,îu ä ˜Àüîw èàî‚ è ï‰ ä ÈÀ(ð ä ØÀð— èØï¢ è˜ð® èÜð¾ ä ÁŒñÅ èhñÑ ä 8Á€ò× äHÁXòè XÁ(òÙ èòÛ è¼òô ä ˆÁÐó÷ ä ˜Ádó ä ¨ÁDó$ èóC ä ÌÁ°ôb âø® ÜÁáô‡ èìó‹ â€}dk ÂÈõ¶ è°õ½ ä $ÂŒöÀ ä 4ÂpöË ä DÂLöÎ è0öÔ ä dÂÔöÙ è°öä ä „Âd÷ï èH÷ú ä ¤Âè÷ä ´ÂÄ÷è¤÷ ä ÔÂÄø&èˆø9ä ôÂ8ù@èùKèØùSä $ôú^ä 4Øúiètúuä Tà û€èÌúŒä tÃxû“ä „ÃTû–è<û¡èÔû£èÀüì4ý©ä ÔÃäýµääøýìýÁäÄ\þìþÍä $ÄxÿÙä 4ÄÐþää DĤþ÷è„þýèÔÿ ä tÄ,èüÿèœ!ä ¤ÄX'ä ´Ä<*è5ä ÔÄä<ä äÄÐCä ôļVè¨Xä Å\_â°ûØŸ ,Å(³èºä LÅT¼èDÈâÜ?á pŤÛèxÝä Åtãä  ÅLïèìúä ÀÅ´èä àÅ, èüèŒ#ä Æ?âÜ?åTQä4Æ`è HÆP`âÜ?á XÆrä hÆðtä xÆØ€èÀ¯ä ˜ÆØ¶è|ºä ¸Æ8ÁèÇèÈÎä èÆX Óä øÆ, Þä Ç úä ÇøIâD(áL%åàlâ/á HÇt xâÜ?áXÇ$ ìì Šä xÇÌ –è¨ ­ä ˜ÇÌ ´ä ¨Çt Äè\ ãè8 è ØÇ êä èÇÈ öè¨ øä ÈÜ ä ÈÄ ä (È` +èD 7ä PÈ|Câ¨û ¼V `ÈL¨è,ºä €ÈtÀä œÈüÈâ,áä üäØõä ¼ÈÜ÷ä Ìȼè˜ä ìȬ!ä üȈ(ä Él3èDCä ,ɰ`ä <ɘkèTrä \ÉÐ}ä lɬ‰èh”ä ”É”³â0ìáÈ\ä4áä ´ÉìèÌè ä äÉ ä ôÉÌ è¬$è´0ä $Ê(7èôBä DÊtHè\TèØVèô]ä „ÊÔhä ”ÊltèX†ä ´Êp‹è  ä ÔÊè®ä äʤ±èŒ·ä Ëйä Ë´½ä $ËüÈèÜÎä HËlÔâÔYá XËLéèTèàè0ä ¨Ë`%èL(èÈ+ä ÜË|-â0ìå\Jä üË< bä Ì$ mä Ìôtè°è<Ì "ì`!zè<"…è#‹ä |ÌP#‘ä ŒÌ<#è #Ÿèˆ#£ä ¼ÌØ#®èÀ#·ä ÜÌd$ËèD$Îä üÌø$ÔèÐ$åä Íœ%ðè\% ä <Í&èÄ%ä \ÍŒ&!ä lÍx&(è0&+äŒÍ(èœÍì'è ¬ÍÈ'6ä ¼Í@'Aè 'Lä ÜÍÈ(Nä ìÍt(Qä üÍ\(_è4(bä ÎD)mä ,Î()²èô(Ãä LÎø)Ïä \ÎÔ)Ñä lδ)×èŒ)Ûä ŒÎŒ*æè4*íä ¬ÎÈ*ôè¬*ä Ìά+ä ÜÎ+$ä ìÎl+&é+,è8,1ä Ϙ,=ä ,Ï€,KèX,NäLÏá-Tä \Ïè,jè¬,qä |Ϙ-uè<-|ä œÏì-‚ä ¬ÏØ-‡èÀ-Šä ÌÏ|.£è<.¨èÌ.­èD/¸âèüð*á И/èä $Ј/øèp/ ä DЬ0 ä TЄ0ä dÐl0ä tÐH0è(0>è(1Eä ¤ÐÔ1dä ´ÐŒ1gè`1nä ÔÐô2pä äÐt2sè2xä Ñœ3è,3¡èØ3ìä4£äDÑD5ì5¯èì5²ä tÑH6¾è06è€6ä ¤Ñ€7)è,7è ÄÑ 85ä ÔÑè7:è¨7=ä ôѨ8WèX8Zä Òd9^è89iè¬:tèè:xè@;zä dÒ¼;}ä tÒ˜;€èd;ƒä ”Òð<ˆä ¤Ò¤<Šä ´Òl<›è4<¦ä ÔÒ”=ºä äÒH=½ä ôÒ0=Áè =Èä Ó>çä $Óì=ìä 4ÓÐ= è´=ä TÓœ>#è„>.ä tÓ?5èô>Pèd?[ä ¤Ól@´ä ´ÓD@ºä ÄÓ$@Åä ÔÓ@Ðä äÓà?ûèÐ?áä Ôô@ä ÔÄ@ä $Ô¬@è˜@è,A4äTÔPBè dÔ¨A6è”A=èÈB@èLCCâ0"á¼"á ¬ÔÌCžè”C¬ä ÌÔÀD¸ä ÜÔpD¼ä ìÔTD¾è@DÉèEÕä ÕˆEâä ,Õ\Eäè4Eä LÕôE èÔEä pÕFâÜ?á €ÕxF1äÕTFì,F>ä °ÕüFJè¤FUä ÐÕHGZèGaä ðÕHcå ÖôGpètG|è€Hˆä 0ÖxIŽè I™ä PÖ,Jžä `ÖJ´èÐIÀè„JÆä ÖDKËè(KÖä °ÖÐKÛä ÀÖ¸Kè”Kä àÖ\Lè4Lå ×øL"ä ×àL.ä טL:èxL>ä @×pM]ä P×\Màä `×,MâèMî⨀tKá ¶ Œ×ØN-è(N?ä ¬×¤OKä¼×POì,OPèäO\ä ìטP£èHP¨ä Ø Q´ä ØðP»èÌPÁä <ØèQÇä LبQÊä \ØQÒä lØtQåä |ØPQêè8Qùä œØÌRä ¬Ø¨R 伨 ä €Ú¤YJ èˆYìLZL ä °Ú[T èøZi ä ÐÚ\k ä àÚü[y ä ðÚ°[ è˜[• â‚äh\¤ ä $Û^¯ ä 4Ûä]± èÀ]¹ ä TÛà^Ç ä dÛ ^Ó èŒ^ô ä „ÛL_(!ä ”Û8_-!è_b!ä ´Û°_d!ä ÈÛ€_Œ!â‚äh_µ!ä èÛXaº!ä øÛ$aÉ!ä ÜaÔ!ä Üø`"ä (Üà`"ä 8ܼ`"äHÜœ`ì|`0"ä hÜb5"äxÜábA"ä ˆÜèaV"ä ˜ÜÄaƒ"è a³"ä ¸Ü bÎ"ä ÈÜ|bÒ"èXbØ"ä èÜcÚ"ä øÜàbì"è¼bñ"ä Ýldø"ä (ÝÔc#ä 8Ý´c#èc7#èˆd@#ä hÝüeF#ä xݼeu#ä ˆÝ¤ew#ä ˜Ýhe}#èPeƒ#è\f‡#ä ÌÝ(g‰#âÜ?á ÜÝg³#ä ìÝôfµ#ä üÝàf¸#ä Þ¸f»#èœf¾#ä ,Þ”gÅ#è€gÐ#ä LÞhhÓ#ä \ÞPhß#éhõ#èøhü#èŒi $ä œÞði$èÔi$ä ¼ÞŒj$ä ÌÞtj'$ä ÜÞXj3$è&ä Ôá8uR&èôtl&ä ôáðvw&ä âÔv~&ä âv‰&èèu&èLw’&ä Dâ8x–&è(xäæÜx˜&èyè „â¬yž&ä ”â”y¥&èpy±&ä ´âxzÐ&ä Äâ(zÜ&èzà&ä äâðzè&äôâÄzì¬zì&â èÄãL{è (ã4{ 'è {'ä Hãð{'ä \ãÜ{#'âÜ?á lã¨{8'è|{C'ä Œã¬|b'ä œã`|m'ä ¬ãD|x'è$|'ä Ìã(}–'é}µ'èì}¼'ä üãœ~Ç'ä ä|~Ó'ä ä`~ß'è ~ê'ä <äð'èÐ~û'èT(è¨ (ä |ä€(ä Œäh€(èL€$(ä ¬äø€0(èÄ€7(ä Ìä:(ä Üäl<(ä ìä<[(èa(èàg(ä 娂m(ä ,匂x(èt‚(ä L儃†(ä \å\ƒ(ä lå8ƒ›(胞(ä Œå°„©(èT„¬(ä ¬å섯(èЄ´(èp…Á(ä Üå0†Í(ä ìå†Ñ(ä üåø…à(踅æ(ä æ¬†í(èH†ï(é‡ò(ä Læô‡)ä \æЇ)ä læ°‡()ä |æ‡/)èd‡2)èPˆ9)ä ¬æ؈B)ä ¼æœˆI)脈N)ä ÜæŒ‰Q)ä ìæ`‰_)ä üæD‰a)è‰h)ä ç܉n)訉z)èŠ})ä Lç`Š…)è@Š—)ä lçЋš)ä |çt‹Ÿ)è@‹ª)ä œç4Œ±)茴)ètŒ»)ä ÌçD¾)ä ÜçÊ)ä ìçÔŒÕ)踌ê)ä èŽí)ä èô*ä ,èÜ*ä <è¨#*è|%*ä \èÜŽ'*ä lèÄŽ.*ä |蜎9*è`Ž@*â0 è´K*ä °è„O*è4W*ä Ðè¼^*èpl*ä ðè(‘x*å é‘‹*èè™*ä éH’*ä 0é’«*ä @éÀ‘¶*ä P锑É*èx‘Ï*äpé@“è €é¼’á*èt’ì*ä  é¬“ö*ä °é“ø*èt“ú*ä ÐéÌ”+ä à鈔+ä ðé`”.+å êH”A+èè“L+èü”\+ä 0ê•h+èp•è Pê–{+è蕈+ä pêT–“+è–š+è—£+ä  ê\—§+è(—®+ä Àêx˜Æ+ä ÐêÌ—Ö+謗Ý+ä ðêø˜â+å 뼘î+蔘ú+ä ë„™,è<™%,ä@ëáš6,èÌ™O,蜚[,è›],ä €ë˜œh,ä ëð›t,èÜ›,âð*á ´ë$¤,äÄëá¦,ä Ôë윱,ä äëÔœ¸,è´œ¼,èdÇ,ä ìØÉ,è¸Ï,ä4ìôžèDìÄžè T쌞Ú,èhžá,ä tì8Ÿæ,è Ÿè,èŸí,è@ ó,ä ´ìØ -ä Ä유 -èd -ä äìd¡-ä ôìD¡-ä í ¡%-è¡,-èè¡è 4íÜ¢0-è¼¢2-ä Tí8£>-è£A-ä tíè£I-ä „íÈ£L-ä ”í€£X-èd£^-ä ´íФt-ä Äí|¤v-ä ÔíL¤‚-è(¤ˆ-ä ô픥-ä —-ä îT¥¡-ä $î0¥£-襩-ä Dî4¦°-ä Tîü¥·-èØ¥Ö-脦Ý-ä „îL§ä-è§é-èÀ§è ´î0¨ë-ä Äî¨.äÔîá¨.èä§ .脨.ä ïü¨.ä ïÔ¨.è´¨(.ä 4ïÌ©=.äDï ©è Tïp©H.èL©K.ä tïxªN.ä „ï`ªP.èDªT.ä ¤ïت[.褪s.ä Äz.ä Ôïx«|.ä äïL«.è«è ðl¬’.ä ð4¬™.謥.蜬¬.ä Dðl­³.ä TðP­¶.è ­¹.ä tðЭ¿.è´­Â.ä ”ð ®Õ.è®Ü.èx®ó.ä Äðp¯ü.ä Ôð0¯þ.ä äð¯/ä ôðô®/èÜ®=/ä ñ°™/ä $ñ䯸/舯¾/ä Dñø°Ì/ä TñܰØ/ä dñ¨°ñ/耰ó/ä „ñd±ù/è±0ä ¤ñ²0ä ´ñì±0è ±(0èl²20ä äñT³F0èÀ²J0ä ò ´b0ä òà³k0ä $ò´³„0蔳0ä Dòµ˜0ä Tòд¹0ä dò˜´»0è`´Ë0ä „ò”µÑ0èµÕ0èÀµ×0ä ´òx¶ö0ä ÄòX¶1ä Ôò$¶1è¶)1äôòD·è óü¶51ä óä¶71ä $óжB1踶I1èÀ·L1ä Tó0¸Q1è¸\1ätóá¹m1ä „óظy1ä ”óĸ{1ä ¤óœ¸†1è|¸’1ä Äó„¹™1èT¹¤1ä äóxºÃ1ä ôóXºÎ1èºÝ1èкè1ä $ô,»ô1è »2蘻22ä Tô€¼42ädôX¼ì¼@2ä „ô@½G2èà¼Z2舽y2ä ´ôt¾•2ä Äô¾ª2ä Ôôì½µ2èĽÔ2èÀ¾Ú2舿ë2ä õtÀ 3ä $õTÀ3è$À3ä DõØÀ3èÀÀ 3ä lõ¤Á+3âÂìrä`Áj3ä ŒõdÂp3èôÁ|3ä ¬õDÃ3ä ¼õÈ3èäÂŽ3èìÔ3ä ìõäÄ›3ä üõœÄ¢3ä ö„Ä®3ä ödĵ3è@ÄË3ä <ö@ÅÒ3éÅå3èÅ4è0Æ 4ä |öøÆ4è´Æ4ä œöÈ4èØÇ(4ä ¼ö ÈB4è`ÈM4ä Üö ÉX4ä ìöôÈb4èÐÈi4èHɈ4è°É‹4è,Ê’4ä <÷TË¥4ä L÷˨4ä \÷Ôʪ4ä l÷¼Ê°4è¬ÊÅ4èÍÈ4ä œ÷ìÍÍ4ä ¬÷´ÍÓ4ètÍè4èDÎñ4ä Ü÷˜Îý4ä ì÷|Î 5è`Îè øÏ5èäÎ5ä ,øÌÏ!5è°Ï05ä Lø8Ð75è Ð95ä løìÐ@5ä |øˆÐC5èLÐN5ä œøxÑU5ä ¬ødÑa5èDÑc5ä ÌøÌÑi5è Ñè ìø,Òk5ä üøÒq5èàÑì€Òx5ä,ùäÒè <ù¸Òz5è˜Ò|5èÓ‚5ä lùÀÓ¡5ä |ù¤Ó¹5è€Ó»5ä œù@Ôß5ä ¬ù Ôñ5ä ¼ùÔô5èäÓù5ä ÜùœÔ 6è|Ô 6ä üù€Õ6ä ú8Õ6ä úÕ%6èüÔ)6èèÕè LúˆÖ+6è$Öèlú¨×ì×16ä ŒúØ76èì×K6èXØX6ä ¼úXÙ\6èìØa6èÌÙm6äìúœÚè üúLÚp6èÚ{6ä ûÛ‚6èÈÚ—6è$Ûœ6è„Û7ä\ûàÜè lûœÜ7ä |û€Ü7ä Œû`Ü!7ä œû8Ü@7ä ¬ûÜF7èØÛQ7ä ÌûÜÝn7ä Üû¸Ýy7ä ìûŒÝ˜7ä üûxÝž7èTÝ¥7ä ü(ߨ7èß«7ä<ü°ßè Lüdß­7èPßÀ7ä lüüßË7èàßÞ7ä ŒüÐàï7ä œü¸àP8ä ¬üœàW8è„àY8ä ÌüTáh8è ál8ä ìüàáo8èÈás8ä ý(â8éâŠ8ä ,ýÔâ˜8ä <ý¬âš8è€â?9ä \ýtãE9è0ãT9ä |ýÈãs9è°ã9èàãž9èXäª9ä ¼ýØä¶9ä Ìý¸ä¸9ä ÜýŒä¿9ètäÅ9èøäÑ9èpåß9ä þ¸åé9ä ,þ åë9è„åÿ9ä Lþ8æ:è(æè lþÔæ :è°æ:ä Œþç:ä œþtç:ä ¬þ8ç*:è ç1:ä Ìþ è?:ä Üþ„èD:ä ôþdèP:âÔYáhœäHè‚:ä ÿ é:èé’:ä 4ÿìé™:èÄéž:ä Tÿ ê¤:ä dÿ|ê°:ä tÿhê½:èHê¿:ä ”ÿüêÄ:ä ¤ÿìêË:èÔêë:è@ëò:èÜëý:è$ì;ä ôÿí;èøì ;âl‹¨íC;ä (xíK;èPíR;ä HîX;èèíc;ä hTîj;è$îl;äˆáï‹;ä ˜ÄîŽ;䨬îì„î;ä Èôï¯;èÀïÎ;ä ètðÔ;ä øHðÖ;è ðØ;ä $ñÚ;ä ( ñÞ;ä 8ìðà;èÈðÿ;ä XÜñ<ä h¬ñ <èxñ'<â¬#Œ ò,<ä œ ò:<èøñ<<ä ¼ôò?<èÔòF<ä ÜÈóH<ä ìóJ<èTóU<ä ˆô\<èPôh<ä ,èôj<èÈôp<èTõw<ä \Ìõy<ä l„õ|<èlõ‡<ä ŒxöŠ<ä œ(öœ<ä ¬ö¶<èðõº<ä Ì´öÉ<è”öÕ<ä ð÷ô<âP&åìö=ä <÷!=âP&å÷K=èà÷N=ä H`øP=âP&åü÷q=ä hðùs=ä xÈùw=ä ˆœùy=ä ˜Pù‘=èù–=ä ¸¨ú™=ä Èlú§=è<úª=ä èû¶=ä øÜúá=èÄúá>ä œû>ä (dû>ä 8Pû>è4û>ä XHü>èÈû:>è„üC>èÐüJ>ä ˜”ýM>ä ¨pýZ>èýy>ä ÈÌý>è¬ý>èþ©>ä øðÿÈ>ä ÌÿÚ>ä °ÿá>ä (˜ÿ ?ä 8„ÿ?è`ÿ?ä Xô "?ä hÜ -?ä xÀ 2?ä Œœ T?â°ä` l?ä ¬Ô ‚?ä ¼h Ž?èH “?ä Ü< ²?ä ì$ ¹?é ¾?ä € Ä?è\ É?ä ,° Ð?è˜ ×?ä Lp Ü?ä \8 @ä l  @è @èŒ @ä œ” @èT 0@ä ¼T O@ä Ì8 [@èô ^@ä ì i@è€ è l u@ä 0 @è –@ä <L ¡@ä L4 ¨@ä \ «@èü °@ä |˜ ³@èh º@èà è ¬P ¿@è, Ç@ä Ìø Í@èÈ æ@ä ìÈ ë@ä üœ ÷@è€ ù@èx Aè¸ Aä <@ Aèì 1Aä \ä 3AèÈ EAä | IAèP PAèl VAä¬á nAèÜ …Aè„ žAä ì  ¤Aâ̤áP¥á`¥á(¦å BâÌ/á  ì !Bè¤ @Bä 0 ì KBä @ Ì VBä P ” kBèp rBèX {Bä € ð †Bä Ð Bä   l ”Bä ° < ŸBä À  ¦Bèü ±Bèˆ ¶Bè< ½Bå Ì éBèˆ ëBèð ÷Bä 0 ð ýBè\ Cä P \ Cè  Cä p ° Cä € ˆ 1Cèh 6Cä   < ACä ° ð [CèÐ ]Cèô dCä à ¬ pCä ð h rCå 4 |Cè ˆCä ä ŠCèÈ Cä @ H ®Cä P , ³Cä `  ÈCèä ÏCä€ À è ¬ ÑCè„ ØCä ° L ÞCè( äCè< ïCä à È òCä ð   õCå p Dè` Dèô Dä 0 , ;Dä @   SDä P ø ZDä ` Ä dDä p ° kDè pDä l yDèX Dä ° d Dä Ä  „Dâä­äÈ ÆDä ä ˜ ÉDè„ ÍDä  @! ÐDä á! ÛDèÄ âDä 4 œ! èDè€! êDé" Eä d €" Eè\" /Eä „ 0# NEä ” ô" [Eä ¤ Ü" fEèœ" oEè\# tEä Ô Ü# |Eä ä ¤# ~Eè# è Ð$ “Eä ˆ$ ŸEèh$ ¥Eä4Œ% è Dh% ¬Eä TH% ¸Eè(% ÃEät& è „ä% âEèÐ% éEä ¤¬& ìEä ´h& øEèH& Fèà& Fää|' ìT' Fä P( -Fä 8( 9Fä $ô' ;FèØ' è D$) NFä Tè( PFä dÄ( WFèp( ]Fä „Ô) ßFä ”´) ñFä ¤˜) øFè„) Gä Ä0* Gè* Gä ä+ Gä ôÄ* ,Gä ¨* ?Gè€* AGä $Ð+ `Gä 4˜+ cGä Dd+ –Gè@+ œGä d¼, ¢GèD, §Gä „<- ½Gä ”- ¿Gèð, ÞGä À˜- äGâ|,áT#á@)åt- õGä àx. HèH. -Hå / 0Hä ì. ;Hä À. ZHèœ. \Hè,/ ^Hèø/ cHèt0 qHä p 1 xHä€á1 „Hèä0 †Hä á2 Hä °à1 ™Hä À´1 ÌHä Ѐ1 ×HèX1 öHä ð3 Iå Ð2 4Iä °2 ?Iä œ2 UIè€2 `Iä @h4 bIä P4 dIä `ð3 pIä pØ3 wIè¬3 zIä ´4 €Iä  ˜4 ‹Iè€4 —Iè45 ™Iä Ь5 ¤Iä à”5 ´Iè|5 ¸Iå L6 ¿Iä  6 ÆIèô5 ÌIä 0Ü7 ÑIä @¸7 Jä Pl7 Jä `H7 Jä p7 &JèÄ6 )Jä |8 4Jä  \8 8Jä °88 WJä À8 ]Jèü7 cJâÌ/æ9 ¶Jä ôÄ9 ÌJä ¨9 ÏJä p9 ÚJä $49 àJè 9 çJä Dh: éJäT<: è d : ïJèü9 þJä „Ô: Kä ”¸: Kä ¤œ: Kè„: è Ä0; Kè; #Kä äœ; 4Kä øt; ;Kâ8OåL; PKä ¨< RKä (€< pKä 8h< sKä HP< xKè4< zKä hd= …Kä xD= ˆKä ˆ = žKèä< ²Kä ¨> ÃKä ¸ü= ÆKè„= !Lä Ø> *Lè@> KLä øl? VLä 4? Lä ? óLèð> öLä 8@ Mä Hè? Mè°? Mäh|@ è xL@ Mæ0@ Mè¬@ 3Mä ¨¨A :Mä ¸hA EMè,A KMäØVä ü!Xr DVä "r HVér OVä ,"ls VVä <"Èr bVèˆr iVä \"Àt oVä l" t qVä|"tt è Œ"üs |Vä œ"Øs ~Vèˆs €Vä ¼"u ‚Véu …Vä Ü"¼u ˆVä ì"˜u ”Vèpu ›Vä #v ¦VèÜu »Vä ,#,w ÁVä<#àv è L#°v ÄVèŒv ÔVä l#Ìw çVä |#|w úVèXw ÿVä œ#(x Wä ¬# x !Wèèw &Wä Ì#¼x HWä Ü#|x WèDx ›Wä ü#dy ŸWä $$y §Wèèx ©Wä ,$ z «Wè´y ­WèDz ´Wä \$€{ ¿Wä l$D{ ÒWè({ ñWè| õWä œ$Ø| Xè0| Xä ¼$ˆ} Xä Ì$ } Xè} "Xè¨} .Xèð} 9Xè`~ ?Xèœ~ EXä ,%L KXä <% VXèà~ iXä\%Ѐ è l%¤€ kXè$€ ŠXä Œ%x Xä œ%H ›Xè( Xä ¼%h‚ «Xä Ì%<‚ »Xèø ½Xäì%ø‚ è ü%Ø‚ ÍXè´‚ àXä &Œƒ ôXä ,&lƒ öXè@ƒ Yé„ Yè8„ Yä l&ˆ„ Yèd„ "Yä Œ&¼„ -Yè „ 8Yè,… AYèÌ… GYä Ì&D† MYè † YY茆 [Yäü&Œ‡ ìH‡ fYä'ሠìà‡ lYä <'Ĉ yYä L'¨ˆ …Y蔈 ‡Yèøˆ è |'Œ‰ “Yä Œ'l‰ —YèP‰ ›Yä ¬'Š  Yä ¼'ø‰ ¬Y謉 ®Yä Ü'ÈŠ ¹Yä ì'°Š ÀYä ü'ŒŠ ÇYètŠ áYè0‹ æYèÄ‹ þYè(Œ áZä L(ÀŒ Zä \(¨Œ Zä p(”Œ Zâ8OåtŒ CZèˆ IZä  (Ì TZè¨ fZèŽ lZä Ð(èŽ sZètŽ ~Zè, …Zå )H ‰Zä )Ü ’ZèÄ ¥Zä 0)¨ §Zèx ©ZäP)á‘ ÅZèä äZèH‘ æZä €)°‘ éZä )˜‘ ìZä  )t‘ óZè\‘ õZè4’ [ä Ð)Ø’ [è„’ *[ä ð)Œ“ 7[å *p“ C[ä *L“ N[ä *$“ Y[è“ `[è<” t[茔 y[èü” [ä p*T• •[è@• —[ä *–  [èð• ¯[è\– º[ä À*P— ¿[ä Ð*0— Ê[ä à*ø– Ñ[ä ð*Ж Þ[踖 ê[è”— ò[ä +˜ \èØ— \è$˜ \è\˜ ì°˜ \èà˜ \ä €+|™ #\èh™ /\ä  +Й 2\ä °+´™ 5\è™ <\èô™ >\ä à+¬š W\èxš Z\èP› \\ä,à› è ,¨› ‡\è› Š\ä@,tœ è P,dœ \ä `, œ –\è œ µ\輜 ·\ä ,„ ¾\ä  ,X É\ä °,H Ï\è Ö\â œ ÈÇ Ø,dž ì\ä è,ž ø\è´ ]ä -èž ]ä -Øž ]ä (-Àž ]è°ž ]ä H-HŸ ]ä X-8Ÿ ]ä h-Ÿ &]èøž )]ä ˆ-ØŸ H]輟 O]ä¨-`  è ¸-P  U]è0  \]èð  g]ä è-°¡ ¯]ä ø-¡ »]ä .0¡ ½]è¡ Ä]è¢ Ð]ä 8.X¢ å]è<¢ ç]äX.£ è h.È¢ ê]è´¢ í]ä ˆ.࣠ô]ä ˜.У ÷]ä ¨.œ£ ú]ä ¸.p£ ^ä È.L£ $^è,£ &^ä è.¼¤ -^ä ø.¤¤ 2^ä /h¤ >^è¤ Y^é¥ d^è(¦ ƒ^ä H/”¦ …^ä X/„¦ œ^èT¦ Ÿ^è § ¦^ä ˆ/L§ «^è(§ °^èȧ »^ä ¸/l¨ À^ä È/8¨ Ë^è¨ Ú^äè/© è ø/ä¨ å^ę̀ ð^ä 0ˆ© õ^ä (0p© _èT© _äH0᪠_謩 ì0ª _äx0¸ª è ˆ0|ª _èTª -_èìª /_踫 :_ä È0Ô¬ @_ä Ø0¸¬ L_ä è0t¬ __è\¬ e_è$­ u_ä 1°­ Š_èX­ `ä81(® ìø­ !`耮 #`ä h1H¯ /`ä x1(¯ 1`èÔ® <`èl¯ [`èì¯ r`ä ¸1t° y`ä È1@° ¿`è° Â`ä è1P± È`ä ø14± Ê`è´° ç`ä 2ܱ ò`舱 õ`ä 82p² aèü± a舲 >aä h2$³ Iaä x2³ Vaè¼² iaä ˜2à³ raä ¨2¼³ ~a蔳 €aä È2œ´ ÿaä Ø2`´ bä è2H´ bè´ bèÀ´ "bèpµ $bä (3¶ lbèܵ nbä H3`¶ bèH¶ ˜b茶 Ÿbè · ¤bä ˆ3¨· °bè„· »bä ¨3¸ Ñbèð· ïbè4¸ ôbä Ø3p¹ ÷bä è3P¹ cä ø3ĸ c褸 cä 4ð¹ #cä (4й .cè¹ 5cèXº TcèL» _cä h4ü» hcä x4Ì» jcä ˆ4¬» Ìc耻 âcèX¼ ècèȼ ícä È4,½ ùcäØ4½ ádèì¼ dä ø4X½ dèD½ dä 5¾ dèн .dä 85¤¾ 1dä H5l¾ ídä X5H¾ ðdè0¾ ÷dä x5¿ ùdäˆ5á¿ ûdèྠeä ¨5À¿ Peä ¸5 ¿ \eèT¿ `eä Ø5´À deä è5ØÀ feä ø5\À reä 6<À }eä 6(À €eä (6 À …eèà¿ ˆeä H6`Á ŽeèÁ •eäh6 è x6üÁ šeèäÁ ²eä ˜6œÂ ¾eè| Ãeè8à Îeè¤Ã Ùeä Ø6ìà Ûeè¼Ã áeè¬Ä ìeèÄÄ ðeä 7$Å ûeè Å fä 87èÅ fä H7ÄÅ %fä X7 Å 1fä h7€Å LfèdÅ Wfä ˆ7°Æ qfä ˜7ŒÆ }fèPÆ €fèàÆ ‡fä È7˜Ç ’fä Ø7|Ç –fä è7`Ç ¡fä ø7LÇ ±fè0Ç ½fè,È Üfä (8ÄÈ èfä 88¨È êfä H8€È ìfè`È òfä h8 É gäx8áÉ gèìÈ gä ˜8´É gèœÉ /gèDÊ 6gä È8Ë Jgè¨Ê Xgä è8€Ë Ðgä ø8XË ègè Ë hè´Ë hä (9PÌ hè,Ì hèŒÌ hèøÌ hèÀÍ 'hèHÎ 2hä ˆ9œÎ Chä ˜9|Î EhèdÎ Hhè0Ï Thä È9 Ð Vhä Ø9üÏ hhä è9äÏ ‚hä ø9ÀÏ ¡hèxÏ ÀhèxÐ è (:„Ñ Çhä 8:dÑ ×hè@Ñ Ühä X: Ò âhè8Ò çhè0Ó ñhä ˆ:èÓ iä ˜:´Ó %iä ¨:”Ó 1iä ¸:pÓ =ièXÓ Iiä Ø:`Ô Oiä è:,Ô ZièÔ diä ;hÕ Œiä ;øÔ ¢ièØÔ ­iè°Õ Ìiä H;,Ö ÝièðÕ èiä h;èÖ êiètÖ #jä ˆ;\× .jä ˜; × 5jé× 7jä ¸;TÙ =jä È;äØ Bjä Ø;Ø GjèpØ Rjä ø;äÙ pjä <ÐÙ €jè”Ù …jè8Ú jä <<dÛ “jâ œ L<ìÚ ¾jä \<¨Ú Åjè€Ú Ìjè”Û ×jä Œ<ðÛ âjä œ<ÈÛ kè°Û kâdw ä´Ü Ukä Ð<øÜ tkèÜÜ •kä ð<¸Ý  kè¨Ý ¬kä =„Þ ÉkèpÞ Ìkä 0=øÞ ÎkèÔÞ ÔkèPß Ûkä `=øß âkä p=Ðß îkèŒß ñkèà ókè¤à ùkèÄà lä À= á lèá lä à=ðá lä ð=Ìá #lå >¬á .lä >dá Hlè<á glè8â mlä @>Œâ ylètâ |lä `>Ôâ ˆlè°â lä€>œã è >xã ®lä  >Xã ¹lèã Ílèä ×lä Ð>Ää Ýlä à>ä älä ð>\ä ÷lè<ä mä ?|å mä ?,å 'mä 0?å .mä@?áå 9mèàä ;mä `?´å Amè”å Fmä €?üå emèàå smèæ umä °?¨æ ¥mä À?Læ °mè4æ ²mèìæ ´mè0ç ¿må @è Êmä @Èç Ïmä @œç nä 0@|ç 6nèPç Mnè,è lnä `@°è nnä p@|è ynè`è €nä @¬é ƒnä  @”é ‡nè|é ”nä À@Pê ¡nä Ð@8ê ¬nä à@ê ±nèøé µnè”ê ¼nä Aˆë Ïnèhë Únä 0A¸ì Ýnä @A˜ì ßnèì ënä `Aèì ínèÐì áoè”í oä APî oèî oä °Aðî oä ÀAÔî 'oä ÔA¼î 1oâÄÊäA˜î Roètî qoä BHï xoä B8ï zoè ï oè€ð ƒoä DB¼ñ Žoä TB˜ñ šoä dB€ñ oéñ ©oèÜñ Èoä ”BŒò Ôoèpò Ûoä ´Bó âoäÄBáó éoä ÔBàò ðoè°ò pä ôBôó pä CÌó !pä C˜ó @pä $Cpó DpèTó cpä DC”ô ‚pä TC€ô Žpä dCdô œpä tCTô Ÿpä „C@ô ¦pèô ­pä ¤CXõ ²pä ´Cõ ÇpèÐô Òpètõ ÙpèØõ àpä ôCÔö çpä Dö ópä Dpö þpä $DXö qä 4D,ö qèö qä TDÔ÷ qä dD€÷ )qä tDp÷ .qä „D8÷ 5qè÷ tèp BtèH Gtè˜ Jtä ØH Ptä èHh [tèH atè  gtä IØ †tä (I¼ œtè” žtè< è XIœ ¤tèT ©tä xI€ ´tä ˆIl ·tè4 ¹tä ¨I¸ ¿tè  Ïtâ$á¸(åø Ütä àIÄ àtä ðI˜ ãtèt åtèd ýtè„ uä 0JP uè 'uè¼ )uä dJ  ,uâ¬3äô Cuä „J| buèD nuä ¤J´ puè” |uèÌ ‡uè uä äJð ‘uä ôJ¬ uä K˜ Ÿuä Kt ¡uè0 ©uè  ¬uä DK¼ Æuä TK¤ ÍuèL Ôuä tK@ Öuä „K( Ýuä ”Kð äuèÜ ùuä ´Kð vä ÄKØ vèx vä äK$ vè  vä L˜ Pvä Lx \vèð vvä 4L xvä DLô vè¸ ƒvèH ‡vä tLÀ Švè| •vè ´vä ¤L˜ »vèp Ãvä ÄL< âvä ÔL$ ævä äLø ôvèÈ ÿvä M wä Mð wä $M¼ wä 4M˜ wä DM€ *wè\ 1wä dMD 6wè, 8wä„M ìè Wwä ¤Mô Zwä ´M¨ fwä ÄM˜ xwèT ‰wèD wä ôMÔ ‘wè˜ ”wä N  ªwè ­wä 4NØ °wèL ³wä TN ¾wä dN$ Àwèø Ìwä „NÜ îwèÄ áxä ¤ND xä ´N  xèü xèØ xä äN\ (xä ôND 0xè è ìV(> ò}èü= õ}ä W ? ú}ä Wô> ÿ}èÐ> ~èÔ? ~èT@ ~è|@ (~èPA 3~ä |WüA R~èA ]~ä œW°B y~ä¬WtB ì0B |~ä ÌW0C …~ä ÜWèB ’~èÔB ˜~èHC Ÿ~èhC ´~ä XÌC ·~è”C Ã~ä ä ¬[¤Q Bä ¼[|Q MèdQ YèìQ `ä ì[ìR fä ü[„R mä \„ä @`„c f„ä P`dc m„èDc x„ä p`8d —„èd ¯„ä `Xe º„ä  `ðd ¾„ä °`¸d Õ„èd Ü„ä Ð`0f ò„ä à`Ôe ô„ä ð`¼e ÿ„èœe …ä aÌf =…ä a°f H…èf O…ä @ahg Z…ä PaTg e…ä `a4g j…èg u…ä €a$h {…ä a h …ä  aôg ƒ…èÔg †…ä Àa4i ‘…ä ÐaÄh “…ä àaŒh Ÿ…ä ðaph ¥…è@h ¬…èLi è bÀi ´…ä 0b¤i ¶…è„i Â…èj Í…ä `büj Ø…ä pbÄj Ü…è„j é…èPk ï…ètk ö…èøk ý…ä ÀbDl †è$l †è|l †ä ðb4m †èm +†è„m 2†ä cn :†èüm N†ä @cðn m†ä PcÀn {†èœn ~†èào è €c@p ƒ†è,p …†ä  c´p —†èxp ¦†ä ÀcXq «†ä ÐcDq ®†è,q ¶†ä ðcÌq º†å d´q džè€q Άä d¬r Ô†èˆä ôeˆz Mˆä fXz Oˆèz nˆä $f{ ‹ˆè|{ ’ˆä Dfp| ™ˆè| ¥ˆæ¸| ¸ˆä tf`} ƈèì| ɈèÐ} Јä ¤f|~ Ûˆä ´f@~ ‰ä Äf ~ œ‰è~ è äf Ÿ‰èä~ £‰ä g€ ¨‰ä gà ³‰ä $gÀ MŠä 4g aŠèd ‰Šä Tg<€ ›Šè € ´Šä tg ÓŠä „gð€ ߊä ”gØ€ ëŠä ¤gÀ€ òŠä ´gœ€ ÷Šè„€ ýŠäÔg” á‹ä ägh ‹èD ‹èÔ ‹âüäD‚ 쬂 ‹éƒ *‹ä Hh¨ƒ 6‹ä Xh„ƒ M‹è4ƒ O‹ä xh0„ `‹ä ˆh„ f‹èàƒ „‹ä ¨hÀ„ ‹‹è¤„ ‹ä ÈhT… ’‹è… ìÐ… •‹ä øhl† š‹è4† ¦‹ä iȆ ²‹ä (i¬† ¶‹èˆ† ¾‹ä Hiȇ Ä‹ä Xi<‡ Ћä hi(‡ Ø‹è‡ Ý‹âHjá v $ªäè‡ 8Œè<ˆ =Œä ´i<‰ AŒä Äi‰ DŒèìˆ bŒä äi°‰ hŒèp‰ ÈŒä j@Š ÎŒéŠ âŒä $jŠ äŒä 4j|Š øŒè`Š úŒä TjàŠ èÈŠ ä tj‹ èp‹ $èô‹ &ä ¤jPŒ -èŒ 9ä ÌjìŒ Lâ”iˆn ÜjÐŒ ‚ä ìj´Œ …茌 –ä kp µä kT Àè< Ëä ’èt¥ I’ä r$¦ K’èü¥ W’ä (r§ v’èÀ¦ ‚’è(§ „’è„§ £’è´§ ¯’ä xr¼¨ Œ茨 È’è8© Ó’ä ¨rÀ© é’ä ¸r˜© ð’èx© ¬”è<ª Ë”ä èräª Ò”ä ørĪ •ä s¨ª •茪 &•ä (sÀ« +•ä 8sœ« 1•èt« 6•è$¬ ;•ä hs¤¬ G•ä xsˆ¬ T•ä ˆst¬ W•èX¬ \•ä ¨s­ e•èè¬ q•èü­ s•ä ØsH® •è0® †•ä øs ® •舮 •ä tô¯ —•ä (tد ¤•è(¯ ©•è4° È•èP° Ó•ä htİ â•ä xtœ° è•舰 í•è± –ä ¨t´± –ä ¸tœ± \–ä Ètˆ± d–èh± h–ä èt² t–èø± “–ä u¸² ™–蜲 ›–è³ ¢–ä 8u,´ Á–ä Huø³ Ì–ä Xu¸³ ϖ茳 Ô–ä xu¼´ Ö–ä ˆu¨´ ݖ茴 ß–è@µ ä–褵 (—è¶ /—ä Øu,· 9—ä èu· K—ä üuì¶ ~—âà­ vÔ¶ …—è°¶ Œ—ä ,vä· ’—ä Ÿä ÌhÞ @Ÿä ÜPÞ DŸä ì4Þ KŸä üÞ ^ŸèøÝ `Ÿä €dß lŸä ,€<ß nŸä <€$ß pŸèøÞ Ÿèèà •Ÿä l€Há —Ÿè,á ªŸä Œ€ìá ­Ÿè¼á ·Ÿä ¬€¸â ÆŸä ¼€ â ÉŸè€â èŸèðâ óŸä ì€Èã úŸèHã  ä 0ä  èä  ä ,¬ä ! ä <hä ( èPä / ä \xå 4 ä xLå ; â”iÈ¥ ddˆå € èèä … è¨å  ä ¸xæ £ ä ÈTæ © è@æ ´ èç è ø|ç ¹ èDç Ä ä ‚xè É ä (‚àç ΠèÀç Ô èÄè á ä X‚äé ã èÈé ê ä x‚pê ï ä ˆ‚8ê ò èê ø ä ¨‚Ðê ¡è”ê ¡äÈ‚|ë è Ø‚Lë ¡ä è‚ ë (¡èë ,¡èÀë 9¡ä ƒŒí X¡ä (ƒXí Z¡è,í y¡èÌí {¡ä Xƒ¬î ‡¡ä hƒî “¡èî Ÿ¡èÌî ¡¡ä ˜ƒ˜ï «¡è8ï ·¡ä ¸ƒÔï »¡è¼ï Á¡ä ؃Œð Å¡ä èƒtð СèPð Ü¡ä„Pñ á¢ä „ñ ¢èñ ¢èlñ ¢ä P„|ò 8¢âôµl|`„,ò G¢ä p„ò [¢ä€„áò ^¢èàñ a¢è”ò f¢ä °„Hó v¢ä À„$ó ‚¢ä Єó †¢ä à„ôò ˆ¢èØò ¢è ô ‘¢ä …Àô “¢ä …ô •¢ä 0…pô ˜¢èXô ·¢ä P…õ Ï¢èüô Ñ¢ä p…”õ Ö¢èxõ â¢âð*ál_ ä´õ ô¢ä ¨…¨ö ú¢èö (£ä È…üö 7£è¼ö 9£äè…¬÷ è ø…Œ÷ D£èL÷ c£ä †tø n£ä (†\ø u£ä 8†@ø |£ä H†ø ƒ£äX†áø Ž£èØ÷ ™£ä x†œù  £ä ˆ†|ù «£ä ˜†\ù »£è ù $¤ä ¸†,ú *¤èüù 8¤ä ؆û :¤ä è†tû =¤ä ø†(û K¤ä ‡û _¤ä ‡¸ú b¤è¤ú h¤âð*å°û ¤ä L‡€ü ¤ä \‡Pü ›¤ä l‡8ü ¡¤èü ¬¤ä Œ‡ðü ˤèØü Фè´ý ܤä ¼‡þ Þ¤èüý å¤èxþ ê¤ä ô‡ÿ ÷¤â D.åÈþ ¥äˆðÿ è $ˆÀÿ +¥ä 4ˆ¤ÿ 0¥ä Dˆtÿ ;¥è(ÿ @¥ä dˆh F¥èP Q¥ä „ˆ  X¥ä ”ˆˆ ]¥ä ¤ˆd d¥ä ´ˆ j¥èè x¥ä ܈D ™¥âÌ/á<0á ìˆð ³¥èÜ µ¥ä ‰Œ ·¥ä ‰d É¥ä ,‰@ Ô¥ä <‰$ è¥ä L‰  û¥ä \‰¸ þ¥è ¦ä |‰ì #¦èÔ *¦ä œ‰X 6¦è@ =¦ä ¼‰° ?¦èp K¦ä ܉ P¦èì S¦èl U¦ä Š [¦è° ^¦è8 j¦ä <а o¦èœ v¦ä \м ¦è” ±¦ä |Š@ ·¦è ¹¦è  Ħä ¬Šü ЦèÜ Û¦è §ä ÜŠ4 §ä ìŠ !§ä üŠ˜ 6§ä ‹l D§ä ‹L O§è0 Z§ä <‹Ì `§äL‹  è \‹t d§è\ h§ä |‹0 t§è €§ä œ‹8 †§ä ¬‹ Œ§ä ¼‹ ˜§ä Ì‹ô §ä ܋РŸ§è¬ ¾§ä ü‹ ɧä Œä Ô§ä ŒÄ ß§ä ,Œ¬ ë§è” ÷§äLŒ” á¨ä \Œt ¨ä lŒL ¨è$ %¨ä ŒŒØ +¨è´ 7¨ä ¬Œh B¨è  M¨èˆ X¨èà c¨èü q¨ä üŒ´ ‡¨ä t š¨ä ` ¨ä ,8 «¨è ²¨èü º¨ä \\ Ũè4 Ѩä |ä بè¼ ã¨è@ î¨ä ¬\ ©ä ¼@ ©ä Ì( ©è ,©è˜ 3©èä :©ä Ž˜ Y©èx \©è@ ^©ä <Ž  j©ä LŽ u©ä \Žx ©èX ˆ©ä |Ž@ §©ä ŒŽ ³©ä œŽà Á©ä ¬ŽÀ Ì©ä ¼Žœ Ø©ä ÌŽ| ß©ä ÜŽd õ©èH ú©ä üŽŒ ý©èp #ªä Ü *ªä ,´ -ªä<ˆ è \@ 2ªâ̤áP¥á`¥á(¦á l( Mªä | Tªèð Wªè$ bªä ¬ hªä ¼È {ªè° šªä Ü< Ÿªè  ®ªä ü¬ °ªè µªä  ·ªä ,ô ¾ªèØ êä Lè Ȫä \Ì ʪä l´ Õªèx àªä ŒÔ ñªä œ¼ óªä ¬  «è| «ä ÌD &«ä Ü0 1«ä ì 8«ä ü ;«èð J«ä ‘¸ Q«ä ,‘” T«èp _«ä L‘d e«ä \‘L h«ä l‘$ l«ä |‘ü n«èØ u«â¤r ‘  «è| †«è ‹«ä Б| —«èd ™«ä ð‘„ ¤«å ’P ¯«ä ’ Ыä ’ì Û«è¬ Þ«èÐ å«ä P’Ü! í«èœ! ð«ä p’x" ö«èT" ù«ä ’ # ¬ä ¤’Ì" ¬âüäœ" '¬è”# F¬ä Ô’ü# I¬è´# K¬âÌ/á ø’<$ h¬è$ j¬ä “˜$ p¬è€$ s¬ä 8“L% ¬ä H“ì$ …¬è´$ ¬ä h“ô% —¬ä x“Ô% ã¬ä ˆ“¸% é¬ä ˜“˜% í¬èt% ô¬ä ¸“p& ö¬èP& ­ä Ø“Ì& ­ä 蓬& 3­è”& >­è ' @­ä”¨' è (”ˆ' G­èd' f­è( l­èH( z­ä l” ) €­â œ |”á) «­ä Œ”è( ­­èÈ( ´­è4) ¶­èP) ì|) ¹­èh* ¼­èè* ¾­ä ü”(+ Ê­é+ é­èü+ ®èh, ®è”, +®èà, -®èD- L®äl•á. W®ä |•¼- c®ä Œ• - f®èx- y®è. ˜®ä ¼•„. ž®è\. ¡®èÈ. ¦®ä ì•|/ ¬®è\/ ³®èœ/ ¾®ä –|0 Å®é0 Юä <–81 Û®ä L– 1 æ®èì0 í®è`1 ø®èÄ1 ¯è2 &¯èx2 Y¯è3 m¯ä ¼–¬3 q¯èl3 ‡¯ä Ü–Ô4 ’¯è¸4 ±¯ä ü–5 ¸¯ä —$5 ¼¯èø4 Û¯èÜ5 á¯ä <—X6 æ¯è6 í¯èÈ6 ï¯èè6 ÷¯ä |—´7 °ä Œ—˜7 °ä œ—|7 °ä ¬—L7 -°ä ¼—07 2°ä Ì—7 9°è 7 <°ä ì—<8 ?°ä ü— 8 T°èØ7 `°è\8 f°ä ,˜ð8 i°èà8 |°ä L˜Ð9 ~°ä \˜¸9 ‰°ä l˜¤9 Œ°èd9 “°èè9 ž°èh: ¥°è¤: ±°èØ: º°ä ̘(; ¾°èð: ϰèd; Ò°è„; Õ°ä ™ < ô°ä ™0< ÿ°ä ,™< ±èð; ±ä L™d= 3±èÐ< 6±ä l™ì= ;±ä |™°= ?±è˜= A±è > ì|> L±ä ¼™H? S±è(? _±è? a±èä? l±ä ü™˜@ r±èD@ v±èø@ y±ä ,šlA ˜±èXA «±è@B ­±ä \šC »±ä lšìB Ʊä |šÔB ɱè¬B رèœC Þ±ä ¬šôD ê±ä ¼šD ö±ä ÌšxD ²ä ÜšDD ²è D "²ä üš„E B²ä ›DE M²èE O²èÄE U²èàE a²ä L›DF c²ä \› F o²èôE v²ä |›¼F }²è”F ²äœ›àG è ¬›˜G ‘²è|G –²ä Ì› I ™²äÜ›ÌH ìlH ›²ä ü›ìI ²ä œÐI ¢²è¸I ¤²ä 4œàJ ¦²âÄÞ œ» äÄJ Õ²ä TœÌK زä dœLK ã²ä tœ(K å²èüJ ë²èèK ³ä ¤œ M ³èŒL ³ä ÄœäM +³èM 6³ä äœøN :³è°N ?³ä ”O J³ä hO X³ä $HO c³è$O o³ä D$P x³èP z³ä dQ ™³ä tìP  ³èÄP ¯³ä ”„Q γèdQ Õ³ä ´üQ Þ³èàQ ô³ä Ô`R û³è4R ´ä ôHS ´è S ´ä ž8T .´ä $žT :´èøS Y´ä DžàT _´è°T f´ä pžˆV …´â ÄÞ œ» œá €žTV ¥´èàU °´ä  žDW µ´ä °žW á´äÀžôV ì¨V ã´ä àž¤W í´èW ñ´èðW ó´è`X ø´ä ŸÄX -µè˜X /µä @Ÿ$Y 1µèôX 3µä `ŸœY AµäpŸhY ì@Y Lµä ŸˆZ Zµä  Ÿ Z fµèÐY qµä ÀŸ„[ vµä ПL[ xµä àŸ$[ —µä ðŸ[ µå  ìZ £µè¼Z ®µä  È\ ¹µä 0 (\ Àµè\ ßµä P t] þµä ` P] ¶èø\ ¶ä € d^ ,¶èP^ 7¶è„^ :¶ä ° P_ J¶ä À  _ ^¶ä Рä^ f¶äà Ì^ ì¸^ m¶è_ x¶è´_ ‘¶ä ¡0` œ¶èø_ £¶èÀ` ±¶èa ¼¶èTa ¾¶ä p¡Ôa À¶è”a ɶèìa Õ¶ä  ¡(b ß¶éb á¶ä Ì¡Øb ï¶âÌ/á<0áL-á Ü¡¸b -·èœb C·ä ü¡Ðc J·ä ¢´c L·ä ¢\c W·è,c Z·ä <¢ld \·è¼ä à§xv W¼è`v Y¼å ¨dw _¼è0w }¼ä ¨áx œ¼ä 0¨àw §¼ä @¨Èw ²¼è¬w ¾¼ä `¨x μè$x ݼè¨x ü¼ä ¨xy ½ä  ¨4y ½èy ½ä À¨èy %½èœy 0½èz 2½ä ð¨@z 8½è$z D½èŒz F½ä ©\{ L½è<{ O½è”{ V½èè{ m½ä `©à| u½è˜| x½â$á „©~ ½ä ”©ô} ¶½è´} Á½èd~ ʽä Ä©, нä Ô©  ×½èè~ â½ä ô©˜ í½èx ñ½ä ª|€ ü½èð ¾ä 4ªЀ ¾è°€ ¾ä Tª‚ 5¾èx A¾è,‚ H¾è؃ O¾ä ”ªh„ V¾èD„ Z¾è… e¾ä ĪD… q¾è0… }¾ä äª0† ˆ¾ä ôªØ… “¾ä «ˆ… ª¾èh… °¾âÈT(«„† K¿ä 8«h† V¿èP† a¿ä X«,‡ h¿äh«ð† 쬆 ¿ä ˆ«ð‡ œ¿ä ˜«̇ ¨¿ä ¨«´‡ ­¿èŒ‡ ´¿è(ˆ ¹¿äØ«؈ è è«´ˆ ſ蘈 пä ¬@‰ Ò¿è‰ ׿舉 â¿ä 8¬ ‹ î¿äH¬ÌŠ è X¬ŒŠ ú¿è8Š Àä x¬°‹ Àä ˆ¬Œ‹ Àä ˜¬l‹ ÀèD‹ ;Àä ¸¬PŒ @Àä Ȭü‹ ZÀèÔ‹ eÀä è¬( kÀä ø¬øŒ wÀä ­ÔŒ {Àä ­¸Œ †À蔌 ˆÀä 8­Œ ŠÀä H­d ˜Àè@ žÀä h­XŽ ¥Àä x­4Ž ±Àä Œ­Ž ¼Àâ¸äø ÔÀ脎 ÙÀä ¼­` äÀä Ì­< óÀè þÀèô Áä ü­P Áè Áä ®ô %Áä ,®Ô 0Áèœ 7Áä L®€‘ >Áä \®\‘ ]Áè4‘ cÁèä‘ qÁèD’ xÁè°’ Áä ¬®„” „Áä¼®T” è Ì®” ‡Áä Ü®ì“ ‹ÁèÈ“ ‘Áä ü®Ø” “Áä ¯¼” #Â訔 .Âä ,¯,– 0Âä <¯ü• 3Âä L¯ä• BÂä \¯¬• DÂä l¯Œ• FÂèl• LÂä Œ¯8— RÂä œ¯Ì– WÂä ¬¯ – ^Âä ¼¯|– }Âè\– ˆÂä ܯØ— Âè — ’Âä ü¯ܘ ™Âä °¼˜ œÂä °8˜ £Âè ˜ ÇÂä<°™ í™ ÓÂä \°h™ ÚÂèH™ áÂä |°¨™ çÂè”™ íÂä œ°€š ïÂèDš ûÂ蜚 Ã踚 Ãä ܰ¼› 1Ãä ì° › 4Ãè0› GÃä ±„œ NÃè œ RÃä ,± XÃä <±¸œ ZÃè œ aÃâL%á `±„ {ÃèT —ÃèÈ £Ãä ±ž ¯Ãèà »Ãä °±Ÿ ÂÃä À±Èž ÄÃä б„ž åÃä à±dž èÃè<ž øÃå ²\Ÿ Äè<Ÿ %Ää ²P  ;Ää 0²ôŸ GÄ踟 è P²  fÄ耠 rÄèÌ  yÄä „²\¡ €ÄâÜ?ᔲH¡ è ¤²8¡ ŸÄè¡ ¦Ä輡 ¨Ää Ô²t¢ ¯Ää ä²$¢ ²Äè¢ ¹Ää ³ä¢ èÄä ³Ä¢ êÄä $³°¢ ìÄ蘢 óÄä D³h£ öÄä T³X£ ýÄä d³@£ Åè£ Åä „³ä£ .Åè°£ 5Åä ¤³H¤ KÅè$¤ NÅä ijठQÅ訤 \Åä ä³T¥ bÅèü¤ dÅè¥ oÅèÜ¥ ŽÅä $´„¦ •Åä 4´t¦ ¡Åä D´X¦ ¨Åè0¦ »Åä d´§ ÁÅät´á§ ÍÅä „´Ц ÙÅè´¦ äÅä ¤´”§ ëÅè4§ ïÅäĴᨠúÅè´§ üÅä ä´X¨ Æè$¨ Æä µœ¨ Æè„¨ Æä $µœ© #Æä 4µP© .Æä Dµ4© 5Æèð¨ <Æä dµ,ª ?Æä tµô© ^Æè¼© eÆä ”µ°ª „Æä ¤µ„ª †Æä ´µlª ’ÆèLª ™Æè« ŸÆä äµx« ªÆä ôµH« °Æè,« ¶Æä¶t¬ è $¶ ¬ ¸ÆèÜ« è D¶­ ¾Æä T¶è¬ ÃÆä ¶Ь ÊÆ â °d<Ø×Ì/á<0á"|@¬Ûn¬®È5dS ¶¸¬ Ç蔬 Çä À¶® Çä жÀ­ 'Çä ඤ­ .Çèp­ BÇè4® GÇä·,¯ ì® SÇèX¯ ^Çä @·° dÇä P·ܯ xÇèį „Çä p· ° ‹Çèh° —Çä ”·ı ¢ÇâÜ?á ¤·°± ÛÇä ´·|± âÇä Ä·`± ùÇäÔ·± áÈä ä·Ô° Èè¼° Èä ¸(² Èè² ÈèȲ ?Èèô² MÈèT³ TÈ舳 jÈèô³ qÈä t¸Œ´ wÈä „¸l´ ˆÈä ”¸8´ §Èè´ ³Èä ´¸pµ ¹Èä ĸPµ ÄÈä Ô¸0µ ÐÈä 丵 ÓÈä ô¸è´ ÙÈä ¹Ì´ àÈ訴 éÈä $¹œµ íÈ茵 òÈâÌ/á H¹¼¶ ZÉä X¹¶ fÉèäµ iÉèð¶ lÉä ˆ¹ · ‡Éèp· Éèè· šÉ â °d<Ø×Ì/á<0á"|@¬Ûn¬®È5dSä¹ĸ ÙÉä ô¹¤¸ ìÉèt¸ ñÉä ºH¹ øÉä$º¹ è 4ºø¸ ûÉèภ6Êä Tº|¹ 9Êèd¹ @Êâð*á xº|º cÊä ˆºXº oÊä ˜º(º {Êä ¨ºº ¡ÊèÔ¹ Ë謺 Ëä Øº» Ëèèº ZËä øº¤» dË耻 ì¼ oËä (» ½ zËèļ Ëä H»|½ –Ëä X»\½ £ËèD½ ªËèô½ èËä ˆ»ľ êËä ˜» ¾ Ìä ¨»„¾ -ÌèT¾ @Ìä È» ¿ FÌä Ø» ¿ RÌèì¾ ^Ìä ø»À dÌä ¼ð¿ fÌä ¼п •Ìè°¿ œÌä 8¼¬À §Ìä H¼XÀ ¹Ìè<À ¿Ìä h¼¬Á ÄÌä x¼@Á ÐÌä ˆ¼ Á èÌèÁ ôÌèÐÁ ÿÌä ¸¼( ÍèìÁ ÍèD Íä è¼Xà Íä ø¼¨Â Íä ½ Íè| WÍä (½äà ZÍä 8½Ìà eÍä H½´Ã lÍä X½à nÍèxà yÍä x½˜Ä ~Íä ˆ½PÄ „Íè(Ä ‹ÍèÌÄ ì´Å •ÍèìÅ ­Íä Ø½|Æ ¸Íä è½XÆ ºÍè0Æ ÅÍä ¾dÇ ÛÍèPÇ êÍè|Ç öÍä 8¾¸È üÍä H¾PÈ þÍä X¾,È Îä h¾ È $ÎèøÇ /Îä ˆ¾8É 1Îä ˜¾ðÈ KÎèÌÈ kÎè˜É ~Îä Ⱦ`Ê –Îä Ø¾Ê ¢ÎèðÉ ¨Îè¤Ê ³ÎèpË ¸Îä ¿ Ì »Îä (¿TÌ ÆÎä 8¿ Ì ÈÎä T¿ðË ÎÎâ 8ðä¿ ”zäÌË èÎè Í ïÎè0Í ôÎä ”¿LÎ ûÎè,Î Ïè¤Î !Ïä Ä¿8Ï $Ïè Ï *ÏèôÏ 9Ïä ô¿ÌÐ ]Ïä À¤Ð }Ïè`Ð ‚Ïä $ÀTÑ „Ïä 4À@Ñ ÏèÑ ‘Ïä TÀ¨Ñ —Ïä dÀˆÑ ¢ÏèpÑ è „À(Ò ´ÏèÒ ÇÏä¤À„Ò ìDÒ ÍÏä ÄÀäÒ ÔÏèÈÒ çÏä äÀpÓ êÏè<Ó íÏä Á\Ô òÏä Á,Ô ÷Ïä $ÁÔ þÏä 4ÁüÓ ÐèØÓ Ðè¨Ô "ÐèàÔ )Ðä xÁ¼Õ 0ÐâÜ?á ˆÁtÕ EÐè\Õ QÐä ¨ÁðÖ WÐä ¸Á\Ö ^ÐèDÖ aÐä ØÁX× dÐè,× oÐèŒ× zÐä Â¸Ø ƒÐä ÂpØ ‘Ðä (ÂDØ °Ðä <Â(Ø ¶Ðâ/åØ ÂÐä \ÂøØ ÉÐèàØ èÐä |¤٠óÐä ŒÂˆÙ õÐèdÙ Ñä ¬ÂÚ Ñä ¼ÂøÙ ÑèÌÙ )Ñä ÜÂˆÚ HÑä ìÂlÚ JÑèPÚ [Ñä ÃôÚ mÑè¤Ú xÑâÍá 0Ã Ü ‚Ñä @Ã¤Û Ñä PÃ€Û ”Ñä `ÃdÛ ™Ñè<Û ›ÑèLÜ ÑèøÜ ŸÑèXÝ £Ñä °ÃœÝ ¯Ñè|Ý »ÑèÐÝ ÂÑè0Þ ÄÑä ðÃß íÑè¤Þ ïÑä Ä¤ß öÑè|ß ûÑä 0Äxà Òä @ÄXà Òèôß ÒâHÆàÅhÄÐà 'Òè¸à 3Òä ˆÄˆá ?Òä ˜Ätá BÒä ¨Ä@á MÒèá PÒè¸á pÒèôá xÒä èÄ â ~ÒèŒâ €Òè@ã ƒÒä Űã Òä (ÅŒã  Òètã ¿Òè ä ÆÒä XÅTå ÌÒä hÅ0å ØÒèèä ãÒä ˆÅüå ûÒä ˜Å¤å Óèpå è ¸ÅÐæ Óè„æ Óèç Óèç Óä øÅ è Óä Æèç 9Óä Æ¬ç RÓètç è8Æáé TÓä HÆèè `Óä XÆœè ~Óèdè ‰Óä xÆPé ”Óè,é œÓä˜Æáê ªÓä ¨ÆŒé ®Óèhé ±ÓäÈÆ4ê ìê ¶Óä èÆ˜ê ÄÓäøÆdê ìHê ÈÓè(ë ÊÓè˜ë ÕÓä 8Çí ÜÓä HÇÀì ñÓä XÇ”ì õÓä hÇhì 9Ôä xÇ<ì @Ôä ˆÇ$ì eÔä ˜Çì iÔä ¨Çìë uÔä ¸ÇÄë ”Ôè¬ë šÔè í œÔä èÇ$î »Ôä øÇî ¾Ôä ÈØí ÎÔä ȸí ÜÔä (È|í ãÔè`í õÔä HÈÄî úÔä XÈœî Õètî ÕäxÈlï ì@ï ÕèÐï !Õä ¨ÈLð %Õä ¸È,ð 1Õèð 4Õä ØÈXñ :Õä èÈ0ñ NÕèøð PÕä É€ò VÕä ÉLò eÕè ò è 8ÉÌò pÕä LÉ´ò uÕâtl ä˜ò ˆÕä lÉpó ‹Õèôò –ÕèÜó µÕä œÉhô ÃÕä ¬É<ô ÒÕä ¼É ô ÞÕèô ðÕèÄô óÕèøô ÿÕè¸õ Öä ÊPö Öè0ö Öä,Êá÷ ÖèÄö Öä LÊDø #Öä \Êà÷ .Öè”÷ :Öä |Êìø AÖä ŒÊ¬ø MÖè€ø ^Öä ¬ÊLù dÖèù ÁÖèüù àÖä ÜÊHú ìÖè ú úÖäüÊ4û á×ä Ëû ×äËáû #×èÜú *×èPû 1×è¬ü 6×èÔü 9×ä lËäý D×ä |ËXý O×è<ý Z×ä œË8ÿ a×ä ¬Ë¼þ c×è`þ n×ä Ì˰ÿ q×ä ÜË”ÿ x×è\ÿ ×ä üËÄ …×ä Ì„ ‡×èd “×ä ,Ì´ ž×ä <Ì ª×èø É×ä \Ì  Ï×èL Ñ×ä |Ì ××èÄ Ù×ä ¤Ì¼ à×âÄÞ œ» ä0 Øä ÌÌ, Øâð*ál_ ÜÌô ØèØ +Øä üÌœ 2Øä Íd <Øè@ HØèÄ KØä <Í< MØè( XØâð*ál_ dͼ jØèl lØä „ÍT |Øä ”Í8 ~Øä ¤Í …Øä ¼ÍÔ žØâð*ál_ Ìͬ °Øèˆ ½Øèt ÃØè ÅØä Î$ ãØâð*ál_ $Î  õØèð úØä DÎÄ Ùè° %Ùä dÎ /ÙèÜ :Ùä „ÎÈ GÙä ”Î¬ RÙä ¤Îˆ YÙèd xÙä ÄÎh ~Ùä ÔÎH ‰Ùä äÎ ”Ùèì ŸÙè, ¥Ùè\ §Ùä $Ïà ²ÙèÈ ´Ùä DÏ” »Ùä TÏp ÆÙè8 ÚÙä tÏD åÙèÔ éÙä ”Ï° ôÙè` è´Ïá öÙä ÄÏè ùÙèÐ Úè$ Úè” Úè Úä Ш Úä $ÐŒ "Úä 4Ðl %Úè8 ,Úä TÐ 0Úä dÐð 2ÚèØ 4Úä „Ðˆ <Úèh GÚä ¤Ð PÚä ´Ðø RÚä ÄÐÜ TÚè¨ jÚä äÐ  ‰Úä ôÐ •Úè, ·ÚèŒ è$Ñì è 4Ѱ »Úä DÑŒ ¾Úä TÑ` ÀÚä dÑ< ÓÚè ÖÚä „Ñx ÜÚè4 êÚè ïÚä ´Ñè ñÚä ÄÑÐ Ûè´ Ûä äÑx Ûä ôÑ$ *Ûè  6Ûä Òä BÛä $ÒÐ EÛè˜ PÛä DÒ< RÛé YÛädÒh ètÒX è „Ò  _Ûèü ~Ûè˜ „Ûä ´Òü “Ûä ÄÒœ žÛä ÔÒ\ ¡Ûä äÒ@ ¥Ûä ôÒ °Ûèô ·Ûèh ÅÛè´ ì< ÌÛèh ÎÛè| ØÛè  äÛä tÓH èÛè$ Üä ”Ó< Üä ¤Óè Üä ´Ó´ Üä ÄÓœ Üä ÔÓ„ Üèl Üä ôÓ .ÜèX PÜä ÔÄ ^Üè° eÜä 4Ô iÜè uÜè” yÜä dÔ …Üä tÔl ˆÜä „ÔT Üä ”Ô Üä ¤Ô ©Üèð µÜä ÄÔì ¸ÜèÔ ÊÜä äÔ,! ÖÜä ôÔ! áÜèø òÜä Õ€! þÜèP! áÝä 4Õì! Ýä DÕÌ! Ýä TÕ´! Ýèœ! "Ýä tÕÔ" .Ýä „Õ¤" 1ÝèP" è ¤ÕP# =Ýä ´Õ4# IÝè# NÝè°# SÝè$$ _Ýèˆ$ ~Ýä Öð$ ‡ÝèØ$ ‰Ýä $Ö¬% ŽÝä 4Ö\% ²Ýä DÖD% ÓÝè% òÝä dÖ& úÝä tÖä% ÞèÄ% Þä ”Ö & %Þè€& DÞä ´Ö ' IÞèø& ^Þä ÔÖˆ' eÞä äÖ\' oÞè<' qÞèÜ' sÞè¬( ’ÞèÜ( ˜Þä 4×8) ¤Þè ) ÑÞä T×x) ØÞèT) áÞä t× * æÞèè) êÞèŒ* ñÞä ¤×4+ õÞä ´×ü* ùÞä Ä×Ð* üÞè¤* ;ßä ä×+ qßèX+ tßèä+ ßßä ØP, áßè4, íßä 4Ø- ôßäDØô, áàè¼, àâä¿ X=¸4Lc tØ„- šàä „Ø`- ¦àè<- Åàä ¤Ø. Çàä ´ØÐ- Êàè¸- Ìàä ÔØ . Øàä äØ\. ãàè8. ïàèè. úàèl/ ýàä $Ù0 áä 4ÙÜ/ áè´/ áä TÙ˜0 +áä dÙx0 .áèX0 4áè1 ?áä ”Ùà1 Dáä¤Ù¼1 ì`1 FáäÄÙÐ2 è ÔÙ¸2 Káä äÙœ2 Máä ôÙ„2 Páä Ú`2 Táè42 Záä $Ú¼3 `áä4Ú„3 ìd3 láä TÚl4 táä dÚL4 ˆáä tÚ44 ‹áè4 ’áèŒ4 •áä ¤Ú45 ¯áä ´Ú 5 »áä ÄÚð4 ÿáä ÔÚÌ4 âè¸4 +âä ôÚ˜5 .âä Û„5 :âä Ûd5 LâèP5 Sâä4ÛH6 è DÛà5 VâèÀ5 uâè˜6 ”âä tÛ<7  âä ˆÛ$7 ¥ââP&á ˜Û7 Òâè´6 è¸Û°7 è ÈÛˆ7 Öâèl7 Øâä èÛ\8 Ûâä øÛ8 ëâèà7 ñâä ÜÐ8 øâè¬8 üâä 8Üä9 ãä HÜp9 ãèü8 >ãä hÜü: Aãä xÜd: HãèH: Jãâ ¸œÜì; è ¬ÜÈ; [ãä ¼Ü°; bãèx; è Üܘ= jãä ìÜP= nãä üÜ= ãèô<  ãä Ý8> ¦ãä ,Ý> ±ãä<Ýá> ³ãèà= µãä \ÝÔ> ¼ãälÝÀ> è|ݘ> ìx> ¿ãä œÝ¤? Ôãä ¬Ý? àãèø> ããä ÌÝ @ éãä ÜÝø? ðãèÜ? þãä üÝ„@ ää Þl@ äâôµl|äL@ *äèœ@ 0ää DÞô@ 5äèØ@ @ää dÞìA NäèÔA ^ää „Þ¬B eää ”ÞŒB jää ¤ÞtB uää ´Þ`B …äè@B Œää ÔÞ C «ää äÞC ¶äèèB Áää ߨC ÅäèpC Ñää $ß4D áää 4ßD íää DßD øää TßèC åèÀC åä tßE (åä „ßØD +åè¼D Gåât ¨ß¸E Uåä¸ß E ì„E Wåä ØßŒF Zåä èß(F fåä øß F qåèðE {åèäF ~åä (à”G Šåè`G è HàÌG –åè¬G ¯åä hàXH ´åä xà$H ¶åèH ½åä ˜ààH Üåä ¨àÀH çåä ¸à¤H óåä ÈàŒH úåètH æäèà”I è øà€I æèDI æèäI æä (áPK ?æè,K Yæä HáÜK [æä XáœK cæèxK ‚æèüK …æäˆáœL ì\L ”æä ¨á„M Ÿæä ¸á,M ¦æèM °æâ œ ÜáXN Ëæä ìáóèpˆ è Lñ¼‰ Eóä \ñ ‰ Hóèh‰ Oóè,Š QóèhŠ Vóä œñT‹ bóä ¬ñ‹ lóä ¼ñèŠ ›ó謊 Ÿóèè‹ ²óä ìñdŒ ¶óè$Œ ºóèÐŒ ¼óèh Çóä ,ò´ Òóè€ Ùóä Lò0Ž øóèì ôèhŽ ô脎 ôèL ôä œò ôä ¬òø %ôä ¼òà 9ôä ÌòÈ Eôè´ Qôè€ Vôä üò˜‘ [ôä óL‘ è ó,‘ ]ôä 0ó‘ rôâ¸$á @óô ôèÌ ôä`óT’ è pó<’ Œôè$’ Ÿôä ó ’ ¦ôè„’ ­ôä °ó€“ ¯ôä Àód“ ±ôä ÐóH“ ¼ôè0“ ÀôèÈ“ Öôè” æôä ôÔ” íôä ô¸” ïô蘔 ûôè$• õä PôÜ• `õä `ôÀ• sõä pô • yõ茕 õä ôÀ– “õä  ô¤– Ÿõä °ôx– ¡õä ÀôP– §õè,– ­õèØ– ¸õä ðô¼— »õå õ¨— Üõä õ„— îõä õh— ôõèD— ûõä @õt˜ ýõè˜ öèИ öäpõÄ™ è €õˆ™ öä õP™ öè™ 5öä °õ$› 7öä Äõ › 9öâ|,á Ôõèš nö蜚 ‡öè@› ‘öä öˆ› öèX›  öä $ö€œ §öè4œ ²öä Dö𜠵öä TöØœ ÔöèÀœ Ùöä töh àöä „öH ëöè0 á÷èdž ÷èО ÷è\Ÿ ÷ä Ôö@  .÷è  >÷è„  J÷è<¡ N÷ä ÷¢ T÷ä $÷Œ¡ n÷èl¡ y÷ä D÷”¢ ‚÷è\¢ ÷è0£ ”÷蜣 –÷ä „÷(¤ ÷è¤ à÷蜤 ë÷ä ´÷ ¥ ÷÷ä Ä÷Ф )øè¼¤ <øä ä÷è¥ Aøä ô÷´¥ Qøä øˆ¥ Wøèl¥ ]øä $ø€¦ _øä 4ø0¦ aøè¦ høèЦ nøâÜ?á hø`§ €øä xøD§ ˜øèø¦ £øä ˜ø$¨ ¬øé¨ ±øä ¸øì¨ ³øä Èø¤¨ çøä Øø€¨ éøèX¨ ùä øø„© ùä ù`© "ùè<© Aùä (ùxª Hùä 8ùXª Lùè@ª ì « cùä lùà« eùâtl äÀ« rùèଠ‘ùè­ —ùä ¬ùL® ±ùä ¼ù0® ³ùè ® ¹ùä Üùì® ¿ùè¼® Ëùä üùä¯ Öùä úЯ Ýùä ú¨¯ âù茯 èùè4° êùä Lú¼° ú褰 úèè° úèH± `úèà± •úèø± žúä¬úœ² ì$² ¦úä Ìúø² ¨úä Üúä² ´úè̲ ¿úä üúij Æúä û€³ è ûd³ Èúä ,û<³ Íúè(³ Óúä Lûˆ´ Õúä \û(´ êúä lû´ íúèô³ úúä Œûxµ ûä œû´´ ûè ´ ûèøµ )ûä ÌûÀ¶ +ûä ÜûŒ¶ ?ûä ìûl¶ DûèX¶ Fûä üü¶ ZûâPMð*áÌ)äà¶ •ûèX·  ûè0¸ §ûä Xü¸¸ »ûä hü˜¸ ÿûä xüx¸ üèP¸ ìx¹ üä ¨ü<º üä ¸üð¹ üè°¹ 2üèlº Qüä èü» eüä øüøº qüä ýÔº }ü謺 è (ý€» „üä 8ýh» ‹üè4» —üä XýŒ¼ ¶üä hý@¼ ½üä xý¼ Èüä ˆýè» Íüè¼» Ùüä ¨ý€½ åüä ¸ýd½ ðüä Èý½ ÷üäØýá½ ýèؼ ýä øý¾ >ýä þ¾ @ýèä½ FýèÔ¾ Lýä 8þ$À Rýä Hþà¿ cý訿 fýä hþÄÀ …ýä xþ¬À ‘ýèhÀ ýä˜þ¸Á è ¨þ˜Á £ýä ¸þxÁ ´ýèÁ ôýä ØþD ÿýä èþ$ þä üþ þâP&åìÁ =þä ÿà Cþä ,ÿÀ Yþè¤Â mþä Lÿ¼Ã tþä \ÿ Ã ‰þèHà ”þä |ÿ8Ä –þä ŒÿÄ ™þèÔà  þä ¬ÿ°Ä °þä ¼ÿ”Ä µþèlÄ ¹þèÄÄ ¾þâD(å$Å Ýþè°Å õþèÔÅ ÿä „Æ ÿèLÆ ÿè$Ç 8ÿèôÇ >ÿä ``É Iÿä p É Lÿä €ÌÈ cÿä €È nÿè4È zÿè|É èÀ„Ê è ÐPÊ ™ÿä à<Ê ¤ÿä ð$Ê ¦ÿèÈÉ «ÿä Ë °ÿä èÊ ·ÿä 0ÌÊ ¼ÿè¬Ê ¾ÿä PHË Åÿè(Ë ÐÿèÌ Õÿä €ÀÌ Üÿè¤Ì ÞÿèØÌ àÿä °¸Í ëÿä À˜Í è4Í Iä à Î Tä ð$Î Vä Î XâP&åðÍ zä $ Ï |èôÎ ‡èÏ ‘ä T,Ð “ä düÏ žèàÏ ÆèdÐ Ëä ”¨Ñ áä ¤Ñ íä ´xÑ ùä Ä\Ñ þä Ô<Ñ ä äøÐ ä ôÔÐ 3è¬Ð 6ä DÒ @ä $Ò Bä 4üÑ FèÈÑ IèxÒ Pä d,Ó iè Ó xèÓ |ä ”€Ô €ä ¤LÔ „èÔ ˜ä Ä0Õ Ÿä ØÕ ¢â œ ä´Ô ÍèPÕ ÏèpÕ Öä 8Ö ää (ðÕ ïè¬Õ CèxÖ IèH× Kèx× Rä xØ Yèø× `ä ˜äØ fä ¨ÀØ rè Ø xè$Ù }ä Ø¼Ù ä èpÙ …è<Ù ‡ä ôÙ èØÙ §èœÚ ·èPÛ Îä H0Ü Òä XÌÛ Þè”Û êä x€Ü ñèdÜ óä˜XÝ è ¨8Ý ä ¸àÜ è¸Ü è Þ (è„Þ 3ä ø ß 6ä €ß Bä `ß Iä (@ß Kä 8$ß WäHáß bèèÞ ä lXà âÜ?á |à ¡ä Œøß ¨èÐß «ä ¬|á ­ä ¼á ¸ä Ìðà Ãä ÜÐà Êä ì¨à Öèˆà õä @â ä üá èÄá è„â 8ä Ldã >ä \,ã JèÄâ Lä |¨ã Rè|ã Xè¸ä bä ¬På uä ¼å èüä  ä Ü8æ ¦ä ì æ ­ä ü´å Âèœå Òä „æ Ôä ,pæ ßèPæ áä Lç ìèÄæ òèDç úä |”ç þètç äœxè è ¬ è éè -èé /è¨é :ä ìœê Fä ü„ê Hä `ê SèÀé rä, ë ìÈê ‘ä L ¤ë —èDë šä l (ì  ä | ì µä Œ üë ¼è¸ë Ãè„ì Óä ¼ ðì Öè¬ì æè í üä ì ˜í èhí &èÜí *ä  Üî 3èÀî 9ä <  ï Méï Sèlï ^ä l ð jä | Ðï mè°ï pä œ °ð {ä ¬ lð €èLð ì0ñ Ÿä ä $ò ¦âÔYálÝô üñ Öä  äñ áä  ¬ñ ìèpñ òâÄ;á 8 tó ÷ä H \ó ä X Ðò ä h ¨ò è˜ò ä ˆ Èó #ä ˜ °ó *èŒó 6ä ¸ \ô AèDô Hä Ø ¸ô Mä è „ô Oèpô Vä  |õ ZèDõ ]ä ( ö dä 8 Øõ wè°õ –è4ö œä h ôö ¤èàö ·ä ˆ ø ¹ä ˜ Ø÷ Äè´÷ Êèhø ÌèÈø ×èlù ÙèÀù ää ø $ú çèøù óè¸ú ùä ( û ûä 8 ðú LèÐú NèÜû Uä h œü `ä x tü lä ˆ \ü wèü zèÌü ™ä ¸ ý žä È Hý ªèý ­ä è lþ ´ä ø $þ Àä þ Ëä èý ÐèÀý Öä 8Dÿ áä H$ÿ éä Xüþ  èÄþ  ä xðÿ  ä ˆÌÿ ) ä ˜´ÿ ‹ è”ÿ — ä ¸4 ª è ¬ ä ØÈ ® ä è° ² è˜ µ èè Á è8 à ä ( å ä 8Ð ì è¨ ö è  ø èÄ  èT 0 ä ˆx 2 ä ˜Ø 6 èœ < èð B èü ìL M è$ X èd d ä à o ä Ì q è¸ s ä 8” x ä Hx z è8 ä h4 š ä x œ èä £ ä ˜T ª èÄ ­ ä ¸˜ ° èx · ä Ø” ½ ä è` È è Ë ä  Ö èì Ú ä (| à ä 8X ë è@ ò ä Xø ý ä hÜ  èÀ  èH  ä ˜8 % èÈ ( ä ¸l . ä È 9 èÜ < ä èT C ä ø@ O ä ð T ä ° _ èˆ e ä 8 p ä H¼ { ä X˜ } è€ „ ä x¤ † èŒ ‘ ä ˜¬ ˜ ä ¨d £ ä ¸L ¦ ä È, ² èð ¹ ä èp ¾ ä ø, à ä  Î ä Ü Õ èÄ Ú è¬ ñ ä H   èl  ä hD  ä x, " è ) ä ˜” 6 ä¨L è ¸ C èø I è€ h è¼ n è¼ èD š ä Ð ¯ ä ,° ¼ â¨a<” Ë èl Ý ä \< ã è ð ä |x  ä Œ8  ä œ$ & è  1 ä ¼¸ 4 èœ 9 ä Ü” E ä ì` \ ä ü8 a è è Ä g ä ,¤ s ä<x ìÈ w èì … ä lì ‡ ä |¼ Œ ä Œœ Ž ä œ„ • ä ¬l œ èP ¡ ä ̬ ¨ ä Ü ® è µ ä üX! · ä @! Á ä ! Ö èä Ù èˆ! ß è ! ô ä\<" è l" èä! (äŒ# è œÜ" Gä ¬È" \ä ¼¬" ^è" jä Üô# ä ìÜ# ¢ä üœ# ·ä t# ÖèH# Üä,´$ è <$ áä Lx$ èèD$ ýä l% èø$ èT% +ä œ`& 6ä ¬D& Kä ¼$& Vä Ìô% aèÜ% lä ìü& nä üä& pèÄ& …è ' ˆä , ' •èH'  è( ¢ä \¸) ¶ä l”) Âä |@) Òä ŒÜ( çè¼( ìä ¬T* îè* ùè°* ä ÜX+ ä ì+ +ä üô* 7èÐ* >ä , Iâ0ìá 0¤+ fèˆ+ hè8, jä `à, lä p¤, xä €„, èd, ‚è- ˆä °”- “ä Àx- ŸèP- ¾è¨- Äè¼- Ëå <. áä . æé. éä 0ô. ïä @Ü. ûäP . áä `x. è\. 'ä €T/ )è Òâ0ìáØŸ ˜4> ä ¨> <èì= [ä È´> iè”> uä èT? {è8? †ä <@ —ä  @ ¢ä (@ ¨ä 8ð? «èØ? ®ä Xè@ ¹ä h¼@ Àä x@ ßèt@ åä ˜¨A çèxA ïä ¸lB ä È@B è,B Oä ì8C Tâpé ü C ‡ä C ŽèÌB •ä , ¤C œä < ˆC äè`C ëè€D ñèPE ä„ áF âÄÀ ´ÚälE {è F }ä ´ (G €ä Ä ôF ‡ä Ô ÜF Žä ä ÄF ä ô œF “è|F ™ä!H è $!ÌG ä 4!€G  èhG «è0H ­ä d!ØH ´ä t!¸H ¶ä „!¤H Àä ”!H ÇèlH Éä ´!dI Ïä Ä!HI Òè I Ôää!ÈI è ô!¤I ÚèI !ä "$J )èJ 4è@J FèpJ UäT"¬K è d"lK Zä t"XK iä „"0K }èK ˆä ¤"L ŠèìK ä Ä"ÈL °ä Ô"xL »èèdO Lä Ô#„P PèLP è ô#ÀP Rè P eèTQ hä $$èQ tèpQ ä D$üR ƒä T$ÔR ä d$œR ›ètR ¢ä „$DS ¨è S ³è|T ÒèœT Ýä Ä$ðT àèÄT è ä$XU úä ô$@U èU èU ä $%´V 4ä 4%XV 6ä D%@V =èV IèÌV Oä t%W QèüV ¦èhW ½ä ¤%ðW Ôä ´%¬W âèˆW æè,X èä ä% Y üä ô%ÐX þè´X è\Y ä (&üY âÜ?á 8&ÐY %ä L&¬Y 'âD(å€Y Gäl&|Z ì,Z iè¨Z “ä œ&X[ žèD[ ¶ä ¼&¬[ ¸èx[ ¼ä Ü&l\ ¾èà[ Êä ü&X] Þè(] òèÄ] ä ,' ^ ä <'\^ ä L'@^ è^ èð^ 7ä |'Œ_ 9ä ¼'t_ M â.´šÈê€BPDl/01è0ø2l2¤3|304äP_ ä Ü'` ¨èô_ ¯ä ü'` Åè|` ùä (ì` ûè´` áä <(Ða èta è4b !ä l(Ôb ,èLb 7ä Œ(è„l Jä +Tm Mèm Sâؽ@+ìm aèÄm cä `+@n nè(n zä €+Än |èœn ƒä  +Po Šèo •ä À+äo ©ä Ð+Ào °ä à+ o ¼èxo Ûè

áµ ‹,èÜ´ ‘,èL¶ š,è°¶ œ,ä D>d· ¤,è· ¨,ä d>(¸ ³,è¸ Â,ä „>„¸ Í,è`¸ Ù,ä ¤>ð¸ Û,ä ´>¼¸ í,蜸 -äÔ>8¹ ì ¹ -ä ô>ø¹ -ä ?´¹ /-蘹 U-ä $?¼º X-ä 4?º _-ä D?lº j-è,º „-èD» -ä t?ì» —-ä „?°» ›-è”» ¦-ä ¤?Ô¼ Å-ä ´?x¼ È-ä Ä?h¼ Ê-ä Ô?P¼ Ñ-ä ä?(¼ Ó-è¼ ò-ä @(½ .èì¼ .ä $@ܽ .èÀ½ .è$¾ .è|¾ $.ä d@,¿ &.ä t@ܾ -.èÀ¾ 8.èD¿ :.ä ¤@ ¿ E.èx¿ Q.ä Ä@|À _.ä Ô@\À a.èÀ h.ä ô@ÄÀ y.è¬À „.è4Á ‡.ä $A  ’.ä4AäÁ ìŒÁ –.ä TAd œ.èD ¬.èÄ ³.ä „A8à µ.ä ”Aà ¸.èü º.ä ´AŒÃ Æ.èlà Ñ.ä ÔA<Ä ×.èÄ ã.èlÄ ù.èØÄ J/ä BœÅ V/ä $B|Å Z/ä 4BLÅ ³/ä DB4Å µ/èüÄ À/è¼Å Æ/ä tB@Æ Ì/ä „B(Æ Ø/è Æ Ú/èÀÆ ù/èôÆ 0ä ÄB¸Ç 0ä ÔBlÇ $0ä äBTÇ 80ä ôB,Ç ?0è Ç ^0ä C È c0ä $CôÇ j0èÔÇ l0è@È n0äTCØÈ ìœÈ t0ä tCDÉ z0ä „C,É †0èÉ ‰0è„É •0ä ´CØÉ  0è´É ¬0ä ÔClÊ Ä0ä äCPÊ Ð0è0Ê ã0ä D´Ê õ0èœÊ á1ä $DˆË 1èøÊ 1ä DDÌ >1èìË E1ädDPÍ è tD°Ì G1ä „D€Ì N1èDÌ X1è”Í ^1ä ´D$Î i1èÎ l1ä ÔD„Î w1è`Î 1èdÏ è E´Ð ˆ1ä EtÐ ”1ä $E´Ï Ÿ1è”Ï ¡1ä DE Ñ ¦1èðÐ ¨1ädEdÒ è tELÒ ­1è4Ò ¯1ä ”EôÒ »1ä ¤EÐÒ ¿1ä ´E°Ò Á1èÒ È1èpÓ Þ1èôÓ å1äôEáÕ é1èÄÔ ë1ä F´Õ ö1ä $FÕ 2ä 4F|Õ 2è`Õ 2èôÕ 2ètÖ 2ätF(× è „FÄÖ 2è¬Ö +2ä ¤Fp× -2èX× /2ä ÄF4Ø 22èÌ× A2è¤Ø G2ä ôFDÙ N2è(Ù Z2ä G€Ù i2è`Ù t2èüÙ ‚2ä DG¸Ú Ž2ä TGTÚ •2è<Ú ¡2èÛ ®2ä „G´Û ´2ä ”GœÛ Ã2ä ¤GpÛ Ï2èXÛ Õ2âð*á ÈGÜ ð2èàÛ 3ä èGÝ 3äøGÈÜ ìPÜ (3ä H`Ý 03èDÝ F3ä 8H˜Þ H3ä HH|Þ M3ä XHdÞ T3ä hH0Þ k3è Þ r3ä ˆHìÞ x3èÌÞ ƒ3ä ¨H ß ¢3èTß ´3èÜß ¿3ä ØH4à Ê3èà Ï3â œ X^á IÐà ò3äI¨à ìlà ô3èìà 4èdá &4ä PIÐá -4è á 84ä pIâ A4èèá U4ä I´â X4ä  I”â _4è,â t4ä ÀI”ã v4ä ÐI$ã {4èäâ ‚4ä ðI4ä …4å Jäã ”4èÌã Ÿ4ä Jüä «4ä0J¬ä è @J€ä ·4ä PJhä »4èPä ½4è0å Ü4ä €JHæ ß4è$æ 5ä  J@ç B5ä °Jç u5ä ÀJüæ ‹5ä ÐJÈæ ž5ä àJ¬æ ¯5ètæ Â5åK è è KÀç É5èdç â5ä 0Kèè è5èÐè ê5è\é õ5è é 6 â*8Ä ä'l• íè °çøþKPê <6ä  Kðé B6èàé è ÀKê Y6èxê d6ä àKœë f6ä ðK|ë r6å LPë y6ä L4ë 6ä Lë …6èìê Š6ä @L8í ¥6ä PLí §6èÜì ¶6èXí Í6ä €LÈí ì6è°í ó6ä  Lðî ø6ä °LÔî 7ä ÀLÀî 7è¨î 7ä àLœï 7è`ï ^7å Mð j7èÄï l7ä Mlð x7ä0MDð ì(ð ‰7ä PM(ñ 7ä `Môð ’7ä pMÔð ”7è ð ›7è@ñ ¡7ä  Møñ ¦7è°ñ ¬7èò ®7èLò É7èÐò Ü7â/á ôM,ó ý7èøò 8ä N,ô 8ä $Nô 8ä 4Nèó 8ä DN¸ó 8èœó *8ä dNˆô 58èdô <8è¼ô B8ä ”N€õ a8ä ¤N4õ m8è õ p8ä ÄNÔõ v8è´õ ™8ä äN´ö Þ8èö é8ä O ÷ ï8ä O\÷ ö8èD÷ 9èü÷ 9ä DO”ø #9ä TOtø *9ä dO8ø ,9èø 49ä „Où ;9éù =9èLù @9ä ´O¬ù 9è€ù £9ä ÔO ú ª9ä äOôù ­9èàù º9è¤ú ¼9èèú À9ä $PÜû Ë9ä 4P´û ×9ètû Ù9ä TPdü Þ9èøû é9ä tPTý ð9è@ý :ä ”Pèý :è¬ý F:è@þ V:äÄP”þ ìxþ X:ä äPÿ Z:ä ôPèþ e:èÌþ x:ä Qxÿ —:ä $Q`ÿ  :èHÿ ´:ä DQøÿ Â:ä TQÜÿ É:è¸ÿ Ô:ä tQ¨ß:ä „QŒä:ä”QpìXö:ä ´Qð;èÄ;ä ÔQ¸;ääQtì4';èø+;ä Rx7;ä $RDV;è,_;ä DRPd;è t;ä dR´{;è†;è@;ä ”RÈ”;ä ¤R”Ÿ;è\¤;ä ÄRˆª;ä ÔRD¶;è0º;ä ôRп;è¬Ä;ä S,Ê;èäÏ;ä 4SôÕ;ä DSŒe<èxg<ä dS”l<ä tSpv<èH‹<ä ¤S<âä¿ X=¸4Lc ´S#=ä ÄSì*=ä ÔSØ==è°B=ä ôS`a=èLf=ä TÔ…=茊=ä 8Th Œ=â8ÄHTP ¡=ä XT< ­=è ²=ä xT ¸=ä ˆTà º=ä ˜TÌ Ï=ä ¨T¸ Ô=èœ Ù=è° è ØT¤ å=èh è=ä øT” >ä U >èà >ä (U 4>èä S>ä HUa>ä XUÜ m>ä hUÈ z>è¬ ‘>è4“>ä˜Uðì´š>ä¸Utè ÈU@â>ä ØU,ê>è ì>ä øU´ ?è ?ä VŒ?ä (Vh2?èDQ?èð\?ä XV<^?ä hV`?èt?ä ˆV¸v?ä œV¤‚?âð*儱?ä ¼VX¸?èôÃ?ä àV˜Õ?âð*å€@å WP@äWè Wì@èÄ)@èx/@ä PW<@ä `WàA@èÄL@è8k@èˆ}@èÀ@ä °W„’@ä ÀWp—@ä ÐWLœ@è(»@èàÄ@å XôÉ@ä XË@âð*á $Xlú@ä 4X0Aä DX AèôAä dXœ"Aä tXP$Aä „X0)AèHAä ¤XXNAä ´XZAèØeAèŒkAè uAä ôXH€Aè0„Aèx“Aä $Yà§AèijAèø¿Aè,ÜAä dYôãAè”îAè4ôAä ”Y¤üAèŒÿAä ´Y0 Bè Bä ÔYÀ3Bä äY7BèlCBä Zd IBäZá KBèàMBä 4Zè _BèÄ pBä TZÈ!wBädZ¤!ètZx!è „ZL!{Bè!ŽBä ¤Z"’Bä´Zá"”Bèä!—Bè`"¢Bä äZ„#³Bè#¸Bä [ø#ÏBè #îBä $[œ$ôBä 4[t$Eä ô]<1@Eä ^1GEèì0fEèT1hEä 4^¨1sEè|1Eä T^H2Eä d^$2ƒEèø1¢Eèt2¨Eä ”^ø2¶EèÄ2¸Eä ´^L4½Eä Ä^ 4ÀEä Ô^ü3ÇEä ä^Ä3ÉEä ô^¤3ÌEä _Œ3ÓEèx3ÞEä $_ü4àEä 4_¬4ìEèˆ4÷Eä T_85ùEè5áFä t_Ð5Fä „_„5FèT5Fä ¤_œ6*Fä´_l6è Ä_P6-Fä Ô_(68Fèü5]Fä ô_ 7jFèì6wFä `ô7}Fä$`È7ì7è D`<8Fè8†Fè|8”Fä t`Ô8 Fä „`°8¤Fè˜8¦Fä ¤`Ü9­Fä ´`¼9¸Fä Ä`”9ÎFä Ô`x9êFä ä`P9îFä ô`9 Gèø8Gè$:Gä $a0;*Gä 4aä:5Gä Da˜:³Gä b>ÇGèü=ÍGä 4bL?ÒGè?æGäTbx@è dbX@ëGä tbÌ?öGè¤?ùGä ”bLAÿGä ¤b(AHèAè Äb°A HèdA!Hä äblB@Hä ôbBGHèèAIHä c¸BhHè˜BHä 4cDŠHä DcäC–Hä Tc¼C¢Hä dcˆC¥Hä tcpC³Hä „cTC¹Hä ”cCÄHèøBÊHä ´c¬DØHä Äc\DÛHèDDè äcDEæHä ôc(EòHéEùHä døFÿHä $dÔFIä 4dˆFIèTF8IèGWIä ddøGZIä td¨GfIèˆGlIä ”dHqIä ¤dlH|Iä ´dPH€Iè4H‹IäÔdtIè ädLI’Iä ôd0I¥Iä eI¸Iä eÜH¿IèÄHÂIä 4e(JÄIäDeüIìÀIÐIä de˜JÖIèPJØIèÀJãIä ”eÄKæIèLKêIä ´e€LõIä Äe4LøIèüKJä äeÀLJè¤L Jä fMJèäLJä $ftM!Jè`M$Jä HfpN+JâÜ?á XfN[ä €} ¨A[èä§D[èX¨O[ä °}œ©V[ä À}ð¨Y[褨[[ä à}ø©][ä ð}Ø©`[è°©h[ä ~ܪ†[ä ~„ª¢[ä 0~tª¤[ä @~Xª«[課[ä `~$«½[é«È[ä €~„«Ë[èh«â[ä ¤~(¬è[âÔYá ´~¬\èü«\ä Ô~„¬\èh¬!\ä ô~,­5\ä ܬ@\訬k\ä $Œ­Š\èt­•\ä D®—\鮢\èx®¤\ä tЮ¯\è®Î\ä ”ˆ¯Ð\ä ¤h¯×\ä ´H¯Ü\è ¯ñ\ä Ô °÷\ä ä°ù\èè¯]ä €ø°]踰]ä $€d±&]è<±\]ä P€`²^]â”ià DØ`€á²¢]ä p€ä±Æ]è±È]ä€á³Î]èIJÕ]ä °€P³Ü]è³ë]ä Ѐð³ñ]ä à€Ô³*^ä ð€¬³,^脳5^è´:^ä l´=^èL´D^ä @Lµz^ä P$µ–^ä `µ^鵤^ä €œµ§^ä Œµ®^ètµµ^ä °¶¼^ä À¶Ã^ä ÐèµÊ^èÀµÎ^ä ðp·Õ^å ‚¸¶Ú^ä ‚¨¶ù^ä ‚˜¶á_ä 0‚t¶_è`¶_ä P‚œ·_è„·)_äp‚T¸è€‚(¸è ‚ð·5_èз<_èиJ_è¹P_èx¹W_èĹb_è ºg_å ƒÔºl_è ºr_ä ƒÌ»y_ä 0ƒ»{_ä @ƒ0»}_軃_ä `ƒp¼ˆ_ä pƒP¼Š_è ¼•_ä ƒ½˜_èè¼£_ä°ƒ¤½è Àƒ„½©_ä Ѓl½´_èL½èðƒH¾é „4¾¹_ä „¾Å_èè½Ð_ä0„á¿Ö_ä @„ؾì_踾î_ä`„ü¿è p„°¿ù_ä €„t¿û_èT¿ý_ä  „Á`ä °„ÀÀ `ä À„ À`è|À*`ä à„Â1`ä ð„èÁ6`å …ÀÁ=`ä …¤ÁT`è€Á[`ä 0…°Âa`ä @…DÂc`è(Âo`ä `…Ã{`èÜÂ`ä €…Ä–`ä …ÔÃÞ`ä  …°Ãá`ä°…˜ÃáaèpÃaä Ð…Å aäà…áÅaä ð…èÄ)aè¬Ä,a䆠Åè †`Å1aè<Åmä ¸”ÈúJmä Ì”¤úOmâpé älú~mä 씌û…mä ü”PûŒmä •4ûmèû–mä,•áü™mä <•àû¨mèÈû³mè,ü×mä l•¼üßmèœüëmä Œ•8ý÷mä œ•ýn䬕áýnèàü=nä Ì• þ\nä Ü•ØýcnèœýhnèDþnnä –Pÿpnä –ôþtnè¨þwnä <–Äÿnä L–¬ÿ§nèÿªnä l–\°nä |–D³nè$ºnä ¬–ÀnâPMð*áL%á m ¼–ìùnèÐýnä Ü–(oä ì– oä ü–ôoä —„oè`oä ,—d'oè@FoäL—|è \—TLoä l—4oä |—ð˜oä Œ—Фo輯oä ¬—ØÃoè°Ùoä Ì—(ßoèøáoä ì—dãoèDòoä ˜è ˜üøoèÄè <˜°pèPpä \˜pé&pä |˜Ô-pä Œ˜¨4pè„6pä ¬˜ìAp踈pä ̘Èpè„¡pä ì˜l ¦pèL ªpä ™Ì Épä ™¸ Øpè€ Úpä <™¸ ùpä L™` üpèH qè” *qèä 1qä ”™` 3qâÔYáD/ä( hqä ´™È qqè„ sqä Ô™˜ ’qè ”qä ô™|£qè¥qä š ¨qä $šÇqä 4šàæqè¬ììqètóqä tšðøqä „š¼ûqä ”š„&rèd-rä ´šðCrä Äšœarä Ôš€urè`†rä ôšdrè,”rèx›rä $›@¡rä 4›øârä D›Üsè¼ sä d›0&sèÀ1sä „› =sä ”›ˆWsèhYsä ´›üesèälsä Ô›˜qsä ä›Lzsè,†sä œø¥sèȬsä $œÈ·sä 4œ\Äsä Dœ<ÏsèÚsä dœÜsä tœøçsèàòsä ”œŒøsèp$tèÜ+tä ÄœT6tä Ôœ8>tè Jtä ôœÜUtä È`tä ¨etä $ltè|xtä D$ztè †tè\‘tä tØœtèÀè ”Ð§tä ¤°©tä ´”»tä ÄÆtéåtèŒëtä ôõtä žÜøtèÀýtä $žÐuä 4ž”uèpuä TžLuèäMuä tžluèxxu䔞ðìЇuè\žuèä uè4 ¢uä 䞈 §uèl ©uä Ÿ !­uèø ôuä $Ÿ¨!÷uèŒ!üuä DŸô" vä TŸ¼"vä dŸ¤"vè"'vè#,vä ”Ÿ $:vä ¤ŸÐ#=vä ´Ÿ´#Hvè#Kvè\$Pvä äŸP%hvä üŸ%tvâÔYá„.  %›vä  à$ŸvèÌ$è < Ü%ªvè%±vä h 4&³vã,á%á¼"å&Ðvä ˆ 'Övä ˜ L'ávä ¨ 0'ìvä ¸ 'øvèè&wä Ø L( wä è 0(wèø'"wèø((wä¡T)ì8)+wä 8¡*2wä H¡*9wä X¡Ä)>wä h¡ )]wèˆ)cwè`*wwèœ*–wä ¨¡”+œwèt+¤wä È¡ø+Ãwä Ø¡Ü+Çwè¬+Ówä ø¡(-çwä ¢ø,ówä ¢ˆ,÷wä (¢d,xèH,xä H¢p-xèT-xä h¢4.xè¼-%xä ˆ¢´.+xèT.7xä ¨¢`/>xä ¸¢.|ä |¦\>9|ä Œ¦,>;|è>A|èŒ>N|ä ¼¦?V|ä ̦?e|èô>l|è€?v|ä ü¦@z|èð?|è@@‚|ä ,§°@Š|è€@Œ|ä L§ü@‘|èÐ@“|ä l§ÄA–|ä |§ A˜|ä Œ§dA£|ä œ§@A¨|è,AÇ|ä ¼§àBÏ|ä ̧ÈBâ|ä ܧ¤Bò|ä ì§€Bø|è`Bè ¨XCú|âPMð*á m (¨@C}èC,}ä H¨(D2}ä X¨DQ}èäCW}äx¨°DìLDb}èôDe}ä ¨¨ÐEy}ä ¸¨„E|}ä ȨdE~}ä Ø¨LE}è8E }èôE¢}èHF­}èlF¸}ä (©ÔG¾}ä8©Gè H©ˆè@{Jˆä 8·è{LˆèÈ{Wˆä X·¤|bˆä h·ˆ|mˆèP|pˆä ˆ·@}rˆä˜·(}ì}†ˆèœ}Žˆä È·~Õˆèð}áˆä è·¸~çˆä ø·˜~éˆä ¸x~ëˆè<~ ‰èÌ~‰ä 8¸H‰ä H¸(&‰äX¸á-‰èà~}‰èlˆ‰ä ˆ¸€“‰è얉言˜‰ä ¸¸ š‰è쀥‰ä ظ¬³‰ä 踔¸‰è€ĉè‚Ɖä ¹ƒщèð‚á‰è€ƒì‰äH¹H„áŠèôƒŠè”„ Šä x¹P…Šè$…Šä ˜¹ü…&Šä ¨¹´…)Šè …4Šä ȹø†6Šä عà†AŠè`†HŠè(‡SŠä º ‡ZŠè|‡]Šè؇è 8ºĈcŠèDˆlŠè܈sŠä hº„‰wŠä xºl‰|Šä ˆºT‰‹Šè8‰¢Šä ¨º4ЍŠä ¸ºŠÁŠèÔ‰àŠä غ܊çŠä 躼ŠòŠä øº¨ŠþŠä »ŒŠ‹èdŠ‹ä (»h‹‹èD‹ ‹ä H»ø‹9‹èœ‹D‹ä h»|ŒI‹ä x»XŒM‹ä ˆ»DŒS‹è ŒZ‹ä ¨»¤a‹ä ¸»l¨‹ä È»@³‹èÚ‹ä è»DŽá‹éŽã‹èŽï‹èìõ‹ä (¼¼ü‹ä8¼ˆì`Œè‘Œä h¼P‘Œè(‘&Œä ˆ¼,’+Œèˆ‘MŒèT’lŒä ¸¼0“†Œä ȼ¸’’Œèœ’˜Œä è¼ô“£Œä ø¼°“´Œè˜“ÙŒä ½\”ÝŒè”èŒä 8½•îŒèÄ”ùŒä X½d•ýŒèD• äx½–ì •ì0–èl–ä ¸½—è–'èD—IâtY콘vä ü½¼—‚褗ˆä ¾°˜Šä ,¾P˜Œè4˜’ä L¾ˆ™œä \¾p™§èL™¯ä |¾Øšµä Œ¾pšÁä œ¾XšÒä ¬¾šáèØ™áŽè› Žä ܾx›Žè8›Žä ü¾œ%Žèì›8Žä ¿ˆœ;Žä ,¿lœFŽèPœMŽä L¿üœRŽèÄœYŽä l¿Ü_Žä |¿ÀxŽèŒŽä œ¿lžžŽèLž©ŽèÈž°Žä Ì¿@Ÿ¼Žä Ü¿ŸÇŽä 쿟ΎèèžÝŽä ÀØŸâŽä ÀœŸúŽèpŸýŽä <À\ ä LÀ8 ä \À  èøŸ?è” Jä ŒÀ˜¡Qä œÀL¡Sä ¬À0¡Zä ¼À¡fèø iä ÜÀ0¢näìÀᢄèÔ¡‹ä ÁL£ªä Á,£´ä ,ÁÜ¢ÀèÈ¢Åä LÁè£Çä \ÁÈ£Ýä lÁx£èè`£ïè0¤ ä œÁܤä ¬ÁĤ0ä ¼Á¬¤7è¤:äÜÁ¬¥è ìÁ|¥Fä üÁ\¥Iè4¥Oä Â0¦Vè ¦bä <Âä¦eè¦tè§zä lÂ,¨‰è¸§—耨¢é©®ä ¬Â`©´èD©ºäÌÂ᪼èà©Èâ¸$á ðÂhªØå Ã@ªéèªïä Ãp«úä 0Ã\«‘è@«‘ä PÃÔ«&‘ä `ü«)‘è «äâÌ/á „Ãx¬4‘ä ”ÃP¬8‘è8¬>‘ä ´Ã¼¬C‘è ¬K‘èè¬R‘謭T‘èä­f‘ä ÄD¯h‘ä Ä(¯k‘ä $Ĭ®u‘ä 4Ä„®‰‘èh®Œ‘ä TÄ”¯•‘èh¯›‘ä tĬ°¢‘ä „Ä°´‘ä ”Ät°Æ‘ä ¤ÄL°Í‘ä ´Ä$°ì‘èð¯èÔÄl±è äÄ,± ’ä ôÄ ±N’èø°d’äÅá²j’èÀ±m’ä4Åd²è DÅD²s’è0²‹’ä dÅð²’ä tÅÔ²›’ä „Å¸²®’蜲°’ä ¤ÅŒ³Á’ä ´Åp³Ã’ä ÄÅT³Ê’è$³Ö’è´Ý’ä ôŘ´ä’ä Æt´ê’èX´ì’è|¶ð’褶ò’âÔYáT0 ðéäô¶-“âÌ/á dÆ8·H“è·M“ä „Æ¬·X“ä ”Æ˜·Z“èt·_“è`¸~“èp¹è ÔÆxºŠ“ä äÆ,º–“è ºš“蔺¹“èôº»“ä $ǻ֓ä 4Çx»â“è`»î“ä TÇô»õ“註”è ¼”ä „Ç<½”ä ”ÇÔ¼)”ä ¤Ç¬¼+”脼J”ä ÄÇ,¾P”ä ÔÇȽS”ä äÇ„½]”èd½_”ä È„¾d”èl¾t”è ¾v”ä 4ÈH¿‹”è(¿Ÿ”ä TȨ¿¦”è\¿ª”âð*á|,áD(åÈ¿•ä È À•èÜ¿•ä °ÈÔÀ$•èœÀ/•è@Á:•ä àÈLÂI•ä ðÈ4ÂQ•åÉáÂX•èÜÁ\•ä É€Ãj•ä0É4Ãè @ÉÃ{•èÀÂ~•ä `É,Ä…•ä pÉħ•ä €Éðî•èÔð•ä ÉÅè °ÉÐij•è¼Ä¿•ä ÐÉÄÅÁ•ä àÉLÅÕè4ÅΕè¨ÆÓ•ä Ê,Çß•èèÆá•ä 0ÊŒÇæ•ä @ÊxÇñ•èHÇ–ä`Ê(Èè pÊÈ–ä €ÊðÇ"–èÈÇ$–ä  ÊÀÈC–ä °Ê ÈF–èDÈI–ä ÐÊÉm–èôÈì8É–å ËÜÉ––ä ˜ɘ–è€É£–è(˦–ä @ËäË©–è¬Ë«–ä `Ë|Ì®–ä pËd̹–èDÌÈ–ä ËôÌ×–è¸ÌÝ–ä °ËìÍü–ä ÀËÀÍ—ä Ðˤ͗ä àËÍ—èpÍ>—è(Î]—ä ÌÏa—ä ÌìÎc—èhÎk—è Ïm—ä PÌdÐq—ä `ÌÐx—ä pÌÐz—èðÏ|—ä ÌèЂ—ä  Ì¸Ð¡—ä °ÌœÐ±—è|Ð×äÐ̈Ñì@ÑÊ—ä ðÌ ÒÑ—èØÑÓ—äÍÓè ÍÌÒß—ä 0Í¸Òæ—ä @ÍÒí—ä PÍ@Òï—è Ò˜ä pÍÄÓ ˜ä €Í€Ó ˜ä ÍlÓ˜èPÓ˜ä °Í¼Ô˜ä ÀÍ Ô˜éÔ&˜ä àÍ$Õ-˜ä ðÍÕ/˜èðÔ;˜ä Î Ö?˜èÔÕB˜ä 0ÎØÖH˜è˜ÖO˜ä PÎL×S˜ä `Î,×W˜ä pÎ×^˜èôÖj˜ä μטèœ×†˜ä ´ÎØØ‘˜âÜ?á ÄÎpØ¥˜èTب˜ä äÎ8Ù¯˜ä ôÎÙº˜ä ÏÙ¼˜èèØØä $ÏàÙȘä 4Ï´Ù͘ä DϘÙϘè|ÙÕ˜ä dÏDÚݘèÚâ˜ä „Ï(Ûè˜ä ”ÏüÚô˜ä ¤ÏàÚ™ä ´ÏÀÚ™è˜Ú$™ä ÔϘÛ*™èxÛ-™ä ôÏÜ/™ä ÐüÛ2™èàÛ6™ä $ÐÐÜ8™ä 4РÜ=™ä DÐdÜE™è0ÜI™ädÐ8Ýì ÝL™ä „ÐhÞQ™è<Þ{™èÌÞ•™è0ß—™ä Äмߡ™ä ÔИߥ™è|߸™ä ôÐŒàÀ™èhàß™è áè $Ѹáå™èháð™ä DÑ(âò™èâù™ä dÑ„âšä tÑhâšä „ÑPâ$šè<â'šä ¤ÑÐâ3šè¨â?šä ÄÑhã^šä ÔÑLãašè(ãlšèãršä Òäxšä Òøãƒšèèã…šâÌ/á 8Ò¸äšä HÒ€äΚèhäè hÒ„åКèdåךä ˆÒ¸åöšè åýšä ¨Ò|æÿšä ¸ÒPæ›è(æ›ä ØÒüæ ›ä èÒàæ›è¼æ›ä Ó€ç)›èhç0›ä (Óxè>›ä 8ÓXèI›ä HÓ èT›äXÓáèW›èèçc›ä xÓìèl›èÔèw›ä ˜Óléy›è@é„›èÌ醛èêè ØÓPꊛè8ê›ä øÓLë•›ä Ô4륛è¬ê°›ä (Ô(ì·›ä 8Ԡ뺛èŒë½›ä dÔŒìÄ›â¸(á|,á¸$á tÔtì œä „ÔXìœè@ìœä ¤Ôíœä ´ÔÜì&œè¼ì-œä ÜÔŒí3œâZ8iå\íqå Õtî™âü&äPîªè î³èÄî·ä @ÕXï¹ä PÕDïÄè(ïÆä pÕìïÒä €ÕÐïÝè¤ïßä  Õlðåä °ÕPðçè,ðìä ÐÕØð÷è´ðùä ðÕ<òžå Öòžä Öôñ!žä ÖØñ,žä 0Öˆñ1žä @ÖDñ3žäPÖ,ñè `Öñ[žèüðgžèxòsžâÜ?á ”Ö0ó¼žä ¤ÖóÞä ´ÖüòΞèäòížäÔÖÔóè äÖ¸óïžä ôÖœóôžä ×`óöžèPóüžä $×Pôþžä 4×ôŸèüóŸä T×üôŸä d×Ôô&Ÿät×¼ôè „×¤ô*Ÿèlô.Ÿä ¤×\õ?Ÿä ´×8õJŸè õLŸä Ô×ÐõSŸè°õUŸä ô×ÌöaŸä ØölŸä ØtöxŸè<özŸä 4Ø(÷€Ÿè÷•Ÿä TØl÷¢ŸèH÷¥Ÿä tØø³ŸèXøµŸä ”Ø,ù¹Ÿä ¤ØùÅŸèèøÌŸä ÄØœùÒŸèˆùÝŸä äØhúàŸè4úãŸäÙÄúè Ù¨úïŸèúüŸèû èŒû ä TÙôû èÐû è4ü ä „Ùàü! ä”Ù¨üè ¤ÙŒü& èTü1 ä ÄÙ\ý4 è ý: ä äÙ”þE ä ôÙtþI ä ÚXþP â`ä<þc ä (Úÿn èÐþy ä HÚ¤ÿ ä XÚˆÿŠ ä hÚpÿ‘ è\ÿ“ ä ˆÚ„– ä ˜ÚH¢ è$Á ä ¸ÚÈ ä ÈÚìË ä ØÚÐΠèœÕ ä øÚäå ä Û¤ì ä Ûˆ÷ ä (Ûd¡è@¡ä HÛ,!¡ä XÛ¸,¡è€7¡ä xÛŒV¡ä ˆÛta¡èXh¡ä¨Ûpè ¸ÛTo¡ä ÈÛ@z¡ä ØÛ(ƒ¡èð¡ä øÛ´•¡ä Ü”¡¡ä Ül·¡ä (ÜD¡ä 8Ü(ß¡ä HÜÐê¡è¬í¡èìø¡ä xÜÈû¡ä ˆÜ`ÿ¡ä ˜ÜD¢è0 ¢ä ¸Ü\¢ä ÈÜ@¢ä ØÜ,%¢èä'¢ä øÜ2¢ä ÝÀ>¢ä ÝœD¢èxO¢ä 8Ý|V¢èP^¢ä XÝx i¢älݸäâÄ®å t¢äŒÝÜ ì¨ {¢ä ¬Ý8 ¢è ˜¢èX ¤¢èÄ ¶¢ä ì݈ Ë¢èH Ò¢ä Þ| à¢èH ã¢è¤ £è4 £ä LÞÄ £ä \Þ¬ £è„ £è,£è\ £èÈ?£ä ¬ÞL_£ä ¼Þ a£èl£ä ÜÞw£èì{£è8€£è…£ä ß`ˆ£ä,ß4ìô—£ä Lß왣ä \ߨ¥£ä l߸¬£èœ¯£â$á¸(á ”ßŒ£ètÅ£ä ´ß4È£ä Äßö£ä Ôßü¤ä äßܤ謤ä àœ¤è| ¤èÌ"¤è -¤ä Dà„0¤èH8¤èÀF¤ä tà`Q¤ä „à$Z¤èy¤èÀޤè$‘¤ä Äàlœ¤è\£¤ä äà誤ä ôàØ±¤è¤¸¤â¨€á|Τä (ádÔ¤ä 8áPã¤ä Há@å¤è0ì¤ä háó¤ä xáìõ¤ä ˆáÜ"¥èÌ)¥ä ¨á 0¥ä ¸á7¥èt>¥ä Øá(E¥ä èáL¥ä øáS¥èàU¥ä âðW¥ä (âàb¥ä 8âÐi¥ä Hâ¨p¥ä Xâxv¥è\|¥ä xâä¥ä ˆâ’¥èl™¥ä ¨â¨Ÿ¥ä ¸â¦¥èh²¥ä Øâ¸¥èÜÇ¥ä øâôÒ¥ä ãØÔ¥ä ã¼é¥ä (ã¤ð¥ä 8ãp÷¥èX¦ä Xãd¦è¦ä xã„¦ä ˆãD#¦ä ˜ã4.¦ä ¨ã$5¦ä ¸ã<¦ä ÈãèC¦ä ØãÔN¦ä èã°S¦è„r¦ä ä0t¦ä äø¦ä (äè¦ä 8äØˆ¦è¼¦ä Xäè¦è€Ÿ¦ä xä\ ¦¦è æä ˜ä¼ Ʀä ¨ä  ˦è„ Φèè Ѧèd!Ù¦èô!à¦ä øä\#ê¦ä å<#ö¦ä å # §ä (åä" §èÀ"§ä HåÜ##§ä Xå´#'§è˜#n§ä xå $|§ä ˆåt$çä ˜åP$Χèø#ѧä ¸åè$Ô§èÈ$×§ä ØåP%Ú§è4%ï§ä øåÀ%ô§è¤%ÿ§ä æ,&¨è&¨ä 8æ¤&#¨èl&.¨èü&5¨ä hæ˜'<¨ä xæD'H¨è'V¨ä ˜æì(l¨ä ¨æœ(w¨èL(‚¨äÈæá*„¨ä Øæ¼)ˆ¨ä èæt)“¨ä øæL)²¨è,)¸¨èL*¼¨ä (çð*Ǩä @ç¬*ɨâÔYáhœäh*ñ¨è@+÷¨ä pçŒ,©ä €çp,©ä çì+©ä  çÔ+©ä °ç¼+G©ä Àç¤+S©èŒ+V©ä àç-X©èä,d©å èÌ-s©ä èp-w©èD-…©èä-œ©ä @èœ.¢©ä Pèx.Á©è`.Ç©ä pèP/É©ä €è/è©è/ó©ä  è80ø©ä °è 0ý©é0ÿ©ä Ðè(1 ªäàèá1ªèè0ªå éh1<ªè@1Jªä éü1Oªä 0éà1Zªè°1]ªè2_ªèl2eªä péX3gªä €é3iªä éè2wªè¤2ƒªè€3Žªä Àéð3™ªä ÐéØ3œªè¬3©ªä ðél4¯ªèH4Ϊä ê`5Õªä êD5àªä 0ê,5ãªä@êá5êªèð4ðªèø5è pêÜ6«è¬6«ä êP7«ä  ê<7«è7«ä Àê¼7«ä Ðê˜7 «è|7è ðê88?«è8C«ä ëÌ8J«ä ë°8U«ä 0ë”8™«è`8¤«ä Pë”9¬«ä `ë`9°«è89¼«ä€ëá:Á«èÜ9È«ä  ëØ:Ê«ä °ë”:Í«ä Àë\:Ø«è<:Ú«ä àë$;î«èü:ð«èÌ;ö«âÂìrÀ£ìX<,¬è,<3¬èü<9¬èÜ=è \ì”>O¬ä lìp>[¬ä |ì\>f¬è<>r¬ä œìÀ?‘¬ä ¬ìŒ?˜¬ä ¼ìx?«¬ä ÌìT?±¬è?¸¬ä ììì@º¬ä üìÔ@¾¬ä í@ͬâLwäP@Ѭä 0í A׬è Aä¬èœAæ¬ä`íáBò¬èÔAþ¬ä €í˜B­ä íDB­èB­ä °íC"­èìB-­ä ÐíÜC0­ä àíœC;­è\CF­å î˜De­è±ä òôS|±èÐSˆ±è0T§±ä Àò\V³±ä ÐòVµ±ä àòÄU¼±ä ðò¨U¿±èlUʱäóÐVìŒV̱ä 0ó(WÓ±èWÙ±äPóäWè `ó Wó±ä pó„W;²èhW@²è,XB²èÈXV²ä °ótY]²ä ÀóYa²èüXs²äàóüYè ðó¼Y²èY‡²ä ôðZ޲ä ô¨Z²èlZ—²ä@ô|[è Pô`[š²ä `ôH[œ²è,[¨²ä €ô \¯²èô[º²ä  ôØ\ɲä °ôx\βä ÀôX\Õ²è4\á²äàôá^è øôÄ]ç²âZ8iá õˆ]n³èl]p³èˆ^{³ä 8õX_~³ä Hõ_á³èà^ä³ä hõ0`ê³èô_õ³è``è˜õáa ´èì`´âP&å´èða@´ä üõTbB´è$bè ö cQ´ä ,öPcT´ä <öå8 â (>áP ä0â†\¹è èâpê\¹äP ä  ãáp 2ä° € 2ì ÿèä( ä äãP ì âP  äT èD ì âP ð ê¬ ˜Wå€ æ˜Wᘠäâ êäÔ xWå¼ â€ xWéâü Wåä â¼ Wéâ$ Vå âä Vñ\¹ä4 P âd ìäL â8 ìè,⌠›ät âL ›è(â<(üäœ â t (ü´ ä ââä dÏè èâpêdÏä´ ä ãáÔ 2ä ä 2P ÿèäŒ ä| äã´ ì â´  ä¸ è¨ ì â´ ð| êü DMää æDMèâ$då âä dñdÏä4´ âd˜ äLâ œ ˜ ´ ä⌠C ätâ L C ´ äâü Éäœâ t É´äââäDí èÌèpêDí ä´äãáÔ2ää2PÿèäŒä|äã´ì â´ ä¸è¨ì â´ð|êüá  ääç  ì”ä-å âää-á$èâT˜ì è|èâpæä˜ì ä$ätãáD2ä„T2Àÿèäüäìäã$ì â$ ä(èì â$ðìêlxHäTæxHèæäQ ä|âTäQ ì¼xHä¤ xHèâääQ äÌâ¤äQ ðDí äô´â$ œ ä ✠œ èâLLä4â Lì´°ä\¸þLÌaäÌÌaÌâÿèäøìááœ@â€åè€ì0ÿôüèÿä\Ìèÿ˜âÿèäÄìááœ<âåàè€ø êÌXä ÌÌXHâÿèätìááœ8â~åè€ì¬èêØèÈê â´ æôèÈöÈêÜ´îä Ì´î\âÿèäˆìááœ4â}å¤è€ìÀèöêŒìþ äìÌìþ (âÿèäTìááœ0â|åpè€øê؆I€TäœÌ€TØâÿèäìááœ,â{å è€ì<øXè8ýìtÿäì â æ â°æâ àüŸèh†Iä @ápȆIæüŸä°åãá"\`/¤à`/Lÿèäxìã°ø”ì â°è¬à`/èÿèäìã°ì0è”øLê â° ä 2älà2¨ÿèäÔäLäã°ìðè”øLê¼|§äà|§Xâÿèä„ìáá°ârå è”øìPƒäÌàƒâÿèä4ìáá°âqñ”íÄä`àÄœâÿèäÈìáá°âpåäè”ÿèø qäà qLâÿèäxìáá° âoå”è”ì°øÌè¨øèì ðüŸä°æ$ìâTÀ¿ìø…Iä @ápX†IæÀ¿ä$ätãá"Ð`/„T`/Àÿèäììã$øì â$è T`/\ÿèäˆìã$ì¤èøÀê â$ ä€2äàT2ÿèäHäÀäã$ìdèøÀê Hp äTHp Ìâÿèäøìáá$âñì¨ ˆ‚ ä$ Tˆ‚ ` âÿèäŒ ìáá$âñìà…I\Û„!¸ T\Ûô âÿèä !ìáá$äåõ ’ î{öùÿõýÿíÌ/å.öýÿí¼Sä(öýÿí<0å)ö;öùÿõ}öh&¼SÜ„Iî¤$äÅ ò”€ìˆ&Êáåˆ6ä8¢,䨪,¸ª,ä tü,0ý,8ÿ,ä8-ÿàD-ÿá-èÔ-èàV-è ˜c-°c-Èc-ñ…-‡-äÀ‡-<Ÿ-ä -䜠-ðT£-ˆ¥-èÔ§-ì§-èX³-äh³-è$´-ø@´-X´-äø´-µ-ädÃ-ŒÉ-¼É-ØÉ-ì«.ì À.Á.¼8äØ8…8ð¨…8t†8䌆8H‡8ä Š8äŠ8¼Š8äÌ—8è—8脘8ä0œ8ä\œ8䄟8¬Ÿ8„ 8¬¢8À¥8äl§8ðð§8è¨80©8è@©8ìÜ©8ä x²8P³8x¹8äPÉ8älÉ8@Ê8äÈÊ8äðÊ8ä ¬Ë8ÄË8€Ì8ô Ù8ä€Ý8<Þ8äTÞ80á8èé8ä0ê8äHê8øì8þ8 þ8¸þ8Ðþ8´9Ì9ì(9ä¬9ä¼9Ô9 949ôL99ìŒ9ä ¤9D9T9ì l9x;8«;èH«;䀫;L¬;$¼;`Ä;pÄ;Å; É;äHÏ;Ò;,Ò;è×;ðÚ;ä$Ý;D<äè<è „è<4é<Dé<ä`é<”ë<ðÈí<äðó<è ”ô<õ<4õ<äPõ<èäõ<è ö<à÷<áø<ø<è¸ø<äpù<äˆù<,=é=¼=äÌ=ä=äü=ä =œ=¬=ôx=ìˆ>D>ôÈ>à> 3>ÜK?äôK?0q?äHq?|q?èht?è|w?x?Hx?y?ä y?Dy?“?è´“?(Ÿ?ÿଠ?èÄ ?ôhµ?äxµ?ˆµ?äàÇ?ìôÙ?ô 8Ü?PÜ?ÔÜ?äðß?äLö?è˜ö? ÷?äú?è €ú?ú?¨ú?è ”Ï@¨Ò@ã@ì ã@,ã@¬ã@älñ@älþ@ð9AL:Aäh:AìÈAè8>AèØ>Aä”?AìœGAä´GAÌGAä äGAHA@NAäXNAèH^Ad^AHrAsAäÜ‚Aì`ƒAä8„Aô„Aè …A(…Aää…Aäü…Aœ†A@›AœœA0Aä@Aä tžAøžA|ŸAä4 AD Aä¼¾AÔ¾Aä ÈÉA`ÏAÐAä(¥Bè¨B¨Bäp~Cäà„Cä|”Cä°—Cd™CðXŸCè¢Cä¥C¼¥Cèð¦Ct§Cè ¸C0¸Cl¸Cì(¹CXŽDäxŽD”ŽDì°ŽDðÀŽDðŽDä Dè$DF NFNF4NF€NFNFä¸NFäÌQFäèQFè XF XF0XFìÌ]Fä|^Fì TnFˆpF pFä¸pFèÈpFè0qFä@qFä|{F„‹F¬‹FÄ‹Fø‹Fð8FüôFì äŸF  Fè Fá¡F„¡F¬¡F¼¡F@¢F€¢Fäp²FŒ²F褲Fü²FLÊG|ÐGììÐGÑGœÑG´ÑGðTÒGôlÒGè„ÒGœÒGè´ÒGìTÓGìdÓGèèÓG©Hä 0©Hà©Hð©Hè«H°«H(­HD­Hx­Hˆ­H¤­Hä¼­Häð­Hü®HèÄ®Hä `¯Hx¯H¯Hô¬¯HôįHäøHä˜6h&øHÔ6ît7ä@îäð6ìâ7l ä 7ì ìH7@)å87ì äêT¸äd7ì äîÄ7âd:øHâ 8ü˜6òÜ7ü ðô70ëó( î{öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öpõýÿíl ä,öqõýÿí@)å)öùÿõ*öýÿíl ä=öýÿíT¸ä(ö)ö;öùÿõ}þ´:âÀ= âä:üô<òÌ:œö õ( î{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ*öýÿíl ä=öýÿíT¸ä(ö)ö;öùÿõ}öh& 0=îd:ä˜îäL=ìâx=l äh=ì ì”=R äh=ðT¸ä°=ì äî>â¼A<÷ â@>üà@ò(>œö ô>áî{öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿíL äýÿíÎä;öùÿõýÿíæ ä(öýÿíl ä,öýÿíR ä,öýÿíxQä,öýÿíÎä(ö)ö)ö;öùÿõ}öh&<÷ AîÀ=äØîä8AìâdAl äTAì ì€AR äTAðxQäœAê â¬A ä äî BãJæ âáî{öùÿõvõýÿ픀ävõýÿí°¼ ä(öýÿíl ä,öýÿíR ä-öýÿíl ä,öýÿíxQä)ö;öùÿõ}öh&æ (Dî¼AäîäDDìâpDl ä`Dì ìŒDR ä`DìÈDxQä¨Dê â¸D ä äêˆ$ääDìâ E@RFðápæh&@RääDä4EãáF2äDEE2€Eÿèä¼Eä¬EäãäDì âäD äèEèØEì âäDð¬Eî@RäFäDæ0Fìâ `FÈThGðápæh&ÈTä0Fä€FãáPG2äF`F2ÌFÿèäGäøFäã0Fì â0F ä4Gè$Gì â0FðøFîÈTä`G0Fæ|Gìâ ¬G¼½´Hðápæh&¼½ä|GäÌGãáœH2äÜG¬G2HÿèäTHäDHäã|Gì â|G ä€HèpHì â|GðDHî¼½ä¬H|GæÈHìâøH¨¯ ôápæh&¨¯ äÈHäIãáèI2ä(IøH2dIÿèä IäIäãÈHì âÈH äÌIè¼Iì âÈHðI äøIÈHêPJâXMæ â€Jü`LòhJœö ô>áî{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ*öýÿíl ä=öýÿíxQä;öùÿõ}öh&æ œLïJäxîä¸LìâäLl äÔLì íMR äÔLìáî{öùÿõýÿí°¼ ä(öýÿíl ä.öýÿí¼e ä(ö)ö,öýÿí@)å,öýÿíxQä)ö;öùÿõ}öh&°¼ ÜOîXMähîäøOìâø5+l äPì â $P°5+ä|Pðéä!+èpäõè ü!+äq,"+è 2+h&ðå$PäœPãá´Pðå¬P$Pâ¸+ÐAäÄPÐPæ â àPÐA â ðP”+äHQà?ôáæYè¬RìÄRÈXâh&à?äðPähQãá€Qà?äxQðPâ¼Q`œäQœQæ â ¬Q`œ ìøQÐAäÌQØQæ â èQÐA ì4R4à äRRæ â $R4à ìpRŒÍäDRPRæ â `RŒÍ ðL ä€RŒRæ â œRL ð ð ÐTÐR¼Tä(Sà?ôápð,TèðPäDTâh&à?äÐRäHSãá`Sà?äXSÐRâ|S`œäpSê¸SÐAä ŒS˜Sä â¨Sæ ìäS4à ä ÈSÔSä â˜SæTŒÍäôSáTä â˜S èL ä TäDê>ñlTøŒSæ”TøÈSæüôSæèÔSæ ÌVÜT¸Vä4Uà?ôápð(VèðPä@Vâh&à?äÜTäTUãálUà?ädUÜTâˆU`œä|Uê´UÐAä˜U¤Uæ ìàU4à ä ÄUÐUä â¤Uæ VŒÍä ðUüUä â¤U èL äVäDê>ñhVø˜UæVøÄUæüðUæèÐUêØV´Xä0Wà?ôápð$XèðPäñdXø”WæŒXøÀWæüìWæèÌWèðXøQæYøÌQæ@YøRæhYøDRæü€RæäèY xé+èpäX÷è+ä0+è+Z xäYä0 + ãåT¾ì(Z9âÿÿÿá(jôð+ô+ð +ÿÿì8+ÿÿÿüP+ÿàh+ÿô€+ÿÿø˜+ÿÿè°+ôÈ+à+üø+ÿÿä+(+ð@+ÿÿÿøX+ÿÿÿÿÿÿÿÿÿÿÿüp+ðˆ+ +ð¸+ÿÿÿÿÿäÐ+ôè+ÿÿÿÿÿÿÿÿÿÿÿå++ÿè0+ìH+ÿð`+ÿìx+ÿÿÿÿÿø+ÿÿä¨+ÿÿüÀ+ÿÿèØ+ÿÿüð+ÿÿÿÿÿð +ô +è8 +ÿøP +äh +ø€ +ÿÿÿÿÿÿÿÿô˜ +ø° +ôÈ +à +øø +ä +ÿà( +ÿì@ +øX +äp +ÿðˆ +ÿü  +ÿÿภ+ÿÿÿèÐ +ÿÿÿÿàè +ÿÿÿÿÿÿÿí +ð +øôuä8j@jâä˜jôuôápä``è°+ðÈ+âZôuä@jä¸jãáÐjôuäÈj@jæ œ äàjìjæ â üj œ â  kX+ädk4ôáæ$mèÈkìàkülâZ4ä kä„kãáœk4ä”k kæ œ ä¬k¸kæ ð>õìkèläDl4ôápð¨lè käÀlâZ4äìkädlãá|l4ätlìkæ œ äŒl˜læ ð>ÿíŒlæè˜lÿâ¬kæä|mDÃõáæ qè´mÌmôZDÃä$mäœmãåDÃä¬m$mæ¼"äëânDÃôápèVmä`qçZøÅäÌmä4nãáLnDÃäDnÌmâ"°p`/øo\nn`/˜nîðnöäÄnì€âÌmä«êœ1 äànì âÌmädoxoççäçæáááxýâœ1 ànä©á@³â<äoäé¼oü:áèoä©ý âànëpn`/ãð?áì:öýÿíl ä(öýÿíð*å.öýÿíl ä)ö,öùÿõýÿí ä(öýÿíð*å.öýÿí ä)öùÿõ{öùÿõ}þ|z⸒¸â”züD|ö>ñ{öùÿõDõXõ<öõ>ö(ö!ö(öýÿíÌ/å<öýÿí<0å)ö)ö;öùÿõ}ö€|¸ð”î,zäLïh&D½ì |âÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ Œø‘ôДÿÿÿÿøà”ÿÿÿÿøÌä°Œ€|ÌìŒî`ä¸ïäìâDÌ/å$ê â4 ä ð<0å$ò°â0ÌâÈü°Œö>ñ{öùÿõDõXõ<öõ>ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}þ€æ`4â˜üH‘ö>ñ{öùÿõDõXõ<öõ>ö(ö!ö(öýÿíÌ/åjõýÿí<0å)ö)ö;öùÿõ}ö€|`4„‘î0äxïä ‘ìâÜ‘Ì/弑ê âÌ‘ ä ð<0弑îðä’€|ðD’äïä`’ì✒Ì/å|’ê ⌒ ä ð<0å|’ò“â`ðâ “ü’ö>ñ{öùÿõDõXõ<öõ>ö(ö!ö(öýÿí<0å<öýÿíÌ/å)ö)ö;öùÿõ}ú¸äD|ä`4äH‘ä •ìâH•Ì/å(•ê â8• ä ð<0å(•ê|•Ø_ô$`î `—È•Øuîâø•òà•Ø_ô$`î:öýÿíl ä(öýÿíÌ/å)ö,öùÿõýÿí ä(öýÿí<0å)öùÿõ{öùÿõ}ú”—ñΩhäôpäl¼šäX¼çh&ðÖä<¦ä¤¦ ãἦhää´¦<¦â§hä̦Ωhä îø ©˜ ä§„¦˜ T§âꌧö耧è€â<¦ä âöá¨ççäçæáááxýâá …ä¨äéD¨ü2áp¨ä€¨ü ì:⬨伨ü ìæ|Üø¨äÿä òðªl„ ä©„¦l„ X©î©öè„©è€â<¦ä¡âöªççäçæáááxýâá …äªäéHªü2áp¨ätªü:⬨䠪üæ|Wܪäÿä ò<«Xgå«â„¦Xgä î5øˆ«|®äL«â„¦|®ä îøÔ«ŒŸ 䘫ΩŒŸ ä îø ¬àúää«â„¦àúä ÿèl¬ŒLä0¬â„¦ŒLä ÿ踬Q ä|¬â„¦Q ä îøœ®l  äȬ„¦l  ­î<­öè0­è€â<¦ä¢âö°­ççäçæáááxýâ&á …äÈ­äéô­ü2áp¨ä ®ü:⬨äL®üæȘˆ®äÿä òدü 䬮„¦ü è®î ¯öè¯è€â<¦ä£âö”¯ççäçæáááxýâ'á …ä¬¯ä5ðà?÷$°Œ%äè¯â„¦Œ%ä îüÿÿÿÿÿÿñp°ˆPå4°â„¦ˆPå îÌþÿÿÿÿÿÿñ¼°°P 䀰Ω°P ä ï÷±1ä̰Ω1ä î4÷T±D– ä±â„¦D– ä îø ±øæäd±â„¦øæä îøì±(ƒä°±â„¦(ƒä ÿè8²p`åü±â„¦p`á¡ ÿ脲öäH²â„¦öä ÿèh´ 䔲„¦ вî³öèü²è€â<¦ä¤âö|³ççäçæáááxýâBá …ä”³äéÀ³ü2áp¨äì³ü:⬨ä´üæ8© T´äÿä òˆ¶O äx´„¦O ´´îì´öèà´è€â<¦ä¥âö`µççäçæáááxýâCá …äxµä2€è¤µüéеü2áüµä ¶ü ì:⬨ä8¶üæ`÷ t¶äÿä òH¸hF䘶„¦hFÔ¶î ·öé·è€â<¦ä¦âö€·ççäçæáááxýâDá …ä˜·ä2€èÄ·üéð·ü2áüµä¸ü:⬨ä8¶üÀ¹ÌäX¸„¦Ì”¸î̸öèÀ¸è€â<¦ä§âö@¹ççäçæáááxýâFá …äX¹ä8鄹äT§ô:â°¹ä§ü âT§æ º¶åйΩ¶å îøXºÄ{ äºâ„¦Ä{ ä îø¤ºÐ ähºâ„¦Ð ä ÿèðº0• 䴺Ω0• ä îø<»ðùå»â„¦ðùä îøˆ»°ÿäL»â„¦°ÿ”¥ îü2䘻„¦2Ô»ÿèä¼å¼äã<¦ì â<¦ ä<¼è,¼ì â<¦ñ¼þâ´¼häôpä,ÒšäÒçh&Ì×äl¼äÔ¼ ãáì¼häää¼l¼â8½häü¼â´¼hä îø,¿˜ äH½´¼˜ „½âê¼½öè°½è€âl¼ä˜âö0¾ççäçæáááxýâæá …äH¾äét¾ü2ᠾ䰾ü ì:⬨äܾüæP¿äÿä òÁl„ ä<¿´¼l„ x¿î°¿ö褿è€âl¼ä™âö$Àççäçæáááxýâçá …ä<ÀäéhÀü2á ¾ä”Àü:⬨äÀÀüæ“üÀäÿä ò\ÁXgä Áâ´¼Xgä î5ø¨Á|®älÁâ´¼|®ä îøôÁŒŸ ä¸Áâ´¼ŒŸ ä îø@ÂàúäÂâ´¼àúä ÿèŒÂŒLäPÂâ´¼ŒLä ÿèØÂQ äœÂâ´¼Q ä îø¼Äl  äè´¼l  $Ãî\ÃöèPÃè€âl¼äšâöÐÃççäçæáááxýâîá …äèÃäéÄü2á ¾ä@Äü:⬨älÄüæ$ï ¨Ääÿä òøÅü äÌÄ´¼ü Åî@Åöè4Åè€âl¼ä›âö´Åççäçæáááxýâïá …äÌÅä5ðà?÷DÆŒ%äÆâ´¼Œ%ä îüÿÿÿÿÿÿñƈPåTÆâ´¼ˆPå îÌþÿÿÿÿÿÿñÜÆ°P ä Æâ´¼°P ä ï÷(Ç1äìÆâ´¼1ä î4÷tÇD– ä8Çâ´¼D– ä îøÀÇøæä„Çâ´¼øæä îø È(ƒäÐÇâ´¼(ƒä ÿèXÈp`åÈâ´¼p`á¡ ÿè¤ÈöähÈâ´¼öä ÿèˆÊ ä´È´¼ ðÈî(ÉöèÉè€âl¼äœâöœÉççäçæáááxýâ á …ä´ÉäéàÉü2á ¾ä Êü:⬨ä8Êüæ 8 tÊäÿä òHÌO ä˜Ê´¼O ÔÊî ËöéËè€âl¼äâö€Ëççäçæáááxýâ á …ä˜Ëä2€èÄËüéðËü2áüµäÌü:⬨ä8¶üÎhFäXÌ´¼hF”ÌîÌÌöèÀÌè€âl¼äžâö@Íççäçæáááxýâ á …äXÍä2€è„Íüé°Íü2áüµäÜÍü:⬨ä8¶ü€ÏÌäδ¼ÌTÎîŒÎöè€Îè€âl¼äŸâöáÏççäçæáááxýâá …äÏä8éDÏ䄽ô:âpÏäH½ü ℽæÌ϶åÏâ´¼¶å îøÐÄ{ äÜÏâ´¼Ä{ ä îødÐÐ ä(ÐⴼРä ÿè°Ð0• ätÐâ´¼0• ä îøüÐðùäÀÐâ´¼ðùä îøHѰÿä Ñâ´¼°ÿ”¥ îü2äXÑ´¼2”ÑÿèäÐÑäÀÑäãl¼ì âl¼ äüÑèìÑì âl¼ðÀÑþâtÒhäôpä„çšäpççh&DØä,Òä”Ò ãá¬Òhää¤Ò,ÒâøÒhä¼ÒâtÒhä îøÜÔ˜ äÓtÒ˜ DÓâê|ÓöèpÓè€â,ÒäâöðÓççäçæáááxýâ®á …äÔäé4Ôü2áüµä`Ôü:⬨äŒÔüæ|ˆ ÈÔäÿä òÀÖl„ äìÔtÒl„ (Õî`ÕöèTÕè€â,Òä‘âöÔÕççäçæáááxýâ¯á …äìÕäéÖü2áüµäDÖü:⬨äpÖü欬Öäÿä ò ×XgäÐÖâtÒXgä îøX×|®ä×âtÒ|®ä îø¤×ŒŸ äh×âtÒŒŸ ä îøð×àúä´×âtÒàúä ÿè<ØŒLåØâtÒŒLä ÿèˆØQ äLØâtÒQ ä îølÚl  ä˜ØtÒl  ÔØî ÙöéÙè€â,Òä’âö€Ùççäçæáááxýâ¶á …ä˜ÙäéÄÙü2áüµäðÙü:⬨äÚüæðIXÚäÿä ò¨Ûü ä|ÚtÒü ¸ÚîðÚöèäÚè€â,Òä“âödÛççäçæáááxýâ·á …ä|Ûä5ðà?÷ôÛŒ%ä¸ÛâtÒŒ%ä îƒÿÿÿÿÿÿÿñ@܈PåÜâtÒˆPå îÛÿÿÿÿÿÿÿñŒÜ°P äPÜâtÒ°P ä î€øØÜ1äœÜâtÒ1ä î&ø$ÝD– äèÜâtÒD– ä îøpÝøæä4ÝâtÒøæä îø¼Ý(ƒä€ÝâtÒ(ƒä ÿèÞp`åÌÝâtÒp`á¡ ÿèTÞöäÞâtÒöä ÿè8à ädÞtÒ  ÞîØÞöèÌÞè€â,Òä”âöLßççäçæáááxýâÒá …ädßäéßü2áüµä¼ßü:⬨äèßüæ\·$àäÿä òÌáO äHàtÒO „àî¼àöè°àè€â,Òä•âö0áççäçæáááxýâÓá …äHáäétáü2áüµä áü:⬨ä8¶ü`ãhFäÜátÒhFâîPâöèDâè€â,Òä–âöÄâççäçæáááxýâÔá …äÜâäéãü2áüµä4ãü:⬨ä8¶üØäÌäpãtÒ̬ãîäãöèØãè€â,Òä—âöXäççäçæáááxýâÖá …äpää8éœääDÓô:âÈääÓü âDÓæ$å¶åèäâtÒ¶å îøpåÄ{ ä4åâtÒÄ{ ä îø¼åÐ ä€åâtÒÐ ä ÿèæ0• äÌåâtÒ0• ä îøTæðùäæâtÒðùä îø æ°ÿädæâtÒ°ÿ”¥ îü2ä°ætÒ2ìæÿèä(çäçäã,Òì â,Ò äTçèDçì â,Òðçþâ Ìçhäp%*ðpä˜%*šä„%*çh& ”ä„çäìç!ãáèhääüç„çâ8*¼e äè èæâhè`j ôáæDï)‚éäÜî)âðî)âh&¨… ä èäˆèãá è`j ä˜è èâ¼ì)ŒŸ ä°èâh茟 äKâÿâôèæâ0錟 ä ÿèh&`j äPéäTì)ãáä0é`j ôápð¨éèÀéä è)âä>ñäê`j õáæ`ïèPê èè|ëèh&`j äÀéä8êãå`j äHêÀéâhê>õŒŸ áç€êé¬êëøIêØê ëôæàê4êÿÿÿÿÿÿÿÿ÷ ìIêHë ëôæPë4ÿê °ç)ˆë\ç)äàë`j ôápð¤íèÀéä¼íâh&`j äˆëåìãáì`j äìˆëâd쌟 ä(ìâà댟 ä îø°ìXgätìâàëXgäÿèüì|®äÀìâàë|®äÿèXí˜ ä íâàë˜ Híÿè ðl„ ähíâàël„ Híÿì>ñÈã)øtìäíâèîœã)ø è<îhîøIêHíøâè”îü:¬¨äÀîüâ€ýÇ äKâêöïæâ@ïÇ äÿèh&°pä`ïätã)ãáä@ï°pôápä<è¸ïüïì´âä¼"äçÐï4êÿþâDð°pôápäàñ’ïä ñèh&¼Þäüïädðãá|ð°pätðüïâÐðÇ äŒðâDðÇ äKâêöïê2äàðDð2ñÿèäXñäHñäãüïì âüï ä„ñètñì âüïðHññ´ñè4êþâ(ò°pôápäÄó’ïä„óèh&ŒßäàñäHòãá`ò°päXòàñâ´òÇ äpòâ(òÇ äKâêöïê2äÄò(ò2áóÿèä<óä,óäãàñì âàñ ähóèXóì âàñð,óñ˜óè4êþâ ô°pôápä¨õ’ïähõèh&´âäÄóä,ôãáDô°pä<ôÄóâ˜ôÇ äTôâ ôÇ äKâêöïê2ä¨ô ô2äôÿèä õäõäãÄóì âÄó äLõè<õì âÄóðõñ|õè4êþâðõ°pôápäŒ÷’ïäL÷èh&Ü ä¨õäöãá(ö°pä ö¨õâ|öÇ ä8öâðõÇ äKâêöïê2äŒöðõ2Èöÿèä÷äôöäã¨õì â¨õ ä0÷è ÷ì â¨õðôöñ`÷è4êþâÔ÷°pôápäpù’ïä0ùèh&œ%äŒ÷äô÷ãá ø°päøŒ÷â`øÇ äøâÔ÷Ç äKâêöïê2äpøÔ÷2¬øÿèäèøäØøäãŒ÷ì âŒ÷ äùèùì âŒ÷ðØøñDùè4êþâ¸ù°pôápäTû’ïäûèh&ôäpùäØùãáðù°päèùpùâDúÇ åúâ¸ùÇ äKâêöïê2äTú¸ù2úÿèäÌúä¼úäãpùì âpù äøúèèúì âpùð¼úñ(ûè4ê?þâœû°pôápä8ý’ïäøüèh&ØFäTûä¼ûãáÔû°päÌûTûâ(üÇ ääûâœûÇ äKâêöïê2ä8üœû2tüÿèä°üä üäãTûì âTû äÜüèÌüì âTûð üñ ýè4êþâ€ý°pôápäØþ’ïä˜þèh&ÐJä8ýä ýãá¸ý°pä°ý8ýâÈýÇ äÀîä2äØý€ý2þÿèäPþä@þäã8ýì â8ý ä|þèlþì â8ýð@þñ¬þè4êÿþâ ÿ°pôápè’ïätçh&Pú äØþä@ÿãáXÿ°päPÿØþâ¤ÿÇ ähÿâ ÿÇ ä âÿè2ä´ÿ ÿ2ðÿÿèä,ääãØþì âØþ äXèHì âØþðñˆè4ÿÿæïÜâé4ø4êþIê`Ç ôâ â`ïpç„èIê°øæ¸éäøIíû4êþä”(êè\èBpäøè œ´H è h&(êä<ä´ ãáÌ(êäÄ<âŒ`/äÜ”`/ÿèäDì€â<âìåpœ1 ä`ì â<è`*õ á~ ä œ”á ~ ØÿèäìR€€â<âíéœ1 ä`êàô"ä0”ô"lÿèä¨ä˜ä€â<âîå â< äÄœ1 ä`ð`*õ,"äð”,",ÿèäXä˜ä€â<âïåtœ1 ä`ð`*õ@ä ”Üÿèää<䀀â<âðå$œ1 ä`î`*õð¸äP”¸Œÿèä¸ä<䀀â<âñåÔœ1 ä`î`*õ L\”á”\<ÿèäxäh䀀â<âòå ðœ1 ä`\Øÿèäì€â<âóå œ1 ä`ð|,å<ì ìŒ,Yä\át,YìåLnhìLnätä8vðäü(êõìnä4 êh&yä´ä ãå(êä, ´ö T | œîâ” ö8vð{öùÿõýÿíLnä=öýÿí|,å;öùÿõ}öH ˆ áîâ  ö8vð{öùÿõDõýÿíLnä;öùÿõ}ö ü | Pîâ” ö8vð{öùÿõDõýÿí(êä<öýÿí8vä>ö(öýÿí,Yä-öýÿí`*å)ö;öùÿõ}ö °0  îâH ö8vð{öùÿõDõýÿí(êä<öýÿí8vä>ö(öýÿí,Yä+öýÿí`*å)ö;öùÿõ}ö 4äðî âüö8vð{öùÿõýÿí,Yäbõýÿí`*å;öùÿõDõ*öOõ;öùÿõ}ö ¸h0î â€ö8vð{öùÿõýÿí,Yäaõýÿí`*å;öùÿõDõ*öOõ;öùÿõ}ö ¬ìœîâö8vð{öùÿõDõýÿí,Yä;öùÿõ}úàÜîâøö8vð:öýÿí,Yä(öýÿí`*å)ö,öùÿõýÿíLnä(öýÿí8vä(ö)ö)öùÿõ{öùÿõ}ö¸øÜæàøœæø0æ0øðæXø æ€øPæ¨ùæÐøœæütæä P¼€Õ)åÕ)èpä"è,Õ)äÕ)è”á)h&¼€äøäp ãሼ€ä€øâ´(¢ 䘤æ ìଢäÄÐæ äæ¼Ï)8êäðüæ â  ”Ï)äd± õæÔ¬èœ„«ôh&± ä ä„ãå± ä” â´ÄõCâÌè â Ü`«ä4Ô£ôápð ´"Ì"Ø|耩h&Ô£äÜäTãálÔ£ädÜâ˜(¢ ä|ˆæ ì´øß ä¨êЄ äÄêì<ôäà´æМäüê"œL¢È4L¢Tÿèä€ì€âÜâôáâ¬l/äœì ∠è01äœîÐ4L¢ ÿèäHä8ä€âÜ âüáâ âˆæd|,å8ì€@)ù0"åˆìL¸nä¬4¸nèÿèäì€âÜâõáâ0l/äœî01äœêüDä\4D˜ÿèäÄì€âÜâöáâàl/äœî01äœêÈR ä 4R Hâÿèätì€âÜâ÷áâ€Bä8ê¬PDä8î@)õ\l‹äØ4l‹âÿèä@ì€âÜâøáæ|,å8ê(°Ú äl4°Ú ¨âÿèäÔä8â€âÜâùáâð|,å8ê @)ù0"åœêô¬ùä84¬ùtâÿèä ä8ä€âÜâúáâ¼€Bä8ìØPDä8î@)õÀTmä4Tm@ÿèälä8ä€âÜâûá∀Bä8ì¤PDä8î@)õd töäÐ4tö ÿèä8 ì€âÜ âýáæT#åT ê æ äø tŽät 4tް ÿèäÜ äˆä€âÜ âþáæT#åT êŒ!Üó ä!4Üó D!ÿèäp!ì€âÜ âÿáæT#åœê<"Ðmäœ!4ÐmØ!ÿèä"ì€âÜ ãáâ "l/äT î01äT îÔ) äL"4Ô) ˆ"ÿèô€âÜâáæÄðâ#Ô£ôápäDNä0Nçh&ô‹äÌ"ä4#ãáL#Ô£äD#Ì"âh#(¢ ä\#ê„#øß äx#ê #„ ä”#ê¼#<ôä°#´æØ#МäÌ#ê"´*L¢Ô&è##L¢$$î˜$öäP$ì€âÌ"äáâ|$l/äl$ì æ è01äl$ê %4%ççäçæáááxýâl/l$ä½á @01l$â¾á @ÒáÌ& äd%äÒáÌ& ìé%$&øé¼%üál$äè%ü:á&ä½ý âl$æ2éP&üè|&ül$ä¨&ü:&ä¾ÿáÜ&#L¢'î˜'öäD'ää€âÌ"äáâ`'|,åì|'@)ù0"õ (H(ççäçæáááxýâ|,áä‘á@@)é’á@0"é“á @ãáÌ& ä`(ä8áä Œ(t)È(ô:â¸(ä8)ü âÈ(æää(äçâ)èì)ÿôh&äÒ È(æÿä ä)|)áä¨)ü:áÔ)ä‘ý âæ D*ì)é*ü:áä“ÿáL*éx*ü:á¤*ä’ý ìL-¸näÄ*#¸ná+îd+öä,+ì€âÌ"äáâH+l/äl$î01äl$êØ+á,ççäçæáááxýâl/l$â¸á @01l$â¹á @ÔáÌ& ä,äéD,È,øèp,ül$äœ,ü:&ä¸ýèô,ül$ä -ü:&ä¹ýä/Dä\-#D˜-îü-öäÄ-ì€âÌ"äáâà-l/äl$î01äl$êp.˜.ççäçæáááxýâl/l$â³á @01l$â´á @ÖáÌ& ä°.äéÜ.`/øè/ül$ä4/ü:&ä³ýèŒ/ül$ä¸/ü:&ä´ý¬3R äô/#R 00î°0öä\0ì€âÌ"äáâx0€Bäê”0PDäî@)õ$1`1ççäçæáááxýâ€Bâ­á @PDâ®á@@)é¯á @ÙáÌ& äx1ä8é ¤1Œ2à1ô:âÐ1äP2ü âà1æäü1ïá2èê42èÿæh& b à1æÿäì2”2äÀ2ü:Ô)ä­ýL3ô2ä 3ü:Ô)ä®ÿáT3é€3ü:á¤*ä¯ý6l‹ä¼3#l‹ø3î@4öä$4ì€âÌ"äáæ|,åê´4È4ççäçæáááxýâ|,áâ©á @ÛáÌ& äà4ä8é 5¼5H5ô:â85ä€5ü âH5æäd5ïíêh&Äy H5æÿè Ä5äð5ü:Ô)ä©ý<:°Ú ä,6#°Ú h6îè6öä”6äâ€âÌ"äáâ°6|,åêÌ6@)ù0"ål$ê\7˜7ççäçæáááxýâ|,áâ£á@@)é¤á@0"ál$â¥á @ÝáÌ& ä°7ä8ä Ü7Ä88ô:â8äˆ8ü â8æä48äçáP8èêl8ÿôh& 8æÿä$9Ì8äø8ü:Ô)ä£ý Ü9,92éX9üè„9ül$ä°9ü:&ä¥ÿáä9é:ü:á¤*ä¤ý>¬ùäL:#¬ùˆ:î;öä´:ää€âÌ"äáâÐ:€Bäìì:PDäî@)õ|;¸;ççäçæáááxýâ€Bäá @PDâžá@@)éŸá @ßáÌ& äÐ;ä8áä ü;ä<8<ô:â(<ä¨<ü â8<æäT<äçáp<èìŒ<èÿæh&Ô8<æÿä D=ì<áä=ü:áÔ)äý¤=L=äx=ü:Ô)äžÿá¬=éØ=ü:á¤*äŸýÌATmä>#TmP>îÐ>öä|>ää€âÌ"äáâ˜>€Bäì´>PDäî@)õD?€?ççäçæáááxýâ€Bä—á @PDâ˜á@@)é™á @ááÌ& ä˜?ä8áäÄ?¬@á@ô:âð?äp@ü ã@æä@äçá8@èìT@èÿæ h&D• á@æÿä A´@áäà@ü:áÔ)ä—ýlAAä@Aü:Ô)ä˜ÿátAé Aü:á¤*ä™ýðFtöäÜA#töBî`BöäDBì€âÌ"äáæT#ål$êÔBèBççäçæáááxýâT#ál$âá @æáÌ& åCä2 €è,Cü7 è XCE@Fôè„CDøè°Cül$äÜCü:&äý8é4DäpDô:â`DäœDü âpDæô€âÌ"äáâ#Ô) pDâêØDþLEççäçæáááxýâîáÌ& ädEä4êÿÿýé¼Eü2éèEü8éFäpDô:â`DäœDü2èlFüè˜Fül$äÄFü:&äýÔHtŽåG#tŽöÿÿô;öqõýÿí@)å)öùÿõýÿíL¢ä(ö*öqõýÿí€Bä,ö*öqõýÿíPDä)ö;öùÿõ}öùÿõDõýÿî,å;öùÿõ}ö Ô›t•lîC⌕öÄð{öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõÿÿô;öùÿõ!õýÿí(¢ ä*öýÿíð*å=öýÿí|,å;öùÿõýÿíä¶ äýÿíP&å=öÿÿô;öùÿõ>õ(ö!öýÿí¸nä(ö*öýÿíð*å,öýÿí0"å)ö)öùÿõ{öùÿõpõýÿíP&å;öùÿõ;õ(öýÿíP&åjõýÿí@)å)öùÿõDõÿÿô;öùÿõpõýÿíð*å;öùÿõ}öùÿõDõýÿíð*å;öùÿõ}ö ÈŸœØî'â œöÄð{öùÿõýÿíä¶ äýÿíˆÏä=öÿÿô;öùÿõ>õ(ö!öýÿí¸nä(ö*öýÿí|,å,öýÿíÄä(ö)ö)ö)öùÿõ{öùÿõpõýÿí|,å;öùÿõpõýÿíˆÏä;öùÿõ}öùÿõDõýÿíˆÏä;öùÿõ}ö ,¦üŸ îAâ öÄð{öùÿõ@õ(öýÿíä¶ äýÿíP&å=öÿÿô;öýÿíP&å<öýÿí@)å;öpõýÿíP&å,öpõýÿí€Bä,öpõýÿíPDä)öùÿõ{öùÿõ;õ(öýÿíDä(ö*öýÿí€Bä,ö*öýÿíPDä)ö)öùÿõDõ-öÿÿìæ;öùÿõ;õ(öýÿíDä(ö*öýÿíPDä,ö*öýÿí€Bä)ö)öùÿõDõÿÿìæ;öùÿõ}öùÿõDõÿÿô;öùÿõ}ö P§`¦\î âx¦öÄð{öùÿõDõýÿíl/ä<öýÿí01ä;öùÿõ}ö t¨„§¬î ✧öÄð{öùÿõDõýÿíl/äjõýÿí01ä;öùÿõ}ú¨¨îâÀ¨öÄð{öùÿõýÿíl/ä=öýÿí01ä;öùÿõ}ö¨©ø|æЩøæø©ø¬æ ªø\æHªø æpªøØæ˜ªølæÀªø8æèªøæ«øÐæ8«øt æü!æèt«è ìäÌ«± õè,¬>ä¬êh&„Þä„«äì«ãå± äü«„«â¬ôâÌ"èät¬± õì>䬬êh&”nä,¬ä”¬ãå± ä¤¬,¬âÀ¬ôâDNèä,­œ@õæ¯èd­È­ôh&œ@äÔ¬äL­ãåœ@ä\­Ô¬â|­ÄõCâ”­è âܤ­è¸­è ì䮜@õèp®­äH®êh&èÝäÈ­ä0®ãåœ@ä@®È­â\®ôâÌ"è丮œ@õì­äð®êh&ÜNäp®äØ®ãåœ@äè®p®â¯ôâDNèäp¯¬• ôpäÜè ÌÀ)l²äÀ)èdÍ)h&¬• ä¯ä¯ãᨯ¬• ä ¯¯âįDZ丯êà¯`œäÔ¯ê°4à äð¯ü¯æ â °æ ì8°Ìýä ,°ü¯äd°ŒÍäH°T°æ â ° 䀰`“ä t°T°äœ°ÐAä° °æLÀ)8* 䬰´°âä ±8* ôápäÔ±J¯ä”±ð¬±âp¯8* ä´°ä,±ãáD±8* ä<±´°æ@îäT±`±æ â¯p±è„±è æè´>ãÿèT±æä,²8* ôápäì†)謆)ðĆ)âL²8* äÔ±äD†)ãáh&¤Ãäl²ä¸„)ãáâL²¬• ôpäȲJ¯ä´²û䳬• õè\³J¯äH³êh& º äȲä0³ã嬕 ä@³Ȳö⤳¬• ôêJ¯ä¤„)èh&XÍä\³äijãáܳ¬• äÔ³\³âL´8* äì³ô³âÿáíæ°޳äøh´DZä\´ê„´`œäx´ê ´4à ä”´¼Ræ¼´Ìýä °´¼R䨴ŒÍäÌ´äOæô´`“ä è´äOäµÐAäµê"ãì{öùÿõ}öp¯`/œ¸î°·ä¼šïäȸ4¹èâ¯äeå东1 äèµðˆ$å¹ê â¹ ä ⯠¹èD·ü¹â@¼àX ⨹ü »öœö ð{öùÿõýÿíàX ä(öýÿíl ä,öýÿíR ä,ö õýÿíà?ä<öýÿíœö ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öh&àX Ü»î@¹ädšïäø»ìâ$¼l ä¼ì ðR ä¼ô¼ât¿àX ⨼ü¸¾ö´ ñ{öùÿõ@õ(ö;öýÿíl ä<öýÿíR ä;öpõýÿíl ä)öùÿõýÿíàX ä(ö&ö*öýÿíl ä)ö;öùÿõ}öh&àX ô¾î@¼ä¬£ïä¿ìâ<¿l ä,¿ì ìX¿R ä,¿ðˆ$ääDôÄ¿â¨ÂàX âÜ¿üìÁöœö ð{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõýÿíàX ä(ö&ö*öýÿíl ä)ö;öùÿõ}öh&àX (Âît¿ä£ïäDÂìâpÂl ä`Âì ìŒÂR ä`Âðˆ$ä|GôøÂâ¬ÄàX âÃüÄö>ñ{öùÿõýÿí4à ärõ~öýÿí>å(ö)ö;öùÿõ}öh&àX TÄî¨Âäd¢ïäpÄìæ4à äŒÄì âœÄæ ôüÄâŒÇ¸ â,ÅüLÆòÅÐ ô ”áî{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸ˆÆî¬Äät¡ï䤯ìâ(ÇÌ/åÀÆê âÐÆ ä â $PàÆÇäôÆè ðâÇè äê<0åDÇê âTÇ ä â $PdÇxÇäôÆìâÇðÜÇâ”ʸ â$ÈüDÉòôÇÐ ð È ”áòà”áî{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸€ÉîŒÇäÔ ïäœÉìâ ÊÌ/å¸Éê âÈÉ ä â $PØÉüÉäìÉè ðâÊè äê<0å<Êê âLÊ ä â $P\ÊpÊäìÉìâ„Êè äîäÊâ,ÍÌ âËüìËòüÊÐ ô ”áî{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}öh&Ì(Ìî”ÊäüŸïäDÌìâÈÌÌ/å`Ìê âpÌ ä â $P€Ì¤Ìä”Ìè ðâ¸Ìè äê<0åäÌê âôÌ ä â $PÍÍä”Ììâ¸Ìð|ÍâìÏÌ âÄÍüœÎò”ÍÐ ð¬Í ”áòà”áî{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}öh&ÌØÎî,ÍäÌžïäôÎìâxÏÌ/åÏê â Ï ä â $P0ÏTÏäDÏè ðâhÏè äê<0å”Ïê â¤Ï ä â $P´ÏÈÏäDÏìâÜÏè äî<ÐâÌÒð âlÐüŒÑòTÐÐ ô ”áî{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}öh&ðÈÑîìÏä`gïääÑìâhÒÌ/æÒê âÒ ä â $P ÒDÒä4Òè ðâXÒè äê<0å„Òê â”Ò ä â $P¤Ò¸Òä4ÒìâXÒðÓâÔÕð âdÓü„Ôò4ÓÐ ðLÓ ”áòà”áî{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}öh&ðÀÔîÌÒäXfïäÜÔìâ`ÕÌ/åøÔê âÕ ä â $PÕ<Õä,Õè ðâPÕè äê<0å|Õê âŒÕ ä â $PœÕ°Õä,ÕìâÄÕè äî$Öâ,Ù¸âTÖüì×ò<ÖÐ ô ”áî{öùÿõDõýÿíÌ/å.öýÿí¼e ä(ö)ö<öýÿí<0å.öýÿí¼e ä(ö)ö;öùÿõ}öh&¸(ØîÔÕädnïäDØìâÈØÌ/å`Øê âpØ ä â $P€Ø¤Øä”Øè ðâ¸Øè äê<0åäØê âôØ ä â $PÙÙ䔨ìâ¸Øð|Ùâ¬Ü¸âÄÙü\Ûò”ÙÐ ð¬Ù ”áòà”áî{öùÿõDõýÿíÌ/å.öýÿí¼e ä(ö)ö<öýÿí<0å.öýÿí¼e ä(ö)ö;öùÿõ}öh&¸˜Ûî,Ùäðmïä´Ûìâ8ÜÌ/åÐÛê âàÛ ä â $PðÛÜäÜè ðâ(Üè äê<0åTÜê âdÜ ä â $Pt܈ÜäÜìâœÜè äîüÜâŒß`4 â,ÝüLÞòÝÐ ô ”áî{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`4ˆÞî¬Üä„mïä¤Þìâ(ßÌ/åÀÞê âÐÞ ä â $PàÞßäôÞè ðâßè äê<0åDßê âTß ä â $PdßxßäôÞìâßðÜßâ”â`4 â$àüDáòôßÐ ð à ”áòà”áî{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`4€áîŒßäDmïäœáìâ âÌ/å¸áê âÈá ä â $PØáüáäìáè ðââè äê<0å<âê âLâ ä â $P\âpâäìáìâ„âè äîäââìå5âãü¬äòüâÐ ô ”áî{öùÿõDõýÿíÌ/å.öýÿí¼e ä(ö)öjõýÿí<0å.öýÿí¼e ä(ö)ö;öùÿõ}öh&5èäî”âäTlïäåìâˆåÌ/å åê â0å ä â $P@ådåäTåè ðâxåè äê<0å¤åê â´å ä â $PÄåØåäTåìâxåð<æâlé5â„æüèòTæÐ ðlæ ”áòà”áî{öùÿõDõýÿíÌ/å.öýÿí¼e ä(ö)öjõýÿí<0å.öýÿí¼e ä(ö)ö;öùÿõ}öh&5XèîìåäðkïätèìâøèÌ/åèê â è ä â $P°èÔèäÄèè ðâèèè äê<0åéê â$é ä â $P4éHéäÄèìâ\éè äî¼éâŒí¸âêü,ìòÔéÐ ðìé ”áòà”áî{öùÿõDõ õýÿíÐ ävõýÿí`œä(öýÿíÌ/å.öýÿí¼e ä(ö)ö-öýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&¸hìîléäÐkïä¤ìä„ìäâ â ”ì`œ ìíÌ/åÀìê âÐì ä â $Pàìôìä”ììâíè äê<0å4íê âDí ä â $PTíhíä”ììâ|íè äîÜíâñâ îü¤ïòôíÐ ô î{öùÿõDõýÿíðå<öýÿíÐ ä,öýÿí ä>ö(öýÿí<0å)öaõýÿí@)å;öùÿõ}öh&àïîŒíä|kïäTðäüïäâ â $P ð0ðä ðè ðâDðè 俏ð@)åpðì â €ð`œ â $Pð¤ðä ðìâDðì<0åÔðê âäð ä â $Pôðñä ðìâDðèVPälñâtó`/ â„ñü\òö„oâì:öýÿí¼Žä(öýÿíP&å.öýÿí¼Žä)ö{ö}ö|P`/˜òëñäèwïäÄòìâ$Pìðòœ1 äàòì â$PèP&å óê âó ä â $P,óPóä@óè ðâdóè æìÄóâH3)¸ âÜóüüôöe ð{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸8õîtóä wïäTõìâø2)Ì/åpõê â€õ ä â õÔ2)äèõáD è,ÿèpäðèlÿä„ÿè ¸  h&áD äõäöãá öáD äöõâ\ö¨‘ä0ö<öæ â Lö¨‘ ì˜ö„ÿ älöxöæ â ˆö„ÿ ìèöL ä¨ö´öæ â ÄöL âðPÔöèxöè8÷ÐAäøö÷æ â ÷ÐA âðP$÷è<öèˆ÷`œäH÷T÷æ â d÷`œ âðPt÷èxöè¤÷4à ä˜÷êÀ÷ŒÍä´÷÷æø`/äÐ÷èõ`/ øPÿèä8øì€âõâ7ådøœ1 äTøì âõèP&倸ê âxö ä$ù„ä øèõ„Üøÿèäùä÷䀀âõâ8éœ1 äTøê"pú8Èù4ùèõ8pùÿèä¬ùäœùä€âõâ9å âõ èœ1 äTøðÐùèõ8 úÿèä8úäõä€âõâ:åTúœ1 äTøðˆ$ô"¬ûÈû€úèõȼúÿèäèúäœùä€âõâ;éœ1 äTøð ûèõÈHûÿèätûäõä€âõâ<åûœ1 äTøðˆ$ô\üô"ä¼ûèõô"øûÿèä$üäœùä€âõâ=å@üœ1 äTøð@)åT÷ì ýälüèõ¨üÿèäÔüäõ䀀âõâ>åðüœ1 äTøî@)åT÷ì¼ý,"äýèõ,"Xýÿèä„ýäœùä€âõ â?å ýœ1 äTøð@)åT÷ìlþ¸äÌýèõ¸þÿèä4þäõ䀀âõ â@åPþœ1 äTøî@)åT÷ìÿää|þèõä¸þÿèääþä÷䀀âõ âAæÿœ1 äTøî@)åT÷ì\ÿ˜Îä,ÿá Dÿ˜Îxöèåà$ˆöìà$äDÿäe ðxä|þîâ¸ÿò{öDõýÿí˜Îä[öýÿí@)å]ö;ö}ö´äÌýî â¬ò{öDõýÿîD ä(ö*öOõ)öbõýÿí@)å;ö}öØäýî âèò{öýÿí˜Îäbõýÿí@)å;öDõ*öOõ;ö}öälüî â ò{öDõýÿîD ä(ö*öOõ)öaõýÿí@)å;ö}ö8ä¼ûî âHò{öýÿí˜Îäaõýÿí@)å;öDõ*öOõ;ö}öä ûîâlò{öýÿîD äýÿí`Tä(ö*öOõ)ö;öJõqõ(ö)ö;öDõýÿí`Tä;ö}öä€úî â8ò{öqõýÿí˜Îä;öDõ*öOõ;ö}öÜ äÐùîâDò{öýÿîD äýÿí`Tä(ö*öOõ)ö;öJõpõ(ö)ö;öDõýÿí`Tä;ö}öè ä4ùî â ò{öpõýÿí˜Îä;öDõ*öOõ;ö}öÜ ä øîâ ò{öDõýÿíà$ä(öýÿí˜Îä)ö;ö}þÐ÷îâ ò:öýÿí˜Îä(öýÿíP&å)ö{ö}öà ø0öæ ølöæ0 ø¨öæX øøöæ€ øH÷æ¨ ø´÷æÐ øÐ÷æø ø øæ ø4ùæHøÐùæpø€úæ˜ø ûæÀø¼ûæèølüæøýæ8øÌýæøø`æè¸ääöä¬äT÷êÈèœùöœùòˆöè ø|þæàøHæxè5Ìäöä”ò°èœùöœùòˆöè øæ8踌äöäTòpèœùöœùòˆöèÈø,ÿæüDÿæäH¸Pôáp䈺ä¼2)öh¸Päðä¤2)ãáh&œFäˆäü1) ãáähœFôpä\èàäèPøT}ôœî|äDîâ´òhl_ €ÿèäðä¬ä€€âˆâ6å â ¼ÐA âðPÌèàè ìœ1 ä ê âˆäH¸$å8ì äêˆ$ädì âðtæˆè4ÿê{öýÿí¤U äýÿí`Tä=ö*öýÿí¸$å;öDõ*ö(öýÿílä*ö)ö(ö&öýÿí`Tä)ö;ö}ö ä°îâ¼òhl_ ìÿèää¬ä€€âˆâ5å4œ1 ä êP¸$å8ðˆ$älì âð|æè4êþ{öDõ*ö(öýÿílä*ö)ö(ö&ö*öýÿí¸$å)ö;ö}þ@îâàòh |ÿèä¨ä¬ä€€âˆâ4åÄœ1 ä î¸$å8ì{öDõýÿíl_ ä(öýÿí¸$å,öýÿí¸Pä<öýÿíT¾ävõýÿí¬2ä<öõ(ö*öýÿí¸$å)ö>övõýÿíxQä>ö(ö)ö)ö;ö}ö„øxæàæ¸ø¬æ8æàøðèHøææ â $ŒÍ âðP4è8è°øpæ|æ â ŒÐA âðPœè8èäøØæ¬æ ø@æ4ø°æüDæä´üdôápäø!èd ä” èX!h&üdä\äÔãáìüdää\⨑äüæ ìD„ÿ ä(4æ äæ”ÐAäT`æ â pÐA âðP€èì 䤴 àÿèä ä`䀀â\â3å8 œ1 ä( ê â\è¸$åT ê â4 ä| T}ôœö¤îâÈ ò{öDõ*öýÿí¸$å;ö}ö€!øüæ¨!ø(æÐ!øTæü¤æäP"(6è´kèpäÀpÂ"èäPmèÈop"(6äø!äèjãáh&ìKä"äøi ãáäp"ìKèè"èpäÀQèh#äÌ#è ìG å– á#è â#æ â   #D#ä4#è ðâX#è 俀#ÄõCâ˜#è âܨ#è¼#è ìP(á$0$î$âð$ò$ÄõCîp"øtl$ÿèä˜$쀀â"â+åÄ$œ1 ä´$ê â"è¼"åà$ê â" ä{öùÿõDõXõ<öõ>ö(ö!ö(öXõ<öõ>ö(öýÿí– äkõÿÿô)ö^öXõ<öõ>ö(öýÿí¼"å.öýÿí– äkõÿÿô)ö)ö)ö;öùÿõ}ö .„(´(î2âT)òœ(ÄõCîp"8ð(ÿèä)äø!ä€â"â*å8)œ1 ä´$ðˆ$ô{öùÿõýÿí(6äýÿíˆõä(öýÿîCävõýÿítŽä(öýÿí– ärõýÿíÜ¿ ä(ö)ö)ö,öýÿí– ä)ö;öùÿõ;õ(öýÿîCävõýÿíÐmä(öýÿí– ärõýÿí Ä ä(ö)ö,öýÿîCävõýÿíÔ) ä(ö)ö)ö)öùÿõýÿí– ä=öÿÿô;öùÿõDõýÿíˆõä;öùÿõ}ö ¬28.h.î(âì.òP.ÄõCîp"8¤.ÿèäÐ.äà$ä€â"â)éœ1 ä´$ì{öùÿõýÿí– ärõýÿíÜ¿ ä(ö)ö;öùÿõ;õ(öýÿîCävõýÿíÐmä(öýÿí– ärõýÿí Ä ä(ö)ö,öýÿîCävõýÿíÔ) ä(ö)ö)ö)öùÿõýÿí– ä=öÿÿô;öùÿõDõ*öOõ;öùÿõ}ö 5à23îâ”3òø2ÄõCîp"„L3ÿèäx3ä4#䀀â"â(éœ1 ä´$ê{öùÿõDõýÿîCävõýÿítŽä(öýÿí– ärõýÿí Ä ä(ö)ö)ö;öùÿõ}ö ô9H5x5î(â46ò`5ÄõCîp"`/´5ÿèäà5(6è€â"â'åü5œ1 ä´$ðð*å6ê âø! ð:öýÿí– ä(öýÿíð*å.öýÿí– ä)öùÿõ{öùÿõ;õ(öýÿí– äkõÿÿôiõýÿîCävõýÿíÐmä(öýÿí– ärõýÿí Ä ä(ö)ö,öýÿîCävõýÿíÔ) ä(ö)ö)ö)öùÿõýÿí– ä=öÿÿô;öùÿõ}ö ”>(:X:î&â;ò@:ÄõCîp"`/”:ÿèäÀ:ø:è€â"â&åÜ:œ1 ä´$ð|,æ#ø:öýÿí– ä(öýÿí|,å)öùÿõ{öùÿõ;õ(öýÿí– äkõÿÿôiõýÿîCävõýÿíÐmä(öýÿí– ärõýÿí Ä ä(ö)ö,öýÿîCävõýÿíÔ) ä(ö)ö)ö)öùÿõýÿí– ä=öÿÿô;öùÿõ}ö FÈ>ø>î*â0Bòà>ÄõCîp"`/4?ÿèä`?$Bè€â"â%å|?œ1 ä´$ð|,å˜?ì â¨? ä â ¸?üAä@ Òõæ èH@¬@ôh& Òä¸?ä0@ãå Òä@@¸?â`@ÄõCâx@è â܈@èœ@è ìäô@ ÒõèTAê?ä,Aêh&üä¬@äAãå Òä$A¬@â@AôâÌ"èäœA Òõìê?äÔAêh&lXäTAä¼Aãå ÒäÌATAâèAôâDNèBä4#ìâX#ô:öýÿí– ä(öýÿí|,å.öýÿí¤ä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí– äkõÿÿôiõýÿîCävõýÿíÐmä(öýÿí– ärõýÿí Ä ä(ö)ö,öýÿîCävõýÿíÔ) ä(ö)ö)ö)öùÿõýÿí– ä=öÿÿô;öùÿõ}úTF„Fî âGòlFÄõCîp"`/ÀFÿèäìFGè€â"â$éœ1 ä´$ø:öýÿí– ä(öÿÿô)öùÿõ{öùÿõ}ö OøHæ â $HhNä|HLôápäðPèI(Jì Mâh&Lä$HäœHãá´HLä¬H$HâàHÐAäÄHÐHæ äæ I`œäðHüHæ äæ8I4à äI(Iæ äædIŒÍäHITIæ äêL ätI€Iæ ì¨IdJðÀI>áîØIðSïJļ âðIè âÐHê(ÉâJè âÐH äâpJLôápèVHäæÐPøX:æøPøx5æ Qø3æHQøh.æpQø´(æ˜Qø0$æüè"æäRàµõæTèPR´Rôh&àµäÀQä8RãåàµäHRÀQâhRÄõCâ€Rè âÜRè¤Rè ìäüRàµõè\SòQä4Sêh&T ä´RäSãåàµä,S´RâHSôâÌ"èä¤SàµõìòQäÜSêh&XŸ ä\SäÄSãåàµäÔS\SâðSôâDNèä\T¸A õæHVè”TøTôh&¸A äTä|Tãå¸A äŒTTâ¬TÄõCâÄTè âÜÔTèèTè ìä@U¸A õè U6TäxUêh&qäøTä`Uãå¸A äpUøTâŒUôâÌ"èäèU¸A õì6Tä Vêh&$0 ä UäVãå¸A äV Uâ4VôâDNèä V¤J õæŒXèØV˜jX:ä x5°j„ä3Èj8Àjh.ä ´(Øjøtä0$ä– äè"ák(6äøjø!â¤k„äkP"„Lkÿèäxkä4#ä€âø!â"éœ1 ä”kì âø!ä,lá ä´káÌká 4#èå– äkè âôkæ â  llä4#ìâ¸OèñLwÄóCâdwè âÜtwèlqè Äx¼wÀuîâxòÔw>ñìwÄóCî{öùÿõDõ*öOõ;öùÿõ}÷ zøx4uîâ@yòy>ñ(yÄóCî{öùÿõDõ*öOõ;öùÿõ}ö <{4z tîâ|zòLz>ñdzÄóCî{öùÿõDõ*öOõ;öùÿõ}ö @~p{Àsîâ¸{òˆ{>ñ {ÄóCî{öùÿõ*öýÿíÀA änõýÿíxQä;öùÿõ;õ(öýÿíŒÍ äkõÿÿô)öùÿõ*öýÿíÀA änõýÿíŒÍ ä;öùÿõDõ*öOõ;öùÿõ}ö <€t~Ôrîâ¼~òŒ~>ñ¤~ÄóCî:öýÿíÀA ä(ö&öýÿí|,å)ö,öùÿõýÿíŒÍ ä(öýÿíøä)öùÿõ{öùÿõ}úp€ rî⸀òˆ€>ñ €ÄóCî:öýÿíÀA ä(ö&öýÿí|,å)ö,öùÿõýÿíŒÍ ä(öÿÿô)öùÿõ{öùÿõ}ö`‚ø`q戂øŒqæ°‚ø¸qæØ‚ø ræáƒøÔræ(ƒøÀsæPƒø tæxƒø4uæ ƒøÀuæȃøpvæüÐvæäH„xâ è<‰èpä›èĉäHŠè¨–h&xâ äðƒäh„ ãငxâ äx„ðƒâ¬„(¢ 䄜„æ 俨„¬¢ä¼„È„æ äæ,…œXäè„ô„æ â ¸?……䜄ìâÈ„è"ˆ†`/Ð…<…H„`/x…ÿè䤅ì€âðƒâéœ1 äÀ…ì âðƒèØ…H„`/†ÿèä@†ì€âðƒâå\†œ1 äÀ…ð|,åx†ì âô„ ä<‡„䘆H„„Ô†ÿèä ‡å‡â€€âðƒâå ⇠ä ðœ1 äÀ…êà‡TäL‡H„Tˆ‡ÿèäć䴇 âðƒâå â‡êœ1 äÀ…ê",‰8„ˆð‡H„8,ˆÿèähˆäXˆä€âðƒâå âðƒ èœ1 äÀ…ðŒˆH„8Ȉÿèäôˆäðƒä€âðƒâ剜1 äÀ…ðˆ$ô´‰„`ä<‰á œ‰„`T‰è âd‰æ â ¸?t‰ˆ‰äœ„ìâÈ„èå¼* ‡ì¼* ä œ‰܉>ñô‰Äî0ŠáCâ Šè â܊蜄ìðSî ÔŒ|ŠŒˆîâÜŠò”Š>ñ¬ŠÄîÄŠáCòðSî{öùÿõýÿíxâ äýÿí`Tä(ö*öOõ)ö;öùÿõJõpõ(ö)ö;öùÿõDõýÿí`Tä;öùÿõ}ö ¨ð‡îâhò >ñ8ÄîPáCòðSî{öùÿõ;õ(ö!ö(ö*öýÿí„`äoõýÿí¼* ä)ö)öùÿõýÿí„`ä=öÿÿô;öùÿõDõ*öOõ;öùÿõ}ö üÜL‡îâ<òô>ñ Äî$áCòðSî{öùÿõDõ&öýÿí¼* ä;öùÿõ}ö 8’0‘˜†îâ‘òH‘>ñ`‘Äîx‘áCòðSî{öùÿõDõýÿí¼* ä;öùÿõ}ö <•l’Ø…îâÌ’ò„’>ñœ’Äî´’áCòðSî:öýÿí„`ä(ö&öýÿí|,å)öùÿõ{öùÿõ;õ(ö!ö(ö*öýÿí„`äoõýÿí¼* ä)ö)öùÿõýÿí„`ä=öÿÿô;öùÿõ}úp•<…î âЕòˆ•>ñ •ÄáCòðSî:öýÿí„`ä(öÿÿô)öùÿõ{öùÿõ}öT—øЖæ â $Hà–ô–äÈHè—â‡è,—â—è äæ@—â´‡êã‡æ|—ø„椗ø¼„æÌ—øè„æô—ø<…æ˜øØ…æD˜ø˜†æl˜øL‡æ”˜øð‡æ¼˜øŒˆæä˜ø<‰æ ™øœ‰æšø4™æd™è5¸™äö䀙òœ™èXˆöXˆêÌ™ä‡èà™âœ„ä`Ãáô™âÈ„ìâ—äMeý0šæ`šè`4´šäöä|šò˜šèXˆöXˆêÈšä‡èܚ✄åaáðšâÈ„ìâ—èä \›à‡  ä¤›èpäô¨è  ä8 è´§h&à‡ ä›ä|›ãá”›à‡ äŒ››âœŒä¤›á Ü›Œ¼›è âÌ›æ ìå¤Ëáô›è â œL ì$œ¤Ëå Ü›@œlqå4œœæ\`/äPœ\›`/Œœÿè东ì€â›âå䜜1 äÔœì â›ä Ì/æì â ä ðP&å<ì â LL ì<ž2äl\›2¨ÿèäääÔä€â›âå â› åžœ1 äÔœðxQäžì â ,ž`“ ìО„äLž\›„ˆžÿèä´žäÔä€â›âéœ1 äÔœð8dŸàž\›8ŸÿèäHŸäÔä€â›âéœ1 äÔœðlŸ\›8¨ŸÿèäÔŸäÔä€â›âåðŸœ1 äÔœðˆ$ø(JðÐ ð D¡l lŸîâ„ öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö P¢x¡àžîâ¡öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö \£„¢Lžî✢öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö 襣lî⨣öÐ ð{öùÿõýÿí¤Ëå=öýÿíŒärõýÿíÐàä(öýÿí¤Ëå,öýÿíxQä)ö;öùÿõpõýÿí¤Ëå;öùÿõDõ*öOõ;öùÿõ}ú¦Pœîâ4¦öÐ ð:öýÿíŒä(ö&öýÿíÌ/å)ö,öùÿõýÿí¤Ëå(öýÿíP&å)öùÿõ{öùÿõ}öܧø¤›æ¨øÜ›æ,¨ø4œæT¨øPœæ|¨øl椨øLžæ̨øàžæülŸæä L©ܦx­ä”©èpäè´èŒ­ä¤­èгh&ܦäô¨äl©ãá„©ܦä|©ô¨âÌ©Œä”©åŒ¬©è ⼩æ ìè©lqåÜ©¼©æȪ`/äø©L©`/4ªPÿèä`ªì€âô¨â 匪œ1 ä|ªì âô¨èÌ/娪ì ⸪ ä 쨫2äتL©2«ÿèäP«ä@«ä€âô¨â å âô¨ äl«œ1 ä|ªðxQ䈫ì â ˜«`“ ì<¬„丫L©„ô«ÿèä ¬ä@«ä€âô¨âéœ1 ä|ªð8ЬL¬L©8ˆ¬ÿèä´¬ä@«ä€âô¨âéœ1 ä|ªðجL©8­ÿèä@­ä@«ä€âô¨âå\­œ1 ä|ªðˆ$ø(JðР𠰮حجîâð­öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö ¼¯ä®L¬îâü®öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö Ȱ𯸫îâ°öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö ”²ü°تîâ±öÐ ð{öùÿõýÿíŒärõýÿí Ú ä(öýÿíxQä)ö;öùÿõDõ*öOõ;öùÿõ}úȲø©î âà²öÐ ð:öýÿíŒä(ö&öýÿíÌ/å)öùÿõ{öùÿõ}öø³ø”©æ ´øÜ©æH´øø©æp´øت昴ø¸«æÀ´øL¬æüجæä @µ\D l¹äˆµèpäÜÀ耹䘹èÄ¿h&\D äè´ä`µãáxµ\D äpµè´âÀµŒäˆµåŒ µè â°µæ ìܵlqåе°µæ¼¶`/äìµ@µ`/(¶PÿèäT¶ì€âè´â倶œ1 äp¶ì âè´èÌ/圶ì ⬶ ä 윷2ä̶@µ2·ÿèäD·ä4·ä€âè´âå âè´ ä`·œ1 äp¶ðxQä|·ì â Œ·`“ ì0¸„䬷@µ„è·ÿèä¸ä4·ä€âè´â éœ1 äp¶ð8ĸ@¸@µ8|¸ÿè䨸ä4·ä€âè´â éœ1 äp¶ð̸@µ8¹ÿèä4¹ä4·ä€âè´â åP¹œ1 äp¶ðˆ$ø(JðÐ 𠤺̸̹îâä¹öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö °»غ@¸îâðºöÐ ð{öùÿõDõ*öOõ;öùÿõ}ö ¼¼ä»¬·îâü»öÐ ð{öùÿõDõ*öOõ;öùÿõ}ö ˆ¾ð¼̶îâ½öÐ ð{öùÿõýÿíŒärõýÿíÌoä(öýÿíxQä)ö;öùÿõDõ*öOõ;öùÿõ}ú¼¾ìµî âÔ¾öÐ ð:öýÿíŒä(ö&öýÿíÌ/å)öùÿõ{öùÿõ}öì¿øˆµæÀøеæ<ÀøìµædÀø̶æŒÀø¬·æ´Àø@¸æü̸æä4ÁL¸ è|Áèpä$Hè 8qPqL)èd-)h&L¸ äÜÀäTÁãálÁL¸ ädÁÜÀâ¤ÁL#ä|ÁåL#”Áè ìÀÁ€^ ä´Á”ÁæÂ`œäÐÁÜÁæ â ìÁ`œ âðPüÁè”Áè`ÂŒÍä Â,Âæ â <ÂŒÍ âðPLÂè”Áè°Â4à äpÂ|Âæ â ŒÂ4à âðPœÂè”Áè"„i`/TÃÀÂ4Á`/üÂÿèä(Ãì€âÜÀâøêœ1 äDÃì âÜÀä Ä\Ã4Á`/˜ÃPÿèäÄÃì€âÜÀâùæàÜ1 äDÃðÌ/åüÃì ðÄ4Á`/PÄîøÄä]ïä|ÄìâÜÀäå˜Äœ1 äDÃðä-å´Äê âÄÄ ä âÜÀÔÄèèÄè æäÁäHÅâ˜Æ`/ â`ÅüÄö´>ãì:öýÿíL#ä(öýÿíä-å.öýÿí¼e ä(ö)ö)öùÿõ{öùÿõ}þèÆâäÉ|ÔãÇüÉö<¬ ð{öùÿõDõýÿíØ› ä(öýÿíl ä,öýÿíR ä,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öh&|ÔLÉî˜Æä”\ïä¬ÉähÉäâ â xÉ`œ âðPˆÉèœÉè ìÈÉl äœÉðR äœÉô4ÊâÌØ› âLÊü$Ëö´ ñ{öùÿõDõýÿíR ä-öýÿíl ä;öùÿõ}öh&Ø› `ËîäÉä\ïäÀËä|Ëäâ â ŒË`œ âðPœËè°Ëè ìÜËl ä°ËìøËR ä°Ëðˆ$ääDôdÌâœÐØ› "â|Ìü¬Ïö<¬ ð{öùÿõ õýÿíà?ä<öýÿí<¬ ä>övõýÿí`œäýÿíˆõä=öÿÿô;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõpõýÿíˆõä;öùÿõDõýÿíˆõä;öùÿõ}öh&Ø› èÏîÌät[ïäHÐäÐäâ â Ð`œ âðP$Ðè8Ðè ìdÐl ä8Ðì€ÐR ä8Ððˆ$äÈHôìÐâÔÓoâÑüÓòÑ<¬ ôðSî{öùÿõýÿíøÖ ä(öýÿíP&å,öýÿí@)å,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öh&oPÓîœÐä[ïälÓìâ¨ÓP&åˆÓì â˜Ó ä ð@)åÄÓì äî$ÔâðÕøÖ âTÔüÕò<Ô´ õðSî{öùÿõýÿíP&åaõýÿí@)å;öùÿõ}öh&øÖ PÕîÔÓäPZïälÕìâ¨ÕP&åˆÕì â˜Õ ä ìÔÕ@)åÄÕì äêˆ$ääDô@Öâ<ÛøÖ *âpÖü`ÚòXÖü" ôðSî{öùÿõ;õ(öýÿí@)åmõÿÿô)öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öqõýÿí@)å)öùÿõpõýÿíP&å;öùÿõ<õùÿõ@õ(ö;öýÿí@)å<öÿÿô;öpõýÿí@)å)öùÿõqõýÿíP&å;öùÿõ}öh&øÖ œÚîðÕä<"ïä¸ÚìâôÚP&åÔÚì âäÚ ä ì Û@)åÛì äêˆ$ä0FôŒÛâHÞøÖ â¼ÛülÝò¤Û<¬ ôðSî{öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öqõýÿí@)å)öùÿõpõýÿíP&å;öùÿõ}öh&øÖ ¨Ýî<Ûä°!ïäÄÝìãÞP&åàÝì âðÝ ä ì,Þ@)åÞì äêˆ$äÈHô˜ÞâX)¼S âàÞüèßò°Þ>ñÈÞ ’ ò0ëî{öùÿõýÿíÌ/å.öýÿí¼Sä(öýÿí<0å)ö;öùÿõ}öZ¼S$àîHÞä4*ïä@àìâ iÌ/å\àì âlà ä â |à häÔà@è0èBpäPcè0ä(5è(^Z@ä|àäôàãá á@äá|àâ8á …äá(áæ ìЉ¤] äHáTáæ â dáÐA â táH†äÌáÔºôáçãè”âìÀz¨…âZÔºätáäìáãáâÔºäüátáâ0âÐAäâ âæ ì\âŒÍä@âLâæ â â äxâ`“ä lâLâèìŸ ä ˆâLâä¬â>õ„¡áçÄâIêðâxQôâ âáã¬wäXãlFôáæÌjèìaì eæxãlFåãäˆaãáZ„ ì˜ãâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõ˜óÿÿÿüìœÿÿÿÿÿèäÿÿÿÿÿðü²ÿÿÿÿð³ÿÿø,³ÿÿÿÿÿøD³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð\³äh´ÿÿÿÿÿÿ䀴ÿÿ蘴ÿà°´ÿÿÿÿÿÿÿÿÿÿèÈ´ìà´ÿÿÿÿÿøh_ÿà€_ÿÿÿÿÿÿÿÿÿè˜_ÿü°_ìÈ_à_ÿÿÿìXaÿÿÿÿÿÿìpaÿÿÿÿÿÿÿè,vä¨ó°óâäô,vôápä¤ôèŒôöxã,vä°óä(ôãá@ô,vä8ô°óæxQäPôâôxQä ÿì>ñäüôÅ ôápä˜õè€õöxãÅ ä¤ôäõãá4õÅ ä,õ¤ôæxQäDõâüôxQä ÿì>ñäðõý ôápäŒöètööxãý ä˜õäöãá(öý ä ö˜õæxQä8öâðõxQä ÿì>ñääöp· ôáæ èH÷`÷èàäâZp· äŒöä÷ãá÷p· ä÷Œöæ œ ä,÷8÷æ ð>ñâ¨÷p· ôápäàø¾öäÌøçZtvä`÷äÈ÷ãáà÷p· äØ÷`÷âü÷ œ äð÷î2ä ø¨÷2Høÿè䄸ätøäã`÷ì â`÷ ä°øè øì â`÷ðtøþâ(ùp· ôápä`ú¾öäLúçZ¤.äàøäHùãá`ùp· äXùàøâ|ù œ äpùî2äŒù(ù2Èùÿèäúäôùäãàøì âàø ä0úè úì âàøðôùþâ¨úp· ôápäàû¾öäÌûçZà1ä`úäÈúãáàúp· äØú`úâüú œ äðúî2ä û¨ú2Hûÿèä„ûätûäã`úì â`ú ä°ûè ûì â`úðtûþâ(üp· ôápä`ý¾öäLýçZiäàûäHüãá`üp· äXüàûâ|ü œ äpüî2äŒü(ü2Èüÿèäýäôüäãàûì âàû ä0ýè ýì âàûðôüþâ¨ýp· ôápäàþ¾öäÌþçZô/ä`ýäÈýãáàýp· äØý`ýâüý œ äðýî2ä þ¨ý2Hþÿèä„þätþäã`ýì â`ý ä°þè þì â`ýðtþþâ(ÿp· ôápä`¾öäLçZ(-äàþäHÿãá`ÿp· äXÿàþâ|ÿ œ äpÿî2äŒÿ(ÿ2Èÿÿèääôÿäãàþì âàþ ä0è ì âàþðôÿþâ¨p· ôápäà¾öäÌçZ¼,ä`äÈãáàp· äØ`âü œ äðî2ä ¨2Hÿèä„ätäã`ì â` ä°è ì â`ðtþâ(p· ôápä`¾öäLçZD.äàäHãá`p· äXàâ| œ äpî2äŒ(2Èÿèääôäãàì âà ä0è ì âàðôþâ¨p· ôápäà¾öäÌçZá*ä`äÈãáàp· äØ`âü œ äðî2ä ¨2Hÿèä„ätäã`ì â` ä°è ì â`ðtþâ(p· ôápä`¾öäLçZ,äàäHãá`p· äXàâ| œ äpî2äŒ(2Èÿèääôäãàì âà ä0è ì âàðôþâ¨p· ôápè¾öäÌçZtwä`äÈãáàp· äØ`âü œ äðî2ä ¨2Hÿèä„ätäã`ì â` ä°è ì â`ðtÿâì°äDp· ôápð˜èŒöêZp· äìädãá|p· ätìæ œ äŒî>ùÄè âÔæ ÿè,÷æäd ØÉõápäT èè ñ âZØÉå ä„ ãᜠØÉå”  æxQä¬ âd xQäÿì@7äÿç¬ ( âIíûä¬ |ôáæ è ìX ð âZ|äT äÌ ãáä |äÜ T æ œ äô á æ äæ( `öãë@ <¯áòœg òd x ä¼ |ôápð èT äP âZ|äd äÜ ãáô |äì d æ œ ä  æ äæ8 <¯õœg ÿê æ¸ ㌠è4ÿêÜ âÌ äveá ðâ ÿäô æäp ìôápä ~èô ð âZìä ä ãᨠìä   æxQä¸ âp xQäÿì>ÿí¸ 4âIê`xQôâ â pÈ}äÈÀÿôápäÄèLdòxãÀÿäpäèãâÀÿäøpæxQäâÈxQä ÿì>ñâ¬Àÿôápä¢åçxã,wädäÌãáäÀÿäÜdâ0xQäôâ¬xQä îü2ä@¬2|ÿèä¸ä¨äãdì âd ääèÔì âdð¨þâ\Àÿôápè¢ä°çxã˜wää|ãá”ÀÿäŒâàxQä¤â\xQä îü2äð\2,ÿèähäXäãì â ä”è„ì âðXþäȬ ôápä|è ð¸âxãȬ äÄä<ãáTȬ äLÄæxQädâxQäÿì>ÿídàâé üé8È{øédÈyøépwøé¼ wøéèŒrøéLpøé@ nøélkøé˜ÄdøIêÄxQôâ â Ô dä,, ôápä¸,è°Èòxã, äÔäLãád, ä\ÔæxQätâ,xQä ÿì>ñâ, ôápäxädçxã,™äÈä0ãáH, ä@Èâ”xQäXâxQä îü2ä¤2àÿèää äãÈì âÈ äHè8ì âÈð þâÀ, ôápä(äçx㜙äxäàãáø, äðxâDxQäâÀxQä îü2äTÀ2ÿèäÌä¼äãxì âx äøèèì âxð¼þâp, ôápäØäÄçxã4]ä(äãá¨, ä (âôxQä¸âpxQä îü2äp2@ÿèä|äläã(ì â( ä¨è˜ì â(ðlþâ , ôápäˆätçxã˜\äØä@ãáX, äPØâ¤xQähâ xQä îü2ä´ 2ðÿèä,ääãØì âØ äXèHì âØðþâÐ, ôápä8ä$çxãÔ^äˆäðãá, åˆâTxQäâÐxQä îü2ädÐ2 ÿèäÜäÌäãˆì ∠äèøì âˆðÌþâ€, ôápäè äÔ çxãÈ]ä8ä ãá¸, ä°8â xQäÈâ€xQä îü2ä €2P ÿèäŒ ä| äã8ì â8 ä¸ è¨ ì â8ð| þâ0!, ôápä˜"ä„"çxã4Wäè äP!ãáh!, ä`!è â´!xQäx!â0!xQä îü2äÄ!0!2á"ÿèä<"ä,"äãè ì âè  äh"èX"ì âè ð,"þâà", ôápäH$ä4$çxãàVä˜"å#ãá#, ä#˜"âd#xQä(#âà"xQä îü2ät#à"2°#ÿèäì#äÜ#äã˜"ì â˜" ä$è$ì â˜"ðÜ#þâ$, ôápäø%ää%çxãè¨äH$ä°$ãáÈ$, äÀ$H$â%xQäØ$â$xQä îü2ä$%$2`%ÿèäœ%äŒ%äãH$ì âH$ äÈ%è¸%ì âH$ðŒ%þâ@&, ôápä¨'ä”'çxã,Xäø%ä`&ãáx&, äp&ø%âÄ&xQäˆ&â@&xQä îü2äÔ&@&2'ÿèäL'ä<'äãø%ì âø% äx'èh'ì âø%ð<'þâð', ôápäX)äD)çxã”Xä¨'ä(ãá((, ä (¨'ât(xQä8(âð'xQä îü2ä„(ð'2À(ÿèäü(äì(äã¨'ì â¨' ä()è)ì â¨'ðì(þâ ), ôápä+äô*çxã¬WäX)äÀ)ãáØ), äÐ)X)â$*xQäè)â )xQä îü2ä4* )2p*ÿèä¬*äœ*äãX)ì âX) äØ*èÈ*ì âX)ðœ*þâP+, ôápèä¤,çx㬜ä+äp+ãáˆ+, ä€++âÔ+xQä˜+âP+xQä îü2ää+P+2 ,ÿèä\,äL,äã+ì â+ äˆ,èx,ì â+ðL,þä-ÈÝôápä´6èt-Œ-ìŒ6âZÈÝä¸,ä0-ãáH-ÈÝä@-¸,æ œ äX-d-æ ð>ñâÔ-ÈÝôápä /ê,äø.çZÅäŒ-äô-ãá .ÈÝä.Œ-â(. œ ä.î2ä8.Ô-2t.ÿèä°.ä .äãŒ-ì âŒ- äÜ.èÌ.ì âŒ-ð .þâT/ÈÝôápäŒ0ê,äx0çZÔñå /ät/ãáŒ/ÈÝä„/ /â¨/ œ äœ/î2ä¸/T/2ô/ÿèä00ä 0äã /ì â / ä\0èL0ì â /ð 0þâÔ0ÈÝôápä 2ê,äø1çZÈòåŒ0äô0ãá 1ÈÝä1Œ0â(1 œ ä1î2ä81Ô02t1ÿèä°1ä 1äãŒ0ì âŒ0 äÜ1èÌ1ì âŒ0ð 1þâT2ÈÝôápäŒ3ê,äx3çZXîå 2ät2ãáŒ2ÈÝä„2 2â¨2 œ äœ2î2ä¸2T22ô2ÿèä03ä 3äã 2ì â 2 ä\3èL3ì â 2ð 3þâÔ3ÈÝôápä 5ê,äø4çZøïåŒ3äô3ãá 4ÈÝä4Œ3â(4 œ ä4î2ä84Ô32t4ÿèä°4ä 4äãŒ3ì âŒ3 äÜ4èÌ4ì âŒ3ð 4þâT5ÈÝôápèê,äx6çZøîå 5ät5ãáŒ5ÈÝä„5 5â¨5 œ äœ5î2ä¸5T52ô5ÿèä06ä 6äã 5ì â 5 ä\6èL6ì â 5ð 6ÿúX-æä 7¼I ôápä°@èp7ˆ7ìˆ@âZ¼I ä´6ä,7ãáD7¼I ä<7´6æ œ äT7`7æ ð>ñâÐ7¼I ôápä9æ6äô8çZmäˆ7äð7ãá8¼I å8ˆ7â$8 œ ä8î2ä48Ð72p8ÿèä¬8äœ8äãˆ7ì âˆ7 äØ8èÈ8ì âˆ7ðœ8þâP9¼I ôápäˆ:æ6ät:çZúä9äp9ãáˆ9¼I ä€99â¤9 œ ä˜9î2ä´9P92ð9ÿèä,:ä:äã9ì â9 äX:èH:ì â9ð:þâÐ:¼I ôápä<æ6äô;çZÐúäˆ:äð:ãá;¼I å;ˆ:â$; œ ä;î2ä4;Ð:2p;ÿèä¬;äœ;äãˆ:ì âˆ: äØ;èÈ;ì âˆ:ðœ;þâP<¼I ôápäˆ=æ6ät=çZ”óä<äp<ãáˆ<¼I ä€<<â¤< œ ä˜<î2ä´<P<2ð<ÿèä,=ä=äã<ì â< äX=èH=ì â<ð=þâÐ=¼I ôápä?æ6äô>çZ(õäˆ=äð=ãá>¼I å>ˆ=â$> œ ä>î2ä4>Ð=2p>ÿèä¬>äœ>äãˆ=ì âˆ= äØ>èÈ>ì âˆ=ðœ>þâP?¼I ôápèæ6ät@çZpôä?äp?ãáˆ?¼I ä€??â¤? œ ä˜?î2ä´?P?2ð?ÿèä,@ä@äã?ì â? äX@èH@ì â?ð@ÿúT7æäAüHôápä4BèŒAð¤AâZüHä°@ä(Aãá@AüHä8A°@æxQäPAâAxQäÿì>ÿíPAÌAâéøAüIê$BxQôâ â 4B|däŒBŒŸ ôápäLDèCð(CâZŒŸ ä4Bä¬BãáÄBŒŸ ä¼B4BæxQäÔBâŒBxQäÿì>ÿíÔBPCâé|CìCøIê¨CÜCôæ°C4êÿÿÿÿÿÿÿÿ÷ ìIêDÜCôæ D4ÿêä¤Dd— ôápäŒbè(Eð@EâZd— äLDäÄDãáÜDd— äÔDLDæxQäìDâ¤DxQäÿì>ÿíìDhEâé”EüIêÀExQôâ â ÐE`ä(FhI ôáæHè¬FìÜFæZhI äÐEäHFãá`FhI äXFÐEæxQäpFâ(FxQä ÿèÄF>õ´>áòèFÜGä@GhI ôápðÄGèÐEêZhI äèFä`GãáxGhI äpGèFæxQäˆGâ@GxQä îü>òHäðGè ðâðGäamáälHôápäàHèÈ_ðà_âZäHäŒHãá¤HäœHHæ œ ä´HÀHæ â ÐH œ â àH\_ä8Iì ôáæàIèÔ]ì^4_âxãì äàHäXIãápIì ähIàHæ œ ä€IŒIæ â œI œ â àH¬I|]äÀIè â ÐI œ â àIX]ä8JìÔôápäTYèYð,YâxãìÔäàIäXJãápJìÔähJàIæ œ ä€JŒJæ â œJ œ â@j¬JèÀJè â ÐJ œ â àJŒPä8K¬² ôáæ@jèœKì´KdPâZ¬² äàJäXKãápK¬² ähKàJæ œ ä€KŒKæ ð>ñ àLÀK¼LäL¬² ôápð|LèàJä”LâZ¬² äÀKä8LãáPL¬² äHLÀKæ œ ä`LlLæ ð>ÿí`LæèÐLè âlLä NìLèMäDM¬² ôápð¨MèàJäÀMâZ¬² äìLädMãá|M¬² ätMìLæ œ äŒM˜Mæ ð>ÿíŒMæèüMè â˜Mä 8ONOäpN¬² ôápðÔNèàJäìNâZ¬² äNäNãá¨N¬² ä NNæ œ ä¸NÄNæ ð>ÿí¸Næè(Oè âÄNèDO@PäœO¬² ôápñPèàJäPâZ¬² äDOä¼OãáÔO¬² äÌODOæ œ ääOðOæ ð>ÿíäOæèTPè âðOÿâ€Kæè Pè â °P œ â ÀPèRäQÌ’ôáæàJè|Qì”QÀRâZÌ’äÀPä8QãáPQÌ’äHQÀPæ œ ä`QlQæ ð>õ QœRäøQÌ’ôápð\RèÀPätRâZÌ’ä QäRãá0RÌ’ä(R Qæ œ ä@RLRæ ð>ÿí@Ræè°Rè âLR ÿà`QæèüRè â  S œ â SðXätS¬›ôáæ¸VèØSìðSVâZ¬›äSä”Sãá¬S¬›ä¤SSæ œ ä¼SÈSæ ð>ñ UüSøTäTT¬›ôápð¸TèSäÐTâZ¬›äüSätTãáŒT¬›ä„TüSæ œ äœT¨Tæ ð>ÿíœTæè Uè ä¨Tî,U@Vä„U¬›ôápðèUèSäVâZ¬›ä,Uä¤Uãá¼U¬›ä´U,Uæ œ äÌUØUæ íV>õ<:ááÿçÌUæèTVè â ØUdVIêáÿ÷¼SæäWÿõáæÀPè„WìœWÈXâZÿå¸Vä0WãáHWÿå@W¸Væ œ äXWdWæ âtW ä ð>õ¨W´XåXÿõápðtXè¸VäŒXâZÿå¨Wä Xãá8Xÿå0X¨Wæ œ äHXTXæ âdX ä ð>ÿíHXæèTXÿäXWæèYè ð>ÿí€Jæä¬Yü1 ôáæSèZì(Z0]âZü1 äTYäÌYãáäYü1 äÜYTYæ œ äôYáZæ ð>ñ Œ[4Zd[äŒZü1 ôápð$[èTYä<[âZü1 ä4Zä¬ZãáÄZü1 ä¼Z4Zæ œ äÔZàZæ â ðZ œ âTYá[è[è ð>ÿíÔZæèx[è ä[î˜[à\äð[ü1 ôápðˆ\èTYä¸\âZü1 ä˜[ä\ãá(\ü1 ä \˜[æ œ ä8\D\æ â T\ œ âTYd\èx\è ì \>õ<:ááÿç8\æèô\è â x\]Iêáÿ÷ôYæèl]è ðâ]è â  ] œ âàI°]èÄ]è äæì]>õ´>áò^ _äh^ì ôápðÌ^èàHää^âxãì ä^äˆ^ãá ^ì ä˜^^æ œ ä°^¼^æ ð>ÿí°^æ _ä¼^ìâ¼^äilý€Iæ€_äp_è ðâ”_è â ¤_ œ âàI´_èp_ì>ÿí´Hæ,`ä`è ðâ@`è â P` œ â ``xbä¸`ô¯õáæ kèaì4aPbâZô¯å``äØ`ãáð`ô¯åè```æ œ åa aæ ð>õ@aÿíàaæèìaÿãaæè`èääb0ôápäÐEèhcð€câZ0äŒbäcãác0äcŒbæxQä,câäbxQäÿì>ÿí,c¨câéÔcüIëdxQôâ â ÐEd4dä$dè ðâHdè â Xd œ â khdè$dðdè ô´dè ìIêðdxQôâ âáekäXe̬ ôápäÔèÜeôeòxã̬ åeäxeãáe̬ äˆeáeæxQä eâXexQä ÿì>ñâñâl,Ìôápè†käämçxãà äHlä°lãáÈl,ÌäÀlHlâmxQäØlâlxQä îü2ä$ml2`mÿèäœmäŒmäãHlì âHl äÈmè¸mì âHlðŒmÿæ´dèIê8nxQôâ â Hn8pä nÈ ôápäTkè$oðÿíèndoâéoüIê¼oxQôâ â ÐEÌoðoäàoè ðâpè â p œ âàJ$pèàoð´dèIêxpxQôâ â ˆpxräàp: ôápäHnèdqð|qâxã: äˆpåqãáq: äqˆpæxQä(qâàpxQäÿì>ÿí(q¤qâéÐqüIêüqxQôâ â ÐE r0rä rè ðâDrè â Tr œ âÀPdrè rð´dèIê¸rxQôâ â Èr wä sp÷ôáæuè¤sì¼sæxãp÷äÈrä@sãáXsp÷äPsÈræxQähsâ sxQä ÿì>õÈsÔtä tp÷ôápð¤tèÈrêxãp÷äÈsä@tãáXtp÷äPtÈsæxQähtâ txQä îø¼t>õ´>áöètè âüt uæ äæ ìätu‹ôápäˆpèøuðvâxã‹äuä”uãá¬u‹ä¤uuæxQä¼uâtuxQäÿì>ÿí¼u8vâédvüIêvxQôâ â ÐE vÄvä´vè ðâØvè â èv œ âSøvè´vð´dèIêLwxQôâ âu\wè´dèIêœwxQôâ â ¬w´yäxRôápäÈrèˆxð xâxãRä¬wä$xãáÿíLxÈxâéôxˆyøé y\yøIêLyöâ ì4ëÿý4ëÿå´dèIêôyxQôâ â z´{ä\zˆð ôápä¬wèàzðøzâxãˆð äzä|zãá”zˆð äŒzzæxQä¤zâ\zxQäÿì>ÿí¤z {âéL{ˆ{øIêx{öâ ì4ê ÿå´dèIêô{xQôâ â |´}ä\|4îôápäzèà|ðø|âxã4îä|ä||ãá”|4îäŒ||æxQä¤|â\|xQäÿì>ÿí¤| }âéL}ˆ}øIêx}öâ ì4ë€ÿå´dðÜ}è â ì} œ âHü}è~è ìäx~|¶ôápäÐèü~ðâZ|¶ä ~ä˜~ãá°~|¶ä¨~ ~æxQäÀ~âx~xQäÿì>ÿíÀ~<âIêhxQôâ âpxèŒè â œ œ â@j¬èÀè ìä(€pŽ ôáp䴒謀ðÄ€âZpŽ äÐäH€ãá`€pŽ äX€ÐæxQäp€â(€xQäÿì>ÿíp€ì€âéüéD(Šøépà†øIêœxQôâ â ¬¼†ä‚Àôápä\ƒèˆ‚ð ‚âZÀä¬ä$‚ãá<‚Àä4‚¬æxQäL‚â‚xQäÿì>ÿíL‚È‚âIêô‚xQôâ âTkƒèƒè â (ƒ œ â@j8ƒèLƒè ìä´ƒn ôápä …è8„ðP„âZn ä\ƒäÔƒãáìƒn ääƒ\ƒæxQäüƒâ´ƒxQäÿì>ÿíüƒx„âI꤄xQôâ âáe´„èÈ„è â Ø„ œ â@jè„èü„è ìäd…Ôôápäpèè…ñ†âZÔä …ä„…ãᜅÔä”… …æxQ䬅âd…xQäÿì>ÿí¬…(†âIêT†xQôâ âÔd†èx†è â ˆ† œ â@j˜†è¬†è ôІè ìIê ‡xQôâ â ‡Šät‡¬2ôápä˜ˆèø‡ðˆâZ¬2ä‡ä”‡ãᬇ¬2䤇‡æxQ伇ât‡xQäÿì>ÿí¼‡8ˆâIêdˆxQôâ âˆptˆèˆˆè ìäðˆ 2õápä¬èt‰ðŒ‰âZ 2嘈ä‰ãá(‰ 2å ‰˜ˆæxQä8‰âðˆxQäÿì>ÿí8‰´‰âIêà‰xQôâ âHnð‰èŠè ôІèIêTŠxQôâ â dŠ ’伊te ôápäŒè@‹ðX‹âZte ädŠäÜŠãáôŠte äìŠdŠæxQä‹â¼ŠxQäÿì>ÿí‹€‹âIꬋxQôâ â|¼‹èЋè â à‹ œ â@jð‹èŒè ìälŒDáôápäÄèðŒðâZDáäŒäŒŒãᤌDá䜌ŒæxQä´ŒâlŒxQäÿì>ÿí´Œ0âIê\xQôâ âzlè€è â  œ â@j è´è ìäŽ8ôápätè Žð¸ŽâZ8äÄä<ŽãáTŽ8äLŽÄæxQädŽâŽxQäÿì>ÿídŽàŽâIê xQôâ â¬wè0è â @ œ â@jPèdè ìäÌeôápäðèPðhâZeätäìãáeäütæxQäâÌxQäÿì>ÿíâIê¼xQôâ âuÌèàè ìäH‘TÄ ôápä‡èÌ‘ðä‘âZTÄ äðäh‘ãထTÄ äx‘ðæxQä‘âH‘xQäÿì>ÿí‘ ’âIê8’xQôâ âÈrH’è\’è â l’ œ â@j|’è’è ôІèä “€œôápäü™è“ð¨“âZ€œä´’ä,“ãáD“€œä<“´’æxQäT“â “xQäÿì>ÿíT“Гâéü“üIê(”xQôâ â 8”Ø™ä”tôáp伕è•ð,•âZtä8”ä°”ãáÈ”täÀ”8”æxQ䨔â”xQäÿì>ÿíØ”T•â逕ˆ™øIꬕxQôâ â ¼•d™ä–dÒôáp䴗蘖ð°–âZdÒ伕ä4–ãáL–dÒäD–¼•æxQä\–â–xQäÿì>ÿí\–Ø–âé—d—øIê0—xQôâ â …@—èT—è ìIê—xQôâ â\ƒ —èT—èä ˜À®ôápädŠè˜ð¨˜âZÀ®ä´—ä,˜ãáD˜À®ä<˜´—æxQäT˜â ˜xQäÿì>ÿíT˜ИâIêü˜xQôâ âÄ ™è ™è â 0™ œ â@j@™èT™è ôx™è ìIê´™xQôâ â¬Ä™èx™ðì™è ìäTšÔ± ôápä8”èØšððšâZÔ± äü™ätšãጚԱ 䄚ü™æxQ䜚âTšxQäÿì>ÿ휚›âéD›œœøép›Lœøéœ›ü›øIêÈ›xQôâ ⼕؛èì›è ìIê(œxQôâ ☈8œèì›èIêxœxQôâ âðˆœèì›èIêÈœxQôâ âÄØœèì›ì̬ äüœáeæì äàHæ¼Ï ä,4âäŒ¼Ï õáæLŸèÄì¨èxã¼Ï ä4ä¬ãå¼Ï ä¼4âÜØ_ðô$`îøž„‚áç žIê8žxQôâ â ÐEHž žä\žè â lž œ â@j|žèžè ðâ´žè â Äž œ â@jÔžèèžè 俬§4ü áçŸIê<ŸxQôâ â LŸ˜§ä¤Ÿ„eôápäРè( ð@ âZ„eäLŸäÄŸãáÜŸ„eäÔŸLŸæxQäìŸâ¤ŸxQäÿì>ÿíìŸh âé” l§øIêÀ øâ â Рä¦ä(¡ ýèp¡èáæh¥è,¢ì¼¢¥xã ýäРäH¡ãá`¡ ýäX¡Р∡”väp¡æ”vð`/䘡(¡`/Ô¡âÿèå¢ìãРâ¬ò¢ì âРäD¢>õ¼"ááç\¢IꈢxQôâ â´—˜¢è¬¢è ðÈ¢Ĥä £ ýèh£èápð\¤èРät¤xã ýäÈ¢ä@£ãáX£ ýäP£È¢â¨£Šäh£â £Š€£è ìæ”v츣”vä£ä`/äÈ£ £`/¤âÿèä0¤ä8ýäãÈ¢â­òL¤ì âÈ¢è>ñœ¤øh£æüÈ£æؤ䀣ìáì¤áï¨ùá4ÿê@¥ø¬¢æü˜¡æäÀ¥xÔôápätáèD¦ð\¦âZxÔäh¥äà¥ãáø¥xÔäð¥h¥æxQä¦âÀ¥xQäÿì>ÿí¦„¦âIê°¦xQôâ â´—À¦èÔ¦è ì§äø¦è ðá§èIêH§xQôâ â´—X§èø¦è4êÿæžìÈÿáçħIêð§xQôâ âLŸá¨èèžè Lª ¨D©äx¨¼Ï ôápðü¨è4êxã¼Ï ä ¨ä˜¨ãá°¨¼Ï 䨨 ¨æxQäÀ¨âx¨xQä ÿè©Ø_ð,©$`ò„‚áëh©äX©è 쌩â|©äùá äæÌ©á ©äâIêáû ªáà©áü¨ùá4ÿîá ªè4ÿê „¬Xª|«ä°ª¼Ï ôápð4«è4êxã¼Ï äXªäЪãáèª¼Ï äàªXªæxQäøªâ°ªxQä îøL«Ø_ðd«$`ò„‚áë «ä«è ìī⴫äùá äæ¬áØ«äâIêáûD¬á¬áü¨ùá4ÿîáX¬è4êþ ¼®¬´­äè¬¼Ï ôápðl­è4êxã¼Ï ä¬ä­ãá ­¼Ï ä­¬æxQä0­âè¬xQä îø„­Ø_ðœ­$`ò„‚áëØ­äÈ­è ìü­âì­äùá äæ<®á®äâIêáû|®áP®áü¨ùá4êÿâá®è4ÿê ܰÈ®Ô¯ä ¯¼Ï ôápð¤¯è4êxã¼Ï äÈ®ä@¯ãáX¯¼Ï äP¯È®æxQäh¯â ¯xQä îø¼¯Ø_ô$`îø¯äè¯è ì°â °äùá äæ\°á0°äâ4êþœ°áp°áü¨ùá4êÿâá°°è4êÿâè°ô±ä@±¼Ï ôápðıè4êxã¼Ï äè°ä`±ãáx±¼Ï äp±è°æxQ䈱â@±xQä îøܱØ_ô$`î²ä²è ì<²â,²äùá äæ|²áP²äâ4ÿê¼²á²áü¨ùá4êÿâáвè4êÿâp÷ä ³ÈræÈ ä$³Hnæý ä<³˜õæ,ÌäT³Tkæ°‰äl³t³âä̳°‰ôápä°óèP´öxã°‰ät³äì³ãá´°‰äü³t³æxQä´â̳xQä ÿì>õ‹äx´uæRä´¬wælF䨴áãæȬ äÀ´ÄæÅ 䨴¤ôæ Šäð´ø´âäPµ Šõæ4舵ìеèxã Šäø´äpµã堊䀵ø´â µØ_ð¸µ$`òÀâáë €ãܵãä4¶ Šôpð Ùä<Ùø´ä à xã ŠäܵäT¶ ãál¶ Šäd¶ܵ☶”[ ä|¶ˆ¶æ ìĶ|S䨶´¶æ äæÐÀtãåÔ¶à¶æ â ð¶ìŸ âtá᷷䈶ìá(·èIêT·xQôâ âá ãd·x·äˆ¶èÀጷè鸷¸¿øéä·<¿øé¸¸¾øIê<¸xQôâ â L¸¤¾ä¤¸týõápä<»è(¹ð@¹âZtýåL¸äĸãáܸtýåÔ¸L¸æxQäì¸â¤¸xQäÿì>ÿíì¸h¹â锹pºøéÀ¹ ºøIêì¹xQôâ âü™ü¹èºè ìIêLºxQôâ âŒ\ºèºèéœºìºøIêȺxQôâ â´—غèºèIê»xQôâ â¤ô(»èºèä”»Ln ôápät³èx¼ð¼âZLn ä<»ä´»ãáÌ»Ln äÄ»<»â,¼Ì äÜ»è»æ â ø» œ âTY¼è¼è ðxQä<¼â”»xQäÿì>ñ¸¼øÜ»æü<¼à¼âé ½ؽøé8½ˆ½øIêd½xQôâ âü™t½èè»èIê´½xQôâ âŒĽèè»èé¾T¾øIê0¾xQôâ â´—@¾èè»èIꀾxQôâ â˜õ¾èè»ðˆ¶èé便øIꈶøâ4êþéh¿üIꔿxQôâ ât¤¿èˆ¶èIêä¿xQôâ ⼕ô¿èˆ¶èlÀáÀèIêHÀxQôâ â‡XÀ舶ìá€ÀèIê¬ÀxQôâ ât¼À舶è„ÄXYäàÀìÀæ â üÀìŸ â tá Á Áä´¶ìá4ÁèIê`ÁxQôâ âá ãpÁ„Áä´¶è¼Ãá˜ÁèéÄÁlÃøéðÁðÂøéÂlÂøIêHÂxQôâ âL¸XÂè´¶èé˜ÂÄÂøIê´¶øâ4êþéÃüIêHÃxQôâ âtXÃè´¶èIê˜ÃxQôâ ⼕¨Ãè´¶è ÄáÐÃèIêüÃxQôâ ⇠Äè´¶ìá4ÄèIê`ÄxQôâ âtpÄè´¶è8È4Ü ä”Ä Äæ â °ÄŒÍ â táÀÄÔÄ䈶ìáèÄèIêÅxQôâ âá ã$Å8Å䈶èpÇáLÅèéxÅ Çøé¤Å¤ÆøéÐÅ ÆøIêüÅxQôâ âL¸ Æèˆ¶èéLÆxÆøIꈶøâ4êþéÐÆüIêüÆxQôâ ât Ç舶èIêLÇxQôâ ⼕\Ç舶èÔÇá„ÇèIê°ÇxQôâ â‡ÀÇ舶ìáèÇèIêÈxQôâ ât$È舶èìËd‡äHÈTÈæ â dÈŒÍ â tátȈÈä´¶ìáœÈèIêÈÈxQôâ âá ãØÈìÈä´¶è$ËáÉèé,ÉÔÊøéXÉXÊøé„ÉÔÉøIê°ÉxQôâ âL¸ÀÉè´¶èêÊ,ÊøIê´¶øâ4êþé„ÊüIê°ÊxQôâ âtÀÊè´¶èIëËxQôâ ⼕Ëè´¶èˆËá8ËèIêdËxQôâ â‡tËè´¶ìáœËèIêÈËxQôâ âtØËè´¶è ÏT< äüËÌæ â Ì`“ â tá(Ì<Ì䈶ìáPÌèIê|ÌxQôâ âá ãŒÌ Ì䈶èØÎá´ÌèéàÌˆÎøé Í Îøé8ÍˆÍøIêdÍxQôâ âL¸tÍ舶èé´ÍàÍøIꈶøâ4êþé8ÎüIêdÎxQôâ âttÎ舶èIê´ÎxQôâ ⼕ÄÎ舶è<ÏáìÎèIêÏxQôâ â‡(Ï舶ìáPÏèIê|ÏxQôâ âtŒÏ舶èTÓ@9 ä°Ï¼Ïæ â ÌÏ`“ â táÜÏðÏä´¶ìáÐèIê0ÐxQôâ âá ã@ÐTÐä´¶èŒÒáhÐèé”Ð<ÒøéÀÐÀÑøéìÐ<ÑøIêÑxQôâ âL¸(Ñè´¶èéhÑ”ÑøIê´¶øâ4êþéìÑüIêÒxQôâ ât(Òè´¶èIêhÒxQôâ ⼕xÒè´¶èðÒá ÒèIêÌÒxQôâ â‡ÜÒè´¶ìáÓèIê0ÓxQôâ ât@Óè´¶è" Ö`/øÓdÓ4¶`/ ÓÿèäÌÓä8ýä€âܵâÉêœ1 äèÓì âܵä¼ÔáÔ4¶`/<ÔÿèähÔä8ýä€âܵâÊæ„Ôœ1 äèÓì ÔÌ/åà¶ð<0åìÀìdÕÄÔ4¶`/áÕPÿèä,Õä8ýä€âܵâËæHÕœ1 äèÓðÌ/åà¶ðlÕ4¶`/¨ÕPÿèäÔÕä8ýä€âܵâÌæðÕœ1 äèÓð<0åìÀì",×l  ÖÖ4¶l XÖÿèä„Öä Ää€âܵâÍêœ1 äèÓð¨Ö4¶l äÖÿèä×äÌ䀀âܵâÎêœ1 äèÓê"LØ À×<×4¶ x×ÿèä¤×äTÈä€âܵâÏêœ1 äèÓðÈ×4¶ Øÿèä0Øä¼Ï䀀âܵâÐêœ1 äèÓî¼Sä\Ø4¶¼S˜ØÿèäÄØì€âܵ âÑæàØœ1 äèÓðˆ$äüØì âܵ ä$ÙØ_ô$`î Ùä\ØîâpÙò{ö}ödÚäÈ×îâÔÙò{öDõ*öOõ;ö}ö(Ûä<×îâ˜Úò{öDõ*öOõ;ö}öìÛä¨Öîâ\Ûò{öDõ*öOõ;ö}ö°ÜäÖîâ Üò{öDõ*öOõ;ö}öŒÝälÕîâäÜò:öýÿí|Sä(öýÿí<0å)ö{ö}öhÞäÄÔîâÀÝò:öýÿí”[ ä(öýÿíÌ/å)ö{ö}ö¼ßåÔî âœÞò:öýÿí”[ ä(öýÿíÌ/å)ö,öýÿí|Sä(öýÿí<0å)ö{ö}þdÓîâðßò{ö}öHàø´¶äpàøˆ¶ä˜àø|¶æÀàø¨¶æèàøÔ¶æáøàÀæ8áø”Äæ`áøHÈæˆáøüËæ°áø°ÏæØáødÓæáâùÔæ(âøÄÔæPâølÕæxâøÖæ âø¨ÖæÈâø<׿ðâøÈ׿ü\Øæ,ã䈶è@ãâ´¶äùåáTãäâ4êþ € Œã ääã ŠètèpðŒä¼ø´ä  xã ŠäŒãääãáä ŠääŒãâHä”[ ä,ä8äæ ìtä|SäXädäæ äæ(ètãå„ääæ â  äìŸ â tá°äÄää8äìáØäèIêåxQôâ âá ãå(åä8äè`çá<åèéhåçøé”唿øéÀåæøIêìåxQôâ âL¸üåè8äèé<æhæøIê8äøâ4êþéÀæüIêìæxQôâ âtüæè8äèIê<çxQôâ ⼕Lçè8äèÄçátçèIê çxQôâ ⇰çè8äìáØçèIêèxQôâ âtèè8äèÜëXYä8èDèæ â TèìŸ â tádèxèädäìáŒèèIê¸èxQôâ âá ãÈèÜèädäèëáðèèééÄêøéHéHêøétéÄéøIê éxQôâ âL¸°éèdäèéðéêøIêdäøâ4êþétêüIê êxQôâ ât°êèdäèIêðêxQôâ ⼕áëèdäèxëá(ëèIêTëxQôâ â‡dëèdäìáŒëèIê¸ëxQôâ âtÈëèdäèï4Ü äìëøëæ â ìŒÍ â táì,ìä8äìá@ìèIêlìxQôâ âá ã|ììä8äèÈîá¤ìèéÐìxîøéüìüíøé(íxíøIêTíxQôâ âL¸díè8äèé¤íÐíøIê8äøâ4êþé(îüIêTîxQôâ âtdîè8äèIê¤îxQôâ ⼕´îè8äè,ïáÜîèIêïxQôâ â‡ïè8äìá@ïèIêlïxQôâ ât|ïè8äèDód‡ä ï¬ïæ â ¼ïŒÍ â táÌïàïädäìáôïèIê ðxQôâ âá ã0ðDðädäè|òáXðèé„ð,òøé°ð°ñøéÜð,ñøIêñxQôâ âL¸ñèdäèéXñ„ñøIêdäøâ4êþéÜñüIêòxQôâ âtòèdäèIêXòxQôâ ⼕hòèdäèàòáòèIê¼òxQôâ â‡ÌòèdäìáôòèIê óxQôâ ât0óèdäèøöT< äTó`óæ â pó`“ â tá€ó”óä8äìá¨óèIêÔóxQôâ âá ãäóøóä8äè0öá ôèé8ôàõøédôdõøéôàôøIê¼ôxQôâ âL¸Ìôè8äèé õ8õøIê8äøâ4êþéõüIê¼õxQôâ âtÌõè8äèIê öxQôâ ⼕öè8äè”öáDöèIêpöxQôâ ⇀öè8äìá¨öèIêÔöxQôâ âtäöè8äè¬ú@9 ä÷÷æ â $÷`“ â tá4÷H÷ädäìá\÷èIêˆ÷xQôâ âá ã˜÷¬÷ädäèäùáÀ÷èéì÷”ùøéøùøéDø”øøIêpøxQôâ âL¸€øèdäèéÀøìøøIêdäøâ4êþéDùüIêpùxQôâ ât€ùèdäèIêÀùxQôâ ⼕ÐùèdäèHúáøùèIê$úxQôâ â‡4úèdäìá\úèIêˆúxQôâ ât˜úèdäè"dý`/Pû¼úäã`/øúÿèä$ûä8ýä€âŒãâÀêœ1 ä@ûì âŒãäüXûäã`/”ûÿèäÀûä8ýä€âŒãâÁæÜûœ1 ä@ûìøûÌ/åäð<0åDèì¼üüäã`/XüPÿèä„üä8ýä€âŒãâÂæ üœ1 ä@ûðÌ/åäðÄüäã`/áýPÿèä,ýä8ýä€âŒãâÃæHýœ1 ä@ûð<0åDèì"„þl øýtýäãl °ýÿèäÜýäøëä€âŒãâÄêœ1 ä@ûñþäãl <þÿèähþä`ó䀀âŒãâÅêœ1 ä@ûê"¤ÿ ÿ”þäã Ðþÿèäüþä¬ïä€âŒãâÆêœ1 ä@ûð ÿäã \ÿÿèäˆÿä÷䀀âŒãâÇêœ1 ä@ûêd¼Sä´ÿäã¼Sðÿÿèäì€âŒã âÈæ8œ1 ä@ûð<0åTì âŒã è°Kätå°K8äè¤Ø_ô$`îÐä´ÿîâðò{öùÿõYõvõýÿ픀ävõýÿí¼Sä;öùÿõýÿí¼Sä(öýÿí°Kä,öýÿí<0å.öýÿí°Kä)ö;öùÿõ}ö”ä ÿîâò{öDõ*öOõ;ö}öXä”þîâÈò{öDõ*öOõ;ö}öåþîâŒò{öDõýÿí°Kä;ö}ö°ätýîâ8ò{öDõýÿí°Kä;ö}öŒäÄüîâäò:öýÿí|Sä(öýÿí<0å)ö{ö}öhäüîâÀò:öýÿí°Kä(öýÿíÌ/å)ö{ö}ö¼äXûî âœò:öýÿí°Kä(öýÿíÌ/å)ö,öýÿí|Sä(öýÿí<0å)ö{ö}þ¼úîâðò{ö}öH ødääp ø,äæ˜ øXäæÀ ø„äæè ø8èæ øìëæ8 ø ïæ` øTóæˆ ø÷æ° ø¼úæØ øXûæá øüæ( øÄüæP øtýæx ùþæ  ø”þæÈ ø ÿæð ø´ÿæütæ, ä8äè@ âdääùåáT äâ4êþ €5Œ 5ää  Šèt)èpðŒ)ä¼)ø´ä 2 xã ŠäŒ ä ãá  Šä Œ âH ”[ ä, 8 æ ìt |SäX d æ äæ(tãå„  æ â   ìŸ â tá° Ä ä8 ìáØ èIêxQôâ âá ã(ä8 è`á<èéhøé””øéÀøIêìxQôâ âL¸üè8 èé<høIê8 øâ4êþéÀüIêìxQôâ âtüè8 èIê<xQôâ ⼕Lè8 èÄátèIê xQôâ ⇰è8 ìáØèIêxQôâ âtè8 èÜXYä8Dæ â TìŸ â tádxäd ìáŒèIê¸xQôâ âá ãÈÜäd èáðèéÄøéHHøétÄøIê xQôâ âL¸°èd èéðøIêd øâ4êþétüIê xQôâ ât°èd èIêðxQôâ ⼕áèd èxá(èIêTxQôâ â‡dèd ìáŒèIê¸xQôâ âtÈèd è4Ü äìøæ â ŒÍ â tá,ä8 ìá@èIêlxQôâ âá ã|ä8 èÈá¤èéÐxøéüüøé(xøIêTxQôâ âL¸dè8 èé¤ÐøIê8 øâ4êþé(üIêTxQôâ âtdè8 èIê¤xQôâ ⼕´è8 è,áÜèIêxQôâ â‡è8 ìá@èIêlxQôâ ât|è8 èDd‡ä ¬æ â ¼ŒÍ â táÌàäd ìáôèIê xQôâ âá ã0Däd è|áXèé„,øé°°øéÜ,øIêxQôâ âL¸èd èéX„øIêd øâ4êþéÜüIêxQôâ âtèd èIêXxQôâ ⼕hèd èàáèIê¼xQôâ â‡Ìèd ìáôèIê xQôâ ât0èd èøT< äT`æ â p`“ â tနä8 ìá¨èIêÔxQôâ âá ãäøä8 è0á èé8àøéddøéàøIê¼xQôâ âL¸Ìè8 èé 8øIê8 øâ4êþéüIê¼xQôâ âtÌè8 èIê xQôâ ⼕è8 è”áDèIêpxQôâ ⇀è8 ìá¨èIêÔxQôâ âtäè8 è¬#@9 ä  æ â $ `“ â tá4 H äd ìá\ èIêˆ xQôâ âá 㘠¬ äd èä"áÀ èéì ”"øé!"øéD!”!øIêp!xQôâ âL¸€!èd èéÀ!ì!øIêd øâ4êþéD"üIêp"xQôâ ât€"èd èIêÀ"xQôâ ⼕Ð"èd èH#áø"èIê$#xQôâ â‡4#èd ìá\#èIêˆ#xQôâ ât˜#èd è"d&`/P$¼#ä `/ø#ÿèä$$ä8ýä€âŒ â·êœ1 ä@$ì ⌠ä%X$ä `/”$ÿèäÀ$ä8ýä€âŒ â¸æÜ$œ1 ä@$ìø$Ì/å ð<0åDì¼%%ä `/X%Pÿèä„%ä8ýä€âŒ â¹æ %œ1 ä@$ðÌ/å ðÄ%ä `/á&Pÿèä,&ä8ýä€âŒ âºæH&œ1 ä@$ð<0åDì"„'l ø&t&ä l °&ÿèäÜ&äøä€âŒ â»êœ1 ä@$ñ'ä l <'ÿèäh'ä`䀀⌠â¼êœ1 ä@$ê"¤( (”'ä  Ð'ÿèäü'ä¬ä€âŒ â½êœ1 ä@$ð (ä  \(ÿèäˆ(ä 䀀⌠â¾êœ1 ä@$êd)¼Sä´(ä ¼Sð(ÿèä)ì€âŒ  â¿æ8)œ1 ä@$ð<0åT)ì ⌠ è¤0 ät)å¤0 d è¤)Ø_ô$`îÐ+ä´(îâð)ò{öùÿõYõvõýÿ픀ävõýÿí¼Sä;öùÿõýÿí¼Sä(öýÿí¤0 ä,öýÿí<0å.öýÿí¤0 ä)ö;öùÿõ}ö|,ä (îâ,ò{öDõýÿí¤0 ä;ö}ö(-ä”'îâ°,ò{öDõýÿí¤0 ä;ö}öì-å'îâ\-ò{öDõ*öOõ;ö}ö°.ät&îâ .ò{öDõ*öOõ;ö}öŒ/äÄ%îâä.ò:öýÿí¤0 ä(öýÿí<0å)ö{ö}öh0ä%îâÀ/ò:öýÿí”[ ä(öýÿíÌ/å)ö{ö}ö¼1äX$î âœ0ò:öýÿí”[ ä(öýÿíÌ/å)ö,öýÿí¤0 ä(öýÿí<0å)ö{ö}þ¼#îâð1ò{ö}öH2ø8 äp2ø, æ˜2øX æÀ2ø„ æè2ø8æ3øìæ83ø æ`3øTæˆ3ø æ°3ø¼#æØ3øX$æá4ø%æ(4øÄ%æP4øt&æx4ù'æ 4ø”'æÈ4ø (æð4ø´(æüt)æ,5ä8 è@5âd äùåáT5äâ4êÿâŒ5á_ää5 ŠètRèpð´RääRø´ä\ xã ŠäŒ5ä6ãá6 Šä6Œ5âH6”[ ä,686æ ìt6|SäX6d6æ äæ(:tãå„66æ â  6ìŸ â tá°6Ä6ä86ìáØ6èIê7xQôâ âá ã7(7ä86è`9á<7èéh79øé”7”8øéÀ78øIêì7xQôâ âL¸ü7è86èé<8h8øIê86øâ4êþéÀ8üIêì8xQôâ âtü8è86èIê<9xQôâ ⼕L9è86èÄ9át9èIê 9xQôâ ⇰9è86ìáØ9èIê:xQôâ ât:è86èÜ=XYä8:D:æ â T:ìŸ â tád:x:äd6ìáŒ:èIê¸:xQôâ âá ãÈ:Ü:äd6è=áð:èé;Ä<øéH;H<øét;Ä;øIê ;xQôâ âL¸°;èd6èéð;<øIêd6øâ4êþét<üIê <xQôâ ât°<èd6èIêð<xQôâ ⼕á=èd6èx=á(=èIêT=xQôâ â‡d=èd6ìáŒ=èIê¸=xQôâ âtÈ=èd6èA4Ü äì=ø=æ â >ŒÍ â tá>,>ä86ìá@>èIêl>xQôâ âá ã|>>ä86èÈ@á¤>èéÐ>x@øéü>ü?øé(?x?øIêT?xQôâ âL¸d?è86èé¤?Ð?øIê86øâ4êþé(@üIêT@xQôâ âtd@è86èIê¤@xQôâ ⼕´@è86è,AáÜ@èIêAxQôâ â‡Aè86ìá@AèIêlAxQôâ ât|Aè86èDEd‡ä A¬Aæ â ¼AŒÍ â táÌAàAäd6ìáôAèIê BxQôâ âá ã0BDBäd6è|DáXBèé„B,Døé°B°CøéÜB,CøIêCxQôâ âL¸Cèd6èéXC„CøIêd6øâ4êþéÜCüIêDxQôâ âtDèd6èIêXDxQôâ ⼕hDèd6èàDáDèIê¼DxQôâ â‡ÌDèd6ìáôDèIê ExQôâ ât0Eèd6èøHT< äTE`Eæ â pE`“ â tá€E”Eä86ìá¨EèIêÔExQôâ âá ãäEøEä86è0Há Fèé8FàGøédFdGøéFàFøIê¼FxQôâ âL¸ÌFè86èé G8GøIê86øâ4êþéGüIê¼GxQôâ âtÌGè86èIê HxQôâ ⼕Hè86è”HáDHèIêpHxQôâ ⇀Hè86ìá¨HèIêÔHxQôâ âtäHè86è¬L@9 äIIæ â $I`“ â tá4IHIäd6ìá\IèIêˆIxQôâ âá ã˜I¬Iäd6èäKáÀIèéìI”KøéJKøéDJ”JøIêpJxQôâ âL¸€Jèd6èéÀJìJøIêd6øâ4êþéDKüIêpKxQôâ ât€Kèd6èIêÀKxQôâ ⼕ÐKèd6èHLáøKèIê$LxQôâ â‡4Lèd6ìá\LèIêˆLxQôâ ât˜Lèd6è"dO`/PM¼Lä5`/øLÿèä$Mä8ýä€âŒ5â®êœ1 ä@Mì âŒ5äNXMä5`/”MÿèäÀMä8ýä€âŒ5â¯æÜMœ1 ä@MìøMÌ/å6ð<0åD:ì¼NNä5`/XNPÿèä„Nä8ýä€âŒ5â°æ Nœ1 ä@MðÌ/å6ðÄNä5`/áOPÿèä,Oä8ýä€âŒ5â±æHOœ1 ä@Mð<0åD:ì"„Pl øOtOä5l °OÿèäÜOäø=ä€âŒ5â²êœ1 ä@MñPä5l ñPdIáçbéHbádøétb„cøé bácøIêÌbxQôâ âL¸Übèðbè ìé,cXcøIêðbøâ4êþé°cüIêÜcxQôâ âtìcèðbèIê,dxQôâ ⼕ñDfä4fè ì„fáXfáΨùá4ÿêÄfá˜fäâ4ÿîáØfâOâ4êþ èhghähglFôápðìgéãêxãlFägäˆgãá glFä˜ggæxQä°gâhgxQä îü>ñ(hähè ìhháñ jäüiè ìLjá jáΨùá4êþŒjá`jäâ4ÿîá jâOâ4ÿêä$k ‹õáæ@mè\kìtkèZ ‹äÌjäDkãå ‹äTkÌjæ>õ€kàläØk ‹ôápð\lèÌjäŒlâZ ‹ä€käøkãál ‹äl€kæxQä lâØkxQäÿètl>õ<:ááÿç l´lâIêáÿãôlè â mm ìIêáûä˜m(Éôápä´sènð4nâZ(Éä@mä¸mãáÐm(ÉäÈm@mæxQäàmâ˜mxQäÿì>ÿíàm\nâéˆnxsøé´noøéàn@oøIê oxQôâ â<»oè0oè ìIêloxQôâ âL¸|oè0oèIê¼oxQôâ â Ìodsä$pœôápäL¸è¨pðÀpâZœäÌoäDpãá\pœäTpÌoæxQälpâ$pxQäÿì>ÿílpèpâéq qøé@qüIêlqxQôâ âŒb|qèqè ìéÌq˜røéøqHrøIê$rxQôâ âü™4rèqèIêtrxQôâ ⌄rèqèéÄrsøIêðrxQôâ â´—ásèqèIê@sxQôâ â°óPsèqð0oèIê¤sxQôâ â ´s˜wä tˆôápäÌoèðtðuâZˆä´sä,tãáDtˆäñ0uøTtæü´tXuâé„uÌvøé°u|vøéÜu,vøIêvxQôâ âü™vè`tèIêXvxQôâ âŒhvè`tèIê¨vxQôâ ⇸vè`tèéøvHwøIê$wxQôâ â´—4wè`tèIêtwxQôâ ât³„wè`tð0oèÀwä âèøyáÔwèêx¨yøé,x,yøéXx¨xøIê„xxQôâ âL¸”xè âèéÔxáyøIê âøâ4êþéXyüIê„yxQôâ ât”yè âèIêÔyxQôâ ⼕äyè âè\zá zèIê8zxQôâ â‡Hzè âìápzèIêœzxQôâ ât¬zè âè ˆ~Ìzè}ä${Ôºôápñ}ètáäH}âZÔºäÌzäD{ãá\{ÔºäT{Ìzâô{ÐAäl{x{æ â |àˆ{¬{äœ{è ìÐ{âÀ{è äêâä{è äæl|ŒÍä||æ â | ä â |à0|D|äœ{èX|âÀ{ìâä{èä|`“ä ||ˆ|ä â˜| ä â |à¨|¼|äœ{èÐ|âÀ{ìâä{ììŸ äô|x{æ}>ñ0} ’ ò0ëîp}øl{æ˜}ø|æÀ}ø||æüô|æH~äü}è â |à ~ ~äœ{è4~âÀ{ìâä{ìá\~áwap<.á4ÿê ”~À€äì~Ôºôápð€ètáä €âZÔºä”~ä ãá$Ôºä”~â”ÐAä 4@ä âPæ â ` œ âSpè„è ìÀŒÍ䤰æ â„ äÜ`“ä аèìŸ ä ìøä âPè>ñH€ø4æp€ø¤æ˜€øÐæüìæÔ€ä„ìáè€áݨùá4êþ pƒ ƒäxÔºôápðd‚ètáä|‚âZÔºä ä˜ãá°Ôºä¨ â‚ÐAäÀÌæ â Ü œ âÀPìé‚è ì,‚ŒÍä ‚á‚æH‚`“ä<‚á‚èìŸ äX‚á‚ê>ñ¤‚øÀæÌ‚ø ‚æô‚ø<‚æüX‚æ0ƒå‚ìáDƒáݨùá4êÿâ|ƒT…äÔƒÔºôápðœ„ètáä´„âZÔºä|ƒäôƒãá „Ôºä„|ƒâ8„ÐAä„(„æ ìd„ŒÍäH„T„æ â(„ 䀄`“ä t„T„èìŸ ä „(„è>ñÜ„ø„æ…øH„æ,…øt„æü„æh…ä(„ìá|…áݨùá4êþÐ…øâæø…ø@âæ †ølâæüˆâæl†ä\†è äêဆèIꬆxQôâ âá 㼆Іä\†è‰áä†è釸ˆøé<‡<ˆøéh‡¸‡øIꔇxQôâ âL¸¤‡è\†èé䇈øIê\†øâ4êþéhˆüIꔈxQôâ ât¤ˆè\†èIêäˆxQôâ ⼕ôˆè\†èl‰á‰èIêH‰xQôâ â‡X‰è\†ìဉèIꬉxQôâ ât¼‰è\†è„Xâ äà‰ì‰æ â ü‰ìŸ â tá Š Šä\†ìá4ŠèIê`ŠxQôâ âá ãpŠ„Šä\†è¼Œá˜ŠèéÄŠlŒøéðŠð‹øé‹l‹øIêH‹xQôâ âL¸X‹è\†è阋ċøIê\†øâ4êþéŒüIêHŒxQôâ âtXŒè\†èIꘌxQôâ ⼕¨Œè\†è áÐŒèIêüŒxQôâ ⇠è\†ìá4èIê`xQôâ âtpè\†è8‘ä” æ â °ŒÍ â táÀÔä\†ìáèèIêŽxQôâ âá ã$Ž8Žä\†èpáLŽèéxŽ øé¤Ž¤øéÐŽ øIêüŽxQôâ âL¸ è\†èéLxøIê\†øâ4êþéÐüIêüxQôâ ât è\†èIêLxQôâ ⼕\è\†èÔá„èIê°xQôâ â‡Àè\†ìáèèIê‘xQôâ ât$‘è\†èì”(#äH‘T‘æ â d‘`“ â tát‘ˆ‘ä\†ìᜑèIêÈ‘xQôâ âá ãØ‘ì‘ä\†è$”á’èé,’Ô“øéX’X“øé„’Ô’øIê°’xQôâ âL¸À’è\†èê“,“øIê\†øâ4êþé„“üIê°“xQôâ âtÀ“è\†èIë”xQôâ ⼕”è\†èˆ”á8”èIêd”xQôâ â‡t”è\†ì᜔èIêÈ”xQôâ âtØ”è\†èŒ•DZäü”•æ â •DZ â (•ÐA â tá8•L•ä\†ìá`•èIꬆxQôâ,–`œäœ•¨•æ â ¸•`œ â È•ÐA â táØ•ì•ä\†ìá–èIꬆxQôâÌ–4à ä<–H–æ â X–4à â h–ÐA â táx–Œ–ä\†ìá –èIꬆxQôâl—ÌýäÜ–è–æ â ø–Ìý â —ÐA â tá—,—ä\†ìá@—èIꬆxQôâ ˜ŒÍä|—ˆ—æ â ˜—ŒÍ â ¨—ÐA â tḗ̗ä\†ìáà—èIꬆxQô⬘`“ä˜(˜æ â 8˜`“ â H˜ÐA â táX˜l˜ä\†ìဘèIꬆxQôâ âÐà 优Șæ â ؘèáä0™PÑôpäø´èt×ä¤×èØÛZPÑäؘäP™ãáh™PÑä`™ؘâü›¼e äx™„™æ â ø´”™¸™ä¨™è ìÜ™âÌ™è äêáð™èIêšxQôâ â 4,š@šä¨™èTšâÌ™è4›áhšèIꔚxQôâ â ÐE¤šìšä¸šè â Èš œ â@jؚ訙ìã›è â › œ â@j ›è̙蘛áH›èIêt›xQôâ âLŸ„›è¨™ìᬛèIêØ›xQôâ âLŸè›è̙蜔[ ä œ¨™æ4œ|Sä(œÌ™æèŸtãåDœPœæ â `œìŸ â tápœ„œä¨™ìᘜèIêÄœxQôâ âá ãÔœèœä¨™è Ÿáüœèé(ОøéTTžøé€ÐøIê¬xQôâ âL¸¼è¨™èéü(žøIꨙøâ4êþ逞üI꬞xQôâ ât¼žè¨™èIêüžxQôâ ⼕ Ÿè¨™è„Ÿá4ŸèIê`ŸxQôâ â‡pŸè¨™ìᘟèIêÄŸxQôâ âtԟ訙蜣XYäøŸ æ â  ìŸ â tá$ 8 äÌ™ìáL èIêx xQôâ âá ㈠œ äÌ™èԢᰠèéÜ „¢øé¡¢øé4¡„¡øIê`¡xQôâ âL¸p¡èÌ™èé°¡Ü¡øIêÌ™øâ4êþé4¢üIê`¢xQôâ âtp¢èÌ™èIê°¢xQôâ ⼕À¢èÌ™è8£áè¢èIê£xQôâ â‡$£èÌ™ìáL£èIêx£xQôâ âtˆ£èÌ™èP§4Ü ä¬£¸£æ â È£ŒÍ â táØ£ì£ä¨™ìá¤èIê,¤xQôâ âá ã<¤P¤ä¨™èˆ¦ád¤èé¤8¦øé¼¤¼¥øéè¤8¥øIê¥xQôâ âL¸$¥è¨™èéd¥¥øIꨙøâ4êþéè¥üIê¦xQôâ ât$¦è¨™èIêd¦xQôâ ⼕t¦è¨™èì¦áœ¦èIêȦxQôâ â‡ئ訙ìá§èIê,§xQôâ ât<§è¨™è«d‡ä`§l§æ â |§ŒÍ â tጧ §äÌ™ìá´§èIêà§xQôâ âá ãð§¨äÌ™è<ªá¨èéD¨ì©øép¨p©øéœ¨ì¨øIêȨxQôâ âL¸بèÌ™èé©D©øIêÌ™øâ4êþ霩üIêÈ©xQôâ âtØ©èÌ™èIêªxQôâ ⼕(ªè̙蠪áPªèIê|ªxQôâ ⇌ªèÌ™ìá´ªèIêàªxQôâ âtðªè̙踮T< ä« «æ â 0«`“ â tá@«T«ä¨™ìáh«èIꔫxQôâ âá 㤫¸«ä¨™èð­áÌ«èéø« ­øé$¬$­øéP¬ ¬øIê|¬xQôâ âL¸Œ¬è¨™èé̬ø¬øIꨙøâ4êþéP­üIê|­xQôâ âtŒ­è¨™èIêÌ­xQôâ ⼕ܭ訙èT®á®èIê0®xQôâ â‡@®è¨™ìáh®èIê”®xQôâ ât¤®è¨™èl²@9 äȮԮæ â ä®`“ â táô®¯äÌ™ìá¯èIêH¯xQôâ âá ãX¯l¯ä̙褱ုè鬯T±øéدذøé°T°øIê0°xQôâ âL¸@°èÌ™è逰¬°øIêÌ™øâ4êþé±üIê0±xQôâ ât@±èÌ™èIꀱxQôâ ⼕±èÌ™è²á¸±èIêä±xQôâ â‡ô±èÌ™ìá²èIêH²xQôâ âtX²èÌ™è" Õ`/³|²0™`/¸²ÿèää²ì€âؘâÒêœ1 å³ì âؘäÔ³³0™`/T³ÿè䀳ì€âؘâÓæœ³œ1 å³ì¸³Ì/åPœð<0å ì|´ܳ0™`/´PÿèäD´ì€âؘâÔæ`´œ1 å³ðÌ/åPœì$µ„´0™`/À´Pÿèäì´ì€âؘâÕæµœ1 å³ð<0å ð,µ0™`/hµë4¶ä\3ï䔵ìâؘì°µœ1 å³ðð*å̵ê âܵ ä â ؘìµ¶å¶è æèâ$¶è ää ™ä„¶âL¸`/â´¶ü,µòœ¶´>ãð?áì:öýÿí¼e ä(öýÿíð*å.öýÿíl ä(ö)ö,öýÿíð*å.öýÿí ä(ö)ö)ö{ö}þœ¸âD»¼Sâ´¸ü”ºö>ñ{öùÿõýÿí>åýÿí`Tä(öýÿí0"å)ö;öùÿõýÿí0"å=öýÿí¼"å;öùÿõýÿí¼"å=öýÿí`Tä;öùÿõ}öh&¼SкîL¸äè8ïäìºìâ(»0"å»ì â» ä ð¼"å»ô”»âD¾˜ âÄ»ü\½ò¬»Ø_ô$`î{öùÿõDõýÿíøó ä<öýÿíØ_ä,öýÿí$`ä>ö(öýÿíÌ/å,öýÿí<0å)ö;öùÿõ}öh&˜ ˜½îD»ä48ïä ¾ä´½äâ â ôsĽè½äؽè ðâü½è äæ(¾Ì/åؽð<0åü½ô”¾â´ÁðâľütÀò¬¾Ø_ô$`î{öùÿõDõXõ<öõ>ö(ö!ö(öýÿí<0å<öýÿíÌ/å)ö)ö;öùÿõ}öh&ð°ÀîD¾ä€7ïäÌÀìâPÁÌ/åèÀê âøÀ ä â ôsÁ,ÁäÁè ðâ@Áè äê<0ålÁê â|Á ä â ôsŒÁ ÁäÁìâ@ÁðÂâ$Ÿâ4ÂüäÃòÂØ_ô$`î{öùÿõDõXõ<öõ>ö(ö!ö(öýÿíÌ/å<öýÿí<0å)ö)ö;öùÿõ}öh&¸ Äî´Áä07ïä<ÄìâÀÄÌ/åXÄê âhÄ ä â ôsxÄœÄäŒÄè ðâ°Äè äê<0åÜÄê âìÄ ä â ôsüÄÅäŒÄìâ°ÄðtÅâ¼ÇÌ â¤Åü|ÆòŒÅØ_ô$`î{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}öh&̸Æî$Åäp6ïäÔÆìâXÇÌ/åðÆê ãÇ ä â ôsÇ4Çä$Çè ðâHÇè äê<0åtÇê â„Ç ä â ôs”ǨÇä$ÇìâHÇð Èâ,Ë`4â<ÈüìÉò$ÈØ_ô$`î{öùÿõDõXõ<öõ>ö(ö!ö(öýÿíÌ/åjõýÿí<0å)ö)ö;öùÿõ}öh&`4(Êî¼Çä4ïäDÊìâÈÊÌ/å`Êê âpÊ ä â ôs€Ê¤Êä”Êè ðâ¸Êè äê<0åäÊê âôÊ ä â ôsËËä”Êìâ¸Êð|ËâÄи)â¬Ëü„Ïò”ËØ_ô$`î{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿíl ä<öýÿí<0å.öýÿíl ähõùÿõ(ö!ö(öýÿí<0å.öýÿíl ä<öýÿíÌ/å.öýÿíl ä)öiõýÿíÌ/å.öýÿí ä<öýÿí<0å.öýÿí ä)ö)ö;öùÿõ}öh&¸ÀÏî,Ëä@ðäÜÏìâ`ÐÌ/åøÏê âÐ ä â ôsÐ<Ðä,Ðè ðâPÐè äê<0å|Ðê âŒÐ ä â ôsœÐ°Ðä,ÐìâPÐðÑâäw5âDÑüÌÓò,ÑØ_ô$`î{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿíl äjõýÿí<0å.öýÿíl äiõýÿíÌ/å.öýÿí äjõýÿí<0å.öýÿí ä)ö;öùÿõ}öh&5ÔîÄÐälïä$Ôìâ¨ÔÌ/å@Ôê âPÔ ä â ôs`Ô„ÔätÔè ðâ˜Ôè äê<0åÄÔê âÔÔ ä â ôsäÔøÔätÔìâ˜ÔèàÕl äÕäl XÕäYÿå â hÕl â ø´xÕŒÕ䨙è ÕâÌ™ìá´ÕèIêšxQôâ´Ö äðÕä ,ÖäYÿå â <Ö  â ø´LÖ`Ö䨙ètÖâÌ™ìáˆÖèIêšxQôæ¼SäÄÖ0™¼Sá×ÿèä,×ì€âؘâÖæHל1 å³ðÌ/åd×ì âؘ äŒ×Ø_ô$`î°ØäÄÖî âØ×ò{öýÿí¼e ävõýÿí¼Sä(öýÿíÌ/å)ö;ö}öŒÙä„´îâäØò:öýÿí¼e ä(öýÿí<0å)ö{ö}öhÚäܳîâÀÙò:öýÿí¼e ä(öýÿíÌ/å)ö{ö}ötÛä³î âœÚò:öýÿí¼e ä(öýÿíÌ/å,öýÿí<0å)ö{ö}þ|²îâ¨Ûò{ö}öXÞùÜä â ø´Ü$Ü䨙è8ÜâÌ™ìáLÜèIêxÜxQôâ â 4ˆÜœÜ䨙è°ÜâÌ™èÝáÄÜèIêðÜxQôâ âÐEáÝHÝäÝè â $Ý œ â@j4Ý訙ìâ\Ýè â lÝ œ â@j|ÝèÌ™èôÝá¤ÝèIêÐÝxQôâ âLŸàÝ訙ìáÞèIê4ÞxQôâ âLŸDÞèÌ™è€Þøx™æ¨Þø œæÐÞø(œæøÞøDœæ ßøøŸæHßø¬£æpßø`§æ˜ßø«æÀßøÈ®æèßø|²æàø³æ8àøܳæ`àø„´æáøˆàæ â ˜àl â ø´¨à¼à䨙èÐàâÌ™ìáäàèIêšxQôâÀáø8áæ â Há  â ø´Xálá䨙è€áâÌ™ìá”áèIêšxQôþÄÖæ âäüáè äêâH–è"´`/ ã0âÔà`/lâPÿèä˜âì€â|àâßæÄâœ1 ä´âì â|àèð*áàâH–ì4ÿêäãÔà`/Pãÿèä|ãì€â|àâàæ˜ãœ1 ä´âì´ãð*åH–ìÐã(© äì‰ð à#ìãüáìIîüáôâÐä äÔà`/\äÿèäˆäì€â|àâáæ¤äœ1 ä´âðÌ/åÀäì â|à ä öØäÔà`/åëœæä˜'ïä@åìâ|àì\åœ1 ä´âðÌ/åxåì âˆå ä â |à˜å¼åä¬åè æäˆæâÐåè â àå@î â ðåtæ âá æ8* â æÐA â tá æ4æä\†ìáHæèIꬆxQôê¬åìâüáè®àäìæâ¼é`/âçüØäö´>ãì:öýÿíè:å(öýÿí¤] ä(öýÿíÌ/å.öýÿí¬• ä(ö)ö)ö,öýÿíÐà ä(öýÿíÌ/å.öýÿídÅ ä(ö)ö,öýÿíÌ/å.öýÿíHu ä(ö)ö)ö)ö{ö}ö>êäóâØó`/â¨óüXíòädê HôápäHñèïä ïè0ðZ Hä êä„ê ãáœê Hä”ê êâ¸êDZä¬êêÔê`œäÈêêë4à ääêðêæ ãëæ ì,ëÌýä ëðêäXëŒÍä<ëHëæ ãë ätë`“ä hëHëä¬ì8* ä„ëŒëâääë8* ôápä ê>êälìð„ìâdê8* äŒëäìãáì8* äìŒëæ@îä,ì8ìæ â êHìè\ìè æè´>ãÿè,ìæ$<î`/Pí¼ìdê`/øìÿèä$íì€â êâØêœ1 ä@íì â êèXídê`/”íë¼éä'ïäÀíìâ êìÜíœ1 ä@íðˆ$äøíê âî ä â êîè,îè æè”j äLîdê”j ˆîÿèä´îì€â êâÙæÐîœ1 ä@íììîð*åðêðˆ$ø>ñÌïäLîîâTïò{öGõýÿíð*å;ö}þ¼ìîãðò{ö}öXðøäêæ€ðø ëæ¨ðø<ëæÐðøhëæøðøŒëè ñø¼ìæüLîæä ñ`¬ ôBápäؘèŒòä¼òèhóZ`¬ äHñäÀñãáØñ`¬ äÐñHñæ@&å èñ ñ@&á$òÿèä`òäPòäR€€âHñâ׿ ðœ1 ä|òê âHñä¤ò0ëôà#áPòðèñîâðòò{öDõýÿíà#ä;ö}ÿòèñæä´>ãì{ö}þ(ôâ4¶¼S âXôü`õò@ôØ_ô$`î{öùÿõýÿíÌ/å.öýÿí¼Sä(öýÿí<0å)ö;öùÿõ}öZ¼SœõîØóä<%ïä¸õìâ<öÌ/åÔõì âäõ ä â ؘôõöäöè ðâ,öè äê<0åXöì âhö ä â ؘxöŒöäöìâ,öì¨öÔà`/äöÿèä÷ì€â|àâìæ,÷œ1 ä´âñ,åH÷ì â X÷xä°÷á±èÀ èápä|àèHäè øZá±äX÷äÐ÷ãáè÷á±äà÷X÷â¬û¤] äø÷øæ â øÐA â tá$øHøä8øè äêá\øèIêˆøxQôâ âá ã˜ø¬øä8øèäúáÀøèéìø”úøéùúøéDù”ùøIêpùxQôâ âL¸€ùè8øèéÀùìùøIê8øøâ4êþéDúüIêpúxQôâ ât€úè8øèIêÀúxQôâ ⼕Ðúè8øèHûáøúèIê$ûxQôâ â‡4ûè8øìá\ûèIêˆûxQôâ ât˜ûè8øè`ÿXâ ä¼ûÈûæ â ØûìŸ â táèûüûä8øìáüèIê<üxQôâ âá ãLü`üä8øè˜þátüèé üHþøéÌüÌýøéøüHýøIê$ýxQôâ âL¸4ýè8øèétý ýøIê8øøâ4êþéøýüIê$þxQôâ ât4þè8øèIêtþxQôâ ⼕„þè8øèüþá¬þèIêØþxQôâ â‡èþè8øìáÿèIê<ÿxQôâ âtLÿè8øèäpÿ|ÿæ â ŒÿŒÍ â táœÿ°ÿä8øìáÄÿèIêðÿxQôâ âáãâä8øèLá(èéTüøé€€øé¬üøIêØxQôâ âL¸èè8øèé(TøIê8øøâ4êþé¬üIêØxQôâ âtèè8øèIê(xQôâ ⼕8è8øè°á`èIêŒxQôâ ⇜è8øìáÄèIêðxQôâ âtáè8øèÈ(#ä$0æ â @`“ â táPdä8øìáxèIê¤xQôâ âá ã´Èä8øéáÜèé°øé44øé`°øIêŒxQôâ âL¸œè8øèéÜøIê8øøâ4êþé`üIêŒxQôâ âtœè8øèIêÜxQôâ ⼕ìè8øèdáèIê@xQôâ â‡Pè8øìáxèIê¤xQôâ ât´è8øèhDZäØäæ â ôDZ â ÐA â tá(ä8øìá<èIêˆøxQôâ`œäx„æ â ”`œ â ¤ÐA â tá´Èä8øìáÜèIêˆøxQôâ¨4à ä$æ â 44à â DÐA â táThä8øìá|èIêˆøxQôâH Ìýä¸Äæ â ÔÌý â äÐA â táô ä8øìá èIêˆøxQôâè ŒÍäX d æ â t ŒÍ â „ ÐA â tá” ¨ ä8øìá¼ èIêˆøxQô∠`“äø  æ â  `“ â $ ÐA â tá4 H ä8øìá\ èIêˆøxQôâì Ðà ä˜ ¤ æ â ؘ´ Ø äÈ è äêâ$èä `/äü °÷`/8 ÿèäd ì€âX÷âÛæ œ1 ä€ ì âX÷ä¬ ð*å$ìÈ (© äÈûðà#äÈ ìx Hu äô °÷Hu 0 ÿèä\ ä$ä€âX÷âÜêœ1 ä€ ì ¬• äˆ °÷¬• Ä ÿèäð ä|ÿä€âX÷âÝêœ1 ä€ ì° dÅ ä °÷dÅ X ÿèä” ä„ ä€âX÷âÞæ âÈ  èœ1 ä€ ðè:åÀ åè:áØ è â ؘè ü ä8øìâè â ؘ 4äÈ ìâ$è`>ñx ’ ò0ëîüä î âÄò{öDõýÿíè:å.öýÿí ä(ö)ö.öýÿíl ä(ö)ö;ö}öäˆ î â0ò{öDõýÿíè:å.öýÿíl ä(ö)ö;ö}ötäô î â<ò{öDõýÿíè:å.öýÿí ä(ö)ö.öýÿí ä(ö)ö;ö}þü îâ¨ò:öýÿíè:å(öýÿí(© ä,öýÿíÐà ä(öýÿíà#ä,öýÿíð*å)ö)ö{ö}ö øø÷æHø¼ûæpøpÿæ˜ø$æÀøØæèøxæøæ8ø¸æ`øX æˆøø æ°ø˜ æØøü æáøô æ(øˆ æPø æüÀ æŒä(áè â\†ìâüáèHì.äÄÔàì.áÿèä,ì €â|àââêœ1 ä´âì"2øXÔà2”ÿèäÀäÀää€â|àâãæÜœ1 ä´âðÌ/åÀäì$áÔà2<ëÄä4(ïähäÀääâ|à서1 ä´âðÌ/å ì â° ä â |àÀääÔè æä°âøè â @î â œ â (8* â 8ÐA â táH\ä\†ìápèIꬆxQôêÔìâüáè®àäâœæ2â,ýö´>ãì{öýÿí8qä(öýÿíÌ/å.öýÿíHu ä(ö)ö,öýÿíÌ/å.öýÿídÅ ä(ö)ö)ö;öDõ*öOõ;ö}ú,Ôà2hÿèä”äÀää€â|àâíæ°œ1 ä´âñ,åÌì â X÷Üðä(áèâ\†ìâüá謄ä(Ôà„dÿèä䈗䀀â|àâäêœ1 ä´âê@Tä¼ÔàTøÿèä$äH–䀀â|àâåêœ1 ä´âê"˜äðPÔàäŒÿèä¸äˆ—ä€â|àâææÔœ1 ä´âð@)å•ðøÔàä4ÿèä`ä(˜ä€€â|à âçæ|œ1 ä´âî@)å•ì, è»ä¨Ôàè»äÿèä äH–䀀â|à âèêœ1 ä´âêÀ Hu ä< ÔàHu x ÿèä¤ äH–ä€â|à âéêœ1 ä´âì"`"8qœ!Ð Ôà8q !ÿèä8!ì€â|à âêæT!œ1 ä´âðð*áp!H–ì4ÿî¤!Ôà8qà!ÿèä "ì€â|à âëæ("œ1 ä´âìD"ð*åH–ðèê äüáì%ð,¤¸'p"Ôब"ë$äÄ(ïäì#äØ"äRâ|àì â X÷è" #äü"è æäØ#â #è â 0#@î â @#Ä# â P#8* â `#ÐA â táp#„#ä\†ìá˜#èIꬆxQôêü"ìâüáìœ1 ä´âì®àäX$âĤ#âp$üp"ö´>ãì{öDõýÿî±ä<öýÿí´>å,ö õýÿí¤] ävõýÿí8* ä<öýÿí´>å>övõýÿí@îä,öýÿí0ëä>ö(öýÿíHu ä(ö)ö,öùÿõýÿí¬• ä(ö)ö,öùÿõýÿídÅ ä(ö)ö)ö;ö}úÀ'Ôà¤ü'ëX)äL)ïä<)ä((äRâ|àì â |à8(\(äL(è æä()âp(è â €(@î â () â  (8* â °(ÐA â táÀ(Ô(ä\†ìáè(èIꬆxQôêL(ìâüáìœ1 ä´âì®àä¨)â$¤"âÀ)üÀ'ö´>ãì{öDõýÿí@ä<öýÿí´>å,ö õýÿí¤] ävõýÿí8* ä<öýÿí´>å>övõýÿí@îä,öýÿí0ëä>ö(öýÿíHu ä(ö)ö,öùÿõýÿí¬• ä(ö)ö,öýÿídÅ ä(ö)ö)ö;ö}ö .¬• „-á-Ôକ <-ÿèäh-ä ä€â|àâîêœ1 ä´âðŒ-Ôକ È-ÿèäô-äT‘䀀â|àâïêœ1 ä´âê´.dÅ ä .ÔàdÅ \.ÿèä˜.äˆ.ä€â|àâðæ âüá èœ1 ä´âìH/ÔÎäÄ.ÔàÔÎá/ÿèä,/ä•䀀â|àâñêœ1 ä´âêø/¼SäX/Ôà¼S”/ÿèäÀ/ì€â|àâòæÜ/œ1 ä´âð<0åÀäðè:å0åè:á 0è â ؘ00D0ä\†ìâX0è â ؘh0|0äüáìâH–è¨0>ñô0 ’ âÀ0è â êÐ0èä0è ð0ëâ 1è â Hñ1è4ä01è â @1DZ â P1ÐA â tá`1„1ät1è äêá˜1èIêÄ1xQôâ âá ãÔ1è1ät1è 4áü1èé(2Ð3øéT2T3øé€2Ð2øIê¬2xQôâ âL¸¼2èt1èéü2(3øIêt1øâ4êþé€3üIê¬3xQôâ ât¼3èt1èIêü3xQôâ ⼕ 4èt1è„4á44èIê`4xQôâ â‡p4èt1ìá˜4èIêÄ4xQôâ âtÔ4èt1ìáü4è4êþd6äX/î â\5ò{öýÿíè:å.öýÿí¼Sä(öýÿí<0å.öýÿíè:å)ö;ö}ö`8äÄ.îâ˜6ò{öDõXõ<öýÿíDZä>ö(öýÿíè:å.öýÿí ä(ö)ö.öýÿíl ä(ö)ö)ö;ö}öÌ9ä .î â”8ò{öDõýÿíè:å.öýÿí ä(ö)ö.öýÿíl ä(ö)ö;ö}öØ:äŒ-î ã:ò{öDõýÿíè:å.öýÿíl ä(ö)ö;ö}öä;å-î â ;ò{öDõýÿíè:å.öýÿíl ä(ö)ö;ö}ö>ä,îâ<ò{öýÿí8qä(öýÿî,å.öýÿíHu ä(ö)ö,öýÿî,å.öýÿídÅ ä(ö)ö)ö;öDõ*öOõ;ö}ö´@ä¨öîâD>ò:öýÿíè:å(öýÿî,å.öýÿí¬• ä(ö)ö,öýÿíÐà ä(öýÿî,å.öýÿídÅ ä(ö)ö,öýÿî,å.öýÿíHu ä(ö)ö)ö)ö{ö}÷Gä¤!îAâè@ò{öùÿõ;õ(öýÿíè»ä(ö)ökõýÿíð*å)öùÿõ{öùÿõ;õ(öýÿíè»ä(ö)ö)öùÿõýÿí¬• ä(ö)ö.öýÿí”j ä(öýÿíè»ä(ö)ö,öýÿíÔÎä(ö)ö)ö;öùÿõýÿíè:å.öýÿí ä(ö)ö.öýÿí ä(ö)ö=öýÿíð*å;öùÿõýÿíè:å.öýÿí ä(ö)ö.öýÿíl ä(ö)ö=öýÿíèê ä;öùÿõ}öùÿõ}öLäÐ î4â4Gò{öùÿõ;õ(öýÿíè»ä(ö)ökõýÿíð*å)öùÿõ{öùÿõ;õ(öýÿíè»ä(ö)ö)öùÿõýÿí¬• ä(ö)ö.öýÿí”j ä(öýÿíè»ä(ö)ö,öýÿíÔÎä(ö)ö)ö;öùÿõýÿíè:å.öýÿí ä(ö)ö.öýÿí ä(ö)ö=öýÿíð*å;öùÿõ}öùÿõ}öˆNä< îâHLò{öýÿí4à äýÿíð*å=öýÿíè»ä(ö)ö;öýÿíè:å.öýÿí ä(ö)ö.öýÿí ä(ö)ö=öÿÿô;öDõýÿíð*å;ö}öôOä¨î â¼Nò{öDõýÿíè:å.öýÿí ä(ö)ö.öýÿí ä(ö)ö;ö}öHQäøî â(Pò{öDõ*ö(öýÿíè»ä(ö)ö+öýÿí@)å)ö;ö}öœRäPî â|Qò{öDõ*ö(öýÿíè»ä(ö)ö+öýÿí@)å)ö;ö}öxSä¼îâÐRò{öDõýÿíè»ä(ö)ö;ö}ölTä(îâ¬Sò{öDõ*öýÿíè»ä(ö)ö;ö}ö˜VäXîâ Tò{öýÿí8qä(öýÿíÌ/å.öýÿíHu ä(ö)ö,öýÿíÌ/å.öýÿídÅ ä(ö)ö)ö;öDõ*öOõ;ö}ö$YäÄîâÌVò{ö;õ(öýÿíè»ä(ö)ökõÿÿô)öýÿí¬• ä(ö)ö.öýÿí”j ä(öýÿíè»ä(ö)ö,öýÿíÔÎä(ö)ö)ö;ö}öÀZä äîâXYò:öýÿíè:å(öýÿíÌ/å.öýÿíè:å)ö{öýÿíÌ/å.öýÿíHu ä(ö)ö;ö}öD\äãîâôZò:öýÿíè:å(öýÿí(© ä,öýÿíÐà ä(öýÿíà#ä,öýÿíð*å)ö)ö{ö}þ0âîâx\ò:öýÿíè:å(öýÿí¤] ä(ö)ö,öýÿíÐà ä(öýÿí0ëä(ö)ö,öýÿíð*å)ö)ö{ö}öP^øáæx^øHáæ ^øà‰æÈ^ø”æð^øH‘æ_øü”æ@_øœ•æh_ø<–æ_øÜ–æ¸_ø|—æà_ø˜æ`ø¼˜æ0`ø0âæX`øãæ€`ø 俍`øÄæÐ`øXæø`ø(æ aø¼æHaøPæpaøøæ˜aø¨æÀaø< æèaøÐ æbø¤!æ8bø¨öæ`bø,æˆbù-æ°bøŒ-æØbø .æácøÄ.æ(cøX/æü0æä¨c8* ôápäècdä`hðxhâÈc8* äPcähãáZ4^äècäPg ãáäÈc4^ôápäŒëè@däXdè fä>ùŒdîâxeòÈc”j Èdÿèäôdì€âècâÚæ eœ1 äeì âècä\eð*åãÿè0hæÄhä´hè ìèhâØhè äêâühè äê<0å(iì â8i ä â |àHi\iä´hèpiâØhìâühèj¼e ä”i4Á¼e Ðiÿèäüiä”Á䀀âÜÀâúêœ1 äDÃê¬j„ä(j4Á„djÿèäjä,Â䀀âÜÀâûêœ1 äDÃê@kTä¼j4ÁTøjÿèä$kä|Â䀀âÜÀâüêœ1 äDÃê"Œl8äkPk4Á8ŒkÿèäÈkä¸kä€âÜÀâýæ âÜÀ èœ1 äDÃðìk4Á8(lÿèäTläÜÀä€âÜÀâþæplœ1 äDÃðˆ$ô"ÈmÈ mœl4ÁÈØlÿèämä¸kä€âÜÀ âÿêœ1 äDÃð(m4ÁÈdmÿèämäÜÀä€âÜÀ ãå¬mœ1 äDÃðˆ$ôxnäØm4Ánÿèä@näÜÀ䀀âÜÀ âå\nœ1 äDÃî@)åÜÁì(oô"äˆn4Áô"Änÿèäðnä¸kä€âÜÀ âå oœ1 äDÃð@)åÜÁìØo¸ä8o4Á¸toÿèä oäÜÀ䀀âÜÀ âå¼oœ1 äDÃî@)åÜÁìˆp,"äèo4Á,"$pÿèäPpä¸kä€âÜÀâålpœ1 äDÃð@)åÜÁðää˜p4ÁäÔpÿèåqä,Â䀀âÜÀâåqœ1 äDÃî@)åÜÁð ðä˜qL¸ õâpäôÌ'ÁäÐqêh&,*äPqä¸qãåL¸ äÈqPqêäqèä,rðöâpä,É'VPädrêh&ääqäLrãåðå\räqâ8)äxrè âÀr$m è¬Ç'èê2täü)èh&¤ü äxräàrHãáør$m äðrxrâœÇ'¸PässâÿáíšsªräøäÀs¸Pôápäø™&2tä`˜&x˜&òàs¸PähsäH˜&ãáh&$m åtäô !Fãáäàs$m èXtèpä¸tè À[`\]è @õ yá t Éptè â €tDZ äæá ˆ[Dñ¨tè â ¸t`[äu(— èÈwèáp䀃è ðw x´|訂h&(— ä¸tä0uãáHu(— ä@u¸tâ"¸w`/ìuXuu`/”uÿèäÀuì€â¸tâ–éœ1 äÜuì â¸tä´vôuu`/0vÿèä\vì€â¸tâ—åxvœ1 äÜuð°5 ä”vê â¤v ä ð¼vu`/øvÿèä$wì€â¸tâ˜å@wœ1 äÜuì|w°5 ä\wê âlw ä ðô#ä˜wê â¨w ä äêäÈwæàwè äæxøàô€Û îâ hx(— x|ä°xèápèêtäŒ|èh&Ä] ä xäˆxãá x(— ä˜x xâÈxä°xæì"È{`/tyØxhx`/yHÿæXuæäHyä8ýä€â xðœ1 ädyì â xä4z|yhx`/ÀyHÿæôuæäìyä8ýä€â xìzœ1 ädyð°5 ä$zê â\³ ä{î䈆‡è ä’夆œ1 äЄð0"åÀ†ì âІ ä  à†èô†è æð²ƒä`‡â°ˆ`/ âx‡ü †öÔ@ãì:öýÿíè:å(öýÿí0"å.öýÿíHu ä(ö)ö)öùÿõ{öùÿõ}ÿ‰âX˜¼Î FâH‰üØÄö ð0‰0ëò>áî{öùÿõýÿíœö äýÿíðö ä=öýÿíl ä;öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿí@)åqõ;öpõýÿíl ä)öùÿõvõIõ(ö(ö&ö*öýÿíl ä)ö)ö õýÿíà?ä<öýÿíœö ä>övõýÿíÐAä(öýÿíÌ/å)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿíàX ä(öýÿíðö ä,öýÿíl ä)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öh&¼Î î°ˆä8 îä0ìâ\l äLì ìˆ@)åxì äêÌ/å¤ê â´ ä äæ°ˆäàááx”ä‘ôääâ‘êæêâh&¼Î X‘îÈ‘èÄêät‘ì â‘l ä쬑@)ùÌ/ål$ê<’x’ççäçæáááxýâl äá@@)é á@Ì/ál$â á @á„K䨒ä!á„Kì8áäÔ’á“È(ô:â¸(ä8)ü `““áä4“ü:áÔ)äý ”h“2锓üèÀ“ül$äì“ü:&ä ÿá ”éL”ü:á¤*ä ý°ˆä””áéД¨”ä¼Räâ¼”êæêâh&¼Î •î|•èx”êä(•ì âD•l ä¼Rì`•@)ùÌ/åäOêð•,–ççäçæáááxýâl ¼Räá@@)éá@Ì/áäOâá @á„Kä\–äá„Kì8á8ýä ˆ–´–|Tô:âlTäìTü @—¼–2á8ýäè–üá¼Rä—ü:á´Uäý ø—H—2€èt—üè —üäOäÌ—ü:ŒQäÿâ˜é,˜ü:á¤*äÿ娘âP©Xr EâؘüPŸ, îÀ˜œö ô>áî{öùÿõýÿíœö äýÿíðö ä=öýÿíl ä;öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõvõIõ(ö&ö*öýÿíl ä)ö õýÿíà?ä<öýÿíœö ä>övõýÿíÐAä(öýÿíÌ/å)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿíàX ä(öýÿíðö ä,öýÿíl ä)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öh&Xr ŒŸîX˜äˆî䨟ìâÔŸl äÄŸì ìðŸR äÄŸðÌ/å  ê â  ä äæX˜äH ááÔ¤äp \ ääæêâh&Xr ¬ î¡è, êäÈ ì âä l äí¡R äðÌ/ål$ê¡Ì¡ççäçæáááxýâl äûá @R äüá@Ì/ál$âýá @ëá„Käü¡äðá„Kì8áä (¢T¢È(ô:â¸(ä8)ü ´¢\¢á䈢ü:áÔ)äûý l£¼¢2éè¢üè£ül$ä@£ü:&äýÿát£2€è £ü éÌ£¨¤øéø£P¤øáä$¤ü:áÔ)äüýáä|¤ü:áÔ)äûý4êþX˜äð¤á饥ä¼Räæêâh&Xr T¥îÄ¥èÔ¤êäp¥ì âŒ¥l ä¼R쨥R ä¼RðÌ/åäOê8¦t¦ççäçæáááxýâl ¼Räõá @R ¼Räöá@Ì/áäOâ÷á @àá„K䤦äáá„Kì8á8ýä Цü¦|Tô:âlTäìTü ˆ§§2á8ýä0§üá¼Rä\§ü:á´Uäõý @¨§2€è¼§üèè§üäOä¨ü:ŒQä÷ÿáH¨2€èt¨üé ¨ø¨øá¼Rą̈ü:á´Uäöýá¼Rä$©ü:á´Uäõÿ堩✭(žá!⸩üЬö>ñ{öùÿõDõýÿíèôä<öýÿí>å>övõýÿí(žå(öTõ<öýÿí>å*ö>ö(öýÿíl ä)ö,öTõ<öýÿí>å*ö>ö(öýÿíR ä)ö,öýÿíˆõä)ö;öùÿõ}ö h&(žá ­îP©äDˆïäH­ä(­äâ â8­æ ìd­l ä(­ê€­R ä(­îˆõä(­ôì­â˜°(žáâ®ü̯ö>ñ{öùÿõDõýÿíèôä<öýÿí>å>övõýÿí(žå(öýÿíl ä,öýÿíR ä,öýÿíˆõä)ö;öùÿõ}ö h&(žá°îœ­ä„‡ïäD°ä$°äâ â4°æ ì`°l ä$°ì|°R ä$°ðˆõä$°ôè°â4³(žáâ±üh²ó±<¬ ôœö î{öùÿõDõýÿíÈ«ä(öýÿíl ä,öýÿíR ä,öýÿíˆõä)ö;öùÿõ}ö h&(žá¤²î˜°äè’ïäвäÀ²äâ äæü²l äì²ì ì³R äì²ðˆõäÀ²ô„³â¸»È«Mâ´³üìºòœ³<¬ ôœö î{öùÿõýÿíœö äýÿíðö ä=öýÿíˆõä;öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíˆõä,öpõýÿíl ä)öùÿõvõIõ(ö&ö*öýÿíˆõä)ö õýÿíà?ä<öýÿíœö ä>övõýÿíÐAä(ö*öýÿíl ä)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿíàX ä(öýÿíðö ä,öýÿíˆõä)ö;öùÿõPõ;öùÿõ}öùÿõùÿõDõýÿíˆõä;öùÿõ}öh&È«(»î4³ä’ïäT»äD»äâ 俀»l äp»ì 윻R äp»ðˆõäD»ô¼â4¾ â ¼ü ½ö>ñ{öùÿõGõ[ö]öWõ<öõ*ö>ö(öýÿíð*å)ö;öùÿõ}öh& ܽääïäø½ìæð*å¾ì â$¾æ ô„¾âÀÇ´ËáY✾üôÆö>ñ{öùÿõýÿíøó ä<öýÿí>å*ö,öýÿíÜBä>öýÿíˆõä(öÿÿô,öÿÿô)ö;öùÿõ>õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿíˆõä.öýÿíl ä=öWõ<öýÿí>å*ö>ö(öIõ(öýÿíìä)öõ[öEõ(öýÿí>å)ö*öýÿí@)å]ö)ö;öùÿõ;õ(öýÿíˆõä.öýÿíl äkõÿÿô)öùÿõ{öùÿõýÿíˆõä.öýÿí ä=öýÿí@)å;öùÿõCõ;öùÿõ}öùÿõ<õùÿõýÿí@)å_õÿÿìæ;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}ö h&´Ëá0Çâî4¾äïä¤ÇäLÇäâ â ôs\ÇÇäpÇè â€Çæ ðò@)ýÈâäÉ`4â(ÈüÐÈö>ñ{öùÿõDõ[õ;öùÿõ}öh&`4 ÉîÀÇ䘎ïä(ÉØÉèâˆÉˆ$äDÉê âTÉ ä â¯dÉèxÉè ðˆ$ä¤Éê â´É ä â¯ÄÉèxÉü4Êâ0Ì`4âdÊü ËòLÊ>õ´>áî{öùÿõDõ[õ;öùÿõ}öh&`4HËîäÉä¸ïädË$ÌèâÄˈ$ä€Ëê âË ä ⯠Ëè´Ëè ðˆ$äàËê âðË ä â¯áÌèÌè äú€Ìâ°·5â°ÌüXÍò˜Ì>õ´>áî{öùÿõDõZõ;öùÿõ}öh&5”Íî0Ìäïä°ÍpÎèâΈ$äÌÍê âÜÍ ä â¯ìÍéÎè ðˆ$ä,Îê â<Î ä â¯LÎè`Îè äö„Î؃`/ÀÎÿèäìÎÜ9è€â€ƒ âåÏœ1 äЄñ,å$Ïì â 4ϸ9äŒÏ\gèÔÏèápäLÐè Ðð$Ðh&\gä4Ïä¬ÏãáÄÏ\gä¼Ï4Ïæè:åÔÏæè:áìÏè âüÏæ ðÔ@ÿíÔÏæä¤ÐèôôáæàßèÈÑääÒähÔ¸ßh&èôäLÐäÄÐãáÜÐèôäÔÐLÐæ(žå ìФÐ(žá(ÑÿèätÑäTÑä€âLÐâ„áâ âdÑæ ìÑl äTÑì¬ÑR äTÑðˆõäTÑìàÑ>ñHÒ4ÄáçøÑIê$ÒxQôâ â@m4ÒèdÑìð!áç`ÒéŒÒ¸ÒøIêdÑøâ4êÿæìÐîâÓò{öùÿõDõýÿíÈ«ä(öýÿíl ä,öýÿíR ä,öýÿíˆõä)ö;öùÿõ}ö ˜ÙtÔÙäÌÔèôôápððÕäÖLÐäÜØh&èôätÔäìÔãáÕèôäüÔtÔæ(žå ÕÌÔ(žáPÕÿèäœÕä|Õä€âtÔâ†áâ âŒÕæ ì¸Õl ä|ÕìÔÕR ä|Õðˆõä|Õð>ùÕîâ<Öò{öùÿõ@õ(ö;öýÿíl ä<öýÿíR ä;öpõýÿíˆõä,öpõýÿíl ä)öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõDõýÿíˆõä;öùÿõ}ÿòÕæÙäŒÕèXÙá,ÙáX®ùá4êÿâálÙäâ4ÿî¤Ù$ßäüÙèôôápð Ûä8ÛLÐäüÞh&èôä¤ÙäÚãá4Úèôä,Ú¤Ùæ(žå DÚüÙ(žá€ÚÿèäÌÚä¬Úä€â¤Ùâ…áâ â¼Úæ ìèÚl ä¬ÚìÛR ä¬Úðˆõä¬Úð>ùDÚî&âlÛò{öùÿõýÿíä¶ äýÿí@)å=öXõ<öýÿíä¶ ä>ö(öýÿíR ä-öýÿíl ä)ö;öùÿõýÿíä°ä(öýÿíˆõä,öýÿíl ä,öýÿí@)å*öEõ(öýÿí>å)ö)ö;öùÿõDõýÿíˆõä+öýÿí@)å;öùÿõ}ÿòDÚæ8ßä¼ÚèxßáLßáX®ùá4êÿâáŒßäâ4êÿúìÐæä8à(6è(0èBpäåªàèäœ1è˜8Xà(6äàßä¬.ãáh&°{äxàäT-ãáäXà°{èÐàèpälè8áäPáè p áèàȃ ìâá Éìå”ááè â(áæ ð>ñ Øâ„áœáîâ0âö>ñXàÔÎØáÿèäâ쀀âxàâéœ1 ä âê âxàä{öùÿõDõýÿíȃ ä;öùÿõ}ö Pä ã$ãîâ¨ãö>ñXàèê `ãÿèäŒã쀀âxàâ€éœ1 ä âê{öùÿõDõýÿí Éä;öùÿõ}ö ô„äœäîâ¤ö>ñXà<: Øäÿèäˆäåä€âxàâåä\åLèïèpäxàªàèä|ïè XàLäåä|å ãá”åLäŒååâ"0ç`/8æ¤å\å`/àåÿèä æì€âåânéœ1 ä(æì âåè@æ\å`/|æÿè䍿ì€âåâ{åÄæœ1 ä(æìàæ4päáðˆ¾ äüæì â çæ âxàçè(áèÄç„ä@ç\å„|çÿèä¨çäàß䀀âåâoéœ1 ä(æêXèTäÔç\åTèÿèä<èäá䀀âåâpéœ1 ä(æê"¤é8üèhè\å8¤èÿèäàèäÐèä€âåâqå âå èœ1 ä(æðé\å8@éÿèäléäåä€âåâråˆéœ1 ä(æðˆ$ô"àêÈ8ê´é\åÈðéÿèäêäÐèä€âåâséœ1 ä(æð@ê\åÈ|êÿèä¨êäåä€âåâtåÄêœ1 ä(æðˆ$ôëô"äðê\åô",ëÿèäXëäÐèä€âåâuåtëœ1 ä(æð@)õ@ìä ë\åÜëÿèäìäå䀀âå âvå$ìœ1 ä(æî@)õðì,"äPì\å,"Œìÿèä¸ìäÐèä€âå âwåÔìœ1 ä(æð@)õ Híáí\å¸<íÿèähíäå䀀âå âxå„íœ1 ä(æî@)ù¨í\å¸äíÿèäî쀀âå âyå,îœ1 ä(æîì¿äÐèêøîääXî\åä”îÿèäÀîäàß䀀âå âzåÜîœ1 ä(æîP&õlïÜäïá ïÜáèå˜l8ïè âHïæ âxàXïè(áì˜lä ïÐðä@æî â°ïò:öýÿíÜä(öýÿí4pä)ö,öýÿí˜lä(öýÿ툾 ä)ö{ö}öäòäXîîâñò{öýÿíLäýÿí`Tä(ö*öOõ)ö;öýÿí`Täaõýÿí`œä(öýÿíP&å)ö;öDõ*öýÿí`Tä;ö}ö8ôä¨íî âóò{öDõýÿí`œä(öýÿíÜä-öýÿíì¿ä.öýÿíÜä)ö;ö}ötõåíî âlôò{öDõýÿíLä(ö*öOõ)öbõýÿí@)å;ö}ö˜öäPìî â¨õò{öýÿíÜäbõýÿí@)å;öDõ*öOõ;ö}öÔ÷ä ëî âÌöò{öDõýÿíLä(ö*öOõ)öaõýÿí@)å;ö}öøøäðêî âøò{öýÿíÜäaõýÿí@)å;öDõ*öOõ;ö}öÜúä@êîâ,ùò{öýÿíLäýÿí`Tä(ö*öOõ)ö;öqõ(ö*öOõ)ö;öDõýÿí`Tä;ö}öèûä´éî âûò{öqõýÿíÜä;öDõ*öOõ;ö}öÌýäéîâüò{öýÿíLäýÿí`Tä(ö*öOõ)ö;öpõ(ö*öOõ)ö;öDõýÿí`Tä;ö}öØþähèî ãþò{öpõýÿíÜä;öDõ*öOõ;ö}ö„ÿäÔçîâ ÿò{öDõýÿíÜä;ö}ö¨ä@çî â¸ÿò{öDõýÿí(6ä(öýÿíÜä,öýÿí˜lä)ö;ö}þ¤åîâÜò{ö}ö¸ø4æ â $HDXääDèlâ(áè€î”âáìâ¨è â(á äàø¤åæø@çæ0øÔçæXøhèæ€øéæ¨ø´éæÐø@êæøøðêæ ø ëæHøPìæpùíæ˜ø¨íæÀøXîætøèææ5ø âlä4ì€âPÌ/åÐèî<0åÐèê{öDõýÿíÌ/å.öýÿíÜäjõýÿí<0å.öýÿíÜä;ö}ö(øœæÌæ`4ø â äèì€âÌ/åÐèî<0åÐèê{öDõýÿíÌ/å.öýÿíÜäkõýÿí<0å.öýÿíÜä;ö}öÜøPæ€æ¸ø âÔäœì€â¸Ì/åÐèî<0åÐèê{öDõýÿíÌ/å.öýÿíÜä<öýÿí<0å.öýÿíÜä;ö}ö ø æ4 æðø ∠äP ì€âl Ì/åÐèî<0åÐèê{öDõýÿíÌ/å.öýÿíÜälõýÿí<0å.öýÿíÜä;ö}öD ø¸ æè æÌø â< ä ì€â Ì/åÐèî<0åÐèê{öDõýÿíÌ/å.öýÿíÜä>öýÿí<0å.öýÿíÜä;ö}öø øl æœ æ¸ø âð ä¸ ì€âÔ Ì/åÐèî<0åÐèê{öDõýÿíÌ/å.öýÿíÜämõýÿí<0å.öýÿíÜä;ö}ö”ø æPæø â¤äläåä€âˆ@)ùì¿äÐèê{öDõýÿíLä(öýÿíì¿ä)öaõýÿí@)å;ö}ö¼øïæäø ïæ ø@ææü4ædðHù âxàtè(áìœ1 ä âì{öùÿõDõýÿíLä(öýÿí”å+öýÿíȃ ä,öOõ)ö;öùÿõ}ö ä(@î âÄö>ñXàHý |ÿèä¨äåä€âxàâ~éœ1 ä âì{öùÿõDõýÿíLä(öýÿí”å,öOõ)ö;öùÿõ}ö Ä0îâ´ö>ñXàì.lÿèä˜ì €âxàâ}éœ1 ä âì{öùÿõýÿíàX ä(öýÿí”å,öýÿí”å+öýÿí Éä)ö;öùÿõvõýÿ픀ävõýÿí ä(öýÿí”å)ö;öùÿõ}úøî(â°ö>ñXà`/Lÿèäxì€âxàâ|唜1 ä âðü*õ{öùÿõýÿíøó ä<öýÿí>å*ö,öýÿíÜBä>öýÿílä=öýÿí´Ëå<öýÿí>å>ö(öýÿíü*å)ö;öùÿõýÿí”å=öýÿílä.öýÿíl ä;öùÿõýÿíȃ ä=öýÿílä.öýÿí ä;öùÿõýÿí Éä=öÿÿô;öùÿõ}ö¤ø˜æ¨æÌøåéøôæ(áæ4ø(æáæ\øàßè´ø„æàßðHùÜøæø0æ,ø@æTøœäæ|ø$ãæ¤øœáæÌùáæ¤øôæXà`/0âÿèä\ìãxà â‚åxè âø”ê âxà ÿàÌæXà2âÿèä4ä”ääxà âƒåPè âø”êä ÄÔâ´#äŒ#èpä´°èÈ#äø#èd,h&ÔâälääãáüÔâäôlâÌ `/ä Ä`/H Pÿèät ì€âlâfå  œ1 ä ì âlèÌ/å¼ ì ìp!„äÜ Ä„!ÿèäT!äD!ä€âlâgå âl èœ1 ä ì@"2ä€!Ä2¼!ÿèäè!äD!ä€âlâhå"œ1 ä ðPýä "ê â0" ä äæ"|#8Ô"P"Ä8Œ"ÿèä¸"äD!ä€âlâiéœ1 ä ðÜ"Ä8#ÿèäD#älä€âlâjå`#œ1 ä ðˆ$øŒÊäŒ#åŒÊ¤#è ð(Jìà#ü ô>áî $&,$Ü"îâ\$òD$ü ô>áî{öùÿõýÿíÔâäýÿí`Tä(ö*öOõ)ö;öùÿõpõýÿíŒÊä;öùÿõDõýÿí`Tä;öùÿõ}ö ¨'X&P"î âˆ&òp&ü ô>áî{öùÿõpõýÿíŒÊä;öùÿõDõ*öOõ;öùÿõ}ö *Ü'€!îâ (òô'ü ô>áî{öùÿõvõIõ(ö&ö*öýÿíŒÊä)öýÿí>å(öýÿíPýä)ö;öùÿõDõ*öOõ;öùÿõ}ö (+8*Ü îâh*òP*ü ô>áî{öùÿõDõ*öOõ;öùÿõ}ú\+ î âŒ+òt+ü ô>áî:öýÿíŒÊä(öýÿíÌ/å)öùÿõ{öùÿõ}öŒ,ø æ´,øÜ æÜ,ø€!æ-øP"æ,-øÜ"æüŒ#æl-°{äd-xàâ|-ŒÍä ˜”-LäŒ-åâ°-DZä¤-êÌ-`œäÀ-êÜ-ÐAä ôì-4à ä (.(6äü-àßâ.`/.ä ô,.ì.ä 0<.Hý ä @L.<: ä œä\.èê ä $ãl.ÔÎä œá|.ȃ ä ÐàŒ. Éä èàœ.”æáä2ä ÌÄ.(6ä¼.àßâ„/2äÔ.8à2/ÿèäå(öýÿíì¿ä)ö;öùÿõpõýÿí˜lärõýÿí Éä;öùÿõ}öùÿõDõ*öýÿíÜä;öùÿõ}öÀ8øÔ.æè8ø”/æ9ø(0æ89ø@0æ`9ø¬0æüˆ9æåðHÿáÌ9è ø"œ>2¤:ø9؃24:ÿèä `:˜:ü…ä€â€ƒâ‰å|:œ1 äЄð0"åü…ø´=¬:؃2è:îœ;äÌ>îä ;;ü…ä ä“å0;œ1 äЄð0"åL;ì â\; ä  l;è€;è æð²ƒäì;â‡2â<ü¬:öÔ@ãì{öùÿõýÿí8qä(öýÿí0"å.öýÿíHu ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ú¼=؃2ø=ÿèä $>>ü…ä€â€ƒ â‘å@>œ1 äЄñ,å\>ì â4Ïl>è€>è ø؃ì.è>ÿèä?0?è €â€ƒâŠéœ1 äЄøì?„äL?؃„ˆ?ÿèä Ä?à?´?䀀 â‹å â,„ èœ1 äЄöœ@Täü?؃T8@ÿèä t@@d@䀀 âŒå â,„êœ1 äЄööýÿî,å;öùÿõýÿî,å.öýÿíè:å=öýÿíHu ä(ö)ö;öùÿõDõýÿî,å;öùÿõ}úPF؃¤ŒFîGä7îä ìFG¸FäR ä•å  ÈFèÜFè æèœ1 äЄø²ƒädGâ¸C¤â|GüPFöÔ@ãì{öùÿõDõýÿíä¦ ä<öýÿíÔ@å>ö(öýÿíHu ä(ö)ö)ö;öùÿõ}úè:åôHåè:ád@ìÜ?ñ ðJXI¼=îâpIöÜ?ñ{öùÿõýÿí8qä(öýÿî,å.öýÿíè:å)ö;öùÿõDõ*öOõ;öùÿõ}ö DL$K„Îî âîâ„OöÜ?ñ{öùÿõGõýÿíè:å;öùÿõ}ö (R`Pø9îâxPöÜ?ñ{öùÿõýÿí8qä(öýÿí0"å.öýÿíHu ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö ¬S\R\…î âtRöÜ?ñ:öýÿíè:å(öýÿí0"å.öýÿíHu ä(ö)ö)öùÿõ{öùÿõ}ö ÐTàSL„î âøSöÜ?ñ:öýÿíè:å(öýÿíð*å)öùÿõ{öùÿõ}ö DWUìAîâUöÜ?ñ{öùÿõ;õ(öýÿíè:åkõýÿíð*å)öùÿõ{öùÿõGõýÿíè:å;öùÿõýÿíè:å=öýÿíð*å;öùÿõ}öùÿõ}úxWLAîâWöÜ?ñ{öùÿõýÿíÜ?å*öýÿí`Tä=öýÿíè:å;öùÿõýÿíè:å=öÿÿô;öùÿõDõýÿí`Tä;öùÿõ}ö€Yø „æ¨YøL„æÐYø\…æøYøø9æ Zø¬>æHZøL?æpZøü?æ˜Zø¬@æÀZøLAæèZøìAæ[ø„Îæ8[ø¼=æüôHæt[ä€tìâptèå”á [è â °[4à 俨[Äð$\áCâð[è âÜá\è\è ð ’ â<\è â¯L\è\èä¨\$m õèxr2täà\êh&áf ä`\äÈ\ãå$m äØ\`\âô\ð]âÌ"ìâȲè @iP]˜]îoâ¼^òh]Äð€]áCò ’ îàsR Ô]âÿèå^쀀ãtiâ†å,^œ1 ä^ê ãtäH^PGäptìd^(äptì ^|,å€^ê â^æ ð„äptì{öùÿõ;õ(öýÿíPGä>öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿí$iâ)ö;öùÿõùÿõýÿíDZäýÿíˆÏä=öýÿí˜ ä(öýÿíèê ä(ö)ö-öýÿíPGä,öýÿí(ä)ö;öùÿõýÿíDZäýÿí\yä=öýÿí˜ ä(öýÿíˆÏä,öýÿí„ä)ö;öùÿõ õýÿíˆõä=öýÿîCävõýÿíR ä(öýÿíäýä(öýÿíHý ä(ö)ö)ö+öýÿíPGä,öýÿí|,å,öýÿí\yä)ö;öùÿõ;õ(öýÿíˆõäjõÿÿô)öùÿõ{öùÿõ;õ(öýÿíˆÏä<öýÿí„ä)öùÿõDõ-öÿÿìæ;öùÿõ;õ(öýÿíˆÏäjõýÿí„ä)öùÿõDõÿÿô;öùÿõDõÿÿìæ;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}östring compare: pos > lenâ ¬lti¼iîâ´jòŒiÄð¤iáCò ’ îàsR øiÿèä$j쀀ãthâ…å@jœ1 ä^ê\jPGäptìxj(äptð|,å”jê â¤jæ ì{öùÿõDõýÿíR ä(öýÿíPGä,öýÿí(ä,öýÿí|,å,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö pàl(mîâèmòølÄðmáCò ’ îàsR dmÿèäm쀀ãtgâ„å¬mœ1 ä^î|,åÈmê âØmæ ì{öùÿõDõýÿíR ä(öÿÿô,öýÿíèê ä(ö)ö,öýÿí|,å,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö 8wDpŒpî:â¬qò\pÄðtpáCò ’ îàsR Èpâÿèäôp쀀ãtfâƒåqœ1 ä^ê,qPGäptìHq(äptìtqLwädqê ãt äqàFäptð„äptì{öùÿõ;õ(öýÿíàFä>öýÿíLwä.öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿíwâ)ö;öùÿõùÿõDõýÿíR ä(öýÿíPGä,öýÿí(ä,öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö+öýÿíàFä,öýÿí˜ ä(öýÿíLwä.öýÿíèê ä(ö)ö-öýÿíàFä,öýÿí„ä)ö)ö;öùÿõ}östring compare: pos > lenâ D{lw´wîâŒxò„wÄðœwáCò ’ îàsR ðwÿèäx쀀ãteâ‚å8xœ1 ä^êTxPGäptìpx(äptðLwädqê{öùÿõDõýÿíR ä(öýÿíPGä,öýÿí(ä,öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö Hx{À{îâ`|ò{Äð¨{áCò ’ îàsR ü{ÿèä(|쀀ãtdâåD|œ1 ä^îLwädqê{öùÿõDõýÿíR ä(öÿÿô,öýÿíèê ä(ö)ö,öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö Ä…|Äî0âò”Äð¬áCò ’ î às¤Øá€âÿèä,€åt䀀ãtcâ€åH€œ1 ä^ꀨód€ptì4ÿî@)ᬀptìIêØ€átátðæà€âàs]ptÿè{öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿ휅&â)ö;öùÿõùÿõýÿíDZäýÿí\yä=öýÿí˜ ä(öýÿí@)å,öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõDõýÿí$m ä(ö*öOõ,öýÿí¨óä,öýÿí\yä)ö;öùÿõ}ö$basic_string::substr pos out of rangeâ Xø…@†îaâ@‡ò†Äð(†áCò ’ îàsxF |†âÿè䨆äpt䀀ãtbâåĆœ1 ä^êð†T#åà†ì ð ¨ó ‡ptìIê8‡átátðæà€{öùÿõ;õ(öýÿíèê ä(ö)öjõÿÿô)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö-öÿÿìæ)öùÿõýÿí¨óä=öýÿíèê ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿíääýÿíP&å=öýÿí<Þä(ö)ö-öýÿí`œä(öýÿí¨óä+öÿÿìæ)ö;öýÿíP&åkõýÿí<Þä(ö)ö;öpõýÿíP&å)öùÿõ;õ(ö!öýÿîCävõýÿí¸nä(ö*öýÿíP&å,öýÿíT#å)ö)öùÿõDõýÿíDZä(öýÿíP&å.öýÿí¼e ä(ö)ö-öýÿíHý ä(ö)ö-öÿÿìæ)ö;öùÿõDõýÿí]ä;öùÿõ}ö ¬“ŒÔîâä‘ò¤Äð¼áCò ’ îàsxF ‘ÿèä<‘äpt䀀ãtaâ~åX‘œ1 ä^ꔑ|,åt‘ê â„‘æ ð ¨ó°‘ptìIêÜ‘átátðæà€{öùÿõDõýÿíxF ä(öýÿí|,å,öýÿí¨óä,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö à¡à“(”îˆâ •òø“Äð”áCò ’ îàsxF d”âÿèä”äpt䀀ãt`â}嬔œ1 ä^êè”|,åÈ”ê âØ”æ 앨óäptð@)åptì{öùÿõ;õ(öýÿíèê ä(ö)öjõÿÿô)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö-öÿÿìæ)öùÿõýÿí¨óä=öýÿíèê ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿíääýÿíP&å=öýÿí<Þä(ö)ö-öýÿí`œä(öýÿí¨óä+öÿÿìæ)ö;öýÿíP&åkõýÿí<Þä(ö)ö;öpõýÿíP&å)öùÿõ{öùÿõ!õýÿíÄä*öýÿí'å=öýÿí|,å;öùÿõ@õ(öýÿíDZäýÿí(ä=öÿÿô;öýÿí(ä<öýÿí@)å;öpõýÿí(ä,öpõýÿí'å)öùÿõ;õ(öýÿîCävõýÿí¸nä(ö*öýÿíP&å,ö*öýÿí'å)ö)öùÿõAõýÿíhä;öùÿõDõýÿíDZä(öýÿíP&å.öýÿí¼e ä(ö)ö-öýÿíHý ä(ö)ö-öÿÿìæ)ö;öùÿõýÿíhä:öùÿõ;öùÿõ}öùÿõDõýÿí]ä;öùÿõ}ö Ô¥¢\¢îâL£ò,¢ÄðD¢áCò ’ îàsxF ˜¢ÿèäÄ¢äpt䀀ãt_â|å࢜1 ä^êü¢Lwädqî ¨ó£ptìIêD£átátðæà€{öùÿõDõýÿíxF ä(öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿí¨óä,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö À­¦P¦îEâH§ò ¦Äð8¦áCò ’ îàs`Å Œ¦âÿè並äpt䀀ãt^â{åÔ¦œ1 ä^ë§T#åð¦ì ð ¨ó§ptì4ÿê{öùÿõ;õ(öýÿí¨óämõýÿíèê ä(ö)ö)öùÿõDõýÿí]ä;öùÿõ@õ(öýÿíDÅ äýÿíP&å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öýÿíP&åkõýÿí<: ä(ö)ö;öpõýÿíP&å)öùÿõ;õ(ö!öýÿîCävõýÿí¸nä(ö*öýÿíP&å,öýÿíT#å)ö)öùÿõDõýÿíDZä(öýÿíP&å-öýÿíHý ä(ö)ö)ö;öùÿõDõýÿí]ä;öùÿõ}ö ±ô­<®îâD¯ò ®Äð$®áCò ’ îàs`Å x®ÿè䤮äpt䀀ãt]âzåÀ®œ1 ä^êü®|,åÜ®ê âì®æ ð ¨ó¯ptì4ÿê{öùÿõDõýÿí`Å ä(öýÿí|,å,öýÿí¨óä,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö ¨½@±ˆ±îw′òX±Äðp±áCò ’ îàs`Šıâÿèäð±äpt䀀ãt\âyå ²œ1 ä^êH²|,å(²ê â8²æ ìd²¨óäptð@)åptì{öùÿõ;õ(öýÿí¨óämõýÿíèê ä(ö)ö)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõýÿí¨óä;öùÿõ@õ(öýÿíDÅ äýÿíP&å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öýÿíP&åkõýÿí<: ä(ö)ö;öpõýÿíP&å)öùÿõ{öùÿõ!õýÿíÄä*öýÿí'å=öýÿí|,å;öùÿõ@õ(öýÿíDZäýÿí(ä=öÿÿô;öýÿí(ä<öýÿí@)å;öpõýÿí(ä,öpõýÿí'å)öùÿõ;õ(öýÿîCävõýÿí¸nä(ö*öýÿíP&å,ö*öýÿí'å)ö)öùÿõAõýÿíhä;öùÿõDõýÿíDZä(öýÿíP&å-öýÿíHý ä(ö)ö)ö;öùÿõýÿíhä:öùÿõ;öùÿõ}öùÿõDõýÿí]ä;öùÿõ}ö ”Áܽ$¾îâ ¿òô½Äð ¾áCò ’ îàs`Å `¾ÿè䌾äpt䀀ãt[âx娾œ1 ä^êľLwädqî ¨óà¾ptì4ÿê{öùÿõDõýÿí`Å ä(öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿí¨óä,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö ÌÈÁÂî`âÃòàÁÄðøÁáCò ’ îàsXÃLÂâÿèäxÂäpt䀀ãtZâw唜1 ä^êÀÂT#å°Âì ð ¨óÜÂptìIêÃátátðæà€{öùÿõ;õ(öýÿíèê ä(ö)öjõÿÿô)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö-öÿÿìæ)öùÿõýÿí¨óä=öýÿíèê ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿíääýÿíP&å=öýÿí<Þä(ö)ö-öýÿí`œä(öýÿí¨óä+öÿÿìæ)ö;öýÿíP&åkõýÿí<Þä(ö)ö;öpõýÿíP&å)öùÿõ;õ(öýÿîCävõýÿí¸nä(ö*öýÿíP&å,öýÿíT#å)ö)öùÿõDõýÿíDZä(öýÿíP&å.öýÿí¼e ä(ö)ö-öýÿíHý ä(ö)ö-öÿÿìæ)ö;öùÿõDõýÿí]ä;öùÿõ}ö dÏDÌŒÌîâœÍò\ÌÄðtÌáCò ’ îàsXÃÈÌÿèäôÌäpt䀀ãtYâvåÍœ1 ä^êLÍ|,å,Íê â<Íæ ð ¨óhÍptìIê”Íátátðæà€{öùÿõDõýÿíXÃä(öýÿí|,å,öýÿí¨óä,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö ݘÏàÏîƒâØÐò°ÏÄðÈÏáCò ’ îàsXÃÐâÿèäHÐäpt䀀ãtXâuådМ1 ä^ê Ð|,å€Ðê âÐæ ì¼Ð¨óäptð@)åptì{öùÿõ;õ(öýÿíèê ä(ö)öjõÿÿôhõýÿí@)åjõÿÿô)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö-öÿÿìæ)öùÿõýÿí¨óä=öýÿíèê ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿíääýÿíP&å=öýÿí<Þä(ö)ö-öýÿí`œä(öýÿí¨óä+öÿÿìæ)ö;öýÿíP&åkõýÿí<Þä(ö)ö;öpõýÿíP&å)öùÿõ{öùÿõ!õýÿíÄä*öýÿí'å=öýÿí|,å;öùÿõ@õ(öýÿíDZäýÿí(ä=öÿÿô;öýÿí(ä<öýÿí@)å;öpõýÿí(ä,öpõýÿí'å)öùÿõ;õ(öýÿîCävõýÿí¸nä(ö*öýÿíP&å,ö*öýÿí'å)ö)öùÿõDõýÿíDZä(öýÿíP&å.öýÿí¼e ä(ö)ö-öýÿíHý ä(ö)ö-öÿÿìæ)ö;öùÿõ}öùÿõDõýÿí]ä;öùÿõ}ö áTÝœÝîâŒÞòlÝÄð„ÝáCò ’ îàsXÃØÝÿèäÞäpt䀀ãtWâtå Þœ1 ä^ê<ÞLwädqî ¨óXÞptìIê„Þátátðæà€{öùÿõDõýÿíXÃä(öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿí¨óä,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö èèHááîDâˆâò`áÄðxááCò ’ îàs<ÍÌáâÿèäøáäpt䀀ãtVâsåâœ1 ä^ê@âT#å0âì ð ¨ó\âptì4ÿê{öùÿõ;õ(öýÿí¨óämõýÿíèê ä(ö)ö)öùÿõDõýÿí]ä;öùÿõ@õ(öýÿíDÅ äýÿíP&å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öýÿíP&åkõýÿí<: ä(ö)ö;öpõýÿíP&å)öùÿõ;õ(öýÿîCävõýÿí¸nä(ö*öýÿíP&å,öýÿíT#å)ö)öùÿõDõýÿíDZä(öýÿíP&å-öýÿíHý ä(ö)ö)ö;öùÿõDõýÿí]ä;öùÿõ}ö 4ìédéîâlêò4éÄðLéáCò ’ îàs<Í éÿèäÌéäpt䀀ãtUâråèéœ1 ä^ê$ê|,åêê âêæ ð ¨ó@êptì4ÿê{öùÿõDõýÿí<Íä(öýÿí|,å,öýÿí¨óä,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö P÷hì°ìîgâ¨íò€ìÄð˜ìáCò ’ îàs<Íììâÿèäíäpt䀀ãtTâqå4íœ1 ä^êpí|,åPíê â`íæ ìŒí¨óäptð@)åptì{öùÿõ;õ(öýÿí¨óämõýÿíèê ä(ö)öhõýÿí@)åjõÿÿô)öùÿõDõýÿí]ä;öùÿõ@õ(öýÿíDÅ äýÿíP&å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öýÿíP&åkõýÿí<: ä(ö)ö;öpõýÿíP&å)öùÿõ{öùÿõ!õýÿíÄä*öýÿí'å=öýÿí|,å;öùÿõ@õ(öýÿíDZäýÿí(ä=öÿÿô;öýÿí(ä<öýÿí@)å;öpõýÿí(ä,öpõýÿí'å)öùÿõ;õ(öýÿîCävõýÿí¸nä(ö*öýÿíP&å,ö*öýÿí'å)ö)öùÿõDõýÿíDZä(öýÿíP&å-öýÿíHý ä(ö)ö)ö;öùÿõ}öùÿõDõýÿí]ä;öùÿõ}ö <û„÷Ì÷îâ´øòœ÷Äð´÷áCò ’ îàs<Íøÿèä4øäpt䀀ãtSâpåPøœ1 ä^êløLwädqî ¨óˆøptì4ÿê{öùÿõDõýÿí<Íä(öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿí¨óä,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö Hpû¸ûîfâ¸üòˆûÄð ûáCò ’ îàsð!ôûâÿèä üäpt䀀ãtRâoå<üœ1 ä^êhüT#åXüì ð ¨ó„üptìIê°üátátðæà€{öùÿõ;õ(öýÿíèê ä(ö)ö<öÿÿìæ)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö-öÿÿìæ)öùÿõýÿí¨óä=öýÿíèê ä(ö)ö-öÿÿìæ;öùÿõýÿíDÅ äýÿíð*å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öùÿõ?õùÿõ{öùÿõ;õ(öýÿîCävõýÿí¸nä(öýÿíT#å,ö*öýÿíð*å)ö)öùÿõDõXõ<öýÿíDZä>ö(öýÿíð*å-öýÿíHý ä(ö)ö)ö;öùÿõ}ö>õ(öýÿíð*å>öýÿíHý ä(ö)öiõ(öqõýÿíð*å,öZõ)ö)ö;öùÿõDõýÿí]ä;öùÿõ}ö œ |ÄîâÔò”Äð¬áCò ’ î àsð!áÿèä,äpt䀀ãtQânåHœ1 ä^ê„|,ådê âtæ ð ¨ó ptìIêÌátátðæà€{öùÿõDõýÿíð!ä(öýÿí|,å,öýÿí¨óä,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö ðÐ  î”â òè Äñ áCò ’ îàsð!T âÿèä€ äpt䀀ãtPâmåœ œ1 ä^êØ |,å¸ ê âÈ æ ìô ¨óäptð@)åptì{öùÿõ;õ(öýÿíèê ä(ö)ö<öýÿí@)å)öùÿõDõýÿí]ä;öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö-öýÿí@)å)öùÿõýÿí¨óä=öýÿíèê ä(ö)ö-öýÿí@)å;öùÿõ!õýÿíÄä*öýÿí„ä=öýÿí|,å+öýÿí@)å;öùÿõýÿíDÅ äýÿíð*å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öùÿõ?õùÿõ{öùÿõýÿíDÅ äýÿí”/ä=öýÿíð*å;öùÿõ@õ(ö!õýÿíÄä*öýÿí€Bä=öýÿí|,å;öýÿí€Bä<öýÿí„ä;öpõýÿí€Bä,öpõýÿí”/ä)öùÿõ;õ(ö!öýÿîCävõýÿí¸nä(ö*öýÿí€Bä,ö*öýÿí”/ä)ö)öùÿõAõýÿídhä;öùÿõDõXõ<öýÿíDZä>ö(öýÿíð*å-öýÿíHý ä(ö)ö)ö;öùÿõýÿídhä:ö;öùÿõ}ö>õ(öýÿíð*å>öýÿíHý ä(ö)öiõ(öqõýÿíð*å,öZõ)ö)ö;öùÿõDõýÿí]ä;öùÿõ}ö ä$lîâ\ò<ÄðTáCò ’ îàsð!¨ÿèäÔäpt䀀ãtOâlåðœ1 ä^ê Lwädqî ¨ó(ptìIêTátátðæà€{öùÿõDõýÿíð!ä(öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿí¨óä,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}÷ %`îGâXò0ÄðHáCò ’ îàs°Ú œâÿèäÈäpt䀀ãtNâkåäœ1 ä^êT#æì ð ¨ó,ptì4ÿê{öùÿõ;õ(öýÿí¨óämõýÿíèê ä(ö)ö)öùÿõDõýÿí]ä;öùÿõ@õ(öýÿíDÅ äýÿíð*å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öýÿíð*å<öýÿí<: ä(ö)ö;öpõýÿíð*å)öùÿõ;õ(öýÿîCävõýÿí¸nä(öýÿíT#å,ö*öýÿíð*å)ö)öùÿõDõXõ<öýÿíDZä>ö(öýÿíð*å-öýÿíHý ä(ö)ö)ö;öùÿõDõýÿí]ä;öùÿõ}ö L(4%|%îâ„&òL%Äðd%áCò ’ îàs°Ú ¸%ÿèää%äpt䀀ãtMâjæ&œ1 ä^ê<&|,å&ê â,&æ ð ¨óX&ptì4ÿê{öùÿõDõýÿí°Ú ä(öýÿí|,å,öýÿí¨óä,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö 6€(È(î„âÀ)ò˜(Äð°(áCò ’ îàs°Ú )âÿèä0)äpt䀀ãtLâiåL)œ1 ä^êˆ)|,åh)ê âx)æ ì¤)¨óäptð@)åptì{öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö)öùÿõDõýÿí]ä;öùÿõýÿíDZäýÿíX`ä=öýÿíèê ä(ö)ö-öýÿí¨óä;öùÿõ!õýÿíÄä*öýÿí„ä=öýÿí|,å+öýÿí@)å;öùÿõ@õ(öýÿíDÅ äýÿíð*å=öýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öýÿíX`ämõýÿí@)å;öpõýÿíð*å,öqõýÿíX`ä)öùÿõ{öùÿõýÿíDÅ äýÿí”/ä=öýÿíð*å;öùÿõ@õ(ö!õýÿíÄä*öýÿí€Bä=öýÿí|,å;öýÿí€Bä<öýÿí„ä;öpõýÿí€Bä,öpõýÿí”/ä)öùÿõ;õ(ö!öýÿîCävõýÿí¸nä(ö*öýÿí€Bä,ö*öýÿí”/ä)ö)öùÿõAõýÿídhä;öùÿõDõXõ<öýÿíDZä>ö(öýÿíð*å-öýÿíHý ä(ö)ö)ö;öùÿõýÿídhä:ö;öùÿõ}öùÿõDõýÿí]ä;öùÿõ}ö :T6œ6îâ„7òl6Äð„6áCò ’ îàs°Ú Ø6ÿèä7äpt䀀ãtKâhå 7œ1 ä^ê<7Lwädqî ¨óX7ptì4ÿê{öùÿõDõýÿí°Ú ä(öýÿíLwä.öýÿíäýä(öýÿíLwä.öýÿíHý ä(ö)ö)ö,öýÿí¨óä,öýÿíLwä.öýÿíèê ä(ö)ö)ö;öùÿõ}ö ä;@:ˆ:î â ;òX:Äðp:áCò ’ î àsHƒáÄ:ÿèäð:ä°[䀀ãtJâgéœ1 ä^ê{öùÿõùÿõDõýÿíDñä;öùÿõùÿõ}ö <@<`<î#âô<ò0<ÄðH<áCò ’ îàs8X œ<âÿèäØ<äÈ< ãtIâfå â\êœ1 ä^ê{öùÿõùÿõ;õ(öýÿí”åjõÿÿô)öùÿõ{öùÿõõ!õýÿíÄäýÿí`#ä=öýÿíÄä(ö)ö;öùÿõDõ&öýÿí`#ä;öùÿõ}öùÿõDõýÿí”å;öùÿõùÿõ}ö Bp@¸@î âöýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿíhO$â)ö;öùÿõùÿõýÿíDZäýÿí\yä=öýÿí˜ ä(öýÿí@)å,öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõýÿîCävõýÿíTmä(öýÿí|,å,öýÿí I ä(ö)ö+öýÿí¨óä,öýÿí\yä)ö;öùÿõDõýÿí\yä;öùÿõ}ö.basic_string::copy pos out of rangeTÀOPî âQòØOÄððOáCò ’ îàs° DPÿèäpPädqä€ãtxâ’åŒPœ1 ä^ì¨P¨óäptìÄPˆÏäptìàPl ä [ìüPR ä [ðˆ$ääDì{öùÿõDõýÿí° ä(öýÿí¨óä,öýÿíˆÏä,öXõ<öýÿíÌýä>ö(öýÿíl ä)ö,öXõ<öýÿíÌýä>ö(öýÿíR ä)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö ¨xLT”TîqáÄUòdTÄð|TáCò ’ îàs° ÐTâÿèäüTädqä€ãtwâ‘åUœ1 ä^ì4U¨óäptìPUˆÏäptìŒUl älUì â |UÌý 俍UR älUðˆ$ääDì{öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿí\x'â)ö;öùÿõùÿõýÿíDZäýÿí|Ùä=öýÿí˜ ä(öýÿíˆÏä,öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõýÿíDZäýÿí\yä=öýÿíDZä(öýÿíR ä-öýÿíl ä)ö;öùÿõ;õ(öýÿí\yä>öýÿí¼ß ä(ö)öhõýÿíèê ä(ö)ö-öýÿí|Ùä>öýÿí¼ß ä(ö)ö-öýÿí\yä)öùÿõùÿõPõýÿíà0 ä(öüÿí„x#â)ö;öùÿõùÿõýÿíDZäýÿí|½å=öýÿíèê ä(ö)ö-öýÿí|Ùä+öýÿí\yä;öùÿõùÿõùÿõ;õ(öýÿí|½å>öýÿíÔÎä(ö)öhõýÿíl ämõýÿí I ä(ö)öiõýÿíl ä<öýÿí I ä(ö)ö+öýÿíèê ä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí4à äýÿíL´ä=öýÿíDñä.öýÿí¤vä(öýÿíè”ä(öýÿí|½å)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä,öýÿí”å,öýÿí¨óä)ö;öùÿõ;õ(öýÿí\yä>öÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä+öýÿí¨óä,öýÿíl ä,öýÿí\yä)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä+öýÿí¨óä+öýÿí\yä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿíL´ä+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõýÿí”å=öýÿíL´ä;öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí|½å)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõùÿõ;õ(öýÿí”åkõÿÿô)öùÿõ{öùÿõýÿîCävõýÿí¬ùä(öýÿí”å+öýÿí¨óä+öýÿí\yä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõ;õ(öýÿí\yä>öÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿí”å+öýÿí¨óä,öýÿíl ä,öýÿí\yä)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá }Üx$yîâ`zòôxÄð yáCò ’ î àsŒ“á`yÿèäŒyädqä€ãtEâbå¨yœ1 ä^ìüy4“äÄyì â $PÔyèyåtìâ [èzØ”äÄyì4z@)åptðT#åPzì ì{öùÿõùÿõDõýÿ팓å(öýÿíDZä(öýÿí4“ä-öýÿíHý ä(ö)ö)ö,öýÿíDZä(öýÿíØ”ä-öýÿí4“ä)ö,öýÿí@)å,öýÿíT#å)ö;öùÿõ}ö L}”}îâŒ~òd}Äð|}áCò ’ î àsŒ“áÐ}ÿèäü}ädqä€ãtDâaå~œ1 ä^ì4~4“äÄyìP~Ø”äÄyð|,ål~ê â|~æ ì{öùÿõùÿõDõýÿ팓å(öýÿíDZä(öýÿí4“ä-öýÿíHý ä(ö)ö)ö,öýÿíDZä(öýÿíØ”ä-öýÿí4“ä)ö,öýÿí|,å)ö;öùÿõ}ö \…Hî⤂ò`ÄðxáCò ’ î àsŒ“áÌÿèäøädqä€ãtCâ`傜1 ä^ì0‚4“äÄyìL‚Ø”äÄy숂|,åh‚ê âx‚æ ð@)åptì{öùÿõùÿõDõýÿ팓å(öýÿíDZä(öýÿí4“ä-öýÿíHý ä(ö)ö)ö,öýÿíDZä(öýÿíØ”ä-öýÿí4“ä)ö,öýÿí|,å,öýÿí@)å)ö;öùÿõ}ö 8‰…Ø…îâ°†ò¨…ÄðÀ…áCò ’ î àsŒ“á†ÿèä@†ädqä€ãtBâ_å\†œ1 ä^ìx†4“äÄy씆ؔäÄyðLwädqê{öùÿõùÿõDõýÿ팓å(öýÿíDZä(öýÿí4“ä-öýÿíHý ä(ö)ö)ö,öýÿíDZä(öýÿíØ”ä-öýÿí4“ä)ö,öýÿíLwä)ö;öùÿõ}ö «l‰´‰îVḊò„‰Äðœ‰áCò ’ î àsŒ“áð‰âÿèäŠädqä€ãtAâ^å8Šœ1 ä^ìTЍóäptìpŠ(äpt쌊„äptðT#娊ì ì{öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿíȪ'â)ö;öùÿõùÿõýÿíDZäýÿí|Ùä=öýÿí˜ ä(öýÿí(ä,öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõ;õ(öýÿí„ä>öýÿí¼ß ä(ö)öhõýÿíèê ä(ö)ö-öýÿí|Ùä>öýÿí¼ß ä(ö)ö-öýÿí„ä)öùÿõùÿõPõýÿíà0 ä(öüÿíðª#â)ö;öùÿõùÿõùÿõýÿíDZäýÿí|½å=öýÿíèê ä(ö)ö-öýÿí|Ùä+öýÿí„ä;öùÿõùÿõ;õ(öýÿí|½å>öýÿíÔÎä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí4à äýÿíL´ä=öýÿíDñä.öýÿí¤vä(öýÿíè”ä(öýÿí|½å)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä,öýÿí”å,öýÿí¨óä)ö;öùÿõ;õ(öýÿí„ä>öÿÿô)öùÿõýÿîCävõýÿíL¢ä(öýÿíL´ä+öýÿí¨óä,öýÿí„ä,öýÿíT#å)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä+öýÿí¨óä+öýÿí„ä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿíL´ä+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõýÿí”å=öýÿíL´ä;öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí|½å)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõùÿõ;õ(öýÿí”åkõÿÿô)öùÿõ{öùÿõýÿîCävõýÿí¬ùä(öýÿí”å+öýÿí¨óä+öýÿí„ä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõ;õ(öýÿí„ä>öÿÿô)öùÿõýÿîCävõýÿíL¢ä(öýÿí”å+öýÿí¨óä,öýÿí„ä,öýÿíT#å)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá €®H««î∬ò`«Äðx«áCò ’ î àsŒ“áÌ«ÿèäø«ädqä€ãt@â]嬜1 ä^ì0¬¨óäptìL¬(äptð|,åh¬ê âx¬æ ì{öùÿõDõýÿ팓å(öýÿí¨óä,öýÿí(ä,öýÿí|,å,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö ²´®ü®îâ°òÌ®Äðä®áCò ’ î àsŒ“á8¯ÿèäd¯ädqä€ãt?â\倯œ1 ä^윯¨óäpt츯(äptìô¯|,åÔ¯ê â䝿 ð„äptì{öùÿõDõýÿí° ä(öýÿí¨óä,öýÿí(ä,öýÿí|,å,öýÿí|,å+öýÿí„ä,öýÿí@Rä(ö)ö)ö;öùÿõ}ö „ÁT²œ²î’⬳òl²Äð„²áCò ’ î àsŒ“áزâÿèä³ädqä€ãt>â[å ³œ1 ä^ì<³PGäptìX³(äptìt³Lwädqê³àFäptð„äptì{öùÿõ;õ(öýÿíàFä>öýÿíLwä.öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿí\Á'â)ö;öùÿõùÿõýÿíDZäýÿí\yä=öýÿí˜ ä(öýÿí„ä,öýÿíLwä.öýÿíèê ä(ö)ö-öýÿíàFä)ö;öùÿõ;õ(öOõjõ&öýÿíLwä)öùÿõ{öùÿõ!õýÿí$m äýÿíL´ä(öýÿíLwä,öÿÿô,öýÿí]ä,öýÿíLwä.öýÿíHƒå(ö)ö)ö;öùÿõDõýÿí° ä(öýÿíPGä,öýÿí(ä,öýÿíL´ä.öýÿíHý ä(ö)ö+öýÿí`œä(öýÿíàFä)ö,öùÿõýÿíL´ä.öýÿíHý ä(ö)ö+öýÿí`œä(öýÿíàFä+öýÿí\yä)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}öùÿõDõýÿí° ä(öýÿíPGä,öýÿí(ä,öýÿíLwä.öýÿíHý ä(ö)ö+öýÿí`œä(öýÿíàFä)ö,öýÿíLwä.öýÿíHý ä(ö)öùÿõ+öýÿí`œä(öýÿíàFä+öýÿí\yä)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö%basic_string::replace pos out of rangeáˆÄ¸ÁáÂîâØÂòÐÁÄðèÁáCò ’ î àsŒ“á<ÂÿèähÂädqä€ãt=âZ儜1 ä^ì ÂPGäptì¼Â(äptðLwädqê{öùÿõDõýÿ팓å(öýÿíPGä,öýÿí(ä,öýÿíLwä,öÿÿô,öýÿí]ä)ö;öùÿõ}ö (ʼÄÅî/âÀÅòÔÄÄðìÄáCò ’ îàs<Ç@ÅÿèälÅäÄyä€ãt<âYåˆÅœ1 ä^ì¤Ål äÄyðR äÄyì{öùÿõùÿõýÿíDZäýÿí¨óä=öýÿíDZä(öýÿíl ä-öýÿíHý ä(ö)ö)ö;öùÿõýÿ팓å(öýÿí¨óä,öýÿíDZä(öýÿíR ä-öýÿíl ä)ö,öÿÿô,öýÿíÄä(ö)ö)ö;öùÿõDõýÿíHý ä(ö)ö+öýÿí`œä(öýÿí¨óä)ö;öùÿõ}ö Í\ʤÊîâ(ËòtÊÄðŒÊáCò ’ îàsö(öýÿíl ä)ö,öXõ<öýÿíÌýä>ö(öýÿíR ä)ö,öùÿõýÿí@Rä(ö)ö)ö;öùÿõ}ö Hú(ðpðî`âHñò@ðÄðXðáCò ’ îàs„&¬ðâÿèäØðädqä€ãtuâåôðœ1 ä^ìñl älUì,ñR älUðˆ$ääDì{öùÿõùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)ö(öýÿíR ä-öýÿíl ä)ö;öùÿõ;õ(öýÿí I ä(ö)ölõýÿíl äiõýÿíl ä<öýÿí I ä(ö)ö+öýÿíèê ä(ö)ö)öùÿõ{öùÿõùÿõýÿîCävõýÿí¬ùä(öýÿí I ä(ö)ö,öýÿíl ä,öýÿí\yä)ö;öùÿõýÿíd8ä(öýÿí\yä,öZõ)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíd8ä(öýÿí\yä,ö[õ)ö;öùÿõýÿîCävõýÿíTmä(öýÿí I ä(ö)ö,öýÿíl ä,öýÿí\yä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö xþ|úÄúîâûò”úÄð¬úáCò ’ î àsL¢áûâÿèä,ûädqä€ãt2âOåHûœ1 ä^ìdû@)åptðT#å€ûì ì{öùÿõùÿõýÿíd8ä(öýÿí@)å,ö[õ)ö;öùÿõýÿîCävõýÿíL¢ä(öýÿí I ä(ö)ö,öýÿí@)å,öýÿíT#å)ö;öùÿõDõ*öOõ;öùÿõ}ö L ¬þôþîâ´ÿòÄþÄðÜþáCò ’ îàsL¢0ÿÿèä\ÿädqä€ãt1âNåxÿœ1 ä^ð|,å”ÿê â¤ÿæ ì{öùÿõDõýÿíL¢ä(öýÿí|,å,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö Œ € È î⤠ò˜ Äð° áCò ’ îàsL¢ âÿèä0 ädqä€ãt0âMåL œ1 ä^ìˆ |,åh ê âx æ ð@)åptì{öùÿõùÿõýÿíd8ä(öýÿí@)å,ö[õ)ö;öùÿõýÿîCävõýÿíTmä(öýÿí I ä(ö)ö,öýÿí|,å,öýÿí@)å)ö;öùÿõDõ*öOõ;öùÿõ}ö ( À  îlâà òØ Äðð áCò ’ îàsL¢D âÿèäp ädqä€ãt/âLåŒ œ1 ä^ì¨ LwädqêÄ ¨óäptð@)åptì{öùÿõ;õ(öýÿí¨óä>öýÿíLwä.öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿî &â)ö;öùÿõùÿõùÿõýÿíDZäýÿí\yä=öýÿí˜ ä(öýÿí@)å,öýÿíLwä.öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõùÿõ;õ(öOõjõ&öýÿíLwä)öùÿõ{öùÿõýÿí<Çä(öÿÿô,öýÿí¨óä)ö;öùÿõýÿíd8ä(öýÿí\yä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíd8ä(öýÿí\yä,ö[õ)ö;öùÿõýÿîCävõýÿíTmä(öýÿí I ä(ö)ö,öýÿíLwä.öýÿí I ä(ö)ö+öýÿí¨óä,öýÿí\yä)ö;öùÿõ}öùÿõùÿõDõ*öOõ;öùÿõ}ö$basic_string::assign pos out of rangeâ ” \ ¤ îâD òt ÄðŒ áCò ’ îàsL¢à ÿèä  ädqä€ãt.âKå( œ1 ä^ðLwädqê{öùÿõDõýÿíL¢ä(öýÿíLwä,öÿÿô,öýÿí]ä)ö;öùÿõ}ö È È  î âÀ òà Äðø áCò ’ îàsÌoL ÿèäx ì€ãt,âIå” œ1 ä^ðT#å° ì ì{öùÿõýÿí° ä(öÿÿìæ,öýÿíT#å)ö;öùÿõ}ö Ô ü D îâ ò Äð, áCò ’ îàsü©€ ÿèä¬ ädqä€ãttâŽåÈ œ1 ä^ìä l ä [í R ä [ðˆ$ääDì{öùÿõDõýÿíü©ä(öXõ<öýÿíÌýä>ö(öýÿíl ä)ö,öXõ<öýÿíÌýä>ö(öýÿíR ä)ö,öùÿõýÿí@Rä(ö)ö)ö;öùÿõ}ö $  P î_â( ò  Äð8 áCò ’ îàsü©Œ âÿèä¸ ädqä€ãtsâåÔ œ1 ä^ìð l älUì  R älUðˆ$ääDì{öùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)ö(öýÿíR ä-öýÿíl ä)ö;öùÿõýÿíDZäýÿí´ä=öýÿíèê ä(ö)ö;öùÿõ;õ(öýÿí I ä(ö)ölõýÿíl äiõýÿíl ä<öýÿí I ä(ö)ö+öýÿí´äiõýÿí´ä+öýÿí\yä>öýÿíÔÎä(ö)ö)öùÿõýÿí° ä(öýÿí$m ä(öýÿíl ä,öýÿíR ä)ö)ö;öùÿõ<õùÿõ{öùÿõýÿíd8ä(öýÿí´ä+öýÿí\yä)ö;öùÿõýÿîCävõýÿíTmä(öýÿí I ä(ö)ö+öýÿí´ä,öýÿíl ä,öýÿí\yä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö ô, D$ Œ$ îOâX% ò\$ Äðt$ áCò ’ îàs° È$ âÿèäô$ ädqä€ãt+âHå% œ1 ä^ì,% @)åptðT#åH% ì ì{öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)öhõýÿíèê ä(ö)ö>öýÿí¼ß ä(ö)ö-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿíÀ, 2â)ö;öùÿõùÿõýÿíDZäýÿí´ä=öýÿíèê ä(ö)ö;öùÿõýÿíd8ä(öýÿí´ä+öýÿí@)å)ö;öùÿõýÿîCävõýÿíL¢ä(öýÿí I ä(ö)ö+öýÿí´ä,öýÿí@)å,öýÿíT#å)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö0basic_string::append results in string > max_sizeâ È/ (- p- îâ0. ò@- ÄðX- áCò ’ îàs° ¬- ÿèäØ- ädqä€ãt*âGåô- œ1 ä^ð|,å. ê â . æ ì{öùÿõDõýÿí° ä(öýÿí|,å,öýÿîCävõýÿíl‹ä(öýÿí|,å)ö)ö;öùÿõ}ö Ø9 ü/ D0 î]â 1 ò0 Äð,0 áCò ’ îàs° €0 âÿèä¬0 ädqä€ãt)âFåÈ0 œ1 ä^ì1 |,åä0 ê âô0 æ ð@)åptì{öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿíDZäýÿí´ä=öýÿíèê ä(ö)ö;öùÿõ;õ(öýÿí I ä(ö)ölõýÿí|,åiõýÿí|,å<öýÿí I ä(ö)ö+öýÿí´äiõýÿí´ä+öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõýÿí° ä(öýÿí$m ä(öýÿí|,å,öýÿí@)å)ö)ö;öùÿõ<õùÿõ{öùÿõýÿíd8ä(öýÿí´ä+öýÿí@)å)ö;öùÿõýÿîCävõýÿíTmä(öýÿí I ä(ö)ö+öýÿí´ä,öýÿí|,å,öýÿí@)å)ö;öùÿõ}öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö $D : T: î^â,; ò$: Äð<: áCò ’ îàs° : âÿèä¼: ädqä€ãt(âEåØ: œ1 ä^ìô: Lwädqê; ¨óäptð@)åptì{öùÿõ;õ(öýÿí¨óä>öýÿíLwä.öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿíüC &â)ö;öùÿõùÿõýÿíDZäýÿí\yä=öýÿí˜ ä(öýÿí@)å,öýÿíLwä.öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõ;õ(öýÿí\yä>öÿÿô)öùÿõ{öùÿõýÿíDZäýÿí´ä=öýÿíèê ä(ö)ö;öùÿõýÿíd8ä(öýÿí´ä+öýÿí\yä)ö;öùÿõýÿîCävõýÿíTmä(öýÿí I ä(ö)ö+öýÿí´ä,öýÿíLwä.öýÿí I ä(ö)ö+öýÿí¨óä,öýÿí\yä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö$basic_string::append pos out of rangeâ F XD  D îâ@E òpD ÄðˆD áCò ’ îàs° ÜD ÿèäE ädqä€ãt'âDå$E œ1 ä^ðLwädqê{öùÿõDõýÿí° ä(öýÿíLwä,öÿÿô,öýÿí]ä)ö;öùÿõ}ö ÜH ÄF G î â¼G òÜF ÄðôF áCò ’ îàsô"HG ÿèätG ädqä€ãt&âCåG œ1 ä^ðT#å¬G ì ì{öùÿõDõýÿí° ä(öÿÿìæ,öýÿíT#å)ö;öùÿõ}ö K I XI î âJ ò(I Äð@I áCò ’ îàsô"”I ÿèäÀI ädqä€ãt%âBåÜI œ1 ä^ð|,åøI ê âJ æ ì{öùÿõDõýÿí° ä(öýÿí|,å)ö;öùÿõ}ö M åìV œ1 ä^ð¨óäptì{öùÿõùÿõùÿõDõ*ö(öýÿí I ä(ö)ö+öýÿí¨óä)ö;öùÿõùÿõ}ö $[ ÔX Y îâ¼Y òìX ÄðY áCò ’ îàsäXY ÿèä„Y äpR 䀀ãt â=å Y œ1 ä^î¨óäptì{öùÿõùÿõDõ*ö(öýÿí I ä(ö)ö+öýÿí¨óä)ö;öùÿõ}ö ,] X[  [ î â$\ òp[ Äðˆ[ áCò ’ îàsÔO Ü[ ÿèä\ 쀀ãtâ<éœ1 ä^ê{öùÿõDõýÿíèê ä(ö)öjõÿÿô;öùÿõ}ö L_ `] ¨] î â,^ òx] Äð] áCò ’ îàs€" ä] ÿèä^ ì€ãtâ;éœ1 ä^ì{öùÿõùÿõýÿíd8ä(öÿÿô,ö[õ)ö;öùÿõ}ö ˜m €_ È_ î‰â”` ò˜_ Äð°_ áCò ’ îàsHG` âÿèä0` ì€ãtâ:åL` œ1 ä^ð ˜Èh` ptì4ÿê{öùÿõ;õ(öýÿí˜Èä>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿílm ,â)ö;öùÿõùÿõùÿõ;õ(öýÿí˜Èä<öýÿí Éä)öùÿõýÿí˜Èä=öýÿí Éä;öùÿõýÿí˜Èä=öýÿíè”ä(öýÿí˜Èä)ö;öùÿõ;õ(öýÿí˜ÈäkõýÿíDñä.öýÿíä)öùÿõ{öùÿõýÿí4à äýÿíL´ä=öýÿíDñä.öýÿí¤vä(öýÿí˜Èä+öÿÿìæ)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõ{öùÿõvõýÿ픀ävõýÿíTmä(öýÿí”å,öýÿí”å+öýÿí Éä+öÿÿìæ,öýÿíL´ä)ö;öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõ}öùÿõ<õùÿõýÿîCävõýÿíL¢ä(ö*öýÿíL´ä,öýÿíÄä(ö)ö)ö;öùÿõýÿí”å=öýÿíL´ä;öùÿõýÿíDñä.öýÿíä=öýÿí˜Èä;öùÿõ}öùÿõ}ö6basic_string::reserve argument out of range o Ìm n î â˜n òäm Äðüm áCò ’ îàsÔÎPn ÿèä|n äpt䀀ãtâ9éœ1 ä^ê{öùÿõùÿõDõýÿíDñä.öýÿíä;öùÿõùÿõ}ö °€ Ôo p î¥âq òìo Äðp áCò ’ îàsd8Xp âÿèä„p ì€ãtyâ“å p œ1 ä^ì¼p @)åptðTmØp ð4êþ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí|€ 3â)ö;öùÿõùÿõ;õ(öýÿí@)å>öýÿíDñä.öýÿíä)öùÿõ{öùÿõýÿíDZäýÿíø]ä=öýÿíl„ ä(öýÿíDñä.öýÿíä,öýÿíè”ä(öÿÿìæ)ö)ö;öùÿõ>õ(öýÿíø]ä<öýÿí@)å)öùÿõýÿíø]ä=öýÿíè”ä(öýÿíø]ä*öÿÿìæ)ö;öùÿõýÿí4à äýÿíL´ä=öýÿíDñä.öýÿí¤vä(öýÿíø]ä+öÿÿìæ)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõ{öùÿõ;õ(öýÿíTmä)öùÿõvõýÿ픀ävõýÿíTmä(öýÿí”å,öýÿí”å+öýÿí Éä,öýÿíL´ä)ö;öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõ}öùÿõýÿí”å=öýÿíL´ä;öùÿõýÿíDñä.öýÿíä=öýÿíø]ä;öùÿõùÿõ}öùÿõ;õ(öýÿí”å)öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí@)å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿí Éä=öýÿí@)å;öùÿõ}ö1basic_string::length error. Resizing out of rangeá ƒ ä€ , î âÌ òü€ Äð áCò ’ îàsÝ h ÿèä” ì€ãtâ8å° œ1 ä^ð@)åptì{öùÿõýÿíÝ ä(öýÿí@)å,öýÿíÄä(ö)ö)ö;öùÿõ}ö Tˆ 8ƒ €ƒ î+âL„ òPƒ Äðhƒ áCò ’ îàsÝ ¼ƒ âÿèäèƒ ì€ãtâ7å„ œ1 ä^ì „ @)åptðT#å<„ ì ì{öùÿõùÿõýÿíDZäýÿíÊ ä=öýÿíèê ä(ö)ö;öùÿõýÿíd8ä(öýÿí@)å)ö;öùÿõ;õ(öýÿíÊ ä<öýÿí@)å)öùÿõýÿîCävõýÿíL¢ä(öýÿí I ä(ö)ö+öýÿíÊ ä,öýÿí@)å-öýÿíÊ ä,öýÿíT#å)ö;öùÿõ}ö ìŠ ˆˆ Ј îâT‰ ò ˆ Ä𸈠áCò ’ îàs¼ß ‰ ÿèä8‰ äpt䀀ãtâ6éœ1 ä^ê{öùÿõùÿõDõýÿíHƒå(ö)ö.öýÿí¼ß ä(ö)ö-öÿÿìæ;öùÿõùÿõ}ö ÄŒ ‹ h‹ î âì‹ ò8‹ ÄðP‹ áCò ’ îàsl‹¤‹ ÿèäЋ äpt䀀ãtâ5éœ1 ä^ê{öùÿõùÿõDõýÿí Éä;öùÿõùÿõ}ö œŽ øŒ @ î âÄ ò Äð( áCò ’ îàsèê | ÿèä¨ äpt䀀ãtâ4éœ1 ä^ê{öùÿõùÿõDõýÿí Éä;öùÿõùÿõ}ö ‘ ÐŽ  î âø òèŽ Äñ áCò ’ îàs<ÞT ÿèäÜ ä€ ä€€ãtâ3å âÜÀ è¤ è â $P´ È åtìâlUìœ1 ä^ê{öùÿõDõýÿíää(öýÿíHý ä(ö)ö)ö;öùÿõ}ö \“ L‘ ”‘ î â<’ òd‘ Äð|‘ áCò ’ îàs<ÞБ ÿèä ’ äü‘ ä€ãtâ2å âÜÀ ’ èÄyìœ1 ä^ì{öùÿõDõýÿíL¸ ä(öýÿíHý ä(ö)ö)ö;öùÿõ}ö |• “ Ø“ î â\” ò¨“ ÄðÀ“ áCò ’ îàs|) ” ÿèä@” ä€ ä€€ãtâ1éœ1 ä^ê{öùÿõDõýÿíää(öýÿí<: ä(ö)ö)ö;öùÿõ}ö œ— °• ø• î â|– òÈ• Äðà• áCò ’ îàs|) 4– ÿèä`– äü‘ ä€ãtâ0éœ1 ä^ì{öùÿõDõýÿíL¸ ä(öýÿí<: ä(ö)ö)ö;öùÿõ}ö š З ˜ î✘ òè— Äñ˜ áCò ’ îàs<: T˜ ÿè䀘 ä¤ ä€€ãtâ/éœ1 ä^ê{öùÿõDõýÿíä.ä(öýÿí I ä(ö)ö+öýÿíèê ä(ö)ö)ö;öùÿõ}ö ´œ Pš ˜š îâ› òhš Äð€š áCò ’ îàs<: Ôš ÿèå› äÄyä€ãtâ.éœ1 ä^ì{öùÿõùÿõDõýÿíä.ä(öýÿí I ä(ö)ö+öýÿíèê ä(ö)ö)ö;öùÿõ}ö Ôž èœ 0 î â´ ó Äð áCò ’ îàsHý l ÿèä˜ ä¤ ä€€ãtâ-éœ1 ä^ê{öùÿõDõýÿíä.ä(öýÿí I ä(ö)ö)ö;öùÿõ}ö ¡ Ÿ PŸ î âÔŸ ò Ÿ Äð8Ÿ áCò ’ îàsHý ŒŸ ÿè丟 äÄyä€ãtâ,éœ1 ä^ì{öùÿõùÿõDõýÿíä.ä(öýÿí I ä(ö)ö)ö;öùÿõ}ö X£ @¡ ˆ¡ î â8¢ òX¡ Äðp¡ áCò ’ îàs2Ä¡ ÿèäð¡ ädqä€ãtâ+å ¢ œ1 ä^ðT#å(¢ ì ì{öùÿõDõýÿíL¢ä(öÿÿìæ,öýÿíT#å)ö;öùÿõ}ö „¥ Œ£ Ô£ î ┤ ò¤£ Äð¼£ áCò ’ îàs2¤ ÿèä<¤ ädqä€ãt â*åX¤ œ1 ä^ð|,åt¤ ê ℤ æ ì{öùÿõDõýÿíL¢ä(öýÿí|,å)ö;öùÿõ}ö§ ¸¥ ᦠî â ¦ òÐ¥ Äðè¥ áCò ’ îàs2<¦ ÿèäh¦ ädqä€ãt â)儦 œ1 ä^ðLwädqê{öùÿõDõýÿíL¢ä(öýÿíLwä)ö;öùÿõ}ö èª Ä§ ¨ î⨠òܧ Äðô§ áCò ’ îàsì.H¨ âÿèät¨ ì €ãt â(éœ1 ä^ì{öùÿõùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõ}ö ˜¶ « d« îkâl¬ ò4« ÄðL« áCò ’ îàs, « âÿèäÌ« ì€ãtrâŒåè« œ1 ä^ì¬ @)åptì0¬ T#å ¬ ì ðˆ$äL¬ ê â\¬ ä äæ{öùÿõýÿí”å=öÿÿô;öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿít¶ !â)ö;öùÿõùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõýÿîCävõýÿíL¢ä(öýÿí”å,öýÿí@)å,öýÿíT#å)ö;öùÿõýÿí Éä=öýÿí@)å;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí@)å)ö,öýÿíÄä(ö)ö)ö;öùÿõ}öùÿõ}östring constructor: n > max_sizeã ˆÁ ̶ · îdâ(¸ òä¶ Äðü¶ áCò ’ îàs,P· âÿèä|· ì€ãtqâ‹å˜· œ1 ä^ì´· Hý älUìз <: älUì ¸ ˆ$äì· ê âü· ä äêˆ$ääDì{öùÿõýÿí”å=öÿÿô;öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõ;õ(öýÿíHý äkõýÿí<: ä)öùÿõ{öùÿõýÿíDZäýÿíˆÏä=öýÿíDZä(öýÿí<: ä-öýÿíHý ä)ö;öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿíˆÏä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõýÿîCävõýÿíTmä(öýÿí”å,öýÿíHý ä,öýÿíˆÏä)ö;öùÿõýÿí Éä=öýÿíˆÏä;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿíˆÏä)ö,öýÿíÄä(ö)ö)ö;öùÿõ}öùÿõ}ö èÅ ¼Á  îâà òÔÁ ÄðìÁ áCò ’ îàs,@ ÿèäl ì€ãtpâŠåˆÂ œ1 ä^ì¤Â Hý ä [ìÀ <: ä [ìü 0"åÜ ê âì ä äêˆ$ääDì{öùÿõýÿí,ä(öXõ<öýÿíÌýä>ö(öýÿíHý ä)ö,öXõ<öýÿíÌýä>ö(öýÿí<: ä)ö,öýÿí0"å,öùÿõýÿí@Rä(ö)ö)ö;öùÿõ}ö É Æ dÆ îâ˜Ç ò4Æ ÄðLÆ áCò ’ îàs`/ Æ ÿèäÌÆ ì€ãt â'åèÆ œ1 ä^ìÇ @)åptì0Ç T#å Ç ì ð0"áLÇ xÇ êIî€R ôâ âˆÇ ä äæ:öýÿíDñä(öýÿí0"å)öùÿõùÿõùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíT#å,öýÿí0"å)ö;öùÿõ}ö øÐ ÄÉ Ê î<â4Ë òÜÉ ÄðôÉ áCò ’ îàs`/HÊ âÿèätÊ ì€ãt â&åÊ œ1 ä^ìÌÊ |,å¬Ê ê â¼Ê æ ð0"áèÊ Ë êIî€R ôâ â$Ë ä äæ:öýÿíDñä(öýÿí0"å)öùÿõùÿõùÿõ{öùÿõýÿíDZäýÿí@)å=öýÿîCävõýÿíl‹ä(öýÿí|,å)ö;öùÿõ;õ(öýÿí@)å>öýÿí0"å.öýÿí¼ß ä(ö)ö-öÿÿìæ)öùÿõùÿõPõýÿíà0 ä(öüÿíÔÐ !â)ö;öùÿõùÿõýÿí,ä(öýÿí|,å,öýÿí|,å+öýÿí@)å,öýÿí0"å,öýÿí@Rä(ö)ö)ö;öùÿõ}östring constructor: n > max_sizeã t× ,Ñ tÑ î1â¸Ò òDÑ Äð\Ñ áCò ’ îàs`/°Ñ âÿèäÜÑ ì€ãtâ%åøÑ œ1 ä^ì4Ò |,åÒ ê â$Ò æ ìPÒ @)åptð0"álÒ ˜Ò êIî€R ôâ â¨Ò ä äæ:öýÿíDñä(öýÿí0"å)öùÿõùÿõùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí0"å.öýÿí¼ß ä(ö)ö-öÿÿìæ)öùÿõùÿõPõýÿíà0 ä(öüÿíP× !â)ö;öùÿõùÿõýÿí,ä(öýÿí|,å,öýÿí|,å+öýÿí@)å,öýÿí0"å,öýÿí@Rä(ö)ö)ö;öùÿõ}östring constructor: n > max_sizeã Tá ¨× ð× îSâdÙ òÀ× ÄðØ× áCò ’ îàs`/,Ø âÿèäXØ ì€ãtâ$åtØ œ1 ä^ìØ Lwädqê¬Ø ¨óäptìüØ @)áÈØ ptìIêôØ átátðæà€ä0"áÙ DÙ êIî€R ôâ âTÙ ä äæ:öýÿíDñä(öýÿí0"å)öùÿõùÿõùÿõ{öùÿõýÿíDZäýÿí´rä=öýÿíLwä.öýÿíèê ä(ö)ö;öùÿõ;õ(öýÿí¨óä>öýÿí´rä)öùÿõùÿõPõýÿíÀÍ ä(öüÿí,á 'â)ö;öùÿõùÿõýÿíDZäýÿí\yä=öýÿí´rä-öýÿí¨óä;öùÿõ;õ(öýÿí\yä>öýÿí@)å)öùÿõýÿí\yä=öýÿí@)å;öùÿõùÿõýÿí,ä(öýÿíLwä.öýÿí”å+öýÿí¨óä,öýÿíLwä.öýÿí”å+öýÿí¨óä+öýÿí\yä,öýÿí0"å,öýÿí@Rä(ö)ö)ö;öùÿõùÿõ}ö%string copy constructor: pos > str lená 0æ ˆá Ðá î(âpâ ò á Äð¸á áCò ’ îàs`/ â âÿèä8â ì€ãtâ#åTâ œ1 ä^ðLwädqê:öýÿíDñä(öýÿíLwä.öýÿíDñä)öùÿõùÿõ{öùÿõùÿõýÿí,ä(öýÿíLwä.öýÿí”å,öýÿíLwä.öýÿí”å+öýÿíLwä.öýÿíèê ä(ö)ö,öýÿíHƒå(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõùÿõ}ö hê dæ ¬æ îâ˜ç ò|æ Äð”æ áCò ’ îàs`/èæ Pÿèäç ì€ãtâ"å0ç œ1 ä^ð0"áLç xç êIî€R ôâ âˆç ä äæ:öýÿí Éä(öÿÿô)ö,öùÿõùÿõýÿíDñä(öýÿí0"å)ö,öùÿõùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõ}öXì äœê î â ë òàsè”Øê ÿèäë äptä€ãtoâ‰áæÔÎäptì{öùÿõDõýÿíÔÎä+öÿÿìæ-öýÿíÔÎä%öÿÿìæ;öùÿõ}öˆí äŒì îâí òàs I Èì ÿèäôì älU䀀ãtnâˆéœ1 ä^ê{öDõýÿí”å;ö}ö¸î ä¼í îâ@î òàs I øí ÿèä$î ä [ä€ãtmâ‡éœ1 ä^ì{öDõýÿí”å;ö}ö\ð äìî îâœï òàsä.(ï ÿèäTï ä¤ ä€€ãtâ!åpï œ1 ä^îð*åŒï ê âlU ä{öDõýÿíDÅ ä(öýÿíð*å)ö;ö}÷ò äð îâ@ñ òàsä.Ìð ÿèäøð äÄyä€ãtâ åñ œ1 ä^ðð*å0ñ ê â [ ä{öDõýÿíLä(öýÿíð*å)ö;ö}ö ó ä4ò î âÈò òàsäýpò ÿèäœò älUä€ãtâáæP&å¸ò ê ⤠ä{öDõýÿíP&å.öýÿí¼e ä(ö)ö;ö}þÔó î âhô òàsäýô ÿèä<ô ä [ä€ãtâáæP&åXô ê âÄy ä{öDõýÿíP&å.öýÿí¼e ä(ö)ö;ö}öhõ øhsè¬õ øõ æœõ æ äçö øÔõ æàõ æ â ðõ (¢ äæ4ö ø(ö æ€R æhö ø\ö æptæ¼ö øö æœö æ â ¬ö `œ äæðö øäö æøM æ$÷ ø÷ æpR æX÷ øL÷ æ [æŒ÷ ø€÷ ælUæÀ÷ ø´÷ æÄyæô÷ øè÷ æ¤ æø øÔó æDø ø4ò ælø øð æ”ø øìî æÈø ø¼ø æü‘ æüø øðø æ€ æ$ù øà€æ¬ù øà€Lù âIêxù ptôæ€ù 4êÿÿÿÿÿÿÿÿ÷Ôù ø¬æ æüù øÐá æ$ú øð× æLú øtÑ ætú ø Ê æœú ødÆ æÄú ø ¨ æìú ù¦ æû øÔ£ æ<û øˆ¡ ædû øPŸ æŒû ø0 æ´û ø˜š æÜû ø˜ æü øø• æ,ü øØ“ æTü ø”‘ æ|ü ø æ¤ü ø@ æÌü øh‹ æôü øЈ æý ø€ƒ æDý ø, ælý øn æ”ý øÈ_ æ¼ý ø¨] æäý ø [ æ þ øY æ4þ øhV æ\þ øR æ„þ øM æ¬þ ø„K æÔþ øXI æüþ ø G æ$ÿ ø D æLÿ øT: ætÿ øD0 æœÿ øp- æÄÿ øŒ$ æìÿ ø æ!ø¤Êæ<!ø¤ æd!ø æŒ!øÈ æ´!øôþæÜ!øÄúæ!ø¬éæ,!øŒææT!ø˜ãæ|!øxàæ¤!ø”ÝæÌ!ø¤Øæô!øØÕæ!øÒæD!øœÍæl!øÅæ”!ùÂæ¼!øœ²æä!øü®æ !ø«æ4!ø´‰æ\!øØ…æ„!øæ¬!ø”}æÔ!ø$yæü!øIæ$!øBæL!ø¸@æt!ø`<æœ!øˆ:æÄ!øœ6æì!øÈ(æ!ø|%æ<!ø`æd!ølæŒ!ø æ´!øÄæÜ!ø¸ûæ!øÌ÷æ,!ø°ìæT!ødéæ|!øáæ¤!øœÝæÌ!øàÏæô!øŒÌæ!øÂæD!ø$¾æl!øˆ±æ”!ø<®æ¼!øP¦æä!ø\¢æ !ø(”æ4!øÔæ\!ø@†æ„!øÄæ¬!øÀ{æÔ!ø´wæü!øŒpæ$ !ø(mæL !ø¼iæt !ø˜]æœ !øXtæÄ !øtæì !øˆ[æ !ø¼í æ< !øŒì æd !øœê æŒ !ø æ´ !ø· æÜ !ød« æ !øP æ, !øD æT !øpðæ| !ødìæ¤ !ø”TæÌ !øPæüp æ !$m ä !átâ$ !¸Pä !hsâ4 !¬¢ä õ D !ÐAä Ôõ T !¤] ä (ö d !DZä \ö t !`œä ö „ !ŒÍä äö ” !`“ä ÷ ¤ !4à ä L÷ ´ !Ìýä €÷ Ä !Lä ´÷ Ô !DÅ äè÷ ì !äýä !Ôó ä4ò  !ä.ü !ð ä ìî  !L¸ ä ¼ø $ !ää ðø 4 !]ä:à€0 &`/D !¬æ L !Ðá T !ð× \ !tÑ d ! Ê l !dÆ ät !às`/° !ë˜!äîäÜ !ìãtìø !œ1 ä^ì$!Hý ä!ì æä@!<: ä!ð0"á\!ˆ!êIî¬ö ôâ â¬ö ä2täè!ã!`/ ã!üt !ö<¬ âì:öýÿíDñä(öýÿí0"å)öùÿõùÿõ{öùÿõýÿí,nä(öýÿíHý ä,öýÿí<: ä,öýÿí0"å,öýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}þP!âØ!¸âh!üÐ!ö8vð{öùÿõDõýÿí„Ñä(öýÿíä1ä)ö-öýÿí„Ñä(öýÿíì¿ä)ö;öùÿõ}öh&¸ !ï!ä?îä(!ìâˆ!ä1äD!ê âT! ä â<d!èx!è ðì¿ä¤!ê â´! ä â<Ä!èx!ð(!â,#!¤ ‹âX!ü`"!ò@!ü" ôÜN î{öùÿõýÿíü" äýÿíP&å=öýÿíR ä;öùÿõ;õ(öýÿíl äjõýÿíR ähõýÿíl äjõqõýÿíP&å)öùÿõDõ[õ;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿíü" äýÿíä@ä=öýÿíP&å;öùÿõqõýÿíP&å;öùÿõ;õ(öýÿíhä(ö*öýÿíä@ä,ö*öýÿíP&å)ö)öùÿõ{öùÿõýÿíü" äýÿí'å=öýÿíR ä;öùÿõqõýÿí'å;öùÿõ>õ(ö!öýÿíhä(ö*öýÿí'å,ö*öýÿíP&å)ö)öùÿõqõýÿí'å;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿí'å)ö;öùÿõvõýÿ픀ävõýÿídh ä(öýÿíä@ä,öýÿíR ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíP&åjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿídh ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}öh&¤ œ"!âîØ!ä´>îä¸"!ìâä"!l äÔ"!ì í#!R äÔ"!ðhä#!ì äî|#!âÜ0!¤ ‡â”#!ü<0!öü" ð{öùÿõýÿíü" äýÿíP&å=öýÿíR ä;öùÿõ;õ(öýÿíl äjõýÿíR ähõýÿíl äjõqõýÿíP&å)öùÿõDõ[õ;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿíü" äýÿíä@ä=öýÿíP&å;öùÿõqõýÿíP&å;öùÿõ;õ(ö*öýÿíä@ä<ö*öýÿíP&å)öùÿõ{öùÿõýÿíü" äýÿí'å=öýÿíR ä;öùÿõqõýÿí'å;öùÿõ>õ(ö!ö(ö*öýÿí'å<ö*öýÿíP&å)ö)öùÿõqõýÿí'å;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿí'å)ö;öùÿõvõýÿ픀ävõýÿídh ä(öýÿíä@ä,öýÿíR ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíP&åjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿídh ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}öh&¤ x0!âî,#!äÌ?îä”0!ìâÀ0!l ä°0!ì ðR ä°0!ô,1!â0?!D*á‹â\1!üd>!òD1!ü" ôÜN î{öùÿõýÿíü" äýÿíP&å=öýÿíR ä;öùÿõ;õ(öýÿíl äjõýÿíR ähõýÿíl äjõqõýÿíP&å)öùÿõDõ[õ;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿíü" äýÿíä@ä=öýÿíP&å;öùÿõqõýÿíP&å;öùÿõ;õ(öýÿíhä(ö*öýÿíP&å,ö*öýÿíä@ä)ö)öùÿõ{öùÿõýÿíü" äýÿí'å=öýÿíR ä;öùÿõqõýÿí'å;öùÿõ>õ(ö!öýÿíhä(ö*öýÿíP&å,ö*öýÿí'å)ö)öùÿõqõýÿí'å;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿí'å)ö;öùÿõvõýÿ픀ävõýÿídh ä(öýÿíä@ä,öýÿíR ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíP&åjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿídh ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}ö h&D*á >!âîÜ0!ä„?îä¼>!ìâè>!l äØ>!ì ì?!R äØ>!ðhä ?!ì äî€?!âàL!D*á‡â˜?!ü@L!öü" ð{öùÿõýÿíü" äýÿíP&å=öýÿíR ä;öùÿõ;õ(öýÿíl äjõýÿíR ähõýÿíl äjõqõýÿíP&å)öùÿõDõ[õ;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿíü" äýÿíä@ä=öýÿíP&å;öùÿõqõýÿíP&å;öùÿõ;õ(ö*öýÿíP&å<ö*öýÿíä@ä)öùÿõ{öùÿõýÿíü" äýÿí'å=öýÿíR ä;öùÿõqõýÿí'å;öùÿõ>õ(ö!ö(ö*öýÿíP&å<ö*öýÿí'å)ö)öùÿõqõýÿí'å;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿí'å)ö;öùÿõvõýÿ픀ävõýÿídh ä(öýÿíä@ä,öýÿíR ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíP&åjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿídh ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}ö h&D*á|L!âî0?!ät4îä˜L!ìâÄL!l ä´L!ì ðR ä´L!ô0M!ã[!,‚âM!üÀY!òHM!< ñ`M!¼ áîxM!ü òÜN î{öùÿõ>õ(öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ<õ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿí`=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ<õùÿõ{öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõ}öh&,üY!âîàL!äà3îä(Z!äZ!äâ äæTZ!ô=äDZ!ì ìpZ!…äDZ!ìœZ!`=äŒZ!ì 俏Z!ô„äŒZ!ìÔZ!ˆõäZ!ðhäðZ!ì äîP[!âLh!,|â˜[!ü8g!òh[!< ñ€[!¼ áòü î{öùÿõ>õ(öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä)öùÿõ{öùÿõ;õ(ö*öýÿíô=ä<ö*öýÿí`=ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ<õ;õ(ö*öýÿí`=ä<ö*öýÿíô=ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿí`=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ<õùÿõ{öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõ}öh&,tg!âï[!ä01îä g!äg!äâ äæÌg!ô=ä¼g!ì ìèg!…ä¼g!ìh!`=äh!ì äæ0h!ô„äh!ðˆõäg!ôœh!â s!$ ^âüh!üÌq!ò´h!< ñÌh!¼ áîäh!ü òÜN î{öùÿõ>õ(öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ<õ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõpõýÿí`=ä;öùÿõ<õùÿõ{öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõ}öh&$ r!âîLh!äd0îä4r!ä$r!äâ äæ`r!ô=äPr!ì ì|r!…äPr!ì¨r!`=ä˜r!ì äæÄr!ô„ä˜r!ìàr!ˆõä$r!ðhäür!ì äî\s!âø|!$ Xâ¤s!üä{!òts!< ñŒs!¼ áòü î{öùÿõ>õ(öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä)öùÿõ{öùÿõ;õ(ö*öýÿíô=ä<ö*öýÿí`=ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ<õ;õ(ö*öýÿí`=ä<ö*öýÿíô=ä)öùÿõpõýÿí`=ä;öùÿõ<õùÿõ{öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõ}öh&$  |!âî s!äà2îäL|!ä<|!äâ äæx|!ô=äh|!ì ì”|!…äh|!ìÀ|!`=ä°|!ì äæÜ|!ô„ä°|!ðˆõä<|!ôH}!âh†! éPâ¨}!ü(…!ò`}!< ñx}!¼ áî}!ü òÜN î{öùÿõ>õ(öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõpõýÿí`=ä;öùÿõ<õ;õ(öýÿíhä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõpõýÿíô=ä;öùÿõ<õùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh& éd…!âîø|!ä2îä…!䀅!äâ äæ¼…!ô=䬅!ì ìØ…!…䬅!ì†!`=äô…!ì äæ †!ô„äô…!ì<†!ˆõ䀅!ðhäX†!ì ä!â! éJã‡!üð!òІ!< ñè†!¼ áòü î{öùÿõ>õ(öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä)öùÿõ{öùÿõ;õ(ö*öýÿí`=ä<ö*öýÿíô=ä)öùÿõpõýÿí`=ä;öùÿõ<õ;õ(ö*öýÿíô=ä<ö*öýÿí`=ä)öùÿõpõýÿíô=ä;öùÿõ<õùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíˆõä;öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh& é,Ž!âîh†!äH.îäXŽ!äHŽ!äâ äæ„Ž!ô=ätŽ!ì ì Ž!…ätŽ!ìÌŽ!`=伎!ì äæèŽ!ô„伎!ðˆõäHŽ!ôT!âl!x…â´!ü,œ!òl!< ñ„!¼ áîœ!ü òÜN î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíˆõä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿí`=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ<õ;õ(öýÿíhä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõ}öh&xhœ!âî!äL-î䔜!䄜!äâ äæÀœ!ô=ä°œ!ì ìÜœ!…ä°œ!ì!`=äøœ!ì äæ$!ô„äøœ!ì@!ˆõ䄜!ðhä\!ì äî¼!ã«!xâž!üì©!òÔ!< ñì!¼ áòü î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíˆõä)öùÿõ{öùÿõ;õ(ö*öýÿí`=ä<ö*öýÿíô=ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿí`=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ<õ;õ(ö*öýÿíô=ä<ö*öýÿí`=ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíô=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõ}öh&x(ª!âîl!ä´/îäTª!äDª!äâ 俀ª!ô=äpª!ì 윪!…äpª!ìȪ!`=个!ì äæäª!ô„个!ðˆõäDª!ôP«!â ³! ÖD☫!üø±!òh«!< ñ€«!¼ áòÜN î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíô=ä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõDõ[õ;öùÿõ<õ;õ(ö!öýÿíhä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõpõýÿí`=ä;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿí`=äjõýÿíô„ä)ö;öùÿõ}öh& Ö4²!ï«!äð.îäP²!ìâ|²!ô=äl²!ì 옲!…äl²!ìIJ!`=ä´²!ì äæà²!ô„ä´²!ðhäü²!ì äî\³!âtº! Ö@⌳!üŒ¹!òt³!< õ¼ áî{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíô=ä)öùÿõ{öùÿõ;õ(ö*öýÿí`=ä<ö*öýÿíô=ä)öùÿõDõ[õ;öùÿõ<õ;õ(ö!ö(ö*öýÿíô=ä<ö*öýÿí`=ä)ö)öùÿõpõýÿí`=ä;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿí`=äjõýÿíô„ä)ö;öùÿõ}öh& Öȹ!î ³!äœ îää¹!ìâº!ô=åº!ì ì,º!…åº!ìXº!`=äHº!ì äêô„äHº!ôĺ!â $Ý!|cáôº!ü<Ü!òܺ!´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ>õ(öýÿíˆÏä>öÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí¼Ê äjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,övõýÿ픀ävõýÿí Ùä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´ åýÿí'å=öýÿíR ä-öÿÿìæ;öùÿõ;õ(öýÿí¼Ê äjõýÿí'å)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí'å,övõýÿ픀ävõýÿí ä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´ åýÿí¸(å=öýÿíl ä+öýÿíˆÏä/öÿÿìæ;öùÿõýÿíôÀ ä(öýÿíl ä,öýÿí¸(å,öýÿí'å,öýÿíhä)ö;öùÿõýÿí´ åýÿíP&å=öýÿíl ä+öÿÿìæ;öùÿõýÿí¸(å=öýÿí'å;öùÿõqõýÿí'å;öùÿõ>õ(öýÿíP&å<öýÿí'å)öùÿõ{öùÿõ>õ(öýÿíhä(ö*öýÿíP&å,ö*öýÿí¸(å)ö)öùÿõpõýÿíP&å;öùÿõ>õ(öýÿíP&å<öýÿí'åiõ!öýÿíhä(ö*öýÿí'å,ö*öýÿí¸(å)ö)öùÿõqõýÿí'å;öùÿõ;õ(öýÿíP&åmõýÿí'å)öùÿõCõ;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿí'å)ö;öùÿõpõýÿíP&å;öùÿõqõýÿí'å;öùÿõ}öùÿõ;õ(öýÿí¼Ê ä<öýÿíP&å)öùÿõýÿíR ä=öýÿíP&å;öùÿõ<õùÿõ{öùÿõýÿíl ä=öýÿíP&å;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿí¸(å)ö;öùÿõ}öùÿõýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ}öùÿõ=õ(öýÿíˆÏä)öùÿõ{öùÿõ9õÿÿìæ:öùÿõ{öùÿõýÿí´ åýÿíP&å=öýÿíl ä;öùÿõpõýÿíP&å;öùÿõ;õ(öýÿíhä(ö*öýÿíP&å,ö*öýÿíl ä)ö)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíP&å)ö;öùÿõ}öùÿõCõ;öùÿõ9õÿÿìæ:öùÿõýÿíÌTå(öýÿíl ä,öýÿíl ä+öÿÿìæ,öýÿíl ä+öÿÿìæ,öýÿíhä)ö;öùÿõCõ;öùÿõ}öùÿõ}öh&|xÜ!âîtº!äP îä”Ü!ìâÀÜ!l ä°Ü!ì ìÜÜ!¼Ê ä°Ü!ìøÜ!R ä°Ü!ðhäÝ!ì äîtÝ!âò!|ÓâŒÝ!üTñ!ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ>õ(öýÿíˆÏä>öÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí¼Ê äjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,övõýÿ픀ävõýÿí Ùä(öýÿíl ä,öýÿíR ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´ åýÿí'å=öýÿíR ä-öÿÿìæ;öùÿõ;õ(öýÿí¼Ê äjõýÿí'å)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí'å,övõýÿ픀ävõýÿí ä(öýÿíl ä,öýÿíR ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´ åýÿí¸(å=öýÿíl ä+öýÿíˆÏä/öÿÿìæ;öùÿõýÿíÌTå(öýÿíl ä,öýÿí¸(å,öýÿí'å)ö;öùÿõýÿí>åýÿí{ ä(ö*öýÿí¸(å)ö;öùÿõýÿí¸(å=övõýÿ픀ävõýÿí@¾ ä(öýÿíl ä+öÿÿìæ,öýÿí'å,övõýÿ픀ävõýÿí( ä(öýÿíä<öýÿí>å>ö(ö)ö,ö*öýÿí¸(å)ö)ö;öùÿõ;õ(öýÿí¼Ê ä<öýÿí¸(å)öùÿõýÿíR ä=öýÿí¸(å;öùÿõ<õùÿõýÿíl ä=öýÿí¸(å;öùÿõýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ}öùÿõýÿ픀 ä(öýÿíl ä,öýÿíR ä)ö;öùÿõ}öh&|ñ!âî$Ý!äHîä¬ñ!ìâØñ!l äÈñ!ì ìôñ!¼Ê äÈñ!ðR äÈñ!ô`ò!âd"€¬‡â¨ò!üPÿ!òxò!<¬ ðò!´ áòÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí´ åýÿíˆõä=öýÿí4ôä;öùÿõ@õ(ö;öýÿíl äkõýÿíR äiõýÿíˆõäkõýÿíÉ ä;öpõýÿíl ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõýÿí`œäýÿíˆÏä=öýÿíˆõä-öýÿí4ôä;öùÿõ;õ(öýÿíˆÏäjõÿÿô)öùÿõDõýÿíˆõä;öùÿõvõýÿ픀ävõýÿíÌàä(öýÿí4ôä,öýÿíˆõä,öýÿíhä)ö;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(öýÿíhä(ö*öýÿíl ä,ö*öýÿí4ôä)ö)öùÿõýÿí<¾ä(öýÿí4ôä,öýÿíˆÏä,öýÿí`œä(öÿÿô)ö,ö*öýÿíl ä,öýÿíhä)ö;öùÿõvõýÿ픀ävõýÿílä(öýÿí4ôä,öýÿíˆõä,öýÿíhä)ö;öùÿõDõýÿíˆõä;öùÿõ}öh&€¬Œÿ!âîò!ä€îä¸ÿ!ä¨ÿ!äâ äæäÿ!l äÔÿ!ì î"R äÔÿ!ì"4ôä¨ÿ!ì8"É ä¨ÿ!ðhäT"ì äî´"✠"€¬~âä"ü´ "òÌ"<¬ ô´ áî{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí´ åýÿíˆõä=öýÿí4ôä;öùÿõ@õ(ö;öýÿíl äkõýÿíR äiõýÿíˆõäkõýÿíÉ ä;öpõýÿíl ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõýÿí`œäýÿíˆÏä=öýÿíˆõä-öýÿí4ôä;öùÿõ;õ(öýÿíˆÏäjõÿÿô)öùÿõDõýÿíˆõä;öùÿõvõýÿ픀ävõýÿíÌàä(öýÿí4ôä,öýÿíˆõä)ö;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö*öýÿíl ä<ö*öýÿí4ôä)öùÿõýÿí<¾ä(öýÿí4ôä,öýÿíˆÏä,öýÿí`œä(öÿÿô)ö,ö*öýÿíl ä)ö;öùÿõvõýÿ픀ävõýÿílä(öýÿí4ôä,öýÿíˆõä)ö;öùÿõDõýÿíˆõä;öùÿõ}öh&€¬ð "âîd"ä¸îä "ä "äâ äæH "l ä8 "ì ìd "R ä8 "ì€ "4ôä "ðÉ ä "ôì "âô"x$ ªâ"ü "ò"´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿí¤R ä=öýÿíä·ä-öýÿíl ä;öùÿõ=õ(öýÿí¤R ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõ;öùÿõ9õÿÿìæ:öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,övõýÿ픀ävõýÿí Ùä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö)ö;öùÿõDõ;öùÿõ}öùÿõvõýÿ픀ävõýÿíÌàä(öýÿíl ä,öýÿíä·ä,öýÿíhä)ö;öùÿõ@õ(öýÿí´ åýÿíP&å=öýÿíä·ä;öýÿíP&åkõýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿíP&å,ö*öýÿíl ä)ö)öùÿõ{öùÿõýÿí>åýÿí`Tä(ö*öýÿíP&å)ö;öùÿõ*öýÿíP&å=ö*öýÿíl ä;öùÿõýÿí<¾ä(öýÿíl ä,öýÿí¤R ä,öýÿí`œä(öÿÿô)ö,öýÿí`Tä,öýÿíhä)ö;öùÿõ}öùÿõ}öùÿõvõýÿ픀ävõýÿílä(öýÿíl ä,öýÿíä·ä,öýÿíhä)ö;öùÿõ}öh&x$ H"âîœ "äèîäd"ìâ"l ä€"ì ì¬"ä·ä€"ìÈ"R ä€"ðhää"ì äîD"ã/"x$ Ÿâ\"üD."ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿí¤R ä=öýÿíä·ä-öýÿíl ä;öùÿõ=õ(öýÿí¤R ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõ;öùÿõ9õÿÿìæ:öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,övõýÿ픀ävõýÿí Ùä(öýÿíl ä,öýÿíR ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõvõýÿ픀ävõýÿíÌàä(öýÿíl ä,öýÿíä·ä)ö;öùÿõ@õ(öýÿí´ åýÿíP&å=öýÿíä·ä;öýÿíP&åkõýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõ;õ(ö*öýÿíP&å<ö*öýÿíl ä)öùÿõ{öùÿõýÿí>åýÿí`Tä(ö*öýÿíP&å)ö;öùÿõ*öýÿíP&å=ö*öýÿíl ä;öùÿõýÿí<¾ä(öýÿíl ä,öýÿí¤R ä,öýÿí`œä(öÿÿô)ö,öýÿí`Tä)ö;öùÿõ}öùÿõ}öùÿõvõýÿ픀ävõýÿílä(öýÿíl ä,öýÿíä·ä)ö;öùÿõ}öh&x$ €."âîô"äœîäœ."ìâÈ."l ä¸."ì ìä."ä·ä¸."ðR ä¸."ôP/"âl="ˆŒâ€/"ü <"òh/"´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí¸Y ä;öùÿõýÿí¸Y äýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏälõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõqõýÿíR ä;öùÿõ;õ(öýÿíhä(ö*öýÿíR ä,ö*öýÿíl ä)ö)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿ픀 ä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö;öùÿõDõ;öùÿõ}öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿíPdä;öùÿõýÿí°{ä<öýÿíPdä>öýÿílä(öýÿíˆÏä)ö;öùÿõýÿíx ä(öýÿíl ä,öýÿíR ä,öýÿílä.öýÿíHý ä(ö)ö,öýÿílä.öýÿí<: ä(ö)ö,öýÿíhä)ö;öùÿõ}öh&ˆÜ<"âï/"äîäø<"ìâ$="l ä="ì ì@="R ä="ðhä\="ì äî¼="âìJ"ˆ…âÔ="üLJ"ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí¸Y ä;öùÿõýÿí¸Y äýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏälõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõqõýÿíR ä;öùÿõ;õ(ö*öýÿíR ä<ö*öýÿíl ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿ픀 ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿíPdä;öùÿõýÿí°{ä<öýÿíPdä>öýÿílä(öýÿíˆÏä)ö;öùÿõýÿíx ä(öýÿíl ä,öýÿíR ä,öýÿílä.öýÿíHý ä(ö)ö,öýÿílä.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&ˆˆJ"âîl="äÔîä¤J"ìâÐJ"l äÀJ"ì ðR äÀJ"ôövõýÿí`œäýÿí¸Y ä;öùÿõýÿí¸Y äýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏälõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõqõýÿíR ä;öùÿõ;õ(öýÿíhä(ö*öýÿíR ä,ö*öýÿíl ä)ö)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿ픀 ä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí¸Y äýÿíxä=öýÿíˆÏä-öýÿíˆÏä/öÿÿìæ;öùÿõýÿíÌÕäýÿíä·ä=öýÿíl ä+öýÿíxä;öùÿõ;õ(öýÿíˆÏälõýÿí“ä-öýÿíT* ä)öùÿõ{öùÿõýÿ팲ä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä,öýÿíhä)ö;öùÿõýÿ팲ä(öýÿíä·ä,öýÿíR ä,öýÿíT* ä+öýÿíxä,öýÿíhä)ö;öùÿõvõýÿ픀ävõýÿíô¸ä(öýÿíT* ä,öýÿíT* ä+öýÿíxä,öýÿíT* ä+öýÿíxä,öýÿíT* ä+öýÿíˆÏä,öýÿíl ä,öýÿíhä)ö;öùÿõDõ;öùÿõ}öùÿõýÿíx ä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä,öýÿí“ä,öýÿíhä)ö;öùÿõýÿíx ä(öýÿíä·ä,öýÿíR ä,öýÿíT* ä,öýÿí“ä,öýÿíhä)ö;öùÿõýÿí€òä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿíhä,öýÿíä·ä-öýÿíl ä,öýÿíR ä-öýÿíä·ä,öýÿíT* ä,öùÿõýÿí“ä)ö;öùÿõ}öh&x Èa"âîìJ"åîääa"ìâb"l åb"ì ì,b"R åb"ìXb"T* äHb"ì äætb"“äHb"ðhäb"ì äîðb"â`x"x Ùâ c"üxw"òc"ÌÕôüÔî{öùÿõõ õýÿíà?ä<öýÿíÌÕä>övõýÿí`œäýÿí¸Y ä;öùÿõýÿí¸Y äýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏälõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõqõýÿíR ä;öùÿõ;õ(ö*öýÿíR ä<ö*öýÿíl ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿ픀 ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí¸Y äýÿíxä=öýÿíˆÏä-öýÿíˆÏä/öÿÿìæ;öùÿõýÿíÌÕäýÿíä·ä=öýÿíl ä+öýÿíxä;öùÿõ;õ(öýÿíˆÏälõýÿí“ä-öýÿíT* ä)öùÿõ{öùÿõýÿ팲ä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä)ö;öùÿõýÿ팲ä(öýÿíä·ä,öýÿíR ä,öýÿíT* ä+öýÿíxä)ö;öùÿõvõýÿ픀ävõýÿíô¸ä(öýÿíT* ä,öýÿíT* ä+öýÿíxä,öýÿíT* ä+öýÿíxä,öýÿíT* ä+öýÿíˆÏä,öýÿíl ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿíx ä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõýÿíx ä(öýÿíä·ä,öýÿíR ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõýÿí€òä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿíä·ä-öýÿíl ä,öýÿíR ä-öýÿíä·ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõ}öh&x ´w"âî b"äP¡îäÐw"ìâüw"l äìw"ì ìx"R äìw"ìDx"T* ä4x"ì äê“ä4x"ô°x"â"Œ²áâøx"üŽ"òÈx"ÌÕðàx"üÔòÜN î{öùÿõõ õýÿíà?ä<öýÿíÌÕä>övõýÿí`œäýÿí¸Y ä;öùÿõýÿí¸Y äýÿíˆÏä=öýÿí…ä-öýÿíô=ä;öùÿõ;õ(öýÿíˆÏälõÿÿô)öùÿõDõ;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõ*öýÿí`=ä=ö*öýÿíô=ä;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõ;õ(öýÿíhä(ö*ö(öýÿí…ä-öÿÿìæ)ö,ö*öýÿíô=ä)ö)öùÿõvõýÿ픀ävõýÿí Ää(öýÿíô=ä,öýÿí…ä,öýÿí`=ä)ö;öùÿõ<õùÿõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿí`=ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿ픀 ä(öýÿíô=ä,öýÿí…ä,öýÿíhä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿí`=ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí¸Y äýÿíxä=öýÿíˆÏä-öýÿíˆÏä/öÿÿìæ;öùÿõýÿíÌÕäýÿíä·ä=öýÿíô=ä+öýÿíxä;öùÿõýÿíx ä(öýÿíô=ä,öýÿíä·ä,öýÿí`=ä,öýÿí`=ä+öýÿíxä,öýÿíhä)ö;öùÿõýÿíx ä(öýÿíä·ä,öýÿí…ä,öýÿí`=ä+öýÿíxä,öýÿí`=ä+öýÿíˆÏä,öýÿíhä)ö;öùÿõvõýÿ픀ävõýÿíô¸ä(öýÿíô=ä,öýÿíô=ä+öýÿíxä,öýÿíô=ä+öýÿíxä,öýÿíô=ä+öýÿíˆÏä,öýÿí`=ä,öýÿíhä)ö;öùÿõ}öh&Œ²LŽ"âî`x"äÄ¡îähŽ"ì┎"ô=䄎"ì ì°Ž"…䄎"ìÜŽ"`=äÌŽ"ì äêhäøŽ"ì äîX"âd¤"Œ²Öâˆ"ü˜£"òp"ÌÕôüÔî{öùÿõõ õýÿíà?ä<öýÿíÌÕä>övõýÿí`œäýÿí¸Y ä;öùÿõýÿí¸Y äýÿíˆÏä=öýÿí…ä-öýÿíô=ä;öùÿõ;õ(öýÿíˆÏälõÿÿô)öùÿõDõ;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõ*öýÿí`=ä=ö*öýÿíô=ä;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõ;õ(ö*ö(öýÿí…ä-öÿÿìæ)ö<ö*öýÿíô=ä)öùÿõvõýÿ픀ävõýÿí Ää(öýÿíô=ä,öýÿí…ä,öýÿí`=ä)ö;öùÿõ<õùÿõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿí`=ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿ픀 ä(öýÿíô=ä,öýÿí…ä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿí`=ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí¸Y äýÿíxä=öýÿíˆÏä-öýÿíˆÏä/öÿÿìæ;öùÿõýÿíÌÕäýÿíä·ä=öýÿíô=ä+öýÿíxä;öùÿõýÿíx ä(öýÿíô=ä,öýÿíä·ä,öýÿí`=ä,öýÿí`=ä+öýÿíxä)ö;öùÿõýÿíx ä(öýÿíä·ä,öýÿí…ä,öýÿí`=ä+öýÿíxä,öýÿí`=ä+öýÿíˆÏä)ö;öùÿõvõýÿ픀ävõýÿíô¸ä(öýÿíô=ä,öýÿíô=ä+öýÿíxä,öýÿíô=ä+öýÿíxä,öýÿíô=ä+öýÿíˆÏä,öýÿí`=ä)ö;öùÿõ}öh&Œ²Ô£"âî"äPŸîäð£"ìâ¤"ô=ä ¤"ì ì8¤"…ä ¤"ð`=äT¤"ì äî´¤"â @Ù"J&áä¤"ütØ"ò̤"´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí¸Y ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿí¸Y äýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏälõÿÿìæ)öùÿõCõ;öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿíÌøä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö;öùÿõCõ;öùÿõ}öùÿõõ!õ õýÿíxNä=öýÿí¶ä/öÿÿìæ;öùÿõõ õýÿí˜2ä=ö-öýÿíxNä+öÿÿìæ;öùÿõýÿí´ åýÿí¸(å=öýÿíl ä+ö(öýÿíˆÏä/öÿÿìæ+öýÿí˜2ä%öýÿíxNä)ö;öùÿõ;õ(öpõýÿí˜2ämõýÿíxNä)öùÿõýÿí˜2ä=ö-öýÿíxNä+öÿÿìæ;öùÿõýÿí´ åýÿí4“ä=öýÿíl ä+ö(öÿÿìæ*öýÿíˆÏä/öÿÿìæ+öýÿí˜2ä%öýÿíxNä)ö;öùÿõ;õ(öpõýÿí˜2ämõýÿíxNä)öùÿõýÿí˜2ä=ö-öýÿíxNä+öÿÿìæ;öùÿõýÿí´ åýÿí'å=öýÿíR ä-öÿÿìæ;öùÿõýÿíôÀ ä(öýÿí¸(å,öýÿí4“ä,öýÿí'å,öýÿíhä)ö;öùÿõùÿõýÿí¸(å=öýÿíl ä;öùÿõýÿí4“ä=öýÿí'å;öùÿõ>õ(öýÿíhä(ö*öýÿí¸(å,ö*öýÿí'å)ö)öùÿõpõýÿí¸(å;öùÿõ>õ(öýÿí¸(åkõqõýÿí4“äiõ!öýÿíhä(ö*öýÿí4“ä,ö*öýÿí'å)ö)öùÿõ{ö}öùÿõ;õ(öýÿí¸(å<öýÿí4“ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¸(å,öýÿí4“ä)ö;öùÿõpõýÿí¸(å;öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(öýÿíhä(ö*öýÿí¸(å,ö*öýÿí'å)ö)öùÿõpõýÿí¸(å;öùÿõ>õ(ö!öýÿíhä(ö*öqõýÿí4“ä,ö*öýÿí'å)ö)öùÿõ{ö}öùÿõ;õ(öýÿí¸(åmõýÿí4“ä)öùÿõCõ;öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¸(å,öýÿí4“ä)ö;öùÿõpõýÿí¸(å;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí¸(åjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¸(å,öýÿí'å)ö;öùÿõpõýÿí¸(å;öùÿõùÿõýÿí4“ä=öýÿíR ä;öùÿõ;õ(ö!öýÿíhä(ö*öýÿíl ä,ö*öqõýÿí4“ä)ö)öùÿõ{öùÿõ>õ(öýÿí¸(åkõýÿíR äiõ!öýÿíhä(ö*öýÿíl ä,ö*öýÿí¸(å)ö)öùÿõpõýÿí¸(å;öùÿõ;õ(öýÿí¸(å<öýÿí4“ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¸(å,öýÿí4“ä)ö;öùÿõ}öùÿõ;õ(öýÿí¸(å<öýÿí4“ä)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(ö!öýÿíhä(ö*öýÿíl ä,ö*öýÿí¸(å)ö)öùÿõpõýÿí¸(å;öùÿõ>õ(öýÿíhä(ö*öýÿíl ä,ö*öqõýÿí4“ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿí¸(åmõýÿí4“ä)öùÿõCõ;öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¸(å,öýÿí4“ä)ö;öùÿõpõýÿí¸(å;öùÿõ}öùÿõ}öùÿõùÿõýÿíl ä=öýÿí¸(å;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí¸(å-öýÿíl ä<öýÿíR ä-öýÿí¸(å)öùÿõ{öùÿõvõýÿ픀ävõýÿíJä(öýÿíl ä,öýÿí¸(å,öýÿíhä)ö;öùÿõùÿõýÿíl ä=öýÿí¸(å;öùÿõ}öùÿõ<õùÿõ{öùÿõvõýÿ픀ävõýÿíJä(öýÿí¸(å,öýÿíR ä,öýÿíhä)ö;öùÿõùÿõýÿíR ä=öýÿí¸(å;öùÿõ}öùÿõ}öùÿõ}öùÿõ}öh&J°Ø"âîd¤"äH îäÌØ"ìâøØ"l äèØ"ì ìÙ"R äèØ"ðhä0Ù"ì äîÙ"â hù"JLá¨Ù"üÈø"ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí¸Y ä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿí¸Y äýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏälõÿÿìæ)öùÿõCõ;öùÿõ;õ(öýÿíˆÏälõýÿí¶ä)öùÿõ{öùÿõýÿíÌøä(öýÿíl ä,öýÿíR ä)ö;öùÿõCõ;öùÿõ}öùÿõõ!õ õýÿíxNä=öýÿí¶ä/öÿÿìæ;öùÿõõ õýÿí˜2ä=ö-öýÿíxNä+öÿÿìæ;öùÿõýÿí´ åýÿí¸(å=öýÿíl ä+ö(öýÿíˆÏä/öÿÿìæ+öýÿí˜2ä%öýÿíxNä)ö;öùÿõ;õ(öpõýÿí˜2ämõýÿíxNä)öùÿõýÿí˜2ä=ö-öýÿíxNä+öÿÿìæ;öùÿõýÿí´ åýÿí4“ä=öýÿíl ä+ö(öÿÿìæ*öýÿíˆÏä/öÿÿìæ+öýÿí˜2ä%öýÿíxNä)ö;öùÿõ;õ(öpõýÿí˜2ämõýÿíxNä)öùÿõýÿí˜2ä=ö-öýÿíxNä+öÿÿìæ;öùÿõýÿí´ åýÿí'å=öýÿíR ä-öÿÿìæ;öùÿõýÿíôÀ ä(öýÿí¸(å,öýÿí4“ä,öýÿí'å)ö;öùÿõýÿí¸(å=öýÿí  ä(öýÿíl ä,öýÿí'å,öýÿí,Kä<öýÿíä<öýÿí>å>ö>ö(öýÿíä<öýÿí>å>ö(ö)ö,ö*öýÿí'å)ö)ö;öùÿõ;õ(öýÿí¸(åjõýÿíl ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¸(å,öýÿí'å)ö;öùÿõpõýÿí¸(å;öùÿõýÿí¸(å=öýÿí  ä(öýÿí¸(å,öýÿíR ä,öýÿí¼Éä(öýÿíü6ä<öýÿíä<öýÿí>å>ö>ö(öýÿíä<öýÿí>å>ö(ö)ö,ö*öýÿíl ä)ö)ö)ö;öùÿõùÿõýÿíl ä=öýÿí¸(å;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí¸(å-öýÿíl ä<öýÿíR ä-öýÿí¸(å)öùÿõ{öùÿõvõýÿ픀ävõýÿíJä(öýÿíl ä,öýÿí¸(å)ö;öùÿõùÿõýÿíl ä=öýÿí¸(å;öùÿõ}öùÿõ<õùÿõ{öùÿõvõýÿ픀ävõýÿíJä(öýÿí¸(å,öýÿíR ä)ö;öùÿõùÿõýÿíR ä=öýÿí¸(å;öùÿõ}öùÿõ}öùÿõ}öùÿõ}öh&Jù"âî@Ù"ä@žîä ù"ìâLù"l ä<ù"ì ðR ä<ù"ô¸ù"ât#”€ hâèù"ü¨#òÐù"´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿíPdä;öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿí´ åýÿíP&å=öýÿíl ä;öùÿõ@õ(öpõýÿíP&å;öýÿíP&å<öýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõýÿíPdäýÿí`Tä=ö*öýÿíP&å;öùÿõýÿí´ åýÿí'å=öýÿíP&å;öùÿõýÿí´ åýÿí¨'å=öýÿí'å;öùÿõ>õ(öýÿíl ä<öýÿí¨'åiõýÿíhä(öýÿí`Tä,ö*öqõýÿí'å)ö)öùÿõ{öùÿõ*öýÿí¨'å=ö*öýÿí'å;öùÿõqõýÿí¨'å;öùÿõ}öùÿõ*öýÿí¨'å=öýÿí`Tä;öùÿõ}öùÿõ}öùÿõ}öh&”€ ä#âîhù"äøžîå#ìâ,#l ä#ì ìH#R ä#ðhäd#ì äîÄ#âô#”€ eâÜ#üT#ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿíPdä;öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿí´ åýÿíP&å=öýÿíl ä;öùÿõ@õ(öpõýÿíP&å;öýÿíP&å<öýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõýÿíPdäýÿí`Tä=ö*öýÿíP&å;öùÿõýÿí´ åýÿí'å=öýÿíP&å;öùÿõýÿí´ åýÿí¨'å=öýÿí'å;öùÿõ>õ(öýÿíl ä<öýÿí¨'åiõýÿí`Tä<ö*öqõýÿí'å)öùÿõ{öùÿõ*öýÿí¨'å=ö*öýÿí'å;öùÿõqõýÿí¨'å;öùÿõ}öùÿõ*öýÿí¨'å=öýÿí`Tä;öùÿõ}öùÿõ}öùÿõ}öh&”€ #âît#äŒîä¬#ìâØ#l äÈ#ì ðR äÈ#ôD#âè#ÌøGât#ü#ò\#´ õÜN î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿí´ åýÿíhÆä=öýÿíR ä-öÿÿìæ;öùÿõ@õ(ö;öýÿíl ä<öýÿíhÆä;öpõýÿíl ä)öùÿõ{öùÿõýÿí´ åýÿíP&å=övõýÿ픀ävõýÿí Ùä(öýÿíl ä,öýÿíR ä,öýÿíhä)ö;öùÿõ;õ(öýÿíP&åkõýÿíl ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿíl ä)ö;öùÿõ}öùÿõ}öùÿõ}öh&ÌøX#âîô#ä¸îät#ìâ #l ä#ì ì¼#R ä#ðhäØ#ì äî8#âh#ÌøEâP#üÈ#ö´ ñ{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿí´ åýÿíhÆä=öýÿíR ä-öÿÿìæ;öùÿõ@õ(ö;öýÿíl ä<öýÿíhÆä;öpõýÿíl ä)öùÿõ{öùÿõýÿí´ åýÿíP&å=övõýÿ픀ävõýÿí Ùä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿíP&åkõýÿíl ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíP&å,öýÿíl ä)ö;öùÿõ}öùÿõ}öùÿõ}öh&Ìø#âîè#äœîä #ìâL#l ä<#ì ðR ä<#ô¸#â+#ôÀ xâè#ü(*#òÐ#œö ôÜN î{öùÿõõýÿíl?ä=ö!öýÿíhä(ö*öýÿí ä,ö*öýÿí¤ ä)ö;öùÿõõýÿíAä=ö!öýÿíhä(ö*öýÿíˆä,ö*öýÿí ä)ö;öùÿõ;õ(öýÿíl?äiõýÿíAä)öùÿõDõ;öùÿõ;õ(ö!öýÿíl?äiõ!öýÿíAä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿíhä(ö*öýÿíˆä,ö*öýÿí¤ ä)ö)öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõ;õ(öýÿíl?ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíˆä,öýÿí ä)ö;öùÿõ<õùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿí ä)ö;öùÿõ}öh&ôÀ d*#âîh#ähœîä€*#ìâ¬*#¤ äœ*#ì ìÈ*#ˆäœ*#ìä*# äœ*#ðhå+#ì äî`+#âü6#ôÀ sâx+#ü@6#öœö ð{öùÿõõýÿíl?ä=ö!ö(ö*öýÿí ä<ö*öýÿí¤ ä)ö;öùÿõõýÿíAä=ö!ö(ö*öýÿíˆä<ö*öýÿí ä)ö;öùÿõ;õ(öýÿíl?äiõýÿíAä)öùÿõDõ;öùÿõ;õ(ö!öýÿíl?äiõ!öýÿíAä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(ö*öýÿíˆä<ö*öýÿí¤ ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõ;õ(öýÿíl?ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíˆä,öýÿí ä)ö;öùÿõ<õùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿí ä)ö;öùÿõ}öh&ôÀ |6#âî+#äàîä˜6#ìâÄ6#¤ ä´6#ì ìà6#ˆä´6#ð ä´6#ôL7#â¼F#ÌTá™â|7#üÔE#òd7#œö ôÜN î{öùÿõõýÿíl?ä=ö!öýÿíhä(ö*öýÿíˆä,ö*öýÿí¤ ä)ö;öùÿõõýÿíAä=ö!öýÿíhä(ö*öýÿí ä,ö*öýÿíˆä)ö;öùÿõ;õ(öýÿíl?äiõýÿíAä)öùÿõDõ;öùÿõ;õ(ö!öýÿíl?äiõ!öýÿíAä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿí ä)ö;öùÿõDõ;öùÿõ}öùÿõõýÿíÄ@ä=ö!öýÿíhä(ö*öýÿí ä,ö*öýÿí¤ ä)ö;öùÿõ;õ(öýÿíl?ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíˆä,öýÿí ä)ö;öùÿõ;õ(ö!öýÿíÄ@ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõ;õ(ö!öýÿíÄ@ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíˆä,öýÿí ä)ö;öùÿõ}öùÿõ}ö h&ÌTáF#âîü6#伎îä,F#ìâXF#¤ äHF#ì ìtF#ˆäHF#ìF# äHF#ðhä¬F#ì äî G#âðU#ÌTá–â$G#ü4U#öœö ð{öùÿõõýÿíl?ä=ö!ö(ö*öýÿíˆä<ö*öýÿí¤ ä)ö;öùÿõõýÿíAä=ö!ö(ö*öýÿí ä<ö*öýÿíˆä)ö;öùÿõ;õ(öýÿíl?äiõýÿíAä)öùÿõDõ;öùÿõ;õ(ö!öýÿíl?äiõ!öýÿíAä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿí ä)ö;öùÿõDõ;öùÿõ}öùÿõõýÿíÄ@ä=ö!ö(ö*öýÿí ä<ö*öýÿí¤ ä)ö;öùÿõ;õ(öýÿíl?ä)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíˆä,öýÿí ä)ö;öùÿõ;õ(ö!öýÿíÄ@ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿí¤ ä,öýÿíˆä)ö;öùÿõ;õ(ö!öýÿíÄ@ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíˆä,öýÿí ä)ö;öùÿõ}öùÿõ}ö h&ÌTápU#âî¼F#äŒîäŒU#ìâ¸U#¤ ä¨U#ì ìÔU#ˆä¨U#ð ä¨U#ô@V#âÄY#lâpV#üøX#òXV#´ õÜN î{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öqõýÿíR ä)öùÿõvõýÿ픀ävõýÿíìå(öýÿíl ä,öýÿíR ä,öýÿíhä)ö;öùÿõ}öh&l4Y#îðU#ä`ŒîäPY#ìâ|Y#l älY#ì ì˜Y#R älY#ðhä´Y#ì äîZ#â$]#lâ,Z#ü„\#ö´ ñ{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öqõýÿíR ä)öùÿõvõýÿ픀ävõýÿíìå(öýÿíl ä,öýÿíR ä)ö;öùÿõ}öh&lÀ\#îÄY#äH‹îäÜ\#ìâ]#l äø\#ì ðR äø\#ôt]#âøu#Ìàûâ¤]#ü,u#òŒ]#´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏä<öÿÿìæ)öùÿõDõ;öùÿõýÿí`œäýÿí|M ä=ö(öýÿíˆÏä-öÿÿìæ)ö/öÿÿìæ;öùÿõýÿí´ åýÿí|8 ä=öýÿíl ä+öýÿí|M ä;öùÿõýÿí`œäýÿíPQ ä=ö(öýÿí|M ä+öÿÿìæ)ö*öÿÿìæ;öùÿõýÿí´ åýÿí¤Çä=öýÿíl ä+öýÿíPQ ä;öùÿõýÿí´ åýÿí|ä=öýÿí¤Çä-öÿÿìæ;öùÿõýÿí`œäýÿíÄÖä=öýÿíPQ ä;öùÿõýÿí´ åýÿíÜ9ä=öýÿí¤Çä;öùÿõ;õ(öýÿíPQ äjõýÿíˆÏähõýÿíhä(ö*öýÿí¤Çä,ö*öýÿí|ä)ö)öùÿõ{öùÿõqõýÿíÄÖä;öùÿõýÿíÜ9ä=öýÿí|ä;öùÿõ}öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿí|8 ä,ö*öýÿíÜ9ä)ö)öùÿõ{öùÿõýÿí>åýÿíL´ä(ö*öýÿí|8 ä)ö;öùÿõ*öýÿí|8 ä=ö*öýÿíÜ9ä;öùÿõýÿí<¾ä(öýÿíl ä,öýÿíˆÏä,öýÿíÄÖä,öýÿíL´ä,öýÿíhä)ö;öùÿõ}öùÿõ;õ(öýÿí|M äqõjõÿÿô)öùÿõCõ;öùÿõqõýÿí|8 ä;öùÿõýÿíPQ äbõÿÿìæ;öùÿõýÿí¤Çäbõÿÿìæ;öùÿõýÿí|äbõÿÿìæ;öùÿõýÿíÄÖä=öýÿíPQ ä;öùÿõýÿíÜ9ä=öýÿí¤Çä;öùÿõ;õ(öýÿíhä(ö*öýÿí¤Çä,ö*öýÿí|ä)ö)öùÿõ{öùÿõqõýÿíÄÖä;öùÿõýÿíÜ9ä=öýÿí|ä;öùÿõ}öùÿõ}öùÿõ}öh&Ìàhu#âî$]#äp‹îä„u#ìâ°u#l ä u#ì ìÌu#R ä u#ðhäèu#ì äîHv#â€#Ìàðâ`v#üàŒ#ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏä<öÿÿìæ)öùÿõDõ;öùÿõýÿí`œäýÿí|M ä=ö(öýÿíˆÏä-öÿÿìæ)ö/öÿÿìæ;öùÿõýÿí´ åýÿí|8 ä=öýÿíl ä+öýÿí|M ä;öùÿõýÿí`œäýÿíPQ ä=ö(öýÿí|M ä+öÿÿìæ)ö*öÿÿìæ;öùÿõýÿí´ åýÿí¤Çä=öýÿíl ä+öýÿíPQ ä;öùÿõýÿí´ åýÿí|ä=öýÿí¤Çä-öÿÿìæ;öùÿõýÿí`œäýÿíÄÖä=öýÿíPQ ä;öùÿõýÿí´ åýÿíÜ9ä=öýÿí¤Çä;öùÿõ;õ(öýÿíPQ äjõýÿíˆÏähõ*öýÿí¤Çä<ö*öýÿí|ä)öùÿõ{öùÿõqõýÿíÄÖä;öùÿõýÿíÜ9ä=öýÿí|ä;öùÿõ}öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(ö*öýÿí|8 ä<ö*öýÿíÜ9ä)öùÿõ{öùÿõýÿí>åýÿíL´ä(ö*öýÿí|8 ä)ö;öùÿõ*öýÿí|8 ä=ö*öýÿíÜ9ä;öùÿõýÿí<¾ä(öýÿíl ä,öýÿíˆÏä,öýÿíÄÖä,öýÿíL´ä)ö;öùÿõ}öùÿõ;õ(öýÿí|M äqõjõÿÿô)öùÿõCõ;öùÿõqõýÿí|8 ä;öùÿõýÿíPQ äbõÿÿìæ;öùÿõýÿí¤Çäbõÿÿìæ;öùÿõýÿí|äbõÿÿìæ;öùÿõýÿíÄÖä=öýÿíPQ ä;öùÿõýÿíÜ9ä=öýÿí¤Çä;öùÿõ;õ(ö*öýÿí¤Çä<ö*öýÿí|ä)öùÿõ{öùÿõqõýÿíÄÖä;öùÿõýÿíÜ9ä=öýÿí|ä;öùÿõ}öùÿõ}öùÿõ}öh&Ìà#âîøu#ätŠîä8#ìâd#l äT#ì ðR äT#ôÐ#âì˜#ìálãŽ#ü ˜#òè#´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏä<öÿÿìæ)öùÿõDõ;öùÿõqõýÿíR ä;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõqõýÿíˆÏä;öùÿõýÿí>åýÿíL´ä(ö*öýÿíR ä)ö;öùÿõ*öýÿíR ä=ö*öýÿíl ä;öùÿõýÿí<¾ä(öýÿíl ä,öýÿíˆÏä,öýÿí`œä(öÿÿô)ö,öýÿíL´ä,öýÿíhä)ö;öùÿõ}ö h&ìá\˜#âî€#äüŠîäx˜#ì⤘#l 䔘#ì ìÀ˜#R 䔘#ðhäܘ#ì äî<™#âä£#ìájâT™#üD£#ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿíˆÏä<öÿÿìæ)öùÿõDõ;öùÿõqõýÿíR ä;öùÿõ;õ(öýÿíˆÏäjõÿÿìæ)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõ;öùÿõ}öùÿõqõýÿíˆÏä;öùÿõýÿí>åýÿíL´ä(ö*öýÿíR ä)ö;öùÿõ*öýÿíR ä=ö*öýÿíl ä;öùÿõýÿí<¾ä(öýÿíl ä,öýÿíˆÏä,öýÿí`œä(öÿÿô)ö,öýÿíL´ä)ö;öùÿõ}ö h&ìဣ#âîì˜#äü‰î䜣#ìâÈ£#l 丣#ì ðR 丣#ô4¤#⨰#<¾t┤#üt¯#òL¤#´ ñd¤#ðSî|¤#>áòÜN î{öùÿõýÿí´ åýÿí¬Zä=öýÿíl ä+öýÿí8rä;öùÿõýÿíðSäýÿíÔDä=ö(öýÿí8rä+öÿÿìæ)ö*öÿÿìæ;öùÿõ>õ(öýÿíÔDälõýÿíˆÏä)öùÿõ{öùÿõýÿí´ åýÿí|±ä=öýÿíl ä+öýÿíÔDä;öùÿõ;õ(öýÿíÔDäjõýÿíˆÏähõýÿíhä(ö*öýÿí|±ä,ö*ö(öýÿí|±ä-öÿÿìæ)ö)ö)öùÿõ{öùÿõqõýÿíÔDä;öùÿõqõýÿí|±ä;öùÿõ}öùÿõ;õ(ö!öýÿíhä(öýÿíL´ä,ö*öýÿí|±ä)ö)öùÿõCõ;öùÿõ*öýÿí¬Zä=ö*öýÿí|±ä;öùÿõýÿí¬Zä=öýÿí|±ä;öùÿõpõýÿíÔDä;öùÿõýÿíÔDä^õÿÿìæ;öùÿõ}öùÿõ*öýÿí¬Zä=öýÿíL´ä;öùÿõ}öh&<¾°¯#âîä£#ä,Šîä̯#ìâø¯#l äè¯#ì ì$°#ˆÏä°#ì äæ@°#8rä°#ì|°#L´ä\°#ê âl°# ä äêh䘰#ì äîø°#âȼ#<¾pâ@±#üÀ»#ò±#´ ñ(±#ðSò>áî{öùÿõýÿí´ åýÿí¬Zä=öýÿíl ä+öýÿí8rä;öùÿõýÿíðSäýÿíÔDä=ö(öýÿí8rä+öÿÿìæ)ö*öÿÿìæ;öùÿõ>õ(öýÿíÔDälõýÿíˆÏä)öùÿõ{öùÿõýÿí´ åýÿí|±ä=öýÿíl ä+öýÿíÔDä;öùÿõ;õ(öýÿíÔDäjõýÿíˆÏähõ*öýÿí|±ä<ö*ö(öýÿí|±ä-öÿÿìæ)ö)öùÿõ{öùÿõqõýÿíÔDä;öùÿõqõýÿí|±ä;öùÿõ}öùÿõ;õ(ö!ö(öýÿíL´ä<ö*öýÿí|±ä)ö)öùÿõCõ;öùÿõ*öýÿí¬Zä=ö*öýÿí|±ä;öùÿõýÿí¬Zä=öýÿí|±ä;öùÿõpõýÿíÔDä;öùÿõýÿíÔDä^õÿÿìæ;öùÿõ}öùÿõ*öýÿí¬Zä=öýÿíL´ä;öùÿõ}öh&<¾ü»#â#äP{îä¼#ìâD¼#l ä4¼#ì ìp¼#ˆÏä`¼#ì äæŒ¼#8rä`¼#ðL´ä¨¼#ê ⸼# ä äî½#âÍ#`- âH½#üHÌ#ò0½#´ õÜN î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿí8rä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿí8rä<öÿÿìæ)öùÿõDõ;öùÿõqõýÿí8rä;öùÿõýÿí`œäýÿí|M ä=ö(öýÿí8rä-öÿÿìæ)ö/öÿÿìæ;öùÿõýÿí´ åýÿí|8 ä=öýÿíl ä+öýÿí|M ä;öùÿõýÿí´ åýÿí¬Zä=öýÿíl ä+öýÿí8rä;öùÿõ;õ(öýÿíhä(ö*öýÿí|8 ä,ö*öýÿí¬Zä)ö)öùÿõ{öùÿõýÿí>åýÿí`Tä(ö*öýÿí¬Zä)ö;öùÿõ?õùÿõ{öùÿõ*öýÿí¬Zä=ö*öýÿí|8 ä;öùÿõýÿí¬Zä=öýÿí|8 ä;öùÿõ;õ(öýÿí¬Zäjõýÿíl ä)öùÿõCõ;öùÿõqõýÿí|M ä;öùÿõýÿí|M ä_õÿÿìæ;öùÿõýÿí|8 ä=öýÿíl ä+öýÿí|M ä;öùÿõ}ö>õ(öýÿíhä(ö*öýÿí|8 ä,öýÿí`Tä)ö)ö;öùÿõ*öýÿí¬Zä=öýÿí`Tä;öùÿõ}öùÿõ}öh&`-„Ì#âîȼ#ä<|îä Ì#ìâÌÌ#l ä¼Ì#ì ìèÌ#R ä¼Ì#ðhäÍ#ì äîdÍ#âŒÜ#`-šâ|Í#üìÛ#ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿí8rä=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿí8rä<öÿÿìæ)öùÿõDõ;öùÿõqõýÿí8rä;öùÿõýÿí`œäýÿí|M ä=ö(öýÿí8rä-öÿÿìæ)ö/öÿÿìæ;öùÿõýÿí´ åýÿí|8 ä=öýÿíl ä+öýÿí|M ä;öùÿõýÿí´ åýÿí¬Zä=öýÿíl ä+öýÿí8rä;öùÿõ;õ(ö*öýÿí|8 ä<ö*öýÿí¬Zä)öùÿõ{öùÿõýÿí>åýÿí`Tä(ö*öýÿí¬Zä)ö;öùÿõ?õùÿõ{öùÿõ*öýÿí¬Zä=ö*öýÿí|8 ä;öùÿõýÿí¬Zä=öýÿí|8 ä;öùÿõ;õ(öýÿí¬Zäjõýÿíl ä)öùÿõCõ;öùÿõqõýÿí|M ä;öùÿõýÿí|M ä_õÿÿìæ;öùÿõýÿí|8 ä=öýÿíl ä+öýÿí|M ä;öùÿõ}ö>õ(ö*öýÿí|8 ä<öýÿí`Tä)ö;öùÿõ*öýÿí¬Zä=öýÿí`Tä;öùÿõ}öùÿõ}öh&`-(Ü#âîÍ#äXzîäDÜ#ìâpÜ#l ä`Ü#ì ðR ä`Ü#ôÜÜ#âé#|Œwâ Ý#ü4è#òôÜ#ü" ôÜN î{öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿí” ä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíä·ä)ö;öùÿõ;õ(öýÿí” äjõÿÿô)öùÿõDõ;öùÿõýÿí`œäýÿíxä=övõýÿ픀ävõýÿí|Ôä(öýÿíä·ä,öýÿíR ä)ö;öùÿõ;õ(öýÿíxäjõÿÿô)öùÿõDõ;öùÿõýÿí°{ä<öýÿí>å>öýÿíÖä(övõýÿ픀ävõýÿí˜ ä(öýÿí” ä,öýÿíxä)ö)ö;öùÿõýÿí€òä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿíhä,öýÿí” ä,öýÿíxä,öýÿíÖä.öýÿíHý ä(ö)ö,öýÿíÖä.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&|Œpè#âîŒÜ#ä¸zîäŒè#ìâ¸è#l ä¨è#ì ìÔè#ä·ä¨è#ìðè#R ä¨è#ðhä é#ì äîlé#â \ $€òaáÌé#üä $ò„é#ü" ðœé#ÜN î´é#ðSò´ áî{öùÿõ;õ(öýÿíl äjõýÿíä·ähõýÿíä·äjõýÿíR ä)öùÿõDõ;öùÿõ;õ(öýÿí” ä+öýÿíxäjõÿÿìæ)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿíä·ä,ö*öýÿíl ä)ö)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíä·ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿíðSäýÿíO ä=öXõ<öýÿíðSä>ö(öýÿí“ä-öýÿíT* ä)ö;öùÿõ;õ(öýÿí” älõýÿíxäiõýÿí” älõýÿíO ä)öùÿõvõýÿ픀ävõýÿíô¸ä(öýÿíT* ä,övõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä)ö,öýÿíä·ä,öýÿíR ä,öýÿíl ä,öýÿíhä)ö;öùÿõ<õ;õ(öýÿíxälõýÿíO ä)öùÿõýÿí¸0 ä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä,övõýÿ픀ävõýÿíTmä(öýÿíä·ä,öýÿíR ä,öýÿíT* ä)ö,öýÿíR ä,öýÿíhä)ö;öùÿõ<õùÿõ{öùÿõýÿíü" äýÿí ä,öýÿí  ä;öùÿõýÿíðSäýÿí ä,öýÿí€?ä;öùÿõ;õ(öýÿí” älõýÿíxä)öùÿõ{öùÿõýÿí€?ä=öýÿíxä/öÿÿìæ;öùÿõýÿí  ä=öýÿíä·ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿí  ä,öýÿí€?ä)ö;öùÿõýÿí ä=övõýÿ픀ävõýÿí˜ ä(öýÿíl ä,öýÿíä·ä,ö*öýÿí  ä,öýÿíhä)ö;öùÿõýÿí ä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿí ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí ä=öýÿí” ä/öÿÿìæ;öùÿõýÿí ä=öýÿíl ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿí ä,öýÿí ä)ö;öùÿõýÿí  ä=övõýÿ픀ävõýÿíÀWä(öýÿíä·ä,öýÿíR ä,ö*öýÿí ä,öýÿíhä)ö;öùÿõýÿí€?ä=övõýÿ픀ävõýÿí|Ôä(öýÿíä·ä,öýÿí  ä)ö;öùÿõ}öùÿõýÿíä·ä=öýÿí”¶ä(öýÿí ä,öýÿíä·ä,öýÿí  ä,öýÿí” ä-öýÿí ä,öýÿí€?ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõýÿí€òä(öýÿíl ä,öýÿí ä,öýÿíä·ä,öýÿíhä,öýÿí ä,öýÿí€?ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõýÿí€òä(öýÿíä·ä,öýÿí  ä,öýÿíR ä,öýÿíhä,öýÿí” ä-öýÿí ä,öýÿíxä-öýÿí€?ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõ}öùÿõ}öh&€ò $âîé#äyîä< $ìâh $l äX $ì ì„ $ä·äX $ì  $R äX $ìÌ $hä¼ $ì äæø $” äè $ì äæ $xäè $ì@ $T* ä0 $ì äê“ä0 $ô¬ $âx$|ŒuâÄ $ü¼$öü" ð{öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿí`œäýÿí`œä;öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿíÐAäýÿí>å;öùÿõýÿí`œäýÿí” ä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíä·ä)ö;öùÿõ;õ(öýÿí” äjõÿÿô)öùÿõDõ;öùÿõýÿí`œäýÿíxä=övõýÿ픀ävõýÿí|Ôä(öýÿíä·ä,öýÿíR ä)ö;öùÿõ;õ(öýÿíxäjõÿÿô)öùÿõDõ;öùÿõýÿí°{ä<öýÿí>å>öýÿíÖä(övõýÿ픀ävõýÿí˜ ä(öýÿí” ä,öýÿíxä)ö)ö;öùÿõýÿí€òä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿí” ä,öýÿíxä,öýÿíÖä.öýÿíHý ä(ö)ö,öýÿíÖä.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&|Œø$âî\ $ä¼yîä$ìâ@$l ä0$ì ì\$ä·ä0$ðR ä0$ôÈ$â :$€òRá$üÀ8$òà$ü" ðø$ðSò´ áî{öùÿõ;õ(öýÿíl äjõýÿíä·ähõýÿíä·äjõýÿíR ä)öùÿõDõ;öùÿõ;õ(öýÿí” ä+öýÿíxäjõÿÿìæ)öùÿõ{öùÿõ;õ(ö*öýÿíä·ä<ö*öýÿíl ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíä·ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿíðSäýÿíO ä=öXõ<öýÿíðSä>ö(öýÿí“ä-öýÿíT* ä)ö;öùÿõ;õ(öýÿí” älõýÿíxäiõýÿí” älõýÿíO ä)öùÿõvõýÿ픀ävõýÿíô¸ä(öýÿíT* ä,övõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä)ö,öýÿíä·ä,öýÿíR ä,öýÿíl ä)ö;öùÿõ<õ;õ(öýÿíxälõýÿíO ä)öùÿõýÿí¸0 ä(öýÿíl ä,öýÿíä·ä,öýÿíT* ä,övõýÿ픀ävõýÿíTmä(öýÿíä·ä,öýÿíR ä,öýÿíT* ä)ö,öýÿíR ä)ö;öùÿõ<õùÿõ{öùÿõýÿíü" äýÿí ä,öýÿí  ä;öùÿõýÿíðSäýÿí ä,öýÿí€?ä;öùÿõ;õ(öýÿí” ä<öýÿíxä)öùÿõ{öùÿõýÿí€?ä=öýÿíxä/öÿÿìæ;öùÿõýÿí  ä=öýÿíä·ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿí  ä,öýÿí€?ä)ö;öùÿõýÿí ä=övõýÿ픀ävõýÿí˜ ä(öýÿíl ä,öýÿíä·ä,ö*öýÿí  ä)ö;öùÿõýÿí ä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿí ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí ä=öýÿí” ä/öÿÿìæ;öùÿõýÿí ä=öýÿíl ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿí ä,öýÿí ä)ö;öùÿõýÿí  ä=övõýÿ픀ävõýÿíÀWä(öýÿíä·ä,öýÿíR ä,ö*öýÿí ä)ö;öùÿõýÿí€?ä=övõýÿ픀ävõýÿí|Ôä(öýÿíä·ä,öýÿí  ä)ö;öùÿõ}öùÿõýÿíä·ä=öýÿí”¶ä(öýÿí ä,öýÿíä·ä,öýÿí  ä,öýÿí” ä-öýÿí ä,öýÿí€?ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõýÿí€òä(öýÿíl ä,öýÿí ä,öýÿíä·ä,öýÿí ä,öýÿí€?ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõýÿí€òä(öýÿíä·ä,öýÿí  ä,öýÿíR ä,öýÿí” ä-öýÿí ä,öýÿíxä-öýÿí€?ä,öýÿíT* ä,öýÿí“ä)ö;öùÿõ}öùÿõ}öh&€òü8$âîx$ä@xîä9$ìâD9$l ä49$ì ì`9$ä·ä49$ì|9$R ä49$ì¨9$” ä˜9$ì äæÄ9$xä˜9$ìð9$T* äà9$ì äê“äà9$ô\:$â$J$¸0 —â¼:$üäH$òt:$Þ ðŒ:$hß î¤:$,ß òÜN î{öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõqõýÿí…ä;öùÿõqõýÿíô„ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿíô„ä,ö*öýÿí…ä)ö)öùÿõ{öùÿõ*öqõýÿíˆõä=ö*öýÿí…ä;öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿí`=ä,öpõýÿíô„ä,öýÿíˆõä)ö;öùÿõqõýÿí…ä;öùÿõ}ö<õùÿõ{öùÿõ*öqõýÿíˆõä=ö*öýÿíô„ä;öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿíô=ä,öpõýÿí…ä,öýÿíˆõä)ö;öùÿõqõýÿíô„ä;öùÿõ}öùÿõ}öùÿõ}öh&¸0 I$âî :$äˆxîäLI$äövõýÿíÐAäýÿíÐAä;öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõqõýÿí…ä;öùÿõqõýÿíô„ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öXõ<öýÿíÐAä>ö(ö*öýÿíô„ä)ö<öXõ<öýÿíÐAä>ö(ö*öýÿí…ä)ö)öùÿõ{öùÿõ*öqõýÿíˆõä=ö*öýÿí…ä;öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿí`=ä,öpõýÿíô„ä,öýÿíˆõä)ö;öùÿõqõýÿí…ä;öùÿõ}ö<õùÿõ{öùÿõ*öqõýÿíˆõä=ö*öýÿíô„ä;öùÿõ;õ(öýÿí`=äjõýÿíô„ä)öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿíô=ä,öpõýÿí…ä,öýÿíˆõä)ö;öùÿõqõýÿíô„ä;öùÿõ}öùÿõ}öùÿõ}ö h&¸0 á[$âî$J$äLwîä,[$ä[$äâ äæX[$ô=äH[$ì ìt[$…äH[$ì [$`=ä[$ì äæ¼[$ô„ä[$ðˆõä[$ô(\$â@g$ô¸eâˆ\$ýf$ò@\$< ñX\$¼ áîp\$ü òÜN î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíˆõä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿí`=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõ}öh&ô¸övõýÿíÐAäýÿíÐAä;öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíˆõä)öùÿõ{öùÿõ;õ(öXõ<öýÿíÐAä>ö(ö*öýÿí`=ä)ö<öXõ<öýÿíÐAä>ö(ö*öýÿíô=ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿí`=ä;öùÿõpõýÿí`=ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíô=ä;öùÿõpõýÿíô=ä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíô=ä,öýÿí…ä,öýÿíˆõä)ö;öùÿõ}öh&ô¸ls$âî@g$äpkîä˜s$äˆs$äâ äæÄs$ô=ä´s$ì ìàs$…ä´s$ì t$`=äüs$ì äæ(t$ô„äüs$ðˆõäˆs$ô”t$âÔy$àô*âÜt$üÌx$ò¬t$œö ðÄt$>áòÜN î{öùÿõýÿíœö äýÿíP&å=övõýÿ픀ävõýÿíÀWä(öýÿíl ä,öýÿíR ä,öýÿíxQä,öýÿíhä)ö;öùÿõDõXõ<öõ>ö(öýÿíP&åkõýÿíR äiõ!öýÿíhä(öýÿíxQä,ö*öýÿíP&å)ö)ö;öùÿõ}öh&àôy$îDt$äðkîä$y$ìâPy$l ä@y$ì ìly$R ä@y$ì¨y$xQäˆy$ê â˜y$ ä äêhäÄy$ì äî$z$âØ~$àô'âTz$üü}$òáî{öùÿõýÿíœö äýÿíP&å=övõýÿ픀ävõýÿíÀWä(öýÿíl ä,öýÿíR ä,öýÿíxQä)ö;öùÿõDõXõ<öõ>ö(öýÿíP&åkõýÿíR äiõ!ö(öýÿíxQä<ö*öýÿíP&å)ö)ö;öùÿõ}öh&àô8~$îÔy$äáòÜN î{öùÿõõýÿíøó ä<öýÿíœö ä,öýÿíœö ä>öýÿípîå;öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ>õ(öýÿíˆÏä>öÿÿô)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõýÿí`œäýÿíxä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿíxä)ö;öùÿõ;õ(öýÿíhä(ö*öýÿíP&å,öýÿíxQä)ö)öùÿõ{öùÿõýÿíl ä=öpõýÿíP&å;öùÿõýÿíˆÏäbõýÿíxä+öÿÿìæ;öùÿõ}öùÿõ<õ;õ(öýÿíhä(öýÿíxQä,ö*öýÿíP&å)ö)öùÿõ{öùÿõýÿíˆÏä=öýÿíxä;öùÿõýÿíR ä=öýÿíP&å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíœö äýÿí'å=öýÿíP&å;öùÿõDõýÿípîå(övõýÿ픀ävõýÿíÀWä(öýÿíl ä,öýÿíP&å,öýÿíxQä,öýÿíhä)ö,öùÿõvõýÿ픀ävõýÿí˜ ä(öpõýÿí'å,öýÿíR ä,öýÿíxQä,öýÿíhä)ö)ö;öùÿõ}öùÿõ}öùÿõDõýÿípîå(öýÿíl ä,öýÿíl ä)ö;öùÿõ}öh&õì$âîØ~$ä¸jîäP‘$ä‘$äâ â ôs‘$<‘$ä,‘$è ðâ,‘$èl‘$l ä,‘$숑$R ä,‘$ìÄ‘$xQ䤑$ê â´‘$ ä äêhäà‘$ì äî@’$â¼£$õ­âp’$ü¨¢$òX’$œö ô>áî{öùÿõõýÿíøó ä<öýÿíœö ä,öýÿíœö ä>öýÿípîå;öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ>õ(öýÿíˆÏä>öÿÿô)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõýÿí`œäýÿíxä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿíxä)ö;öùÿõ;õ(ö*öýÿíP&å<öýÿíxQä)öùÿõ{öùÿõýÿíl ä=öpõýÿíP&å;öùÿõýÿíˆÏäbõýÿíxä+öÿÿìæ;öùÿõ}öùÿõ<õ;õ(öýÿíxQä<ö*öýÿíP&å)öùÿõ{öùÿõýÿíˆÏä=öýÿíxä;öùÿõýÿíR ä=öýÿíP&å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíœö äýÿí'å=öýÿíP&å;öùÿõDõýÿípîå(övõýÿ픀ävõýÿíÀWä(öýÿíl ä,öýÿíP&å,öýÿíxQä)ö,övõýÿ픀ävõýÿí˜ ä(öpõýÿí'å,öýÿíR ä,öýÿíxQä)ö)ö;öùÿõ}öùÿõ}öùÿõDõýÿípîå(öýÿíl ä,öýÿíl ä)ö;öùÿõ}öh&õä¢$âîð‘$äxiîäH£$å£$äâ â ôs£$4£$ä$£$è ðâ$£$èd£$l ä$£$쀣$R ä$£$ðxQ䜣$ê ⬣$ ä äî ¤$â¯$˜ hâT¤$ü®$ò$¤$œö ð<¤$>áòÜN î{öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ>õ(öýÿíˆÏä>öÿÿô)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõýÿí`œäýÿíxä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿíxä)ö;öùÿõ;õ(ö!öýÿíhä(öýÿíxQä,ö*öýÿíP&å)ö)öùÿõ{öùÿõýÿíl ä=öpõýÿíP&å;öùÿõýÿíˆÏäbõýÿíxä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿíˆÏä=öýÿíxä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öh&˜ P®$âî¼£$ä¼iîä|®$äl®$äâ 옮$l äl®$ì´®$R äl®$ìð®$xQäЮ$ê âà®$ ä äêhä ¯$ì äîl¯$â º$˜ g✯$üD¹$ò„¯$œö ô>áî{öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ>õ(öýÿíˆÏä>öÿÿô)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõýÿí`œäýÿíxä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿíxä)ö;öùÿõ;õ(ö!ö(öýÿíxQä<ö*öýÿíP&å)ö)öùÿõ{öùÿõýÿíl ä=öpõýÿíP&å;öùÿõýÿíˆÏäbõýÿíxä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿíˆÏä=öýÿíxä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öh&˜ €¹$âî¯$ä¸hî䬹$䜹$äâ ìȹ$l 䜹$ìä¹$R 䜹$ðxQåº$ê âº$ ä äîpº$âhÅ$ÀWg⸺$ü`Ä$òˆº$œö ð º$>áòÜN î{öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ>õ(öýÿíˆÏä>öÿÿô)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõýÿí`œäýÿíxä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿíxä)ö;öùÿõ;õ(öýÿíhä(ö*öýÿíP&å,öýÿíxQä)ö)öùÿõ{öùÿõýÿíl ä=öpõýÿíP&å;öùÿõýÿíˆÏäbõýÿíxä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿíˆÏä=öýÿíxä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öh&ÀWœÄ$âî º$äPiîäÈÄ$ä¸Ä$äâ ìäÄ$l ä¸Ä$íÅ$R ä¸Ä$ì<Å$xQäÅ$ê â,Å$ ä äêhäXÅ$ì äî¸Å$â$Ð$ÀWdâèÅ$üHÏ$òÐÅ$œö ô>áî{öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ>õ(öýÿíˆÏä>öÿÿô)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõýÿí`œäýÿíxä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿíxä)ö;öùÿõ;õ(ö*öýÿíP&å<öýÿíxQä)öùÿõ{öùÿõýÿíl ä=öpõýÿíP&å;öùÿõýÿíˆÏäbõýÿíxä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿíˆÏä=öýÿíxä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öh&ÀW„Ï$âîhÅ$äœgîä°Ï$ä Ï$äâ ìÌÏ$l ä Ï$ìèÏ$R ä Ï$ðxQäÐ$ê âÐ$ ä äîtÐ$âXã$Àç¿â¤Ð$üŒâ$òŒÐ$ü" ô,U î{öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿíÐAäýÿí>å;öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ=õ(öýÿíˆÏä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿíR ä;öùÿõ9õÿÿìæ:öùÿõDõýÿí´Â ä(ö*öýÿíl ä)ö?öýÿíR ä:öýÿíl ä;öùÿõ9õÿÿìæ:öùÿõ;õ(öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõ{öùÿõ;õ(öýÿí´Â ä(ö*öpõýÿíl ä)ö)öùÿõDõýÿíR ä;öùÿõDõýÿíl ä;öùÿõ}öùÿõ;õ(öýÿí´Â ä(ö*öqõýÿíR ä)ö)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõýÿíR ä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öùÿõýÿí°{ä<öýÿí>å>öýÿíÖä(öýÿíˆÏä)ö;öùÿõDõýÿíHàä<öýÿíü" ä,öýÿí,U ä,öýÿí`œä,ö õýÿí°{ä<öýÿí>å>övõýÿíLä>öùÿõ(öýÿíl ä,öýÿíR ä,öýÿí´Â ä,öýÿíˆÏä,öýÿíÖä.öýÿíHý ä(ö)ö,öýÿíÖä.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&ÀçÈâ$âî$Ð$ähhîäôâ$ääâ$äâ ìã$l ääâ$ì,ã$R ääâ$ð´Â äHã$ì äî¨ã$â ð%Hàçáä$ü°%òÀã$ü" ðØã$,U îðã$ðSò´ áî{öùÿõùÿõ=õ(öýÿíˆÏä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿíR ä;öùÿõ9õÿÿìæ:öùÿõDõýÿí´Â ä(ö*öýÿíl ä)ö?öýÿíR ä:öýÿíl ä;öùÿõ9õÿÿìæ:öùÿõ;õ(öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõ{öùÿõ;õ(öýÿí´Â ä(ö*öpõýÿíl ä)ö)öùÿõDõýÿíR ä;öùÿõDõýÿíl ä;öùÿõ}öùÿõ;õ(öýÿí´Â ä(ö*öqõýÿíR ä)ö)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõýÿíR ä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öùÿõùÿõ;õ(öýÿíˆÏälõýÿí“ä-öýÿíÐN ä)öùÿõ{öùÿõùÿõ>õ(öýÿíl äkõýÿíR äiõýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõpõýÿíl ä;öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíR ä;öùÿõùÿõýÿíü" äýÿíP&å=öýÿíl ä;öùÿõùÿõýÿíP&å=övõýÿ픀ävõýÿíƒå<öýÿíü" ä,ö õýÿíT¾ävõýÿíÿå<öýÿí,U ä>övõýÿí œ ä>öùÿõ(öpõýÿíP&å,öýÿíR ä,öýÿí´Â ä)ö;öùÿõ;õ(öýÿíP&åjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõùÿõýÿí´ åýÿí'å=övõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíP&å,öýÿíÐN ä)ö;öùÿõ*öýÿíl ä=ö*öýÿíP&å;öùÿõ@õ(öpõýÿíl ä,öpõýÿíP&å;öýÿíP&åkõýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõ;õ(öýÿí´Â ä(ö*öýÿíP&å)ö)öùÿõ{öùÿõ*öýÿíl ä=ö*öýÿíP&å;öùÿõpõýÿíl ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿí'å=ö*öýÿíP&å;öùÿõpõýÿí'å;öùÿõ}öùÿõ}öùÿõùÿõvõýÿ픀ävõýÿíTmä(öýÿíÐN ä,öýÿí'å,öýÿíl ä)ö;öùÿõDõýÿíl ä;öùÿõ}öùÿõùÿõýÿíü" äýÿíœ ä=öýÿíl ä;öùÿõýÿíðSäýÿíèëä=öýÿíˆÏä/öÿÿìæ;öùÿõvõýÿ픀ävõýÿíoä(öýÿíœ ä,öýÿíèëä)ö;öùÿõýÿíü" äýÿíÄ ä=öùÿõýÿíHàä<öýÿíü" ä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí,U ä>övõýÿí œ ä,öùÿõýÿíðSä,öýÿí´ å>ö(öýÿíl ä,öýÿíœ ä,öýÿí´Â ä,öýÿíèëä,öýÿíÐN ä,öýÿí“ä)ö;öùÿõýÿíü" äýÿíˆä=öùÿõýÿíHàä<öýÿíü" ä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí,U ä>övõýÿí œ ä,öùÿõýÿíðSä,öýÿí´ å>ö(öýÿíœ ä,öýÿíR ä,öýÿí´Â ä,öýÿíˆÏä-öýÿíèëä,öýÿíÐN ä,öýÿí“ä)ö;öùÿõýÿíèëä=övõýÿ픀ävõýÿí|Ôä(öýÿíœ ä,öýÿíˆä)ö;öùÿõ;õ(öýÿíèëäjõÿÿô)öùÿõDõýÿíÄ ä;öùÿõýÿíˆÏä=övõýÿ픀ävõýÿí|Ôä(öýÿíÄ ä,öýÿíœ ä)ö;öùÿõ;õ(öýÿíˆÏä>öÿÿô)öùÿõýÿíÄ ä=öýÿí”¶ä(öýÿíÄ ä,öýÿíœ ä,öýÿíˆä,öýÿíˆÏä,öýÿíèëä,öýÿíÐN ä,öýÿí“ä)ö;öùÿõ<õùÿõvõýÿ픀ävõýÿíoä(öýÿíÄ ä,öýÿíèëä)ö;öùÿõDõýÿíÄ ä;öùÿõ}öh&Hàì%âîXã$äœ[îä%ä%äâ ì4%l ä%ìP%R ä%ì|%´Â äl%ì 俍%ˆÏä˜%ì äæÔ%ÐN äÄ%ì äê“äÄ%ô@%â\(%  Öâp%ü€'%òX%ü" ô,U î{öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿíL äýÿídJä;öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõõýÿí°Tä=öýÿí´Â ä(ö*öýÿíl ä)ö;öùÿõõýÿíêä=ö!öýÿí´Â ä(ö*öqõýÿíR ä)ö;öùÿõ;õ(öýÿí°Täiõýÿíêä)öùÿõùÿõDõýÿíl¿ä<öýÿíü" ä,ö!õýÿí,U ä&ö>ö(öpõýÿíl ä,öýÿíR ä,öýÿí´Â ä,öýÿídJä(ö)ö)ö;öùÿõ;õ(öýÿíêä)öùÿõ{öùÿõùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõ>õ(öýÿíl äkõqõýÿíR äiõ!öýÿí´Â ä(ö*öýÿíR ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõ}öùÿõ<õ;õ(öýÿí°Tä)öùÿõ{öùÿõùÿõpõýÿíR ä;öùÿõpõýÿíl ä;öùÿõ>õ(öýÿíl äkõýÿíR äiõýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõpõýÿíl ä;öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõqõýÿíR ä;öùÿõ}öùÿõùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõDõýÿíl¿ä<öýÿíü" ä,ö!õýÿí,U ä&ö>ö(öpõýÿíl ä,öýÿíR ä,öýÿí´Â ä,öýÿídJä(ö)ö)ö;öùÿõ}öh&  ¼'%âîð%ä \îäè'%äØ'%äâ ì(%l äØ'%ì (%R äØ'%ð´Â ä<(%ê âL(% ä äî¬(%âh3%@¾ hâÜ(%üœ2%òÄ(%ü" ô,U î{öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõCõ;öùÿõpõýÿíl ä;öùÿõ}öùÿõqõýÿíR ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõ;õ(öýÿí´Â ä(ö*öýÿíR ä)ö)öùÿõCõ;öùÿõqõýÿíR ä;öùÿõ}öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõpõýÿíl ä;öùÿõ}öùÿõ}öh&@¾ Ø2%âî\(%ä„Zîä3%äô2%äâ ì 3%l äô2%ì<3%R äô2%ð´Â äX3%ì äî¸3%â0;%l¿Dâè3%üH:%òÐ3%´ õ,U î{öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõpõýÿíl ä;öùÿõ>õ(ö!öýÿí´Â ä(ö*öqõýÿíR ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿíl ämõýÿíR ä)öùÿõCõ;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõpõýÿíl ä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öh&l¿„:%îh3%ä[îä°:%ä :%äâ ìÌ:%l ä :%ìè:%R ä :%ì;%´Â ä;%ì äêˆ$ääDô€;%âD%l¿Pâ°;%ü0C%ò˜;%ü" ô,U î{öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõpõýÿíl ä;öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõCõ;öùÿõ>õ(ö!öýÿí´Â ä(ö*öqõýÿíR ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿíl äjõpõýÿíR ä)öùÿõCõ;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öqõýÿíR ä)ö;öùÿõpõýÿíl ä;öùÿõ}öùÿõDõýÿíl ä;öùÿõ}öh&l¿lC%î0;%äTYîä˜C%äˆC%äâ ì´C%l äˆC%ìÐC%R äˆC%ìüC%´Â äìC%ì äêˆ$ä0FôhD%âŒK%HðAâ˜D%ü°J%ò€D%´ õ¬6î{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿí¸#å=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿí¸#å>öÿÿìæ)öùÿõ{öùÿõ@õ(öqõýÿíR ä;öýÿíl ä<öýÿíR ä;öpõýÿíl ä,öqõýÿí¸#å)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíl ä+öýÿíÐ ä(öýÿí¸#å)ö)ö;öùÿõ}öùÿõ}öh&HðìJ%îD%äàYîäK%ìâ4K%l ä$K%ì ìPK%R ä$K%ðÐ älK%ì â|K% ä äîÜK%âtT%HðTâôK%üÔS%ö´ ñ{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿí¸#å=öýÿíR ä-öýÿíl ä;öùÿõ;õ(öýÿí¸#å>öÿÿìæ)öùÿõ{öùÿõ@õ(öqõýÿíR ä;öýÿíl ä<öýÿíR ä;öpõýÿíl ä,öqõýÿí¸#å)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíl äùÿõ+öXõ<öýÿí`œä>ö(öýÿí(yä<öZõ>ö(ö)ö(öXõ<öõ õ>ö(öýÿí¸#å)ö)ö)ö)ö;öùÿõ}öùÿõ}öh&HðT%îŒK%ä Xîä,T%ìâXT%l äHT%ì ðR äHT%ôÄT%âZ%X8âÜT%üZ%öl" ãë{öùÿõõ õýÿí*ä=öýÿíˆßä<öýÿíl" ä>ö(öýÿíØ. ä)ö;öùÿõõ õýÿíPä=öýÿí*ä*öýÿíØ. ä;öùÿõõ õýÿíÈõ ä;öùÿõ?õùÿõýÿíÈõ ä=öýÿíx ä<öýÿíl" ä>ö(ö)ö;öùÿõ>õ(öýÿíÈõ ämõýÿíPä)ö;öùÿõDõýÿíÈõ ä/öýÿí*ä;öùÿõ}öh&XXZ%îtT%ä YîätZ%ìæØ. üàZ%âÄ`%ˆß âøZ%ü0\%¤\%òl" ãë{öùÿõDõ(öÿÿ ìænõýÿíl" ä)ö/öýÿíØ. ä;öùÿõ}öh&ˆßl\%îZ%ä$Kîäˆ\%ìæØ. ôZ%äÀ\%áê]%çÔ\%äâ4é þh&ˆß<]%ît]%è¤\%êäX]%ì æØ. ôè]%ü]%ççäçæáááxýâØ. èêá @áø)ä\^%âáø)ä _%äáø)ìáø)ä¼_%äéˆ^%à^%øé´^%ü:áèäêý4êþ é8_%d_%ø4êÿÿÿÿûé_%ü:áèäêý éè_%`%ø4í€ûé@`%˜`%øél`%ü:áèäêý4êÿæa%â´d%üâDa%üÌc%ò,a%œö ôü î{öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíä·ä,övõýÿ픀ävõýÿíTmä(öýÿíä·ä,öýÿíR ä,öýÿíˆõä)ö)ö;öùÿõ}öh&üd%îÄ`%äˆKîä4d%ä$d%äâ äæ`d%l äPd%ì ì|d%ä·äPd%ì˜d%R äPd%ðˆõä$d%ôe%âÈi%àƒ*âe%ü i%öœö ð{öùÿõ;õ(öýÿíl äjõýÿíä·ähõýÿíä·äjõýÿíR ä)öùÿõDõ;öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿíL äýÿídJä;öùÿõýÿí”¶ä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿídJä(ö)ö)ö;öùÿõ}öh&àƒHi%î´d%äÄIîädi%ìâi%l ä€i%ì ì¬i%ä·ä€i%ðR ä€i%ôj%â t%”¶aâ0j%üHs%öü" ð{öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿíÐAäýÿí>å;öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿí`œäýÿí`œä;öùÿõýÿí`œäýÿí” ä=övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíä·ä)ö;öùÿõýÿí`œäýÿíxä=övõýÿ픀ävõýÿí|Ôä(öýÿíä·ä,öýÿíR ä)ö;öùÿõýÿí°{ä<öýÿí>å>öýÿíÖä(övõýÿ픀ävõýÿí˜ ä(öýÿí” ä,öýÿíxä)ö)ö;öùÿõýÿí”¶ä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿí” ä,öýÿíxä,öýÿíÖä.öýÿíHý ä(ö)ö,öýÿíÖä.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&”¶„s%âîÈi%ä¤Jîä s%ìâÌs%l ä¼s%ì ìès%ä·ä¼s%ìt%R ä¼s%ðˆ$ä0Fôpt%⤄%”¶œâ¸t%üXƒ%òˆt%ü" ð t%ðSò´ áî{öùÿõýÿíðSäýÿíàÆ ä=öXõ<öýÿíðSä>ö(öýÿí“ä-öýÿíÐN ä)ö;öùÿõ;õ(öýÿí” älõýÿíxäiõýÿí” älõýÿíàÆ ä)öùÿõ{öùÿõýÿí“ä=övõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíä·ä,öýÿíÐN ä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíä·ä,öýÿíR ä,öýÿíl ä)ö;öùÿõDõvõýÿ픀ävõýÿ팽ä(öýÿíÐN ä,öýÿí“ä,öýÿíR ä)ö;öùÿõ}öùÿõ;õ(öýÿíxälõýÿíàÆ ä)öùÿõ{öùÿõýÿí“ä=övõýÿ픀ävõýÿíTmä(öýÿíä·ä,öýÿíR ä,öýÿíÐN ä)ö;öùÿõvõýÿ픀ävõýÿ팽ä(öýÿíl ä,öýÿíä·ä,öýÿíR ä)ö;öùÿõDõvõýÿ픀ävõýÿíTmä(öýÿíÐN ä,öýÿí“ä,öýÿíl ä)ö;öùÿõ}öùÿõýÿí”¶ä(öýÿíl ä,öýÿíä·ä,öýÿíR ä,öýÿí¼½ä(ö)ö)ö;öùÿõvõýÿ픀ävõýÿíoä(öýÿíl ä,öýÿíxä)ö;öùÿõDõýÿíl ä;öùÿõ}öh&”¶”ƒ%âî t%ä\HîäÀƒ%ä°ƒ%äâ ì܃%l ä°ƒ%ìøƒ%ä·ä°ƒ%ì„%R ä°ƒ%ì@„%” ä0„%ì äæ\„%xä0„%숄%ÐN äx„%ì äê“äx„%ôô„%⌌%”¶Gâ …%ü´‹%öœö ð{öùÿõýÿíœö äýÿíP&å=öýÿíä·ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíP&å)ö;öùÿõ;õ(öpõýÿíl äjõýÿíä·ä)öùÿõ{öùÿõ;õ(öpõýÿíP&åjõýÿíR ä)öùÿõCõ;öùÿõýÿíä·ä=öýÿíP&å;öùÿõ}öùÿõ<õ;õ(öpõýÿíP&åjõýÿíR ä)öùÿõýÿíP&å=öýÿíä·ä;öùÿõ}öùÿõ}öh&”¶ð‹%â%ä(Iîä Œ%ìâ8Œ%l ä(Œ%ì ìTŒ%ä·ä(Œ%ìpŒ%R ä(Œ%ðˆ$ä|GôÜŒ%âH% Äâ %ü|%òôŒ%ü" ôü î{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíˆõä)öùÿõ*öýÿíˆõä=ö*öqõýÿíR ä;öùÿõDõýÿíˆõä;öùÿõ}öh& ĸ%%ä,;îää%äÔ%äâ äæ%l å%ì ì,%R å%ðˆõäÔ%ô˜%âÀ“%dh â°%ü “%öü" ð{öùÿõõ õýÿíà?ä<öýÿíü" ä>övõýÿíL äýÿídJä;öùÿõýÿíŒä(öýÿíl ä,öýÿíR ä,öýÿídJä(ö)ö)ö;öùÿõ}öh&dh \“%îH%äÈ;îäx“%ì⤓%l 䔓%ì ðR 䔓%ô”%âü—%Œ!â(”%ü@—%ö´ ñ{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ@õ(ö;öýÿíl ä<öqõýÿíR ä;öpõýÿíl ä)öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõ}öh&Œ|—%îÀ“%äô9î䘗%ìâÄ—%l ä´—%ì ìà—%R ä´—%ðˆ$ääDôL˜%â(%Œ+âd˜%ülœ%öü" ð{öùÿõ>õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõqõýÿíR ä;öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõCõ;öùÿõvõýÿ픀ävõýÿí`ä(öýÿíl ä,öýÿíR ä)ö;öùÿõpõýÿíl ä;öùÿõ}öùÿõ}öh&Œ¨œ%îü—%ä|:îäÄœ%ìâðœ%l äàœ%ì ì %R äàœ%ðˆ$ä0Fôx%âH¡%Ü !â%ü¨ %öœö ð{öùÿõõ õýÿíà?ä<öýÿíœö ä>övõýÿíÐAäýÿíÐAä;öùÿõDõvõýÿ픀ävõýÿíÜ ä(öýÿíl ä,öýÿíR ä,öýÿíØË ä<öýÿíÐAä>ö(ö)ö)ö;öùÿõ}öh&Ü ä %î(%å9îä¡%å¡%äâ ì,¡%l å¡%ðR å¡%ô˜¡%ℬ%Ü jâÈ¡%ü¸«%ò°¡%œö ô²î{öùÿõõ õýÿíT¾ävõýÿíÿå<öýÿí²ä>övõýÿí œ äýÿíl ä;öùÿõýÿíl ä=övõýÿ픀ävõýÿí¿ ä<öýÿíœö ä,öýÿíl ä>ö(öýÿíl ä,öýÿíR ä,öýÿí´Â ä)ö;öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõùÿõýÿíœö äýÿí †ä=öýÿíl ä;öùÿõpõýÿí †ä;öùÿõpõýÿí †ä;öùÿõ>õ(öýÿí †äkõýÿíR äiõýÿí´Â ä(ö*öýÿíl ä,ö*öýÿí †ä)ö)öùÿõpõýÿí †ä;öùÿõDõvõýÿ픀ävõýÿíDo ä<öýÿíœö ä,öýÿíœö ä,öýÿí²ä>ö(öýÿí †ä,öýÿíR ä,öpõýÿíl ä,öýÿí´Â ä)ö;öùÿõ}öh&Ü ô«%âîH¡%ä°9îä ¬%ä¬%äâ ì<¬%l ä¬%ìX¬%R ä¬%ð´Â ät¬%ì äîÔ¬%⤱%Do &â­%ü¬°%òì¬%<¬ ð­%ü ò²î{öùÿõõ õýÿíà?ä<öýÿíü ä>övõýÿíL äýÿídJä;öùÿõDõýÿí<.ä<öýÿí<¬ ä,öýÿíü ä,öýÿí²ä>ö(öýÿíl ä,öýÿíR ä,öýÿíˆõä,öýÿí´Â ä,öýÿídJä(ö)ö)ö;öùÿõ}öh&Do è°%%ä08îä±%ä±%äâ äæ@±%l ä0±%ì ì\±%R ä0±%ìx±%ˆõä±%ð´Â ä”±%ì äîô±%â8¹%<.?â<²%ü$¸%ò ²%<¬ ð$²%œö ò²î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿíˆõä,ö*öýÿíl ä)ö)öùÿõ*öpõýÿíˆõä=ö*öýÿíl ä;öùÿõpõýÿíˆõä;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&<.`¸%â%ä¤8î䌸%ä|¸%äâ 俏¸%l 䨸%ì ìÔ¸%R 䨸%ìð¸%ˆõä|¸%ì¹%´Â ä ¹%ì äêˆ$ä|Gôˆ¹%ât¾%<.&âй%ü`½%ò ¹%<¬ ð¸¹%ü ò²î{öùÿõõ õýÿíà?ä<öýÿí<¬ ä>övõýÿíL äýÿídJä;öùÿõDõýÿíä<öýÿí<¬ ä,öýÿíü ä,öýÿí²ä>ö(öýÿíl ä,öýÿíR ä,öýÿíˆõä,öýÿí´Â ä,öýÿídJä(ö)ö)ö;öùÿõ}öh&<.œ½%î8¹%ä 7îäȽ%丽%äâ äæô½%l ää½%ì ì¾%R ää½%ì,¾%ˆõ丽%ìX¾%´Â äH¾%ì äêˆ$ä4Kôľ%âÐÇ%Râ ¿%ü¼Æ%òܾ%œö ðô¾%ü ò²î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿíœö äýÿí`Tä=öýÿíl ä;öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ{öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿí`Tä,ö*öýÿíl ä)ö)öùÿõ{öùÿõýÿí`Tä=öýÿíl ä;öùÿõ*öpõýÿíˆõä=ö*öýÿíl ä;öùÿõ}öùÿõ}öùÿõpõýÿíˆõä;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&øÆ%âît¾%äÌ7îä$Ç%äÇ%äâ äæPÇ%l ä@Ç%ì ìlÇ%R ä@Ç%ìˆÇ%ˆõäÇ%ì´Ç%´Â ä¤Ç%ì äêˆ$ä|Gô È%â¼Ñ%XâhÈ%ü¨Ð%ò8È%<¬ ðPÈ%ü ò²î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõ õýÿíà?ä<öýÿí<¬ ä>övõýÿíÐAäýÿí`Tä(ö*öýÿíl ä)ö;öùÿõ*öýÿíˆõä=öýÿí`Tä;öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ{öùÿõ;õ(ö!öýÿí´Â ä(öýÿí`Tä,ö*öýÿíl ä)ö)öùÿõ{öùÿõýÿí`Tä=ö*öýÿíl ä;öùÿõ*öpõýÿíˆõä=öýÿí`Tä;öùÿõ}öùÿõ}öùÿõpõýÿíˆõä;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&äÐ%âîÐÇ%ä@+îäÑ%åÑ%äâ äæ<Ñ%l ä,Ñ%ì ìXÑ%R ä,Ñ%ìtÑ%ˆõåÑ%ì Ñ%´Â äÑ%ì äêˆ$äÈHô Ò%âÀÕ%Do â<Ò%üôÔ%ò$Ò%<¬ ôü î{öùÿõõ õýÿíà?ä<öýÿíü ä>övõýÿíL äýÿídJä;öùÿõDõýÿí<.ä(öýÿíl ä,öýÿíR ä,öýÿíˆõä,öýÿídJä(ö)ö)ö;öùÿõ}öh&Do 0Õ%î¼Ñ%ä¬+îä\Õ%äLÕ%äâ äæˆÕ%l äxÕ%ì ì¤Õ%R äxÕ%ðˆõäLÕ%ôÖ%âøÜ%<.>â@Ö%üÜ%ò(Ö%<¬ ôœö î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö!ö(ö*öýÿíˆõäjõ*öýÿíl ä)ö)öùÿõ*öpõýÿíˆõä=ö*öýÿíl ä;öùÿõpõýÿíˆõä;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&<.LÜ%âîÀÕ%äÈ)îäxÜ%ähÜ%äâ 俤Ü%l ä”Ü%ì ìÀÜ%R ä”Ü%ìÜÜ%ˆõähÜ%ðˆ$ä|GôHÝ%âá%<."âxÝ%ü¨à%ò`Ý%<¬ ôü î{öùÿõõ õýÿíà?ä<öýÿí<¬ ä>övõýÿíL äýÿídJä;öùÿõDõýÿíä<öýÿí<¬ ä,öýÿíü ä>ö(öýÿíl ä,öýÿíR ä,öýÿíˆõä,öýÿídJä(ö)ö)ö;öùÿõ}öh&<.äà%îøÜ%äX*îäá%åá%äâ äæ<á%l ä,á%ì ìXá%R ä,á%ìtá%ˆõåá%ðˆ$ä4Kôàá%âê%Qââ%ü¨é%òøá%œö ôü î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿíœö äýÿí`Tä=öýÿíl ä;öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ{öùÿõ;õ(ö!ö(ö*öýÿí`Täjõ*öýÿíl ä)ö)öùÿõ{öùÿõýÿí`Tä=öýÿíl ä;öùÿõ*öpõýÿíˆõä=ö*öýÿíl ä;öùÿõ}öùÿõ}öùÿõpõýÿíˆõä;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&äé%âîá%ä4(îäê%åê%äâ äæ<ê%l ä,ê%ì ìXê%R ä,ê%ìtê%ˆõåê%ðˆ$ä|Gôàê%â ô%Wâë%ü8ó%òøê%<¬ ôü î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõ õýÿíà?ä<öýÿí<¬ ä>övõýÿíÐAäýÿí`Tä(ö*öýÿíl ä)ö;öùÿõ*öýÿíˆõä=öýÿí`Tä;öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ{öùÿõ;õ(ö!ö(öýÿí`Täjõ*öýÿíl ä)ö)öùÿõ{öùÿõýÿí`Tä=ö*öýÿíl ä;öùÿõ*öpõýÿíˆõä=öýÿí`Tä;öùÿõ}öùÿõ}öùÿõpõýÿíˆõä;öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&tó%âîê%äü(îä ó%äó%äâ äæÌó%l ä¼ó%ì ìèó%R ä¼ó%ìô%ˆõäó%ðˆ$äÈHôpô%âœû%(Bâ ô%üÐú%òˆô%œö ô,U î{öùÿõýÿíœö äýÿíP&å=öýÿíl ä=övõýÿ픀ävõýÿíƒåùÿõ<öýÿíœö ä,ö õýÿíT¾ävõýÿíÿå<öýÿí,U ä>övõýÿí œ ä>ö(öýÿíl ä,öýÿíR ä,öýÿí´Â ä)ö;öùÿõDõýÿíl äjõýÿíR ä?öýÿíl ä:öùÿõvõýÿ픀ävõýÿíÌV ä<öýÿíœö ä,öýÿíœö ä,öýÿí,U ä>ö(öpõýÿíP&å,öýÿíR ä,öýÿíl ä,öýÿí´Â ä)ö;öùÿõ}öh&( û%âî ô%äD'îä8û%ä(û%äâ ìTû%l ä(û%ìpû%R ä(û%ð´Â äŒû%ì äîìû%â&¸×,âü%ü<&òü%œö ô>áî{öùÿõýÿíœö äýÿíP&å=öýÿíl ä=övõýÿ픀ävõýÿí°Ú ä(öýÿíl ä,öýÿíR ä,öýÿíxQä)ö;öùÿõDõýÿíl äjõýÿíR ä?öýÿíl ä:övõýÿ픀ävõýÿíø6 ä(öpõýÿíP&å,öýÿíR ä,öýÿíl ä,öýÿíxQä)ö;öùÿõ}öh&¸×x&îœû%ä(îä¤&ä”&äâ ìÀ&l ä”&ìÜ&R ä”&ðxQäø&ê â& ä äîh&â&ÌV /â°&ü&ò€&<¬ ð˜&ü ò,U î{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ{öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõpõýÿíˆõä;öùÿõ}öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&ÌV T&âî&äè%îä€&äp&äâ 俬&l äœ&ì ìÈ&R äœ&ìä&ˆõäp&ð´Â å&ì äî`&ât7ø6 0â¨&ü( &òx&<¬ ð&ü ò>áî{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ{öùÿõ;õ(ö!ö(ö*öýÿíl äjõýÿíxQä)ö)öùÿõ{öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõpõýÿíˆõä;öùÿõ}öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&ø6 d &âî&äX&îä &ä€ &äâ äæ¼ &l ä¬ &ì ìØ &R ä¬ &ìô &ˆõä€ &ðxQä &ê â & ä äæ@ &ì.ä ¨ ` &2P &á ¦ X &Ô£ 䈡 x &Hý p &PŸ ä0 &<: ˆ &˜š ä˜ ¨ &|)   &ø• 䨓 À &<Þ¸ &”‘ ä  Ð &èê ä @ à &l‹ä h‹ ð &¼ß ä Ј &Ý á&€ƒ ä , &ÔÎä n (&HGä È_ 8&€" ä ¨] H&ÔO ä [ `&äX&Y ähV x& 2p&R äM ˜&ô"ˆ&„K &XI ä2 G D&° ¨& D °&T: ¸&D0 À&p- È&Œ$ äÐ&às° &ëœ&ä\îä8&ädqäãtìT&œ1 ä^ì€&l äp&ì æèR äp&ì2täì&â˜!° â&üÐ&ö<¬ âì{öùÿõDõýÿíDìä(öýÿíl ä,öýÿíR ä,öýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}öT&Ìoä  d&övõýÿíàúä>ö(ö)ö)ö;öùÿõ}ö>&Ðà &¬é(&Œæ0&˜ã8&xà@&”ÝH&¤ØP&ØÕäX&àsÐà”&ë@&ä,“îäÀ&ìãtìÜ&œ1 ä^ìø&ð*åÄyì$&l ä&ì æèR ä&ì2tä&âh&Ðàâ¨&üX&ö<¬ âì{öùÿõýÿ팓å(öýÿíð*å,öýÿíð*å,öýÿíl ä,öýÿíR ä)ö;öùÿõ}ö0&<Ç &Ò(&œÍä ÅÌ&Œ“á@&áAÂH&œ²P&ü®X&«`&´‰h&Ø…p&x&”}€&$yä ˆ&àsŒ“á Ä&ëŒ&䜒îäð&ädqäãtì &œ1 ä^ì(&4“äÄyìD&Ø”äÄyìp&ìÆä`&ì æè¸Èä`&ì2täÜ&â@&Œ“á)âô&üˆ&ö<¬ âì{öùÿõDõýÿí?ä(öýÿíDZä(öýÿí4“ä-öýÿíHý ä(ö)ö)ö,öýÿíDZä(öýÿíØ”ä-öýÿí4“ä)ö,öýÿíìÆä,öýÿí¸Èä,öùÿõýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}öÜ&Tmä Iì&¼Sä Bü& ãä ¸@ &8X ä `<&Hƒå"ˆ:D&°Ú ,&œ64&È(<&|%ä"`l&ð!T&l\& d&Ää"¸û”&<Í|&Ì÷„&°ìŒ&déä"á¼&Xä&œÝ¬&àÏ´&ŒÌä"Âä&`Å Ì&$¾Ô&ˆ±Ü&<®ä"P¦ &xF ô&\¢ü&(” &Ôä @† &¤Øä2ÄT &R , &À{4 &´w< &ŒpD &(mL &¼iä ˜]d & Éä Xtt &Dñä t„ &”åˆ[œ & I ” &¼í ä Œì ¬ &è”ä&œê ü(&,nð$&¼ &às,nø &î0"&ä<’îä$!&ìãtä”å@!&œ1 ä^ìl!&Hý ä\!&ì æäˆ!&<: ä\!&ìÄ!&0"å¤!&ê â´!& ä äêˆ$äà!&ì âhsð!&æ"&è4êþ2tä€"&âŒ&,nâ˜"&ü¼ &ö<¬ âì{öùÿõýÿí,ä(öXõ<öýÿíDZä>ö(öýÿíHý ä)ö,öXõ<öýÿíÄä>ö(öýÿí<: ä)ö,öýÿí0"å)ö;öùÿõ}úø$&às,n4%&îl&&äì•îä`%&ìãtä•å|%&œ1 ä^ì¨%&Hý ä˜%&ì æäÄ%&<: ä˜%&í&&0"åà%&ê âð%& ä äêˆ$ä&&ì âhs,&&æ@&&è4ÿê2tä¼&&â0"&,nâÔ&&üø$&ö<¬ âì{öùÿõýÿí,ä(öýÿíHý ä,öýÿí<: ä,öýÿí0"å,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}ö4?&,83& )&às,H)&âî0*&䈕îät)&ìãtä–å)&œ1 ä^ì¼)&Hý ä¬)&ì æäØ)&<: ä¬)&ì*&ˆ$äô)&ê â*& ä äêˆ$äÈHì2tä€*&âl&&,\â˜*&ü )&ö<¬ âì{öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõýÿí”å=öÿÿô;öùÿõ;õ(öýÿíHý äkõýÿí<: ä)öùÿõ{öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíHý äkõýÿí<: ä;öpõýÿíHý ä)öùÿõ*öOõaõ*öýÿíHý ä;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öùÿõ}ö?&@3&às,|3&âîd4&äd¢îä¨3&ìãtä—åÄ3&œ1 ä^ìð3&Hý äà3&ì æä 4&<: äà3&ìH4&ˆ$ä(4&ê â84& ä äêˆ$ä|Gì2tä´4&â0*&,nâÌ4&ü@3&öœö âì{öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõýÿí”å=öÿÿô;öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíHý ä,öýÿí<: ä)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿí Éä=öýÿí@)å;öùÿõýÿí@)å=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿí@)å+öÿÿìæ)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíHý ä,öýÿí<: ä,öýÿí”å)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí@)å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿíDñä.öýÿíä=öýÿí@)å;öùÿõ}öùÿõ}ö$?& ,?&· ä&d« ÜF&Dì$C&D?&àsDì€?&î|@&䘡îä¬?&ädqäãtä˜åÈ?&œ1 ä^ìô?&l ää?&ì æä@&R ää?&ðˆ$ä,@&ì âhs<@&æP@&è4êþ2täÌ@&âd4&Dìâä@&üD?&ö<¬ âì{öùÿõDõýÿí° ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÄä>ö(öýÿíR ä)ö)ö;öùÿõ}ú,C&àsDìhC&îdD&äà îä”C&ädqäãtä™å°C&œ1 ä^ìÜC&l äÌC&ì æäøC&R äÌC&ðˆ$äD&ì âhs$D&æ8D&è4ÿê2tä´D&â|@&DìâÌD&ü,C&ö<¬ âì{öùÿõDõýÿíü©ä(öýÿíl ä,öýÿíR ä,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öLS&ü©tL&ìF&àsü©(G&âîÔG&ä4 îäTG&ädqäãtäšåpG&œ1 ä^ìœG&l äŒG&ì æä¸G&R äŒG&ðˆ$äÈHì2tä$H&âdD&ü©-âö(öýÿíl ä)ö,öXõ<öýÿíÄä>ö(öýÿíR ä)ö)ö;öùÿõ}úDW&àsh» €W&î|X&äP¤îä¬W&ädqäãtäåÈW&œ1 ä^ìôW&l ääW&ì æäX&R ääW&ðˆ$ä,X&ì âhsövõýÿíL ä(ö)ö)ö;öùÿõ}öŒf&„&Œ`&[&às„&@[&âîì[&ä(£îäl[&ädqäãtäžåˆ[&œ1 ä^ì´[&l ä¤[&ì æäÐ[&R ä¤[&ðˆ$äÈHì2tä<\&â|X&„&-âT\&ü[&ö<¬ âì{öùÿõýÿí$m äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí$m ä&öýÿí,Rä=öýÿíL´ä;öùÿõDõýÿí„&ä(öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö|f&”`&às„&Ð`&âî|a&ät¨îäü`&ädqäãtäŸåa&œ1 ä^ìDa&l ä4a&ì æä`a&R ä4a&ðˆ$ä|Gì2täÌa&âì[&„&1âäa&ü”`&öœö âì{öùÿõùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõýÿíd8ä(öýÿí\yä,ö[õ)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí I ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö„f&pðä&dì|o&?k&œf&às?Øf&î h&ä\§îäg&ädqäãtä å g&œ1 ä^ìö(öýÿíl ä)ö,öXõ<öýÿíÄä>ö(öýÿíR ä)ö)ö;öùÿõ}úk&às?Xk&îŒl&䔲îä„k&ädqäãtä¡å k&œ1 ä^ì¼k&¨óäptìØk&ˆÏäptìl&l äôk&ì æä l&R äôk&ðˆ$äövõýÿíL ä(ö)ö)ö;öùÿõ}ö8˜&° Äu&Œo&às° Èo&âî¬p&ä4²îäôo&ädqäãtä¢åp&œ1 ä^ì,p&¨óäptìHp&ˆÏäptìtp&l ädp&ì æäp&R ädp&ðˆ$äÈHì2täüp&âŒl&° 2âq&üŒo&ö<¬ âì{öùÿõýÿí$m äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí$m ä&öýÿí,Rä=öýÿíL´ä;öùÿõDõýÿí° ä(öýÿí¨óä,öýÿíˆÏä,öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öùÿõýÿí@Rä(ö)ö)ö;öùÿõ}ö(˜&Ìu&às° v&âîìv&䜱îä4v&ädqäãtä£åPv&œ1 ä^ìlv&¨óäptìˆv&ˆÏäptì´v&l ä¤v&ì æäÐv&R ä¤v&ðˆ$ä|Gì2täöýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿíÜ—&'â)ö;öùÿõùÿõùÿõýÿíDZäýÿí|Ùä=öýÿí˜ ä(öýÿíˆÏä,öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí\yä>öýÿí¼ß ä(ö)öhõýÿíèê ä(ö)ö-öýÿí|Ùä>öýÿí¼ß ä(ö)ö-öýÿí\yä)öùÿõùÿõPõýÿíà0 ä(öüÿí˜&#â)ö;öùÿõùÿõýÿíDZäýÿí|½å=öýÿíèê ä(ö)ö-öýÿí|Ùä+öýÿí\yä;öùÿõùÿõ;õ(öýÿí|½å>öýÿíÔÎä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí4à äýÿíL´ä=öýÿíDñä.öýÿí¤vä(öýÿíè”ä(öýÿí|½å)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä,öýÿí”å,öýÿí¨óä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿíL´ä+öýÿí¨óä)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä+öýÿí¨óä+öýÿí\yä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öùÿõýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿíL´ä+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõýÿí”å=öýÿíL´ä;öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí|½å)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõ;õ(öýÿí”åkõÿÿô)öùÿõ{öùÿõýÿîCävõýÿí¬ùä(öýÿí”å+öýÿí¨óä+öýÿí\yä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öùÿõýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí”å+öýÿí¨óä)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá0˜&”TäPäd8äp ä¸PäX˜&hsæ¼"ãëäÀ˜&¸Põãpä8™&šsªrø˜&êÀrìúäx˜&äà˜&ãå¸Päð˜&x˜&è ™&è4ÿê䀙&¸Põãpè šsªr¸™&êÀrèÀ ä8™&ä ™&ãå¸Pä°™&8™&èÌ™&è4êþäPš&(yõáæ±&舚&ìäš&èh&(yäø™&äpš&ãå(y䀚&ø™&â š&°5 ãïätá縚&4éþ p¨&ðš&ð§&äH›&(yôápðlœ&䄜&ø™&äȧ&h&(yäðš&äh›&ãရ&(yäx›&ðš&æ ä›&H›& Ì›&âÿèäø›&쀀âðš&âëå$œ&œ1 äœ&ê âðš&èØ. @œ&ð4ÿî°5 ã︜&›&îuâМ&ö°5 ãë{öùÿõ=õ(öýÿíØ. ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿíx ä<öýÿí  ä>ö(ö)ö;öùÿõ9õÿÿìæ:öùÿõDõÿÿô;öùÿõ}öùÿõ õýÿíL/ä=öýÿíÔä;öùÿõ>õ(öýÿíL/ä<öýÿí  äiõýÿíØ. ä>ö(öÿÿ ìænõýÿíL/ä)ö)öùÿõýÿíL/äaõýÿí˜ ä(öýÿíÔä,öýÿí  ä-öýÿíL/ä)ö;öùÿõ=õ(öýÿíL/ä)öùÿõ{öùÿõ9õýÿíÔä:öùÿõDõýÿíXä<öýÿíÔä>ö(öýÿíØ. ä)ö;öùÿõ9õÿÿìæ*öýÿíÔä:öùÿõDõýÿíXä<öÿÿìæ*öýÿíÔä>ö(öýÿíØ. ä)ö;öùÿõ}öùÿõDõýÿíXä<öýÿí  ä>ö(öýÿíØ. ä)ö;öùÿõ}ÿò›&æ0¨&ã¨&èIíÿáD¨&è4êÿâ|¨&„°&äÔ¨&(yôápðø©&äª&ø™&ä\°&h&(yä|¨&äô¨&ãá ©&(yä©&|¨&æ ä©&Ô¨& X©&âÿèä„©&쀀â|¨&âêå°©&œ1 ä ©&ê â|¨&èØ. Ì©&ð4ÿî°5 ãïDª&©&î@â\ª&ö°5 ãë{öùÿõ=õ(öýÿíØ. ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿíx ä<öýÿí  ä>ö(ö)ö;öùÿõ9õÿÿìæ:öùÿõDõÿÿô;öùÿõ}öùÿõ;õ(öýÿíØ. älõ(öÿÿ ìænõýÿíÔä)ö)öùÿõDõýÿíXä<öýÿíÔä>ö(öýÿíØ. ä)ö;öùÿõDõýÿíXä<öýÿí  ä>ö(öýÿíØ. ä)ö;öùÿõ}ÿò©&æİ&㘰&èIíÿáذ&è4êþä\±&x ôBáæ”º&è8²&äT³&ähµ&lº&h&x ä±&ä|±&ãá”±&x äŒ±&±&æ€} 䤱&\±&€} à±&ÿèä ²&ìR€€â±&âèéœ1 ä(²&ê â±&äP²&l" ãï¼"ááçh²&蔲&À²&øIíûèì²&ü:¬¨ä³&üâh&Ôä êÿऱ&î∳&ò{öDõXõ<öõ õ>ö(öýÿíÐ ä(ö)ö)öoõ(öýÿíÔä-öýÿíl" ä)ö;ö}útµ&ì¹&ä̵&x ôBápð¨¶&äÀ¶&±&äĹ&h&x ätµ&äìµ&ãá¶&x äüµ&tµ&æ€} ä¶&̵&€} P¶&ÿèä|¶&ìR€€âtµ&âééœ1 䘶&ê âtµ&èl" ãó¶&îâô¶&ò{öDõXõ<öõ õ>ö(öýÿíÐ ä(ö)ö)önõ(öýÿíl" ä-öýÿíÔä)ö|öùÿõýÿíx ä<öýÿíl" ä-öýÿíÔä>ö(ö)ö;ö}ÿò¶&æ,º&ãº&èIíÿá@º&á%µã4ÿÿ椱&æäìº&ïôápäÛ&èp»&ˆ»&ìÀÙ&âh&ï䔺&ä »&ãá$»&ïä»&”º&æÊä4»&âìº&ÊäÿìÜ€ãëâл&ïôápäl½&ƺ&ä,½&èh&`Ã䈻&äð»&ãá¼&ïå¼&ˆ»&â\¼&Êä¼&âл&ÊäKâêö4»&ê2äl¼&л&2¨¼&ÿèää¼&äÔ¼&ä㈻&ì ∻& ä½&é½&ì ∻&ðÔ¼&ñ@½&è4êþâ´½&ïôápäP¿&ƺ&ä¿&èh&pÂäl½&äÔ½&ãáì½&ïää½&l½&â@¾&Êäü½&â´½&ÊäKâêö4»&ê2äP¾&´½&2Œ¾&ÿèäȾ&举&äãl½&ì âl½& äô¾&èä¾&ì âl½&ð¸¾&ñ$¿&è4êþ☿&ïôápä4Á&ƺ&äôÀ&èh&ÄäP¿&丿&ãáп&ïäÈ¿&P¿&â$À&Êäà¿&☿&ÊäKâêö4»&ê2ä4À&˜¿&2pÀ&ÿèä¬À&äœÀ&äãP¿&ì âP¿& äØÀ&èÈÀ&ì âP¿&ðœÀ&ñÁ&è4êþâ|Á&ïôápäÃ&ƺ&äØÂ&èh&dÚ ä4Á&äœÁ&ãá´Á&ïä¬Á&4Á&âÂ&ÊäÄÁ&â|Á&ÊäKâêö4»&ê2äÂ&|Á&2TÂ&ÿèäÂ&ä€Â&äã4Á&ì â4Á& ä¼Â&è¬Â&ì â4Á&ð€Â&ñìÂ&è4êþâ`Ã&ïôápäüÄ&ƺ&ä¼Ä&èh&lÁ äÃ&ä€Ã&ãá˜Ã&ïäÃ&Ã&âìÃ&Êä¨Ã&â`Ã&ÊäKâêö4»&ê2äüÃ&`Ã&28Ä&ÿèätÄ&ädÄ&äãÃ&ì âÃ& ä Ä&èÄ&ì âÃ&ðdÄ&ñÐÄ&è4êþâDÅ&ïôápäàÆ&ƺ&ä Æ&èh&ábäüÄ&ädÅ&ãá|Å&ïätÅ&üÄ&âÐÅ&ÊäŒÅ&âDÅ&ÊäKâêö4»&ê2äàÅ&DÅ&2Æ&ÿèäXÆ&äHÆ&äãüÄ&ì âüÄ& 䄯&ètÆ&ì âüÄ&ðHÆ&ñ´Æ&è4ê?þâ(Ç&ïôápäÄÈ&ƺ&ä„È&èh&з äàÆ&äHÇ&ãá`Ç&ïäXÇ&àÆ&â´Ç&ÊäpÇ&â(Ç&ÊäKâêö4»&ê2äÄÇ&(Ç&2áÈ&ÿèä<È&ä,È&äãàÆ&ì âàÆ& ähÈ&èXÈ&ì âàÆ&ð,È&ñ˜È&è4êþâ É&ïôápä¨Ê&ƺ&ähÊ&èh&<¬ äÄÈ&ä,É&ãáDÉ&ïä<É&ÄÈ&â˜É&ÊäTÉ&â É&ÊäKâêö4»&ê2ä¨É& É&2äÉ&ÿèä Ê&äÊ&äãÄÈ&ì âÄÈ& äLÊ&è<Ê&ì âÄÈ&ðÊ&ñ|Ê&è4êÿþâðÊ&ïôápäŒÌ&ƺ&äLÌ&èh&˜Oä¨Ê&äË&ãá(Ë&ïä Ë&¨Ê&â|Ë&Êä8Ë&âðÊ&ÊäKâê ö4»&ê2äŒË&ðÊ&2ÈË&ÿèäÌ&äôË&äã¨Ê&ì â¨Ê& ä0Ì&è Ì&ì â¨Ê&ðôË&ñ`Ì&è4êÿýâÔÌ&ïôápäpÎ&ƺ&ä0Î&èh&¸qäŒÌ&äôÌ&ãá Í&ïäÍ&ŒÌ&â`Í&ÊäÍ&âÔÌ&ÊäKâê ö4»&ê2äpÍ&ÔÌ&2¬Í&ÿèäèÍ&äØÍ&äãŒÌ&ì âŒÌ& äÎ&èÎ&ì âŒÌ&ðØÍ&ñDÎ&è4êÿýâ¸Î&ïôápäTÐ&ƺ&äÐ&èh&T¹äpÎ&äØÎ&ãáðÎ&ïäèÎ&pÎ&âDÏ&ÊåÏ&â¸Î&ÊäKâê ö4»&ê2äTÏ&¸Î&2Ï&ÿèäÌÏ&ä¼Ï&äãpÎ&ì âpÎ& äøÏ&èèÏ&ì âpÎ&ð¼Ï&ñ(Ð&è4êÿýâœÐ&ïôápä8Ò&ƺ&äøÑ&èh&ì8äTÐ&ä¼Ð&ãáÔÐ&ïäÌÐ&TÐ&â(Ñ&ÊääÐ&âœÐ&ÊäKâê ö4»&ê2ä8Ñ&œÐ&2tÑ&ÿèä°Ñ&ä Ñ&äãTÐ&ì âTÐ& äÜÑ&èÌÑ&ì âTÐ&ð Ñ&ñ Ò&è4êÿýâ€Ò&ïôápäÔ&ƺ&äÜÓ&èh&ð.ä8Ò&ä Ò&ãá¸Ò&ïä°Ò&8Ò&â Ó&ÊäÈÒ&â€Ò&ÊäKâê ö4»&ê2äÓ&€Ò&2XÓ&ÿèä”Ó&ä„Ó&äã8Ò&ì â8Ò& äÀÓ&è°Ó&ì â8Ò&ð„Ó&ñðÓ&è4êÿýâdÔ&ïôápåÖ&ƺ&äÀÕ&èh&PËäÔ&ä„Ô&ãáœÔ&ïä”Ô&Ô&âðÔ&Êä¬Ô&âdÔ&ÊäKâêö4»&ê2åÕ&dÔ&2<Õ&ÿèäxÕ&ähÕ&äãÔ&ì âÔ& ä¤Õ&è”Õ&ì âÔ&ðhÕ&ñÔÕ&è4êÿ?ýâHÖ&ïôápää×&ƺ&ä¤×&èh&° åÖ&ähÖ&ãá€Ö&ïäxÖ&áÖ&âÔÖ&ÊäÖ&âHÖ&ÊäKâêö4»&ê2ääÖ&HÖ&2 ×&ÿèä\×&äL×&ääÖ&ì ãÖ& äˆ×&èx×&ì ãÖ&ðL×&ñ¸×&è4êÿýâ,Ø&ïôápèƺ&ä€Ù&çh&pæää×&äLØ&ãádØ&ïä\Ø&ä×&â°Ø&ÊätØ&â,Ø&Êä âÿè2äÀØ&,Ø&2üØ&ÿèä8Ù&ä(Ù&äãä×&ì âä×& ädÙ&èTÙ&ì âä×&ð(Ù&ñ”Ù&è4ÿÿæ4»&èÙ&âéÚ&@Ú&ø4êþIêlÚ&Êôâ ┺&|Ú&çÚ&èé¼Ú&èÚ&øIíû4êþälÛ&Hm ôáæøä&è°Ü&äøÝ&äTà&Ðä&h&Hm äÛ&äŒÛ&ãá¤Û&Hm äœÛ&Û&æ°¼ ä´Û&lÛ&°¼ ðÛ&ÿèäÜ&ì€âÛ&âæáâXÜ&l ä8Ü&ì âHÜ&æ ì„Ü&@)åtÜ&ì äêxQä Ü&ê âHÜ& äÈÜ&>ñàÜ&0ëòèÎáçøÜ&é$Ý&tÝ&øIêPÝ&xQôâ â@m`Ý&èHÜ&èé Ý&ÌÝ&øIêHÜ&øâ4êÿæ´Û&îâ,Þ&ò{öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öpõýÿíl ä,öqõýÿí@)å)öùÿõ*öýÿíl ä=öýÿíxQä;öùÿõ}ú`à&hä&ä¸à&Hm ôápðüá&ä,â&Û&ä@ä&h&Hm ä`à&äØà&ãáðà&Hm äèà&`à&æ°¼ åá&¸à&°¼ <á&ÿèähá&ì€â`à&âçáâ¤á&l ä„á&ì â”á&æ ìÐá&@)åÀá&ì äêxQäìá&ê â”á& äâ&>õ0ë÷á&îâ`â&ò{öùÿõýÿíÐä(öýÿíl ä,ö(öõõ)öýÿíxQä,ö(öýÿíä¶ ä)öýÿí@)å)ö;öùÿõ}ÿóá&æ|ä&ä”á&èä&âÀá&äùåá¤ä&äâ4êÿú´Û&æäPå&\Cõáæ|ð&ètæ&äç&äìé&Tð&h&\Cåøä&äpå&ãáˆå&\Cå€å&øä&挽ä˜å&På&Œ½Ôå&ÿèä æ&åæ&ä€âøä&âäáâ âæ&æ ì<æ&l åæ&ìXæ&R åæ&ðˆõåæ&ìŒæ&>ñôæ&4Äáç¤æ&IêÐæ&xQôâ â@màæ&èæ&ìð!áç ç&é8ç&dç&øIêæ&øâ4êÿæ˜å&îâÄç&ò{öùÿõ>õ(öýÿíR ä>öýÿíl ä)öùÿõ*öqõýÿíˆõä=ö*öqõýÿíR ä;öùÿõDõýÿíˆõä;öùÿõ}úøé&Àï&äPê&\Cõápðtë&äŒë&øä&ä ˜ï&h&\Cåøé&äpê&ãáˆê&\Cå€ê&øé&挽ä˜ê&Pê&Œ½Ôê&ÿèä ë&åë&ä€âøé&âåáâ âë&æ ì<ë&l åë&ìXë&R åë&ðˆõåë&ð>ù˜ê&î)âÀë&ò{öùÿõýÿíä¶ äýÿí@)å=öXõ<öýÿíä¶ ä>ö(öýÿíR ä-öýÿíl ä)ö;öùÿõýÿíˆõäbõýÿí@)å;öùÿõýÿí0Èä(öýÿíˆõä,öýÿíl ä,öýÿí@)å*öEõ(öýÿí>å)ö)ö;öùÿõDõýÿíˆõä;öùÿõ}ÿò˜ê&æÔï&äë&èð&áèï&áå³ùá4êÿâá(ð&äâ4êÿú˜å&æäÔð&lð ôáæ0ü&èøñ&äó&äèõ&ü&h&lð ä|ð&äôð&ãá ñ&lð äñ&|ð&æTmäñ&Ôð&TmXñ&ÿèä¤ñ&ä„ñ&ä€â|ð&ââáâ â”ñ&æ ìÀñ&l ä„ñ&ìÜñ&R ä„ñ&ðˆõä„ñ&ìò&>ñxò&4Äáç(ò&IêTò&xQôâ â@mdò&è”ñ&ìð!áçò&é¼ò&èò&øIê”ñ&øâ4êÿæñ&îâHó&ò{öùÿõ@õ(ö;öýÿíl ä<öýÿíR ä;öpõýÿíl ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõDõýÿíˆõä;öùÿõ}úôõ&tû&äLö&lð ôápðp÷&äˆ÷&|ð&äLû&h&lð äôõ&älö&ãá„ö&lð ä|ö&ôõ&æTmä”ö&Lö&TmÐö&ÿèä÷&äüö&ä€âôõ&âãáâ â ÷&æ ì8÷&l äüö&ìT÷&R äüö&ðˆõäüö&ð>ù”ö&î&â¼÷&ò{öùÿõýÿíä¶ äýÿí@)å=öXõ<öýÿíä¶ ä>ö(öýÿíR ä-öýÿíl ä)ö;öùÿõýÿíä°ä(öýÿíˆõä,öýÿíl ä,öýÿí@)å*öEõ(öýÿí>å)ö)ö;öùÿõDõýÿíˆõä+öýÿí@)å;öùÿõ}ÿò”ö&æˆû&ä ÷&èÈû&áœû&á¶³ùá4êÿâáÜû&äâ4êÿúñ&æäˆü& è0ÿ&èpäl'èÌÿ&ä'èD'h& ä0ü&ä¨ü&ãáÀü& ä¸ü&0ü&âDþ&`/äÐü&ˆü&`/ ý&Pÿèä8ý&ì€â0ü&âàådý&œ1 äTý&ì â0ü&è¨öä€ý&ì â”ý&4þ&æäÀý&ä°ý&䀀ã ììý&èÜý&ê æäþ&èÜý&ö$þ&ì äæ äæ ÿ& äTþ&ˆü& þ&ÿèä¼þ&ä°ý&䀀â0ü&âáåØþ&œ1 äTý&êÿ&ð*åôþ&ê â4þ& èÌ/å$þ&ð\¡ ä0ÿ&å\¡ Hÿ&è â\ÿ&4þ&æäxÿ&ä°ý&䀀ã”ÿ&èÜý&ê°ÿ&èÜý&ö$þ&ìäÿ&(=ñüÿ&>áòl3áîh'äTþ&î âH'ò{öDõ(öýÿíð*åtõýÿí\¡ ä)ö(öýÿíÌ/å)ö;ö}þÐü&îâœ'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}öô'øl'æ â |'¸'äÔ'Ø=ôápäP'è'ðØ'âh&Ø=ä|'äô'ãá 'Ø=ä'|'â8'ì‚ä'('æ ìd'HqäH'T'æ äêT ät'€'æ 俍'ð­ðÀ'T­òpîáï'ø'æ('øH'æüt'æä¨'¨²õápåtè8'ðh'âh&¨²åP'äÈ'ãáà'¨²åØ'P'â ' äð'ü'æ ðT ä'('æ äæP'¨%ôpîáî'øð'æü'æÌ'ä4þ&èà'â$þ&ìâ°ý&è'øÐü&æD'øTþ&æü0ÿ&æäÄ'$‹ è 'èpä´ 'è” 'äÄ 'èÜ 'h&$‹ äl'ää'ãáü'$‹ äô'l'âD'`/ä 'Ä'`/H'Pÿèät'ì€âl'âÞå 'œ1 ä'ì âl'è¨öä¼'ì âÐ'4'æäü'äì'䀀ã ì'èÜý&öÜý&ê äæ ' äT'Ä' 'ÿèä¼'äì'䀀âl'âßåØ'œ1 ä'îð*åô'ê â4' è\¡ ä 'å\¡ , 'è â@ '4'æä\ 'äì'䀀ãx 'èÜý&öÜý&ê¬ '(=õ>áï 'äT'î âø 'ò{öDõ(öýÿíð*åtõýÿí\¡ ä)ö(ö)ö;ö}þ 'îâ4 'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}ö< 'ø 'æ â P' '( 'ä4'ìâì'èd 'ø 'æŒ 'øT'æü 'æä 'lÿè¤'èpä¤'è@'äˆ'è¸'h&lÿä´ 'ä, 'ãáD 'lÿä< '´ 'â¸'`/äT ' '`/ 'Pÿèä¼ 'ì€â´ 'âÜåè 'œ1 äØ 'ì â´ 'è¨öä'ì â'¨'æäD'ä4'䀀ã ì`'èÜý&ê|'èÜý&ö˜'ì äæ äæ”' äÈ' ' 'ÿèä0'ä4'䀀ⴠ'âÝåL'œ1 äØ 'êx'ð*åh'ê â¨'êÌ/å˜'ð\¡ ä¤'å\¡ ¼'è âÐ'¨'æäì'ä4'䀀ã'èÜý&ê$'èÜý&ö˜'ìX'(=ñp'>áòl3áîÜ'äÈ'î â¼'ò{öDõ(öýÿíð*åuõýÿí\¡ ä)ö(öýÿíÌ/å)ö;ö}þT 'îâ'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}ö,'øà'æ â |'ð''äh'æ'â˜'ìâ4'èT'øT 'æ|'øÈ'æü¤'æäü'h=èL'èpäì'èÌ'äü'è'h&h=ä¤'ä'ãá4'h=ä,'¤'â|'`/äD'ü'`/€'Pÿèä¬'ì€â¤'âÚåØ'œ1 äÈ'ì â¤'è¨öäô'ì â'l'æä4'ä$'䀀ã ìP'èÜý&öÜý&ê äæ<' äŒ'ü' È'ÿèäô'ä$'䀀â¤'âÛå'œ1 äÈ'îð*å,'ê âl'ê\¡ äL'å\¡ d'è âx'l'æä”'ä$'䀀ã°'èÜý&öÜý&êä'(=õ>áî8'äŒ'î â0'ò{öDõ(öýÿíð*åuõýÿí\¡ ä)ö(ö)ö;ö}þD'îâl'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}öt'ø<'æ â P'L'`'ä,'êâ$'èœ'øD'æÄ'øŒ'æüL'æäD'¼. èÜ'èpäÜ 'èx'äÀ'èð'h&¼. äì'äd'ãá|'¼. ät'ì'âð'`/äŒ'D'`/È'Pÿèäô'ì€âì'âØå 'œ1 ä'ì âì'è¨öä<'ì âP'à'æä|'äl'ä€ä ì˜'èÜý&ì´'èÜý&öÐ'ì äæ äæÌ' å'D' <'ÿèäh'äl'䀀âì'âÙå„'œ1 ä'ê°'ð*å 'ì âà' èÌ/åÐ'ð\¡ äÜ'å\¡ ô'è â'à'æä$'äl'ä€ä@'èÜý&ì\'èÜý&öÐ'ì'(=ñ¨'>áòl3áî'å'î âô'ò{öDõ(öýÿíð*åtõýÿí\¡ ä)ö(öýÿíÌ/å)ö;ö}þŒ'îâH'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}öd 'ø 'æ â |'( '< 'äà'èP 'âÐ'ìâl'èŒ 'øŒ'æ´ 'ù'æüÜ'æä4!'h°è„#'èpä$''è$'ä4$'èL&'h&h°äÜ 'äT!'ãál!'h°äd!'Ü 'â´"'`/ä|!'4!'`/¸!'Pÿèää!'ì€âÜ 'âÖå"'œ1 å"'ì âÜ 'è¨öä,"'ì â@"'¤"'æäl"'ä\"'ä€ä ìˆ"'èÜý&øÜý&ê äæt#' äÄ"'4!' á#'ÿèä,#'ä\"'䀀âÜ 'â×åH#'œ1 å"'îð*åd#'ì â¤"' è\¡ ä„#'å\¡ œ#'è â°#'¤"'æäÌ#'ä\"'ä€äè#'èÜý&øÜý&ê$'(=õ>áîp%'äÄ"'î âh$'ò{öDõ(öýÿíð*åtõýÿí\¡ ä)ö(ö)ö;ö}þ|!'îâ¤%'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}ö¬&'øt&'æ â P'„&'˜&'ä¤"'ìâ\"'èÔ&'ø|!'æü&'øÄ"'æü„#'æä|''äV è*'èpä.'è°*'äø*'è(-'h&äV ä$''äœ''ãá´''äV ä¬''$''â()'`/äÄ''|''`/á('Pÿèä,('ì€â$''âÔåX('œ1 äH('ì â$''è¨öät('ì âˆ(')'æä´('ä¤('ä€ä ìÐ('èÜý&ìì('èÜý&ö)'ì äæ äæ*' ä8)'|'' t)'ÿèä )'ä¤('䀀â$''âÕå¼)'œ1 äH('êè)'ð*åØ)'ì â)'êÌ/å)'ð\¡ ä*'å\¡ ,*'è â@*')'æä\*'ä¤('ä€äx*'èÜý&ì”*'èÜý&ö)'ìÈ*'(=ñà*'>áòl3áîL,'ä8)'î â,+'ò{öDõ(öýÿíð*åuõýÿí\¡ ä)ö(öýÿíÌ/å)ö;ö}þÄ''îâ€,'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}öœ-'øP-'æ â |'`-'t-'äØ)'èˆ-'â)'ìâ¤('èÄ-'øÄ''æì-'ø8)'æü*'æäl.'Àeè¼0'èpä\4'è<1'äl1'è„3'h&Àeä.'äŒ.'ãá¤.'Àeäœ.'.'âì/'`/ä´.'l.'`/ð.'Pÿèä/'ì€â.'âÒåH/'œ1 ä8/'ì â.'è¨öäd/'ì âx/'Ü/'æä¤/'ä”/'ä€ä ìÀ/'èÜý&øÜý&ê 俬0' äü/'l.' 80'ÿèäd0'ä”/'䀀â.'âÓå€0'œ1 ä8/'îð*åœ0'ì âÜ/'ê\¡ ä¼0'å\¡ Ô0'è âè0'Ü/'æä1'ä”/'ä€ä 1'èÜý&øÜý&êT1'(=õ>áî¨2'äü/'î â 1'ò{öDõ(öýÿíð*åuõýÿí\¡ ä)ö(ö)ö;ö}þ´.'îâÜ2'ò:öýÿí\¡ ä(öýÿí¨öä)ö{ö}öä3'ø¬3'æ â P'¼3'Ð3'äœ0'ìâ”/'è 4'ø´.'æ44'øü/'æü¼0'æä´4'¤è7'èpäÌ:'è˜7'äà7'èà9'h&¤ä\4'äÔ4'ãáì4'¤ää4'\4'â@6'`/äü4'´4'`/85'Pÿèäd5'ì€â\4'âÐå5'œ1 ä€5'ì â\4'è¸$å¬5'ì â¼5'æäè5'äØ5'ê äæ6'è6'ì ø06'ì äæ 7' äP6'´4' Œ6'ÿèä¸6'äØ5'䀀â\4'âÑåÔ6'œ1 ä€5'êð6'Ì/å6'ð<0å06'ðÀVä7'åÀV47'è âD7'æä`7'äØ5'ê|7'è6'ø06'ì°7'ð­ðÈ7'T­òpîáî9'äP6'î â8'ò{öDõýÿíÀVä(öýÿíÌ/å,öýÿí<0å)ö;ö}þü4'îâ89'ò:öýÿíÀVä(öýÿí¸$å)ö{ö}öT:'ø:'æ â |':',:'ä6'è@:'â06'ìâØ5'è|:'øü4'æ¤:'øP6'æü7'æä$;'P)èD='èpä|@'è¤='äÔ='è¤?'h&P)äÌ:'äD;'ãá\;'P)äT;'Ì:'â„<'`/äl;'$;'`/¨;'PÿèäÔ;'ì€âÌ:'âÎæ<'œ1 äð;'ì âÌ:'è¸$å<'ì â,<'æäX<'äH<'ê äòt<'ì ì4=' ä”<'$;' Ð<'ÿèäü<'äH<'䀀âÌ:'âÏå='œ1 äð;'îÌ/åt<'ðÀVäD='åÀV\='è âl='æäˆ='äH<'öt<'ì¼='¨%ôpîáîÈ>'ä”<'îâ>'ò{öDõýÿíÀVä(öýÿíÌ/å)ö;ö}þl;'îâü>'ò:öýÿíÀVä(öýÿí¸$å)ö{ö}ö@'øÌ?'æ â P'Ü?'ð?'ät<'ìâH<'è,@'øl;'æT@'ø”<'æüD='æäÔ@',KèHC'èpä`H'è¸C'äÐC'è G'h&,Kä|@'äô@'ãá A',KäA'|@'â8B'`/äA'Ô@'`/XA'ÿèä„A'ì€â|@'âÌå°A'œ1 ä A'ì â|@'äìA'Ì/åÌA'ê âÜA' ä ð<0åB'ê âB' ä â (B'Hq ì8C' äHB'Ô@' „B'ÿèäÐB'ä°B'䀀â|@'âÍå â ÀB'T ììB'œ1 ä A'îÌ/åC'ê âC' ä â (C'ì‚ ì¨C'ìÙäHC'á `C'ìÙÀB'èåxQxC'æ âˆC'æ â ˜C'Hq ðxQä`C'äLÑð TE'D'HB'î âD'öLÑð{öùÿõDõýÿíìÙä(öýÿíÌ/å,ö*öýÿíxQä)ö;öùÿõ}úˆE'A'îâ E'öLÑð:öýÿíìÙä(öýÿíÌ/å)ö,öùÿõýÿíxQä(ö&öýÿí<0å)öùÿõ{öùÿõ}öÀG'øHG'æ â P'XG'ŒG'älG'è â |G'ì‚ ðâ G'è â °G'T ìèG'øA'æH'øHB'æ8H'øHC'æü`C'æä¸H'Ä~ è['èpäXb'èÐ['äD\'èà_'h&Ä~ ä`H'äØH' ãáðH'Ä~ äèH'`H'âÜI'¼e åI' I'æ â P'I'„I'ä0I'è â @I'ì‚ â PI' œ âÀP`I'ètI'è ðâ˜I'è â ¨I'T â ¸I' œ âÀPÈI'ètI'èøI', äìI'tI'æ$J'HqäJ'J'æ äæˆJ' ä4J'@J'æ â PJ' â P'`J'tJ'ä0I'ìâ˜I'èìJ'T ä˜J'¤J'æ â ´J'T â P'ÄJ'ØJ'ä0I'ìâ˜I'èøR'`/äüJ'¸H'`/8K'ÿèädK'ì€â`H'âÉåK'œ1 ä€K'ì â`H'äDO'Ì/å¬K'ì â ¼K'ìŸ â táÌK'àK'ätI'ìáôK'èIê L'xQôâ âá ã0L'DL'ätI'è|N'áXL'èé„L',N'øé°L'°M'øéÜL',M'øIêM'xQôâ âL¸M'ètI'èéXM'„M'øIêtI'øâ4êþéÜM'üIêN'xQôâ âtN'ètI'èIêXN'xQôâ ⼕hN'ètI'èàN'áN'èIê¼N'xQôâ â‡ÌN'ètI'ìáôN'èIê O'xQôâ ât0O'ètI'ì<0å`O'ì â pO'ìŸ â tá€O'”O'äJ'ìá¨O'èIêÔO'xQôâ âá ãäO'øO'äJ'è0R'á P'èé8P'àQ'øédP'dQ'øéP'àP'øIê¼P'xQôâ âL¸ÌP'èJ'èé Q'8Q'øIêJ'øâ4êþéQ'üIê¼Q'xQôâ âtÌQ'èJ'èIê R'xQôâ ⼕R'èJ'è”R'áDR'èIêpR'xQôâ ⇀R'èJ'ìá¨R'èIêÔR'xQôâ âtäR'èJ'è"€[' @W'S'¸H' DS'ÿèäpS'ä¤J'䀀â`H'âÊåŒS'œ1 ä€K'îÌ/å¨S'ì â ¸S'`“ â táÈS'ÜS'ä@J'ìáðS'èIêT'xQôâ âá ã,T'@T'ä@J'èxV'áTT'èé€T'(V'øé¬T'¬U'øéØT'(U'øIêU'xQôâ âL¸U'è@J'èéTU'€U'øIê@J'øâ4êþéØU'üIêV'xQôâ âtV'è@J'èIêTV'xQôâ ⼕dV'è@J'èÜV'áŒV'èIê¸V'xQôâ â‡ÈV'è@J'ìáðV'èIêW'xQôâ ât,W'è@J'ìHW'¸H' „W'ÿèä°W'ä¤J'ä€â`H'âËåÌW'œ1 ä€K'ðÌ/åèW'ì â øW'ŒÍ â táX'X'ä@J'ìá0X'èIê\X'xQôâ âá ãlX'€X'ä@J'è¸Z'á”X'èéÀX'hZ'øéìX'ìY'øéY'hY'øIêDY'xQôâ âL¸TY'è@J'èé”Y'ÀY'øIê@J'øâ4êþéZ'üIêDZ'xQôâ âtTZ'è@J'èIê”Z'xQôâ ⼕¤Z'è@J'è['áÌZ'èIêøZ'xQôâ â‡['è@J'ìá0['èIê\['xQôâ âtl['è@J'èÀ['ìÙä['á ¨['ìÙtI'èåxQJ'ìxQä ¨['è['LÑô>áã\'è â \'Hq â  \' œ âÀP0\'ètI'èh]'äHW'î âx\'ò{öDõýÿíìÙä(öýÿíÌ/å,öýÿíxQä)ö;ö}öŒ^'äS'î âœ]'ò{öDõýÿíìÙä(öýÿíÌ/å,öýÿíxQä)ö;ö}þüJ'î âÀ^'ò:öýÿíìÙä(öýÿíÌ/å)ö,öýÿíxQä(öýÿí<0å)ö{ö}öÈ`'ø`'æ â P'`'p`'ä,`'è â <`'ì‚ â L`' œ âÀP\`'ètI'ìâ„`'è â ”`'T â ¤`' œ âÀP´`'ètI'èð`'ùI'æa'øìI'æ@a'øJ'æha'ø4J'æa'ø˜J'æ¸a'øüJ'æàa'øS'æb'øHW'æ0b'ø['æü¨['æä°b'ü6è$e'èpäáâÜ}'è â ì}'ì‚ â ü}' œ âÀP ~'èPk'èD'ä$y'î âT~'ò{öDõýÿíìÙä(öýÿíxQä,öýÿíÌ/å)ö;ö}öh€'äät'î âx'ò{öDõýÿíìÙä(öýÿíxQä,öýÿíÌ/å)ö;ö}þØl'î ✀'ò:öýÿíìÙä(öýÿíÌ/å)ö,öýÿíxQä(öýÿí<0å)ö{ö}ö¤‚'øä'æ â P'ô'L‚'ä‚'è â ‚'Hq â (‚' œ âÀP8‚'èPk'ìâ`‚'è â p‚'T â €‚' œ âÀP‚'èPk'èÌ‚'øÜj'æô‚'øÈk'æƒ'øäk'æDƒ'øl'ælƒ'øtl'攃'øØl'漃'øät'æäƒ'ø$y'æ „'øl}'æü„}'æäŒ„'¤( ôápäð†'褅'ä¼…'èh†'h&¤( ä4„'䬄'ãáÄ„'¤( 伄'4„'æ äÔ„'Œ„' …'ÿèä<…'쀀â4„'âÃåh…'œ1 äX…'ê â4„'èˆ$ä„…'ê â”…' ä ð>ùÔ„'îâð…'ò{öDõZõ;ö}öȆ'ø†'æ â P' †'´†'ä”…'ìÿêÔ„'æäH‡'œU蜉'èpä 'è´‰'ä̉'ètŒ'h&œUäð†'äh‡'ãဇ'œUäx‡'ð†'â`ˆ'`/ä‡'H‡'`/̇'Pÿèäø‡'ì€âð†'âÁå$ˆ'œ1 äˆ'ì âð†'è´Â ä@ˆ'ê âPˆ' ä 쌉' äpˆ'H‡' ¬ˆ'ÿèä؈'쀀âð†'âÂåôˆ'œ1 äˆ'ê@‰'Ì/å‰'ê â ‰' ä â 0‰'ì‚ ð<0å\‰'ê âl‰' ä â |‰'Hq ðk 䜉'åk |‰'ì,U ð˜‹'äpˆ'îãŠ'ò{öDõXõ<öõ>ö(ö!öýÿík ä(öýÿíÌ/å,öýÿí<0å)ö)ö;ö}þ‡'îâÌ‹'ò:öýÿík ä(öýÿí´Â ä)ö{ö}ö('øœŒ'æ â |'¬Œ'àŒ'äÀŒ'è â ÐŒ'ì‚ ì'âôŒ'è â 'Hq ðîP'ø‡'æx'øpˆ'æüœ‰'æäø'ðbê'èpä “'è'ä0'è ¨’'h&ðbå 'äŽ'ãá0Ž'ðbå(Ž' 'â'`/ä@Ž'ø'`/|Ž'Pÿè䨎'ì€â 'â¿åÔŽ'œ1 äÄŽ'ì â 'è´Â äðŽ'ê ã' ä ìð' ä 'ø' \'ÿèäˆ'쀀â 'âÀå¤'œ1 äÄŽ'îÌ/åÀ'ê âÐ' ä â à' ðk å'åk à'ì,U ðÌ‘'ä 'îâd'ò{öDõXõ<öõ>ö(ö!öýÿík ä(öýÿíÌ/å)ö)ö;ö}þ@Ž'îã’'ò:öýÿík ä(öýÿí´Â ä)ö{ö}ö(“'øÐ’'æ â P'à’'“'äô’'è â “' ðîP“'ø@Ž'æx“'ø 'æý'æäø“'àžôápä—'è•'ä(•'è|–'h&àžä “'ä”'ãá0”'àžä(”' “'æ ä@”'ø“' |”'ÿè䨔'쀀⠓'â¾åÔ”'œ1 äÄ”'ê â “'èÌ/åð”'ê ã•' ä ð>ù@”'î â\•'ò{öDõXõ<öõ>ö(ö!öýÿíÌ/å)ö;ö}öÜ–'ø¤–'æ â P'´–'È–'å•'ìÿê@”'æä\—'â ôápä°š'è˜'䨘'èš'h&â ä—'ä|—'ãá”—'â 䌗'—'æ 䤗'\—' à—'ÿèä ˜'쀀â—'â½å8˜'œ1 ä(˜'ê â—'ät˜'Ì/åT˜'ê âd˜' ä ð<0åT˜'î>ù¤—'î âܘ'ò{öDõXõ<öõ>ö(öýÿíÌ/åhõýÿí<0å)ö;ö}öˆš'ø<š'æ â |'Lš'`š'äd˜'ètš'âd˜'ìÿꤗ'æä›'Pí ôápä\ž'è<œ'äTœ'èÀ'h&Pí ä°š'ä(›'ãá@›'Pí ä8›'°š'æ äP›'›' Œ›'ÿè丛'쀀Ⱊ'â¼åä›'œ1 äÔ›'ê â°š'ä œ'Ì/æœ'ê âœ' ä ð<0æœ'î>ùP›'î ∜'ò{öDõXõ<öõ>ö(öýÿíÌ/åiõýÿí<0å)ö;ö}ö4ž'øè'æ â |'ø' ž'äœ'è ž'âœ'ìÿêP›'æä´ž'¨SôápäP¢'èèŸ'å 'è´¡'h&¨Sä\ž'äÔž'ãáìž'¨Sääž'\ž'æ äüž'´ž' 8Ÿ'ÿèädŸ'쀀â\ž'â»åŸ'œ1 䀟'ê â\ž'äÌŸ'Ì/嬟'ê ⼟' ä ð<0嬟'î>ùüž'îâ4 'ò{öDõXõ<öõ>ö(ö!ö(öýÿí<0å<öýÿíÌ/å)ö)ö;ö}ö(¢'øÜ¡'æ â|'ì¡'á¢'伟'è¢'⼟'ìÿêüž'æä¨¢'Xh ôápäD¦'èÜ£'äô£'訥'h&Xh äP¢'äÈ¢'ãáà¢'Xh 䨢'P¢'æ äð¢'¨¢' ,£'ÿèäX£'쀀âP¢'âºå„£'œ1 ät£'ê âP¢'äÀ£'Ì/å £'ê â°£' ä ð<0å £'î>ùð¢'îâ(¤'ò{öDõXõ<öõ>ö(ö!ö(öýÿíÌ/å<öýÿí<0å)ö)ö;ö}ö¦'øÐ¥'æ â |'à¥'ô¥'ä°£'è¦'â°£'ìÿêð¢'æäœ¦'ôápäð©'èЧ'äè§'èT©'h&äD¦'伦'ãáÔ¦'ä̦'D¦'æ ää¦'œ¦'  §'ÿèäL§'쀀âD¦'â¹åx§'œ1 äh§'ê âD¦'ä´§'Ì/å”§'ê ⤧' ä ð<0å”§'î>ùä¦'î â¨'ò{öDõXõ<öõ>ö(öýÿíÌ/å<öýÿí<0å)ö;ö}öÈ©'ø|©'æ â |'Œ©' ©'䤧'è´©'⤧'ìÿêä¦'æäHª'°^ôáp䜭'è|«'䔫'é ­'h&°^äð©'ähª'ãဪ'°^äxª'ð©'æ äª'Hª' ̪'ÿèäøª'쀀âð©'â¸å$«'œ1 ä«'ê âð©'ä`«'Ì/å@«'ê âP«' ä ð<0å@«'î>ùª'î âÈ«'ò{öDõXõ<öõ>ö(öýÿí<0å<öýÿíÌ/å)ö;ö}öt­'ø(­'æ â |'8­'L­'äP«'è`­'âP«'ìÿêª'æäô­'>ôápä±'è(¯'ä@¯'èô°'h&>䜭'ä®'ãá,®'>ä$®'œ­'æ ä<®'ô­' x®'ÿè䤮'쀀✭'â·åЮ'œ1 äÀ®'ê ✭'ä ¯'Ì/åì®'ê âü®' ä ð<0åì®'î>ù<®'îât¯'ò{öDõXõ<öõ>ö(ö!ö(öýÿíÌ/åjõýÿí<0å)ö)ö;ö}öh±'ø±'æ â |',±'@±'äü®'èT±'âü®'ìÿê<®'æäè±'ØË ôápä<µ'è³'ä4³'è ´'h&ØË ä±'ä²'ãá ²'ØË ä²'±'æ ä0²'è±' l²'ÿè䘲'쀀â±'â¶åIJ'œ1 ä´²'ê â±'å³'Ì/åà²'ê âð²' ä ð<0åà²'î>ù0²'î âh³'ò{öDõXõ<öõ>ö(öýÿíÌ/åjõýÿí<0å)ö;ö}öµ'øÈ´'æ â |'Ø´'ì´'äð²'éµ'âð²'ìÿê0²'æä”µ'p6 ôápä¸'謶'äĶ'舷'h&p6 ä<µ'ä´µ'ãá̵'p6 äĵ'<µ'æ äܵ'”µ' ¶'ÿèäT¶'äD¶'䀀â<µ'âµå 쀶'œ1 äp¶'ê â<µ'èÌ/圶'ê âD¶' è>ùܵ'îâø¶'ò{öDõ-öýÿíÌ/å;ö}öè·'ø°·'æ â P'À·'Ô·'äD¶'ìâD¶'ÿäܵ'æäh¸'ìþôápä,»'蜹'ä´¹'èº'h&ìþä¸'䈸'ãá ¸'ìþ䘸'¸'æ ä°¸'h¸' ì¸'ÿèä(¹'ä¹'䀀â¸'â´å ìT¹'œ1 äD¹'ê â¸'䀹'Ì/åp¹'ê â¹' è<0åp¹'î>ù°¸'îâè¹'ò{öDõýÿíÌ/å%öýÿí<0å;ö}ö»'ø¸º'æ â |'Ⱥ'ܺ'ä¹'èðº'â¹'ìâ¹'ÿä°¸'æä„»'8wôápäH¾'踼'äм'謽'h&8wä,»'䤻'ãá¼»'8wä´»',»'æ äÌ»'„»' ¼'ÿèäD¼'ä4¼'䀀â,»'â³å ìp¼'œ1 ä`¼'ê â,»'䜼'Ì/匼'ê â4¼' è<0匼'î>ùÌ»'îâ½'ò{öDõýÿíÌ/å/öýÿí<0å;ö}ö ¾'øÔ½'æ â |'ä½'ø½'ä4¼'è ¾'â4¼'ìâ4¼'ÿäÌ»'æä ¾'˜ ôápädÁ'èÔ¿'äì¿'èÈÀ'h&˜ äH¾'äÀ¾'ãáؾ'˜ äо'H¾'æ äè¾' ¾' $¿'ÿèä`¿'äP¿'䀀âH¾'â²å 쌿'œ1 ä|¿'ê âH¾'丿'Ì/娿'ê âP¿' è<0娿'î>ùè¾'îâ À'ò{öDõýÿíÌ/å*öýÿí<0å;ö}ö<Á'øðÀ'æ â|'áÁ'Á'äP¿'è(Á'âP¿'ìâP¿'ÿäè¾'æä¼Á'héôápä€Ä'èðÂ'äÃ'èäÃ'h&héädÁ'äÜÁ'ãáôÁ'héäìÁ'dÁ'æ äÂ'¼Á' @Â'ÿèä|Â'älÂ'䀀âdÁ'â±å ì¨Â'œ1 ä˜Â'ê âdÁ'äÔÂ'Ì/åÄÂ'ê âlÂ' è<0åÄÂ'î>ùÂ'îâ<Ã'ò{öDõýÿíÌ/å-öýÿí<0å;ö}öXÄ'ø Ä'æ â |'Ä'0Ä'älÂ'èDÄ'âlÂ'ìâlÂ'ÿäÂ'æäØÄ'0dõápä|'è Æ'ä$Æ'é Ç'h&0då€Ä'äøÄ'ãáÅ'0dåÅ'€Ä'æ ä Å'ØÄ' \Å'ÿèä˜Å'äˆÅ'䀀â€Ä'â°å ìÄÅ'œ1 ä´Å'ê â€Ä'äðÅ'Ì/åàÅ'ê âˆÅ' è<0åàÅ'î>ù Å'îâXÆ'ò{öDõýÿíÌ/å+öýÿí<0å;ö}ötÇ'ø(Ç'æ â |'8Ç'LÇ'äˆÅ'è`Ç'âˆÅ'ìâˆÅ'ÿä Å'æôÇ' Éä¬Ç'áÄÇ' Éìá ÜÇ'Dñ xäâå”á¼RäâÈ'Dñä ÄÇ'È'”å ÜÇ'0È'¬¢ä$È'DNæLÈ'ÐAä@È'êhÈ'¤] ä\È'\³æ„È'DZäxÈ'ê È'`œä”È'ê¼È'ŒÍä°È'äOæØÈ'`“ä ÌÈ'äOäôÈ'4à äèÈ'¼RæÉ'Ìýä É'¼RäÔÉ'Lä É',É'æätÉ'ðöâpèVPä¬É'êh&D™ä,É'ä”É'ãåðå¤É',É'âÀÉ'äxrìâ¼RèðÉ'DÅ ääÉ'äqæ @Ë'äýœÊ'áÊ'ÀräýDÊ'HÿæÔó æäpÊ'ä¼Rä€âxrèæP&åŒÊ'ê â,É' è¤Ê'ÀräýèÊ'Hÿæ4ò æäË'ä¼Râ€âxrèæP&å0Ë'ê âäq ä"ØÌ'ä.(Ì'PË'Àrä.”Ë'Hÿæð æäÀË'ä,É'ä€âxrììË'œ1 äÜË'ì âxrèð*åÌ'ì âÌ' ä æè0Ì'Àrä.tÌ'Hÿæìî æä Ì'ääq䀀âxrì¼Ì'œ1 äÜË'îð*åÌ'êˆÍ'L¸ äèÌ'ôÌ'æä<Í'L¸ õâpèÁätÍ'êh&°ê äôÌ'ä\Í'ãåL¸ älÍ'ôÌ'ê,É'è¤Í'ää˜Í'PqæøÍ']ä´Í'âÀr]äKîÿÿÿÿóà€æ"€;(`/ÜÎ'Î'Àr`/LÎ'PHÿæ¬æ æäxÎ'ä8ýä€âxrì”Î'œ1 äÜË'ð0"á°Î'$zêIî¬ö ôâœÏ'äÎ'Àr`/(Ï'âHÿæÐá æäTÏ'ä8ýä€âxrìpÏ'œ1 äÜË'ðLwäŒÏ'ê âxr äøÐ'¤Ï'Àr`/èÏ'âHÿæð× æäÐ'ä8ýä€âxrì0Ð'œ1 äÜË'ìLÐ'LwäŒÏ'êhÐ'¨óô°Ð'@)á„Ð'ðIêôØ átátðæ0"áÌÐ'$zêIî¬ö ôâ Ò'áÑ'Àr`/DÑ'âHÿætÑ æäpÑ'ä8ýä€âxrìŒÑ'œ1 äÜË'ì¨Ñ'|,å¼RêÄÑ'@)ù0"áàÑ'$zêIî¬ö ôâÓ'Ò'Àr`/XÒ'âHâÿâ Ê æä„Ò'ä8ýä€âxrì Ò'œ1 äÜË'ì¼Ò'|,å¼Rî0"áØÒ'$zêIî¬ö ôâÔ' Ó'Àr`/PÓ'HÿædÆ æä|Ó'ä8ýä€âxrì˜Ó'œ1 äÜË'ì´Ó'@)õÐÓ'T#ù0"áìÓ'$zêIî¬ö ôæ Ô'Àr`/\Ô'ë$Õ'äîäˆÔ'ä8ýäâxrì¤Ô'œ1 äÜË'ìÀÔ'Hý ä!ìÜÔ'<: ä!ð0"áøÔ'$zêIî¬ö ôâ ˜!ªrtÕ'âŒØ'`/ âŒÕ'üt !ö<¬ âì:öýÿíDñä(öýÿí0"å)öùÿõùÿõ{öùÿõýÿí,nä(öýÿíHý ä,öýÿí<: ä,öýÿí0"å,öýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}þÜØ'âpÝ'@\#âôØ'ü<Ü'öÄð{öùÿõýÿí$m ä<öýÿíÄä>öýÿíLwä;öùÿõ>õ(ö*öýÿí|,åkõÿÿô)öùÿõýÿíLwä.öýÿíÌoä(öýÿíÄä(ö*öýÿí|,åpõ)ö)ö;öùÿõDõýÿíLwä;öùÿõ}öh&@\xÜ'âîŒØ'äX\îä8Ý'ä”Ü'äâ âá t¤Ü'ÈÜ'ä¸Ü'è íÝ'âÜÜ'è âÜìÜ'è¸Ü'ìâÝ'è â¯$Ý'è¸Ü'èTÝ'|,å¼Rîˆ$ä¸Ü'ôÀÝ'â´ß't® ÿäÞ'òØÝ'ÄððÝ'áCò ’ îh&t® DÞ'âîpÝ'äˆ[îäÈÞ'ä`Þ'æâ âpÞ' ä â ¸?€Þ'¤Þ'ä”Þ'è ðâ¸Þ'è äæ,ß'¨·ääÞ'ì âôÞ' ä â ¸?ß'ß'ä”Þ'ìâ¸Þ'ìLwäHß'ì âXß' ä âá thß'|ß'ä”Þ'èß'â¸Þ'ìâ¤ß'è äîà'ââ't® ÿäLà'òà'Äð4à'áCò ’ îh&t® ˆà'âî´ß'ä8Pîä á'ä¤à'æâ â´à' ä â ¸?Äà'èà'äØà'è ðâüà'è äæpá'¨·ä(á'ì â8á' ä â ¸?Há'\á'äØà'ìâüà'èøá'LwäŒá'ì âœá' ä âá t¬á'Àá'äØà'èÔá'âüà'ìâèá'è äêØ®åØà'ôdâ'âxä'á1ÿä¬â'ò|â'Äð”â'áCò ’ îh&á1èâ'âîâ'ä¼Oîälã'äã'æâ âã' ä â ´g$ã'Hã'ä8ã'è ðâ\ã'è äæðã'èÚäˆã'ì â˜ã' ä â ´g¨ã'Ìã'ä¼ã'è ðâàã'è äêLwä ä'ê âä' ä âá t,ä'@ä'ä¼ã'èTä'âàã'ìâhä'è äîÈä'âÜæ'P1ÿäå'òàä'Äðøä'áCò ’ îh&P1Lå'âîxä'ätJîäÐå'ähå'æâ âxå' ä â ¸?ˆå'¬å'äœå'è ðâÀå'è äæTæ'¨·äìå'ì âüå' ä â ¸? æ'0æ'ä æ'è ðâDæ'è äêLwäpæ'ì â€æ' ä âá tæ'¤æ'ä æ'è¸æ'âDæ'ìâÌæ'è äî,ç'âôé'¼S âtç'ü|è'òDç'Äð\ç'áCò ’ î{öùÿõýÿíä1ä.öýÿí¼Sä(öýÿíì¿ä)ö;öùÿõ}öh&¼S¸è'îÜæ'äÀIîäÔè'ìâ|é'ä1äðè'ì ãé' ä âá té'4é'ä$é'è ìXé'âHé'è äêâlé'è äêì¿ä˜é'ì â¨é' ä âá t¸é'Ìé'ä$é'èàé'âHé'ìâlé'ðDê'âí'¸âŒê'üÜë'ò\ê'Äðtê'áCò ’ î{öùÿõDõýÿíì¿ä.öýÿíR ä(öýÿíä1ä)ölõÿÿô;öùÿõ}öh&¸ì'îôé'äIîä4ì'ìâpì'ä1äPì'ê â`ì'æ ðì¿äŒì'ê âœì' ä âá t¬ì'Àì'ä`ì'èäì'âÔì'è äêâøì'è äîXí'âð'¸â í'üðî'òpí'Äðˆí'áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ömõÿÿô;öùÿõ}öh&¸,ï'îí'äpHîäHï'ìâðï'ä1ädï'ê âtï' ä âá t„ï'¨ï'ä˜ï'è ìÌï'â¼ï'è äêâàï'è äêì¿ä ð'ê â˜ï'îlð'â|ó'¸â´ð'üò'ò„ð'Äðœð'áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ömõÿÿô;öùÿõ}öh&¸@ò'îð'äLîä\ò'ìâó'ä1äxò'ê âˆò' ä âá t˜ò'¼ò'ä¬ò'è ìàò'âÐò'è äêâôò'è äêì¿ä ó'ê â0ó' ä âá t@ó'Tó'ä¬ò'èhó'âÐò'ìâôò'ðÌó'âö'ðâô'üdõ'òäó'Äðüó'áCò ’ î{öùÿõDõýÿíì¿ä.öýÿíR ä(öýÿíä1ä)ömõÿÿô;öùÿõ}öh&ð õ'î|ó'äðKîä¼õ'ìâøõ'ä1äØõ'ê âèõ'æ ðì¿äö'ê â$ö' ä âá t4ö'Hö'äèõ'èlö'â\ö'è äêâ€ö'è äîàö'â¤ù'ðâ(÷'üxø'òøö'Äð÷'áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ölõÿÿô;öùÿõ}öh&ð´ø'îö'ä„KîäÐø'ìâxù'ä1äìø'ê âüø' ä âá t ù'0ù'ä ù'è ìTù'âDù'è äêâhù'è äêì¿ä”ù'ê â ù'îôù'âý'ðâ<ú'üŒû'ò ú'Äð$ú'áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ölõÿÿô;öùÿõ}öh&ðÈû'î¤ù'åKîääû'ìâŒü'ä1åü'ê âü' ä âá t ü'Dü'ä4ü'è ìhü'âXü'è äêâ|ü'è äêì¿ä¨ü'ê â¸ü' ä âá tÈü'Üü'ä4ü'èðü'âXü'ìâ|ü'ðTý'â(Ìâœý'üìþ'òlý'Äð„ý'áCò ’ î{öùÿõDõýÿíì¿ä.öýÿíR ä(öýÿíä1ä)ö<öÿÿô;öùÿõ}öh&Ì(ÿ'îý'ä8ÆîäDÿ'ìâ€ÿ'ä1ä`ÿ'ê âpÿ'æ ðì¿äœÿ'ê â¬ÿ' ä âá t¼ÿ'Ðÿ'äpÿ'èôÿ'âäÿ'è äêâ(è äîh(â,(Ìâ°(ý(ò€(Äð˜(áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ö>öÿÿô;öùÿõ}öh&Ì<(î(äôÆîäX(ìã(ä1ät(ê â„( ä âá t”(¸(ä¨(è ìÜ(âÌ(è äêâð(è äêì¿ä(ê â¨(î|(âŒ(ÌâÄ(ü(ò”(Äð¬(áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ö>öÿÿô;öùÿõ}öh&ÌP(î,(äØÃîäl(ìâ(ä1äˆ(ê â˜( ä âá t¨(Ì(ä¼(è ìð(âà(è äêâ(è äêì¿ä0(ê â@( ä âá tP(d(ä¼(èx(âà(ìâ(ðÜ(â  (¸â$(üt(òô(Äð (áCò ’ î{öùÿõDõýÿíì¿ä.öýÿíR ä(öýÿíä1ä)ö>öÿÿô;öùÿõ}öh&¸°(îŒ(ä$ÄîäÌ(ìâ (ä1äè(ê âø(æ ðì¿ä$ (ê â4 ( ä âá tD (X (äø(è| (âl (è äêâ (è äîð (â´ (¸â8 (üˆ (ò (Äð (áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ö<öÿÿô;öùÿõ}öh&¸Ä (î  (äPÄîäà (ì∠(ä1äü (ê â ( ä âá t (@ (ä0 (è ìd (âT (è äêâx (è äêì¿ä¤ (ê â0 (î (â(¸âL (üœ(ò (Äð4 (áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ö<öÿÿô;öùÿõ}öh&¸Ø(î´ (ä(Åîäô(ìâœ(ä1ä(ê â ( ä âá t0(T(äD(è ìx(âh(è äêâŒ(è äêì¿ä¸(ê âÈ( ä âá tØ(ì(äD(é(âh(ìâŒ(ðd(â((`4â¬(üü(ò|(Äð”(áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ökõÿÿô;öùÿõ}öh&`48(î(äÂîäT(ìâü(ä1äp(ê â€( ä âá t(´(ä¤(è ìØ(âÈ(è äêâì(è äêì¿ä(ê â¤(îx(â<(`4âÀ(ü(ò(Äð¨(áCò ’ î{öùÿõDõýÿíì¿ä.öýÿíR ä(öýÿíä1ä)ökõÿÿô;öùÿõ}öh&`4L(î((ä´Âîäh(ìâ¤(ä1ä„(ê â”(æ ðì¿äÀ(ê âÐ( ä âá tà(ô(ä”(è(â(è äêâ,(è äîŒ(â¼(`4âÔ(üD(ò¤(Äð¼(áCò ’ î{öùÿõDõýÿíä1ä.öýÿíèê ä(ö)ökõýÿíì¿ä.öýÿíèê ä(ö)öhõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)ökõÿÿô;öùÿõ}öh&`4€(î<(ä8Ãîäœ(ìâD(ä1ä¸(ê âÈ( ä âá tØ(ü(äì(è ì (â(è äêâ4(è äêì¿ä`(ê âp( ä âá t€(”(äì(è¨(â(ìâ4(ð (âÐ(5âT(ü¤(ò$(Äð<(áCò ’ î{öùÿõDõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)öjõÿÿô;öùÿõ}öh&5à(î¼(ä|Ãîäü(ìâ¤(ä1ä(ê â(( ä âá t8(\(äL(è ì€(âp(è äêâ”(è äêì¿äÀ(ê âL(î (âä (5âh(ü¸(ò8(ÄðP(áCò ’ î{öùÿõDõýÿíì¿ä.öýÿíR ä(öýÿíä1ä)öjõÿÿô;öùÿõ}öh&5ô(îÐ(äH·îä (ìâL (ä1ä, (ê â< (æ ðì¿äh (ê âx ( ä âá tˆ (œ (ä< (èÀ (â° (è äêâÔ (è äî4!(âd%(5â|!(üì#(òL!(Äðd!(áCò ’ î{öùÿõDõýÿíä1ä.öýÿíèê ä(ö)öjõýÿíì¿ä.öýÿíèê ä(ö)öiõýÿíä1ä.öýÿíR ä(öýÿíì¿ä)öjõÿÿô;öùÿõ}öh&5($(îä (䀷îäD$(ìâì$(ä1ä`$(ê âp$( ä âá t€$(¤$(ä”$(è ìÈ$(â¸$(è äêâÜ$(è äêì¿ä%(ê â%( ä âá t(%(<%(ä”$(èP%(â¸$(ìâÜ$(ð´%(âÔ)(âü%(ü<((òÌ%(Äðä%(áCò ’ î{öùÿõDõýÿí$m ä<öýÿíÄä,öýÿîCä,öýÿí ’ ä>ö(öýÿíä1ä)ö.öýÿí° ä(öÿÿìæ,öýÿíì¿ä)ö;öùÿõ}öh&x((îd%(ä$³îä)(ä”((äâ âá t¤((È((ä¸((è ìì((âÜ((è äêã)(è 俏)(ä1ä,)(ê â<)( ä âá tL)(p)(ä`)(è ì”)(â„)(è äêâ¨)(è äêì¿ä`)(ô$*(â$.(âl*(ü|,(ò<*(ÄðT*(áCò ’ î{öùÿõDõýÿí$m ä<öýÿíÄä,öýÿîCä,öýÿí ’ ä>ö(öýÿíä1ä)ö.öýÿí° ä(öýÿíì¿ä)ö;öùÿõ}öh&¸,(îÔ)(ä´îäP-(äÔ,(äâ âá tä,(-(äø,(è ì,-(â-(è äêâ@-(è äæø-(ä1äl-(ê â|-( ä âá tŒ-(°-(ä -(è ìÔ-(âÄ-(è äêâè-(è äêì¿ä.(ê â -(ît.(â”2(â¼.(üü0(òŒ.(Äð¤.(áCò ’ î{öùÿõDõýÿí$m ä<öýÿíÄä,öýÿîCä,öýÿí ’ ä>ö(öÿÿìæ,öýÿíä1ä)ö.öýÿí° ä(öýÿíì¿ä)ö;öùÿõ}öh&81(î$.(䤵îäÐ1(äT1(äâ âá td1(ˆ1(äx1(è ì¬1(âœ1(è äêâÀ1(è äæü1(ä1äì1(ì ðì¿ä2(ê â(2( ä âá t82(L2(äì1(èp2(â`2(è äêâ„2(è äîä2(âä6(â,3(ü<5(òü2(Äð3(áCò ’ î{öùÿõDõýÿí$m ä<öýÿíÄä,öýÿîCä,öýÿí ’ ä>ö(öýÿíä1ä)ö.öýÿí° ä(öýÿíì¿ä)ö;öùÿõ}öh&x5(î”2(ä\¶îä6(ä”5(äâ âá t¤5(È5(ä¸5(è ìì5(âÜ5(è äêã6(è äæL6(ä1ä,6(ê â<6(æ ðì¿äh6(ê âx6( ä âá tˆ6(œ6(ä<6(èÀ6(â°6(è äêâÔ6(è äî47(âìv&â|7(üŒ9(òL7(Äðd7(áCò ’ î{öùÿõDõýÿí$m ä<öýÿíÄä,öýÿîCä,öýÿí ’ ä>ö(öýÿíä1ä)ö.öýÿí° ä(öýÿíì¿ä)ö;öùÿõ}öh&È9(îä6(äP±îä`:(ää9(äâ âá tô9(:(ä:(è ì<:(â,:(è äêâP:(è äæ;(ä1ä|:(ê âŒ:( ä âá tœ:(À:(ä°:(è ìä:(âÔ:(è äêâø:(è äêì¿ä$;(ê â4;( ä âá tD;(X;(ä°:(èl;(âÔ:(ìâø:(è<(ì.ä;(Àrì.Ô;(âHÿæ ¨ æå<(ä8ýä €âxrðœ1 äÜË'ì"4>(2Ô<(,<(Àr2p<(Hÿç¦ æäœ<(äŒÏ'ä€âxrì¸<(œ1 äÜË'ðLwäŒÏ'ê„=(Ü<(Àr2 =(HÿæÔ£ æäL=(äŒÏ'ä€âxrìh=(œ1 äÜË'ð|,å¼RîŒ=(Àr2Ð=(Hÿ戡 æäü=(äŒÏ'ä€âxrì>(œ1 äÜË'ðT#õ"d?(Hý Ð>(D>(ÀrHý ˆ>(HÿæPŸ æä´>(ä,É'ä€âxrðœ1 äÜË'ðØ>(ÀrHý ?(Hÿæ0 æäH?(ääq䀀âxrðœ1 äÜË'ê”@(<: á@(t?(Àr<: ¸?(Hÿ昚 æää?(ä,É'ä€âxrðœ1 äÜË'ð@(Àr<: L@(Hÿæ˜ æäx@(ääq䀀âxrðœ1 äÜË'ê"ÄA(|) 0A(¤@(Àr|) è@(Hÿæø• æäA(äôÌ'ä€âxrðœ1 äÜË'ð8A(Àr|) |A(HÿæØ“ æä¨A(äPq䀀âxrðœ1 äÜË'ê"ôB(<Þ`B(ÔA(Àr<ÞB(Hÿ攑 æäDB(äôÌ'ä€âxrðœ1 äÜË'ðhB(Àr<Þ¬B(Hÿæ æäØB(äPq䀀âxrðœ1 äÜË'êC(èê äC(Àrèê HC(Hÿæ@ æätC(쀀âxrðœ1 äÜË'ê,D(l‹ä C(Àrl‹äC(Hÿæh‹ æäD(쀀âxrðœ1 äÜË'êÈD(¼ß äövõýÿíàúä>ö(ö)ö)ö;öùÿõ}öøU(ÌoäPU(ÀrÌo”U(Hÿæ æäÀU(ì€âxrìÜU(œ1 äÜË'ðT#õ”V(övõýÿíàúä>ö(ö)ö)ö;öùÿõ}ö"Àf(Ðà¼^(ø](ÀrÐà<^(Hÿæ¬éæäh^(äŒÏ'ä€âxrì„^(œ1 äÜË'ì ^(PGøLwäŒÏ'êÀ_(Ä^(ÀrÐà_(HÿæŒææä4_(äŒÏ'ä€âxrìP_(œ1 äÜË'ìl_(PGôˆ_(LwäŒÏ'ê¤_(àFø@)õ¨`(È_(ÀrÐà `(Hÿæ˜ãæä8`(äŒÏ'ä€âxrìT`(œ1 äÜË'ìp`(¨óôŒ`(|,å¼Rî@)õta(°`(ÀrÐàô`(Hÿæxàæä a(äŒÏ'ä€âxrìövõýÿíàúä>ö(ö)ö)ö;öùÿõ}ö˜x(TmäŒw(ÀrTmÐw(âHÿæIæäüw(쀀âxrìx(œ1 äÜË'ê4x(|,å¼RìPx(@)ù¨ólx(ð4ÿêPy(¼Sä¨x(Àr¼Sìx(âHÿæBæäy(ì€âxrì4y(œ1 äÜË'ðLwäŒÏ'ììy( ãä`y(Àr ã¤y(Hÿæ¸@æäÐy(ä¼R âxrðœ1 äÜË'êˆz(8X äüy(Àr8X @z(âHÿæ`<æälz(ä¼R âxrðœ1 äÜË'ê${(Hƒå ˜z(ÀrHƒáÜz(Hÿæˆ:æä{(ä\³ä€€âxrðœ1 äÜË'ê"ü~(°Ú $|(4{(Àr°Ú x{(Hÿæœ6æä¤{(쀀âxrìÀ{(œ1 äÜË'êÜ{(LwäŒÏ'î¨óø{(ð4ÿê }(,|(Àr°Ú p|(âHÿæÈ(æäœ|(쀀âxrì¸|(œ1 äÜË'êÔ|(|,å¼Rêð|(¨óø@)õ~(}(Àr°Ú X}(Hÿæ|%æä„}(쀀âxrì }(œ1 äÜË'ê¼}(|,å¼Rî¨óØ}(ð4ÿî ~(Àr°Ú P~(âHÿæ`æä|~(쀀âxrì˜~(œ1 äÜË'ê´~(T#ù¨óÐ~(ð4ÿê"Ô‚(ð!ü( (Àrð!P(Hÿælæä|(쀀âxrì˜(œ1 äÜË'ê´(LwäŒÏ'î¨óÐ(ðIêTátátðâä€(€(Àrð!H€(âHÿæ æät€(쀀âxrì€(œ1 äÜË'꬀(|,å¼RêÈ€(¨óø@)õÜ(ì€(Àrð!0(HÿæÄæä\(쀀âxrìx(œ1 äÜË'ê”(|,å¼Rî¨ó°(ðIêÌátátðæä(Àrð!(‚(âHÿæ¸ûæäT‚(쀀âxrìp‚(œ1 äÜË'ꌂ(T#ù¨ó¨‚(ðIê°üátátðâ"¬†(<ÍÔƒ(ä‚(Àr<Í(ƒ(HÿæÌ÷æäTƒ(쀀âxrìpƒ(œ1 äÜË'ꌃ(LwäŒÏ'î¨ó¨ƒ(ð4ÿ꼄(܃(Àr<Í „(âHÿæ°ìæäL„(쀀âxrìh„(œ1 äÜË'ê„„(|,å¼Rê „(¨óø@)õ´…(Ä„(Àr<Í…(Hÿædéæä4…(쀀âxrìP…(œ1 äÜË'êl…(|,å¼Rî¨óˆ…(ð4ÿî¼…(Àr<Íá†(âHÿæáæä,†(쀀âxrìH†(œ1 äÜË'êd†(T#ù¨ó€†(ð4ÿꄊ(Xì‡(¼†(ÀrXÃá‡(HÿæœÝæä,‡(쀀âxrìH‡(œ1 äÜË'êd‡(LwäŒÏ'î¨ó€‡(ðIê„Þátátð┈(´‡(ÀrXÃø‡(âHÿæàÏæä$ˆ(쀀âxrì@ˆ(œ1 äÜË'ê\ˆ(|,å¼Rêxˆ(¨óø@)õŒ‰(œˆ(ÀrXÃàˆ(HÿæŒÌæä ‰(쀀âxrì(‰(œ1 äÜË'êD‰(|,å¼Rî¨ó`‰(ðIê”Íátátðæ”‰(ÀrXÃ؉(âHÿæÂæäŠ(쀀âxrì Š(œ1 äÜË'ê<Š(T#ù¨óXŠ(ðIêÃátátðâ"\Ž(`Å „‹(”Š(Àr`Å ØŠ(Hÿæ$¾æä‹(쀀âxrì ‹(œ1 äÜË'ê<‹(LwäŒÏ'î¨óX‹(ð4ÿêlŒ(Œ‹(Àr`ŠЋ(âHÿ戱æäü‹(쀀âxrìŒ(œ1 äÜË'ê4Œ(|,å¼RêPŒ(¨óø@)õd(tŒ(Àr`Å ¸Œ(Hÿæ<®æääŒ(쀀âxrí(œ1 äÜË'ê(|,å¼Rî¨ó8(ð4ÿîl(Àr`Å °(âHÿæP¦æäÜ(쀀âxrìø(œ1 äÜË'êŽ(T#ù¨ó0Ž(ð4ÿê"4’(xF \(lŽ(ÀrxF °Ž(Hÿæ\¢æäÜŽ(쀀âxrìøŽ(œ1 äÜË'ê(LwäŒÏ'î¨ó0(ðIêD£átátðâD(d(ÀrxF ¨(âHÿæ(”æäÔ(쀀âxrìð(œ1 äÜË'ê (|,å¼Rê((¨óø@)õ<‘(L(ÀrxF (HÿæÔæä¼(쀀âxrìØ(œ1 äÜË'êô(|,å¼Rî¨ó‘(ðIêÜ‘átátðæD‘(ÀrxF ˆ‘(âHÿæ@†æä´‘(쀀âxrìБ(œ1 äÜË'êì‘(T#ù¨ó’(ðIê8‡átátðâ`“(¤ØäD’(Àr¤Øˆ’(âHÿæÄæä´’(äxr䀀âxrìÐ’(œ1 äÜË'ê “(¨óì’(ð4ÿî@)á4“(ðIêØ€átátðâ"¼˜(R ”(p“(ÀrR ´“(HÿæÀ{æäà“(쀀âxrìü“(œ1 äÜË'îLwäŒÏ'ë•( ”(ÀrR d”(Hÿæ´wæä”(쀀âxr쬔(œ1 äÜË'êÈ”(PGôä”((øLwäŒÏ'ê –(•(ÀrR L•(âHÿæŒpæäx•(쀀âxr씕(œ1 äÜË'ê°•(PGôÌ•((ôè•(LwäŒÏ'ê–(àFø„ôЖ((–(ÀrR l–(Hÿæ(mæä˜–(쀀âxrì´–(œ1 äÜË'î|,å¼R긗(Ø–(ÀrR —(Hÿæ¼iæäH—(쀀âxrìd—(œ1 äÜË'ꀗ(PGôœ—((ø|,å¼RîÀ—(ÀrR ˜(âHÿæ˜]æä0˜(쀀âxrìL˜(œ1 äÜË'êh˜(PGô„˜((ô ˜(|,å¼Rî„ô"ì™( I X™(̘(Àr I ™(Hÿæ¼í æä<™(ä¼Rä€âxrðœ1 äÜË'ð`™(Àr I ¤™(HÿæŒì æäЙ(ä¼R âxrðœ1 äÜË'ꈚ(è”äü™(Àrè”@š(Hÿæœê æälš(ì€âxrèæÔÎô"Ø¡(,nLž(˜š(Àr,nÔš((ä<’îå›(ìâxrì›(œ1 äÜË'ì8›(Hý ä\!&ìT›(<: ä\!&ìp›(0"å$zîˆ$ä8™&ì 0"&ªrÜ›(âö(öýÿíHý ä)ö,öXõ<öýÿíÄä>ö(öýÿí<: ä)ö,öýÿí0"å)ö;öùÿõ}úTž(Àr,nž(îHŸ(äì•î伞(ìâxrìØž(œ1 äÜË'ìôž(Hý ä˜%&ìŸ(<: ä˜%&ì,Ÿ(0"å$zîˆ$äx˜&ì l&&ªr˜Ÿ(⌛(,nâ°Ÿ(üø$&ö<¬ âì{öùÿõýÿí,ä(öýÿíHý ä,öýÿí<: ä,öýÿí0"å,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öˆº(,ä«(è¡(Àr,$¢(âîÜ¢(䈕îäP¢(ìâxrìl¢(œ1 äÜË'숢(Hý ä¬)&줢(<: ä¬)&ìÀ¢(ˆ$ä$zîˆ$äÈHì 0*&ªr,£(âHŸ(,\âD£(ü )&ö<¬ âì{öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõýÿí”å=öÿÿô;öùÿõ;õ(öýÿíHý äkõýÿí<: ä)öùÿõ{öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíHý äkõýÿí<: ä;öpõýÿíHý ä)öùÿõ*öOõaõ*öýÿíHý ä;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öùÿõ}ö˜·(ì«(Àr,(¬(âîà¬(äd¢îäT¬(ìâxrìp¬(œ1 äÜË'쌬(Hý äà3&쨬(<: äà3&ìĬ(ˆ$ä$zîˆ$ä|Gì d4&ªr0­(âÜ¢(,nâH­(ü@3&öœö âì{öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öÿÿô;öùÿõýÿí”å=öÿÿô;öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíHý ä,öýÿí<: ä)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿí Éä=öýÿí@)å;öùÿõýÿí@)å=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿí@)å+öÿÿìæ)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíHý ä,öýÿí<: ä,öýÿí”å)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí@)å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿíDñä.öýÿíä=öýÿí@)å;öùÿõ}öùÿõ}öœ¸( ·(Àr,ä·(Hÿæ æä¸(ì€âxrì,¸(œ1 äÜË'ìH¸(Hý ä¼Rìd¸(<: ä¼R쀸(0"å$zîˆ$ääDì ¹(¤¸(Àr,è¸(âHÿæ· æä¹(ì€âxrì0¹(œ1 äÜË'ìL¹(Hý ä¼Rêh¹(<: ä¼Rꄹ(ˆ$ä$zîˆ$ääDð¨¹(Àr,ì¹(âHÿæd« æäº(ì€âxrì4º(œ1 äÜË'ìPº(@)õlº(T#ùˆ$ä$zê"pÁ(Dì¾(˜º(ÀrDìÔº(îp»(䘡îå»(äŒÏ'äâxrì»(œ1 äÜË'ì8»(l ää?&ìT»(R ää?&ðˆ$ä8™&ì |@&ªrÀ»(âà¬(DìâØ»(üD?&ö<¬ âì{öùÿõDõýÿí° ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÄä>ö(öýÿíR ä)ö)ö;öùÿõ}ú ¾(ÀrDì\¾(îø¾(äà î䈾(äŒÏ'äâxr줾(œ1 äÜË'ìÀ¾(l äÌC&ìܾ(R äÌC&ðˆ$äx˜&ì dD&ªrH¿(âp»(Dìâ`¿(ü,C&ö<¬ âì{öùÿõDõýÿíü©ä(öýÿíl ä,öýÿíR ä,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}ö€Ï(ü©øÆ(€Á(Àrü©¼Á(âîXÂ(ä4 îäèÁ(äŒÏ'äâxrìÂ(œ1 äÜË'ì Â(l äŒG&ì<Â(R äŒG&ðˆ$äÈHì ÔG&ªr¨Â(âø¾(ü©-âÀÂ(üìF&ö<¬ âì{öùÿõýÿí$m äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí$m ä&öýÿí,Rä=öýÿíL´ä;öùÿõDõýÿíü©ä(öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö°Í(áÇ(Àrü©<Ç(âîØÇ(ä\¥îähÇ(äŒÏ'äâxrì„Ç(œ1 äÜË'ì Ç(l äM&ì¼Ç(R äM&ðˆ$ä|Gì dM&ªr(È(âXÂ(ü©:â@È(ü|L&öœö âì{öùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõýÿíDZäýÿí´ä=öýÿíèê ä(ö)ö;öùÿõýÿíd8ä(öýÿí´ä+öýÿí\yä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí I ä(ö)ö+öýÿí´ä)ö;öùÿõDõ*öOõ;öùÿõ}ö˜Î(¸Í(Àrü©üÍ(âHÿæP æä(Î(äŒÏ'ä€âxrìDÎ(œ1 äÜË'ì`Î(l ä¼Rê|Î(R ä¼Rîˆ$ääDð Î(Àrü©äÎ(HÿæD æäÏ(äŒÏ'ä€âxrì,Ï(œ1 äÜË'ìHÏ(l ä¼RìdÏ(R ä¼Rðˆ$ääDì"hÖ(h» Ó(Ï(Àrh» ÌÏ(îhÐ(äà¤îäøÏ(äŒÏ'äâxrìÐ(œ1 äÜË'ì0Ð(l äüS&ìLÐ(R äüS&ðˆ$ä8™&ì ”T&ªr¸Ð(âØÇ(h» âÐÐ(ü\S&ö<¬ âì{öùÿõDõýÿíL¢ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÄä>ö(öýÿíR ä)ö)ö;öùÿõ}úÓ(Àrh» TÓ(îðÓ(äP¤îä€Ó(äŒÏ'äâxrìœÓ(œ1 äÜË'ì¸Ó(l ääW&ìÔÓ(R ääW&ðˆ$äx˜&ì |X&ªr@Ô(âhÐ(h» âXÔ(üDW&ö<¬ âì{öùÿõDõýÿí„&ä(öýÿíl ä,öýÿíR ä,ö õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}ö ã(„&ðÛ(xÖ(Àr„&´Ö(âîP×(ä(£îäàÖ(äŒÏ'äâxrìüÖ(œ1 äÜË'ì×(l ä¤[&ì4×(R ä¤[&ðˆ$äÈHì ì[&ªr ×(âðÓ(„&-â¸×(ü[&ö<¬ âì{öùÿõýÿí$m äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí$m ä&öýÿí,Rä=öýÿíL´ä;öùÿõDõýÿí„&ä(öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}öÐá(øÛ(Àr„&4Ü(âîÐÜ(ät¨îä`Ü(äŒÏ'äâxrì|Ü(œ1 äÜË'ì˜Ü(l ä4a&ì´Ü(R ä4a&ðˆ$ä|Gì |a&ªr Ý(âP×(„&1â8Ý(ü”`&öœö âì{öùÿõùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõýÿíd8ä(öýÿí\yä,ö[õ)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí I ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö¸â(Øá(Àr„&â(âHÿæpðæäHâ(äŒÏ'ä€âxrìdâ(œ1 äÜË'ì€â(l ä¼Rêœâ(R ä¼Rîˆ$ääDðÀâ(Àr„&ã(Hÿædìæä0ã(äŒÏ'ä€âxrìLã(œ1 äÜË'ìhã(l ä¼Rì„ã(R ä¼Rðˆ$ääDì"Ðë(?Èç(°ã(Àr?ìã(îÀä(ä\§îää(äŒÏ'äâxrì4ä(œ1 äÜË'ìPä(¨óôlä(ˆÏôˆä(l ätg&ì¤ä(R ätg&ðˆ$ä8™&ì h&ªrå(âÐÜ(?â(å(üœf&ö<¬ âì{öùÿõDõýÿ팓å(öýÿí¨óä,öýÿíˆÏä,öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÄä>ö(öýÿíR ä)ö)ö;öùÿõ}úÐç(Àr? è(îàè(䔲îä8è(äŒÏ'äâxrìTè(œ1 äÜË'ìpè(¨óôŒè(ˆÏô¨è(l äôk&ìÄè(R äôk&ðˆ$äx˜&ì Œl&ªr0é(âÀä(?âHé(ük&ö<¬ âì{öùÿõDõýÿí° ä(öýÿí¨óä,öýÿíˆÏä,öýÿíl ä,öýÿíR ä,öùÿõ õýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öœ)° ò(àë(Àr° ì(âîðì(ä4²îäHì(äŒÏ'äâxrìdì(œ1 äÜË'ì€ì(¨óôœì(ˆÏô¸ì(l ädp&ìÔì(R ädp&ðˆ$äÈHì ¬p&ªr@í(âàè(° 2âXí(üŒo&ö<¬ âì{öùÿõýÿí$m äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí$m ä&öýÿí,Rä=öýÿíL´ä;öùÿõDõýÿí° ä(öýÿí¨óä,öýÿíˆÏä,öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öùÿõýÿí@Rä(ö)ö)ö;öùÿõ}ö\)ò(Àr° Lò(âî ó(䜱îäxò(äŒÏ'äâxrì”ò(œ1 äÜË'ì°ò(¨óôÌò(ˆÏôèò(l ä¤v&ìó(R ä¤v&ðˆ$ä|Gì ìv&ªrpó(â ðì(° [áˆó(üÌu&öœö âì{öùÿõ;õ(öýÿí¨óä>öýÿíèê ä(ö)ö)öùÿõùÿõPõýÿíÀÍ ä(öüÿí)'â)ö;öùÿõùÿõùÿõýÿíDZäýÿí|Ùä=öýÿí˜ ä(öýÿíˆÏä,öýÿíèê ä(ö)ö-öýÿí¨óä)ö;öùÿõýÿíDZäýÿí\yä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí\yä>öýÿí¼ß ä(ö)öhõýÿíèê ä(ö)ö-öýÿí|Ùä>öýÿí¼ß ä(ö)ö-öýÿí\yä)öùÿõùÿõPõýÿíà0 ä(öüÿí8)#â)ö;öùÿõùÿõýÿíDZäýÿí|½å=öýÿíèê ä(ö)ö-öýÿí|Ùä+öýÿí\yä;öùÿõùÿõ;õ(öýÿí|½å>öýÿíÔÎä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí4à äýÿíL´ä=öýÿíDñä.öýÿí¤vä(öýÿíè”ä(öýÿí|½å)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä,öýÿí”å,öýÿí¨óä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿíL´ä+öýÿí¨óä)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿîCävõýÿíTmä(öýÿíL´ä+öýÿí¨óä+öýÿí\yä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öùÿõýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿíL´ä+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíDñä.öýÿíä+öÿÿìæ)ö;öùÿõýÿí”å=öýÿíL´ä;öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí|½å)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõ;õ(öýÿí”åkõÿÿô)öùÿõ{öùÿõýÿîCävõýÿí¬ùä(öýÿí”å+öýÿí¨óä+öýÿí\yä,öýÿí”å+öýÿí¨óä+öýÿí|Ùä,öùÿõýÿíèê ä(ö)ö-ö(öýÿí¨óä+öýÿí|Ùä)ö)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí”å+öýÿí¨óä)ö;öùÿõýÿîCävõýÿíL¢ä(ö*ö(öýÿí”å+öýÿí|½å)ö,öýÿíÄä(ö)ö)ö;öùÿõýÿí Éä=öýÿí|½å;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá|)d)Àr° ¨)âHÿæ”TæäÔ)äŒÏ'ä€âxrìð)œ1 äÜË'ì )¨óô()ˆÏôD)l ä¼Rê`)R ä¼Rîˆ$ääDð„)Àr° È)HÿæPæäô)äŒÏ'ä€âxrì)œ1 äÜË'ì,)¨óôH)ˆÏôd)l ä¼Rì€)R ä¼Rðˆ$ääDìœ)d8ä¬)Àrd8ð)âHÿæp æä)ì€âxrì8)œ1 äÜË'ìT)@)ùTmp)ð4êþL)0V ä¬)Àr0V è) ÿèä)ì!ãxrì0)èÜË'ÿì´W ä\)Àr´W ˜) ÿèäÄ)ì!ãxrìà)èÜË'ÿè)ð$)âDNìâ\³ìâ¼Ræ Ð)€)˜pî â˜)ö´ ñ{öùÿõDõýÿíL#ä[ö-öýÿí@)å-öÿÿìæ]ö;öùÿõ}ö T))èoî â)ö´ ñ{öùÿõýÿíL#äaõýÿí@)å;öùÿõDõ*öOõ;öùÿõ}ö Ø)ˆ)ˆnî â )ö´ ñ{öùÿõýÿíL#äbõýÿí@)å;öùÿõDõ*öOõ;öùÿõ}ö D) )8oî â$)ö´ ñ{öùÿõDõýÿíL¸ ä(öýÿíL#ä+öýÿí@)å)ö;öùÿõ}ö ° )x)Ømî â)ö´ ñ{öùÿõDõýÿíL¸ ä(öýÿíL#ä-öýÿí@)å)ö;öùÿõ}ö ¬")ä )(mîâü )öü" ð{öùÿõýÿíL¸ äýÿí`Tä=ö*öOõ;öùÿõpõýÿíL#ä;öùÿõDõýÿí`Tä;öùÿõ}ö $)à")œlî âø")öü" ð{öùÿõpõýÿíL#ä;öùÿõDõ*öOõ;öùÿõ}ö &)L$)ìkîâd$)öü" ð{öùÿõýÿíL¸ äýÿí`Tä=ö*öOõ;öùÿõqõýÿíL#ä;öùÿõDõýÿí`Tä;öùÿõ}ö €')H&)Pkî â`&)öü" ð{öùÿõqõýÿíL#ä;öùÿõDõ*öOõ;öùÿõ}ö ))´')¼jî âÌ')öü" ð{öùÿõDõ&ö(öJõ*ö(ö)ö)ö;öùÿõ}ö ¸*)8))(jîâP))öü" ð{öùÿõýÿíü" äýÿí`Tä=öýÿíL#ä;öùÿõDõ*öqõýÿí`Tä;öùÿõ}ö ¬+)ì*)”iîâ+)öü" ð{öùÿõDõýÿíL#ä;öùÿõ}ö Ð,)à+)\Ãî âø+)öü" ð:öýÿíL#ä(öýÿíÌ/å)öùÿõ{öùÿõ}ú-)ÀÂîâ-)öü" ð{öùÿõ}ö/)øŒ-)æ â $Hœ-)ä-)ä°-)è â À-)L âðPÐ-)è”Áè,.)âø-)è â .)ÐA âðP.)è”Áèt.)â@.)è â P.)`œ âðP`.)è”Áè¼.)âˆ.)è â ˜.)4à âðP¨.)è”ÁìâÐ.)è â à.)ŒÍ âðPð.)è”Áè,/)ø|ÁæT/)ø´Áæ|/)øÐÁæ¤/)ø ÂæÌ/)øpÂæô/)øÀÂæ0)ø\ÃæD0)ø”iæl0)ø(jæ”0)ø¼jæ¼0)øPkæä0)øìkæ 1)øœlæ41)ø(mæ\1)øØmæ„1)øˆnæ¬1)ø8oæÔ1)øèoæü˜pæ2)œFä 2)ˆâ$2)¨‘ä x42)„ÿ ä ¬L2)¸PäD2)ðâ\2)ŒÍä l2)¤U ä p|2)lä ØŒ2) ä@ä l_ œ2)°äDä¸Pä´2)ðæ¼"ãóè2)è ð<0å3)ê â$3) ä âõ43)èè2)ð˜3)â5)Ì â°3)üˆ4)öe ð{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}öh&ÌÄ4)îH3)ä„ïäà4)ìâ@5)Ì/åü4)ê â 5) ä âõ5)è05)è ð<0å\5)ê âl5) ä âõ|5)è05)ðà5)â 8)ð âø5)ü7)öe ð{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}öh&ðT7)î5)äØ~ïäp7)ìâÐ7)Ì/åŒ7)ê âœ7) ä âõ¬7)èÀ7)è ð<0åì7)ê âü7) ä âõ 8)èÀ7)ðp8)âÈ:)¸ âˆ8)üÀ9)öe ð{öùÿõDõýÿíÌ/å.öýÿí˜Îä<öýÿí<0å.öýÿí˜Îä;öùÿõ}öh&¸ü9)î 8)äL~ïä:)ìâx:)Ì/å4:)ê âD:) ä âõT:)èh:)è ð<0å”:)ê â¤:) ä âõ´:)èh:)ð;)âX=)`4 â0;)üP<)öe ð{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`4Œ<)îÈ:)ä°}ïä¨<)ìâ=)Ì/åÄ<)ê âÔ<) ä âõä<)èø<)è ð<0å$=)ê â4=) ä âõD=)èø<)ð¨=)ã@)5 âÀ=)üø>)öe ð{öùÿõDõýÿíÌ/å.öýÿí˜Îäjõýÿí<0å.öýÿí˜Îä;öùÿõ}öh&54?)îX=)ä(}ïäP?)ìâ°?)Ì/ål?)ê â|?) ä âõŒ?)è ?)è ð<0åÌ?)ê âÜ?) ä âõì?)è ?)ðP@)âÜB)¸ âh@)ü A)öe ð{öùÿõDõýÿíÌ/å.öýÿí˜Îä-öýÿí<0å.öýÿí˜Îä;öùÿõ}öh&¸ÜA)ï@)äÌ|ïäö(ö!öýÿí0"å.öýÿíøtä(öýÿí¼"å)ö)ö;öùÿõ}öh&`4ÌG)îHE)ä¸{ïäèG)ìâlH)0"åH)ê âH) ä â "$H)HH)ä8H)è ðâ\H)è äê¼"åˆH)ê â˜H) ä â "¨H)¼H)ä8H)ìâ\H)ð I)â°K)5 âPI)üpJ)ò8I)ÄõCî{öùÿõDõýÿí0"å.öýÿíøtä(öýÿí¼"å)ö;öùÿõ}öh&5¬J)îÐH)ä8FïäÈJ)ìâLK)0"åäJ)ê âôJ) ä â "K)(K)äK)è ðâñ0L)ÄîHL)áCòðSî{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿí„`äkõýÿí<0å.öýÿí„`ä)ö;öùÿõ}öh&`4dN)î°K)ä°Eïä€N)ìâLO)Ì/åœN)ê â¬N) ä â ðƒ¼N)àN)äÐN)è ìO)âôN)è äæ(O)âO)è äêâñXP)ÄîpP)áCòðSî{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿí„`äjõýÿí<0å.öýÿí„`ä)ö;öùÿõ}öh&5ŒR)îØO)ä¼Mïä¨R)ìâtS)Ì/åÄR)ê âÔR) ä â ðƒäR)S)äøR)è ì,S)âS)è äæPS)â@S)è äêâdS)è äê<0åS)ê â S) ä â ðƒ°S)ÄS)äøR)èØS)âS)èìS)â@S)ìâdS)ðPT)â\W)Xÿâ€T)üxV)òhT)Ð ô î{öùÿõDõýÿíà‡ ä<öýÿíÐ ä>ö(öýÿíÌ/å,ö õýÿíÐ ävõýÿíLä(öýÿíP&å)ö)ö;öùÿõ}öh&Xÿ´V)ïT)ä`MïäW)äÐV)äâ â›àV)èôV)è ì0W)Ì/å W)ì âôV) èP&åLW)ì äî¬W)â´Y)Ðï âÄW)üüX)öÐ ð{öùÿõDõýÿíܦä<öýÿíÐ ä>ö(öýÿíÌ/å)ö;öùÿõ}öh&Ðï 8Y)î\W)ä¨LïäˆY)äTY)äâ âô¨dY)èxY)è ðÌ/å¤Y)ì âxY) ìZ)â \)Hj âZ)üT[)öÐ ð{öùÿõDõýÿí\D ä<öýÿíÐ ä>ö(öýÿíÌ/å)ö;öùÿõ}öh&Hj[)î´Y)ä˜Kïäà[)ä¬[)äâ âè´¼[)èÐ[)è ðÌ/åü[)ì âÐ[) ì\\)âh_)ât\)ü<^)ö´ ñ{öùÿõDõýÿíL¸ ä<öýÿí´ å>ö(öýÿíÌ/å.öýÿí¼e ä(ö)ö-öýÿí@)å)ö;öùÿõ}öh&x^)âî \)ätJïäÈ^)ä”^)äâ âÜÀ¤^)è¸^)è ì_)@)åä^)ì â ô^)`œ âÜÀ_)è¸^)ìÌ/å4_)ê âD_) ä âÜÀT_)è¸^)ð¸_)â¤b)¸âÐ_)üha)ö´ ñ{öùÿõDõýÿí<0å.öýÿí¼e ä(ö)ö-öýÿíÌ/å.öýÿí¼e ä(ö)ö;öùÿõ}öh&¸¤a)îh_)ä´Iïäb)äÀa)äâ â Ða)`œ âÜÀàa)èôa)è ìTb)Ì/å b)ê â0b) ä âÜÀ@b)èôa)ì<0åpb)ê â€b) ä âÜÀb)èôa)ðôb)âö(öýÿíÌ/å.öýÿí¼e ä(ö)ömõýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&ðpe)âî¤b)ä(IïäŒe)ìâìe)Ì/å¨e)ê â¸e) ä âÜÀÈe)èÜe)è ð<0åf)ê âf) ä âÜÀ(f)èÜe)ðŒf)âÔi)¸â¤f)üÌh)ö´ ñ{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿí¼e ä(ö)ölõýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&¸i)îö(öýÿíÌ/å.öýÿí¼e ä(ö)ö<öýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&Ì l)îÔi)äpVïä¼l)ìâm)Ì/åØl)ê âèl) ä âÜÀøl)è m)è ð<0å8m)ê âHm) ä âÜÀXm)è m)ð¼m)âq)`4âÔm)üüo)öü" ð{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿí¼e ä(ö)ökõýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&`48p)îlm)äøUïäTp)ìâ´p)Ì/åpp)ê â€p) ä âÜÀp)è¤p)è ð<0åÐp)ê âàp) ä âÜÀðp)è¤p)ðTq)âœt)¸âlq)ü”s)ö´ ñ{öùÿõDõXõ<öõ>ö(öýÿíÌ/å.öýÿí¼e ä(ö)ö>öýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&¸Ðs)îq)ä\_ïäìs)ìâLt)Ì/åt)ê ât) ä âÜÀ(t)èö(öýÿíÌ/å.öýÿí¼e ä(ö)öjõýÿí<0å.öýÿí¼e ä(ö)ö)ö;öùÿõ}öh&5hw)îœt)ä€^ïä„w)ìâäw)Ì/å w)ê â°w) ä âÜÀÀw)èÔw)è ð<0æx)ê âx) ä âÜÀ x)èÔw)ì´>ãì{öùÿõ}úœx)¤³`/Øx)ÿèäy)ìã\³ì y)èL¶ø$zê"ä{)4¬”z)Ly)¤³4¬0z)Hÿæy)æp¯4¬Ìy)ÿèäøy)äü¯ä€€â¯â^åz)œ1 äèµîÌ/åT°ìä\z)ä¼R䀀â\³ìxz)œ1 äL¶îÌ/åäOðœz)¤³4¬€{)Hÿæàz)æp¯4¬{)ÿèäH{)äü¯â€€â¯â_åd{)œ1 äèµîÌ/åT°êä¬{)ä¼R â\³ìÈ{)œ1 äL¶îÌ/åäOê$~)¤väô{)¤³¤vL})Hÿæ8|)æp¯¤vt|)ÿèä |)äü¯ä€â¯â`å¼|)œ1 äèµìØ|)@)ù ˆ$ô|)8ýê28ýä })ü4ÿêäx})ä¼Rä€â\³ì”})œ1 äL¶ì°})@)ù ˆ$Ì})8ýê28ýäø})ü4ÿê´)”j ä4~)¤³”j 4)Hÿæx~)æp¯”j ´~)ÿèäà~)ì€â¯âaåü~)œ1 äèµì)ð*åü¯ðˆ$ôä`)ì€â\³ì|)œ1 äL¶ì˜)ð*å¼Rðˆ$ôì€)¼ß äÄ)¤³¼ß ˜€)Hÿæ€)æp¯¼ß D€)ÿèäp€)Œ€)耀â¯âbéœ1 äèµöäÄ€)à€)耀â\³ðœ1 äL¶öœ‚)xå ü€)¤³xá‚)Hÿæ@)æ p¯xá|)ÿèä¨)ì€â¯âcåÄ)œ1 äèµìà)ð*åü¯ð4 äü)ê â ‚) ä ìäH‚)ì€â\³ìd‚)œ1 äL¶ì€‚)ð*å¼Rð4 ääOêôƒ)$ò䬂)¤³$òƒ)Hÿæð‚)æp¯$ò,ƒ)ÿèäXƒ)ì€â¯âdåtƒ)œ1 äèµðð*åü¯ì伃)ì€â\³ì؃)œ1 äL¶ðð*å¼Rð2ä„)¤³2@„)ÿèäl„)ä$zäã\³ìˆ„)èL¶ø$zþЄ)¬• äÈ„)l²âì„)DZäà„)ê…)`œäü„)ê$…)4à ä…)8ýæ@…)Ìýä 4…)8ýä\…)ÐAäP…)êt…)8* äl…)Ô±æ2ä„…)L²2À…)ÿèäü…)äì…)äãl²ì âl² ä(†)è†)ì âl²ðì…)ê\†)8* äT†)Ô±æ@îäl†)x†)æ ⯈†)蜆)è æè´>ãÿèl†)æäD‡) § 蘎)èBp䄟)è ØŽ)È’)ì¡)蔾) h& § äì†)äd‡) ãá|‡) § ät‡)ì†)âL‰)`/ˆˆ)Œ‡)D‡)`/ȇ)âÿèäô‡)ì€âì†)âSå ˆ)œ1 äˆ)ì âì†)è ©<ˆ)hˆ)ì4ÿê âxˆ)æ ðˆ)D‡)`/̈)âÿèäøˆ)@‰)è€âì†)âTå‰)œ1 äˆ)ð@îä0‰)ê âì†) ðì‰)ì.ä\‰)D‡)ì.˜‰)âÿèäĉ)à‰)è €âì†)âUéœ1 äˆ)ø¨Š)2äü‰)D‡)28Š)âÿèä dŠ)œŠ)0‰)ä€âì†)âV倊)œ1 äˆ)ðì¿ä0‰)÷!Œ)Th‹)¸Š)D‡)TôŠ)ÿèä @‹)\‹) ‹)ä€âì†)âWå â0‹)æ ðœ1 äˆ)üp‹)D‡)T¬‹)ÿèä Ø‹)ô‹) ‹) âì†)âXéœ1 äˆ)ö"H)„°Œ)Œ)D‡)„LŒ)ÿèä ˆŒ)¤Œ)xŒ)ä€âì†)âYå â0‹) èœ1 äˆ)ü¸Œ)D‡)„ôŒ)ÿèä )<)xŒ) âì†)âZéœ1 äˆ)öè)à¡å X)D‡)à¡á”)ÿèä À)Ü) ‹)âP€€âì†) â[éœ1 äˆ)öˆŽ)Tà äø)D‡)Tà 4Ž)ÿèä`Ž)|Ž)耀âì†) â\éœ1 äˆ)öÈŽ)è:嘎)á°Ž)è:á ‹)èå\ ¬¨ì\ ä °Ž)ðŽ)>öCâ)è â )´’)äp)À¡ôápä$Pè ‘)丑)èd’)h&À¡ä)ä)ãá¨)À¡ä ))âh)$òä¸)p)$òô)ÿèä )\)è€â)âQáæ©ä<)ì âL)æ ü8* äx)€)âäØ)8* ôápä)J)ä`‘)ðx‘)âp)8* ä€)äø)ãá‘)8* ä‘)€)æ@îä ‘),‘)æ â)<‘)èP‘)è æè´>ãÿè ‘)æä>ù¸)îâì‘)ò{öGõýÿí©ä;ö}öŒ’)ø¸)æü€)ð0‹)èâ“) § èX“)èBpè‡)ät)èh&@näÈ’)ä0“) ãáH“) § ä@“)È’)∓)è:åX“)áp“)è:á¼Rèå\ ¬¨ä☓)\ ä"p“)X•)`/Œ”)¨“)“)`/ì“)âHâÿ⌇)æä”)ä8ýä€âÈ’)ìD”)œ1 ä4”)ì âÈ’)è ©`”)¼Rì4ÿî””)“)`/Ø”)âHÿæˆ)æä •)L•)8ýä€âÈ’)ì •)œ1 ä4”)ð@îä<•)ê âÈ’) ñ–)ì.äh•)“)ì.¬•)âHâÿâ\‰)æä Ø•)ô•)8ýä €âÈ’)ðœ1 ä4”)øÄ–)2ä–)“)2T–)âHÿæü‰)æä €–)¸–)<•)ä€âÈ’)윖)œ1 ä4”)ðì¿ä<•)ö" ˜)Tl—)Ô–)“)T—)Hÿ渊)æä D—)`—)¼Rä€âÈ’)ðœ1 ä4”)üt—)“)T¸—)Hÿæp‹)æää—)á˜)¼R âÈ’)ðœ1 ä4”)ö"T™)„´˜)˜)“)„`˜)HÿæŒ)æä Œ˜)¨˜)äOä€âÈ’)ðœ1 ä4”)ü¼˜)“)„á™)Hÿ渌)æä ,™)H™)äO âÈ’)ðœ1 ä4”)öü™)Tà äd™)“)Tà ¨™)Hÿæø)æäÔ™)ð™)耀âÈ’)ðœ1 ä4”)öœ)¸‡ ä š)“)¸‡ Pš)Hâꤚ)ôX)æä |š)˜š)¼RâR„€âÈ’)ðœ1 ä4”)ö›),›)ççäçæáááxýâœ1 4”)âá@ÆâXš äD›)ä2¼Räp›)üáÌ'䜛)üÈ›)䨛)ü âÈ’)æ:œ)äý âÈ›)æÄœ)0V ä$œ)“)0V `œ) ÿè䌜)ì!ãÈ’)쨜)è4”)ÿì´W äÔœ)“)´W ) ÿèä<)ì!ãÈ’)ìX)è4”)ÿèˆ)ôâœ)èää)hõãpèNž)䨡)êh&PÚäœ)äž)ãåhäž)œ)âätž)hôápä€)è ” )œ)¬ )舡)h&häž)䔞)ãᬞ)h䤞)ž)âlŸ)$ò伞)tž)$òøž)ÿèä$Ÿ)`Ÿ)è€âž)âRáæ©ä@Ÿ)ì âPŸ)æ ü8* ä|Ÿ)„Ÿ)âäÜŸ)8* ôápäž)Nž)äT )ðl )âtž)8* 䄟)äüŸ)ãá )8* ä  )„Ÿ)æ@îä$ )0 )æ âž)@ )èPŸ)ì´>ãÿè$ )æä>ù¼ž)îâà )ò{öGõ[ö]öýÿí©ä;ö}ö°¡)ø¼ž)æü„Ÿ)ü H¤) ¢)ø)îâP¢)ò8¢)>öCî{öùÿõ;õ(öýÿí\ äjõÿÿô)öùÿõDõ[õ;öùÿõDõ*öýÿí\ äkõÿÿìæ;öùÿõ}ö T¥)|¤)X)î⬤)ò”¤)>öCî{öùÿõDõýÿíè:å;öùÿõ}ö x¦)ˆ¥)¸Œ)î⸥)ò ¥)>öCî{öùÿõDõ*öýÿíè:å;öùÿõ}ö œ§)¬¦)Œ)îâܦ)òĦ)>öCî{öùÿõDõ*öýÿíè:å;öùÿõ}ö ¨¨)Ч)p‹)îã¨)òè§)>öCî{öùÿõDõýÿíè:å;öùÿõ}ö ´©)ܨ)¸Š)îâ ©)òô¨)>öCî{öùÿõDõýÿíè:å;öùÿõ}ö ˜±)è©)ü‰)îPâª)óª)>öCî{öùÿõ;õ(öýÿíè:åkõýÿíì¿ä.öýÿíè:å)öùÿõ{öùÿõ;õ(öýÿí\ äkõÿÿôiõqõ(ö*öýÿí\ ä)öjõÿÿô)öùÿõ{öùÿõýÿîCävõýÿí$òä(öýÿíè:å)ö;öùÿõGõýÿí\ ä;öùÿõ}öùÿõýÿíè:å=öýÿíì¿ä.öýÿíè:å;öùÿõýÿí\ ä=öýÿíì¿ä.öýÿí\ ä;öùÿõ;õ(öýÿí\ äkõÿÿô)öùÿõpõ(ö*öýÿí\ ä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö ,µ)̱)\‰)î"âü±)òä±)>öCî{öùÿõ;õ(öýÿí\ äkõÿÿôiõqõ(ö*öýÿí\ ä)öjõÿÿô)öùÿõ{öùÿõýÿîCävõýÿí$òä(öýÿíè:å)ö;öùÿõGõýÿí\ ä;öùÿõ}öùÿõ}ö ¨¸)`µ)ˆ)î!âµ)òxµ)>öCî:öýÿíè:å(öýÿí@îä.öýÿíè:å)ö,öùÿõýÿí\ ä(öýÿí@îä.öýÿí\ ä)öùÿõ{öùÿõ;õ(öýÿí\ äkõÿÿô)öùÿõpõ(ö*öýÿí\ ä)ö;öùÿõ}úܸ)Œ‡)î;â ¹)òô¸)>öCî:öýÿíè:å(öýÿí©ä)ö,öùÿõýÿí\ ä(öÿÿô)öùÿõ{öùÿõùÿõQõùÿõ{öùÿõ;õ(öýÿíè:åkõÿÿô)öùÿõýÿí\ ä=öIõ õ(öÿÿìæ)ö;öùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿîCävõýÿí$òä(öýÿíè:å)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}ö¼¾)øŒ‡)æä¾)øˆ)æ ¿)ø\‰)æ4¿)øü‰)æ\¿)ø¸Š)æ„¿)øp‹)欿)øŒ)æÔ¿)ø¸Œ)æü¿)øX)æ$À)øø)æü˜Ž)ædÀ)`/\À)dµä`¸|À)4¬tÀ)y)ä àz)ŒÀ)¤vä 8|)œÀ)”j ä x~)¬À)¼ß ä €)¼À)xå@)ä$òäð‚)ä>ñ 8Â)Á)ð‚)î â0Á)ö>ñ{öùÿõýÿíð*årõ~öýÿí>å(ö)ö;öùÿõ}ö 4Ä)lÂ)@)îâ„Â)ö>ñ{öùÿõvõIõ(ö(öõ*ö)öýÿíð*å)öýÿí>å(öýÿí4 ä)ö;öùÿõ}ö HÆ)hÄ)€)îâ€Ä)ö>ñ{öùÿõDõýÿíhää<öýÿíDZä>övõýÿíl„ ä(ö)ö/öEõ(öýÿí>å)ö;öùÿõ}ö È)|Æ)x~)îâ”Æ)ö>ñ{öùÿõùÿõvõJõGõ(ö(öõ*ö)öýÿíð*å)ö;öùÿõ}ö ¸Ê)HÈ)8|)îâ`È)ö>ñ{öùÿõùÿõDõXõ<öýÿí4à ä>ö(övõJõIõ(öýÿí@)å*öEõ(öýÿí>å)ö)ö)ö;öùÿõùÿõ}ö ÄË)ìÊ)àz)îâË)ö>ñ{öùÿõDõ&öýÿíÌ/å;öùÿõ}ö ÐÌ)øË)y)îâÌ)ö>ñ{öùÿõDõ&öýÿíÌ/å;öùÿõ}úÍ)dµîâÍ)ö>ñ{öùÿõ}öŒÍ)øð¯æ´Í)ø,°æÜÍ)øH°æÎ)øt°æ,Î)ø°æTÎ)ø´°è|Î)ødµæ¤Î)øy)æÌÎ)øàz)æôÎ)ø8|)æÏ)øx~)æDÏ)ø€)ælÏ)ø@)æüð‚)æ¨Ï)ä¤ìâÐèÐ)ö(öýÿí– äjõÿÿô)ö;öùÿõ}ö €Ø)×)°Ó)îâÀ×)ò¨×)ÄõCî{öùÿõDõ*öOõ;öùÿõ}ö ¤Ù)´Ø)$Ó)îâäØ)òÌØ)ÄõCî{öùÿõDõ*öOõ;öùÿõ}ö ÈÚ)ØÙ)Ò)îâÚ)òðÙ)ÄõCî{öùÿõDõ*öOõ;öùÿõ}ö ¼Þ)üÚ)ÀÑ)î&â,Û)òÛ)ÄõCî{öùÿõ;õ(öýÿí– äkõÿÿôiõýÿîCävõýÿíÐmä(öýÿí– ärõýÿí|| ä(öýÿíT#å)ö,öýÿîCävõýÿíÔ) ä(ö)ö)ö)öùÿõýÿí– ä=öÿÿô;öùÿõDõ*öOõ;öùÿõ}ö øß)ðÞ)ôÐ)î â ß)òß)ÄõCî:öýÿí– ä(öýÿí|,å)öùÿõ{öùÿõ}ú,à) Ð)î â\à)òDà)ÄõCî:öýÿí– ä(öýÿí|,å.öýÿí¤ä(ö)ö)öùÿõ{öùÿõ}ö¼á)ø˜æäá)øÄæ â)øðæ4â)øÌÏ)æ\â)ø Ð)æ„â)øôÐ)æ¬â)øÀÑ)æÔâ)øÒ)æüâ)ø$Ó)æ$ã)ø°Ó)æLã)ø`Ô)æýÕ)æŒã)°pä„ã)`ïæÇ äï4êþÔä)øÀìðã)â éä)¨ä)ø éHä)|ä)øIê tä)ˆëˆëðætì4êþ4ê þüä)ø íææ)ø í$å)âIêPå)HíôæXå)é„å)äå)øIê°å)Híôæ¸å)4êþIê æ)ˆëˆëðætì@æ)øhíæühíhæ)âIê”æ)Híôæœæ)éÈæ)(ç)øIêôæ)Híôæüæ)4êÿÿÿÿÿÿÿÿ÷Iê Tç)ˆëˆëðæ ípç)äHíìá„ç)á^àã4êÿâ Pé¼ç)àç)äÐç)è ðáôç)á^àã4ÿê4é)øHè)„è)ââ0éXgäÿè è°è)Üè)øIêÐç)øâèé)ü:¬¨äÀîü|ê)ø\é)˜é)ââ0é|®äÿè éÄé)Pê)ø éðé)$ê)øIê ê)PéPéðæHè)4êþ4ê þàê)ø¤ê)æâ0é˜ Ðç)ÿèhë)ø¤ê)ë)âIê4ë)Ðç)ôæ<ë)4ÿêÌë)øë)æâ0él„ Ðç)ÿÿäë)ôë)âIê ì)Ðç)ôæ(ì)4êÿÿÿÿÿÿÿÿ÷lì)`j ädì)Péâ|ì)ŒŸ ä ôèŒì)Xgä Hè)œì)|®ä \é)¬ì)˜ ä¤ê)äl„ ä ë)í)XgäÌì)âhèXgäKâê@öHè)ædí)|®ä í)âhè|®äKâêö\é)æ¸í)˜ ätí)âhè˜ äKâÿâ¤ê)æ î)l„ äÈí)âhèl„ äKâêÿÿÿÿÿÿÿÿïë)ê2äî)hè2Xî)ÿèä”î)ä„î)äã èì â è äÀî)è°î)ì â èð„î)úâï)ôáï)è4ÿêâŒï)`j ôáæ ò)ºëä8ò)âLò)âh& êäDï)ä¬ï)ãáÄï)`j ä¼ï)Dï)âð)ŒŸ äÔï)âŒï)ŒŸ äKâêö(ìælð)Xgä(ð)âŒï)XgäKâê?ötìæÀð)|®ä|ð)âŒï)|®äKâêöÀìæñ)˜ äÐð)âŒï)˜ äKâñ€ï íæhñ)l„ ä$ñ)âŒï)l„ äKâêÿÿÿÿÿÿÿïhíê2äxñ)Œï)2´ñ)ÿèäðñ)äàñ)äãDï)ì âDï) äò)è ò)ì âDï)ðàñ)úâ`ò)ôátò)è4êþâèò)`j ôáæüõ)‚éä”õ)â¨õ)âh&Àä ò)äó)ãá ó)`j äó) ò)âtó)ŒŸ ä0ó)âèò)ŒŸ äKâÿâôèæÈó)Xgä„ó)âèò)XgäKâê öHè)æô)|®äØó)âèò)|®äKâê ö\é)æpô)˜ ä,ô)âèò)˜ äKâÿâ¤ê)æÄô)l„ ä€ô)âèò)l„ äKâêÿÿÿÿóë)ê2äÔô)èò)2õ)ÿèäLõ)ä<õ)äã ò)ì â ò) äxõ)èhõ)ì â ò)ð<õ)úâ¼õ)ôáÐõ)è4ÿêâDö)`j ôáæXù)ºëäðø)âù)âh&(«äüõ)ädö)ãá|ö)`j ätö)üõ)âÐö)ŒŸ äŒö)âDö)ŒŸ äKâêö(ìæ$÷)Xgäàö)âDö)XgäKâêötìæx÷)|®ä4÷)âDö)|®äKâê öÀìæÌ÷)˜ äˆ÷)âDö)˜ äKâí€ÿÿÿÿï íæ ø)l„ äÜ÷)âDö)l„ äKâêÿÿÿóhíê2ä0ø)Dö)2lø)ÿè䍸)ä˜ø)äãüõ)ì âüõ) äÔø)èÄø)ì âüõ)ð˜ø)úâù)ôá,ù)è4êþâ ù)`j ôáæ´ü)‚éäLü)â`ü)âh&,iäXù)äÀù)ãáØù)`j äÐù)Xù)â,ú)ŒŸ äèù)â ù)ŒŸ äKâÿâôèæ€ú)Xgä<ú)â ù)XgäKâê öHè)æÔú)|®äú)â ù)|®äKâê ö\é)æ(û)˜ ääú)â ù)˜ äKâÿâ¤ê)æ|û)l„ ä8û)â ù)l„ äKâêÿÿÿÿóë)ê2äŒû) ù)2Èû)ÿèäü)äôû)äãXù)ì âXù) ä0ü)è ü)ì âXù)ðôû)úâtü)ôáˆü)è4ÿêâüü)`j ôáæ*ºëä¨ÿ)â¼ÿ)âh&DÏä´ü)äý)ãá4ý)`j ä,ý)´ü)âˆý)ŒŸ äDý)âüü)ŒŸ äKâêö(ìæÜý)Xgä˜ý)âüü)XgäKâêötìæ0þ)|®äìý)âüü)|®äKâê öÀìæ„þ)˜ ä@þ)âüü)˜ äKâí€ÿÿÿÿï íæØþ)l„ ä”þ)âüü)l„ äKâêÿÿÿóhíê2äèþ)üü)2$ÿ)ÿèä`ÿ)äPÿ)äã´ü)ì â´ü) äŒÿ)è|ÿ)ì â´ü)ðPÿ)úâÐÿ)ôáäÿ)è4êþâX*`j ôáæl*‚éä*â*âh& Ôä*äx*ãá*`j äˆ**âä*ŒŸ ä *âX*ŒŸ äKâÿâôèæ8*Xgäô*âX*XgäKâêöHè)æŒ*|®äH*âX*|®äKâêö\é)æà*˜ äœ*âX*˜ äKâÿâ¤ê)æ4*l„ äð*âX*l„ äKâêÿÿõë)ê2äD*X*2€*ÿèä¼*ä¬*äã*ì â* äè*èØ*ì â*ð¬*úâ,*ôá@*è4ÿêâ´*`j ôáæÈ*ºëä`*ât*âh&œïäl*äÔ*ãáì*`j ää*l*â@*ŒŸ äü*â´*ŒŸ äKâêö(ìæ”*XgäP*â´*XgäKâêötìæè*|®ä¤*â´*|®äKâêöÀìæ<*˜ äø*â´*˜ äKâë€ÿÿÿÿÿÿï íæ*l„ äL*â´*l„ äKâêÿõhíê2ä *´*2Ü*ÿèä*ä*äãl*ì âl* äD*è4*ì âl*ð*úâˆ*ôáœ*è4êþâ*`j ôáæ$ *‚éä¼ *âÐ *âh&d2äÈ*ä0*ãáH*`j ä@*È*âœ*ŒŸ äX*â*ŒŸ äKâÿâôèæð*Xgä¬*â*XgäKâêöHè)æD*|®å*â*|®äKâêö\é)æ˜*˜ äT*â*˜ äKâÿâ¤ê)æì*l„ ä¨*â*l„ äKâêÿÿõë)ê2äü**28 *ÿèät *äd *äãÈ*ì âÈ* ä  *è *ì âÈ*ðd *úâä *ôáø *è4ÿêâl *`j ôáæ€ *‚éä *â, *âh&´º ä$ *äŒ *ãᤠ*`j äœ *$ *âø *ŒŸ ä´ *âl *ŒŸ äKâÿâôèæL *Xgä *âl *XgäKâêöHè)æ  *|®ä\ *âl *|®äKâêö\é)æô *˜ ä° *âl *˜ äKâÿâ¤ê)æH *l„ ä *âl *l„ äKâêÿöë)ê2äX *l *2” *ÿèäÐ *äÀ *äã$ *ì â$ * äü *èì *ì â$ *ðÀ *úâ@ *ôáT *è4ÿêâÈ *`j ôáæÜ*ºëät*âˆ*âh&8" ä€ *äè *ãâ*`j äø *€ *âT*ŒŸ ä*âÈ *ŒŸ äKâêö(ìæ¨*Xgäd*âÈ *XgäKâêötìæü*|®ä¸*âÈ *|®äKâêöÀìæP*˜ ä *âÈ *˜ äKâê€ÿÿÿÿÿÿÿï íæ¤*l„ ä`*âÈ *l„ äKâêöhíê2ä´*È *2ð*ÿèä,*ä*ä〠*ì †* äX*èH*ì †*ð*úâœ*ôá°*è4êþâ$*`j ôáêºëäÐ*âä*âh&Ø äÜ*äD*ãá\*`j äT*Ü*â°*ŒŸ äl*â$*ŒŸ äKâêö(ìæ*XgäÀ*â$*XgäKâêötìæX*|®ä*â$*|®äKâêöÀìæ¬*˜ äh*â$*˜ äKâê€ÿÿÿÿÿÿÿï íç*l„ ä¼*â$*l„ äKâêöhíê2ä*$*2L*ÿèäˆ*äx*äãÜ*ì âÜ* ä´*è¤*ì âÜ*ðx*úâø*ôá *è4êþ„*häH*âÌçhä îøÀ*˜ ä”*Ìç˜ Ð*î*öèü*è€â„çäˆâö|*ççäçæáááxýâ{á …ä”*ä4ÿéü*l„ äÐ*Ìçl„ *îD*öè8*è€â„çä‰âö¸*ççäçæáááxýâ|á …äÐ*ä4éÿÿÿÿÿÿÿÿ÷H*Xgä *âÌçXgä î@ø”*|®äX*âÌç|®ä îøà*ŒŸ ä¤*âÌ猟 ä ÿè,*àúäð*âÌçàúä îøx*ŒLä<*âÌçŒLä îøÄ*Q äˆ*âÌçQ ä îù*l  äÔ*Ìçl  *îH*öè<*è€â„çäŠâö¼*ççäçæáááxýâŠá …äÔ*ä4ÿê<*ü ä*Ìçü L*î„*öèx*è€â„çä‹âöø*ççäçæáááxýâ‹á …ä*ä4ÿêˆ*Œ%äL*âÌçŒ%ä ÿèÔ*ˆPå˜*âÌçˆPå ÿè *°P ää*âÌç°P ä ÿèl*1ä0*âÌç1ä ÿè¸*D– ä|*âÌçD– ä ÿè*øæäÈ*âÌçøæä ÿèP*(ƒä*âÌç(ƒä ÿèœ*p`å`*âÌçp`á¡ ÿèè*öä¬*âÌçöä ÿè$* äø*Ìç 4*îl*öè`*è€â„çäŒâöà*ççäçæáááxýâ—á …äø*ä4ÿê` *O ä4*ÌçO p*î¨*öèœ*è€â„çäâö *ççäçæáááxýâ˜á …ä4 *ä4ÿêœ!*hFäp *ÌçhF¬ *îä *öèØ *è€â„çäŽâöX!*ççäçæáááxýâ™á …äp!*ä4ÿêØ"*Ìä¬!*ÌçÌè!*î "*öè"*è€â„çäâö”"*ççäçæáááxýâšá …ä¬"*ä4ÿê$#*¶åè"*âÌç¶å ÿèp#*Ä{ ä4#*âÌçÄ{ ä îø¼#*Ð ä€#*âÌçÐ ä îø$*0• äÌ#*âÌç0• ä ÿèT$*ðùä$*âÌçðùä ÿè $*°ÿäd$*âÌç°ÿ”¥ ÿì2ä°$*Ìç2ì$*ÿèä(%*ä%*äã„çì â„ç äT%*èD%*ì â„çð%*î èèöâ à%*häl7*ðpä”7*šä€7*çh&¤”ä˜%*å&*!ãá&*hää&*˜%*â4&*¼e ä(&*Dï)æ€&*häD&*âà%*hä îø¼'*˜ ä&*à%*˜ Ì&*î'*öèø&*è€â˜%*ä€âöx'*ççäçæáááxýâDá …ä'*ä4ð€÷ø(*l„ äÌ'*à%*l„ (*î@(*öè4(*è€â˜%*äâö´(*ççäçæáááxýâEá …äÌ(*ä4éÿÿÿÿÿÿÿ÷D)*Xgä)*âà%*Xgä î?ø)*|®äT)*âà%*|®ä îøÜ)*ŒŸ ä )*âà%*ŒŸ ä îø(**àúäì)*âà%*àúä îøt**ŒLä8**âà%*ŒLä îøÀ**Q ä„**âà%*Q ä îøü+*l  äÐ**à%*l  +*îD+*öè8+*è€â˜%*ä‚âö¸+*ççäçæáááxýâSá …äÐ+*ä4ÿê8-*ü ä ,*à%*ü H,*î€,*öèt,*è€â˜%*äƒâöô,*ççäçæáááxýâTá …ä -*ä4ÿê„-*Œ%äH-*âà%*Œ%ä ÿèÐ-*ˆPå”-*âà%*ˆPå ÿè.*°P äà-*âà%*°P ä ÿèh.*1ä,.*âà%*1ä ÿè´.*D– äx.*âà%*D– ä ÿé/*øæäÄ.*âà%*øæä ÿèL/*(ƒä/*âà%*(ƒä ÿè˜/*p`å\/*âà%*p`á¡ ÿèä/*öä¨/*âà%*öä ÿè 1* äô/*à%* 00*îh0*öè\0*è€â˜%*ä„âöÜ0*ççäçæáááxýâ`á …äô0*ä4ÿê\2*O ä01*à%*O l1*î¤1*öè˜1*è€â˜%*ä…âö2*ççäçæáááxýâaá …ä02*ä4ÿê˜3*hFäl2*à%*hF¨2*îà2*öèÔ2*è€â˜%*ä†âöT3*ççäçæáááxýâbá …äl3*ä4ÿêÔ4*Ìä¨3*à%*Ìä3*î4*öè4*è€â˜%*ä‡âö4*ççäçæáááxýâcá …ä¨4*ä4ÿê 5*¶åä4*âà%*¶å ÿèl5*Ä{ ä05*âà%*Ä{ ä îø¸5*Ð ä|5*âà%*Ð ä îø6*0• äÈ5*âà%*0• ä ÿèP6*ðùä6*âà%*ðùä ÿèœ6*°ÿä`6*âà%*°ÿ”¥ ÿì2ä¬6*à%*2è6*ÿèä$7*ä7*äã˜%*ì â˜%* äP7*è@7*ì â˜%*ð7*îDï)èöâ Ü7*hähI*ðpäI*šä|I*çh&˜Ùä”7*äü7*!ãá8*hää 8*”7*â08*¼e ä$8* ò)æ|8*hä@8*âÜ7*hä îø¸9*˜ äŒ8*Ü7*˜ È8*ï9*öèô8*è€â”7*äxâöt9*ççäçæáááxýâ á …äŒ9*ä4ÿéô:*l„ äÈ9*Ü7*l„ :*î<:*öè0:*è€â”7*äyâö°:*ççäçæáááxýâ á …äÈ:*ä4éÿÿÿÿû@;*Xgä;*âÜ7*Xgä î øŒ;*|®äP;*âÜ7*|®ä î øØ;*ŒŸ äœ;*âÜ7*ŒŸ ä ÿè$<*àúäè;*âÜ7*àúä îøp<*ŒLä4<*âÜ7*ŒLä îø¼<*Q ä€<*âÜ7*Q ä îøø=*l  äÌ<*Ü7*l  =*î@=*öè4=*è€â”7*äzâö´=*ççäçæáááxýâá …äÌ=*ä4ÿê4?*ü ä>*Ü7*ü D>*î|>*öèp>*è€â”7*ä{âöð>*ççäçæáááxýâá …ä?*ä4ÿê€?*Œ%äD?*âÜ7*Œ%ä ÿèÌ?*ˆPå?*âÜ7*ˆPå ÿè@*°P äÜ?*âÜ7*°P ä ÿèd@*1ä(@*âÜ7*1ä ÿè°@*D– ät@*âÜ7*D– ä ÿèü@*øæäÀ@*âÜ7*øæä ÿèHA*(ƒä A*âÜ7*(ƒä ÿè”A*p`åXA*âÜ7*p`á¡ ÿèàA*öä¤A*âÜ7*öä ÿèC* äðA*Ü7* ,B*îdB*öèXB*è€â”7*ä|âöØB*ççäçæáááxýâ'á …äðB*ä4ÿêXD*O ä,C*Ü7*O hC*î C*öè”C*è€â”7*ä}âöD*ççäçæáááxýâ(á …ä,D*ä4ÿê”E*hFähD*Ü7*hF¤D*îÜD*öèÐD*è€â”7*ä~âöPE*ççäçæáááxýâ)á …ähE*ä4ÿêÐF*Ìä¤E*Ü7*ÌàE*îF*öè F*è€â”7*äâöŒF*ççäçæáááxýâ*á …ä¤F*ä4ÿêG*¶åàF*âÜ7*¶å ÿèhG*Ä{ ä,G*âÜ7*Ä{ ä îø´G*Ð äxG*âÜ7*Ð ä îùH*0• äÄG*âÜ7*0• ä ÿèLH*ðùäH*âÜ7*ðùä ÿè˜H*°ÿä\H*âÜ7*°ÿ”¥ ÿì2ä¨H*Ü7*2äH*ÿèä I*äI*äã”7*ì â”7* äLI*èá …ä¼…*ä4ÿê$‡*ü äø…*Ì*ü 4†*îl†*öè`†*è€â„*ä[âöà†*ççäçæáááxýâ?á …äø†*ä4ÿêp‡*Œ%ä4‡*âÌ*Œ%ä ÿ輇*ˆP倇*âÌ*ˆPå ÿèˆ*°P ä̇*âÌ*°P ä ÿèTˆ*1äˆ*âÌ*1ä ÿè ˆ*D– ädˆ*âÌ*D– ä ÿèìˆ*øæä°ˆ*âÌ*øæä ÿè8‰*(ƒäüˆ*âÌ*(ƒä ÿ脉*p`åH‰*âÌ*p`á¡ ÿèЉ*ö䔉*âÌ*öä ÿè ‹* äà‰*Ì* Š*îTŠ*öèHŠ*è€â„*ä\âöÈŠ*ççäçæáááxýâKá …äàŠ*ä4ÿêHŒ*O ä‹*Ì*O X‹*î‹*öè„‹*è€â„*ä]âöŒ*ççäçæáááxýâLá …äŒ*ä4ÿê„*hFäXŒ*Ì*hF”Œ*îÌŒ*öèÀŒ*è€â„*ä^âö@*ççäçæáááxýâMá …äX*ä4ÿêÀŽ*Ìä”*Ì*ÌÐ*îŽ*öèü*è€â„*ä_âö|Ž*ççäçæáááxýâNá …ä”Ž*ä4ÿê *¶åÐŽ*âÌ*¶å ÿèX*Ä{ ä*âÌ*Ä{ ä îø¤*Ð äh*âÌ*Ð ä îøð*0• ä´*âÌ*0• ä ÿè<*ðùå*âÌ*ðùä ÿèˆ*°ÿäL*âÌ*°ÿ”¥ ÿì2ä˜*Ì*2Ô*ÿèä‘*å‘*äã„*ì â„* ä<‘*è,‘*ì â„*ñ‘*î*èöâ È‘*häT£*ðpä|£*šäh£*çh&Ü䀑*äè‘*!ãâ’*hääø‘*€‘*â’*¼e ä’*l*æh’*hä,’*âÈ‘*hä îø¤“*˜ äx’*È‘*˜ ´’*îì’*öèà’*è€â€‘*äPâö`“*ççäçæáááxýâøá …äx“*ä4ê€ÿÿÿÿÿÿ÷à”*l„ ä´“*È‘*l„ ð“*î(”*öè”*è€â€‘*äQâöœ”*ççäçæáááxýâùá …ä´”*ä4éÿý,•*Xgäð”*âÈ‘*Xgä îøx•*|®ä<•*âÈ‘*|®ä îøÄ•*ŒŸ 䈕*âÈ‘*ŒŸ ä îø–*àúäÔ•*âÈ‘*àúä îø\–*ŒLä –*âÈ‘*ŒLä îø¨–*Q äl–*âÈ‘*Q ä îøä—*l  世*È‘*l  ô–*î,—*öè —*è€â€‘*äRâö —*ççäçæáááxýâá …ä¸—*ä4ÿê ™*ü äô—*È‘*ü 0˜*îh˜*öè\˜*è€â€‘*äSâöܘ*ççäçæáááxýâá …äô˜*ä4ÿêl™*Œ%ä0™*âÈ‘*Œ%ä ÿ踙*ˆPå|™*âÈ‘*ˆPå ÿèš*°P äÈ™*âÈ‘*°P ä ÿèPš*1äš*âÈ‘*1ä ÿ蜚*D– ä`š*âÈ‘*D– ä ÿèèš*øæä¬š*âÈ‘*øæä ÿè4›*(ƒäøš*âÈ‘*(ƒä ÿ耛*p`åD›*âÈ‘*p`á¡ ÿèÌ›*öä›*âÈ‘*öä ÿè* äÜ›*È‘* œ*îPœ*öèDœ*è€â€‘*äTâöÄœ*ççäçæáááxýâá …äÜœ*ä4ÿêDž*O ä*È‘*O T*îŒ*öè€*è€â€‘*äUâöáž*ççäçæáááxýâá …äž*ä4ÿꀟ*hFäTž*È‘*hFž*îÈž*ö輞*è€â€‘*äVâö<Ÿ*ççäçæáááxýâá …äTŸ*ä4ÿê¼ *ÌäŸ*È‘*ÌÌŸ*î *öèøŸ*è€â€‘*äWâöx *ççäçæáááxýâá …ä *ä4ÿê¡*¶åÌ *âÈ‘*¶å ÿèT¡*Ä{ ä¡*âÈ‘*Ä{ ä îø ¡*Ð äd¡*âÈ‘*Ð ä îøì¡*0• ä°¡*âÈ‘*0• ä ÿè8¢*ðùäü¡*âÈ‘*ðùä ÿè„¢*°ÿäH¢*âÈ‘*°ÿ”¥ ÿì2䔢*È‘*2Т*ÿèä £*äü¢*ä】*ì ‑* ä8£*è(£*ì ‑*ðü¢*îl*èöâ Ä£*häPµ*ðpäxµ*šädµ*çh&4Šä|£*ää£*!ãáü£*hääô£*|£*â¤*¼e ä ¤*È*æd¤*hä(¤*âÄ£*hä îø ¥*˜ ät¤*Ä£*˜ °¤*îè¤*öèܤ*è€â|£*äHâö\¥*ççäçæáááxýâ¿á …ät¥*ä4ÿéܦ*l„ ä°¥*Ä£*l„ ì¥*î$¦*öè¦*è€â|£*äIâö˜¦*ççäçæáááxýâÀá …ä°¦*ä4éÿÿý(§*Xgäì¦*âÄ£*Xgä îøt§*|®ä8§*âÄ£*|®ä îøÀ§*ŒŸ ä„§*âÄ£*ŒŸ ä ÿè ¨*àúäЧ*âÄ£*àúä îøX¨*ŒLä¨*âÄ£*ŒLä îø¤¨*Q äh¨*âÄ£*Q ä îøà©*l  ä´¨*Ä£*l  ð¨*î(©*öè©*è€â|£*äJâöœ©*ççäçæáááxýâÎá …ä´©*ä4ÿê«*ü äð©*Ä£*ü ,ª*îdª*öèXª*è€â|£*äKâöت*ççäçæáááxýâÏá …äðª*ä4ÿêh«*Œ%ä,«*âÄ£*Œ%ä ÿè´«*ˆPåx«*âÄ£*ˆPå ÿé¬*°P äÄ«*âÄ£*°P ä ÿèL¬*1ä¬*âÄ£*1ä ÿ蘬*D– ä\¬*âÄ£*D– ä ÿèä¬*øæä¨¬*âÄ£*øæä ÿè0­*(ƒäô¬*âÄ£*(ƒä ÿè|­*p`å@­*âÄ£*p`á¡ ÿèÈ­*ö䌭*âÄ£*öä ÿè¯* 䨭*Ä£* ®*îL®*öè@®*è€â|£*äLâöÀ®*ççäçæáááxýâÛá …äØ®*ä4ÿê@°*O ä¯*Ä£*O P¯**öè|¯*è€â|£*äMâöü¯*ççäçæáááxýâÜá …ä°*ä4ÿê|±*hFäP°*Ä£*hFŒ°*îİ*ö踰*è€â|£*äNâö8±*ççäçæáááxýâÝá …äP±*ä4ÿ긲*Ì䌱*Ä£*Ìȱ*ï²*öèô±*è€â|£*äOâöt²*ççäçæáááxýâÞá …äŒ²*ä4ÿê³*¶åȲ*âÄ£*¶å ÿèP³*Ä{ ä³*âÄ£*Ä{ ä îøœ³*Ð ä`³*âÄ£*Ð ä îøè³*0• 䬳*âÄ£*0• ä ÿè4´*ðùäø³*âÄ£*ðùä ÿ耴*°ÿäD´*âÄ£*°ÿ”¥ ÿì2ä´*Ä£*2Ì´*ÿèäµ*äø´*äã|£*ì â|£* ä4µ*è$µ*ì â|£*ðø´*îÈ*èöâ Àµ*häLÇ*ðpätÇ*šä`Ç*çh& Ýäxµ*äàµ*!ãáøµ*hääðµ*xµ*â¶*¼e ä¶*$ *æ`¶*hä$¶*âÀµ*hä îøœ·*˜ äp¶*Àµ*˜ ¬¶*îä¶*öèض*è€âxµ*ä@âöX·*ççäçæáááxýâ†á …äp·*ä4ÿéظ*l„ 䬷*Àµ*l„ è·*î ¸*öè¸*è€âxµ*äAâö”¸*ççäçæáááxýâ‡á …䬸*ä4éÿþ$¹*Xgäè¸*âÀµ*Xgä îøp¹*|®ä4¹*âÀµ*|®ä îø¼¹*ŒŸ 䀹*âÀµ*ŒŸ ä ÿèº*àúä̹*âÀµ*àúä îøTº*ŒLäº*âÀµ*ŒLä îø º*Q ädº*âÀµ*Q ä îøÜ»*l  ä°º*Àµ*l  ìº*î$»*öè»*è€âxµ*äBâö˜»*ççäçæáááxýâ•á …ä°»*ä4ÿê½*ü äì»*Àµ*ü (¼*î`¼*öèT¼*è€âxµ*äCâöÔ¼*ççäçæáááxýâ–á …äì¼*ä4ÿêd½*Œ%ä(½*âÀµ*Œ%ä ÿè°½*ˆPåt½*âÀµ*ˆPå ÿèü½*°P äÀ½*âÀµ*°P ä ÿèH¾*1ä ¾*âÀµ*1ä ÿ蔾*D– äX¾*âÀµ*D– ä ÿèà¾*øæä¤¾*âÀµ*øæä ÿè,¿*(ƒäð¾*âÀµ*(ƒä ÿèx¿*p`å<¿*âÀµ*p`á¡ ÿèÄ¿*ö䈿*âÀµ*öä ÿéÁ* äÔ¿*Àµ* À*îHÀ*öè<À*è€âxµ*äDâö¼À*ççäçæáááxýâ¢á …äÔÀ*ä4ÿê<Â*O äÁ*Àµ*O LÁ*î„Á*öèxÁ*è€âxµ*äEâöøÁ*ççäçæáááxýâ£á …äÂ*ä4ÿêxÃ*hFäLÂ*Àµ*hFˆÂ*îÀÂ*öè´Â*è€âxµ*äFâö4Ã*ççäçæáááxýâ¤á …äLÃ*ä4ÿê´Ä*ÌäˆÃ*Àµ*ÌÄÃ*îüÃ*öèðÃ*è€âxµ*äGâöpÄ*ççäçæáááxýâ¥á …äˆÄ*ä4ÿëÅ*¶åÄÄ*âÀµ*¶å ÿèLÅ*Ä{ äÅ*âÀµ*Ä{ ä îø˜Å*Ð ä\Å*âÀµ*Ð ä îøäÅ*0• ä¨Å*âÀµ*0• ä ÿè0Æ*ðùäôÅ*âÀµ*ðùä ÿè|Æ*°ÿä@Æ*âÀµ*°ÿ”¥ ÿì2äŒÆ*Àµ*2ÈÆ*ÿèäÇ*äôÆ*äãxµ*ì âxµ* ä0Ç*è Ç*ì âxµ*ðôÆ*î$ *èöâ ¼Ç*häHÙ*ðpäpÙ*šä\Ù*çh&àÞätÇ*äÜÇ*!ãáôÇ*hääìÇ*tÇ*âÈ*¼e äÈ*€ *æ\È*hä È*â¼Ç*hä îø˜É*˜ älÈ*¼Ç*˜ ¨È*îàÈ*öèÔÈ*è€âtÇ*ä8âöTÉ*ççäçæáááxýâOá …älÉ*ä4é€ÿÿÿÿÿÿÿ÷ÔÊ*l„ ä¨É*¼Ç*l„ äÉ*îÊ*öèÊ*è€âtÇ*ä9âöÊ*ççäçæáááxýâPá …ä¨Ê*ä4éþ Ë*XgääÊ*â¼Ç*Xgä îølË*|®ä0Ë*â¼Ç*|®ä îø¸Ë*ŒŸ ä|Ë*â¼Ç*ŒŸ ä îøÌ*àúäÈË*â¼Ç*àúä îøPÌ*ŒLäÌ*â¼Ç*ŒLä îøœÌ*Q ä`Ì*â¼Ç*Q ä îøØÍ*l  ä¬Ì*¼Ç*l  èÌ*î Í*öèÍ*è€âtÇ*ä:âö”Í*ççäçæáááxýâ^á …ä¬Í*ä4ÿêÏ*ü äèÍ*¼Ç*ü $Î*î\Î*öèPÎ*è€âtÇ*ä;âöÐÎ*ççäçæáááxýâ_á …äèÎ*ä4ÿê`Ï*Œ%ä$Ï*â¼Ç*Œ%ä ÿè¬Ï*ˆPåpÏ*â¼Ç*ˆPå ÿèøÏ*°P ä¼Ï*â¼Ç*°P ä ÿèDÐ*1äÐ*â¼Ç*1ä ÿèÐ*D– äTÐ*â¼Ç*D– ä ÿèÜÐ*øæä Ð*â¼Ç*øæä ÿè(Ñ*(ƒäìÐ*â¼Ç*(ƒä ÿètÑ*p`å8Ñ*â¼Ç*p`á¡ ÿèÀÑ*öä„Ñ*â¼Ç*öä ÿèüÒ* äÐÑ*¼Ç*  Ò*îDÒ*öè8Ò*è€âtÇ*ä<âö¸Ò*ççäçæáááxýâká …äÐÒ*ä4ÿê8Ô*O ä Ó*¼Ç*O HÓ*î€Ó*öètÓ*è€âtÇ*ä=âöôÓ*ççäçæáááxýâlá …ä Ô*ä4ÿêtÕ*hFäHÔ*¼Ç*hF„Ô*î¼Ô*öè°Ô*è€âtÇ*ä>âö0Õ*ççäçæáááxýâmá …äHÕ*ä4ÿê°Ö*Ìä„Õ*¼Ç*ÌÀÕ*îøÕ*öèìÕ*è€âtÇ*ä?âölÖ*ççäçæáááxýâná …ä„Ö*ä4ÿêüÖ*¶åÀÖ*â¼Ç*¶å ÿèH×*Ä{ ä ×*â¼Ç*Ä{ ä îø”×*Ð äX×*â¼Ç*Ð ä îøà×*0• ä¤×*â¼Ç*0• ä ÿè,Ø*ðùäð×*â¼Ç*ðùä ÿèxØ*°ÿä<Ø*â¼Ç*°ÿ”¥ ÿì2äˆØ*¼Ç*2ÄØ*ÿèåÙ*äðØ*äãtÇ*ì âtÇ* ä,Ù*èÙ*ì âtÇ*ððØ*î€ *èöâ ¸Ù*häDë*ðpälë*šäXë*çh&`ÞäpÙ*äØÙ*!ãáðÙ*hääèÙ*pÙ*â Ú*¼e åÚ*Ü*æXÚ*häÚ*â¸Ù*hä îø”Û*˜ ähÚ*¸Ù*˜ ¤Ú*îÜÚ*öèÐÚ*è€âpÙ*ä0âöPÛ*ççäçæáááxýâá …ähÛ*ä4é€ÿÿÿÿÿÿÿ÷ÐÜ*l„ ä¤Û*¸Ù*l„ àÛ*îÜ*öè Ü*è€âpÙ*ä1âöŒÜ*ççäçæáááxýâá …ä¤Ü*ä4éþÝ*XgäàÜ*â¸Ù*Xgä îøhÝ*|®ä,Ý*â¸Ù*|®ä îø´Ý*ŒŸ äxÝ*â¸Ù*ŒŸ ä îùÞ*àúäÄÝ*â¸Ù*àúä îøLÞ*ŒLäÞ*â¸Ù*ŒLä îø˜Þ*Q ä\Þ*â¸Ù*Q ä îøÔß*l  ä¨Þ*¸Ù*l  äÞ*îß*öèß*è€âpÙ*ä2âöß*ççäçæáááxýâ'á …ä¨ß*ä4ÿêá*ü ääß*¸Ù*ü à*îXà*öèLà*è€âpÙ*ä3âöÌà*ççäçæáááxýâ(á …ääà*ä4ÿê\á*Œ%ä á*â¸Ù*Œ%ä ÿè¨á*ˆPålá*â¸Ù*ˆPå ÿèôá*°P ä¸á*â¸Ù*°P ä ÿè@â*1äâ*â¸Ù*1ä ÿèŒâ*D– äPâ*â¸Ù*D– ä ÿèØâ*øæäœâ*â¸Ù*øæä ÿè$ã*(ƒäèâ*â¸Ù*(ƒä ÿèpã*p`å4ã*â¸Ù*p`á¡ ÿè¼ã*öä€ã*â¸Ù*öä ÿèøä* äÌã*¸Ù* ä*î@ä*öè4ä*è€âpÙ*ä4âö´ä*ççäçæáááxýâ4á …äÌä*ä4ÿê4æ*O äå*¸Ù*O Då*î|å*öèpå*è€âpÙ*ä5âöðå*ççäçæáááxýâ5á …äæ*ä4ÿêpç*hFäDæ*¸Ù*hF€æ*î¸æ*öè¬æ*è€âpÙ*ä6âö,ç*ççäçæáááxýâ6á …äDç*ä4ÿê¬è*Ìä€ç*¸Ù*̼ç*îôç*öèèç*è€âpÙ*ä7âöhè*ççäçæáááxýâ7á …ä€è*ä4ÿêøè*¶å¼è*â¸Ù*¶å ÿèDé*Ä{ äé*â¸Ù*Ä{ ä îøé*Ð äTé*â¸Ù*Ð ä îøÜé*0• ä é*â¸Ù*0• ä ÿè(ê*ðùäìé*â¸Ù*ðùä ÿètê*°ÿä8ê*â¸Ù*°ÿ”¥ ÿì2ä„ê*¸Ù*2Àê*ÿèäüê*äìê*äãpÙ*ì âpÙ* ä(ë*èë*ì âpÙ*ðìê*îÜ*èöâ´ë*häôpèšä$ý*çh&<—älë*äÔë* ãáìë*häääë*lë*â8ì*häüë*â´ë*hä îøtí*˜ äHì*´ë*˜ „ì*î¼ì*öè°ì*è€âlë*ä(âö0í*ççäçæáááxýâæâ …äHí*ä4ÿê°î*l„ ä„í*´ë*l„ Àí*îøí*öèìí*è€âlë*ä)âölî*ççäçæáááxýâçâ …ä„î*ä4êþüî*XgäÀî*â´ë*Xgä îøHï*|®ä ï*â´ë*|®ä ÿè”ï*ŒŸ äXï*â´ë*ŒŸ ä ÿèàï*àúä¤ï*â´ë*àúä îø,ð*ŒLäðï*â´ë*ŒLä îøxð*Q ä<ð*â´ë*Q ä îø´ñ*l  äˆð*´ë*l  Äð*îüð*öèðð*è€âlë*ä*âöpñ*ççäçæáááxýâîâ …äˆñ*ä4ÿêðò*ü äÄñ*´ë*ü áò*î8ò*öè,ò*è€âlë*ä+âö¬ò*ççäçæáááxýâïâ …äÄò*ä4ÿê<ó*Œ%åó*â´ë*Œ%ä ÿèˆó*ˆPåLó*â´ë*ˆPå ÿèÔó*°P ä˜ó*â´ë*°P ä ÿè ô*1ääó*â´ë*1ä ÿèlô*D– ä0ô*â´ë*D– ä ÿè¸ô*øæä|ô*â´ë*øæä ÿèõ*(ƒäÈô*â´ë*(ƒä ÿèPõ*p`åõ*â´ë*p`á¡ ÿèœõ*öä`õ*â´ë*öä ÿèØö* ä¬õ*´ë* èõ*î ö*öèö*è€âlë*ä,âö”ö*ççäçæáááxýâûâ …ä¬ö*ä4ÿêø*O äèö*´ë*O $÷*î\÷*öèP÷*è€âlë*ä-âöÐ÷*ççäçæáááxýâüâ …äè÷*ä4ÿêPù*hFä$ø*´ë*hF`ø*î˜ø*öèŒø*è€âlë*ä.âö ù*ççäçæáááxýâýâ …ä$ù*ä4ÿêŒú*Ìä`ù*´ë*Ìœù*îÔù*öèÈù*è€âlë*ä/âöHú*ççäçæáááxýâþâ …ä`ú*ä4ÿêØú*¶åœú*â´ë*¶å ÿè$û*Ä{ äèú*â´ë*Ä{ ä îøpû*Ð ä4û*â´ë*Ð ä ÿè¼û*0• ä€û*â´ë*0• ä ÿèü*ðùäÌû*â´ë*ðùä ÿèTü*°ÿäü*â´ë*°ÿ”¥ ÿì2ädü*´ë*2 ü*ÿèäÜü*äÌü*äãlë*ì âlë* äý*èøü*ì âlë*ðÌü*þþ*äX£îâlý*ò{öDõýÿí>å(ö)ö;ö}öðþ*äÔ¢îâHþ*ò{öDõýÿí>å(ö)ö;ö}öÌÿ*äP¢îâ$ÿ*ò{öDõýÿí>å(ö)ö;ö}ö¨+äÌ¡îä+ò{öDõýÿí>å(ö)ö;ö}ö„+ä<žîâÜ+ò{öDõýÿí>å(ö)ö;ö}ö`+ä¸îâ¸+ò{öDõýÿí>å(ö)ö;ö}ö<+äl›îâ”+ò{öDõýÿí>å(ö)ö;ö}þØšîâp+ò{öDõýÿí>å(ö)ö;ö}ö@+øØšæh+øl›æ+ø¸æ¸+ø<žæà+øÌ¡æ+øP¢æ0+øÔ¢æüX£æèl+è â |+ œ â``Œ+è +è ð>ÿíàjæä8å+Äæte ä+dŠæn ä0+\ƒæüHäH+°@æ 2å`+˜ˆæ¬›äx+Sæˆä+´sæd— ä¨+LD挟 äÀ+4Bæ`¬ äØ+HñæÔäð+ …æ4^ä+ècæ$± ä + qæÔ± ä8+ü™æPÑäP+ؘæDáäh+Œç±ä€+X÷æô¯å˜+``æ4ä°+ kæ„ äÈ+xãæÈÝäà+¸,æØÉåø+ æhI ä+ÐEæ¼I ä(+´6ætýå@+L¸æÿåX+¸VæÀäp+¬ætäˆ+8”æLn ä +<»æ ¼S¸+`õäèßä HäÐ+ êæpŽ äè+Ðæ xå +Y欲 ä +àJæp· ä0 +ŒöæeäH +tæ@ä` +|àæ ‹äx +ÌjæTÄ ä +ðæÌ’ä¨ +ÀPæ|¶äÀ + ~æÀ®äØ +´—ædÒäð +¼•怜ä +´’æä +HæDÃä8 +$mæ(ÉäP +@mæœäh +Ìoæ0ä€ +ŒbæxÔä˜ +h¥æÔºä° +táæìäÈ + æ¬2äà +‡æü1 äø +TYæ|ä +T æ„eä( +LŸâH + xä@ +Yât +¤] äX +d +æ ì° +ÐAä„ + +æ â   +ÐA ìì +4à äÀ +Ì +æ â Ü +4à ì"¼ +`/ +ü +èY`/8 +ÿèäd +ì€âYâóæ +œ1 ä€ +ì âYä¼ +0"å¬ +ì âÜ + äØ +©äÌ +ðÌ/åô +ê â + è +èY`/H +âÿèät +ìãYâöæ +è€ +ø¬ +ê âY äP+ì.äÌ +èYì.+ÿèä4+ì €âYâôêœ1 ä€ +ìð+Hu ä`+èYHu œ+ÿèäÈ+ä+è€âYâõêœ1 ä€ +øH+LFå+á +LF¬ +èá0+è:áÌ +èå\FìX+è:å +h+\Fä0+ä2äx+èY2´+âÿèäà+ä¬ +ääYâ÷æü+è€ +ø¬ +î ’ ðô+ä`+îâd+ò{öýÿí\Fä=ö[õ;ö}ö`+äÌ +î â(+ò{ö;õ(öýÿí\Fä)öýÿíLFä.öýÿí$òä(öýÿíè:å)ö;ö}þü +îâ”+ò:öýÿíLFä(öýÿí0"å)ö,öýÿíè:å(öýÿí©ä)ö,öýÿí\Fä(öZõ)ö{öýÿíLFä.öýÿíxå(öýÿí©ä,öýÿíÌ/å)ö;ö}ö,+øX +æT+ø„ +æ|+øÀ +æ¤+øü +æÌ+øÌ +æô+ø`+æ+ù+æD+ø+æl+ø +æüx+æè¨+è äæ+`œäÈ+Ô+æ â ä+`œ âðPô+è¨+èX+4à ä+$+æ â 4+4à âðPD+è¨+è¨+ŒÍäh+t+æ â „+ŒÍ âðP”+è¨+èø+L ä¸+Ä+æ â Ô+L âðPä+è¨+è" +`/Œ++|P`/D+ÿèäp+ì€â$PâBéœ1 äàòì"”+\òL+œ+|P`/Ø+Pÿèä+ì€â$PâOå +œ1 äàòðP&å<+ê â¨+ èT+|P`/+ÿèä¼+ì€â$PâPåØ+œ1 äàòì+ˆ$äô+ê â@óêP&å<+ê´+„ä0+|P„l+ÿèä˜+ät+䀀â$PâCéœ1 äàòêH+TäÄ+|PTá+ÿèä,+ä¨+䀀â$PâDéœ1 äàòê"”+8ì+X+|P8”+ÿèäÐ+äÀ+ä€â$PâEå â$P èœ1 äàòðô+|P80+ÿèä\+ä$Pä€â$PâFåx+œ1 äàòðˆ$ô"Ð+È(+¤+|PÈà+ÿèä +äÀ+ä€â$PâGéœ1 äàòð0+|PÈl+ÿèä˜+ä$Pä€â$PâHå´+œ1 äàòðˆ$ô€+ô"äà+|Pô"+ÿèäH+äÀ+ä€â$PâIåd+œ1 äàòð@)åÔ+ì0+ä+|PÌ+ÿèäø+ä$P䀀â$P âJå+œ1 äàòî@)åÔ+ìà+ää@+|Pä|+ÿèä¨+ät+䀀â$P âKåÄ+œ1 äàòîP&åÔ+ì +,"äð+|P,", +ÿèäX +äÀ+ä€â$P âLåt +œ1 äàòð@)åÔ+ì@!+¸ä  +|P¸Ü +ÿèä!+ä$P䀀â$P âMå$!+œ1 äàòî@)åÔ+ìÔ!+¼e äP!+|P¼e Œ!+ÿèä¸!+ä¨+䀀â$P âNéœ1 äàòää!+漎¨+è"+Ð ô î#+äT+îâ`"+ò:öýÿí¼Žä(öýÿíP&å)ö{ö}öä#+äœ+îâ<#+ò:öýÿí¼Žä(öýÿíP&å)ö{ö}ö$+äP!+îâ$+ò{öDõýÿí¼Žä;ö}öÌ%+ä  +î âÄ$+ò{öDõýÿíðå(ö*öOõ)öbõýÿí@)å;ö}öð&+äð+î ã&+ò{öDõJõaõ(ö-öýÿí@)å)ö;ö}ö,(+ä@+î â$'+ò{öDõ*ö(ö*öOõ+öýÿíP&å)ö;ö}öh)+ä+î â`(+ò{öDõýÿíðå(ö*öOõ)öaõýÿí@)å;ö}öŒ*+äà+î âœ)+ò{öýÿí¼Žäaõýÿí@)å;öDõ*öOõ;ö}öX,+ä0+îâÀ*+ò{öýÿíðåýÿí`Tä(ö*öOõ)ö;öJõqõ(ö)ö;öDõýÿí`Tä;ö}öd-+ä¤+î âŒ,+ò{öqõýÿí¼Žä;öDõ*öOõ;ö}ö0/+äô+îâ˜-+ò{öýÿíðåýÿí`Tä(ö*öOõ)ö;öJõpõ(ö)ö;öDõýÿí`Tä;ö}ö<0+äX+î âd/+ò{öpõýÿí¼Žä;öDõ*öOõ;ö}öè0+äÄ+îâp0+ò{öDõýÿí¼Žä;ö}ö¬1+ä0+îâ1+ò{öDõ*öýÿí¼Žä;ö}þ+îâà1+ò{ö}ö82+øÄPæ`2+øÈ+æˆ2+ø+æ°2+øh+æØ2+ø¸+æá3+ø+æ(3+ø0+æP3+øÄ+æx3+øX+æ 3+øô+æÈ3+ø¤+æð3+ø0+æ4+øà+æ@4+ø+æh4+ø@+æ4+øð+æ¸4+ø  +æà4+øP!+æ5+øä!+æ05+øœ+æX5+øT+æü€5+æ@óðHùÔ5+äÄ5+è ðâè5+è äæ$6+@)å6+ì äêxQä@6+ê âP6+ ä äî°6+âÔ9+°¼ âø6+üØ8+òÈ6+?ñà6+0ëò>áî{öùÿõýÿíHm ä<öýÿí?å,öýÿí0ëä>övõýÿí°¼ ä(öýÿíl ä,öýÿí@)å,öýÿíxQä)ö;öùÿõ}öh&°¼ 9+î`6+ä\îä09+ìâl9+l äL9+ì â\9+æ ì˜9+@)åˆ9+ì äêxQä´9+ê âÄ9+ ä äî$:+â€=+°¼ âl:+ü”<+ò<:+ü ðT:+0ëò>áî{öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öpõýÿíl ä,öqõýÿí@)å)öùÿõ*öýÿíl ä=öýÿíxQä;öùÿõ}öh&°¼ Ð<+îÔ9+ääîäì<+ìâ=+l ä=+ì ìD=+@)å4=+ì äêxQä`=+ê âp=+ ä äîÐ=+âÄB+@$$â0>+üA+òè=+<¬ ñ>+ü î>+,U ò>áî{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=öýÿí´Â ä(ö*öýÿíl ä)ö?öýÿíà@å:ö*öýÿíl ä;öùÿõDõýÿíˆõä;öùÿõ}öh&@$ÌA+î€=+äLîäøA+äèA+äâ äæ$B+l äB+ì ì@B+R äB+ì\B+ˆõäèA+ìˆB+´Â äxB+ì äêà@å¤B+ê â´B+ ä äîC+âÈG+|M#â\C+ü¤F+ò,C+<¬ ðDC+ü ò>áî{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=ö*öýÿíl äjõýÿí|Ìä?öýÿíà@å:ö*öýÿíl ä;öùÿõDõýÿíˆõä;öùÿõ}öh&|MàF+îÄB+äÜîä G+äüF+äâ äæ8G+l ä(G+ì ìTG+R ä(G+ìpG+ˆõäüF+ì¬G+|ÌäŒG+ê âœG+ ä äêà@åŒG+òH+â L+øÎ â`H+üK+ò0H+œö ðHH+,U ò>áî{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõ*öýÿíl ä=öýÿíà@å;öùÿõ}öh&øÎ TK+îÈG+ä< îäpK+ìâœK+l äŒK+ì ì¸K+R äŒK+ìäK+´Â äÔK+ì äêà@æL+ê âL+ ä äîpL+â8P+Œ“áâ L+ü@O+òˆL+œö ô>áî{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö*öýÿíl äjõýÿí|Ìä)öùÿõ*öýÿíl ä=öýÿíà@å;öùÿõ}ö h&Œ“á|O+î L+äØ îä˜O+ìâÄO+l ä´O+ì ìàO+R ä´O+ìP+|ÌäüO+ê â P+ ä äêà@åüO+òˆP+â„U+©%âèP+ü`T+ò P+< ñ¸P+¼ áîÐP+ü òà î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä,öpõýÿí`=ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=öýÿí@1 ä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö;öùÿõDõýÿíˆõä;öùÿõ}öh&©œT+î8P+ä îäÈT+ä¸T+äâ äæôT+ô=ääT+ì ìU+…ääT+ìñ{öùÿõýÿí>åvõýÿílqåvõýÿí¼Sä(öýÿíÌ/å,öýÿí<0å)ö;öùÿõ}öh&¼S¼b+î°`+ä´îäØb+ìâc+Ì/åôb+ì ð<0åôb+ôpc+âlg+Œ½!âˆc+ü f+ö>ñ{öùÿõDõýÿí\Cå<öýÿí>å>övõýÿ팽ä(öTõ<öýÿí>å*ö>ö(öýÿíl ä)ö,öTõ<öýÿí>å*ö>ö(öýÿíR ä)ö,öýÿíˆõä)ö;öùÿõ}öh&Œ½Üf+î c+ä0îäg+äøf+äâ âg+æ ì4g+l äøf+êPg+R äøf+îˆõäøf+ô¼g+âhj+Œ½âÔg+üœi+ö>ñ{öùÿõDõýÿí\Cå<öýÿí>å>övõýÿ팽ä(öýÿíl ä,öýÿíR ä,öýÿíˆõä)ö;öùÿõ}öh&Œ½Øi+îlg+ä,îäj+äôi+äâ âj+æ ì0j+l äôi+ìLj+R äôi+ðˆõäôi+ô¸j+âÜm+Œ½âèj+üm+òÐj+Þ ôhß î{öùÿõ>õ(öýÿíR äkõýÿíl ä)öùÿõ*öqõýÿíˆõä=ö*öqõýÿíR ä;öùÿõDõýÿíˆõä;öùÿõ}öh&Œ½Lm+îhj+ä\îäxm+ähm+äâ 俤m+l ä”m+ì ìÀm+R ä”m+ðˆõähm+ô,n+â@r+Tmâtn+üäp+òDn+Ð ð\n+>áòì‰ î{öùÿõDõýÿíðå<öýÿíÐ ä,öýÿíì‰ ä>ö(öýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿíˆõä.öýÿí¼e ä(ö)ö)ö)ö;öùÿõ}öh&Tm q+îÜm+ä  ïä”q+äáî{öùÿõDõýÿíTmä(öýÿíl ä.öýÿí¼e ä(ö)ö,öýÿíR ä.öýÿí¼e ä(ö)ö,öýÿíˆõä)ö;öùÿõ}öh&Tm$u+î@r+äÜžïä`u+ä@u+äâ âPu+æ äæÔu+l ä|u+ì â $PŒu+°u+ä u+è ðâÄu+è äæ(v+R äðu+ì â$Páv+v+ä u+ìâÄu+ìˆõä@u+ô”v+âÈ{+Tm"âÜv+ü z+ò¬v+Ð ðÄv+̇ òì‰ î{öùÿõDõýÿíðå<öýÿíÐ ä,öýÿíì‰ ä>ö(öýÿíTmä(öýÿíl ä.öýÿí¼e ä(ö)ö,öýÿíR ä.öýÿí¼e ä(ö)ö,öýÿíˆõä.öýÿí¼e ä(ö)ö)ö)ö;öùÿõ}öh&TmHz+îDv+äHžïä¼z+ädz+äâ â $Ptz+˜z+äˆz+è ðâ¬z+è äæ {+l äØz+ì â $Pèz+üz+äˆz+ìâ{+è äæt{+R ä<{+ì â $PL{+`{+äˆz+ìâ{+ìˆõä{+ì â $P {+´{+äˆz+ìâ¬z+ð|+â€+Tm!â0|+üH+ö>ñ{öùÿõDõýÿílð ä<öýÿí>å>övõýÿíTmä(öTõ<öýÿí>å*ö>ö(öýÿíl ä)ö,öTõ<öýÿí>å*ö>ö(öýÿíR ä)ö,öýÿíˆõä)ö;öùÿõ}öh&Tm„+îÈ{+äÜïäÀ+ä +äâ â°+æ ìÜ+l ä +êø+R ä +îˆõä +ôd€+âƒ+Tmâ|€+üD‚+ö>ñ{öùÿõDõýÿílð ä<öýÿí>å>övõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿíˆõä)ö;öùÿõ}öh&Tm€‚+î€+ä8ï伂+䜂+äâ ⬂+æ ìØ‚+l 䜂+ìô‚+R 䜂+ðˆõ䜂+ô`ƒ+âü†+Tmâƒ+ü0†+òxƒ+<¬ ôü î{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä,öpõýÿíˆõä)öùÿõ*öýÿíˆõä=ö*öýÿíl ä;öùÿõDõýÿíˆõä;öùÿõ}öh&Tml†+îƒ+䌜ï䘆+䈆+äâ äæĆ+l ä´†+ì ìà†+R ä´†+ðˆõ䈆+ôL‡+â +4· E┇+ü Ž+òd‡+< ñ|‡+¼ áòÜN î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíô=ä,öpõýÿí`=ä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõDõZõ;öùÿõ;õ(öýÿíhä(ö*öýÿí`=ä,ö*öýÿíô=ä)ö)öùÿõDõ[õ;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿí`=äkõýÿíô„ä)ö;öùÿõ}öh&4· HŽ+âîü†+äЛïädŽ+ìâŽ+ô=䀎+ì 쬎+…䀎+ìØŽ+`=äÈŽ+ì äæôŽ+ô„äÈŽ+ðhä+ì äîp+âp–+4· ?â +üˆ•+òˆ+< õ¼ áî{öùÿõ@õ(ö;öýÿíô=äkõýÿí…äiõýÿí`=äkõýÿíô„ä;öpõýÿíô=ä,öpõýÿí`=ä)öùÿõ{öùÿõ;õ(ö*öýÿíô=ä<ö*öýÿí`=ä)öùÿõDõZõ;öùÿõ;õ(ö*öýÿí`=ä<ö*öýÿíô=ä)öùÿõDõ[õ;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿí`=äkõýÿíô„ä)ö;öùÿõ}öh&4· Ä•+î +äH›ïäà•+ìâ –+ô=äü•+ì ì(–+…äü•+ìT–+`=äD–+ì äêô„äD–+ôÀ–+âlœ+ 2âð–+ü ›+òØ–+œö ôÜN î{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(öýÿíhä(ö*öýÿíP&å,ö*öýÿíl ä)ö)öùÿõýÿíP&å=öýÿíl ä;öùÿõDõýÿíP&å;öùÿõ}öh& Ü›+îp–+äÌšïäœ+äø›+äâ ì$œ+l äø›+ì@œ+R äø›+ðhä\œ+ì ä+âÜ¡+ /âÔœ+ü<¡+öœö ð{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö*öýÿíP&å<ö*öýÿíl ä)öùÿõýÿíP&å=öýÿíl ä;öùÿõDõýÿíP&å;öùÿõ}öh& x¡+îlœ+ätšï䤡+䔡+äâ ìÀ¡+l 䔡+ðR 䔡+ô,¢+âا+ Ù2â\¢+ü §+òD¢+œö ôÜN î{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(öýÿíhä(ö*öýÿíl ä,ö*öýÿíP&å)ö)öùÿõýÿíP&å=öýÿíl ä;öùÿõDõýÿíP&å;öùÿõ}öh& ÙH§+îÜ¡+äÈïät§+äd§+äâ ì§+l äd§+쬧+R äd§+ðhäȧ+ì äî(¨+âH­+ Ù/â@¨+ü¨¬+öœö ð{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ@õ(öpõýÿíl ä;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö*öýÿíl ä<ö*öýÿíP&å)öùÿõýÿíP&å=öýÿíl ä;öùÿõDõýÿíP&å;öùÿõ}öh& Ùä¬+îا+ä,ïä­+å­+äâ ì,­+l å­+ðR å­+ô˜­+â$°+l„ âÈ­+üH¯+ò°­+>õÜN î{öùÿõDõýÿíhä(öýÿí0"å,öýÿí¼"å)ö?öýÿí¼"å:öýÿí0"å;öùÿõ}öh&l„ „¯+îH­+äÔŒïäÀ¯+ä ¯+ââ â°¯+ ä ìܯ+0"å ¯+êø¯+¼"å ¯+îhä°+ì äît°+ât²+l„ ⌰+üı+ö>ñ{öùÿõDõýÿí0"å<öýÿí¼"å?öýÿí¼"å:öýÿí0"å;öùÿõ}ö h&l„ á²+î$°+älŒïä<²+ä²+ââ â,²+ ä ìX²+0"å²+î¼"å²+òIJ+âPµ+˜ âô²+üt´+òܲ+>õÜN î{öùÿõDõýÿíhä(öýÿí¼"å,öýÿí0"å)ö?öýÿí¼"å:öýÿí0"å;öùÿõ}öh&˜ °´+ît²+䨋ïäì´+äÌ´+ââ âÜ´+ ä ìµ+0"åÌ´+ê$µ+¼"åÌ´+îhä@µ+ì äî µ+â ·+˜ ⸵+üð¶+ö>ñ{öùÿõDõýÿí¼"å<öýÿí0"å?öýÿí¼"å:öýÿí0"å;öùÿõ}öh&˜ ,·+îPµ+ä‹ïäh·+äH·+ââ âX·+ ä ì„·+0"åH·+î¼"åH·+òð·+âôÄ+hTzâP¸+üÀÃ+ò¸+œö ð ¸+0ëî8¸+>áò²î{öùÿõ;õ(öýÿí¬Ï äjõÿÿô)öùÿõDõýÿíl ä;öùÿõýÿí0ëäýÿíX`ä=öXõ<öýÿí0ëä>ö(övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö)ö;öùÿõ;õ(öýÿíX`ä<öýÿí¬Ï ä)öùÿõDõýÿíR ä;öùÿõ@õ(ö;öýÿíX`ämõýÿí¬Ï ä;öpõýÿíl ä,öqõýÿíX`ä)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ@õ(öýÿí0ëäýÿí@)å=öÿÿô;öýÿí@)å<öýÿí¬Ï ä;öpõýÿí@)å,öpõýÿíP&å,öqõýÿíX`ä)öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿíP&å,öýÿíxQä)ö)öùÿõAõýÿíÈeä;öùÿõDõýÿíl ä;öùÿõýÿíÈeä:öùÿõýÿíl ä=öýÿíP&å;öùÿõ}öùÿõDõýÿíR ä;öùÿõ}öh&hTüÃ+âî ·+äü‰ïä(Ä+äÄ+äâ ìDÄ+l äÄ+ì`Ä+R äÄ+ìŒÄ+¬Ï ä|Ä+ì äæÈÄ+xQä¨Ä+ê â¸Ä+ ä äê´Â ääÄ+ì äîDÅ+âìÑ+hTyâŒÅ+üäÐ+ò\Å+œö ðtÅ+0ëò>áî{öùÿõ;õ(öýÿí¬Ï äjõÿÿô)öùÿõDõýÿíl ä;öùÿõýÿí0ëäýÿíX`ä=öXõ<öýÿí0ëä>ö(övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö)ö;öùÿõ;õ(öýÿíX`ä<öýÿí¬Ï ä)öùÿõDõýÿíR ä;öùÿõ@õ(ö;öýÿíX`ämõýÿí¬Ï ä;öpõýÿíl ä,öqõýÿíX`ä)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ@õ(öýÿí0ëäýÿí@)å=öÿÿô;öýÿí@)å<öýÿí¬Ï ä;öpõýÿí@)å,öpõýÿíP&å,öqõýÿíX`ä)öùÿõ;õ(ö!ö(ö*öýÿíP&åjõýÿíxQä)ö)öùÿõAõýÿíÈeä;öùÿõDõýÿíl ä;öùÿõýÿíÈeä:öùÿõýÿíl ä=öýÿíP&å;öùÿõ}öùÿõDõýÿíR ä;öùÿõ}öh&hT Ñ+âîôÄ+ä‰ïäLÑ+ä<Ñ+äâ ìhÑ+l ä<Ñ+ì„Ñ+R ä<Ñ+ì°Ñ+¬Ï ä Ñ+ì äêxQäÌÑ+ê âÜÑ+ ä äî<Ò+âØ+Tœ/â„Ò+üìÖ+òTÒ+< ñlÒ+¼ áò²î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä,öpõýÿí`=ä)öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõCõ;öùÿõDõýÿíøó ä<öýÿí< å,öýÿí¼ å>ö(öýÿíô=ä,öýÿí`=ä)ö;öùÿõ}öh&Tœ(×+îìÑ+äTˆïäœ×+äD×+äâ â ôsT×+x×+äh×+è ðâŒ×+è 俏×+ô=äh×+ìÔ×+…äh×+ìð×+`=äŒ×+ð´Â ä Ø+ì äîlØ+âðÝ+Tœ.âœØ+üìÜ+ò„Ø+< õ¼ áî{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä,öpõýÿí`=ä)öùÿõ;õ(ö!ö(ö*öýÿíô=äjõ*öýÿí`=ä)ö)öùÿõCõ;öùÿõDõýÿíøó ä<öýÿí< å,öýÿí¼ å>ö(öýÿíô=ä,öýÿí`=ä)ö;öùÿõ}öh&Tœ(Ý+îØ+䔇ïäœÝ+äDÝ+äâ â ôsTÝ+xÝ+ähÝ+è ðâŒÝ+è 俏Ý+ô=ähÝ+ìÔÝ+…ähÝ+ð`=äŒÝ+ô@Þ+âxã+T_+âpÞ+üxâ+òXÞ+<¬ ô,U î{öùÿõ õýÿíà?ä<öýÿí<¬ ä>övõýÿí`œäýÿíˆõä=öÿÿô;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõpõýÿíˆõä;öùÿõDõýÿíˆõä;öùÿõ}öh&T_´â+îðÝ+äD|ïäã+äÐâ+äâ â àâ+`œ âðPðâ+èã+è ì0ã+l äã+ìLã+R äã+ð´Â ähã+ì äîÈã+âøè+¬Ï *âøã+üèç+òàã+<¬ ô>áî{öùÿõ õýÿíà?ä<öýÿí<¬ ä>övõýÿí`œäýÿíˆõä=öÿÿô;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõ;õ(ö*öýÿíl äjõýÿíxQä)öùÿõpõýÿíˆõä;öùÿõDõýÿíˆõä;öùÿõ}öh&¬Ï $è+îxã+äÈ{ïä„è+ä@è+äâ â Pè+`œ âðP`è+ètè+è ì è+l ätè+ì¼è+R ätè+ðxQäØè+ê âèè+ ä äîHé+âð+¿ >âxé+üHï+ò`é+œö ô²î{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ@õ(öpõýÿíP&å;öýÿíP&åkõýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõ;õ(öýÿí´Â ä(ö*öýÿíl ä,ö*öýÿíP&å)ö)öùÿõDõýÿíl ä;öùÿõýÿíl ä=öýÿíP&å;öùÿõ}öùÿõ}öùÿõDõýÿíR ä;öùÿõ}öh&¿ „ï+îøè+ä${ïä°ï+ä ï+äâ ìÌï+l ä ï+ìèï+R ä ï+ð´Â äð+ì äîdð+â¤ö+¿ ;â|ð+üö+öœö ð{öùÿõ;õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿíœö äýÿíP&å=öýÿíl ä;öùÿõ@õ(öpõýÿíP&å;öýÿíP&åkõýÿíR ä;öpõýÿíP&å)öùÿõ{öùÿõ;õ(ö*öýÿíl äjõ*öýÿíP&å)öùÿõDõýÿíl ä;öùÿõýÿíl ä=öýÿíP&å;öùÿõ}öùÿõ}öùÿõDõýÿíR ä;öùÿõ}öh&¿ @ö+îð+ääzïälö+ä\ö+äâ ìˆö+l ä\ö+ðR ä\ö+ôôö+âHý+<Í5â<÷+ü4ü+ò ÷+ÜJð$÷+DLò²î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä)öùÿõ{öùÿõ@õ(öýÿíDLäýÿíP&å=öýÿí`=ä;öýÿíP&åkõýÿíô„ä;öpõýÿíP&å)öùÿõ;õ(öýÿí´Â ä(ö*öýÿíô=ä,ö*öýÿíP&å)ö)öùÿõDõýÿíô=ä;öùÿõ}öùÿõDõýÿí…ä;öùÿõ}öh&<Ípü+âî¤ö+älzïäœü+äŒü+äâ ì¸ü+ô=äŒü+ìÔü+…äŒü+íý+`=äðü+ì äæý+ô„äðü+ð´Â ä8ý+ì äî˜ý+â`,<Í2âÈý+üx,ò°ý+ÜJôDLî{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä)öùÿõ{öùÿõ@õ(öýÿíDLäýÿíP&å=öýÿí`=ä;öýÿíP&åkõýÿíô„ä;öpõýÿíP&å)öùÿõ;õ(ö*öýÿíô=äjõ*öýÿíP&å)öùÿõDõýÿíô=ä;öùÿõ}öùÿõDõýÿí…ä;öùÿõ}öh&<Í´,âîHý+ä˜yïäà,äÐ,äâ ìü,ô=äÐ,ì,…äÐ,ìD,`=ä4,ì äêô„ä4,ô°,âä,¤\á)âø,üÐ,òÈ,ÜJðà,DLò²î{öùÿõõ õýÿíà?ä<öýÿíÜJä>övõýÿíL äýÿídJä;öùÿõDõýÿí´ä<öýÿíÜJä,öýÿíDLä,öýÿí²ä>öùÿõ(öýÿíô=ä,öýÿí…ä,öýÿí`=ä,öýÿíô„ä,öýÿí´Â ä,öýÿídJä(ö)ö)ö;öùÿõ}ö h&¤\á ,î`,ä¬xïä8,ä(,äâ ìT,ô=ä(,ìp,…ä(,ìœ,`=äŒ,ì 俏,ô„äŒ,ð´Â äÔ,ì äî4 ,â ,´¤â| ,üÜ,òL ,Þ ðd ,DLò²î{öùÿõ õýÿíà?ä<öýÿíÞ ä>övõýÿí`œäýÿíX`ä=övõýÿ픀ävõýÿí|Ôä(öýÿíô=ä,öýÿí…ä)ö;öùÿõ õýÿíà?ä<öýÿíDLä>övõýÿí`œäýÿíLaä=övõýÿ픀ävõýÿí|Ôä(öýÿí`=ä,öýÿíô„ä)ö;öùÿõ;õ(öýÿíX`ä<öýÿíLaähõýÿíLaäjõÿÿô)öùÿõDõýÿí…ä;öùÿõýÿíÞ äýÿíˆõä=öýÿí…ä;öùÿõ@õ(övõýÿ픀ävõýÿíoä(öýÿíˆõä,ö-öýÿíLaä)ö;öýÿíˆõäkõýÿíô=ä;öqõýÿíˆõä)öùÿõ;õ(övõýÿ픀ävõýÿíøtä<öýÿíDLä,öýÿíÞ ä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí²ä>övõýÿí œ ä>öùÿõ(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä,öýÿí´Â ä)ö)öùÿõDõýÿíˆõä;öùÿõ;õ(övõýÿ픀ävõýÿíøtä<öýÿíDLä,öýÿíÞ ä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí²ä>övõýÿí œ ä>ö(öýÿí`=ä,öýÿíô„ä,öýÿíô=ä,öýÿí´Â ä)ö)öùÿõDõýÿíô=ä;öùÿõDõýÿí…ä;öùÿõ}öh&´,âîä,äLxïäD,ä4,äâ ì`,ô=ä4,ì|,…ä4,ì¨,`=ä˜,ì äæÄ,ô„ä˜,ìð,´Â äà,ì äêˆ$ä0Fô\,ât',´|â¤,üD&,òt,ÜJðŒ,DLò²î{öùÿõýÿíô=ä=övõýÿ픀ävõýÿíð— ä<öýÿíÜJä,öýÿíDLä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí²ä>övõýÿí œ ä>öùÿõ(öýÿíô=ä,öýÿí…ä,öýÿí`=ä,öýÿíô„ä,öýÿí´Â ä)ö;öùÿõýÿíÜJäýÿíˆõä=öýÿíô=ä;öùÿõ;õ(öýÿíô=äkõýÿí…ä)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõpõýÿíô=ä;öùÿõýÿíô=ä=övõýÿ픀ävõýÿíð— ä<öýÿíÜJä,öýÿíDLä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí²ä>övõýÿí œ ä>öùÿõ(öýÿíô=ä,öýÿí…ä,öýÿí`=ä,öýÿíô„ä,öýÿí´Â ä)ö;öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõCõ;öùÿõýÿíˆõä=öýÿíô=ä;öùÿõ}öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&´€&,âî ,äøwïä¬&,äœ&,äâ ìÈ&,ô=äœ&,ìä&,…äœ&,ì',`=å',ì äæ,',ô„å',ìX',´Â äH',ì äêˆ$ä|GôÄ',âÄ+,¤\áâô',üÜ*,òÜ',ÜJôDLî{öùÿõõ õýÿíà?ä<öýÿíÜJä>övõýÿíL äýÿídJä;öùÿõDõýÿí´ä(öýÿíô=ä,öýÿí…ä,öýÿí`=ä,öýÿíô„ä,öýÿídJä(ö)ö)ö;öùÿõ}ö h&¤\á+,ît',ä0wïäD+,ä4+,äâ ì`+,ô=ä4+,ì|+,…ä4+,ì¨+,`=ä˜+,ì äêô„ä˜+,ô,,â09,´âD,,ü,8,ò,,,Þ ôDLî{öùÿõ õýÿíà?ä<öýÿíÞ ä>övõýÿí`œäýÿíX`ä=övõýÿ픀ävõýÿí|Ôä(öýÿíô=ä,öýÿí…ä)ö;öùÿõ õýÿíà?ä<öýÿíDLä>övõýÿí`œäýÿíLaä=övõýÿ픀ävõýÿí|Ôä(öýÿí`=ä,öýÿíô„ä)ö;öùÿõ;õ(öýÿíX`ä<öýÿíLaähõýÿíLaäjõÿÿô)öùÿõDõýÿí…ä;öùÿõýÿíÞ äýÿíˆõä=öýÿí…ä;öùÿõ@õ(övõýÿ픀ävõýÿíoä(öýÿíˆõä,ö-öýÿíLaä)ö;öýÿíˆõäkõýÿíô=ä;öqõýÿíˆõä)öùÿõ;õ(övõýÿ픀ävõýÿíøtä(öýÿí`=ä,öýÿíô„ä,öýÿíˆõä)ö)öùÿõDõýÿíˆõä;öùÿõ;õ(övõýÿ픀ävõýÿíøtä(öýÿí`=ä,öýÿíô„ä,öýÿíô=ä)ö)öùÿõDõýÿíô=ä;öùÿõDõýÿí…ä;öùÿõ}öh&´h8,âîÄ+,äàkïä”8,ä„8,äâ ì°8,ô=ä„8,ìÌ8,…ä„8,ìø8,`=äè8,ì äæ9,ô„äè8,ðˆ$ä0Fô€9,â´C,´`â°9,ü°B,ò˜9,ÜJôDLî{öùÿõýÿíô=ä=övõýÿ픀ävõýÿíð— ä<öýÿíÜJä,öýÿíDLä>ö(öýÿíô=ä,öýÿí…ä,öýÿí`=ä,öýÿíô„ä)ö;öùÿõýÿíÜJäýÿíˆõä=öýÿíô=ä;öùÿõ;õ(öýÿíô=äkõýÿí…ä)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõpõýÿíô=ä;öùÿõýÿíô=ä=övõýÿ픀ävõýÿíð— ä<öýÿíÜJä,öýÿíDLä>ö(öýÿíô=ä,öýÿí…ä,öýÿí`=ä,öýÿíô„ä)ö;öùÿõ;õ(öýÿíô=äjõýÿí…ä)öùÿõCõ;öùÿõýÿíˆõä=öýÿíô=ä;öùÿõ}öùÿõ}öùÿõDõýÿíˆõä;öùÿõ}öh&´ìB,âî09,äŒkïäC,äC,äâ ì4C,ô=äC,ìPC,…äC,ì|C,`=älC,ì äæ˜C,ô„älC,ðˆ$ä|GôD,â°R,ð— ŽâLD,üœQ,òD,ÜJð4D,DLò²î{öùÿõ õýÿíà?ä<öýÿíDLä>övõýÿí`œäýÿíLaä=övõýÿ픀ävõýÿí|Ôä(öýÿí`=ä,öýÿíô„ä)ö;öùÿõ;õ(öýÿíLaäjõÿÿô)öùÿõDõýÿíô=ä;öùÿõ õýÿíà?ä<öýÿíÜJä>övõýÿí`œäýÿíX`ä=övõýÿ픀ävõýÿí|Ôä(öýÿíô=ä,öýÿí…ä)ö;öùÿõ;õ(öýÿíX`ä<öýÿíLaä)öùÿõDõýÿí…ä;öùÿõýÿíÜJäýÿí¸(å=öýÿíô=ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿí¸(å,öýÿíLaä-öÿÿìæ)ö;öùÿõ@õ(ö;öýÿíX`ämõýÿíLaä;öpõýÿíô=ä,öqõýÿíX`ä)öùÿõ;õ(övõýÿ픀ävõýÿíøtäùÿõ<öýÿíÜJä,öýÿíDLä,öùÿõ õýÿíT¾ävõýÿíÿå<öýÿí²ä>övõýÿí œ ä>öùÿõ(öýÿíô=ä,öpõýÿí¸(å,öýÿí`=ä,öýÿí´Â ä)ö)öùÿõDõýÿíô=ä;öùÿõDõýÿí…ä;öùÿõ}öh&ð— ØQ,âî´C,ä¤jïäR,äôQ,äâ ì R,ô=äôQ,ìövõýÿí`œäýÿíLaä=övõýÿ픀ävõýÿí|Ôä(öýÿí`=ä,öýÿíô„ä)ö;öùÿõ;õ(öýÿíLaäjõÿÿô)öùÿõDõýÿíô=ä;öùÿõ õýÿíà?ä<öýÿíÜJä>övõýÿí`œäýÿíX`ä=övõýÿ픀ävõýÿí|Ôä(öýÿíô=ä,öýÿí…ä)ö;öùÿõ;õ(öýÿíX`ä<öýÿíLaä)öùÿõDõýÿí…ä;öùÿõýÿíÜJäýÿí¸(å=öýÿíô=ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿí¸(å,öýÿíLaä-öÿÿìæ)ö;öùÿõ@õ(ö;öýÿíX`ämõýÿíLaä;öpõýÿíô=ä,öqõýÿíX`ä)öùÿõ;õ(övõýÿ픀ävõýÿíøtä(öýÿíô=ä,öpõýÿí¸(å,öýÿí`=ä)ö)öùÿõDõýÿíô=ä;öùÿõDõýÿí…ä;öùÿõ}öh&ð— Ü^,âî°R,ä8jïä_,äø^,äâ ì$_,ô=äø^,ì@_,…äø^,ìl_,`=ä\_,ì äêô„ä\_,ôØ_,â¨d,øt&â `,ü°c,òð_,< ñ`,¼ áò²î{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä,öpõýÿí`=ä)öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿíô=ä,ö*öýÿí`=ä)ö)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öh&øtìc,îˆ_,ä¬iïäd,ìâ4d,ô=ä$d,ì ìPd,…ä$d,ì|d,`=äld,ì äê´Â ä˜d,ì äîød,âli,øt%â(e,ü h,òe,< õ¼ áî{öùÿõ@õ(ö;öýÿíô=äkõýÿí…ä;öpõýÿíô=ä,öpõýÿí`=ä)öùÿõ;õ(ö!ö(ö*öýÿíô=äjõ*öýÿí`=ä)ö)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öh&øtÜh,î¨d,äHiïäøh,ìâ$i,ô=äi,ì ì@i,…äi,ð`=ä\i,ì äî¼i,âm,ƒáâìi,üDl,òÔi,<¬ ô,U î{öùÿõ>õ(öýÿíl äkõýÿíR äiõ!öýÿí´Â ä(ö*öýÿíl ä)ö)öùÿõpõýÿíl ä;öùÿõDõýÿíl ä;öùÿõ}ö h&ƒá€l,îli,äÔhïä¬l,äœl,äâ ìÈl,l äœl,ìäl,R äœl,ð´Â åm,ì äî`m,âÜp,°Ú âm,ýp,òxm,<¬ ô>áî{öùÿõ>õ(öýÿíl äkõýÿíR äiõ!ö(ö*öýÿíl äjõýÿíxQä)ö)öùÿõpõýÿíl ä;öùÿõDõýÿíl ä;öùÿõ}öh&°Ú áòl3áî{öùÿõDõýÿí ä<öýÿí(=å,öýÿí>å,öýÿíl3å>ö(öýÿí¸$å)ö;öùÿõ}öh&´Mìv,î€t,ähfïä„w,äw,äâ â 0ü&w,áî{öùÿõDõýÿí$‹ ä<öýÿí(=å,öýÿí>å>ö(öýÿí¸$å)ö;öùÿõ}öh&´MHz,î$x,ä [ïä¼z,ädz,äâ â l'tz,˜z,äˆz,è ðâ¬z,è äê¸$åØz,ì âìz,¬z,æä{,äˆz,䀀ã${,èÜý&öÜý&ò{,âä~,”àáâØ{,üp},ò¨{,(=ñÀ{,>áòl3áî{öùÿõDõýÿílÿä<öýÿí(=å,öýÿí>å,öýÿíl3å>ö(öýÿí¸$å)ö;öùÿõ}ö h&”àá¬},î@{,ä`ZïäD~,äÈ},äâ â ´ 'Ø},ü},äì},è ì ~,â~,è äêâ4~,è äê¸$å`~,ì ât~,~,æä~,äì},䀀ã¬~,èÜý&êÈ~,èÜý&ö4~,ô4,ã‚,”àáâd,üÌ€,òL,(=õ>áî{öùÿõDõýÿíh=ä<öýÿí(=å,öýÿí>å>ö(öýÿí¸$å)ö;öùÿõ}ö h&”àá,îä~,ä„Yïä|,ä$,äâ â ¤'4,X,äH,è ðâl,è äê¸$å˜,ì â¬,l,æäÈ,äH,䀀ãä,èÜý&öÜý&òP‚,⤅,´M☂,ü0„,òh‚,(=ñ€‚,>áòl3áî{öùÿõDõýÿí¼. ä<öýÿí(=å,öýÿí>å,öýÿíl3å>ö(öýÿí¸$å)ö;öùÿõ}öh&´Ml„,ï‚,äLYïä…,䈄,äâ â ì'˜„,¼„,䬄,è ìà„,âЄ,è äêâô„,è äê¸$å …,ì â4…,Є,æäP…,䬄,ä€äl…,èÜý&숅,èÜý&öô„,ôô…,âÀˆ,´Mâ$†,üŒ‡,ò †,(=õ>áî{öùÿõDõýÿíh°ä<öýÿí(=å,öýÿí>å>ö(öýÿí¸$å)ö;öùÿõ}öh&´Mȇ,,ä¨Xïä<ˆ,ää‡,äâ â Ü 'ô‡,ˆ,äˆ,è ðâ,ˆ,è äê¸$åXˆ,ì âlˆ,,ˆ,æäˆˆ,äˆ,ä€ä¤ˆ,èÜý&øÜý&ò‰,âdŒ,”àáâX‰,üðŠ,ò(‰,(=ñ@‰,>áòl3áî{öùÿõDõýÿíäV ä<öýÿí(=å,öýÿí>å,öýÿíl3å>ö(öýÿí¸$å)ö;öùÿõ}ö h&”àá,‹,îÀˆ,äˆWïäÄ‹,äH‹,äâ â $''X‹,|‹,äl‹,è ì ‹,â‹,è äêâ´‹,è äê¸$åà‹,ì âô‹,‹,æäŒ,äl‹,ä€ä,Œ,èÜý&ìHŒ,èÜý&ö´‹,ô´Œ,â€,”àáâäŒ,üLŽ,òÌŒ,(=õ>áî{öùÿõDõýÿíÀeä<öýÿí(=å,öýÿí>å>ö(öýÿí¸$å)ö;öùÿõ}ö h&”àሎ,îdŒ,ähWïäüŽ,䤎,äâ â .'´Ž,ØŽ,äÈŽ,è ðâìŽ,è äê¸$å,ì â,,ìŽ,æäH,äÈŽ,ä€äd,èÜý&øÜý&òÐ,â“,Ø6â,ü°‘,òè,ð­ñ,T­òpîáî{öùÿõDõýÿí¤ä<öýÿíð­ä,öýÿíT­ä,öýÿípîå>ö(öýÿí¸$å)ö;öùÿõ}öh&Ø6ì‘,î€,äôVïä„’,ä’,äâ â \4'’,<’,ä,’,è ì`’,âP’,è äêât’,è äê¸$å ’,ì â°’,æäÌ’,ät’,êè’,è,’,øP’,ôT“,ã–,Ø6â„“,üì”,òl“,¨%ôpîáî{öùÿõDõýÿíP)ä<öýÿí¨%ä,öýÿípîå>ö(öýÿí¸$å)ö;öùÿõ}öh&Ø6(•,î“,ä€Vï䜕,äD•,äâ â Ì:'T•,x•,äh•,è ð⌕,è äê¸$帕,ì âÈ•,æää•,䌕,öh•,ôP–,âÄ™,( ‖,üx˜,òh–,LÑô>áî{öùÿõDõýÿíÄ~ ä<öýÿíLÑä>ö(öýÿíìÙä,ö õýÿíLÑävõýÿíHqä(öýÿíÌ/å)ö)ö;öùÿõ}öh&( ´˜,ï–,äVïä\™,äИ,äâ â `H'à˜,™,äô˜,è ðâ™,è â (™,Hq â 8™, œ âÀPH™,èô˜,舙,ìÙäx™,ê âô˜, èÌ/夙,ê â´™, ä äîš,âˆ,TOâDš,ü<œ,ò,š,LÑô>áî{öùÿõDõýÿí” ä<öýÿíLÑä>ö(öýÿíìÙä,ö õýÿíLÑävõýÿíì‚ä(öýÿíÌ/å)ö)ö;öùÿõ}öh&TOxœ,îÄ™,ä8Iïä ,䔜,äâ â ö(öýÿí´Â ä)ö;öùÿõ}öh&$ÉdŸ,îˆ,ä´Hïä´Ÿ,䀟,äâ âð†'Ÿ,褟,è ð´Â äП,ê ⤟, ì0 ,âG¼É âH ,ü€¡,ö,U ð{öùÿõDõýÿíðbå<öýÿí,U ä>ö(öýÿí´Â ä)ö;öùÿõ}öh&¼É¼¡,îàŸ,äáçlÿí ïÿäáìhááÿÿÿáâ ÿì ïÿäóáÿÿÿâ ÿì ðÿäóáÿÿââæ ÿä ðÿÿäáâàOÿñâ,å @ÿã ïÿäóÿåâæ ÿä !ïÿlááÿÿÿÿìãøÿâ ÿì ïÿlááÿÿïÿåâ üéª,ü:á ¾älÿá Pª,¼Rä|ª,ü:´Uä˜ÿáXä Z%Øï,ŒåȪ,Ъ,â ã«,Œá´ï,èÈï,äpæh&ŒåЪ,ä «,ãáà«,´W ä0«,á «,´W l«, öfî䘫,ì!ãЪ,ìÄ«,è´«,ì âЪ,ÿà¬,0V äð«,á «,0V ,¬, ö´ÛîäX¬,ì!ãЪ,ìt¬,è´«,ÿèP­,2ä ¬,á «,2ܬ,ÿèä­,ä­,äãЪ,ì âЪ, ä4­,è´«,ø­,êä­,ì.ä`­,á «,ì.œ­,ÿèäÈ­,ì0!ãЪ,ø´«,ìœï,`/@ê,ô­,á «,`/0®,Pî”®,öä\®,ì€âЪ,ä¬åx®,œ1 ä´«,ðL ä¼Rê¯,0¯,ççäçæáááxýâœ1 ´«,äxá @L ¼Râyá@lâÌDäx¯,älâ ÌDè,@è,älâ ÌDÄé,èé,ä᤯,ääæ,ü â Ô¯,Øu Àæ,äèÖ,Ôæ,äpæh&Øu 䤯,äô¯,ãá´°,´W ä°,Ô¯,´W @°, öS îäl°,ì!㤯,옰,舰,ì ⤯,ÿàd±,0V äİ,Ô¯,0V á±, ö¼X îä,±,ì!㤯,ìH±,舰,ÿè$²,2ät±,Ô¯,2°±,ÿèäì±,äܱ,ä㤯,ì ⤯, ä²,舰,øܱ,êØÖ,ì.ä4²,Ô¯,ì.p²,,ö䜲,ì2!㤯,øˆ°,ì,³,@³,ççäçæáááxýâœ1 ˆ°,älá@ì ³,äì4µ,äìèÆ,äì€Ö,䈰,ä̳,`´,øáˆ°,äø³,üሰ,ä$´,ü:áP´,älý ∰,æèŒ´,µ,ø:踴,üâÔ¯,yô´, ÿäìâ4êþ8Èé `µ,0Æ,œµ,ô:€Œµ,ät¸,ü ✵,æäȵ,ì%ãôµ,øäµ,ì âôµ,äâ$¶,øî診,èpæh&øîäôµ,äD¶,ãáô¶,´W äT¶,$¶,´W ¶, ÿèä¼¶,ì!ãôµ,ìض,èäµ,ÿ褷,0V ä·,$¶,0V @·, ÿèäl·,ì!ãôµ,숷,èäµ,ÿèd¸,2ä´·,$¶,2ð·,ÿèä,¸,ä¸,äãôµ,ì âôµ, äH¸,èäµ,ø¸,꘺,ì.ät¸,$¶,ì.œµ,âê°¸,ö$¹,8¹,ççäçæáááxýâœ1 äµ,ä(á@ìh¹,äì@º,ä8Èé ”¹,й,¬•)ô:€À¹,äh•)ü ⬕)êع,áäµ,äº,ü:á0º,ä(ý âäµ,æélº,ü:á0º,ä(ýÀº,”娺,å”áÈ’)èܼ, ãäк,$¶, ã »,âêT»,öä8»,ä¼Râ„ãôµ,ä›ñäµ,êÈ»,Ü»,ççäçæáááxýâœ1 äµ,âá@Dâ´ äô»,ä8¼Rä ¼,\¼,Pš)ô:âL¼,ä š)ü âPš)ê d¼,È›)ä¼,ü:¼¼,äý â̼,æ âôµ,æ"Æ,`/ÈÄ,ì¼,$¶,`/(½,âꌽ,öäT½,ìãôµ,ä™åp½,èäµ,ø¼Rêá ¾,(¾,ççäçæáááxýâœ1 äµ,äá @xQ¼Râá@;â´ äp¾,ä=â ´ äÁ,Â,ä>â ´ LÄ,pÄ,äáÈ’)䜾,ü8áÈ›)ä Ⱦ,¿,ì“)ô:âô¾,䨓)ü âì“)æ d¿, ¿,áäµ,ä8¿,ü:á0º,äÿál¿,8á¼Rä ˜¿,HÀ,Ô¿,ô:âÄ¿,ä À,ü âÔ¿,æäð¿,ïýä M Ô¿,ââÿèPÀ, é|À,¸Á,ø2é¨À,üéÔÀ,ŒÁ,ø8ê Á,,Á,ddô:âTdäœdÿà 4Á,¼Rä`Á,ü:´Uäý4êþ4êÿâáh•)ôâ8á¼Rä4Â,áÃ,pÂ,ô:â`Â,äÄÂ,ü âpÂ,æäŒÂ,ä¼Rçá¨Â,è¼Rø¼Rêh&HŽ pÂ,æÿä ìÃ,Ã,2á¼Rä4Ã,ü8¼Rä `Ã,ŒÃ,Pš)ô:âL¼,ä š)ÿà”Ã,áÈ›)äÀÃ,ü:á¼¼,äÿá ôÃ,¼Rä Ä,ü:´Uäÿááh•)ôâéœÄ,ü:á0º,äýpÅ,ÐÄ,$¶,`/ Å,ââÿää8Å,ìãôµ,äšåTÅ,èäµ,øŒÏ'îxÅ,$¶,`/´Å,ÿèäàÅ,ìãôµ,ìüÅ,èäµ,ø¸,îøîä(Æ,ôµ,æ8Æ,ሰ,ädÆ,¼Æ,øáˆ°,äÆ,ü:áP´,älý4êþ8Èé Ç, Ö,PÇ,ô:€@Ç,ä$Ë,ü âPÇ,æä|Ç,Ö,è$€â¨Ç,äêœ1 ä˜Ç,ì â¨Ç,äâØÇ,ˆªíÖ,äpæh&ˆªå¨Ç,äøÇ,ãá¨È,´W äÈ,ØÇ,´W DÈ, ö~îäpÈ,ì!ã¨Ç,ìŒÈ,è˜Ç,ÿèXÉ,0V ä¸È,ØÇ,0V ôÈ, öämîä É,ì!ã¨Ç,ì<É,è˜Ç,ÿèË,hÆ ähÉ,ØÇ,hÆ ¤É, îøÉ,öä ÐÉ,ìÉ,¼Râ„€â¨Ç,âêœ1 ä˜Ç,ölÊ,€Ê,ççäçæáááxýâœ1 ˜Ç,â­â@áW∪å˜Ê,ä:¼RäÄÊ,èAwöæèØ áË,öQ î ê äÎ,ì.ä$Ë,ØÇ,ì.PÇ,âê`Ë,öÔË,èË,ççäçæáááxýâœ1 ˜Ç,ä²â@V∪åÌ,äV∪å¬Í,ä˜Ç,äDÌ,ØÌ,øá˜Ç,äpÌ,üá˜Ç,äœÌ,ü:áÈÌ,ä²þ â˜Ç,æèÍ,€Í,ø:è0Í,üâØÇ,Ì¡ lÍ, ÿäìâ4êþéØÍ,ü:áÈÌ,ä²þüÏ,2äÎ,ØÇ,2PÎ,îÐÎ,öä ŒÎ,ÄÎ,|Î,ä€â¨Ç,äæ â¨Ç, ä¨Î,œ1 ä˜Ç,ðˆ$ä|Î,öDÏ,lÏ,ççäçæáááxýâœ1 ˜Ç,ä·â @ˆ$|Î,â¸â@áU∪å„Ï,äá°Ï,äÀÏ,ü â¨Ç,æ:áìÏ,ä·þ â°Ï,æ"ìÕ,`/àÒ, Ð,ØÇ,`/HÐ,âêœÐ,öätÐ,Ð,è€â¨Ç,äêœ1 ä˜Ç,øÑ,$Ñ,ççäçæáááxýâœ1 ˜Ç,äÁâ@S∪åTÑ,äS∪åˆÒ,ä˜Ç,ä€Ñ,Ò,øá˜Ç,ä¬Ñ,üá˜Ç,äØÑ,ü:áÈÌ,äÁþè0Ò,\Ò,ø:è0Í,ü4êþé´Ò,ü:áÈÌ,äÁÿâèÒ,ØÇ,`/$Ó,î”Ó,öäPÓ,ˆÓ,è€â¨Ç,äælÓ,œ1 ä˜Ç,ðˆ$ä|Î,öÔ,0Ô,ççäçæáááxýâœ1 ˜Ç,ä¼â @ˆ$|Î,â½â@áT∪å`Ô,äT∪å”Õ,ä˜Ç,äŒÔ,Õ,øá˜Ç,ä¸Ô,üá˜Ç,ääÔ,ü:áÈÌ,ä¼þè<Õ,hÕ,ø:è0Í,ü4êþéÀÕ,ü:áÈÌ,ä¼ÿ∪åüÕ,¨Ç,â0Í,¨Ç,äò(Ö,éTÖ,ü:áP´,älýé¬Ö,ü:áP´,älþ×,äèÖ,åôµ,äâ€Ù,hÆ ä×,Ô¯,hÆ L×,î ×,öä x×,”×,¼Râ2„€â¤¯,â©éœ1 䈰,öØ,(Ø,ççäçæáááxýâœ1 ˆ°,âYá@_âÌDä@Ø,ä8¼Rä lØ,¨Ø, »,ô:â˜Ø,äк,ü â »,ê °Ø,ÜØ,äìØ,TÙ,ø ⤯,æÜØ,äÙ,ü:DÙ,äYý âÜØ,æ4êþ"¨æ,`/¼ß,Ù,Ô¯,`/ÌÙ,Pâê0Ú,öäøÙ,ì€â¤¯,ä§åÚ,œ1 䈰,ðL ä¼Rê¤Ú,ÌÚ,ççäçæáááxýâœ1 ˆ°,äbá @L ¼Râcá@]âÌDä,Û,ä]â ÌDôÛ,Ü,ä]â ÌDLÝ,pÝ,ä]â ÌDß,dß,ä8á°Ï,ä XÛ,”Û,HÐ,ô:â„Û,ä Ð,ü âHÐ,êœÛ,éÈÛ,ü:áP´,äbÿábá$Ë,ô∰,äDÜ,ÈÜ,øáˆ°,äpÜ,üሰ,äœÜ,ü:áP´,äbýèôÜ, Ý,ø:踴,ü4êÿâbá$Ë,ôâáôµ,äœÝ,ü8á̼,ä ÈÝ,Þ,(½,ô:âôÝ,äì¼,ü â(½,æ ¼Þ, Þ,ሰ,ä8Þ,Þ,øáˆ°,ädÞ,ü:áP´,äbý4êÿâ ÄÞ,¼RäðÞ,ü:´Uäcý@ß,bá$Ë,ôæbát¸,òâéß,ü:áP´,äbþæ,Äß,Ô¯,`/áà,Pâêdà,öä,à,ì€â¤¯,ä¨åHà,œ1 䈰,ðL äŒÏ'êØà,áá,ççäçæáááxýâœ1 ˆ°,ä]á @L ŒÏ'â^á@^âÌDä`á,ä^â ÌDâ,<â,ä^â ÌDpã,”ã,ä^â ÌD`å,¨å,ä8á°Ï,ä Œá,¸á,HÐ,ô:â„Û,ä Ð,ÿàÀá,éìá,ü:áP´,ä]ÿá]á$Ë,ô∰,ähâ,ìâ,øáˆ°,ä”â,üሰ,äÀâ,ü:áP´,ä]ýèã,Dã,ø:踴,ü4êÿâ]á$Ë,ôâáôµ,äÀã,ü8á̼,ä ìã,(ä, Å,ô:âä,äÐÄ,ü â Å,æ àä,0ä,ሰ,ä\ä,´ä,øáˆ°,äˆä,ü:áP´,ä]ý4êÿâ èä,å,ä$å,ü âxræ:På,ä^ý âŒÏ'æ„å,]á$Ë,ôæ]át¸,òâéÔå,ü:áP´,ä]ÿáæ,Ô¯,`/Dæ,ÿèäpæ,ì㤯,ìŒæ,舰,øܱ,îØu 䏿,¤¯,æ¨Ç,츴,¤¯,äâ8áÜØ,ä ç,Lç,ÌÙ,ô:â<ç,äÙ,ü âÌÙ,æ ¼ç,Tç,é€ç,ü:á¬ç,äxý â´«,ê Äç,¼Räðç,ü:´Uäyÿáxá4²,ôâ´«,älè,ðè,øá´«,ä˜è,üá´«,äÄè,ü:á¬ç,äxýèé,˜é,ø:èHé,üã«,øœ„é, ÿäìâ4êÿâxá4²,ôâéê,ü:á¬ç,äxý ôî,Hê,á «,`/„ê,Pîèê,öä°ê,ì€âЪ,ä­åÌê,œ1 ä´«,ðL äŒÏ'ê\ë,„ë,ççäçæáááxýâœ1 ´«,äsá @L ŒÏ'âtá@mâÌDäÌë,ämâ ÌD í,Dí,ämâ ÌDxî,œî,ä᤯,äøë,ü8áÜØ,ä$ì,`ì,áà,ô:âPì,äÄß,ü ãà,æ Àì,hì,é”ì,ü:á¬ç,äsÿá Èì,å,äôì,ü:På,ätÿásá4²,ôâ´«,äpí,ôí,øá´«,äœí,üá´«,äÈí,ü:á¬ç,äsýè î,Lî,ø:èHé,ü4êÿâsá4²,ôâéÈî,ü:á¬ç,äsÿáüî,á «,`/8ï,ÿèädï,ìãЪ,ì€ï,è´«,ø­,îŒå¬ï,Ъ,椯,ìHé,Ъ,äâdü,då èï,h&dá$ð,äê\ð,öä@ð,ìýÐð,äð,ççäçæáááxýâÌ/éÐá @ŽáDÛäüð,ä2€è(ñ,ü8é Tñ,Øû,ñ,ô:â€ñ,äÈñ,ü âñ,æä¬ñ,ìýh&€àñ,äääò,öxò, ò,ççäçáæáááxýâÌ/éºáÀøgè¾á€âü:ä8ô,ä’âü:ädô,Šâ“âü:äðô,Šâ”âü:ä|õ,Šâ•âü:äö,Šâ–âü:ä”ö,Šâ—âü:ä ÷,Šâ˜âü:ä¬÷,Šâ™âü:ì™âü:ä8ø,Šâ›âü:ì›âü:äÄø,Šââü:äPù,Šâžâü:äÜù,ŠâŸâü:ähú,Šâ âü:äôú,Šâ¢âü:ä€û,ä>áç¾ÿíðÿºááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâÿáâæ ÿäðÿÿäáâ¸Oÿñâ,å @ÿãðÿä æà?ÿñâ{æ@ÿäðÿÿäá â€Oÿñâ3ç@ÿãðÿä æà?ÿñâæ@ÿä ðÿ¾ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ¾ááÿÿÿ÷âŸå€Àÿäðÿºááÿÿÿ÷â•æ@ôé¬û,ü:á ¾äºÿáàû,2€è ü,üé8ü,ü:áüµäÐÿáÔä¨<ä¼-ä„ü,h&¼-Àü,ÿìäÜü,ïáøü,è¼Rìý,èÿê@X ä@ý,h&@X |ý,ð´ý,öä˜ý,ìí¼Rê(þ,<þ,ççäçæáááxýâÌ/á¼Râœá @háDÛäTþ,ä2€è€þ,ü8é ¬þ,Øþ,ð£,ô:âà£,ä(¤,ÿà àþ,¼Rä ÿ,ü:´Uäœý`ÿ,´MHÿ,Œ‡,Pÿ,0„,Xÿ, z,ä°v,ä$ äpÿ,h&$ ¬ÿ,ÿìäÈÿ,ïáäÿ,èî-ø-èö¼Rìl-ðå H-h&ðá„-äê¼-öä -ìý0-D-ççäçæáááxýâÌ/éÔá @áDÛä\-ä2€èˆ-ü8é ´-à-ñ,ô:â€ñ,äÈñ,ÿàè-2€è-üé@-ü:áp¨äÔÿáÜå |-h&Üá¸-ÿìäÔ-ïáð-è¼Rì -ø(-è¼Rö¼Rð(TäT-h&(T-ÿìä¬-ïáÈ-èêä-èÔ)ÿìÈá„--h&ÈáL-æÿääh-ïýœ-Œ-h&ÈáÈ-ï-öää-ìáýt-ˆ-ççäçæáááxýâÌ/éÝá @Èá ä -ä8é Ì-<--ô:âø-ä@-ü â-æä$-ìáýh&áÉ-äê|-öð--ççäçæáááxýâÌ/é¢á@ºâDÛä-ä2€èH-ü8é t-°-L-ô:â -ä-ü âL-ê¸-2€èä-üé-ü:áüµä¢ÿáD-ép-ü:áüµäÝý¤ -¤-h&Èáà-î -öäü-ìáýŒ -  -ççäçæáááxýâÌ/éáá @Êá ä¸ -ä8é ä -D - -ô:â -äX -ü â -æä< -ìáýh&¨Ë -äê” -ö - -ççäçæáááxýâÌ/é®á@ÀâDÛä4 -ä2€è` -ü8é Œ -¸ -L-ô:â -ä-ÿàÀ -2€èì -üé -ü:áp¨ä®ÿáL -éx -ü:áp¨äáý¤-¬ -h&Èáè -î -öä -ìáý” -¨ -ççäçæáááxýâÌ/é¹á@^âTäÀ -ä8é ì --L-ô:â -ä-ÿà -2€èL-üéx-ü:ᬨä¹ý¤-¬-h&Èáè-î -öä-ìáý”-¨-ççäçæáááxýâÌ/é½á@`âTäÀ-ä8é ì--L-ô:â -ä-ÿà -2€èL-üéx-ü:á¤*ä½ý´-¬-h&Èáè-î -öä-ìáý”-¨-ççäçæáááxýâÌ/éÁá@bâTäÀ-ä8é ì--L-ô:â -ä-ÿà -2€èL-üéx-ü:á¤-äÁý ì´-¼-h&Èáø-î0-öä-ìáý¤-¸-ççäçæáááxýâÌ/éÅá@dâTäÐ-ä8é ü-(-L-ô:â -ä-ÿà0-2€è\-üéˆ-ü:áèäÅýÄ-¼-h&Èáø-î0-öä-ìáý¤-¸-ççäçæáááxýâÌ/éÉá@gâTäÐ-ä8é ü-(-L-ô:â -ä-ÿà0-2€è\-üéˆ-ü:á´-äÉý ð Ì-h&Èá-î@-öä$-ìáý´-È-ççäçæáááxýâÌ/éÍá@kâTäà-ä8é -8-L-ô:â -ä-ÿà@-2€èl-üé˜-ü:áÄ-äÍý ì ¸P-$c ˜<-ä-h&$c -äääX-öä<-ìáýÌ-à-ççäçáæáááxýâÌ/éîá Àîáü:ä -âðáü:äP-äñáü:äì9-äòáü:ìöáü:äœ:-Šâ÷áü:ä(;-Šâøáü:ä´;-Šâúáü:ä@<-äéÌ-$-øéø-ü:á ¾äîý5ÿêé|-À9-øé¨-üáÔ-ä„8-”9-ø âä-æÐá-Ðù èT8-èâpêÐù ää-ä4-ãá-2äD--2€-ÿèä¼-ä¬-äãä-ì âä- äè-èØ-ì âä-ð¬-êX-4ä-æ4,-äÌá â<-æú¼.-€Oäh-â -€O€-ä„áHâ°-¼Ì è|.-èâpê¼Ì ä€-äÐ- ãá -2äà-°-2-ÿèäX-äH-äã€-ì â€- ä„-èt-ì â€-ðH-ê-ô:â >-äT>-ü â>-æä8>-ìáýh&l:>-äê>-ö?-?-ççäçæáááxýâÌ/éüá @¢áDÛä0?-ä2€è\?-ü8é ˆ?-Ä?- -ô:â´?-ää-ü â -êÌ?-2€èø?-üé$@-ü:áüµäüÿáX@-é„@-ü:áüµä9ý¸D-¸@-h&$c ô@-î,A-öäA-ìáý A-´A-ççäçæáááxýâÌ/é=á @ºá äÌA-ä8é øA-XD-4B-ô:â$B-älB-ü â4B-æäPB-ìáýh&€>4B-äê¨B-öC-0C-ççäçæáááxýâÌ/êá @¤áDÛäHC-ä2€ètC-ü8é  C-ÌC- -ô:â´?-ää-ÿàÔC-2€éD-üé,D-ü:áp¨åÿá`D-éŒD-ü:áp¨ä=ý¸F-ÀD-h&$c üD-î4E-öäE-ìáý¨E-¼E-ççäçæáááxýâÌ/é á @œ áTäÔE-ä8ê F-,F- -ô:â´?-ää-ÿà4F-2€è`F-üéŒF-ü:ᬨä ý¸H-ÀF-h&$c üF-î4G-öäG-ìáý¨G-¼G-ççäçæáááxýâÌ/éá @ž áTäÔG-ä8ê H-,H- -ô:â´?-ää-ÿà4H-2€è`H-üéŒH-ü:á¤*äý¸J-ÀH-h&$c üH-î4I-öäI-ìáý¨I-¼I-ççäçæáááxýâÌ/éá @  áTäÔI-ä8ê J-,J- -ô:â´?-ää-ÿà4J-2€è`J-üéŒJ-ü:á¤-äý¸L-ÀJ-h&$c üJ-î4K-öäK-ìáý¨K-¼K-ççäçæáááxýâÌ/éá @¢ áTäÔK-ä8ê L-,L- -ô:â´?-ää-ÿà4L-2€è`L-üéŒL-ü:áèäý¸N-ÀL-h&$c üL-î4M-öäM-ìáý¨M-¼M-ççäçæáááxýâÌ/éá @¥ áTäÔM-ä8ê N-,N- -ô:â´?-ää-ÿà4N-2€è`N-üéŒN-ü:á´-äÿáÀN-h&$c üN-î4O-öäO-ìáý¨O-¼O-ççäçæáááxýâÌ/éá @© áTäÔO-ä8ê P-,P- -ô:â´?-ää-ÿà4P-2€è`P-üéŒP-ü:áÄ-äÿáÈäÈP-h&ÈQ-ðáçÅý>áçÆÿíðÿÁááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâÿáâæ ÿäðÿÿäá â(Oÿñâ,å @ÿãðÿä æà?ÿñâ{æ@ÿäðÿÿäá âðOÿñâ3ç@ÿãðÿä æà?ÿñâæ@ÿä ðÿÅááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿÆááÿÿÿ÷â˜æ@ÿä ðÿÅááÿÿÿ÷âŸå€Àôéàb-ü:á¤-äÆÿác-2€è@c-üélc-ü:áüµä‚ÿáHm ä¨c-Û&æXh äÀc-P¢'æL=@k-Øc-h&L=d-äêhd-öä0d-ìáLd-ÿôÜd-e-ççäçæáááxýâÌ/ésá@<0étá@¢âDÛäe-ä8é He-Tj-„e-ô:âte-äØe-ü â„e-æä e-ìá¼e-ÿôh& È„e-äääf-öˆf-°f-ççäçáæáááxýâÌ/éãáÀøÕèäá À-áü:ä@g-Šâ/áü:äÌg-Šâ0áü:äXh-Šâ1áü:ääh-Šâ2áü:äpi-Šâ4áü:äüi-ôðÿäááÿÿÿ÷â–æ@ÿäðÿãááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¿æ@ÿäðÿäáÿøâ•æ@ÿäðÿãááÿÿÿ÷â•æ@ôé(j-ü:á ¾äãý ´j-\j-éˆj-ü:á ¾äsÿá¼j-2€èèj-üék-ü:á¤-ätýxp-Hk-h&L=„k-îØk-öä k-ìáá¼k-ÿôLl-tl-ççäçæáááxýâÌ/éá@<0éá @¨á äŒl-ä8é ¸l-¸o-ôl-ô:âäl-äHm-ü âôl-æäm-ìá,m-ÿôh&xDôl-äê„m-öøm- n-ççäçæáááxýâÌ/éØá@<0éÙá @’áDÛä8n-ä2€èdn-ü8é n-Ìn-d-ô:â¼n-äØc-ü âd-æ Xo-Ôn-2€éo-üé,o-ü:áüµäØÿá`o-éŒo-ü:á¤-äÙý p-Ào-éìo-ü:áüµäÿá p-éLp-ü:á¤-äý u-€p-h&L=¼p-îq-öäØp-ìááôp-ÿô„q-¬q-ççäçæáááxýâÌ/éá@<0éá @ªá äÄq-ä8é ðq-àt-,r-ô:âr-ä€r-ü â,r-æäHr-ìádr-ÿôh&H,r-äê¼r-ö0s-Xs-ççäçæáááxýâÌ/éÝá@<0éÞá @”áDÛäps-ä2€èœs-ü8é Ès-ôs-d-ô:â¼n-äØc-ü €t-üs-2€è(t-üéTt-ü:áp¨äÝÿáˆt-é´t-ü:á¤-äÞý @u-èt-éu-ü:áp¨äÿáHu-étu-ü:á¤-äý0x-¨u-h&L=äu-î8v-öåv-ìááv-ÿô¬v-Ôv-ççäçæáááxýâÌ/éžá@<0éŸá @\ áTäìv-ä8é w-Dw-d-ô:â¼n-äØc-ü Ðw-Lw-2€èxw-üé¤w-ü:ᬨäžÿáØw-éx-ü:á¤-äŸýÀz-8x-h&L=tx-îÈx-öäx-ìáá¬x-ÿôáç¯ÿíðÿ«ááÿÿÿ÷â“æ@ÿä ðÿ¯ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ¯ááÿÿÿ÷âŸå€Àÿäðÿ«ááÿÿÿ÷â•æ@ôéèŽ-ü:á ¾ä«ÿá-2€èH-üét-ü:áp¨äÿá¬7$-°-h&¬7ì-ÿìä-ïý|’-,-h&¬7h-î -öä„-ìáý‘-(‘-ççäçæáááxýâ@)é0â@„â Óä@‘-ä8é l‘-’-¨‘-ô:☑-äà‘-ü ⨑-æäÄ‘-ïýh&> ¨‘-æÿè$’-éP’-ü:á¤-ä0þÔ”-„’-h&¬7À’-îø’-öäÜ’-ìáýl“-€“-ççäçæáááxýâ@)é9â@Šâ Ó䘓-ä8éÄ“-t”-á”-ô:âð“-ä8”-ü ã”-æä”-ïý h&˜å á”-æÿè|”-騔-ü:á´-ä9þ`™-Ü”-h&¬7•-îP•-öä4•-ìáýÄ•-Ø•-ççäçæáááxýâÌ/éaá @çá äð•-ä8é–-á™-X–-ô:âH–-ä–-ü âX–-æät–-ìáýh&8 X–-äêÌ–-ö@—-T—-ççäçæáááxýâÌ/éìá@öâDÛäl—-ä2€è˜—-ü8éÄ—-t˜-á˜-ô:âð—-ä8˜-ü ã˜-æä˜-ïý h&Pœ á˜-æÿè|˜-2€è¨˜-üéÔ˜-ü:áüµäìÿá™-é4™-ü:áüµäaý4›-h™-h&¬7¤™-îÜ™-öäÀ™-ìáýPš-dš-ççäçæáááxýâÌ/éeá @éá ä|š-ä8騚-Ôš-á˜-ô:âð—-ä8˜-ÿàÜš-é›-ü:á ¾äeÿá<›-h&¬7x›-î°›-öä”›-ìáý$œ-8œ-ççäçæáááxýâÌ/éiá @ëá äPœ-ä8é |œ-Üž-¸œ-ô:⨜-äðœ-ü ⸜-æäÔœ-ìáýh&¬  ¸œ-äê,-ö -´-ççäçæáááxýâÌ/éðá@øâDÛäÌ-ä2€èø-ü8é$ž-Pž-á˜-ô:âð—-ä8˜-ÿàXž-2€è„ž-üé°ž-ü:áp¨äðÿáäž-éŸ-ü:áp¨äiýXŸ-ÜBäLŸ-î8ähŸ-h&8¤Ÿ-ÿìäÀŸ-òÜŸ-è8ýìøŸ-ÿø\u ä$ -â „ -\u < -èâh&T -äÐ ä l -< -ì $ -ÐÝ< -îª< -ì å ¬ -h& áè -äê ¡-öä¡-ìáý”¡-¨¡-ççäçæáááxýâÌ/éÈá@ÔâDÛäÀ¡-ä2€èì¡-ü8é ¢-È¢-T¢-ô:âD¢-䌢-ü âT¢-æäp¢-ïýh&<4T¢-æÿèТ-2€èü¢-üé(£-ü:áüµäÈÿádp äd£-h&dp  £-äêØ£-öä¼£-ìýL¤-`¤-ççäçæáááxýâÌ/éá @¶áDÛäx¤-ä2€è¤¤-ü8é Ф-ü¤-x‰-ô:âh‰-ä°‰-ÿà¥-2€è0¥-üé\¥-ü:áüµäý ¥-ð嘥-$Pæàå °¥-h&àáì¥-äê$¦-öä¦-ìáý˜¦-¬¦-ççäçæáááxýâÌ/éÌá@ÖâDÛäĦ-ä2€èð¦-ü8é §-H§-T¢-ô:âD¢-䌢-ÿàP§-2€è|§-ü騧-ü:áp¨äÌÿá Jä§-Èø"ä tØ"ü§-Äy ä€5äpJä ¨-h&pJH¨-ÿìäd¨-ïဨ-è¼Röœ¨-ì ⬨-æTâܨ-¨B è(³-èâpæh&¨B 䬨-äü¨-ãáÌ©-2ä ©-ܨ-2H©-ÿèä„©-ät©-ä㬨-ì ⬨- ä°©-è ©-ì ⬨-ðt©-êô©-LþäÜ©-æLþœ¨-äPâHª-  äª-â Ü©-  ª-äLâ â,ª-æú¸ª-Œ äXª-â ª-Œ pª-äHâ ‪-æäœª-ÿî|«-ÀäȪ-â Xª-Ààª-äDâ âðª-æä «-ò(«-øD«-èðþì`«-è¤*øª-줫-ˆX䌫-â Ȫ-ˆXàª-ä@âh¬-äh­-â @­- >ðþä ⨭-ä¡ä­-âh­-ä¡èâä­-„±ä¸­-â ­-„±Э-äâ êä ®-\ç äô­-â ¸­-\ç ®-äâ êäH®-p6 ä0®-âô­-p6 èâp®-Ô§äX®-â0®-Ô§è☮-¨"䀮-âX®-¨"è☰-\䨮-â €®-\À®-äââð®-l èt°-èâpæh&l äÀ®-ä¯-ãáà¯-2ä ¯-ð®-2\¯-ÿè䘯-䈯-äãÀ®-ì âÀ®- äį-è´¯-ì âÀ®-ðˆ¯-ê°- *äð¯-æ *èâ0°-Ô) ä°-âð¯-Ô) èâd°-\ ä@°-â °-\ X°-èæã(jät°-â @°-(jŒ°-èç³-èÈ䨰-â ¨®-èÈÀ°-äââð°-’ èô²-èâpæh&’ äÀ°-ä±-ãáà±-2ä ±-ð°-2\±-ÿè䘱-䈱-äãÀ°-ì âÀ°- äı-è´±-ì âÀ°-ðˆ±-ê²- äð±-æ ²-èæ H²-0jä$²-â ð±-0j<²-èæ |²-,ÿäX²-â $²-,ÿp²-èæ°²-Ü>䌲-â X²-Ü>¤²-èæä²-œ{äÀ²-â Œ²-œ{ز-èæã,Gäô²-â À²-,G ³-èç@³-\æä(³-⨰-\æð¨B äP³-¬¨-æ t ä(¤,ä $å x³-h& $á´³-ÿìäг-ïáì³-èê´-èÿêtw ä4´-øTêD*áP´-@L!äd>!äQäh´-h&Q¤´-ÿìäÀ´-ïáÜ´-ÿ䜨-ð@Räµ-äDâÐÂ- Sä µ-(µ-â â Xµ- S¬Â-èÀÂ-äpæh& Sä(µ-äxµ-ãá8¶-´W 䈵-Xµ-´W ĵ- öD/ îäðµ-ì!ã(µ-ì¶-è ¶-ì â(µ-ÿàè¶-0V äH¶-Xµ-0V „¶- öP îä°¶-ì!ã(µ-ì̶-è ¶-ÿ訷-2äø¶-Xµ-24·-ÿèäp·-ä`·-äã(µ-ì â(µ- 䌷-è ¶-ø`·-ê<¸-ì.丷-Xµ-ì.ô·-ÿèä ¸-ì0!ã(µ-ø ¶-ì"”Â-`/H½-L¸-Xµ-`/ˆ¸-Pîì¸-öä´¸-ì€â(µ-äªåи-œ1 ä ¶-ðL ä¼Rê`¹-ˆ¹-ççäçæáááxýâœ1 ¶-äná @L ¼Râoá@fâÌDäй-äfâ ÌD$»-H»-äfâ ÌD̼-ð¼-ä᤯,äü¹-ü8áÜØ,ä (º-Tº-ÌÙ,ô:â<ç,äÙ,ü ĺ-\º-鈺-ü:á´º-äný â ¶-ê ̺-¼Räøº-ü:´Uäoÿáná4²,ôâ ¶-ät»-ø»-øá ¶-ä »-üá ¶-äÌ»-ü:á´º-änýè$¼- ¼-ø:èP¼-üâXµ-D Œ¼- ÿäìâ4êÿâná4²,ôâé½-ü:á´º-änýìÁ-P½-Xµ-`/Œ½-Pîð½-ö丽-ì€â(µ-ä«åÔ½-œ1 ä ¶-ðL äŒÏ'êd¾-Œ¾-ççäçæáááxýâœ1 ¶-ägá @L ŒÏ'âhá@gâÌDäÔ¾-ägâ ÌDÀ-<À-ägâ ÌDpÁ-”Á-ä᤯,å¿-ü8áÜØ,ä,¿-X¿-áà,ô:âPì,äÄß,ü ¸¿-`¿-錿-ü:á´º-ägÿá À¿-å,äì¿-ü:På,ähÿágá4²,ôâ ¶-ähÀ-ìÀ-øá ¶-ä”À-üá ¶-äÀÀ-ü:á´º-ägýèÁ-DÁ-ø:èP¼-ü4êÿâgá4²,ôâéÀÁ-ü:á´º-ägÿáôÁ-Xµ-`/0Â-ÿèä\Â-ìã(µ-ìxÂ-è ¶-ø`·-î Sä¤Â-(µ-椯,ìP¼-(µ-äæˆƒ äàÂ-h&ˆƒ Ã-ÿìäHÃ-ä8Ã-çá â´4-ò¤-îÐ-å tÃ-h&Ð-á°Ã-ðèÃ-öäÌÃ-ìáý\Ä-pÄ-ççäçæáááxýâT#éâ@=â$äˆÄ-ä7é ´Ä-@Æ-lÆ-ôéàÄ-Å-øé Å-dÅ-øé8Å-ü:ᬨäþ4ÿêé¼Å-Æ-øéèÅ-ü:ᬨäþ4ëý4ÿêé˜Æ-`É-ø2éÄÆ-üéðÆ-üáX+-äÇ-°È-øáX+-äHÇ-üá|(-ätÇ-„È-øá|(-ä Ç-üáÔ-äÌÇ-XÈ-ø8áÔ-ä øÇ-$È-ì8-ô:âÜ8-ä$9-ÿà,È-4êþ4ê¼ý4êþ éÜÈ-4É-øéÉ-ü:ᬨäþ4êþ4ëý¤É-l„ œÉ-ı+äH¯+ä hT´É-äÐ+äÀÃ+äì} äÌÉ-î”UÑ-èÉ-h&”U$Ê-äääxÊ-öä@Ê-ìá\Ê-ÿôìÊ- (Ë-ççäçáæáááxýâÌ/éaáÀ<0ébáÀl0éfá €ãáü:ä0Ì-äæáü:ä\Ì-Šâçáü:äèÌ-Šâèáü:ìèáü:ätÍ-Šâêáü:åÎ-Šâëáü:äŒÎ-Šâìáü:äÏ-Šâíáü:ä¤Ï-Šâîáü:ä0Ð-Šâñáü:ä¼Ð-ä>áçfÿíðÿbááÿÿÿ÷â“æ@ÿäðÿaááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¾æ@ÿä ðÿäÿûâ¨æAÿä ðÿäáðáÿââæ ÿäðÿÿäáâ€Oÿñâ,å @ÿãðÿfááÿÿÿ÷â•æ@ÿäðÿäÿûâ•æ@ôéèÐ-ü:á ¾äfýxÖ-Ñ-h&”UXÑ-î¬Ñ-öätÑ-ìááÑ-ÿô Ò-HÒ-ççäçæáááxýâÌ/éïá@<0éðá @˜á ä`Ò-ä8é ŒÒ-¸Õ-ÈÒ-ô:â¸Ò-äÓ-ü âÈÒ-æääÒ-ìâÓ-ÿôh&(\ÈÒ-äêXÓ-öÌÓ-ôÓ-ççäçæáááxýâÌ/é²á@<0é³á @‚áDÛä Ô-ä2€è8Ô-ü8é dÔ- Ô-$Ê-ô:âÔ-äèÉ-ü â$Ê-æ ,Õ-¨Ô-2€èÔÔ-üêÕ-ü:áüµä²ÿá4Õ-2€è`Õ-üéŒÕ-ü:áüµä³ý Ö-ÀÕ-éìÕ-ü:áüµäïÿá Ö-éLÖ-ü:áüµäðýÌÛ-€Ö-h&”U¼Ö-î×-öäØÖ-ìááôÖ-ÿô„×-¬×-ççäçæáááxýâÌ/éôá@<0éõá @šá äÄ×-ä8é ð×- Û-,Ø-ô:âØ-䀨-ü â,Ø-æäHØ-ìádØ-ÿôh&d`,Ø-äê¼Ø-ö0Ù-XÙ-ççäçæáááxýâÌ/é·á@<0é¸á @„áDÛäpÙ-ä2€èœÙ-ü8é ÈÙ-ôÙ-$Ê-ô:âÔ-äèÉ-ü €Ú-üÙ-2€è(Ú-üéTÚ-ü:áp¨ä·ÿáˆÚ-2€è´Ú-üéàÚ-ü:áp¨ä¸ý lÛ-Û-é@Û-ü:áp¨äôÿátÛ-é Û-ü:áp¨äõý\Þ-ÔÛ-h&”UÜ-îdÜ-öä,Ü-ìááHÜ-ÿôØÜ-áÝ-ççäçæáááxýâÌ/éá@<0éá @´ áTäÝ-ä8é DÝ-pÝ-$Ê-ô:âÔ-äèÉ-ü ÐÝ-xÝ-é¤Ý-ü:á ¾äÿáØÝ-2€èÞ-üé0Þ-ü:ᬨäýá-dÞ-h&”U Þ-îôÞ-öä¼Þ-ìááØÞ-ÿôhß-ß-ççäçæáááxýâÌ/éá@<0éá @¶ áTä¨ß-ä8éÔß-áà-$Ê-ô:âÔ-äèÉ-ü Œà-à-2€è4à-üé`à-ü:ᬨäÿá”à-2€èÀà-üéìà-ü:ᬨäýÔã- á-h&”U\á-î°á-öäxá-ìáá”á-ÿô$â-Lâ-ççäçæáááxýâÌ/éá@<0éá @¸ áTädâ-ä8é â-¼â-$Ê-ô:âÔ-äèÉ-ü Hã-Äâ-2€èðâ-üéã-ü:á¤*äÿáPã-2€è|ã-üé¨ã-ü:ᬨäýæ-Üã-h&”Uä-îlä-öä4ä-ìááPä-ÿôàä-å-ççäçæáááxýâÌ/é#á@<0é$á @º áTä å-ä8é Lå-xå-$Ê-ô:âÔ-äèÉ-ü æ-€å-2€è¬å-üéØå-ü:á¤-ä#ÿá æ-2€è8æ-üédæ-ü:ᬨä$ýLé-˜æ-h&”UÔæ-î(ç-öäðæ-ìáá ç-ÿôœç-Äç-ççäçæáááxýâÌ/é(á@<0é)á @¼ áTäÜç-ä8é è-4è-$Ê-ô:âÔ-äèÉ-ü Àè-<è-2€èhè-üé”è-ü:áèä(ÿáÈè-2€èôè-üé é-ü:ᬨä)ýì-Té-h&”Ué-îäé-öä¬é-ìááÈé-ÿôXê-€ê-ççäçæáááxýâÌ/é-á@<0é.á @¿ áTä˜ê-ä8é Äê-ðê-$Ê-ô:âÔ-äèÉ-ü |ë-øê-2€è$ë-üéPë-ü:á´-ä-ÿá„ë-2€è°ë-üéÜë-ü:ᬨä.ýÄî-ì-h&”ULì-î ì-öähì-ìáá„ì-ÿôí-<í-ççäçæáááxýâÌ/é2á@<0é3á @à áTäTí-ä8é €í-¬í-$Ê-ô:âÔ-äèÉ-ü 8î-´í-2€èàí-üé î-ü:áÄ-ä2ÿá@î-2€èlî-üé˜î-ü:ᬨä3ý€ñ-Ìî-h&”Uï-î\ï-öä$ï-ìáá@ï-ÿôÐï-øï-ççäçæáááxýâÌ/é7á@<0é8á @Æ áTäð-ä8é <ð-hð-$Ê-ô:âÔ-äèÉ-ü ôð-pð-2€èœð-üéÈð-ü:áüµä7ÿáüð-2€è(ñ-üéTñ-ü:ᬨä8ýô-ˆñ-h&”UÄñ-îò-öäàñ-ìááüñ-ÿôŒò-´ò-ççäçæáááxýâÌ/é<á@<0é=á @È áTäÌò-ä8é øò-$ó-,Ø-ô:âØ-䀨-ü „ó-,ó-éXó-ü:áp¨ä<ÿáŒó-2€è¸ó-üéäó-ü:ᬨä=ý ö-ô-h&”UTô-î¨ô-öäpô-ìááŒô-ÿôõ-Dõ-ççäçæáááxýâÌ/éAá@<0éBá @Ê áTä\õ-ä8é ˆõ-´õ-$Ê-ô:âÔ-äèÉ-ü ö-¼õ-éèõ-ü:á ¾äAÿáö-2€èHö-üétö-ü:á¤*äBý\ù-¨ö-h&”Uäö-î8÷-öå÷-ìáá÷-ÿô¬÷-Ô÷-ççäçæáááxýâÌ/éFá@<0éGá @Ì áTäì÷-ä8é ø-Dø-$Ê-ô:âÔ-äèÉ-ü Ðø-Lø-2€èxø-ü餸-ü:ᬨäFÿáØø-2€èù-üé0ù-ü:á¤*äGýü-dù-h&”U ù-îôù-öä¼ù-ìááØù-ÿôhú-ú-ççäçæáááxýâÌ/éKá@<0éLá @Î áTä¨ú-ä8éÔú-áû-$Ê-ô:âÔ-äèÉ-ü Œû-û-2€è4û-üé`û-ü:á¤*äKÿá”û-2€èÀû-üéìû-ü:á¤*äLýÔþ- ü-h&”U\ü-î°ü-öäxü-ìáá”ü-ÿô$ý-Lý-ççäçæáááxýâÌ/éPá@<0éQá @Ð áTädý-ä8é ý-¼ý-$Ê-ô:âÔ-äèÉ-ü Hþ-Äý-2€èðý-üéþ-ü:á¤-äPÿáPþ-2€è|þ-üé¨þ-ü:á¤*äQý.Üþ-h&”Uÿ-îlÿ-öä4ÿ-ìááPÿ-ÿôàÿ-.ççäçæáááxýâÌ/éUá@<0éVá @Ò áTä .ä8é L.x.$Ê-ô:âÔ-äèÉ-ü .€.2€è¬.üéØ.ü:áèäUÿá .2€è8.üéd.ü:á¤*äVýL.˜.h&”UÔ.î(.öäð.ìáá .ÿôœ.Ä.ççäçæáááxýâÌ/éZá@<0é[á @Õ áTäÜ.ä8é .4.$Ê-ô:âÔ-äèÉ-ü À.<.2€èh.üé”.ü:á´-äZÿáÈ.2€èô.üé .ü:á¤*ä[ý.T.h&”U.îä.öä¬.ìááÈ.ÿôX.€.ççäçæáááxýâÌ/é_á@<0é`á @Ù áTä˜.ä8é Ä.ð.$Ê-ô:âÔ-äèÉ-ü |.ø.2€è$.üéP.ü:áÄ-ä_ÿá„.2€è°.üéÜ.ü:á¤*ä`ýÄ ..h&”UL.î .öäh.ìáá„.ÿô.<.ççäçæáááxýâÌ/édá@<0éeá @Ü áTäT.ä8é €.¬.$Ê-ô:âÔ-äèÉ-ü 8 .´.2€èà.üé .ü:áüµädÿá@ .2€èl .üé˜ .ü:á¤*äeýT .Ì .h&”U .î\ .öä$ .ìáá@ .ÿôÐ .ø .ççäçæáááxýâÌ/éiá@<0éjá @Þ áTä .ä8é < .h .,Ø-ô:âØ-䀨-ü È .p .éœ .ü:áp¨äiÿáÐ .2€èü .üé( .ü:á¤*äjýä.\ .h&”U˜ .îì .öä´ .ìááÐ .ÿô` .ˆ .ççäçæáááxýâÌ/éná@<0éoá @à áTä  .ä8é Ì .ø .$Ê-ô:âÔ-äèÉ-üX.á.é,.ü:á ¾änÿá`.2€èŒ.üé¸.ü:á¤-äoý .ì.h&”U(.î|.öäD.ìáá`.ÿôð..ççäçæáááxýâÌ/ésá@<0étá @â áTä0.ä8é \.ˆ.$Ê-ô:âÔ-äèÉ-ü ..2€è¼.üéè.ü:ᬨäsÿá.2€èH.üét.ü:á¤-ätý\.¨.h&”Uä.î8.öå.ìáá.ÿô¬.Ô.ççäçæáááxýâÌ/éxá@<0éyá @ä áTäì.ä8é .D.$Ê-ô:âÔ-äèÉ-ü Ð.L.2€èx.üé¤.ü:á¤*äxÿáØ.2€è.üé0.ü:á¤-äyý.d.h&”U .îô.öä¼.ìááØ.ÿôh..ççäçæáááxýâÌ/é}á@<0é~á @æ áTä¨.ä8éÔ.á.$Ê-ô:âÔ-äèÉ-ü Œ..2€è4.üé`.ü:á¤-ä}ÿá”.2€èÀ.üéì.ü:á¤-ä~ýÔ. .h&”U\.î°.öäx.ìáá”.ÿô$.L.ççäçæáááxýâÌ/é‚á@<0éƒá @è áTäd.ä8é .¼.$Ê-ô:âÔ-äèÉ-ü H.Ä.2€èð.üé.ü:áèä‚ÿáP.2€è|.üé¨.ü:á¤-äƒý.Ü.h&”U.îl.öä4.ìááP.ÿôà..ççäçæáááxýâÌ/é‡á@<0éˆá @ë áTä .ä8é L.x.$Ê-ô:âÔ-äèÉ-ü .€.2€è¬.üéØ.ü:á´-ä‡ÿá .2€è8.üéd.ü:á¤-äˆýL.˜.h&”UÔ.î(.öäð.ìáá .ÿôœ.Ä.ççäçæáááxýâÌ/éŒá@<0éá @ï áTäÜ.ä8é .4.$Ê-ô:âÔ-äèÉ-ü À.<.2€èh.üé”.ü:áÄ-äŒÿáÈ.2€èô.üé .ü:á¤-äý".T.h&”U.îä.öä¬.ìááÈ.ÿôX .€ .ççäçæáááxýâÌ/é‘á@<0é’á @ò áTä˜ .ä8é Ä .ð .$Ê-ô:âÔ-äèÉ-ü |!.ø .2€è$!.üéP!.ü:áüµä‘ÿá„!.2€è°!.üéÜ!.ü:á¤-ä’ý˜$.".h&”UL".î ".öäh".ìáá„".ÿô#.<#.ççäçæáááxýâÌ/é–á@<0é—á @ô áTäT#.ä8é €#.¬#.,Ø-ô:âØ-䀨-ü $.´#.éà#.ü:áp¨ä–ÿá$.2€è@$.üél$.ü:á¤-ä—ý('. $.h&”UÜ$.î0%.öäø$.ìáá%.ÿô¤%.Ì%.ççäçæáááxýâÌ/é›á@<0éœá @ö áTää%.ä8é &.<&.$Ê-ô:âÔ-äèÉ-ü œ&.D&.ép&.ü:á ¾ä›ÿá¤&.2€èÐ&.üéü&.ü:áèäœýä).0'.h&”Ul'.îÀ'.öäˆ'.ìáá¤'.ÿô4(.\(.ççäçæáááxýâÌ/é á@<0é¡á @ø áTät(.ä8é  (.Ì(.$Ê-ô:âÔ-äèÉ-ü X).Ô(.2€é).üé,).ü:ᬨä ÿá`).2€èŒ).üé¸).ü:áèä¡ý ,.ì).h&”U(*.î|*.öäD*.ìáá`*.ÿôð*.+.ççäçæáááxýâÌ/é¥á@<0é¦á @ú áTä0+.ä8é \+.ˆ+.$Ê-ô:âÔ-äèÉ-ü ,.+.2€è¼+.üéè+.ü:á¤*ä¥ÿá,.2€èH,.üét,.ü:áèä¦ý\/.¨,.h&”Uä,.î8-.öå-.ìáá-.ÿô¬-.Ô-.ççäçæáááxýâÌ/éªá@<0é«á @ü áTäì-.ä8é ..D..$Ê-ô:âÔ-äèÉ-ü Ð..L..2€èx..üé¤..ü:á¤-äªÿáØ..2€è/.üé0/.ü:áèä«ý2.d/.h&”U /.îô/.öä¼/.ìááØ/.ÿôh0.0.ççäçæáááxýâÌ/é¯á@<0é°á @þ áTä¨0.ä8éÔ0.á1.$Ê-ô:âÔ-äèÉ-ü Œ1.1.2€è41.üé`1.ü:áèä¯ÿá”1.2€èÀ1.üéì1.ü:áèä°ýÔ4. 2.h&”U\2.î°2.öäx2.ìáá”2.ÿô$3.L3.ççäçæáááxýâÌ/é´á@<0éµá @ áTäd3.ä8é 3.¼3.$Ê-ô:âÔ-äèÉ-ü H4.Ä3.2€èð3.üé4.ü:á´-ä´ÿáP4.2€è|4.üé¨4.ü:áèäµý7.Ü4.h&”U5.îl5.öä45.ìááP5.ÿôà5.6.ççäçæáááxýâÌ/é¹á@<0éºá @ áTä 6.ä8é L6.x6.$Ê-ô:âÔ-äèÉ-ü 7.€6.2€è¬6.üéØ6.ü:áÄ-ä¹ÿá 7.2€è87.üéd7.ü:áèäºýL:.˜7.h&”UÔ7.î(8.öäð7.ìáá 8.ÿôœ8.Ä8.ççäçæáááxýâÌ/é¾á@<0é¿á @ áTäÜ8.ä8é 9.49.$Ê-ô:âÔ-äèÉ-ü À9.<9.2€èh9.üé”9.ü:áüµä¾ÿáÈ9.2€èô9.üé :.ü:áèä¿ýÜ<.T:.h&”U:.îä:.öä¬:.ìááÈ:.ÿôX;.€;.ççäçæáááxýâÌ/éÃá@<0éÄá @ áTä˜;.ä8é Ä;.ð;.,Ø-ô:âØ-䀨-ü P<.ø;.é$<.ü:áp¨äÃÿáX<.2€è„<.üé°<.ü:áèäÄýl?.ä<.h&”U =.ît=.öä<=.ìááX=.ÿôè=.>.ççäçæáááxýâÌ/éÈá@<0éÉá @ áTä(>.ä8é T>.€>.$Ê-ô:âÔ-äèÉ-ü à>.ˆ>.é´>.ü:á ¾äÈÿáè>.2€è?.üé@?.ü:á´-äÉý(B.t?.h&”U°?.î@.öäÌ?.ìááè?.ÿôx@. @.ççäçæáááxýâÌ/éÍá@<0éÎá @ áTä¸@.ä8é ä@.A.$Ê-ô:âÔ-äèÉ-ü œA.A.2€èDA.üépA.ü:ᬨäÍÿá¤A.2€èÐA.üéüA.ü:á´-äÎýäD.0B.h&”UlB.îÀB.öäˆB.ìáá¤B.ÿô4C.\C.ççäçæáááxýâÌ/éÒá@<0éÓá @ áTätC.ä8é  C.ÌC.$Ê-ô:âÔ-äèÉ-ü XD.ÔC.2€éD.üé,D.ü:á¤*äÒÿá`D.2€èŒD.üé¸D.ü:á´-äÓý G.ìD.h&”U(E.î|E.öäDE.ìáá`E.ÿôðE.F.ççäçæáááxýâÌ/é×á@<0éØá @ áTä0F.ä8é \F.ˆF.$Ê-ô:âÔ-äèÉ-ü G.F.2€è¼F.üéèF.ü:á¤-ä×ÿáG.2€èHG.üétG.ü:á´-äØý\J.¨G.h&”UäG.î8H.öåH.ìááH.ÿô¬H.ÔH.ççäçæáááxýâÌ/éÜá@<0éÝá @ áTäìH.ä8é I.DI.$Ê-ô:âÔ-äèÉ-ü ÐI.LI.2€èxI.üé¤I.ü:áèäÜÿáØI.2€èJ.üé0J.ü:á´-äÝýM.dJ.h&”U J.îôJ.öä¼J.ìááØJ.ÿôhK.K.ççäçæáááxýâÌ/éáá@<0éâá @ áTä¨K.ä8éÔK.áL.$Ê-ô:âÔ-äèÉ-ü ŒL.L.2€è4L.üé`L.ü:á´-äáÿá”L.2€èÀL.üéìL.ü:á´-äâýÔO. M.h&”U\M.î°M.öäxM.ìáá”M.ÿô$N.LN.ççäçæáááxýâÌ/éæá@<0éçá @ áTädN.ä8é N.¼N.$Ê-ô:âÔ-äèÉ-ü HO.ÄN.2€èðN.üéO.ü:áÄ-äæÿáPO.2€è|O.üé¨O.ü:á´-äçýR.ÜO.h&”UP.îlP.öä4P.ìááPP.ÿôàP.Q.ççäçæáááxýâÌ/éëá@<0éìá @ áTä Q.ä8é LQ.xQ.$Ê-ô:âÔ-äèÉ-ü R.€Q.2€è¬Q.üéØQ.ü:áüµäëÿá R.2€è8R.üédR.ü:á´-äìý U.˜R.h&”UÔR.î(S.öäðR.ìáá S.ÿôœS.ÄS.ççäçæáááxýâÌ/éðá@<0éñá @" áTäÜS.ä8é T.4T.,Ø-ô:âØ-䀨-ü ”T. áTä@q.ä8é lq.˜q.$Ê-ô:âÔ-äèÉ-ü $r. q.2€èÌq.üéøq.ü:ᬨä'ÿá,r.2€èXr.üé„r.ü:áüµä(ýlu.¸r.h&”Uôr.îHs.öäs.ìáá,s.ÿô¼s.äs.ççäçæáááxýâÌ/é,á@<0é-á @@ áTäüs.ä8é (t.Tt.$Ê-ô:âÔ-äèÉ-ü àt.\t.2€èˆt.üé´t.ü:á¤*ä,ÿáèt.2€èu.üé@u.ü:áüµä-ý(x.tu.h&”U°u.îv.öäÌu.ìááèu.ÿôxv. v.ççäçæáááxýâÌ/é1á@<0é2á @B áTä¸v.ä8é äv.w.$Ê-ô:âÔ-äèÉ-ü œw.w.2€èDw.üépw.ü:á¤-ä1ÿá¤w.2€èÐw.üéüw.ü:áüµä2ýäz.0x.h&”Ulx.îÀx.öäˆx.ìáá¤x.ÿô4y.\y.ççäçæáááxýâÌ/é6á@<0é7á @D áTäty.ä8é  y.Ìy.$Ê-ô:âÔ-äèÉ-ü Xz.Ôy.2€éz.üé,z.ü:áèä6ÿá`z.2€èŒz.üé¸z.ü:áüµä7ý }.ìz.h&”U({.î|{.öäD{.ìáá`{.ÿôð{.|.ççäçæáááxýâÌ/é;á@<0é<á @G áTä0|.ä8é \|.ˆ|.$Ê-ô:âÔ-äèÉ-ü }.|.2€è¼|.üéè|.ü:á´-ä;ÿá}.2€èH}.üét}.ü:áüµä<ý\€.¨}.h&”Uä}.î8~.öå~.ìáá~.ÿô¬~.Ô~.ççäçæáááxýâÌ/é@á@<0éAá @K áTäì~.ä8é .D.$Ê-ô:âÔ-äèÉ-ü Ð.L.2€èx.üé¤.ü:áÄ-ä@ÿáØ.2€è€.üé0€.ü:áüµäAýì‚.d€.h&”U €.îô€.öä¼€.ìááØ€.ÿôh..ççäçæáááxýâÌ/éEá@<0éFá @N áTä¨.ä8éÔ.á‚.,Ø-ô:âØ-䀨-ü `‚.‚.é4‚.ü:áp¨äEÿáh‚.2€è”‚.üéÀ‚.ü:áüµäFý|….ô‚.h&”U0ƒ..öäLƒ.ìááhƒ.ÿôøƒ. „.ççäçæáááxýâÌ/éJá@<0éKá @P áTä8„.ä8é d„.„.,Ø-ô:âØ-䀨-ü ….˜„.2€èÄ„.üéð„.ü:á ¾äJÿá$….éP….ü:áp¨äKý ˆ.„….h&”UÀ….î†.öäÜ….ìááø….ÿôˆ†.°†.ççäçæáááxýâÌ/éOá@<0éPá @R áTäȆ.ä8é ô†. ‡.,Ø-ô:âØ-䀨-ü ¬‡.(‡.2€èT‡.ü逇.ü:ᬨäOÿá´‡.éà‡.ü:áp¨äPýœŠ.ˆ.h&”UPˆ..öälˆ.ìáለ.ÿô‰.@‰.ççäçæáááxýâÌ/éTá@<0éUá @T áTäX‰.ä8é „‰.°‰.,Ø-ô:âØ-䀨-ü <Š.¸‰.2€èä‰.üéŠ.ü:á¤*äTÿáDŠ.épŠ.ü:áp¨äUý,.¤Š.h&”UàŠ.î4‹.öäüŠ.ìáá‹.ÿô¨‹.Ћ.ççäçæáááxýâÌ/éYá@<0éZá @V áTäè‹.ä8é Œ.@Œ.,Ø-ô:âØ-䀨-ü ÌŒ.HŒ.2€ètŒ.üé Œ.ü:á¤-äYÿáÔŒ.ê.ü:áp¨äZý¼.4.h&”Up.îÄ.öäŒ.ìáá¨.ÿô8Ž.`Ž.ççäçæáááxýâÌ/é^á@<0é_á @X áTäxŽ.ä8é ¤Ž.ÐŽ.,Ø-ô:âØ-䀨-ü \.ØŽ.2€è.üé0.ü:áèä^ÿád.é.ü:áp¨ä_ýL’.Ä.h&”Uá.îT.öä.ìáá8.ÿôÈ.ð.ççäçæáááxýâÌ/écá@<0édá @[ áTä‘.ä8é 4‘.`‘.,Ø-ô:âØ-䀨-ü ì‘.h‘.2€è”‘.üéÀ‘.ü:á´-äcÿáô‘.é ’.ü:áp¨ädýÜ”.T’.h&”U’.îä’.ö䬒.ìááÈ’.ÿôX“.€“.ççäçæáááxýâÌ/éhá@<0éiá @_ áT䘓.ä8é Ä“.ð“.,Ø-ô:âØ-䀨-ü |”.ø“.2€è$”.üéP”.ü:áÄ-ähÿá„”.é°”.ü:áp¨äiýl—.ä”.h&”U •.ît•.öä<•.ìááX•.ÿôè•.–.ççäçæáááxýâÌ/émá@<0éná @b áTä(–.ä8é T–.€–.,Ø-ô:âØ-䀨-ü —.ˆ–.2€è´–.üéà–.ü:áüµämÿá—.é@—.ü:áp¨änýü™.t—.h&”U°—.î˜.öäÌ—.ìááè—.ÿôx˜. ˜.ççäçæáááxýâÌ/érá@<0ésá @d áT丘.ä8é ä˜.™.$Ê-ô:âÔ-äèÉ-ü œ™.™.2€èD™.üép™.ü:ᬨärÿᤙ.éЙ.ü:á ¾äsýŒœ.š.h&”U@š..öä\š.ìááxš.ÿô›.0›.ççäçæáááxýâÌ/éwá@<0éxá @f áTäH›.ä8é t›. ›.$Ê-ô:âÔ-äèÉ-ü ,œ.¨›.2€èÔ›.üêœ.ü:á¤*äwÿá4œ.é`œ.ü:á ¾äxýŸ.”œ.h&”UМ.î$.öäìœ.ìáá.ÿô˜.À.ççäçæáááxýâÌ/é|á@<0é}á @h áTäØ.ä8é ž.0ž.$Ê-ô:âÔ-äèÉ-ü ¼ž.8ž.2€èdž.üéž.ü:á¤-ä|ÿáÄž.éðž.ü:á ¾ä}ý¬¡.$Ÿ.h&”U`Ÿ.î´Ÿ.öä|Ÿ.ìáᘟ.ÿô( .P .ççäçæáááxýâÌ/éá@<0é‚á @j áTäh .ä8é ” .À .$Ê-ô:âÔ-äèÉ-ü L¡.È .2€èô .üé ¡.ü:áèäÿáT¡.逡.ü:á ¾ä‚ý<¤.´¡.h&”Uð¡.îD¢.öä ¢.ìáá(¢.ÿô¸¢.à¢.ççäçæáááxýâÌ/é†á@<0é‡á @m áTäø¢.ä8é $£.P£.$Ê-ô:âÔ-äèÉ-ü Ü£.X£.2€è„£.üé°£.ü:á´-ä†ÿáä£.é¤.ü:á ¾ä‡ý̦.D¤.h&”U€¤.îÔ¤.ö䜤.ìáḤ.ÿôH¥.p¥.ççäçæáááxýâÌ/é‹á@<0éŒá @q áT䈥.ä8é ´¥.à¥.$Ê-ô:âÔ-äèÉ-ü l¦.è¥.2€è¦.üé@¦.ü:áÄ-ä‹ÿát¦.é ¦.ü:á ¾äŒý\©.Ô¦.h&”U§.îd§.öä,§.ìááH§.ÿôا.á¨.ççäçæáááxýâÌ/éá@<0é‘á @t áTä¨.ä8é D¨.p¨.$Ê-ô:âÔ-äèÉ-ü ü¨.x¨.2€è¤¨.üéШ.ü:áüµäÿá©.é0©.ü:á ¾ä‘ÿád©.h&”U ©.îô©.ö伩.ìááØ©.ÿôhª.ª.ççäçæáááxýâÌ/é•á@<0é–á @v áT䨪.ä8éÔª.á«.,Ø-ô:âØ-䀨-ü `«.«.é4«.ü:áp¨ä•ÿáh«.2€è”«.üéÀ«.ü:á ¾ä–ÿá””p¬.ü«.h&””8¬.æÿääT¬.ïýˆ°.x¬.h&””´¬.îì¬.öäЬ.ìáý`­.t­.ççäçæáááxýâÌ/éAá @¼á 䌭.ä8é ¸­.(°.ô­.ô:âä­.ä,®.ü âô­.æä®.ìáýh&ìù ô­.äêh®.öÜ®.ð®.ççäçæáááxýâÌ/éá @¦áDÛä¯.ä2€è4¯.ü8é `¯.œ¯.8¬.ô:⌯.äü«.ü â8¬.꤯.2€èЯ.üéü¯.ü:áüµäÿá0°.é\°.ü:áüµäAý´.°.h&””̰.î±.öäè°.ìáýx±.Œ±.ççäçæáááxýâÌ/éEá @¾á 䤱.ä8é б.0´. ².ô:âü±.äD².ü â ².æä(².ìáýh&èü ².äꀲ.öô².³.ççäçæáááxýâÌ/éá @¬áDÛä ³.ä2€èL³.ü8é x³.¤³.8¬.ô:⌯.äü«.ÿଳ.2€èس.üé´.ü:áp¨äÿá8´.éd´.ü:áp¨äEý¶.˜´.h&””Ô´.î µ.öäð´.ìáý€µ.”µ.ççäçæáááxýâÌ/é"á @¬ áT䬵.ä8é Øµ.¶.8¬.ô:⌯.äü«.ÿà ¶.2€è8¶.üéd¶.ü:ᬨä"ý¸.˜¶.h&””Ô¶.î ·.öäð¶.ìáý€·.”·.ççäçæáááxýâÌ/é&á @® áT䬷.ä8é Ø·.¸.8¬.ô:⌯.äü«.ÿà ¸.2€è8¸.üéd¸.ü:á¤*ä&ýº.˜¸.h&””Ô¸.î ¹.öäð¸.ìáý€¹.”¹.ççäçæáááxýâÌ/é*á @° áT䬹.ä8é Ø¹.º.8¬.ô:⌯.äü«.ÿà º.2€è8º.üédº.ü:á¤-ä*ý¼.˜º.h&””Ôº.î ».öäðº.ìáý€».”».ççäçæáááxýâÌ/é.á @² áT䬻.ä8é Ø».¼.8¬.ô:⌯.äü«.ÿà ¼.2€è8¼.üéd¼.ü:áèä.ý¾.˜¼.h&””Ô¼.î ½.öäð¼.ìáý€½.”½.ççäçæáááxýâÌ/é2á @µ áT䬽.ä8é Ø½.¾.8¬.ô:⌯.äü«.ÿà ¾.2€è8¾.üéd¾.ü:á´-ä2ÿᘾ.h&””Ô¾.î ¿.öäð¾.ìáý€¿.”¿.ççäçæáááxýâÌ/é6á @¹ áT䬿.ä8é Ø¿.À.8¬.ô:⌯.äü«.ÿà À.2€è8À.üédÀ.ü:áÄ-ä6ý¬À. 2å À.\Sêzä¼À.æzÔÀ.èâh&ìÀ.ä˜Èä Á.tûÔÀ.ì ¼À.ÜT ÔÀ.è 8@‰ ä,Á.4Á.âäŒÁ.@‰ èÄ08èpä¤56èÜ08ä¼18è0w8$h&@‰ ä4Á.ä¬Á.*ãáÄÁ.@‰ ä¼Á.4Á.âðÁ.ð© äÔÁ.àÁ.æ ìÂ.ÐúåÂ. Â.æ äæpÂ.ÐAä,Â.8Â.æ â ôsHÂ.\Â.äàÁ.êâ Â.èœÂ.´5ä€Â.ŒÂ.æ äæÈÂ.¤] ä¬Â.¸Â.æ äæÃ.ŒÍäØÂ.äÂ.æ â ôÂ.ŒÍ äæ@Ã.`“äÃ. Ã.æ â 0Ã.`“ äæ|Ã.DZäPÃ.\Ã.æ â lÃ.DZ 俏Ã.`œäŒÃ.˜Ã.æ â ¨Ã.`œ äæôÃ.4à äÈÃ.ÔÃ.æ â äÃ.4à äæ0Ä.ÌýäÄ.Ä.æ â  Ä.Ìý äæ(Æ.Äkä@Ä.HÄ.âä Ä.ÄkèèÄ.èápä4Á.fÁ.èðˆÅ.ŒÁ.ÄkäHÄ.äÀÄ.ãáØÄ.ÄkäÐÄ.HÄ.âXÅ.ÌŽäèÄ.âÅ.ÌŽáÅ.è âHÄ.æâ(Å. DâÅ.èâ@Å.¤áÅ.èæ”á8Â.èhÅ. Då Å.xÅ.¤ä(Å.ä”å@Å.°Å.øèÄ.æØÅ.øÅ.æáÆ.ø(Å.æü@Å.æpÒ.H¶ä8Æ.@Æ.âä˜Æ.H¶èdÉ.èpäHÄ.fÁ.èä¸Ê.è´Ð.ŒÁ.H¶ä@Æ.䏯.ãáÐÆ.H¶äÈÆ.@Æ.â"TÉ. ¼Ç.àÆ.˜Æ. Ç.ÿèäHÇ.쀀â@Æ.âåtÇ.œ1 ädÇ.ê â@Æ.ä Ç.Ì/åÇ.ê â8Â. è<0åÇ.êÈ.ÄÇ.˜Æ. áÈ.ÿèä,È.쀀â@Æ.âåHÈ.œ1 ädÇ.êtÈ.Ì/ådÈ.ê âàÁ. è<0åÇ.î˜È.˜Æ. ÔÈ.ÿèåÉ.쀀â@Æ.âåÉ.œ1 ädÇ.ê8É.Ì/åÇ.î<0ådÈ.ê|É.hädÉ.åhŒÂ.ì`/Ê.ŒÉ.˜Æ.`/ÈÉ.ÿèäôÉ.ì€â@Æ.â éœ1 ädÇ.ðÊ.˜Æ.`/TÊ.ÿèä€Ê.ì€â@Æ.â!åœÊ.œ1 ädÇ.ðT#åŒÂ.ì”Ë.äÊ.îâìÊ.ò:öýÿíhä(öýÿíT#å)ö{ö}öøË.äŒÉ.îâÈË.ò{ö}ö|Í.ä˜È.îâ,Ì.ò{öùÿõDõýÿíhä(öýÿíÌ/å.öýÿíl ä,öýÿí<0å)ö;öùÿõ}÷Ï.äÄÇ.îâ°Í.ò{öùÿõDõýÿíhä(öýÿíÌ/å,öýÿí<0å.öýÿíl ä)ö;öùÿõ}þàÆ.îâ4Ï.ò{öùÿõDõýÿíhä(öýÿíÌ/å.öýÿíl ä,öýÿí<0å.öýÿíl ä)ö;öùÿõ}ö(Ñ.øÜÐ.æ â|'ìÐ.áÑ.ä8Â.èÑ.â8Â.ìîPÑ.øàÆ.æxÑ.øÄÇ.æ Ñ.ø˜È.æÈÑ.ødÉ.æðÑ.øŒÉ.æÒ.øÊ.æü@Ò.æ4Á.ðHùh 8Œûä€Ò.ŒÒ.æ â œÒ., 8ä ôÒ.è Põ6äìè6èpäp‚5èdõ6ä¬õ6è$þ78h&è äœÒ.äÓ.Bãá,Ó.è ä$Ó.œÒ.â.6¼e ä<Ó.HÓ.æâÓ.PôpèŽz5äÄ-6èh&¤ äHÓ.ä°Ó.ãáÈÓ.PäÀÓ.HÓ.â(Ô.(îäØÓ.àÓ.ââÓ.øÓ.ä(îã Ô.´ÅàÓ.ëã\qàÓ.è8Ô.´Åä øÓ.HÔ.\qä Ô.|'6<^äXÔ.`Ô.â â ¨Ô.<^h'6äðÔ.èápèÞ{5zÓ.äèÓ.<^ä`Ô.äÈÔ.ãáàÔ.<^äØÔ.`Ô.â|y5 DåðÔ.âÕ. DáÕ.äâ â`Ô.ææ¤0Õ.äââxÕ.dúèÀÕ.èBpèºÖ.ähy5èh&Üÿä0Õ.ä˜Õ.ãá°Õ.dúä¨Õ.0Õ.âØÕ.è:åÀÕ.åè:áÕ.è"|u5`/¼t5èÕ.xÕ.`/t5Hÿæ,Ö.æhÖ.`/ls5ÿèh&dúäˆÖ.äÜr5ãáähÖ.dúèàÖ.èBpäHï.è ×.0Õ.0×.è @í. åè:áøÖ.è â×.æ ð>ñ ØÙ.d×.|×.îâØ.ö>ñhÖ.T¸×.ÿèää×.äøÖ.䀀âˆÖ.âÀéœ1 åØ.ê âˆÖ.ä{öùÿõDõ(öýÿí>å*ö)ö(ö(öýÿíä¶ ä)öýÿíè:å&ö~öÿÿìæ)ö;öùÿõ}ö ÌÞ. Ú.$Ú.î+âÄÚ.ö>ñhÖ.¤¸`Ú.ÿèäŒÚ.ì€âˆÖ.â¿å¨Ú.œ1 åØ.ð¼"õ{öùÿõ;õ(öýÿí¼"å)öùÿõýÿíè:å=ö(öýÿí>å*ö)ö(ö(öýÿíä¶ ä)öýÿíè:å|öÿÿìæ)ö;öùÿõ<õùÿõýÿíè:å=ö(öýÿí>å*ö)ö(ö(öýÿíä¶ ä)öýÿíè:å&ö~öÿÿìæ)ö;öùÿõ}öá.áß.ß.îâœß.ö>ñhÖ.¤¸Tß.ÿèä€ß.쀀âˆÖ.â¾éœ1 åØ.ê{öùÿõDõõ(ö(öýÿíä¶ ä)öýÿíè:å&öÿÿìæ)ö;öùÿõ}ö œã.8á.Pá.îâÔá.ö>ñhÖ.DÝŒá.ÿèä¸á.äøÖ.äP€€âˆÖ.â½éœ1 åØ.ê{öùÿõDõ(öýÿí>å*ö)ö(ö(öýÿíä¶ ä)öýÿíè:å&ö~öÿÿìæ)ö;öùÿõ}ö  ç.Ðã.èã.îâ¸ä.ö>ñhÖ.2$ä.ÿèä`ä.äPä.ä€âˆÖ.â¼å âˆÖ. ä|ä.œ1 åØ.ðÌ/å˜ä.ì â¨ä.æ ì{öùÿõýÿíè:å=ö(öýÿí>å*ö)ö(ö(öýÿíä¶ ä)öýÿíÌ/å|ö(ö(öýÿíä¶ ä)öýÿíè:å&öÿÿìæ)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö ì.Ôç.ìç.î&âŒè.ö>ñhÖ.2(è.ÿèäTè.äPä.ä€âˆÖ.â»åpè.œ1 åØ.ðÌ/åPä.ê{öùÿõýÿíè:å=ö(öýÿí>å*ö)ö(ö(ö(öýÿíä¶ ä)öýÿíÌ/å.öýÿíè:å&ö~öÿÿìæ)ö|ö(ö(öýÿíä¶ ä)öýÿíè:å&öÿÿìæ)ö)ö;öùÿõDõ*öOõ;öùÿõ}úPì.,Ö.î âhì.ö>ñ:öýÿíè:å(öýÿí©ä)öùÿõ{öùÿõ}öhí.ø,Ö.æí.øìç.æ¸í.øèã.æàí.øPá.æî.øß.æ0î.ø$Ú.æXî.ø|×.æ€î.øàÖ.æü¨î.æhÖ.`/äî.âÿèäï.ìãˆÖ. âÁå,ï.éØ.øPä.êä ï.hëè|O5èpäHü.ð.èä¼O5èÀa5Àï.hëäHï.ä¸F5 ãáh&—äàï.äØÄ4@ãáäÀï.—è8ð.èpðÔñ.äìñ.,ó0ä ¼´4?á @ñ.DñPð.è â ¸t`ð.Èð.ätð.è â „ð.@î â ”ð.´ð. â ¤ð.8* ÿäâÜð.è â ìð.DZ â üð.@î â  ñ.,ñ. â ñ.8* ÿàá Xñ. ÉÜð.èå”ápñ.è â €ñ.4à â ñ.@î â  ñ.Àñ. â °ñ.8* ÿä ’ ð ´ô. ò.8ò.îâ¼ò.ö ’ ðÀï.è”tò.ÿèä ò.äÜð.ä€âàï.?â¶áæÔÎäÜð.ì{öùÿõDõýÿíÔÎä+öýÿí(ûä-ö(ö(öýÿíÔÎä-öÿÿìæ)ö%öýÿí(ûä+öÿÿìæ)ö;öùÿõ}öìö.èô.áõ.îâ„õ.ö ’ ðÀï.ôâ <õ.ÿèähõ.äÜð.ä€âàï.>âµáæÔÎäÜð.ì{öùÿõDõ(öýÿíÔÎä-öÿÿìæ)ö/öýÿí(ûä+öÿÿìæ;öùÿõ}ö \û. ÷.8÷.î&âÌ÷.ö ’ ðÀï.DFt÷.âÿèä ÷.쀀âàï.=â´éœ1 ä¼÷.ê âàï.ä{öùÿõýÿíDZäýÿí@)å=öýÿíDñä.öýÿíä-öýÿí Éä;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ(ö(öýÿí—ä*ö)öOõ)örõýÿí8iå(öýÿí Éä,öýÿí@)å,ö[õ)ö;öùÿõ}ö ,<3û.¨û.îµá43ö ’ ð Àï.t¶áäû.âÿèäü.ì€âàï.<â³å,ü.œ1 ä¼÷.ì3¨óäHü.ìä ü.ðœ èÔñ2èpäÈþ.ð.èäò2è¼3Àï.ðœ äHü.äÀü. ãáØü.ðœ äÐü.Hü.â"Pþ.`/|ý.èü. ü.`/$ý.ÿèäPý.ì€âHü.âbéœ1 älý.ì âHü.è„ý. ü.`/Àý.ÿèäìý.ì€âHü.âmåþ.œ1 älý.ì4þ.ˆ¾ ä$þ.ì âàï.ê¨óäÜð.ìhë2„ä`þ. ü.„œþ.ÿèäLë2äÈþ.䀀âHü.âcåä ÿ.ŒÍè$/èBpät /ð.èä@/è, /Àï.ŒÍäÈþ.ä@ÿ.ãáXÿ.ŒÍäPÿ.Èþ.âtÿ.lqåhÿ.àï.æ/õ ’ î $/p/ /î â4/òˆ/>õ ’ î” /€" Ü/ÿèä/ì€â´ /$â+éœ1 ä$/ì â´ /ä{öùÿõýÿí¼e ävõýÿí€" ä(ö)ö;öùÿõ}ö @/X/ˆ/î â8/òp/>õ ’ î” /¼SÄ/ÿèäð/ì€â´ /#â*å /œ1 ä$/ðÌ/å(/ì â´ / ä{öùÿõýÿí¼e ävõýÿí¼Sä(öýÿíÌ/å)ö;öùÿõ}ö °/t/¤/îbâ€/òŒ/>õ ’ î” /<Çà/âÿèä,/ä /ä€â´ /"â)å â /4à äæH/œ1 ä$/ìd/l ä /ðR ä /ì{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿí$å-öýÿíR ä)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõvõýÿ픀ävõýÿíTmä(öýÿíR ä,öýÿí$å,öýÿíl ä)ö;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿíl ä+öýÿí@)å;öýÿíP&å<öýÿí$å;öpõýÿíP&å)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí$òä(öýÿíP&å)ö;öùÿõýÿí¼e ävõýÿí ÉäbõýÿíDZä(öýÿíR ä-öýÿíl ä)ö;öùÿõDõýÿíl ä;öùÿõ}ö \$/ä//îGâ´/òü/>õ ’ î” /<ÇP/âÿèä|/ä /ä€â´ /!â(å˜/œ1 ä$/ðä¡ä /ì{öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿí$å-öýÿíä¡ä-öÿÿìæ)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõvõýÿ픀ävõýÿíTmä(öýÿíä¡ä+öÿÿìæ,öýÿí$å,öýÿíä¡ä)ö;öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí$òä(öýÿí¼e ävõýÿí8X ä(ö)ö+öqõýÿí¼e ävõýÿí Éä)ö;öùÿõDõýÿíä¡ä;öùÿõ}ö ¤W/$/À$/îáØ%/ò¨$/>õ ’ î” /Ðàü$/âÿèä(%/ì€â´ / â'åD%/œ1 ä$/ì`%/ä¡ä /ìœ%/@)å|%/ì â Œ%/DZ äêÌ/å¸%/ê âÈ%/ ä ì{öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõ!õýÿíDZäýÿí¸(å=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí¸(åhõýÿí¼e ävõýÿí Éä>öýÿí¸(å-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿíˆW/â)ö;öùÿõùÿõ;õ(öýÿí¼e ävõýÿí Éä+öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí\tä=öýÿíDZä(öýÿí$å-öýÿíä¡ä)ö;öùÿõ!õýÿíÐAä*öýÿíÕä=ö&öýÿíÌ/å;öùÿõ;õ(öýÿí@)å>öýÿí\tä)öùÿõ{öùÿõýÿíLäýÿí'å;öùÿõ@õ(öýÿí'å=öýÿí$å;öýÿí@)å>öýÿí\tä;öpõýÿí'å,öqõýÿí@)å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,öýÿíÌ/å)ö;öùÿõ@õ(öýÿíLäýÿí¨'å=öýÿíä¡ä;öýÿí¨'å<öýÿí$å;öpõýÿí¨'å,öpõýÿí'å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿí¨'å)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíLäýÿíP&å=öýÿí$å-öýÿí@)å;öùÿõ@õ(öýÿíLäýÿí'å=öýÿí$å;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿí'å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõ;õ(öýÿí$å-ö(öýÿí\tä-öýÿí@)å)ölõýÿíÕäiõýÿíÕä<öýÿí$å)öùÿõýÿíÕäaõýÿí@)å;öùÿõvõýÿ픀ävõýÿ팽ä(öýÿíä¡ä,öýÿíä¡ä+ö(öýÿí\tä-öýÿí@)å)ö,öýÿí$å)ö;öùÿõ}öùÿõvõýÿ픀ävõýÿí°¼ ä(öýÿíä¡ä,öýÿí@)å,ö*öýÿíÕä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíPˆä<öýÿíÐAä,öýÿí¤] ä>öýÿí`Tä(öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõýÿíDZäýÿíø]ä=öýÿí¼e ävõýÿí Éä+öýÿí@)å;öùÿõýÿíDZäýÿí˜3ä=öýÿí¼e ävõýÿíü*å(ö)ökõÿÿô?öýÿí¼e ävõýÿíü*å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí¸(å/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí¸(å;öùÿõýÿí`Tä.öýÿí8X ä(ö)ö=öýÿí`Tä.öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí˜3ä)ö;öùÿõýÿí`Tä.öýÿíü*å(ö)ö=öýÿí˜3ä;öùÿõýÿíLäýÿí'å=öýÿí`Tä.öýÿí8X ä(ö)ö;öùÿõýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿíä¡ä;öpõýÿíP&å,öpõýÿí'å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öpõýÿí'å,öqõýÿí@)å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,öýÿíÌ/å)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿí'å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõýÿí`Tä.öýÿí¼Sä(ö*öOõ)ö;öùÿõ}öùÿõ}ö&vector::insert length error$\/ØW/X/î$âÄX/òðW/>õ ’ î” /ÐàDX/ÿèäpX/ä /ä€â´ /â&åŒX/œ1 ä$/ì¨X/ä¡ä /ðÌ/å¸%/ê{öùÿõýÿíDZäýÿí¨óä=öýÿíDZä(öýÿíä¡ä-öýÿíHý ä(ö)ö)ö;öùÿõýÿíÐàä(öýÿíä¡ä,öÿÿìæ,öýÿíÌ/å)ö;öùÿõDõýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí¨óä;öùÿõ}ö L_/X\/ˆ\/îâ ]/òp\/>õ ’ î” /õ ’ î” /Ìoì_/ÿèä`/ì€â´ /â$å4`/œ1 ä$/ðÌ/å¸%/ê{öùÿõýÿíÐàä(öýÿí<: ä(ö)ö,öÿÿìæ,öýÿíÌ/å)ö;öùÿõ}ö  d/ìa/b/îâÀb/òb/>õ ’ î” /dk Xb/ÿèä¤b/ä„b/䀀ⴠ/â#å â ”b/`“ äêœ1 ä$/ê{öùÿõDõ*ö(öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí¼e ävõýÿí Éä-öÿÿìæ)ö;öùÿõ}ö ˆg/Ôd/e/îâ¨e/òìd/>õ ’ î” /dk @e/ÿèäŒe/äle/ä€â´ /â"å â |e/ŒÍ äêœ1 ä$/ì{öùÿõDõ*ö(öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí¼e ävõýÿí Éä-öÿÿìæ)ö;öùÿõ}ö i/¼g/ìg/î âph/òÔg/>õ ’ î” /üÉ(h/ÿèäTh/ä„b/䀀ⴠ/â!éœ1 ä$/ê{öùÿõDõ*öýÿí¼e ävõýÿí8X ä(ö)ö;öùÿõ}ö ˜k/Äi/ôi/î âxj/òÜi/>õ ’ î” /üÉ0j/ÿèä\j/äle/ä€â´ /â éœ1 ä$/ì{öùÿõDõ*öýÿí¼e ävõýÿí8X ä(ö)ö;öùÿõ}ö ìo/Ìk/ük/î"âœl/òäk/>õ ’ î” / 28l/âÿèädl/äle/ä€â´ /âå€l/œ1 ä$/ð@)å|%/ì{öùÿõ;õ(öýÿí@)åmõýÿí¼e ävõýÿí Éä)öùÿõùÿõPõýÿíÀÍ ä(öüÿíÌo/â)ö;öùÿõùÿõDõ*ö(öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}övector::at index out of rangeâ @t/ p/Pp/î"âðp/ò8p/>õ ’ î” / 2Œp/âÿèä¸p/ä„b/䀀ⴠ/âåÔp/œ1 ä$/î@)å|%/ì{öùÿõ;õ(öýÿí@)åmõýÿí¼e ävõýÿí Éä)öùÿõùÿõPõýÿíÀÍ ä(öüÿí t/â)ö;öùÿõùÿõDõ*ö(öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}övector::at index out of rangeâ Äv/tt/¤t/îâDu/òŒt/>õ ’ î” /äàt/ÿèä u/ä„b/䀀ⴠ/âå(u/œ1 ä$/î@)å|%/ì{öùÿõDõ*ö(öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}ö Hy/øv/(w/îâÈw/òw/>õ ’ î” /ädw/ÿèäw/äle/ä€â´ /âå¬w/œ1 ä$/ð@)å|%/ì{öùÿõDõ*ö(öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}ö ˆ/|y/¬y/î’âLz/ò”y/>õ ’ î” /HGèy/âÿèäz/ì€â´ /âå0z/œ1 ä$/ð@)å|%/ì{öùÿõ;õ(öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíü‡/â)ö;öùÿõùÿõýÿíPˆä<öýÿíÐAä,öýÿí¤] ä>öýÿí`Tä(öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõýÿí`Tä.öýÿí8X ä(ö)ö=öýÿí`Tä.öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿí`Tä.öýÿíü*å(ö)ö=öýÿí@)å;öùÿõýÿíLäýÿí'å=öýÿí`Tä.öýÿí8X ä(ö)ö;öùÿõýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿí'å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõýÿí`Tä.öýÿí¼Sä(ö*öOõ)ö;öùÿõ}öùÿõ}övector::reserve length errorã Š/Pˆ/€ˆ/î â‰/òhˆ/>õ ’ î” /ÔO ¼ˆ/ÿèäèˆ/쀀ⴠ/âéœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿí Éäjõÿÿô;öùÿõ}ö ü‹/@Š/pŠ/î âôŠ/òXŠ/>õ ’ î” /ÔάŠ/ÿèäØŠ/ä|%/䀀ⴠ/âéœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿíü*å(ö)ö;öùÿõ}ö ü‘/0Œ/`Œ/î4â/òHŒ/>õ ’ î” /Ý œŒ/âÿèäÈŒ/ì€â´ /âåäŒ/œ1 ä$/í/à#ä|%/ðxQä¸%/ê{öùÿõ;õ(öýÿíà#ä>öýÿíèê ä(ö)ö)öùÿõýÿíÐàä(öýÿí<: ä(ö)ö,öýÿíà#ä-öýÿíèê ä(ö)ö,öýÿíxQä)ö;öùÿõ<õ;õ(öýÿíà#ä<öýÿíèê ä(ö)ö)öùÿõýÿí<Çä(öýÿíHý ä(ö)ö+öýÿíà#ä,öýÿí<: ä(ö)ö)ö;öùÿõ}ö ˜/0’/`’/î6ã“/òH’/>õ ’ î” /Ý œ’/âÿèäÈ’/ì€â´ /âåä’/œ1 ä$/ðà#ä|%/ì{öùÿõ;õ(öýÿíà#ä>öýÿíèê ä(ö)ö)öùÿõýÿíÐàä(öýÿí<: ä(ö)ö,öýÿíà#ä-öýÿíèê ä(ö)ö,öýÿíÐAä(ö)ö)ö;öùÿõ<õ;õ(öýÿíà#ä<öýÿíèê ä(ö)ö)öùÿõýÿí<Çä(öýÿíHý ä(ö)ö+öýÿíà#ä,öýÿí<: ä(ö)ö)ö;öùÿõ}ö `š/D˜/t˜/îâø˜/ò\˜/>õ ’ î” /¼ß °˜/ÿèäܘ/ä|%/䀀ⴠ/âéœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí¼ß ä(ö)ö;öùÿõ}ö œ/”š/Äš/î âH›/ò¬š/>õ ’ î ” /èê á›/ÿèä,›/ä|%/䀀ⴠ/âéœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿí Éä;öùÿõ}ö ž/Tœ/„œ/îâ(/òlœ/>õ ’ î” /<: Àœ/ÿèä /äìœ/䀀ⴠ/ âå â üœ/Ìý äêœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí¼e ävõýÿí Éä;öùÿõ}ö à /Äž/ôž/îâxŸ/òÜž/>õ ’ î” /<: 0Ÿ/ÿèä\Ÿ/ä /ä€â´ / âéœ1 ä$/ì{öùÿõDõýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí¼e ävõýÿí Éä;öùÿõ}ö Т/¡/D¡/î âÈ¡/ò,¡/>õ ’ î” /Hý €¡/ÿè䬡/äìœ/䀀ⴠ/ âéœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿí8X ä(ö)ö;öùÿõ}ö À¤/£/4£/î ⸣/ò£/>õ ’ î” /Hý p£/ÿè䜣/ä /ä€â´ / âéœ1 ä$/ì{öùÿõDõýÿí¼e ävõýÿí8X ä(ö)ö;öùÿõ}ö °¦/ô¤/$¥/î ⨥/ò ¥/>õ ’ î ” /Hƒá`¥/ÿè䌥/äüœ/䀀ⴠ/ âéœ1 ä$/ê{öùÿõDõýÿí¼e ävõýÿí(© ä(ö)ö;öùÿõ}ö DÅ/ä¦/§/î9áЧ/òü¦/>õ ’ î” /L¢P§/âÿèä|§/ì€â´ /â嘧/œ1 ä$/ì´§/@)å|%/ðä-å¸%/ê{öùÿõ;õ(öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíDZäýÿí(ä=öýÿí˜ ä(öýÿí@)å,öýÿí¼e ävõýÿí Éä)ö;öùÿõýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿíP&å+öýÿí(ä;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å)öùÿõ*öýÿíP&å=öýÿíä-å;öùÿõ;õ(öýÿí@)å<öýÿí¼e ävõýÿí Éä)öùÿõ{öùÿõýÿí$å=öýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí$òä(öýÿíP&å)ö;öùÿõýÿí¼e ävõýÿí Éä=öýÿí@)å;öùÿõ}öùÿõ<õ;õ(öýÿí¼e ävõýÿí Éä<öýÿí@)å)öùÿõ{öùÿõ@õ(öýÿí@)åbõýÿí¼e ävõýÿí Éä;öýÿí@)å>öÿÿô;öqõýÿí@)å,öpõýÿíP&å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿíP&å,öýÿíä-å)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí(Å/â)ö;öùÿõùÿõùÿõýÿí€" ä(ö)ö;öùÿõ;õ(öýÿí¼e ävõýÿí8X ä(ö)ö)öùÿõ{öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí¼e ävõýÿí8X ä(ö)ö,öýÿí¼e ävõýÿíü*å(ö)ö)ö;öùÿõýÿí¼e ävõýÿí8X ä(ö)ö=öÿÿô;öùÿõýÿí¼e ävõýÿíü*å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí¼e ävõýÿí8X ä(ö)ö=öýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿí¼e ävõýÿíü*å(ö)ö=öýÿí@)å;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öýÿí@)å>öÿÿô;öqõýÿí@)å,öpõýÿíP&å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿíP&å,öýÿíä-å)ö;öùÿõ}öùÿõ}ö&vector::assign length error¨É/xÅ/¨Å/î$âHÆ/òÅ/>õ ’ î” /2äÅ/ÿèäÆ/ä(/ä€â´ /âå,Æ/œ1 ä$/ðÌ/å(/ê{öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõýÿí„&ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö äÔ/ÜÉ/ Ê/îkâÈÊ/òôÉ/>õ ’ î” /,HÊ/âÿèätÊ/ì€â´ /%â,åÊ/œ1 ä$/ì¬Ê/@)å|%/ðxQä¸%/ê{öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíÐÔ/â)ö;öùÿõùÿõýÿí¼e ävõýÿí8X ä(ö)ö=öýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿí¼e ävõýÿíü*å(ö)ö=öýÿí@)å;öùÿõýÿíLäýÿí$å=öýÿí¼e ävõýÿí8X ä(ö)ö+öýÿí@)å;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿíP&å,öýÿíxQä)ö;öùÿõ}öùÿõ}övector length errorá Ù/Õ/HÕ/î!âèÕ/ò0Õ/>õ ’ î” /`/„Õ/ÿèä°Õ/ä8ýä€â´ /â åÌÕ/œ1 ä$/ðÌ/å(/ê:öýÿí¼e ä(öýÿíÌ/å.öýÿí(© ä(ö)ö)öùÿõ{öùÿõýÿí,ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö ôÛ/4Ù/dÙ/îâ\Ú/òLÙ/>õ ’ î” /`/ Ù/ÿèäÌÙ/ä8ýä€â´ /â åèÙ/œ1 ä$/ìÚ/@)å|%/ì Ú/xQä¸%/î0"å<Ú/ê âLÚ/ ä äæ:öýÿí¼e ä(öýÿí0"å)öùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíxQä)ö;öùÿõ}ö Þ/(Ü/XÜ/î âÝ/ò@Ü/>õ ’ î” /`/”Ü/ÿèäÀÜ/ä8ýä€â´ /â åÜÜ/œ1 ä$/ìøÜ/@)å|%/ðxQä¸%/ê{öùÿõýÿí,ä(öýÿí@)å,öýÿíxQä)ö;öùÿõ}ö Xà/PÞ/€Þ/î â ß/òhÞ/>õ ’ î” /`/¼Þ/PÿèäèÞ/ä8ýä€â´ /â åß/œ1 ä$/ð@)å|%/ì{öùÿõýÿí,ä(öýÿí@)å,öýÿíÐAä(ö)ö)ö;öùÿõ}ö Tâ/Œà/¼à/î â|á/ò¤à/>õ ’ î” /`/øà/Pÿèä$á/ä8ýä€â´ /â å@á/œ1 ä$/ð0"å\á/ê âlá/ ä äæ:öýÿí¼e ä(öýÿí0"å)öùÿõ{öùÿõ}úˆâ/¸â/îâ<ã/ò â/>õ ’ î” /`/ôâ/ÿèä ã/ä8ýä€â´ /âéœ1 ä$/ì{öùÿõ}öäÜã/, õæ˜å/èä/ì\ä/èh&, ä„ã/äüã/ãå, ä ä/„ã/â,ä/>ñDä/ ’ ò4ÄáëÐä/´ /hä/|ä/äÈ%/èä/âüœ/ä`Øåá¤ä/á__vecá4ÿîÜä/ŒÝ2ä4å/, ôpð¼Ÿ2äìŸ2„ã/äHÓ2#h&, äÜä/äTå/(ãálå/, ädå/Üä/âÜ„2¼e ä|å/ˆå/æ â ˜å/èƒ2äðå/”8 èð0èpä,ó0è„K0ä´K0èê00h&”8 ä˜å/äæ/,ãá(æ/”8 ä æ/˜å/âdæ/ŒÍä8æ/Dæ/æ â Tæ/ŒÍ äæ æ/`“ätæ/€æ/æ â æ/`“ äæÜæ/Lä°æ/¼æ/æ â Ìæ/4à äæç/DÅ äìæ/øæ/æ â ç/Ìý äæTç/DZä(ç/4ç/æ â Dç/DZ äæç/`œädç/pç/æ â €ç/`œ äæ¼ç/ÐAä ç/¬ç/æ ìØç/¤] äÌç/€ç/æè/4à äèç/ôç/æ â è/4à äæPè/Ìýä$è/0è/æ â @è/Ìý äæ"ðì/`/ôè/`è/ðå/`/œè/ÿèäÈè/ì€â˜å/â¤éœ1 ääè/ì â˜å/ä¼é/üè/ðå/`/8é/Pÿèädé/ì€â˜å/â¥å€é/œ1 ääè/ð0"åœé/ê â¬é/ ä äædê/Äé/ðå/`/áê/Pÿèä,ê/ì€â˜å/â¦åHê/œ1 ääè/ð@)å4ç/ì8ë/lê/ðå/`/¨ê/ÿèäÔê/ì€â˜å/â§åðê/œ1 ääè/ì ë/@)å4ç/ðxQä(ë/ê â¬ç/ ä8ì/@ë/ðå/`/|ë/ÿèä¨ë/ì€â˜å/â¨åÄë/œ1 ääè/ìàë/@)å4ç/ìüë/xQä(ë/î0"åì/ê â(ì/ ä äê@ì/ðå/`/|ì/âÿèä¨ì/ì€â˜å/â©åÄì/œ1 ääè/ðÌ/åàì/ê â˜å/ ä„í/ì.åí/ðå/ì.<í/ÿèähí/ì €â˜å/âªéœ1 ääè/ì4î/2ä”í/ðå/2Ðí/âÿèäüí/äàì/ä€â˜å/â«åî/œ1 ääè/ðÌ/åàì/ëï/L¢äDî/ðå/L¢€î/âÿèä¬î/ì€â˜å/ â¬åÈî/œ1 ääè/ìäî/@)å4ç/ðä-å(ë/ê”ï/Hƒå ï/ðå/HƒáLï/ÿèäxï/ä@è/䀀â˜å/ â­éœ1 ääè/ê"´ð/Hý (ð/¤ï/ðå/Hý àï/ÿèä ð/伿/ä€â˜å/ â®éœ1 ääè/ð0ð/ðå/Hý lð/ÿèä˜ð/äøæ/䀀â˜å/ â¯éœ1 ääè/êÔñ/<: Hñ/Äð/ðå/<: áñ/ÿèä,ñ/伿/ä€â˜å/ â°éœ1 ääè/ðPñ/ðå/<: Œñ/ÿèä¸ñ/äøæ/䀀â˜å/â±éœ1 ääè/êhò/èê ääñ/ðå/èê ò/ÿèäLò/ä4ç/䀀â˜å/â²éœ1 ääè/êüò/¼ß äxò/ðå/¼ß ´ò/ÿèäàò/ä4ç/䀀â˜å/â³éœ1 ääè/ê"pô/Ý ¬ó/ ó/ðå/Ý Hó/ÿèätó/ì€â˜å/â´åó/œ1 ääè/ðà#ä4ç/ð´ó/ðå/Ý ðó/âÿèäô/ì€â˜å/âµå8ô/œ1 ääè/ìTô/à#ä4ç/ðT#å(ë/êõ/ÔÎä€ô/ðå/Ôμô/ÿèäèô/ä4ç/䀀â˜å/â¶éœ1 ääè/ê˜õ/ÔO äõ/ðå/ÔO Põ/ÿèä|õ/쀀â˜å/â·éœ1 ääè/êHö/HGä¨õ/ðå/HGäõ/âÿèäö/ì€â˜å/â¸å,ö/œ1 ääè/ð@)å4ç/ì" ÷/äøö/Xö/ðå/ä”ö/ÿèäÀö/äDæ/ä€â˜å/â¹åÜö/œ1 ääè/ð@)å4ç/ñ÷/ðå/ä<÷/ÿèäh÷/䀿/䀀â˜å/âºå„÷/œ1 ääè/î@)å4ç/ìøø/ 2Pø/°÷/ðå/ 2ì÷/âÿèäø/䀿/䀀â˜å/â»å4ø/œ1 ääè/î@)å4ç/ðXø/ðå/ 2”ø/âÿèäÀø/äDæ/ä€â˜å/â¼åÜø/œ1 ääè/ð@)å4ç/ì"ú/üÉŒù/ù/ðå/üÉDù/ÿèäpù/äDæ/ä€â˜å/â½éœ1 ääè/ð”ù/ðå/üÉÐù/ÿèäüù/䀿/䀀â˜å/â¾éœ1 ääè/ê"8û/dk ¬ú/(ú/ðå/dk dú/ÿèäú/äDæ/ä€â˜å/â¿éœ1 ääè/ð´ú/ðå/dk ðú/ÿèäû/䀿/䀀â˜å/âÀéœ1 ääè/êèû/ÌoäHû/ðå/Ìo„û/ÿèä°û/ì€â˜å/âÁåÌû/œ1 ääè/ðÌ/å(ë/ê|ü/öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíh0â)ö;öùÿõùÿõ;õ(öýÿí Éä>öÿÿô)öùÿõ{öùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí Éä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí8X ä(ö)ö)ö;öùÿõ}öùÿõ}övector length errorä„0ðå/,À0âÿèäì0ì€â˜å//âÏå0œ1 ääè/ì$0@)å4ç/ðxQä(ë/êt$0„&0P0ðå/„&Œ0âî80äðmîä¸0ìâ˜å/äÓåÔ0œ1 ääè/í0l äð0ì æä0R äð0ðˆ$äÈHìÊå/äˆ0âh 0„&â 0üP0ö<¬ âì{öùÿõýÿí€" ä(ö)ö;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõýÿíÌoä(ö*öýÿíl ä)ö;öùÿõ}ú0ðå/„&T0âï0äŒnîä€0ìâ˜å/äÔåœ0œ1 ääè/ìÈ0l ä¸0ì æää0R ä¸0ðˆ$ä|GìÊå/äP0â80„&Šâh0ü0öœö âì{öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíX$0â)ö;öùÿõùÿõýÿí€" ä(ö)ö;öùÿõ;õ(öýÿí8X ä(ö)ö)öùÿõ{öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí8X ä(ö)ö,öýÿíü*å(ö)ö)ö;öùÿõýÿí8X ä(ö)ö=öÿÿô;öùÿõýÿíü*å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿíü*å(ö)ö=öýÿí@)å;öùÿõ}öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí8X ä(ö)ö)ö;öùÿõýÿí Éä=öýÿí@)å;öùÿõ}ö:vector::assign length errorðJ0pC0+0„$0ðå/pCÀ$0âîˆ%0äÀjîäì$0ìâ˜å/äÕå%0œ1 ääè/ì$%0ä¡ä¼æ/ìP%0l ä@%0ì æäl%0R ä@%0ðˆ$äÈHìÊå/äØ%0ã0pC8âð%0ü„$0ö<¬ âì{öùÿõýÿí—ä<öýÿí>å,öýÿí ’ ä>öýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí—ä<öýÿí>å,öýÿí ’ ä>ö&öýÿí,Rä=öýÿíL´ä;öùÿõýÿípCä(öýÿíä¡ä,öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ú8+0ðå/pCt+0âî<,0åkîä +0ìâ˜å/äÖå¼+0œ1 ääè/ìØ+0ä¡ä¼æ/ì,0l äô+0ì æä ,0R äô+0ðˆ$ä|GìÊå/äŒ,0â ˆ%0pCBá¤,0ü8+0öœö âì{öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõ!õýÿíDZäýÿí¸(å=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí¸(åhõýÿí Éä>öýÿí¸(å-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿíÔJ0â)ö;öùÿõùÿõ;õ(öýÿí Éä+öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí(ä=öýÿíDZä(öýÿí$å-öýÿíä¡ä)ö;öùÿõ;õ(öýÿí(ä>öÿÿô)öùÿõvõýÿ픀ävõýÿ팽ä(öýÿíä¡ä,öýÿí$å,öýÿí$å+öýÿí@)å)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿíä¡ä)ö;öùÿõýÿí Éäaõýÿí@)å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíDZäýÿí¨óä=öýÿíDZä(öýÿíä¡ä-öýÿíHý ä(ö)ö)ö;öùÿõýÿí4à äýÿí; ä=öýÿí8X ä(ö)ö;öùÿõýÿíDZäýÿíø]ä=öýÿí Éä+öýÿí@)å;öùÿõýÿíDZäýÿí˜3ä=öýÿíü*å(ö)ökõÿÿô?öýÿíü*å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí¸(å/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí¸(å;öùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí˜3ä)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõ{öùÿõvõýÿ픀ävõýÿíTmä(öýÿí; ä,öýÿí; ä+öýÿí¨óä,öýÿí8X ä(ö)ö)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿí; ä+öýÿí¨óä,öýÿí; ä+öýÿí Éä,öýÿí8X ä(ö)ö+öýÿí¨óä+öýÿí@)å)ö;öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí; ä,öýÿíü*å(ö)ö)ö;öùÿõ}öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿí8X ä(ö)ö+öýÿí¨óä)ö;öùÿõýÿí Éä=öýÿíø]ä;öùÿõýÿíü*å(ö)ö=öýÿí˜3ä;öùÿõ}öùÿõ}övector::insert length errorä,„åK0ðå/,„õ ’ î ØL0èK0\0îâL0óL0>õ ’ î{öùÿõýÿí Éä=öÿÿô;öùÿõ}ö 4R0 M0¬ÿ/î5âõ ’ î{öùÿõ;õ(öOõkõ&öýÿí<0å)öùÿõ{öùÿõýÿíT¾ävõýÿí¼Sä(öýÿí\u ä,öýÿí<0å.öýÿí\u ä)ö;öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿí”å,öýÿí<0å.öýÿí”å)ö;öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿí Éä,öýÿí<0å.öýÿí Éä)ö;öùÿõ}öùÿõ}ö àX0hR0àþ/îCâ˜R0ò€R0>õ ’ î{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿí$å-öýÿíR ä)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõvõýÿ픀ävõýÿíTmä(öýÿíR ä,öýÿí$å,öýÿíl ä)ö;öùÿõýÿí ÉäbõýÿíDZä(öýÿíR ä-öýÿíl ä)ö;öùÿõDõýÿíl ä;öùÿõ}ö T^0Y08þ/î6âDY0ò,Y0>õ ’ î{öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿí$å-öýÿíä¡ä-öÿÿìæ)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõvõýÿ픀ävõýÿíTmä(öýÿíä¡ä+öÿÿìæ,öýÿí$å,öýÿíä¡ä)ö;öùÿõqõýÿí Éä;öùÿõDõýÿíä¡ä;öùÿõ}ö l~0ˆ^0Pý/îQá¸^0ò ^0>õ ’ î{öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõ!õýÿíDZäýÿí¸(å=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí¸(åhõýÿí Éä>öýÿí¸(å-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿíP~0â)ö;öùÿõùÿõ;õ(öýÿí Éä+öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõýÿíDZäýÿí\tä=öýÿíDZä(öýÿí$å-öýÿíä¡ä)ö;öùÿõ!õýÿíÐAä*öýÿíÕä=ö&öýÿíÌ/å;öùÿõ;õ(öýÿí$å-ö(öýÿí\tä-öýÿí@)å)ölõýÿíÕäiõýÿíÕä<öýÿí$å)öùÿõýÿíÕäaõýÿí@)å;öùÿõ;õ(öýÿí\tä>öÿÿô)öùÿõvõýÿ픀ävõýÿ팽ä(öýÿíä¡ä,öýÿí$å,öýÿí$å+öýÿí@)å)ö;öùÿõvõýÿ픀ävõýÿí°¼ ä(öýÿíä¡ä,öýÿí@)å,ö*öýÿíÕä)ö;öùÿõýÿí Éäaõýÿí@)å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíDZäýÿí¨óä=öýÿíDZä(öýÿíä¡ä-öýÿíHý ä(ö)ö)ö;öùÿõýÿí4à äýÿí; ä=öýÿí8X ä(ö)ö;öùÿõýÿíDZäýÿíø]ä=öýÿí Éä+öýÿí@)å;öùÿõýÿíDZäýÿí˜3ä=öýÿíü*å(ö)ökõÿÿô?öýÿíü*å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí¸(å/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí¸(å;öùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí˜3ä)ö;öùÿõvõýÿ픀ävõýÿí°¼ ä(öýÿí8X ä(ö)ö+öýÿí¨óä,öýÿí@)å,öýÿíÌ/å)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõ{öùÿõvõýÿ픀ävõýÿíTmä(öýÿí; ä,öýÿí; ä+öýÿí¨óä,öýÿí8X ä(ö)ö)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿí; ä+öýÿí¨óä,öýÿí; ä+öýÿí Éä,öýÿí8X ä(ö)ö+öýÿí¨óä+öýÿí@)å)ö;öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí; ä,öýÿíü*å(ö)ö)ö;öùÿõ}öùÿõýÿí Éä=öýÿíø]ä;öùÿõýÿíü*å(ö)ö=öýÿí˜3ä;öùÿõ}öùÿõ}övector::insert length errorá ‚0 ~0Œü/î"âÐ~0ò¸~0>õ ’ î{öùÿõýÿíDZäýÿí¨óä=öýÿíDZä(öýÿíä¡ä-öýÿíHý ä(ö)ö)ö;öùÿõýÿíÐàä(öýÿíä¡ä,öÿÿìæ,öýÿíÌ/å)ö;öùÿõDõýÿí8X ä(ö)ö+öýÿí¨óä;öùÿõ}ö ƒ04‚0øû/îâd‚0òL‚0>õ ’ î{öùÿõqõýÿí Éä;öùÿõ}ö Ø„0@ƒ0Hû/îâpƒ0òXƒ0>õ ’ î{öùÿõýÿíÐàä(öýÿí<: ä(ö)ö,öÿÿìæ,öýÿíÌ/å)ö;öùÿõ}ö ¼†0 …0´ú/îâ<…0ò$…0>õ ’ î{öùÿõDõ*ö(öýÿí8X ä(ö)ö+öýÿí Éä-öÿÿìæ)ö;öùÿõ}ö  ˆ0ð†0(ú/îâ ‡0ò‡0>õ ’ î{öùÿõDõ*ö(öýÿí8X ä(ö)ö+öýÿí Éä-öÿÿìæ)ö;öùÿõ}ö ô‰0Ôˆ0”ù/î â‰0òìˆ0>õ ’ î{öùÿõDõ*öýÿí8X ä(ö)ö;öùÿõ}ö H‹0(Š0ù/î âXŠ0ò@Š0>õ ’ î{öùÿõDõ*öýÿí8X ä(ö)ö;öùÿõ}ö œŽ0|‹0Xø/î⬋0ò”‹0>õ ’ î{öùÿõ;õ(öýÿí@)åmõýÿí Éä)öùÿõùÿõPõýÿíÀÍ ä(öüÿí|Ž0â)ö;öùÿõùÿõDõ*ö(öýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}övector::at index out of rangeâ ð‘0ÐŽ0°÷/îã0òèŽ0>õ ’ î{öùÿõ;õ(öýÿí@)åmõýÿí Éä)öùÿõùÿõPõýÿíÀÍ ä(öüÿíБ0â)ö;öùÿõùÿõDõ*ö(öýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}övector::at index out of range⤓0$’0á÷/îâT’0ò<’0>õ ’ î{öùÿõDõ*ö(öýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}ö X•0Ø“0Xö/îâ”0òð“0>õ ’ î{öùÿõDõ*ö(öýÿí8X ä(ö)ö+öýÿí@)å)ö;öùÿõ}ö ´Ÿ0Œ•0¨õ/îi⼕0ò¤•0>õ ’ î{öùÿõ;õ(öýÿí@)å>öýÿíü*å(ö)ö)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿ픟0â)ö;öùÿõùÿõýÿí4à äýÿí; ä=öýÿí8X ä(ö)ö;öùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõ{öùÿõvõýÿ픀ävõýÿíTmä(öýÿí; ä,öýÿí; ä+öýÿí Éä,öýÿí8X ä(ö)ö)ö;öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí; ä,öýÿíü*å(ö)ö)ö;öùÿõ}öùÿõýÿíü*å(ö)ö=öýÿí@)å;öùÿõ}öùÿõ}övector::reserve length errorã ð 0èŸ0õ/î â 0ó 0>õ ’ î{öùÿõDõýÿí Éäjõÿÿô;öùÿõ}ö ,¢0$¡0€ô/î âT¡0ò<¡0>õ ’ î{öùÿõDõýÿíü*å(ö)ö;öùÿõ}ö p§0`¢0´ó/î4â¢0òx¢0>õ ’ î{öùÿõ;õ(öýÿíà#ä>öýÿíèê ä(ö)ö)öùÿõýÿíÐàä(öýÿí<: ä(ö)ö,öýÿíà#ä-öýÿíèê ä(ö)ö,öýÿíT#å)ö;öùÿõ<õ;õ(öýÿíà#ä<öýÿíèê ä(ö)ö)öùÿõýÿí<Çä(öýÿíHý ä(ö)ö+öýÿíà#ä,öýÿí<: ä(ö)ö)ö;öùÿõ}ö ©0¤§0 ó/î âÔ§0ò¼§0>õ ’ î{öùÿõýÿíÝ ä(öýÿíà#ä,öýÿíÐAä(ö)ö)ö;öùÿõ}ö ¨ª0@©0xò/î âp©0òX©0>õ ’ î{öùÿõDõýÿí(© ä(ö)ö.öýÿí¼ß ä(ö)ö;öùÿõ}ö ´«0ܪ0äñ/îâ «0òôª0>õ ’ î{öùÿõDõýÿí Éä;öùÿõ}ö ­0è«0Pñ/î â¬0ó¬0>õ ’ î{öùÿõDõýÿí8X ä(ö)ö+öýÿí Éä;öùÿõ}ö Œ®0T­0Äð/î â„­0òl­0>õ ’ î{öùÿõDõýÿí8X ä(ö)ö+öýÿí Éä;öùÿõ}ö ȯ0À®00ð/î âð®0òØ®0>õ ’ î{öùÿõDõýÿí8X ä(ö)ö;öùÿõ}ö ±0ü¯0¤ï/î â,°0ò°0>õ ’ î{öùÿõDõýÿí8X ä(ö)ö;öùÿõ}ö @²08±0ï/î âh±0òP±0>õ ’ î{öùÿõDõýÿí(© ä(ö)ö;öùÿõ}ö ¾0t²0Dî/îy⤲0òŒ²0>õ ’ î{öùÿõ;õ(öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíü½0â)ö;öùÿõùÿõýÿí€" ä(ö)ö;öùÿõ;õ(öýÿí8X ä(ö)ö)öùÿõ{öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí8X ä(ö)ö,öýÿíü*å(ö)ö)ö;öùÿõýÿí8X ä(ö)ö=öÿÿô;öùÿõýÿíü*å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿíü*å(ö)ö=öýÿí@)å;öùÿõ}öùÿõvõýÿ픀ävõýÿí°¼ ä(öýÿí8X ä(ö)ö,öýÿí@)å,öýÿíä-å)ö;öùÿõýÿí Éä=öýÿí@)å;öùÿõ}ö&vector::assign length errorÜÁ0L¾0”í/î$â|¾0òd¾0>õ ’ î{öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõýÿí„&ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö°Ä0Â0áí/îâ@Â0ò(Â0>õ ’ î{öùÿõ;õ(öýÿí8X ä(ö)ö)öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí8X ä(ö)ö,öýÿíü*å(ö)ö)ö;öùÿõ}ö ¸Ë0äÄ0„0îFâÅ0òüÄ0>õ ’ î{öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí¤Ë0â)ö;öùÿõùÿõýÿí8X ä(ö)ö=öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿíü*å(ö)ö=öýÿí Éä=öýÿí@)å;öùÿõvõýÿ픀ävõýÿí°¼ ä(öýÿí8X ä(ö)ö,öýÿí@)å,öýÿíxQä)ö;öùÿõ}öùÿõ}övector length error„Ð0ìË0@ì/î/âÌ0òÌ0>õ ’ î:öýÿí\u ä(öýÿíÌ/å.öýÿí(© ä(ö)ö,öÿÿô)ö,öùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö ÐÓ0¸Ð0@ë/îâèÐ0òÐÐ0>õ ’ î:öýÿí\u ä(öýÿí0"å,öÿÿô)ö,öùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíxQä)ö;öùÿõ}ö ìÖ0Ô0lê/îâ4Ô0òÔ0>õ ’ î:öýÿí\u ä(öÿÿô)ö,öùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíxQä)ö;öùÿõ}ö 8Ú0 ×0Äé/îâP×0ò8×0>õ ’ î:öýÿí\u ä(öÿÿô)ö,öùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíÐAä(ö)ö)ö;öùÿõ}ö ÄÜ0lÚ0üè/îâœÚ0ò„Ú0>õ ’ î:öýÿí\u ä(öýÿí0"å,öÿÿô)ö,öùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõ}ö ß0øÜ0`è/îâ(Ý0òÝ0>õ ’ î:öýÿí\u ä(öÿÿô)ö,öùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõ}ö”ä0Tß0áK0î6â„ß0òlß0>õ ’ î{öùÿõ;õ(öýÿíü*å(ö)öjõÿÿôiõýÿí”åkõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíü*å(ö)ökõÿÿôiõýÿí”åjõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíü*å(ö)ö<öýÿí Éä)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}ö å0äœ0î âÈä0ò{öDõýÿí\u ä.öýÿí ä(ö)ö;ö}ö¬æ0å0î âÔå0ò{öDõýÿí\u ä.öýÿí ä(ö)ö;ö}ö¸ç0äl0î âàæ0ò{öDõýÿí\u ä.öýÿíl ä(ö)ö;ö}öÄè0äÐ0î âìç0ò{öDõýÿí\u ä.öýÿíl ä(ö)ö;ö}öpé0ä<0îâøè0ò{öDõýÿí”å;ö}þ 0îâ¤é0ò{öDõýÿí”å;ö}öDê0ø8æ/ælê0øtæ/æ”ê0ø°æ/æ¼ê0øìæ/æäê0ø(ç/æ ë0ødç/æ4ë0ø ç/æ\ë0øÌç/æ„ë0øèç/æ¬ë0ø$è/æÔë0ø`è/æüë0øüè/æ$ì0øÄé/æLì0ølê/ætì0ø@ë/æœì0ø@ì/æÄì0ùí/æìì0ø”í/æí0øDî/æ<í0øï/ædí0ø¤ï/æŒí0ø0ð/æ´í0øÄð/æÜí0øPñ/æî0øäñ/æ,î0øxò/æTî0ø ó/æ|î0ø´ó/æ¤î0ø€ô/æÌî0øõ/æôî0ø¨õ/æï0øXö/æDï0ù÷/ælï0ø°÷/æ”ï0øXø/æ¼ï0øù/æäï0ø”ù/æ ð0ø(ú/æ4ð0ø´ú/æ\ð0øHû/æ„ð0øøû/æ¬ð0øŒü/æÔð0øPý/æüð0ø8þ/æ$ñ0øàþ/æLñ0ø¬ÿ/ætñ0ø\0æœñ0øð0æÄñ0ø@0æìñ0øX0æò0ø 0æ<ò0ø<0ædò0øÐ0æŒò0øl0æ´ò0ù0æÜò0øœ0æó0ø„0æýK0æä„ó0—ôæhsèlD2äÀD2äpy2´y2*h&—ä,ó0ä¤ó0)ãá¼ó0—ä´ó0,ó0â”ô0¼e äÌó0Øó0æ â „ã/èó0 ô0äüó0è ì0ô0â ô0è äêáDô0èIêpô0xQôâ â@m€ô0èüó0è8õ0`a ä¤ô0°ô0æ â Àô0¤] â „ã/Ðô0äô0äüó0èøô0â ô0ìá õ0èIêpô0xQôâtõ0ŒÍäHõ0Tõ0æ â dõ0ŒÍ äæ°õ0`“ä„õ0õ0æ â  õ0`“ äæìõ0DZäÀõ0Ìõ0æ â Üõ0DZ äæ(ö0`œäüõ0ö0æ â ö0`œ äæDö0ÐAä8ö0üó0æ`ö0¤] äTö0ö0æœö04à äpö0|ö0æ â Œö04à 俨ö0Ìýä¬ö0¸ö0æ â Èö0Ìý äæ,÷0Läèö0ôö0æ â $P÷0÷0ä,ó0ìâ|ö0è€÷0DÅ ä<÷0H÷0æ â $PX÷0l÷0ä,ó0ìâ¸ö0è"Àø0äý$ø0÷0„ó0äýÌ÷0ÿèäø÷0ä|ö0ä€â,ó0â3áæP&åø0ê âôö0 è,ø0„ó0äýhø0ÿè䔸0ä¸ö0ä€â,ó0â4áæP&å°ø0ê âH÷0 ä"Hú0ä.ù0Ðø0„ó0ä. ù0ÿèä8ù0äôö0ä€â,ó0â5ådù0œ1 äTù0ì â,ó0èð*å€ù0ê â|ö0 è˜ù0„ó0ä.Ôù0ÿèåú0äH÷0䀀â,ó0â6åú0œ1 äTù0îð*å8ú0ê â¸ö0 äˆú0L¸ äXú0dú0æ âÜÀtú0èôö0èÈú0ää˜ú0¤ú0æ âÜÀ´ú0èH÷0è"ð%2`/\û0Øú0„ó0`/û0ÿèä@û0ì€â,ó0â7éœ1 äTù0ìü0dû0„ó0`/ û0PÿèäÌû0ì€â,ó0â8åèû0œ1 äTù0ð0"åü0ê âÈö0 ä¼ü0ü0„ó0`/Xü0Pÿèä„ü0ì€â,ó0â9å ü0œ1 äTù0ð@)åÌõ0ìý0Äü0„ó0`/áý0ÿèä,ý0ì€â,ó0â:åHý0œ1 äTù0ìdý0@)åÌõ0ðxQä€ý0ê âüó0 äpþ0˜ý0„ó0`/Ôý0ÿèåþ0ì€â,ó0 â;åþ0œ1 äTù0ì8þ0@)åÌõ0ìTþ0xQä€ý0î0"åü0êh!2xþ0„ó0`/´þ0ëDÿ0ä £îäàþ0ìâ,ó0ìüþ0œ1 äTù0ì(ÿ0l äÿ0ì æèR äÿ0ì^ó0ä”ÿ0âL1`/â¬ÿ0üxþ0ö<¬ âì{öýÿí¼e ävõýÿí,nä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}öæ /äœ1â 81pC-á´1ü71öœö âì{öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõ!õýÿíDZäýÿí¸(å=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí¸(åhõýÿí¼e ävõýÿí Éä>öýÿí¸(å-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿíì61â)ö;öùÿõùÿõ;õ(öýÿí¼e ävõýÿí Éä+öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíDZäýÿí\tä=öýÿí¼e ävõýÿí Éä-öXõ<öýÿíDZä>ö(öýÿíä¡ä-öýÿíHý ä(ö)ö)ö;öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí\tä)öùÿõ{öùÿõýÿíœö äýÿíœ ä=öýÿíl ä;öùÿõvõýÿ픀ävõýÿíoä(öýÿíœ ä,öXõ<öýÿí`œä>ö(öýÿí\tä)ö)ö;öùÿõýÿíLäýÿí'å=öýÿí$å;öùÿõ@õ(öýÿíœö äýÿíP&å=öýÿíœ ä;öýÿíP&åkõýÿíR ä;öpõýÿíP&å,öpõýÿí'å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõ@õ(öýÿíLäýÿí¨'å=öýÿíä¡ä;öýÿí¨'å<öýÿí$å;öpõýÿí¨'å,öpõýÿí'å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿí¨'å)ö;öùÿõýÿíR ä=öýÿíœ ä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíLäýÿíP&å=öýÿí$å-öýÿí@)å;öùÿõ@õ(öýÿíLäýÿí'å=öýÿí$å;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿí'å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõvõýÿ픀ävõýÿ팽ä(öýÿíä¡ä,öýÿíä¡ä+ö(öýÿí\tä-öýÿí@)å)ö,öýÿí$å)ö;öùÿõ}öùÿõvõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿíR ä,öýÿíä¡ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíPˆä<öýÿíÐAä,öýÿí¤] ä>öýÿí`Tä(öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõýÿíDZäýÿíø]ä=öýÿí¼e ävõýÿí Éä+öýÿí@)å;öùÿõýÿíDZäýÿí˜3ä=öýÿí¼e ävõýÿíü*å(ö)ökõÿÿô?öýÿí¼e ävõýÿíü*å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí¸(å/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí¸(å;öùÿõýÿí`Tä.öýÿí8X ä(ö)ö=öýÿí`Tä.öýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí˜3ä)ö;öùÿõýÿí`Tä.öýÿíü*å(ö)ö=öýÿí˜3ä;öùÿõýÿíLäýÿí'å=öýÿí`Tä.öýÿí8X ä(ö)ö;öùÿõýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿíä¡ä;öpõýÿíP&å,öpõýÿí'å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä,öpõýÿí'å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíl ä)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿí'å,öpõýÿí`Tä.öýÿí Éä)öùÿõýÿí`Tä.öýÿí(© ä(ö)ö.öýÿíxå(öýÿí'å,ö*öýÿíP&å)ö;öùÿõýÿí`Tä.öýÿí¼Sä(ö*öOõ)ö;öùÿõ}öùÿõ}ö*vector::insert length error” /pCD71âîL1䌢îäp71ìâ´ /ä2åŒ71œ1 ä$/ì¨71ä¡ä /ìÔ71l äÄ71ì æäð71R äÄ71ðˆ$ä|Gìæ /ä\81â¸>1pC8ât81ü´=1ö<¬ âì{öùÿõýÿí—ä<öýÿí>å,öýÿí ’ ä>öýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí—ä<öýÿí>å,öýÿí ’ ä>ö&öýÿí,Rä=öýÿíL´ä;öùÿõýÿípCä(öýÿíä¡ä,öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö” /pCð=1âî 81ä„¡îä>1ìâ´ /ä1å8>1œ1 ä$/ìT>1ä¡ä /ì€>1l äp>1ì æäœ>1R äp>1ðˆ$äÈHìæ /ä?1âTB1h â ?1ýA1ö<¬ âì{öýÿípCä(öýÿíä¡ä,öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö” /h 1äø îähA1ìâ´ /ì„A1œ1 ä$/ì A1ä¡ä /ìÌA1l ä¼A1ì æäèA1R ä¼A1ðˆ$äB1ì â /B1æ(B1è4ÿêæ /ä¤B1â8F1h â¼B1üäD1ö<¬ âì{öýÿíÐàä(öýÿíä¡ä,öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;ö}ö” /h E1ëTB1äÈ¥îäLE1ìâ´ /ìhE1œ1 ä$/ì„E1ä¡ä /ì°E1l ä E1ì æäÌE1R ä E1ðˆ$äèE1ì â /øE1æ F1è4êþæ /äˆF1â ”f1„&Já F1ü¬e1öœö âì{öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíDZäýÿí(ä=öýÿí˜ ä(öýÿí@)å,öýÿí¼e ävõýÿí Éä)ö;öùÿõýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿíP&å+öýÿí(ä;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å,öpõýÿíl ä)öùÿõ*öýÿíP&å=ö*öýÿíl ä;öùÿõ;õ(öýÿí@)å<öýÿí¼e ävõýÿí Éä)öùÿõ{öùÿõýÿí$å=öýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿíP&å<öýÿí$å;öpõýÿíP&å)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí$òä(öýÿíP&å)ö;öùÿõýÿí¼e ävõýÿí Éä=öýÿí@)å;öùÿõ}öùÿõ<õ;õ(öýÿí¼e ävõýÿí Éä<öýÿí@)å)öùÿõ{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä,öpõýÿíP&å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿíP&å,ö*öýÿíl ä)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíe1â)ö;öùÿõùÿõýÿí€" ä(ö)ö;öùÿõ;õ(öýÿí¼e ävõýÿí8X ä(ö)ö)öùÿõ{öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí¼e ävõýÿí8X ä(ö)ö,öýÿí¼e ävõýÿíü*å(ö)ö)ö;öùÿõýÿí¼e ävõýÿí8X ä(ö)ö=öÿÿô;öùÿõýÿí¼e ävõýÿíü*å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí¼e ävõýÿí8X ä(ö)ö=öýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí¤vä(öýÿí@)å)ö;öùÿõýÿí¼e ävõýÿíü*å(ö)ö=öýÿí@)å;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä,öpõýÿíP&å,öpõýÿí¼e ävõýÿí Éä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿíP&å,ö*öýÿíl ä)ö;öùÿõ}öùÿõ}ö*vector::assign length error” /„&èe1âî8F1äì¤îäf1ìâ´ /ä0å0f1œ1 ä$/ì\f1l äLf1ì æäxf1R äLf1ðˆ$ä|Gìæ /ääf1âTj1„&âüf1üli1ö<¬ âì{öùÿõýÿí€" ä(ö)ö;öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõýÿíÌoä(ö*öýÿíl ä)ö;öùÿõ}ö” /„&¨i1âî”f1ä¤îäÔi1ìâ´ /ä/åði1œ1 ä$/ìj1l ä j1ì æä8j1R ä j1ðˆ$äÈHìæ /ä¤j1â¤m1h» â¼j1üll1ö<¬ âì{öýÿí„&ä(öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö” /h» ¨l1ëTj1äT£îäÔl1ìâ´ /ìðl1œ1 ä$/ìm1l ä m1ì æä8m1R ä m1ðˆ$äTm1ì â /dm1æxm1è4ÿêæ /äôm1âö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;ö}ö” /h» @p1ë¤m1äø–îälp1ìâ´ /ìˆp1œ1 ä$/ì´p1l ä¤p1ì æäÐp1R ä¤p1ðˆ$äìp1ì â /üp1æq1è4êþæ /äŒq1â°}1,vâ¤q1üÈ|1öœö âì{öùÿõýÿíDZäýÿílÚ ä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí¼e ävõýÿí Éä>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí´|1â)ö;öùÿõùÿõ;õ(öýÿílÚ ä>öÿÿô)öùÿõ{öùÿõýÿí¼e ävõýÿí8X ä(ö)ö=öýÿí¼e ävõýÿí(© ä(ö)ö.öýÿí¤vä(öýÿílÚ ä)ö;öùÿõýÿí¼e ävõýÿíü*å(ö)ö=öýÿílÚ ä;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿíHý ä(ö)ö;öýÿíl äkõýÿíR ä;öpõýÿíP&å,öpõýÿí¼e ävõýÿí Éä,öpõýÿíl ä)öùÿõýÿí¼e ävõýÿí(© ä(ö)ö.öýÿíxå(öýÿíP&å,ö*öýÿíl ä)ö;öùÿõ}öùÿõ}ö"vector length error” /,}1âîövõýÿíL ä(ö)ö)ö;ö}ö” /,nLƒ1ëø€1äîäxƒ1ìâ´ /씃1œ1 ä$/ìÀƒ1l ä°ƒ1ì æä܃1R ä°ƒ1ðˆ$äøƒ1ì â /„1æ„1è4ÿêæ /䘄1âà‡1,nâ°„1ü¨†1ö<¬ âì{öýÿí,ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;ö}ö” /,nä†1ëH„1ä$îä‡1ìâ´ /ì,‡1œ1 ä$/ìX‡1l äH‡1ì æät‡1R äH‡1ðˆ$ä‡1ì â / ‡1æ´‡1è4êÿæ0ˆ1âØ·1¼S4â`ˆ1ü@1òHˆ1>õ ’ î{öùÿõ;õ(ö&öýÿíÌ/åkõ&öýÿí<0å)öùÿõ{öùÿõýÿí¼Sä(öýÿíÌ/å.öýÿí\u ä,öýÿí<0å.öýÿí\u ä)ö;öùÿõýÿí¼Sä(öýÿíÌ/å.öýÿí”å,öýÿí<0å.öýÿí”å)ö;öùÿõýÿí¼Sä(öýÿíÌ/å.öýÿí Éä,öýÿí<0å.öýÿí Éä)ö;öùÿõ}öùÿõ}öh&¼S|1îà‡1䌎îä˜1ìât·1Ì/å´1ì âÄ1 ä â Ô1,·1ä,Ž1Pˆè˜1èpä„¶1èì™1äš1èL²1h&PˆäÔ1äLŽ1ãádŽ1Pˆä\Ž1Ô1â Ž1ŒÍätŽ1€Ž1æ â Ž1ŒÍ äæÜŽ1`“ä°Ž1¼Ž1æ â ÌŽ1`“ äæ1LäìŽ1øŽ1æ â 14à äæT1DÅ ä(141æ â D1Ìý äæ1DZäd1p1æ â €1DZ äæÌ1`œä 1¬1æ â ¼1`œ äæø1ÐAäÜ1è1æ ì1¤] ä1¼1æP14à ä$101æ â @14à äæŒ1Ìýä`1l1æ â |1Ìý äæ" ’1`/0‘1œ1,Ž1`/Ø1ÿèä‘1ì€âÔ1âúéœ1 ä ‘1ì âÔ1äè‘18‘1,Ž1`/t‘1Pÿèä ‘1ì€âÔ1âû弑1œ1 ä ‘1ð0"娑1ê â|1 èð‘1,Ž1`/,’1âÿèäX’1ìãÔ1âåt’1è ‘1ø’1ê âÔ1 ä4“1ì.ä°’1,Ž1ì.ì’1âÿèä“1ì €âÔ1âüéœ1 ä ‘1ìÈ“1€" äD“1,Ž1€" €“1âÿè䬓1ì€âÔ1âýéœ1 ä ‘1ìx”1¼S䨓1,Ž1¼S”1ÿèä@”1ì€âÔ1âþå\”1œ1 ä ‘1ð<0å’1ì"¨•18X •1ˆ”1,Ž18X Ä”1ÿèå•1äð”1ä€âÔ1âÿå â01 èœ1 ä ‘1ð$•1,Ž18X `•1ÿè䌕1äð”1 âÔ1ãéœ1 ä ‘1ê"È–1(© <–1¸•1,Ž1(© ô•1ÿèä –1䨑1ä€âÔ1âéœ1 ä ‘1ðD–1,Ž1(© €–1ÿè䬖1䨑1 âÔ1 âéœ1 ä ‘1êø—1ü*ál—1Ø–1,Ž1ü*á—1ÿèäP—1ä@—1ä€âÔ1 âå âp1 èœ1 ä ‘1ð t—1,Ž1ü*á°—1ÿèäÜ—1ä@—1 âÔ1 âéœ1 ä ‘1ꈘ1\u ä˜1â X˜1\u ˜1è â ؘ0˜1D˜1ä|1ìâp1èâ p˜1 Ép1èæ”á01蘘1 Éä X˜1¨˜1”å p˜1<™1,„丘1,Ž1,„ô˜1âÿèä ™1쀀âÔ1âéœ1 ä ‘1î2äL™1,Ž12ˆ™1âÿèä´™1ä’1ääÔ1âåЙ1è ‘1ø’1êš1>õ ’ î è›1Pš1Ø“1î‚1òhš1>õ ’ î{öùÿõvõýÿ픀ävõýÿí¼Sä(ö*öOõ,öýÿí<0å)ö;öùÿõ}ö < 1œ1D“1î*âLœ1ò4œ1>õ ’ î{öùÿõýÿíLäýÿí¼"å=öýÿí8X ä(ö)ö;öùÿõýÿíLäýÿíP&å=öýÿí¼"å+öýÿí Éä;öùÿõ>õ(öýÿíP&å>öýÿí¼"å)öùÿõýÿí(© ä(ö)ö.öýÿí$òä(öqõýÿíP&å)ö;öùÿõýÿí Éä=öÿÿô;öùÿõ}ö ˆ£1p 1°’1îâ  1òˆ 1>õ ’ î{öùÿõýÿí€" ä(ö)ö;öùÿõ;õ(öýÿí8X ä(ö)ö)öùÿõýÿí(© ä(ö)ö.öýÿí”j ä(öýÿí8X ä(ö)ö,öýÿíü*å(ö)ö)ö;öùÿõ}ö ü¨1¼£1¸˜1î6âì£1òÔ£1>õ ’ î{öùÿõ;õ(öýÿíü*å(ö)öjõÿÿôiõýÿí”åkõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíü*å(ö)ökõÿÿôiõýÿí”åjõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíü*å(ö)ö<öýÿí Éä)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öª1ät—1î â0©1ò{öDõýÿí\u ä.öýÿí ä(ö)ö;ö}ö«1䨖1î â<ª1ò{öDõýÿí\u ä.öýÿí ä(ö)ö;ö}ö ¬1äD–1î âH«1ò{öDõýÿí\u ä.öýÿíl ä(ö)ö;ö}ö,­1丕1î âT¬1ò{öDõýÿí\u ä.öýÿíl ä(ö)ö;ö}öØ­1ä$•1îâ`­1ò{öDõýÿí”å;ö}ö„®1䈔1îâ ®1ò{öDõýÿí”å;ö}ö€°1ä8‘1î⸮1ò:öýÿí\u ä(öýÿí0"å,öÿÿô)ö,öýÿí Éä(öÿÿô)ö,öýÿí”å(öÿÿô)ö{ö}þœ1îâ´°1ò:öýÿí\u ä(öÿÿô)ö,öýÿí Éä(öÿÿô)ö,öýÿí”å(öÿÿô)ö{ö}öt²1øtŽ1朲1ø°Ž1æIJ1øìŽ1æì²1ø(1æ³1ød1æ<³1ø 1æd³1øÜ1挳1ø1æ´³1ø$1æܳ1ø`1æ´1øœ1æ,´1ø8‘1æT´1ø°’1æ|´1øD“1椴1øØ“1æÌ´1øˆ”1æô´1ø$•1æµ1ø¸•1æDµ1øD–1ælµ1øØ–1攵1øt—1æ¼µ1ø˜1æäµ1øX˜1æ ¶1øp˜1æ4¶1ø¸˜1æ\¶1øð‘1æüL™1æäܶ1¸Pôápä„ã/å/ä·1ö4å/¸Pä„¶1äü¶1ãå¸Pä ·1„¶1æ¼"ãëP·1ä@·1è ðâd·1è äê<0å·1ì â ·1 ä â Ô1°·1Ä·1ä@·1ìâd·1èå/ä(¸1âØÀ1h Gâ@¸1üè¾1ö<¬ âì{öõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>öýÿídØä;öùÿõõýÿîD ä<öýÿíœFä<öýÿí¼e ävõýÿí4à ä,öýÿídØä>ö>öýÿí ä;öùÿõýÿí¼e ävõýÿípCä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö,öùÿõýÿí ä(öýÿídØä(öýÿíl ä)ö)ö,öùÿõýÿí ä(öýÿídØä(öýÿíR ä)ö)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h $¿1ëØ·1䨓îäP¿1ìâÜä/ì|¿1œ1 äl¿1ì âÜä/丿1ä¡ä˜¿1ì â ¨¿14à äæä¿1l äÔ¿1ì æåÀ1R äÔ¿1ìlÀ1ˆ$äÀ1ì â„¶1,À1æ@À1è4ÿîˆ$äˆÀ1ì â„¶1˜À1æ¬À1è4ÿêå/ä(Á1âÈÇ1h 3â@Á1üÆ1ö<¬ âì{öõýÿîD ä<öýÿíœFä<öýÿí¼e ävõýÿí4à ä,öýÿí<¬ ä>ö>öýÿí ä;öùÿõýÿí¼e ävõýÿípCä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö,öùÿõýÿí ä(öýÿíl ä)ö,öýÿí ä(öýÿíR ä)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h DÆ1ëØÀ1äd“îäpÆ1ìâÜä/ìŒÆ1œ1 äl¿1ì¨Æ1ä¡ä˜¿1ìÔÆ1l äÄÆ1ì æäðÆ1R äÄÆ1ì\Ç1ˆ$ä Ç1ì â„¶1Ç1æ0Ç1è4êÿâˆ$äxÇ1ì â„¶1ˆÇ1æœÇ1è4ÿêå/äÈ1âˆÎ1h 1â0È1üÈÌ1ö<¬ âì{öõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>öýÿídØä;öùÿõýÿí¼e ävõýÿípCä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö,öùÿõýÿídØä(öýÿíl ä)ö,öýÿídØä(öýÿíR ä)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h Í1ëÈÇ1äd’îä0Í1ìâÜä/ìLÍ1œ1 äl¿1ìhÍ1ä¡ä˜¿1ì”Í1l ä„Í1ì æä°Í1R ä„Í1ìÎ1ˆ$äÌÍ1ì â„¶1ÜÍ1æðÍ1è4ÿîˆ$ä8Î1ì â„¶1HÎ1æ\Î1è4êþå/äØÎ1âhÓ1h âðÎ1ü¨Ñ1ö<¬ âì{öýÿí¼e ävõýÿípCä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö,öùÿõýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h äÑ1ëˆÎ1äH‘îäÒ1ìâÜä/ì,Ò1œ1 äl¿1ìHÒ1ä¡ä˜¿1ìtÒ1l ädÒ1ì æäÒ1R ädÒ1ìüÒ1ˆ$ä¬Ò1ì â„¶1¼Ò1æÐÒ1è4êÿâˆ$äÓ1ì â„¶1(Ó1æ<Ó1è4êþå/ä¸Ó1â|Ú1h 9âÐÓ1ü(Ù1ö<¬ âì{öõýÿíà?ä<öýÿí<¬ ä>övõýÿíÐAäýÿíüZ ä;öùÿõýÿíh ä(öýÿíä¡ä,öýÿíl ä,öýÿíR ä,öùÿõýÿí¸Pä<öýÿíT¾ävõýÿíhI ä<öýÿíüZ ä,öýÿíÐAä>övõýÿíxQä>ö(ö)ö,öùÿõýÿí¸Pä<öýÿíT¾ävõýÿíhI ä<öýÿíÐAä,öýÿí¼e ävõýÿíÐAä>övõýÿíxQä>ö(ö)ö)ö;ö}ö4å/h dÙ1ëhÓ1äD„îäÙ1ìâÜä/ì¬Ù1œ1 äl¿1ìÈÙ1ä¡ä˜¿1ìôÙ1l ääÙ1ì æäÚ1R ääÙ1ðˆ$ä,Ú1ì â„¶1<Ú1æPÚ1è4ÿêå/äÌÚ1âÞ1h âäÚ1üÄÜ1ö<¬ âì{öýÿíÐàä(öýÿíä¡ä,öXõ<öýÿíDZä>ö(öýÿíl ä)ö,ö(öýÿíÐAä)öýÿíR ä)ö;ö}ö 4å/h áÝ1ë|Ú1äà‚îä,Ý1ìâÜä/ìHÝ1œ1 äl¿1ìdÝ1ä¡ä˜¿1ìÝ1l ä€Ý1ì æä¬Ý1R ä€Ý1ðˆ$äÈÝ1ì â„¶1ØÝ1æìÝ1è4êþå/ähÞ1âôå1h» >â€Þ1üPä1ö<¬ âì{öõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>öýÿídØä;öùÿõõýÿîD ä<öýÿíœFä<öýÿí¼e ävõýÿí4à ä,öýÿídØä>ö>öýÿí ä;öùÿõýÿí¼e ävõýÿí„&ä(öýÿí ä(öýÿídØä(öýÿíl ä)ö)ö,öùÿõýÿí ä(öýÿídØä(öýÿíR ä)ö)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h» Œä1ëÞ1ä~îä¸ä1ìâÜä/ìÔä1œ1 äl¿1íå1l äðä1ì æäå1R äðä1ìˆå1ˆ$ä8å1ì â„¶1Hå1æ\å1è4ÿîˆ$ä¤å1ì â„¶1´å1æÈå1è4ÿêå/äDæ1âðë1h» *â\æ1üLê1ö<¬ âì{öõýÿîD ä<öýÿíœFä<öýÿí¼e ävõýÿí4à ä,öýÿí<¬ ä>ö>öýÿí ä;öùÿõýÿí¼e ävõýÿí„&ä(öýÿí ä(öýÿíl ä)ö,öýÿí ä(öýÿíR ä)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h» ˆê1ëôå1äÜ}îä´ê1ìâÜä/ìÐê1œ1 äl¿1ìüê1l äìê1ì æäë1R äìê1ì„ë1ˆ$ä4ë1ì â„¶1Dë1æXë1è4êÿâˆ$ä ë1ì â„¶1°ë1æÄë1è4ÿêå/ä@ì1â¼ñ1h» (âXì1üð1ö<¬ âì{öõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>öýÿídØä;öùÿõýÿí¼e ävõýÿí„&ä(öýÿídØä(öýÿíl ä)ö,öýÿídØä(öýÿíR ä)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h» Tð1ëðë1äà|îä€ð1ìâÜä/ìœð1œ1 äl¿1ìÈð1l ä¸ð1ì æääð1R ä¸ð1ìPñ1ˆ$åñ1ì â„¶1ñ1æ$ñ1è4ÿîˆ$älñ1ì â„¶1|ñ1æñ1è4êþå/ä ò1â¨õ1h» â$ò1üô1ö<¬ âì{öýÿí¼e ävõýÿí„&ä(öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/h» @ô1ë¼ñ1ä|îälô1ìâÜä/ìˆô1œ1 äl¿1ì´ô1l ä¤ô1ì æäÐô1R ä¤ô1ì<õ1ˆ$äìô1ì â„¶1üô1æõ1è4êÿâˆ$äXõ1ì â„¶1hõ1æ|õ1è4êþå/äøõ1âpü1h» 7âö1ü8û1ö<¬ âì{öõýÿíà?ä<öýÿí<¬ ä>övõýÿíÐAäýÿíüZ ä;öùÿõýÿíh» ä(öýÿíl ä,öýÿíR ä,öùÿõýÿí¸Pä<öýÿíT¾ävõýÿíhI ä<öýÿíüZ ä,öýÿíÐAä>övõýÿíxQä>ö(ö)ö,öùÿõýÿí¸Pä<öýÿíT¾ävõýÿíhI ä<öýÿíÐAä,öýÿí¼e ävõýÿíÐAä>övõýÿíxQä>ö(ö)ö)ö;ö}ö4å/h» tû1ë¨õ1ä<€îä û1ìâÜä/ì¼û1œ1 äl¿1ìèû1l äØû1ì æäü1R äØû1ðˆ$ä ü1ì â„¶10ü1æDü1è4ÿêå/äÀü1âÀÿ1h» âØü1üˆþ1ö<¬ âì{öýÿíL¢ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,ö(öýÿíÐAä)öýÿíR ä)ö;ö}ö4å/h» Äþ1ëpü1ä˜îäðþ1ìâÜä/ì ÿ1œ1 äl¿1ì8ÿ1l ä(ÿ1ì æäTÿ1R ä(ÿ1ðˆ$äpÿ1ì â„¶1€ÿ1æ”ÿ1è4êþå/ä2âœ2,n>â(2üø2ö<¬ âì{öõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>öýÿídØä;öùÿõõýÿîD ä<öýÿíœFä<öýÿí¼e ävõýÿí4à ä,öýÿídØä>ö>öýÿí ä;öùÿõýÿí¼e ävõýÿí,ä(öýÿí ä(öýÿídØä(öýÿíl ä)ö)ö,öùÿõýÿí ä(öýÿídØä(öýÿíR ä)ö)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/,n42ëÀÿ1äDîä`2ìâÜä/ì|2œ1 äl¿1ì¨2l ä˜2ì æäÄ2R ä˜2ì02ˆ$äà2ì â„¶1ð2æ2è4ÿîˆ$äL2ì â„¶1\2æp2è4ÿêå/äì2☠2,n*â2üô 2ö<¬ âì{öõýÿîD ä<öýÿíœFä<öýÿí¼e ävõýÿí4à ä,öýÿí<¬ ä>ö>öýÿí ä;öùÿõýÿí¼e ävõýÿí,ä(öýÿí ä(öýÿíl ä)ö,öýÿí ä(öýÿíR ä)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/,n0 2ëœ2äÀ~îä\ 2ìâÜä/ìx 2œ1 äl¿1ì¤ 2l ä” 2ì æäÀ 2R ä” 2ì, 2ˆ$äÜ 2ì â„¶1ì 2æ 2è4êÿâˆ$äH 2ì â„¶1X 2æl 2è4ÿêå/äè 2âd2,n(ã2üÀ2ö<¬ âì{öõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>öýÿídØä;öùÿõýÿí¼e ävõýÿí,ä(öýÿídØä(öýÿíl ä)ö,öýÿídØä(öýÿíR ä)ö,öùÿõýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/,nü2ë˜ 2äàrîä(2ìâÜä/ìD2œ1 äl¿1ìp2l ä`2ì æäŒ2R ä`2ìø2ˆ$ä¨2ì â„¶1¸2æÌ2è4ÿîˆ$ä2ì â„¶1$2æ82è4êþå/ä´2âP2,nâÌ2ü¬2ö<¬ âì{öýÿí¼e ävõýÿí,ä(öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}ö4å/,nè2ëd2äXrîä2ìâÜä/ì02œ1 äl¿1ì\2l äL2ì æäx2R äL2ìä2ˆ$ä”2ì â„¶1¤2æ¸2è4êÿâˆ$å2ì â„¶12æ$2è4êþå/ä 2â2,n7â¸2üà2ö<¬ âì{öõýÿíà?ä<öýÿí<¬ ä>övõýÿíÐAäýÿíüZ ä;öùÿõýÿí,nä(öýÿíl ä,öýÿíR ä,öùÿõýÿí¸Pä<öýÿíT¾ävõýÿíhI ä<öýÿíüZ ä,öýÿíÐAä>övõýÿíxQä>ö(ö)ö,öùÿõýÿí¸Pä<öýÿíT¾ävõýÿíhI ä<öýÿíÐAä,öýÿí¼e ävõýÿíÐAä>övõýÿíxQä>ö(ö)ö)ö;ö}ö4å/,n2ëP2ä0lîäH2ìâÜä/ìd2œ1 äl¿1ì2l ä€2ì æä¬2R ä€2ðˆ$äÈ2ì â„¶1Ø2æì2è4ÿêå/äh2â<,0,nâ€2ü0 2ö<¬ âì{öýÿí,ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,ö(öýÿíÐAä)öýÿíR ä)ö;ö}ö4å/,nl 2ë2äkîä˜ 2ìâÜä/ì´ 2œ1 äl¿1ìà 2l äÐ 2ì æäü 2R äÐ 2ðˆ$ä!2ì â„¶1(!2æövõýÿíxQä>ö(ö)ö)ö;ö}ö à*2L¢*2á&2„ó0L¢<&2ëÌ&2䤨îäh&2ìâ,ó0ì„&2œ1 äTù0ì°&2l ä &2ì æèR ä &2ì^ó0ä'2âX"2L¢â4'2ý&2ö<¬ âì{öùÿõùÿõýÿí¼e ävõýÿíh» ä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;öùÿõ}ú$*2„ó0L¢`*2ÿèäŒ*2ì€â,ó0 â<å¨*2œ1 äTù0ìÄ*2@)åÌõ0ðä-å€ý0êt+2Hƒå ð*2„ó0Hƒá,+2ÿèäX+2äÈö0䀀â,ó0 â=éœ1 äTù0ê"”,2Hý ,2„+2„ó0Hý À+2ÿèäì+2äôö0ä€â,ó0 â>éœ1 äTù0ð,2„ó0Hý L,2ÿèäx,2äH÷0䀀â,ó0 â?éœ1 äTù0ê"´-2<: (-2¤,2„ó0<: à,2ÿèä -2äôö0ä€â,ó0â@éœ1 äTù0ð0-2„ó0<: l-2ÿèä˜-2äH÷0䀀â,ó0âAéœ1 äTù0êÔ.2|) H.2Ä-2„ó0|) á.2ÿèä,.2ädú0ä€â,ó0âBéœ1 äTù0ðP.2„ó0|) Œ.2ÿèä¸.2ä¤ú0䀀â,ó0âCéœ1 äTù0ê"ô/2<Þh/2ä.2„ó0<Þ /2ÿèäL/2ädú0ä€â,ó0âDéœ1 äTù0ðp/2„ó0<Þ¬/2ÿèäØ/2ä¤ú0䀀â,ó0âEéœ1 äTù0êˆ02èê ä02„ó0èê @02ÿèäl02äÌõ0䀀â,ó0âFéœ1 äTù0ê12¼ß ä˜02„ó0¼ß Ô02ÿèå12äÌõ0䀀â,ó0âGéœ1 äTù0ê"22Ý Ì12,12„ó0Ý h12ÿèä”12ì€â,ó0âHå°12œ1 äTù0ðà#äÌõ0ðÔ12„ó0Ý 22ÿèä<22ì€â,ó0âIåX22œ1 äTù0ìt22à#äÌõ0ðT#å€ý0ê$32ÔÎä 22„ó0ÔÎÜ22ÿèä32äÌõ0䀀â,ó0âJéœ1 äTù0ê¸32ÔO ä432„ó0ÔO p32ÿèäœ32쀀â,ó0âKéœ1 äTù0êh42HGäÈ32„ó0HG42ÿèä042ì€â,ó0âLåL42œ1 äTù0ð@)åÌõ0ì"À52 252x42„ó0 2´42ÿèäà42äõ0䀀â,ó0âMåü42œ1 äTù0î@)åÌõ0ð 52„ó0 2\52ÿèäˆ52äTõ0ä€â,ó0âNå¤52œ1 äTù0ð@)åÌõ0ì"72äp62Ð52„ó0ä 62ÿèä862äTõ0ä€â,ó0âOåT62œ1 äTù0ð@)åÌõ0ðx62„ó0ä´62ÿèäà62äõ0䀀â,ó0âPåü62œ1 äTù0î@)åÌõ0ì"882üɬ72(72„ó0üÉd72ÿèä72äTõ0ä€â,ó0âQéœ1 äTù0ð´72„ó0üÉð72ÿèä82äõ0䀀â,ó0 âRéœ1 äTù0ê"X92dk Ì82H82„ó0dk „82ÿèä°82äTõ0ä€â,ó0!âSéœ1 äTù0ðÔ82„ó0dk 92ÿèä<92äõ0䀀â,ó0"âTéœ1 äTù0ê:2Ìoäh92„ó0Ìo¤92ÿèäÐ92ì€â,ó0#âUåì92œ1 äTù0ðÌ/å€ý0êœ:2övõýÿíxQä>ö(ö)ö)ö;öùÿõ}ö"DB2<Ç€A2à@2„ó0<ÇA2ÿèäHA2äôö0ä€â,ó0'âYådA2œ1 äTù0ðä¡äôö0ðˆA2„ó0<ÇÄA2ÿèäðA2äôö0ä€â,ó0(âZå B2œ1 äTù0ì(B2l äôö0ðR äôö0ìC2¼SäTB2„ó0¼SB2ÿèä¼B2ì€â,ó0)â[åØB2œ1 äTù0ð<0åôB2ì â,ó0 ä˜C2€" äC2„ó0€" PC2ÿèä|C2ì€â,ó0*â\éœ1 äTù0ð,„ä¨C2ä,„äC2äYÿå â ôC2,„ â „ã/D2D2äüó0è,D2âÈö0ìá@D2èIêpô0xQôâ„D2>õ ’ âœD2è ⯬D2èüó0èüE2äC2î âôD2ò{öùÿõùÿõýÿí¼e ävõýÿí€" ä(ö)ö;öùÿõ}ö°G2äTB2îâ0F2ò{öùÿõýÿí¼e ävõýÿí¼Sä(ö(öýÿí¼e ä&ö)öýÿí<0å)ö;öùÿõùÿõ}öõ ’ îè¡2äÄ2îâ  2ò{öýÿí¼e ävõýÿí,ä(öýÿí@)å,ö(ö!õ õýÿí¼e ävõýÿíÐAä&ö)öýÿíä-å)ö;ö}öÜ¢2ä02îâ¢2ò{öýÿí¼e ävõýÿí€" ä(ö)ö;ö}öH¤2äpœ2î â£2ò{öýÿí¼e ävõýÿí¼Sä(ö(öýÿí¼e ä&ö)öýÿí<0å)ö;ö}ö§2䤛2îâ|¤2ò{öDõýÿíLä(öýÿí¼e ävõýÿí<Çä(ö õýÿí¼e ävõýÿíLä(öýÿíl ä)ö,ö õýÿí¼e ävõýÿíLä(öýÿíR ä)ö)ö)ö;ö}÷©2äüš2îâ8§2ò{öDõýÿíLä(öýÿí¼e ävõýÿí<Çä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö)ö)ö;ö}ö¼«2äš2îâ4©2ò{öýÿí¼e ävõýÿíÐàä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö,öýÿí@)å,ö(ö!õ õýÿí¼e ävõýÿíÐAä&ö)öýÿíÌ/å)ö;ö}ö¨®2äP™2îâð«2ò{öDõýÿíLä(öýÿí¼e ävõýÿíÐàä(ö õýÿí¼e ävõýÿíLä(öýÿíä¡ä)ö,ö(ö!õ õýÿí¼e ävõýÿíÐAä&ö)öýÿíÌ/å)ö)ö;ö}öœ¯2优2îâÜ®2ò{öýÿí¼e ävõýÿíöýÿí<0å.öýÿí”Sä;ö}öT3øÈ3æø3æ¸ø âL3ä3ì€â03Ì/åàë2î<0åàë2ê{öDõýÿíÌ/å.öýÿí”Sämõýÿí<0å.öýÿí”Sä;ö}öð3ø|3æ¬3æø ã3äÈ3äHü.ä€âä3@)å î2ðì¿äàë2ê{öDõýÿíðœ ä(öýÿíì¿ä)öaõýÿí@)å;ö}ö3øÔñ2æ@3øìñ2æh3ø„ý.æÀ3ø3æàï.ðHÿõè3æHï.ðHý@)åÜð.ì{öùÿõùÿõýÿíDZäýÿíTeä=ö(öýÿí¨óä.öýÿí”Sä-öýÿí@)å)ö/öýÿí(ûä;öùÿõýÿí,bäýÿí¨ßä=öýÿí,bä(ö-öÿÿìæ)önõ(öýÿí¨óä.öýÿí”Sä-öýÿí@)å)ö%öýÿí(ûä;öùÿõùÿõýÿíDZäýÿíPN ä=öýÿí@)å/öýÿí(ûä;öùÿõýÿíDZäýÿíÀä=öýÿíôâ ä(öýÿí Éä)ö;öùÿõýÿíDZäýÿí$å=öýÿíÀä-öýÿíPN ä;öùÿõ;õ(öýÿíPN ä>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí¨ßäjõýÿí,bä(ö-öÿÿìæ)ö)öùÿõýÿí”å[öýÿíTeä]ö=öýÿí”å[öýÿíTeä+öýÿíPN ä]ö;öùÿõ<õùÿõ{öùÿõýÿí,bäýÿí`Tä=öýÿí”å[öýÿíTeä]ö;öùÿõýÿí”å[öýÿíTeä]ö=öýÿí”å[öýÿíTeä+öýÿíPN ä]ö;öùÿõýÿí”å[öýÿíTeä]öeõýÿí¨ßä;öùÿõýÿí”å[öýÿíTeä]ögõ~öýÿí¨ßä&öýÿí`Tä;öùÿõ}öùÿõ@õ(öýÿíDZäýÿíP&å=öýÿíTeä+öÿÿìæ;öýÿíP&å<öýÿí$å;öpõýÿíP&å)öùÿõýÿí”å[öýÿíP&å]ö=öýÿí”å[öýÿíP&å+öýÿíPN ä]ö;öùÿõ}öùÿõýÿí,bäýÿí¼?ä=öýÿí@)å%öýÿí(ûä;öùÿõýÿí,bäýÿíÌ@ä=öýÿí(ûä-öýÿí@)å%öýÿí(ûä;öùÿõ;õ(öýÿí¨ßäjõýÿí,bä(ö-öÿÿìæ)ö)öùÿõ{öùÿõýÿí”å[öýÿíTeä]ödõýÿí¼?ä;öùÿõ;õ(öýÿíTeä<öýÿíÀä-öÿÿìæ)öùÿõýÿí”å[öýÿíTeä]ögõýÿí”å[öýÿíTeä+öÿÿìæ]önõýÿíÌ@ä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí,bäýÿí`Tä=öýÿí”å[öýÿíTeä]ö;öùÿõýÿí”å[öýÿíTeä]ödõýÿí¼?ä;öùÿõ;õ(öýÿíTeä<öýÿíÀä-öÿÿìæ)öùÿõýÿí”å[öýÿíTeä]ögõýÿí”å[öýÿíTeä+öÿÿìæ]önõýÿíÌ@ä;öùÿõýÿí”å[öýÿíTeä]öeõýÿí¨ßä;öùÿõýÿí”å[öýÿíTeä]ögõ~öýÿí¨ßä&öýÿí`Tä;öùÿõ}öùÿõ@õ(öýÿíDZäýÿíP&å=öýÿíTeä+öÿÿìæ;öýÿíP&å<öýÿíÀä-öÿÿìæ;öpõýÿíP&å)öùÿõ{öùÿõýÿí”å[öýÿíP&å]ödõýÿí¼?ä;öùÿõýÿí”å[öýÿíP&å]ögõýÿí”å[öýÿíP&å+öÿÿìæ]önõýÿíÌ@ä;öùÿõ}öùÿõ;õ(öýÿíTeäkõýÿíÀä-öÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí¨ßäjõýÿí,bä(ö-öÿÿìæ)ö)öùÿõýÿí”å[öýÿíÀä-öÿÿìæ]ödõýÿí¼?ä;öùÿõ<õùÿõ{öùÿõýÿí,bäýÿí`Tä=öýÿí”å[öýÿíÀä-öÿÿìæ]ö;öùÿõýÿí”å[öýÿíÀä-öÿÿìæ]ödõýÿí¼?ä;öùÿõýÿí”å[öýÿíÀä-öÿÿìæ]öeõýÿí¨ßä;öùÿõýÿí”å[öýÿíÀä-öÿÿìæ]ögõ~öýÿí¨ßä&öýÿí`Tä;öùÿõ}öùÿõ}öùÿõ}ö dR3`<3x<3îââ4=3ö ’ ðÀï.öÿÿô)öùÿõ{öùÿõ@õ(öýÿíDZäýÿíP&å=öýÿíÀä-öÿÿìæ;öýÿíP&åmõýÿí$å;öqõýÿíP&å)öùÿõýÿí”å[öýÿíP&å]ö=öýÿí”å[öýÿíP&å-öýÿíPN ä]ö;öùÿõ}öùÿõýÿí,bäýÿí¼?ä=öýÿí(ûä-öýÿí@)å%öýÿí(ûä;öùÿõýÿí,bäýÿíÌ@ä=öýÿí@)å%öýÿí(ûä;öùÿõ@õ(öýÿíDZäýÿíP&å=öýÿíÀä-öÿÿìæ;öýÿíP&å>öýÿí$å;öqõýÿíP&å)öùÿõ{öùÿõýÿí”å[öýÿíP&å]öcõýÿíÌ@ä;öùÿõýÿí”å[öýÿíP&å]ögõýÿí”å[öýÿíP&å-öÿÿìæ]öoõýÿí¼?ä;öùÿõ}öùÿõ;õ(öýÿíPN ä>öÿÿôhõýÿí¨ßäjõýÿí,bä(ö-öÿÿìæ)ö)öùÿõýÿí”å[öýÿí$å]öcõýÿíÌ@ä;öùÿõ<õùÿõ{öùÿõýÿí,bäýÿí`Tä=öýÿí”å[öýÿí$å]ö;öùÿõýÿí”å[öýÿí$å]öcõýÿíÌ@ä;öùÿõýÿí”å[öýÿí$å]öeõýÿí¨ßä;öùÿõýÿí”å[öýÿí$å]ögõ~öýÿí¨ßä&öýÿí`Tä;öùÿõ}öùÿõ}ö pj3˜R3°R3îïâT3ö ’ ðÀï.ˆ! ìR3âÿèäS3ì€âàï.:â±å4S3œ1 ä¼÷.ì´S3$Z äPS3ì â `S3Ìý â pS3@î â €S3 S3 â S38* ÿàÐS3l äÜð.ììS3R äÜð.ð¨‘äÜð.ì{öùÿõ>õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿíDZäýÿíˆÏä=öýÿíR ä-öýÿíl ä;öùÿõýÿíDZäýÿí¨ûä=öýÿíl ä%öýÿí(ûä;öùÿõýÿíDZäýÿí´ýä=öýÿí¨‘ä%öýÿí(ûä;öùÿõýÿíDZäýÿí`Tä=öýÿí(ûä-öýÿí¨ûä;öùÿõ;õ(öýÿíˆÏä>öýÿí`Tä)öùÿõýÿíˆÏä=öýÿí`Tä;öùÿõýÿí`Tä=öýÿí(ûä-öýÿí´ýä;öùÿõ;õ(öýÿíˆÏä>öýÿí`Tä)öùÿõýÿíˆÏä=öýÿí`Tä;öùÿõýÿí,bäýÿí<Ü ä=öýÿí,bä(ö-öÿÿìæ)önõýÿí¨ûä;öùÿõýÿí,bäýÿíTÈä=öýÿí,bä(ö-öÿÿìæ)ö;öùÿõýÿí`Tä=ö(öýÿí(ûä-ö(öýÿíl ä+öýÿíˆÏä)ö%öýÿí(ûä)ö;öùÿõ;õ(öýÿí`Tä<öýÿí(ûä)öùÿõýÿíTÈädõýÿí`Tä;öùÿõýÿí,bäýÿíÌ? ä=öýÿí<Ü ä&öýÿíTÈä;öùÿõýÿí,bäýÿíÇ ä=öýÿí$Z ä[öýÿíl ä/öýÿí(ûä]ö&öýÿíÌ? ä;öùÿõ;õ(öýÿí¨ûä<öýÿí´ýä)öùÿõ{öùÿõýÿíÇ äcõ(öýÿí´ýä-öýÿí¨ûä)ö;öùÿõýÿíÌ? äcõ(öýÿí´ýä-öýÿí¨ûä)ö;öùÿõ}öùÿõ<õ;õ(öýÿí´ýä<öýÿí¨ûä)öùÿõ{öùÿõýÿíÇ ädõ(öýÿí¨ûä-öýÿí´ýä)ö;öùÿõýÿíÌ? ädõ(öýÿí¨ûä-öýÿí´ýä)ö;öùÿõ}öùÿõýÿí,bä&öýÿíìrä=öýÿí”å[öýÿí¨‘ä/öýÿí(ûä]ö;öùÿõýÿíìräeõ~öýÿíÌ? ä;öùÿõýÿíìrägõýÿíÇ ä;öùÿõýÿíl äaõýÿíˆÏä;öùÿõýÿí¨‘äaõýÿíˆÏä;öùÿõ}öùÿõ}ö lp3¤j3¼j3î6â\k3ö ’ ðÀï.ìøj3âÿèä$k3ì€âàï.9â°å@k3œ1 ä¼÷.ð¨óäÜð.ì{öùÿõýÿíDZäýÿí …ä=öýÿí¨óä/öýÿí(ûä;öùÿõýÿí,bäýÿíDº ä=ö(öýÿí,bä)öÿÿìænõýÿí¨óä%öýÿí(ûä;öùÿõýÿí,bä&öýÿíÇ ä=öýÿí”å[öýÿí …ä]ö;öùÿõ;õ(öýÿíÇ ä&öýÿíDº ä)öùÿõýÿíÇ äeõ~öýÿíDº ä;öùÿõ<õùÿõýÿíÇ ägõýÿíDº ä;öùÿõ}ö ؆3 p3¸p3îãâq3ö ’ ð Àï.8iáôp3âÿèä q3ì€âàï.8â¯åä=öýÿíÌ/å.öýÿí˜lä.öýÿí”å[öýÿíÌ/å.öýÿí”Sä/öýÿí(ûä]ö;öùÿõõýÿí\"ä=öõ(öýÿíì>ä&öýÿíÔ° ä)ö;öùÿõýÿí,bäýÿí ± ä=öýÿí,bä(öÿÿìæ)önõýÿí<0å.öýÿí”Sä%öýÿí(ûä;öùÿõýÿí,bä&öýÿí0ä=öýÿí<0å.öýÿí˜lä.öýÿí”å[öýÿí<0å.öýÿí”Sä/öýÿí(ûä]ö;öùÿõõýÿí$!ä=öõ(öýÿí0ä&öýÿí ± ä)ö;öùÿõ;õ(öýÿí\"ä^öýÿí$!ä)öùÿõ{öùÿõ;õ(öýÿí$!ä)öùÿõ{öùÿõýÿíì>ägõýÿíÔ° ä;öùÿõýÿí0äeõ~öýÿí ± ä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíì>äeõ~öýÿíÔ° ä;öùÿõýÿí0ägõýÿí ± ä;öùÿõ}öùÿõ}öùÿõ}ö Ôª3ô¤3 ¥3î7⬥3ö ’ ðÀï.¼SH¥3âÿèät¥3ì€âàï.&â å¥3œ1 ä¼÷.ðÌ/å</ì{öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõ{öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿíDñä,öýÿíÌ/å.öýÿíDñä)ö;öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿí Éä,öýÿíÌ/å.öýÿí Éä)ö;öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿí”å,öýÿíÌ/å.öýÿí”å)ö;öùÿõùÿõ}öùÿõ}ö ô±3«3 «3îAâÜ«3ö ’ ðÀï.<Ç\«3âÿè䈫3äHü.ä€âàï.%âŸå¤«3œ1 ä¼÷.ìÀ«3l äHü.ðR äHü.ì{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíl ä;öùÿõùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿí<: ä(ö)ö-öýÿíR ä)ö;öùÿõýÿíDZäýÿíˆÏä=öýÿíDZä(öýÿíR ä-öýÿíl ä)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõýÿít¶å(öýÿíR ä,öýÿíˆÏä)ö;öùÿõýÿí ÉäbõýÿíˆÏä;öùÿõùÿõDõýÿíl ä;öùÿõùÿõ}ö 0·3(²3@²3î.âà²3ö ’ ðÀï.<Ç|²3âÿè䨲3äHü.ä€âàï.$âžåIJ3œ1 ä¼÷.ðä¡äHü.ì{öùÿõùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿí<: ä(ö)ö-öýÿíä¡ä-öÿÿìæ)ö;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõýÿít¶å(öýÿíä¡ä+öÿÿìæ,öÿÿìæ)ö;öùÿõqõýÿí Éä;öùÿõùÿõDõýÿíä¡ä;öùÿõùÿõ}ö L×3d·3|·3îHáp¸3ö ’ ðÀï.pC¸·3âÿèää·3ì€âàï.5â¬æ¸3œ1 ä¼÷.ì¸3ä¡äHü.ì8¸3l äHï.ìT¸3R äHï.ðˆ$ääDì{öùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿíR ä-öýÿíl ä)ö;öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõýÿíDZäýÿí,ýä=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí,ýähõýÿí Éä>öýÿí,ýä-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿí0×3â)ö;öùÿõùÿõùÿõ;õ(öýÿí Éä+öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíDZäýÿí(ä=öýÿíDZä(öýÿí<: ä(ö)ö-öýÿíä¡ä)ö;öùÿõ;õ(öýÿí(ä>öÿÿô)öùÿõýÿíõ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí,ýä/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí,ýä;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí¨óä>öÿÿô)öùÿõýÿíˆ! ä(öýÿí; ä,öÿÿô,öýÿí¨óä,öÿÿô)ö;öùÿõùÿõýÿíˆ! ä(öýÿíl ä.öýÿí˜lärõýÿí”å,öýÿíl ä.öýÿí”Sä,öýÿíR ä.öýÿí”Sä,öýÿíä¡ä.öýÿí”Sä)ö;öùÿõùÿõ;õ(öýÿí¨óä<öýÿí Éä)öùÿõýÿíˆ! ä(öýÿí; ä,öýÿí¨óä,öýÿí Éä,öýÿí¨óä+öýÿí@)å)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõýÿí Éä=öýÿíø]ä;öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõ}ö&vector::insert length error´Ú3€×3˜×3îâŒØ3ö ’ ðÀï.pCÔ×3ÿèåØ3ì€âàï.4â«åØ3œ1 ä¼÷.ì8Ø3ä¡äHü.ìTØ3l äHü.ìpØ3R äHü.ðˆ$ääDì{öùÿõýÿípCä(öýÿíä¡ä,öýÿíDÅ ä(öýÿíl ä)ö,öýÿíDÅ ä(öýÿíR ä)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}öÄ÷3èÚ3áÛ3î(áèÛ3ö ’ ðÀï.Ðà<Û3âÿèähÛ3ì€âàï.#âå„Û3œ1 ä¼÷.ì Û3ä¡äHü.ì¼Û3@)åÜð.ðÌ/åØÛ3ê æ ä{öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõýÿíDZäýÿí,ýä=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí,ýähõýÿí Éä>öýÿí,ýä-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿí¨÷3â)ö;öùÿõùÿõùÿõ;õ(öýÿí Éä+öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíDZäýÿí(ä=öýÿíDZä(öýÿí<: ä(ö)ö-öýÿíä¡ä)ö;öùÿõ;õ(öýÿí(ä>öÿÿô)öùÿõýÿíõ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí,ýä/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí,ýä;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí¨óä>öÿÿô)öùÿõýÿíˆ! ä(öýÿí; ä,öÿÿô,öýÿí¨óä,öÿÿô)ö;öùÿõýÿí8iå(öýÿí¨óä,öýÿí@)å,öýÿíÌ/å)ö;öùÿõ;õ(öýÿí¨óä<öýÿí Éä)öùÿõýÿíˆ! ä(öýÿí; ä,öýÿí¨óä,öýÿí Éä,öýÿí¨óä+öýÿí@)å)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõýÿí Éä=öýÿíø]ä;öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõ}ö&vector::insert length error´û3ø÷3ø3îâÌø3ö ’ ðÀï.ÐàLø3âÿèäxø3äHü.ä€âàï."âœå”ø3œ1 ä¼÷.ì°ø3ä¡äHü.ðÌ/åØÛ3ê{öùÿõýÿí`œäýÿí¨óä=öýÿíä¡ä-öýÿíHý ä(ö)ö;öùÿõýÿíÐàä(öýÿíä¡ä,öÿÿìæ,öýÿíÌ/å)ö;öùÿõDõýÿíHý ä(ö)ö+öýÿí¨óä;öùÿõ}ö¼ý3èû3áü3î â„ü3ö ’ ðÀï.öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíì#4â)ö;öùÿõùÿõùÿõ;õ(öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿí4à äýÿí; ä=öýÿí”å;öùÿõýÿíDZäýÿí˜3ä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõ{öùÿõýÿíŒíä=öýÿíôâ ä(öýÿíDñä.öýÿíä)ö;öùÿõ@õ(öýÿíDZäýÿíP&å=öÿÿô;öýÿíP&å<öýÿíŒíä;öpõýÿíP&å)öùÿõýÿí”å[öýÿíP&å]ö=öýÿí; ä[öýÿíP&å]ö;öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõ}öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõ}övector::reserve length errorã ´%4@$4X$4î âÜ$4ö ’ ðÀï.ÔO ”$4ÿèäÀ$4쀀âàï.âéœ1 ä¼÷.ê{öùÿõDõýÿí Éäjõÿÿô;öùÿõ}ö\'4è%4á&4î â„&4ö ’ ðÀï.ÔÎ<&4ÿèäh&4äÜð.䀀âàï.âéœ1 ä¼÷.ê{öùÿõDõýÿíDñä.öýÿíä;öùÿõ}ö ¸-4'4¨'4î7â(4ö ’ ðÀï.Ý ä'4âÿèä(4ì€âàï.âŽå,(4œ1 ä¼÷.ìH(4à#äÜð.ðT#ád(4ð4ÿê{öùÿõ;õ(öýÿíà#ä>öýÿíèê ä(ö)ö)öùÿõýÿíÐàä(öýÿí<: ä(ö)ö,öýÿíà#ä-öýÿíèê ä(ö)ö,öýÿíT#å)ö;öùÿõ<õ;õ(öýÿíà#ä<öýÿíèê ä(ö)ö)öùÿõýÿí<Çä(öýÿíHý ä(ö)ö+öýÿí`œä(öýÿíà#ä)ö,öýÿí<: ä(ö)ö)ö;öùÿõ}ö À24ì-4.4î-âˆ.4ö ’ ðÀï.¼ß @.4âÿèäl.4äÜð.䀀âàï.âéœ1 ä¼÷.ê{öùÿõýÿíDZäýÿí,ýä=öýÿíDñä.öýÿí¼ß ä(ö)ö;öùÿõýÿíDZäýÿíÄä=öýÿíhää<öýÿíDZä>övõýÿíl„ ä(ö)ö;öùÿõ;õ(öýÿí,ýä>öýÿíÄä/öýÿí(ûä)öùÿõDõýÿíÄä;öùÿõDõýÿí,ýä*öýÿí(ûä;öùÿõ}ö 844ô24 34îâ34ö ’ ðÀï.èê H34ÿèät34äÜð.䀀âàï.âŒéœ1 ä¼÷.ê{öùÿõDõýÿí Éä;öùÿõ}ö L64l44„44î â,54ö ’ ðÀï.<ÞÀ44ÿèä54äì44䀀âàï.â‹å âÜÀü44èHï.ìœ1 ä¼÷.ê{öùÿõDõýÿíää(öýÿíHý ä(ö)ö)ö;öùÿõ}ö `84€64˜64î â@74ö ’ ðÀï.<ÞÔ64ÿèä$74å74ä€âàï.âŠå âÜÀ74èHü.ìœ1 ä¼÷.ì{öùÿõDõýÿíL¸ ä(öýÿíHý ä(ö)ö)ö;öùÿõ}ö P:4”84¬84î â094ö ’ ðÀï.|) è84ÿèä94äì44䀀âàï.â‰éœ1 ä¼÷.ê{öùÿõDõýÿíää(öýÿí<: ä(ö)ö)ö;öùÿõ}ö @<4„:4œ:4î â ;4ö ’ ðÀï.|) Ø:4ÿèä;4å74ä€âàï.âˆéœ1 ä¼÷.ì{öùÿõDõýÿíL¸ ä(öýÿí<: ä(ö)ö)ö;öùÿõ}ö `>4t<4Œ<4îâ=4ö ’ ðÀï.<: È<4ÿèäô<4äHï.䀀âàï. â‡éœ1 ä¼÷.ê{öùÿõùÿõDõýÿíDÅ ä(öOõ,öýÿí Éä)ö;öùÿõùÿõ}ö €@4”>4¬>4îâ0?4ö ’ ðÀï.<: è>4ÿèä?4äHü.ä€âàï. â†éœ1 ä¼÷.ì{öùÿõùÿõDõýÿíLä(öOõ,öýÿí Éä)ö;öùÿõùÿõ}ö  B4´@4Ì@4îâPA4ö ’ ðÀï.Hý A4ÿèä4A4äHï.䀀âàï. â…éœ1 ä¼÷.ê{öùÿõùÿõDõýÿíDÅ ä(öOõ,öÿÿô)ö;öùÿõùÿõ}ö ÀD4ÔB4ìB4îâpC4ö ’ ðÀï.Hý (C4ÿèäTC4äHü.ä€âàï. â„éœ1 ä¼÷.ì{öùÿõùÿõDõýÿíLä(öOõ,öÿÿô)ö;öùÿõùÿõ}ö °F4ôD4 E4î âE4ö ’ ð Àï.HƒáHE4ÿèätE4äS3䀀âàï. âƒéœ1 ä¼÷.ê{öùÿõùÿõDõýÿí¤] ä(öýÿíDñä)ö;öùÿõùÿõ}ö ˆU4äF4üF4î‘âÔG4ö ’ ðÀï.„&8G4âÿèädG4ì€âàï.3âªå€G4œ1 ä¼÷.ìœG4l äHï.ì¸G4R äHï.ðˆ$ääDì{öùÿõùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)ö(öýÿíR ä-öýÿíl ä)ö;öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿílU4â)ö;öùÿõùÿõ;õ(öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿí4à äýÿí; ä=öýÿí”å;öùÿõýÿíDZäýÿí˜3ä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõýÿí Éä=öýÿí@)å;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõùÿõýÿíˆ! ä(öýÿíl ä.öýÿí˜lärõýÿí”å,öýÿíl ä.öýÿí”Sä,öýÿíR ä.öýÿí”Sä,öÿÿô)ö;öùÿõùÿõ}ö&vector::assign length error¤X4¼U4ÔU4îâ¬V4ö ’ ðÀï.„&V4ÿèäöýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿíÜh4â)ö;öùÿõùÿõùÿõ;õ(öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿí4à äýÿí; ä=öýÿí”å;öùÿõýÿíDZäýÿí˜3ä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõýÿí Éä=öýÿí@)å;öùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿí@)å=öýÿíôâ ä(öýÿí@)å)ö;öùÿõýÿí,bäýÿíD.å=öýÿíä-å?öýÿí,bä(ö-öÿÿìæ)ö:öýÿí,bä(öÿÿô)ö;öùÿõ@õ(öýÿíDZäýÿíP&å=öÿÿô;öýÿíP&å<öýÿí@)å;öpõýÿíP&å)öùÿõýÿí”å[öýÿíP&å]ö=öýÿíD.å;öùÿõ}öùÿõ}ö&vector::assign length errorÔy4,i4Di4îªâäi4ö ’ ðÀï.2€i4âÿèä¬i4ä</ä€âàï.âåÈi4œ1 ä¼÷.ðÌ/å</ê{öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõ{öùÿõùÿõ;õ(öýÿíÔÎä(ö)ö<öýÿíÌ/å.öýÿíèê ä(ö)ö)öùÿõ{öùÿõýÿí4à äýÿí; ä=öýÿí”å;öùÿõýÿíDZäýÿí˜3ä=öýÿíè”ä(öýÿíÌ/å.öýÿíèê ä(ö)ö)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõýÿí Éä=öýÿíÌ/å.öýÿíèê ä(ö)ö;öùÿõ;õ(öýÿíÌ/å.öýÿíèê ä(ö)ö>öÿÿô)öùÿõ{öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿíÌ/å.öýÿíèê ä(ö)ö)ö;öùÿõ@õ(öýÿíDZäýÿíP&å=öÿÿô;öýÿíP&å<öýÿíŒíä;öpõýÿíP&å)öùÿõýÿí”å[öýÿíP&å]ö=öýÿíÌ/å.öýÿí”å[öýÿíP&å]ö;öùÿõ}öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö ü|4z4 z4îâ¤z4ö ’ ðÀï.Ì\z4ÿèäˆz4ì€âàï.1â¨éœ1 ä¼÷.ì{öùÿõ;õ(öýÿí”åkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí”å,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõ}ö ¤~40}4H}4î âÌ}4ö ’ ðÀï.ì.„}4ÿèä°}4ì €âàï.â€éœ1 ä¼÷.ì{öùÿõùÿõýÿíÌä(ö)ö;öùÿõ}ö Ôˆ4Ø~4ð~4î_âÈ4ö ’ ðÀï.,,4âÿèäX4ì€âàï.0â§åt4œ1 ä¼÷.ì4l äHï.ì¬4R äHï.ðˆ$ääDì{öùÿõýÿíDZäýÿí@)å=öýÿíDZä(öýÿíR ä-öýÿíl ä)ö;öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí°ˆ4"â)ö;öùÿõùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõùÿõýÿíˆ! ä(öýÿíl ä.öýÿí˜lärõýÿí”å,öýÿíl ä.öýÿí”Sä,öýÿíR ä.öýÿí”Sä,öÿÿô)ö;öùÿõùÿõýÿí Éä=öýÿí@)å;öùÿõ}öùÿõ}ö vector::construction length errorâ ð‹4‰4 ‰4îâø‰4ö ’ ðÀï.,\‰4ÿè䈉4ì€âàï./â¦å¤‰4œ1 ä¼÷.ìÀ‰4l äHü.ì܉4R äHü.ðˆ$ääDì{öùÿõýÿí,ä(öýÿíDÅ ä(öýÿíl ä)ö,öýÿíDÅ ä(öýÿíR ä)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö <—4$Œ4<Œ4îlâøŒ4ö ’ ðÀï.,xŒ4âÿè䤌4ì€âàï..â¥åÀŒ4œ1 ä¼÷.ìÜŒ4@)åÜð.ðxQäØÛ3ê{öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí—4"â)ö;öùÿõùÿõ;õ(öýÿí@)å>öÿÿô)öùÿõ{öùÿõýÿí Éä=öýÿí@)å;öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿíDñä.öýÿíä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõýÿí,bäýÿíD.å=öýÿíxQä?öýÿí,bä(ö-öÿÿìæ)ö:öýÿí,bä(öÿÿô)ö;öùÿõ@õ(öýÿíDZäýÿíP&å=öÿÿô;öýÿíP&å<öýÿíŒíä;öpõýÿíP&å)öùÿõýÿí”å[öýÿíP&å]ö=öýÿíD.å;öùÿõ}öùÿõ}ö vector::construction length errorâ X¡4p—4ˆ—4îbâ(˜4ö ’ ðÀï.`/Ä—4âÿèäð—4ä8ýä€âàï.âå ˜4œ1 ä¼÷.ðÌ/å</ê:öýÿíDñä(öýÿíD!ä(öýÿíÌ/å.öýÿíDñä)ö,öýÿíÌ/å.öýÿí Éä)ö,öùÿõùÿõýÿí Éä(öýÿíÌ/å.öýÿí Éä)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõ;õ(öýÿíDñä.öýÿíä>öÿÿô)öùÿõ{öùÿõýÿíDñä.öýÿíä=öýÿíè”ä(öýÿíDñä.öýÿíä)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿíDñä.öýÿíä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿíÌ/å.öýÿí”å,öýÿíÌ/å.öýÿí”å+öýÿíŒíä,öýÿí”å)ö;öùÿõ}öùÿõ}ö ´¥4Œ¡4¤¡4î!✢4ö ’ ðÀï.`/à¡4ÿèä ¢4ä8ýä€âàï.â~å(¢4œ1 ä¼÷.ìD¢4@)åÜð.ì`¢4xQø0"å|¢4ê ⌢4 ä ì:öýÿíDñä(öýÿíD!ä(öýÿí0"å)ö)ö,öùÿõùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíxQä)ö;öùÿõ}ö©4è¥4á¦4îâè¦4ö ’ ðÀï.`/<¦4Pÿèäh¦4ä8ýä€âàï.â}儦4œ1 ä¼÷.ì ¦4@)åÜð.ðxQ¼¦4ð4ÿê:öýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,ä(öýÿí@)å,öýÿíxQä)ö;öùÿõ}ö t¬4D©4\©4îâª4ö ’ ðÀï.`/˜©4PÿèäÄ©4ä8ýä€âàï.â|åà©4œ1 ä¼÷.ð0"åü©4ê â ª4 ä ì:öýÿíDñä(öýÿíD!ä(öýÿí0"å)ö)ö,öùÿõùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõ}ö ¬®4¨¬4À¬4îâD­4ö ’ ðÀï.`/ü¬4ÿèä(­4ä8ýä€âàï.â{éœ1 ä¼÷.ì:öýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõ}úà®4ø®4î8â|¯4ö ’ ðÀï.,„4¯4âÿèä`¯4쀀âàï.*â¤éœ1 ä¼÷.ê{öùÿõ;õ(öýÿíDñä.öýÿíäjõÿÿôiõýÿí”åkõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíDñä.öýÿíäkõÿÿôiõýÿí”åjõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíDñä.öýÿíä*öýÿí(ûä<öýÿí Éä)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öä´4øt /èµ4ø µ4æ`S3æ°µ4ø@µ4æLµ4æ â \µ4ÐA â lµ4@î â |µ4œµ4 â Œµ48* ÿàص4øÈþ.é¶4øHü.è(¶4øHï.耶4øP¶4æÈþ.ðHùض4ø¨¶4æHü.ðHù0·4ù·4æHï.ðHùd·4øX·4æÜð.昷4øŒ·4æ î2æÌ·4øÀ·4挵4ç¸4øô·4æpñ.æ4¸4ø(¸4æPS3æh¸4ø\¸4æHü.朸4ø¸4æHï.æи4øĸ4æá74æ¹4øø¸4æì44æ,¹4øÀ¬4æT¹4ø\©4æ|¹4ù¦4椹4ø¤¡4æ̹4øˆ—4æô¹4øH}4æº4øDi4æDº4øðX4ælº4ø E4攺4øìB4漺4øÌ@4æäº4ø¬>4æ »4øŒ<4æ4»4øœ:4æ\»4ø¬84æ„»4ø˜64欻4ø„44æÔ»4ø 34æü»4ø.4æ$¼4ø¨'4æL¼4ù&4æt¼4øX$4朼4ø\4æļ4ø4æì¼4øT4æ½4ø0 4æ<½4øl 4æd½4ød4挽4øü4æ´½4øÄ4æܽ4ø,4æ¾4øþ3æ,¾4ùü3æT¾4øø3æ|¾4ùÛ3椾4ø@²3æ̾4ø «3æô¾4ø ¥3æ¿4ø—3æD¿4ø ’3æl¿4øø3政4øø®4漿4ø8ð.æä¿4ø@ñ.æ À4øXñ.æpÀ4ø4À4æáÀï.(ûÜð.ÿèHÁ4ø4À4˜À4â èÄÀ4Á4øèðÀ4ü:¬¨äÀîüIêLµ4øâpÁ4ø<Œ4æ˜Á4ø ‰4æÀÁ4øð~4æèÁ4ø z4æÂ4øÔU4æ8Â4øüF4æ`Â4ø˜×3æˆÂ4ø|·3æ°Â4ø¬Œ3æØÂ4ø$‡3æáÃ4ø¸p3æ(Ã4ø¼j3æPÃ4ø°R3æxÃ4øx<3æ Ã4ø¨û.æÈÃ4ø8÷.æðÃ4ùõ.æÄ4ø8ò.æü@Ä4æpÄ4è5ÄÄ4äöäŒÄ4ò¨Ä4è</ö</òŒµ4èðÄ4—äèÄ4àï.âÅ4¸PåÅ4t /âÅ4D!ä µ4(Å4,bä @µ4@Å4ŒÍä8Å4Èþ.âXÅ4ðœ äPÅ4Hü.âpÅ4hëähÅ4Hï.âŒÅ4`“ä€Å4êœÅ4DZä X·4¬Å4`œä Œ·4ÈÅ4ÐAä¼Å4êØÅ4¤] ä À·4èÅ44à ä ô·4øÅ4Ìýä (¸4Æ4Lä \¸4Æ4DÅ ä ¸4(Æ4L¸ ä ĸ48Æ4ääø¸4,é4`/HÆ4À¬4PÆ4\©4XÆ4á(¦4`Æ4¤¡4„ã4hÆ4Àï.`/¤Æ4ë4Ç4äȹîäÐÆ4ìâàï.ììÆ4œ1 ä¼÷.ìÇ4l äÇ4ì æèR äÇ4ìð.ä„Ç4âäÊ4`/#âœÇ4ühÆ4ö<¬ âì:öýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,nä(öýÿíl ä,öýÿíR ä,öýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}þ4Ë4â¬Í4¼S âdË4ülÌ4òLË4>õ ’ î{öùÿõýÿíÌ/å.öýÿí¼Sä(öýÿí<0å)ö;öùÿõ}öh&¼S¨Ì4îäÊ4ä8µîäÄÌ4ìâHÍ4Ì/åàÌ4ì âðÌ4 ä â,ó0áÍ4$Í4äÍ4è ðâ8Í4è äê<0ådÍ4ì âtÍ4 ä â ,ó0„Í4˜Í4äÍ4ìâ8Í4ðüÍ4âŒÐ4ð â,Î4üLÏ4òÎ4>õ ’ î{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}öh&ðˆÏ4î¬Í4ä,´îä¤Ï4ìâ(Ð4Ì/åÀÏ4ê âÐÏ4 ä â ,ó0àÏ4Ð4äôÏ4è ðâÐ4è äê<0åDÐ4ê âTÐ4 ä â ,ó0dÐ4xÐ4äôÏ4ìâÐ4ðÜÐ4âlÓ4¸ â Ñ4ü,Ò4òôÐ4>õ ’ î{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸hÒ4îŒÐ4䄳îä„Ò4ìâÓ4Ì/å Ò4ê â°Ò4 ä â ,ó0ÀÒ4äÒ4äÔÒ4è ðâøÒ4è äê<0å$Ó4ê â4Ó4 ä â ,ó0DÓ4XÓ4äÔÒ4ìâøÒ4ð¼Ó4âÖ4Ì âìÓ4üÄÔ4òÔÓ4>õ ’ î{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}ö h&ÌáÕ4îlÓ4䈲îäÕ4ìâ Õ4Ì/å8Õ4ê âHÕ4 ä â ,ó0XÕ4|Õ4älÕ4è ðâÕ4è äê<0å¼Õ4ê âÌÕ4 ä â ,ó0ÜÕ4ðÕ4älÕ4ìâÕ4ðTÖ4â Û4¸#â„Ö4üÌÙ4òlÖ4>õ ’ î{öùÿõDõvõýÿ픀ävõýÿí4· ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö,öýÿí<0å.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&¸Ú4îÖ4䌷îä$Ú4ìâ¨Ú4Ì/å@Ú4ê âPÚ4 ä â ,ó0`Ú4„Ú4ätÚ4è ðâ˜Ú4è äê<0åÄÚ4ê âÔÚ4 ä â ,ó0äÚ4øÚ4ätÚ4ìâ˜Ú4ð\Û4âìÝ4`4 âŒÛ4ü¬Ü4òtÛ4>õ ’ î{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`4èÜ4î Û4䨶îäÝ4ìâˆÝ4Ì/å Ý4ê â0Ý4 ä â ,ó0@Ý4dÝ4äTÝ4è ðâxÝ4è äê<0å¤Ý4ê â´Ý4 ä â ,ó0ÄÝ4ØÝ4äTÝ4ìâxÝ4ð<Þ4â8=25)âlÞ4üDâ4òTÞ4>õ ’ î{öùÿõDõýÿíÌ/å.öýÿíèê ä(ö)öjõýÿí<0å.öýÿíèê ä(ö)öiõvõýÿ픀ävõýÿíøtä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö)ö;öùÿõ}öh&5€â4îìÝ4äøµîäœâ4ìâ ã4Ì/å¸â4ê âÈâ4 ä â ,ó0Øâ4üâ4äìâ4è ðâã4è äê<0å<ã4ê âLã4 ä â ,ó0\ã4pã4äìâ4ìâã4è$é4Œã4Àï.`/Èã4ë„ä4äºîäôã4ìâàï.ìä4œ1 ä¼÷.ì<ä4l ä,ä4ì æäXä4R ä,ä4ð0"åtä4ê ⌵4 äð.äÔä4â4Ç4`/-âìä4üŒã4ö<¬ âì:öýÿíDñä(öýÿíD!ä(öýÿí0"å)ö)ö,öùÿõùÿõýÿí Éä(öÿÿô)ö,öùÿõýÿí”å(öÿÿô)öùÿõ{öùÿõýÿí,nä(öýÿíl ä,öýÿíR ä,öýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}ú ˆ—4<é4ì.ä H}4Lé42ä)Di4Àì4L¢¸ì4\é4Àï.L¢˜é4ë(ê4äÀÈîäÄé4ìâàï.ìàé4œ1 ä¼÷.ì ê4l äüé4ì æèR äüé4ìð.äxê4â„ä4L¢âê4ü\é4ö<¬ âì{öùÿõýÿíh» ä(öýÿíl ä,öýÿíR ä,öýÿí¸Pä<öýÿíhää<öýÿí<¬ ä>övõýÿíàúä>ö(ö)ö)ö;öùÿõ}ú ðX4Ðì4Hƒå E4èì4Hý àì4ìB4äÌ@4á í4<: øì4¬>4äŒ<4í4|) í4œ:4ä¬840í4<Þ(í4˜64ä „44@í4èê ä 34Pí4¼ß ä .4`í4Ý ä ¨'4pí4ÔÎå &4€í4ÔO ä X$4í4HGä\4¨í4ä í44äT4Àí4 2¸í40 4äl 4Øí4üÉÐí4d4äü4ðí4dk èí4Ä4ä,4áî4Ìoä þ3î4övõýÿíàúä>ö(ö)ö)ö;öùÿõ}öðñ4<Çèñ4@²3ä «3ò4¼Sáò4 ¥3ä—3 ò4ìò4 ’3ä ¼j30ò4€" ä ø3@ò4,„ä ø®4Pò4Dñä 8ð.`ò4 Éä @ñ.pò4”å Xñ.€ò4(ûä)4À4àù4,nXö4ò4Àï.,nÌò4ëÈó4äˆÉîäøò4ìâàï.ìó4œ1 ä¼÷.ì@ó4l ä0ó4ì æä\ó4R ä0ó4ðˆ$äxó4ì ât /ˆó4æœó4è4êþð.äô4âï4,nâ0ô4üò4ö<¬ âì{öùÿõýÿí,ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;öùÿõ}ú`ö4Àï.,nœö4ë˜÷4äìÉîäÈö4ìâàï.ìäö4œ1 ä¼÷.ì÷4l å÷4ì æä,÷4R å÷4ðˆ$äH÷4ì ât /X÷4æl÷4è4ÿêð.äè÷4âÈó4,nãø4ü`ö4ö<¬ âì{öùÿõýÿí,ä(öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}öØÿ4,Àÿ4ðù4Àï.,,ú4âîØú4䤯îäXú4ìâàï.ä·åtú4œ1 ä¼÷.ì ú4l äú4ì æä¼ú4R äú4ðˆ$äÈHìð.ä(û4â˜÷4,0â@û4üðù4ö<¬ âì{öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõýÿíÌoä(ö*öýÿíl ä)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿíÌä(ö)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öÈÿ4<Œ4Ðÿ4 ‰4ä)ð~485h» °5èÿ4Àï.h» $5ë 5äLÇîäP5ìâàï.ìl5œ1 ä¼÷.ì˜5l äˆ5ì æä´5R äˆ5ðˆ$äÐ5ì ât /à5æô5è4êþð.äp5âØú4h» âˆ5üèÿ4ö<¬ âì{öùÿõýÿíL¢ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;öùÿõ}ú¸5Àï.h» ô5ëð5ä´Çîä 5ìâàï.ì<5œ1 ä¼÷.ìh5l äX5ì æä„5R äX5ðˆ$ä 5ì ât /°5æÄ5è4ÿêð.ä@5â 5h» âX5ü¸5ö<¬ âì{öùÿõýÿí„&ä(öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}ö%45„&¸ 5H5Àï.„&„5ë05äPÈîä°5ìâàï.ìÌ5œ1 ä¼÷.ìø5l äè5ì æä5R äè5ðˆ$äÈHìð.ä€5âð5„&,â˜5üH5ö<¬ âì{öùÿõýÿí—äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí—ä&öýÿí,Rä=öýÿíL´ä;öùÿõýÿí„&ä(öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}ö$5À 5Àï.„&ü 5âî¨ 5ä\Ìîä( 5ìâàï.ä¸åD 5œ1 ä¼÷.ìp 5l ä` 5ì æäŒ 5R ä` 5ðˆ$ä|Gìð.äø 5â05„&µâ5üÀ 5öœö âì{öùÿõùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí@)å>öýÿí¼ß ä(ö)ö)öùÿõùÿõPõýÿíà0 ä(öüÿí5â)ö;öùÿõùÿõ;õ(öýÿí@)ålõýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿí Éä=öÿÿô;öùÿõ@õ(öýÿíDZäýÿíP&å=öÿÿô;öýÿíP&å<öýÿí@)å;öpõýÿíP&å,öpõýÿíl ä)öùÿõýÿíÌoä(ö*öýÿíl ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí4à äýÿí; ä=öýÿí”å;öùÿõýÿíDZäýÿí˜3ä=öýÿíè”ä(öýÿí@)å)ö;öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿí˜3ä)ö;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíŒíä)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíôâ ä(öýÿíDñä.öýÿíä)ö)ö;öùÿõýÿí Éä=öÿÿô;öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ@õ(öýÿíDZäýÿíP&å=öÿÿô;öýÿíP&å<öýÿí@)å;öpõýÿíP&å,öpõýÿíl ä)öùÿõýÿíÌoä(ö*öýÿíl ä)ö;öùÿõ}öùÿõ}ö"vector::assign length error,5ÔU4ä)üF4,'5h X#5D5Àï.h €5ë˜ 5äôÌîä¬5ìâàï.ìÈ5œ1 ä¼÷.ìä5ä¡äHü.ì 5l å 5ì æä, 5R å 5ðˆ$äH 5ì ât /X 5æl 5è4êþð.äè 5⨠5h ã!5üD5ö<¬ âì{öùÿõýÿíÐàä(öýÿíä¡ä,öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;öùÿõ}ú`#5Àï.h œ#5ë´$5ä0ØîäÈ#5ìâàï.ìä#5œ1 ä¼÷.í$5ä¡äHü.ì,$5l ä$5ì æäH$5R ä$5ðˆ$äd$5ì ât /t$5æˆ$5è4ÿêð.ä%5☠5h â%5ü`#5ö<¬ âì{öùÿõýÿípCä(öýÿíä¡ä,öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;öùÿõ}ö% F5pCø,5<'5Àï.pCx'5ë@(5äÜØîä¤'5ìâàï.ìÀ'5œ1 ä¼÷.ìÜ'5ä¡äHü.ì(5l äø'5ì æä$(5R äø'5ðˆ$äÈHìð.ä(5â´$5pC.â¨(5ü<'5ö<¬ âì{öùÿõýÿí—äýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿíHƒå(ö)ö)ö;öùÿõ!õýÿí—ä&öýÿí,Rä=öýÿíL´ä;öùÿõýÿípCä(öýÿíä¡ä,öýÿí,Rä.öýÿíHý ä(ö)ö,öýÿí,Rä.öýÿí<: ä(ö)ö,öýÿí@Rä(ö)ö)ö;öùÿõ}öF5á-5Àï.pC<-5âî.5ätÙîäh-5ìâàï.ä¹å„-5œ1 ä¼÷.ì -5ä¡äHü.ìÌ-5l ä¼-5ì æäè-5R ä¼-5ðˆ$ä|Gìð.äT.5â@(5pCûâl.5ý-5öœö âì{öùÿõýÿíDZäýÿí@)å=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõ;õ(öýÿí@)åjõÿÿô)öùÿõDõ;öùÿõýÿíDZäýÿí,ýä=öýÿí¼ß ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿí,ýähõýÿí Éä>öýÿí,ýä-öýÿí@)å)öùÿõùÿõPõýÿíà0 ä(öüÿíôE5â)ö;öùÿõùÿõùÿõ;õ(öýÿí Éä+öýÿí@)å>öýÿíÔÎä(ö)ö)öùÿõ{öùÿõýÿíDZäýÿíø]ä=öýÿí Éä+öýÿí@)å;öùÿõýÿíDZäýÿí˜3ä=öýÿíDñä.öýÿíä;öùÿõ;õ(öýÿí˜3äjõÿÿô)öùÿõýÿí˜3ä=öÿÿìæ;öùÿõ>õ(öýÿíø]ä>öýÿí˜3ä)öùÿõ;õ(öýÿí˜3ä<öýÿí,ýä/öÿÿìæ)öùÿõýÿí˜3ä^õÿÿìæ;öùÿõ<õùÿõýÿí˜3ä=öýÿí,ýä;öùÿõýÿí4à äýÿí; ä=öýÿí”å;öùÿõýÿí”å=öýÿíDñä.öýÿí¤vä(öýÿíôâ ä(öýÿí˜3ä)ö)ö;öùÿõ;õ(öýÿí; äkõÿÿô)öùÿõ{öùÿõýÿíDZäýÿíŒíä=öýÿíôâ ä(öýÿíDñä.öýÿíä)ö;öùÿõvõýÿ픀ävõýÿíTmä(öýÿí; ä,öýÿí; ä+öýÿíŒíä,öýÿí”å)ö;öùÿõýÿíDñä.öýÿí”j ä(öýÿí; ä,öýÿíŒíä)ö;öùÿõ}öùÿõýÿíDñä.öýÿíä=öýÿí˜3ä;öùÿõ}öùÿõýÿíDZäýÿí(ä=öýÿíDZä(öýÿí<: ä(ö)ö-öýÿíä¡ä)ö;öùÿõ;õ(öýÿí(ä>öÿÿô)öùÿõýÿíöýÿí<0å.öýÿí”Sä;ö}öpp5øän5æo5æ¸ø âho5ä0o5ì€âLo5Ì/åìI5î<0åìI5ê{öDõýÿíÌ/å.öýÿí”Sämõýÿí<0å.öýÿí”Sä;ö}ö r5ø˜p5æÈp5æø âq5ääp5äHï.ä€ãq5@)å î2ðì¿äìI5ê{öDõýÿíhëä(öýÿíì¿ä)öaõýÿí@)å;ö}ö4r5ø|O5æ\r5ø”O5æ„r5ø$H5æü¬r5æàï.ðHùôr5dúäìr5ˆÖ.â s5`/s5,Ö.ä¨î.$s52s5ìç.ä èã.4s5DÝäPá.Ls5¤¸Ds5ß.ä $Ú.\s5Tä|×.äè:åàÖ.ä˜s5ì€âˆÖ.âºå´s5œ1 åØ.ð ©Ðs5üs5ì4ÿê â t5æ ìäHt5ä8ýä€â0Õ.ìtt5œ1 ädt5ì â0Õ.è ©t5Õ.ì4ÿîÄt5xÕ.`/u5âHÿæ¨î.æä4u5ä8ýäã0Õ.ìPu5èdt5ølu5ê â0Õ. ä"äv524v5Œu5xÕ.2Ðu5Hÿæìç.æäüu5älu5ä€â0Õ.ìv5œ1 ädt5ðÌ/ålu5îõ(öýÿíÌ/åkõýÿí4$äiõ(öýÿíÌ/åjõÿÿôhõýÿíÌ/årõýÿíäÝä(ö)öjõýÿí´Åä)ö)öùÿõ{öùÿõ;õ(öýÿíè ä)öùÿõ{öùÿõýÿí<^ä*öýÿí/å=öýÿí z ärõýÿí Då;öùÿõ;õ(öýÿí/årõýÿíäÝä(ö)öjõýÿí\qä)öùÿõ{öùÿõýÿí/årõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí z ärõýÿíÈä(öýÿí\qä)ö;öùÿõýÿí¨Òä(öýÿí z ä,öýÿí4$ä)ö;öùÿõýÿí/å=öýÿí z ärõýÿí Då;öùÿõ}öùÿõ;õ(ö(öýÿí/årõýÿíÌŽäjõÿÿôhõýÿí/årõýÿíÌŽärõýÿíäÝä(ö)öjõýÿí´Åä)öiõùÿõ(öýÿí/årõýÿí Dåjõÿÿôhõýÿí/årõýÿí DårõýÿíäÝä(ö)öjõýÿí´Åä)ö)öùÿõ{öùÿõýÿí/årõýÿíÈä(öýÿí\qä)ö;öùÿõýÿíÌ/å=öýÿí z ä;öùÿõýÿí z ä=öýÿíÌ/årõýÿí¤ä;öùÿõýÿíè ä=öýÿíÌ/åjõýÿí z ärõýÿíÌŽä;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí/årõýÿí Dåjõÿÿôhõýÿí/årõýÿí DårõýÿíäÝä(ö)öjõýÿí´Åä)öùÿõ{öùÿõýÿí/årõýÿíÌŽärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí/årõýÿíÈä(öýÿí\qä)ö;öùÿõýÿíx| ä(öýÿí/å,öýÿí4$ä)ö;öùÿõýÿí/å=öýÿí z ärõýÿí Då;öùÿõ}öùÿõýÿí/årõýÿíÈä(öýÿí z ärõýÿíäÝä(ö)ö)ö;öùÿõýÿí z ärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí/årõýÿí DårõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí¨Òä(öýÿí z ä,öýÿí4$ä)ö;öùÿõýÿíÌ/å=öýÿí4$ä;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí<^ä*öýÿí/å=öýÿí z ärõýÿíÌŽä;öùÿõ;õ(öýÿí/årõýÿíäÝä(ö)öjõýÿí\qä)öùÿõ{öùÿõýÿí/årõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí z ärõýÿíÈä(öýÿí\qä)ö;öùÿõýÿíx| ä(öýÿí z ä,öýÿí4$ä)ö;öùÿõýÿí/å=öýÿí z ärõýÿíÌŽä;öùÿõ}öùÿõ;õ(ö(öýÿí/årõýÿíÌŽäjõÿÿôhõýÿí/årõýÿíÌŽärõýÿíäÝä(ö)öjõýÿí´Åä)öiõùÿõ(öýÿí/årõýÿí Dåjõÿÿôhõýÿí/årõýÿí DårõýÿíäÝä(ö)öjõýÿí´Åä)ö)öùÿõ{öùÿõýÿí/årõýÿíÈä(öýÿí\qä)ö;öùÿõýÿíÌ/å=öýÿí z ä;öùÿõýÿí z ä=öýÿíÌ/årõýÿí¤ä;öùÿõýÿíè ä=öýÿíÌ/åjõýÿí z ärõýÿíÌŽä;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí/årõýÿíÌŽäjõÿÿôhõýÿí/årõýÿíÌŽärõýÿíäÝä(ö)öjõýÿí´Åä)öùÿõ{öùÿõýÿí/årõýÿí DårõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí/årõýÿíÈä(öýÿí\qä)ö;öùÿõýÿí¨Òä(öýÿí/å,öýÿí4$ä)ö;öùÿõýÿí/å=öýÿí z ärõýÿíÌŽä;öùÿõ}öùÿõýÿí/årõýÿíÈä(öýÿí z ärõýÿíäÝä(ö)ö)ö;öùÿõýÿí z ärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí/årõýÿíÌŽärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿíx| ä(öýÿí z ä,öýÿí4$ä)ö;öùÿõýÿíÌ/å=öýÿí4$ä;öùÿõ}öùÿõ}öùÿõ}öùÿõ;õ(öýÿíÌ/åkõÿÿô)öùÿõýÿíÌ/årõýÿíÈä(öýÿí´Åä)ö;öùÿõ}öùÿõ}ö ¼ 6<í5Tí5îSáôí5ö¼"äëõ(öýÿíÌ/åkõýÿí4$äiõýÿíÌ/årõýÿí¤ärõýÿíäÝä(ö)öjõýÿí\qä)öùÿõ{öùÿõ;õ(öýÿíÌ/årõýÿí¤äjõýÿíÌ/årõýÿí¤ärõýÿí¤ärõýÿíÌŽä)öùÿõ{öùÿõýÿí<^ä*öýÿí<0å=öýÿíÌ/årõýÿí¤ärõýÿí¤ärõýÿí Då;öùÿõ;õ(öýÿí<0åkõÿÿôiõýÿí<0årõýÿíäÝä(ö)öjõýÿí\qä)öùÿõ{öùÿõýÿíÌ/årõýÿí¤ärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí<0årõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ärõýÿí¤ä;öùÿõýÿíÌ/årõýÿíÈä(öýÿí\qä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿíÌ/åjõýÿíÌ/årõýÿí¤ärõýÿí Då)öùÿõ{öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ä;öùÿõýÿí¨Òä(öýÿíÌ/å,öýÿí4$ä)ö;öùÿõ}öùÿõýÿíÌ/årõýÿí¤ärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿíÌ/årõýÿí¤ärõýÿí¤ärõýÿíÈä(öýÿí\qä)ö;öùÿõýÿíx| ä(öýÿíÌ/årõýÿí¤ärõýÿí¤ä,öýÿí4$ä)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí<^ä*öýÿí<0å=öýÿíÌ/årõýÿí¤ärõýÿí¤ärõýÿíÌŽä;öùÿõ;õ(öýÿí<0åkõÿÿôiõýÿí<0årõýÿíäÝä(ö)öjõýÿí\qä)öùÿõ{öùÿõýÿíÌ/årõýÿí¤ärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿí<0årõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ärõýÿí¤ä;öùÿõýÿíÌ/årõýÿíÈä(öýÿí\qä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿíÌ/åjõýÿíÌ/årõýÿí¤ärõýÿíÌŽä)öùÿõ{öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ä;öùÿõýÿíx| ä(öýÿíÌ/å,öýÿí4$ä)ö;öùÿõ}öùÿõýÿíÌ/årõýÿí¤ärõýÿíÈä(öýÿí´Åä)ö;öùÿõýÿíÌ/årõýÿí¤ärõýÿí¤ärõýÿíÈä(öýÿí\qä)ö;öùÿõýÿí¨Òä(öýÿíÌ/årõýÿí¤ärõýÿí¤ä,öýÿí4$ä)ö;öùÿõ}öùÿõ}öùÿõ}öùÿõýÿí4$ärõýÿíÈä(öýÿí´Åä)ö;öùÿõ}ö „6ð 66î5âŒ6ö¼"äëõ(öýÿíÌ/åjõýÿíÌ/årõýÿí¤ärõýÿíÌŽä)öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ä;öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ä;öùÿõ}öùÿõ}ö L6¸6Ð6î5âT6ö¼"äëõ(öýÿíÌ/åkõýÿíÌ/årõýÿí¤ärõýÿíÌŽä)öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ä;öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí¤ä;öùÿõ}öùÿõ}ö D6€6˜6îâ6ö¼"äëõ(öýÿíÌ/årõýÿí Dåkõÿÿô)öùÿõýÿíÌ/å=öýÿíÌ/årõýÿí Då;öùÿõDõýÿíÌ/å;öùÿõ}úx66îâ6ö¼"äëõ(öýÿíÌ/årõýÿíÌŽäkõÿÿô)öùÿõýÿíÌ/å=öýÿíÌ/årõýÿíÌŽä;öùÿõDõýÿíÌ/å;öùÿõ}öd6ø<}5æŒ6ø¬{5è´6øp‚5èÜ6ø6æ 6ø˜6æ, 6øÐ6æT 6ø6æ| 6øTí5æ¤ 6ø ž5æÌ 6ø\“5æü{5æ !6Pä!6\z5â$!6(îä!6<}5â4!6´Åä T}5D!6\qä l}5\!6<^äT!6¬{5ât!6Ô[äl!6p‚5â„!6€3ä 6”!6äOä ˜6¤!6üWä Ð6´!6t¨ä 6Ä!6è:ä Tí5Ô!6„Íä ž5ä!6¨Òä\“5äx| ä {5 "6<^ä"6¬{5â"6 Då |5,"6¤ä |5<"6`/ä ày5L"6äÝäØ~5äÈäŒ|5äˆ"6ì€â¬{5âÃå¤"6œ1 ä}5ìì"6´¸À"6œ{5ì4ÿê4#6|à #6œ{5ì4ÿî |M P#6œ{5ì4ÿêä¨#6ä8ýä€â`Ô.ìÔ#6œ1 äÄ#6ì â`Ô.ä$6´¸ð#6Õ.ì4ÿêd$6|à 8$6Õ.ì4ÿî |M €$6Õ.ì4ÿî´$6¨Ô.`/ð$6ÿèä%6ìã`Ô.ì8%6èÄ#6øT%6ê â`Ô. å&6äÝät%6¨Ô.äݸ%6HÿæØ~5æää%6äàÓ.䀀â`Ô.ðœ1 äÄ#6ê¸&6Èä&6¨Ô.ÈT&6HÿæŒ|5æä€&6ì€â`Ô.ìœ&6œ1 äÄ#6ðT#åàÓ.ð2äÈ&6¨Ô.2'6ÿèä0'6äT%6äã`Ô.ìL'6èÄ#6øT%6î„5ì”'6Ô[äŒ'6„5â0(6€3ä¤'6Ó.€3è'6Hÿæ6æä(6äÕ.ä€âHÓ.èæÌ/åÕ.ìÌ(6äOä@(6Ó.äO„(6Hÿæ˜6æä°(6äÕ.ä€âHÓ.èæÌ/åÕ.ìx)6üWäÜ(6Ó.üW )6âHÿæÐ6æäL)6ì€âHÓ.èæÌ/åh)6ê âÕ. ä*6t¨äˆ)6Ó.t¨Ì)6âHÿæ6æäø)6ì€âHÓ.èæÌ/åh)6êÌ*6è:ä$*6Ó.è:h*6âHÿæTí5æä”*6ì€âHÓ.èâ°*6Ì/åÕ.ð4$äÕ.ì„+6„ÍäÜ*6Ó.„Í +6âHÿæ ž5æäL+6ì€âHÓ.èâh+6l0åÕ.ð4$äÕ.ì<,6¨Òä”+6Ó.¨ÒØ+6âHÿæ\“5æä,6ì€âHÓ.èâ ,6Ì/åÕ.ð4$äh)6ìô,6x| äL,6Ó.x| ,6âHÿæ{5æä¼,6ì€âHÓ.èâØ,6Ì/åÕ.ð4$äh)6ð2ä-6Ó.2@-6ÿèä|-6äl-6äãHÓ.ì âHÓ. ä¨-6è˜-6ì âHÓ.ðl-6ñØ-6è4êþ0.6ÐAä.6 .6æ ì\.6H¶ä@.6L.6æ äæˆ.6¤] äl.6x.6æ äæÄ.6ŒÍä˜.6¤.6æ â ´.6ŒÍ äç/6`“äÔ.6à.6æ â ð.6`“ äæ6ø=6ü56È4>6ÿèä`>6ä=6ä€â¤56âÕéœ1 äd86ð„>6ü56ÈÀ>6ÿèäì>6ä¤56ä€â¤56âÖå?6œ1 äd86ðˆ$ô@?6Ä”ä4?6$:6êè:åP?6åè:á$:6ì0âë\@6ä„96îâ´?6ò:öýÿíè:å(öýÿí@)å)ö{ö}ö@B6ä„>6îâ@6ò{öýÿíèøäýÿí`Tä(ö*öOõ)ö;öqõ(ö*öOõ)ö;öDõýÿí`Tä;ö}ö D6äø=6îâtB6ò{öýÿít¨ä(ö(ö!õýÿí<^ä*ö&ö)öýÿíè:å)ö;öDõ*öOõ;ö}öðE6äH=6îâ@D6ò{öýÿíèøäýÿí`Tä(ö*öOõ)ö;öpõ(ö*öOõ)ö;öDõýÿí`Tä;ö}ö¼G6ä¬<6îâ$F6ò{öýÿíüWä(ö(ö!õýÿí<^ä*ö&ö)öýÿíè:å)ö;öDõ*öOõ;ö}ö°H6ä<6îâðG6ò{öDõ&öýÿíè:årõýÿí”å;ö}öŒI6ä„;6îâäH6ò{öDõýÿíè:årõýÿí”å;ö}ö˜J6ä|86î âÀI6ò:öýÿíè:å(öýÿíP&å.öýÿíè:å)ö{ö}þà76îâÌJ6ò{ö}ö$K6øD66æLK6ø`66ætK6ø|66æœK6ø 76æÄK6øà76æìK6ø|86æL6ø„;6æ6æN6øM6æ4M6æ5ø âˆM6äPM6ì€âlM6Ì/å=6î<0å=6ê{öDõýÿíÌ/å.öýÿíè:åjõýÿí<0å.öýÿíè:å;ö}öDP6ø¸N6æèN6æ`4ø âövõýÿíôâ ä(öýÿíÌ/å.öýÿí Éä)ö,öýÿí<0å.öýÿí”å)ö;öùÿõ}öh&50z6âî”q6ä¼ÙîäLz6ìâÀz6Ì/åhz6ê âxz6 ä â ,ó0ˆz6œz6ôâ°z6è ð<0åÜz6ê âìz6 ä â ,ó0üz6{6ôâ°z6ì,{6ôÒ.`/h{6âÿèä”{6ì€âœÒ.âÞå°{6œ1 äV6ðÌ/åÌ{6ê âœÒ. äp|6ì.äì{6ôÒ.ì.(|6ÿèäT|6ì €âœÒ.âßéœ1 äV6ì }62ä€|6ôÒ.2¼|6âÿèäè|6äÌ{6ä€âœÒ. âàå}6œ1 äV6ðÌ/åÌ{6ê´}6Hƒå 0}6ôÒ.Hƒál}6ÿèä˜}6äP;6䀀âœÒ. âáéœ1 äV6êÔ~6Hý H~6Ä}6ôÒ.Hý á~6ÿèä,~6äØQ6ä€âœÒ. ââéœ1 äV6ðP~6ôÒ.Hý Œ~6ÿèä¸~6äDR6䀀âœÒ. âãéœ1 äV6ê"ô6<: h6ä~6ôÒ.<: 6ÿèäL6äØQ6ä€âœÒ. âäéœ1 äV6ðp6ôÒ.<: ¬6ÿèäØ6äDR6䀀âœÒ.âåéœ1 äV6ê"6|) ˆ€6€6ôÒ.|) @€6ÿèäl€6äU6ä€âœÒ.âæéœ1 äV6ð€6ôÒ.|) Ì€6ÿèäø€6äPU6䀀âœÒ.âçéœ1 äV6ê"4‚6<Þ¨6$6ôÒ.<Þ`6ÿèäŒ6äU6ä€âœÒ.âèéœ1 äV6ð°6ôÒ.<Þì6ÿèä‚6äPU6䀀âœÒ.âééœ1 äV6êÈ‚6ÔO äD‚6ôÒ.ÔO €‚6ÿè䬂6쀀âœÒ.âêéœ1 äV6ê\ƒ6èê 䨂6ôÒ.èê ƒ6ÿèä@ƒ6ä/6䀀âœÒ.âëéœ1 äV6êðƒ6¼ß älƒ6ôÒ.¼ß ¨ƒ6ÿèäÔƒ6ä/6䀀âœÒ.âìéœ1 äV6ꈕ6¸Nå„6ôÒ.¸N<„6âîЄ6äÀèîäx„6äh„6äâœÒ.äå â .6 䔄6œ1 äV6ð oå°„6ê âÀ„6 ä æäÎÒ.ä …6â„X6¸N­âP…6ý„6ò8…64ãð?áì{öùÿõýÿíÌ×ä*öýÿ툹 ä=öÿÿô;öùÿõýÿíÌ×ä*öýÿíð*å=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõýÿíÌ×ä*öýÿí@)å=öýÿí4$ä(ö)ö;öùÿõõýÿíôå=öZõ;öùÿõõýÿíŒJ ä=öZõ;öùÿõ>õ(öýÿí@)åkõÿÿô)öùÿõ{öùÿõýÿíð*å=öýÿí@)å;öùÿõ;õ(öýÿíhä(ö)ö(öýÿí oå,öýÿí@)årõýÿí”å)ö)öùÿõ{öùÿõýÿí@)å=ö(öýÿíÌ×ä*ö)öýÿí@)årõýÿíÌŽä;öùÿõýÿíôå=öZõ;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿ툹 ä=öýÿíð*å;öùÿõýÿí@)å=ö(öýÿíÌ×ä*ö)öýÿí@)årõýÿí Då;öùÿõýÿíôå=ö[õ;öùÿõýÿíŒJ ä=ö[õ;öùÿõ}öùÿõ}öùÿõ;õ(öýÿ툹 äjõÿÿôhõýÿíhä(ö)ö(öýÿ툹 ärõýÿí”å,öýÿí oå)ö)öùÿõDõýÿíx ä(öýÿíð*å,öýÿíôå,öýÿíŒJ ä,öýÿíÐAä(öýÿí oå,öýÿí?å(ö)ö)ö)örõýÿí”å;öùÿõDõýÿ툹 ärõýÿí”å;öùÿõ}öŒ›6dnp–6˜•6ôÒ.dnÔ•6âÿèä8–6å–6ä€âœÒ.âíå â ôs–6$–6äØQ6ìîT–6œ1 äV6ðÌ/åh„6ê4—6x–6ôÒ.dn´–6âÿèäà–6äØQ6ä€âœÒ.âïåü–6œ1 äV6ì—6ä¡äØQ6ðÌ/åh„6êø—6<—6ôÒ.dnx—6ÿè䤗6äDR6ä€âœÒ.âðåÀ—6œ1 äV6ìÜ—6ä¡äDR6ðÌ/åh„6ï˜6ôÒ.dn<˜6î̘6ä´éîäh˜6ìâœÒ.ä儘6œ1 äV6ì°˜6l ä ˜6ì æèR ä ˜6ìÎÒ.ä™6âЄ6dnâ4™6ý˜6ö<¬ âì{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõýÿídnä(öýÿí<: ä(ö)ö,ö*öýÿíl ä)ö;öùÿõ}öX¡6 $<œ6œ›6ôÒ. $Ø›6âÿèäœ6äØQ6ä€âœÒ.âîå œ6œ1 äV6ðÌ/åh„6ë6Dœ6ôÒ. $€œ6âÿè䬜6äØQ6ä€âœÒ.âñåÈœ6œ1 äV6ìäœ6ä¡äØQ6ðÌ/åh„6êÄ66ôÒ. $D6ÿèäp6äDR6ä€âœÒ.âòåŒ6œ1 äV6ì¨6ä¡äDR6ðÌ/åh„6îÌ6ôÒ. $ž66ä8êîä4ž6ìâœÒ.äåPž6œ1 äV6ì|ž6l älž6ì æèR älž6ìÎÒ.äèž6â̘6 $ãŸ6üÌ6ö<¬ âì{öùÿõ@õ(ö;öýÿíl äkõýÿíR ä;öpõýÿíl ä)öùÿõýÿí $ä(öýÿí<: ä(ö)ö,ö*öýÿíl ä)ö;öùÿõ}ö8¤6<Ç¢6h¡6ôÒ.<Ǥ¡6âÿèäС6ì€âœÒ.âóåì¡6œ1 äV6ðä¡äØQ6ì°¢6¢6ôÒ.<ÇL¢6ÿèäx¢6ì€âœÒ.âô唢6œ1 äV6ðä¡äDR6ìt£6¸¢6ôÒ.<Çô¢6ÿèä £6ì€âœÒ.âõå<£6œ1 äV6ìX£6l äØQ6ðR äØQ6ð|£6ôÒ.<Ǹ£6ÿèää£6ì€âœÒ.âöæ¤6œ1 äV6ì¤6l äDR6ðR äDR6츨6Ü‚äH¤6ôÒ.Ü‚„¤6âî¥6äèåîä°¤6ä/6äâœÒ.äå̤6œ1 äV6ðÌ/åè¤6ê âø¤6 ä æäÎÒ.äX¥6☞6Ü‚#âp¥6üH¤6ö4ãì{öùÿõýÿíLäýÿíP&å=öýÿí°Ú ä(öýÿíÌ/å)ö;öùÿõ;õ(öýÿíP&åjõýÿí<: ä(ö)ö)öùÿõDõÿÿô;öùÿõýÿí<Çä(öýÿíP&å)ö;öùÿõDõÿÿìæ;öùÿõ}÷¯6Ð7äȨ6ôÒ.Ð7©6â6äŒæîä0©6ä/6äâœÒ.äåL©6œ1 äV6ðÌ/åh©6ê âx©6 ä æäÎÒ.䨩6â¥6Ð76âð©6üȨ6ö4ãì{öùÿõýÿíøó ä<öýÿíLä,öýÿíLä>öýÿíP&å=öýÿíõä(öýÿíÌ/å)ö;öùÿõýÿíDZäýÿíˆõä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíP&å.öýÿíl ä,öýÿíP&å.öýÿí ä)ö;öùÿõýÿí<Çä(öýÿíP&å.öýÿíl ä,öýÿíP&å.öýÿí ä)ö;öùÿõDõýÿíˆõä;öùÿõ}ö°¯6¼Sä¯6ôÒ.¼SL¯6âÿèäx¯6ì€âœÒ. â÷唯6œ1 äV6ðÌ/åÌ{6ìD°6€" äÀ¯6ôÒ.€" ü¯6âÿèä(°6ì€âœÒ.!âøéœ1 äV6ìذ6ð‚äT°6ôÒ.ð‚°6ÿèä¼°6äL.6䀀âœÒ."âùéœ1 äV6ê¨À6°Ú ˜½6è°6ôÒ.°Ú $±6â6äçîäP±6äØQ6äâœÒ.äål±6œ1 äV6ðÌ/刱6ê ☱6 ä æäÎÒ.äø±6∩6°Ú {â²6üè°6ö4ãì{öùÿõýÿíÌ×ä*öýÿíP&å=öýÿí4$ä(ö)ö;öùÿõýÿíÌ×ä*öýÿí'å=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ>õ(öýÿíP&åkõÿÿô)öùÿõ{öùÿõ;õ(ö!öýÿíhä(ö)ö(öýÿíP&årõýÿí”å,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿí'å=öýÿíP&å;öùÿõýÿíP&å=ö(öýÿíÌ×ä*ö)öýÿíP&årõýÿíÌŽä;öùÿõ}öùÿõ<õùÿõýÿíP&å=ö(öýÿíÌ×ä*ö)öýÿíP&årõýÿí Då;öùÿõ}öùÿõ;õ(öýÿí'åjõ(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)öhõýÿíhä(ö)ö(öýÿíÌ/å,öýÿí'årõýÿí”å)ö)öùÿõDõýÿí<: ä(ö)ö;öùÿõDõýÿíä.ä(öýÿí'å)ö;öùÿõ}ú ½6ôÒ.°Ú ܽ6î`¾6äÜçîä¾6äDR6ä€âœÒ.äå$¾6œ1 äV6îÌ/å@¾6ê âP¾6 ä æäÎÒ.ä°¾6⨱6°Ú âȾ6ü ½6ö4ãì{öùÿõDõTõ<öýÿíè ä&ö>ö(ö*öOõ)ö.öýÿí°Ú ä(öýÿíÌ/å)ö;öùÿõ}öÀÃ6˜Üä¸À6ôÒ.˜ÜôÀ6îxÁ6ätìîä Á6ä/6ä€âœÒ.äå<Á6œ1 äV6îÌ/åXÁ6ê âhÁ6 ä æäÎÒ.äÈÁ6â`¾6˜ÜâàÁ6ü¸À6ö4ãì{öùÿõDõýÿíDZä(ö!ö(öýÿí°Ú ä(öýÿíÌ/å)öjõýÿí<: ä(ö)ö)ö)ö;öùÿõ}öXÈ6X äÐÃ6ôÒ.X Ä6îÄ6ä@íîä8Ä6ä/6ä€âœÒ.äåTÄ6œ1 äV6îÌ/åpÄ6ê â€Ä6 ä æäÎÒ.äàÄ6âxÁ6X $âøÄ6üÐÃ6ö4ãì{öùÿõýÿíøó ä<öýÿíDÅ ä,öýÿíDÅ ä>öýÿíP&å=öýÿíõä(öýÿíÌ/å)ö;öùÿõDõ(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíP&å.öýÿíl ä,öýÿíP&å.öýÿí ä)ö;öùÿõ}ö@Õ6ÀW0Ò6hÈ6ôÒ.ÀW¤È6âî(É6ä8V îäÐÈ6äØQ6äâœÒ.äåìÈ6œ1 äV6ðÌ/åÉ6ê âÉ6 ä æäÎÒ.äxÉ6âÄ6ÀW\âÉ6ühÈ6ö4ãì{öùÿõýÿíÌ×ä*öýÿíP&å=öýÿí4$ä(ö)ö;öùÿõýÿíÌ×ä*öýÿí'å=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ>õ(öýÿíP&åkõÿÿô)öùÿõ{öùÿõ;õ(ö!öýÿíhä(ö)ö(öýÿíP&årõýÿí”å,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿí'å=öýÿíP&å;öùÿõýÿíP&å=ö(öýÿíÌ×ä*ö)öýÿíP&årõýÿíÌŽä;öùÿõ}öùÿõ<õùÿõýÿíP&å=ö(öýÿíÌ×ä*ö)öýÿíP&årõýÿí Då;öùÿõ}öùÿõDõýÿíä.ä(öýÿí'å)ö;öùÿõ}ú8Ò6ôÒ.ÀWtÒ6îøÒ6ä@U îä Ò6äDR6ä€âœÒ.äå¼Ò6œ1 äV6îÌ/åØÒ6ê âèÒ6 ä æäÎÒ.äHÓ6â(É6ÀWâ`Ó6ü8Ò6ö4ãì{öùÿõDõTõ<öýÿíè ä&ö>ö(ö*öOõ)ö.öýÿíÀWä(öýÿíÌ/å)ö;öùÿõ}öâ6˜ áß6PÕ6ôÒ.˜ ŒÕ6âîÖ6äÌV îä¸Õ6äØQ6äâœÒ.äåÔÕ6œ1 äV6ðÌ/åðÕ6ê ãÖ6 ä æäÎÒ.ä`Ö6âøÒ6˜ [âxÖ6üPÕ6ö4ãì{öùÿõýÿíÌ×ä*öýÿíP&å=öýÿí4$ä(ö)ö;öùÿõýÿíÌ×ä*öýÿí'å=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ>õ(öýÿíP&åkõÿÿô)öùÿõ{öùÿõ;õ(öýÿíhä(ö)ö(öýÿíÌ/å,öýÿíP&årõýÿí”å)ö)öùÿõ{öùÿõýÿí'å=öýÿíP&å;öùÿõýÿíP&å=ö(öýÿíÌ×ä*ö)öýÿíP&årõýÿíÌŽä;öùÿõ}öùÿõ<õùÿõýÿíP&å=ö(öýÿíÌ×ä*ö)öýÿíP&årõýÿí Då;öùÿõ}öùÿõDõýÿíä.ä(öýÿí'å)ö;öùÿõ}úß6ôÒ.˜ Dß6îÈß6älV îäpß6äDR6ä€âœÒ.äåŒß6œ1 äV6îÌ/å¨ß6ê â¸ß6 ä æäÎÒ.äà6âÖ6˜ â0à6üß6ö4ãì{öùÿõDõTõ<öýÿíè ä&ö>ö(ö*öOõ)ö.öýÿí˜ ä(öýÿíÌ/å)ö;öùÿõ}ö"Hè6õ0å6 â6ôÒ.õ\â6îã6äÜS îäÀâ6äˆâ6äâœÒ.äå â ôs˜â6¬â6äØQ6ìâØQ6èÜâ6œ1 äV6ðÌ/åøâ6ê âã6 ä æäÎÒ.ähã6âÈß6õâ€ã6ü â6ö4ãì{öùÿõDõýÿí˜ ä(öýÿíÀWä(öýÿíÌ/å)ö,öýÿí˜ ä(öýÿíÌ/å)ö)ö;öùÿõ}ú8å6ôÒ.õtå6î0æ6äS îäØå6ä å6ä€âœÒ.äå â ôs°å6Äå6äDR6ìâDR6èôå6œ1 äV6îÌ/åæ6ê â æ6 ä æäÎÒ.䀿6âã6õâ˜æ6ü8å6ö4ãì{öùÿõDõýÿí˜ ä(öýÿíÀWä(öýÿíÌ/å)ö,öýÿí˜ ä(öýÿíÌ/å)ö)ö;öùÿõ}öÜè6,„äXè6ôÒ.,„”è6âÿèäÀè6쀀âœÒ.#âúéœ1 äV6êìé6Dñäìè6á <é6Dñé6è â ؘé6(é6äP;6ìâ/6èá Œé6LÜTé6è â ؘdé6xé6ä ;6ìâ„5èå<ò ¤é6è â ؘ´é6Èé6äL.6ìâÜé6è â@06æüé6LÜä <é6 ê6<ò ä&Œé6<ë6(© °ê6ê6ôÒ.(© Xê6ÿèä”ê6ä„ê6ä€âœÒ.'âûå âP;6 èœ1 äV6ð¸ê6ôÒ.(© ôê6ÿèä ë6ä„ê6 âœÒ.(âüéœ1 äV6ê"lì6à#àë6Lë6ôÒ.à#ˆë6ÿèäÄë6ä´ë6ä€âœÒ.)âýå â/6 èœ1 äV6ðèë6ôÒ.à#$ì6ÿèäPì6ä´ë6 âœÒ.*âþéœ1 äV6ê"œí6ˆÏí6|ì6ôÒ.ˆÏ¸ì6ÿèäôì6ääì6ä€âœÒ.+âÿå â ;6 èœ1 äV6ðí6ôÒ.ˆÏTí6ÿèä€í6ääì6 âœÒ.,ãéœ1 äV6ê"¼î6L* 0î6¬í6ôÒ.L* èí6ÿèäî6äX†5ä€âœÒ.-âéœ1 äV6ð8î6ôÒ.L* tî6ÿèä î6äX†5 âœÒ..âéœ1 äV6ê"ìï6h`ï6Ìî6ôÒ.hï6ÿèäDï6ä4ï6ä€âœÒ./âå âL.6 èœ1 äV6ðhï6ôÒ.h¤ï6ÿèäÐï6ä4ï6 âœÒ.0âéœ1 äV6ê"ñ6üÉð6üï6ôÒ.üÉ8ð6ÿèätð6ädð6ä€âœÒ.1âå âÜé6 èœ1 äV6ð˜ð6ôÒ.üÉÔð6ÿèåñ6äÜé6䀀âœÒ.2âéœ1 äV6êÌñ6Zä,ñ6ôÒ.Zhñ6âÿèä”ñ6쀀âœÒ.3âå°ñ6œ1 äV6îÌ/åÕ.ì"ìò64$`ò6Üñ6ôÒ.4$ò6ÿèäDò6äÜé6䀀âœÒ.4âéœ1 äV6îhò6ôÒ.4$¤ò6ÿèäÐò6ädð6ä€âœÒ.5â éœ1 äV6ìœó6$òäüò6ôÒ.$ò8ó6âÿèädó6ì€âœÒ.6â å€ó6œ1 äV6ðð*åÜé6ìLô6Tmä¬ó6ôÒ.Tmèó6âÿèäô6äÜé6ä€âœÒ.7â å0ô6œ1 äV6ðÌ/åÜé6îx ä\ô6ôÒ.x ˜ô6âÿèäÄô6äÜé6ä€âœÒ.8â åàô6œ1 äV6ìüô6ð*åÜé6ìõ6ôõ4õ6ŒJ øÌ/åh„6îHÓ.èâ|õ6>ñ”õ6ÜN ò ’ î (ÿ6àõ6,ñ6î`â(ö6òøõ6>ñö6ÜN ò ’ î{öùÿõ õýÿí¼2 ä=öýÿíÌ/årõýÿíÌŽäjõÿÿô?öÿÿìæ:öýÿíZä(öýÿíÌ/årõýÿíÌŽä)ö;öùÿõ;õ(öýÿí¼2 ä<öÿÿô)öùÿõDõ-öÿÿìæ;öùÿõ õýÿíZä=öýÿíÌ/årõýÿí Dåjõÿÿô?öÿÿìæ:öýÿíZä(öýÿíÌ/årõýÿí Då)ö;öùÿõ;õ(öýÿíZä<öÿÿô)öùÿõDõ-öÿÿìæ;öùÿõ;õ(öýÿí¼2 äkõýÿíZä)öùÿõDõ-öÿÿìæ;öùÿõ;õ(öýÿíÌ/årõýÿíäÝä(ö)öjõýÿí´Åä)öùÿõpõýÿí¼2 ä;öùÿõDõýÿí¼2 ä;öùÿõ}ö 7\ÿ6Üñ6îâ¤ÿ6òtÿ6>ñŒÿ6ÜN ò ’ î{öùÿõDõ(öýÿíÌ×ä*ö)öýÿíL* ä(ö)ö.öýÿíÌŽä;öùÿõ}ö 7@7hò6îâˆ7òX7>ñp7ÜN ò ’ î{öùÿõDõ(öýÿíÌ×ä*ö&ö)öýÿíL* ä(ö)ö.öýÿíÌŽä;öùÿõ}ö <7<7¬ó6îÝâ„7òT7>ñl7ÜN ò ’ î{öùÿõýÿíÌ×ä*öýÿíˆõä=öýÿíˆÏä(ö)ö.öýÿí¤vä(öÿÿìæ)ö;öùÿõýÿíˆõärõýÿíÌŽä=öýÿíˆõärõýÿí Då=öÿÿô;öùÿõùÿõQõùÿõ{öùÿõùÿõ;õ(öýÿíÌ/årõýÿíÌŽäkõÿÿô)öùÿõ{öùÿõýÿíˆõärõýÿíÌŽä=öýÿíTmä(ö(öýÿíÌ×ä*ö)ö(öýÿíÌ/årõýÿíÌŽä)ö)ö;öùÿõýÿíˆõärõýÿíÌŽärõýÿí¤ä=öýÿíˆõä;öùÿõ}öùÿõ;õ(öýÿíÌ/årõýÿí Dåkõÿÿô)öùÿõ{öùÿõýÿíˆõärõýÿí Då=öýÿíTmä(ö(öýÿíÌ×ä*ö)ö(öýÿíÌ/årõýÿí Då)ö)ö;öùÿõýÿíˆõärõýÿí Dårõýÿí¤ä=öýÿíˆõä;öùÿõ}öùÿõýÿí(© ä(ö)ö.öýÿíxå(ö&öýÿíˆõärõýÿí”å,öýÿíÌ/årõýÿí”å)ö;öùÿõýÿíˆõärõýÿíÈä(öýÿíÌ/årõýÿíäÝä(ö)ö)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõ;õ(öýÿíˆõärõýÿíÌŽäkõÿÿô)öùÿõýÿí$òä(ö(öýÿíÌ×ä*ö)ö(öýÿíˆõärõýÿíÌŽä)ö)ö;öùÿõ;õ(öýÿíˆõärõýÿí Dåkõÿÿô)öùÿõýÿí$òä(ö(öýÿíÌ×ä*ö)ö(öýÿíˆõärõýÿí Då)ö)ö;öùÿõýÿíˆÏä(ö)ö.öýÿí”j ä(öýÿíˆõä,öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõDõýÿíˆõä;öùÿõ}ö À7p7üò6îKâ¸7òˆ7>ñ 7ÜN ò ’ î{öùÿõ;õ(öýÿíð*årõýÿíÌŽäkõÿÿô)öùÿõýÿí$òä(ö(öýÿíÌ×ä*ö)ö(öýÿíð*årõýÿíÌŽä)ö)ö;öùÿõ;õ(öýÿíð*årõýÿí Dåkõÿÿô)öùÿõýÿí$òä(ö(öýÿíÌ×ä*ö)ö(öýÿíð*årõýÿí Då)ö)ö;öùÿõùÿõýÿí(© ä(ö)ö.öýÿí$òä(ö&öýÿíð*årõýÿí”å)ö;öùÿõýÿíˆÏä(ö)ö.öýÿí”j ä(öýÿíð*å,öÿÿìæ)ö;öùÿõ}ö !7ô7T°6î â< 7ò 7>ñ$ 7ÜN ò ’ î{öùÿõDõýÿíhä(ö)ö;öùÿõ}ö p&7H!7À¯6î4â!7ò`!7>ñx!7ÜN ò ’ î{öùÿõ;õ(öýÿí4$ä(ö)ökõÿÿô)öùÿõ{öùÿõýÿí$òä(öýÿí4$ä(ö)ö)ö;öùÿõýÿíà#ä(ö)ö=öÿÿô;öùÿõýÿí4$ä(ö)ö=öÿÿô;öùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ}öùÿõ}ö l47¤&7¯6îâì&7ò¼&7>ñÔ&7ÜN ò ’ î{öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõ{öùÿõýÿíT¾ävõýÿí¼Sä(öýÿíDñä,öýÿíÌ/å.öýÿíDñä)ö;öùÿõýÿíT¾ävõýÿí¼Sä(öýÿíLÜä,öýÿíÌ/å.öýÿíLÜä)ö;öùÿõýÿíT¾ävõýÿí¼Sä(öýÿí<ò ä,öýÿíÌ/å.öýÿí<ò ä)ö;öùÿõ;õ(öýÿí4$ä(ö)ökõÿÿô)öùÿõýÿí4$ä(ö)örõýÿí¤ä=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ<õùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ;õ(öýÿíÌ/å.öýÿí4$ä(ö)ökõÿÿô)öùÿõýÿíÌ/å.öýÿí4$ä(ö)örõýÿí¤ä=ö(öýÿíÌ×ä*ö)ö&öýÿíÌ/å.öýÿíL* ä(ö)ö;öùÿõ<õùÿõýÿíÌ/å.öýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíÌ/å.öýÿíL* ä(ö)ö;öùÿõùÿõ}öùÿõ}ö €67 47¸¢6îâè47ò¸47>ñÐ47ÜN ò ’ î{öùÿõ>õ(öýÿíl äkõýÿíR ä)öùÿõýÿí<Çä(öýÿíl äpõ)ö;öùÿõ}ö ì=7´67h¡6îJâü67òÌ67>ñä67ÜN ò ’ î{öùÿõýÿíÌ×ä*öýÿíl0å=öýÿíäýä(öýÿíä¡ä)ö;öùÿõ;õ(öýÿíä¡äjõýÿíHý ä(ö)ö)öùÿõýÿíüÉä(ö)ö=öýÿíäýä(öpõýÿíä¡ä)ö;öùÿõýÿí„Íä(öýÿíl0å,öýÿí4$ä(ö)ö)ö;öùÿõýÿí(© ä(ö)ö.öýÿí$òä(ö&öýÿíl0årõýÿí”å)ö;öùÿõýÿíˆÏä(ö)ö.öýÿí”j ä(öýÿíl0å,öÿÿìæ)ö;öùÿõqõýÿíà#ä(ö)ö;öùÿõ}ö lM7 >7\ô6îŸâh>7ò8>7>ñP>7ÜN ò ’ î{öùÿõ;õ(öýÿíèê ä(ö)ö>öýÿí¼ß ä(ö)ö-öÿÿìæ)öùÿõùÿõPõýÿíà0 ä(öüÿíPM7â)ö;öùÿõùÿõýÿíÌ×ä*öýÿí@)å=öýÿíˆÏä(ö)ö.öýÿí¤vä(öÿÿìæ)ö;öùÿõùÿõQõùÿõ{öùÿõùÿõýÿí(© ä(ö)ö.öýÿíxå(ö&öýÿí@)årõýÿí”å,öýÿíÌ/å)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿíˆÏä(ö)ö.öýÿí”j ä(öýÿí@)å,öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõýÿí@)årõýÿíÌŽä=öýÿí@)årõýÿí Då=öÿÿô;öùÿõýÿí@)årõýÿí¤ä=öýÿíð*å;öùÿõ;õ(öýÿíôå)öùÿõýÿíð*årõýÿíÌŽä=öýÿí@)å;öùÿõ<õùÿõýÿíð*årõýÿí Då=öýÿí@)å;öùÿõpõýÿíà#ä(ö)ö;öùÿõýÿíè:ä(öýÿí@)å,öýÿí4$ä(ö)ö)ö;öùÿõ;õ(öýÿíŒJ ä)öùÿõýÿíüÉä(ö)ö=öýÿí@)å;öùÿõDõýÿí@)å;öùÿõ}ötree::insert length errorâ c7 M7Dœ6îçâèM7ò¸M7>ñÐM7ÜN ò ’ î{öùÿõýÿíÌ×ä*öýÿí”/ä;öùÿõýÿíÌ×ä*öýÿíd1ä;öùÿõõýÿíLå=ö[õ;öùÿõ;õ(öýÿíä¡äjõýÿí<: ä(ö)öhõ!öýÿíhä(ö)ö(ö*öýÿíä¡ä,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿíLäýÿíðŒä=öýÿíä¡ä;öùÿõ;õ(öýÿíðŒäkõýÿíHý ä(ö)öiõýÿíhä(ö)ö(öýÿíÌ/å,ö*öqõýÿíðŒä)ö)öùÿõ{öùÿõýÿíðŒä=öýÿíä¡ä=öýÿí˜ ä(öýÿíÌ/å)ö;öùÿõ;õ(öýÿíðŒäkõýÿíHý ä(ö)ö)öùÿõqõýÿíðŒä;öùÿõ}öùÿõýÿí”/ä=öýÿíäýä(öýÿíðŒä)ö;öùÿõýÿíd1ä=öýÿíäýä(öýÿíä¡ä)ö;öùÿõýÿíLå=öýÿíä¡äjõýÿíHý ä(ö)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíLäýÿíT¥ ä=öýÿíä¡ä;öùÿõpõýÿíT¥ ä;öùÿõ;õ(öýÿíT¥ äkõýÿí<: ä(ö)öiõýÿíhä(ö)ö(ö*öýÿíT¥ ä,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿíT¥ ä=öýÿíä¡ä=öýÿíÀWä(öýÿíÌ/å)ö;öùÿõqõýÿíä¡ä;öùÿõ}öùÿõýÿí”/ä=öýÿíäýä(öýÿíä¡ä)ö;öùÿõýÿíd1ä=öýÿíäýä(öýÿíT¥ ä)ö;öùÿõ}öùÿõ;õ(öýÿíd1ärõýÿíÌŽäjõÿÿô)öùÿõDõýÿíä.ä(öýÿíx ä(öýÿíd1ä,öZõ,öýÿíLå,öýÿíÌ/å)ö)ö;öùÿõDõýÿíä.ä(öýÿíx ä(öýÿí”/ä,ö[õ,ö[õ,öýÿíÌ/å)ö)ö;öùÿõ}ö L{7Äc7x–6îøâ d7òÜc7>ñôc7ÜN ò ’ î{öùÿõ;õ(öýÿíä¡äjõýÿí<: ä(ö)öhõýÿíhä(ö)ö(öýÿíÌ/å,ö*öýÿíä¡ä)ö)öùÿõ{öùÿõýÿíLäýÿíðŒä=öýÿíä¡ä;öùÿõ;õ(öýÿíðŒäjõýÿíHý ä(ö)öhõýÿíhä(ö)ö(ö*öqõýÿíðŒä,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿíÌ×ä*öýÿí”/ä=öýÿíäýä(öýÿíðŒä)ö;öùÿõýÿíÌ×ä*öýÿíd1ä=öýÿíäýä(öýÿíä¡ä)ö;öùÿõ;õ(öýÿíd1ärõýÿíÌŽäjõÿÿô)öùÿõDõýÿíä.ä(öýÿíx ä(öýÿíd1ä,öZõ,öýÿíä¡äjõýÿíHý ä(ö)ö,öýÿíÌ/å)ö)ö;öùÿõDõýÿíä.ä(öýÿíx ä(öýÿí”/ä,ö[õ,ö[õ,öýÿíÌ/å)ö)ö;öùÿõ}öùÿõ}öùÿõ<õ;õ(öýÿíhä(ö)ö(ö*öýÿíä¡ä,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿíLäýÿíT¥ ä=öýÿíä¡ä;öùÿõpõýÿíT¥ ä;öùÿõ;õ(öýÿíT¥ äjõýÿí<: ä(ö)öhõýÿíhä(ö)ö(öýÿíÌ/å,ö*öýÿíT¥ ä)ö)öùÿõ{öùÿõýÿíÌ×ä*öýÿí”/ä=öýÿíäýä(öýÿíä¡ä)ö;öùÿõýÿíÌ×ä*öýÿíd1ä=öýÿíäýä(öýÿíT¥ ä)ö;öùÿõ;õ(öýÿí”/ärõýÿí Dåjõÿÿô)öùÿõDõýÿíä.ä(öýÿíx ä(öýÿí”/ä,ö[õ,ö[õ,öýÿíÌ/å)ö)ö;öùÿõDõýÿíä.ä(öýÿíx ä(öýÿíd1ä,öZõ,ö[õ,öýÿíÌ/å)ö)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõDõýÿíä¡ä;öùÿõDõýÿídnä(öýÿíÌ/å)ö.öýÿíl ä;öùÿõ}ö ˆ7€{7œ›6îƒâÈ{7ò˜{7>ñ°{7ÜN ò ’ î{öùÿõýÿíÌ×ä*öýÿíð*å=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõýÿíÌ×ä*öýÿí@)å=öýÿí4$ä(ö)ö;öùÿõõýÿíôå=öZõ;öùÿõõýÿíŒJ ä=öZõ;öùÿõ>õ(öýÿí@)åkõÿÿô)öùÿõ{öùÿõýÿíð*å=öýÿí@)å;öùÿõ;õ(öýÿíhä(ö)ö(öýÿíÌ/å,öýÿí@)årõýÿí”å)ö)öùÿõ{öùÿõýÿí@)å=ö(öýÿíÌ×ä*ö)öýÿí@)årõýÿíÌŽä;öùÿõýÿíôå=öZõ;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí@)å=ö(öýÿíÌ×ä*ö)öýÿí@)årõýÿí Då;öùÿõýÿíôå=ö[õ;öùÿõýÿíŒJ ä=ö[õ;öùÿõ}öùÿõ}öùÿõDõýÿíä.ä(öýÿíx ä(öýÿíð*å,öýÿíôå,öýÿíŒJ ä,öýÿíÌ/å)ö)ö;öùÿõ}ö ›7Dˆ7˜•6îÅ⌈7ò\ˆ7>ñtˆ7ÜN ò ’ î{öùÿõýÿíÌ×ä*öýÿ툹 ä=öÿÿô;öùÿõýÿíÌ×ä*öýÿíð*å=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõýÿíÌ×ä*öýÿí@)å=öýÿí4$ä(ö)ö;öùÿõõýÿíôå=öZõ;öùÿõõýÿíŒJ ä=öZõ;öùÿõ>õ(öýÿí@)åkõÿÿô)öùÿõ{öùÿõýÿíð*å=öýÿí@)å;öùÿõ;õ(öýÿíhä(ö)ö(öýÿíÌ/å,öýÿí@)årõýÿí”å)ö)öùÿõ{öùÿõýÿí@)å=ö(öýÿíÌ×ä*ö)öýÿí@)årõýÿíÌŽä;öùÿõýÿíôå=öZõ;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿ툹 ä=öýÿíð*å;öùÿõýÿí@)å=ö(öýÿíÌ×ä*ö)öýÿí@)årõýÿí Då;öùÿõýÿíôå=ö[õ;öùÿõýÿíŒJ ä=ö[õ;öùÿõ}öùÿõ}öùÿõ;õ(öýÿ툹 äjõÿÿôhõýÿíhä(ö)ö(öýÿ툹 ärõýÿí”å,öýÿíÌ/å)ö)öùÿõ{öùÿõýÿí@)å=öýÿíx ä(öýÿíð*å,öýÿíôå,öýÿíŒJ ä,öýÿíÌ/å)ö;öùÿõDõýÿíøó ä<öýÿíLä,öõ>ö(öýÿíä.ä(öýÿí@)å)ö,öZõ)ö;öùÿõ}öùÿõDõýÿíøó ä<öýÿíLä,öõ>ö(öýÿíä.ä(öýÿ툹 ä)ö,ö[õ)ö;öùÿõ}ö М78›7lƒ6î‛7òP›7>ñh›7ÜN ò ’ î{öùÿõDõýÿíhää<öýÿíDZä>övõýÿíl„ ä(ö)ö;öùÿõ}ö $ž77Ø‚6î âL7ò7>ñ47ÜN ò ’ î{öùÿõDõýÿíà#ä(ö)ö;öùÿõ}ö ¨Ÿ7Xž7D‚6î â ž7òpž7>ñˆž7ÜN ò ’ î{öùÿõDõýÿíà#ä(ö)öjõÿÿô;öùÿõ}ö D¡7ÜŸ7°6î â$ 7òôŸ7>ñ  7ÜN ò ’ î{öùÿõDõýÿíää(öýÿíHý ä(ö)ö)ö;öùÿõ}ö à¢7x¡7$6î âÀ¡7ò¡7>ñ¨¡7ÜN ò ’ î{öùÿõDõýÿíL¸ ä(öýÿíHý ä(ö)ö)ö;öùÿõ}ö |¤7£7€6î â\£7ò,£7>ñD£7ÜN ò ’ î{öùÿõDõýÿíää(öýÿí<: ä(ö)ö)ö;öùÿõ}ö ¦7°¤7€6î âø¤7òȤ7>ñà¤7ÜN ò ’ î{öùÿõDõýÿíL¸ ä(öýÿí<: ä(ö)ö)ö;öùÿõ}ö D¨7L¦7p6î┦7òd¦7>ñ|¦7ÜN ò ’ î{öùÿõDõýÿíä.ä(ö(ö!õýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö)ö;öùÿõ}ö Xª7x¨7ä~6îâÀ¨7ò¨7>ñ¨¨7ÜN ò ’ î{öùÿõDõýÿíä.ä(ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö)ö;öùÿõ}ö ô«7Œª7P~6î âÔª7ò¤ª7>ñ¼ª7ÜN ò ’ î{öùÿõDõýÿíä.ä(öýÿíüÉä(ö)ö)ö;öùÿõ}ö ­7(¬7Ä}6î âp¬7ò@¬7>ñX¬7ÜN ò ’ î{öùÿõDõýÿíä.ä(öýÿíüÉä(ö)ö)ö;öùÿõ}ö ä®7Ä­70}6î â ®7òÜ­7>ñô­7ÜN ò ’ î{öùÿõDõýÿí(© ä(ö)ö;öùÿõ}ö ð»7¯7€|6î†â`¯7ò0¯7>ñH¯7ÜN ò ’ î{öùÿõ;õ(öOõjõ&öýÿíÌ/å)öùÿõDõ*öOõ;öùÿõýÿí€" ä(ö)ö;öùÿõ;õ(öýÿíÌ/å.öýÿí4$ä(ö)ökõÿÿô)öùÿõ{öùÿõýÿí4$ä(ö)ö=öýÿíTmä(öýÿíÌ/å.öýÿí4$ä(ö)ö)ö;öùÿõýÿí4$ä(ö)örõýÿí¤ä=ö(öýÿí<^ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ}öùÿõýÿíà#ä(ö)ö=öýÿíÌ/å.öýÿíà#ä(ö)ö;öùÿõýÿíhä(ö)ö=öýÿíÌ/å.öýÿíhä(ö)ö;öùÿõ;õ(öýÿí4$ä(ö)ökõÿÿô)öùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)öýÿí€3ä(öýÿí4$ä(ö)ö)ö;öùÿõ<õùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõDõ*öOõ;öùÿõ}ö L¾7$¼7ì{6îâl¼7ò<¼7>ñT¼7ÜN ò ’ î{öùÿõ;õ(öýÿí4$ä(ö)ökõÿÿô)öùÿõýÿí$òä(öýÿí4$ä(ö)ö)ö;öùÿõ}ö ˆÈ7€¾7,{6îhâȾ7ò˜¾7>ñ°¾7ÜN ò ’ î:öýÿíDñä(öýÿíÌ/å.öýÿíDñä)ö,öùÿõýÿíLÜä(öýÿíÌ/å.öýÿíLÜä)ö,öùÿõýÿí<ò ä(öýÿíÌ/å.öýÿí<ò ä)öùÿõ{öùÿõ;õ(öýÿíÌ/å.öýÿí4$ä(ö)ökõÿÿô)öùÿõ{öùÿõýÿí4$ä(ö)ö=öýÿíTmä(öýÿíÌ/å.öýÿí4$ä(ö)ö)ö;öùÿõýÿí4$ä(ö)örõýÿí¤ä=ö(öýÿí<^ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)öýÿí€3ä(öýÿí4$ä(ö)ö)ö;öùÿõ}öùÿõ<õùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ}ö ÜÌ7¼È7 V6î)âÉ7òÔÈ7>ñìÈ7ÜN ò ’ î:öýÿíDñä(öýÿí0"å,öÿÿô)ö,öùÿõùÿõùÿõýÿíLÜä(öýÿí0"å)ö,öùÿõùÿõùÿõýÿí<ò ä(öýÿíhä)öùÿõ{öùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ}ö €Ï7Í7„U6îâXÍ7ò(Í7>ñ@Í7ÜN ò ’ î:öýÿíDñä(öÿÿô)öùÿõ{öùÿõýÿíüÉä(ö)ö=ö(öýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö;öùÿõ}ö ä7´Ï7Xè6îÖâüÏ7òÌÏ7>ñäÏ7ÜN ò ’ î{öùÿõ;õ(öýÿíà#ä(ö)ökõýÿí|Ôä(öýÿíHý ä(ö)ö,öýÿí<: ä(ö)ö)ö)öùÿõDõ[õ;öùÿõ;õ(öýÿíà#ä(ö)ökõýÿí|Ôä(öýÿí|) ä(ö)ö,öýÿí<Þä(ö)ö)ö)öùÿõDõ[õ;öùÿõùÿõ;õ(ö(öýÿíä¶ ä)ö&öýÿíL* ä(ö)ö&öÿÿìæ)öùÿõDõ[õ;öùÿõùÿõ;õ(öýÿíà#ä(ö)öjõÿÿô)öùÿõ{öùÿõ;õ(öýÿí4$ä(ö)ökõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿíüÉä(ö)ökõ(ö!õýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö)öùÿõDõ[õ;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí4$ä(ö)öjõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿí4$ä(ö)örõýÿíäÝä(ö)ökõýÿí´Åä)öùÿõDõ[õ;öùÿõ;õ(öýÿí4$ä(ö)örõýÿí¤äkõ(ö!õýÿíÌ×ä*ö)ö&öýÿíL* ä(ö)ö)öùÿõDõ[õ;öùÿõ;õ(öýÿíüÉä(ö)ökõ(öýÿíÌ×ä*ö)öýÿí€3ä(öýÿí4$ä(ö)ö)ö)öùÿõDõ[õ;öùÿõ;õ(öýÿíZä(öýÿí4$ä(ö)ö)ö<öÿÿô)öùÿõDõ[õ;öùÿõ}öùÿõDõZõ;öùÿõ}öå7ä˜ð6î â@ä7ò{öDõýÿí<ò ä.öýÿí ä(ö)ö;ö}ö$æ7äüï6î âLå7ò{öDõýÿí<ò ä.öýÿí ä(ö)ö;ö}ö0ç7ähï6î âXæ7ò{öDõýÿí<ò ä.öýÿíl ä(ö)ö;ö}ö<è7äÌî6î âdç7ò{öDõýÿí<ò ä.öýÿíl ä(ö)ö;ö}öHé7ä8î6î âpè7ò{öDõýÿíLÜä.öýÿí ä(ö)ö;ö}öTê7ä¬í6î â|é7ò{öDõýÿíLÜä.öýÿí ä(ö)ö;ö}ö`ë7äí6î âˆê7ò{öDõýÿíLÜä.öýÿíl ä(ö)ö;ö}ölì7ä|ì6î â”ë7ò{öDõýÿíLÜä.öýÿíl ä(ö)ö;ö}öxí7äèë6î â ì7ò{öDõýÿíDñä.öýÿí ä(ö)ö;ö}ö„î7äLë6î â¬í7ò{öDõýÿíDñä.öýÿí ä(ö)ö;ö}öï7ä¸ê6î â¸î7ò{öDõýÿíDñä.öýÿíl ä(ö)ö;ö}öœð7äê6î âÄï7ò{öDõýÿíDñä.öýÿíl ä(ö)ö;ö}÷ô7ä|£6î"âÐð7ò{öýÿí<Çä(öýÿíä.ä(öTõ<öýÿíÄ”ä>ö(öýÿíäýä(öýÿíl ä)ö)ö)ö,öùÿõýÿíä.ä(öTõ<öýÿíÄ”ä>ö(öýÿíäýä(öýÿíR ä)ö)ö)ö)ö;ö}öüõ7ä¢6îâ4ô7ò{öýÿí<Çä(öýÿíä.ä(öTõ<öýÿíÄ”ä>ö(öýÿíäýä(öýÿíä¡ä)ö)ö)ö)ö;ö}ö@ø7ä6îâ0ö7ò{öDõýÿí $ä(öýÿíä.ä(öTõ<öýÿíÄ”ä>ö(öýÿíäýä(öýÿíä¡ä)ö)ö)ö,öýÿíÌ/å)ö;ö}ö„ú7ä<—6îâtø7ò{öDõýÿídnä(öýÿíä.ä(öTõ<öýÿíÄ”ä>ö(öýÿíäýä(öýÿíä¡ä)ö)ö)ö,öýÿíÌ/å)ö;ö}öxû7äpT6îâ¸ú7ò{öDõýÿíDÅ ä(öýÿíð*å)ö;ö}ölü7ääS6îâ¬û7ò{öDõýÿíLä(öýÿíð*å)ö;ö}öHý7ä@S6îâ ü7ò{öDõýÿíP&å.öýÿíè:å;ö}þ¤R6îâ|ý7ò{öDõýÿíP&å.öýÿíè:å;ö}öLþ7ø.6ætþ7ø@.6æœþ7øl.6æÄþ7ø˜.6æìþ7øÔ.6æÿ7ø/6æ<ÿ7øL/6ædÿ7øˆ/6æŒÿ7øÄ/6æ´ÿ7ø@06èÜÿ7ø26æ8ø€26æ,8ù36æT8øˆ36è|8ø¤56è$8ø¤8æÔ8ðHù â¤56ä8æø8è4ÿêÌ8øL8æ|8ðHù â¤56Œ8æ 8è4êþô8øÌQ6æ8ø8R6æD8ø¤R6æl8ø@S6æ”8øäS6æ¼8øpT6æä8øU6æ 8øDU6æ48ø„U6æ\8ø V6æ„8ø,{6æ¬8øì{6æÔ8ø€|6æü8ø0}6æ$8øÄ}6æL8øP~6æt8øä~6æœ8øp6æÄ8ø€6æì8ø€6æ8ø$6æ<8ø°6æd8øD‚6æŒ8øØ‚6æ´8ølƒ6æÜ8ø˜•6æ8øœ›6æ,8øx–6æT8ø<—6æ|8øDœ6æ¤8ø6æÌ8øh¡6æô8ø¢6æ8ø¸¢6æD8ø|£6æl8ø¯6æ”8øÀ¯6æ¼8øT°6æä8øXè6æ 8øìè6æ48ø<é6æ\8øŒé6æ„8øê6æ¬8ø¸ê6æÔ8øLë6æü8øèë6æ$ 8ø|ì6æL 8øí6æt 8ø¬í6æœ 8ø8î6æÄ 8øÌî6æì 8øhï6æ 8øüï6æ< 8ø˜ð6æd 8ø,ñ6æŒ 8øÜñ6æ´ 8øhò6æÜ 8øüò6æ 8ø¬ó6æü\ô6æ@ 8ä8Â.èT 8â@Æ.ìâ Ä.èà 8Läx 8„ 8æ â ” 8L â œÒ.¤ 8¸ 8ä8Â.èÌ 8â@Æ.ìâ Ä.èX 8DÅ äð 8ü 8æ â  8DÅ â œÒ. 80 8ä8Â.èD 8â@Æ.ìâ Ä.è˜ 8L¸ äh 8t 8æ âÜÀ„ 8è„ 8èØ 8ää¨ 8´ 8æ âÜÀÄ 8èü 8è"X8`/| 8è 8ŒÁ.`/$ 8ÿèäP 8ì€â4Á.â"éœ1 äl 8ì â4Á.äD8„ 8ŒÁ.`/À 8Pÿèäì 8ì€â4Á.â#å8œ1 äl 8ðhä$8ê â48 ä äæH8L8ŒÁ.`/ˆ8ÿèä´8ì€â4Á.â$åÐ8œ1 äl 8ì 8häì8ê âü8 ä äê0"å(8ê â88 ä äæ|8P8ŒÁ.`/Œ8ë8ä T îä¸8ìâ4Á.ìÔ8œ1 äl 8í8l äð8ì æèR äð8ìfÁ.äl8â0æ6`/â„8üP8ö<¬ âì:öýÿíìä(öýÿíl ä,öýÿíR ä,ö[õ,öýÿíH¶ä(ö)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}öô8„8ŒÁ.`/À8ë|8ä$T îäì8ìâ4Á.ì8œ1 äl 8ì48l ä$8ì æäP8R ä$8ðhäl8ê âŒÂ. äfÁ.äÌ8â8`/âä8ü„8ö<¬ âì:öýÿíìä(öýÿíl ä,öýÿíR ä,ö[õ,öýÿíH¶ä(öýÿíhä)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}úü8ŒÁ.`/88ë8ä[ îäd8ìâ4Á.ì€8œ1 äl 8ì¬8l äœ8ì æäÈ8R äœ8ìä8häl8î0"æ8ê â Ä. äfÁ.ä`8â|8`/âx8üü8ö<¬ âì:öýÿíìä(öýÿíl ä,öýÿíR ä,ö[õ,öýÿíH¶ä(öýÿíhä)ö,öýÿí0"å)öùÿõ{öùÿõ}öì8Hƒå h8ŒÁ.Hƒá¤8ÿèäÐ8ä Ä.䀀â4Á.â%éœ1 äl 8ê" 8Hý €8ü8ŒÁ.Hý 88ÿèäd8ä„ 8ä€â4Á.â&éœ1 äl 8ðˆ8ŒÁ.Hý Ä8ÿèäð8äü 8䀀â4Á.â'éœ1 äl 8ê",8<:  88ŒÁ.<: X8ÿèä„8ä„ 8ä€â4Á.â(éœ1 äl 8ð¨8ŒÁ.<: ä8ÿèä8äü 8䀀â4Á.â)éœ1 äl 8ê"L8|) À8<8ŒÁ.|) x8ÿèä¤8ät 8ä€â4Á. â*éœ1 äl 8ðÈ8ŒÁ.|) 8ÿèä08ä´ 8䀀â4Á. â+éœ1 äl 8ê"l8<Þà8\8ŒÁ.<Þ˜8ÿèäÄ8ät 8ä€â4Á. â,éœ1 äl 8ðè8ŒÁ.<Þ$8ÿèäP8ä´ 8䀀â4Á. â-éœ1 äl 8ë8ÔO ä|8ŒÁ.ÔO ¸8ÿèää8쀀â4Á. â.éœ1 äl 8ê”8èê ä8ŒÁ.èê L8ÿèäx8ä\Ã.䀀â4Á.â/éœ1 äl 8ê( 8¼ß ä¤8ŒÁ.¼ß à8ÿèä 8ä\Ã.䀀â4Á.â0éœ1 äl 8êè 8ää8 8ŒÁ.ät 8ÿèä° 8ä  8ä€â4Á.â1å â Â. äÌ 8œ1 äl 8ðÌ/ådÈ.ê"%8ÐàÐ!8ø 8ŒÁ.Ðà4!8ÿèä˜!8ä`!8ä€â4Á.â2å â ôsp!8„!8ä„ 8ìî´!8œ1 äl 8ðÌ/åÇ.ê”"8Ø!8ŒÁ.Ðà"8ÿèä@"8ä„ 8ä€â4Á.â3å\"8œ1 äl 8ìx"8ä¡ä„ 8ðÌ/åÇ.îœ"8ŒÁ.ÐàØ"8ëh#8ä8Z îä#8ìâ4Á.ì #8œ1 äl 8ìL#8l ä<#8ì æèR ä<#8ìfÁ.ä¸#8â8Ðà âÐ#8üœ"8ö<¬ âì{öùÿõýÿíìä.öýÿídnä(öýÿíl ä,öýÿíR ä)ö;öùÿõ}ö"$'8<Ǹ%8%8ŒÁ.<ÇT%8ÿèä€%8ì€â4Á.â4åœ%8œ1 äl 8ðä¡ä„ 8ì`&8À%8ŒÁ.<Çü%8ÿèä(&8ä\Ã.ä€â4Á.â5åD&8œ1 äl 8ðÌ/ådÈ.îh&8ŒÁ.<Ǥ&8ÿèäÐ&8ì€â4Á.â6åì&8œ1 äl 8ì'8l ä„ 8ðR ä„ 8ìä'8¼Sä4'8ŒÁ.¼Sp'8ÿèäœ'8ì€â4Á.â7å¸'8œ1 äl 8ðÌ/åÔ'8ì â4Á. äx(8€" äô'8ŒÁ.€" 0(8ÿèä\(8ì€â4Á.â8éœ1 äl 8ì )8øûå ˆ(8ŒÁ.øûáÄ(8ÿèäð(8äŒÂ.䀀â4Á.â9éœ1 äl 8ê )8ð‚ä)8ŒÁ.ð‚X)8ÿèä„)8ä@Æ.䀀â4Á.â:éœ1 äl 8ê"ø*8°Ú P*8°)8ŒÁ.°Ú ì)8ÿèä*8ä„ 8ä€â4Á.â;å4*8œ1 äl 8ðÌ/ådÈ.îX*8ŒÁ.°Ú ”*8ÿèäÀ*8äü 8䀀â4Á.â<åÜ*8œ1 äl 8îÌ/ådÈ.ê¨+8¬Ï ä+8ŒÁ.¬Ï D+8ÿèäp+8ä\Ã.䀀â4Á.â=åŒ+8œ1 äl 8îÌ/ådÈ.ë!-8ÀWX,8¸+8ŒÁ.ÀWô+8ÿèä ,8ä„ 8ä€â4Á.â>å<,8œ1 äl 8ðÌ/ådÈ.î`,8ŒÁ.ÀWœ,8ÿèäÈ,8äü 8䀀â4Á.â?åä,8œ1 äl 8îÌ/ådÈ.ê"X.8˜ °-8-8ŒÁ.˜ L-8ÿèäx-8ä„ 8ä€â4Á.â@å”-8œ1 äl 8ðÌ/ådÈ.î¸-8ŒÁ.˜ ô-8ÿèä .8äü 8䀀â4Á. âAå<.8œ1 äl 8îÌ/ådÈ.ê" 08õ@/8h.8ŒÁ.õ¤.8ÿèä/8äÐ.8ä€â4Á.!âBå â ôsà.8ô.8ä„ 8ìâ„ 8è$/8œ1 äl 8ðÌ/ådÈ.îH/8ŒÁ.õ„/8ÿèäè/8ä°/8䀀â4Á."âCå â ôsÀ/8Ô/8äü 8ìâü 8è08œ1 äl 8îÌ/ådÈ.ê´08,„ä008ŒÁ.,„l08âÿèä˜08쀀â4Á.#âDéœ1 äl 8îìäÄ08åì 8èô084ñ 18>áîH18ÜN â$18è âD¦'418èàÁ.ì ’ â`18è â¯p18è„18è â ôs”18¨18äàÁ.êâ Â.è H:8ð18008îUâP28ò284ñ 28>áî828ÜN ò ’ î{öùÿõ;õ(öýÿíèê ä(ö)ömõÿÿìæ)öùÿõ{öùÿõýÿíDÅ äýÿíð*å=öýÿíHý ä(ö)ö;öùÿõýÿíDÅ äýÿíP&å=öýÿíð*å;öùÿõýÿíH¶äýÿíT#å=öýÿíð‚ä(ö)ö;öùÿõ@õ(öpõýÿíP&å;öýÿíP&åkõýÿí<: ä(ö)ö;öpõýÿíð*å,öpõýÿíP&å)öùÿõ{öùÿõ;õ(ö!öýÿíT#å(ö*öýÿíð*å,ö*öýÿíP&å)ö)öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõDõýÿíìä.öýÿí,„ä(ö)ö;öùÿõ}ö ,<8|:8H/8îâÜ:8ò”:84ñ¬:8>áîÄ:8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíõä(öýÿíÌ/å)ö;öùÿõùÿõ}ö >8`<8h.8îâÀ<8òx<84ñ<8>áî¨<8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíõä(öýÿíÌ/å)ö;öùÿõùÿõ}ö ô?8D>8¸-8îâ¤>8ò\>84ñt>8>áîŒ>8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí˜ ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö ØA8(@8-8îâˆ@8ò@@84ñX@8>áîp@8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí˜ ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö ¼C8 B8`,8îâlB8ò$B84ñáîTB8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíÀWä(öýÿíÌ/å)ö;öùÿõùÿõ}ö  E8ðC8¸+8îâPD8òD84ñ D8>áî8D8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíÀWä(öýÿíÌ/å)ö;öùÿõùÿõ}ö „G8ÔE8+8îâ4F8òìE84ñF8>áîF8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí˜Üä(öýÿíÌ/å)ö;öùÿõùÿõ}ö hI8¸G8X*8îâH8òÐG84ñèG8>áïH8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí°Ú ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö LK8œI8°)8îâüI8ò´I84ñÌI8>áîäI8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí°Ú ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö èL8€K8)8î âàK8ò˜K84ñ°K8>áîÈK8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíð‚ä(ö)ö;öùÿõ}ö ´N8M8ˆ(8î â|M8ò4M84ñLM8>áîdM8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíð‚ä(ö)ö.öýÿíhä;öùÿõ}ö 8P8èN8ô'8î âHO8óO84ñO8>áî0O8ÜN ò ’ î{öùÿõýÿíìä.öýÿí€" ä(ö)ö;öùÿõ}ö R8lP84'8î âÌP8ò„P84ñœP8>áî´P8ÜN ò ’ î{öùÿõýÿíìä.öýÿí¼Sä(öýÿíÌ/å.öýÿíìä)ö;öùÿõ}ö ÐS88R8h&8î â˜R8òPR84ñhR8>áî€R8ÜN ò ’ î{öùÿõýÿíìä.öýÿí<Çä(öýÿíl ä,öýÿíR ä)ö;öùÿõ}ö ´U8T8À%8îâdT8òT84ñ4T8>áîLT8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíÜ‚ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö PW8èU8%8î âHV8óV84ñV8>áî0V8ÜN ò ’ î{öùÿõýÿíìä.öýÿí<Çä(öýÿíä¡ä)ö;öùÿõ}ö 4Y8„W8Ø!8îâäW8òœW84ñ´W8>áîÌW8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿídnä(öýÿíä¡ä,öýÿíÌ/å)ö;öùÿõ}ö èZ8hY8ø 8î âÈY8ò€Y84ñ˜Y8>áî°Y8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿídnä(öýÿíÌ/å)ö;öùÿõ}ö Œ]8[88 8îâ|[8ò4[84ñL[8>áîd[8ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öNõýÿí¸Nä<öýÿíð© ä,öýÿíÐúä>ö(öýÿíÌ/å)ö.öýÿí ä;öùÿõùÿõ}ö (_8À]8¤8î â ^8òØ]84ñð]8>áî^8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí¼ß ä(ö)ö;öùÿõ}ö Ä`8\_88î â¼_8òt_84ñŒ_8>áî¤_8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíèê ä(ö)ö;öùÿõ}ö `b8ø`8|8î âXa8òa84ñ(a8>áî@a8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíÔO ä(ö)ö;öùÿõ}ö d8”b8è8î âôb8ò¬b84ñÄb8>áîÜb8ÜN ò ’ î{öùÿõDõýÿíää(öýÿíHý ä(ö)ö)ö;öùÿõ}ö Èe8Hd8\8î â¨d8ò`d84ñxd8>áîd8ÜN ò ’ î{öùÿõDõýÿíL¸ ä(öýÿíHý ä(ö)ö)ö;öùÿõ}ö |g8üe8È8î â\f8òf84ñ,f8>áîDf8ÜN ò ’ î{öùÿõDõýÿíää(öýÿí<: ä(ö)ö)ö;öùÿõ}ö 0i8°g8<8î âh8òÈg84ñàg8>áîøg8ÜN ò ’ î{öùÿõDõýÿíL¸ ä(öýÿí<: ä(ö)ö)ö;öùÿõ}ö Ìj8di8¨8î âÄi8ò|i84ñ”i8>áî¬i8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí<: ä(ö)ö;öùÿõ}öhl8ák88î â`k8òk84ñ0k8>áîHk8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí<: ä(ö)ö;öùÿõ}ö n8œl8ˆ8î âül8ò´l84ñÌl8>áîäl8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíHý ä(ö)ö;öùÿõ}ö  o88n8ü8î â˜n8òPn84ñhn8>áî€n8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíHý ä(ö)ö;öùÿõ}ö áîp8ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíHƒå(ö)ö;öùÿõ}ö s8pq8L8îâÐq8òˆq84ñ q8>áî¸q8ÜN ò ’ î:öýÿíìä(öýÿíH¶ä(öýÿíhä)ö,öýÿí0"å)öùÿõ{öùÿõ}ö 4u8Ts8„ 8îâ´s8òls84ñ„s8>áîœs8ÜN ò ’ î:öýÿíìä(öýÿíH¶ä(öýÿíhä)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}úhu8è 8îâÈu8ò€u84ñ˜u8>áî°u8ÜN ò ’ î:öýÿíìä(öýÿíH¶ä(ö)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}öXw8øÔÁ.æ€w8ùÂ.æ¨w8ø,Â.æÐw8ø€Â.æøw8ø¬Â.æ x8øØÂ.æHx8øÃ.æpx8øPÃ.æ˜x8øŒÃ.æÀx8øÈÃ.æèx8øÄ.æy8øHÄ.è8y8ø@Æ.è`y8ø€Ò.æˆy8øx 8æ°y8øð 8æØy8øh 8æáz8ø¨ 8æ(z8øè 8æPz8ø„ 8æxz8øL8æ z8øh8æÈz8øü8æðz8øˆ8æ{8ø8æ@{8ø¨8æh{8ø<8æ{8øÈ8æ¸{8ø\8æà{8øè8æ|8ø|8æ0|8ø8æX|8ø¤8æ€|8ø8 8æ¨|8øø 8æÐ|8øØ!8æø|8ø%8æ }8øÀ%8æH}8øh&8æp}8ø4'8æ˜}8øô'8æÀ}8øˆ(8æè}8ø)8æ~8ø°)8æ8~8øX*8æ`~8ø+8æˆ~8ø¸+8æ°~8ø`,8æØ~8ø-8æá8ø¸-8æ(8øh.8æP8øH/8æx8ø008æüÄ08æäìXä°8TAê 6äÌ8Piê0Zäè8h&0Z$€8äêx€8öä@€8ìá\€8ÿôì€88ççäçæáááxýâÌ/éâá@<0éãá @–áDÛä,8ä2€èX8ü8é „8„8À8ô:â°8ä‚8ü âÀ8æäÜ8ìáø8ÿôh&¬˜ À8äêP‚8öÄ‚8ì‚8ççäçæáááxýâÌ/éná@<0éoá@ âDÛäƒ8ä8é 0ƒ8\ƒ8„e-ô:âte-äØe-ü ¼ƒ8dƒ8éƒ8ü:á ¾änÿáă8éðƒ8ü:ᬨäoý ¨„8$„82€èP„8üé|„8ü:áüµäâÿá°„8éÜ„8ü:ᬨäãÿáh‹ ä…8h&h‹ T…8ÿìäp…8ä¼Rçጅ8è¼Rø¼R긅8l:äT>-ä€äÈ…8h&€†8ÿìä †8ä8ýçá<†8è8ýìX†8è¼RÿêÈT䄆80F⨆8Ì䜆8´ê<丆8h&<ô†8ÿìä‡8ä¼Rçá,‡8ÿä¼Rî€aäX‡8h&€a”‡8äêè‡8öä°‡8ìá̇8ÿô\ˆ8„ˆ8ççäçæáááxýâÌ/éçá@<0éèá @˜áDÛ䜈8ä2€èȈ8ü8é ôˆ8 ‰8À8ô:â°8ä‚8ü ¬‰8(‰82€èT‰8ü选8ü:áp¨äçÿá´‰8éà‰8ü:ᬨäèÿá€>älB-äD…ä,Š8h&D…hŠ8ÿì䄊8ä8ýçá Š8ÿøŒ…äÌŠ8h&Œ…‹8äê@‹8öä$‹8ìáý´‹8È‹8ççäçæáááxýâÌ/éá@²âDÛäà‹8ä2€è Œ8ü8é 8Œ8@—8tŒ8ô:âdŒ8䬌8ü âtŒ8æäŒ8ìáýh&|´tŒ8äääèŒ8ö\8p8ççäçáæáááxýâÌ/é"á Ààáü:äðŽ8âááü:å8äááü:ìæáü:äX8Šâçáü:ää8Šâèáü:äp‘8Šâéáü:äü‘8Šâêáü:䈒8Šâëáü:ä“8Šâìáü:ä “8Šâíáü:ä,”8Šâîáü:且8Šâïáü:äD•8Šâðáü:äЕ8Šâñáü:ä\–8Šâôáü:äè–8äé8Ô8ø8éH8t8á˜-ô:âð—-ä8˜-ÿà|8é¨8ü:á ¾ä"ý5ð°<÷é,8ü:á ¾ä"ÿíðÿ"ááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿä ïÿäóáÿââ|æ@ÿäðÿä æð?ÿñâ{æ@ÿäñÿÿÿÿââ´æ@ÿäñÿÿÿÿââ{æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿä ðÿ"ááÿÿÿ÷â•æ@ôé—8ü:á ¾ä"ÿáH—82€èt—8üé —8ü:áp¨äÿáȆäÜ—8Paç˜8üdäø—8\æ “ ä˜8h& “ L˜8ÿìäh˜8ïí8ýì œ8@\”˜8<Ü'䜘8h&@\ؘ8î,™8öäô˜8äxrää™8è¼Rÿæ ™8ð™8ççäçæáááxÿá$ä å,äöá@|,á¼Râôá@ˆ$èõá@áP`\³äúãïáÌ& äš8äáxrä4š8ü8áå,ä `š8œš8XÒ'ô:⌚8äÒ'ü âXÒ'æ ›8¤š8áå,äК8ü:áüš8äöý âå,æl›8›8¼Rä@›8ü:´Uäôÿát›88á ›8ä °›8ì›8¶ô â\³æ:âÜ›8ä µü â¶êô›8:á ›8äúÿá(\ä Ó-@œ8( äx˜,ä äPœ8áç¹ÿíðÿµááÿÿÿ÷â“æ@ÿä ðÿ¹ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ¹ááÿÿÿ÷âŸå€Àÿäðÿµááÿÿÿ÷â•æ@ôéh9ü:á ¾äµý¬9œ9h&TeØ9î9öäô9ìáý„9˜9ççäçæáááxýâÌ/éCá @á ä°9ä8é Ü9L99ô:â9äP9ü â9æä49ìýh&ܨ9äêŒ9öá 99ççäçæáááxýâÌ/éþá@þâDÛä,9ä2€èX9ü8é „9À94ÿ8ô:â°9äøþ8ü â4ÿ8êÈ92€èô9üé 9ü:áüµäþÿáT9é€9ü:áüµäCý´ 9´9h&Teð9î( 9öä 9ìáýœ 9° 9ççäçæáááxýâÌ/éGá @á äÈ 9ä8é ô 9T 90 9ô:â 9äh 9ü â0 9æäL 9ìýh&ˆ­0 9äê¤ 9ö 9, 9ççäçæáááxýâÌ/éá@ááDÛäD 9ä2€èp 9ü8é œ 9È 94ÿ8ô:â°9äøþ8ÿàÐ 92€èü 9üé( 9ü:áp¨äÿá\ 9éˆ 9ü:áp¨äGý´9¼ 9h&Teø 9î0 9öä 9ìáý¤ 9¸ 9ççäçæáááxýâÌ/é# á @ráTäÐ 9ä8é ü 9(94ÿ8ô:â°9äøþ8ÿà092€è\9üéˆ9ü:ᬨä# ý´9¼9h&Teø9î09öä9ìáý¤9¸9ççäçæáááxýâÌ/é' á @táTäÐ9ä8é ü9(94ÿ8ô:â°9äøþ8ÿà092€è\9üéˆ9ü:á¤*ä' ý´9¼9h&Teø9î09öä9ìáý¤9¸9ççäçæáááxýâÌ/é+ á @váTäÐ9ä8é ü9(94ÿ8ô:â°9äøþ8ÿà092€è\9üéˆ9ü:á¤-ä+ ý´9¼9h&Teø9î09öä9ìáý¤9¸9ççäçæáááxýâÌ/é/ á @xáTäÐ9ä8é ü9(94ÿ8ô:â°9äøþ8ÿà092€è\9üéˆ9ü:áèä/ ý´9¼9h&Teø9î09öä9ìáý¤9¸9ççäçæáááxýâÌ/é3 á @{áTäÐ9ä8é ü9(94ÿ8ô:â°9äøþ8ÿà092€è\9üéˆ9ü:á´-ä3 ÿá¼9h&Teø9î09öä9ìáý¤9¸9ççäçæáááxýâÌ/é7 á @áTäÐ9ä8é ü9(94ÿ8ô:â°9äøþ8ÿà092€è\9üéˆ9ü:áÄ-ä7 ÿáh°äÄ9Ü 'âÜ9üä Ìc%ô9Àeäì9.'æ¬eä9h&¬e@9äêx9öä\9ìáýì9á9ççäçæáááxýâÌ/é€á@ªâDÛä9ä2€èD9ü8é p9œ9Èî8ô:â¸î8åï8ÿà¤92€èÐ9üéü9ü:áp¨ä€ÿáp³ä89h&p³t9ÿìä9ïí¼RîÐäìTäàµäÌ9ÀQâô9”¶ä9´‹%ì9Xƒ%äHs%ä Òä9¸?â9 jä@¡äص ä,9´gæ ôÀ D9@6#ä(*#äÀ—ä\9h&À—˜9ÿìä´9ä8ýçáÐ9è8ýìì9è¼Rÿêt‰ä9h&t‰T9ÿìäp9ä¼Rçí¼Rð |Œœ9¼$ä4è#äHqä´9h&Hqð9ÿìä 9äçá(9èøîh¾ ä(¡ä ¿ d9ö+äHï+ä0žä|9„9âäÜ90žôpä,%9è8L;ähL;èè‘;h&0žä„9äü9/ãá90žä 9„9âxÞ:¼e ä$909æ â @90Þ:ä˜9ttèÈG:èpäls9è¤J:äÔJ:èpÕ:(h&ttä@9ä¸9-ãáÐ9ttäÈ9@9âü9ÐAäà9ì9æ ì( 9¤] ä 9 9æ äæd 9DZä8 9D 9æ â T 9DZ äæ  9`œät 9€ 9æ â  9`œ äæÜ 9ŒÍä° 9¼ 9æ â Ì 9ŒÍ äæ!9`“äì 9ø 9æ â !9`“ äæT!94à ä(!94!9æ â D!94à äæ!9Ìýäd!9p!9æ â €!9Ìý äæD$9Ì×ä !9¨!9âå"9Ì×èH"9èápä@9r9èð`"9˜9Ì×ä¨!9ä "9ãá8"9Ì×ä0"9¨!9æ”åH"9æ”áì9è$9øˆ"9æäà"9<^è(#9èápä¨!9r9èðÌ#9˜9<^äˆ"9å#9ãá#9<^ä#9ˆ"9â¼#9ᇠä(#9â¤#9ᇠ@#9è â P#94à â `#9@î â p#9#9 â €#98* äî¨!9èæ„Í @#9ì„Í ä¤#9ô#9ø(#9æü¤#9æüH"9æ`$9 ‡äT$9P#9æ|$9Ä”äp$9@#9æ”$9<^äŒ$9ˆ"9â%9Xä¤$9°$9æ â À$94à â Ð$9@î âà$9á%9 â ð$98* äîˆ"9è¨D9`Qå$%9,%9âä„%9`Qé19èpäˆ"9r9ä¨19äÀ19è p=9 ˜9`Qå,%9ä¤%9ãá¼%9`Qå´%9,%9âØ%9ÐAäÌ%9ì9æô%9`œäè%9€ 9æ˜&94à ä&9&9æ â  &9 œ â T 0&9p&9ãD&9èIìû„&9âp!9ìâ4!9è<'9ŒÍä¨&9´&9æ â Ä&9 œ â T Ô&9'9ãè&9èIìû('9âø 9ìâ¼ 9èX'9L äL'90Fæ"|-9`/ü'9h'9„%9`/¤'9ÿèäÐ'9ì€â,%9âléœ1 äì'9ì â,%9ä)9(9„%9`/@(9ÿèäl(9ì€â,%9âmåˆ(9œ1 äì'9ðP&å¤(9ê â´(9 ä â,%9Ä(9æØ(9è4ÿêü*9 )9„%9`/H)9Pÿèät)9ì€â,%9 âtå)9œ1 äì'9ð@)å¬)9ì â ¼)9 œ â T Ì)9 *9ãà)9èIìû„*9â *9è â 0*9Ìý â @*9@î â P*9p*9 â `*98* äî¨!9ìâ˜*9è â ¨*94à â ¸*9@î â È*9è*9 â Ø*98* äî¨!9ì+9„%9`/@+9Pÿèäl+9ì€â,%9 âuåˆ+9œ1 äì'9ð@)å¤+9ì â ´+9 œ â T Ä+9,9ãØ+9èIìûÀ,9â,9è â (,9Ìý â 8,9@î â H,9¬,9 â X,98* â h,9@î â x,9˜,9 â ˆ,98* äî¨!9ðˆ"9ìâÔ,9è â ä,94à â ô,9@î â -9h-9 â -98* â $-9@î â 4-9T-9 â D-98* äî¨!9ðˆ"9è.9„äŒ-9„%9„È-9ÿèäô-9ä´&9䀀â,%9ânéœ1 äì'9ê¤.9Tä .9„%9T\.9ÿèäˆ.9ä&9䀀â,%9âoéœ1 äì'9ê"ð/98H/9´.9„%98ð.9ÿèä,/9ä/9ä€â,%9âpå â,%9 èœ1 äì'9ðP/9„%98Œ/9ÿèä¸/9ä,%9ä€â,%9âqåÔ/9œ1 äì'9ðˆ$ô ,19È„09á09„%9È<09ÿèäh09ä/9ä€â,%9âréœ1 äì'9ðŒ09„%9ÈÈ09ÿèäô09ä,%9ä€â,%9âså19œ1 äì'9ðˆ$ôH19Ä”ä<19¬)9æd19@†äX19ä,9æ€19Xät19¤+9êdýä19ådý¬)9ì0âëä29ä+9î âô19ò:öýÿídýä(ö(öýÿíÄ”ä)öýÿí@)å)ö{ö}öÀ39ä )9îâ39ò:öýÿídýä(öýÿí@)å)ö{ö}ö¤59äŒ09îâô39ò{öýÿí`Qåýÿí`Tä(ö*öOõ)ö;öýÿídýä=öýÿídýärõýÿî‡ ä;öDõýÿí`Tä;ö}öø69å09î âØ59ò{öýÿídýä=öýÿídýärõýÿî‡ ä;öDõ*öOõ;ö}öÜ89äP/9îâ,79ò{öýÿí`Qåýÿí`Tä(ö*öOõ)ö;öýÿídýä=öýÿídýärõýÿí„Í ä;öDõýÿí`Tä;ö}ö0:9ä´.9î â99ò{öýÿídýä=öýÿídýärõýÿí„Í ä;öDõ*öOõ;ö}ö$;9ä .9îâd:9ò{öDõ&öýÿídýärõýÿí”å;ö}÷<9äŒ-9îâX;9ò{öDõýÿídýärõýÿí”å;ö}ö =9ä(9î â4<9ò:öýÿídýä(öýÿíP&å.öýÿídýä)ö{ö}þh'9îâ@=9ò{ö}ö˜=9øÌ%9æÀ=9øè%9æè=9ø&9æ>9ø¨&9æ8>9øh'9æ`>9ø(9æˆ>9øŒ-9æ°>9ø .9æØ>9ø´.9æá?9øP/9æ(?9ù09æP?9øŒ09æA9øx?9æ¨?9æ5ø âü?9äÄ?9ì€âà?9Ì/å/9î<0å/9ê{öDõýÿíÌ/å.öýÿídýäjõýÿí<0å.öýÿídýä;ö}ö¸B9ø,A9æ\A9æ`4ø â°A9äxA9ì€â”A9Ì/å/9î<0å/9ê{öDõýÿíÌ/å.öýÿídýäkõýÿí<0å.öýÿídýä;ö}öàB9ø<19æC9øX19æ0C9øt19æØC9øXC9æˆC9ðHù â,%9˜C9æ¬C9è4êþ0D9ùD9æ@9ðHùXD9ø19æ€D9ø )9æü+9æE9Lä¸D9ÄD9æ â,%9ÔD9æèD9è4ÿê€E9DÅ ä$E90E9æ â,%9@E9æTE9è4êþ$F9äýäE9˜9äýÌE9ÿèäøE9ä@#9ä€â@9âváæP&åF9ì âÄD9 ä¸F9ä.ä4F9˜9ä.pF9ÿèäœF9äÄD9ä€â@9âwáæð*å@#9ìÌH9`/\G9ÈF9˜9`/G9âÿèä0G9ì€â@9âxéœ1 äLG9ì â@9äH9dG9˜9`/ G9@ÿèäÌG9ì€â@9âyåèG9œ1 äLG9ð0"åH9ê âD-9 èH9˜9`/XH9âÿèä„H9ìã@9%â˜å H9èLG9ø¼H9ê â@9 ä`I9ì.äÜH9˜9ì.I9ÿèäDI9ì €â@9âzéœ1 äLG9ì"€J9Hý ôI9pI9˜9Hý ¬I9ÿèäØI9äÄD9ä€â@9â{éœ1 äLG9ðüI9˜9Hý 8J9ÿèädJ9ä0E9䀀â@9â|éœ1 äLG9ê" K9<: K9J9˜9<: ÌJ9ÿèäøJ9äÄD9ä€â@9â}éœ1 äLG9ðK9˜9<: XK9ÿèä„K9ä0E9䀀â@9 â~éœ1 äLG9ê"ÀL9üÉ4L9°K9˜9üÉìK9ÿèäL9ä¼ 9ä€â@9 âéœ1 äLG9ðáî¬l9ÜN ò ’ î{öùÿõýÿíÌ/å.öýÿí¼Sä(öýÿí<0å)ö;öùÿõ}öh&¼Sn9îl9ä¸s îä$n9ìâ` :Ì/å@n9ì âPn9 ä â `n9Ð :ä¸n9üêèØÀ9èpä@Æ.èðÀ9äÐÁ9èˆ:#h&üêä`n9äØn9)ãáðn9üêäèn9`n9âo9ð© åo9 o9æ ìHo9Ðúä,o98o9æ äæœo9ÐAäXo9do9æ â ôsto9ˆo9ä o9êâ8o9èÈo9´5ä¬o9¸o9æ äæôo9¤] äØo9äo9æ äæ0p9ŒÍäp9p9æ â  p9ŒÍ äælp9`“ä@p9Lp9æ â \p9`“ 俍p9DZä|p9ˆp9æ â ˜p9DZ äæäp9`œä¸p9Äp9æ â Ôp9`œ äæ q94à äôp9áq9æ â q94à äæ\q9Ìýä0q9áî°‡9ÜN ò ’ î{öùÿõýÿíÌ/å.öýÿí¼Sä(öýÿí<0å)ö;öùÿõ}öh&¼S ‰9î‡9ä€d îä(‰9ìâô‰9Ì/åD‰9ì âT‰9 ä â 4Á.d‰9ˆ‰9äx‰9è 쬉9✉9è äæЉ9âÀ‰9è äêâä‰9è äê<0åŠ9ì â Š9 ä â 4Á.0Š9DŠ9äx‰9èXŠ9✉9èlŠ9âÀ‰9ìâä‰9ðЊ9ãŽ9ð â0‹9üPŒ9òèŠ94ò‹9>áî‹9ÜN ò ’ î{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}öh&ðŒŒ99ä”b î䨌9ìât9Ì/åÄŒ9ê âÔŒ9 ä â 4Á.äŒ99äøŒ9è ì,9â9è äæP9â@9è äêâd9è äê<0å9ê â 9 ä â 4Á.°9Ä9äøŒ9èØ9â9èì9â@9ìâd9ðPŽ9‑9¸ â°Ž9üÐ9òhŽ94ñ€Ž9>á9ÜN ò ’ î{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸ 9ïŽ9ä4c îä(9ìâô9Ì/åD9ê âT9 ä â 4Á.d9ˆ9äx9è ì¬9âœ9è äæÐ9âÀ9è äêâä9è äê<0å‘9ê â ‘9 ä â 4Á.0‘9D‘9äx9èX‘9âœ9èl‘9âÀ9ìâä9ðБ9⸔9Ì â0’9ü“9òè‘94ò’9>áî’9ÜN ò ’ î{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}öh&ÌD“99äèf îä`“9ìâ,”9Ì/å|“9ê ⌓9 ä â 4Á.œ“9À“9ä°“9è ìä“9âÔ“9è äæ”9âø“9è äêâ”9è äê<0åH”9ê âX”9 ä â 4Á.h”9|”9ä°“9è”9âÔ“9褔9âø“9ìâ”9ð•9â8˜9`4 âh•9üˆ–9ò •94ñ8•9>áîP•9ÜN ò ’ î{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`4Ä–99äÄg îäà–9ì⬗9Ì/åü–9ê â —9 ä â 4Á.—9@—9ä0—9è ìd—9âT—9è äæˆ—9âx—9è äê✗9è äê<0åÈ—9ê âØ—9 ä â 4Á.è—9ü—9ä0—9è˜9âT—9è$˜9âx—9ì✗9ðˆ˜9â˜9¸ âè˜9üè›9ò ˜94ñ¸˜9>áîИ9ÜN ò ’ î{öùÿõDõýÿí4· ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö,öýÿí<0å.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&¸$œ9î8˜9äŒe îä@œ9ìâ 9Ì/å\œ9ê âlœ9 ä â 4Á.|œ9 œ9äœ9è ìÄœ9â´œ9è äæèœ9âØœ9è äêâüœ9è äê<0å(9ê â89 ä â 4Á.H9\9äœ9èp9â´œ9è„9âØœ9ìâüœ9ðè9âh#85&âHž9üØ¡9óž94ñž9>áî0ž9ÜN ò ’ î{öùÿõDõýÿíÌ/å.öýÿíèê ä(ö)öjõýÿí<0å.öýÿíèê ä(ö)öiõýÿíøtä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö)ö;öùÿõ}öh&5¢9î˜9ädf îä0¢9ìâü¢9Ì/åL¢9ê â\¢9 ä â 4Á.l¢9¢9䀢9è ì´¢9⤢9è 俨¢9âÈ¢9è äêâì¢9è äê<0å£9ê â(£9 ä â 4Á.8£9L£9䀢9è`£9⤢9èt£9âÈ¢9ìâì¢9é§9£9¸n9`/Ì£9눤9ä k îäø£9ìâ`n9ì¤9œ1 ä‚9ì@¤9l ä0¤9ì æä\¤9R ä0¤9ðhäx¤9ê â¸o9 ä’n9äؤ9⸄9`/âð¤9ü£9ö<¬ âì:öýÿíìä(öýÿíl ä,öýÿíR ä,öZõ,öýÿíH¶ä(öýÿíhä)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}ú§9¸n9`/D§9ë¨9ätj îäp§9ìâ`n9쌧9œ1 ä‚9츧9l 䨧9ì æäÔ§9R 䨧9ìð§9häx¤9î0"å ¨9ê âLq9 ä’n9äl¨9∤9`/ℨ9ü§9ö<¬ âì:öýÿíìä(öýÿíl ä,öýÿíR ä,öZõ,öýÿíH¶ä(öýÿíhä)ö,öýÿí0"å)öùÿõ{öùÿõ}öøª9Hƒå tª9¸n9Hƒá°ª9ÿèäܪ9äLq9䀀â`n9âMéœ1 ä‚9ê"¬9Hý Œ«9«9¸n9Hý D«9ÿèäp«9ä €9ä€â`n9âNéœ1 ä‚9ð”«9¸n9Hý Ы9ÿèäü«9䘀9䀀â`n9âOéœ1 ä‚9ê"8­9<: ¬¬9(¬9¸n9<: d¬9ÿèä¬9ä €9ä€â`n9âPéœ1 ä‚9ð´¬9¸n9<: ð¬9ÿèä­9䘀9䀀â`n9âQéœ1 ä‚9ê"X®9|) Ì­9H­9¸n9|) „­9ÿèä°­9ä9ä€â`n9 âRéœ1 ä‚9ðÔ­9¸n9|) ®9ÿèä<®9äP9䀀â`n9 âSéœ1 ä‚9ê"x¯9<Þì®9h®9¸n9<Þ¤®9ÿèäЮ9ä9ä€â`n9 âTéœ1 ä‚9ðô®9¸n9<Þ0¯9ÿèä\¯9äP9䀀â`n9 âUéœ1 ä‚9ê °9ÔO 䈯9¸n9ÔO į9ÿèäð¯9쀀â`n9 âVéœ1 ä‚9ê °9èê ä°9¸n9èê X°9ÿèä„°9äˆp9䀀â`n9âWéœ1 ä‚9ê4±9¼ß ä°°9¸n9¼ß ì°9ÿèä±9äˆp9䀀â`n9âXéœ1 ä‚9ê"µ9Ðàä±9D±9¸n9Ðà€±9ÿè䬱9ä €9ä€â`n9âYåȱ9œ1 ä‚9ðÌ/å¼t9ꨲ9ì±9¸n9Ðà(²9ÿèäT²9ä €9ä€â`n9âZåp²9œ1 ä‚9쌲9ä¡ä €9ðÌ/å¼t9î°²9¸n9Ðàì²9ë|³9ä u îä³9ìâ`n9ì4³9œ1 ä‚9ì`³9l äP³9ì æèR äP³9ì’n9ä̳9â¨9Ðà âä³9ü°²9ö<¬ âì{öùÿõýÿíìä.öýÿí $ä(öýÿíl ä,öýÿíR ä)ö;öùÿõ}ö"8·9<Ç̵9,µ9¸n9<Çhµ9ÿè䔵9ì€â`n9â[å°µ9œ1 ä‚9ðä¡ä €9ìt¶9Ôµ9¸n9<Ƕ9ÿèä<¶9äˆp9ä€â`n9â\åX¶9œ1 ä‚9ðÌ/åu9î|¶9¸n9<Ǹ¶9ÿèää¶9ì€â`n9â]æ·9œ1 ä‚9ì·9l ä €9ðR ä €9ìø·9¼SäH·9¸n9¼S„·9ÿèä°·9ì€â`n9â^åÌ·9œ1 ä‚9ðÌ/åè·9ì â`n9 䌸9€" ä¸9¸n9€" D¸9ÿèäp¸9ì€â`n9â_éœ1 ä‚9ì ¹9øûå œ¸9¸n9øûáظ9ÿèä¹9ä¸o9䀀â`n9â`éœ1 ä‚9ê´¹9ð‚ä0¹9¸n9ð‚l¹9ÿè䘹9äls9䀀â`n9âaéœ1 ä‚9ê »9°Ú dº9Ĺ9¸n9°Ú áº9ÿèä,º9ä €9ä€â`n9âbåHº9œ1 ä‚9ðÌ/åu9îlº9¸n9°Ú ¨º9ÿèäÔº9䘀9䀀â`n9âcåðº9œ1 ä‚9îÌ/åu9ê¼»9¬Ï ä»9¸n9¬Ï X»9ÿèä„»9äˆp9䀀â`n9âdå »9œ1 ä‚9îÌ/åu9ê"½9ÀWl¼9Ì»9¸n9ÀW¼9ÿèä4¼9ä €9ä€â`n9âeåP¼9œ1 ä‚9ðÌ/åu9ît¼9¸n9ÀW°¼9ÿèäܼ9䘀9䀀â`n9âfåø¼9œ1 ä‚9îÌ/åu9ê"l¾9˜ Ľ9$½9¸n9˜ `½9ÿè䌽9ä €9ä€â`n9âg娽9œ1 ä‚9ðÌ/åu9î̽9¸n9˜ ¾9ÿèä4¾9䘀9䀀â`n9âhåP¾9œ1 ä‚9îÌ/åu9ê"4À9õT¿9|¾9¸n9õ¸¾9ÿèä¿9ää¾9ä€â`n9 âiå â ôsô¾9¿9ä €9ìâ €9è8¿9œ1 ä‚9ðÌ/åu9î\¿9¸n9õ˜¿9ÿèäü¿9äÄ¿9䀀â`n9!âjå â ôsÔ¿9è¿9䘀9ì☀9èÀ9œ1 ä‚9îÌ/åu9êÈÀ9,„äDÀ9¸n9,„€À9âÿèä¬À9쀀â`n9"âkéœ1 ä‚9îìäØÀ9å쨀9èÁ94ñ Á9>áî\Á9ÜN â8Á9è âD¦'HÁ9è o9ì ’ âtÁ9è ⯄Á9è˜Á9è â ôs¨Á9¼Á9ä o9êâ8o9è DÊ9Â9DÀ9îTâdÂ9òÂ94ñ4Â9>áîLÂ9ÜN ò ’ î{öùÿõ;õ(öýÿíèê ä(ö)ömõÿÿìæ)öùÿõ{öùÿõýÿíDÅ äýÿíð*å=öýÿíHý ä(ö)ö;öùÿõýÿíDÅ äýÿíP&å=öýÿíð*å;öùÿõýÿíH¶äýÿíT#å=öýÿíð‚ä(ö)ö;öùÿõ@õ(öpõýÿíP&å;öýÿíP&åkõýÿí<: ä(ö)ö;öpõýÿíð*å,öpõýÿíP&å)öùÿõ{öùÿõ;õ(öýÿíT#å(ö*öýÿíP&å,ö*öýÿíð*å)ö)öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõDõýÿíìä.öýÿí,„ä(ö)ö;öùÿõ}ö (Ì9xÊ9\¿9îâØÊ9òÊ94ñ¨Ê9>áîÀÊ9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíõä(öýÿíÌ/å)ö;öùÿõùÿõ}ö Î9\Ì9|¾9îâ¼Ì9òtÌ94ñŒÌ9>áî¤Ì9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíõä(öýÿíÌ/å)ö;öùÿõùÿõ}ö ðÏ9@Î9̽9îâ Î9òXÎ94ñpÎ9>áîˆÎ9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí˜ ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö ÔÑ9$Ð9$½9îâ„Ð9ò<Ð94ñTÐ9>áîlÐ9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí˜ ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö ¸Ó9Ò9t¼9îâhÒ9ò Ò94ñ8Ò9>áîPÒ9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíÀWä(öýÿíÌ/å)ö;öùÿõùÿõ}ö œÕ9ìÓ9Ì»9îâLÔ9òÔ94ñÔ9>áî4Ô9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíÀWä(öýÿíÌ/å)ö;öùÿõùÿõ}ö €×9ÐÕ9»9îâ0Ö9òèÕ94òÖ9>áîÖ9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíX ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö dÙ9´×9lº9îâØ9òÌ×94ñä×9>áîü×9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí°Ú ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö HÛ9˜Ù9Ĺ9îâøÙ9ò°Ù94ñÈÙ9>áîàÙ9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿí°Ú ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö äÜ9|Û90¹9î âÜÛ9ò”Û94ñ¬Û9>áîÄÛ9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíð‚ä(ö)ö;öùÿõ}ö °Þ9Ý9œ¸9î âxÝ9ò0Ý94ñHÝ9>áî`Ý9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíð‚ä(ö)ö.öýÿíhä;öùÿõ}ö 4à9äÞ9¸9î âDß9òüÞ94ñß9>áî,ß9ÜN ò ’ î{öùÿõýÿíìä.öýÿí€" ä(ö)ö;öùÿõ}÷ â9hà9H·9î âÈà9ò€à94ñ˜à9>áî°à9ÜN ò ’ î{öùÿõýÿíìä.öýÿí¼Sä(öýÿíÌ/å.öýÿíìä)ö;öùÿõ}ö Ìã94â9|¶9î â”â9òLâ94ñdâ9>áî|â9ÜN ò ’ î{öùÿõýÿíìä.öýÿí<Çä(öýÿíl ä,öýÿíR ä)ö;öùÿõ}ö°å9áä9Ôµ9îâ`ä9òä94ñ0ä9>áîHä9ÜN ò ’ î{öùÿõùÿõDõýÿíìä.öýÿíÐ7ä(öýÿíÌ/å)ö;öùÿõùÿõ}ö Lç9äå9,µ9î âDæ9òüå94ñæ9>áî,æ9ÜN ò ’ î{öùÿõýÿíìä.öýÿí<Çä(öýÿíä¡ä)ö;öùÿõ}ö 0é9€ç9ì±9îâàç9ò˜ç94ñ°ç9>áîÈç9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí $ä(öýÿíä¡ä,öýÿíÌ/å)ö;öùÿõ}ö äê9dé9D±9î âÄé9ò|é94ñ”é9>áî¬é9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí $ä(öýÿíÌ/å)ö;öùÿõ}ö €ì9ë9°°9î âxë9ò0ë94ñHë9>áî`ë9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí¼ß ä(ö)ö;öùÿõ}ö î9´ì9°9î âí9òÌì94ñäì9>áîüì9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíèê ä(ö)ö;öùÿõ}ö ¸ï9Pî9ˆ¯9î â°î9òhî94ñ€î9>áî˜î9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíÔO ä(ö)ö;öùÿõ}ö lñ9ìï9ô®9î âLð9òð94ñð9>áî4ð9ÜN ò ’ î{öùÿõDõýÿíää(öýÿíHý ä(ö)ö)ö;öùÿõ}ö ó9 ñ9h®9î ãò9ò¸ñ94ñÐñ9>áîèñ9ÜN ò ’ î{öùÿõDõýÿíL¸ ä(öýÿíHý ä(ö)ö)ö;öùÿõ}ö Ôô9Tó9Ô­9î â´ó9òló94ñ„ó9>áîœó9ÜN ò ’ î{öùÿõDõýÿíää(öýÿí<: ä(ö)ö)ö;öùÿõ}ö ˆö9õ9H­9î âhõ9ò õ94ñ8õ9>áîPõ9ÜN ò ’ î{öùÿõDõýÿíL¸ ä(öýÿí<: ä(ö)ö)ö;öùÿõ}ö $ø9¼ö9´¬9î â÷9òÔö94ñìö9>áî÷9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí<: ä(ö)ö;öùÿõ}ö Àù9Xø9(¬9î â¸ø9òpø94ñˆø9>áî ø9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿí<: ä(ö)ö;öùÿõ}ö \û9ôù9”«9î âTú9ò ú94ñ$ú9>áî<ú9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíHý ä(ö)ö;öùÿõ}ö øü9û9«9î âðû9ò¨û94ñÀû9>áîØû9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíHý ä(ö)ö;öùÿõ}ö ”þ9,ý9tª9î âŒý9òDý94ñ\ý9>áîtý9ÜN ò ’ î{öùÿõDõýÿíìä.öýÿíHƒå(ö)ö;öùÿõ}ö x:Èþ9è‚9îâ(ÿ9òàþ94ñøþ9>áîÿ9ÜN ò ’ î:öýÿíìä(öýÿíH¶ä(öýÿíhä)ö,öýÿí0"å)öùÿõ{öùÿõ}ö Œ:¬: ‚9îâ :òÄ:4ñÜ:>áîô:ÜN ò ’ î:öýÿíìä(öýÿíH¶ä(öýÿíhä)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}úÀ:„9îâ :òØ:4ñð:>áî:ÜN ò ’ î:öýÿíìä(öýÿíH¶ä(ö)ö,öýÿí¤] ä(ö)ö)öùÿõ{öùÿõ}ö°:ùo9æØ:ø,o9æá:øXo9æ(:ø¬o9æP:øØo9æx:øp9æ :ø@p9æÈ:ø|p9æð:ø¸p9æ:øôp9æ@:ø0q9æh:øtq9è:øls9è¸:ø¬9æà:ø€9æ:øŒ€9æ0:ø9æX:øD9æ€:ø„9æ¨:ø ‚9æÐ:øè‚9æø:øtª9æ :ø«9æH:ø”«9æp:ø(¬9æ˜:ø´¬9æÀ:øH­9æè:øÔ­9æ :øh®9æ8 :øô®9æ` :øˆ¯9æˆ :ø°9æ° :ø°°9æØ :øD±9æá :øì±9æ( :ø,µ9æP :øÔµ9æx :ø|¶9æ  :øH·9æÈ :ø¸9æð :øœ¸9æ :ø0¹9æ@ :øĹ9æh :ølº9æ :ø»9æ¸ :øÌ»9æà :øt¼9æ :ø$½9æ0 :ø̽9æX :ø|¾9æ€ :ø\¿9æ¨ :øDÀ9æüØÀ9æô :ää :è ì :â :è äæ< :â, :è äêâP :è äê<0å| :ì ⌠: ä â `n9œ :° :ää :èÄ :â :èØ :â, :ìâP :ð<:âl:ð âœ:ü¼:òT:4ñl:>áî„:ÜN ò ’ î{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}öh&ðø:îì :ä0t îä:ìâà:Ì/å0:ê â@: ä â `n9P:t:äd:è ì˜:âˆ:è äæ¼:â¬:è äêâÐ:è äê<0åü:ê â : ä â `n9:0:äd:èD:âˆ:èX:â¬:ìâÐ:ð¼:âì:¸ â:ü<:òÔ:4ñì:>áî:ÜN ò ’ î{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸x:îl:äÐr îä”:ìâ`:Ì/å°:ê âÀ: ä â `n9Ð:ô:ää:è ì:â:è äæ<:â,:è äêâP:è äê<0å|:ê âŒ: ä â `n9œ:°:ää:èÄ:â:èØ:â,:ìâP:ð<:â$:Ì âœ:üt:òT:4ñl:>áî„:ÜN ò ’ î{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}öh&̰:îì:ä@s îäÌ:ìâ˜:Ì/åè:ê âø: ä â `n9:,:ä:è ìP:â@:è äæt:âd:è äêâˆ:è äê<0å´:ê âÄ: ä â `n9Ô:è:ä:èü:â@:è:âd:ìâˆ:ðt:â¤:`4 âÔ:üô:òŒ:4ñ¤:>áî¼:ÜN ò ’ î{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`40:î$:äüu îäL:ìâ:Ì/åh:ê âx: ä â `n9ˆ:¬:äœ:è ìÐ:âÀ:è äæô:âä:è äêâ:è äê<0å4:ê âD: ä â `n9T:h:äœ:è|:âÀ:è:âä:ìâ:ðô:â!:¸ âT:üT:ò :4ñ$:>áî<:ÜN ò ’ î{öùÿõDõýÿí4· ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö,öýÿí<0å.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&¸:î¤:ä v îä¬:ìâx :Ì/åÈ:ê âØ: ä â `n9è: :äü:è ì0 :â :è äæT :âD :è äêâh :è äê<0å” :ê ⤠: ä â `n9´ :È :äü:èÜ :â :èð :âD :ìâh :ðT!:â|³95&â´!:üD%:òl!:4ñ„!:>áîœ!:ÜN ò ’ î{öùÿõDõýÿíÌ/å.öýÿíèê ä(ö)öjõýÿí<0å.öýÿíèê ä(ö)öiõýÿíøtä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö)ö;öùÿõ}öh&5€%:î!:ädt îäœ%:ìâh&:Ì/å¸%:ê âÈ%: ä â `n9Ø%:ü%:äì%:è ì &:â&:è äæD&:â4&:è äêâX&:è äê<0å„&:ê â”&: ä â `n9¤&:¸&:äì%:èÌ&:â&:èà&:â4&:ìâX&:è"àA:Jˆ':':˜9J@':ÿèäl':ì€â@9âéœ1 äLG9ð':˜9JÌ':âî@(:äö(öýÿíhä)ö;öùÿõýÿíÄ{ä.öNõýÿíJä<öýÿíÜN ä>ö(öýÿíhä)ö;öùÿõýÿíô¸ä<öýÿíÜN ä>ö(öýÿíÄ{ä,öýÿíhä)ö;öùÿõCõ;öùÿõ}öùÿõ}öùÿõ}ötB:dh äðA:˜9dh ,B:âÿèäXB:ì€â@9âŽéœ1 äLG9ì"”C:(© C:„B:˜9(© ÀB:ÿèäìB:äH9ä€â@9âéœ1 äLG9ðC:˜9(© LC:ÿèäxC:äH9 â@9âéœ1 äLG9ê"ÄD:à#8D:¤C:˜9à#àC:ÿèäD:ä D:ä€â@9â‘å âD 9 èœ1 äLG9ð@D:˜9à#|D:ÿèä¨D:ä D: â@9â’éœ1 äLG9ê"ôE:ˆÏhE:ÔD:˜9ˆÏE:ÿèäLE:äõ ’ ï S:K:ðA:îSâ8K:ò K:>õ ’ î{öùÿõ;õ(öýÿíà#ä(ö)ö<öÿÿìæ)öùÿõDõ;öùÿõýÿíÄ”äýÿí$å=öýÿíÄ”ä(ö&öýÿíL* ä(ö)ö)ö;öùÿõ@õ(öýÿíÄ”äýÿíP&å=öýÿíL* ä(ö)ö.öýÿí„Í ä;öýÿíP&åkõýÿí$å;öýÿíP&å=öýÿíP&årõýÿî‡ ä)öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿíP&årõýÿî‡ ä,öýÿíP&årõýÿí„Í ä)ö;öùÿõvõýÿ픀ävõýÿí¼Sä(öýÿíL* ä(ö)ö.öýÿî‡ ä,öýÿíL* ä(ö)ö.öýÿí„Í ä)ö;öùÿõ}ö Da:4S:¤T9î”âdS:òLS:>õ ’ î{öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõ{öùÿõýÿí Éä.öýÿí¼Sä(öýÿíÌ/å.öýÿí Éä)ö;öùÿõýÿí'ä.öýÿí¼Sä(öýÿíÌ/å.öýÿí'ä)ö;öùÿõýÿí<^ä&öýÿíL-å=öýÿíL* ä(ö)ö;öùÿõ;õ(öýÿíà#ä(ö)ö>öÿÿô)öùÿõýÿíL-å.öýÿí„Í ärõýÿî‡ ä=öýÿíL-å.öýÿî‡ ärõýÿí„Í ä=ö(öýÿíÄ”ä)ö&öýÿíL-å;öùÿõ<õùÿõýÿíL-å.öýÿí„Í ä=öýÿíL-å.öýÿî‡ ä=ö(öýÿíÄ”ä)ö&öýÿíL-å;öùÿõýÿí<^ä&öýÿí¼ìä=öýÿíÌ/å.öýÿíL* ä(ö)ö;öùÿõ;õ(öýÿíÌ/å.öýÿíà#ä(ö)ö>öÿÿô)öùÿõýÿí¼ìä.öýÿí„Í ärõýÿî‡ ä=öýÿí¼ìä.öýÿî‡ ärõýÿí„Í ä=ö(öýÿíÄ”ä)ö&öýÿí¼ìä;öùÿõ<õùÿõýÿí¼ìä.öýÿí„Í ä=öýÿí¼ìä.öýÿî‡ ä=ö(öýÿíÄ”ä)ö&öýÿí¼ìä;öùÿõùÿõ}öùÿõ}ö Œm:xa: S9î}â¨a:òa:>õ ’ î{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõ;öùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõ{öùÿõ;õ(öýÿí(© ä(ö)ökõýÿíÌ/å.öýÿí(© ä(ö)ö)öùÿõùÿõPõýÿíØu ä(öüÿí`m:,â)ö;öùÿõùÿõùÿõýÿíDZäýÿíX{ä=ö(öýÿíDZä)övõýÿ픀ävõýÿí|Ôä(öýÿíl ä,öýÿíR ä)ö;öùÿõùÿõýÿíÌ/å.öýÿíà#ä(ö)öbõýÿíX{ä;öùÿõýÿíà#ä(ö)öaõýÿíX{ä;öùÿõ}öùÿõýÿíXäýÿí€Bä=öýÿíäýä(öýÿíl ä)ö;öùÿõýÿíXäýÿíPDä=öýÿíÌ/å.öýÿíäýä(öýÿíR ä)örõýÿî‡ ä;öùÿõýÿíüÊä(öýÿí€Bä,öýÿíPDä)ö;öùÿõýÿí8aä(öýÿíäýä(öýÿíä¡ä)ö,öýÿí€Bä,öýÿíPDä)ö;öùÿõ}ö6list::splice called with unequal allocatorsôw:Àm:ÀR9îiâðm:òØm:>õ ’ î{öùÿõùÿõ;õ(öOõkõ&öýÿíÌ/å)öùÿõ{öùÿõ;õ(öýÿí(© ä(ö)ökõýÿíÌ/å.öýÿí(© ä(ö)ö)öùÿõùÿõPõýÿíØu ä(öüÿíÈw:,â)ö;öùÿõùÿõqõýÿíÌ/å.öýÿíà#ä(ö)ö;öùÿõpõýÿíà#ä(ö)ö;öùÿõùÿõ}öùÿõýÿíXäýÿíð*å=öýÿíäýä(öýÿíä¡ä)ö;öùÿõýÿíXäýÿí€Bä=öýÿíäýä(öýÿíP&å)ö;öùÿõ;õ(öýÿí€Bäjõýÿíð*årõýÿî‡ ähõýÿí€Bäjõýÿíð*å)öùÿõDõ;öùÿõýÿíüÊä(öýÿí€Bä,öýÿí€Bä)ö;öùÿõýÿí8aä(öýÿíð*å,öýÿí€Bä,öýÿí€Bä)ö;öùÿõ}ö6list::splice called with unequal allocatorsdƒ:(x:üQ9îtâXx:ò@x:>õ ’ î{öùÿõ;õ(öýÿíÌ/å.öýÿíà#ä(ö)ö>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí(© ä(ö)ökõýÿíÌ/å.öýÿí(© ä(ö)ö)öùÿõùÿõPõýÿíØu ä(öüÿí8ƒ:,â)ö;öùÿõùÿõýÿí<^ä&öýÿíéä=öýÿíÌ/å.öýÿíL* ä(ö)ö;öùÿõýÿíXäýÿí€Bä=öýÿíéä.öýÿí„Í ä;öùÿõýÿíXäýÿíPDä=öýÿíéä.öýÿî‡ ä;öùÿõýÿíéä.öýÿî‡ ä=öýÿíéä.öýÿí„Í ä=ö(öýÿíÄ”ä)ö&öýÿíéä;öùÿõýÿí8aä(öýÿíäýä(öýÿíä¡ä)ö,öýÿí€Bä,öýÿíPDä)ö;öùÿõýÿíà#ä(ö)öaõýÿíÌ/å.öýÿíà#ä(ö)ö;öùÿõùÿõýÿíÌ/å.öýÿíà#ä(ö)ö=öÿÿô;öùÿõ}öùÿõ}ö6list::splice called with unequal allocators8Œ:˜ƒ:tO9îZâȃ:ò°ƒ:>õ ’ î{öùÿõ;õ(öýÿíl äjõýÿíR ä)öùÿõDõýÿíR ä;öùÿõýÿíüÊä(öýÿíäýä(öýÿíl ä)ö,öýÿíäýä(öýÿíR ä)örõýÿî‡ ä)ö;öùÿõ>õ(öýÿíl äkõýÿíR ä)öùÿõ{öùÿõýÿí(© ä(ö)ö.öýÿí$òä(ö&ö*öýÿíl ä)ö;öùÿõýÿíÄ”äýÿíL-å=öýÿíäýä(öýÿíl ä)ö;öùÿõùÿõpõýÿíl ä;öùÿõùÿõýÿíˆÏä(ö)ö.öýÿí”j ä(öýÿíL-å,öÿÿìæ)ö;öùÿõqõýÿíà#ä(ö)ö;öùÿõ}öùÿõDõýÿíR ä;öùÿõ}ö l’:lŒ:ÌN9î>✌:ò„Œ:>õ ’ î{öùÿõùÿõýÿíÄ”äýÿíØqä=öýÿíäýä(öýÿíä¡ä)ö;öùÿõùÿõpõýÿíä¡ä;öùÿõùÿõýÿíüÊä(öýÿíØqä,öýÿíØqä)ö;öùÿõýÿí(© ä(ö)ö.öýÿí$òä(ö&öýÿíØqärõýÿí”å)ö;öùÿõýÿíˆÏä(ö)ö.öýÿí”j ä(öýÿíØqä,öÿÿìæ)ö;öùÿõqõýÿíà#ä(ö)ö;öùÿõDõýÿíä¡ä;öùÿõ}ö Pš: ’:ðM9îPâÐ’:ò¸’:>õ ’ î{öùÿõýÿíT¾ävõýÿí@ä<öýÿíÌ×ä,öýÿí ‡ä&ö>öýÿí0ä(öýÿíˆÏä(ö)ö.öýÿí¤vä(öÿÿìæ)ö,öýÿíˆÏä(ö)ö)ö;öùÿõýÿí(© ä(ö)ö.öýÿíxå(ö&öýÿí0ärõýÿí”å,öýÿíÌ/å)ö;öùÿõýÿíÄ”äýÿí”òä=öýÿí0ä.öýÿíHu ä(ö)ö;öùÿõýÿí8aä(öýÿíäýä(öýÿíä¡ä)ö,öýÿí”òä,öýÿí”òä)ö;öùÿõpõýÿíà#ä(ö)ö;öùÿõDõýÿíä.ä(öýÿí”òä)ö;öùÿõ}ö ìž:„š:dG9î-â´š:òœš:>õ ’ î:öýÿí Éä(öýÿí0"å,öÿÿô)ö,öùÿõùÿõýÿí'ä(öýÿí(© ä(ö)ö)öùÿõùÿõ{öùÿõýÿí<^ä&öýÿíL-å=öýÿíL* ä(ö)ö;öùÿõýÿíL-å.öýÿî‡ ä=öýÿíL-å.öýÿí„Í ä=ö(öýÿíÄ”ä)ö&öýÿíL-å;öùÿõ}ö  £: Ÿ:ÈF9î.âPŸ:ò8Ÿ:>õ ’ î:öýÿí Éä(öýÿíDZä(öÿÿô)ö)ö,öùÿõùÿõýÿí'ä(öýÿí(© ä(ö)ö)öùÿõùÿõ{öùÿõýÿí<^ä&öýÿíL-å=öýÿíL* ä(ö)ö;öùÿõýÿíL-å.öýÿî‡ ä=öýÿíL-å.öýÿí„Í ä=ö(öýÿíÄ”ä)ö&öýÿíL-å;öùÿõ}ö ¼²:Ô£:4G:îâ¤:òì£:>õ ’ î{öùÿõýÿíDZäýÿí|,å=öýÿíà#ä(ö)ö;öùÿõ!õýÿí<^ä&öýÿíL-å=öýÿíL* ä(ö)ö;öùÿõ;õ(öýÿí|,åjõÿÿô)öùÿõ{öùÿõ;õ(öýÿíL-å.öýÿî‡ äkõýÿíL-å.öýÿí„Í ä)öùÿõDõ[õ;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿíL-å.öýÿí„Í ärõýÿî‡ äkõ&öýÿíL-å)öùÿõDõ[õ;öùÿõ;õ(öýÿíL-å.öýÿî‡ ärõýÿí„Í äkõ&öýÿíL-å)öùÿõDõ[õ;öùÿõ;õ(öýÿí|,åkõýÿí|Ôä(öýÿíHý ä(ö)ö,öýÿí<: ä(ö)ö)ö)öùÿõDõ[õ;öùÿõýÿíDZäýÿíT#å=öÿÿô;öùÿõýÿíDÅ äýÿí¼"å=öýÿíHý ä(ö)ö;öùÿõýÿíDÅ äýÿí$å=öýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿí¼"åkõýÿí$å;öqõýÿí$å)öùÿõpõýÿíT#å;öùÿõ;õ(öýÿí|,åkõýÿíT#å)öùÿõDõ[õ;öùÿõ}öùÿõDõZõ;öùÿõ}ö @·:ð²:èI:î,â ³:ò³:>õ ’ î{öùÿõýÿí\½ärõýÿî‡ ärõýÿí„Í ä=ö(öýÿíÄ”ä)öýÿíl ä;öùÿõýÿíl ärõýÿî‡ ä=öýÿí\½ärõýÿî‡ ä;öùÿõýÿí\½ärõýÿî‡ ä=ö(öýÿíÄ”ä)öýÿíR ä;öùÿõýÿíR ärõýÿí„Í ä=ö(öýÿíÄ”ä)öýÿí\½ä;öùÿõ}ö ü¹:t·:8I:î⤷:òŒ·:>õ ’ î{öùÿõýÿíl ärõýÿî‡ ärõýÿí„Í ä=öýÿíR ärõýÿí„Í ä;öùÿõýÿíR ärõýÿí„Í ärõýÿî‡ ä=öýÿíl ärõýÿî‡ ä;öùÿõ}ö»:ä F:î â0º:ò{öDõýÿí'ä.öýÿí ä(ö)ö;ö}ö¼:äF:î â<»:ò{öDõýÿí'ä.öýÿí ä(ö)ö;ö}ö ½:äpE:î âH¼:ò{öDõýÿí'ä.öýÿíl ä(ö)ö;ö}ö,¾:äÔD:î âT½:ò{öDõýÿí'ä.öýÿíl ä(ö)ö;ö}ö8¿:ä@D:î â`¾:ò{öDõýÿí Éä.öýÿí ä(ö)ö;ö}öDÀ:ä¤C:î âl¿:ò{öDõýÿí Éä.öýÿí ä(ö)ö;ö}öPÁ:äC:î âxÀ:ò{öDõýÿí Éä.öýÿíl ä(ö)ö;ö}ö\Â:ä„B:î â„Á:ò{öDõýÿí Éä.öýÿíl ä(ö)ö;ö}ö°Ã:ä':î âÂ:ò{öýÿíJä(öýÿíä<öýÿíÐAä>ö(ö)ö)ö;ö}ö4Å:ähQ9îâäÃ:ò{öýÿí<Çä(öýÿíä.ä(öýÿíL* ä(ö)ö.öýÿî‡ ä)ö)ö;ö}ö¸Æ:äÔP9îâhÅ:ò{öýÿí<Çä(öýÿíä.ä(öýÿíL* ä(ö)ö.öýÿí„Í ä)ö)ö;ö}ö$È:ä@P9î âìÆ:ò{öýÿí<Çä(öýÿíHý ä(ö)ö,öýÿí<: ä(ö)ö)ö;ö}ö`É:ä\M9î âXÈ:ò{öDõýÿíL* ä(ö)ö.öýÿî‡ ärõýÿí”å;ö}öœÊ:äÐL9î â”É:ò{öDõýÿíL* ä(ö)ö.öýÿî‡ ärõýÿí”å;ö}öØË:äövõýÿíxQä>ö(ö)ö)ö;ö}úˆé:Ü9`/Äé:ÿèäðé:ì€â„9â£å ê:œ1 ä4â:ðÌ/å(ê:ê â„9 ä%`ð:,nàí:Hê:Ü9,n„ê:ë€ë:䔄 îä°ê:ìâ„9ìÌê:œ1 ä4â:ìøê:l äèê:ì æäë:R äèê:ðˆ$ä0ë:ì âÞ:@ë:æTë:è4êþ¶9äÐë:âHæ:,nâèë:üHê:ö<¬ âì{öýÿí,ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;ö}úèí:Ü9,n$î:ë ï:䬅 îäPî:ìâ„9ìlî:œ1 ä4â:ì˜î:l äˆî:ì æä´î:R äˆî:ðˆ$äÐî:ì âÞ:àî:æôî:è4ÿê¶9äpï:â€ë:,n âˆï:üèí:ö<¬ âì{öýÿí,ä(öýÿíl ä,öýÿíR ä)ö;ö}öñ:2äpð:Ü92¬ð:ÿèäØð:ä(ê:ä€â„9â¤åôð:œ1 ä4â:ðÌ/å(ê:ê%ø:h» ¸ô: ñ:Ü9h» \ñ:ëXò:ä… îäˆñ:ìâ„9ì¤ñ:œ1 ä4â:ìÐñ:l äÀñ:ì æäìñ:R äÀñ:ðˆ$äò:ì âÞ:ò:æ,ò:è4êþ¶9ä¨ò:â ï:h» âÀò:ü ñ:ö<¬ âì{öýÿíL¢ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;ö}úÀô:Ü9h» üô:ëøõ:äð‚ îä(õ:ìâ„9ìDõ:œ1 ä4â:ìpõ:l ä`õ:ì æäŒõ:R ä`õ:ðˆ$ä¨õ:ì âÞ:¸õ:æÌõ:è4ÿê¶9äHö:âXò:h» â`ö:üÀô:ö<¬ âì{öýÿí„&ä(öýÿíl ä,öýÿíR ä,öýÿíà?ä<öýÿí<¬ ä>övõýÿíL ä(ö)ö)ö;ö}öÜø:L¢ä ø:Ü9L¢\ø:âÿèäˆø:ì€â„9â¥å¤ø:œ1 ä4â:ìÀø:@)å”à:ðL-åhä:ê´;„&;ìø:Ü9„&(ù:âîÔù:䜂 îäTù:ìâ„9ä¹åpù:œ1 ä4â:ìœù:l äŒù:ì æä¸ù:R äŒù:ðˆ$äÈHì¶9ä$ú:âøõ:„&Tâ<ú:üìø:ö<¬ âì{öùÿõýÿíLäýÿíP&å=öýÿí¼e ävõýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿí¼e ävõýÿí<: ä(ö)ö;öùÿõ@õ(ö;öýÿíl äkõýÿíR äiõýÿíP&åkõýÿí$å;öpõýÿíl ä,öpõýÿíP&å)öùÿõ*öýÿíP&å=ö*öýÿíl ä;öùÿõ;õ(öýÿíP&åjõýÿí$å)öùÿõýÿíh ä(öýÿíP&å,öýÿíl ä,öýÿíR ä,öýÿí¸Pä<ö[õ>ö(ö)ö)ö;öùÿõ<õùÿõýÿí¼e ävõýÿí<Çä(öýÿíP&å,öýÿí$å)ö;öùÿõ}ö”;$;Ü9„&`;âî ;äøƒ îäŒ;ìâ„9ä»å¨;œ1 ä4â:ìÔ;l äÄ;ì æäð;R äÄ;ðˆ$ä|Gì¶9ä\;âÔù:„&,ât;ü$;öœö âì{öùÿõýÿíœö äýÿí¸$å=öýÿíl ä;öùÿõ@õ(öýÿíDZäýÿíT#å=öýÿíèê ä(ö)ö;öýÿíT#åkõÿÿôiõýÿí¸$åkõýÿíR ä;öqõýÿíT#å)öùÿõpõýÿí¸$å;öùÿõýÿí„&ä(öýÿíl ä,öýÿí¸$å,öýÿíR ä)ö;öùÿõ}öÄ ;œ;Ü9„&Ø;î„;ä$ƒ îä;ìâ„9ä¼å ;œ1 ä4â:ìL;l ä<;ì æäh;R ä<;ðˆ$ääDì¶9äÔ;â ;„&)âì;üœ;ö´ ãì{öùÿõõ õýÿíà?ä<öýÿí´ å>övõýÿí`œäýÿí`œä;öùÿõýÿí„&ä(öýÿíl ä,öýÿíl ä+övõýÿ픀ävõýÿí˜ ä(öýÿí`œä(öýÿíèê ä(ö)ö)ö,öýÿíR ä-öýÿíl ä)ö,öýÿíR ä)ö;öùÿõ}úÌ ;Ü9„& ;âî´ ;ä܈ îä4 ;ìâ„9äºåP ;œ1 ä4â:ì| ;l äl ;ì æä˜ ;¸$ål ;ðR äl ;ì¶9ä;â„;„&Qâ;üÌ ;öœö âì{öùÿõ;õ(öýÿí¸$åkõýÿíR ä)öùÿõ{öùÿõýÿí0žäýÿíL´ä(öýÿí¸$å,öýÿíR ä,öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõýÿíØä(övõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿí¸$å,öýÿí¼e ävõýÿíHý ä(ö)ö)ö,öýÿíL´ä)ö;öùÿõ}öùÿõ<õùÿõýÿí¼e ävõýÿí<Çä(övõýÿ픀ävõýÿíTmä(öýÿíl ä,öýÿí¸$å,öýÿí¼e ävõýÿíHý ä(ö)ö)ö,öýÿí¼e ävõýÿí<: ä(ö)ö)ö;öùÿõ}öH;(© äÄ;ä(© á;äYÿå â ;(© â @9 ;4;äDÞ:ìâá:èÜ;Hý äX;äHý ”;äYÿå â ¤;Hý â @9´;È;äDÞ:ìâá:èp;<: äì;ä<: (;äYÿå â 8;<: â @9H;\;äDÞ:ìâá:è;ÔO ä€;Ü9ÔO ¼;ÿèäè;쀀â„9 â¦éœ1 ä4â:ê˜;èê ä;Ü9èê P;ÿèä|;ä”à:䀀â„9 â§éœ1 ä4â:ê,;¼ß ä¨;Ü9¼ß ä;ÿèä;ä”à:䀀â„9 â¨éœ1 ä4â:ê ;Ý Ü;<;Ü9Ý x;âÿèä¤;ì€â„9 â©åÀ;œ1 ä4â:ðà#ä”à:ðä;Ü9Ý ;âÿèäL;ì€â„9 âªåh;œ1 ä4â:ì„;à#ä”à:ðxQähä:ê4;üÉä°;äüÉì;äYÿå â ü;üÉ â @9 ; ;äDÞ:ìâá:èÈ;dk äD;ädk €;äYÿå â ;dk â @9 ;´;äDÞ:ìâá:èx; Ú äØ;Ü9 Ú ;ÿèä@;ì€â„9â«å\;œ1 ä4â:ðÌ/åhä:ê ;Häˆ;äHÄ;äYÿå â Ô;H â @9ä;ø;äDÞ:ìâá:è¼;Ìoä;Ü9ÌoX;ÿèä„;ì€â„9â¬å ;œ1 ä4â:ðÌ/åhä:êP;ö(öýÿíl ä)ö,öXõ<öýÿíÐAä>ö(öýÿíR ä)ö)ö;ö}úø#;Ü9h 4$;âîL%;ä¼” îä`$;ìâ„9ä½å|$;œ1 ä4â:ì˜$;ä¡äÌß:ìÄ$;l ä´$;ì æäà$;R ä´$;ðˆ$äü$;ì âÞ: %;æ %;è4ÿê¶9äœ%;â`!;h â´%;üø#;ö<¬ âì{öùÿõýÿí0žäýÿíL´ä(öýÿíl ä,öýÿíR ä,öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõýÿíØä(öýÿíä¡ä,öýÿíL´ä)ö;öùÿõ}ö¸(;<Çä4(;ä<Çp(;äYÿå â €(;<Ç â @9(;¤(;äDÞ:ìâá:èL);€" äÈ(;ä€" );äYÿå â );€" â @9$);8);äDÞ:ìâá:èü);¼Sä\);Ü9¼S˜);ÿèäÄ);ì€â„9â¯åà);œ1 ä4â:ðÌ/å(ê:ì"¤,;ØÈ*; *;Ü9ØH*;ÿèät*;ì€â„9â°å*;œ1 ä4â:ì¬*;ä¡äÌß:ðÌ/å(ê:ì¨+;Ð*;Ü9Ø +;ÿèä8+;ì€â„9â±åT+;œ1 ä4â:ìp+;ä¡äÌß:ìŒ+;Ì/å(ê:ðP&åÌß:ð°+;Ü9Øì+;ÿèä,;ì€â„9â²å4,;œ1 ä4â:ìP,;ä¡äÌß:ìl,;Ì/å(ê:ìˆ,;l äÌß:ðR äÌß:ìT-;¸×ä´,;Ü9¸×ð,;ÿèä-;ì€â„9â³å8-;œ1 ä4â:ðxQähä:ê$8;(äd-;Ü9( -;âî.;ä$” îäÌ-;ìâ„9ä¾åè-;œ1 ä4â:ð´Â ä.;ì æä¶9äd.;âL%;(gâ|.;üd-;ö,U âì{öùÿõýÿíLäýÿí$å=öýÿí¼e ävõýÿí<: ä(ö)ö;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿí¼e ävõýÿíHý ä(ö)ö;öýÿíP&åkõýÿí$å;öpõýÿíP&å)öùÿõ{öùÿõ;õ(öýÿí´Â ä(ö*öýÿíP&å)ö)öùÿõ{öùÿõýÿíLäýÿí'å=öýÿíP&å;öùÿõ@õ(öpõýÿí'å;öýÿí'åkõýÿí$å;öpõýÿí'å)öùÿõ;õ(ö!öýÿí´Â ä(ö*öýÿí'å)ö)öùÿõCõ;öùÿõýÿíP&å=öýÿí¼e ävõýÿí<Çä(öýÿíP&å,öýÿí'å)ö;öùÿõ;õ(öýÿíP&åjõýÿí$å)öùÿõCõ;öùÿõ}öùÿõ}öùÿõ}ö"xB;Ü ¸8;48;Ü9Ü p8;ÿèäœ8;ì€â„9â´éœ1 ä4â:ðÀ8;Ü9Ü ü8;âîp9;äè• îä(9;ìâ„9ä¿åD9;œ1 ä4â:ð´Wä`9;ì æä¶9äÀ9;â.;Ü \âØ9;üÀ8;ö²âì{öùÿõýÿíLäýÿí$å=öýÿí¼e ävõýÿí<: ä(ö)ö;öùÿõ@õ(öýÿíLäýÿíP&å=öýÿí¼e ävõýÿíHý ä(ö)ö;öýÿíP&åkõýÿí$å;ö)öùÿõ{öùÿõýÿíLäýÿí'å=öýÿíP&å;öùÿõ@õ(öpõýÿí'å;öýÿí'åkõýÿí$å;öpõýÿí'å)öùÿõ;õ(ö!öýÿí´Wä(ö*öýÿíP&å,ö*öýÿí'å)ö)öùÿõCõ;öùÿõpõýÿíP&å;öùÿõ;õ(öýÿíP&åkõýÿí'å)öùÿõýÿíP&å=öýÿí¼e ävõýÿí<Çä(öýÿíP&å,öýÿí'å)ö;öùÿõ}öùÿõ}ö$E;ô¸äˆB;Ü9ô¸ÄB;ëTC;ä@• îäðB;ìâ„9ì C;œ1 ä4â:ì(C;Ì/å(ê:ðhäDC;ì æä¶9ä¤C;âp9;ô¸â¼C;üˆB;öÜN âì{öýÿí¼e ävõNõýÿíô¸ä<öýÿíÜN ä>ö(öýÿíÌ/å,öýÿíhä)ö;ö}ö¸E;Jä4E;äJpE;äYÿå â €E;J â @9E;¤E;äDÞ:ìâá:èLF;dh äÈE;ädh F;äYÿå â F;dh â @9$F;8F;äDÞ:ìâá:èLJ;,G;\F;Ü9,˜F;âÿèäÄF;ì€â„9âµåàF;œ1 ä4â:ìüF;@)å”à:ðxQähä:î G;Ü9,\G;âîìG;äÔ’ îäˆG;ìâ„9ä¸å¤G;œ1 ä4â:ìÐG;l äÀG;ì æèR äÀG;ì¶9äõ ’ î TR;œL;ä;î;âÌL;ò´L;>õ ’ î{öùÿõýÿíDZäýÿíä=öýÿíèê ä(ö)ö;öùÿõ;õ(öýÿíà#ä>öýÿíä)öùÿõýÿíÐàä(öýÿí¼e ävõýÿí<: ä(ö)ö,öýÿíà#ä-öýÿíä,öýÿíxQä)ö;öùÿõ<õ;õ(öýÿíà#ä<öýÿíä)öùÿõýÿí¼e ävõýÿí<Çä(öýÿí Ú ä(öýÿíà#ä)ö,öýÿí¼e ävõýÿí<: ä(ö)ö)ö;öùÿõ}ö pX;ˆR;<;î=â¸R;ò R;>õ ’ î{öùÿõýÿíDZäýÿíä=öýÿíèê ä(ö)ö;öùÿõ;õ(öýÿíà#ä>öýÿíä)öùÿõýÿíÐàä(öýÿí¼e ävõýÿí<: ä(ö)ö,öýÿíà#ä-öýÿíä,öýÿíÐAä(ö)ö)ö;öùÿõ<õ;õ(öýÿíà#ä<öýÿíä)öùÿõýÿí¼e ävõýÿí<Çä(öýÿí Ú ä(öýÿíà#ä)ö,öýÿí¼e ävõýÿí<: ä(ö)ö)ö;öùÿõ}ö D[;¤X;$;îâÔX;ò¼X;>õ ’ î{öùÿõýÿí0žäýÿíL´ä(öýÿí@)å,öýÿíÌ/å,öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõýÿíØä(öýÿíä¡ä,öýÿíL´ä)ö;öùÿõ}ö èf;x[; ø:îxâ¨[;ò[;>õ ’ î{öùÿõýÿíDZäýÿíà#ä=öýÿíèê ä(ö)ö;öùÿõýÿíLäýÿíP&å=öýÿí¼e ävõýÿíHý ä(ö)ö;öùÿõýÿíLäýÿí$å=öýÿí¼e ävõýÿí<: ä(ö)ö;öùÿõ;õ(öýÿí@)å>öýÿíà#ä)öùÿõ{öùÿõýÿí0žäýÿíL´ä(öýÿí@)å-öýÿíà#ä,öýÿíL-å,öýÿí¼e ävõýÿí(© ä(ö)ö)ö;öùÿõ@õ(ö;öýÿíP&åkõýÿí$å;öpõýÿíP&å)öùÿõ*öýÿíP&å=öýÿíL-å;öùÿõýÿíØä(öýÿíP&å,öýÿíL´ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõ@õ(ö;öýÿí@)åkõÿÿô;öqõýÿí@)å,öpõýÿíP&å)öùÿõ*öýÿíP&å=öýÿíL-å;öùÿõýÿí¼e ävõýÿí<Çä(öýÿíP&å,öýÿí$å)ö;öùÿõ}öùÿõ}ö \o;g;ðJ;îVâLg;ò4g;>õ ’ î{öùÿõýÿíDZäýÿíà#ä=öýÿíèê ä(ö)ö;öùÿõýÿíLäýÿíP&å;öùÿõ;õ(öýÿíð*ålõýÿíà#ä/öÿÿìæ)öùÿõ{öùÿõýÿíP&å=öýÿí¼e ävõýÿíHý ä(ö)ö;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿí`œä(öýÿíð*å)ö)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíP&å=öýÿí¼e ävõýÿí<: ä(ö)ö;öùÿõvõýÿ픀ävõýÿíoä(öýÿíP&å,öýÿí`œä(öýÿíð*å-öýÿíà#ä)ö)ö;öùÿõ}öùÿõDõýÿíP&å;öùÿõ}ö  q;o;\F;îâÀo;ò¨o;>õ ’ î{öùÿõ@õ(ö;öýÿí@)å>öÿÿô;öqõýÿí@)å)öùÿõýÿíÌoä(öýÿíxQä)ö;öùÿõ}ö„s;ä˜K;îâÔq;ò{öDõTõ<öýÿí0žä&ö>ö(ö*öOõ)ö.öýÿí Ú ä(öýÿíð*å)ö;ö}öØt;ä48;î â¸s;ò{öýÿíÜ ä(öýÿíØË ä<öýÿíÐAä>ö(ö)ö)ö;ö}ö”w;ä´,;îâ u;ò{öýÿí(ä(öýÿíÄ~ ä<öýÿíØË ä<öýÿíÐAä>ö,ö!õýÿíÐAä&ö>ö(öýÿíØË ä<öýÿíÐAä>ö(ö)ö,öýÿíxQä)ö)ö;ö}ö0y;ä°+;îâÈw;ò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å,öýÿíl ä,öýÿíR ä)ö;ö}öœz;äÐ*;î âdy;ò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å,öýÿíP&å)ö;ö}öØ{;ä *;î âÐz;ò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å)ö;ö}öä|;ä\);î â |;ò{öýÿí¼e ävõýÿí¼Sä(öýÿíÌ/å)ö;ö}ö8~;ä`;î â};ò{öDõýÿí¼e ävõýÿíÐàä(öýÿíä¡ä,öýÿíÌ/å)ö;ö}öÔ;ä;îâl~;ò{öýÿí¼e ävõýÿíÐàä(öýÿí¼e ävõýÿí<: ä(ö)ö,öýÿíÌ/å)ö;ö}öp;äØ;îâ€;ò{öýÿí¼e ävõýÿíÐàä(öýÿí¼e ävõýÿíHý ä(ö)ö,öýÿíÌ/å)ö;ö}ö ƒ;ä¨;îâ¤;ò{öDõ(öýÿíDZä)öýÿíhää<öýÿí`œä>övõýÿíl„ ä(ö)ö;ö}ö„;ä;î â@ƒ;ò{öDõýÿí¼e ävõýÿíà#ä(ö)ö;ö}öT…;ä€;î âL„;ò{öDõýÿí¼e ävõýÿíà#ä(ö)öjõÿÿô;ö}ö8Š;äpð:î2∅;ò{ö;õ(öOõkõ&öýÿíÌ/å)öùÿõýÿí„&ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí Ú ä(övõýÿ픀ävõýÿí˜ ä(öýÿíèê ä(ö)ö,öýÿíÌ/å.öýÿíèê ä(ö)ö)ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö)ö;öDõ*öOõ;ö}öÜŒ;äˆé:îâlŠ;ò:öýÿí¼e ä(öýÿíÌ/å.öýÿí(© ä(ö)ö)ö{öýÿí,ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö)ö;ö}ö`Ž;ä€ä:îâ;ò:öýÿí¼e ä(öýÿí0"å)ö{öýÿí,ä(öýÿí@)å,öýÿíxQä)ö;ö}öl;ä¬ã:î ┎;ò{öýÿí,ä(öýÿí@)å,öýÿíxQä)ö;ö}ö¨;äã:î â ;ò{öýÿí,ä(öýÿí@)å,öýÿíÐAä(ö)ö)ö;ö}ö„‘;äLâ:îâÜ;ò:öýÿí¼e ä(öýÿí0"å)ö{ö}þ°á:î⸑;ò{ö}öH’;ø’;ä â @9 ’;4’;äDÞ:ìâá:èp’;ø$9昒;øÞ:èÀ’;øHß:æè’;ø„ß:æ“;øÀß:æ8“;ø$à:æ`“;øˆà:戓;øÄà:æ°“;ùá:æØ“;øá:æá”;ø8á:æ(”;øtá:æP”;ø°á:æx”;øLâ:æ ”;øã:æÈ”;ø¬ã:æð”;ø€ä:æ•;øˆé:æ@•;øpð:æh•;ø ø:æØ•;ø•;ä â  •;(© â @9°•;Ä•;äDÞ:ìâá:èH–;ù–;ä â –;Hý â @9 –;4–;äDÞ:ìâá:踖;øp–;ä â €–;<: â @9–;¤–;äDÞ:ìâá:èà–;ø€;æ—;ø;æ0—;ø¨;æX—;ø<;怗;øä;æð—;ø¨—;ä â ¸—;üÉ â @9È—;Ü—;äDÞ:ìâá:è`˜;ø˜;ä â (˜;dk â @98˜;L˜;äDÞ:ìâá:舘;øØ;æø˜;ø°˜;ä â À˜;H â @9И;ä˜;äDÞ:ìâá:è ™;ø;æ™;øH™;ä â X™;áçÕÿíðÿÑááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿä ðÿÿÕááÿÿÿÿÿõâ¤å@Aÿä ïÿÕááÿÿÿÿìáÏÿÿáâæ ÿä ðÿÿÕááÿÿÿÿÿõâžæ@ÿäðÿÑááÿÿÿ÷â•æ@ôé`Ã;ü:á ¾äÑÿá”Ã;2€èÀÃ;üéìÃ;ü:áp¨ä¤ÿá,áä(Ä;4Ä;æ âDÄ;æþ¤yä˜Ê8äœÆ ä€Ä;h&œÆ ¼Ä;ÿìäØÄ;ïáôÄ;ÿ䜨-ì È;L¥ä Å;h&L¥\Å;äê°Å;öäxÅ;ìáá”Å;ÿô$Æ;LÆ;ççäçæáááxýâÌ/é­á@<0é®á @€áDÛädÆ;ä2€èÆ;ü8é ¼Æ;ˆÇ;øÆ;ô:âèÆ;äLÇ;ü âøÆ;æäÇ;ïá0Ç;ÿôh&üõøÆ;æÿä È;Ç;2€è¼Ç;üéèÇ;ü:áp¨ä­ÿáÈ;2€èHÈ;üétÈ;ü:áp¨ä®ý°È;äÒ ä8)äÇ äÀÈ;â É;Ç ØÈ;èâh&ðÈ;ä4Iä ÀÈ;Ü!ØÈ;ð”ÊØÈ;ìhÊä0É;h&hÊlÉ;ð¤É;öäˆÉ;ìáýÊ;,Ê;ççäçæáááxýâT#é{â@;â$äDÊ;ä7é pÊ;üË;(Ì;ôéœÊ;LË;øéÈÊ; Ë;øéôÊ;ü:ᬨä{þ4ÿêéxË;ÐË;øé¤Ë;ü:ᬨä{þ4ëý4ÿêéTÌ;Ï;ø2é€Ì;üé¬Ì;üáX+-äØÌ;lÎ;øáX+-äÍ;üá|(-ä0Í;@Î;øá|(-ä\Í;üáÔ-äˆÍ;Î;ø8áÔ-ä ´Í;àÍ;ì8-ô:âÜ8-ä$9-ÿàèÍ;4êþ4ê¼ý4êþ é˜Î;ðÎ;øéÄÎ;ü:ᬨä{þ4êþ4ê€þ„Ð;°Ó äXÏ;h&°Ó ”Ï;ÿìä°Ï;ïáÌÏ;è8ýìèÏ;øÐ;ÿä Ð;ì â0Ð;æäLÐ;òhÐ;è8ýö8ýîD}ä”Ð; Ð;æâÐÐ;D}èøÑ;èâpæh&D}ä Ð;äðÐ;ãáÀÑ;2åÑ;ÐÐ;2<Ñ;ÿèäxÑ;ähÑ;äã Ð;ì â Ð; ä¤Ñ;è”Ñ;ì â Ð;ðhÑ;êèÑ; äÐÑ;æ èæ|,äøÑ;â ÐÑ;|,ìðÉ ä Ò;€YæDÒ;©<Ò;Y+ä`T+äœ}å TÒ;h&œ}áÒ;ðÈÒ;öä¬Ò;ìáý<Ó;PÓ;ççäçæáááxýâT#é‹â@Câ$ähÓ;ä7é ”Ó; Õ;xÕ;ôéÀÓ;pÔ;øéìÓ;DÔ;øéÔ;ü:ᬨä‹þ4ÿêéœÔ;ôÔ;øéÈÔ;ü:ᬨä‹þ4ëýéLÕ;ü:ᬨä‹þ2é¤Õ;üéÐÕ;üáðþäüÕ;×;øáðþä(Ö;üá|(-äTÖ;d×;øá|(-ä€Ö;üáÔ-ä¬Ö;8×;ø8áÔ-ä ØÖ;×;ì8-ô:âÜ8-ä$9-ÿà ×;4êþ4ê¼ý4êþé¼×;ü:ᬨä‹ÿ Ø;,ø×;8g!äÀY!伩äØ;h&¼©LØ;äê Ø;öähØ;ìáá„Ø;ÿôÙ;<Ù;ççäçæáááxýâÌ/é¨á@<0é©á @~áDÛäTÙ;ä2€è€Ù;ü8é ¬Ù;ØÙ;øÆ;ô:âèÆ;äLÇ;ü dÚ;àÙ;2€è Ú;üé8Ú;ü:áüµä¨ÿálÚ;2€è˜Ú;üéÄÚ;ü:áüµä©ÿá Ë åÛ;h& Ë <Û;äêtÛ;öäXÛ;ìýèÛ;üÛ;ççäçæáááxýâÌ/é á @jáDÛäÜ;ä2€è@Ü;ü8é lÜ;˜Ü;ܽ;ô:â̽;ä¾;ÿà Ü;2€èÌÜ;üéøÜ;ü:áüµä ÿádÖ ä4Ý;h&dÖ pÝ;äê¨Ý;öäŒÝ;ìýÞ;0Þ;ççäçæáááxýâÌ/éÜá@îâDÛäHÞ;ä2€ètÞ;ü8é  Þ;¸ÿ;ÜÞ;ô:âÌÞ;äß;ü âÜÞ;æäøÞ;ìýh&Ôg ÜÞ;äääPß;öÄß;(ìß;ççäçáæáááxýâÌ/éáÀøgèá €”áü:ä¬ã;ä•áü:äØã;ä—áü:ìšáü:ä,å;Šâ›áü:ä¸å;Šâœáü:äDæ;Šâáü:äÐæ;Šâžáü:ä\ç;ŠâŸáü:äèç;Šâ áü:ätè;Šâ¡áü:åé;Šâ¢áü:äŒé;Šâ£áü:äê;Šâ¤áü:ä¤ê;Šâ¥áü:ä0ë;Šâ¦áü:ä¼ë;Šâ§áü:äHì;Šâ¨áü:äÔì;Šâ©áü:ì©áü:ä`í;Šâ¬áü:äìí;Šâ­áü:äxî;Šâ®áü:äï;Šâ¯áü:äï;Šâ°áü:äð;Šâ±áü:ä¨ð;Šâ²áü:ä4ñ;Šâ³áü:äÀñ;Šâ´áü:ì´áü:äLò;Šâ¶áü:äØò;Šâ¹áü:ädó;ä»áü:ì¼áü:ä¼ó;#â½áü:ä$ý;ä½áü:ìÀáü:ä|ý;&âÁáü:äÜþ;äÁáü:ìÃáü:äÿ;ä>áçýøã;äâ âðåðãé$ä;áå;øéPä;üᬨä|ä;Ôä;ø2ᬨä¨ä;ü:á ¾äý4êþ4ìðÿë ðÿááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäðÿááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ²æ@ÿäñÿÿÿÿââ|æ@ÿä ðÿäÿûâ“æ@ÿäñÿÿÿÿââ»æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâ@ÿáâæ ÿäðÿÿäáâ8Oÿñâ,å @ÿãñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ¬æ@ÿä ðÿäáÿøâ•æ@ÿäðÿÿäáâ°Oÿñâ3ç@ÿã ïÿäáðÿåâæ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ¬æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ{æ@ÿäñÿÿÿÿââ¿æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââæ@ÿä ðÿäáÿøâ•æ@ÿä ðÿááÿÿÿ÷âŸå€Àÿä ðÿááÿÿÿ÷â•æ@ôéó;ü:á ¾äýéèó;øü;ø8é ô;˜ü;Pô;ô:â@ô;äˆô;ü âPô;æälô;ìýä0\ Pô;âêÄô;ö8õ;Lõ;ççäçæáááxýâÌ/é®áÀkâ ääö;ämâ ìoâ äLø;âoâ ä€ù;âoâ ìoâ äú;äoâ ìpâ ä0ú;äsâ ìuâ ä\ú; âuâ äû; âuâ ìuâ äü;äuâ ìvâ ä@ü;äzâ ì{â älü;ä÷;äâðâðåðåéD÷; ø;øép÷;üᬨäœ÷;ô÷;ø2ᬨäÈ÷;ü:á ¾ä®ý4êþ4ìðûéxø;Tù;øé¤ø;üᬨäÐø;(ù;ø2ᬨäüø;ü:á ¾ä®ý4êþ4êÿÿüé¬ù;ü2ᬨäØù;ü:á ¾ä®ý4êþ4êþéˆú;dû;øé´ú;üᬨäàú;8û;ø2ᬨä û;ü:á ¾ä®ý4êþ4êÿÿüé¼û;ü2ᬨäèû;ü:á ¾ä®ý4êþ4êþ4êÿâ ü;éÌü;ü:á ¾äý4êþéPý;ü:á ¾äýé¨ý;°þ;ø2éÔý;üêþ;üᬨä,þ;„þ;ø2ᬨäXþ;ü:á ¾äý4êþ4í€û5ðð¿÷2€è4ÿ;üé`ÿ;ü2áüµäŒÿ;ü:⬨äèßÿàÀÿ;2€èìÿ;üé<ü:áüµäÜýü<ÜÌ äT<h&ÜÌ <äêÈ<öä¬<ìáý<<P<ççäçæáááxýâÌ/éôá @žáDÛäh<ä2€è”<ü8é À<p<ü<ô:âì<ä4<ü âü<æä<ïýh&Ì( ü<æÿèx<2€è¤<üéÐ<ü:áp¨äôÿáp€, < <h&p€H<äääœ<öäd<ìá€<ÿô<8<ççäçáæáááxýâÌ/éBáÀ<0éCá Àkáü:ä¸<Šâláü:äD<Šâmáü:äÐ<Šânáü:ä\<Šâoáü:äè<Šâqáü:ät<Šâráü:å <Šâuáü:äŒ <Šâváü:ä <Šâwáü:ä¤ <Šâxáü:ä0 <Šâyáü:ìyáü:ä¼ <Šâ{áü:ì{áü:äH <Šâáü:äÔ <ôðÿCááÿÿÿ÷â“æ@ÿäðÿBááÿÿÿ÷â}æBÿä ðÿäÿûâ§æAÿä ïÿäóâGÿáâæ ÿäðÿÿäá â Oÿñâ,å @ÿã ïÿäóâÿáâæ ÿäðÿÿäá âhOÿñâ,å @ÿãñÿÿÿÿââ¼æBÿä ðÿäÿûâ§æAÿä ïÿäóâDÿáâæ ÿäðÿÿäá âhOÿñâ,å @ÿãðÿBááÿÿÿ÷â”æ@ÿäðÿäÿûâ•æ@ôê <ü:á ¾äBý<4 <h&p€p <îÄ <öäŒ <ìáᨠ<ÿô8<`<ççäçæáááxýâÌ/éKá@<0éLá @á äx<ä8é ¤<Ð<à<ô:âÐ<ä4<ü âà<æäü<ìá<ÿôh&„ à<äêp<öä< <ççäçæáááxýâÌ/éá@<0éá @ áDÛä$<ä2€èP<ü8é |<¸<H<ô:â¨<ä <ü âH<æ D<À<2€èì<üé<ü:áüµäÿáL<2€èx<üé¤<ü:áüµäý 0<Ø<é<ü:áüµäKÿá8<éd<ü:áüµäLýä<˜<h&p€Ô<î(<öäð<ìáá <ÿôœ<Ä<ççäçæáááxýâÌ/éPá@<0éQá @á äÜ<ä8é <$<D<ô:â4<ä˜<ü âD<æä`<ìá|<ÿôh&€¦D<äêÔ<öH<p<ççäçæáááxýâÌ/é á@<0é á @ áDÛäˆ<ä2€è´<ü8é à< <H<ô:â¨<ä <ü ˜<<2€è@<üél<ü:áp¨ä ÿá <2€èÌ<üéø<ü:áp¨ä ý „<,<éX<ü:áp¨äPÿáŒ<é¸<ü:áp¨äQýt<ì<h&p€(<î|<öäD<ìáá`<ÿôð<<ççäçæáááxýâÌ/é; á@<0é< á @‚áTä0<ä8é \<ˆ<H<ô:â¨<ä <ü è<<é¼<ü:á ¾ä; ÿáð<2€è<üéH<ü:ᬨä< ý0<|<h&p€¸<î <öäÔ<ìááð<ÿô€<¨<ççäçæáááxýâÌ/é@ á@<0éA á @„áTäÀ<ä8é ì<<H<ô:â¨<ä <ü ¤< <2€èL<üéx<ü:ᬨä@ ÿá¬<2€èØ<üé<ü:ᬨäA ýì<8<h&p€t<îÈ<öä<ìáá¬<ÿô<<d<ççäçæáááxýâÌ/éE á@<0éF á @†áTä|<ä8é ¨<Ô<H<ô:â¨<ä <ü `<Ü<2€è<üé4<ü:á¤*äE ÿáh<2€è”<üéÀ<ü:ᬨäF ý¨"<ô<h&p€0 <î„ <öäL <ìááh <ÿôø < !<ççäçæáááxýâÌ/éJ á@<0éK á @ˆáTä8!<ä8é d!<!<H<ô:â¨<ä <ü "<˜!<2€èÄ!<üéð!<ü:á¤-äJ ÿá$"<2€èP"<üé|"<ü:ᬨäK ýd%<°"<h&p€ì"<î@#<öä#<ìáá$#<ÿô´#<Ü#<ççäçæáááxýâÌ/éO á@<0éP á @ŠáTäô#<ä8é $<L$<H<ô:â¨<ä <ü Ø$<T$<2€è€$<üé¬$<ü:áèäO ÿáà$<2€è %<üé8%<ü:ᬨäP ý (<l%<h&p€¨%<îü%<öäÄ%<ìááà%<ÿôp&<˜&<ççäçæáááxýâÌ/éT á@<0éU á @áTä°&<ä8é Ü&<'<H<ô:â¨<ä <ü ”'<'<2€è<'<üéh'<ü:á´-äT ÿáœ'<2€èÈ'<üéô'<ü:ᬨäU ýÜ*<((<h&p€d(<î¸(<öä€(<ìááœ(<ÿô,)<T)<ççäçæáááxýâÌ/éY á@<0éZ á @‘áTäl)<ä8é ˜)<Ä)<H<ô:â¨<ä <ü P*<Ì)<2€èø)<üé$*<ü:áÄ-äY ÿáX*<2€è„*<üé°*<ü:ᬨäZ ý˜-<ä*<h&p€ +<ît+<öä<+<ìááX+<ÿôè+<,<ççäçæáááxýâÌ/é^ á@<0é_ á @”áTä(,<ä8é T,<€,<H<ô:â¨<ä <ü -<ˆ,<2€è´,<üéà,<ü:áüµä^ ÿá-<2€è@-<üél-<ü:ᬨä_ ý(0< -<h&p€Ü-<î0.<öäø-<ìáá.<ÿô¤.<Ì.<ççäçæáááxýâÌ/éc á@<0éd á @–áTää.<ä8é /<<öä><ìáá$><ÿô´><Ü><ççäçæáááxýâÌ/é á@<0é‚ á @£áTäô><ä8é ?<L?<H<ô:â¨<ä <ü Ø?<T?<2€è€?<üé¬?<ü:á´-ä ÿáà?<2€è @<üé8@<ü:á¤*ä‚ ý C<l@<h&p€¨@<îü@<öäÄ@<ìááà@<ÿôpA<˜A<ççäçæáááxýâÌ/é† á@<0é‡ á @§áTä°A<ä8é ÜA<B<H<ô:â¨<ä <ü ”B<B<2€èâTäH=ä8é t= =Ôù<ô:â(ý<ä˜ù<ÿà¨=2€èÔ=üê=ü:ᬨä‰ý,=4=h&üp=î¨=öäŒ=ìáý=0=ççäçæáááxýâÌ/éá@@âTäH=ä8é t= =Ôù<ô:â(ý<ä˜ù<ÿà¨=2€èÔ=üê=ü:á¤*äý,=4=h&üp=î¨=öäŒ=ìáý=0=ççäçæáááxýâÌ/é‘á@BâTäH=ä8é t= =Ôù<ô:â(ý<ä˜ù<ÿà¨=2€èÔ=üê=ü:á¤-ä‘ý, =4=h&üp=î¨=öäŒ=ìáý =0 =ççäçæáááxýâÌ/é•á@DâTäH =ä8é t =  =Ôù<ô:â(ý<ä˜ù<ÿਠ=2€èÔ =üê =ü:áèä•ý, =4 =h&üp =î¨ =öäŒ =ìáý =0 =ççäçæáááxýâÌ/é™á@GâTäH =ä8é t =  =Ôù<ô:â(ý<ä˜ù<ÿਠ=2€èÔ =üê =ü:á´-ä™ÿá4 =h&üp =î¨ =öäŒ =ìáý =0 =ççäçæáááxýâÌ/éá@KâTäH =ä8é t =  =Ôù<ô:â(ý<ä˜ù<ÿਠ=2€èÔ =üê=ü:áÄ-äýD=Pí ä<=°š'æ<í äT=h&<í =ÿìä¬=ïáÈ=èêä=èÔ)ÿìˆî ä=h&ˆî L=ÿìäh=äçá„=èì =èöÔ)ð˜å ä8”-ä Ü=<¡+ä ›+ä Tœô=ìÜ+äìÖ+äÀçä Œâ$= Ää |%4=àžä,= “'æÈžäD=h&Èž€=ÿìì /-çåpµä |]+Ì=(žá¼=h²Ä=̯ä Ьä=(êäÜ=<âL=êäô=h&ê0=ÿì÷å8 ä\=h&8 ˜=îÐ=öä´=ì휨-ìD=X=ççäçæáááxýâôû œ¨-äSâ@ƒâÜEäp=ä2€èœ=üéÈ=üᜨ-äô=L=øáœ¨-ä =ü:áà¬8äSþ4ê þ (7=ŒÈˆ=ˆ=h&ŒÈÄ=äää=öäà=ìáü=ÿä ¾ìŒ= È=ççäçáæáááxýâÌ/éèá ÀÜ'  ¾äéáÀøgèíá €9áü:å=ä=áü:ä,=Šâ>áü:ä¸=Šâ?áü:äD=Šâ@áü:äÐ=ŠâAáü:ä\=ŠâBáü:äè=ŠâCáü:ät=ŠâDáü:å=ŠâEáü:äŒ=ŠâFáü:ä=ŠâGáü:ä¤=ŠâIáü:ä0=ä>áçíÿíðÿèááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿä ðÿíááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿäðÿäÿûâ“æ@ÿä ðÿíááÿÿÿ÷âŸå€Àÿä ïÿäáìéááÿÿÿáâ ÿìðÿäáÿÿÿõâ•æ@ÿäñÿÿÿÿââæ@ÿäðÿèááÿÿÿ÷â•æ@ôé\=ü:á ¾äèý("==h&ŒÈÌ=î =öäè=ìáá=ÿäp¨ì”=ä=ççäçæáááxýâÌ/éÏá @Ü' p¨äÐá@üœ èÔဈõèÕãqá ä\=ärá äˆ=ärá ä´=äsá äŒ =ätá äÐ!=ä>áçÔý>áçÕýéà=8=øé =ü:áp¨äÕý2€èd=ü8é =Ì=Ä=ô:â¼=äˆ=ü âÄ=æ X =Ô=2€é =üé, =ü:áp¨äÏÿá` =:á ¾äÔýé¸ =L!=øéä =üáp¨ä!=ü:ááçÛý>áçÜýé€$=Ø$=øé¬$=ü:áüµäÜý2€è%=ü8é 0%=\%=Ä=ô:â¼=äˆ=ü è%=d%=2€è%=üé¼%=ü:áüµäÖÿáð%=:á ¾äÛýéH&=Ü&=øét&=üáüµä &=ü:áÌ&=ä×ý âüµæ2€è'=üé4'=ü:á ¾äÛýéŒ'=ü:áüµäÜýX*=À'=h&ŒÈü'=îP(=öä(=ìáá4(=ÿä ¾ìÄ(=ì(=ççäçæáááxýâÌ/égá@<0á ¾ähá @váTä)=ä8é 0)=\)=Ä=ô:â¼=äˆ=ü è)=d)=2€è)=üé¼)=ü:ᬨägÿáð)=á ¾ä*=ü:áH*=ähý â ¾æè,=`*=h&ŒÈœ*=îð*=öä¸*=ìááÔ*=ÿä ¾ìd+=Œ+=ççäçæáááxýâÌ/élá@<0á ¾ämá @xáTä¤+=ä8é Ð+=ü+=Ä=ô:â¼=äˆ=ü ˆ,=,=2€è0,=üé\,=ü:á¤*älÿá,=á ¾ä¼,=ü:áH*=ämýx/=ð,=h&ŒÈ,-=î€-=öäH-=ìáád-=ÿä ¾ìô-=.=ççäçæáááxýâÌ/éqá@<0á ¾ärá @záTä4.=ä8é `.=Œ.=Ä=ô:â¼=äˆ=ü /=”.=2€èÀ.=üéì.=ü:á¤-äqÿá /=á ¾äL/=ü:áH*=ärý2=€/=h&ŒÈ¼/=î0=öäØ/=ìááô/=ÿä ¾ì„0=¬0=ççäçæáááxýâÌ/évá@<0á ¾äwá @|áTäÄ0=ä8é ð0=1=Ä=ô:â¼=äˆ=ü ¨1=$1=2€èP1=üé|1=ü:áèävÿá°1=á ¾äÜ1=ü:áH*=äwý˜4=2=h&ŒÈL2=î 2=öäh2=ìáá„2=ÿä ¾ì3=<3=ççäçæáááxýâÌ/é{á@<0á ¾ä|á @áTäT3=ä8é €3=¬3=Ä=ô:â¼=äˆ=ü 84=´3=2€èà3=üé 4=ü:á´-ä{ÿá@4=á ¾äl4=ü:áH*=ä|ÿá 4=h&ŒÈÜ4=î05=öäø4=ìáá5=ÿä ¾ì¤5=Ì5=ççäçæáááxýâÌ/é€á@<0á ¾äá @ƒáTää5=ä8é 6=<6=Ä=ô:â¼=äˆ=ü È6=D6=2€èp6=üéœ6=ü:áÄ-ä€ÿáÐ6=á ¾äü6=ü:áH*=äÿᬤ°>=87=h&¬¤t7=äääÈ7=öä7=ìá¬7=ÿô<8= d8=ççäçáæáááxýâÌ/éÖáÀ<0é×áÀÿâü:äl9=Šâááü:äø9=Šâáü:ä„:=Šâáü:ìáü:ä;=Šâáü:äœ;=Šâáü:ä(<=Šâáü:ä´<=Šâáü:ä@==Šâáü:äÌ==Šâ áü:äX>=ôðÿ×ááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ®æ@ÿäðÿÖááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ­æ@ÿä ðÿäÿûâ¨æAÿä ïÿäóâÿáâæ ÿäðÿÿäáâèOÿñâ,å @ÿãðÿäáÿøâ•æ@ÿäðÿÖááÿÿÿ÷â•æ@ôé„>=ü:á ¾äÖýD=¸>=h&¬¤ô>=îH?=öä?=ìáá,?=ÿô¼?=ä?=ççäçæáááxýâÌ/é_á@<0é`á @$á äü?=ä8é (@=TC=d@=ô:âT@=ä¸@=ü âd@=æä€@=ìáœ@=ÿôh&x d@=äêô@=öhA=A=ççäçæáááxýâÌ/éá@<0éá @áDÛä¨A=ä2€èÔA=ü8ê B=áTå†=ä8é ,†=X†=t7=ô:â,B=ä87=ü ä†=`†=2€èŒ†=ü鸆=ü:áèäµ ÿáì†=2€è‡=üéD‡=ü:á¤-ä¶ ý,Š=x‡=h&¬¤´‡=îˆ=öäЇ=ìááì‡=ÿô|ˆ=¤ˆ=ççäçæáááxýâÌ/éº á@<0é» á @AáT伈=ä8é èˆ=‰=t7=ô:â,B=ä87=ü  ‰=‰=2€èH‰=üét‰=ü:á´-äº ÿᨉ=2€èÔ‰=üêŠ=ü:á¤-ä» ýèŒ=4Š=h&¬¤pŠ=îÄŠ=ö䌊=ìáᨊ=ÿô8‹=`‹=ççäçæáááxýâÌ/é¿ á@<0éÀ á @EáTäx‹=ä8é ¤‹=Ћ=t7=ô:â,B=ä87=ü \Œ=Ø‹=2€èŒ=üé0Œ=ü:áÄ-ä¿ ÿádŒ=2€èŒ=ü鼌=ü:á¤-äÀ ý¤=ðŒ=h&¬¤,=î€=öäH=ìáád=ÿôô=Ž=ççäçæáááxýâÌ/éÄ á@<0éÅ á @HáTä4Ž=ä8é `Ž=ŒŽ=t7=ô:â,B=ä87=ü =”Ž=2€èÀŽ=üéìŽ=ü:áüµäÄ ÿá =2€èL=üéx=ü:á¤-äÅ ý4’=¬=h&¬¤è=î<=öä=ìáá =ÿô°=Ø=ççäçæáááxýâÌ/éÉ á@<0éÊ á @JáTäð=ä8é ‘=H‘=ÈE=ô:â¸E=äF=ü ¨‘=P‘=é|‘=ü:áp¨äÉ ÿá°‘=2€èÜ‘=üé’=ü:á¤-äÊ ýÄ”=<’=h&¬¤x’=îÌ’=öä”’=ìáá°’=ÿô@“=h“=ççäçæáááxýâÌ/éÎ á@<0éÏ á @LáT䀓=ä8é ¬“=Ø“=t7=ô:â,B=ä87=ü 8”=à“=é ”=ü:á ¾äÎ ÿá@”=2€èl”=ü阔=ü:áèäÏ ý€—=Ì”=h&¬¤•=î\•=öä$•=ìáá@•=ÿôЕ=ø•=ççäçæáááxýâÌ/éÓ á@<0éÔ á @NáTä–=ä8é <–=h–=t7=ô:â,B=ä87=ü ô–=p–=2€èœ–=üéÈ–=ü:ᬨäÓ ÿáü–=2€è(—=üéT—=ü:áèäÔ ý<š=ˆ—=h&¬¤Ä—=î˜=öäà—=ìááü—=ÿôŒ˜=´˜=ççäçæáááxýâÌ/éØ á@<0éÙ á @PáTä̘=ä8é ø˜=$™=t7=ô:â,B=ä87=ü °™=,™=2€èX™=üé„™=ü:á¤*äØ ÿḙ=2€èä™=üéš=ü:áèäÙ ýøœ=Dš=h&¬¤€š=îÔš=ö䜚=ìáḚ=ÿôH›=p›=ççäçæáááxýâÌ/éÝ á@<0éÞ á @RáT䈛=ä8é ´›=à›=t7=ô:â,B=ä87=ü lœ=è›=2€èœ=üé@œ=ü:á¤-äÝ ÿátœ=2€è œ=üéÌœ=ü:áèäÞ ý´Ÿ=á=h&¬¤<=î=öäX=ìáát=ÿôž=,ž=ççäçæáááxýâÌ/éâ á@<0éã á @TáTäDž=ä8é pž=œž=t7=ô:â,B=ä87=ü (Ÿ=¤ž=2€èО=üéüž=ü:áèäâ ÿá0Ÿ=2€è\Ÿ=ü鈟=ü:áèäã ýp¢=¼Ÿ=h&¬¤øŸ=îL =öä =ìáá0 =ÿôÀ =è =ççäçæáááxýâÌ/éç á@<0éè á @WáTå¡=ä8é ,¡=X¡=t7=ô:â,B=ä87=ü ä¡=`¡=2€èŒ¡=ü鸡=ü:á´-äç ÿáì¡=2€è¢=üéD¢=ü:áèäè ý,¥=x¢=h&¬¤´¢=î£=öäТ=ìááì¢=ÿô|£=¤£=ççäçæáááxýâÌ/éì á@<0éí á @[áTä¼£=ä8é è£=¤=t7=ô:â,B=ä87=ü  ¤=¤=2€èH¤=üét¤=ü:áÄ-äì ÿᨤ=2€èÔ¤=üê¥=ü:áèäí ýè§=4¥=h&¬¤p¥=îÄ¥=ö䌥=ìáᨥ=ÿô8¦=`¦=ççäçæáááxýâÌ/éñ á@<0éò á @^áTäx¦=ä8é ¤¦=Ц=t7=ô:â,B=ä87=ü \§=ئ=2€è§=üé0§=ü:áüµäñ ÿád§=2€è§=üé¼§=ü:áèäò ýxª=ð§=h&¬¤,¨==öäH¨=ìáád¨=ÿôô¨=©=ççäçæáááxýâÌ/éö á@<0é÷ á @`áTä4©=ä8é `©=Œ©=ÈE=ô:â¸E=äF=ü ì©=”©=éÀ©=ü:áp¨äö ÿáô©=2€è ª=üéLª=ü:áèä÷ ý­=€ª=h&¬¤¼ª=î«=öäت=ìááôª=ÿô„«=¬«=ççäçæáááxýâÌ/éû á@<0éü á @cáTäÄ«=ä8é ð«=¬=t7=ô:â,B=ä87=ü |¬=$¬=éP¬=ü:á ¾äû ÿᄬ=2€è°¬=üéܬ=ü:á´-äü ýį=­=h&¬¤L­=î ­=öäh­=ìáá„­=ÿô®=<®=ççäçæáááxýâÌ/ê á@<0é á @fáTäT®=ä8é €®=¬®=t7=ô:â,B=ä87=ü 8¯=´®=2€èà®=üé ¯=ü:ᬨå ÿá@¯=2€èl¯=ü阯=ü:á´-ä ý€²=̯=h&¬¤°=î\°=öä$°=ìáá@°=ÿôа=ø°=ççäçæáááxýâÌ/é á@<0é á @háTä±=ä8é <±=h±=t7=ô:â,B=ä87=ü ô±=p±=2€èœ±=üéȱ=ü:á¤*ä ÿáü±=2€è(²=üéT²=ü:á´-ä ý<µ=ˆ²=h&¬¤IJ=î³=öäà²=ìááü²=ÿôŒ³=´³=ççäçæáááxýâÌ/é á@<0é á @jáTä̳=ä8é ø³=$´=t7=ô:â,B=ä87=ü °´=,´=2€èX´=üé„´=ü:á¤-ä ÿḴ=2€èä´=üéµ=ü:á´-ä ýø·=Dµ=h&¬¤€µ=îÔµ=ö䜵=ìáḵ=ÿôH¶=p¶=ççäçæáááxýâÌ/é á@<0é á @láT䈶=ä8é ´¶=à¶=t7=ô:â,B=ä87=ü l·=è¶=2€è·=üé@·=ü:áèä ÿát·=2€è ·=üéÌ·=ü:á´-ä ý´º=á¸=h&¬¤<¸=î¸=öäX¸=ìáát¸=ÿô¹=,¹=ççäçæáááxýâÌ/é á@<0é á @oáTäD¹=ä8é p¹=œ¹=t7=ô:â,B=ä87=ü (º=¤¹=2€èй=üéü¹=ü:á´-ä ÿá0º=2€è\º=ü鈺=ü:á´-ä ýp½=¼º=h&¬¤øº=îL»=öä»=ìáá0»=ÿôÀ»=è»=ççäçæáááxýâÌ/é á@<0é á @sáTå¼=ä8é ,¼=X¼=t7=ô:â,B=ä87=ü ä¼=`¼=2€èŒ¼=ü鸼=ü:áÄ-ä ÿáì¼=2€è½=üéD½=ü:á´-ä ý,À=x½=h&¬¤´½=î¾=öäн=ìááì½=ÿô|¾=¤¾=ççäçæáááxýâÌ/é á@<0é á @váTä¼¾=ä8é è¾=¿=t7=ô:â,B=ä87=ü  ¿=¿=2€èH¿=üét¿=ü:áüµä ÿᨿ=2€èÔ¿=üêÀ=ü:á´-ä ý¼Â=4À=h&¬¤pÀ=îÄÀ=öäŒÀ=ìáá¨À=ÿô8Á=`Á=ççäçæáááxýâÌ/é# á@<0é$ á @xáTäxÁ=ä8é ¤Á=ÐÁ=ÈE=ô:â¸E=äF=ü 0Â=ØÁ=éÂ=ü:áp¨ä# ÿá8Â=2€èdÂ=üéÂ=ü:á´-ä$ ýLÅ=ÄÂ=h&¬¤áÃ=îTÃ=öäÃ=ìáá8Ã=ÿôÈÃ=ðÃ=ççäçæáááxýâÌ/é( á@<0é) á @{áTäÄ=ä8é 4Ä=`Ä=t7=ô:â,B=ä87=ü ÀÄ=hÄ=é”Ä=ü:á ¾ä( ÿáÈÄ=2€èôÄ=üé Å=ü:áÄ-ä) ýÈ=TÅ=h&¬¤Å=îäÅ=öä¬Å=ìááÈÅ=ÿôXÆ=€Æ=ççäçæáááxýâÌ/é- á@<0é. á @~áTä˜Æ=ä8é ÄÆ=ðÆ=t7=ô:â,B=ä87=ü |Ç=øÆ=2€è$Ç=üéPÇ=ü:ᬨä- ÿá„Ç=2€è°Ç=üéÜÇ=ü:áÄ-ä. ýÄÊ=È=h&¬¤LÈ=î È=öähÈ=ìáá„È=ÿôÉ=<É=ççäçæáááxýâÌ/é2 á@<0é3 á @€áTäTÉ=ä8é €É=¬É=t7=ô:â,B=ä87=ü 8Ê=´É=2€èàÉ=üé Ê=ü:á¤*ä2 ÿá@Ê=2€èlÊ=üé˜Ê=ü:áÄ-ä3 ý€Í=ÌÊ=h&¬¤Ë=î\Ë=öä$Ë=ìáá@Ë=ÿôÐË=øË=ççäçæáááxýâÌ/é7 á@<0é8 á @‚áTäÌ=ä8é <Ì=hÌ=t7=ô:â,B=ä87=ü ôÌ=pÌ=2€èœÌ=üéÈÌ=ü:á¤-ä7 ÿáüÌ=2€è(Í=üéTÍ=ü:áÄ-ä8 ý<Ð=ˆÍ=h&¬¤ÄÍ=îÎ=öäàÍ=ìááüÍ=ÿôŒÎ=´Î=ççäçæáááxýâÌ/é< á@<0é= á @„áTäÌÎ=ä8é øÎ=$Ï=t7=ô:â,B=ä87=ü °Ï=,Ï=2€èXÏ=üé„Ï=ü:áèä< ÿá¸Ï=2€èäÏ=üéÐ=ü:áÄ-ä= ýøÒ=DÐ=h&¬¤€Ð=îÔÐ=öäœÐ=ìáá¸Ð=ÿôHÑ=pÑ=ççäçæáááxýâÌ/éA á@<0éB á @‡áTäˆÑ=ä8é ´Ñ=àÑ=t7=ô:â,B=ä87=ü lÒ=èÑ=2€èÒ=üé@Ò=ü:á´-äA ÿátÒ=2€è Ò=üéÌÒ=ü:áÄ-äB ý´Õ=áÓ=h&¬¤<Ó=îÓ=öäXÓ=ìáátÓ=ÿôÔ=,Ô=ççäçæáááxýâÌ/éF á@<0éG á @‹áTäDÔ=ä8é pÔ=œÔ=t7=ô:â,B=ä87=ü (Õ=¤Ô=2€èÐÔ=üéüÔ=ü:áÄ-äF ÿá0Õ=2€è\Õ=üéˆÕ=ü:áÄ-äG ýpØ=¼Õ=h&¬¤øÕ=îLÖ=öäÖ=ìáá0Ö=ÿôÀÖ=èÖ=ççäçæáááxýâÌ/éK á@<0éL á @ŽáTå×=ä8é ,×=X×=t7=ô:â,B=ä87=ü ä×=`×=2€èŒ×=üé¸×=ü:áüµäK ÿáì×=2€èØ=üéDØ=ü:áÄ-äL þÛ=xØ=h&¬¤´Ø=îÙ=öäÐØ=ìááìØ=ÿô|Ù=¤Ù=ççäçæáááxýâÌ/éP á@<0éQ á @áTä¼Ù=ä8é èÙ=Ú=ÈE=ô:â¸E=äF=ü tÚ=Ú=éHÚ=ü:áp¨äP ÿá|Ú=2€è¨Ú=üéÔÚ=ü:áÄ-äQ ýÝ=Û=h&¬¤DÛ=î˜Û=öä`Û=ìáá|Û=ÿô Ü=4Ü=ççäçæáááxýâÌ/éU á@<0éV á @’áTäLÜ=ä8é xÜ=¤Ü=t7=ô:â,B=ä87=ü Ý=¬Ü=éØÜ=ü:á ¾äU ÿá Ý=2€è8Ý=üédÝ=ü:áüµäV ýLà=˜Ý=h&¬¤ÔÝ=î(Þ=öäðÝ=ìáá Þ=ÿôœÞ=ÄÞ=ççäçæáááxýâÌ/éZ á@<0é[ á @”áTäÜÞ=ä8é ß=4ß=t7=ô:â,B=ä87=ü Àß=<ß=2€èhß=üé”ß=ü:ᬨäZ ÿáÈß=2€èôß=üé à=ü:áüµä[ ýã=Tà=h&¬¤à=îäà=öä¬à=ìááÈà=ÿôXá=€á=ççäçæáááxýâÌ/é_ á@<0é` á @–áTä˜á=ä8é Äá=ðá=t7=ô:â,B=ä87=ü |â=øá=2€è$â=üéPâ=ü:á¤*ä_ ÿá„â=2€è°â=üéÜâ=ü:áüµä` ýÄå=ã=h&¬¤Lã=î ã=öähã=ìáá„ã=ÿôä=<ä=ççäçæáááxýâÌ/éd á@<0ée á @˜áTäTä=ä8é €ä=¬ä=t7=ô:â,B=ä87=ü 8å=´ä=2€èàä=üé å=ü:á¤-äd ÿá@å=2€èlå=üé˜å=ü:áüµäe ý€è=Ìå=h&¬¤æ=î\æ=öä$æ=ìáá@æ=ÿôÐæ=øæ=ççäçæáááxýâÌ/éi á@<0éj á @šáTäç=ä8é <ç=hç=t7=ô:â,B=ä87=ü ôç=pç=2€èœç=üéÈç=ü:áèäi ÿáüç=2€è(è=üéTè=ü:áüµäj ý<ë=ˆè=h&¬¤Äè=îé=öäàè=ìááüè=ÿôŒé=´é=ççäçæáááxýâÌ/én á@<0éo á @áTäÌé=ä8é øé=$ê=t7=ô:â,B=ä87=ü °ê=,ê=2€èXê=üé„ê=ü:á´-än ÿá¸ê=2€èäê=üéë=ü:áüµäo ýøí=Dë=h&¬¤€ë=îÔë=öäœë=ìáá¸ë=ÿôHì=pì=ççäçæáááxýâÌ/és á@<0ét á @¡áTäˆì=ä8é ´ì=àì=t7=ô:â,B=ä87=ü lí=èì=2€èí=üé@í=ü:áÄ-äs ÿátí=2€è í=üéÌí=ü:áüµät ýˆð=áî=h&¬¤<î=îî=öäXî=ìáátî=ÿôï=,ï=ççäçæáááxýâÌ/éx á@<0éy á @¤áTäDï=ä8é pï=œï=ÈE=ô:â¸E=äF=ü üï=¤ï=éÐï=ü:áp¨äx ÿáð=2€è0ð=üé\ð=ü:áüµäy ýó=ð=h&¬¤Ìð=î ñ=öäèð=ìááñ=ÿô”ñ=¼ñ=ççäçæáááxýâÌ/é} á@<0é~ á @¦áTäÔñ=ä8ê ò=,ò=ÈE=ô:â¸E=äF=ü ¸ò=4ò=2€è`ò=üéŒò=ü:á ¾ä} ÿáÀò=éìò=ü:áp¨ä~ ý¨õ= ó=h&¬¤\ó=î°ó=öäxó=ìáá”ó=ÿô$ô=Lô=ççäçæáááxýâÌ/é‚ á@<0éƒ á @¨áTädô=ä8é ô=¼ô=ÈE=ô:â¸E=äF=ü Hõ=Äô=2€èðô=üéõ=ü:á¬¨ä‚ ÿáPõ=é|õ=ü:áp¨äƒ ý8ø=°õ=h&¬¤ìõ=î@ö=öäö=ìáá$ö=ÿô´ö=Üö=ççäçæáááxýâÌ/é‡ á@<0éˆ á @ªáTäôö=ä8é ÷=L÷=ÈE=ô:â¸E=äF=ü Ø÷=T÷=2€è€÷=üé¬÷=ü:á¤*ä‡ ÿáà÷=é ø=ü:áp¨äˆ ýÈú=@ø=h&¬¤|ø=îÐø=öä˜ø=ìáá´ø=ÿôDù=lù=ççäçæáááxýâÌ/éŒ á@<0é á @¬áTä„ù=ä8é °ù=Üù=ÈE=ô:â¸E=äF=ü hú=äù=2€èú=üé<ú=ü:á¤-äŒ ÿápú=éœú=ü:áp¨ä ýXý=Ðú=h&¬¤ û=î`û=öä(û=ìááDû=ÿôÔû=üû=ççäçæáááxýâÌ/é‘ á@<0é’ á @®áTäü=ä8é @ü=lü=ÈE=ô:â¸E=äF=ü øü=tü=2€è ü=üéÌü=ü:áèä‘ ÿâý=é,ý=ü:áp¨ä’ ýèÿ=`ý=h&¬¤œý=îðý=öä¸ý=ìááÔý=ÿôdþ=Œþ=ççäçæáááxýâÌ/é– á@<0é— á @±áTä¤þ=ä8é Ðþ=üþ=ÈE=ô:â¸E=äF=ü ˆÿ=ÿ=2€è0ÿ=üé\ÿ=ü:á´-ä– ÿáÿ=é¼ÿ=ü:áp¨ä— ýx>ðÿ=h&¬¤,>î€>öäH>ìáád>ÿôô>>ççäçæáááxýâÌ/é› á@<0éœ á @µáTä4>ä8é `>Œ>ÈE=ô:â¸E=äF=ü >”>2€èÀ>üéì>ü:áÄ-ä› ÿá >éL>ü:áp¨äœ ý>€>h&¬¤¼>î>öäØ>ìááô>ÿô„>¬>ççäçæáááxýâÌ/é  á@<0é¡ á @¸áTäÄ>ä8é ð>>ÈE=ô:â¸E=äF=ü ¨>$>2€èP>üé|>ü:áüµä  ÿá°>éÜ>ü:áp¨ä¡ ý˜>>h&¬¤L>î >öäh>ìáá„>ÿô><>ççäçæáááxýâÌ/é¥ á@<0é¦ á @ºáTäT>ä8é €>¬>t7=ô:â,B=ä87=ü 8>´>2€èà>üé >ü:á¬¨ä¥ ÿá@>él>ü:á ¾ä¦ ý( > >h&¬¤Ü>î0>öäø>ìáá>ÿô¤>Ì>ççäçæáááxýâÌ/éª á@<0é« á @¼áTää>ä8é  >< >t7=ô:â,B=ä87=ü È >D >2€èp >üéœ >ü:á¤*äª ÿáÐ >éü >ü:á ¾ä« ý¸ >0 >h&¬¤l >îÀ >öäˆ >ìáᤠ>ÿô4 >\ >ççäçæáááxýâÌ/é¯ á@<0é° á @¾áTät >ä8é   >Ì >t7=ô:â,B=ä87=ü X >Ô >2€é >üé, >ü:á¤-ä¯ ÿá` >éŒ >ü:á ¾ä° ýH>À >h&¬¤ü >îP >öä >ìáá4 >ÿôÄ >ì >ççäçæáááxýâÌ/é´ á@<0éµ á @ÀáTä>ä8é 0>\>t7=ô:â,B=ä87=ü è>d>2€è>üé¼>ü:áèä´ ÿáð>é>ü:á ¾äµ ýØ>P>h&¬¤Œ>îà>öä¨>ìááÄ>ÿôT>|>ççäçæáááxýâÌ/é¹ á@<0éº á @ÃáTä”>ä8é À>ì>t7=ô:â,B=ä87=ü x>ô>2€è >üéL>ü:á´-ä¹ ÿá€>é¬>ü:á ¾äº ýh>à>h&¬¤>îp>öä8>ìááT>ÿôä> >ççäçæáááxýâÌ/é¾ á@<0é¿ á @ÇáTä$>ä8é P>|>t7=ô:â,B=ä87=ü >„>2€è°>üéÜ>ü:áÄ-ä¾ ÿá>é<>ü:á ¾ä¿ ýø>p>h&¬¤¬>ï>öäÈ>ìááä>ÿôt>œ>ççäçæáááxýâÌ/éà á@<0éÄ á @ÊáTä´>ä8é à> >t7=ô:â,B=ä87=ü ˜>>2€è@>üél>ü:áüµäà ÿá >éÌ>ü:á ¾äÄ ÿâ>h&¬¤<>î>öäX>ìáát>ÿô>,>ççäçæáááxýâÌ/éÈ á@<0éÉ á @ÌáTäD>ä8é p>œ>ÈE=ô:â¸E=äF=ü ü>¤>éÐ>ü:áp¨äÈ ÿá>2€è0>üé\>ü:á ¾äÉ ÿátÊä˜>h&tÊÔ>ÿìäð>ïá >蜨-ì(>è¼Rö¼Rð4 äT>h&4 >ÿìä¬>ïÿá <ÍØ>x,ä4ü+äÈÍì>ð>h&ÈÍ,>äääd>öäH>ìýØ>ì>ççäçáæáááxýâÌ/êá ÀYáü:äd>ŠâZáü:äð>Šâ[áü:ä|>Šâ\áü:ä>Šâ^áü:ä”>ôñÿÿÿÿââ«æ@ÿäðÿáááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ°æ@ÿäðÿáááÿÿÿ÷â•æ@ôéÀ>ü:á ¾åý#>ô>h&ÈÍ0>îh>öäL>ìáýÜ>ð>ççäçæáááxýâÌ/é¯á @`á ä >ä8é 4 >¤">p >ô:â` >ä¨ >ü âp >æäŒ >ìýh&€Óp >äêä >öX!>l!>ççäçæáááxýâÌ/ébá @BáDÛä„!>ä2€è°!>ü8é Ü!>">,>ô:â">äð>ü â,>ê ">2€èL">üéx">ü:áüµäbÿá¬">éØ">ü:áüµä¯ý '> #>h&ÈÍH#>î€#>öäd#>ìáýô#>$>ççäçæáááxýâÌ/é³á @bá ä $>ä8é L$>¬&>ˆ$>ô:âx$>äÀ$>ü âˆ$>æä¤$>ìýh&áЈ$>äêü$>öp%>„%>ççäçæáááxýâÌ/éfá @DáDÛäœ%>ä2€èÈ%>ü8é ô%> &>,>ô:â">äð>ÿà(&>2€èT&>üé€&>ü:áp¨äfÿá´&>éà&>ü:áp¨ä³ý )>'>h&ÈÍP'>îˆ'>öäl'>ìáýü'>(>ççäçæáááxýâÌ/éá @6áTä((>ä8é T(>€(>,>ô:â">äð>ÿàˆ(>2€è´(>üéà(>ü:ᬨäý +>)>h&ÈÍP)>îˆ)>öäl)>ìáýü)>*>ççäçæáááxýâÌ/é á @8áTä(*>ä8é T*>€*>,>ô:â">äð>ÿàˆ*>2€è´*>üéà*>ü:á¤*ä ý ->+>h&ÈÍP+>îˆ+>öäl+>ìáýü+>,>ççäçæáááxýâÌ/éá @:áTä(,>ä8é T,>€,>,>ô:â">äð>ÿàˆ,>2€è´,>üéà,>ü:á¤-äý />->h&ÈÍP->îˆ->öäl->ìáýü->.>ççäçæáááxýâÌ/éá @<áTä(.>ä8é T.>€.>,>ô:â">äð>ÿàˆ.>2€è´.>üéà.>ü:áèäý 1>/>h&ÈÍP/>îˆ/>öäl/>ìáýü/>0>ççäçæáááxýâÌ/éá @?áTä(0>ä8é T0>€0>,>ô:â">äð>ÿàˆ0>2€è´0>üéà0>ü:á´-äÿá1>h&ÈÍP1>îˆ1>öäl1>ìáýü1>2>ççäçæáááxýâÌ/éá @CáTä(2>ä8é T2>€2>,>ô:â">äð>ÿàˆ2>2€è´2>üéà2>ü:áÄ-äÿáÈó äB>3>h&Èó X3>äääÈ3>öät3>ìá3>ø¬3>ÿ䬨ì<4>´4>ççäçáæáááxýâÌ/éWáÀ<0éXá À“¬¨äYá@l0é]á€øgè^á€Äeé_á €Ááü:ä¬6>äÂáü:äØ6>äÃáü:ä7>äÇáü:ä07>ŠâÈáü:ä¼7>ŠâÉáü:ìÉáü:äH8>ŠâËáü:äÔ8>ŠâÌáü:ä`9>ŠâÍáü:äì9>ŠâÎáü:äx:>ŠâÒáü:ä;>ŠâÓáü:ä;>ŠâÔáü:ä<>ŠâÕáü:ä¨<>ŠâÖáü:ä4=>Šâ×áü:äÀ=>ŠâØáü:äL>>ŠâÙáü:äØ>>ŠâÜáü:äd?>äÞáü:äŒB>ä>áç]ý>áç^ý>áç_ÿíðÿXááÿÿÿ÷â“æ@ÿäðÿWááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¾æ@ÿä ðÿäÿûâ¨æAÿä ðÿäáðáÿââæ ÿäðÿÿäáâ¸Oÿñâ,å @ÿãðÿ]ááÿÿÿ÷â•æ@ÿäðÿWááÿÿÿ÷â“æ@ÿäðÿXááÿÿÿ÷â“æ@ÿäñÿÿÿÿââæ@ÿä ðÿ^ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿä ðÿ_ááÿÿÿ÷â˜æ@ÿä ðÿ^ááÿÿÿ÷âŸå€Àÿäðÿäÿûâ•æ@ôé?>$@>øé¼?>üᬨäè?>ü:á@>äYý ⬨æ2€èP@>üé|@>XA>ø2€è¨@>üéÔ@>,A>øêA>ü:á´-ä_ý4êÿÿÿûé„A>`B>ø2€è°A>üéÜA>4B>øéB>ü:á´-ä_ý4ê þ4í€ûé¸B>ü:á ¾ä]ýhI>ìB>h&Èó (C>î˜C>öäDC>ìáá`C>ø|C>ÿ䬨ì D>HD>ççäçæáááxýâÌ/éùá@<0éúá@l0ᬨäûá @œá ä`D>ä8é ŒD>HH>ÈD>ô:â¸D>ä8E>ü âÈD>æääD>ìâE>øE>ÿ䬨ìh& ¸ÈD>äêtE>öèE>$F>ççäçæáááxýâÌ/é¼á@<0é½á@l0ᬨä¾á @†áDÛää2€èhF>ü8é ”F>ÐF>X3>ô:âÀF>ä3>ü âX3>æ \G>ØF>2€èG>üé0G>ü:áüµä¼ý èG>dG>2€èG>üé¼G>ü:áüµä½ÿáðG>ᬨäH>ü:á@>ä¾ý ¨H>PH>é|H>ü:áüµäùý I>°H>éÜH>ü:áüµäúÿáI>ᬨäü:á@>äûýÜO>pI>h&Èó ¬I>îJ>öäÈI>ìááäI>ùJ>ÿ䬨ìJ>ÌJ>ççäçæáááxýâÌ/éÿá@<0êá@l0ᬨäá @žá ääJ>ä8é K>¼N>LK>ô:âä¼K>ü âLK>æähK>ìá„K>ø K>ÿ䬨ìh&ü³LK>äêøK>ölL>¨L>ççäçæáááxýâÌ/éÂá@<0éÃá@l0ᬨäÄá @ˆáDÛäÀL>ä2€èìL>ü8é M>DM>X3>ô:âÀF>ä3>ü ÐM>LM>2€èxM>üé¤M>ü:áp¨äÂý \N>ØM>2€èN>üé0N>ü:áp¨äÃÿádN>ᬨäN>ü:á@>äÄý O>ÄN>éðN>ü:áp¨äÿý |O>$O>éPO>ü:áp¨åÿá„O>ᬨä°O>ü:á@>äýüR>äO>h&Èó P>îP>öä

ìááXP>øtP>ÿ䬨ìQ>@Q>ççäçæáááxýâÌ/éšá@<0é›á@l0ᬨäœá @x áTäXQ>ä8é „Q>°Q>X3>ô:âÀF>ä3>ü R>¸Q>éäQ>ü:á ¾äšý œR>R>2€èDR>üépR>ü:ᬨä›ÿá¤R>ᬨäÐR>ü:á@>äœýHV>S>h&Èó @S>î°S>öä\S>ìááxS>ø”S>ÿ䬨ì$T>`T>ççäçæáááxýâÌ/é á@<0é¡á@l0ᬨä¢á @z áTäxT>ä8é ¤T>ÐT>X3>ô:âÀF>ä3>ü \U>ØT>2€èU>üé0U>ü:ᬨä ý èU>dU>2€èU>üé¼U>ü:ᬨä¡ÿáðU>ᬨäV>ü:á@>ä¢ý”Y>PV>h&Èó ŒV>îüV>öä¨V>ìááÄV>øàV>ÿ䬨ìpW>¬W>ççäçæáááxýâÌ/é¦á@<0é§á@l0ᬨä¨á @| áTäÄW>ä8é ðW>X>X3>ô:âÀF>ä3>ü ¨X>$X>2€èPX>üé|X>ü:á¤*ä¦ý 4Y>°X>2€èÜX>üéY>ü:ᬨä§ÿáᬨähY>ü:á@>ä¨ýà\>œY>h&Èó ØY>îHZ>öäôY>ìááZ>ø,Z>ÿ䬨ì¼Z>øZ>ççäçæáááxýâÌ/é¬á@<0é­á@l0ᬨä®á @~ áTä[>ä8é <[>h[>X3>ô:âÀF>ä3>ü ô[>p[>2€èœ[>üéÈ[>ü:á¤-ä¬ý €\>ü[>2€è(\>üéT\>ü:ᬨä­ÿáˆ\>ᬨä´\>ü:á@>ä®ý,`>è\>h&Èó $]>î”]>öä@]>ìáá\]>øx]>ÿ䬨ì^>D^>ççäçæáááxýâÌ/é²á@<0é³á@l0ᬨä´á @€ áTä\^>ä8é ˆ^>´^>X3>ô:âÀF>ä3>ü @_>¼^>2€èè^>üé_>ü:áèä²ý Ì_>H_>2€èt_>üé _>ü:ᬨä³ÿáÔ_>ᬨå`>ü:á@>ä´ýxc>4`>h&Èó p`>îà`>öäŒ`>ìáá¨`>øÄ`>ÿ䬨ìTa>a>ççäçæáááxýâÌ/é¸á@<0é¹á@l0ᬨäºá @ƒ áTä¨a>ä8éÔa>áb>X3>ô:âÀF>ä3>ü Œb>b>2€è4b>üé`b>ü:á´-ä¸ý c>”b>2€èÀb>üéìb>ü:ᬨä¹ÿá c>ᬨäLc>ü:á@>äºýÄf>€c>h&Èó ¼c>î,d>öäØc>ìááôc>ød>ÿ䬨ì d>Üd>ççäçæáááxýâÌ/é¾á@<0é¿á@l0ᬨäÀá @‡ áTäôd>ä8é e>Le>X3>ô:âÀF>ä3>ü Øe>Te>2€è€e>üé¬e>ü:áÄ-ä¾ý df>àe>2€è f>üé8f>ü:ᬨä¿ÿálf>ᬨä˜f>ü:á@>äÀýj>Ìf>h&Èó g>îxg>öä$g>ìáá@g>ø\g>ÿ䬨ììg>(h>ççäçæáááxýâÌ/éÄá@<0éÅá@l0ᬨäÆá @Š áTä@h>ä8é lh>˜h>X3>ô:âÀF>ä3>ü $i> h>2€èÌh>üéøh>ü:áüµäÄý °i>,i>2€èXi>üé„i>ü:ᬨäÅÿá¸i>ᬨääi>ü:á@>äÆý0m>j>h&Èó Tj>îÄj>öäpj>ìááŒj>ø¨j>ÿ䬨ì8k>tk>ççäçæáááxýâÌ/éÊá@<0éËá@l0ᬨäÌá @Œ áTäŒk>ä8é ¸k>äk>LK>ô:âä¼K>ü Dl>ìk>él>ü:áp¨äÊý Ðl>Ll>2€èxl>üé¤l>ü:ᬨäËÿáØl>ᬨäm>ü:á@>äÌýPp>8m>h&Èó tm>îäm>öäm>ìáá¬m>øÈm>ÿ䬨ìXn>”n>ççäçæáááxýâÌ/éÐá@<0éÑá@l0ᬨäÒá @Ž áTä¬n>ä8é Øn>o>X3>ô:âÀF>ä3>ü do> o>é8o>ü:á ¾äÐý ðo>lo>2€è˜o>üéÄo>ü:á¤*äÑÿáøo>ᬨä$p>ü:á@>äÒýœs>Xp>h&Èó ”p>îq>öä°p>ìááÌp>øèp>ÿ䬨ìxq>´q>ççäçæáááxýâÌ/éÖá@<0é×á@l0ᬨäØá @ áTäÌq>ä8é øq>$r>X3>ô:âÀF>ä3>ü °r>,r>2€èXr>üé„r>ü:ᬨäÖý ¸r>2€èär>üés>ü:á¤*ä×ÿáDs>ᬨäps>ü:á@>äØýèv>¤s>h&Èó às>îPt>öäüs>ìáát>ø4t>ÿ䬨ìÄt>áu>ççäçæáááxýâÌ/éÜá@<0éÝá@l0ᬨäÞá @’ áTäu>ä8é Du>pu>X3>ô:âÀF>ä3>ü üu>xu>2€è¤u>üéÐu>ü:á¤*äÜý ˆv>v>2€è0v>üé\v>ü:á¤*äÝÿáv>ᬨä¼v>ü:á@>äÞý4z>ðv>h&Èó ,w>îœw>öäHw>ìáádw>ø€w>ÿ䬨ìx>Lx>ççäçæáááxýâÌ/éâá@<0éãá@l0ᬨääá @” áTädx>ä8é x>¼x>X3>ô:âÀF>ä3>ü Hy>Äx>2€èðx>üéy>ü:á¤-äâý Ôy>Py>2€è|y>üé¨y>ü:á¤*äãÿáÜy>ᬨäz>ü:á@>ääý€}>h&Èó xz>îèz>öä”z>ìáá°z>øÌz>ÿ䬨ì\{>˜{>ççäçæáááxýâÌ/éèá@<0ééá@l0ᬨäêá @– áTä°{>ä8é Ü{>|>X3>ô:âÀF>ä3>ü ”|>|>2€è<|>üéh|>ü:áèäèý }>œ|>2€èÈ|>üéô|>ü:á¤*äéÿá(}>ᬨäT}>ü:á@>äêýÌ€>ˆ}>h&Èó Ä}>î4~>öäà}>ìááü}>ø~>ÿ䬨ì¨~>ä~>ççäçæáááxýâÌ/éîá@<0éïá@l0ᬨäðá @™ áTäü~>ä8é (>T>X3>ô:âÀF>ä3>ü à>\>2€èˆ>üé´>ü:á´-äîý l€>è>2€è€>üé@€>ü:á¤*äïÿát€>ᬨ䠀>ü:á@>äðý„>Ô€>h&Èó >î€>öä,>ìááH>ød>ÿ䬨ìô>0‚>ççäçæáááxýâÌ/éôá@<0éõá@l0ᬨäöá @ áTäH‚>ä8é t‚> ‚>X3>ô:âÀF>ä3>ü ,ƒ>¨‚>2€èÔ‚>üêƒ>ü:áÄ-äôý ¸ƒ>4ƒ>2€è`ƒ>ü錃>ü:á¤*äõÿáÀƒ>ᬨäìƒ>ü:á@>äöýd‡> „>h&Èó \„>îÌ„>öäx„>ìáᔄ>ø°„>ÿ䬨ì@…>|…>ççäçæáááxýâÌ/éúá@<0éûá@l0ᬨäüá @  áTä”…>ä8é À…>ì…>X3>ô:âÀF>ä3>ü x†>ô…>2€è †>üéL†>ü:áüµäúý ‡>€†>2€è¬†>üé؆>ü:á¤*äûÿá ‡>ᬨä8‡>ü:á@>äüý„Š>l‡>h&Èó ¨‡>îˆ>öäć>ìááà‡>øü‡>ÿ䬨쌈>Ȉ>ççäçæáááxýâÌ/êá@<0éá@l0ᬨäá @¢ áTäàˆ>ä8é ‰>8‰>LK>ô:âä¼K>ü ˜‰>@‰>él‰>ü:áp¨åý $Š> ‰>2€è̉>üéø‰>ü:á¤*äÿá,Š>ᬨäXŠ>ü:á@>äý¤>ŒŠ>h&Èó ÈŠ>î8‹>öääŠ>ìáâ‹>ø‹>ÿ䬨쬋>è‹>ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @¤ áTåŒ>ä8é ,Œ>XŒ>X3>ô:âÀF>ä3>ü ¸Œ>`Œ>錌>ü:á ¾äý D>ÀŒ>2€èìŒ>üé>ü:á¤-äÿáL>ᬨäx>ü:á@>äýð>¬>h&Èó è>îXŽ>öäŽ>ìáá Ž>ø<Ž>ÿ䬨ìÌŽ>>ççäçæáááxýâÌ/é á@<0é á@l0ᬨäá @¦ áTä >ä8é L>x>X3>ô:âÀF>ä3>ü >€>2€è¬>üéØ>ü:ᬨä ý > >2€è8>üéd>ü:á¤-ä ÿá˜>ᬨäÄ>ü:á@>äý<”>ø>h&Èó 4‘>>öäP‘>ìáál‘>øˆ‘>ÿ䬨ì’>T’>ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @¨ áTäl’>ä8é ˜’>Ä’>X3>ô:âÀF>ä3>ü P“>Ì’>2€èø’>üé$“>ü:á¤*äý Ü“>X“>2€è„“>üé°“>ü:á¤-äÿáä“>ᬨä”>ü:á@>äýˆ—>D”>h&Èó €”>îð”>ö䜔>ìáḔ>øÔ”>ÿ䬨ìd•> •>ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @ª áT丕>ä8é ä•>–>X3>ô:âÀF>ä3>ü œ–>–>2€èD–>üép–>ü:á¤-äý (—>¤–>2€èЖ>üéü–>ü:á¤-äÿá0—>ᬨä\—>ü:á@>äýÔš>—>h&Èó Ì—>î<˜>öäè—>ìáá˜>ø ˜>ÿ䬨찘>ì˜>ççäçæáááxýâÌ/éá@<0éá@l0ᬨä á @¬ áTä™>ä8é 0™>\™>X3>ô:âÀF>ä3>ü è™>d™>2€è™>üé¼™>ü:áèäý tš>ð™>2€èš>üéHš>ü:á¤-äÿá|š>ᬨ䨚>ü:á@>ä ý ž>Üš>h&Èó ›>>öä4›>ìááP›>øl›>ÿ䬨ìü›>8œ>ççäçæáááxýâÌ/é$á@<0é%á@l0ᬨä&á @¯ áTäPœ>ä8é |œ>¨œ>X3>ô:âÀF>ä3>ü 4>°œ>2€èÜœ>üé>ü:á´-ä$ý À><>2€èh>üé”>ü:á¤-ä%ÿáÈ>ᬨäô>ü:á@>ä&ýl¡>(ž>h&Èó dž>îÔž>ö䀞>ìá᜞>ø¸ž>ÿ䬨ìHŸ>„Ÿ>ççäçæáááxýâÌ/é*á@<0é+á@l0ᬨä,á @³ áT䜟>ä8é ÈŸ>ôŸ>X3>ô:âÀF>ä3>ü € >üŸ>2€è( >üéT >ü:áÄ-ä*ý ¡>ˆ >2€è´ >üéà >ü:á¤-ä+ÿá¡>ᬨä@¡>ü:á@>ä,ý¸¤>t¡>h&Èó °¡>î ¢>öäÌ¡>ìááè¡>ø¢>ÿ䬨씢>Т>ççäçæáááxýâÌ/é0á@<0é1á@l0ᬨä2á @¶ áTäè¢>ä8é £>@£>X3>ô:âÀF>ä3>ü Ì£>H£>2€èt£>üé £>ü:áüµä0ý X¤>Ô£>2€é¤>üé,¤>ü:á¤-ä1ÿá`¤>ᬨ䌤>ü:á@>ä2ýا>À¤>h&Èó ü¤>îl¥>öä¥>ìáá4¥>øP¥>ÿ䬨ìà¥>¦>ççäçæáááxýâÌ/é6á@<0é7á@l0ᬨä8á @¸ áTä4¦>ä8é `¦>Œ¦>LK>ô:âä¼K>ü ì¦>”¦>éÀ¦>ü:áp¨ä6ý x§>ô¦>2€è §>üéL§>ü:á¤-ä7ÿဧ>ᬨ䬧>ü:á@>ä8ýøª>à§>h&Èó ¨>>öä8¨>ìááT¨>øp¨>ÿ䬨ìá ©><©>ççäçæáááxýâÌ/é<á@<0é=á@l0ᬨä>á @º áTäT©>ä8é €©>¬©>X3>ô:âÀF>ä3>ü ª>´©>éà©>ü:á ¾ä<ý ˜ª>ª>2€è@ª>üélª>ü:áèä=ÿá ª>ᬨä̪>ü:á@>ä>ýD®>á«>h&Èó <«>>öäX«>ìáát«>ø«>ÿä¬¨ì ¬>\¬>ççäçæáááxýâÌ/éBá@<0éCá@l0ᬨäDá @¼ áTät¬>ä8é  ¬>̬>X3>ô:âÀF>ä3>ü X­>Ô¬>2€é­>üé,­>ü:ᬨäBý ä­>`­>2€èŒ­>ü鸭>ü:áèäCÿáì­>ᬨä®>ü:á@>äDý±>L®>h&Èó ˆ®>îø®>ö䤮>ìááÀ®>øÜ®>ÿ䬨ìl¯>¨¯>ççäçæáááxýâÌ/éHá@<0éIá@l0ᬨäJá @¾ áTäÀ¯>ä8é ì¯>°>X3>ô:âÀF>ä3>ü ¤°> °>2€èL°>üéx°>ü:á¤*äHý 0±>¬°>2€èذ>üé±>ü:áèäIÿá8±>ᬨäd±>ü:á@>äJýÜ´>˜±>h&Èó Ô±>îD²>öäð±>ìáá ²>ø(²>ÿ䬨츲>ô²>ççäçæáááxýâÌ/éNá@<0éOá@l0ᬨäPá @À áTä ³>ä8é 8³>d³>X3>ô:âÀF>ä3>ü ð³>l³>2€è˜³>üéij>ü:á¤-äNý |´>ø³>2€è$´>üéP´>ü:áèäOÿá„´>ᬨ䰴>ü:á@>äPý(¸>ä´>h&Èó µ>îµ>öä<µ>ìááXµ>øtµ>ÿ䬨ì¶>@¶>ççäçæáááxýâÌ/éTá@<0éUá@l0ᬨäVá @ áTäX¶>ä8é „¶>°¶>X3>ô:âÀF>ä3>ü <·>¸¶>2€èä¶>üé·>ü:áèäTý È·>D·>2€èp·>ü霷>ü:áèäUÿáз>ᬨäü·>ü:á@>äVýt»>0¸>h&Èó l¸>îܸ>ö䈸>ìáᤸ>øÀ¸>ÿ䬨ìP¹>Œ¹>ççäçæáááxýâÌ/éZá@<0é[á@l0ᬨä\á @Å áT䤹>ä8é й>ü¹>X3>ô:âÀF>ä3>ü ˆº>º>2€è0º>üé\º>ü:á´-äZý »>º>2€è¼º>üéèº>ü:áèä[ÿá»>ᬨäH»>ü:á@>ä\ýÀ¾>|»>h&Èó ¸»>î(¼>öäÔ»>ìááð»>ø ¼>ÿ䬨으>ؼ>ççäçæáááxýâÌ/é`á@<0éaá@l0ᬨäbá @É áTäð¼>ä8é ½>H½>X3>ô:âÀF>ä3>ü Ô½>P½>2€è|½>ü騽>ü:áÄ-ä`ý `¾>ܽ>2€è¾>üé4¾>ü:áèäaÿáh¾>ᬨ䔾>ü:á@>äbý Â>Ⱦ>h&Èó ¿>ît¿>öä ¿>ìáá<¿>øX¿>ÿ䬨ìè¿>$À>ççäçæáááxýâÌ/éfá@<0égá@l0ᬨähá @Ì áTä<À>ä8é hÀ>”À>X3>ô:âÀF>ä3>ü Á>œÀ>2€èÈÀ>üéôÀ>ü:áüµäfý ¬Á>(Á>2€èTÁ>üé€Á>ü:áèägÿá´Á>ᬨäàÁ>ü:á@>ähý,Å>Â>h&Èó PÂ>îÀÂ>öälÂ>ìááˆÂ>ø¤Â>ÿ䬨ì4Ã>pÃ>ççäçæáááxýâÌ/élá@<0émá@l0ᬨäná @Î áTäˆÃ>ä8é ´Ã>àÃ>LK>ô:âä¼K>ü @Ä>èÃ>éÄ>ü:áp¨älý ÌÄ>HÄ>2€ètÄ>üé Ä>ü:áèämÿáÔÄ>ᬨåÅ>ü:á@>änýLÈ>4Å>h&Èó pÅ>îàÅ>öäŒÅ>ìáá¨Å>øÄÅ>ÿ䬨ìTÆ>Æ>ççäçæáááxýâÌ/érá@<0ésá@l0ᬨätá @Ñ áT䍯>ä8éÔÆ>áÇ>X3>ô:âÀF>ä3>ü `Ç>Ç>é4Ç>ü:á ¾ärý ìÇ>hÇ>2€è”Ç>üéÀÇ>ü:á´-äsÿáôÇ>ᬨä È>ü:á@>ätý˜Ë>TÈ>h&Èó È>ïÉ>öä¬È>ìááÈÈ>øäÈ>ÿ䬨ìtÉ>°É>ççäçæáááxýâÌ/éxá@<0éyá@l0ᬨäzá @Ô áTäÈÉ>ä8é ôÉ> Ê>X3>ô:âÀF>ä3>ü ¬Ê>(Ê>2€èTÊ>üé€Ê>ü:ᬨäxý 8Ë>´Ê>2€èàÊ>üé Ë>ü:á´-äyÿá@Ë>ᬨälË>ü:á@>äzýäÎ> Ë>h&Èó ÜË>îLÌ>öäøË>ìááÌ>ø0Ì>ÿ䬨ìÀÌ>üÌ>ççäçæáááxýâÌ/é~á@<0éá@l0ᬨä€á @Ö áTäÍ>ä8é @Í>lÍ>X3>ô:âÀF>ä3>ü øÍ>tÍ>2€è Í>üéÌÍ>ü:á¤*ä~ý„Î>áÎ>2€è,Î>üéXÎ>ü:á´-äÿáŒÎ>ᬨä¸Î>ü:á@>ä€ý0Ò>ìÎ>h&Èó (Ï>î˜Ï>öäDÏ>ìáá`Ï>ø|Ï>ÿ䬨ì Ð>HÐ>ççäçæáááxýâÌ/é„á@<0é…á@l0ᬨä†á @Ø áTä`Ð>ä8é ŒÐ>¸Ð>X3>ô:âÀF>ä3>ü DÑ>ÀÐ>2€èìÐ>üéÑ>ü:á¤-ä„ý ÐÑ>LÑ>2€èxÑ>üé¤Ñ>ü:á´-ä…ÿáØÑ>ᬨäÒ>ü:á@>ä†ý|Õ>8Ò>h&Èó tÒ>îäÒ>öäÒ>ìáá¬Ò>øÈÒ>ÿ䬨ìXÓ>”Ó>ççäçæáááxýâÌ/éŠá@<0é‹á@l0ᬨäŒá @Ú áTä¬Ó>ä8é ØÓ>Ô>X3>ô:âÀF>ä3>ü Ô> Ô>2€è8Ô>üédÔ>ü:áèäŠý Õ>˜Ô>2€èÄÔ>üéðÔ>ü:á´-ä‹ÿá$Õ>ᬨäPÕ>ü:á@>äŒýÈØ>„Õ>h&Èó ÀÕ>î0Ö>öäÜÕ>ìááøÕ>øÖ>ÿ䬨ì¤Ö>àÖ>ççäçæáááxýâÌ/éá@<0é‘á@l0ᬨä’á @Ý áTäøÖ>ä8é $×>P×>X3>ô:âÀF>ä3>ü Ü×>X×>2€è„×>üé°×>ü:á´-äý hØ>ä×>2€èØ>üé<Ø>ü:á´-ä‘ÿápØ>á¬¨äœØ>ü:á@>ä’ýÜ>ÐØ>h&Èó Ù>î|Ù>öä(Ù>ìááDÙ>ø`Ù>ÿ䬨ìðÙ>,Ú>ççäçæáááxýâÌ/é–á@<0é—á@l0ᬨä˜á @á áTäDÚ>ä8é pÚ>œÚ>X3>ô:âÀF>ä3>ü (Û>¤Ú>2€èÐÚ>üéüÚ>ü:áÄ-ä–ý ´Û>0Û>2€è\Û>üéˆÛ>ü:á´-ä—ÿá¼Û>ᬨäèÛ>ü:á@>ä˜ý`ß>Ü>h&Èó XÜ>îÈÜ>öätÜ>ìááÜ>ø¬Ü>ÿ䬨ì<Ý>xÝ>ççäçæáááxýâÌ/éœá@<0éá@l0ᬨäžá @ä áTäÝ>ä8é ¼Ý>èÝ>X3>ô:âÀF>ä3>ü tÞ>ðÝ>2€èÞ>üéHÞ>ü:áüµäœþ ß>|Þ>2€è¨Þ>üéÔÞ>ü:á´-äÿáß>ᬨä4ß>ü:á@>äžý€â>hß>h&Èó ¤ß>îà>öäÀß>ìááÜß>øøß>ÿ䬨ìˆà>Äà>ççäçæáááxýâÌ/é¢á@<0é£á@l0ᬨä¤á @æ áTäÜà>ä8é á>4á>LK>ô:âä¼K>ü ”á><á>éhá>ü:áp¨ä¢ý â>œá>2€èÈá>üéôá>ü:á´-ä£ÿá(â>ᬨäTâ>ü:á@>ä¤ý å>ˆâ>h&Èó Äâ>î4ã>öäàâ>ìááüâ>øã>ÿ䬨ì¨ã>äã>ççäçæáááxýâÌ/é¨á@<0é©á@l0ᬨäªá @é áTäüã>ä8é (ä>Tä>X3>ô:âÀF>ä3>ü ´ä>\ä>éˆä>ü:á ¾ä¨ý @å>¼ä>2€èèä>üéå>ü:áÄ-ä©ÿáHå>ᬨätå>ü:á@>äªýìè>¨å>h&Èó äå>îTæ>öåæ>ìááæ>ø8æ>ÿ䬨ìÈæ>ç>ççäçæáááxýâÌ/é®á@<0é¯á@l0ᬨä°á @ì áTäç>ä8é Hç>tç>X3>ô:âÀF>ä3>ý è>|ç>2€è¨ç>üéÔç>ü:ᬨä®ý Œè>è>2€è4è>üé`è>ü:áÄ-ä¯ÿá”è>ᬨäÀè>ü:á@>ä°ý8ì>ôè>h&Èó 0é>î é>öäLé>ìááhé>ø„é>ÿ䬨ìê>Pê>ççäçæáááxýâÌ/é´á@<0éµá@l0ᬨä¶á @î áTähê>ä8é ”ê>Àê>X3>ô:âÀF>ä3>ü Lë>Èê>2€èôê>üé ë>ü:á¤*ä´ý Øë>Të>2€è€ë>üé¬ë>ü:áÄ-äµÿáàë>ᬨä ì>ü:á@>ä¶ý„ï>@ì>h&Èó |ì>îìì>öä˜ì>ìáá´ì>øÐì>ÿ䬨ì`í>œí>ççäçæáááxýâÌ/éºá@<0é»á@l0ᬨä¼á @ð áTä´í>ä8é àí> î>X3>ô:âÀF>ä3>ü ˜î>î>2€è@î>üélî>ü:á¤-äºý $ï> î>2€èÌî>üéøî>ü:áÄ-ä»ÿá,ï>ᬨäXï>ü:á@>ä¼ýÐò>Œï>h&Èó Èï>î8ð>öääï>ìáâð>øð>ÿ䬨ì¬ð>èð>ççäçæáááxýâÌ/éÀá@<0éÁá@l0ᬨäÂá @ò áTåñ>ä8é ,ñ>Xñ>X3>ô:âÀF>ä3>ü äñ>`ñ>2€èŒñ>üé¸ñ>ü:áèäÀý pò>ìñ>2€èò>üéDò>ü:áÄ-äÁÿáxò>ᬨä¤ò>ü:á@>äÂýö>Øò>h&Èó ó>î„ó>öä0ó>ìááLó>øhó>ÿ䬨ìøó>4ô>ççäçæáááxýâÌ/éÆá@<0éÇá@l0ᬨäÈá @õ áTäLô>ä8é xô>¤ô>X3>ô:âÀF>ä3>ü 0õ>¬ô>2€èØô>üéõ>ü:á´-äÆý ¼õ>8õ>2€èdõ>üéõ>ü:áÄ-äÇÿáÄõ>ᬨäðõ>ü:á@>äÈýhù>$ö>h&Èó `ö>îÐö>öä|ö>ìáá˜ö>ø´ö>ÿ䬨ìD÷>€÷>ççäçæáááxýâÌ/éÌá@<0éÍá@l0ᬨäÎá @ù áTä˜÷>ä8é Ä÷>ð÷>X3>ô:âÀF>ä3>ü |ø>ø÷>2€è$ø>üéPø>ü:áÄ-äÌý ù>„ø>2€è°ø>üéÜø>ü:áÄ-äÍÿáù>ᬨä<ù>ü:á@>äÎý´ü>pù>h&Èó ¬ù>îú>öäÈù>ìááäù>ùú>ÿ䬨ìú>Ìú>ççäçæáááxýâÌ/éÒá@<0éÓá@l0ᬨäÔá @ü áTääú>ä8é û><û>X3>ô:âÀF>ä3>ü Èû>Dû>2€èpû>üéœû>ü:áüµäÒý Tü>Ðû>2€èüû>üé(ü>ü:áÄ-äÓÿá\ü>ᬨäˆü>ü:á@>äÔýÔÿ>¼ü>h&Èó øü>îhý>öäý>ìáá0ý>øLý>ÿ䬨ìÜý>þ>ççäçæáááxýâÌ/éØá@<0éÙá@l0ᬨäÚá @þ áTä0þ>ä8é \þ>ˆþ>LK>ô:âä¼K>ü èþ>þ>é¼þ>ü:áp¨äØý tÿ>ðþ>2€èÿ>üéHÿ>ü:áÄ-äÙÿá|ÿ>ᬨä¨ÿ>ü:á@>äÚýô?Üÿ>h&Èó ?îˆ?öä4?ìááP?øl?ÿ䬨ìü?8?ççäçæáááxýâÌ/éÞá@<0éßá@l0ᬨäàá@á áTäP?ä8é |?¨?X3>ô:âÀF>ä3>ü ?°?éÜ?ü:á ¾äÞý ”??2€è<?üéh?ü:áüµäßÿáœ?ᬨäÈ?ü:á@>äàý@?ü?h&Èó 8?î¨?öäT?ìááp?øŒ?ÿ䬨ì?X?ççäçæáááxýâÌ/éäá@<0éåá@l0ᬨäæá @ áTäp?ä8é œ?È?X3>ô:âÀF>ä3>ü T?Ð?2€èü?üé(?ü:ᬨääý à?\?2€èˆ?üé´?ü:áüµäåÿáè?ᬨä?ü:á@>äæýŒ ?H?h&Èó „?îô?öä ?ìáá¼?øØ?ÿ䬨ìh?¤?ççäçæáááxýâÌ/éêá@<0éëá@l0ᬨäìá @ áTä¼?ä8é è??X3>ô:âÀF>ä3>ü  ??2€èH?üét?ü:á¤*äêý , ?¨?2€èÔ?üê ?ü:áüµäëÿá4 ?ᬨä` ?ü:á@>äìýØ ?” ?h&Èó Ð ?î@ ?öäì ?ìáá ?ø$ ?ÿä¬¨ì´ ?ð ?ççäçæáááxýâÌ/éðá@<0éñá@l0ᬨäòá @ áTä ?ä8é 4 ?` ?X3>ô:âÀF>ä3>ü ì ?h ?2€è” ?üéÀ ?ü:á¤-äðý x ?ô ?2€è ?üéL ?ü:áüµäñÿဠ?á¬¨ä¬ ?ü:á@>äòý$?à ?h&Èó  ?îŒ ?öä8 ?ìááT ?øp ?ÿ䬨ìá ?<?ççäçæáááxýâÌ/éöá@<0é÷á@l0ᬨäøá @ áTäT?ä8é €?¬?X3>ô:âÀF>ä3>ü 8?´?2€èà?üé ?ü:áèäöý Ä?@?2€èl?üé˜?ü:áüµä÷ÿáÌ?ᬨäø?ü:á@>äøýp?,?h&Èó h?îØ?öä„?ìáá ?ø¼?ÿ䬨ìL?ˆ?ççäçæáááxýâÌ/éüá@<0éýá@l0ᬨäþá @ áTä ?ä8é Ì?ø?X3>ô:âÀF>ä3>ü„?á?2€è,?üéX?ü:á´-äüý ?Œ?2€è¸?üéä?ü:áüµäýÿá?ᬨäD?ü:á@>äþý¼?x?h&Èó ´?î$?öäÐ?ìááì?ø?ÿ䬨ì˜?Ô?ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @ áTäì?ä8é ?D?X3>ô:âÀF>ä3>ü Ð?L?2€èx?üé¤?ü:áÄ-äý \?Ø?2€è?üé0?ü:áüµäÿád?ᬨä?ü:á@>äýÜ?Ä?h&Èó á?îp?öä?ìáá8?øT?ÿ䬨ìä? ?ççäçæáááxýâÌ/éá@<0é á@l0ᬨä á @ áTä8?ä8é d??LK>ô:âä¼K>ü ð?˜?éÄ?ü:áp¨äý |?ø?2€è$?üéP?ü:áüµä ÿá„?ᬨä°?ü:á@>ä ýü?ä?h&Èó ?î?öä<?ìááX?øt?ÿ䬨ì?@?ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @ áTäX?ä8é „?°?LK>ô:âä¼K>ü <?¸?2€èä?üé?ü:á ¾äý œ?D?ép?ü:áp¨äÿá¤?ᬨäÐ?ü:á@>äý ??h&Èó @?î°?öä\?ìááx?ø”?ÿ䬨ì$?`?ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @ áTäx?ä8é ¤?Ð?LK>ô:âä¼K>ü \?Ø?2€è?üé0?ü:ᬨäý ¼?d?é?ü:áp¨äÿáÄ?ᬨäð?ü:á@>äý<#?$ ?h&Èó ` ?îÐ ?öä| ?ìáᘠ?ø´ ?ÿ䬨ìD!?€!?ççäçæáááxýâÌ/éá@<0éá@l0ᬨäá @ áTä˜!?ä8é Ä!?ð!?LK>ô:âä¼K>ü |"?ø!?2€è$"?üéP"?ü:á¤*äý Ü"?„"?é°"?ü:áp¨äÿáä"?ᬨä#?ü:á@>äý\&?D#?h&Èó €#?îð#?öäœ#?ìáá¸#?øÔ#?ÿ䬨ìd$? $?ççäçæáááxýâÌ/é á@<0é!á@l0ᬨä"á @ áTä¸$?ä8é ä$?%?LK>ô:âä¼K>ü œ%?%?2€èD%?üép%?ü:á¤-ä ý ü%?¤%?éÐ%?ü:áp¨ä!ÿá&?ᬨä0&?ü:á@>ä"ý|)?d&?h&Èó  &?î'?öä¼&?ìááØ&?øô&?ÿ䬨ì„'?À'?ççäçæáááxýâÌ/é&á@<0é'á@l0ᬨä(á @ áTäØ'?ä8é (?0(?LK>ô:âä¼K>ü ¼(?8(?2€èd(?üé(?ü:áèä&ý )?Ä(?éð(?ü:áp¨ä'ÿá$)?ᬨäP)?ü:á@>ä(ýœ,?„)?h&Èó À)?î0*?öäÜ)?ìááø)?ø*?ÿ䬨ì¤*?à*?ççäçæáááxýâÌ/é,á@<0é-á@l0ᬨä.á @ áTäø*?ä8é $+?P+?LK>ô:âä¼K>ü Ü+?X+?2€è„+?üé°+?ü:á´-ä,ý <,?ä+?é,?ü:áp¨ä-ÿáD,?ᬨäp,?ü:á@>ä.ý¼/?¤,?h&Èó à,?îP-?öäü,?ìáá-?ø4-?ÿ䬨ìÄ-?á.?ççäçæáááxýâÌ/é2á@<0é3á@l0ᬨä4á @# áTä.?ä8é D.?p.?LK>ô:âä¼K>ü ü.?x.?2€è¤.?üéÐ.?ü:áÄ-ä2ý \/?/?é0/?ü:áp¨ä3ÿád/?ᬨä/?ü:á@>ä4ýÜ2?Ä/?h&Èó á0?îp0?öä0?ìáá80?øT0?ÿ䬨ìä0? 1?ççäçæáááxýâÌ/é8á@<0é9á@l0ᬨä:á @& áTä81?ä8é d1?1?LK>ô:âä¼K>ü 2?˜1?2€èÄ1?üéð1?ü:áüµä8ý |2?$2?éP2?ü:áp¨ä9ÿá„2?ᬨä°2?ü:á@>ä:ýü5?ä2?h&Èó 3?î3?öä<3?ìááX3?øt3?ÿ䬨ì4?@4?ççäçæáááxýâÌ/é>á@<0é?á@l0ᬨä@á @( áTäX4?ä8é „4?°4?X3>ô:âÀF>ä3>ü <5?¸4?2€èä4?üé5?ü:ᬨä>ý œ5?D5?ép5?ü:á ¾ä?ÿá¤5?ᬨäÐ5?ü:á@>ä@ý9?6?h&Èó @6?î°6?öä\6?ìááx6?ø”6?ÿ䬨ì$7?`7?ççäçæáááxýâÌ/éDá@<0éEá@l0ᬨäFá @* áTäx7?ä8é ¤7?Ð7?X3>ô:âÀF>ä3>ü \8?Ø7?2€è8?üé08?ü:á¤*äDý ¼8?d8?é8?ü:á ¾äEÿáÄ8?ᬨäð8?ü:á@>äFý<ô:âÀF>ä3>ü |;?ø:?2€è$;?üéP;?ü:á¤-äJý Ü;?„;?é°;?ü:á ¾äKÿáä;?ᬨääLý\??D?X3>ô:âÀF>ä3>ü œ>?>?2€èD>?üép>?ü:áèäPý ü>?¤>?éÐ>?ü:á ¾äQÿá??ᬨä0??ü:á@>äRý|B?d??h&Èó  ??î@?öä¼??ìááØ??øô??ÿ䬨ì„@?À@?ççäçæáááxýâÌ/éVá@<0éWá@l0ᬨäXá @1 áTäØ@?ä8é A?0A?X3>ô:âÀF>ä3>ü ¼A?8A?2€èdA?üéA?ü:á´-äVý B?ÄA?éðA?ü:á ¾äWÿá$B?ᬨäPB?ü:á@>äXýœE?„B?h&Èó ÀB?î0C?öäÜB?ìááøB?øC?ÿ䬨ì¤C?àC?ççäçæáááxýâÌ/é\á@<0é]á@l0ᬨä^á @5 áTäøC?ä8é $D?PD?X3>ô:âÀF>ä3>ü ÜD?XD?2€è„D?üé°D?ü:áÄ-ä\ý ä^ý¼H?¤E?h&Èó àE?îPF?öäüE?ìááF?ø4F?ÿ䬨ìÄF?áG?ççäçæáááxýâÌ/ébá@<0écá@l0ᬨädá @8 áTäG?ä8é DG?pG?X3>ô:âÀF>ä3>ü üG?xG?2€è¤G?üéÐG?ü:áüµäbý \H?H?é0H?ü:á ¾äcÿádH?ᬨäH?ü:á@>ädÿáÄH?h&Èó áI?îpI?öäI?ìáá8I?øTI?ÿ䬨ìäI? J?ççäçæáááxýâÌ/éhá@<0éiá@l0ᬨäjá @: áTä8J?ä8é dJ?J?LK>ô:âä¼K>ü ðJ?˜J?éÄJ?ü:áp¨ähý |K?øJ?2€è$K?üéPK?ü:á ¾äiÿá„K?ᬨä°K?ü:á@>äjÿá¨ôäìK?x]æLäL? L?â â âÌDäøY?ä8¼Rä $Z?PZ? »,ô:â˜Ø,äк,ÿà XZ?„Z?ä”Z?üZ?ø âàP?æ„Z?äÀZ?ü:ìZ?äý â„Z?æ4êÿ!h?`/Da?8[?Q?`/t[?PâêØ[?öä [?ì€âàP?äœå¼[?œ1 äÄQ?ðL ä¼RêL\?t\?ççäçæáááxýâœ1 ÄQ?ä*á @L ¼Râ+á@<âÌDäÔ\?ä<â ÌDŒ]?°]?ä<â ÌDä^?_?ä<â ÌD¤`?ì`?ä8á°Ï,å ]?,]?HÐ,ô:â„Û,ä Ð,ÿà4]?é`]?ü:áŒU?ä*ÿá*á$Ë,ôâÄQ?äÜ]?`^?øáÄQ?ä^?üáÄQ?ä4^?ü:áŒU?ä*ýèŒ^?¸^?ø:èôU?ü4êÿâ*á$Ë,ôâáôµ,ä4_?ü8á̼,ä `_?Œ_?(½,ô:âôÝ,äì¼,ü D`?”_?áÄQ?äÀ_?`?øáÄQ?äì_?ü:áŒU?ä*ý4êÿâ L`?¼Räx`?ü:´Uä+ýÈ`?*á$Ë,ôæ*át¸,òâéa?ü:áŒU?ä*ýXg?La?Q?`/ˆa?Pâêìa?öä´a?ì€âàP?äåÐa?œ1 äÄQ?ðL äŒÏ'ê`b?ˆb?ççäçæáááxýâœ1 ÄQ?ä#á @L ŒÏ'â$á@=âÌDäèb?ä=â ÌD c?Äc?ä=â ÌDød?e?ä=âÌD¸f?ág?ä8á°Ï,ä c?@c?HÐ,ô:â„Û,ä Ð,ÿàHc?étc?ü:áŒU?ä#ÿá#á$Ë,ôâÄQ?äðc?td?øáÄQ?äd?üáÄQ?äHd?ü:áŒU?ä#ýè d?Ìd?ø:èôU?ü4êÿâ#á$Ë,ôâáôµ,äHe?ü8á̼,ä te? e? Å,ô:âä,äÐÄ,ü Xf?¨e?áÄQ?äÔe?,f?øáÄQ?åf?ü:áŒU?ä#ý4êÿâ `f?å,äŒf?ü:På,ä$ýÜf?#á$Ë,ôæ#át¸,òâé,g?ü:áŒU?ä#ÿá`g?Q?`/œg?ÿèäÈg?ìãàP?ìäg?èÄQ?øS?î äh?àP?æ¨Ç,ìôU?àP?äâ8á„Z?ä hh?¤h?t[?ô:â”h?ä8[?ü ât[?æ i?¬h?éØh?ü:ái?ä6ý âðL?ê i?¼RäHi?ü:´Uä7ÿá6ápS?ôâðL?äÄi?Hj?øáðL?äði?üáðL?äj?ü:ái?ä6ýètj?ðj?ø:è j?üâáç´ÿíðÿ°ááÿÿÿ÷â“æ@ÿä ðÿ´ááÿÿÿ÷â¢å@@ÿäðÿä  ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ´ááÿÿÿ÷âŸå€Àÿäðÿ°ááÿÿÿ÷â•æ@ôéÄ~?ü:á ¾ä°ýƒ?ø~?h& ´4?îl?öäP?ìáýà?ô?ççäçæáááxýâÌ/é÷á @Üá ä €?ä8é 8€?¨‚?t€?ô:âd€?䬀?ü ât€?æä€?ìýh&\t€?äêè€?ö\?p?ççäçæáááxýâÌ/é²á@ÊâDÛäˆ?ä2€è´?ü8é à?‚?y?ô:â ‚?äTy?ü ây?ê$‚?2€èP‚?üé|‚?ü:áüµä²ÿá°‚?éÜ‚?ü:áüµä÷ý‡?ƒ?h& ´Lƒ??öähƒ?ìáýøƒ? „?ççäçæáááxýâÌ/éûá @Þá ä$„?ä8é P„?°†?Œ„?ô:â|„?äÄ„?ü ⌄?æä¨„?ìýh&ÌŒ„?äë…?öt…?ˆ…?ççäçæáááxýâÌ/é¶á@ÌâDÛä …?ä2€èÌ…?ü8é ø…?$†?y?ô:â ‚?äTy?ÿà,†?2€èX†?ü鄆?ü:áp¨ä¶ÿḆ?éä†?ü:áp¨äûý‰?‡?h& ´T‡??öäp‡?ìáýá ˆ?ˆ?ççäçæáááxýâÌ/éoá @BáTä,ˆ?ä8é Xˆ?„ˆ?y?ô:â ‚?äTy?ÿàŒˆ?2€è¸ˆ?üéäˆ?ü:ᬨäoý‹?‰?h& ´T‰??öäp‰?ìáýá Š?Š?ççäçæáááxýâÌ/ésá @DáTä,Š?ä8é XŠ?„Š?y?ô:â ‚?äTy?ÿàŒŠ?2€è¸Š?üéäŠ?ü:á¤*äsý?‹?h& ´T‹??öäp‹?ìáýá Œ?Œ?ççäçæáááxýâÌ/éwá @FáTä,Œ?ä8é XŒ?„Œ?y?ô:â ‚?äTy?ÿàŒŒ?2€è¸Œ?üéäŒ?ü:á¤-äwý??h& ´T?îŒ?öäp?ìáýá Ž?Ž?ççäçæáááxýâÌ/é{á @HáTä,Ž?ä8é XŽ?„Ž?y?ô:â ‚?äTy?ÿàŒŽ?2€è¸Ž?üéäŽ?ü:áèä{ý‘??h& ´T?îŒ?öäp?ìáýá ??ççäçæáááxýâÌ/éá @KáTä,?ä8é X?„?y?ô:â ‚?äTy?ÿàŒ?2€è¸?üéä?ü:á´-äÿá‘?h& ´T‘??öäp‘?ìáýá ’?’?ççäçæáááxýâÌ/éƒá @OáTä,’?ä8é X’?„’?y?ô:â ‚?äTy?ÿàŒ’?2€è¸’?üéä’?ü:áÄ-äƒý(“?¨²å “?P'æ¸×¬“?8“?h&¸×t“?ÿìä“?ïí¼Rî<&¸–? Ä“?ˆ8äÌ“?h& ”?îx”?öä$”?ääáá@”?èì\”?ÿôì”?(•?ççäçæáááxýâ|,áäHá@T#éIá@@)éJá@ âD>ä@•?ä8áä l•?˜•?8ô:â8äˆ8üø•? •?äÌ•?ü:áÔ)äHýX–?á–?é,–?ü:áäIÿá`–?錖?ü:á¤*äJýX—?<·äÈ–?h&<·—?ÿìä —?ïá<—?èöêŸ?ðh™?h—?h&ð¤—?ÿìä0™?äÀ—?çáâð—?(6è™?èâpæh&(6äÀ—?ä˜?ãáà˜?2ä ˜?ð—?2\˜?ÿè䘘?䈘?äãÀ—?ì âÀ—? äĘ?è´˜?ì âÀ—?ðˆ˜?ê™?uäð˜?æuèæŒþä™?âð˜?ŒþìL™?ÿôÜ›?p™?h&ð¬™?ïš?öäÈ™?äPë8äááä™?ÿôtš?œš?ççäçæáááxýâŒéè4â@xqè5â@†â Óä´š?ä8áPë8ä àš?›?4ë8ô:â ›?äøê8ü â4ë8æ |›?$›?éP›?ü:á¤-ä4ÿâ„›?é°›?ü:á¤-ä5ÿâä›?h&ð œ?îtœ?öä<œ?ä¡8äááXœ?ÿôèœ?4?ççäçæáááxýâ$ä $?ä?â@Œéè=â@xqè>â@ â¡8æŒâ ÓäL?äá¡8äx?ü8á$?ä ¤?à?è 8ô:âÐ?䬠8ü âè 8æ Pž?è?á$?äž?ü:á@ž?ä?þ â$?æ °ž?Xž?鄞?ü:á´-ä=ÿ⸞?éäž?ü:á´-ä>ÿâÐ ä Ÿ?< -æìä8Ÿ?â h&ìtŸ?âÿå⤟?$„ ôápæh&$„ ätŸ?äÄŸ?ãá” ?2äÔŸ?¤Ÿ?2 ?ÿèäL ?ä< ?äãtŸ?ì âtŸ? äx ?èh ?ì âtŸ?ð< ?î$„ 䤠?tŸ?æ Ü ¼ ?¸«%䨠%ä¹áH¡?Ô ?h&¹á¡?æÿää,¡?ïý`¥?P¡?h&¹áŒ¡?îÄ¡?ö䨡?ìáý8¢?L¢?ççäçæáááxýâÌ/é)á @°á äd¢?ä8é¢?á¥?Ì¢?ô:â¼¢?ä£?ü âÌ¢?æäè¢?ìáýh&€+ Ì¢?äê@£?ö´£?È£?ççäçæáááxýâÌ/éìá @šáDÛäà£?ä2€è ¤?ü8é 8¤?t¤?¡?ô:âd¤?äÔ ?ü â¡?ê|¤?2€è¨¤?üéÔ¤?ü:áüµäìÿá¥?é4¥?ü:áüµä)ýh©?h¥?h&¹á¤¥?îÜ¥?öäÀ¥?ìáýP¦?d¦?ççäçæáááxýâÌ/é-á @²á ä|¦?ä8é ¨¦?©?ä¦?ô:âÔ¦?ä§?ü âä¦?æå§?ìáýh&è& ä¦?äêX§?ö̧?à§?ççäçæáááxýâÌ/éøá @ áDÛäø§?ä2€è$¨?ü8é P¨?|¨?¡?ô:âd¤?äÔ ?ÿà„¨?2€è°¨?üéܨ?ü:áp¨äøÿá©?é<©?ü:áp¨ä-ýh«?p©?h&¹á¬©?îä©?öäÈ©?ìáýXª?lª?ççäçæáááxýâÌ/éÚá @| áT䄪?ä8é °ª?ܪ?¡?ô:âd¤?äÔ ?ÿàäª?2€è«?üé<«?ü:ᬨäÚýh­?p«?h&¹á¬«?îä«?öäÈ«?ìáýX¬?l¬?ççäçæáááxýâÌ/éÞá @~ áT䄬?ä8é °¬?ܬ?¡?ô:âd¤?äÔ ?ÿàä¬?2€è­?üé<­?ü:á¤*äÞýh¯?p­?h&¹á¬­?îä­?öäÈ­?ìáýX®?l®?ççäçæáááxýâÌ/éâá @€ áTä„®?ä8é °®?Ü®?¡?ô:âd¤?äÔ ?ÿàä®?2€è¯?üé<¯?ü:á¤-äâýh±?p¯?h&¹á¬¯?îä¯?öäȯ?ìáýX°?l°?ççäçæáááxýâÌ/éæá @‚ áTä„°?ä8é °°?ܰ?¡?ô:âd¤?äÔ ?ÿàä°?2€è±?üé<±?ü:áèäæýh³?p±?h&¹á¬±?îä±?öäȱ?ìáýX²?l²?ççäçæáááxýâÌ/éêá @… áT䄲?ä8é °²?ܲ?¡?ô:âd¤?äÔ ?ÿàä²?2€è³?üé<³?ü:á´-äêÿá p³?h&¹á¬³?îä³?öäȳ?ìáýX´?l´?ççäçæáááxýâÌ/éîá @‰ áTä„´?ä8é °´?Ü´?¡?ô:âd¤?äÔ ?ÿàä´?2€èµ?üé<µ?ü:áÄ-äîÿá@$äA+ä ä  ½˜µ?Ôä ³&¨µ?|Ôä ÉüÀ?ìæä¸µ?h&ìæôµ?äê,¶?öä¶?ìáý ¶?´¶?ççäçæáááxýâÌ/évá @LáDÛä̶?ä2€èø¶?ü8é $·?pÀ?`·?ô:âP·?䘷?ü â`·?æä|·?ìáýh&œ6`·?äääÔ·?öH¸? \¸?ççäçáæáááxýâÌ/éôáÀááü:ä|¹?âáü:ä,º?äáü:ä”»?äáü:ìáü:äD¼?Šâ áü:äм?Šâ áü:ä\½?Šâ áü:äè½?Šâ áü:ät¾?Šâ áü:å¿?Šâáü:䌿?Šâáü:äÀ?ä騹?áº?øéÔ¹?ü:á ¾äôý5ÿêéXº?h»?øé„º?üáÔ-ä°º?<»?ø8áÔ-ä ܺ?»?ì8-ô:âÜ8-ä$9-ÿà»?4êþ4êþ4ê!þ2€èÀ»?üéì»?ü2áüµä¼?ü:⬨ä8¶ÿìðÿôááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿäðÿôááÿÿÿ÷â•æ@ôéDÀ?ü:á ¾äôÿáxÀ?2€è¤À?üéÐÀ?ü:áp¨ävÿáÜæä Á?h&ÜæHÁ?äê€Á?öädÁ?ìýôÁ?Â?ççäçæáááxýâÌ/éná @HáDÛä Â?ä2€èLÂ?ü8é xÂ?TÇ?´Â?ô:â¤Â?äìÂ?ü â´Â?æäÐÂ?ìýh&èç´Â?äää(Ã?öœÃ?°Ã?ççäçáæáááxýâÌ/éá Àeáü:ä@Ä?Šâfáü:äÌÄ?Šâgáü:äXÅ?Šâháü:ääÅ?Šâiáü:äpÆ?Šâkáü:äüÆ?ôðÿááÿÿÿ÷â“æ@ÿäñÿÿÿÿââºæ@ÿäñÿÿÿÿââ›æ@ÿäðÿááÿÿÿ÷â•æ@ÿäðÿäÿûâ•æ@ôé(Ç?ü:á ¾äÿá\Ç?2€èˆÇ?üé´Ç?ü:áp¨änýøÇ?øçäðÇ?¡æ&èçÈ?ìÂ?Ì?È?h&èçLÈ?î„È?öähÈ?ìáýøÈ? É?ççäçæáááxýâÌ/é·á @dá ä$É?ä8é PÉ?°Ë?ŒÉ?ô:â|É?äÄÉ?ü âŒÉ?æä¨É?ìýh&ŒéŒÉ?äëÊ?ötÊ?ˆÊ?ççäçæáááxýâÌ/éjá @FáDÛä Ê?ä2€èÌÊ?ü8é øÊ?$Ë?´Â?ô:â¤Â?äìÂ?ÿà,Ë?2€èXË?üé„Ë?ü:áüµäjÿá¸Ë?éäË?ü:áüµä·ýôÍ?Ì?h&èçTÌ?îŒÌ?öäpÌ?ìáýá Í?Í?ççäçæáááxýâÌ/é»á @fá ä,Í?ä8é XÍ?”Í?HÁ?ô:â„Í?ä Á?ü âHÁ?êœÍ?éÈÍ?ü:áp¨ä»ýôÏ?üÍ?h&èç8Î?îpÎ?öäTÎ?ìáýäÎ?øÎ?ççäçæáááxýâÌ/éá @FáTäÏ?ä8é <Ï?hÏ?´Â?ô:â¤Â?äìÂ?ÿàpÏ?2€èœÏ?üéÈÏ?ü:ᬨäýôÑ?üÏ?h&èç8Ð?îpÐ?öäTÐ?ìáýäÐ?øÐ?ççäçæáááxýâÌ/é#á @HáTäÑ?ä8é <Ñ?hÑ?´Â?ô:â¤Â?äìÂ?ÿàpÑ?2€èœÑ?üéÈÑ?ü:á¤*ä#ýôÓ?üÑ?h&èç8Ò?îpÒ?öäTÒ?ìáýäÒ?øÒ?ççäçæáááxýâÌ/é'á @JáTäÓ?ä8é <Ó?hÓ?´Â?ô:â¤Â?äìÂ?ÿàpÓ?2€èœÓ?üéÈÓ?ü:á¤-ä'ýôÕ?üÓ?h&èç8Ô?îpÔ?öäTÔ?ìáýäÔ?øÔ?ççäçæáááxýâÌ/é+á @LáTäÕ?ä8é <Õ?hÕ?´Â?ô:â¤Â?äìÂ?ÿàpÕ?2€èœÕ?üéÈÕ?ü:áèä+ýô×?üÕ?h&èç8Ö?îpÖ?öäTÖ?ìáýäÖ?øÖ?ççäçæáááxýâÌ/é/á @OáTä×?ä8é <×?h×?´Â?ô:â¤Â?äìÂ?ÿàp×?2€èœ×?üéÈ×?ü:á´-ä/ÿáü×?h&èç8Ø?îpØ?öäTØ?ìáýäØ?øØ?ççäçæáááxýâÌ/é3á @SáTäÙ?ä8é <Ù?hÙ?´Â?ô:â¤Â?äìÂ?ÿàpÙ?2€èœÙ?üéÈÙ?ü:áÄ-ä3ý(Ü?œéäÚ?h&œé@Ú?äêxÚ?öä\Ú?ìáýìÚ?áÛ?ççäçæáááxýâÌ/érá @JáDÛäÛ?ä2€èDÛ?ü8é pÛ?œÛ?`·?ô:âP·?䘷?ÿà¤Û?2€èÐÛ?üéüÛ?ü:áüµärÿáŒéäÄÉ?ä˜ÈäHÜ?ÔÀ.æäÚä`Ü?h&äÚœÜ?ÿìä¸Ü?ïí¼RêØß?Ø.äÜ?ÐgäìÜ?h&Ø.(Ý?î˜Ý?öäDÝ?ä8ýäáá`Ý?è8ýì|Ý?ÿô Þ?HÞ?ççäçæáááxýâ|,á8ýä§â@T#é¨â@@)é©â@\âè2 ä`Þ?ä8á8ýä ŒÞ?¸Þ?`gô:âPgäÐgüß?ÀÞ?8ýäìÞ?ü:át!ä§þ xß? ß?éLß?ü:ᬨä¨ÿâ€ß?é¬ß?ü:á¤*ä©ÿâ`îäèß?/-æ˜ïåà?h&˜ï<à?äêtà?öäXà?ìáýèà?üà?ççäçæáááxýâÌ/éªá@¾âDÛäá?ä2€è@á?ü8é lá?Àõ?¨á?ô:â˜á?äàá?ü â¨á?æäÄá?ìáýh&àɨá?äääâ?öâ?¤â?ççäçáæáááxýâÌ/é)á Àúáü:ä\å?âüáü:älæ?äýáü:äÔç?äþáü:ìáü:ä„è?âáü:ä”é?äáü:ìáü:äìé?Šâáü:äxê?Šâáü:äë?Šâ áü:äë?Šâ áü:äì?Šâ áü:ä¨ì?Šâ áü:ä4í?Šâ áü:äÀí?Šâáü:äLî?Šâáü:äØî?Šâáü:ädï?Šâáü:äðï?Šâáü:ä|ð?Šâáü:äñ?Šâáü:ä”ñ?Šâáü:ä ò?Šâáü:ä¬ò?Šâáü:ä8ó?Šâáü:äÄó?Šâáü:äPô?Šâáü:äÜô?Šâáü:ähõ?äéˆå?@æ?ø8é´å?àå?á˜-ô:âð—-ä8˜-ÿàèå?éæ?ü:á ¾ä)ý5ðð?÷é˜æ?¨ç?øéÄæ?üáÔ-äðæ?|ç?ø8áÔ-ä ç?Hç?ì8-ô:âÜ8-ä$9-ÿàPç?4êþ4êþ4ê!þ2€éè?üé,è?ü2áüµäXè?ü:⬨ä8¶üé°è?hé?ø8éÜè?é?á˜-ô:âð—-ä8˜-ÿàé?é<é?ü:á ¾ä)ý5ð°<÷éÀé?ü:á ¾ä)ÿíðÿ)ááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿä ðÿä æð?ÿñâæ@ÿäñÿÿÿÿââªæ@ÿäñÿÿÿÿââ›æ@ÿä ðÿä æð?ÿñâ{æ@ÿä ðÿä æð?ÿñâ“æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿäñÿÿÿÿââ›æ@ÿä ðÿä æð?ÿñâ“æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿä ïÿäóáÿââ€æ@ÿäðÿä æà?ÿñâ|æ@ÿäðÿäáÿøâ•æ@ÿäðÿ)ááÿÿÿ÷â•æ@ôé”õ?ü:á ¾ä)ÿáÈõ?2€èôõ?üé ö?ü:áp¨äªÿá  ä\ö?âh&  ä ê üÐ1ä¨ö?æÐ1Àö?èâh&Øö?äPˆ ä ðö?,Àö?ê ÷?<2Àö?ê ¨ö?\±Àö?èTù?Œòä0÷?h&Œòl÷?äê¤÷?öäˆ÷?ìáýø?,ø?ççäçæáááxýâÌ/é¦á@¼âDÛäDø?ä2€èpø?ü8é œø?Èø?¨á?ô:â˜á?äàá?ÿàÐø?2€èüø?üé(ù?ü:áüµä¦ÿáø ädù?h&ø  ù?ÿìä¼ù?ïáØù?èìôù?èÿê€ ä ú?æ€ 8ú?èâh&Pú?ä8Îä hú?4ç8ú?ì ú?ÔÝ8ú?ì´ËåôÆä” ä ú?@L;@h&üõˆ;@îÜ;@öä¤;@ìááÀ;@ÿôP<@x<@ççäçæáááxýâÌ/é á@<0é á @. áTä<@ä8é ¼<@è<@øÆ;ô:âèÆ;äLÇ;ü t=@ð<@2€è=@üéH=@ü:áüµä ÿá|=@2€è¨=@üéÔ=@ü:á¤-ä ý@@>@h&üõD>@î˜>@öä`>@ìáá|>@ÿô ?@4?@ççäçæáááxýâÌ/éá@<0éá @0 áTäL?@ä8é x?@¤?@\Å;ô:âÐþ?ä Å;ü @@¬?@éØ?@ü:áp¨äÿá @@2€è8@@üéd@@ü:á¤-äý C@˜@@h&üõÔ@@î(A@öäð@@ìáá A@ÿôœA@ÄA@ççäçæáááxýâÌ/éá@<0éá @2 áTäÜA@ä8é B@4B@øÆ;ô:âèÆ;äLÇ;ü ”B@á @F áTäW@ä8é ¼W@èW@\Å;ô:âÐþ?ä Å;ü HX@ðW@éX@ü:áp¨ä=ÿáPX@2€è|X@üé¨X@ü:áèä>ýd[@ÜX@h&üõY@îlY@öä4Y@ìááPY@ÿôàY@Z@ççäçæáááxýâÌ/éBá@<0éCá @I áTä Z@ä8é LZ@xZ@øÆ;ô:âèÆ;äLÇ;ü ØZ@€Z@é¬Z@ü:á ¾äBÿáàZ@2€è [@üé8[@ü:á´-äCý ^@l[@h&üõ¨[@îü[@öäÄ[@ìááà[@ÿôp\@˜\@ççäçæáááxýâÌ/éGá@<0éHá @L áTä°\@ä8é Ü\@]@øÆ;ô:âèÆ;äLÇ;ü ”]@]@2€è<]@üéh]@ü:ᬨäGÿáœ]@2€èÈ]@üéô]@ü:á´-äHýÜ`@(^@h&üõd^@î¸^@öä€^@ìááœ^@ÿô,_@T_@ççäçæáááxýâÌ/éLá@<0éMá @N áTäl_@ä8é ˜_@Ä_@øÆ;ô:âèÆ;äLÇ;ü P`@Ì_@2€èø_@üé$`@ü:á¤*äLÿáX`@2€è„`@üé°`@ü:á´-äMý˜c@ä`@h&üõ a@îta@öäáç!ÿí ðÿ!ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäðÿááÿÿÿ÷â“æ@ÿä ðÿäÿûâ“æ@ÿäñÿÿÿÿââ»æ@ÿäñÿÿÿÿââ›æ@ÿä ïÿäóáÿââæ@ÿäñÿÿÿÿââ¬æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ{æ@ÿäñÿÿÿÿââ¿æ@ÿä ðÿ!ááÿÿÿ÷âŸå€Àÿäðÿäáÿøâ•æ@ÿäðÿááÿÿÿ÷â•æ@ôé´ý@ü:á ¾äÿáèý@2€èþ@üé@þ@ü:áüµäÔý ì$AÜý, A|þ@h&Üý¸þ@äää ÿ@öäÔþ@ìáðþ@ÿ䬨ì€ÿ@¨ÿ@ççäçáæáááxýâÌ/éÜá ÀøÕ¬¨äÝá Àáü:äˆAŠâáü:äAŠâáü:ä AŠâáü:ä,AŠâáü:ä¸AŠâáü:äDAŠâáü:äÐAŠâáü:ä\AŠâáü:ìáü:äèAŠâáü:ätAŠâáü:åAŠâáü:äŒAŠâáü:äAŠâáü:ä¤AŠâ!áü:ä0 AŠâ"áü:ä¼ AŠâ#áü:ì#áü:äH AŠâ&áü:äÔ AôðÿÜááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ¨æAÿä ïÿäóâ@ÿáâæ ÿäðÿÿäáâ Oÿñâ,å @ÿã ïÿäáìÝááÿÿÿáâ ÿìðÿäáÿÿÿõâ—æ@ÿäðÿÿäáâ@Oÿñâ3ç@ÿãñÿÿÿÿââºæ@ÿä ðÿä æà?ÿñâ“æ@ÿäñÿÿÿÿââ|æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ{æ@ÿä ïÿäáìÝááÿÿÿáâ ÿì ðÿäáÿÿÿõâ˜æ@ÿäðÿÜááÿÿÿ÷â•æ@ôê Aü:á ¾äÜýdA4 Ah&Üýp AîÄ AöäŒ AìáᨠAÿ䬨ì8 A` AççäçæáááxýâÌ/éiá@<0ᬨäjá @(á äx Aä8é ¤ A¤Aà Aô:âÐ Aä4 Aü âà Aæäü Aìá Aÿ䬨ìh&Ø8à Aäêp Aöä A AççäçæáááxýâÌ/é$á@<0ᬨä%á @áDÛä$Aä2€èPAü8é |A¸A¸þ@ô:â¨Aä|þ@ü â¸þ@æ DAÀA2€èìAüéAü:áüµä$ÿáLAᬨäxAü:á@>ä%ý A¬AéØAü:áüµäiÿá Aᬨä8Aü:á@>äjýŒAlAh&Üý¨AîüAöäÄAìááàAÿ䬨ìpA˜AççäçæáááxýâÌ/éná@<0ᬨäoá @*á ä°Aä8é ÜAÌAAô:âAälAü âAæä4AìáPAÿ䬨ìh&H6Aäê¨AöADAççäçæáááxýâÌ/é)á@<0ᬨä*á @áDÛä\Aä2€èˆAü8é ´AàA¸þ@ô:â¨Aä|þ@ü lAèA2€èAüé@Aü:áp¨ä)ÿátAᬨä Aü:á@>ä*ý ,AÔAêAü:áp¨änÿá4Aᬨä`Aü:á@>äoýA”Ah&ÜýÐAî$AöäìAìááAÿ䬨ì˜AÀAççäçæáááxýâÌ/éÍ á@<0ᬨäÎ á @ÎáTäØAä8é A0A¸þ@ô:â¨Aä|þ@ü ¼A8A2€èdAüéAü:ᬨäÍ ÿáÄAᬨäðAü:á@>äÎ ý¬A$Ah&Üý`Aî´Aöä|Aìáá˜Aÿ䬨ì(APAççäçæáááxýâÌ/éÒ á@<0ᬨäÓ á @ÐáTähAä8é ”AÀA¸þ@ô:â¨Aä|þ@ü LAÈA2€èôAüé Aü:á¤*äÒ ÿáTAᬨä€Aü:á@>äÓ ý<A´Ah&ÜýðAîDAöä Aìáá(Aÿ䬨ì¸AàAççäçæáááxýâÌ/é× á@<0á¬¨äØ á @ÒáTäøAä8é $APA¸þ@ô:â¨Aä|þ@ü ÜAXA2€è„Aüé°Aü:á¤-ä× ÿáäAᬨäAü:á@>äØ ýÌADAh&Üý€AîÔAöäœAìáá¸Aÿ䬨ìHApAççäçæáááxýâÌ/éÜ á@<0ᬨäÝ á @ÔáTäˆAä8é ´AàA¸þ@ô:â¨Aä|þ@ü lAèA2€èAüé@Aü:áèäÜ ÿátAᬨä Aü:á@>äÝ ý\"AÔAh&Üý Aîd Aöä, AìááH Aÿä¬¨ìØ Aá!AççäçæáááxýâÌ/éá á@<0ᬨäâ á @×áTä!Aä8é D!Ap!A¸þ@ô:â¨Aä|þ@ü ü!Ax!A2€è¤!AüéÐ!Aü:á´-äá ÿá"Aᬨä0"Aü:á@>äâ ÿád"Ah&Üý "Aîô"Aöä¼"AìááØ"Aÿ䬨ìh#A#AççäçæáááxýâÌ/éæ á@<0ᬨäç á @ÛáTä¨#Aä8éÔ#Aá$A¸þ@ô:â¨Aä|þ@ü Œ$A$A2€è4$Aüé`$Aü:áÄ-äæ ÿá”$AᬨäÀ$Aü:á@>äç ÿáÀÕáp%Aü$Ah&ÀÕá8%AæÿääT%Aïýˆ)Ax%Ah&ÀÕá´%Aîì%AöäÐ%Aìáý`&At&AççäçæáááxýâÌ/é á @äá äŒ&Aä8é ¸&A()Aô&Aô:âä&Aä,'Aü âô&Aæä'Aìáýh&È8ô&Aäêh'AöÜ'Að'AççäçæáááxýâÌ/éÄá@ÒâDÛä(Aä2€è4(Aü8é `(Aœ(A8%Aô:âŒ(Aäü$Aü â8%Aê¤(A2€èÐ(Aüéü(Aü:áüµäÄÿá0)Aé\)Aü:áüµä ý-A)Ah&ÀÕáÌ)Aî*Aöäè)Aìáýx*AŒ*AççäçæáááxýâÌ/é á @æá ä¤*Aä8é Ð*A0-A +Aô:âü*AäD+Aü â +Aæä(+Aìáýh&86 +Aäê€+Aöô+A,AççäçæáááxýâÌ/éÐá@ØâDÛä ,Aä2€èL,Aü8é x,A¤,A8%Aô:âŒ(Aäü$Aÿà¬,A2€èØ,Aüé-Aü:áp¨äÐÿá8-Aéd-Aü:áp¨ä ý/A˜-Ah&ÀÕáÔ-Aî .Aöäð-Aìáý€.A”.AççäçæáááxýâÌ/é á @áTä¬.Aä8é Ø.A/A8%Aô:âŒ(Aäü$Aÿà /A2€è8/Aüéd/Aü:ᬨä ý1A˜/Ah&ÀÕáÔ/Aî 0Aöäð/Aìáý€0A”0AççäçæáááxýâÌ/éá @áTä¬0Aä8é Ø0A1A8%Aô:âŒ(Aäü$Aÿà 1A2€è81Aüéd1Aü:á¤*äý3A˜1Ah&ÀÕáÔ1Aî 2Aöäð1Aìáý€2A”2AççäçæáááxýâÌ/éá @áTä¬2Aä8é Ø2A3A8%Aô:âŒ(Aäü$Aÿà 3A2€è83Aüéd3Aü:á¤-äý5A˜3Ah&ÀÕáÔ3Aî 4Aöäð3Aìáý€4A”4AççäçæáááxýâÌ/éá @áTä¬4Aä8é Ø4A5A8%Aô:âŒ(Aäü$Aÿà 5A2€è85Aüéd5Aü:áèäý7A˜5Ah&ÀÕáÔ5Aî 6Aöäð5Aìáý€6A”6AççäçæáááxýâÌ/éá @áTä¬6Aä8é Ø6A7A8%Aô:âŒ(Aäü$Aÿà 7A2€è87Aüéd7Aü:á´-äÿá ˜7Ah&ÀÕáÔ7Aî 8Aöäð7Aìáý€8A”8AççäçæáááxýâÌ/é!á @#áTä¬8Aä8é Ø8A9A8%Aô:âŒ(Aäü$Aÿà 9A2€è89Aüéd9Aü:áÄ-ä!ý¬9Al5 ä 9A´ê\5 ä¼9Ah&\5 ø9Aÿìä:A䜨-çá0:Aè¼Rö¼Rî´îä\:Ap®æx:Aø6 ä ( &”:AÌ& äˆ:Axrê@ä¤:Ah&@à:Aäê;Aöäü:AìýŒ;A ;AççäçæáááxýâÌ/éØá@ìâDÛä¸;Aä2€èä;Aü8é A”àá>ALŽ,>AðŠ, >AÌ€,äp},äh< äÄ¥äÌçäH>Ah&Ìç„>Aÿìä >Aä¼Rçá¼>Aè¼Rø¼Rî(éäè>Ah&(é$?Aÿìä@?Aïá\?Aè¼Rêx?Aè´Uÿè¼EA´ ä¤?Ah&´ à?Að@Aöäü?AìáýŒ@A @AççäçæáááxýâT#éwâ@9â$ä¸@Aä7é ä@ApBAœBAôéAAÀAAøé äà‘-äøå ¼œAh&øáøœAÿìäAïí¼RîÄ\ä aðA|? äPAh&|? ŒAÿìä¨AïíÄAì âÔAæ÷åüøæ žAh&üøá<žAÿìäXžAïí¼Rî0@ 䄞Ah&0@ ÀžAÿìäÜžAïí¼Rî”ùå ŸAh&”ùáDŸAÿìä`ŸAïí¼RꔟAäV 䌟A$''æDA 䤟Ah&DA àŸAÿìäüŸAïá Aè¼Rö´Uð,äØö?ä(N ôªAT Ah&(N  AäääÈ Aö䬠Aìý<¡Ax¡AççäçáæáááxýâÌ/éÉáÀøgèÍက/ èÎá€Ââü:ä(£AäÃâü:äT£AäÇâü:䀣AŠâÈâü:ä ¤AŠâÉâü:䘤AŠâÊâü:ä$¥AŠâËâü:ä°¥AŠâÌâü:ä<¦AŠâÍâü:äȦAŠâÎâü:ìÎâü:äT§AŠâÐâü:ìÐâü:äà§AŠâÒâü:äl¨AŠâÓâü:äø¨AŠâÔâü:ä„©AŠâÕâü:äªAŠâ×âü:䜪Aä>áçÍý>áçÎÿíðÿÉááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâÿáâæ ÿäðÿÿäá â(Oÿñâ,å @ÿãðÿä æà?ÿñâ{æ@ÿäðÿÿäá âðOÿñâ3ç@ÿãðÿä æà?ÿñâæ@ÿä ðÿÍááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿÎááÿÿÿ÷â˜æ@ÿä ðÿÍááÿÿÿ÷âŸå€ÀôéȪAü:á´-äÎýà®AüªAh&(N 8«Aîp«AöäT«Aìáýä«Aø«AççäçæáááxýâÌ/éá @Má ä¬Aä8é <¬A€®Ax¬Aô:âh¬Aä°¬Aü âx¬Aæä”¬Aìýh&Åx¬Aäêì¬Aö`­At­AççäçæáááxýâÌ/éJá @6áDÛ䌭Aä8é ¸­Aô­A Aô:âä­AäT Aü â Aêü­A2€è(®AüéT®Aü:áüµäJÿሮAé´®Aü:áüµäý¼²Aè®Ah&(N $¯Aî\¯Aöä@¯AìáýЯAä¯AççäçæáááxýâÌ/é“á @Qá äü¯Aä8é (°A\²Ad°Aô:âT°A䜰Aü âd°Aæä€°Aìýh&”¿d°AäêذAöL±A`±AççäçæáááxýâÌ/éNá @8áDÛäx±Aä8é ¤±AбA Aô:âä­AäT AÿàرA2€è²Aüé0²Aü:áp¨äNÿád²Aé²Aü:áp¨ä“ý¼´AIJAh&(N á³Aî8³Aöä³Aìáý¬³AÀ³AççäçæáááxýâÌ/é§á @ëáTäسAä8é ´A0´A Aô:âä­AäT Aÿà8´A2€èd´Aüé´Aü:ᬨä§ý¼¶AÄ´Ah&(N áµAî8µAöäµAìáý¬µAÀµAççäçæáááxýâÌ/é«á @ïáTäصAä8é ¶A0¶A Aô:âä­AäT Aÿà8¶A2€èd¶Aüé¶Aü:á¤*ä«ý¼¸AĶAh&(N á·Aî8·Aöä·Aìáý¬·AÀ·AççäçæáááxýâÌ/é¯á @óáT䨷Aä8é ¸A0¸A Aô:âä­AäT Aÿà8¸A2€èd¸Aüé¸Aü:á¤-ä¯ý¼ºAĸAh&(N á¹Aî8¹Aöä¹Aìáý¬¹AÀ¹AççäçæáááxýâÌ/é³á @÷áTäعAä8é ºA0ºA Aô:âä­AäT Aÿà8ºA2€èdºAüéºAü:áèä³ý¼¼AĺAh&(N á»Aî8»Aöä»Aìáý¬»AÀ»AççäçæáááxýâÌ/é·á @üáT䨻Aä8é ¼A0¼A Aô:âä­AäT Aÿà8¼A2€èd¼Aüé¼Aü:á´-ä·ÿáļAh&(N á½Aî8½Aöä½Aìáý¬½AÀ½AççäçæáááxýâÌ/é»á @áTäؽAä8é ¾A0¾A Aô:âä­AäT Aÿà8¾A2€èd¾Aüé¾Aü:áÄ-ä»ÿâD ä̾AõæáçNýétÃAÌÃAøé ÃAü:á ¾äNý5ÿúðÿJááÿÿÿ÷â“æ@ÿäðÿIááÿÿÿ÷â}æBÿä ðÿäÿûâ§æAÿä ïÿäóâGÿáâæ ÿäðÿÿäá âøOÿñâ,å @ÿã ðÿIááÿÿÿ÷â€æ@ÿäðÿNááÿÿÿ÷â”æ@ÿäðÿäÿûâ•æ@ôé„ÈAü:á ¾äNý <ÉA¸ÈA2€èäÈAüéÉAü:áp¨äùÿáDÉA2€èpÉAüéœÉAü:áp¨äúýPÏA(äØÉAh&(ÊAðhÊAöä0ÊAìáLÊAÿäp¨ìÜÊA,ËAççäçæáááxýâÌ/é‘á @Ü' p¨ä’á@üœ è–ဈõè—ã_áDÛä¤ËAä`áDÛäÐËAä`áDÛäüËAäaáDÛäÄÍAäbáDÛäøÎAä>áç–ý>áç—ýé(ÌA€ÌAøéTÌAü:áp¨ä—ý2€è¬ÌAü8é ØÌAÍAÄ=ô:â¼=äˆ=ü ÍA ÍA2€è8ÍAüédÍAü:áp¨ä‘ÿá˜ÍA:á ¾ä–ýéðÍAtÎAøéÎAüáp¨äHÎAü:á á@<0é? á @„áTäÔBä8ê B,BhÎ8ô:âXÎ8ä¼Î8ü ¸B4B2€è`BüéŒBü:áüµä> ÿáÀB2€èìBüéBü:á¤-ä? ýÔBLBh&˜ˆBîÜBöä¤BìááÀBÿôPBxBççäçæáááxýâÌ/éC á@<0éD á @†áTäBä8é ¼BèBÌÌ8ô:â8ÔAäÌ8ü HBðBéBü:áp¨äC ÿáPB2€è|Büé¨Bü:á¤-äD ýd BÜBh&˜BîlBöä4BìááPBÿôàBBççäçæáááxýâÌ/éH á@<0éI á @ˆáTä Bä8é LBxBhÎ8ô:âXÎ8ä¼Î8ü ØB€Bé¬Bü:á ¾äH ÿáàB2€è Büé8 Bü:áèäI ý #Bl Bh&˜¨ Bîü BöäÄ Bìááà Bÿôp!B˜!BççäçæáááxýâÌ/éM á@<0éN á @ŠáTä°!Bä8é Ü!B"BhÎ8ô:âXÎ8ä¼Î8ü ”"B"B2€è<"Büéh"Bü:ᬨäM ÿáœ"B2€èÈ"Büéô"Bü:áèäN ýÜ%B(#Bh&˜d#Bî¸#Böä€#Bìááœ#Bÿô,$BT$BççäçæáááxýâÌ/éR á@<0éS á @ŒáTäl$Bä8é ˜$BÄ$BhÎ8ô:âXÎ8ä¼Î8ü P%BÌ$B2€èø$Büé$%Bü:á¤*äR ÿáX%B2€è„%Büé°%Bü:áèäS ý˜(Bä%Bh&˜ &Bît&Böä<&BìááX&Bÿôè&B'BççäçæáááxýâÌ/éW á@<0éX á @ŽáTä('Bä8é T'B€'BhÎ8ô:âXÎ8ä¼Î8ü (Bˆ'B2€è´'Büéà'Bü:á¤-äW ÿá(B2€è@(Büél(Bü:áèäX ýT+B (Bh&˜Ü(Bî0)Böäø(Bìáá)Bÿô¤)BÌ)BççäçæáááxýâÌ/é\ á@<0é] á @áTää)Bä8é *B<*BhÎ8ô:âXÎ8ä¼Î8ü È*BD*B2€èp*Büéœ*Bü:áèä\ ÿáÐ*B2€èü*Büé(+Bü:áèä] ý.B\+Bh&˜˜+Bîì+Böä´+BìááÐ+Bÿô`,Bˆ,BççäçæáááxýâÌ/éa á@<0éb á @“áTä ,Bä8é Ì,Bø,BhÎ8ô:âXÎ8ä¼Î8ü„-Bá-B2€è,-BüéX-Bü:á´-äa ÿáŒ-B2€è¸-Büéä-Bü:áèäb ýÌ0B.Bh&˜T.Bî¨.Böäp.BìááŒ.Bÿô/BD/BççäçæáááxýâÌ/éf á@<0ég á @—áTä\/Bä8é ˆ/B´/BhÎ8ô:âXÎ8ä¼Î8ü @0B¼/B2€èè/Büé0Bü:áÄ-äf ÿáH0B2€èt0Büé 0Bü:áèäg ýˆ3BÔ0Bh&˜1Bîd1Böä,1BìááH1BÿôØ1Bá2BççäçæáááxýâÌ/ék á@<0él á @šáTä2Bä8é D2Bp2BhÎ8ô:âXÎ8ä¼Î8ü ü2Bx2B2€è¤2BüéÐ2Bü:áüµäk ÿá3B2€è03Büé\3Bü:áèäl ý6B3Bh&˜Ì3Bî 4Böäè3Bìáá4Bÿô”4B¼4BççäçæáááxýâÌ/ép á@<0éq á @œáTäÔ4Bä8ê 5B,5BÌÌ8ô:â8ÔAäÌ8ü Œ5B45Bé`5Bü:áp¨äp ÿá”5B2€èÀ5Büéì5Bü:áèäq ý¨8B 6Bh&˜\6Bî°6Böäx6Bìáá”6Bÿô$7BL7BççäçæáááxýâÌ/éu á@<0év á @ŸáTäd7Bä8é 7B¼7BhÎ8ô:âXÎ8ä¼Î8ü 8BÄ7Béð7Bü:á ¾äu ÿá$8B2€èP8Büé|8Bü:á´-äv ýd;B°8Bh&˜ì8Bî@9Böä9Bìáá$9Bÿô´9BÜ9BççäçæáááxýâÌ/éz á@<0é{ á @¢áTäô9Bä8é :BL:BhÎ8ô:âXÎ8ä¼Î8ü Ø:BT:B2€è€:Büé¬:Bü:ᬨäz ÿáà:B2€è ;Büé8;Bü:á´-ä{ ý >Bl;Bh&˜¨;Bîü;BöäÄ;Bìááà;BÿôpBh&˜d>Bî¸>Böä€>Bìááœ>Bÿô,?BT?BççäçæáááxýâÌ/é„ á@<0é… á @¦áTäl?Bä8é ˜?BÄ?BhÎ8ô:âXÎ8ä¼Î8ü P@BÌ?B2€èø?Büé$@Bü:á¤-ä„ ÿáX@B2€è„@Büé°@Bü:á´-ä… ý˜CBä@Bh&˜ ABîtABöä á @áTäT¡Bä8é €¡B¬¡BhÎ8ô:âXÎ8ä¼Î8ü 8¢B´¡B2€èà¡Büé ¢Bü:áüµä= ÿá@¢Bél¢Bü:á ¾ä> ÿá ¢Bh&˜Ü¢Bî0£Böäø¢Bìáá£Bÿô¤£BÌ£BççäçæáááxýâÌ/éB á@<0éC á @áTää£Bä8é ¤B<¤BÌÌ8ô:â8ÔAäÌ8ü œ¤BD¤Bép¤Bü:áp¨äB ÿᤤB2€èФBüéü¤Bü:á ¾äC ÿáfä8¥Bh&ft¥BäêÈ¥Böä¥BìᬥBÿô<¦Bd¦BççäçæáááxýâÌ/éôá@<0éõá@úâDÛä|¦Bä2€è¨¦Bü8éÔ¦Bá§B¼ÀAô:â¬ÀAäÁAü Œ§B§B2€è4§Büé`§Bü:áüµäôÿá”§B2€èÀ§Büéì§Bü:áüµäõý(¨B\䬀?ä(T ä8¨Bh&(T t¨Bâÿè÷ᨨB\gä ¨B4Ïâ*À}C|¸¨BÁA,«BÀ¨Bh&|ü¨BîP©Böä©Bìáá4©BÿôÄ©Bì©BççäçæáááxýâÌ/é9á@<0é:á @ á äªBä8é 0ªBlªBt¥Bô:â\ªBä8¥Bü ât¥Bæ ̪BtªBé ªBü:áüµä9ÿáÔªBê«Bü:áüµä:ý ­B4«Bh&|p«BîÄ«Bö䌫BìáᨫBÿô8¬B`¬BççäçæáááxýâÌ/é>á@<0é?á @á äx¬Bä8é ¤¬Bà¬B ¿Aô:âЬBää¾Aü â ¿Aæ @­Bè¬Bé­Bü:áp¨ä>ÿáH­Bét­Bü:áp¨ä?ý0°B¨­Bh&|ä­Bî8®Böå®Bìáá®Bÿô¬®BÔ®BççäçæáááxýâÌ/éá@<0éžá @®áTäì®Bä8é ¯BD¯B¼ÀAô:â¬ÀAäÁAü ¤¯BL¯Béx¯Bü:á ¾äÿᬯB2€èدBüé°Bü:ᬨäžýì²B8°Bh&|t°BîȰBöä°BìáᬰBÿô<±Bd±BççäçæáááxýâÌ/é¢á@<0é£á @°áTä|±Bä8é ¨±BÔ±B¼ÀAô:â¬ÀAäÁAü `²BܱB2€è²Büé4²Bü:ᬨä¢ÿáh²B2€è”²BüéÀ²Bü:ᬨä£ý¨µBô²Bh&|0³BBöäL³Bìááh³Bÿôø³B ´BççäçæáááxýâÌ/é§á@<0é¨á @²áTä8´Bä8é d´B´B¼ÀAô:â¬ÀAäÁAü µB˜´B2€èÄ´Büéð´Bü:á¤*ä§ÿá$µB2€èPµBüé|µBü:ᬨä¨ýd¸B°µBh&|ìµBî@¶Böä¶Bìáá$¶Bÿô´¶BܶBççäçæáááxýâÌ/é¬á@<0é­á @´áTäô¶Bä8é ·BL·B¼ÀAô:â¬ÀAäÁAü Ø·BT·B2€è€·Bü鬷Bü:á¤-ä¬ÿáà·B2€è ¸Büé8¸Bü:ᬨä­ý »Bl¸Bh&|¨¸Bîü¸BöäĸBìááà¸Bÿôp¹B˜¹BççäçæáááxýâÌ/é±á@<0é²á @¶áTä°¹Bä8é ܹBºB¼ÀAô:â¬ÀAäÁAü ”ºBºB2€è<ºBüéhºBü:áèä±ÿ᜺B2€èȺBüéôºBü:ᬨä²ýܽB(»Bh&|d»BBö䀻Bìá᜻Bÿô,¼BT¼BççäçæáááxýâÌ/é¶á@<0é·á @¹áTäl¼Bä8é ˜¼BļB¼ÀAô:â¬ÀAäÁAü P½B̼B2€èø¼Büé$½Bü:á´-ä¶ÿáX½B2€è„½Büé°½Bü:ᬨä·ý˜ÀBä½Bh&| ¾Bît¾Böä<¾BìááX¾Bÿôè¾B¿BççäçæáááxýâÌ/é»á@<0é¼á @½áTä(¿Bä8é T¿B€¿B¼ÀAô:â¬ÀAäÁAü ÀBˆ¿B2€è´¿Büéà¿Bü:áÄ-ä»ÿáÀB2€è@ÀBüélÀBü:ᬨä¼ýTÃB ÀBh&|ÜÀBî0ÁBöäøÀBìááÁBÿô¤ÁBÌÁBççäçæáááxýâÌ/éÀá@<0éÁá @ÀáTääÁBä8é ÂB<ÂB¼ÀAô:â¬ÀAäÁAü ÈÂBDÂB2€èpÂBüéœÂBü:áüµäÀÿáÐÂB2€èüÂBüé(ÃBü:ᬨäÁýäÅB\ÃBh&|˜ÃBîìÃBöä´ÃBìááÐÃBÿô`ÄBˆÄBççäçæáááxýâÌ/éÅá@<0éÆá @ÂáTä ÄBä8é ÌÄBøÄB ¿Aô:âЬBää¾AüXÅBáÅBé,ÅBü:áp¨äÅÿá`ÅB2€èŒÅBüé¸ÅBü:ᬨäÆýtÈBìÅBh&|(ÆBî|ÆBöäDÆBìáá`ÆBÿôðÆBÇBççäçæáááxýâÌ/éÊá@<0éËá @ÄáTä0ÇBä8é \ÇBˆÇB¼ÀAô:â¬ÀAäÁAü èÇBÇBé¼ÇBü:á ¾äÊÿáðÇB2€èÈBüéHÈBü:á¤*äËý0ËB|ÈBh&|¸ÈBî ÉBöäÔÈBìááðÈBÿô€ÉB¨ÉBççäçæáááxýâÌ/éÏá@<0éÐá @ÆáTäÀÉBä8é ìÉBÊB¼ÀAô:â¬ÀAäÁAü ¤ÊB ÊB2€èLÊBüéxÊBü:ᬨäÏÿá¬ÊB2€èØÊBüéËBü:á¤*äÐýìÍB8ËBh&|tËBîÈËBöäËBìáá¬ËBÿô<ÌBdÌBççäçæáááxýâÌ/éÔá@<0éÕá @ÈáTä|ÌBä8é ¨ÌBÔÌB¼ÀAô:â¬ÀAäÁAü `ÍBÜÌB2€èÍBüé4ÍBü:á¤*äÔÿáhÍB2€è”ÍBüéÀÍBü:á¤*äÕý¨ÐBôÍBh&|0ÎBî„ÎBöäLÎBìááhÎBÿôøÎB ÏBççäçæáááxýâÌ/éÙá@<0éÚá @ÊáTä8ÏBä8é dÏBÏB¼ÀAô:â¬ÀAäÁAü ÐB˜ÏB2€èÄÏBüéðÏBü:á¤-äÙÿá$ÐB2€èPÐBüé|ÐBü:á¤*äÚýdÓB°ÐBh&|ìÐBî@ÑBöäÑBìáá$ÑBÿô´ÑBÜÑBççäçæáááxýâÌ/éÞá@<0éßá @ÌáTäôÑBä8é ÒBLÒB¼ÀAô:â¬ÀAäÁAü ØÒBTÒB2€è€ÒBüé¬ÒBü:áèäÞÿáàÒB2€è ÓBüé8ÓBü:á¤*äßý ÖBlÓBh&|¨ÓBîüÓBöäÄÓBìááàÓBÿôpÔB˜ÔBççäçæáááxýâÌ/éãá@<0éäá @ÏáTä°ÔBä8é ÜÔBÕB¼ÀAô:â¬ÀAäÁAü ”ÕBÕB2€è<ÕBüéhÕBü:á´-äãÿáœÕB2€èÈÕBüéôÕBü:á¤*ääýÜØB(ÖBh&|dÖBî¸ÖBöä€ÖBìááœÖBÿô,×BT×BççäçæáááxýâÌ/éèá@<0ééá @ÓáTäl×Bä8é ˜×BÄ×B¼ÀAô:â¬ÀAäÁAü PØBÌ×B2€èø×Büé$ØBü:áÄ-äèÿáXØB2€è„ØBüé°ØBü:á¤*äéý˜ÛBäØBh&| ÙBîtÙBöä<ÙBìááXÙBÿôèÙBÚBççäçæáááxýâÌ/éíá@<0éîá @ÖáTä(ÚBä8é TÚB€ÚB¼ÀAô:â¬ÀAäÁAü ÛBˆÚB2€è´ÚBüéàÚBü:áüµäíÿáÛB2€è@ÛBüélÛBü:á¤*äîý(ÞB ÛBh&|ÜÛBî0ÜBöäøÛBìááÜBÿô¤ÜBÌÜBççäçæáááxýâÌ/éòá@<0éóá @ØáTääÜBä8é ÝB<ÝB ¿Aô:âЬBää¾Aü œÝBDÝBépÝBü:áp¨äòÿá¤ÝB2€èÐÝBüéüÝBü:á¤*äóý¸àB0ÞBh&|lÞBîÀÞBöäˆÞBìáá¤ÞBÿô4ßB\ßBççäçæáááxýâÌ/é÷á@<0éøá @ÚáTätßBä8é  ßBÌßB¼ÀAô:â¬ÀAäÁAü ,àBÔßBêàBü:á ¾ä÷ÿá4àB2€è`àBüéŒàBü:á¤-äøýtãBÀàBh&|üàBîPáBöäáBìáá4áBÿôÄáBìáBççäçæáááxýâÌ/éüá@<0éýá @ÜáTäâBä8é 0âB\âB¼ÀAô:â¬ÀAäÁAü èâBdâB2€èâBüé¼âBü:ᬨäüÿáðâB2€èãBüéHãBü:á¤-äýý0æB|ãBh&|¸ãBî äBöäÔãBìááðãBÿô€äB¨äBççäçæáááxýâÌ/éá@<0éá @ÞáTäÀäBä8é ìäBåB¼ÀAô:â¬ÀAäÁAü ¤åB åB2€èLåBüéxåBü:á¤*äÿá¬åB2€èØåBüéæBü:á¤-äýìèB8æBh&|tæBîÈæBöäæBìáá¬æBÿô<çBdçBççäçæáááxýâÌ/éá@<0éá @àáTä|çBä8é ¨çBÔçB¼ÀAô:â¬ÀAäÁAü `èBÜçB2€èèBüé4èBü:á¤-äÿáhèB2€è”èBüéÀèBü:á¤-äý¨ëBôèBh&|0éBî„éBöäLéBìááhéBÿôøéB êBççäçæáááxýâÌ/é á@<0é á @âáTä8êBä8é dêBêB¼ÀAô:â¬ÀAäÁAü ëB˜êB2€èÄêBüéðêBü:áèä ÿá$ëB2€èPëBüé|ëBü:á¤-ä ýdîB°ëBh&|ìëBî@ìBöäìBìáá$ìBÿô´ìBÜìBççäçæáááxýâÌ/éá@<0éá @åáTäôìBä8é íBLíB¼ÀAô:â¬ÀAäÁAü ØíBTíB2€è€íBüé¬íBü:á´-äÿáàíB2€è îBüé8îBü:á¤-äý ñBlîBh&|¨îBîüîBöäÄîBìááàîBÿôpïB˜ïBççäçæáááxýâÌ/éá@<0éá @éáTä°ïBä8é ÜïBðB¼ÀAô:â¬ÀAäÁAü ”ðBðB2€è<ðBüéhðBü:áÄ-äÿáœðB2€èÈðBüéôðBü:á¤-äýÜóB(ñBh&|dñBî¸ñBöä€ñBìááœñBÿô,òBTòBççäçæáááxýâÌ/éá@<0éá @ìáTälòBä8é ˜òBÄòB¼ÀAô:â¬ÀAäÁAü PóBÌòB2€èøòBüé$óBü:áüµäÿáXóB2€è„óBüé°óBü:á¤-äýlöBäóBh&| ôBîtôBöä<ôBìááXôBÿôèôBõBççäçæáááxýâÌ/éá@<0é á @îáTä(õBä8é TõB€õB ¿Aô:âЬBää¾Aü àõBˆõBé´õBü:áp¨äÿáèõB2€èöBüé@öBü:á¤-ä ýüøBtöBh&|°öBî÷BöäÌöBìááèöBÿôx÷B ÷BççäçæáááxýâÌ/é$á@<0é%á @ðáTä¸÷Bä8é ä÷BøB¼ÀAô:â¬ÀAäÁAü pøBøBéDøBü:á ¾ä$ÿáxøB2€è¤øBüéÐøBü:áèä%ý¸ûBùBh&|@ùBî”ùBöä\ùBìááxùBÿôúB0úBççäçæáááxýâÌ/é)á@<0é*á @òáTäHúBä8é túB úB¼ÀAô:â¬ÀAäÁAü ,ûB¨úB2€èÔúBüêûBü:ᬨä)ÿá4ûB2€è`ûBüéŒûBü:áèä*ýtþBÀûBh&|üûBîPüBöäüBìáá4üBÿôÄüBìüBççäçæáááxýâÌ/é.á@<0é/á @ôáTäýBä8é 0ýB\ýB¼ÀAô:â¬ÀAäÁAü èýBdýB2€èýBüé¼ýBü:á¤*ä.ÿáðýB2€èþBüéHþBü:áèä/ý0C|þBh&|¸þBî ÿBöäÔþBìááðþBÿô€ÿB¨ÿBççäçæáááxýâÌ/é3á@<0é4á @öáTäÀÿBä8é ìÿBC¼ÀAô:â¬ÀAäÁAü ¤C C2€èLCüéxCü:á¤-ä3ÿá¬C2€èØCüéCü:áèä4ýìC8Ch&|tCîÈCöäCìáá¬Cÿô<CdCççäçæáááxýâÌ/é8á@<0é9á @øáTä|Cä8é ¨CÔC¼ÀAô:â¬ÀAäÁAü `CÜC2€èCüé4Cü:áèä8ÿáhC2€è”CüéÀCü:áèä9ý¨CôCh&|0Cî„CöäLCìááhCÿôøC CççäçæáááxýâÌ/é=á@<0é>á @ûáTä8Cä8é dCC¼ÀAô:â¬ÀAäÁAü C˜C2€èÄCüéðCü:á´-ä=ÿá$C2€èPCüé|Cü:áèä>ýd C°Ch&|ìCî@CöäCìáá$Cÿô´CÜCççäçæáááxýâÌ/éBá@<0éCá @ÿáTäôCä8é CLC¼ÀAô:â¬ÀAäÁAü ØCTC2€è€Cüé¬Cü:áÄ-äBÿáàC2€è Cüé8 Cü:áèäCý Cl Ch&|¨ Cîü CöäÄ Cìááà Cÿôp C˜ CççäçæáááxýâÌ/éGá@<0éHá @áTä° Cä8é Ü C C¼ÀAô:â¬ÀAäÁAü ” C C2€è< Cüéh Cü:áüµäGÿᜠC2€èÈ Cüéô Cü:áèäHý°C( Ch&|d Cî¸ Cöä€ CìáᜠCÿô, CT CççäçæáááxýâÌ/éLá@<0éMá @áTäl Cä8é ˜ CÄ C ¿Aô:âЬBää¾Aü $CÌ Céø Cü:áp¨äLÿá,C2€èXCüé„Cü:áèäMý@C¸Ch&|ôCîHCöäCìáá,Cÿô¼CäCççäçæáááxýâÌ/éQá@<0éRá @áTäüCä8é (CTC¼ÀAô:â¬ÀAäÁAü ´C\CéˆCü:á ¾äQÿá¼C2€èèCüéCü:á´-äRýüCHCh&|„CîØCöä Cìáá¼CÿôLCtCççäçæáááxýâÌ/éVá@<0éWá @ áTäŒCä8é ¸CäC¼ÀAô:â¬ÀAäÁAü pCìC2€èCüéDCü:ᬨäVÿáxC2€è¤CüéÐCü:á´-äWý¸CCh&|@Cî”Cöä\CìááxCÿôC0CççäçæáááxýâÌ/é[á@<0é\á @ áTäHCä8é tC C¼ÀAô:â¬ÀAäÁAü ,C¨C2€èÔCüêCü:á¤*ä[ÿá4C2€è`CüéŒCü:á´-ä\ýtCÀCh&|üCîPCöäCìáá4CÿôÄCìCççäçæáááxýâÌ/é`á@<0éaá @áTäCä8é 0C\C¼ÀAô:â¬ÀAäÁAü èCdC2€èCüé¼Cü:á¤-ä`ÿáðC2€èCüéHCü:á´-äaý0C|Ch&|¸Cî CöäÔCìááðCÿô€C¨CççäçæáááxýâÌ/éeá@<0éfá @áTäÀCä8é ìCC¼ÀAô:â¬ÀAäÁAü ¤C C2€èLCüéxCü:áèäeÿá¬C2€èØCüéCü:á´-äfýìC8Ch&|tCîÈCöäCìáá¬Cÿô<CdCççäçæáááxýâÌ/éjá@<0éká @áTä|Cä8é ¨CÔC¼ÀAô:â¬ÀAäÁAü `CÜC2€èCüé4Cü:á´-äjÿáhC2€è”CüéÀCü:á´-äký¨!CôCh&|0Cî„CöäLCìááhCÿôøC CççäçæáááxýâÌ/éoá@<0épá @áTä8 Cä8é d C C¼ÀAô:â¬ÀAäÁAü !C˜ C2€èÄ Cüéð Cü:áÄ-äoÿá$!C2€èP!Cüé|!Cü:á´-äpýd$C°!Ch&|ì!Cî@"Cöä"Cìáá$"Cÿô´"CÜ"CççäçæáááxýâÌ/étá@<0éuá @áTäô"Cä8é #CL#C¼ÀAô:â¬ÀAäÁAü Ø#CT#C2€è€#Cüé¬#Cü:áüµätÿáà#C2€è $Cüé8$Cü:á´-äuýô&Cl$Ch&|¨$Cîü$CöäÄ$Cìááà$Cÿôp%C˜%CççäçæáááxýâÌ/éyá@<0ézá @áTä°%Cä8é Ü%C&C ¿Aô:âЬBää¾Aü h&C&Cé<&Cü:áp¨äyÿáp&C2€èœ&CüéÈ&Cü:á´-äzý„)Cü&Ch&|8'CîŒ'CöäT'Cìááp'Cÿôá (C((CççäçæáááxýâÌ/é~á@<0éá @áTä@(Cä8é l(C˜(C¼ÀAô:â¬ÀAäÁAü ø(C (CéÌ(Cü:á ¾ä~ÿâ)C2€è,)CüéX)Cü:áÄ-äý@,CŒ)Ch&|È)Cî*Cöää)Cìáâ*Cÿô*C¸*CççäçæáááxýâÌ/éƒá@<0é„á @"áTäÐ*Cä8é ü*C(+C¼ÀAô:â¬ÀAäÁAü ´+C0+C2€è\+Cüéˆ+Cü:ᬨäƒÿá¼+C2€èè+Cüé,Cü:áÄ-ä„ýü.CH,Ch&|„,CîØ,Cöä ,Cìáá¼,CÿôL-Ct-CççäçæáááxýâÌ/éˆá@<0é‰á @$áTäŒ-Cä8é ¸-Cä-C¼ÀAô:â¬ÀAäÁAü p.Cì-C2€è.CüéD.Cü:á¤*äˆÿáx.C2€è¤.CüéÐ.Cü:áÄ-ä‰ý¸1C/Ch&|@/Cî”/Cöä\/Cìááx/Cÿô0C00CççäçæáááxýâÌ/éá@<0éŽá @&áTäH0Cä8é t0C 0C¼ÀAô:â¬ÀAäÁAü ,1C¨0C2€èÔ0Cüê1Cü:á¤-äÿá41C2€è`1CüéŒ1Cü:áÄ-äŽýt4CÀ1Ch&|ü1CîP2Cöä2Cìáá42CÿôÄ2Cì2CççäçæáááxýâÌ/é’á@<0é“á @(áTä3Cä8é 03C\3C¼ÀAô:â¬ÀAäÁAü è3Cd3C2€è3Cüé¼3Cü:áèä’ÿáð3C2€è4CüéH4Cü:áÄ-ä“ý07C|4Ch&|¸4Cî 5CöäÔ4Cìááð4Cÿô€5C¨5CççäçæáááxýâÌ/é—á@<0é˜á @+áTäÀ5Cä8é ì5C6C¼ÀAô:â¬ÀAäÁAü ¤6C 6C2€èL6Cüéx6Cü:á´-ä—ÿá¬6C2€èØ6Cüé7Cü:áÄ-ä˜ýì9C87Ch&|t7CîÈ7Cöä7Cìáá¬7Cÿô<8Cd8CççäçæáááxýâÌ/éœá@<0éá @/áTä|8Cä8é ¨8CÔ8C¼ÀAô:â¬ÀAäÁAü `9CÜ8C2€è9Cüé49Cü:áÄ-äœÿáh9C2€è”9CüéÀ9Cü:áÄ-äý¨CL>C ¿Aô:âЬBää¾Aü ¬>CT>Cé€>Cü:áp¨ä¦ÿá´>C2€èà>Cüé ?Cü:áÄ-ä§ýÈAC@?Ch&||?CîÐ?Cöä˜?Cìáá´?CÿôD@Cl@CççäçæáááxýâÌ/é«á@<0é¬á @6áTä„@Cä8é °@CÜ@C¼ÀAô:â¬ÀAäÁAü áTäHKCä8é tKC KC¼ÀAô:â¬ÀAäÁAü ,LC¨KC2€èÔKCüêLCü:áèä¿ÿá4LC2€è`LCüéŒLCü:áüµäÀýtOCÀLCh&|üLCîPMCöäMCìáá4MCÿôÄMCìMCççäçæáááxýâÌ/éÄá@<0éÅá @AáTäNCä8é 0NC\NC¼ÀAô:â¬ÀAäÁAü èNCdNC2€èNCüé¼NCü:á´-äÄÿáðNC2€èOCüéHOCü:áüµäÅý0RC|OCh&|¸OCî PCöäÔOCìááðOCÿô€PC¨PCççäçæáááxýâÌ/éÉá@<0éÊá @EáTäÀPCä8é ìPCQC¼ÀAô:â¬ÀAäÁAü ¤QC QC2€èLQCüéxQCü:áÄ-äÉÿá¬QC2€èØQCüéRCü:áüµäÊýÀTC8RCh&|tRCîÈRCöäRCìáá¬RCÿôáçý>áçýéЀC(Cøéü€Cü:áüµäý2€èTCü8é €C¬CÄ=ô:â¼=äˆ=ü 8‚C´C2€èàCüé ‚Cü:áüµäŠÿá@‚C:á ¾äý阂CƒCøéÄ‚Cüáüµäð‚Cü:áÌ&=ä‹ý2€èHƒCüétƒCü:á ¾äýé̃Cü:áüµäý„Cx ä¸@=ä¬ä„Ch&¬T„Cÿìäp„CïጄCè쨄Cè´UêÄ„Cÿ䬨ìð„CÌV ä&äliå…Ch&li<…Cäê…CöäX…Cìát…Cÿô†C,†CççäçæáááxýâÌ/é.á@<0é/á @áDÛäD†Cä2€èp†Cü8é œ†Cd“C؆Cô:âȆCä,‡Cü â؆Cæäô†Cìá‡Cÿôh& ؆Cäääh‡Cö܇C,ˆCççäçáæáááxýâÌ/éPáÀ<0éQáÀ´ èUá€l0éVá €¡áü:äô‰Cä¢áü:ä ŠCä¥áü:äLŠCŠâ¦áü:äØŠCŠâ§áü:äd‹CŠâ¨áü:äð‹CŠâ©áü:ä|ŒCŠâªáü:äCŠâ«áü:ä”CŠâ¬áü:ä ŽCŠâ­áü:䬎CŠâ®áü:ä8CŠâ¯áü:äÄCŠâ°áü:äPCŠâ±áü:äÜCŠâ²áü:äh‘CŠâ³áü:äô‘CŠâ´áü:䀒CŠâ¶áü:ä “Cä>áçUý>áçVÿí ðÿUááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€ÀÿäðÿPááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿäðÿQááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿäðÿäáÿøâ›æ@ÿäñÿÿÿÿââ{æ@ÿä ïÿäóÿåâ|æ@ÿäðÿäáÿøâ›æ@ÿäñÿÿÿÿââ|æ@ÿä ïÿäóÿåâ{æ@ÿäñÿÿÿÿââæ@ÿäñÿÿÿÿââ´æ@ÿä ðÿUááÿÿÿ÷âŸå€ÀÿäðÿVááÿÿÿ÷â•æ@ôé8“Cü:á ¾äVý ð“Cl“C2€è˜“CüéÄ“Cü:áüµä.ÿáø“C2€è$”CüéP”Cü:áüµä/ýŒ”CHjä T[)œ”C b äP2äX<•C¬”Ch&Xè”Cæÿää•Cäçá •CèúîD•Ch&X€•CîÔ•Cö䜕CääáḕCèÿèH–Cp–Cççäçæáááxýâ|,áä4á@T#é5á@+Ⱏ䈖Cä8áä ´–Cð–Cè”Cô:âà–C䬔Cü âè”CæP—Cø–Cä$—Cü:áÔ)ä4ÿáX—Cè„—Cü:áä5ÿáìb äÀ—CÌ—Cæ âü—Cìb èL™Cèâpæh&ìb äÌ—Cä˜Cãáì˜C2ä,˜Cü—C2h˜Cÿè䤘C䔘CäãÌ—Cì âÌ—C äИCèÀ˜Cì âÌ—Cð”˜Cê™CŒHåü˜CæŒHéâ<™Cààä$™Câü˜CààèæTöäL™Câ $™CTö¼Rì°ät™Ch&°°™Cäêè™CöäÌ™Cìáý\šCpšCççäçæáááxýâÌ/é á @ªáDÛ䈚Cä2€è´šCü8é àšCÌžC›Cô:â ›CäT›Cü â›Cæä8›Cìáýh&<þ ›Cäê›CöœCœCççäçáæáááxýâÌ/é7á @Báü:ä0œCäé\œCˆœCø5ðð?÷ é´œCàœCø5ñ@÷é C8Cø5ðð?÷8é dCžC Cô:âCäØCü â Cæä¼Cïýh& $ CæÿèžC éHžCtžCø5ñ@÷é žCü:á ¾ä7ÿáÔžC2€éŸCüé,ŸCü:áp¨ä ýH¢C,nähŸCh&,n¤ŸCäêøŸCöäÀŸCìáÜŸCÿôl C” CççäçæáááxýâÌ/é3á@<0é4á @áDÛ䬠Cä2€èØ Cü8é ¡C0¡C؆Cô:âȆCä,‡Cü ¼¡C8¡C2€èd¡Cüé¡Cü:áp¨ä3ÿáÄ¡C2€èð¡Cüé¢Cü:áp¨ä4ÿáäS äX¢Ch&äS ”¢Cÿìä°¢CïáÌ¢C蜨-ø¼RîÌ äø¢Ch&Ì 4£Cäêl£CöäP£Cìáýà£Cô£CççäçæáááxýâÌ/éá @¨áDÛä ¤Cä2€è8¤Cü8é d¤C¤C›Cô:â ›CäT›Cÿà˜¤C2€èĤCüéð¤Cü:áüµäÿá\ ä,¥Ch&\ h¥Cÿìä„¥Cïá ¥Cè¼Rø¼RêÌ¥Cð\ ä ´s,P¦CÜ\ äÜ¥Ch&Ü\ ¦Cÿìä4¦CïíîlU ä`¦Ch&lU œ¦Cÿì並CïáÔ¦Cè¼Rö¼Rðüi å§Ch&üi <§CÿìäX§Cä¼Rçý*L·C<4„§CŒ¢-h©CŒ§Ch&<4ȧCï¨Cöää§Cìáýt¨Cˆ¨CççäçæáááxýâÌ/éá @èá ä ¨Cä8é ̨C©Cè -ô:âø¨C䬠-ü âè -ê©Cé<©Cü:áüµäýL«Cp©Ch&<4¬©Cîä©CöäÈ©CìáýXªClªCççäçæáááxýâÌ/éá @êá 䄪Cä8é °ªCìªCì¥-ô:âܪCä°¥-ü âì¥-êôªCé «Cü:áp¨äýL­CT«Ch&<4«CîÈ«Cö䬫Cìáý<¬CP¬CççäçæáááxýâÌ/é%á @&áTäh¬Cä8é ”¬CÀ¬CT¢-ô:âD¢-䌢-ÿàȬC2€èô¬Cüé ­Cü:ᬨä%ýL¯CT­Ch&<4­CîÈ­Cö䬭Cìáý<®CP®CççäçæáááxýâÌ/é)á @(áTäh®Cä8é ”®CÀ®CT¢-ô:âD¢-䌢-ÿàÈ®C2€èô®Cüé ¯Cü:á¤*ä)ýL±CT¯Ch&<4¯CîȯCö䬯Cìáý<°CP°CççäçæáááxýâÌ/é-á @*áTäh°Cä8é ”°CÀ°CT¢-ô:âD¢-䌢-ÿàȰC2€èô°Cüé ±Cü:á¤-ä-ýL³CT±Ch&<4±CîȱCö䬱Cìáý<²CP²CççäçæáááxýâÌ/é1á @,áTäh²Cä8é ”²CÀ²CT¢-ô:âD¢-䌢-ÿàȲC2€èô²Cüé ³Cü:áèä1ýLµCT³Ch&<4³CîȳCö䬳Cìáý<´CP´CççäçæáááxýâÌ/é5á @/áTäh´Cä8é ”´CÀ´CT¢-ô:âD¢-䌢-ÿàÈ´C2€èô´Cüé µCü:á´-ä5ÿáTµCh&<4µCîȵCö䬵Cìáý<¶CP¶CççäçæáááxýâÌ/é9á @3áTäh¶Cä8é ”¶CÀ¶CT¢-ô:âD¢-䌢-ÿàȶC2€èô¶Cüé ·Cü:áÄ-ä9ÿá`_ ä\·Ch&`_ ˜·Cÿìä´·Cä8ýçáзCè8ýìì·CèÿêàX ¸CÄ ¸CìÁ(¸C¸¾ä  »@¸CH6ä lAP¸C86äD+Aä(6ä`¸CÀ—?êä6ä|¸Ch&ä6¸¸CÿìäÔ¸Cïáð¸C蜨-ì ¹Cÿô@¹CP)ä8¹CÌ:'æ& P¹C,‡CÄ»CX¹Ch& ”¹Cîè¹Cöä°¹Cìáá̹Cÿô\ºC„ºCççäçæáááxýâÌ/ésá@<0étá @,á 䜺Cä8é ȺC»C<…Cô:âôºCå…Cü â<…Cæ d»C »Cé8»Cü:áüµäsÿál»C阻Cü:áüµätý8¾CÌ»Ch& ¼Cî\¼Cöä$¼Cìáá@¼CÿôмCø¼CççäçæáááxýâÌ/éxá@<0éyá @.á ä½Cä8é <½Cx½C¤ŸCô:âh½CähŸCü ⤟Cæ Ø½C€½C鬽Cü:áp¨äxÿáà½Cé ¾Cü:áp¨äyýÈÀC@¾Ch& |¾CîоCö䘾Cìáá´¾CÿôD¿Cl¿CççäçæáááxýâÌ/éë á@<0éì á @ÞáTä„¿Cä8é °¿CÜ¿C؆Cô:âȆCä,‡Cü <ÀCä¿CéÀCü:á ¾äë ÿáDÀC2€èpÀCüéœÀCü:ᬨäì ý„ÃCÐÀCh&  ÁCî`ÁCöä(ÁCìááDÁCÿôÔÁCüÁCççäçæáááxýâÌ/éð á@<0éñ á @àáTäÂCä8é @ÂClÂC؆Cô:âȆCä,‡Cü øÂCtÂC2€è ÂCüéÌÂCü:ᬨäð ÿâÃC2€è,ÃCüéXÃCü:ᬨäñ ý@ÆCŒÃCh& ÈÃCîÄCöääÃCìáâÄCÿôÄC¸ÄCççäçæáááxýâÌ/éõ á@<0éö á @âáTäÐÄCä8é üÄC(ÅC؆Cô:âȆCä,‡Cü ´ÅC0ÅC2€è\ÅCüéˆÅCü:á¤*äõ ÿá¼ÅC2€èèÅCüéÆCü:ᬨäö ýüÈCHÆCh& „ÆCîØÆCöä ÆCìáá¼ÆCÿôLÇCtÇCççäçæáááxýâÌ/éú á@<0éû á @äáTäŒÇCä8é ¸ÇCäÇC؆Cô:âȆCä,‡Cü pÈCìÇC2€èÈCüéDÈCü:á¤-äú ÿáxÈC2€è¤ÈCüéÐÈCü:ᬨäû ý¸ËCÉCh& @ÉCî”ÉCöä\ÉCìááxÉCÿôÊC0ÊCççäçæáááxýâÌ/éÿ á@<0êá @æáTäHÊCä8é tÊC ÊC؆Cô:âȆCä,‡Cü ,ËC¨ÊC2€èÔÊCüêËCü:áèäÿ ÿá4ËC2€è`ËCüéŒËCü:ᬨåýtÎCÀËCh& üËCîPÌCöäÌCìáá4ÌCÿôÄÌCìÌCççäçæáááxýâÌ/éá@<0éá @éáTäÍCä8é 0ÍC\ÍC؆Cô:âȆCä,‡Cü èÍCdÍC2€èÍCüé¼ÍCü:á´-äÿáðÍC2€èÎCüéHÎCü:ᬨäý0ÑC|ÎCh& ¸ÎCî ÏCöäÔÎCìááðÎCÿô€ÏC¨ÏCççäçæáááxýâÌ/é á@<0é á @íáTäÀÏCä8é ìÏCÐC؆Cô:âȆCä,‡Cü ¤ÐC ÐC2€èLÐCüéxÐCü:áÄ-ä ÿá¬ÐC2€èØÐCüéÑCü:ᬨä ýìÓC8ÑCh& tÑCîÈÑCöäÑCìáá¬ÑCÿô<ÒCdÒCççäçæáááxýâÌ/éá@<0éá @ðáTä|ÒCä8é ¨ÒCÔÒC؆Cô:âȆCä,‡Cü `ÓCÜÒC2€èÓCüé4ÓCü:áüµäÿáhÓC2€è”ÓCüéÀÓCü:ᬨäý|ÖCôÓCh& 0ÔCî„ÔCöäLÔCìááhÔCÿôøÔC ÕCççäçæáááxýâÌ/éá@<0éá @òáTä8ÕCä8é dÕCÕC¤ŸCô:âh½CähŸCü ðÕC˜ÕCéÄÕCü:áp¨äÿáøÕC2€è$ÖCüéPÖCü:ᬨäý ÙC„ÖCh& ÀÖCî×CöäÜÖCìááøÖCÿôˆ×C°×CççäçæáááxýâÌ/éá@<0éá @ôáTäÈ×Cä8é ô×C ØC؆Cô:âȆCä,‡Cü €ØC(ØCéTØCü:á ¾äÿáˆØC2€è´ØCüéàØCü:á¤*äýÈÛCÙCh& PÙCî¤ÙCöälÙCìááˆÙCÿôÚC@ÚCççäçæáááxýâÌ/éá@<0éá @öáTäXÚCä8é „ÚC°ÚC؆Cô:âȆCä,‡Cü <ÛC¸ÚC2€èäÚCüéÛCü:ᬨäÿáDÛC2€èpÛCüéœÛCü:á¤*äý„ÞCÐÛCh&  ÜCî`ÜCöä(ÜCìááDÜCÿôÔÜCüÜCççäçæáááxýâÌ/é"á@<0é#á @øáTäÝCä8é @ÝClÝC؆Cô:âȆCä,‡Cü øÝCtÝC2€è ÝCüéÌÝCü:á¤*ä"ÿâÞC2€è,ÞCüéXÞCü:á¤*ä#ý@áCŒÞCh& ÈÞCîßCöääÞCìáâßCÿôßC¸ßCççäçæáááxýâÌ/é'á@<0é(á @úáTäÐßCä8é üßC(àC؆Cô:âȆCä,‡Cü ´àC0àC2€è\àCüéˆàCü:á¤-ä'ÿá¼àC2€èèàCüéáCü:á¤*ä(ýüãCHáCh& „áCîØáCöä áCìáá¼áCÿôLâCtâCççäçæáááxýâÌ/é,á@<0é-á @üáTäŒâCä8é ¸âCäâC؆Cô:âȆCä,‡Cü pãCìâC2€èãCüéDãCü:áèä,ÿáxãC2€è¤ãCüéÐãCü:á¤*ä-ý¸æCäCh& @äCî”äCöä\äCìááxäCÿôåC0åCççäçæáááxýâÌ/é1á@<0é2á @ÿáTäHåCä8é tåC åC؆Cô:âȆCä,‡Cü ,æC¨åC2€èÔåCüêæCü:á´-ä1ÿá4æC2€è`æCüéŒæCü:á¤*ä2ýtéCÀæCh& üæCîPçCöäçCìáá4çCÿôÄçCìçCççäçæáááxýâÌ/é6á@<0é7á @áTäèCä8é 0èC\èC؆Cô:âȆCä,‡Cü èèCdèC2€èèCüé¼èCü:áÄ-ä6ÿáðèC2€èéCüéHéCü:á¤*ä7ý0ìC|éCh& ¸éCî êCöäÔéCìááðéCÿô€êC¨êCççäçæáááxýâÌ/é;á@<0é<á @áTäÀêCä8é ìêCëC؆Cô:âȆCä,‡Cü ¤ëC ëC2€èLëCüéxëCü:áüµä;ÿá¬ëC2€èØëCüéìCü:á¤*ä<ýÀîC8ìCh& tìCîÈìCöäìCìáá¬ìCÿô<íCdíCççäçæáááxýâÌ/é@á@<0éAá @áTä|íCä8é ¨íCÔíC¤ŸCô:âh½CähŸCü 4îCÜíCéîCü:áp¨ä@ÿá<îC2€èhîCüé”îCü:á¤*äAýPñCÈîCh& ïCîXïCöä ïCìáá<ïCÿôÌïCôïCççäçæáááxýâÌ/éEá@<0éFá @ áTä ðCä8é 8ðCdðC؆Cô:âȆCä,‡Cü ÄðClðCé˜ðCü:á ¾äEÿáÌðC2€èøðCüé$ñCü:á¤-äFý ôCXñCh& ”ñCîèñCöä°ñCìááÌñCÿô\òC„òCççäçæáááxýâÌ/éJá@<0éKá @ áTäœòCä8é ÈòCôòC؆Cô:âȆCä,‡Cü €óCüòC2€è(óCüéTóCü:ᬨäJÿáˆóC2€è´óCüéàóCü:á¤-äKýÈöCôCh& PôCî¤ôCöälôCìááˆôCÿôõC@õCççäçæáááxýâÌ/éOá@<0éPá @áTäXõCä8é „õC°õC؆Cô:âȆCä,‡Cü <öC¸õC2€èäõCüéöCü:á¤*äOÿáDöC2€èpöCüéœöCü:á¤-äPý„ùCÐöCh&  ÷Cî`÷Cöä(÷CìááD÷CÿôÔ÷Cü÷CççäçæáááxýâÌ/éTá@<0éUá @áTäøCä8é @øCløC؆Cô:âȆCä,‡Cü øøCtøC2€è øCüéÌøCü:á¤-äTÿâùC2€è,ùCüéXùCü:á¤-äUý@üCŒùCh& ÈùCîúCöääùCìáâúCÿôúC¸úCççäçæáááxýâÌ/éYá@<0éZá @áTäÐúCä8é üúC(ûC؆Cô:âȆCä,‡Cü ´ûC0ûC2€è\ûCüéˆûCü:áèäYÿá¼ûC2€èèûCüéüCü:á¤-äZýüþCHüCh& „üCîØüCöä üCìáá¼üCÿôLýCtýCççäçæáááxýâÌ/é^á@<0é_á @áTäŒýCä8é ¸ýCäýC؆Cô:âȆCä,‡Cü pþCìýC2€èþCüéDþCü:á´-ä^ÿáxþC2€è¤þCüéÐþCü:á¤-ä_ý¸DÿCh& @ÿCî”ÿCöä\ÿCìááxÿCÿôD0DççäçæáááxýâÌ/écá@<0édá @áTäHDä8é tD D؆Cô:âȆCä,‡Cü ,D¨D2€èÔDüêDü:áÄ-äcÿá4D2€è`DüéŒDü:á¤-ädýtDÀDh& üDîPDöäDìáá4DÿôÄDìDççäçæáááxýâÌ/éhá@<0éiá @áTäDä8é 0D\D؆Cô:âȆCä,‡Cü èDdD2€èDüé¼Dü:áüµähÿáðD2€èDüéHDü:á¤-äiýD|Dh& ¸Dî DöäÔDìááðDÿô€D¨DççäçæáááxýâÌ/émá@<0éná @áTäÀDä8é ìDD¤ŸCô:âh½CähŸCü xD DéLDü:áp¨ämÿá€D2€è¬DüéØDü:á¤-äný” D Dh& HDîœDöädDìáá€DÿôD8DççäçæáááxýâÌ/érá@<0ésá @ áTäPDä8é |D¨D؆Cô:âȆCä,‡Cü  D°DéÜDü:á ¾ärÿá D2€è< Düéh Dü:áèäsýP Dœ Dh& Ø Dî, Döäô Dìáá Dÿô  DÈ DççäçæáááxýâÌ/éwá@<0éxá @"áTäà Dä8é D8 D؆Cô:âȆCä,‡Cü Ä D@ D2€èl Düé˜ Dü:ᬨäwÿáÌ D2€èø Düé$ Dü:áèäxý DX Dh& ” Dîè Döä° DìááÌ Dÿô\ D„ DççäçæáááxýâÌ/é|á@<0é}á @$áTäœ Dä8é È Dô D؆Cô:âȆCä,‡Cü €Dü D2€è(DüéTDü:á¤*ä|ÿáˆD2€è´DüéàDü:áèä}ýÈDDh& PDî¤DöälDìááˆDÿôD@DççäçæáááxýâÌ/éá@<0é‚á @&áTäXDä8é „D°D؆Cô:âȆCä,‡Cü <D¸D2€èäDüéDü:á¤-äÿáDD2€èpDüéœDü:áèä‚ý„DÐDh&  Dî`Döä(DìááDDÿôÔDüDççäçæáááxýâÌ/é†á@<0é‡á @(áTäDä8é @DlD؆Cô:âȆCä,‡Cü øDtD2€è DüéÌDü:áèä†ÿâD2€è,DüéXDü:áèä‡ý@DŒDh& ÈDîDöääDìáâDÿôD¸DççäçæáááxýâÌ/é‹á@<0éŒá @+áTäÐDä8é üD(D؆Cô:âȆCä,‡Cü ´D0D2€è\DüéˆDü:á´-ä‹ÿá¼D2€èèDüéDü:áèäŒýüDHDh& „DîØDöä Dìáá¼DÿôLDtDççäçæáááxýâÌ/éá@<0é‘á @/áTäŒDä8é ¸DäD؆Cô:âȆCä,‡Cü pDìD2€èDüéDDü:áÄ-äÿáxD2€è¤DüéÐDü:áèä‘ý¸DDh& @Dî”Döä\DìááxDÿôD0DççäçæáááxýâÌ/é•á@<0é–á @2áTäHDä8é tD D؆Cô:âȆCä,‡Cü ,D¨D2€èÔDüêDü:áüµä•ÿá4D2€è`DüéŒDü:áèä–ýHDÀDh& üDîPDöäDìáá4DÿôÄDìDççäçæáááxýâÌ/éšá@<0é›á @4áTäDä8é 0D\D¤ŸCô:âh½CähŸCü ¼DdDéDü:áp¨äšÿáÄD2€èðDüéDü:áèä›ýØ!DPDh& ŒDîàDöä¨DìááÄDÿôT D| DççäçæáááxýâÌ/éŸá@<0é á @7áTä” Dä8é À Dì D؆Cô:âȆCä,‡Cü L!Dô Dé !Dü:á ¾äŸÿáT!D2€è€!Düé¬!Dü:á´-ä ý”$Dà!Dh& "Dîp"Döä8"DìááT"Dÿôä"D #DççäçæáááxýâÌ/é¤á@<0é¥á @:áTä$#Dä8é P#D|#D؆Cô:âȆCä,‡Cü $D„#D2€è°#DüéÜ#Dü:ᬨä¤ÿá$D2€è<$Düéh$Dü:á´-ä¥ýP'Dœ$Dh& Ø$Dî,%Döäô$Dìáá%Dÿô %DÈ%DççäçæáááxýâÌ/é©á@<0éªá @<áTäà%Dä8é &D8&D؆Cô:âȆCä,‡Cü Ä&D@&D2€èl&Düé˜&Dü:á¤*ä©ÿáÌ&D2€èø&Düé$'Dü:á´-äªý *DX'Dh& ”'Dîè'Döä°'DìááÌ'Dÿô\(D„(DççäçæáááxýâÌ/é®á@<0é¯á @>áTäœ(Dä8é È(Dô(D؆Cô:âȆCä,‡Cü €)Dü(D2€è()DüéT)Dü:á¤-ä®ÿáˆ)D2€è´)Düéà)Dü:á´-ä¯ýÈ,D*Dh& P*Dî¤*Döäl*Dìááˆ*Dÿô+D@+DççäçæáááxýâÌ/é³á@<0é´á @@áTäX+Dä8é „+D°+D؆Cô:âȆCä,‡Cü <,D¸+D2€èä+Düé,Dü:áèä³ÿáD,D2€èp,Düéœ,Dü:á´-ä´ý„/DÐ,Dh&  -Dî`-Döä(-DìááD-DÿôÔ-Dü-DççäçæáááxýâÌ/é¸á@<0é¹á @CáTä.Dä8é @.Dl.D؆Cô:âȆCä,‡Cü ø.Dt.D2€è .DüéÌ.Dü:á´-ä¸ÿâ/D2€è,/DüéX/Dü:á´-ä¹ý@2DŒ/Dh& È/Dî0Döää/Dìáâ0Dÿô0D¸0DççäçæáááxýâÌ/é½á@<0é¾á @GáTäÐ0Dä8é ü0D(1D؆Cô:âȆCä,‡Cü ´1D01D2€è\1Düéˆ1Dü:áÄ-ä½ÿá¼1D2€èè1Düé2Dü:á´-ä¾ýü4DH2Dh& „2DîØ2Döä 2Dìáá¼2DÿôL3Dt3DççäçæáááxýâÌ/éÂá@<0éÃá @JáTäŒ3Dä8é ¸3Dä3D؆Cô:âȆCä,‡Cü p4Dì3D2€è4DüéD4Dü:áüµäÂÿáx4D2€è¤4DüéÐ4Dü:á´-äÃýŒ7D5Dh& @5Dî”5Döä\5Dìááx5Dÿô6D06DççäçæáááxýâÌ/éÇá@<0éÈá @LáTäH6Dä8é t6D 6D¤ŸCô:âh½CähŸCý7D¨6DéÔ6Dü:áp¨äÇÿá7D2€è47Düé`7Dü:á´-äÈý:D”7Dh& Ð7Dî$8Döäì7Dìáá8Dÿô˜8DÀ8DççäçæáááxýâÌ/éÌá@<0éÍá @OáTäØ8Dä8é 9D09D؆Cô:âȆCä,‡Cü 9D89Déd9Dü:á ¾äÌÿá˜9D2€èÄ9Düéð9Dü:áÄ-äÍýØDççäçæáááxýâÌ/éÖá@<0é×á @TáTä$>Dä8é P>D|>D؆Cô:âȆCä,‡Cü ?D„>D2€è°>DüéÜ>Dü:á¤*äÖÿá?D2€èäÐŽDœ­'æ`j äèŽDÀéæ„b åD¼\êœ@äDÔ¬æ$m ä4DátâøDpAäLDh&pAˆDÿìä¤Dä8ýçáÀDè8ýêÜDÿøðw äDh&ðw DDÿìä`Dïá|D蜨-ø¼Rì*p DÔg ¨Dß;Œ’D°Dh&Ôg ìDî$‘Döä‘Dìáý˜‘D¬‘DççäçæáááxýâÌ/é)á @á äÄ‘Dä8é ð‘D,’DpÝ;ô:â’Dä4Ý;ü âpÝ;ê4’Dé`’Dü:áüµä)ýp”D”’Dh&Ôg Ð’Dî“Döäì’Dìáý|“D“DççäçæáááxýâÌ/é-á @á 䨓Dä8é Ô“D”D¬é<ô:ã”Däpé<ü â¬é<ê”DéD”Dü:áp¨ä-ýp–Dx”Dh&Ôg ´”Dîì”DöäДDìáý`•Dt•DççäçæáááxýâÌ/émá @ŽáT䌕Dä8é ¸•Dä•DÜÞ;ô:âÌÞ;äß;ÿàì•D2€è–DüéD–Dü:ᬨämýp˜Dx–Dh&Ôg ´–Dîì–DöäЖDìáý`—Dt—DççäçæáááxýâÌ/éqá @áT䌗Dä8é ¸—Dä—DÜÞ;ô:âÌÞ;äß;ÿàì—D2€è˜DüéD˜Dü:á¤*äqýpšDx˜Dh&Ôg ´˜Dîì˜DöäИDìáý`™Dt™DççäçæáááxýâÌ/éuá @’áT䌙Dä8é ¸™Dä™DÜÞ;ô:âÌÞ;äß;ÿàì™D2€èšDüéDšDü:á¤-äuýpœDxšDh&Ôg ´šDîìšDöäКDìáý`›Dt›DççäçæáááxýâÌ/éyá @”áT䌛Dä8é ¸›Dä›DÜÞ;ô:âÌÞ;äß;ÿàì›D2€èœDüéDœDü:áèäyýpžDxœDh&Ôg ´œDîìœDöäМDìáý`DtDççäçæáááxýâÌ/é}á @—áTäŒDä8é ¸DäDÜÞ;ô:âÌÞ;äß;ÿàìD2€èžDüéDžDü:á´-ä}ÿáxžDh&Ôg ´žDîìžDöäОDìáý`ŸDtŸDççäçæáááxýâÌ/éá @›áT䌟Dä8é ¸ŸDäŸDÜÞ;ô:âÌÞ;äß;ÿàìŸD2€è DüéD Dü:áÄ-äÿἀ䀠Døædh ä “%äàƒä i%À D¤ä¸ D\4'æÄ~ äРD`H'æ¸Jäè Dh&¸J$¡Dâÿè÷áX¡DˆP¡DLJ"ä <"ä Do h¡DôÔ%䬰%á¥DD3䀡Dh&D3¼¡Däê¢Dö䨡Dìááô¡Dÿô„¢D¬¢Dççäçæáááxýâ<0éá@Ì/éžá@¸âDÛäÄ¢Dä2€èð¢Dü8é £Dè£DX£Dô:âH£D䬣Dü âX£Dæät£Dïá£Dÿôh&XðX£Dæÿä t¤Dð£D2€è¤DüéH¤Dü:áp¨äÿá|¤D2€è¨¤DüéÔ¤Dü:áp¨äžÿá03ä¥Dh&03L¥Dð„¥Döäh¥Dìáýø¥D ¦DççäçæáááxýâT#ékâ@3â$ä$¦Dä7é P¦DܧD¨Dôé|¦D,§Døé¨¦Dá§DøéÔ¦Dü:ᬨäkþ4ÿêéX§D°§Døé„§Dü:ᬨäkþ4ëý4ÿêé4¨DüªDø2é`¨Dü錨DüáX+-丨DLªDøáX+-ää¨Düá|(-ä©D ªDøá|(-ä<©DüáÔ-äh©Dô©Dø8áÔ-ä ”©DÀ©Dì8-ô:âÜ8-ä$9-ÿàÈ©D4êþ4ê¼ý4êþ éxªDЪDøé¤ªDü:ᬨäkþ4êþ4êÿâ€Mä@é8ää8äH«Dh&ä8„«DäêØ«Döä «DìáἫDÿôL¬Dt¬Dççäçæáááxýâ<0é˜á@Ì/é™á@¶âDÛ䌬Dä2€è¸¬Dü8é ä¬D­DX£Dô:âH£D䬣Dü œ­D­D2€èD­Düép­Dü:áüµä˜ÿ᤭D2€èЭDüéü­Dü:áüµä™ý@®DØu ä8®D¤¯,æÄu äP®Dh&Äu Œ®Dÿì䨮DïáÄ®Dè¼Rö¼Rîà‡ äð®D›â¯D äô<äˆ ä¯Dh&ˆ T¯Dÿìäp¯DïጯDè8ý쨯DÿôܯDLäÔ¯D$Hâ>$°D¼Sì¯D”ºô¯D€b+ü¯D|è'°D@1 °DlÌ4°DЈ9°DÌm9ä,&ä,ä4°D=AæxDäHm-äœUä\°Dð†'æ$„ ät°DtŸ?æèŠ äŒ°Dh&èŠ È°Dÿìää°Dïâ±Dè¼Rö¼RîT+äpè8äà?ä<±DðPæØ,äT±Dh&Ø,±Dÿì䬱DïáȱDèöîl† äô±Dâh&l† æÿéHä €r-P²DHŽ äÄÂ,ä4Iä`²DØÈ;æ°–äx²Dh&°–´²Dâÿèä вDì²D4Ä;ö4Ä;øÀ¸DP~ ä³Dh&P~ D³Däê|³Döä`³Dìýð³D´DççäçæáááxýâÌ/é~á @PáDÛä´Dä8é H´D4¸D„´Dô:ât´Dä¼´Dü â„´Dæä ´Dìýh&ü „´Däääø´DölµD”µDççäçáæáááxýâÌ/é¡áÀ€/ è¥á€Gâü:ä ¶DäJâü:ä8¶DŠâKâü:äĶDŠâLâü:äP·DŠâNâü:äÜ·Dä>áç¥ÿíðÿ¡ááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿä ðÿ¥ááÿÿÿ÷â˜æ@ôé¸Dü:á¤-ä¥ÿá<¸D2€èh¸Dü锸Dü:áp¨ä~ÿá<~ äиDî ”€ ì¸DT#ä ¨#¹DT_äxâ+ä<_ä¹Dh&<_P¹Dÿìäl¹Dï휨-ðD• ä p@ »D„ 䨹Dh&„ ä¹DäêºDöåºDìýºD¤ºDççäçæáááxýâÌ/ézá @NáDÛ伺Dä8é èºD»D„´Dô:ât´Dä¼´Dÿà»D2€èH»Düét»Dü:áüµäzÿáxä°»Dh&xì»Dÿìä¼Dïá$¼Dè¼Rì@¼Dÿä¼RîÜ– äl¼Dh&Ü– ¨¼DÿìäļDïáà¼Dèìü¼Dÿäê0½D˜ (½DD¹$ä®$ä ð— @½D ^,äœQ,äáçªÿíðÿ¦ááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿä ðÿªááÿÿÿ÷â˜æ@ôéäåDü:á´-äªýüéDæDh&p– TæDîŒæDöäpæDìáýá çDçDççäçæáááxýâÌ/é‡á @Eá ä,çDä8é XçDœéD”çDô:â„çDäÌçDü â”çDæä°çDìýh&8­”çDäêèDö|èDèDççäçæáááxýâÌ/éBá @2áDÛä¨èDä8é ÔèDéDœâDô:ãéDä`âDü âœâDêéD2€èDéDüépéDü:áüµäBÿá¤éDéÐéDü:áüµä‡ýØíDêDh&p– @êDîxêDöä\êDìáýìêDáëDççäçæáááxýâÌ/é‹á @Iá äëDä8é DëDxíD€ëDô:âpëDä¸ëDü â€ëDæäœëDìýh&¼ª€ëDäêôëDöhìD|ìDççäçæáááxýâÌ/éFá @4áDÛä”ìDä8é ÀìDììDœâDô:ãéDä`âDÿàôìD2€è íDüéLíDü:áp¨äFÿá€íDé¬íDü:áp¨ä‹ýØïDàíDh&p– îDîTîDöä8îDìáýÈîDÜîDççäçæáááxýâÌ/éá @ÏáTäôîDä8é ïDLïDœâDô:ãéDä`âDÿàTïD2€è€ïDüé¬ïDü:ᬨäýØñDàïDh&p– ðDîTðDöä8ðDìáýÈðDÜðDççäçæáááxýâÌ/é“á @ÓáTäôðDä8é ñDLñDœâDô:ãéDä`âDÿàTñD2€è€ñDüé¬ñDü:á¤*ä“ýØóDàñDh&p– òDîTòDöä8òDìáýÈòDÜòDççäçæáááxýâÌ/é—á @×áTäôòDä8é óDLóDœâDô:ãéDä`âDÿàTóD2€è€óDüé¬óDü:á¤-ä—ýØõDàóDh&p– ôDîTôDöä8ôDìáýÈôDÜôDççäçæáááxýâÌ/é›á @ÛáTäôôDä8é õDLõDœâDô:ãéDä`âDÿàTõD2€è€õDüé¬õDü:áèä›ýØ÷DàõDh&p– öDîTöDöä8öDìáýÈöDÜöDççäçæáááxýâÌ/éŸá @àáTäôöDä8é ÷DL÷DœâDô:ãéDä`âDÿàT÷D2€è€÷Düé¬÷Dü:á´-äŸÿáà÷Dh&p– øDîTøDöä8øDìáýÈøDÜøDççäçæáááxýâÌ/é£á @æáTäôøDä8é ùDLùDœâDô:ãéDä`âDÿàTùD2€è€ùDüé¬ùDü:áÄ-ä£ýèùD  ä€'%äÌ©äøùDh&Ì©4úDÿìäPúDïálúD蜨-ìˆúDè¼Rö¼Rì.ÜúDTm´úD0†+¼úDD‚+ÄúDH+ÌúD z+ÔúDèt+ä äp+øúD€ äìúD¨^êPWäûDh&PWDûDÿìä`ûDä¼Rçí¼Rð¼ªä ¸ëDHüDT¡ äœûDh&T¡ ØûDÿìäôûDïáüDè¼Rì,üDè¼Rö¼Rð<¡ äXüDh&<¡ ”üDÿìä°üD䜨-çáÌüDÿä¼RîØ¡ äøüDh&Ø¡ 4ýDÿìäPýDïálýDèö¼Rð8­äÌçDä § ä¨ýDì†)æä°äœpä¨ äÐýDh&¨ þDÿìä(þDä8ýçáDþDè8ýê`þDè8ýê|þDø˜þDÿä Ð;ìÌþD°^äÄþDð©'æ8 ä–-ä_äìþDôþDââ $ÿD_DEèXEäpæh&_äôþDäDÿDãáE´W äTÿD$ÿD´W ÿD ö,Yîä¼ÿDì!ãôþDìèÿDèØÿDì âôþDÿà´E0V äE$ÿD0V PE öØ\îä|Eì!ãôþDì˜EèØÿDÿèpEhÆ äÄE$ÿDhÆ áE îTEöä ,EHE¼Râ2„€âôþDâ êœ1 äØÿDöÈEÜEççäçæáááxýâœ1 ØÿDâÅâ@á`∪åôEä:¼Rä EPewöæ (X \EöÀÞî êäEì.ä€E$ÿDì.¼EîEöäèEEè2 €âôþDä êœ1 äØÿDø„E¬Eççäçæáááxýâœ1 ØÿDäÊâ@è\ èÐä_∪áTExEä_∪á E0Eä_∪áèE Eä_∪í_∪ádEˆEä_∪í_∪åîxEâÐîâØÿDä¤E8EøáØÿDäÐEüáØÿDäüEü:á(EäÊþ âØÿDæèdEàEø:èEüâ$ÿD|ïÌE ÿäìâ4êÿæ0EâÐîâ8Èé \EˆEPÇ,ô:€@Ç,ä$Ë,ÿàEé¼Eü:á(EäÊÿæ EâÐîâé8Eü:á(EäÊÿâÐâöâ8é ´EàExgAô:âhgAÿèèE:áägAäÐþ E2ä$E$ÿD2`EîàEöä œEÔEŒEä€âôþDäæ âôþD ä¸Eœ1 äØÿDðˆ$äŒEöT E| Eççäçæáááxýâœ1 ØÿDäÓâ @ˆ$ŒEâÔâ@á^âˆªå” EäáÀ EäÐ Eü âôþDæ:áü EäÓþ âÀ Eæ",E`/E E$ÿD`/X Eî¬ Eöä„ E  Eè€âôþDäêœ1 äØÿDø E4 Eççäçæáááxýâœ1 ØÿDäÝâ@\∪å| Eä\∪á4 EX Eä\∪ጠE° Eä8á°Ï,ä ¨ EÔ EHÐ,ô:â„Û,ä Ð,ÿàÜ Eé Eü:á(EäÝÿâÝâ$Ë,ôâØÿDä„ E EøáØÿDä° EüáØÿDäÜ Eü:á(EäÝþè4 E` Eø:èEü4êÿâÝâ$Ë,ôâéÜ Eü:á(EäÝÿâE$ÿD`/LEî¼EöäxE°Eè€âôþDäæ”Eœ1 äØÿDðˆ$äŒEö0EXEççäçæáááxýâœ1 ØÿDäØâ @ˆ$ŒEâÙâ@á]∪å Eä]∪áXE|Eä]∪á°EÔEä8á°Ï,ä ÌEøEHÐ,ô:â„Û,ä Ð,ÿáEé,Eü:á(EäØÿâØâ$Ë,ôâØÿDä¨E,EøáØÿDäÔEüáØÿDåEü:á(EäØþèXE„Eø:èEü4êÿâØâ$Ë,ôâêEü:á(EäØÿâ_ä<EôþDæ¨Ç,ìEôþDäæ_äT§8älhäˆEpª-æ¬EØ› ¤E¬Ïä$Ë䬠 äðœ-äøJä<§8ä`KäÜE §8æ |ôETñ!ä<Ü!ä¯ ä Eh&¯ HEÿìädEïá€Eè¼RìœEø¸Eè¼Rö8Ã-î(Ÿ ääEh&(Ÿ Eÿìä<Eïí8ýìpE± ähE æ¼~ä€Eh&¼~¼EÿìäØEï휨-𘧠äEh&˜§ @Eÿìä\EïáxEè8ýê”Eø°Eÿ䜨-ìÌ$E@ÀäÜEäEââE@Àèœ$Eèpæh&@ÀääEä4E ãáE2äDEE2€Eâÿèä¼Eä¬EäääEäæ âäE äèEèØEì âäEð¬Eê´E`/äEE`/PEâÿèä|EìãäEäæ˜EèØEø¬Eê¸EŒ‚ äÄEEŒ‚ áEîHEöä,Eä¼Râ„€âäEäêœ1 äØEê¼EÐEççäçæáááxýâœ1 ØEâáâ@_âÌFäèEä2¼RäEüÌ'ä@EülEä|Eü âäEæ:¨Eäáþ âlEæ\EðŒäÈEEðŒEîhEöä0E쀀âäEä æLEœ1 äØEîì¿ä¬EêÜEEççäçæáááxýâœ1 ØEâåâ @쿬Eâæâ@^âÌFäEäéHE0Eø8é tE°E¼ÏAô:â Eä€ÏAü â¼ÏAæhE¸E2¼RääEüÌ'äEülEä<Eü:¨Eäåÿâ pE2¼RäœEüÌ'äÈEü¬EäôEü: Eäæþ â¬Eæ4ÿêà E`4älEE`4¨Eî EöäÔE쀀âäEä æðEœ1 äØEîì¿ä¬Eê€E¨Eççäçæáááxýâœ1 ØEâêâ @쿬Eâëâ@]âÌFäÀEäéìE´ Eø8é EDE¼ÏAô:â Eä€ÏAüüELE2¼RäxEüÌ'ä¤EülEäÐEü:¨Eäêÿâ  E2¼Rä0 EüÌ'ä\ Eü¬Eäˆ Eü: Eäëþ4ÿêd$E5äð EE5,!Eî!EöäX!E쀀âäEä æt!Eœ1 äØEîì¿ä¬Eê"E,"Eççäçæáááxýâœ1 ØEâïâ @쿬Eâðâ@\âÌFäD"Eäép"E8$Eø8é œ"EÈ"E¼ÏAô:â Eä€ÏAü€#EÐ"E2¼Räü"EüÌ'ä(#EülEäT#Eü:¨Eäïÿâ ˆ#E2¼Rä´#EüÌ'äà#Eü¬Eä $Eü: Eäðþ4ÿêŒ$EôÐ ät$EåôÐ 8ýââ´$E,ª äœ$Eá t$E,ª ¼Rê@ÀäÄ$EäEæDVl%EÜ$Eh&DV%Eæÿää4%Eä¼RçáP%Eè¼Rö¼Rît%Eh&DV°%Eî&EöäÌ%Eä¼Räááè%Eè¼Rø¼Rêx&E &Eççäçæáááxýâ€B¼Rä˜â @PD¼Râ™â@Gâè2 ä¸&Eä8á¼Rä ä&E 'E%Eô:â'EäÜ$Eü â%Eæ€'E('E¼RäT'Eü:á´Uä˜ÿâ ˆ'E¼Rä´'Eü:´Uä™ÿâ,‡äð'Eh&,‡,(EÿìäH(Eï휨-ðèoät(Eh&èo°(EÿìäÌ(Eïáè(Eè¼Rê)Eè¼RÿëŠä 0)Eh&áŠl)Eÿìäˆ)Eïá¤)Eè8ýìÀ)EøÜ)Eÿ䜨-ì*E¨¯ ä*EÈHâˆ,E@Æä *Eh&@Æ\*Eî”*Eöäx*Eìáý+E+EççäçæáááxýâT#éOâ@€âÜEä4+Eä8é `+Eœ+E(ª8ô:âŒ+Eäì©8ü â(ª8æ ü+E¤+EéÐ+Eü:ᬨäOÿâ,Eᜨ-ä0,E\,Eø:✨-ä@é8ü4êTÿâ0ÆäD¬8äàÈä¨,E°,Eââà,EàÈá@Eè@Eäpæh&àÈä°,Eå-EãáÀ-E´W ä-Eà,E´W L-E öÄîäx-Eì!ã°,Eì¤-Eè”-Eì â°,Eÿàp.E0V äÐ-Eà,E0V .E öXÓîä8.Eì!ã°,EìT.Eè”-Eÿè,0EhÆ ä€.Eà,EhÆ ¼.E î/Eöä è.E/E¼Râ2„€â°,Eâêœ1 ä”-Eö„/E˜/Eççäçæáááxýâœ1 ”-EâNá@á[â\À ä°/Eä:¼RäÜ/E€!yöæ ì” 0Eötçî ê äÐ5Eì.ä<0Eà,Eì.x0EîÌ0Eöä¤0EÀ0Eè2 €â°,Eäêœ1 ä”-Eø@1Eh1Eççäçæáááxýâœ1 ”-EäSá@( èYãZâ \À 2E42EäZâ \À È3Eì3EäZâ \À ¤4EÈ4EäZâ\À ìZâ \À 5ED5EäZâ\À ìZâ\À äî42EâYíâ”-Eä`2Eô2Eøá”-EäŒ2Eüá”-Eä¸2Eü:áä2EäSý â”-Eæè 3Eœ3Eø:èL3Eüâà,EÜt ˆ3E ÿäìâ4êÿæì3EâYíâ8Èé 4ED4EPÇ,ô:€@Ç,ä$Ë,ÿàL4Eéx4Eü:áä2EäSÿåÈ4EâYíâéô4Eü:áä2EäSÿáYáöâ8é p5Eœ5ExgAô:âhgAÿè¤5E:áägAäYýÈ7E2äà5Eà,E26Eîœ6Eöä X6E6EH6Eä€â°,Eäæ â°,E ät6Eœ1 ä”-Eðˆ$äH6Eö7E87Eççäçæáááxýâœ1 ”-Eä\á @ˆ$H6Eâ]á@áYâ\À äP7Eäá|7EäŒ7Eü â°,Eæ:á¸7Eä\ý â|7Eæ"è?E`/Ä;EØ7Eà,E`/8Eîh8Eöä@8E\8Eè€â°,Eäêœ1 ä”-EøÜ8Eð8Eççäçæáááxýâœ1 ”-Eäfá@Wâ\À ä89EäWâ \À ð9E:EäWâ \À H;El;Eä8á°Ï,ä d9E9EHÐ,ô:â„Û,ä Ð,ÿà˜9EéÄ9Eü:áä2Eäfÿáfá$Ë,ôâ”-Eä@:EÄ:Eøá”-Eäl:Eüá”-Eä˜:Eü:áä2Eäfýèð:E;Eø:èL3Eü4êÿâfá$Ë,ôâé˜;Eü:áä2EäfÿáÌ;Eà,E`/E8>EäXâ \À l?E?Eä8á°Ï,ä ˆ=E´=EHÐ,ô:â„Û,ä Ð,ÿà¼=Eéè=Eü:áä2Eäaÿáaá$Ë,ôâ”-Eäd>Eè>Eøá”-Eä>Eüá”-Eä¼>Eü:áä2Eäaýè?E@?Eø:èL3Eü4êÿâaá$Ë,ôâé¼?Eü:áä2EäaÿáàÈäø?E°,Eæ¨Ç,ìL3E°,EäâXBE¬² ä4@Eh&¬² p@Eäê¨@EöäŒ@EìáýAE0AEççäçæáááxýâÌ/éèá@ôâDÛäHAEä2€ètAEü8é  AEÌAE Cô:âCäØCÿàÔAE2€éBEüé,BEü:áp¨äèÿáÜŽähBEh&ÜŽ¤BEÿìäÀBEä¼RçáÜBEè¼RìøBEÿ䜨-ìáç ÿí ðÿ ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäðÿááÿÿÿ÷â“æ@ÿäðÿä  ÔòWy‚Ú?ÿñâ}æBÿä ðÿäÿûâ¨æAÿäñÿÿÿÿââlæ ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäðÿÿäáâ Oÿñâ,å @ÿãðÿä  fˆ3þҿÿñâ}æBÿä ðÿäÿûâ¨æAÿäñÿÿÿÿââlæ ÿäðÿÿäáâ Oÿõ,å @ÿãñÿÿÿÿââ±æ@ÿäðÿÿäáâ@Oÿñâ3ç@ÿã ïÿäóáÿââ{æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿä ðÿ ááÿÿÿ÷âŸå€Àÿäðÿááÿÿÿ÷â•æ@ôéxÃEü:á ¾äý¼ÇE¬ÃEh&¬§èÃEî ÄEöäÄEìáý”ÄE¨ÄEççäçæáááxýâÌ/é§á @\á äÀÄEä8é ìÄE\ÇE(ÅEô:âÅEä`ÅEü â(ÅEæäDÅEìýh&„#(ÅEäêœÅEöÆE$ÆEççäçæáááxýâÌ/éZá @>áDÛä<ÆEä2€èhÆEü8é ”ÆEÐÆEx´Eô:âÀÆEä<´Eü âx´EêØÆE2€èÇEüé0ÇEü:áüµäZÿádÇEéÇEü:áüµä§ýÄËEÄÇEh&¬§áÈEî8ÈEöäÈEìáý¬ÈEÀÈEççäçæáááxýâÌ/é«á @^á äØÈEä8é ÉEdËE@ÉEô:â0ÉEäxÉEü â@ÉEæä\ÉEìýh&Ô @ÉEäê´ÉEö(ÊE<ÊEççäçæáááxýâÌ/é^á @@áDÛäTÊEä2€è€ÊEü8é ¬ÊEØÊEx´Eô:âÀÆEä<´EÿààÊE2€è ËEüé8ËEü:áp¨ä^ÿálËEé˜ËEü:áp¨ä«ýÄÍEÌËEh&¬§ÌEî@ÌEöä$ÌEìáý´ÌEÈÌEççäçæáááxýâÌ/éïá @&áTäàÌEä8é ÍE8ÍEx´Eô:âÀÆEä<´Eÿà@ÍE2€èlÍEüé˜ÍEü:ᬨäïýÄÏEÌÍEh&¬§ÎEî@ÎEöä$ÎEìáý´ÎEÈÎEççäçæáááxýâÌ/éóá @(áTäàÎEä8é ÏE8ÏEx´Eô:âÀÆEä<´Eÿà@ÏE2€èlÏEüé˜ÏEü:á¤*äóýÄÑEÌÏEh&¬§ÐEî@ÐEöä$ÐEìáý´ÐEÈÐEççäçæáááxýâÌ/é÷á @*áTäàÐEä8é ÑE8ÑEx´Eô:âÀÆEä<´Eÿà@ÑE2€èlÑEüé˜ÑEü:á¤-ä÷ýÄÓEÌÑEh&¬§ÒEî@ÒEöä$ÒEìáý´ÒEÈÒEççäçæáááxýâÌ/éûá @,áTäàÒEä8é ÓE8ÓEx´Eô:âÀÆEä<´Eÿà@ÓE2€èlÓEüé˜ÓEü:áèäûýÄÕEÌÓEh&¬§ÔEî@ÔEöä$ÔEìáý´ÔEÈÔEççäçæáááxýâÌ/éÿá @/áTäàÔEä8é ÕE8ÕEx´Eô:âÀÆEä<´Eÿà@ÕE2€èlÕEüé˜ÕEü:á´-äÿÿáÌÕEh&¬§ÖEî@ÖEöä$ÖEìáý´ÖEÈÖEççäçæáááxýâÌ/éá @3áTäàÖEä8é ×E8×Ex´Eô:âÀÆEä<´Eÿà@×E2€èl×Eüé˜×Eü:áÄ-äýÔ×E¼É䀡,ä¸ä ää×Eh&¸ä ØEÿìä<ØEïáXØEè¼RìtØEÿä¬¨ðøæ ä ØEÈ­ê8µä¼ØE Uæ„ÙE 䨨Eh& ÙEÿìä0ÙEïáLÙEè¼RêhÙEÿ䬨ð€¬ä”ÙEh&€¬ÐÙEÿìäìÙEä¼RçáÚEè¼Rì$ÚEè¼Rÿê—äPÚE,ó0æ¹ähÚEPë8êÀ˜ä„ÚEh&À˜ÀÚEÿìäÜÚEïáøÚEè8ýìÛEÿøTë ä@ÛEh&Të |ÛEÿìä˜ÛEïí¤-ðl äÄÛEÀ®-ê\±ä ÷?øÛE¼½äðÛE|GâÜEŒÕäÜE gê0ä$ÜE,¬æHÜE<¾@ÜEÀ»#ät¯#䘛äXÜEh&˜›”ÜEÿìä°ÜEä8ýçáÌÜEè8ýìèÜEèÿæÝEÐï äüX)䘾ä$ÝEäWæHÝElð ä@ÝE|ð&æü³ä¼K>ä l¿hÝE0C%ä H:%,ÞEœò ä€ÝEh&œò ¼ÝEÿìäØÝEïáôÝEèêÞEèÔ)ÿè°ÞEÚä<ÞEh&ÚxÞEÿìä”ÞEïíîàò äÀÞEh&àò üÞEÿìäßEïá4ßEè¼Rö¼Rîøó ä`ßEôsæ ¸ä8E>ä˜õ äˆßE `æ&ä¼ ßE°‰-„áE¨ßEh&ä¼äßEîàEöåàEìáýàE¤àEççäçæáááxýâÌ/éQá @Ìá ä¼àEä8é èàE$áE £-ô:âáEäd£-ü â £-ê,áEéXáEü:áüµäQÿáŒáEh&ä¼ÈáEïâEöääáEìáýtâEˆâEççäçæáááxýâÌ/éUá @Îá ä âEä8é ÌâEãE ˆ-ô:âøâEäЇ-ü â ˆ-êãEé<ãEü:áp¨äUýãE´xãE°B,€ãE,8,ˆãED&,äÜ,äìù ä,®.äÔâä°ãElæ ü äÈãEh& ü äEÿìä äEï휨-ðèü äD².ä&<þ \äET›C@æEdäEh&<þ  äEîØäEöä¼äEìáýLåE`åEççäçæáááxýâÌ/éIá @Àá äxåEä8é ¤åEàåE4£Cô:âÐåEäø¢Cü â4£CêèåEéæEü:áüµäIý$èEHæEh&<þ „æEî¼æEöä æEìáý0çEDçEççäçæáááxýâÌ/éMá @Âá ä\çEä8é ˆçEÄçE°™Cô:â´çEät™Cü â°™CêÌçEéøçEü:áp¨äMý$êE,èEh&<þ hèEî èEöä„èEìáýéE(éEççäçæáááxýâÌ/é:á @¼ áTä@éEä8é léE˜éE›Cô:â ›CäT›Cÿà éE2€èÌéEüéøéEü:ᬨä:ý$ìE,êEh&<þ hêEî êEöä„êEìáýëE(ëEççäçæáááxýâÌ/é>á @¾ áTä@ëEä8é lëE˜ëE›Cô:â ›CäT›Cÿà ëE2€èÌëEüéøëEü:á¤*ä>ý$îE,ìEh&<þ hìEî ìEöä„ìEìáýíE(íEççäçæáááxýâÌ/éBá @À áTä@íEä8é líE˜íE›Cô:â ›CäT›Cÿà íE2€èÌíEüéøíEü:á¤-äBý$ðE,îEh&<þ hîEî îEöä„îEìáýïE(ïEççäçæáááxýâÌ/éFá @ áTä@ïEä8é lïE˜ïE›Cô:â ›CäT›Cÿà ïE2€èÌïEüéøïEü:áèäFý$òE,ðEh&<þ hðEî ðEöä„ðEìáýñE(ñEççäçæáááxýâÌ/éJá @Å áTä@ñEä8é lñE˜ñE›Cô:â ›CäT›Cÿà ñE2€èÌñEüéøñEü:á´-äJÿá,òEh&<þ hòEî òEöä„òEìáýóE(óEççäçæáááxýâÌ/éNá @É áTä@óEä8é lóE˜óE›Cô:â ›CäT›Cÿà óE2€èÌóEüéøóEü:áÄ-äNý<ôEhéä4ôEdÁ'æ|Åä.Ü¥$Fü \ôE¼´D@öEdôEh&ü  ôEîØôEöä¼ôEìáýLõE`õEççäçæáááxýâÌ/é¿á @há äxõEä8é ¤õEàõEä¹Dô:âÐõE䨹Dü âä¹DêèõEéöEü:áüµä¿ý$øEHöEh&ü „öEî¼öEöä öEìáý0÷ED÷EççäçæáááxýâÌ/éÃá @já ä\÷Eä8é ˆ÷EÄ÷ED³Dô:â´÷Eä³Dü âD³DêÌ÷Eéø÷Eü:áp¨äÃý$úE,øEh&ü høEî øEö䄸EìáýùE(ùEççäçæáááxýâÌ/é7á @VáTä@ùEä8é lùE˜ùE„´Dô:ât´Dä¼´Dÿà ùE2€èÌùEüéøùEü:ᬨä7ý$üE,úEh&ü húEî úEöä„úEìáýûE(ûEççäçæáááxýâÌ/é;á @XáTä@ûEä8é lûE˜ûE„´Dô:ât´Dä¼´Dÿà ûE2€èÌûEüéøûEü:á¤*ä;ý$þE,üEh&ü hüEî üEöä„üEìáýýE(ýEççäçæáááxýâÌ/é?á @ZáTä@ýEä8é lýE˜ýE„´Dô:ât´Dä¼´Dÿà ýE2€èÌýEüéøýEü:á¤-ä?ý$F,þEh&ü hþEî þEöä„þEìáýÿE(ÿEççäçæáááxýâÌ/éCá @\áTä@ÿEä8é lÿE˜ÿE„´Dô:ât´Dä¼´Dÿà ÿE2€èÌÿEüéøÿEü:áèäCý$F,Fh&ü hFî Föä„FìáýF(FççäçæáááxýâÌ/éGá @_áTä@Fä8é lF˜F„´Dô:ât´Dä¼´Dÿà F2€èÌFüéøFü:á´-äGÿá,Fh&ü hFî Föä„FìáýF(FççäçæáááxýâÌ/éKá @cáTä@Fä8é lF˜F„´Dô:ât´Dä¼´Dÿà F2€èÌFüéøFü:áÄ-äKýxFè ä4Fh&è pFäê¨FöäŒFìáýF0FççäçæáááxýâÌ/éVá @<áDÛäHFä2€ètFü8é  FìFÜFô:âÌFäFü âÜFæäøFìáýh&°ÈÜFäääPFöÄF ØFççäçáæáááxýâÌ/éúá Àáü:äøFâáü:ä¨Fäáü:ä Fäáü:ìáü:äÀ FŠâáü:äL FŠâ áü:äØ FŠâ!áü:äd FŠâ"áü:äð FŠâ#áü:ä| FŠâ$áü:äFŠâ&áü:ä”Fäé$F|FøéPFü:á ¾äúý5ÿêéÔFä Føê FüáÔ-ä, F¸ Fø8áÔ-ä X F„ Fì8-ô:âÜ8-ä$9-ÿàŒ F4êþ4êþ4ê!þ2€è< Füéh Fü2áüµä” Fü:⬨ä8¶ÿìðÿúááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ¹æ@ÿäñÿÿÿÿââ|æ@ÿäðÿúááÿÿÿ÷â•æ@ôéÀFü:á ¾äúÿáôF2€è FüéLFü:áp¨äVÿáÔ äˆFh&Ô ÄFäêFöäàFìáüFÿôŒF´FççäçæáááxýâÌ/é=á@<0é>á @(áDÛäÌFä2€èøFü8é $FPF„e-ô:âte-äØe-ü ÜFXF2€è„Füé°Fü:áp¨ä=ÿáäFéFü:ᬨä>ÿáÔ ä xÉEÐFdÐä\Fh&dИFÿìä´FïÿáÜ!äðÈ;ä äðFàP?æ(ÒäFh&(ÒDFâÿåä`FÿîŒF„#ä.`ÅEˆ%F°ÈœFF¤F¤Fh&°ÈàFîFöäüFìáýŒF FççäçæáááxýâÌ/éŸá @Xá ä¸Fä8é äFDF Fô:âFäXFü â Fæä<Fìáýh&á Fäê”FöFFççäçæáááxýâÌ/éRá @:áDÛä4Fä2€è`Fü8é ŒF¸FÜFô:âÌFäFÿàÀF2€èìFüéFü:áüµäRÿáLFéxFü:áüµäŸýˆF¬Fh&°ÈèFî FöäFìáý”F¨FççäçæáááxýâÌ/é£á @Zá äÀFä8é ìF(FpFô:âFä4Fü âpFê0Fé\Fü:áp¨ä£ýˆFFh&°ÈÌFîFöäèFìáýxFŒFççäçæáááxýâÌ/é×á @áTä¤Fä8é ÐFüFÜFô:âÌFäFÿàF2€è0Füé\Fü:ᬨä×ýˆFFh&°ÈÌFîFöäèFìáýxFŒFççäçæáááxýâÌ/éÛá @áTä¤Fä8é ÐFüFÜFô:âÌFäFÿàF2€è0Füé\Fü:á¤*äÛýˆFFh&°ÈÌFîFöäèFìáýxFŒFççäçæáááxýâÌ/éßá @áTä¤Fä8é ÐFüFÜFô:âÌFäFÿàF2€è0Füé\Fü:á¤-äßýˆ!FFh&°ÈÌFî FöäèFìáýx FŒ FççäçæáááxýâÌ/éãá @áTä¤ Fä8é Ð Fü FÜFô:âÌFäFÿà!F2€è0!Füé\!Fü:áèäãýˆ#F!Fh&°ÈÌ!Fî"Föäè!Fìáýx"FŒ"FççäçæáááxýâÌ/éçá @áTä¤"Fä8é Ð"Fü"FÜFô:âÌFäFÿà#F2€è0#Füé\#Fü:á´-äçÿá#Fh&°ÈÌ#Fî$Föäè#Fìáýx$FŒ$FççäçæáááxýâÌ/éëá @#áTä¤$Fä8é Ð$Fü$FÜFô:âÌFäFÿà%F2€è0%Füé\%Fü:áÄ-äëÿá& È˜%FØe-À*F %Fh& ÈÜ%Fî0&Föäø%Fìáá&Fÿô¤&FÌ&FççäçæáááxýâÌ/é}á@<0é~á @8á ää&Fä8é'Fá*FL'Fô:â<'Fä 'Fü âL'Fæäh'Fìá„'Fÿôh&ì L'FäêÜ'FöP(Fx(FççäçæáááxýâÌ/é8á@<0é9á @&áDÛä(Fä2€è¼(Fü8é è(F)F„e-ô:âte-äØe-ü  )F)F2€èH)Füét)Fü:áüµä8ÿá¨)FéÔ)Fü:ᬨä9ý `*F*Fé4*Fü:áüµä}ÿáh*Fé”*Fü:ᬨä~ý4-FÈ*Fh& È+FîX+Föä +Fìáá<+FÿôÌ+Fô+FççäçæáááxýâÌ/é‚á@<0éƒá @:á ä ,Fä8é 8,Ft,FÄFô:âd,FäˆFü âÄFæ Ô,F|,Fé¨,Fü:áp¨ä‚ÿáÜ,Fé-Fü:ᬨäƒýÄ/F<-Fh& Èx-FîÌ-Föä”-Fìáá°-Fÿô@.Fh.FççäçæáááxýâÌ/éqá@<0érá @¢áTä€.Fä8é ¬.FØ.F„e-ô:âte-äØe-ü d/Fà.F2€è /Füé8/Fü:ᬨäqÿál/Fé˜/Fü:ᬨärýT2FÌ/Fh& È0Fî\0Föä$0Fìáá@0FÿôÐ0Fø0FççäçæáááxýâÌ/évá@<0éwá @¤áTä1Fä8é <1Fh1F„e-ô:âte-äØe-ü ô1Fp1F2€èœ1FüéÈ1Fü:á¤*ävÿáü1Fé(2Fü:ᬨäwýä4F\2Fh& È˜2Fîì2Föä´2FìááÐ2Fÿô`3Fˆ3FççäçæáááxýâÌ/é{á@<0é|á @¦áTä 3Fä8é Ì3Fø3F„e-ô:âte-äØe-ü„4Fá4F2€è,4FüéX4Fü:á¤-ä{ÿáŒ4Fé¸4Fü:ᬨä|ýt7Fì4Fh& È(5Fî|5FöäD5Fìáá`5Fÿôð5F6FççäçæáááxýâÌ/é€á@<0éá @¨áTä06Fä8é \6Fˆ6F„e-ô:âte-äØe-ü 7F6F2€è¼6Füéè6Fü:áèä€ÿá7FéH7Fü:ᬨäý:F|7Fh& È¸7Fî 8FöäÔ7Fìááð7Fÿô€8F¨8FççäçæáááxýâÌ/é…á@<0é†á @«áTäÀ8Fä8é ì8F9F„e-ô:âte-äØe-ü ¤9F 9F2€èL9Füéx9Fü:á´-ä…ÿá¬9FéØ9Fü:ᬨä†ÿá :Fh& ÈH:Fîœ:Föäd:Fìáá€:Fÿô;F8;FççäçæáááxýâÌ/éŠá@<0é‹á @¯áTäP;Fä8é |;F¨;F„e-ô:âte-äØe-ü 4F˜ ä>FH¾'â4>FŒ´ä ¦ä&|´D>F¬Œ8(@FL>Fh&|´ˆ>FîÀ>Föä¤>Fìáý4?FH?FççäçæáááxýâÌ/éÕá @Äá ä`?Fä8é Œ?FÈ?F¨œ8ô:â¸?Fälœ8ü ⨜8êÐ?Féü?Fü:áüµäÕý BF0@Fh&|´l@Fî¤@Föäˆ@FìáýAF,AFççäçæáááxýâÌ/éÙá @Æá äDAFä8é pAF¬AF‹8ô:âœAFäÌŠ8ü â‹8ê´AFéàAFü:áp¨äÙý DFBFh&|´PBFîˆBFöälBFìáýüBFCFççäçæáááxýâÌ/é¡á@NâTä(CFä8é TCF€CFtŒ8ô:âdŒ8䬌8ÿàˆCF2€è´CFüéàCFü:ᬨä¡ý FFDFh&|´PDFîˆDFöälDFìáýüDFEFççäçæáááxýâÌ/é¥á@PâTä(EFä8é TEF€EFtŒ8ô:âdŒ8䬌8ÿàˆEF2€è´EFüéàEFü:á¤*ä¥ý HFFFh&|´PFFîˆFFöälFFìáýüFFGFççäçæáááxýâÌ/é©á@RâTä(GFä8é TGF€GFtŒ8ô:âdŒ8䬌8ÿàˆGF2€è´GFüéàGFü:á¤-ä©ý JFHFh&|´PHFîˆHFöälHFìáýüHFIFççäçæáááxýâÌ/é­á@TâTä(IFä8é TIF€IFtŒ8ô:âdŒ8䬌8ÿàˆIF2€è´IFüéàIFü:áèä­ý LFJFh&|´PJFîˆJFöälJFìáýüJFKFççäçæáááxýâÌ/é±á@WâTä(KFä8é TKF€KFtŒ8ô:âdŒ8䬌8ÿàˆKF2€è´KFüéàKFü:á´-ä±ÿáLFh&|´PLFîˆLFöälLFìáýüLFMFççäçæáááxýâÌ/éµá@[âTä(MFä8é TMF€MFtŒ8ô:âdŒ8䬌8ÿàˆMF2€è´MFüéàMFü:áÄ-äµÿápä8=Aä8Îä,NF8ú?æ¶äDNFâh&¶ä ëüð¶äàÿ<¨NF Ù NF¨¬+ä §+åÐäÀ$>䘸XOFÈNFh&˜¸OFæÿää OFäçáá@T#é?á@9â°Ÿä¤PFä8áä ÐPF QFOFô:âüPFäÈNFü âOFælQFQFä@QFü:áÔ)ä>ÿátQFé QFü:áä?ÿá°,äÜQF(ZêtÒäøQFh&tÒ4RFðlRFöäPRFìáýàRFôRFççäçæáááxýâT#ésâ@7â$ä SFä7é 8SFÄTFðTFôédSFTFøéSFèSFøé¼SFü:ᬨäsþ4ÿêé@TF˜TFøélTFü:ᬨäsþ4ëý4ÿêéUFäWFø2éHUFüétUFüáX+-ä UF4WFøáX+-äÌUFüá|(-äøUFWFøá|(-ä$VFüáÔ-äPVFÜVFø8áÔ-ä |VF¨VFì8-ô:âÜ8-ä$9-ÿà°VF4êþ4ê¼ý4êþ é`WF¸WFøéŒWFü:ᬨäsþ4êþ4ê ÿ⨻äÈû<ä€Óä¨ >ä” ä@XFh&” |XFäê´XFöä˜XFìý(YFâü:äD[FŠâ?âü:äÐ[FŠâ@âü:ä\\FŠâBâü:äè\Fôðÿááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿäðÿááÿÿÿ÷â•æ@ôé]Fü:á ¾äÿáH]F2€èt]Füé ]Fü:áp¨äÌýÜ]F”¿ä œ°Al^FÄÖäì]Fh&ÄÖ(^Fâÿèä D^F`^F`—Eçí`—Eü<2äðö?ä& $Œ^FØCp`F”^Fh& $Ð^Fî_Föäì^Fìáý|_F_FççäçæáááxýâÌ/éá @üá ä¨_Fä8é Ô_F`FìIEô:ã`Fä°IEü âìIEê`FéD`Fü:áüµäýTbFx`Fh& $´`Fîì`FöäÐ`Fìáý`aFtaFççäçæáááxýâÌ/éá @þá äŒaFä8é ¸aFôaFp@Eô:âäaFä4@Eü âp@EêüaFé(bFü:áp¨äýTdF\bFh& $˜bFîÐbFöä´bFìáýDcFXcFççäçæáááxýâÌ/é=á @náTäpcFä8é œcFÈcF Cô:âCäØCÿàÐcF2€èücFüé(dFü:ᬨä=ýTfF\dFh& $˜dFîÐdFöä´dFìáýDeFXeFççäçæáááxýâÌ/éAá @páTäpeFä8é œeFÈeF Cô:âCäØCÿàÐeF2€èüeFüé(fFü:á¤*äAýThF\fFh& $˜fFîÐfFöä´fFìáýDgFXgFççäçæáááxýâÌ/éEá @ráTäpgFä8é œgFÈgF Cô:âCäØCÿàÐgF2€èügFüé(hFü:á¤-äEýTjF\hFh& $˜hFîÐhFöä´hFìáýDiFXiFççäçæáááxýâÌ/éIá @táTäpiFä8é œiFÈiF Cô:âCäØCÿàÐiF2€èüiFüé(jFü:áèäIýTlF\jFh& $˜jFîÐjFöä´jFìáýDkFXkFççäçæáááxýâÌ/éMá @wáTäpkFä8é œkFÈkF Cô:âCäØCÿàÐkF2€èükFüé(lFü:á´-äMÿá\lFh& $˜lFîÐlFöä´lFìáýDmFXmFççäçæáááxýâÌ/éQá @{áTäpmFä8é œmFÈmF Cô:âCäØCÿàÐmF2€èümFüé(nFü:áÄ-äQÿáh ädnFh&h  nFäêØnFöä¼nFìýLoF`oFççäçæáááxýâÌ/éÈá @ŠáDÛäxoFä2€è¤oFü8é ÐoFüoFèYFô:âØYFä ZFÿàpF2€è0pFüé\pFü:áüµäÈÿáð&ä˜pFÐZæhää°pFì™æÅä°¬AäÐ äØpFh&Ð qFÿì÷å0Èä Pll{F<äPqFh&<ŒqFäêàqFöä¨qFìáÄqFÿôTrF|rFççäçæáááxýâÌ/éºá@<0é»á@ÎâDÛä”rFä2€èÀrFü8é ìrFTzF(sFô:âsFä|sFü â(sFæäDsFìá`sFÿôh&¼((sFäää¸sFö,tF htFççäçáæáááxýâÌ/é–áÀ<0é—áÀ€/ è›á€)âü:äpuFä,âü:äœuFŠâ-âü:ä(vFŠâ.âü:ä´vFŠâ/âü:ä@wFŠâ0âü:äÌwFŠâ1âü:äXxFŠâ2âü:ääxFŠâ4âü:ì4âü:äpyFŠâ7âü:äüyFä>áç›ÿíðÿ–ááÿÿÿ÷â“æ@ÿä ïÿäï—ááÿÿÿÿþâ ÿì ïÿäáì–ááÿÿÿÿþâ ÿì ïÿäóáÿââæ ÿä ïÿäóä€ÿâæ ÿäðÿÿäáâèOÿñâ,å @ÿãñÿÿÿÿââªæ@ÿäðÿ›ááÿÿÿ÷â•æ@ôé(zFü:á ¾ä›ý àzF\zF2€èˆzFüé´zFü:áüµäºÿáèzF2€è{Füé@{Fü:áüµä»ÿâÉä@-”{F¤ Œ{F<0!ä `"!¬{Fh=ä¤{F¤'æàɼ{Fàá? }FÄ{Fh&àÉá|Fî8|Föä|Fìáý¬|FÀ|FççäçæáááxýâÌ/éïá @Ðá äØ|Fä8é }F@}Fl÷?ô:â0}Fä0÷?ü âl÷?êH}Fét}Fü:áüµäïý„F¨}Fh&àÉä}Fî~Föå~Fìáý~F¤~FççäçæáááxýâÌ/éóá @Òá ä¼~Fä8é è~F$F<à?ô:âFåà?ü â<à?ê,FéXFü:áp¨äóý„FŒFh&àÉÈFï€FöääFìáýt€Fˆ€FççäçæáááxýâÌ/éWá @2áTä €Fä8é Ì€Fø€F¨á?ô:â˜á?äàá?ÿáF2€è,FüéXFü:ᬨäWý„ƒFŒFh&àÉÈFï‚FöääFìáýt‚Fˆ‚FççäçæáááxýâÌ/é[á @4áTä ‚Fä8é Ì‚Fø‚F¨á?ô:â˜á?äàá?ÿáƒF2€è,ƒFüéXƒFü:á¤*ä[ý„…FŒƒFh&àÉȃFï„FöääƒFìáýt„Fˆ„FççäçæáááxýâÌ/é_á @6áTä „Fä8é Ì„Fø„F¨á?ô:â˜á?äàá?ÿá…F2€è,…FüéX…Fü:á¤-ä_ý„‡FŒ…Fh&àÉÈ…Fï†Föää…Fìáýt†Fˆ†FççäçæáááxýâÌ/écá @8áTä †Fä8é ̆Fø†F¨á?ô:â˜á?äàá?ÿá‡F2€è,‡FüéX‡Fü:áèäcý„‰FŒ‡Fh&àÉȇFïˆFöää‡FìáýtˆFˆˆFççäçæáááxýâÌ/égá @;áTä ˆFä8é ̈FøˆF¨á?ô:â˜á?äàá?ÿá‰F2€è,‰FüéX‰Fü:á´-ägÿጉFh&àÉȉFïŠFöää‰FìáýtŠFˆŠFççäçæáááxýâÌ/éká @?áTä ŠFä8é ÌŠFøŠF¨á?ô:â˜á?äàá?ÿá‹F2€è,‹FüéX‹Fü:áÄ-äkýœ‹F, 䔋F„ã/æ”ÊäÉ;ä `-¼‹FìÛ#äHÌ#Ü‹FÌàÔ‹FàŒ#ä,u#äü äì‹FêŒFx ŒFxw"ä"Œa"8ŒF<. ŒF¨à%(ŒFÜ%0ŒF`½%ä $¸%(F<@äHŒFh&<@„ŒFäêØŒFöä ŒFìἌFÿôLFtFççäçæáááxýâÌ/é¿á@<0éÀá@ÐâDÛäŒFä2€è¸Fü8é äFŽF(sFô:âsFä|sFü œŽFŽF2€èDŽFüépŽFü:áp¨ä¿ÿᤎF2€èÐŽFüéüŽFü:áp¨äÀÿá¨ËäX -ä äHFh& „Fÿìä Fïá¼Fè¼RêØFè¼Rö¼Rì FœFäFˆæ Œ# F ZFá’F$Fh&Œ# `Fî˜Föä|Fìáý ‘F ‘FççäçæáááxýâÌ/éá @ á ä8‘Fä8é d‘F ‘F nFô:â‘FädnFü â nFꨑFéÔ‘Fü:áüµäýä“F’Fh&Œ# D’Fî|’Föä`’Fìáýð’F“FççäçæáááxýâÌ/é á @¢á ä“Fä8é H“F„“F|XFô:ât“Fä@XFü â|XFꌓF鸓Fü:áp¨ä ýä•Fì“Fh&Œ# (”Fî`”FöäD”FìáýÔ”Fè”FççäçæáááxýâÌ/éná @< áTå•Fä8é ,•FX•FèYFô:âØYFä ZFÿà`•F2€èŒ•Fü鸕Fü:ᬨänýä—Fì•Fh&Œ# (–Fî`–FöäD–FìáýÔ–Fè–FççäçæáááxýâÌ/érá @> áTå—Fä8é ,—FX—FèYFô:âØYFä ZFÿà`—F2€èŒ—Fü鸗Fü:á¤*ärýä™Fì—Fh&Œ# (˜Fî`˜FöäD˜FìáýÔ˜Fè˜FççäçæáááxýâÌ/évá @@ áTå™Fä8é ,™FX™FèYFô:âØYFä ZFÿà`™F2€èŒ™Fü鸙Fü:á¤-ävýä›Fì™Fh&Œ# (šFî`šFöäDšFìáýÔšFèšFççäçæáááxýâÌ/ézá @B áTå›Fä8é ,›FX›FèYFô:âØYFä ZFÿà`›F2€èŒ›Fü鸛Fü:áèäzýäFì›Fh&Œ# (œFî`œFöäDœFìáýÔœFèœFççäçæáááxýâÌ/é~á @E áTåFä8é ,FXFèYFô:âØYFä ZFÿà`F2€èŒFüé¸Fü:á´-ä~ÿáìFh&Œ# (žFî`žFöäDžFìáýÔžFèžFççäçæáááxýâÌ/é‚á @I áTåŸFä8é ,ŸFXŸFèYFô:âØYFä ZFÿà`ŸF2€èŒŸFü鸟Fü:áÄ-ä‚ÿá|" äôŸFh&|" 0 FÿìäL Fïáh Fè¼Rì„ Fè¼Rÿ渠Füêä° F`n9âРFõÈ F¨¢$ä°$äèôäà FLÐæ Ø6ø Fì”,ä°‘,äX& ä¡Fh&X& L¡Fÿìäh¡Fä8Ã-çí¤-꜡Fx$ ”¡FD."ä "äè& ä§?äÌä =AäÈ' äÌ¡Fh&È' ¢Fÿìä$¢Fïí¼Rêh¢F¸P¢Fha)X¢F A)`¢F,ìäÐ!äìKäx¢F"☢Fïä¢F”º&æ&Ì( ¨¢F4<Œ¤F°¢Fh&Ì( ì¢Fî$£Föä£Fìáý˜£F¬£FççäçæáááxýâÌ/é1á @´á äÄ£Fä8é ð£F,¤Fàë<ô:â¤Fä¤ë<ü âàë<ê4¤Fé`¤Fü:áüµä1ýp¦F”¤Fh&Ì( ФFî¥Föäì¤Fìáý|¥F¥FççäçæáááxýâÌ/é5á @¶á 䨥Fä8é Ô¥F¦F<ô:ã¦FäT<ü â<ê¦FéD¦Fü:áp¨ä5ýp¨Fx¦Fh&Ì( ´¦Fîì¦FöäЦFìáý`§Ft§FççäçæáááxýâÌ/éòá @Œ áT䌧Fä8é ¸§Fä§Fü<ô:âì<ä4<ÿàì§F2€è¨FüéD¨Fü:ᬨäòýpªFx¨Fh&Ì( ´¨Fîì¨FöäШFìáý`©Ft©FççäçæáááxýâÌ/éöá @Ž áT䌩Fä8é ¸©Fä©Fü<ô:âì<ä4<ÿàì©F2€èªFüéDªFü:á¤*äöýp¬FxªFh&Ì( ´ªFîìªFöäЪFìáý`«Ft«FççäçæáááxýâÌ/éúá @ áT䌫Fä8é ¸«Fä«Fü<ô:âì<ä4<ÿàì«F2€è¬FüéD¬Fü:á¤-äúýp®Fx¬Fh&Ì( ´¬Fîì¬FöäЬFìáý`­Ft­FççäçæáááxýâÌ/éþá @’ áT䌭Fä8é ¸­Fä­Fü<ô:âì<ä4<ÿàì­F2€è®FüéD®Fü:áèäþýp°Fx®Fh&Ì( ´®Fîì®FöäЮFìáý`¯Ft¯FççäçæáááxýâÌ/éá @• áT䌯Fä8é ¸¯Fä¯Fü<ô:âì<ä4<ÿàì¯F2€è°FüéD°Fü:á´-äÿáx°Fh&Ì( ´°Fîì°FöäаFìáý`±Ft±FççäçæáááxýâÌ/éá @™ áT䌱Fä8é ¸±Fä±Fü<ô:âì<ä4<ÿàì±F2€è²FüéD²Fü:áÄ-äÿálM䀲F¼Rêdú䜲FˆÖ.â>ì²F´²F<^)¼²FD)IJF¤ï̲FŒ9(Ô²F<5(ܲFü0(ä²F|,(ä<((ä€+ ä£?³F€ò ³FÀ8$ää $ä6Ì$³F|Æ,³Fdl)4³Fˆ4)<³FœÎD³FìËL³F(T³Fá)(\³Fìþ'd³FÄÔ4l³Fi6t³F“9|³Ft:䄳Fh&ÌÀ³Fît»Gä(º îäܳFìâ»GÌ/åø³Fê â´F ä â ´FȺGäp´FøV ôæÞ:è¼ãFääFäÐùFЬGh&øV ä´Fä´F+ãᨴFøV ä ´F´FâµF¼e 临FÄ´Fæ â „9Ô´Fø´Fäè´Fè ðâ µFè äæXµFŒÍä,µF8µFæ â HµFŒÍ äæ”µF`“ähµFtµFæ â „µF`“ äæøµFL䤵F°µFæ â ÀµFL â „9еFäµFäè´FìℵFè\¶FDÅ ä¶F¶Fæ â $¶FDÅ â „94¶FH¶Fäè´FìℵF蘶FDZäl¶Fx¶Fæ â ˆ¶FDZ äæÔ¶F`œä¨¶F´¶Fæ â ĶF`œ äæð¶FÐAää¶Fè´Fæ ·F¤] å·FĶFæH·F4à ä·F(·Fæ â 8·F4à äæ„·FÌýäX·Fd·Fæ â t·FÌý äæÄ·FL¸ ä”·F ·Fæ âÜÀ°·Fè°µFè¸FääÔ·Fà·Fæ âÜÀð·Fè¶Fè" ÄF`/¨¸F¸Fp´F`/P¸Fÿèä|¸Fì€â´FâÀéœ1 䘸Fì â´Fä`¹F°¸Fp´F`/ì¸FPÿèä¹Fì€â´FâÁå4¹Fœ1 䘸Fð0"åP¹Fê ât·F äºFh¹Fp´F`/¤¹FPÿèäйFì€â´FâÂåì¹Fœ1 䘸Fð@)åx¶FìܺFºFp´F`/LºFÿèäxºFì€â´FâÃ唺Fœ1 䘸Fì°ºF@)åx¶FðxQä̺Fê âè´F ä¼»FäºFp´F`/ »FÿèäL»Fì€â´FâÄåh»Fœ1 䘸Fì„»F@)åx¶Fì »FxQä̺Fî0"åP¹F꘿FÄ»Fp´F`/á¼Fë¼Fä4’ îä,¼Fìâ´FìH¼Fœ1 䘸Fìt¼Fl äd¼Fì æèR äd¼FìJ´Fäà¼FâìG;`/âø¼FüÄ»Fö<¬ âì{öýÿí¼e ävõýÿí,nä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ú ¿Fp´F`/Ü¿FëˆÀF䨓 îäÀFìâ´Fì$ÀFœ1 䘸FìPÀFl ä@ÀFì æälÀFR ä@ÀFð0"åP¹FêJ´FäØÀFâ¼F`/"âðÀFü ¿Fö<¬ âì:öýÿí¼e ä(öýÿí0"å)öùÿõ{öýÿí¼e ävõýÿí,nä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ö"ÈÈFL¢ìÄF0ÄFp´FL¢lÄFÿèä˜ÄFì€â´FâÅå´ÄFœ1 䘸FìÐÄF@)åx¶FðL-å̺FîôÄFp´FL¢0ÅFëÀÅFä\“ îä\ÅFìâ´FìxÅFœ1 䘸Fì¤ÅFl ä”ÅFì æèR ä”ÅFìJ´FäÆFâˆÀFL¢â(ÆFüôÄFö<¬ âì{öýÿí¼e ävõýÿíh» ä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ö\ÉFHƒå ØÈFp´FHƒáÉFÿèä@ÉFät·F䀀â´FâÆéœ1 䘸FêðÉFHý älÉFäHý ¨ÉFäYÿå â ¸ÉFHý â „9ÈÉFÜÉFäè´Fìât·Fè„ÊF<: åÊFä<: <ÊFäYÿå â LÊF<: â „9\ÊFpÊFäè´Fìât·Fè"¤ËF|) ËF”ÊFp´F|) ÐÊFÿèäüÊFä ·Fä€â´FâÇéœ1 䘸Fð ËFp´F|) \ËFÿèäˆËFäà·F䀀â´F âÈéœ1 䘸Fê"ÄÌF<Þ8ÌF´ËFp´F<ÞðËFÿèäÌFä ·Fä€â´F âÉéœ1 䘸Fð@ÌFp´F<Þ|ÌFÿèä¨ÌFäà·F䀀â´F âÊéœ1 䘸FêXÍFÔO äÔÌFäÔO ÍFäYÿå â  ÍFÔO â „90ÍFDÍFäè´Fìât·FèìÍFèê ähÍFäèê ¤ÍFäYÿå â ´ÍFèê â „9ÄÍFØÍFäè´Fìât·Fè€ÎF¼ß äüÍFä¼ß 8ÎFäYÿå â HÎF¼ß â „9XÎFlÎFäè´Fìât·FèÏFÝ äÎFäÝ ÌÎFäYÿå â ÜÎFÝ â„9ìÎFáÏFäè´Fìât·Fè¨ÏFüÉä$ÏFäüÉ`ÏFäYÿå â pÏFüÉ â „9€ÏF”ÏFäè´Fìât·Fè<ÐFdk ä¸ÏFädk ôÏFäYÿå â ÐFdk â „9ÐF(ÐFäè´Fìât·Fè"ÖFÐàÑFLÐFp´FÐàˆÐFÿèä´ÐFä°µFä€â´F âËåÐÐFœ1 䘸FììÐFä¡ä°µFðÌ/å̺FêèÑFÑFp´FÐàLÑFÿèäxÑFì€â´F âÌå”ÑFœ1 䘸Fì°ÑFä¡ä°µFìÌÑF@)åx¶FðÌ/å̺FîðÑFp´FÐà,ÒFëØÒFä´˜ îäXÒFìâ´FìtÒFœ1 䘸FìÒFä¡ä°µFì¼ÒFl ä¬ÒFì æèR ä¬ÒFìJ´Fä(ÓFâÀÅFÐàâ@ÓFüðÑFö<¬ âì{öýÿí¼e ävõýÿíh ä(öýÿíä¡ä,öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ö¤ÖF Ú ä ÖFä Ú \ÖFäYÿå â lÖF Ú â „9|ÖFÖFäè´Fìât·Fè8×FÌoä´ÖFäÌoðÖFäYÿå âá ×FÌo â „9×F$×Fäè´Fìât·FèÌ×FHäH×FäH„×FäYÿå â ”×FH â „9¤×F¸×Fäè´Fìât·Fè`ØFö(öýÿíÌ/å,öýÿíhä)ö;ö}ö”âFJäâFäJLâFäYÿå â \âFJ â „9lâF€âFäè´Fìât·Fè(ãFdh ä¤âFädh àâFäYÿå â ðâFdh â„9áãFãFäè´Fìât·Fì,„ä8ãFä,„tãFäYÿå â „ãF,„ â „9”ãF¨ãFäè´Fìât·FèÔãF>õ ’ âìãFè â¯üãFèè´FèÄåFä¼ÞFîâDäFò{öýÿí¼e ävõýÿíô¸ä(öýÿíÌ/å,öýÿíä<öýÿíÐAä>ö(ö)ö)ö;ö}ö`çFäüÛFîâøåFò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å,öýÿíl ä,öýÿíR ä)ö;ö}öÌèFäÛFî â”çFò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å,öýÿíP&å)ö;ö}öêFäXÚFî ãéFò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å)ö;ö}öëFä˜ÙFî â<êFò{öýÿí¼e ävõýÿí¼Sä(öýÿíÌ/å)ö;ö}ö€ìFäÑFî âHëFò{öýÿí¼e ävõýÿíÐàä(öýÿíä¡ä,öýÿí@)å,öýÿíÌ/å)ö;ö}öÔíFäLÐFî â´ìFò{öDõýÿí¼e ävõýÿíÐàä(öýÿíä¡ä,öýÿíÌ/å)ö;ö}ö(ïFä@ÌFî âîFò{öDõýÿíää(öýÿí¼e ävõýÿíHý ä(ö)ö)ö;ö}ö|ðFä´ËFî â\ïFò{öDõýÿíL¸ ä(öýÿí¼e ävõýÿíHý ä(ö)ö)ö;ö}öÐñFä ËFî â°ðFò{öDõýÿíää(öýÿí¼e ävõýÿí<: ä(ö)ö)ö;ö}ö$óFä”ÊFî âòFò{öDõýÿíL¸ ä(öýÿí¼e ävõýÿí<: ä(ö)ö)ö;ö}ö0ôFäØÈFî âXóFò{öDõýÿí¼e ävõýÿí(© ä(ö)ö;ö}ölõFä0ÄFî âdôFò{öýÿí¼e ävõýÿíL¢ä(öýÿí@)å,öýÿíL-å)ö;ö}ö¨öFääºFî â õFò:öýÿí¼e ä(öýÿí@)å,öýÿíxQä,öýÿí0"å)ö{ö}ö´÷FäºFî âÜöFò:öýÿí¼e ä(öýÿí@)å,öýÿíxQä)ö{ö}öøFäh¹Fîâè÷Fò:öýÿí¼e ä(öýÿí@)å)ö{ö}ölùFä°¸FîâÄøFò:öýÿí¼e ä(öýÿí0"å)ö{ö}þ¸Fîâ ùFò{ö}úÜùF¨¬Gä4úFøV ôpðpwGä wG´Fä| G#h&øV äÜùFäTúF1ãálúFøV ädúFÜùFâûF¼e ä|úFˆúFæ â „9˜úF¬úFä8ýêâÀúFè â ÐúF@î âàúFáûF â ðúF8* äî8ýæ0ûF¤] ä$ûFðúFælûFŒÍä@ûFLûFæ â \ûFŒÍ 俍ûF`“ä|ûFˆûFæ â ˜ûF`“ äæäûFDZä¸ûFÄûFæ â ÔûFDZ äæ üF`œäôûFáüFæ â üF`œ äæ\üFÐAä0üF<üFæ âLüFæ ì˜üF4à älüFxüFæ â ˆüF4à äæÔüFÌýä¨üF´üFæ â ÄüFÌý äæÌG`QåäüFìüFâäDýF`Qé`GèBpä´FúFä Gä$Gè äG 4úF`QåìüFädýFãá|ýF`QåtýFìüFâ˜ýFÐAäŒýF<üFæ´ýF`œä¨ýFáüFæXþF4à äÄýFÐýFæ â àýF œ â T ðýF0þFãþFèIìûDþFâ´üFìâxüFèüþFŒÍähþFtþFæ â „þF œ â T ”þFÔþFã¨þFèIìûèþFâˆûFìâLûFèÿFL ä ÿF0Fæ"„G`/¼ÿF(ÿFDýF`/dÿFÿèäÿFì€âìüFâÒéœ1 ä¬ÿFì âìüFäÄGÄÿFDýF`/âGÿèä,Gì€âìüFâÓåHGœ1 ä¬ÿFðP&ådGê âtG ä âìüF„Gæ˜Gè4ÿîÌGDýF`/Gÿèä4Gì€âìüF âÚåPGœ1 ä¬ÿFðP&ålGì â |G œ â T ŒGÌGã GèIìû(GâàGè â ðGDÅ â„9áGGä8ýêâÀúFìâ<Gè â LGL â „9\GpGä8ýêâÀúFèG„ä”GDýF„ÐGÿèäüGätþF䀀âìüFâÔéœ1 ä¬ÿFê¬GTä(GDýFTdGÿèäGäÐýF䀀âìüFâÕéœ1 ä¬ÿFê"øG8PG¼GDýF8øGÿèä4Gä$Gä€âìüFâÖå âìüF èœ1 ä¬ÿFðXGDýF8”GÿèäÀGäìüFä€âìüFâ×åÜGœ1 ä¬ÿFðˆ$ô"4GÈŒGGDýFÈDGÿèäpGä$Gä€âìüFâØéœ1 ä¬ÿFð”GDýFÈÐGÿèäüGäìüFä€âìüFâÙåGœ1 ä¬ÿFðˆ$ôPGd” äDGlGæxG˜Îä`Gå˜ÎlG츣 äˆGDýF¸£ ÄGÿèäðGälGäR€€âìüF âÛéœ1 ä¬ÿFî0âëÐGäˆGîâXGò{öDõýÿí˜Îä;ö}ö¬GäÌGîâGò:öýÿí˜Îä(öýÿíP&å)ö{ö}öH Gä”GîâàGò{öýÿí`Qåýÿí`Tä(ö*öOõ)ö;öqõýÿí˜Îä;öDõýÿí`Tä;ö}öT GäGî â| Gò{öqõýÿí˜Îä;öDõ*öOõ;ö}öð GäXGî∠Gò{öýÿí`Qåýÿí`Tä(ö*öOõ)ö;öpõýÿí˜Îä;öDõýÿí`Tä;ö}öü Gä¼Gî â$ Gò{öpõýÿí˜Îä;öDõ*öOõ;ö}öhGä(Gî â0Gò{öDõýÿí4à ä(öýÿí˜Îä.öJõrõ(ö)ö)ö;ö}ötGä”Gî âœGò{öDõýÿíŒÍä(ö*öýÿí˜Îä)ö;ö}ö€GäÄÿFî â¨Gò:öýÿí˜Îä(öýÿíP&å.öýÿí˜Îä)ö{ö}þ(ÿFîâ´Gò{ö}ö GøŒýFæ4Gø¨ýFæ\GøÄýFæ„GøhþFæ¬Gø(ÿFæÔGøÄÿFæüGø”Gæ$Gø(GæLGø¼GætGøXGæœGøGæÄGø”GæxGøìGæGæ5ø âpGä8Gì€âTGÌ/å$Gî<0å$Gê{öDõýÿíÌ/å.öýÿí˜Îäjõýÿí<0å.öýÿí˜Îä;ö}ö,Gø GæÐGæ`4ø â$GäìGì€âGÌ/å$Gî<0å$Gê{öDõýÿíÌ/å.öýÿí˜Îäkõýÿí<0å.öýÿí˜Îä;ö}öTGøDGæüGø|Gæ¬GðHù âìüF¼GæÐGè4êþTGø$GæÜùFðHù|Gø`Gæ¤GøÌGæüˆGæ8GLäÜGèGæ âìüFøGæ Gè4ÿê¤GDÅ äHGTGæ âìüFdGæxGè4êþäGL¸ ä´GÀGæ âÜÀÐGèèGè$GääôGáGæ âÜÀGèTGè"ð%G`/ÈG4G4úF`/pGÿèäœGä8ýä€âÜùFâÜéœ1 ä¸Gì âÜùFä€GÐG4úF`/ GPÿèä8Gä8ýä€âÜùFâÝåTGœ1 ä¸Gð0"åpGê âÄüF ä(GˆG4úF`/ÄGPÿèäðGä8ýä€âÜùFâÞå Gœ1 ä¸Gð@)åÄûFì G0G4úF`/lGÿèä˜Gä8ýä€âÜùFâßå´Gœ1 ä¸GìÐG@)åÄûFðxQäìGì âüG ä âLüFäìGG4úF`/PGÿèä|Gä8ýä€âÜùFâàå˜Gœ1 ä¸Gì´G@)åÄûFìÐGxQäìGð0"åpGê˜!GôG4úF`/0GëÀGäL£ îä\GìâÜùFìxGœ1 ä¸Gì¤Gl ä”Gì æèR ä”GìúFäGâ0àF`/â(GüôGö<¬ âì{öýÿí,nä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ú !G4úF`/Ü!Gëˆ"Gäd¥ îä"GìâÜùFì$"Gœ1 ä¸GìP"Gl ä@"Gì æäl"GR ä@"Gð0"åpGêúFäØ"GâÀG`/ âð"Gü !Gö<¬ âì:öýÿí¼e ä(öýÿí0"å)öùÿõ{öýÿí,nä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ö h*GL¢¼&Gá&G4úFL¢<&Gÿèäh&Gì€âÜùFâáå„&Gœ1 ä¸Gì &G@)åÄûFðL-åìGðÄ&G4úFL¢á'Gë'Gää¤ îä,'GìâÜùFìH'Gœ1 ä¸Gìt'Gl äd'Gì æèR äd'GìúFäà'Gâˆ"GL¢âø'GüÄ&Gö<¬ âì{öýÿíh» ä(öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}öü*GHƒå x*G4úFHƒá´*Gÿèäà*GäÄüF䀀âÜùFââéœ1 ä¸Gê",GHý +G +G4úFHý H+Gÿèät+GäèGä€âÜùFâãéœ1 ä¸Gð˜+G4úFHý Ô+Gÿèå,GäTG䀀âÜùF âäéœ1 ä¸Gê"<-G<: °,G,,G4úF<: h,Gÿèä”,GäèGä€âÜùF âåéœ1 ä¸Gð¸,G4úF<: ô,Gÿèä -GäTG䀀âÜùF âæéœ1 ä¸Gê"\.G|) Ð-GL-G4úF|) ˆ-Gÿèä´-GäÀGä€âÜùF âçéœ1 ä¸GðØ-G4úF|) .Gÿèä@.GåG䀀âÜùF âèéœ1 ä¸Gê"|/G<Þð.Gl.G4úF<Þ¨.GÿèäÔ.GäÀGä€âÜùFâééœ1 ä¸Gðø.G4úF<Þ4/Gÿèä`/GåG䀀âÜùFâêéœ1 ä¸Gê0GÔO äŒ/GäÔO È/GäYÿå â Ø/GÔO â „9è/Gü/Gä8ýêâÀúFè¤0Gèê ä 0Gäèê \0GäYÿå â l0Gèê â „9|0G0Gä8ýêâÀúFè81G¼ß ä´0Gä¼ß ð0GäYÿå âá 1G¼ß â „91G$1Gä8ýêâÀúFè"¬2GÝ è1GH1G4úFÝ „1Gÿèä°1Gì€âÜùFâëåÌ1Gœ1 ä¸Gðà#äÄûFðð1G4úFÝ ,2GÿèäX2Gì€âÜùFâìåt2Gœ1 ä¸Gì2Gà#äÄûFðxQäìGì"Ì3GüÉ@3G¼2G4úFüÉø2Gÿèä$3GäLûFä€âÜùFâíéœ1 ä¸GðH3G4úFüÉ„3Gÿèä°3GäˆûF䀀âÜùFâîéœ1 ä¸Gê"ì4Gdk `4GÜ3G4úFdk 4GÿèäD4GäLûFä€âÜùFâïéœ1 ä¸Gðh4G4úFdk ¤4GÿèäÐ4GäˆûF䀀âÜùFâðéœ1 ä¸Gê":GÐà¸5Gü4G4úFÐà85Gÿèäd5GäèGä€âÜùFâñå€5Gœ1 ä¸Gìœ5Gä¡äèGðÌ/åìGì˜6GÀ5G4úFÐàü5Gÿèä(6Gì€âÜùFâòåD6Gœ1 ä¸Gì`6Gä¡äèGì|6G@)åÄûFðÌ/åìGð 6G4úFÐàÜ6Gëˆ7Gäà  îä7GìâÜùFì$7Gœ1 ä¸Gì@7Gä¡äèGìl7Gl ä\7Gì æèR ä\7GìúFäØ7Gâ'GÐàâð7Gü 6Gö<¬ âì{öýÿíh ä(öýÿíä¡ä,öýÿíl ä,öýÿíR ä,ö õýÿí¼e ävõýÿí¸Pä<öýÿíT¾ävõýÿíÔä<öýÿí<¬ ä>övõýÿíxQä>ö(ö)ö)ö;ö}ö@;G Ú ä :G4úF Ú Ü:Gÿèä;Gì€âÜùFâóå$;Gœ1 ä¸GðÌ/åìGìð;GÌoäP;G4úFÌoŒ;Gÿèä¸;Gì€âÜùFâôåÔ;Gœ1 ä¸GðÌ/åìGì„G<ÇÈ=G(=G4úF<Çd=Gÿèä=GäèGä€âÜùFâõå¬=Gœ1 ä¸Gðä¡äèGðÐ=G4úF<Ç >Gÿèä8>GäèGä€âÜùFâöåT>Gœ1 ä¸Gìp>Gl äèGðR äèGì ?G€" äœ>Gä€" Ø>GäYÿå â è>G€" â „9ø>G ?Gä8ýêâÀúFèà?G¼Sä0?G4úF¼Sl?Gÿèä˜?Gì€âÜùFâ÷å´?Gœ1 ä¸GðÌ/åÐ?Gì âÜùF ä"ˆBGج@Gð?G4úFØ,@GÿèäX@Gì€âÜùFâøåt@Gœ1 ä¸Gì@Gä¡äèGðÌ/åÐ?GìŒAG´@G4úFØð@GÿèäAGì€âÜùFâùå8AGœ1 ä¸GìTAGä¡äèGìpAGÌ/åÐ?GðP&åèGð”AG4úFØÐAGÿèäüAGì€âÜùFâúåBGœ1 ä¸Gì4BGä¡äèGìPBGÌ/åÐ?GìlBGl äèGðR äèGìCGdh ä˜BGädh ÔBGäYÿå â äBGdh â „9ôBGCGä8ýêâÀúFè°CG,„ä,CGä,„hCGäYÿå â xCG,„ â „9ˆCGœCGä8ýêâÀúFèÀHGì_ äÀCGÈCGâä DGì_ èèEGèpäìüFúFåFGäFGèHHG4úFì_ äÈCGä@DGãáXDGì_ äPDGÈCGâ(EG`/ähDG DG`/¤DGÿèäÐDGì€âÈCGâûåüDGœ1 äìDGì âÈCGèhäEGì æäØEG ä8EG DG tEGÿèä EGì€âÈCGâüå¼EGœ1 äìDGðÌ/å8ýî<ò äèEGå<ò EGìÜN âìlGGä8EGî âLFGò{öDõýÿí<ò ä(ö(öýÿí>å*ö)öýÿíÌ/å)ö;ö}þhDGîâ GGò:öýÿí<ò ä(öýÿíhä)ö{ö}öpHGøhDGæ˜HGø8EGæüèEGæ|NGäÐHGØHGâä0IGèKGèpäÈCGúFä,KGäDKGèNG4úFäØHGäPIGãáhIGä`IGØHGâ8JG`/äxIG0IG`/´IGÿèäàIGì€âØHGâýå JGœ1 äüIGì âØHGèhä(JGì æäKG äHJG0IG „JGÿèä°JGì€âØHGâþåÌJGœ1 äüIGìèJGÌ/å8ýî<0å8ýî<ò äKGå<ò (JGìÜN âì(MGäHJGîâxKGò{öDõýÿí<ò ä(ö(öýÿí>å*ö)öýÿíÌ/å,ö(öýÿí>å*ö)öýÿí<0å)ö;ö}þxIGîâ\MGò:öýÿí<ò ä(öýÿíhä)ö{ö}ö,NGøxIGæTNGøHJGæüKGæ,OG¸×äŒNG4úF¸×ÈNGÿèäôNGì€âÜùF âÿåOGœ1 ä¸GðxQäìGì¼QG(äö(öýÿí´Â ä)ö)ö;ö}ö"ØTGÜ PRGÌQG4úFÜ RGÿèä4RGì€âÜùF!ãéœ1 ä¸GðXRG4úFÜ ”RGëSGäì¡ îäÀRGìâÜùFìÜRGœ1 ä¸Gð´WäøRGì æäúFäXSGâìOGÜ âpSGüXRGö²âì{öýÿí¼e ävõýÿíÜ ä(öýÿíä<öýÿí²ä>ö(öýÿí´Wä)ö)ö;ö}ö"\XGô¸ˆUGèTG4úFô¸$UGÿèäPUGì€âÜùF"âålUGœ1 ä¸GðÌ/åÐ?GðUG4úFô¸ÌUGë\VGäP¡ îäøUGìâÜùFìVGœ1 ä¸Gì0VGÌ/åÐ?GðhäLVGì æäúFä¬VGâSGô¸âÄVGüUGöÜN âì{öýÿí¼e ävõýÿíô¸ä(öýÿíÌ/å,öýÿíä<öýÿíÜN ä>ö(öýÿíhä)ö)ö;ö}ö"x[GJðXGlXG4úFJ¨XGÿèäÔXGì€âÜùF#âéœ1 ä¸GðøXG4úFJ4YGë¨YGä|¨ îä`YGìâÜùFì|YGœ1 ä¸Gðhä˜YGì æäúFäøYGâ\VGJâZGüøXGöÜN âì{öýÿí¼e ävõýÿíJä(öýÿíä<öýÿíÜN ä>ö(öýÿíhä)ö)ö;ö}ö%pdG,nP_Gˆ[G4úF,nÄ[Gë]GäЧ îäð[GìâÜùFì \Gœ1 ä¸Gì8\Gl ä(\Gì æäT\GR ä(\Gðˆ$äp\Gì â €\GÈ\G â \G¸P â „9 \G´\Gä8ýêâÀúFïÜ\Gè4êþúFäX]Gâ¨YG,nâp]Güˆ[Gö<¬ âì{öýÿí¼e ävõýÿí,ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,ö(öýÿíÐAä)öýÿíR ä)ö;ö}úX_G4úF,n”_GëØ`Gä0µ îäÀ_GìâÜùFìÜ_Gœ1 ä¸Gì`Gl äø_Gì æä$`GR äø_Gðˆ$ä@`Gì â P`G˜`G â ``G¸P â „9p`G„`Gä8ýêâÀúFï¬`Gè4ÿêúFä(aGâ]G,n"â@aGüX_Gö<¬ âì{öýÿí¼e ävõýÿí,ä(öýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>ö(öýÿíl ä)ö,öùÿõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>ö(öýÿíR ä)ö)ö;ö}ö%˜mGh» HhG€dG4úFh» ¼dGìfGä|´ îäèdGìâÜùFìeGœ1 ä¸Gì0eGl ä eGì æäLeGR ä eGðˆ$äheGì â xeGÀeG â ˆeG¸P â „9˜eG¬eGä8ýêâÀúFïÔeGè4êþúFäPfGâØ`Gh» âhfGü€dGö<¬ âì{öýÿí¼e ävõýÿíL¢ä(öXõ<öýÿíDZä>ö(öýÿíl ä)ö,ö(öýÿíÐAä)öýÿíR ä)ö;ö}úPhG4úFh» ŒhGëÐiGäðµ îä¸hGìâÜùFìÔhGœ1 ä¸GíiGl äðhGì æäiGR äðhGðT#å8iGì â HiGiG â XiG¸P â „9hiG|iGä8ýêâÀúFï¤iGè4ÿêúFä jGãfGh» $â8jGüPhGö<¬ âì{öýÿí¼e ävõýÿíh» ä(öýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>ö(öýÿíl ä)ö,öùÿõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>ö(öýÿíR ä)ö,öýÿíT#å)ö;ö}ú!h ¼qG¨mG4úFh ämGëDoG䄵 îänGìâÜùFì,nGœ1 ä¸GìHnGä¡äèGìtnGl ädnGì æänGR ädnGðˆ$ä¬nGì â ¼nGoG â ÌnG¸P â „9ÜnGðnGä8ýêâÀúFïoGè4êþúFä”oGâÐiGh â¬oGü¨mGö<¬ âì{öýÿí¼e ävõýÿíÐàä(öýÿíä¡ä,öXõ<öýÿíDZä>ö(öýÿíl ä)ö,ö(öýÿíÐAä)öýÿíR ä)ö;ö}úÄqG4úFh árGë`sG䌲 îä,rGìâÜùFìHrGœ1 ä¸GìdrGä¡äèGìrGl ä€rGì æä¬rGR ä€rGðT#åÈrGì â ØrG sG â èrG¸P â „9ørG sGä8ýêâÀúFï4sGè4ÿêúFä°sGâDoGh 'âÈsGüÄqGö<¬ âì{öýÿí¼e ävõýÿíh ä(öýÿíä¡ä,öùÿõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>ö(öýÿíl ä)ö,öùÿõýÿîD ä<öýÿíüdä<öýÿí4à ä,öýÿí<¬ ä>ö>ö(öýÿíR ä)ö,öýÿíT#å)ö;ö}öˆwG>õ ’ î”xGälXGîâÔwGò{öýÿí¼e ävõýÿíJä(ö)ö;ö}özGäèTGîâÈxGò{öýÿíô¸ä(öýÿíÌ/å,öýÿíä<öýÿíÐAä>ö(ö)ö)ö;ö}ö {GäÌQGîâLzGò{öýÿí¼e ävõýÿíÜ ä(ö)ö;ö}ö|GäŒNGî â@{Gò{öýÿí¼e ävõýÿí¸×ä(öýÿíxQä)ö;ö}ö´}Gä”AGîâL|Gò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å,öýÿíl ä,öýÿíR ä)ö;ö}ö Gä´@Gî âè}Gò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å,öýÿíP&å)ö;ö}ö\€Gäð?Gî âTGò{öýÿí¼e ävõýÿíØä(öýÿíä¡ä,öýÿíÌ/å)ö;ö}öhGä0?Gî â€Gò{öýÿí¼e ävõýÿí¼Sä(öýÿíÌ/å)ö;ö}ö¼‚GäÐ=Gî âœGò{öDõýÿí¼e ävõýÿí<Çä(öýÿíl ä,öýÿíR ä)ö;ö}öàƒGä(=Gî âð‚Gò{öDõýÿí¼e ävõýÿí<Çä(öýÿíä¡ä)ö;ö}öì„GäP;Gî â„Gò{öýÿí¼e ävõýÿíÌoä(öýÿíÌ/å)ö;ö}öø…Gä :Gî â …Gò{öýÿí¼e ävõýÿí Ú ä(öýÿíÌ/å)ö;ö}öd‡GäÀ5Gî â,†Gò{öýÿí¼e ävõýÿíÐàä(öýÿíä¡ä,öýÿí@)å,öýÿíÌ/å)ö;ö}ö¸ˆGäü4Gî ☇Gò{öDõýÿí¼e ävõýÿíÐàä(öýÿíä¡ä,öýÿíÌ/å)ö;ö}ö ŠGäh4Gî âìˆGò{öDõýÿí`“ä(öýÿí¼e ävõýÿídk ä(ö)ö)ö;ö}ö`‹GäÜ3Gî â@ŠGò{öDõýÿíŒÍä(öýÿí¼e ävõýÿídk ä(ö)ö)ö;ö}ö´ŒGäH3Gî ┋Gò{öDõýÿí`“ä(öýÿí¼e ävõýÿíüÉä(ö)ö)ö;ö}öŽGä¼2Gî âèŒGò{öDõýÿíŒÍä(öýÿí¼e ävõýÿíüÉä(ö)ö)ö;ö}öDGäð1Gî â<ŽGò{öýÿí¼e ävõýÿíÝ ä(öýÿíà#ä,öýÿíxQä)ö;ö}öPGäH1Gî âxGò{öýÿí¼e ävõýÿíÝ ä(öýÿíà#ä)ö;ö}ö¤‘Gäø.Gî â„Gò{öDõýÿíää(öýÿí¼e ävõýÿíHý ä(ö)ö)ö;ö}öø’Gäl.Gî âØ‘Gò{öDõýÿíL¸ ä(öýÿí¼e ävõýÿíHý ä(ö)ö)ö;ö}öL”GäØ-Gî â,“Gò{öDõýÿíää(öýÿí¼e ävõýÿí<: ä(ö)ö)ö;ö}ö •GäL-Gî —Gò{öDõýÿíL¸ ä(öýÿí¼e ävõýÿí<: ä(ö)ö)ö;ö}ö¬–Gä¸,Gî âÔ•Gò{öDõýÿí¼e ävõýÿí<: ä(ö)ö;ö}ö¸—Gä,,Gî âà–Gò{öDõýÿí¼e ävõýÿí<: ä(ö)ö;ö}öĘGä˜+Gî âì—Gò{öDõýÿí¼e ävõýÿíHý ä(ö)ö;ö}öЙGä +Gî âø˜Gò{öDõýÿí¼e ävõýÿíHý ä(ö)ö;ö}öÜšGäx*Gî âšGò{öDõýÿí¼e ävõýÿí(© ä(ö)ö;ö}öœGå&Gî â›Gò{öýÿí¼e ävõýÿíL¢ä(öýÿí@)å,öýÿíL-å)ö;ö}öTGäGî âLœGò:öýÿí¼e ä(öýÿí@)å,öýÿíxQä,öýÿí0"å)ö{ö}ö`žGä0Gî âˆGò:öýÿí¼e ä(öýÿí@)å,öýÿíxQä)ö{ö}ö<ŸGäˆGî┞Gò:öýÿí¼e ä(öýÿí@)å)ö{ö}ö GäÐGîâpŸGò:öýÿí¼e ä(öýÿí0"å)ö{ö}þ4GîâL Gò{ö}ö0¡Gø¤ Gä â „9´ GÈ Gä8ýêâÜ Gè â ì G@î â ü G¡G â  ¡G8* äî8ýæX¡Gø|úF怡Gø$ûF模Gø@ûFæСGø|ûFæø¡Gø¸ûFæ ¢GøôûFæH¢Gø0üFæp¢GølüF昢Gø¨üFæÀ¢GøìüFèè¢GøÜGæ£GøHGæ8£Gø´Gæ`£GøôG戣Gø4Gæ°£GøÐGæØ£GøˆGæá¤Gø0Gæ(¤GøGæP¤Gù&Gæx¤Gøx*Gæ ¤Gø +GæȤGø˜+Gæð¤Gø,,Gæ¥Gø¸,Gæ@¥GøL-Gæh¥GøØ-Gæ¥Gøl.G渥Gøø.Gæ(¦Gøà¥Gæ â ð¥GÔO â„9á¦G¦Gä8ýêâÀúF蘦GøP¦Gæ â `¦Gèê â „9p¦G„¦Gä8ýêâÀúFè§GøÀ¦Gæ â ЦG¼ß â „9à¦Gô¦Gä8ýêâÀúFè0§GøH1GæX§Gøð1G性Gø¼2G樧GøH3GæЧGøÜ3Gæø§Gøh4Gæ ¨Gøü4GæH¨GøÀ5Gæp¨Gø :G昨GøP;Gæ©GøÀ¨Gæ â ШGH â „9à¨Gô¨Gä8ýêâÀúFèx©Gø0©Gæ â @©Gõ ’ î{öùÿõDõýÿí<0å<öýÿíÌ/å;öùÿõ}þ½GâÔÁG¸#âL½Gü”ÀGò4½G>õ ’ î{öùÿõDõvõýÿ픀ävõýÿí4· ä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö,öýÿí<0å.öýÿí<: ä(ö)ö)ö;öùÿõ}öh&¸ÐÀGî̼Gä³ îäìÀGìâpÁGÌ/åÁGê âÁG ä â ´F(ÁGLÁGä<ÁGè ðâ`ÁGè äê<0åŒÁGê âœÁG ä â ´F¬ÁGÀÁGä<ÁGìâ`ÁGð$ÂGâ´ÄG`4 âTÂGütÃGò<ÂG>õ ’ î{öùÿõDõ!ö(öýÿíÌ/åjõýÿí<0å)ö;öùÿõ}öh&`4°ÃGîÔÁG䨳 îäÌÃGìâPÄGÌ/åèÃGê âøÃG ä â ´FÄG,ÄGäÄGè ðâ@ÄGè äê<0ålÄGê â|ÄG ä â ´FŒÄG ÄGäÄGìâ@ÄGðÅGâ`sG5)â4ÅGü ÉGòÅG>õ ’ î{öùÿõDõýÿíÌ/å.öýÿíèê ä(ö)öjõýÿí<0å.öýÿíèê ä(ö)öiõvõýÿ픀ävõýÿíøtä(öýÿíÌ/å.öýÿíHý ä(ö)ö,öýÿíÌ/å.öýÿí<: ä(ö)ö,öýÿí<0å.öýÿíHý ä(ö)ö)ö;öùÿõ}öh&5HÉGî´ÄGäè± îädÉGìâèÉGÌ/å€ÉGê âÉG ä â ´F ÉGÄÉGä´ÉGè ðâØÉGè äê<0åÊGê âÊG ä â ´F$ÊG8ÊGä´ÉGìâØÉGìbð\ÊGtÀdÊG4e)lÊG7)tÊG„Ô|ÊGŒÑ„ÊGŒû'ŒÊGxø'”ÊGdõ'œÊGLÏ4¤ÊGìc6¬ÊGPŒ9´ÊG¼:ä¼ÊGh&ðøÊGîüËGä Æ îäËGìâ˜ËGÌ/å0ËGê â@ËG ä â ´FPËGtËGädËGè ðâˆËGè äê<0å´ËGê âÄËG ä â ´FÔËGèËGädËGìâˆËGðLÌGâœÍGð â|ÌGü¼ÊGòdÌG>õ ’ î{öùÿõDõ!ö(öýÿí<0å<öýÿíÌ/å)ö;öùÿõ}þìÍGât»G¸ âÎGü<ÏGòÎG>õ ’ î{öùÿõDõ!ö(öýÿíÌ/å<öýÿí<0å)ö;öùÿõ}öh&¸xÏGîœÍGäd¹ îä”ÏGìâÐGÌ/å°ÏGê âÀÏG ä â ´FÐÏGôÏGääÏGè ðâÐGè äê<0å4ÐGê âDÐG ä â ´FTÐGhÐGääÏGìâÐGìb¸ŒÐG„Ï”ÐG”s)œÐGÀ9)¤ÐG\Û¬ÐGì×´ÐGœ(¼ÐGˆ (ÄÐGt(ÌÐGÌÙ4ÔÐGdp6ÜÐGè›9äÐGT:ä ”ÀGÑGlÿäüÐG´ 'æXÿä xV),ÑG¼. ä$ÑGì'æb¸<ÑGäÃDÑGÌh)LÑGüôTÑGDÉ\ÑGLÆdÑGò'lÑGðî'tÑGÜë'|ÑG,Ò4„ÑG¤f6ŒÑGÐ9”ÑG<:ä<ÏGä´õä¬ÑG€Ê8æÈäÄÑGh&ÈáÒGÿìäÒGïá8ÒGè¼Rö¼Rî ŒdÒGlœ%ä@—%äp6 ä|ÒG<µ'æ,Kä”ÒG|@'æ”8 ä¬ÒG˜å/æ¼4 äÄÒGh&¼4 áÓGÿìäÓGïá8ÓG蜨-øèðTOä<œ,ä°-ätÓGh&°-°ÓGÿìäÌÓGï휨-í©HXðøÓG¬£DlÖGáÔGh&Xð<ÔGîÔGöäXÔGìáátÔGÿôÕG,ÕGççäçæáááxýâ<0éåá@Ì/éæá @Ìá äDÕGä8é pÕG¬ÕG„«Dô:âœÕGäH«Dü â„«Dæ ÖG´ÕGéàÕGü:áüµäåÿáÖGé@ÖGü:áüµäæýàØGtÖGh&Xð°ÖGî×GöäÌÖGìááèÖGÿôx×G ×Gççäçæáááxýâ<0éêá@Ì/éëá @Îá ä¸×Gä8é ä×G ØG¼¡Dô:âØG䀡Dü ⼡Dæ €ØG(ØGéTØGü:áp¨äêÿáˆØGé´ØGü:áp¨äëýpÛGèØGh&Xð$ÙGîxÙGöä@ÙGìáá\ÙGÿôìÙGÚGççäçæáááxýâ<0éÑá@Ì/éÒá@nâTä,ÚGä8é XÚG„ÚGX£Dô:âH£D䬣Dü äÚGŒÚGé¸ÚGü:á ¾äÑÿáìÚG2€èÛGüéDÛGü:ᬨäÒý,ÞGxÛGh&Xð´ÛGîÜGöäÐÛGìááìÛGÿô|ÜG¤ÜGççäçæáááxýâ<0éÖá@Ì/é×á@pâTä¼ÜGä8é èÜGÝGX£Dô:âH£D䬣Dü  ÝGÝG2€èHÝGüétÝGü:ᬨäÖÿá¨ÝG2€èÔÝGüêÞGü:ᬨä×ýèàG4ÞGh&XðpÞGîÄÞGöäŒÞGìáá¨ÞGÿô8ßG`ßGççäçæáááxýâ<0éÛá@Ì/éÜá@râTäxßGä8é ¤ßGÐßGX£Dô:âH£D䬣Dü \àGØßG2€èàGüé0àGü:á¤*äÛÿádàG2€èàGüé¼àGü:ᬨäÜý¤ãGðàGh&Xð,áGî€áGöäHáGìáádáGÿôôáGâGççäçæáááxýâ<0éàá@Ì/éáá@tâTä4âGä8é `âGŒâGX£Dô:âH£D䬣Dü ãG”âG2€èÀâGüéìâGü:á¤-äàÿá ãG2€èLãGüéxãGü:ᬨäáý`æG¬ãGh&XðèãGî<äGöääGìáá äGÿô°äGØäGççäçæáááxýâ<0éåá@Ì/éæá@vâTäðäGä8é åGHåGX£Dô:âH£D䬣Dü ÔåGPåG2€è|åGüé¨åGü:áèäåÿáÜåG2€èæGüé4æGü:ᬨäæýéGhæGh&Xð¤æGîøæGöäÀæGìááÜæGÿôlçG”çGççäçæáááxýâ<0éêá@Ì/éëá@yâTä¬çGä8é ØçGèGX£Dô:âH£D䬣Dü èG èG2€è8èGüédèGü:á´-äêÿá˜èG2€èÄèGüéðèGü:ᬨäëýØëG$éGh&Xð`éGî´éGöä|éGìáá˜éGÿô(êGPêGççäçæáááxýâ<0éïá@Ì/éðá@}âTähêGä8é ”êGÀêGX£Dô:âH£D䬣Dü LëGÈêG2€èôêGüé ëGü:áÄ-äïÿáTëG2€è€ëGüé¬ëGü:ᬨäðý”îGàëGh&XðìGîpìGöä8ìGìááTìGÿôäìG íGççäçæáááxýâ<0éôá@Ì/éõá@€âTä$íGä8é PíG|íGX£Dô:âH£D䬣Dü îG„íG2€è°íGüéÜíGü:áüµäôÿáîG2€è<îGüéhîGü:ᬨäõý$ñGœîGh&XðØîGî,ïGöäôîGìááïGÿô ïGÈïGççäçæáááxýâ<0éùá@Ì/éúá@‚âTäàïGä8é ðG8ðG¼¡Dô:âØG䀡Dü ˜ðG@ðGélðGü:áp¨äùÿá ðG2€èÌðGüéøðGü:ᬨäúý´óG,ñGh&XðhñGî¼ñGöä„ñGìáá ñGÿô0òGXòGççäçæáááxýâ<0éþá@Ì/éÿá@„âTäpòGä8é œòGÈòGX£Dô:âH£D䬣Dü (óGÐòGéüòGü:á ¾äþÿá0óG2€è\óGüéˆóGü:á¤*äÿýpöG¼óGh&XðøóGîLôGöäôGìáá0ôGÿôÀôGèôGççäçæáááxýâ<0éá@Ì/éá@†âTåõGä8é ,õGXõGX£Dô:âH£D䬣Dü äõG`õG2€èŒõGüé¸õGü:ᬨäÿáìõG2€èöGüéDöGü:á¤*äý,ùGxöGh&Xð´öGî÷GöäÐöGìááìöGÿô|÷G¤÷Gççäçæáááxýâ<0éá@Ì/é á@ˆâTä¼÷Gä8é è÷GøGX£Dô:âH£D䬣Dü  øGøG2€èHøGüétøGü:á¤*äÿá¨øG2€èÔøGüêùGü:á¤*ä ýèûG4ùGh&XðpùGîÄùGöäŒùGìáá¨ùGÿô8úG`úGççäçæáááxýâ<0é á@Ì/éá@ŠâTäxúGä8é ¤úGÐúGX£Dô:âH£D䬣Dü \ûGØúG2€èûGüé0ûGü:á¤-ä ÿádûG2€èûGüé¼ûGü:á¤*äý¤þGðûGh&Xð,üGî€üGöäHüGìáádüGÿôôüGýGççäçæáááxýâ<0éá@Ì/éá@ŒâTä4ýGä8é `ýGŒýGX£Dô:âH£D䬣Dü þG”ýG2€èÀýGüéìýGü:áèäÿá þG2€èLþGüéxþGü:á¤*äý`H¬þGh&XðèþGî<ÿGöäÿGìáá ÿGÿô°ÿGØÿGççäçæáááxýâ<0éá@Ì/éá@âTäðÿGä8é HHHX£Dô:âH£D䬣Dü ÔHPH2€è|Hüé¨Hü:á´-äÿáÜH2€èHüé4Hü:á¤*äýHhHh&Xð¤HîøHöäÀHìááÜHÿôlH”Hççäçæáááxýâ<0éá@Ì/éá@“âTä¬Hä8é ØHHX£Dô:âH£D䬣Dü H H2€è8HüédHü:áÄ-äÿá˜H2€èÄHüéðHü:á¤*äýØH$Hh&Xð`Hî´Höä|Hìáá˜Hÿô(HPHççäçæáááxýâ<0é!á@Ì/é"á@–âTähHä8é ”HÀHX£Dô:âH£D䬣Dü LHÈH2€èôHüé Hü:áüµä!ÿáTH2€è€Hüé¬Hü:á¤*ä"ýh HàHh&XðHîpHöä8HìááTHÿôäH Hççäçæáááxýâ<0é&á@Ì/é'á@˜âTä$Hä8é PH|H¼¡Dô:âØG䀡Dü ÜH„Hé°Hü:áp¨ä&ÿáäH2€è Hüé< Hü:á¤*ä'ýø Hp Hh&Xð¬ Hï HöäÈ Hìááä Hÿôt Hœ Hççäçæáááxýâ<0é+á@Ì/é,á@šâTä´ Hä8é à H HX£Dô:âH£D䬣Dü l H Hé@ Hü:á ¾ä+ÿát H2€è  HüéÌ Hü:á¤-ä,ý´Há Hh&Xð< Hî HöäX Hìáát Hÿô H, Hççäçæáááxýâ<0é0á@Ì/é1á@œâTäD Hä8é p Hœ HX£Dô:âH£D䬣Dü (H¤ H2€èÐ Hüéü Hü:ᬨä0ÿá0H2€è\HüéˆHü:á¤-ä1ýpH¼Hh&XðøHîLHöäHìáá0HÿôÀHèHççäçæáááxýâ<0é5á@Ì/é6á@žâTåHä8é ,HXHX£Dô:âH£D䬣Dü äH`H2€èŒHüé¸Hü:á¤*ä5ÿáìH2€èHüéDHü:á¤-ä6ý,HxHh&Xð´HîHöäÐHìááìHÿô|H¤Hççäçæáááxýâ<0é:á@Ì/é;á@ âTä¼Hä8é èHHX£Dô:âH£D䬣Dü  HH2€èHHüétHü:á¤-ä:ÿá¨H2€èÔHüêHü:á¤-ä;ýèH4Hh&XðpHîÄHöäŒHìáá¨Hÿô8H`Hççäçæáááxýâ<0é?á@Ì/é@á@¢âTäxHä8é ¤HÐHX£Dô:âH£D䬣Dü \HØH2€èHüé0Hü:áèä?ÿádH2€èHüé¼Hü:á¤-ä@ý¤HðHh&Xð,Hî€HöäHHìáádHÿôôHHççäçæáááxýâ<0éDá@Ì/éEá@¥âTä4Hä8é `HŒHX£Dô:âH£D䬣Dü H”H2€èÀHüéìHü:á´-äDÿá H2€èLHüéxHü:á¤-äEý`H¬Hh&XðèHî<HöäHìáá Hÿô°HØHççäçæáááxýâ<0éIá@Ì/éJá@©âTäðHä8é HHHX£Dô:âH£D䬣Dü ÔHPH2€è|Hüé¨Hü:áÄ-äIÿáÜH2€èHüé4Hü:á¤-äJýHhHh&Xð¤HîøHöäÀHìááÜHÿôlH”Hççäçæáááxýâ<0éNá@Ì/éOá@¬âTä¬Hä8é ØHHX£Dô:âH£D䬣Dü H H2€è8HüédHü:áüµäNÿá˜H2€èÄHüéðHü:á¤-äOý¬!H$Hh&Xð`Hî´Höä|Hìáá˜Hÿô( HP Hççäçæáááxýâ<0éSá@Ì/éTá@®âTäh Hä8é ” HÀ H¼¡Dô:âØG䀡Dü !HÈ Héô Hü:áp¨äSÿá(!H2€èT!Hüé€!Hü:á¤-äTý<$H´!Hh&Xðð!HîD"Höä "Hìáá("Hÿô¸"Hà"Hççäçæáááxýâ<0éXá@Ì/éYá@°âTäø"Hä8é $#HP#HX£Dô:âH£D䬣Dü °#HX#Hé„#Hü:á ¾äXÿá¸#H2€èä#Hüé$Hü:áèäYýø&HD$Hh&Xð€$HîÔ$Höäœ$Hìáá¸$HÿôH%Hp%Hççäçæáááxýâ<0é]á@Ì/é^á@²âTäˆ%Hä8é ´%Hà%HX£Dô:âH£D䬣Dü l&Hè%H2€è&Hüé@&Hü:ᬨä]ÿát&H2€è &HüéÌ&Hü:áèä^ý´)Há'Hh&Xð<'Hî'HöäX'Hìáát'Hÿô(H,(Hççäçæáááxýâ<0ébá@Ì/écá@´âTäD(Hä8é p(Hœ(HX£Dô:âH£D䬣Dü ()H¤(H2€èÐ(Hüéü(Hü:á¤*äbÿá0)H2€è\)Hüéˆ)Hü:áèäcýp,H¼)Hh&Xðø)HîL*Höä*Hìáá0*HÿôÀ*Hè*Hççäçæáááxýâ<0égá@Ì/éhá@¶âTå+Hä8é ,+HX+HX£Dô:âH£D䬣Dü ä+H`+H2€èŒ+Hüé¸+Hü:á¤-ägÿáì+H2€è,HüéD,Hü:áèähý,/Hx,Hh&Xð´,Hî-HöäÐ,Hìááì,Hÿô|-H¤-Hççäçæáááxýâ<0élá@Ì/émá@¸âTä¼-Hä8é è-H.HX£Dô:âH£D䬣Dü  .H.H2€èH.Hüét.Hü:áèälÿá¨.H2€èÔ.Hüê/Hü:áèämýè1H4/Hh&Xðp/HîÄ/HöäŒ/Hìáá¨/Hÿô80H`0Hççäçæáááxýâ<0éqá@Ì/érá@»âTäx0Hä8é ¤0HÐ0HX£Dô:âH£D䬣Dü \1HØ0H2€è1Hüé01Hü:á´-äqÿád1H2€è1Hüé¼1Hü:áèärý¤4Hð1Hh&Xð,2Hî€2HöäH2Hìáád2Hÿôô2H3Hççäçæáááxýâ<0évá@Ì/éwá@¿âTä43Hä8é `3HŒ3HX£Dô:âH£D䬣Dü 4H”3H2€èÀ3Hüéì3Hü:áÄ-ävÿá 4H2€èL4Hüéx4Hü:áèäwý`7H¬4Hh&Xðè4Hî<5Höä5Hìáá 5Hÿô°5HØ5Hççäçæáááxýâ<0é{á@Ì/é|á@ÂâTäð5Hä8é 6HH6HX£Dô:âH£D䬣Dü Ô6HP6H2€è|6Hüé¨6Hü:áüµä{ÿáÜ6H2€è7Hüé47Hü:áèä|ýð9Hh7Hh&Xð¤7Hîø7HöäÀ7HìááÜ7Hÿôl8H”8Hççäçæáááxýâ<0é€á@Ì/éá@ÄâTä¬8Hä8é Ø8H9H¼¡Dô:âØG䀡Dü d9H 9Hé89Hü:áp¨ä€ÿál9H2€è˜9HüéÄ9Hü:áèäý€HX£Dô:âH£D䬣Dü °>H,>H2€èX>Hüé„>Hü:ᬨäŠÿá¸>H2€èä>Hüé?Hü:á´-ä‹ýøAHD?Hh&Xð€?HîÔ?Höäœ?Hìáá¸?HÿôH@Hp@Hççäçæáááxýâ<0éá@Ì/éá@ÌâTäˆ@Hä8é ´@Hà@HX£Dô:âH£D䬣Dü lAHè@H2€èAHüé@AHü:á¤*äÿátAH2€è AHüéÌAHü:á´-äý´DHáBHh&Xðá@Ì/é?á @$áTä|Hä8é ¨HÔHX£Dô:âH£D䬣Dü `žHÜH2€èžHüé4žHü:áèä>ÿáhžH锞Hü:á ¾ä?ýP¡HÈžHh&XðŸHîXŸHöä ŸHìáá<ŸHÿôÌŸHôŸHççäçæáááxýâ<0éCá@Ì/éDá @'áTä  Hä8é 8 Hd HX£Dô:âH£D䬣Dü ð Hl H2€è˜ HüéÄ Hü:á´-äCÿáø Hé$¡Hü:á ¾äDýà£HX¡Hh&Xð”¡Hîè¡Höä°¡HìááÌ¡Hÿô\¢H„¢Hççäçæáááxýâ<0éHá@Ì/éIá @+áT䜢Hä8é È¢Hô¢HX£Dô:âH£D䬣Dü €£Hü¢H2€è(£HüéT£Hü:áÄ-äHÿሣHé´£Hü:á ¾äIýp¦Hè£Hh&Xð$¤Hîx¤Höä@¤Hìáá\¤Hÿôì¤H¥Hççäçæáááxýâ<0éMá@Ì/éNá @.áTä,¥Hä8é X¥H„¥HX£Dô:âH£D䬣Dü ¦HŒ¥H2€è¸¥Hüéä¥Hü:áüµäMÿá¦HéD¦Hü:á ¾äNÿáx¦Hh&Xð´¦Hî§HöäЦHìááì¦Hÿô|§H¤§Hççäçæáááxýâ<0éRá@Ì/éSá @0áTä¼§Hä8é è§H¨H¼¡Dô:âØG䀡Dü t¨H¨HéH¨Hü:áp¨äRÿá|¨H2€è¨¨HüéÔ¨Hü:á ¾äSÿá¸A ä©HTæ x(©Hì©!ä,œ!@©Há1ä¬â'ä¼äP©Hh&¼Œ©Hÿì䨩HïáÄ©Hÿ䜨-ðP1ä å'tªH`D åªHh&`D <ªHÿìäXªHï휨-ìøªH䄪Hh&ÀªHÿìäܪHä¼Rçí¼RîäT - «Hl«H„\#äøX#ä‚`40«HìÉ8«Hüo)@«H(N)H«HG)P«HP<)X«HDá`«HLÞh«H Ëp«HÐÈx«HD(€«H(ˆ«Hü(«H¬Ü4˜«HÌk6 «Hˆ–9¨«Hô:ätÃGÈ«HàôÀ«Hü}$ä2Ìx$P¬H5Ø«HÌÓà«H,w)è«HPR)ð«HpJ)ø«Hø>)áM¬Hè¬H¬ä¬HXͬHì#( ¬H¸((¬H¤(0¬HDâ48¬Hôy6@¬HØ¡9H¬HD%:ä ÉGä0? ä`¬Hh&0? œ¬Hÿì丬HïáÔ¬Hè¼Rìð¬HèÔ)ê ­Hÿ䬨ðÔä8­H¬@æ\­H$ T­Hä{!äÌq!ä6äl­H¨hê¼äX¡äL䘭H´RêB ä´­HpeâØ­Hø äÌ­H´dê¤J äè­HHVæ°på®H`ïæ˜ûä®Hh&˜ûT®Hÿìäp®HäçጮHè쨮HèÿæÜ®HttäÔ®H@9æ˜ äì®Hh&˜ (¯HÿìäD¯Hä¼Rçí¤-îAäp¯HŒXæäˆ¯HD¦'æ´ÿä ¯Hàª-êøV 伯H´Fæ&¼(Ô¯H|sFH²HܯHh&¼(°Hîl°Höä4°HìááP°Hÿôà°H±HççäçæáááxýâÌ/éÿá@<0êá @àá ä ±Hä8é L±Hˆ±HŒqFô:âx±HäPqFü âŒqFæ è±H±Hé¼±Hü:áüµäÿÿáð±Hé²Hü:áüµåý¼´HP²Hh&¼(Œ²Hîà²Hö䨲HìááIJHÿôT³H|³HççäçæáááxýâÌ/éá@<0éá @âá 䔳Hä8é À³Hü³H„ŒFô:âì³HäHŒFü ℌFæ \´H´Hé0´Hü:áp¨äÿád´Hé´Hü:áp¨äýL·HÄ´Hh&¼(áµHîTµHöäµHìáá8µHÿôȵHðµHççäçæáááxýâÌ/é‡á@<0éˆá @RáTä¶Hä8é 4¶H`¶H(sFô:âsFä|sFü À¶Hh¶Hé”¶Hü:á ¾ä‡ÿáȶH2€èô¶Hüé ·Hü:ᬨäˆýºHT·Hh&¼(·Hîä·Hö䬷HìááÈ·HÿôX¸H€¸HççäçæáááxýâÌ/éŒá@<0éá @TáT䘸Hä8é ĸHð¸H(sFô:âsFä|sFü |¹Hø¸H2€è$¹HüéP¹Hü:ᬨäŒÿᄹH2€è°¹HüéܹHü:ᬨäýļHºHh&¼(LºHî ºHöähºHìáᄺHÿô»H<»HççäçæáááxýâÌ/é‘á@<0é’á @VáTäT»Hä8é €»H¬»H(sFô:âsFä|sFü 8¼H´»H2€èà»Hüé ¼Hü:á¤*ä‘ÿá@¼H2€èl¼Hü阼Hü:ᬨä’ý€¿H̼Hh&¼(½Hî\½Höä$½Hìáá@½HÿôнHø½HççäçæáááxýâÌ/é–á@<0é—á @XáTä¾Hä8é <¾Hh¾H(sFô:âsFä|sFü ô¾Hp¾H2€èœ¾HüéȾHü:á¤-ä–ÿáü¾H2€è(¿HüéT¿Hü:ᬨä—ý<ÂHˆ¿Hh&¼(Ä¿HîÀHöäà¿Hìááü¿HÿôŒÀH´ÀHççäçæáááxýâÌ/é›á@<0éœá @ZáTäÌÀHä8é øÀH$ÁH(sFô:âsFä|sFü °ÁH,ÁH2€èXÁHüé„ÁHü:áèä›ÿá¸ÁH2€èäÁHüéÂHü:ᬨäœýøÄHDÂHh&¼(€ÂHîÔÂHöäœÂHìáá¸ÂHÿôHÃHpÃHççäçæáááxýâÌ/é á@<0é¡á @]áTäˆÃHä8é ´ÃHàÃH(sFô:âsFä|sFü lÄHèÃH2€èÄHüé@ÄHü:á´-ä ÿátÄH2€è ÄHüéÌÄHü:ᬨä¡ý´ÇHáÅHh&¼(<ÅHîÅHöäXÅHìáátÅHÿôÆH,ÆHççäçæáááxýâÌ/é¥á@<0é¦á @aáTäDÆHä8é pÆHœÆH(sFô:âsFä|sFü (ÇH¤ÆH2€èÐÆHüéüÆHü:áÄ-ä¥ÿá0ÇH2€è\ÇHüéˆÇHü:ᬨä¦ýpÊH¼ÇHh&¼(øÇHîLÈHöäÈHìáá0ÈHÿôÀÈHèÈHççäçæáááxýâÌ/éªá@<0é«á @dáTåÉHä8é ,ÉHXÉH(sFô:âsFä|sFü äÉH`ÉH2€èŒÉHüé¸ÉHü:áüµäªÿáìÉH2€èÊHüéDÊHü:ᬨä«þÍHxÊHh&¼(´ÊHîËHöäÐÊHìááìÊHÿô|ËH¤ËHççäçæáááxýâÌ/é¯á@<0é°á @fáTä¼ËHä8é èËHÌH„ŒFô:âì³HäHŒFü tÌHÌHéHÌHü:áp¨ä¯ÿá|ÌH2€è¨ÌHüéÔÌHü:ᬨä°ýÏHÍHh&¼(DÍHî˜ÍHöä`ÍHìáá|ÍHÿô ÎH4ÎHççäçæáááxýâÌ/é´á@<0éµá @háTäLÎHä8é xÎH¤ÎH(sFô:âsFä|sFü ÏH¬ÎHéØÎHü:á ¾ä´ÿá ÏH2€è8ÏHüédÏHü:á¤*äµýLÒH˜ÏHh&¼(ÔÏHî(ÐHöäðÏHìáá ÐHÿôœÐHÄÐHççäçæáááxýâÌ/é¹á@<0éºá @jáTäÜÐHä8é ÑH4ÑH(sFô:âsFä|sFü ÀÑH<ÑH2€èhÑHüé”ÑHü:ᬨä¹ÿáÈÑH2€èôÑHüé ÒHü:á¤*äºýÕHTÒHh&¼(ÒHîäÒHöä¬ÒHìááÈÒHÿôXÓH€ÓHççäçæáááxýâÌ/é¾á@<0é¿á @láTä˜ÓHä8é ÄÓHðÓH(sFô:âsFä|sFü |ÔHøÓH2€è$ÔHüéPÔHü:á¤*ä¾ÿá„ÔH2€è°ÔHüéÜÔHü:á¤*ä¿ýÄ×HÕHh&¼(LÕHî ÕHöähÕHìáá„ÕHÿôÖH<ÖHççäçæáááxýâÌ/éÃá@<0éÄá @náTäTÖHä8é €ÖH¬ÖH(sFô:âsFä|sFü 8×H´ÖH2€èàÖHüé ×Hü:á¤-äÃÿá@×H2€èl×Hüé˜×Hü:á¤*äÄý€ÚHÌ×Hh&¼(ØHî\ØHöä$ØHìáá@ØHÿôÐØHøØHççäçæáááxýâÌ/éÈá@<0éÉá @páTäÙHä8é <ÙHhÙH(sFô:âsFä|sFü ôÙHpÙH2€èœÙHüéÈÙHü:áèäÈÿáüÙH2€è(ÚHüéTÚHü:á¤*äÉý<ÝHˆÚHh&¼(ÄÚHîÛHöäàÚHìááüÚHÿôŒÛH´ÛHççäçæáááxýâÌ/éÍá@<0éÎá @sáTäÌÛHä8é øÛH$ÜH(sFô:âsFä|sFü °ÜH,ÜH2€èXÜHüé„ÜHü:á´-äÍÿá¸ÜH2€èäÜHüéÝHü:á¤*äÎýøßHDÝHh&¼(€ÝHîÔÝHöäœÝHìáá¸ÝHÿôHÞHpÞHççäçæáááxýâÌ/éÒá@<0éÓá @wáTäˆÞHä8é ´ÞHàÞH(sFô:âsFä|sFü lßHèÞH2€èßHüé@ßHü:áÄ-äÒÿátßH2€è ßHüéÌßHü:á¤*äÓý´âHáàHh&¼(<àHîàHöäXàHìáátàHÿôáH,áHççäçæáááxýâÌ/é×á@<0éØá @záTäDáHä8é páHœáH(sFô:âsFä|sFü (âH¤áH2€èÐáHüéüáHü:áüµä×ÿá0âH2€è\âHüéˆâHü:á¤*äØýDåH¼âHh&¼(øâHîLãHöäãHìáá0ãHÿôÀãHèãHççäçæáááxýâÌ/éÜá@<0éÝá @|áTåäHä8é ,äHXäH„ŒFô:âì³HäHŒFü ¸äH`äHéŒäHü:áp¨äÜÿáÀäH2€èìäHüéåHü:á¤*äÝýÔçHLåHh&¼(ˆåHîÜåHöä¤åHìááÀåHÿôPæHxæHççäçæáááxýâÌ/éáá@<0éâá @~áTäæHä8é ¼æHèæH(sFô:âsFä|sFü HçHðæHéçHü:á ¾äáÿáPçH2€è|çHüé¨çHü:á¤-äâýêHÜçHh&¼(èHîlèHöä4èHìááPèHÿôàèHéHççäçæáááxýâÌ/éæá@<0éçá @€áTä éHä8é LéHxéH(sFô:âsFä|sFü êH€éH2€è¬éHüéØéHü:ᬨäæÿá êH2€è8êHüédêHü:á¤-äçýLíH˜êHh&¼(ÔêHî(ëHöäðêHìáá ëHÿôœëHÄëHççäçæáááxýâÌ/éëá@<0éìá @‚áTäÜëHä8é ìH4ìH(sFô:âsFä|sFü ÀìH<ìH2€èhìHüé”ìHü:á¤*äëÿáÈìH2€èôìHüé íHü:á¤-äìýðHTíHh&¼(íHîäíHöä¬íHìááÈíHÿôXîH€îHççäçæáááxýâÌ/éðá@<0éñá @„áTä˜îHä8é ÄîHðîH(sFô:âsFä|sFü |ïHøîH2€è$ïHüéPïHü:á¤-äðÿá„ïH2€è°ïHüéÜïHü:á¤-äñýÄòHðHh&¼(LðHî ðHöähðHìáá„ðHÿôñH<ñHççäçæáááxýâÌ/éõá@<0éöá @†áTäTñHä8é €ñH¬ñH(sFô:âsFä|sFü 8òH´ñH2€èàñHüé òHü:áèäõÿá@òH2€èlòHüé˜òHü:á¤-äöý€õHÌòHh&¼(óHî\óHöä$óHìáá@óHÿôÐóHøóHççäçæáááxýâÌ/éúá@<0éûá @‰áTäôHä8é <ôHhôH(sFô:âsFä|sFü ôôHpôH2€èœôHüéÈôHü:á´-äúÿáüôH2€è(õHüéTõHü:á¤-äûý<øHˆõHh&¼(ÄõHîöHöäàõHìááüõHÿôŒöH´öHççäçæáááxýâÌ/éÿá@<0êá @áTäÌöHä8é øöH$÷H(sFô:âsFä|sFü °÷H,÷H2€èX÷Hüé„÷Hü:áÄ-äÿÿá¸÷H2€èä÷HüéøHü:á¤-åýøúHDøHh&¼(€øHîÔøHöäœøHìáá¸øHÿôHùHpùHççäçæáááxýâÌ/éá@<0éá @áTäˆùHä8é ´ùHàùH(sFô:âsFä|sFü lúHèùH2€èúHüé@úHü:áüµäÿátúH2€è úHüéÌúHü:á¤-äýˆýHáûHh&¼(<ûHîûHöäXûHìáátûHÿôüH,üHççäçæáááxýâÌ/é á@<0é á @’áTäDüHä8é püHœüH„ŒFô:âì³HäHŒFü üüH¤üHéÐüHü:áp¨ä ÿáýH2€è0ýHüé\ýHü:á¤-ä ýIýHh&¼(ÌýHî þHöäèýHìááþHÿô”þH¼þHççäçæáááxýâÌ/éá@<0éá @”áTäÔþHä8ê ÿH,ÿH(sFô:âsFä|sFü ŒÿH4ÿHé`ÿHü:á ¾äÿá”ÿH2€èÀÿHüéìÿHü:áèäýÔI Ih&¼(\Iî°IöäxIìáá”Iÿô$ILIççäçæáááxýâÌ/éá@<0éá @–áTädIä8é I¼I(sFô:âsFä|sFü HIÄI2€èðIüéIü:ᬨäÿáPI2€è|Iüé¨Iü:áèäýIÜIh&¼(IîlIöä4IìááPIÿôàIIççäçæáááxýâÌ/éá@<0éá @˜áTä Iä8é LIxI(sFô:âsFä|sFü I€I2€è¬IüéØIü:á¤*äÿá I2€è8IüédIü:áèäýLI˜Ih&¼(ÔIî(IöäðIìáá IÿôœIÄIççäçæáááxýâÌ/éá@<0éá @šáTäÜIä8é I4I(sFô:âsFä|sFü ÀI<I2€èhIüé”Iü:á¤-äÿáÈI2€èôIüé Iü:áèäý ITIh&¼(IîäIöä¬IìááÈIÿôX I€ IççäçæáááxýâÌ/é"á@<0é#á @œáTä˜ Iä8é Ä Ið I(sFô:âsFä|sFü | Iø I2€è$ IüéP Iü:áèä"ÿá„ I2€è° IüéÜ Iü:áèä#ýÄ I Ih&¼(L Iî  Iöäh Iìáá„ Iÿô I< IççäçæáááxýâÌ/é'á@<0é(á @ŸáTäT Iä8é € I¬ I(sFô:âsFä|sFü 8 I´ I2€èà Iüé Iü:á´-ä'ÿá@ I2€èl Iüé˜ Iü:áèä(ý€IÌ Ih&¼(Iî\Iöä$Iìáá@IÿôÐIøIççäçæáááxýâÌ/é,á@<0é-á @£áTäIä8é <IhI(sFô:âsFä|sFü ôIpI2€èœIüéÈIü:áÄ-ä,ÿáüI2€è(IüéTIü:áèä-ý<IˆIh&¼(ÄIîIöäàIìááüIÿôŒI´IççäçæáááxýâÌ/é1á@<0é2á @¦áTäÌIä8é øI$I(sFô:âsFä|sFü °I,I2€èXIüé„Iü:áüµä1ÿá¸I2€èäIüéIü:áèä2ýÌIDIh&¼(€IîÔIöäœIìáá¸IÿôHIpIççäçæáááxýâÌ/é6á@<0é7á @¨áTäˆIä8é ´IàI„ŒFô:âì³HäHŒFü @IèIéIü:áp¨ä6ÿáHI2€ètIüé Iü:áèä7ý\IÔIh&¼(IîdIöä,IìááHIÿôØIáIççäçæáááxýâÌ/é;á@<0é<á @«áTäIä8é DIpI(sFô:âsFä|sFü ÐIxIé¤Iü:á ¾ä;ÿáØI2€èIüé0Iü:á´-ä<ýIdIh&¼( IîôIöä¼IìááØIÿôhIIççäçæáááxýâÌ/é@á@<0éAá @®áTä¨Iä8éÔIáI(sFô:âsFä|sFü ŒII2€è4Iüé`Iü:ᬨä@ÿá”I2€èÀIüéìIü:á´-äAýÔI Ih&¼(\Iî°IöäxIìáá”Iÿô$ILIççäçæáááxýâÌ/éEá@<0éFá @°áTädIä8é I¼I(sFô:âsFä|sFü HIÄI2€èðIüéIü:á¤*äEÿáPI2€è|Iüé¨Iü:á´-äFý IÜIh&¼(IîlIöä4IìááPIÿôàIIççäçæáááxýâÌ/éJá@<0éKá @²áTä Iä8é LIxI(sFô:âsFä|sFü  I€I2€è¬IüéØIü:á¤-äJÿá I2€è8 Iüéd Iü:á´-äKýL#I˜ Ih&¼(Ô Iî(!Iöäð Iìáá !Iÿôœ!IÄ!IççäçæáááxýâÌ/éOá@<0éPá @´áTäÜ!Iä8é "I4"I(sFô:âsFä|sFü À"I<"I2€èh"Iüé”"Iü:áèäOÿáÈ"I2€èô"Iüé #Iü:á´-äPý&IT#Ih&¼(#Iîä#Iöä¬#IìááÈ#IÿôX$I€$IççäçæáááxýâÌ/éTá@<0éUá @·áTä˜$Iä8é Ä$Ið$I(sFô:âsFä|sFü |%Iø$I2€è$%IüéP%Iü:á´-äTÿá„%I2€è°%IüéÜ%Iü:á´-äUýÄ(I&Ih&¼(L&Iî &Iöäh&Iìáá„&Iÿô'I<'IççäçæáááxýâÌ/éYá@<0éZá @»áTäT'Iä8é €'I¬'I(sFô:âsFä|sFü 8(I´'I2€èà'Iüé (Iü:áÄ-äYÿá@(I2€èl(Iüé˜(Iü:á´-äZý€+IÌ(Ih&¼()Iî\)Iöä$)Iìáá@)IÿôÐ)Iø)IççäçæáááxýâÌ/é^á@<0é_á @¾áTä*Iä8é <*Ih*I(sFô:âsFä|sFü ô*Ip*I2€èœ*IüéÈ*Iü:áüµä^ÿáü*I2€è(+IüéT+Iü:á´-ä_ý.Iˆ+Ih&¼(Ä+Iî,Iöäà+Iìááü+IÿôŒ,I´,IççäçæáááxýâÌ/écá@<0édá @ÀáTäÌ,Iä8é ø,I$-I„ŒFô:âì³HäHŒFü „-I,-IéX-Iü:áp¨äcÿáŒ-I2€è¸-Iüéä-Iü:á´-ädý 0I.Ih&¼(T.Iî¨.Iöäp.IìááŒ.Iÿô/ID/IççäçæáááxýâÌ/éhá@<0éiá @ÃáTä\/Iä8é ˆ/I´/I(sFô:âsFä|sFü 0I¼/Iéè/Iü:á ¾ähÿá0I2€èH0Iüét0Iü:áÄ-äiý\3I¨0Ih&¼(ä0Iî81Iöå1Iìáá1Iÿô¬1IÔ1IççäçæáááxýâÌ/émá@<0éná @ÆáTäì1Iä8é 2ID2I(sFô:âsFä|sFü Ð2IL2I2€èx2Iüé¤2Iü:ᬨämÿáØ2I2€è3Iüé03Iü:áÄ-äný6Id3Ih&¼( 3Iîô3Iöä¼3IìááØ3Iÿôh4I4IççäçæáááxýâÌ/érá@<0ésá @ÈáTä¨4Iä8éÔ4Iá5I(sFô:âsFä|sFü Œ5I5I2€è45Iüé`5Iü:á¤*ärÿá”5I2€èÀ5Iüéì5Iü:áÄ-äsýÔ8I 6Ih&¼(\6Iî°6Iöäx6Iìáá”6Iÿô$7IL7IççäçæáááxýâÌ/éwá@<0éxá @ÊáTäd7Iä8é 7I¼7I(sFô:âsFä|sFü H8IÄ7I2€èð7Iüé8Iü:á¤-äwÿáP8I2€è|8Iüé¨8Iü:áÄ-äxý;IÜ8Ih&¼(9Iîl9Iöä49IìááP9Iÿôà9I:IççäçæáááxýâÌ/é|á@<0é}á @ÌáTä :Iä8é L:Ix:I(sFô:âsFä|sFü ;I€:I2€è¬:IüéØ:Iü:áèä|ÿá ;I2€è8;Iüéd;Iü:áÄ-ä}ýL>I˜;Ih&¼(Ô;Iî(Iü:áÄ-ä‚ýAIT>Ih&¼(>Iîä>Iöä¬>IìááÈ>IÿôX?I€?IççäçæáááxýâÌ/é†á@<0é‡á @ÓáTä˜?Iä8é Ä?Ið?I(sFô:âsFä|sFü |@Iø?I2€è$@IüéP@Iü:áÄ-ä†ÿá„@I2€è°@IüéÜ@Iü:áÄ-ä‡ýÄCIAIh&¼(LAIî AIöähAIìáá„AIÿôBIJà¢å ø=JHîIà¢á4>Jâÿèä`>JìááîIâ å|>JèüîIøì‰Iìd?Jt‰ä¨>JHîIt‰ä>Jâÿèä?JìááîIâ å,?JèüîIìH?Jè8ýø8ýì@Jbät?JHîIb°?JâÿèäÜ?JìááîIâ åø?JèüîIø8ýìÄ@Jlbå $@JHîIlbá`@JâÿèäŒ@JìááîI âå¨@JèüîIø8ýðX äÔ@JîIæ$íAJîIäTââHîI@ëê \UJ@\RJ?ê tUJìå\RJ@ê ŒUJ(ü \RJAê ¤UJ|¸\RJBê ¼UJ”@ \RJCê ÔUJÀR\RJDê ìUJÌ[\RJEê VJH¹\RJFê VJТ \RJGê 4VJˆ« \RJHê LVJÔÂ\RJIê dVJŒC\RJJê |VJŒÀ\RJKê ”VJÔz\RJLê ¬VJØU \RJMê ÄVJ@C \RJNêÜVJ á\RJOêôVJØ»á\RJPê WJÜÈá\RJQê$WJPÈá\RJRê ålþJè`üJø\ûJìÿJƒä˜þJ¬ûJƒÔþJâÿèåÿJìáá|ûJâ=ñ`üJìÌÿJÄä,ÿJ¬ûJÄhÿJâÿèä”ÿJìáá|ûJâ<å°ÿJè`üJÿèÄK qäÜÿJ¬ûJ qKâÿèäDKìáá|ûJ â;å`Kè`üJì|Kø¨Kè˜Kì â\èJòèð„3äÔK|ûJæ$íK|ûJä$ââ¬ûJÔH<Kÿä$ìâåÀåF,Kü äpK€øJü ¬KâÿèäØKìááPøJ âIåôKè4ùJìKè\èJøÈìøKWä<K€øJWxKâÿèä¤KìááPøJâHåÀKè4ùJìÜKÿäÈìÄK”|äK€øJ”|DKâÿèäpKìááPøJâGåŒKè4ùJì¨Kè\èJø<§IìtKUäÔK€øJUKâÿèä<KìááPøJâFåXKè4ùJø\èJì$KÔéä„K€øJÔéÀKâÿèäìKìááPøJâEåKè4ùJÿè(KÔ´ ä4K€øJÔ´ pKâÿèäœKìááPøJ âDå¸Kè4ùJìÔKøðKè ¦Iì Kè\èJøèð¨ä8KPøJæ$ìdKPøJä0ââ€øJ`_ Kÿä0ìâæÀåF\ KÌÅäÔKhìJÌÅKâÿèä<Kìáá8ìJâ5åXKèíJøtKì â„Kæâ´K™ è, Kèâpê™ ä„KäÔKãá¤K2ääK´K2 Kÿèä\KäLKäã„Kì â„K äˆKèxKì â„KðLKêÌKå´Kæé âôK›äÜKâ´K›èâ Kà ä KâÜKà èâD KÜä, Kâ KÜð™ äT K„Kâ KÙäl KhìJÙ¨ KâÿèäÔ Kìáá8ìJâ4åð KèíJøtKì  K¼"ä KhìJ¼"X Kâÿèä„ Kìáá8ìJâ3ñíJìP K¼È ä° KhìJ¼È ì Kâÿèä Kìáá8ìJâ2å4 KèíJø ¦Ií K|n ä` KhìJ|n œ KâÿèäÈ Kìáá8ìJ â1åä KèíJø ¦IðŒù ä K8ìJæ$ì< K8ìJä<ââhìJ(i x Kÿä<ìâæÀåF¸ Kè\èJìÔ Kèìð Kèèø˜Kìô KlŒ ä KœèJlŒ X Kâÿèä„ KìáálèJPâ\å  KèPéJì¼ Kè(ìJìØ Kè\èJøÔ)ìÀKœäKœèJœ@KâÿèälKìáálèJLâ[åˆKèPéJì¤Kè\èJø˜KìŒK äÐKœèJ Kâÿèä8KìáálèJHâZåTKèPéJìpKè\èJø˜Kì<KxäœKœèJxØKâÿèäKìáálèJDâYå KèPéJø˜Kì$Kü äLKœèJü ˆKâÿèä´KìáálèJ@âXåÐKèPéJììKè(ìJìKè\èJøÈì KUä4KœèJUpKâÿèäœKìáálèJ<âWå¸KèPéJìÔKè(ìJìðKè\èJø\èJì¼KÈ äKœèJÈ XKâÿèä„KìáálèJ8âVå KèPéJøèìlKä'äÌKœèJä'Kâÿèä4KìáálèJ4âUåPKèPéJø\èJì8Kì5ä|KœèJì5¸KâÿèääKìáálèJ0âTæKèPéJìKÿä\ûJì K´È äHKœèJ´È „Kâÿèä°KìáálèJ,âSåÌKèPéJìèKè\èJìKÿä˜Kì$K¨qä0KœèJ¨qlKâÿèä˜KìáálèJ(âRå´KèPéJìÐKè(ìJììKøKè˜Kø˜Kì(K@´ä4KœèJ@´pKâÿèäœKìáálèJ$âQå¸KèPéJìÔKè(ìJìðKè\èJì Kè öt!ì,KØ ä8KœèJØ tKâÿèä KìáálèJ âPå¼KèPéJìØKè(ìJìôKè\èJìKè öt!ð\| ä<KlèJæXKìâ ˆK  ŒKèH!Kä @áp¨!Kæ  äXKä¨Kãá"K`/LK¸KˆK`/ôKÿèä KìãXKø<Kì âXKèTKˆK`/Kÿèä¼KìãXKìØKè<KøôKê âXK ä´K2äKˆK2PKÿèä|KäôKäãXKì˜Kè<KøôKêdKŒ äÄKˆKŒ áKâÿèä,KìááXKâOåHKè<Kø¤•Iì0K´¡ätKˆK´¡°KâÿèäÜKìááXKâNåøKè<KìKèÀIÿèàKØùä@KˆKØù|Kâÿèä¨KìááXKâMåÄKè<KøÀIìtK¨, äðKˆK¨, ,KâÿèäXKìááXKâLñ<Kð  ä„KXKæ Kìâ ÐKÈnÄ KèØ Kä @áp8!KæÈnä KäðKãá LK`/”KáKÐK`/<KÿèähKìã Kø„Kì â KèœKÐK`/ØKÿèäKìã Kì Kè„Kø<Kê â K äüK2ä\KÐK2˜KÿèäÄKä<Käã KìàKè„Kø<Kê¬ K$å KÐK$áH Kâÿèät Kìáá K âKå Kè„Køì‰IðÈnä¼ K Kæ$ìè K KäââÐKP$!Kÿäìâ åÀåFX!KXKä(ââˆK¼A ”!Kÿä(ìâ åÀåFÈ!KlèJädââœèJÀ "KÿädìâæÀåFô"Kxr ä8"KXäJxr t"Kâÿèä "Kìáá(äJâžå¼"Kè åJìØ"Kÿô¬-KÜb ä#KXäJÜb @#Kâÿèäl#Kìáá(äJ âåˆ#Kè åJí(Kè¤#Kì â´#Kæâä#KHe èÐ'KèâpêHe ä´#Kä$KãáÔ$K2ä$Kä#K2P$KÿèäŒ$Kä|$Käã´#Kì â´#K ä¸$Kè¨$Kì â´#Kð|$Kêü$KDÊää$KæDÊèâ$%K<›ä %Kâä$K<›è âL%K8å ä4%Kâ %K8å èâÀ'K¸ä\%Kâ 4%K¸t%Käâ â„%Kæâ´%KüÒè'KèâpêüÒä„%KäÔ%Kãá¤&K2ää%K´%K2 &Kÿèä\&KäL&Käã„%Kì â„%K äˆ&Kèx&Kì â„%KðL&Kêà&K Æ ä´&Kæ Æ Ì&Kä â êä'Kxsäð&Kâ´&Kxsè â0'K‡ä'Kâð&K‡èâX'Káµ ä@'Kâ'Káµ èâ€'Kÿäh'Kâ@'Kÿèâ¨'K< ä'Kâh'K< ðüÒä¸'K„%Kâè'KÜ÷åÐ'Kâ\%KÜ÷ñHe äø'K´#Kî(Kì â,(Kæ â\(KÜè|-KèâpêÜä,(Kä|(K ãáL)K2äŒ(K\(K2È(Kÿèä)Käô(Käã,(Kì â,(K ä0)Kè )Kì â,(Kðô(Kêt)K ¯ ä\)Kæ ¯ ¦Iäâœ)K´ä„)K\)K´ŒäâÄ)K8¹ä¬)K„)K8¹ÀIäâì)KØ äÔ)K¬)KØ äâ*K¸ äü)KÔ)K¸ 8ýäâ¬+K¥ä$*Kü)K¥<*Käâ âL*Kæâ|*Káþ è|+Kèâpëþ äL*Käœ*Kãál+K2ä¬*K|*K2è*Kÿèä$+Kä+KäãL*Kì âL*K äP+Kè@+Kì âL*Kð+Kê”+KÁä|+KæÁñþ ä¤+KL*KâÔ+KÄä¼+K$*KÄ8ýäâl-KXÄ ää+Kâ ¼+KXÄ ü+Käâ â ,Kæâ<,KŒ è<-KèâpêŒ ä ,Kä\,Kãá,-K2äl,K<,K2¨,Kÿèää,KäÔ,Käã ,Kì â ,K ä-Ké-Kì â ,KðÔ,KêT-KÁä<-KæÁðŒ äd-K ,Kâ”-KDÊä|-Kâä+KDÊðÜä¤-K,(Kæ¤ ä¼-K(äJæ$ìè-K(äJä(ââXäJÄ< $.Kÿä(ìâåÀåFp.KèyäX.KãäJèyèâ˜.K€Ïä€.Kâ X.K€Ï´#K쬄ä¨.K¨âJîèðD äÜ.K|ÝJæ$ì/K|ÝJä$ââ¬ÝJ8F D/Kÿä$ìâåÀåF0K¼W äx/K€ÚJ¼W ´/Kâÿèäà/KìááPÚJ(â¶åü/Kè4ÛJÿè1KáÐä (0K€ÚJáÐd0Kâÿèä0KìááPÚJ$âµå¬0Kè4ÛJìÈ0Kè¤#Kìä0Kù1KèäJøèìÜ7KxIå ,1K€ÚJxIáh1Kâÿèä”1KìááPÚJ â´å°1Kè4ÛJìÌ1Kÿäè1Kì âø1Kæ â2Kæâ 82K¸bX7Kèl7Kä @ápÌ7Kæ¸bä2KäX2Kãá"´3K`/ü2Kh2K82K`/¤2KÿèäÐ2Kìã2Køì2Kì â2Kè3K82K`/@3Kÿèäl3Kìã2Kìˆ3Kèì2Kø¤3Kê â2K äd4K2äÄ3K82K2á4Kÿèä,4Kä¤3Käã2KìH4Kèì2Kø¤3Kê5K|§ät4K82K|§°4KâÿèäÜ4Kìáá2Kâ—åø4Kèì2Køè1Kì¨5Kƒä$5K82Kƒ`5KâÿèäŒ5Kìáá2Kâ–ñì2KìX6KÄä¸5K82KÄô5Kâÿèä 6Kìáá2Kâ•å<6Kèì2Kÿè@7K qäh6K82K q¤6KâÿèäÐ6Kìáá2K â”åì6Kèì2Kì7Kø$7Kè¤#Køèð¸bäP7K2Kæ$ì|7K2Kä$ââ82KìÆ ¸7Kÿä$ìâåÀåFÄ8KHÖ äì7K€ÚJHÖ (8KâÿèäT8KìááPÚJâ³åp8Kè4ÛJìŒ8Kè¤#Kì¨8Kè(Kÿè9Kt· äÔ8K€ÚJt· 9Kâÿèä<9KìááPÚJâ²åX9Kè4ÛJìt9Kè¤#Kø¤#Kì@:Kp=ä 9K€ÚJp=Ü9Kâÿèä:KìááPÚJâ±å$:Kè4ÛJø¤#Kì ;Kh:äP:K€ÚJh:Œ:Kâÿèä¸:KìááPÚJâ°åÔ:Kè4ÛJìð:Kè¤#Kø(KìØ;K”× ä;K€ÚJ”× X;Kâÿèä„;KìááPÚJ â¯å ;Kè4ÛJì¼;Kè¤#Kø(KðÄ% äè;KPÚJæ$ìKèö$>Kì â4>Kæâd>K : èŒFKèâpê : ä4>Kä„>KãáT?K2ä”>Kd>K2Ð>Kÿèä ?Käü>Käã4>Kì â4>K ä8?Kè(?Kì â4>Kðü>Kê|FKKâpIKLäÌFKäLGKááÿåä$GKä8ýçDá@GKø\GKø8IKèxGKê âˆGKæ â¸GK8èIKèâpê8äˆGKäØGKãá¨HK2äèGK¸GK2$HKÿèä`HKäPHKäãˆGKì âˆGK äŒHKè|HKì âˆGKðPHKêÐHK¤jä¸HKæ¤jèâøHK$ÄäàHKâ ¸HK$Ä8ýäâ IKLjäIKâàHKLjð8ä0IKˆGKâTIKÿä8ýìxKKä€IKŒIKæ$â¼IKT÷ èHKKèâpêT÷ äŒIKäÜIKãá¬JK2äìIK¼IK2(JKÿèädJKäTJKäãŒIKì âŒIK äJKè€JKì âŒIKðTJKêèJK· ä¼JKæ· ÔJKäâ â@µJääKK Õ äøJKâ¼JK Õ èâ8KKðä KKâ øJKðåpKè`<{Kôà ä€zKˆlKôà ¼zKâÿèäèzKìááXlKŒâ8å{Kè/'Òƒoá øzw‚¬™KLb ä ™KèƒKLb H™Kâÿèät™KìáḃKìâPå™K蜄Kø¤-ìxšKð ä¼™KèƒKð ø™Kâÿèä$šKìáḃKèâOå@šK蜄Kì\šKè êIøpÿìD›KlÛ䈚KèƒKlÛÄšKâÿèäðšKìáḃKäâNå ›K蜄Kì(›Kèø sKìHœK„FäT›KèƒK„F›Kâÿèä¼›KìáḃKàâM娛K蜄Kìô›Kè êIìœKèì,œKèø sKìKø„äXœKèƒKø„”œKâÿèäÀœKìáḃKÜâLåÜœK蜄KìøœKèøèsKìø Kˆ£ä$KèƒKˆ£`KâÿèäŒKìáḃKØâKå¨K蜄KìÄKèøàKì âðKæ ãžKæâ0žKát K舠Kä @ápè KçåžKäPžKãá"¬ŸK`/ôžK`žK0žK`/œžKÿèäÈžKìäžKøäžKì ãžKèüžK0žK`/8ŸKÿèädŸKìäžK쀟KèäžKøœŸKê ãžK ä\ K2伟K0žK2øŸKÿèä$ K䜟KääžKì@ KèäžKøœŸKïäl KážKæXlK옠KážKä´ââ0žK€†Ô Kÿä´ì⎿3)6{Ò²ÀO˜>`ì¦KHëä¡KèƒKHëD¡Kâÿèäp¡KìáḃKÔâJ匡K蜄K쨡KèøÄ¡Kì âÔ¡Kæ âä¡Kæâ ¢K žh¦Kè|¦Kä @ápܦKæ žää¡Kä4¢Kãá"£K`/Ø¢KD¢K¢K`/€¢Kÿè䬢Kìãä¡KøÈ¢Kì âä¡Kèà¢K¢K`/£KÿèäH£Kìãä¡Kìd£KèÈ¢Kø€£Kê âä¡K ä@¤K2ä £K¢K2Ü£Kÿèä¤K䀣Käãä¡Kì$¤KèÈ¢Kø€£Kêð¤K€Ù äP¤K¢K€Ù Œ¤Kâÿè两Kìááä¡K´âzåÔ¤KèÈ¢Kø êIì ¥KxÍå¥K¢KxÍ<¥Kâÿèäh¥Kìááä¡K°âyå„¥KèÈ¢KøêIìP¦KÄ5 ä°¥K¢KÄ5 ì¥Kâÿèä¦Kìááä¡K¬âxå4¦KèÈ¢KøÔ)ð žä`¦Kä¡KæXlK쌦Kä¡KäÀââ¢K ȦKÿäÀìâ…¿3)6{Ò²ÀO˜>`ü¬K³äü¦KèƒK³8§Kâÿèäd§KìáḃKÐâI倧K蜄K윧Kè츧KèøÔ§Kì âä§Kæ âô§Kæâ $¨KLfx¬K茬Kä @ápì¬KæLfäô§KäD¨Kãá" ©K`/è¨KT¨K$¨K`/¨Kÿè伨Kìãô§KøبKì âô§Kèð¨K$¨K`/,©KÿèäX©Kìãô§Kìt©KèبKø©Kê âô§K äPªK2ä°©K$¨K2ì©KÿèäªKä©Käãô§Kì4ªKèبKø©Kë«KL ä`ªK$¨KL œªKâÿèäȪKìááô§K´â‡åäªKèبKøì°«Khgä«K$¨KhgL«Kâÿèäx«Kìááô§K°â†å”«KèبKøÔ)ì`¬Kä äÀ«K$¨Kä ü«Kâÿèä(¬Kìááô§K¬â…åD¬KèبKøÔ)ðLfäp¬Kô§KæXlK윬Kô§KäÀââ$¨KP˜جKÿäÀì≿3)6{Ò²ÀO˜>`ä½Kx1ä ­KèƒKx1H­Kâÿèät­KìáḃKÌâHå­K蜄K쬭KèøÈ­Kì âØ­Kæ âè­Kæâ ®K\u\°Kèt½Kä @ápÔ½Kæ\uäè­Kä8®Kãá"”¯K`/Ü®KH®K®K`/„®Kÿèä°®Kìãè­KøÌ®Kì âè­Kèä®K®K`/ ¯KÿèäL¯Kìãè­Kìh¯KèÌ®Kø„¯Kê âè­K äD°K2䤯K®K2à¯Kÿèä °K䄯Käãè­Kì(°KèÌ®Kø„¯Kî\uäT°Kè­Kæp°Kìâ  °KÌŽгKè½Kä @ápd½KæÌŽäp°KäÀ°Kãá"²K`/d±KаK °K`/ ±Kÿèä8±Kìãp°KøT±Kì âp°Kèl±K °K`/¨±KÿèäÔ±Kìãp°Kìð±KèT±Kø ²Kê âp°K ä̲K2ä,²K °K2h²Kÿè䔲Kä ²Käãp°Kì°²KèT±Kø ²K긳K€näܲK °K€n³KâÿèäD³Kìááp°KÌâ„å`³KèT±Kì|³Kÿ䘳Kì ⨳Kæ âp°KêÌŽäȳKp°Kæä³Kìâ´K<¤á€¼K蔼Kä @ápô¼Kæ<¤åä³Kä4´K ãá"µK`/Ø´KD´K´K`/€´Kÿè䬴Kìãä³KøÈ´Kì âä³Kèà´K´K`/µKÿèäHµKìãä³KìdµKèÈ´Kø€µKê âä³K ä@¶K2ä µK´K2ܵKÿèä¶K䀵Käãä³Kì$¶KèÈ´Kø€µKê(·K,oäP¶K´K,oŒ¶Kâÿè丶Kìááä³KÈâwåÔ¶KèÈ´Kìð¶Kø ·Kÿäìô·K$( ä8·K´K$( t·Kâÿèä ·Kìááä³KÄâvå¼·KèÈ´KìØ·KÿôÀ¸Kdâä¸K´Kdâ@¸Kâÿèäl¸Kìááä³KÀâu券KèÈ´K줸Kÿäìp¹K@¡å иK´K@¡á ¹Kâÿèä8¹Kìááä³K¼âtåT¹KèÈ´KøìXºKÀ‹å €¹K´KÀ‹á¼¹Kâÿèäè¹Kìááä³K¸âsåºKèÈ´Kì ºKø<ºKÿäÔ)ì»Kè­ähºK´Kè­¤ºKâÿèäкKìááä³K´âråìºKèÈ´Kø¤-츻KL ä»K´KL T»Kâÿè䀻Kìááä³K°âq圻KèÈ´Køìh¼KhgäÈ»K´Khg¼Kâÿèä0¼Kìááä³K¬âpåL¼KèÈ´KøÔ)ð<¤åx¼Kä³KæXlK줼Kä³KäÔââ´K¤oà¼KÿäÔìâ„¿3)6{Ò²ÀO˜>`½Kp°KäØââ °KPõP½KÿäØì⇿3)6{Ò²ÀO˜>`„½Kè­KäØââ®Kp/À½KÿäØì⊿3)6{Ò²ÀO˜>`ÈÁKDmäô½KèƒKDm0¾Kâÿèä\¾KìáḃKÈâGåx¾K蜄K씾Kèø°¾Kì âÀ¾Kæ âоKæã ¿KÐDÁKèXÁKä @áp¸ÁKæÐäоKä ¿Kãá|ÀK`/Ä¿K0¿Ká ¿K`/l¿Kÿè䘿KìãоKø´¿Kì âоKèÌ¿Ká ¿K`/ÀKÿèä4ÀKìãоKìPÀKè´¿KølÀKê âоK ä,ÁK2äŒÀKá ¿K2ÈÀKÿèäôÀKälÀKäãоKìÁKè´¿KølÀKîÐä<ÁKоKæä³KìhÁKоKäÔâã¿KÔ¶¤ÁKÿäÔì∿3)6{Ò²ÀO˜>`”ÂK¨µäØÁKèƒK¨µÂKâÿèä@ÂKìáḃKÄâFå\ÂK蜄KìxÂKèø˜³Kì\ÆKøk ä¤ÂKèƒKøk àÂKâÿèä ÃKìáḃKÀâEå(ÃK蜄KøDÃKì âTÃKæ âdÃKæâ ”ÃK¬à ØÅKèìÅKä @ápLÆKæ¬à ädÃKä´ÃKãáÅK`/XÄKÄÃK”ÃK`/áÄKÿèä,ÄKìãdÃKøHÄKì âdÃKè`ÄK”ÃK`/œÄKÿèäÈÄKìãdÃKìäÄKèHÄKùÅKê âdÃK äÀÅK2ä ÅK”ÃK2\ÅKÿèäˆÅKåÅKäãdÃKì¤ÅKèHÄKùÅKî¬à äÐÅKdÃKæXlKìüÅKdÃKä´ââ”ÃK$88ÆKÿä´ìâ ¤ú>/'Òƒoá øzw‚üÐKðq älÆKèƒKðq ¨ÆKâÿèäÔÆKìáḃK¼âDåðÆK蜄Kì ÇKèø(ÇKì â8ÇKæ âHÇKæâ xÇK´àxÐKèŒÐKä @ápìÐKæ´àäHÇKä˜ÇK ãá"ôÈK`/<ÈK¨ÇKxÇK`/äÇKÿèäÈKìãHÇKø,ÈKì âHÇKèDÈKxÇK`/€ÈKÿèä¬ÈKìãHÇKìÈÈKè,ÈKøäÈKê âHÇK ä¤ÉK2äÉKxÇK2@ÉKÿèälÉKääÈKäãHÇKìˆÉKè,ÈKøäÈKê8ÊK°@ä´ÉKxÇK°@ðÉKâÿèäÊKìááHÇKÌâƒñ,ÈKìËKø„äHÊKxÇKø„„ÊKâÿèä°ÊKìááHÇKÈâ‚åÌÊKè,ÈKìèÊKèøèsKìÐËK 'äËKxÇK 'PËKâÿèä|ËKìááHÇKÄâå˜ËKè,ÈKì´ËKèÔ¡KøÄ¡KìœÌKø^äàËKxÇKø^ÌKâÿèäHÌKìááHÇKÀâ€ådÌKè,ÈKì€ÌKèÔ¡KøÄ¡KìhÍKÈiä¬ÌKxÇKÈièÌKâÿèäÍKìááHÇK¼âå0ÍKè,ÈKìLÍKèøÄ¡KìÎK²å xÍKxÇK²á´ÍKâÿèäàÍKìááHÇK¸â~åüÍKè,ÈKøìäÎKì ä(ÎKxÇKì dÎKâÿèäÎKìááHÇK´â}å¬ÎKè,ÈKìÈÎKèø êIì°ÏKC äôÎKxÇKC 0ÏKâÿèä\ÏKìááHÇK°â|åxÏKè,ÈKì”ÏKèøêIì`ÐKä`äÀÏKxÇKä`üÏKâÿèä(ÐKìááHÇK¬â{åDÐKè,ÈKøÔ)ð´àäpÐKHÇKæXlKìœÐKHÇKäØââxÇKtoØÐKÿäØì↿3)6{Ò²ÀO˜>`¬ÑKÔhä ÑKèƒKÔhHÑKâÿèätÑKìáḃK¸âCåÑK蜄Kø8ÇKì\ÒKÔ[ä¼ÑKèƒKÔ[øÑKâÿèä$ÒKìáḃK´âBå@ÒK蜄Kø(ÇKì ×KøÔ älÒKèƒKøÔ ¨ÒKâÿèäÔÒKìáḃK°âAåðÒK蜄Kø ÓKì âÓKæ â,ÓKæâ \ÓK<ˆÖKèœÖKä @ápüÖKæ<ä,ÓKä|ÓKãá"ØÔK`/ ÔKŒÓK\ÓK`/ÈÓKÿèäôÓKìã,ÓKøÔKì â,ÓKè(ÔK\ÓK`/dÔKÿèäÔKìã,ÓKì¬ÔKèÔKøÈÔKê â,ÓK äˆÕK2äèÔK\ÓK2$ÕKÿèäPÕKäÈÔKäã,ÓKìlÕKèÔKøÈÔKêpÖK(^ä˜ÕK\ÓK(^ÔÕKâÿèåÖKìáá,ÓKâåÖKèÔKì8ÖKèìTÖKèøpÿð<ä€ÖK,ÓKæHDJì¬ÖK,ÓKä(ââ\ÓK¤úèÖKÿä(ìâ¿3)6{Ò²ÀO˜>` çK¬ ä×KèƒK¬ X×Kâÿèä„×KìáḃK¬â@å ×K蜄Kø¼×Kì âÌ×Kæ âÜ×Kæâ ØKuçKè0çKä @ápçKæuäÜ×Kä,ØKãá"ˆÙK`/ÐØK<ØK ØK`/xØKÿè䤨KìãÜ×KøÀØKì âÜ×KèØØK ØK`/ÙKÿèä@ÙKìãÜ×Kì\ÙKèÀØKøxÙKê âÜ×K ä8ÚK2ä˜ÙK ØK2ÔÙKÿèåÚKäxÙKäãÜ×KìÚKèÀØKøxÙKê¤åKxøäHÚK ØKxø„ÚKâÿèä°ÚKìááÜ×K´âŠåÌÚKèÀØKøèÚKì âøÚKæ âÛKæâ 8ÛK„[ åKè4åKä @áp”åKæ„[äÛKäXÛK ãá"´ÜK`/üÛKhÛK8ÛK`/¤ÛKÿèäÐÛKìãÛKøìÛKì âÛKèÜK8ÛK`/@ÜKÿèälÜKìãÛKìˆÜKèìÛKø¤ÜKê âÛK ädÝK2äÄÜK8ÛK2áÝKÿèä,ÝKä¤ÜKäãÛKìHÝKèìÛKø¤ÜKêÞK « ätÝK8ÛK « °ÝKâÿèäÜÝKìááÛK@âoåøÝKèìÛKø<§Iì¨ÞK8qä$ÞK8ÛK8q`ÞKâÿèäŒÞKìááÛK<ânñìÛKìXßKàÊä¸ÞK8ÛKàÊôÞKâÿèä ßKìááÛK8âmå<ßKèìÛKø sKì@àKèí ähßK8ÛKèí ¤ßKâÿèäÐßKìááÛK4âlåìßKèìÛKìàKèì$àKèø sKì(áKlsäPàK8ÛKlsŒàKâÿèä¸àKìááÛK0âkåÔàKèìÛKìðàKèì áKèø sKìØáKè­ä8áK8ÛKè­táKâÿèä áKìááÛK,âjå¼áKèìÛKø¤-ì¤âK¨]äèáK8ÛK¨]$âKâÿèäPâKìááÛK(âiålâKèìÛKìˆâKÿä sKìpãK°ä´âK8ÛK°ðâKâÿèäãKìááÛK$âhå8ãKèìÛKìTãKèø sKì<äKtàä€ãK8ÛKtà¼ãKâÿèäèãKìááÛK âgåäKèìÛKì äKèHlKø sKìåKÜäLäK8ÛK܈äKâÿèä´äKìááÛKâfåÐäKèìÛKììäKèø sKð„[äåKÛKæHDJìDåKÛKäLââ8ÛKá 0€åKÿäLì⃿3)6{Ò²ÀO˜>`TæK´ ä´åK ØK´ ðåKâÿèäæKìááÜ×K°â‰å8æKèÀØKøèÚKìçKÄ5 ädæK ØKÄ5  æKâÿèäÌæKìááÜ×K¬âˆåèæKèÀØKøÔ)ðuäçKÜ×KæXlKì@çKÜ×KäÀââ ØKÌ«á |çKÿäÀìâ‹¿3)6{Ò²ÀO˜>`ãÀƒä°çK¸ƒKæXlKìÜçK¸ƒKä8áâèƒKôsèKÿä8ëâ¿3)6{Ò²ÀO˜>`ìèKt² äLèKˆlKt² ˆèKâÿèä´èKìááXlKXâ+åÐèKè`ëÔ)ì öKØä ìòK(öK¼äöK,(KæÔL,ä8öK@öKâ âpöK,è¤Lèâpê,ä@öKäöK ãá`÷K2ä öKpöK2ÜöKÿèä÷Kä÷Käã@öKì â@öK äD÷Kè4÷Kì â@öKð÷Kêˆ÷K(Näp÷Kæ(N8ýäâÌL\ ä˜÷Kâ p÷K\ °÷Käâ âÀ÷KæäÜ÷Kïá°Lèø÷Kê âøKæâ8øK t è€Lèâpê t äøKäXøKãá(ùK2ähøK8øK2¤øKÿèäàøKäÐøKäãøKì âøK ä ùKèüøKì âøKðÐøKêPùK|8ä8ùKæ|88ýäâ LÄ ä`ùKâ 8ùKÄ xùKä â âˆùKæpâ¸ùK®èðLèâpê®äˆùKäØùKãá¨úK2äèùK¸ùK2$úKÿèä`úKäPúKäãˆùKì âˆùK äŒúKè|úKì âˆùKðPúKêüK(…ä¸úKæ(…ÐúKälâ âàúKæâûKázè`üKèâpëzäàúKä0ûKãâüK2ä@ûKûK2|ûKÿèä¸ûKä¨ûKäãàúKì âàúK ääûKèÔûKì âàúKð¨ûKê(üKPdäüKæPdÀ°JäâPüK pä8üKâüK pèâxüK¤g ä`üKâ 8üK¤g ¼RízäˆüKàúKâ¸üKx»ä üKâ¸úKx»èhâþK ÉäÈüKâ  üK ÉàüKä\â âýK°¦è`þKèâpê°¦äàüKä0ýKãâþK2ä@ýKýK2|ýKÿèä¸ýKä¨ýKäãàüKì âàüK ääýKèÔýKì âàüKð¨ýKê(þK8œäþKæ8œèâPþK<[ä8þKâ þK<[ðþäâxþKð3ä`þKâ8þKð3ð°¦äˆþKàüKâ¸þK„: ä þKâ ÈüK„: àüKäPâðLøûäÈþKâ  þKøûàþKä8ââÿK` è8Lèâpê` äàþKä0ÿKããL2ä@ÿKÿK2|ÿKÿèä¸ÿKä¨ÿKäãàþKì âàþK ääÿKèÔÿKì âàþKð¨ÿKê(LäîäLæäîàüKä âØLÀ-ä8Lâ LÀ-PLè â€LX\è¨LèâpêX\äPLä LãápL2ä°L€L2ìLÿèä(LäLäãPLì âPL äTLèDLì âPLðLê˜Lt‡ä€Læt‡À°JäâÀL¤g ä¨Lâ €L¤g ¼RìX\äÐLPLæ` äèLàþKâL$nåLâ ÈþK$nÀ°Jä0â@LdÕä(Lã LdÕ´ ä(âhLH äPLâ (LH ´ ä âL”1äxLâ PL”1À°Jäâ¸L|zä Lâ xL|zPLä âàLX· äÈLâ  LX· À°JäâLÜäðLâÈLÜð®äLˆùKâHL¼Ìä0Lâ`ùK¼ÌèâpL\äXLâ 0L\ðþäâ˜LÌsä€LâXLÌsð t ä¨LøKî8ýìôLHb äÜLâ ˜÷KHb °°JäâLÈTäLâÜLÈTèâDLø¼ä,LâLø¼è âlLLäTLâ,LLèâ”LÌô ä|Lâ TLÌô ¼Rââ¼L Éä¤Lâ|L Éð,äÌL@öKâXLˆääLäˆ Lááÿåä<LïDíðþìøLpähLpLââ LpèÈLèâpêpäpLäÀLãáL2äÐL L2 LÿèäHLä8LäãpLì âpL ätLèdLì âpLð8Lê¸L¸L ä Læ¸L èâàL ÉäÈLâ L ÉðpäðLpLâ˜LákäLåkDLááÿåä`LïDá|Lè¼RÿæLXä¨LäXäLááÿååLïDí8ýðè+ä,L8Læ âHLæ âxLü^ èÈ Lèâpêü^ äHLä˜Lãáh L2ä¨LxL2äLÿèä Lä LäãHLì âHL äL Lè< Lì âHLð Lê L0ëäx Læ0ëè⸠L¬» ä  Lâx L¬» èâà Lø« äÈ Lâ  Lø« ðü^ äð LHLâÐ L,å Lä,áD Lááÿåä` LïDá| LèêIì˜ Lø´ LÿäÔ)ì¨ L|äà Lä| Lááÿåä8 LïDáT Lèìp LøŒ Lÿäðþìô Llä¸ Læl8ýäÿåÌ LPä LäP@ Lÿìä\ Lïáx Lè|uJì” L褮Iì° LèLÝIøèì¤ LèkäÜ Läèk Lÿìä4 LïáP Lè|uJìl L褮Iìˆ LèLÝIøèì|Lh ä´ Läh ð Lÿìä Lïá(Lè|uJìDL褮Iì`LèLÝIøèìŒLÔ,ä XýIØL„] äœLæ„] P âÿåDL´,äèLôLæâ$Lð(éLèâ@êð(åôLäDL ãáL2äTL$L2LÿèäÌLä¼LäãôLì âôL äøLèèLì âôLð¼Lê<Lnä$LændýäâdLØ×äLLâ$LØ×èâŒL÷ ätLâ LL÷ ¼Rââ´LLQäœLâ tLLQ¼Râ âÜLôÄäÄLâ œLôļRââL8wäìLâÄL8wèâ,LtäLâìLtðð(å<LôLâLäåTL`Læ âL¸OèàLèâ@ê¸Oä`Lä°Lãá€L2äÀLL2üLÿèä8Lä(Läã`Lì â`L ädLèTLì â`Lð(Lê¨LÌêäLæÌêèâÐLÄä¸LâLÄèâøLtäàLâ¸Ltð¸OäL`LâXLÌå LäÌá\LÿìäxLïá”Lø°LèìÌLèìèLèìLèì Lè¤*ì<Lèø¤*ìLáLähLtLæ@â¤LœÉè`LèâpêœÉätLäÄLãá”L2äÔL¤L2LÿèäLLä<LäãtLì âtL äxLèhLì âtLð<LêÐLW ä¤LæW ¼Lä<â êäøL¼äàLâ¤L¼è8â LäLâàLè4âHL´½ ä0LâL´½ è0âpLØäXLâ0LØè,â˜L°ä€LâXL°è*âÀLèä¨Lâ€Lèè(âèL@8äÐLâ¨L@8è$âLp|äøLâÐLp|è â8Lì;ä LâøLì;èâ`Läº äHLâ Läº èâˆLØÓäpLâHLØÓèâ°L\*ä˜LâpL\*èâØL¤äÀLâ˜L¤è ãLá-äèLâÀLá-èâ(L@X äLâèL@X èâPLÄä8LâLÄèâxLD¾ä`Lâ8LD¾ðœÉäˆLtLæXkä L¬Læ â¼Læ0âìL¼êè´Lèâpê¼êä¼Lä LãáÜL2äLìL2XLÿèä”Lä„Läã¼Lì â¼L äÀLè°Lì â¼Lð„LêL„häìLæ„hè,â,LzäLâ ìLzP äâTLh* ä<Lâ Lh* P ä â|L(=ädLâ<L(=èâ¤Ll8 äŒLâdLl8 èâ|LÌä´Lâ ŒLÌÌLèâüL´PèLLèâpê´PäÌLäLãáìL2ä,LüL2hLÿèä¤Lä”LäãÌLì âÌL äÐLèÀLì âÌLð”LêLPïäüLæPïèâ<L€ ä$LâüL€ èâdL(ÈäLLâ$L(Èð´PätLÌLæ¼êäŒL¼Lâä1LŒW ä¤LäŒW àLäÿåäüLïáLè ¦Iì4LèêPLèìlLøˆLÿä¤Lì â´Læâ äL`$ `1Lèt1Lä @ápÔ1Læ`$ ä´LäL ãá"`L`/¨LLäL`/PLÿèä|Lìã´Lø˜Lì â´Lè°LäL`/ìLÿèäLìã´Lì4Lè˜LøPLê â´L ä L2äpLäL2¬LÿèäØLäPLäã´LìôLè˜LøPLêÜ Lä LäL\ Lâÿèäˆ Lìáá´L(âå¤ Lè˜LìÀ Lè ö ¦Iìà!LÆäì LäLÆ(!LâÿèäT!Lìáá´L$âåp!Lè˜LìŒ!Lø¨!LøÄ!Lè¤#Kø(Kì$&L o äð!LäL o ,"LâÿèäX"Lìáá´L âåt"Lè˜Lì"Lèèø¬"Lì â¼"LæTâì"Lp£ èô%Lèâpêp£ ä¼"Lä #LãáÜ#L2ä#Lì"L2X#Lÿèä”#Lä„#Läã¼"Lì â¼"L äÀ#Lè°#Lì â¼"Lð„#Lê$Lœz äì#Læœz èPâ,$L`ä$Lâ ì#L` ¦IäLâT$L¤Çä<$Lâ $L¤ÇP ä<â|$L(é äd$Lâ <$L(é ˆGKä0â¤$LôAäŒ$Lâd$LôAè,âÌ$LøZä´$LâŒ$LøZè(âô$LðÙäÜ$Lâ´$LðÙè$â%Lضä%LâÜ$Lضè âD%Lä"ä,%Lâ %Lä"äâl%Lhâ äT%Lâ,%Lhâ èâ”%LÀëä|%LâT%LÀëèâ¼%L8ä¤%Lâ |%L8,(Käâä%LxÙåÌ%Lâ¤%LxÙáäâ &L Éäô%LâÌ%L Éðp£ ä&L¼"Lâð&LxGä4&LäLxGp&Lâÿèäœ&Lìáá´Lâå¸&Lè˜LìÔ&Lÿäêô'LxÆå'LäLxÆ<'Lâÿèäh'Lìáá´Lâå„'Lè˜Lì 'Lø¼'LøØ'Lÿäê¤(LxFä(LäLxF@(Lâÿèäl(Lìáá´Lãåˆ(Lè˜LÿèT)Løä´(LäLøð(Lâÿèä)Lìáá´Lâÿå8)Lè˜Lø¤-ìH1L ôäd)LäL ô )LâÿèäÌ)Lìáá´L âþåè)Lè˜Lì*Lÿä *Lì â0*Læâ `*L`Œ Ä0LèØ0Lä @áp81Læ`Œ ä0*Lä€*L ãá"Ü+L`/$+L*L`*L`/Ì*Lÿèäø*Lìã0*Lø+Lì â0*Lè,+L`*L`/h+Lÿèä”+Lìã0*Lì°+Lè+LøÌ+Lê â0*L äŒ,L2äì+L`*L2(,LÿèäT,LäÌ+Läã0*Lìp,Lè+LøÌ+Lê-LŒ äœ,L`*LŒ Ø,Lâÿèä-Lìáá0*L âýå -Lè+Lì<-Lèì‰IìX-Lèèìt-LèÔ)øèì@.Løä -L`*LøÜ-Lâÿèä.Lìáá0*Lâüå$.Lè+Lø¤-ìð.LØ&äP.L`*LØ&Œ.Lâÿèä¸.Lìáá0*LâûåÔ.Lè+Lÿè„/L|å/L`*L|L ãáÜ>L2ä>Lì=L2X>Lÿèä”>Lä„>Läã¼=Lì â¼=L äÀ>Lè°>Lì â¼=Lð„>Lê?L„® äì>Lä„® 8ýäâ,?Lô ä?Lâì>Lô èâT?L Gä/'Òƒoáøzw‚ã¸fLÈ[LâˆhL äÐfLØfLââgL èXhLèâpê äØfLä(gLãáøgL2ä8gLgL2tgLÿèä°gLä gLäãØfLì âØfL äÜgLèÌgLì âØfLð gLê hLPdähLæPdÀ°JäâHhL`tä0hLâhL`tèâphL¤g äXhLâ 0hL¤g ¼Rì ä€hLØfLâ hLHMä˜hL„bJâxiL$_ ä°hLä$_ ìhLááÿåäiLïDá$iLè¼Rê@iLè¼Rê\iLÿä¼Rê4jLè äˆiLäè ÄiLááÿåäàiLïDáüiLè8ýìjLèèøèðÌäDjLâ ¤jLÌ\jLèætjLä¸0 ä ŒjL¬i\jLê DjL`6\jLê ¼jLLŠ\jLê ÔjL\jLê ìjL\jLê kLLÓ\jLê kL< \jL\jL è lL°NäDkLä°N€kLÿìäœkLïá¸kLè|uJìÔkL褮IìðkLèLÝIøèìtxLÌ_ älLäÌ_ XlLÿìätlLïáXxLèlLì â lLæâ ÐlL@òÔwLèèwLä @ápHxLæ@òä lLäðlLãá LnL`/”mLámLÐlL`/Mèâpêt' äl;Mä¼;MãáŒM¸ÒäœMèâpêŠäÄMä?äô=Mæä?°°Jäâ4>M,—ä>Mâô=M,—èâ\>M¤g äD>Mâ >M¤g ¼RìŠäl>MÄMÔÿ ä„>MâœMÄ·ä¬>Mâ „>MÄ·À°Jäâì>MP äÔ>Mâ ¬>MP ¼Räâ?Mœx äü>Mâ Ô>Mœx ¼Rìt' ä$?Ml;MâD?MøåèL‡Mèâ`êü>äô…MäD†Mãá‡M2äT†M$†M2†Mÿèä̆M伆Mäãô…Mì âô…M äø†Mèè†Mì âô…Mð¼†Mê<‡Mè~å$‡Mæè~éâìˆMì`åL‡Mâ$‡Mì`ád‡Mè┇MäD輈MèâpêäDäd‡Mä´‡MãᄈM2äćM”‡M2áˆMÿèä<ˆMä,ˆMäãd‡Mì âd‡M ähˆMèXˆMì âd‡Mð,ˆM꬈MxH䔈MæxHèâÔˆMäQ 伈M┈MäQ ðäDääˆMd‡Mæü>äüˆMô…Mâ,‰M$på‰MâÈ…M$pñHä<‰M˜„Mâ`‹M41äT‰M`‰Mæâ‰MX è0‹MèâpêX ä`‰Mä°‰MãညM2äÀ‰M‰M2ü‰Mÿèä8ŠMä(ŠMäã`‰Mì â`‰M ädŠMèTŠMì â`‰Mð(ŠMꨊMì.äŠMæì.èâЊMÀ ä¸ŠMâŠMÀ èâøŠMèä äàŠM⸊Mèä èâ ‹Mœ/ä‹MâàŠMœ/èâH‹MD ä0‹Mâ‹MD ðX äX‹M`‰Mâã0\ ä ˆô;dŒM„R䀋Mä„R¼‹Mÿì䨋Mïáô‹Mè´øIìŒMø,ŒMèÔ)ìHŒMÿä¤*ì|ÖMáé dÖMèî |ÖMáé œ×M(G|ÖMáíôç|ÖMáçHØMà&äÄ×Mäà&áØMÿìäØMïí8ØMì âÆLæøÝMTèÝMXØMdØMæâ ”ØMTdÝMèxÝMä @ápØÝMæTädØMä´ØMãáÚM`/XÙMÄØM”ØM`/áÙMÿèä,ÙMìãdØMøHÙMì âdØMè`ÙM”ØM`/œÙMÿèäÈÙMìãdØMìäÙMèHÙMùÚMê âdØM äÀÚM2ä ÚM”ØM2\ÚMÿèäˆÚMåÚMäãdØMì¤ÚMèHÙMùÚMêLÝMðÕ äÐÚM”ØMðÕ ÛMâÿèä8ÛMìáádØM â)åTÛMèHÙMìpÛMÿäŒÛMì âœÛMæ âÌÛMÌèÝMèâpêÌäœÛMäìÛMãá¼ÜM2äüÛMÌÛM28ÜMÿèätÜMädÜMäãœÛMì âœÛM ä ÜMèÜMì âœÛMðdÜMêäÜMÈÈäÌÜMæÈÈèâ ÝMt§ äôÜMâ ÌÜMt§ ¦Iäâ4ÝMí äÝMâ ôÜMí ì‰IêÌäDÝMœÛMæTä\ÝMdØMæ$ìˆÝMdØMäââ”ØM¸ñ ÄÝMÿäìâ æÀåFãðÝMdØMâ$áMø3äÞMÞMæ âDÞM(_èlßMèâpê(_äÞMädÞMãá4ßM2ätÞMDÞM2°ÞMÿèäìÞMäÜÞMäãÞMì âÞM äßMèßMì âÞMðÜÞMê\ßM°¹äDßMæ°¹èâ áMxälßMâ DßMx„ßMèâ´ßMPQ èÜàMèâpêPQ ä„ßMäÔßMãá¤àM2ääßM´ßM2 àMÿèä\àMäLàMäã„ßMì â„ßM äˆàMèxàMì â„ßMðLàMêÌàM4¼ä´àMæ4¼èâôàMô äÜàMâ ´àMô t€LìPQ äáM„ßMæ(_äáMÞMââMÔ3ä4áMäÔ3páMááÿåäŒáMïDá¨áMèdýìÄáMøàáMè¼RêüáMè¼RÿêôSä(âM4âMæâdâMlr èŒãMèâpêlr ä4âMä„âMãáTãM2ä”âMdâM2ÐâMÿèä ãMäüâMäã4âMì â4âM ä8ãMè(ãMì â4âMðüâMê|ãM¨ÄådãMæ¨Äáåx NâP NØ>é⸠N xä  Nâx N xèâà NäÈ Nâ   N¼Rìؘ äð NDNâì N@uä Nä@uD Nááÿåä` NïDí| Nì ⌠Næâ¼ NœÍè¼ Nèâ@êœÍäŒ NäÜ NãᬠN2äì N¼ N2( Nÿèäd NäT Nä㌠Nì ⌠N ä Nè€ Nì ⌠NðT NêÔ NÁä¼ NæÁðœÍää NŒ Nâp NLäü NäL8 NááÿåäT NïDíÐîLìØNá5ä€ Nˆ Nâ⸠Ná5è¨NèâPë5äˆ NäØ N ãᨠN2äè N¸ N2$ Nÿèä` NäP Nä㈠Nì ∠N äŒ Nè| Nì ∠NðP NêÐ N´Ÿä¸ Næ´Ÿèâø NØ{åà N⸠NØ{é â N ÐäNâà N Ðè âHNHÑ ä0NâNHÑ èâpNìäXNâ0Nìèâ˜NlÉ ä€NâXNlÉ èâÀN$ü ä¨Nâ€N$ü ñ5äÐNˆ NæøtäèNÈÑJæüN åNNæâ@NlŒèÌNèâpêlŒäNä`Nãá0N2äpN@N2¬NÿèäèNäØNäãNì âN äNèNì âNðØNê¼N¨cä@Næ¨cXNäâ âhNæä„Nïá NÿäÔ)ìäNȘ äÌNâ @NȘ ìlŒäôNNâ¸N`Uä Nä`UHNááÿåädNïDá€Nè8DJìœNÿä¤-ìðN )äÈNä )Nÿìä NïáÔNè<Nì âLNæâ |N¸~PNèdNä @ápÄNæ¸~äLNäœNãá"øN`/@N¬N|N`/èNÿèäNìãLNø0Nì âLNèHN|N`/„Nÿèä°NìãLNìÌNè0NøèNê âLN ä¨N2äN|N2DNÿèäpNäèNäãLNìŒNè0NøèNêXNÌqä¸N|NÌqôNâÿèä NìááLN4âTå<Nè0Nø(ìJììNlÚ ähN|NlÚ ¤NâÿèäÐNìááLN0âSñ0NìœNxkäüN|Nxk8NâÿèädNìááLN,âRå€Nè0Nø<§Iì0N`¹ä¬N|N`¹èNâÿèäNìááLN(âQñ0NìüNÈ] ä@N|NÈ] |Nâÿèä¨NìááLN$âPåÄNè0NìàNÿä(ìJì¬N@—ä N|N@—HNâÿèätNìááLN âOåNè0NøÔ)ì\N˜‘ä¼N|N˜‘øNâÿèä$NìááLNâNå@Nè0Nøê NÌ:älN|NÌ:¨NâÿèäÔNìááLNâMåðNè0Nø˜KìØN -äN|N -XNâÿèä„NìááLNâLå Nè0Nì¼Nè\èJø êˆNTýäèN|NTý$NâÿèäPNìááLNâKålNè0Nøèì8N¬ ä˜N|N¬ ÔNâÿèåNìááLN âJåNè0Nÿì¸~äHNLNæ$ìtNLNä@ââ|Nt…°Nÿä@ìâåÀåFë˜Kì 3Nä æNää á<NÿìäXNïá3NètNì â„Næâ ´NH¢€2Nè”2Nä @ápô2NæH¢ä„NäÔN ãá"0N`/xNäN´N`/ NÿèäLNìã„NøhNì â„Nè€N´N`/¼NÿèäèNìã„NìNèhNø Nê â„N äàN2ä@N´N2|Nÿèä¨Nä Näã„NìÄNèhNø Nêt Nœ! äðN´Nœ! , NâÿèäX Nìáá„N â2ñhNì$!Ná ä „ N´Ná À Nâÿèäì Nìáá„Nâ1å!NèhNÿè¸!Nä4!N´Np!Nâÿèäœ!Nìáá„Nâ0ñhNìì0ND äÈ!N´ND "Nâÿèä0"Nìáá„Nâ/åL"NèhNøh"Nì âx"Næ âˆ"Næâ ¸"N%l,Nè|0Nä @ápÜ0Næ%äˆ"NäØ"Nãá"4$N`/|#Nè"N¸"N`/$#NÿèäP#Nìãˆ"Nøl#Nì âˆ"Nè„#N¸"N`/À#Nÿèäì#Nìãˆ"Nì$Nèl#Nø$$Nê âˆ"N ää$N2äD$N¸"N2€$Nÿèä¬$Nä$$Näãˆ"NìÈ$Nèl#Nø$$Nê”%Ni äô$N¸"Ni 0%Nâÿèä\%Nìááˆ"Nâ,åx%Nèl#NÿèT,NDx ä¤%N¸"NDx à%Nâÿèä &Nìááˆ"Nâ+å(&Nèl#NìD&Nÿä`&Nì âp&Næ â€&Næâ °&N`iÐ+Nèä+Nä @ápD,Næ`iä€&NäÐ&Nãá",(N`/t'Nà&N°&N`/'NÿèäH'Nìã€&Nød'Nì â€&Nè|'N°&N`/¸'Nÿèää'Nìã€&Ní(Nèd'Nø(Nê â€&N äÜ(N2ä<(N°&N2x(Nÿèä¤(Nä(Näã€&NìÀ(Nèd'Nø(NêŒ)N|§äì(N°&N|§()NâÿèäT)Nìáá€&Nâ0åp)Nèd'Nø`&Nì *Nƒäœ)N°&NƒØ)Nâÿèä*Nìáá€&Nâ/ñd'NìÐ*NÄä0*N°&NÄl*Nâÿèä˜*Nìáá€&Nâ.å´*Nèd'Nÿè¸+N qäà*N°&N q+NâÿèäH+Nìáá€&N â-åd+Nèd'Nì€+Nøœ+Nè<§Iøèð`iäÈ+N€&Næ$ìô+N€&Nä$ââ°&N¬ 0,Nÿä$ìãåÀåFã%äd,Nˆ"Næ€,Nìâ °,NtGø/Nè 0Nä @ápl0NætGä€,NäÐ,Nãá",.N`/t-Nà,N°,N`/-NÿèäH-Nìã€,Nød-Nì â€,Nè|-N°,N`/¸-Nÿèää-Nìã€,Ní.Nèd-Nø.Nê â€,N äÜ.N2ä<.N°,N2x.Nÿèä¤.Nä.Näã€,NìÀ.Nèd-Nø.Nêà/N\ïäì.N°,N\ï(/NâÿèäT/Nìáá€,N â*åp/Nèd-NìŒ/Nè(ìJì¨/NèìÄ/Nèèø˜KðtGäð/N€,Næ$ì0N€,Näââ°,NXfX0NÿäìâåÀåFŒ0Nˆ"Nä ââ¸"NÔ^ È0Nÿä ìâåÀåFÔ1N”  äü0N´N”  81Nâÿèäd1Nìáá„Nâ.å€1NèhNìœ1Nø¸1Nÿä˜Kìh2N̶ ää1N´N̶ 2NâÿèäL2Nìáá„N â-ñhNðH¢äx2N„Næ$ì¤2N„Nä,ââ´NÔà2Nÿä,ìâåÀåFëh"Nìø3Nô(ä03Näô(l3Nÿìäˆ3Nïá¤3Nè|uJìÀ3N褮IìÜ3NèLÝIøèì8NØ(ä4N4Næ â$4Næâ T4N8K €7Nè”7Nä @ápô7Næ8K ä$4Nät4Nãá"Ð5N`/5N„4NT4N`/À4Nÿèäì4Nìã$4Nø5Nì â$4Nè 5NT4N`/\5Nÿèäˆ5Nìã$4Nì¤5Nè5NøÀ5Nê â$4N ä€6N2äà5NT4N26NÿèäH6NäÀ5Näã$4Nìd6Nè5NøÀ5Nêh7NŒ­ä6NT4NŒ­Ì6Nâÿèäø6Nìáá$4N â&å7Nè5Nì07NøL7Nè8ýøì‰Ið8K äx7N$4Næ$ì¤7N$4NäââT4N¨D à7NÿäìâæÀåF08N”(ä8N 8Næ âØfLæ\:N  å@8NL8Næ â\8NæâŒ8NP.é,:Nèâ@êP.å\8Nä¬8Nãá|9N2ä¼8NŒ8N2ø8Nÿèä49Nä$9Näã\8Nì â\8N ä`9NèP9Nì â\8Nð$9Nê¤9N÷ äŒ9Næ÷ ¼RââÌ9NLQä´9Nâ Œ9NLQ¼Râ âô9NôÄäÜ9Nâ ´9NôļRââ:N8wä:NâÜ9N8wèâD:Ntä,:Nâ:NtðP.åT:N\8Nâø@Nd5äl:Nx:Næ âˆ:Næ”â¸:NÀ èÈ@Nèâ@êÀ äˆ:NäØ:N ãá¨;N2äè:N¸:N2$;Nÿèä`;NäP;Näãˆ:Nì âˆ:N äŒ;Nè|;Nì âˆ:NðP;Nê|=N@Ôä¸;Næ@ÔÐ;Nä|âãN2ä>NÔ=N2@>Nÿèä|>Näl>Näã¤=Nì â¤=N ä¨>Nè˜>Nì â¤=Nðl>Në?Nœz äÔ>Næœz ì>Nè êä(?NDj ä?NÔ>NDj èâP?Nä¦å8?Nâ?Nä¦íx?N¬¦ ä`?N8?N¬¦ èæôäˆ?Nâ`?NôìÜ?Nsä°?Nâ Œ=NsÈ?Nä$â @ê@ä@Nð¡ äì?Nâ °?Nð¡ @Näâ êä@@N$à ä(@Nâì?N$à èâh@N¤äP@Nâ(@N¤è â@N6äx@NâP@N6èâ¸@N´;ä @Nâx@N´;èâà@NÜäÈ@Nâ @NÜðÀ äð@Nˆ:NâxCNÄd äANANæ0âDANhãèHCNèâ@êhãäANädAN ãá4BN2ätANDAN2°ANÿèäìANäÜANäãANì âAN äBNèBNì âANðÜANê\BNhIäDBNæhIè.â„BNÜÿ älBNâDBNÜÿ è,â¬BN0Þä”BNâlBN0Þè(âèBN˜Åä¼BNâ ”BN˜ÅÔBNäâ ê äCN<ÓäøBNâ¼BN<Óèâ8CN@J ä CNâøBN@J èâ`CN,äHCNâ CN,ðhãäpCNANâüCNLUäˆCNäLUÄCNááÿåäàCNä¼RçDí¼RêDNH5ä DNäýMæ€DN` å(DNä` ádDNááÿåì¼RçDáO`/t=OàOèd=Oø>Oê â€O2ä<>O°Oÿèä¤>Oä>Oäã€Oèd=Oø>OêÜDO¼¦äì>O°å¼}OètzOìØ}Oøô}Oèðþì~Oø,~OèðþìH~Oød~OÿôhOlÿ ä~OÀyOlÿ Ì~Oâÿèäø~OìááyO â=åOètzOì0OèðþìLOèèÿíñåxOyOæ$ì¤OyOä ââÀyOœÞàOÿä ìâ¶€ò:?ËЉÀO¶¿Ä €Oè ê<€Oè ãIìX€Oèèìt€Oèðþì€Oÿô„OÌ1ä¼€OäÌ1ø€OÿìäOïá0Oè|uJìLO褮IìhOèLÝIøèì$‚OñœƒOìOÌq䄌Oè‚OÌqÀŒOâÿèäìŒOìáḂO4â=ñœƒOì¸OÈ äOè‚OÈ TOâÿèä€OìáḂO0â<åœO蜃OøèxMìôŽOˆ_äÈOè‚Oˆ_ŽOâÿèä0ŽOìáḂO,â;åLŽO蜃OìhŽOø„ŽOè,ÒLì ŽOètN켎OøØŽOèdýøœÉLêÐOä™ äOè‚Oä™ @OâÿèälOìáḂO(â:åˆO蜃Oì¤OÿäÀOì â@ÚJæ¸OÈpäàOè‚OÈpOâÿèäHOìáḂO$â9ådO蜃Oì€Oè@ÚJìœOÿô ‘O”  äÈOè‚O”  ‘Oâÿèä0‘OìáḂO â8åL‘O蜃Oìh‘Oø„‘Oÿä˜Kìl’Oèq ä°‘Oè‚Oèq ì‘Oâÿèä’OìáḂOâ7å4’O蜃OìP’Oÿä\èJì“Oß ä|’Oè‚Oß ¸’Oâÿèää’OìáḂOâ6æ“O蜃Oÿèè“Ol¶ä,“Oè‚Ol¶h“Oâÿè䔓OìáḂOâ5å°“O蜃OìÌ“OèöꨔO°äø“Oè‚O°4”Oâÿèä`”OìáḂOâ4å|”O蜃Oø˜”Oì âtNæX•OLå ¸”Oè‚OLáô”Oâÿèä •OìáḂO â3å<•O蜃OøtNðP› äh•O¸‚Oæ$씕O¸‚Oähââè‚OØ{ ЕOÿähìâåÀåF–OÿäÔ)츜OÈ;¨œO<–OH–Oæâ x–OÈ;$œOè8œOä @áp˜œOæÈ;äH–O䘖Oãá"ô—O`/<—O¨–Ox–O`/ä–Oÿèä—OìãH–Oø,—Oì âH–OèD—Ox–O`/€—Oÿè䬗OìãH–OìÈ—Oè,—Oøä—Oê âH–O 䤘O2ä˜Ox–O2@˜Oÿèäl˜Oää—OäãH–O수Oè,—Oøä—OꌙOlî ä´˜Ox–Olî ð˜Oâÿèä™OìááH–Oâ»å8™Oè,—OìT™Oè@ÚJìp™Oÿô<šOà(䜙Ox–Oà(Ø™OâÿèäšOìááH–Oâºå šOè,—Oø\ÝJììšO¬” äLšOx–O¬” ˆšOâÿèä´šOìááH–Oâ¹åКOè,—Oÿè œOŒÉ äüšOx–OŒÉ 8›Oâÿèäd›OìááH–O â¸å€›Oè,—O윛Oè@ÚJ츛Oè¤#KìÔ›Oøð›OèäJøèðÈ;äœOH–Oæ$ìHœOH–Oä$ââx–O¼Å„œOÿä$ìâåÀåFã°œOH–Oâ O¸åÈœOМOâ@ãO¸éàŸOèâpê¸åМOä OãáðO2ä0Oá O2lOÿèä¨Oä˜OäãМOì âМO äÔOèÄOì âМOð˜OêžOüåžOæü8POä0â@žOÀ ä(žOãžOÀ è,âhžOúäPžOâ(žOúè(âžOá%äxžOâPžOá%è$⸞O¸Ù ä žOâxžO¸Ù è âàžO8OåÈžOâ žO8OéâŸO@|äðžOâ ÈžO@|äâ0ŸO¤b äŸOâ ðžO¤b äâXŸOÔc ä@ŸOâ ŸOÔc ä‟Oœ“ ähŸOâ @ŸOœ“ ä ⨟OŒväŸOâ hŸOŒväâПO°¼ 丟Oâ ŸO°¼ äâøŸOÄäàŸO⸟OÄð¸å OМOã¡O´\ä  O, Oæ â< OæäX Oïát Oè8ýì Oèø÷KꬠOøÈ Oøä Oè8ýøèì¡OŒ\ä¡OLqMæd¢Otf ä,¡Oätf h¡Oááÿåä„¡OïDá ¡Oè8ý켡OøØ¡Oè8ýìô¡Oø¢Oè8ýì,¢OøH¢OèèøŒ Mðp;ät¢OØËMæèO”g ä¢Oä”g Ì¢Oÿìäè¢OïáÜçOè£Oì â£Oæâ D£OtlXçOèlçOä @ápÌçOætlä£Oäd£Oãá"À¤O`/¤Ot£OD£O`/°£OÿèäÜ£Oìã£Oøø£Oì â£Oè¤OD£O`/L¤Oÿèäx¤Oìã£O씤Oèø£Oø°¤Oê â£O äp¥O2äФOD£O2 ¥Oÿèä8¥Oä°¤Oäã£OìT¥Oèø£Oø°¤OꀨOÜ<䀥OD£OÜ<¼¥Oâÿèäè¥Oìáá£O8âbå¦Oèø£Oø ¦Oì â0¦Oæ@â`¦OÜ èP¨OèâpêÜ ä0¦O䀦O ãáP§O2ä¦O`¦O2̦Oÿèä§Oäø¦Oäã0¦Oì â0¦O ä4§Oè$§Oì â0¦Oðø¦Oêx§Oø¥å`§Oæø¥é<â §O(ü䈧Oâ `§O(ü´ ä4âȧO˜ ä°§Oâ ˆ§O˜ ´ ä,âð§O C äاOâ °§O C ´ ä$â¨Oà å¨OâاOà è â@¨O(>å(¨Oã¨O(>áP äâh¨O4KäP¨Oâ (¨O4KP ìÜ äx¨O0¦Oâ0©Oèÿä¨OD£Oèÿ̨Oâÿèäø¨Oìáá£O4âaå©Oèø£Oø êªO€øä@©OD£O€ø|©Oâÿè䨩Oìáá£O0â`åÄ©Oèø£Oìà©OèÈêü©OèÈöÈêȪOì5ä(ªOD£Oì5dªOâÿèäªOìáá£O,â_嬪Oèø£OøfKì\«OØaäتOD£OØa«Oâÿèä@«Oìáá£O(â^ñø£Oì ¬Oäläl«OD£Oäl¨«OâÿèäÔ«Oìáá£O$â]åð«Oèø£OÿèجO¬çä¬OD£O¬çX¬Oâÿè䄬Oìáá£O â\å ¬Oèø£O켬Oÿäèæâà­O´läè¬OD£O´l$­OâÿèäP­Oìáá£Oâ[ål­Oèø£O숭Oø¤­OèèæîÀ­Oèâ âЭOæ æäÈ®Oìbäð­OD£Oìb,®OâÿèäX®Oìáá£OâZåt®Oèø£Oì®Oø¬®OèèæîÔ)èâT±On䨮OD£On¯Oâÿèä@¯Oìáá£OâYå\¯Oèø£Oìx¯Oÿ䔯Oæâ ⤯OæâÔ¯O¸+ è$±Oèâpê¸+ 䤯Oäô¯OãáİO2ä°OÔ¯O2@°Oÿèä|°Oäl°Oä㤯Oì ⤯O 䨰O蘰Oì ⤯Oðl°Oêì°O`ëäÔ°Oä`ëäâ±OHŠäü°OâÔ°OHŠèâ<±O\‡ ä$±Oâü°O\‡ ð¸+ äL±O¤¯OâXæOÜUäd±OD£OÜU ±Oâÿèä̱Oìáá£OâXåè±Oèø£Oì²Oø ²O蔯Oæâ<æOè<²Oæâ âL²Oæâ|²OÄ è æOèâpêÄ äL²O䜲OOãál³O2䬲O|²O2è²Oÿèä$³Oä³OäãL²Oì âL²O äP³Oè@³Oì âL²Oð³OꔳOØoä|³OäØohëIè¼³OpÆä¤³O|³OpÆ<²Oäâä³O<å ̳O¤³O<áðCJäâ ´OŒdäô³O̳OŒd(DJäâ4´Otä´Oô³Ot<§Iäâ\´O¨äD´O´O¨Ô)äâ„´Oì…äl´OD´Oì… ¾ä⬴O ä”´Ol´O LJäâÔ´O€¤ ä¼´O”´O€¤ ¤-äâü´Oœdå ä´O¼´Oœdá BJäâ$µO¼íä µOä´O¼ípÿäâLµOX ä4µO µOX  ¾äâtµOä\µO4µOüµä✵Oä'å „µO\µOä'á¤*äâĵOà@䬵O„µOà@¬¨äâìµOl äÔµO¬µOl èäâ¶O äüµOÔµO ¤-äâ<¶O8Ìä$¶OüµO8ÌX+-äâd¶Ot] äL¶O$¶Ot] pÿä⌶O$ž ät¶OL¶O$ž ðþäâ´¶O|¯ 䜶Ot¶O|¯ ¼Räâd¸O$FäĶOœ¶O$FܶOäââ ·OŒ®è4¸OèâpꌮäܶOä,·Oãáü·O2ä<·O ·O2x·Oÿèä´·O䤷OäãܶOì âܶO äà·OèзOì âܶOð¤·Oê$¸O¸Wä ¸Oæ¸W<²OäâL¸Odä4¸Oâ ¸OdðŒ®ä\¸OܶOâºO\ät¸OĶO\Œ¸Oäâ⼸OÌH èä¹OèâpêÌH 䌸OäܸOãᬹO2äì¸O¼¸O2(¹Oÿèäd¹OäT¹Oä㌸Oì ⌸O ä¹O耹Oì ⌸OðT¹OêÔ¹O¸Wä¼¹Oæ¸WÔ)äâü¹Odää¹Oâ¼¹OdðÌH ä ºOŒ¸OâÄ»Oçä$ºOt¸Oç<ºOäââlºO0 è”»Oèâpê0 ä<ºO䌺Oãá\»O2䜺OlºO2غOÿèä»Oä»Oäã<ºOì â<ºO ä@»Oè0»Oì â<ºOð»Oê„»O¸Wäl»Oæ¸W´Uä⬻Odä”»Oâl»Odð0 ä¼»O<ºOâ ¿OÜtäÔ»O$ºOÜtì»Oäââ¼OدèܾOèâpêدäì»Oä<¼Oãá ½O2äL¼O¼O2ˆ¼OÿèäļOä´¼Oäãì»Oì âì»O äð¼Oèà¼Oì âì»Oð´¼Oê̾O¸Wä½Oæ¸W4½Oäâ âD½Oæât½O È蜾Oèâpê ÈäD½O䔽Oãád¾O2䤽Ot½O2à½Oÿèä¾Oä ¾OäãD½Oì âD½O äH¾Oè8¾Oì âD½Oð ¾OꌾOÜoät¾OæÜoðþäâ´¾O É䜾Oât¾O Éð ÈäľOD½Oâô¾OdäܾOâ½Odðدä¿Oì»Oâ¼ÀOX™ä¿OÔ»OX™4¿Oäââd¿OÀ; èŒÀOèâpêÀ; ä4¿Oä„¿OãáTÀO2䔿Od¿O2пOÿèä ÀOäü¿Oäã4¿Oì â4¿O ä8ÀOè(ÀOì â4¿Oðü¿Oê|ÀO¸WädÀOæ¸WÔ)äâ¤ÀOdäŒÀOâdÀOdðÀ; ä´ÀO4¿Oâ,ÄOè+å ÌÀO¿Oè+áäÀOäââÁOÌsèüÃOèâpêÌsääÀOä4ÁOãáÂO2äDÁOÁO2€ÁOÿèä¼ÁOä¬ÁOäãäÀOì âäÀO äèÁOèØÁOì âäÀOð¬ÁOêìÃO¸WäÂOæ¸W,ÂOäâ â<ÂOæ âlÂO4 è¼ÃOèâpê4 ä<ÂOäŒÂOãá\ÃO2äœÂOlÂO2ØÂOÿèäÃOäÃOäã<ÂOì â<ÂO ä@ÃOè0ÃOì â<ÂOðÃOê„ÃOdóälÃOædóðþäâ¬ÃO°Nä”ÃOâlÃO°NèâÔÃO Éä¼ÃOâ”ÃO Éð4 ääÃO<ÂOâÄOdäüÃOâÂOdðÌsä$ÄOäÀOâÜÅOÜ ä<ÄOÌÀOÜ TÄOäââ„ÄOläè¬ÅOèâpêlääTÄOä¤ÄOãátÅO2ä´ÄO„ÄO2ðÄOÿèä,ÅOäÅOäãTÄOì âTÄO äXÅOèHÅOì âTÄOðÅOêœÅO¸Wä„ÅOæ¸Wì‰IäâÄÅOdä¬ÅOâ„ÅOdðlääÔÅOTÄOâŒÇOO äìÅO<ÄOO ÆOäââ4ÆO„eè\ÇOèâpê„eäÆOäTÆOãá$ÇO2ädÆO4ÆO2 ÆOÿèäÜÆOäÌÆOäãÆOì âÆO äÇOèøÆOì âÆOðÌÆOêLÇO¸Wä4ÇOæ¸WÈäâtÇOdä\ÇOâ4ÇOdð„eä„ÇOÆOâ<ÉOàäœÇOìÅOà´ÇOäââäÇO´ è ÉOèâpê´ ä´ÇOäÈOãáÔÈO2äÈOäÇO2PÈOÿèäŒÈOä|ÈOäã´ÇOì â´ÇO ä¸ÈOè¨ÈOì â´ÇOð|ÈOêüÈO¸WääÈOæ¸W ¾äâ$ÉOdä ÉOâäÈOdð´ ä4ÉO´ÇOâdÉOPa äLÉOœÇOPa (¤NäâËO<žätÉOLÉO<žŒÉOäââ¼ÉOðúèäÊOèâpêðúäŒÉOäÜÉOãá¬ÊO2äìÉO¼ÉO2(ÊOÿèädÊOäTÊOäãŒÉOì âŒÉO äÊOè€ÊOì âŒÉOðTÊOêÔÊO¸Wä¼ÊOæ¸W¤-äâüÊOdääÊOâ¼ÊOdððúä ËOŒÉOâÄÌOàDä$ËOtÉOàD<ËOäââlËO,ˆè”ÌOèâpê,ˆä<ËOäŒËOãá\ÌO2äœËOlËO2ØËOÿèäÌOäÌOäã<ËOì â<ËO ä@ÌOè0ÌOì â<ËOðÌOê„ÌO¸WälÌOæ¸Wpÿäâ¬ÌOdä”ÌOâlÌOdð,ˆä¼ÌO<ËOâtÎO,ÅäÔÌO$ËO,ÅìÌOäââÍOœ1èDÎOèâpêœ1äìÌOä<ÍOãá ÎO2äLÍOÍO2ˆÍOÿèäÄÍOä´ÍOäãìÌOì âìÌO äðÍOèàÍOì âìÌOð´ÍOê4ÎO¸WäÎOæ¸W ¾äâ\ÎOdäDÎOâÎOdðœ1älÎOìÌOâ$ÐO¬ ä„ÎOÔÌO¬ œÎOäââÌÎOh® èôÏOèâpêh® äœÎOäìÎOãá¼ÏO2äüÎOÌÎO28ÏOÿèätÏOädÏOäãœÎOì âœÎO ä ÏOèÏOì âœÎOðdÏOêäÏO¸WäÌÏOæ¸Wüµäâ ÐOdäôÏOâÌÏOdðh® äÐOœÎOâÔÑO0¾ ä4ÐO„ÎO0¾ LÐOäââ|ÐO|® è¤ÑOèâpê|® äLÐOäœÐOãálÑO2ä¬ÐO|ÐO2èÐOÿèä$ÑOäÑOäãLÐOì âLÐO äPÑOè@ÑOì âLÐOðÑOê”ÑO¸Wä|ÑOæ¸W¤•Iäâ¼ÑOdä¤ÑOâ|ÑOdð|® äÌÑOLÐOâ”ÓOä%å äÑO4ÐOä%áüÑOäââ,ÒO9èdÓOèâpê9äüÑOäLÒOãáÓO2ä\ÒO,ÒO2˜ÒOÿèäÔÒOäÄÒOäãüÑOì âüÑO åÓOèðÒOì âüÑOðÄÒOêTÓO¸Wä,ÓOæ¸WDÓOäâ â0—Iæ|ÓOdädÓOâ,ÓOdð9äŒÓOüÑOâDÕOH¼ ä¤ÓOäÑOH¼ ¼ÓOäââìÓOT° èÕOèâpêT° ä¼ÓOä ÔOãáÜÔO2äÔOìÓO2XÔOÿèä”ÔOä„ÔOäã¼ÓOì â¼ÓO äÀÔOè°ÔOì â¼ÓOð„ÔOêÕO¸WäìÔOæ¸Wèäâ,ÕOdäÕOâìÔOdðT° ä<ÕO¼ÓOâôÖO¨(å TÕO¤ÓO¨(álÕOäââœÕOP;èÄÖOèâpêP;älÕOä¼ÕOãáŒÖO2äÌÕOœÕO2ÖOÿèäDÖOä4ÖOäãlÕOì âlÕO äpÖOè`ÖOì âlÕOð4ÖOê´ÖO¸WäœÖOæ¸W¤-äâÜÖOdäÄÖOâœÖOdðP;äìÖOlÕOâ¤ØOä½ ä×OTÕOä½ ×OäââL×O® ètØOèâpê® ä×Oäl×Oãá<ØO2ä|×OL×O2¸×Oÿèäô×Oää×Oäã×Oì â×O ä ØOèØOì â×Oðä×OêdØO¸WäLØOæ¸WX+-äâŒØOdätØOâLØOdð® äœØO×OâTÚOœ&å ´ØO×Oœ&áÌØOäââüØO¼9è$ÚOèâpê¼9äÌØOäÙOãáìÙO2ä,ÙOüØO2hÙOÿèä¤ÙOä”ÙOäãÌØOì âÌØO äÐÙOèÀÙOì âÌØOð”ÙOêÚO¸WäüÙOæ¸Wpÿäâ<ÚOdä$ÚOâüÙOdð¼9äLÚOÌØOâÜOX» ädÚO´ØOX» |ÚOäââ¬ÚOD¨ èÔÛOèâpêD¨ ä|ÚOäÌÚOãáœÛO2äÜÚO¬ÚO2ÛOÿèäTÛOäDÛOäã|ÚOì â|ÚO ä€ÛOèpÛOì â|ÚOðDÛOêÄÛO¸Wä¬ÛOæ¸WðþäâìÛOdäÔÛOâ¬ÛOdðD¨ äüÛO|ÚOâ´ÝO#å ÜOdÚO#á,ÜOäââ\ÜOT4è„ÝOèâpêT4ä,ÜOä|ÜOãáLÝO2äŒÜO\ÜO2ÈÜOÿèäÝOäôÜOäã,ÜOì â,ÜO ä0ÝOè ÝOì â,ÜOðôÜOêtÝO¸Wä\ÝOæ¸W¼RäâœÝOdä„ÝOâ\ÝOdðT4ä¬ÝO,ÜOâÜÝO,!äÄÝOÜO,!äâœßOáí ä ìÝOÄÝOáí ÞOäâ âÞOæâDÞO4ì èlßOèâpê4ì äÞOädÞOãá4ßO2ätÞODÞO2°ÞOÿèäìÞOäÜÞOäãÞOì âÞO äßOèßOì âÞOðÜÞOê\ßO ä¤Pâ4Pˆ> èâäP€JäÌPâ ¤P€J8ýì@5äôP0Pâ$Püçä PâPüçð˜<ä4PèPâÀP€m äLPä€m ˆPááÿåä¤PïDí¼RêìPåÐPäá Pááÿåä(PïDáDPè8ýì`Pè8ýì|Pø˜Pè8ýì´PøÐPèèøŒ Mð äüP$ºNæPn äPâ `Pn 0PèæHPäÌ­ ä Pij 0Pì xPpK0PîXÞ0PèÜPü]ä Pæü]P âÿåøPpäìP8DJæÐP|äPä|DPÿìä`Pïá|Pèø1Kì˜Pø´Pè¤#KøèììPœåàPìPæ0âP— è¼Pèâpê— äìPä<Pãá P2äLPP2ˆPÿèäÄPä´PäãìPì âìP äðPèàPì âìPð´Pê4P¨ äPæ¨ ü@Lä,â\Pü] äDPâ Pü] ´ ä$â„P¬¹älPâ DP¬¹äëMäâ¬Pj ä”Pâ lPj àüKäâÔP Éä¼Pâ”P Éð— ääPìPâüPøh ä ì MtP¤3ä PPâæ,Pä¤3ä DPèUPê \PH<Pî„'PèÈPÜh ä„PŒPâ@â¼PÜh è˜PèâpêÜh äŒPäÜPãá¬P2äìP¼P2(PÿèädPäTPäãŒPì âŒP äPè€Pì âŒPðTPêèPdã ä¼Pædã ÔPä â ê äPÔÓäøPâ¼PÔÓèâ8Pä PâøPèâ`PXÿåHPâ PXÿápƒLäâˆP¼  äpPâHP¼  èâ°P\¦ä˜Pâ pP\¦üKKìÜh äÀPŒPâPPäØPäPæ âôPæ â$PÀ×èìPèâpêÀ×äôPäDPãáP2äTP$P2PÿèäÌPä¼PäãôPì âôP äøPèèPì âôPð¼Pê<P rä$Pæ rèâdPøäLPâ$PøèâŒPÈätPâLPÈèâ´P8äœPâtP8èâÜPlEäÄPâœPlEèâPœîäìPâÄPœîðÀ×äPôPâ0!PDå,P8Pæ âHPæâxP´ÔèxPèâpê´ÔäHPä˜PãáhP2ä¨PxP2äPÿèä PäPäãHPì âHP äLPè<Pì âHPðPê!P(k äxPæ(k PèâÀP`>èè Pèâpê`>äPäàPãá° P2äðPÀP2, Pÿèäh PäX PäãPì âP ä” Pè„ Pì âPðX PêØ Pè~åÀ Pæè~éã!PìÃåè PâÀ PìÃá8ýì`>ä!PPæ´Ôä(!PHPæ3ä@!PÄ-æh!P å\!Pê´!Pˆ|äx!Pæˆ|P âÿåà"Pdi äÄ!Pädi á"Päÿåä"Pïá8"PèêT"Pèêp"PøŒ"Pèì¨"PøÄ"Pèèÿèd#PÈäð"PäÈ,#PÿìäH#PïíøÚKì<$Pün ät#Päün °#PÿìäÌ#Pïáè#Pè|uJì$P褮Iì $PèLÝIøèì%PÔn äL$PäÔn ˆ$Pÿìä¤$PïáÀ$Pè|uJìÜ$P褮Iìø$PèLÝIøèìà%Pèå$%Päèá`%Pÿìä|%Pïá¨%Pè˜%Pì âXKæÄ%PèÀIÿèð%PL^ä зL°,PÌ=å&PäÌ=<&PááÿåäX&PïDát&Pèê&Pèê”,Pè¬&Pê â¼&PæHâì&P , èd,Pèâ@ê , ä¼&Pä 'PãáÜ'P2ä'Pì&P2X'Pÿèä”'Pä„'Päã¼&Pì â¼&P äÀ'Pè°'Pì â¼&Pð„'Pêt)P¨x äì'Pæ¨x (PäDâ â(PæâD(Pp‘èD)Pèâ@êp‘ä(Päd(Pãá4)P2ät(PD(P2°(Pÿèäì(PäÜ(Päã(Pì â(P ä)Pè)Pì â(PðÜ(Pê\)PÁäD)PæÁðp‘äl)P(Pâœ)Pd+ä„)Pâì'Pd+è@âÄ)Pá-ä¬)Pâ„)Pá-è<ã*PD¾äÔ)Pâ ¬)PD¾ì)Pä0â êä(*P|ã ä*PâÔ)P|ã è,âP*P¨ä8*Pâ*P¨è(âx*P8Åä`*Pâ 8*P8żRä$â *Ppäˆ*Pâ `*Pp¼Rä âÈ*Ptñä°*Pâ ˆ*Ptñ¼Räâð*Päã äØ*Pâ °*Päã ¼Räâ+P´å+PâØ*P´èâ@+P„ä(+Pã +P„t·Jäâh+PìÓäP+Pâ(+PìÓè â,,P€Æ äx+Pâ P+P€Æ +Päâ â +Pæä¼+PïáØ+Pè¼Rìô+Pø,PÿôT,Pè7 ä<,Pâx+Pè7 èâ|,P¸L äd,Pâ<,P¸L ð , äŒ,P¼&Pþ .PÐåÀ,PÈ,Pââø,PÐép.PèâpêÐåÈ,Pä-Pãáè-P2ä(-Pø,P2d-Pÿèä -Pä-PäãÈ,Pì âÈ,P äÌ-Pè¼-Pì âÈ,Pð-Pê.Phœäø-Pæhœdýä â8.PÐAä .Pâø-PÐAèâ`.P<äH.Pâ .P<èâˆ.Püäp.PâH.PüðÐå˜.PÈ,Pæ0^ä°.P˜„Mæx/Pø^äÌ.Päø^/Pááÿåä$/PïDá@/Pè0Jì\/Pÿä¼RêP0P¤åˆ/Pä¤áÄ/Pÿìäà/Pïáü/Pè|uJì0P褮Iì40PèLÝIøèì|1P@>ä`0Pä@>œ0Pÿìä¸0PïáÔ0PèDJìð0Pø 1Pø(1PèÔ)ìD1PèÔ)ì`1PèèøÔ)ì¨1P04˜1PŒ1PJOê 1PJOâÄ1Ptå¸1Pê|3PÈ^äÔ1Pà1Pæâ2PpÂèL3PèâpêpÂäà1Pä02Pãâ3P2ä@2P2P2|2Pÿèä¸2Pä¨2Päãà1Pì âà1P ää2PèÔ2Pì âà1Pð¨2Pê<3Pøz ä3Pæøz (3Päâ êäd3Pìæ äL3Pâ3Pìæ ðpÂät3Pà1Pâ€5Pð|äŒ3P˜3Pæ â¨3PæâØ3PäåèP5Pèâpêäåä¨3Päø3PãáÈ4P2ä4PØ3P2D4Pÿèä€4Päp4Päã¨3Pì â¨3P ä¬4Pèœ4Pì â¨3Pðp4Pêð4P$@äØ4Pæ$@è â5Pð( å5Pâ Ø4Pð( 8ýäâ@5Pt ä(5Pã5Pt èâh5PàœåP5Pâ(5Pàœá8ýìäåäx5P¨3Pâà9PXo ä5PäXo Ì5Pááÿåäè5PïDá6Pø 6Pèðþìü7Pè<6Pì âL6Pæâ|6P<.èÌ7Pèâpê<.äL6Päœ6Pãál7P2ä¬6P|6P2è6Pÿèä$7Pä7PäãL6Pì âL6P äP7Pè@7Pì âL6Pð7Pê”7PP´Þäð=Pâ´=P´Þè$â0>P\ä>Pâð=P\è âX>P4±å@>Pâ>P4±éâ€>PPŒ äh>Pâ@>PPŒ èâ¨>P0Õ ä>Pâh>P0Õ èâÐ>P0§ ä¸>Pâ>P0§ èâø>PPâ¸>PP€]èâH?P¨ç ä0?Pâ?P¨ç èâp?PÜäX?Pâ0?PÜðÄCä€?Pü9Pâ @Pá4ä˜?På4Ô?Pááÿåäð?PïDí| NìÀDPl^ä@P(@Pæ â8@Pæâh@P¨· èDPèâp꨷ ä8@Päˆ@PãáXAP2ä˜@Ph@P2Ô@PÿèäAPåAPäã8@Pì â8@P äâ@ZP$K ä(ZPãZP$K è<âhZPZ äPZPâ(ZPZ è:âZP|ÄäxZPâPZP|Äè8â¸ZPp8ä ZPâxZPp8è6âàZPL äÈZPâ ZPL è4â[PØäðZPÈZPØ@µJä,â0[P„Üä[PðZP„Üè2âX[P'ä@[P[P'è0â€[P°G äh[P@[P°G è.â¨[P´3ä[Pâh[P´3è,âÐ[P+ ä¸[Pâ[P+ è(âø[Pˆ–äà[Pâ¸[Pˆ–è&â \Pˆ; ä\Pâà[Pˆ; è$âH\P°§å0\Pâ\P°§é"âp\Pº äX\Pâ0\Pº è â¬\PhÌ ä€\Pâ X\PhÌ ˜\Pè ê éø ä¼\PVPâì\PÔäÔ\Pâ ìUPÔ¼Rä$â]P„ äü\Pâ Ô\P„ ¼Rä â<]P„.å$]Pâü\P„.á¼Räâd]P¤b äL]Pâ $]P¤b ¼RäâŒ]Px… ät]Pâ L]Px… ¼Räâ´]PÔc äœ]Pâ t]PÔc ¼RäâÜ]Pœ“ äÄ]Pâ œ]Pœ“ ¼Rä â^PŒväì]Pâ Ä]PŒv¼Räâ,^P°¼ ä^Pâ ì]P°¼ ¼RäâT^PÄä<^Pâ^PÄð -åd^PÜRPâ$_PÔ4ä|^Pˆ^Pæ â˜^Pæä´^PïáÐ^Pè8ýìì^Pø_Pÿä8ýêPaP@}ä4_P@_Pæ âP_Pæâ€_P|È è aPèâpê|È äP_Pä _Pãáp`P2ä°_P€_P2ì_Pÿèä(`Pä`PäãP_Pì âP_P äT`PèD`Pì âP_Pð`Pê˜`Pø0ä€`Pæø0´Uä âÀ`P( ä¨`Pâ€`P( è âè`Pì äÐ`Pâ¨`Pì èâaP äø`Pâ Ð`P ´Uäâ8aPXä aPâ ø`PX¼Rì|È äHaPP_Pâ`bP`p ä`aPä`p œaPááÿåä¸aPïDáÔaPèðþìðaPèðþì bPèðþì(bPèðþìDbPèðþø ãIì8cP ?äpbPä ?¬bPááÿåäÈbPïDáäbPùcPøcPÿôÜeP´äHcPPcPâ4â€cP´è¬ePèâ@ê´äPcPä cP ãápdP2ä°cP€cP2ìcPÿèä(dPädPäãPcPì âPcP äTdPèDdPì âPcPðdPê˜dPd$ ä€dPæd$ è0âÀdPhIä¨dPâ€dPhIè.âèdPÜÿ äÐdPâ¨dPÜÿ è,âeP0ÞäødPâÐdP0Þè(âLeP˜Åä ePâ ødP˜Å8ePäâ ê äteP<Óä\ePâ eP<ÓèâœeP@J ä„ePâ\eP@J èâÄeP,ä¬ePâ„eP,ð´äÔePPcPâhPHp äìePäHp (fPááÿåäDfPïDáÐgPè`fPì âpfPæâ fPt)è gPèâpêt)äpfPäÀfPãágP2äÐfP fP2 gPÿèäHgPä8gPäãpfPì âpfP ätgPèdgPì âpfPð8gPê¸gPÁä gPæÁðt)äÈgPpfPâìgPèöxGKì˜jPÈ>ähP$hPæ â4hPæádhPäÉèhjPèâpêäÉä4hPä„hPãáTiP2ä”hPdhP2ÐhPÿèä iPäühPäã4hPì â4hP ä8iPè(iPì â4hPðühPêiP< ädiPæ< |iPäâ éã¸iPxiä iPâdiPxièâàiPLgäÈiPâ iPLgèâjPÄÇäðiPâ ÈiPÄÇjPäâ ê äXjP¬]ä,jPâ ðiP¬]DjPäâ êä€jPæähjPâ,jPæðäÉäjP4hPâTkP,}ä¨jPä,}äjPááÿååkPïDákPèdýì8kPèö8ýìølP¨>ädkPpkPæ â kP@ èÈlPèâpê@ äpkPäÀkPãálP2äÐkP kP2 lPÿèäHlPä8lPäãpkPì âpkP ätlPèdlPì âpkPð8lPê¸lPp ä lPæp èâàlPÜS äÈlPâ  lPÜS Qègä0=Q<=Qæ âL=Qæ$â|=Qp è¸>Qèâpêp äL=Qäœ=Qãál>Q2ä¬=Q|=Q2è=Qÿèä$>Qä>QäãL=Qì âL=Q äP>Qè@>Qì âL=Qð>Qê¨>Q€@ ä|>Qæ€@ ”>Qäâ ê äÐ>QØ×ä¸>Qâ|>QØ×ðp äà>QL=QâÀ?Qø!äø>Qäø!4?QÿìäP?Qïál?Qè|uJìˆ?Q褮Iì¤?QèLÝIøèì˜@QÀgäÐ?QäÀg @Qÿìä(@QïáD@Qè|uJì`@Q褮Iì|@QèLÝIøèì¨@Qä!ä ¸úO\BQœ!ä¸@QÄ@Qæ âÔ@QæâAQd‡ è,BQèâpêd‡ äÔ@Qä$AQãáôAQ2ä4AQAQ2pAQÿèä¬AQäœAQäãÔ@Qì âÔ@Q äØAQèÈAQì âÔ@QðœAQêBQä?äBQæä?°°JäâDBQ,—ä,BQâBQ,—ðd‡ äTBQÔ@QâlCQÌ„älBQäÌ„¨BQááÿåäÄBQïDáàBQøüBQøCQø4CQøPCQèðþøèì@DQ€o ä|CQˆCQæ â˜CQæä´CQïáÐCQøìCQøDQø$DQÿôXDQÔv äPDQÔoMâ„EQx!ähDQäx!¤DQááÿåäÀDQäØËMçDáÜDQèðþìøDQøEQø0EQøLEQøhEQÿõHQ`o ä”EQä`o ÐEQááÿåäìEQïDáFQèüKKìäGQè$FQì â4FQæâdFQ «è GQèâpê «ä4FQä„FQãáTGQ2ä”FQdFQ2ÐFQÿèä GQäüFQäã4FQì â4FQ ä8GQè(GQì â4FQðüFQêGQØÇ ädGQæØÇ |GQäâ êäÌGQì«ä GQâ dGQ쫸GQè êè «äÜGQ4FQþÈKQLo äHQHQæ â,HQæ$â\HQs è˜IQèâpês ä,HQä|HQãáLIQ2äŒHQ\HQ2ÈHQÿèäIQäôHQäã,HQì â,HQ ä0IQè IQì â,HQðôHQêˆIQ€Jä\IQæ€JtIQä â êä°KQì„ä˜IQâ \IQì„°IQè âàIQ°è€KQèâpê°ä°IQåJQãáÐJQ2äJQàIQ2LJQÿèäˆJQäxJQäã°IQì â°IQ ä´JQè¤JQì â°IQðxJQêøJQ¨v äàJQæ¨v pƒLäâ KQð¹ äKQâàJQð¹ è âHKQ€Dä0KQâKQ€DèâpKQ,2äXKQâ0KQ,2èâ˜KQðU ä€KQâXKQðU ð°ä¨KQ°IQæs äÀKQ,HQæ|„äØKQæ|„LQäÿå áêãtLQP…ä8LQæP…P âÿåÀLQ4Gä„LQæ4GP âÿå˜MQ„;äÐLQä„; MQÿìä(MQïáDMQè|uJì`MQ褮Iì|MQèLÝIøèìÄRQÔ"´RQ¨MQ´MQæâ äMQÔ"0RQèDRQä @áp¤RQæÔ"ä´MQäNQãá"`OQ`/¨NQNQäMQ`/PNQÿèä|NQìã´MQø˜NQì â´MQè°NQäMQ`/ìNQÿèäOQìã´MQì4OQè˜NQøPOQê â´MQ äPQ2äpOQäMQ2¬OQÿèäØOQäPOQäã´MQìôOQè˜NQøPOQêQQ€ ä PQäMQ€ \PQâÿèäˆPQìáá´MQâå¤PQè˜NQìÀPQøÜPQèêøPQèöÔ)ìRQ€¿ ä$QQäMQ€¿ `QQâÿèäŒQQìáá´MQ âå¨QQè˜NQìÄQQèêàQQèêüQQÿäÔ)ðÔ"ä(RQ´MQæ$ìTRQ´MQäââäMQRQÿäìâÒÉêyùºÎŒ‚ªK© ã¼RQ´MQâœSQ¬"äÔRQä¬"SQÿìä,SQïáHSQè|uJìdSQ褮Iì€SQèLÝIøèìtTQhä¬SQähèSQÿìäTQïá TQè|uJì卨Qâ€ØQØ>éâèØQ xäÐØQâ¨ØQ xèâÙQäøØQâ ÐØQ¼RìP‚ ä ÙQ°ÖQþÀÜQ„‡äTÙQ`ÙQæâÙQ˜–èÜQèâpꘖä`ÙQä°ÙQãá€ÚQ2äÀÙQÙQ2üÙQÿèä8ÚQä(ÚQäã`ÙQì â`ÙQ ädÚQèTÚQì â`ÙQð(ÚQêXÜQ(äÚQæ(¨ÚQä â âØÚQ¨ô è(ÜQèâpê¨ô ä¨ÚQäøÚQãáÈÛQ2äÛQØÚQ2DÛQÿèä€ÛQäpÛQäã¨ÚQì â¨ÚQ ä¬ÛQèœÛQì â¨ÚQðpÛQêðÛQ0¦äØÛQæ0¦èâÜQjåÜQâØÛQjèâ@ÜQ°±ä(ÜQãÜQ°±ð¨ô äPÜQ¨ÚQâ€ÜQð ähÜQâÚQð èâ¨ÜQÜS äÜQâ hÜQÜS áçrÿí ðÿmááÿÿÿ÷â“æ@ÿä ðÿnááÿÿÿ÷â~æBÿä ðÿäÿûâ¨æAÿä ïÿäóâEÿáâæ ÿä ïÿrááÿÿïÿåâ ÿìñÿÿÿÿââÈåÀõéŒåQü:ápÿärý æQÀåQéìåQü:á ¾ä‘ÿá æQéLæQü:á ¾ä’ý4ë@ýDçQr ä´æQär ðæQááÿåä çQïDá(çQÿä BJìèQäéQä@>XéQááÿåätéQïDáéQè8ýì¬éQèø÷KêÈéQÿääéQê âø÷KæÌêQ$JäêQä$J@êQááÿåä\êQïDáxêQè¼Rê”êQè¼Rê°êQè¬&Pÿæ4ëQ>äÜêQä>ëQááÿåìdýçDáìQHˆäDëQPëQæ â`ëQæä|ëQïá˜ëQè¼Rì´ëQè¼RìÐëQøìëQè¼RøVPì<ïQì=äìQ$ìQæ$âTìQ´mè ïQèâpê´mä$ìQätìQãáDíQ2ä„ìQTìQ2ÀìQÿèäüìQäììQäã$ìQì â$ìQ ä(íQèíQì â$ìQðììQêlíQØ—äTíQæØ—è"â”íQÄÏä|íQâTíQÄÏè â¼íQPsä¤íQâ|íQPsèâäíQ¸äÌíQâ¤íQ¸èâ îQ|— äôíQâÌíQ|— èâ4îQ¤ö äîQâôíQ¤ö èâ\îQ„GäDîQâ îQ„G8ýä â„îQáD älîQâDîQáD 8ýäâ¬îQø’å”îQâlîQø’éâÔîQìä¼îQ”îQìèâüîQÌjääîQ¼îQÌjì$ïQx‰ä ïQâäîQx‰ð´mä4ïQ$ìQæ¤%äLïQTïQââ„ïQ¤%è„ðQèâpê¤%äTïQä¤ïQãátðQ2ä´ïQ„ïQ2ðïQÿèä,ðQäðQäãTïQì âTïQ äXðQèHðQì âTïQððQêœðQÁä„ðQæÁð¤%ä¬ðQTïQâÄñQäJäÄðQääJáñQÿìäñQïá8ñQè8ýìTñQøpñQøŒñQè8ýì¨ñQÿä¤-ìàñQ(&äÔñQêàòQxz äðñQâ òQxz òQêæðñQä`°ä 8òQ”ÑòQì PòQ€L òQê hòQ´ÇòQê €òQàõòQê ˜òQ¼ïòQê °òQx òQçé ÈòQòQèí § òQ'ç€óQ@z äðòQä@z ,óQÿìäHóQïádóQ訃KøDÃKìóQ&ä UJHõQ,z ä óQ¬óQæâÜóQhÏèõQèâpêhÏä¬óQäüóQãáÌôQ2ä ôQÜóQ2HôQÿèä„ôQätôQäã¬óQì â¬óQ ä°ôQè ôQì â¬óQðtôQêõQäKäÜôQæäKôôQäâ êä0õQìæ äõQâÜôQìæ ðhÏä@õQ¬óQâ`õQø!åXõQ„XJâh÷QÜ!åpõQ|õQæ â¬õQ¤ è8÷Qèâpê¤ ä|õQäÌõQãáœöQ2äÜõQ¬õQ2öQÿèäTöQäDöQäã|õQì â|õQ ä€öQèpöQì â|õQðDöQêØöQœ® ä¬öQ朮 ÄöQäâ â@ÿMäå÷Q°Í äèöQâ¬öQ°Í èâ(÷Qðä÷Qâ èöQðR8Ìå>RØ=R8ÌX+-äâ@>R|¯ ä(>Rá >R|¯ ¼Räâh>Rœdå P>R(>Rœdá BJäâ>RØoäx>RP>RØohëIäâ¸>Rœ!ä >Rx>Rœ!èâà>R„äÈ>R >R„èâ?R0Ùäð>RÈ>R0Ùèâ0?Rð)ä?Rð>Rð)èâX?R|aä@?R?R|aèâ€?RpÆäh?R@?RpÆ8Kæt‘R%å ŽRŽRââDŽR%éD‘Rèâpê%åŽRädŽRãá4R2ätŽRDŽR2°ŽRÿèäìŽRäÜŽRäãŽRì âŽR äRèRì âŽRðÜŽRê\RtiåDRætiáS<0ä„=Sä<0À=SááÿåäÜ=SädýçDáø=Sè¼Rê>Sè¼Rê0>SøL>Søh>Sø„>Sø >Sø¼>SèdýìØ>Sè ~Qÿèx?SXä?SäX@?Sááÿåä\?SïDý4@SŒ+åˆ?SäŒ+áÄ?Sááÿåäà?SïDáü?SèüKKì@SèœÉLÿæL@S8äD@S Mæ‚ ä\@Sä‚ ˜@Sááÿåä´@SïDáÐ@Sè8ýìì@SÿôŒASSäASäSTASäÿåäpASïí ¦IìdBSÜRäœASäÜRØASÿìäôASïáBSè|uJì,BS褮IìHBSèLÝIøèìCS€HätBSä€H°BSÿìäÌBSïáèBSèl¹MøìÜCSLHäCSäLHPCSÿìälCSïáˆCSè|uJì¤CS褮IìÀCSèLÝIøèì˜DSx‘äìCSäx‘(DSÿìäDDSïá`DSè¼Rì|DSè¼Rø¼RìtJSø0ä¨DS°DSââàDSø0èDJSèâpêø0ä°DSåESãáÐES2äESàDS2LESÿèäˆESäxESäã°DSì â°DS ä´ESè¤ESì â°DSðxESêJSä-åàESæä-áøESäââ(FSxèìISèpæàDSxäøESäHFSãáGS2äXFS(FS2”FSÿèäÐFSäÀFSäãøESì âøES äüFSèìFSì âøESðÀFSêÜISÌ¢å(GSæÌ¢á@GSè âPGSæâ€GSÌ®è¬ISèâpêÌ®äPGSä GS ãápHS2ä°GS€GS2ìGSÿèä(HSäHSäãPGSì âPGS äTHSèDHSì âPGSðHSê¬HSÀ9ä€HSæÀ9˜HSäâ êäÔHS Éä¼HSâ€HS ÉèâüHSè*ääHSâ¼HSè*èâ$IS¼.ä ISâäHS¼.èâLIS ä4ISâ IS è âtISŒdä\ISâ4ISŒdèâœISbä„ISâ\ISbèâÄISĪä¬ISâ„ISĪðÌ®äÔISPGSâJSܸ äìISâ(GSܸ ðxäJSøESâ4JSxä,JSøESâ\JStºäDJSâàEStºðø0älJS°DSâ„JS,Hä ¸S@KS¼Rä”JSä¼RÐJSááÿåäìJSïDáKSèЧIì$KSèðþÿèàKS°{ äPKSä°{ ŒKSááÿåä¨KSïDáÄKSèø÷KÿædLS¨RäðKSä¨R,LSÿìäHLSïí¼RêäOSD‘ätLSäD‘°LSááÿåäÌLSïDáèLSøÈOSèMSì âMSæTâDMSBé˜OSèâ@êBåMSädMS ãá4NS2ätMSDMS2°MSÿèäìMSäÜMSäãMSì âMS äNSèNSì âMSðÜMSê\NSd$ äDNSæd$ èPâ„NSH¸ älNSâDNSH¸ èNâ¬NSØ;ä”NSâlNSØ;èLâÔNSüä ä¼NSâ”NSüä èJâüNS  ääNSâ¼NS  èHâ8OS˜Åä OSâ äNS˜Å$OSäâ @ê ä`OS<ÓäHOSâ OS<ÓèâˆOS@J äpOSâHOS@J èâ°OS,ä˜OSâpOS,ðBåÀOSMSþàPSèGäôOSáçRæ„PS\{ äPSä\{ LPSááÿåähPSïDÿá ,å”PSœPSâæ´PSä ,å ÌPS`œPSêäPS˜6áœPSê üPS œPSê QSø¼œPSê ,QS8þœPSê DQS|wœPSê \QSH œPSê tQSLøœPSê ŒQSXΜPS ê ¤QSpN œPS ê ¼QS„O œPS îìœPS èðQS8-åäQSüPæRS|IåRSP+Sâ¨RSX| äRSäX| TRSááÿåäpRSïDáŒRSÿä BJìÔRSÐ1ÄRS¸RS ÏLêÌRS ÏLâ¬SS¼ƒ ääRS伃 SSÿìäâ¨oS¬þ äoSâhoS¬þ è<âÐoS¤Jä¸oSâoS¤Jè:âøoS 4 äàoSâ¸oS 4 è8â pSŸäpSâàoSŸè7âHpS‡ä0pSâpS‡è6âppS|XäXpSâ0pS|Xè4â˜pSðÖä€pSâXpSðÖè2âÀpS°2ä¨pSâ€pS°2è0âèpSx¹äÐpSâ¨pSx¹è,âqSÜ.äøpSâÐpSÜ.è*â8qS¨ å qSâøpS¨ é(â`qS8±äHqSâ qS8±è&âˆqS$¹äpqSâHqS$¹è$â°qSä˜qSâpqSè"âØqS4›äÀqSâ˜qS4›è ãrS¤ÜäèqSâÀqS¤Üèâ(rSÄW ärSâèqSÄW èâPrSl ä8rSârSl èâxrSÐ' ä`rSâ8rSÐ' èâ rS;äˆrSâ`rS;èâÈrS@&ä°rSâˆrS@&èâðrSÎåØrSâ°rSÎéâsS¸8 åsSâØrS¸8 è â@sS´\ ä(sSãsS´\ èâhsS$öäPsSâ(sS$öèâsSü¤äxsSâPsSü¤èâ¸sSÔãä sSâxsSÔãèâàsS ©äÈsSâ sS ©èâtSÀ"äðsSâÈsSÀ"ððätS8nSâLtSP… ä0tSáçœý>áçÿí ðÿÿœááÿÿÿÿÿõâ¤å@Aÿä ïäïœááÿÿÿÿþâÕÿì ïÿááÿÿïÿåâ ÿìïÿœááÿÿÿÿìáàÿÿÿÿâæ ÿä ðÿÿœááÿÿÿÿÿõâžæ@ôé<òSü:á¤*äý@óS´}äxòSä´}´òSÿìäÐòSïáìòSè|uJìóS褮Iì$óSèLÝIøèìlóSQ\óSPóSÄøIêdóSÄøIâ8ôSè3å|óSäè3á¸óSÿìäÔóSäðþçáðóSèèì ôSèðþø(ôSì âÐîLæõSЙäHôSäЙ„ôSÿìä ôSïá¼ôSè|uJìØôS褮IìôôSèLÝIøèìŒ÷S<‹ ä õSä<‹ \õSÿìäxõSïá”õSè¼Rì°õSèt!øÌõSì âÜõSæ â öS¨è\÷Sèâpê¨äÜõSä,öSãáüöS2ä<öS öS2xöSÿèä´öSä¤öSäãÜõSì âÜõS äàöSèÐöSì âÜõSð¤öSê$÷Sœ_ ä ÷Sæœ_ èâL÷SXUä4÷Sâ ÷SXUVPäât÷S¤b ä\÷Sâ 4÷S¤b ¼Rì¨ä„÷SÜõSâ¨÷S°™äœ÷STªIæ ùSp}ä¸÷SÄ÷Sæ âÔ÷Sæäð÷Sïá øSø(øSè¼RêDøSè¼Rê`øSø|øSèèæâ˜øSèÀ­OæâÔøSè´øSæâ âÄøSæ æäðøSèèæî8ýìˆûSÜ7äùS(ùSæ â8ùSæâhùSà%èXûSèâ@êà%ä8ùSäˆùS ãáXúS2ä˜ùShùS2ÔùSÿèäúSåúSäã8ùSì â8ùS ä<úSè,úSì â8ùSñúSê€úS 5ähúSæ 58ýäâ¨úSX äúSâhúSX èâÐúS$à ä¸úSúS$à è âøúSœÑäàúSâ ¸úSœÑdýä â ûS4±åûSâàúS4±éâHûS´;ä0ûSâûS´;èâpûSÜäXûSâ0ûSÜðà%ä€ûS8ùSâ¤ûSœZä˜ûS8ëSæÀûSœ™ä´ûS°ÖQæ˜üSðPäÐûSÜûSæ âìûSæäüSïá4üSè$üSê â@FLæ`üSèPüSê â HMæ|üSÿøH}ä¨üSHQæTýSŒ äÄüSäŒ áýSÿìäýSïá8ýSèdýøê ýS°[ädýSæ°[P âÿåxþS„[ä°ýSä„[ìýSÿìäþSïá$þSè|uJì@þS褮Iì\þSèLÝIøèìÄþSh[äˆþSæh[P âÿåœÿS ‹ äÔþSä ‹ ÿSÿìä,ÿSïáHÿSè|uJìdÿS褮Iì€ÿSèLÝIøèì¸ÿSă ä¬ÿS$ŠSæÔÿS|‹ äÈÿS€ÎIæðÿSdƒ ääÿSLŠSêh‹ æTh&h‹ T…8ò…8öXTà8äLT,(SæhTtšä ,¦RxT\Rä ONÄT\äˆTæ\8ýäÿåœT8RäÔTä8RTÿìä,TïáHTè|uJìdT褮Iì€TèLÝIøèì´T Rä¬TTQâàTø[äÄTÌTââüTø[è°Tèâpêø[äÌTäTãáìT2ä,TüT2hTÿèä¤Tä”TäãÌTì âÌT äÐTèÀTì âÌTð”Tê(T8X äüTæ8X Täâ êäPTð3ä8TâüTð3è âxTÈä`Tâ8TÈèâ TØäˆTâ`TØèâÈTÜùä°TâˆTÜùðø[äØTÌTâ|TTšäðTüTæ â Tæä(TòDTè8ýì`Tÿô(T\„ äŒTä\„ ÈTááÿåääTïDâTèdýìTø8TøTTø TèpTì â€TæäœTïá¸TèdýìÔTøðTÿÿðäTôQä8TDTæ0âtTì%è´Tèâpêì%äDTä”T ãádT2ä¤TtT2àTÿèäTä TäãDTì âDT äHTè8Tì âDTð TêŒTô& ätTæô& è,â´TXäœTâ tTXpƒLäâÜT˜†äÄTâ œT˜†üKKäâTŒóäìTâ ÄTŒódýäâ,T|´äTâìT|´èâTT ä<TâT è â|Tè‡ädTâ<Tè‡èâ¤T¨äŒTâdT¨èâÌT°‹ ä´TâŒT°‹ ðì%äÜTDTæHŒ äôTá Tæ â Tæâ@ T $èô Tèâpê $ä Tä` Tãá0 T2äp T@ T2¬ Tÿèäè TäØ Täã Tì â T ä Tè Tì â TðØ Têl T Tä@ Tæ TX Täâ êä” Tä| Tâ@ Tèâ¼ T0ëä¤ Tâ | T0ë0—Iäâä Tt äÌ T⤠Tt èâ TŒ" äô TâÌ TŒ" ð $ä T Tâü TÌ\ä4 TäÌ\p TááÿåäŒ TïDᨠTèŒìÄ Tè êà TètNøt!ìä T 5å Tä 5áH Tÿìäd Tïá Tè€ Tì âÈ[Læ¬ TøÈ TèøÔ)ì¼ T„9äô Tä„90 TÿìäL Tïáh Tè|uJì„ T褮Iì  TèLÝIøèìÔ TŒ äÌ TðýIâð Tøšää TlÝJæ T0åT ¦IæHT`9äT(Tæ â8TæâhT´QèTèâpê´Qä8TäˆTãáXT2ä˜ThT2ÔTÿèäTåTäã8Tì â8T ä<Tè,Tì â8TñTê¸T<> ähTæ<> €Tä â âTæâÀT$èˆTèâpê$äTäàTãá°T2äðTÀT2,TÿèähTäXTäãTì âT ä”Tè„Tì âTðXTêØTDÉäÀTæDÉX+-äãT¬» äèTâÀT¬» è â(TäTâèTèâPTÈä8TâTÈèâxT„ä`Tâ8T„èâ T¨äˆTâ`T¨ð$ä°TTâàT¬» äÈTâhT¬» èâT(=äðTâÈT(=èâ0TÀâäTâðTÀâð´Qä@T8TâdTàšäXTêÜTœ\ätT|Tââ¬Tœ\è¬Tèâ@êœ\ä|TäÌTãáœT2äÜT¬T2TÿèäTTäDTäã|Tì â|T ä€TèpTì â|TðDTêÄTÁä¬TæÁðœ\äÔT|TâøT RäìTÄoMæÄTÀšäTTæTáDT4ã è”Tèâpê4ã äTädTãá4T2ätTDT2°TÿèäìTäÜTäãTì âT äTèTì âTðÜTê\TwäDTæwløNä â„Tp älTâDTp èâ¬TÜS ä”Tâ lTÜS TL† ä¸=TäL† ô=Tááÿåä>TïDá,>Tè ö˜Kìè>T|äX>Tä|”>Tÿìä°>TïáÌ>TèèøÈËMì”FTŽ äø>TäŽ 4?TÿìäP?TïáxFTèl?Tì â|?Tæâ ¬?T Á ôETèFTä @áphFTæ Á ä|?TäÌ?T ãá"(AT`/p@TÜ?T¬?T`/@TÿèäD@Tìã|?Tø`@Tì â|?Tèx@T¬?T`/´@Tÿèäà@Tìã|?Tìü@Tè`@TøATê â|?T äØAT2ä8AT¬?T2tATÿèä ATäATäã|?Tì¼ATè`@TøATêlBTTäèAT¬?TT$BTâÿèäPBTìáá|?T$âŒñ`@TìCT°ä|BT¬?T°¸BTâÿèääBTìáá|?T â‹æCTè`@TøŒìèCT´¡ä,CT¬?T´¡hCTâÿèä”CTìáá|?TâŠå°CTè`@TìÌCTèŒÿè˜DTØùäøCT¬?TØù4DTâÿèä`DTìáá|?Tâ‰å|DTè`@TøŒìHETÜ# ä¨DT¬?TÜ# äDTâÿèäETìáá|?Tâˆå,ETè`@TøŒìÜET¨, äXET¬?T¨, ”ETâÿèäÀETìáá|?Tâ‡ñ`@Tð Á äìET|?Tæ KìFT|?Tä0ââ¬?Tð¥TFTÿä0ìâ åÀåFëŒì¬FTà€ä¤FT¤—MâLGT † ä¼FTä † øFTááÿåäGTïDá0GTè(PÿèÜIT_ä\GThGTæ âxGTæPâ¨GT¼Õè¬ITèâ@ê¼ÕäxGTäÈGT ãá˜HT2äØGT¨GT2HTÿèäPHTä@HTäãxGTì âxGT ä|HTèlHTì âxGTð@HTêÀHThIä¨HTæhIèNâèHTÜÿ äÐHTâ¨HTÜÿ èLâIT0ÞäøHTâÐHT0ÞèHâLIT˜Åä ITâ øHT˜Å8ITäâ @ê ätIT<Óä\ITâ IT<ÓèâœIT@J ä„ITâ\IT@J èâÄIT,ä¬ITâ„IT,ð¼ÕäÔITxGTâHLTHäìITøITæâ(JTt%èLTèâpêt%äøITäHJT ãáKT2äXJT(JT2”JTÿèäÐJTäÀJTäãøITì âøIT äüJTèìJTì âøITðÀJTê@KT˜Šä(KT昊èâhKTxœäPKTâ(KTxœèâKT˜äxKTâPKT˜èâ¸KT ä KTâxKT è âàKT„äÈKTâ KT„èâLTh@ äðKTâÈKTh@ èâ0LT¸; äLTâðKT¸; ðt%ä@LTøITâÔNTÌ6åXLTäÌ6á”LTááÿåä°LTïDáÌLTè8ýì€NTèèLTèâ âøLTæâ(MTèPNTèpêäøLTäHMTãáNT2äXMT(MT2”MTÿèäÐMTäÀMTäãøLTì âøLT äüMTèìMTì âøLTðÀMTê@NTŠä(NTæŠìhNT€JäPNTâ (NT€J8ýìäxNTøLTâœNTø¸NTèèøŒ MìQTðTääNTìNTââOTðTèäPTèâpêðTäìNTääT×Md•TœƒT•TH•Tp…Nê\•Tp…Nâ<–T¤Ÿät•T䤟°•TÿìäÌ•Tïáè•Tèp&Nì–Tø –Tè<§Iøèìø–Tˆ äL–Täˆ ˆ–Tááÿå䤖TïDáÀ–Tè¼RêÜ–Tèðþÿæ$—Tpˆ ä—T—Tæ âü…TæÀ—TTˆ ä4—T@—Tæ âP—Tæäl—TïሗTèüKK줗TÿøÔaäЗTÜ—Tæ â$Pæ˜T˜„äü—TLlN樘T˜Wä˜Tä˜WT˜Tÿìäp˜TïጘTè(1Sø êH™Th„丘Täh„ô˜Tÿìä™Tïá,™Tè$µPø\èJì šTX äX™TäX ”™Tÿìä°™TïáÌ™Tè|uJìè™T褮IìšTèLÝIøèìœTL ä0šT8šTââhšTL èà›TèâpêL ä8šT䈚TãáX›T2䘚ThšT2ÔšTÿèä›Tå›Täã8šTì â8šT ä<›Tè,›Tì â8šTñ›TꀛT¼&äh›Tæ¼&8ýä⨛TÄHå›Tâh›TÄHáPLäâЛTHŽä¸›Tâ›THŽèâø›T Éäà›T⸛T ÉðL äœT8šTâ,œTøŸä œT(ÈRæHœT :å<œTX~SædœTèŸäXœT¼RêD ätœTê¬T0XäœTä0XÌœTÿìäèœTïáTè8ýì Tèìäx T,ÒL朢TÌ:å” Tœ TââÌ TÌ:él¢TèâpêÌ:圠Täì TãἡT2äü TÌ T28¡Tÿèät¡Täd¡Tä㜠Tì ✠T ä ¡Tè¡Tì ✠Tðd¡Têä¡TäÌ¡Tæèâ ¢T´]äô¡TâÌ¡T´]èâ4¢TÄå¢Tâô¡TÄéâ\¢TÈ·äD¢Tâ ¢TÈ·@µJäâ„¢TÜS äl¢Tâ D¢TÜS ä¼Tä8á¼Rä 0¼T½Tl¼Tô:â\¼TäܼTü âl¼Tæäˆ¼Tä¼Rç᤼TøÀ¼Tè¼Rÿèäoál¼Tæÿä x½T ½TéL½Tü:ᬨäþ ؽT€½Tá¼R䬽Tü:á´Uäÿâà½Té ¾Tü:ᬨäþô¾TL‹ äH¾TäL‹ „¾Tÿìä ¾Tïá¼¾TøؾTèèøèìÌ¿Tì’ ä¿Täì’ @¿Tÿìä\¿Tïáx¿Tè|uJ씿T褮Iì°¿TèLÝIøèìè¿T4‹ äÜ¿Tì»OæXÀTáAäø¿TçAÀTèæ(ÀTäèä @ÀTˆúÀTì ø¿T”õÀTètÀT‹ ähÀTÈÏIæÂTØ’ ä„ÀTÀTæâÀÀT¶èèÁTèâpê¶äÀTäàÀTãá°ÁT2äðÀTÀÀT2,ÁTÿèähÁTäXÁTäãÀTì âÀT ä”ÁTè„ÁTì âÀTðXÁTêØÁT4c äÀÁTæ4c èãÂT äèÁTâÀÁT ð¶äÂTÀTâ4ÂTÄ’ ä(ÂT@_PæÔÂT ‡äDÂTä ‡€ÂTááÿåäœÂTïDá¸ÂTè8ýø¤*ìXÃTädääÂTääd ÃTááÿåä<ÃTä8ýçDýÀÃTüŠ ähÃTäüŠ ¤ÃTááÿå÷DáÜÃTd£äÐÃT …Læ|ÄT£äìÃTä£(ÄTááÿåäDÄTïDá`ÄTèüKKøðRìpÅTÔYäŒÄTäÔYÈÄTááÿåääÄTïDâÅTè8ýìÅTèœPSì8ÅTè8ýìTÅTÿäèìœÅT¼<å€ÅTŒÅTæ âtLêÌ¢ä¬ÅT¬¨æÆT,AäÈÅTä,AÆTÿìä ÆTïá<ÆTè|uJìXÆT褮IìtÆTèLÝIøèìhÇTÔ=å ÆTäÔ=áÜÆTÿìäøÆTïáÇTè|uJì0ÇT褮IìLÇTèLÝIøèì´ÇT¸=åxÇTæ¸=áP âÿæÈT “ äÄÇTh& “ L˜8ò˜8ö ÈTœ=åÈTâ@ÈTœ=á(ÈTêæÈTä0? ä XÈT”W(ÈTê pÈTܧ (ÈTê ˆÈT¤Ô(ÈTî(ÈTè$ÉTŒZä°ÈTäŒZìÈTááÿåäÉTïDíø÷Kê@ÉT€=å4ÉT°°JêL=åPÉTäL=áŒÉTááÿåä¨ÉTïDáÄÉTèêàÉTèìüÉTèxGKìÊTèxGKì4ÊTøPÊTølÊTè8ýìˆÊTèê¼ÎTè¤ÊTì â´ÊTæDâäÊTŒ èŒÎTèâpêŒ ä´ÊTäËTãáÔËT2äËTäÊT2PËTÿèäŒËTä|ËTäã´ÊTì â´ÊT ä¸ËTè¨ËTì â´ÊTð|ËTêüËTB ääËTæB 8ýä@â$ÌTÜ5ä ÌTâ äËTÜ58ýä<âLÌT,Çå4ÌTâ ÌT,Çá8ýä8âtÌTå\ÌTâ4ÌTáðþä4âœÌTÜä„ÌTâ\ÌTÜè2âÄÌT”5ä¬ÌTâ„ÌT”5è0âìÌT¸L äÔÌTâ¬ÌT¸L è,âÍTÈ# äüÌTâÔÌTÈ# è(â<ÍT€<ä$ÍTâüÌT€<è$âdÍTè´äLÍTâ$ÍTè´è âŒÍT$ätÍTâLÍT$èâ´ÍTäœÍTâtÍTèâÜÍT ÏäÄÍTâœÍT ÏèâÎTàÏäìÍTâÄÍTàÏèâ,ÎT¼›äÎTâ ìÍT¼›ä âTÎTØDä<ÎTâ ÎTØDäâ|ÎTäóädÎTâ <ÎTäóäâ¤ÎT¨äŒÎTâdÎT¨ðŒ ä´ÎT´ÊTîx Tì°ÏT8>åèÎTä8>á$ÏTÿìä@ÏTïá\ÏTè|uJìxÏT褮Iì”ÏTèLÝIøèì4ÐTÜ“ äÀÏTäÜ“ üÏTÿìäÐTïí˜%PìðÐTxeäDÐTäxe€ÐTááÿåäœÐTïDá¸ÐTèЧIìÔÐTè ãIÿè<ÓTT[åÑTäT[<ÑTäÿåäXÑTïátÑTÿäÑTì â ÑTæáÐÑTœpè ÓTèâpêœpä ÑTäðÑTãáÀÒT2åÒTÐÑT2<ÒTÿèäxÒTähÒTäã ÑTì â ÑT ä¤ÒTè”ÒTì â ÑTðhÒTêüÒT,™äÐÒTæ,™èÒTäâ áé@ä$ÓT” ä ÓTâÐÒT” ðœpä4ÓT ÑTâXÓT„AäLÓT$üSæpÓT´‹ ähÓT0QTâ8ÕT0ˆä€ÓTˆÓTâ â¸ÓT0ˆèÕTèâpê0ˆäˆÓTäØÓTãá¨ÔT2äèÓT¸ÓT2$ÔTÿèä`ÔTäPÔTäãˆÓTì âˆÓT äŒÔTè|ÔTì âˆÓTðPÔTêÐÔTÄä¸ÔTæÄèâøÔTŒÄäàÔTâ¸ÔTŒÄèâ ÕTÀ äÕTâàÔTÀ ð0ˆä0ÕTˆÓTæ\AäHÕTÄ-æØÕT BädÕTä B ÕTÿìä¼ÕTïí$SMìðÕTÀˆäèÕT< Oâ ÖTì[ ÖTáÖT¼jOêÖT¼jOâ8ÖTô>å,ÖT<ŸPæÐÙTÐ[äHÖTTÖTæXâ„ÖTÜšèŒÙTèâpêÜšäTÖTä¤ÖTãát×T2ä´ÖT„ÖT2ðÖTÿèä,×Tä×TäãTÖTì âTÖT äX×TèH×Tì âTÖTð×Têœ×TÈ@ ä„×TæÈ@ èTâÄ×Tàtä¬×Tâ„×TàtèPâì×T\äÔ×Tâ ¬×T\0—IäHâØTœÂ äü×Tâ Ô×TœÂ 0—Iä@â<ØT80ä$ØTâ ü×T800—Iä8âdØT¸äLØTâ $ØT¸8POä$âŒØT|‚åtØTâLØT|‚é â´ØTáÞäœØTâtØTáÞèâÜØTØÿäÄØTâœØTØÿèâÙTÄ äìØTâÄØTÄ èâ,ÙTÔØäÙTâìØTÔØèâTÙTÀâä<ÙTâÙTÀâè â|ÙTÔòädÙTâ<ÙTÔòèâ¸ÙTøÇåŒÙTâdÙTøÇá¤ÙTè êèÜšäÈÙTTÖTâàÚTÔ‹ äàÙTäÔ‹ ÚTááÿåä8ÚTïDáTÚTèdýìpÚTøŒÚTø¨ÚTøÄÚTèpTÿìpˆäðÚTäpˆ,ÛTááÿåäHÛTïDádÛTèüKKì€ÛTèðÊJìœÛTèðþÿè€ÝTð” äÈÛTÐÛTâãÜTð” èPÝTèâpêð” äÐÛTä ÜTãáðÜT2ä0ÜTá ÜT2lÜTÿèä¨ÜTä˜ÜTäãÐÛTì âÐÛT äÔÜTèÄÜTì âÐÛTð˜ÜTêÝTt§ åÝTæt§ ¦Iäâ@ÝTàÆå(ÝTãÝTàÆá(ìJäâhÝT¤ÇäPÝTâ (ÝT¤ÇP ìð” äxÝTÐÛTâÝTä¥ä TÕNhÞT°¥ä ÝTä°¥ÜÝTÿìäøÝTïáÞTè|uJì0ÞT褮IìLÞTèLÝIøèì@ßT˜\äxÞTä˜\´ÞTÿìäÐÞTïáìÞTè|uJìßT褮Iì$ßTèLÝIøèìôàTÜBäPßT\ßTæ âlßTæâœßTŒ÷èÄàTèâpêŒ÷älßTä¼ßTãáŒàT2äÌßTœßT2àTÿèäDàTä4àTäãlßTì âlßT äpàTè`àTì âlßTð4àTê´àTÄäœàTæÄèâÜàTè–äÄàTâ œàTè–¼RìŒ÷äìàTlßTâáTìeä dSJ¼âT8Œ äáT áTæâPáTè èŒâTèâpêè ä áTäpáTãá@âT2ä€áTPáT2¼áTÿèäøáTäèáTäã áTì â áT ä$âTèâTì â áTðèáTê|âT8X äPâTæ8X hâTäâ êä¤âTð3äŒâTâPâTð3ðè ä´âT áTâ”ãTt‰äÌâTät‰ãTááÿåä$ãTïDá@ãTè(Pì\ãTè¼RìxãTÿô°ãTÔeä¤ãThGTæläT|” äÀãTä|” üãTááÿåääTïDá4äTè¼RêPäTè¼RÿêT\ä|äTP æ´äTLf¤äT˜äTô§Kê¬äTô§KãåTØ]äÄäTæØ]P âÿåLåT\• äåTæ\• 8ýäÿåÈçTD• ä\åTäD• ˜åTÿìä´åTïáÐåTèììåTèt!øæTì âæTæ âHæTè è˜çTèâpêè äæTähæTãá8çT2äxæTHæT2´æTÿèäðæTäàæTäãæTì âæT äçTè çTì âæTðàæTê`çTœ_ äHçTæœ_ èâˆçTXUäpçTâ HçTXU@TOäâ°çT¤b ä˜çTâ pçT¤b ìè äÀçTæTâ êT ]äØçTäçTæâèTÐ èÜéTèâpêÐ ääçTä4èTãáéT2äDèTèT2€èTÿèä¼èTä¬èTäãäçTì âäçT äèèTèØèTì âäçTð¬èTê,éTTäéTæTt!äâTéT¼ä<éTâéT¼èâ|éT´[ädéTâ <éT´[t!äâ¤éTxäŒéTâdéTxè âÌéT¬¦ä´éTâ ŒéT¬¦À°JäâôéT ÉäÜéTâ´éT ÉðÐ äêTäçTâÈêT • äêTä • XêTááÿåätêTïDáêTè| Nì¬êTè ÖQÿèøëTP?åØêTäP?áëTááÿåä0ëTïDá\ëTèLëTì â`‰MæxëTè8ýì”ëTÿä°ëTìæÈëTäØcä àëTœÐ°ëTîàTá°ëTè˜ìTü\äìTäü\DìTááÿåä`ìTïDá|ìTè8ýÿèTíTlŒ ä¨ìTälŒ äìTááÿååíTïDáíTè8ýì8íTè8ýÿêTCädíTÔJæœîTp^ä€íTäp^¼íTÿìäØíTïáôíTè8ýìîTèðþì,îTøHîTèðþìdîTø€îTèðþÿè<ïT°@å¬îTä°@áèîTááÿåäïTïDá ïTè Qø ¾ìLïTœ@å pýI\ïT´gä ¤ JðïT^älïTä^¨ïTÿìäÄïTïíàïTì âôšRæðT˜¦åðTâ `ðT˜¦ðTèæ0ðTä„ìä HðT´žðTí ðT4F ðTê xðTøüðTîØÙðTè ñTHgä ðTäHgÜðTááÿåäøðTïDáñTèäUSì0ñTè¤*ìLñTøhñTø„ñTÿô¸ñT,gä°ñTÄJâtòTìfäÈñTäìfòTááÿåä òTïDá<òTèdýìXòTè¼Rÿìè?å„òTòTæâÀòTxyè°ôTèâpêxyäòTäàòT ãá°óT2äðòTÀòT2,óTÿèähóTäXóTäãòTì âòT ä”óTè„óTì âòTðXóTêØóT|ÊäÀóTæ|ÊèãôTŒa äèóTâÀóTŒa è â(ôTl åôTâèóTl éâPôTuä8ôTâôTuèâxôTxÆ ä`ôTâ8ôTxÆ èâ ôTœ/äˆôTâ`ôTœ/èâÈôTÔØä°ôTâˆôTÔØðxyäØôTòTâ,õT8DäðôTæ8DP âÿå öTìgä<õTäìgxõTÿìä”õTïá°õTèX¾NìÌõTè@ÚJìèõTøöTè@µJøèìÀöT _ä0öTä _löTÿìäˆöTïá¤öTèlûJø\ûJìxúT@§äÐöTä@§ ÷Tááÿåä(÷TïDáT÷TèD÷Tì â ÏRæÐùTèp÷Tì â€÷Tæ$â°÷TÔè ùTèâpêÔä€÷TäÐ÷T ãá øT2äà÷T°÷T2øTÿèäXøTäHøTäã€÷Tì â€÷T 䄸TètøTì â€÷TðHøTêÈøTÌt ä°øTæÌt è âðøT¸L 䨸Tâ°øT¸L èâùTÈåùTâ ØøTÈ8ýäâ@ùT`å(ùTãùT`áPLä âhùTHŽäPùTâ(ùTHŽèâùTüÕäxùTâPùTüÕèâ¸ùT Éä ùTâxùT ÉðÔäÈùT€÷TâìùTøúTèäéQæâ$úTèðþê@úTø\úTèðþøèì”úT|ŠäˆúT8ýæPûTÌgä¤úTäÌgàúTááÿåäüúTïDáûTø4ûTè8ýø8ýìlûTHAå`ûTWQæDüTˆ ä|ûTäˆ ¸ûTááÿåäÔûT䌧TçDáðûTè¼Rê üTø(üTÿäxGKìäüTDäTüTäDüTááÿåä¬üTïDáÈüTè8ýøèðˆ^äôüTäˆ^0ýTááÿåäLýTä8ýçDáhýTø„ýTÿô$þTtDä°ýTätDìýTÿìäþTïý4ÿT‹ä4þTä‹pþTÿìäŒþTïá¨þTøÄþTøàþTè8ýìüþTøÿTè8ýÿèLÿTøŽ äDÿT(¤Nâ$U¼_ä\ÿTä¼_˜ÿTÿìä´ÿTïáÐÿTè<ÊSììÿTè@ÚJìUÿôpU°Aå4Uæ°AáP âÿå,UØŠä€UäØŠ¼UááÿåäØUäðþçDáôUèЧIìUèðþøðþêèUÄŽ ä<UäÄŽ xUááÿåä”UïDá°UèêÌUèðþÿæˆU¨_äøUä¨_4UááÿåäPUïDálUè(Pÿè¤UŽ ä˜U€{QæÐU– ä´UÀUæ â|"TæUh§äàUh&h§øž8ò¼ž8úPDä,UäPDhUÿìä„Uä¼RçýlUìhä°U¼Uæ âÌUæTâüUìè<Uèâ@êìäÌUäUãáìU2ä,UüU2hUÿèä¤Uä”UäãÌUì âÌU äÐUèÀUì âÌUð”UêUŒ]äüUæŒ]8ýäPâ<Uð5ä$Uâ üUð5¼RâLãU¼xäLUâ $U¼xdUäHâ âtUæäUïá¬UèdýìÈUøäUÿôÄUÔäUâ LUÔ(UäDâ â8UæäTUïápUèdýìŒUø¨UÿôìUPw äÔUâUPw è@âUÈ5äüUâ ÔUÈ5 ~Qä<â<Uìô ä$Uâ üUìô pƒLä,âdU ’äLUâ $U ’pƒLäâŒUø™ätUâLUø™áËJäâ´U(=äœUâtU(=èâÜUØhäÄUâ œUØh8ýä âUtäìUâ ÄUt8ýäâ,UœÑäUâ ìUœÑdýäâTUø<å<UâUø<ñìädUÌUâ@U˜‹ä|U䘋¸UÿìäÔUïáUèðUì ã Uæâ 0 U€ë„Uè˜Uä @ápøUæ€ëå UäP U ãá"¬ U`/ô U` U0 U`/œ UÿèäÈ Uìä Uøä Uì ã Uèü U0 U`/8 Uÿèäd Uìä Uì€ Uèä Uøœ Uê ã U ä\ U2ä¼ U0 U2ø Uÿèä$ Uäœ Uää Uì@ Uèä Uøœ Uê` Uä äl U0 Uä ¨ UâÿèäÔ Uìáâ U$â*åð Uèä Uì Uø( Uè8ýìD Uèèÿèd U$ù äp U0 U$ù ¬ UâÿèäØ Uìáâ U â)åô Uèä Uì Uø, Uè8ýìH Uÿô°Uhät U0 Uh° UâÿèäÜ Uìáâ Uâ(åø Uèä UìUè(ìJì0UèêLUè ¦IìhUè<§Iì”Uè„Uì âàpNÿâ|UäÀU0 UüUâÿèä(Uìáâ Uâ'åDUèä Uì`UèT¢IøêdU¨äŒU0 U¨ÈUâÿèäôUìáâ Uâ&åUèä Uì,UèT¢IìHUè öê0Uô" ätU0 Uô" °UâÿèäÜUìáâ Uâ%åøUèä UìUèT¢IøêlU0hä@U0 U0h|Uâÿèä¨Uìáâ U â$åÄUèä UìàUèT¢IìüUè êUèê4UøPUèÀ­Oÿê€ëä|Uá Uæ$ì¨Uá Uä0ââ0 U4äUÿä0ìâçÉêyùºÎŒ‚ªK© $UèT¢IøêUÈAåPUäÈAáŒUÿìä¨UïáÄUè|uJìàU褮IìüUèLÝIøèìœUh ä(Uäh dUááÿåä€UïDí¬²SêdU\‹ä¬U´Uâ âäU\‹è4Uèâpê\‹ä´UäUãáÔU2äUäU2PUÿèäŒUä|Uäã´Uì â´U ä¸Uè¨Uì â´Uð|UêüUÐääUæÐèâ$UL\ ä UâäUL\ èâLU”zä4Uâ U”zð\‹ä\U´Uæ, ätU€Uæ âUæâÀUˆ· è8Uèâpꈷ äUäàUãá°U2äðUÀU2,UÿèähUäXUäãUì âU ä”Uè„Uì âUðXUêØUüäÀUæüè ãU<äèUâÀU<èâ(UÐAäUâèUÐAèâPUhœä8Uâ Uhœdý숷 ä`UUâ€Up¨äxU˜wRâhUø— äUäø— ÌUááÿåäèUïDáUèüPì0Uè Uì â0ÃRæLUÿäèì´UÀ äxUæÀ P âÿåTU|iäÄUä|iáUááÿåäUä ~QçDá8UèÿèHU\EädUä\E Uÿìä¼UïáØUèìôUèìUèì,UÿôXUÜ— äXUäÜ— ”Uÿìä°UïáÌUè8ýìèUèìUø Uèðþì<Uÿäèì8UÐ`ähUtUæ4â¤U0G èUèâpê0G ätUäÄUãá”U2äÔU¤U2UÿèäLUä<UäãtUì âtU äxUèhUì âtUð<UêÐUá“ä¤U瓼Uä â (ê(äøU¨ôåàUâ¤U¨ôéâ U0äUâ àU0„ßMì0G ä0UtUâHU@Eä ´QUDiäXUäDi”Uááÿåä°Uä(PçDáÌUèìèUè¬&PÿèUBåUMSâ8UEä,U4dJæôU¬`äHUä¬`„Uááÿåä UïDá¼UøØUè¼Rÿè UŒä U Uæ  PæÀ Uð‹ä0 Uäð‹l Uááÿåäˆ UïDᤠUè8ýÿèÜ UðDäÐ UlQê$iäì Uæ$i!Uèæ!UäLÖä 4!U´Ü!Uì ì Uà" !Uè°"ULaä\!UäLa˜!Uÿìä´!UïáÐ!Uè8ýìì!Uèðþì"Uø$"Uèðþì@"Uø\"Uèðþìx"Uø”"Uèðþÿè4#U4FäÀ"Uä4Fü"Uÿìä#Uïí¼Rê $Up©äD#Uäp©€#Uÿìäœ#Uïá¸#Uè´øIìÔ#Uøð#Uèl:Jø¨SìX$UŒŒä$U挌P âÿå%U0aäh$Uä0a¤$UÿìäÀ$UïáÜ$Uèèøø$Uì âü+Kæà%UL©ä%UäL©T%Uÿìäp%UïáŒ%Uè|uJì¨%U褮IìÄ%UèLÝIøèì¸&U„ äð%Uä„ ,&UÿìäH&Uïád&Uè|uJì€&U褮Iìœ&UèLÝIøèìÔ&U0©äÈ&UlŠRæ(Uaää&Uäa 'Uÿìä<'UïáX'Uè8ýìt'Uèê'Uèðþì¬'UøÈ'Uèðþìä'Uù(Uèèøèìd)UÐiä,(UäÐih(Uÿìä„(Uïá (Uè8ýì¼(UøØ(Uøô(Uø)Uèðþì,)UøH)Uèèøèì@+UFät)U€)Uæ â)Uæ âÀ)U@©è+Uèâpê@©ä)Uäà)Uãá°*U2äð)UÀ)U2,*Uÿèäh*UäX*Uäã)Uì â)U ä”*Uè„*Uì â)UðX*UêØ*Uè~åÀ*Uæè~éã+U¤Þ äè*Uâ À*U¤Þ äâ(+U°¼ ä+Uâ è*U°¼ ì@©ä8+U)Uâà+UP˜ äP+UäP˜ Œ+Uäÿåä¨+UïáÄ+Uÿä¼Rê¸,U©äð+Uä©,,UááÿåäH,UïDád,Uè8ýì€,UèhÑRêœ,UÿäXÑRêø.Ud äÈ,UÐ,Uâã-Ud èÈ.Uèâpêd äÐ,Uä -Uãáð-U2ä0-Uá -U2l-Uÿèä¨-Uä˜-UäãÐ,Uì âÐ,U äÔ-UèÄ-Uì âÐ,Uð˜-Uê.Ulò å.Uælò 8ýäâ@.UÊä(.Uã.UÊèâh.U°åP.Uâ(.U°á8ýä â.U+ äx.Uâ P.U+ t!äâ¸.U>ä .Uâx.U>èâà.U ÉäÈ.Uâ .U Éðd äð.UÐ,Uâì0UШä/UäШD/Uááÿåä`/Uä ~QçDí|/Uì âŒ/Uæâ¼/UPè¼0Uèâ@êPäŒ/UäÜ/Uãá¬0U2äì/U¼/U2(0Uÿèäd0UäT0UäãŒ/Uì âŒ/U ä0Uè€0Uì âŒ/UðT0UêÔ0UÁä¼0UæÁðPää0UŒ/Uâ4U°Båü0U1Uæ â1UæÀâH1U|ë èì3Uèâpê|ë ä1Uäh1U ãá82U2äx1UH1U2´1Uÿèäð1Uäà1Uäã1Uì â1U ä2Uè 2Uì â1Uðà1Uê`2UäoäH2UæäoEMä´âˆ2U\åp2UâH2U\é°âÄ2UüJ ä˜2Uâ p2UüJ °2Uä¬â êäì2UH=äÔ2Uâ˜2UH=è¨â3Uxöäü2UâÔ2Uxöè¤â<3U„Zä$3Uâü2U„Zè âd3UXÒäL3Uâ$3UXÒèœâ 3U\Žät3Uâ L3U\ŽŒ3Uä|â ê äÜ3Ul5ä°3Uâ t3Ul5È3Uä<â @ê@ä4Uì}äì3Uâ °3Uì}@FLì|ë ä4U1UæhBå,4UähBáh4Uááÿåä„4UïDá 4Uè8ýø¬¨ìˆ6U,äÌ4UØ4Uæâ5U< èX6Uèâpê< äØ4Uä(5Uãáø5U2ä85U5U2t5Uÿèä°5Uä 5UäãØ4Uì âØ4U äÜ5UèÌ5Uì âØ4Uð 5Uê 6U€˜ä6U怘èâH6U¼ä06Uâ6U¼èâp6Uì¤äX6Uâ06Uì¤ð< ä€6UØ4Uâ 6U@‘ ä˜6U|ÖMâx7Uè˜ ä°6Uäè˜ ì6Uÿìä7Uïá$7Uèì‰Rì@7Uè8ýì\7UÿäèìP8UüFäˆ7UäüFÄ7Uÿìäà7Uïáü7Uè°¢Jì8Uèðþê48Uÿäèìœ8ULCå `8Uh&LCáè 8æê¬ 8ö¬8UHjä ¼¨S09U0jä¼8Uä0jø8Uááÿåä9UïDíЧIìL9U(‘ ä@9UX+-æh9Ujä\9U8ëSæ„9UœCåx9U ~QæUÀ• äü=UâÔ=UÀ• è4â<>Uˆ¡ä$>Uâü=Uˆ¡è0âd>Utt äL>Uâ$>Utt è,âŒ>U°: ät>UâL>U°: è(â´>U¼û äœ>Uât>U¼û è$âÜ>UôŸäÄ>Uâœ>UôŸè â?U Ÿ äì>UâÄ>U Ÿ èâ,?UÄ$ä?Uâì>UÄ$èâT?UüÁåä`‘Uâ8‘U$>èâ ‘UÀq 䈑Uâ`‘UÀq èâÈ‘UXpä°‘Uâ ˆ‘UXp„bJì„R 䨑UUæœ#äð‘Uâ ðUœ#’Uèâ8’U<Ìèp•Uèâpê<Ìä’UäX’Uãá(“U2äh’U8’U2¤’Uÿèäà’UäÐ’Uäã’Uì â’U ä “Uèü’Uì â’UðÐ’UêP“U$>ä8“Uæ$>è âè”UL—ä`“Uâ 8“UL—x“Uä â⨓U\ËèДUèpæ8’U\Ëäx“UäÈ“UãᘔU2䨓U¨“U2”UÿèäP”Uä@”Uäãx“Uì âx“U ä|”Uèl”Uì âx“Uð@”UêÀ”Uáí䨔UçíðŒyäДU⨔UŒyì•U´däø”Uâ`“U´dèâ8•U8ä •Uâø”U8èâ`•UáäH•Uâ •Uáè∕Uð1 äp•UâH•Uð1 ð<Ì䘕U’UâÈ•Uxkä°•Uâp‹Uxkð<‹ 䨕U@ŠUâü•UÿäèìH™U4” ä(–U0–Uâ0â`–U4” è™Uèâpê4” ä0–U䀖UãáP—U2ä–U`–U2Ì–Uÿèä—Uäø–Uäã0–Uì â0–U ä4—Uè$—Uì â0–Uðø–Uêx—UPä`—UæPè,â —Ušäˆ—Uâ `—Uš¼Rä(âÈ—U˜Ïä°—U∗U˜Ïè$âð—Ud°äØ—Uâ°—Ud°è â˜Uüÿå˜UâØ—Uüÿèâ@˜U€ßä(˜Uã˜U€ßèâh˜UÄÙäP˜Uâ(˜UÄÙèâ˜Uäx˜UâP˜Uè⸘UÈ ä ˜Uâx˜UÈ è âà˜Up äȘUâ ˜Up èâ™U¸L äð˜UâȘU¸L èâ0™U Éä™Uâð˜U Éð4” ä@™U0–Uâd™U¸läX™U,ÒLæšUl› ät™Uäl› °™UááÿåäÌ™UïDáè™UèüKKøðÊJðX‘äšU šUæ âˆÓTæ›U“ä@šUä“|šUäÿå䘚Uïá´šUè(ìJìКUè¤LìüšUèìšUì â¤LÿâÔ›UÀ­ä(›UäÀ­d›Uÿì䀛Uï᜛U訃K츛Uèø˜³K줜Uœ ää›Uâ DœUœ ü›UèæœUä4%ä ,œU¸Ìü›Uìä›UÈráü›Uê \œUœÑü›Uê tœU .ü›Uê ŒœU˜1 ü›Uî`—ü›UèDUè› ä´œUäè› ðœUÿìä Uïá(U訂Oøì‰IìpUHeäTU`Uæ âxUæ$ŸU|mä€UŒUæ âœUæâÌU€ãèôžUèâpê€ãäœUäìUã἞U2äüUÌU28žUÿèätžUädžUäãœUì âœU ä žUèžUì âœUðdžUêäžU@äÌžUæ@°°Jäâ ŸUL äôžUâÌžUL ð€ãäŸUœUâì Ueä4ŸU<ŸUâ âlŸUeè¼ Uèâpêeä<ŸU䌟Uãá\ U2䜟UlŸU2ØŸUÿèä Uä Uäã<ŸUì â<ŸU ä@ Uè0 Uì â<ŸUð Uê„ Up¬ äl Uæp¬ ¬¨ä⬠U¬>ä” Uâl U¬>èâÔ U0 ä¼ Uâ ” U0 ¼Rìeää U<ŸUâü¡Uø’äü Uäø’8¡UÿìäT¡Uä8ýçáp¡Uèdý쌡Uø¨¡Uè¼RêÄ¡Uè¼Rêà¡Uè¼Rÿèd¢UØ’ä ¢U䨒H¢Uááÿå÷DဢUôdät¢UÈrMæt£U”’ä¢Uä”’Ì¢Uááÿåäè¢UïDá£Uèê £Uèê<£UèìX£Uèèøèðd­ä„£U¼R欣UÔ• ä £U8ýæ¼£U¸• ä ìOU¤UH®äÌ£UæH®8ýäÿ娤Uˆ• ä¤U䈕 T¤Uÿìäp¤UïጤUèHlKøÔ)ìĤUdœ 两UèæܤULœ äÔ¤U Qâ¥UôKäì¤Uø¤Uæ â<ŸUæ$¥UäKä¥U,ÒLæÜ¥U¼eä4¥U@¥Uæ âP¥Uæäl¥UïሥUè줥UøÀ¥Uÿø¤eäì¥Uä¤e(¦UááÿåäD¦UïDá`¦UèüKKì|¦Uø˜¦Uø´¦UøЦUøì¦Uø§Uø$§Uø@§Uø\§Uè8ýêx§UèÜ—Tê”§UÿôP¨U – äÀ§Uä – ü§Uÿìä¨Uïá4¨Uè¤Lø¤-ì@©UHLä`¨Uh¨Uâæ€¨UäHLä ˜¨Uð«h¨Uê °¨UØJh¨Uê ȨUìÂh¨Uê à¨U^h¨Uê ø¨U¤Ü h¨Uê ©UÔÑh¨U ê (©U”Nh¨U@î ý h¨Uê\©U´”äP©UäŠPæü©U¤œ äl©U䤜 ¨©UááÿåäÄ©UïDáà©UèüKKÿ耪U$”ä ªUä$”HªUááÿåädªUïDíì­Uá”äªUœªUæ â̪UÀãèä¬Uèâ`êÀã䜪UäìªU ãἫU2äüªU̪U28«Uÿèät«Uäd«Uä㜪Uì ✪U ä «Uè«Uì ✪Uðd«Uêä«UøPäÌ«UæøPèâ ¬U8äô«UâÌ«U8èâ4¬U°±ä¬Uâô«U°±èâ\¬UdÞ äD¬Uâ¬UdÞ èℬU' äl¬UâD¬U' è ⬬UÔY䔬Uâl¬UÔYèâÔ¬UàD伬U┬UàDèâü¬Uà²ää¬U⼬Uà²ðÀãä ­UœªUæ nä$­Uä n`­Uÿìä|­UïᘭUè¼Rö¼RꨮU¸fäÄ­Uä¸fá®Uÿìä®Uïá8®Uè8ýìT®Uøp®Uè8ý쌮Uÿä¤-쀯UI帮UäIáô®Uÿìä¯Uïá,¯Uè$SMìH¯Uè¼Rêd¯Uÿä¼R꘯Uœfä¯UÐÖJâð¯Uè®ä¨¯Uâ Ø¯Uè®À¯Uáçæ¨¯Uäл èˆåáÀ¯Uáç°U¤Lå°Uä¤L<°UÿìäX°Uïát°Uè †JøÔ)ìh±U(oä °Uä(oܰUÿìäø°Uïá±Uè|uJì0±U褮IìL±UèLÝIøèì@²U<•äx±Uä<•´±UÿìäбUïáì±Uè|uJì²U褮Iì$²UèLÝIøèì$µU„fäP²U\²Uæ(⌲U€èô´Uèâpê€ä\²U䬲U ãá|³U2ä¼²UŒ²U2ø²Uÿèä4³Uä$³Uäã\²Uì â\²U ä`³UèP³Uì â\²Uð$³UꤳU¬r䌳Uæ¬r¼Rä$â̳UØÉä´³Uâ Œ³UØÉ¼Rä âô³Uì/äܳUâ ´³Uì/¼Räâ´UÐÁ ä´Uâ ܳUÐÁ ¼RäâD´Uá)ä,´Uâ´Uá)¼Räâl´UáRäT´Uâ,´UáR¼Räâ”´UDþä|´Uâ T´UDþ¼Rä â¼´U< 䤴Uâ |´U< ¼Räâä´U°aåÌ´U⤴U°aá¼Räâ µUœ0åô´UâÌ´Uœ0ñ€äµU\²U⨵Uànä4µUäànpµUááÿå䌵UïDí8ý츶U•丵Uä•ôµUááÿåä¶UïDá,¶Uè8ýìH¶Uød¶Uèt!쀶Uøœ¶UèäéQöèð´®äȶUä´®·Uááÿåä ·UïDá<·Uè¼RêX·Uèèìt·Uèèì·Uèèøèì0¸UЯä¼·UäЯø·Uÿìä¸Uïí8ýìì¸U¼¯ä@¸U伯|¸Uäÿå䘸Uïá´¸UèêIìиUÿäêIìĹUIåü¸UäIá8¹UÿìäT¹Uïáp¹Uè|uJ쌹U褮I쨹UèLÝIøèìXºUÔ äÔ¹UäÔ ºUÿìä,ºUïíHºUì âŒvNætºUáMähºUì"RæäºUÄo䄺Uâ ´ºUÄoœºUèæ„ºUäè@ä ̺UH✺Uî„øáœºUè¼U¨ äôºUä¨ 0»UÿìäL»Uïáh»UèŒì„»Uèê »Uø¼»UèðþìØ»Uøô»Uÿä°Iì ÁU ¯üÀU ¼U,¼Uæâ \¼U ¯xÀUèŒÀUä @ápìÀUæ ¯ä,¼Uä|¼Uãá"ؽU`/ ½UŒ¼U\¼U`/ȼUÿèäô¼Uìã,¼Uø½Uì â,¼Uè(½U\¼U`/d½Uÿèä½Uìã,¼U쬽Uè½UøȽUê â,¼U 䈾U2äè½U\¼U2$¾UÿèäP¾UäȽUäã,¼Uìl¾Uè½UøȽUê¿U Þ䘾U\¼U ÞÔ¾Uâÿèå¿Uìáá,¼Uâðñ½Uì°¿Uü™ä,¿U\¼Uü™h¿Uâÿè䔿Uìáá,¼Uâïñ½Uì`ÀU= äÀ¿U\¼U= ü¿Uâÿèä(ÀUìáá,¼U âîåDÀUè½Uÿì ¯äpÀU,¼Uæ$ìœÀU,¼Uä ââ\¼UàAØÀUÿä ìâ’Mm8gÏ–ªh ´ãÁU,¼UâPÃU(gäÁU(ÁUæâXÁU,%è ÃUèâpê,%ä(ÁUäxÁUãáHÂU2äˆÁUXÁU2ÄÁUÿèåÂUäðÁUäã(ÁUì â(ÁU ä,ÂUèÂUì â(ÁUððÁUêpÂUá)äXÂUç)¼Räâ˜ÂUáRä€ÂUâXÂUáR¼RäâÀÂUDþä¨ÂUâ €ÂUDþ¼Rä âèÂU< äÐÂUâ ¨ÂU< ¼RäâÃU°aåøÂUâÐÂU°aá¼Räâ8ÃUœ0å ÃUâøÂUœ0ñ,%äHÃU(ÁUâ(ÄU¤oä`ÃUä¤oœÃUááÿåä¸ÃUïDáÔÃUèLÝIìðÃUø ÄUÿä8ýíÅUˆoä8ÄUäˆotÄUááÿåäÄUïDá¬ÄUèdýìÈÄUèÖLìäÄUÿô ÅUdIåÅUädIáLÅUááÿåähÅUïDá„ÅUèdýøÖLìÌÈU4¯ä°ÅU¼ÅUæâìÅU4ò èœÈUèâpê4ò ä¼ÅUä ÆUãáÜÆU2äÆUìÅU2XÆUÿè䔯U䄯Uäã¼ÅUì â¼ÅU äÀÆUè°ÆUì â¼ÅUð„ÆUêŒÈU<0åìÆUæ<0áÇUäââ4ÇUì„ è\ÈUèâpêì„ äÇUäTÇUãá$ÈU2ädÇU4ÇU2 ÇUÿèäÜÇUäÌÇUäãÇUì âÇU äÈUèøÇUì âÇUðÌÇUêLÈUxQä4ÈUæxQèâtÈUôìä\ÈUâ4ÈUôìðì„ ä„ÈUÇUâ´ÈUÌ/åœÈUâìÆUÌ/áÇUì4ò äÄÈU¼ÅUâÀÉUœ– äÜÈU䜖 ÉUááÿåä4ÉUïDáPÉUèêlÉUèêˆÉUèê¤ÉUèÿè˜ÊUHIåÐÉUäHIá ÊUááÿåä(ÊUä8ýçDáDÊUèxGKì`ÊUø|ÊUÿä ä¨ÊUðþæ ÎUL— äÄÊUÐÊUæ$ãËU”èÜÍUèâ@ê”äÐÊUä ËU ãáðËU2ä0ËUá ËU2lËUÿèä¨ËUä˜ËUäãÐÊUì âÐÊU äÔËUèÄËUì âÐÊUð˜ËUêÌUˆWåÌUæˆW¼Râ âÜÌU,¶ä(ÌUã ÌU,¶@ÌUäâ âPÌUæälÌUïáˆÌUèdýì¤ÌUøÀÌUÿôÍUPw äìÌUâ(ÌUPw èâ,ÍU(=äÍUâìÌU(=èâTÍU´å<ÍUâÍU´áèäâ|ÍUªädÍUâ<ÍUªè â¤ÍUÈ5äŒÍUâ dÍUÈ5dýäâÌÍUœÑä´ÍUâ ŒÍUœÑdýäâôÍUø<åÜÍUâ´ÍUø<ñ”äÎUÐÊUâÈÎU\JåÎUä\JáXÎUÿìätÎUïáÎUèê¬ÎUèÿèhÏU4ž äØÎUä4ž ÏUÿìä0ÏUïáLÏUèønRø¤-ì@ÐUH°äxÏUäH°´ÏUÿìäÐÏUïáìÏUè|uJìÐU褮Iì$ÐUèLÝIøèìŒÐU$— äPÐUæ$— P âÿåØÐU¸•äœÐUh&¸•ܨ8ò ¨8öTÒUÈgäèÐUôÐUæâ$ÑU8÷è$ÒUèâpê8÷äôÐUäDÑUãáÒU2äTÑU$ÑU2ÑUÿèäÌÑUä¼ÑUäãôÐUì âôÐU äøÑUèèÑUì âôÐUð¼ÑUê<ÒU°aå$ÒUæ°aá¼Rì8÷äLÒUôÐUâôÓU¨gädÒUlÒUââœÒU¨gèÄÓUèâpê¨gälÒUä¼ÒUãáŒÓU2äÌÒUœÒU2ÓUÿèäDÓUä4ÓUäãlÒUì âlÒU äpÓUè`ÓUì âlÒUð4ÓUê´ÓUáë äœÓUçë èâÜÓU ÉäÄÓUâœÓU Éð¨gäìÓUlÒUâ¼ÕUž äÔU ÔUâ â<ÔUž èŒÕUèâ@êž ä ÔUä\ÔUãá,ÕU2älÔU<ÔU2¨ÔUÿèääÔUäÔÔUäã ÔUì â ÔU äÕUéÕUì â ÔUðÔÔUêTÕU– ä<ÕUæ– èâ|ÕU,²ädÕUâ<ÕU,²èâ¤ÕUÜäŒÕUâdÕUÜðž ä´ÕU ÔUâ°ÖUdgäÌÕUädgÖUááÿåä$ÖUïDá@ÖUè8ýì\ÖUøxÖUè8ýì”ÖUÿäèìdØU$JåÀÖUÌÖUæ âÜÖUæâ ×Uôïè4ØUèâpêôïäÜÖUä,×Uãáü×U2ä<×U ×U2x×Uÿèä´×Uä¤×UäãÜÖUì âÜÖU äà×UèÐ×Uì âÜÖUð¤×Uê$ØUðä ØUæðäèÙUä8á¼Rä ÚU@ÚUl¼Tô:â\¼TäܼTü  ÚUHÚUétÚUü:ᬨä&ÿÛU¨ÚUá¼RäÔÚUü:á´Uä'ÿâÛUé4ÛUü:ᬨä(þÜUÔpäpÛUäÔp¬ÛUÿìäÈÛUïáäÛUèëÜUÿäèìðÝU´ž ä,ÜUä´ž hÜUááÿåä„ÜUäüPçDá ÜUèüPì¼ÜUèêØÜUèêôÜUøÝUø,ÝUøHÝUødÝUèê€ÝUèêœÝUèèì¸ÝUèêÔÝUèöê¼ÞU˜ž åÞU䘞 <ÞUááÿåäXÞUäçDátÞUøÞUÿä¬ÞUì âpæØÞUè°äÌÞUìÌOæôÞU€ž äèÞUhöRæ@ßU˜ äßUæ˜ P âÿåàßUÔMäPßUäÔMŒßUÿìä¨ßUïáÄßUèHlKøÔ)ìøßUаäðßUØJâ¨äUHKåàUàUæ â$àUæä@àUïá\àUèdýìxàUÿä”àUì â¤àUæ0âÔàUèxäUèâ`êä¤àUäôàUãáÄáU2äáUÔàU2@áUÿèä|áUäláUäã¤àUì â¤àU ä¨áUè˜áUì â¤àUðláUêìáUXäÔáUæX¼Râ,ââU<åüáUâÔáU<á¼Râ(â<âU` ä$âUâ üáU` ¤*ä$âdâUl[äLâUâ $âUl[àUä âŒâUüätâUâLâUüèâPãU`Ð äœâUâ tâU`Ð ´âUäâ âÄâUæäàâUïáüâUèdýìãUø4ãUÿôxãUd<ä`ãUâ œâUd<¼Rââ ãUè³äˆãU`ãUè³¼RââÈãUèä°ãUâ ˆãUèØËMäâðãUð4äØãU°ãUð4@ôNâ âäU0êåäUâ ØãU0ê¼Râ â@äUÈ5ä(äUã äUÈ5 ~QäâhäU¸L äPäUâ(äU¸L èâäUðU äxäUâPäUðU ðä äU¤àUâÄäU¸Mä¸äUp¨MælçU8häÔäUàäUæâåU00è<çUèâpê00äàäUä0åU ãâæU2ä@åUåU2|åUÿèä¸åUä¨åUäãàäUì âàäU ääåUèÔåUì âàäUð¨åUê<æUØ©äæUæØ©(æUäâ êädæU(øäLæUâæU(øèâŒæUxHätæUâLæUxHèâ´æU © äœæUâtæU © èâÜæUèLäÄæUâœæUèLè âçU,äìæUâÄæU,èâ,çUÈIäçUâìæUÈIèâTçUx÷ä<çUâ çUx÷$§Sì00ädçUàäUâéUp–ä|çUˆçUæâ¸çU¸ èàèUèâpê¸ äˆçUäØçUãá¨èU2äèçU¸çU2$èUÿèä`èUäPèUäãˆçUì âˆçU äŒèUè|èUì âˆçUðPèUêÐèUx€ä¸èUæx€èâøèU ÉäàèUâ¸èU Éð¸ äéUˆçUâëUìJå éU,éUæâ\éUÔ_èÔêUèâpêÔ_ä,éUä|éUãáLêU2äŒéU\éU2ÈéUÿèäêUäôéUäã,éUì â,éU ä0êUè êUì â,éUðôéUêtêU,å\êUæ,á8ýä âœêUdYä„êUâ\êUdYèâÄêU`Wä¬êUâ„êU`WèâìêU¨äÔêUâ¬êU¨ðÔ_äüêU,éUâ¤ëU¤°äëU䤰PëUááÿåälëUä8ýçDáˆëUèdýøêDìU pä´ëUä pðëUááÿåä ìUïDá(ìUè¼Rÿè`ìUÐJåTìUØDPêt°äpìU|ìUæ â0QædíULåœìUäLáØìUÿìäôìUïáíUè$SMì,íUøHíUÿä8ýìèðU qätíU€íUæTâ°íU çè¸ðUèâ@ê çä€íUäÐíUãá îU2äàíU°íU2îUÿèäXîUäHîUäã€íUì â€íU ä„îUètîUì â€íUðHîUêÈîUŒ]ä°îUæŒ]8ýäPâðîUð5äØîUâ °îUð5âLâïU¼xåïUâ ØîU¼xdUäHâ@ïUÔä(ïUã ïUÔ(UäDâhïUPw äPïUâ(ïUPw è@âïUÈ5äxïUâ PïUÈ5 ~Qä<â¸ïUìô ä ïUâ xïUìô pƒLä,âàïU ’äÈïUâ  ïU ’pƒLäâðUø™äðïUâÈïUø™áËJäâ0ðU(=äðUâðïU(=èâXðUØhä@ðUâ ðUØh8ýä â€ðUtähðUâ @ðUt8ýäâ¨ðUœÑäðUâ hðUœÑdýäâÐðUø<å¸ðUâðUø<ñ çäàðU€íUâlñU„˜ äøðU䄘 4ñUÿìäPñUïí´øIì„ñUŸ ä|ñUxIRâhóUlLå”ñUälLáÐñUÿìäìñUïáòUèpcQì$òUø@òUø\òUè8ýìxòUèt%Kì”òUèüKKì°òUèüKKìÌòUèlQêèòUèlQêLóUèóUì âóUæä0óUïÿùôU„qäxóUä„q´óUááÿåäÐóUïDáìóUè ö ê¨ôU„NäôUä„NTôUÿìäpôUïáŒôUèlÝJÿèôôULLå¸ôUæLLáP âÿåöU4LåõUä4Lá@õUÿìä\õUïáxõUè¼Rì”õUø°õUèðþìÌõUøèõUèèøèì¤öUЖäöUäЖPöUááÿåälöUïDáˆöUèLÝIøèìpøUd˜ ä´öUÀöUæ âðöUâ|VÐÉ ädVâ <VÐÉ 8ýä:â¤VÈÂäŒVâ dVȼRâ6âÌVl¢ä´Vâ ŒVl¢¼Râ2âôVl¡äÜVâ´Vl¡á3Qä.â¸Vw äVâ ÜVw Vä*â â,VæäHVïádVèdýì€VøœVÿôàVPw äÈVâVPw è&âVÈ5äðVâ ÈVÈ5 ~Qä"â0VÀµ äVâðVÀµ è âXV¼ùå@VâV¼ùéâ€Và ähVâ@Và èâ¨V¤|äVâhV¤|èâÐV,ä¸VâV,èâøV(=äàVâ¸V(=èâ V˜†äVâ àV˜†üKKäâHVØhä0Vâ VØh8ýä âpVtäXVâ 0Vt8ýäâ˜VœÑä€Vâ XVœÑdýäâÀVø<å¨Vâ€Vø<ñ¼fäÐV VâèVá¡ ä 4[L¤V|OäøVä|O4VÿìäPVäðþçálVèèìˆVèðþø|èLìðV4³ä´Væ4³P âÿå V4˜å Vä4˜< VÿìäX Vïát Vè¨?Oÿè¬ VdOä  V˜âJæ¸#Vdiä¼ VÈ Væ,âø V Åèˆ#Vèâpê ÅäÈ Vä!V ãáè!V2ä(!Vø V2d!Vÿèä !Vä!VäãÈ Vì âÈ V äÌ!Vè¼!Vì âÈ Vð!Vê"VÄ äø!VæÄ ¼Rä(â8"V¬rä "Vâ ø!V¬r¼Rä$â`"VØÉäH"Vâ "VØÉ¼Rä âˆ"Vì/äp"Vâ H"Vì/¼Räâ°"VÐÁ ä˜"Vâ p"VÐÁ ¼RäâØ"Vá)äÀ"Vâ˜"Vá)¼Räã#VáRäè"VâÀ"VáR¼Räâ(#VDþä#Vâ è"VDþ¼Rä âP#V< ä8#Vâ #V< ¼Räâx#V°aå`#Vâ8#V°aá¼Räâ #Vœ0åˆ#Vâ`#Vœ0ñ Åä°#VÈ Vâl%VÄ  äÈ#VÔ#Væ âä#Væâ$V,è<%Vèâ@ê,ää#Vä4$Vãá%V2äD$V$V2€$Vÿèä¼$Vä¬$Väãä#Vì âä#V äè$VèØ$Vì âä#Vð¬$Vê,%VÜñä%VæÜñââT%Vtä<%Vâ%Vtð,äd%Vä#Vâ´&VLOä|%VäLO¸%VááÿåäÔ%VïDáð%Vè`fPì &Vø(&Vè¼RìD&Vèèì`&Vèèì|&Vè¼Rì˜&VèèøÈì'V˜äÄ&Vä˜á'Vááÿå÷Dá`*Vì—ä,'Väì—h'Vááÿåä„'VïDá(*Vè 'Vì â°'Væ¬âà'VÔòèø)VèâpêÔòä°'Vå(V ãáÐ(V2ä(Và'V2L(Vÿèäˆ(Väx(Väã°'Vì â°'V ä´(Vè¤(Vì â°'Vðx(Vêø(Vĵ äà(Væĵ è¨â )V<¹ä)Vâ à(V<¹8POä˜â\)V° ä0)Vâ )V° H)VäXâ @ê ä„)Vð²äl)Vâ0)Vð²èTâ¬)V¤rä”)Vâ l)V¤r8POäDâè)V²ä¼)Vâ ”)V²Ô)Väâ @ê ä*V˜äø)Vâ¼)V˜ðÔòä *V°'VâD*Vè Qø Qð   äp*V GUâˆ*VpNå üpO<,Vä˜ä˜*V¤*Væ â´*Væâä*Vhºè ,Vèâpêhºä´*Vä+VãáÔ+V2ä+Vä*V2P+VÿèäŒ+Vä|+Väã´*Vì â´*V ä¸+Vè¨+Vì â´*Vð|+Vêü+VVœOåx=VäœOá´=VäÿåäÐ=Vïáì=VèêIøêIì¨>V´´ä>Vä´´T>Vááÿåäp>VïDáŒ>Vÿäpÿì¸>Vô¢ ä `PN?VìPäÈ>VäìP?Vÿìä ?VïááçŒýéP€V¨€Vøé|€Vü:áX+-äŒý4ê?ÿíñÿÿÿÿââÍå‚ÀÿäðÿŒááÿÿÿ÷âŸå€Àô8‚VSäüVæSP âÿåô‚VøläH‚Väøl„‚Vÿìä ‚VïἂVè@ÚJìØ‚Vè¤#Kø(Kì̃V4¥ äƒVä4¥ @ƒVÿìä\ƒVïáxƒVè|uJ씃V褮Iì°ƒVèLÝIøèì„Väwä܃VæäwP âÿå4„Vø¤ ä(„VÀTæð„VÄQåD„VäÄQငVááÿå䜄VïDḄVøÔ„Vè8ýø8ýìä…V¤Qæ…Vä¤Qá<…VááÿåäX…VïDát…VèÖLì…Vø¬…VøÈ…Vÿôh†VôRäô…VäôR0†VááÿåäL†VïDí섆V¸läx†V@FLêœw䔆VÈæ°†V„¸ä ÀTP‡VÔxäÀ†VäÔxü†Vÿìä‡Vïá4‡VéúQø8 M윇V´Sä`‡Væ´S8ýäÿ夌V¸m䬇Vä¸mè‡VÿìäˆVïሌVè ˆVì â0ˆVæâ `ˆVlå ŒVèŒVä @ápxŒVælå ä0ˆV䀈Vãá"܉V`/$‰VˆV`ˆV`/̈VÿèäøˆVìã0ˆVø‰Vì â0ˆVè,‰V`ˆV`/h‰Vÿè䔉Vìã0ˆVì°‰Vè‰Vø̉Vê â0ˆV 䌊V2äì‰V`ˆV2(ŠVÿèäTŠVä̉Väã0ˆVìpŠVè‰Vø̉Vê<‹VxÍ䜊V`ˆVxÍØŠVâÿèä‹Vìáá0ˆV âïå ‹Vè‰VøÔ)ìì‹VÄ5 äL‹V`ˆVÄ5 ˆ‹Vâÿèä´‹Vìáá0ˆVâîåЋVè‰VøÔ)ðlå äü‹V0ˆVæHDJì(ŒV0ˆVä,ââ`ˆV)dŒVÿä,ìâü ÔÔs;Ѳ´ÀO¹%–ëÔ)ìDV¸ä´ŒVä¸ðŒVäÿåä Vïá(Vÿä¼Rê\V´xäTVÓQâVxälVxVæ âˆVæâ¸V« èàŽVèâpê« äˆVäØVãᨎV2äèV¸V2$ŽVÿèä`ŽVäPŽVäãˆVì âˆV 䌎Vè|ŽVì âˆVðPŽVêÐŽV¼$ 与Væ¼$ D·RäâøŽV`¾ äàŽVâ ¸ŽV`¾ ¼Rì« äVˆVâ(VRå V8€MâàVÌ¥ ä8VäÌ¥ tVááÿåäVïDá¬Vè`fPìÈVèìäVèèíVèèìVèèì8VèèìTVèèìpVèèìŒVèèì¨VèèìÄVèèøÈìH‘V˜mäðVä˜m,‘Vááÿå÷Dáü’V@äX‘Vd‘Væ ât‘VæT⤑VÔ—èÌ’VèâpêÔ—ät‘VäÄ‘Vãá”’V2äÔ‘V¤‘V2’VÿèäL’Vä<’Väãt‘Vì ât‘V äx’Vèh’Vì ât‘Vð<’Vê¼’Vؘ䤒VæؘèPâä’V äÌ’Vâ ¤’V WNìÔ—äô’Vt‘Væ°œ ä “VÖL渓VLyä(“VäLyd“Vÿì䀓VïᜓVÿä$üSìÔ“VTäÈ“VhZN欔VÈRåä“VäÈRá ”Vÿìä<”VïáX”Vè|uJìt”V褮Iì”VèLÝIøèìÈ”VüSä¼”VHqOæ„•Vn䨔Vän•Vááÿåä0•VïDáL•VèЧIìh•Vèðþÿè°•V žä”•V •Væ âüÞRæÜ•Vd¦ äÀ•VÌ•Væ â\dNæ$—VäSäì•VääS(–VááÿåäD–VïDá`–Vè`fPì|–Vø˜–Vèì´–VèèìЖVèèìì–Vèì—VèèøÈìÄ—V°Rå4—Vä°Ráp—Vááÿå䌗VïDᨗVèüKKødÉJð¤¸äÔ—V䤸˜Vááÿåä,˜VïDí8ýì ™V°SåX˜Vä°SᔘVÿìä°˜Vïá̘Vè$SMìè˜Vø™Vÿä8ýì<™VØyä0™VÌUæšVTäL™VäTˆ™Vÿì䤙VïáÀ™Vè|uJìÜ™V褮Iìø™VèLÝIøèììšV ä$šVä `šVÿìä|šVïᘚVè|uJì´šV褮IìКVèLÝIøèìÄ›VhTäüšVähT8›VÿìäT›Vïáp›Vè|uJ쌛V褮I쨛VèLÝIøèì@¤V´¦ 0¤VÔ›Và›Væâ œV´¦ ¬£VèÀ£Vä @áp ¤Væ´¦ äà›Vä0œVãá"ŒV`/ÔœV@œVœV`/|œVÿè䨜Vìãà›VøÄœVì âà›VèÜœVœV`/VÿèäDVìãà›Vì`VèÄœVø|Vê âà›V ä<žV2äœVœV2ØVÿèäžVä|Väãà›Vì žVèÄœVø|VêìžVàÊäLžVœVàʈžVâÿèä´žVìááà›VâãåОVèÄœVøˆõL윟VdÒäüžVœVdÒ8ŸVâÿèädŸVìááà›Vââ借VèÄœVøì0 V-䬟VœV-èŸVâÿèä Vìááà›VâáñÄœVìÄ V‡ä@ VœV‡| Vâÿè䨠Vìááà›VâàñÄœV씣V &äÔ VœV &¡Vâÿèä<¡Vìááà›V âßåX¡VèÄœVì\£Vèt¡Vì â„¡Væâ´¡Vhè,£Vèâpêhä„¡VäÔ¡VãᤢV2ää¡V´¡V2 ¢Vÿèä\¢VäL¢Väã„¡Vì â„¡V 䈢Vèx¢Vì â„¡VðL¢VêÌ¢V Lä´¢Væ L0—Iäâô¢V < äÜ¢Vâ ´¢V < 0—Iäâ£VCä£Vâ Ü¢VCäâD£V\Ï ä,£Vâ£V\Ï ðhäT£V„¡Vâx£Vÿø´¦ 䤣Và›Væ$ìУVà›Vä(ââœVüù ¤Vÿä(ìâMm8gÏ–ªh ´ã8¤Và›VâP¥VtSåP¤VätSጤVÿì䨤VïáĤVèìà¤Vøü¤Vèðþì¥Vø4¥Vèèøèìð¥V žä`¥Vä žœ¥Vááÿå严Väð»IçDáÔ¥VÿäH½IìX¦VHTå¦VäHT<¦Vÿì÷嘦 äh¦V䘦 ¤¦VááÿåäÀ¦VïDíܦVì âì¦Væâ§V8'è4©Vèâ@ê8'äì¦Vä<§V ãá ¨V2äL§V§V2ˆ§VÿèäħVä´§Väãì¦Vì âì¦V äð§Vèà§Vì âì¦Vð´§Vê4¨VhH ä¨VæhH ¼Rââ\¨VˆÚäD¨Vâ ¨VˆÚ8ýäℨVÄMäl¨VâD¨VÄMè⬨Vc 䔨Vâl¨Vc èâÔ¨V˜¥ä¼¨Vâ ”¨V˜¥¼Râ âü¨Vh)ää¨Vâ ¼¨Vh)¼Rââ$©VDä ©Vâä¨VDèâL©Vhœä4©Vâ ©Vhœdýì8'ä\©Vì¦Vâ<ªV€§ ät©V䀧 °©VÿìäÌ©Vïáè©Vè|uJìªV褮Iì ªVèLÝIøèì«Vž äLªVäž ˆªVÿì䤪VïáÀªVè|uJìܪV褮IìøªVèLÝIøè옫VXTå$«VäXTá`«Vÿìä|«Vïí$µP쨫VH¹ä ìUJH¬VhŸä¸«VähŸô«Vááÿåä¬VïDá,¬Vèì‰Iø¤-ìd¬VUäX¬V ZJæ¬V@Tåt¬V€¬Væ â,…Uê§ ä ¬Vä§ ܬVááÿåäø¬VïDá­Vè8ýì0­VèÈêL­VèÈöÈê$®V”Tåx­Vä”Tá´­VÿìäЭVïáì­Vè¼Rê®Vè¼Rÿèü®Vºä4®Väºp®Vááÿå䌮VïDᨮVèLJìÄ®Vøà®VÿäÔ)쬯VèUä ¯VäèUH¯Vÿìäd¯Vïá¯V耯Vì âÀäLò|èLìø¯Vä¹ä¼¯Væä¹P âÿå|°V¨ž ä°V䨞 D°Vÿìä`°Vïí$µP쌰VÔzä |VJd±Vz䜰VäzذVááÿåäô°VïDá±VèhÑRê,±VøH±Vè8ýøèì,³V”Uät±V|±Vâ⬱V”Uèü²Vèâpê”Uä|±Vä̱VãᜲV2äܱV¬±V2²VÿèäT²VäD²Väã|±Vì â|±V 䀲Vèp²Vì â|±VðD²VêIJV°â嬲Væ°âáÀ°Jäâì²V<°äÔ²V⬲V<°èâ³V Éäü²VâÔ²V Éð”Uä$³V|±Vâ ´V„nä<³Vä„nx³Vááÿå䔳VïDá°³Vè8ýì̳Vøè³Vè8ýì´VÿäèìL´V̧ ä0´V<´Væ â4âMê€zä\´Vä€z˜´Vÿìä´´VäçáдVøì´VèÿèܶV<¨ äµVä<¨ TµVááÿåäpµVäüPçDጵVèüP쨵Vè¼RêĵVè¼RêàµVøüµVø¶Vø4¶VøP¶Vè¼Rêl¶Vè¼RꈶVèè줶Vè¼RêÀ¶Vè¼Rö¼Rêø¶VˆVäì¶V,1OæзV0Ÿ ä·Vä0Ÿ D·Vÿìä`·Vïá|·Vè|uJ옷V褮Iì´·VèLÝIøèì¸V|ºäà·Væ|ºP âÿåH¸VüŸ8¸V,¸V°ê@¸V°â\¼V4UåX¸Vd¸Væ ât¸Væä¸VïᬸVèdýìȸVÿää¸Vì âô¸Væ0â$¹Vˆè,¼Vèâ`êˆäô¸VäD¹VãáºV2äT¹V$¹V2¹Vÿèä̹Vä¼¹Väãô¸Vì âô¸V äø¹Vèè¹Vì âô¸Vð¼¹Vê<ºVXä$ºVæXâ,âdºV<åLºVâ$ºV<áâ(⌺V` ätºVâ LºV` ¤*ä$â´ºVl[䜺Vâ tºVl[d¸Vä âܺVüäĺV✺Vüèâ»V`Ð äìºVâ ĺV`Ð ´âUäâ,»Vd<ä»Vâ ìºVd<ââT»Vè³ä<»V»Vè³ââ|»Vèäd»Vâ <»VèØËMä⤻Vð4䌻Vd»Vð4@ôNâ âÌ»V0êä´»Vâ Œ»V0êâ âô»VÈ5äÜ»Vâ ´»VÈ5 ~Qäâ¼V¸L ä¼VâÜ»V¸L èâD¼VðU ä,¼Vâ¼VðU ðˆäT¼Vô¸Vâx¼VlVäl¼V,7Læ,¾Vԟ䈼V”¼Væ ⤼VæâÔ¼V\æ èü½Vèâpê\æ 䤼Väô¼VãáĽV2ä½VÔ¼V2@½Vÿèä|½Väl½Vä㤼Vì ⤼V 䨽V蘽Vì ⤼Vðl½Vêì½VËäÔ½VæËè â¾VÐl äü½Vâ Ô½VÐl ÞMì\æ ä$¾V¤¼VâD¾Vhºä<¾V´*Vâä¾VTºäT¾VäTº¾Vááÿå䬾Vä8ýçDáȾVèdýø¼Rê„¿V8{äô¾Vä8{0¿VááÿåäL¿VïDáh¿Vèÿè ¿VU唿V|OæÌ¿V8ºä°¿V¼¿Væ âløNæPÀVì§ äÜ¿Väì§ ÀVááÿåä4ÀVïDí8ýìÂV0Vä`ÀVhÀVâ â˜ÀV0VèèÁVèâpê0VähÀVä¸ÀVãáˆÁV2äÈÀV˜ÀV2ÁVÿèä@ÁVä0ÁVäãhÀVì âhÀV älÁVè\ÁVì âhÀVð0ÁVê°ÁVÄü ä˜ÁVæÄü èâØÁV¬» äÀÁVâ˜ÁV¬» èãÂV¨äèÁVâÀÁV¨ð0VäÂVhÀVæàTå àëTÃVìoä8ÂVäìotÂVÿìäÂVïá¬ÂVè8ýìÈÂVøäÂVè8ýíÃVÿä¤-ìØÃVì{ä,ÃVäì{hÃVÿìä„ÃVïá ÃVè8ýì¼ÃVÿäèì°ÄV€UåèÃVä€Uá$ÄVÿìä@ÄVïá\ÄVè$SMìxÄVèê”ÄVÿäêÌÄV© äÀÄV Uæ|ÅVȨ äÜÄVäȨ ÅVááÿåä4ÅVïDáPÅVè¼ÞPølÅVì â¼ÞPæTÆV¤oäŒÅVä¤oÈÅVÿìääÅVïâÆVè|uJìÆV褮Iì8ÆVèLÝIøèì,ÇVüŸ ädÆVäüŸ  ÆVááÿå伯VïDáØÆVèüKKìôÆVøÇVÿä Uê¼ÉVøºä<ÇVHÇVæ âXÇVæâˆÇVôgèŒÉVèâpêôgäXÇVä¨ÇV ãáxÈV2ä¸ÇVˆÇV2ôÇVÿèä0ÈVä ÈVäãXÇVì âXÇV ä\ÈVèLÈVì âXÇVð ÈVê´ÈV|NäˆÈVæ|N ÈVäâ êäÜÈV@äÄÈVâˆÈV@èâÉV´é äìÈVâÄÈV´é èâ,ÉVä äÉVâìÈVä è âTÉVÀä<ÉVâÉVÀèâ|ÉV<‰ädÉVâ<ÉV<‰èâ¤ÉVk äŒÉVâdÉVk ðôgä´ÉVXÇVâ°ÊV¸ºäÌÉV为ÊVááÿåä$ÊVïDá@ÊVèê\ÊVèèìxÊVèèì”ÊVèèøèìˆËVT{äÀÊVäT{üÊVááÿåäËVïDá4ËVè8ýìPËVèÈìlËVèÈøÈìDÌV( ä˜ËVä( ÔËVááÿåäðËVïDá ÌVè8ýì(ÌVÿø@oäTÌV`ÌVæ âpÌVæäŒÌVïá¨ÌVè8ýÿèàÌV¼ äÔÌV8_Kæ¸ÍVÄ© äðÌVäÄ© ,ÍVÿìäHÍVïádÍVè|uJì€ÍV褮IìœÍVèLÝIøèìäÍV¤© ÔÍVÈÍVØoUêÜÍVØoUâ¼ÎVlpäôÍVälp0ÎVÿìäLÎVïáhÎVéúQì„ÎVø ÎVèÿæ\ÏVì»äÌÎVäì»ÏVÿìä$ÏVïá@ÏVè¤LÿèÄÏVPpälÏVäPp¨ÏVááÿå÷DádÐV<|äÔÏVä<|ÐVÿìä,ÐVïáHÐVè(ìJødVì|ÐV |ätÐV|ÑQâ˜ÐV¬»äŒÐVÄÐSæ8ÖVP  ä¨ÐV´ÐVæ<âäÐVD¾ èôÕVèâpêD¾ ä´ÐVäÑVãáÔÑV2äÑVäÐV2PÑVÿèäŒÑVä|ÑVäã´ÐVì â´ÐV ä¸ÑVè¨ÑVì â´ÐVð|ÑVêüÑVðËääÑVæðËè:â$ÒVľ ä ÒVâäÑVľ è8âLÒV4<ä4ÒVâ ÒV4<è6âtÒVä÷ä\ÒVâ4ÒVä÷è4âœÒVÀä„ÒVâ\ÒVÀè2âÄÒV¸ä¬ÒVâ„ÒV¸è0âìÒV¥ äÔÒVâ¬ÒV¥ è.âÓV”9 äüÒVâÔÒV”9 è,â<ÓVèLä$ÓVâüÒVèLè*âdÓVŒËäLÓVâ$ÓVŒËè(âŒÓVHätÓVâLÓVHè$â´ÓVŒŠåœÓVâtÓVŒŠé"âÜÓVxèäÄÓVâœÓVxèè âÔVðºäìÓVâÄÓVðºèâ,ÔV4- äÔVâìÓV4- èâTÔV`òä<ÔVâÔV`òèâ|ÔV„$ädÔVâ<ÔV„$èâ¤ÔV@« äŒÔVâdÔV@« èâÌÔV(œä´ÔVâŒÔV(œèâôÔVäÜÔVâ´ÔVèâÕVØäÕVâÜÔVØè âDÕVlDä,ÕVâÕVlDè âlÕVL‡äTÕVâ,ÕVL‡è â”ÕVèÀä|ÕVâTÕVèÀèâ¼ÕV”ä¤ÕVâ|ÕV”èâäÕVÚäÌÕVâ¤ÕVÚèâ ÖV˜¨äôÕVâ ÌÕV˜¨ ÖVè êèD¾ ä0ÖV´ÐVâØVX»äHÖVTÖVæâ„ÖVXèÔ×Vèâ@êXäTÖVä¤ÖVãát×V2ä´ÖV„ÖV2ðÖVÿèä,×Vä×VäãTÖVì âTÖV äX×VèH×Vì âTÖVð×Vêœ×Vü&ä„×Væü&pƒLäâÄ×VÜñä¬×Vâ „×VÜñ¼Rââì×VtäÔ×Vâ¬×VtðXäü×VTÖVâ ØV|äØV€{QæÙV  ä0ØVä  lØVááÿåäˆØVïDá¤ØVè¼RêÀØVè¼RêÜØVè¼RêøØVè¼Rÿì¼Uå$ÙVä¼Uá`ÙVááÿåä|ÙVä8ýçDá˜ÙVèxGKì´ÙVøÐÙVÿä¼RêŒÚVмäüÙVäм8ÚVÿìäTÚVïápÚVè8ýøt!ìdÛVè|äœÚVäè|ØÚVÿìäôÚVïáÛVè|uJì,ÛV褮IìHÛVèLÝIøèìXÜV¸pätÛVä¸p°ÛVÿìäÌÛVïáèÛVè\èJìÜVè(ìJì ÜVè\èJì<ÜVè ö<§IìhÜV¤¼ä xûO„ÞV˜WäxÜV„ÜVæ â´ÜVŒ‡èTÞVèâpꌇä„ÜVäÔÜVãá¤ÝV2ääÜV´ÜV2 ÝVÿèä\ÝVäLÝVäã„ÜVì â„ÜV äˆÝVèxÝVì â„ÜVðLÝVêÌÝV¸L ä´ÝVæ¸L èâôÝVhäÜÝVâ ´ÝVhÀ°JäâÞVœ£äÞVâ ÜÝVœ£PLäâDÞV\ˆä,ÞVâÞV\ˆèâlÞV ÉäTÞVâ,ÞV ÉðŒ‡ä|ÞV„ÜVâ4âVtWä”ÞVœÞVâ$âÌÞVtWèâVèâpêtWäœÞVäìÞVãá¼ßV2äüÞVÌÞV28ßVÿèätßVädßVäãœÞVì âœÞV ä ßVèßVì âœÞVðdßVê|áVÐ(äÌßVæÐ(äßVä â âôßVæâ$àVX) èLáVèâpêX) äôßVäDàVãááV2äTàV$àV2àVÿèäÌàVä¼àVäãôßVì âôßV äøàVèèàVì âôßVð¼àVê<áVDX ä$áVæDX è âdáVˆ~äLáVâ $áVˆ~àüKìX) ätáVôßVâ¤áV'åŒáVâÌßV'áÀ°JäâÌáVÈ+å´áVâŒáVÈ+áÀ°JäâôáV%åÜáVâ´áV%áÀ°JäââVð*åâVâÜáVð*áÀ°JìtWä,âVœÞVâÀãVª äDâVPâVæ â`âVæââV¤´èãVèâpꤴä`âVä°âVãá€ãV2äÀâVâV2üâVÿèä8ãVä(ãVäã`âVì â`âV ädãVèTãVì â`âVð(ãVê¨ãV07 äãVæ07 줴ä¸ãV`âVâ´äVª äÐãVäª äVááÿåä(äVïDáDäVèdýì`äVè¼Rê|äVè¼Rê˜äVÿôTåVVåÄäVäVâåVááÿåäåVïDá8åVèüKKøœÉLðdWädåVädW åVÿìä¼åVä¼RçáØåVøôåVè¼RÿèèæV0Xä æVä0X\æVÿìäxæVïá”æVè|uJì°æV褮IìÌæVèLÝIøèíçVôª äøæVÕPâØçVD¢äçVäD¢LçVÿìähçVïá„çVè|uJì çV褮Iì¼çVèLÝIøèì°èV¢äèçVä¢$èVÿìä@èVïá\èVè|uJìxèV褮Iì”èVèLÝIøèìÜèV$¡ ÌèVÀèVTJêÔèVTJâ€éVÄ¡péVìèVøèVæä(éVÄ¡öâ`éVæÄ¡äøèVäHéVãåÄ¡äXéVøèVâ‘¿3)6{Ò²ÀO˜>`ãxéVøèVâ êV$½äéVä$½ÌéVÿìäèéVïáêVèpcQÿèlêV,qä0êVæ,qP âÿåÔîVXÄîV|êVˆêVæâ ¸êVX@îVèTîVä @áp´îVæXäˆêVäØêVãá"4ìV`/|ëVèêV¸êV`/$ëVÿèäPëVìãˆêVølëVì âˆêVè„ëV¸êV`/ÀëVÿèäìëVìãˆêVììVèlëVø$ìVê âˆêV ääìV2äDìV¸êV2€ìVÿèä¬ìVä$ìVäãˆêVìÈìVèlëVø$ìVêxíVèëäôìV¸êVèë0íVâÿèä\íVìááˆêVâêñlëVì(îVh£äˆíV¸êVh£ÄíVâÿèäðíVìááˆêV âéå îVèlëVø îXä8îVˆêVæ$ìdîVˆêVäââ¸êVT îVÿäìâ"æÀåFãÌîVˆêVâ ôV”¡ääîV䔡 ïVááÿåä<ïVïDáXïVøtïVøïVø¬ïVèt!èâÈïVøòVèäïVì âôïVæâ$ðVÊéìñVèâpêÊåôïVäDðVãáñV2äTðV$ðV2ðVÿèäÌðVä¼ðVäãôïVì âôïV äøðVèèðVì âôïVð¼ðVê<ñV~ ä$ñVæ~ ÈäâdñVäLñVâ $ñV8ýäâŒñV̼ätñVâ LñV̼t!ä â´ñVÜ äœñVâtñVÜ èâÜñVĉäÄñVâ œñVĉø÷KââòV ÉäìñVâÄñV ÉðÊåòVôïVî8òVì âHòVæâxòVXÔèðóVèâpêXÔäHòVä˜òVãáhóV2ä¨òVxòV2äòVÿèä óVäóVäãHòVì âHòV äLóVè<óVì âHòVðóVêóV@¶ äxóVæ@¶ è â¸óV4èä óVâxóV4èèâàóV,bäÈóVâ óV,bèâôV ÉäðóVâÈóV ÉðXÔäôVHòVâ<ôVð  ä0ôV4fOꘪ äLôV䘪 ˆôVááÿåä¤ôVïDáÀôVèøèìôôVt« äìôVtJâ”õVH« äõVäH« @õVÿìä\õVïáxõVè<NÿèöV´qä¤õVä´qàõVÿìäüõVïítNìœöVä}ä(öVää}döVÿìä€öVïíÀMìèöV¸¡ ä¬öV渡 P âÿå¤÷V´}äøöVä´}4÷VááÿåäP÷VäðþçDál÷VèЧIìˆ÷VèðþøðþêÀ÷VHqä´÷VÄ RæÜ÷VôXäÐ÷VXcOæ|øVˆ}äì÷Väˆ}(øVááÿåäDøVä8ýçDá`øVèöêùVl}äŒøVäl}ÈøVááÿåääøVïDâùVèöêÀúV`¡ ä,ùV8ùVæâhùVÀèúVèâpêÀä8ùVäˆùVãáXúV2ä˜ùVhùV2ÔùVÿèäúVåúVäã8ùVì â8ùV ä<úVè,úVì â8ùVñúVê€úVÄü ähúVæÄü èâ¨úV¨äúVâhúV¨ðÀä¸úV8ùVâÐúV°Xä ÜÊM\üVœ¢äàúVìúVæ âüúVæâ,ûVø¬ è,üVèâpêø¬ äüúVäLûVãáüV2ä\ûV,ûV2˜ûVÿèäÔûVäÄûVäãüúVì âüúV åüVèðûVì âüúVðÄûVêDüVw ä,üVæw 8ýìø¬ äTüVüúVâýVX}älüVäX}¨üVÿìäÄüVïáàüVè¼RêüüVè¼RÿêD}ä(ýVäD}dýVð€ýVöôéôýVççäçæáááxýâ6â? ä þVä4ê(#ýPþV4¬ äHþVÔTâlþV¬ ä`þVxMæˆþV´~ä|þV äPæ˜þVТ ä VJ´þVWãáè>W2ä(>Wø=W2d>Wÿèä >Wä>WäãÈ=Wì âÈ=W äÌ>Wè¼>Wì âÈ=Wð>Wê?WŠäø>WæŠè#â8?WX¨ä ?Wâø>WX¨è"ât?WáëäH?Wâ ?Wáë`?Wäâ êä°?W4³ ä„?Wâ H?W4³ œ?Wäâ êäØ?W\äÀ?Wâ„?W\èã@Wàpäè?WâÀ?Wàpð”Âä@WÈ=Wâ¼AWxÂä(@W4@Wæâd@W8ÏèŒAWèâ@ê8Ïä4@Wä„@WãáTAW2ä”@Wd@W2Ð@Wÿèä AWäü@Wäã4@Wì â4@W ä8AWè(AWì â4@Wðü@Wê|AW`â ädAWæ`â èâ¤AWtäŒAWâdAWtð8Ïä´AW4@WâØAW\ÂäÌAW\8NæDWÌtäèAWôAWæ âBWæâ4BW@×èÔCWèâpê@×äBWäTBWãá$CW2ädBW4BW2 BWÿèäÜBWäÌBWäãBWì âBW äCWèøBWì âBWðÌBWêLCWhœä4CWæhœdýäâtCWÐAä\CWâ4CWÐAè âœCW<ä„CWâ\CW<èâÄCWüä¬CWâ„CWüèâìCWðäÔCWâ¬CWðð@×äüCWBWâøDW äDWä PDWááÿåälDWïDáˆDWèdÉJì¤DWøÀDWøÜDWÿôEWh¦äEW|ÊMêä¥ ä$EW\jLæ$FWx‚ä@EWäx‚|EWÿìä˜EWïá´EWèêÐEWèêìEWèìFWÿäX+-ì¨FWŒ§ä4FW䌧pFWÿìäŒFWïí8ýìÄFWh‚ä¸FWêdGWX¯ äÔFWäX¯ GWÿìä,GWïáHGWÿäèì`ëêIìì}W^å$}Wä^á`}Wÿìä|}Wïá˜}Wè|uJì´}W褮IìÐ}WèLÝIøèìÄ~WôÅäü}WäôÅ8~WÿìäT~Wïáp~WèX¾NìŒ~Wø¨~Wè@µJøèì€Wð¨ äÔ~Wäð¨ Wÿìä,WïáHW訂OìdWèöê˜W¬„äW¨âJ⌀WÀ]å¨WäÀ]áäWÿìå€Wïá€Wè8ýì8€Wè¼RêT€Wè¼Rìp€WÿäèìdW”„䜀W䔄؀Wááÿåäô€WïDáWè|uJì,W褮IìHWèLÝIøèìD„W©ätW|WâXâ¬W©è„Wèâpê©ä|WäÌW ãᜂW2äÜW¬W2‚WÿèäT‚WäD‚Wäã|Wì â|W 䀂Wèp‚Wì â|WðD‚WêØ‚WHI䬂WæHIÄ‚Wä0â (ê(åƒWPÙäè‚W⬂WPÙè,â<ƒWsäƒWâ è‚Ws(ƒWäâ êädƒWDåäLƒWâƒWDåè⌃Wh ätƒWâLƒWh èâ´ƒW4' 䜃WâtƒW4' è â܃W,BäăW✃W,Bèâ„W Ä äìƒWâăW Ä èâ,„WåXâÜX(>áP ìÄ€ä,X XâLXÄ€äDX XâtXáå\Xâì Xáñd‚ä„X¼ XâœXŒ¯ äœX䌯 ØXááÿåäôXä8ýçDáXø,XøHXødXø€XèxùKøT7Vì´X¼~ä¬Xü WâüX¨~äÄXä¨~áXÿìäXïá8XøTXøpXè8ýìŒXø¨XøÄXøàXèèøŒ Mì Xˆ~ä Xäˆ~HXÿìädXä8ýçá€XèdýìœXø¸XøÔXè¼RêðXè¼Rÿè(Xl¯ äX  WçX°cå8Xä°cátXááÿåäXïDá¬XèdýìÈXøäXÿôÈXP¯ äXXâ âHXP¯ è˜XèâpêP¯ äXähXãá8X2äxXHX2´XÿèäðXäàXäãXì âX äXè Xì âXðàXê`Xü¦äHXæü¦ÈÌLäâˆXØCäpXâ HXØCXd€äø=XœÛMæ°BXX >Xæ â0>XæTâ`>XÀÈè€BXèâpêÀÈä0>Xä€>XãáP?X2ä>X`>X2Ì>Xÿèä?Xäø>Xäã0>Xì â0>X ä4?Xè$?Xì â0>Xðø>Xêx?X„óä`?Xæ„óèPâ ?XØA äˆ?Xâ`?XØA èLâÈ?X8Oå°?Xâˆ?X8OéHâð?X$GäØ?Xâ°?X$GèDâ@Xd!å@XâØ?Xd!è@â@@Xà9 ä(@Xã@Xà9 è<âh@X¸Ù äP@Xâ(@X¸Ù è8â@Xè~åx@XâP@Xè~é4â¸@X0(ä @Xâ x@X0(8ýä0âà@X„ äÈ@Xâ  @X„ ä,âAX¤b äð@Xâ È@X¤b ä(â0AX„.åAXâð@X„.áä$âXAX<)ä@AXâ AX<)ä â€AXXUähAXâ @AXXU@TOäâ¨AX¤üäAXâ hAX¤üäâÐAX°Zä¸AXâ AX°ZäâøAXÔäàAXâ ¸AXÔäâ BXlUåBXâàAXlUáä âHBX€âä0BXâ BX€âäâpBX°¼ äXBXâ 0BX°¼ äâ˜BX¤Þ ä€BXâ XBX¤Þ ìÀÈä¨BX0>XâðFXfäÀBXäfüBXááÿåäCXïDá4CXèöPCXì â`CXæâCX¤YèÀFXèâpê¤Yä`CXä°CXãá€DX2äÀCXCX2üCXÿèä8DXä(DXäã`CXì â`CX ädDXèTDXì â`CXð(DXê°FX äh”Xæˆ> è⨔XСä”Xâ h”XС8ýäâДXÀ˜ä¸”Xâ”XÀ˜ðÜ_äà”X8“XâÀ•X8¿ äø”Xä8¿ 4•XÿìäP•Xïál•Xøˆ•Xèðþ줕Xè8ýø48PìÜ•X¿ äЕXëRæ|–XÜ’äì•XäÜ’(–XááÿåäD–XïDá`–XèüKKÿè0˜Xø¾ 䌖X˜–Xæ ⨖XæâØ–XŒì é˜XèâpêŒì 䨖Xäø–XãáÈ—X2ä—XØ–X2D—Xÿè䀗Xäp—Xä㨖Xì ⨖X 䬗X蜗Xì ⨖Xðp—Xêð—X<ä䨗Xæ<äèâ˜X\Ÿå˜XâØ—X\ŸðŒì ä(˜X¨–X欒ä@˜XL˜Xæ â\˜XæâŒ˜X8Ÿè4 Xèâpê8Ÿä\˜X䬘Xãá|™X2优XŒ˜X2ø˜Xÿèä4™Xä$™Xäã\˜Xì â\˜X ä`™XèP™Xì â\˜Xð$™XêüŸX0¥ 䌙Xæ0¥ ¤™XäââÔ™X”è$žXèp挘X”䤙Xäô™XãáÄšX2äšXÔ™X2@šXÿèä|šXälšXä㤙Xì ⤙X 䨚X蘚Xì ⤙XðlšXêžXhÉ äÔšXæhÉ ìšXèâ›X|mèðXèâpæÔ™X|mäìšXä<›X ãá œX2äL›X›X2ˆ›XÿèäÄ›Xä´›XäãìšXì âìšX äð›Xèà›Xì âìšXð´›Xê@œXLþ äœXæLþ 4œXèætœX´äPœXâ œX´hœXèæ¨œX  䄜Xâ PœX  œœXèæÜœX”»ä¸œXâ „œX”»МXèæX,¶äìœXâ ¸œX,¶XèæDX(ßä Xâ ìœX(ß8XèæxX”ÂäTXâ X”ÂlXèæ¬X´”äˆXâ TX´” Xèæ àX¨ä¼Xâ ˆX¨ÔXèæãÐYäðXâ ¼XÐYžXèçãhä$žXâ ÔšXh<žXèâlžXØcèäŸXèâpæÔ™XØcä<žX䌞Xãá\ŸX2䜞XlžX2ØžXÿèäŸXäŸXäã<žXì â<žX ä@ŸXè0ŸXì â<žXðŸXꄟXLþ älŸXæLþ è⬟XH“䔟XâlŸXH“èâÔŸXà”伟X┟Xà”èæÐYääŸX⼟XÐYì$ XÔÞ ä  X⌙XÔÞ èâL X É ä4 Xâ  X É ð8Ÿä\ X\˜Xâä¡Xl·ät Xäl·° XÿìäÌ Xïáè Xè8ýì¡Xø ¡Xèì<¡XøX¡Xèìt¡Xø¡Xè쬡XøÈ¡Xÿôü¡XT…äô¡X,1OâH¢XLÒä ¢XæLÒ8ýäÿåX£XxjäX¢Xäxj”¢Xááÿåä°¢XïDáÌ¢XèˆõLìè¢XèŒì£Xø £XèÔ)ì<£Xÿä|줣XØ„äh£XæØ„P âÿå`¤X ·ä´£Xä ·ð£Xááÿåä ¤XïDá(¤XøD¤Xè@;Mø@;Mì0¨XÀ äp¤Xx¤Xâ<⨤XÀ é¨Xèâ@êÀ äx¤XäȤXãᘥX2äؤX¨¤X2¥XÿèäP¥Xä@¥Xäãx¤Xì âx¤X ä|¥Xèl¥Xì âx¤Xð@¥XêÀ¥X`ú䨥Xæ`ú8ýä8âè¥X$0äÐ¥X¨¥X$08ýä4â¦Xèäø¥Xâ Ð¥Xè8ýä4â8¦X°‰ä ¦Xâø¥X°‰è0â`¦XœæäH¦Xâ ¦Xœæ`fPä,∦XøÚäp¦Xâ H¦XøÚ¼Râ(â°¦XüP 䘦Xâ p¦XüP 8ýä$âئX”KäÀ¦Xâ ˜¦X”K ~Qä ã§X äè¦XâÀ¦X èâ(§X4µä§Xâ è¦X4µ¼RââP§XP˜ ä8§Xâ §XP˜ ¼Rââx§X˜eä`§Xâ 8§X˜e¼Rââ §Xd 䈧Xâ `§Xd ¼Râ âȧXhœä°§Xâ ˆ§Xhœdýäâð§XÄð äاXâ°§XÄð èâ¨X Éå¨XâاX ÉðÀ ä(¨Xx¤Xâì¨XXjå@¨XäXjá|¨Xááÿå䘨XïDá´¨Xè,áNìШXè@oWÿè©Xĵ äü¨X©Xæ â|TæD©XÈ¿ ä(©X4©Xæ ⤡Wêt„äT©XðÀSæ|©X”äp©X8ýæªX´…䌩Xä´…È©Xÿìää©XïâªXèÈÒWøÔ)ìتX|¶ ä,ªXä|¶ hªXÿì䄪Xïá ªXéÃM켪Xÿô\«XT¶ äèªXäT¶ $«Xÿìä@«Xïí¨‚Oìl«XŒ…ä (´P ¬X`kå|«Xä`kḫXááÿåäÔ«XïDáð«Xèö˜Kìä¬X8kå¬Xä8káX¬Xÿìät¬Xïá¬XèðJ쬬XøȬXèÔ)øèì ­Xð“äô¬Xäð“0­XááÿåäL­XïDáh­Xèðþì„­Xèðþÿè\®Xkå°­Xäkáì­Xááÿåä®XïDá$®Xø@®Xèðþøt!ìà®Xkäl®Xäk¨®XááÿåäÄ®XïDýü®XÀ äð®XLÿO怯X,¶ ä ¯Xä,¶ H¯Xááÿåäd¯XïDíüKKì°X|Òä¯Xä|Ò̯Xááÿåäè¯XïDí¤R줰XÈjä°XäÈjP°Xááÿåäl°XïDሰXèLëTøt!ìÀ°XHÀ ä´°XxGKæܰX˜“äаX<*KæT´Xœ·äì°Xø°Xæ â±Xæâ8±X,˜è$´Xèâpê,˜ä±XäX±Xãá(²X2äh±X8±X2¤±Xÿèäà±XäбXäã±Xì â±X ä ²Xèü±Xì â±XðбXê´XdÎä8²XædÎP²Xäâ âd²Xää ┲X\Tèä³Xèâpê\Täd²Xä´²XãᄳX2äIJX”²X2á³Xÿèä<³Xä,³Xäãd²Xì âd²X äh³XèX³Xì âd²Xð,³XꬳX€å”³Xæ€éâÔ³XÔXå¼³X┳XÔXéâü³XL=ää³Xâ¼³XL=ð\Tä ´Xd²Xâ<´XÐbä$´Xâ8²XÐbð,˜äL´X±Xæ”jåd´Xä”já ´Xÿìä¼´XäçáØ´Xøô´Xèÿè°µXh”ä µXäh”\µXÿìäxµXïᔵXè8ýøpÿìüµX´kåÀµXæ´káP âÿå¶XÀkä ¶XdVæ·X”ä(¶X4¶Xæ âD¶Xæä`¶Xïá|¶Xè8ý옶XèhÑRê´¶XøжXøì¶Xè8ýøèì¸XTÁ ä·XäTÁ T·Xááÿåäp·XïDጷXè8ý쨷Xè ãIìÄ·Xèèìà·Xèèìü·Xèt!øè윸X,Á ä(¸Xä,Á d¸Xááÿå䀸XïDí8ýð Ò䬸Xä Òè¸Xááÿåä¹XïDá ¹Xè8ýøŒÅTìºXˆÂ äL¹XäˆÂ ˆ¹Xááÿå䤹XïDáÀ¹Xè0JìܹXèöø¹Xì â¬XTæüºXläºXälTºXäÿåäpºXïጺXè ¦I쨺XèêĺXèêàºXÿä¤Lì »X\ ä PNN$»XüÒä»X„%Kâü»XÄ· ä4»XäÄ· p»Xÿì䌻XïᨻXè|uJìÄ»X褮Iìà»XèLÝIøèìÔ¼X‡ä ¼Xä‡H¼Xÿìäd¼XïြXè|uJ으X褮I츼XèLÝIøèìt½X0•ää¼Xä0• ½Xÿìä<½XïáX½XèT¢Iÿ茽Xø·ä„½Xô@Kâd¾Xì”䜽Xäì”ؽXÿìäô½Xïá¾Xø,¾XèX+-ìH¾Xè8ýø48P쀾XÜÒät¾XÈ_O朾XÔ”ä¾XÐAPæ´¾Xˆ· 䬾XUâоX¼”äľX4FQæì¾XP· äà¾X´ ê„”äü¾X¿Xââ4¿X„”èüÀXèâ`ê„”ä¿XäT¿Xãá$ÀX2äd¿X4¿X2 ¿XÿèäÜ¿XäÌ¿Xäã¿Xì â¿X äÀXèø¿Xì â¿XðÌ¿Xê`ÀXP` ä4ÀXæP` LÀXä â êäœÀXqäpÀXâ 4ÀXqˆÀXä â êäÄÀXØ ä¬ÀXâpÀXØ èâìÀX”zäÔÀXâ¬ÀX”zèâÁXØ)äüÀXâÔÀXØ)ð„”ä$ÁX¿Xâ°ÁX¤‡ä<ÁX䤇xÁXÿìä”ÁXïídýìÌÁXt¸ äÀÁX0ÇSæèÁX`¸ äÜÁXLJæÀÂXäÓäøÁXääÓ4ÂXÿìäPÂXïálÂXè|uJìˆÂX褮Iì¤ÂXèLÝIøèì`ÃX,låÐÂXä,lá ÃXÿìä(ÃXïáDÃXè(ìJødVìpÃXì ä ©SHÄXD¸ ä€ÃXäD¸ ¼ÃXááÿåäØÃXïDáôÃXøÄXø,ÄXèðþÿètÄX(¸ äXÄXdÄXæ âTÖTæ ÄX¸ ä„ÄXÄXæ âbNæ”ÅXHÓä°ÄXäHÓìÄXááÿåäÅXïDá$ÅXèdýì@ÅXø\ÅXøxÅXèœÉLöœÉLî0Óä¤ÅXä0ÓàÅXäää4ÆXöäüÅXìáÆXÿô¨ÆX äÆXççäçæáááxý☓ è~áÀøØ èáÀðèƒá€iâè‹äìÇXälâè‹äÈXŠâmâè‹ä¤ÈXŠânâè‹ä0ÉXŠâoâè‹ä¼ÉXŠâpâè‹äHÊXŠâqâè‹äÔÊXŠârâè‹ä`ËXŠâsâè‹äìËXŠâtâè‹äxÌXŠâvâè‹äÍXä>áçƒÿí ðÿƒááÿÿÿ÷â¥å@@ÿä ïÿäïááÿÿÿáâ ÿìïÿ~ááÿÿïÿåâæ ÿäðÿäÿûâ&ÿì ïÿƒááÿÿïÿåâæ ÿä ïÿäï~ááÿÿÿáâ ÿì ïÿƒááÿÿïÿåâæ ÿäðÿƒááÿÿÿ÷âŸå€Àÿä ðÿƒááÿÿÿ÷â¥å@@ô2€è0ÍXüé\ÍXü:áX+-äƒý˜ÎX Ôä˜ÍXä ÔÔÍXÿìäðÍXïá ÎXèì"Rì(ÎXèêDÎXèêIì`ÎXè 'Rì|ÎXÿä ¦Iì´ÎX ¹ä¨ÎX8ÿIæTÏXØlåÄÎXâôÎXØláÜÎXèæÄÎXäôä ÏX¬ÜÎXê $ÏX`K ÜÎXê <ÏX˜ÁÜÎXî´DÜÎXèXÑX,mädÏXpÏXæ â€ÏXæâ°ÏXpÿè(ÑXèâpêpÿä€ÏXäÐÏXãá ÐX2äàÏX°ÏX2ÐXÿèäXÐXäHÐXäã€ÏXì â€ÏX ä„ÐXètÐXì â€ÏXðHÐXêÈÐX°Zä°ÐXæ°Z¼Rä âðÐX°aåØÐXâ°ÐX°aá¼RäâÑX¨µ åÑXâ ØÐX¨µ ¼Räâ@ÑX(=ä(ÑXãÑX(=ðpÿäPÑX€ÏXâ0ÒXÀlåhÑXäÀlá¤ÑXááÿåäÀÑXïDáÜÑXèdýìøÑXøÒXÿôìÒX¤lå@ÒXä¤lá|ÒXááÿåä˜ÒXïDá´ÒXè`fPìÐÒXÿä8ýìŒÓXˆÃ äüÒXäˆÃ 8ÓXááÿåäTÓXïDápÓXèÖLÿè,ÔX؇äœÓXä؇ØÓXááÿåäôÓXïDáÔXè¼RöìÕXpà ä<ÔXäpà xÔXááÿåä”ÔXïDá°ÔXèüKKìÌÔXèðÊJêèÔXèèÿêœläÕXäœlPÕXááÿåälÕXä<*KçDáˆÕXÿäðþêDÖXlmå´ÕXälmáðÕXááÿåä ÖXïDá(ÖXÿä ¾í×XˆÔäTÖXäˆÔÖXááÿåä¬ÖXïDáÈÖXè8DJìäÖXÿä ¾ì×X¤mä×Xpæh×Xˆmä,×XæˆmP âÿåØXô¹ äx×Xäô¹ ´×XÿìäÐ×Xïáì×Xè8ýøì4ÚXlÔäØX$ØXæ â4ØXæâdØX€»èÚXèâpꀻä4ØX䄨XãáTÙX2䔨XdØX2ÐØXÿèä ÙXäüØXäã4ØXì â4ØX ä8ÙXè(ÙXì â4ØXðüØXê|ÙXqädÙXæqèâ¤ÙX<ˆ äŒÙXâdÙX<ˆ è âÌÙX¨µ ä´ÙXâ ŒÙX¨µ äâôÙXØÉäÜÙXâ ´ÙXØÉäâÚXlUåÚXâÜÙXlUá쀻ä,ÚX4ØXâˆáXع äDÚXPÚXæ â`ÚXæHâÚX(¨èpáXèâpê(¨ä`ÚXä°ÚXãá€ÛX2äÀÚXÚX2üÚXÿèä8ÛXä(ÛXäã`ÚXì â`ÚX ädÛXèTÛXì â`ÚXð(ÛXê¨ÛXJ äÛXæJ èDâÐÛXä¸ÛXâÛXè@âøÛXœ™åàÛXâ¸ÛXœ™é<â ÜXÔ§äÜXâ àÛXÔ§ä8âHÜXLSä0ÜXâÜXLSè4âpÜX?äXÜXâ 0ÜX?ä0â˜ÜXán ä€ÜXâXÜXán è,âÀÜX̯ä¨ÜXâ€ÜX̯è(âèÜX V äÐÜXâ ¨ÜX V 8ýä$âÝXaäøÜXâ ÐÜXaü9Lä âpàXLNä ÝXâ øÜXLN8ÝXäâ âHÝXæ4âxÝXpdèXàXèâpêpdäHÝXä˜ÝXãáhÞX2ä¨ÝXxÝX2äÝXÿèä ÞXäÞXäãHÝXì âHÝX äLÞXè<ÞXì âHÝXðÞXêÞXán äxÞXçn è0â¸ÞX̯ä ÞXâxÞX̯è,âàÞX V äÈÞXâ  ÞX V 8ýä(âßXhäðÞXâ ÈÞXh¬8Lä$â0ßXaäßXâ ðÞXaü9Lä âXßXDì ä@ßXâ ßXDì T9Läâ€ßX|–ähßXâ@ßX|–èâ¨ßX¬äßXâ hßX¬äâÐßXhæ ä¸ßXâßXhæ èâøßX°çäàßXâ ¸ßX°çì‰Iâ â àXÜvåàXâàßXÜvéâHàX è°)Yèâpæd%YL> ä%YäX(Yãáü#YHî ä„%Yäh'Yãáâd%YHî è´%Yèpæâ P'YÙ Ì%Yèâü%Yö è8'Yèâpæd%Yö äÌ%Yä&Yãáì&Y2ä,&Yü%Y2h&Yÿèä¤&Yä”&YäãÌ%Yì âÌ%Y äÐ&YèÀ&Yì âÌ%Yð”&Yê('Yœz äü&Yæœz 'Yäâ êè`Ñä8'Yâ ü&Y`Ñ8ýèæäé %Yè8(Y2äx'Yd%Y2´'Yÿèäð'Yäà'Yäã„%Yì â„%Y ä(Yè (Yì â„%Yðà'YêH(Yäé äP'YäÙ ä ´%Y()Y2äh(YD%Y2¤(Yÿèäà(YäÐ(Yäã%Yì â%Y ä )Yèü(Yì â%YðÐ(YêP)YäJ ä8)YæäJ 8ýä âx)YÌ…å`)Yâ8)YÌ…á8ýäâ )YH”äˆ)Yâ`)YH”èæĵ ä°)Yâˆ)Yĵ ìð)YÙ äØ)Yâ ü$YÙ Ì%Yä â*YUå*YâØ)YUè â@*Yžä(*Yã*Yžè âh*Y¸šäP*Yâ(*Y¸šèâ*Yð3äx*YâP*Yð3èâ¸*Yä *Yâ x*Y8ýìpäÈ*YÌ#YæÀ™äà*YäÀ™+Yÿìä8+Yä¼Rçí¼Rìp+YXäd+Y8hKæH,Y˜×ä€+Yä˜×¼+YÿìäØ+Yïáô+Yè|uJì,Y褮Iì,,YèLÝIøèìä0Y¬Ç äX,Yä¬Ç ”,Yááÿåä°,YïDíÌ,Yê âÜ,Yæ4â -YȦè´0Yèâ`êȦäÜ,Yä,-Yãáü-Y2ä<-Y -Y2x-Yÿèä´-Yä¤-YäãÜ,Yì âÜ,Y äà-YèÐ-Yì âÜ,Yð¤-Yê$.YH¢ä .YäH¢â0âL.Y(\ä4.Yâ .Y(\ü+Kä0ât.YH©ä\.Yâ 4.YH©¿Lä,âœ.Y¨U ä„.Y\.Y¨U â(âÄ.Y ä ä¬.Yâ „.Y ä ü+Kä(âì.Yl[äÔ.Yâ ¬.Yl[„Xä$â/Y(Må ü.YÔ.Y(Má,‘Xä âYÜÇ äY¸Q äü=YâÔ=Y¸Q ðdæä$>Y,Y¨¾ä<>Y8ýæL@Y@qåX>Yd>Yæ ât>Yæâ¤>Y¬ è@Yèâpꬠät>YäÄ>Yãá”?Y2äÔ>Y¤>Y2?YÿèäL?YäYì ât>Y äx?Yèh?Yì ât>YðYâ´@Yl½ ä\@Yäl½ ˜@YááÿåìÖLçDåL½ äÄ@YÐ@Yæ âl¾SæœAY@¾ äð@Yä@¾ ,AYááÿåäHAYïDádAYø€AYÿäðCJì¤FYðÈ ä¬AYäðÈ èAYÿìäBYïáˆFYè BYì â0BYæâ `BYdC FYèFYä @ápxFYædC ä0BYä€BYãá"ÜCY`/$CYBY`BY`/ÌBYÿèäøBYìã0BYøCYì â0BYè,CY`BY`/hCYÿèä”CYìã0BYì°CYèCYøÌCYê â0BY äŒDY2äìCY`BY2(DYÿèäTDYäÌCYäã0BYìpDYèCYøÌCYêZÔÊ äÀ9ZäÔÊ ü9Zÿìä:Zïáì=Zè4:Zì âD:Zæâ t:Zˆ!h=Zè|=Zä @ápÜ=Zæˆ!äD:Zä”:Zãá"ð;Z`/8;Z¤:Zt:Z`/à:Zÿèä ;ZìãD:Zø(;Zì âD:Zè@;Zt:Z`/|;Zÿèä¨;ZìãD:ZìÄ;Zè(;Zøà;Zê âD:Z ä È=Zÿä,ìâ%åÀåFë\èJìà>Z”Ìä>Zä”ÌT>Zÿìäp>ZïáŒ>Zèø1Kì¨>ZøÄ>Zè¤#Køèìð>Z˜©ä |QÌ@Z4æå?Z ?Zæ â?Zæ âL?ZÔÍèœ@ZèâpêÔÍä?Zäl?Zãá<@Z2ä|?ZL?Z2¸?Zÿèäô?Zää?Zäã?Zì â?Z ä @Zè@Zì â?Zðä?Zêd@ZŒäL@ZæŒèâŒ@ZÔù ät@Zâ L@ZÔù äâ´@Z$äœ@Zât@Z$ðÔÍäÄ@Z?Zâ CZ|ÌäÜ@Zä@ZââAZ|ÌèÜBZèâpê|Ìää@Zä4AZãáBZ2äDAZAZ2€AZÿèä¼AZä¬AZäãä@Zì âä@Z äèAZèØAZì âä@Zð¬AZê,BZ Œ äBZæ Œ èâTBZÐå[øå=[äøáL=[ááÿåäh=[ïDá„=[è ~Qì >[è =[ì â°=[æäÌ=[ïáè=[è ~Qì>[è¼Rÿÿä¼@[„¥äL>[X>[æ˜âˆ>[Ð&èŒ@[èâpêÐ&äX>[ä¨>[ ãáx?[2ä¸>[ˆ>[2ô>[ÿèä0?[ä ?[äãX>[ì âX>[ ä\?[èL?[ì âX>[ð ?[ê´?[ð|äˆ?[æð| ?[ä â xêäÜ?[0èäÄ?[âˆ?[0èèâ@[˜ð äì?[âÄ?[˜ð èâ,@[ ä@[âì?[ èâT@[ ä<@[â@[ èâ|@[ð¨äd@[â<@[ð¨èâ¤@[Ü}äŒ@[âd@[Ü}ðÐ&ä´@[X>[âØ@[´ÚäÌ@[pÿæ$A[„Ú äè@[h&„Ú ¬õ<òpõ<ú¤å4A[ä¤ápA[ÿìäŒA[ïí¼RêÄA[(ä¸A[ð~NædB[¦äÔA[ä¦B[ÿìä,B[ïáHB[èÈÒWøì`ã¸Á[X½[âÐÁ[¯ä \NàÁ[˜æ ûOðÂ[h˜äðÁ[äh˜,Â[ááÿåäHÂ[ïDádÂ[è8ýì€Â[øœÂ[èðþê¸Â[øÔÂ[ÿääéQêÃ[,˜åÃ[ Ã[æ â„”Næ Ã[ ˜ä,Ã[ä ˜hÃ[ááÿåä„Ã[ädÉJçDíœÉLê<Ä[ô—ä°Ã[¼Ã[æ âÌÃ[æäèÃ[ïáÄ[ø Ä[ÿøľäLÄ[æľ€-äÿå”Ç[@ää˜Ä[¤Ä[æ(âÔÄ[ aèdÇ[èâ@ê aä¤Ä[äôÄ[ ãáÄÅ[2äÅ[ÔÄ[2@Å[ÿèä|Å[älÅ[äã¤Ä[ì â¤Ä[ ä¨Å[è˜Å[ì â¤Ä[ðlÅ[êìÅ[ˆWäÔÅ[æˆWâ$âÆ[,¶äüÅ[â ÔÅ[,¶¼U[ä â<Æ[Pw ä$Æ[âüÅ[Pw èâdÆ[(7äLÆ[â$Æ[(7èâŒÆ[l¨ätÆ[âLÆ[l¨èâ´Æ[¤ÕåœÆ[âtÆ[¤ÕáäâÜÆ[X…äÄÆ[â œÆ[X…äâÇ[(=äìÆ[âÄÆ[(=è â,Ç[È5äÇ[â ìÆ[È5 ~QäâTÇ[œÑä<Ç[â Ç[œÑdýäâ|Ç[ø<ådÇ[â<Ç[ø<ñ aäŒÇ[¤Ä[âlÈ[püä¤Ç[äpüàÇ[ÿìäüÇ[ïáÈ[è|uJì4È[褮IìPÈ[èLÝIøèì˜È[á™ä|È[ˆÈ[æ â´[æ¨È[ ää 8üO€É[´í ä¸È[ä´í ôÈ[ááÿåäÉ[ïDá,É[èLÝIìHÉ[èЧIìdÉ[èpÃIÿæœÉ[Ø¿äÉ[¸ËIæÈÉ[øãä¬É[¸É[æ â´ÕYæäÉ[˜¯äØÉ[|¹RæÔË[”ã äôÉ[üÉ[ââ,Ê[”ã è¤Ë[èâpê”ã äüÉ[äLÊ[ãáË[2ä\Ê[,Ê[2˜Ê[ÿèäÔÊ[äÄÊ[äãüÉ[ì âüÉ[ åË[èðÊ[ì âüÉ[ðÄÊ[êDË[œå,Ë[æœéâlË[°RäTË[â,Ë[°Rèâ”Ë[¬hä|Ë[âTË[¬hèâ¼Ë[DAä¤Ë[â|Ë[DAð”ã äÌË[üÉ[â¬Ì[ ¿ääË[ä ¿ Ì[ááÿåä<Ì[ïDáXÌ[è¼RêtÌ[è¼RìÌ[ÿädýìLÍ[€¯ä¼Ì[䀯øÌ[ááÿåäÍ[ïDá0Í[è| Nø¤*íÒ[€¿ä\Í[hÍ[æ âxÍ[æâ¨Í[À® èÐÑ[èâpêÀ® äxÍ[äÈÍ[ãá˜Î[2äØÍ[¨Í[2Î[ÿèäPÎ[ä@Î[äãxÍ[ì âxÍ[ ä|Î[èlÎ[ì âxÍ[ð@Î[êÀÎ[dÒä¨Î[ædÒèâèÎ[¸L äÐÎ[â¨Î[¸L è â˜Ñ[ ûäøÎ[â ÐÎ[ ûÏ[äâ â Ï[æ âPÏ[îèhÑ[èâpêîä Ï[äpÏ[ ãá@Ð[2ä€Ï[PÏ[2¼Ï[ÿèäøÏ[äèÏ[äã Ï[ì â Ï[ ä$Ð[èÐ[ì â Ï[ðèÏ[êhÐ[K äPÐ[æK äâÐ[@RäxÐ[â PÐ[@Räâ¸Ð[еä Ð[â xÐ[еäâàÐ[ôäÈÐ[â  Ð[ôäâÑ[´qäðÐ[âÈÐ[´qè â0Ñ[ع äÑ[âðÐ[ع èâXÑ[8 ä@Ñ[âÑ[8 èâ€Ñ[ÈëähÑ[â@Ñ[ÈëðîäÑ[ Ï[âÀÑ[œÑä¨Ñ[â øÎ[œÑdýäâèÑ[ð¯äÐÑ[â¨Ñ[ð¯ðÀ® äøÑ[xÍ[âØÒ[d¿äÒ[äd¿LÒ[ááÿåähÒ[ïDá„Ò[è8ýì Ò[è0ŠUì¼Ò[ÿäèð4¯äèÒ[ä4¯$Ó[ááÿåä@Ó[ïDá\Ó[è¼Rö¼Rê”Ó[pýäˆÓ[<²OælÔ[8°ä¤Ó[ä8°àÓ[ÿìäüÓ[ïáÔ[è|uJì4Ô[褮IìPÔ[èLÝIøèì¸Ô[<î ä|Ô[æ<î 8ýäÿåÔÔ[€˜åÈÔ[øµSæ°Ö[î ääÔ[ðÔ[æ ãÕ[æ â0Õ[Ì|è€Ö[èâpêÌ|åÕ[äPÕ[ãá Ö[2ä`Õ[0Õ[2œÕ[ÿèäØÕ[äÈÕ[ääÕ[ì ãÕ[ äÖ[èôÕ[ì ãÕ[ðÈÕ[êHÖ[üõ ä0Ö[æüõ èâpÖ[õ äXÖ[â0Ö[õ èâ˜Ö[Ìö ä€Ö[âXÖ[Ìö ðÌ|ä¨Ö[áÕ[æüí äÀÖ[äüí üÖ[ÿìä×[ïá4×[ÿô Ø[áþä`×[åþœ×[ááÿåä¸×[ïDáÔ×[èìð×[è¤-øt!ì¬Ø[PšäØ[äPšXØ[ÿìätØ[ïáØ[èDJøh'Jì„Ù[HÀ伨[äHÀøØ[ááÿåäÙ[ïDá0Ù[謲SêLÙ[øhÙ[è8ýøèììÙ[Ää ä”Ù[äÄä ÐÙ[ááÿå÷DápÚ[ИåüÙ[äИá8Ú[ááÿåäTÚ[ïDíìÛ[Œä ä€Ú[äŒä ¼Ú[ááÿåäØÚ[äðRçDáôÚ[èüKKÿè,Û[´˜å Û[¸[ꈰä<Û[ öZætÛ[HåäXÛ[dÛ[æ â,WæÜ[Ô™å„Û[äÔ™áÀÛ[äÿåäÜÛ[ïáøÛ[èêIøêIì$Ü[”þä ( OüÜ[`þä4Ü[ä`þpÜ[ÿìäŒÜ[ïá¨Ü[èð~NìÄÜ[øàÜ[ÿôÔÝ[Кä Ý[äКHÝ[ÿìädÝ[ïá€Ý[èœKPìœÝ[ø¸Ý[èêIøèìÞ[¨šääÝ[䨚 Þ[ÿìä<Þ[ïáXÞ[è@ÚJìtÞ[è¤#Kø(KìÌß[ìÀä Þ[äìÀÜÞ[ÿìäøÞ[ïá$ß[èß[ì âPZæ@ß[èê\ß[øxß[ø”ß[ø°ß[è öt!ìèß[„™åÜß[èêtšäøß[á¼Læäæ[æ äà[äæ Pà[ÿìälà[ïáÈæ[èˆà[ì â˜à[æâ Èà[t^ Dæ[èXæ[ä @áp¸æ[æt^ ä˜à[äèà[ãá"Dâ[`/Œá[øà[Èà[`/4á[ÿèä`á[ìã˜à[ø|á[ì â˜à[è”á[Èà[`/Ðá[ÿèäüá[ìã˜à[ìâ[è|á[ø4â[ê â˜à[ äôâ[2äTâ[Èà[2â[ÿèä¼â[ä4â[äã˜à[ìØâ[è|á[ø4â[ê,æ[¼¨äã[Èà[¼¨@ã[âÿèälã[ìáá˜à[ âðåˆã[è|á[ø¤ã[ì â´ã[æ âäã[áõèüå[èâpëõä´ã[ää[ ãáÔä[2ää[äã[2Pä[ÿèäŒä[ä|ä[äã´ã[ì â´ã[ ä¸ä[è¨ä[ì â´ã[ð|ä[êüä[ˆ¦äää[戦èâ$å[P¥ä å[âää[P¥èâLå[8ä4å[â å[8äâtå[Yâø;\x äÜ;\è;\æ âÜüYæ<\(¶ä<\á¼Læ|>\tžå$<\0<\æ â@<\æPâp<\øyèL>\èâpêøyä@<\ä<\ãá`=\2ä <\p<\2Ü<\ÿèä=\ä=\äã@<\ì â@<\ äD=\è4=\ì â@<\ð=\êœ=\ð|äp=\æð|ˆ=\äâ <êäÄ=\˜ð ä¬=\âp=\˜ð èâì=\ äÔ=\â¬=\ è â>\ äü=\âÔ=\ èâ<>\ð¨ä$>\âü=\ð¨èâd>\Ü}äL>\â$>\Ü}ðøyät>\@<\âÈ>\êäŒ>\h&ê0=òô=ö?\8 äØ>\h&8 ˜=î\=ú$ ä$?\ä$ `?\ÿìä|?\ïí¼Rê°?\”õ ä¨?\hRâ4@\¤ë äÀ?\ä¤ë ü?\ááÿåä@\äçDíêP@\̶äD@\4:Zæh@\¨Ÿå`@\„SâA\`õ äx@\ä`õ ´@\ááÿåäÐ@\ïDáì@\è´Wÿè¨A\ØäA\äØTA\ááÿåäpA\ïDáŒA\èVPÿèHB\(õ ä¸A\ä(õ ôA\ááÿåäB\ä¼MçDá,B\ÿäd»LìC\@ŸåXB\ä@Ÿá”B\ááÿåä°B\ïDáÌB\èp5WìèB\輿Vÿìøê äC\ÈÌLæÜC\Èëä0C\äÈëlC\äÿåäˆC\ïá¤C\èêIìÀC\èêIøêIì(D\<·äìC\æ<·P âÿæE\ ëä8D\ä ëtD\ÿìäD\ïá¬D\è|uJìÈD\褮IìäD\èLÝIøèì¼E\d¢äE\äd¢LE\ááÿåähE\ïDá„E\èЧIì E\èðþøðþêØE\xëäÌE\´WæôE\ÆäèE\À°JæÌF\”äF\ä”@F\ÿìä\F\ïáxF\ø”F\èdýì°F\ÿôÀG\èë äÜF\äèë G\ááÿåä4G\ïDáPG\èÖLìlG\øˆG\è¼Rì¤G\ÿôDH\|äÐG\ä| H\ááÿåä(H\ïDÿáÔ¡äTH\äÔ¡H\ááÿåä¬H\ä8ýçDáÈH\è8ýìäH\èxGKíI\øI\èxgRì8I\è8ýìTI\ÿäèì€J\ô·ä€I\äô·¼I\ÿìäØI\ïáôI\è8ýìJ\ø,J\øHJ\è8ýìdJ\ÿä¤-ìÀJ\Xì äJ\æXì ¨J\êæJ\äø=â|K\ £äÐJ\ä £ K\äÿåä(K\ïáDK\èêIì`K\èêIøêIìL\dö äŒK\ädö ÈK\ááÿåääK\ïDâL\èøðCJì,L\ÔÆä ¼°W°L\°Æäò˜>öl¼\¸Ëä`¼\LT[æ ½\8ð ä|¼\ä8𠸼\ááÿåäÔ¼\ïDáð¼\ÿ䠾쬽\D ä½\äD X½\ááÿåät½\ïDá½\ÿäpÿ섾\إ弽\äØ¥áø½\ÿìä¾\ïá0¾\è|uJìL¾\褮Iìh¾\èLÝIøèì\¿\ 䔾\ä о\ÿìäì¾\ïá¿\è|uJì$¿\褮Iì@¿\èLÝIøèìx¿\¨»äl¿\ÜõS房\ô ä ¼€L˜¿\ˆ¥å ”SJ°¿\Р䨿\äçTâˆÀ\ð äÀ¿\äð ü¿\ááÿåäÀ\ïDá4À\øPÀ\èèìlÀ\ÿäèì(Á\h»ä˜À\äh»ÔÀ\ááÿåäðÀ\ïDá Á\è8ýøt!ìDÁ\üï ä8Á\ÔQæÄÁ\xËäTÁ\`Á\æ âpÁ\æäŒÁ\ïá¨Á\ÿô,Â\  äÔÁ\ä  Â\ááÿå÷DáHÂ\ˆ ä<Â\˜w\ædÂ\ ú äXÂ\ HMêŒú ätÂ\ê Ã\ìð äÂ\äìð ÌÂ\ááÿåäèÂ\ïDáÃ\ÿä¤-ìøÃ\Àð ä0Ã\äÀð lÃ\ÿìäˆÃ\ïá¤Ã\è|uJìÀÃ\褮IìÜÃ\èLÝIøèìÐÄ\@¼äÄ\ä@¼DÄ\ÿìä`Ä\ïá|Ä\è|uJì˜Ä\褮Iì´Ä\èLÝIøèì¨Å\\¦åàÄ\ä\¦áÅ\ÿìä8Å\ïáTÅ\èÈŸLìpÅ\øŒÅ\èü Jø¤*ì€Æ\¼ä¸Å\ä¼ôÅ\ÿìäÆ\ïá,Æ\è|uJìHÆ\褮IìdÆ\èLÝIøèìœÆ\û äÆ\€¯VæXÇ\¬ð䬯\ä¬ðèÆ\ÿìäÇ\ïá Ç\èèì<Ç\ÿäÈËMìøÇ\ä»ähÇ\ä令Ç\ÿìäÀÇ\ïáÜÇ\èl?TøŒìÐÈ\dû äÈ\ädû DÈ\ÿìä`È\ïá|È\è|uJì˜È\褮Iì´È\èLÝIøèìpÉ\8û äàÈ\ä8û É\ÿìä8É\ïáTÉ\è¤ÆZÿèØÍ\äËÈÍ\€É\ŒÉ\æâ ¼É\äËDÍ\èXÍ\ä @áp¸Í\æäËäŒÉ\äÜÉ\ãá"8Ë\`/€Ê\ìÉ\¼É\`/(Ê\ÿèäTÊ\ìãŒÉ\øpÊ\ì âŒÉ\èˆÊ\¼É\`/ÄÊ\ÿèäðÊ\ìãŒÉ\ì Ë\èpÊ\ø(Ë\ê âŒÉ\ äèË\2äHË\¼É\2„Ë\ÿèä°Ë\ä(Ë\äãŒÉ\ìÌË\èpÊ\ø(Ë\ê|Ì\`êäøË\¼É\`ê4Ì\âÿèä`Ì\ìááŒÉ\âúñpÊ\ì,Í\”ØäŒÌ\¼É\”ØÈÌ\âÿèäôÌ\ìááŒÉ\ âùåÍ\èpÊ\ÿìäËä<Í\ŒÉ\æ$ìhÍ\ŒÉ\äââ¼É\T¤Í\ÿäìâ)æÀåFãÐÍ\ŒÉ\âÌÎ\ˆðäèÍ\äˆð$Î\ááÿåä@Î\ïDá\Î\èX+-ìxÎ\ø”Î\è8ýì°Î\è8ýøŒûYìèÎ\¨äÜÎ\TÀZæˆÏ\$ðäøÎ\ä$ð4Ï\ááÿåäPÏ\ïDálÏ\ÿä¼RðÄ»ä˜Ï\äÄ»ÔÏ\ááÿåäðÏ\ïDíˆWKìÈÐ\T§åÐ\äT§áXÐ\ÿìätÐ\ïáÐ\è8ýì¬Ð\èðþÿèhÑ\8ñ äØÐ\ä8ñ Ñ\ááÿåä0Ñ\ïDáLÑ\ÿä ¾ì”Ñ\ „Ñ\xÑ\4‘KêŒÑ\4‘Kâ8Ô\½ä¤Ñ\°Ñ\æ âÀÑ\æ âðÑ\h’ èÔ\èâpêh’ äÀÑ\äÒ\ ãáàÒ\2ä Ò\ðÑ\2\Ò\ÿèä˜Ò\äˆÒ\äãÀÑ\ì âÀÑ\ äÄÒ\è´Ò\ì âÀÑ\ðˆÒ\êÓ\|‹äðÒ\æ|‹À‰Läâ0Ó\ìoäÓ\â ðÒ\ìoÀ‰LäâXÓ\P¦ ä@Ó\â Ó\P¦ ¼ÅJäâ€Ó\iähÓ\â @Ó\i¼ÅJäâ¨Ó\,åÓ\âhÓ\,á8ýä âÐÓ\dYä¸Ó\âÓ\dYèâøÓ\ªäàÓ\â¸Ó\ªèâ Ô\¨äÔ\âàÓ\¨ðh’ ä0Ô\ÀÑ\âÕ\ì¼äHÔ\ä켄Ô\ááÿåä Ô\ïDá¼Ô\è`fPìØÔ\èêôÔ\èöê,Õ\H¨ä Õ\˜gNæ Ö\¬¼ä<Õ\䬼xÕ\ááÿåä”Õ\ïDá°Õ\èdýìÌÕ\øèÕ\øÖ\ÿô¤Ö\°¦å0Ö\ä°¦álÖ\ááÿåäˆÖ\ïDíüKKìpØ\(¨ä´Ö\ÀÖ\æ âðÖ\@íè@Ø\èâ`ê@íäÀÖ\ä×\ãáà×\2ä ×\ðÖ\2\×\ÿèä˜×\äˆ×\äãÀÖ\ì âÀÖ\ äÄ×\è´×\ì âÀÖ\ðˆ×\êØ\8Uäð×\æ8Uèâ0Ø\(våØ\âð×\(véâXØ\ˆb ä@Ø\âØ\ˆb ð@íähØ\ÀÖ\æd¼ä€Ø\”©[ædÙ\﬊ϯ\äÔ¨ØØ\ÿìäôØ\ïáÙ\è8ýì,Ù\èðþìHÙ\ÿäpÿì Ú\¸¨ätÙ\丨°Ù\ÿìäÌÙ\äðþçáèÙ\èèìÚ\èðþø|èLìøÚ\è§å0Ú\äè§álÚ\ÿìäˆÚ\ïá¤Ú\è|uJìÀÚ\褮IìÜÚ\èLÝIøèì$Û\D äÛ\Û\æ â c\æàÛ\°ñ ä4Û\ä°ñ pÛ\ááÿåäŒÛ\ïDá¨Û\èЧIìÄÛ\èðþøðþêäÝ\DñäðÛ\üÛ\æ â Ü\æâ<Ü\Ð<è´Ý\èâpêÐ<ä Ü\ä\Ü\ãá,Ý\2älÜ\<Ü\2¨Ü\ÿèääÜ\äÔÜ\äã Ü\ì â Ü\ äÝ\éÝ\ì â Ü\ðÔÜ\êTÝ\pi ä<Ý\æpi è â|Ý\Ìš ädÝ\â <Ý\Ìš 8ýäâ¤Ý\TeäŒÝ\âdÝ\TeèâÌÝ\d¸ä´Ý\â ŒÝ\d¸ìÐ<äÜÝ\ Ü\âß\@ü äôÝ\ä@ü 0Þ\ááÿåäLÞ\ïDáhÞ\èüKKìèÞ\è„Þ\ì â”Þ\æä°Þ\ïáÌÞ\èÿÿäß\”ñ äß\ØZæp§å,ß\4ß\ââdß\p§é ä\èPêp§å4ß\ä„ß\ãáTà\2ä”ß\dß\2Ðß\ÿèä à\äüß\äã4ß\ì â4ß\ ä8à\è(à\ì â4ß\ðüß\êŒâ\èéädà\æèé|à\èâ¬à\Ä ètâ\èâPædß\Ä ä|à\äÌà\ãáœá\2äÜà\¬à\2á\ÿèäTá\äDá\äã|à\ì â|à\ ä€á\èpá\ì â|à\ðDá\êÄá\Ì= ä¬á\æÌ= èâìá\Œ¾äÔá\â¬á\Œ¾è ââ\جäüá\âÔá\جèâ<â\ÔYä$â\âüá\ÔYèâdâ\$äLâ\â$â\$èæ”zätâ\âLâ\”zìä\tüäœâ\â dà\tü´â\èâäâ\ èäã\èâPædß\ ä´â\äã\ãáÔã\2äã\äâ\2Pã\ÿèäŒã\ä|ã\äã´â\ì â´â\ ä¸ã\è¨ã\ì â´â\ð|ã\îð|ääã\æð|üã\è êäí\Ää ä\â œâ\Ä8ä\èâhä\,èüì\èâPædß\,ä8ä\äˆä\ãáXå\2ä˜ä\hä\2Ôä\ÿèäå\åå\äã8ä\ì â8ä\ ä<å\è,å\ì â8ä\ñå\ê€å\Wähå\æWèâäé\¼³äå\â hå\¼³¨å\äââØå\8`è\è\èPæhä\8`ä¨å\äøå\ãáÈæ\2äæ\Øå\2Dæ\ÿè䀿\äpæ\äã¨å\ì â¨å\ 䬿\èœæ\ì â¨å\ðpæ\êLè\€z䨿\æ€zðæ\èâ ç\” è è\èâPæØå\” äðæ\ä@ç\ãáè\2äPç\ ç\2Œç\ÿèäÈç\ä¸ç\äãðæ\ì âðæ\ äôç\èäç\ì âðæ\ð¸ç\î@lä è\æ@l8è\è êèÀ˜ä\è\â Øæ\À˜tè\èâ¤è\0þ èÌé\èâPæØå\0þ ätè\äÄè\ãá”é\2äÔè\¤è\2é\ÿèäLé\ä<é\äãtè\ì âtè\ äxé\èhé\ì âtè\ð<é\ê¼é\¬²ä¤é\欲èæ4–äÌé\â¤é\4–ììì\|8 äôé\â å\|8 ê\äââ<ê\èdë\èPæhä\ä ê\ä\ê\ãá,ë\2älê\<ê\2¨ê\ÿèääê\äÔê\äã ê\ì â ê\ äë\éë\ì â ê\ðÔê\êTë\Oä<ë\æOðô ädë\â <ë\ô |ë\èâ¬ë\øWèÔì\èâPæ<ê\øWä|ë\äÌë\ãáœì\2äÜë\¬ë\2ì\ÿèäTì\äDì\äã|ë\ì â|ë\ ä€ì\èpì\ì â|ë\ðDì\êÄì\0ëä¬ì\æ0ëèæ ³ äÔì\â¬ì\ ³ ðÈ äüì\âôé\È ðp§å$í\4ß\âÈî\|¨å<í\ä|¨áxí\ÿìä”í\ïá°í\è8ýìÌí\øèí\èðþìî\ø î\èpÿì<î\èpÿìXî\èpÿìtî\è¤-ìî\èpÿì¬î\èpÿøpÿìäî\ì äØî\,PLæôî\èü ä MNï\àÌäï\l Jæ(ï\ø½ä ï\ÜïPâDï\Àñä8ï\ô:Yæ<ò\¨ äTï\ä¨ ï\ááÿåä¬ï\ïDá°ñ\èÈï\ì âØï\æâð\”Šè€ñ\èâpꔊäØï\ä(ð\ãáøð\2ä8ð\ð\2tð\ÿèä°ð\ä ð\äãØï\ì âØï\ äÜð\èÌð\ì âØï\ð ð\ê ñ\Ôjäñ\æÔjt!ä âHñ\Ü ä0ñ\âñ\Ü èâpñ\\ÂåXñ\â0ñ\\Âéâ˜ñ\ Éä€ñ\âXñ\ Éð”Šä¨ñ\Øï\âÌñ\èðþêèñ\øò\èðþì ò\èèøäéQêXò\0©äLò\´Uê”ñähò\ä”ñ¤ò\ááÿåäÀò\ädýçDáÜò\èdýìøò\èdýìó\èöêìó\Èò ä@ó\äÈò |ó\äÿåä˜ó\ïá´ó\èêIìÐó\èêIøêIìŒô\¼òäüó\ä¼ò8ô\ááÿåäTô\ïDápô\ÿä¼Rì,õ\°ò äœô\ä°ò Øô\ááÿåäôô\ïDáõ\ÿä ¾ìÌõ\€ ä<õ\ä€ xõ\ááÿåä”õ\ïDá°õ\ÿäpÿì¤ö\òäÜõ\äòö\ÿìä4ö\ïáPö\è|uJìlö\褮Iìˆö\èLÝIøèì|÷\Dòä´ö\äDòðö\ÿìä ÷\ïá(÷\è|uJìD÷\褮Iì`÷\èLÝIøèìÈ÷\`ý äŒ÷\æ`ý 8ýäÿ娸\ì¨åØ÷\äì¨áø\ÿìä0ø\ïáLø\è8ýìhø\ø„ø\èðþì ø\ø¼ø\èèøèì ú\øÌäèø\ðø\â$â ù\øÌèpú\èâpêøÌäðø\ä@ù\ãáú\2äPù\ ù\2Œù\ÿèäÈù\ä¸ù\äãðø\ì âðø\ äôù\èäù\ì âðø\ð¸ù\ê8ú\dmä ú\ædmP äâ`ú\¨äHú\â ú\¨P äâˆú\Läpú\âHú\LðøÌä˜ú\ðø\â|ü\´¨å°ú\¼ú\æ âÌú\æâüú\¬üèLü\èâ@ê¬üäÌú\äû\ãáìû\2ä,û\üú\2hû\ÿèä¤û\ä”û\äãÌú\ì âÌú\ äÐû\èÀû\ì âÌú\ð”û\êü\L.äüû\æL.è â<ü\”P ä$ü\âüû\”P èâdü\ ÉäLü\â$ü\ Éð¬üätü\Ìú\âpý\X äŒü\äX Èü\ááÿåääü\ïDâý\è8ýìý\èX+-ì8ý\øTý\è„bJøèìŒý\< ä€ý\LYæ,þ\ äœý\ä Øý\ááÿåäôý\ïDáþ\èöxGKì ÿ\x©ä<þ\äx©xþ\ááÿåä”þ\ïDá°þ\èêÌþ\èêèþ\è8ýìÿ\ÿäîH©ä0ÿ\äH©lÿ\ÿìäˆÿ\ïá¤ÿ\è¼RêÀÿ\è ¹Jö ¹JêÐ]€¾äìÿ\䀾(]ÿìäD]ïá`]è8ýì|]ø˜]è8ýì´]ÿäpÿìì]Hªäà]R\æ¨](óäü]ä(ó8]ÿìäT]ïáp]èlLìŒ]èøêIìÔ]Hþ Ä]¸]€ÞLêÌ]€ÞLâ<]ˆ©åä]䈩á ]ááÿå÷DáT]è äL]æTâp]Ð äd]üÄRæ¸]dó ä€]ädó ¼]ááÿåäØ]ïDáô]ø]ø,]øH]è8ýìd]ø€]è8ýìœ]ÿä8ýìp]óäÈ]Ð]âDã]óè@]èâpêóäÐ]ä ] ãáð]2ä0]á ]2l]ÿèä¨]ä˜]äãÐ]ì âÐ] äÔ]èÄ]ì âÐ]ð˜]ê](=å]æ(=è@â@]˜k ä(]ã ]˜k 8ýâ<âh]qäP]â(]qè8â]ààäx]â P]ààäÏNä4â¸]” ä ]âx]” è0âà]|äÈ]â  ]|à Vä,â]ô1äð]â È]ô1|ßIäâ0]t¬ä]â ð]t¬|ßIäâX]”zä@]â]”zðóäh]Ð]âŒ]È©ä€]œUSæ,]|Íäœ]ä|ÍØ]ááÿåäô]ïDá]èüKKøðTÍä<]äTÍx]ááÿåä”]ïDá°]èêÌ]èêè]è8ýì]èÔ\ÿèø]øªä0]äøªl]ÿìäˆ]ïá¤]è|uJìÀ]褮IìÜ]èLÝIøèì´ ]\ä ]ä\D ]ÿìä` ]äðþçá| ]èèì˜ ]èðþøêIìà ]<Ð ]Ä ],ÓKêØ ],ÓKâd ]èóäð ]äèó, ]ÿìäH ]ïífMì° ]À¾ät ]æÀ¾P âÿål ]Ü©åÀ ]äÜ©áü ]ÿìä ]ïá4 ]èìP ]èdýøì ]¨óä| ]ä¨ó¸ ]ÿìäÔ ]äL«[çáð ]èpÃIöðþê( ]$ä ]t!æD ]̪ä8 ]ÔRæ€ ]¼©åT ]伩á ]ááÿåä¬ ]ïDáÈ ]è8ýìd ]èä ]ì âô ]æä ]ò, ]è8ýìH ]è8ýø8ýÿè<]ó ä ]äó Ì ]ááÿåäè ]ïDá]è8ýì ]ÿä ãIìÜ]þ äL]äþ ˆ]ááÿåä¤]ïDáÀ]è8ýø`[[ð˜¾äì]ø]æâ(]X èÈ]èâpêX äø]äH]ãá]2äX](]2”]ÿèäÐ]äÀ]äãø]ì âø] äü]èì]ì âø]ðÀ]ê@]¬’ä(]欒èâh]„– äP]â(]„– è â]̇ äx]âP]̇ èâ¸]XÚä ]âx]XÚèâà]´ëäÈ]â ]´ëðX äð]ø]âÐ]dôä]ädôD]ÿìä`]ïá|]ø˜]ø´]è8ýÿèp]Üäà]äÜ]äÿåä8]ïáT]èêIøêIìŒ]Èä€]̵Zæd]„äœ]䄨]ÿìäô]ïá]è|uJì,]褮IìH]èLÝIøèì@]lät]€]æ â]æ âÀ]p} è]èâpêp} ä]äà]ãá°]2äð]À]2,]ÿèäh]äX]äã]ì â] ä”]è„]ì â]ðX]êØ]qäÀ]æqèã]Íäè]âÀ]Íèâ(]Ää]âè]Äðp} ä8]]â\]ˆ«äP]ô|Xæˆ]ô äl]x]æ â`íZæ ]äþ ä˜]PTOâ\]T«ä°]äT«ì]ááÿåä]ïDá$]èê@]èÿèü]Ääl]äĨ]ááÿåäÄ]ïDáà]è¼Röèì]ôó ä ](ðRæ(ôä$]ä(ô`]ÿìä|]ïá˜]è¼Rê´]è¼Rÿæ]LÏäà]äLÏ]ÿìä8]ïáT]è8ýìp]è8ýìŒ]è8ýì¨]èðþìÄ]è¤-ìà]èðþìü]ÿäpÿìd]Xä(]æXP âÿå€]@ät]ÌRPæ¬]ä]œ]æ â¬]æâÜ]T£è|]èâpêT£ä¬]äü]ãáÌ]2ä ]Ü]2H]ÿèä„]ät]äã¬]ì â¬] ä°]è ]ì â¬]ðt]êô]€ñ äÜ]æ€ñ À°Jä â0],—ä]â Ü],—]äâ êäl]°Ýä@]â ]°ÝX]äâ êä”]|Ì ä|]â @]|Ì ¼RìT£ä¤]¬]âÄ]¨ô ä¼]¨ÚQâà]Ì«äÔ]¤Oæü]8ô äð]œ9Uêðä ]äðH]ÿìäd]ïá€]ÿä¼Rê¸]€ ä¬]|ëPæ]Xõ äÈ]äXõ ]ááÿåä ]ïDá<]è ¦IìX]è êt]ÿäèì ]<õ ä ¼oPÌ]Ðä°]äÐì]ÿìä]ïá$]èpcQì@]ø\]øx]è8ýì”]èt%Kì°]èüKKø¬jQìè]<õäÜ]tKç]õäø]xÒZâ ]Øä]äØL]ááÿåäh]ä(¸IçDá„]èЧIøðþê$ ]ÜÏä°]äÜÏì]ááÿåä ]äôÍSåDíôÍSê@ ] ¬ä4 ]wVæà ]¬äP ]䬌 ]ááÿåä¨ ]ïDáÄ ]ÿô !]„¬äð ]ü ]æ â ‡Tê\¬ä!]œOæD!]L­ä8!]€[Sæ`!]TªåT!]àVæ|!]0­ä p!]ðþå"]œäŒ!]äœÈ!]ááÿåää!]ïDÿἬä"]"]â âH"]¼¬è˜#]èâp꼬ä"]äh"]ãá8#]2äx"]H"]2´"]ÿèäð"]äà"]äã"]ì â"] ä#]è #]ì â"]ðà"]ê`#]„häH#]æ„hèâˆ#]l8 äp#]âH#]l8 èâ°#]Ìä˜#]â p#]ÌÌL켬äÀ#]"]â $]LöäØ#]äLö$]ÿìä0$]ïáL$]è´øIìh$]ø„$]èü Jøt!ìx%]XÀä°$]äXÀì$]ÿìä%]ïá$%]è|uJì@%]褮Iì\%]èLÝIøèì”%]Эäˆ%]ØRæl&]Ñä¤%]äÑà%]ÿìäü%]ïá&]è|uJì4&]褮IìP&]èLÝIøèì|&]Tö ä °ÜNT'](ö äŒ&]ä(ö È&]ÿìää&]ïâ']è|uJì']褮Iì8']èLÝIøèì0)]èõ äd']p']æ â€']æâ°']Ì× é)]èâpêÌ× ä€']äÐ']ãá (]2äà']°']2(]ÿèäX(]äH(]äã€']ì â€'] ä„(]èt(]ì â€']ðH(]êÈ(]øÇå°(]æøÇáàüKäâð(] I äØ(]â °(] I äâ)]Lå)]âØ(]LðÌ× ä()]€']âL)]¼ä@)]àþKæì)]<ä\)]ä<˜)]ááÿåä´)]ïDáÐ)]è@TOÿèŒ*] äü)]ä 8*]ááÿåäT*]ä¼MçDáp*]ÿäd»Lì<+]äÐäœ*]ääÐØ*]ááÿåäô*]ïDá+]ÿä,+]ì â$SMæø+]°ªåL+]ä°ªáˆ+]ááÿåä¤+]ïDáÀ+]èp5WìÜ+]è|ìUÿ윪å,]Xæ-]Áä$,]äÁ`,]ÿìä|,]ïá˜,]èŒì´,]øÐ,]è8ýìì,]ÿäì-]¬®ä ¨S¸-]”«å(-]䔫ád-]ááÿåä€-]ïDáœ-]è| Nøèì/]LÑäÈ-]äLÑ.]ááÿåä .]ïDá<.]èüKKìX.]øt.]ø.]èØËMì¬.]øÈ.]øä.]ù/]èH^Qÿè /],Ñä,/]ä,Ñh/]ááÿåä„/]ïDídýì”0]tö ä°/]ätö ì/]ááÿåä0]ïDá$0]èÖLì@0]ø\0]èìx0]ÿô1]Lä¤0]äLà0]ááÿåäü0]ïDýð1]\®ä(1]ä\®d1]ááÿåä€1]ïDáœ1]è¿Lì¸1]øÔ1]ÿä˜ÝQêt2]@®å2]ä@®<2]ááÿåäX2]ïDýð3] ®ä„2]2]æâÀ2]ènèÀ3]èâpêènä2]äà2]ãá°3]2äð2]À2]2,3]ÿèäh3]äX3]äã2]ì â2] ä”3]è„3]ì â2]ðX3]êØ3]Ä#äÀ3]æÄ#LëTìènäè3]2]æå4]ä<4]ÿìäX4]ïát4]èê4]èÿæô5]L¯ä¼4]äL¯ø4]ÿìä5]ïá05]è8ýìL5]øh5]èðþì„5]ø 5]èpÿì¼5]èðþìØ5]ÿäpÿì 6]l¬å6]6]æ âÌRæl6]L¬å06]æL¬áP âÿåD7]Òä|6]äÒ¸6]ÿìäÔ6]ïáð6]è|uJì 7]褮Iì(7]èLÝIøèìT7](÷ ä ä J,8]èÑäd7]äèÑ 7]ÿìä¼7]ïáØ7]è|uJìô7]褮Iì8]èLÝIøèì:]¤ä<8]H8]æ âX8]æ âˆ8]h×èØ9]èâpêh×äX8]ä¨8]ãáx9]2ä¸8]ˆ8]2ô8]ÿèä09]ä 9]äãX8]ì âX8] ä\9]èL9]ì âX8]ð 9]ê 9]¤b äˆ9]æ¤b ¼RäâÈ9]ì ä°9]â ˆ9]ì ¼Räâð9]ä^äØ9]â °9]ä^¼Rìh×å:]X8]âH<]ÄÑä:] :]ââP:]ÄÑè<]èâpêÄÑä :]äp:]ãá@;]2ä€:]P:]2¼:]ÿèäø:]äè:]äã :]ì â :] ä$;]è;]ì â :]ðè:]êh;]ðæäP;]æðæX+-ââ;]Tîäx;]â P;]Tîðþââ¸;]0©ä ;]â x;]0©ðþâ âà;]4GäÈ;]â  ;]4GX+-ââ<]P„äð;]â È;]P„ðþââ0<]¸”ä<]â ð;]¸”pÃIêÄÑä@<] :]âX=]< äX<]ä< ”<]ááÿåä°<]ïDáÌ<]øè<]èðþì=]è8ýì =]èì‰Iì<=]ÿät!ìL>]tÁäh=]ätÁ¤=]ááÿåäÀ=]ïDáÜ=]è8ýìø=]èì>]ø0>]è„bJøèìh>]àö ä\>]À,Væ„>]ä äx>]LL[æt@]ø®ä”>] >]æ â°>]æ âà>]°ièD@]èâpê°iä°>]å?]ãáÐ?]2ä?]à>]2L?]ÿèäˆ?]äx?]äã°>]ì â°>] ä´?]è¤?]ì â°>]ðx?]ê @]lÌäà?]ælÌø?]äâ â¼ÅUää4@]\¨ä@]âà?]\¨èâ\@]dŒäD@]â@]dŒð°iäl@]°>]æÜ®ä„@]äÜ®À@]ááÿåäÜ@]ïDáø@]è8ýøèì,A]Ä÷ä$A]L|NâB]œ÷ä^ØàäD=^äØà€=^äÿåäœ=^ïá¸=^øÔ=^øð=^è8ýê >^ø(>^è8ýìD>^ÿäèìä>^|¸åp>^ä|¸á¬>^ááÿåäÈ>^ïDíЧIì„?^L¸åô>^äL¸á0?^ááÿåäL?^ïDáh?^è(yPø¤*ì@@^P ä”?^äP Ð?^ááÿåäì?^ïDá@^ø$@^è¼Rÿè\@^<ÎäP@^pkPæC^Ø äl@^x@^æ âˆ@^æä¤@^ïáÀ@^èüKKìÜ@^èOìÌB^èø@^ì âA^æâ8A^¬ÿéœB^èâpê¬ÿåA^äXA^ãá(B^2ähA^8A^2¤A^ÿèäàA^äÐA^äãA^ì âA^ ä B^èüA^ì âA^ðÐA^êdB^xŠ ä8B^æxŠ PB^äâ êäŒB^XäätB^â8B^Xäèâ´B^(Ý äœB^âtB^(Ý ð¬ÿåÄB^A^âèB^ÿô|H^PàäC^ C^æ â0C^æâ`C^ðX èLF^èâpêðX ä0C^ä€C^ãáPD^2äC^`C^2ÌC^ÿèäD^äøC^äã0C^ì â0C^ ä4D^è$D^ì â0C^ðøC^êè¸^èâ`êX>äÀµ^ä¶^ ãáà¶^2ä ¶^ðµ^2\¶^ÿè䘶^䈶^äãÀµ^ì âÀµ^ äĶ^è´¶^ì âÀµ^ðˆ¶^ê·^$ß äð¶^ä$ß ·^äâæH·^ļä$·^ð¶^ļ<·^äâçp·^äX·^â$·^è☷^P®å €·^X·^P®íÀ·^ð|䨷^€·^ð|ìô·^¬Ô äз^¨·^¬Ô è·^èæ(¸^¨O ä¸^â з^¨O ¸^èçãX>ä8¸^Àµ^æ¸ÂäP¸^ä¸ÂŒ¸^ää䨸^öôáâ ¹^0¹^ççäçæáááxýâ¬ièဎâè‹ä€º^äŽâè‹ä¬º^äâè‹ä\»^Šâ“âè‹äè»^ â•âè‹ä˜¼^ä–âè‹äH½^ä™âè‹äø½^ âšâè‹ä¨¾^äšâè‹ä æšâè‹ìœâè‹äX¿^äœâè‹ìâè‹ìŸâè‹äÀ^ä>áçýéغ^0»^øé»^ü:á¤*äý4ÿúðÿááÿÿÿ÷â¨æAôé¼^l¼^øé@¼^ü:á¤*äý4ê@þ&éļ^½^øéð¼^ü:á¤*äý4ê¿ÿÿÿû(ét½^̽^øé ½^ü:á¤*äý4êþé$¾^|¾^øéP¾^ü:á¤*äý4ë8ý(éÔ¾^,¿^øê¿^ü:á¤*äý4í@û(é„¿^Ü¿^øé°¿^ü:á¤*äý4í€ûé4À^ü:á¤*äý|À^Ð äpÀ^ëÁ^¬¿åŒÀ^䬿áÈÀ^ááÿåääÀ^ïDíüPì¼Á^ô äÁ^äô LÁ^äÿåähÁ^ïá„Á^èLJì Á^ÿä LJìxÂ^TÃäÌÁ^äTÃÂ^äÿåä$Â^ïá@Â^è BJì\Â^è BJø BJìÃ^€¿åˆÂ^䀿áÄÂ^ÿìäàÂ^ïáüÂ^è †JøìðÃ^x(ä(Ã^äx(dÃ^ÿìä€Ã^ïáœÃ^è|uJì¸Ã^褮IìÔÃ^èLÝIøèì Ä^¨è Ä^áÄ^°$MêÄ^°$Mâ8Ä^@Ãä,Ä^{MæØÄ^¬ äHÄ^ä¬ „Ä^ÿìä Ä^ïá¼Ä^èèø(Kì”Å^èÕäèÄ^äèÕ$Å^ááÿåä@Å^ïDá\Å^è(PìxÅ^è¬&Pÿæ4Æ^tèä¤Å^ätèàÅ^ááÿåäüÅ^ïDáÆ^èüKKÿè`Æ^(äDÆ^PÆ^æ âý]êÐ'äpÆ^4¢NâPÇ^ äˆÆ^ä ÄÆ^ááÿåäàÆ^ïDáüÆ^è ¦IìÇ^ø4Ç^èüKKøœÉLê(È^8 ä`Ç^ä8 œÇ^ÿìä¸Ç^ïáÔÇ^è|uJìðÇ^褮Iì È^èLÝIøèìôÈ^Ô ä8È^äÔ tÈ^ÿìäÈ^ïá¼È^è¬È^ì âd PæØÈ^è ö|èLìÌÉ^ äÉ^ä @É^ÿìä\É^ïáxÉ^è|uJì”É^褮Iì°É^èLÝIøèìPÊ^ÔÃäÜÉ^äÔÃÊ^ÿìä4Ê^ïíŒìlÊ^H ä`Ê^@øJæ„Ê^ä ä|Ê^ü†Pâ$Ì^Ä(ä”Ê^œÊ^â âÌÊ^Ä(èôË^èâpêÄ(äœÊ^äìÊ^ãá¼Ë^2äüÊ^ÌÊ^28Ë^ÿèätË^ädË^äãœÊ^ì âœÊ^ ä Ë^èË^ì âœÊ^ðdË^êäË^ — äÌË^æ — ¤—Mäâ Ì^8 äôË^âÌË^8 ðÄ(äÌ^œÊ^â@Ì^`Öä4Ì^À­JæXÌ^¤(äPÌ^ ¤[âèÎ^, ähÌ^pÌ^â â Ì^, è¸Î^èâpê, äpÌ^äÀÌ^ ãáÍ^2äÐÌ^ Ì^2 Í^ÿèäHÍ^ä8Í^äãpÌ^ì âpÌ^ ätÍ^èdÍ^ì âpÌ^ð8Í^ê¸Í^è’ä Í^æè’èâàÍ^äô äÈÍ^â Í^äô èâÎ^pnäðÍ^âÈÍ^pnèâ0Î^w äÎ^âðÍ^w èâXÎ^˜ñå@Î^âÎ^˜ñé â€Î^$ähÎ^â@Î^$èâ¨Î^¨Ž äÎ^âhÎ^¨Ž èâÐÎ^ð¯ä¸Î^âÎ^ð¯ð, äàÎ^pÌ^âÏ^DÖäøÎ^@GXæˆÏ^Ì¿åÏ^äÌ¿áPÏ^ÿìälÏ^ïíäPðˆÃä˜Ï^¤Ï^æ”âÔÏ^Ôé°Ñ^èâpêÔå¤Ï^äôÏ^ãáÄÐ^2äÐ^ÔÏ^2@Ð^ÿèä|Ð^älÐ^äã¤Ï^ì â¤Ï^ ä¨Ð^è˜Ð^ì â¤Ï^ðlÐ^ëÑ^ð&äÔÐ^æð&ìÐ^äâ €ê€ä(Ñ^Ì‘ äÑ^âÔÐ^Ì‘ èâPÑ^tË ä8Ñ^âÑ^tË è âxÑ^Øèä`Ñ^â8Ñ^Øèèâ Ñ^¤×äˆÑ^â`Ñ^¤×èâÈÑ^Hf ä°Ñ^âˆÑ^Hf ðÔåØÑ^¤Ï^âœÒ^° äðÑ^ä° ,Ò^ááÿåäHÒ^ïDádÒ^èl?Tì€Ò^èŒÿèXÓ^4 ä¬Ò^ä4 èÒ^ÿìäÓ^ïá Ó^è8ÇKì<Ó^èøÄ¡KìtÓ^¬ÀåhÓ^t \æÓ^0Ää„Ó^Ü™\æ¬Ö^Ä ä Ó^äÄ ÜÓ^ááÿåäøÓ^ïDáÔ^èüKKìÖ^è0Ô^ê â@Ô^æ(âpÔ^œoè`Ö^èâpêœoä@Ô^äÔ^ ãá`Õ^2ä Ô^pÔ^2ÜÔ^ÿèäÕ^äÕ^äã@Ô^ì â@Ô^ äDÕ^è4Õ^ì â@Ô^ðÕ^êˆÕ^¬¨äpÕ^欨¬¨ä$â°Õ^(ä˜Õ^â pÕ^(pƒLäâØÕ^´l äÀÕ^â˜Õ^´l èãÖ^8ŽäèÕ^â ÀÕ^8Žâ â(Ö^@)åÖ^âèÕ^@)éâPÖ^<0å8Ö^âÖ^<0éâxÖ^Ì/å`Ö^â8Ö^Ì/ñœoäˆÖ^@Ô^þ„×^¤ ä¼Ö^ä¤ øÖ^ááÿåä×^äüKKçDá0×^èüKKìL×^èêh×^èœÉLöêäÚ^ØÖä”×^äØÖÐ×^ááÿåä\Ù^äì×^çDá âü×^æâ,Ø^eè,Ù^èâpêeäü×^äLØ^ãáÙ^2ä\Ø^,Ø^2˜Ø^ÿèäÔØ^äÄØ^äãü×^ì âü×^ åÙ^èðØ^ì âü×^ðÄØ^êDÙ^Áä,Ù^æÁðeäTÙ^ü×^âxÙ^ø”Ù^ø°Ù^øÌÙ^øèÙ^øÚ^ø Ú^ø<Ú^øXÚ^øtÚ^øÚ^ø¬Ú^øÈÚ^ÿäêÜ^ˆÀåôÚ^äˆÀá0Û^ááÿåäLÛ^ïDáhÛ^è8ýì„Û^èèì Û^èèì¼Û^èèìØÛ^èèìôÛ^èÿì)ä Ü^¬¹]æHÜ^Ø ä<Ü^êÔÝ^\ äXÜ^dÜ^æ âtÜ^æâ¤Ü^°è¤Ý^èâpê°ätÜ^äÄÜ^ãá”Ý^2äÔÜ^¤Ü^2Ý^ÿèäLÝ^ä<Ý^äãtÜ^ì âtÜ^ äxÝ^èhÝ^ì âtÜ^ð<Ý^ê¼Ý^XUä¤Ý^æXUVPì°äÌÝ^tÜ^âpÞ^  ääÝ^ðÝ^æ ãÞ^æäÞ^ïá8Þ^è8ýìTÞ^謲SÿæˆÞ^¬ ä€Þ^P©Qâ(ß^D*ä˜Þ^äD*ÔÞ^ááÿåäðÞ^ïDá ß^èðþøì‰Iìäß^\×ä8ß^ä\×tß^ááÿåäß^ïDá¬ß^è(PìÈß^è¬&Pÿèüß^@×äôß^BWâà^ì)ä à^ &\æœà^ø ä(à^äø dà^ááÿåä€à^ïDíüKKðd ä¬à^¸à^æ(âèà^\ièÀä^èâ`ê\iä¸à^äá^ ãáØá^2äá^èà^2Tá^ÿèäá^ä€á^äã¸à^ì â¸à^ ä¼á^è¬á^ì â¸à^ð€á^ëâ^4Xäèá^æ4Xè$â(â^ÔYäâ^âèá^ÔYè"âPâ^$ä8â^ââ^$è âxâ^œºå`â^â8â^œºéâ â^Xé äˆâ^â`â^Xé èâÈâ^ôC ä°â^âˆâ^ôC èâðâ^¸¼äØâ^â°â^¸¼èâã^­åã^âØâ^­è â°ä^|8 ä(ã^ã ã^|8 @ã^äââpã^¨2è˜ä^è`æèà^¨2ä@ã^äã^ãá`ä^2ä ã^pã^2Üã^ÿèää^ää^äã@ã^ì â@ã^ äDä^è4ä^ì â@ã^ðä^êˆä^ÜSäpä^æÜSð°{ä˜ä^âpä^°{ììä^ð|äÀä^â (ã^ð|Øä^è êè\iäüä^¸à^âˆå^|*äå^ä|*På^ÿìälå^ïí *Lì`æ^€ ä˜å^ä€ Ôå^ÿìäðå^ïá æ^è|uJì(æ^褮IìDæ^èLÝIøèì¬æ^Øäpæ^æØP âÿåøæ^ ê伿^æ êP âÿå˜ç^øéäç^äøéDç^ÿìä`ç^ïá|ç^èl?TøŒì$é^4 ä¨ç^´ç^æ âÄç^æâôç^¼pèôè^èâpê¼päÄç^äè^ãáäè^2ä$è^ôç^2`è^ÿèäœè^äŒè^äãÄç^ì âÄç^ äÈè^è¸è^ì âÄç^ðŒè^ê é^XUäôè^æXUVPì¼päé^Äç^âPé^Üéä4é^@é^æ â`š]æë^Áå`é^hé^â â˜é^Áéèê^èâpêÁåhé^ä¸é^ãáˆê^2äÈé^˜é^2ê^ÿèä@ê^ä0ê^äãhé^ì âhé^ älê^è\ê^ì âhé^ð0ê^ê°ê^øÇå˜ê^æøÇáàüKäâØê^|zäÀê^â ˜ê^|zPLäãë^¼S äèê^â Àê^¼S À°JìÁåë^hé^â0ë^  ä(ë^øÒRâìë^á ä@ë^å |ë^ááÿåä˜ë^ïDá´ë^è(yPìÐë^è ÖQÿèì^Ô×äüë^ÌÅJâˆì^ÜÄäì^äÜÄPì^ááÿåälì^ä8ýçDý`í^”×ä˜ì^ä”×Ôì^ááÿåäðì^ïDá í^èüKKì(í^è¼RêDí^ÿ䈉OìŒí^LÄäpí^|í^æ âüæ]êì äœí^ WNâDî^”Åä´í^ä”Åðí^ááÿåä î^ïDá(î^èø¬ÞUìTî^T+ä èÖJ,ï^àêädî^äàê î^ÿìä¼î^ïáØî^è|uJìôî^褮Iìï^èLÝIøèìð^(+ä<ï^ä(+xï^ÿìä”ï^ïá°ï^è|uJìÌï^褮Iìèï^èLÝIøèìÀð^á+äð^å+Pð^ÿìälð^ïáˆð^è\èJì¤ð^è\èJø˜KìDñ^ØÁåÐð^äØÁá ñ^ÿìä(ñ^ïílûJì`ñ^¼Áå Tñ^”àUäó^à*äpñ^xñ^ââ¨ñ^à*èäò^èâpêà*äxñ^äÈñ^ãá˜ò^2äØñ^¨ñ^2ò^ÿèäPò^ä@ò^äãxñ^ì âxñ^ ä|ò^èlò^ì âxñ^ð@ò^êÔò^8X ä¨ò^æ8X Àò^äâ êäüò^ð3ääò^â¨ò^ð3ðà*ä ó^xñ^â,ó^( ä$ó^pVâô^€Áå<ó^ä€Ááxó^ááÿåä”ó^ïDá°ó^èdýìÌó^èêèó^èöØËMìÀô^˜ äô^ä˜ Pô^ÿìälô^ïáˆô^ø¤ô^è¼Rÿè÷^  äÐô^Üô^æ âìô^æ,âõ^ô6èäö^èâpêô6äìô^ä<õ^ãá ö^2äLõ^õ^2ˆõ^ÿèäÄõ^ä´õ^äãìô^ì âìô^ äðõ^èàõ^ì âìô^ð´õ^ê4ö^ ÷åö^æ ÷ápƒLäâ\ö^|{ äDö^âö^|{ áËJäâ„ö^àålö^âDö^àâËJä â¬ö^„u ä”ö^âlö^„u èâÔö^ÈLä¼ö^â”ö^ÈLèâüö^l‹ääö^â¼ö^l‹ðô6ä ÷^ìô^â0÷^dÁå$÷^äýMê(Øä@÷^L÷^æ â\÷^æäx÷^ïá”÷^è ~Qì°÷^è¼RêÌ÷^è¼Rÿè¤ø^ äø÷^ä 4ø^ÿìäPø^äðþçálø^èèìˆø^èðþøhåMì|ù^|Æä´ø^ä|Æðø^ÿìä ù^ïá(ù^è|uJìDù^褮Iì`ù^èLÝIøèìú^d äŒù^äd Èù^ÿìääù^ïâú^è(ìJøì¼ú^Ü ä,ú^äÜ hú^ÿìä„ú^ïá ú^è8ýøìÔú^@ äÌú^Ø_Oâìú^X ääú^ø]âTÿ^àÅäüú^äàÅ8û^ð¨û^öäTû^ä8ýäáápû^èt!ìŒû^è8ýø8ýìü^Xü^ççäçæáááxýâ8ðt!äìá @¸ã 8ýäíá @V 8ýäîá @ádêäpü^ä2á8ýäœü^ü8é Èü^°ý^ý^ô:âôü^ätý^ü âý^æä ý^ïDá<ý^è¤-ìXý^ÿôä8;ý^ááÿä <þ^¸ý^2á¤-ääý^üát!äþ^ü:áü‚Yäìý Èþ^Dþ^2épþ^üá8ýäœþ^ü:át!äíÿáÐþ^2éüþ^üá8ýä(ÿ^ü:át!äîÿáëädÿ^äë ÿ^ÿìä¼ÿ^ïáØÿ^øôÿ^ÿô(_< ä _Ø4UâÈ_$ ä8_ä$ t_ááÿåä_ïDá¬_ÿä LJì¤_ äØ_ä_æ âô_æ â$_l èt_èâpêl äô_äD_ãá_2äT_$_2_ÿèäÌ_ä¼_äãô_ì âô_ äø_èè_ì âô_ð¼_ê<_¤jä$_æ¤jèâd_$ÄäL_â$_$ÄèâŒ_Ljät_âL_Ljðl äœ_ô_â`_üëä´_äüëð_ÿìä _ïá(_訃KìD_èøèsKí_$,äp_ä$,¬_ÿìäÈ_ïáä_èœKPø¸NPìØ_Ôëä_äÔëL_ÿìäh_ïá„_è|uJì _褮Iì¼_èLÝIøèìð_¸ëäè_¨_\â _¤Âæ_ä¤Âá<_ááÿåäX_ïDát_è8ýø_ì ⌈Qæ\_ÈØä°_äÈØì_ááÿåä_ïDá$_è´Wì@_è4Nÿèü_¬ äl_ä¬ ¨_ááÿåäÄ_ä$SMçDáà_è¼Rÿæ¸_È ä _äÈ H_ááÿåäd_ïDá€_è8ýìœ_èÿìÄ+äÈ_äÄ+_ááÿåä _ä8ýçDí8ýêL_´Çä PòQ _@Ãå\_ä@Ãá˜_ÿìä´_ïáÐ_èÈŸLìì_ÿå£Lì¨ _t ä _ät T _ÿìäp _ïጠ_èL Sø\èJì€ _à,ä¸ _äà,ô _ááÿåä _ïDá, _è8ýìH _èLÝIìd _è¼RÿèÄ _¬Ùä _œ _æ ⬠_æäÈ _ïáä _è8ýë _øŒ _è _ì â, _æâ\ _< è\ _èâpê< ä, _ä| _ãáL _2äŒ _\ _2È _ÿèä _äô _äã, _ì â, _ ä0 _è _ì â, _ðô _êt _ Éä\ _æ Éð< ä„ _, _⨠_è8ýø8ýìÜ _œÇäÔ _øªQâô _À,äì _PoWâø _ ,ä _ä ,@ _ááÿåä\ _ïDáÜ _èx _ì ∠_æä¤ _ïáÀ _è¼Rÿÿä$_t ä__æ âܱ\êXÇä4_äXÇp_ÿì÷áH_¬ äœ_ä¬ Ø_ÿìäô_ïá_ø,_ÿô _ÃåX_äÃá”_ÿìä°_ïáÌ_è|uJìè_褮Iì_èLÝIøèì<_” ä0_ü Jæˆ_pÈäL_æpÈP âÿå`_¸! ä˜_ä¸! Ô_ÿìäð_ïá _è|uJì(_褮IìD_èLÝIøèìp_$ äÄ¡RŒ_á ä€_ _æ¨_<íäœ_Ô Mæœ_Úä¸_äÚô_ááÿåä_ïDá,_è8ýìH_è€^ìd_è„bJì€_è„bJøÜ“^ìX_äìä¬_ääìè_ááÿåä_ïDá _èdýì<_èœÉLÿì¬ìäh_ä¬ì¤_ááÿåäÀ_ïDáÜ_è8ýìø_èœPSì_è8ýÿèH_p ä@_L=Qâd_Ì äX_hRæ„_ÐÚ<_t_äÐÚ°_äÿääÌ_ïáè_èêIì_èêIì _ÿøD_ä ÐÚ€_îð_öäœ_ìáá¸_èêIìÔ_èêIÿèd_ _ççäçæáááxýâ ¦ êIä€á @`!êIäá@ؽè‚á @áT¹ä¸_ä8é ä_ _°_ô:â_ät_ü â°_æ _(_áêIäT_ü:á€_ä€ý âêIæ ð_˜_áêIäÄ_ü:á€_äý P_ø_é$_ü:áèä‚ÿáX_4ÿê$_X ä”_äX Ð_ááÿåäì_ïDá_ÿä LJì@_¸Úä4_(\Næ_ÜíäP_äÜíŒ_ÿìä¨_ïáÄ_è|uJìà_褮Iìü_èLÝIøèìð_˜ ä(_ä˜ d_ÿìä€_ïáœ_è|uJì¸_褮IìÔ_èLÝIøèì_¨íå_ä¨í<_ÿìäX_ïát_訃Kø êIì0_  ä _ä  Ü_ÿìäø_ïá_è´øIøèJì_ø-ä@_äø-|_ÿìä˜_ïá´_è|uJìÐ_褮Iìì_èLÝIøèì$_Éä _¬²Sä¨_Ì-ä4_äÌ-p_ááÿåäŒ_äH^QçDýd_`íä¸_ä`íô_ÿìä_ä¼Rçá,_è¼RìH_ÿø -ät_ä -°_ÿìäÌ_ïáè_ÿôÜ_|.ä_ä|.P_ÿìäl_ïáˆ_è|uJì¤_褮IìÀ_èLÝIøèìì_ ä ¨«PŒ _ø äü_äø 8 _ÿìäT _ïáp _èèøX+-ì¨ _Ð äœ _8ÝXæd!_<Äå¸ _ä<Äáô _ááÿåä!_ïDá,!_èЧIìH!_èðþøðþê!_lÉät!_€!_æ âœÊ^æh"_8îä !_ä8îÜ!_ááÿåäø!_ïDá"_èhÑRê0"_øL"_èðþøèì€$_XÉäx"_€"_ââ°"_XÉèP$_èâpêXÉä€"_äÐ"_ãá #_2äà"_°"_2#_ÿèäX#_äH#_äã€"_ì â€"_ ä„#_èt#_ì â€"_ðH#_êÈ#_Ào ä°#_æÀo èâð#_—äØ#_â °#_—â â$_Læå$_â Ø#_Læââ@$_ïä($_ã $_ïââh$_ ÉäP$_â($_ ÉðXÉäx$_€"_â˜$_¬ ä$_P YæäÚä¨$_h&äÚœÜ?ò`Ü?ö„%_p äô$_äp 0%_ááÿåäL%_ïDáh%_ÿä LJì %_ $ ä”%_pJæx'_ÀÛä°%_¸%_ââè%_ÀÛèH'_èâpêÀÛä¸%_ä&_ãáØ&_2ä&_è%_2T&_ÿèä&_ä€&_äã¸%_ì â¸%_ ä¼&_è¬&_ì â¸%_ð€&_ê'_TIäè&_æTIá'_äâ â0³Wæ8'_|«ä '_â è&_|«àüKäâ`'_ðäH'_â '_ðÀ°JìÀÛäp'_¸%_â”'_\ äˆ'_|u\æP(_À# ä¤'_äÀ# à'_ááÿåäü'_ïDá(_ø4(_è€åZÿè )_ˆÉä`(_äˆÉœ(_ááÿåä¸(_ïDáÔ(_èÚYìð(_è´Wø8ýìä)_Œîä)_äŒîX)_ááÿåät)_ä¼RçDá)_ø¬)_è¼RêÈ)_è¼RÿæØ*_,# äô)_ä,# 0*_ááÿåäL*_ïDáh*_è8ýì„*_èÈì *_èÈì¼*_èÈøÈðØ.$+_è*_h&Ø.`gæêÐgú,+_h&Ø.(Ý?îìÜ?ö„+_0Êäx+_äNLæ\,_, ä”+_ä, Ð+_ÿìäì+_ïá,_è|uJì$,_褮Iì@,_èLÝIøèì4-_  äl,_ä  ¨,_ÿìäÄ,_ïáà,_è|uJìü,_褮Iì-_èLÝIøèì ._tÜäD-_ätÜ€-_ÿìäœ-_ïá¸-_è|uJìÔ-_褮Iìð-_èLÝIøèì(._Êä._ü†Pæä._0Üä8._ä0Üt._ááÿåä._ïDá¬._øÈ._ÿôì0_àÉäô._á/_æâ0/_ðöé¼0_èâ@êðöæ/_äP/_ãá 0_2ä`/_0/_2œ/_ÿèäØ/_äÈ/_ää/_ì ã/_ ä0_èô/_ì ã/_ðÈ/_ê\0_<£ä00_æ<£H0_ä â êä„0_¼þäl0_â00_¼þèâ¬0_Ð0 ä”0_âl0_Ð0 èâÔ0_@­ä¼0_â”0_@­ððöåä0_á/_âP2_ïäü0_äï81_ááÿåäT1_ïDáp1_èüKKìŒ1_ø¨1_øÄ1_øà1_øü1_ø2_ø42_ÿô(3_ÄÉä`2_äÄÉœ2_ááÿåä¸2_ïDáÔ2_èLëTìð2_è8ýì 3_ÿä°ëTìD3_øîä83_TÇPæ85_Ì äT3_`3_æ(â3_Ì~ è5_èâpêÌ~ ä`3_ä°3_ãá€4_2äÀ3_3_2ü3_ÿèä84_ä(4_äã`3_ì â`3_ äd4_èT4_ì â`3_ð(4_ê¨4_H ä4_æH |"TäâÐ4_x#ä¸4_â 4_x#d‡Mäâø4_”äà4_â ¸4_”d‡Mäâ 5_ô}ä5_â à4_ô}d‡MìÌ~ ä05_`3_âØ5_äÛäH5_ääÛ„5_ÿìä 5_ä¼Rçá¼5_è¼Rø¼RîÄîäè5_äÄî$6_ð@6_öôé´6_ççäçæáááxýâ5â? äÌ6_ä4êdþ7_ÄÅå7_à„Ræì7_,ðä$7_ä,ð`7_ÿìä|7_ïá˜7_è|uJì´7_褮IìÐ7_èLÝIøèì8_ÄÊäü7_´©Tæü8_ ä8_ä T8_ÿìäp8_ä8ýçáŒ8_èdýì¨8_øÄ8_øà8_è¼Rÿè¸9_dÊä 9_ädÊH9_ááÿåäd9_ïDá€9_øœ9_èÿèt=_DÊäÈ9_Ô9_æ âä9_æôá:_L èD=_èâpêL ää9_ä4:_ãá;_2äD:_:_2€:_ÿèä¼:_ä¬:_äãä9_ì âä9_ äè:_èØ:_ì âä9_ð¬:_ê,;_H^ ä;_æH^ P¯Mä˜áT;_ð«ä<;_â ;_ð«P¯Mä<á|;_Àôäd;_â <;_ÀôP¯Mäàâ¤;_läŒ;_âd;_lèÜâÌ;_€Jä´;_âŒ;_€JèØâô;_T£ äÜ;_â ´;_T£ P¯Mä|â<_ØHä<_âÜ;_ØHèxâD<_Ô] ä,<_â<_Ô] ètâl<_|V äT<_â ,<_|V P¯Mäâ”<_ 7 ä|<_âT<_ 7 èâ¼<_üÊä¤<_â|<_üÊèâä<_€6äÌ<_â¤<_€6è â =_¨Jäô<_âÌ<_¨Jèâ4=_(È ä=_âô<_(È èâ\=_ ÉäD=_â=_ ÉðL äl=_ä9_æ´Üä !U\>_x% ä”=_äx% Ð=_ÿìäì=_ïá>_è|uJì$>_褮Iì@>_èLÝIøèìl>_Ð ä «Pˆ>_´ ä|>_x"Næ¤>_HÆå ˜>_ä¸VäÀ>_ ä´>_t€LæØ>_è äÐ>_ áTâ°?_Pðäè>_äPð$?_ááÿåä@?_ïDá\?_謲Sêx?_ø”?_èðþøèìÜ?_” äÀ?_Ì?_æ âP¬Jæ|@_| äì?_ä| (@_ÿìäD@_ä|u\çá`@_è¼Rö¼RêTA_ ÆåŒ@_ä ÆáÈ@_ááÿåää@_ïDâA_èdýìA_è¼Rê8A_è¼RöØËMìB_Ì ädA_äÌ  A_ÿìä¼A_ïáØA_øôA_èÿèÈB_PÝä B_,B_æ â`ãdn_äm_âˆn_XÎä|n_pÞLæ`o_À' ä˜n_äÀ' Ôn_ÿìäðn_ïá o_è|uJì(o_褮IìDo_èLÝIøèì|o_ìÈåpo_È VæŒo_ÜÈå ôVJHp_€2äœo_ä€2Øo_ááÿåäôo_ïDáp_èЧIì,p_èðþøðþê`p_t' äXp_l;Mâ|p_<Îäpp_Ô/\æ˜p_àäŒp_PôNæ´s_$ ä¨p_ä$ äp_ááÿååq_ïDáq_èüKKì˜s_è8q_ê âHq_æ(âxq_ uèhs_èâpê uäHq_ä˜q_ ãáhr_2ä¨q_xq_2äq_ÿèä r_är_äãHq_ì âHq_ äLr_è[æx_<Ìå°œ_ä<Ìáìœ_ÿìä_ïá$_èdýì@_èê\_èöêž_x äˆ_äx Ä_ááÿåäà_ïDáü_èdýøX¾N츞_ô4ä(ž_äô4dž_ÿì䀞_ï᜞_èÈÒWø¤-ìŸ_¼4äÈž_ä¼4Ÿ_ÿìä Ÿ_ïá<Ÿ_è|uJìXŸ_褮IìtŸ_èLÝIøèì Ÿ_Œ ä 4±WìŸ_<+ ä°Ÿ_æ<+ P âÿå _< äüŸ_, _â  _¸ôä _¬òMæÔ¡_ãä0 _< _æ âL _æ0â| _Œè餡_èâpêŒèåL _䜠_ãál¡_2䬠_| _2è _ÿèä$¡_ä¡_äãL _ì âL _ äP¡_è@¡_ì âL _ð¡_ꔡ_Šä|¡_æŠ I]ä⼡_ÜS 䤡_â |¡_ÜS `°°Jæð>`È>ä(>`äÈ>d>`ááÿåä€>`ïDáœ>`ø¸>`øÔ>`ÿäÔ)ìt?` % å?`ä % äðd`¤-æœe`Lä e`äLHe`ááÿåäde`ä8ýçDá€e`èÿè f`(ðä¬e`ä(ðèe`ááÿåäf`ïDíìøf`´Þä0f`ä´Þlf`ÿìäˆf`ïá¤f`è|uJìÀf`褮IìÜf`èLÝIøèìg`Ä6 ä 8¬PTg`Ô?äg`æÔ?P âÿå,h`”Þädg`ä”Þ g`äÿåä¼g`ïáØg`øôg`è¼Rêh`èì‰IøèìDh`ðäAòH>Aö@ê`Ø/ äé`äØ/ Dé`ÿìä`é`ïá|é`èê˜é`èê´é`èêÐé`èììé`øê`èX+-ì$ê`ÿäèì\ê`LøäPê`H äxð`€ð`ââ°ð`X> éò`èâpêX> ä€ð`äÐð`ãá ñ`2äàð`°ð`2ñ`ÿèäXñ`äHñ`äã€ð`ì â€ð` ä„ñ`ètñ`ì â€ð`ðHñ`êÈñ`ìä°ñ`æìèâðñ`ˆäØñ`â°ñ`ˆèâò`üÒ åò`âØñ`üÒ ðX> ä(ò`€ð`â\ò`h/ ä@ò`Lò`æ âX_æó` älò`ä ¨ò`ááÿåäÄò`ïDáàò`èüKKìüò`è<*KøœÉLê¸ó`ø ä(ó`äø dó`ááÿåä€ó`ïDáœó`èdÉJødÉJðP/ äÈó`ø@^æ¬ô` éääó`ä é ô`ÿìä<ô`ïáXô`èdýìtô`øô`ÿô¼ô`Èøä ¶Z”õ`ÐèäÌô`äÐèõ`ÿìä$õ`ïá@õ`è´øIì\õ`øxõ`è9Jø¨Sìlö` 0 ä¤õ`ä 0 àõ`ÿìäüõ`ïáö`è|uJì4ö`褮IìPö`èLÝIøèìˆö`¬øä|ö`¤àUæù`È, ä˜ö`¤ö`æ â´ö`æ(âäö`á= èÔø`èâpë= ä´ö`ä÷` ãáÔ÷`2ä÷`äö`2P÷`ÿèäŒ÷`ä|÷`äã´ö`ì â´ö` ä¸÷`è¨÷`ì â´ö`ð|÷`êü÷`”Àää÷`æ”Àè!â$ø`¤{ ä ø`âä÷`¤{ è âLø`h€ä4ø`â ø`h€èâtø`­ä\ø`â 4ø`­8ýäâœø`ä¹ ä„ø`â \ø`ä¹ 0—IäâÄø`d!䬸`â „ø`d!0—Iäâìø`øÏäÔø`â ¬ø`øÏ0—Ií= äüø`´ö`âù`”øä ýO°ù`Ü> ä$ù`0ù`æ â@ù`æä\ù`ïáxù`è8ýì”ù`èhÑRÿæˆú`¬, äÀù`ä¬, üù`ááÿåäú`ïDá4ú`èüKKìPú`ølú`ÿäðÊJì(û`tèä˜ú`ätèÔú`ááÿåäðú`ïDá û`ÿä8ýð|, ä8û`ä\æäû`T0 äTû`äT0 û`ááÿåä¬û`ïDáÈû`èøX+-ì ü`„ùäôû`ä„ù0ü`äÿåäLü`ïáhü`è\èJì„ü`èö˜Kììü`œ? ä°ü`æœ? P âÿåŒý`Xùäüü`äXù8ý`ÿìäTý`ïápý`èØRù£Lìdþ`Péäœý`äPéØý`ÿìäôý`ïáþ`è|uJì,þ`褮IìHþ`èLÝIøèìtþ`- ä $ŽYÀþ`(éä„þ`h&(é$?Aòè>AöÐþ`ÔIä è¶L¨ÿ`x? äàþ`äx? ÿ`ááÿåä8ÿ`ïDáTÿ`èЧIìpÿ`èèìŒÿ`èèÿì? ä¸ÿ`Äÿ`æ âp`æäa¸? ääÿ`ä¸? aÿìä<aïáXaè$SMìtaøaèê¬aè8_KìÈaÿôôaÔJä J a”0 äaaæ â|íMæ¤a´ùä0aä´ùlaááÿåäˆaä8ýçDí8ýì€a¨éä´a¼aââìa¨éè<aèâpê¨éä¼aä aãáÜa2äaìa2Xaÿèä”aä„aäã¼aì â¼a äÀaè°aì â¼að„aêaL` äìaæL` èâ,a¸äaâìa¸èâhaŒ‚ ä<aâ aŒ‚ Taè êè¨éäxa¼aâœa„ äaЙ`æ¸aüãå¬a bRæta„JäÈaä„Jaÿìä aïá<aøXaèøèìøa(- ä„aä(- ÀaááÿåäÜaïDíl Zêap äaP¯Mê”éä$a `QæÐa<1 ä@aä<1 |aÿìä˜aïá´aèdýøèìàa„êä ØT¸a`êäðaä`ê,aÿìäHaïádaè|uJì€a褮IìœaèLÝIøèìäaè- ÔaÈalÊRêÜalÊRâ0ad- äôah&d- FAòÌEAö|aÐ0 ä@ah&Ð0 ¨FAòlFAöÈa¼0 äŒah&¼0 dGAò(GAö„a|úäØaä|úaÿìä0aïáLaè8ýìhaè¼Rö¼Rê aXKä”a8ÝXæ¸aêä°aì.[âÔa$úäÈa@<\ê´ ääah&´ à?Að¤?Aöø a,A ä0 aä,A l aÿìäˆ aïᤠaè¼RêÀ aè¼RêÜ aè¼Rö¼Rê˜ aØêä aäØêD aÿìä` aïá| aèHlKø sKìä aTûä¨ aæTûP âÿå a4 äô aá aæ â :]ë ä aæ< aüä xT aüKäL aäüKˆ aááÿåä¤ aïDáÀ aèÐîLìÜ aøø aè,ÒLøX+-ì˜ ad2 ä$ aäd2 ` aááÿåä| aïDíìÄ aÀûä¨ a´ aæ â´MQæd aÈKäÔ aäÈK aÿìä, aïáH aéÃMøÄJìt a ä ì°WLa . ä„ aä . À aÿìäÜ aïáø aè|uJìa褮Iì0aèLÝIøèìxa€ëha\aá Uêpaá Uâ aàA äˆaäàA Äaÿìäàaïíüaì â,¼Uæaåå ¬¡RÔaø ä,a8aæâhaðõé¤aèâpêðõå8aäˆaãáXa2ä˜aha2Ôaÿèäaåaäã8aì â8a ä<aè,aì â8añaê€aØfähaæØf8ýäâDa¤u äaâ ha¤u ¨aä â â¸aæäÔaäø÷Kåáðaè8ýì aø(aèxùKø8ýìlaHŽäTaâaHŽèâ”a\Âå|aâTa\Âéâ¼a Éä¤aâ|a ÉððõåÌa8aâaH2 ääaäH2 aááÿåä<aäÐúKçDáXaè¼RêtaÿäÐúKèâ¼a ûä a¬aæ âPE]æ@aôäåÌaäôäáaááÿåä$aïDí8ýìàaŒA äPaäŒA Œaÿìä¨aïáÄaè¼Rø¼Rìüaëäða´zPæaÀ ä a YæXa 2 ä(a0aâ$â`a 2 è(aèâpê 2 ä0aä€aãáPa2äa`a2Ìaÿèäaäøaäã0aì â0a ä4aè$aì â0aðøaêxaá ä`aç è â a°øäˆaâ`a°øèâÈap" ä°aâ ˆap" ´ äâðaÐÝ äØaâ °aÐÝ ´ ä âa:åaâ Øa:´ äâ@aèqä(aãaèqð 2 äPa0aâÜa| ähaä| ¤aááÿåäÀaïDí 'VêTaX äìaøaæâ(a\è$aèâpê\äøaäHaãáa2äXa(a2”aÿèäÐaäÀaäãøaì âøa äüaèìaì âøaðÀaêœaå(aæá@aäââpaÌ èpaèâpæ(aÌ ä@aäaãá`a2ä apa2Üaÿèäaäaäã@aì â@a äDaè4aì â@aðaî8‡äpaæ8‡ˆaè êäÄaìèå¬aâ(aìèáP äâìaqäÔaâ¬aqèâal%äüaâÔal%èâ<a£ ä$aâüa£ ð\äLaøaæTA ädaÀ~RâÐa¤åå|aä¤åá¸aÿìäÔaïáðaè8ýì aø(aèìDaø`aèpÿì|aèpÿì˜aèèì´aèpÿøpÿì, a83 äàaìaæ âüaæBâ,a¼aèüaèâ@ê¼aäüaäLaãáa2ä\a,a2˜aÿèäÔaäÄaäãüaì âüa åaèðaì âüaðÄaêDal~ä,aæl~8ýä>âlaÐÉ äTaâ ,aÐÉ 8ýä:â”aÈÂä|aâ TaÈÂâ6â¼al¢ä¤aâ |al¢â2âäal¡äÌaâ¤al¡á3Qä.â aw äôaâ Ìaw Vä*â4aPw äaâôaPw è&â\aÈ5äDaâ aÈ5 ~Qä"â„aÀµ älaâDaÀµ è â¬a¼ùå”aâla¼ùéâÔaà ä¼aâ”aà èâüa¤|ääaâ¼a¤|èâ$a,ä aâäa,èâLa(=ä4aâ a(=èâta˜†ä\aâ 4a˜†üKKäâœaØhä„aâ \aØh8ýä âÄatä¬aâ „at8ýäâìaœÑäÔaâ ¬aœÑdýäâ aø<åüaâÔaø<ñ¼aä$ aüaâD a / ä< aaá1 äø=a>aæ ât†Uæ˜>aÔ0 ä$>aäÔ0 `>aááÿåä|>aäçDíìl?a´íä¨>a´>aæ âÄ>aæäà>aïáü>aèüKKì?aø4?aøP?aÿôð?a çå|?aä çá¸?aááÿåäÔ?aä8ýçDý @aäMå@a`fPêœíä@aÌmUâü@aÌE ä4@aäÌE p@aÿìäŒ@aïá¨@aè£OìÄ@aøà@aèèæîÀ­OèâHAa´îä Aaæ´îP âÿåÌAa„1 äXAaä„1 ”Aaÿìä°AaïíäJì¤BaÐ5 äÜAaäÐ5 Baÿìä4BaïáPBaè|uJìlBa褮IìˆBaèLÝIøèìðBaœE ä´BaæœE 8ýäÿå CapîåCaÈí`çDa0îäCaä0îXCaááÿåätCaïDáCaø¬CaèðþìÈCaè<6PìäCaÿäðþìDaîäDa Ï[â4Da,èå(DaÌ®ZæPDaèåDDa([æÈEaT5 ä`DahDaââ˜DaT5 è˜EaèâpêT5 ähDaä¸DaãáˆEa2äÈDa˜Da2Eaÿèä@Eaä0EaäãhDaì âhDa älEaè\Eaì âhDað0Eaê°Ea ùä˜Eaæ ùðT5 äÀEahDaâôEaáäØEaäEaæ â2]êÌíäFa„Yæ Ga\F ä Faä\F \FaÿìäxFaïá”Faè$SMì°FaøÌFaè¼RêèFaè8_KìGaÿôKæHoa<ä¸naä<ônaäÿåäoaïá,oaè ¦Iøê paÐëåXoaäÐëá”oaÿìä°oaïáÌoaè|uJìèoa褮IìpaèLÝIøèì0pa¼ëå ÌTJqaàä@paäà|paááÿåä˜païDá´paè8ýìÐpaè0—IììpaèDÓOÿìÌäqaê@qaìå4qaà•RælsahäPqa\qaæâŒqahèTsaèâpêhä\qaä¬qaãá|ra2ä¼qaŒqa2øqaÿèä4raä$raäã\qaì â\qa ä`raèPraì â\qað$raê¤ra4”äŒraæ4”èâÌraä¶å´raâŒraä¶éâôraXBäÜraâ´raXBè âsa€ äsaâÜra€ èâDsaôà ä,saâsaôà èæp¾åTsaâ,sap¾í¸satóä|saætóP âÿåÈsa(ä #^àsa äØsaX¬]âäuaðäðsaüsaæ â taæâ äx‘aäÄ> ´‘aÿìäБaïáì‘aèHlKø sKìT’a¤L ä’aæ¤L 8ýäÿåH“ah> äd’aäh>  ’aááÿåä¼’aïDáØ’aè8ýìô’aø“aø,“aè„bJøèì ”a\L äX“aä\L ”“aááÿåä°“aïDáÌ“aèÖLìè“aø”aÿä öXê<”a„îå0”a|GPêläL”aX”aæ âh”aæä„”aïá ”aè8ýì¼”aÿä8ýì°•aLäè”aäL$•aÿìä@•aïá\•aèlLìx•aèlL씕aÿôP–aÐïåÀ•aäÐïáü•aÿìä–aïá4–a訃KøÔ)ìh–a$ä`–aTâ\˜a¸ïåx–a„–aæâ´–a˜õè,˜aèâpê˜õä„–aäÔ–aãᤗa2ää–a´–a2 —aÿèä\—aäL—aäã„–aì â„–a 䈗aèx—aì â„–aðL—aêÌ—a¸L ä´—aæ¸L è âô—a¤b äÜ—aâ ´—a¤b äâ˜aì ä˜aâ Ü—aì äâD˜aä^ä,˜aâ ˜aä^ì˜õäT˜a„–aât˜a€äl˜a\²UâL™ahï儘aähïáÀ˜aááÿåäܘaïDáø˜a謲Sê™aèt!ì0™aè°°Jø°°Jìd™a(Tä\™adQâà›ahät™a€™aæ â™aæâÀ™a}è°›aèâpê}ä™aäà™a ãá°ša2äð™aÀ™a2,šaÿèähšaäXšaäã™aì â™a 䔚a脚aì â™aðXšaêØšad+äÀšaæd+èã›aá-äèšaâÀšaá-èâ(›aì¡ ä›aâèšaì¡ èâP›a€1 ä8›aâ›a€1 è âx›a`Ñ ä`›aâ8›a`Ñ èâ ›a¸L 䈛aâ`›a¸L èâÈ›a Éä°›a∛a Éð}䨛a™aâdœaDäð›aäD,œaááÿåäHœaïDí¼Rꀜa(M ätœaÀ{aæ ä°bäP> ìbÿìäbïá$bèHJøìàb$äPbä$Œbÿìä¨bïáÄbèHlKøÔ)ìüb°T äðb4"^æHb> ä bh&> ¨‘-æêà‘-ö”bøå Xbh&øáøœAò¼œAöl bä¤bäàbäÿåäübïá bø4 bøP bèðþøèì„ b`\ä| b€ÃI∠bìä” b  bæ â° bæâà bü  èX bèâ@êü  ä° bå bãáÐ b2ä bà b2L bÿèäˆ bäx bäã° bì â° b ä´ bè¤ bì â° bðx bêø bdÞäà bædÞè â by ä bâà by èâH bT‰å0 bâ bT‰áäâp bè7äX bâ 0 bè7ìü  ä€ b° bâ´ bÀÿä˜ b¤ bæ â¼aæ b,øåÄ bä,øâ bááÿå÷Dá8 bÈG ä, b€{QæØ bTÿäH bäTÿ„ bááÿåä  bïDá¼ bÿô” b°äè bä°$ bááÿåä@ bä8ýçDá\ bøx bÿäîøå¤ bäøáà bÿìäü bïábè8ýì4bè8ýÿæ(bÄ]ä`bäÄ]œbÿìä¸bïáÔbè|uJìðb褮Iì bèLÝIøèíb”H ä8bä”H tbÿìäbïá¬bè|uJìÈb褮IìäbèLÝIøèìb? ä $J b„øå ̺UøbÐ> ä0bäÐ> lbÿìäˆbïá¤bè|uJìÀb褮IìÜbèLÝIøèìbTH äb(ìJæìb°> ä$bä°> `bÿìä|bïá˜bè|uJì´b褮IìÐbèLÝIøèìàbÀäübäÀ8bÿìäTbïápbè8ýìŒbø¨bøÄbèðþÿè¸bˆäðbäˆ,bááÿåäHbïDádbè8ýì€bèLÝIìœbè¼Rÿèb¬]äÈbä¬]bÿìä bïá<bè`vOìXbèðþìtbÿô¬b˜> ä b´/`æ0bx]ä¼bäx]øbááÿåäbïDíÖLì$bä@bLbæ â\bæ(âŒb°…èôbèâpê°…ä\bä¬b ãá|b2ä¼bŒb2øbÿèä4bä$bäã\bì â\b ä`bèPbì â\bð$bê¤b äŒbæ â$âÌb ä´bâ Œb â âôbÀïäÜbâ ´bÀïH^Qäâbˆ äbâ Übˆ ØËMäâDbèä,bâ bèØËMäâlbÈ5äTbâ ,bÈ5 ~Qäâ”b¼7ä|bâTb¼7è â¼b4?ä¤bâ|b4?èâäb4Ê äÌbâ ¤b4Ê XÅYäâ b äôbâÌb ð°…äb\bâ<büG ä4bäãNâhbhøåLbXbæ âhbæâ˜bø è8bèâPêø ähbä¸bãáˆb2äÈb˜b2bÿèä@bä0bäãhbì âhb älbè\bì âhbð0bê°blñ ä˜bælñ è âØbÈäÀbâ˜bÈèãb0‚äèbâÀb0‚èâ(bõäbâèbõèâPbŒÌä8bâbŒÌðø ä`bhbâ„bØ\äxbhDaæ$bØT ä”bäØT Ðbááÿåäìbä8ýçDábÿøÄ\ä4bh&Ä\¤`æêaöÔbPI ä€bäPI ¼bÿìäØbïáôbè8ýìbèì,bøHbèìdbø€bèìœbø¸bèÿètb`? ääbä`? bÿìä<bïáXbèöêb°ä„bä°ÀbÿìäÜbïáøbéúQø¤Rì`b0^ä$bæ0^P âÿå¬bpäpbæpP âÿåÈbxU ä¼b„PæäbäØb¼vPæ b ^äôbä ^0bááÿåäLbädýçDáhbèdýì„béËJÿìÀøå°b¼¿Væ” bÐ^äÌbäÐ^ bÿìä$ bïá@ bèì‰Rì\ bèðþêx bÿäèìl!b¨U ä¤ bä¨U à bÿìäü bïá!bè|uJì4!b褮IìP!bèLÝIøèì "b”I ä|!bä”I ¸!bÿìäÔ!bïáð!bèT¢IÿèX"büøå "bh&üøá<žAóžAö¤"b|? äh"bh&|? ŒAòPAö`#b¤? ä´"bä¤? ð"bááÿåä #bïDá(#bèÖLìD#bÿõ$bˆäp#b䈬#bááÿåäÈ#bäÖLçDáä#bè ~Qø¼Rîä$bäL$bááÿåäh$bä8ýçDá„$bè¼Rê $bø¼$bÿäxGKì”%bü? äè$bäü? $%bÿìä@%bïá\%bè8ÇKìx%bèøèsKìl&b ä¤%bä à%bÿìäü%bïá&bè|uJì4&b褮IìP&bèLÝIøèì„&bdä|&bÀ\â”&bØU ä ”VJ¬&bœä¤&bXqOâÈ&bdJ ä¼&bü]Oæl(bPäØ&bä&bæâ'b”è<(bèâpê”ää&bä4'bãá(b2äD'b'b2€'bÿèä¼'bä¬'bäãä&bì âä&b äè'bèØ'bì âä&bð¬'bê,(bìÃä(bæìÃèâT(bD* ä<(bâ(bD* ð”äd(bä&bâÔ(b,J ä|(bä,J ¸(bááÿå÷Dáð(b_ää(bDaTæ)b å)b$P\æ€ä)b$)bæ âPæ€)bäJ äD)bæäJ P âÿå*bÈ@ ä)bäÈ@ Ì)bÿìäè)bïí$µPìÜ*bDä*bäDP*bÿìäl*bïáˆ*bè|uJì¤*b褮IìÀ*bèLÝIøèì(+b„V äì*bæ„V 8ýäÿå8+bh_ä †Q,b¸äH+b丄+bááÿåä +bäðþçDá¼+bèЧIìØ+bè ãIìô+bèðþÿæ,,bpV ä ,b,[`æ”,bÀJ ä<,bäÀJ x,bááÿå÷Dá(-b`@ ä¤,bä`@ à,bááÿåäü,bïDí-bê â0‘[æD-b¤J ä8-b C^ê0@ äT-bh&0@ ÀžAò„žAöL.b„K ä -bä„K Ü-bááÿåäø-bïDá.bèüPì0.bÿä8ýì˜.b¨ ä\.bæ¨ 8ýäÿå°.b¤ùå¨.bxMNâP/bxäÀ.bäxü.bááÿåä/bïDá4/bè öì‰IìÔ/bXK ä`/bäXK œ/bÿìä¸/bïíPÖNì 0b”ùå ä/bh&”ùáDŸAòŸAöÜ0bd ä00bäd l0bááÿåäˆ0bïDá¤0bèЧIìÀ0bèðþøðþê´1b@ äì0bä@ (1bááÿåäD1bïDá`1bèhÑRê|1bø˜1bÿä8ýêÌ1b äÄ1b¬nTâˆ2bA äÜ1bäA 2bááÿåä42bïDáP2bèdýìl2bÿô(3bä˜2bäÔ2bááÿåäð2bïDá 3bèdýøðÊJì¬3bÈä83bäÈt3bááÿåä3bïDý„4bàä¼3bäàø3bááÿåä4bïDá04bè8ýìL4bøh4bè8ýÿè 4bä_ä”4b$üSæ$5bÐ_ä°4bäÐ_ì4bááÿåä5bïDí¼Rîhä45bˆ‰OæX5bôäP5b8hKât5b<äh5bÐÖJæL6bä„5bäÀ5bÿìäÜ5bïáø5bè|uJì6b褮Iì06bèLÝIøèì˜6bDA ä\6bh&DA àŸAò¤ŸAö´6búå¨6bôÐUæ@8báäÄ6bÐ6bæ âà6bæâ7bèxè8bèâpêèxäà6bä07bãâ8b2ä@7b7b2|7bÿèä¸7bä¨7bäãà6bì âà6b ää7bèÔ7bì âà6bð¨7bê(8bXUä8bæXU@TOìèxä88bà6bâ:bÜäP8b\8bæ âl8bæ âœ8b¸Xèì9bèâpê¸Xäl8bä¼8bãáŒ9b2äÌ8bœ8b29bÿèäD9bä49bäãl8bì âl8b äp9bè`9bì âl8bð49bê´9b”ãäœ9bæ”ãèâÜ9b¤{ äÄ9bâœ9b¤{ èâ:b´b äì9bâÄ9b´b ð¸Xä:bl8bâ4:bdL ä,:btN_âP:b¤A äD:bÈTZæð:bLL ä`:bäLL œ:bááÿåä¸:bïDáÔ:bèdýÿè ;b4L å;bl Zæ¬;b !ä;bä !X;bááÿåät;bïDá;bèüKKÿèÈ;bˆA ä¼;b¬¶aæhbÀäì=bäÀ(>bÿìäD>bïá`>bè8ýø¤-ì?b$B äŒ>bä$B È>bááÿåää>bïDâ?bè öèxMì ?bÈ!ä,?bäÈ!h?bÿìä„?bïí´øIìx@bå`6câ86c(>áP äâ 6c Éäˆ6câ`6c Éð´Yä°6c@4câ<7c3äÈ6cä37cÿìä 7cïí¨‚OìL7c¤oä À²Pì7c V ä\7cä V ˜7cÿìä´7cä8ýçáÐ7cè$šQø8ýì¨8cÄU äü7cäÄU 88cÿìäT8cïáp8cèìŒ8cÿäðþìœ9cLh ä¸8cÄ8cæ âÔ8cæäð8cïá9cè 9cì âœR`æ89cèLY`ìd9cèT9cì âäL_æ€9cÿä8ýì¸9cD] ä¬9ctN_æä9c$h äÈ9cÔ9cæ âä^æ;c€U äô9cä€U 0:cááÿåäL:cïDáh:cè8ýì„:cèt!ì :cèàWLì¼:cèèìØ:cèèìô:cèèÿè(;cØ"ä ;cä´bâTcà] äð=cäà] ,>cááÿåäH>cïDád>cè0Uø€>cì âhRæh?cx#ä >cäx#Ü>cÿìäø>cïá?cèÓKì0?cèìL?cèøpÿì„?cd#äx?c€Jæ°?c # ?c”?ch¾Nê¨?ch¾NâÀ?cl3ä |^Ð?c/'Òƒoáøzw‚ãÜ´cܱcâµc |á µcô´clØPêµclØPâ,µc/ä µcÌõSæt¶c@ä<µcä@xµcááÿå䔵cïDá°µcè Qì̵cèðþìèµcø¶cø ¶cè ãIæâ<¶cèèèâX¶cèðþøèì ¶c !ä„¶c¶cæ âDQVæ”·c°a ä°¶cä°a ì¶cááÿåä·cïDá$·cèX+-ì@·cèX+-ì\·cøx·cè8ýø8ýìl¸ch=䤷cäh=à·cááÿåäü·cïDá¸cèüKKì4¸cøP¸cÿ䬨ì|¹cˆt ä|¸cäˆt ¸¸cááÿåäÔ¸cïDáð¸cè8ýì ¹cø(¹cøD¹cèèì`¹cèèøt!ð@i 䌹cä@i ȹcÿìää¹cäçíìºcü=ä žZ\ºcˆ"ä ºcæˆ"8ýäÿ娺cX"älºcæX"8ýäÿå¾cÔt 为cĺcæHâôºcÿ èÔ½cèâpêÿ äĺcä»cãáä»c2ä$»côºc2`»cÿè䜻c䌻cäãĺcì âĺc äÈ»c踻cì âĺcðŒ»cê ¼cœz äô»cæœz èDâ4¼c`ä¼câ ô»c` ¦Iä@â\¼c¤ÇäD¼câ ¼c¤ÇP ä0ℼc(é äl¼câ D¼c(é ô_ä$⬼côA䔼câl¼côAè âÔ¼cøZä¼¼c┼cøZèâü¼cðÙää¼câ¼¼cðÙèâ$½cضä ½câä¼cضèâL½cä"ä4½câ ½cä"äât½châ ä\½câ4½châ è ✽cÀë䄽câ\½cÀëèâĽcxÙ嬽cℽcxÙáäâì½c ÉäÔ½c⬽c Éðÿ äü½cĺcâÀ¾c´ä¾cä´P¾cÿìäl¾cïሾcèxM줾cÿô´¿cj äоcäj ¿cÿìä(¿cïáD¿cè\èJì`¿cè(ìJì|¿cè\èJ옿cè öt!ìÌ¿cœäÄ¿c¨Nâè¿c@"äÜ¿cˆÈ[æ°Ác¸/äø¿cáÀcâ â0Àc¸/è€Ácèâpê¸/åÀcäPÀcãá Ác2ä`Àc0Àc2œÀcÿèäØÀcäÈÀcääÀcì ãÀc äÁcèôÀcì ãÀcðÈÀcêHÁcpä0Ácæp@é^äâpÁc äXÁcâ0Ác èâ˜Ác Éä€ÁcâXÁc Éð¸/ä¨ÁcáÀcâÈÁcœ/äÀÁcÌvPâäÁcläØÁc´ RçÂc„/äôÁcáòNæ¼Âc¸t äÂcä¸t LÂcááÿåähÂcïDá„Âcø Âcÿäê@Ãcp|äÌÂcäp|Ãcááÿåä$ÃcïDíüKKìÄÃcü!äPÃcäü!ŒÃcááÿåä¨ÃcädÉJçDíœÉLêàÃcÌ!äÔÃcˆ NædÄcˆ!äðÃcäˆ!,ÄcááÿåäHÄcïDíêèÄcj ätÄcäj °ÄcááÿåäÌÄcä8ýçDí8ýî¸=äøÄcêÜÅcpb äÅcäpb PÅcÿìälÅcïáˆÅcèdýì¤ÅcøÀÅcè¼Rö¼Rê|Æcèj äìÅcäèj (ÆcááÿåäDÆcïDá`Æcÿä LJìpÇcœj äŒÆcäœj ÈÆcÿìääÆcïâÇcè¤LìÇcø8ÇcøTÇcÿäêHÈcxu ä€Çcäxu ¼ÇcÿìäØÇcïáôÇcè|uJìÈc褮Iì,ÈcèLÝIøèì`Ècdu äXÈc•YâdÉc,u äpÈcä,u ¬ÈcááÿåäÈÈcïDáäÈcèëÉcø,ÉcèÉcì âpŽ`æHÉcÿô€ÉcØ"ätÉcL _êà|äÉcê¸Écc ä¬ÉcêXÊc(äÈÉcä(Êcäÿåä Êcïá<ÊcèLJøLJì¤Êc\?ähÊcæ\?8ýäÿåðÊc,?ä´Êcæ,?8ýäÿåÈËcèb åËcäèb <ËcÿìäXËcïátËcè|uJìËc褮Iì¬ËcèLÝIøèìÌcŒ#äØËcæŒ#P âÿåÐÌc˜0ä$Ìcä˜0`Ìcááÿåä|ÌcïDá˜Ìcø´ÌcèðþÿæpÍc|}äàÌcä|}Ícÿìä8ÍcïáTÍcèLÝIø MìôÍcð>ä€Ícäð>¼ÍcááÿåäØÍcïDíœÉLêÎcÔ>äÎcX^æÌÎcä Îcä\ÎcááÿåäxÎcä˜QçDá”Îcè ~Qì°Îcè¼Rö¼Rî`>äÜÎcPâ„Ïc@äôÎcä@0ÏcÿìäLÏcïáhÏcè@ÃQøÔ)ì$Ðcðc ä”Ïcäðc ÐÏcÿìäìÏcïáÐcèèø¨Sì@Ðc|k ä4Ðc\MæÑcXk äPÐcäXk ŒÐcÿìä¨ÐcïáÄÐcè|uJìàÐc褮IìüÐcèLÝIøèìœÑcH$ä(ÑcäH$dÑcááÿåä€Ñcä8ýçDý¸Ñc v ä¬Ñc$ÇIæ<Òcàu äÈÑcäàu Òcááÿåä ÒcïDí8ýì„Ócœc äLÒcäœc ˆÒcááÿåä¤ÒcïDáÀÒcè`fPìÜÒcøøÒcè¼RìÓcèèì0ÓcèèìLÓcèèìhÓcèðþøèì$Ôc€c ä”Ócä€c ÐÓcááÿåäìÓcïDáÔcè`fPø¼RêlÕcŒ?ä4ÔcäŒ?pÔcááÿåäŒÔcä8ýçDá¨ÔcèêÄÔcøàÔcøüÔcøÕcø4ÕcøPÕcÿäxGKðÔ0ä|ÕcäÔ0¸ÕcááÿåäÔÕcäçDáðÕcèì ÖcèÿæÈÖc¨ä8Öcä¨tÖcááÿåäÖcïDá¬ÖcèŒøì‰Iì ×cxäØÖcäx×cÿìä0×cïáL×cè|uJìh×c褮Iì„×cèLÝIøèì°×c`$ä T§SˆØc¸}äÀ×cä¸}ü×cááÿåäØcïDá4Øcèt!ìPØcè8ýìlØcè8ýÿè¤Øc€1ä˜ØcÔcaæÀØcTd ä´Øc HMæÜØc1äÐØcèæìØcd ä°VNäxv äüØcäxv 8ÙcÿìäTÙcäçíìŒÙc¨2ä€ÙcêÚc\2äœÙcä\2ØÙcááÿåäôÙcïDíê,ÚcAä ÚcH½IæDÚctl ä<ÚcÐÉIâ\Úcèd äTÚcØTZâPÜcÄd älÚcxÚcæ0â¨Úc¼øè Ücèâpê¼øäxÚcäÈÚcãá˜Ûc2äØÚc¨Úc2ÛcÿèäPÛcä@ÛcäãxÚcì âxÚc ä|ÛcèlÛcì âxÚcð@ÛcêÔÛcÔ…ä¨ÛcæÔ…ÀÛcä â $ê$äüÛct> ääÛcâ¨Ûct> èâ8ÜcX· ä Ücâ äÛcX· $Ücè êè¼øäHÜcxÚcâlÜcTl ä`ÜcØ^Wæ(Ýc@l ä|Ücä@l ¸ÜcááÿåäÔÜcïDáðÜcèüKKì ÝcÿôDÝc,l ä8ÝcXÇVêà@äTÝcœ§Tâ4Þc e älÝcä e ¨ÝcÿìäÄÝcïáàÝcè|uJìüÝc褮IìÞcèLÝIøèì¸ÞcˆäDÞc䈀ÞcÿìäœÞcïítNì<ßcÜ2äÈÞcäÜ2ßcááÿåä ßcïDíЧIð w äLßcä w ˆßcááÿåä¤ßcïDí8ýììàcÄm äÐßcäÄm àcÿìä(àcïáDàcè8ýì`àcèðþì|àcø˜àcèðþì´àcøÐàcèðþÿèÄác e äüàcä e 8ácÿìäTácïápácøŒácø¨ácèÿèàác„%äÔácˆiXæðácP%ä ´TJ âcåâc´âUæˆäc„m äâc(âcæ â8âcæ8âhâcè èXäcèâpêè ä8âcäˆâc ãáXãc2ä˜âchâc2Ôâcÿèäãcåãcäã8âcì â8âc ä<ãcè,ãcì â8âcñãcê€ãc\c ähãcæ\c XÇVäâ¨ãc¤äãcâhãc¤èâÐãc8˜ ä¸ãcâãc8˜ èâøãc`Žäàãcâ¸ãc`Žèâ äcŒ¹ ääcâàãcŒ¹ è âHäc@ºä0äcâäc@ºèâpäcÜS äXäcâ 0äcÜS dÄ„ä¸=däÄ„ô=dÿìä>dïá,>dèhöRìH>dè\èJìd>dè(ìJì€>dè¤Lìœ>dè öt!ìÔ>ddêð>d”.ää>d,(Kç?dl.ä Ô¨S?dT.ä œâS,?d Hä ?d`SæD?d<.ääpnd¸2TæÈnd°z äŒndæ°z P âÿåØnd3ä LÔN°od”Läèndä”L$odÿìä@odïá\odè|uJìxod褮Iì”odèLÝIøèìPpdÐ2äÀodäÐ2üodÿìäpdïá4pdèL Sø\èJì|qdz ä`pdäz œpdÿìä¸pdïáÔpdèìðpdèì qdø(qdèðþìDqdø`qdèèøèì¨rd$p äŒqdä$p ÈqdááÿåääqdïDârdèp÷Tìrdø8rdèäéQæâTrdèðþêprdøŒrdèðþøèìÀrdpLä¸rdQâxsdœˆäÐrdÜrdæ âìrdæäsdïá$sdè8ýì@sdèhÑRê\sdÿäXÑRê4tdhˆäˆsdähˆÄsdááÿåäàsdïDáüsdøtdèÿèÔtdˆ€ äDtd䈀 €tdááÿåäœtdïDá¸tdè8ýø—Tìðtdxz äätdä¥aæud„2åud€[â¨ud\z äudä\z TudááÿåäpudïDáŒudèö ~Qìdvd z ä¸udä z ôudááÿåävdïDá,vdè8ýìHvdèèøèì€vd02ätvdá¹`ê"ävdêtwd¼3ä¬vdä¼3èvdÿìäwdïá wdè|uJìä\xdät>˜xdÿìä´xdïáÐxdè|uJììxd褮IìydèLÝIøèìpyd { ä4ydæ { P âÿåˆyd˜ ä€ydh¤Lâ˜ydôz ä ð«P¨yd@Mä ôïP¸yd\p ä $¥SÈydP ä ÜQ zd MäØydä Mzdÿìä0zdïáLzdè|uJìhzd褮Iì„zdèLÝIøèì¸zd‰ä°zdýaâä{d\>äÈzdä\>{dÿìä {dïá<{døX{dè8ýìt{dø{dø¬{dèŒ MìÈ{dè˜3Pÿèü{dÌz äô{d8X^â|dàLä |d MYâ0|d$ ä$|dp`æÐ|d`"ä@|dä`"||dááÿåä˜|dïDá´|dè8ýøðM[ìì|dl3äà|dpƒLæ}dX3äü|d¬¨ê03ä}dh&03L¥Dð¥DöØ}d84äd}dä84 }dÿìä¼}dïíxMìô}d,Näè}d<ÊSæ~dNä~dT¢Iæ(~dtp ä ~dÐ VâT~d`{ ä8~dD~dæ âŠTê,#äd~d¼ñRæHd ƒ ä€~dä ƒ ¼~dÿìäØ~dïáô~dèìbKìdø,dè(hKøèìdd 5äXd Oætdø{ ä d"^ødä#ä„dää#ÀdÿìäÜdïíäJì$€d¼{ ä€d€dæ â¨_\æ@€d„Nä4€d„Xæü€dø4äP€däø4Œ€dááÿå䨀dïDáÄ€dèЧIìà€dèðþøðþêÔdø‚ ä däø‚ HdááÿåäddïDá€dè8ýìœdèø÷Kê¸dÿääéQꬂdè4äädäè4 ‚dÿìä<‚dïáX‚døt‚dè¼Rì‚dÿô0ƒdÜ‚ 伂däÜ‚ ø‚dÿìäƒdïýLƒdØ>ä@ƒdà Zêt#ä  ò]xƒdð| älƒd<=Qæüƒdá‹äˆƒdå‹ădÿìäàƒdïíìa위dxq ä „däxq H„dááÿåäd„dïDငdè BJøX+-ì<…d¸5䬄dä¸5è„dááÿåä…dïDá …dÿä LJì0†d”5äL…dä”5ˆ…dÿì䤅dïáÀ…dè´øIìÜ…døø…dèÔ)ì†dÿä¤*ìì†dh5ä@†däh5|†dÿì䘆dïá´†dèl¹MìІdÿôˆd$$äü†dä$$8‡dÿìäT‡dïáp‡dè쌇dè쨇døćdèðþìà‡døü‡dèèøèìðˆdðNä(ˆdäðNdˆdááÿå䀈dïDᜈdè8ý츈d茈QìÔˆdè48Pøðþì ‰d$å‰dx]欉d ?ä‰dä ?X‰dááÿåät‰dä<*KçDá‰dè<*Kø¼RêŠd05伉dä05ø‰dááÿå÷Dá´Šd”| ä$Šdä”| `Šdááÿåä|ŠdïDᘊdè¼RÿèЊd|| äÄŠd8ýæìŠdX| äàŠdšSæüŠdLŠä¤jLäð>ä ‹däð>H‹dÿìäd‹dïဋdÿô´‹d$r 䬋dS^⌌dă äÄ‹däă áŒdÿìäŒdïá8ŒdèxMìTŒdøpŒdè öêIì,dHO䜌däHOØŒdÿìäôŒdïádè(ìJøtKìxd 6ä[â¬Çd¤SåÇdä¤S<ÇdááÿåäXÇdäüPçDátÇdèüPìÇdè¼Rÿæ„Èdˆ:ä¼Çdäˆ:øÇdÿìäÈdïá0Èdè|uJìLÈd褮IìhÈdèLÝIøèì$Éd`Sä”Èdä`SÐÈdÿìäìÈdïáÉd訂Oø0Oì¨Édôv ä4Édäôv pÉdÿìäŒÉdïí ìÄÉdÔv ä¸ÉdDF[ædÊd :äÔÉdä :Êdááÿåä,ÊdïDáHÊdè| Nÿè|ÊdP‚ ätÊd°ÖQãËd‚ äŒÊdä‚ ÈÊdááÿåääÊdïDí8ýì Ëdv äËdäv LËdááÿåähËdïDá„ËdèØËMøt8^ìDÍd,ˆ ä°Ëd¼ËdæâìËdPIèÍdèâpêPIä¼Ëdä ÌdãáÜÌd2äÌdìËd2XÌdÿèä”Ìdä„Ìdäã¼Ëdì â¼Ëd äÀÌdè°Ìdì â¼Ëdð„ÌdêÍd\9äìÌdæ\9@µJäâ,ÍdÜS äÍdâ ìÌdÜS äùdä@>Xùdÿìätùdïíùdì âÔ/\êx„ ä°ùdðRæúdl?äÌùdæl?8ýäÿå¨údüEäúdäüETúdÿìäpúdïáŒúd訃Kø êIì¸úd€‹ ä ÄÖMäúd“äÈúdÔúdæ â8ÿIæ0ûd… äôúdæ… P âÿåüdT‹ ä@ûdäT‹ |ûdÿìä˜ûdïá´ûdè|uJìÐûd褮IììûdèLÝIøèì üdì„ äüd°5Lâlüdü’ä0üdæü’P âÿåDýd ?ä|üdä ?¸üdááÿåäÔüdäðþçDáðüdèЧIì ýdè ãIì(ýdèðþÿæ`ýd +äTýd”™bæþd¼y äpýd|ýdæ âŒýdæä¨ýdïáÄýdè8ýìàýdèhÑRêüýdè8ýÿè0þd<‹ ä(þd@ŠUâÐþdÔ’ä@þdäÔ’|þdááÿåä˜þdïDá´þdèœÉLøœÉLêpÿdØEäàþdäØEÿdááÿåä8ÿdäÐîLçDáTÿdè”4[ÿìèŠ ä€ÿdh&èŠ È°DòŒ°DöØÿd… äÌÿdœLæ”eጠäèÿdåŒ $eÿìä@eïá\eèØ#Oìxeÿä1OìleFä¤eäFàeÿìäüeïáeè|uJì4e褮IìPeèLÝIøèìDe¼?ä|eä¼?¸eÿìäÔeïáðeèœKPì eø(eèêIøèì`e¼+äTeêIæDeØ“äpexeâ(â¨eØ“èeèâpêØ“äxeäÈeãá˜e2äØe¨e2eÿèäPeä@eäãxeì âxe ä|eèleì âxeð@eêÜe°Î ä¨eæ°Î Àeäâ âÔeää âeœ+èeèâpêœ+äÔeä$eãáôe2ä4ee2peÿèä¬eäœeäãÔeì âÔe äØeèÈeì âÔeðœeêÄeLÊäeæLÊeè âLe¼7 èt eèpæe¼7 äeäleãá<e2ä|eLe2¸eÿèäôeääeäãeì âe ä eèeì âeðäeê eáÁäLeçÁdeèâ”e\ èì eèâpæLe\ ädeä´eãá„e2äÄe”e2áeÿèä<eä,eäãdeì âde äheèXeì âdeð,eêd e,D ä”eæ,D ¬eä ââÜeT èÜeèpæ”eT ä¬eäüeãáÌe2ä eÜe2Heÿèä„eäteäã¬eì â¬e ä°eè eì â¬eðteîØ äÜeæØ ôeèâ$ eåèL eèâpæÜeåäôeäD eãá e2äT e$ e2 eÿèäÌ eä¼ eäãôeì âôe äø eèè eì âôeð¼ eê< elåä$ eælåèæe4Dä„=eä4DÀ=eááÿåäÜ=eïDáø=eèêIì>eèêIì0>eÿôì>eD0ä\>eäD0˜>eááÿåä´>eïDáÐ>eè ¦IÿèÄ?eäCäü>eääC8?eÿìäT?eïáp?eèÀIìŒ?eè´ì¨?eè´ÿèH@e]äÔ?eä]@eÿìä,@eïí ¦Iì`@eÄCäX@e¸ËIâŒAeLKäp@eäLK¬@eÿìäÈ@eä`vOçáä@eùAeèðþìAeø8AeøTAeè¼ÅJìpAeÿô¨Aexˆ äœAe-bæÄAeà\ä¸AeÜÖUæÜAe|—äÔAehXSâôAeÌ~ äìAe`3_æä/äBeää/@Beÿìä\Beä¼Rçí¼RìÜCeT1äˆBeäT1ÄBeÿìäàBeïáüBeè8ýìCeèì4CeøPCeèìlCeøˆCeèì¤CeøÀCeèÿèTIeИäìCeäИ(DeÿìäDDeïâIeè`Deì âpDeæâ  Deüã |HeèHeä @ápðHeæüã äpDeäÀDeãá"Fe`/dEeÐDe De`/ Eeÿèä8EeìãpDeøTEeì âpDeèlEe De`/¨EeÿèäÔEeìãpDeìðEeèTEeø Feê âpDe äÌFe2ä,Fe De2hFeÿèä”Feä FeäãpDeì°FeèTEeø Feê´GeìçäÜFe DeìçGeâÿèäDGeìáápDeâ÷å`GeèTEeì|Geø˜GeÿäÌ7`ìdHeœÒäÄGe DeœÒáHeâÿèä,HeìáápDe âöåHHeèTEeøfMðüã ätHepDeæ$ì HepDeäââ DeÜ‘ ÜHeÿäìâ3æÀåFIeø8IeÿäÌ7`ìpIeÌ]ädIe´³bæŒIe¨Dä€IetÜ^æ¤IeøKäœIeá€ZâÀIeŒ˜ä´IePÂbæÜIeØ äÐIeT±]æøIe¨0äìIe,WQæìJeàˆ äJeäàˆ DJeááÿåä`JeïDá|Jeè8ýì˜Jeè8ýì´JeøÐJeèèø8ýìüKe¼ äüJeä¼ 8KeááÿåäTKeïDápKeøŒKeø¨Keè QêÄKeèêàKeèÿè€Let˜ä Leät˜HLeááÿåädLeädýçDíüKKìMed0äLeäd0ÌLeááÿåäèLeïDí8ýð`DäMepƒLâØMeP^ä,MeäP^hMeááÿåä„MeäüPçDá MeèüPì¼MeèÿæxNe8^äèMeä8^$Neááÿåä@NeïDá\Neÿä¤-ìPOe(‰ äˆNeä(‰ ÄNeááÿåäàNeïDáüNeèdýìOeèê4Oeè¤LøìšUìðOeø1ä`Oeäø1œOeÿìä¸OeïáÔOeèHlKøêIíPe^ä ȨUØPeÔ1äPeäÔ1LPeÿìähPeïá„Peè|uJì Pe褮Iì¼PeèLÝIøèìôPe´™äèPeè2Læ ReP€ äQeäP€ @Qeÿìä\QeïáxQeè¤ÆZì”QeèÀIì°Qeè êÌQeè8ýìèQeøReè8ýÿè8Re0€ ä0Re€SZâ¼Re¤‘ äHRe䤑 „Reááÿåä ReïD팧TìèRe € äÌReØReæ â`ÙQæSe 1äøReÜ—Tæ¤Se(™äSeä(™PSeááÿåälSeïDáˆSeè8ýÿì™ä´Seä™ðSeÿìä Teïá(Teè¼RÿæUe_äTTeä_Teÿìä¬TeïáÈTeè|uJìäTe褮IíUeèLÝIøèì¼Ue(Mä,Ueä(MhUeÿìä„Ueïá Ueèèø(Kì\Ve”šäÌUe䔚Veÿìä$Veïá@Veè<ÊSÿèxVeä€ älVeÔeæÜWeè^äˆVeäè^ÄVeááÿåäàVeïDáüVeøWeø4WeøPWeè¼RêlWeè8ýêˆWeè|µQì¤Weè8ýêÀWeèðþøèìøWe EäìWeôÏNæXe<šäXe`íZæ0Xe°^ä$Xe1Uæ@YeH2ä@XeäH2|Xeááÿåä˜XeïDá´Xeè8ýìÐXeøìXeèXj]ìYeø$YeèXj]øèìZe^äPYeä^ŒYeááÿåä¨YeïDáÄYeè¼RêàYe褕IìüYe褕Iø¤•Iðô™ä(Ze4Zeæ âœPSæäZeø äTZeäø Zeááÿåä¬ZeïDáÈZeÿä¤-ìüZeÜ äôZe0¦Oâœ[e Nä [eä NH[eÿìäd[eïá€[eè¨?Oøèìt\eàMä¬[eäàMè[eÿìä\eïá \eè(»Jì<\eøX\eè öt!ì0]eð_ä„\eäð_À\eÿìäÜ\eïáø\eè@øJì]eè\èJøÈìL]eà‰ ä@]eHqOæ\^e¼2ä\]eä¼2˜]eááÿåä´]eïDáÐ]eèø÷Kêì]eø^eè8ýì$^eèèì@^eèèø¬¨ì4_e¸ äl^eä¸ ¨^eááÿåäÄ^eïDáà^eøü^eø_eè@;MøèìL_eÔ_äD_e,éUâì_e8 ä\_eä8 ˜_eÿìä´_eïáÐ_eè¼Rö°¶bì`eĉ äü_e öXæŒ`e„Mä`eä„MT`eááÿåäp`eïDí ~Qð¼’ äœ`eä¼’ Ø`eÿìäô`eäçíê,ae°›ä aeœ6YæÌae‹ ää(ðeä4>dðeááÿåä€ðeïDáœðeè8ýì¸ðeè<6PìÔðeè8ýøì‰Iì ñe„Zåñet>Yæ(ñeØ• äñeðmSæDñe\¨ä8ñeôSKæpñeô=äTñe`ñeæ â ÍPêH¨ä€ñeäH¨¼ñeÿìäØñeïáôñeøòeè¼Rê,òeè ¹Jö ¹JêdòeÜUäXòe€>cæ|òe(lätòex×SâÈòe¬>äŒòeæ¬>P âÿå óe´ äØòeä´ óeÿìä0óeïáLóeè|uJìhóe褮Iì„óeèLÝIøèìxôe| ä°óeä| ìóeÿìäôeïá$ôeè|uJì@ôe褮Iì\ôeèLÝIøèìˆôeˆ[ä 0oY(õeH[ä˜ôeäH[Ôôeááÿåäðôeä8ýçDá õeèЧIÿèDõe0©ä8õe@©QæÈõeðZäTõeäðZõeááÿåä¬õeïDýäõe UäØõeðæRæØöeôž äôõeäôž 0öeááÿåäLöeïDáhöeè8ýì„öeè8ýì öeø¼öeÿäèðÔ¨ä èöe¼Rä@÷e¨©ä÷e権P âÿåà÷e¤läP÷eä¤lŒ÷eÿìä¨÷eïáÄ÷eèü%Qÿè¬øe˜– äð÷e䘖 ,øeÿìäHøeïátøeèdøeì â\Ÿbæøeè¤-ÿèÈøe\ä¼øetÜ^æàøetV䨸eœRVâ€ùeŒläðøeäŒl,ùeááÿåäHùeïDádùeèLÝIÿèœùeXVäùe cæ¸ùeplä¬ùe¼RRæúe„©äÈùeä„©úeááÿåä úeïDá<úeèüKKìXúeøtúeÿäôÁeì¬úeÌ>ä úeœ­TæhûeøUä¼úeäøUøúeááÿåäûeïDá0ûeè¼RêLûeè¼Rö¼Rê€ûeHŸ äxûe ÍPâ<üe@läûeä@lÌûeÿìäèûeïáüeè¼Rê üeè¼Rÿêà äLüeäà ˆüeÿìä¤üeïáÀüeè¼Rö¼RêÐýe<]äìüeä<](ýeÿìäDýeïá`ýeè8ýì|ýeø˜ýeè8ýì´ýeÿä¤-ìŒþeá]äàýeå]þeäÿåä8þeïáTþeèêIìpþeèêIøêIì,ÿe4Wäœþeä4WØþeááÿåäôþeïDáÿeÿäpÿìÌÿeWä<ÿeäWxÿeÿìä”ÿeïá°ÿeèøxLøÔ)ìÜÿef”]ä$>fä”]`>fÿìä|>fïá˜>fè8ýì´>fÿä8ýìì>f¸§ äà>fê¨?fXFäü>fäXF8?fäÿåäT?fïáp?føŒ?fÿä ¾ì,@f › ä¸?fä › ô?fÿìä@fïí$µPìÌ@f`— ä<@fä`— x@fÿìä”@fïá°@fèäJø\èJìˆAf˜§ äÜ@f䘧 Afÿìä4AfïáPAfèÀIìlAfè¨ÿè¤Af€rä˜Af¼¬ZæÀAfŒcä´AfƒTæØAfȰäÐAftŽXâ”Bf\§ äèAfä\§ $Bfááÿåä@BfïDá\BfèЧIìxBfèðþøðþêlCf<§ ä¤Bfä<§ àBfááÿåäüBfïDáCfè8ýì4Cf謲SêPCfÿ䜲Sê„Cf— ä|CfìPâ@DfL]ä”CfäL]ÐCfááÿåäìCfïDáDfèê$Dfè`fPøÈV]ìlDfì– äPDf\Dfæ âpLæ(Efrä|Dfär¸DfááÿåäÔDfïDáðDfèê Efè¼RÿèäEfüš ä8Efäüš tEfááÿåäEfïDá¬Efè¼RêÈEfèÌYøpI^íFfôqäôEf¬e^æ¼FfàqäFfäàqLFfááÿåähFfïDá„Ffè8ýì Ffÿä8ýðLcäÌFfl,-â¬Gf˜±ääFf䘱 Gfÿìä]æð› äà}fä\âø~fDKäø}fäDK4~fÿìäP~fïál~fè8ýìˆ~fèðþì¤~føÀ~fèðþìÜ~fÿäpÿìf$Käf,^æ`f˜­ ä$f昭 P âÿå€fåô%gâÌ%g(>áP 쨾 ä&gt$gâü&gD­ ä4&gäD­ p&gÿìäŒ&gïá¨&gè ¹eìÄ&gè|èLìà&gèÔ)øÔ)ì('g„['g 'gÛKê 'gÛKâ¬'g Æä8'gä Æt'gÿìä'gïíäJì„(g€¯ ä¼'g䀯 ø'gááÿåä(gïDá0(gèð»IìL(gè8ýìh(gÿäèì (g”¾ ä”(g¬&Pæ$)g|Šä°(gä|Šì(gááÿåä)gïDí<*KðH[ä4)gäH[p)gááÿåäŒ)gïDá¨)gè¼RêÄ)gè8ýÿèø)g® äð)g×Oâ˜*gü¾ ä*gäü¾ D*gÿìä`*gïá|*gè8ØMÿè´*gÌrä¨*g¨aæÄ+gÈÆäÄ*gäÈÆá+gááÿåä+gïDá8+gèø÷KêT+gøp+gøŒ+gè8ýì¨+gè¼Rÿèd,gˆ­ äÔ+g䈭 ,gááÿåä,,gä8ýçDáH,gÿä8ýì€,gÄ[ät,gð,Zæ -gTÆä,gäTÆÌ,gááÿåäè,gïDá-gè8ýøèìÀ-gȯ ä0-gäȯ l-gááÿåäˆ-gïDá¤-gÿô .g0ÆäÐ-gh&0Æð«8æêD¬8öX.g@Æä.gh&@Æ\*Eî *EúgäÀ ä¼=gääÀ ø=gÿìä>gïá0>gè|uJìL>g褮Iìh>gèLÝIøèì$?g”^ä”>gä”^Ð>gÿìäì>gïá?gèèøt!ìÄ?gdä4?gädp?gÿìäŒ?gïá¨?g訂Oø˜”Oì¸@gÜsäÔ?gäÜs@gÿìä,@gïáH@gè\èJìd@gè(ìJì€@gè\èJìœ@gè öt!ìÈ@gÄsä <ŽYä@g`|äØ@gæTçAgL² äô@g¬ñZæ Ag ^äAgä ^LAgááÿåähAgïDá„AgèLÝIÿè¼Ag^ä°AgxGTæèAg$² äÌAgØAgæ âøITçBg äøAg Ÿ^âØBg¬säBgä¬sLBgááÿåähBgïDá„BgèüKKì Bgèê¼Bgèü`TÿèôBg´¯ äèBg|$dæ”CgäCgä@Cgááÿåä\Cgä8ýçDáxCgè¼R÷¼Lì4Dg˜À ä¤Cgä˜À àCgááÿåäüCgïDáDgè8ýÿì|äDDgê|Eg¸Žä`Dg与œDgÿìä¸DgïáÔDgèêðDgèê Egèì(EgøDEgèX+-ì`EgÿäèìŒFg”ŽäŒEg䔎ÈEgááÿåääEgïDâFgè êFgè ¦Iì8FgøTFgèT¢IìpFgè öt!ì,GgH_äœFgäH_ØFgÿìäôFgïáGgèÈoUÿèDGgT° äYêüŸäàûgìûgæ âüûgæäügïí¼RìðügôÜäDügäôÜ€ügÿìäœügïá¸ügè8ýìÔügèÿèÈýg„Á åýgä„Á <ýgÿìäXýgïátýgèœKPìýgø¬ýgèêIøèìþgá…äØýgç…P âÿå@ÿgØpä$þgäØp`þgÿìä|þgïá˜þgèpcQì´þgøÐþgøìþgøÿgèt%Kì$ÿgÿä¬jQìÄÿg Ó äPÿgä Ó Œÿgÿìä¨ÿgïíÀIìœhdÁ äÔÿgädÁ hÿìä,hïáHhè|uJìdh褮Iì€hèLÝIøèì´h¼pä¬hÄç^âThŒpäÄhäŒpáhááÿåähïDá8hèLÝIø¤*ìdh4 ädhä4  hááÿåä¼hïDáØhè8ýìôhøhèê,høHhèt!øt!ì€hppäthàúKæœh|Üäh´`æ¸hLÜä¬hÔcaæhèÀ äÈhäèÀ hááÿåä hïDá<hè8ýìXhøthÿø¼ä hä¼ÜhááÿåäøhïDí8ýì´h4Ä ä$hä4Ä `hááÿåä|hïDá˜hèüPø€>cìŒhhŽäÄhähŽáhááÿåähïDá8hèìThøphÿä ¾ì¤hÄ äœhL²Oâ˜h¡ä´hä¡ðhÿìä hïá(hè´ aìDhèê`hèê|hÿäÔ)ì´h´Ýä¨h¤LæÄh„ÝäÄhä„Ýáhÿìähïá8hèÈŸLìThøphøŒhèÔ)ì¨hèèøÔ)ìÜhì äÔh{MâøhÈ äìhÔg\æÐhp…ähäp…Dhááÿåä`hïDá|hè8ýì˜hø´hèøèììhˆÓ äàhá'_æ hLŽäühܦVæà h¨ ä h䨠T hÿìäp hïጠhè¼Rê¨ høÄ hè8ýøèìü hX…äð hÌÞaæ€ h\Ó ä hä\Ó H hááÿåäd hïDíê hØÃ ä häØÃ Ì hááÿåäè hïDá hè¼Rÿæ< h@Ó ä0 h4ß\æT hÝäL hÜBKæôäd hêd h,¢ä€ hä,¢¼ hááÿåäØ hïDáô hèüPì hø, hèðþìH hÿäèì hÄÓ ät häÄÓ ° hÿìäÌ hïáè hè¤Lì hèèø¬"LìL h€Ž< h0 hˆMêD hˆMâ\ hŒqä ÌpOx hŒÄ äl h´ÐSæh°¡äˆ hä°¡Ä hááÿåäà häÔ)çDáü hèö¬¨ìhpÄ ä(häpÄ dhÿìä€häHuQçáœhø¸hè¼ÅJìÔhè¼ÅJìðhèHuQø hì ⤸Wæ h  ä,hä  hhááÿåä„hïDíðRì$hôÝä°häôÝìhááÿåähïDíî°Ó ph4hh&°Ó x\Eæê<\Eúxhh&°Ó ]EîÔ\Eöàh€£äÄh䀣áhÿìähïá8hè8ýìThøphøŒhè8ýì¨høÄhèpÿø8ýì hìqühðhüF_êhüF_âÈh\ ähä\ Xhááÿåäth䬲SåDáhø¬hèðþÿæähÜÄ äØh´hTîäì=hâ Ä=hTîðþââ,>h0©ä>hâ ì=h0©ðþâât>hPFä<>hâ >hPFT>häâ âd>hæ âŒN^äœ>hpçä„>hâ <>hpçX+-â âÄ>häRä¬>hâ „>häRðþââ ?h|äÔ>hâ ¬>h|ì>häâ âü>hæ â´˜fä4?h¸”ä?hâ Ô>h¸”pÃIêTA äD?h”cì ˜h@Ð ä ×J<˜hß ä0˜hdÜ^æX˜h€°äL˜h„¶`æ™hŒšäh˜h䌚¤˜hááÿåäÀ˜hïDáܘhè8ýìø˜hÿäàWL옙hìÎ ä$™häìÎ `™hááÿåä|™hïDí| Nì<œhß ä¨™h´™hæâä™hß èœhèâpêß ä´™häšhãáÔšh2äšhä™h2Pšhÿè䌚hä|šhäã´™hì â´™h 业h訚hì â´™hð|šhê›hPdääšhæPdüšhäâ êä8›hÜ÷å ›hâäšhÜ÷éâl›h8ÐäH›hâ ›h8Ð`›hèæ ›hˆä|›hâ H›hˆ”›hèæÔ›hÜø ä°›hâ |›hÜø È›hèæ œhHù ää›hâ °›hHù ü›hèæ ãÁäœhâ ä›hÁ0œhèç 0hœÏ äLœhäœÏ ˆœhááÿå䤜hïDáÀœhè¼RêÜœhè¼Rêøœhè8ýìhÿä¼Rê\hL°ä@hLhæ â8ùVêüälh´4-âLžhÄÏ ä„häÄÏ ÀhÿìäÜhïáøhè|uJìžh褮Iì0žhèLÝIøèì$ŸhÏ ä\žhäÏ ˜žhÿìä´žhïáОhè|uJììžh褮IìŸhèLÝIøèìpŸhtÏ ä4ŸhætÏ P âÿ借h¸|å ¸LŸh|ä dM¬Ÿhtß ä ŸhœnTæL h›ä¼Ÿh䛸Ÿhááÿåä hädýçDá0 hèdýÿè¡ht|ä\ hät|˜ hááÿåä´ hïDáРhè8ýìì hÿät!쨡hÏ ä¡häÏ T¡hááÿåäp¡häœLçDጡhè ~Qø¼R両hä °ô¡hð¢höôé„¢hççäçæáááxýâ¤âè‹äœ¢hä8éÈ¢h䌸^ô:âô¢häP¸^ü ⌸^æø£h@Ð ä£hä@Ð P£hááÿåäl£hïDሣhèüP줣hè¨J\ìÀ£hèðþìÜ£hÿäè오htêä¤hätêD¤hÿìä`¤hïá|¤h訃Kÿèp¥h¸±ä¨¤h丱ä¤hÿìå¥hïá¥hè|uJì8¥h褮IìT¥hèLÝIøèì¦hÑ ä€¥häÑ ¼¥hÿì䨥hïáô¥hèXâLøœÉLê̦h¸‘ä ¦h丑\¦hááÿåäx¦hïDᔦhè ê°¦hè ¦Iø°I줧hä›äܦhää›§hÿìä4§hïáP§hèlÝJìl§høˆ§hè˜âJøèì`¨hØÐ ä´§häØÐ ð§hááÿåä ¨hïDá(¨hèЧIìD¨hèðþøðþê|¨h¼ß äp¨hà VæT©hР䌨häРȨhááÿåää¨hïDâ©hø©hè8ýì8©hè8ýøŒûYìô©hŒ±äd©h䌱 ©hááÿå伩hïDáØ©hè`fPø¼Rêªh¬Ð äªh¬­Tê4±ä ªhèæ<ªhëä ¤ÓN«h@’äLªhä@’ˆªhÿì䤪hïáÀªhè|uJìܪh褮IìøªhèLÝIøèì@«hT²0«h$«hìæbê8«hìæbâ¬hðêäP«häðꌫhÿì䨫hïáÄ«hèlÝJìà«høü«hè˜âJøèìD¬h@œä(¬h4¬hæ â¤ÿLç­hÔêäT¬häÔê¬hááÿå䬬hïDáȬhøä¬hèP¼Rÿè¼­h„Ð ä­hä„Ð L­hááÿåäh­hïDá„­hè¼Rê ­hèÀNø8ýì\®h’äÌ­hä’®hááÿåä$®hïDá@®hÿä8ýðà äl®hÀ;Qæ®hì䈮hÌU⨮hŒœä ®hR\✯hв丮häвô®hááÿåä¯hïDá,¯hè êH¯hød¯hø€¯hÿäÔ)ìè¯h¬’䬯h欒P âÿåÀ°hÜëäø¯häÜë4°hÿìäP°hïál°hè|uJ숰h褮I줰hèLÝIøèìܰh´²äаhp5Ræì°h¸ëä ðZ]±h˜²äü°h<fæ±h€²ä Œ€LÔ±h(Ñ ä(±hä(Ñ d±hááÿå䀱hïDᜱhèdý츱hÿôȲh´Ñ ää±hä´Ñ ²hááÿåä<²hïDáX²hèÖLìt²hø²hø¬²hÿä¼Rêô²h”à äزhä²hæ â¿Rê~ä³hä~@³hááÿåä\³hïDáx³hèꔳhèÿèÀ´h8äÀ³hä8ü³hÿìä´hïá4´hè8ýìP´høl´hèpÿ숴hèè줴hèpÿøpÿììµh|³äдhä|³ µhÿìä(µhïáDµhè8ýì`µhø|µhø˜µhè8ýì´µhøеhèpÿø¤-ì¶h$žäüµh¨)Sâ ¶h¼Ò ä¶h¤§Pæø¶h¤ìä0¶hä¤ìl¶hááÿå䈶hïDᤶhøÀ¶høܶhÿäÔ)ìзhøä·häøD·hÿìä`·hïá|·hè´øI옷hø´·hè9Jø¨S쌸h8á äà·hä8á ¸hÿìä8¸hïáT¸héÃMìp¸hÿäìH¹há 䜸häá Ø¸hÿìäô¸hïá¹héÃMì,¹hÿô`¹hÜäX¹hLƒfâx¹hì~äp¹hà™]âPºhÄ~䈹häÄ~Ĺhÿìäà¹hïáü¹hè|uJìºh褮Iì4ºhèLÝIøèìlºhL“ä`ºhÀT渺h“ä|ºhæ“8ýäÿ嬻h´äȺhä´»hÿìä »hïá<»hèdýìX»hè8ýìt»hèì»hè@TOø@TOìÈ»hŒÒ ä¼»hêô»hpÒ äØ»hä»hæ â<­\æ¼hLÒ ä¼h¼hæ â ¼hæä<¼hïáX¼hè8ýìt¼hÿä¤-ì0½hÒ ä ¼häÒ Ü¼hááÿåäø¼hïDá½hèÖLÿè\¾häÑ ä@½hääÑ |½hááÿå䘽hïDá´½hèüKKìнhøì½hø¾hè¸uhì$¾hø@¾hè8ýùXfîèœäl¾háN[â¿h$´ä„¾hä$´À¾hÿìäܾhïáø¾h訃Kø êIì$¿h„á ä ¤oP4Àhü³ä4¿häü³p¿hÿì䌿hïᨿhèŒìÄ¿høà¿høü¿hèðþìÀhÿäì ÁhÌäDÀhäÌ€ÀhÿìäœÀhïá¸Àhè|uJìÔÀh褮IìðÀhèLÝIøèì$Áh°äÁhtÜ^â@Áh žä4Áh°DSæàÁhÓ äPÁhäÓ ŒÁhááÿåä¨ÁhïDáÄÁhè\ä_øðÊJì€ÂhèÒ äðÁhäèÒ ,ÂhááÿåäHÂhïDádÂhÿäè9VìœÂhÌÒ äÂhý]êØÑ ä¬Âh(3XæÔÂh€€äÈÂhêÃhÔÓ ääÂhäÔÓ Ãhäÿåä<ÃhïáXÃhèêIìtÃhèêIøêIìhÄhŸä ÃhäŸÜÃhÿìäøÃhïáÄhè|uJì0Äh褮IìLÄhèLÝIøèì@ÅhD”äxÄhäD”´ÄhÿìäÐÄhïáìÄhè|uJìÅh褮Iì$ÅhèLÝIøèì\Åhè´äPÅhÜRPæxÅhdÒ älÅh`æMæÅhíäˆÅh”oXâ¨Åhá”ä ÅhðrZâÀÅh€ä¸ÅhÐ&h戴äÐÅhì¡_æ˜ÆhÔ€äìÅhäÔ€(ÆhÿìäDÆhïá`Æhè$SMì|Æhè¼Rÿè8Çh|Ô ä¨Æhä|Ô äÆhÿìåÇhïáÇhèlLøìÈhüÒ äHÇhäüÒ „Çhÿìä Çhïá¼Çhè|uJìØÇh褮IìôÇhèLÝIøèìèÈhîä Èhäî\ÈhÿìäxÈhïá”Èhè|uJì°Èh褮IìÌÈhèLÝIøèìøÈhÌ”ä $J˜Éh¼€äÉhä¼€DÉhááÿåä`ÉhïDá|ÉhèЧIøðþê´Éhðíä¨Éhð»IælÊhÈíäÄÉhÐÉhæ âàÉhæäüÉhïáÊhè8ýì4Êh謲SêPÊhÿ䜲SêˆÊh íä|ÊhLSæDËh8íä˜Êhä8íÔÊhááÿåäðÊhïDá Ëhè| Nì(Ëhè ÖQÿè`Ëh¤€äTËhøçXæÌhHÔ äpËhäHÔ ¬ËhááÿåäÈËhïDáäËhèüKKíÌhÿäüµì ÌhŒ”ä,Ìh䌔hÌhááÿåä„ÌhïDí8ýì¼Ìhx”ä°Ìh€YNæÔÌh8ŸäÌÌh\˜X攀ääÌhh&â8ÍhL äüÌhæL P âÿåØÍhÈâ äHÍhäÈâ „Íhÿìä Íhïá¼ÍhèèøêIìèÍh´Ó ä ØN4Îh(Ó äøÍhh&(Ó ¬–Eòp–EöLÎhäDÎh ·Lâ´Îh, ä\Îhä, ˜Îhááÿå÷DáàÏh¼Ô äÄÎhä¼Ô áÏhááÿåäÏhïDá8ÏhøTÏhèðþìpÏhøŒÏhè®Qì¨ÏhøÄÏhèðþøèìœÐhˆÓ äðÏhäˆÓ ,ÐhááÿåäHÐhïDádÐhø€Ðhè¼RöêŒÒhh•ä¬Ðh´ÐhââäÐhh•è\Òhèâpêh•ä´ÐhäÑhãáÔÑh2äÑhäÐh2PÑhÿèäŒÑhä|Ñhäã´Ðhì â´Ðh ä¸Ñhè¨Ñhì â´Ðhð|ÑhêüÑh4åääÑhæ4åè â$Òh°ã ä ÒhâäÑh°ã èâLÒh ä4Òhâ Òh ´UäâtÒh˜mä\Òhâ 4Òh˜m¼Rìh•ä„Òh´Ðhâ¤ÒhäµäœÒh8¨^âDÓhXÓ ä´ÒhäXÓ ðÒhááÿåä ÓhïDá(ÓhèüKKøüµíÔh  äTÓhä  Óhááÿåä¬ÓhïDáÈÓhèêäÓhèöxGKð(äÔhÔhæ â4ß\æHÔh„‚ä<ÔhœÝeæèÔh8‚äXÔhä8‚”Ôhÿìä°ÔhïáÌÔhè´XMÿèÀÕh¡äøÔhä¡4ÕhÿìäPÕhïálÕhè|uJìˆÕh褮Iì¤ÕhèLÝIøèì˜Öhdã äÐÕhädã Öhÿìä(ÖhïáDÖhè|uJì`Öh褮Iì|ÖhèLÝIøèì¨Öht¡ä ä J€×h¡ä¸Öhä¡ôÖhÿìä×hïá,×hè8ýìH×hèèìd×hè8ýøt!ìœ×hDã ä ×hdŽXääØhDÕ ä¬×häDÕ è×hááÿåäØhïDá Øhø<ØhèðþìXØhøtØhè<6PìØhø¬ØhøÈØhèðþøt!íÙhà äôØhPcPæÙhÌ äÙh^æ Ùhðä,ÙhäðhÙhááÿåä„ÙhïDý¼ÙhÕ ä°Ùhìô^æØÙh·äÌÙhl ZæôÙh ã äèÙhpZêŒîäÚhêÌÚhÄÔ ä ÚhäÄÔ \ÚhááÿåäxÚhäüPçDá”Úhè¼Rê°Úhè¼RÿæÜÚh´ƒä D~J´Ûh„ƒäìÚh䄃(ÛhÿìäDÛhïá`Ûhèçfì|Ûhø˜Ûhèðþøèì¨ÜhÌ•äÄÛhäÌ•áÜhÿìäÜhïá8Ühè€ TìTÜhè êIìpÜhèìŒÜhè êIøÔ)ì€ÝhL¢ä¸ÜhäL¢ôÜhÿìäÝhïá,Ýhè|uJìHÝh褮IìdÝhèLÝIøèì<ÞhdƒäÝhädƒÌÝhÿìäèÝhäðþçáÞhèèì Þhèðþøt!ìÀÞh,¸äLÞhä,¸ˆÞhÿìä¤ÞhïíüaììÞh¨·äÐÞhÜÞhæ âðø\æßh0ƒäüÞhlä_â ßhƒäßh¼&P긕ä0ßh丕lßhááÿåäˆßhïDá¤ßhè¼RêÀßhè¼RÿæìßhØä ä \ÕPàhÌÕ äüßh€ÎIâ àhøÔ äàhT9cæÀàhx¸ä0àhäx¸làhááÿåäˆàhïDá¤àhè`fPøê´áhèƒäÐàhäèƒ áhááÿåä(áhïDáDáhè8ýì`áhèèì|áhè8ýì˜áhÿäèðÔƒäÄáhêàáh„å ä|"^ âhlå üáhðáh0ˆVêâh0ˆVâ(âhà¸äâh¸æäâhðä8âhäðtâhááÿåäâhïDá¬âhøÈâhéòNÿè ãh Õ äôâhä Õ 0ãhááÿåäLãhïDáhãhèê„ãhèÀNø8ýì¼ãh”–ä°ãhÄ[êÖ äÌãhÈÈZâ¬äh˜ðääãhä˜ð ähÿìä<ähïáXähè8ýìtähèìähÿäpÿì0åhÔÕ ä¼ähäÔÕ øähÿìäåhïýìåh@£ä@åhä@£|åhááÿåä˜åhïDá´åhèüPìÐåhÿä8ýìŒæhŒÕ äüåhäŒÕ 8æhÿìäTæhïápæhèHºUø<|Nì¨æhäå äœæhÐ6bædçhÀå 䏿häÀå ôæhááÿåäçhäðþçDá,çhèЧIìHçhèðþøðþêçhŒ„ätçh€çhæ â”YæŒôhÖ ääóhðóhæ ãôhæäôhïá8ôhøTôhøpôhèÿè¨ôh8ºäœôh|\êºä¸ôhäºôôhááÿåì8ýçDáèõhh»ä õhäh»\õhÿìäxõhïá”õhèdýì°õhøÌõhè¼Rö¼RêÀöhÌòäøõhäÌò4öhááÿåäPöhïDálöhøˆöhø¤öhÿäÔ)ì˜÷hPè äÐöhäPè ÷hÿìä(÷hïáD÷hè|uJì`÷h褮Iì|÷hèLÝIøèìpøh òä¨÷hä òä÷hÿìåøhïáøhè|uJì8øh褮IìTøhèLÝIøèìœøh<Ø Œøh€øhd Pê”øhd Pâùhüç 䬸häüç èøhÿìäùhïá ùhèˆõLì<ùhè´ìXùhèðþìtùhÿäèì¬ùh0»ä ùh¼µWæÄùhè…ä¼ùh,SâHúhØ äÔùhäØ úhÿìä,úhä°ÓfçýXûhäç äXúhääç ”úhááÿåä°úhä ~QçDáÌúhèdýìèúhè¼Rêûhè¼Rê ûhè¼Rê<ûhè¼Rÿætûh4˜ähûhä9_æüh× ä„ûhä× ÀûhááÿåäÜûhïDáøûhèdýøœÉLì˜ühŒç ä$ühäŒç `ühááÿåä|ühïDí,ÒLê´üh\òä¨ühLqMæTýh¸…äÄüh丅áýhááÿåäýhä¼RçDá8ýhè¼Rø¼Rê€ýh˜ädýhpýhæ â"]꤅äýhì‰Iætþhà»ä¬ýhäà»èýhÿìäþhïá þhè|uJì<þh褮IìXþhèLÝIøèìÿh¼»ä„þhä¼»ÀþhÿìäÜþhïáøþhè\èJø˜Kì˜ÿh8Ù ä$ÿhä8Ù `ÿhááÿåä|ÿhïDíLÝIì°ÿhÌ× ä¨ÿh€']âÀi°è äÀÿhä°è üÿhááÿåäiïDá4iè8ýìPièì‰Iìliè8ýìˆiø¤iÿäÀldìÜiÙ äÐiÐ&hæøi´× äìi4©Xæ|iáÙ äiåÙ Diááÿåä`iäüKKçDíêiÈØ äŒiäÈØ ÈiááÿåääiïDâiè8ýø8ýìØi¬Ø ä,i䬨 hiááÿåä„iä8ýçDá iø¼iÿäî\Ø äèiä\Ø $iÿìä@iïá\iè¼Rìxiè¼Rê”iè¼Rê°iè¼Rö¼Rê¤i ™äÜiä ™iÿìä4iïáPiè8ýìliøˆiÿô|i„¼ä´i䄼ðiÿìä iïá(iè|uJìDi褮Iì`ièLÝIøèíiä†äŒiää†ÈiÿìääiïíXnQì¼iX¼äiäX¼Liÿìähiïá„i訂Oì iÿäÀOìiP¦äÌiæP¦P âÿåTi4¦äiæ4¦P âÿåpiÌØ ädi\èJæŒi8¼ä€iŒÕIæ¨iĆäœi¬µWæÄiä˜ä¸i¸T]æœi<é äÔiä<é iÿìä,iïáHièìdiø€iÿä8ýì¸ià¥ä¬iÔ9_æ¬ ié äÈiäé  iááÿåä iïDá< ièdýìX iè¼Rìt iø iÿôL i”Ø ä¼ i䔨 ø iááÿåä iïDá0 ièðþÿì°Ù ä\ i€{Qæ„ i@Ù äx iê$ i,Ù ä” iä,Ù Ð iäÿåäì iïá ièLJø LJìÄ ih½ä4 iäh½p iááÿåäŒ iïDᨠièø¬%Tìœ i§äÔ iä§ iÿìä, iïáH iè¼Rìd iè¼Rì€ iÿäðþìÈ iP½ä¬ i¸ iæ â„–aæä iLÚ äØ iüÄRæô iì¦älQ iá½ä iä|XæÌ i4ôä iä4ô\ iááÿåäx iïDá” ièüKKì° iÿäüž^ìè iмäÜ i@Oê€é äø iøRRæ iì§äiLæIæÀi´§ä0iä´§liááÿåäˆiïDá¤ièøîIì˜iŒ§äÐi䌧 iÿìä(iïáDièçfì`iø|ièðþøèìpiȇä¨iäȇäiÿìåiïáiè|uJì8i褮IìTièLÝIøèì€iHšä ¬"^ išäiäšÌiÿìäèiïáiè˜%Pø¤•Ií#i¬‡ä0i8iâÔâhi¬‡èÐ"ièâp꬇ä8iäˆi/ãáXi2ä˜ihi2Ôiÿèäiåiäã8iì â8i ä<iè,iì â8iñiê0i\üähiæ\ü€iä¬â(â°i„B èièâpæhi„B ä€iäÐi ãá i2äài°i2iÿèäXiäHiäã€iì â€i ä„iètiì â€iðHiêÈiiä°iæiè$âðiHÔ äØiâ°iHÔ è âi åiâØi èâ@ièîå(iãièîéâhiäPiâ(ièâiõäxiâPiõèâ¸iðä iâxiðè âài@äÈiâ i@èâi jäðiâÈi jèæH äiâðiH ìXiÈ ä@iâhiÈ è¨â€i<õ ähiâ@i<õ è¤â¨iè äiâhiè è âÐièüä¸iâièüèœâøiáï äàiâ¸iáï è˜â id äiâàid è”âHi„ ä0iâi„ èâpiê äXiâ0iê èŒâXi°ªä€iâ Xi°ª˜iä‚ââÈiL è@ièâpæhiL ä˜iäèiãá¸i2äøiÈi24iÿèäpiä`iäã˜iì â˜i äœièŒiì â˜ið`iêàiLËäÈiæLËèâi°¾äðiâÈi°¾èâ0ipNäiâðipNèæàw ä@iâiàw ì€iÌžähiâ€iÌžè€â¨i„9 äiâhi„9 è~âÐiáä¸iâiáè|âøiLm äàiâ¸iLm èxâ i˜x äiâài˜x ètâHixaä0iâixaèpâpitÍ äXiâ0itÍ èlâ0iË ä€iâ XiË ˜iäfââÈi¼íèièâpæhi¼íä˜iäèiãá¸i2äøiÈi24iÿèäpiä`iäã˜iì â˜i äœièŒiì â˜ið`iêài°¾äÈiæ°¾èâipNäðiâÈipNèæàw äiâðiàw ìXi”kä@iâ€i”kèdâ€iäë ähiâ@iäë èbâ¨iì äiâhiì è`âÐiÔ¨ ä¸iâiÔ¨ è\âøiáA äàiâ¸iáA èXâ ià6äiâàià6èTâHi`Pä0iâi`PèPâpiÜ;äXiâ0iÜ;èLâ˜iLÎä€iâXiLÎèHâÀi¼ ä¨iâ€i¼ èDâèi´þ äÐiâ¨i´þ è@âiT|äøiâÐiT|è<â8iôä iâøiôè:â`i ãäHiâ i ãè8âHiØäpiâ Hi؈iä0ââ¸i õè0ièâpæhi õäˆiäØiãá¨i2äèi¸i2$iÿèä`iäPiäãˆiì âˆi äŒiè|iì âˆiðPiêÐiLËä¸iæLËèâøi°¾äàiâ¸i°¾èâ ipNäiâàipNèæàw ä0iâiàw ìpi<\äXiâpi<\è,â˜il¼ ä€iâXil¼ è(âÀiP÷ä¨iâ€iP÷è$âèilÿåÐiâ¨ilÿé"â iÚ äøiâÐiÚ è âø!i¬Ö ä iâ øi¬Ö 8 iäââh iÞèà!ièâpæhiÞä8 iäˆ iãáX!i2ä˜ ih i2Ô iÿèä!iå!iäã8 iì â8 i äièâpêL”ä˜i°äð=iâÈ=i°è(â0>i4ûä>iâ ð=i4û0—Iä âX>i´ä@>iâ >i´0—Iäâ€>iì`äh>iâ @>iì`0—Iäâ¨>i`ú ä>iâ h>i`ú 0—IäâÐ>i(=ä¸>iâ>i(=èâø>iÀâäà>iâ¸>iÀâðL”ä?i˜äÜhiä8é iiDiiÄPcô:â4iiäˆPcü âÄPcæ ¤iiLiiéxiiü:ᬨä"þØii¬ii4ÿîàii4êþäjiØß äjiäØß XjiááÿåätjiäçDájiø¬jiøÈjiè¬ÞUø8ýì¼ki¢äôjiä¢0kiÿìäLkiïáhkiè|uJì„ki褮Iì kièLÝIøèìliäÌkiæP âÿåÄliä¡äliää¡TliÿìäpliïáŒlièèì¨liÿä(KìàliÌ¡äÔliX8]æ¸mi®äðliä®,miááÿåäHmiïDádmièê€miøœmièèÿè8pi”¡äÈmiÔmiæ˜âni˜Þèpièâ@ê˜ÞäÔmiä$ni ãáôni2ä4nini2pniÿèä¬niäœniäãÔmiì âÔmi äØnièÈniì âÔmiðœniê0oiè¼äoiæè¼oiäâ €ê@äXoièä@oiâ oièØËMäâ€oi€ ähoiâ@oi€ èâ¨oih1äoiâhoih1è âÐoiè-ä¸oiâoiè-èâøoià­äàoiâ ¸oià­dýäâ pi Éäpiâàoi Éð˜Þä0piÔmiâ,qiüäHpiäü„piááÿåä piïDá¼piè8ýìØpiè<6Pìôpiè ãIìqièèø ãIìHqix®äXæ,öiX˜ä l§S<öih®ä ,ãSÀöiHü äLöiäHü ˆöiááÿåä¤öiïDíLÝIìØöi0ü äÐöiåZâ,÷iü äèöiôöiæä÷iïáÐCQø øi$˜ä<÷iä$˜x÷iááÿåä”÷iïDá°÷iè`fPìÌ÷iè¼Rêè÷iøøiè¼RÿêPÐä0øidF^âùi äHøiä „øiäÿåä øiïá¼øièHÒaìèøièØøiì ãúQÿâÜùiÈë äùiäÈë Pùiÿìälùiïáˆùiè|uJì¤ùi褮IìÀùièLÝIøèììùiœÑä DœUÄúi€ý äüùiä€ý 8úiÿìäTúiïápúiè|uJìŒúi褮Iì¨úièLÝIøèìûi¤ë äÔúiæ¤ë P âÿå,ûi¹ä ûiPë8æDûi„Ñä<ûi`Ç_â`ûiá äTûiÀ°Jæ¨üi@Ñäpûiä@ѬûiááÿåäÈûiïDáäûiè8ýíüièàWLìüièèì8üièèìTüièt!ìpüièèìŒüiÿä¼vPìÄüiä ä¸üitXJæ´þi ý äÔüiÜüiââ ýi ý è„þièâpê ý äÜüiä,ýiãáüýi2ä<ýi ýi2xýiÿèä´ýiä¤ýiäãÜüiì âÜüi äàýièÐýiì âÜüið¤ýiê$þi”bä þiæ”bèâLþiŽä4þiâ þiŽèâtþiƒä\þiâ 4þiƒ@µJäâœþiÜS ä„þiâ \þiÜS jää(9jääd9jÿìä€9jïáX>jèœ9jì â¬9jæâ Ü9j Ô=jèè=jä @ápH>jæ ä¬9jäü9jãá"X;j`/ :j :jÜ9j`/H:jÿèät:jìã¬9jø:jì â¬9jè¨:jÜ9j`/ä:jÿèä;jìã¬9jì,;jè:jøH;jê â¬9j äjÿäìâÊ:/Û†/ÑŽÀO¹˜št>jèðþì>jÿäèì0?j°Àä¼>jä°Àø>jÿìä?jïí$µPì@j„µä@?j䄵|?jÿìä˜?jïá´?jè|uJìÐ?j褮Iìì?jèLÝIøèì$@jŸä@jÈï\æAjhµä4@jähµp@jááÿåäŒ@jïDá¨@jøÄ@jøà@jøü@jÿäèì`BjPò ä(AjäPò dAjÿìä€AjïáœAjèdýì¸AjèÏ[ìÔAjèêðAjèê Bjø(BjèìDBjèèøèìTCj(ò äpBjä(ò ¬BjááÿåäÈBjädýçDáäBjè ~QíCjè@ôNêCjèdýì8Cjè´âUÿèpCjÀädCjluiêlä d¢NäDjX¶äCjäX¶ÌCjÿìäèCjïáDjè8ýì DjèìkP ä°=käP ì=kÿìä>kïá$>kè|uJì@>k褮Iì\>kèLÝIøèì>k8 äˆ>kœ Jâh?kÄËä >käÄËÜ>kÿìäø>kïá?kè|uJì0?k褮IìL?kèLÝIøèì„?kÄñäx?k°.Ræ@@kà ä”?käà Ð?kááÿåäì?käðþçDá@kèЧIì$@kèðþøt!ìü@k$´äP@kä$´Œ@kááÿåä¨@kïDáÄ@køà@kÿäðþìAkÜÖä Ak°°JæœAkˆ&ä(Akäˆ&dAkááÿåä€AkïDýXâpúk+ädúkèæœúkX;ä€úkŒúkæ âhjæ´úkÄä¬úkT©Râ¨ûk¼ äÄúkä¼ áûkááÿåäûkä(¸IçDá8ûkè8ýìTûkè8ýìpûkøŒûkè8ýÿèÄûkáÞä¸ûk¼‘Yædük| äÔûkä| ükááÿåä,ükïDáHükè¼Rÿèýk´Ýätükä´Ý°ükááÿåäÌükä8ýçDáèükèdýø¼Rê¨þkÐ*äýk ýkæ âPýkÀêèxþkèâpêÀêä ýkäpýkãá@þk2ä€ýkPýk2¼ýkÿèäøýkäèýkäã ýkì â ýk ä$þkèþkì â ýkðèýkêhþkÿäPþkæÿèâþkÜS äxþkâ PþkÜS ]æh l” ä\ lÈrMê€ äx lä€ ´ lááÿåäÐ lïDáì lè8ýì lèðþì$ lø@ lèèì\ løx lÿät!ìl lH=ä¤ läH=à lÿìäü lïá lèdýì4 løP lèöê`l=ä| lä=¸ lÿìäÔ lïáð lè´ aì lø(lèêDlèöÔ)ìlÀéäpläÀé¬lÿìäÈlïáälèØRílè öêIì¼ld ä,läd hlÿìä„lä8ýçá lè¼—`ÿè@l”,äÌlä”,lááÿåä$lïDí8ýì\lÀÉäPl¬ÒSætl8ßäll,ÝbâŒlÐ<ä„l Ü\â¨l$ äœlx _êä¸l(„Yæ l>äÔlä>lÿìä,lïáHlè8ýìdlø€lèðþìœlø¸lèpÿìÔlèðþìðlÿäpÿì(lä äl,+]æ¬l ä8lä tlááÿåälïDí@ÚJìÈlØ,ä¼l êIæ lPÊäØläPÊlÿìä0lïáLlè|uJìhl褮Iì„lèLÝIøèì$l¼=ä°lä¼=ìlááÿåälïDíPiìpl Êä4læ ÊP âÿåÔl, ä€lŒlæ âœlæä¸lïí8ýìXl äälä lááÿåä<lïDí8ýìtlà ählôT`ælÄ ä„l°°Jæ¨lTêä lkMâÀlèä¸lhÕ_âÜlœ=äÐlbNæølÈäìläIæìl´älä´Dlááÿåä`lïDá|lè˜Tgì˜lø´løÐlÿô¨lläüläl8lááÿåäTlïDáplèêŒlÿä@TOìœlt ä¸lät ôlááÿåälïDá,lè ~QìHlè@ôNêdlèdýì€lè´âUÿè¸l<êä¬lÀ{aæÔl„=äÈl€{QêÀ ääläÀ lááÿåä<lïDáXlè8ýìtlè¼Rêlè¼Rì¬lèxGKìÈlèxGKìälùlølè8ýì8lè¼RêTlèDTøx Tìl,ëä€lä,ë¼lÿìäØlïáôlè BYø´Uì,ldàä l\U^æèlpä<läpxlÿìä”lïá°lèìÌlèøìlD-äøld‰Wæ làêälëRæ¤läÊä0lääÊllááÿåäˆlïDý¼lÀêä´l ýkâØl(äÌl$Î]æl°Êäèlä°Ê$lááÿåä@lä8ýçDá\lèêxlø”lø°lèxGKìÌløèlÿä8ýì lðßälP¥Pæ8lX ä0l`‰MâTl$>äHlî ädlä  lðôlöä¼lìáØlÿôhllççäçáæáááxýâÌ/é‡á@<0éˆá@âDÛä¨lä2€èÔlüê l!lø8é , lX lìßQô:âÜßQä@àQü ¸ l` léŒ lü:á ¾ä‡ÿáÀ léì lü:á ¾äˆý4ëý`!làëäT!l{MæŒ!l8äp!l|!læ âÀ8[æ¨!lä>äœ!lˆÁJæ¸!lø-ä °†QÔ!lÔ-äÈ!løe\æì!l´ ää!lìµRâ"lËäü!läIæÄ"l¨àä"lä¨àT"lááÿåäp"lïDáŒ"lè,áNì¨"lè(ùSÿè,#l¤-äÔ"lä¤-#lááÿåìdýçDá¬$lÌ>ä<#läÌ>x#lááÿåä”#lïDá°#lèüKKìÌ#lèH^Qìè#lè´>aì$lø $lø<$løX$løt$lø$lÿôÈ$l” ä¼$l|GPæh%l°>äØ$lä°>%lááÿåä0%lïDáL%lè8ýÿêt-äx%lê %ldáä”%l€[Sæ¼%l` ä°%lZæè&l0 äÌ%lä0 &lÿìä$&lïá@&lèðUì\&lè(ìJìx&lèê”&lè ¦Iì°&lè<§IìÌ&lè„UÿèÀ'là äø&läà 4'lÿìäP'lïál'lè|uJìˆ'l褮Iì¤'lèLÝIøèìÜ'lÄ äÐ'lð:Ræ˜(l@äì'lä@((lááÿåäD(läðþçDá`(lèЧIì|(lè ãIÿè´(lð?ä¨(lpxSæ8)là?äÄ(läà?á)lÿìä)lïý¼)lôëäH)läôë„)lááÿåä )lïDí8ýì°*lHáäÌ)läHá*lááÿåä$*lïDá@*lèüKKì\*løx*lø”*lÿôP+l¨?äÀ*lä¨?ü*lááÿåä+lïDá4+lè8ýÿæD,l áä`+lä áœ+lááÿåä¸+lïDáÔ+lèêð+lø ,lè8ýì(,lÿäèð¸äT,lä¸,lááÿåä¬,lïDíjì -l¤@äØ,lä¤@-lÿìä0-lïáL-lè|uJìh-l褮Iì„-lèLÝIøèì\.l€ä°-lä€ì-lÿìä.lïá$.lèÀMì@.lèäJøèì/l¼ äl.lä¼ ¨.lÿìäÄ.lïáà.lè$µPìü.lè¤#Kø(Kì4/ldä(/l¼ÞPæP/l´.äD/lÌXWæl/lPÌä`/lH¬]æD0l,ìä|/lä,ì¸/lááÿåäÔ/lïDáð/lø 0lø(0lÿäèì¬0ll@äT0läl@0lááÿå÷DáÈ0lœ.ä¼0l„Þ\êôäØ0lèç1l$ äô0l Uæ¼1lð ä1läð L1lÿìäh1lïá„1lèøÚKì 1lèø sKì\2lDAäÌ1läDA2lááÿåä$2lïDá@2lèhÑRÿæà2l(âäl2lä(â¨2lááÿåäÄ2lïDíøvVêd3l äð2lä ,3lááÿåäH3lïDí Mìè3llÌät3läl̰3lááÿåäÌ3lïDíì‰Iì4l äø3lÌÉ]æ 4l ìä4lLTWæ<4lÐ ä04l ‘Pæø4lâäL4läâˆ4lááÿåä¤4lïDáÀ4lè¼RêÜ4lèýXÿè´5l¨ä5lä¨D5lááÿåä`5lïDá|5lè8ýì˜5lè8ýøèðøáäÄ5l¤*æ¨6líäà5läí6lÿìä86lïáT6lè|uJìp6l褮IìŒ6lèLÝIøèì,7llAä¸6lälAô6lÿìä7lïí´øIìè7l¬ ä<7lä¬ x7lÿìä”7lïá°7léÃMìÌ7lÿô¤8løÌäø7läøÌ48lááÿåäP8lïDál8lèœÉLìˆ8lÿô(9ll ä´8läl ð8lááÿåä 9lïDý@9lT/ä89l^âÄ9lLâäP9läLâŒ9lááÿåä¨9lä ~QçDí¼Rî| äÔ9lt!æü9l„ äð9làcæ:lè/ä :l`…Næ(:lT ä ôÖM¬:l\ ä8:lä\ t:lÿìä:lïí8ØMìh;l ãä¼:lä ãø:lááÿåä;lïDá0;lèЧIìL;lèðþøðþê€;l€íäx;lœbSâ<l´Aählèâpê¸6ä„lè‡ä>lâÜ=lè‡èâD>l¨ä,>lâ>l¨èâl>l°‹ äT>lâ,>l°‹ ð¸6ä|>l„läÈ Ð>lááÿåäì>lïDá?lø$?lè8ýø8ýìX?l@íäP?lÀÖ\æ°âäh?lp?lââ ?l°âè @lèâpê°âäp?läÀ?lãá@l2äÐ?l ?l2 @lÿèäH@lä8@läãp?lì âp?l ät@lèd@lì âp?lð8@lêÈ@l qä @læ q¸@lè âp?lê°âäØ@lp?lâœAl Íäð@lä Í,AlÿìäHAlïádAlè@ÃQì€Alèøì¸AltBä¬AlQæXBl|ÍäÈAlä|ÍBlááÿåä BlïDáXæ@tl”èä8tlhjâPtlHGä ¸·L ulÀÒä`tläÀÒœtlááÿåä¸tlïDáÔtlèЧIìðtlèðþøðþê(ulp4äul@\êxä8ulÌ#Yæ`ulä! äTul0dTæ8vlàGäpuläàG¬ulÿìäÈulïáäulè|uJívl褮IìvlèLÝIøèìwlÀ! äHvläÀ! „vlÿìä vlïá¼vlè|uJìØvl褮IìôvlèLÝIøèìèwlpÓä wläpÓ\wlÿìäxwlïá”wlè|uJì°wl褮IìÌwlèLÝIøèìxlp$ äøwlêxløäxl´t]â8xlX$ ä,xlø¬`æTxl@$ äHxlDfOæØxlLädxläL xlááÿåä¼xlïDí8ýðìèäèxläìè$ylááÿåä@ylïDá\ylèêxylèýXÿè4zlüÓä¤yläüÓàylÿìäüylïázlè¼RöèìPzlàéäDzlê`zltäl8Yá{lXôäpzläXô¬zlÿìäÈzlïáäzlè †JøÔ)ì {l¨éä{lä¨éL{lÿìäh{lïá„{lèä§KøÔ)ì¼{l”éä°{lê\|l¸5äÌ{lä¸5|lÿìä$|lïá@|lèèøœ˜Qìx|laì ~lø(~løD~lø`~lø|~lø˜~lÿø¤$ äÄ~lä¤$ álááÿåälïDá8lèüKKìTløplÿä¼Rê¨lÜêäœl Ræ¸l êä dPUÐlxêäÈl˜¿Iâìldêäàlê€l6äül€læ âEMæ l êä(€lä êd€lááÿå䀀lïDᜀlè¼R글løÔ€lè8ýìð€lÿäèìlà" ä 4!U,l´" äTWWä|" äYìÌŸløèŸlè¼Røèð$îä lä$îP lááÿåäl lïDሠlèꤠlÿä8ý옡l ØäРlä Ø ¡lÿìä(¡lïáD¡lèðUì`¡lèT¢Iì|¡lè öê°¡lŒ( 䨡lð:R∢lÐøäÀ¡läÐøü¡lÿìä¢lïá4¢lè|uJìP¢l褮Iìl¢lèLÝIøèìp£lP( 䘢läP( Ô¢lÿìäð¢lïá£lè £lì âÅMæ8£lè ³IìT£lÿä ¦I쌣l´øä€£làïT朣l ( ä °ùO¬¤lø' 䬣läø' è£lááÿåä¤lïDá ¤lè°°Jê<¤løX¤løt¤lèê¤lè8ýø8ýêȤl4Øä¼¤løRNæä¤lP' äؤlä\`ç¥lØäô¤lx¤Xæ¼¥lø×ä¥läø×L¥lááÿåäh¥lïDá„¥lèðþì ¥lÿä8ýðÀ×äÌ¥lôPâ¦láùää¥låù ¦lÿìä<¦lïáX¦lè8ýìt¦lÿô¬¦llLä ¦lÀxZæL§ldÙ伦lädÙø¦lááÿåä§lïDá0§lÿ䠾옧lÔïä\§læÔïP âÿåd©lô䨧l´§læ âä§l`Eè4©lèâpê`Eä´§lä¨lãáÔ¨l2ä¨lä§l2P¨lÿè䌨lä|¨läã´§lì â´§l 丨l訨lì â´§lð|¨lêü¨l$Ý ää¨læ$Ý üOäâ$©lP¢ ä ©lâ ä¨lP¢ ,·WäâL©l Éä4©lâ ©l Éð`Eä\©l´§lâ<ªlhïät©lähï°©lÿìäÌ©lïáè©løªlè¼Rê ªlÿôÀªl09äLªlä09ˆªlááÿå䤪läØËMçDíî LäЪlt¾Qæ`«lHÚäìªläHÚ(«lááÿåäD«lïDí¬[ë¬l0Úäp«lä0Ú¬«lááÿåäÈ«lïDáä«lÿä ¾ì¬l<( ä¬l W⸬l@:ä(¬lä@:d¬lÿì䀬lïᜬlè@ÃQø¤-ì­l\äȬlä\­lÿìä ­lïá<­lèpcQìX­lèèìt­lèèøÄfQì®lpùä ­läpùÜ­lÿìäø­lïí$µPì0®l0Mä$®lìHiæ¯l Mä@®lä M|®lááÿå䘮lïDá´®løЮlèðþìì®lÿät!ì\¯l) ä¯l$¯læä@¯lïá¼+Xè|/Uìt¯lì' äl¯lt†Uâø¯løÙ䄯läøÙÀ¯lááÿåäܯlïDídýì´°l:ä°lä:D°lááÿåä`°lïDá|°lèüKK옰lÿôаlàÙäİl0Ô^æè°lø( äà°l¤öN∱lŒÙäø°läŒÙ4±lááÿåäP±lïDál±lè¼Rö¼Rî$䘱lä$Ô±lÿì÷á²l<úå²lä<ú<²lááÿåäX²lïDát²lèŒøÔNL쨲lÛä ²l°8Râô²l¸) 串læ¸) P âÿå³lôÚä ìURÀ³lä³läP³lÿìäl³lïሳlè@øJ줳lè\èJø<§Iìܳlt( äгl/Wæø³lŒðäì³l<7Læ´lØä´l«Iâ,´l¨ä ´lLY`æX´l„Úä<´lH´læ â´§læt´l;äh´lxSh挴l¼Mä„´l c⨴lá;䜴lÀaaæÄ´lœ) 临lLri怵lÄ:äÔ´läÄ:µlááÿåä,µlïDáHµlè ~Qìdµlè¼RÿìlMäµl¼RæX¶l0) 䬵lä0) èµlÿìä¶lïá ¶lèˆõLì<¶lè¨ÿè0·l°äh¶lä°¤¶lÿìäÀ¶lïáܶlè|uJìø¶l褮Iì·lèLÝIøèìзl”ä@·lä”|·lááÿå䘷lä 8NçDá´·lè¼RöqZìè·lá) äà·l\Y`âܸl\Näø·lä\N4¸lááÿåäP¸lïDál¸løˆ¸lèðþ줸lè8ýìÀ¸lèì‰Iøt!ìø¸lñäì¸lÔ#Væ´¹lØ( ä¹läØ( D¹lááÿåä`¹lïDá|¹lèdý옹lèÿèйl0NäĹlŒÁ`æl»l* äà¹lä* ºlááÿåä8ºlïDáTºlèüKKìpºløŒºlø¨ºløĺløàºlèüKKìüºlø»lø4»løP»lÿä-ZìмlÈ( ä|»läÈ( ¸»lááÿåäÔ»lïDáð»lèüKKì ¼lø(¼løD¼lø`¼lø|¼lø˜¼lø´¼lÿôè¼lt;äà¼lägâ½l¨( äø¼lî@ä½læ@P½läÿå áêã<¾lOät½läO°½lÿìä̽lïáè½lèìV\ì¾lè ê ¾lÿäÈ’T숾ltOäL¾lætOP âÿ嘾lt* ä ûO¨¿lP䨾läPä¾lááÿåå¿lïDá¿lø8¿lè¼RêT¿lè¼Rêp¿løŒ¿lè8ýøÄ÷SìÄ¿l0丿lü‹WæÜ¿l\* äÔ¿l hNâø¿lÜÛäì¿läSKê¬ÛäÀlêìÀl Ýä$Àlä Ý`Àlÿìä|Àlïá˜Àlè|uJì´Àl褮IìÐÀlèLÝIøèìüÀl”ûä 8ØJœÁldûä ÁlädûHÁlÿìädÁlïá€Álè8ØMøœÉLê<Âl<ûä¬Álä<ûèÁlÿìäÂlïá Âlè@QÿèTÂlôÜäLÂlÀ¨]âØÂlÀñädÂläÀñ Âläÿåä¼Âlïíp¨MìôÂlø;äèÂl$§SæÃlØ;äÃlD·Ræ”Ãl¨) ä Ãlä¨) \ÃlÿìäxÃlä@_Pçí¼RêlÄlüúä¤ÃläüúàÃlááÿåäüÃlïDáÄlèdýì4ÄlèìPÄlÿôˆÄlœñä|Äl°ûNæ¤Äl¬Üä˜ÄlœLê¼Oä´Älæ¼OèÿåäÅlÀ+ åÅläÀ+ <ÅlÿìäXÅlïátÅlè,¾ZìÅlè8ýì¬ÅløÈÅlè8ýøèì0Æl¬PäôÅlæ¬PP âÿåÇlä@Ælä|Ælÿìä˜Ælïá´Ælè|uJìÐÆl褮IììÆlèLÝIøèìTÇl(üäÇlæ(üP âÿålÇlPädÇl€ÝRâ(Èl<<ä|Çlä<<¸ÇläÿåäÔÇlïáðÇlø Èlè¼Røèì8ÈltPä LÉl\äHÈlä\„Èlááÿåä ÈlähÑRåDá¼Èlè8ýìØÈlèø÷KêôÈlèhÑRöèì(Él,ä Élô\`âäÉlä8ÉlätÉlááÿåäÉlïDá¬ÉlèœÉLìÈÉlÿôËlôñäôÉläôñ0ÊlááÿåäLÊlïDáhÊlèdýì„Êlèdýì Êlø¼ÊløØÊløôÊlÿøtÝä ËlˆTWãÌlüPä8ËläüPtËlÿìäËlïá¬Ëlè|uJìÈËl褮IìäËlèLÝIøèìØÌläÌläLÌlÿìähÌlïá„Ìlè|uJì Ìl褮Iì¼ÌlèLÝIøèìèÌlX* ä Ä"^ÜÍlä<äøÌlää<4ÍlÿìäPÍlïálÍlèÜæbìˆÍlèì¤Ílè(ìJìÀÍlè öt!ììÍl4* ä T¥SÄÎldäüÍläd8ÎlÿìäTÎlïápÎlè|uJìŒÎl褮Iì¨ÎlèLÝIøèìœÏlèüäÔÎläèüÏlÿìä,ÏlïáHÏlè|uJìdÏl褮Iì€ÏlèLÝIøèì¬ÏlLä (úOhÐlÐüä¼ÏläÐüøÏlááÿåäÐlïDá0ÐlèЧIìLÐlè ãIÿè„Ðl°üä xÐlôÍSäÑl¼<ä”Ðlä¼<ÐÐlááÿåäìÐlïDíø÷Kê¨Ñlá* äÑlå* TÑlÿìäpÑlïáŒÑlÿôHÒl˜<ä¸Ñlä˜<ôÑlÿìäÒlïá,Òlè¼Røèì`Òlˆ<äXÒlXfæˆÝäpÒläˆÝ¬ÒlÿìäÈÒlïí¼RêôÒl”ä 0ïOÓl4ÞäÓl 5Læ,Ól0ä Ól¬RætÔl Þä<Ólä ÞxÓlááÿåä”Óläø÷KåDá°ÓløÌÓlè°°JìèÓløÔlèÌ?_ì Ôlè|µQì<Ôlè QìXÔlè QøT•gìŒÔl Qä„Ôlšlâ¨ÔlìÝäœÔlpVæðÕl, ä¸Ôlä, ôÔlááÿåäÕlïDá,ÕløHÕlødÕlèê€ÕløœÕlè¼Rì¸ÕløÔÕlè¼Rö¬¨ðÔòåÖl°'VâÖlXÞä xPÔÖlýä(ÖläýdÖlÿìä€ÖlïáœÖlè´øIì¸ÖlèÜ;Jø¨Sì×l„, ääÖlä„, ×lÿìä<×lïáX×lèèìt×lÿäêIì0Øldýä ×lädýÜ×lÿìäø×lïáØl訂OøtNìÙl8óä@Ølä8ó|Ølÿìä˜Ølïá´Ølè|uJìÐØl褮IììØlèLÝIøèì$Ùl¸RäÙlLkWæPÚlRä4ÙläRpÙlááÿåäŒÙlïDá¨Ùlè°°JêÄÙløàÙløüÙlèêÚlè8ýì4Úlè8ýøèìlÚlôä`ÚlЙ`æÔÚl\Rä|Úlä\R¸ÚlááÿåìdýçDáðÚlLýääÚlôAWætÛll, åÛläl, <ÛlááÿåäXÛlïDíüKKðÜä„ÛlDTæ¬ÛlÈä Ûl sMæ0Ül˜ä¼Ûlä˜øÛlÿìäÜlïí´øIììÜl¼>ä@Ülä¼>|Ülÿìä˜Ülïá´ÜlèŒOìÐÜlÿôÝlˆóäüÜlp[læ¬Þl>äÝl$ÝlæâTÝläuè|Þlèâpêäuä$ÝlätÝlãáDÞl2ä„ÝlTÝl2ÀÝlÿèäüÝläìÝläã$Ýlì â$Ýl ä(ÞlèÞlì â$ÝlðìÝlêlÞlh¦ äTÞlæh¦ äâ”ÞlL>ä|Þlâ TÞlL>`fPìäuä¤Þl$ÝlâÄÞlŒSä¼Þl|íMâÜÞl˜ÞäÔÞlÔmiâ`ßlD+ äìÞläD+ (ßlááÿåäDßlïDí8ýì|ßlþäpßl„-Qæ˜ßlP>äŒßllæ_æàl<>ä¨ßlä<>äßlááÿååàlïDíüKKì8àlhä,àl<Rædàlð* äHàlTàlæ âägæ<álÌýätàläÌý°àlááÿåäÌàlïDáèàlèLëTìálø álÿä8ýìXál , äLál =[ê ähál ÆPæøálßä„áläßÀálááÿåäÜálïDíq[ê˜âlôäâläôDâlááÿåä`âlïDá|âlè BJøpÿì¨âlhßä ÔÓNÄâl”+ ä¸âlü›UæàâlÄþäÔâl\ïdæ ãl4?äðâlüâlæ ãQæ¬ãlÜóäãläÜóXãlááÿåätãlïDáãlèЧIøðþêÈãlœþä ¼ãld$aäålt+ äØãlät+ älááÿåä0älïDáLäløhälè¼Rê„älèðþê älø¼äløØälèH´lìôälè8ýøèì,ålTþä ålðYcæHål ä<ål,ä˜çlô…Mâ$èl¤@ä°çlä¤@ìçlááÿåäèlïDí ¦Iìàèlè- ä4èläè- pèlÿìäŒèlïá¨èlèØRìÄèlèèøèìüèl, äðèl\kWæéldôä él€¨Mæ(él<ÿä ·L@él8@ä8él¬Râ\él@äPélìëkætélð?älél`æXâélLôä„élBWæ¬élœ- ä élLriæhêl„?ä¼élä„?øélááÿåäêlïDá0êlè ~QìLêlèÿì ôäxêlä ô´êlÿìäÐêlä¼Rçáìêlè¼Rìëlÿôàël|, ä4ëlä|, pëlÿìäŒëlïá¨ëlè8ýìÄëlÿä8ýìøëláõäðël´ã[â$ìl´àìlìlHÇKêìlHÇKâüìl€ä4ìlä€pìlÿìäŒìlïá¨ìlèpÞLìÄìlèœÉLêàìlèXâLÿèílè@ä ílœºUâ´íl¸@ä$ílä¸@`ílÿìä|ílïá˜íl褮Iø ³IìŒîlt. äÄílät. áîlÿìäîlïá8îlè|uJìTîl褮IìpîlèLÝIøèì¨îlÌÿäœîlP_cæÄîl°ôä¸îlÌSæ€ïl”àäÔîlä”àïlááÿåä,ïlïDáHïlèX+-ìdïlÿä8ýð|ôäïl0ðMæ¸ïlÈä¬ïl(Uætðl@- äÈïlä@- ðlááÿåä ðlïDá<ðlè8DJìXðlÿäèì„ðl$- ä |PU$ñl€ä”ðlä€Ððlÿìäìðlïáñlè †JøìÄñlHõä4ñläHõpñlÿìäŒñlïá¨ñlèä§KøìðòlXäÔñläXòlÿìä,òlïáHòlè,¾Zìdòlè8ýì€òløœòlè8ýì¸òløÔòlèðþøèìÈólì, åóläì, <ólÿìäXólïátóléÃMìólø¬ólèøì ôlŒáäØóläŒáôlÿìä0ôlïáLôlè|uJìhôl褮Iì„ôlèLÝIøèììôlèä°ôlæè8ýäÿåõl/ õlüôlh[êõlh[â4õl<ä(õl¤dæPõl°, äDõl€[læ¸õlä`õläœõlááÿå÷DáÐõlLáäÈõld$aâìõlœ, äàõlðMZæöl/ äüõlØó_æŒölAäöläATölááÿåäpöläØËMçDí¼Rê¸öl8õäœöl¨ölæ âm<%ä¼=mä<%ø=mááÿåä>mïDídýìL>m$%ä@>mÀ{aæÐ>m`üä\>mä`ü˜>mááÿåä´>mïDí8ýêì>mä6 äà>mˆWKæ?mÔ6 äü>mì‰Iê3 ä?mä3 T?mðp?möôéä?mççäçæáááxýâ1â? äü?mä4ê@ý@@mP3 ä8@mxZNâP@m@^ä ¸M AmÈä`@mäÈœ@mÿìä¸@mïáÔ@mè8ÇKìð@mèø êIíBmœäAmäœXAmÿìätAmïáAmè´øIì¬AmøÈAmèÔ)ìäAmÿä¤*ì¼BmØ]äBmäØ]LBmááÿåähBmäðþçDá„BmèЧIì Bmèðþøðþê°CmÜJäÌBmäÜJCmááÿåä$CmïDá@Cmø\Cmè¼RêxCmè¼Rê”Cmèö¼RêÌCmÄ]äÀCm ÑTæäCmì%äÜCmDTâ„Dm(ýäôCmä(ý0DmááÿåäLDmïDáhDmè8ýÿè$EmP]ä”DmäP]ÐDmááÿåäìDmïDáEmè8ýøŒ MìKâYm$MäøXmYmæ â¤`ê)ä$Ym0Ymæ â„ÙRæÄYm45 äPYmä45 ŒYmÿìä¨Ymädýçí`¹bìÜYm aäÔYm¤Ä[â|Zm@ äìYmä@ (ZmÿìäDZmïá`ZmèHJø¤-ì8[mT; äŒZmäT; ÈZmÿìääZmïâ[mè€ Tì[mèHlKø¤-ì\m¼MäH[mä¼M„[mÿìä [mïá¼[mè|uJìØ[m褮Iìô[mèLÝIøèìè\m0; ä \mä0; \\mÿìäx\mïá”\mè|uJì°\m褮IìÌ\mèLÝIøèì]m5 äø\mÐWæ¤]mdëä]mädëP]mááÿåäl]mïDáˆ]mè8ýÿèÀ]mëä´]m„O\æÜ]m¤MäÐ]mhcOæ|^mŒMäì]mäŒM(^mááÿåäD^mäØËMçDá`^mè ~Qø¼Rî¼4 äŒ^mh&¼4 áÓGòÄÒGöL_mt*äØ^mät*_mÿìä0_mïí ‚\ìx`m¬ ä\_mä¬ ˜_mááÿåä´_mïDáÐ_mèêIìì_mø`mø$`mø@`mø\`mÿäÔ)ìPamH< äˆ`mäH< Ä`mäÿåäà`mïáü`mè(ìJìamèê4amèèø˜Kì(bm$< ä`amä$< œamÿìä¸amïáÔamè|uJìðam褮Iì bmèLÝIøèícm€ ä8bmä€ tbmÿìäbmïá¬bmèHlKìÈbmèHlKìäbmè êIø sKì¤cmŒ”cmcmcmæäLcmŒöâ„cmæŒäcmälcmãåŒä|cmcmâ0Ú UAÒœ©`°ì=9ãœcmcmâDdmØëä´cmäØëðcmÿìä dmïá(dmè|uJø ¦Iì\dm4NäTdmáQâldm€5 ä  R(em´ëä|dmä´ë¸dmÿìäÔdmä¼ÅJçáðdmø emèÿæäem”; ä8emä”; temááÿåäemïDá¬emè ~QìÈemè¼Röl ZðH5 äôemäH5 0fmááÿåäLfmïDí QìgmÈ< äxfmäÈ< ´fmááÿåäÐfmïDáìfmÿäèìàgmd ägmäd TgmÿìäpgmïáŒgmèØ#Oì¨gmøÄgmÿäèì(im6 äðgmä6 ,hmÿìäHhmïádhméúQì€hmèêœhmè ê¸hmè ãIìÔhmèèìðhmèðþì imÿõjm < ä8imä < timÿìäimïá¬imè|uJìÈim褮IìäimèLÝIøèìjmD ä ×M,jm¼ä jmœºUæÌjm aä ä,Ém˜ÝZædÉm@> äHÉmTÉmæ âØ^NæÊm¤kätÉmä¤k°ÉmááÿåäÌÉmäü+KçDáèÉmè ~Qøê Êm$äÊmx _æ<ÊmpE ä0ÊmôÁeæÜÊmTE äLÊmäTE ˆÊmááÿåä¤ÊmïDáÀÊmè ~Qø˜QðDE äìÊm¬¨æ˜ËmYäËmäYDËmÿìä`Ëmä$SMçá|Ëmè¼Rö¼Rê8ÌmðXä¨ËmäðXäËmááÿååÌmïDáÌmèì‰IöìÍm¼äHÌm伄Ìmÿìä Ìmïá¼ÌmèçfìØÌmøôÌmè8ýøèì\Ím´4ä Ímæ´48ýäÿå¨Ím„4älÍmæ„48ýäÿå€Îmlôä¸ÍmälôôÍmÿìäÎmïá,Îmè|uJìHÎm褮IìdÎmèLÝIøèìXÏm@ôäÎmä@ôÌÎmÿìäèÎmïáÏmè|uJì Ïm褮Iì<ÏmèLÝIøèì0ÐmÄähÏmäĤÏmÿìäÀÏmïáÜÏmè|uJìøÏm褮IìÐmèLÝIøèìHÐm¤ä@ÐmŒ*TâdÐmpF äXÐm<‚QætÐmp4ä ä8näÄ>P8nÿìäl8nïáˆ8nè¼Rì¤8nèdýø¼RìÜ8nü^äÐ8npÏXæô8n„H äì8n”™bâ:n0ä9nä0@9nááÿåä\9nïDáx9nèX+-ì”9nèàWLì°9nèàWLìÌ9nèàWLìè9nèàWLøàWLì:näO ä ðN,:nX>ä$:nÀµ^æÀO ä<:näÀO x:nÿìä”:nïá°:nÿä¼Rêä:n€äÜ:n Pâ¼;näH äô:nääH 0;näÿåäL;nïáh;nèì„;nèì ;nÿôÔ;nÌH äÌ;nŒ¸Oâtnüûäð=näüû,>nÿì÷á¬?n

nä

nááÿåä°>nïDáÌ>nè`fPìè>nèê?nø ?nèìäpnä8é HpntpnÄPcô:â4iiäˆPcü Ôpn|pné¨pnü:ᬨä,þqnÜpn4ÿîqn4êþrnzäLqnäzˆqnäÿåä¤qnïáÀqnèHÒaììqnèÜqnì âØ#OÿârnPdä ¼ J0rnlä(rn¬ðXâ@rnèM ä 0ûOÄrnôyäPrnäôyŒrnááÿåä¨rnïDíŒ?KìÜrnˆDäÔrnPÂbâørnTäìrntSæsn´yäsn8ýæ|sn<ä$snä<`snááÿå÷Dá˜snØU äŒsn@ôNæ´sn yä¨sn(jaæÄtn¼U äÄsnä¼U átnááÿåätnïDá8tnè8ýìTtnè¼Rêptnè¼RêŒtnø¨tnè8ýÿèdun<äÔtnä<unááÿåä,unïDáHunÿäê|unxyätunòTâ”unØcäŒun°ëTæää¤unääàunÿìäüunäçávnø4vnèÿè$xnØdä`vnäØdœvnááÿåä¸vnïDáÔvnè êðvnèê wnè ê(wnøDwnø`wnø|wnèèì˜wnè¤#Kì´wnèäJìÐwnèèììwnètNìxnèŒøt!ìàxn¼zä4xnä¼zpxnááÿåäŒxnïDá¨xnèìÄxnÿä¤-ìðxná&ä Ô°W yn¸V åyn¼—`æznøäynäøXynÿìätynïáynè¼Rì¬ynøÈynèðþìäynùznèèøèì8zn¤zä,zn¼¬ZæTznˆzäHzn´ºdæpzn¸N ädznܰSæˆznà%ä€zn8ùSâÐ{n„N ä˜znä„N Ôznÿìäðznïá {nø({nè¼RìD{nè¼Rì`{nè¼Rì|{nè¼Rì˜{nè¼Rì´{nè¼Rø¤*ìì{n¨äà{n¨âkæ¨|n¤%äü{nä¤%8|nááÿåäT|n䌧TçDáp|nèêŒ|nÿøhN ä¸|nähN ô|nááÿåä}nïDá,}nèüKKìH}nød}nø€}nøœ}nÿ䈉OìX~n¨äÈ}nä¨~nááÿåä ~nïDá<~nè BJø LJìLnxäh~näx¤~nÿìäÀ~nïáÜ~nè`…Nìø~nønèÔ)ì0nÿäèìÐnhO ä\nähO ˜nááÿåä´nïDíÀIìènt{äànX+câ€nlW äønÌh戀n<{ä€nä<{P€nááÿåäl€nïDý(nTW 䘀näTW Ô€nááÿåäð€nïDá nè8ýø<6PìDn`ä8n\—Sæ‚nW äTnäW nááÿåä¬nä¼MçDáÈnøänèd»Lí‚nè ~QÿèØ‚n¤Eä,‚nä¤Eh‚nááÿåä„‚nädýçDá ‚nèdý켂nèdýÿèô‚nHäè‚n8q_æ ƒn{äƒnƒnæ âP!XêäV ä0ƒnääV lƒnÿì䈃nïᤃnÿä¼Rê$…n¬&äЃnä¬& „nÿìä(„nïáD„nè8ýì`„nèðþì|„nø˜„nèðþì´„nøЄnèðþìì„nø…nèðþÿèÄ…n¤X ä4…nä¤X p…nááÿå䌅nïDᨅnÿäX+-ì†n€X äÔ…næ€X P âÿåè†nì{ä †näì{\†nÿìäx†nïᔆnè|uJì°†n褮Iì̆nèLÝIøèìÀ‡n<äø†nä<4‡nááÿåäP‡nïDál‡nè°¢J숇nø¤‡nÿä|예nÈeäЇnäÈe ˆnÿìä(ˆnïáDˆnèT¢Iì`ˆnè ¦Iì|ˆnè öt!ìT‰nF䨈näFäˆnÿìå‰nïá‰nèì8‰nèdýøìp‰n¬eäd‰nè¡Y怉n\X ä €†Qœ‰n@ä‰nPE]權nˆ&䬉näˆ&è‰nááÿåäŠnïDá Šnèðþì<Šnè ãIìXŠnè ãIìtŠnè ãIìŠnè ãIø ãIìÄŠnX 伊n€`WâàŠnèW äÔŠnÌÖUêèO äðŠnäèO ,‹nááÿåäH‹nïDád‹nèüKKøˆ‰Oì ŒnT'ä‹näT'Ì‹näÿåäè‹nïáŒnèLJø LJì0Œn€fä 4PU´Œn¨P ä@Œnä¨P |Œnÿì䘌nïíDJìÐŒn8'äÄŒnôèSæìŒn”äàŒnÜÉ]æPŽnY äüŒnäY 8nááÿåäTnïDápnè`fPìŒnè¼Rê¨nøÄnè¼RìànøünøŽnèxGKì4ŽnèÈV]øèìðŽnxP ä`ŽnäxP œŽnááÿå与nïDáÔŽnèüKKÿè¬n„ånä„H†ˆ›n?œì†ì†ìòò†ìò†ì†Òöʆˆþöð†ƒùð†ƒùn=$†ˆ›‘Òön< †ˆ›‘Òöö†üð†ƒùn;Ô†ˆ›‹†Òöò†ƒùn:䆈›§ò†ì†Òöò†ƒùn:8ˆ›ŸìØöò†ƒùö†ün8ô†ˆ›n9ôì†ì†ì†ì†ì†Òöò†ƒùð†ƒùn8†ˆ›­ì†ì†Òön6 †ˆ›n7̆ìò†ìò†ìò†ì†Òön4n5L“n5ön6n5ðn6xþøþn5\þŸì†Òn4¤‚ˆþŸì†Òn4 ˆþ‘Òön3 †ˆ›n4ì†ìò†ì†Òön2œ†ˆ›‘Òön2†ˆ›‘Òön1†ˆ›n2ì†ì†ìò†ìØön0†ˆ›µ†ì†ìòùßöò†ƒùn/†ˆ›n/ììò†ì†ì†Òön.0†ˆ›»ì†ì†ì†Òön-¬†ˆ›‘Òön,ð†ˆ›­ì†ì†Òön,P†ˆ›Ÿì†Òön*|†ˆ›n,†ìò†ìò†ìò†ìò†ìò†ì†Òön)舛ŸìØön) †ˆ›­ì†ì†Òöð†ƒùð†ƒùð†ƒùn($†ƒˆ»ì†ì†ì†àò†ƒùö†ün&Іˆ›n'ìì†ì†ìòòò†Òön&†ˆ›­ì†ì†Òön%€†ˆ›‘‹Çööƒùð†ƒùò†ƒùn$<†ˆ›n% ì†ì†ìò†Òön#€†ˆ›­ì†ì†óßöð†ƒùn"Œ†ˆ›»ì†ì†ì†Òöð†üö†üö†üð†ƒù؆ˆþöö†ün!†ˆ›­ìò†ÒönÀnp“n n ¼Š’êön n œþön€þŸìùßnÈ‚ˆþŸìùßöün4†ˆ›ãön°†ˆ›ãön,†ˆ›‘Òöð†ƒùð†ƒùò†ƒùn<†ˆ›‹†Òöð†ƒù膃ˆñ؆ˆþön솈›­ì†ì†Òöð†ƒùöƒùò†ƒùÔ†ƒˆ‹†àò†ƒùnX†ˆ›»ìòò†Òöð†ƒùnœ†ˆ›Ÿì†ÒönŒ†ˆ›ndò†ì†ì†ì†Òön솈›ŸìØöð†ƒùöƒù脌ƒóƒùn°†ˆ›»ì†ì†ì†Òönô†ˆ›­ì†ì†óßön†ˆ›»ì†ì†ì†Òöö†üð†ƒùn “ ½Žü–ü—Én°þöò†ƒùnÀ†ˆ›™†ì†Òöð†ƒùn †ˆ›‘óßöð†ƒùn€†ˆ›‘Òöð†ƒùö†üð†ƒùn´†ˆ›‘Òöö†ün†ˆ›ŸìØöñð†ƒùn†ˆ›ŸìØöò†ƒùö†üð†ƒùn †ˆ›§†ì†ì†óßöò†ƒùò†ƒùð†ƒùò†ƒùn †ˆ›‘Òööƒùn $†ˆ›§òòØön h†ˆ›­ìòØön Ȇˆ›Ÿì†Òö脌ƒóƒùö†ü؆ˆþön„†ˆ›­ì†ì†óßön†ˆ›ntìòòòØön †ˆ›‘Òöˆ›‘Òöò†ƒùð†ƒùnœ†ˆ›n†ì†ìòòòòòòòò†Òön¨†ˆ›nŒìò†ì†ì†Òön†ˆ›Ÿì†Òön†ˆ›nøìò†ìòØönt†ˆ›‹†Òönœ†ˆ›»ìò†ì†ÒömÿĆˆ›»ì†ì†ì†Òömþ|†ˆ›mÿŒ†ìò†ìò†ì†ì†Òömý̈›™†ìùßö膃ˆñmüô†ˆ›Ÿì†ÒömüT†ˆ›ŸìØömûD†ˆ›mü†ìò†ì†ì†Òöò†ƒùmúŒ†ˆ›Ÿì†Òöð†ƒùð†ƒùð†ƒùð†ƒùò†ƒù؆ˆþömøà†ˆ›»ì†ìò†Òöð†ƒùm÷솈›»ì†ì†ì†Òöm÷L†ˆ›Ÿì†Òömöt†ˆ›»ì†ì†ì†ÒömõÔ†ˆ›ŸìØöð†ƒùöƒù膃ˆñð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùmôH†ˆ›ŸìØömóp†ˆ›»ì†ì†ì†ÒömòІˆ›Ÿì†Òömò ˆ›™ò†ÒömñX†ˆ›­ì†ì†Òöö†üm𨆈›Ÿì†Òömð†ˆ›Ÿì†ÒömïXˆ›­ì†ìØömîȆˆ›‘ÒömîD†ˆ›‘Òömíl†ˆ›§†ì†ì†Òöð†ƒùm씆ˆ›­ì†ì†ÒömëØ†ˆ›™†ìùßömë(†ˆŸŠˆ‘më@öð†ƒùmêl†ˆ›Ÿì†Òöö†üð†ƒùm鄆ˆ›­ìò†Òöm醈›‘Òöm眆ˆ›mèȆìò†ìò†ìò†ì†Òöøƒùð†ƒùð†ƒù膃ˆñm怆ˆ›‹†óßöm娆ˆ›§òò†óßömå$†ˆ›‘óßöð†ƒùò†ƒùmäP†ˆ›ŸìØöö†ümㄆˆ›™†ì†óßöò†ƒùm┆ˆ›»ìò†ì†Òö؆ˆþöò†ƒùmáX†ˆ›»ì†ì†ì†Òöð†ƒùmàŒˆ›™òùßömߨ†ˆ›§†ì†ì†Òöð†ƒùð†ƒùmÞІˆ›‹†Òöö†ü؆ˆþömݸ†ˆ›­ì†ì†óßöò†ƒùm݆ˆ›‘Òöüüm܆ˆ›mÜüìò†ì†ì†Òöò†ƒùmÛ`†ˆ›Ÿì†ÒömÚ܆ˆ›‘Òöð†ƒùmÙ膈›»ìò†ìØöò†ƒù脌ƒóƒùmذ†ˆ›mÙ”ì†ìòò†Òöö†üm×<†ˆ›mØhòò†ìò†ìò†ì†ÒömÒ“¼mÓHŠ–˜mÖàˆ’êÊ‚ˆ’êmÓ¼ü–mÔ†’mÕLŒmÖ ˆ’êÊ‚ˆ’êÐü–ü—ÉmÔ¤mÕ,þøþmÔpþmÓØ—ˆŸì†mÓ@mÒ mÓ(þøþmÒ›Ÿì†Òöð†ƒùð†ƒùmи†ƒˆˆmÑ´ìò†ì†ì†ìòÞð†ƒùö†üò†ƒùö†üð†ƒùò†ƒùmÏX†ˆ›»ì†ì†ì†Òöm΀†ˆ›»ì†ì†ì†Òömͨ†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþömÌ8†ˆ›»ì†ìò†Òöm˘†ˆ›Ÿì†ÒömÊø†ˆ›Ÿì†óßööƒùmÊ<†ˆ›Ÿì†Òöð†ƒùð†ƒùmÉd†ˆ›Ÿì†óßö膃ˆñð†ƒùö†üö†ü؆ˆþö؆ˆþömǨ†ˆ›­ì†ì†ÒömÆD†ˆ›mÇp†ìò†ìò†ìò†ì†ÒööƒùmŤ†ˆ›‘ÒöʆˆŸßöò†ƒùmÄ0†ˆ›µ†ì†ìò†Òöò†ƒùö†üð†ƒùð†ƒùmÂø†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒùmÁ膈›»ì†ì†ì†ÒömÁH†ˆ›Ÿì†ÒömÀp†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöm¿†ˆ›»ìò†ì†ÒöÞ“õþþøò†ƒùm½à†ˆ›™†ì†Òöð†ƒùð†ƒùm¼´†ˆ›µ†ì†ì†ì†Òöm¼†ˆ›Ÿìùßöö†ü؆“õþþømºà†ˆ›»ì†ì†ì†Òömº$†ˆ›™ò†Òö؆ˆþöm¹8†ˆ›Ÿì†Òöö†üm¸P†ˆ›»ì†ì†ì†Òöð†ƒùm·\†ˆ›»ì†ì†ì†Òöð†ƒùöƒùð†ƒùm¶h†ˆ›Ÿì†ÒömµÈ†ˆ›Ÿì†Òömµ(†ˆ›Ÿì†Òöm´ˆ†ˆ›Ÿì†Òöm³°†ˆ›»ì†ìòØöð†ü؆ˆþö؆ˆþöm²\†ˆ›Ÿì†Òöm±¼†ˆ›Ÿì†Òöm±8†ˆ›‘Òööƒùm°|†ˆ›Ÿì†Òöm¯À†ˆ›­ì†ì†Òöò†ƒùð†ƒùð†ƒùʆˆþöö†ü膃ˆñð†ƒùö†ü膃ˆñm­œ†ˆ›»ì†ì†ì†Òö؆ˆþöm¬x†ˆ›»ì†ì†ì†Òöm«Ø†ˆ›‹†Òö؆ˆþömª´†ˆ›»ì†ì†ì†Òöm©Ü†ˆ›»ì†ì†ì†Òöö†üøƒùò†ƒùö†üö†üm¨l†ˆ›m©lì†ì†ì†ì†ì†Òöð†ƒùò†ƒùm§ˆˆ›­ìò†Òöð†ƒùð†ƒùð†ƒùð†ƒùm¦ˆ†ˆ›‘Òöm¥ô„m¦|ƒm¦ƒŠþŸŒƒùôüÚm¤ä†ˆ›m¥äìòòò†ì†Òöð†ƒùð†ƒùð†üm£ð†ˆ›‹†Òöøƒùð†ƒùð†ƒùm¢t†ˆ›m£ìò†ì†ì†ì†ì†Òöö†üm¡Ä†ˆ›Ÿì†Òöm¡$†ˆ›Ÿì†Òöm L†ˆ›»ì†ì†ì†Òöð†ƒùmŸ†ˆ›mŸø†ìò†ìò†ì†ÒömžH†ˆ›™†ì†Òöm›xmœœ“mFm芒êöm@mÈþömœ¬þŸìùßm›ô‚ˆþŸìùßm›|ˆ›ãömšì†ˆ›ãömšL†ˆ›Ÿì†óßöð†ƒùð†ƒùð†ƒùò†ƒùò†ƒùò†ƒùð†ƒùö†üm˜¬†ˆ›»ì†ì†ì†Òöò†ƒùm˜†ˆ›‘óßöm•Œm–¼“m—fm˜m—`m—èþøþm–ÌþŸì†Òm–‚ˆþŸì†Òm•ˆþ‘Òö膃ˆñò†ƒùð†ƒùð†ƒùm”l†ƒˆˆ­ì†ì†Øm“°†ˆ›­ì†ì†Òöm’„†ˆ›m“ ì†ìò†ì†ìò†Òöð†ƒùm‘†ˆ›»ì†ì†ì†Òöð†ƒùmœ†ˆ›»ì†ì†ì†Òöm†ˆ›‘ÒöÞ“õþþøò†ƒù膃ˆñmŽ”†ˆ›µòòò†Òöð†ƒùm¼†ˆ›™†ìùßöm†ˆ›Ÿì†óßömŒ`†ˆ›™†ì†Òöð†ƒùm‹ˆ†ˆ›™†ìØöð†ƒùð†ƒùò†ƒùñmІˆ›µ†ì†ìò†Òöð†ƒùð†ƒùð†ƒùð†ƒùmˆÐ†ˆ›»ì†ì†ì†Òöm‡À†ˆ›mˆ˜†ìò†ì†ì†Òö脌ƒóƒùm‡†ˆ›‘Òöm†8†ˆ›»ìò†ì†Òöm…ˆˆ›™†ì†Òöm„܆ˆ›Ÿì†Òömƒ@†ˆ›m„Ìì†ì†ì†ì†ì†ìòòò†ìØöð†ƒùm‚L†ˆ›»ì†ì†ì†Òöm†ˆ›™†ì†Òöm€Ô†ˆ›­ì†ì†Òöm€4†ˆ›Ÿì†Òömx†ˆ›­ìòØöm}ƒúþŸmlƒùꆄ‚öꆄ‚öꆄ„þöꆆöm}ð†ˆ¦õ·ä†‹Ø’ÍþøôüÚm|¬†ˆ›§òò†Òöò†ƒùm{¼†ˆ›»ì†ì†ì†Òöð†ƒùmzȆˆ›»ì†ì†ì†Òömz(†ˆ›Ÿì†óßööüò†ƒùð†ƒùmy†ˆ›§òò†óßöð†ƒùmx`†ˆ›‘Òömw¤†ˆ›™†ì†óßöò†ƒùmv´†ˆ›»ì†ì†ì†Òömv†ˆ›Ÿì†Òömu †ˆ›mvì†ìòò†Òömtd†ˆ›­ìò†Òöms¨†ˆ›­ìò†ÒömrІˆ›»ì†ì†ì†Òöøƒùò†ƒùð†ƒùmq¬†ˆ›§†ì†ì†Òömq(†ˆ›‘Òömpˆ†ˆ›Ÿì†Òö脌ƒóƒùmo¼†ˆ›Ÿì†Òömo†ˆ›ŸìØööüð†ƒùmn`†ˆ›‘Òömm¤†ˆ›­ìò†Òömm†ˆ›Ÿì†Òömk†ƒˆúþŸmløƒùꆄ‚öꆄ‚öꆄ‚öꆆömk|†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùmj,†ˆ›‹†Òöð†ƒùö†ümi(†ˆ›»ì†ì†ì†Òömgà†ˆ›mhðò†ì†ì†ì†ì†ì†Òömg†ˆ›»ìòò†Òömfh†ˆ›ŸìØöˆ›‘Òöme(†ˆ›­ì†ì†Òömdl†ˆ›™†ìùßöö†üò†ƒùmc¤†ˆ›Ÿì†Òömc„mc˜ƒmc ƒšðþŸŒƒùôüÚmb(†ˆ›»ì†ì†ì†ÒömaP†ˆ›»ì†ì†ì†Òöm`x†ˆ›»ì†ì†ì†Òöm_L†ˆ›m`hìòòòòò†Òöm^Ȇˆ›‘ÒöÞ“õþþøm]܆ˆ›Ÿì†óßöð†ƒùð†ƒùm]†ˆ›‹†Òöð†ƒùm\†ˆ›»ì†ì†ì†Òöm[8†ˆ›»ì†ì†ì†ÒömZ|†ˆ›­ì†ì†ÒömY܆ˆ›Ÿì†Òöò†ƒùmY@†ˆ›‘óßöñ膃ˆñò†ƒùð†ƒùð†ƒùmX†ˆ›‘ÒömWt†ˆ›Ÿì†Òö؆ˆþö؆ˆþömVX†ˆ›‘ÒömU,†ˆ›mVHìò†ìò†ì†ì†Òöøƒùð†ƒùmT<†ˆ›­ìò†Òöð†ƒùʆˆþöð†ƒùð†ƒùð†ƒùò†ƒùð†üð†ƒù؆ˆþöö†ümR4†ˆ›‘ÒömQ”†ˆ›‹†ÒömQˆ›ŸìØöò†ƒùö†üð†ƒùmO؆ˆ›§†ì†ì†Òöð†ƒùö†üð†ƒùð†ƒùð†ƒùð†ƒù؆ˆþömNP†ˆ›Ÿì†ÒömM°†ˆ›Ÿì†ÒömL؆ˆ›»ì†ì†ì†ÒömL†ˆ›»ì†ì†ì†Òöð†ümK(†ˆ›™†ì†ÒöøƒùmJ†ˆ›mKì†ì†ìò†ÒömI|†ˆ›Ÿì†ÒömHø†ˆ›‘óßömHt†ˆ›‘óßöð†ƒùð†ƒùò†ƒùmGh†ˆ›­ì†ì†Òöò†ƒùö†ümFh†ˆ›»ì†ì†ì†ÒömEt†ˆ›µ†ì†ìò†Òöð†üöƒùò†ƒùmD„†ˆ›Ÿì†ÒömC䆈›‹†Òöò†ƒùð†ƒùmB¼†ˆ›mC ì†ì†ì†ìØömB†ˆ›­ì†ì†óßömA †ˆ›mAðìò†ìò†Òöm@P†ˆ›­ì†ì†Òöö†üò†ƒùm?“ ½üm?$þöð†ƒùð†ƒùm>L†ˆ›‘Òöð†ƒùm=¬†ˆ›‘Òöm<¸†ˆ›µ†ì†ì†ì†Òöm<†ˆ›Ÿìùßöm;\†ˆ›­ì†ì†óßöm: †ˆ›­ìò†Òöm9t†ˆ›m:h†ìò†ìò†ì†ÒöЈþöm8l†ˆ›Ÿì†Òöm7̆ˆ›Ÿì†Òöò†ƒùm6܆ˆ›§†ì†ì†óßö脌ƒóƒù脌ƒóƒùñð†ƒùm5¸†ˆ›‘Òöð†ƒùð†ƒùm4Ćˆ›­ìò†Òöm3´†ˆ›m4´ìòò†ì†ì†Òööüð†ƒùm2À†ˆ›™†ì†Òöð†ƒùm1°†ˆ›m2”ì†ì†ì†ìØöò†ƒùð†ƒùö†üm0”†ˆ›»ì†ì†ì†Òöm/¼†ˆ›»ì†ì†ì†Òöm/†ˆ›Ÿì†Òööƒùm.`†ˆ›‹†Òöð†ƒùm-ˆ†ˆ›­ì†ìØöò†ƒùm,˜†ˆ›»ì†ì†ì†Òö脌ƒóƒùö†üm*ø†ˆ›m,$òò†ìò†ìò†ì†Òööƒùm*†ˆ›§ò†ì†Òöm)H†ˆ›­ì†ì†óßöm(Ćˆ›‘Òöm'†ˆ›m(Œ†ìò†ì†ìòò†ì†ì†ä†‹Çöm&$†ˆ›m'ì†ìò†ì†Òöm%„†ˆ›‹†Òööüm$䆈›‘óßöð†ƒùm$ †ˆ›™†ìØöð†ƒùm#l†ˆ›‘Òöò†ƒùm"˜†ˆ›­ì†ì†óßöð†ƒùm!܆ˆ›Ÿì†Òöm!Hˆ›Ÿì†Òöm ¸†ˆ›‘Òöð†ƒùmà†ˆ›­ì†ì†Òöð†ƒùm솈›»ì†ì†ì†Òöm†ˆ›»ì†ì†ì†Òömt†ˆ›Ÿì†ÒömH†ˆ›mdìò†ìòò†ìØööƒùð†ƒùð†ƒùð†ƒùð†ƒùò†ƒù膃ˆñò†ƒùò†ƒùm¬†ƒˆˆ™†ì†Øð†ƒùð†ƒùö†ümĆˆ›‹†Òöm솈›»ì†ì†ì†Òö؆ˆþöò†ƒùm†ˆ›‘Òöð†ƒùð†ƒùm,†ˆ›ŸìØöñmD†ˆ›­ì†ì†Òöm¤†ˆ›‹†Òöð†üð†ƒùö†üð†ƒùm †ˆ›‹†Òöm䆈›­ì†ì†ÒömD†ˆ›Ÿì†ÒömÀ†ˆ›‘Òööƒùò†ƒùö†ümÀ†ˆ›™†ì†Òöm †ˆ›ŸìØöm0†ƒˆˆmì†ìò†ì†ì†ØmX†ˆ›»ì†ìò†Òöð†ƒùmœ†ˆ›Ÿì†Òöm Ćˆ›»ì†ì†ì†Òöm 0ˆ›Ÿì†Òöm „†ˆ›Ÿì†Òöm ¬†ˆ›§†ì†ì†Òöò†ƒùð†ƒùm L†ˆ›m hì†ìòòòò†Òöò†ƒùm @†ˆ›m $ì†ì†ì†ì†Òöò†ƒùð†ƒùml†ˆ›ŸìØöm”†ˆ›»ì†ìò†Òöð†ƒùm0†ˆ›mhì†ìòòòò†ì†Òöò†ƒùm\†ˆ›­ìò†Òöm¼†ˆ›Ÿì†ÒömȆˆ›m¬ì†ì†ì†ì†ÒöÞ“õþþømÀ†ˆ›­ìò†Òöð†ƒùʆˆŸßömH†ˆ›m,ì†ìò†ì†Òöð†ƒùmT†ˆ›»ì†ì†ì†Òölÿ`†ˆ›mDìòò†ì†Òöˆ›‘ÒöʆˆþölýÔ†ˆ›Ÿì†óßöò†ƒùlü†ƒŽúþŸlý°ƒùꆄ„þöꆈþölü„†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùlû|†ˆ›‘Òöò†ƒùð†ƒùò†ƒùð†ƒùlú<†ˆ›»ì†ì†ì†Òölùd†ˆ›»ì†ì†ì†Òö؆ˆþö脌ƒóƒùløL†ˆ›Ÿì†Òöl÷t†ˆ›»ì†ì†ì†ÒölöÔ†ˆ›Ÿì†Òööƒù膃ˆñlö†ˆ›‘óßöð†ƒùð†ƒùò†ƒùʆˆþöð†ƒùð†ƒù脌ƒóƒù؆ˆþölóȆˆ›»ì†ì†ì†Òölòð†ˆ›»ì†ìò†ÒölñĆˆ›lòàì†ìò†ìò†ì†Òölñ$†ˆ›Ÿì†Òölð„†ˆ›Ÿì†Òöö†ül︆ˆ›­ìò†Òöð†ƒùöƒùlîĆˆ›­ìò†Òöð†ƒùð†ƒùlí´†ˆ›»ì†ì†ì†Òöl톈›Ÿì†Òöò†ƒùlì$†ˆ›§†ì†ì†Òö脌ƒóƒùò†ƒùlë$†ˆ›­ìò†Òölêtˆ›™ò†óßöl鬆ˆ›™†ì†Òöð†ƒùð†ƒùò†ƒùð†ƒùò†ƒùö†üð†ƒùð†ƒùlè$†ˆ›­ì†ì†Òölç †ˆ›‘Òöøƒùö†üò†ƒùlæÀ†ˆ›Ÿì†Òöð†ƒùlæ †ˆ›‘ÒölåH†ˆ›»ìò†ìØöð†ƒùð†ƒùlãȆˆ›låì†ì†ìòò†ì†ìØöð†ƒùlã †ˆ›Ÿì†Òö膃ˆñð†ƒùð†ƒùö†üláø†ˆ›Ÿì†Òölát†ˆ›‘Òööƒùð†ƒùlàd†ˆ›»ìòò†Òö膃ˆñð†ƒùlߘ†ˆ›‘Òöð†ƒùð†ƒùlÞ܆ˆ›‘Òöò†ƒùò†ƒùl݆ƒúþŸlÞ ƒùꆄ„þöꆈþölÝt†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùlÜ0†ˆ›™ò†ÒölÛ¬†ˆ›‘Òöð†ƒùöƒùlÚð†ˆ›‘Òöð†ƒùʆˆŸßöð†ƒùlÙ$†ˆ›lÚ@ì†ì†ì†ìòò†Òöð†ƒùlØ0†ˆ›»ì†ì†ì†Òöl׆ˆ›Ÿì†ÒölÖÔ†ˆ›­ìò†ÒölÖ†ˆ›­ì†ì†Òöö†üøƒùlÔ¨†ˆ›lÕàì†ìò†ìò†ìòØöð†ƒùò†ƒùlÓ,†ˆ›lÔdì†ì†ì†ì†ìò†ìùßöð†ƒùð†ƒùö†üˆ›‘Òöò†ƒùlѨ†ˆ›Ÿì†Òölцˆ›‹ØölЄ†ˆ›‘Òöð†ƒùlϬ†ˆ›™†ì†Òöö†ülÎĆˆ›»ì†ì†ì†ÒölÍ솈›»ì†ì†ì†Òöö†ülÌ膈›lÍÌì†ì†ì†ì†Òöö†ül̆ˆ›»ì†ì†ì†ÒölË(†ˆ›»ì†ì†ì†ÒöøƒùlÉ䆈›lÊØòòòò†ì†ÒölÉ(†ˆ›™ò†Òöò†ƒùlÈ8†ˆ›»ì†ì†ì†óßöö†ülÇl†ˆ›­ì†ìØöò†ƒù؆ˆþölÆ0†ˆ›»ì†ì†ì†Òö؆ˆþölÄð†ˆ›lÅÔì†ìò†ì†ÒöÞ†öð†ƒùð†ƒùlÔ†ˆ›§ò†ì†Òölƈ›‘óßöð†ƒùð†ƒùlÂT†ˆ›‘Òöò†ƒùlÁœ†ˆ›‹†ÒölÀü†ˆ›Ÿì†Òöö†ülÀ†ˆ›»ì†ì†ì†Òööüð†ƒùò†ƒùð†ƒùl¾˜†ˆ›l¿˜ì†ìò†ì†ìØöö†ü؆ˆþöl½d†ˆ›»ìò†ì†ÒöÔˆþöð†üò†ƒùl»l†ˆ›l¼˜òòòòòòò†Òöl¹Ð†ˆ›l»\ìòòòò†ìòòòò†Òöð†ƒùl¸ø†ˆ›™†ì†Òöð†ƒùl·è†ˆ›l¸Ìì†ì†ì†ìØöò†ƒùl·0†ˆ›Ÿì†óßöl¶X†ˆ›»ì†ì†ì†Òölµœ†ˆ›™†ì†Òööƒùl´Ä†ˆ›™†ì†Òöð†ƒùð†ƒùò†ƒùð†ƒù膃ˆñð†ƒùò†ƒùð†ƒùð†ƒùl³†ˆ›­ì†ì†Òöö†ü؆ˆþöò†ƒùl±ð†ˆ›Ÿì†ÒöЈþöl°è†ˆ›Ÿì†Òöò†ƒùð†ƒùl¯ø†ˆ›™ò†Òöl¯t†ˆ›‘Òöò†ƒùÔ†ƒˆ‹†àl®0†ˆ›»ìò†ìØöð†ƒùl­†ˆ›‘Òöl¬¸†ˆ›»ì†ì†ì†Òöl¬†ˆ›Ÿì†Òöò†ƒùl«`†ˆ›ŸìØölªÜ†ˆ›‘Òööƒùlª<†ˆ›‘óßöl©d†ˆ›§ò†ìØöl§˜†ƒúþŸl©Xƒùꆄ‚öꆄ„þöꆈþöl¨†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöl¦¬†ˆ›ŸìØöð†ƒùl¥Ô†ˆ›™ò†Òöøƒùl¥†ˆ›­ìò†Òöð†ƒùð†ƒùð†ƒùl£œ†ˆ›l¤œì†ì†ìòò†Òöö†üð†ƒùl¢ˆ†ˆ›l£`ìò†ä†‹Çöl¡°†ˆ›»ì†ì†ì†Òöò†ƒùl À†ˆ›»ì†ì†ì†Òöl ˆ›­ìò†ÒölŸ†ˆ›lŸôì†ìò†ì†Òöð†ƒùð†ƒùð†ƒùò†ƒùl膈›­ì†ì†ÒölH†ˆ›Ÿì†Òöøƒù膃ˆñʆˆŸßölœ†ˆ›‘Òölšd†ƒˆúþŸlœ ƒùꆄ„þöꆈþölšà†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùð†ƒùò†ƒùl™$†ˆ›»ì†ì†ì†Òöl˜L†ˆ›»ì†ì†ì†Òöö†üˆ›‘ÒöÞ“õþþøò†ƒùð†ƒùl–´†ˆ›‘óßöl–†ˆ›Ÿì†Òöʆˆþöð†ƒùð†ƒùl”€†ˆ›l•dì†ì†ì†ì†Òöò†ƒùl“Ȇˆ›ŸìØöl’ð†ˆ›»ì†ìò†Òöl’4†ˆ›™†ìùßöð†ƒùò†ƒùð†ƒùö†ül‘4†ˆ›ŸìØöl”†ˆ›Ÿì†Òöltˆ›l„ìòò†ìòò†óßöð†ƒùð†ƒù膃ˆñð†ƒù膃ˆñð†ƒùl䆈›­ì†ì†Òöö†ülŒÄ†ˆ›lÄìòòò†ì†ÒölŒ@†ˆ›‘Òöl‹L†ˆ›lŒ0ìò†ì†ìØöl‰¼ˆ›l‹<ìòòòòòòòòò†Òölˆ†ˆ›l‰ ì†ì†ì†ìòò†ì†ì†ì†ì†Òöð†ƒùò†ƒùl†ì†ˆ›µ†ì†ì†ì†Òöl†0†ˆ›­ìò†Òöl…<†ˆ›µò†ìòØöò†ƒùò†ƒùò†ƒùö†üö†ü؆ˆþöò†ƒùlƒ˜†ˆ›»ì†ì†ì†Òöl‚À†ˆ›»ì†ì†ì†Òölx†ˆ›l‚°ìò†ì†ìò†ìò†ÒöÞ“õþþøö†üö†ül€†ˆ›l€üìò†ìò†Òö膃ˆñð†üò†ƒùö†üð†ƒùl~Àˆ›»ìòò†Òöl}4†ˆ›l~|òòòòòò†ì†ì†Òöl|x†ˆ›™†ì†Òöð†ƒùl{¼†ˆ›Ÿì†Òöð†ül{†ˆ›Ÿì†Òölz`†ˆ›Ÿì†Òöö†üð†üly”†ˆ›Ÿì†Òölx䈛™†ì†ÒölxT†ˆ›‘Òöð†ƒùð†ƒùò†ƒùð†ülw†ˆ›»ì†ì†ì†Òölv8†ˆ›»ì†ì†ì†Òölu`†ˆ›»ì†ì†ì†Òöð†ƒùöƒùð†ƒùltP†ˆ›­ì†ì†Òöö†üò†ƒùð†ƒù؆ˆþölr膈›»ì†ì†ì†Òölr†ˆ›§†ì†ì†Òölq8†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþölo䆈›™ò†Òöøƒùð†ƒùð†ƒù膃ˆñln¬†ˆ›™†ì†Òöð†ƒùð†ƒùlmœ†ˆ›»ì†ìò†Òöllü†ˆ›Ÿì†Òöð†ƒùˆ›‘óßölk؆ˆ›ãöò†ƒùlk†ˆ›­ì†ìØöò†ƒùð†ƒùli¤†ˆ›ljÀì†ì†ìòòòØöli †ˆ›‘Òölh€†ˆ›Ÿì†Òö؆ˆþö؆ˆþölgH†ˆ›ŸìØölf¨†ˆ›Ÿì†óßölf$†ˆ›‘óßööƒùleh†ˆ›ŸìØöò†ƒùld̆ˆ›‘Òöö†ülc䆈›»ì†ì†ì†Òölc`†ˆ›‘Òölb̈›Ÿì†óßöla膈›»ì†ì†ì†Òöl`؆ˆ›laØì†ì†ì†ì†ì†Òöö†üö†ül_à†ˆ›»ì†ì†ì†Òöö†üö†ül_ †ˆ›ŸìØöl^T†ˆ›­‹áò†Òöl]Àˆ›‹†Òöð†ƒùð†ƒùl[T†ƒˆúþŸl]`„„þöꆄ‚öꆄ‚öꆄ„þöà†ˆþöl[Іˆ¦õ·ä†‹Ø’ÍþøôüÒlZ´†ˆ›Ÿì†ÒölZ†ˆ›Ÿì†Òöò†ƒùlY@†ˆ›­ìò†ÒölX †ˆ›Ÿì†ÒölWȆˆ›»ì†ì†ì†ÒölW(†ˆ›ŸìØööüò†ƒùò†ƒùlV †ˆ›­ì†ì†ÒölUœ†ˆ›‘ÒölT¨†ˆ›µòò†ì†Òöò†ƒùlSÔ†ˆ›™†ì†Òöð†ƒùlS4†ˆ›ãölRx†ˆ›­ìò†ÒölQ †ˆ›»ì†ì†ì†Òöö†ü؆ˆþölPl†ˆ›»ì†ì†ì†ÒölO膈›‘ÒölO8ˆ›™ò†óßöð†ƒù膃ˆñò†ƒùlN,†ˆ›‹†ÒölM¨†ˆ›‘Òöð†ƒùlL˜†ˆ›µò†ì†ì†Òöð†ƒùð†ƒùò†ƒùlKp†ˆ›§†ìòØöð†ƒùò†ƒùð†ƒùlJ€†ˆ›Ÿì†ÒölIà†ˆ›Ÿì†ÒölI@†ˆ›Ÿì†ÒölH †ˆ›Ÿì†Òöö†ülGð†ˆ›Ÿì†Òöð†ƒùñlF´†ˆ›µòò†ìØölF†ˆ›Ÿì†óßölEt†ˆ›Ÿì†ÒölDÔ†ˆ›‹†Òöö†üò†ƒùlD †ˆ›Ÿì†ÒöÞ“õþþøð†ƒù膃ˆñð†ƒùò†ƒùò†ƒùlBŒ†ˆ›Ÿì†Òöð†ƒùøƒùlA¸†ˆ›Ÿì†Òöð†ƒùl@à†ˆ›­ì†ì†Òöl?dƒŽúþŸl@Ôƒùↈ‰õöl?À†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùl>„†ˆ›­ì†ìØölxƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöl<Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùl;€†ˆ›™†ì†Òöò†ƒùl:¬†ˆ›­ì†ì†Òöl:(†ˆ›‘Òöö†üð†ƒùð†ƒùöƒùl9@†ˆ›‘óßöò†ƒùl8¤†ˆ›ãöl7膈›™ò†Òöl7,†ˆ›™ò†Òöl6¨†ˆ›‘Òöl5Іˆ›»ì†ì†ì†Òööƒùl4ø†ˆ›­ì†ì†Òöl4<†ˆ›™†ì†Òöð†ƒùð†ƒùð†ƒùl3d†ˆ›‘Òöl2à†ˆ›‘Òöl2\†ˆ›‘Òöl1¼†ˆ›‹†Òöl1†ˆ›­ì†ì†Òöð†ƒùöƒùð†ƒùʆˆþöl/l†ˆ›»ìòòØöð†ƒùð†ƒùð†ƒùl.\†ˆ›­ì†ì†Òöl- †ˆ›­ì†ì†Òöl,Ȇˆ›»ì†ì†ì†Òöˆ›‘Òöl+P†ˆ›l,4ìò†ìò†Òöl*°†ˆ›‹†Òöl)¼†ˆ›µòòò†Òöl)8†ˆ›‘Òöl(´†ˆ›ãöð†ƒùl'܆ˆ›™†ì†óßöð†ƒùl&膈›»ì†ì†ì†Òöl%¼†ˆ›l&°†ì†ì†ì†ì†ì†Òöð†ƒùð†ƒùöül$Ȇˆ›‹†Òöð†ƒùl#,†ˆ›l$tòòòòòò†ì†ì†ÒöʆˆŸßöl"†ˆ›™†ì†Òöð†ƒùò†ƒùð†ƒùö†üð†ƒù膃ˆñð†ƒùl`“¼l Š˜þ˜l ¼ˆ’l X‚ˆ’Âü–ül˜løl|ölp›‹Øöð†üò†ƒùð†ƒùl؆ˆ›lôìòò†ìòò†óßöð†ƒùò†ƒùl †ˆ›ãöð†ƒùð†ƒùl,†ˆ›­ì†ì†Òöð†ƒùlp†ˆ›Ÿì†Òölàˆ›l`ì†ì†ì†ìòò†ì†ì†ì†ì†Òöð†ƒùð†ƒùl¨†ˆ›µ†ì†ì†ì†Òöl솈›­ìò†Òölø†ˆ›µòòò†Òöð†ƒùð†ƒùò†ƒùò†ƒùð†ƒùð†ƒùlÔ†ˆ›‘Òö̆ƒˆˆ‘ØØ†ˆþöl †ˆ›‘ÒölȆˆ›»ì†ì†ì†Òöð†ƒùl(†ˆ›‘Òöð†ƒùlĆˆ›lüìò†ì†ìò†ìò†Òööƒùð†ƒùò†ƒùò†ƒùð†ƒùl¼†ˆ›‘Òöl†ˆ›‹†óßöl`†ˆ›­ì†ì†Òöl l†ˆ›lPì†ì†ìò†Òöl ”†ˆ›»ì†ìò†Òöl tˆ›l „ìòò†ìò†ì†Òöð†ƒùð†ƒùð†ƒùl؆ƒúþŸl ì„„þö䆄„þö䆄„þöꆄ‚öà†ˆþöl D†ˆ¦õ·ä†‹Ø’ÍþøôüÚl†ˆ›»ìòò†óßöl(†ˆ›§†ì†ì†ÒölP†ˆ›»ì†ì†ì†Òö脌ƒóƒùl„†ˆ›‹†Òö؆ˆþö؆ˆþö؆ˆþö؆ˆþöl˜†ˆ›­ìò†Òööƒùò†ƒù膃ˆñl´†ˆ›‘ÒölÀ†ˆ›µò†ì†ì†Òöò†ƒùl$†ˆ›ãöò†ƒùð†ƒùl†ˆ›»ì†ì†ì†Òö؆ˆþöÞ“õþþøð†ƒùð†ƒùkþ¨†ˆ›Ÿì†Òöký†ƒúþŸkþœƒùꆄ„þöꆆökýp†ˆ¦õ·ä†‹Ø’ÍþøôüÚküd†ˆ›Ÿì†óßökûĆˆ›‹†Òöð†ƒùkú´†ˆ›µ†ìò†ì†óßöò†ƒù膃ˆñð†ƒùò†ƒù؆ˆþökù†ˆ›»ì†ì†ì†Òökø@†ˆ›»ì†ì†ì†Òö؆ˆþöð†ƒùЈþökö´†ˆ›™†ì†Òökö0†ˆ›‘óßökõX†ˆ›§òò†Òökô¸†ˆ›‹†Òöð†ƒùð†ƒùò†ƒùð†ƒùk󆈛™ò†Òökò¸†ˆ›»ì†ì†ì†Òöð†ƒùüüò†ƒùð†ƒùò†ƒùkñL†ˆ›kò0ì†ìò†ì†Òöò†ƒùkð\†ˆ›§†ìò†Òökïh†ˆ›µòò†ì†Òöò†ƒùò†ƒùð†ƒùkî`†ˆ›­ìò†Òök툆ˆ›»ìò†ì†Òökì°†ˆ›»ì†ì†ì†Òöò†ƒùñð†ƒùð†ƒùð†ƒùð†ƒùkëL†ˆ›Ÿ‹áØöð†ƒùö†üò†ƒù؆“õþþøké䆈›»ì†ì†ì†ÒökéD†ˆ›Ÿì†Òök褆ˆ›Ÿì†Òöð†ƒùøƒùk瘆ˆ›»ì†ì†ì†ÒökæÜ†ˆ›™†ì†Òökå̆ˆ›kæÌì†ì†ì†ì†ì†Òöð†ƒùö†ükä䆈›­ì†ì†Òöð†ƒùð†ƒùöƒù膃ˆñò†ƒùkãX†ˆ›kä<ì†ìò†ì†Òök⸆ˆ›Ÿì†Òö膃ˆñð†ƒùð†ƒùö†ü؆ˆþöò†ƒùöƒùð†ƒùkà솈›™†ìØökà0†ˆ›™ò†ÒökÞ†ƒŽúþŸkà$ƒùꆄ„þöꆈþökÞø†ˆ¦õ·ä†‹Ø’ÍþøôüÜkݸ†ˆ›»ì†ì†ì†ÒökÜà†ˆ›»ì†ì†ì†Òööƒùð†ƒùkÛ솈›­ì†ì†ÒökÛ0†ˆ›­ìò†Òöò†ƒùkÚ@†ˆ›»ì†ì†ì†Òöð†ƒùkÙ„†ˆ›‹†ÒökØä†ˆ›Ÿì†Òöö†ükØ4†ˆ›Ÿì†Òööƒùk×x†ˆ›‹†ÒökÖ¼†ˆ›™òùßökÖ†ˆ›‹†ÒökÕ(†ˆ›µ†ìò†ì†ÒökÔl†ˆ›™†ìØöò†ƒùkÓ˜†ˆ›™†ì†ÒökÒ܆ˆ›™ò†Òöüüð†ƒùkÒ,†ˆ›‘óßöð†ƒù膃ˆñð†ƒùkÐð†ˆ›»ì†ì†ì†Òöö†ükІˆ›§†ì†ì†Òööƒùò†ƒùkÏP†ˆ›‘ÒökΔ†ˆ›™ò†ÒökÍØ†ˆ›™ò†óßöð†ƒùkÍ8†ˆ›‘óßöð†ükÌ|†ˆ›Ÿì†Òöð†ƒùkË܆ˆ›‘óßöò†ƒùð†ƒùð†ƒùð†ƒùkʘ†ˆ›»ì†ì†ì†Òöö†üð†ƒùöükÉ\†ˆ›µòò†ì†Òöð†ƒùð†ƒùkÈh†ˆ›™†ì†ÒökÇt†ˆ›µ†ìò†ìØöö†ükÆŒ†ˆ›»ì†ì†ì†ÒökÄð†ˆ›kÆ|ì†ì†ì†ì†ì†ì†ìòòò†ÒökÃü†ˆ›kÄàìò†ì†ìØöˆ›ãök¼†ˆ›­ì†ì†Òöð†ƒùkÁ䆈›™ò†óßöð†ƒùð†ƒùð†ƒù脌ƒóƒùkÀà†ˆ›‘Òöð†ƒùö†ük¿Ü†ˆ›»ì†ì†ì†Òöð†ƒùöƒùk¾”†ˆ›k¿l†ìòò†ì†Òöʆˆþöð†ƒù膃ˆñð†ƒùk¼Ø†ƒˆˆk½¸ì†ìò†ì†ì†Øð†ƒùð†ƒùk»È†ˆ›»ì†ì†ì†Òökº€†ˆ›k»ò†ì†ì†ì†ì†ì†Òöüüð†ƒùð†ƒùð†ƒùk¹˜†ˆ›ãök¸Ä†ƒˆˆk¹ˆì†ìò†ì†Øk¸@†ˆ›‘óßöð†ƒùö†üˆ›‘Òök¶ð†ˆ›Ÿì†Òök¶P†ˆ›‹†Òöò†ƒùð†ƒùð†ƒùkµD†ˆ›­ì†ì†Òöö†üð†ƒùð†ƒùð†ƒùk³ì†ˆ›µ†ìò†ì†Òök³L†ˆ›Ÿì†Òö؆ˆþöð†ƒùk²`†ˆ›ãööƒùð†ƒùð†ƒùk±4†ˆ›§†ìò†Òöð†ƒùð†ƒùk¯ì†ˆ›k°ììò†ìò†ì†Òöð†ƒùk®ø†ˆ›»ì†ì†ì†Òök® †ˆ›»ì†ì†ì†Òöö†üö†üñk­4†ˆ›‹†Òök¬@†ˆ›k­$ì†ìòò†Òöð†ƒùð†ƒù؆ˆþök«†ˆ›­ì†ì†ÒökªD†ˆ›­ì†ì†óßöö†ük©”†ˆ›Ÿì†Òök¨¼†ˆ›»ì†ì†ì†Òööƒùò†ƒùk§Ì†ˆ›­ìò†Òö؆ˆþök¦¨†ˆ›»ì†ì†ì†Òöøƒùk¥€†ˆ›k¦€ì†ì†ìò†ìØök¤T†ˆ›k¥pì†ì†ì†ì†ì†ì†Òök£|†ˆ›»ìòò†Òöð†ƒù膃ˆñð†ƒùð†ƒùð†ƒùö†ü脌ƒóƒùk¡Ì†ˆ›»ì†ì†ì†Òöò†ƒùk¡†ˆ›Ÿì†Òök †ˆ›ãöò†ƒùöƒùò†ƒùò†ƒùʆˆþökŸ$†ˆ›‹†óßökžL†ˆ›§òò†Òöð†ƒùò†ƒùò†ƒùk(†ˆ›§ò†ì†Òökœl†ˆ›­ìò†Òök›Ì†ˆ›Ÿì†Òök›ˆ›»ìòò†Òöð†ƒùk™ä†ˆ›µòò†ì†Òöð†ƒùð†ƒùk˜ð†ˆ›™†ì†Òök—ü†ˆ›µ†ìò†ìØök–Іˆ›k—ìì†ì†ì†ìòò†Òök–0†ˆ›Ÿì†Òök•†ˆ›Ÿì†Òök“ô†ˆ›k•€ì†ì†ì†ì†ì†ì†ìòòò†Òöö†üöƒùò†ƒù膃ˆñʆˆþök’˜†ˆ›‘Òök‘܆ˆ›­ì†ì†Òöð†ƒùk‘ †ˆ›ŸìØö膃ˆñð†ƒù脌ƒóƒù؆ˆþöð†ƒùö†ük\†ˆ›§òò†Òö膃ˆñøƒùò†ƒù膃ˆñð†ƒùö†ü脌ƒóƒùò†ƒùkĆˆ›Ÿì†Òök@†ˆ›‘Òöð†üüüò†ƒùk‹0†ƒúþŸkŒðƒùꆄ‚öꆄ‚öꆈþök‹œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚkŠt†ˆ›™ò†óßöð†ƒùk‰Ô†ˆ›‘óßöð†ük‰†ˆ›Ÿì†Òökˆx†ˆ›Ÿì†Òöð†ƒù؆ˆþök‡8†ˆ›»ì†ì†ì†ÒöÞ“õþþøk†L†ˆ›‹†Òö膃ˆñk…€†ˆ›‹†Òök„Ćˆ›­ì†ì†Òök„$†ˆ›‹Øöð†ƒù膃ˆñð†ƒùò†ƒù脌ƒóƒùk‚¤†ˆ›»ì†ìò†Òök‚ †ˆ›‘Òökpˆ›™ò†Òök€Ä†ˆ›‹†Òök€$†ˆ›‹†Òök0†ˆ›µ†ìò†ì†Òöð†ƒùk~X†ˆ›™†ìØöʆˆþök}P†ˆ›Ÿì†Òöö†ü脌ƒóƒùk|<†ˆ›»ì†ì†ì†Òök{d†ˆ›»ì†ì†ì†ÒökzĆˆ›Ÿì†Òö脌ƒóƒùö†üð†ƒùky°†ˆ›™ò†Òööƒùkx¼†ˆ›§†ì†ì†Òökx†ˆ›™†ì†Òökw`†ˆ›Ÿì†Òöð†ƒùð†ƒù脌ƒóƒùkv$†ˆ›»ì†ì†ì†Òö؆ˆþöku†ˆ›­ì†ì†Òöktlˆ›™†ìØöks܆ˆ›‘Òöks †ˆ›™ò†ÒökrL†ƒˆˆµòò†ìÞ膃ˆñkqH†ˆ›»ì†ì†ì†Òöð†ƒùkpŒ†ˆ›Ÿì†Òökp†ˆ›‘Òö؆ˆþöknt†ˆ›ko¬ì†ì†ì†ìòò†ì†Òökmœ†ˆ›»ì†ì†ì†Òöøƒùö†üklH†ˆ›kmdì†ì†ì†ì†ì†ì†Òökk †ƒˆˆkl†ì†ì†ì†ì†ì†ì†ØkjH†ˆ›»ìòò†Òö膃ˆñki|†ˆ›Ÿì†Òöð†ƒùð†ƒùö†ü脌ƒóƒùð†ƒù؆ˆþö脌ƒóƒùkgH†ˆ›khdìò†ìò†ì†ì†Òöüüð†ƒùð†ƒùò†ƒùkf†ˆ›§òò†Òöò†ƒùò†ƒùkdІˆ›keÐì†ìòòò†óßökd†ˆ›­ì†ì†Òöö†üò†ƒùkcL†ˆ›Ÿì†Òöð†ƒùˆ›‘óßöð†ƒùð†ƒùkað†ˆ›‘ÒökaP†ˆ›‹†Òök`°†ˆ›Ÿì†Òöð†ƒùð†ƒùk^؆ƒŽúþŸk`lƒùꆄ‚öꆈþök_@†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù؆ˆþöð†ƒùøƒùð†ƒùð†ƒùk]€†ˆ›‘Òök\à†ˆ›‹Øök\$†ˆ›­ì†ìØökZ †ƒŽúþŸk\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþökZt†ˆ¦õ·ä†‹Ø’ÍþøôüÜkY4†ˆ›»ìòò†ÒökX”†ˆ›Ÿì†Òöö†üò†ƒùkW”†ˆ›»ì†ì†ì†ÒökV¼†ˆ›»ì†ì†ì†Òöð†ƒùöƒùð†ƒùkU䆈›‘ÒökUD†ˆ›Ÿì†ÒökT¤†ˆ›‹†Òöð†ƒùð†ƒùð†ƒùö†ü؆ˆþöö†üøƒù脌ƒóƒùkRȆˆ›»ì†ì†ì†Òö膃ˆñð†ƒùð†ƒùð†ƒùkQĆˆ›‘ÒökP솈›§†ìò†ÒökO܆ˆ›kPÜìò†ìò†ì†ÒökO†ˆ›»ì†ì†ì†ÒökNH†ˆ›­ì†ì†Òö؆ˆþökM$†ˆ›»ì†ì†ì†Òöð†ƒùkL†ˆ›µ†ì†ìò†ÒökKˆ›kK܆ìòò†ì†Òöð†ƒùò†ƒùð†ƒùð†ƒù؆ˆþökI¬†ˆ›‹†ÒökHÔ†ˆ›»ì†ì†ì†ÒökH†ˆ›­ì†ì†ÒökGx†ˆ›Ÿì†ÒökF †ˆ›»ì†ì†ì†ÒökEðˆ›­ì†ì†Òöð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùkD¸†ˆ›Ÿì†ÒökCü†ˆ›­ì†ìØökC\†ˆ›ŸìØökBˆ›»ì†ì†ìØöð†ƒù膃ˆñkAœ†ˆ›‹ØökA†ˆ›ãöð†ƒùk@@†ˆ›­ìòØök?„†ˆ›­ì†ì†óßöð†ƒùk>†ˆ›»ì†ì†ì†Òöò†ƒùk= †ˆ›»ì†ì†ì†Òök<Ȇˆ›»ì†ì†ì†Òök;ð†ˆ›»ì†ì†ì†Òök;ˆ›k;àì†ìò†ì†Òök:\†ˆ›‹†Òö؆ˆþöð†ƒùð†ƒùk9†ˆ›»ìò†ì†Òök8(†ˆ›»ì†ì†ì†Òök7P†ˆ›»ì†ì†ì†Òöö†ük60†ˆ›k70ìò†ìòò†Òöüü膃ˆñk5T†ˆ›Ÿì†Òök4|†ˆ›§†ì†ì†Òök3܆ˆ›‹†Òök3†ˆ›»ì†ì†ì†Òöð†ƒùk2H†ˆ›Ÿì†Òök1Ćˆ›‘Òöö†ük0ø†ˆ›­ì†ì†Òöøƒù膃ˆñò†ƒùk/à†ˆ›™†ì†Òöö†ü؆ˆþök.†ˆ›k/tìò†ìò†Òök-¸†ˆ›»ì†ì†ì†Òök,ü†ˆ›­ìòØök,\†ˆ›Ÿì†Òök+0†ˆ›k,Lì†ì†ìòòò†Òöö†ü؆ˆþöøƒùð†ƒùk)¬†ˆ›µòòò†Òöò†ƒùk(؆ˆ›­ì†ìØöð†ƒù脌ƒóƒùk'¸†ˆ›»ì†ì†ì†Òöö†ük&܆ˆ›­‹áò†Òök%°†ˆ›k&Ìì†ì†ì†ìò†ì†Òök%ˆ›™†ìØö؆“õþþøØ†“õþþøò†ƒùk#À†ˆ›‘Òök# †ˆ›Ÿì†óßöò†ƒùk"h†ˆ›‹†Òö膃ˆñk!H†ˆ›µ†ì†ì†ì†Òök Ćˆ›‘Òök †ˆ›™†ì†Òöð†ükà†ƒˆˆkÜì†ì†ìòòò†Øð†ƒùð†ƒùk솈›­ì†ì†óßök†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþök\ˆ›klìòòòòò†Òöð†ƒùk”†ˆ›ŸìØök†ˆ›‘Òöö†ük(†ˆ›§†ìò†Òöøƒùð†ƒùkp†ˆ›ãö脌ƒóƒùk¤†ˆ›Ÿì†Òök̆ˆ›»ì†ì†ì†Òökô†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöˆ›‘Òöð†ƒùò†ƒùk°†ˆ›µòòò†Òök†ˆ›ŸìØök<†ƒˆˆkì†ìò†ì†Øk†ˆ›k,ì†ì†ìò†ìòØöö†ük`†ˆ›‹†Òöö†üöƒùk”†ˆ›‹†Òök †ˆ›k„ìò†ìòØöò†ƒùð†ƒùð†ƒùð†ƒù؆“õþþøk d†ˆ›‘Òö脌ƒóƒùö†üö†ük @†ˆ›»ì†ìò†Òöö†üüük L†ƒˆˆµ†ì†ì†ì†Øk Ȇˆ›‘Òök †ˆ›™†ìØök l†ˆ›Ÿì†Òöö†ükh†ˆ›k Lì†ì†ì†ì†Òöñkd†ˆ›»ìòò†óßökȆˆ›k,òòòò†ìòòòò†Òöð†ƒùð†ƒùò†ƒùk¼†ˆ›­ì†ì†Òök†ˆ›Ÿì†ÒökD†ˆ›»ì†ì†ì†Òök†ˆ›k4ì†ì†ìòò†ì†Òök”†ˆ›‘Òök¼†ˆ›»ì†ì†ì†Òöøƒùjÿ膈›­ìò†Òöjþô†ˆ›jÿØìò†ìò†Òöð†ƒùò†ƒù膃ˆñð†ƒùð†ƒùò†ƒùjýˆ†ˆ›­ì†ì†óßöð†ƒùö†üøƒùð†ƒùð†üjüˆ†ˆ›‘Òöjü†ˆ›ãöjúd†ƒŽúþŸjûøƒùꆄ‚öꆈþöjú̆ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùò†ƒùjù°†ˆ›‘Òöò†ƒùöƒùjøø†ˆ›‘Òö膃ˆñò†ƒùö†üj÷̆ˆ›»ì†ì†ì†Òöð†ƒùjöô†ˆ›­ì†ì†Òöö†üöƒùð†ƒùjõ¸†ˆ›jöœì†ì†ì†ì†Òöö†üð†ƒùjôІˆ›­ì†ì†Òöö†üò†ƒù脌ƒóƒùjó܆ˆ›Ÿì†Òöò†ƒùj󆈛™ò†Òöjòtˆ›Ÿì†Òöjï솓¼jñ8Œjò ˆ’jñ¨‚ˆ’jñTü–ü—Éjðjñöjð›‹Øöjé°†“¼jë¸jï ’jë°øüøüøüøüøüøüøüjêTjêìööjéÌ›‹Øöð†ƒùð†ƒùð†ƒùò†ƒùj膈›jé4ìòòòòò†Òöð†ƒùjç\†ˆ›ŸìØöò†ƒùð†ƒùjæP†ˆ›§†ìò†Òöð†ƒùjå@†ˆ›µ†ì†ì†ì†Òöjã܆ˆ›jå0ì†ì†ì†ì†ìò†ìò†Òööƒù膃ˆñò†ƒùð†ƒùjâl†ˆ›jãPì†ì†ì†ì†Òöjá@†ˆ›jâ\ì†ìòòò†ì†Òö؆ˆþöjàT†ˆ›ŸìØöjß´†ˆ›ŸìØöjÞˆ†ˆ›jߤìòòòòò†Òöˆ›‘óßöjÝ,†ˆ›§†ì†ì†Òöð†ƒùò†ƒùjÜ<†ˆ›™†ì†ÒöjÛ€†ˆ›­ì†ì†ÒöjÚü†ˆ›ãöð†ƒùð†ƒùjÚ$†ˆ›Ÿì†Òöò†ƒùö†üjÙ\†ˆ›ŸìØöjؼ†ˆ›ŸìØöj؆ˆ›­ì†ì†Òöj×D†ˆ›™ò†Òöøƒùð†ƒùjÖp†ˆ›Ÿì†óßöjÕ솈›‘ÒöjÔø†ˆ›µ†ì†ì†ì†Òöð†ƒùjÔ †ˆ›™†ì†óßöjÓp†ˆ›§ä†‹Çöö†üò†ƒùjÒ8†ˆ›jÓ8ì†ì†ì†ìò†Òöö†üjÑl†ˆ›­ìò†Òöøƒùjд†ˆ›Ÿì†ÒöjІˆ›‹†Òö膃ˆñð†ƒùð†ƒùò†ƒùjÎø†ˆ›Ÿì†Òöð†ƒùö†ü膃ˆñð†ƒùö†üö†üjÍà†ˆ›‘Òöj͆ˆ›»ì†ì†ì†ÒöjÌ0†ˆ›§†ì†ì†Òö脌ƒóƒùjË,†ˆ›»ì†ì†ì†Òöö†üð†ƒùöƒùð†ƒùð†ƒùjÉð†ˆ›­ì†ì†Òöð†ƒù膃ˆñð†ƒùjȘ†ˆ›jÉ|ìò†ìò†ÒöjÇø†ˆ›Ÿì†Òöjdžˆ›jÇèì†ìòò†ÒöjÆd†ˆ›Ÿì†ÒöjÅЈ›‹Øöjņˆ›™†ìØöð†ƒùð†ƒù؆ˆþöö†üð†ƒùÞ“õþþøj½Ð†“¼j¿ØjÃÀ’j¿Ðøüøüøüøüøüøüøüj¾tj¿ ööj½ì›‹Øöð†ƒùð†ƒùð†ƒùj¼ø†ˆ›‘Òöð†ƒùj¼†ˆ›§ò†ì†Òöò†ƒùö†üj»X†ˆ›‘Òöjº€†ˆ›»ì†ì†ì†Òöj¹à†ˆ›Ÿì†Òöj¹@†ˆ›ŸìØöj¸ †ˆ›ŸìØöЈŸßö膃ˆñð†ƒùj·†ˆ›»ìòò†Òöj¶x†ˆ›Ÿì†ÒöjµØ†ˆ›Ÿì†Òö脌ƒóƒù؆ˆþöö†üj´x†ˆ›»ì†ì†ì†Òöj³ô†ˆ›‘Òöö†üö†üj³4†ˆ›ŸìØööƒùð†ƒùj²†ˆ›j²ìì†ì†ì†ì†Òöö†üð†ƒùö†üò†ƒùj°ø†ˆ›™†ì†Òöj° †ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöò†ƒùj®Ð†ˆ›ŸìØöj®0†ˆ›ŸìØöj¬°†ˆ›j® ìò†ìòòòòòò†Òöj¬ˆ›ŸìØöð†ƒùò†ƒùð†ƒùð†ƒùj« †ˆ›‘Òö膃ˆñjªT†ˆ›Ÿì†Òöò†ƒùð†ƒùð†ƒùj©d†ˆ›Ÿì†Òöj¨¨†ˆ›­ì†ì†Òö؆ˆþöj§¼†ˆ›ŸìØöj§†ˆ›ŸìØöñð†ƒùj¦4†ˆ›Ÿì†Òöð†ƒùð†ƒùò†ƒùð†ƒùj¤ð†ˆ›»ì†ì†ì†Òö؆ˆþöj¤†ˆ›‹†Òöö†üð†ƒùj£8†ˆ›Ÿì†Òöj¢˜†ˆ›ŸìØöj¡ø†ˆ›‹Øöò†ƒù쌃óƒùjŸ†ƒúþŸj¡¨ƒùↄ„‰õöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöↈ‰õöjŸl†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùjž†ƒˆˆµ†ì†ì†ì†Øjp†ˆ›Ÿì†Òö膃ˆñjœˆ†ˆ›™†ìØöð†ƒù脌ƒóƒù脌ƒóƒùj—솃ˆšøj›¨þŽþþj˜&j›”j˜"þŸj›„ƒùjšt†ˆ¦õ½†ì†ìò†Êþøj™Ä†ˆ¦õ§ì†ëßþøj˜h„j™ˆ¦õ§‹á†Êþj˜tˆ¦õ™‹j˜€þøôüÒj—L†ˆ›ŸìØöj–¬†ˆ›ŸìØöüüj•Ćˆ›»ìòò†óßöð†ƒùð†ƒùj’Ô†ƒŽúþŸj•€ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöj“<†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùj‘à†ˆ›­ì†ì†Òöð†ƒùj솈›»ì†ì†ì†Òöj†ˆ›»ì†ì†ì†ÒöjX†ˆ›­ì†ì†óßöjŽÔ†ˆ›‘Òöjü†ˆ›»ì†ì†ì†Òöj\†ˆ›ŸìØöð†ƒùìƒùjŒp†ˆ›ŸìØöð†ƒù؆ˆþöj‹0†ˆ›»ì†ì†ì†ÒöjŠd†ˆ›­‹á†ì†Òöüüð†ƒùò†ƒùj‰p†ˆ›§ÝŠÕöjˆÐ†ˆ›‹†Òöj‡ø†ˆ›»ìò†ìØöò†ƒùð†ƒùò†ƒù膃ˆñð†ƒù膃ˆñð†ƒùj†D†ˆ›»ì†ì†ì†Òö؆ˆþöj… †ˆ›»ì†ì†ì†Òöj„H†ˆ›»ì†ì†ì†Òö؆ˆþöò†ƒùjƒ(†ˆ›­ìò†Òöj‚ˆ†ˆ›‹†Òöj؈›™†ì†Òöj€Ø†ˆ›µòòò†Òöð†ƒùj€†ˆ›­ì†ì†Òöj|†ˆ›ãöj~¤†ˆ›»ìò†ìØöð†ƒùj~†ˆ›‘Òöö†üj}8†ˆ›­ìò†Òöð†ƒùЈþöò†ƒùò†ƒùð†ƒùò†ƒùð†ƒùò†ƒùj{D†ˆ›»ì†ì†ì†Òöö†üð†ƒùð†ƒùjz$†ˆ›»ì†ì†ì†Òöjyh†ˆ›­ìòØöò†ƒùjx†ˆ›jy@ìò†ì†ìò†ìò†ÒöjwL†ˆ›™†ì†Òöøƒùð†ƒùjvx†ˆ›Ÿì†Òöju †ˆ›»ì†ìò†Òöð†ƒùð†ƒùö†üö†ü膃ˆñjt`†ˆ›™†ì†Òöjsˆ†ˆ›»ìò†ì†Òöjr膈›Ÿì†Òöö†üö†ü؆ˆþöð†ƒùöƒùò†ƒùjqT†ˆ›»ì†ì†ìùßöò†ƒùò†ƒùjpL†ˆ›§†ì†ì†óßöð†ƒùjo†ˆ›‹†Òö؆ˆþöjn†ˆ›jo4ì†ì†ìòò†ì†Òöö†üjm†ˆ›µ†ì†ìò†Òöʆˆþööƒùjk†ˆ›jlXò†ìòòòò†ì†ì†Òöð†ƒùjjT†ˆ›Ÿì†Òöð†ƒùò†ƒùð†ƒùð†ƒùö†üjgø†ƒúþŸjĩùꆄ‚öꆄ‚öà†ˆþöjhd†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üjf¼†ˆ›jgØì†ì†ìò†ìò†Òöje䆈›»ì†ìò†Òöje(†ˆ›­ìò†Òöˆ›‘Òöð†ƒùjc°†ˆ›»ì†ì†ì†Òöjb؆ˆ›»ì†ì†ì†Òöð†ƒùja䆈›»ì†ì†ì†Òöð†ƒùja(†ˆ›‹Øöj_ü†ˆ›j`ð†ìò†ìò†ì†Òöøƒùj_D†ˆ›‹†Òöj^¤†ˆ›Ÿì†Òöj]膈›™†ì†Òöj]H†ˆ›Ÿì†óßö膃ˆñð†ƒù膃ˆñð†ƒùò†ƒù膃ˆñö†üj[¨†ˆ›­ìò†Òöj[$†ˆ›‘Òöò†ƒùöƒùjZP†ˆ›Ÿì†ÒöjY°†ˆ›‹†Òöö†ü؆ˆþöö†üjXP†ˆ›µ†ìò†ìØöøƒùò†ƒùjWd†ˆ›­ì†ì†Òöð†ƒùjV¨†ˆ›‹†Òöð†ƒùjU˜†ˆ›jV|ì†ì†ìò†Òöò†ƒùð†ƒùjTŒ†ˆ›»ì†ì†ì†Òöö†üö†üЈþöjQ؆ƒˆúþŸjSøƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆöjRT†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùjQ †ˆ›Ÿì†óßöð†ƒùjP,†ˆ›§†ìòØöð†ƒùð†ƒù؆ˆþöjO†ˆ›Ÿì†ÒöjN†ˆ›jNøì†ì†ìò†ÒöjM<†ˆ›»ì†ì†ì†ÒöjLH†ˆ›µò†ìò†Òöö†üjK˜†ˆ›ŸìØöjJ„“ ½üjJ”þö؆“õþþøð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùjI†ˆ›‹Øöð†ƒù膃ˆñjH†ˆ›­ì†ì†óßöjG(†ˆ›»ì†ì†ì†ÒöjFP†ˆ›»ì†ì†ì†ÒöjE°†ˆ›ŸìØöjE†ˆ›‘‹Çöð†ƒùð†ƒùjC€†ˆ›jD¬òò†ìò†ìò†ì†Òöüüð†ƒùjB`†ˆ›µ†ì†ì†ì†óßöjA†ˆ›jBPì†ì†ìò†ì†ì†ì†Òöj@$†ˆ›jAìòòòØöð†ƒùj?0†ˆ›»ì†ì†ì†Òöj>¬†ˆ›‘Òöj9†ˆ›j>œìò†j9€†‹šøj=ìþŽþþj9ºj=Øj9¶þŸj=ȃùj<Ô†ˆ¦õj=¬ìò†ì†Êþøj<†ˆ¦õ¡†ì†Êþøj;X†ˆ¦õ§ì†ëßþøj9ü„j:¤ˆ¦õ§‹á†Êþj:ˆ¦õ™‹j:þøôüj90öЈþöð†ƒùð†ƒùð†ƒùò†ƒùj7P†ˆ›µ†ìò†ì†Òöò†ƒùj6D†ˆ›µ†ì†ìòØöj5l†ˆ›§ò†ì†Òöð†ƒùò†ƒùð†ƒù؆ˆþöj40†ˆ›ŸìØöj3X†ˆ›§†ìòØöð†ƒùñj2T†ˆ›­ìòùßöð†ƒùj1|†ˆ›­ì†ìØöj0¤†ˆ›»ì†ì†ì†Òöj/”†ˆ›j0l†ìòò†ì†Òöj.ô†ˆ›‹Øöð†ƒùò†ƒùj.†ˆ›­ì†ìØöð†ƒùò†ƒùj,ø†ˆ›»ì†ì†ì†Òöj, †ˆ›»ìò†ì†Òö؆ˆþöð†ƒùö†üj*Іˆ›»ì†ì†ì†Òööƒùò†ƒùʆˆþöð†ƒùö†üö†üö†üö†üð†ƒùЈþöð†ƒùj(`†ˆ›»ìòò†Òöð†ƒùj&ü†ˆ›j(4ìò†ì†ì†ì†ì†ì†Òöj&x†ˆ›‘Òöò†ƒùj$à†ˆ›j&Pì†ì†ìòò†ìòòò†Òööƒùò†ƒùð†ƒùj#ð†ˆ›Ÿì†óßöj#†ˆ›§òò†óßöð†ƒùj"@†ˆ›™†ì†Òöð†ƒùʆˆþöð†ƒùj!†ˆ›‹†Òöj `†ˆ›Ÿì†Òöö†üj”†ˆ›™†ì†Òöˆ›‘Òöð†ƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùj¸†ˆ›™†ì†Òöjà†ˆ›»ì†ì†ì†Òöj@†ˆ›Ÿì†Òöüüð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùð†ƒùj`†ˆ›j`ì†ì†ìò†ì†Òöj¤†ˆ›­ìò†Òööüð†ƒùj°†ˆ›™†ì†Òöj†ˆ›Ÿì†Òöò†ƒùð†ƒùð†ƒùð†ƒùö†üð†ƒùj¼†ˆ›­ì†ì†Òöð†ƒùjt†ˆ›jh†ìò†ìò†ì†Òöøƒùö†üò†ƒùð†ƒùð†ƒùj$†ˆ›»ì†ìò†Òöð†üö†üj †ˆ›»ì†ì†ì†Òöñò†ƒùò†ƒùð†ƒùð†ƒùð†ƒù؆ˆþöö†üö†üjH†ˆ›­ìò†Òöˆ›ãöð†ƒùj솈›­ì†ì†Òöʆˆþöò†ƒùj”†ˆ›§†ì†ì†óßöð†ƒùð†ƒù؆ˆþöj T†ˆ›™ò†Òöj |†ˆ›»ì†ì†ì†Òöj À†ˆ›­ìò†ÒöÞ“õþþøò†ƒùj ؆ˆ›‘óßöð†ƒùò†ƒùò†ƒùð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùj ,†ˆ›»ì†ì†ì†ÒöjŒ†ˆ›ŸìØöj†ˆ›‘Òöò†ƒùð†ƒùj†ˆ›™†ì†Òöj“ ½üjþö膃ˆñ膃ˆñ膃ˆñò†ƒùj †ˆ›­ìò†Òöj†ˆ›ãöð†ƒùð†ƒùj¸†ˆ›jÔì†ì†ì†ì†ì†ìØö脌ƒóƒùj´†ˆ›»ì†ì†ì†Òöö†üj†ˆ›Ÿì†Òö؆ˆþöð†ƒùð†ƒùð†ƒùöƒùiÿŒ†ˆ›­ìò†Òöiþ´†ˆ›»ìòò†ÒöiüĆƒŽúþŸiþ¨ƒùꆄ„þöꆄ„þöꆄ‚öꆆöiý,†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùiû`†ˆ›iü˜ìò†ì†ì†ì†ì†ì†Òöð†ƒùò†ƒùð†ƒù؆ˆþöiù솈›»ì†ì†ì†Òöö†üiù†ˆ›»ì†ì†ì†Òöiø8†ˆ›™†‹á†Òöøƒùi÷,†ˆ›µ†ìò†ì†ÒöÔ†ƒˆ‹æò†ƒùiö<†ˆ›‘Òöö†üö†üð†ƒùö†üiõP†ˆ›Ÿì†Òöiôx†ˆ›§†ìòØöøƒùi󤆈›­ìòùßöð†ƒùiò膈›‹†Òöiò†ˆ›»ì†ì†ì†Òöiñ†ˆ›iñ؆ìòò†ì†Òöið`†ˆ›Ÿì†Òöö†üò†ƒùiˆ›Ÿì†ÒöiîÀ†ˆ›»ìòò†Òöö†üö†üö†üöƒùò†ƒùò†ƒùð†ƒùiìІˆ›iîì†ì†ìòꆋá†ìØöiì0†ˆ›‹†ÒöiëX†ˆ›»ì†ì†ì†Òöiꀆˆ›»ì†ì†ì†Òöð†ƒùi醈›iê,òò†ìò†ìò†ì†Òöièlˆ›Ÿì†Òöiç܆ˆ›‘Òöiç<†ˆ›Ÿì†ÒöiæH†ˆ›µ†ì†ì†ì†óßöi冈›iæ8ì†ì†ìò†ì†ì†ì†ÒöÔ†ƒˆ‹†àð†ƒùiä †ˆ›‘Òöò†ƒùð†ƒùÞ“õþþøiâ´†ˆ›§òòùßöiↈ›‹†Òöð†ƒùiát†ˆ›‘Òöiàð†ˆ›ãöiàl†ˆ›‘Òöð†ƒùiß̆ˆ›‘Òöi߆ˆ›™†ì†óßö؆ˆþöö†üiÝl†ˆ›iÞ|ò†ì†ì†ì†ì†ì†Òööƒùð†ƒùð†ƒùiÜ@†ˆ›»ìòò†ÒöiÛh†ˆ›»ìò†ìØöö†üö†üö†üiÚ`†ˆ›§†ìòØö膃ˆñð†ƒù؆ˆþöiÙ8ˆ›‹†ÒöiØŒ†ˆ›‹Øöi×`†ˆ›iØ|ì†ìòòòò†óßöð†ƒù膃ˆñiÖx†ˆ›Ÿì†Òöö†üiÕ†ˆ›»ì†ì†ì†ÒöЈþöò†ƒùð†ƒùiÔ8†ˆ›­ìò†ÒöiÒð†ˆ›iÔ†ì†ì†ì†ìò†ì†ÒöiÑŒ†ˆ›iÒ¸òò†ìòòòò†Òöiд†ˆ›»ìò†ì†ÒöiÐ0†ˆ›ãöð†ƒùð†ƒùiφˆ›iÏèì†ìò†ìØöð†ƒùiΆˆ›»ì†ì†ì†Òöö†üøƒù膃ˆñò†ƒùiÌ膈›™†ìØöò†ƒùiËÀ†ˆ›iÌÀì†ìòòò†óßöiÊ膈›»ì†ì†ì†Òöiʆˆ›»ì†ì†ì†ÒöiÉŒ†ˆ›‘ÒöiȤˆ›µ†ì†ì†ì†óßöiÇø†ˆ›Ÿì†Òöò†ƒùð†ƒùidžˆ›­ì†ì†Òöò†ƒùiƆˆ›»ì†ì†ì†ÒöiÅ”†ˆ›‘ÒöiÄô†ˆ›‹†ÒöЈþöð†ƒùö†üð†ƒù膃ˆñiÁ˜†ƒúþŸiÄ ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöi†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒùiÀ¤†ˆ›Ÿì†Òöò†ƒùi¿´†ˆ›»ì†ì†ì†Òöi¾Ü†ˆ›»ì†ì†ì†Òöi¾†ˆ›§ò†ì†Òööƒùi½d†ˆ›‘óßöð†ƒùi¼Ä†ˆ›ãöi»ì†ˆ›§†ì†ì†Òöi»h†ˆ›‘Òöò†ƒùiº0†ˆ›i»òò†ìꆋÇöi¹†ˆ›Ÿì†óßöi¸¸†ˆ›»ì†ì†ì†Òöi·à†ˆ›»ì†ì†ì†Òöi·@†ˆ›Ÿì†Òöð†ƒù؆ˆþö؆ˆþöˆ›‘Òöð†ƒùiµ0†ˆ›™†ì†óßöi´<†ˆ›iµ ìòòòùßöi³d†ˆ›»ìòò†Òöð†ƒùi²Œ†ˆ›™ò†Òö膃ˆñò†ƒùi±Ä†ˆ›‘Òöö†üi°Ü†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöð†üÞ†öi®è†ˆ›i¯Ìì†ì†ì†ì†Òöð†ƒùi­ô†ˆ›§ò†ì†Òöi­†ˆ›i­äì†ì†ì†ì†Òöð†ƒùi¬ †ˆ›§†ìò†Òöð†ƒùi«P†ˆ›Ÿì†Òöiª\†ˆ›i«@ì†ìò†ì†Òö؆ˆþöi©p†ˆ›Ÿì†Òö؆ˆþö؆ˆþöi¨(ˆ›™†ì†Òöi§ †ˆ›i¨ ìò†ì†ì†ì†Òöð†ƒùð†ƒùð†ƒùi¦4†ˆ›‘Òöi¥”†ˆ›Ÿì†Òöð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùò†ƒùi¤T†ˆ›‘Òöi£Ð†ˆ›‘Òöi£ ˆ›™ò†Òöð†ƒùi¢<†ˆ›­ìò†Òöò†ƒùi¡„†ˆ›Ÿì†Òöi¡†ˆ›ãöð†ƒùi  †ˆ›»ìò†ì†Òö脌ƒóƒù脌ƒóƒù脌ƒóƒùiž°†ˆ›»ì†ì†ì†Òöi„†ˆ›iž ìòòòòò†Òöiœðˆ›Ÿì†Òö؆“õþþøò†ƒùi›ü†ˆ›‘óßöð†ƒùi›@†ˆ›Ÿì†Òöö†üñišd†ˆ›Ÿì†Òöi™8†ˆ›iš,òò†ì†ì†ì†Òöð†üʆˆŸßöi˜0†ˆ›‘Òöi—t†ˆ›™òØöð†üò†ƒùi–h†ˆ›»ìò†ìØöi•†ˆ›»ì†ì†ì†Òöö†üi”¨†ˆ›»ì†ì†ì†Òöi”†ˆ›Ÿì†Òöi“h†ˆ›Ÿì†Òöi(“ i‘di“’êi‘\øüøüøüiˆºþi8Ÿßöi|†ˆ›‹Øöð†ƒùiŽÜ†ˆ›‘Òöiކˆ›»ìòò†Òöð†ƒùi0†ƒˆˆ»ì†ìò†ØiŒ†ˆ›‹†Òöi‹H†ˆ›iŒ€ì†ì†ìò†ìòò†ÒöiŠ˜ˆ›™†ì†Òö؆“õþþøö†üð†ƒùò†ƒùi‰@†ˆ›­ì†ì†Òöiˆ †ˆ›‹†Òöi‡¬†ˆ›µòò†ì†Òöi‡(†ˆ›‘Òöi†P†ˆ›»ì†ì†ì†Òöʆˆþöi…d†ˆ›‘Òöiƒ¬†ˆ›i…Tì†ì†ì†ì†ì†ì†ìòòò†ì†Òöi‚àˆ›§†ìò†Òöi‚P†ˆ›‘óßöi\†ˆ›i‚@ìò†ìò†Òöi€L†ˆ›i$†ì†ì†ìòØöð†ƒùi†ˆ›Ÿì†Òöi~¸†ˆ›»ì†ì†ì†Òöò†ƒùi~ ˆ›Ÿì†Òöò†ƒùi}d†ˆ›‘Òöi|p†ˆ›i}Tì†ì†ì†ì†Òöi{Ô†ƒˆˆ™†ì†Øð†ƒùð†ƒùò†ƒùiz䆈›Ÿì†ÒöizD†ˆ›Ÿì†Òöiyl†ˆ›§ò†ìØööƒùix\†ˆ›iy@ì†ìò†ì†Òöiw †ˆ›™†ì†óßöiw†ˆ›‘Òöiv`†ˆ›­ìò†Òöð†ƒùð†ƒùiu¤†ˆ›‘Òöö†üøƒù膃ˆñit°†ˆ›‹†Òöir †ƒˆúþŸit¤ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöirœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒiqH†ˆ›§ò†ì†Òöð†ƒùip8†ˆ›iqì†ì†ì†ì†Òöim¸†ƒúþŸip,ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöà†ˆþöin$†ˆ¦õ·ä†‹Ø’ÍþøôüÚilà†ˆ›§†ìò†Òöð†ƒùil†ˆ›­ìò†Òö؆ˆþöij䆈›»ì†ì†ì†Òöij †ˆ›»ì†ìòùßöigÄ“®ihÔŒiiÜä‚΂ˆ’ihðü–ü—Éih@¸igÔ›ãöð†ƒùð†ƒùifĆˆ›™òØö膃ˆñieø†ˆ›‹†Òöð†ƒùid膈›ieÌìòòòØöð†ƒù脌ƒóƒùö†üˆ›‘óßöic4†ˆ›§òò†Òöib°†ˆ›ãöò†ƒùò†ƒùò†ƒùð†ƒùò†ƒù؆ˆþöia,†ˆ›­ìò†Òöi`Œ†ˆ›Ÿì†Òöi_´†ˆ›»ì†ì†ì†Òöñi^̆ˆ›™†ìØöð†ƒùi^,†ˆ›‘Òöi]Œ†ˆ›Ÿì†Òöö†ü؆ˆþöò†ƒùi\@†ˆ›»ì†ì†ì†Òöö†üò†ƒùˆ›ãöiZô†ˆ›Ÿì†ÒöiZ†ˆ›µ†ì†ì†ì†óßöò†ƒùò†ƒùʆˆþöð†ƒùö†üiXd†ˆ›»ì†ì†ìØöЈþöð†ƒù膃ˆñð†ƒùð†ƒùð†ƒùiVˆ†ˆ›»ì†ì†ì†Òöö†üö†üð†ƒùiU†ˆ›­ìò†ÒöiTTˆ›iUX†ì†ì†ì†ìò†ì†ÒöiSp†ˆ›»ìò†ì†Òöð†ƒùiRІˆ›ãöʆˆþöiQ䆈›ãöò†ƒùð†ƒùiP¼†ˆ›iQ ì†ìò†ìØöð†ƒù膃ˆñò†ƒùiO„†ˆ›»ì†ì†ì†ÒöiN¬†ˆ›»ì†ì†ì†ÒöiMœ†ˆ›iNœì†ì†ì†ìò†ÒöiLĆˆ›§òò†Òöˆ›‘óßöiK0†ˆ›iL†ì†ì†ìòØöiJ†ˆ›ŸìØöð†ƒùiHÔ†ƒŽúþŸiJhƒùꆄ„þöꆈþöiI<†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùiGü†ˆ›­ì†ì†ÒöiGx†ˆ›‘Òö؆ˆþö脌ƒóƒùö†üð†üð†ƒùiEЈ›iF¨ì†ì†ì†ì†ÒöiE(†ƒˆˆ™†ì†Øð†ƒùð†ƒùiDP†ˆ›Ÿì†Òöð†ƒùö†ü؆ˆþö؆ˆþöiB´†ˆ›»ì†ì†ì†Òöˆ›‘Òöò†ƒùò†ƒùð†ƒùiA`†ˆ›‘óßöi@ˆ†ˆ›»ìòò†Òöi?̆ˆ›™†ì†Òöi?†ˆ›­ì†ì†óßöi„†ˆ›Ÿì†Òög=¬†ˆ›»ì†ì†ì†Òög<Ô†ˆ›»ì†ì†ì†Òög;ü†ˆ›»ì†ì†ì†Òöð†ƒùöƒùð†ƒùð†ƒùg:`†ˆ›g;Tòòòòò†Òöð†ƒùg9À†ˆ›‘Òöò†ƒùò†ƒùð†ƒùg8Ô†ˆ›Ÿì†Òöö†üg8$†ˆ›Ÿì†Òög7„†ˆ›Ÿì†Òööƒùð†ƒùð†ƒùg6t†ˆ›™ò†Òög5ð†ˆ›‘Òög5l†ˆ›‘Òöʆˆþöʆˆþög3Ćˆ›»ì†ì†ì†Òöö†üö†üò†ƒùg2솈›ŸìØöˆ›‘óßög1䆈›‘Òög0ð†ˆ›µòò†ì†Òög0P†ˆ›Ÿì†Òöö†üg/¼†ˆ›ãög/8†ˆ›‘Òöö†üò†ƒùò†ƒùg.dˆ›Ÿì†Òö؆“õþþøØ†“õþþøg- †ˆ›‹Øög,€†ˆ›Ÿì†Òöð†ƒùg+Ćˆ›Ÿìùßög*´†ˆ›g+Œ†ì†ìòò†Òöð†ƒùg)ø†ˆ›‹†Òöò†ƒùg)0ˆ›™†ì†Òög( †ˆ›‘Òöð†ƒùg'¬†ˆ›»ìò†ì†Òög'(†ˆ›‘Òö脌ƒóƒùg&$†ˆ›»ì†ì†ì†Òög$\†ƒŽúþŸg&ƒùꆄ„þöꆄ„þöꆆög$Ćˆ¦õ·ä†‹Ø’ÍþøôüÜöƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùg"ˆ†ˆ›»ì†ì†ì†Òög!̆ˆ›­ì†ì†óßög ô†ˆ›»ì†ì†ì†Òög T†ˆ›‹†ÒögІˆ›‘ÒögL†ˆ›‘Òöð†ƒùˆ›ãö؆“õþþøgP†ˆ›gPì†ìò†ì†ì†Òö膃ˆñð†ƒùð†ƒùö†üg†ˆ›»ìòò†Òögd†ˆ›ŸìØöˆ›‘Òöò†ƒùgH†ƒˆˆ‹†Øò†ƒùg¬†ˆ›‘Òöð†ƒùð†ƒùg†ˆ›gdìò†ì†ì†ìò†ìò†ÒögT†ˆ›­ìò†Òöð†ƒùg`†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†ügŒ†ˆ›g¨ì†ì†ì†ìò†ì†Òög솈›ŸìØöÞ“õþþøò†ƒùð†ƒùð†ƒùgx†ˆ›»ìòò†Òöð†ƒùgˆ†ˆ›gLì†ì†ì†ì†ì†ìòò†ìò†ì†ìØöò†ƒùg˜†ˆ›»ìòò†Òö脌ƒóƒùò†ƒùg|†ˆ›§†ìò†Òög ˜“¼g ØŠ˜þ˜g ôˆ’g ‚ˆ’Âü–üg Ðg 0g ´ög ¨›‹Øög ´†ˆ›»ìòò†Òöò†ƒùg à†ˆ›­ì†ì†Òöð†üg`†ˆ›g ´ì†ìò†ì†ì†ìòòØöò†ƒù膃ˆñð†ƒùgD†ˆ›­ì†ì†Òöð†ƒùˆ›‘Òöʆˆþög€†ˆ›™ò†Òög¨†ˆ›»ì†ì†ì†Òöò†ƒùö†üò†ƒùg䆈›‘Òöð†ƒùg`ˆ›g¸ì†ì†g؆‹ˆ™ò†ÈØöð†ƒùg˜†ˆ›Ÿì†óßög†ˆ›‘Òög †ˆ›µò†ì†ìØöfÿœ†ˆ›‘Òöʆˆþöfþ”†ˆ›ŸìØöfý„†ˆ›fþ„ì†ìòò†ìØöfüȆˆ›™†ì†Òöö†üö†üfûІˆ›»ì†ì†ì†Òö؆ˆþöfúȆˆ›­ì†ì†Òöfú(†ˆ›‹†Òööƒùfùˆ†ˆ›‘Òöð†ƒùð†ƒùð†ƒù膃ˆñð†ƒùfø†ˆ›»ì†ì†ì†Òöö†üö†üò†ƒùÞ“õþþøð†ƒùfö¸†ˆ›™†ì†óßöfô¸†ƒúþŸfö„„þö䆄„þö䆄„þöꆆöfõ$†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùð†ƒùð†ƒùö†üö†üfó|†ˆ›µì†ä†‹Çöfòø†ˆ›‘Òöð†ƒùfòT¤“õþþÚ“õþþøò†ƒùð†ƒùfñ†ˆ›fñà†ìò†ìòØöò†ƒùð†ƒùö†üfð@†ˆ›‘Òöö†üö†üð†ƒùfîô†ˆ›fïôìò†ìò†ì†ÒöfîDˆ›™†ìØöfëH†“¼f씊˜þ˜fí°ˆ’fíL‚ˆ’Âü–üfìŒfëìfìpöfëd›‹Øöð†ƒùfꌆˆ›Ÿì†Òöfꆈ›‘Òöð†ƒùð†ƒùð†ƒùfè܆ˆ›»ì†ì†ì†ÒöfèX†ˆ›‘Òö脌ƒóƒùfç(†ˆ›fèì†ì†ì†ä†‹Çö膃ˆñfæ@†ˆ›­ìò†Òöfåtˆ›§†ì†ì†óßöfäȆˆ›Ÿì†óßöñò†ƒùfã膃ˆˆ­ìò†Øð†ƒùfâô†ˆ›»ì†ì†ì†Òöfↈ›»ì†ì†ì†ÒöfàÔ†ˆ›fâ ì†ì†ì†ìò†ì†ì†Òöüüð†ƒùfß´†ˆ›fà˜ì†ì†ì†ì†Òöð†ƒùfÞ¤†ˆ›f߈ì†ìòòØöò†ƒùfݘ†ˆ›fÞ|ì†ì†ì†ìØöfÜ܆ˆ›™ò†Òöf܆ˆ›»ì†ì†ì†ÒöfÛ,†ˆ›»ì†ì†ì†ÒööƒùfÚ†ˆ›µ†ìòò†Òöò†ƒùfØô†ˆ›fÙ̆ì†ì†ìòØöò†ƒùð†ƒùʆˆþöf×¼†ƒˆˆ™†ì†Øö†ü؆ˆþö脌ƒóƒùö†üö†ü؆ˆþö؆ˆþöð†ƒùøƒùð†üò†ƒùð†ƒùfÔ°†ˆ›fÕÀ†ìòò†ìòò†Òöò†ƒùfÓ܆ˆ›­ì†ì†óßöfÓH†ˆ›™ëŠÕöö†üfÒ`†ˆ›»ì†ì†ì†Òöøƒùð†ƒùʆˆŸßöð†ƒùfцˆ›‹†Òöð†ƒùfІˆ›»ì†ì†ì†ÒöfÏ<†ˆ›»ì†ì†ì†Òöf΀†ˆ›­ì†ì†óßöð†ƒùfÍŒ†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†üöƒùfÌ †ˆ›™ò†óßöð†ƒùfÊà†ˆ›f˸†ìò†ìòØöð†ƒùð†ƒùfʆˆ›Ÿì†Òöö†üð†ƒùð†ƒùfÈ膈›»ì†ì†ì†ÒöfȆˆ›»ì†ì†ì†ÒöfÇp†ˆ›Ÿì†Òö膃ˆñöƒùð†ƒù膃ˆñð†ƒùfÅІˆ›fÆ´ìòò†ì†Òöð†ƒùfņˆ›Ÿì†Òöò†ƒù؆ˆþöfÄ,†ˆ›‘Òöð†ƒùfÃ8†ˆ›»ì†ì†ì†ÒöfÁЃˆúþŸfÈþöfÂ@†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üð†ƒùfÀø†ˆ›Ÿì†ÒöfÀ †ˆ›»ì†ì†ì†Òöf¿H†ˆ›»ì†ì†ì†Òööüf¾Œ†ˆ›‹†Òöf¾†ˆ›ãöf½„†ˆ›‘Òöf¼¬†ˆ›»ì†ì†ì†Òöf»ð†ˆ›­ì†ì†Òöf»4†ˆ›­ì†ìØöð†ƒùò†ƒùöƒùð†ƒù膃ˆñð†ƒùfº†ƒˆˆ‹†Øð†ƒùð†ƒùf¸ð†ˆ›»ì†ì†ì†Òöð†ƒùò†ƒùò†ƒùf¸†ˆ›‹Øöð†ƒùf·†ˆ›µì†ä†‹Çöð†ƒùö†üö†üð†ƒùð†ƒùð†ƒùöüfµì†ˆ›‘óßöfµh†ˆ›‘Òöf´È†ˆ›Ÿì†Òöf³ð†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒùf²à†ˆ›»ì†ì†ì†Òöf²0ˆ›­ì†ì†Òö膃ˆñð†ƒùð†ƒùð†ƒùf± †ˆ›‘Òöò†ƒùf°0†ˆ›§†ì†ì†óßöö†üö†üf¯T†ˆ›­ì†ìØö脌ƒóƒùö†üf®\†ˆ›­ì†ì†Òöð†ƒùöƒùð†ƒù膃ˆñf¬è†ˆ›µòòò†Òöò†ƒùð†ƒùf«Ü†ˆ›§òò†Òöð†ƒùf« †ˆ›Ÿì†Òöf©È†ˆ›f«ì†ì†ä†‹áòòò†Òöð†ƒùf©(†ˆ›‘óßöf¨P†ˆ›»ì†ì†ì†Òöò†ƒùð†ƒùf§D†ˆ›»ì†ì†ì†Òöö†üf¦\†ˆ›»ì†ì†ì†Òöð†ƒùf¥†ˆ›f¦0ì†ì†ì†ìò†ì†Òöò†ƒùf¤@†ˆ›­ì†ì†óßööƒùf£h†ˆ›™òùßöò†ƒùò†ƒùf¡ð†ˆ›f£†ìòò†ìòò†Òöð†ƒùf¡†ˆ›­ì†ì†óßöð†ƒùf @†ˆ›™†ì†ÒöfŸ†ˆ›f 0ìò†ìò†ì†ì†Òö؆ˆþöfž †ˆ›­ì†ì†Òö脌ƒóƒùö†üf0†ˆ›Ÿì†Òöøƒùò†ƒùð†ƒùf›ð†ˆ›fœÔìò†ì†ì†Òöf›l†ˆ›‘Òöð†ƒùfš°†ˆ›‹†Òöfš,†ˆ›‘Òöf™¨†ˆ›ãöf™†ˆ›‹†Òöð†ƒùð†ƒùÚ†ƒˆñf—°†ˆ›»ì†ì†ì†Òöf—†ˆ›‹†Òöö†üð†üˆ›‘Òö؆“õþþøò†ƒùò†ƒùò†ƒùð†ƒùf•†ˆ›‹†Òöò†ƒùf”†ˆ›f”èì†ìòòØöf“L†ƒˆˆ§†ì†ì†Øf’t†ˆ›§†ì†ì†óßöö†üð†ƒùð†ƒùö†üf‘D†ˆ›»ì†ì†ì†Òöö†üf$†ˆ›f‘$ì†ì†ì†ì†ì†Òöf„†ˆ›ŸìØööƒùfŽt†ˆ›µ†ìòò†Òöfd†ˆ›fŽ<†ì†ì†ìòØöò†ƒùð†ƒùð†ƒùò†ƒùfŒx†ˆ›„ßöö†üf‹T†ˆ›fŒX䆋ن‹áò†ÒöfŠ˜†ˆ›­ìò†Òöf‰Ü†ˆ›­ì†ì†Òöf‰†ˆ›»ì†ì†ì†Òöfˆ€†ˆ›‘Òöð†ƒùüüð†ƒùʆˆþöf‡†ˆ›™†ìØöð†ƒùf†<†ˆ›™†ì†Òö؆ˆþöf…4†ˆ›­ì†ì†Òöö†üöƒùð†ƒùð†ƒùò†ƒùfƒà†ˆ›»ì†ì†ì†Òö؆ˆþö̆ƒŽü˜þò„þåö†üöƒùð†ƒùf؆ˆ›f‚°†ìò†ìòØöð†ƒùò†ƒù脌ƒóƒùf€ô†ˆ›‘Òöf€†ˆ›»ìò†ì†Òöf`†ˆ›™†ì†Òö؆ˆþöð†ƒùf}膈›f~èìò†ìò†ì†Òöøƒùò†ƒùð†ƒùf}†ˆ›‘Òöò†ƒùf|H†ƒˆˆ§†ì†ì†Øö†üf{`†ˆ›»ì†ì†ì†Òöfzˆ†ˆ›»ì†ì†ì†Òööƒùfy膈›‘Òöò†ƒùð†ƒùfxø†ˆ›­ìò†ÒöfxX†ˆ›‹Øöð†ƒù膃ˆñfwŒ†ˆ›‘Òöò†ƒùÔ†ƒˆ‘àò†ƒùfvh†ˆ›Ÿì†Òöð†üfu†ˆ›­ì†ìØöftð†ˆ›Ÿì†Òöft†ˆ›»ì†ì†ì†Òö膃ˆñò†ƒùöƒùð†ƒùfrü†ˆ›Ÿì†Òöò†ƒùʆˆŸßöfqø†ˆ›‘óßöfqX†ˆ›Ÿì†Òöfp¸†ˆ›Ÿì†Òö؆ˆþö؆ˆþöò†ƒùfoL†ˆ›­ì†ì†óßöfnt†ˆ›§òòØöˆ›‘óßöð†ƒùfm4†ˆ›Ÿì†Òöò†ƒùflœ†ƒˆˆ‹†Øð†ƒùfk¨†ˆ›»ì†ì†ì†Òöfj|†ˆ›fkp†ìòò†ìò†óßöð†ƒùö†ü؆ˆþöð†ƒù脌ƒóƒùð†ƒù؆ˆþöfh|†ˆ›»ì†ì†ì†ÒöfgÀ†ˆ›­ì†ì†óßöff膈›»ì†ì†ì†Òöò†ƒùff0†ˆ›Ÿì†ÒöfeX†ˆ›»ìò†ì†ÒöfdĈ›Ÿì†Òöfd†ˆ›Ÿì†Òöfcx†ˆ›Ÿì†Òöfb؆ˆ›‹†Òöfb†ˆ›»ì†ì†ì†Òöò†ƒùfa†ˆ›§†ì†ì†Òöf`†ˆ›µ†ìò†ì†Òöö†üf_4†ˆ›»ì†ì†ì†Òöö†üò†ƒùf^xˆ›‹†Òöð†ƒùf]|†ƒˆˆf^@ì†ì†ìòÞð†ƒùf\°†ˆ›§ä†‹Çöf\†ˆ›Ÿì†Òöö†üf[4ˆ›»ìòò†ÒöfZˆ†ˆ›‹†ÒöfZ†ˆ›‘óßöð†ƒùfW䆃ˆúþŸfY܃ùꆄ„þöꆄ„þöꆄ„þöꆈþöfX`†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùfWD†ˆ›„ßöð†ƒùfV¤†ˆ›‘ÒöfV†ˆ›ŸìØööƒùfUd†ˆ›‘Òöò†ƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùfSô†ˆ›»ì†ì†ì†ÒöfS†ˆ›»ì†ì†ì†ÒöfR|†ˆ›Ÿì†Òö膃ˆñfQhˆ›fR@ìòò†ì†Òöð†ƒùò†ƒùfPP†ˆ›»ì†ì†ì†ÒöüüfO0†ˆ›fP0ì†ìò†ì†ì†ÒöfN¬†ˆ›‘óßöð†ƒùð†ƒùö†üð†ƒùð†ƒù؆“õþþøfM\†ˆ›‘Òö؆ˆþöfL8†ˆ›»ì†ì†ì†Òöð†ƒùö†üò†ƒùð†ƒùÞ“õþþøð†ƒùð†ƒùfJ´†ˆ›Ÿì†ÒöfIˆ†ˆ›fJ|†ì†ìòò†ì†Òöð†ƒùð†ƒùfHx†ˆ›»ìò†ìØöfGȆˆ›Ÿ‹á†Òöð†ƒùfFÔ†ˆ›»ì†ì†ì†ÒöøƒùfF†ˆ›­ìò†Òöð†ƒùfE(†ˆ›­ì†ì†ÒöfDl†ˆ›™†ì†Òö膃ˆñfC„†ˆ›­ì†ì†Òöò†ƒùfB”†ˆ›»ìò†ì†ÒöfA؆ˆ›­ì†ì†Òöò†ƒùð†ƒùð†ƒùf@̆ˆ›™†ì†Òöf@,†ˆ›Ÿì†Òöf?¨†ˆ›‘Òöf>솈›­ìòØöð†üf>†ˆ›­ìò†Òöˆ›‘óßöð†ƒùf<ð†ˆ›‘Òöfe¼e¹:þŸe¼€ƒùe»Œ†ˆ¦õe¼dì†ì†ì†ÊþøeºÜ†ˆ¦õ§ì†ëßþøe¹€„eº(ˆ¦õ§‹á†Êþe¹Œˆ¦õ™‹e¹˜þøôüÒð†ƒùe¸8ˆ›™†ìØöð†ƒùe·T†ˆ›™†ìØöò†ƒùð†ƒùð†ƒùe¶,†ˆ›»ì†ì†ì†Òöð†ƒùeµ8†ˆ›»ìò†ì†Òöøƒùð†ƒù膃ˆñð†ƒùe´8†ˆ›‘Òöð†ƒùð†ƒù膃ˆñe³†ˆ›­‹áò†Òöö†üe²t†ˆ›‘Òö؆ˆþöe±P†ˆ›»ì†ì†ì†Òö脌ƒóƒùe°L†ˆ›»ì†ì†ì†Òöe¯t†ˆ›»ìò†ì†Òöö†üe®Ä†ˆ›ŸìØöøƒùð†ƒùe­d†ˆ›e®€ì†ìò†ìò†ì†Òöe¬Œ†ˆ›»ì†ì†ì†Òöe«´†ˆ›»ì†ì†ì†Òöò†ƒùe«†ˆ›‘Òöeªhˆ›™†ì†Òö؆“õþþøð†ƒùe©T†ˆ›‹†Òöe¨´†ˆ›Ÿì†óßöe§¤†ˆ›e¨|òòòò†Òöð†ƒùe¦x†ˆ›e§xì†ìò†ì†ì†Òöð†ƒùe¥„†ˆ›§ò†ì†Òöð†ƒùe¤¬†ˆ›­ìò†Òö؆ˆþöe£À†ˆ›ŸìØööƒùð†ƒùe¢x†ˆ›e£xì†ì†ìò†ì†Òö膃ˆñð†ƒùe¡t†ˆ›™ò†Òöe œ†ˆ›»ì†ì†ì†ÒöeŸŒ†ˆ›e Œì†ì†ì†ì†ì†Òöö†üežÜ†ˆ›ŸìØöež †ˆ›­ì†ì†Òöeœô†ˆ›ežì†ìò†ìòò†ÒöЈþöe›Ð†ˆ›­ì†ì†Òöò†ƒùe›4†ˆ›‘Òöð†ƒùeš\†ˆ›­ìò†óßö膃ˆñ؆ˆþöe™ †ˆ›»ì†ì†ì†Òöð†ƒùøƒùe—䆈›e˜Èìòòò†Òöð†ƒùe—D†ˆ›ãöð†üe–4†ˆ›µ†ì†ìòØö膃ˆñò†ƒù膃ˆñð†ƒùe”Іˆ›»ì†ì†ì†Òöe“ø†ˆ›»ì†ì†ì†Òöe“ †ˆ›»ì†ì†ì†Òöe’d†ˆ›­ìò†Òöe‘Œ†ˆ›»ì†ì†ì†Òöö†üe܆ˆ›Ÿì†ÒöøƒùeІˆ›µòòò†óßöò†ƒùeŽà†ˆ›§†ì†ì†ÒöeŽ@†ˆ›‹†óßö膃ˆñò†ƒùö†üe†ˆ›»ì†ì†ì†Òöö†üøƒùö†üò†ƒùð†ƒùe‹Ð†ˆ›§†ì†ìØöð†ƒùe‹†ˆ›Ÿì†ÒöeŠ †ˆ›e‹ìò†ì†ì†Òö؆ˆþöe‰4†ˆ›Ÿì†Òöeˆ”†ˆ›Ÿì†Òöö†üe‡¬†ˆ›»ì†ì†ì†Òöe†ð†ˆ›­ìò†Òööƒù膃ˆñð†ƒù膃ˆñò†ƒùe…¨†ˆ›Ÿì†Òöò†ƒùò†ƒùò†ƒùe„ˆ†ˆ›»ì†ì†ì†Òöeƒ°†ˆ›»ì†ì†ì†Òöeƒ†ˆ›Ÿì†ÒöЈŸßö؆“õþþøö†ü膃ˆñò†ƒùð†ƒùð†ƒùeL†ˆ›‘Òöe€t†ˆ›»ì†ì†ì†Òö؆ˆþöeˆ†ˆ›Ÿì†Òöe~°†ˆ›»ì†ì†ì†Òöð†ƒùe}ô†ˆ›ŸìØöe}T†ˆ›ŸìØöˆ›‘Òöe{ø†ˆ›§†ì†ì†Òöe{X†ˆ›Ÿì†Òöez€†ˆ›§†ìòØöð†ƒùð†ƒùð†ƒùð†üeyŒ†ˆ›‘Òö脌ƒóƒùexl†ˆ›µ†ì†ì†ì†Òö؆ˆþö؆ˆþöew4†ˆ›ŸìØöevx†ˆ›™†ì†Òööƒùò†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùð†ƒùet˜†ˆ›»ìòò†ÒöesÀ†ˆ›»ì†ìò†Òöð†ƒùöƒùò†ƒùð†ƒùð†ƒùerD†ˆ›es(ìòò†ì†Òöeq¤†ˆ›‹†Òöep°†ˆ›eq”ì†ìò†ìØö膃ˆñ脌ƒóƒùeo€†ˆ›»ì†ì†ì†ÒöenŒ†ˆ›eopìò†ì†ì†Òöem솈›Ÿì†Òöem†ˆ›emÜ䆋á†ì†Òö؆ˆþö؆ˆþöö†üejÀ†ˆ›elLì†ì†ì†ì†ì†ì†ìò†ìò†Òööƒùei膈›­ìòØöeh؆ˆ›ei°†ìò†ìòØöeh†ˆ›™†ì†Òöð†ƒùeg †ˆ›µ†ì†ìò†óßöð†ƒùeeŒ†ˆ›efàì†ì†ì†ì†ì†ìòò†Òö膃ˆñ膃ˆñed”†ˆ›‹Øö膃ˆñ؆ˆþöð†ƒùec(†ˆ›»ì†ì†ì†Òöebl†ˆ›­ìò†Òöeăˆ›ŸìØöea,†ˆ›ŸìØöð†ƒùˆ›‘óßöe`†ˆ›‘Òöð†ƒùe_L†ˆ›Ÿì†Òöò†ƒùe^\†ˆ›»ì†ìòØöe]L†ˆ›e^Lì†ì†ì†ìò†Òöð†ƒùe\t†ˆ›­ì†ì†Òöe[œ†ˆ›»ì†ìò†ÒöeZü†ˆ›Ÿì†Òöò†ƒùeZD†ˆ›ŸìØöñeY@†ˆ›»ì†ì†ì†ÒöeX0†ˆ›eY0ì†ìò†ìò†Òöð†ƒùð†ƒùð†ƒùeVx†ˆ›eWÌì†ì†ì†ì†ì†ìòòØöð†ƒùeU¼†ˆ›‹†ÒöeU†ˆ›Ÿì†ÒöeTD†ˆ›»ì†ì†ì†ÒöeS°ˆ›‹†ÒöeS†ˆ›‹†Òöð†ƒù膃ˆñeR8†ˆ›‘Òöò†ƒùePô†ˆ›eQè†ìò†ì†ì†ì†Òöð†ƒùeP†ˆ›»ì†ì†ì†Òöö†üeOP†ˆ›Ÿì†ÒöeNx†ˆ›»ì†ì†ì†ÒöeM؆ˆ›ŸìØöeM†ˆ›™†ì†óßöøƒùeL€†ˆ›‘ÒöeKü†ˆ›‘óßöeJ솈›eKĆì†ì†ìòØöeIø†ˆ›eJÜì†ìò†ì†Òöð†ƒùð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùeC܆ˆ›eIDìòeDD†‹šøeH”þŽþþeD~eH€eDzþŸeHpƒùeG´†ˆ¦õ§ì†ÊþøeF̆ˆ¦õeG¤ìòò†ÊþøeF†ˆ¦õ§ì†ëßþøeDÀ„eEhˆ¦õ§‹á†ÊþeD̈¦õ™‹eDØþøôüeCôöeBx†ˆ›eC¤†ìò†ìò†ìò†ì†Òöˆ›‘óßöò†ƒùò†ƒùð†ƒùð†ƒùe@`†ˆ›eATò†ìòò†ìùßöò†ƒùe?Ćˆ›‘Òöe>솈›§†ì†ì†Òöe>L†ˆ›‹†Òöe=t†ˆ›§ò†ì†Òöe<Ô†ˆ›ŸìØööüe<†ˆ›Ÿì†Òöe;„†ˆ›‘‹Çöe:†ˆ›µòòòØöe: †ˆ›‘Òöð†ƒùð†ƒùö†üð†ƒùe9†ˆ›Ÿì†Òöö†üe7膈›e8èìòò†ì†ì†Òöe7H†ˆ›ŸìØöð†ƒùøƒùð†ƒù膃ˆñ膃ˆñe5<†ˆ›e6ì†ìòò†ìòòò†Òöe4¸†ˆ›‘Òöð†ƒùe3ü†ˆ›‹†Òö膃ˆñ膃ˆñò†ƒù؆ˆþö؆ˆþöe2T†ˆ›Ÿì†Òöe1|†ˆ›§ò†ì†Òöe0ø†ˆ›‘ÒöÞ“õþþøe0(†ˆ›„ßöò†ƒùð†ƒùe/p†ˆ›‘óßöð†ƒùð†ƒùe-Ô†ˆ›e/(ì†ì†ì†ìò†ìòòØöö†üʆˆþöö†üð†ƒùe,†ˆ›‹†Òöe+ð†ˆ›ŸìØöe+P†ˆ›Ÿì†Òööüe*\†ˆ›»ì†ì†ì†Òöe)¼†ˆ›‹†Òöð†ƒùe)†ˆ›Ÿì†óßöð†ƒùe'ð†ˆ›e(Ôìòò†ì†Òöð†ƒùe&à†ˆ›e'Äì†ìò†ìØöe&$†ˆ›­ì†ì†Òöe% †ˆ›‘Òö脌ƒóƒùð†ƒùe#؆ˆ›e%Hì†ì†ì†ì†ì†ìòò†ì†Òöe#8†ˆ›Ÿì†Òöe"˜†ˆ›Ÿì†Òöð†üe à†ˆ›e"lì†ì†ì†ì†ì†ì†ìò†ìò†Òööƒùð†ƒùò†ƒùð†ƒùð†ƒùö†üeĆˆ›‘Òöe˜†ˆ›e´ìò†ì†ì†ìò†Òöñe膈›‘óßöe†ˆ›§†ì†ì†Òö膃ˆñð†ƒùeD†ˆ›‘Òöel†ˆ›»ì†ì†ì†Òöe膈›‘Òöe†ˆ›»ì†ì†ì†Òöep†ˆ›ŸìØöð†ƒùeІˆ›ãöüüe膈›§ò†ì†Òöð†ƒùeô†ˆ›§†ì†ìØöð†ƒùò†ƒùe †ˆ›Ÿì†Òöö†üep†ˆ›ŸìØööƒùeІˆ›‘Òöð†ƒùe†ˆ›Ÿìùßöð†ƒùð†ƒùe†ˆ›»ì†ìò†Òöö†üe†ˆ›»ì†ì†ì†ÒöeD†ˆ›»ìòòØööƒùð†ƒùö†üe\†ˆ›Ÿì†Òöò†ƒùe`†ƒŽúþŸe8ƒùꆄ‚öꆄ‚öe˜†ˆ‰’úþŸeЃùeô†ˆ‘úþŸe p„„‘úþŸe¨„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöe ܆ˆ¦õ·ä†‹Ø’Íþøôüþàöe †„„‘úþŸe H„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöe |†ˆ¦õ·ä†‹Ø’Íþøôüþàöe<†ˆ‘úþŸe è„„þöꆄ‚öꆄ‚öꆄ„þöe„†ˆ‘úþŸe؈‘úþŸe H„‚öꆆöe D†ˆ¦õ·ä†‹Ø’Íþøôüþàöeü†ˆ¦õ·ä†‹Ø’Íþøôüþàöe´†ˆ¦õ·ä†‹Ø’Íþøôüþàöel†ˆ¦õ·ä†‹Ø’Íþøôüþàöe$†ˆ¦õ·ä†‹Ø’ÍþøôüÔöeȆˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùel†ˆ›»ì†ìò†Òöe”†ˆ›»ì†ì†ì†Òödÿ؆ˆ›­ìò†Òöð†ƒùÞ“õþþødþІˆ›‹†óßödþ0†ˆ›Ÿì†Òöò†ƒùdý`†ƒˆˆ§†ì†ì†Øð†ƒùdül†ˆ›§†ì†ì†óßö؆ˆþöò†ƒùdû0†ˆ›»ì†ì†ì†Òö؆ˆþö膃ˆñö†üdú†ˆ›Ÿì†Òö؆ˆþööƒùdù †ˆ›‘‹Çödø†ƒˆˆdøüì†ì†ìò†ìòÞð†ƒùd÷D†ˆ›ŸìØödöˆ†ˆ›­ì†ì†óßödõ膈›Ÿì†Òödõ†ˆ›»ì†ì†ì†Òödó䆈›dõìòòòò†ì†Òööƒùð†ƒùð†ƒùð†ƒùdò†ˆ›dódì†ìòò†ìòòò†Òöð†ƒù膃ˆñdï°†ƒŽúþŸdñ¼ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþödð†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùö†üò†ƒù膃ˆñdî †ˆ›‹†Òödí †ˆ›dîì†ì†ì†ì†ì†ìòò†ì†Òöd쀆ˆ›Ÿì†Òö؆ˆþö؆ˆþöd놈›»ì†ì†ì†Òödê8†ˆ›»ìò†ì†Òöd餈›Ÿì†Òöö†üò†ƒùö†üdèÀ†ˆ›ŸìØöð†ƒùdç̆ˆ›§†ìò†Òöd熈›™†ì†Òöd憈›dæØ†ì†ì†ìòØödå †ˆ›dåðì†ìò†ì†Òöð†ƒùd䆈›»‹á†ì†ì†Òöð†ƒùdãX„dãàƒdãdƒŠþŸŒƒùôüÚd ˆ›§ò†ì†ÒödáĆˆ›­ìò†Òödà솈›»ì†ì†ì†Òödߤ†ˆ›dàÜì†ì†ìòò†ìò†ÒödÞ@†ˆ›dßl†ìò†ìò†ìò†ì†ÒöüüdÝœ†ˆ›‘‹Çöd݆ˆ›‘ÒödÜ0†ˆ›»‹á†ì†ìùßödÛ†ˆ›Ÿì†óßöð†ƒùò†ƒù膃ˆñð†ƒùdÚ<†ˆ›»ì†ì†ì†Òöò†ƒùdÙL†ˆ›»ì†ì†ì†ÒöÔˆþöö†üð†ƒùò†ƒùdØ$†ˆ›ãöd×L†ˆ›»ì†ì†ì†Òö膃ˆñð†ƒùdÔð†ƒˆúþŸdÖè„‚öꆄ‚öꆄ‚öꆄ‚öꆆödÕl†ˆ¦õ·ä†‹Ø’ÍþøôüÒdÔ4†ˆ›­ì†ì†ÒödÍ”†ˆ›dÔ$ì†dÍü†‹šødÓþŽþþdÎ6dÓ|dÎ2þŸdÓlƒùdÒ°†ˆ¦õ“†ÊþødÑ䆈¦õµì†ì†Êþødцˆ¦õ¡†ì†ÊþødЄ†ˆ¦õ™ÊþødÏÔ†ˆ¦õ§ì†ëßþødÎx„dÏ ˆ¦õ§‹á†Êþd΄ˆ¦õ™‹dÎþøôüdͬöð†üöƒùò†ƒùdË †ƒúþŸdÍ8ƒùꆄ„þöꆈþödÌ †ˆ¦õ·ä†‹Ø’ÍþøôüÚdˆˆ›Ÿì†ÒödÊ|†ˆ›‘Òöò†ƒùdÉĆˆ›‹†Òöð†ƒùdÉ$†ˆ›‘ÒödÈ„†ˆ›Ÿì†ÒödǬ†ˆ›»ì†ì†ì†ÒödÆð†ˆ›™†ì†óßöøƒùð†ƒùò†ƒùdÅ膈›­ìòØödÄØ†ˆ›dۆìò†ìòØöð†ƒùð†ƒù膃ˆñd܆ˆ›§ò†ì†ÒödÂà†ˆ›­ì†ì†óßöd†ˆ›»ì†ì†ì†Òöò†ƒùdÁ†ˆ›»ì†ì†ì†ÒöÞ“õþþødÀ†ˆ›­ìò†Òöð†ƒùð†ƒùd¿8†ˆ›Ÿì†Òöd¾`†ˆ›§òò†Òöd½Ü†ˆ›‘Òödºˆ†ƒˆúþŸd½Ðƒùꆄ‚öò†ƒùd»Ô†ˆ‘úþŸd½xƒùꆄ‚öꆈþöd¼L†ˆ¦õ·ä†‹Ø’Íþøôüþàöd»†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùd¹¸†ƒˆˆ­ì†ì†Ød¹4†ˆ›‘Òöd¸\†ˆ›»ì†ì†ì†Òöd·L†ˆ›d¸Lì†ì†ì†ìò†Òöð†ƒùöƒùò†ƒùð†ƒùd¶\†ˆ›‘Òödµ¼†ˆ›Ÿì†Òödµ†ˆ›‹†Òöð†ƒùd³Ô†ˆ›d´ðìò†ìò†ì†ìØöò†ƒùd²ä†ˆ›§†ì†ìØöd±Ô†ˆ›d²Ôì†ìò†ì†ìØöð†ƒùd°à†ˆ›»ì†ì†ì†Òöd°†ˆ›»ì†ì†ì†Òöd®ø†ˆ›d¯øì†ì†ì†ìò†Òöˆ›‘Òöd­¸†ˆ›™ò†Òöd­†ˆ›‹†óßöd¬\†ˆ›™ò†Òöð†ƒùʆˆþöd«8†ˆ›Ÿì†Òöd©ü†ˆ›‘‹ˆd«(ì†ì†ì†ì†dªöò†ƒùd© †ˆ›»ì†ì†ì†Òöd¨l†ˆ›Ÿì†Òöd§”†ˆ›»ì†ì†ì†Òöd¦¼†ˆ›»ì†ì†ì†Òöd¦†ˆ›ŸìØöd¥|†ˆ›Ÿì†Òöøƒùð†ƒùd¤Ä†ˆ›ãöð†ƒùd£|†ˆ›d¤˜ì†ì†ìò†ì†ìØöd¢¤†ˆ›»ì†ì†ì†Òöö†üd¡Ø†ˆ›­ìò†Òöˆ›‘Òöd ´†ˆ›‹†Òöð†ƒù膃ˆñdŸÌ†ˆ›Ÿì†ÒödŸ,†ˆ›‹†óßödžT†ˆ›»ì†ì†ì†Òöd´†ˆ›Ÿì†Òödœ¤†ˆ›d¤ì†ì†ì†ì†ì†Òöøƒùð†ƒùð†ƒùdšŒ†ƒŽúþŸdœHƒùꆄ„þöꆄ„þöꆆödšô†ˆ¦õ·ä†‹Ø’ÍþøôüÜd™Ð†ˆ›­ì†ì†Òöò†ƒù膃ˆñd˜ì†ˆ›‹†Òöð†ƒù膃ˆñd˜†ˆ›ŸìØöò†ƒùöƒùö†üð†ƒùd— †ˆ›ãöd•l†ƒˆúþŸd—ƒùꆄ„þöꆆöd•膈¦õ·ä†‹Ø’ÍþøôüÒd”°†ˆ›™†ì†Òöð†üd”†ˆ›ãöd“p†ˆ›Ÿì†Òöö†üö†üd’x†ˆ›»ì†ì†ì†Òöʆˆþöd‘Dˆ›§òò†óßöd †ˆ›d‘(ì†ìòòòò†óßöd8†ƒˆˆµò†ì†ìÞ̆ƒˆˆéò†ƒùð†ƒùd†ˆ›dŽì†ìòò†ìØöò†ƒù؆ˆþödŒŒ†ˆ›Ÿì†Òöd‹´†ˆ›»ì†ìò†Òöò†ƒùd‹ˆ›‹Øöö†üð†ƒùð†ƒùdІˆ›‹†Òöʆˆþöd‰ †ˆ›Ÿì†óßöð†ƒùdˆ†ˆ›»ì†ì†ì†Òöd†ì†ˆ›dˆì†ìò†ìò†ì†Òöd†0†ˆ›™ò†Òöd…<†ˆ›d† ìò†ìò†Òöd„œ†ˆ›ŸìØödƒü†ˆ›Ÿì†Òödƒx†ˆ›‘Òöð†ƒùüüð†ƒùd‚¬†ˆ›ãödÔ†ˆ›§ò†ìØöd€ü†ˆ›»ìò†ì†Òöd€@†ˆ›­ì†ì†Òöð†ƒù膃ˆñdt†ˆ›‘Òöö†üð†ƒùd~p†ˆ›»ì†ìò†Òööƒù膃ˆñò†ƒùð†ƒùð†ƒùd}T†ˆ›‘ÒöÞ“õþþøð†ƒùð†ƒùd|0†ˆ›Ÿì†Òöð†ƒùò†ƒùò†ƒùdz¸†ˆ›d{¬†ì†ìòò†ìØöò†ƒùdyȆˆ›»ì†ì†ì†Òöö†üö†üö†üö†üò†ƒù؆ˆþödxL†ˆ›»ì†ì†ì†Òödwt†ˆ›»ì†ì†ì†Òödvœ†ˆ›»ì†ì†ì†Òööüð†ƒùdu¨†ˆ›­ì†ì†Òödu†ˆ›Ÿì†Òöò†ƒùð†ƒùdt4†ˆ›Ÿì†Òödsx†ˆ›™†ìØödrÀ†ƒˆˆ»ìò†ì†Øò†ƒùdq|†ˆ›dr˜ì†ìò†ì†ìò†ÒödpP†ˆ›dqlì†ìò†ìò†ì†Òödo°†ˆ›Ÿì†Òödn؆ˆ›»ì†ì†ì†Òöö†ü؆ˆþöð†ƒùdm°ˆ›­ìòùßödm †ˆ›‘Òöð†ƒùð†ƒùò†ƒùdk”†ˆ›dl°‹áòòò†ì†ì†Òödjô†ˆ›ŸìØödj8†ˆ›­ì†ìØöð†ƒùð†ƒùdi`†ˆ›Ÿì†Òöö†üdhx†ˆ›»ì†ì†ì†Òö؆ˆþödgT†ˆ›»ì†ìò†Òö؆ˆþöò†ƒùˆ›‘óßöð†ƒùde°†ˆ›‹†Òöò†ƒùð†ƒùdd¤†ˆ›»ì†ì†ì†Òöò†ƒùdcІˆ›™†ì†Òöò†ƒùdbü†ˆ›­ìò†Òööƒùdb†ˆ›»ìòò†Òöda„†ˆ›‘Òöd`Ȇˆ›­ì†ì†Òöò†ƒùð†ƒùð†ƒùð†ƒù膃ˆñd_†ˆ›Ÿì†Òöd^¸†ˆ›»ìòò†Òöd]ü†ˆ›­ìò†Òöd]hˆ›‹†Òöd\ †ˆ›™†ì†Òöð†ƒùð†ƒùd[†ˆ›§†ìòØöð†ƒùð†ƒùð†ƒùò†ƒù膃ˆñdZ †ˆ›§†ìò†ÒödYH†ˆ›»ì†ì†ì†ÒödXp†ˆ›»ì†ì†ì†ÒödWD†ˆ›dX`ìò†ì†ì†ìò†ÒödV\ˆ›dW4ì†ì†ì†ìØödŬˆ›‘óßödTø†ƒˆˆµò†ì†ìÞò†ƒùdT †ƒˆˆdTÐìò†ì†ì†ØdRü†ˆ›dSüì†ìòò†ìØödR$†ˆ›»ì†ì†ì†ÒödQL†ˆ›»ì†ì†ì†ÒödPt†ˆ›»ì†ì†ì†Òöð†üdOpˆ›dPHì†ìò†ì†ÒödNĆˆ›‹†ÒödN$†ˆ›Ÿì†óßöò†ƒùò†ƒùdM†ˆ›»ì†ì†ì†Òö膃ˆñdKĆˆ›dLàì†ìò†ìò†ì†Òöð†ƒùdJ솈›­ìò†ÒödI܆ˆ›dJÜì†ì†ì†ìò†Òöò†ƒùdI@†ˆ›‘Òöð†ƒùöƒùð†ƒùð†ƒùdH†ˆ›™ò†ÒödG<†ˆ›§†ìò†Òöð†ƒùdF†ˆ›dFè†ìò†ìò†ÒödEŒ†ˆ›‘óßöð†ƒùò†ƒùð†ƒùdD¸†ˆ›‘ÒödCà†ˆ›»ì†ì†ì†ÒödBІˆ›dC¨†ì†ì†ìò†ÒödB†ˆ›­ìò†ÒööƒùdAt†ˆ›ãöð†ƒùd@Ô†ˆ›‘Òöd@†ˆ›­ìò†Òöò†ƒùd?D†ˆ›™†ì†Òöò†ƒùð†ƒùö†üö†üð†ƒùð†üd=¨†ˆ›d>¨ì†ì†ì†ì†ì†Òööƒùð†ƒùd<´†ˆ›™†ì†Òöd;ø†ˆ›­ì†ì†Òöö†üö†ü膃ˆñd; †ˆ›Ÿì†Òöd:P†ˆ›­ì†ì†óßöd9°†ˆ›Ÿì†Òöò†ƒùd9ˆ›Ÿì†Òöð†ƒùd8 †ˆ›­ìò†Òöd7€†ˆ›‹†Òöð†ƒùð†ƒùd5€†ƒˆúþŸd7<ƒùꆄ‚öà†ˆ‰õöd5ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒd4¨†ˆ›»ìò†ì†Òöð†ƒùd3솈›Ÿì†Òöd3h†ˆ›‘Òöd2†ˆ›»ì†ì†ì†Òöò†ƒùöƒùð†ƒùð†ƒùd1L†ˆ›§ò†ì†Òöd0Ȇˆ›‘Òöd0(†ˆ›‹†Òö膃ˆñd.Іˆ›d/ììò†ìò†ì†ìØöð†ƒùd-À†ˆ›d.¤ì†ìòò†Òöd,膈›§†ì†ìØöd,H†ˆ›Ÿì†Òöð†ƒùd+†ˆ›d,ì†ìò†ì†ìØöd*|†ˆ›Ÿì†Òöð†ƒù؆ˆþöò†ƒùd)$†ˆ›»ì†ì†ì†Òöd(h†ˆ›­ì†ì†Òöd'Ȇˆ›ŸìØööüd&ð†ˆ›™ò†Òöð†ƒùò†ƒùd&†ˆ›Ÿì†óßöò†ƒùd%d†ˆ›Ÿì†Òöd$´ˆ›™†ì†Òöð†ƒùd#¤†ˆ›»‹áòò†Òöd#†ˆ›Ÿì†Òöd"H†ˆ›­ì†ì†Òöò†ƒùd!¬†ˆ›‘Òöd €†ˆ›d!t†ìò†ì†ì†ìØödŒ†ˆ›µ†ì†ì†ì†Òöd´†ˆ›»ì†ì†ì†Òöd܆ˆ›»ì†ì†ì†ÒödÀ†ƒúþŸdЃùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöd,†ˆ¦õ·ä†‹Ø’ÍþøôüÚd”†ˆ›d°ì†ì†ì†ì†ì†ì†Òöd䈛­ì†ì†ÒödT†ˆ›ãöd´†ˆ›‹†Òöð†ƒùð†ƒùð†ƒùdˆ†ˆ›§†ìòØöd膈›Ÿì†Òöò†ƒùð†ƒù膃ˆñd°†ˆ›§†ìò†Òöd؆ˆ›»ì†ì†ì†Òöd†ˆ›dÈì†ì†ì†ìòòò†Òöd¸†ˆ›§†ìò†ÒödĆˆ›µ†ì†ì†ì†ÒöʆˆþööƒùdL†ˆ›d0ìò†ìò†Òöd¬†ˆ›Ÿì†óßö膃ˆñdĆˆ›™†ì†Òöd$†ˆ›ŸìØöò†ƒùd 4†ˆ›»ì†ì†ì†Òöd („d (ƒd 4ƒšød ¸þŽþþd Rd ¤d NþŸd ”ƒùd  †ˆ¦õd xì†ì†ì†Êþød ð†ˆ¦õ§ì†ëßþød ”„d <ˆ¦õ§‹á†Êþd  ˆ¦õ™‹d ¬þøôüÚdˆ†ˆ›ŸìØöñd؆ˆ›‘óßöd†ˆ›­ì†ì†ÒödD†ˆ›»ì†ì†ì†Òöò†ƒùð†ƒù膃ˆñò†ƒùð†ƒùò†ƒùd܆ˆ›­ìò†Òödô†ˆ›dÌìò†ä†‹Çö؆ˆþöö†üð†ƒù؆ˆþö؆ˆþöð†ƒùð†ƒùdð†ˆ›­ìò†ÒööƒùdP†ˆ›‘Òöd°†ˆ›Ÿì†Òöd,†ˆ›‘Òöð†üò†ƒùcÿ<†ˆ›™†ì†óßöò†ƒùð†ƒùö†üð†ƒùcþˆ›§†ìò†Òöð†ƒùcýH†ˆ›Ÿì†ÒöcüĆˆ›‘Òöcü†ˆ›™†ìØöcú<†ƒúþŸcûüƒùꆄ„þöꆄ‚öꆈþöcú¨†ˆ¦õ·ä†‹Ø’ÍþøôüÚcù¸†ˆ›„ßö؆ˆþöcø@†ˆ›cù\ì†ìò†ìò†ì†Òöc÷h†ˆ›»ì†ì†ì†Òöcö¬†ˆ›­ì†ì†Òöð†ƒùöƒùʆˆþöð†ƒùð†ƒùcõP†ˆ›‘Òöò†ƒù膃ˆñcô4†ˆ›»ì†ì†ì†Òöcó\†ˆ›»ì†ì†ì†Òöò†ƒùcòÀ†ˆ›‘Òöcñ膈›»ìò†ì†Òöcñd†ˆ›‘ÒöÞ“õþþøcïl†ˆ›cñì†ì†ì†c𠆋ˆ™ò†ÈòØöò†ƒùð†ƒùcî´†ˆ›‘Òöcî0†ˆ›ãöð†ƒùcê0†ƒˆúþŸcîƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöcꬆˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùö†üð†ƒù؆ˆþöð†ƒùc訆ˆ›»ì†ì†ì†Òöð†ƒùö†ücç܆ˆ›Ÿì†Òöc爛»ì†ìò†Òöcæ,†ˆ›»ìòò†Òöcå8†ˆ›µò†ì†ì†Òöc䈆ˆ›Ÿ‹á†Òöcâ †ƒˆúþŸcä|ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöc∆ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùö†üð†ƒùcà솈›§†ìòØöcßÀ†ˆ›cà´†ìò†ìò†ì†Òöˆ›‘ÒöcÞ¸†ˆ›‘ÒöcÞ4†ˆ›‘ÒöcÝ\†ˆ›»ì†ì†ì†Òöøƒùð†ƒùcÜl†ˆ›™ò†Òöð†ƒùcÚ\†ƒúþŸcÜDƒùà†„„þöꆄ‚öà†ˆþöcÚȆˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùò†ƒùð†ƒùcÙŒ†ˆ›‘Òöð†üˆ›‘óßöö†üð†ƒùð†ƒùð†ƒùc×°†ˆ›§†ì†ì†Òöö†ücÖȆˆ›»ì†ì†ì†ÒöcÖ(†ˆ›Ÿì†ÒöcÕxˆ›™†ì†óßöcÔ$†ˆ›cÕ\ìòòòòòò†óßöcÓ„†ˆ›Ÿì†ÒöcÒ<†ˆ›cÓtì†ì†ì†ì†ì†ìò†ÒöcѸ†ˆ›‘Òöð†ƒùcцˆ›„ßöcÐ@†ˆ›»ì†ì†ì†Òöð†ƒùcÏ„†ˆ›Ÿì†ÒöcÎ䆈›Ÿì†ÒöøƒùcΆˆ›­ì†ì†óßöð†ƒùcÍp†ˆ›‘ÒöcÌІˆ›Ÿì†Òöc̆ˆ›™†ìØö؆ˆþöcÊð†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöcɸ†ˆ›Ÿì†Òöð†üöüð†ƒùcÈ`†ˆ›½ê†‹áò†Òöò†ƒùcÇp†ˆ›»ì†ì†ì†ÒöcÆ|†ˆ›cÇ`ìòòò†ÒöcÅ܆ˆ›ŸìØöcņˆ›»ì†ìò†ÒööücÄd†ˆ›‘óßöcÃà†ˆ›‘Òöð†ƒùcÃ@†ˆ›‘óßöc¼†ˆ›‘Òöc†ˆ›­ìòØöð†ƒùð†ƒùò†ƒùc¿è†ƒŽúþŸcÁ¤ƒùꆄ‚öꆄ‚öꆈþöcÀP†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒùc¾À†ˆ›c¿¤ì†ì†ì†ì†Òöc¾†ˆ›™ò†Òöcº¨†ƒúþŸc½øƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöc»†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþö؆ˆþöö†üˆ›‘óßöc¸l†ˆ›c¹lì†ì†ìòò†Òöc·”†ˆ›»ìòò†Òöc¶ †ˆ›c·„ì†ìò†ì†Òö膃ˆñcµ,†ˆ›c¶dì†ì†ì†ìòò†ì†Òöð†ƒù脌ƒóƒùc±À„c´Øƒc±Ìƒšøc´hþŽþþc±êc´Tc±æþŸc´Dƒùc³ˆ†ˆ¦õ§ì†ëßþøc²,„c²Ôˆ¦õ§‹á†Êþc²8ˆ¦õ™‹c²DþøôüÚð†ƒù؆ˆþöc°€†ˆ›»ì†ì†ì†Òöc¯ü†ˆ›‘ÒöЈþöð†ƒùð†ƒùð†ƒùc®¬†ˆ›‘‹Çöð†ƒùc­Ô†ˆ›­ì†ì†Òöc­P†ˆ›‘Òöö†ü؆ˆþöö†üc¬(†ˆ›­ìò†Òöc«ˆ†ˆ›Ÿì†Òöñð†ƒùð†ƒùð†ƒùcªh†ˆ›‹†Òöð†ƒùc©t†ˆ›»ìòò†Òö脌ƒóƒùð†ƒùð†ƒùc¨T†ˆ›­ìò†Òöc§´†ˆ›Ÿì†Òöc¦À†ˆ›c§¤ìò†ì†ì†Òöc¤¨†ƒŽúþŸc¦´ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöc¥†ˆ¦õ·ä†‹Ø’ÍþøôüÜc¤†ˆ›ŸìØöc£0†ˆ›»ìòò†Òöö†üˆ›‘Òöc¡ü†ˆ›Ÿì†Òöc¡$†ˆ›§†ìò†Òöc  †ˆ›‘ÒöcŸä†ˆ›™†ìØö膃ˆñð†ƒùð†ƒùcžü†ˆ›‘Òöð†ƒùcž$†ˆ›­ì†ì†óßöc„†ˆ›Ÿì†ÒöcœX†ˆ›ctì†ì†ì†ìò†ì†Òööƒùc›€†ˆ›­ìò†Òöð†ƒùʆˆŸßöcš@†ˆ›™†ìØöc™h†ˆ›»ì†ì†ì†Òöc˜È†ˆ›Ÿì†Òöc—ü†ˆ›µì†ä†‹Çö؆ˆþöö†üð†ƒùc– †ˆ›c—L†ìò†ìò†ìò†ì†Òöc•Œˆ›‹†Òöc”p†ˆ›c•pìòòòò†Òöʆˆþöc’܆ˆ›c“øì†ìòò†ì†ìØöc’†ˆ›»ì†ì†ì†Òööƒùc‘,†ˆ›­ìò†Òöc¨†ˆ›ãöc´†ˆ›µòòò†óßöc†ˆ›Ÿì†Òöð†ƒùð†ƒùcŽ<†ˆ›Ÿì†Òöð†ƒùˆ›‘óßöð†ƒùcŒÄ†ˆ›­ìò†ÒöcŒ†ˆ›™†ì†Òöð†ƒùð†ƒùc‹0†ˆ›Ÿì†ÒöcЬ†ˆ›‘ÒöcŠ(†ˆ›‘Òöð†ƒùö†ü膃ˆñc‰0†ˆ›Ÿì†Òöð†ƒùö†üöƒùcˆ,†ˆ›­ìò†Òöò†ƒùð†ƒùð†ƒùc†Ø†ˆ›½ê†‹áò†Òöð†ƒùö†üö†ü؆ˆþöð†üð†ƒùò†ƒùc…(†ˆ›»ì†ì†ì†Òööƒùc„ˆ†ˆ›‘Òöc„†ƒˆˆ‹†ØcƒL†ˆ›­ìòØöð†ƒùð†ƒùc‚@†ƒˆˆcƒìò†ì†ì†Øc„†ˆ›™†ì†óßöð†ƒùð†ƒùc€t†ˆ›»ì†ì†ì†ÒöcÔ†ˆ›ŸìØöc@ˆ›Ÿì†Òöc~x†ˆ›™†ì†óßöc}0†ˆ›c~hìòòòòòò†óßöð†ƒùð†ƒùc|X†ˆ›Ÿì†Òöc{†ˆ›c|Hì†ì†ì†ì†ì†ìò†Òöð†ƒùczT†ˆ›‹†Òöcy|†ˆ›§†ì†ìØöcx4†ˆ›cylì†ì†ìò†ìòòØöð†ƒùö†üöƒùö†üò†ƒùcw†ˆ›­ì†ì†óßöcvL†ˆ›™ò†óßöð†ƒù脌ƒóƒùò†ƒùð†ƒùcu†ˆ›™†‹áØöñð†ƒùð†ƒùð†ƒùcsȆˆ›™ò†Òöð†ƒùò†ƒùcr¼†ˆ›»ì†ì†ì†Òöö†ücqð†ˆ›­ìò†ÒöcqP†ˆ›ŸìØööƒùð†ƒù膃ˆñcp†ˆ›§ò†ì†óßöð†ƒùð†ƒùð†ƒùcn膈›»ì†ì†ì†Òöcn†ˆ›»ì†ì†ì†Òö脌ƒóƒù؆ˆþöö†üö†üöƒùcl¬†ˆ›Ÿ‹á†Òöð†ƒùↃù脌ƒóƒùckT†ˆ›»ì†ì†ì†Òö脌ƒóƒùcjP†ˆ›»ì†ì†ì†Òöcix†ˆ›»ì†ì†ì†Òöð†ƒùö†ücht†ˆ›§†ìòØöcgH†ˆ›ch<†ìò†ìò†ì†ÒöÞ“õþþøð†ƒùö†üð†ƒùò†ƒùcf†ˆ›‘Òöce@†ˆ›»ìòò†Òöò†ƒùð†ƒùð†ƒùcd†ˆ›»ì†ì†ì†Òöccx†ˆ›Ÿì†ÒöÔˆþöð†ƒùcbx†ˆ›ãöca؆ˆ›‹†óßö膃ˆñð†ƒùð†ƒùò†ƒù؆ˆþöð†ƒùöƒùc`8†ˆ›Ÿì†Òöc_|†ˆ›™†ì†Òöð†ƒù膃ˆñð†ƒùc^@†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†ü؆ˆþöc\Ȇˆ›‘Òöˆ›ãö膃ˆñcYÔ†ƒúþŸc\ ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöcZ@†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üð†ƒùcXІˆ›»ì†ì†ì†Òöö†ücW̆ˆ›cX°ìò†ìò†Òöøƒù膃ˆñò†ƒù脌ƒóƒùøƒùð†ƒùcVŒ†ˆ›‘ÒöcV†ˆ›‘ÒöcUh†ˆ›‹†ÒöcTd†ˆ›‘‹ˆ­ì†ì†cT|ö؆ˆþöð†ƒùcS$†ˆ›»ì†ì†ì†ÒöcR„†ˆ›Ÿì†ÒöcQ†ˆ›cRtìò†ì†ì†Òöö†ü؆ˆþöcP„ˆ›™òØöcO؆ˆ›Ÿì†Òö؆“õþþøð†ƒùò†ƒùò†ƒùcN †ˆ›Ÿì†ÒöcN†ˆ›Ÿì†ÒöcM(†ˆ›§†ìò†ÒöcLl†ˆ›™†ìØöð†ƒùcJ¬†ƒúþŸcLDƒùꆄ‚öꆈþöcK†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒùøƒùcHü†ˆ›cJ(òòòòòòò†ÒöcH$†ˆ›»ìòò†Òöð†ƒùð†ƒùcFø†ˆ›cGÜì†ìò†ì†Òö؆ˆþöò†ƒùcE؆ˆ›­ì†ì†ÒöcE†ˆ›»ì†ì†ì†ÒöcD|†ˆ›‘Òöøƒùð†ƒùcCĆˆ›ãöð†ƒùð†ƒùcBø†ˆ›‘‹Çöc@†ˆ›cBèì†ä†‹á†c@Ć‹úþŸcBlƒùꆄ‚öꆈþöcA@†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ì†Òöð†ƒùð†üö†üö†ü脌ƒóƒùð†ƒùc>†ˆ›»ì†ì†ì†Òöc=à†ˆ›Ÿ‹á†Òöˆ›‘Òö؆“õþþøc|†ˆ›Ÿì†Òöb=܆ˆ›Ÿì†Òööƒùð†üb<”†ˆ›b=”ìòò†ì†ì†Òö膃ˆñb;Ȇˆ›Ÿì†Òöð†ƒùb; †ˆ›‹†Òöð†ƒùb:P†ˆ›‹†Òöð†ƒùò†ƒùb8@†ƒˆúþŸb:ƒùꆄ‚öꆄ‚öꆆöb8¼†ˆ¦õ·ä†‹Ø’ÍþøôüÒb6´†ƒˆúþŸb84ƒùꆈþöb70†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù؆“õþþøb5t†ˆ›»ì†ì†ì†Òöð†ƒùò†ƒùöƒùb4 †ˆ›‘Òöð†ƒùb3¬†ˆ›§†ìò†Òöb3(†ˆ›ãöb2ˆ†ˆ›Ÿì†Òöb1̆ˆ›™ò†Òöò†ƒùb0܆ˆ›»ìòò†Òöb0 †ˆ›­ì†ì†Òö؆“õþþøb/P†ˆ›‘Òöb.°†ˆ›Ÿì†Òöò†ƒù؆ˆþöb-†ˆ›­ìò†ÒöÞ“õþþøð†ƒùb,”†ˆ›‘‹Çöʆˆþöð†ƒùb+8†ˆ›§†ì†ì†óßöö†ü؆ˆþöb*†ˆ›»ì†ì†ì†Òöb)€†ˆ›‘Òö؆ˆþöñò†ƒùð†ƒùʆˆþöb&ȆƒúþŸb(`ƒùꆄ‚öꆆöb'4†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒùö†üò†ƒùb%”†ˆ›»ì†ì†ì†Òöb$؆ˆ›­ì†ì†Òöb$ ˆ›»ìòò†óßöb#`†ˆ›Ÿì†óßöb"¤†ˆ›™ò†Òö؆“õþþøØ†“õþþøb!l†ˆ›‹†Òöb ”†ˆ›»ì†ì†ì†Òöb¼†ˆ›»ìò†ì†Òööƒùb䆈›™†ì†óßöð†ƒùð†ƒù؆ˆþö؆ˆþöbt†ˆ›Ÿì†ÒöbÔ†ˆ›Ÿì†Òöbp†ˆ›bœ†ìò†ìò†ìò†ì†ÒöÞ“õþþøb„†ˆ›‹ùßöð†ƒùb<†ƒˆúþŸb\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöb¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùb0†ƒˆúþŸbƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöb¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒb¬†ˆ›‘Òöð†ƒùb¸†ˆ›§ò†ì†Òöbà†ˆ›§†ì†ì†Òöb솈›µ†ìòò†Òöb†ˆ›»ì†ì†ì†Òöð†ƒùb †ˆ›»ì†ì†ì†Òöö†üö†üb(†ˆ›»ì†ì†ì†ÒöbP†ˆ›»ì†ì†ì†Òöb  ˆ›™†ì†Òöb ؆ˆ›­ìòùßöb 8†ˆ›‹Øöð†ƒùʆˆþö膃ˆñb „†ƒˆúþŸb |ƒùꆄ„þöꆄ„þöꆄ‚öꆆöb †ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùb”†ˆ›»ì†ìòØö؆“õþþøØ†“õþþøð†ƒùb@†ˆ›Ÿì†Òöb †ˆ›Ÿì†Òöb ˆ›Ÿìùßöð†ƒùb†ƒˆúþŸb؃ùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöb †ˆ¦õ·ä†‹Ø’ÍþøôüÒbÔ†ˆ›™†ì†óßöð†ƒùò†ƒùð†ƒùð†ƒùb䆈›ãö؆“õþþøò†ƒùð†ƒùöƒùbĆˆ›‘óßöaÿ´†ˆ›bŒ†ìòò†ì†Òöð†ƒùaþ܆ˆ›­ì†ì†Òöö†üð†ƒùò†ƒùaüô†ƒúþŸaþŒƒùꆄ„þöꆆöaý`†ˆ¦õ·ä†‹Ø’ÍþøôüÚaü8†ˆ›­ì†ì†Òöaû`†ˆ›»ì†ì†ì†Òöaúˆ†ˆ›»ì†ì†ì†Òöaù°†ˆ›»ì†ì†ì†ÒöaøØ†ˆ›»ì†ì†ì†Òöð†ƒùaî„“¼aïÄŠ˜aöa÷À˜þ––’êêêaöŒ–˜þ––’êêêað˜aôTaõ„˜þ––’êêêaôP–˜þ––’êêêað0˜aòaóH˜þ––’êêêaò–˜þ––’êêêað\˜añd––’êêaðˆ–––’êêaï¼aïaï¤þøþaî”›Ÿì†ÒöaìH†ƒúþŸaîlƒùꆄ„þöà†„„þöà†„„þöà†ˆþöaì´†ˆ¦õ·ä†‹Ø’ÍþøôüÚa먆ˆ›‹†Òöð†ƒùaê´†ˆ›»ìòò†ÒöaéÀ†ˆ›aê¤ì†ìòò†Òöò†ƒùð†ƒùaè´†ˆ›§†ìòØöò†ƒùaçĆˆ›»ì†ì†ì†Òöò†ƒùaç †ˆ›Ÿì†Òöaæl†ˆ›Ÿì†Òöa唆ˆ›»ì†ì†ì†Òöaäô†ˆ›Ÿì†Òöʆˆþööƒùð†ƒùö†üaã4†ˆ›aä4ìò†ìòò†Òöð†ƒùaâ@†ˆ›»ì†ì†ì†Òöaáh†ˆ›»ì†ì†ì†Òöò†ƒùˆ›‘Òöð†ƒùð†ƒùð†ƒùaÞ܆ˆ›aàhì†ì†ìò†ìò†ì†ì†ì†ì†Òö膃ˆñaÝØ†ˆ›»ìò†ì†ÒöaÝT†ˆ›‘Òöò†ƒùð†ƒùö†üö†üð†ƒùaØ0†ˆ›‘‹šøaÜxþŽþþaØÒaÜdaØÎþŸaÜTƒùaÛ´†ˆ¦õ™ÊþøaÛ †ˆ¦õ™ÊþøaÚp†ˆ¦õ§ì†ëßþøaÙ„aÙ¼ˆ¦õ§‹á†ÊþaÙ ˆ¦õ™‹aÙ,þøôüaØHöa×X†ˆ›»ì†ì†ì†Òööƒùò†ƒùò†ƒùaÖP†ˆ›­ìò†ÒöaÕ”†ˆ›­ìò†ÒöaÕ†ˆ›‘Òöð†ƒùò†ƒùaÓ<†ƒŽúþŸaÔЃùꆄ‚öꆆöaÓ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üò†ƒùð†ƒù؆ˆþöaÑĆˆ›aÒœì†ì†ä†‹Çöö†üaÐ4†ˆ›aÑ|†ì†ìò†ìò†ìòò†Òöaφˆ›aÐ$ì†ì†ì†ìò†ì†ÒööüaΆˆ›»ìòò†óßöaÍt†ˆ›‹†ÒöaÌÔ†ˆ›Ÿì†óßöð†ƒùaË †ƒˆaÌ€ò†ì†ì†ì†ìòùíaÊ䆈›™†ì†Òöð†ƒùö†ü脌ƒóƒùaÉ´†ˆ›»ì†ì†ì†ÒöaÈø†ˆ›™ò†ÒöaÈ<†ˆ›­ìò†Òööƒùð†ü膃ˆñð†ü膃ˆñaÆà†ˆ›§ä†‹ÇöaÆ@†ˆ›Ÿì†ÒöaÄ܆ˆ›aƆìò†ìò†ìò†ì†ÒöüüaÄH†ˆ›‘Òöò†ƒù؆ˆþööƒùð†ƒùð†ƒùò†ƒùò†ƒùaÂ܆ˆ›‘ÒöaÁ̆ˆ›a¤†ìò†ì†ì†Òöö†üaÀ䆈›»ì†ì†ì†Òöö†üa½Œ†ƒúþŸaÀȃùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöa½ø†ˆ¦õ·ä†‹Ø’ÍþøôüÚaº8“¼a»xŠ–˜a½\a¼Ì‚ˆ–’êêa¼0‚ˆ–’—ÓêØü–üa»paºÐa»XþøþaºH›Ÿì†Òöö†üð†ƒùð†ƒùa¸Ô†ˆ›a¹Ôìòò†ì†ì†Òöa¶†ƒúþŸa¸Èƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆈþöa¶ü†ˆ¦õ·ä†‹Ø’ÍþøôüÚa¶ †ˆ›‘óßöð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùð†ƒùa³°†ˆ›aµXì†ì†ì†ì†ì†ì†ìòòò†ì†Òöüüð†ƒùa³†ˆ›‘Òöð†ƒùa² †ˆ›§†ìò†Òöö†ü؆“õþþøè„Œƒóƒùa°ä†ˆ›Ÿì†Òöʆˆþöa¯À†ˆ›­ìò†Òöüüa¯,†ˆ›ãöð†ƒùö†üö†üö†üö†üˆ›ãöa­ †ˆ›a®<ì†ì†ìòò†ì†Òöa¬H†ˆ›»ìòò†Òöa«|†ˆ›µä†‹á†Òöaªø†ˆ›‘óßöð†ƒù膃ˆñò†ƒùa©À†ˆ›»ì†ì†ì†Òöa© †ˆ›Ÿì†Òöö†üÔˆþöð†ü膃ˆña¦Ì†ˆ›a¨Xì†ì†ìò†ìò†ì†ì†ì†ì†Òöa¥ô†ˆ›§òò†Òö膃ˆña¤ð†ˆ›»ìò†ì†Òöa£ü†ˆ›µ†ìòòØöö†ü؆ˆþö脌ƒóƒùa¢œ†ˆ›»ì†ì†ì†Òöa¡ü†ˆ›Ÿì†Òöa Ü†ˆ›a¡ìì†ì†ì†ìꆋÇöa †ˆ›»ì†ì†ì†ÒöaŸ,†ˆ›»ì†ì†ì†Òöüüaž|†ˆ›‹†Òöa܆ˆ›Ÿì†ÒöaX†ˆ›ãöð†ƒùaœ€†ˆ›­ìò†Òöð†ƒùa›à†ˆ›‘Òöa™d†ƒˆúþŸa›Ôƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöa™à†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùa˜t†ˆ›»ì†ì†ì†Òöò†ƒùa–h†ƒúþŸa˜Pƒùꆄ„þöꆄ„þöꆄ„þöꆆöa–Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùa•°†ˆ›Ÿì†Òöa”؆ˆ›§ò†ì†Òöa”Hƒˆˆ­ìò†Øð†ƒùa“H†ˆ›»ìòò†Òöa’T†ˆ›a“8ì†ìòò†Òö؆ˆþöa‘h†ˆ›Ÿì†ÒöaȆˆ›Ÿì†Òöˆ›‘Òö؆“õþþøa<†ˆ›™ò†ÒöaĆƒŽúþŸa0ƒùꆆöaŽ,†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùa‹T†ƒˆúþŸaœƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöa‹Ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒaŠD†ˆ›a‹Dìò†ìòò†Òöa‰P†ˆ›aŠ4ì†ìò†ì†Òöaˆx†ˆ›»ì†ì†ì†Òöa‡¼†ˆ›­ì†ì†Òöò†ƒùöƒùʆˆþöð†ƒùð†ƒùð†ƒùò†ƒù؆ˆþöö†üa…,†ˆ›a† †ìò†ìò†ì†Òöüüaƒ@†ƒˆúþŸa…ƒùꆄ‚öꆄ‚öꆆöaƒ¼†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùa‚P†ˆ›§òòùßöăˆ›‘óßöa€ô†ˆ›»ì†ìò†Òöa䆈›a€¼†ìòò†ì†Òöð†ƒùð†ƒùò†ƒùö†üa~Ȇˆ›­ì†ì†Òö脌ƒóƒùa}Ćˆ›»ì†ì†ì†Òöa}†ˆ›­ì†ì†Òöð†ƒùò†ƒùa{ü†ˆ›»ì†ì†ì†Òöñ膃ˆñ膃ˆñ膃ˆñazX†ˆ›µ†ìòò†Òöay€†ˆ›»ì†ì†ì†Òöð†ƒùüüð†ƒùax˜†ˆ›‹Øöaw܆ˆ›­ìòùßöaw†ˆ›»ìòò†Òöò†ƒùavh†ˆ›ãöau䆈›‘Òöasà†ƒˆúþŸau؃ùꆄ„þöꆄ„þöꆄ‚öꆆöat\†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùö†ü؆ˆþöaq@†ƒúþŸasP„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöaq¬†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùöüap0†ˆ›§†ì†ì†Òöö†üaoH†ˆ›»ì†ì†ì†Òöan¨†ˆ›Ÿì†Òööƒùð†ƒùam˜†ˆ›»ì†ì†ì†Òöal¤†ˆ›amˆì†ì†ìò†Òöak̆ˆ›»ì†ì†ì†Òöajô†ˆ›»ì†ì†ì†ÒöajT†ˆ›Ÿì†Òööƒù膃ˆñð†ƒùð†ƒùaf°†ƒˆšøaihþŽþþafêaiTafæþŸaiDƒùahˆ†ˆ¦õ§ì†ëßþøag,„agÔˆ¦õ§‹á†Êþag8ˆ¦õ™‹agDþøôüÒöƒùae؆ˆ›­ì†ìØöð†ƒùð†ƒùð†ƒùac¨†ƒˆúþŸaexƒùꆄ‚öꆄ‚öꆈþöad$†ˆ¦õ·ä†‹Ø’ÍþøôüÒaa †ˆ›Ÿ‹úþŸacœƒùꆄ‚öà†„„þöà†ˆþöab †ˆ¦õ·ä†‹Ø’ÍþøôüÂØöð†ƒùð†ƒù膃ˆña_¬†ˆ›a`¬ì†ìò†ìòØöò†ƒùö†ü؆ˆþöa^`†ˆ›§†ì†ì†Òöøƒùa]Ćˆ›‘Òöa]@†ˆ›‘Òöa\¼†ˆ›‘óßö؆ˆþöò†ƒùð†ƒùa[€†ˆ›­ìò†Òöøƒùð†ƒùð†ƒùð†ƒùò†ƒùaZ†ˆ›»‹áò†ìØö膃ˆñaYH†ˆ›Ÿì†Òöð†ƒùaXŒ†ˆ›ŸìØöò†ƒùaWð†ˆ›‘ÒöaW†ˆ›§òò†ÒöÞ“õþþøð†ƒùaV†ˆ›‹†Òöð†ƒùaUT†ˆ›‹Øöò†ƒùð†ƒùaTd†ˆ›­ì†ì†ÒöaSĆˆ›‹†óßöaR솈›»ì†ì†ì†ÒöaN\†ˆ›aR´aNĆ‹šøaRHþŽþþaNþaR4aNúþŸaR$ƒùaQL†ˆ¦õ¡ò†ÊþøaPœ†ˆ¦õ§ì†ëßþøaO@„aO舦õ§‹á†ÊþaOLˆ¦õ™‹aOXþøôüaNtöò†ƒùaMl†ˆ›»ì†ì†ì†ÒöaL”†ˆ›»ì†ì†ì†ÒöaK؆ˆ›­ì†ì†Òöö†üö†üöƒùð†ƒùò†ƒùaJ䆈›‘ÒöaI@†ƒúþŸaJ؃ùꆄ‚öꆆöaI¬†ˆ¦õ·ä†‹Ø’ÍþøôüÚaH„†ˆ›­ì†ìØöð†ƒùð†ƒùaG<†ˆ›aH<ì†ì†ì†ì†ì†Òöð†ƒùaF†ˆ›aFèò†ì†ìò†Òööƒù膃ˆñaDP†ƒŽúþŸaE¼ƒùꆆöaD¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùò†ƒùaC †ˆ›aCðìò†ì†ìØöð†ƒù؆ˆþöaĂˆ›»ì†ì†ì†ÒöaAH†ˆ›‘Òö؆ˆþöa@$†ˆ›»ì†ìò†Òöøƒùð†ƒùa?l†ˆ›„ßöa>˜†ƒˆˆµòòò†Øa>†ˆ›‘óßö膃ˆña=H†ˆ›‹†Òöð†üð†ƒùò†ƒùa< †ˆ›»ì†ì†ì†Òöð†ƒùa;d†ˆ›Ÿì†Òöa:Œ†ˆ›»ì†ì†ì†Òöa9솈›Ÿì†Òöð†ƒùð†ƒùa8ø†ˆ›­ìò†Òöa8Hˆ›™†ì†Òöʆˆþöð†ƒùð†ƒùa6ü†ˆ›Ÿì†Òöð†ƒùa5,†ƒˆúþŸa6Ôƒùꆄ„þöꆈþöa5¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒa4T†ˆ›»ì†ìò†Òöð†ƒùa1à†ƒŽúþŸa4,ƒùa3@†„„‰ˆa4ì†ì†ìò†Üöꆈþöa2H†ˆ¦õ·ä†‹Ø’ÍþøôüÜa1†ˆ›§†ì†ì†óßö膃ˆñð†ƒù脌ƒóƒùa/¼†ˆ›»ì†ì†ì†Òöa.䆈›»ì†ì†ì†Òöa. †ˆ›»ìòò†Òöñð†üa,솈›»ì†ì†ì†Òöò†ƒùð†ƒùa,ˆ›­ìò†Òöð†ƒùa+†ˆ›§ò†ì†Òöa*L†ˆ›­ì†ì†Òöa)t†ˆ›»ì†ì†ìØöò†ƒùò†ƒùð†ƒùö†üð†ƒùð†ƒùa'Іˆ›a(Ðìòòò†ì†Òöa&ø†ˆ›»ì†ì†ì†Òöö†üˆ›‘Òöa$8†ƒˆúþŸa&Xƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöa$´†ˆ¦õ·ä†‹Ø’ÍþøôüÒa#(†ˆ›a$†ìòòò†Òöa"l†ˆ›­ìò†Òöa!”†ˆ›»ì†ìòØöö†üa!†ˆ›‘Òöa D†ˆ›­ìò†Òöò†ƒùaІƒˆúþŸa ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöaL†ˆ¦õ·ä†‹Ø’ÍþøôüÒal†ˆ›aÀì†ì†ì†ì†ìò†ìò†Òöøƒùa܆ƒúþŸaHƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöa†ˆ‘úþŸalˆþöa†ˆ¦õ·ä†‹Ø’ÍþøôüþàöaH†ˆ¦õ·ä†‹Ø’ÍþøôüÚaX†ˆ›‘Òöa†ƒŽúþŸaLƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöa€†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùa@†ˆ›Ÿì†Òöa¼†ˆ›‘Òö膃ˆñaÔ†ˆ›­ìò†óßöa†ƒúþŸaȃùꆄ‚öꆄ‚öꆄ‚öa€†„„‰ˆ»ì†ìò†óéöꆈþöaˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üax†ˆ›‘‹Çö脌ƒóƒùa t†ˆ›»ì†ì†ì†Òöö†üa Ćˆ›Ÿì†Òö膃ˆña †ˆ›‘Òöa <†ˆ›»ì†ìò†Òöö†üöƒù膃ˆñ؆ˆþöa ø†ˆ›Ÿì†Òöa †ˆ›»ì†ì†ì†ÒöÞ“õþþøð†ƒùò†ƒùð†ƒùaȆˆ›­ì†ì†Òö؆“õþþøØ†“õþþøØ†“õþþøè„Œƒóƒùaà†ˆ›»ì†ì†ì†Òöö†üa0†ˆ›Ÿì†Òööƒùð†ƒùat†ˆ›‘Òöa¸†ˆ›­ì†ìØöð†ƒùð†ƒùa¤†ƒŽúþŸatƒùà†„„þöꆄ‚öꆆöa †ˆ¦õ·ä†‹Ø’ÍþøôüÜa †ˆ›‘óßö膃ˆñö†ü`ÿÔ†ˆ›a¬ò†ì†ìò†Òöñ`þІˆ›§†ì†ì†Òöö†ü؆“õþþøö†ü`ýŒ†ˆ›»ì†ì†ì†Òö`ü솈›Ÿì†Òö؆ˆþö`û䆈›­ì†ì†Òö`ûD†ˆ›Ÿì†Òööƒù`úˆ†ˆ›ŸìØö`ù°†ˆ›»ìòò†Òö`ù†ƒˆˆ™†ì†Øö†ü`öˆ†ƒˆúþŸ`øøƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆö`÷†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù`õ”†ˆ›»ì†ì†ì†Òö`ô¼†ˆ›»ì†ìò†Òöö†ü`óÔ†ˆ›§òò†Òööƒù`󆈛Ÿì†Òö`ò\†ˆ›­ì†ì†Òö膃ˆñ`ðh†ƒŽúþŸ`ò$ƒùꆄ‚öꆄ‚öꆆö`ðІˆ¦õ·ä†‹Ø’ÍþøôüÜ`ïȆˆ›Ÿì†Òö`í°†ƒŽúþŸ`#ùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆö`¦õ·ä†‹Ø’ÍþøôüÜð†ƒù`ëP†ƒúþŸ`툃ùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö`뼆ˆ¦õ·ä†‹Ø’ÍþøôüÚ`ê\†ˆ›`ë@ì†ì†ì†ì†Òöð†ƒù`èø†ˆ›`ê0ìò†ìò†ì†ì†ì†ÒöÞ“õþþøð†ƒù`çÔ†ˆ›­ì†ìØö`åø†ƒˆúþŸ`çȃùꆄ‚öꆄ‚öꆈþö`æt†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù膃ˆñò†ƒù`䈆ˆ›`åˆì†ìò†ìòØöð†ƒù`ã̆ˆ›Ÿì†Òö`â †ˆ›`㔆ìò†ì†ì†ì†Òöö†ü膃ˆñöü`áĆˆ›‘Òö`á$†ˆ›‹†Òöð†ƒù`àL†ˆ›­ì†ì†Òöö†ü`Ø„`à0ƒ`Ø$ƒšø`ßÀþŽþþ`ØB`ÛÌø`ßPþŽþþ`Ûê`ß<`ÛæþŸ`ß,ƒù`Þ8†ˆ¦õ`ßì†ìò†Êþø`݈†ˆ¦õ§ì†ëßþø`Ü,„`ÜÔˆ¦õ§‹á†Êþ`Ü8ˆ¦õ™‹`ÜDþøôü`Ø>þŸ`Û¼ƒù`Ú†ˆ¦õ`Û ì†ì†ì†ìò†Êþø`Ùà†ˆ¦õ§ì†ëßþø`Ø„„`Ù,ˆ¦õ§‹á†Êþ`؈¦õ™‹`ØœþøôüÚ脌ƒóƒù`×h†ˆ›‘Òö`Ö†ˆ›»ì†ì†ì†Òö`Õd†ˆ›`Ö€ì†ì†ìòòò†Òö`Ô¨†ˆ›­ì†ì†Òö`Ô†ˆ›Ÿì†Òöö†ü`ÓX†ˆ›ŸìØöˆ›ãö`ÒP†ˆ›‘Òöð†ƒù`Ñ@†ˆ›`Ò$ì†ì†ì†ì†Òöð†ƒù؆ˆþö`Ð8†ˆ›Ÿì†Òö`Ϙ†ˆ›Ÿì†Òö`ˆƒŽúþŸ`ÏŒƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö`Ë|†ˆ¦õ·ä†‹Ø’Íþøôü܈›‘óßöʆˆŸßöð†üð†üð†ƒùð†ƒù`Ɇˆ›Ÿì†Òö`Èx†ˆ›Ÿì†Òö`Ǽ†ˆ›­ì†ì†Òö؆ˆþöð†ƒùð†ƒùö†ü`Æl†ˆ›­ì†ì†Òöð†ƒù`Å\†ˆ›`Æ@ìò†ì†ì†Òöò†ƒùöƒù膃ˆñ`Ä\†ˆ›Ÿì†Òö`ü†ˆ›Ÿì†Òöð†ƒù`Át†ƒŽúþŸ`Ôƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†ˆþö`Á܆ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒù؆ˆþö`Àl†ˆ›‘Òöð†ü`¿¼ˆ›Ÿì†Òö`¾ô†ˆ›­ìò†Òö`½†ƒˆúþŸ`¾èƒùꆄ‚öꆄ‚öꆆö`½”†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù`¼$†ˆ›§ò†ì†ÒöƆƒˆŸì†à`ºÜ†ˆ›»ì†ì†ìØöð†ƒù膃ˆñð†ƒùò†ƒù膃ˆñ؆“õþþø`¹†ˆ›»ì†ì†ì†Òöñð†üð†ƒù`¸ †ˆ›Ÿì†Òö`¶l†ƒŽúþŸ`¸ƒùꆄ‚öꆈþö`¶Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÜ`µ”†ˆ›»ì†ì†ì†Òö`´¼†ˆ›»ì†ì†ì†Òö`³ä†ˆ›»ì†ì†ì†Òö`³ †ˆ›»ì†ì†ì†Òöö†üò†ƒùð†ƒù`±d†ˆ›`²¸ì†ì†ì†ì†ìò†ìò†Òö`°|ˆ›`±Tì†ì†ì†ì†Òö`¯Ð†ˆ›‹†Òöð†ƒùð†ƒùð†ƒùð†ƒùð†ƒù`¬Ü†ƒˆúþŸ`¯8ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆆö`­X†ˆ¦õ·ä†‹Ø’ÍþøôüÒ`¬<†ˆ›Ÿì†Òö`«¸†ˆ›‘Òöð†ƒùð†ƒùò†ƒùò†ƒù`ªÄ`«Dƒ`ªÈƒŠþŸŒƒùôüÚ`©ä†ˆ›»ì†ì†ì†Òö`© †ˆ›»ì†ì†ì†Òö`¨4†ˆ›»ì†ì†ì†Òö`§”†ˆ›Ÿì†Òööƒùð†ƒùò†ƒù`¦P†ˆ›`§4ìò†ì†ìØö`¥´†ƒˆˆ™†ì†Ø`¤Ü†ˆ›»ì†ì†ì†Òöö†ü`£äˆ›`¤¼ì†ì†ì†ì†Òö`¢L†ƒˆúþŸ`£Ìƒùꆆö`¢È†ˆ¦õ·ä†‹Ø’ÍþøôüÒ`¡°†ƒˆˆ­ì†ì†Øò†ƒù`¡†ˆ›‘óßö` t†ˆ›‹†Òö`ŸL†ƒˆˆ` dì†ì†ìò†ì†ìò†Ø`žt†ˆ›»ì†ì†ì†Òö`œ†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒùüüð†ƒùö†üð†ƒùʆˆŸßöð†ƒù`œ†ˆ›‘óßö`›€†ˆ›‘óßöò†ƒù`š€†ˆ›‹†‹ˆ‘`š˜ö`™à†ˆ›‹†Òö`™0†ˆ›Ÿ‹áØöò†ƒùò†ƒùö†ü`˜†ˆ›»ì†ì†ì†Òö؆ˆþö`— †ˆ›Ÿ‹ˆÙØö`–4†ˆ›»ì†ì†ì†Òö`•”†ˆ›Ÿì†Òö`”¼†ˆ›»ì†ì†ì†Òö`“䆈›§†ìò†ÒöʃˆŽü˜þò„þÝ`’솈›‘Òö`’h†ˆ›ãö`‘Ȇˆ›Ÿì†Òö`Ćˆ›`‘¨‹áò†ìò†Òö膃ˆñ`ŽT†ƒúþŸ`Œƒùꆄ„þöꆄ‚öꆄ‚öà†„„þöà†ˆþö`ŽÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`œ†ƒˆˆ»ìò†ì†Ø`ŒÄ†ˆ›§ò†ì†óßöð†ƒùò†ƒù`‡,†ˆ›‘‹šø`Œ$þŽþþ`‡Î`Œ`‡ÊþŸ`Œƒù`‹D†ˆ¦õ§ì†Êþø`а†ˆ¦õ™Êþø`Іˆ¦õ™Êþø`‰l†ˆ¦õ§ì†ëßþø`ˆ„`ˆ¸ˆ¦õ§‹á†Êþ`ˆˆ¦õ™‹`ˆ(þøôü`‡Dö؆ˆþö`†0ˆ›™†ì†Òö`…„†ˆ›‹†óßö`„Ȇˆ›­ì†ì†Òö`€ †ƒúþŸ`„¼ƒùꆄ„þö`H†ˆ‘úþŸ`„|ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö`À†ˆ¦õ·ä†‹Ø’ÍþøôüÞö`€x†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`†ˆ›`üì†ìòò†Òö膃ˆñ膃ˆñ`|䆃ŽúþŸ`~´ƒùꆄ‚öꆄ‚öà†ˆþö`}L†ˆ¦õ·ä†‹Ø’ÍþøôüÜ`{¸†ˆ›`|Ôì†ì†ì†ì†ì†ìØöð†ƒùð†ƒù`zĆˆ›­ì†ì†Òö`y솈›»ì†ì†ì†Òö`y†ˆ›»ì†ì†ì†Òö`x<†ˆ›»ìòò†Òöøƒùò†ƒù`w†ˆ›`wüìòò†ì†Òö`v”†ˆ›‘óßöʆˆþö`uŒ†ˆ›Ÿì†Òö`t(†ˆ›`u|ì†ì†ì†ì†ìòò†ì†Òöð†ƒù`sP†ˆ›­ìò†óßö`r”†ˆ›­ì†ìØö`q„†ˆ›`r„ì†ìò†ì†ì†Òö脌ƒóƒù`pd†ˆ›`qHì†ìò†ì†Òööƒùò†ƒù`ot†ˆ›™†ì†Òöò†ƒùð†ƒù؆ˆþöð†ƒù`n8†ˆ›Ÿì†Òö`m(†ˆ›`n(ì†ì†ìò†ì†Òö`l¤†ˆ›‘Òö`k膈›™†ì†Òö`k8ˆ›­ìòùßö`iP†ƒˆúþŸ`k ƒùꆄ‚öꆄ‚öꆈþö`ĭˆ¦õ·ä†‹Ø’ÍþøôüÒ`h”†ˆ›­ì†ì†Òöð†ƒùð†ƒùò†ƒùò†ƒù`gT†ˆ›»ì†ì†ìØö؆ˆþöö†ü`f †ˆ›»ì†ì†ì†Òö`eœ†ˆ›‘Òö`dü†ˆ›‹†óßööƒù`a´†ƒúþŸ`dÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚ö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆈þö`b †ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù``ø†ˆ›Ÿì†óßö``<†ˆ›­ì†ì†Òö`R„†ƒŽúþŸ``0ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚ö`T̆„„‰úþŸ`_Pƒùꆄ‚ö`\¼†„„‰úþŸ`_ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆈþö`]D†ˆ¦õ·ä†‹Ø’ÍþøôüÖö`Y$†„„‰úþŸ`\°ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöↄ„‰õöꆄ„þöꆄ‚öↈ‰õö`Y¬†ˆ¦õ·ä†‹Ø’ÍþøôüÖö`V$†ˆ‰úþŸ`Yƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþö`V¬†ˆ¦õ·ä†‹Ø’ÍþøôüÖö`UT†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöƆ„„‰ˆ‘Üöꆄ‚öꆄ‚öꆆö`R솈¦õ·ä†‹Ø’ÍþøôüÜ`QX†ˆ›`Rtì†ì†ì†ìò†ìØö`P¸†ˆ›Ÿì†Òö؆ˆþö膃ˆñ`O †ˆ›ŸìØö`NX†ˆ›`Oì†ìòòòòò†ÒöÞ“õþþøð†ƒù`K †ƒúþŸ`Mäƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö`Kx†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`IĆˆ›`JÔ†ì†ì†ì†ìòò†Òöð†ƒù؆ˆþö`H„†ˆ›»ì†ì†ì†Òö`G¸ˆ›»ìò†ì†Òö`F¸†ˆ›µòòò†Òöð†ƒùö†ü`E`†ˆ›`F|ìò†ì†ì†ì†ì†Òö`Ap„`ETƒ`A|ƒšø`DäþŽþþ`Aš`DÐ`A–þŸ`DÀƒù`C膈¦õµì†ì†Êþø`C8†ˆ¦õ§ì†ëßþø`AÜ„`B„ˆ¦õ§‹á†Êþ`A舦õ™‹`AôþøôüÚ`@˜†ˆ›»ì†ì†ì†Òö؆ˆþö`?t†ˆ›»ì†ì†ì†Òö`>ð†ˆ›‘Òö`>†ˆ›»ìòòØööƒù`=x†ˆ›‘Òö脌ƒóƒù؆ˆþö`<(†ˆ›»ìòò†Òö`:¨†ˆ›`<ì†ì†ìòòòòòò†Òöñð†ƒù`9P†ˆ›`:(òòò†ì†óßö`8°†ˆ›Ÿì†Òö`3`†ˆ›`8 ì`3Ȇ‹šø`8 þŽþþ`4`7ø`3þþŸ`7èƒù`7†ˆ¦õµ‹áò†Êþø`6P†ˆ¦õ§ì†Êþø`5 †ˆ¦õ§ì†ëßþø`4D„`4숦õ§‹á†Êþ`4Pˆ¦õ™‹`4\þøôü`3xö`2À†ˆ›Ÿì†Òö`2 †ˆ›Ÿì†Òööüò†ƒù`1L†ˆ›‹ùßö`0†ˆ›™†ìØö膃ˆñ`/Ćˆ›Ÿì†Òö膃ˆñ膃ˆñ`.膈›‘Òö`.H†ˆ›Ÿì†Òö`-¨†ˆ›Ÿì†Òö`,Іˆ›»ìòòØö`+ø†ˆ›§†ìò†Òööƒùð†ƒù`+<†ˆ›‘Òö`*¸†ˆ›‘Òö`)à†ˆ›»ì†ì†ì†Òöˆ›‘Òö`(؆ˆ›‘Òö`'Ȇˆ›`( †ìò†ì†ì†Òö`%ü†ƒúþŸ`'¼ƒùꆄ„þöꆄ‚öꆈþö`&h†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`%\†ˆ›Ÿì†óßö̆ƒˆˆ‘Ø`$X†ˆ›Ÿì†Òö`#¸†ˆ›Ÿì†Òö`"à†ˆ›»ìò†ì†Òö`"†ˆ›»ìò†ì†Òööƒù`!X†ˆ›™ëŠÕöò†ƒù脌ƒóƒù` †ˆ›‘Òö`p†ˆ›` X†ä†‹á†ì†ì†Òö`ô†ƒúþŸ`dƒùꆆö``†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù脌ƒóƒù`Ô†ˆ›»ì†ì†ì†Òö`ü†ˆ›»ì†ì†ì†Òö`$†ˆ›»ì†ì†ì†Òö؆ˆþöö†ü`ð†ˆ›»ìòòØö`ü†ˆ›`àìò†ìò†Òöøƒùò†ƒùð†ƒùð†ƒùð†ƒù`†ƒŽúþŸ`lƒùꆈþö`h†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù`Ô†ˆ›`¬†ì†ì†ì†ì†Òö`†ˆ›­ì†ì†Òö`@†ˆ›»ì†ìò†Òö脌ƒóƒù؆ˆþöö†üð†ƒùö†ü`솈›Ÿì†óßööƒùð†ƒù`†ˆ›‹†Òö`†ˆ›‘Òö`Ô†ˆ›­ì†ì†Òö`¨†ˆ›`œ†ì†ìòòòØöð†ƒùð†ƒù`D†ˆ›``ì†ì†ì†ìò†ìØö` ¤†ˆ›Ÿì†Òöö†ü` †ˆ›‘Òö؆ˆþöö†ü` ܆ˆ›»ì†ì†ì†Òö` <†ˆ›Ÿì†Òö` d†ˆ›»ì†ì†ì†Òöö†ü` ´†ˆ›ŸìØöñ`̆ˆ›™†ì†Òö`H†ˆ›‘Òöö†ü脌ƒóƒùöƒùð†üò†ƒù`†ˆ›Ÿì†Òöð†ƒùð†ƒù`(†ˆ›™†ì†Òöò†ƒùð†ƒù`ˆ†ƒúþŸ`èƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö`ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒù_þ4†ˆ›`$ì†ìò_þœ†‹šø`XþŽþþ_þÖ`D_þÒþŸ`4ƒù`$†ˆ¦õ`ì†ìòò†Êþø`t†ˆ¦õ§ì†ëßþø_ÿ„_ÿÀˆ¦õ§‹á†Êþ_ÿ$ˆ¦õ™‹_ÿ0þøôü_þLöö†ü_ýL†ˆ›»ì†ì†ì†Òöð†ƒù_ü<†ˆ›µ†ì†ìò†Òö_ûd†ˆ›»ì†ìò†Òö_úІˆ›‘‹Çö_ú ˆ›­ìòùßö_ùX†ˆ›­ì†ì†Òöò†ƒù_øh†ˆ›»ì†ì†ìØö_÷†ˆ›»ì†ì†ì†Òö_ö¸†ˆ›»ì†ì†ì†Òö_ö†ˆ›Ÿì†Òööü_õ@†ˆ›™†ì†Òö_ô †ˆ›‹†óßöò†ƒù_ó膈›Ÿì†Òö膃ˆñð†ƒù_ò䆈›­ì†ìØö_ò(†ˆ›™†ì†Òö_ðü†ˆ›_òì†ì†ì†ì†ì†ìØö_úþŸ_ððƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö_ˆ¦õ·ä†‹Ø’ÍþøôüÚ_í@†ˆ›»ì†ì†ì†Òö؆ˆþö_ëTˆ›_ìäì†ì†ì†_ë膋ˆ™ò†ÈòØö_èT†ƒŽúþŸ_ë<ƒùà†„„þöà†„„þöà†„„þöà†„„þöà†„„þöà†„„þöà†ˆþö_輆ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù_攆ƒúþŸ_è,ƒùꆄ„þöꆆö_熈¦õ·ä†‹Ø’ÍþøôüÚò†ƒù_å̆ˆ›Ÿ‹á†Òö_ä@†ƒˆúþŸ_åÀƒùꆆö_伆ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù_âĆˆ›_äì†ì†ì†ì†ìòò†ì†Òö_â$†ˆ›Ÿì†Òöö†üð†ƒù_á<†ˆ›­ì†ìØö_à,†ˆ›_á,ì†ìò†ì†ì†Òööƒù_ߌ†ˆ›‘óßö_߆ˆ›‘óßö膃ˆñ_Þ †ˆ›­ì†ì†Òö_Ý8†ˆ›‹†‹ˆ‘_ÝPöò†ƒù_Üd†ˆ›™†ìØöð†ƒù_Ûp†ˆ›»ì†ì†ì†Òö脌ƒóƒùò†ƒùð†ƒù_Ú8†ˆ›§†ìò†Òööƒù_Ù˜†ˆ›‘Òö_ØÜ†ˆ›™ò†óßö_Ø<†ˆ›Ÿì†Òö_׸†ˆ›‘Òö_׆ˆ›Ÿì†Òö_Õ<†ƒˆúþŸ_× ƒùꆄ‚öꆄ„þöꆈþö_Õ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_Òø†ƒúþŸ_Õ0ƒùꆄ„þöꆄ‚öꆄ‚öà†„„þöà†ˆþö_Ód†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†“õþþø_Ò(†ˆ›‘Òöʆˆþö_Ð膈›§†ì†ì†Òö_Ð`¤“õþþÚ“õþþø_ΆƒˆúþŸ_ÐLƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö_΀†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùò†ƒùð†ƒùð†ƒù_Ìà†ˆ›­ì†ì†Òö_ÊH†“®_Ëtø˜_̰ä‚_ËÜ‚ˆ–’—ÓêØü–üêê_Êкþ_Êd›‘Òöˆ›ãöò†ƒù_É(†ˆ›‘Òöò†ƒù_ÇD†ƒúþŸ_Ƀùꆄ„þöꆄ„þöꆈþö_ǰ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ_Æ4†ˆ›_Ç †ì†ì†ì†ì†Òö_Åx†ˆ›­ì†ì†Òö_ÄØ†ˆ›Ÿì†Òö_Ćˆ›­ì†ì†óßö_Ã4†ˆ›Ÿ‹ˆÙ†óßö_ÂLˆ›µòò†ìØöð†ƒù_ÀD†ƒúþŸ_ƒùꆄ‚öꆄ‚öà†ˆþö_À°†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù膃ˆñ؆ˆþö_¾Ø†ˆ›»ì†ì†ì†Òö؆ˆþö_½´†ˆ›»ìòò†Òö_¼Ü†ˆ›»ìòò†Òö_»°†ˆ›_¼Ììò†ì†ì†ìò†Òööƒù_º„†ˆ›_»\†ìò†ì†ì†Òö_¹ä†ˆ›Ÿì†Òö_¹D†ˆ›Ÿì†óßö_¸ˆ†ˆ›­ì†ì†Òöò†ƒùò†ƒùð†ƒù_°ø„_¸0ƒ_±ƒšø_·ÀþŽþþ_±"_·¬_±þŸ_·œƒù_¶à†ˆ¦õ“†ëßþø_¶†ˆ¦õ¡†ì†ëßþø_µd†ˆ¦õ§ì†Êþø_´´†ˆ¦õ§ì†Êþø_´†ˆ¦õ§ì†Êþø_³p†ˆ¦õ™Êþø_²À†ˆ¦õ§ì†ëßþø_±d„_² ˆ¦õ§‹á†Êþ_±pˆ¦õ™‹_±|þøôüÚ_°<†ˆ›­ì†ì†Òö_¯d†ˆ›»ì†ì†ì†Òö_®Œ†ˆ›»ìò†ì†Òö_­´†ˆ›»ìò†ì†Òööƒùö†ü膃ˆñ_¬0†ˆ›_­Lì†ì†ì†ìòò†Òö_« †ˆ›_«øòòò†ì†óßö_ª€†ˆ›‹†Òö_©¨†ˆ›»ì†ì†ì†Òö_¨ì†ˆ›™ò†Òö؆ˆþö_§ä†ˆ›­ì†ì†Òö_§(†ˆ›­ì†ìØöö†üö†üð†ƒù_¤ÌƒˆúþŸ_¦àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö_¥<†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_£Ø†ˆ›_¤°ä†‹á†ì†Òö_¡Ô†ƒŽúþŸ_£Ìƒùꆄ„þöꆄ‚öꆄ‚öà†ˆþö_¢<†ˆ¦õ·ä†‹Ø’ÍþøôüÜ_  †ƒˆúþŸ_¡Èƒùꆄ„þöꆈþö_ œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùò†ƒù؆ˆþöö†ü_ž¸†ˆ›»ì†ì†ì†Òö_ž†ˆ›Ÿì†Òö_x†ˆ›Ÿì†Òö_œ †ˆ›»ì†ì†ì†Òöñ_›œ†ˆ›»ìò†ì†Òö_›†ˆ›‘Òöð†ƒùð†ƒù_™´†ˆ›_šÐìò†ì†ì†ì†ì†Òö_•„_™¨ƒ_•ƒšø_™8þŽþþ_•._™$_•*þŸ_™ƒù_˜X†ˆ¦õ§ì†Êþø_—|†ˆ¦õµ‹á†ì†Êþø_–̆ˆ¦õ§ì†ëßþø_•p„_–ˆ¦õ§‹á†Êþ_•|ˆ¦õ™‹_•ˆþøôüÚ_”,†ˆ›»ì†ì†ì†Òö_“Œ†ˆ›Ÿì†Òö_’Іˆ›­ì†ì†Òö_‘ˆ†ˆ›_’Àì†ìò†ì†ìò†ì†Òööü_膈›‘Òö_Žø†ƒŽúþŸ_܃ùꆄ„þöꆄ„þöꆄ‚öꆆö_`†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒù_@†ƒŽúþŸ_ŽÔƒùꆄ„þöꆆö_¨†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒù_‹p†ƒˆúþŸ_Œð„‚öꆆö_‹ì†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_Š´†ˆ›™òØö_ˆˆ†ƒúþŸ_Ѝƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öↈ‰õö_ˆô†ˆ¦õ·ä†‹Ø’ÍþøôüÚ_‡è†ˆ›Ÿì†Òöò†ƒù_†ø†ˆ›»ì†ì†ì†Òöò†ƒùöƒù_†@†ˆ›ãö膃ˆñ_…†ˆ›‘Òö_„¸†ˆ›§òò†Òöò†ƒù_„†ˆ›‹†óßöò†ƒùò†ƒù_‚ø†ˆ›»ìòò†Òöö†üö†ü؆ˆþö_´†ˆ›»ì†ì†ì†Òö_€Ü†ˆ›»ì†ì†ì†Òöˆ›‘Òöð†ƒù_€†ˆ›­ì†ì†Òöð†ƒù_~Ćˆ›Ÿì†Òö膃ˆñ_|䆃úþŸ_~|„„þöꆄ„þöꆈþö_}P†ˆ¦õ·ä†‹Ø’ÍþøôüÚ_{œ†ˆ›_|¬†ì†ìò†ì†ì†ìØö_zà†ˆ›­ì†ì†Òö_z†ˆ›»ì†ì†ì†Òö_y0†ˆ›»ì†ì†ì†Òöö†ü_xH†ˆ›»ì†ì†ì†Òö_w¨†ˆ›Ÿì†Òö_vˆˆ›_wp†ì†ì†ì†ì†ì†Òö_tŒ†ˆ›_vlìòòòòòòòòòòòòùßö_s´†ˆ›»ì†ì†ì†óßö_p˜†ˆ›™†‹úþŸ_sŒƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆈþö_q˜†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒùð†ƒùò†ƒù_oŒ†ˆ›­ì†ì†Òöö†üð†ƒù_nˆ†ˆ›»ì†ì†ì†Òöð†ƒù_mÈ„_n`ƒ_mÔƒšðþŸŒƒùôüÚö†ü_lü†ˆ›­ì†ì†Òö_kD†ˆ›_lìì†ì†ì†ì†ì†ì†ìòòò†ì†Òö_jˆ†ˆ›™ò†óßö_iôˆ›‹Øö_i,†ˆ›™†ì†Òö膃ˆñ_h †ˆ›_hðì†ìòòØöö†ü_g$†ˆ›»ì†ì†ì†Òö_fL†ˆ›»ìò†ì†Òö脌ƒóƒù_dô†ˆ›_fì†ì†ìòòò†Òö_dT†ˆ›Ÿì†Òö_c|†ˆ›»ì†ì†ì†Òöøƒù膃ˆñ_b`†ˆ›»ìò†ì†Òö_a܆ˆ›‘óßö_a †ˆ›­ì†ì†óßöð†ƒùò†ƒù_`0†ˆ›­ì†ì†Òö__X†ˆ›»ì†ì†ì†Òöð†ƒù_^¸†ˆ›‘Òö_^ˆ›™†ì†Òöð†ƒùð†ƒùð†ƒù_]†ˆ›Ÿì†Òö_Zˆ†ƒúþŸ_\üƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöà†ˆþö_Zô†ˆ¦õ·ä†‹Ø’ÍþøôüÚ_XÔ†ƒˆúþŸ_Z|ƒùꆄ„þöꆈþö_YP†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù_Wà†ˆ›»ì†ìò†Òöö†ü_Vø†ˆ›»ì†ì†ì†Òöð†ƒù_U ƒŽúþŸ_VЃùꆄ„þöꆄ‚öꆆö_U|†ˆ¦õ·ä†‹Ø’ÍþøôüÜ_Tt†ˆ›‹†Òö_RІƒúþŸ_Thƒùꆄ‚öꆆö_S<†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù_Qˆ†ˆ›_R¤ìòò†ì†ìòØöð†ƒùò†ƒù_L̆ƒŽúþŸ_QHƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚ö_N,†„„‰ˆúþŸ_Oðƒùꆄ‚öꆈþö_NĆˆ¦õ·ä†‹Ø’ÍþøôüÎöꆆö_M4†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù_L,†ˆ›‘Òö_KŒ†ˆ›Ÿì†Òö脌ƒóƒù_Jˆ†ˆ›»ì†ì†ì†Òö_Fh†ˆ›‘‹šø_JþŽþþ_G _J_GþŸ_Iøƒù_IX†ˆ¦õ™Êþø_H¨†ˆ¦õ§ì†ëßþø_GL„_Gôˆ¦õ§‹á†Êþ_GXˆ¦õ™‹_Gdþøôü_F€ö_E¬†ˆ›­ì†ì†Òö_C8_E ƒ_C<ƒúþŸ_Eƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆö_Cœ†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþö_B†ƒˆˆ§†ì†ì†Ø_AT†ˆ›™†ìØö_@|†ˆ›»ì†ì†ì†Òö_?܆ˆ›Ÿì†óßö膃ˆñ_>؆ˆ›»ì†ìò†Òöò†ƒùð†ƒùð†ƒùð†ƒùö†ü_=„†ˆ›»ì†ì†ì†Òöüü_9¸†ƒˆúþŸ_=hƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþö_:4†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_8ü†ˆ›™†ìØö_8†ˆ›µ†ìòò†óßöð†ƒù_7†ˆ›»ì†ì†ì†Òöð†ƒù_5ä“ ½ü_5ôþö_58†ˆ›Ÿì†óßö_3D†ƒúþŸ_5,ƒùꆄ„þöꆄ„þöꆄ„þöꆈþö_3°†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù_2P†ˆ›»ìò†ì†Òö_0솈›_2òòòòòòò†Òö_.䆃úþŸ_0àƒùꆄ‚öꆄ‚öꆄ‚öà†ˆþö_/P†ˆ¦õ·ä†‹Ø’ÍþøôüÚ_.(†ˆ›™òØöð†ƒù_-4†ˆ›»ì†ì†ì†Òö_,\†ˆ›»ì†ì†ì†Òö_+„†ˆ›»ì†ì†ì†Òöð†ƒù_*ओõþþÚ“õþþø_)䆈›_*Èì†ì†ì†ì†Òö_) †ˆ›§†ì†ìùßö_(P†ˆ›­ì†ì†Òö_'”†ˆ›™†ìØöð†ƒù_% †ƒŽúþŸ_'lƒùꆄ„þöꆄ„þöↈ‰õö_&†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù_$䆈›ŸìØöÞ“õþþøò†ƒù_"h†ƒŽúþŸ_$tƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆö_"Іˆ¦õ·ä†‹Ø’ÍþøôüÜ_!†ˆ›»ì†ìò†Òö膃ˆñ_ ¨†ˆ›­ì†ì†Òöð†ƒù_솈›Ÿì†Òöö†ü_†ˆ›»ì†ì†ì†Òö_pˆ›‹Øö_¨†ˆ›™ò†óßö_$†ˆ›„ßöð†ƒù_0†ˆ›»ì†ì†ì†Òö_†ˆ›Ÿì†Òö_ð†ˆ›Ÿì†Òö_†ˆ›»ì†ì†ì†Òö_@†ˆ›»ì†ì†ì†Òöð†ƒù_„†ˆ›ŸìØö_d„_@“_ú_°Œ_T΂ˆ’_‚ˆ’ꂈ’—ÓÐü–ü—É_ô_Œøþøþ_P›™†ì†Ò_pˆ›§ò†ì†Òöð†ƒùò†ƒù_dˆ›§†ì†ì†Òö_œ†ˆ›™†ì†Òö_¨†ˆ›_Œì†ì†ì†ì†Òöð†ƒùð†ƒùö†ü_ˆ†ˆ›»ì†ì†ì†Òö؆ˆþöð†ƒù_H†ˆ›»ì†ì†ì†Òö_Œ†ˆ›™òØöЈþö膃ˆñ_ ô†ˆ›‹†‹ˆ‹†_ öò†ƒùò†ƒù_ €†ƒˆˆ_ ´ì†_ †‹úþŸ_ €ƒùꆆö_ |†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†Ø_ ¨†ˆ›§†ì†ì†Òö_ †ˆ›Ÿì†Òö_L†ˆ›­ìò†Òöö†üˆ›‘óßö_ü†ˆ›™†ì†Òö_\†ˆ›‹†óßö_ †ˆ›™†ì†Òö_ð†ˆ›Ÿ‹á†Òöò†ƒù_†ˆ›»ì†ì†ì†Òö_`†ˆ›Ÿì†Òö_¤†ˆ›­ì†ì†Òö_ȆƒˆúþŸ_˜ƒùꆄ‚öꆄ‚öꆆö_D†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_(†ˆ›ŸìØöò†ƒù^ÿ`ˆ›™òØö^ú솓^û²^ühŠ˜^þ̈–’ê^þ<‚ˆ–’ê^ý°‚ˆ–’êê^ü°ü–^ý€þ^üÌ—ˆ™ò†^ütö^û¬^üHþøþøþ^û›­ì†ì†óßöò†ƒùò†ƒù^ú†ˆ›Ÿì†Òö^ù|†ˆ›Ÿì†Òö^ø¤†ˆ›»ì†ì†ì†Òö^÷膈›­ì†ì†óßö^÷<ƒˆˆ§†ì†ì†Øð†ƒù^ôÀ†ƒˆúþŸ^÷ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþö^õ<†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^ô†ˆ›™†ìØö^ó,†ˆ›»ì†ì†ì†Òöò†ƒù^ñ`†ƒŽúþŸ^óƒùꆄ‚öà†ˆþö^ñȆˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù^ðÀ†ˆ›‘Òö^ð†ˆ›­ì†ì†Òö^ï,†ˆ›»ì†ì†ì†Òö^îT†ˆ›»ì†ì†ì†Òöö†ü^í¤†ˆ›Ÿì†Òöøƒù膃ˆñ^숆ˆ›»ìò†ì†Òö^솈›„ßöò†ƒù^ë0†ˆ›™†ì†Òöò†ƒù^éP†ƒŽúþŸ^ë ƒùꆄ„þöꆄ„þöꆈþö^鸆ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñ^瘆ƒˆúþŸ^éƒùꆈþö^膈¦õ·ä†‹Ø’ÍþøôüÒ^æø†ˆ›Ÿì†Òö؆ˆþö؆ˆþö^分ˆ›»ì†ì†ì†Òö^冈›‘Òö^ਃúþŸ^äøƒùà†„„þö^ㆄ„‘úþŸ^䔄‚öꆆö^ㆈ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^ᆈ¦õ·ä†‹Ø’ÍþøôüÚ^à†ˆ›‘Òöð†ƒùò†ƒù^ß(†ˆ›™†ì†Òö^Þˆ†ˆ›Ÿì†Òöò†ƒù^ÝÔ†ƒˆˆ™†ì†Ø^ÜH†ƒˆúþŸ^Ýȃùꆈþö^ÜĆˆ¦õ·ä†‹Ø’ÍþøôüÒð†üöƒù^Ú䆈›^ÛØ†ì†ì†ì†ì†ì†Òö^ׄ†ˆ›^ÚÔìòòòòòòòòòòòò^×ÞŠúþŸ^ÙPƒùꆆö^ØL†ˆ¦õ·ä†‹Ø’Íþøôü^לö^Ö¬†ˆ›»ì†ì†ì†óßö^Ó†ˆ›™†‹úþŸ^Ö„ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆈþö^Ô†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒùð†ƒù^Òœ†ˆ›­ì†ì†Òö^Ñà†ˆ›™†ì†Òö^Ï”ƒúþŸ^ÑÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö^Ïô†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^φˆ›‘Òöð†ƒù^ÌX†ƒŽúþŸ^Î܃ùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^ÌÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùð†ƒù^Ê„†ƒŽúþŸ^̃ùꆄ‚öꆈþö^Ê솈¦õ·ä†‹Ø’ÍþøôüÜò†ƒùð†ƒù^É̆ˆ›‘Òö^Èô†ˆ›»ì†ì†ì†Òö^È(†ˆ›µì†ä†‹Çö^ÇP†ˆ›»ì†ì†ì†Òö^Æx†ˆ›»ì†ìò†Òöøƒù膃ˆñ^Å”†ˆ›‹†Òö^ÄØ†ˆ›™†ì†Òö^Ä8†ˆ›Ÿì†Òöð†ƒù脌ƒóƒù^ƈ›»ì†ì†ì†Òö^Âx†ˆ›Ÿì†Òö^Á¼†ˆ›­ì†ì†Òö^Á†ˆ›­ìò†Òö^À|†ˆ›‘Òöð†ü^¸L“ ^ºx^À’^ºpôôø^¿hþ–’^º(ôôø^¾¸þ–’^¹àø^¾þ–’^¹Èø^½Xþ–’^¹°ø^¼¨þ–’^¹˜ø^»øþ–’^¹€øüø^º¼þ–’^¹Pøü^¸¬¸^¸\þö^µ¤†ƒúþŸ^¸4ƒù䆄„þö䆄„þöꆄ‚öꆄ‚öꆄ‚ö䆄„þö䆈þö^¶†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùð†ƒù膃ˆñð†ƒùð†ƒù^³Ä†ˆ›^´Ô†ì†ìò†ì†ì†ìØö^³$†ˆ›Ÿì†Òö^­ä†ˆ›^³ì^®L†‹šø^²€þŽþþ^®†^²l^®‚þŸ^²\ƒù^±„†ˆ¦õµìò†Êþø^°Ô†ˆ¦õ§ì†Êþø^°$†ˆ¦õ§ì†ëßþø^®È„^¯pˆ¦õ§‹á†Êþ^®Ôˆ¦õ™‹^®àþøôü^­üö^­(†ˆ›­ìò†Òö^¬P†ˆ›»ì†ì†ì†Òö^«¼ˆ›Ÿì†Òö^«†ˆ›Ÿì†Òöð†ƒù^ª8†ˆ›™ò†Òö^¨†ƒúþŸ^ª,ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆö^¨ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^§†ˆ›‹†‹ˆ‹†^§0öò†ƒù^¦ †ˆ›^¦ðì†ìòòØöò†ƒù^¤ä†ˆ›^¥äì†ìòòò†óßöò†ƒù膃ˆñð†ƒùð†ƒù^£†ˆ›»ì†ì†ì†Òö^¢¸†ˆ›»ìòòØöð†ƒùʆˆþö^¡„ˆ›™†ì†Òö^ ¼†ˆ›­ìò†Òö^žà†ƒˆúþŸ^ °ƒùꆄ‚öꆄ‚öꆆö^Ÿ\†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^<†ƒúþŸ^žÔƒùꆄ„þöꆆö^¨†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^œœ†ˆ›‹†óßöò†ƒùð†ƒùò†ƒù^šÄ†ƒˆúþŸ^œDƒùꆈþö^›@†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùò†ƒù脌ƒóƒù脌ƒóƒùö†ü^™T†ˆ›»ì†ì†ì†Òö^˜D†ˆ›^™†ìò†ì†ì†Òöð†ƒùöƒù^—ˆ†ˆ›‘Òö^–”†ˆ›^—xìò†ìòùßöð†ƒùò†ƒù^•ˆ†ˆ›»ì†ì†ì†Òö؆ˆþöò†ƒùò†ƒù^“ø“ ½ü^”þö^à†ˆ›^“Ì‹á†ì†^d†‹úþŸ^“|ƒù^‘؆„„‘úþŸ^“T„‚öꆆö^’P†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆆö^à†ˆ¦õ·ä†‹Ø’Íþøôü†Òö^†ˆ›§†ì†ìùßö^ކˆ›µòò†ìØöò†ƒù^@†ˆ›­ì†ì†Òö^Œ„†ˆ›­ìò†óßö^Šh†ƒúþŸ^Œxƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆö^ŠÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒù^‰t†ˆ›Ÿì†Òö^ˆœ†ˆ›»ì†ì†ì†Òöð†ƒù^‡¨†ˆ›»ìòòØö^†´†ˆ›^‡˜ìòòò†Òö^„|ƒúþŸ^†¨ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^„܆ˆ¦õ·ä†‹Ø’ÍþøôüÚ^~p†ˆ›™†‹úþŸ^„Hƒùꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö^p†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöò†ƒùʆˆŸßöð†ƒùö†ü^|8†ƒˆúþŸ^}¸ƒùꆆö^|´†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†ü؆ˆþö^{ †ˆ›­ìò†Òö؆ˆþö^yĆˆ›^zÄìò†ìòò†Òö^x솈›»ì†ìò†Òö^x0†ˆ›­ìò†Òö^wt†ˆ›­ìò†Òö^uàƒŽúþŸ^whƒùꆄ„þöꆆö^v<†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùð†ƒùò†ƒù^t̆ˆ›­ì†ì†óßö^tH†ˆ›‘Òöð†ƒùð†ƒùð†ƒù^sp†ˆ›‘Òö^r´†ˆ›­ìò†Òö^q܆ˆ›»ì†ì†ì†Òöð†ƒùüü^mô†ƒˆúþŸ^q¤ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþö^np†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^m8†ˆ›™†ìØöð†ƒù^l€†ƒˆˆ™†ì†Øð†ƒùò†ƒùð†ƒùð†ƒùð†ƒù^kX†ˆ›Ÿì†Òö^jœ†ˆ›­ì†ì†Òö^iü†ˆ›Ÿì†Òö^i$†ˆ›»ì†ì†ì†Òö^hh†ˆ›­ì†ì†Òö^gȆˆ›Ÿì†Òöò†ƒù^f؆ˆ›»ìòòØöð†ƒùüüò†ƒù^e¼†ˆ›§†ìò†óßö^e †ˆ›Ÿ‹á†Òö^dl†ˆ›‹†Òöð†ƒùð†ƒù^c0†ˆ›^d‹á†ìò†ì†Òö膃ˆñ^b,†ˆ›§†ì†ì†Òö^`ˆ†ƒúþŸ^b ƒùꆄ„þöꆆö^`ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù^_°†ˆ›Ÿì†Òö^_†ˆ›‹†Òö^] †ƒˆúþŸ^_ƒùꆄ‚öꆄ‚öꆄ„þöꆈþö^]ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒˆ›‘Òö^[x†ˆ›^\xìòòò†ì†óßö^Zô†ˆ›‘Òö^Z8†ˆ›­ìò†Òö^Y˜†ˆ›‹†Òö^X †ƒˆúþŸ^YŒƒùꆆö^Xˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^Wl†ˆ›‹†Òöð†ƒù^Uˆ†ƒŽúþŸ^WDƒùꆄ‚öꆄ‚öꆆö^Uð†ˆ¦õ·ä†‹Ø’ÍþøôüÜ^T؆ˆ›‹†‹Çöö†üö†ü^R܆ƒˆúþŸ^T¬ƒùꆄ‚öꆄ„þöꆈþö^SX†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒù膃ˆñò†ƒùð†ƒù^QÀ†ˆ›‹†Òöð†ü؆ˆþö^P€†ˆ›»ì†ì†ì†Òöö†ü^OІˆ›Ÿì†Òö膃ˆñöüö†üð†ƒù膃ˆñò†ƒùð†ƒùð†ƒùð†ƒù̆ƒˆˆ‘Øð†ƒùð†ƒù؆ˆþöΆƒŒü˜þò„þçØ†ˆþö^LX†ˆ›»ìòò†Òöð†ƒù^KŒˆ›™†ì†Òö^IT†ƒˆúþŸ^Ktƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^IІˆ¦õ·ä†‹Ø’ÍþøôüÒ^H|†ˆ›»ìò†ì†Òö^C†ƒˆúþŸ^Hpƒù^F<†„„‘úþŸ^HXƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^F´†ˆ¦õ·ä†‹Ø’ÍþøôüÞö^DP†ˆ‰’úþŸ^F0ƒùꆄ‚öꆄ‚öꆆö^D܆ˆ¦õ·ä†‹Ø’ÍþøôüÔö^C€†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^@\†ƒˆˆ^BÌ^@܆‹úþŸ^BÀƒùꆄ‚öꆄ‚öà†ˆþö^AX†ˆ¦õ·ä†‹Ø’ÍþøôüÂ†ì†Øð†ƒù^?„†ˆ›™†ìØö^>䆈›Ÿì†Òö^>`†ˆ›‘Òö^=4†ˆ›^>Pìò†ìò†ìòØöö†üð†ƒù؆ˆþö^<†ˆ›‹†Òö^;`†ˆ›­ì†ìØö^:°ˆ›­ìòØö^: †ˆ›‘Òö^8„†ˆ›^9èòòòò†ìòòòò†Òö^7ð†ˆ›‘‹èßö^7P†ˆ›Ÿì†Òöð†ƒùò†ƒù膃ˆñö†ü؆ˆþöð†ƒù脌ƒóƒùò†ƒù^5”†ˆ›‹†Òö^4ô†ˆ›Ÿì†Òö^3Ôˆ›^4äì†ìò†ìòò†Òö膃ˆñ^2Ćˆ›»ì†ì†ì†Òöð†ƒù؆ˆþö^1؆ˆ›‘Òö^,ƒˆúþŸ^1̃ùꆄ‚öà†„„þöꆄ‚ö^-@†ˆ‰’úþŸ^1(ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^-̆ˆ¦õ·ä†‹Ø’ÍþøôüÔö^,p†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^+8†ˆ›™ò†Òö膃ˆñ^*P†ˆ›­ì†ì†óßö^)x†ˆ›»ì†ì†ì†Òö^(„†ˆ›^)hì†ì†ì†ì†Òö^'¬†ˆ›»ì†ìò†Òöö†ü^&´†ˆ›»‹á†ì†ìØööƒùð†ƒù^$ȆƒˆúþŸ^&pƒùꆄ‚öꆆö^%D†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^$D†ˆ›‘Òö^#l†ˆ›»ì†ì†ì†Òö^" †^#^þò„þò„þò„þò„þò„þò„þò„þò„þ„ü „þò„þò„þè÷^!l†ˆ›‹†Òöö†ü^  †ˆ›­ìò†Òööƒù^Ȇˆ›™†ì†Òöð†ƒù^ †ˆ›Ÿì†Òöö†ü脌ƒóƒùò†ƒù^†ˆ›ŸìØöö†ü^ˆ›^Ðòòòò†Òö^†ˆ›^èì†ìò†ì†Òö^d†ˆ›Ÿì†Òö^˜†ˆ›­‹á†ìØö^ˆ†ˆ›^ˆìò†ì†ì†ìØöð†ƒù^”„^`ƒ^ ƒšø^ðþŽþþ^¾^Ü^ºþŸ^̃ù^ô†ˆ¦õ¡ò†Êþø^ †ˆ¦õ¯òò†Êþø^\†ˆ¦õ§ì†ëßþø^„^¨ˆ¦õ§‹á†Êþ^ ˆ¦õ™‹^þøôüÚÆ†«þÚ„üˆ„þè÷^L†ˆ›»ì†ì†ì†Òöö†ü膃ˆñ^†ˆ›^ìò†ìò†ì†Òööƒù膃ˆñð†ƒùò†ƒù^¬†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒù^ð†ˆ›‘Òö^(†ƒŽúþŸ^äƒùꆄ„þöꆄ„þöꆆö^†ˆ¦õ·ä†‹Ø’ÍþøôüÜ^ †ƒˆúþŸ^ƒùꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õö^ Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†ü^ †ˆ›^ ðìòòò†Òö^ xˆ›Ÿì†óßöð†ƒù^ ”†ˆ›™†ìØö^ȆƒúþŸ^ ˆƒùꆄ„þöꆄ„þöꆈþö^4†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†ü^Ćˆ›^¨ìò†ì†ì†Òö^솈›»ì†ì†ì†Òöð†ƒù^0†ˆ›ŸìØö^t†ˆ›­ìò†ÒöЈþöð†ƒù^ü†ƒúþŸ^äƒùꆄ‚öꆄ‚öꆄ‚öꆈþö^h†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]ü솃ŽúþŸ^ðƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]ýT†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒù]ö؆ƒúþŸ]ü¨ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö]÷D†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]ö†ˆ›­ìò†Òö]õD†ˆ›»ì†ì†ì†Òö]ôˆ†ˆ›­ì†ì†Òö]ô†ˆ›‘Òö]óH†ˆ›™†ì†óßööƒù膃ˆñ]ò`†]òòþò„þ΄ü”„þò„þè÷]ñÀ†ˆ›Ÿì†Òö]ñ†ˆ›™†ì†Òö]ð,†ˆ›§†ìò†Òö膃ˆñ膃ˆñ]ïP†ˆ›‘Òö]î@†ˆ›]ï†ìòò†ìØöö†ü]íX†ˆ›»ì†ì†ì†Òö؆ˆþö]ìl†ˆ›Ÿì†Òö]ë̆ˆ›ŸìØö]ëH†ˆ›‘Òöˆ›ãö]ꆈ›™ò†óßöð†ƒùò†ƒùö†ü]æä†ƒŽúþŸ]鸃ùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]çL†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒùð†ƒùð†ƒù]娆ˆ›‹†Òöð†ƒù]冈›ŸìØö]ä`†ˆ›­ìò†óßö]㌄]ä “õþþØ‚“õþþÚ“õþþø]â솈›‹†Òö]ↈ›§†ì†ì†Òö]༆ˆ›]âì†ì†ä†‹áòòò†Òö]Ü †ƒˆšø]àPþŽþþ]ÜÚ]à<]ÜÖþŸ]à,ƒù]ß(†ˆ¦õ]à‹á†ì†ì†Êþø]Þx†ˆ¦õ§ì†ëßþø]Ý„]ÝĈ¦õ§‹á†Êþ]Ý(ˆ¦õ™‹]Ý4þøôüÒ]܆ˆ›‹†Òöð†ƒù]ÚĈ›]ÛÔìò†ìòò†ìØö]Ù¨†ˆ›]Ú€ò†ìòò†Òö]Ù†ˆ›Ÿì†Òöð†ƒù]Øh†ˆ›‘Òöö†ü]×H†ˆ›]ØHìò†ì†ì†ì†Òö]Ò„]×<ƒ]Ò$ƒšø]ÖÌþŽþþ]ÒB]Ö¸]Ò>þŸ]Ö¨ƒù]Õˆ†ˆ¦õ]֌䆋á†ì†ì†Êþø]Ô†ˆ¦õ]Õh‹á†ì†ì†Êþø]Óà†ˆ¦õ§ì†ëßþø]Ò„„]Ó,ˆ¦õ§‹á†Êþ]Òˆ¦õ™‹]ÒœþøôüÚ]Ñ@†ˆ›»ì†ì†ì†Òö]Р†ˆ›Ÿì†Òööƒùö†ü]ÏÔ†ˆ›Ÿì†Òö]Íø†ƒˆúþŸ]Ïȃùꆄ‚öꆄ‚öꆈþö]Ît†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]Ít†ˆ›‘Òö]ÌÔ†ˆ›‹Øö]̆ˆ›™ò†Òö]ɰ†ƒˆúþŸ]Ì ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆆö]Ê,†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]È †ˆ›]Éx†ìòò†ìØöò†ƒù]ǰ†ˆ›§†ì†ì†óßö]ÆØ†ˆ›»ì†ì†ì†Òö]Æ8†ˆ›Ÿì†Òö]؆ˆ›Ÿì†Òö]Ĥ†ˆ›µ†ì†ì†ì†Òö؆ˆþö]ø†ˆ›ŸìØö]ƈ›ŸìØöÞ“õþþøò†ƒù]†ˆ›‹†Òöð†ƒùð†ƒù]¼H†ˆ›]ÁÌ]¼°†‹šø]ÁTþŽþþ]¼ê]Á@]¼æþŸ]Á0ƒù]¿è†ˆ¦õ]Áì†ì†ìòò†ì†Êþø]¿8†ˆ¦õ§ì†Êþø]¾ˆ†ˆ¦õ§ì†ëßþø]½,„]½Ôˆ¦õ§‹á†Êþ]½8ˆ¦õ™‹]½Dþøôü]¼`ö؆ˆþö]»\†ˆ›Ÿì†Òö]¹ŒƒˆúþŸ]»Pƒùꆄ„þöꆄ‚öꆆö]¹ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñ]¶è†ƒúþŸ]¹Hƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]·T†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþöð†ƒùö†ü]µ|†ˆ›»ì†ì†ì†Òö]´À†ˆ›­ìòØöЈþö]³,†ˆ›]´Hì†ìò†ìòò†Òö]±<†ƒŽúþŸ]³ ƒùꆄ‚öꆄ‚öꆄ„þöꆆö]±¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù]°H†ˆ›»ì†ì†ì†Òöò†ƒù]£ô†ƒˆúþŸ]°$ƒù]¥h†ƒŽúþŸ]° ƒùꆄ‚öò†ƒù]¦ †ˆ‘úþŸ]¯´ƒùꆄ„þö]¬ †„„‰úþŸ]¯tƒùꆄ‚öò†ƒù]­x†ˆ‘úþŸ]¯ƒùꆄ‚öꆈþö]­ð†ˆ¦õ·ä†‹Ø’Íþøôüþàö]¬¨†ˆ¦õ·ä†‹Ø’ÍþøôüÖö]¨ˆ†„„‰úþŸ]¬ƒùꆄ‚öò†ƒù]©à†ˆ‘úþŸ]«¼ƒùↄ„‰õöꆄ„þöꆈþö]ªX†ˆ¦õ·ä†‹Ø’Íþøôüþàö]©†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆈþö]§†ˆ¦õ·ä†‹Ø’Íþøôüþàö]¥Ð†ˆ¦õ·ä†‹Ø’ÍþøôüþÞꆈþö]¤p†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù]¢ †ˆ›]£Èì†ìò†ì†ì†ì†ìòò†ìò†Òöö†üö†ü]¡|†ˆ›‘Òö] Ü†ˆ›ŸìØö] <†ˆ›ŸìØöñð†ƒùð†ƒù]”†ˆ›Ÿ‹ˆúþŸ]Ÿ¼„‚öà†ˆþö]ž¤†ˆ¦õ·ä†‹Ø’Íþøôü]ü†Òöð†ƒù]œô†ˆ›‘Òöð†ƒù]šD†ƒúþŸ]œÌƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö]š°†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù̆ƒŽü˜þò„þåö†ü]—¼ƒˆúþŸ]™¨ƒùꆄ‚öꆄ‚öꆄ‚öꆆö]˜,†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñ]–¬†ˆ›»ìò†ì†Òöð†ƒù]– †ˆ›ãö]•ˆ†ˆ›‘óßö]”@†ˆ›]•xìòòò†ì†ìò†óßö]“„†ˆ›™†ìØö]’Ȇˆ›­ì†ì†Òö]‘ð†ˆ›»ì†ì†ì†Òöð†ƒù]Ј›]‘Äìòòò†ì†óßöð†ƒù؆ˆþö]„†ˆ›»ì†ì†ì†Òö]ެ†ˆ›»ì†ì†ì†Òö]Ô†ˆ›»ì†ì†ì†Òö]4†ˆ›Ÿì†Òö]Œ”†ˆ›ŸìØööƒù]Šü†ƒúþŸ]Œlƒùꆆö]‹h†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù]ˆ¬†ƒŽúþŸ]Џƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþö]‰†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù膃ˆñö†ü]‡|†ˆ›»ì†ì†ì†Òö؆ˆþö]†X†ˆ›»ì†ì†ì†Òö]…€†ˆ›»ì†ì†ì†Òö]„¨†ˆ›»ì†ìò†Òöð†ƒùÞ“õþþø]‚t†ƒúþŸ]„4ƒùꆄ‚öꆄ„þöꆆö]‚à†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]Ô†ˆ›Ÿìùßö]4†ˆ›‹†Òö]X†ƒˆúþŸ](ƒùꆄ‚öꆄ‚öꆆö]Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]~¸†ˆ›ŸìØö]}ü†ˆ›­ìò†óßöøƒùð†ƒù]} †ˆ›™òØö]{à†ˆ›]|üìò†ìòò†ìØöò†ƒù]xÔ†ƒˆúþŸ]{¼ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆö]yP†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒùð†ƒù]t˜†ƒúþŸ]x€ƒùꆄ‚ö]vL†„„‘úþŸ]x@ƒùꆄ‚öꆄ‚öꆄ‚öꆆö]vĆˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆆö]u†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]sˆ†ˆ›]tˆìò†ì†ì†ì†Òö]r膈›Ÿì†Òö]r†ˆ›»ì†ì†ì†Òöüüò†ƒùð†ƒùð†ƒùð†ƒù]q†ˆ›‘Òö؆ˆþöð†ü]o솈›­ìò†Òö]o†ˆ›»ì†ì†ì†Òö]n †ˆ›]oì†ìò†ì†Òö]mH†ˆ›»ì†ì†ì†Òöö†ü؆ˆþöò†ƒù]lP†ˆ›‘Òö]k°†ˆ›Ÿì†Òö]k(¤“õþþÚ“õþþø]hø†ƒŽúþŸ]kƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöↈ‰õö]i`†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù]h †ˆ›™ò†óßö]g€†ˆ›Ÿì†Òöð†ƒù]fĆˆ›‹†Òö]e솈›§†ìò†Òö]eh†ˆ›‘Òöð†ƒùò†ƒù]d”†ˆ›Ÿì†Òö]c„†ˆ›]d\†ìòò†ìØö]b䆈›‹†Òö]b4ˆ›™òØöö†üð†ƒùð†ƒù̆ƒˆˆ‘Øò†ƒùò†ƒù]`t†ˆ›§†ì†ì†Òö]^œ†ƒˆúþŸ]`X„‚öꆄ‚öà†ˆþö]_†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñò†ƒù]]€†ˆ›»ì†ì†ì†Òöð†ƒù][8†ƒˆúþŸ]]Xƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆö][´†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù̆ƒŽü˜þò„þåð†ƒù]YȆˆ›»ì†ì†ì†Òö]Xð†ˆ›»ì†ì†ì†Òö]X†ˆ›»ì†ì†ì†Òö؆ˆþö]Vô†ˆ›»ì†ì†ì†Òöð†ƒùñ]T䆃ŽúþŸ]V ƒùꆄ‚öꆄ‚öꆈþö]UL†ˆ¦õ·ä†‹Ø’ÍþøôüÜ]T†ˆ›™†‹áØö]S@†ˆ›»ìòò†Òö]R †ˆ›Ÿì†Òöö†üö†ü]P|†ƒˆúþŸ]Rtƒùꆄ„þöꆄ„þöꆄ„þöꆆö]Pø†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒù]OĆˆ›‘Òöʆˆþööƒùð†ƒù]Nh†ˆ›™†ì†Òö]Hô†ƒˆúþŸ]N\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]Ip†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]G䆈›]H¼†ìòòòØö]G †ˆ›»ìòò†Òöð†ƒùò†ƒù]E8†ƒŽúþŸ]F̃ùꆄ„þöꆈþö]E †ˆ¦õ·ä†‹Ø’ÍþøôüÜ]Cl†ƒúþŸ]E,ƒùꆄ‚öꆄ‚öꆆö]C؆ˆ¦õ·ä†‹Ø’ÍþøôüÚ]B솃ˆþŸŒƒùôüÜö†ü]B†ˆ›»ì†ì†ì†Òö]A,†ˆ›»ì†ì†ì†Òöò†ƒù]@€ˆ›Ÿì†Òö]>„†ƒˆúþŸ]@hƒùꆄ‚öꆄ‚öà†ˆ‰õö]?†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒù]=X†ˆ›]><ì†ìò†ì†Òö]pƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö\<†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù膃ˆñò†ƒù\:܆ˆ›»ì†ìòØö\98†ƒúþŸ\:Ѓùꆄ‚öꆆö\9¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚ\8`†ˆ›§òòØöò†ƒù\7¨†ˆ›Ÿì†Òö\6솈›™ò†Òö\60†ˆ›­ì†ì†Òö\5t†ˆ›­ì†ì†Òö\3<ƒúþŸ\5hƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆö\3œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù\2t†ˆ›‹†Òö\1ð†ˆ›‘Òöð†ƒù\/¼†ƒŽúþŸ\1ȃùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆö\0$†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùð†ƒù\.̆ˆ›­ìò†Òöò†ƒù\. ˆ›‹Øö\-†ˆ›‘Òö\,ð†ˆ›ŸìØöò†ƒù\*ü†ƒˆúþŸ\,̃ùꆄ‚öꆄ‚öꆈþö\+x†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\*†ˆ›\*ìì†ì†ìò†Òö\)L†ˆ›­ì†ì†Òö脌ƒóƒùö†ü\(8†ˆ›»ì†ì†ì†Òö\'´†ˆ›‘Òö\&À†ˆ›\'¤ìò†ìò†Òöüü膃ˆñ\%Ȇˆ›­ì†ì†Òö\#\†ƒúþŸ\%¼ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö\#Ȇˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù\"P†ƒˆˆ\#ìòò†ì†Ø\!$†ˆ›\"@ì†ì†ì†ìòò†Òöð†ƒùð†ƒù\ L†ˆ›Ÿì†Òöö†ü\d†ˆ›»ì†ì†ì†Òööü\ô†ƒŽúþŸ\<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö\\†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒù\ †ˆ›™†‹ˆ‹†È†Òö\†ˆ›‘Òöð†ƒù\\†ƒúþŸ\ôƒùꆄ„þöꆈþö\Ȇˆ¦õ·ä†‹Ø’ÍþøôüÚ\„†ˆ›§òò†Òöð†ƒù\Ȇˆ›Ÿì†óßö\8†ƒˆúþŸ\¼ƒùꆄ‚ö\„†ˆ‰’úþŸ\|ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö\†ˆ¦õ·ä†‹Ø’ÍþøôüÔö\´†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\†ƒˆúþŸ\,ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚ö\d†ˆ‘úþŸ\P„„þö\¬†ˆ‘úþŸ\(„‚öꆈþö\$†ˆ¦õ·ä†‹Ø’Íþøôüþàö\܆ˆ¦õ·ä†‹Ø’Íþøôüþàö\”†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\ x†ˆ›Ÿì†ÒöÞ†‡üò÷ò†ƒù\ H†ˆ›»ì†ì†ì†Òö\ T†ˆ›\ 8ì†ì†ì†ì†Òöøƒù\ H†ˆ›µòòò†Òö\ p†ˆ›»ì†ì†ì†Òöð†ƒùò†ƒùð†ƒùð†ƒù\,†ˆ›»ì†ì†ì†Òö\Œ†ˆ›Ÿì†Òöøƒù\€†ˆ›\dìò†ì†ì†Òö\à†ˆ›Ÿì†Òö\<†ƒúþŸ\Ôƒùꆄ„þöꆈþö\¨†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[ÿ`†ƒˆúþŸ\0ƒù\Ô†„„‰úþŸ\ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆö\\†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþö[ÿ܆ˆ¦õ·ä†‹Ø’ÍþøôüÒ[þP†ˆ›[ÿPì†ìò†ìò†Òöð†ƒù[ý$†ˆ›[þ$ìò†ìòò†Òö[üL†ˆ›»ì†ì†ì†Òö[÷È„[ü@ƒ[÷Ôƒšø[ûÐþŽþþ[÷ò[û¼[÷îþŸ[û¬ƒù[úð†ˆ¦õ“†Êþø[ú@†ˆ¦õ§ì†Êþø[ù†ˆ¦õ§ì†ëßþø[ø4„[øÜˆ¦õ§‹á†Êþ[ø@ˆ¦õ™‹[øLþøôüÚ[÷ †ˆ›­ì†ì†Òö[õƒˆúþŸ[÷ƒùꆄ„þöꆄ‚öꆄ‚öꆈþö[õ„†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[ô0†ˆ›»ì†ì†ì†óßö[󜆈›‘‹Çöð†ƒù[î܆ƒúþŸ[ótƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚ö[ð†ˆ‰úþŸ[ñ̃ùꆄ‚öꆆö[𠆈¦õ·ä†‹Ø’ÍþøôüÖö[ïH†ˆ¦õ·ä†‹Ø’ÍþøôüÚ䃈ˆé[í`†ˆ›™†‹ˆ™†ì†È†Òöð†ƒù[줆ˆ›Ÿì†Òö[ë\†ˆ›[ì”ìò†ìò†ì†ì†ì†Òö[êȈ›‹†Òö[ꆈ›™†ì†Òö[èÔ†ˆ›[éðìò†ìò†ìòØö[çü†ˆ›»ìò†ì†Òö؆“õþþø[æô†ˆ›™†ì†óßöö†ü[à†ˆ›[æÔ[àl†‹šø[æ\þŽþþ[à¦[æH[à¢þŸ[æ8ƒù[âô†ˆ¦õ§‹úþŸ[æ ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆆö[䆈¦õ·ä†‹Ø’Íþøôü†Êþø[âD†ˆ¦õ§ì†ëßþø[àè„[ሦõ§‹á†Êþ[àôˆ¦õ™‹[áþøôü[àööƒùð†ƒù[Þ†ˆ›[ß¼ì†ìòòò†ä†‹Çö[ÝÔ†ˆ›­ì†ì†Òö[Üü†ˆ›»ì†ìò†Òö[Ü$†ˆ›§òò†Òöö†ü[Ût†ˆ›Ÿì†Òö膃ˆñöƒùð†ƒù[Úp†ˆ›‹†óßö[Ù솈›‘Òöʆˆþö[ج†ˆ›»ì†ìò†Òö[Ø †ˆ›Ÿì†Òö[×P†ˆ›­ì†ì†Òö[Ö¼ˆ›‹Øö[ÔÔ†ƒˆúþŸ[Ö¤ƒùꆄ‚öꆄ‚öꆆö[ÕP†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù؆ˆþö[Ó”†ˆ›»ì†ì†ì†Òöð†ƒù[Ò䈛Ÿì†Òö[Ò†ˆ›»ìò†ì†Òö[ÍL†ƒˆúþŸ[Ñôƒùꆄ‚öꆄ„þö[Î膄„‰úþŸ[ÑŒƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþö[Ïp†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆆö[ÍȆˆ¦õ·ä†‹Ø’ÍþøôüÒ[̬†ˆ›Ÿì†Òö[ËÔ†ˆ›»ìò†ì†Òö[É䆃ŽúþŸ[Ëȃùꆄ‚öꆄ‚öꆄ‚öꆆö[ÊL†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù膃ˆñð†ƒù[Ȩ†ˆ›§†ì†ì†Òöö†ü膃ˆñ[Ç”†ˆ›»ì†ì†ì†Òö[Ĉ†ƒúþŸ[Ljƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþö[Äô†ˆ¦õ·ä†‹Ø’ÍþøôüÚÞˆþö[à†ƒˆˆ™òÞ[ƈ›‘óßö膃ˆñ[Áà†ˆ›[Âàìòò†ìò†Òöö†üö†ü[½<„[Á´ƒ[½Hƒšø[ÁDþŽþþ[½f[Á0[½bþŸ[Á ƒù[Àd†ˆ¦õ§ì†Êþø[¿´†ˆ¦õ§ì†Êþø[¿†ˆ¦õ§ì†ëßþø[½¨„[¾Pˆ¦õ§‹á†Êþ[½´ˆ¦õ™‹[½ÀþøôüÚ[¼d†ˆ›»ì†ì†ì†Òö[»à†ˆ›‘Òö[¹´†ƒˆúþŸ[»Ôƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþö[º0†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[¸ ƒˆúþŸ[¹¨ƒùꆄ„þöꆆö[¸|†ˆ¦õ·ä†‹Ø’ÍþøôüÒʆˆþö[·†ˆ›‘Òö[¶ †ˆ›[·ì†ì†ì†ìØöö†üð†ƒù[´†ƒŽúþŸ[µèƒùꆄ‚öꆄ„þöꆄ„þöꆈþö[´l†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†ü[³p†ˆ›‘Òö[²Ð†ˆ›Ÿì†Òö[±ø†ˆ›»ì†ì†ì†Òöö†ü[±,†ˆ›­ì†ì†Òö[°|ˆ›™†ì†óßöð†ƒù[¯Ð†ˆ›‘Òöð†ƒù膃ˆñ[¬ð†ˆ›[¯xì[­t†‹úþŸ[¯Dƒùꆄ„þöꆄ‚öꆆö[­ð†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒù[«0†ƒúþŸ[¬Èƒùꆄ„þöꆆö[«œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[©ˆƒŽúþŸ[«$ƒùꆄ‚öà†ˆþö[©ä†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒù[§à†ˆ›[© òòòòò†ì†ì†Òö[¤ †ˆ›‘‹úþŸ[§Ôƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþö[¤ð†ˆ¦õ·ä†‹Ø’Íþøôü[¤$ö[£P†ˆ›­ìò†ÒöÞ“õþþø[”†ƒŽúþŸ[¢øƒù[Ÿ”†„„‘úþŸ[¢¼„„þö[¡†„„‘úþŸ[¢”„‚öꆆö[¡†ˆ¦õ·ä†‹Ø’Íþøôüþàöà†ˆþö[  †ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö[ü†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[œ¼†ˆ›»ì†ìò†Òö[›ä†ˆ›§†ì†ì†Òö[šð†ˆ›µ†ìò†ìØöð†ƒù؆ˆþöö†üö†ü[™È†ˆ›Ÿì†Òö[™D†ˆ›‘Òöüü[—l†ƒˆúþŸ[™(ƒùꆄ‚öà†ˆþö[—膈¦õ·ä†‹Ø’ÍþøôüÒ[–°†ˆ›™†ìØöð†ƒù[•„†ˆ›[–„ìòò†ì†ì†óßöò†ƒùð†ƒùö†ü膃ˆñò†ƒù膃ˆñ[”ˆ›§òò†Òö[‘†ƒŽúþŸ[“ìƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆö[‘€†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[†ˆ›½Î†‹ˆ‘[,ö[<†ˆ›§ò†ì†Òö[ †ƒúþŸ[0ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö[Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[Œœ†ˆ›‘óßö[‹à†ˆ›­ì†ì†Òö膃ˆñ[ŠÜ†ˆ›»ì†ì†ì†Òö脌ƒóƒù脌ƒóƒù[‰È†ˆ›­ì†ì†Òöð†ƒù[ˆÄˆ›[‰œì†ì†ì†ì†Òö[ˆ4†ˆ›‘Òö[‡$†ˆ›[ˆ$ì†ìò†ìò†Òö[†0†ˆ›[‡ìò†ìòØö[…X†ˆ›»ìò†ì†Òöð†ƒù؆ˆþöö†üð†ƒù[„$†ˆ›Ÿì†Òö[ƒ„†ˆ›‹†Òöˆ›‘ÒöʆˆŸßö[ø†ˆ›Ÿì†Òö[€è†ˆ›[èì†ì†ìò†ìØöʆˆþö[Ćˆ›­ì†ì†Òöò†ƒù؆ˆþö[~ˆ†ˆ›»ìòò†Òö[}°†ˆ›»ì†ì†ì†Òöð†ƒù[|ô†ˆ›Ÿì†Òö[|†ˆ›»ì†ì†ì†Òö[{lˆ›­ì†ì†Òö[yt†ƒˆúþŸ[{D„„þöꆄ„þöꆄ‚öꆆö[yð†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[xœ†ˆ›»ìò†ìØö[u䆃ŽúþŸ[xƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆö[vL†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[u †ˆ›»ì†ì†ì†Òö؆ˆþö[t<†ˆ›‘Òö[s†ˆ›[t,ì†ì†ì†ìòò†Òö؆ˆþö[r†ˆ›­ì†ì†Òö[q†ˆ›[qøì†ìòò†Òö膃ˆñÞ“õþþø[p†ˆ›‘Òö[o@†ˆ›§ò†ì†Òö[nh†ˆ›§†ì†ì†óßö[m†ˆ›»ì†ì†ì†ÒöƆ«þò„þæ„üò÷[lH†ˆ›»ì†ì†ì†Òöö†ü[k`†ˆ›»ì†ì†ì†Òöö†üö†ü[j¼†ˆ›‘Òööƒù[j†ˆ›‘Òöò†ƒù[i€†ˆ›‘Òö[g´†ƒúþŸ[itƒùꆄ‚öꆄ‚öꆆö[h †ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒù[f¨†ˆ›»ì†ì†ì†Òö[eІˆ›»ì†ì†ì†Òöüü[e †ˆ›‹†Òö[dd†ˆ›™†ì†Òöð†ƒùð†ƒù[aH†ˆ›‘‹úþŸ[d ƒùꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆆö[b,†ˆ¦õ·ä†‹Ø’Íþøôü[a`öÞ“õþþø[`x†ˆ›„ßö[_ô†ˆ›‘Òö[_T†ˆ›Ÿì†Òö[^Іˆ›ãö[]ø†ˆ›»ìò†ì†Òöð†ƒù[]†ˆ›»ìò†ì†Òö[Z܆ˆ›‘‹ˆúþŸ[\è„‚öà†ˆ‰õö[[Іˆ¦õ·ä†‹Ø’Íþøôü[Zôö[Z †ˆ›­ìò†óßöð†ƒùö†ü[YT†ˆ›Ÿì†Òö[X¤†ˆ›Ÿ‹á†Òöö†ü[W؆ˆ›™òùßö[T0†ƒúþŸ[W̃ùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚ö[U”†„„‰ˆ§òò†Üöꆈþö[Tœ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[R̆ˆ›[Sø†ìò†ìò†ìò†ì†Òö[R,†ˆ›ŸìØö[Q˜ˆ›‹Øö[Pð†ƒˆˆ™†ì†Ø[MÔ†ƒˆúþŸ[Päƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö[NP†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[L4†ƒŽúþŸ[Mȃùꆄ„þöꆈþö[Lœ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[K°†ˆ›ãö膃ˆñð†ƒùò†ƒùö†ü[J„†ˆ›­ì†ì†Òö[IȆˆ›­ì†ì†Òö[Hð†ˆ›»ì†ì†ì†Òöˆ›‘Òöð†ƒù[Ј›‘Òö[F,†ƒŽúþŸ[GÀƒùꆄ„þöꆆö[F”†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[E8†ˆ›[Fì†ì†ì†ì†Òö[D`†ˆ›»ì†ì†ì†Òö؆ˆþö[C<†ˆ›»ì†ì†ì†Òö[Bd†ˆ›»ì†ì†ì†Òö[AĆˆ›Ÿì†Òöð†ƒùˆ›‘Òö؆“õþþøð†ƒù[><†ƒúþŸ[@°ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö[>¨†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[=†ˆ›™†‹ˆ™†ì†È†Òö[<|†ˆ›‘Òö[;܆ˆ›‹†Òö[;<†ˆ›‹Øöð†ƒù[:d†ˆ›­ì†ìØöð†ƒù[8¤†ƒúþŸ[:<ƒùꆄ„þöꆆö[9†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[7̆ˆ›»ì†ì†ì†Òö[6ô†ˆ›»ì†ì†ì†Òö[68†ˆ›­ìò†Òö[5|†ˆ›­ì†ì†Òö[4̈›­ìò†Òö[3ô†ˆ›™†‹á†Òö[0œ†ƒŽúþŸ[3èƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö[1†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[.ІƒúþŸ[0ƒùꆄ‚öꆄ„þöꆆö[/<†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù膃ˆñ[-̆ˆ›‹†Òö[,ô†ˆ›»ì†ì†ì†Òöö†üð†ƒù[, †ˆ›­ì†ì†Òöøƒù[+†ˆ›[+äìò†ìò†Òö[*|†ˆ›‘Òö[)l†ˆ›[*lì†ì†ìò†ìØö['¸†ƒˆúþŸ[)`ƒùꆄ‚öꆈþö[(4†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[&ü†ˆ›­ì†ì†óßö[&h„[&ðƒ[&tƒŠþŸŒƒùôüÚð†ƒù[%†ˆ›­ì†ì†Òöö†üЈŸßöð†ƒù[$@†ˆ›­ì†ì†Òö[#¼†ˆ›‘Òö["䆈›§òò†Òö["(†ˆ›­ì†ì†Òö[!P†ˆ›»ìò†ìØöò†ƒùö†ü[ P†ˆ›»ì†ì†ì†Òö[x†ˆ›»ì†ì†ì†Òö[¼†ˆ›™†ì†Òö膃ˆñöü[Ô†ˆ›Ÿì†Òö[@†ˆ›‘‹Çö[¼†ˆ›‘Òö膃ˆñ[¸†ˆ›§òò†Òö[†ƒˆˆ§òò†Ø[ †ƒŽúþŸ[ôƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚ö[†„„‰ˆ‘‹úþŸ[œƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆈþö[Іˆ¦õ·ä†‹Ø’Íþøôü[öꆆö[†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[œ†ˆ›½Î†‹ˆ‘[´ö[¸†ˆ›[d[<†‹ˆ[,ò†ì†ì†ì†ìòùÕ†Òö[<†ƒúþŸ[¬ƒùꆆö[¨†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[ ȆƒˆúþŸ[0ƒùꆄ„þöꆄ‚ö[†ˆ‰úþŸ[ȃùꆄ„þöꆈþö[œ†ˆ¦õ·ä†‹Ø’ÍþøôüÖö[D†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[ $†ƒúþŸ[ ¼ƒùꆄ„þöꆈþö[ †ˆ¦õ·ä†‹Ø’ÍþøôüÚ[Ô†ˆ›[ ì†[<†‹šø[ €þŽþþ[v[ l[rþŸ[ \ƒù[ ¼†ˆ¦õ™Êþø[ ð†ˆ¦õ¡†ì†Êþø[ $†ˆ¦õ¡†ì†Êþø[t†ˆ¦õ§ì†Êþø[Ćˆ¦õ§ì†Êþø[†ˆ¦õ§ì†ëßþø[¸„[`ˆ¦õ§‹á†Êþ[Ĉ¦õ™‹[Ðþøôü[ìö[ü†ˆ›»ì†ì†ì†Òö[$†ˆ›»ì†ì†ì†Òö؆ˆþö[†ˆ›­ì†ì†ÒöZþä[ƒZþèƒúþŸ[ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚ö䆄„þö䆄„þö䆈þöZÿH†ˆ¦õ·ä†‹Ø’ÍþøôüÚZý̆ˆ›ZþÌìò†ì†ìò†óßöZýH†ˆ›‘ÒöZüĆˆ›‘ÒöZûІˆ›Zü´ìò†ìòØöò†ƒùð†ƒùð†ƒùZù¤†ƒŽúþŸZûtƒùꆄ‚öꆄ‚öà†ˆ‰õöZú †ˆ¦õ·ä†‹Ø’ÍþøôüÜZøÌ†ˆ›»ì†ì†ì†ÒöЈþöð†üZõô†ƒˆúþŸZø<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöZöp†ˆ¦õ·ä†‹Ø’ÍþøôüÒZõ†ˆ›»ì†ìò†ÒöZôD†ˆ›»ìòò†ÒöZól†ˆ›§†ì†ì†ÒöZòx†ˆ›µ†ìò†ìØöð†ƒùZñ؆ˆ›‘Òöð†ƒù膃ˆñZ𸆈›»ì†ì†ì†Òöò†ƒùò†ƒùZï°†ˆ›»ì†ì†ì†ÒöЈþö膃ˆñð†ƒùò†ƒùZíD†ƒúþŸZî܃ùꆄ„þöꆆöZí°†ˆ¦õ·ä†‹Ø’ÍþøôüÚZêĆˆ›Zí4ìòò†ì†ì†ZëŠúþŸZìƒùꆆöZ댆ˆ¦õ·ä†‹Ø’ÍþøôüZêÜöZåd†ƒˆúþŸZ긃ùꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþöZåà†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùZ䨆ˆ›ãöZãІˆ›»ì†ì†ì†ÒöZãL†ˆ›‘ÒöZↈ›­ì†ì†óßöZâ †ˆ›‘ÒöZá4†ˆ›»ì†ì†ì†ÒöZàx†ˆ›­ì†ì†Òö膃ˆñöƒùð†ƒù脌ƒóƒùð†ƒù膃ˆñð†ƒùZÝl†ƒˆúþŸZßxƒùꆄ‚öꆄ‚öꆄ„þöà†ˆþöZÝ膈¦õ·ä†‹Ø’ÍþøôüÒZÜ膈›‘Òöò†ƒùZÛø†ˆ›§†ì†ì†óßöZÛt†ˆ›‘Òöð†ƒùZÚ€†ˆ›»ì†ì†ì†ÒöZÙü†ˆ›‘ÒöÞ“õþþøð†ƒùZÖH†ƒˆúþŸZÙˆƒùZ×”†ˆ‘úþŸZÙ`„‚öꆄ‚öꆄ‚öꆆöZØ †ˆ¦õ·ä†‹Ø’ÍþøôüþàöZÖĆˆ¦õ·ä†‹Ø’ÍþøôüÒZÔ䆈›ZÖòòòòò†ì†ì†ÒöZÓ솈›ZÔċن‹á†ì†ÒöZÒL†ƒˆúþŸZÓàƒùà†ˆþöZÒȆˆ¦õ·ä†‹Ø’ÍþøôüÒZÑ<†ˆ›ZÒ†ì†ì†ìò†ÒöZÐŒˆ›™†ì†Òö膃ˆñZϘ†ˆ›­ì†ì†ÒöZφˆ›‘ÒöZÎt†ˆ›Ÿì†Òöö†üö†üZÍ´†ˆ›Ÿì†ÒöZÌ܆ˆ›»ì†ì†ì†Òö؆ˆþöö†üZ˨†ˆ›»ì†ì†ì†ÒöZˆˆ›‹†ÒöøƒùZÈœ†ƒˆúþŸZÊäƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöZɆˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùZǨ†ˆ›™†ì†ÒöZÆ´†ˆ›Zǘì†ìò†ì†Òö膃ˆñ؆ˆþöZÅd†ˆ›»ì†ì†ì†ÒöZÄŒ†ˆ›»ì†ì†ì†Òöò†ƒùö†üZÃĆˆ›Ÿì†Òöüüð†ƒùð†ƒùZ¤†ˆ›§òò†ÒöZÀ(†ƒˆúþŸZ˜ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöZÀ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üò†ƒùð†ƒùZ¾X†ƒˆúþŸZ¿ØƒùꆈþöZ¾Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒZ½¨†ˆ›§ä†‹ÇöZ½†ˆ›Ÿì†ÒöZ¼h†ˆ›Ÿì†ÒöZ»ä†ˆ›‘ÒöZ»Pˆ›‹†ÒöZºˆ†ˆ›™†ìØöò†ƒùZ¹ì†ˆ›‘Òöð†ƒùZ¸ø†ˆ›»ìòò†ÒöZ¸ †ˆ›§†ì†ì†óßöZ·d†ˆ›™†ì†óßöð†ƒùZ¶Œ†ˆ›­ìò†ÒöZµ¤†Z¶~þò„þò„þò„þò„þò„þÚ„üˆ„þè÷ð†ƒùöƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùZ´†ˆ›»ì†ì†ì†Òöð†ƒùZ³X†Z³êþò„þò„þò„þæ„üò÷Z²Ô†ˆ›‘ÒöZ²†ˆ›­ì†ì†ÒöZ±x†ˆ›Ÿì†Òöð†ƒùЈþöZ®´†ƒŽúþŸZ°èƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöZ¯†ˆ¦õ·ä†‹Ø’ÍþøôüÜ̆ƒˆˆ‹†ØZ­”†ˆ›­ì†ì†Òöò†ƒùZ¬Ü†ˆ›Ÿì†Òöö†ü膃ˆñZ«È†ˆ›»ì†ì†ì†ÒöZªð†ˆ›§†ì†ì†óßöøƒùZª†ˆ›™†ì†Òö膃ˆñZ©P†ˆ›Ÿì†óßöò†ƒù膃ˆñö†üZ¨$†ˆ›»ì†ì†ì†ÒöZ§L†ˆ›»ì†ì†ì†ÒöZ¦t†ˆ›»ì†ì†ì†ÒöZ¥œ†ˆ›»ì†ì†ì†Òööƒùð†ƒùZ¤p†ˆ›Z¥Tì†ìò†ì†ÒöZ£|†ˆ›µòò†ì†ÒöZ¢ø†ˆ›ãöZ¡è†ˆ›Z¢èì†ì†ì†ì†ì†ÒöZ¡d†ˆ›‘ÒöZ à†ˆ›‘ÒöZ \†ˆ›„ßöö†üò†ƒùZŸ\†ˆ›»ì†ìò†ÒöZž„†ˆ›»ì†ì†ì†Òö؆ˆþöZh†‡üZž"„þò„þò„þò„þò„þò„þè÷ZœÔˆ›Ÿì†Òö؆“õþþøð†ƒùʆˆþöʆˆþöZšÔ†ˆ›­ì†ì†ÒöZšP†ˆ›‘Òö؆ˆþöZ™d†ˆ›Ÿì†ÒöZ˜Œ†ˆ›»ì†ì†ì†ÒöZ—Іˆ›­ì†ì†Òööƒùò†ƒùð†ƒùð†ƒùZ–Ȇƒˆˆ™†ì†Øè†ƒˆñZ•ü†ˆ›Ÿì†Òöö†üð†ƒùZ”ø†ˆ›»ì†ìò†ÒöZ”<†ˆ›­ìò†ÒöZ“œ†ˆ›Ÿì†Òöˆ›‘ÒöZ’x†ˆ›Ÿì†ÒöZ¬†ƒˆúþŸZ’lƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöZ(†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñZލ†ˆ›»ìòò†Òöð†ƒùZŒØ†ƒˆúþŸZŽ€ƒùꆄ‚öꆈþöZT†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù؆ˆþöö†üZ‹p†ˆ›ZŒTì†ì†ì†ì†ÒöZŠ˜†ˆ›»ì†ì†ì†ÒöZ‰À†ˆ›»ì†ì†ì†ÒöZ‰ †ˆ›Ÿì†ÒöZ‡ô†ˆ›Z‰ì†ì†ì†ìò†ì†ÒöZ‡`ˆ›ŸìØöð†ƒùð†ƒùZ†˜†ˆ›‘ÒöZ††ˆ›ãöZ…t†ˆ›‹†ÒöZ„Ô†ˆ›Ÿì†ÒöZƒü†ˆ›§†ì†ì†Òööƒùð†ƒù膃ˆñZ‚¤†ˆ›µ†ìò†ì†Òöð†ƒùZ°†ˆ›»ì†ìò†ÒöZ䆃úþŸZ¤ƒùꆄ‚öꆄ„þöꆈþöZ€P†ˆ¦õ·ä†‹Ø’ÍþøôüÚ脌ƒóƒùð†ƒùZ~Ćˆ›»ì†ì†ì†ÒöZ~†ˆ›­ì†ì†ÒöZ{P†ƒŽúþŸZ}üƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöZ{¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜZv†ƒúþŸZ{Dƒùꆄ„þöꆄ‚öZwP†ˆ‘úþŸZzÌ„„þöZx˜†ˆ‘úþŸZz´ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöZy†ˆ¦õ·ä†‹Ø’ÍþøôüÞöZwȆˆ¦õ·ä†‹Ø’ÍþøôüþàöZv€†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†üZudˆ›‹†óßöò†ƒùZrĆƒˆúþŸZu4ƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆöZs@†ˆ¦õ·ä†‹Ø’ÍþøôüÒZq†ƒˆúþŸZr¸ƒùꆄ‚öↈ‰õöZq|†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùZp†ˆ›»ì†ì†ì†ÒöZn䆈›Zpìòò†ìò†ì†ÒöZmð†ˆ›ZnÔìò†ì†ì†Òöð†ƒùZlü†ˆ›»ì†ì†ì†Òöˆ›‘óßöð†ƒùZj¸†ƒúþŸZlPƒùꆄ‚öꆆöZk$†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùð†ƒùZh”†ƒŽúþŸZjxƒùꆄ„þöà†„„þöà†ˆþöZhü†ˆ¦õ·ä†‹Ø’ÍþøôüÜZh†ˆ›‘óßöZgT†ˆ›™†ìØöZf˜†ˆ›™ò†ÒöZeÀ†ˆ›»ì†ìò†ÒöZe<†ˆ›‘Òöö†üZcð†ˆ›Ze䆋áò†ì†ìòØö؆ˆþöZb膈›­ì†ìØöð†ƒùZaô†ˆ›»ì†ì†ì†ÒöZa†ˆ›»ì†ì†ì†ÒöZ`D†ˆ›»ì†ì†ì†ÒöZ_¤†ˆ›‹†ÒöZ_ˆ›‹Øö膃ˆñZ^†ˆ›™ò†ÒöZ]D†ˆ›§†ìò†ÒöZ\l†ˆ›§†ìò†ÒöZZ솈›Z\\ìò†ìòò†ìò†ìòØöö†üZZX†ˆ›‘ÒööƒùZXt†ƒˆúþŸZZ0ƒùꆄ‚öà†ˆþöZXð†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùZW؆ˆ›‘ÒöZVȆˆ›ZWÈì†ìòòòØöZSd†ƒúþŸZV¼ƒùꆄ‚öZT †ˆ‰úþŸZV|ƒùꆄ„þöꆄ„þöꆈþöZU(†ˆ¦õ·ä†‹Ø’ÍþøôüÖöZSІˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñð†ƒùZR4ˆ›ZS ì†ìò†ì†Òöð†ƒùZQ†ˆ›µòò†ì†ÒöZP†ˆ›ZQì†ì†ì†ì†ì†Òöò†ƒùZM؆ƒŽúþŸZOäƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöZN@†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùò†ƒùZJ„†ƒˆšøZM<þŽþþZJ¾ZM(ZJºþŸZMƒùZL\†ˆ¦õ§ì†ëßþøZK„ZK¨ˆ¦õ§‹á†ÊþZK ˆ¦õ™‹ZKþøôüÒZI¬†ˆ›»ì†ì†ì†Òö؆ˆþöZHˆ†ˆ›»ì†ì†ì†ÒöZG°†ˆ›»ì†ì†ì†Òöð†ƒùˆ›‘Òöð†üò†ƒùZFH†ƒŽü°þò„þò„þò„þåZE¨†ˆ›Ÿì†ÒöZDІˆ›»ì†ì†ì†ÒöZCø†ˆ›»ì†ì†ì†ÒöÞ“õþþøZC(†ˆ›‘Òöð†ƒùZ@̆ƒŽúþŸZCƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöZA4†ˆ¦õ·ä†‹Ø’ÍþøôüÜZ>ð†ƒˆúþŸZ@Àƒùꆄ‚öꆄ„þöꆆöZ?l†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üZ>†ˆ›»ì†ìò†ÒöZ9°†ˆ›Z=øZ:†‹šøZ=€þŽþþZ:RZ=lZ:NþŸZ=\ƒùZ< †ˆ¦õ§ì†ÊþøZ;ð†ˆ¦õ§ì†ëßþøZ:”„Z;<ˆ¦õ§‹á†ÊþZ: ˆ¦õ™‹Z:¬þøôüZ9ÈöʆˆþöZ8p†ˆ›»ì†ì†ì†ÒöZ7Іˆ›Ÿì†Òöö†üZ7 †ˆ›Ÿì†ÒöZ/Ȇˆ›Z7ì†Z00†‹šøZ6|þŽþþZ0jZ6hZ0fþŸZ6XƒùZ5d†ˆ¦õZ6<ì†ì†ì†ÊþøZ4˜†ˆ¦õµì†ì†ÊþøZ3̆ˆ¦õµì†ì†ÊþøZ2¸†ˆ¦õZ3¬‹áò†ì†ì†ÊþøZ2†ˆ¦õ§ì†ëßþøZ0¬„Z1Tˆ¦õ§‹á†ÊþZ0¸ˆ¦õ™‹Z0ÄþøôüZ/àöZ/(†ˆ›Ÿì†Òööƒùð†ƒùZ-†ƒŽúþŸZ.äƒùꆄ‚öꆄ‚öꆄ‚öꆆöZ-h†ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñZ+ü†ˆ›§òò†ÒöZ+\†ˆ›Ÿì†ÒöZ(à†ƒˆúþŸZ+Pƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöZ)\†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùð†üZ'†ƒˆúþŸZ(€ƒùꆈþöZ'|†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùò†ƒùZ&0†ˆ›Ÿì†ÒöZ%X†ˆ›»ì†ì†ì†ÒöZ$†ˆ›Z%Hìò†ì†ì†ì†ì†ì†ÒöüüZ#D†ˆ›™†ìØöZ ȆƒŽúþŸZ#8ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöZ!0†ˆ¦õ·ä†‹Ø’ÍþøôüÜZ (†ˆ›‹Øö膃ˆñZ †ƒˆúþŸZðƒùꆄ„þöꆄ„þöꆈþöZœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùZd†ˆ›Ÿì†óßöZT†ˆ›ZTì†ìò†ìòØöð†ƒùð†ƒù؆“õþþøZ4„ZăZ@ƒšøZTþŽþþZ^Z@ZZþŸZ0ƒùZ膈¦õZì†ìòòò†ì†ÊþøZ¬†ˆ¦õZØì†ìòòò†ì†ÊþøZü†ˆ¦õ§ì†ëßþøZ „ZHˆ¦õ§‹á†ÊþZ¬ˆ¦õ™‹Z¸þøôüÚZ\†ˆ›»ì†ì†ì†Òöð†ƒùö†üZ†ˆ›ŸìØöZ †ˆ›‘ÒööƒùZ4†ˆ›™†ì†ÒöZx†ˆ›­ì†ì†ÒöZô†ˆ›‘ÒöZT†ˆ›Ÿì†Òöð†üð†ƒùZD†ˆ›»ì†ì†ì†ÒöZl†ˆ›»ì†ì†ì†ÒöZ̆ˆ›ŸìØöÞ“õþþøè†ƒˆñZ °†ƒúþŸZHƒùꆄ„þöꆈþöZ †ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùZ P†ƒˆúþŸZ ˆƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöZ ̆ˆ¦õ·ä†‹Ø’ÍþøôüÒZ”†ˆ›™†ì†ÒöZ †ˆ›Z„ì†ìò†ì†ÒöZ†ˆ›Zì†ì†ì†ì†ì†Òöð†ƒùö†üZ$†ƒŽúþŸZXƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöZŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÜZh†ˆ›­ì†ìØööƒùYþ܆ƒŽúþŸZ@ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öà†„„þöꆆöYÿD†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùö†üYüĆƒŽúþŸYþ¨ƒùꆄ„þöà†„„þöà†ˆþöYý,†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùYûð†ˆ›™†ìØöÔ†ƒˆ‹†àYú´†ˆ›»‹á†ìò†Òöò†ƒùYùà†ˆ›­ì†ìØöð†ƒù؆ˆþöYøØ†ˆ›Ÿì†ÒöYø†ˆ›»ì†ì†ì†ÒöY÷(†ˆ›»ì†ì†ì†ÒöYöl†ˆ›­ìò†Òöˆ›‘ÒöYõ,†ˆ›™†ì†óßöYôT†ˆ›§†ìò†ÒöY󴆈›Ÿì†Òöö†üYò̆ˆ›»ì†ì†ì†ÒöYò†ˆ›™†ì†ÒöYð䆈›Yòì†ì†ì†ìòò†Òöö†üYð†ˆ›™†ìØöñYîø†ˆ›µ†ìò†ì†ÒöYîX†ˆ›Ÿì†ÒöY퀆ˆ›»ì†ì†ì†ÒöY쨆ˆ›»ì†ì†ì†ÒöYëІˆ›»ìò†ì†Òöö†üò†ƒùˆ›‘ÒöYê †ˆ›‘ÒöYꆈ›‘óßöð†ƒùYéD†ˆ›™†ì†ÒöYæÈ†ƒˆúþŸYé8ƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆöYçD†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùYãÀ†ˆ›Yæ‹á†ìY䘆‹úþŸYæ@ƒùꆄ‚öꆈþöY冈¦õ·ä†‹Ø’Íþøôü†ì†ì†ì†ÒöYã<†ˆ›‘ÒöYâd†ˆ›»ì†ì†ì†ÒöYጆˆ›§ò†ì†Òöö†üö†üYàØˆ›‹†óßöYà,†ˆ›Ÿì†Òöð†ƒùYÝD†ƒˆúþŸYàƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöYÝÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÒY܈†ˆ›­ìò†ÒöYÛ°†ˆ›»ì†ìò†ÒöYÙ„†ˆ›YÛ ì†YÙ솋úþŸYÛlƒùꆆöYÚh†ˆ¦õ·ä†‹Ø’ÍþøôüYÙœöY×ІƒˆúþŸYÙxƒùꆄ‚öꆈþöYØL†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùYÕ˜†ƒúþŸYרƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöYÖ†ˆ¦õ·ä†‹Ø’ÍþøôüÚYÔÀ†ˆ›§†ì†ì†óßö؆ˆþö؆ˆþöð†ƒùYÓl†ˆ›Ÿì†Òöˆ›‘ÒöYÎP†ƒŽúþŸYÒ܃ùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöYθ†ˆ¦õ·ä†‹Ø’ÍþøôüÜYͰ†ˆ›ŸìØö膃ˆñð†ƒù؆“õþþøYÌD†ˆ›»ì†ìò†Òö؆ˆþöYË †ˆ›»ì†ì†ì†ÒöYÊœ†ˆ›‘ÒöYÉü†ˆ›‹†Òöð†ƒùˆ›‘Òöð†ƒùö†üYÈX†ˆ›»ì†ì†ì†ÒööƒùYÆ\†ƒúþŸYÈ0ƒùꆄ„þöꆄ‚öà†ˆþöYÆÈ†ˆ¦õ·ä†‹Ø’ÍþøôüÚYÂ|†ƒˆúþŸYÆPƒùꆄ‚öꆄ‚öYÅ0†„„‰ˆ§òò†Üöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöYÂø†ˆ¦õ·ä†‹Ø’ÍþøôüÒYÁ܆ˆ›‹†ÒöYÁ@†ƒˆˆ™†ì†ØY¿Œ†ƒˆúþŸYÁ4ƒùꆄ‚öꆈþöYÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñY½ð†ƒˆˆY¿Pì†ì†È†‹ˆ„Õ†ì†ì†ì†ØY½†ƒˆˆY½àìòò†ì†Øö†üð†ƒùY¼†ˆ›»ì†ì†ì†ÒöY»@†ˆ›»ì†ì†ì†ÒöYº †ˆ›Ÿì†Òöˆ›‘óßöY·t†ˆ›Y¸t‹úþŸYºƒùꆄ‚öꆈþöY¸ä†ˆ¦õ·ä†‹Ø’Íþøôü†ìòòò†ÒöY¶œ†ˆ›»ì†ì†ìØöY´ø†ƒúþŸY¶ƒùꆄ‚öꆈþöYµd†ˆ¦õ·ä†‹Ø’ÍþøôüÚY´ †ˆ›»ì†ì†ì†ÒöY³€†ˆ›Ÿì†Òö؆ˆþöY²@†ˆ›Y³$ìò†ì†ì†ÒöY±h†ˆ›»ì†ì†ì†ÒöY®PƒˆúþŸY±\ƒùY¯¸†„„‘úþŸY±4„‚öꆆöY°0†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöY®À†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùY«\†ƒˆúþŸY®ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöY«Ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒY©h†ƒúþŸY«Pƒùꆄ„þöꆄ‚öꆄ„þöꆆöY©Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚY¨X†ˆ›Y©Xì†ì†ì†ì†ì†ÒöY§Ô†ˆ›‘Òöò†ƒùð†ƒùY§†ˆ›Ÿì†ÒöY¦D†ˆ›­ì†ì†ÒööƒùY¥ˆ†ˆ›Ÿì†ÒöY¤è†ˆ›Ÿì†Òö膃ˆñY¤8†ˆ›‘ÒöʆˆþöY¡Ì†ƒˆúþŸY£Äƒùꆄ‚öꆄ„þöꆄ„þöꆈþöY¢H†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üö†üY Ô†ˆ›»ì†ì†ì†ÒöYŸü†ˆ›»ì†ì†ì†ÒöYŸ$†ˆ›»ì†ì†ì†ÒöY܆ˆ›Yžì†ìò†ìò†ì†ì†ÒöYHˆ›‹†óßöð†üY›0†ƒˆúþŸYƒùꆄ‚öꆄ‚öà†ˆþöY›¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùò†ƒùY™\†ƒŽúþŸYšðƒùꆄ‚öꆆöY™Ä†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üY˜È†ˆ›„ßö膃ˆñ脌ƒóƒùY—Іˆ›ŸìØöð†ƒùüü膃ˆñð†ƒù膃ˆñY–¬†ˆ›‘óßöY”ô†ƒúþŸY– ƒùꆄ‚öà†ˆþöY•`†ˆ¦õ·ä†‹Ø’ÍþøôüÚY“䆈›Y”äì†ìò†ìò†ÒöYø†ƒˆúþŸY“؃ùꆄ‚öY‘”†„„‰úþŸY“˜ƒùꆄ‚öꆄ„þöꆄ„þöꆈþöY’†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆈþöYt†ˆ¦õ·ä†‹Ø’ÍþøôüÒY †ˆ›»ìòò†ÒöYŽ€†ˆ›‹†Òö脌ƒóƒùYĆƒŒü°þò„þò„þò„þçY‰l†ˆ›Y´Y‰Ô†‹šøY<þŽþþYŠY(YŠ þŸYƒùYŒ\†ˆ¦õ§ì†ÊþøY‹¬†ˆ¦õ§ì†ëßþøYŠP„YŠøˆ¦õ§‹á†ÊþYŠ\ˆ¦õ™‹YŠhþøôüY‰„öö†üYˆ„†ˆ›»ì†ìò†ÒöY‡¸†ˆ›­‹áò†Òö؆ˆþööƒùY†x†ˆ›»ì†ì†ì†ÒöY…ô†ˆ›‘Òöð†ƒùY„†ƒŽúþŸY…̃ùꆄ‚öꆄ‚öꆆöY„x†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùYƒ8†ˆ›‹Øö膃ˆñY솈›Y‚ì‹á†ìò†ìò†Òöð†ƒùð†ƒùY†ˆ›Ÿì†óßöY€t†ˆ›‹†Òöð†ƒùYy†ƒˆúþŸY€<„‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöY{à†„„‰úþŸY$„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöY|h†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöYy€†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñYx8†ˆ›Ÿì†ÒöYp8†ˆ›Yx(Yp †‹šøYw°þŽþþYpÚYsôøYw@þŽþþYtYw,YtþŸYwƒùYv`†ˆ¦õ§ì†ÊþøYu°†ˆ¦õ§ì†ëßþøYtT„Ytüˆ¦õ§‹á†ÊþYt`ˆ¦õ™‹YtlþøôüYpÖþŸYsäƒùYs(†ˆ¦õ§ì†ÊþøYrx†ˆ¦õ§ì†ëßþøYq„YqĈ¦õ§‹á†ÊþYq(ˆ¦õ™‹Yq4þøôüYpPöYo`†ˆ›»ìò†ì†ÒöYn¼†ƒˆŽü°þò„þò„þò„þÝYn†ˆ›­ìò†ÒöYm(†ˆ›»ì†ì†ì†Òöö†üYkt†ƒúþŸYm ƒùꆄ‚öꆆöYkà†ˆ¦õ·ä†‹Ø’ÍþøôüÚYjàˆ›Ÿì†ÒöYj†ˆ›­ì†ì†ÒöYi\†ˆ›™òØöYh؆ˆ›‘ÒöYh†ˆ›»ì†ì†ì†ÒöYg`†ˆ›‹†ÒöYc<ƒˆúþŸYgD„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöYc¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒYb†ˆ›‹†ÒöYað†ˆ›Ÿì†Òöð†ƒù膃ˆñY`Іˆ›»ìòò†Òöð†üY`0†ˆ›‘Òöò†ƒùY^Œ†ƒˆúþŸY` ƒùꆈþöY_†ˆ¦õ·ä†‹Ø’ÍþøôüÒY]솈›‹†Òöò†ƒùY\ü†ˆ›»ì†ì†ì†Òö؆ˆþöö†üY[䆈›­ìò†ÒöYY†ƒˆúþŸY[؃ùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöYY”†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒùYX@†ˆ›™†ì†Òöð†ƒùð†ƒùYVø†ˆ›YWøìòò†ìò†Òöö†üð†ƒùöƒùYTü†ƒŽúþŸYV¤ƒùꆄ‚öà†ˆ‰õöYUd†ˆ¦õ·ä†‹Ø’ÍþøôüÜYTx†ˆ›‘óßöYS¼†ˆ›™ò†ÒöÔ†ƒˆ‘àð†ƒùYR<†ˆ›YS†ì†ì†ìò†ÒöYQœ†ˆ›Ÿì†Òöˆ›‘óßöð†ƒù膃ˆñYKô†ƒˆúþŸYPăùYMh†„„‰úþŸYP¬ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöYMð†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöYLp†ˆ¦õ·ä†‹Ø’ÍþøôüÒYKT†ˆ›ŸìØöYIˆ†ƒúþŸYKHƒùꆄ‚öꆄ‚öꆆöYIô†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþöö†üò†ƒù脌ƒóƒùð†ƒùö†ü؆ˆþöYGІˆ›‘Òö脌ƒóƒùö†üò†ƒùYF¤†ˆ›»ì†ì†ì†ÒöYAœ†ˆ›YF”YB†‹šøYFþŽþþYB>YFYB:þŸYEøƒùYE<†ˆ¦õ§ì†ÊþøYDŒ†ˆ¦õ§ì†ÊþøYC܆ˆ¦õ§ì†ëßþøYB€„YC(ˆ¦õ§‹á†ÊþYBŒˆ¦õ™‹YB˜þøôüYA´öY@à†ˆ›­ìòØöñʆˆŸßöY>H†ƒˆúþŸY@@ƒùꆄ„þöꆄ‚öꆄ‚öꆆöY>Ćˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùY<†ƒˆúþŸY> ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆöY<|†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùY;,†ˆ›™†ìùßöY9ü†ˆ›Y:Ô‹ˆ‘Y:d†‹ˆ„Y:öY8Іˆ›Y9ìì†ìò†ìò†ìØöð†ƒùò†ƒùY6p†ƒˆúþŸY8ƒùY7䆄„ü°þò„þò„þò„þéöꆆöY6솈¦õ·ä†‹Ø’ÍþøôüÒˆ›‘ÒöY5L†ˆ›‹†ÒöʆˆþöY2†ƒˆúþŸY4؃ùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöY3 †ˆ¦õ·ä†‹Ø’ÍþøôüÒY1¸†ˆ›»ì†ì†ìØöò†ƒùY1†ˆ›‹†Òöð†ƒùY,H†ˆ›‘‹úþŸY0؃ùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöY-,†ˆ¦õ·ä†‹Ø’ÍþøôüY,`öY+p†ˆ›»ì†ì†ì†Òöð†ƒùˆ›‘óßöY#´†ƒŽúþŸY*ăùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöY$솈‘úþŸY)¬„‚öꆄ‚öꆄ„þöꆈþöY(X†ˆ¦õ·ä†‹Ø’ÍþøY%PüþšY(Tüö†üY'h†ˆ¦õ·ä†‹Ø’ÍþøY%p•Y'\þY%¸„‘úþŸY'4„„þöà†ˆþöY&†ˆ¦õ·ä†‹Ø’ÍþøôüþàéþïþÐöY$†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùʆˆþöò†ƒù膃ˆñY ̆ƒˆúþŸY"ăùꆄ„þöꆄ„þöꆄ„þöꆆöY!H†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùY †ˆ›Ÿì†ÒöY䆈›Y ìò†ìòò†ìØöüüYl†ƒŽúþŸYȃùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöYÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÜYx†ˆ›µòò†ì†óßöð†ƒùY †ˆ›­ì†ìØöY†ˆ›ŸìØöYD†ˆ›­ì†ìØöY˜†ˆ›‘“úþŸY8ƒùY<†ˆ‘úþŸYP„„‘úþŸY„‚öꆄ‚öꆄ‚öꆆöY¼†ˆ¦õ·ä†‹Ø’ÍþøôüþàöY¬†„„‘úþŸY(„‚öꆆöY$†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöY´†ˆ¦õ·ä†‹Ø’ÍþøôüþàöYl†ˆ¦õ·ä†‹Ø’ÍþøôüÑßö؆ˆþöYȆˆ›‘ÒöY†ˆ›Y¸ì†ìò†ì†ì†ì†ìòò†ìò†ÒöYp†ˆ›Ÿì†ÒöY`†ˆ›Y`ìò†ì†ì†ì†ÒöY °ˆ›™†ì†Òöö†üð†ƒùY 4†ƒúþŸY lƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöY  †ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùY d†ƒˆúþŸY ƒùꆄ„þöꆈþöY à†ˆ¦õ·ä†‹Ø’ÍþøôüÒY¨†ˆ›™†ì†ÒöY$†ˆ›‘Òöò†ƒùY4†ˆ›»ì†ì†ì†ÒöYx†ˆ›­ì†ì†Òö†ƒŒü¤þò„þò„þçY(†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöYœ†ˆ›Y€ì†ìò†ì†ÒöYĆˆ›»ì†ì†ì†ÒöYD†ˆ›YŒòò†ìò†ìò†ìò†ÒöÞ“õþþøð†ƒùY,†ˆ›Ÿ‹á†ÒöXüÔ†ˆ›­‹úþŸY ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöXýð†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöð†ƒùÔ†ƒˆ‘àXû¨†ˆ›­ì†ì†ÒöXúІˆ›»ì†ì†ì†Òö؆ˆþöð†ƒùXù¬†ˆ›­ìò†ÒöXùˆ›Ÿì†ÒöXõ4†ˆ›»‹úþŸXùƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆆöXöl†ˆ¦õ·ä†‹Ø’ÍþøôüÂòò†ÒöX󀆃ˆúþŸXõ(ƒùꆄ‚öꆆöXóü†ˆ¦õ·ä†‹Ø’ÍþøôüÒXòĆˆ›™†ì†Òöð†ƒùXò$†ˆ›‘Òöò†ƒùXð€†ƒˆúþŸXòƒùꆈþöXðü†ˆ¦õ·ä†‹Ø’ÍþøôüÒX暴ˆ›»ì†ì†ì†Òö؆ˆþöXˆ›Ÿì†ÒöXî(ˆ›‹†óßöð†ƒùXí|†ˆ›‘Òö膃ˆñð†ƒùXìx†ˆ›­ì†ì†ÒöXë †ˆ›»ì†ìò†Òöˆ›‘ÒöXê(†ˆ›µòò†ìØöXéP†ˆ›»ì†ì†ì†ÒöXè@†ˆ›Xé@ì†ì†ì†ìò†Òöð†ƒùð†ƒù膃ˆñð†ƒùXæ4†ƒˆúþŸXç´ƒùꆆöXæ°†ˆ¦õ·ä†‹Ø’ÍþøôüÒXâ`†ƒúþŸXæ(ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöXâ̆ˆ¦õ·ä†‹Ø’ÍþøôüÚXሆˆ›§†ì†ì†ÒöXÚ4†ƒˆúþŸXál„‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöX݆„„‰úþŸXàT„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöXݘ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöXÚ°†ˆ¦õ·ä†‹Ø’ÍþøôüÒX؆ƒˆúþŸXÚ(ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöXØ„†ˆ¦õ·ä†‹Ø’ÍþøôüÒX×h†ˆ›Ÿì†Òö؆ˆþöð†ƒùXÖD†ˆ›­ìò†ÒöXÕ¤†ˆ›ŸìØöXÕˆ›ŸìùßöXÔ,†ˆ›§†ì†ì†ÒöXÓŒ†ˆ›Ÿì†ÒöXÒ솈›‹†ÒöXÒ0†ˆ›­ìò†ÒöXÑX†ˆ›§òò†ÒöXÏT†ƒˆúþŸXÑLƒùꆄ‚öꆄ„þöꆄ„þöꆈþöXÏІˆ¦õ·ä†‹Ø’ÍþøôüÒXδ†XÏFþò„þò„þò„þæ„üò÷ð†ƒùX͈†ˆ›XΈìò†ì†ì†ì†ÒöXÅ “¼XÇäXÍ–’XÇÜøüøüøüøüøüøüøüøüøüøüXÆ8XÆÐööXŰ›‹ØöXÄ †ˆ›XÅ„ì†ìòò†Òö膃ˆñ膃ˆñXÃp†ˆ›§†ìòØöö†üXÂÀ†ˆ›Ÿì†ÒöXÁ膈›»ì†ì†ì†Òöð†ƒùð†ƒùXÁ,†ˆ›‘ÒöX¾øƒŽúþŸXÁ ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþöX¿T†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùX½Œ†ˆ›»ì†ì†ìØöò†ƒùX¼Ô†ˆ›‹†ÒöX»ü†ˆ›»ì†ì†ì†ÒöX»$†ˆ›»ì†ì†ì†Òöò†ƒùö†üXº†ˆ›Xºììò†ì†ì†ÒöX¹<†ˆ›­‹á†ì†ÒöX¸¨ˆ›Ÿì†ÒöX¸†ˆ›‘ÒöX·†ˆ›X¸ì†ì†ì†ì†ì†ÒöX¶†ƒˆˆX¶øì†ìòò†ì†Øð†ƒù؆ˆþöXµ†ˆ›Ÿì†ÒöX´`ˆ›™†ìùßöX°Ü†ƒˆúþŸX´Hƒùꆄ‚öX²(†ˆ‰’úþŸX´ƒùꆄ‚öꆄ‚öꆆöX²´†ˆ¦õ·ä†‹Ø’ÍþøôüÔöX±X†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùX°†ˆ›Ÿì†ÒöX¯€†ˆ›‘ÒöX®ü†ˆ›‘Òöð†ƒùX®\†ˆ›ãöX­ †ˆ›­ì†ìØöX¬ä†ˆ›™†ì†ÒöX¬ †ˆ›»ì†ìò†ÒöX«l†ˆ›Ÿì†Òöö†üXªØ†ˆ›‘ÒöXª†ˆ›™ò†ÒöX©|†ˆ›Ÿì†Òöð†ƒùöƒù膃ˆñ膃ˆñX¨0†ˆ›™†ì†ÒöX¤`†ƒŽúþŸX¨$ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöX¤È†ˆ¦õ·ä†‹Ø’ÍþøôüÜX£¤†ˆ›­ì†ìØö؆ˆþöX¢H†ˆ›X£Hìò†ìò†ì†Òö؆ˆþöò†ƒùX d†ˆ›X¡¬òò†ìò†ìò†ìò†ÒöX˜<ƒˆúþŸX Xƒùꆄ‚öꆄ‚öX™|†ˆ‘úþŸXž „„‘úþŸXŸà„‚öꆄ‚öꆄ‚öꆆöXžŒ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöXšÄ†ˆ‘úþŸXì„„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆈þöX›<†ˆ¦õ·ä†‹Ø’ÍþøôüþàöX™ô†ˆ¦õ·ä†‹Ø’ÍþøôüþàöX˜¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒX–|†ƒˆúþŸX˜$ƒùꆄ‚öꆆöX–ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒX•܆ˆ›‹†Òöð†ƒùX”膈›»ì†ì†ìØöX“ †ƒˆúþŸX”܃ùꆄ‚öꆄ„þöꆆöX“ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒXà†ˆ›‘‹úþŸX“ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöↄ„‰õöX\†„„‰ˆ™ò†Üöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöXŽÄ†ˆ¦õ·ä†‹Ø’ÍþøôüXøö؆ˆþöXŒô†ˆ›Ÿì†ÒöXŒp†ˆ›„ßö؆ˆþöX‹L†ˆ›»ì†ì†ì†ÒöXЬ†ˆ›Ÿì†Òöð†ƒùX‰¸†ˆ›»ìòòØöX†$“¼X‡dŠ–˜þ˜þ–˜X‰ˆ’Xˆ ‚ˆ’Âü–üX‡\X†¼X‡@öX†4›‹Øöð†ƒùò†ƒùX…D†ˆ›Ÿì†ÒöX„¤†ˆ›‹†Òöö†üXƒ†ƒúþŸX„ˆƒùꆈþöXƒ„†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöʆˆþöX8†ˆ›X‚Tìò†ìòò†ìØöÞ“õþþøð†ƒùX~T†ƒˆúþŸX€Äƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†„„þöà†ˆ‰õöX~Іˆ¦õ·ä†‹Ø’ÍþøôüÒX|ȆƒˆúþŸX~HƒùꆆöX}D†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†üö†ü脌ƒóƒù脌ƒóƒùX{P†ˆ›»ì†ì†ì†ÒöXz\†ˆ›X{@ìò†ì†ì†ÒöXy †ˆ›­ì†ì†ÒöXxȆˆ›»ì†ì†ì†ÒöøƒùXw؆ˆ›§†ìò†Òöð†ƒùXu¸†ƒˆúþŸXw°ƒùꆄ„þöꆄ‚öꆄ‚öꆆöXv4†ˆ¦õ·ä†‹Ø’ÍþøôüÒXu4†ˆ›ãöXq”†ƒŽúþŸXu(ƒùXrô†„„‘úþŸXuƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöXsl†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöXqü†ˆ¦õ·ä†‹Ø’ÍþøôüÜXoh†ƒˆúþŸXqˆƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆöXo䆈¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùXn†ˆ›Xo ì†ìò†ìò†ìØöXm,†ˆ›»ì†ì†ì†ÒöÚ†ƒˆñXl(†ˆ›­ìò†ÒöXip†ƒŽúþŸXlƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþöXi؆ˆ¦õ·ä†‹Ø’ÍþøôüÜXe ƒúþŸXiT„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöXe€†ˆ¦õ·ä†‹Ø’ÍþøôüÚXdX†ˆ›™†ì†ÒöXa´†ƒˆúþŸXdLƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöXb0†ˆ¦õ·ä†‹Ø’ÍþøôüÒX`ø†ˆ›­ì†ì†Òö؆“õþþøX` †ˆ›Ÿì†Òöö†üX_@†ˆ›­ì†ì†Òöüüð†ƒùX^<†ˆ›§†ì†ì†ÒöX]¸†ˆ›‘Òöð†ƒùX[膃ˆúþŸX]ƒùꆄ‚öꆈþöX\d†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùXXl†ƒŽúþŸX[Àƒùꆄ‚öXY̆„„‰úþŸX[€ƒùꆄ‚öꆈþöXZT†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöXXÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÜXW\†ˆ›XX4†ì†ì†ìò†ÒöXV„†ˆ›»ì†ì†ì†Òö脌ƒóƒùXUœ†ˆ›­ìò†Òöö†üXT솈›ŸìØöXTL†ˆ›Ÿì†ÒöXSHˆ›XT<ì†ì†ìò†ì†ÒöXR€†ˆ›™ò†Òöð†üð†ƒùXQ¨†ˆ›ŸìØö؆ˆþö؆ˆþöð†ƒùXPT†ˆ›ŸìØööüXO˜†ˆ›‹†Òöò†ƒùð†ƒùXNŒ†ˆ›»ìòò†Òöö†üð†ƒùXMÀ†ˆ›Ÿì†ÒöXL膈›»ì†ì†ì†ÒöXL†ˆ›»ì†ì†ì†Òööüð†ƒùXK†ˆ›»ìòò†ÒöXI¸†ˆ›XJðìòòòòòò†ÒöXG(†ƒŽúþŸXI¬ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöXG†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùXB°†ˆ›Ÿ‹úþŸXFäƒùꆄ‚öXD€†ˆ‰ˆúþŸXF¤ƒùꆄ‚öꆄ„þöↄ„‰õöꆈþöXE†ˆ¦õ·ä†‹Ø’ÍþøôüÎöXC°†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöX>†ƒˆúþŸXB¤ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöX>€†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùX<ô†ˆ›»ì†ì†ì†ÒöX†ˆ¦õ·ä†‹Ø’ÍþøôüÜW9°†ƒŽúþŸW=¤ƒùꆄ‚öꆄ„þöW:膈‘úþŸW=<ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öↈ‰õöW;`†ˆ¦õ·ä†‹Ø’ÍþøôüÞöW:†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üö†üW8ð†ˆ›Ÿì†ÒöW7ü†ˆ›W8àì†ìò†ì†ÒöW7$†ˆ›»ì†ì†ì†Òöò†ƒùñW4솈›‘‹úþŸW6ÔƒùꆆöW5Іˆ¦õ·ä†‹Ø’ÍþøôüW5öʆˆþöð†ƒùW3Ȇˆ›ŸìØöW0x†ƒŽúþŸW3¼ƒùꆄ‚öò†ƒùW1°†ˆ‘úþŸW3dƒùꆄ‚öↈ‰õöW2(†ˆ¦õ·ä†‹Ø’ÍþøôüþàöW0à†ˆ¦õ·ä†‹Ø’ÍþøôüÜW.ü†ƒúþŸW0lƒùꆈþöW/h†ˆ¦õ·ä†‹Ø’ÍþøôüÚ脌ƒóƒùW-ø†ˆ›»ì†ì†ì†Òö脌ƒóƒùW,†ƒúþŸW-Àƒùꆄ„þöꆄ„þöꆈþöW,l†ˆ¦õ·ä†‹Ø’ÍþøôüÚöƒùW*Ô†ˆ›W+Ôìò†ì†ìòØöW)à†ˆ›µ†ìòò†ÒöW(Іˆ›W)¨òòò†ì†Òöð†ƒù膃ˆñW%D†ƒˆˆW(xì†ìW%¨†‹úþŸW((ƒùꆄ‚öꆄ‚öꆄ‚öↄ„‰õöꆄ‚öꆄ‚öꆈþöW&$†ˆ¦õ·ä†‹Ø’Íþøôü†Øð†ƒùW$l†ˆ›­ì†ì†ÒöW!°†ƒúþŸW$`ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöW"†ˆ¦õ·ä†‹Ø’ÍþøôüÚW ¼†ˆ›W! ì†ì†ì†ì†ÒöW䆈›»ì†ì†ì†Òöò†ƒùW,†ˆ›Ÿì†ÒöWT†ˆ›»ìòò†ÒöWÀˆ›Ÿì†ÒöW†ˆ›Ÿì†Òöò†ƒùð†ƒùW\†ˆ›‘Òöò†ƒùWˆ†ˆ›™ò†ÒöW܆ˆ›»‹ˆWxì†ì†ì†ìò†È†ìò†ÒöW †ˆ›­ì†ì†ÒöWT†ƒúþŸWƒùꆄ‚öꆄ„þöꆆöWÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÚW|†ˆ›»ì†ì†ì†Òö؆ˆþöW<†ˆ›W ì†ìòò†ÒöWd†ˆ›»ìò†ì†ÒöWŒ†ˆ›»ì†ì†ì†ÒöΆƒŒü˜þò„þçW8†ˆ›µ†ì†ì†ì†ÒöW$†ˆ›W‹Wà†‹úþŸWƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöW\†ˆ¦õ·ä†‹Ø’ÍþøôüÂòò†Òöˆ›‘ÒöW†ˆ›‹†ÒöW „†ƒˆúþŸW ôƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöW †ˆ¦õ·ä†‹Ø’ÍþøôüÒW ІƒˆúþŸW xƒùꆄ‚öꆆöW L†ˆ¦õ·ä†‹Ø’ÍþøôüÒW´†ƒúþŸW ăùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöW †ˆ¦õ·ä†‹Ø’ÍþøôüÚW€„W¨ƒWŒƒšøW8þŽþþWªW$W¦þŸWƒùW†ˆ¦õWøì†ìò†ì†ÊþøWȆˆ¦õWôì†ìò†ìò†ì†ÊþøW¨†ˆ¦õW¸ì†ìòò†ì†ÊþøWø†ˆ¦õ§ì†ÊþøWH†ˆ¦õ§ì†ëßþøWì„W”ˆ¦õ§‹á†ÊþWøˆ¦õ™‹WþøôüÚò†ƒùö†üЈþöð†üö†üVþ솈›»ìò†ì†Òöð†ƒùð†ƒùð†üö†üð†ƒùð†ƒùò†ƒùVý$“ ½üVý4þöVü\†ˆ›™†ì†ÒöVúІƒˆúþŸVüPƒùꆈþöVûL†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üVù†ƒúþŸVú´ƒùꆄ‚öꆆöVùˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚVø|†ˆ›Ÿì†ÒöV÷܆ˆ›Ÿì†óßöð†ƒùð†ƒùVö膈›­ì†ì†óßö؆ˆþöVö†ˆ›‘ÒöVõ”†ˆ›‘ÒöVôô†ˆ›‹†Òöò†ƒùVôHˆ›Ÿì†Òöð†ƒùVîÔ†ˆ›Vò(‹úþŸVôƒùꆄ‚öꆄ‚öꆄ‚öꆆöVò˜†ˆ¦õ·ä†‹Ø’ÍþøôüVïȆ‹úþŸVòƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöVðD†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìòòØöVêl„VîȃVêxƒšøVîXþŽþþVê–VîDVê’þŸVî4ƒùVíx†ˆ¦õ§ì†ÊþøVì䆈¦õ™ÊþøVì4†ˆ¦õ§ì†ëßþøVêØ„V뀈¦õ§‹á†ÊþVê䈦õ™‹VêðþøôüÚØ†ˆþöV逆ˆ›‹†ÒöVèÜ„VétƒVè胚ðþŸŒƒùôüÚ脌ƒóƒùVçØ†ˆ›»ì†ì†ì†ÒöV熈›»ì†ì†ì†Òöò†ƒùV憈›»ì†ì†ì†ÒöVå`ˆ›™†ìùßöVä´†ˆ›Ÿì†ÒöVãÀ†ˆ›µò†ì†ì†ÒöVâ4†ƒˆúþŸVã´ƒùꆈþöVâ°†ˆ¦õ·ä†‹Ø’ÍþøôüÒVÞ„†ƒŽúþŸVâ(ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöVß¼†ˆ‰úþŸVápƒùꆄ„þöꆆöVàD†ˆ¦õ·ä†‹Ø’ÍþøôüÖöVÞ솈¦õ·ä†‹Ø’ÍþøôüÜVÜh†ƒúþŸVÞxƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöVÜÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üVÛd†ˆ›VÜHì†ì†ì†ì†ÒöVÚŒ†ˆ›»ì†ì†ì†ÒöVÙ솈›Ÿì†ÒöVÙ ˆ›»ìòò†óßöVØ †ˆ›µ†ì†ì†ì†Òöð†ƒùVÖ8†ƒúþŸV×øƒùꆄ‚öꆄ„þöꆈþöVÖ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚVИ†ƒúþŸVÖ,ƒùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöVцˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒùVÏĆˆ›Ÿì†ÒöʆˆþöVμ†ˆ›‹†ÒöVÍ䆈›§†ìò†Òö脌ƒóƒùVÌà†ˆ›»ì†ì†ì†Òöð†ƒùăˆˆ‹†ØVˈ†ˆ›™ò†ÒöVʰ†ˆ›»ì†ì†ì†ÒöVɼ†ˆ›VÊ ì†ì†ì†ì†ÒöVÇ,†ƒˆúþŸVɰƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöVǨ†ˆ¦õ·ä†‹Ø’ÍþøôüÒVÆT†ˆ›»ìòò†ÒöVÅ|†ˆ›»ì†ì†ì†ÒöVÄ̆ˆ›Ÿ‹á†Òöð†ƒùVÃØ†ˆ›»ìò†ì†ÒöVƈ›­ìò†ÒöVÂ(†ˆ›Và ìò†ìò†ÒöüüVÀP†ƒŽúþŸV ƒùꆄ‚öꆄ‚öꆆöVÀ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜV¿Ì†ˆ›‘Òö膃ˆñð†ƒùV¾ä†ˆ›‹†ÒöV¾D†ˆ›Ÿì†óßöò†ƒùV¼x†ƒˆúþŸV¾ ƒùꆄ„þöꆆöV¼ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùV¸H†ƒˆˆ­‹úþŸV¼Pƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöV¹D†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†Øè„Œƒóƒù؆ˆþöV¶ø†ˆ›»ì†ì†ì†Òöð†ƒùVµ†ˆ›V¶Ìì†ì†ì†ì†ì†ìòòòò†ì†ì†óßöV´Xˆ›™†ìùßö膃ˆñV³,†ˆ›V´ìò†ìò†ÒöV±d†ƒŽúþŸV³ ƒùꆄ‚öꆄ‚öꆈþöV±Ì†ˆ¦õ·ä†‹Ø’ÍþøôüÜV°Œ†ˆ›»ì†ìò†Òöö†üV¯ø†ˆ›‘Òö؆ˆþöV®ü†ˆ›§ä†‹ÇöV®$†ˆ›»ìòò†ÒöV­h†ˆ›™†ì†ÒöV¬œˆ›»ì†ì†ì†Òö膃ˆñð†ƒùV«¨†ˆ›Ÿì†Òöö†üV«†ˆ›‘ÒöVª<†ˆ›»ì†ì†ì†ÒöV©d†ˆ›»ì†ì†ì†ÒöV¦dˆ›‘‹úþŸV©Xƒùꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþöV§<†ˆ¦õ·ä†‹Ø’ÍþøôüV¦pöʆˆþöV¥P†ˆ›ŸìùßöV¤@†ˆ›V¥@ì†ìò†ìò†ÒöV›Ä„V¤4ƒV›ÐƒšøV£ÄþŽþþV›îV£°V›êþŸV£ ƒùV Ä†ˆ¦õV£\V¡X†‹úþŸV£Pƒùꆄ‚öꆄ„þöꆄ„þöꆈþöV¡Ô†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøV 0†ˆ¦õ™ÊþøVŸœ†ˆ¦õ™ÊþøVžì†ˆ¦õ§ì†ÊþøVž<†ˆ¦õ§ì†ÊþøVŒ†ˆ¦õ§ì†ëßþøVœ0„VœØˆ¦õ§‹á†ÊþVœ<ˆ¦õ™‹VœHþøôüÚVšì†ˆ›»ì†ì†ì†ÒöVš†ˆ›»ì†ì†ì†ÒöV™<†ˆ›»ì†ì†ì†Òöð†ƒùV˜H†ˆ›»ìòò†Òöˆ›‘ÒöV—$†ˆ›Ÿì†ÒöV•܆ˆ›V—ì†ì†ì†ì†ì†ìò†Òö膃ˆñ膃ˆñV”Ȇˆ›™†ì†Òöð†ƒùV“Ô†ˆ›»ì†ì†ì†Òöð†ƒùV“†ˆ›ŸìØööƒùV‘H†ƒˆúþŸV’ðƒùꆄ„þöꆆöV‘Ćˆ¦õ·ä†‹Ø’ÍþøôüÒʆˆþöV(†ˆ›VÐì†ì†ì†ì†ì†ì†ì†ì†ì†ì†ì†Òöò†ƒùV\†ƒˆúþŸVƒùꆄ„þöꆈþöV؆ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùVŒ¤†ˆ›ŸìØöV‡œ†ˆ›VŒ”Vˆ†‹šøVŒþŽþþVˆ>VŒVˆ:þŸV‹øƒùV‹<†ˆ¦õ§ì†ÊþøVŠŒ†ˆ¦õ§ì†ÊþøV‰Ü†ˆ¦õ§ì†ëßþøVˆ€„V‰(ˆ¦õ§‹á†ÊþVˆŒˆ¦õ™‹Vˆ˜þøôüV‡´ö؆ˆþöV†°†ˆ›Ÿì†Òöö†üöƒùð†ƒùV…䆈›‘ÒöV„ð†ˆ›µòòò†ÒöV„4†ˆ›­ì†ìØöð†ƒù؆ˆþöV‚ô†ˆ›»ì†ì†ì†ÒöV‚8†ˆ›­ì†ì†Òö؆ˆþöV~œ“ VèøüøüøV€4þ–’V øüV~ü¸V~¬þöVzœ†ˆ›­‹úþŸV~„ƒù䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öꆆöV{¸†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöò†ƒùVy䆈›Ÿì†Òöð†ƒù膃ˆñVv”†ƒˆˆVyŒVv܆‹úþŸVytƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöVwX†ˆ¦õ·ä†‹Ø’ÍþøôüVv˜ð†ƒùò†ƒùVs<†ˆ›VvPVth†‹úþŸVv8ƒùꆄ‚öꆄ„þöꆈþöVt䆈¦õ·ä†‹Ø’Íþøôü†ìòò†ì†ì†ì†ÒöVr,†ˆ›Vs†ìò†ì†ì†ÒöVq†ˆ›Vrìò†ìò†ì†ÒöVp|†ˆ›Ÿì†ÒöVo¤†ˆ›§†ì†ì†Òö؆ˆþöVn¸†ˆ›ŸìØöVn4†ˆ›‘óßöÞ“õþþøð†ƒùð†ƒùVlô†ˆ›­ì†ì†Òö؆ˆþöVcd†ˆ›Ÿ‹üVl˜VdþŸVlˆƒùꆄ‚öꆄ‚öꆄ‚öVe4†ˆ‰úþŸVkøƒùꆄ‚öꆄ„þöVf´†„„‰úþŸVkƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öVh4†„„‰úþŸVj°ƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆöVh¼†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöVg<†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöVe¼†ˆ¦õ·ä†‹Ø’ÍþøôüÖöVdd†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöVbĆˆ›Ÿì†ÒöVa솈›»ì†ì†ì†ÒöVa0†ˆ›­ì†ì†óßöV`X†ˆ›»ì†ì†ì†ÒöV_¸†ˆ›Ÿì†ÒöV^à†ˆ›»ì†ì†ì†ÒöV^@†ˆ›Ÿì†Òöð†ƒùÞ“õþþøV\,†ˆ›µ†‹ˆµò†ì†ì†È†ì†ì†ÒöV[†ˆ›V[ôò†ìò†ì†ÒöVZ|†ˆ›‹†óßö膃ˆñVX\†ƒúþŸVZDƒùꆄ‚öꆄ‚öꆄ‚öꆆöVXȆˆ¦õ·ä†‹Ø’ÍþøôüÚVVh†ƒúþŸVXPƒùꆄ‚öꆄ‚öꆄ‚öꆆöVVÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÚVTd†ƒˆúþŸVV\ƒùꆄ‚öꆄ„þöꆄ‚öꆈþöVTà†ˆ¦õ·ä†‹Ø’ÍþøôüÒVQ(†ƒúþŸVTXƒùꆄ‚öVRd†ˆ‰úþŸVTƒùꆄ„þöꆈþöVR솈¦õ·ä†‹Ø’ÍþøôüÖöVQ”†ˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñVO4†ƒˆúþŸVPðƒùꆄ‚öà†ˆþöVO°†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùVND†ˆ›»ì†ì†ì†ÒöVLtƒˆúþŸVN8ƒùꆄ‚öꆄ‚öꆈþöVL䆈¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñVK¸†ˆ›‘ÒöVJĆˆ›VK¨ì†ì†ì†ì†Òöð†ƒù膃ˆñ膃ˆñð†ƒù膃ˆñVHø†ˆ›VIøìòòò†ìØö脌ƒóƒùVH†ˆ›­ì†ì†ÒöVG8†ˆ›»ì†ì†ì†Òöò†ƒùVF€†ˆ›‹†ÒöÞ“õþþøVE”†ˆ›‹†ÒöVBd†ƒŽúþŸVEˆƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöVB̆ˆ¦õ·ä†‹Ø’ÍþøôüÜVAŒ†ˆ›»ìò†ì†ÒöV@솈›‹†ÒöV@0†ˆ›­ì†ì†óßöV?†ˆ›‹†ÒöV>¸†ˆ›»ì†ì†ì†Òöö†üV>†ˆ›ŸìØöV=h†ˆ›Ÿì†ÒöVþŸUTôƒùUS†ˆ¦õUT°†ìò†ìò†ì†ì†ÊþøUR8†ˆ¦õUSX†ìò†ìò†ì†ì†ÊþøUQP†ˆ¦õ¯†ì†ì†ÊþøUN†ˆ¦õUQ†ìò†ìUO@†‘üUP¶þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þÕ†ì†ÊþøUMà†ˆ¦õ§ì†ëßþøUL„„UM,ˆ¦õ§‹á†ÊþULˆ¦õ™‹ULœþøôüUK¸öUJƒúþŸUK”ƒùꆄ„þöꆈþöUJh†ˆ¦õ·ä†‹Ø’ÍþøôüÚUFà†ƒˆúþŸUIðƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöUG\†ˆ¦õ·ä†‹Ø’ÍþøôüÒUF@†ˆ›Ÿì†óßöð†ƒùUD¬†ƒŽúþŸUFƒùꆆöUE†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒù膃ˆñö†üUC¸†ˆ›Ÿì†ÒöUBà†ˆ›»ìòò†ÒöUB†ˆ›»ì†ì†ì†ÒöUA0†ˆ›»ì†ì†ì†Òö؆ˆþöU@D†ˆ›‹†ÒöU< ƒˆúþŸU@(„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöU<†ˆ¦õ·ä†‹Ø’ÍþøôüÒU9„†ƒŽúþŸU<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöU9솈¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùð†ƒùU8¬†ˆ›‘Òöö†ü؆“õþþøU7x†ˆ›»ìò†ì†ÒöU6 †ˆ›»ìò†ì†Òöò†ƒùU4¼†ƒúþŸU6|ƒùꆄ‚öꆄ‚öꆆöU5(†ˆ¦õ·ä†‹Ø’ÍþøôüÚU4(ˆ›Ÿì†ÒöU0솃ˆúþŸU4ƒùꆄ„þöà†„„þöà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆈþöU1h†ˆ¦õ·ä†‹Ø’ÍþøôüÒU.ø†ˆ›‘‹úþŸU0àƒùꆆöU/܆ˆ¦õ·ä†‹Ø’ÍþøôüÉßöU,¸†ƒŽúþŸU.ìƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþöU- †ˆ¦õ·ä†‹Ø’ÍþøôüÜU+à†ˆ›»ìò†ì†ÒöU+@†ˆ›ŸìØöU)d†ƒˆúþŸU+4ƒùꆄ„þöꆄ„þöꆆöU)à†ˆ¦õ·ä†‹Ø’ÍþøôüÒU(†ˆ›U)Tì†ìò†ìòòò†ÒöU&Ô†ˆ›U( ì†ìò†ìò†ì†ì†Òöð†ƒùU%à†ˆ›»ì†ì†ì†ÒöU%†ˆ›»ì†ì†ì†ÒöU$X†ˆ›Ÿ‹á†Òö؆ˆþöU#4†ˆ›»ì†ìò†ÒöU"°†ˆ›‘ÒöU!L†ˆ›U"x†ìò†ìò†ìò†ì†Òö̇ü”„þò„þè÷ð†ƒùU †ˆ›‹†Òö膃ˆñU8†ˆ›™†ìØöð†ƒùò†ƒùUH†ˆ›™†ì†óßöö†üUX†ƒúþŸU,ƒùꆄ„þöꆄ‚öà†ˆþöUĆˆ¦õ·ä†‹Ø’ÍþøôüÚUH†ˆ›UHìò†ìò†ì†ÒöUT†ˆ›µò†ì†ì†ÒöU´†ˆ›‹†óßö؆ˆþöU€†ˆ›UXìꆋá†Òöò†ƒùUpƒˆúþŸU\ƒùꆄ„þöꆄ‚öꆄ‚öꆆöUà†ˆ¦õ·ä†‹Ø’ÍþøôüÒUœ†ƒŽúþŸUXƒùꆄ‚öꆄ‚öꆆöU†ˆ¦õ·ä†‹Ø’ÍþøôüÜU†ˆ›‘ÒöU@†ˆ›»ì†ì†ì†ÒöUl†ˆ›U0ì†UÔ†‹šøUœþŽþþU UˆU þŸUxƒùU0†ˆ¦õU4†ìò†ì†ì†ì†ÊþøUd†ˆ¦õµì†ì†ÊþøU|†ˆ¦õUTì†ì†ì†ÊþøU°†ˆ¦õµì†ì†ÊþøU d†ˆ¦õUh†‹á†ì†ì†ì†ì†ÊþøU `†ˆ¦õ½ò†ìò†ÊþøU \†ˆ¦õ½†ì†ìò†ÊþøU ¬†ˆ¦õ§ì†ëßþøU P„U øˆ¦õ§‹á†ÊþU \ˆ¦õ™‹U hþøôüU„öU †ƒˆúþŸU`ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öU†„„‰ˆ§òò†ÜöU<†„„‰ˆ§òò†Üöꆄ„þöꆈþöU†ˆ¦õ·ä†‹Ø’ÍþøôüÒˆ›„ßö؆“õþþøè†ƒˆñð†ƒùU膈›‹†ÒöU,†ˆ›™†ì†ÒöUp†ˆ›­ì†ì†óßö؆ˆþöTÿL†ˆ›§ò†ì†Òöò†ƒùTþ$†ˆ›Tþü†ìò†ìòØöTý †ˆ›ãöTüðˆ›™òùßöTüD†ˆ›Ÿì†ÒöTûl†ˆ›»ìòò†óßöð†ƒùTú”†ˆ›­ì†ìØöð†ƒùTöÀ†ˆ›Túhì†ìò†ì†ìT÷T†‹úþŸTùăùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆆöT÷Іˆ¦õ·ä†‹Ø’ÍþøôüT÷(†‹ÇöTö †ˆ›Ÿì†ÒöTõ,†ˆ›Töì†ìò†ì†Òö؆ˆþöTò€ƒúþŸTôÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöTòà†ˆ¦õ·ä†‹Ø’ÍþøôüÚTñ¸†ˆ›™†ì†Òöò†ƒùTð†ˆ›Tñhòòò†ì†ÒöTïð†Tð‚þò„þ΄ü”„þò„þè÷Tï\†ˆ›‘‹Çöö†üö†üTˆ›Ÿì†ÒöTíp†ˆ›Tîd†ìò†ìò†ì†ÒööƒùT옆ˆ›™†ì†ÒöTëø†ˆ›‹†ÒöTêȆˆ›Të ‘ü˜þò„þÕò†ä†‹ÇöTê †ˆ›™†ì†ÒöTçȆƒúþŸTêƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆈþöTè4†ˆ¦õ·ä†‹Ø’ÍþøôüÚTåL†ˆ›­‹úþŸT缃ùꆄ„þöꆄ„þöꆆöTæh†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òö؆ˆþö؆ˆþö脌ƒóƒùöƒùTã°†ˆ›™†ì†Òöð†ƒùT⼆ˆ›§ò†ì†ÒöTᆃúþŸTâ°ƒùꆄ‚öà†ˆþöTáp†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üTß@†ƒˆúþŸTàèƒùꆄ„þöꆆöTß¼†ˆ¦õ·ä†‹Ø’ÍþøôüÒTÞh†ˆ›»ì†ì†ì†ÒöT݆ˆ›»ì†ì†ì†Òöö†üTÛ¸†ƒŽúþŸTÝtƒùꆄ„þöꆄ„þöꆈþöTÜ †ˆ¦õ·ä†‹Ø’ÍþøôüÜTÚ숛§†ì†ì†ÒöTÙІˆ›TÚ¨†ìòòò†ÒöTÖ8†ƒúþŸTÙăùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöTÖ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù脌ƒóƒùò†ƒùTÕT†ˆ›‘ÒööƒùTÓp†ƒŽúþŸTÕ,ƒùꆄ‚öꆄ‚öꆆöTÓØ†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùð†ƒùTÐð†ˆ›Ÿ‹úþŸTÓ0ƒùꆄ‚öà†ˆþöTÑð†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöTÐ4†ˆ›™†ì†ÒöTϰ†ˆ›‘ÒöTÎØ†ˆ›»ì†ì†ì†ÒöTÉLˆ›TÎÈTʈ†‹úþŸTΰƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöTˆˆ¦õ·ä†‹Ø’Íþøôü†ì†ìòò†ì†ì†ì†Òöð†ƒùTÈ †ˆ›‘ÒöTȆTÈ’þò„þò„þò„þæ„üò÷؆“õþþøØ†ˆþöTƆˆ›»ì†ì†ì†ÒöTŸ†ˆ›»ì†ì†ì†Òööƒù膃ˆñTÄ|†ˆ›TÅ`ìò†ì†ì†ÒöTÃ܆ˆ›Ÿì†Òöð†ƒùʆˆþöTÂÔ†ˆ›„ßöTÂ4†ˆ›Ÿì†Òöð†ƒùTÀt†ƒúþŸT ƒùꆄ‚öꆆöTÀà†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùƆ‡ü”„þò„þè÷ð†ƒùT¾ô†ˆ›»ì†ì†ì†ÒöT¾8†ˆ›­ì†ìØöTºŒ“T»FT»üŒT½Üˆ’T½x‚ˆ’êÊ‚ˆ’T¼ü–T¼èþT¼4—ˆ™†ìùÇöT»@T»ØøþöTºœ›™†ìùßöT¹à†ˆ›Ÿì†Òöð†ƒùT¹$†ˆ›‹ØöT¸L†ˆ›»ì†ìò†ÒöT·t†ˆ›»ì†ì†ì†ÒöT¶œ†ˆ›»ì†ì†ì†ÒöTµŒ†ˆ›T¶Œìòò†ì†ì†Òöð†ƒùð†ƒùT³¨†ˆ›TµDì†ìò†T´,†‹ˆ»ì†ìò†È†ÒöT°ð“¼T²0Š–˜T³Lˆ’T²è‚ˆ’Âü–üT²(T±ˆT² öT±›‹Øö膃ˆñT°†ˆ›Ÿì†ÒöT¯\†ˆ›­ìò†ÒöT­€†ƒˆúþŸT¯Pƒùꆄ‚öꆄ‚öꆆöT­ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒT¬p†ˆ›T­Hòòòòùßöð†ƒùT«Ð†ˆ›‘Òöð†ƒùT©ˆ†ƒˆúþŸT«¨ƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöTª†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒùT§$†ˆ›T©\ìòò†T§~ŠúþŸT¨ðƒùꆆöT§ì†ˆ¦õ·ä†‹Ø’ÍþøôüT§<öT¦„†ˆ›Ÿì†Òö؆“õþþøT¥`†ˆ›»ì†ì†ì†Òöö†üÒ†‡üˆ„þè÷T¤<†ˆ›­ìò†ÒöT¢¨ƒŽúþŸT¤0ƒùꆄ„þöꆈþöT£†ˆ¦õ·ä†‹Ø’ÍþøôüÜT „†ƒŽúþŸT¢ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöT ì†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùTŸ¬†ˆ›™†ì†Òöò†ƒùTŸ†ˆ›‘Òöð†ƒùTž†ˆ›»ì†ì†ì†ÒöƆ‡ü”„þò„þè÷Tœ€†ˆ›Tt†ìò†ìò†ì†Òööüð†ƒùð†ƒùð†ƒùTš †ƒŽúþŸTœƒùꆄ‚öꆄ‚öꆄ„þöꆈþöTšˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÜT™H†ˆ›»ì†ì†ì†ÒöT˜¨†ˆ›Ÿì†ÒöT˜†ˆ›Ÿì†Òöð†ƒùñT—$†ƒˆˆ™ò†Øè†ƒˆñT–<†ˆ›™†ì†ÒöT•d†ˆ›»ì†ìò†Òö脌ƒóƒùö†üT”P†ˆ›»ì†ì†ì†ÒöT“°†ˆ›Ÿì†ÒöT’؆ˆ›»ì†ì†ì†ÒöT‘Ô†ˆ›T’¸‹áòò†ì†ÒöT‘†ˆ›­ì†ì†ÒöT†ˆ›Tà†ìò†ìòØöTލ†Túþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þÚ„üˆ„þè÷TŽˆ›‹†óßöð†ƒùT‹Ð†ƒúþŸTàƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöTŒ<†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùTІƒŽúþŸT‹¬ƒùà†„„‰õöꆈþöTŠl†ˆ¦õ·ä†‹Ø’ÍþøôüÜT‡„†ƒúþŸT‰øƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöT‡ð†ˆ¦õ·ä†‹Ø’ÍþøôüÚT…䆃ŽúþŸT‡xƒùꆄ‚öꆆöT†L†ˆ¦õ·ä†‹Ø’ÍþøôüÜT…`†ˆ›‘ÒöT„À†ˆ›ŸìØöT‚䆃ˆúþŸT„´ƒùꆄ„þöꆄ„þöꆆöTƒ`†ˆ¦õ·ä†‹Ø’ÍþøôüÒTœ†ˆ›T‚Ôì†ìò†ìòòò†ÒöT†ˆ›‘Òöð†ƒùT€$†ˆ›»ì†ì†ì†Òöö†üT<†ˆ›»ì†ìò†ÒöT}؆ˆ›T†ìò†ìò†ìò†ì†ÒöñT{†ƒúþŸT} ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆆöT{ü†ˆ¦õ·ä†‹Ø’ÍþøôüÚTv°†ƒˆúþŸT{„ƒùꆄ„þöꆄ‚öTwü†ˆ‘úþŸT{ƒùꆄ„þöà†„„þöà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆈþöTxt†ˆ¦õ·ä†‹Ø’ÍþøôüÞöTw,†ˆ¦õ·ä†‹Ø’ÍþøôüÒTuô†ˆ›™†ìØöTmü†ˆ›™†‹úþŸTũùꆄ‚öTŏˆ‘úþŸTu|„‚öꆄ‚öꆄ‚öꆄ‚öTr„†„„‘úþŸTtÜ„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöTrü†ˆ¦õ·ä†‹Ø’ÍþøôüþàöTq†ˆ‘úþŸTrh†öTqŒ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöTpD†ˆ¦õ·ä†‹Ø’ÍþøôüþàöTnü†ˆ¦õ·ä†‹Ø’Íþøôü†Òöò†ƒùð†ƒùTm †ˆ›™†ì†óßöö†üTl†ˆ›µ†ì†ìòØöTk0†ˆ›§†ì†ì†ÒöTj †ˆ›Tk ìò†ìò†ì†ÒöTi,†ˆ›µò†ì†ì†ÒöThT†ˆ›»ì†ì†ì†ÒöTg|†ˆ›»ì†ì†ì†ÒöTfØ„TgpƒTf䃚ðþŸŒƒùôüÚTfT†ˆ›‘ÒöTe(†ˆ›TfDì†ì†ìò†ìò†ÒöTdˆ†ˆ›Ÿì†Òöö†üTc†ˆ›Tdhìꆋá†Òöò†ƒùöƒùð†ƒùTbX†ˆ›¯ê†‹áØöTa¸†ˆ›Ÿì†óßöT`à†ƒˆˆ·ê†‹Ù†‹Íð†ƒùT_´†ˆ›T`´ì†ìò†ìòØöT^ø†ˆ›™ò†Òö؆ˆþöTX(†ˆ›T^œTX†‹šøT^$þŽþþTXÊT^TXÆþŸT^ƒùT]D†ˆ¦õ§ì†ÊþøT\x†ˆ¦õµì†ì†ÊþøT[Ȇˆ¦õ“†ÊþøT[†ˆ¦õ§ì†ÊþøTZh†ˆ¦õ§ì†ëßþøTY „TY´ˆ¦õ§‹á†ÊþTYˆ¦õ™‹TY$þøôüTX@ö؆ˆþöTW<†ˆ›Ÿì†Òöˆ›ãöTV4†ˆ›‘óßöò†ƒùö†üTQ†ƒúþŸTVƒùꆄ„þöTRP†ˆ‘úþŸTUÀƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöTRȆˆ¦õ·ä†‹Ø’ÍþøôüÞöTQ€†ˆ¦õ·ä†‹Ø’ÍþøôüÚTNÔ†ƒŽúþŸTQƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöTO<†ˆ¦õ·ä†‹Ø’ÍþøôüÜTLH†ˆ›TNÄì†ìTL̆‹úþŸTNtƒùꆄ„þöꆆöTMH†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöTI܆ƒúþŸTL<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöTJH†ˆ¦õ·ä†‹Ø’ÍþøôüÚTGL†ƒˆúþŸTIЃùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöTGȆˆ¦õ·ä†‹Ø’ÍþøôüÒTF¬†ˆ›‹†Òöò†ƒùT>膈›TF„T?P†‹šøTF þŽþþT?ŠTEøT?†þŸTEèƒùTEH†ˆ¦õ™ÊþøTD˜†ˆ¦õ§ì†ÊþøTC膈¦õ§ì†ÊþøTC†ˆ¦õ¡†ì†ÊþøTBl†ˆ¦õ§ì†ÊþøTA؆ˆ¦õ™ÊþøTA(†ˆ¦õ§ì†ëßþøT?Ì„T@tˆ¦õ§‹á†ÊþT?؈¦õ™‹T?äþøôüT?öT>H†ˆ›Ÿì†ÒöT=¨†ˆ›Ÿì†ÒöT<Іˆ›»ì†ì†ì†ÒöT<†ˆ›­ì†ìØöˆ›‘ÒöT:ð†ˆ›‹†ÒöT9`†ˆ›T:àT:†‹ˆT:Äì†ìò†ì†Èò†Òöð†ƒùT7†ƒˆúþŸT98ƒùꆄ„þöꆈþöT8 †ˆ¦õ·ä†‹Ø’ÍþøôüÒT6Ô†ˆ›™†ì†ÒöT5ü†ˆ›»ì†ì†ì†ÒöT5†ˆ›T5ììò†ì†ì†ÒöT4d„T4üƒT4pƒšðþŸŒƒùôüÚT3à†ˆ›‘Òöð†ƒùT2†ˆ›T3´ì†ìò†T2œ†‹ˆ»ì†ìò†È†ÒöT/¬†ƒúþŸT2 ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöT0†ˆ¦õ·ä†‹Ø’ÍþøôüÚT/ˆ›Ÿì†Òöò†ƒùò†ƒùT.X†ˆ›‘Òö膃ˆñT,Œ†ƒŽúþŸT. ƒùꆄ‚öꆆöT,ô†ˆ¦õ·ä†‹Ø’ÍþøôüÜT*`†ƒˆúþŸT,€ƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöT*܆ˆ¦õ·ä†‹Ø’ÍþøôüÒT)ˆ†ˆ›»ì†ì†ì†ÒöT(°†ˆ›»ì†ì†ì†ÒöT(,†ˆ›‘Òöð†ƒùT%¼†ˆ›T(ìT&$†‹úþŸT'̃ùꆄ„þöꆆöT& †ˆ¦õ·ä†‹Ø’ÍþøôüT%ÔöT$œ†ˆ›T%œ‹á†ìòòò†ÒöT$†ˆ›ãöT"lƒúþŸT$ ƒùà†„„þöꆈþöT"̆ˆ¦õ·ä†‹Ø’ÍþøôüÚTà†ˆ›T h‹úþŸT"Tƒùꆄ„þöꆄ„þöꆄ‚öꆆöT ؆ˆ¦õ·ä†‹Ø’ÍþøôüT(†‹úþŸT Pƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöT¤†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ìòò†ì†ì†ì†Òöð†ƒùT솈›»ì†ì†ì†Òö؆ˆþöö†ü؆ˆþöT´ƒˆˆ­ìòÞTĆˆ›‘‹úþŸTœƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöT¨†ˆ¦õ·ä†‹Ø’ÍþøôüÉßöTø†ƒúþŸT¸ƒùꆄ„þöꆄ‚öꆈþöTd†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùTd†ƒŽúþŸTЃùꆆöT̆ˆ¦õ·ä†‹Ø’ÍþøôüÜð†üT †ƒˆúþŸT<ƒùꆄ‚öꆄ‚öꆄ‚öTX†ˆ‰úþŸT¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöTà†ˆ¦õ·ä†‹Ø’ÍþøôüÖöTˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùò†ƒùT 䆈›»ì†ì†ì†ÒöT ü†ˆ›T Ôì†ìꆋÇöT $†ˆ›»ì†ì†ì†ÒöTðƒˆúþŸT ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öà†ˆþöT `†ˆ¦õ·ä†‹Ø’ÍþøôüÒT(†ƒúþŸT؃ùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöT”†ˆ¦õ·ä†‹Ø’ÍþøôüÚT|†ˆ›TT†‹ˆ§òò†Èòòò†ÒöTà†ƒˆˆ™ò†ØT´†ƒŽúþŸTÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöT†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùTĆˆ›»ì†ì†ì†Òö؆ˆþöö†üö†üð†ƒùÞ“õþþøð†ƒùð†ƒùð†ƒùSþĆˆ›»ì†ì†ì†Òö؆ˆþöSý †ˆ›»ì†ì†ì†Òö؆ˆþöSü´†ˆ›Ÿì†ÒööƒùSûÀ†ƒˆˆ·ê†‹Ù†‹Íð†ƒùð†ƒùSù †ƒˆúþŸSû|ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆈþöSùˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒS÷¨†ƒˆˆSøüì†Ü†‹á†ì†ìò†ì†ìÞð†ƒùSõ†ˆ›­‹úþŸS÷€ƒùꆄ„þöꆄ„þöꆆöSö,†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÒöSô8†ˆ›»ì†ì†ì†ÒöSól†ˆ›­‹á†ì†óßö脌ƒóƒùSòh†ˆ›»ì†ì†ì†ÒöSí0“ SîôSò’SîìøüøüøüøüøüøüøüSíSîøþSí@þöSìh†ˆ›™†ì†ÒöSëȆˆ›Ÿì†Òöò†ƒùʆˆþö膃ˆñSê|†ˆ›‹†ÒöSèȆƒˆúþŸSêpƒùꆄ„þöꆆöSéD†ˆ¦õ·ä†‹Ø’ÍþøôüÒSèD†ˆ›‘ÒöS礆ˆ›Ÿì†Òöð†üSæ@†ˆ›Sçxì†ìòòòòò†ÒöÔˆþöSå@†ˆ›Ÿì†óßöSä0†ˆ›Såòòòò†ÒöSㆈ›Ÿì†Òöð†ƒùSâT†ƒŒüSãfþò„þò„þò„þò„þò„þò„þò„þò„þò„þçSá|†ˆ›»ì†ì†ì†Òö脌ƒóƒù脌ƒóƒùSàL†ˆ›»ì†ì†ì†ÒöS߬†ˆ›ŸìØöSß †ˆ›Ÿì†ÒöSÝà†ˆ›SÞüì†ì†ì†ìò†ì†ÒööüSÝ@†ˆ›‘ÒöSÜ †ˆ›ŸìùßöSÚ膈›SÜì†ì†ì†ìòòòòò†ì†ìùßöSÚ,†ˆ›™†ì†Òöö†üð†üSÙ(†ˆ›»ì†ì†ì†ÒöS×L†ƒˆúþŸSÙƒùꆄ„þöꆄ„þöꆈþöS×Ȇˆ¦õ·ä†‹Ø’ÍþøôüÒSÔ†ƒúþŸS×@ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSÔü†ˆ¦õ·ä†‹Ø’ÍþøôüÚăˆˆ‹†Øð†ƒùò†ƒùSÍp†ˆ›‘‹úþŸSÓЃùꆄ‚öꆄ„þöꆄ‚öSÏ$†ˆ‰ˆúþŸSÓ@ƒùꆄ‚öꆄ„þöꆄ‚öÚ†„„‰ˆíöSÐŒ†ˆ‰úþŸSÒhƒùꆄ‚öꆄ„þöꆈþöSцˆ¦õ·ä†‹Ø’ÍþøôüÖöSϼ†ˆ¦õ·ä†‹Ø’ÍþøôüÎöSÎT†ˆ¦õ·ä†‹Ø’ÍþøôüS͈öö†üSË4†ƒˆúþŸSÍTƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöS˰†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùSÊh†ˆ›§ä†‹ÇöSɸ†ˆ›§ä†‹ÇöSÈà†ˆ›»ì†ì†ì†ÒöSdžƒŽúþŸSÈÔƒùꆄ‚öꆄ„þöꆆöSÇ€†ˆ¦õ·ä†‹Ø’ÍþøôüÜSŘƒˆúþŸSÇ ƒùꆆöSƆˆ¦õ·ä†‹Ø’ÍþøôüÒSņˆ›‘ÒöSÀÔ†ƒˆúþŸSÄüƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöSÁP†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùS¾P†ƒúþŸSÀ°ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöS¾¼†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùS¼P†ƒŽúþŸS¾ ƒùꆄ‚öꆄ‚öꆆöS¼¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜS»x†ˆ›§ò†ìØöSº †ˆ›»ìòò†ÒöƆ‡ü”„þò„þè÷脌ƒóƒùS¹,†ˆ›»ì†ìò†Òöð†ƒùöƒùS¸p†ˆ›‘Òöò†ƒùSµÜ†ƒˆúþŸS¸Lƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöS¶X†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùS°°†ƒˆúþŸSµ¸ƒùꆄ‚öꆄ‚öꆄ‚öS²t†„„‰ˆúþŸSµ(ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆆöS³ †ˆ¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öꆄ„þöꆆöS±,†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùS¯¼†ˆ›»ì†ì†ì†ÒöS®ä†ˆ›»ì†ì†ì†ÒööƒùS­ð†ˆ›»ì†ì†ì†óßöð†ƒùS«ä†ƒŽúþŸS­Èƒùꆄ‚öꆄ‚öꆄ‚öꆆöS¬L†ˆ¦õ·ä†‹Ø’ÍþøôüÜSª†ƒŽúþŸS«Øƒùꆄ‚öꆄ‚öà†ˆþöSªp†ˆ¦õ·ä†‹Ø’ÍþøôüÜS©L†ˆ›­ì†ì†ÒöS¦ü†S©>þS§„üS©„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷S¦$†ˆ›»ì†ì†ì†ÒöS¥„†ˆ›‹†ÒöS¤´†S¥vþò„þò„þ„ü „þò„þò„þè÷SŸÈ†ˆ›S¤¤S 0†‹šøS¤,þŽþþS jS¤S fþŸS¤ƒùS£L†ˆ¦õ§ì†ÊþøS¢¸†ˆ¦õ™ÊþøS¢†ˆ¦õ§ì†ëßþøS ¬„S¡Tˆ¦õ§‹á†ÊþS ¸ˆ¦õ™‹S ÄþøôüSŸàöSžð†ˆ›»ì†ì†ì†ÒöSžl†ˆ›‘Òöð†ƒùSx†ˆ›»ì†ì†ì†ÒöSœô†ˆ›‘ÒöS™äƒˆúþŸSœèƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSšT†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùS™†ˆ›™†ì†Òöð†üS—0†ƒˆúþŸS˜Øƒùꆄ‚öꆆöS—¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒS–<†ˆ›S— ìòòò†óßö؆ˆþöS•l†ˆ›‘Òöö†üS”0†ˆ›S•Lì†ìòòòò†ÒöS‘胈úþŸS”$ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöS’X†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùS‘†ƒˆˆ§†ì†ì†ØST†ƒˆúþŸSüƒùꆄ‚öꆆöSІˆ¦õ·ä†‹Ø’ÍþøôüÒSŽ|†ˆ›§†ìòØöS܆ˆ›‹†ÒöSŠ4†ƒŽúþŸSЃùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSŠœ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñS‡´†ƒŽúþŸS‰üƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöSˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÜS†Ü†ˆ›»ì†ì†ì†Òö؆ˆþöS…H†ˆ›S†€ì†ì†ì†ìòò†ì†Òöð†üSƒä†ˆ›S…ìò†ì†ìò†ìò†ÒöSƒ4ˆ›™ò†Òöð†ƒùS€¸†ƒˆúþŸSƒƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöS4†ˆ¦õ·ä†‹Ø’ÍþøôüÒSà†ˆ›»ì†ì†ì†óßöS~@†ƒŽúþŸSÔƒùꆄ„þöꆆöS~¨†ˆ¦õ·ä†‹Ø’ÍþøôüÜS|œ†ƒúþŸS~4ƒùꆄ‚öꆈþöS}†ˆ¦õ·ä†‹Ø’ÍþøôüÚS{|†ˆ›Ÿ‹ˆ­ì†ì†È†Òöð†ƒùSz܆ˆ›‘ÒöSwˆ†ˆ›SzÌSxD†‹úþŸSz´ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆆöSxÀ†ˆ¦õ·ä†‹Ø’Íþøôü†ìò†ÒöSv†ƒŽúþŸSw|ƒùꆆöSvx†ˆ¦õ·ä†‹Ø’ÍþøôüÜØ†ˆþöSt솈›»ì†ì†ì†ÒöStL†ˆ›Ÿì†Òö膃ˆñSn(ƒúþŸStƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSnˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù膃ˆñSm†ˆ›™ò†Òöð†ƒùò†ƒùSl`†ˆ›‘Òöð†ƒùSjT†ƒŽúþŸSl8ƒùꆄ‚öꆄ‚öꆄ‚öꆆöSj¼†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù脌ƒóƒùSil†ˆ›Ÿì†Òö؆ˆþöSh†ˆ›Siìò†ìòò†ÒöÞ“õþþøö†üSg†ˆ›‹†ÒöSf†ˆ›‘Òöö†üð†ƒù؆ˆþöSe@†ˆ›»ì†ì†ì†Òöð†ƒùöƒùSd„†ˆ›‘Òöð†ƒùð†ƒùSbp†ƒˆúþŸSd@ƒùꆄ‚öꆄ‚öꆆöSb솈¦õ·ä†‹Ø’ÍþøôüÒSa´†ˆ›­ìò†ÒöS_솃ŽúþŸSa¨ƒùꆄ„þöꆄ„þöꆈþöS`T†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùS_†ˆ›­ì†ì†óßöS^\†ˆ›­ì†ì†ÒöS]„†ˆ›»ì†ì†ì†ÒöSZ´†ˆ›S]tì†ìS[T†‹úþŸS]$ƒùꆄ„þöꆄ„þöꆈþöS[Іˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÒöÞ“õþþøSX<†ƒˆúþŸSZ\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSX¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒSW€†ˆ›­ìò†Òöð†üSUȆƒˆˆúþŸSWXƒùꆆöSVT†ˆ¦õ·ä†‹Ø’ÍþøôüÊSTü†ˆ›™†‹á†ÒöSS솈›STĆì†ìòòØöò†ƒùö†üò†ƒùSRÔ†ˆ›»ì†ì†ì†Òö脌ƒóƒùSR†ˆ›ŸìØöò†ƒùð†ƒùSPƒŒüSQÆþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þçSP†ˆ›ãöð†ƒùSLd†ˆ›™†‹úþŸSO¼ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSMd†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöSKà†ˆ›‘ÒöSK@†ˆ›‹†ÒöSJ„†ˆ›™†ì†Òöö†üSD˜†ƒŽúþŸSJhƒùꆄ‚öò†ƒùSEІˆ‘úþŸSJƒùꆄ‚öSG†ˆ‰úþŸSIЃùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöSG †ˆ¦õ·ä†‹Ø’ÍþøôüÖöSFH†ˆ¦õ·ä†‹Ø’ÍþøôüþàöSE†ˆ¦õ·ä†‹Ø’ÍþøôüÜSC܆ˆ›­ì†ì†ÒöSC†ˆ›»ì†ì†ì†ÒöSBd†ˆ›Ÿì†ÒöSAŒ†ˆ›»ì†ì†ì†ÒöSA†ˆ›‘ÒöS@Xˆ›™ò†Òöò†ƒùS?x†ˆ›™†ì†ÒöS>ô†ˆ›ãöS=t†ˆ›S>¼†ì†ìòòòòò†ì†óßöS<¸†ˆ›™†ì†ÒöS;Ćˆ›S<¨ì†ì†ì†ìØöS8à†ƒúþŸS;¸ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöS9L†ˆ¦õ·ä†‹Ø’ÍþøôüÚS8†ˆ›§†ì†ì†óßöö†üS6膈›S7èìò†ìò†ì†ÒöS5ô†ˆ›µ†ìò†ì†Òö膃ˆñS4ð†ˆ›»ìò†ì†Òöö†üS1 †ƒˆšøS4tþŽþþS1FS4`S1BþŸS4PƒùS3”†ˆ¦õ§ì†ÊþøS2䆈¦õ§ì†ëßþøS1ˆ„S20ˆ¦õ§‹á†ÊþS1”ˆ¦õ™‹S1 þøôüÒS04†ˆ›»ì†ì†ì†Òö؆ˆþöS)Œ†ƒúþŸS/܃ùꆄ„þöS+†„„‰úþŸS/œƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆈþöS+ †ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆈþöS)ø†ˆ¦õ·ä†‹Ø’ÍþøôüÚS(†ƒúþŸS)€ƒùꆈþöS(|†ˆ¦õ·ä†‹Ø’ÍþøôüÚÞ“õþþøS'†ˆ›™†ì†Òöð†ƒùS#ІƒˆúþŸS&àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆆöS$L†ˆ¦õ·ä†‹Ø’ÍþøôüÒS#0†ˆ›Ÿì†Òö̆ƒˆˆ‘Øò†ƒùS"†ˆ›‹ØöS0†ƒˆúþŸS"ƒùꆄ„þöS¬†„„‰ˆS!Äì†S†‹úþŸS!ƒùꆄ‚öꆄ„þöꆄ„þöSL†ˆ‰úþŸS!ƒùꆄ‚öꆈþöSÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöS|†ˆ¦õ·ä†‹Ø’ÍþøôüSÄöꆄ„þöS¤†„„‰ˆStì†ì†ì†ì†ÜöꆈþöS¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒS†ƒˆúþŸS$ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆈþöS€†ˆ¦õ·ä†‹Ø’ÍþøôüÒS膃úþŸSøƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöST†ˆ¦õ·ä†‹Ø’ÍþøôüÚS†SÚþò„þò„þS„ü¬„þò„þò„þò„þè÷؆ˆþö؆ˆþöSІˆ›»‹úþŸS\ƒùꆄ„þöꆄ„þöꆆöS†ˆ¦õ·ä†‹Ø’Íþøôü†ìò†ÒöS0†ˆ›Ÿì†ÒöS†ˆ›Ÿì†Òöö†üSŒ†ˆ›Spì†ìòò†Òöˆ›ãöSL†ˆ›™†ì†Òöð†üò†ƒùS\†ˆ›™†ì†ÒöS h†ˆ›SLì†ì†ì†ì†ÒöS ܆ƒˆúþŸS \ƒùꆄ„þöꆄ‚öS (†ˆ‘úþŸS ôƒùꆄ‚öꆄ„þöꆆöS  †ˆ¦õ·ä†‹Ø’ÍþøôüÞöS X†ˆ¦õ·ä†‹Ø’ÍþøôüÒS †ˆ›™ò†Òöð†ƒùSd†ˆ›Ÿì†ÒöS¼†ƒˆ»ì†ì†ì†àRþœ„S°ƒRþ¨ƒšøS@þŽþþRþÆS,RþÂþŸSƒùSÔ†ˆ¦õSìò†ìò†ì†ì†ÊþøS˜†ˆ¦õSÄìò†ìò†ì†ì†ÊþøS\†ˆ¦õS`†ìò†ì†ì†ì†ÊþøSt†ˆ¦õSLì†ì†ì†ÊþøSĆˆ¦õ§ì†ÊþøS†ˆ¦õ“†ÊþøSd†ˆ¦õ§ì†ëßþøRÿ„Rÿ°ˆ¦õ§‹á†ÊþRÿˆ¦õ™‹Rÿ þøôüÚRþ†ˆ›‘ÒöRý@†ˆ›»ì†ì†ì†ÒöRõ䆈›Rý0ì†ì†ì†ì†RöL†‹šøRüHþŽþþRö†Rü4Rö‚þŸRü$ƒùRû†ˆ¦õ½†ì†ì†ì†ÊþøRùô†ˆ¦õRûì†ì†ì†ì†ì†ÊþøRøÔ†ˆ¦õRùäì†ì†ì†ì†ì†ÊþøRø$†ˆ¦õ§ì†ëßþøRöÈ„R÷pˆ¦õ§‹á†ÊþRöÔˆ¦õ™‹RöàþøôüRõüöRõ(†ˆ›­ì†ì†ÒöøƒùRñ¤†ƒŽúþŸRõƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöRò †ˆ¦õ·ä†‹Ø’ÍþøôüÜRï°†ˆ›Rñ”Rð ŠúþŸRñ|ƒùꆆöRðx†ˆ¦õ·ä†‹Ø’ÍþøôüRïÈöRîø†ƒˆˆ§†ì†ì†ØRî †ˆ›§†ìòØöR퀆ˆ›‹†Òö膃ˆñR놃ˆúþŸRíHƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöRë|†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùö†üR錆ˆ›RêÄìò†ì†ìò†ìò†ÒöRèøˆ›Ÿì†ÒöRæÔ†ƒˆúþŸRèàƒùꆄ„þöꆄ„þöꆄ‚öà†ˆþöRçP†ˆ¦õ·ä†‹Ø’ÍþøôüÒRäø†ƒˆúþŸRæÈƒùꆄ‚öꆄ„þöꆈþöRåt†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùRâd†ƒˆúþŸRäÔƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöRâà†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùRà„†ƒŽúþŸRâ@ƒùꆄ„þöꆄ„þöꆈþöRà솈¦õ·ä†‹Ø’ÍþøôüÜRÞà†ƒúþŸRàxƒùꆄ‚öꆈþöRßL†ˆ¦õ·ä†‹Ø’ÍþøôüÚRÝd†ƒúþŸRÞÔƒùꆈþöRÝІˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùRÜĆˆ›‘ÒööüRÜ$†ˆ›‘ÒöRÛL†ˆ›»ì†ì†ì†óßöò†ƒùRÙh†ƒúþŸRÛ(ƒùꆄ„þöꆄ„þöꆈþöRÙÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÚRφƒúþŸRÙ\ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öRÑ0†„„‰ˆúþŸR؃ùꆄ‚öꆄ„þöꆄ‚öRÒÀ†„„‰úþŸR×tƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öRÔh†„„‰úþŸRÖlƒùꆄ„þöꆄ„þöꆄ‚öꆈþöRÔð†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆈþöRÓH†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöRÑȆˆ¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆöRÏp†ˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñRÉØ†ˆ›RÎÈì†ì†ì†RÊ@†‹šøRÍüþŽþþRÊzRÍèRÊvþŸRÍØƒùRÌȆˆ¦õRͼì†ì†ì†ì†ÊþøR̆ˆ¦õ§ì†ëßþøRʼ„RËdˆ¦õ§‹á†ÊþRÊȈ¦õ™‹RÊÔþøôüRÉðöRȃˆúþŸRÉ̃ùꆄ„þöꆄ‚öꆆöRÈx†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñRÇP†ƒˆˆ‹†Øò†ƒùRÅ †ƒˆúþŸRÇ,ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöRň†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñRƃŽúþŸRÄÔƒùꆄ‚öꆄ„þöꆆöRÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜR”†ˆ›‘ÒöRÁ䈛™†ì†Òöò†ƒùRÁ<†ˆ›‘ÒöR¾ø†ƒúþŸRÁ0ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöR¿d†ˆ¦õ·ä†‹Ø’ÍþøôüÚR¾t†ˆ›‘ÒöR¼4†ƒˆúþŸR¾hƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöR¼°†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùR»”†ˆ›ãöRµÀ†ƒˆúþŸR»ˆƒùꆄ‚öR· †ˆ‰úþŸR»Hƒùꆄ‚öR¹T†„„‰úþŸR»ƒùꆄ„þöꆈþöR¹Ü†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöR·”†ˆ¦õ·ä†‹Ø’ÍþøôüÖöR¶<†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñR´Ø†ˆ›­ì†ì†ÒöR´†ˆ›­ì†ì†ÒöR²ð†ˆ›R´ ì†ìò†ìòò†ÒöR²\ˆ›Ÿì†óßöR¯Ô†ƒˆúþŸR²Dƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöR°P†ˆ¦õ·ä†‹Ø’ÍþøôüÒR¯4†ˆ›Ÿì†ÒöR®x†ˆ›­ìòØöR©(†ƒˆúþŸR®lƒùꆄ‚öò†ƒùRªt†ˆ‘úþŸR®ƒùꆄ‚öR«ä†„„‰úþŸR­Ôƒùꆄ‚öꆄ‚öà†ˆþöR¬l†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöRªì†ˆ¦õ·ä†‹Ø’ÍþøôüþàöR©¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒR¨4†ˆ›R©ì†ì†ì†ìØöR§\†ˆ›»ì†ì†ì†Òö脌ƒóƒùR¦†ˆ›Ÿì†Òöð†ƒùR¥\†R¦fþò„þò„þò„þò„þR¥n„ü¬„þò„þò„þò„þè÷R¤Èˆ›Ÿì†ÒöR¤4†·þò„þò„þæ„üò÷R£°†ˆ›‘ÒöR¡ø†ˆ›R£ ì†ì†ì†ìòòòòò†ì†ìùßöð†ƒùƆ‡ü”„þò„þè÷RšØ„R¡`ƒRšäƒšøR ðþŽþþR›R ÜRšþþŸR ÌƒùR †ˆ¦õ§ì†ÊþøRŸ`†ˆ¦õ§ì†ÊþøRžÌ†ˆ¦õ™ÊþøRž†ˆ¦õ¡ò†ÊþøRP†ˆ¦õ“†ÊþøRœ †ˆ¦õ§ì†ëßþøR›D„R›ìˆ¦õ§‹á†ÊþR›Pˆ¦õ™‹R›\þøôüÚRšT†ˆ›‘Òöò†ƒù؆ˆþöR™†ˆ›»ì†ì†ì†ÒöR˜x†ˆ›Ÿì†Òöð†ƒùR— †ˆ›­ì†ì†ÒöR•ĆƒˆúþŸR—”ƒùꆄ„þöꆄ„þöꆈþöR–@†ˆ¦õ·ä†‹Ø’ÍþøôüÒR“ôƒˆúþŸR•¸ƒùꆄ„þöꆄ„þöꆆöR”d†ˆ¦õ·ä†‹Ø’ÍþøôüÒR’h†ˆ›R“°†ì†ìòòòòò†ì†óßöR‘t†ˆ›R’Xì†ì†ì†ìØöRü†ƒŽúþŸR‘hƒùꆄ‚öꆄ„þöR\†„„‘úþŸR‘ƒùꆄ‚öꆆöRÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆈþöRŽd†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùRŒÐ†ˆ›RÐìò†ìò†ì†ÒöR‹Ü†ˆ›µ†ìò†ì†ÒöRŠP†ƒˆúþŸR‹ÐƒùꆈþöRŠÌ†ˆ¦õ·ä†‹Ø’ÍþøôüÒR‰h†ˆ›RŠ@ìò†ä†‹ÇöRˆ†ˆ›»ì†ì†ì†ÒöR‡¸†ˆ›»ì†ì†ì†ÒöR†à†ˆ›»ì†ì†ì†ÒöRƒ,†ƒúþŸR†ÔƒùR„ð†„„‘úþŸR†¼ƒùꆄ„þöꆄ‚öꆆöR…h†ˆ¦õ·ä†‹Ø’ÍþøôüÞöↄ„‰õöꆄ„þöꆈþöRƒ˜†ˆ¦õ·ä†‹Ø’ÍþøôüÚR°†ƒúþŸRƒ ƒùꆈþöR‚†ˆ¦õ·ä†‹Ø’ÍþøôüÚˆ›‘óßöR}ô†ˆ›§†‹úþŸRƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöR†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÒöR}T†ˆ›Ÿì†Òö̆ƒˆˆ‘ØR{(†ƒŽúþŸR|äƒùꆄ„þöꆄ„þöꆈþöR{†ˆ¦õ·ä†‹Ø’ÍþøôüÜRz¤†ˆ›‘óßö؆ˆþöö†üð†ƒùö†ü؆ˆþö؆ˆþöRw|†ƒúþŸRyxƒùꆄ‚öꆄ‚öꆄ‚öà†ˆþöRw膈¦õ·ä†‹Ø’ÍþøôüÚRv舛‹†óßöRvX†ˆ›‘ÒöRuœ†ˆ›­ìò†ÒöRtІˆ›™†‹á†Òöò†ƒùRs†ƒúþŸRt¬ƒùꆄ‚öà†ˆþöRsl†ˆ¦õ·ä†‹Ø’ÍþøôüÚRqt†ƒˆúþŸRrôƒùꆆöRqð†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùRp„†ˆ›»ì†ì†ì†Òö脌ƒóƒùRoÔ†ˆ›‘Òöö†üRo$†ˆ›Ÿì†ÒöRnt†ˆ›§ä†‹ÇöRm¸†ˆ›­ì†ì†ÒöRh¬†ƒŽúþŸRm¬ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öRj †„„‰ˆ§òò†ÜöꆈþöRi†ˆ¦õ·ä†‹Ø’Íþøôü܈›‘ÒöRf†ƒˆúþŸRhƒùꆄ„þöꆄ„þöƆˆ‰ˆ‘ÜöRf€†ˆ¦õ·ä†‹Ø’ÍþøôüÒRe€†ˆ›‘ÒöRb†ˆ›™†‹úþŸReXƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöRc†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöR`4†ƒúþŸRaôƒùꆄ‚öꆄ„þöꆈþöR` †ˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñò†ƒùR^L†ƒúþŸR_äƒùꆄ‚öꆆöR^¸†ˆ¦õ·ä†‹Ø’ÍþøôüÚR]†ˆ›­ì†ì†ÒöR\¸†ˆ›»ì†ì†ì†ÒöR[à†ˆ›»ì†ì†ì†Òö؆ˆþöð†ƒùRZ؆ˆ›Ÿì†ÒöRZ8†ˆ›‹†Òöð†üRYˆˆ›Ÿì†ÒöRW<†ƒŽúþŸRYpƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöRW¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñRV8†ˆ›»ì†ì†ì†Òöð†ƒùƆ‡ü”„þò„þè÷RT€†ˆ›RUœì†ì†ì†ìò†ì†ÒöRR؃ˆúþŸRTtƒùꆄ‚öꆆöRSH†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñð†ƒùʆˆŸßöRQ|†ˆ›‹†ÒöRPÀ†ˆ›­ì†ì†Òöð†ƒùRP„RP˜ƒRPƒŠþŸŒƒùôüÚRO8†ˆ›§†ì†ì†ÒöʆˆþöR,†ƒŽúþŸRNăùꆄ‚öò†ƒùR-@†ˆ‘úþŸRNlƒùRL°†„„‘úþŸRNTƒùꆄ‚öꆈþöRM(†ˆ¦õ·ä†‹Ø’ÍþøôüÞöRK†„„‘úþŸRL¤ƒùꆄ‚öꆈþöRKx†ˆ¦õ·ä†‹Ø’ÍþøôüÞöRIP†„„‘úþŸRJôƒùꆄ‚öꆈþöRIȆˆ¦õ·ä†‹Ø’ÍþøôüÞöR:Ȇ„„‘úþŸRIDƒùꆄ‚öR<†ˆ‰ˆúþŸRIƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöRBd†„„‰ˆúþŸRDdƒùꆄ‚öꆄ‚öà†ˆþöRBü†ˆ¦õ·ä†‹Ø’ÍþøôüÎöꆄ„þöꆄ„þöR?€†„„‰ˆˆúþŸRBƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöà†ˆ‰õöR@(†ˆ¦õ·ä†‹Ø’ÍþøôüÆöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöR<¨†ˆ¦õ·ä†‹Ø’ÍþøôüÎöR;@†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR7 †„„‘úþŸR:¼ƒùꆄ‚öR8h†ˆ‰ˆúþŸR:|ƒùꆄ‚öꆄ‚öꆄ„þöꆈþöR9†ˆ¦õ·ä†‹Ø’ÍþøôüÎöR7˜†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR5H†„„‘úþŸR7ƒùꆄ‚öꆄ„þöꆈþöR5À†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR3˜†„„‘úþŸR5<ƒùꆄ‚öꆈþöR4†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR1膄„‘úþŸR3Œƒùꆄ‚öꆈþöR2`†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR08†„„‘úþŸR1܃ùꆄ‚öꆈþöR0°†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR.ˆ†ˆ‘úþŸR0,ƒùꆄ‚öꆈþöR/†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR-¸†ˆ¦õ·ä†‹Ø’ÍþøôüþàöR,p†ˆ¦õ·ä†‹Ø’ÍþøôüÜR"h†ˆ›R+øìò†ì†ì†R"І‹šøR+þŽþþR# R*üR#þŸR*ìƒùR&$†ˆ¦õR&ü‹šøR*tþŽþþR'*R*`R'&þŸR*PƒùR)x†ˆ¦õµì†ì†ÊþøR(Ȇˆ¦õ§ì†ëßþøR'l„R(ˆ¦õ§‹á†ÊþR'xˆ¦õ™‹R'„þøôü†ì†ì†ÊþøR%X†ˆ¦õµì†ì†ÊþøR$¨†ˆ¦õ§ì†ëßþøR#L„R#ôˆ¦õ§‹á†ÊþR#Xˆ¦õ™‹R#dþøôüR"€öR!†ˆ›»ì†ì†ì†Òöð†ƒùRT†ˆ›R!dì†ìRô†‹úþŸR!ƒùꆄ„þöꆄ„þöR@†ˆ‘úþŸR ¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöR¸†ˆ¦õ·ä†‹Ø’ÍþøôüÞöRp†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÒöR´†ˆ›Ÿì†ÒöñRĆƒŽúþŸR|ƒùꆄ‚öꆄ„þöRü†ˆ‘úþŸRƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöRt†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR,†ˆ¦õ·ä†‹Ø’ÍþøôüÜR †ƒúþŸR¸ƒùꆄ„þöꆈþöRŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÚRH†ˆ›»ì†ì†ì†óßöR(†ˆ›Ÿ‹ˆ­ì†ì†È†ÒöR ˜†ƒˆúþŸRƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöR†ˆ¦õ·ä†‹Ø’ÍþøôüÒR †ˆ›‘ÒöR t†ˆ›Ÿì†ÒöR Ô†R fþò„þò„þÚ„üˆ„þè÷R|†ƒúþŸR ȃùꆄ‚öꆄ‚öR¸†ˆ‰’úþŸR `ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöR D†ˆ¦õ·ä†‹Ø’ÍþøôüÔöR膈¦õ·ä†‹Ø’ÍþøôüÚRÀ†ˆ›™ò†Òö؆ˆþöRT†ˆ›Rdì†ì†ìòꆋÇöQù|†ˆ›R†ìQù䆋šøR”þŽþþQúR€QúþŸRpƒùR´†ˆ¦õ§ì†ÊþøRô†ˆ¦õ§‹á†ÊþøR †ˆ¦õ¯†ì†ì†ÊþøR†ˆ¦õ½†ì†ì†ì†ÊþøQÿ”†ˆ¦õRÐòò†ìò†ìò†ì†ÊþøQþ<†ˆ¦õQÿ\ò†ì†ì†ì†ì†ì†ÊþøQýT†ˆ¦õ¯†ìò†ÊþøQül†ˆ¦õ¯†ìò†ÊþøQû¼†ˆ¦õ§ì†ëßþøQú`„Qûˆ¦õ§‹á†ÊþQúlˆ¦õ™‹QúxþøôüQù”öQøÜ†ˆ›‹†ÒöQ÷膈›µ†ìòò†ÒöÞ“õþþøð†ƒùò†ƒùQõ`†ƒúþŸQ÷\ƒùꆄ„þöꆄ„þöꆄ‚öà†ˆ‰õöQõ̆ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùQó†ƒúþŸQõ<ƒùꆄ‚öà†ˆþöQóü†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üQòà†ˆ›Ÿì†ÒöQñà†QòÒþò„þò„þò„þò„þò„þò„þò„þæ„üò÷ð†üQ𴆈›Qñ´ìò†ìòò†ÒöQïHƒŽúþŸQð¨ƒùꆆöQ句ˆ¦õ·ä†‹Ø’ÍþøôüÜQ솃úþŸQï0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQìt†ˆ¦õ·ä†‹Ø’ÍþøôüÚQë4†ƒˆˆQëøì†ìò†ì†ØÊ†ˆŸßöQéô†ˆ›§†ì†ì†ÒöQé †ˆ›»‹áò†ì†ÒöQè4†ˆ›»ì†ìò†Òöò†ƒùQçD†ˆ›»ì†ì†ì†ÒöQ椆ˆ›ŸìØöQÝ䓼Qß$Š˜þ˜Q戒Q市ˆ’Qߘü–Qàb’QáäQål’QáÜøüøüøüøüøüøüøüQà€QáööQàLþQß´—ˆ‹QßQÞ|QßöQÝô›‹Øö憃ˆñQÜÀ†ˆ›»‹áòò†ÒöQÙD†ƒúþŸQÜ´ƒùꆄ„þöꆄ‚öQÚ€†ˆ‘úþŸQÜLƒùꆄ‚öꆄ‚öꆆöQÚø†ˆ¦õ·ä†‹Ø’ÍþøôüÞöQÙ°†ˆ¦õ·ä†‹Ø’ÍþøôüÚQÖ†ˆ›™†‹úþŸQÙƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöQ׆ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒùQÔD†ƒŽúþŸQÕØƒùꆄ‚öꆈþöQÔ¬†ˆ¦õ·ä†‹Ø’ÍþøôüÜQÑ`†ƒúþŸQÔ8ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öQÒ솄„ü°þò„þò„þò„þéöꆄ„þöꆈþöQÑ̆ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üÒ†Ÿþæ„üò÷ʆˆþöQ¼†ˆ›QЀQÃ$†‹šøQÐþŽþþQÃ^QÏôQÃZþŸQÏäƒùQθ†ˆ¦õQÏÈì†ì†ì†ì†ì†ÊþøQÍ솈¦õµì†ì†ÊþøQÍ †ˆ¦õµì†ì†ÊþøQÌp†ˆ¦õ§ì†ÊþøQËÀ†ˆ¦õ§ì†ÊþøQË,†ˆ¦õ™ÊþøQÊ|†ˆ¦õ§ì†ÊþøQÉ̆ˆ¦õ§ì†ÊþøQɆˆ¦õ§ì†ÊþøQÈl†ˆ¦õ§ì†ÊþøQǼ†ˆ¦õ§ì†ÊþøQÇ †ˆ¦õ§ì†ÊþøQÆ\†ˆ¦õ§ì†ÊþøQŬ†ˆ¦õ§ì†ÊþøQÄü†ˆ¦õ§ì†ëßþøQà„QÄHˆ¦õ§‹á†ÊþQ숦õ™‹QøþøôüQÂÔöö†üò†ƒùQˆ›Ÿì†ÒöQÀ¬†ˆ›QÁ¼òòòò†ì†ì†óßöQ¾H†ƒˆúþŸQÀ„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ¾Ä†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ½Œ†ˆ›­ì†ì†ÒöQºü†ƒˆúþŸQ½€ƒùꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öà†ˆþöQ»x†ˆ¦õ·ä†‹Ø’ÍþøôüÒQº@†ˆ›­ì†ì†ÒöQ·œ†ƒŽúþŸQº4ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöQ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ¶Œ†ˆ›Q·Œì†ì†ì†ì†ì†ÒöQ³¨†ƒúþŸQ¶€ƒùꆄ‚öꆄ‚öꆄ„þöQµ †„„‰ˆQµìì†ì†ì†ä†‹ÑöꆈþöQ´†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ¨ †ˆ›Q³˜ì†ìQ®†‹úþŸQ³Hƒùꆄ‚öꆄ‚öQ¯ì†„„‰úþŸQ²àƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆈþöQ°t†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ„þöꆄ‚öꆈþöQ®|†ˆ¦õ·ä†‹Ø’ÍþøôüQ©$†‹úþŸQ­ôƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öQªÀ†„„‰úþŸQ¬œƒùꆄ„þöꆄ‚öꆈþöQ«H†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆈþöQ© †ˆ¦õ·ä†‹Ø’ÍþøôüÂØöQ¦ü†ƒúþŸQ¨”ƒùꆄ‚öꆈþöQ§h†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üð†ƒù؆ˆþöQ™ †ˆ›Q¦L†Qš†‹šøQ¥àþŽþþQšBQ¥ÌQš>þŸQ¥¼ƒùQ¥†ˆ¦õ“†ÊþøQ¤P†ˆ¦õ§ì†ëßþøQ£„†ˆ¦õ¡†ì†ëßþøQ¢Ô†ˆ¦õ“†ÊþøQ¡Ð†ˆ¦õ½†ìò†ì†ÊþøQ¡†ˆ¦õ¡†ì†ëßþøQ 8†ˆ¦õ¡†ì†ëßþøQŸl†ˆ¦õ¡ò†ÊþøQž †ˆ¦õ¡†ì†ëßþøQ¸†ˆ¦õ¯ò†ì†ÊþøQ$†ˆ¦õ™ÊþøQœ†ˆ¦õ™ÊþøQ›à†ˆ¦õ§ì†ëßþøQš„„Q›,ˆ¦õ§‹á†ÊþQšˆ¦õ™‹QšœþøôüÉßöð†ƒùQ˜¬†ˆ›»ì†ì†ì†ÒöQ—à†ˆ›­‹á†ì†óßöQ—0ˆ›™†ìùßöQ–D†ˆŸŠŠþŸŒƒùôüQ–\öQ”T†ƒŽúþŸQ–8ƒùꆄ‚öꆄ‚öꆄ‚öꆆöQ”¼†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ“˜†ˆ›­ìò†Òöò†ƒùQ’Œ†ˆ›µòòò†ÒöQ‘´†ˆ›§ò†ì†ÒöQŒ †ƒúþŸQ‘¨ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöQH†ˆ‘úþŸQx„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöQÀ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöQŒx†ˆ¦õ·ä†‹Ø’ÍþøôüÚQŠT†ƒúþŸQŒƒùꆄ‚öà†ˆþöQŠÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ‡ì†ˆ›QŠDQˆp†‹úþŸQŠ,ƒùꆄ‚öà†ˆ‰õöQˆì†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöQ†ø†ˆ›Q‡Üìò†ì†ìØöQ…h†Q†êþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þæ„üò÷Q‚$†ƒŽúþŸQ…\ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öà†ˆþöQ‚Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ$†Q‚þò„þò„þò„þò„þò„þ΄ü”„þò„þè÷öƒùQ}ˆ†ˆ›Qˆ‹úþŸQ€üƒùꆆöQø†ˆ¦õ·ä†‹Ø’ÍþøôüQ}ð†‹úþŸQpƒùꆆöQ~l†ˆ¦õ·ä†‹Ø’ÍþøôüÉßöð†ƒùð†ƒùö†üð†ƒùð†ƒùQ|0†ˆ›»ì†ì†ì†ÒöQ{†ˆ›Ÿì†ÒöñQw†ƒúþŸQ{Xƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQwü†ˆ¦õ·ä†‹Ø’ÍþøôüÚQv¸†ˆ›§òò†ÒöQu,†ƒˆúþŸQv¬ƒùꆆöQu¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùQsl†ƒúþŸQuƒùꆄ‚öꆈþöQs؆ˆ¦õ·ä†‹Ø’ÍþøôüÚQr@†ˆ›Qs\ìò†ìòò†ì†Òö؆ˆþöQb솈›QnH‹šøQqˆþŽþþQnvQqtQnrþŸQqdƒùQpĆˆ¦õ™ÊþøQp†ˆ¦õ§ì†ëßþøQn¸„Qo`ˆ¦õ§‹á†ÊþQnĈ¦õ™‹QnÐþøôü†ì†ìòò†ìòòQcT†‹šøQlðþŽþþQcŽQlÜQcŠþŸQl̃ùQj¼†ˆ¦õQl@†‹ˆÙ†ä†‹á†ì†ì†ì†ìòò†ÊþøQip†ˆ¦õQjœ‹á†ì†ì†ìòò†ÊþøQhl†ˆ¦õQi`ì†ìòò†ÊþøQg¼†ˆ¦õ“†ÊþøQfÔ†ˆ¦õQg¬ìòò†ÊþøQe܆ˆ¦õQf´‹á†ì†ì†ÊþøQe,†ˆ¦õ§ì†ëßþøQcЄQdxˆ¦õ§‹á†ÊþQc܈¦õ™‹QcèþøôüQcöQbL†ˆ›Ÿì†ÒöQa¬†ˆ›Ÿì†ÒöQ_Ĉ›QaœQ`ŠúþŸQa„ƒùꆆöQ`€†ˆ¦õ·ä†‹Ø’ÍþøôüQ_ÐöQ]Œ†ˆ›­‹úþŸQ_¬ƒùꆆöQ^¨†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÒöQ\Іˆ›™ò†ÒöQ[܆ˆ›Q\Àìòòò†ÒöQYˆ†ƒˆúþŸQ[Ѓùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöQZ†ˆ¦õ·ä†‹Ø’ÍþøôüÒQY†ˆ›„ßöQW†ƒˆúþŸQXøƒùꆄ‚öꆄ„þöꆄ‚öꆈþöQW|†ˆ¦õ·ä†‹Ø’ÍþøôüÒQVD†ˆ›­ì†ìØöQT†ƒŽúþŸQV8ƒùꆄ‚öà†ˆþöQTø†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùQSœ†ˆ›»ì†ì†ì†ÒöQRĆˆ›»ì†ì†ì†ÒöQM˜„QR¸ƒQM¤ƒšøQRHþŽþþQMÂQR4QM¾þŸQR$ƒùQQ†ˆ¦õQRìò†ì†ì†ÊþøQP†ˆ¦õQQì†ì†ìò†ÊþøQO`†ˆ¦õ§ì†ëßþøQN„QN¬ˆ¦õ§‹á†ÊþQNˆ¦õ™‹QNþøôüÚQLÀ†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöÔˆþöQH†ƒˆúþŸQK¼ƒùQIˆ†„„‘úþŸQK¤ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöQJ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöà†ˆþöQH|†ˆ¦õ·ä†‹Ø’ÍþøôüÒQE„†ˆ›™†‹úþŸQG؃ùà†„„þöà†ˆþöQF„†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöQDX†ˆ›QELòòòòò†óßöò†ƒùQCl†ƒˆˆµòòòÞQB\†ˆ›QC\ì†ìòòòØöQ@¨†ƒˆúþŸQBPƒùꆄ‚öꆈþöQA$†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üQ?À†ˆ›»ì†ì†ì†ÒöQ>膈›»ì†ì†ì†ÒöQ= †ƒˆúþŸQ>܃ùꆄ‚öà†ˆþöQ=œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ; ƒˆúþŸQ=ƒùꆈþöQ<†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ9†ƒúþŸQ;ˆƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ9l†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ6¼†ƒúþŸQ8ôƒùꆄ„þöꆄ„þöꆄ‚öà†„„‰õöà†ˆþöQ7(†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ5䆈›»ì†ì†ì†ÒöQ5 †ˆ›»ì†ì†ì†ÒöQ4ˆ†ˆ›‘Òö؆ˆþöQ3œ†ˆ›Ÿì†ÒöQ2䆃ˆˆ§òò†ØQ/üƒŽúþŸQ2؃ùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöQ0X†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ/P†ˆ›ŸìØöð†ƒùQ-X†ƒˆúþŸQ/(ƒùꆄ‚öꆄ„þöꆈþöQ-Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ,€†ˆ›»ìò†ì†ÒöQ+à†ˆ›Ÿì†ÒöQ%x†ˆ›‘‹šøQ+tþŽþþQ&Q+`Q&þŸQ+PƒùQ*”†ˆ¦õ“†ÊþøQ)Ȇˆ¦õµì†ì†ÊþøQ(ü†ˆ¦õ¡†ì†ÊþøQ(h†ˆ¦õ™ÊþøQ'¸†ˆ¦õ§ì†ëßþøQ&\„Q'ˆ¦õ§‹á†ÊþQ&hˆ¦õ™‹Q&tþøôüQ%öQ$؆ˆ›Ÿì†Òö؆ˆþöQ#øˆ›‹†ÒöQ!˜†ƒˆúþŸQ#àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ"†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ!†ˆ›‘ÒöQ|†ˆ›Q ܆Q8†‹úþŸQ Ѓùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆈþöQ´†ˆ¦õ·ä†‹Ø’Íþøôü†ìòØöQ\†ˆ›QDòΆ‹ˆ‘QtöQ¨†ƒˆúþŸQPƒùꆄ‚öꆈþöQ$†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ̆ƒˆúþŸQœƒùꆄ‚öꆄ„þöꆈþöQH†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ8†ƒŽü°þò„þò„þò„þåð†ƒùQD†ˆ›»ì†ì†ì†Òö؆ˆþöö†üò†ƒùQ¤†ˆ›Q˜†ìò†ìò†ì†Òöñö†ü̆ƒŽü˜þò„þåQ€†ˆ›‘Òö؆ƒŽüŒþåQ¼†ˆ›Qüò†Q$†‹šøQtþŽþþQ^Q`QZþŸQPƒùQ\†ˆ¦õQ4ìò†ì†ÊþøQ¬†ˆ¦õ“†ÊþøQü†ˆ¦õ§ì†ëßþøQ „QHˆ¦õ§‹á†ÊþQ¬ˆ¦õ™‹Q¸þøôüQÔöQ T†ƒˆšøQPþŽþþQ ŽQ<Q ŠþŸQ,ƒùQ p†ˆ¦õ§ì†ÊþøQ ܆ˆ¦õ™ÊþøQ ,†ˆ¦õ§ì†ëßþøQ ЄQ xˆ¦õ§‹á†ÊþQ ܈¦õ™‹Q èþøôüÒQ D†ˆ›Q Dìò†ìò†ì†ÒöøƒùQ˜†ˆ›‘‹ÇöQˆ†ˆ›Qˆìò†ìòò†ÒöQ̆ˆ›™ò†ÒöQ؆ˆ›µòòòØöQ†ˆ›­ì†ì†ÒöQð†ƒˆúþŸQƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþöQl†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üPþ†ƒúþŸQÔƒùꆄ‚öPÿT†ˆ‰’úþŸQ”ƒùQ؆„„‘úþŸQ|ƒùꆄ„þöꆈþöQP†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöPÿà†ˆ¦õ·ä†‹Ø’ÍþøôüÔöPþ„†ˆ¦õ·ä†‹Ø’ÍþøôüÚPúÀ†ƒŽúþŸPþ ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöPû(†ˆ¦õ·ä†‹Ø’ÍþøôüÜPú<†ˆ›‘Òö؆ˆþö؆ˆþöP÷胎úþŸPù˜ƒùꆄ„þöꆄ„þöꆈþöPøD†ˆ¦õ·ä†‹Ø’ÍþøôüÜPö†ƒúþŸP÷Ѓùꆄ„þöꆄ„þöꆆöPö|†ˆ¦õ·ä†‹Ø’ÍþøôüÚPó䆃ˆúþŸPöƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöPô`†ˆ¦õ·ä†‹Ø’ÍþøôüÒPñ܆ƒúþŸPó؃ùꆄ‚öꆄ‚öꆄ‚öà†ˆþöPòH†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþöö†üPðà†ˆ›‘ÒöPð$†ˆ›­ìò†ÒöƆ«þò„þæ„üò÷ð†ƒùPîÀ†ˆ›»ì†ì†ì†ÒöPí膈›»ì†ì†ì†ÒöPíH†ˆ›ŸìØöð†üPëd†ƒŽúþŸPí ƒùꆄ‚öꆄ‚öꆆöPë̆ˆ¦õ·ä†‹Ø’ÍþøôüÜöƒùPêĆˆ›‘ÒöPê@†ˆ›‘óßöʆˆþöö†üð†ƒùPè „Pél“õþþØ‚“õþþØ‚“õþþØ‚“õþþØ‚“õþþÚ“õþþøò†ƒùPæÈ†ˆ›Pçäìò†ìò†ì†ì†ÒöPÞ8†ˆ›Pæ¸ìò†ìPÞ †‹šøPåìþŽþþPÞÚPåØPÞÖþŸPåȃùPâø†ˆ¦õPãì‹úþŸPå°ƒùꆄ„þöꆄ„þöꆆöPä\†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìò†ÊþøPↈ¦õ¯ò†ì†ÊþøPá(†ˆ¦õ¯ò†ì†ÊþøPàx†ˆ¦õ§ì†ëßþøPß„PßĈ¦õ§‹á†ÊþPß(ˆ¦õ™‹Pß4þøôüPÞPöPר†ˆ›PÞ(ì†PØ@†‹šøPÝ”þŽþþPØzPÝ€PØvþŸPÝpƒùPÜ|†ˆ¦õPÝTì†ì†ì†ÊþøPÛ°†ˆ¦õµì†ì†ÊþøPÚȆˆ¦õPÛ ì†ì†ì†ÊþøPÚ†ˆ¦õ§ì†ëßþøPؼ„PÙdˆ¦õ§‹á†ÊþPØÈˆ¦õ™‹PØÔþøôüP×ðöP׆ˆ›»ì†ì†ì†ÒöPÖD†ˆ›­ì†ì†ÒöPÕ¤†ˆ›Ÿì†ÒöPÔø†ƒŽü¼þò„þò„þò„þò„þåPÔX†ˆ›ŸìØöPÓ¸†ˆ›Ÿì†ÒöPÒ8†ˆ›PÓ¨ì†ì†ì†ìò†ìòò†ì†ÒöPÐ<ƒúþŸPÒ,ƒùꆄ‚öꆄ‚öꆄ‚öà†ˆþöPМ†ˆ¦õ·ä†‹Ø’ÍþøôüÚPÅô†ƒŽúþŸPÐ$ƒùꆄ‚öPÍx†„„‘úþŸPÏäƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPÍð†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPÇ,†ˆ‘úþŸPÍlƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöPǤ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPÆ\†ˆ¦õ·ä†‹Ø’ÍþøôüÜPÅp†ˆ›‘ÒöPÄ`†ˆ›PÅ`ìò†ìò†ì†Òöð†ƒùPÃl†ˆ›»ìò†ì†ÒöP¾€†ˆ›PÃ\P¾è†‹šøPÂäþŽþþP¿"PÂÐP¿þŸPÂÀƒùP†ˆ¦õ§ì†ÊþøPÁp†ˆ¦õ™ÊþøPÀÀ†ˆ¦õ§ì†ëßþøP¿d„PÀ ˆ¦õ§‹á†ÊþP¿pˆ¦õ™‹P¿|þøôüP¾˜öP´ †ˆ›‘‹šøP¾þŽþþPµBP¾Pµ>þŸP½ðƒùP½†ˆ¦õµì†ì†ÊþøP¼„†ˆ¦õ™ÊþøP»¸†ˆ¦õ¡ò†ÊþøP»$†ˆ¦õ™ÊþøPºt†ˆ¦õ§ì†ÊþøP¹à†ˆ¦õ™ÊþøP¹L†ˆ¦õ™ÊþøP¸¸†ˆ¦õ™ÊþøP¸$†ˆ¦õ™ÊþøP·†ˆ¦õ™ÊþøP¶à†ˆ¦õ§ì†ëßþøPµ„„P¶,ˆ¦õ§‹á†ÊþPµˆ¦õ™‹PµœþøôüP´¸öP²h†P´’þò„þò„þò„þò„þò„þò„þP²z„üP³â„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷ð†ƒùP±t†ˆ›»ìò†ì†ÒöP°àˆ›Ÿì†ÒöP¯à†ˆ›P°Äìòòò†ÒöP­Ü†ƒˆúþŸP¯Ôƒùꆄ‚öꆄ„þöꆄ‚öꆈþöP®X†ˆ¦õ·ä†‹Ø’ÍþøôüÒØ†“õþþøP­ †ˆ›‘ÒöP¬P†ˆ›­ìò†ÒöP«†ƒŽüP¬Bþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þåPªt†ˆ›Ÿì†Òöö†üö†üP©´†ˆ›ŸìØöP©†ˆ›ŸìØöP¦Ø†ˆ›­‹úþŸP¨ø„„þöꆆöP§ô†ˆ¦õ·ä†‹Ø’ÍþøôüÂòØöP¥DƒŽúþŸP¦Ìƒùꆄ„þöꆈþöP¥ †ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùP£T†ƒúþŸP¥ƒùꆄ‚öꆄ‚öꆆöP£À†ˆ¦õ·ä†‹Ø’ÍþøôüÚP¡†ƒŽúþŸP£Hƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöP¡|†ˆ¦õ·ä†‹Ø’ÍþøôüÜPŸ$†ƒŽúþŸP¡ƒùꆄ‚öꆄ‚öꆄ‚öꆆöPŸŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÜP †ƒˆúþŸPŸƒùꆄ‚öꆄ‚öꆄ„þöꆈþöPœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒPœd†ˆ›­ì†ì†óßöö†üP›´†ˆ›‹†óßöP›†ˆ›ŸìØöPš<†ˆ›»ìòò†ÒöP˜t†ƒˆúþŸPš0ƒùꆄ‚öà†ˆþöP˜ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒP—,†ˆ›P˜dì†ìò†ì†ìò†ì†ÒööƒùP“d†ƒúþŸP—ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöP“Іˆ¦õ·ä†‹Ø’ÍþøôüÚP‘t†ƒˆúþŸP“Xƒùꆄ‚öꆄ‚öà†ˆþöP‘ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒPð†ˆ›‘ÒöP†Ð†ƒˆúþŸPäƒùꆄ‚öò†ƒùPˆ†ˆ‘úþŸPŒƒùꆄ‚öP‰d†ˆ‰úþŸPLƒùꆄ‚öꆄ‚öꆄ‚öPм†ˆ‰úþŸP¼ƒùꆄ‚öò†ƒùPŒ†ˆ‘úþŸPdƒùꆄ‚öP\†ˆ‰úþŸP$ƒùꆄ‚öà†ˆþöP䆈¦õ·ä†‹Ø’ÍþøôüÖöPŒŒ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöP‹D†ˆ¦õ·ä†‹Ø’ÍþøôüÖöP‰ì†ˆ¦õ·ä†‹Ø’ÍþøôüÖöPˆ”†ˆ¦õ·ä†‹Ø’ÍþøôüþàöP‡L†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùP…܆ˆ›»ì†ì†ì†Òöð†ƒùöüð†ƒùP †ƒŽúþŸP…|ƒùP‚X†„„‘úþŸP…dƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöP‚Іˆ¦õ·ä†‹Ø’ÍþøôüÞöP€D†ˆ‰’úþŸP‚Lƒùꆄ‚öꆄ‚öꆄ‚öꆆöP€Ð†ˆ¦õ·ä†‹Ø’ÍþøôüÔöPt†ˆ¦õ·ä†‹Ø’ÍþøôüÜP}¨†ˆ›P~Ôòòòòòòò†ÒöP|Іˆ›§òò†ÒöP|†ˆ›™ò†ÒöPz˜†ƒúþŸP|ƒùꆈþöP{†ˆ¦õ·ä†‹Ø’ÍþøôüÚPx¤†ˆ›‘‹úþŸPzŒƒùꆆöPyˆ†ˆ¦õ·ä†‹Ø’ÍþøôüPx¼öPu†ˆ›Pv¬‹úþŸPx˜ƒùꆄ‚öꆄ‚öꆄ‚öꆆöPw†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìòò†ì†ÒöPst†ƒúþŸPu„ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöPsà†ˆ¦õ·ä†‹Ø’ÍþøôüÚPrÔ†ˆ›Ÿì†ÒöPrT†ƒˆˆŸì†ØPo솃ŽúþŸPrHƒùà†„„þöà†„„þöà†„„þöà†„„þöꆆöPpT†ˆ¦õ·ä†‹Ø’ÍþøôüÜPod†·þò„þò„þæ„üò÷ö†üPmÀƒŽúþŸPoHƒùꆄ‚öꆆöPn†ˆ¦õ·ä†‹Ø’ÍþøôüÜPlø†ˆ›™ò†ÒöPkT†ƒúþŸPlìƒùꆄ„þöꆆöPkÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÚPj˜†ˆ›­ì†ì†ÒöPh†ƒˆúþŸPjŒƒùꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öà†ˆþöPh„†ˆ¦õ·ä†‹Ø’ÍþøôüÒPe܆ˆ›Pgøì†PfD†‹úþŸPgăùꆆöPfÀ†ˆ¦õ·ä†‹Ø’ÍþøôüPeôöPc8†ƒŽúþŸPeЃùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöPc †ˆ¦õ·ä†‹Ø’ÍþøôüÜPb`†ˆ›§òòØöPaP†ˆ›PbPì†ì†ì†ì†ì†ÒöP_$†ƒˆúþŸPaDƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆈþöP_ †ˆ¦õ·ä†‹Ø’ÍþøôüÒP^l†ƒˆˆ»ìòò†ØPR°†ƒˆúþŸP^`ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöPU܆„„‰úþŸP\¸ƒùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPVd†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆆöPS,†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒùPQ¬†ˆ›»ì†ì†ì†ÒöPK†ˆ›‹†‹šøPQ$þŽþþPKºPQPK¶þŸPQƒùPP †ˆ¦õPPäì†ìò†ÊþøPO\†ˆ¦õ“†ÊþøPNȆˆ¦õ™ÊþøPN†ˆ¦õ§‹á†ÊþøPMX†ˆ¦õ§ì†ëßþøPKü„PL¤ˆ¦õ§‹á†ÊþPLˆ¦õ™‹PLþøôüPK0öö†üPJXˆ›™†ìùßöPI†ˆ›­ì†ì†ÒöPGP†ƒˆúþŸPI„ƒùꆄ„þöà†„„þöà†„„þöà†ˆþöPЈ¦õ·ä†‹Ø’ÍþøôüÒPDÀ†ƒŽúþŸPGDƒùꆄ‚öà†„„þöà†„„þöꆄ‚öà†„„þöà†ˆþöPE(†ˆ¦õ·ä†‹Ø’ÍþøôüÜP@ †ƒˆúþŸPD´ƒùꆄ‚öꆄ„þöPA¨†„„‰úþŸPDLƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöPB0†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆆöP@ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒP?ˆ†ˆ›‘ÒöP9à†ƒúþŸP?|ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöP;†ˆ‘úþŸP=L„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöP;”†ˆ¦õ·ä†‹Ø’ÍþøôüþàöP:L†ˆ¦õ·ä†‹Ø’ÍþøôüÚP5€†ˆ›P8$‹úþŸP9Ôƒùꆄ‚öà†ˆ‰õöP8”†ˆ¦õ·ä†‹Ø’ÍþøôüÂP6 †‹úþŸP7ðƒùꆄ„þöꆄ‚öꆆöP6œ†ˆ¦õ·ä†‹Ø’Íþøôü†ìØöP3|†ƒˆúþŸP5tƒùꆄ„þöꆄ‚öꆄ„þöꆆöP3ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒP1ĆƒúþŸP3pƒùꆄ‚öà†ˆþöP20†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ü脌ƒóƒùP0P†ˆ›P1lì†ì†ì†ìòò†ÒöP/x†ˆ›»ì†ì†ì†ÒöP.¼†ˆ›­ìò†ÒööƒùP,°†ƒŽúþŸP.”ƒùꆄ‚öꆄ‚öꆄ‚öꆈþöP-†ˆ¦õ·ä†‹Ø’ÍþøôüÜP%ð†ˆ›§†‹úþŸP,ˆƒùꆄ‚öꆄ‚öP+h†„„‰ˆ§òò†Üöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öP'܆ˆ‰úþŸP)hƒùꆆöP(d†ˆ¦õ·ä†‹Ø’ÍþøôüÖöP' †ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöö†üP%†ˆ›¡†ä†‹ÇöP$<†ˆ›»ì†ì†ì†ÒöP#d†ˆ›»ì†ì†ì†ÒöP"à†ˆ›‘ÒöP!´†ˆ›P"¨†ìò†ìò†ì†Òö؆ˆþöð†üöƒùP†ƒˆúþŸP!$ƒùPh†ˆ‘úþŸP! ƒùꆄ„þöꆆöPà†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP˜†ˆ¦õ·ä†‹Ø’ÍþøôüÒPȆƒˆúþŸPƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPD†ˆ¦õ·ä†‹Ø’ÍþøôüÒPt†ƒŽúþŸP¼ƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öà†ˆþöP܆ˆ¦õ·ä†‹Ø’Íþøôü܆ƒŒü¤þò„þò„þçö†üPІƒúþŸPàƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöP<†ˆ¦õ·ä†‹Ø’ÍþøôüÚPø†ˆ›»ì†ìò†Òöð†ƒù؆ˆþöP†·þò„þÚ„üˆ„þè÷öƒùPÀ†ˆ›PÜì†ìò†ìò†ì†ÒöP<†ˆ›‘ÒöPІƒŽúþŸP0ƒùꆄ‚öP†ˆ‘úþŸPðƒùꆄ„þöꆄ‚öƆ„„‰ˆ„éöƆ„„‰ˆ‘Üöꆄ„þöà†ˆþöP€†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP8†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùP˜†ˆ›‹†‹šøP,þŽþþP:P TøP ¼þŽþþP rP ¨P nþŸP ˜ƒùP À†ˆ¦õµì†ì†ÊþøP †ˆ¦õ§ì†ëßþøP ´„P \ˆ¦õ§‹á†ÊþP Àˆ¦õ™‹P ÌþøôüP6þŸP DƒùP ˆ†ˆ¦õ“†ÊþøP؆ˆ¦õ§ì†ëßþøP|„P$ˆ¦õ§‹á†ÊþPˆˆ¦õ™‹P”þøôüP°öPx†ˆ›Pˆì†ì†ì†ìò†ìòÚ†‘üŒþPà†‹úþŸP`ƒùꆆöP\†ˆ¦õ·ä†‹Ø’ÍþøôüPöPXƒˆúþŸPlƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPȆˆ¦õ·ä†‹Ø’ÍþøôüÒOþ,†ˆ›Oÿ,‹úþŸP@ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOÿœ†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìò†ì†ÒöOýp†ˆ›­ì†ì†ÒöOø˜†Oýbþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þOøª„üOüR„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷O÷À†ˆ›»ì†ì†ì†ÒöO÷ †ˆ›‹†ÒöOï`†ˆ›O÷ìò†OïȆ‹šøOö`þŽþþOðOöLOïþþŸOö<ƒùOõH†ˆ¦õOö ìò†ì†ÊþøOô˜†ˆ¦õ“†ÊþøOó膈¦õ§ì†ÊþøOó8†ˆ¦õ§ì†ÊþøOòP†ˆ¦õ¯†ì†ì†ÊþøOñ †ˆ¦õ§ì†ëßþøOðD„Oð숦õ§‹á†ÊþOðPˆ¦õ™‹Oð\þøôüOïxöOîØ†·þò„þÚ„üˆ„þè÷OèĆˆ›‘‹šøOîlþŽþþOéfOîXOébþŸOîHƒùOí¨†ˆ¦õ™ÊþøO톈¦õ™ÊþøOìH†ˆ¦õµì†ì†ÊþøOë´†ˆ¦õ™ÊþøO놈¦õ§ì†ëßþøO騄OêPˆ¦õ§‹á†ÊþOé´ˆ¦õ™‹OéÀþøôüOèÜöö†üO膈›Ÿì†ÒöO¢€†ˆ›OèìO¢è†‹šøOçpþŽþþO£"Oç\O£þŸOçLƒùOæX†ˆ¦õOç0ì†ìò†ÊþøO±T†ˆ¦õ½†‹úþŸOæ0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöOàŒ†„„‘úþŸOâ0ƒùꆄ‚öꆈþöOᆈ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöOÝ܆„„‰úþŸO߃ùꆄ„þöꆈþöOÞd†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöO܆„„‘úþŸOݨƒùꆄ‚öꆈþöOÜ|†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÚT†„„‘úþŸOÛøƒùꆄ‚öꆈþöOÚ̆ˆ¦õ·ä†‹Ø’ÍþøôüÞöOؤ†„„‘úþŸOÚHƒùꆄ‚öꆈþöOÙ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÖô†„„‘úþŸOؘƒùꆄ‚öꆈþöO×l†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÕD†„„‘úþŸOÖèƒùꆄ‚öꆈþöOÕ¼†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÓ”†„„‘úþŸOÕ8ƒùꆄ‚öꆈþöOÔ †ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÑÔ†„„‘úþŸOÓˆƒùꆄ‚öↈ‰õöOÒL†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÐ$†„„‘úþŸOÑȃùꆄ‚öꆈþöOМ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÎt†„„‘úþŸOЃùꆄ‚öꆈþöOÎ솈¦õ·ä†‹Ø’ÍþøôüÞöOÌĆ„„‘úþŸOÎhƒùꆄ‚öꆈþöOÍ<†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOˆ„„‘úþŸO̸ƒùꆄ‚öꆈþöOËŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÉd†„„‘úþŸO˃ùꆄ‚öꆈþöOÉ܆ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöOÇŒ†„„‘úþŸOÉ0ƒùꆄ‚öꆈþöOȆˆ¦õ·ä†‹Ø’ÍþøôüÞöOÅ܆„„‘úþŸOÇ€ƒùꆄ‚öꆈþöOÆT†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÄ,†„„‘úþŸOÅЃùꆄ‚öꆈþöOĤ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOÀ¼†„„‘úþŸOÄ ƒùꆄ‚öO†ˆ‰úþŸOÃàƒùꆄ‚öꆄ‚öꆈþöOÂŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöOÁ4†ˆ¦õ·ä†‹Ø’ÍþøôüÞöO¿ †„„‘úþŸOÀ°ƒùꆄ‚öꆈþöO¿„†ˆ¦õ·ä†‹Ø’ÍþøôüÞöO»Ä†„„‘úþŸO¿ƒùꆄ‚öO½ †ˆ‰úþŸO¾Àƒùꆄ‚öꆈþöO½”†ˆ¦õ·ä†‹Ø’ÍþøôüÖöO¼<†ˆ¦õ·ä†‹Ø’ÍþøôüÞöOº†„„‘úþŸO»¸ƒùꆄ‚öꆈþöOºŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöO¸d†„„‘úþŸOºƒùꆄ‚öꆈþöO¸Ü†ˆ¦õ·ä†‹Ø’ÍþøôüÞöO¶´†„„‘úþŸO¸Xƒùꆄ‚öꆈþöO·,†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöO²œ†ˆ¦õ·ä†‹Ø’Íþøôü†ìò†ÊþøO®È†ˆ¦õµ‹úþŸO±Hƒùꆄ‚öꆄ‚öꆈþöO¯ô†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøO­à†ˆ¦õO®¸ì†ìò†ÊþøO¬Ø†ˆ¦õO­°‹á†ìò†ÊþøO¬ †ˆ¦õµìò†ÊþøO«\†ˆ¦õ“†ÊþøOªÈ†ˆ¦õ™ÊþøOª†ˆ¦õ§ì†ÊþøO©0†ˆ¦õOªì†ì†ì†ÊþøO¨€†ˆ¦õ§ì†ÊþøO¥p†ˆ¦õ§‹úþŸO¨tƒùꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöO¦€†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøO¤À†ˆ¦õ§ì†ëßþøO£d„O¤ ˆ¦õ§‹á†ÊþO£pˆ¦õ™‹O£|þøôüO¢˜ööƒùO¡†ˆ›O¢Tì†ìò†ìò†ìò†Òöð†ƒùO †ƒˆˆO ðì†ìòò†ì†ØOœ¸†ƒŽúþŸO ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöO †ˆ¦õ·ä†‹Ø’ÍþøôüÜO–,„Oœ¬ƒO–8ƒšøOœ<þŽþþO–VOœ(O–RþŸOœƒùOšì†ˆ¦õO›üì†ìò†ì†ì†ÊþøOš<†ˆ¦õ“†ÊþøO™Œ†ˆ¦õ§ì†ÊþøO˜¤†ˆ¦õ¯ò†ì†ÊþøO—ô†ˆ¦õ§ì†ëßþøO–˜„O—@ˆ¦õ§‹á†ÊþO–¤ˆ¦õ™‹O–°þøôüÚO‚$†ˆ›O–ìO‚Œ†‹šøO•ˆþŽþþO‚ÆO•tO‚ÂþŸO•dƒùO”¨†ˆ¦õ§ì†ÊþøO“膈¦õ§‹á†ÊþøO“†ˆ¦õµì†ì†ÊþøO’l†ˆ¦õ“†ÊþøO‘ †ˆ¦õµìò†ÊþøO¸†ˆ¦õO‘ìòò†ÊþøOІˆ¦õ¯ò†ì†ÊþøOŽô†ˆ¦õµ‹áò†ÊþøO¸†ˆ¦õOŽäì†ìò†ì†ìò†ÊþøO†ˆ¦õ§ì†ÊþøOŒt†ˆ¦õ™ÊþøO‹à†ˆ¦õ™ÊþøO‹0†ˆ¦õ§ì†ÊþøOŠd†ˆ¦õµìò†ÊþøO‰˜†ˆ¦õµìò†ÊþøOˆ¼†ˆ¦õµ‹áò†ÊþøO‡ð†ˆ¦õµì†ì†ÊþøO‡@†ˆ¦õ“†ÊþøO††ˆ¦õ§ì†ÊþøO…Ćˆ¦õµìò†ÊþøO…†ˆ¦õ§ì†ÊþøO„d†ˆ¦õ§ì†ëßþøOƒ„Oƒ°ˆ¦õ§‹á†ÊþOƒˆ¦õ™‹Oƒ þøôüO‚<öO„†ˆ›Ÿì†ÒöO€¬†ˆ›»ì†ì†ì†ÒöOxü†ˆ›O€tò†ì†ì†ì†Oyd†‹šøO˜þŽþþOyžO„OyšþŸOtƒùO~€†ˆ¦õ¯†ì†ì†ÊþøO}(†ˆ¦õO~Hòò†ìò†ìò†ÊþøO{솈¦õO|ðò†ì†ì†ì†ì†ÊþøO{<†ˆ¦õ§ì†ëßþøOyà„Ozˆˆ¦õ§‹á†ÊþOy숦õ™‹OyøþøôüOyöƆ‡ü”„þò„þè÷Owøˆ›‹†óßöOu܆ˆ›OwÜOvD†‹úþŸOwăùꆆöOvÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÉßöð†ƒùOu<†ˆ›ãöð†ƒùOt€†ˆ›Ÿì†ÒöOq,†ƒˆúþŸOttƒùꆄ‚öò†ƒùOrx†ˆ‘úþŸOtƒùꆄ‚öꆆöOrð†ˆ¦õ·ä†‹Ø’ÍþøôüþàöOq¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒOpŒ†‡ü¬„þò„þò„þò„þè÷Oo´†ˆ›»ì†ì†ì†ÒöOo†ˆ›Ÿì†ÒöOj(†ˆ›‹†‹šøOnŒþŽþþOjÊOnxOjÆþŸOnhƒùOm¬†ˆ¦õ“†ÊþøOm†ˆ¦õ™ÊþøOlh†ˆ¦õ§ì†ëßþøOk „Ok´ˆ¦õ§‹á†ÊþOkˆ¦õ™‹Ok$þøôüOj@öOhà†ˆ›Ojìò†ì†ì†ìò†ìØöOhˆ›»ìòò†ÒöOf†ƒˆúþŸOgüƒùꆄ‚öꆄ‚öà†ˆþöOf”†ˆ¦õ·ä†‹Ø’ÍþøôüÒOb€†ˆ›Oeà†Oc<†‹úþŸOeÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆈþöOc¸†ˆ¦õ·ä†‹Ø’Íþøôü†ìòØöOa`†ˆ›ObHòΆ‹ˆ‘OaxöO_¬†ƒˆúþŸOaTƒùꆄ‚öꆈþöO`(†ˆ¦õ·ä†‹Ø’ÍþøôüÒO]ІƒˆúþŸO_ ƒùꆄ‚öꆄ„þöꆈþöO^L†ˆ¦õ·ä†‹Ø’ÍþøôüÒO]0†ˆ›Ÿì†ÒöO\¨†·þò„þò„þæ„üò÷ONt†ƒˆúþŸO\œƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöOT†„„‰úþŸOZôƒùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOT †ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öOP†„„‘úþŸOR¤ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOPˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆆöONð†ˆ¦õ·ä†‹Ø’ÍþøôüÒO;솈›ONdì†ì†O܆ˆ¦õµ‹šøODpþŽþþO?ÆOD\O?ÂþŸODLƒùOC†ˆ¦õ“†ÊþøOBĆˆ¦õµì†ì†ÊþøOB†ˆ¦õ§ì†ÊþøOAd†ˆ¦õ§ì†ëßþøO@„O@°ˆ¦õ§‹á†ÊþO@ˆ¦õ™‹O@ þøôü†ì†ÊþøO>,†ˆ¦õ§ì†ëßþøO<ЄO=xˆ¦õ§‹á†ÊþO<܈¦õ™‹O<èþøôüO<öO6t†ˆ›O;´†O6܆‹šøO;HþŽþþO7O;4O7þŸO;$ƒùO:0†ˆ¦õO;ìò†ì†ÊþøO9d†ˆ¦õ¡†ì†ÊþøO8´†ˆ¦õ§ì†ëßþøO7X„O8ˆ¦õ§‹á†ÊþO7dˆ¦õ™‹O7pþøôüO6ŒöO5Ô†ˆ›Ÿì†ÒöO#T†ˆ›O5Äìò†ìòO#¼†‹šøO4ÜþŽþþO#öO4ÈO#òþŸO4¸ƒùO3à†ˆ¦õµìò†ÊþøO0P†ˆ¦õµ‹úþŸO3Ôƒùꆄ‚öà†„„þöà†„„þöà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöO1|†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøO/0†ˆ¦õO0@ì†ì†ì†ìò†ÊþøO.†ˆ¦õO/ ìò†ì†ìò†ÊþøO,ð†ˆ¦õO.ìò†ìòò†ÊþøO+Іˆ¦õO,àìò†ìòò†ÊþøO*°†ˆ¦õO+˜†ì†ì†ìò†ÊþøO)¬†ˆ¦õ½†ì†ìò†ÊþøO(Ćˆ¦õ¯†ì†ì†ÊþøO'܆ˆ¦õO(´ìòò†ÊþøO',†ˆ¦õ“†ÊþøO&D†ˆ¦õ¯òò†ÊþøO%”†ˆ¦õ§ì†ëßþøO$8„O$àˆ¦õ§‹á†ÊþO$Dˆ¦õ™‹O$PþøôüO#löO"´†ˆ›ŸìØöO"†ˆ›ŸìØöO †ƒúþŸO"ƒùꆄ‚öꆄ‚öꆄ‚öꆆöO Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚOô†ˆ›Oè†ìò†ìò†ì†ÒöO\ƒˆúþŸOèƒùꆄ‚öà†„„þöà†„„þöꆄ‚öà†„„þöà†ˆþöŎˆ¦õ·ä†‹Ø’ÍþøôüÒO°†ˆ›Ÿì†ÒöO„†ƒˆˆOxOˆ†‹úþŸOlƒùꆄ‚öꆄ‚öà†ˆþöO†ˆ¦õ·ä†‹Ø’ÍþøôüO膋úþŸO|ƒùà†ˆ‰õöOd†ˆ¦õ·ä†‹Ø’Íþøôü†ØOt†ƒŽúþŸOxƒùꆄ‚öƆ„„‰ˆ‘ÜöꆈþöO܆ˆ¦õ·ä†‹Ø’ÍþøôüÜOt†ƒˆúþŸOhƒùꆄ‚öò†ƒùOÀ†ˆ‘úþŸOƒùꆄ‚öO†ˆ‰úþŸOЃùꆄ‚öꆄ‚öO`†ˆ‰’úþŸOhƒùꆄ‚öꆄ‚öꆄ‚öꆆöO솈¦õ·ä†‹Ø’ÍþøôüÔöO†ˆ¦õ·ä†‹Ø’ÍþøôüÖöO8†ˆ¦õ·ä†‹Ø’ÍþøôüþàöOð†ˆ¦õ·ä†‹Ø’ÍþøôüÒO ð†ˆ›‘ÒöO 4†ˆ›™ò†Òö؆ˆþöO è†O Úþò„þò„þò„þò„þò„þò„þò„þæ„üò÷O H†ˆ›ŸìØöO 8†ˆ›O 8ìò†ìò†ì†ÒöÞ“õþþøO”†ƒúþŸO àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöO†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöO솈›O8ìOp†‹šøO¤þŽþþOªOO¦þŸO€ƒùO¨†ˆ¦õ¡ò†ÊþøOø†ˆ¦õ“†ÊþøOH†ˆ¦õ§ì†ëßþøOì„O”ˆ¦õ§‹á†ÊþOøˆ¦õ™‹Oþøôü†ÒöNÿœƒˆúþŸOàƒùꆄ‚ö䆄„þö䆄„þö䆄„þö䆈þöO †ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üNþ¨†ˆ›»ìòòØöNøT†ƒŽúþŸNþœƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öNú@†„„‘úþŸNý¼ƒùꆄ„þöꆄ„þöNûˆ†ˆ‘úþŸNýTƒùꆄ‚öꆄ‚öꆆöNü†ˆ¦õ·ä†‹Ø’ÍþøôüÞöNú¸†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öà†ˆþöNø¼†ˆ¦õ·ä†‹Ø’ÍþøôüÜNöˆ†ƒúþŸNøHƒùꆄ‚öꆄ‚öꆆöNöô†ˆ¦õ·ä†‹Ø’ÍþøôüÚNô$†ƒˆúþŸNöl„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöNô †ˆ¦õ·ä†‹Ø’ÍþøôüÒNñ䆃ˆúþŸNôƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöNò`†ˆ¦õ·ä†‹Ø’ÍþøôüÒNðð†ˆ›NñÔìò†ì†ì†ÒöNð†ˆ›»ìò†ì†ÒöNïx†ˆ›Ÿì†ÒöNî †ˆ›»ì†ì†ì†ÒöNíȆˆ›»ì†ì†ì†ÒöNìð†ˆ›»ì†ì†ì†ÒöN솈›»ì†ì†ì†ÒöNë@†ˆ›»ì†ì†ì†Òöö†üNêX†ˆ›»ìò†ì†Òöˆ›‘ÒöNèü†ˆ›»ìò†ì†ÒöNèx†ˆ›‘ÒöNãȆƒúþŸNèlƒùꆄ„þöꆄ„þöà†„„‰õöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöNä4†ˆ¦õ·ä†‹Ø’ÍþøôüÚNâÔ†ˆ›Nã¸ìòòò†ÒöNਆˆ›N✆NᆋúþŸNâƒùꆆöNጆˆ¦õ·ä†‹Ø’ÍþøôüNàÀöNÞ@†ˆ›™†‹úþŸNà€ƒùꆄ‚öà†ˆþöNß@†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöNÝ †ˆ›Ÿì†ÒöNÜȆˆ›»ì†ì†ì†Òö†ƒŒü¤þò„þò„þçNÕ̆ˆ›‹†‹šøNÛÈþŽþþNÖnNÛ´NÖjþŸNÛ¤ƒùNÚ膈¦õ“†ÊþøNÚ†ˆ¦õµì†ì†ÊþøNÙP†ˆ¦õ¡†ì†ÊþøNؼ†ˆ¦õ™ÊþøNØ †ˆ¦õ§ì†ëßþøNÖ°„N×Xˆ¦õ§‹á†ÊþNÖ¼ˆ¦õ™‹NÖÈþøôüNÕäöNÓd†NÕ¾þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þNÓv„üNÔ6„þò„þò„þò„þò„þò„þò„þè÷ð†ƒùNÒ†ˆ›NÓ8ìò†ì†ì†ìò†ìØöˆ›ãöNÏȆƒˆúþŸNÑpƒùꆄ„þöꆈþöNÐD†ˆ¦õ·ä†‹Ø’ÍþøôüÒNÏ †ˆ›­ì†ìØöN̤†ƒŽúþŸNσùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöNÍ †ˆ¦õ·ä†‹Ø’ÍþøôüÜNÌ †ˆ›‘ÒöNÄ䆈›‘‹šøNË´þŽþþNņNË NÅ‚þŸN˃ùNÊÔ†ˆ¦õ§ì†ÊþøNÊ$†ˆ¦õ§ì†ÊþøNɆˆ¦õ™ÊþøNÈü†ˆ¦õ™ÊþøNÈh†ˆ¦õ™ÊþøNÇÔ†ˆ¦õ™ÊþøNÇ$†ˆ¦õ§ì†ëßþøNÅÈ„NÆpˆ¦õ§‹á†ÊþNÅÔˆ¦õ™‹NÅàþøôüNÄüöN¾<†ƒˆšøNÄxþŽþþN¾vNÄdN¾rþŸNÄTƒùNÃD†ˆ¦õNÄ8ì†ìò†ì†ÊþøNÂ\†ˆ¦õNÃ4ì†ìò†ÊþøNÁȆˆ¦õ™ÊþøNÀĆˆ¦õNÁ¸ì†ìò†ì†ÊþøNÀ†ˆ¦õ§ì†ëßþøN¾¸„N¿`ˆ¦õ§‹á†ÊþN¾Äˆ¦õ™‹N¾ÐþøôüÒN½d†ˆ›»ìòò†ÒöñNº†ƒˆúþŸN½,ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöNº„†ˆ¦õ·ä†‹Ø’ÍþøôüÒN¹†ˆ›N¹øìòòòØöN¸ †ˆ›µ†ìòòùßöN·H†ˆ›»ì†ì†ì†ÒöNµ”†ƒˆúþŸN·<ƒùꆄ„þöꆆöN¶†ˆ¦õ·ä†‹Ø’ÍþøôüÒN³¸†ƒˆúþŸNµˆƒùꆄ„þöꆄ„þöꆈþöN´4†ˆ¦õ·ä†‹Ø’ÍþøôüÒN²Ä†ˆ›N³¨ì†ì†ìò†ÒöN±ì†ˆ›»ì†ì†ì†ÒöN±0†ˆ›­ì†ì†ÒöNª†ˆ›‹†‹šøN°¨þŽþþNªºN°”Nª¶þŸN°„ƒùN¯È†ˆ¦õ§ì†ÊþøN¯†ˆ¦õ§ì†ÊþøN®h†ˆ¦õ§ì†ÊþøN­¸†ˆ¦õ§ì†ÊþøN­†ˆ¦õ“†ÊþøN¬X†ˆ¦õ§ì†ëßþøNªü„N«¤ˆ¦õ§‹á†ÊþN«ˆ¦õ™‹N«þøôüNª0öN©@†ˆ›»ì†ì†ì†ÒöñN¨d†ˆ›Ÿ‹á†ÒöN§Ä†ˆ›Ÿìùßöö†üN¦Ü†ˆ›»ì†ì†ì†ÒöN¥°†ˆ›N¦Ìì†ì†ì†ìòò†ÒöN¤ †ƒúþŸN¥¤ƒùꆄ‚öꆈþöN¤x†ˆ¦õ·ä†‹Ø’ÍþøôüÚN£\ˆ›™†ìØöN¢”†ˆ›™†ì†ÒöN¢ †‡ü „þò„þò„þè÷ð†ƒùö†üN¡†ˆ›§òò†ÒöN–\†ƒúþŸN üƒùꆄ‚öNœH†„„‘úþŸN ¼ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöNœÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöN–Ȇˆ¦õ·ä†‹Ø’ÍþøôüÚN”l†ƒŽúþŸN–Pƒùꆄ‚öꆄ‚öꆄ‚öꆆöN”Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÜN“°†ˆ›™†ì†óßö؆ˆþöNŒØ„N“XƒNŒäƒšøN’èþŽþþNN’ÔNŒþþŸN’ăùN‘솈¦õµì†ì†ÊþøN‘ †ˆ¦õµì†ì†ÊþøN†ˆ¦õN‘ì†ì†ìòò†ÊþøNP†ˆ¦õ§ì†ÊþøNŽ †ˆ¦õ§ì†ëßþøND„N숦õ§‹á†ÊþNPˆ¦õ™‹N\þøôüÚð†ƒùNŒ8†ˆ›‘Òöð†ƒù؆ˆþöNp\†ˆ›N‹Àìò†NpĆ‹šøN‹þŽþþNpþNv|øNŠ þŽþþNvšNŠŒNv–þŸNŠ|ƒùN~$†ˆ¦õNŠ8N…D†‹šøN‰ÌþŽþþN…~N‰¸N…zþŸN‰¨ƒùNˆÐ†ˆ¦õµì†ì†ÊþøN‡Ì†ˆ¦õNˆÀìò†ìò†ÊþøN‡†ˆ¦õ§ì†ëßþøN…À„N†hˆ¦õ§‹á†ÊþN…̈¦õ™‹N…ØþøôüN~Ô†‹šøN„ØþŽþþNN„ÄN þŸN„´ƒùNƒø†ˆ¦õ§ì†ÊþøNƒ,†ˆ¦õµìò†ÊþøN‚D†ˆ¦õ¯òò†ÊþøN\†ˆ¦õN‚4ìòò†ÊþøN€¬†ˆ¦õ§ì†ëßþøNP„Nøˆ¦õ§‹á†ÊþN\ˆ¦õ™‹Nhþøôü†ì†ÊþøN{Œ†ˆ¦õ§‹úþŸN~ƒùꆄ‚öꆄ‚öꆄ„þöꆆöN|œ†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøNzÀ†ˆ¦õ¡ò†ÊþøNz†ˆ¦õ“†ÊþøNy|†ˆ¦õ™ÊþøNx膈¦õ™ÊþøNx8†ˆ¦õ§ì†ëßþøNvÜ„Nw„ˆ¦õ§‹á†ÊþNv舦õ™‹NvôþøôüNpúþŸNvlƒùNux†ˆ¦õNvPìò†ì†ÊþøNt†ˆ¦õNuhìò†ì†ÊþøNsà†ˆ¦õ“†ÊþøNsL†ˆ¦õ™ÊþøNrœ†ˆ¦õ§ì†ëßþøNq@„Nq舦õ§‹á†ÊþNqLˆ¦õ™‹NqXþøôüNptöNl †ƒˆúþŸNpPƒùꆄ„þöNn\†„„‰úþŸNpƒùꆄ„þöꆆöNn䆈¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöNlœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒùNj¼†ˆ›Nkôìò†ì†ìòòò†ÒöNe䆃úþŸNj°ƒùꆄ„þöꆄ„þöꆄ„þöNgp†„„‰ˆNiô†ì†ìNgà†‹úþŸNi°ƒùꆄ‚öꆄ„þöꆈþöNh\†ˆ¦õ·ä†‹Ø’Íþøôü†Üöꆄ‚öꆈþöNfP†ˆ¦õ·ä†‹Ø’ÍþøôüÚNd@†ƒúþŸNe؃ùꆄ‚öꆈþöNd¬†ˆ¦õ·ä†‹Ø’ÍþøôüÚNbx†ƒŽúþŸNd4ƒùꆄ‚öꆄ‚öꆆöNbà†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùʆˆþöNaHˆ›™†ì†ÒöN^À†ƒŽúþŸNa0ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöà†ˆþöN_(†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùð†üN]̆ˆ›Ÿì†ÒöN],†ˆ›Ÿì†ÒöN\p†ˆ›­ìò†ÒöƆ‡ü”„þò„þè÷NZL†ƒˆúþŸN[ôƒùꆄ„þöꆈþöNZȆˆ¦õ·ä†‹Ø’ÍþøôüÒNY¸ˆ›ŸìØöNV†ˆ›NYœä†‹á†NVà†‹úþŸNY<ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öà†ˆþöNW\†ˆ¦õ·ä†‹Ø’ÍþøôüNVZü°þò„þò„þò„þÉöNQx†ƒŽúþŸNUôƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öNR°†ˆ‰ˆúþŸNTăùꆄ„þöꆄ„þöꆄ„þöꆈþöNSH†ˆ¦õ·ä†‹Ø’ÍþøôüÎöNQà†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üNP†ˆ›»ì†ì†ì†ÒöNMP†NP‚þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þNMb„üNNR„þò„þò„þò„þò„þò„þò„þò„þò„þè÷؆ˆþöNLH†ˆ›™†ì†ÒöNJ´ƒŽúþŸNL<ƒùꆄ‚öꆆöNK†ˆ¦õ·ä†‹Ø’ÍþøôüÜNEX†ƒúþŸNJœƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöNEĆˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùND€†ˆ›­ìò†ÒöʆˆŸßöð†ƒùNCx†ˆ›‘óßöN@ø†ƒúþŸNClƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöNAd†ˆ¦õ·ä†‹Ø’ÍþøôüÚN:\†ƒˆúþŸN@ìƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöN=|†„„‘úþŸN?„„‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöN=ô†ˆ¦õ·ä†‹Ø’ÍþøôüþàöN;¨†ˆ‘úþŸN=`„‚öꆄ‚öà†ˆþöN< †ˆ¦õ·ä†‹Ø’ÍþøôüþàöN:؆ˆ¦õ·ä†‹Ø’ÍþøôüÒN80†ƒˆúþŸN:Pƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöN8¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñN3ø†ƒˆšøN7˜þŽþþN42N7„N4.þŸN7tƒùN6€†ˆ¦õN7Xì†ìò†ÊþøN5Іˆ¦õ§ì†ëßþøN4t„N5ˆ¦õ§‹á†ÊþN4€ˆ¦õ™‹N4ŒþøôüÒN3 †ˆ›»ì†ì†ì†ÒöNð†ˆ›N3NX†‹šøN2˜þŽþþN’N2„NŽþŸN2tƒùN1Ô†ˆ¦õ™ÊþøN0솈¦õN1Äìòò†ÊþøN!¸†ˆ¦õ§‹ˆšøN0€þŽþþN"–N,pøN0þŽþþN,ŽN/üN,ŠþŸN/ìƒùN.܆ˆ¦õN/Ðì†ì†ì†ì†ÊþøN.,†ˆ¦õ§ì†ëßþøN,ЄN-xˆ¦õ§‹á†ÊþN,܈¦õ™‹N,èþøôüN"’þŸN,`ƒùN%”†ˆ¦õµ‹ˆšøN+èþŽþþN&ŽN+ÔN&ŠþŸN+ăùN*Іˆ¦õN+¨ì†ìò†ÊþøN* †ˆ¦õ“†ÊþøN)Œ†ˆ¦õ™ÊþøN(܆ˆ¦õ§ì†ÊþøN(,†ˆ¦õ§ì†ëßþøN&ЄN'xˆ¦õ§‹á†ÊþN&܈¦õ™‹N&èþøôüN&(ò†ÊþøN$䆈¦õ“†ÊþøN$4†ˆ¦õ§ì†ëßþøN"Ø„N#€ˆ¦õ§‹á†ÊþN"䈦õ™‹N"ðþøôüN"0†ÊþøN!$†ˆ¦õ™ÊþøN t†ˆ¦õ“†ÊþøNà†ˆ¦õ™ÊþøN0†ˆ¦õ§ì†ëßþøNÔ„N|ˆ¦õ§‹á†ÊþNàˆ¦õ™‹NìþøôüNöN¸†ˆ›NàN †‹šøNhþŽþþNZNTNVþŸNDƒùNˆ†ˆ¦õ“†ÊþøN؆ˆ¦õ§ì†ÊþøN †ˆ¦õµì†ì†ÊþøN\†ˆ¦õ§ì†ÊþøN¬†ˆ¦õ§ì†ÊþøNü†ˆ¦õ§ì†ÊþøN0†ˆ¦õµìò†ÊþøNœ†ˆ¦õ™ÊþøN솈¦õ§ì†ÊþøNX†ˆ¦õ™ÊþøN¨†ˆ¦õ§ì†ÊþøNø†ˆ¦õ§ì†ëßþøNœ„NDˆ¦õ§‹á†ÊþN¨ˆ¦õ™‹N´þøôüNÐöNü†ˆ›­ìò†ÒöNô†ƒúþŸNðƒùꆄ„þöN0†ˆ‰ˆŸìâöN`†ˆ¦õ·ä†‹Ø’ÍþøôüÚöƒùN p†ƒŽúþŸÑùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöN ؆ˆ¦õ·ä†‹Ø’ÍþøôüÜN 솈›‘ÒöN ø†ˆ›‘‹úþŸN àƒùꆆöN ܆ˆ¦õ·ä†‹Ø’ÍþøôüN öN†ƒˆúþŸN ìƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öà†ˆþöN”†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üÀ†ƒŽü¤þò„þò„þåΆƒŒü˜þò„þç脌ƒóƒùN|†ˆ›‘ÒöN4†ˆ›ND†ìò†ìò†ì†ì†Òöñ̆ƒŽü˜þò„þåNx†ˆ›Nl†ìò†ìò†ì†ÒöN¼†ˆ›™†ì†ÒöMý¸†ƒˆúþŸN°ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†„„þöMÿ†ˆ‰’úþŸN¼ƒùꆄ‚öꆆöMÿ†ˆ¦õ·ä†‹Ø’ÍþøôüÔöMþ4†ˆ¦õ·ä†‹Ø’ÍþøôüÒMû´†ƒŽúþŸMý¬ƒùꆄ„þöꆄ„þöꆄ‚öà†ˆþöMü†ˆ¦õ·ä†‹Ø’ÍþøôüÜMúÀ†ˆ›Mû¤ìòòò†Òöð†üMõ¤†ƒúþŸMú˜ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöMö†ˆ¦õ·ä†‹Ø’ÍþøôüÚMô膈›­ì†ì†ÒöMò†ƒúþŸMô܃ùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöà†ˆþöMòü†ˆ¦õ·ä†‹Ø’ÍþøôüÚMð†ƒˆúþŸMò„ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMð†ˆ¦õ·ä†‹Ø’ÍþøôüÒMè°†ƒúþŸMðƒùꆄ‚öꆄ‚öꆄ‚öMꆄ„‰úþŸMïxƒùꆄ‚öM뼆„„‘úþŸMï8ƒùꆄ‚öMíT†„„‘úþŸMîøƒùꆄ„þöꆈþöMí̆ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆈþöMì4†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆈþöM꜆ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöM醈¦õ·ä†‹Ø’ÍþøôüÚM夆ˆ›§†‹úþŸMèx„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöMæÀ†ˆ¦õ·ä†‹Ø’Íþøôü†ìØö脌ƒóƒùM䬆ˆ›­‹áò†Òöò†ƒùM㼆ˆ›»ì†ì†ì†ÒöMâ$ƒúþŸMã°ƒùꆄ„þöꆈþöM℆ˆ¦õ·ä†‹Ø’ÍþøôüÚMá$†ˆ›µ†ì†ìò†ÒöMÝø†ƒúþŸMáƒùMß\†„„‘úþŸMáƒùꆄ„þöꆆöMßÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöMÞd†ˆ¦õ·ä†‹Ø’ÍþøôüÚMØH„MÝìƒMØTƒšøMÝ|þŽþþMØrMÝhMØnþŸMÝXƒùMÚÀ†ˆ¦õµ‹úþŸMÝ@ƒùꆄ„þöꆄ„þöꆆöMÛ솈¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøMÚ†ˆ¦õ§ì†ëßþøMØ´„MÙ\ˆ¦õ§‹á†ÊþMØÀˆ¦õ™‹MØÌþøôüÚM×´†ˆ›‘‹ÇöMÖT†Mצþò„þMÖf„üM×n„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷MÕ´†ˆ›Ÿì†ÒöMÕ ˆ›‹†ÒöMІƒúþŸMÕƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMÐl†ˆ¦õ·ä†‹Ø’ÍþøôüÚMÍ膃ŽúþŸMÏôƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMÎP†ˆ¦õ·ä†‹Ø’ÍþøôüÜMÍd†ˆ›‘Òöð†ƒùMË †ˆ›­‹ˆúþŸMÍ<ƒùꆆöMÌ8†ˆ¦õ·ä†‹Ø’ÍþøôüMˆì†óßöMÊ`MÊþþò„þò„þ΄ü”„þò„þè÷MÉІˆ›‘ÒöMÈø†ˆ›»ì†ì†ìØöMÄì„MÈìƒMÄøƒšøMÈ|þŽþþMÅMÈhMÅþŸMÈXƒùMÇd†ˆ¦õMÈ<ìò†ì†ÊþøMÆ´†ˆ¦õ§ì†ëßþøMÅX„Mƈ¦õ§‹á†ÊþMÅdˆ¦õ™‹MÅpþøôüÚØ†ˆþöMÃȆˆ›»ì†ì†ì†ÒöM¸è†ˆ›MøM¹P†‹šøMÃ@þŽþþM¹ŠMÃ,M¹†þŸMÃùM†ˆ¦õMÂà‹ˆÙ†ì†ì†ÊþøMÁX†ˆ¦õ§ì†ÊþøMÀŒ†ˆ¦õ¡ò†ÊþøM¿Ü†ˆ¦õ§ì†ÊþøM¿,†ˆ¦õ§ì†ÊþøM¾|†ˆ¦õ§ì†ÊþøM½Ì†ˆ¦õ“†ÊþøM½†ˆ¦õ“†ÊþøM¼l†ˆ¦õ“†ÊþøM»Ø†ˆ¦õ™ÊþøM»(†ˆ¦õ§ì†ëßþøM¹Ì„Mºtˆ¦õ§‹á†ÊþM¹Øˆ¦õ™‹M¹äþøôüM¹öM¸H†ˆ›‹†ÒöM·H†M¸:þM·Z„üM¸„þò„þò„þò„þò„þò„þò„þè÷M¶Ä†ˆ›‘ÒöM´ƒúþŸM¶¸ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöM´t†ˆ¦õ·ä†‹Ø’ÍþøôüÚM³„†ˆ›‘ÒöM­ð†ƒŽúþŸM³xƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öM¯(†ˆ‘úþŸM²Àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöM¯ †ˆ¦õ·ä†‹Ø’ÍþøôüÞöM®X†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùM¨T†ƒˆúþŸM­¸„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öMª†„„‰ˆ»ì†ì†ìâöꆄ„þöꆄ„þöꆆöM¨Ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒM§|†ˆ›»ì†ì†ì†ÒöM¦¤†ˆ›»ì†ì†ì†ÒöM¥Ì†ˆ›»ì†ì†ì†ÒöM¤¼†ˆ›M¥¼ìòò†ì†ì†ÒöMŸ´†ˆ›M¤¬M †‹šøM¤4þŽþþM VM¤ M RþŸM¤ƒùM£T†ˆ¦õ§ì†ÊþøM¢¤†ˆ¦õ“†ÊþøM¡ô†ˆ¦õ§ì†ëßþøM ˜„M¡@ˆ¦õ§‹á†ÊþM ¤ˆ¦õ™‹M °þøôüMŸÌöMŸˆ›™†ì†ÒöMœà†ƒˆúþŸMžìƒùà†„„þöà†„„þöà†ˆþöM\†ˆ¦õ·ä†‹Ø’ÍþøôüÒM›˜†ˆ›MœÐì†ì†ì†ì†ì†ì†ìØöM™,†ƒúþŸM›Œƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöM™˜†ˆ¦õ·ä†‹Ø’ÍþøôüÚM—x†ƒˆúþŸM™ ƒùꆄ‚öꆈþöM—ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒM– †ˆ›»ìò†ì†ÒöM”膃úþŸM–”ƒùꆄ‚öà†ˆþöM•T†ˆ¦õ·ä†‹Ø’ÍþøôüÚM<†ˆ›M”ØM¤†‹šøM”`þŽþþMÞM”LMÚþŸM”<ƒùM“d†ˆ¦õµì†ì†ÊþøM’´†ˆ¦õ“†ÊþøM’†ˆ¦õ§ì†ÊþøM‘T†ˆ¦õ§ì†ÊþøMÀ†ˆ¦õ™ÊþøM,†ˆ¦õ™ÊþøM|†ˆ¦õ§ì†ëßþøMŽ „MŽÈˆ¦õ§‹á†ÊþMŽ,ˆ¦õ™‹MŽ8þøôüMTöMŒd†ˆ›»ì†ì†ì†ÒöM‹p†ˆ›MŒTìò†ìò†ÒöüüM‰D†ƒúþŸM‹Tƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöM‰°†ˆ¦õ·ä†‹Ø’ÍþøôüÚM„l†ƒˆúþŸM‰8ƒùꆄ‚öM…¸†ˆ‰’úþŸMˆøƒùM‡<†„„‘úþŸMˆàƒùꆄ‚öꆆöM‡´†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöM†D†ˆ¦õ·ä†‹Ø’ÍþøôüÔöM„膈¦õ·ä†‹Ø’ÍþøôüÒM‚`†ƒúþŸM„D„„þö䆄„þö䆄„þö䆈þöM‚̆ˆ¦õ·ä†‹Ø’ÍþøôüÚMˆ†ˆ›Ÿ‹úþŸM‚Tƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöM€ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöM~̆ˆ›­ìò†óßöð†ƒù؆ˆþöM}Ćˆ›‹†ÒöMuH†ˆ›‹†‹šøM}<þŽþþMuêM}(MuæþŸM}ƒùMz<†ˆ¦õM|üMz솋úþŸM|äƒùꆄ‚öꆄ„þöꆄ‚öꆆöM{h†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøMyŒ†ˆ¦õ“†ÊþøMxø†ˆ¦õ™ÊþøMx8†ˆ¦õ§‹á†ÊþøMwˆ†ˆ¦õ§ì†ëßþøMv,„MvÔˆ¦õ§‹á†ÊþMv8ˆ¦õ™‹MvDþøôüMu`öMt¨†ˆ›Ÿì†ÒöMrô†ƒˆúþŸMtœƒùꆄ„þöꆈþöMsp†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒù膃ˆñMq4†ƒŽúþŸMr ƒùꆈþöMqœ†ˆ¦õ·ä†‹Ø’ÍþøôüÜMo@†ˆ›‘‹úþŸMq(ƒùꆆöMp$†ˆ¦õ·ä†‹Ø’ÍþøôüMoXöMk†ƒúþŸMo4ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öMlð†„„‰ˆ‘‹Ñöꆄ‚öꆄ‚öà†„„þöꆈþöMkl†ˆ¦õ·ä†‹Ø’ÍþøôüÚMe€†ˆ›‘‹šøMj”þŽþþMf"Mj€MfþŸMjpƒùMi˜†ˆ¦õ¡ò†ÊþøMi†ˆ¦õ™ÊþøMhp†ˆ¦õ™ÊþøMgÀ†ˆ¦õ§ì†ëßþøMfd„Mg ˆ¦õ§‹á†ÊþMfpˆ¦õ™‹Mf|þøôüMe˜ö؆ˆþöMdx†ˆ›­ìò†Òö脌ƒóƒùMct†ˆ›»ì†ì†ì†ÒöMT̆ˆ›Mcdì†ì†ì†MU4†‹šøMb˜þŽþþMUnMb„MUjþŸMbtƒùM_Œ†ˆ¦õMbXM`X†“úþŸMb@ƒùꆄ‚öꆄ‚öꆄ‚öꆆöM`Ćˆ¦õ·ä†‹Ø’Íþøôüʆì†ì†ÊþøMW¼†ˆ¦õMX”‹ˆšøM_ þŽþþMXÒM_ MXÎþŸM^üƒùM]`†ˆ¦õM^¸†ì†ìò†ìò†ìòò†ÊþøM[Іˆ¦õM](†ì†ìò†ìò†ìòò†ÊþøM[ †ˆ¦õ“†ÊþøMZp†ˆ¦õ§ì†ëßþøMY„MY¼ˆ¦õ§‹á†ÊþMY ˆ¦õ™‹MY,þøôüMXl†ì†ì†ÊþøMW †ˆ¦õ§ì†ëßþøMU°„MVXˆ¦õ§‹á†ÊþMU¼ˆ¦õ™‹MUÈþøôüMTäöMR †ˆ›MT”†MS†‹úþŸMTˆƒùꆆöMS„†ˆ¦õ·ä†‹Ø’ÍþøôüMR¸öMLÄ“®MNôüôøüôøüøMQPþ––’êMNtôøüôøüøMPþ––’êMMüôøMNü¢þ––’êMMÌMM@¸MLÔ›ãöM?D†ƒúþŸML¬ƒùꆄ‚öMGø†„„‘úþŸMLlƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMHp†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öMDà†„„‘úþŸMGăùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMEX†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöM?°†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùM;P†ƒúþŸM? ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öM<Œ†ˆ‰úþŸM>hƒùꆄ„þöꆄ‚öꆈþöM=†ˆ¦õ·ä†‹Ø’ÍþøôüÖöM;¼†ˆ¦õ·ä†‹Ø’ÍþøôüÚM: †ˆ›Ÿ‹áØöö†üM9¸†ˆ›»ì†ì†ì†ÒöMô†ˆ›‹†‹šøM90þŽþþM–M$ øM8ÀþŽþþM$¾M8¬M$ºþŸM8œƒùM7à†ˆ¦õ§ì†ÊþøM70†ˆ¦õ“†ÊþøM6€†ˆ¦õ§ì†ÊþøM5Іˆ¦õ“†ÊþøM5†ˆ¦õ¡ò†ÊþøM48†ˆ¦õµì†ì†ÊþøM3l†ˆ¦õµìò†ÊþøM2 †ˆ¦õ¡ò†ÊþøM1Ô†ˆ¦õ¡ò†ÊþøM1$†ˆ¦õ“†ÊþøM0t†ˆ¦õ§ì†ÊþøM/¨†ˆ¦õµìò†ÊþøM.À†ˆ¦õ¯†ìò†ÊþøM-ô†ˆ¦õµìò†ÊþøM-D†ˆ¦õ§ì†ÊþøM,\†ˆ¦õM-4ì†ìò†ÊþøM+†ˆ¦õµìò†ÊþøM*Ćˆ¦õµìò†ÊþøM)ø†ˆ¦õ¡ò†ÊþøM),†ˆ¦õ¡ò†ÊþøM(`†ˆ¦õµìò†ÊþøM' †ˆ¦õ§‹á†ÊþøM' †ˆ¦õ™ÊþøM&\†ˆ¦õ§ì†ëßþøM%„M%¨ˆ¦õ§‹á†ÊþM% ˆ¦õ™‹M%þøôüM’þŸM$ƒùM#Ô†ˆ¦õ“†ÊþøM#†ˆ¦õµìò†ÊþøM"X†ˆ¦õ“†ÊþøM!¨†ˆ¦õ“†ÊþøM ø†ˆ¦õ“†ÊþøM ,†ˆ¦õµì†ì†ÊþøMD†ˆ¦õM ì†ìò†ÊþøM@†ˆ¦õM4ì†ìòò†ÊþøMX†ˆ¦õM0ì†ìò†ÊþøMp†ˆ¦õMHì†ìò†ÊþøMÀ†ˆ¦õ“†ÊþøMô†ˆ¦õ¡ò†ÊþøM(†ˆ¦õ¡ò†ÊþøM”†ˆ¦õ™ÊþøM䆈¦õ§ì†ÊþøM4†ˆ¦õ§ì†ëßþøMØ„M€ˆ¦õ§‹á†ÊþM䈦õ™‹MðþøôüM öM†ˆ›»ìò†ì†ÒöM4†MþMF„üMî„þò„þò„þò„þò„þò„þè÷Mx†ˆ›­ìò†ÒöÞ“õþþøM †ƒˆúþŸM ƒùꆆöM†ˆ¦õ·ä†‹Ø’ÍþøôüÒMX†ˆ›Mìò†ì†ìòòò†ÒöʆˆþöM†ˆ›‹†‹úþŸMȃùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöM ¬†„„üMnþò„þò„þò„þò„þò„þéöM †„„‘úþŸM „„‘úþŸM „„þöꆈþöM Œ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöM†„„‘úþŸM ø„„þöꆄ‚öꆄ‚öM d†ˆ‰úþŸM ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöM 솈¦õ·ä†‹Ø’ÍþøôüÖöM”†ˆ¦õ·ä†‹Ø’ÍþøôüþàöM„†„„‘úþŸM„„þöꆆöMü†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ„þöMT†ˆ‰ˆ­‘ü¤þò„þò„þÕ†ì†ÜöM„†ˆ¦õ·ä†‹Ø’Íþøôüþàöà†ˆþöM†ˆ¦õ·ä†‹Ø’ÍþøôüM4öLÿˆ†ƒúþŸMƒùꆄ‚öꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öꆈþöLÿô†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùLþ”†ˆ›»ì†ì†ì†ÒöLõ†ˆ›Lþ„Lõl†‹šøLþ þŽþþLõ¦LýøLõ¢þŸLýèƒùLü؆ˆ¦õLýÌìò†ì†ì†ÊþøLûÔ†ˆ¦õLüÈìò†ì†ì†ÊþøLû@†ˆ¦õ™ÊþøLú†ˆ¦õ§ì†ÊþøLù¨†ˆ¦õ¯†ì†ì†ÊþøLøÀ†ˆ¦õ¯†ì†ì†ÊþøL÷ô†ˆ¦õ¡†ì†ÊþøL÷D†ˆ¦õ§ì†ëßþøLõè„Löˆ¦õ§‹á†ÊþLõôˆ¦õ™‹LöþøôüLõöLó8†ƒúþŸLôøƒùꆄ‚öꆄ‚öꆆöL󤆈¦õ·ä†‹Ø’ÍþøôüÚLÆt„Ló,ƒLÆ€ƒšøLò¼þŽþþLÆžLò¨LÆšþŸLò˜ƒùLñø†ˆ¦õ™ÊþøLñd†ˆ¦õ™ÊþøLðІˆ¦õ™ÊþøLÎP†ˆ¦õLí@‹úþŸLðăùꆄ‚öꆄ‚öꆄ„þöL„„‰úþŸLð4ƒùꆆöLï0†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöLí°†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ä†‹LÎ䆋ˆšøLìdþŽþþLÏ.LÛTøLëôþŽþþLÛrLëàLÛnþŸLëЃùL놈¦õ§ì†ÊþøLêd†ˆ¦õ§ì†ÊþøLé´†ˆ¦õ§ì†ÊþøLÝÀ†ˆ¦õLé¤LÞT†‹šøLé,þŽþþLÞŽLä°øLè¼þŽþþLäÎLè¨LäÊþŸL蘃ùLç̆ˆ¦õ§‹á†ÊþøL熈¦õ“†ÊþøLæl†ˆ¦õ§ì†ëßþøLå„L师¦õ§‹á†ÊþL刦õ™‹Lå(þøôüLÞŠþŸLä ƒùLã䆈¦õ§ì†ÊþøLã4†ˆ¦õ“†ÊþøL℆ˆ¦õ“†ÊþøLጆˆ¦õ¯†‹á†ì†ÊþøLà܆ˆ¦õ“†ÊþøLà,†ˆ¦õ§ì†ëßþøLÞЄLßxˆ¦õ§‹á†ÊþLÞ܈¦õ™‹LÞèþøôü†ÊþøL݆ˆ¦õ§ì†ëßþøLÛ´„LÜ\ˆ¦õ§‹á†ÊþLÛÀˆ¦õ™‹LÛÌþøôüLÏ*þŸLÛDƒùLØè†ˆ¦õµ‹úþŸLÛ,ƒùà†ˆþöLÚ†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÊþøL؆ˆ¦õLØØì†ì†ì†ÊþøLÕà†ˆ¦õ§‹úþŸL×ôƒùꆆöLÖð†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøLÕ0†ˆ¦õ§ì†ÊþøLÔ€†ˆ¦õ“†ÊþøLÑ|†ˆ¦õ¡†‹úþŸLÔXƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöLÒŒ†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøLÐ̆ˆ¦õ§ì†ëßþøLÏp„LЈ¦õ§‹á†ÊþLÏ|ˆ¦õ™‹LψþøôüLÎȆÊþøL̆ˆ¦õ§“úþŸLÎDƒùꆄ‚öꆆöL͆ˆ¦õ·ä†‹Ø’ÍþøôüʆÊþøLËh†ˆ¦õ“†ÊþøLÊÔ†ˆ¦õ™ÊþøLÊ@†ˆ¦õ™ÊþøLɬ†ˆ¦õ™ÊþøLÈ솈¦õ§‹á†ÊþøLÈ<†ˆ¦õ§ì†ëßþøLÆà„LLjˆ¦õ§‹á†ÊþLÆìˆ¦õ™‹LÆøþøôüÚLÅœ†ˆ›»ì†ì†ì†ÒöLÃàƒŽúþŸLŃùꆄ„þöꆄ‚öꆆöLÄ<†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùLÀŒ†ƒˆúþŸLðƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöLÁ†ˆ¦õ·ä†‹Ø’ÍþøôüÒL¿†ƒˆúþŸLÀ€ƒùꆆöL¿|†ˆ¦õ·ä†‹Ø’ÍþøôüÒL»ä†ƒˆúþŸL¾ôƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþöL¼`†ˆ¦õ·ä†‹Ø’ÍþøôüÒL»H†ƒˆˆ™òÞL¸†ƒŽúþŸL»<ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþöL¸€†ˆ¦õ·ä†‹Ø’ÍþøôüÜL·x†L¸ þò„þò„þò„þæ„üò÷L¶œ†ƒŽüL·jþò„þò„þò„þò„þò„þò„þåL´è†ƒˆúþŸL¶ƒùꆄ„þöꆆöLµd†ˆ¦õ·ä†‹Ø’ÍþøôüÒL³ †ƒˆúþŸL´Üƒùꆄ„þöꆄ„þöꆈþöL³ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒLŸD†ˆ›L²üìòLŸ¬†‹šøL²LþŽþþLŸæL²8LŸâþŸL²(ƒùL±l†ˆ¦õ§ì†ÊþøL°¼†ˆ¦õ§ì†ÊþøL¯Ô†ˆ¦õL°¬ì†ìò†ÊþøL¯†ˆ¦õµìò†ÊþøL®<†ˆ¦õµì†ì†ÊþøL­T†ˆ¦õL®,ì†ìò†ÊþøL¬P†ˆ¦õL­Dì†ìòò†ÊþøL«h†ˆ¦õL¬@ì†ìò†ÊþøLª€†ˆ¦õL«Xì†ìò†ÊþøL©`†ˆ¦õLªpì†ì†ìòò†ÊþøL¨°†ˆ¦õ§ì†ÊþøL§ä†ˆ¦õµìò†ÊþøL¦ü†ˆ¦õL§Ôìòò†ÊþøL¦0†ˆ¦õµìò†ÊþøL¢4†ˆ¦õµ‹úþŸL¦$ƒùꆄ‚öL¤0†ˆ‰úþŸL¥äƒùꆄ„þöꆈþöL¤¸†ˆ¦õ·ä†‹Ø’ÍþøôüÖöL£`†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøL¡„†ˆ¦õ§ì†ëßþøL („L Ðˆ¦õ§‹á†ÊþL 4ˆ¦õ™‹L @þøôüLŸ\öL›T†ˆ›Ÿ‹úþŸLŸ8ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöLœT†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöL˜€ƒˆúþŸL›Hƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöL˜ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒL†ƒˆúþŸL˜hƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöL€†ˆ¦õ·ä†‹Ø’ÍþøôüÒL†ƒŽúþŸLŽøƒùꆄ„þöꆄ‚öꆄ‚öꆆöL|†ˆ¦õ·ä†‹Ø’ÍþøôüÜL‹L†ƒŽúþŸLƒùꆄ‚öꆄ‚öꆆöL‹´†ˆ¦õ·ä†‹Ø’ÍþøôüÜL‰X†ˆ›L‹<L‰²ŠúþŸL‹$ƒùꆆöLŠ †ˆ¦õ·ä†‹Ø’ÍþøôüL‰pöL‡x†ƒúþŸL‰Lƒùꆄ‚öꆄ‚öà†ˆþöL‡ä†ˆ¦õ·ä†‹Ø’ÍþøôüÚL…ˆ†ƒŽúþŸL‡lƒùꆄ‚öꆄ‚öꆄ‚öꆆöL…ð†ˆ¦õ·ä†‹Ø’ÍþøôüÜL䆃úþŸL…|ƒùꆄ‚öLƒH†„„‘úþŸL…<ƒùꆄ‚öꆄ‚öꆄ‚öꆆöLƒÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆈþöL‚P†ˆ¦õ·ä†‹Ø’ÍþøôüÚL4†ˆ›§ÝŠÕöL€L†L&þL€^„üL„þò„þò„þò„þò„þò„þè÷؆ˆþö؆ˆþöò†ƒùö†üLxt†ˆ›L|Lx܆‹šøLþŽþþLyL~ðLyþŸL~àƒùL~$†ˆ¦õ§ì†ÊþøL}t†ˆ¦õ§ì†ÊþøL|Ćˆ¦õ§ì†ÊþøL|†ˆ¦õ§ì†ÊþøL{d†ˆ¦õ§ì†ÊþøLz´†ˆ¦õ§ì†ëßþøLyX„Lzˆ¦õ§‹á†ÊþLydˆ¦õ™‹LypþøôüLxŒöLl †ˆ›LxdLlt†‹šøLwìþŽþþLl®LwØLlªþŸLwȃùLw †ˆ¦õ§ì†ÊþøLv\†ˆ¦õ§ì†ÊþøLuœ†ˆ¦õ§‹á†ÊþøLtІˆ¦õµì†ì†ÊþøLt†ˆ¦õµì†ì†ÊþøLsT†ˆ¦õ§ì†ÊþøLr¤†ˆ¦õ§ì†ÊþøLqô†ˆ¦õ§ì†ÊþøLqD†ˆ¦õ§ì†ÊþøLp”†ˆ¦õ§ì†ÊþøLo¬†ˆ¦õ¯ò†ì†ÊþøLnü†ˆ¦õ§ì†ÊþøLnL†ˆ¦õ§ì†ëßþøLlð„Lm˜ˆ¦õ§‹á†ÊþLlüˆ¦õ™‹LmþøôüLl$öLk4†ˆ›»ì†ì†ì†ÒöLj@Lk&þò„þò„þò„þò„þò„þ΄ü”„þò„þè÷Lix†ˆ›­ì†ì†ÒöLh †ˆ›»ìò†ì†Òöò†ƒùLfÀ†ƒŽúþŸLh|ƒùꆄ„þöꆄ‚öꆈþöLg(†ˆ¦õ·ä†‹Ø’ÍþøôüÜL[¬„Lf´ƒL[¸ƒšøLfDþŽþþL[ÖLf0L[ÒþŸLf ƒùLeH†ˆ¦õµì†ì†ÊþøLd|†ˆ¦õµì†ì†ÊþøLc°†ˆ¦õµì†ì†ÊþøLbȆˆ¦õLc ì†ì†ì†ÊþøLaü†ˆ¦õµì†ì†ÊþøLa†ˆ¦õLaìì†ìò†ÊþøL`,†ˆ¦õLaì†ìò†ÊþøL_(†ˆ¦õL`ì†ì†ì†ì†ÊþøL^$†ˆ¦õL_ì†ì†ì†ì†ÊþøL]t†ˆ¦õ§ì†ëßþøL\„L\Àˆ¦õ§‹á†ÊþL\$ˆ¦õ™‹L\0þøôüÚLZ4†L[žþò„þò„þò„þò„þò„þò„þLZF„üLZî„þò„þò„þò„þò„þò„þè÷LX솈›LZ$ìò†ì†ì†ìò†ìØöñLX †ˆ›‹Øö憃ùLW$†ˆ›­‹á†ìØöò†ƒùLU”†ƒˆˆ™†‹ˆ‹†‹ŠþŸŒƒùôüLU܆ØLU†ˆ›‘Òö؆“õþþøLS솈›»ì†ì†ì†ÒöLS†ˆ›»ì†ì†ì†ÒöLNP†ˆ›LSì†LN¸†‹úþŸLRЃùLP†ˆ‰úþŸLR¸ƒùLR†„„‰ˆ™†ì†ÜöLQ\†ˆ‰ˆ™†ì†ÜöLPŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöLO4†ˆ¦õ·ä†‹Ø’ÍþøôüLNhöˆ›ãöLK´†ƒŽúþŸLMÀƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöLL†ˆ¦õ·ä†‹Ø’ÍþøôüÜLJø†ˆ›™ò†ÒöLJt†ˆ›‘ÒöLDà†ƒŽúþŸLJhƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öLF†ˆ‘úþŸLI°ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöLF†ˆ¦õ·ä†‹Ø’ÍþøôüÞöLEH†ˆ¦õ·ä†‹Ø’ÍþøôüÜLC܆ˆ›LDÐȆ‹ˆ‘ȆÒöL=†ƒˆúþŸLCЃùꆄ‚öꆄ‚öL?|†„„‰úþŸLChƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöL@Ô†ˆ‰úþŸLBˆƒùꆄ„þöꆈþöLA\†ˆ¦õ·ä†‹Ø’ÍþøôüÖöL@†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚öꆄ‚öꆈþöL> †ˆ¦õ·ä†‹Ø’ÍþøôüÒL7†ƒˆúþŸL=t„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öL9Ô†„„‰ˆ»ì†ì†ìâöL9,†„„‰ˆ­ìòâöL8„†„„‰ˆ­ìòâöꆆöL7Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒL5„†ƒˆúþŸL7ƒùꆈþöL6†ˆ¦õ·ä†‹Ø’ÍþøôüÒL4¬†ˆ›»ìò†ì†ÒöL2¼†ƒˆúþŸL4 ƒùꆄ‚öꆄ‚öà†ˆþöL38†ˆ¦õ·ä†‹Ø’ÍþøôüÒL1䆈›»ì†ì†ì†ÒöL”†ˆ›L”‹šøL1xþŽþþLÂL1dL¾þŸL1TƒùL)T†ˆ¦õµ‹šøL0ÜþŽþþL*>L0ÈL*:þŸL0¸ƒùL0†ˆ¦õ™ÊþøL/„†ˆ¦õ™ÊþøL.ð†ˆ¦õ™ÊþøL.@†ˆ¦õ“†ÊþøL-†ˆ¦õ§ì†ÊþøL,Œ†ˆ¦õL-€ì†ì†ì†ì†ÊþøL+܆ˆ¦õ§ì†ëßþøL*€„L+(ˆ¦õ§‹á†ÊþL*Œˆ¦õ™‹L*˜þøôüÂò†ÊþøL(¤†ˆ¦õ§ì†ÊþøL'ô†ˆ¦õ“†ÊþøL&ð†ˆ¦õL'äìòòò†ÊþøL&$†ˆ¦õµìò†ÊþøL!à†ˆ¦õµ‹úþŸL&ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöL# †ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÊþøL ܆ˆ¦õL!Ðì†ìòò†ÊþøL †ˆ¦õµì†ì†ÊþøL`†ˆ¦õ§ì†ëßþøL„L¬ˆ¦õ§‹á†ÊþLˆ¦õ™‹LþøôüÂòò†ì†ì†ÒöLœƒˆúþŸLˆƒùL¤†„„‘úþŸLpƒùꆄ‚öꆄ‚öꆆöL†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöL †ˆ¦õ·ä†‹Ø’ÍþøôüÒLX†ƒúþŸL„ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöLĆˆ¦õ·ä†‹Ø’ÍþøôüÚL†ˆ›LHì†ì†ì†ì†ì†ì†ìØöLD†ƒúþŸLƒùꆄ‚öꆄ‚öꆆöL°†ˆ¦õ·ä†‹Ø’ÍþøôüÚL؆ƒúþŸL8ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöLD†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöö†üL ¤†ˆ›»ì†ì†ì†ÒöL ̆ˆ›»ì†ì†ì†ÒöL ô†ˆ›»ì†ì†ì†Òö؆ˆþöL Іˆ›»ìòò†ÒöL ø†ˆ›»ìòò†ÒöL(ƒˆúþŸL ìƒùꆄ‚öꆄ‚öꆆöL˜†ˆ¦õ·ä†‹Ø’ÍþøôüÒL˜†ˆ›‘ÒöLø†ˆ›‹†ÒöLX†ƒŽúþŸLìƒùꆄ‚öꆆöLÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜLÔ†ˆ›‘ÒöKö(†ƒŽúþŸLȃùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöK÷ˆ†„„‰ˆL¼K÷܆‹úþŸL¤ƒùꆄ‚öꆄ„þöꆄ‚öKùP†„„‰úþŸLƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöKþ¸†„„‘úþŸLäƒùL(†„„‘úþŸL̃ùꆄ„þöꆈþöL †ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆈþöKÿ0†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöKü¸†„„‘úþŸKþ„ƒùꆄ‚öꆄ„þöꆆöKý0†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öKú¨†ˆ‰úþŸKü„ƒùꆄ„þöꆄ‚öꆈþöKû0†ˆ¦õ·ä†‹Ø’ÍþøôüÖöKù؆ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöKøX†ˆ¦õ·ä†‹Ø’ÍþøôüK÷ öꆈþöKö†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùö†üKkĆˆ›KõìKl,†‹šøKõtþŽþþKlfKõ`KlbþŸKõPƒùKô”†ˆ¦õ§ì†ÊþøKó䆈¦õ§ì†ÊþøKó4†ˆ¦õ§ì†ÊþøKñ$†ˆ¦õ§‹ŽüKó&þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þ͆ÊþøKðt†ˆ¦õ§ì†ÊþøKïĆˆ¦õ§ì†ÊþøK¦õ§ì†ÊþøKîd†ˆ¦õ§ì†ÊþøKí´†ˆ¦õ§ì†ÊþøK톈¦õ§ì†ÊþøKìT†ˆ¦õ§ì†ÊþøKël†ˆ¦õKìDì†ì†ì†ÊþøKꄆˆ¦õKë\ì†ì†ì†ÊþøK鸆ˆ¦õµì†ì†ÊþøKè솈¦õµì†ì†ÊþøKè<†ˆ¦õ§ì†ÊþøK‚膈¦õ§‹ˆšøKçÐþŽþþKƒÆKç¼KƒÂþŸK笃ùK× †ˆ¦õ§‹ˆšøKç4þŽþþK×êKç K׿þŸKçƒùKæT†ˆ¦õ§ì†ÊþøK夆ˆ¦õ§ì†ÊþøKÚ8†ˆ¦õ§‹ˆšøKå8þŽþþKÛKå$KÛþŸKåƒùKä<†ˆ¦õµì†ì†ÊþøKãp†ˆ¦õµì†ì†ÊþøK⤆ˆ¦õµì†ì†ÊþøKáØ†ˆ¦õµìò†ÊþøKá(†ˆ¦õ§ì†ÊþøKà@†ˆ¦õKáì†ì†ì†ÊþøKßX†ˆ¦õKà0ì†ì†ì†ÊþøKÞ¨†ˆ¦õ§ì†ÊþøKÞ†ˆ¦õ™ÊþøKÝd†ˆ¦õ§ì†ÊþøKÜ´†ˆ¦õ§ì†ëßþøKÛX„K܈¦õ§‹á†ÊþKÛdˆ¦õ™‹KÛpþøôüKÚ°†ÊþøKÙˆ†ˆ¦õ§ì†ëßþøKØ,„KØÔˆ¦õ§‹á†ÊþKØ8ˆ¦õ™‹KØDþøôüKׄ†ÊþøKÒ\†ˆ¦õ§‹ˆšøKÖ þŽþþKÓ:KÖŒKÓ6þŸKÖ|ƒùKÕˆ†ˆ¦õKÖ`ì†ì†ì†ÊþøKÔØ†ˆ¦õ§ì†ëßþøKÓ|„KÔ$ˆ¦õ§‹á†ÊþKÓˆˆ¦õ™‹KÓ”þøôüKÒÔ†ÊþøKѬ†ˆ¦õ§ì†ÊþøKÐü†ˆ¦õ§ì†ÊþøKÆ\†ˆ¦õµ‹ˆšøKÐþŽþþKÇVKÐ|KÇRþŸKÐlƒùKϰ†ˆ¦õ§ì†ÊþøKÎ䆈¦õµì†ì†ÊþøKΆˆ¦õµì†ì†ÊþøKÍh†ˆ¦õ§ì†ÊþøKÌœ†ˆ¦õµì†ì†ÊþøKËІˆ¦õµì†ì†ÊþøKˆˆ¦õµì†ì†ÊþøKÊ8†ˆ¦õµì†ì†ÊþøKɤ†ˆ¦õ™ÊþøKÈô†ˆ¦õ§ì†ëßþøKǘ„KÈ@ˆ¦õ§‹á†ÊþKǤˆ¦õ™‹KǰþøôüKÆð†ì†ÊþøK”†ˆ¦õ§‹ˆšøKÅðþŽþþKÃrKÅÜKÃnþŸKÅ̃ùKņˆ¦õ§ì†ëßþøKô„KÄ\ˆ¦õ§‹á†ÊþKÃÀˆ¦õ™‹KÃÌþøôüKà †ÊþøKÁȆˆ¦õµì†ì†ÊþøK½ä†ˆ¦õµ‹ˆšøKÁ\þŽþþK¾ÞKÁHK¾ÚþŸKÁ8ƒùKÀ|†ˆ¦õ§ì†ëßþøK¿ „K¿Èˆ¦õ§‹á†ÊþK¿,ˆ¦õ™‹K¿8þøôüK¾x†ì†ÊþøK¬ü†ˆ¦õµ‹ˆšøK½xþŽþþK­öK°`øK½þŽþþK°~K³ÔøK¼˜þŽþþK³òK¼„K³îþŸK¼tƒùK»¸†ˆ¦õ§ì†ÊþøK»†ˆ¦õ§ì†ÊþøKºX†ˆ¦õ§ì†ÊþøK¹p†ˆ¦õKºHìòò†ÊþøK¸À†ˆ¦õ§ì†ÊþøK·ô†ˆ¦õµìò†ÊþøK·(†ˆ¦õ¡ò†ÊþøK¶@†ˆ¦õK·ìòò†ÊþøKµ†ˆ¦õ§ì†ëßþøK´4„K´Üˆ¦õ§‹á†ÊþK´@ˆ¦õ™‹K´LþøôüK°zþŸK³ÄƒùK²Ì†ˆ¦õµ‹ˆÙò†ÊþøK²†ˆ¦õ§ì†ëßþøK°À„K±hˆ¦õ§‹á†ÊþK°Ìˆ¦õ™‹K°ØþøôüK­òþŸK°PƒùK¯”†ˆ¦õ§ì†ëßþøK®8„K®àˆ¦õ§‹á†ÊþK®Dˆ¦õ™‹K®PþøôüK­†ì†ÊþøK¦ì†ˆ¦õK§Ä‹ˆšøK¬þŽþþK¨K¬|K§þþŸK¬lƒùK«°†ˆ¦õ§ì†ÊþøK«†ˆ¦õ§ì†ÊþøKªP†ˆ¦õ§ì†ÊþøK© †ˆ¦õ§ì†ëßþøK¨D„K¨ìˆ¦õ§‹á†ÊþK¨Pˆ¦õ™‹K¨\þøôüK§œ†ì†ì†ÊþøK ø†ˆ¦õµ‹ˆšøK¦€þŽþþK¡òK¦lK¡îþŸK¦\ƒùK¥ †ˆ¦õ§ì†ÊþøK¤ð†ˆ¦õ§ì†ÊþøK¤@†ˆ¦õ§ì†ÊþøK£†ˆ¦õ§ì†ëßþøK¢4„K¢Üˆ¦õ§‹á†ÊþK¢@ˆ¦õ™‹K¢LþøôüK¡Œ†ì†ÊþøK†ˆ¦õµ‹ˆšøK ŒþŽþþKžK xKž þŸK hƒùKŸ¬†ˆ¦õ§ì†ëßþøKžP„Kžøˆ¦õ§‹á†ÊþKž\ˆ¦õ™‹KžhþøôüK¨†ì†ÊþøKœH†ˆ¦õµì†ì†ÊþøK›D†ˆ¦õKœ8ì†ì†ì†ì†ÊþøKšx†ˆ¦õµì†ì†ÊþøK™¬†ˆ¦õµì†ì†ÊþøK˜ü†ˆ¦õ§ì†ÊþøKd†ˆ¦õ§‹ˆšøK˜þŽþþK‘BK˜|K‘>þŸK˜lƒùK—°†ˆ¦õ§ì†ÊþøK—†ˆ¦õ§ì†ÊþøK–P†ˆ¦õ§ì†ÊþøK• †ˆ¦õ§ì†ÊþøK”ð†ˆ¦õ§ì†ÊþøK”@†ˆ¦õ§ì†ÊþøK“†ˆ¦õ§ì†ÊþøK’à†ˆ¦õ§ì†ëßþøK‘„„K’,ˆ¦õ§‹á†ÊþK‘ˆ¦õ™‹K‘œþøôüK܆ÊþøK´†ˆ¦õ§ì†ÊþøK†ˆ¦õ§ì†ÊþøKŽT†ˆ¦õ“†ÊþøKÀ†ˆ¦õ™ÊþøKŒô†ˆ¦õµì†ì†ÊþøKŒD†ˆ¦õ§ì†ÊþøK‹”†ˆ¦õ§ì†ÊþøKŠä†ˆ¦õ“†ÊþøKŠ4†ˆ¦õ§ì†ÊþøK‰„†ˆ¦õ“†ÊþøKˆÔ†ˆ¦õ§ì†ÊþøKˆ$†ˆ¦õ“†ÊþøK‡t†ˆ¦õ§ì†ÊþøK†Ä†ˆ¦õ§ì†ÊþøK††ˆ¦õ§ì†ÊþøK…d†ˆ¦õ§ì†ëßþøK„„K„°ˆ¦õ§‹á†ÊþK„ˆ¦õ™‹K„ þøôüKƒ`†ÊþøK‚†ˆ¦õµìò†ÊþøKl†ˆ¦õ§ì†ÊþøK€¼†ˆ¦õ§ì†ÊþøK€ †ˆ¦õ§ì†ÊþøK\†ˆ¦õ§ì†ÊþøK~¬†ˆ¦õ§ì†ÊþøK}ü†ˆ¦õ§ì†ÊþøK}L†ˆ¦õ§ì†ÊþøK|œ†ˆ¦õ§ì†ÊþøK{솈¦õ§ì†ÊþøK{<†ˆ¦õ§ì†ÊþøKzp†ˆ¦õµì†ì†ÊþøKs†ˆ¦õµ‹ˆšøKzþŽþþKtKyðKtþŸKyàƒùKy†ˆ¦õµìò†ÊþøKxX†ˆ¦õ§ì†ÊþøKw¨†ˆ¦õ§ì†ÊþøKw†ˆ¦õ™ÊþøKvd†ˆ¦õ§ì†ÊþøKu´†ˆ¦õ§ì†ëßþøKtX„Kuˆ¦õ§‹á†ÊþKtdˆ¦õ™‹KtpþøôüKs°†ì†ÊþøKr@†ˆ¦õµ‹á†ì†ÊþøKq†ˆ¦õ§ì†ÊþøKpà†ˆ¦õ§ì†ÊþøKp0†ˆ¦õ§ì†ÊþøKo€†ˆ¦õ§ì†ÊþøKn´†ˆ¦õµì†ì†ÊþøKn†ˆ¦õ§ì†ëßþøKl¨„KmPˆ¦õ§‹á†ÊþKl´ˆ¦õ™‹KlÀþøôüKkÜö؆ˆþöKj †ˆ›»ì†ì†ì†ÒöKbh†ˆ›‘‹šøKj4þŽþþKc Kj KcþŸKjƒùKg\†ˆ¦õKiôKh †‹úþŸKi܃ùꆄ„þöꆄ‚öꆆöKhˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøKf¬†ˆ¦õ“†ÊþøKf†ˆ¦õ™ÊþøKeX†ˆ¦õ§‹á†ÊþøKd¨†ˆ¦õ§ì†ëßþøKcL„Kcôˆ¦õ§‹á†ÊþKcXˆ¦õ™‹KcdþøôüKb€öKa¬†ˆ›­ìò†ÒöK_†ƒˆúþŸKa ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöK_˜†ˆ¦õ·ä†‹Ø’ÍþøôüÒKZ4ƒˆúþŸK_ƒùK\<†„„‘úþŸK^øƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöK\´†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆöKZ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒKSȆƒˆúþŸKZƒùꆄ‚öꆄ‚öKW`†„„‰úþŸKY´ƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöKW膈¦õ·ä†‹Ø’ÍþøôüÖöKU †„„‘úþŸKWTƒùꆄ„þöↈ‰õöKV†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öà†ˆþöKTD†ˆ¦õ·ä†‹Ø’ÍþøôüÒKMl†ƒúþŸKS¼ƒùꆄ‚öꆄ‚ö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöKM؆ˆ¦õ·ä†‹Ø’ÍþøôüÚKKx†ˆ›‘‹úþŸKM`ƒùꆆöKL\†ˆ¦õ·ä†‹Ø’ÍþøôüKKöKIp†ƒúþŸKKlƒùꆄ„þöꆄ„þöꆄ‚öà†ˆ‰õöKI܆ˆ¦õ·ä†‹Ø’ÍþøôüÚKF¼†ˆ›KI`ìKG\†‹úþŸKI,ƒùꆄ‚öꆄ„þöꆆöKG؆ˆ¦õ·ä†‹Ø’ÍþøôüÂòùßöK=„†ˆ›Ÿ‹úþŸKF°ƒùꆄ‚öK?T†ˆ‰ˆúþŸKFpƒùꆄ‚öKB¤†„„‰úþŸKF0ƒùꆄ‚öꆄ‚öKD8†„„‘úþŸKEȃùà†ˆþöKD°†ˆ¦õ·ä†‹Ø’ÍþøôüÞöà†ˆþöKC,†ˆ¦õ·ä†‹Ø’ÍþøôüÖöK@¼†ˆ‰úþŸKB˜ƒùꆄ‚öꆄ‚öꆈþöKAD†ˆ¦õ·ä†‹Ø’ÍþøôüÖöK?솈¦õ·ä†‹Ø’ÍþøôüÎöK>„†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†üK<†ˆ›»ì†ì†ìØöJÙ¼†ˆ›K<€JÚ$†‹šøK<þŽþþJÚ^K;ôJÚZþŸK;äƒùK; †ˆ¦õµì†ì†ÊþøK:@†ˆ¦õµì†ì†ÊþøK9†ˆ¦õ§ì†ÊþøK8Ćˆ¦õµì†ì†ÊþøK7܆ˆ¦õ¯†ì†ì†ÊþøK1†ˆ¦õµ‹ˆšøK7pþŽþþK2K7\K2þŸK7LƒùK6X†ˆ¦õK70ì†ìò†ÊþøK5¨†ˆ¦õ“†ÊþøK5†ˆ¦õ™ÊþøK4d†ˆ¦õ§ì†ÊþøK3´†ˆ¦õ§ì†ëßþøK2X„K3ˆ¦õ§‹á†ÊþK2dˆ¦õ™‹K2pþøôüK1°ò†ÊþøK0†ˆ¦õK1 ì†ìò†ì†ÊþøK/h†ˆ¦õ“†ÊþøJܬ†ˆ¦õ§‹ˆšøK.üþŽþþJÝŠK.èJ݆þŸK.؃ùJá̆ˆ¦õK.¼Jâ|†‹úþŸK.¤ƒùꆄ„þöꆄ‚öJãð†„„‰šøK-ÜþŽþþJä6K-ÈJä2þŸK-¸ƒùK"ô†ˆ¦õK( ‹úþŸK- ƒùꆄ‚öK+Ô†„„‰úþŸK-`ƒùꆆöK,\†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöK*†„„‰úþŸK+ ƒùꆆöK*œ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöK(|†ˆ¦õ·ä†‹Ø’ÍþøôüK#ˆ†‹úþŸK'ôƒùꆄ‚öK%L†„„‰úþŸK'´ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöK%Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚öꆆöK$†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøK"(†ˆ¦õ¡ò†ÊþøJ笆ˆ¦õ§‹šøK!¼þŽþþJèzKHøK!LþŽþþKfKøK ÜþŽþþK®K ÈKªþŸK ¸ƒùKü†ˆ¦õ§ì†ÊþøKL†ˆ¦õ§ì†ëßþøKð„K˜ˆ¦õ§‹á†ÊþKüˆ¦õ™‹KþøôüKbþŸK€ƒùKà†ˆ¦õ™ÊþøK0†ˆ¦õ§ì†ÊþøKd†ˆ¦õ¡†ì†ÊþøK´†ˆ¦õ§ì†ÊþøK†ˆ¦õ§ì†ëßþøK¨„KPˆ¦õ§‹á†ÊþK´ˆ¦õ™‹KÀþøôüJèvþŸK8ƒùK(†ˆ¦õKì†ì†ì†ì†ÊþøK$†ˆ¦õKì†ì†ì†ì†ÊþøK †ˆ¦õKì†ìò†ì†ÊþøK8†ˆ¦õKìò†ì†ÊþøKl†ˆ¦õµìò†ÊþøK¼†ˆ¦õ§ì†ÊþøK †ˆ¦õ§ì†ÊþøK$†ˆ¦õKüì†ì†ì†ÊþøK<†ˆ¦õKì†ì†ì†ÊþøKŒ†ˆ¦õ§ì†ÊþøKÀ†ˆ¦õµì†ì†ÊþøK ô†ˆ¦õµì†ì†ÊþøK †ˆ¦õK äì†ì†ì†ÊþøJëx†ˆ¦õK üì†ì†ì†Jì †‹šøK 0þŽþþJìFK JìBþŸK ƒùK P†ˆ¦õ§ì†ÊþøK  †ˆ¦õ§ì†ÊþøK †ˆ¦õ™ÊþøK \†ˆ¦õ§ì†ÊþøKĆˆ¦õ§‹úþŸK Pƒùꆄ‚öꆄ‚öꆄ‚öꆆöKÔ†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJ÷€†ˆ¦õ§‹ˆšøKXþŽþþJø^KDJøZþŸK4ƒùK$†ˆ¦õKì†ì†ìò†ÊþøKt†ˆ¦õ“†ÊþøKĆˆ¦õ§ì†ÊþøKø†ˆ¦õµì†ì†ÊþøK,†ˆ¦õµìò†ÊþøK`†ˆ¦õµì†ì†ÊþøJú¬†ˆ¦õ§‹ˆšøKôþŽþþJûŠKàJû†þŸKЃùJÿ̆ˆ¦õK´ä†‹áò†ÊþøJÿ†ˆ¦õ“†ÊþøJþˆ†ˆ¦õ™ÊþøJý؆ˆ¦õ§ì†ÊþøJý(†ˆ¦õ§ì†ëßþøJûÌ„Jütˆ¦õ§‹á†ÊþJû؈¦õ™‹JûäþøôüJû$†ÊþøJùü†ˆ¦õ§ì†ëßþøJø „JùHˆ¦õ§‹á†ÊþJø¬ˆ¦õ™‹Jø¸þøôüJ÷ø†ÊþøJö´†ˆ¦õµì†ì†ÊþøJõ膈¦õµì†ì†ÊþøJïD†ˆ¦õ§‹ˆšøJõ|þŽþþJð"JõhJðþŸJõXƒùJôd†ˆ¦õJõ<ì†ìò†ÊþøJ󴆈¦õ“†ÊþøJó †ˆ¦õ™ÊþøJòp†ˆ¦õ§ì†ÊþøJñÀ†ˆ¦õ§ì†ëßþøJðd„Jñ ˆ¦õ§‹á†ÊþJðpˆ¦õ™‹Jð|þøôüJ&ÊþøJˆ¦õ§ì†ÊþøJí䆈¦õ§ì†ëßþøJ숄Jí0ˆ¦õ§‹á†ÊþJ씈¦õ™‹Jì þøôü†ÊþøJêȆˆ¦õ§ì†ÊþøJꆈ¦õ§ì†ëßþøJ輄Jédˆ¦õ§‹á†ÊþJèȈ¦õ™‹JèÔþøôü†ÊþøJ熈¦õ™ÊþøJ愆ˆ¦õ™ÊþøJåÔ†ˆ¦õ§ì†ëßþøJäx„Jå ˆ¦õ§‹á†ÊþJ䄈¦õ™‹JäþøôüÖöꆆöJâø†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøJᆈ¦õ“†ÊþøJàˆ†ˆ¦õ™ÊþøJߨ†ˆ¦õ§ì†ÊþøJß(†ˆ¦õ§ì†ëßþøJÝÌ„JÞtˆ¦õ§‹á†ÊþJÝØˆ¦õ™‹JÝäþøôüJÝ$†ÊþøJÛü†ˆ¦õ§ì†ëßþøJÚ „JÛHˆ¦õ§‹á†ÊþJÚ¬ˆ¦õ™‹JÚ¸þøôüJÙÔöJØä†ˆ›»ì†ì†ì†Òö؆ˆþöJÖ¨†JØŠþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þJÖº„üJ×z„þò„þò„þò„þò„þò„þò„þè÷JÐtƒŽúþŸJÖœƒùJÓð†„„‘úþŸJÖ„ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆöJÔh†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJÑ †ˆ‘úþŸJÓäƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöJÒ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJÐІˆ¦õ·ä†‹Ø’ÍþøôüÜJÎŒ†ƒˆúþŸJÐ\ƒùꆄ‚öꆄ‚öꆆöJφˆ¦õ·ä†‹Ø’ÍþøôüÒJÍ솈›‹†ÒöJÌÀ†ˆ›JÍ´†ìò†ìò†ì†ÒöJÈü†ˆ›J̈JÊÔ†‹úþŸJÌ|ƒùꆄ‚öꆆöJËP†ˆ¦õ·ä†‹Ø’ÍþøôüJÉVŠúþŸJÊȃùꆆöJÉĆˆ¦õ·ä†‹Ø’ÍþøôüJÉöJÈx†ˆ›ãöJǼ†ˆ›­ì†ì†ÒöJÃô†ƒúþŸJǰƒùꆄ‚öꆄ‚öꆄ‚öJÅ”†„„‰úþŸJÇ ƒùꆆöJƆˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöà†ˆþöJÄ`†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†üJÀ̆ˆ›§†‹úþŸJà„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöJÁ膈¦õ·ä†‹Ø’Íþøôü†ìØöJº¤†ˆ›‹†‹šøJÀDþŽþþJ»FJÀ0J»BþŸJÀ ƒùJ¿,†ˆ¦õJÀì†ì†ì†ÊþøJ¾|†ˆ¦õ“†ÊþøJ½”†ˆ¦õJ¾lì†ìò†ÊþøJ¼ä†ˆ¦õ§ì†ëßþøJ»ˆ„J¼0ˆ¦õ§‹á†ÊþJ»”ˆ¦õ™‹J» þøôüJº¼öJ¹Ì†ˆ›»ì†ì†ì†ÒöJ¸ðˆ›J¹¼ä†‹á†ìØöJ·X†ƒˆúþŸJ¸ØƒùꆆöJ·Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒJ³|†ƒˆúþŸJ·Lƒùꆄ„þöꆄ„þöꆄ‚öJµ†„„‰’úþŸJ¶¼ƒùꆄ‚öꆆöJµ†ˆ¦õ·ä†‹Ø’ÍþøôüÔöà†ˆþöJ³ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒJ²ˆ†ˆ›µ†ì†ìò†ÒöJªì†ƒúþŸJ²|ƒùꆄ‚öJ°ˆ†„„‰úþŸJ²<ƒùꆄ‚öꆈþöJ±†ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ¬(†ˆ‘úþŸJ°|ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öJ­˜†„„‰úþŸJ¯œƒùꆄ‚öꆄ„þöꆄ‚öꆆöJ® †ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöJ¬ †ˆ¦õ·ä†‹Ø’ÍþøôüÞöJ«X†ˆ¦õ·ä†‹Ø’ÍþøôüÚJª0†ˆ›­ì†ì†ÒöJ©X†ˆ›»ì†ì†ì†ÒöJ¢,†ˆ›J©Hìò†J¢”†‹šøJ¨˜þŽþþJ¢ÎJ¨„J¢ÊþŸJ¨tƒùJ§€†ˆ¦õJ¨Xìò†ì†ÊþøJ¦|†ˆ¦õJ§pìò†ì†ì†ÊþøJ¥Ì†ˆ¦õ§ì†ÊþøJ¥†ˆ¦õ“†ÊþøJ¤l†ˆ¦õ§ì†ëßþøJ£„J£¸ˆ¦õ§‹á†ÊþJ£ˆ¦õ™‹J£(þøôüJ¢DöJ€Ä†ˆ›J¢J,†‹šøJ¡¤þŽþþJfJ¡JbþŸJ¡€ƒùJ Ä†ˆ¦õ§ì†ÊþøJ †ˆ¦õ§ì†ÊþøJŸd†ˆ¦õ§ì†ÊþøJž´†ˆ¦õ§ì†ÊþøJž†ˆ¦õ§ì†ÊþøJT†ˆ¦õ§ì†ÊþøJœ¤†ˆ¦õ§ì†ÊþøJ›ô†ˆ¦õ§ì†ÊþøJ›D†ˆ¦õ§ì†ÊþøJš”†ˆ¦õ§ì†ÊþøJ™ä†ˆ¦õ§ì†ÊþøJ™4†ˆ¦õ§ì†ÊþøJ˜„†ˆ¦õ§ì†ÊþøJ…†ˆ¦õJ…싈šøJ˜þŽþþJ†*J˜J†&þŸJ—ôƒùJ—8†ˆ¦õ§ì†ÊþøJ–ˆ†ˆ¦õ§ì†ÊþøJ•؆ˆ¦õ§ì†ÊþøJ• †ˆ¦õµì†ì†ÊþøJ”@†ˆ¦õµì†ì†ÊþøJ“†ˆ¦õ§ì†ÊþøJ’à†ˆ¦õ§ì†ÊþøJ’0†ˆ¦õ§ì†ÊþøJ‘€†ˆ¦õ§ì†ÊþøJІˆ¦õ§ì†ÊþøJ膈¦õ¯ò†ì†ÊþøJ8†ˆ¦õ§ì†ÊþøJˆx†ˆ¦õ§‹ˆšøJŽÌþŽþþJ‰VJޏJ‰RþŸJލƒùJ솈¦õ“†ÊþøJ<†ˆ¦õ§ì†ÊþøJŒŒ†ˆ¦õ§ì†ÊþøJ‹¤†ˆ¦õJŒ|ì†ì†ì†ÊþøJŠô†ˆ¦õ§ì†ëßþøJ‰˜„JŠ@ˆ¦õ§‹á†ÊþJ‰¤ˆ¦õ™‹J‰°þøôüJˆð†ÊþøJ‡È†ˆ¦õ§ì†ëßþøJ†l„J‡ˆ¦õ§‹á†ÊþJ†xˆ¦õ™‹J†„þøôüJ…Ćì†ì†ÊþøJ„d†ˆ¦õ§ì†ÊþøJƒ´†ˆ¦õ“†ÊþøJƒ†ˆ¦õ§ì†ëßþøJ¨„J‚Pˆ¦õ§‹á†ÊþJ´ˆ¦õ™‹JÀþøôüJ€ÜöJ솈›»ì†ì†ì†ÒöJL†‡ü¬„þò„þò„þò„þè÷J}Œ†J>þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þJ}ž„ü¸„þò„þò„þò„þò„þè÷Jtø†ˆ›J}|ì†ì†Ju`†‹šøJ|ÌþŽþþJušJ|¸Ju–þŸJ|¨ƒùJ{솈¦õ§ì†ÊþøJ{X†ˆ¦õ™ÊþøJzŒ†ˆ¦õµì†ì†ÊþøJy܆ˆ¦õ§ì†ëßþøJyH†ˆ¦õ™ÊþøJx˜†ˆ¦õ§ì†ÊþøJw膈¦õ§ì†ÊþøJw8†ˆ¦õ§ì†ëßþøJuÜ„Jv„ˆ¦õ§‹á†ÊþJu舦õ™‹JuôþøôüJuöJsx†ˆ›JtÀòò†ìò†ìò†ìò†ÒöJr ƒŽúþŸJslƒùꆆöJrh†ˆ¦õ·ä†‹Ø’ÍþøôüÜJqD†ˆ›­ìò†ÒöʆˆŸßöJg †ƒˆúþŸJpЃùJo†„„‘úþŸJp¸ƒùꆄ‚öꆆöJoŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJm†„„‘úþŸJoƒùꆄ‚öꆄ‚öꆄ‚öꆆöJmŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öJi¬†„„‘úþŸJkðƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöJj$†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöJgœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒJfœ†ˆ›‘óßöJa †ƒúþŸJfƒùꆄ„þöꆄ„þöꆄ‚öJd †„„‘úþŸJfƒùꆄ‚öꆄ‚öꆄ‚öꆆöJd„†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJb\†ˆ‘úþŸJdƒùꆄ‚öꆆöJbÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJaŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÚJZ„†ƒˆúþŸJaƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöJ]¤†„„‘úþŸJ_¬„‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöJ^†ˆ¦õ·ä†‹Ø’ÍþøôüþàöJ[Іˆ‘úþŸJ]ˆ„‚öꆄ‚öà†ˆþöJ\H†ˆ¦õ·ä†‹Ø’ÍþøôüþàöJ[†ˆ¦õ·ä†‹Ø’ÍþøôüÒJXX†ƒˆúþŸJZxƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöJXÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÒJWœ†ˆ›­ì†ì†ÒöJR4†JWŽþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þJRF„üJTþ„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷Iè8†ƒŽúþŸJR(ƒùIé膄„‰úþŸJRƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöJK䆄„‰úþŸJMÀƒùꆄ‚öꆄ‚öꆆöJLl†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöJD†„„‰ˆšøJKþŽþþJDVJJìJDRþŸJJ܃ùJJ †ˆ¦õ§ì†ÊþøJI8†ˆ¦õJJìòò†ÊþøJH†ˆ¦õJI(ìòò†ì†ì†ÊþøJF¤†ˆ¦õJHì†ì†ì†ìòò†ìò†ÊþøJEô†ˆ¦õ§ì†ëßþøJD˜„JE@ˆ¦õ§‹á†ÊþJD¤ˆ¦õ™‹JD°þøôüÎöↄ„‰õöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öↄ„‰õöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöIíà†„„‰šøJ@ôþŽþþIî&J@àIî"þŸJ@ЃùJ@†ˆ¦õ§ì†ÊþøJ?d†ˆ¦õ§ì†ÊþøJ>˜†ˆ¦õµì†ì†ÊþøJ=膈¦õ§ì†ÊþøJ=8†ˆ¦õ§ì†ÊþøJ<ˆ†ˆ¦õ§ì†ÊþøI÷ô†ˆ¦õ§‹ˆšøJ<þŽþþIøÒJ<IøÎþŸJ;øƒùJ;,†ˆ¦õ§‹á†ÊþøJ:|†ˆ¦õ§ì†ÊþøJ9 †ˆ¦õµ‹áò†ÊþøJ8Ćˆ¦õµ‹áò†ÊþøJ7À†ˆ¦õJ8´ìò†ìò†ÊþøJ6ô†ˆ¦õµìò†ÊþøJ6(†ˆ¦õµìò†ÊþøJ5@†ˆ¦õJ6ìò†ì†ÊþøJ0à†ˆ¦õJ50J2†‹úþŸJ5ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöƆ„„‰ˆ‘ÜöꆆöJ2Œ†ˆ¦õ·ä†‹Ø’Íþøôü†䆋áòò†ì†ÊþøJ/À†ˆ¦õJ0Ðì†ì†ì†ìò†ÊþøJ. †ˆ¦õJ/°ì†ì†ì†ìò†ÊþøJ-Ô†ˆ¦õµìò†ÊþøJ,솈¦õJ-Äì†ìò†ÊþøJ,†ˆ¦õJ,Üì†ì†ì†ÊþøJ+8†ˆ¦õµìò†ÊþøJ„†ˆ¦õJ+(J†‹ˆšøJ*°þŽþþJbJ*œJ^þŸJ*ŒƒùJ)솈¦õ™ÊþøJ) †ˆ¦õµìò†ÊþøJ(D†ˆ¦õµ‹áò†ÊþøJ'x†ˆ¦õµì†ì†ÊþøJ&¸†ˆ¦õ§‹á†ÊþøJ8†ˆ¦õ§‹ˆšøJ&LþŽþþJJ&8JþŸJ&(ƒùJ"h†ˆ¦õJ$L‹úþŸJ&ƒùꆄ„þöꆄ„þöꆈþöJ$¼†ˆ¦õ·ä†‹Ø’ÍþøôüJ#l†‹ŽüJ$2þò„þò„þò„þò„þò„þ͆ìòò†ì†ÊþøJ!d†ˆ¦õJ"Xì†ìò†ì†ÊþøJ ´†ˆ¦õ§ì†ëßþøJX„J ˆ¦õ§‹á†ÊþJdˆ¦õ™‹JpþøôüJ°†ÊþøJ†ˆ¦õJ(ì†ì†ì†ìò†ÊþøJ0†ˆ¦õJìò†ì†ÊþøJ†ˆ¦õJ ì†ì†ìò†ì†ÊþøJ°†ˆ¦õ§‹úþŸJƒùꆄ„þöꆄ‚öJ†„„ü°þò„þò„þò„þéöꆄ‚öꆄ‚öꆆöJÀ†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJ†ˆ¦õ§ì†ëßþøJ¤„JLˆ¦õ§‹á†ÊþJ°ˆ¦õ™‹J¼þøôüJü†ÊþøJ̆ˆ¦õ§‹úþŸJxƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öJ<†„„üJFþò„þò„þò„þò„þò„þò„þò„þò„þéöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþöJ܆ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJ¼†ˆ¦õ§‹úþŸJÀƒùꆄ‚öꆄ„þöↄ„‰õöJ t†„„ü¼þò„þò„þò„þò„þéöJ Ô†„„ü°þò„þò„þò„þéöJ Œ†„„üJ Æþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þéöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöJ ̆ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøIû †ˆ¦õ§‹úþŸJ°ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöIýȆ„„‘úþŸJøƒùJ†„„‘úþŸJàƒùↄ„‰õöJ †„„‰úþŸJƒùꆄ„þöꆄ‚öà†ˆ‰õöJ(†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆆöJ€†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJX†„„‘úþŸJüƒùꆄ‚öꆆöJІˆ¦õ·ä†‹Ø’ÍþøôüÞöIÿ†ˆ‘úþŸJLƒùJ€†„„‰úþŸJ4ƒùꆄ‚öꆈþöJ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöIÿˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöIþ@†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öIý†ˆü°þò„þò„þò„þéöIü0†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøIúp†ˆ¦õ§ì†ëßþøIù„Iù¼ˆ¦õ§‹á†ÊþIù ˆ¦õ™‹Iù,þøôüIøl†ÊþøI÷ †ˆ¦õI÷äì†ì†ì†ÊþøIö†ˆ¦õIöüì†ì†ì†ì†ÊþøIõ†ˆ¦õIõøì†ì†ìò†ÊþøIô†ˆ¦õIôôì†ì†ìò†ÊþøIó4†ˆ¦õµì†ì†ÊþøIò„†ˆ¦õ§ì†ÊþøIñð†ˆ¦õ™ëßþøIñ$†ˆ¦õµì†ì†ÊþøIðt†ˆ¦õ§ì†ÊþøIïĆˆ¦õ§ì†ëßþøIîh„Iõ§‹á†ÊþIîtˆ¦õ™‹Iî€þøôüÖöIë@†ˆ‘úþŸIíÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöI븆ˆ¦õ·ä†‹Ø’ÍþøôüÞöIêp†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ‚öꆆöIè †ˆ¦õ·ä†‹Ø’ÍþøôüÜIæ0†ƒúþŸIè,ƒùꆄ„þöIçl†ˆ‰ˆŸìâöI朆ˆ¦õ·ä†‹Ø’ÍþøôüÚöƒùIã膃ˆúþŸIæƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöIäd†ˆ¦õ·ä†‹Ø’ÍþøôüÒI§L†ˆ›I㰆䆋I§´†‹úþŸIãxƒùIÝ$†„„‰úþŸIã`ƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öIßD†„„‰úþŸI ùꆄ„þöIàœ†ˆ‘úþŸIâ@ƒùꆄ‚öꆆöIᆈ¦õ·ä†‹Ø’ÍþøôüÞöIß̆ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆆöIݬ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öƆ„„‰ˆ„éöƆ„„‰ˆ‘Üöꆄ„þöꆄ„þöꆄ„þöꆄ„þöIÃH†„„‰úþŸIØÈƒùꆄ„þöƆ„„‰ˆ„éöƆ„„‰ˆ‘ÜöIÔ †„„‘úþŸIט„„þöꆄ„þöIÕT†ˆ‰úþŸI×Xƒùꆄ„þöꆄ‚öꆄ„þöꆈþöIÕ܆ˆ¦õ·ä†‹Ø’ÍþøôüÖöIÔ„†ˆ¦õ·ä†‹Ø’ÍþøôüþàöIÓŒ†„„‰ˆˆ‘ÔöIÑ †„„‰úþŸIÓ€ƒùƆ„„‰ˆ‘óéöIÒx†ˆ‰ˆŸì†ÜöIѨ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöIР†„„‰ˆˆ‘ÔöIÎH†„„‰úþŸIДƒùꆄ„þöꆄ„þöꆄ„þöƆˆ‰ˆ‘ÜöIÎІˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ‚öꆄ‚öIË€†„„‰úþŸIÍăùƆ„„‰ˆ„éöƆˆ‰ˆ‘ÜöĬˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öIɘ†„„‰úþŸIËLƒùꆄ‚öꆆöIÊ †ˆ¦õ·ä†‹Ø’ÍþøôüÖöIŤ†„„‰úþŸIÉŒƒùIÈØ†„„‰ˆ­ìò†ÜöIÈ0†„„‰ˆ­ì†ì†óéöILj†„„‰ˆ­ì†ì†óéöIÆü†ˆ‰ˆŸì†ÜöIÆ,†ˆ¦õ·ä†‹Ø’ÍþøôüÖö̆„„‰ˆíöꆄ‚öꆄ‚öꆄ‚öꆆöIÃІˆ¦õ·ä†‹Ø’ÍþøôüÖöI»È†„„‰úþŸIÃ<ƒùIÁp†„„‘úþŸIÄ„þöꆄ„þöꆆöIÁ膈¦õ·ä†‹Ø’ÍþøôüþàöI½¸†„„‘úþŸI¿\„„‰ˆúþŸIÁdƒùꆄ„þöꆄ„þöꆄ‚öꆆöI¿è†ˆ¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öꆆöI¾0†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öƆˆü˜þò„þéöI¼P†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚ö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öꆄ„þöI·ð†„„‰ˆúþŸI¹Œ„„‰õöꆈþöI¸ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öI®|†„„‰šøI·\þŽþþI®ÂI·HI®¾þŸI·8ƒùI¶`†ˆ¦õµì†ì†ÊþøIµ”†ˆ¦õµì†ì†ÊþøI²p†ˆ¦õ§‹úþŸIµˆƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öà†„„‰õöꆆöI³€†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøI±¤†ˆ¦õµì†ì†ÊþøI±†ˆ¦õ™ÊþøI°`†ˆ¦õ§ì†ëßþøI¯„I¯¬ˆ¦õ§‹á†ÊþI¯ˆ¦õ™‹I¯þøôüÖöI¬4†„„‰úþŸI®`„‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöI¬¼†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öIªÌ†„„‰ŠþŸŒƒùôüÖöIª,†„„‰ŠþŸŒƒùôüÖöI©Œ†„„‰ŠþŸŒƒùôüÖöꆄ„þöꆄ„þöà†ˆþöI¨0†ˆ¦õ·ä†‹Ø’ÍþøôüÉßöI¡Ð†ˆ›I§,‹á†I¢8†‹šøI¦˜þŽþþI¢rI¦„I¢nþŸI¦tƒùI¥p†ˆ¦õI¦Xì†ä†‹á†ÊþøI¤À†ˆ¦õ“†ÊþøI¤†ˆ¦õ§ì†ëßþøI¢´„I£\ˆ¦õ§‹á†ÊþI¢Àˆ¦õ™‹I¢ÌþøôüI¡èö”†ˆ›l‹ˆšøI¡dþŽþþªI¡P¦þŸI¡@ƒùI †ˆ¦õI¡$ìòòò†ì†ÊþøIŒ†ˆ¦õI ‹ˆšøIŸ¨þŽþþIÞIšÌøIŸ8þŽþþIšêIŸ$IšæþŸIŸƒùIž †ˆ¦õIžøìò†ì†ÊþøI8†ˆ¦õIžìò†ì†ÊþøIœˆ†ˆ¦õ§ì†ëßþøI›,„I›Ôˆ¦õ§‹á†ÊþI›8ˆ¦õ™‹I›DþøôüIÚþŸIš¼ƒùI–€†ˆ¦õIš ìI—†“úþŸIšlƒùꆄ‚öꆄ‚öI˜x†„„‘úþŸI™ô„‚öꆆöI˜ð†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöI—€†ˆ¦õ·ä†‹Ø’ÍþøôüʆÊþøI•Іˆ¦õ§ì†ÊþøI”¼†ˆ¦õI•À䆋á†ì†ì†ÊþøI” †ˆ¦õ“†ÊþøI“x†ˆ¦õ™ÊþøI’†ˆ¦õ¯†ì†ì†ÊþøI‘¨†ˆ¦õ¯†ì†ì†ÊþøI܆ˆ¦õ¡†ì†ÊþøI,†ˆ¦õ§ì†ÊþøI|†ˆ¦õ§ì†ëßþøIŽ „IŽÈˆ¦õ§‹á†ÊþIŽ,ˆ¦õ™‹IŽ8þøôüIxòò†ì†ì†ÊþøI‹p†ˆ¦õIŒ€ìòòò†ì†ÊþøIŠ4†ˆ¦õI‹`ìò†ìò†ì†ì†ÊþøI‰ †ˆ¦õIŠ$ì†ä†‹áò†ÊþøIˆ†ˆ¦õ½†ì†ì†ì†ÊþøI‡l†ˆ¦õ“†ÊþøI†Ø†ˆ¦õ™ÊþøŒ†ˆ¦õ€‹ˆšøI†lþŽþþ¾øI…üþŽþþ.þŸI…ìƒù ¨„!ˆ—ü$²–&VüõI„âI…ˆ‹‹ò„øèI„ø†‹‹˜ê„øè&4þ6„H¯ÌI‚P“¼IƒŒI„Tˆ–’Iƒð‚ˆ’Âü–üàI‚èIƒlöI‚`›‹ØþI¼‚“¼IŒIðˆ’I`‚ˆ–’Iü–üàI€XI€ÜöIЛ‹ØþI},‚“¼I~pŒI`ˆ’I~Ђˆ–’I~Œü–üàI}ÈI~LöI}@›‹ØþIzœ‚“¼I{àŒI|Ј’I|@‚ˆ–’I{üü–üàI{8I{¼öIz°›‹ØþIx ‚“¼IyPŒIz@ˆ’Iy°‚ˆ–’Iylü–üàIx¨Iy,öIx ›‹ØþIu|‚“¼IvÀŒIw°ˆ’Iw ‚ˆ–’IvÜü–üàIvIvœöIu›‹ØþIrì‚“¼It0ŒIu ˆ’It‚ˆ–’ItLü–üàIsˆIt öIs›‹ØþIp\‚“¼Iq ŒIrˆ’Ir‚ˆ–’Iq¼ü–üàIpøIq|öIpp›‹ØþImÌ‚“¼IoŒIpˆ’Iop‚ˆ–’Io,ü–üàInhInìöImà›‹ØþIk<‚“¼Il€ŒImpˆ’Ilà‚ˆ–’Ilœü–üàIkØIl\öIkP›‹ØþIh¬‚“¼IiðŒIjàˆ’IjP‚ˆ–’Ij ü–üàIiHIiÌöIhÀ›‹ØþIf‚“¼Ig`ŒIhPˆ’IgÀ‚ˆ–’Ig|ü–üàIf¸Ig<öIf0›‹ØþIcŒ‚“¼IdÐŒIeÀˆ’Ie0‚ˆ–’Idìü–üàId(Id¬öIc ›‹ØþI`ü‚“¼Ib@ŒIc0ˆ’Ib ‚ˆ–’Ib\ü–üàIa˜IböIa›‹ØþI^l‚“¼I_°ŒI` ˆ’I`‚ˆ–’I_Ìü–üàI_I_ŒöI^€›‹ØþI[Ü‚“¼I] ŒI^ˆ’I]€‚ˆ–’I]<ü–üàI\xI\üöI[ð›‹ØþIYL‚“¼IZŒI[Tˆ–’IZð‚ˆ’Âü–üàIYèIZlöIY`›‹ØþIV‚“¼IWÔŒIXĈ–’IX4‚ˆ–’IWðü–üàIW,IW°öIV¤›‹ØþISÔ‚“¼IUŒIVˆ–’IUx‚ˆ–’IU4ü–üàITpITôöIS蛋ØþIQ‚“¼IR\ŒISLˆ–’IR¼‚ˆ–’IRxü–üàIQ´IR8öIQ,›‹ØþIN\‚“¼IO ŒIPˆ–’IP‚ˆ–’IO¼ü–üàINøIO|öINp›‹ØþIK ‚“¼ILäŒIMÔˆ–’IMD‚ˆ–’IMü–üàIL<ILÀöIK´›‹ØþIHä‚“¼IJ(ŒIKˆ–’IJˆ‚ˆ–’IJDü–üàII€IJöIHø›‹ØþIFT‚“¼IG˜ŒIH\ˆ–’IGø‚ˆ’Âü–üàIFðIGtöIFh›‹ØþICÄ‚“¼IEŒIË–’IEh‚ˆ’Âü–üàID`IDäöICØ›‹ØþIA‚“¼IBLŒIC<ˆ–’IB¬‚ˆ–’IBhü–üàIA¤IB(öIA›‹ØþI>L‚“¼I?ŒI@€ˆ–’I?ð‚ˆ–’I?¬ü–üàI>èI?löI>`›‹ØþI;‚“¼I<ÔŒI=Ĉ–’I=4‚ˆ–’I<ðü–üàI<,I<°öI;¤›‹ØþI8Ô‚“¼I:ŒI;ˆ–’I:x‚ˆ–’I:4ü–üàI9pI9ôöI8蛋ØþI6‚“¼I7\ŒI8Lˆ–’I7¼‚ˆ–’I7xü–üàI6´I78öI6,›‹ØþI3\‚“¼I4 ŒI5ˆ–’I5‚ˆ–’I4¼ü–üàI3øI4|öI3p›‹ØþI0 ‚“¼I1äŒI2Ôˆ–’I2D‚ˆ–’I2ü–üàI1<I1ÀöI0´›‹ØþI.‚“¼I/TŒI0ˆ–’I/´‚ˆ’Âü–üàI.¬I/0öI.$›‹ØþI+€‚“¼I,ÄŒI-ˆˆ–’I-$‚ˆ’Âü–üàI,I, öI+”›‹ØþI(Ä‚“¼I*ŒI*øˆ–’I*h‚ˆ–’I*$ü–üàI)`I)äöI(Ø›‹ØþI&‚“¼I'LŒI(<ˆ–’I'¬‚ˆ–’I'hü–üàI&¤I'(öI&›‹ØþI#L‚“¼I$ŒI%€ˆ–’I$ð‚ˆ–’I$¬ü–üàI#èI$löI#`›‹ØþI ‚“¼I!ÔŒI"Ĉ–’I"4‚ˆ–’I!ðü–üàI!,I!°öI ¤›‹ØþIÔ‚“¼IŒI ˆ–’Ix‚ˆ–’I4ü–üàIpIôöI蛋ØþI‚“¼I\ŒILˆ–’I¼‚ˆ–’Ixü–üàI´I8öI,›‹ØþI\‚“¼I ŒIˆ–’I‚ˆ–’I¼ü–üàIøI|öIp›‹ØþIÌ‚“¼IŒIÔˆ–’Ip‚ˆ’Âü–üàIhIìöIà›‹ØþI<‚“¼I€ŒIDˆ–’Ià‚ˆ’Âü–üàIØI\öIP›‹ØþI€‚“¼IÄŒI´ˆ–’I$‚ˆ–’Iàü–üàII öI”›‹ØþI Ä‚“¼IŒIøˆ–’Ih‚ˆ–’I$ü–üàI`IäöI Ø›‹ØþI ‚“¼I LŒI <ˆ–’I ¬‚ˆ–’I hü–üàI ¤I (öI ›‹ØþIL‚“¼I ŒI €ˆ–’I ð‚ˆ–’I ¬ü–üàIèI löI`›‹ØþI‚“¼IÔŒIĈ–’I4‚ˆ–’Iðü–üàI,I°öI¤›‹ØþIÔ‚“¼IŒIˆ–’Ix‚ˆ–’I4ü–üàIpIôöI蛋ØþI‚“¼I\ŒILˆ–’I¼‚ˆ–’Ixü–üàI´I8öI,›‹ØþHýˆ‚“¼HþÌŒHÿˆ–’Hÿ,‚ˆ’Âü–üàHþ$Hþ¨öHýœ›‹ØþHúø‚“¼Hü<ŒHýˆ–’Hüœ‚ˆ’Âü–üàHû”HüöHû ›‹ØþHø<‚“¼Hù€ŒHúpˆ–’Hùà‚ˆ–’Hùœü–üàHøØHù\öHøP›‹ØþHõ€‚“¼HöÄŒH÷´ˆ–’H÷$‚ˆ–’Höàü–üàHöHö öHõ”›‹ØþHòÄ‚“¼HôŒHôøˆ–’Hôh‚ˆ–’Hô$ü–üàHó`HóäöHòØ›‹ØþHð‚“¼HñLŒHò<ˆ–’Hñ¬‚ˆ–’Hñhü–üàHð¤Hñ(öHð›‹ØþHíL‚“¼HîŒH–’Hîð‚ˆ–’Hî¬ü–üàHíèHîlöHí`›‹ØþHê‚“¼HëÔŒHìĈ–’Hì4‚ˆ–’Hëðü–üàHë,Hë°öHꤛ‹ØþHçÔ‚“¼HéŒHꈖ’Héx‚ˆ–’Hé4ü–üàHèpHèôöHç蛋ØþHåD‚“¼H戌HçLˆ–’Hæè‚ˆ’Âü–üàHåàHædöHåX›‹ØþHâ´‚“¼HãøŒH伈–’HäX‚ˆ’Âü–üàHãPHãÔöHâÈ›‹ØþHßø‚“¼Há<ŒHâ,ˆ–’Hᜂˆ–’HáXü–üàHà”HáöHà ›‹ØþHÝ<‚“¼HÞ€ŒHßpˆ–’HÞà‚ˆ–’HÞœü–üàHÝØHÞ\öHÝP›‹ØþHÚ€‚“¼HÛÄŒHÜ´ˆ–’HÜ$‚ˆ–’HÛàü–üàHÛHÛ öHÚ”›‹ØþH×Ä‚“¼HÙŒHÙøˆ–’HÙh‚ˆ–’HÙ$ü–üàHØ`HØäöHר›‹ØþHÕ‚“¼HÖLŒH×<ˆ–’HÖ¬‚ˆ–’HÖhü–üàHÕ¤HÖ(öHÕ›‹ØþHÒL‚“¼HÓŒHÔ€ˆ–’HÓð‚ˆ–’HÓ¬ü–üàHÒèHÓlöHÒ`›‹ØþHÏ‚“¼HÐÔŒHÑĈ–’HÑ4‚ˆ–’HÐðü–üàHÐ,HаöHϤ›‹ØþHÍ‚“¼HÎDŒHψ–’HΤ‚ˆ’Âü–üàHÍœHÎ öHÍ›‹ØþHÊp‚“¼HË´ŒHÌxˆ–’HÌ‚ˆ’Âü–üàHË HËöHÊ„›‹ØþHÇ´‚“¼HÈøŒHÉ舖’HÉX‚ˆ–’HÉü–üàHÈPHÈÔöHÇÈ›‹ØþHÄø‚“¼HÆ<ŒHÇ,ˆ–’HÆœ‚ˆ–’HÆXü–üàHÅ”HÆöHÅ ›‹ØþHÂ<‚“¼HÀŒHÄpˆ–’HÃà‚ˆ–’HÜü–üàHÂØHÃ\öHÂP›‹ØþH¿€‚“¼HÀÄŒHÁ´ˆ–’HÁ$‚ˆ–’HÀàü–üàHÀHÀ öH¿”›‹ØþH¼Ä‚“¼H¾ŒH¾øˆ–’H¾h‚ˆ–’H¾$ü–üàH½`H½äöH¼Ø›‹ØþHº‚“¼H»LŒH¼<ˆ–’H»¬‚ˆ–’H»hü–üàHº¤H»(öHº›‹ØþH·L‚“¼H¸ŒH¹€ˆ–’H¸ð‚ˆ–’H¸¬ü–üàH·èH¸löH·`›‹ØþH´¼‚“¼H¶ŒH¶Äˆ–’H¶`‚ˆ’Âü–üàHµXHµÜöH´Ð›‹ØþH²H‚“¼H³ŒŒH´`ˆ’H³ü‚ˆ’H³¨ü–ü—ÉH²äH³höH²\›‹ØþH¯Ô‚“¼H±ŒH±ìˆ’H±ˆ‚ˆ’H±4ü–ü—ÉH°pH°ôöH¯è›‹Øþøü6lH¯¸ƒù6TH¯œƒù6PH¯„ƒù6LH¯lƒù6DH®èˆ›‘óßþøò†ƒù68H®ˆ›™†ì†óßþø6H­üƒù6H­äƒùð†ƒù6H­°ƒù6H­”ƒù6H­„ü5üH­hƒùò„†üü5øH­4ƒù5ôH¬\ˆ›»ìò†ì†ÒþøH«È„¾ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüò„†üü5ðH«(H«¬ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüò„†üü5äH«üHªt†ˆ›‘óßþøH©ð†ˆ›‘Òþø5àH©ìü5ÜH©Lˆ›ŸìØþøö†ü5ÔH© †üü5ÐH© ƒùGÓè„H¦t“¼H§´ŒH¨xˆ–’H¨‚ˆ’Âü–üàH§ H§öH¦„›‹ØþH£à‚“¼H¥$ŒH¦ˆ’H¥„‚ˆ–’H¥@ü–üàH¤|H¥öH£ô›‹ØþH¡P‚“¼H¢”ŒH£„ˆ’H¢ô‚ˆ–’H¢°ü–üàH¡ìH¢pöH¡d›‹ØþHžÀ‚“¼H ŒH ôˆ’H d‚ˆ–’H  ü–üàHŸ\HŸàöHžÔ›‹ØþHœ0‚“¼HtŒHždˆ’HÔ‚ˆ–’Hü–üàHœÌHPöHœD›‹ØþH™ ‚“¼HšäŒH›Ôˆ’H›D‚ˆ–’H›ü–üàHš<HšÀöH™´›‹ØþH—‚“¼H˜TŒH™Dˆ’H˜´‚ˆ–’H˜pü–üàH—¬H˜0öH—$›‹ØþH”€‚“¼H•ÄŒH–´ˆ’H–$‚ˆ–’H•àü–üàH•H• öH””›‹ØþH‘ð‚“¼H“4ŒH”$ˆ’H“”‚ˆ–’H“Pü–üàH’ŒH“öH’›‹ØþH`‚“¼H¤ŒH‘”ˆ’H‘‚ˆ–’HÀü–üàHüH€öHt›‹ØþHŒÐ‚“¼HŽŒHˆ’HŽt‚ˆ–’HŽ0ü–üàHlHðöHŒä›‹ØþHŠ@‚“¼H‹„ŒHŒtˆ’H‹ä‚ˆ–’H‹ ü–üàHŠÜH‹`öHŠT›‹ØþH‡°‚“¼HˆôŒH‰äˆ’H‰T‚ˆ–’H‰ü–üàHˆLHˆÐöH‡Ä›‹ØþH… ‚“¼H†dŒH‡Tˆ’H†Ä‚ˆ–’H†€ü–üàH…¼H†@öH…4›‹ØþH‚‚“¼HƒÔŒH„Ĉ’H„4‚ˆ–’Hƒðü–üàHƒ,Hƒ°öH‚¤›‹ØþH€‚“¼HDŒH‚4ˆ’H¤‚ˆ–’H`ü–üàH€œH öH€›‹ØþH}p‚“¼H~´ŒHxˆ–’H‚ˆ’Âü–üàH~ H~öH}„›‹ØþHz´‚“¼H{øŒH|舖’H|X‚ˆ–’H|ü–üàH{PH{ÔöHzÈ›‹ØþHwø‚“¼Hy<ŒHz,ˆ–’Hyœ‚ˆ–’HyXü–üàHx”HyöHx ›‹ØþHu<‚“¼Hv€ŒHwpˆ–’Hvà‚ˆ–’Hvœü–üàHuØHv\öHuP›‹ØþHr€‚“¼HsÄŒHt´ˆ–’Ht$‚ˆ–’Hsàü–üàHsHs öHr”›‹ØþHoÄ‚“¼HqŒHqøˆ–’Hqh‚ˆ–’Hq$ü–üàHp`HpäöHoØ›‹ØþHm‚“¼HnLŒHo<ˆ–’Hn¬‚ˆ–’Hnhü–üàHm¤Hn(öHm›‹ØþHjx‚“¼Hk¼ŒHl€ˆ–’Hl‚ˆ’Âü–üàHkHk˜öHjŒ›‹ØþHgè‚“¼Hi,ŒHiðˆ–’HiŒ‚ˆ’Âü–üàHh„HiöHgü›‹ØþHe,‚“¼HfpŒHg`ˆ–’HfЂˆ–’HfŒü–üàHeÈHfLöHe@›‹ØþHbp‚“¼Hc´ŒHd¤ˆ–’Hd‚ˆ–’HcÐü–üàHc HcöHb„›‹ØþH_´‚“¼H`øŒHa舖’HaX‚ˆ–’Haü–üàH`PH`ÔöH_È›‹ØþH\ø‚“¼H^<ŒH_,ˆ–’H^œ‚ˆ–’H^Xü–üàH]”H^öH] ›‹ØþHZ<‚“¼H[€ŒH\pˆ–’H[à‚ˆ–’H[œü–üàHZØH[\öHZP›‹ØþHW€‚“¼HXÄŒHY´ˆ–’HY$‚ˆ–’HXàü–üàHXHX öHW”›‹ØþHTÄ‚“¼HVŒHVøˆ–’HVh‚ˆ–’HV$ü–üàHU`HUäöHTØ›‹ØþHR4‚“¼HSxŒHT<ˆ–’HSØ‚ˆ’Âü–üàHRÐHSTöHRH›‹ØþHO¤‚“¼HPèŒHQ¬ˆ–’HQH‚ˆ’Âü–üàHP@HPÄöHO¸›‹ØþHLè‚“¼HN,ŒHOˆ–’HNŒ‚ˆ–’HNHü–üàHM„HNöHLü›‹ØþHJ,‚“¼HKpŒHL`ˆ–’HKЂˆ–’HKŒü–üàHJÈHKLöHJ@›‹ØþHGp‚“¼HH´ŒHI¤ˆ–’HI‚ˆ–’HHÐü–üàHH HHöHG„›‹ØþHD´‚“¼HEøŒHF舖’HFX‚ˆ–’HFü–üàHEPHEÔöHDÈ›‹ØþHAø‚“¼HC<ŒHD,ˆ–’HCœ‚ˆ–’HCXü–üàHB”HCöHB ›‹ØþH?<‚“¼H@€ŒHApˆ–’H@à‚ˆ–’H@œü–üàH?ØH@\öH?P›‹ØþH<€‚“¼H=ÄŒH>´ˆ–’H>$‚ˆ–’H=àü–üàH=H= öH<”›‹ØþH9ð‚“¼H;4ŒH;øˆ–’H;”‚ˆ’Âü–üàH:ŒH;öH:›‹ØþH7`‚“¼H8¤ŒH9hˆ–’H9‚ˆ’Âü–üàH7üH8€öH7t›‹ØþH4¤‚“¼H5èŒH6؈–’H6H‚ˆ–’H6ü–üàH5@H5ÄöH4¸›‹ØþH1è‚“¼H3,ŒH4ˆ–’H3Œ‚ˆ–’H3Hü–üàH2„H3öH1ü›‹ØþH/,‚“¼H0pŒH1`ˆ–’H0Ђˆ–’H0Œü–üàH/ÈH0LöH/@›‹ØþH,p‚“¼H-´ŒH.¤ˆ–’H.‚ˆ–’H-Ðü–üàH- H-öH,„›‹ØþH)´‚“¼H*øŒH+舖’H+X‚ˆ–’H+ü–üàH*PH*ÔöH)È›‹ØþH&ø‚“¼H(<ŒH),ˆ–’H(œ‚ˆ–’H(Xü–üàH'”H(öH' ›‹ØþH$<‚“¼H%€ŒH&pˆ–’H%à‚ˆ–’H%œü–üàH$ØH%\öH$P›‹ØþH!¬‚“¼H"ðŒH#´ˆ–’H#P‚ˆ’Âü–üàH"HH"ÌöH!À›‹ØþH‚“¼H `ŒH!$ˆ–’H À‚ˆ’Âü–üàH¸H <öH0›‹ØþH`‚“¼H¤ŒH”ˆ–’H‚ˆ–’HÀü–üàHüH€öHt›‹ØþH¤‚“¼HèŒH؈–’HH‚ˆ–’Hü–üàH@HÄöH¸›‹ØþHè‚“¼H,ŒHˆ–’HŒ‚ˆ–’HHü–üàH„HöHü›‹ØþH,‚“¼HpŒH`ˆ–’HЂˆ–’HŒü–üàHÈHLöH@›‹ØþHp‚“¼H´ŒH¤ˆ–’H‚ˆ–’HÐü–üàH HöH„›‹ØþH´‚“¼HøŒH舖’HX‚ˆ–’Hü–üàHPHÔöHÈ›‹ØþH ø‚“¼H <ŒH,ˆ–’H œ‚ˆ–’H Xü–üàH ”H öH ›‹ØþH h‚“¼H ¬ŒH pˆ–’H ‚ˆ’Âü–üàH H ˆöH |›‹ØþHØ‚“¼HŒHàˆ–’H|‚ˆ’Âü–üàHtHøöH웋ØþH‚“¼H`ŒHPˆ–’HÀ‚ˆ–’H|ü–üàH¸H<öH0›‹ØþH`‚“¼H¤ŒH”ˆ–’H‚ˆ–’HÀü–üàHüH€öHt›‹ØþGþ¤‚“¼GÿèŒH؈–’HH‚ˆ–’Hü–üàGÿ@GÿÄöGþ¸›‹ØþGûè‚“¼Gý,ŒGþˆ–’GýŒ‚ˆ–’GýHü–üàGü„GýöGûü›‹ØþGù,‚“¼GúpŒGû`ˆ–’GúЂˆ–’GúŒü–üàGùÈGúLöGù@›‹ØþGöp‚“¼G÷´ŒGø¤ˆ–’Gø‚ˆ–’G÷Ðü–üàG÷ G÷öGö„›‹ØþGó´‚“¼GôøŒGõ舖’GõX‚ˆ–’Gõü–üàGôPGôÔöGóÈ›‹ØþGñ$‚“¼GòhŒGó,ˆ–’GòÈ‚ˆ’Âü–üàGñÀGòDöGñ8›‹ØþG“¼GïØŒG𜈖’Gð8‚ˆ’Âü–üàGï0Gï´öG‹ØþGëØ‚“¼GíŒGî ˆ–’Gí|‚ˆ–’Gí8ü–üàGìtGìøöGë웋ØþGé‚“¼Gê`ŒGëPˆ–’GêÀ‚ˆ–’Gê|ü–üàGé¸Gê<öGé0›‹ØþGæ`‚“¼G礌G蔈–’G肈–’GçÀü–üàGæüGç€öGæt›‹ØþG㤂“¼GäèŒGåØˆ–’GåH‚ˆ–’Gåü–üàGä@GäÄöG㸛‹ØþGàè‚“¼Gâ,ŒG㈖’G⌂ˆ–’GâHü–üàGá„GâöGàü›‹ØþGÞ,‚“¼GßpŒGà`ˆ–’GßЂˆ–’Gߌü–üàGÞÈGßLöGÞ@›‹ØþGÛp‚“¼GÜ´ŒGݤˆ–’GÝ‚ˆ–’GÜÐü–üàGÜ GÜöGÛ„›‹ØþGØà‚“¼GÚ$ŒGÚ舖’GÚ„‚ˆ’Âü–üàGÙ|GÚöGØô›‹ØþGÖl‚“¼G×°ŒGØ„ˆ’GØ ‚ˆ’G×Ìü–ü—ÉG×G׌öGÖ€›‹ØþGÓø‚“¼GÕ<ŒGÖˆ’GÕ¬‚ˆ’GÕXü–ü—ÉGÔ”GÕöGÔ ›‹Øþøü5ÄGÓpˆ›‘Òþø5´GÓ`ü5¤GÒÀˆ›Ÿì†Òþø5˜GÒ¨ƒù5”GÒƒù5ˆGÒxƒù5pGÒ\†üü5\GÑÀˆ›Ÿì†Òþø5XGѨƒù5TGÑ4²ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüò†ƒù5PGÑüò†ƒù5@GЄ²ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üü5<GÊT²—üGͪ–GÏfüõ›GÐ$‹‹ò„øèGÏ”†‹‹˜ê„øèÖþGͶGÎÔèGÍ®û²ò‚GÌ –ðGÍ4èGÌû²ò‚GÊÈ›Gˤ‹‹ò„øèGˆ‹‹˜ê„øèÖþö‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üü58F³²—üGÄ–GÉ6üõ›GÉô‹‹ò„øèGÉd†‹‹˜ê„øèÖþGÄÎGÈtèÐèÐèèèÄèÐèGÄÆû²ò‚GÁâ–GÞüõ›GÄ\‹‹ò„øèGÃ̆‹‹˜ê„øèÖþGÁîGà èGÁæû²ò‚G¼Ú–GÀ¾üõ›GÁ|‹‹ò„øèGÀ솋‹˜ê„øèÖþG¼æG¿üèÐèÐèÐèèèG¼Þû²ò‚G»‚–ðG¼|èG»†û²ò‚F³›G»‹‹ò„øèF³Ü†‹‹Gºôê„F´›‘GºtŒþŠò„øG¹èŽŒþŠò„øG¹xŽŒþŠò„øÌŽG¸àŽŒþŠò„øG¸pŽŒþŠò„øG¸ŽŒþŠò„øÌŽÞŽÞŽÞŽG¶ðŽŒþŠò„øG¶€ŽŒþŠò„øG¶ŽŒþŠò„øGµ ŽŒþŠò„øGµ0ŽŒþŠò„øG´ÀŽŒþŠò„øÌŽÞŽG´ŽŒþŠò„øG³ŽŒþŠò„øG³ ŽŒþŠò„øG²°ŽŒþŠò„øG²@ŽŒþŠò„øG±ÐŽŒþŠò„øÌŽÞŽÞŽÞŽG°ÀŽŒþŠò„øG°PŽŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÂŽŒò„øF´dFùØG¬Äò„FùÔ¬G¬œÞŽÞŽÞŽÞŽÞŽG«HŽŒþŠò„øGªØŽŒþŠò„øÌŽÞŽÞŽÞŽG©ÈŽŒþŠò„øÌŽÞŽG©ŽŒþŠò„øG¨˜ŽŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽG¦˜ŽŒþŠò„øG¦(ŽŒþŠò„øG¥¸ŽŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽG |ŽŒŒþŠ–èŠþØ„øFú$þG 6õGŸ<·èÖGž`·èÖGTGžèèÖGœGèèèÖGšÜG›ÈèèèÖG™ÐGštèÊG˜ÄG™hèÊG—¸G˜\èÊG–¬G—PèÊG• G–DèÊG”LG• èèÊG’øG“ÌèèÊG‘¤G’xèèÊGPG‘$èèÊGDGèèÖGŽGŽôèèèÖGŒ´GˆèèÊG‹`GŒ4èèÊGŠ GŠàèèÊGˆ¸G‰ŒèèÊG‡dGˆhèèèÊG…øG‡èèèèÖG„ìG…¨èèÖGƒàG„œèèÖG‚¼GƒèèÊGhG‚lèèèÊG€\GèèÖG G€ èèèÖG}´G~ÐèèèèÖG|G}dèèèèèÖG{ G{ÈèèÖGz·èÖGx”Gy€èèèÖGw ·èÖFúGwŒò‚Fùæþ³Gm GqÀ—üGsn–ðGw ÜÐèèèÐÐèèèÜèèÁû¦ÖGqЦõGr¸ŽªÔŠþŠò„øàð†üè†üð†üð†üÎþGm¤—üGoR–ðGqlèÐÜÐèèÁû¦ÖGm´¦õGnœŽªÔŠþŠò„øàð†üè†üð†üð†üÎþøGdp„GhL—üGiÞ–ðGmHÜÐèèèÐÐèèèèèÁû¦ÖGh\¦õGi(ŽªÔŠþŠò„øàð†üè†üð†üÎþGd|—üGf–ðGgøèÐÜÐèÁû¦ÖGdŒ¦õGeXŽªÔŠþŠò„øàð†üè†üð†üÎþøG[x„G_T—üG`æ–ðGdÐèèèÐÐèèèèèÁû¦ÖG_d¦õG`0ŽªÔŠþŠò„øàð†üè†üð†üÎþG[„—üG]–ðG_èÐÜÐèÁû¦ÖG[”¦õG\`ŽªÔŠþŠò„øàð†üè†üð†üÎþøGX\„GXô—üGY¶–ðG[ÜèèèÁû¦ÖGY¦õ§üð†üÎþGXhˆ¦õ™üÎþøGTØ„GUŒ—üGVj–ðGWôÜèèèèÁû¦ÖGUœ¦õµüð†üð†üÎþGT䈦õ§üð†üÎþøGQ¼„GRT—üGS–ðGTpÜèèèÁû¦ÖGRd¦õ§üð†üÎþGQȈ¦õ™üÎþøGO,†—üGOú–ðGQTÜèèèÁû¦ÖGOH¦õ§üð†üÎþøGN|†ˆ¦õ§üð†üÎþøGHÀ†ƒš‘GNpÞŽÞŽGIGMF·èÖGKDGLØÜÜÜÜÊGIGK0GI òúþ³GKˆþöGJ8†ˆ¦õµüð†üð†üÎþøGIh†ˆ¦õ¯ü膋ñÎþøò†ƒùôüþÊGC°†ƒš‘GH´ÞŽÞŽGD GGŠ·èÖGFGGÜÜÊGDGFGCúòúþ³GEäˆþöGE(†ˆ¦õ§üð†üÎþøGDX†ˆ¦õ¯ü膋ñÎþøò†ƒùôüþÊGC†ˆžþŠò„øÚöGBˆ†ˆžþŠò„øÚöG?à„GAˆ¦õGBxüð†üð†üð†üð†üÎþG@¬‚ˆ¦õGA|üð†üð†üð†üÎþG?숦õµüð†üð†üÎþøG? †ˆ¦õ§‹ñð†üÎþøG>Œ†ˆžþŠò„øÚöG=„G=̈¦õµüð†üð†üïßþG=$ˆ¦õ§üð†üïßþøG<„†ˆžþŠò„øÚöG;ð†ˆžþŠò„øÚöG;@†ˆ¦õ§üð†üÎþøG:†ˆ¦õ§üð†üÎþøG4ì„G6œ—üG7––ðG9øÜèèèèÜèèèÁû¦ÖG6¬¦õG7xüè†üð†üð†üÎþG5¸‚ˆ¦õG6ˆüð†üð†üð†üÎþG4øˆ¦õµüð†üð†üïßþøG3Ì„G4dˆ¦õ™üïßþG3؈¦õ™üïßþøG2¬„G3Dˆ¦õ™üïßþG2¸ˆ¦õ™üïßþøG18„G1숦õµüð†üð†üÎþG1Dˆ¦õ§üð†üÎþøG0¤†ˆžþŠò„øÚöG0†ˆžþŠò„øÚöG/|†ˆžþŠò„øÚöG.\„G.ôˆ¦õ™üïßþG.hˆ¦õ™üïßþøG-<„G-Ôˆ¦õ™üïßþG-Hˆ¦õ™üïßþøG,„G,´ˆ¦õ™üïßþG,(ˆ¦õ™üïßþøG*ü„G+”ˆ¦õ™üïßþG+ˆ¦õ™üïßþøG*h†ˆ¦õ™üïßþøG%ð„G&À—üG'ž–ðG)ÐÜèèèèÜèèÁû¦ÖG&Цõ½üè†üð†üÎþG%üˆ¦õµüð†üð†üÎþøG$„G!œ—üG"––ðG%XÜèèèèÜèèÐèÁû¦ÖG!¬¦õG"xüð†üè†üð†üÎþGì‚—üGΖðG!ÜèèèèÜèèÁû¦ÖG¦õ½üè†üð†üÎþG ‚ˆ¦õGÜüð†üð†üð†üïßþG(‚ˆ¦õµ‹ˆéð†üð†üïßþG€‚ˆ¦õ§üð†üïßþGÈ‚ˆ¦õ§‹ñð†üïßþG0ˆ¦õ™‹ñïßþøÞ†ƒ‹†øðÞ†ƒ‹†øðȆƒ‹†øðȆƒ‹†øðFüÔ†ƒš‘GÀÞŽÞŽÆŽ†GTކž†øG,ŽGxŽœGôèèèG¬ú›Ÿüð†üGÄŽœG@èèèGøú›Ÿüð†üGœŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽFý0GžõGtG0èèÖGhG$ÜÊG üG èÊG ð«ÊG TG ¸ÜG ÈôÖG H«ÊG¬G ÜG ôÖGзèÖG$«ÊFý&GFýòúþ³G„ˆ¦õ™üïßþøê†ˆþöð†ƒùGø„Gˆ¦õ£ð†üïßþGˆ¦õ™üïßþøG¬„GTˆ¦õ£ð†üïßþG¸ˆ¦õ¡üç’ÍþøG†ˆ¦õ™üïßþøG„†ˆ¦õ™üïßþøFÿ„GȈ¦õ§ŽþŠG0ŒþŠò„øGÌ„ŒþŠò„øÊ„øèð†üÎþFÿ¼‚ˆ¦õ§‹‹†øèð†üÎþFÿ$ˆ¦õ™‹ñÎþøð†ƒùFþX†ƒ‹þаò„Ü„øèFý´†ƒ‹þаò„Ü„øèð†ƒùð†ƒùò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒˆñà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðð†ƒùFúl†ƒ‹ŒþŠ–èŠþØ„øðò†ƒùôüþF´\FùŠõFø·èÖF÷´·èÖFö¨F÷dèèÖFõlFöXèèèÖFô0FõèèèÖFó$FóÈèÊFñÐFò¤èèÊFð|FñPèèÊFï(FïüèèÊFíÔFî¨èèÊFì€Fí„èèèÊFëFì0èèèèÖFêFêÄèèÖFèÌFé¸èèèÖFç`Fè|èèèèÖFåÄFçèèèèèÖFäFå,èèèèÖF´RFãàŒ†øòò‚F´"þ³Fã4ˆžþŠò„øÚöF┆ˆžþŠò„øÚöFↈžþŠò„øÚöFÞ¬„Fß`—üFà>–ðFá°èÜèÜÁû¦ÖFßp¦õµüð†üð†üÎþFÞ¸ˆ¦õ§üð†üÎþøFÞ†ˆžþŠò„øÚöFÝ„†ˆžþŠò„øÚöFÜð†ˆžþŠò„øÚöFÚH„FÛøˆ¦õFÜàüð†üð†üð†üð†üÎþFÛ‚ˆ¦õFÛäüð†üð†üð†üÎþFÚTˆ¦õµüð†üð†üÎþøFÙˆ†ˆ¦õ§‹ñð†üÎþøFØô†ˆžþŠò„øÚöFØ`†ˆžþŠò„øÚöF×̆ˆžþŠò„øÚöF×8†ˆžþŠò„øÚöFÖ¤†ˆžþŠò„øÚöFÖ†ˆžþŠò„øÚöFÐ<„FÑì—üFÒæ–ðFÕxÜèèèèÜèèèèÁû¦ÖFÑü¦õFÒÈüè†üð†üð†üÎþFÑ‚ˆ¦õFÑØüð†üð†üð†üÎþFÐHˆ¦õµüð†üð†üïßþøFϨ†ˆžþŠò„øÚöFφˆžþŠò„øÚöF΀†ˆžþŠò„øÚöFÍ솈žþŠò„øÚöFÍX†ˆžþŠò„øÚöFÌĆˆžþŠò„øÚöFˤ„FÌ<ˆ¦õ™üïßþF˰ˆ¦õ™üïßþøFÊ„„Fˈ¦õ™üïßþFʈ¦õ™üïßþøFÉð†ˆžþŠò„øÚöFÉ\†ˆžþŠò„øÚöFÈȆˆ¦õ™üïßþøFÄ „FÄð—üFÅΖðFÈ0ÜèèèèÜèèèÁû¦ÖFŦõ½üè†üð†üÎþFÄ,ˆ¦õµüð†üð†üÎþøF¸„F¿œ—üFÀ––ðFÈÜèèèèÜèèèÐèÁû¦ÖF¿¬¦õFÀxüð†üè†üð†üÎþF»¼‚—üF¼ž–ðF¿ÜèèèèÜèèèÁû¦ÖF»Ð¦õ½üè†üð†üÎþFºÜ‚ˆ¦õF»¬üð†üð†üð†üÎþFº‚ˆ¦õµ‹ñð†üð†üÎþF¹`‚ˆ¦õ§üð†üÎþF¸¨‚ˆ¦õ§‹ñð†üÎþF¸ˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øðà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þð̆ƒ‹þŠò„øè̆ƒ‹þŠò„øèà†ƒ‹þðà†ƒ‹þðĆƒ‹˜ê„øðò†ƒùôüþF³àÖþö‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüò„†üü54F²øüÚ„žú‚ú‚ú‚ú‚ú‚ú‚üü5(F²˜ƒù5$F²|ƒù5F¢ F°t“®F±„Œ¦ˆ–’F± ü–üàF°ð¸F°„›ãþF®p‚“®F¯„Œ¦ˆ–’F¯ ü–üàF®ð¸F®„›ãþF¬p‚“®F­„Œ¦ˆ–’F­ ü–üàF¬ð¸F¬„›ãþFªp‚“®F«„Œ¦ˆ–’F« ü–üàFªð¸Fª„›ãþF¨p‚“®F©„Œ¦ˆ–’F© ü–üàF¨ð¸F¨„›ãþF¦p‚“®F§„Œ¦ˆ–’F§ ü–üàF¦ð¸F¦„›ãþF¤Œ‚“®F¥ Œ®ˆ’F¥¼ü–ü—ÉF¥ ¸F¤ ›ãþF¢¨‚“®F£¼Œ®ˆ’F£Øü–ü—ÉF£(¸F¢¼›ãþøüò†ƒù5F¢tƒùꄎú‚ú‚üü5F¡Èˆ›‘Òþø5F¡¸ü5 F¡¨üò„†üü5F¡ ˆ›‘óßþø5F ð†üü5F Üƒùò„†üüò†ƒù4üFŸðˆ›™†ì†Òþø4ìFFè“®FžøŒ¦ˆ–’FŸü–üàFžd¸Fø›ãþF›ä‚“®FœøŒ¦ˆ–’Fü–üàFœd¸F›ø›ãþF™ä‚“®FšøŒ¦ˆ–’F›ü–üàFšd¸F™ø›ãþF—ä‚“®F˜øŒ¦ˆ–’F™ü–üàF˜d¸F—ø›ãþF•ä‚“®F–øŒ¦ˆ–’F—ü–üàF–d¸F•ø›ãþF“ä‚“®F”øŒ¦ˆ–’F•ü–üàF”d¸F“ø›ãþF’‚“®F“Œ®ˆ’F“0ü–ü—ÉF’€¸F’›ãþF‚“®F‘0Œ®ˆ’F‘Lü–ü—ÉFœ¸F0›ãþøüò†ƒù4ÌFDˆ›­ì†ì†Òþø4¸F4üFŒ8†“¼F„Š˜FŽ ˆ–’FŽ‚ˆ–’FÌü–üÊFŒÜF`öFŒT›‹Øþøê„Žú‚ú‚üüò„†üü4´F‹èüò„†üü4°F‹´†üü4¬F‹¨üò†ƒù4¨F{´F‰ˆ“®FŠ˜Œ¦ˆ–’FŠ´ü–üàFЏF‰˜›ãþF‡„‚“®Fˆ˜Œ¦ˆ–’Fˆ´ü–üàFˆ¸F‡˜›ãþF…„‚“®F†˜Œ¦ˆ–’F†´ü–üàF†¸F…˜›ãþFƒ„‚“®F„˜Œ¦ˆ–’F„´ü–üàF„¸Fƒ˜›ãþF„‚“®F‚˜Œ¦ˆ–’F‚´ü–üàF‚¸F˜›ãþF„‚“®F€˜Œ¦ˆ–’F€´ü–üàF€¸F˜›ãþF} ‚“®F~´Œ®ˆ’F~Ðü–ü—ÉF~ ¸F}´›ãþF{¼‚“®F|ÐŒ®ˆ’F|ìü–ü—ÉF|<¸F{Лãþøüò†ƒùò„†üü4 F{xüFq@†“¼FrŒŠ˜Fz䈖’FzT‚ˆ–’FrÔü–Fsž’FuhFz’Fu`øüôøüøüøüøüøüøüøüøüFs¼FtTööFsˆþþFr𗈋Fr„FqäFrhöFq\›‹Øþø4˜Fq<ü4ŒFpÔˆþþø4€FpÄü4xFp¬ƒù4tFp”ƒù4pFn`“®FopŠ˜¦ˆ–’Fo¸ü–üÊFnܸFnp›ãþø4`F^„FlX“®FmhŒ¦ˆ–’Fm„ü–üàFlÔ¸Flh›ãþFjT‚“®FkhŒ¦ˆ–’Fk„ü–üàFjÔ¸Fjh›ãþFhT‚“®FihŒ¦ˆ–’Fi„ü–üàFhÔ¸Fhh›ãþFfT‚“®FghŒ¦ˆ–’Fg„ü–üàFfÔ¸Ffh›ãþFdT‚“®FehŒ¦ˆ–’Fe„ü–üàFdÔ¸Fdh›ãþFbT‚“®FchŒ¦ˆ–’Fc„ü–üàFbÔ¸Fbh›ãþF`p‚“®Fa„Œ®ˆ’Fa ü–ü—ÉF`ð¸F`„›ãþF^Œ‚“®F_ Œ®ˆ’F_¼ü–ü—ÉF_ ¸F^ ›ãþøü4XF^xüF]܆ˆþ‘óßþøö†ü4HFX<“®FYLŠ˜F]Dˆ–’FY”ü–FZB’F[<F\ô’F[4øüøüøüFZ`¸FZ,þþÆ—ˆFYDFX¸¸FXL›ãþø4DFX,ü4@FXü44FQô“®FSŽFUþ––˜FWDþ–’FU€–˜þ–˜þ˜¦Üü–üêêêêêêFSþ˜FT$þ–’FSD˜þ–’FRüFRp¸FR›ãþø4,FQ؃ù4$FNÀFO\“¼FPœŒFQpˆ’FQ ‚ˆ’êÐü–ü—ÓöFOôFPxøþFOl›‹†óßþFNĈ›‹†óßþø4FN´üò„†üü4FNŒü4FN@†þø4FN(ƒù4 FNü4F><FL“®FM Œ¦ˆ–’FM<ü–üàFLŒ¸FL ›ãþFJ ‚“®FK Œ¦ˆ–’FK<ü–üàFJŒ¸FJ ›ãþFH ‚“®FI Œ¦ˆ–’FI<ü–üàFHŒ¸FH ›ãþFF ‚“®FG Œ¦ˆ–’FG<ü–üàFFŒ¸FF ›ãþFD ‚“®FE Œ¦ˆ–’FE<ü–üàFDŒ¸FD ›ãþFB ‚“®FC Œ¦ˆ–’FC<ü–üàFBŒ¸FB ›ãþF@(‚“®FA<Œ®ˆ’FAXü–ü—ÉF@¨¸F@<›ãþF>D‚“®F?XŒ®ˆ’F?tü–ü—ÉF>ĸF>X›ãþøüö†üò†ƒù3ôF>üö†üò†ƒù3ðF=\ˆ›‘ÒþøF<”†ˆ›­ì†ì†óßþø3ìF%F:“¼F;HŒF<8ˆ’F;¨‚ˆ–’F;dü–üàF: F;$öF:›‹ØþF7t‚“¼F8¸ŒF9¨ˆ’F9‚ˆ–’F8Ôü–üàF8F8”öF7ˆ›‹ØþF4ä‚“¼F6(ŒF7ˆ’F6ˆ‚ˆ–’F6Dü–üàF5€F6öF4ø›‹ØþF2T‚“¼F3˜ŒF4ˆˆ’F3ø‚ˆ–’F3´ü–üàF2ðF3töF2h›‹ØþF/Ä‚“¼F1ŒF1øˆ’F1h‚ˆ–’F1$ü–üàF0`F0äöF/Ø›‹ØþF-4‚“¼F.xŒF/hˆ’F.Ø‚ˆ–’F.”ü–üàF-ÐF.TöF-H›‹ØþF*À‚“¼F,ŒF,؈’F,t‚ˆ’F, ü–ü—ÉF+\F+àöF*Ô›‹ØþF%˜‚“¼F&ÜŒF*dˆ’F*‚ˆ’F&øü–F'Â’F(ˆŠ˜F)¤ˆ’F)‚ˆ–’F(Ðü–üÊF'àF(döF'¬þþF'—ˆ‹F&ÔF&4F&¸öF%¬›‹ØþøüFŒ„F#Œ“®F$œŒ¦ˆ–’F$¸ü–üàF$¸F#œ›ãþF!ˆ‚“®F"œŒ¦ˆ–’F"¸ü–üàF"¸F!œ›ãþFˆ‚“®F œŒ¦ˆ–’F ¸ü–üàF ¸Fœ›ãþFˆ‚“®FœŒ¦ˆ–’F¸ü–üàF¸Fœ›ãþFˆ‚“®FœŒ¦ˆ–’F¸ü–üàF¸Fœ›ãþFˆ‚“®FœŒ¦ˆ–’F¸ü–üàF¸Fœ›ãþF¤‚“®F¸Œ®ˆ’FÔü–ü—ÉF$¸F¸›ãþFœ‚“®F°ŒFHˆ’FÌü–Fz’F,Š˜¦ˆ–’Ftü–üÊF˜¸FdþþÆ—ˆÁF¸F°›ãþøüö†ü3èFˆ›ãþø3äFìƒù3àFÜüFL†ˆ›ãþø3ÔFHü3ÌF„“¼FÄŠ˜Fàˆ’FP‚ˆ–’F ü–üÊFF öF”›‹ØþøF$†“®F@Š˜Fðˆ–’Fˆü–F6’FðF ’FèøüøüøüøüøüøüøüôøF –––üêFøF¸þ–˜þ˜¦Üü–üêêFøøFþ–’FàFT¸F þþÆ—ˆF8F¬¸F@›ãþøEôL„F(“®F8Œ¦ˆ–’FTü–üàF¤¸F8›ãþF$‚“®F8Œ¦ˆ–’FTü–üàF¤¸F8›ãþEþ$‚“®Eÿ8Œ¦ˆ–’EÿTü–üàEþ¤¸Eþ8›ãþEü$‚“®Eý8Œ¦ˆ–’EýTü–üàEü¤¸Eü8›ãþEú$‚“®Eû8Œ¦ˆ–’EûTü–üàEú¤¸Eú8›ãþEø$‚“®Eù8Œ¦ˆ–’EùTü–üàEø¤¸Eø8›ãþEö@‚“®E÷TŒ®ˆ’E÷pü–ü—ÉEöÀ¸EöT›ãþEô\‚“®EõpŒ®ˆ’EõŒü–ü—ÉEôܸEôp›ãþøü3ÈEôHüò†ƒù3¼EäTEò(“®Eó8Œ¦ˆ–’EóTü–üàEò¤¸Eò8›ãþEð$‚“®Eñ8Œ¦ˆ–’EñTü–üàEð¤¸Eð8›ãþEî$‚“®Eï8Œ¦ˆ–’EïTü–üàEEî8›ãþEì$‚“®Eí8Œ¦ˆ–’EíTü–üàE줸Eì8›ãþEê$‚“®Eë8Œ¦ˆ–’EëTü–üàEꤸEê8›ãþEè$‚“®Eé8Œ¦ˆ–’EéTü–üàE褸Eè8›ãþEæ@‚“®EçTŒ®ˆ’Eçpü–ü—ÉEæÀ¸EæT›ãþEä\‚“®EåpŒ®ˆ’EåŒü–ü—ÉEäܸEäp›ãþøü3¬EäHü3¨EãĈ›‘Òþø3˜E㬃ù3”Eãœüꄎú‚ú‚üü3EߘEሓ®E☌®ˆ’Eâ´ü–ü—ÉEâ¸EᘛãþEß ‚“®Eà´Œ®ˆ’EàÐü–ü—ÉEà ¸Eß´›ãþøü3tEß„ƒù3pEßtü3dEß\ƒù3\EÞ¼ˆ›Ÿì†ÒþøEÞ,†ˆ›‘ÒþøEÝp†ˆ›™†ì†Òþø3LEÝ`†üü3HEÝTüò†ƒù3DEÝ ƒùö†ü3@EÜTˆ›™†ì†óßþøò„†üü3<EÜ ƒùð†ƒùò†ƒù38EÛÜü34EÛÀƒù3(EÛ<ˆ›‘Òþø3$EÚ€ˆ›™ò†Òþø3 EÚdƒù3EÚLƒù3 EÙˆ›™†ì†óßþøEØÈ†ˆ›­ìò†Òþø3Eظƒù3EØœƒù2ðE×àˆ›­ìò†Òþøö†ü2ìE´4EÕÈ“®EÖØŒ¦ˆ–’EÖôü–üàEÖD¸EÕØ›ãþEÓÄ‚“®EÔØŒ¦ˆ–’EÔôü–üàEÔD¸EÓØ›ãþEÑÄ‚“®EÒØŒ¦ˆ–’EÒôü–üàEÒD¸EÑØ›ãþEÏÄ‚“®EÐØŒ¦ˆ–’EÐôü–üàEÐD¸EÏØ›ãþEÍÄ‚“®EÎØŒ¦ˆ–’EÎôü–üàEÎD¸EÍØ›ãþEËÄ‚“®EÌØŒ¦ˆ–’EÌôü–üàEÌD¸EËØ›ãþEǼ‚“®EÈÐŒEËhˆ’EÈìü–EÉš’EÊLŠ˜¦ˆ–’EÊ”ü–üÊEɸ¸EÉ„þþÆ—ˆÁEÈ<¸EÇЛãþEä‚“®EĸŒEÇ`ˆ’EÄÔü–EÅ‚’EÆ4Š˜®ˆ–’EÆ|ü–ü—EÆ,EÅ ¸EÅlþþÆ—ˆÁEÄ$¸Eø›ãþE´8“®E·œEÃX’E·”øüøüøüøüôøüøüôøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüE´´Eµ8öE´H›ãþøö†ü2èE´ƒù2ÜE³pˆ›Ÿì†ÒþøE²Ä†ˆ›Ÿì†Òþø2ÐE­,“®E®<ŽE°`–˜E²x’E°¸–˜þ–˜þ˜¦Üü–üêêêêêêE®TE°’E®P˜E¯\þ–’E®|˜þ–’E®4E­¨¸E­<›ãþø2ÌE¬Œˆ›Ÿì†Òþø2ÈE«ìˆ›Ÿì†Òþø2ÀE«Üü2¼E«Ìü2°Eª@ƒúþŸE«¤„„þöꆆöEª †ˆ¦õ·ä†‹Ø’ÍþøôüþÜ2¬Eª0ü2 Eªƒù2œE©Xˆ›™ò†Òþø2˜E©<ƒùE§†“®E¨ Š–˜þ–’êêÊE§ŒºþE§ ›‘Òþøö†ü2E™@ƒE¦èþE™ZE¦ÔE™VþŸE¦ÄƒùEœ`„E¦ˆ¦õ§ì†ÊþE¡l‚“E¢E¢ðE¥Ä’E¢ìE¥œE¢èøE¤pE¥ þ–E¤l––’êêêE¢ÔE¤DE¢Ðø¢˜E£àˆ’êÊ‚ˆ’Âü–üêêÞE¢E¢ þøþE¡€¦õ§üð†üÎþEœl“EEìE¡ ’EèE øEäøEŸ|E ,þ––þþEŸx––’êêêEÐEŸPEÌø¢˜Ežìˆ’ꂈ’—Ež4ü–üêêÞEEœþøþEœ|¦õ§üð†üÎþøE›Ì†ˆ¦õ™ÊþøE› †ˆ¦õ¯ì†ã’ÍþøEš\†—ñ¦õ“†ÊþøE™œ†—ñ¦õ“†‹E™´þøôüþÞ2ŒE™Šú‚üü2„E˜€ˆ›Ÿì†Òþø2tE˜d†üü2lE˜Pƒù2hE—°ˆ›Ÿì†óßþøò†ƒù2dE—Pƒˆñ2`E—8ƒù2\E—(üE–`†ˆ›™†ì†ÒþøE•À†ˆ›Ÿì†Òþøò†ƒù2LE•0ˆ›‘Òþø2@E…TE“(“®E”8Œ¦ˆ–’E”Tü–üàE“¤¸E“8›ãþE‘$‚“®E’8Œ¦ˆ–’E’Tü–üàE‘¤¸E‘8›ãþE$‚“®E8Œ¦ˆ–’ETü–üàE¤¸E8›ãþE$‚“®EŽ8Œ¦ˆ–’EŽTü–üàE¤¸E8›ãþE‹$‚“®EŒ8Œ¦ˆ–’EŒTü–üàE‹¤¸E‹8›ãþE‰$‚“®EŠ8Œ¦ˆ–’EŠTü–üàE‰¤¸E‰8›ãþE‡@‚“®EˆTŒ®ˆ’Eˆpü–ü—ÉE‡À¸E‡T›ãþE…\‚“®E†pŒ®ˆ’E†Œü–ü—ÉE…ܸE…p›ãþøü28E…@ƒù20Ew€ƒE…(þEwšE…Ew–þŸE…ƒùEz „E„Tˆ¦õ§ì†ÊþE¬‚“E€^E0E„’E,EƒÜE(øE‚°Eƒ`þ–E‚¬––’êêêEE‚„Eø¢˜E‚ ˆ’êÊ‚ˆ’Âü–üêêÞE€XE€àþøþEÀ¦õ§üð†üÎþEz¬“E{ZE|,E`’E|(E8E|$øE}¼E~lþ––þþE}¸––’êêêE|E}E| ø¢˜E},ˆ’ꂈ’—E|tü–üêêÞE{TE{ÜþøþEz¼¦õ§üð†üÎþøEz †ˆ¦õ™ÊþøEyL†ˆ¦õ¯ì†ã’ÍþøExœ†—ñ¦õ“†ÊþøEw܆—ñ¦õ“†‹EwôþøôüþÞö†ü2$Ew`üEvĆˆþ‘óßþø2 EvLˆ›‘Òþø2EbÀƒEv4þEbÚEv EbÖþŸEvƒùEmä„Eqä“EržEspEu¸’EslEuEshøEtdEuþ–Et`––’êêêEsTEt8EsPø¤¦ˆ’Âü–üêÞEr˜Es þøþEqô¦÷þ§üð†üÎþEmð“¼EoLEq”’EoHEqlEoDøEp@Epðþ–Ep<––’êêêEo0EpEo,ø¤¦ˆ’Âü–üêÞEnˆºþEn¦÷þ™üÎþøEk솓ElÂEmdŠš—Ë—ßEl¼EmDþøþEl¦÷þ¯üð†üç’ÍþøEfH†“¼EhôøEkp¦„Øü’EgðþôøEjð’EgÀEjÈEg¼øEj¦ˆ’Âü–üEg¨EiìEg¤øEh`Ei þ––þþEh\––’—ÓêêEgEh4EgŒEfìEgpøþEfd¦÷þ™üÎþøEdŒ†“¼EeÄŠ¥ñþèöEe0ºþEd¨¦÷þ™üïßþøEc܆—ñ¦õ“†ÊþøEc†—ñ¦õ“†‹Ec4þøôüþÞò†ƒù2 Ea숛­ìò†óßþø2E`8ƒúþŸEaÄ„„þöꆄ‚öꆆöE`˜†ˆ¦õ·ä†‹Ø’ÍþøôüþÜ2E`ƒù1øE`†üü1ðE_œˆþþøò†ƒù1ìE_tü1äE_\ƒù1ØE_LüE\,„E\Г¼E^ŒE^䈒êÊ‚ˆ’êÐü–ü—ÓöE]hE]ðþøþE\à›Ÿì†óßþE\8ˆ›Ÿì†óßþø1ÀE\(ü1´E\Šú‚üü1¨E[øü1¤E[àƒù1 ELEYØ“®EZ茦ˆ–’E[ü–üàEZT¸EYè›ãþEWÔ‚“®EX茦ˆ–’EYü–üàEXT¸EWè›ãþEUÔ‚“®EV茦ˆ–’EWü–üàEVT¸EUè›ãþESÔ‚“®ET茦ˆ–’EUü–üàETT¸ESè›ãþEQÔ‚“®ER茦ˆ–’ESü–üàERT¸EQè›ãþEOÔ‚“®EP茦ˆ–’EQü–üàEPT¸EOè›ãþEMð‚“®EOŒ®ˆ’EO ü–ü—ÉENp¸EN›ãþEL ‚“®EM Œ®ˆ’EM<ü–ü—ÉELŒ¸EL ›ãþøü1EKøü1tEKàƒù1pEI¬“®EJ¼Š˜¦ˆ–’EKü–üÊEJ(¸EI¼›ãþø1hEIü1dEItü1TEIdü1PEIHüEC†“®ED0ŽEF,þ––˜EHpþ–’EF¬–˜þ–˜þ˜¦Üü–üêêêêêêEDHþ˜EEPþ–’EDp˜þ–’ED(ECœ¸EC0›ãþø1HEBdˆ›­ìò†óßþøE@$†“®EA@Š˜¦ˆ–’EAˆü–üÊE@¬¸E@@›ãþø1DE,¤ƒE@þE,¾E@E,ºþŸE?ôƒùE7È„E;È“E<‚E=TE?œ’E=PE?tE=LøE>HE>øþ–E>D––’êêêE=8E>E=4ø¤¦ˆ’Âü–üêÞE<|E=þøþE;ئ÷þ§üð†üÎþE7Ô“¼E90E;x’E9,E;PE9(øE:$E:Ôþ–E: ––’êêêE9E9øE9ø¤¦ˆ’Âü–üêÞE8lºþE7ä¦÷þ™üÎþøE5І“E6¦E7HŠš—Ë—ßE6 E7(þøþE5ì¦÷þ¯üð†üç’ÍþøE0,†“¼E2ôøE5T¦„Øü’E1ÔþôøE4Ô’E1¤E4¬E1 øE3ü¦ˆ’Âü–üE1ŒE3ÐE1ˆøE2DE3þ––þþE2@––’—ÓêêE1tE2E1pE0ÐE1TøþE0H¦÷þ™üÎþøE.p†“¼E/¨Š¥ñþèöE/ºþE.Œ¦÷þ™üïßþøE-À†—ñ¦õ“†ÊþøE-†—ñ¦õ“†‹E-þøôüþÞ10E,”üE*†“®E+,ŒE,Šþ–üêÊ‚ˆ’E+Hü–ü—ÉE*˜¸E*,›ãþøò†ƒù1$E),ˆ›»ìòò†Òþø1E(pˆ›™†ì†Òþø1E'숛‘Òþø1E$ÔE%p“¼E&°ŒE'„ˆ’êÊ‚ˆ’êÐü–ü—ÓöE&E&þøþE%€›Ÿì†óßþE$؈›Ÿì†óßþøĔƒŽúþŸE$Àƒùꆄ„þöꆈþöE à†“E!šE"<Œþ˜E#„ˆ––’êêêE"È‚ˆ––’êêêØü–üÊE!”E"þøþE ü¦õ§üð†üÎþøE\†“EE¸Œþ˜E ˆ––’êêêED‚ˆ––’êêêØü–üÊEE˜þøþEx¦õ§üð†üÎþøE¸†“ErEŒþ˜Elˆ––’—ÓêêE°‚ˆ––’êêêÐü–ü—E ElEôþøþEÔ¦õ§üð†üÎþøE´†“¶EàŠ––š—Ë—ÓêöELºþEЦõ™üïßþøE†ˆ¦õ§ì†ÊþøE4†ˆ¦õ·ä†‹Ø’ÍþøôüþÞ0àEˆ›»ìòò†Òþø0ÈE|ˆ›‘Òþøò†ƒù0ÀEàˆ›‘Òþø0¼Eˆ›»ì†ìò†Òþø0¸Eì†üü0°E؃ù0¬EÈü0¨E¸üò„†üü0 E„ƒù0˜Etü0”DþèƒE\þDÿEHDþþþŸE8ƒùE „E “EÆE˜Eà’E”E¸EøEŒE<þ–Eˆ––’êêêE|E`Exø¤¦ˆ’Âü–üêÞEÀEHþøþE¦÷þ§üð†üÎþE “¼E tE ¼’E pE ”E løE hE þ–E d––’êêêE XE <E Tø¤¦ˆ’Âü–üêÞE °ºþE (¦÷þ™üÎþøE†“EêE ŒŠš—Ë—ßEäE lþøþE0¦÷þ¯üð†üç’ÍþøEp†“¼EDôøE˜¦„Øü’EþôøE’EèEðEäøE@¦ˆ’Âü–üEÐEEÌøEˆEHþ––þþE„––’—ÓêêE¸E\E´EE˜øþEŒ¦÷þ™üÎþøE´†“¼E슥ñþèöEXºþEЦ÷þ™üïßþøE†—ñ¦õ“†ÊþøDÿD†—ñ¦õ“†‹Dÿ\þøôüþÞ0DþØüò†ƒù0„Dý̈›Dþ¤ìòò†ì†óßþø0€Dý¼ü0|Dý¤ƒù0lDý”ü0\Düôˆ›Ÿì†Òþø0XDüTˆ›ŸìùßþøDûŒ†ˆ›­ì†ì†Òþø0TDûˆü0PDûˆ›‘óßþøð†ƒùâ„–ú‚ú‚ú‚ú‚üü0LDùôˆ›­ì†ì†Òþøö†ü0HDâXD÷Ü“®DøìŒ¦ˆ–’Dùü–üàDøX¸D÷ì›ãþDõØ‚“®Dö쌦ˆ–’D÷ü–üàDöX¸Dõì›ãþDóØ‚“®Dô쌦ˆ–’Dõü–üàDôX¸Dóì›ãþDñØ‚“®Dò쌦ˆ–’Dóü–üàDòX¸Dñì›ãþDïØ‚“®Dð쌦ˆ–’Dñü–üàDðX¸Dïì›ãþDíØ‚“®Dî쌦ˆ–’Dïü–üàDîX¸Díì›ãþDéü‚“®DëŒDí|ˆ’Dë,ü–DëÚ’D쌌¦ˆ–’Dì¨ü–üàDëø¸DëÄþþÆ—ˆÁDê|¸Dê›ãþDæ‚“®Dç$ŒDé ˆ’Dç@ü–Dçî’Dè Œ®ˆ–’Dè¼ü–ü—ÉDè ¸DçØþþÆ—ˆÁDæ¸Dæ$›ãþDâ\“®DãàDåÄ’DãØøüøüøüøüDâØDã\öDâl›ãþø0@DâDƒùö†üò†ƒù08DÛô“®DÝŽDßþ––˜DáDþ–’D߀–˜þ–˜þ˜¦Üü–üêêêêêêDÝþ˜DÞ$þ–’DÝD˜þ–’DÜüDÜp¸DÜ›ãþø04DÛäü00DÕ¼“®DÖÌŽDØÈþ––˜DÛ þ–’DÙH–˜þ–˜þ˜¦Üü–üêêêêêêDÖäþ˜D×ìþ–’D× ˜þ–’DÖÄDÖ8¸DÕÌ›ãþø0,DÕ¤ƒù0 DÕˆƒù0DÕpƒùò†ƒù0DÒ@DÒÜ“¼DÔŒDÔðˆ’êÊ‚ˆ’êÐü–ü—ÓöDÓtDÓüþøþDÒ웟ì†óßþDÒDˆ›Ÿì†óßþøò†ƒù0DÒü0 DÑÔƒˆñö†ü0D½hDÏ,“¼DÐlŒDÑ\ˆ’DÐÌ‚ˆ–’DЈü–üàDÏÄDÐHöDÏ<›‹ØþD̘‚“¼DÍÜŒDÎ̈’DÎ<‚ˆ–’DÍøü–üàDÍ4D͸öD̬›‹ØþDÊ‚“¼DËLŒDÌ<ˆ’Dˬ‚ˆ–’DËhü–üàDʤDË(öDÊ›‹ØþDÇx‚“¼DȼŒDɬˆ’DÉ‚ˆ–’DÈØü–üàDÈDȘöDÇŒ›‹ØþDÄè‚“¼DÆ,ŒDLj’DÆŒ‚ˆ–’DÆHü–üàDÅ„DÆöDÄü›‹ØþDÂX‚“¼DÜŒDÄŒˆ’DÃü‚ˆ–’Døü–üàDÂôDÃxöDÂl›‹ØþD¿ä‚“¼DÁ(ŒDÁüˆ’DÁ˜‚ˆ’DÁDü–ü—ÉDÀ€DÁöD¿ø›‹ØþD½p‚“¼D¾´ŒD¿ˆˆ’D¿$‚ˆ’D¾Ðü–ü—ÉD¾ D¾öD½„›‹Øþøü0D½Tƒù0D½8†üüò„†üü/üD¼hˆ›­ìò†Òþø/ôD»¬ˆ›­ìò†ÒþøD¹˜†“®Dº´Œ¦ˆ–’DºÐü–üàDº ¸D¹´›ãþø/ðD¹”ü/àD¹ˆ›‘Òþøö†ü/ÜD¸ä†üü/ÌD¸ÌüD²ø†“®D´ŒD¸8ˆ–’D´0ü–D´Þ’D¶D·è’DµüøüøüøüøüD´üDµ€öD´ÈþþÆ—ˆÁD³€¸D³›ãþø/ÈD²tˆþ‘óßþø/ÄD²\ƒùö†ü/ÀD²<ü/¸D±ð†þø/´D±Pˆ›Ÿì†Òþø/°D±8ƒù/¬D±(ü/¨D°ˆˆ›Ÿì†Òþø/ D°pƒù/œD°Xƒù/˜D°Hü/”D°0ƒùÚ„žú‚ú‚ú‚ú‚ú‚ú‚üüò†ƒù/D¯ˆ›™ò†Òþøö†ü/ŒD®ìƒù/ˆD®Lˆ›Ÿì†Òþøò†ƒù/„D«D“¼D¬„Š˜D­ ˆ–’D­‚ˆ–’D¬Ìü–üÊD«ÜD¬`öD«T›‹Øþø/`D«4ü/\D¥ “®D¦ŽD¨þ––˜Dª\þ–’D¨˜–˜þ–˜þ˜¦Üü–üêêêêêêD¦4þ˜D§<þ–’D¦\˜þ–’D¦D¥ˆ¸D¥›ãþøD¡p†“¼D¢¼Š˜D¤xˆ–’D£è‚ˆ–’D£ü–D£¸þþD£ —ˆ‹D¢´D¢D¢˜öD¡Œ›‹Øþø/TD¡`†üüò„†üü/PD äˆþþø/HD Ìƒùò†ƒù/0D ¤ü/D ”ü/D |ƒùD˜„Džt“®DŸ„Œ¦ˆ–’DŸ ü–üàDžð¸Dž„›ãþDœp‚“®D„Œ¦ˆ–’D ü–üàDœð¸Dœ„›ãþDšp‚“®D›„Œ¦ˆ–’D› ü–üàDšð¸Dš„›ãþD˜p‚“®D™„Œ¦ˆ–’D™ ü–üàD˜ð¸D˜„›ãþD–p‚“®D—„Œ¦ˆ–’D— ü–üàD–ð¸D–„›ãþD”p‚“®D•„Œ¦ˆ–’D• ü–üàD”ð¸D”„›ãþD’Œ‚“®D“ Œ®ˆ’D“¼ü–ü—ÉD“ ¸D’ ›ãþD¨‚“®D‘¼Œ®ˆ’D‘Øü–ü—ÉD‘(¸D¼›ãþøü/Dˆ›Ÿì†ÒþøD<†ˆ›™ò†óßþø/D0ƒù.øDƒù.ðDŽüƒù.ìDŽäƒùò†ƒù.ØD޼ü.ÈDŽ ƒù.ÄDŽ„ü.¼DŽtüö†ü.¸C¹HD‹Ì“¼D ŒDЈ–’Dl‚ˆ’Âü–üàDŒdDŒèöD‹Ü›‹ØþD‰8‚“¼DŠ|ŒD‹lˆ’DŠÜ‚ˆ–’DŠ˜ü–üàD‰ÔDŠXöD‰L›‹ØþD†¨‚“¼D‡ìŒDˆÜˆ’DˆL‚ˆ–’Dˆü–üàD‡DD‡ÈöD†¼›‹ØþD„‚“¼D…\ŒD†Lˆ’D…¼‚ˆ–’D…xü–üàD„´D…8öD„,›‹ØþDˆ‚“¼D‚ÌŒDƒ¼ˆ’Dƒ,‚ˆ–’D‚èü–üàD‚$D‚¨öDœ›‹ØþD~ø‚“¼D€<ŒD,ˆ’D€œ‚ˆ–’D€Xü–üàD”D€öD ›‹ØþD|h‚“¼D}¬ŒD~œˆ’D~ ‚ˆ–’D}Èü–üàD}D}ˆöD||›‹ØþDyØ‚“¼D{ŒD| ˆ’D{|‚ˆ–’D{8ü–üàDztDzøöDy웋ØþDwH‚“¼DxŒŒDy|ˆ’Dx삈–’Dx¨ü–üàDwäDxhöDw\›‹ØþDt¸‚“¼DuüŒDv숒Dv\‚ˆ–’Dvü–üàDuTDuØöDtÌ›‹ØþDr(‚“¼DslŒDt\ˆ’DsÌ‚ˆ–’Dsˆü–üàDrÄDsHöDr<›‹ØþDo˜‚“¼DpÜŒDq̈’Dq<‚ˆ–’Dpøü–üàDp4Dp¸öDo¬›‹ØþDm‚“¼DnLŒDo<ˆ’Dn¬‚ˆ–’Dnhü–üàDm¤Dn(öDm›‹ØþDjx‚“¼Dk¼ŒDl¬ˆ’Dl‚ˆ–’DkØü–üàDkDk˜öDjŒ›‹ØþDgè‚“¼Di,ŒDjˆ’DiŒ‚ˆ–’DiHü–üàDh„DiöDgü›‹ØþDeX‚“¼DfœŒDgŒˆ’Dfü‚ˆ–’Df¸ü–üàDeôDfxöDel›‹ØþDbÈ‚“¼Dd ŒDdЈ–’Ddl‚ˆ’Âü–üàDcdDcèöDbÜ›‹ØþD` ‚“¼DaPŒDb@ˆ–’Da°‚ˆ–’Dalü–üàD`¨Da,öD` ›‹ØþD]P‚“¼D^”ŒD_„ˆ–’D^ô‚ˆ–’D^°ü–üàD]ìD^pöD]d›‹ØþDZ”‚“¼D[ØŒD\Ȉ–’D\8‚ˆ–’D[ôü–üàD[0D[´öDZ¨›‹ØþDWØ‚“¼DYŒDZ ˆ–’DY|‚ˆ–’DY8ü–üàDXtDXøöDW웋ØþDU‚“¼DV`ŒDWPˆ–’DVÀ‚ˆ–’DV|ü–üàDU¸DV<öDU0›‹ØþDR`‚“¼DS¤ŒDT”ˆ–’DT‚ˆ–’DSÀü–üàDRüDS€öDRt›‹ØþDOЂ“¼DQŒDQ؈–’DQt‚ˆ’Âü–üàDPlDPðöDO䛋ØþDM@‚“¼DN„ŒDOHˆ–’DN䂈’Âü–üàDMÜDN`öDMT›‹ØþDJ„‚“¼DKÈŒDL¸ˆ–’DL(‚ˆ–’DKäü–üàDK DK¤öDJ˜›‹ØþDGÈ‚“¼DI ŒDIüˆ–’DIl‚ˆ–’DI(ü–üàDHdDHèöDGÜ›‹ØþDE ‚“¼DFPŒDG@ˆ–’DF°‚ˆ–’DFlü–üàDE¨DF,öDE ›‹ØþDBP‚“¼DC”ŒDD„ˆ–’DCô‚ˆ–’DC°ü–üàDBìDCpöDBd›‹ØþD?”‚“¼D@ØŒDAȈ–’DA8‚ˆ–’D@ôü–üàD@0D@´öD?¨›‹ØþD<Ø‚“¼D>ŒD? ˆ–’D>|‚ˆ–’D>8ü–üàD=tD=øöD<웋ØþD:‚“¼D;`ŒD°ˆ–’C>L‚ˆ’Âü–üàC=DC=ÈöC<¼›‹ØþC9ì‚“¼C;0ŒC< ˆ–’C;‚ˆ–’C;Lü–üàC:ˆC; öC:›‹ØþC70‚“¼C8tŒC9dˆ–’C8Ô‚ˆ–’C8ü–üàC7ÌC8PöC7D›‹ØþC4t‚“¼C5¸ŒC6¨ˆ–’C6‚ˆ–’C5Ôü–üàC5C5”öC4ˆ›‹ØþC1¸‚“¼C2üŒC3숖’C3\‚ˆ–’C3ü–üàC2TC2ØöC1Ì›‹ØþC.ü‚“¼C0@ŒC10ˆ–’C0 ‚ˆ–’C0\ü–üàC/˜C0öC/›‹ØþC,@‚“¼C-„ŒC.tˆ–’C-䂈–’C- ü–üàC,ÜC-`öC,T›‹ØþC)„‚“¼C*ÈŒC+¸ˆ–’C+(‚ˆ–’C*äü–üàC* C*¤öC)˜›‹ØþC&ô‚“¼C(8ŒC(üˆ–’C(˜‚ˆ’Âü–üàC'C(öC'›‹ØþC$d‚“¼C%¨ŒC&lˆ–’C&‚ˆ’Âü–üàC%C%„öC$x›‹ØþC!¨‚“¼C"ìŒC#܈–’C#L‚ˆ–’C#ü–üàC"DC"ÈöC!¼›‹ØþCì‚“¼C 0ŒC! ˆ–’C ‚ˆ–’C Lü–üàCˆC öC›‹ØþC0‚“¼CtŒCdˆ–’CÔ‚ˆ–’Cü–üàCÌCPöCD›‹ØþCt‚“¼C¸ŒC¨ˆ–’C‚ˆ–’CÔü–üàCC”öCˆ›‹ØþC¸‚“¼CüŒC숖’C\‚ˆ–’Cü–üàCTCØöCÌ›‹ØþCü‚“¼C@ŒC0ˆ–’C ‚ˆ–’C\ü–üàC˜CöC›‹ØþC@‚“¼C„ŒCtˆ–’C䂈–’C ü–üàCÜC`öCT›‹ØþC°‚“¼CôŒC¸ˆ–’CT‚ˆ’Âü–üàCLCÐöCÄ›‹ØþC ‚“¼C dŒC(ˆ–’C Ä‚ˆ’Âü–üàC ¼C @öC 4›‹ØþC d‚“¼C ¨ŒC ˜ˆ–’C ‚ˆ–’C Äü–üàC C „öC x›‹ØþC¨‚“¼CìŒC܈–’CL‚ˆ–’Cü–üàCDCÈöC¼›‹ØþCì‚“¼C0ŒC ˆ–’C‚ˆ–’CLü–üàCˆC öC›‹ØþC0‚“¼CtŒCdˆ–’CÔ‚ˆ–’Cü–üàCÌCPöCD›‹ØþBþt‚“¼Bÿ¸ŒC¨ˆ–’C‚ˆ–’BÿÔü–üàBÿBÿ”öBþˆ›‹ØþBû¸‚“¼BüüŒBý숖’Bý\‚ˆ–’Býü–üàBüTBüØöBûÌ›‹ØþBøü‚“¼Bú@ŒBû0ˆ–’Bú ‚ˆ–’Bú\ü–üàBù˜BúöBù›‹ØþBöl‚“¼B÷°ŒBøtˆ–’Bø‚ˆ’Âü–üàB÷B÷ŒöBö€›‹ØþBóÜ‚“¼Bõ ŒBõ䈖’Bõ€‚ˆ’Âü–üàBôxBôüöBóð›‹ØþBñ ‚“¼BòdŒBóTˆ–’BòÄ‚ˆ–’Bò€ü–üàBñ¼Bò@öBñ4›‹ØþBîd‚“¼B兀B𘈖’Bð‚ˆ–’BïÄü–üàBïBï„öBîx›‹ØþB먂“¼BììŒBí܈–’BíL‚ˆ–’Bíü–üàBìDBìÈöBë¼›‹ØþBèì‚“¼Bê0ŒBë ˆ–’Bꂈ–’BêLü–üàBéˆBê öB雋ØþBæ0‚“¼BçtŒBèdˆ–’BçÔ‚ˆ–’Bçü–üàBæÌBçPöBæD›‹ØþBãt‚“¼B丌B娈–’B傈–’BäÔü–üàBäBä”öB㈛‹ØþBข“¼BáüŒBâ숖’Bâ\‚ˆ–’Bâü–üàBáTBáØöBàÌ›‹ØþBÞ(‚“¼BßlŒBà0ˆ–’BßÌ‚ˆ’Âü–üàBÞÄBßHöBÞ<›‹ØþBÛ˜‚“¼BÜÜŒBÝ ˆ–’BÝ<‚ˆ’Âü–üàBÜ4BܸöBÛ¬›‹ØþBØÜ‚“¼BÚ ŒBÛˆ–’BÚ€‚ˆ–’BÚ<ü–üàBÙxBÙüöBØð›‹ØþBÖ ‚“¼B×dŒBØTˆ–’B×Ä‚ˆ–’B×€ü–üàBÖ¼B×@öBÖ4›‹ØþBÓd‚“¼BÔ¨ŒBÕ˜ˆ–’BÕ‚ˆ–’BÔÄü–üàBÔBÔ„öBÓx›‹ØþBШ‚“¼BÑìŒBÒ܈–’BÒL‚ˆ–’BÒü–üàBÑDBÑÈöBм›‹ØþBÍì‚“¼BÏ0ŒBÐ ˆ–’BÏ‚ˆ–’BÏLü–üàBΈBÏ öBΛ‹ØþBË0‚“¼BÌtŒBÍdˆ–’BÌÔ‚ˆ–’BÌü–üàBËÌBÌPöBËD›‹ØþBÈt‚“¼BɸŒBʨˆ–’BÊ‚ˆ–’BÉÔü–üàBÉBÉ”öBȈ›‹ØþBÅä‚“¼BÇ(ŒBÇ숖’BLj‚ˆ’Âü–üàBÆ€BÇöBÅø›‹ØþBÃT‚“¼BĘŒBÅ\ˆ–’BÄø‚ˆ’Âü–üàBÃðBÄtöBÃh›‹ØþBÀ˜‚“¼BÁÜŒBÂ̈–’BÂ<‚ˆ–’BÁøü–üàBÁ4BÁ¸öBÀ¬›‹ØþB½Ü‚“¼B¿ ŒBÀˆ–’B¿€‚ˆ–’B¿<ü–üàB¾xB¾üöB½ð›‹ØþB» ‚“¼B¼dŒB½Tˆ–’B¼Ä‚ˆ–’B¼€ü–üàB»¼B¼@öB»4›‹ØþB¸d‚“¼B¹¨ŒBº˜ˆ–’Bº‚ˆ–’B¹Äü–üàB¹B¹„öB¸x›‹ØþBµ¨‚“¼B¶ìŒB·Üˆ–’B·L‚ˆ–’B·ü–üàB¶DB¶ÈöBµ¼›‹ØþB²ì‚“¼B´0ŒBµ ˆ–’B´‚ˆ–’B´Lü–üàB³ˆB´ öB³›‹ØþB°0‚“¼B±tŒB²dˆ–’B±Ô‚ˆ–’B±ü–üàB°ÌB±PöB°D›‹ØþB­ ‚“¼B®äŒB¯¨ˆ–’B¯D‚ˆ’Âü–üàB®<B®ÀöB­´›‹ØþB«,‚“¼B¬pŒB­Dˆ’B¬à‚ˆ’B¬Œü–ü—ÉB«ÈB¬LöB«@›‹ØþB¨¸‚“¼B©üŒBªÐˆ’Bªl‚ˆ’Bªü–ü—ÉB©TB©ØöB¨Ì›‹Øþøüò†ƒù.8B¨4ˆþþøö†ü.,B¥4“¼B¦tŠ˜B§ˆ–’B§‚ˆ–’B¦¼ü–üÊB¥ÌB¦PöB¥D›‹Øþø.$AÐB¢œ“¼B£ÜŒB¤ ˆ–’B¤<‚ˆ’Âü–üàB£4B£¸öB¢¬›‹ØþB ‚“¼B¡LŒB¢<ˆ’B¡¬‚ˆ–’B¡hü–üàB ¤B¡(öB ›‹ØþBx‚“¼Bž¼ŒBŸ¬ˆ’BŸ‚ˆ–’BžØü–üàBžBž˜öBŒ›‹ØþBšè‚“¼Bœ,ŒBˆ’BœŒ‚ˆ–’BœHü–üàB›„BœöBšü›‹ØþB˜X‚“¼B™œŒBšŒˆ’B™ü‚ˆ–’B™¸ü–üàB˜ôB™xöB˜l›‹ØþB•È‚“¼B— ŒB—üˆ’B—l‚ˆ–’B—(ü–üàB–dB–èöB•Ü›‹ØþB“8‚“¼B”|ŒB•lˆ’B”Ü‚ˆ–’B”˜ü–üàB“ÔB”XöB“L›‹ØþB¨‚“¼B‘ìŒB’܈’B’L‚ˆ–’B’ü–üàB‘DB‘ÈöB¼›‹ØþBŽ‚“¼B\ŒBLˆ’B¼‚ˆ–’Bxü–üàBŽ´B8öBŽ,›‹ØþB‹ˆ‚“¼BŒÌŒB¼ˆ’B,‚ˆ–’BŒèü–üàBŒ$BŒ¨öB‹œ›‹ØþBˆø‚“¼BŠ<ŒB‹,ˆ’BŠœ‚ˆ–’BŠXü–üàB‰”BŠöB‰ ›‹ØþB†h‚“¼B‡¬ŒBˆœˆ’Bˆ ‚ˆ–’B‡Èü–üàB‡B‡ˆöB†|›‹ØþBƒØ‚“¼B…ŒB† ˆ’B…|‚ˆ–’B…8ü–üàB„tB„øöBƒì›‹ØþBH‚“¼B‚ŒŒBƒ|ˆ’B‚삈–’B‚¨ü–üàBäB‚höB\›‹ØþB~¸‚“¼BüŒB€ìˆ’B€\‚ˆ–’B€ü–üàBTBØöB~Ì›‹ØþB|(‚“¼B}lŒB~\ˆ’B}Ì‚ˆ–’B}ˆü–üàB|ÄB}HöB|<›‹ØþBy˜‚“¼BzÜŒB{ ˆ–’B{<‚ˆ’Âü–üàBz4Bz¸öBy¬›‹ØþBvÜ‚“¼Bx ŒByˆ–’Bx€‚ˆ–’Bx<ü–üàBwxBwüöBvð›‹ØþBt ‚“¼BudŒBvTˆ–’BuÄ‚ˆ–’Bu€ü–üàBt¼Bu@öBt4›‹ØþBqd‚“¼Br¨ŒBs˜ˆ–’Bs‚ˆ–’BrÄü–üàBrBr„öBqx›‹ØþBn¨‚“¼BoìŒBp܈–’BpL‚ˆ–’Bpü–üàBoDBoÈöBn¼›‹ØþBkì‚“¼Bm0ŒBn ˆ–’Bm‚ˆ–’BmLü–üàBlˆBm öBl›‹ØþBi0‚“¼BjtŒBkdˆ–’BjÔ‚ˆ–’Bjü–üàBiÌBjPöBiD›‹ØþBf ‚“¼BgäŒBh¨ˆ–’BhD‚ˆ’Âü–üàBg<BgÀöBf´›‹ØþBd‚“¼BeTŒBfˆ–’Be´‚ˆ’Âü–üàBd¬Be0öBd$›‹ØþBaT‚“¼Bb˜ŒBcˆˆ–’Bbø‚ˆ–’Bb´ü–üàBaðBbtöBah›‹ØþB^˜‚“¼B_ÜŒB`̈–’B`<‚ˆ–’B_øü–üàB_4B_¸öB^¬›‹ØþB[Ü‚“¼B] ŒB^ˆ–’B]€‚ˆ–’B]<ü–üàB\xB\üöB[ð›‹ØþBY ‚“¼BZdŒB[Tˆ–’BZÄ‚ˆ–’BZ€ü–üàBY¼BZ@öBY4›‹ØþBVd‚“¼BW¨ŒBX˜ˆ–’BX‚ˆ–’BWÄü–üàBWBW„öBVx›‹ØþBS¨‚“¼BTìŒBU܈–’BUL‚ˆ–’BUü–üàBTDBTÈöBS¼›‹ØþBPì‚“¼BR0ŒBS ˆ–’BR‚ˆ–’BRLü–üàBQˆBR öBQ›‹ØþBN\‚“¼BO ŒBPdˆ–’BP‚ˆ’Âü–üàBNøBO|öBNp›‹ØþBKÌ‚“¼BMŒBMÔˆ–’BMp‚ˆ’Âü–üàBLhBLìöBKà›‹ØþBI‚“¼BJTŒBKDˆ–’BJ´‚ˆ–’BJpü–üàBI¬BJ0öBI$›‹ØþBFT‚“¼BG˜ŒBHˆˆ–’BGø‚ˆ–’BG´ü–üàBFðBGtöBFh›‹ØþBC˜‚“¼BDÜŒBË–’BE<‚ˆ–’BDøü–üàBD4BD¸öBC¬›‹ØþB@Ü‚“¼BB ŒBCˆ–’BB€‚ˆ–’BB<ü–üàBAxBAüöB@ð›‹ØþB> ‚“¼B?dŒB@Tˆ–’B?Ä‚ˆ–’B?€ü–üàB>¼B?@öB>4›‹ØþB;d‚“¼B<¨ŒB=˜ˆ–’B=‚ˆ–’B<Äü–üàB<B<„öB;x›‹ØþB8¨‚“¼B9ìŒB:܈–’B:L‚ˆ–’B:ü–üàB9DB9ÈöB8¼›‹ØþB6‚“¼B7\ŒB8 ˆ–’B7¼‚ˆ’Âü–üàB6´B78öB6,›‹ØþB3ˆ‚“¼B4ÌŒB5ˆ–’B5,‚ˆ’Âü–üàB4$B4¨öB3œ›‹ØþB0Ì‚“¼B2ŒB3ˆ–’B2p‚ˆ–’B2,ü–üàB1hB1ìöB0à›‹ØþB.‚“¼B/TŒB0Dˆ–’B/´‚ˆ–’B/pü–üàB.¬B/0öB.$›‹ØþB+T‚“¼B,˜ŒB-ˆˆ–’B,ø‚ˆ–’B,´ü–üàB+ðB,töB+h›‹ØþB(˜‚“¼B)ÜŒB*̈–’B*<‚ˆ–’B)øü–üàB)4B)¸öB(¬›‹ØþB%Ü‚“¼B' ŒB(ˆ–’B'€‚ˆ–’B'<ü–üàB&xB&üöB%ð›‹ØþB# ‚“¼B$dŒB%Tˆ–’B$Ä‚ˆ–’B$€ü–üàB#¼B$@öB#4›‹ØþB d‚“¼B!¨ŒB"˜ˆ–’B"‚ˆ–’B!Äü–üàB!B!„öB x›‹ØþBÔ‚“¼BŒB܈–’Bx‚ˆ’Âü–üàBpBôöB蛋ØþBD‚“¼BˆŒBLˆ–’B肈’Âü–üàBàBdöBX›‹ØþBˆ‚“¼BÌŒB¼ˆ–’B,‚ˆ–’Bèü–üàB$B¨öBœ›‹ØþBÌ‚“¼BŒBˆ–’Bp‚ˆ–’B,ü–üàBhBìöBà›‹ØþB‚“¼BTŒBDˆ–’B´‚ˆ–’Bpü–üàB¬B0öB$›‹ØþBT‚“¼B˜ŒBˆˆ–’Bø‚ˆ–’B´ü–üàBðBtöBh›‹ØþB ˜‚“¼BÜŒB̈–’B<‚ˆ–’Bøü–üàB4B¸öB ¬›‹ØþB Ü‚“¼B ŒB ˆ–’B €‚ˆ–’B <ü–üàB xB üöB ð›‹ØþB ‚“¼B dŒB Tˆ–’B Ä‚ˆ–’B €ü–üàB¼B @öB4›‹ØþB‚“¼BÔŒB˜ˆ–’B4‚ˆ’Âü–üàB,B°öB¤›‹ØþB‚“¼BDŒBˆ–’B¤‚ˆ’Âü–üàBœB öB›‹ØþBD‚“¼BˆŒBxˆ–’B肈–’B¤ü–üàBàBdöBX›‹ØþAýˆ‚“¼AþÌŒAÿ¼ˆ–’Aÿ,‚ˆ–’Aþèü–üàAþ$Aþ¨öAýœ›‹ØþAúÌ‚“¼AüŒAýˆ–’Aüp‚ˆ–’Aü,ü–üàAûhAûìöAúà›‹ØþAø‚“¼AùTŒAúDˆ–’Aù´‚ˆ–’Aùpü–üàAø¬Aù0öAø$›‹ØþAõT‚“¼Aö˜ŒA÷ˆˆ–’Aöø‚ˆ–’Aö´ü–üàAõðAötöAõh›‹ØþAò˜‚“¼AóÜŒAô̈–’Aô<‚ˆ–’Aóøü–üàAó4Aó¸öAò¬›‹ØþAïÜ‚“¼Añ ŒAòˆ–’Añ€‚ˆ–’Añ<ü–üàAðxAðüöAïð›‹ØþAíL‚“¼AîŒAïTˆ–’Aîð‚ˆ’Âü–üàAíèAîlöAí`›‹ØþA꼂“¼AìŒAìĈ–’Aì`‚ˆ’Âü–üàAëXAëÜöAêЛ‹ØþAè‚“¼AéDŒAê4ˆ–’A餂ˆ–’Aé`ü–üàAèœAé öA蛋ØþAåD‚“¼A戌Açxˆ–’Aæè‚ˆ–’Aæ¤ü–üàAåàAædöAåX›‹ØþA∂“¼AãÌŒA伈–’Aä,‚ˆ–’Aãèü–üàAã$Aã¨öA✛‹ØþAßÌ‚“¼AáŒA∖’Aáp‚ˆ–’Aá,ü–üàAàhAàìöAßà›‹ØþAÝ‚“¼AÞTŒAßDˆ–’AÞ´‚ˆ–’AÞpü–üàAݬAÞ0öAÝ$›‹ØþAÚT‚“¼AÛ˜ŒA܈ˆ–’AÛø‚ˆ–’AÛ´ü–üàAÚðAÛtöAÚh›‹ØþAט‚“¼AØÜŒAÙ̈–’AÙ<‚ˆ–’AØøü–üàAØ4AظöA׬›‹ØþAÕ‚“¼AÖLŒA׈–’AÖ¬‚ˆ’Âü–üàAÕ¤AÖ(öAÕ›‹ØþAÒ”‚“¼AÓØŒAÔ¬ˆ’AÔH‚ˆ’AÓôü–ü—ÉAÓ0AÓ´öAÒ¨›‹ØþAÐ ‚“¼AÑdŒAÒ8ˆ’AÑÔ‚ˆ’AÑ€ü–ü—ÉAмAÑ@öAÐ4›‹Øþøü. AÏ|ˆ›Ÿì†Òþøö†ü.AÏ\üAÉȆ“¼AËœAÏ’AË”øAÍÔA΀–’AÍЖ–’êAË|øAÌ AÌŒ˜AÍ”„AÍ‚ˆ–’AÌÀü–üAÌ–’AËdøüøüAÊlAËöøþöAÉ䛟ìØþø.A¾à“¼AÀ Š˜AÉ@ˆ–’AȰ‚ˆ–’AÀhü–AÁ2’AÃAÈd’Aà øüôøüøüøüøüøüøüøüøAÃXþ–’AÂøüAÁPAÁèööAÁþþAÀ„—ˆ‹AÀA¿xA¿üöA¾ð›‹Øþø.A¾Èƒù.A LA¼À“®A½ÐŒ¦ˆ–’A½ìü–üàA½<¸A¼Ð›ãþAº¼‚“®A»ÐŒ¦ˆ–’A»ìü–üàA»<¸AºÐ›ãþA¸¼‚“®A¹ÐŒ¦ˆ–’A¹ìü–üàA¹<¸A¸Ð›ãþA¶¼‚“®A·ÐŒ¦ˆ–’A·ìü–üàA·<¸A¶Ð›ãþA´¼‚“®AµÐŒ¦ˆ–’Aµìü–üàAµ<¸A´Ð›ãþA²¼‚“®A³ÐŒ¦ˆ–’A³ìü–üàA³<¸A²Ð›ãþA®à‚“®A¯ôŒA²`ˆ’A°ü–A°¾’A±pŒ¦ˆ–’A±Œü–üàA°Ü¸A°¨þþÆ—ˆÁA¯`¸A®ô›ãþAªô‚“®A¬ŒA®„ˆ’A¬$ü–A¬Ò’A­„Œ®ˆ–’A­ ü–ü—ÉA¬ð¸A¬¼þþÆ—ˆÁA«t¸A«›ãþA P“®A£ Aª¨’A£øüøüøüøüøüôøüôøüøüøüøüøüøüøüøüøüA ÌA¡dööA `›ãþø.A @ü-üAŸ ˆ›Ÿì†Òþøò†ƒù-øAŸˆ›‘Òþø-ôAž€ˆ›‘Òþø-ìAüˆ›‘ÒþøA@†ˆ›‘‹Çþø-äA<ü-àAœ¸ˆ›‘Òþøö†ü-ÜA›ìˆ›™†ì†ÒþøA›@†ˆ›Ÿì†Òþø-ØA†¤A™D“®AšTŒ¦ˆ–’Ašpü–üàA™À¸A™T›ãþA—@‚“®A˜TŒ¦ˆ–’A˜pü–üàA—À¸A—T›ãþA•@‚“®A–TŒ¦ˆ–’A–pü–üàA•À¸A•T›ãþA“@‚“®A”TŒ¦ˆ–’A”pü–üàA“À¸A“T›ãþA‘@‚“®A’TŒ¦ˆ–’A’pü–üàA‘À¸A‘T›ãþA@‚“®ATŒ¦ˆ–’Apü–üàAÀ¸AT›ãþA‹8‚“®AŒLŒAŽäˆ’AŒhü–A’AÈŠ˜¦ˆ–’AŽü–üÊA4¸AþþÆ—ˆÁA‹¸¸A‹L›ãþA‡ ‚“®Aˆ4ŒAŠÜˆ’AˆPü–Aˆþ’A‰°Š˜®ˆ–’A‰øü–ü—A‰¨A‰¸AˆèþþÆ—ˆÁA‡ ¸A‡4›ãþA†¨ˆ›ãþø-ÔA†ˆ›ŸìØþø-ÌA…ðƒù-ÄA…4ˆ›™†ì†Òþø-ÀA…ü-´A…ƒù-°A„Dˆ›™†ì†Òþø-¨Aƒlˆ›»ìòò†Òþø-˜A‚舛‘Òþø-As A€à“®AðŒ¦ˆ–’A‚ ü–üàA\¸A€ð›ãþA~Ü‚“®AðŒ¦ˆ–’A€ ü–üàA\¸A~ð›ãþA|Ü‚“®A}ðŒ¦ˆ–’A~ ü–üàA}\¸A|ð›ãþAzÜ‚“®A{ðŒ¦ˆ–’A| ü–üàA{\¸Azð›ãþAxÜ‚“®AyðŒ¦ˆ–’Az ü–üàAy\¸Axð›ãþAvÜ‚“®AwðŒ¦ˆ–’Ax ü–üàAw\¸Avð›ãþAtø‚“®Av Œ®ˆ’Av(ü–ü—ÉAux¸Au ›ãþAs‚“®At(Œ®ˆ’AtDü–ü—ÉAs”¸As(›ãþøü-ŒArTˆ›™†ì†óßþø-ˆA^pƒAr<þA^ŠAr(A^†þŸArƒùAiì„Amì“An¦AoxAqÀ’AotAq˜AopøAplAqþ–Aph––’êêêAo\Ap@AoXø¤¦ˆ’Âü–üêÞAn Ao(þøþAmü¦÷þ§üð†üÎþAiø“¼AkTAmœ’AkPAmtAkLøAlHAløþ–AlD––’êêêAk8AlAk4ø¤¦ˆ’Âü–üêÞAjºþAj¦÷þ™üÎþøAgô†“AhÊAilŠš—Ë—ßAhÄAiLþøþAh¦÷þ¯üð†üç’ÍþøAaø†“¼AcÌôøAg Ag´„Ag$ü’—ˆAc þôøAf ’AcpAfxAcløAeȦˆ’Âü–üAcXAeœAcTøAdAdÐþ––þþAd ––’—ÓêêAc@AcäAc<AbœAc øþAb¦÷þ™üÎþøA`<†“¼AatŠ¥ñþèöA`àºþA`X¦÷þ™üïßþøA_Œ†—ñ¦õ“†ÊþøA^̆—ñ¦õ“†‹A^äþøôüþÞ-„A^Tƒù-xANxA\L“®A]\Œ¦ˆ–’A]xü–üàA\ȸA\\›ãþAZH‚“®A[\Œ¦ˆ–’A[xü–üàAZȸAZ\›ãþAXH‚“®AY\Œ¦ˆ–’AYxü–üàAXȸAX\›ãþAVH‚“®AW\Œ¦ˆ–’AWxü–üàAVȸAV\›ãþATH‚“®AU\Œ¦ˆ–’AUxü–üàATȸAT\›ãþARH‚“®AS\Œ¦ˆ–’ASxü–üàARȸAR\›ãþAPd‚“®AQxŒ®ˆ’AQ”ü–ü—ÉAPä¸APx›ãþAN€‚“®AO”Œ®ˆ’AO°ü–ü—ÉAO¸AN”›ãþøüò†ƒù-pANH†üü-lAH$“®AI4ŽAK0þ––˜AMtþ–’AK°–˜þ–˜þ˜¦Üü–üêêêêêêAILþ˜AJTþ–’AIt˜þ–’AI,AH ¸AH4›ãþø-hAHƒùò†ƒù-`AGÔ†üü-\AGÀƒù-TAG¨ƒù-DAG$ˆ›„ßþøAF\†ˆ›™†ì†ÒþøAE¼†ˆ›‹†ÒþøA?”†“®A@°ŽAB¬þ––˜ADðþ–’AC,–˜þ–˜þ˜¦Üü–üêêêêêêA@Èþ˜AAÐþ–’A@ð˜þ–’A@¨A@¸A?°›ãþø-<A>䈛™†ì†Òþø-0A>Dˆ›Ÿì†óßþø-$A>4üꄎú‚ú‚üü-A=lˆ›Ÿì†Òþø- A=\ü-A<ì«þò„þæ„üþô÷ò†ƒù,ôA: “®A;°Š˜¦ˆ–’A;øü–üÊA;¸A:°›ãþøð†ƒùö†ü,ìA:Xƒù,èA9¸ˆ›Ÿì†óßþøð†ƒù,ÔA$ôA7”“®A8¤Œ¦ˆ–’A8Àü–üàA8¸A7¤›ãþA5‚“®A6¤Œ¦ˆ–’A6Àü–üàA6¸A5¤›ãþA3‚“®A4¤Œ¦ˆ–’A4Àü–üàA4¸A3¤›ãþA1‚“®A2¤Œ¦ˆ–’A2Àü–üàA2¸A1¤›ãþA/‚“®A0¤Œ¦ˆ–’A0Àü–üàA0¸A/¤›ãþA-‚“®A.¤Œ¦ˆ–’A.Àü–üàA.¸A-¤›ãþA)ˆ‚“®A*œŒA-4ˆ’A*¸ü–A+f’A,Š˜¦ˆ–’A,`ü–üÊA+„¸A+PþþÆ—ˆÁA*¸A)œ›ãþA%p‚“®A&„ŒA),ˆ’A& ü–A'N’A(Š˜®ˆ–’A(Hü–ü—A'øA'l¸A'8þþÆ—ˆÁA%ð¸A%„›ãþA$øˆ›ãþø@þl„A"`“¼A# ŒA$ˆ’êA$‚ˆ–’A#¼ü–üàA"øA#€þöA"p›ŸìØþAÌ‚“¼A!ŒA"ˆ’êA!p‚ˆ–’A!,ü–üàA hA ðþöAà›ŸìØþA<‚“¼A€ŒApˆ’êAà‚ˆ–’Aœü–üàAØA`þöAP›ŸìØþA¬‚“¼AðŒAàˆ’êAP‚ˆ–’A ü–üàAHAÐþöAÀ›ŸìØþA‚“¼A`ŒAPˆ’êAÀ‚ˆ–’A|ü–üàA¸A@þöA0›ŸìØþAŒ‚“¼AÐŒAÀˆ’êA0‚ˆ–’Aìü–üàA(A°þöA ›ŸìØþAd‚“¼A¨ŒA0ˆ’êÊ‚ˆ’AÄü–AŽ’ATŠ˜Apˆ’êAà‚ˆ–’Aœü–üÊA¬A4þöAxþþAà—ˆŸìA AAˆþöAx›ŸìØþA ,‚“¼A pŒAˆ’êÊ‚ˆ’A Œü–A V’AŠ˜AHˆ’êA¸‚ˆ–’Adü–ü—AA tA üþöA @þþA ¨—ˆŸìA hA ÈA PþöA @›ŸìØþ@þx“¼A€A à’Axøüôøüøüøüøüøüøüøüøüôøüøüøüøüøüøüøüøü@ÿ@ÿ˜þö@þˆ›ŸìØþø,Ì@ñx“®@òˆŠ˜@ý䈖’@òÐü–@ó~’@õ¬@ý”’@õ¤øüøüøüøüøüøüøüøüøüøüøüøüøüøüøü@óœ@ô ö@óhþþÆ—ˆ@ò€@ñô¸@ñˆ›ãþø,Ä@㸃@ñ`þ@ãÒ@ñL@ãÎþŸ@ñ<ƒù@æØ„@ðŒˆ¦õ§ì†Êþ@ëä‚“@ì–@íh@ð<’@íd@ð@í`ø@îè@ï˜þ–@îä––’êêê@íL@î¼@íHø¢˜@îXˆ’êÊ‚ˆ’Âü–üêêÞ@ì@íþøþ@ëø¦õ§üð†üÎþ@æä“@ç’@èd@똒@è`@ëp@è\ø@éô@ê¤þ––þþ@éð––’êêê@èH@éÈ@èDø¢˜@édˆ’ꂈ’—@è¬ü–üêêÞ@çŒ@èþøþ@æô¦õ§üð†üÎþø@æD†ˆ¦õ™Êþø@儆ˆ¦õ¯ì†ã’Íþø@äÔ†—ñ¦õ“†Êþø@䆗ñ¦õ“†‹@ä,þøôüþÞ,À@ãPˆþþøò„†üü,¼@ã(ü,¬@ãƒù,¨@⌈›ãþø@Ò¨„@à„“®@ᔌ¦ˆ–’@á°ü–üà@á¸@à”›ãþ@Þ€‚“®@ß”Œ¦ˆ–’@ß°ü–üà@߸@Þ”›ãþ@Ü€‚“®@Ý”Œ¦ˆ–’@ݰü–üà@ݸ@Ü”›ãþ@Ú€‚“®@Û”Œ¦ˆ–’@Û°ü–üà@Û¸@Ú”›ãþ@Ø€‚“®@Ù”Œ¦ˆ–’@Ù°ü–üà@Ù¸@Ø”›ãþ@Ö€‚“®@×”Œ¦ˆ–’@×°ü–üà@׸@Ö”›ãþ@Ôœ‚“®@Õ°Œ®ˆ’@ÕÌü–ü—É@Õ¸@Ô°›ãþ@Ò¸‚“®@ÓÌŒ®ˆ’@Óèü–ü—É@Ó8¸@ÒÌ›ãþøü,¤@Ïœ@Ð8“¼@ÑxŒ@ÒLˆ’@Ñ肈’êÐü–ü—Óö@ÐÐ@ÑTøþ@ÐH›‹†óßþ@Ï ˆ›‹†óßþø,˜?ú°@Í“¼@ÎHŒ@Ï ˆ–’@Ψ‚ˆ’Âü–üà@Í @Î$ö@Í›‹Øþ@Êt‚“¼@˸Œ@Ì|ˆ–’@Ì‚ˆ’Âü–üà@Ë@Ë”ö@ʈ›‹Øþ@Çä‚“¼@É(Œ@É숖’@Ɉ‚ˆ’Âü–üà@È€@Éö@Çø›‹Øþ@ÅT‚“¼@ƘŒ@Ç\ˆ–’@Æø‚ˆ’Âü–üà@Åð@Ætö@Åh›‹Øþ@ÂÄ‚“¼@ÄŒ@Äøˆ’@Äh‚ˆ–’@Ä$ü–üà@Ã`@Ãäö@ÂØ›‹Øþ@À4‚“¼@ÁxŒ@Âhˆ’@ÁØ‚ˆ–’@Á”ü–üà@ÀÐ@ÁTö@ÀH›‹Øþ@½¤‚“¼@¾èŒ@¿Øˆ’@¿H‚ˆ–’@¿ü–üà@¾@@¾Äö@½¸›‹Øþ@»‚“¼@¼XŒ@½Hˆ’@¼¸‚ˆ–’@¼tü–üà@»°@¼4ö@»(›‹Øþ@¸„‚“¼@¹ÈŒ@º¸ˆ’@º(‚ˆ–’@¹äü–üà@¹ @¹¤ö@¸˜›‹Øþ@µô‚“¼@·8Œ@¸(ˆ’@·˜‚ˆ–’@·Tü–üà@¶@·ö@¶›‹Øþ@³d‚“¼@´¨Œ@µ˜ˆ’@µ‚ˆ–’@´Äü–üà@´@´„ö@³x›‹Øþ@°Ô‚“¼@²Œ@³ˆ’@²x‚ˆ–’@²4ü–üà@±p@±ôö@°è›‹Øþ@®D‚“¼@¯ˆŒ@°xˆ’@¯è‚ˆ–’@¯¤ü–üà@®à@¯dö@®X›‹Øþ@«´‚“¼@¬øŒ@­èˆ’@­X‚ˆ–’@­ü–üà@¬P@¬Ôö@«È›‹Øþ@©$‚“¼@ªhŒ@«Xˆ’@ªÈ‚ˆ–’@ª„ü–üà@©À@ªDö@©8›‹Øþ@¦”‚“¼@§ØŒ@¨Èˆ’@¨8‚ˆ–’@§ôü–üà@§0@§´ö@¦¨›‹Øþ@¤‚“¼@¥HŒ@¦8ˆ’@¥¨‚ˆ–’@¥dü–üà@¤ @¥$ö@¤›‹Øþ@¡t‚“¼@¢¸Œ@£¨ˆ’@£‚ˆ–’@¢Ôü–üà@¢@¢”ö@¡ˆ›‹Øþ@žä‚“¼@ (Œ@¡ˆ’@ ˆ‚ˆ–’@ Dü–üà@Ÿ€@ ö@žø›‹Øþ@œT‚“¼@˜Œ@ž\ˆ–’@ø‚ˆ’Âü–üà@œð@tö@œh›‹Øþ@™˜‚“¼@šÜŒ@›Ìˆ–’@›<‚ˆ–’@šøü–üà@š4@š¸ö@™¬›‹Øþ@–Ü‚“¼@˜ Œ@™ˆ–’@˜€‚ˆ–’@˜<ü–üà@—x@—üö@–ð›‹Øþ@” ‚“¼@•dŒ@–Tˆ–’@•Ä‚ˆ–’@•€ü–üà@”¼@•@ö@”4›‹Øþ@‘d‚“¼@’¨Œ@“˜ˆ–’@“‚ˆ–’@’Äü–üà@’@’„ö@‘x›‹Øþ@ލ‚“¼@ìŒ@܈–’@L‚ˆ–’@ü–üà@D@Èö@޼›‹Øþ@‹ì‚“¼@0Œ@Ž ˆ–’@‚ˆ–’@Lü–üà@Œˆ@ ö@Œ›‹Øþ@‰\‚“¼@Š Œ@‹dˆ–’@‹‚ˆ’Âü–üà@‰ø@Š|ö@‰p›‹Øþ@†Ì‚“¼@ˆŒ@ˆÔˆ–’@ˆp‚ˆ’Âü–üà@‡h@‡ìö@†à›‹Øþ@„‚“¼@…TŒ@†Dˆ–’@…´‚ˆ–’@…pü–üà@„¬@…0ö@„$›‹Øþ@T‚“¼@‚˜Œ@ƒˆˆ–’@‚ø‚ˆ–’@‚´ü–üà@ð@‚tö@h›‹Øþ@~˜‚“¼@ÜŒ@€Ìˆ–’@€<‚ˆ–’@øü–üà@4@¸ö@~¬›‹Øþ@{Ü‚“¼@} Œ@~ˆ–’@}€‚ˆ–’@}<ü–üà@|x@|üö@{ð›‹Øþ@y ‚“¼@zdŒ@{Tˆ–’@zÄ‚ˆ–’@z€ü–üà@y¼@z@ö@y4›‹Øþ@vd‚“¼@w¨Œ@x˜ˆ–’@x‚ˆ–’@wÄü–üà@w@w„ö@vx›‹Øþ@s¨‚“¼@tìŒ@u܈–’@uL‚ˆ–’@uü–üà@tD@tÈö@s¼›‹Øþ@q‚“¼@r\Œ@s ˆ–’@r¼‚ˆ’Âü–üà@q´@r8ö@q,›‹Øþ@nˆ‚“¼@oÌŒ@pˆ–’@p,‚ˆ’Âü–üà@o$@o¨ö@nœ›‹Øþ@kÌ‚“¼@mŒ@nˆ–’@mp‚ˆ–’@m,ü–üà@lh@lìö@kà›‹Øþ@i‚“¼@jTŒ@kDˆ–’@j´‚ˆ–’@jpü–üà@i¬@j0ö@i$›‹Øþ@fT‚“¼@g˜Œ@hˆˆ–’@gø‚ˆ–’@g´ü–üà@fð@gtö@fh›‹Øþ@c˜‚“¼@dÜŒ@ë–’@e<‚ˆ–’@døü–üà@d4@d¸ö@c¬›‹Øþ@`Ü‚“¼@b Œ@cˆ–’@b€‚ˆ–’@b<ü–üà@ax@aüö@`ð›‹Øþ@^ ‚“¼@_dŒ@`Tˆ–’@_Ä‚ˆ–’@_€ü–üà@^¼@_@ö@^4›‹Øþ@[d‚“¼@\¨Œ@]˜ˆ–’@]‚ˆ–’@\Äü–üà@\@\„ö@[x›‹Øþ@XÔ‚“¼@ZŒ@Z܈–’@Zx‚ˆ’Âü–üà@Yp@Yôö@X蛋Øþ@VD‚“¼@WˆŒ@XLˆ–’@W肈’Âü–üà@Và@Wdö@VX›‹Øþ@Sˆ‚“¼@TÌŒ@U¼ˆ–’@U,‚ˆ–’@Tèü–üà@T$@T¨ö@Sœ›‹Øþ@PÌ‚“¼@RŒ@Sˆ–’@Rp‚ˆ–’@R,ü–üà@Qh@Qìö@Pà›‹Øþ@N‚“¼@OTŒ@PDˆ–’@O´‚ˆ–’@Opü–üà@N¬@O0ö@N$›‹Øþ@KT‚“¼@L˜Œ@Mˆˆ–’@Lø‚ˆ–’@L´ü–üà@Kð@Ltö@Kh›‹Øþ@H˜‚“¼@IÜŒ@J̈–’@J<‚ˆ–’@Iøü–üà@I4@I¸ö@H¬›‹Øþ@EÜ‚“¼@G Œ@Hˆ–’@G€‚ˆ–’@G<ü–üà@Fx@Füö@Eð›‹Øþ@C ‚“¼@DdŒ@ETˆ–’@DÄ‚ˆ–’@D€ü–üà@C¼@D@ö@C4›‹Øþ@@‚“¼@AÔŒ@B˜ˆ–’@B4‚ˆ’Âü–üà@A,@A°ö@@¤›‹Øþ@>‚“¼@?DŒ@@ˆ–’@?¤‚ˆ’Âü–üà@>œ@? ö@>›‹Øþ@;D‚“¼@<ˆŒ@=xˆ–’@<肈–’@<¤ü–üà@;à@’?§ðŠ˜¦ˆ–’?¨8ü–üÊ?§\¸?§(þþÆ—ˆÁ?¥à¸?¥t›ãþ?¡H‚“®?¢\Œ?¥ˆ’?¢xü–?£&’?£ØŠ˜®ˆ–’?¤ ü–ü—?£Ð?£D¸?£þþÆ—ˆÁ?¡È¸?¡\›ãþ? Ðˆ›ãþø+ô? ´†üü+Ð?Ÿ4ˆþŸ?  ƒù?ŸÄ†ˆ¦õ·ä†‹Ø’ÍþøôüþÎþø+Ì?Ÿƒù?—X„?›à“¼?DŠ˜?ž´ˆ’?žP‚ˆ’?à‚ˆ’—ÓÐü–ü—Óêö?œx?öøŸß?›ð›‹ùßþ?™h‚“¼?š¬Œ?›€ˆ’?›‚ˆ’?šÈü–ü—Óö?š?šˆö?™|›‹ùßþ?—dˆ›?™0?—²’úþŸ?™„‚öꆆö?˜†ˆ¦õ·ä†‹Ø’ÍþøôüþÀþø?–¸†ˆ›Ÿì†Òþø?“´„†“?”‚?•8Œ?–\ˆ’?•ø‚ˆ’?•˜‚ˆ’êØü–üêö?”|?•öøþ?“Ø›™ò†óßþøü+À?“0?“°Âˆ›‘Òþøò†ƒù+¼?yL?‘“®?’$Œ¦ˆ–’?’@ü–üà?‘¸?‘$›ãþ?‚“®?$Œ¦ˆ–’?@ü–üà?¸?$›ãþ?‚“®?Ž$Œ¦ˆ–’?Ž@ü–üà?¸?$›ãþ?‹‚“®?Œ$Œ¦ˆ–’?Œ@ü–üà?‹¸?‹$›ãþ?‰‚“®?Š$Œ¦ˆ–’?Š@ü–üà?‰¸?‰$›ãþ?‡‚“®?ˆ$Œ¦ˆ–’?ˆ@ü–üà?‡¸?‡$›ãþ?ƒ‚“®?„Œ?†´ˆ’?„8ü–?„æ’?…˜Š˜¦ˆ–’?…àü–üÊ?…¸?„ÐþþÆ—ˆÁ?ƒˆ¸?ƒ›ãþ?~ð‚“®?€Œ?‚¬ˆ’?€ ü–?€Î’?€Š˜®ˆ–’?Èü–ü—?x?€ì¸?€¸þþÆ—ˆÁ?p¸?›ãþ?yP“®?{?~¤’?{øüøüøüøüøüøüøü?yÌ?zPö?y`›ãþø+¸?y$Žú‚ú‚üü+°?y †üü+¬?xTˆ›™ò†Òþø+¨?x8ƒùö†ü+¤?wˆˆ›Ÿì†Òþø+˜?tp?u “¼?vLŒ?w ˆ’?v¼‚ˆ’êÐü–ü—Óö?u¤?v(øþ?u›‹†óßþ?ttˆ›‹†óßþø+Œ?q˜“®?r¨Ž?sð–’?rÀþ˜þ––’?r ?r¸?q¨›ãþøö†ü+ˆ?qlüò„†üü+€?q<ƒù+|?Lƒ?q$þ?L?q?LþŸ?qƒù?O „?pPˆ¦õ§ì†Êþ?k˜‚“?lJ?m?p’?m?oØ?mø?n¬?o\þ–?n¨––’êêê?m?n€?lüø¢˜?nˆ’êÊ‚ˆ’?mdü–ü—ÓêÞ?lD?lÌþøþ?k¬¦õ§üð†üÎþ?O,“?OÚ?P¬?kL’?P¨?k$?P¤ø?i¨?jXþ––þþ?i¤––’êêê?P?i|?PŒø¢?hL?iˆ’ꂈ’—?hPü–ü—Ó?P¸¡?h0þ?Pöü?h?PêþŸ?h ƒù?[(„?g\ˆ¦õ§ì†Êþ?aD‚“?aö?bà?g ’?bÜ?fäê„?bØø?e(˜?f\ˆ’ê?e ‚Šþ–’êêØü–üêê?bÄ?e?bÀø?cÔ?d„þ–?cЖ–’êêê?b¬?c¨?b¨ø°¦ˆ’Âü–üêÒ?að?bxþøþ?aX¦õ§üð†üÎþ?[4“?[â?\Ì?`ø’?\È?`Ðê„?\Äø?_˜?`Hˆ’ê?_Œ‚Šþ–’êêØü–üêê?\°?^ì?\¬ø?]À?^pþ–?]¼––’êêê?\˜?]”?\”ø°¦ˆ’Âü–üêÒ?[Ü?\dþøþ?[D¦õ§üð†üÎþø?X¸†“¼?YðŒ¦Šþž’—Óâ—Áü–üêö?Y\ºþ?XÔ¦÷þ™üïßþøê†ˆþö?S`†“¶?TÔ?XD’?T¼?W¦ˆ’Âü–ü?T¤?V€¦Šþ–’êêØü–ü?TŒ°?U¬þ––þþ?Tè––’—Óêê?Søºþ?S|¦õ™Êþø?R †ˆ¦õ¯ì†ã’Íþø?Qð†—ñ¦õ“†Êþø?Q0†—ñ¦õ“†‹?QHþøôüþ?Pt?OÔ?P\þøþ?O<¦õ§üð†üÎþø?NŒ†ˆ¦õ™Êþø?M̆ˆ¦õ¯ì†ã’Íþø?M†—ñ¦õ“†Êþø?L\†—ñ¦õ“†‹?LtþøôüþÞ+t?Kèƒù+p>3?HÀ“?Iz?J0Œ?K€ˆ’ê?Jð‚ˆ–’?J‚ˆ’Âü–üà?It?Jþöö?HЛ­ìòØþ?Eœ‚“?FZ?GŒ?H`ˆ’êÊ‚ˆ’?Gp‚ˆ–’?G,ü–üà?FT?Fðþöö?E°›­ìòØþ?B|‚“?C:?CðŒ?E@ˆ’êÊ‚ˆ’?DP‚ˆ–’?D ü–üà?C4?CÐþöö?B›­ìòØþ??\‚“?@?@ÐŒ?B ˆ’êÊ‚ˆ’?A0‚ˆ–’?@ìü–üà?@?@°þöö??p›­ìòØþ?<<‚“?<ú?=°Œ??ˆ’êÊ‚ˆ’?>‚ˆ–’?=Ìü–üà?<ô?=þöö?ÿÔ‚“?’?HŒ?˜ˆ’ê?‚ˆ–’?¨‚ˆ’Âü–üà?Œ?(þöö>ÿè›­ìòØþ>ü´‚“>ýr>þ(Œ>ÿxˆ’ê>þ肈–’>þˆ‚ˆ’Âü–üà>ýl>þþöö>üÈ›­ìòØþ>ùh‚“>ú&>úÜŒ>üXˆ’ê>ûÈ‚ˆ–’>û<‚ˆ–’>úøü–üà>ú >ú¼þöö>ù|›­ìòØþ>ö‚“>öÚ>÷Œ>ù ˆ’ê>ø|‚ˆ–’>÷ð‚ˆ–’>÷¬ü–üà>öÔ>÷pþöö>ö0›­ìòØþ>òЂ“>óŽ>ôDŒ>õÀˆ’ê>õ0‚ˆ–’>ô¤‚ˆ–’>ô`ü–üà>óˆ>ô$þöö>òä›­ìòØþ>ï„‚“>ðB>ðøŒ>òtˆ’ê>ñ䂈–’>ñX‚ˆ–’>ñü–üà>ð<>ðØþöö>­ìòØþ>ì8‚“>ìö>í¬Œ>ï(ˆ’ê>ˆ–’>î ‚ˆ–’>íÈü–üà>ìð>íŒþöö>ìL›­ìòØþ>èì‚“>éª>ê`Œ>ë܈’ê>ëL‚ˆ–’>êÀ‚ˆ–’>ê|ü–üà>é¤>ê@þöö>é›­ìòØþ>å ‚“>æ^>çŒ>舒ê>肈–’>çt‚ˆ–’>ç0ü–üà>æX>æôþöö>å´›­ìòØþ> “>ã>>ãôŒ>åDˆ’ê>ä´‚ˆ–’>äT‚ˆ’Âü–üà>ã8>ãÔþöö>â”›­ìòØþ>ß`‚“>à>àÔŒ>â$ˆ’ê>ᔂˆ–’>á4‚ˆ’Âü–üà>à>à´þöö>ßt›­ìòØþ>Ü‚“>ÜÒ>݈Œ>߈’ê>Þt‚ˆ–’>Ý肈–’>ݤü–üà>ÜÌ>Ýhþöö>Ü(›­ìòØþ>ØÈ‚“>Ù†>Ú<Œ>Û¸ˆ’ê>Û(‚ˆ–’>Úœ‚ˆ–’>ÚXü–üà>Ù€>Úþöö>ØÜ›­ìòØþ>Õ|‚“>Ö:>ÖðŒ>Ølˆ’ê>×Ü‚ˆ–’>×P‚ˆ–’>× ü–üà>Ö4>ÖÐþöö>Õ›­ìòØþ>Ò0‚“>Òî>Ó¤Œ>Õ ˆ’ê>Ô‚ˆ–’>Ô‚ˆ–’>ÓÀü–üà>Òè>Ó„þöö>ÒD›­ìòØþ>Îä‚“>Ï¢>ÐXŒ>ÑÔˆ’ê>ÑD‚ˆ–’>и‚ˆ–’>Ðtü–üà>Ïœ>Ð8þöö>Îø›­ìòØþ>˘‚“>ÌV>Í Œ>Έˆ’ê>Íø‚ˆ–’>Íl‚ˆ–’>Í(ü–üà>ÌP>Ììþöö>ˬ›­ìòØþ>ÈL‚“>É >ÉÀŒ>Ë<ˆ’ê>ʬ‚ˆ–’>Ê ‚ˆ–’>ÉÜü–üà>É>É þöö>È`›­ìòØþ>Å,‚“>Åê>Æ Œ>Çðˆ’ê>Ç`‚ˆ–’>Ç‚ˆ’Âü–üà>Åä>Æ€þöö>Å@›­ìòØþ> ‚“>ÂÊ>ÀŒ>ÄЈ’ê>Ä@‚ˆ–’>Ãà‚ˆ’Âü–üà>ÂÄ>Ã`þöö> ›­ìòØþ>¾À‚“>¿~>À4Œ>Á°ˆ’ê>Á ‚ˆ–’>À”‚ˆ–’>ÀPü–üà>¿x>Àþöö>¾Ô›­ìòØþ>»t‚“>¼2>¼èŒ>¾dˆ’ê>½Ô‚ˆ–’>½H‚ˆ–’>½ü–üà>¼,>¼Èþöö>»ˆ›­ìòØþ>¸(‚“>¸æ>¹œŒ>»ˆ’ê>ºˆ‚ˆ–’>¹ü‚ˆ–’>¹¸ü–üà>¸à>¹|þöö>¸<›­ìòØþ>´Ü‚“>µš>¶PŒ>·Ìˆ’ê>·<‚ˆ–’>¶°‚ˆ–’>¶lü–üà>µ”>¶0þöö>´ð›­ìòØþ>±‚“>²N>³Œ>´€ˆ’ê>³ð‚ˆ–’>³d‚ˆ–’>³ ü–üà>²H>²äþöö>±¤›­ìòØþ>®D‚“>¯>¯¸Œ>±4ˆ’ê>°¤‚ˆ–’>°‚ˆ–’>¯Ôü–üà>®ü>¯˜þöö>®X›­ìòØþ>ªø‚“>«¶>¬lŒ>­èˆ’ê>­X‚ˆ–’>¬Ì‚ˆ–’>¬ˆü–üà>«°>¬Lþöö>« ›­ìòØþ>§Ø‚“>¨–>©LŒ>ªœˆ’ê>ª ‚ˆ–’>©¬‚ˆ’Âü–üà>¨>©,þöö>§ì›­ìòØþ>¤¸‚“>¥v>¦,Œ>§|ˆ’ê>¦ì‚ˆ–’>¦Œ‚ˆ’Âü–üà>¥p>¦ þöö>¤Ì›­ìòØþ>¡l‚“>¢*>¢àŒ>¤\ˆ’ê>£Ì‚ˆ–’>£@‚ˆ–’>¢üü–üà>¢$>¢Àþöö>¡€›­ìòØþ>ž ‚“>žÞ>Ÿ”Œ>¡ˆ’ê> €‚ˆ–’>Ÿô‚ˆ–’>Ÿ°ü–üà>žØ>Ÿtþöö>ž4›­ìòØþ>šÔ‚“>›’>œHŒ>Ĉ’ê>4‚ˆ–’>œ¨‚ˆ–’>œdü–üà>›Œ>œ(þöö>šè›­ìòØþ>—ˆ‚“>˜F>˜üŒ>šxˆ’ê>™è‚ˆ–’>™\‚ˆ–’>™ü–üà>˜@>˜Üþöö>—œ›­ìòØþ>”<‚“>”ú>•°Œ>—,ˆ’ê>–œ‚ˆ–’>–‚ˆ–’>•Ìü–üà>”ô>•þöö>”P›­ìòØþ>ð‚“>‘®>’dŒ>“àˆ’ê>“P‚ˆ–’>’Ä‚ˆ–’>’€ü–üà>‘¨>’Dþöö>‘›­ìòØþ>¤‚“>Žb>Œ>”ˆ’ê>‚ˆ–’>x‚ˆ–’>4ü–üà>Ž\>Žøþöö>¸›­ìòØþ>Š„‚“>‹B>‹øŒ>Hˆ’ê>Œ¸‚ˆ–’>ŒX‚ˆ’Âü–üà>‹<>‹Øþöö>Š˜›­ìòØþ>‡d‚“>ˆ">ˆØŒ>Š(ˆ’ê>‰˜‚ˆ–’>‰8‚ˆ’Âü–üà>ˆ>ˆ¸þöö>‡x›­ìòØþ>„‚“>„Ö>…ŒŒ>‡ˆ’ê>†x‚ˆ–’>…삈–’>…¨ü–üà>„Ð>…lþöö>„,›­ìòØþ>€Ì‚“>Š>‚@Œ>ƒ¼ˆ’ê>ƒ,‚ˆ–’>‚ ‚ˆ–’>‚\ü–üà>„>‚ þöö>€à›­ìòØþ>}€‚“>~>>~ôŒ>€pˆ’ê>à‚ˆ–’>T‚ˆ–’>ü–üà>~8>~Ôþöö>}”›­ìòØþ>z4‚“>zò>{¨Œ>}$ˆ’ê>|”‚ˆ–’>|‚ˆ–’>{Äü–üà>zì>{ˆþöö>zH›­ìòØþ>vè‚“>w¦>x\Œ>y؈’ê>yH‚ˆ–’>x¼‚ˆ–’>xxü–üà>w >x<þöö>vü›­ìòØþ>sœ‚“>tZ>uŒ>vŒˆ’ê>uü‚ˆ–’>up‚ˆ–’>u,ü–üà>tT>tðþöö>s°›­ìòØþ>pP‚“>q>qÄŒ>s@ˆ’ê>r°‚ˆ–’>r$‚ˆ–’>qàü–üà>q>q¤þöö>pd›­ìòØþ>m0‚“>mî>n¤Œ>oôˆ’ê>od‚ˆ–’>o‚ˆ’Âü–üà>mè>n„þöö>mD›­ìòØþ>j‚“>jÎ>k„Œ>lÔˆ’ê>lD‚ˆ–’>k䂈’Âü–üà>jÈ>kdþöö>j$›­ìòØþ>fÄ‚“>g‚>h8Œ>i´ˆ’ê>i$‚ˆ–’>h˜‚ˆ–’>hTü–üà>g|>hþöö>fØ›­ìòØþ>cx‚“>d6>dìŒ>fhˆ’ê>eØ‚ˆ–’>eL‚ˆ–’>eü–üà>d0>dÌþöö>cŒ›­ìòØþ>`,‚“>`ê>a Œ>cˆ’ê>bŒ‚ˆ–’>b‚ˆ–’>a¼ü–üà>`ä>a€þöö>`@›­ìòØþ>\à‚“>]ž>^TŒ>_Ј’ê>_@‚ˆ–’>^´‚ˆ–’>^pü–üà>]˜>^4þöö>\ô›­ìòØþ>Y”‚“>ZR>[Œ>\„ˆ’ê>[ô‚ˆ–’>[h‚ˆ–’>[$ü–üà>ZL>Zèþöö>Y¨›­ìòØþ>VH‚“>W>W¼Œ>Y8ˆ’ê>X¨‚ˆ–’>X‚ˆ–’>WØü–üà>W>Wœþöö>V\›­ìòØþ>Rü‚“>Sº>TpŒ>U숒ê>U\‚ˆ–’>TЂˆ–’>TŒü–üà>S´>TPþöö>S›­ìòØþ>OÜ‚“>Pš>QPŒ>R ˆ’ê>R‚ˆ–’>Q°‚ˆ’Âü–üà>P”>Q0þöö>Oð›­ìòØþ>Ih‚“>J&>JÜŒ>O€ˆ’êÊ‚ˆ’>N¼‚ˆ’>Jøü–>KÞ’>L¸Š˜>N`ˆ’ê>MЂˆ–’>MD‚ˆ–’>Mü–üÊ>Kü>L˜þöö>KÈþþ>K—ˆ­ìò>JÔ>J >J¼þöö>I|›­ìòØþ>Bä‚“>C¢>DXŒ>I ˆ’êÊ‚ˆ’>HH‚ˆ’>Dtü–>EZ’>F4Š˜>G숒ê>G\‚ˆ–’>FЂˆ–’>F|ü–ü—>F,>Ex>Fþöö>EDþþ>D—ˆ­ìò>DP>Cœ>D8þöö>Bø›­ìòØþ>3“>3Ò>6¤>B˜’>6œø>?t>@0˜>Ahþ–˜þ–’>@\–˜þ–’>?p––’—Ó>6„øüøüøüøüøüøüøüøüøüøüøüøüøüôøüøüøüøüøü>3Ì>4 ööøþöö>3(›­ìòØþø+l>è>1“®>2 Œ¦ˆ–’>2<ü–üà>1Œ¸>1 ›ãþ>/ ‚“®>0 Œ¦ˆ–’>0<ü–üà>/Œ¸>/ ›ãþ>- ‚“®>. Œ¦ˆ–’>.<ü–üà>-Œ¸>- ›ãþ>+ ‚“®>, Œ¦ˆ–’>,<ü–üà>+Œ¸>+ ›ãþ>) ‚“®>* Œ¦ˆ–’>*<ü–üà>)Œ¸>) ›ãþ>' ‚“®>( Œ¦ˆ–’>(<ü–üà>'Œ¸>' ›ãþ>#‚“®>$Œ>&°ˆ’>$4ü–>$â’>%”Š˜¦ˆ–’>%Üü–üÊ>%¸>$ÌþþÆ—ˆÁ>#„¸>#›ãþ>ì‚“®> Œ>"¨ˆ’> ü–> Ê’>!|Š˜®ˆ–’>!Äü–ü—>!t> è¸> ´þþÆ—ˆÁ>l¸>›ãþ>ì“®>\> ’>Tøüøüøüøü>h¸>ü›ãþø+h>Іüü+P>Pˆ›ãþø+L>”ˆ›­ì†ì†Òþø+<=70>ü“¼><Œ>ˆ–’>œ‚ˆ’Âü–üà>”>ö> ›‹Øþ>h‚“¼>¬Œ>œˆ’> ‚ˆ–’>Èü–üà>>ˆö>|›‹Øþ>Ø‚“¼>Œ> ˆ’>|‚ˆ–’>8ü–üà>t>øö>웋Øþ>H‚“¼>ŒŒ>|ˆ’>삈–’>¨ü–üà>ä>hö>\›‹Øþ> ¸‚“¼> üŒ>숒>\‚ˆ–’>ü–üà> T> Øö> Ì›‹Øþ> (‚“¼> lŒ> \ˆ’> Ì‚ˆ–’> ˆü–üà> Ä> Hö> <›‹Øþ>˜‚“¼>ÜŒ> ̈’> <‚ˆ–’>øü–üà>4>¸ö>¬›‹Øþ>‚“¼>LŒ><ˆ’>¬‚ˆ–’>hü–üà>¤>(ö>›‹Øþ>x‚“¼>¼Œ>¬ˆ’>‚ˆ–’>Øü–üà>>˜ö>Œ›‹Øþ=ÿè‚“¼>,Œ>ˆ’>Œ‚ˆ–’>Hü–üà>„>ö=ÿü›‹Øþ=ýX‚“¼=þœŒ=ÿŒˆ’=þü‚ˆ–’=þ¸ü–üà=ýô=þxö=ýl›‹Øþ=úÈ‚“¼=ü Œ=üüˆ’=ül‚ˆ–’=ü(ü–üà=ûd=ûèö=úÜ›‹Øþ=ø8‚“¼=ù|Œ=úlˆ’=ùÜ‚ˆ–’=ù˜ü–üà=øÔ=ùXö=øL›‹Øþ=õ¨‚“¼=öìŒ=÷܈’=÷L‚ˆ–’=÷ü–üà=öD=öÈö=õ¼›‹Øþ=ó‚“¼=ô\Œ=õLˆ’=ô¼‚ˆ–’=ôxü–üà=ó´=ô8ö=ó,›‹Øþ=ðˆ‚“¼=ñÌŒ=ò¼ˆ’=ò,‚ˆ–’=ñèü–üà=ñ$=ñ¨ö=𜛋Øþ=íø‚“¼=ï<Œ=ðˆ–’=ˆ’Âü–üà=î”=ïö=î ›‹Øþ=ë<‚“¼=쀌=ípˆ–’=ìà‚ˆ–’=ìœü–üà=ëØ=ì\ö=ëP›‹Øþ=耂“¼=éÄŒ=ê´ˆ–’=ê$‚ˆ–’=éàü–üà=é=é ö=è”›‹Øþ=åÄ‚“¼=çŒ=çøˆ–’=çh‚ˆ–’=ç$ü–üà=æ`=æäö=娛‹Øþ=ã‚“¼=äLŒ=å<ˆ–’=䬂ˆ–’=ähü–üà=ã¤=ä(ö=㛋Øþ=àL‚“¼=áŒ= –’=áð‚ˆ–’=á¬ü–üà=àè=álö=à`›‹Øþ=Ý‚“¼=ÞÔŒ=ßĈ–’=ß4‚ˆ–’=Þðü–üà=Þ,=Þ°ö=ݤ›‹Øþ=Û‚“¼=ÜDŒ=݈–’=ܤ‚ˆ’Âü–üà=Ûœ=Ü ö=Û›‹Øþ=Øp‚“¼=Ù´Œ=Úxˆ–’=Ú‚ˆ’Âü–üà=Ù =Ùö=Ø„›‹Øþ=Õ´‚“¼=ÖøŒ=×舖’=×X‚ˆ–’=×ü–üà=ÖP=ÖÔö=ÕÈ›‹Øþ=Òø‚“¼=Ô<Œ=Õ,ˆ–’=Ôœ‚ˆ–’=ÔXü–üà=Ó”=Ôö=Ó ›‹Øþ=Ð<‚“¼=Ñ€Œ=Òpˆ–’=Ñà‚ˆ–’=Ñœü–üà=ÐØ=Ñ\ö=ÐP›‹Øþ=Í€‚“¼=ÎÄŒ=Ï´ˆ–’=Ï$‚ˆ–’=Îàü–üà=Î=Πö=Í”›‹Øþ=ÊÄ‚“¼=ÌŒ=Ìøˆ–’=Ìh‚ˆ–’=Ì$ü–üà=Ë`=Ëäö=ÊØ›‹Øþ=È‚“¼=ÉLŒ=Ê<ˆ–’=ɬ‚ˆ–’=Éhü–üà=Ȥ=É(ö=È›‹Øþ=ÅL‚“¼=ÆŒ=Ç€ˆ–’=Æð‚ˆ–’=Ƭü–üà=Åè=Ælö=Å`›‹Øþ=¼‚“¼=ÄŒ=ÄĈ–’=Ä`‚ˆ’Âü–üà=ÃX=ÃÜö=ÂЛ‹Øþ=À,‚“¼=ÁpŒ=Â4ˆ–’=ÁЂˆ’Âü–üà=ÀÈ=ÁLö=À@›‹Øþ=½p‚“¼=¾´Œ=¿¤ˆ–’=¿‚ˆ–’=¾Ðü–üà=¾ =¾ö=½„›‹Øþ=º´‚“¼=»øŒ=¼èˆ–’=¼X‚ˆ–’=¼ü–üà=»P=»Ôö=ºÈ›‹Øþ=·ø‚“¼=¹<Œ=º,ˆ–’=¹œ‚ˆ–’=¹Xü–üà=¸”=¹ö=¸ ›‹Øþ=µ<‚“¼=¶€Œ=·pˆ–’=¶à‚ˆ–’=¶œü–üà=µØ=¶\ö=µP›‹Øþ=²€‚“¼=³ÄŒ=´´ˆ–’=´$‚ˆ–’=³àü–üà=³=³ ö=²”›‹Øþ=¯Ä‚“¼=±Œ=±øˆ–’=±h‚ˆ–’=±$ü–üà=°`=°äö=¯Ø›‹Øþ=­‚“¼=®LŒ=¯<ˆ–’=®¬‚ˆ–’=®hü–üà=­¤=®(ö=­›‹Øþ=ªx‚“¼=«¼Œ=¬€ˆ–’=¬‚ˆ’Âü–üà=«=«˜ö=ªŒ›‹Øþ=§è‚“¼=©,Œ=©ðˆ–’=©Œ‚ˆ’Âü–üà=¨„=©ö=§ü›‹Øþ=¥,‚“¼=¦pŒ=§`ˆ–’=¦Ð‚ˆ–’=¦Œü–üà=¥È=¦Lö=¥@›‹Øþ=¢p‚“¼=£´Œ=¤¤ˆ–’=¤‚ˆ–’=£Ðü–üà=£ =£ö=¢„›‹Øþ=Ÿ´‚“¼= øŒ=¡èˆ–’=¡X‚ˆ–’=¡ü–üà= P= Ôö=ŸÈ›‹Øþ=œø‚“¼=ž<Œ=Ÿ,ˆ–’=žœ‚ˆ–’=žXü–üà=”=žö= ›‹Øþ=š<‚“¼=›€Œ=œpˆ–’=›à‚ˆ–’=›œü–üà=šØ=›\ö=šP›‹Øþ=—€‚“¼=˜ÄŒ=™´ˆ–’=™$‚ˆ–’=˜àü–üà=˜=˜ ö=—”›‹Øþ=”Ä‚“¼=–Œ=–øˆ–’=–h‚ˆ–’=–$ü–üà=•`=•äö=”Ø›‹Øþ=’4‚“¼=“xŒ=”<ˆ–’=“Ø‚ˆ’Âü–üà=’Ð=“Tö=’H›‹Øþ=¤‚“¼=èŒ=‘¬ˆ–’=‘H‚ˆ’Âü–üà=@=Äö=¸›‹Øþ=Œè‚“¼=Ž,Œ=ˆ–’=ŽŒ‚ˆ–’=ŽHü–üà=„=Žö=Œü›‹Øþ=Š,‚“¼=‹pŒ=Œ`ˆ–’=‹Ð‚ˆ–’=‹Œü–üà=ŠÈ=‹Lö=Š@›‹Øþ=‡p‚“¼=ˆ´Œ=‰¤ˆ–’=‰‚ˆ–’=ˆÐü–üà=ˆ =ˆö=‡„›‹Øþ=„´‚“¼=…øŒ=†èˆ–’=†X‚ˆ–’=†ü–üà=…P=…Ôö=„È›‹Øþ=ø‚“¼=ƒ<Œ=„,ˆ–’=ƒœ‚ˆ–’=ƒXü–üà=‚”=ƒö=‚ ›‹Øþ=<‚“¼=€€Œ=pˆ–’=€à‚ˆ–’=€œü–üà=Ø=€\ö=P›‹Øþ=|€‚“¼=}ÄŒ=~´ˆ–’=~$‚ˆ–’=}àü–üà=}=} ö=|”›‹Øþ=yð‚“¼={4Œ={øˆ–’={”‚ˆ’Âü–üà=zŒ={ö=z›‹Øþ=w`‚“¼=x¤Œ=yhˆ–’=y‚ˆ’Âü–üà=wü=x€ö=wt›‹Øþ=t¤‚“¼=uèŒ=v؈–’=vH‚ˆ–’=vü–üà=u@=uÄö=t¸›‹Øþ=qè‚“¼=s,Œ=tˆ–’=sŒ‚ˆ–’=sHü–üà=r„=sö=qü›‹Øþ=o,‚“¼=ppŒ=q`ˆ–’=pЂˆ–’=pŒü–üà=oÈ=pLö=o@›‹Øþ=lp‚“¼=m´Œ=n¤ˆ–’=n‚ˆ–’=mÐü–üà=m =mö=l„›‹Øþ=i´‚“¼=jøŒ=k舖’=kX‚ˆ–’=kü–üà=jP=jÔö=iÈ›‹Øþ=fø‚“¼=h<Œ=i,ˆ–’=hœ‚ˆ–’=hXü–üà=g”=hö=g ›‹Øþ=d<‚“¼=e€Œ=fpˆ–’=eà‚ˆ–’=eœü–üà=dØ=e\ö=dP›‹Øþ=a¬‚“¼=bðŒ=c´ˆ–’=cP‚ˆ’Âü–üà=bH=bÌö=aÀ›‹Øþ=_‚“¼=``Œ=a$ˆ–’=`À‚ˆ’Âü–üà=_¸=`<ö=_0›‹Øþ=\`‚“¼=]¤Œ=^”ˆ–’=^‚ˆ–’=]Àü–üà=\ü=]€ö=\t›‹Øþ=Y¤‚“¼=ZèŒ=[؈–’=[H‚ˆ–’=[ü–üà=Z@=ZÄö=Y¸›‹Øþ=Vè‚“¼=X,Œ=Yˆ–’=XŒ‚ˆ–’=XHü–üà=W„=Xö=Vü›‹Øþ=T,‚“¼=UpŒ=V`ˆ–’=UЂˆ–’=UŒü–üà=TÈ=ULö=T@›‹Øþ=Qp‚“¼=R´Œ=S¤ˆ–’=S‚ˆ–’=RÐü–üà=R =Rö=Q„›‹Øþ=N´‚“¼=OøŒ=P舖’=PX‚ˆ–’=Pü–üà=OP=OÔö=NÈ›‹Øþ=Kø‚“¼=M<Œ=N,ˆ–’=Mœ‚ˆ–’=MXü–üà=L”=Mö=L ›‹Øþ=Ih‚“¼=J¬Œ=Kpˆ–’=K ‚ˆ’Âü–üà=J=Jˆö=I|›‹Øþ=D‚“¼=EXŒ=I ˆ’=H¨‚ˆ’=Etü–=F>’=GŠ˜=H ˆ–’=G‚ˆ–’=GLü–üÊ=F\=Fàö=F(þþ=E—ˆ‹=EP=D°=E4ö=D(›‹Øþ=>°‚“¼=?ôŒ=C¸ˆ’=CT‚ˆ’=@ü–=@Ú’=A Š˜=B̈–’=B<‚ˆ–’=Aèü–ü—=A˜=@ø=A|ö=@Äþþ=@,—ˆ‹=?ì=?L=?Ðö=>Ä›‹Øþ=74“¼=9d=>d’=9\øüøüøüøüøüøüôøüøüøü=7Ì=8Pö=7D›‹Øþø=x„=4œ“¼=5ÜŒ=6̈’ê=6<‚ˆ–’=5øü–üà=54=5¼þö=4¬›ŸìØþ=2‚“¼=3LŒ=4<ˆ’ê=3¬‚ˆ–’=3hü–üà=2¤=3,þö=2›ŸìØþ=/x‚“¼=0¼Œ=1¬ˆ’ê=1‚ˆ–’=0Øü–üà=0=0œþö=/Œ›ŸìØþ=,è‚“¼=.,Œ=/ˆ’ê=.Œ‚ˆ–’=.Hü–üà=-„=. þö=,ü›ŸìØþ=*X‚“¼=+œŒ=,Œˆ’ê=+ü‚ˆ–’=+¸ü–üà=*ô=+|þö=*l›ŸìØþ='¸‚“¼=(üŒ=)숒—Ó=)\‚ˆ–’=)ü–üà=(T=(Üþö='Ì›ŸìØþ="(‚“¼=#ô='l’=#ìø=&,=&è–’=&(––’—Ó=#Ôø=$d=$ä˜=%ì„=%\‚ˆ–’=%ü–ü=$`–’=#¼øüøü="Ä=#pöøþö="<›ŸìØþ=ˆ‚“¼=T=!Ü’=Lø= œ=!X–’= ˜––’—Ó=4ø=Ä=D˜= \„=Ì‚ˆ–’=xü–ü—=À–’=øüøü=$=Ðöøþö=œ›ŸìØþ=„“¼=ø=<’=ðøüøüøüøüøüøüøüøüøüøüøüøü==´øþö=”›ŸìØþø+$=X“®=hŠ–˜þ–’êêÊ=Ôºþ=h›‘ÒþøÊ†ˆþþøò†ƒùú‚üü+ =¨ü+=@ˆŸßþøò†ƒùö†ü+=ü+ =ì†üü+=Ô†üü+=Èü*ü= ˆ›­ì†ì†óßþø*ð=Pˆ›™†ì†Òþøò†ƒù*ì<ù= 0“®= @Œ¦ˆ–’= \ü–üà= ¬¸= @›ãþ= ,‚“®= @Œ¦ˆ–’= \ü–üà= ¬¸= @›ãþ=,‚“®= @Œ¦ˆ–’= \ü–üà=¬¸=@›ãþ=,‚“®=@Œ¦ˆ–’=\ü–üà=¬¸=@›ãþ=,‚“®=@Œ¦ˆ–’=\ü–üà=¬¸=@›ãþ=,‚“®=@Œ¦ˆ–’=\ü–üà=¬¸=@›ãþ<þ$‚“®<ÿ8Œ=Ј’<ÿTü–=’=´Š˜¦ˆ–’=üü–üÊ= ¸<ÿìþþÆ—ˆÁ<þ¤¸<þ8›ãþ<ú ‚“®<û Œ<ýȈ’<û<ü–<ûê’<üœŠ˜®ˆ–’<üäü–ü—<ü”<ü¸<ûÔþþÆ—ˆÁ<úŒ¸<ú ›ãþ<ù”ˆ›ãþø*ä<ù|ƒù*Ü<øÜˆ›Ÿì†Òþøò†ƒù*Ð<ø$ˆ›Ÿì†Òþø*Ì<ø†üü*È<÷üüö†ü*Ä<÷0ˆ›­ì†ìùßþø<ö †ˆ›‘óßþø*¸<õðˆ›™†ì†óßþø*¬<õlˆ›‘Òþøö†ü*¤<õ@ƒù* <õ$ƒù*œ<ô ˆ›‘Òþø*<ôˆ›ãþøî„Šú‚üü*ˆ<íÔ“®<îäŽ<ðàþ––˜<ó$þ–’<ñ`–˜þ–˜þ˜¦Üü–üêêêêêê<îüþ˜<ðþ–’<ï$˜þ–’<îÜ<îP¸<íä›ãþø*t<ë “®<ì°Š˜¦ˆ–’<ìøü–üÊ<ì¸<ë°›ãþø*p<él“®<ê|Š˜¦ˆ–’<êÄü–üÊ<éè¸<é|›ãþø*h<éPƒù*d<é@ü*`<è ˆ›Ÿì†Òþøö†ü*T<è(ˆþþøò„†üü*L<<åx“¼<渌<ç|ˆ–’<炈’Âü–üà<æ<æ”ö<创‹Øþ<âä‚“¼<ä(Œ<划<䈂ˆ–’<äDü–üà<ã€<äö<âø›‹Øþ<àT‚“¼<ᘌ<∈’<áø‚ˆ–’<á´ü–üà<àð<átö<àh›‹Øþ<ÝÄ‚“¼<ߌ<ßøˆ’<ßh‚ˆ–’<ß$ü–üà<Þ`<Þäö<ÝØ›‹Øþ<Û4‚“¼<ÜxŒ<Ýhˆ’<ÜØ‚ˆ–’<Ü”ü–üà<ÛÐ<ÜTö<ÛH›‹Øþ<ؤ‚“¼<ÙèŒ<ÚØˆ’<ÚH‚ˆ–’<Úü–üà<Ù@<ÙÄö<ظ›‹Øþ<Ö‚“¼<×XŒ<ØHˆ’<׸‚ˆ–’<×tü–üà<Ö°<×4ö<Ö(›‹Øþ<Ó„‚“¼<ÔÈŒ<Õ¸ˆ’<Õ(‚ˆ–’<Ôäü–üà<Ô <Ô¤ö<Ó˜›‹Øþ<Ðô‚“¼<Ò8Œ<Ó(ˆ’<Ò˜‚ˆ–’<ÒTü–üà<Ñ<Òö<Ñ›‹Øþ<Îd‚“¼<ϨŒ<Иˆ’<Ђˆ–’<ÏÄü–üà<Ï<Ï„ö<Îx›‹Øþ<ËÔ‚“¼<ÍŒ<Έ’<Íx‚ˆ–’<Í4ü–üà<Ìp<Ìôö<Ë蛋Øþ<ÉD‚“¼<ʈŒ<Ëxˆ’<Ê肈–’<ʤü–üà<Éà<Êdö<ÉX›‹Øþ<Æ´‚“¼<ÇøŒ<È舒<ÈX‚ˆ–’<Èü–üà<ÇP<ÇÔö<ÆÈ›‹Øþ<Ä$‚“¼<ÅhŒ<ÆXˆ’<ÅÈ‚ˆ–’<Å„ü–üà<ÄÀ<ÅDö<Ä8›‹Øþ<Á”‚“¼<ÂØŒ<ÃȈ’<Ã8‚ˆ–’<Âôü–üà<Â0<´ö<Á¨›‹Øþ<¿‚“¼<ÀHŒ<Á8ˆ’<À¨‚ˆ–’<Àdü–üà<¿ <À$ö<¿›‹Øþ<¼t‚“¼<½¸Œ<¾|ˆ–’<¾‚ˆ’Âü–üà<½<½”ö<¼ˆ›‹Øþ<¹¸‚“¼<ºüŒ<»ìˆ–’<»\‚ˆ–’<»ü–üà<ºT<ºØö<¹Ì›‹Øþ<¶ü‚“¼<¸@Œ<¹0ˆ–’<¸ ‚ˆ–’<¸\ü–üà<·˜<¸ö<·›‹Øþ<´@‚“¼<µ„Œ<¶tˆ–’<µä‚ˆ–’<µ ü–üà<´Ü<µ`ö<´T›‹Øþ<±„‚“¼<²ÈŒ<³¸ˆ–’<³(‚ˆ–’<²äü–üà<² <²¤ö<±˜›‹Øþ<®È‚“¼<° Œ<°üˆ–’<°l‚ˆ–’<°(ü–üà<¯d<¯èö<®Ü›‹Øþ<¬ ‚“¼<­PŒ<®@ˆ–’<­°‚ˆ–’<­lü–üà<¬¨<­,ö<¬ ›‹Øþ<©|‚“¼<ªÀŒ<«„ˆ–’<« ‚ˆ’Âü–üà<ª<ªœö<©›‹Øþ<¦ì‚“¼<¨0Œ<¨ôˆ–’<¨‚ˆ’Âü–üà<§ˆ<¨ ö<§›‹Øþ<¤0‚“¼<¥tŒ<¦dˆ–’<¥Ô‚ˆ–’<¥ü–üà<¤Ì<¥Pö<¤D›‹Øþ<¡t‚“¼<¢¸Œ<£¨ˆ–’<£‚ˆ–’<¢Ôü–üà<¢<¢”ö<¡ˆ›‹Øþ<ž¸‚“¼<ŸüŒ< ìˆ–’< \‚ˆ–’< ü–üà<ŸT<ŸØö<žÌ›‹Øþ<›ü‚“¼<@Œ<ž0ˆ–’< ‚ˆ–’<\ü–üà<œ˜<ö<œ›‹Øþ<™@‚“¼<š„Œ<›tˆ–’<šä‚ˆ–’<š ü–üà<™Ü<š`ö<™T›‹Øþ<–„‚“¼<—ÈŒ<˜¸ˆ–’<˜(‚ˆ–’<—äü–üà<— <—¤ö<–˜›‹Øþ<“È‚“¼<• Œ<•üˆ–’<•l‚ˆ–’<•(ü–üà<”d<”èö<“Ü›‹Øþ<‘8‚“¼<’|Œ<“@ˆ–’<’Ü‚ˆ’Âü–üà<‘Ô<’Xö<‘L›‹Øþ<ލ‚“¼<ìŒ<°ˆ–’ìŒD<>Èö<=¼›‹Øþ<:ì‚“¼<<0Œ<= ˆ–’<<‚ˆ–’<PÜèè;=èô;<@èÐèèô;:èèô;9‚û¦Ö;8̦õ§üð†üÎþ;80ˆ¦õ™üÎþø;-T†—ü;."–ð;7,è;6lèèèè;5Ü;4,Üèè;2ôèô;2Ü;1,ÜèÐèèô;/4èèô;.&û¦Ö;-p¦õ§üð†üÎþø;,¤†ˆ¦õ§üð†üÎþø;)ü„;+¬ˆ¦õ;,”üð†üð†üð†üð†üÎþ;*È‚ˆ¦õ;+˜üð†üð†üð†üÎþ;*ˆ¦õµüð†üð†üÎþø;)L†ˆ¦õ§üð†üÎþø;(¸†ˆžþŠò„øÚö;($†ˆžþŠò„øÚö;ü„;#ô—ü;%Z–ð;'¼èè;&Ìèèèèô;%^û¦Ö;$¦õ;$쎆øðð†üè†üð†üð†üÎþ; —ü;!n–ð;#ˆÜÄÜÐèÁû¦Ö; ¦õ;!ކøðð†üè†üð†üð†üÎþø;P„; ˆ¦õ;ìüð†üð†üð†üÎþ;\ˆ¦õµüð†üð†üïßþø;¼†ˆžþŠò„øÚö; †ˆ¦õ§üð†üÎþø;x†ˆžþŠò„øÚö;Ȇˆ¦õ§üð†üÎþø;4†ˆžþŠò„øÚö; †ˆžþŠò„øÚö;,„;àˆ¦õµüð†üð†üÎþ;8ˆ¦õ§üð†üÎþø;˜†ˆ¦õ™üïßþø;†ˆ¦õ™üïßþø;p†ˆ¦õ™üÎþø;܆ˆžþŠò„øÚö;H†ˆžþŠò„øÚö;´†ˆžþŠò„øÚö:øÜ„; È—ü; –ð;èÄèèèèèÜè;LÄèèèèèÜ; èèèèôÄè; Æû¦Ö; ئõ; ¤üð†üè†üð†üÎþ;”‚—ü;’–ð; \ÜèÄèèèÜèèÜôÜè;–û¦Ö;¨¦õ;tüð†üè†üð†üÎþ;‚—ü;–ð;,èèèÜÐÜèÐÐèôÄèô;û¦Ö;0¦õ;üüð†üè†üð†üÎþ:øè—ü:ùâ–ð;´èèè;èèèèÜèÄÜÐÜÜèèè:ûäèèôÄèèô:ùæû¦Ö:øø¦õ:ùÄüð†üè†üð†üÎþø:ø†ˆ¦õµüð†üð†üÎþø:ñ„:ô¼—ü:ö–ð:÷ÜèèèèÁû¦Ö:ô̦õ:õ˜Ž†øðð†üè†üð†üÎþ:ñ—ü:òf–ð:ôPÜÄÜÐÁû¦Ö:ñ,¦õ:ñøŽ†øðð†üè†üð†üÎþø:ð`†ˆ¦õ§üð†üïßþø:ê8„:íä—ü:ï.–ð:ðèèÁû¦Ö:íô¦õ:îÀކøðð†üè†üð†üÎþ:êD—ü:뎖ð:íxÜÄÜÐÁû¦Ö:êT¦õ:ë Ž†øðð†üè†üð†üÎþø:á „:鄈¦õ§‹ñð†üÎþ:åX‚—ü:æV–ð:èèÜèèèÜèèÐèÁû¦Ö:ål¦õ:æ8üð†üè†üð†üÎþ:äx‚ˆ¦õ:åHüð†üð†üð†üÎþ:㤂ˆ¦õµ‹ñð†üð†üÎþ:âü‚ˆ¦õ§üð†üÎþ:âD‚ˆ¦õ§‹ñð†üÎþ:ᬈ¦õ™‹ñÎþøà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þð̆ƒ‹þŠò„øè̆ƒ‹þŠò„øèà†ƒ‹þðà†ƒ‹þð:Þx†ƒš†­Ïìþ³ŒƒùôüþÊ9†ƒ‹:Þ\ê„98›‘:Þ$ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ9„:Ô²:Õ8èÊ:Ó :ÔDèÊ:Ò4:Ó ÐèÖ:Ðà:ÑäÐèÊ:ÏŒ:ÐÐèÊ:ÎP:Ï ÜÊ:Í:ÍÐÜÊ:ËØ:ÌÜèÐÊ:Êœ:Ë èÐÊ:É`:ÊdèÐÊ:È$:É(èÐÊ:Ƹ:ǤÐèÖ:Å4:ÆPÐèèÖ:ð:ÄÌÐèèÖ:Â\:ÃèèÖ:ÁP:ÁôèÊ:ÀD:ÀèèÊ:¿8:¿ÜèÊ:¾,:¾ÐèÊ:½ :½ÄèÊ:¼:¼¸èÊ:»:»¬èÊ:¹ü:º èÊ:·@:¹¬èèèèÜèèèè:·Hþ¦ò‚:²¼:¶ðèÜèÜèÜèÜèèèÜèÜèè:²Äþ¦ò‚:£ :±|èÄÐÜè:¯<èôÄèôÄô:¬´Ðèè:«Üèè:©œÜèè:§Œèèè:¦$:¥|èè:¤Œèô:£¨þ¦ò‚:žì:£PÜÜèèèÄèè: ˜è:Ÿ¨è:žôþ¦ò‚:šP:žœÜÜèèèÄèè:›äè:› è:šXþ¦ò‚:’l:™èè:™(ÄèÜèèÄèèôÐèèÜÐ:”ðÄÐèÜèèè:’tþ¦ò‚:Œ8:’:‘Œ:äèÐÐèÜÐÐèèÐ:lèèô:Œ@þ¦ò‚:ƒd:‹è:‹(:Š€èÐÐ:‰èèôÐÐÐÄè:†0ÜèÜèèÜÐè:ƒlþ¦ò‚:wô:‚Xè:˜èÐÐèÜèèÜÜÜèèèÜèèôÜèèôÄèèèÄè:zèÐ:xøè:wüþ¦ò‚:mŒ:w`èèèÐèè:u€èèèè:t0èèôÐèèô:r :qè:pÐè:oøèÐ:nÀ:m”þ¦ò‚:aD:løèÜèèÐèèÜÜèèèôÐèèôÄÐÜÐèÄèèèÜÜô:e`è:dˆèÐ:cP:bHè:aLþ¦ò‚:S:`¬ÜÜèèèÄÜÜèèèèè:\ìè:\èèèÜÜÜèèèÄÜÜèèèèè:W|:VÔèèÐèèèÐèèèÄ:Sþ¦ò‚:JÔ:R˜ÐèÐèèÄèèèèèÐèèèèèÐèô:M(Üèô:K¨:JÜþ¦ò‚9z:JÀò‚9Vúþ³:I䈦õµüð†üð†üÎþø:I(†ˆ¦õ§üð†üÎþø:Hx†ˆ¦õ§ì†ëßþøö†ü:G¸†°Œò„øôÖ„Œò„øôö:G$†ˆ¦õ™üÎþø:Eô„:Fœˆ¦õ™üïßþ:Fˆ¦õ¡üç’Íþø:DÄ„:Elˆ¦õ™üïßþ:DЈ¦õ¡üç’Íþø:C”„:D<ˆ¦õ™üïßþ:C ˆ¦õ¡üç’Íþø:Bt„:C ˆ¦õ™üïßþ:B€ˆ¦õ™üïßþø:Aà†ˆ¦õ™üÎþø:&ô„:'Œ—ü:(N–ð:@ÐèÜèÐÜèÜÐÜèÜÐÜÐÐèÐèÐèÜÐèèÜÐèôÐèèôÐôÐèèè:68èôÄèô:3°ÐèÐèèÄÜèèÜèèèÄÜèèÜèèè:-ÈÜÜÄÐèôÄèô:):(Rû¦Ö:'œ¦õ§üð†üÎþ:'ˆ¦õ™üÎþø9UD†—ü:!–:%nüõ›:&t‹‹¤ò„ò„ò„øè:%œ†‹‹¼ê„ê„ê„øèÖþ:!:$¬èÐèÐèèÐèÐè:!û:! ò‚ò‚ò‚:²–:~üõ›: „‹‹¤ò„ò„ò„øè:¬†‹‹¼ê„ê„ê„øèÖþ:¾:¼èÐèÐèÐèè:¶û:@ò‚ò‚ò‚:2–:üõ›:$‹‹¤ò„ò„ò„øè:L†‹‹¼ê„ê„ê„øèÖþ:>:Œè:6û:Àò‚ò‚ò‚:ú–:žüõ›:¤‹‹¤ò„ò„ò„øè:̆‹‹¼ê„ê„ê„øèÖþ::$è:þû:ˆò‚ò‚ò‚:z–:füõ›:l‹‹¤ò„ò„ò„øè:”†‹‹¼ê„ê„ê„øèÖþ:†:Ôè:~û:ò‚ò‚ò‚: ú–:æüõ›:ì‹‹¤ò„ò„ò„øè:†‹‹¼ê„ê„ê„øèÖþ::Tè: þû:ˆò‚ò‚ò‚9l"–9möüõ›: l‹‹¤ò„ò„ò„øè9n$†‹‹: Dê„ê„ê„9nX›‘: ÄÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ9n¤:ª:ØÐè:”þ¾ò‚ò‚ò‚:x:ÜÜèè:€þ¾ò‚ò‚ò‚9þ”9ÿøÜèè9þœþ¾ò‚ò‚ò‚9üø9þè9ýþ¾ò‚ò‚ò‚9û\9üxè9ûdþ¾ò‚ò‚ò‚9ùÀ9úÜè9ùÈþ¾ò‚ò‚ò‚9ø$9ù@è9ø,þ¾ò‚ò‚ò‚9öˆ9÷¤è9öþ¾ò‚ò‚ò‚9ôÔ9õðè9ôÜþ¾ò‚ò‚ò‚9ó 9ô<è9ó(þ¾ò‚ò‚ò‚9ñl9òˆè9ñtþ¾ò‚ò‚ò‚9ï¸9ðÔè9ïÀþ¾ò‚ò‚ò‚9î9ï8è9î$þ¾ò‚ò‚ò‚9ì€9íœè9ìˆþ¾ò‚ò‚ò‚9êä9ìè9êìþ¾ò‚ò‚ò‚9é09ê|èè9é8þ¾ò‚ò‚ò‚9çL9èÈèèè9çTþ¾ò‚ò‚ò‚9å°9æäèè9å¸þ¾ò‚ò‚ò‚9ãÌ9å0èè9ãÔþ¾ò‚ò‚ò‚9â9ãdèèè9âþ¾ò‚ò‚ò‚9à49á˜èèè9à<þ¾ò‚ò‚ò‚9Þ°9ß´è9Þ¸þ¾ò‚ò‚ò‚9Üä9Þ`Ðè9Üìþ¾ò‚ò‚ò‚9ÛH9Üdè9ÛPþ¾ò‚ò‚ò‚9Ùd9ÚÈèè9Ùlþ¾ò‚ò‚ò‚9×€9Øäèè9׈þ¾ò‚ò‚ò‚9Õœ9×èè9Õ¤þ¾ò‚ò‚ò‚9Ó¸9Õèè9ÓÀþ¾ò‚ò‚ò‚9ÑÔ9Ó8èè9ÑÜþ¾ò‚ò‚ò‚9Ïð9ÑTèè9Ïøþ¾ò‚ò‚ò‚9Î 9Ïpèè9Îþ¾ò‚ò‚ò‚9Ì(9ÍŒèè9Ì0þ¾ò‚ò‚ò‚9ÊD9˨èè9ÊLþ¾ò‚ò‚ò‚9ÁÐ9ÉÄè9È\ÜÜ9Ç$ÜÄèè9ÅDèôÜèôÄèô9ÂÔ9ÁØþ¾ò‚ò‚ò‚9nš9ÁhŒ†Œò„øîòà†Œ†øòò‚ò‚9nvúþ³9ÀÔˆþö9À4†ˆ¦õ™üÎþø9¾l„9¿Xˆ¦õ9À$üð†üÓ•ò„øÌþ9¾xˆ¦õ9¿Düð†üÓ•ò„øÌþø9½„9½Èˆ¦õ§üð†üïßþ9½ ˆ¦õ§üð†üïßþø9»¼„9¼pˆ¦õ§üð†üïßþ9»Èˆ¦õ§üð†üïßþø9» †ˆ¦õ§üð†üïßþø9¹´„9ºhˆ¦õ§üð†üïßþ9¹Àˆ¦õ§üð†üïßþø9¹ †ˆ¦õ™üïßþø9¸Œ†ˆ¦õ™üïßþø9·ø†ˆ¦õ™üÎþø9·8†ˆ¦õ§‹ñð†üÎþø9µ„9¶xˆ¦õµüð†üð†üÎþ9µÌ‚ˆ¦õ§üð†üïßþ9µ(ˆ¦õ§üð†üÎþø9±4„9²¬—ü9³Š–ð9´´èèè9³Žû¦Ö9²¼¦õ½üè†üð†üÎþ9±ä‚ˆ¦õµüð†üð†üïßþ9±@ˆ¦õ§üð†üïßþø9° †ˆ¦õ™üïßþø9° †ˆ¦õ™üïßþø9¯x†ˆ¦õ™üÎþø9®X„9®ðˆ¦õ™üïßþ9®dˆ¦õ™üïßþø9­8„9­Ðˆ¦õ™üïßþ9­Dˆ¦õ™üïßþø9¬„9¬°ˆ¦õ™üïßþ9¬$ˆ¦õ™üïßþø9ªø„9«ˆ¦õ™üïßþ9«ˆ¦õ™üïßþø9ªd†ˆ¦õ™üïßþø9t„9§—ü9¨*–ð9©äÜèÐèèÁû¦Ö9§¦õ9§ü‹ñð†üð†üè†üð†üÎþ9£ˆ‚—ü9¤––ð9¦PÜèÐèèÁû¦Ö9£œ¦õ9¤h‹ñð†üè†üð†üÎþ9ƒä‚—ü9¦–9¢üõ›9£‹‹¤ò„ò„ò„øè9¢0†‹‹¼ê„ê„ê„øèÖþ9²9¡@èÐèÐèèÐèÐè9ªû9ž4ò‚ò‚ò‚9˜F–9œüõ›9‹‹¤ò„ò„ò„øè9œ@†‹‹¼ê„ê„ê„øèÖþ9˜R9›PèÐèÐèÐèè9˜Jû9˜Ôò‚ò‚ò‚9”Æ–9–²üõ›9—¸‹‹¤ò„ò„ò„øè9–à†‹‹¼ê„ê„ê„øèÖþ9”Ò9– è9”Êû9•Tò‚ò‚ò‚9‘Ž–9“2üõ›9”8‹‹¤ò„ò„ò„øè9“`†‹‹¼ê„ê„ê„øèÖþ9‘š9’¸è9‘’û9’ò‚ò‚ò‚9Ž–9úüõ›9‘‹‹¤ò„ò„ò„øè9(†‹‹¼ê„ê„ê„øèÖþ9Ž9hè9Žû9Žœò‚ò‚ò‚9ŠŽ–9Œzüõ›9€‹‹¤ò„ò„ò„øè9Œ¨†‹‹¼ê„ê„ê„øèÖþ9Šš9‹èè9Š’û9‹ò‚ò‚ò‚9‡&–9ˆúüõ›9Š‹‹¤ò„ò„ò„øè9‰(†‹‹¼ê„ê„ê„øèÖþ9‡29ˆhèè9‡*û9‡´ò‚ò‚ò‚9„Æ–ð9†hÐÐèèÁû¦Ö9ƒø¦õ½üè†üð†üÎþ9‚à‚ˆ¦õ9ƒ´‹ñà†‹ñð†üÎþ9‚‚ˆ¦õ§‹ñð†üÎþ9€ˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð†ƒ‹þŠšò„ò„øè†ƒ‹þŠšò„ò„øèʆƒ‹šò„ò„øð9sT†ƒš‘9`†ØŽÞŽÞŽÞŽÞŽÞŽ9}àŽŒŒ„ò„ø9s°9|J9}xèèèè9|49z¨9{Äèèè9z°9y$9z@èèè9y,Êõ9wä·èÖ9sžòúþ³9v°9w@ˆ¦õ§üð†üÎþ9v´ˆ¦õ™üÎþøê†ˆþö9sü„9uÀˆ¦õµüð†üð†üÎþ9t肈¦õ½ü膋ñð†üÎþ9tˆ¦õ9tØü膋ñ膋ñÎþøò†ƒùôüþÊ9q\†ƒš‘9sHÞŽÞŽÞŽ9q¦òúþ³9r°üö†üö†ü9r†´þò„þò„þꄉõöò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ùÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþ9n(Öþ9l.9mdèè9l&û9l°ò‚ò‚ò‚9V.–ð9k€èèÜè9iÐèÜÐÜÐèÐÜèÜèèÐÜèèÜÜèèèô9c ÜÜ9b€ÜÜèè9`ÐôÜèô9_˜ÜÜ9^`Üèèè9\ÈèèôÄèèôÄèôÄèôÄè9XèÐ9W@9V2û¦Ö9U`¦õµüð†üð†üÎþø9T”†ˆ¦õ§üð†üÎþø9Qì„9Sœˆ¦õ9T„üð†üð†üð†üð†üÎþ9R¸‚ˆ¦õ9Sˆüð†üð†üð†üÎþ9Qøˆ¦õµüð†üð†üÎþø9QX†ˆ¦õ™üÎþø9PĆˆ¦õ™üÎþø9P0†ˆ¦õ™üÎþø9N¼„9Opˆ¦õµüð†üð†üïßþ9NȈ¦õ§üð†üïßþø9Mà†ˆ¦õµ‹ñð†üð†üïßþø9LÀ„9MXˆ¦õ™üïßþ9L̈¦õ™üïßþø9K „9L8ˆ¦õ™üïßþ9K¬ˆ¦õ™üïßþø9J€„9Kˆ¦õ™üïßþ9JŒˆ¦õ™üïßþø9I`„9Iøˆ¦õ™üïßþ9Ilˆ¦õ™üïßþø9H̆ˆ¦õ™üÎþø9F¸„9Hˆ¦õ§‹á†Êþ9G\‚ˆ¦õ§‹ñð†üÎþ9FĈ¦õ™‹ñÎþø9F$†ˆ¦õ™üïßþø9E€†ˆ¦õ™‹ñïßþøÈ†ƒ‹†øðȆƒ‹†øð9%†ƒš‘9DœÞŽÞޯކ9C0ކž†ø9CŽÞŽÞŽ9AŽœ9B€èèè9A8ú›Ÿüð†ü9?PŽœ9@Ìèèè9?„ú›Ÿüð†ü9?(ŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ9%p9=*õ9<9<¼èèÖ9;$9;ÈèÊ9:09:ìè9:898Ü99˜èèÖ96ø98¤Üèè97lôÖ95¤96`èèÖ93À95lÜèè944ôÖ92ä·èÖ91À92”èÜÖ9%f91¬9%^òúþ³91Œˆþöð†ƒùð†ƒùð†ƒù9/ð„90ˆˆ¦õ£ð†üïßþ9/üˆ¦õ™üïßþø9.¤„9/Lˆ¦õ£ð†üïßþ9.°ˆ¦õ¡üç’Íþø9.†ˆ¦õ™üïßþø9-|†ˆ¦õ™üïßþø9'X„9+ˆ¦õ§ŽþŠ9,ÈŒþŠþŠ¸ÆŠþŠþŠ–èŠþ9,„ŒþŠþŠ¸ÆŠþŠþŠ–èŠþ9+Ä„øèð†üÎþ9)‚ˆ¦õ§ŽþŠ9*ŒŒþŠþŠ–èŠþ9* „ŒþŠþŠ–èŠþ9)Ì„øèð†üÎþ9'ü‚ˆ¦õ§‹‹†øèð†üÎþ9'dˆ¦õ™‹ñÎþøð†ƒù9&˜†ƒ‹þаò„Ü„øè9%ô†ƒ‹þаò„Ü„øèð†ƒùð†ƒùò†ƒùôüþÊ9$”†ƒ‹þŠþŠ–èŠþØò†ƒùð†ƒùð†ƒù9!†ƒš‘9$89"`Ž‘9$ÞŽ9"ºòúþ³9#Èü9#†9#°þÀ„ŒþŠþŠ–èŠþÜöò†ƒùôüþ9!Úòúþ³˜ˆþöò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ùò†ƒùôüþÀò†ƒùôüþÊ)ä9\†üü)à9Pü)Ü9°ˆ›Ÿì†óßþø)Ô9”†üü)Ä9ˆ›‘óßþø)À9Xˆ›™†ì†óßþø)¨9<†üü)¤9(ƒùö†ü) 9ƒùú‚üü)œ9ȃù)”9¸ü)Œ94ˆ›‘Òþø)|9“®9Š˜¦ˆ–’9Xü–üÊ9|¸9›ãþøò†ƒùö†ü)x9Àƒù)t8þð9¸“®9ÈŒ¦ˆ–’9äü–üà94¸9È›ãþ9´‚“®9ÈŒ¦ˆ–’9äü–üà94¸9È›ãþ9´‚“®9ÈŒ¦ˆ–’9äü–üà94¸9È›ãþ9´‚“®9ÈŒ¦ˆ–’9äü–üà94¸9È›ãþ9´‚“®9ÈŒ¦ˆ–’9äü–üà94¸9È›ãþ9 ´‚“®9 ÈŒ¦ˆ–’9 äü–üà9 4¸9 È›ãþ9¬‚“®9 ÀŒ9 Xˆ’9 Üü–9 Š’9 <Š˜¦ˆ–’9 „ü–üÊ9 ¨¸9 tþþÆ—ˆÁ9 ,¸9À›ãþ9”‚“®9¨Œ9Pˆ’9Äü–9r’9$Š˜®ˆ–’9lü–ü—99¸9\þþÆ—ˆÁ9¸9¨›ãþ8þô“®9À9H’9¸øüøüøüøüøüøüøü8ÿp8ÿôö8ÿ›ãþøò†ƒù)p8þÀ†üü)l8þ\ˆŸßþøò†ƒùò„†üü)h8þü)d8í“®8î,Š˜8ý|ˆ–’8îtü–8ï"’8ñ´8üÔ–––üê8ñ¬ø8ûpþ–˜þ˜¦Üü–üêê8ñ”øüôø8úˆ’8ñLøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøü8ï@¸8ï þþÆ—ˆ8î$8호8í,›ãþøò†ƒù)`8êôˆ›8ìÀ8ëB’úþŸ8줄‚öꆆö8ë †ˆ¦õ·ä†‹Ø’ÍþøôüþÀþø8êH†ˆ›‹Øþø)X8ê8†üü)P8霈›‹Øþø)D8á<“ ½Œ8鈖›ãþê8â8ü–8âæ’8㘎8åP8çà8è°ˆ’ê8çäü–ºþþÆ—ˆ‘8åL8æ|–––˜þ–’êêêê8åH––˜þ–’êê8ã°þ˜þ˜8ä´Î‚ˆ’êØü–ü8ã8ãºþ8âÐþþÆ—ˆ‘8â8áLþþø)@8Þ`“®8ßpŽ8ถ’8߈þ˜þ––’8ßh8Þܸ8Þp›ãþø)88ÞD†üü)48Þ,ü8Ý€†ˆ›Ÿì†Òþø),8Ýpüð†ü8ܨ†ˆ›ŸìØþø8Ù¸†“¼8ÛŠ˜8Ü ˆ–’8Û‚ˆ–’8ÛLü–üÊ8Ú\8Úàö8ÙÔ›‹Øþøò†ƒù)8ÌŒ“¼8ÍÌŠ˜8Ùˆ–’8؈‚ˆ–’8Îü–8ÎÞ’8Ñ 8Ø<’8Ñøüôøüôøüøüøüøüøüøüøüøüøüøüøü8Îü8Ï€ö8ÎÈþþ8Î0—ˆ‹8ÍÄ8Í$8ͨö8Ìœ›‹Øþø)8ËЈ›­ì†ì†Òþø) 8Ë´†üü)8Êüˆ›­ì†ì†Òþø(ü8Êìüò„†üü(ô8Êd«þÚ„üˆ„þôô÷ò†ƒù(ð8Ɉ›­ì†ì†Òþøò„†üü(è8É\ƒù(à8ÉLü8¹ˆ„8ÇD“®8ÈTŒ¦ˆ–’8Èpü–üà8ÇÀ¸8ÇT›ãþ8Å@‚“®8ÆTŒ¦ˆ–’8Æpü–üà8ÅÀ¸8ÅT›ãþ8Ã@‚“®8ÄTŒ¦ˆ–’8Äpü–üà8ÃÀ¸8ÃT›ãþ8Á@‚“®8ÂTŒ¦ˆ–’8Âpü–üà8ÁÀ¸8ÁT›ãþ8¿@‚“®8ÀTŒ¦ˆ–’8Àpü–üà8¿À¸8¿T›ãþ8½@‚“®8¾TŒ¦ˆ–’8¾pü–üà8½À¸8½T›ãþ8»l‚“®8¼€Œ¦ˆ’Âü–üà8»ì¸8»€›ãþ8¹˜‚“®8º¬Œ¦ˆ’Âü–üà8º¸8¹¬›ãþøüö†ü(Ü8³\“®8´lŽ8¶hþ––˜8¸¬þ–’8¶è–˜þ–˜þ˜¦Üü–üêêêêêê8´„þ˜8µŒþ–’8´¬˜þ–’8´d8³Ø¸8³l›ãþø(Ø8²„ˆ›§ò†ì†Òþø(Ð8©è“¼8«(Ž8­8°Ð8²ˆ’êÊ‚ˆ’8°Ôü–8±ˆþþ8°ð—ˆŸì8­Œ8®¼˜8°H–’8®è–––˜þ–’êêêê8­ˆ––˜þ–’êê8«@þ˜þ˜8¬ôÆ‚ˆ’—Ó8«œü–8¬Pþþ8«¸—ˆ‹†8« 8ª€8«þö8©ø›ŸìØþø(À8©dˆ›‘Òþøò„†üü(´8©<ü(°8¨œˆ›‹†óßþø(¤8§üˆ›ŸìØþø(8§xˆ›‘Òþø(ˆ8¦ð‡ü „þò„þò„þôô÷8¦D†ˆ›Ÿì†Òþø8¥À†ˆ›ãþø(„8¢´8£P“¼8¤Œ8¥dˆ’êÊ‚ˆ’êÐü–ü—Óö8£è8¤pþøþ8£`›Ÿì†óßþ8¢¸ˆ›Ÿì†óßþø(€8 ¨ˆ›8¢t8 ö’úþŸ8¢X„‚öꆆö8¡T†ˆ¦õ·ä†‹Ø’ÍþøôüþÀþøò†ƒù(|8Ÿ¸ˆ›»ìò†ì†Òþø(x8Ÿ¨üò†ƒù(p8ž¸ˆ›»ìòò†Òþøð†ƒù8œ\†“®8xŠ˜¦ˆ–’8Àü–üÊ8œä¸8œx›ãþø(h8œLƒùö†ü(`8œ,ü8˜„„†“¼8šŠ˜8›pж„Èüžü—Ë—8› ‚ˆ’ꂈ’—ÓÐü–ü—Óêö8™08™àþöøþøþ8˜¨›‹†óßþøü(T8˜ ˆ›‘Òþøò†ƒù(P8—؃ù(H8ŠÈ“®8‹ØŠ˜8—Dˆ–’8Œ ü–8ŒÎ’8Žè8–ô’8Žàøüøüøüøüøüøüøüøüøüøüøüøüôø8 ’8ø8þ˜¦ˆ’Âü–ü8x8Œì¸8Œ¸þþÆ—ˆ8‹Ð8‹D¸8ŠØ›ãþø(D8Š(ˆ›‹ùßþø(<8Šü(48‡T“¼8ˆ”Š˜8‰°ˆ’8‰ ‚ˆ–’8ˆÜü–üÊ8‡ì8ˆpö8‡d›‹Øþø(08†´ˆ›Ÿìùßþøð†ƒù((8†€ƒù($8…Ĉ›™†ì†óßþøö†ü(8…ˆ›Ÿì†óßþø( 8䓼8$Š˜8„¬ˆ’8„‚ˆ–’8lü–8‚6’8‚üŒ8ƒÀˆ’8ƒ\‚ˆ’Âü–üà8‚T8‚Øö8‚ þþ8ˆ—ˆ‹88€|8ö8ô›‹Øþø(8ȃù(8¬ƒù.Á†ƒš‘8”ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ.Áx8uR8v€Ðè8u<þ¾ò‚ò‚ò‚8s 8t„Üèè8s(þ¾ò‚ò‚ò‚8q<8r Üèè8qDþ¾ò‚ò‚ò‚8o 8p¼è8o¨þ¾ò‚ò‚ò‚8n8o è8n þ¾ò‚ò‚ò‚8lh8m„è8lpþ¾ò‚ò‚ò‚8jÌ8kèè8jÔþ¾ò‚ò‚ò‚8i08jLè8i8þ¾ò‚ò‚ò‚8g|8h˜è8g„þ¾ò‚ò‚ò‚8eÈ8fäè8eÐþ¾ò‚ò‚ò‚8d8e0è8dþ¾ò‚ò‚ò‚8b`8c|è8bhþ¾ò‚ò‚ò‚8`Ä8aàè8`Ìþ¾ò‚ò‚ò‚8_(8`Dè8_0þ¾ò‚ò‚ò‚8]Œ8^¨è8]”þ¾ò‚ò‚ò‚8Zè8]$ÜÜèèÜ8Zðþ¾ò‚ò‚ò‚8Y48Z€èè8Y<þ¾ò‚ò‚ò‚8WP8XÌèèè8WXþ¾ò‚ò‚ò‚8U´8Vèèè8U¼þ¾ò‚ò‚ò‚8SÐ8U4èè8SØþ¾ò‚ò‚ò‚8R8Shèèè8R þ¾ò‚ò‚ò‚8P88Qœèèè8P@þ¾ò‚ò‚ò‚8N´8O¸è8N¼þ¾ò‚ò‚ò‚8Lè8NdÐè8Lðþ¾ò‚ò‚ò‚8KL8Lhè8KTþ¾ò‚ò‚ò‚8Ih8JÌèè8Ipþ¾ò‚ò‚ò‚8G„8Hèèè8GŒþ¾ò‚ò‚ò‚8E 8Gèè8E¨þ¾ò‚ò‚ò‚8C¼8E èè8CÄþ¾ò‚ò‚ò‚8AØ8C<èè8Aàþ¾ò‚ò‚ò‚8?ô8AXèè8?üþ¾ò‚ò‚ò‚8>8?tèè8>þ¾ò‚ò‚ò‚8<,8=èè8<4þ¾ò‚ò‚ò‚8:H8;¬èè8:Pþ¾ò‚ò‚ò‚81¼89Èè88`ÜÜ87ÜÄèè850èôÜèôÄèô82À81Äþ¾ò‚ò‚ò‚.Án81TŒ†Œò„øîòà†Œ†øòò‚ò‚.ÁJúþ³80Àˆþö80 †ˆ¦õ™üÎþø8.X„8/Dˆ¦õ80üð†üÓ•ò„øÌþ8.dˆ¦õ8/0üð†üÓ•ò„øÌþø8-„8-´ˆ¦õ§üð†üïßþ8- ˆ¦õ§üð†üïßþø8+¨„8,\ˆ¦õ§üð†üïßþ8+´ˆ¦õ§üð†üïßþø8*ø†ˆ¦õ§üð†üïßþø8) „8*Tˆ¦õ§üð†üïßþ8)¬ˆ¦õ§üð†üïßþø8) †ˆ¦õ™üïßþø8(x†ˆ¦õ™üïßþø8'䆈¦õ™üÎþø8'$†ˆ¦õ§‹ñð†üÎþø8%„8&dˆ¦õµüð†üð†üÎþ8%¸‚ˆ¦õ§üð†üïßþ8%ˆ¦õ§üð†üÎþø8 è„8"˜—ü8#v–ð8$ èèè8#zû¦Ö8"¨¦õ½üè†üð†üÎþ8!Ђˆ¦õµüð†üð†üïßþ8 ôˆ¦õ8!Àüð†üÓ•‚„øÌþø8 (†ˆ¦õ¯üð†üç’Íþø8”†ˆ¦õ™üïßþø8†ˆ¦õ™üïßþø8l†ˆ¦õ™üÎþø8L„8䈦õ™üïßþ8Xˆ¦õ™üïßþø8,„8Ĉ¦õ™üïßþ88ˆ¦õ™üïßþø8 „8¤ˆ¦õ™üïßþ8ˆ¦õ™üïßþø8ì„8„ˆ¦õ™üïßþ8øˆ¦õ™üïßþø8X†ˆ¦õ™üïßþø8 Ø„8ø—ü8–ð8ØÜèÐèèÁû¦Ö8¦õ8ð‹ñð†üð†üè†üð†üÎþ8|‚—ü8Š–ð8DÜèÐèèÁû¦Ö8¦õ8\‹ñð†üè†üð†üÎþ8H‚—ü8*–ð8ÌÐÐèèÁû¦Ö8\¦õ½üè†üð†üÎþ8D‚ˆ¦õ8‹ñà†‹ñð†üÎþ8 |‚ˆ¦õ§‹ñð†üÎþ8 䈦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð†ƒ‹þŠšò„ò„øè†ƒ‹þŠšò„ò„øè.Òp†ƒ‹8 \ò„ò„.Ò”›‘8 ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ8$ކž†ø8|ކž†ø8TŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ.Òà7ýf7ýìèÊ7ül7ýèÊ7ûx7üèÊ7ú„7û(èÊ7ø@7ú4ÄèÜÐèÊ7õü7÷ðÄèÜÐèÊ7ô7õdèÜÐèÖ7ðœ7óhèÜÐ7òèÜÐèÖ7ï7ð4èÊ7î„7ï(èÊ7íx7îèÊ7ìl7íèÊ7ë`7ìèÊ7êT7êøèÊ7éH7éìèÊ7è<7èàèÊ7ç07çÔèÊ7æ$7æÈèÊ7å7å¼èÊ7ä 7ä°èÊ7Ï€7âTè7áèÜÄ7ß ÐÐÐ7ÝÐÐ7Û7Ù„Ð7Ø”7×\7ÖT7ÕÜ7ÓlÐèÐ7Ñ\ÐèÐ7ψþ²ò‚ò‚7ÌÜ7ÏÐÄ7Í€7Ìäþ²ò‚ò‚7Ȉ7Ì\ÐÄÄè7ÊLè7É\è7Èþ²ò‚ò‚7¾L7ÈÐÄ7Æ@èÜÄÄÐÜÐ7Ã@èèÐ7Á¨è7ÀÐèèÐèèÐèè7¾Tþ²ò‚ò‚7»ð7½´è7¼Ü7»øþ²ò‚ò‚7®ä7ºøÐÄ7¹`èÜÄ7·È7· èÐÄèÐ7´àÐÜÐ7³HèèÐ7±°è7°Ø7°7®ìþ²ò‚ò‚7­7®d7­˜þ²ò‚ò‚7«ô7¬øè7«üþ²ò‚ò‚7ªX7«\è7ª`þ²ò‚ò‚7¨D7©ÀÐÜ7¨Lþ²ò‚ò‚7¦7§¬ÐÐ7¦ þ²ò‚ò‚7¤|7¥€è7¤„þ²ò‚ò‚7¢à7£äè7¢èþ²ò‚ò‚7¡D7¢Hè7¡Lþ²ò‚ò‚7Ÿ¨7 ¬è7Ÿ°þ²ò‚ò‚7ž$7žø7ž,þ²ò‚ò‚7œÐ7¤7œØþ²ò‚ò‚7›7œPÜè7› þ²ò‚ò‚7ˆ7šTèÄè7˜ŒèÄèÄèèèèè7•¼èèÐÐ7“”ÄÜèÜÜÜè7”ÜèÜÜ7ŽüèèÐÄè7Œì7ŒD7‹´7‹$èèÄÐÜèÄè7ˆþ²ò‚ò‚7{L7‡èèèèè7…°ÄÜèÜÜ7ƒ(ÜèÜÜ7èèÐÄè7€7~Ø7~H7}¸èèÄÐÜè7{Tþ²ò‚ò‚7c7züÜèÐ7y7xtèè7w„7vôèè7vè7uDèèèÐèèè7s4ÜÐÐèÄÐèô7pLèÄ7n„7môèè7mÐèÐèè7k$è7jdèèèÐèèè7hTè7g”ÐèÄèô7e´ÜÐÐè7c˜þ²ò‚ò‚7Ml7c7b€èè7aèÐèè7`è7_ èèÐèèÄÄèèè7[ðèÄÐèÄÐèô7XèèÐèèÐèèÄ7U¨è7Tèèèè7SÈÐÐÐèÄèô7Q(èÄÄè7O0ÐèÜè7Mtþ²ò‚ò‚7=ì7MÐÐÜ7K8èèÄÐèèÄèèÜÄèèÄèèè7E€èÐ7C èèÜÐ7AxÐèèÄè7?8Ð7=ôþ²ò‚ò‚76€7=l7<ÄèÐÐèÜÐ7:lèèÐÜÐÄè77Ìèèè76ˆþ²ò‚ò‚74l76èÜè74tþ²ò‚ò‚7&p73¤èÐÄè71ÄèÐÜÐè7/´è7.ÜÐÄ7-\ÐÜÐ7+¬7+èèèèÐèèèèÐèèèèÄ7&xþ²ò‚ò‚7!7%ÀÐÄ7$@7#˜7#è7"7!þ²ò‚ò‚7À7 ”7Èþ²ò‚ò‚7<7(èÐÐèÜÐ7ÐèÐÜÄè7¨èÐÜÄè7Dþ²ò‚ò‚77ì7´èÐÄèÐÜÄè7„èÐÜÄè7TèèèÐèèèÜÐÄèèèÄèÐÜèè7 Ìè7 ôèèèÄèÐÜèè7 è7¤èèè7„Ðèè7þ²ò‚ò‚7 7¸ÐÐ7þ²ò‚ò‚6ÿ(7¼ÐÜ6ÿ0þ²ò‚ò‚6õ¬6þØÐÐÐè6ü˜è6ûH6ú¸èè6ùÈèè6ø`6÷Ðèè6öàèè6õ´þ²ò‚ò‚.ÒÖ6õ˜ò‚ò‚.Ò²ü6õT.Ò¦þ³6ôXˆ¦õ6õ@üð‚ð‚ð†üð†üïßþø6󜆈¦õ§üð†üïßþø6ò솈¦õ§üð†üÎþø6ñÌ„6òdˆ¦õ™üïßþ6ñ؈¦õ™üïßþø6ñ†ˆ¦õ§üð†üÎþø6ïì„6𔈦õ™üïßþ6ïøˆ¦õ¡üç’Íþø66ïdˆ¦õ™üïßþ6îȈ¦õ¡üç’Íþø6휄6î4ˆ¦õ™üïßþ6í¨ˆ¦õ™üïßþø6ìl„6툦õ™üïßþ6ìxˆ¦õ¡üç’Íþø6ë<„6ë䈦õ™üïßþ6ëHˆ¦õ¡üç’Íþø6ê „6ê´ˆ¦õ™üïßþ6ꈦõ¡üç’Íþøö†üö†ü6è܆6阌‰é„øôÖ„Œò„øôÖ„Œò„øôö6èH†ˆ¦õ™üÎþø6â„6å4—ü6æ>–ð6çÈèÜèè6æBû¦Ö6åD¦õ6æ‹ñð†üÓ•ò„øÌþ6â—ü6ã&–ð6ä°èÜèè6ã*û¦Ö6â,¦õ6âè‹ñð†üÓ•ò„øÌþø6Õ@„6ß—ü6ßÖ–ð6á¨è6à¸6ßÚû¦Ö6ߦõ§‹ñð†üïßþ6ÕL—ü6Ö–ð6Þ˜è6ÝØèÜÜ6ÜpèÜÜÜè6Ú¨èèÐ6Ù6ØhÐÜèÄèè6Ö"û¦Ö6Õ\¦õ§‹ñð†üïßþø6ÈX„6Ò4—ü6Ó–ð6ÔØè6Óè6Ó û¦Ö6ÒD¦õ§‹ñð†üïßþ6Èd—ü6É6–ð6ÑÈè6ÑèÜÜ6Ï èÜÜÜè6ÍØèèÐ6Ì(6Ë€ÐÜèÄèè6É:û¦Ö6Èt¦õ§‹ñð†üïßþø6ÃÀ†—ü6Äž–ð6ÇðèèèèèÜ6Æ(èèèèè6Ä¢û¦Ö6Ãܦõ§‹ñð†üïßþø6À¨†—ü6Á†–ð6ÃÜèÐ6ÁŠû¦Ö6ÀĦõ§‹ñð†üïßþø6°Ø„6½œ—ü6¾n–ð6À@è6¿P6¾rû¦Ö6½¬¦õ§‹ñð†üïßþ6°ä—ü6±¶–ð6½0è6¼pÄèèÐÐÐÜ6¹ˆèÜÜ6¸ èÜÜÜè6¶XèèÐ6´¨6´ÐÜèÄèè6±ºû¦Ö6°ô¦õ§‹ñð†üïßþø6°D†ˆ¦õ™üïßþø6¯°†ˆ¦õ™üÎþø6¯†ˆ¦õ§üð†üÎþø6¨¸†—ü6©––ð6®°ÄèèèèÐèèèèèÜÜôÐèèèèè6©šû¦Ö6¨Ô¦õ§‹ñð†üïßþø6¤8†—ü6¥–ð6§ðè6¦èè6¦(èèô6¥û¦Ö6¤T¦õ§‹ñð†üïßþø6¡X„6£xˆ¦õµüð†üð†üÎþ6¢°‚ˆ¦õµüð†üð†üÎþ6¢‚ˆ¦õ§üð†üÎþ6¡dˆ¦õ§üð†üÎþø6›Œ„6È—ü6ž¦–ð6 ðÄèÜÜè6žªû¦Ö6ئõ½üè†üð†üÎþ6‚ˆ¦õµüð†üð†üïßþ6œ<‚ˆ¦õµüð†üð†üïßþ6›˜ˆ¦õ§üð†üïßþø6•ˆ„6—ü—ü6˜Ú–ð6›$ÄèÜÜè6˜Þû¦Ö6˜ ¦õ½üè†üð†üÎþ6—4‚ˆ¦õµüð†üð†üïßþ6–p‚ˆ¦õµüð†üð†üïßþ6•”ˆ¦õ6–`üð†üÓ•‚„øÌþø6ƒð†—ü6„Þ–ð6•8èÐ6”èèèèèèÄèèÐÐ6XÄÜèÜÜÜè6XÜèÜÜ6‹ÀèèÐÄè6‰°6‰6ˆx6‡èèèÄÐÜèÄè6„âû²ò‚Ö6„ ¦õ¯‹ñð†üç’Íþø6ƒ\†ˆ¦õ™üïßþø6‚Ȇˆ¦õ™üïßþø6‚4†ˆ¦õ™üÎþø6„6¬ˆ¦õ™üïßþ6 ˆ¦õ™üïßþø6ô„6€Œˆ¦õ™üïßþ6€ˆ¦õ™üïßþø6~Ô„6lˆ¦õ™üïßþ6~àˆ¦õ™üïßþø6}´„6~Lˆ¦õ™üïßþ6}Àˆ¦õ™üïßþø6} †ˆ¦õ™üïßþø6|p†ˆ¦õ§üð†üïßþø6{܆ˆ¦õ™üÎþø6Ut„6{(ˆ¦õ§‹ñð†üÎþ6W‚—ü6q¢–6züõ›6zÌ‹‹òüèĆ‹‹òüèÖþ6q®6yŒèÜèèÜÐèèèèèè6vDèÄè6tdè6s,èÐè6q¦û¦6m –6pŽüõ›6q<‹‹òüèĆ‹‹òüèÖþ6m6oÌèÐèÐèÐèè6mû¦6jR–6köüõ›6l¤‹‹òüèĆ‹‹òüèÖþ6j^6kdè6jVû¦6gâ–6i>üõ›6iì‹‹òüèĆ‹‹òüèÖþ6gî6hÄè6gæû¦6e*–6fÎüõ›6g|‹‹òüèĆ‹‹òüèÖþ6e66f<è6e.û¦6br–6düõ›6dÄ‹‹òüèĆ‹‹òüèÖþ6b~6c„è6bvû¦6X’–ð6a<è6`d6^äèè6]ôèèÜ6\ÐÄÄèÄè6YDèÁû¦Ö6W0¦õ6XT‹ñà†‹ñð‚ð†üè†üð†üÎþ6V‚ˆ¦õ6Vì‹ñà†‹ñð†üÎþ6U€ˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð6SÔ„6Tlˆ¦õ™üïßþ6Sàˆ¦õ™üïßþø6R”„6S<ˆ¦õ™‹ñïßþ6R ˆ¦õ™‹ñïßþøÈ†ƒ‹†øðȆƒ‹†øð65Œ†ƒš‘6Q€†6P¼Ž†ž†ø6P”ŽÞŽÞŽ6NŽœ6P èèè6NÄú›Ÿüð†ü6LÜŽœ6NXèèè6Mú›Ÿüð†ü6L´ŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ65è6J¶õ6IŒ6JHèèÖ6H°6ITèÊ6G¼6Hxè6GÄ6Eð6G ÐÐÖ6D 6E¸6D€ôÖ6B@6C\ÐÐÖ6@\6B6@ÐôÖ6?€·èÖ65Þ6?l65Öòúþ³6?Lˆþöð†ƒù6=è„6>€ˆ¦õ£ð†üïßþ6=ôˆ¦õ™üïßþø6<œ„6=Dˆ¦õ£ð†üïßþ6<¨ˆ¦õ¡üç’Íþø6<†ˆ¦õ™üïßþø6;t†ˆ¦õ™üïßþø67Є69€ˆ¦õ§ŽþŠ6;ŒþŠþŠ–èŠþ6:„„ŒþŠþŠ–èŠþ6:D„øèð†üÎþ68t‚ˆ¦õ§‹‹†øèð†üÎþ67܈¦õ™‹ñÎþøð†ƒù67†ƒ‹þаò„Ü„øè66l†ƒ‹þаò„Ü„øèð†ƒùð†ƒùò†ƒùôüþÊ63p†ƒš‘65€ÞŽÞŽÞŽ63ºòúþ³64èüö†üö†ü64†64°þà„Œ†øôò„þꄉõöò†ƒùôüþÊ62ð†ƒ‹þŠþŠ–èŠþØ62p†ƒ‹þŠþŠ–èŠþØÆ†ƒ‹þŠ–èŠþà60(†ƒš‘61ôÞŽ60ròü61 60Jþ³¬ˆ¦õ™‹61þøê†ˆþöò†ƒùôüþÊð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ù膃ù.Ó,†ƒ¢6-Ì.Ózìþ«6-ˆ¦õ·ä†‹Ø’Íþø6,<†ˆªõ§üð†üÊþ›Ý6+„†ˆªõ§üð†üÊþ›Ý6*̆ˆªõ§üð†üÊþ›Ý6*†ˆªõ§üð†üÊþ›Ý6)x†ˆªõ™üÊþ›Ý6(̆ˆªõ™‹ñÊþ›Ý6(0†ˆªõ™üïÛþ›Ý6'”†ˆªõ™üïÛþ›Ýò†ƒù.ÔH†ƒžþòü6'l.Ôjþ«6&Ĉ¦õ§ì†ëßþø6&†ˆªõ§üð†üÊþ›Ý6%d†ˆªõ™üïÛþ›Ý5yŒ„6$°ˆ¦õ§‹á†Êþ5y˜ˆ6#˜õ6$pþþÚ†þþÚ†þþ膋ñï5y¤þ›‹6"xõ6#@þþÚ†þþÚ†þþð†ü5yèþ¦6"Xüö†üö†üö†üö†üò†ƒù5z(üþš6!ðüö†üö†üö†üö†üö†üö†üö†üò†ƒùò†ƒùö†üö†üò†ƒùò†ƒù5zH¡‘6 èÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ5z 6b6ìÐèèÄè6L¨¦õ™üïßþÚš6L6ôÐèèÄè6T¨¦õ™üïßþÚš6„6ÌèèÜèèÜèèè6üèèèÄè6Œ¨¦õ™üÎþÚš6 ¼6èèÜèèÜèèè64èèèÄè6 Ĩ¦õ™üÎþÚš5í6 Tèè6 èèèèÐèèèèÐèèè6¤èèÜèèÄèèè6tèèÜèèèÐèèÐèèèÄÐèÐÄèèèèè5þœèèèèÐèèèèÐèèè5û<èèÜèèÄèèè5ø èèÜèèèÐèèÐèèèÄÐèÐÄèèèèèÄèèèèè5ðDÐèèèè5î”èè5í¨¦õ§üð†üÎþÚš5Ô5ìpèèÄ5êèÐèèÐèèèÐèè5ç`èèèÄèèÐèèÐèèÐèèèÄÐèèÐè5à¸èèèÜèèÜèÐèè5ݸÐèèÐèÄÐèèÐè5ÙàèèÐèèÐèèÐèèÄÐèÄèèè5Ô(èÐèèÐèèèÐèè5ÐøèèèÄèèÐèèÐèèÐèèèÄÐèèÐè5ÊPèèèÜèèÜèÐèè5ÇPÐèèÐèÄÐèèÐè5ÃxèèÐèèÐèèÐèèÄÐèÄèèèÄ5½ÐèÐÜè5»€5ºØÜèÐ5¹@èÜè5·ØèèèÜèÄèèèÄèÄèèèÜèÄèèèÄèÄèèèÜèèèÄèèèÜèèèÄèèèÄèÄÐèè5ªˆÜèèè5¨¨ÜèèèÄèèèÄÐèèÄÄèèèÜèèèÐèèèÐÐÐÄèÐèÄèè5ܨ¦õ§üð†üÎþÚš5“5„èèÜèèÜèèèÄèèèÜèèèÄèèèÜèèèÄèÄèèèÜèÜèÄèèè5“¨¦õ§üð†üÎþÚš5zÌ5’ÀèèÜèèÜèèèÄèèèÜèèèÄèèèÜèèèÄèÄèèèÜèÜèÄèèè5zÔ¨¦õ5‰‹ñ5{€†‹œ‘5‰ÞŽÞŽÞŽÞŽ5‚HŽ‘5ˆ8ÞŽ5‚´5‡6·èÖ5‚°5„Jþòúþ«5†tˆ¦õ§ì†ëßþø5„¼„5…´ˆ¦õ§‹á†Êþ5„Ȉªõ¯þþ膋ñïÛþ›Ýꆈþöò†ƒùôüþ5‚¢òúþ³¬ˆ¦õ¯þþ膋ñÎþøê†ˆþöò†ƒùôüþ5{ð5€š5øèÜèÜèÖ5~¤5üèè5~¬œ¦õ™üïßþ5|X5~<Ðè5|`œ¦õ¯‘ü˜þò„þôñ膋ñÎþ5{ìùò³Œ†øôò„þÕþéÎþÚšÌý‘×þïþ5yö†ü.Ôà†œ£5yp.Õbòúþ«5x؈ªõ™üïÛþ›Ý5x0†ˆªõ™üïÛþ›Ý5vä„5w„ˆªõ£ð†üÊþ›5vðˆªõ™üÊþ›Ý5u|„5v8ˆªõ§üð†üïÛþ›5uˆˆªõ§üð†üïÛþ›Ý.ÕØ„5tÀˆªõ§‹á†ëÛþ›.Õäˆ5t8õ¯þþ膋ñï.Õðþ›‹5sˆõ§¡Ýþð†ü.Ö4þ¦5shüö†üò„†üüö†üò„†üüò„†üüò†ƒù.Öt.ïv‘5r †ØŽÞŽÞŽ5ppŽœ5qÔÜè5p¤ú›Ÿüð†ü÷5n¼Žœ5p8èèè5nðú›Ÿüð†ü5mŽœ5n„èèè5m<ú›Ÿüð†ü5kTŽœ5lÐèèè5kˆú›Ÿüð†ü5i Žœ5kèèè5iÔú›Ÿüð†ü5g쎜5ihèèè5h ú›Ÿüð†ü5f8Žœ5g´èèè5flú›Ÿüð†ü5fŽ5dŽœ5eÀèèèè5dHú›Ÿüð†ü÷5cìŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ5aÀŽŒ „ò„òö„ø.ïŒ5azõ5_¨5a èèÜèèÖ5]Ü5_XèÜÐèÊ5\ЫÊ5[45\˜Ü5[¨ôÖ5Z(«Ê5XŒ5YðÜ5YôÖ5W 5WôèÜÖ5Uä5Vè5VXÊ5Tx5ULèÜÖ5S<5T@5S°Ê5Q@5RìèèÜÐèÊ5O¼5PØèÐèÖ.ïzòúþ³5O¸üÞ†”þò„þö5N¼†ˆ¦õ§üð†üÎþø5N †ˆ¦õ§üð†üïßþø5M\†ˆ¦õ§üð†üïßþø5L¬†ˆ¦õ§üð†üïßþø5Kü†ˆ¦õ§üð†üïßþø5JÀ„5KXˆ¦õ£ð†üïßþ5J̈¦õ™üïßþø5It„5Jˆ¦õ£ð†üïßþ5I€ˆ¦õ¡üç’Íþø5Hà†ˆ¦õ™üÎþø5FЄ5H ˆ¦õµüð†üð†üÎþ5Gt‚ˆ¦õ§üð†üÎþ5F܈¦õ™‹ñÎþøò†ƒù.ï¬üþš5F´üö†üö†üö†üö†üö†üò„†üüö†üö†ü5',„5Fú‚5,ø‚—ü5.–ð5EŒèèèèÐèÐèèÄ5BtÐèèôÄèè5@4èèèÐèèèèèÄèèèô5<Œ5;äèèèèÜèôÜè59tÄèÄè57|ÄÄèèôÜèèô54¬èè53ŒèÄèèèè51|èô50t5/äèèèÜÜô5.û¦Ö5- ¦õ5-ôüð†üè†üð†üð†üÎþ5'8—ü5(N–ð5,`ÐèÐèèèÜèè5)èèèô5(Rû¦Ö5'H¦õ5(0üð†üè†üð†üð†üÎþø54„5#\—ü5$–ð5&”Üèèèèè5$Æû¦Ö5#l¦õ5$Tކøðð†üè†üð†üð†üÎþ5@—ü5 ¦–ð5"ØÜÄÜÐè5 ªû¦Ö5P¦õ5 8ކøðð†üè†üð†üð†üÎþø58„50ú‚5 ¸‚—ü5 ¶–ð5pÜÜÜÜèÐôÄèèÄÄèèèèèÄ5èèèèÐèèôÐèèôÜèô5(ÜÜÜÜèÐô5¸5è58è5`è5 èèèÜÜô5 ºû¦Ö5 ̦õ5 ˜üð†üè†üð†üÎþ5D—ü5>–ð5 ÐèÐèèÜèè5 €èèèô5Bû¦Ö5T¦õ5 üð†üè†üð†üÎþø4ÿØ„5´—ü5þ–ð5 Üèèèè5û¦Ö5Ħõ5ކøðð†üè†üð†üÎþ4ÿä—ü5.–ð50ÜÄÜÐ52û¦Ö4ÿô¦õ5Àކøðð†üè†üð†üÎþø4ùà„4ÿÔú‚ú‚4ùì—ü4úæ–ð4þ°4ý`ÜÜÜè4úêû¦Ö4ùü¦õ4úÈüð†üè†üð†üÎþø4ò€„4ö\—ü4÷¦–ð4ùHÜèèèè4÷ªû¦Ö4öl¦õ4÷8ކøðð†üè†üð†üÎþ4òŒ—ü4óÖ–ð4õØÜÄÜÐ4óÚû¦Ö4òœ¦õ4óhކøðð†üè†üð†üÎþøö†üö†üö†üö†üö†üö†üò„†üüò„†üüò„†üü4—ü4ï&–ð4ñ(Üèèèèèè4ï*û¦Ö4î<¦õ4ïüè†üð†üð†üÎþö‚üüö†üö†üò„†üüò„†üüò„†üüò„†üüö†üö†üö†üö†üö†üö†üò„†üüò„†üüò„†üüò„†üüö†ü4éL„4ì¼4éX—ü4ê6–ð4ìÜèèèèè4ê:û¦Ö4éh¦õ½üè†üð†üÎþøö†üö†ü4Æ8„4é(4ã„‚—ü4ä’–ð4ètÜèèèèè4æ”4æ4åtèèÁû¦Ö4㘦õ4äd‹ñð†üè†üð†üÎþ4Æ`‚—ü4Ýú–4ânüõ›4ã,‹‹ò„øè4✆‹‹˜ê„øèÖþ4Þ4á¬èÐèÐèèèÄèÐè4Ýþû²ò‚4Û–4ÜÖüõ›4Ý”‹‹ò„øè4݆‹‹˜ê„øèÖþ4Û&4ÜDè4Ûû²ò‚4Ö–4Ùöüõ›4Ú´‹‹ò„øè4Ú$†‹‹˜ê„øèÖþ4Ö4Ù4èÐèÐèÐèèè4Öû²ò‚4Óz–4Ôîüõ›4Õ¬‹‹ò„øè4Õ†‹‹˜ê„øèÖþ4Ó†4Ôtè4Ó~û²ò‚4К–4ÒVüõ›4Ó‹‹ò„øè4Ò„†‹‹˜ê„øèÖþ4Ц4ÑÄè4Оû²ò‚4ͺ–4Ïvüõ›4Ð4‹‹ò„øè4Ϥ†‹‹˜ê„øèÖþ4ÍÆ4Îäè4;û²ò‚4Êò–4Ì–üõ›4ÍT‹‹ò„øè4ÌĆ‹‹˜ê„øèÖþ4Êþ4Ìèè4Êöû²ò‚4ÇB–ð4Ê4Üèèèèè4ÈT4ÇÄÁû¦Ö4Æt¦õ½üè†üð†üÎþö‚ú‚ú‚üüö†üö†üö†üö†üö†üö†üö†üð†üö†üö†üð†üò†ƒùò†ƒùò†ƒùö†üö†üò†ƒùò†ƒù.ï̲4Ä4޾Àú›Ÿì†4ÃðŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ4ÀpŒ4Á(4À¤––üÌÀŽŒþþÖŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽØŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡4¶ØŽ†ÀކÀŽ†ØŽÞŽÞŽ4µއ‹þŠþŠþŠþ4´äŽ‡×Ž.ð(þ4®Ê4³¬èèè4²Ðè4°|Ðè4®´¨¦õ™üÎþÚš4¬t4­ü4­l4¬|¨¦õ™üïßþÚš4©4«Ä4«44ª¤èè4©¨¦õ§‹ñð†üïßþÚš4¥´4¨¨èè4§ 4§4¥¼¨¦õ³þð†üð†üïßþÚš4¡X4¥Lèè4¤D4£´4£$èè4¡`¨¦õ4¢l‹ñð‚ð†üð†üïßþÚš4—<4 ÀèèèèèèèÄèèèÐèèèôÐèèèè4›˜è4šÐèèÄèÜèèè4—D¨¦õ§üð†üïßþÚš4‹ð4–˜ÜèÜÜèÐô4”(4“˜èèôÐèèèÐèèèôÐèèèÜè44Žpè4˜è4‹ø¨¦õµüð†üð†üÎþÚš4ˆÔ4‹XÜèÜèè4ˆÜ¨¦õ4‰èüð†üð†üð†üÎþÚš4~¤4ˆ0è4‡Xèèèèèèè4…xèèèèèÐèèè4‚ð4‚Hè4pè4€°èèèô4~¬¨¦õ4¸üð†üð†üð†üÎþÚš4|ü4~$4}¨¦õ™üÎþÚš4yÔ4||èèèèèÄ4yܨ¦õ™üÎþÚš4hø4x”èèÜèÜÜèÐô4uÄèèèô4tDè4slèèÄèèÄèèèèèÄ4oÄèèèÐèèô4mÌèèèôÜèô4kìèÐ4jœ4i¨¦õ§üð†üïßþÚš4X¤4h\ÜèÜÜèÐô4eì4e\èèôÐèè4c|ÄèÄèèÄèèèèèÄ4_ŒèèèÐèèôÐèèôÜèô4\è4[$è4ZLè4X¬¨¦õµüð†üð†üÎþÚš4Uˆ4X ÜèÜèè4U¨¦õ4Vœüð†üð†üð†üÎþÚš4F°4T¼èèèèèèè4RÜÄèÄèèÄèèèèèÄ4NìèèèÐèèôÐèèôÜèô4Ktè4Jœè4IÄè4IèÜÜô4F¸¨¦õ4GÄüð†üð†üð†üÎþÚš4DÀ4F0è4DȨ¦õ™üïßþÚš4B 4Cà4B¨¨¦õ™üïßþÚš4@€4AÀ4@ˆ¨¦õ™üïßþÚš4>`4@Ð4>h¨¦õ™üïßþÚš4<@4=àÐ4ÄèôÜèèèô3<4¨¦õµüð†üð†üÎþÚš.û\3;|è3:¼èÜÄèÜÄè38èèô36üÄè35¬è34¤è33ÌÄèÜèÜÜèÄÄèÐèô3/|èÐèÜÜèÜÄèÜèÄèÄÜèÐèèô3)LÄèÜèÄèÄÜè3%¼èÄèèèôÜèèô3#èèÜèÜÜèÐèô3 4èÐèÜÜèÐèèÜèÐèèô3äèèÜè3dè3\ÄèèôÐèèôÜèèôÐÜèè3$èôÜÜèèÜô.ûd¨¦õ3$ü.ü,†Ÿ‘3܆ÀŽ†ØŽÞŽÞŽ3TŽœ3¸Üè3ˆú›Ÿüð†ü÷3 Žœ3èèè3Ôú›Ÿüð†ü3 쎜3hèèè3 ú›Ÿüð†ü3 8Žœ3 ´èèè3 lú›Ÿüð†ü3 „Žœ3 èèè3 ¸ú›Ÿüð†ü3ÐŽœ3 Lèèè3ú›Ÿüð†ü3Žœ3˜èèè3Pú›Ÿüð†ü3ôŽ3øŽœ3¤èèèè3,ú›Ÿüð†ü÷3ÐŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ3¼ŽŒ¶ê„ò„òö„ø.üŒ3võ2ÿÔ3èÜè2ÿÜ2þÈ«Ê2ý,2þÜ2ý ôÖ2ü «Ê2ú„2ûèÜ2úøôÖ2ù2ùìèÜÖ2÷Ü2øà2øPÊ2öp2÷DèÜÖ2õ42ö82õ¨Ê2ó˜2ôäèèÜèÊ2ò2ó0èÐèÖ.üzòúþ³2òüÞ†”þò„þö2ñ†ˆ¦õ§üð†üïßþø2ðd†ˆ¦õ§üð†üïßþø2ï´†ˆ¦õ§üð†üïßþø2¦õ§üð†üïßþø2íð†ˆ¦õ§ŽþŠþŠþŠþØð†üïßþø2ì´„2íLˆ¦õ£ð†üïßþ2ìÀˆ¦õ™üïßþø2ëh„2숦õ£ð†üïßþ2ëtˆ¦õ¡üç’Íþø.þP†ˆ¦õ2ëXü.þª/ J†2ë8/ Nìþ³2ë(ƒù/ €üþš2ê܈þöò„†üüò„†üüò„†üüò„†üüú‚üüò„†üüö†üö†üò„†üüò„†üüö†üö†üò„†üüò„†üüò„†üüò„†üüö†üö†üö†üò„†üüö†üö†üò„†üüò„†üüö†üö†üö†üâ„–ú‚ú‚ú‚ú‚üüö†üö†üö†üö†üö†üö†üö†üö†üö†üö†üò†ƒùö†üò†ƒù/  ²2ç4ŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÈއ‹þ2਎‡‹þÈŽ‡ÑއÁއ‹þÈŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡×Ž2ÞTއ‹ò„ø2ÝôŽŒò„ø/ ü/ã²/äØ2ݼò„ò„/äÔ¬2Ý8ŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ2Ô€ŽŒªŒþŠ–ŒþІøÖŠþ2Ô¸„ŒþІøæ2ÓHŽŒ†Œ’Šª–þІø2ÓÔ–2Óx/å$þ2Óõ2Ò·èÖ2Ñ,·èÖ2Ï`2ÐÜÜèÄèÖ2Íd2ÏèÜèÄèÖ2Ëh2ÍÜèÄèèÖ2Ê\2ËèÊ2É2ÉÜèèÊ2Ç´2ȈèèÊ2Æ`2Ç4èèÊ2Å 2ÅàèèÊ2Ä2ĤèÊ2Âô2ØèÊ2Áè2¤èèÖ2¿ì2Á˜ÜèÄèèÖ2¾à2¿„èÊ2½Ô2¾xèÊ2¼È2½„èèÖ2»,2¼`2»ÐèÊ2¹2ºÄ2º4èÊ2¸$2¹(èèèÊ2¶¸2·¼èèèÊ2µd2¶8èèÊ2´2´äèèÊ2²¼2³èèÊ2±h2²<èèÊ2¯œ2±ÜèÄèÖ2®¨·èÖ2«¼2®@Üè2­8èèÜèèÊ2©2«lÜèÄÜèèÜèÖ2§2¨€èèÜèèÊ2¤H2¦„èèÐèèÜèèÊ2¢Ü2£øÜÜèÖ2¡è·èÖ2Ÿì2¡˜ÜèÄèèÖ/å2ŸØò‚/äæþ³2Ÿ4ˆžþŠò„øÚöâ„–ú‚ú‚ú‚ú‚üüâ„–ú‚ú‚ú‚ú‚üüâ„–ú‚ú‚ú‚ú‚üü2´†ˆ¦õµüð†üð†üÎþø2 †ˆ¦õ™üÎþø2œ`†ˆ¦õ§‹ñð†üÎþø2šì„2› ˆ¦õµüð†üð†üïßþ2šøˆ¦õ§üð†üïßþø2™@„2šˆ¦õ2šÜüð†üð†üð†üÎþ2™Lˆ¦õµüð†üð†üïßþø2˜¬†ˆ¦õ™üÎþø2—ü†ˆ¦õ§üð†üÎþø2–Ü„2—tˆ¦õ™üïßþ2–舦õ™üïßþø2•¼„2–Tˆ¦õ™üïßþ2•Ȉ¦õ™üïßþø2”d„2•ˆ¦õ§üð†üïßþ2”pˆ¦õ§üð†üïßþø2“ „2“Àˆ¦õ§üð†üïßþ2“ˆ¦õ§üð†üïßþø2’\†ˆ¦õ§üð†üÎþø2‘Ȇˆ¦õ™üÎþø2‘4†ˆ¦õ™üïßþø2À„2tˆ¦õµüð†üð†üÎþ2̈¦õ§üð†üÎþø2,†ˆ¦õ™üïßþø2Ž˜†ˆ¦õ™üïßþø2x„2Žˆ¦õ™üïßþ2„ˆ¦õ™üïßþø2ŒX„2Œðˆ¦õ™üïßþ2Œdˆ¦õ™üïßþø2‹Ä†ˆ¦õ™üïßþø2Šø†ˆ¦õµüð†üð†üÎþø2‡P„2Šˆ¦õ2Šèüð†üð†üð†üïßþ2‰D‚ˆ¦õµ‹ñð†üð†üïßþ2ˆœ‚ˆ¦õ§üð†üïßþ2‡ä‚ˆ¦õ§‹ñð†üïßþ2‡\ˆ¦õ™üïßþøà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðð†ƒùà†ƒ‹þðà†ƒ‹þðò†ƒù̆ƒ‹þŠò„øè/ål†ƒ‹2„HŒþŠ–ŒþІøÖŠþ2ƒè„ŒþІø/å0óZ‘2ƒTŒþŠšŒ‚ä„ò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ2y´ŽŒšŒ–†øîä„ò„ø0óx2yxòü0óp2x‚2yèÊ2wX2wüèÊ2vd2wèÊ2up2vèÊÊõ2t0·èÖ2sT·èÖ2rH2sèèÖ2q 2qøèèèÖ2oˆ2p¤èèè2o2n|2o èÊ2m(2müèèÊ2kÔ2l¨èèÊ2j€2kTèèÊ2i,2jèèÊ2h2h¬èÊ2fä2gˆèÊ2eÀ2fdèÊ2dœ2e@èÊ2c2d4èÊ2b„2c(èÊ2a02bèè2a82_¬2`Èèèè2_´2^ 2_DèÊ2]”2^8èÊ2\@2],èè2\H2[2[ðèèÊ2Yø2ZÌèèÊ2X¤2Y¨2YÊ2WP2XT2WÄÊ2VD2VèèÊ2U82UÜèÊ2T,2TÐèÊ2S 2SÄèÊ2QÌ2R¸èè2QÔ2P2Q4èÊ2NL2OøÜèèèè2NT2LP2MäèÜèèè2LX2J<2K èèèè2JD2G°2IŒèÜèèèè2G¸2Eü2G0ÜÜèÊ2DÀ2E|è2DÈ0óf2DŒ†øòò‚0ó6þ³2C¤ˆžþŠšŒ‚ä„ò„øÚö2C†ˆ¦õ™üÎþø2BD†ˆ¦õ§‹ñð†üÎþø2@Є2A„ˆ¦õµüð†üð†üïßþ2@܈¦õ§üð†üïßþø2:œ„2Æ–1A*üõ¦õ1Aôކøðð†üè†üð†üð†üÎþ1>Ò1@€ÜèèèèèÁû¦Ö18–1=Þüõ¦õ1>¨üð†üè†üð†üð†üÎþ18&1=ÐèÐèèèÜèÜèè19Ôèèèèèè18û¦Ö1Z–172üõ¦õ17üüð†üè†üð†üð†üÎþ1f16 èÐÜèÐèÜèÜÜÜè12LÜèÐèÜèÜÜÜè1/ÜèÐèÜèÜÜÜè1+ÔèôÄèôÄèèôÜÐèÐèÐèÐèÜè1&4ÄèÄè1$ è1#LèèôÜèèèô1!Tèèèèè1tèèèè1 ÜèÜèèèÄÜèÐèÜèÜÜÜèèèôÄèèô1|èÐÜèÐèÜèÜÜÜèèèô1\ÜèÐèÜèÜÜÜèèèôÄèôÄÜÐèèÐèôÄè1 $èô1 LèÜÐèèô1 Tèèè1èÄèèèèè1Üèô1¼1,èèèÜÜô1^û¦Ö0ÿR–ð1´ÜèèèèÜèèèÁû¦Ö0þ„¦õ½üè†üð†üÎþ0ý‚ˆ¦õ0þ`üð†üð†üð†üÎþ0ü¼‚ˆ¦õµ‹ñð†üð†üÎþ0ü‚ˆ¦õ§üð†üÎþ0û\‚ˆ¦õ§‹ñð†üÎþ0úÔˆ¦õ™üÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð0øÀ„0ù”ˆ¦õ§‹ñð†üïßþ0øÌˆ¦õ¯‹ñ膋ñïßþø0÷€„0ø(ˆ¦õ™‹ñïßþ0÷Œˆ¦õ™‹ñïßþøÔ†ƒ‹ò„øðÔ†ƒ‹ò„øðà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð0ô”†ƒ‹þŠšŒ‚ä„ò„øè0󼆃‹ªŒ–†øîÜ„ê„øðò†ƒùôüþ/寑0ó ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ/åÜ0鎫Ê0èÄ«Ê0ç¸0è\èÊ0æ¬0çPèÊ0å 0æDèÊ0ä”0å8èÊ0ß 0ã„Ð0â0áŒ0à„0ßô0ß(þ¦ò‚0ÜÄ0Þp0Ýà0ÝP0ÜÌþ¦ò‚0Ú80Ü0Û„0Úôè0Ú@þ¦ò‚0Öì0Ù èè0ؘ0Ø0×x0Öôþ¦ò‚0ÓÐ0Ö„èè0Õ|0Ôì0Ô\0ÓØþ¦ò‚0Є0Óhèè0Ò`0ÑÐ0Ñ@è0ÐŒþ¦ò‚0˸0ÏìÐèÐèè0Íô0Íd0̤èè0ËÀþ¦ò‚0İ0Ë èÐèèÐèÐÐèÐÐÄè0ÆŒè0Å„0ĸþ¦ò‚0ÁÜ0ÄÐèÐÄ0Áäþ¦ò‚0¾0ÀÌÐèÐèèÜ0¾ þ¦ò‚0²@0½¬èÐèÐèè0»œÐÐèÐÐ0¹0¸l0·ÜÐèÐ0¶D0µœÄè0´Lè0³Dè0²Hþ¦ò‚0±0±À0± þ¦ò‚0¯È0°„0¯Ðþ¦ò‚0®Œ0¯H0®”þ¦ò‚0­ 0®<Ð0­(þ¦ò‚0«´0¬ÐÐ0«¼þ¦ò‚0ª¨0«d0ª°þ¦ò‚0© 0ª(Ð0©þ¦ò‚0§p0¨tèè0§xþ¦ò‚0¢,0¦ØèÐèÄè0¤ÈÐèÐèÄè0¢4þ¦ò‚0 ð0¡¬0 øþ¦ò‚0Ÿ´0 p0Ÿ¼þ¦ò‚0•X0ŸÐ0ôèèÐ0œ¤èèèèè0šô0šdèÐÐÄèôÄè0—dè0–\è0•`þ¦ò‚0“¤0”ðÐ0“¬þ¦ò‚0‘ð0“<Ð0‘øþ¦ò‚0Žœ0‘hÐ0HèÄè0ޤþ¦ò‚0‹H0ŽÐ0ŒôèÄè0‹Pþ¦ò‚0‰ô0ŠÈ0‰üþ¦ò‚0ˆ 0‰t0ˆ¨þ¦ò‚0†¼0ˆÐ0†Äþ¦ò‚0„Ø0†$Ð0„àþ¦ò‚0ƒ 0„p0ƒàè0ƒþ¦ò‚0‚0‚¼0‚þ¦ò‚0~l0°ÐÄÐè0¸èèèô0~tþ¦ò‚0^T0}ÐÐÜè0|8èèÐÐèÐèèèèèè0xÀèèèèè0w0v€èèÐèèÄèÐÐÜè0rØÄèÄè0p°0p èôÜèèôÄèô0mÈèèèô0lHèÐÜèèèÄèèèèè0hèÄèÜèèÜèÜÄÜèÄèèèôÄèô0c`èè0bXèÄèèèè0`Hèô0_(0^\þ¦ò‚0Xà0^ÐÄèÐèè0[¬0ZìèèèôÄèô0Xèþ¦ò‚0R40XÄèèèÐèèèè0UØ0UHèèèôÄèôÜÐè0R<þ¦ò‚0LØ0QœèèèèÄèèèèÄèèèèÄ0Làþ¦ò‚0K´0LX0K¼þ¦ò‚/åÒ0K ò‚/å®úþ³0Jüˆ¦õ™üÎþø0$t„0+4—ü0,J–ð0JTÐÜèÐÐèèèè0G$èèÐÐèÐèèèèèè0C¬èèèèè0Aü0AlèÐÐÜè0?\ÄèÄè0=40<¤èôÜèèôÄèô0:Lèèèô08ÌèÐèèèèÄèèèèè05„04ôèèèôÄèô02äèè01ÜèÄèèèè0/Ìèô0.¬0.èèèÜÜô0,Nû¦Ö0+D¦õ0,,üð†üè†üð†üð†üÎþ0$€—ü0%––ð0*˜ÐèÐèèèÜèÜèè0'Pèèèèèè0%šû¦Ö0$¦õ0%xüð†üè†üð†üð†üÎþø0@„0—ü0–ð0$è0#Hèèèè0!øÐÐèÐÐ0p0È08ÐèÐ0 0øÄè0¨è0 è0àèèèÜÜô0û¦Ö0$¦õ0ðüð†üè†üð†üÎþ0L—ü0F–ð0¨ÜÜÜè0à0Jû¦Ö0\¦õ0(üð†üè†üð†üÎþø0 „0€ˆ¦õµüð†üð†üÎþ0x‚—ü0 v–ð0 èèèèÄèÐÐ0 Ð0 (è0 Pè0 èèèÜÄè0 zû¦Ö0Œ¦õ0 Xüð†üè†üð†üÎþ0,—ü0&–ð0ÜÜÜè0*û¦Ö0<¦õ0üð†üè†üð†üÎþø0ð„0˜ˆ¦õ™üïßþ0üˆ¦õ¡üç’Íþø0À„0hˆ¦õ™üïßþ0̈¦õ¡üç’Íþø0„08ˆ¦õ™üïßþ0œˆ¦õ¡üç’Íþøö†üö†ü0à†¼þò„þÖ„Œò„øôö0L†ˆ¦õ™üÎþø/ÿœ†ˆ¦õ§üð†üÎþø/þ(„/þ܈¦õµüð†üð†üïßþ/þ4ˆ¦õ§üð†üïßþø/ü|„/ýLˆ¦õ/þüð†üð†üð†üÎþ/üˆˆ¦õµüð†üð†üïßþø/û膈¦õ™üÎþø/û8†ˆ¦õ§üð†üÎþø/ú„/ú°ˆ¦õ™üïßþ/ú$ˆ¦õ™üïßþø/øø„/ùˆ¦õ™üïßþ/ùˆ¦õ™üïßþø/÷ „/øTˆ¦õ§üð†üïßþ/÷¬ˆ¦õ§üð†üïßþø/öH„/öüˆ¦õ§üð†üïßþ/öTˆ¦õ§üð†üïßþø/õ˜†ˆ¦õ§üð†üÎþø/õ†ˆ¦õ™üÎþø/ôp†ˆ¦õ™üïßþø/òü„/󰈦õµüð†üð†üÎþ/óˆ¦õ§üð†üÎþø/òh†ˆ¦õ™üïßþø/ñÔ†ˆ¦õ™üïßþø/ð´„/ñLˆ¦õ™üïßþ/ðÀˆ¦õ™üïßþø//ð,ˆ¦õ™üïßþ/ï ˆ¦õ™üïßþø/¦õ™üïßþø/î4†ˆ¦õµüð†üð†üÎþø/턆ˆ¦õ§üð†üïßþø/ìð†ˆ¦õ™üÎþø/èP„/ì<ˆ¦õ§‹ñð†üÎþ/ë8‚ˆ¦õ/ì‹ñð†üð†üð†üÎþ/êd‚ˆ¦õµ‹ñð†üð†üÎþ/鼂ˆ¦õ§üð†üÎþ/èô‚ˆ¦õ§‹ñð†üÎþ/è\ˆ¦õ™‹ñÎþøà†ƒ‹þðà†ƒ‹þðð†ƒù膃ùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðò†ƒùôüþÀò†ƒùôüþ/ä\„šò„ò„ø/ã¾/äHò‚ò‚/ãŽþ³Œƒùôüþ/ ø/ârõ´¦õ™üïßþΦò‚/àX/áÔè/à`´¦õ§‹ñð†üïßþΦò‚/Þ/ßÀèè/Þ$´¦õ§üð†üïßþΦò‚/Ûô/Ý´èè/Ûü´¦õµüð†üð†üïßþΦò‚/Ù/ÛŒèèÄè/Ù´¦õ/Ú,‹ñð†üð†üð†üïßþΦò‚/Ôä/ØhÐèÐèè/Öpèè/Ôì´¦õ§üð†üïßþΦò‚/ɨ/Ô8èèÐèÜèÜÜèÐèôÄÐèèôÜÐèÐèÐèÐèÄè/Ì@è/Ë8/ɰ´¦õµüð†üð†üÎþΦò‚/ÅD/ȘÐèÐèèÜ/ÅL´¦õ§üð†üïßþΦò‚/¦°/ÄèèÐèÜèÜÜÄÐèôÄÐèÐèÐèÐè/½èè/½è/¼PèÐèèÐè/º(è/¹P/¸Àè/·èè/¶hèèÐèÜèÜÜÄèèè/²Àèè/± èèÐèÐèÜÜè/® èÄèèÄèÐÜè/«ˆèèôÄèôÐèèèèô/¨pè/¦¸´¦õµüð†üð†üÎþΦò‚/¤À/¦0è/¤È´¦õ™üïßþΦò‚/¢Ð/¤@è/¢Ø´¦õ™üïßþΦò‚/ à/¢Pè/ è´¦õ™üïßþΦò‚/ž/ èÐè/ž˜´¦õ™üïßþΦò‚/œ /ž@èÐè/œ(´¦õ©üß•þÌþΦò‚/š`/›Ðè/šh´¦õ™üïßþΦò‚/˜/™àÐè/˜´¦õ™üïßþΦò‚/‘ü/—xèÐèÄè/•8ÐèÐèÄè/’´¦õ§üð†üÎþΦò‚/‹ü/‘dèÐèÄè/TÐèÐèÄè/Œ´¦õµüð†üð†üÎþΦò‚/Š /‹|è/Š´¦õ™üïßþΦò‚/ˆ/‰Œè/ˆ$´¦õ™üÎþΦò‚/yH/‡èÐÜèÐèÜèÜÜÜè/ƒDèôÄèôÄèèôÜÐèÐèÐèÐè/~4èèèèèÄè/{ôè/zìè/yP´¦õ§üð†üÎþΦò‚/vÄ/xàÐè/vÌ´¦õ§üð†üïßþΦò‚/t@/v\Ðè/tH´¦õ§üð†üïßþΦò‚/oì/s¸Ðè/rhèÄèè/oô´¦õ§üð†üïßþΦò‚/k˜/odÐè/nèÄèè/k ´¦õ§üð†üïßþΦò‚/i/kè/i˜´¦õ™üïßþΦò‚/gˆ/iè/g´¦õ™üïßþΦò‚/d /fðèÐè/d¨´¦õ©üß•þÌþΦò‚/a¸/dèÐè/aÀ´¦õ©üß•þÌþΦò‚/_L/aP/`Àè/_T´¦õ§üð†üÎþΦò‚/\$/^äèÄèèÐè/\,´¦õ™üÎþΦò‚/W¤/[ÔÐèÄÐè/Y¬èèèô/W¬´¦õµüð†üð†üïßþΦò‚/$\/V¨èÐÜèÐèÜèÜÜÜè/RèèèÐèÜèÜÜÄ/OÐÜèÐèÜèÜÜÜè/LˆèôÄèôÄèèôÜÐèÐèÐèÐèÜè/FèÄèÄè/DÀè/DèèôÜèèèô/Bèèèèè/@(Üèèè/>¨ÜèÜèèèÐèÜèèÜèÜ/:ÐÜèÐèÜèÜÜÜèèèôÄèèô/5ðÜèÐèÜèÜÜÜèèèô/2`èèÐèÜèÜÜÜèèèÄôÄèÄÜèÄèèèôÄèô/*àèèè/)¨èÄèèèèè/'hèô/&H/$d´¦õ/%¨‹ñà†Žþðð†üð†üÎþΦò‚/°/$ ÄèÄèèÐèÐèÐèè/ /\èèèôÄèô/¸´¦õ§üð†üïßþΦò‚/@/`ÄèèèèÐèÐèÜÜèèèèô/èèèè/À/0èèèôÄèôÜÐè/H´¦õ/püð†üð†üß•þÌþΦò‚/$/Øèè/,´¦õ§‹ñð†üÎþΦò‚/</¤è/D´¦õ™‹ñÎþΦò‚/ îò‚×þïþ/ ¢†­Ïìþ³Œƒùôüþ.þö‘/ 8†ÀކÀŽ†ØŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ.ÿ / &/ ÜèèÊ/l/XèèèÖ/Ð/¼èèèÖ/Ä/€èèÖ/@/\èÐèÖ.þúòúþ³/€ˆ¦õµüð†üð†üÎþøö†üÖ†œþꄉõö/€†ˆ¦õ™üÎþø/„/܈¦õ§üð†üïßþ/$ˆ¦õ«ð†üç’Íþø.ÿt†ˆ¦õ™‹ñÎþøð†ƒùò†ƒùôüþ.þhþø.üØ„.ý€ˆ¦õ½ü膋ñð†üÎþ.ü䈦õ™‹ñÎþøò†ƒùôüþÈð†üÎþÚš.öì.úÄèè.ùÔ.ù,Äèèèô.öô¨¦õ™‹ñÎþÚš.ô´.ölÄ.ô¼¨¦õ™üïßþÚš.ñì.ôÄÐè.ñô¨¦õ™üïßþÚš.ð.ñØ.ïö.ñdŒþŠþŠþŠþÜò„þ.ð<„ŒºŒþŠþŠþŠþ.ð`„ŒþŠþŠþÞôÕþïþ.Ö¶‘.¦õ§ì†ÊþÖŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ.ÖÌ.ì:.ìÀèÊþš.ç .êôè.êèè.éÜ.稨¦õ§üð†üïßþÚš.ãœ.æxèÐèÄÜ.㤨¦õ¯‹ñð†üç’ÍþÚš.á.âìèÄ.á ¨¦õ™üïßþÚš.ÞÌ.àlè.ÞÔ¨¦õ™üÎþÚš.ÙØ.ÞèÄÜ.ÜlèÄÜÜ.Ùਦõ£ð†üÎþÚš.×0.Ù(èÄ.×8¨¦õ™‹ñïßþÚš.ÖÈý­Á§‰õÕþïþ.ÕÜꆈþöò†ƒùôüþÔꄉõöò†ƒùôüþÒö†üö†üΆƒŒü˜þò„þôóò†ƒùôüþÐò†ƒùôüþÀ.Æ(†ƒš‘.Ò4†ØŽÞŽÞŽÞŽÞŽÞŽ.Ð´ŽŒŒ„ò„ø.Æ„.Ï.ÐLèèèè.Ï.Í|.Θèèè.Í„.Ëø.Íèèè.ÌÊõ.ʸ·èÖ.Æròúþ³.É„.ʈ¦õ§üð†üÎþ.Ɉˆ¦õ™üÎþøê†ˆþö.ÆÐ„.È”ˆ¦õµüð†üð†üÎþ.Ǽ‚ˆ¦õ½ü膋ñð†üÎþ.ÆÜˆ¦õ.Ǭü膋ñ膋ñÎþøò†ƒùôüþÊ.Ä0†ƒš‘.ÆÞŽÞŽÞŽ.Äzòúþ³.Å„üö†üö†ü.ÄØ†´þò„þò„þꄉõöò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ùÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþÊ'ü.À¸‡ü”„þò„þôô÷ð†ƒù'ì.«ô.¾”“®.¿¤Œ¦ˆ–’.¿Àü–üà.¿¸.¾¤›ãþ.¼‚“®.½¤Œ¦ˆ–’.½Àü–üà.½¸.¼¤›ãþ.º‚“®.»¤Œ¦ˆ–’.»Àü–üà.»¸.º¤›ãþ.¸‚“®.¹¤Œ¦ˆ–’.¹Àü–üà.¹¸.¸¤›ãþ.¶‚“®.·¤Œ¦ˆ–’.·Àü–üà.·¸.¶¤›ãþ.´‚“®.µ¤Œ¦ˆ–’.µÀü–üà.µ¸.´¤›ãþ.°ˆ‚“®.±œŒ.´4ˆ’.±¸ü–.²f’.³Š˜¦ˆ–’.³`ü–üÊ.²„¸.²PþþÆ—ˆÁ.±¸.°œ›ãþ.¬p‚“®.­„Œ.°,ˆ’.­ ü–.®N’.¯Š˜®ˆ–’.¯Hü–ü—.®ø.®l¸.®8þþÆ—ˆÁ.¬ð¸.¬„›ãþ.«øˆ›ãþø'è-Éà.©`“¼.ª Œ.«dˆ–’.«‚ˆ’Âü–üà.©ø.ª|ö.©p›‹Øþ.¦Ì‚“¼.¨Œ.©ˆ’.¨p‚ˆ–’.¨,ü–üà.§h.§ìö.¦à›‹Øþ.¤<‚“¼.¥€Œ.¦pˆ’.¥à‚ˆ–’.¥œü–üà.¤Ø.¥\ö.¤P›‹Øþ.¡¬‚“¼.¢ðŒ.£àˆ’.£P‚ˆ–’.£ ü–üà.¢H.¢Ìö.¡À›‹Øþ.Ÿ‚“¼. `Œ.¡Pˆ’. À‚ˆ–’. |ü–üà.Ÿ¸. <ö.Ÿ0›‹Øþ.œŒ‚“¼.ÐŒ.žÀˆ’.ž0‚ˆ–’.ìü–üà.(.¬ö.œ ›‹Øþ.™ü‚“¼.›@Œ.œ0ˆ’.› ‚ˆ–’.›\ü–üà.š˜.›ö.𛋨þ.—l‚“¼.˜°Œ.™ ˆ’.™‚ˆ–’.˜Ìü–üà.˜.˜Œö.—€›‹Øþ.”Ü‚“¼.– Œ.—ˆ’.–€‚ˆ–’.–<ü–üà.•x.•üö.”ð›‹Øþ.’L‚“¼.“Œ.”€ˆ’.“ð‚ˆ–’.“¬ü–üà.’è.“lö.’`›‹Øþ.¼‚“¼.‘Œ.‘ðˆ’.‘`‚ˆ–’.‘ü–üà.X.Üö.Л‹Øþ.,‚“¼.ŽpŒ.`ˆ’.ŽÐ‚ˆ–’.ŽŒü–üà.È.ŽLö.@›‹Øþ.Šœ‚“¼.‹àŒ.ŒÐˆ’.Œ@‚ˆ–’.‹üü–üà.‹8.‹¼ö.а›‹Øþ.ˆ ‚“¼.‰PŒ.Š@ˆ’.‰°‚ˆ–’.‰lü–üà.ˆ¨.‰,ö.ˆ ›‹Øþ.…|‚“¼.†ÀŒ.‡°ˆ’.‡ ‚ˆ–’.†Üü–üà.†.†œö.…›‹Øþ.‚ì‚“¼.„0Œ.… ˆ’.„‚ˆ–’.„Lü–üà.ƒˆ.„ ö.ƒ›‹Øþ.€\‚“¼. Œ.‚dˆ–’.‚‚ˆ’Âü–üà.€ø.|ö.€p›‹Øþ.} ‚“¼.~äŒ.Ôˆ–’.D‚ˆ–’.ü–üà.~<.~Àö.}´›‹Øþ.zä‚“¼.|(Œ.}ˆ–’.|ˆ‚ˆ–’.|Dü–üà.{€.|ö.zø›‹Øþ.x(‚“¼.ylŒ.z\ˆ–’.yÌ‚ˆ–’.yˆü–üà.xÄ.yHö.x<›‹Øþ.ul‚“¼.v°Œ.w ˆ–’.w‚ˆ–’.vÌü–üà.v.vŒö.u€›‹Øþ.r°‚“¼.sôŒ.t䈖’.tT‚ˆ–’.tü–üà.sL.sÐö.rÄ›‹Øþ.oô‚“¼.q8Œ.r(ˆ–’.q˜‚ˆ–’.qTü–üà.p.qö.p›‹Øþ.md‚“¼.n¨Œ.olˆ–’.o‚ˆ’Âü–üà.n.n„ö.mx›‹Øþ.jÔ‚“¼.lŒ.l܈–’.lx‚ˆ’Âü–üà.kp.kôö.j蛋Øþ.h‚“¼.i\Œ.jLˆ–’.i¼‚ˆ–’.ixü–üà.h´.i8ö.h,›‹Øþ.e\‚“¼.f Œ.gˆ–’.g‚ˆ–’.f¼ü–üà.eø.f|ö.ep›‹Øþ.b ‚“¼.cäŒ.dÔˆ–’.dD‚ˆ–’.dü–üà.c<.cÀö.b´›‹Øþ._ä‚“¼.a(Œ.bˆ–’.aˆ‚ˆ–’.aDü–üà.`€.aö._ø›‹Øþ.](‚“¼.^lŒ._\ˆ–’.^Ì‚ˆ–’.^ˆü–üà.]Ä.^Hö.]<›‹Øþ.Zl‚“¼.[°Œ.\ ˆ–’.\‚ˆ–’.[Ìü–üà.[.[Œö.Z€›‹Øþ.W°‚“¼.XôŒ.Y䈖’.YT‚ˆ–’.Yü–üà.XL.XÐö.WÄ›‹Øþ.U ‚“¼.VdŒ.W(ˆ–’.VÄ‚ˆ’Âü–üà.U¼.V@ö.U4›‹Øþ.R‚“¼.SÔŒ.T˜ˆ–’.T4‚ˆ’Âü–üà.S,.S°ö.R¤›‹Øþ.OÔ‚“¼.QŒ.Rˆ–’.Qx‚ˆ–’.Q4ü–üà.Pp.Pôö.O蛋Øþ.M‚“¼.N\Œ.OLˆ–’.N¼‚ˆ–’.Nxü–üà.M´.N8ö.M,›‹Øþ.J\‚“¼.K Œ.Lˆ–’.L‚ˆ–’.K¼ü–üà.Jø.K|ö.Jp›‹Øþ.G ‚“¼.HäŒ.IÔˆ–’.ID‚ˆ–’.Iü–üà.H<.HÀö.G´›‹Øþ.Dä‚“¼.F(Œ.Gˆ–’.Fˆ‚ˆ–’.FDü–üà.E€.Fö.Dø›‹Øþ.B(‚“¼.ClŒ.D\ˆ–’.CÌ‚ˆ–’.Cˆü–üà.BÄ.CHö.B<›‹Øþ.?l‚“¼.@°Œ.A ˆ–’.A‚ˆ–’.@Ìü–üà.@.@Œö.?€›‹Øþ.<Ü‚“¼.> Œ.>䈖’.>€‚ˆ’Âü–üà.=x.=üö.<ð›‹Øþ.:L‚“¼.;Œ.’-ÔŠ˜-Õ0ˆ–’-Ô ‚ˆ–’-ÔLü–ü—-Óü-Ó\-Óàö-Ó(þþ-Ò—ˆ‹-ÒP-Ѱ-Ò4ö-Ñ(›‹Øþ-É䓼-Ì(-ÐÈ’-Ì øüøüøüøüøüøüôøüøüøü-Ê|-Ëöö-Éô›‹Øþø'ä-ÉÈü'à-ɬ†üüò„†üü'Ü-Ãp“®-Ä€Ž-Æ|þ––˜-ÈÀþ–’-Æü–˜þ–˜þ˜¦Üü–üêêêêêê-Ęþ˜-Å þ–’-ÄÀ˜þ–’-Äx-Ãì¸-À›ãþø'Ô-Â܈›™ëŠÕþø-µ†ƒ-ÂÄþ-µ6-°-µ2þŸ- ƒù-¸<„-Áðˆ¦õ§ì†Êþ-½H‚“-½ú-¾Ì-Á ’-¾È-Áx-¾Äø-ÀL-Àüþ–-ÀH––’êêê-¾°-À -¾¬ø¢˜-¿¼ˆ’êÊ‚ˆ’Âü–üêêÞ-½ô-¾|þøþ-½\¦õ§üð†üÎþ-¸H“-¸ö-¹È-¼ü’-¹Ä-¼Ô-¹Àø-»X-¼þ––þþ-»T––’êêê-¹¬-»,-¹¨ø¢˜-ºÈˆ’ꂈ’—-ºü–üêêÞ-¸ð-¹xþøþ-¸X¦õ§üð†üÎþø-·¨†ˆ¦õ™Êþø-¶è†ˆ¦õ¯ì†ã’Íþø-¶8†—ñ¦õ“†Êþø-µx†—ñ¦õ“†‹-µþøôüþÞ'Ð-µƒù'È-´dˆ›ŸìØþø'Ä-´H†üü'¨-´0ƒù'œ-³tˆ›™†ì†Òþø'”-³dü'ˆ-¨ˆ›Ÿ‹úþŸ-³Lƒùꆄ‚ö-°˜†„„‘úþŸ-²ð„„þö䆄„þö䆄„þö䆄„þö䆄„þö䆈þö-±†ˆ¦õ·ä†‹Ø’Íþøôüþàö-®˜†„„‘úþŸ-°p„„þö䆄„þöꆄ‚öꆆö-¯†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚ö-«¤†„„‰ˆ»ìò†ìâöꆄ„þö-ª¸†„„‰ˆ»ì†ì†ìâöƆ„„‰ˆíöÔ†„„‰õöꆈþö-¨ü†ˆ¦õ·ä†‹Ø’ÍþøôüþĆÒþøö†ü'„-§Ü†üü'x-¥¬“®-¦¼Š˜¦ˆ–’-§ü–üÊ-¦(¸-¥¼›ãþøò†ƒù't-£`“®-¤pŠ˜¦ˆ–’-¤¸ü–üÊ-£Ü¸-£p›ãþø'`- ¨“®-¡¸Š˜-¢Ìˆ–’-¢ü–ºþþÆ—ˆ-¡°-¡$¸- ¸›ãþø'X-  ·þ΄ü”„þò„þôô÷'P-Ÿdˆ›™ò†Òþøð†ü'L-¨-›8“®-œHŒ-žàˆ’-œdü–-’-ÄŠ˜¦ˆ–’-ž ü–üÊ-0¸-œüþþÆ—ˆÁ-›´¸-›H›ãþ-™`‚“®-štŒ¦ˆ’Âü–üà-™à¸-™t›ãþ-”Ô‚“®-•èŒ-™ˆ’-–ü–-–²’-—dŠ˜-˜xˆ–’-—¬ü–ºþþÆ—ˆ-—\-–и-–œþþÆ—ˆÁ-•T¸-”è›ãþ-’|‚“®-“Œ-”xˆ’-“¬ü–ºþþÆ—ˆÁ-’ü¸-’›ãþ-$‚“®-‘8Œ-’ ˆ’-‘Tü–ºþþÆ—ˆÁ-¤¸-8›ãþ-¬ˆ›ãþø-‡À†“®-ˆÜŠ˜-ˆ–’-‰$ü–-‰Ò’-‹@-ŽÈ’-‹8øüøüøüøüøüøüøü-‰ð-Štö-‰¼þþÆ—ˆ-ˆÔ-ˆH¸-‡Ü›ãþø'D-‡,ˆ›‹†Òþøò†ƒù'@-… “®-†Œ¦ˆ–’-†8ü–üà-…ˆ¸-…›ãþø',-cÐ-‚t“¼-ƒ´Œ-„¤ˆ’-„‚ˆ–’-ƒÐü–üà-ƒ -ƒö-‚„›‹Øþ-à‚“¼-$Œ-‚ˆ’-„‚ˆ–’-@ü–üà-€|-ö-ô›‹Øþ-}P‚“¼-~”Œ-„ˆ’-~ô‚ˆ–’-~°ü–üà-}ì-~pö-}d›‹Øþ-zÀ‚“¼-|Œ-|ôˆ’-|d‚ˆ–’-| ü–üà-{\-{àö-zÔ›‹Øþ-x0‚“¼-ytŒ-zdˆ’-yÔ‚ˆ–’-yü–üà-xÌ-yPö-xD›‹Øþ-u ‚“¼-väŒ-wÔˆ’-wD‚ˆ–’-wü–üà-v<-vÀö-u´›‹Øþ-px‚“¼-q¼Œ-uDˆ’-tà‚ˆ’-qØü–-r¢’-shŠ˜-t„ˆ’-sô‚ˆ–’-s°ü–üÊ-rÀ-sDö-rŒþþ-qô—ˆ‹-q´-q-q˜ö-pŒ›‹Øþ-k@‚“¼-l„Œ-pˆ’-o¸‚ˆ’-l ü–-mj’-n0Š˜-o\ˆ’-nÌ‚ˆ–’-nxü–ü—-n(-mˆ-n ö-mTþþ-l¼—ˆ‹-l|-kÜ-l`ö-kT›‹Øþ-cÔ“¼-eŒ-j¸ˆ–’-jT‚ˆ’-e0ü–-eú’-g8-j’-g0øüøüøüøüøü-f-fœö-eäþþ-eL—ˆ‹-e -dl-dðö-c䛋Øþø'(-c¼ƒù'$-c¤ƒù'-Vì“®-WüŒ-cˆ–’-Xü–-XÆ’-[8-bÀ’-[0øüøüøüøüøüôøüôøüøüøüøüøüøüøüøüøü-Xä-Y|öö-X°þþÆ—ˆÁ-Wh¸-Vü›ãþø' -PÄ“®-QÔŽ-SÐþ––˜-Vþ–’-TP–˜þ–˜þ˜¦Üü–üêêêêêê-Qìþ˜-Rôþ–’-R˜þ–’-QÌ-Q@¸-PÔ›ãþø-Ô„-N¼“®-OÌŒ¦ˆ–’-Oèü–üà-O8¸-NÌ›ãþ-L¸‚“®-MÌŒ¦ˆ–’-Mèü–üà-M8¸-LÌ›ãþ-J¸‚“®-KÌŒ¦ˆ–’-Kèü–üà-K8¸-JÌ›ãþ-H¸‚“®-IÌŒ¦ˆ–’-Ièü–üà-I8¸-HÌ›ãþ-F¸‚“®-GÌŒ¦ˆ–’-Gèü–üà-G8¸-FÌ›ãþ-D¸‚“®-EÌŒ¦ˆ–’-Eèü–üà-E8¸-DÌ›ãþ-@°‚“®-AÄŒ-D\ˆ’-Aàü–-BŽ’-C@Š˜¦ˆ–’-Cˆü–üÊ-B¬¸-BxþþÆ—ˆÁ-A0¸-@Ä›ãþ-<˜‚“®-=¬Œ-@Tˆ’-=Èü–->v’-?(Š˜®ˆ–’-?pü–ü—-? ->”¸->`þþÆ—ˆÁ-=¸-<¬›ãþ-à“®-˜-,y¤Üèè,x6û²ò‚,tŽ–,vÚüõ›,wþŠ­ì†ì†óã,vúªê„ê„øÔþ,tš,vHÜèèè,t’û¾ò‚ò‚,pê–,sÞüõ›½üð†üè†üïßþ,pö,sdÄÜÜÜè,pîû²ò‚,m–,p*üõ›µ‹ñð†üð†üïßþ,m*,o°ÐÄèÄè,m"û²ò‚,iz–,lnüõ›µüð†üð†üïßþ,i†,kôÐÄÜÜè,i~û²ò‚,d¶–,hÊüõ›µüð†üè†üÖþ,dÂ,gxÜ,fpÜÜè,dºû²ò‚,_––,cÚüõ›,dˆüè†üð†üè†üÖþ,_¢,bˆÜÜ,ahÜÜè,_šû¾ò‚ò‚,R¾–,^Êüõ›,_xüè†üð†üð†üïßþ,RÊ,^PÐÄèÜèè,\ÜÜè,ZxèèèÐèôÜÐè,WØèèèÜôÜèÐ,U€,TðèèèÜôÜè,RÂû²ò‚,C–,QÆüõ›,Rüð†üè†üð†üð†üïßþ,CÎ,QLÐÄèèÜÐÜèèÐèÜè,M,ÜÜè,K”èèèÐèôÜÐè,HôèèèÜôÜèÐ,Fœ,F èèèÜôÜè,CÆû¾ò‚ò‚,9>–,BÚüõ›,C¤üð†üè†üð†üð†üïßþ,9J,B`,A è,@àè,@ èèèÜèèèÜÜ,<ðèÄèôÐèèèÜèèèÜ,9Bû²ò‚,+Ò–,8Vüõ›,9 üð†üè†üð†üð†üïßþ,+Þ,7ÜÐÄèèèè,5´Äèèèè,3ìÜèÜÜèè,1ôèôÜ,0Ôèè,/äèèèÜôÜèÄèèèÜôÜè,+Öû²ò‚,'‚–,+üõ›,+´üè†üð†üð†üïßþ,'Ž,*DèèèèèÐôÜè,'†û²ò‚,–,&nüõ›,'düè†üð†üè†üð†üð†üïßþ,&,%ô,%4è,$tè,#´èèèèÐÜèèÐèèèÜÜ,4èÄèôÐèèèèÐÜèèÐèèèÜ,û¾ò‚ò‚,ò–,üõ›,üüè†üð†üè†üð†üð†üïßþ,þ,ŒÐÄèèèÜÜèèÐèèè,´ÄèèèÐÜèèÐèèè,$ÜèÜÜèè,,èôÜ, èè, èèèÜôÜèÄèèèÜôÜè,öû¾ò‚ò‚,n–,úüõ›,Äüð†üè†üð†üð†üïßþ,z,8èèèèèÐèèèÐôÜè,rû¾ò‚ò‚+ýV–,¢üõ›,Püè†üð†üð†üïßþ+ýb,(,˜ÐÜ,`Üèèèô+þÈÜè+ýZû²ò‚+ö²–+ü^üõ›+ý(üð†üè†üð†üð†üïßþ+ö¾+ûä+ûTÄÜÜÄÜèèèô+ø<Üè+ö¶û¾ò‚ò‚+ð"–+ö.üõ›§üð†üïßþ+ð.+õ´+ôôèÜÐÜ+óÜèè+ñÜèôÄè+ð&û¦+é–+ïrüõ›µüð†üð†üïßþ+é+îø+î8èÜÄÜÜ+ìÜèè+êØèôÄè+é û²ò‚+㆖+èüõ›+èÈ‹ñð†üð†üÕþІøÌþ+ã’+ç˜ÐÐè+æÜè+äàôÜè+ãŠû²ò‚+Ýþ–+â¢üõ›+ãXüð†üð†üÕþІøÌþ+Þ +â(ÐÄÜÄÜè+ßXôÜè+Þû²ò‚+Ø*–+Ýüõ›+Ýàüð†üð†üË˜ê„øÔþ+Ø6+Ü„èÜèè+ÚìÜ+ÙäÜÜè+Ø.û²ò‚+Ñú–+×üõ›+×üüð†üð†üð†üË˜ê„øÔþ+Ò+Ö„èÜèè+ÔìÜÜ+ÓÌÜÜè+Ñþû¾ò‚ò‚+Å–+Ñüõ›+Ѽ‹ñè†üð†üð†üïßþ+Å+Д+ÐèÜÜÐÄè+Í|ÜÜÜèÐôÄèôÄÜÜè+ÉtÐè+È<èèèÐÐôÜ+Åü+Åû¾ò‚ò‚+·®–+Ãêüõ›+ÄÔüà†‹ñè†üð†üð†üïßþ+·º+Ãp+ÂàèÜÜÐÄèÜ+À@ÜÜÜèÐôÄèôÄÜÜè+¼8Ðè+»èèèÐÐôÜ+¸À+·²û+¸<ò‚ò‚ò‚+µ^–+·üõ›¯üð†üçŠÕþ+µj+¶ èèè+µbû¦+²‚–+´žüõ›½üð†üð†üçŠÕþ+²Ž+´$èÜèè+²†û²ò‚+°2–+±îüõ›¯üð†üçŠÕþ+°>+±tèèè+°6û¦+­V–+¯rüõ›½üð†üð†üçŠÕþ+­b+®øèÜèè+­Zû²ò‚+§æ–+¬Òüõ›§üð†üïßþ+§ò+¬XÐèÜÜ+ª¨Üèè+©pèÄèô+§êû¦+¡ê–+§6üõ›µüð†üð†üïßþ+¡ö+¦¼ÐèÐÜÜÄÜèè+£ŒèÄèô+¡îû²ò‚+œz–+¡füõ›§üð†üïßþ+œ†+ ìÐèÜÜ+Ÿ<Üèè+žèÄèô+œ~û¦+–~–+›Êüõ›µüð†üð†üïßþ+–Š+›PÐèÐÜÜÄÜèè+˜ èÄèô+–‚û²ò‚+.–+•²üõ›+–`üè†üð†üè†üÖþ+:+• è+“ˆÜ+’PÜ+‘HÜÜèèè+2û²ò‚+‡ –+Ž6üõ›+üð†üè†üð†üè†üÖþ+‡+¤è+‹ôÜÜ+ŠtÜÜ+‰<ÜÜèèè+‡û¾ò‚ò‚+ƒ–+†Züõ›½üð†üè†üïßþ+ƒ*+…àÐÜÐÜÜè+ƒ"û²ò‚+€"–+‚nüõ›½üð†üð†üçŠÕþ+€.+ÜèèèÜè+€&û¦+{Ö–+rüõ›½üð†üð†üçŠÕþ+{â+~àÜÐÄÐÐÜè+{Úû¦+vR–+z6üõ›+{€Žò„øðÔ†Žò„øð̆Žò„øðË˜ê„øÔþ+v^+y\èÐèÐèèÜèè+vVû¾ò‚ò‚+rN–+uüõ›+v4üÔ†Žò„øðÄ†Ž˜ê„øðçŠÕþ+rZ+t€ÐèÐèè+rRû¾ò‚ò‚+mê–+qüõ›+qøŽò„øðð†üà†‹ñË˜ê„øÔþ+mö+p4èèèèÜèè+mîû¾ò‚ò‚+jv–+m:üõ›½üð†üè†üïßþ+j‚+lÀÐÐÄè+jzû²ò‚+gz–+iÆüõ›½üð†üð†üçŠÕþ+g†+i4èèèÜè+g~û¦+c.–+fÊüõ›½üð†üð†üçŠÕþ+c:+f8ÜÐÄÐÐÜè+c2û¦+`¾–+bªüõ›§üè†üÖþ+`Ê+bèèèè+`Âû¦+^V–+`*üõ›§üè†üÖþ+^b+_˜ÜÜ+^Zû²ò‚+Z –+]¦üõ›½üð†üè†üïßþ+Z+],ÄèèèÐÜÜè+Zû²ò‚+U’–+Y.üõ›+YÜüð†üð†üè†üïßþ+Už+X´ÄÜèÐÜÜè+U–û¾ò‚ò‚+PF–+TŠüõ›+Udüð†üè†üð†üè†üïßþ+PR+TÄÜÜèÐÜÜÜè+PJû+PÔò‚ò‚ò‚+L.–+Ojüõ›+P(üà†‹ñð†üè†üÖþ+L:+NðèÐè+M Üè+L2û²ò‚+GÖ–+KBüõ›+Kð‹ñè†üð†üè†üÖþ+Gâ+JÈèÄÜÄÜè+GÚû¾ò‚ò‚+BÒ–+FÎüõ›+G¸üà†‹ñð†üð†üè†üïßþ+BÞ+FTÐÜèèÜÐÜÜè+BÖû¾ò‚ò‚+=Ž–+Aºüõ›+B”‹ñè†üð†üð†üè†üïßþ+=š+A@ÐÜÜÜèÐÜÜè+=’û+>ò‚ò‚ò‚+9â–+<¾üõ›½‹ñè†üè†üÖþ+9î+¦÷áþø*<¼†“®½ü*<ئ÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø*9¸†“®½ü*9Ô¦÷áþø*8|†“®½ü*8˜¦÷áþøØ††þøð†ƒùò†ƒùôüþ*%Ɔüî*7p*%¢þ«*6¨ˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þø*3˜†“®½ü*3´¦÷áþø*2\†“®½ü*2x¦÷áþø*1 †“®½ü*1<¦÷áþø*/䆓®½ü*0¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø*+ü†“®½ü*,¦÷áþø**À†“®½ü**ܦ÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø*'¼†“®½ü*'ئ÷áþø*&€†“®½ü*&œ¦÷áþøØ††þøð†ƒùò†ƒùôüþ粆üî*%tçŽþ«*$¬ˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þø*!œ†“®½ü*!¸¦÷áþø* `†“®½ü* |¦÷áþø*$†“®½ü*@¦÷áþø*膓®½ü*¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø*†“®½ü*¦÷áþø*Ć“®½ü*à¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø*À†“®½ü*ܦ÷áþø*„†“®½ü* ¦÷áþøØ††þøè†ƒ**ò*üìþ«* ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ* ®Š*¤ò* ºüìþ«*°ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ* RŠ* Hò* ^üìþ«* Tˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ*öŠ* ìò*üìþ«*øˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ*šŠ*ò*¦üìþ«*œˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ*>Š*4ò*Jüìþ«*@ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ)üâŠ)ÿØò)üîüìþ«)þ䈦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ)ù†Š)ü|ò)ù’üìþ«)ûˆˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ)ö*Š)ù ò)ö6üìþ«)ø,ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ)òΊ)õÄò)òÚüìþ«)ôЈ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ)ïrŠ)òhò)ï~üìþ«)ñtˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþèNŠ)ï òèZüìþ«)õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýè ††þ›‰þ¦)ì¸üö†üö†üö†üö†üò†ƒùé<²)ëìŒþ’âÀŽŒþþ)êàŒþ’âÀŽŒþþ)é4ªþ˜þ–’òþ)éPŠþ)è ªª–ü–ÀŠþ阫)ç¸˜ê„øë|„)çxò„뀬)æ`Œþ’Š)ç4’òþ)樘þ’)æ\ÞŽ)äüŒþ’Š)åð’òþ)åd˜þ’)åÞŽ)ãÈŒþ˜þ–’òþÆí¼Œþ˜ª–”þ›‰þ¦)ã˜üò†ƒùïL&‘)ãhÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ<)à)àäèè)àþ¦ò‚)Þ¼)ßxè)ÞÄþ¦ò‚)ÚÈ)ÝÄ)Ý4èÜèèèèÐ)ÚÐþ¦ò‚)Ù¤õþ¦ò‚)Ø€õþ¦ò‚)×\õþ¦ò‚)Õ)ÖÄ)Õ˜þ¦ò‚2)ÕPŒ†øòò‚ü)Õþ³)Ôüˆþö)ÔP†ˆ¦÷þ™üÎþø)Ó„)Ó¬ˆ¦õ£ð†üïßþ)Ó ˆ¦õ™üïßþø)Ò€†ˆ¦õ™üïßþø)Ѱ†ˆ¦õ¯üð†üç’Íþø)Є)Ððˆ¦÷þ§‹ñð†üÎþ)Ј¦÷þ¯‹ñ膋ñÎþøÔ†ƒ‹ò„øðà†ƒ‹)ϰò„¯F‘)ψގގގގގގގގގގގގގ¯\)Ìîõþš)ËÄ)Ì€)ËÌþš)ʸ)Ët)ÊÀþš)È)ÊÐ)É)Èþš)ÆH)Ǭ)ÆPþš)Ä4)Åà)ÅPÜè)Ä<þš)Â8)ÃÌèè)Â@þš)Àä)Á¸Ü)Àìþš¯Xý)ÀЯ"þ³)ÀÈüö†üö†üö†üö†üò„†üüò„†üü°œ†ƒ)‡‘)À@ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ)‡0)¸Æ)½œèè)»ŒÄ)¹ÄÐè)¸°þ¦ò‚)µ,)¸@)·€)¶ØèèÐèè)µ4þ¦ò‚)±˜)´¬Äèè)³)²l)± þ¦ò‚)©´)°ˆ)¯ÈÄèèÜèèÄÄèè)¬8)«)ªèèè)©¼þ¦ò‚)¨¨)©d)¨°þ¦ò‚)§œ)¨X)§¤þ¦ò‚)¦x)§L)¦€þ¦ò‚)¥T)¦()¥\þ¦ò‚)¤H)¥)¤Pþ¦ò‚)¡ì)£È)¢À)¡ôþ¦ò‚)‡,)“)£ü¾‘)¡ÌÞŽ)ž`) Ê)¡P) ´)ž\ý) ˜)ž&þ³)Ÿxƒš‘) ˆ)Ÿ¾) X)Ÿ¶ìþ³˜ƒ‹†øðò†ƒùôüþÊ)ž¬†ˆ¦÷þ™‹ñÎþøò†ƒùôüþ)¦þ«ŒƒùôüþÈ)’úòúþ«)œÐˆ¦õ“†Êþø)œ†ˆ¦õ“†Êþø)™ü†“)š®)›<Š––š—Ë—Óêö)š¨ºþ)šª÷þ™üïÛþ›Ý)™T†ˆª÷þ™üÊþ›Ý)˜ „)˜¸ˆª÷þ™üïÛþ›)˜ˆª÷þ™üïÛþ›Ý)–Ä„)—pˆª÷þ™üïÛþ›)–Јª÷þ™üïÛþ›Ý)–†ˆª÷þ§üð†üïÛþ›Ý)•X†ˆª÷þ™üïÛþ›Ý)“˜„)”ˆª÷þ§‹ñð†üïÛþ›)“¤ˆªõ¯þþ膋ñïÛþ›Ýö†üÞ†”þò„þöò†ƒùôüþ)‡&)ŽüŒ)’¼)›‘)’¨ÞŽ)\)‘Ö«Ê)R)‘¤)"þ³)tƒš‘)‘”)º)‘d)²ìþ³˜ƒ‹†øðò†ƒùôüþÊ)¨†ˆ¦÷þ™‹ñÎþøò†ƒùôüþÂò‚)‡úþ³)ŽÔüÞ†”þò„þö)膈¦÷þ™üÎþø)H†ˆ¦÷þ™üïßþø)Œ„)Œ´ˆ¦÷þ™üïßþ)Œ ˆ¦÷þ¡üç’Íþø)Ѝ„)‹lˆ¦÷þ™üïßþ)Š´ˆ¦÷þ©üß’Íþø)‰ì†ˆ¦÷þ§üð†üïßþø)‰L†ˆ¦÷þ™üÎþø)‡|„)ˆŒˆ¦÷þ§‹ñð†üÎþ)‡ˆˆ¦õ¯¡Ýþ膋ñÎþøò†ƒùôüþ²‘)†à²)†°±Þþ³)†hƒ‹†øðò†ƒù²8üþš)…€ˆ¦õ·ä†‹Ø’Íþøò†ƒùð†üð†ƒùð†ƒùð†üð†üò†ƒù²X³–üìþ«)„ˆ¦õ§ì†ëßþø)‚œ†ˆ)ƒ¬õ§üð†ü)‚´þ›‹¦õ§üð†üÎþÖ)€ì†ˆ)‚8õµüð†üð†ü)þ›‹¦õµ‹ñð†üð†üÎþÖ)´†ˆ)€´÷þ™ü)Ìþ›‹¦÷þ™üÎþÖ)~$†ˆ)Põ±ð†üð†ü)~<þ›‹¦õ±ð†üð†üÎþÖ){䆈)}hõµþüòð‚ð†üï){üþ›‹¦õµþüòð‚ð†üïßþÖ)y<„)z˜ˆ){œõ§üð†üï)z¤þ›‹¦õ§üð†üïßþ)yHˆ)zLõ§üð†üï)yTþ›‹¦õ§üð†üïßþÖµ„)x˜ˆ¦õ§ì†Êþ¶h‚—ü·n–ðüû)x8·dþ)tª–)wVüõ›)wð‹‹†øèΆ‹‹†øèÖþ)t¶)v”èÐè)t®û¦)q–)s¾üõ›)tX‹‹†øèΆ‹‹†øèÖþ)q)rüèÐè)qû¦)mz–)p&üõ›)pÀ‹‹†øèΆ‹‹†øèÖþ)m†)odèÐè)m~û¦)iâ–)lŽüõ›)m(‹‹†øèΆ‹‹†øèÖþ)iî)kÌèÐè)iæû¦)fJ–)höüõ›)i‹‹†øèΆ‹‹†øèÖþ)fV)h4èÐè)fNû¦)b²–)e^üõ›)eø‹‹†øèΆ‹‹†øèÖþ)b¾)dœèÐè)b¶û¦)_v–)a’üõ›)b`‹‹†øèÖ†‹‹†øèÕþІøÌþ)_‚)`èèÐè)_zû¦)\–)^füõ›)_$‹‹†øèÖ†ŽþІøè݆øÔþ)\&)]ÔÐèÜè)\û¦)Y–)[~üõ›«‹ñ݆øÔþ)YÎ)ZìÜè)YÆû¦)Wj–)Y&üõ›«‹ñ݆øÔþ)Wv)X”Üè)Wnû¦)T–)V¢üõ›)W<ü膋ñ݆øÔþ)T)UøèèÜÜè)Tû²ò‚)Oæ–)Rzüõ›)S€‹‹¤ò„ò„ò„øè)R¨†‹‹¼ê„ê„ê„øèÖþ)Oò)Qèèèè)Oêû)Ptò‚ò‚ò‚)K¾–)NRüõ›)OX‹‹¤ò„ò„ò„øè)N€†‹‹¼ê„ê„ê„øèÖþ)KÊ)MÀèèè)KÂû)LLò‚ò‚ò‚)HÞ–)Jšüõ›)KX‹‹ò„øè)JȆ‹‹˜ê„øèÖþ)Hê)Jèè)Hâû²ò‚)EV–)Gºüõ›)Hx‹‹ò„øè)G膋‹˜ê„øèÖþ)Eb)Gèè)EZû²ò‚)Bê–)DFüõ›)E‹‹†øèÖ†ŽþІøè݆øÔþ)Bö)CÌè)Bîû¦)@–)AÊüõ›)B˜‹‹†øèÖ†‹‹†øèÕþІøÌþ)@)APèèè)@û¦)=f–)?"üõ›)?¼‹‹†øèΆ‹‹†øèÖþ)=r)>¨èèè)=jû¦):Ö–)4„(>Ôˆªõ™üïÛþ›(>@ˆªõ™üïÛþ›Ý(<„(=ˆˆªõ£ð†üïÛþ›(<Ô‚ˆªõ§üð†üïÛþ›(<(ˆªõ§üð†üïÛþ›Ý(;€†ˆªõ™üïÛþ›Ý'Íø„'Ô—ü(6ò–(9¶üõ›(;‹‹šò„ò„øè(:`†‹‹ªê„ê„øè(9Öªê„ê„øÔþ(6þ(9$èÜÜèèè(6öû¾ò‚ò‚(2¢–(5füõ›(6X‹‹¢ê„ò„øèà†‹ñ(5†ªê„ê„øÔþ(2®(4ÔèÜÜèèè(2¦û¾ò‚ò‚(.2–(1&üõ›(2‹‹¢ê„ò„øèè†ü(1Fªê„ê„øÔþ(.>(0”èÜÄèèè(.6û¾ò‚ò‚()â–(,¦üõ›(.‹ñ(-P†‹‹ªê„ê„øè(,ƪê„ê„øÔþ()î(,èÜÜèèè()æû¾ò‚ò‚(%r–((füõ›()Äü()†‹‹ªê„ê„øè((†ªê„ê„øÔþ(%~('ÔÐÜÜèèè(%vû¾ò‚ò‚( ò–($üõ›($ø‹‹šò„ò„øè($D†‹‹ªê„ê„øèÖþ( þ(#TèèÐèÐè( öû¾ò‚ò‚(Þ–(âüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(ê( èè(âû¾ò‚ò‚(Ê–(Îüõ›(°‹ñ(ü†‹‹ªê„ê„øèÖþ(Ö( èè(Îû¾ò‚ò‚(J–(nüõ›(P‹‹šò„ò„øè(œ†‹‹ªê„ê„øèÖþ(V(¬èèÐèÐè(Nû¾ò‚ò‚(6–(:üõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(B(xèè(:û¾ò‚ò‚("–(&üõ›(‹ñ(T†‹‹ªê„ê„øèÖþ(.(dèè(&û¾ò‚ò‚( –(Æüõ›(¨‹‹šò„ò„øè(ô†‹‹ªê„ê„øèÖþ( Î(èè( Æû¾ò‚ò‚( ®–( ²üõ›( ”‹ñ( à†‹‹ªê„ê„øèÖþ( º( ðèè( ²û¾ò‚ò‚(š–(žüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(¦(Üèè(žû¾ò‚ò‚(:–(>üõ›( ‹‹šò„ò„øè(l†‹‹ªê„ê„øèÖþ(F(|èè(>û¾ò‚ò‚(&–(*üõ›( ‹ñ(X†‹‹ªê„ê„øèÖþ(2(hèè(*û¾ò‚ò‚'ý–'ÿüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ'ý'þTèè'ýû¾ò‚ò‚'ù²–'û¶üõ›'ü˜‹‹šò„ò„øè'û䆋‹ªê„ê„øèÖþ'ù¾'úôèè'ù¶û¾ò‚ò‚'öž–'ø¢üõ›'ù„‹ñ'øÐ†‹‹ªê„ê„øèÖþ'öª'÷àèè'ö¢û¾ò‚ò‚'óŠ–'õŽüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ'ó–'ôÌèè'óŽû¾ò‚ò‚'ð*–'ò.üõ›'ó‹‹šò„ò„øè'ò\†‹‹ªê„ê„øèÖþ'ð6'ñlèè'ð.û¾ò‚ò‚'í–'ïüõ›'ïü‹ñ'ïH†‹‹ªê„ê„øèÖþ'í"'îXèè'íû¾ò‚ò‚'ê–'ìüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ'ê'ëDèè'êû¾ò‚ò‚'æê–'è¦üõ›'鈋‹šò„ò„øè'èÔ†‹‹ªê„ê„øèÖþ'æö'èèè'æîû¾ò‚ò‚'䆖'å:üõ›'æ`‹‹šò„ò„øè'åІ‹‹˜ê„øèÊ‹˜ê„øÌþ'äŠû¾ò‚ò‚'â"–'âÖüõ›'ãü‹‹šò„ò„øè'ãl†‹‹˜ê„øèÊ‹˜ê„øÌþ'â&û¾ò‚ò‚'ß–'àvüõ›'âü'áp†‹‹šò„ò„øè̆‹‹ò„øèÊ‹˜ê„øÌþ'߯û¾ò‚ò‚'Ý~–'Þ2üõ›'ß8‹‹šò„ò„øè̆‹‹ò„øèÊ‹˜ê„øÌþ'Ý‚û¾ò‚ò‚'Øš–'Üfüõ›'Ý`üð†ü'܆´Œ†øÖ„Œ†øà„øÔþ'ئ'Ûì'ÛDÜèèÄ'Ù”èè'Øžû¦'Õ2–ð'×ÜÜèèèèèè'ÕäèÁû¦Øþ'Ô,¦õ'Ôèþ’ìð†üð†üð†üïßþ'Ó‚ˆªõ'ÓÜþ’ìð‚ð‚ð†üïÛþ›'Ò ‚ˆªõµþ’ìð†üð†üïÛþ›'Ðø‚ˆªõ'ÑÐþ’ìð‚ð†üð†üïÛþ›'Ïœ‚ˆªõ'мþ’ìÚ„„þìð‚ð†üð†üïÛþ›'ÎÜ‚ˆªõ§‹ñð†üïÛþ›'Έªõ§þ’ìð†üïÛþ›ÝÔ††þ›Ýð†ƒù'ÌØ†ƒ¢§Õìþ«ŒƒùôüþÐ'Ë@„'Ì,ˆªõ§üð†üïÛþ›'ËLˆªõ¯‹ñ膋ñïÛþ›Ý'Éð„'Ê ˆªõ™‹ñïÛþ›'Éüˆªõ™‹ñïÛþ›Ýð†ƒù'Ɇƒ¢±ò„Õìþ«ŒƒùôüþÐð†ƒùð†ƒùð†ƒùð†ƒùð†üð†üð†ƒùð†üð†ƒùö†üö†üÒ† þò„þò‚örø†ƒžþ'Ä®‘'Ç'ÇŽŒšò„ò„ø'ÄÄ'ÆB'ÆÈèÊ'ĺ'Æ'ÄŠþ³˜ˆ¦õ'Åüü膋ñ膋ñçßþøò†ƒùôüþ'Á’‘'Ät'Ã䎌šò„ò„ø'Á¨'Ã&'ìèÊ'Áž'Âô'Ánþ³˜ˆ¦õ'Âàü膋ñ膋ñçßþøò†ƒùôüþ'¾v‘'ÁX'ÀÈŽŒšò„ò„ø'¾Œ'À 'ÀèÊ'¾‚'¿Ø'¾Rþ³˜ˆ¦õ'¿Äü膋ñ膋ñçßþøò†ƒùôüþ'»Z‘'¾<'½¬ŽŒšò„ò„ø'»p'¼î'½tèÊ'»f'¼¼'»6þ³˜ˆ¦õ'¼¨ü膋ñ膋ñçßþøò†ƒùôüþ'¸>‘'» 'ºŽŒšò„ò„ø'¸T'¹Ò'ºXèÊ'¸J'¹ '¸þ³˜ˆ¦õ'¹Œü膋ñ膋ñçßþøò†ƒùôüþ'µj‘'¸ÂŽŒò„ø'µ€'¶â·'¶Ì'µv'¶°'µFþ³˜ˆ¦õ·‹ñ膋ñçßþøò†ƒùôüþ'±¾‘'µ0'´ ŽŒŒ„ò„ø'±Ô'³R'´Pè'³<'±Ê'³ '±šþ³˜ˆ¦õ'³ üà†‹ñ膋ñÎþøò†ƒùôüþ'­Ê‘'±„'°ôŽŒŒ„ò„ø'­à'¯^'°Œè'¯H'­Ö'¯,'­¦þ³˜ˆ¦õ'¯üà†‹ñ膋ñÎþøò†ƒùôüþ'ª‘'­'­ŽŒŒ„ò„ø'ª4'«²'¬°è'«œ'ª*'«€'©úþ³˜ˆ¦õ'«lüà†‹ñ膋ñÎþøò†ƒùôüþ'¦r‘'©ä'©TŽŒŒ„ò„ø'¦ˆ'¨'©è'§ð'¦~'§Ô'¦Nþ³˜ˆ¦õ'§Àüà†‹ñ膋ñÎþøò†ƒùôüþ'¢~‘'¦8'¥¨ŽŒŒ„ò„ø'¢”'¤'¥@è'£ü'¢Š'£à'¢Zþ³˜ˆ¦õ'£Ìüà†‹ñ膋ñÎþøò†ƒùôüþ'žŠ‘'¢D'¡´ŽŒŒ„ò„ø'ž ' '¡Lè' 'ž–'Ÿì'žfþ³˜ˆ¦õ'ŸØüà†‹ñ膋ñÎþøò†ƒùôüþ'šÞ‘'žP'ÀŽŒŒ„ò„ø'šô'œr'pè'œ\'šê'œ@'šºþ³˜ˆ¦õ'œ,üà†‹ñ膋ñÎþøò†ƒùôüþ'—2‘'š¤'šŽŒŒ„ò„ø'—H'˜Æ'™Äè'˜°'—>'˜”'—þ³˜ˆ¦õ'˜€üà†‹ñ膋ñÎþøò†ƒùôüþ'“Α'–øÂŽŒ‚„ø'“ä'•F'–,'•0'“Ú'•'“ªþ³˜ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'Α'“”ÞŽÞŽ'’¨ŽŒ‚„Œþî'ä'‘ê·èÖ'0'‘dè'8'Ú''¶úþ³'üˆþö'†ˆ¦õ§‹‹þèð†üÎþø'Ž0†ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'‡‘'”ÞŽÞŽ'ŒtŽŒœ„ŒþØ„Œþî'‡4'‹¶·èÖ'‰Ì'‹0èè'‰Ô'‡*'‰¸'‡úþ³'‰˜ˆþö'ˆ`†ˆ¦õ'‰L‹‹þèØ†‹‹þèð†üÎþø'‡€†ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'„b‘'†äÂŽŒ‚„ø'„x'…Úõ'„n'…¨'„>þ³˜ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'jj‘'„(ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ'¼ŽŒ²ŒþŠþІø'ô„ŒþŠþІøÞ'j€'€†'lèÜèÖ'D'€èèÊ'~ '~ôèèÊ'jv'}ÐŒþŠþІøâò‚'jRúþ³'}¨üÞ†”þò„þö'tÔ„'y ˆ¦õ§ŽþŠŒ–'}Œ–†øî'|”„Œ–†øî'z\„Ž'|P–†øî'z|˜'{Ô––†øî'z¨˜¾þ–'zÔ––†øî'zH„øî䄸èð†üïßþ'tàˆ¦õ§ŽþŠŒ–'xÀŒ–†øî'xT„Œ–†øî'v„Ž'x–†øî'v<˜'w”––†øî'vh˜¾þ–'v”––†øî'v„øî䄸èð†üïßþø'lȆˆ¦õ'q,ŽþŠŒ–'txŒ–†øî't „Œ–†øî'qÔ„Ž'sÈ–†øî'qô˜'sL––†øî'r ˜¾þ–'rL––†øî'qÀ„øî䄸è'ml†ŽþŠŒ–'pÄŒ–†øî'pX„Œ–†øî'n „Ž'p–†øî'n@˜'o˜––†øî'nl˜¾þ–'n˜––†øî'n „øî䄸è膋ñÎþøÌ†ƒ‹þŠò„øè̆ƒ‹þŠò„øè膃ùð†ƒù'j̆ƒ‹ºŒþŠþІø'jø„ŒþŠþІøÞðò†ƒùôüþ'b†‘'j0ÞŽÞŽÞŽ'hüŽŒ ŒþØ„Œþî'bœ'gN'h|ÜÐèÊþš'e¬'fÈèÜ'e´þš'b’'e˜'bnúþ³'eüƆ”‰‹þìò„þö'd†ˆ¦õ·‹‹þèð†üß•þÌþø'b膈¦õ'cÔ‹‹þèà†‹ñ膋ñÎþøò†ƒùôüþ'HŽ‘'bLÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ'_àŽŒ²ŒþŠþІø'`„ŒþŠþІøÞ'H¤'^ª'_èÜèÖ']h'^<èèÊ'\D']èèÊ'Hš'[ôŒþŠþІøâò‚'Hvúþ³'[ÌüÞ†”þò„þö'Rø„'WDˆ¦õ§ŽþŠŒ–'[$Œ–†øî'Z¸„Œ–†øî'X€„Ž'Zt–†øî'X ˜'Yø––†øî'X̘¾þ–'Xø––†øî'Xl„øî䄸èð†üïßþ'Sˆ¦õ§ŽþŠŒ–'V䌖†øî'Vx„Œ–†øî'T@„Ž'V4–†øî'T`˜'U¸––†øî'TŒ˜¾þ–'T¸––†øî'T,„øî䄸èð†üïßþø'J솈¦õ'OPŽþŠŒ–'RœŒ–†øî'R0„Œ–†øî'Oø„Ž'Qì–†øî'P˜'Qp––†øî'PD˜¾þ–'Pp––†øî'O䄸î䄸è'K†ŽþŠŒ–'N茖†øî'N|„Œ–†øî'LD„Ž'N8–†øî'Ld˜'M¼––†øî'L˜¾þ–'L¼––†øî'L0„øî䄸è膋ñÎþøÌ†ƒ‹þŠò„øè̆ƒ‹þŠò„øè膃ùð†ƒù'Hð†ƒ‹ºŒþŠþІø'I„ŒþŠþІøÞðò†ƒùôüþ'@ª‘'HTÞŽÞŽÞŽ'G ŽŒ ŒþØ„Œþî'@À'Er'F ÜÐèÊþš'CÐ'DìÜè'CØþš'@¶'C¼'@’úþ³'C´üƆ”‰‹þìò„þö'B8†ˆ¦õ·‹‹þèð†üß•þÌþø'A †ˆ¦õ'Aø‹‹þèà†‹ñ膋ñÎþøò†ƒùôüþ':ú‘'@pÞŽÞŽÂŽŒò„ø';'>æ·èÖ'=Ô'>xèÊ';'=Àò‚':âúþ³'=@ˆ‰ˆ‘óéö'<„†ˆ¦õ§üð†üïßþø';\†ˆ¦õ¯‹ˆ™ëå膋ñÎþøò†ƒùôüþ'4Š‘':ÀÞŽÞŽ'9àŽŒšò„ò„ø'4 '9"·èÖ'7à'8´èèÊ'4–'7Ìò‚ò‚'4rúþ³'7ˆ‰ˆŸì†óéö'6@†ˆ¦õµüð†üð†üïßþø'4솈¦õ¯‹ˆ¯ä†ëå膋ñÎþøò†ƒùôüþ'.B‘'4PÞŽÞŽÂŽŒò„ø'.X'2Æ·èÖ'1l'2(è'1t'.N'1Xò‚'.*úþ³'0¸ˆ‹þŠŸì†óçö'/솈¦õ§‹ñð†üïßþø'.¤†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ''R‘'.ÞŽÞŽ'-(ŽŒšò„ò„ø''h',j·èÖ'*ø'+üÜè'+''^'*äò‚ò‚'':úþ³'*ˆ‹þŠ­ì†ì†óçö')(†ˆ¦õ½ü膋ñð†üïßþø''´†ˆ¦õ¯þеì†ì†ëã膋ñÎþøò†ƒùôüþ'! ‘''ÞŽÞŽÂŽŒò„ø'! '%Ž·èÖ'$4'$ðè'$<'!'$ ò‚' òúþ³'#€ˆ‹þŠŸì†óçö'"´†ˆ¦õ§‹ñð†üïßþø'!l†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ'‘' ÐÞŽÞŽ'ðŽŒšò„ò„ø'0'2·èÖ'À'ÄÜè'È'&'¬ò‚ò‚'úþ³'؈‹þŠ­ì†ì†óçö'ð†ˆ¦õ½ü膋ñð†üïßþø'|†ˆ¦õ¯þеì†ì†ëã膋ñÎþøò†ƒùôüþ'Ò‘'àÞŽÞŽÂŽŒò„ø'è'V·èÖ'ü'¸è''Þ'èò‚'ºúþ³'Hˆ‹þŠŸì†óçö'|†ˆ¦õ§‹ñð†üïßþø'4†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ' â‘'˜ÞŽÞŽ'¸ŽŒšò„ò„ø' ø'ú·èÖ'ˆ'ŒÜè'' î'tò‚ò‚' Êúþ³' ˆ‹þŠ­ì†ì†óçö'¸†ˆ¦õ½ü膋ñð†üïßþø' D†ˆ¦õ¯þеì†ì†ëã膋ñÎþøò†ƒùôüþ'š‘' ¨ÞŽÞŽÂŽŒò„ø'°' ·èÖ' Ä' €è' Ì'¦' °ò‚'‚úþ³' ˆ‹þŠŸì†óçö'D†ˆ¦õ§‹ñð†üïßþø'ü†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ&ü^‘'`ÞŽÞŽ'DŽŒ'èò„ò„'t'~‘'¬ÞŽ'Š'Tò‚'Zþ³®ƒù膃ùò†ƒùôüþ'ª‘'DÞŽÞŽ'¶'Äò‚ò‚'†þ³'pƒù膃ù膃ùò†ƒùôüþ&üt'†·èÖ''Üè'&üj'ò‚ò‚&üFúþ³&ÿ,ˆ‹þŠ­ì†ì†óçö&þD†ˆ¦õ½ü膋ñð†üïßþø&üÀ†ˆ¦õ¯þнì†ä†ëã膋ñÎþøò†ƒùôüþ&ðª‘&ü$&ðÈ&õð&ûÐÜ„ò„&õì¬&ûh&ö<þ&÷¦&úüè&ú<ÐèèèÐèÜÐôÊ&ö.&÷t&õþþ³˜ˆ¦õ&÷`üð†üð†üß’Íþøò†ƒùôüþ&ðÀ&ó2&õ˜ÐÜÐÜÜè&ó&ð¶&òŒŠþ–ÚÊŠˆ–†øîîò‚&ð†þ³˜ˆ¦õ&ñèüð†üð†üß’Íþøò†ƒùôüþ&å&‘&ðp&åD&éô&ðÜ„ò„&éð¬&ï´&ê@þ&ëª&ïH&î¸ÐèèèÜèÐèÜÐôÊ&ê2&ëx&êþ³˜ˆ¦õ&ëdüð†üð†üß’Íþøò†ƒùôüþ&å<&ç®&éœÐÐÄè&ç˜&å2&çŠþ–ÚÊŠˆ–†øîîò‚&åþ³˜ˆ¦õ&ædüð†üð†üß’Íþøò†ƒùôüþ&ÛB‘&äì&Û`&à\&ä˜ò„ò„&àX¬&ä\&à¨þ&âJ&ãØèÜ&âÐèÊ&àš&âò‚&àjþ³˜ˆ¦õ&áÜ‹ñè†üà†‹ñÎþøò†ƒùôüþ&ÛX&Þ&àèÐÜÄ&Þ&ÛN&Üôоþ–&Ý––†øîØò‚ò‚&Ûþ³˜ˆ¦õ&Ü‹ñè†üà†‹ñÎþøò†ƒùôüþ&ºÂ‘&ÙàŒª–†ŽþìîÒô&ºÔ&Ø&Ùˆ&Øìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ&Ö.†&׬&Ö2ìþ«&Öàˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&ÔJ†&ÕÈ&ÔNìþ«&Ôüˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&Òf†&Óä&Òjìþ«&Óˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&Ђ†&Ò&Іìþ«&Ñ4ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&Ξ†&Ð&΢ìþ«&ÏPˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&̺†&Î8&̾ìþ«&Ílˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&ÊÖ†&ÌT&ÊÚìþ«&ˈˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&Èò†&Êp&Èöìþ«&ɤˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&dž&ÈŒ&Çìþ«&ÇÀˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&Å*†&ƨ&Å.ìþ«&Å܈¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&ÃF†&ÄÄ&ÃJìþ«&Ãøˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&Áb†&Âà&Áfìþ«&ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&¿~†&Àü&¿‚ìþ«&À0ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&½š†&¿&½žìþ«&¾Lˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&»¶†&½4&»ºìþ«&¼hˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ&ºÎ&»t&ºžþ³˜†þøò†ƒùôüþ&±2‘&ºˆ&±P&µp&º4Ü„&µl¬&¹à&µ¼þ&¶Þ&¹DèèÐè&·Ä&¶È&µ®&¶¬&µ~þ³˜ˆ¦õ™‹ñÎþøò†ƒùôüþ&±H&³r&µè&´X&³\&±>&²dŠª–”þêÂðò‚&±þ³˜ˆ¦õ™‹ñÎþøò†ƒùôüþ&š&&¨x&°ÌÜ„&¨t¬&°x&¨Äþ&ª.&¯ôÜèÄÜèÄÄ&«ìè&ªÌ&ªþš&¨¶&©ü&¨†þ³˜ˆ¦õ­þ膋ñÎþøò†ƒùôüþ&šä„&¨8Ü„&šè¬&§ä&›8þ&œ¢&§`Üè&¦@ÜÐÐ&¤ÜèÐ&£(&¢˜èèèèÐÄèèÄè&ž`è&@&œŒþš&›*&œp&šúþ³˜ˆ¦õ­þ膋ñÎþøò†ƒùôüþ&š2&š´øò‚&šþ³Œƒùôüþs–‰&™r§×þìþ«Œƒùôüþ&˜¦†§×þìþ«Œƒùôüþs¢&˜dsšìþ³&˜TƒùsÌüþš&˜Dü&o|„&˜4ú‚&uÄ‚—ü&vú–ð&–œè&•ÜÜèÐèÐèèèèè&’ôèÄÜèèèèèèè& &ŽÔèÐèèèÜè&Œ¬èèèèÄ&Š´ÜèÐèÄèÄÜèèèèèèèÄ&…ìèèèèèÄèèèèÄ&‚tèèèèô&€Äè&€èÐèôÄèÄÐèÐÐè&{üèèèÜÜôÐÐèèèô&xÌè&wôè&vþû¦Ö&uئõ&vÜüð†üè†üð†üð†üð†üïßþ&oˆ—ü&pº–ð&u,ÄèÐèèèèÐèè&qüèèèô&p¾û¦Ö&o˜¦õ&pœüð†üè†üð†üð†üð†üïßþø&fŒ„&k—ü&lš–ð&näÜèÐèèèè&lžû¦Ö&k(¦õ&l,ކøðð†üè†üð†üð†üð†üïßþ&f˜—ü&h–ð&j”ÜÄÜÐèè&hû¦Ö&f¨¦õ&g¬Ž†øðð†üè†üð†üð†üð†üïßþø&Zô„&fˆú‚&`Œ‚—ü&aŠ–ð&elèèèè&dèÐèèèÜÜô&aŽû¦Ö&` ¦õ&alüð†üè†üð†üïßþ&[—ü&[ú–ð&_ôÐèÐèèÐèè&]<èèèô&[þû¦Ö&[¦õ&[Üüð†üè†üð†üïßþø&SL„&W@—ü&XŠ–ð&Z\ÜèÜèè&XŽû¦Ö&WP¦õ&Xކøðð†üè†üð†üïßþ&SX—ü&T¢–ð&V¼ÜÄÜÐ&T¦û¦Ö&Sh¦õ&T4ކøðð†üè†üð†üïßþø&FÜ„&SHú‚&Lt‚—ü&Mr–ð&R\ÐèèèèÄèèÄèôÐèèèÜÜô&Mvû¦Ö&Lˆ¦õ&MTüð†üè†üð†üïßþ&Fè—ü&Gâ–ð&KÜÐèÐèèÐèè&I$èèèô&Gæû¦Ö&Fø¦õ&GÄüð†üè†üð†üïßþø&?4„&C(—ü&Dr–ð&FDÜèÜèè&Dvû¦Ö&C8¦õ&Dކøðð†üè†üð†üïßþ&?@—ü&@Š–ð&B¤ÜÄÜÐ&@Žû¦Ö&?P¦õ&@ކøðð†üè†üð†üïßþø&(ü„&?0ú‚ú‚&38‚—ü&4r–ð&>œèè&=¬ÜèÐèÐèèèè&:ÜèèèÐèèÜè&8l&7ÜèèèÜÜôÄÄèÄ&4vû¦Ö&3L¦õ&4Tüà†‹ñð†üè†üð†üÎþ&)—ü&*>–ð&1àèèèèÄ&/@&.˜Üè&,Ðè&+øÄèÄ&*Bû¦Ö&)¦õ&* üà†‹ñð†üè†üð†üÎþø& ¬„&$ô—ü&&z–ð&(dÜèÜèèè&&~û¦Ö&%¦õ&& ކøðà†‹ñð†üè†üð†üÎþ& ¸—ü&">–ð&$ˆÜÜÄÜÐ&"Bû¦Ö& Ȧõ&!ÐŽ†øðà†‹ñð†üè†üð†üÎþøö†üò„†üüö†üö†üö†üâ„–ú‚ú‚ú‚ú‚üüö†üꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüö†üö†üö†üö†üö†ü&0„¦—ü&š–ð&ÜèèÜèÜèèÄèèè&žû¦Ö&”¦õ&|üè†üð†üð†üð†üïßþö‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüú‚üü&„ž—ü&N–ð&¨èèèè&Rû¦Ö&d¦õ&0üè†üð†üð†üÎþö‚ú‚ú‚ú‚ú‚ú‚üü&d„–—ü&v–ð&`Üèèèèè&zû¦Ö&¨¦õ½üè†üð†üïßþö‚ú‚ú‚ú‚üüö†üö†ü&˜„–—ü&ª–ð&”Üèèèèè&®û¦Ö&ܦõ½üè†üð†üïßþö‚ú‚ú‚ú‚üüú‚üüò„†üüò„†üüö†üö†üö†üö†üò„†üüö†üö†üö†üò„†üüò„†üüò„†üüò„†üüú‚üüö†ü! 4„š—ü&–& Rüõ›& ‹ñð†üð†üè†üïßþ&*& Ø& ÐÜ& Èè&¨Üè&"û¾ò‚ò‚&&–&Büõ›&ðüð†üð†üè†üïßþ&2&È&ÐÜ&¸Ü&°Üè&*û¾ò‚ò‚%ûª–&füõ›µ‹ñð†üð†üïßþ%û¶%ÿÔèèèÜèÜèèÄèèèèÜèô%û®û²ò‚%ô.–%úúüõ›µüð†üð†üïßþ%ô:%úhèèèÐèèèèÐèèÄèèÜÜèèÜÜèÜèô%ô2û²ò‚%êž–%óbüõ›%ôüð†üð†üè†üïßþ%êª%òè%òX%ñ˜èÄÜ%ðÜ%îøÜèè%íÀèÄÜôÜè%ë°è%ê¢û²ò‚%áž–%éÒüõ›%ê€üð†üð†üè†üïßþ%áª%éX%èÈ%èÜÄè%æˆÜ%åPÜèè%äÜÐèôÄè%á¢û²ò‚%Ý–%àÒüõ›%á€üð†üð†üè†üïßþ%Ý%àèèèÜèèÐôÜè%Ý û²ò‚%ÕΖ%Ü:üõ›%Üèüð†üð†üè†üïßþ%ÕÚ%ÛÀ%Û0ÐÜ%ÙøÜ%ØðÜèè%׸Ü%Öàè%ÕÒû²ò‚%ÑÊ–%Õüõ›½üð†üè†üïßþ%ÑÖ%Ô\èèèèÐôÜè%ÑÎû²ò‚%ÇÞ–%ÐÒüõ›%Ѭüè†üð†üð†üè†üïßþ%Çê%ÐX%ÏÈ%ÏèÄÜ%͈Üè%ÌPÜèè%ËèÄÜôÜè%Éè%Çâû¾ò‚ò‚%¾‚–%Ææüõ›%ÇÀüè†üð†üð†üè†üïßþ%¾Ž%Æl%ÅÜ%ÅÜÄè%ÜÜÜ%ÂLÜèè%ÁÜÐèôÄè%¾†û¾ò‚ò‚%¹F–%½Šüõ›%¾düè†üð†üð†üè†üïßþ%¹R%¼ÈèèèèÜèèèÐôÜè%¹Jû¾ò‚ò‚%±²–%¸Nüõ›%¹(üè†üð†üð†üè†üïßþ%±¾%·Ô%·DÐÜ%¶ ÜÜ%´ìÜèè%³´Ü%²Üè%±¶û¾ò‚ò‚%¬’–%°Öüõ›%±„üð†üð†üè†üïßþ%¬ž%°èèèèÜèèèÐôÜè%¬–û¾ò‚ò‚%¡V–%«âüõ›µüð†üð†üïßþ%¡b%«PèÜèÜèèèèÄÄÜÜèèÄÐÐèôÐÐè%¤ÀèèÜèèèÜÜôÜèè%¡Zû²ò‚%6–% Òüõ›§üð†üïßþ%B%ŸøèèèèèÄôÜè%:û¦%˜ –%œ–üõ›µüð†üè†üÖþ%˜%›ìÄèèè%š<èÄ%™è%˜û¦%“Ζ%—jüõ›µüð†üè†üÖþ%“Ú%–ØèèèÐÜÜ%”Èè%“Òû¦%V–%“Jüõ›§üè†üÖþ%b%’ˆèèèÜôÜè%Zû¦%Œš–%¦üõ›½üð†üè†üïßþ%Œ¦%,ÐÐÐÜè%Œžû²ò‚%„²–%‹Þüõ›%Œ|üð†üð†üè†üÖþ%„¾%‹4èÜè%‰´è%ˆôè%ˆè%‡,èèè%…”èô%„¶û¦%t.–%ƒ‚üõ›%„”üè†üð†üè†üð†üð†üð†üïßþ%t:%ƒÄèèè%Xèèèè%€èèèè%~¸èèèèÄèèèèÜÄè%{èèèè%yÀèèèèÄèèèèÜÄèèè%uèèÜÐô%t2û¾ò‚ò‚%iÖ–%srüõ›%tüð†üð†üè†üÖþ%iâ%r°èÐèèèèèèèÄèèèÜèèÐèèèÜôÐèèèÜôÜôÜèÄôÜè%iÚû¦%d–%i6üõ›µüð†üè†üÖþ%dÎ%htèèèèÜôÜè%fèèè%dÆû¦%`Ò–%cöüõ›%d¤üð†üð†üè†üïßþ%`Þ%cLèèèèÜèèè%`Öû²ò‚%Zž˜%\¼¹ú®%^T%_̬þ–’%_È%^Lôø%_ª’Â%^ø°þ–’%^%]x¸%] ›ÖþÔŽî%ZÊ%\Züõ›Öþ%Zª%[àÜ%Z¢û¦%T‚–%ZFüõ›Öþ%TŽ%YÌèÄè%X4èèÄÄèè%UôÜèè%T†û¦%Kš–%Sþüõ›§üè†üÖþ%K¦%Rô%Q¼ÜÄèèèÐÜÜèè%N,ÄèèôÜôÜè%Kžû¦%D&–%JÚüõ›µ‹ñð†üè†üÖþ%D2%JèèèèèÐÜÜèè%FÐÄèèôÜôÜè%D*û²ò‚%;>–%CZüõ›%Düè†üð†üð†üïßþ%;J%Bà%BPÄÜèè%@ˆÜ%?hÐ%>0èÄÄÜ%;Bû²ò‚%3v–%:rüõ›%; üè†üð†üð†üïßþ%3‚%9ø%9hÄèèè%7¸è%6°Ð%5ÀÄÜ%3zû²ò‚%(j–%2Æüõ›µüð†üð†üïßþ%(v%2Äèèè%0„%/ÄÜÄÐè%-T%,Ä%,Ü%+,Ðè%(nû²ò‚%þ–%'ªüõ›µ‹ñð†üð†üïßþ% %&èèèèÄÜèÄèèè%#¸ÐÐèÄÄÜèèÄÐ%°%ðÐè%ˆÜÜÜÄÐè%è%(èèèÄÜèÄè%pÐÜÄÜèÐÐèÄôÜè%û²ò‚$ãf–%Úüõ›%àüè†üè†üè†üð†üð†üïßþ$ãr%`Äèèè%°èèèèèèèèÄ% (èèèÜÜ% x% èèèèÜÐèèèèèèÜèÜÜèèÐèÜôÐèèèèèÜèÜÜèèÐèÜôÐèèè%èôÜèô$ÿ¨Äèèèè$ý˜ÐÜ$üÐÜ$ú°Ü$ùÀÜèèÜ$ø@ÜÄèèèèÜôÐÐè$ôàèèÄÜèèÜèèÜÐèôÐÐèÄÄÜèè$î€èè$í`$ìÐÄèèè$ë Ð$êÐÄÐ$è Ü$çèÜÜ$å€$ä$ãjû$ãôò‚ò‚ò‚$Ð2–$â¶üõ›µüð†üð†üïßþ$Ð>$áôèÐèèèèèÐÜèÜèèèÄèèèÄ$Ü´Äèèè$ÛÐ$ÙüÐÄÐ$ØÜ$ÖäèÜÜ$Õd$Ôt$ÓäèèèÜôÜôÜèÄôÜè$Ð6û²ò‚$Åv–$Ïrüõ›µ‹ñð†üð†üïßþ$Å‚$Îø$Îhè$Í`èÜÜÄè$ËPèèè$Ê0èôÜèô$Ȱ$È èèèÜôÜôÜè$Åzû²ò‚$º.–$ÄŠüõ›$ÅHüà†‹ñð†üð†üïßþ$º:$Ä$Àè$ÂxèÜÜ$Á(èÜ$À èèè$¿èôÜèô$½€$¼ðèèèÜôÜôÜè$º2û¾ò‚ò‚$¯*–$¹nüõ›µ‹ñð†üð†üïßþ$¯6$¸ô$¸dè$·\èÜÜ$¶ Ü$µèèè$³äèôÜèô$²d$±ÔèèèÜôÜôÜè$¯.û²ò‚$£Ê–$®>üõ›$®üüà†‹ñð†üð†üïßþ$£Ö$­Ä$­4è$¬,èÜÜ$ªÜÜè$©¼èèè$¨œèôÜèô$§$¦ŒèèèÜôÜôÜè$£Îû¾ò‚ò‚$‘þ–$¢Òüõ›$£Œ‹ñð†üð†üÓ˜ê„øÔþ$’ $¢@èè$ ðèèÜèÐèèèèÜÐèô$0èÜèÄÜ$šØèÜÜÄè$˜Èèèè$—¨èôÜèô$–($•˜èèèÜôÜôÜèÄèèè$’û²ò‚$~æ–$Úüõ›$‘Ðüà†‹ñð†üð†üÓ˜ê„øÔþ$~ò$Hèè$ŽøèèèÜèÄèèèèèÜÐèô$ŠÀèÜè$‰ˆÜè$ˆ èÜÜ$†ÐèÜ$…Èèèè$„¨èôÜèô$ƒ($‚˜èèèÜôÜôÜèÄèèè$~êû¾ò‚ò‚$yâ–$~&üõ›µ‹ñð†üè†üÖþ$yî$}|ÜÐè${´èèèèÜô$yæû²ò‚$tR–$xöüõ›$y´üà†‹ñð†üè†üÖþ$t^$xLÜèÜè$vlèèèèèÜô$tVû¾ò‚ò‚$gN–$sZüõ›$t4üð†üè†üð†üè†üïßþ$gZ$rÈèèèè$qxèèèèÄè$o8ÐÜ$m ÐÜ$lPÐÄÐ$j@Üèèè$hØôÜè$gRû¾ò‚ò‚$[æ–$f*üõ›$g üð†üð†üè†üð†üè†üïßþ$[ò$e˜èèèè$dHèèèèÄè$bÐÜ$`pÐÜ$_ ÜÜ$]èÜèèè$[êû$\tò‚ò‚ò‚$J2–$Zîüõ›$[Èüð†üè†üð†üè†üïßþ$J>$ZÄèÜèèÄèÄÜ$VlÄèÜèèÄèÄÜ$RôÐÄÐ$PlÐÄèèèèÄè$MœèèèèÄèÄôÜè$J6û¾ò‚ò‚$:–$Iüõ›$Jüð†üð†üè†üð†üè†üïßþ$:&$H4ÄèÜèèÄèÄÜ$DŒÄèÜèèÄèÄÜ$AÜÜ$?dÐÄèèèèÄè$<”èèèèÄè$:û$:¨ò‚ò‚ò‚$†–$8êüõ›$9üüè†üð†üè†üð†üð†üè†üÖþ$’$8(èèèèèèèèèÐèèèèèèèÐèèèèèèèèè$2(èèèÜÐÜèèèÜÐèèèÐèÄè$,¸èèèÜÐÜèèèÜÐèèèÐèÄèÄèÄèôÜèô$%€ÜèèèèÜèèèÜè$"€èèÜèèèèÜèèÐèèè$ðèÜÐô$(èèèÐÜ$è$èèè$Šû¾ò‚ò‚$ j–$æüõ›µüð†üè†üÖþ$ v$$èÐèèèèèèèÄèèèÜèè$Ô$DèèèÜô$”$èèèÜôÜôÜèÄôÜè$ nû¦#é*–$ üõ›$ Lüè†üð†üè†üè†üð†üð†üè†üÖþ#é6$ LèèèèèèèèèèÐèèèèèèèèÐèèèèèèèèè$ìèèèÜÐèÜèèèÜÐèèèÐèÄè#þLèèèÜÐèÜèèèÜÐèèèÐèÄèÄèÄèôÜèô#öäèÜèèèèÜèèèÜè#ó´èèèÜèèèèÜèèÐèèè#ïôèÜÐô#î,èèèÄÜÜ#ë¼è#êÌèèè#é.û#é¸ò‚ò‚ò‚#Üš–#è^üõ›#èüüð†üð†üè†üÖþ#ܦ#çœèÐèèèèèèèèÄèèèÜèè#ã#âŒèèèÜô#àÜ#àLèèèÜôÜôÜèÄôÜè#Üžû²ò‚#Í"–#Üüõ›§üè†üÖþ#Í.#ÛlèÄè#ÙìèèÄÜ#Ø$èÄèÜÜ#ÕäÜôÄÜ#Ô4èèôÜèèô#Ò<ÜôÜ#мÄèèôÜôÜèÄôÜè#Í&û¦#¼Ö–#Ìrüõ›µüð†üè†üÖþ#¼â#ËÈè#ËèÜ#ÊèèÄÜ#È8èÄèÜÜ#ÅøÜô#ÅÜÜÄèèôÜèèô#ÂÜôÜ#ÀˆÄèèôÜôÜèÄôÜè#¼Úû²ò‚#°¶–#»êüõ›#¼˜‹ñð†üè†üè†üÖþ#°Â#»pè#º€ÜÐèÜÜ#¸XÜ#·8Ð#¶ÐÜèÄèèôÄè#² ÜôÜèèô#°ºû¾ò‚ò‚#£ò–#¯žüõ›#°ˆüà†‹ñð†üè†üè†üÖþ#£þ#¯$è#®4ÜÐèÜÜ#¬ Üè#ªÔÐ#©„ÐÜèèÄèèôÄè#¥ôÜôÜèèô#£öû#¤€ò‚ò‚ò‚#˜ú–#£nüõ›§üè†üÖþ#™#¢ÜÄèèèÜÜÄÜôÜ#Ÿ4èèè#äÄ#œ”ÄèèôÜôÜèÄôÜè#˜þû¦#Ž–#˜Jüõ›µüð†üè†üÖþ#š#—¸èÄèèèÜÜÄÜôÜ#“àèèè#’Ä#‘@ÄèèôÜôÜèÄôÜè#’û²ò‚#v–# üõ›§üè†üÖþ#v#Œ0èÜ#‹(Ü#ŠPèÜèÄÄÄÜ#‡#†HèèèèÜÜÄÜôÄÜ#øèÜ#€ðÜÜèÄèôÜèôÄèôÜèèô#| ÜôÜèèô#zÀÜô#y ÄèèôÜôÜèÄôÜè#v û¦#]2–#uVüõ›µüð†üè†üÖþ#]>#t|èÜ#s\ÜÜÄèÜèÄÄÄÜ#o #nLèèèèèÜÜÄÜô#kdÜÜ#i„èÜ#hdÜÜèèÄèôÜèôÄèôÜèèô#cäÜôÜèèô#bÜô#`äÄèèôÜôÜèÄôÜè#]6û²ò‚#YÒ–#\®üõ›§üè†üÖþ#YÞ#\èèèÐÜè#YÖû¦#Uþ–#Y"üõ›µüð†üè†üÖþ#V #XèèèèÐÜè#Vû²ò‚#FÊ–#U^üõ›µüð†üè†üÖþ#FÖ#TœèèèÐ#Sèèè#QlèèèÐ#OÔèèè#N´#N$ÜÄ#Ltèèè#KTÜ#J4è#ItÜÄÄÜÄ#FÎû¦#7 –#Eþüõ›#Fœüð†üð†üè†üÖþ#7#E<èèèÐ#C¤èèè#B èèèÐ#@tèèè#?T#>ÄÜÜÜ#<üèèè#;ÜÜ#:¼è#9üÜÜÜÄÜÜÜ#7û²ò‚#+–#6jüõ›µüð†üè†üÖþ#+*#5Øèèè#4 èèèÐ#3 èèèÐÜ#0Èèèè#/¨Ü#.ˆè#-ÈÜÄÄÜÄ#+"û¦#v–#*Rüõ›#*ðüð†üð†üè†üÖþ#‚#)Àèèè#(ˆèèèÐ#'èèèÄÜÜ#$hèèè##HÜ#"(è#!hÜÜÜÄÜÜÜ#zû²ò‚#ö–#òüõ›§üè†üÖþ##èèèÐè#PèèèÜôÄÜè#°èôÄè#úû¦#–#Füõ›µüð†üè†üÖþ##TèèèÐè#¤èèèèÜôÄÜè#ÔèôÄè#û²ò‚#‚–#~üõ›§üè†üÖþ#Ž# ¤è# äÐÜ# ¬ÐèèÄèôÜèôÜÜôÄÜèè#DèôÄèÄôÜè#†û¦"ùv–#Òüõ›µüð†üè†üÖþ"ù‚#øè#8ÐÜ#èÐèèèÄèôÜèôÜÜôÄÜèè"üPèôÄèÄôÜè"ùzû²ò‚"ÙN–"øòüõ›§üè†üÖþ"ÙZ"÷èèÄèèè"õÀèÄèèè"óøèèè"ò`è"ñˆ"ðøèÐèèèèèèèÜÄèèè"í8è"ì`"ëÐèÐèèèèèèÐèèèÄèôÄÜÜè"æèÐÄèôÄÜÜè"ã`èÐÜèôÄÜ"àØè"߈èèÄè"ÝÄèèô"Û°ôÜèÄôÜè"ÙRû¦"¤r–"Øžüõ›µüð†üè†üÖþ"¤~"×”èÄèèèè"Õ<èÄèèèè"ÓDèèè"Ѭè"мÄèèè"Ï è"ÎÐÜÄÄÜÜ"Êtè"É„èèèÐèÄÄÜÜÜè"ŬÐÜ"ÄtèÐÄèèè"ÂLè"ÁDÄèèè"¿”è"¾ŒÜÐ"½TÄÜÜ"»,Äèèè"¹”è"¸ŒÜÜÜÜÄÄÜÜÄèÜèÄèèèèÄèôÄÜÜè"°ôèÐÄèôÄÜÜè"­ÄèÐÜèôÄÜ"«<è"©ìèèèÄè"§ÄÄèèô"¥äôÜè"¤vû²ò‚"–"£Âüõ›µüð†üè†üÖþ"""£0èèèèèèèèèÄèèèèèèÐèèèèèÜèèôÄèèô"œèèèèÄèèÄè"˜Èèèèè"—`èèèèÐ"•°"”¨"“¸Ü"’°"‘ÀÄèèôÜôÜè"û²ò‚"xn–"Ž:üõ›"Žèüè†üð†üè†üÖþ"xz"¨èèèèèèèèèèÄèèèèèèèÐèèèèèèÜèèôÄèèô"…øèèèèÄèèèÄè"‚€èèèè"èèèèÄ"PÐ"~"}(Ü"| "{0ÄèèôÜôÜè"xrû¾ò‚ò‚"b®–"w¢üõ›"xPüè†üð†üè†üÖþ"bº"wèèèèèèèèèÐèèèèÐèèèè"rHèèèèèèèèèÄèèèèÐèèèÄèèÄèèôÄèèô"jàèèÄè"hÐèèèÐÜ"g"fH"eXÄèèôÜôÜè"b²û²ò‚"Jú–"a¶üõ›"b€üð†üè†üð†üè†üÖþ"K"a$ÜèèèèèèèèèÐèèèèèÐèèèèè"[´èèèèèèèèèèÄèèèèèÐèèèèÄèèÄèèôÄèèô"S¼èèèÄè"Q|èèèÄÜÜÄ"N¬"M¼ÄèèôÜôÜè"Jþû¾ò‚ò‚"=z–"Jvüõ›§üè†üÖþ"=†"I´èÐèèèèÐèèèÜôÜè"E”èèÄè"C„èèèÐÜ"A¼"@ü"@ ÄèèôÜôÜè"=~û¦"/–"<Êüõ›µüð†üè†üÖþ"/"<8ÐèÐèèèèÐèèèÜôÜè"7¸èèèÄè"5xèèèÄÜÜÄ"2¨"1¸ÄèèôÜôÜè"/û²ò‚"–".nüõ›µüð†üè†üÖþ""-Üèèè",tÄèèèÜÜÄÜôÄÜ"(„Üèèèô"'èèè"%lèèèÜèè""œÄèèôÜôÜèÄôÜè"û¦" ª–"6üõ›"Ôüð†üð†üè†üÖþ" ¶"¤èèèè" èÄèèèÜÜÄÜô"ÜÜÜ"¤Üèèèô"$èèèè"\èèèèÜèè"\ÄèèôÜôÜèÄôÜè" ®û²ò‚"r–" Þüõ›" Œüð†üð†üè†üïßþ"~" dÄèèèÄ" TèèèÜÜ"¤Üè"„èèèÐ"ÄèèôÜÜÐÜÜèèè"tèôÜôÜè"vû²ò‚!ò–!ÿzüõ›"Düð†üð†üð†üè†üïßþ!ò*!ÿÄèèèèÄè!üèèèÐÜÜÄÜè!ùxèèèèÐ!÷ÈÄèèôÜÜÐÜÜèèè!ô8èôÜôÜè!ò"û¾ò‚ò‚!Ý2–!ñ~üõ›µüð†üè†üÖþ!Ý>!ðìèèÄèèÜèÄèÜè!ít!ìäèèèÜÐèèÜÐÜôÐèèèÄèèô!çtèèèÜèè!å¬è!äÔèô!ãœèèèÜèè!áÔè!àÌÄèèôÜôÜèÄôÜè!Ý6û¦!º‚–!Üfüõ›!Ýüð†üð†üè†üÖþ!ºŽ!Û\ÐÐèè!ÙèèèÄÜÜÄÐèô!ÕD!Ôœèè!Ó¬èèèÐè!ÑäèÜè!ДÐÄèèè!΄èÄÄÜÜÜèÄÄÜÜ!Ê4èÄÐèÄèôÐèèèèÄèèô!Å<èèèèÜèè!ÃDè!Âlèô!Á4èèèèÜèè!¿<è!¾4ÄèèôÜôÜèÄôÜè!º†û²ò‚!³–!¹¶üõ›!ºdüè†üð†üè†üÖþ!³&!¹$è!·ìÄÜ!µôÜ!´ìÜèèè!³û²ò‚!«–!²"üõ›!²ìüð†üè†üð†üè†üÖþ!«!±è!°XÄÜÜ!®0ÜÜ!¬øÜèèè!«û¾ò‚ò‚!z–!ªüõ›!ªðüð†üè†üð†üè†üïßþ!†!©„èèèè!¨4èèèèÄè!¥ôÐÐÜ!£üÐÜ!¢ÄÜ!¡¤ÐÜ! lÜ!ŸdÜèèè!~û¾ò‚ò‚!–!œVüõ›!Lüð†üð†üè†üð†üè†üïßþ!!›Äèèèè!štèèèèÄè!˜4ÐÐÜ!–<ÐÜ!”ìÜÜ!“œÐÜ!’LÜÜ!‘Üèèè!û! ò‚ò‚ò‚!†v–!Žüõ›!Žôüð†üè†üð†üè†üïßþ!†‚! !ŒàÐÐÐÜ!ЏÐÜ!‰hÐÜ!ˆèèè!†zû¾ò‚ò‚!}–!…Rüõ›!†Hüð†üð†üè†üð†üè†üïßþ!}!„Ø!„ÐÐÐÜ!ðÄÜÜ!€XÄÜÜ!~¨èèè!} û!}”ò‚ò‚ò‚!s–!|üõ›!|èüð†üè†üð†üè†üïßþ!s&!{|èèèè!yäÐ!xÄÐÜ!wDÐÐÜ!u¬Ü!t¤èèè!sû¾ò‚ò‚!hZ–!qöüõ›!rìüð†üð†üè†üð†üè†üïßþ!hf!qdèèèè!oÌÐ!n¬ÄÜÜ!läÐÐÜ!k4ÜÜ!iüèèè!h^û!hèò‚ò‚ò‚![–!gbüõ›!h<üð†üè†üð†üè†üïßþ![!fÐèèèè!e€èèèèÄè!c@Ð!aðÐÐÜ!`XÜ!_8ÐÐÜ!] Ü!\˜èèè![û¾ò‚ò‚!Lî–!Yêüõ›!Zàüð†üð†üè†üð†üè†üïßþ!Lú!YXèèèè!XèèèèÄè!UÈÐ!TxÐÐÜ!RÈÜÜ!QxÐÐÜ!OÈÜÜ!Nèèè!Lòû!M|ò‚ò‚ò‚!?>–!Ljüõ›§üè†üÖþ!?J!Kèèè!Iøè!H¨èèèÄèèèÐÄÜ!E0ÐèôÄÜ!C8Ðèô!A@ÜèèÄèô!?Bû¦!0ê–!>Žüõ›µüð†üè†üÖþ!0ö!=<èèè!<è!:ÌèèèÄèèèÐÄÜÜ!7<Ðèô!6ÜÜÄÐèô!3ÜèèÄèô!0îû²ò‚!#:–!0füõ›§üè†üÖþ!#F!/èèè!-ôè!,¤èèèÄèèèÐÄÜ!),ÐèôÄÜ!'4Ðèô!%<ÜèèÄèô!#>û¦!æ–!"Šüõ›µüð†üè†üÖþ!ò!!8èèè! è!ÈèèèÄèèèÐÄÜÜ!8Ðèô!ÜÜÄÐèô!ÜèèÄèô!êû²ò‚!–!úüõ›!”‹‹†øèΆ‹‹†øèÖþ!!hèÜè!û¦!¦–ð!PÜèèèèèè!XèÁû¦Ö! €¦õ!L¡Ý’ìð†üè†üð†üÎþö‚ú‚ú‚ú‚ú‚üüö†üö†üö†üò„†üüò„†üüö†üö†üö†üö†üö†üö†üö†üö†üö†üö†üö†üò†ƒùò†ƒùsì¡‘! èÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ ù$Œþ’âÞŽØŽ‡ÑŽ‡×ŽÞŽÞŽÞŽØŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑއÁއ‹þÈŽ‡ÑއÁއ‹þÀŽ‡×ŽtD ó¾ ôØè 󨜦õ™‹ñïßþ ò ó8è òœ¦õ™‹ñïßþ ð\ ñ°è ðdœ¦õ§‹ñð†üïßþ î¸ ð è îÀœ¦õ§‹ñð†üïßþ íˆ î€ íœ¦õ™üïßþ ìX íP ì`œ¦õ™üïßþ êh ëØÐ êpœ¦õ™üïßþ æ0 éèè éÄè çÀ æ8 渦õ§¡Ý’ìð†üÎþ²ò‚ò‚ áT å€ÐÐèèèèèè âøèè á\ áܦõ§üð†üÎþ²ò‚ò‚ ×t à|èèèèèèèèèÐèÜèÄèèôÄèÄè ÚÜèèô Ù¼è ×| ×ü¦õ Ù¡Ý’ìÖ†þ’òþìð†üð†üð†üÎþ²ò‚ò‚ Ðø Ö¸èèèèèÄè ÔHèè Óè Ñ Ñ€¦õ Ò\¡Ý’ìð†üà†‹ñð†üÎþ²ò‚ò‚ É Ð<èèèèèÄè ÍÌèè ÌÜèèèô ËŒè ɘ ʦõ ÊØ¡Ý’ìà†‹ñð†üÎþ²ò‚ò‚ Åè É(èèè Çðè Åð Æp¦õ Ç<¡Ý’ìè†üð†üð†üÎþ²ò‚ò‚ Áˆ ÅPÜÜÜÄÜÐ Á ¦õ Ãüà†‹ñð†üð†üð†üÎþ²ò‚ò‚ ¶˜ ÀÀÜèÐèÜèÐèèèè ½èèèèÐèèèÐèèèôÄè ¹ˆèÄÄ ¶  · ¦õ ¸üà†‹ñð†üð†üð†üÎþ²ò‚ò‚ ªè µ¬ÜèÐèÜèÐèèèè ²|èèèèÐèèèÄè ¯|è ®t ­ÌèÄÄ ªð «p¦õ ¬<‹ñè†üð†üð†üÎþ²ò‚ò‚ § ªPèèèèÄ §˜ ¨¦õ™üÎþ²ò‚ò‚ ¥„ §(è ¥Œ ¦ ¦õ§üð†üïßþ²ò‚ò‚ £X ¥è £` £à¦õ§‹ñð†üïßþ²ò‚ò‚ ¡ ¢ðÐ ¡ ¡”¦õ§üð†üïßþ²ò‚ò‚ žÔ  tè žÜ Ÿ\¦õ™üïßþ²ò‚ò‚ œ´ ž<è œ¼ <¦õ™üïßþ²ò‚ò‚ š œÐè š$ š¤¦õ™üïßþ²ò‚ò‚ —œ ™„Ðè —¤ ˜$¦õ™üïßþ²ò‚ò‚ •| —è •„ –¦õ™üïßþ²ò‚ò‚ “\ ”äè “d “ä¦õ™üïßþ²ò‚ò‚ ‘ ’Äè ‘ ‘ ¦õ«üÝ•†øÌþ²ò‚ò‚ Žœ €è ޤ $¦õ èüÁ•†Œò„øîÌþ²ò‚ò‚ ŒÄ Ž4 ŒÌ L¦õ™üïßþ²ò‚ò‚ Šì Œ\ Šô ‹t¦õ™üïßþ²ò‚ò‚ ˆT Š$Ð ˆ\ ˆÜ¦õ™üïßþ²ò‚ò‚ ƒ ‡ìèèèÐèèÜè …”èÄèô ƒ ƒŒ¦õµüð†üð†üÎþ²ò‚ò‚ €° ‚lèè €¸ 8¦õ§üð†üÎþ²ò‚ò‚ o  €,è lÜèÐèÜ }\èèÜè {ÄèèèèÐèèèèèÐ x| w¼èèèô v„èèÜè tÔèèèèôÄèè r|è q¤è o¨ p(¦õ³þð†üð†üÎþ²ò‚ò‚ m˜ o8è m  n ¦õ™üïßþ²ò‚ò‚ _L lìèèÜè k„èÜè iìèèèèÐÐèèèè fì f,èèèôÄèè dèèÜèÜè b è a4è _T _Ô¦õ§þþð†üÎþ²ò‚ò‚ ], ^„ ]4 ]´¦õ™üÎþ²ò‚ò‚ [$ \| [, [¬¦õ™üÎþ²ò‚ò‚ X  Z¼Ð X¨ Y(¦õ§üð†üïßþ²ò‚ò‚ Uì X Ð Uô Vt¦õ§üð†üïßþ²ò‚ò‚ QŒ U`Ð T@è Shè Q” R¦õ·üð†üß•þÌþ²ò‚ò‚ M QÐ OÈè Nðè M Mœ¦õ·üð†üß•þÌþ²ò‚ò‚ K L¬è K K¦õ§üð†üïßþ²ò‚ò‚ HÜ J è Hä Id¦õ§‹ñð†üïßþ²ò‚ò‚ F HtÐ F˜ G¦õ§üð†üïßþ²ò‚ò‚ D$ F(Ðè D, D¬¦õ§üð†üïßþ²ò‚ò‚ 9Ø BìèÐèèÐèèÐèèÄèô ? >„ÐèèèèôÄè ;üèè 9à :`¦õ ;üð†üð†üð†üïßþ²ò‚ò‚ /È 8˜èèÐèèÐèè 5àèèèÄèèèÐèèÐ 2€èô 1 /Ð 0P¦õ 1üà†‹ñð†üïßþ²ò‚ò‚ ,ô /Hèèèè ,ü -|¦õ§‹ñð†üïßþ²ò‚ò‚ $ +°èèÐèèÐèèÄèôÄèÄÐÐÐè %È $ $˜¦õµüð†üð†üïßþ²ò‚ò‚ Ô #èèÐèèÐèè HèèèÄèèèÐèèÐ èèôÐèÜÜô Ü \¦õ üð†üð†üð†üïßþ²ò‚ò‚ È <ÐÜÄÜÐ Ð P¦õ  üð†üð†üð†üïßþ²ò‚ò‚ ” `Ð œ ¦õ§üð†üÎþ²ò‚ò‚ ( ,Ðè 0 °¦õ§üð†üïßþ²ò‚ò‚ Œ ØèÐèÐèè Èè ¨èÐÐÄ PÐèèèèô ˆè °èè ” ¦õ Ðüð†üð†üð†üïßþ²ò‚ò‚ L ¬èÐèè ,è T Ô¦õ ”üà†‹ñð†üïßþ²ò‚ò‚þx Ìèèèèþ€ÿ¦õ§‹ñð†üïßþ²ò‚ò‚úHý˜èÐèèüèúPúЦõµüð†üð†üïßþ²ò‚ò‚ïôù8èÐèè÷¸èöhèÐèÐèèô(ÐèèÐòxèÜÜôïüð|¦õñ8üð†üð†üð†üïßþ²ò‚ò‚ëèï\ÐÜÄÜÐëðìp¦õí,üð†üð†üð†üïßþ²ò‚ò‚é0ë€Ðèèé8鸦õµüð†üð†üïßþ²ò‚ò‚æèÈèèÐèæ昦õçpüð†üð†üð†üð†üïßþ²ò‚ò‚ãå¨èÐèã$㤦õä€üà†‹ñð†üð†üïßþ²ò‚ò‚ßüâœèèèèèàà„¦õµ‹ñð†üð†üïßþ²ò‚ò‚Ýß”èÐèÝ Ý ¦õÞ\üð†üð†üð†üïßþ²ò‚ò‚Ø(ܰèÐÄÛèÚXèèèôØ0ذ¦õµüð†üð†üïßþ²ò‚ò‚Õ\×ÀèèèèÕdÕä¦õÖ üð†üð†üð†üÎþ²ò‚ò‚ÒÔÄÐèèÒÒœ¦õÓhþ’òþìÚ†þþð†üïßþ²ò‚ò‚Í ѬèÐÐtÏäèÏ$èèèôÍ(ͨ¦õ§üð†üïßþ²ò‚ò‚Ê(̈˘èÊ0ʰ¦õ™üÎþ²ò‚ò‚ĈÉÀèÐȈÄèèèèÆÀèèèôÄŦõµüð†üð†üïßþ²ò‚ò‚Á„Ä ÐèèèÁŒ ¦õÂÈüð†üð†üð†üïßþ²ò‚ò‚² ÀÄÜèèÄèÜèÐèèèè½ÜèèÐèÐèÐèèèè¹tèèÐèô·Ü·ÐèèèèôÄè´|èè²(²¨¦õ³œüð†üð†üð†üð†üð†üïßþ²ò‚ò‚®€±ˆèèèèè讈¯¦õ°üà†‹ñð†üð†üð†üïßþ²ò‚ò‚«®èèèèèè««œ¦õ¬X‹ñð†üð†üð†üïßþ²ò‚ò‚‰8©ˆè¨ÈÜèÐèÐèèèèèÄ¥PèÄèèèèèèè袀¡èÐèèèÜèžðèèèèÄœøÜèÐèÄèÄèèèèèèèèĘHèèèèèÄ–PèèèèÄ”@èèèèô’è‘ÐèÐèôhèÄÐèÐÐè°ÐèèèôÄè‹Xè‰@‰À¦õŠ˜üð†üð†üð†üð†üïßþ²ò‚ò‚…\ˆÐÜèèÄèèè…d…ä¦õ† üð†üð†üð†üïßþ²ò‚ò‚„ôèÜèèÄèè蜦õ‚”üà†‹ñð†üð†üð†üïßþ²ò‚ò‚}€¬ÜèèÄèèè} } ¦õ~\‹ñð†üð†üð†üïßþ²ò‚ò‚x¨|°èÜèèÄèèèx°y0¦õz@üð†üð†üÔ†Žò„øðð†üïßþ²ò‚ò‚Twèv\ÜèÐèÐèèèèèÄräèÄèèèèèèèèpn¬èÐèèèÜèl„èèèèÄjŒÜèÐèÄèÄèèèèèèèèÄeÜèèèèèÄcäèèèèÄaÔèèèèô`$ÐèÐèÐè]ÌèÐèôÄèÄÐèÐÐèYÄèèèôÐÐèèèôÄèVdèT T ¦õU´üð†üà†Žþðð†üð†üð†üïßþ²ò‚ò‚OŒS€ÜÜÄÜÐèèO”P¦õQüð†üð†üð†üð†üð†üïßþ²ò‚ò‚HˆOÄèÐèèèÐÐèèèôÄèJÈèHI¦õIìþþð†üà†‹ñð†üïßþ²ò‚ò‚BGÀèèèèÄèèèèÄèèèèCèBBœ¦õ§üð†üÎþ²ò‚ò‚@<A”@D@Ħõ™üïßþ²ò‚ò‚;ä?Ô?D>œèô=|;윆ˆ¦÷þ™üÎþø9è„=¸ˆ¦÷þ§Ž†øðð†üïßþ:¤‚—ü;ª–ð<¤èè;®û¦Ö:¸¦÷þ§‹‹†øèð†üïßþ9ôˆ¦÷þ§üð†üïßþø„<„΀ˆ¦÷þ§Ž9ÀÏ,à‘9|†ØŽÞŽÞŽÞŽÞŽà$3Ò8H7 èÄèè5¨èÐèèèè3¼2ð·2ø1œ2 èÜèÖàòúþ³0¨ˆ¦õµ‹‹†øèð†üð†üÎþøö†üĆ”‰‹†øìò„þö/„†ˆ¦õ™üïßþø.Ćˆ¦õ¯ü膋ñïßþøò†ƒùàDüþš.¨üö†üö†üö†üö†üö†üö†üö†üö†üò„†üüò†ƒùö†üö†üð†üð†üò†ƒùö†üò†ƒùàdš‘-HÞŽÞŽÞŽÞŽÞŽ°+F+äè+0þ¦ò‚*õþ¦ò‚'¨)$èè'°þ¦ò‚&$&à&,þ¦ò‚#ø%ÔÐ$´ô$þ¦ò‚¦#äò‚‚ü#¸vþ³#ˆˆþö"@„"؈¦õ£ð†üïßþ"Lˆ¦õ™üïßþø!p†ˆ¦õ§‹ñð†üïßþø ̆ˆ¦õ¡üç’Íþøü†ˆ¦õ¯ü膋ñÎþøò†ƒùôüþ঑ÀŒ¦õ§ì†ëßþÌŽŒ¦õ§‹á†ÊþÖŽÞŽÞŽÞŽÞŽÞŽÞŽÆŽ†ØŽØŽ‡ÑŽ‡×ŽØŽ‡à¼âðÜèèÜèèÐÜèèèÜę̀¦õ£ð†üÎþÚšä\èèÄèèè쨦õ™üÎþÚšôLèü¨¦õ™üïßþÚšäP\èèäX¨¦õ”ü俦‘(†ž†øäŽÞŽÞŽ øŽœ\Üè,ú›Ÿüð‚÷ DŽœ Àèèè xú›Ÿüð†ü Žœ èèè Äú›Ÿüð†üÜŽœ Xèèè ú›Ÿüð†ü(Žœ¤èèè\ú›Ÿüð†ütŽœðèèè¨ú›Ÿüð†üÀŽœ<èèèôú›Ÿüð†ü˜ŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ ŽŒ®‰é„òö„ò„øåHÆõÿ„XèèÊþØ«ÊýÌ«Êûèý”ü\ôÖúÜ«Êøøú¤ùlôÖ÷Ô·èÖö˜÷œ÷ Êõt·èÖô8õ<ô¬ÊòäóèèèèÊðÐò¬ÄèèñDôÖï|ð€èÜèÖå6òúþ³ïxüĆ”‰‹†øìò„þöîH†ˆ¦õ£ð†üïßþøìð„í¤ˆ¦õ§üð†üÎþìüˆ¦õ£ð†üïßþøì@†ˆ¦õ£ð†üïßþø놈¦õ£ð†üïßþøêà†ˆ¦õ£ð†üïßþø餄ê<ˆ¦õ£ð†üïßþé°ˆ¦õ™üïßþøèX„鈦õ£ð†üïßþèdˆ¦õ¡üç’ÍþøçĆˆ¦õ™üïßþøç0†ˆ¦õ™üïßþø唄æ<ˆ¦õµ‹‹†øèð†üð†üÎþå ˆ¦õ™‹ñÎþøò†ƒùôüþä¤þÚšâØäâਦõ™üÎþÚšáPâˆáX¨¦õ™‹ñÎþÚšà²á<àŽ¿‰õò‚ò‚ÕþïþÐz‘ßÔИÙ ߀܄ò„Ùœ¬ßÙìþÛVÞ¬èÝìÐèèèÐèÜÐôÊÙÞÛ$Ù®þ³˜ˆ¦õÛüð†üð†üß’Íþøò†ƒùôüþÔh„Ù`Ü„ò„Ôl¬ØøÔ¼þÖ&ØŒÐÜÐÜÜèÖÔ®ÕôÔ~þ³˜ˆ¦õÕàüð†üð†üß’Íþøò†ƒùôüþÐÓÔèèèÒìІÒ\Šþ–ÚÊŠˆ–†øîîò‚ÐVþ³˜ˆ¦õѸüð†üð†üß’Íþøò†ƒùôüþÏb‘Ð@ÏnÐÏJúþ³˜ˆ‰õöò†ƒùôüþÀð†üÎþ†‚—üÌ>–Í‚üõþ΋‹†øèΆ‹‹†øèÖþÌJüû²ò‚Éò–Ë6üõþËЋ‹†øèΆ‹‹†øèÖþÉþüû²ò‚ÇΖÈúüõþÉ”‹‹†øèΆ‹‹†øèÖþÇÚüû¦¾B–Çüõ›¹Ë‚„‰ïÔþ¾NƤÅäÄôèèÃìèÃÜÂ<Á¬ÐèÀt¿„èÜè¾Fû¦»Æ–½Êüõ›‘‹ñÖþ»Ò½8»Êû¦³B–»üõ›½üð†üè†üïßþ³Nºœ¹”èè·äÜÜèܶÜÜè´<èô³Fû²ò‚°¦–²’üõ›½üð†üè†üïßþ°²²èèè°ªû²ò‚­ª–¯öüõ›½üð†üð†üçŠÕþ­¶¯dèèèÜè­®û¦©^–¬úüõ›½üð†üð†üçŠÕþ©j¬hÜÐÄÐÐÜè©bû¦˜f˜¤ì­ú¥Î¦”ø˜¨Dˆ˜©’ꖒ꧈‚ˆ––’ê¦ü‚ˆ–’êêØü–üêê¥È¦dþøþøþ¥$›­üð†üð†üÖþàŠ„î <„­ú¡&¡ìø˜£pˆ˜þ˜¤\’ꖒꢴ‚ˆ––’ê¢T‚ˆ’êØü–üêê¡ ¡¼þøþøþ |›­üð†üð†üÖþàŠ„î˜’Ÿzüõ›µ‹ñð†üè†üÖþ˜ržXè蜨èÜèÜšøÜè™`èô˜jû²ò‚ˆ¾˜”·ú•†–Lø˜—üˆ’—@‚ˆ––’ê–´‚ˆ–’êêØü–üêê•€–þöøþ”Ü›­üð‚ð†üÖþÖ”ö„îÔ„·ú‘Ò’˜ø˜”ˆ’“`‚ˆ––’ê“‚ˆ’êØü–üêê‘Ì’hþöøþ‘(›­üð‚ð†üÖþÖ”ö„îˆêüõ›½‹ñè†üè†üÖþˆÊŽàèè0èÜèЋPЉÐèôˆÂû¾ò‚ò‚‡–ðˆèèÁû¦Ö†,¦÷þ§‹‹†øèð†üÎþ…T‚ˆ¦÷þ§‹ñð†üÎþ„Hˆ¦÷þ¯¡Ýþ膋ñÎþøè†ƒùò†ƒùôüþt摃tÞŽÞŽÞŽÖŽtü€šøè8耄þ¦ò‚~€ÌèÐè~ˆþ¦ò‚|´~èÐè|¼þ¦ò‚tøxZ|Œ„xRòü||x*þ«{Ôˆ¦õ§ì†ëßþøxÈ„{ˆ¦õ§‹á†Êþz4‚ˆªõµüð†üð†üïÛþ›yt‚ˆªõ§‹ñð†üïÛþ›xÔˆªõ™‹ñïÛþ›Ýꆆöò†ƒùôüþtòx ò‚tÎúþ³wĈþöuH„v¸ˆ¦õwˆ‹ñà†‹ñð†üÎþu삈¦õ§‹ñð†üÎþuTˆ¦õ™‹ñÎþøò†ƒùôüþÄℌþôÕþïþrüò†ƒùôüþrìþ«Œƒùôüþq‚ìþ«ŒƒùôüþÁq<Àòúþ³p”ˆ¦õ§üð†üïßþøo؆ˆ¦õ§üð†üïßþøo(†ˆ¦õ§üð†üïßþønx†ˆ¦õ§üð†üïßþømȆˆ¦õ§üð†üïßþølŒ„m$ˆ¦õ£ð†üïßþl˜ˆ¦õ™üïßþøk@„k舦õ£ð†üïßþkLˆ¦õ¡üç’Íþøj¬†ˆ¦õ™üïßþøj†ˆ¦õ™üïßþøi„†ˆ¦õ™üïßþø°„Ä—üÞV–àüõ›i‹‹šò„ò„øèà@†‹‹hðê„ê„àtc~‘h”cŠhdc‚ìþ³h,ƒ‹†øðò†ƒùc´üþšhüò†ƒùö†üö†üö†üö†üð†üð†üò†ƒùcÔ¡‘gDÞŽØŽ‡ÉއˆÉŽ‡ÑŽ‡d,¥eèd`œ¦õe`à†‹ñ膋ñÎþÉ‘×þïþઑcDÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽàÀ\b]ÀÐèÐèÖZÀ[ÜèèèèÖY$ZXèÜèèÖV˜X¤ÐèÐW$V TlU¸èÐèèÖSx·S€Rœ«ÊQHRLÐQPOôPøÐOüNˆOŒÐèÊLNPM¨ÐèÐèôÖGK”ÐÐèJÐèÐÄHÐG@´F€ÐÐèÜÐÐèCÈÐèÐÄA¸Ð@¼>@èÐèèÐèèÖ;ä=0èÐèèÖ:Ø;|èÊ9Ì:pèÊ8`9dÐèÊ6d7àÐèÜ6l5(6èèèÖà¶1Œ4ð1„ŒþŠþŠ˜Œ–4ŒŒ–†øî4 „Œ–†øî1脎3Ü–†øî2˜3`––†øî24˜¾þ–2`––†øî1Ô„øîÜ„øÞò؆Œ†øòò‚à’úþ³0ˆŒŒò„øè„øôö/H†ˆ¦õ§üð†üÎþø.´†ˆ¦õ™üïßþø.†ˆ¦õ¡üç’Íþø,ð„-ˆˆ¦õ™üïßþ,üˆ¦õ™üïßþø"`„'¼—ü)f–ð,pÐÄÜèÜèèÜè)jû¦Ö'̦õ)Hü( •)0(\„ŒþŠ)(ˆŠþŠþŠŒ‚䄸À„øÌþ"l—ü$–ð'8ÄÄÜèÜèèÜè$û¦Ö"|¦õ#øü"º•#à# „ŒþŠ#Ì#8ŠþŠþŠŒ‚䄸À„øÌþø À„! ˆ¦õµüð†üð†üÎþ ̈¦õ§þþð†üÎþø ,†ˆ¦õ™üïßþø˜†ˆ¦õ™üïßþø@„ôˆ¦õ§üð†üïßþLˆ¦õ§üð†üïßþø¬†ˆ¦õ™üïßþø†ˆ¦õ™üïßþøH„(ˆ¦õ§Žšò„ò„øðð†üïßþø‚—üÒ–ðDèÐèèÁû¦Ö ¦õ§‹‹¸䄌þФŠþŠþŠŒ‚䄸À„øèð†üïßþTˆ¦õ§üð†üïßþø´†ˆ¦õ™üÎþøâ „ö¤ˆ¦õ§Ž¨ò„ò„÷P›‘lÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ÷œ’èèèèÖ ÐèÊü èÊ”ÐèÊ÷’|ò‚ò‚÷núþ³ ¼ˆŒŒò„øè„øôö †ˆ¦õ¡üç’Íþø x†ˆ¦õ™üïßþø 䆈¦õ™üïßþø 솈¦õ Ôüð†üð†ü膋ñÎþøÌ†ƒ‹˜ê„øð 膃‹þŠþŠŒ‚䄸à H†ƒ‹þŠþŠŒ‚䄸ਆƒ‹þŠþŠŒ‚䄸à†ƒ‹þŠþŠŒ‚䄸àh†ƒ‹þŠþŠŒ‚䄸àȆƒ‹þŠþŠŒ‚䄸à†ƒ‹þŠŒ–lŒ–†øî„Œ–†øîÈ„Ž¼–†øîè˜@––†øî˜¾þ–@––†øî´„øî䄸èÿ`†ƒ‹þŠŒ–¸Œ–†øîL„Œ–†øî„Ž–†øî4˜Œ––†øî`˜¾þ–Œ––†øî„øî䄸èû¬†ƒ‹þŠŒ–ÿŒ–†øîþ˜„Œ–†øîü`„ŽþT–†øîü€˜ýØ––†øîü¬˜¾þ–üØ––†øîüL„øî䄸è÷膃‹þŠ˜Œ–ûPŒ–†øîú䄌–†øîø¬„Žú –†øîøÌ˜ú$––†øîøø˜¾þ–ù$––†øîø˜„øîÜ„øèò†ƒùôüþÀð†üÎþäЂ—üóæ–õŠüõ›öH‹‹ò„øèõ¸†‹‹˜ê„øèÖþóòôøèèóêû²ò‚éÊ–ðüûó”é¼ñv‘ó„ñŒòÚ«Êñ‚ò°üò‚ñRþ³˜ˆ¦õ¡‹ñçßþøò†ƒùôüþê:‘ñ<ÞŽÞŽÞŽÞŽÞŽÞŽêPïêõï «ÊêFï êþ³îHˆ¦õ±ð†üð†üÎþø쬄íT—üõ¦õ§‹‹†øèð†üÎþ츈¦õ™‹ñÎþøët†ƒš‘ì ëÆìpë¾ìþ³˜ƒ‹†øðò†ƒùôüþÊð†ƒù膃ˆñð†ƒùà†ƒˆñð†üð†üò†ƒùôüþ檖ðé$èÐèèÄèèèÁû¦Öää¦õ§‹‹æ弄ŒþŠæ|åèŠþŠþŠŒ‚䄸À„øèð†üÎþ䂈¦õ§‹ñð†üÎþã ‚ˆ¦õãÜþ’ìð†üð†üð†üÎþâ,ˆ¦õ¯þþ膋ñÎþø˜¬†ƒ‹âꄘЛ‘áÜᎌþŠšŒ‚ä„ò„øà`ŽŒþŠšŒ‚ä„ò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÛØŽŒšŒ–ÝüŒ–†øîÝ„Œ–†øîܰ„Œ–ªŒþІøÆ„ŒþІøæîä„ò„øîä„ò„ø™Û’õÚhÛ$èèÖÙŒ·èÖذ·èÖפØ`èèÖ™×ò‚˜âþ³ÖÀˆ¦õ§‹ñð†üÎþøÕà†ˆžþŠšŒ‚ä„ò„øÚöÕ †ˆžþŠšŒ‚ä„ò„øÚö²l„µ(—üÐÒ–Óöüõ›Ô´‹‹ò„øèÔ$†‹‹˜ê„øèÖþÐÞÓdèèèèèèèÐÖû²ò‚Ë:–Ï®üõ›Ðl‹‹ò„øèÏ܆‹‹˜ê„øèÖþËFÏèèèÜèèèÍ èèèË>û²ò‚ÇÊ–Êüõ›ÊÔ‹‹ò„øèÊD†‹‹˜ê„øèÖþÇÖÉlèÇÎû²ò‚Å2–Ʀüõ›Çd‹‹ò„øèÆÔ†‹‹˜ê„øèÖþÅ>Æ,èÅ6û²ò‚Á–Äüõ›ÄÌ‹‹ò„øèÄ<†‹‹˜ê„øèÖþÁÎÃdèÁÆû²ò‚¾R–Àžüõ›Á\‹‹ò„øèÀ̆‹‹˜ê„øèÖþ¾^¿ôè¾Vû²ò‚»R–½†üõ›¾4üð†üË˜ê„øÔþ»^¼ôèÜèè»Vû²ò‚¸Z–º¾üõ›¯üà†‹ñÖþ¸fºDèÜèÐèô¸^û¦¶B–ð·ÌèÐèè¶Fû²ò‚Öµ8¦õ§‹‹˜ê„øèð†üÎþ´|‚ˆ¦õ§üð†üÎþ³Ô‚ˆ¦õ§üð†üÎþ³‚ˆ¦õµüð†üð†üÎþ²xˆ¦õ™‹ñÎþø®¸†ƒ‹þŠŒ–²Œ–†øî±¤„Œ–†øî¯l„ޱ`–†øî¯Œ˜°ä––†øî¯¸˜¾þ–¯ä––†øî¯X„øî䄸諆ƒ‹þŠŒ–®\Œ–†øî­ð„Œ–†øî«¸„Ž­¬–†øî«Ø˜­0––†øî¬˜¾þ–¬0––†øî«¤„øî䄸è§P†ƒ‹þŠŒ–ª¨Œ–†øîª<„Œ–†øî¨„Ž©ø–†øî¨$˜©|––†øî¨P˜¾þ–¨|––†øî§ð„øî䄸補†ƒ‹þŠŒ–¦ôŒ–†øî¦ˆ„Œ–†øî¤P„ަD–†øî¤p˜¥È––†øî¤œ˜¾þ–¤È––†øî¤<„øî䄸èŸè†ƒ‹þŠŒ–£@Œ–†øî¢Ô„Œ–†øî œ„Ž¢–†øî ¼˜¢––†øî è˜¾þ–¡––†øî ˆ„øî䄸èœ4†ƒ‹þŠŒ–ŸŒŒ–†øîŸ „Œ–†øîœè„ŽžÜ–†øî˜ž`––†øî4˜¾þ–`––†øîœÔ„øî䄸èð†ƒùð†ƒù™h†ƒ‹ªŒ–› Œ–†øî›4„Œ–†øîšT„Œ–ªŒþІøÆ„ŒþІøæîä„ò„øîÜ„ê„øðò†ƒùôüþÀ˜ †ƒ‹þŠþŠŒ‚䄸à—l†ƒ‹þŠþŠŒ‚䄸à–̆ƒ‹þŠþŠŒ‚䄸à–,†ƒ‹þŠþŠŒ‚䄸à•Œ†ƒ‹þŠþŠŒ‚䄸à”솃‹þŠþŠŒ‚䄸à‘8†ƒ‹þŠŒ–”Œ–†øî”$„Œ–†øî‘섎“à–†øî’ ˜“d––†øî’8˜¾þ–’d––†øî‘Ø„øî䄸脆ƒ‹þŠŒ–ÜŒ–†øîp„Œ–†øîŽ8„Ž,–†øîŽX˜°––†øîŽ„˜¾þ–ް––†øîŽ$„øî䄸è‰Ð†ƒ‹þŠŒ–(Œ–†øîŒ¼„Œ–†øîŠ„„ŽŒx–†øîФ˜‹ü––†øîŠÐ˜¾þ–Šü––†øîŠp„øî䄸èá8†ƒ‹þІtŒ–‰tŒ–†øî‰„Œ–†øî†Ð„ŽˆÄ–†øî†ð˜ˆH––†øî‡˜¾þ–‡H––†øî†¼„øîÜ„ál›‘†<ÞŽÞŽÞŽáÀƒx…pò„ƒt¬…HÞŽÞŽÞŽƒÄù„ ƒ†þ³„Œƒùð†ƒù膃ˆñ膃ùò†ƒùôüþ„ƒ8ò„¬ƒÞŽÞŽÞŽhù‚h*þ³‚Tƒùð†ƒùð†ƒùΆƒ‹þІøèò†ƒùôüþ~ˆ„€Üò„~Œ¬€´ÞŽÞŽÞŽ~Üù€ ~žþ³胈ñð†ƒù膃ˆñƆƒˆ‹þІøàò†ƒùôüþzÀ„~PÌ„Œšò„ò„øzĬ}ÜÞŽÞŽÞŽ{ù}4ò‚ò‚zÖþ³|ðƒù†ƒˆ‹šò„ò„øè†ƒˆ‹šò„ò„øè{\†ƒ‹ªê„ê„øðò†ƒùôüþá®âÀˆ–zdŒ–†øîyø„Œ–†øîwÀ„Žy´–†øîwà˜y8––†øîx ˜¾þ–x8––†øîw¬„âømn‘nTŒs„–w s¬›‘uPŒvܼ–†øîÀ––†øîud˜vˆ–†øîu˜¼–†øîÀ––†øîuLÞŽsîtôs¾þ³t°†þøÎ†ƒ‹þІøèò†ƒùôüþsˆnh˜oœ–sloÄ›‘pàŒq°r¨¼–†øîÀ––†øîq¬˜¼–†øîÀ––†øîpô–––†øîÆpp¬oÖþ³˜†þøò†ƒùôüþo n”˜oL–†øînÀ––†øînPmzn mJþ³˜†þøò†ƒùôüþjú²lèŒþkx¬l¬þkÈùlxò‚kŠþ³˜†þøò†ƒùôüþk­jÖþ³Œƒùôüþã.hðj”܄܄ê„hì¨ùiÔhþþ³˜†þøò†ƒùôüþg„h°Ü„Ü„ê„g¨ùgðgþ³˜†þøò†ƒùôüþe „fÌ܄܄ê„e$¨ùf e6þ³˜†þøò†ƒùôüþã:d̈–†øîîÊŠˆ–†øîîbŠŠd –†øîb(˜c––†øîbT˜cþ–b€––†øîbò‚ã þ³a¬†þøò†ƒùãdüþò°a|ƒùñàadƒùñp_샎úþŸaLƒùꆆö`H†ˆ¦õ·ä†‹Ø’ÍþøôüþÞñl_Ôƒùñ\_¼ƒùñ_¤ƒùïð_ŒƒùïÌ_tƒùï´ìƒš5ˆ_0ò„ò„5„¬^ôÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ5Ôþ[ÂõZP[TèÜèÖYt·èÖX˜·èÖWì«ÊW@«ÊV”«ÊUè«ÊRäU€èèèÐèèèÜèRì5ÆRÐò‚5¢úþ³R°üÞ†”þò„þöQ¤†ˆ¦õ§‹ñð†üÎþøP„„Qˆ¦õ™üïßþPˆ¦õ™üïßþøOd„Oüˆ¦õ™üïßþOpˆ¦õ™üïßþøL¬„NÀˆ¦õ§üð†üïßþN‚ˆ¦õ§üð†üïßþMP‚ˆ¦õµüð†üð†üïßþL¸ˆ¦õ™‹ñïßþøHø†ƒ‹þŠŒ–LPŒ–†øîK䄌–†øîI¬„ŽK –†øîI̘K$––†øîIø˜¾þ–J$––†øîI˜„øî䄸èED†ƒ‹þŠŒ–HœŒ–†øîH0„Œ–†øîEø„ŽGì–†øîF˜Gp––†øîFD˜¾þ–Fp––†øîE䄸î䄸èA†ƒ‹þŠŒ–D茖†øîD|„Œ–†øîBD„ŽD8–†øîBd˜C¼––†øîB˜¾þ–B¼––†øîB0„øî䄸è=܆ƒ‹þŠŒ–A4Œ–†øî@È„Œ–†øî>„Ž@„–†øî>°˜@––†øî>ܘ¾þ–?––†øî>|„øî䄸è:(†ƒ‹þŠŒ–=€Œ–†øî=„Œ–†øî:Ü„Ž<Ж†øî:ü˜þ³ŒƒùôüþÊçƒùælœøƒùåì󤃚*‘›Œœ¨–†øî›$˜œX–†øî›P˜œ–†øî›|––†øî› š6šÜšþ³˜†þøò†ƒùôüþ’â‘“ÈŠ––™à”0›‘•LŒ™”–†øî•`––™l•´—⑘Ȋ–†ŒþІøæîò——¾þ³˜†þøò†ƒùôüþ•ê‘–ÐŒ—p–†øî–ä––†øîÜ•ö–œ•Æþ³˜†þøò†ƒùôüþ•Ü”r•”Bþ³˜†þøò†ƒùôüþ” Ü’î“”’¾þ³˜†þøò†ƒùôüþþ‘€äŠ˜Š4–’¨Š\‘‘’Š–†ŒþІøæîò‘*‘Ðúþ³˜†þøò†ƒùôüþ¢‘ˆŠ–†øîò®T~þ³˜†þøò†ƒùôüþò‘ŽØŠ–†ŒþІøæîòþޤÎþ³˜†þøò†ƒùôüþŒB‘(Š–†ŒþІøæîòŒNŒôŒþ³˜†þøò†ƒùôüþŠ’‘‹xŠ–†ŒþІøæîòŠž‹DŠnþ³˜†þøò†ƒùôüþŠ8$˜†ì–ЇˆÆ‘‰¬Š–†øîòˆÒ‰xˆ¢þ³˜†þøò†ƒùôüþ‡J‘ˆ0Š–†øîò‡V‡ü‡&þ³˜†þøò†ƒùôüþ†ðP––†Ä¤…:‘† Š–†ŒþІøæîò…F…ì…þ³˜†þøò†ƒùôüþƒŠ‘„pŠ–†ŒþІøæîòƒ–„<ƒfþ³˜†þøò†ƒùôüþÚ‘‚ÀŠ–†ŒþІøæîò悌¶þ³˜†þøò†ƒùôüþ€€à€ €°Úþ³˜†þøò†ƒùôüþ~N‘4Š–†ŒþІøæîò~Z~*þ³˜†þøò†ƒùôüþ F‘,Š–}ÐŒþІøhò‘ØŠ˜{Ô–}¼{ü›‘}Œþ–Þ|>|ä|þ³˜†þøò†ƒùôüþ{ؘyÔ–{¼yü›‘{Œþ–Þz>zäzþ³˜†þøò†ƒùôüþyØD˜w|–y¼w¤›‘xÀŒþ˜þ–ÈwæxŒw¶þ³˜†þøò†ƒùôüþw€p˜w,–†øîœ˜r˜–wrÀuJ‘v0Š––˜ŒþІøØ„øîÜuVuüu&þ³˜†þøò†ƒùôüþrösÄtÜ‹þsÀ¨ùtÀò‚sÒþ³˜†þøò†ƒùôüþss¨rÒþ³˜†þøò†ƒùôüþrœȘpX–r€p€›‘qœŠ––˜ŒþІøØ„øîÜpÂqhp’þ³˜†þøò†ƒùôüþp\ô˜n–p@n@›‘o\Š––˜ŒþІøØ„øîÜn‚o(nRþ³˜†þøò†ƒùôüþn ˜k$–nkL›‰l‚üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþkŽl4k^þ³˜†þøò†ƒùôüþk(L˜dЖk dø›‰iŽüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþgÒ†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþf"†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþe:eàe þ³˜†þøò†ƒùôüþdÔx––d¨Ì@Þ‘AÄŠ––d„B,bº‘c Š––˜ŒþІøØ„øîÜbÆclb–þ³˜†þøò†ƒùôüþDz‘E`Š––`4ŒþŠb€`X›‘bl`¬a<bDa8¬b0aˆùbaJþ³˜ƒùò†ƒùôüþ`ša `jþ³˜ƒùò†ƒùôüþ`„EÈHB‘_üHN_ÌHþ³˜ƒ‹þŠ_ˆŒþІøØ„HØ›‘_PI,^ _(ò„^¬_^Xù^Ð^þ³˜ƒùò†ƒùôüþI]ðò‚Hêþ³˜ƒ‹þŠ]„ŒþІøI¬„ŒþŠ]`IØY‚‘]LY [”\èŒþ[¬\Ô[àù\¤ò‚[¢þ³˜ƒ‹þІøèò†ƒùôüþZ(„‰Z,¬Z|ù[(Z>þ³˜ƒ‹þІøèò†ƒùôüþYŽZY^þ³˜ƒùò†ƒùôüþJ‘YHJYIêþ³˜ƒ‹þІŒþŠP”ŒþŠRðŒþŠXøSVæ‘XäWW¤X¼W ¬X¨WðùXxW²þ³˜ƒˆñò†ƒùôüþVòWˆVÂþ³˜ƒˆñò†ƒùôüþSJ‘V¬ShU(VHŒþU$¬V4UtùVò‚U6þ³˜ƒùò†ƒùôüþSð„U‰Sô¬TìTDùT¼Tþ³˜ƒùò†ƒùôüþSVSÜS&þ³˜ƒùò†ƒùôüþP¸›‘RÜQ QœR¤‰Q˜¬RQèùR`Qªþ³˜ƒùò†ƒùôüþPúQ€PÊþ³˜ƒùò†ƒùôüþJØ›‘P€K,O@PH‰O<¬P4OŒùPONþ³˜ƒùò†ƒùôüþN „O‰N¬ON`ùNØN"þ³˜ƒùò†ƒùôüþLà„Mð‰Lä¬MÜM4ùM¬Löþ³˜ƒùò†ƒùôüþK´„LĉK¸¬L°LùL€KÊþ³˜ƒùò†ƒùôüþKK Jêþ³˜ƒùò†ƒùôüþJ¤èò†ƒùôüþI¤èò†ƒùôüþH¨ò†ƒùôüþEþFäHê„Fà¨ùGÈFòþ³˜†þøò†ƒùôüþF FÈò‚EÚþ³˜†þøò†ƒùôüþE¤ÜD†E,DVþ³˜†þøò†ƒùôüþBb‘CHŒCüþ’C\˜þ’ÌBnCB>þ³˜†þøò†ƒùôüþBÜ@êA@ºþ³˜†þøò†ƒùôüþ6â‘@¤6ô?Büìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ=¶†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ<6†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ:¶†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ96†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ7¶†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ6î7t6¾þ³˜ƒùò†ƒùôüþ,æ‘6¨,ø5Füìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ3º†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ2:†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ0º†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ/:†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ-º†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ,ò-x,Âþ³˜ƒùò†ƒùôüþ‰+Büìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ)††üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ'Ö†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ&&†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ$v†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ"Ɔüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ!†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþf†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ¶†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþV†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ¦†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþö†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ´Þþ³˜†þøò†ƒùôüþ¨Ôþ¤Îþ³˜†þøò†ƒùôüþž‰Nüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ’†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþªPzþ³˜†þøò†ƒùôüþDò R ø "þ³˜†þøò†ƒùôüþ ‚‘    ` äê„Ü„ \¬ l ¬ù <ò‚ nþ³˜ƒùò†ƒùôüþ Ž Dò‚ò‚ ^þ³˜ƒùò†ƒùôüþ :‘ þ F ì þ³˜†þøò†ƒùôüþöº‘ öØè¸‰ä¨ù»öþ³˜üò†ƒùôüþöÌšüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþކüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþކüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþÿ†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþýކüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþü†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþúކüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþù†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ÷ކüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþöÆ÷Lö–þ³˜ƒùò†ƒùôüþõƆöxõ¢þ³˜†þøò†ƒùôüþôÒ†õ„ô®þ³˜†þøò†ƒùôüþóÞ†ôóºþ³˜†þøò†ƒùôüþÊãŒøþâÔîò‚á~þ³℃ùð†ƒù膃ˆñ膃ùò†ƒùôüþá<膃ùò†ƒùôüþàDÖþÞb߀èèÞZû¾ò‚ò‚ÛJ–Ý–üõ›Þ8üè†üà†‹ñÖþÛVÝÐÄÛNû²ò‚Õþ–ÚŠüõ›Û,üè†üà†‹ñÖþÖ ÚÐÄØxÐÄÖàÖû²ò‚Óâ–Õ>üõ›Õàüè†üà†‹ñÖþÓîÔÄèÓæû²ò‚Ъ–Ó>üõ›¯üà†‹ñÖþжÒ|ÜèÜèèЮû²ò‚Ì"–ÏÖüõ›ÐŒüð†üð†üÕþІøÌþÌ.Ï\ÐÐÜèÍdôÜèÌ&û¦Éò–ËNüõ›Ìüð†üð†üÕþІøÌþÉþÊÔèÉöû¦Ʀ–É:üõ›ÉÔüð†üÕþІøÌþƲÈxÜèÜèèƪû¦Å–ðÅèèèÁû¦ÖÄ ¦õ§‹‹†øèð†üÎþÃT‚ˆ¦õ§üð†üÎþ¼ˆ¦õ™‹ñÎþøÖ†ƒ‹þІøèÖ†ƒ‹þІøèÖ†ƒ‹þІøèð†ƒùↈþöò†ƒùôüþµ‘ÀÐÞŽÞŽÞŽÞŽÞŽÞŽµ,¾¦¿DÜÊþš¼¼½¨èè¼Äþš»°õþšº¤õþš¹˜õþšµ"¹„´þü¹p´òþ³¸8¸Èˆ¦õ£ð†üïßþ¸<ˆ¦õ™üïßþø·œ†ˆ¦õ™üïßþø¶¼†ˆ¦õ¯Žþðð†üç’ÍþøµÜ†ˆ¦õ¯‹ñ膋ñÎþøð†ƒùÚ†ˆ‰õöò†ƒùôüþ©"‘´ÜÞŽÞŽÞŽÞŽÞŽÞŽ©8²²³PÜÊþš°È±´èè°Ðþš¯¼õþš®°õþš­¤õþš©.­© ü­|¨þþ³¬D¬Ôˆ¦õ£ð†üïßþ¬Hˆ¦õ™üïßþø«¨†ˆ¦õ™üïßþøªÈ†ˆ¦õ¯Žþðð†üç’Íþø©è†ˆ¦õ¯‹ñ膋ñÎþøð†ƒùÚ†ˆ‰õöò†ƒùôüþ›2‘¨èÞŽÞŽÞŽÞŽÞŽÞŽÞŽ›H¦§4èÐÜÊþš£\¥ Äèèèè£dþš¢Põþš¡Dõþš 8õþš›> $›ü ›þ³žØŸhˆ¦õ£ð†üïßþžÜˆ¦õ™üïßþøž<†ˆ¦õ™üïßþø\†ˆ¦õ¯Žþðð†üç’Íþøœ@†ˆ¦õ,Žþðà†‹ñ膋ñÎþøð†ƒùö†ü›”†¤Œþô℉õöò†ƒùôüþ„‘š$Žšøò„ò„ò„Àú›Ÿì†™ ŽŽ™üò„ò„ò„Àú›Ÿì†˜äŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ–¨ŽŒ¶ò„ê„ò„ò„ø„4•Z•ø•Dþ¾ò‚ò‚ò‚’8”¼Ðè“<Ü’@þ¾ò‚ò‚ò‚ü‘è‘þ¾ò‚ò‚ò‚¨¬°þ¾ò‚ò‚ò‚ŒÔްÐèŒÜþ¾ò‚ò‚ò‚ŠHŒ„‹4ôŠPþ¾ò‚ò‚ò‚„*Š4à†Œ†øòò‚ò‚„úþ³‰Àü‰,†¸þ΄‰‹ò„øìö‡à„ˆˆˆ¦õ£ð†üïßþ‡ìˆ¦õ¡üç’Íþø‡<†ˆ¦õ¡üç’Íþø†ˆ†ˆ¦õ©üß’Íþø…,„…Ôˆ¦õ§‹ñð†üÎþ…8ˆ¦õ™‹ñÎþøÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþpäÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽq€ZˆÐÜ€Dþ²ò‚ò‚~@¼èÐÜ~Hþ²ò‚ò‚{<}xè|¸Äè{Dþ²ò‚ò‚zõþ²ò‚ò‚xÄõþ²ò‚ò‚wˆõþ²ò‚ò‚púwXŒ†øòò‚ò‚pÖüw pÊþ³wüv`†¸‰õ΄‰‹ò„øìöu$„u¼ˆ¦õ£ð†üïßþu0ˆ¦õ™üïßþøt†ˆ¦õ™üïßþøs°†ˆ¦õ¯‹ñð†üç’Íþøqü„rЈ¦õµ‹ñð†üð†üÎþrˆ¦õ¯‹ñ膋ñÎþøÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþ"&‘p„†ØŽÞŽÞŽÞŽ"<o ·nômPnlèÐèÖ"*òúþ³lHˆ¦õµ‹‹ò„øèð†üð†üÎþøö†ük¤†”‰‹ò„øìò„þök†ˆ¦õ™‹ñïßþøò†ƒù"\üþšjäüö†üò„†üüö†üꄎú‚ú‚üüò†ƒùö†üö†üö†üö†üö†üò†ƒù"|gâ‰iбòÙìþ«ŒƒùôüþhÖ†±òÙìþ«Œƒùôüþg†øòò‚g¾þ³Œƒùôüþež‰gF±òÙìþ«Œƒùôüþf’†±òÙìþ«Œƒùôüþeª½Œ†øòò‚ezþ³Œƒùôüþbö‰dî»ò„òÙìþ«Œƒùôüþd&†»ò„òÙìþ«ŒƒùôüþccÈŒ†øò؆Œ†øòò‚bÒþ³Œƒùôüþ`N‰bF»ò„òÙìþ«Œƒùôüþa~†»ò„òÙìþ«Œƒùôüþ`Za Œ†øò؆Œ†øòò‚`*þ³Œƒùôüþ]¦‰_ž»ò„òÙìþ«Œƒùôüþ^Ö†»ò„òÙìþ«Œƒùôüþ]²^xŒ†øò؆Œ†øòò‚]‚þ³ŒƒùôüþZþ‰\ö»ò„òÙìþ«Œƒùôüþ\.†»ò„òÙìþ«Œƒùôüþ[ [ÐŒ†øò؆Œ†øòò‚ZÚþ³ŒƒùôüþXº‰Zb±òÙìþ«ŒƒùôüþY®†±òÙìþ«ŒƒùôüþXƽŒ†øòò‚X–þ³ŒƒùôüþVv‰X±òÙìþ«ŒƒùôüþWj†±òÙìþ«ŒƒùôüþV‚½Œ†øòò‚VRþ³ŒƒùôüþT2‰UÚ±òÙìþ«ŒƒùôüþU&†±òÙìþ«ŒƒùôüþT>½Œ†øòò‚Tþ³ŒƒùôüþQî‰S–±òÙìþ«ŒƒùôüþR↱òÙìþ«ŒƒùôüþQú½Œ†øòò‚QÊþ³Œƒùôüþ"¾‘Q´ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽØŽ‡ÑŽ‡Áއ‹þÈŽ‡ÑއG쎌Nð‰á„‰Ù„Œþè„ò„H›‘N\ÞŽÞŽÞŽÞŽHdJbMxööö„JZìþ«Lxˆ¦õ·ä†‹Ø’ÍþøK†ƒŠþŸL`ƒùK„†ˆ¦õ·ä†‹Ø’ÍþøôüþÜð†üð†üð†üð†üò†ƒùôüþH^J ‰óꆉóò‚ò‚ò‚H.þ³Ipƒù膃ù膃ù膃ù膃ùò†ƒùôüþ"ÔF>G<F(´¦÷þ™üÎþΦò‚>”E EèÐèèèÐB¸èè>œ´¦÷þ§‹‹Bò„?°›‰AޱòÙìþ«Œƒùôüþ@Ú†±òÙìþ«Œƒùôüþ?ò½Œ†øòò‚?Âþ³Œƒùôüþ?€ð†üÎþΦò‚9ô>=„èÐèèèÐ;\è9ü´¦÷þ§üð†üÎþΦò‚59t8äèÐèèèÐ6¼èè5´¦÷þ§‹ñð†üÎþΦò‚2¬4|èèè2´´¦õ™üïßþΦò‚.1´1$èÐèèè/\è. ´¦õ™üïßþΦò‚(P-´-$,”èÐèèè*äÄèèèèô(X´¦õ£ð†üïßþΦò‚#Ì'ˆè&h#Ô´¦õ¯‹ñ膋ñÎþΦò‚"Ê#ŒŒ†øòò‚"¦§‰‹˜ê„øìÕþïþŠ‘!ìÞŽÞŽÞŽ  ²· œ– €ò‚fþ³ ˆ¦õ¯‹ñ膋ñïßþøÖ†ƒ‹þІøè膃ù膃ùò†ƒùôüþ¶‘PÞŽÞŽØŽ‡Hއ‹þІøàއ‹þІøÆŽØŽ‡ÑއÌ*¸ÐÄèèè蜦õ§üð†üïßþ|¼,„œ¦õµŽ†øðð†üð†üïßþ,ÄÄÜôœ¦õTކøðè†ü膋ñÍ•þІøÄþÂò‚×þïþõ¾‘äÞŽàŽŽ¾Àú›Ÿì† ŽŽ¾Àú›Ÿì†øŽ8ŽŽ¾Àú›Ÿì†óŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽõÔ ú·èÖ è ŒèÊ Ü«Ê ¤„ôÖ«Ê8̬ôÖ·èÖØÜLÊ´·èÖx|ìÊÿ„(èÊõÊÿpõ¦úþ³ÿhüÞ†”þò„þöþl†ˆ¦õ§üð†üïßþøý¼†ˆ¦õ§üð†üïßþøý †ˆ¦õ§üð†üïßþøü\†ˆ¦õ§üð†üïßþøû¬†ˆ¦õ§üð†üïßþøúp„ûˆ¦õ£ð†üïßþú|ˆ¦õ™üïßþøù$„ù̈¦õ£ð†üïßþù0ˆ¦õ¡üç’Íþøø†ˆ¦õ™üïßþø÷À†ˆ¦õ¯‹ñ膋ñÎþøð†ƒùð†üÖ†ƒ‹þІøèÖ†ƒ‹þІøèÖ†ƒ‹þІøèà†ƒ‹þðà†ƒ‹þðò†ƒùôüþõXÖþóŽô”èó†û¦ñ*–ò†üõ¦õ¯‹‹˜ê„øè膋ñÎþñ6ò èèÁû¦Öíš–ïÎüõ›ðÄ‹‹ò„øè̆ŽþŠò„øèË˜ê„øÔþí¦ïTÜÜèèížû²ò‚éz–ìVüõ›í$‹‹ò„øèĆ‹‹ò„øèçþÔþé†ë”èÐèèèé~û¾ò‚ò‚åú–èFüõ›é‹‹ò„øèèt†‹‹˜ê„øèÖþæçœèÐèåþû¾ò‚ò‚⢖äÖüõ›唋‹ò„øè冋‹˜ê„øèÖþâ®ä,èÐèâ¦û²ò‚ßš–ánüõ›â,‹‹ò„øèᜆ‹‹˜ê„øèÖþߦàÜèßžû¾ò‚ò‚ܺ–Þvüõ›ß4‹‹ò„øèÞ¤†‹‹˜ê„øèÖþÜÆÝäèܾû²ò‚Ù:–Û†üõ›ÜD‹‹ò„øèÛ´†‹‹˜ê„øèÖþÙFÚÜèÐèÙ>û¾ò‚ò‚Õâ–Øüõ›ØÔ‹‹ò„øèØD†‹‹˜ê„øèÖþÕî×lèÐèÕæû²ò‚ÒÚ–Ô®üõ›Õl‹‹ò„øèÔ܆‹‹˜ê„øèÖþÒæÔèÒÞû¾ò‚ò‚Ïú–Ѷüõ›Òt‹‹ò„øèÑ䆋‹˜ê„øèÖþÐÑ$èÏþû²ò‚Í:–ÎÆüõ›Ï„‹‹ò„øèÎô†‹‹˜ê„øèÖþÍFÎLèÍ>û¾ò‚ò‚Ê¢–Ìüõ›ÌÔ‹‹ò„øèÌD†‹‹˜ê„øèÖþʮ˜èʦû²ò‚Çš–Énüõ›Ê,‹‹ò„øèÉœ†‹‹˜ê„øèÖþǦÈÜèÇžû¾ò‚ò‚ĺ–Ævüõ›Ç4‹‹ò„øèƤ†‹‹˜ê„øèÖþÄÆÅäèľû²ò‚¶–ÄBüõ›‘‹ñÖþÂÂØÜºû¦¿‚–Âüõ›µüð†üè†üÖþ¿ŽÁ„ÐÜÜ迆û¦¼N–¾âüõ›µüð†üè†üÖþ¼Z¾PÐÜÜè¼Rû¦¹N–»Êüõ›§üè†üÖþ¹Z»ÜèÜèè¹Rû¦·¾–¸Šüõ¦÷þ§‹‹†øèð†üÎþ·Êüû¦Ö¶|¦÷þ§‹‹†øèð†üïßþµˆ¶ ÷þ™‹ñïµ(þ›‹¦÷þ™‹ñÎþÖð†üð†ƒùð†ƒùð†ƒùð†ƒùð†üð†üƆƒžþÝò†ƒùôüþ²ö†üìþ«Œƒùôüþņüìþïþ°â‘±È°î±˜°æìþ³˜ƒ‹†øðò†ƒùôüþÊð†ƒùð†ƒù膃ˆñð†ƒùà†ƒˆñð†üð†üò†ƒùôüþ­‰®ª±òÙìþ«Œƒùôüþ­ö†±òÙìþ«Œƒùôüþ­½Œ†øòò‚¬Þþ³Œƒùôüþ:‰¬f±òÙìþ«Œƒùôüþ«²†±òÙìþ«ŒƒùôüþF½Œ«hÔ¬«TÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ ¨’©0è¨|þš§P¨$è§Xþš¦,§è¦4þšŸÈ¤ÔÜÜ£<ÜÜ¢ÜÜÜèÐôŸÐþš›ÔŸxžèаèÜœxô›Üþš•@›„šôš4èĘäèÜ—¬ôÜèè•ü•Hþš‹Ü”ð”HÐÐÜÄ’8èÜèÄèøÐÜÜÜèÐôpèÄèè‹äþš‡¸‹ŒŠüÐÜÜÜèÐôÄèè‡ÀþšƒÄ‡hÄÜÜÜÜèÐôÄèèƒÌþš€ƒtЂ„èèˆþš€Dè€LþšÜèþš}ä~¸è}ìþš|ØõþšN~üìþ«|ˆ¦õ·ä†‹Ø’Íþøö†üxô†“y®zPŠ–˜{l–’êz¼––’êzHy¨z0þøþy¦õ§üð†üÎþøö†üw†“¶x,Š––’êÊw˜ºþw¦õ™üÎþørP†“¶s|Žvˆ–’ês”všü–üs˜t„ü–¿’½üuþþÌ—“s¼––’—Óstrèºþrl¦õ™üÎþøn†“nÚoŠ˜qôˆ’qd‚ˆ–’êêpØ‚ˆ–’êêoØü–p¨þþoô—ˆ™†ì†óÇêönÔoløþøþn ¦õ±ð†üð†üïßþøi¸†“jŽkDŠ˜m¨ˆ’m‚ˆ–’êêlŒ‚ˆ–’êêkŒü–l\þþk¨—ˆ™†ì†óÇêöjˆk øþøþiÔ¦õ±ð†üð†üïßþøe8†“ffÄŠ˜i\ˆ’h˜‚Цˆ’êØü–üh ‚ˆ–’êêg ü–gÜþþg(—ˆ™ò†óÇêöff¤þöøþeT¦õµüð‚ð†üïßþøbȆ“¶côŒd܈’êdü–ºþþÆ—ˆ‘cìc`ºþbä¦õ™üÎþø^¨†“_~`4Œblˆ’aÜ‚ˆ–’êêaP‚ˆ–’êê`Pü–a þþ`l—ˆ™†ì†`,_x`øþøþ^Ħõ±ð†üð†üÎþø[¸†“\r]Š–˜^0–’ê]€––’ê] \l\ôþøþ[Ô¦õ§üð†üÎþøXȆ“Y‚Z$Š–˜[@–’êZ––’êZY|ZþøþXä¦õ§üð†üÎþøOP„RP“S*SàŠ˜Xlˆ’UÄ‚ŠX8„Uàü–Vž’WPŠ–––’êWHV¼ºþVˆþþUü—“õ™üU(‚ˆ–’—ÓêT(ü–TøþþTD—ˆ™ò†óÇêöS$S¼öøþR`¦õ¹ð‚ð†üçßþO\“PPÌø˜Q¨––’êPè––’—ÓP´PPœþøþOl¦õ¯üè†üÎþøð†üð†ƒùð†üð†üð†üò†ƒùôüþ"ú†üìþ«Mlˆ¦õ·ä†‹Ø’Íþøö†üJ¸†“KrLŒLØ–’êL(––’êÊKlKôþøþJÔ¦õ§üð†üÎþøHÔ†“¶JŠ––’êÊIlºþHð¦õ™üÎþøFð†“¶HŠ––’êÊGˆºþG ¦õ™üÎþøĂ“¶BøŠšFL––’êC<Eœ–šü–üC8˜Dü–¿’½üD¨þþÌ—“Cd––’êBðBdºþAè¦õ™üÎþø>†“>Ú?ŒApˆ’A ‚ˆ’êÊ‚ˆ’ê?¬ü–@|þþ?È—ˆ™†ì†óÇö>Ô?løþøþ> ¦õ±ð†üð†üïßþø:<†“;;ÈŒ=¨ˆ’=D‚ˆ’êÊ‚ˆ’ê;äü–<´þþ<—ˆ™†ì†óÇö; ;¤øþøþ:X¦õ±ð†üð†üïßþø6†“6ò7¨Œ9àˆ’9$‚ˆ––’ê8Ä‚ˆ’ê7Äü–8”þþ7à—ˆ™ò†óÇö6ì7ˆþöøþ68¦õµüð‚ð†üïßþø3¬†“¶4ØŒ5Àˆ’ê4ôü–ºþþÆ—ˆ‘4Ð4Dºþ3Ȧõ™üÎþø/䆓0º1pŒ3Pˆ’2삈’êÊ‚ˆ’ê1Œü–2\þþ1¨—ˆ™†ì†1h0´1Løþøþ0¦õ±ð†üð†üÎþø-L†“..¨Œ/l–’ê.¼––’êÊ..ˆþøþ-h¦õ§üð†üÎþø*´†“+n,Œ,Ô–’ê,$––’êÊ+h+ðþøþ*Цõ§üð†üÎþø#Ø„&Ø“'¢(XŒ*Hˆ’)䂈’)t‚ˆ’—Ó(tü–)Dþþ(—ˆ™ò†óÇö'œ(4öøþ&è¦õ±ð‚ð†üïßþ#ä“$¢%Tø˜&0––’ê%p––’—Ó%<$œ%$þøþ#ô¦õ¯üè†üÎþøð†üð†ƒùð†üð†üð†üò†ƒùôüþ"¸æþ³"Hˆ¦Øþø!Œ†ˆ¦õ§üð†üÎþø ø†ˆ¦õ™üÎþø d†ˆ¦õ™üïßþøÀ†ˆ¦õ™üÎþøô†ˆ¦õ±ð†üð†üïßþø(†ˆ¦õ±ð†üð†üïßþø\†ˆ¦õµüð‚ð†üïßþøȆˆ¦õ™üÎþøü†ˆ¦õ±ð†üð†üÎþøL†ˆ¦õ§üð†üÎþøœ†ˆ¦õ§üð†üÎþø„̈¦õ½üð‚ð†üç’Íþˆ¦õ¯ü膋ñÎþøð†üð†ƒùð†üð†ü膃ùò†ƒùôüþÂò‚þ³ŒƒùôüþÀ膃ù膃ùò†ƒùôüþj‘ìÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ€ÊàèÐèÊþš¸\Àþš4ðè<þš°lè¸þš üHèÜè þš H ”èÜè Pþš T ø \þš H è Pþš|îüìþ«Œƒùôüþv Rúþ³˜üÞ†”þò‚öð„˜ˆ¦õ§üð†üÎþüˆ¦õ¡üçßþø@†ˆ¦õ£ð†üïßþø†ˆ¦õ£ð†üïßþøà†ˆ¦õ£ð†üïßþø †ˆ¦õ«ð†üç’ÍþøŒ†ˆ¦õ™üÎþø̆ˆ¦õ«è†‹ñÎþøò†ƒùôüþÔŒª–†Œ’ŠþÒîÒôï ÿ|ÿ ìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþýf†þ ýjìþ« ˆ¦õ·ä†‹Ø’Íþøö†üò†ƒùôüþû‚†ýû†ìþ«ü4ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþùž†ûù¢ìþ«úPˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ÷º†ù8÷¾ìþ«ølˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþõÖ†÷TõÚìþ«öˆˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþóò†õpóöìþ«ô¤ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþò†óŒòìþ«òÀˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþð*†ñ¨ð.ìþ«ð܈¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþïš™ø×þïþî˜Â–ÈëÐùí¨ë’þ³ídˆþþøÐ†ˆþþøØ††þøØ††þøØ††þøò†ƒùôüþêýê|Šë,þ’ꌘþ’Èò‚éÊþ³Œƒùôüþ銑×þïþè¤ò†ƒùôüþÐò†ƒùôüþÒZ†üìþ«欈¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøã`†“®½Žü–ü—Éã|¦÷áþøá̆“®½Š––üêàáè¦÷áþøà8†“®½Š––üêààT¦÷áþøÞT†“®½Š–––þèêàÞp¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøÚl†“®½üÚˆ¦÷áþø؈†“®½Š–––þèêàؤ¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøÔ܆“®½Š–––þèêàÔø¦÷áþøÒø†“®½Š–––þèêàÓ¦÷áþøØ††þøò†ƒùôüþ¼š†üìþ«ÑTˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøÎ†“®½Žü–ü—ÉÎ$¦÷áþøÌH†“®½Š–––üêÊÌd¦÷áþøʈ†“®½Š–––üêÊʤ¦÷áþøȤ†“®½Š–––þèêàÈÀ¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø®½üÄØ¦÷áþøÂ؆“®½Š–––þèêàÂô¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø¿,†“®½Š–––þèêà¿H¦÷áþø½8†“®½Š–ž–þèâà½T¦÷áþøØ††þøò†ƒùôüþ¦j†üìþ«»”ˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þø¸H†“®½Žü–ü—ɸd¦÷áþø¶ˆ†“®½Š–––üêʶ¤¦÷áþø´h†“®½Š––ž–þèâÊ´„¦÷áþø²„†“®½Š–––þèêಠ¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø®œ†“®½ü®¸¦÷áþø¬¸†“®½Š–––þèêà¬Ô¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø© †“®½Š–––þèêà©(¦÷áþø§†“®½Š–žžþàâà§$¦÷áþøØ††þøò†ƒùôüþš&¦(™öþ³¥Tˆ¡ü¼þò„þò„þò„þò„þôãþøØ††þøØ††þøØ††þøØ††þøØ††þø£H†ˆ¦÷‚ßþø¢Ä†ˆ¦÷‚ßþø¢@†ˆ¦÷‚ßþø¡¼†ˆ¦÷‚ßþøØ††þø Ä†ˆ¡ü¤þò„þò„þôãþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøž,†ˆ¦÷‚ßþø¨†ˆ¦÷‚ßþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø›\†ˆ¦÷‚ßþøšÈ†ˆ¦÷‚ßþøØ††þøò†ƒùôüþt"‘™àÞŽÞŽÞŽÞŽÞŽt8—~˜dÄ—hþ¦ò‚•”–àèÐ蕜þ¦ò‚t.•€ò‚t úþ³u4vØ—üz:–|nüõ”ö¯üà†‹ñ|LþŒ”ìü‹l”Üü‹T’—ü’Æ–ð”Pè’Êû¦’›¯üà†‹ñÖþø‹PŒ¬—üj‘rüõ›¯üà†‹ñÖþJÈèBû¦n–ðŽÈèrû¦Œ¼›¯üà†‹ñÖþø|”øþzF{Äèz>û¦wò–ðy¬èèÐèèwöû²ò‚Övè¦õ§‹‹˜ê„øèð†üÎþuЂˆ¦õv¤‹ñà†‹ñð†üÎþu8ˆ¦õ™‹ñÎþøö†üÞ†”þò„þö膃ù膃ùò†ƒùôüþqΉr‚s¼rzìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþqÚ­qªþ³ŒƒùôüþmR‰nqhmþìþ«p¼ˆ¦õ§ì†ëßþønL„oüˆ¦õ§‹á†ÊþnX“¾oˆŠ’—Énôºþnh¦õ™‹ñÎþøò†ƒùôüþm^­m.þ³Œƒùôüþk:‘mkXkèlðkä¬lÜl4ùl¬köþ³˜ƒùò†ƒùôüþkFkÌkþ³˜ƒùò†ƒùôüþjÔò†ƒùôüþÊZøQ‘Y„ÞŽÞŽÞŽÞŽQ<VÔX¼VЬX¨ÞŽÞŽW ùX(Vâþ³Xƒù膃ˆñ膃ˆñ膃ùð†üò†ƒùôüþTЄVÀTÔ¬V¬ÞŽÞŽU$ùV,Tæþ³Vƒù膃ˆñ膃ˆñ膃ùð†üò†ƒùôüþRÄ„TÄRȬT°ÞŽÞŽSùT0RÚþ³Tƒù膃ˆñ膃ˆñà†ƒˆñð†üò†ƒùôüþQ*R°Púþ³R|ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðò†ƒùôüþP¸ò†ƒùôüþÀÖþMrO8èÐèèMjûMôò‚ò‚ò‚J–LŠüõ›MHüà†‹ñð†üè†üÖþJLèÐÜèJû²ò‚AÊ–Düõ›DÔF GlH¸þŸIôƒùI†ˆ¦õ·ä†‹Ø’ÍþøôüþG†þŸH¨ƒùЈ¦õ·ä†‹Ø’ÍþøôüþF:þŸG\ƒùF€†ˆ¦õ·ä†‹Ø’ÍþøôüþDîþŸFƒùE4†ˆ¦õ·ä†‹Ø’ÍþøôüþÜà†‹ñð†üè†üÖþAÖC„èèèèèAÎû²ò‚=ΖA üõ›µ‹ñð†üè†üÖþ=Ú@HèèèèÜôÜè=Òû²ò‚:r–=üõ›µüð†üè†üÖþ:~nô=n8=n´mÀ=mÌk´=kÜjÜ9j,9jÄ8jd7jX6j€5jä4jD4jl3jh2j1j¸0j¨/j/j.j -j4,jè+jä*jH*jh)jt(j'jŒ&jô$j$j,#jT"jÐ!j!jt j¨j$jÌjôjTjtj¸jÄj$jÐjˆj8j4j8j\jØjj˜j¨j$jh j jÔ jì j@ j jj,j j´j0jÌjÈjjÌj ÿiÈþi ýitûiØúiúiùiLøi@÷iPöidõiŒôi¸óiüòi$òiñitði¬ïiÔîiäìiDìilëi”êiéitèiðçiPçi\æiåi äiÈâi(âiˆáiái€àiàßi$ßiØÞi€ÝiTÜi|ÛitÚiàÙi@Ùi Øit×iŒÖi¤Õi<ÕiLÔiÓi ÑiÈÐiDÐiÏi$ÎiüÌiÔËiüÊi$Êi Éi¬Èi ÈiÇi,Æi¨ÅiÅi ÄiäÁi¸ÀiÈ¿ið¾i¾ix½iؼi¼i|»iDºi¤¹i̸iô·iT·iì¶i ¶i¶iDµiP´ix³i ²iرið°i¤°iX°ið¯iü®i®i­i ¬id«ipªi$ªi„©i8©iì¨i0¨i §iH¦i¨¥ih¤iä£i(£iP¢i˜¡i¡i  iÄži˜iøœiœiT›ixšiL™iȘiD˜iˆ—i|–i¤•i¼”i”i|“i0iiðŽiŽi¤Œi\‹i ŠiT‰i´ˆiÀ‡i<‡id†iü…ix…iÀƒiè‚id‚ipi`€i¤iÌ~i~ix}i„|iøziXzi€yipxi´wi0witvi¸uiÄti|ri\qiLpiniôliliÐkiøji jiÌgiØfi fiüdi diHciÄbiüai@ai `iÈ_ià^i@^i ]iD]iT\i¨[i[iZi|YixXiXiœVi¤Ui\Ti„SiäRi|RiøQiÐPi˜OiÀNi°MiØLiTLiDKi¤JiIiHiŒGi@GiØEidDiìCi CiÈBiDBitAiœ@ià?i$?iÈgÀ=gèf¤=f=fdeˆ=eècô=cp=chbð=b¨a\=a4`Œ=`=`<<`¼:`d9`Ä8`$4`t3`Ô2`42``1`¤0`Ø/`ü.`\.`¼-`ä,` ,`P+`Ì*`ô)`p)`ì(`Ü'`H&`p%`l$`Ì#`ô"`"`l!`¤ `„`@`è``8`ì```H`è`,`T`Ü``(`¤`è`¼`X`¸ `$ `Ø `ð `P `x `È `à`\`0`<`Ô`øþ_Hþ_`ý_Pü_xû_äú_(ú_lù_|ø_¤÷_Ìö_,ö_Tõ_´ô_üó_øò_<ò_ñ_dî_Tí_í_\ë_œè_àæ_àå_œä_Øâ_8â_Pá_@à_ ß_ß_4Þ_LÝ_xÜ_„Û_LÚ_¬Ù_ðØ_PØ_Ì×_,×_˜Õ_DÓ_<Ò_ÔÑ_üÐ_`Î_ôÌ_\Ê_ØÉ_<É_Ç_HÆ_ŒÅ_ìÄ_0Ä_HÃ_TÂ_À_Ä¿_ì¾_ ¾_Ƚ_ð¼_Ä»_˜º_ø¹_X¹_œ¸_D±_P°_x¯_ ®_È­_D¬_4«_”ª_¼©_©_´¨_ø§_<§_¥_ì£_¢_| _´Ÿ_Ìž_,ž_Œ_´œ_°›_,›_È™_P•_@”_ “_ä’_œ‘_ü_@_ˆ_Ì‹_ÈŠ_Ôˆ_ü‡_ ‡_T†_¤…_Ì„_„_ ƒ_ ‚_È_ð€_l€_”_Ø~_0}_°{_ôz_z_Dy_\x_¼w_v_ t_Ès_xq_¬p_ o_œn_n_m_Xk_œj_üi_@i_ h_8g_`f_e_hd_c_tb_ða_4a_D`_l__Ì^_^_]_ÔZ_0Y_ôW_ W_\U_ˆT_S_œQ_¤N_M_@L_ K_œJ_,G_|F_ÀE_|C_ÜB_hA_@_ð?_ì>_˜=_:_9_8_(7_ì5_L5_3_d2_1_0/_<._H-_p,_˜+_ø)_ )_d(_¨'_è%_ø$_°"_¤!_¼ _ __x_¼_8_D_¤__,_T_˜_H_x_l_°_¼_œ_P_\_ _8_ _\ _¼ _ _`_Ì__p_´___t_¸_$_<_hÿ^xý^û^0ú^ù^¸ø^ü÷^õ^ô^@ó^¨ñ^Ôð^ð^@ï^hî^¸í^œì^ì^Dë^˜é^ôç^ ç^Àæ^tæ^œå^å^èà^,à^<ß^œÞ^¤Ü^øÚ^,Ø^˜×^ÀÖ^pÔ^¤Ó^°Ò^ôÑ^ÔÏ^Ï^ Ì^ÌÊ^àÉ^É^<È^dÇ^ŒÆ^¨Å^ìÄ^LÄ^,Ã^ŒÂ^ÐÁ^Á^À^T¸^ðµ^س^8³^¨®^ø­^<­^d¬^Ä«^$«^Lª^h¨^,§^ ¦^ø¤^¤£^Ì¢^H¢^Œ¡^Р^<Ÿ^ˆ^°œ^ ›^h™^X˜^œ—^¨–^œ•^P•^”^À^ô^^(Ž^T^˜Œ^´Š^ˆ‰^°ˆ^¼‡^Ȇ^¼„^P^„~^~^”|^ð{^4{^èz^Øy^y^Dx^ˆw^v^àt^\t^„s^Èr^ðq^Pn^Lm^lk^°j^j^8i^|h^Üg^ìf^Ðe^ e^€d^Dc^@b^Ô`^Ä_^$_^h]^œ\^Œ[^[^LZ^¬Y^hX^€W^ÐU^ìT^8S^ÔQ^lQ^”P^äO^ðM^šM^DM^lL^”K^°I^H^”F^¼D^`C^8A^˜?^ø>^t>^H=^Ð<^0<^t;^¸:^4:^˜8^8^d7^¨6^¨5^5^Ü3^Ø2^p2^ì1^¬-^P,^L+^d*^Œ)^˜(^À'^È&^$%^X$^€#^:"^€!^´ ^Ü^ ^,^ ^^x^¬^œ^à^R^`^^À^^p^l ^ ^€ ^¨ ^^Ø^^D^ˆ^ ^H^4ý]$÷]0ö]Xõ]œô]ô]\ó]Žò]Ôñ]ñ]@ð]dï]Tî]lí] í]€ì]àë]\ë]Øê]ê],ç]ìå]0å]tä]ã](â]Ðà]üÜ]Ü]ÌÚ]¼Ù]Ù]|Ø]\×]dÒ]TÑ]´Ð]èÏ]TÎ]ˆÍ]èÌ],Ì] Ê]´È]ÄÇ]ìÆ]LÆ]¬Å]¸Ä]lÄ]ÌÃ],Ã](Â] ½]\¼]¼]p»]ܹ]4·]”¶]µ]Ô´]l´]@³]„±]\°]ˆ¬]ð¨]P¤]4¢]¡]ð ]P ]„ž]¨]]š]æ™] ˜]À–] –]œ•]T”]˜“]Ü’]’]Ø]p]˜]ÀŽ]è]H]¨Œ]H‹]ôˆ]‡]D‡]l†]”…]¼„]À‚]è]H]´]Ì~]~] }]ô{]0y]¤v]ät]œs]ür]$r]$q]Øp]p](o]4n]\m]m]dl]Äk]@i]4h]”g]Øf]f]|e]¨d]˜c]øb]]l=]\<]P:]ˆ8]h7]€6]46]À4]4]À2]2],1]¨0]´/]0/]Ì-],-](,]P+] *]*]`)]°']&]¨%]´$]Ü#]H"]!]T ]´]]´]Ì]]Ü],]ä](]p]´]À] ]ä] ](]P]” ]X ]€ ]Ä ]x ]ô ] ]4]@] ]]„]è]]ðÿ\4ÿ\@þ\ ý\ü\üú\ ù\Ü÷\÷\¸ö\àõ\@õ\ ô\ô\Dó\lò\ð\Xï\@í\dß\øÝ\<Ü\8Û\4Ú\xÙ\ Ø\ðÖ\4Ö\@Õ\LÔ\ðÑ\ÜÐ\ Ð\œÏ\üÎ\ìÍ\¼É\äÈ\ È\lÇ\°Æ\¼Å\äÄ\ Ä\4Ã\”Â\ØÁ\œÀ\Ä¿\˜¾\À½\ ½\€¼\pº\ð·\ì¶\ ²\а\l­\Ш\ ¨\,§\T¦\´¥\h¤\£\¤ \˜Ÿ\Àž\ ž\L\tœ\ð›\ š\ü˜\(˜\$—\H–\,“\‘\\ðŽ\PŽ\Ì\ä‹\¸‰\°ˆ\؇\Œ‡\|†\à‚\¤\ \œ€\€\x\ð}\P}\”|\L{\z\Ôy\Øw\¼u\œt\`s\¤q\hp\do\Än\n\0m\Xl\\i\øg\8f\Pe\Ðc\Ø_\ð^\ü]\,W\|V\DR\TP\øN\ôM\¶M\ÄL\@L\K\ÔJ\®J\„I\XH\ÔG\àF\F\E\[=[<[ð;[P;[x:[ð8[à7[7[L6[5[Ô4[4[ä0[/[à-[-[ ,[+[*[€)[(['[´&[¤%[,%[T$[Ð#[ø"[<"[d![d [Œ[Ð[è[T[Ð[Ì[°[è[°[Ì[ˆ[|[$[p [˜[è[[8[ì[0[(ÿZàýZ\ýZØüZäûZìùZàøZxøZPöZ0õZXôZ€óZŒòZìñZÌðZÄïZ\ïZíZlëZØêZÀåZ¼äZäãZ`ãZ¤âZ âZHáZŒàZÈÝZüÜZ ÜZˆÛZ”ÚZÚZ¤ÖZøÔZÔZ¨ÒZPÑZ”ÐZ¬ÏZ(ÏZˆÎZÈÍZðÌZ¤ÌZ¼ËZËZøÈZ¼ÇZÈÆZPÆZxÅZ ÄZØÃZ¸ÂZ„ÀZ´¾Z¼½Z½Z|¼Zø»ZX»ZœºZºZ ¹Z4¸Zx·Z ¶ZÒµZ(´Z†³Zè²Z,²ZŒ±Z±Zü®Z¨­Zð¬ZÜ«Z«Z0ªZd©Z8¨Z`§Zˆ¦Z°¥Z„¤Z£Z £Zü¡Zx¡Zô Zp ZpŸZ˜žZLžZ–ZÜœZ œZ¤›ZèšZdšZšZx™Z ˜Zä—Z–Z •ZP”Z°“Z,“ZŒ’ZZ¼ŽZ4ZˆŒZ„‹Z¬ŠZÔ‰Z4‰ZˆZh‡Z¬†Z(†Zˆ…Zè„Z„Z¸‚ZÄZ0€ZØ~Z~Z˜{ZðxZ`vZluZ sZ\qZ$pZønZnZmZŒlZkZÜhZ$hZhgZ¬fZÔeZPeZdZ¸cZübZbZ0aZX`Z¸_Z_Z0^ZX]Z€\Z[ZlZZÐXZìWZÜVZUZ°SZZt:ZÄ9Z\9Z„8Zä7Z47ZŒ0ZÜ/ZY\X=X„V>V|=VlT\>T¼=TäQ|=Qð;QL9Q7Qø5Q 5Qœ4QP4Q°3Q80Qd/Q´-Q”,Qô+Q<&QŒ%Qì$Q $Q$Qô!Q(!Q”QQpQQ(QZQXQ Q¸Q&Q”QVQ€QÐQ° QX Q¬QœQàQìQ0QLQ0QÀÿPdþPûPPúPúP¸ùP$øP\öP@ôP(òPˆñPôðP8ðPâïPÔîPüíP\íP¬ëPØêPTêPìéPÜæP<äPüÞPLÞPœØPì×P×PXÖP¸ÕPÕPlÔPÌÓPLÒP|ÐPÐÍP„ÇP<ÆP„ÅPtÄP€ÃPD¿P”¾PdµP´´P–²Pˆ±Pè°Pô¯P8®P ­Pd¬P6«PˆªPÈ©P(©PÔ§Pì¦P€¥P £P\¡PlŸP|PxœPÈ›P(›PPšPИP@—P°“PБP‘PÄP$‹P̉P,‡Pð…P°‚P°€PTP¼}Pä|P(|PäzPhyP¸xPüvP¤uPÀsPèrP4pP’oPümP mP kP¬jPdhP fPðeP€cPtbPdaP€_PDVP SPÀQPÜKP,KP`JP¤IP¬GPEPBPh@Pœ?P,:Pt8P|6P”5PØ3P2Pd0PŒ/PÐ.Pø,PD(Pì&P&P(%PP$Px#Pô"PÈ!P|!PÀPxP$P¼PPP P¤P6PÔPPP`PP” P\P¬PŽP<PŒP¨P|ÿO@þO„ýOÆøOÔ÷O4÷O$ðOtïOïOˆéOØèO(èOäàODÞO\ÜO¬ÚOüØOL×OœÕOìÓO,ÒO|ÐOÌÎOÍOlËO¼ÉOäÇO4ÆO„ÄOlÂOÁOd¿Ot½O¼OlºO¼¸O ·O|²OÔ¯O`¦OD£O”¢O0¡OOx–Oè‚O8‚O˜OÀ€OÀyOyOºxOxO vOðuOPuO”tOˆqOºpOÈoO(oOìjOK˜=K¤:¾:†::ŽÀ9Ò¯9"¢92œ9Ò–9R“99šŒ9H~9v9:u9Vt9XE9ìD9°C9jA9¶?9´19Ü(9Ðã8€µ8д8¤´8`«8ôŽ8z08Œ!8Æ8¤8ü8$õ6õ6¢è6,–6Ž‚6{6z6>z6tq6q6®p6Ül6hl6l6$j6°i6^i6´g6@g6îf6üd6ˆd66d6üW6lR6R6!†0!ª"!Èp Üp ê[ ª ö B ŽÚ&ßPßpÙ0ÙTÒìÑ¢ÍVËÉÔÎÏ6ÊÆÆ.ľÀÀtxpìm¤jdj$jÀh€h@hÜfœf\fÄd\dbH¼ø¸ ´Ô²”²T²´°t°4°”®T®¨­\¬¬p«$ªä©8©¸§¦ð¤P¢øŸŸž¨š`˜h–ä”`“œ‘ pŽÀŒ‹D‰ȇ¸…„X‚|€Ì~°|°zXxÈuttts4qônällði@hf¬e8c”G|FøDàB\A¬,¤+ô)D(”&ä$4#„!Ô$tÄd€p°Ä   ÔøDöPõ\ônšr™z$”ŒF†FõfèöäŽá–Þ¦Û6ØÎÔÖÑæÎ6ÌŽÉ–Æ´zˆz\zNy´sx]L] ]\ˆZ\Z0Z"Y LK\C´.¦-,+æ!¦ö4ìtê$æØåŒå@åôä$ÞŒÝ@ÝôÜ ØÀ×t×ÈÒÌЀÐ4ÐèÏœÏtÈÜÇÇDÇ\ÂÂÄÁ½ »Àºtº(ºܹT²¼±p±$±<¬ð«¤«ئ¥̤€¤4¤è£Œ¡” H üŸ,àœ”œ˜šþ”R’’‘úŒÌs“W.ƒWÊ‚W MW´”UîˆTò#T.îSÖÝSÔsS¬sSÆdRL?RŠRzIQš>QFóP‚iP>ePÒ=P–=P’àNÚBN @NÎ?NúóM¦MjMÎÂLš½L^½LâˆLŽGLŒOKdOK(ÀÓ'Ì'BÈ'À§ ¥x—Ä”|@€6ü*òúrùò÷è‰@wØi”gž54L)Ôû¢¥¡U˜…nèVnÈ n¢¤mÜ~mom¤7mV½l@ŠlH]l ]lÎ\lB l0Ùjqj\jDØi(Øiü=iÔ=iz i›h„‰hh‰h@h9h²*h%hÚùg$ÒgX(gÖ g0æfø°f<“fZƒfØafD'f¼ffPŸe¼7eX e0 e4ýdøÖdÐÖd¨Öd€ÖdXÖdx˜dL]d¾'d*ÜcÆÛc‚Ùc®ÉcÄ%cÎcÄÅb,b¨bLþaö¾a ¯a©aäŒa¼ŒaZcacaäUaÐ1aŽaZa aøaø`ð÷`äñ`¼ñ`zÌ`ÚÂ`ª“`J~`L`"ë_æê_ªê_nê_2ê_öé_ºé_:£_¤ƒ_p __Æò^Þä^>Ü^ˆ^¢M^F^ðE^ÈE^Œ^Z^|^€ÿ]Xÿ]0ÿ]ÿ]àþ]ú]èù]Àù]˜ù]pù]Hù] ù]øø]Ðø]¨ø]~ø]–ò]xÈ]î™]jq]æZ]ÌM]¤M]|M]TM],M]M]ÜL]´L]ŒL]dL]½Q½Qè‹Q¾‹QZQöUQLQ&8QbQ.Q^QêïP"ÕP,ÍPÍPü¤Pð PÈ PâŽP¶…P4‚P ‚PäP¼P.rPòqP¶qPzqP@qPšoPJjPjPž\PjYPBIPIPÊHPøPÐP¨P€PÚP"P>PïOPåOÂxOÂpOÞ\OPO(OOØO OvÜN˜»Np»NB¢NLžN$žNüNÔN¬N<œNaNð`NÈ`Nž`Nb`N&`N6\NvVN†MNÂFN¶NRNÎNýM÷M¾çM8ÓMÓMèÒMÀÒM˜ÒMpÒMHÒM ÒMøÑMŠÊM~·Mà±M¸±M±Mh±M@±M±Mð°MȰMR–M<‹M‹MoMônMÌnM¤nM*nMîmM´mMŒmMälM¼lM’lMœJMtJMLJM$JMüIMÔIM¬IM„IM\IMìGM¬GM„GM\GM4GM GMäFM¼FM”FMlFMDFMjMâ M MÂLôÁL®·LƶLšL(˜L˜L‘L‚€LjjLÐHL¨HL€HLXHL0HLHLàGL¸GLXL0LòñKPKÜOK´OKFKðEK®EKz=KÒ&KÞÖJæÂJö´JÂ}JjRJàPJ¦#J>JrJª J J J6ýI”íIlíIØãIÛIèÚIÔÀIV½I„°EX¨E=AFú?Îö? =¨Õ;æÈ; æ8ŽÊ8@°8 ¯8à®8§8J}5îÓ.âÀ.$°-ü¯-Œ®-d®-<®-®-J -hÇ*ŒÄ*ÒÃ*PÃ*–Â*Â*ZÁ*ØÀ*À*ð¼*6¼*´»*úº*°¸*ö·*t·*º¶*4 * * *¼ *š?>5œ'TúˆW”Œ°þý,ûHùd÷€õœó¸ñÔïÄïž öþÝn¼Ol9lzÃi"oi$ciz.iDMhHgg|ðcFðc‘c*îaîía²íaä’aÖ-a¦®`ú`¾`Xì_"ì_®Á_d“^Þƒ^ª€^n€^Š1^ ^øÿ]Ðÿ]¨ÿ]˜ê]`]1]îd\ŠO[NO[6jZúiZîYZ."ZîþXê…WÚ)VN)VÜ”UªÙT˜ŽTÚzTžzT>IT^ T*OSÖ½RlwRȼQv¼Q¢¹QþQÂQ¾ŽQŠƒQV1QšÑPî™P“Pî’PÔiPGPÆFPbFP&FPÖ­OÚZO¦WO’3OV3O3OþOJ¼NìžNÄžNœžNtžNž°M64LÂL^ÅJ2`Jö_J´©Hš©H¢FxQF|PFàOFHOFdØEÜ©E¦©E~•EÊE^¹D\—C`–CÄ•C,•Cp†AV†ALFAžã@–?•?L”?t?8s?ˆr?r?¸>ž>äÄ;ÊÄ;Øê8¼ê8¢ê8°à8„à8|ß8®Þ82Þ8vÝ8ZÝ8d¨8J¨8ÎÉ-Ö­-èŸ-²Ÿ-(*-lµ*²*Ö±*T±*š°*°*^¯*Ü®*"®*ôª*:ª*¸©*þ¨*´¦*ú¥*x¥*¾¤*Ø *Ä *´*`*è\ì¢À¢d ˜“l“‘ì%Tý0iìf€dØa0_ˆ\ZÄW€Upl¼gl”_lœWlBPl!l làlŒlll l6ÓkVÄk6k zkÜ6kÀ6kŠ6k¤äj6äjÐÙjž×jÆÑj¾ÆjÌ­j”­jx­j\­j ­j0¨j§j £jƒjâ‚j$yjÐxjbxj¦wj¸ajœajajà`j¨`jV`j$FjœDjdDj,DjÚCjîjjXj jÎjrjêiäéi¬éiZéiæÉi½i:°i ci²-i&i€äh.ähÚhÒh¤µhµh ´hˆ¤h,›h —hº–hPxhFwhNhäAh¬AhtAhfèf^f6ýe:æeÆØe"Óe–ÃeØeNe"zeÒveˆkePkekeÌCe”Ce\Ce$CeÒBe¨!ep!e:!eäeÊe”ßd\ßd$ßdìÞdšÞdà›dÜàc¤àclàcàct—c<—c—cÌ–cz–cH€cdhc,hcôgc¢gc&Xc€)cûbt¾b|§bÔ“bŒbô|bT|b>rb¾Gb6>bÄbŒbTbbÊbæäa–Èa0ÆaøÅaÀÅaˆÅa6Åa"‘aH†a†aØ…a†…aR9a4aÆa,²`¾±`>”`$ƒ`ü‚`Ô‚`¬‚`Bl`XO` O`O`²N`Œ>`Ä;`¨;`p;`T;`8;`;`R,`V`’Ú_ø_rÀ^¬<^v<^Ô;^º;^$6^ü!^ä^¬^Z^,Ä]P¡]f–]ºp]È5]t5]5]ì]*]¤]6]ôí\¼í\†í\àá\8Ù\æØ\¸Ð\fÐ\¦\€ž\’\X‚\ê\T|\’{\ðv\J\ÊI\æ\`Ÿ[c[ T[èS[°S[xS[&S[†R[`ßZVÚZbËZ{Z,%Zj$Z@ZÄðYŒðYrðYD˜YäY¬YYXY>Y|YDY YžYjµXœ¡Xd¡X,¡X¾ XLˆX8‚X‚XäX¬X’X`…S…S¬„S>„S¼hS hSjhS¨êRTêRæéRÔ³RJ³R¬GR4GR”øQxøQBøQ`ñQDñQñQ|æQdåQáQúßQˆßQPÀQ(ÀQÀQØ¿Q VQÀQˆQPQþQž Q>íPÜ`P´`Pœ[Pt[PL[P$[PÔZP¬ZP„ZP\ZP4ZP ZPäYP¼YP”YP(åO˜ãOüiOŒiOTiO:iOØYO°YOˆYO`YOYOèXOÀXO˜XOpXOHXO XOøWOÐWO OØO ONO’ OöNÜõN´õNŒõNÓN¬ÒNtÒNZÒN4NüNŽN¤N|NظMZL˜YL`YLFYLôŽK„‹K$ŠKĈK¼‚KT„J°tJxtJ@tJÒsJèeJÀeJ˜eJpeJècJÀcJ¸PJ@PJ€ JX J0 J J4ËI ËI<µEˆCT¡A$ô@Tz?4>¸=Üß;øÿ8xŠ-lY-ò,p£*” *ÚŸ*XŸ*žž*ž*b*àœ*&œ*ø˜*>˜*¼—*—*¸”*þ“*|“*Â’*|*h*X**|=ž2<$ÔþvÿDÿ ÿýTà¤n|tn¬^n´ÿm ümHöm0ŽmomÜfm,VmôUmL,m0,mz%m”m´ël ÀlŒlÀ‹l‚ltpl¨SlŽSlTl$ l lÚ l¦ l`áklÓkÄÄkpÄkЬk@zkÔtkúg:ìgÕg‚³gPEgEg²öf~öfJöfff¤>fü)f°f”fÿelíepæeüØe4¤e e„e<>e >eH=e<6eè5eÌ5eV4e $e˜e(eDeód¼òd òdèídäêdlàd>ÙdŠÍd\•d܆dÀ†d…dDXdÔWd¤Bdð?d€d"d”ÅcjccÄ.cœ.c8ccŠùbÜñbÀñb¾×btÒb8ÐbJ¿b¿bâ¾b®¾btrb¸fbHfb cbøbbXb¶=bª:bú4bx2b&2bDbôbÌb bÌÈaZ³aЄa¨„a\a>Kaˆ9a.8aaðaÈa axaüaaàaÎa ò`ê`Üé`Zâ`$Æ`¨¾`€¾`ô±` ¯`ø®`‘`d„`<„`„`ìƒ`ă`œƒ`tƒ`Lƒ`Dd`"d`îc`ºc`†c`Rc`c`èN`°¼_@¼_ˆ’_4’_t_L__ØŒ_´†_š†_k_xE_PE_(E_E_€)_Dâ^â^üÍ^Œ·^,£^˜ ^p ^Ì‘^`‡^D‡^@†^†^ð…^È…^0„^„^x^H^ðG^ÈG^ G^€B^VB^4;^;^ 0^ø/^Ð/^¨/^B"^¸ ^œ ^¤^hü]@ü]ü]ðû]Èû] û]xû]Pû](û]û]Øú]°ú]ôË]ÌË]h`]@`]DN]N]P@](@]<5]d2]J2]l]àì\¸ì\>è\tå\Xâ\0â\<Ñ\ä\d„\<„\ ‚\ÈS\ S\ÄQ\œQ\J\Z\Ô\¬\„\t\\ì\xì[@ì[€Æ[XÆ[¯[Ü®[ «[8Ÿ[™[{[LX[ÄV[œV[è[À[˜[p[ø[Ð[®[z[F[ êZxêZ8ßZ˜ËZüºZ¥ZZZÔRZGZž(Z¸#Z(ZZØZ°ZˆZ`Z8ZZèZÀZ˜ZpZHZ ZöZ¼Z”ZjZ¬¯YgYÜfY$eYüdYTAY *Y`Y8YYDY´Y˜YÔYàÿX¸ÿX4ÍXÔÆXÔ¡X¸¡Xô X@ X X¢|XøtXÐtXXtXèrXìhXÄhX<$X,XXXÎëWêWìçW:ÒWÒÈWÞÆWä¾Wj°WŠW4tWøEW¶WªþV¤äV8ÕVÕVèÔVÀÔV˜ÔV ÔVøÓVÐÓV¨ÓVXÓV0ÓVÓVàÒV¸ÒVÒVhÒV@ÒVÒVðÑV®V¬V ¨V¬€VT€V(€VpV]V NVøMV\2V42V,Vð+VÄVœVtVLV$VtüU¸úU€æUXæU.æUdÞU¸ÎUhÈUίU¼•UT•U,•U•Ul‚U4‚Up}UÔfU¸fUœfUˆIU`IUè?UÀ?U>Uà=U ;Ux;U<6U6UlôT¸ÌTÌTÌT¨UT(PT¸ITITÜHT´HT€;TÌ1T¤1T|1TT1T,1TXT0TäT¼T”TlTÐæSÚS¤ÃS|ÃSÀ”SðŒSÈŒS ŒSxŒSŒSØ‹S°‹Sˆ‹S†St„SüsS„sS\sS sSärS¼rS”rSrSôqSÌqS¤qS|qSTqS,qSqS´pSŒpSdpSìoSÄoSœoStoS¤OS|OSðNSÈNS NSxNSISðHST-S,-S8SìôRÄôRœôRtôRêRP¾R(¾Rœ³R€³R’¥RdkR«Pà¨PÔ¤P¬¤P  P,˜PØ—PÔ„P¬„P¸ePePÜdP´dPd\P<\P\Pì[P0YP =Pä«n¦n¤nR£n€Ÿnªžn(žnÊœnf™nJnàŽnªŽn:‹nòˆn”ƒnzƒnÈ‚n¸nŒ}np}nT}n8}n}n||nfyn@vntnnsnqn€pnôonlonöknjnhhnNhn*cnv^nÎ\nšZnúYnRWnÄTn¦Rn¬Pn’Pn"MnPLnþKn”KnBKnhJnâFn\Fn–Cn@n:>n :n†:n^8nz3nö2nr2nb1nP*n6*nz)n`'n n†n²nnÚnn^n~ n" n<n nnân¸nœnHn,nönnnlþmNýmžûmæúm¢ômnòm²ñmÀïm¦ïm"ïmžîmÆímîìm„ìmZémTæmªämámàmrÜmºÛm6ÛmBÚmXÕmÔm¬ÓmTÓmVÒmòÐmþÅmÀÄmZ¿mŒ¾m:¾m½m¶m"¶m‚µm ´mÖ°m°m΢m`›mF›mxm\m@m$mîŽmâ‹m¨Šm’†mÖ…m6…mšƒmÒm<}m}m¬ymrm‚qmºnm^mm¼jm‚emem0`m`mø_mÜ_m"_m^]m†UmhQmNQm Pm2PmÖImÞDm>DmCm@mb?m¦>m=mf9mÆ8m&8mT5ml3m3mð.mº.mÌ*m°*m^*m¸$m€$mf$mÎmæmTmžmmzmjm²m~ mÞ mt m m0 m mø m¦ mš m$mŠmm6ÿlÎþlììløêlçlzæl"älÎál¾àlòßlÀÜl~Ùl¨ÕlpÕlÕlºÒl˜Ñl|ÑlÞÐlÐläÊlÈÊl¬ÊlÊl>ÊlÔÉl¸Él‚Él\Äl@ÄlîÃlò¾lÀ¼l¤¼lˆ¼ll¼lP¼l4¼l¼lü»lÆ»l@»l$»l»lìºl´ºl˜ºl|ºl`ºl*ºl¤¹lR¹lâ±lB±l¤°lˆ°lR°lίl6«l,ªlªl¾©lö£l^ ln–l–lÚ”l€“lîl>ŽlŒlplšŒl Šl‰lnˆlF‡lІlr€l`lDllˆ~ll~lP~l4~lŽ}lîyl2yl®xlØrlol2ll^klþilÂelBblä^l^löUlpUlTUlUl†NlNlòLlÊKl`GlÞ>lÚ;lþ8l”8lx8lB8lR5l–4l¶2lÆ/lª+l +l *l„*lh*lL*l*l"%l€$ld$lH$l,$l†#l¬l®lzl†lÔl.llFl.lªlî lh lL l lll~lÿkÊ÷k ökèõk²õkõk¦ñk$ñkìðk0ðkðkÂïkâík¦ëkòçk6çk²ãkãk˜ákÀàkŠÛkØkÒ×kL×kÔÕk‚ÕkòÓkªÏkîÎkhÎk¶ÉkJÅkÂktÂk\¿k@¿k½kþ¸kJ·kª¶kдkÔ²kº²kF°kš¬k®¤kÖ£k¦žkðkÔk‚k ›k„›kN›k>šk*—kN”kò’k‹k¦†kÚ…k¾kÜkŠkyk¬xkZxkºwk uk6tk°sk¢lk¢jkÖik¢gkjfkÚ]k:]k~\kŽYkžUkþTk"Sk6PkÌKk°Kk>Fk¶CkøBkÞBkš@kV;k¶:k®5kÖ4kl4k64kê.kV-kÀ+k2)kh%kN%k$kÂ"k¢!k!kkjk‚k2kxk\k@k kvkjk$khkúk† kkôk8kkkäk¬kktkXk"kîkxkBkNÿjÂòjªæjlßjPßj4ßjßj†ÝjFÖjRÕjÑj¤ÐjnÐjøÌjJÊjòÈjbÅjú¸jr·jÒ¶j¤±j„¬jj¬j”¤jJžjp–jT–jð”jÈ”j ”jx”j.jö‰j`‰j¤ˆjRˆj2jZ€jÖjPjþ~j’}jÂyj€ljdlj,ljljôkjØkjjkj®jjB^j¾Wj8WjWjòUjpKjÒJj”Ij^Ij~@jž6j46jÆ5jä2jð1jÖ1j„/jN/j^.j*+j®)jº(jÒ&jÄ#jdjšj\j jjj8jjFj jðjRj0jújvjjÿi4ôi*íiºèi–çi|ãi`ãiDãi(ãi¤âinâi¼ßiÂÛi¼Ùi†ÙiÙiÙiæØi Øið×i‚ÕiJÓiÄÒi¨ÒipÒiTÒi8ÒiÒiæÑi`ÑiÑiŠÐiRÈibÇiæÄiF¼i»ib¶iÌ´i°´i²iø¯iB¯i¼®i ®iN®if¬iv¨iî¥i®¤iÀ£i¤£in£iÞ¡if ihžiLži0žiži>i¾ši8ši’™iŠ˜i ˜iè—iÖi6i^Žiji¢‹iæŠiš‰i0‰iúˆiˆitˆiˆiLi¦€iZ~i¾}iÊ|i¶xivwiþuiriôqi¢qi:miäiiPii´hi,hipgi8giˆfiRfiüciàciÄciŽci†^i\iî[iN[iVXi¢TiTiÊSi0LiŠKiêJiFiŠBiâ@i²:iÚ8ir8i8iì7i~7iB(iœ'it'iL'i$'i:#i i< i i€ id i ii¬iÖiÎûhHûh8úhjõhôhÞïh@ëh ëh®éh*éhŠåhåh>ãháhÌßhzßhvÙh×hžÓhþÒh:ÐhÏhºËhîÉhšÁhê¼h.¼h8¹h.²h¨±h®hZ­h^£h¦ h< h–œh®—hì“h ’h*‘h¤h²hhȈh¬ˆhZˆhf‡h”ƒh|hÐth~thêrh&nh2mhöhhhhÎdh^ahØ`h¼`h†`h¢]hž[hþZhÈUh>Uh4ThâShªRh*Mh;h.:h:6h*5h64hú2h~.h¬!h’!hšhhúhvhÊ h hÚ hRhnh®h üg`øgDøg(øgÆögÚìgðãgºãg âgbßg¦Þg>Þg~ÛgæØgòÏgBÎgÍg Êg6ÉgÌÈg°Èg”ÈgxÈgBÈg¾Àgú¾gŽ»gf¹g´g¯gì®gÒ®gέg­g~«gè©g¾¨gæ¤g ¢g gfžgügªgRšgˆ™gR™gR—gô•gÎgð|g|gì{gb{gÒyg2yg ugrgôqg¾qg‚mg¦ggœfgJfgàegæVg,VgVgÚUgpUgTUgUgŠMgªDgîCgZBg|;g`;gD;g(;g ;gð:gº:gF3g>2g².g°-gz-gÚ,gˆ*gÐ)g~)gú(g(gä g®gFg$ggÒgâgä gæ g` g gºgþg–g,ggÚgdgÈgnggLþf0þfÞýf¸úfâùfd÷fòfÐñfbñf¬îf’îf ìf¢ëfbêf"äfàfòÝfˆÝflÝfÛfÈÚf¬ÚfvÚfôÙfNÙf²Øfö×fèÕf°Õf”Õf\Õf@Õf˜ÑfbÑfàËf¨Ëf:Ëf˜Æf|Æf’Ãfæ¾fÞ½f:ºfµf"µf~²fÌ­f°­f”­fx­fB­fø£f(£fð¢fÔ¢fœ¢f€¢fJœfÆ›f@›f ›fšfº–f†“fXf ffÎŽfdŽf¾fn‡fØ‚f ‚f2‚fr}f‚|fBzfRyf²xfÂvfÎnfŽmfÖlf˜kf`kfDkf²efefrdfÒcf2cfv`f¶]f‚[fâZf¾Uf$RfRfªPføOfŠOfKfâIfZFf‚EfÆDfîBfØ8f¾8fB7fø2fÂ2f2ff1f0f6/fj.f0)fú(fX(f(f†ffÎft f" fœ f f–üeÚûeûeúe>öežõeäñeÊñeâìe*ìe˜ãe|ãe¤âe–áeöàeÝeJÜeÂÚeô×e‚ÕeRÎe²ÍeªÈe ÈeâÅe^ÂevÁeº¿e ¸e†¸e¸e®·e’´e¾­e¶ªe¤¨eˆ¨el¨eP¨e4¨eþ§eÒ¦eæœe*œe>˜e¸—ež—eŽ–e:eÐŽe*ŒeÚzeæyePye qeBjeØie ie2ieðgefeæeeb`e¶^e¦]ešYeÀXeŠXeÒVe4TeþSe”Se^Se’ReÚLeìKeFKeRJerc¶=c®a®4ab+a¾&a‚#aÆ"aî!a²ašaÌ a– az aŠaâú`\ú`@ú` ú`Nù`.ô`ró`¶ò`Ré`.è`âä`â`.Ó`ªÒ`Ê`rÉ`¶Å`¶Ä`Ä` À`~¼`Ú¸`î¥`†Ÿ`"›`Úš`F“`Â’`"’`L`Ö`Œ`†`"…`r`†v`‚t`Îo`þl`¼k`Œe`²Q`úO`|M`TM`pJ`TJ`J`œG`€G`dG`HG`G`4:`:`1`0`+`¶)`2)`È(`"(`:#`b"`r`¤`n`ê`T``ž`j ` `v`‚`*û_¤ú_0õ_Bô_>ó_Ôò_tì_Øë_¼ë_¨å_ã_zÞ_ÚÝ_’Ý_Ý_¾Ü_òÙ_ˆÙ_lÙ_–Ø_Ø_r×_ðÔ_„Ì_Ê_ÒÅ_ ¼_„»_Þº_>º_^´_æ®_®_ܬ_À¬_Ь_¬_è«_2¤_úœ_â‘_B‘_‹_Rƒ_²€_Ú_Öv_pu_Tu_8u_u_u_¤s_ts_Ls_òp_Bj_Øi_†i_fh_ c_ºb_lR_âQ_†L_JB_Ö@_2?_(=_=_Ø<_°<_ˆ<_8<_<_À;_˜;_V9_ì8_´8_Ð6_26_ª2_@2_$2_2_ì1_Ð1_´1_˜1_|1_F1_>*_\$_ê!_ô_¾_8_²_H_ö__æ_– _N _º _0_j÷^†ó^4í^âì^xì^rà^Þ^>Û^ØÙ^¼Ù^ Ù^„Ù^hÙ^8Ù^œÖ^lÖ^DÖ^êÓ^ŒÒ^^Ï^$Æ^îÅ^Á^ÖÀ^ ¬^äª^Ȫ^º§^r§^¸¦^œ¦^f¦^H ^â—^ä”^F”^:^Àx^Îw^dq^H]¸G]œG]fG]Î@]²=]J4]î0]h0]ú/]v/]¸.]œ.]d.]H.].]–+]+]æ*]`*]p]V]n]¶] ]]†]æ]Ê]zÿ\†þ\æý\Öü\"ø\žï\¢Þ\>Þ\˜Ý\zÖ\¼Õ\ìÓ\Â\ À\2·\ü¬\à¬\ð«\Ô«\ü§\¥\®¤\(¤\Ö£\ÞŸ\ðœ\ºœ\n˜\¨–\Ž–\´’\V\–Ž\¤…\„\ìƒ\f\â€\^€\Öz\ât\>h\–e\¤U\xS\PS\H\”G\&G\NF\¢B\B\n?\6;\˜7\|7\Î2\ˆ.\n.\Œ,\'\"&\T%\,%\Ü$\´$\Š"\´!\~!\^\ú\v\Ø \Ú\:\`\8\\è\ªþ[î[ºí[¶ë[Lë[ë[¬ê[Zê[.é[Vè[ ç[Û[FÚ[Ù[@×[$×[ ×[2Ó[ZÒ[Ä[ôÃ[:Â[:¼[z¶[*°[4©[©[ü¨[à¨[Ĩ[:¨[T¦[f¤[>œ[Ô›[œ›[J›[ž™[$—[R”[¶[n[Žˆ[´‡[~‡[ø†[І[²…[Þƒ[R‚[B[º{[šo[k[\i[4i[ze[¾d[N`[®_[R^[R[æQ[$L[ L[ÆH[&H[~A[¾=[Z=[Ö<[l<[6<[Ì;[°;[–;[5[°4[N4[\.[Z+[Ö*[Æ)[š$[$[‚"[.[[[\[4[>[ö[à [¢ýZýZ˜üZ*üZ¾øZžôZÆóZ\óZ$óZÒòZ¢ïZxìZ8ÖZÖZÖZäÕZÈÕZ>ÕZòÏZÈZÇZ>¼Zž»Z4»Z¸ZvªZʤZR£Z"ZRœZr“ZÒ’Z‘ZTZ8ZZ ‚ZèuZDgZJdZ4`Z^_ZÈ^Z¬^Zv^ZF[Z2XZtWZ"WZ‚RZjGZ‚CZ‚/Z¶+Zð#Z #Zø"ZÐ"Z¨"Z€"ZX"Z‚ Z®ZfZÒZNZø ZÐ ZîZúZÂZBöY~ëYäY\áY†àY¬ÞYTÛYBÓY¶ÉY$ÅYüÄYlÂY6ÂY*¾YV½Y<¸Y ¸YηYŒ­Yd­Y<­Y­Y«Yâ¥YB¥YÌY2Y>”YzYÚŽYÒ†YN†Y’ƒY΀Y’xY.kYrjYjY¶iYJbY|aY*aYRWYTYôOYÌOY¤OY|OY¸=Y*9YÜ5Y¦5YZ1Y¢,Yn#YúYºYþ Y†Y.ýXfùXàõXŽõX~òX¬îXvëX ëXÔêXªéXšèXœçXøäXÂ×X†ÔXæÓX|ÓX ÒXLÅX0ÅXúÄXÊÃXd½Xö¸XR¶XµXÈ´X^°XÚ¯XV¯XЮXô¦Xþ£X ˜Xä—Xl–X6–X¢X:ŽXHŠX,ŠX‰Xd‰X ˆXô‡XȇXp‡Xr†X4…Xþ„X xXhxX2xX¨uX qX^nX_X–^X^X–SX,SXÚRXòOXZKXÔJXJXʽW0¼WµW^¡W¾ W8 W W®ŸW6Wö›W:›WšWD’W(’Wð‘WÔ‘Wœ‘W€‘Wd‘WH‘W‘WŒWVW~WWÈ…W’…Wž„WôuWÚuW@sW$sWîrW¬^Wê]W‚NWjMWŠEWèDWÌDW°DW”DW^DW¼6WF5W.+WÄ*Wp*W´)W˜)W*)W~%WnW4WÒW6WúWFÿVþVrýV¶üVÖøV–ôV.ïVæVåVäVâËV ËVÊV2ÄVø´V¼³V†³Væ°Vê¬Vx¨V²¦VJ¦Vš¤V~—Vr“V>†VJ…VözV>zVÎvV–sVvqVlpV"]V†\Vv[V [VKVRIVÚFVîEVæAV @V<=V²±Tp­TT­T8­T­T­Tä¬T*¬TبTÞ¦TX T TvœT°—T^—T––TbTÈTà‰T¸‰T‰Th‰T@‰T‰T8‡TöTrT–T vTNvTblTzjT†iTêcTcTaT`T¤_T,WTWT¢LT$LTüKTÔKT¬KT„KTØCTê;TJ;T.7TV6TÖ2T².Tr$TÄT:T¸TÖTlTýSúûSâ÷SjõSíS"ìS ëSÜäSÀäSŠäS ÜSÜSèÛSÌÛSJÔSbÅSÒ»SúºSʸS˜«S˜˜SB‘SÖŽSÔƒS¸ƒS‚ƒS~S:|SÖ{SâwS¤gSÞdS[SXSÚWS@WSZPS6DSø@Sh?SN?S>St>SX>S<>SB7SŠ#S#Sn"SòSêSäS|S¦S S° Sz SdñR2ïRzîRFéR~ÜRŠÇRîÂR2ÂR–ÁRξRܱR´±RŒ±Rd±RÒ®R¥R0£R£Rø¢RÜ¢R&ŸR¼žR žRðR„“Rh“RL“R0“R*R®}R*}R²vR,vRöuR‚hRÚeRê]RÈZRÖYRÖQRQRÔ>R®RRæR‚RôRðQféQ0ßQ2ÞQNÂQÈÁQ¬ÁQÁQtÁQæ½QRµQú¨Qt¦Q@¤Qt£QÄ¢QÀ¡Qô Q( Q\ŸQžQtžQžQЗQ˜—Qò“Q8“Q“Qæ’Q’Qä€QXQ”vQzlQlaQ”_Qæ]Q*]Q6\QžVQÞEQXEQ¹JÀ¸Jl³Jâ²J¼¥JôBJ¸JÞòIÜIØÛI`ÛIÎIr»I>»I »IÖºI¢ºInºI:ºI`¥I8rIlqIÈpIH`I|_IØ^IÀJIôIIPII|2I°1I 1I8IlIÈIôI(I„I°éHäèH@èHlÑH ÐHüÏH¬ÌH”ËHøÊHÊHØÈH<ÈH`ÇHÆH€ÅH¤ÄH`ÃHÄÂHèÁH¤ÀHÀH,¿Hè½HL½Hp¼H,»HºH´¹H(¹Hp¸H\¸HÔ·H¸·Hø¶HàµHDµH\–H•Hì”Hl„H ƒHü‚HänHnHtmH VHÔUH0UH\>H=HìÌæ> æ>XÊ>xÉ>¸È>­>$¬>d«>°>ÐŽ>Ž>\r>|q>¼p>|l>Pk>˜j>\i>h>Lg>f>¸d>d>Äb>la>´`>x_> ^>h]>,\>ÔZ>Z>àX>ˆW>ÐV>”U>U>(T>„S>hS>HR>Q>dP>8B>(@>”?>h?>¸(>(>x'>â>ä>>t>ôô=(ô=„ó=lß= Þ=üÝ=(Ç=\Æ=¸Å=ä®=®=t­= –=Ô•=0•=\~=}=ì|=f=Le=¨d=Xa=@`=¤_=È^=„]=è\= \=ÈZ=,Z=PY= X=pW=”V=PU=´T=ØS=”R=øQ=Q=ØO=Ð; Ï;ôÎ;œÎ;pÎ;ìÍ;XÌ;,Ì;Ì;ÔË;|Ë;$Ë;ÌÊ;HÊ;Ê;”É;zÉ;б;±;°;19à/9‚9`9¨ 9 9 ü8Hü8û8dû8Fè8Ôç8tæ8@å8å8èä8¼ä8üã8¤ã8šâ8(â8Šá8Xà8Ôß8¨ß8Ý8Ý8Ì8JË8ÞÉ8ì¾84¾8¬½8P¹8$¹8̸8 ¸8¸8ˆ¶8\¶80¶8¶8¬µ8Tµ8ü´8x´8L´8ij8ª³8$³8Ò²8ı8P±86±8İ8l°8´®8€­8T­8(­8ü¬84¬8þ«8Œ«84«8ôª8Pª86ª8Ƨ8¸‰8tˆ8؇8‡8´„8ȃ8Ü‚8‚88h€8vñ6?6Ø=6„$6<$6ô#6T#6 #6Ä"6ˆ…5ìƒ5”t5Ôs5ìK5°J5ÈÀ4àí2¤ì2<¶.„µ.ü´.H™.|˜.Ø—.X‡.Œ†.è….Ðq.q.`p.ŒY.ÀX.X.HA.|@.Ø?.).8(.”'.À.ô.P.|ø-°÷- ÷-¼ó-¤ò-ò-,ñ-èï-Lï-pî-,í-ì-´ë-pê-Ôé-øè-´ç-ç-<æ-øä-\ä-€ã-<â- á-Äà-8à-€ß-lß-äÞ-ÈÞ-Þ-ðÜ-TÜ-dÉ-8É-àÈ-´È-0È-œÆ-pÆ-DÆ-Æ-ÀÅ-hÅ-Å-ŒÄ-`Ä-ØÃ-¾Ã-Ì´-²´-³-<¬-ê«-þª-Žª-V¨- --ú-z‡-|w-°v- v-Àj- f-Èe-¸V-ŒV-4V-V-„U-ðS-ÄS-˜S-lS-S-¼R-dR-àQ-´Q-,Q-Q-dF-¬E-$E-Ä9-l9-9-88-07-7-à6-¸6-6-h6-@6-6-ð5-~*-ò)-€-T-P-˜ - -ð-Æ-ºÿ,À+„+ðó*¤ó*Xó* ó*Hð*ï*Ìî*â*Äá*xá*,á*hÞ*8Ý*ìÜ*Ð*ÈÏ*|Ï*0Ï*lÌ*<Ë*ðÊ*¾*̽*€½*4½*pº*@¹*ô¸*¬*Ы*„«*8«*t¨*D§*ø¦* š*Ô™*ˆ™*<™*x–*H•*ü”*$ˆ*؇*Œ‡*@‡*|„*Lƒ*ƒ*x*œ|*â{*`{*¦z*$z*jy*èx*.x*(v*Üu*u*Du*u*Ft*Äs* s*€r*Pq*q*Àp*p*„o*Ên*,d*àc*”c*Hc*„`*T_*_*0R*äQ*˜Q*LQ*ˆN*XM* M*4@*è?*œ?*P?*Œ<*\;*;*8.*ì-* -*T-***`)*)*<*ð*¤*X*”*d** *Ì*Ä*p*h * * *¸*°*\*T**Äÿ)°ÿ) þ)Lþ)øý)¤ý)œú)Hú)@÷)ìö)äó)ó)ˆð)4ð),í)Øì),ì)@ë)Tê)(ê)hé)àè)Tè)ç)¼å)¬ä)€ä) ã)Ìîï@Ô)d”)@ˆ)ü})$})˜(*—(z–(Z•(r”(“(ð’(4Ž(<(\‹(„†(Œ…(¬ƒ(Ô~(Ü}(ü{(px(|g(¤G(ÐÝ&ìÚ&Ú&€Ø&œÖ&¸Ô&ÔÒ&ðÐ& Ï&(Í&DË&`É&|Ç&˜Å&´Ã&ÐÁ&ì¿&¾&$¼&@»&´¶&$³&IJ&D²&ܰ&H¨&œ`%Ø\%ìZ%ÐT%„ù l` 4ÓJ\7\&0ŒøDê`â侯 §h€ |þwÖprmjâ]Bl#Ðê”é”§L—…¸m|l5t!ä Hƒì€`~ i¼gØe¼a@_X5X Xãĵ”±t¯<­«̨Œ}Œ{Œy`y$D´Cü;1Ü ô ¸ T¸â\¹h­üŸ‰PvD)œû`úd{àzdx€v(vüuÐuætttàsˆsªr¤h¤g²`@`_\WBVÐUÀTFOòNDFÀE”E0Cî1|1>0Î#–"R!Z  Vþª<  tÿðû ú(øDö`ô|ò˜ðlîÌì€ìTëäê*à¨Ü\ÜÜÄÛ^ÚXØ(×ÜÖ²ÖÎÔzÊøÆ¬Æ`ÆÆ®Ä¨ÂxÁ,ÁÁ¿z¶Z´ذŒ°@°ô¯Ž®ˆ¬X« «âªþ¨²¨°ŸdŸŸÌžxHœü›Úr°þå 4ªn´xn8unljnPjn”inxin^in ^nH\n.\nXYnÄBnÌ$nˆ nØn4nÌnŒnînlnÐ n´ nø nÜ n nDnðnÔnÈümçm0äm\Ùm@ÙmÅmŠÄm˜½mh¬m ¨mÖ§m´mm`œmä›m mºŒmüŠmrŠm(†mt}mX}mPxmôtm4nmþmmÌTm–TmÔAm>mœ=m0;mþmšmÜ m€ólTïlëlÕlËlØ©l¥l †lÌ…l°…l–…lâl¤~l~lÒ|l,nlxkl4jlŒUl€Tl.TlØOldEl`>l8>l>l¼7lü/l@+lX%lœ$l$lb"l”lˆlRllTükök¶ðkLðkFák ÖkÕkàÔkÆÔkDÔkbÊk@Êk$ÊkÊkìÃkÒÃkà¶kü±kıkޱkÄ­kŽ­kÚ¥k(¤k ¤k´ŸkøžkÜžkÈšk¬škškv“k”‘kz‘k˜„k~„k€kkÌ~k²~k„ykºtkØrk8lkZkkôjkØjk¼fk fkàakªak4Uk´Qk|QkFQk,BkBköAkŒAkrAkŒ0k:0k<*k*kL)k %kPk4kükàkîk”k" k¸ k€ kf kTkòj´ñjDñjñjñj|ðj`ðjFðjéjüèjÄèj¨èj¶çjèÜj–ÜjTÆj8ÆjÆjz«jÊj4jüœjâœjjÒvj0vjtfj¸ej‚ejž_j Zj^TjàSjxIj´@jh/j )jð(jš"j4jþj´jÞjj`ÿiDÿi÷iÀìiÎái¤Ði”Íi\ÍiBÍi¤Ãi´¼iкiŠºiµiè´i´iô³i¾³i8³i³iȨi°Ži”Ži8‹i$‚iìi`|i|iÄoiœoitoiœjix_i@_i&_iÂRi´EibEi4AiAix@iv6ir0iÄ'iœ i”ixiŽóhêhÔâhœâh‚âh4ËhâÊhˆÆh6ÆhTÂh:ÂhܽhÀ½h¾»h¹h`¸hˆ·hœ²h€²hd²hð¬h¸¬hž¬hð¨h ¢h¢hhn™h0häˆhæ†hŒuhpuhÜsh¦sh mh„mhhmhÈlhvlh VhNVh4LhþKhr9h˜5hˆ4hl4h¤hhÌh–hÄhªhhth>hf høgògÊñgígÐÛg´Ûg¼Ùg8×gËgh¿gºgð¹gœ¹g€¹gä§g®§g°¦ggÌ–g°–gdgÐ~gš~gr|g¬xgZxgì^gHVgnTg8Sg`Rg¤Qg‚Pg0KgúJgFDgAg¸1gœ1g8,g ggØg:göÿfŽÿføýfäîf¸ÌfTËf|¾fb¾f¨»fl¬fì fšfìŒf(‹fÀ‡fˆyfÌxf kf¸Wf¤JfPJf4Jfx:f8f°7f”7f˜fDfìfhfdf.f f¸ fH f, f,üedúeHúepùe¸õeõe0éelâe6âeœÕeüÈeÈÁe¬Áeظe«eä©e®©e$£e¨e˜Œe(ue\jeÈhevheœge|Ae`Aet;eX;e<;e ;eF+eL*e¼eˆeTâdˆàd¤ÜdÊd\Ædð¾dº¾d6¾dD¡d”—dÔ–dDŒd¤ŠdnŠd†dƒdH‚d,{d’vd$tdìsdÒsd”ldxld\ld¬jd’jd´bd˜bdTOdOd|Kdz8d8dÚ7d2dø1dP$d4$d€dHd´üc|ücbüc,úcØìc°ìcˆìc`ìc8ìcØæcŒÑcTÉc8Éc”¾c@¸c$¸cL·cä¨c´¡c cX c> cb”c˜cDċc°‡c¸\cž\c¸McMcàLcÆLcÐHc´Hc¤Gcä&cÈ&cÐcÈc€cD×b<Íb Íb8Ëb¸Äb ½b¸¯bܦbЦb°œb”œbzbxbrtbÔqbºqbðjbPjb(jb`bœ;bP#b4#bþ"bbøbb8ìaìaDëaàÖaªÖajÕaÌaäËaËa>Ëad½aô¬aجa¢¬ap¤a:œa¼›aØ“a>va`ea„ca”aaÄWa¨WaÈUaÀJaGa$?aØ=a>=a´+aZ!an aÔaLõ`€ô`dô`°ç`´á`~á`м`Ю`¡`:š`¤™`Š™`Œ‘`T‘`Ä`¨`Äw`öe`ÌM`üJ`XH`H`P:`ü9`À1`ê `& `ØÜ_4Ð_¸Ì_ ¬_Ì«_œ§_Hœ_ö›_r›_H…__$s_Ôr_4k___”\_l\_D\_U_ÎT_ˆR_R_üQ_P=_¨9_˜8_Ô._¸._œ._ª(_@(_(_î'_T_Ü_ì_L_ú_ðö^Èö^ ö^Üë^Šë^Ôß^‚ß^Ö^ÌÕ^„Å^2Å^ À^à¿^ˆ¿^\¿^0¿^ؾ^¬¾^€¾^(¾^ü½^н^x½^L½^ ½^ȼ^œ¼^p¼^¼^ì»^4»^ܺ^°º^ ¹^š¸^¸­^€¦^L¡^¡^,^Ð^ÀŽ^`„^¤ƒ^|ƒ^Tƒ^,ƒ^ƒ^Ü‚^´‚^Œ‚^d‚^<‚^‚^ì^Ä^œ^t^L^$^ü€^Ô€^ä~^Ê~^Œq^äm^ôb^ÈZ^’Z^0@^ø?^Þ?^>?^ª7^@ ^ ^î ^þ]hþ]@þ]†ð]´ê]°Ï]ˆÏ]¤Ë]É]¤Â]à²]£]ÌŸ]@•]$•]0”]ø“]Þ“]Ff]ÔT]ŒT]rT]œ4]Ä1]¨1]r1]„0]00] /]Ô.]r-]À]L]¬] ]ôþ\ôÕ\ØÕ\Ô\hÎ\˜Á\~Á\L±\0±\Pœ\ì\<‹\\¾\„y\\y\4y\äT\ÈT\’T\¼O\>O\°G\\G\ F\hF\Â@\P;\¸:\:\ð8\Ô8\J2\˜*\¤%\|%\%\\Þ\ \ô \H\æ[¸å[å[Í[€Ì[ò·[±[\¯[¬œ[\—[ —[Ô“[–[°][,V[V[ÚU[Ø:[t#[>#[Œ[Ü[„[¬[[[ZøZðôZÔôZ4ôZêZìéZÄéZœéZtéZLéZ$éZüèZÔèZ¬èZ„èZ\èZ4èZ èZäçZ¼çZ”çZlçZDçZnÏZPÃZ4ÃZ€ÂZàÁZ¸ÁZÁZâºZ·ZаZ¨°Z€°Z°Z¸«ZD¤Z(¤Zl£Z¾¡ZРZžZ—Z<‘Z†ZhZÈgZ®gZPfZ4]Zü\ZÆ\ZàQZÄQZèBZÀBZ˜BZ BZ¨,ZŒ,Z8+Z˜*Zp*ZH*Zž#Zp ZH ZœüYdüYJüYDûYðéYžéY–ãYÔÞYÝYâÜYÞÙY8ÆYÆYÈÅY¬ÅYzÁYü¾Yø¹Y¸Y’¤Y<™YêY`aYt\YhTYLTYÈKYpAY>Y¸:YF6Y>5Y˜4Y¨/Y€/YtYZY€YPY YèøXÀøX˜øXpøXHøXX÷XÄõXpóXóXÖíXxÕXFÓXÒXèÑX²ÑXÍXÀÆX¬ÆX$ÆXÆXîÅX†ÁX¬ªXЍXБX¨‘XØXpqX”IXlIXIXÌHX4.X-Xô,X¼,XÈ+XÔX¸XŒXDX(X²X$XXLÿW0ÿWÿW|þW˜öWðêWÔêWžêWüéW¨¼W€¼WX¼Wd·W„«W2«WzœWŒ›Wp›WDšWìWÐWtW(…W …WÔ„W „WLrW0rW TWÔNWCWhCW¸+Wd+WH+WèWÌWWWZW˜ÿVýVˆäVHÉVÇVäÆV®ÆV¸¸V‚¸V©Vô˜VÔ…V¸…Vœ…V€…V¨„V”xVôUVpEV|AV°3VŒVpV:VÞVLVÔV¬ V VöVÂV0ûU8íUàêU¸êU$ãUãUhàU2àU€ÞU°ÌU”ÌU^ÌUðÄUÔÄU„§U|¡U$™U4ŽUl‰ÜU¤ˆU<ˆUˆU0U|{UhkUÄ#U¬UUôU@U˜U|UFUÔU¸U‚UxUBUêðT¸êTfêT äT„ãTãT|ÚT`ÚTÓTîÒTdÑT²ÃTHÃT´¹T˜¹T~¹TT¶T´T8¯TâTˆ}T`}ThvTäuT´uTVnThITR´Rn RÀëQNêQlÝQPÝQÝQ4ÜQ4ÙQZÖQäÁQh½Q ¼Q̹Qp“Q|’Q`’QèŽQdwQHwQ|]Q`]Q¤\Qˆ\Ql\QxYQXQtEQÜCQÀCQp3QT3Q3Q¸ Q Qh QðQÈQLõPÀóP2êPDÅPž²P¨°PŒ°Pp°Pl¯P0£P£Pà¢P¸¢P¢Px PDœP|}P`}PÀ|P¤|PþxPDuPtjP¬iPhePðbPÔbPºbPâ?P¼ F—FØ–FP–F0ƒFx‚FðFfFHeFÀdF¸EFEFxDF 1FÔ0F00F4F|FôFlFÀFÐûEûEúEÐëEëEêEôÜE0ÚEXÙE"ÙE.ØEpÏE¸ÎE0ÎEüšELšEΘEÐŒEŒE‹EDè=DD=Dp&D¤%D%D,D` D¼ DèõCõCxôClîCTíC¸ìCÜëC˜êCüéC éCÜçC@çCdæC åC„äC¨ãCdâCÈáCìàC¨ßC ßC0ÞC¤ÝCìÜCØÜCPÜC4ÜCtÛC0ÚC”ÙC¸ØC ×C×C`ÅC”ÄCðÃCø·Cø®C@®C¸­C0™C™C´„Cb„C¬mCàlCê>Xé>¤Í>ÄÌ>Ì>P°>p¯>°®>ü’>’>\‘>Љ>¤ˆ>ì‡>°†>X…> „>dƒ> ‚>T>€>À~>~>Ì|>t{>¼z>€y>(x>pw>4v>¨u>Üt>Èt>$t>t>èr>q>Øp>œo>pn>¸m>TX>tW>´V>dB>ˆA>\A>€@>T@>¸*>*>x)>t >¨>>„÷=¸ö=ö=(â=\á=¸à=äÉ=É=tÈ= ±=Ô°=0°=\™=˜=ì—==L€=¨=œy=„x=èw= w=Èu=,u=Pt= s=pr=”q=Pp=´o=Øn=”m=øl=l=Øj=<0><T=<<<t;<˜:<T9<¸8<Ü7<P7<˜6<„6<ü5<à5< 5<Ü3<@3<d2<L1<°0< <@<œ<´þ;¬ý;€ý;ôÏ;ØÏ;г;³;²;<¬;ê«;@Ÿ;ž;ø9`9¨9 9ÚÝ8ìÀ84À8¬¿8@³8 ©84¦8X 8 8XŸ8<Ÿ8Ÿ8¬Š8Š8d†8¤µ4¨S3øî2Èñ.4ñ.¼ð.<¸.„·.ü¶.Ø›. ›.hš.è‰.‰.xˆ.Œt.Às.s.H\.|[.ØZ.D.8C.”B.À+.ô*.P*.|.°. . .è .L .p .,..´.p.Ô.ø.´..<.øÿ-\ÿ-€þ-<ý- ü-Äû-8û-€ú-lú-äù-Èù-ù-Ä÷-(÷-Lö-4õ-˜ô-ôâ-(â-„á-ض-(¶-´-³-Þ²-ª²-v²-B²-²-’°-^°-°‡- z-@y-œx-dH-¬G-$G-Ð*-P-˜--ü-ðÿ, ý,Îü,HÉ,˜È,¼Á,Á,ØÀ,¬À,€À,TÀ,ü¿,”·,ä¶,T±,¤°,€¬,Ы,|m* j*æi*di*ªh*(h*ng*ìf*2f*c*Jb*Èa*a*Ä^* ^*ˆ]*Î\*hü)Tü)Dû)ðú)d)´œ)â„)¦€)R€)¤)$) })È|)ì)<)D)8)))ü)¼ò( ò(Œì(pì(|è(`è(\ä(@ä(@º(xš(Nš(¬˜(t˜(X˜(Œ—(p—(–(ô•(¼•( •(Ô”(¸”($“(Ü’(ø‘(–‘(‘(ž(4((¶( (¾Ž( Ž(¾(((ÆŒ(\Œ(@Œ(Þ‹(H‹(æŠ(HŠ(æ‰(P‰(îˆ(„ˆ(hˆ(ˆ(p‡(‡(p†(†(x…(…(¬„(„(.„(˜ƒ(6ƒ(˜‚(6‚( (>(Ô€(¸€(V€(À(^(À~(^~(È}(f}(ü|(à|(~|(è{(†{(\x(@x(Þw(r(Dp(°=˜<¨;ø:è9x8t7¼6V5ä44X3@2P1 0ª*P*()$(l'°äü"¸p~ þ©nZ¦nº¥n4¥nv¢n„ nš˜nV•nö’nFnŠŒnÚ‹nö‰nˆnB‡n~…nâ€n^€n¦n²~n~n~xnªvn–qnàpn pnRon¦mnˆjnÚdn6bnzan`nN_n"YnŽTn Nn‚GnŽBnÂ@n¢>n~=n.;nN9nb/n.nJ-nª,n*'nn&nÚ%n–$nv!n–nFnönænFn nì nênnbnÎnön:ùm¦÷m.öm*ómñmbðmîâmpàm*ßm Ùm–×m’ÌmòËmÈm¢Ámкm’¹mâ´m¶²m²m’±mb¯m2¬mƨmâ¦m>¥m¢m~¡môžmh“m“mÞ’mê‘mrmˆmj‡mêm.mŽ€mºxmnvmÌumzum¾tm8tmtmtrmâpmpmvom†jm:hmbgmÂfmþcm‚bmÒ`m¦_mÖZm6ZmnXmÎWm²VmŽRmªNm NmÔKmÎEmœAmfAmª@mú:m6m5m4m 2mv/mâ-m)mr'm~&mÞ%mÆ#m6"mm^m0múm>mžmlmömÆm¶mm"m¢mºÿlÖûl¦øl.÷lªõlJólòl~ñlÞðlðlïlníl~ìl~èlúçl¢ålRâl6ßlŠÜlÜlê×lrÖlbÑlBÍlÆÇlJÅlÀÄl®ÂlöÁlVÁl¾½lB¸löµl^³lJ²lŠ®lê­l­lr¬lº«l§l€¦lZ¥lâ¢l¡ljŸlBžl¢lrœl"”l¨‘lŽ‘llЇlü}l²{lZ{lºzljrlömlVmlzilÚhl¢glºcl2alz_l®^l[lnZlÐYlšYlúXl"Xl‚Wl`MlÚJlšIlúHlJHlÎElæBlBl:Al‚:l†7l7l¾3l:3lZ1lž0l¶.lú-l&lô#lÊlŒlúl‚lºlÆ l‚lÞlòlˆlrlêókžékþèk&æk>åkÜàkŠàkÞÙk>ÙkŽØkbÐkÖÌkÂÈk:Ák†¾kÚºkò¹k¦³kZ«kî©k&¨kn¡kê kŸkÆœk&œkJ™kê•k¶kŽkškr‰k†kþ‚kz‚kvukÌskzskskôrk†rkæpk okÎnkØfk¦ckJbkRk¢NknLkJkrHkÒGkEkVDkZ9k7kD5k¢2k2kR1k¶,kŠ+k6'k &k,"k´ kb kkªkþk„kjkºkîk¾ kš kÆ kÂkvkžkrkýj újRùjN÷jöj6ôj˜ójbójàèjrèjšåjÆâjšáj®àjàjâÞjÚÛj~Új¶ÙjÙjZØjÜÕjÊÓj’ÒjRÏj:ÎjŠÌjRÈj^Çj´ÅjR½j̼j^¼j²»j:ºjš¹j2¶jN´j޳jb²jR±jz°j*¯jŠ®j®j®ªj¾©j©j¨jv§jަjJ¥j^¤j’£jò¢jR¢jΚjÀ—j¦—j —j—j(”jÐj¶jäŒjÊŒj¾Šj*‰j^~jž{jøwjúujºtjâsjBsjêojrnjnmjLgjgj>fjþdjþ^j8\j\j~[jªZjªXjæTj†PjbOjnNj¢LjòKj FjvEjDCj?j.=jb{ižziÆyiÄsi’pi°iiàhihiTgigiBei†aiæ`iäZi¾XiêUiXRi>RiQi,NiöMiMiÒGiªDi&@i Šhv…hÖ„h„hzƒh6xh´wh|whÄvhŽvhÆqhâjhÖfhâehZchž^h WhîPh®Oh¶JhIhJGh‚EhþDhîCh†Bhú;hú7h¤4h>2h1hÄ/hŒ/hT/h/hî,h+h*hì)hÄ)hœ)ht)hL)h4(h (h*&hŠ%hÐ$h~$hÎ"h–hÆh¾ hDhhþhhšÿgÀþgnþgJýgnûg6ôgÌóg”ógñgRðgÚîg‚ëg†ég®èg çgøågÐåg¨åg€ågXågþâg:àgJÝgìÛgbÚg†Ùg×g¾ÐgÊÊg‚ÆgÄgBÁg>Àgº¼g¦·g¶¶g¾´gưgz¦gÚ¥g¤gŸgXŸg@g$gÒœgH›g›gF˜gè–g^–g.“gg(ŒgÖ‹gúˆgÞ‚gJgÐgšg@zg~vgÂugþrgjngkgrigøhg²hg2hg¶dgJcg¾_gª]g–ZgúYg>YgSg*RgâOg6LgIgžGgæFgÖEgÈBgZAg@g~?g:g.9g~8gÞ7g 7gÎ6gÆ5g4gÔ1gJ1gª0g0g’/gR*g‚'g~&g® g* g^g¾ggægògDg g: gžg>gîþftýf"ûf‚úfÖófRóf²èf‚çfÐæfšæf.áf6Ýf ÕfÊÇfnÅf>¿fJ¼fŽ»fJ¹f^¸fv·fJ´fz±f®¯f¶®f¤¬fˆ¬f6¬fz«fn¥fJ¢fnŸffžfŠfb™f˜fj—fö–fž‘f~fÞf®‹fòŠf6ŠfÚˆfŽ…fNfv€fºfæwfêufJufVsf²qfqflfZbf ]fj\fþVf^VfÖRf¶MfÒHfÞCf&AfF?fâ>fþ:fB:fz9fœ1f®-f–+f‚*fâ)f*'fFf¦fBf¢ffŠfVff2ff fÆ f< fRf fjfBf¢fÊf†ÿeæþe*þe¤ýelýe:ùe:øeš÷erðe^ïe¢îeòíeêeúèe,áeŽÛeÞÙe~ÔeRÑerÏe¢ÌeZÊe‚ÉeJÆeÄeÌÃej½eæ»eÈ·e’µeb³eβeίe¯e¥e¤eÒ¢e ¢eæŸe6ŸezžeŽ›e6‘ezŠeމeîˆeJ‡ejƒe¦eâeN~e®}e²{eÆxeŽwe$weòtetežre4reþqeæneFne^meîdeÆbe&be†aeÎ\eö[eV[ežZeVeNQeªOeÒNe2NeHe&Ge6DeF?e¦>eÎ=e.=eÊôdúîdzídÚìd”èdÚâdâdþßdŽÔd Ód>ÒdrÑdÞÐdîÍd~ÉdÞÈd¸½dò¹d޹d¦·d.´d.²dR¯dήd­džªdVªdî§dv¦dÖ¥dÖ£dþ¢d2¢d& dždþœdF™d^˜d¦”düdêdæŒdŒdrˆdІdÌ…d–…dö„dV„dÊ~d®}d pdîkdNkdºid®gd"adê_d¼UdVSdvMdFKdlJd6JdEd*Cd>df;d :d5dF4dÂ3d*/dv+dÖ*dÂ(d"(dœ'd¢"dædîd2dêddd~dú dâdNdèÿc÷cócBòc6ècŽÞcæÙc‚ÖcÞÓc–Òc>Ïc*ÍcnÌcÊcÖÆc6Æc¿c^¾cú¶c‚¬câ«c®¨c¨c§cb¤cŠ£cÞc²œc"™cV˜c¼‘c†‘c–ŽccŠ‹c‹cЉcF†cx„c.€c²|cj{c^uc"tcJrcªqcÒcc"]c”Xc\Xc¾TcÞRcêQcQcÒPcRGc2Fcê>c>:c7cö2cV2c*cJ)cÆ(c&(c'c’&c"cöc6cZcfc„ýb\ýb†ûbæúb†öb2õb>ôbRñbRîb^íbVëbRêb¢ébåb>ábàbŽÛb²ÙbÙb`×bòÖb ÒbêÑb¾ÐbÐbbÏbšÎb0ÎbËbþÉbJÆbªÅbŽÁbâºb&ºb„±bj±bâ®b(­b­bRªbz©bÚ¨bT¨b:¨bb§bÞ¢b¢búžbîbÌœb^œbö—bú”bZ”bº“b“bÒŽbæbæ†bvƒbˆ‚b6‚bbR~bÚ|b:|bš{b0{bÊwbwbŠvbÒsbžob`lblb†Zb²TbvPbêKbŽJb–HbêBb.BbŽAbÒ@bv?bÖ>bª/b /b†,bH(b (b2%bÆ!b bÎbîbšbúbbéafçaÆæaNåaÜazÛaŠØaÒaPÑaÑaàÐaŽÐabÏaþÎaRÉaÈaÎÇa:ÇašÆa&Âa ´a>±az©aV¢a6¡a ŸaÖža –a •a„•a2•a‘aèaÌa–aª‰aˆa>€ab}aoaþla®jaº^aÚ[aæXaJXaàWa¦Qa¶Na2La–GafCa¢Aa~@a?a¾;aF:aV7af.a¦*aÎ)a*(až a(aaÒa aR a˜ÿ`*ÿ`Fý`>ü`žû`õ`œô`¶ê`&ä`úâ`’Þ`êÚ`Â×`ôÕ`¾Õ`Õ`bÔ`²Ó`šÑ`’Ð`òÏ`ÒÈ`ÆÆ`Þ»`6»`–¬`î§`ª¦`r˜`f—`î•`¬”`t”`Ü’`ž‹` ‹`vŠ`†‡`œ~`|`{`–x`îr`¾p` p`’n`‚m`”l`îh`®g`BD`Î?`J?`r>`Ò=`‚<`Œ;`Z7`ª6`º3`z2`<1`ê0`¢.`.`*-`À,`ˆ,`–+`²$`$`V`d`J`Ä`Œ`.`š`– `Ô`ì`à`~`Žþ_–ü_¾û_²ù_Âø_rö_Vñ_ìç_–á_Û_ÈÚ_‚Ò_BÑ_:Í_‚É_ŽÆ_2Å_`¾_D¾_¾_6½_–°_Úª_˜©_F©_>¨_‚§_rž_Ò_²˜_Ö—_æ“_*“_ö{_:{_¢x_x_Vm_žk_¦f_„e_Ne_®d_Š`_b]_:X_²I_ÂF_F_¸B_‚._X%_>%_Ø_ê_J_Þ_¼_Ž_¾_è _Ì _¦_J_º_þ_‚_Ôþ^Hþ^dý^Hý^ý^ ü^Öù^Ø÷^ñ^^ð^þí^Rç^^å^âÞ^öÒ^:Ò^&Ê^‚È^ÒÆ^ÒÂ^Â^ZÁ^´^~³^Þ±^.±^>®^‚­^ì©^Ä©^œ©^t©^ ¨^ð§^£^ž˜^øŽ^ÜŽ^nŽ^Ή^ˆ^‡^°{^z{^z^Fy^Šx^¢t^Ês^Ds^s^²k^öj^Vj^Âh^"h^2g^ `^ _^j_^tY^2U^*P^²L^ôB^Ž=^î5^N5^Þ(^(^'^Æ!^r^¾^ò^â^f ^^Š^Î^Ì^¤^|^Ø^°^ˆ^`^8^^è^À^˜^p^H^âô]^ô]²í]Æì]&ì]¢ë]vå]nâ]á]‚ß]Ü]ZÜ]âÕ]êÔ]úÐ]’Æ]òÅ]þÄ]Ä]rÃ]BÀ]’¿]¢¼]µ]\¯]¯]°¢]z¢]6¡]– ]î]"“]Ž]]îŒ]²†]…]]Bs]jr]zn]ªl] l]¸b]‚b]P]äH]¢<]n,]¦)]X$]"$]Ö!]š ]L]ú]]*]R]Ô]¬]„]\]–]Ú ] ]ž ]: ]F] õ\†õ\æô\`ô\Fô\Šó\ôÞ\ØÞ\Ö\†Õ\’Ô\"Ñ\2Î\ÖÌ\BÌ\*É\²Ç\`Å\*Å\ÚÂ\âÀ\f½\Ƽ\8¶\¶\èµ\Àµ\pµ\Hµ\´\à³\¯\ð®\V«\f¨\r§\š¦\ú¥\d¥\H¥\fž\B™\öˆ\†\,…\Ú|\¦s\ o\ n\„n\Nn\žl\6_\ú[\[\bZ\²Y\ÂV\,U\U\:N\†L\ÖK\K\TJ\¼F\zC\bA\l;\8\F7\Š6\Î5\¤.\b*\¦)\(\¦ \°\”\Ò \® \, \¢ \Ê \À\~ý[û[Jû[šú[f÷[öó[Œî[pî[þì[Nã[^à[êÞ[.Þ[VÝ[~Ü[ÎÛ[ÞÙ[fØ[ª×[0Æ[,Ä[¾À[À[n·[ʳ[*³[†±[J­[ˆ¬[¨¨[ª£["š[6‹["Š[~„[Ú€[€[â~[N}[öx[–t[ s[js[br[nq[rp[Úi[*f[D_[*_[6[[®Y[þX[hX[tV[HV[R[ÞJ["J[’E[B[,>[>[¾:[ü9[N7[’6[Ö5[&.[f,[ê%[ª![[ [J [~ [Î[[.[V[v[2òZñZåZ¦ãZfâZÒàZ¬ÕZFÔZ–ÑZÎÎZÎZTÈZÄZlÃZþÂZ¾Zb½Z¼ZFºZæ¶Z.³Zr²ZÒ±Zî­Z`¤ZÖ£ZB¢Z:¡Z¶ŸZ¾™Z*˜ZR•Z–”Zö“ZÊ‹Zz‰ZNˆZò†Zn†ZÎ…Z.…ZV„Zb~Z>oZJnZ(gZòfZfZ–eZBcZþ_Zž]Z²ZZüQZrQZbPZFZb>Z :Z*8Zz7Z¾5Zò4Z&4Z3Z"0ZÄ,ZV,ZŠ&ZBZZêZ®Z&Z@ ZêZ0ZÆûYûY:úY2ùYÆöY®ôYjòYtñY>ñY²îY*ìY ÜYÆÓYžÌYöÊYVÊYäÅYvÅYúºYö¶YÚ³Yš²YĬY²¨Y.¨YZ§Yž¦Y*¤Y6žY*˜Y¶ŒYƉYÞˆYF‚YºvY‚sY’pYºoYZnY2iYºgYF^Y>\YšXYöQYTOY®KY*HY–EYæDYöAY:AY2Yj YžY"Y YjYÊY~YÒYöYüXúXïXÒìXúëXžÖXþÕXŠÒXâÍXÃXæ½X.½XbºX–¹Xr¸Xb·Xú­Xf¬XÆ«X2«XvªXÖ©X¢¢XB•XôXNX‹XŠXž…X0~X¶zXúyXmX‚lXkXOW²LW6IW–HW¾GWàCW¸CWJ9WV8WÞ4W"4W¤3WL3WR.W:*W!W†W®W–W¾WæW’WpW~W^W"WWRWröVîõVNõVÒíV>íVÚéV¾ÛVÀÙV¤ÙVÐV¶ÏVÏV>ÎV&ÅVðÂV¸ÂVкVR°VV¯V~®Vn«V¡VŠ VöŸVFŸV–žV¢˜V6–V:‘V‚VþŒV–‹VæŠVö‡V ‡VŽ„V’‚VÖpVþoVoV¾cVcV`Vš^VÈ]V¬]VžNVjHVFAVê?Vb>VÂ=Vî5V4V*Vx)Vì(VÆ%V€ VJ VÔV¨V†VþV,VFVbôUÂóU0òUÞñUBñU\ïUæìU@ãU€âUšßU"ÏUøÌUÌÌUlÊUPÊU ÀUv¿Uâ¾U>»UºUЏUJ°U|®UD®U ¨Ub¤UV¢UþœUr›UŠšU|ˆUNƒUú€U¨}UŒ}UÆwU’tUâsUNsUŽrUžoUþnUB_U®^Uª]UÂ\Uö[UF[U WUêSU’RUªQUêNUúKUDUŒCUpCU:CUÒ7Uú6Uš+UŽ#UÌUŠU¾UÖU U¾ Uº U¶ UÆUàU´UðU¦ÿTîúTzöT†õThãT˜ÚT€ØT ÐTŽÂT¦¸TæµT¶¯T–¤TjŸT™Tb˜T”—T¾•T ”T.’Tr‘Tº…T…T®fT¸eT‚eTâdT¨aTž]TÒ\T"\Tr[T‚XT–WT¢ETòDTBDTvCTÆBT2BTB?T>Tº9Tb5T:4T†(T&Tö$T„T\T4T Tœ TV T~ TüTDT¼T”TlTˆüSÖêSþçSêãSàSfßS:ÞSØÚS†ÚSÂÊSÊS†¹SÞ¥S" SÆžSNSÆ•Sø”SÜ”SŠ”Sô…S¢…S¦tS4sSlrSDrSÜpSºlSôhSêfSbS¶^SbRSPJSøIS¸ISIShIS@IS¾BSbASä>SöR‚õRºÜR"ÍR2ÊRv´RޝR¯RT®Rü­RލRê¦Rj RºŸRZžRªR®šRÒ˜Rú—RØ“RΑR‰R.pR~oRÎnRnRìjRÀjR2[R’ZRàXRÚTR’ORüGR GRÒ)R~&R²%RÂ"RlRR®RRNRfRbRîÿQ–þQ®ýQÆüQÖùQÌøQ:óQ˜ñQŽèQþæQÏQFÎQzÍQÊÌQÌQ†ËQÖÊQ&ÊQvÉQÆÈQÈQfÇQ¶ÆQÆQÃQšºQæ¶Q(”QFˆQR‡Qê{QðzQÈzQ zQxzQ(zQzQ€wQwQšrQqQ„mQxkQkQ,jQÊiQ(iQÆhQhQ.gQ6fQFcQ¦bQbQnQQjPQö3QŒ3QH2Q 2Qî*Q"*QV)QÂ(QÒ%Q2%QÈ#Q #Q$Q¶QQQÊ Q6 Q( Qð Q–úP¢íP"çPÖÜP ÜP"ÛP2ØPžÖPþÕP²ÔPÔPÆÃP^ÂPÚ¾Pt¼PαPΪPªPn©P2§Pn›P–šPœ–Pt–PL–P$–Pü•PÔ•PJ‘PÌPtP4P PäP¤PLP$…Pü„P4„P „P˜}P*}PêuP6fPªaPfPP¶OP"OPbNPrKPÚ5Pª0P|.P,P,P®+P +PD*P*Pn%P:#P"PRP Pâ PòPPz÷O¢õOòôOBôO’óOªòOºïOîOníO¢ìOìOéOnèO²æOØäOpãO ÃO®±O"¯O:®O2­Of¬O¶«O"«OrªOŠ©OÚ¨OÊ¥OÚ¢OF›O–šOæ™Oþ˜O•OB”Ov“OÆ’Oú‘O‘O*ONO¬ŽOXŽOŽObOÎŒO:ŒOŠ‹O¾ŠOò‰O‰OJˆOš‡Oê†O†On…O~‚OÞOÚ~O‚}OF|OVyO°uO–uO\tOtOÜsOnoOnOrmO‚jO¾LOjIO‚HOÒGOêFOFO6EO0DOêCOCOnBO6?OFÅNžÃN¶ÂN"ÂNÁN¾½N¢·N³NбN"°Nr¯N®N®Nb­NrªN¾¨N ¦N¤ N| NT N, N NÜŸN´ŸNŒŸNdŸN<ŸNŸNF’Nz‘NZNªN’ŒN*‰N&ˆNR„N†ƒNž‚NüN¶N~~Næ{N`{N{NjzNÖyNByNÒuNêtN:tN¦sN¶pNPnNRbN~^N&^N†]N]NÊ\N”?Nl?NÚ6N.2NF1N6/N*+Nz*Næ)N6)Nî%N>%N"N~!NÎ N: NJNâN2NfN¶NNVNŠNöNFN²NNNVNÖNþåMØÜMÛMØMÖMðÔMÈÔM ÔMxÔMPÔM(ÔMÔMØÓM°ÓMˆÓM`ÓM¾ÍMRÉM¾ÇMbÂM²ÁMæÀM6ÀM†¿MÖ¾M&¾Mv½MƼM2¼MB¹M¢¸M·M¨²M€²MX²M0²M²M¥M®£Mþ¢M M¾“M“M^’M®‘M‘M†M–MŒMÊ‹M ˆMtM~MÌ|M–zMæyMRyM’xM¢uMuMòiM^iMÊhMÚeMÒdMæ_MŒ^MT^M^Mº]Mü\MÄ\MŒ\M*\Mz[MXM&UMTLM,LMLMÜKM´KMŒKMdKMMNMvMÒMJM`MþMvM2ýL.üLšûLêúLúLùLNøL^õLRòL¾ñL*ñLnëL¾êLêL&èLvçL>äLŽãLÞâLæáL6áLÞLÛLBÙLZØL:ÖLŠÕLÚÔLÈÓLÖÑLªÎL,ÎLÎLrÌLÂËL.ËLšÊLÊLFÉLÔ»L‚»LƱL±Lt°L.°L¨¯Lb¯L–®L®­Lª¬L«LÚªLªLº©L ©L>¨LV§LЦLŽ¢LžŸL®›L$…Lü„LÔ„L¬„L~~LÎ}L}Ln|L¾{LÎxLfwL¶vLöuL*uL^tL®sLþrLNrLžqLîpL„pLhpLpLVoLflL¢eLÖdL dL"cLVbL´aLnaL†`L‚_L~^LzXL~WLüVLàVLªNL˜ILpILHIL ILøHL6DLr0LÞ/LJ/Là.Lš.Lê-Læ,L®)Lþ(LN(LJ'LÄ&L~&L:"L6!Lj LîL* LR L.LîôK>ôKŽóK~ñKÎðKðKnïK¾îKîK^íK®ìKÆëKÞêKêKFéK–èK®æKþåK–äKÊãKþâKxâK2âK‚áKšàK²ßKßKnÞK¾ÝK’ÚKf×KâÕK¶ÒKÒKVÑK ÐK>ÏKrÎKÂÍKöÌK*ÌK^ËK’ÊKþÉK¶ÆKîÂK"ÂK>¾K¼Kb»K²ºK,ºKºKʹK¹K”¸KN¸Kä·KÈ·K‚·Kü¶Kà¶Kš¶Kl³K&³KV­K ¬KZ«KªªKF§Kú¥KJ¥Kš¤KR¡KnK¢œKž›KÒšKšKV™K ˜KZ—Kª–Kú•KJ•Kš”Kê“K¾KK^K®ŽKŽKNKžŒKî‹K>‹KŽŠKÞ‰K.‰K~ˆK·K‡Kn†KBƒKv‚KÆKKf€K¶KKV~K¦}Kö|KF|K–{KÊzK¨yKbyK²xKxKnwK¾vKvsKšrKêqK:qKŠpKÚoKoKlK¶gKgKrfK²eKÂbKtYKLYKêšJŽ™JÞ˜J’—Jâ–J2–Jf•Jš”Jê“J:“JŠ’JÚ‘J*‘JÀJ¤JBJ’JŒŽJFŽJ–JæŒJþ‹JÒˆJn…J¾„J„JJF|JæzJòxJðnJÈnJ nJxnJmJàlJ¸lJlJ@lJlJ°hJˆhJ¼_J”_JQJPJ€MJzJJ’IJrHJDGJþFJn@J¾?Jò>JB>J’=JâB¸'Bì&BH&B€BhBÌBðB¬BB4BðBTBxB4B˜B¼BxBÜBBtB¼B¨B BBD B Bd Bˆ BD B¨BÌB´BB0÷AdöAÀõAìÞA ÞA|ÝAh¸A°·A(·ARŸAì”A4”A¬“AüA.AüA.Aü}A.}Aˆ|Aü{AÐ{AH{A.{AüyA.yAüwA.wAvAJuA4tAfsAôWA@¬=@h<@Ì;@ð:@¬9@9@48@ð6@T6@x5@44@˜3@¼2@02@x1@d1@Ü0@À0@0@¼.@ .@D-@,@d+@ˆ*@p)@Ô(@ì@ @|@ô@(@„@ Ó?èÒ?`Ò?¯?\®?Ô­?ˆ›?(›?Œš?xš?ð™?Ô™?¼Œ?Œ?|‹?rq?(;?H:?ˆ9?H%?h$?¨#?˜ ?¸ ?ø ?Dî>dí>¤ì>ðÐ>Ð>PÏ>œ³>¼²>ü±>$§>ø¥>@¥>¤>¬¢>ô¡>¸ >`Ÿ>¨ž>l>œ>\›> š>Ș>˜>Ô–>H–>|•>h•>Ä”>¨”>ˆ“>0’>x‘><>äŽ>,Ž>ðŒ>Ä‹> ‹>ôx>x>Tw> [>ÀZ>Z>¸,>,>x+> >8 >” >ú=Hù=¤ø=ää=ä=tã= Ì=ÔË=0Ë=\´=³=ì²=œ=L›=¨š=à‘=È=,=P= Ž=p=”Œ=P‹=´Š=؉=”ˆ=ø‡=‡=Ø…=<…=`„=Ôƒ=ƒ=ƒ=€‚=d‚=¤=`€=Ä=è~=¤}=}=,|={=xz=k=Äj= j=LS=€R=ÜQ=Ä.=ø-=T-=>=ž=Ø= =˜=€Ú<´Ù<Ù<È<ÄÇ< Ç<`³<”²<ð±<›<Pš<¬™<Ø‚< ‚<h<”j<Èi<$i<\`<D_<¨^<Ì]<ˆ\<ì[<[<ÌY<0Y<TX<W<tV<˜U<TT<¸S<ÜR<PR<˜Q<„Q<üP<àP< P<ÜN<@N<dM< L<„K<¨J<I<ôH< :<@9<œ8<È!<ü <X <е;µ;´;`9¨9 9þ8èì8Ìì8´ì8Œì8 ê8ê8ìÂ84Â8¬Á8<º.„¹.ü¸.hž.œ.øœ.xŒ.¬‹.‹.Hw.|v.Øu._.8^.”].ÀF.ôE.PE.|..°-. -.D$.,#.".´!.p .Ô.ø.´..<.ø.\.€.<. .Ä.8.€.l.ä.È..Ä.(.L..l..x .Ü .ôý-(ý-„ü-°å-ää-@ä-NŸ-(’-Б-¶‘-D‘-‘--v-(†-Z…-¬„-”ƒ-ø‚-‚--h€-Œ-t~-Ø}-ü|-œ|-ä{-Ð{-H{-,{-lz-Ty-¸x-Üw-Äv-(v-Lu-Œt-Hs-pr-œq-q-$p-do-n-8m-dl-Èk-ìj-ôd-Xd-¸b-€Y-zX-X-:W-dJ-¬I-$I-ª-P-˜--€[*¤X*êW*hW*®V*,V*rU*ðT*6T*Q*NP*ÌO*O*ÈL*L*ŒK*ÒJ* ù)øø)è÷)”÷)þ„)–È'!Â- xtòííàì0ì€ënãæáôàÜà°Ç˜Çx¨¬¤У¤£–gÊê|:ž/|T<ŠÌIz´Ö¯O–#Æhà0€Ðæ|zW~UrSÖ!!Zªfæ6jV¦ÚRî¬ô ¼¨n ¨nj¨nä¦nÔ¥ndŸn.Ÿnnäœnœ™n´˜n¨•n€nìnÐn˜n”‡nx‡n ‚nx€n nè~n˜|nüznâznÔynœynPwn4wnwnvn´tnšrnøqnpkn4jnèen²endndnäcnÈcn¤bnanò]nŠ]n[nìZn´ZnøRnxNn¼Jn¸GnxFnøDnÞDnDnÌCn0An<@nH?n,?nô>ndlÀ=l,j=jÄiÄ>i@ÖfœÌfpËfbÊf*Æf¿fpºf”¸fx¸fȯfªftªfXªfÀ¥f¤fÜ£f fÜŸf¸œf†šf˜™f —f •fj•f°”f””fx”f^”fô“fôfØfä‹fˆ‡fè†fh‚fL‚fÈ€f €fð|fèxfJwf^vfvfeÞ;eÌ8e°8eX6e6e5eœ0e¸.e€.ed.eH.e -e¸(eœ(eŒ'eT'eú%e„$eŽ"eØeje°e”ehezeäe”eðeÔe eøehe@eeðeÈe eà e¸ e eh eÐ e¨ eüeheþdfùd¨ødpødTød¸÷däôd,ódØòd¤ñd,ñdÌíd4édéd¼çdædtæd¸ådHãd4àd˜ØdPÓdÔÑdTÊdœÇdxÆdhÅdLÅddÄdHÄdöÃd Àd’¿d(¿d ¿d`½dÜ·dvµdÔ´dœ´dH´d¬³dX³d>³dœ²dH²dd®dH®d¨­d¶¬d2¬d¦d8¥dD¤dð£dh¢d¼ŸdÊ“dj’d’dä‘dÈ‘dàdŒd(dXŽd<ŽdŽdЇd˜‡d ƒd¨ddÔ{d€{dd{dLsd`rd rd4qdüpdhkd@fd|ddŒcdd_dH_dŒ^dV^dì]d \d\dèZd°ZdÄVd UdLUd´TdÄSd¨SdpSdPd¨LdpLdGdØFd FdÐCd`CdèAdÊ>d°8d$7d‚0dÐ/d˜/dD/dl.dP.d°-d\-dB-dä+d+dJ'dT%dœ!dd!dô dp d¸dDddüdxd@dXd<d d¨d¶ddÜd˜dld°d¼ûc$ùcìøc”òcïcðícÈíc”çc^çc<äcäcìãcÄãcœãc´ác|ác`ácFácxØc@Õc$ÕcÕcìÔcÐÔc´ÔcÌÒcÀÌcˆÌcðÈcºÈcDÇc(Çc Çc:ÄcÂctÂcŒÁcdÁc°¾cà½c½ch½c½cð¼cȼc ¼c¼c¹cü¸côµcصc¸¬cªc ªcªcˆ§cœ¦cü¥cÜ£cÀ£ccœcìšc´šc–cÚ•cÀ“c¤“cP“cTc´Œc¼ˆch‡c2‡câ„c܃cÀƒcè‚c0‚cL~c0~c~cø}cÜ}cÀ}c {cäzc®zcDzcðycycàxcÄxc¨xcÀucxucttcXtc€rcÄqcÜpcÀpc‚lc`¨>`Ô<`¸<`„8` 7`2`Ü1`|-``-`(`|'`Œ#`´"`€ `œ`€`Ô`Ð`.`Ä`p`8``ð`¸`þ `( `x `æ`Ð`Ð`Ä` ý_Ìü_ôû_ˆú_Üø_ìõ_šõ_Xó_pñ_Øð_¢ë_&æ_Œã_pã_°á_ôà_†à_Þ_ôÖ_ÈÔ_Ò_°Ñ_ Ð_äÏ_¼Ï_”Ï_lÏ_8Ê_4Ç_ Ä_$Ã_Ã_ìÂ_´Â_šÂ_Â_ØÁ_ˆ½_l½_L»_€·_ж_µ_8¯_`®_«_|©_Œ£_d£_´š_š_~‘_`‹_D‹_(‹_Š_ê…_€…_d…_…_„_ˆƒ_Ô|_€|_|_˜w_Pv_4v_v_üu_àu_Äu_¨u_Œu_(l_ l_ðk_xj_\j_¸h_œh_€h_øf_¼e_ e_¨^_ä\_pX_V_hV_PT_(T_0Q_Q_P_P_ØO_ N_æK_ØD_ˆD_"C_B_ÈA_®A_h?_p9_ü2_È0_ 0_x0_N0_Ô)_¼#_ "_˜_\_ü__à_,__ _8___h _ð _¨_V_€_X_äÿ^vú^°ô^xô^^ô^ðò^¤ä^|ä^ ã^äâ^¼â^”â^lâ^ôá^`Þ^Ü^¸Ú^œÚ^€Ú^dÚ^HÚ^,Ú^Ú^ôÙ^¼Ñ^”Ñ^lÑ^DÑ^Ñ^ÄÎ^œÎ^tÎ^LÎ^$Î^ÔÍ^¬Í^Ì^Ç^"¸^î·^´·^d·^B·^·^ü´^¨´^8´^ø²^$²^j«^’ª^¬¥^¥^t¥^d£^H£^Ž¢^$¢^Ò¡^”ž^D™^ ™^\—^$—^—^|^ˆŽ^^Œ^è‹^À‹^Tˆ^8ˆ^|‡^†^h†^ }^¨z^pz^Tz^|y^(w^¬m^ m^„g^hg^Lg^„f^Lf^Üc^àa^ì^^Ä^^\\^@\^$\^,W^W^xU^”T^¶Q^M^èL^,L^\K^4K^ K^äJ^¼J^(I^ÖH^@H^¨B^4>^ü=^Ä=^¨=^:^¬4^t4^X4^´1^P1^1^è0^À0^˜0^p0^H0^€/^X/^0/^/^à.^¸.^ä+^È+^<(^('^X&^0&^f^ø^°^ ^l^ü^°^”^N^È^¬^f^^Ü ^´ ^Ô ^Œ^^¸þ]ü]ˆú]`ú]8ú]Bø]¬ö]°ñ]@ï]ï]ìî]´î]@ì] é]é]Øè]°è]ˆè]`è]8è]hæ]å]ðä]|ã]Fã]Üâ]„á]há]Lá]¸Û]€Û]dÛ],Û]Û]TÚ]8Ú],Ø]¢×]dÍ]HÍ]ÄÌ]¨Ì]@Ë]Ë]ˆÅ]ÀÀ]¤À]»]èº]¹]à¸]¸¸]¸]h¸]@¸]´]س]¼³]³]²]ô¯]ü«]£]è¢]¢Ÿ]´œ]X—]—]\•]Д]¨‘]Œ‘]p‘]TŒ]xŠ]PŠ]8…]„]̃]Ä]]è€]À€],]Œ~]à|]¨|]Œ|]T|]:|]¤{]{]´z]Œz]dz]c]È\] \]ˆV]`V]ìS]ÐS]úR]äQ]ôM]¬J]„J]\J]E]ìD]ÄD]>],=]¼<]Ü,]¤,]è+]Ü)] )]|#]T#]ð!]Ð ]´ ]0]d]L]ú]]ô]Ì]À]ˆ]l]]p ]\]Œ]T]]]ä](ý\Xü\|ú\ø\Xø\Øñ\Œñ\dñ\<ñ\í\Hë\Øé\°é\€â\â\HÝ\LØ\$Ø\ü×\ÄÓ\\Ï\BÏ\Í\`É\,Ç\öÆ\vÂ\´Á\\À\$À\à¼\à»\¸»\Ž»\t¹\L¹\$¹\ü¸\„·\˜µ\ø´\д\¨´\€´\X´\0´\¸³\³\h³\@³\³\„±\h±\±\€°\X°\0°\°\¸¯\h¯\@¯\È®\Ĭ\¨¬\¸«\œ«\ì¦\D¤\ ¤\@£\6œ\¸›\›\x™\„’\\’\˜\,Ž\h\ðŒ\d‹\‹\ìŠ\ÄŠ\D†\|…\T…\lz\z\ y\u\xt\@t\(s\s\ m\Ôl\¸l\Òk\Xk\àj\j\h\”g\lg\e\dc\¼]\ ]\”\\x\\t[\DV\|U\TU\DI\ðH\ôB\˜A\ø@\X>\0>\>\à=\¸=\Ž=\(9\ 9\º8\(5\5\ˆ4\3\°1\1\\/\&/\d-\J-\´,\ˆ'\P'\ø"\Ü"\Ð!\L\0\¤\\ì\Ä\œ\r\8\H\ÿ[àþ[þ[Ðý[´ý[lò[Dò[ò[ôñ[´ñ[Œñ[Ôé[œé[dé[Hé[¨è[å[ðä[„ß[hß[Lß[ŒÝ[ìÜ[ÐÜ[´Ü[<Ù[ŒÖ[dÖ[<Ö[¬Ò[ÜÑ[tÑ[LÑ[$Ñ[üÐ[ÜÎ[´Î[.Ì[pÉ[pÇ[øÆ[ÄÂ[¨Â[pÂ[¼»[D»[h¹[”¶[е[¼§[”§[,¦[à£[¤¢[|¢[ ¡[ˆŸ[L[[d›[h–[L–[À”[¤”[ˆ”[ “[¼’[l’[‘[ì[[è[ì‡[À†[¤†[†[„[”[\[4[[Üz[Hy[y[xx[ˆw[`w[8w[¼s[Àq[¤q[p[ìo[vj[ i[°e[e[àc[ì`[¤^[^][ø\[°Z[„X[´W[Z3Z+Z¸ Zœ ZZäZÈZÜZÀZ¤Z Z„ZhZàZŽZJZLZ@ZÈZ ZxZTúYüöYØõYõYäôYôY¼òYñYÜïY¤ïYRïY|ìYøèY¨èYXèY0èYXæY(æYTâY8âYæáYìßY@ÜY`ÙY×Yh×YðÖY$ÎY ÎYÔÌYŒÊYðÇYÌÁYÁYĽY¨½Y·Yx¶Y³YD±Y±Yì¬YÀªY¬£YŸYÜžY¤žYüœYÔœYªœYØšY°šYˆ–Y¬”Yt”YÀ“Y€“Yˆ‘YÌY°YY‰YHˆYˆYȃY¬ƒY´‚Y|‚YYL€Y$€YÔY4Yä~Y”~YD~Y|}YT}Y„{Y\{Y {Y¼zY”zYlzY pYnYôlYÌlYìiYÐiYðgYTgY,gY´fYŒfYdfY­Xœ¬XȪXܨX ¨Xä§X,¦X¤X,£Xô¢XžXÚX¦XrX>X XÖœX¢œXnœX:œX\•Xt”Xè’XÀ’XäŒXdŠX¾‚X\€X4€X €X${XpwXHwX wX¨tX€tXÐpXènX°nXxnX¸lXlXŒkX¿V8¼V¼V$¶V¶VìµVеVÀ´Vô³V³Và²V±VЮV´®VÄ¥V¥VФV„£Vh£V8£VؘV˜Vl–VŒ“V°’VVr~V>~V ~VÖ}V¢}Vn}V:}V}VÌ|V¤|V\yVäxV¼xVlxV vVVV€VVhV@VœV˜V|VˆVV€ÿUdÿUHÿU,ÿUZüU¼õU„õU˜ôUXóU<óUòUÄðU$ðUíU4ìUþëUêUìèU çUøæUÐæU¨æU„äU\äU8ÝUÝUÝUäÜU„ÖU˜ÕUpÕUHÕUÐÓU¨ÓUèÍUpÍU ÍU°ÉU&ÉUüÃUàÃU,ÃUPÀUä»UÈ»U»Up¶U8¶UµUT¯Uð¬UȬU ¬Ux¬UP¬U(¬U¬UØ«U §U  UŸU›Uü˜UÔ˜U¬˜U„˜U\˜U4˜U ˜Uä—U¼—Ul—Uì•UD“U”‘Ul‘UD‘U‰Uì‡U‡ULUH~UÌ{UDyUàwUØtU(tUpmUHmU mUølULkU jUÔiU¸iUheU@eUeU,cUôbU†bUbUÈaUD^UÈUUØTU TUhTU€SUHSUSU(RU@QUQUÐPUØIU°IU8IUIUèHUÀHU˜HUpHUHHUÔ@Už@U8@U@U˜?Up?UH?U ?Uø>UÐ>U¨>U€>UX>U0>U¸=UŽ=Uð;UÈ;UP;U(;U;UØ:U$8UL7UX3U03U3Uà2U|2UÔ.U¬.U4.UŒ,U´+UÌ*U)Uä(UÈ(U¬(UÔ'Uœ'U° UôUìU,UôU8UU<UUðU\U$U UT U8 U UP Uü UHU¨UØUUøÿT$ÿTìþT´þT˜þTþTýTtýTXýTüTüûT0úTÜùT¬ùT„ùT\ùTäøT¼øTØõTDôTôTôóTÌóTñTtñTXñT<ñTDíT„ëTèéT˜éTHéTTçT˜âT¨àTÐÚTpÙTHÙT ÙTøØTÐØT¨ØT¸×T×TÕTìÔTÄÔTàÐT˜ÎTøÍTÐÍT¨ÍT€ÍTXÍT0ÍTÍTàÌT@ÊTDÅTôÁTÌÁT¬¾TܸTp¶T µTœ´Tr°Tì¯T¯Tè®Th«T@«TðªT@©T$©T̤T(¢Tì›TÄ›Tè–Tô•Tœ’T€’T‘TÐT˜T|T(T`‡T4…TL„Tœ‚Td‚TH‚T,‚TD{TdzTS8R¤:Rd:R<:Rü6R$5Rt3RÄ1R0RÜ+R,!R” Rl RD R RôRÌR¤RäRdR„R\R4R RäR”RlRTR,RRÜRÄRœRR° Rˆ Rø RÐ RPRRDR RäRüRøRÜRÀRˆRPR„ÿQhÿQ,þQôýQDýQ ýQlùQ6ùQôöQ$õQÖñQïQ îQ(îQîQØíQ°íQnëQ¼êQ¸éQÄèQtÜQ ÜQäÛQÜØQ´ØQŒØQdØQ<ØQì×QÀÕQ ÔQ¨ÓQêÐQ ÀQxÀQh¹Qð¸Qh¶Q@¶Q`³Q0³Q³QȲQx²QP²QرQˆ±Qà¯Q¯QÜ­QĬQ\¬Q´ªQ©Q|¨Q ¥QZ¥QŒ¢Q*¢Q  QÆŸQ –Qø•QЕQT“Q‘Qh‘Q@‘Q‘QðQÈQ QxQPQ(QˆQ`QŠQÀ‡Ql‡Q|„QT„Q,„Q„Q´ƒQPzQ°yQˆyQ`yQ8yQyQèxQìtQ@sQsQìrQômQØmQ mQhmQ°lQ”lQ\kQjQ iQ\hQgQtgQh[Q@[QðZQàXQ¸VQìQQ°PQŒKQdKQQp;QH;Q ;Qø:QÐ:Q¨:Q€:QX:QŒ8QÀ2Q˜2Qp2QÐ1Q¨1Q€1Q/Q,-Q4+Q¸)Q QðQlQPQ4Q8Q„QQQLQ¼Q Q„QhQLQøQÐQ¨Q¼QÌQôýPÜüP´üPŒüPdüP<üPh÷PìõPœõPtõP˜óPpóP:ñP´ðP~ðPÈçPçPœæPdæPÐãP˜ãPRãPèâPÌâPjâPâPäáP‚áP’ÞP8ÓPÓPäÒPÒPìÑPÄÑP ÐP|ÏPTÏP,ÏPÜÌP´ÌPŒÌPdÌP<ÌPÌPìËPÄËPœËP„ÊP\ÊP4ÊP ÊP”ÉPlÉPDÉPÉPôÈPÌÈPÄPX¼P ²P¼¯Pà¬Pª¬Ph§Ph¢PŸPØžPèšPÌšPšP¬•P„•P\•P4•P •Pä”P¼”P@“P PL…P„„P\„PäƒP¼ƒP€xPXxP0xPxPvPXvPPÄ>Pœ>Pt>PL>P$>Pü=P\=P4=P¼9P8Pô5P45Pä4PX3P.3Pü0PL/P/P ,Pp,PH,Pò)P¸)P)PÐ"P˜"P`"PÌ PXP0PÈPˆP¤PlPP°P~P¤P( PPàPÄPTP,P°÷OôöOöO8õOèçOøæOHæO°äOâOÝOàÛO0ÚO€ØOÐÖO ÕOpÓO°ÑOÐOPÎO ÌOðÊOÉOhÇO¸ÅOÄOÈÃO˜ÀOè¾O¨¾O »Oð¹O@¸Oô±O0±O±Oh¯O€®Ox­O¬¬Oü«O ¨Ol§O¢Oä¡O¬¡O¸ Oœ OìŸOÔžO¬žO„žO\žO4žOÄ›OÜšO|™O`™O–O “O@’Ot‘OX‘O¨O”O‹O8ŠO\‰Oà‡Od†Oœ€O€€OXOp~OT~O8~O~OÈ}O}Oü|OoOLnOägOcOôbOpbOTbO8bOO OTÿN8ÿNÿN„þN\þN4þN4úN úNäùN|öNTöNLóN¸ñNÄðNçNØæN°æNˆæN`æN8æNÀåN˜åNpåNHåN åNÄâN@ÜNˆÛN ÚN€ÏNèÎNÀÎN˜ÎNpÎNVÉN.ÈNÄNüÂN€ÁN¾Nô½N½Nì¼NļNœ¼Nt¼NܹNÀ¹Nˆ¹N¹N̸N°¸N”¸Nü¶NT³N ±N¨­N\¦NŒ¥N´¡N˜¡Nb¡N8–N–Nè•NÀ•N\”N¼N¤‹N`ŠNDŠN¤ˆNlˆÑNƒNƒNä‚N‚N~NØ}Nˆ}N|{N°zN4vNLuN€tNjNÈiN¶gNdgNÀeNdNôcNÌcN$YNüXN„XNZXNÜUN´UNìTN„JN\JN4JN JNäIN¼IN”INDININôHNÌHN¤HN|HNTHN,HNHNÜGN´GNŒGNdGNNp=NH=N=N8:N 7N¨1NŒ1Np+NÀ*N4&N(NÐNŒNN<Nì N¬ N„ N\ N4 NäN¼N’N”N\N$NHN NöNDýM¶úMXúM0úMúMàùM¸ùMùMhùM@ùMùMðøMÈøM øMxøMPøM(øMøMØ÷M°÷Mˆ÷M`÷M8÷MBõMtôMòMôñMðïMÈïM ïM`ïM ïMêM èM8èMèMèçMæM<åMåMÀàMPßM`ÛM¤ÕMÐÑMÜÏM´ÏMŒÏMdÏM<ÏMlÉM ÈMl¾M¼½M ¶Mx¶MÈ­Mx­M(­MجMˆ¬M8¬Mè«M˜«MH«M «MøªMxªM^ªM¼©M ¥M„¥MÒžM–žMZžM œMò›Mt›M¬šM™ML—M|–MT“M ‰MȈM0‡M<‚MüM\M´}M||MT|MÜzM,zMTjM8jMeM(bMbMØaM°aMà^M^MP]Mp\MÀ[M>M(>M;Mú:M¨9Mp6M\3M´*Mè)M`M°MäMÈMàMˆM8Mà M¸ Mx MP M( M M°ýL¬üL€úL˜ùL°øLôL ÓLPÅL(ÅL˜ÃLpÃLHÃL ÃLøÂLܾL<¾L¾Lì½LĽLüºLP¶LªL ¦L ŸLøžLОL0žLžLàL¸LLhL@L0›L›LàšL¸šLšLhšL@šLÜ™LØ—L`—L8—L—Lè–LÀ–L˜–Lp–LH–L –Lø•LЕL¨•L€•LX•L0•L•Là”L¸”L”Lh”L@”L”Lð“LÈ“L “Lx“LP“L(“L“LØ’L°’Lˆ’L`’L8’L’Lè‘LÀ‘L˜‘Lp‘LH‘LäL¼L¸ŽLŽLhŽL ŒL4‰L ‰Ld…L?h=?¨°ð>ðï><Ô>\Ó>œÒ>xÄ>LÃ>”Â>XÁ>À>H¿> ¾>´¼>ü»>Àº>h¹>°¸>t·>è¶>¶>¶>dµ>Hµ>(´>в>²>ܰ>„¯>Ì®>­>8¬>€«>Dª>©>`¨>”™>´˜>ô—>@|>`{> z>ì^> ^>L]>¸.>.>x->”>È >$ >¤ü=Øû=4û= ç=Ôæ=0æ=\Ï=Î=ìÍ=·=L¶=¨µ=$ª= ©=p¨=”§=P¦=´¥=ؤ=”£=ø¢=¢=Ø =< =`Ÿ=Ôž=ž=ž=€=d=¤œ=`›=Äš=è™=¤˜=˜=,—=è•=L•=p”=X“=¼’=†=Ä…= …=Ln=€m=Ül=V=*Ð=*=*Ì:*:*9*Ö8*°õ)œõ)Œô)8ô)^¶&î±&¼©&Щ&f©&0œ&Dœ&Ú›&¼š&¬š&D`%`%ì_%À_%h_%<_%_%ä^%Œ^%`^%ì]%d]%J]%”\%z\%€Z%fZ%š9€0ÌŽòròrÿn Úî ðd,< pذˆ`ð € X   ô P4d<Ôü ª3mz%lÌ‚h$~hü}hX}h>}hÞ™g’Éc0ü\ü\ vZØ«R$LNüKN0QJXMJl˜Ix|I¬{I{IˆjI¼iIiI°UIäTI@TIl=I H¤=H=H,BÌ=Bˆüó><ó>Ìá> à>èß>¬Þ>TÝ>œÜ>`Û>Ú>PÙ>Ø>ˆ×>¼Ö>¨Ö>Ö>èÕ>ÈÔ>pÓ>¸Ò>|Ñ>$Ð>lÏ>0Î>ØÌ> Ì>äÊ>ŒÉ>ÔÈ>˜Ç>lÆ>´Å>4º>T¹>”¸>àœ>œ>@›>Œ>¬~>ì}>8b>Xa>˜`>àA>´A>0A>Ø@>¬@>¤4>¸0>0>x/>$>X>´>4ÿ=hþ=Äý=\ê=é=ìè=Ò=LÑ=¨Ð=hÂ=PÁ=´À=Ø¿=”¾=ø½=½=Ø»=<»=`º=Ô¹=¹=¹=€¸=d¸=¤·=`¶=ĵ=è´=¤³=³=,²=è°=L°=p¯=,®=­=´¬=œ«=«=¡=Ä =  =L‰=€ˆ=܇=q=<><@'<t&<Ð%<й;¹;¸;`9¨9 9ìÆ84Æ8¬Å8œ¢8€¢8h¢8@¢8<¾.„½.ü¼.ˆ£.¼¢.¢.˜‘.Ì.(.À|.ô{.P{.|d.°c. c.ÌT.´S.S..d=.ô3.(3.„2.°.ä.@.l. .ü.(ë-\ê-¸é-€”-(”-”-œ“-p“-è’-Î’-¼-ð€-L€-dN-¬M-$M-º-`-¨- -ˆ7*¬4*ò3*p3*¶2*42*z1*ø0*>0*-*V,*Ô+*+*Ð(*(*”'*Ú&*Tò)@ò)0ñ)Üð)ü8.¸ÔêœnX@n˜ïjðêjÈêj$êj êj¸Ãj¿jè¾jD¾j*¾jVThZæg‚¶fff`åe8åeÆïcö_Ȧ_ ¦_x¦_P¦_(¦_Èÿ^®ÿ^™]h™]@™]™]ø•\Е\¨•\€•\„a\H@[ @[¦?[ÌÊZ¤ÊZ|ÊZTÊZìeYÔdYJPX¼V4NT¼RdR<RRìRP¶M(¶M¶MصM°µMˆµM`µMÌÓJ¤ÓJ|ÓJTÓJ,ÓJÓJXQJ¤ìII<~I˜}ImILlI¨kIlXI WIüVIFIèDILDIpCI,BIAI´@I(@Ip?I\?IÔ>I¸>Iø=I´CÌ=C0=CTôý><ý>ü>¨ú>ðù>´ø>(ø>\÷>H÷>¤ö>ˆö>hõ>ô>Xó>ò>Äð> ð>Ðî>xí>Àì>„ë>,ê>té>8è>àæ>(æ>ìä>Àã>ã>ÔÚ>ôÙ>4Ù>€½> ¼>à»>, >LŸ>Œž>Ø‚>ø>8>„e>¤d>äc>¸2>2>x1>´>è>D>Ä>ø>T>í=Lì=¨ë=¬Ú=”Ù=øØ=Ø=ØÖ=<Ö=`Õ=ÔÔ=Ô=Ô=€Ó=dÓ=¤Ò=`Ñ=ÄÐ=èÏ=¤Î=Î=,Í=èË=LË=pÊ=,É=È=´Ç=pÆ=ÔÅ=øÄ=àÃ=DÃ=¼=Ä»= »=L¤=€£=Ü¢=Œ=<‹=˜Š=Äs=ør=Tr=€[=´Z=Z=t6=¨5=5=Ø = =˜ =0â<dá<Àà<@Ð<tÏ<ÐÎ<”»<Ⱥ<$º<(©<¨<t§<˜¦<T¥<¸¤<Ü£<P£<˜¢<„¢<ü¡<à¡< ¡<ÜŸ<@Ÿ<dž< <„œ<¨›<dš<È™<ì˜<¨—< —<0–<ì”<P”<t“<\’<À‘< ‹<@Š<œ‰<Èr<üq<Xq<„Z<¸Y<Y<@B<tA<Ð@<ü)<0)<Œ(<л;»;º;`9¨9 9ìÈ84È8¬Ç8<À.„¿.ü¾.¦.L¥.¨¤.(”.\“.¸’.|.°~. ~.m.øk.\k.€j.F–>F *FL)F”(FT(Ft'FZ'Fè&F¨&F&Fê%FPFðF8F FHF.F¼FFFîF@ FìõEPõEÈôEìåE|åEPåEÈäE®äE0áEÀàE”àE àEòßEhÇEÇE@ÆEÆEPÅE6ÅEÄÄE˜ÄEÄEöÃEì†E|†EP†EÈ…E®…EœME,MEMExLE^LE€KEÈJEœJEJEúIE¨éDHéD€èD¼çDçD|æD0¿DÀ¾D€¾DܽD½DL»D”ºD ºDÔ­DH­D¬Dd¬DP¬DÈ«D¬«D’«D8’DÈ‘Dœ‘D‘DúD‹DHŠD¤‰D$yDXxD´wDeDìcDPcDtbD0aD”`D¸_Dt^DØ]Dü\D¸[D[D@ZDüXD`XD„WD@VD¤UDÈTD„SDèRD RDôPDXPD`LD”KDðJD4DP3D¬2DØD DhD”DÈD$DPëC„êCàéC ÓC@ÒCœÑCp»C»C ºCtºC`ºCعC¼¹C¢¹C©C¤¨Cx¨Cð§CÖ§CȤC¤Cä£C\£CB£C(”Cœ“CH†C†C†C€…Cd…CJ…C¤ƒC ƒCœ‚Cp‚CäC,CÔ€C¨€CÄCˆCä~CÊ~C|zC°yC yCŒhCÀgCgClTCTSC¸RCÜQC˜PCüOC OCÜMC@MCdLC KC„JC¨ICdHCÈGCìFC¨EC EC0DCìBCPBCtAC\@CÀ?CÈ;Cü:CX:C„#C¸"C"C@ Ct CÐ CüòB0òBŒñB¸ÚBìÙBHÙBtÂB¨ÁBÁBتBxªBªBÜ©BÈ©B@©B$©B ©BħB8§B€¦BT¦B@¦B¸¥Bœ¥B‚¥Bä¡B¡Bt BôB(B„ŽBÔ{B¼zB zBDyBxBdwBˆvBDuB¨tBÌsBˆrBìqBqBÌoB0oBTnBmBtlB˜kBTjB¸iBÜhBÄgB(gB0cBdbBÀaBìJB JB|IB¨2BÜ1B81BdB˜BôB BTB°BÜéAéAlèA@ÒAàÑApÑADÑA0ÑA¨ÐAŒÐArÐAŒ®A,®Ad­A ¬Aè«A`«AäŠA„ŠA¼‰A‰ÄA²ˆA@ˆAˆAŒ‡Ar‡A¤tAtA€sAPA OAtOAìNAÒNA4)AÔ(A (Aà'A'A'A&Ad&AÜ%AÂ%A°AðA(Aè A Aî A| A< A˜ A~ Aþ@”ò@hò@àñ@Æñ@HÔ@ØÓ@¬Ó@$Ó@ Ó@ôÉ@”É@4É@ôÈ@PÈ@6È@ Ä@ÔÃ@0Ã@°²@ä±@@±@ž@x@Üœ@œ@¼š@ š@D™@˜@d—@ˆ–@D•@¨”@Ì“@ˆ’@ì‘@‘@Ì@0@TŽ@@tŒ@˜‹@€Š@ä‰@ì…@ …@|„@¨m@Ül@8l@dU@˜T@ôS@ =@T<@°;@Ü$@$@l#@Øü?xü?ü?Üû?Èû?@û?$û? û?ù?Hø?ø?”÷?z÷?è?ÔÛ?Û?ðÚ?hÚ?NÚ?¼Ë?\Ë?¤Ê?xÊ?´É?šÉ?(É?üÈ?tÈ?ZÈ?Ä»? ¥?¬¤?ä£?¸£?ô¢?Ú¢?h¢?<¢?´¡?š¡?´‚?T‚?Œ?`?œ€?‚€?€?ä?\?B?¨G?ÈF?F?È1?è0?(0?(?ü?D??°?ø?¼?d?¬?p??` ?$ ?Ì ? ?Ø?€?È?Œ?4?|?@??\?tû>”ú>Ôù> Þ>@Ý>€Ü>ÌÀ>ì¿>,¿>x£>˜¢>Ø¡>$†>D…>„„>Ðh>ðg>0g>´H>TH>”G>G>@F>F>ìE> E>ðD>ÖD>dD>$D>D>lC>PC>6C>°">P">ˆ!>\!>˜ >~ > >à>X>>>D>x>Ô>T>ˆ>ä>4ð=ï=€î=¤í=`ì=Äë=èê=¤é=é=,è=èæ=Læ=på=,ä=ã=´â=pá=Ôà=øß=´Þ=Þ=<Ý=$Ü=ˆÛ=×=ÄÖ= Ö=L¿=€¾=ܽ=§=<¦=˜¥=ÄŽ=ø=T=€v=´u=u=<^=p]=Ì\=ÀC=`C=C=tB=¬A=€A=lA=¨@=Œ@=r@=@=Ô?=À?=8?=?=?=d'=à&=L&= &=”%=Ü$=„$=X$=t#=8#=”"=z"=Ðý<pý<¨ü<|ü<¸û<žû<,û<û<xú<^ú<tí<¼ì<ì<ì<îë<Àä<ôã<Pã<ÐÒ<Ò<`Ñ<°¾<˜½<ü¼< ¼<ܺ<@º<d¹< ¸<„·<¨¶<dµ<È´<ì³<¨²< ²<0±<ì¯<P¯<t®<0­<”¬<¸«< ª<ª< ¦<@¥<œ¤<È<üŒ<XŒ<„u<¸t<t<@]<t\<Ð[<üD<0D<ŒC<¸,<ì+<H+<<<Ü<|<ð<(<ü<è<$<<î<|<P<<<´ <˜ <~ <ðÿ;8ÿ;LÞ; Þ;˜Ý;~Ý;ÐÜ;Ü;ìÛ;dÛ;JÛ;œÚ;Ú;XÙ;,Ù;Ù;Ø;tØ;ZØ;ì­;|­;P­;Ȭ;®¬;X9ø9099@9&9´9ˆ99æ9°ý8øü88î8 î8„í8jí8TÜ8ÈÛ8Û8äÚ8ÐÚ8HÚ8,Ú8Ú8»8¸º8Œº8º8ê¹8<ž8„8X8М8¶œ8T„808ð€8L€82€84°.Ô¯. ¯.à®.®.®.­.d­.ܬ.¬.¨¨.ܧ.8§.¸–.ì•.H•.˜‚.€.ä€.€.Ä~.(~.L}.|.l{.z.Ly.°x.Ôw.v.ôu.u.Ôs.8s.\r.q.|p. o.ˆn.ìm.ôi.(i.„h.°Q.äP.@P.l9. 8.ü7.(!.\ .¸.ä..t. ð-Ôï-0ï-$Ö-ÄÕ-dÕ-ØÔ-Ô-äÓ-ÐÓ- Ó-ðÒ-ÖÒ-dÒ-8Ò-$Ò-œÑ-€Ñ-fÑ-4¥-|¤-P¤-È£-®£-£-Ä¡-˜¡-¡-ö - ™-¬˜-p—-D—-€–-f–-ô•-È•-@•-&•-Äo-o--*>-¸=-Œ=-=-ê<-:-H-è- -ô-0--¤-x-ð-Ö-ü,ñ,Ôð,Lð,2ð,`£,’¢,øjÔxçtäºãàâ&âLá’àhß®Þ€ÛÆÚœÙâØðÕ6Õ ÔRÓˆÍÈËÈ·¶¨µŽ‚"nöKmjEmÄ ld l€lllälÈl(àjˆ¢j\öhÊÂhÈ‘htŠhLIhðÉglšgü gœ g¸ g¤ g g g¸ífXíftìf`ìfØëf¼ëfxVf|?f`?fh~eÈ}e¨wed,e¸endägdjPdüdPÆcâ?c4“bÈŒbhŒb,‹b‹bŠbtŠbÌÓ`ŒÃ]4µ]ZÜZÖX ‰X¬ˆXD‡X0‡X¨†XŒ†X|>VT³Tô²T²Tü±Tt±TX±T àS\GR¼FRçQ$æQÄåQáQôàQ0àQàQßQðÞQhÞQLÞQ¼íPÌÔP(ªPˆ©PL§Pˆ›PÀãO ãOÌ`LhPJÈOJˆ„IpƒIÔ‚IøIlI Ià€ID€I€IhIÜ~I|~IP~I´}I~}IØ|IL|Iì{IÀ{I${IîzIHzI¼yI\yI0yI”xI^xI¸wI,wIÌvI vIvIÎuI(uIœtIsI˜rI rI¬qI€qIäpI®pI¸]Iì\IH\IÌXI@XIàWIâVIVI„UI$UI&TITSIÈRIhRIjQI˜PI PI¬OI®NIÜMIPMIðLIòKI KI”JI4JI6IIdHIHI¤GIdGIÀFI¦FIDCI¸BIXBIZAIˆ@Iü?Iœ?Iž>IÌ=I@=IàH0>HÐ=HÒD(>D*=DX:Cl9Cà8C€8C‚7C°6C$6CÄ5CÆ4Cô3Ch3C3C 2C81C¬0CL0CN/C|.Cð-C-C’,CÀ+C4+CÔ*CÖ)C)C¤(CD(C(C`'CF'Cä#CX#Cø"Cú!C(!Cœ C< C>ClCàC€C‚C°C$CÄCÆCôChCC C8C¬CLCNC|CðCC’CÀC`CCÀCCC  C C´ C¶ CäCXCøCúC(CœC<C>ClCàC€C‚C°C$CÄÿBÆþBôýBhýBýB üB8ûB¬úBLúBNùB|øBøB¼÷B|÷BØöB¾öB\óBÐòBpòBrñB ðBðB´ïB¶îBäíBXíBøìBúëB(ëBœêB<êB>éBlèBàçB€çB‚æB°åB$åBÄäBÆãBôâBhâBâB áB8àBØßBxßB8ßB”ÞBzÞBÛBŒÚB,ÚB.ÙB\ØBÐ×Bp×BrÖB ÕBÕB´ÔB¶ÓBäÒBXÒBøÑBúÐB(ÐBœÏB<ÏB>ÎBlÍBàÌB€ÌB‚ËB°ÊB$ÊBÄÉBÆÈBôÇB”ÇB4ÇBôÆBPÆB6ÆBÔÂBHÂBèÁBêÀBÀBŒ¿B,¿B.¾B\½BмBp¼Br»B ºBºB´¹B¶¸Bä·BX·Bø¶BúµB(µBœ´B<´B>³Bl²Bà±B€±B‚°B°¯BP¯Bð®B°®B ®Bò­B˜§B §B¬¦BÔ¤B¼£B £BD¢B¸¡BX¡B,¡B BZ B´ŸB(ŸBÈžBœžBžBÊB$B˜œB8œB œBp›B:›B”šBšB¨™B|™Bà˜Bª˜B˜Bx—B—Bì–BP–B–Bt•Bè”Bˆ”B\”BÀ“BŠ“Bä’BX’Bø‘BÌ‘B0‘BúB~B8}B”|ByBŒxB,xB.wB\vBÐuBpuBrtB sBsB´rB¶qBäpBXpBøoBúnB(nBœmBlBlkBàjB€jB‚iB°hBPhBðgB°gB gBòfBcBcB¤bB¦aBÔ`BH`Bè_Bê^B^BŒ]B,]B.\B\[BÐZBpZBrYB XBXB´WB¶VBäUBXUBøTBúSB(SBœRBQBlPB PB¬OBlOBÈNB®NBLKBÀJB`JBbIBHBHB¤GB¦FBÔEBHEBèDBêCBCBŒBB,BB.AB\@BÐ?Bp?Br>B =B=B´Œ@l‹@ ‹@¬Š@lŠ@ȉ@®‰@L†@À…@`…@b„@ƒ@ƒ@¤‚@¦@Ô€@H€@è@ê~@~@Œ}@,}@.|@\{@Ðz@pz@ry@ x@x@´w@¶v@äu@Xu@øt@ús@(s@Èr@hr@(r@„q@jq@n@|m@m@l@Lk@Àj@`j@bi@h@h@¤g@¦f@Ôe@He@èd@êc@c@Œb@,b@.a@\`@Ð_@p_@r^@ ]@]@´\@¶[@äZ@„Z@$Z@äY@@Y@&Y@ÄU@8U@ØT@ÚS@S@|R@R@Q@LP@ÀO@`O@bN@M@M@¤L@¦K@ÔJ@HJ@èI@êH@H@ŒG@,G@.F@\E@ÐD@pD@rC@ B@@B@àA@ A@ü@@â@@€=@ô<@”<@–;@Ä:@8:@Ø9@Ú8@8@|7@7@6@L5@À4@`4@b3@2@2@¤1@¦0@Ô/@H/@è.@ê-@-@Œ,@,,@.+@\*@ü)@œ)@\)@¸(@ž(@<%@°$@P$@R#@€"@ô!@”!@– @Ä@8@Ø@Ú@@|@@@L@À@`@b@@@¤@¦@Ô@H@è@ê@@¸@X@@t@Z@ˆ@ü@œ@ž @Ì @@ @à @â @ @„ @$ @&@T@È@h@j@˜@ @¬@®@Ü@P@ð@òÿ?Ôø?tø?Ìõ?lõ?˜é?lé?é?´è?Øç?Dæ?ìå?Œå?”â?Ðá?¶á?Dá?¨Û?HÛ?tÙ?Ù?FØ?t×?×?FÖ?tÕ?Õ?FÔ?tÓ?Ó?FÒ?tÑ?Ñ?FÐ?tÏ?Ï?FÎ?0Ë?ÐÊ?`Ç?Ç? Ã?ÜÂ?ÂÂ?PÂ?|À?À?˜»?º?¬¹?L¸?ˆ·?n·?ü¶?è´?ˆ´?º³?è²?ˆ²?º±?è°?ˆ°?º¯?è®?ˆ®?º­?è¬?ˆ¬?º«?èª?ˆª?º©?ˆ¨?(¨?€¤?¤?8¡?¡?’?0’?b‘??0?b?Ž?0Ž?b?Œ?0Œ?b‹?Š?0Š?b‰?ˆ?0ˆ?b‡?0†?Ð…?(‚?¸?œ~?@z?¸y?žy?(K?üI?DI?H?|G?G?ÜF?$F?îE?èD?\D?üC?¼C?C?ÎB?ÈA??>?¼=?|=?ÄHû>èú>ºù>ˆø>ü÷>œ÷>nö><õ>°ô>Pô>"ó>ðñ>dñ>ñ>Öï>¤î>î>¸í>Šì>Xë>Ìê>lê>>é> è>€ç> ç>òå>Àä>`ä>ä>¬ã>ìâ>Òâ>€Þ>ôÝ>”Ý>fÜ>4Û>¨Ú>HÚ>Ù>è×>\×>üÖ>ÎÕ>œÔ>Ô>°Ó>‚Ò>PÑ>ÄÐ>dÐ>6Ï>Î>xÍ>Í>êË>¸Ê>,Ê>ÌÉ>žÈ>lÇ> Ç>¬Æ>XÆ>˜Å>~Å>,Á> À>@À>¿>à½>T½>ô¼>Æ»>”º>º>¨¹>z¸>H·>¼¶>\¶>.µ>ü³>p³>³>â±>°°>$°>į>–®>d­>ج>x¬>J«>ª>¸©>X©>©>D¨>*¨>Ø£>L£>ì¢>¾¡>Œ > > Ÿ>rž>@>´œ>Tœ>&›>ô™>h™>™>Ú—>¨–>–>¼•>Ž”>\“>Ð’>p’>B‘>>„>$>ö>ÄŒ>dŒ>Œ>°‹>ðŠ>ÖŠ>„†>ø…>˜…>j„>8ƒ>¬‚>L‚>>ì>`>>Ò}> |>|>´{>†z>Ty>Èx>hx>:w>v>|u>u>îs>¼r>0r>Ðq>¢p>po>o>°n>\n>œm>‚m>0i>¤h>Dh>g>äe>Xe>ød>Êc>˜b> b>¬a>~`>L_>À^>`^>2]>\>t[>[>æY>´X>(X>ÈW>šV>hU>ÜT>|T>NS>R>¼Q>\Q>Q>HP>.P>ÜM>PM>ðL>hG>ÜF>lF>B>|4>T4>@4>œ3>€3>f3>Œ2>,2>^1>Œ0>,0>^/>Œ.>,.>^->Œ,>,,>^+>Œ*>,*>^)>Œ(>,(>^'>,&>Ì%>$">´!>˜>Ü>T>:>4>>€>¤>>¸>Œ>ð>º>>ˆ>(>ü>`>*>„>ø>˜>l>Ð>š>ô>h>>Ü >@ > >d >Ø >x >L >° >z >Ô >H >è>¼> >ê>D>¸>X>,>>Z>dò=˜ñ=ôð=xí=ìì=Œì=Žë=¼ê=0ê=Ðé=Òè=è=tç=ç=æ=Då=¸ä=Xä=Zã=ˆâ=üá=œá=žà=Ìß=@ß=àÞ=âÝ=Ý=°Ü=PÜ=Ü=lÛ=RÛ=ð×=d×=×=Ö=4Õ=¨Ô=HÔ=JÓ=xÒ=ìÑ=ŒÑ=ŽÐ=¼Ï=0Ï=ÐÎ=ÒÍ=Í=tÌ=Ì=Ë=DÊ=¸É=XÉ=ZÈ=ˆÇ=üÆ=œÆ=žÅ=ÌÄ=lÄ= Ä=ÌÃ=(Ã=Ã=¬¿= ¿=À¾=½=ð¼=d¼=¼=»=4º=¨¹=H¹=J¸=x·=ì¶=Œ¶=޵=¼´=0´=г=Ò²=²=t±=±=°=D¯=¸®=X®=Z­=ˆ¬=(¬=È«=ˆ«=äª=ʪ=h§=ܦ=|¦=~¥=¬¤= ¤=À£=¢=ð¡=d¡=¡= =4Ÿ=¨ž=Hž=J=xœ=ì›=Œ›=Žš=¼™=0™=И=Ò—=—=t–=–=•=D”=ä“=„“=D“= ’=†’=$=˜Ž=8Ž=:=hŒ=Ü‹=|‹=~Š=¬‰= ‰=Àˆ=‡=ð†=d†=†=…=4„=¨ƒ=Hƒ=J‚=x=ì€=Œ€=Ž=¼~=0~=Ð}=Ò|=|= {=@{={=\z=Bz=àv=Tv=ôu=öt=$t=˜s=8s=:r=hq=Üp=|p=~o=¬n= n=Àm=Âl=ðk=dk=k=j=4i=¨h=Hh=Jg=xf=ìe=Œe=Žd=¼c=\c=üb=¼b=b=þa=œ^=^=°]=²\=à[=T[=ôZ=öY=$Y=˜X=8X=:W=hV=ÜU=|U=~T=¬S= S=ÀR=ÂQ=ðP=dP=P=O=4N=¨M=HM=JL=xK=K=¸J=xJ=ÔI=ºI=(H=œG==T8=@8=¸7=œ7=‚7=H6=è5=ê4=¸3=X3=Z2=(1=È0=Ê/=˜.=8.=:-=,=¨+=ª*=h)=)= (= '=h%=%=`#=|!=Ø=h=À=4==ì=Ò=¬ =L =~ =¬ =L =~ =¬ =L =~=¬=L=~=¬=L=~=¬=L=~=L=ì=Dý<Ôü<üù<âù<rø<îô<Hí<èì<ë<´ê<°ç<˜æ<üå< å<”ä<4ä<ä<lã<6ã<â<â<¤á<xá<Üà<¦à<à<tß<ß<èÞ<LÞ<Þ<pÝ<äÜ<„Ü<XÜ<¼Û<†Û<àÚ<TÚ<ôÙ<ÈÙ<,Ù<öØ<PØ<Ä×<d×<8×<œÖ<fÖ<ÀÕ<4Õ<ÔÔ<¨Ô< Ô<ÖÓ<àÀ<À<p¿<ô»<h»<»< º<8¹<¬¸<L¸<N·<|¶<ðµ<µ<’´<À³<4³<Ô²<Ö±<±<x°<°<¯<H®<¼­<\­<^¬<Œ«<,«<̪<Œª<è©<Ω<l¦<à¥<€¥<‚¤<°£<$£<Ä¢<Æ¡<ô <h < < Ÿ<8ž<¬<L<Nœ<|›<ðš<š<’™<À˜<4˜<Ô—<Ö–<–<x•<•<”<H“<è’<ˆ’<H’<¤‘<Š‘<(Ž<œ<<<>Œ<l‹<àŠ<€Š<‚‰<°ˆ<$ˆ<ć<Ɔ<ô…<h…<…< „<8ƒ<¬‚<L‚<N<|€<ð<<’~<À}<4}<Ô|<Ö{<{<¤z<Dz<z<`y<Fy<äu<Xu<øt<ús<(s<œr<q<lp<ào<€o<‚n<°m<$m<Äl<Æk<ôj<hj<j< i<8h<¬g<Lg<Nf<|e<ðd<d<’c<Àb<`b<b<Àa<a<a< ]<]<´\<¶[<äZ<XZ<øY<úX<(X<œW<V<lU<àT<€T<‚S<°R<$R<ÄQ<ÆP<ôO<hO<O< N<8M<¬L<LL<NK<|J<J<¼I<|I<ØH<¾H<\E<ÐD<pD<rC< B<B<´A<¶@<ä?<X?<ø><ú=<(=<œ<<<<<>;<l:<à9<€9<‚8<°7<$7<Ä6<Æ5<ô4<h4<4< 3<82<Ø1<x1<81<”0<z0<-<Œ,<,,<.+<\*<Ð)<p)<r(< '<'<´&<¶%<ä$<X$<ø#<ú"<("<œ!< <l<à<€<‚<°<$<Ä<Æ<ô<”<4<ô<P<6<¤<<¸<P<Ä<T<Ø <(<<Œ<p<V<|<$< <˜<Äÿ; ÿ;àþ;(ý;¤ü;<õ;xô;hó;Èß;ß;êÞ;xÞ;¤Ü;DÜ;pÚ;äÙ;„Ù; È;”Ç;<Ç; Ç;Ç;”Æ;˜Ã;8Ã;Ⱦ;¾;ê½;x½;¤»;D»;vº;¤¹;D¹;v¸;¤·;D·;v¶;¤µ;Dµ;v´;¤³;D³;v²;¤±;D±;v°;¨9H949Ô9949Ô9949Ô9949Ô9949Ô9949Ô 9 9Ô 9t 9Ì9\9@9äÿ8\ÿ8Bÿ8„ý8Ìü8€ú8´ï8ðî8Öî8dî8êé8(Ü8œÛ8<Û8 Ù8”Ø84Ø8„Ï8pÏ8¬Î8Î8vÎ8Î8ÀÈ8`È8’Ç8ÀÆ8`Æ8’Å8ÀÄ8`Ä8’Ã8ÀÂ8`Â8’Á8ÀÀ8`À8’¿8À¾8`¾8’½8ž8°8L—8ì–88Ø8€8 8`8œŒ8‚Œ8Œ8,‰8̈8(„8hƒ8ƒ8È‚8è8Î8\8À.°¿.â¾.¾.°½.â¼.¼.°».âº.º.°¹.â¸.¸.°·.â¶.¶.°µ.â´.°³.P³.¨¯.8¯.`¬.F¬.˜«.€ª.ä©.©.|¨.¨.ð§.T§.§.x¦.ì¥.Œ¥.`¥.Ĥ.ޤ.è£.\£.ü¢.Т.4¢.þ¡.X¡.Ì .l .@ .¤Ÿ.nŸ.Èž.<ž.Ü.°..Þœ.8œ.¬›.L›. ›.„š.Nš.¨™.™.¼˜.˜.ô—.¾—.È„.üƒ.Xƒ.Ü.P.ð~.ò}. }.”|.4|.6{.dz.Øy.xy.zx.¨w.w.¼v.¾u.ìt.`t.t.s.0r.¤q.Dq.Fp.to.o.´n.tn.Ðm.¶m.Tj.Èi.hi.jh.˜g. g.¬f.®e.Üd.Pd.ðc.òb. b.”a.4a.6`.d_.Ø^.x^.z].¨\.\.¼[.¾Z.ìY.`Y.Y.X.0W.ÐV.pV.0V.ŒU.rU.R.„Q.$Q.&P.TO.ÈN.hN.jM.˜L. L.¬K.®J.ÜI.PI.ðH.òG. G.”F.4F.6E.dD.ØC.xC.zB.¨A.A.¼@.¾?.ì>.Œ>.,>.ì=.H=..=.Ì9.@9.à8.â7.7.„6.$6.&5.T4.È3.h3.j2.˜1. 1.¬0.®/.Ü..P..ð-.ò,. ,.”+.4+.6*.d).Ø(.x(.z'.¨&.H&.è%.¨%.%.ê$.ˆ!.ü .œ .ž.Ì.@.à.â..„.$.&.T.È.h.j.˜. .¬.®.Ü.P.ð.ò. .”.4.6.d..¤ .d .À .¦ .D .¸.X.Z.ˆ.ü.œ.ž.Ì.@.à.â..„.$.&ÿ-Tþ-Èý-hý-jü-˜û- û-¬ú-®ù-Üø-Pø-ð÷-òö- ö-Àõ-`õ- õ-|ô-bô-ñ-tð-ð-ï-Dî-¸í-Xí-Zì-ˆë-üê-œê-žé-Ìè-@è-àç-âæ-æ-„å-$å-&ä-Tã-Èâ-hâ-já-˜à- à-¬ß-®Þ-ÜÝ-|Ý-Ý-ÜÜ-8Ü-Ü-ŒÚ-Ú- Ù-8Õ-¬Ô-<Ô-ÀÐ-Ë-Ë-ðÊ-hÊ-LÊ-2Ê-T§-ô¦-¥-¨¤-Ô¢-|¢-b¢-ð¡-\ž-ü-àš-€š-Tš-Ì™-²™-€˜-(˜-˜-œ—- -ÀŽ-dŠ- ‰-†‰-‰-ˆ†- „-Àƒ-‚--0-2€-- ~-¢}-p|-|-{-ày-€y-‚x-Pw-ðv-òu-t- s-Øn-hn-`j-j-Œf-¬e-’e- e-àd-ÔCä½C„½C½Cè¼CÔ¼CL¼C0¼C¼CøªCˆªC\ªCÔ©Cº©Cô¡Ch¡C° C„ Cp CèŸCÌŸC²ŸCŸCŒšC`šCØ™C¾™C@}Cà|C€|C@|Cœ{C‚{CìhC`hChCÔgC8gCgC\fCÐeCpeCDeC¨dCrdCÌcC@cCàbC´bCbCâaCCX>Cø=C¸=C=Cú@R>@Ì'@l'@ '@Ì&@(&@&@Lÿ?ìþ?|þ?Pþ?<þ?´ý?˜ý?~ý?øõ?á?ìà?dà?Jà? Í?0Í?Í?|Ì?bÌ?ŒÇ?$Â?øÁ?pÁ?VÁ?¨À?ж?¤¶?¶?¶?©?´¨?ü§?Ч? §?ò¦?€¦?T¦?Ì¥?²¥?¼†?\†?¤…?x…?´„?š„?(„?üƒ?tƒ?Zƒ?üJ?œJ?”þ>4þ>àý> ý>ý> á>@á>àà>Œà>Ìß>²ß>LÄ>ìÃ>ŒÃ>8Ã>xÂ>^Â>ø¦>˜¦>8¦>ä¥>$¥> ¥>¤‰>D‰>äˆ>ˆ>Ї>¶‡>Pl>ðk>k>|j>bj>(O>ÈN>N>|M>ÄL>„L>pL>K>tK>ZK>èJ>¨J>”J>ðI>ÔI>ºI>¸&>X&> %>t%>°$>–$>$$>ø#>p#>V#>>¨>H>>d>J>´>(>È>œ>>Ê>$>˜>8> >p>:>”ÿ=ÿ=¨þ=|þ=àý=ªý=ý=xü=ü=ìû=Pû=û=tú=èù=ˆù=\ù=Àø=Šø=ä÷=X÷=øö=Ìö=0ö=úõ=Tõ=Èô=hô=<ô= ó=jó=Äò=8ò=Øñ=¬ñ=ñ=Úð=ð=¨ï=Hï=ï=dî=Jî=€Ú= Ú=ÀÙ=€Ù=ÜØ=ÂØ=<Â=ÜÁ=|Á=<Á=˜À=~À=ø©=˜©=8©=ø¨=T¨=:¨=´‘=T‘=ô=´==ö=py=y=°x=px=Ìw=²w=,a=Ì`=l`=,`=ˆ_=n_=I=´H=TH=ÈG=G=äF=ÐF= F=ðE=ÖE=dE=8E=$E=œD=€D=fD=Ô!=P!=¼ = = =<=ä=¸=Ô=˜=ô=Ú=Ø=x=À=”=Ðÿ<¶ÿ<Dÿ<ÿ<þ<vþ<@ë<ˆê<\ê<Ôé<ºé<„ç<$ç<Äæ<„æ<àå<Æå<0Ó<¤Ò<DÒ<Ò<|Ñ<FÑ< Ð<Ð<´Ï<ˆÏ<ìÎ<¶Î<Î<„Í<$Í<øÌ<\Ì<&Ì<€Ë<ôÊ<”Ê<hÊ<ÌÉ<–É<ðÈ<dÈ<È<ØÇ<<Ç<Ç<`Æ<ÔÅ<tÅ<HÅ<¬Ä<vÄ<ÐÃ<DÃ<äÂ<¸Â<Â<æÁ<@Á<´À<TÀ<(À<Œ¿<V¿<„¾<$¾<Ľ<„½<à¼<Ƽ<ü¨<œ¨<<¨<ü§<X§<>§<¸<X<ø<¸<<úŽ<tx<x<´w<tw<Ðv<¶v<0`<Ð_<p_<0_<Œ^<r^<ìG<ŒG<,G<ìF<HF<.F<¨/<H/<è.<¨.<.<ê-<<0<Ð<D<Œ<`<L<ˆ<l<R<à<´< <<ü<â<¨<l<@<¸<ž<LÈ;ÀÇ;hÆ;<Æ;(Æ; Å;„Å;jÅ;ÄÃ;L½; ½;˜¼;~¼;Я;`¯;4¯;¬®;’®;Ô99ð9h9N9` 9 9H 9 9X 9> 9Ì 9  9 9þ9LÙ8ÀØ8ØÍ8¬Í8˜Í8Í8ôÌ8ÚÌ8ì¼8Œ¼8`¼8Ø»8¾»8x—8ä‹8¸‹80‹8‹8X‰8 ˆ8`ˆ8¼‡8¢‡8<´.ܳ.$³.ø².4².².¨±.|±.ô°.Ú°.l«. «.¬ª.lª.È©.®©.—.Œ–.,–.–.d•..•.ˆ”.ü“.œ“.p“.Ô’.ž’.ø‘.l‘. ‘.à.D..h.ÜŽ.|Ž.PŽ.´.~.ØŒ.LŒ.ì‹.À‹.$‹.îŠ.HŠ.¼‰.\‰.0‰.”ˆ.^ˆ.¸‡.,‡.̆. †.†.Î….(….œ„.<„.„.tƒ.>ƒ.l‚. ‚.¬.l.È€.®€.äl.„l.$l.äk.@k.&k. T.@T.àS. S.üR.âR.\<.ü;.œ;.\;.¸:.ž:.$.¸#.X#.#.t".Z".Ô .t . .Ô .0 . .ó-0ó-Ðò-ò-ìñ-Òñ-xÛ-Û-¸Ú-,Ú-tÙ-HÙ-4Ù-pØ-TØ-:Ø-È×-œ×-ˆ×-×-äÖ-ÊÖ-€§-Ȧ-œ¦-¦-ú¥-èž-ˆž-Ð-¤-àœ-Æœ-Tœ-(œ- ›-†›-L-èˆ-¼ˆ-4ˆ-ˆ-´†-ü…-t…-ìt-,t-ts-4s-Tr-:r-Èq-ˆq-äp-Êp-dD-D-LC- C-\B-BB-ÐA-¤A-A-A-P -ð -8 - -H -. -¼ - - -î--`-4-¬-’-Xþ,Šý,˜gT`¼\¹¢¸œ·â¶|µ´˜³Þ²°¯ö®Ì­­ ªf©v¨¨b§%¤ƒn0Mn°:n`*näÛm`…mxQmÈÒl”¬j &dÄ=cœ´bˆ’b4áa¬a€]ð ]¸–\t\L\xGZŒëY<êN0ZN8ÒG”ÞEH³Ed¬ED–Eü¼D@¼D4¦C ¥CÌ¢CÜžA¸Ü?Tù<Y¤G¬þFþFÜ+9ä)9ì&9H&9\:6d76À66 Á4œÀ4$Ô2øÓ2ÌÓ2˜Ó2Àƒ2,z2DD2õ0Hô0øë) ë)ôé)Èé)œé)´è)ˆè),ç)Ìæ) æ)læ)èå)ˆå)\å)(å)Lä) ä)ôã)8“( ’(‘(4(\Š(d‰(„‡(¬‚(´(Ô(Äg(üÔ'ðÓ'ÜÒ'äÑ'ÐÐ'ˆÐ'´Î'}'¬|'H|'ø{'Ì{'t{'H{'øz'Ìz' z'tz'z'Ðx'lx'x'¸w'Œw'4w'w'¸v'Œv'`v'4v'Ðu'ˆt'$t'Às'ps'Ds'ìr'Àr'pr'Dr'r'ìq'ˆq'Ôp'pp' p'¼o'o'8o' o'¼n'n'dn'8n'Ôm'4['ÐZ'lZ'Z'ðY'˜Y'lY'Y'ðX'ÄX'˜X'4X'ôV'V',V'ÜU'°U'XU',U'ÜT'°T'„T'XT'ôS'¬R'HR'äQ'”Q'hQ'Q'äP'”P'hP'¨>D>=,=È<x<L<ô;È;x;L; ;ô::Ü9x99Ä8˜8@88Ä7˜7l7@7Ü6`#ü"˜"H""Ä!˜!H!!ð Ä ` ¬Hä”hä”h<¬ø”0à´\0à´ˆ\øDà|,¨|,Ô¨D,ÈxLôÈxL ôÜxĘ@Ęl@Ü `úüù˜ùHùùÄø˜øHøøð÷Ä÷`÷¬öHöäõ”õhõõäô”ôhô<ôô¬óøò”ò0òàñ´ñ\ñ0ñàð´ðˆð\ðøïDïàî|î,îî¨í|í,ííÔì¨ìDìë,ëÈêxêLêôéÈéxéLé éôèèÜçxççÄæ˜æ@ææÄå˜ålå@åÜäÓ¤Ò@ÒðÑÄÑlÑ@ÑðÐÄИÐlÐÐTÏðÎŒÎ<Îθ͌Í<ÍÍä̸ÌTÌ Ë<ËØÊˆÊ\ÊÊØÉˆÉ\É0ÉÉ ÈìLjÇ$ÇÔÆ¨ÆPÆ$ÆÔŨÅ|ÅPÅìÄ8ÄÔÃpà ÃôœÂp ÂôÁÈÁœÁ8Á„À À¼¿l¿@¿è¾¼¾X¾¾ܽŒ½<½½ä¼ðº ºtº$ºĹ˜¹l¹¸è·¼··,·®Ü«¤©ȧ §ˆ¦`¢˜ l Ÿž œPœœ ›t›H››Œ™Ô˜h——Ü–„•X•”Ô“’”äŽ4„‹,Џ‰<ˆä†,†|„Ì‚tHð€@P}$}Ì{P{${Ìy$yøxÌxtw$whvgnºfn¾`nvQn>On&InNHnšAnúfmªamj\m’[mTm2MmZLmÂGmÂFmî0m0mò,m: mFmnmFmmîm®m–úl¾ùlÎ÷l"ôlîlŠØlÏlFÎlZÌl‚ËlŠÆlnÀl²¶l2¯l ¢l~™l¦˜l˜lJ“lòƒlƒl|ljwl’vlºulªtlBsl’ql&el>dl:`lúQlÆPl:JlfDl;l*6l"-lž,lB'l"llªlrùkšøk÷kók ík>êkÞk:ÝkšÚkJÑk.ÍkòÊkæÆk6Àk"¼kê·kžµkR¯kz®k©k§k&¢kŠ–kʉkÒˆk’‡kJ~k–|k¾{k{k~vk¢qkömkndkîWkWk>Vk^Ok~Mk.IkúFkê>kú=k"=kJbj‚aj–Mj‚GjªFjŠ?j 9jR-jŽ*j:jzjÖ j† jjFúi^ùi÷iòïi²ëiÚêiÖäiJáiÆài&àiêÕijÎiBËirÆiîÅiþÀiÀi6¿i¹i:¸i6±i Ÿiê•i•iª†ii>ki`iš\iÂYiâViÞOiOiVHiCiª9iÆ5iº4i¾2iæ1i1iòiþi2inÿhöýhò÷h÷h’ñh2îhZíh‚ìhªëh¢êhÝhÖhBÕh’ÍhRÉhjÈh’ÇhÂÄhêÃhŽÀhÒ¹hB°h–ªhþ§hò¤h¦žhÎhj’h>ŽhfhŽŒh¶‹hÞŠhN‰hV†hÞyhîxhÂphfkhŽih‚bh’_hBZhZYh‚XhªWhZFh"7hâ+h¦#hh¦hÎhöhhhhîõgzïgþêg&êgÆçg*Ög¶ÑgÏgBÌg"ÇgªÅgÒÄgòÂgÂgN½gf±g¬gš gNœg›g¾•g~”gV’g~‘gŽgn…gr€gv}gVwgæsgòog og.jgrbg–`g¶\gÞ[g>HgÞ>g>g.=gVb6ÿaºûaâúa úa2ùaèaîåašâaÂáa²×aÊa6Ãa>Áaªaö¢a^ a²av”aÒˆa~aV|aÚya¢oaòma&laNka¢YaFSaÆMaîLa&Baz/aF-aR'aÎ a:aæý`îõ`¦à`êÖ`È`ÆÀ`j¹`f¸`îµ`µ`>´`f³`ʰ`¬`>ª`f©`ލ`6¥`2¤`Ξ`ö`Ž–`•`Fz`ny`zf`zT`ÞH`ò@` 9`3`B/`:*`2%`Ê`.`~`6 `¾ `¢`¦ý_ê÷_÷_‚ò_ší_~â_ÊÛ_¢Ê_òÃ_2¿_â¸_¾µ_ʳ_¾¯_ª_Ÿ_†”_Bˆ_R‡_‚_6_bz_Šy_æo_ân_~g_Öc_²__V^_RW_âJ_Þ=_n7_Ž-_¶,_Þ+_!_F _^_Š_r_š_â_¢_~_ _b _Z_þø^†ï^®î^âå^NÉ^ªÇ^’Ä^rÃ^„º^ª¬^ê£^®™^â•^š^öˆ^6r^~i^†b^ÚP^šN^ÚK^º>^3^Ò)^Æ#^¦^J^F^žõ]ÂØ]šÑ].Í]2Ç]¶»]Öµ]¢°]Ö¡]N]J’]Þ]].Ž]Ö‡]Ú…]no]¢m]¶a]"Z]JY]rX]NW]šS]^B]†A]®7]Æ6]Ö&]î%]ú$]æ]z].]þö\&ö\~Û\zÚ\âÏ\RÈ\Æ\RÄ\zÃ\Þ¾\¾\Ÿ\j—\ˆ\–}\®p\ªo\vm\B^\ M\ZE\‚D\ê-\’(\¾\¢ \†\¦ü[îÓ[É[îÇ[ÚÃ[¾¼[R²[:Œ[‰[Zƒ[ ~[v|[fu[êm[¢l[ºk[g[¢a[JI[ºD[–C[¾B[&8[N-[ª [Ò[š[:[~[&ùZ ðZ*äZŽáZBÝZÎÛZÚÚZ6ÍZÌZ¾ÅZæÄZR¹Zn´ZN±ZŠ®Z"¬Z~¨Z¦§ZΦZö¥ZÞžZ.›ZªšZæ˜ZòŠZŠZZjpZVmZNbZvaZž`ZJZâHZ HZ*EZRDZú WzWÖWJW2èVZçVjæVæÚV:ÍV~ÌVÖÅV&ÀVR·V–ªV¾©VF›VnšV–™V"•V.”VNƒVüVê~VNmVFbV²`V:_VLV’GV?Vº4V–,VjVæVŽVnV^öUÂÏUªÃUF¹U~µU±Uê°U„UÂyUîvUvUjgUž`UöWU2VUbBUŠAU9U:&Ub%U²$UšUÂÞTêÝT2ÏTêÆTÆTN¿Tö¶Tº¥TvžT¢™Tª”T2“T~€TŠkT®hTÖgT¢>T*=T::Tâ)T )TFTâT> TŽTTTÿSúýS’ôSÂòS,ïSïSžèSÖáS¦àSšÝS‚ÙSÊÍS:ÉS°S>¯S¦©S~¦S¦£S£SJŸSÒSö˜S6‡SFuSÆiSšeSÞ]S.SSÞJS^CSæASŽ0SšýRÝR2µR¶§R ¤Rr™RêˆRˆR:‡RÞpR]R:\R’VR*ORê!RÎ RžçQðáQ.£Q~QêœQ™QŠ|QöSQSQMQ¦CQ@QB?Q>6Qf5Qâ4QžQ2QÎñPïPBîPZ×PÊÁPr½PÞ¼P¼P~»PκP:ºP¦¹P¹P~¸Pê·Pú´Pf­P6†PŽrPRPÒ/P–$P¾#PúPøOOpOOÿNúîN"îNJíNrìNšëNúÝN"ÝNÖÑNF²Nš©N6§NêPNz3NvNäM"ÄMÖ§Mþ¦M&¦Mú–M¾ŒM6mMÎcM:MšMîþLöÅLŽkLFTLnSLšDLÊ8L>2Lþ L& LN LújKN#K‚"KèJrçJÞæJ>ÙJ&ºJŠªJ²©JF€J²{JBxJRuJöWJ J&J JzûI²çIºÙIú×IâÓI¾ÒIöÐIæÏIÍIBÇI–ÅIê„IJªHrGòmGšhGÊdG¢_GÒ[GBYG¶XGÚUG2UG¢RGRG†OGÖNGÞAGþ@G:@Gz?Gš;Gê:Gê6G 6G:2G’1G'GJ&G®ßFßFFÜFfÛF¢ÚFâÙF:ÒFZÑF>ÅFzÄFtuFRF¦F¨·E~—EdkE jEê_EH5Eð3EŒE4EìãDÒD¶D2¡DRD$ŠCø‰C|€CP€C‚¨BÔËA¨ËA ÃAX£A,£AâA6ƒA†gAgA¼eA¸õ@Úâ@({?„W?tV?7>Ü6>°6>,$=$=Œ=`==ºõ<jô<vè<°ã;¢Ï;RÄ;Ä¿;jG;¦F;ÒB; 9;~8;®-;þ,;ú+;+;V*;¦);B$;V ;n;f;";.;†; ;æ;n;6ù:jø: õ:jñ:2î:’ê:2J:‚I::B:Ú':N':R¸9’·9ƶ9vµ9ú²9‰9n9žU9îT9êS9 S9FR9²Q9Q9ŠP9Ì9ž¦8Z˜8>(8~'8²&8b%8æ"8Fó6 °6Z¯6Æ£6£6Z¢6²¡6ž6J˜6ž,6æ+6.+6v*6Ú)6.)6b&66R6ží5jž5¦“5Ö|5b{5Úw5J-5†'5ª#5Ž5 5’5525:ú4ªö4Úò4zî4¦é4¶Ì4†Œ4j‰4:4jz4:Y4V4FG4ò'4¦4Rþ3Jü3JÛ3â×3Æ·3V¥3b—3ê’3B‘3n‡3q3k3úR3Â<3ž2z2ºœ2^š2™2V˜2¶’2Â22R‹2^C2žB2š<2º;2b:2²924222v12n*2J&2z 2*2ö2 2> 2B2Òþ1‚û1Nô1bð1–ê1šä1Ý1rÙ1òÑ1Í1RÆ12¿1"”1Ž“1Š1ò†1Zƒ1Z€1}1Np1¶l1¶i1öe1.E1JA1þ=1R71‚+0Î$0b0š0Î0Ê0z0¦0öÿ/šý/Bü/’û/òõ/þó/Vó/Žî/VÊ/^§/ª’/ªŒ/öy/ú_/Ò\/ %/Ò/ê/Ú/òû.‚÷.nÚ.4Ì-:ª-L‹-p[-D[-J-<ô,ìÆ,l¹,8µ,ô¥,Êb+J`+ŠO+bK+Þ<+"9+ª+Ÿ))R…)žƒ):ƒ)*‚)Š)B)Â~)þ)ú¹(ö¸(ò·(6¬(2¢(žž(âš(úx(bd(‚c(ZV(¢U(.H(JG(öE(*E(Æè'âý&Já&þÛ&Š3&V)&B%&!&¢&¶œ%Š—%j“%þ‹%’s%Vi%T%úJ% 9$$. $~è#6Ü#’Ì# ¼#¾¯#Ž£#j˜#*#vu#Î\#BY#~U#F#Š6#r*##f#ž#ò#ù"¾Ø"â£"ZŽ"Âw"Öa"–J"ê<"Ž."V"žñ!†Ü!N ^· ®« ʃ v fp ` ò] Z "ÖîÊÚB6Bê½b¥º šŸ•f‘"Öd¢/î!!ªõ–î×ÞºþQþ(þÿ¦Øìm2à¶ÝªÚ^Õ^Ó”M€MlMXMKòJÖJºJš÷bÄ6¿껼²ªO2$bæêOªL6D*A>=â6>ýÊ›m^™j˜jò:jV:jЇgî†gvºeÚ¹e¶EeEenÏdÒÎdŠ dî d"³c†²c2èb–çb¢ b b†–bê•b ÚanÙa"ha†ga6PašOa"Ý`†Ü`zÙ`ÞØ`‰`jˆ`ÒB`6B`:5`ž4``rÿ_Z²_¾±_f–_Ê•_BH_¦G_¾¯^"¯^ö^Z^Þ]vÝ]zÓ]ÞÒ]"¾]†½]ÒÊ\6Ê\æ©\J©\BX\¦W\*ù[Žø[Þá[Bá[ž¾[¾[®[[öKZZKZŠ;Zî:Z¢1Z1Z–ZúZF‹YªŠYJuY®tYrYvqYvCYÚBYâ6XF6X²íWíWžáWáWÔW‚ÓWú–W^–W6yWšxWeW~dWâWFWÎëV2ëV&VŠœVv‰VÚˆVr½UÖ¼UqU‚pUÖYU:YUzMUÞLUF Uª UZTfYTÂ@T&@T¢¡S¡S~2Sâ1SþÿRbÿR¾÷R"÷R²ËRËR:œRž›Rb(RÆ'RB$R¦#RVûQºúQ–ÄQúÃQz›QÞšQ®oQoQÆdQ*dQúNQ^NQR'Q¶&Q–QúQÆ Q* QàPvßP²ÙPÙPZÀP¾¿Pz¶PÞµPòLPVLPª P PrPÖP:ñOžðOžêOêOZ¤O¾£OŽ—Oò–OþƒObƒOÖzO:zOlOfkONKO²JOþ@Ob@OÆ=O*=ON8O²7O.%O’$OâOFO¦×N ×N¾ÆN"ÆN®¿N¿Nò«NV«N:ŽNžN¶†N†NF€NªNÒwN6wN6rNšqNj5NÎ4NÆ-N*-NÆ'N*'NÎ#N2#NÊN.N’NöNªÙMÙMNÆM²ÅMºM&ºMŽ¡Mò MMzŽM"wM†vMZgM¾fM ZMnYM¦VM VMö%MZ%MÎM2MÞöLBöLæLjåLÆßL*ßLªÜLÜLfÐLÊÏLÖÇL:ÇL¡L‚ LNzL²yLæmLJmL]Lr\Lv+LÚ*LúL^LNÜK²ÛK"ÙK†ØKrÔKÖÓKŽÈKòÇKªÄKÄKÀKz¿K*µKŽ´K¶±K±K.¯K’®K:©Kž¨K*£KŽ¢KFŸKªžKz’KÞ‘Kþ„Kb„KNuK²tKžmKmKBdK¦cKN3K²2KæKJKžKKÂüJ&üJ–ùJúøJZñJ¾ðJ~íJâìJ²éJéJnåJÒäJÂÞJ&ÞJ–ÛJúÚJ~¼Jâ»J¤Jj£JŽŠJò‰Jb‡JƆJž‚J‚JÒvJ6vJŽEJòDJN J²JšJþJ úInùI^ïIÂîIú¯I^¯Iª£I£I"œI†›IIzŽIÂIG²DGê!G>GGGrÿFê¿F¼F.»FZºF²¹Fú¸F^¸Fb¦E¼¥E@¥E¥Eˆ£E¾¡E¡EL E  E„žEºœE&œE¶šEö™E¢„EüƒE€ƒETƒEÈEþEXEŒ~E`~EÄ|EúzEfzEöxE6xE°uE4uEuEÜsE2rEŒqEqEäpE¸oE>nEèjEljE@iEiE¢fE6dEvcE”?E?Eì>EÀ=EÂ-˜Á-Á-ðÀ-d¿-š½-ô¼-(¼-ü»-`º-–¸-¸-’¶-Òµ-Fï, î,$î,øí,lì,’ê,ìé, é,ôè,Xç,Ræ,¬å,ã,ðâ,Äá,à,hß,øÜ,ÌÜ, Û,ÚÙ,„Ö,,Ö,˜Õ,@Õ,Õ,2Ó,ŒÒ,4Ò,Ò,VÐ,°Í,Í,ÜÌ,É,RÈ,^Ç,ÂÅ,Å,tÄ,â¿,6½,Dº,N·,ž¶,ªµ,´,d´,~²,±,N°,>®,ª­,:¬,z«,ž+æ+R++V +F +>Ñ)jÐ))nœ)¦‰)Úˆ)Ö‡)æx)¦)ö)ŠŽ'Ú‡'"m'Bc'FK'fA'¶;'F5'þ.'('Æ!'Ö'Ž'ž 'V'ý&¾ !öæ â :Ø ¾Ñ VÊ ®Æ V¨ ö>ö0V >ZzŠæîåÎÎj†¦…–„b{w>v¢uF òö¢íí"åjä^ãzâvµδ&´b³Ʋâ¡^Ħà Ã6¶Bªšœ"††…sVr–lÎFB?¢:Â5ø¦òª¸®µ&&w"v†uJp”o¦njÎöZâFtgEX1EœEêgA$cA6˜kE|5EÀEHgAthWÎG |ÌG 4ÅG)TÂG L½G#ô»G L GpŸG”žGˆG LœG ›G šG ø˜G ì—G à–G Ô•G €”G ,“G Ø‘G „G xG <ŽG èŒG ”‹G @ŠG ìˆG ˜‡G ,†G …G „G ð‚G œG €G TG è}G L|G@{G LzGÈxGÔwGÈsG'¬oG8jG$hfG@aG"p]GZGÄVGpSGTPG\MGxKG GGLFG ð7Gø'Gð"G (G$G pG ´G¨G œG 0G $ G ˆ G| G àGGXG ùFÄøFè÷FÜöF  õF dôF XóF òF °ðF \ïF îF ´ìF HëF <êF éF ”çF øåFDäF˜àF@ÓF(ÆFðÀF"ø¼F¸‘;Ü; ; ”Ž; ;lŠ;ˆ…;2L„; @ƒ; ¤;€;l~;}; |; Ðz; dy; Èw; u;¸s; Ôq;Ào;Lg;V¨[;xÔX;¸R;=ÌL;;TH;¼C;Ø9;\|.;g´%;È!;;Qì;)t;,<ú:T`ö:Àò:ˆï: èë:°æ:ÈÔ:ÔÓ:hÒ: Ñ: ÀÏ: „Î: HÍ: Ì: ÐÊ: ”É: XÈ: ìÆ: hÅ:äÃ:Â: „Á: xÀ: l¿: `¾: T½: H¼: <»: 0º: ¤·: ³:,¤:PŸ:.´š:-Ð’:PœŒ:>ȃ:ZXx:tðm:i¨a:}dS:”8K:S¨(: ´!:&T: Ô: œ: : œ: : :(ÿ9Œý9 ðû9 Tú9 ¸ø9 ÷9 hõ9 ´ó9 ò9 Lð9 °î9 í9 xë9 Äé9 àç9Dæ9 `ä9”â9 Èà9 Dß9 xÝ9 ÜÛ9 øÙ9Ø90Ö9LÔ9hÒ9„Ð9 Î9¼Ì9ØÊ9dÂ9Tä³9 „¨9ð¤9Hž9&è˜9 h•9 0’9 °Ž9 0‹9 ȇ9 …9`|9Üz9Xy9ôx9x9Äl9 ˆV9ä°A9 ü?9 @=94<9 X;9d:999 ,79Ø59 ô3939ô19 Èu8´s8Ðq84p8 ˜n8 ül8 `k8 Äi8 h8 \f8 ¨d8 ôb8 Xa8 ¼_8 ^8 |[8ÈY8 äW8HV8 dT8˜R8 ÌP8 HO8 |M8 àK8 üI8H84F8PD8lB8ˆ@8¤>8À<8Ü:8P28UÐ#8 x8ä8„8|ý7 ü7¬û7¸ú7tø70ö74ô7Ðð7"Äï7 ¸î7 ¬í7  ì7 ”ë7 ˆê7 |é7 pè7 dç7 Xæ7 Lå7 @ä7 üÏ7ÖXÍ7É7)Ⱦ7hl¼7`¯7† ®7 p¬7 Ôª7 À¨7”¦7ø¤7 \£7 À¡7 $ 7  ž7 L7 €›7Œˆ7ÅÈ{7ƒ d7øèM7çh>7Ÿü67Jè47ì&7!74< 7 ¸7K„7݈7¤ÿ6(ö6`˜æ6€ã60à6xÖ6[`Ó6É6\øÄ6$àÁ6Ⱦ6²6{ð©66p¥6#Ÿ64™6P…6­üq6Udm6 ¬j6 Øü1ö17$ò1Xì1(\æ1*€Þ1>äÚ1ÐÓ19ðÎ10È11@Á13@¸1G´°1¸®1 ®1`­1T¬1 H«1 <ª1 0©1 ì£16  1Lœ1*€š1`ˆ14°„1`1~1¤q1v n1¼j1üf1 F1J¼B1 ?1t818´1-¬ÿ0¤é0øè0ìç0 àæ0 Ôå0 Èä0 „ß06(Ý0œÚ0P×04Ô0èÐ0Ì0/Å0F@Â0|¾0$¤²0yh±0 ,°0 ð®0 „­0 ¬0 «0p©0 Ô§0 ¢04T¡0  0 ¼•0i”0T’00¬‹0XŠ0 ‰0 ‡0<…0pƒ0d‚0Ð~0"¸^0QDY06˜R0Cøã+*pÞ++œØ+.„Ò+/ŒÅ+yP¸+z¸µ+ ô²+Œ°+ È­+@¨+/\¢+2Ôœ+/ð–+2 +?”‡+Eƒ+|€+0|+!Üv+"Ør+tn+èj+Ôg+ˆc+!a+È^+ |Z+ V+èP+% L+`H+\C+#0>+$l:+ø6+à1+1+p0+d/+ ˜-+Œ,+ À*+œ)+ `(+ $'+ &+ Ä$+ $+<#+`"+”+(+ d+p+”+¸+Ü++$ÿ*Hþ*lý*\à) ß) ,Û)&Ú)äØ)À×)ôÕ)Í)Ì)Ë)`È)”Æ)€Ä)„Â)0Á) ¹);µ)!ü±)"ª)P ©)¨)ܦ)¸¥)¬¤)P¢)à )ì‘)Lx)u)lq)Ôm)'>'89'8' Ü2' 1' €,',+' ¤%'h$' H'ô' l'0' '¼' 4 'ø ' œ'H' ¼÷&&Hó&Àë&)Äç&`â&,Þ&ô¶&ˆ³&\ª&@М&uTw&[q&2ôl&th&äa&1T\&-äX&üT&ÌM&:<Ò%hÈ%X ¿%Rй%&<²%?­%&È¡%j%!d˜%+(”%!°% % …%G¸t%œ0j%ae%*Da%øZ% ÜT%8ôK%T˜D%A°;%Pè3%DÜ(%hp%Öä$ç¤Ð$¿èÅ$d¸º$gœ¯$gT¤$hp’$­p$¸Tz$'Üt$*Øg$yˆ\$e¼J$«¼:$—$RÄ $uÌé#a Ý#w|Í#šH½# @±#p”¤#tT™#jŽ#l`v#ð¤]#û,Z#pV#$G#–|7#™x+#sè#xP#Et#GÜ#eèù"h¨Ù"Lä¤"&ˆ"Öøx"á c"Ù„K"ëÔ="…€/"Œ\"Ÿ"ªä"~¨ò!‡ŒÝ!Óôº!cŒ³!@˜«!Dž!´!…‡!J¨}!P¤s!Xüh!^˜[!|M!‚˜?!‡\1!‹”#!‡X!‹h!! hô Èò @ñ œï @î í  ë ˜ç pâ (dÙ S¸Ò 14Ë <˜Ç à (¸ dl¬ k¨  ¦ ”¤ 8¢ ÔŸ ´ › œ˜ |– \” <’ ø Ä ì‹ T‰ L„ +Ì q ¥˜n ”` ‰,^ $\ ¼Y W ÈR PN !$L J ¼G @E ,; ^ 1 ]0. X% O( _ À D à l¤ ´ÿûHñ`<íhê€çäTá|ÞpÙ'ÀÖ¬Ó<Î)(ËÀÅ/ØÂ¬³’°ˆ¬¸ŠV°†¤‚Œ~`zÄUqQ (J80C9< ; : ”8 ˜6\5 À)"p$#,¨< 0 Ä Xô ¨óðòðTïç¨ÛœÚ ÀÙäØØ× DѬË)<ȤŠ4¾Ļ´¸´¶Ø[„Z ¨YÌX XtWÈVVSð1œ0 À/ä. .\-°,,ð)ðœ Àä8ŒÈððßœÞ ÀÝäÜ Ü\Û˜ÚÔÙpÙàÞ ¼ÛpÖ*TÔÑ|Ì"LÊ Ç`Å Ô¾ ½ü»ðºä¹à² ±°ü®ð­4¦¨£œ¢¡„ Е Ì’‘<hÜŠ¸€¼~¸{|z@yx o„mG 0B*;&46(”3ì.(T)2ð$$È à¼´    D8 lH  è ¬ ¸ÿÜó „ñ îê„æã$à ,Ý ÄÙTÖdÓ lÐ ÄÍ Ë $È ,Å Ã Ü¿¨¼¨¹¸À¨œ§ x¦  A œ'Œ•C(Œaˆ)„'Ì€ T 0~ $}ø€ ü H ”   ” Ä— ø• “˜È”zdxN€Jä: 8$% Ä"syncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/clientengine_dbg_x86.mch0000755000373300037200000022331412424517753032634 0ustar00nightlyallusers00000000000000Îúï¾#Ë$œ˜Æ^%Tx&(HhˆÀàü8\t”´Øø4T|œÀäü0H`„¤ÀÜø0@`€ ¸Üü,DhŒ°Ôð ,Ll°Èàð0Hlˆ¤¼Øø<L\„œ¸Ø ( H l Œ ° È ä 0 X | ˜ ´ ä  D ` x   À Ð à  ( D d „ œ ¸ Ô ð  < \ x ˜ ° Ì ä $DXpŒ¬Ìè (H”¤´ÄÔô$4DTdt„”¤´ÄÔäô$4DTdt„”¤´ÄÔäô$4DTdt„”¤´ÄÔäô$4DTdt„”¤´ÄÔäô$4DTdt„”¤´ÄÔäô$4DTdt„”¤´ÄÔäô$4DTdt„”¤´ÄÔäô$4DTdtˆ íENHANCED_PROFILES_2004ë MAX_SYNCML_VERSIONëMULTI_PROFILE_SUPPORTèJDEFAULT_EMAILS_MAXKBá¤æDESKTOP_CLIENTëOBJECT_FILTERINGé€SYSYNC_VERSION_MAJORéÖTIMEDSYNC_SUPPORTè RELEASE_YEARé8SYSYNC_VERSION_MAJOR_TXTéySYSYNC_VERSION_MINOR_TXTé 9SDK_SUPPORTê;EXPIRY_DATE_STRINGëwEXPIRES_AFTER_DATEë—EMAIL_ATTACHMENT_SUPPORTé¬ARRAYDBTABLES_SUPPORTè¼NO_LOCAL_DBLOGINé@SYSER_VERSCHECK_MASKéÍCLIENTFEATURES_2008êSYSYNC_MAIN_VERSION_STRINGë,SYSER_VARIANT_CODEëDEFAULT_EVENTS_DAYSAFTERéDEFAULT_EMAILS_DAYSBEFOREè \PCRE_STATICê_REGEX_SUPPORTèrSCRIPT_SUPPORTë SQL_SUPPORTêÕSYSYNC_ENGINEèSYSYNC_BUILDNUMBER_TXTëGHTTP_KEEP_CONNECTIONéÔENGINE_LIBRARYëßDBAPI_ASKEYITEMSéïPROGRESS_EVENTSêDEFAULT_EMAILS_ONLYLASTê)MSGDUMPêtNOWSMè¾ARRAYFIELD_SUPPORTë.SETTINGS_BFI_PREFIXê_STRING_LOCALID_MAXLENè ÀDBAPI_TEXTëÌ__LINK_TOOLKIT_STATIC__êÕUSE_SML_EVALUATIONëîMIMEDIR_SUPPORTê % TARGETIDé . PLUGIN_DLLëc BASED_ON_BINFILE_CLIENTê| SYSER_PRODUCT_CODE_ALT1ê~ SYSER_PRODUCT_CODE_ALT3ê SYSER_PRODUCT_CODE_ALT2ê CSHARP_SUPPORTëÔ SYSYNC_SUBVERSIONèé EMAIL_FORMAT_SUPPORTé CUST_SYNC_FIRMWAREë¿ NOW_WITH_MILLISECONDSèQ DEFAULT_LOCALDB_PROFILEê` SYSER_REGISTRATIONë j EXPIRY_DAYë n SYSYNC_FPIëÈ WIN32è DEFAULT_EMAILS_HDRONLYë. ADAPTITEM_SUPPORTè^ RELEASE_MONTHè­ DEFAULT_TRANSPORT_PASSWDéÉ CUST_SYNC_MODELêÚ SYSER_EXTRA_IDë PROXY_SUPPORTè$DBAPI_TEXTITEMSêXDEFAULT_SOCKS_HOSTëCUST_SYNC_HARDWAREë:DEFAULT_TRANSPORT_USERëÐ?3ëÑ?2ëàSYSER_NEEDED_PRODUCT_FLAGSë ºCLIENT_NAMEêÃDATAOBJ_SUPPORTê8CONSTANTXML_CONFIGë&fSYNCFEST_ALLOW_ALERT_WITHOUT_ITEMLISTè„SYSYNC_VERSION_MINORéŸSYSYNC_VERSION_UINT32èªCONFIGURABLE_TYPE_SUPPORTèýSYSYNC_SUBVERSION_TXTèZIPPED_BINDATA_SUPPORTë2NEW_TIMEZONESè×APPDATA_SUBDIRëQDEFAULT_DATASTORES_ENABLEDë1DEFAULT_EVENTS_DAYSBEFOREè…DLL_PLUGINS_ALWAYS_ALLOWEDë¤DEFAULT_EVENTS_LIMITEDëÃAUTOSYNC_SUPPORTé8TEXTTYPE_SUPPORTé%DONT_STRIP_PATHPREFIX_FROM_REMOTEIDSé3DEFAULT_SERVER_USERê§SQLITE_SUPPORTëöCHANGEDETECTION_AVAILABLEè GLOBAL_OPTIONS_Hé ªSERVER_NAMEê«SYSYNC_FULL_VERSION_STRINGëÅDEFAULT_SERVER_PASSWDèè?_Uêë?_VêENGINEINTERFACE_SUPPORTêDDEFAULT_EMAILS_LIMITEDërFILEOBJ_SUPPORTêCHECKSUM_CHANGELOGë<SERVERALERT_SUPPORTê oJNI_SUPPORTê‹ODBCAPI_SUPPORTêçNO_REMOTE_RULESêRELEASE_YEAR_TXTé5PCDATA_OPAQUE_AS_CDATAë^SYSER_FORBIDDEN_PRODUCT_FLAGSè¾SYSYNC_BUILDNUMBERë)RELEASE_SYDEBUGêÍCGI_SERVER_OPTIONSëÛCUST_SYNC_MANèDEFAULT_ENCODINGéÊSYSYNC_CLIENTèßDEFAULT_SERVER_URIë SYSYNC_VERSION_STRINGèSYSYNC_PLATFORM_NAMEéMSYDEBUGê ©EXPIRY_YEARêSTANDALONE_APPëPSYSER_PRODUCT_CODEëcDEFAULT_PROXY_HOSTë†RELEASE_MONTH_TXTè.SYSER_PRODUCT_CODE_MAINê¯VERSION_COMMENTSéÚSTREAMFIELD_SUPPORTê áEXPIRY_MONTHáß1syncml_vers_1_2121312008"3""2"1"2009-08-31"11110xFFFF00001SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXTSYSER_VARIANT_PRO9010111"7"1111true111"sysynclib_"2561111"sysynclib_win3ß2"11SYSER_PRODCODE_CLIENT_ODBC_PRO_WIN32SYSER_PRODCODE_CLIENT_LIB_DESKSYSER_PRODCODE_CLIENT_LIB_ALL101NULL1""131"-//Synthesis AG//NONSGML SyncML Engine V" SYSYNC_FULL_VERSION_STRING "//EN"true11NULL"SySyncß Client Library PROTO Win32"SYSER_EXTRA_ID_PROTO11NULLNULLNULLSYSER_PRODFLAG_MAXRELDATE"Synthesis SyncML Client/" SYSYNC_FULL_VERSION_STRING " [en] (" SYSYNC_PLATFORM_NAME "; I)"1112(((uInt32)SYSYNC_VERSION_MAJOßR<<24)+((uInt32)SYSYNC_VERSION_MINOR<<16)+((uInt32)SYSYNC_SUBVERSION<<8)+(uInt32)SYSYNC_BUILDNUMBER)1"0"11"synthesis.ch\\SySyncLib"false301false111""11"Synthesis SyncML Server/" SYSYNC_FULL_VERSION_STRINGSYSßYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT "." SYSYNC_BUILDNUMBER_TXT""1true111111"2008"10721SYSYNC_OEMSML_WBXML1"http://www.synthesis.ch/sync"SYSYNC_VERSION_MAJOR_TXT ".Ñ" SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT"Win32"220091SYSER_PRODCODE_CLIENT_OUTLOOK_PRONULL"1"SYSER_PRODCODE_CLIENT_LIB_WIN32"Demo expires after " EXPIRY_DATE_STRING " if not registered"18åâ`é(âbéHâréhâtåäá¤îˆâvéÀâxéàâzéüâ|éáé8á…é\á‰étá‹é”á˜é´ášéØáœéøážéá é4á«éTá­é|áãéœáõéÀáøéäáûéüíí0áýéHáÿé`áé„áé¤áéÀá éÜá éøá éáé0áé@áé`áé€á%é á)é¸á+éÜá-éüá/éá1é,áCéDáEéháGéŒálé°á‹éÔá©éðá«é á­é,á¯éLá´élá¶éá¹é°á»éÈá¾éàíðá éáé0áéHáéláéˆá=é¤áRé¼áTéØáVéøá[éá`é\áeé„áéœáÛé¸áÝéØáßé ááé( áãéH áeél ágéŒ áké° áméÈ áoéä á‰é áé0 á’éX á”é| ášé˜ áœé´ ážéä á é á£é á¥éD í` á§éx áÝé  áHéà áKé áMé( áRéD áTéd áVé„ áXéœ áZé¸ á\éÔ á^éð áeé ágé< áié\ ákéx ámé˜ áoé° ázéÌ á„éä á†éá¥é$áõéDáýéXáÿépáéŒáé¬á(éÌá-éèá1é áQé(áéHá‘åã<å„áä<áÀãÿèäÜáøìÿíLåáäLáPãÿèälðÿáÀ å˜áäÀ áÔãÿèäððÿáÐ åáäÐ áXãÿèätáìÿéˆþãöˆ›ãöˆ›ãö€ˆþãöúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþøúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþøúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþøøúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþúþö‚úþúþúþúþˆ œˆ üxf΀â^èsyncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/clientengine_dbg_x86_prefix.h0000755000373300037200000000027412424517753033667 0ustar00nightlyallusers00000000000000/* prefix file * =========== * */ #ifdef __cplusplus #include "clientEngine_dbg_x86++.mch" #else #include "clientEngine_dbg_x86.mch" #endif #include "target_options.h" /* eof */ syncevolution-1.5/src/synthesis/src/Targets/clientEngine_dbg/target_options.h0000755000373300037200000001326512424517753031372 0ustar00nightlyallusers00000000000000/* Target options * ============== * * */ // SYNCML CLIENT ENGINE LIBRARY WIN32 // ################################## // define platform // - we are on Windows #ifndef _WIN32 #define _WIN32 // needed for MWERKS #endif #ifndef WIN32 #define WIN32 // needed for others #endif // Release version status #undef RELEASE_VERSION #define RELEASE_SYDEBUG 2 // extended DBG included //#define OPTIONAL_SYDEBUG 1 // now include platform independent product options (which include global_options.h) #include "product_options.h" // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync Client Library PROTO Win32" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware // String used to construct logfile names #define TARGETID "sysynclib_win32" // Configuration // ============= // Default profile #undef HARD_CODED_SERVER_URI #undef HARD_CODED_DBNAMES #define DEFAULT_SERVER_URI "http://www.synthesis.ch/sync" #define DEFAULT_LOCALDB_PROFILE "" #define DEFAULT_SERVER_USER "" #define DEFAULT_SERVER_PASSWD "" #define DEFAULT_ENCODING SML_WBXML #define DEFAULT_TRANSPORT_USER NULL #define DEFAULT_TRANSPORT_PASSWD NULL #define DEFAULT_SOCKS_HOST NULL #define DEFAULT_PROXY_HOST NULL #define DEFAULT_DATASTORES_ENABLED false #define DEFAULT_EVENTS_DAYSBEFORE 30 #define DEFAULT_EVENTS_DAYSAFTER 90 #define DEFAULT_EVENTS_LIMITED false #define DEFAULT_EMAILS_LIMITED true #define DEFAULT_EMAILS_HDRONLY true #define DEFAULT_EMAILS_MAXKB 2 #define DEFAULT_EMAILS_ONLYLAST true #define DEFAULT_EMAILS_DAYSBEFORE 10 // Eval limit options // ================== // Note: Hard expiration date settings moved to product_options.h // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // Engine does not have auto-demo // Identification for update check and demo period #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO #define SYSER_PRODUCT_CODE SYSER_PRODCODE_CLIENT_LIB_WIN32 #define SYSER_EXTRA_ID SYSER_EXTRA_ID_PROTO // - if defined, software can be registered #define SYSER_REGISTRATION 1 // - define allowed product codes #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_CLIENT_LIB_WIN32 // we need a sysync library license for windows #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_CLIENT_ODBC_PRO_WIN32 // a PRO license for the Win console client is ok as well #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_CLIENT_LIB_ALL #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_CLIENT_LIB_DESK #undef SYSER_PRODUCT_CODE_ALT4 // - define needed product flags // only licenses that are release date limited (or explicitly NOT release date limited, // or time limited) are allowed #define SYSER_NEEDED_PRODUCT_FLAGS SYSER_PRODFLAG_MAXRELDATE #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // for this DBG variant, DLL plugins are always allowed // (even with licenses that do not have SYSER_PRODFLAG_SERVER_SDKAPI set) #define DLL_PLUGINS_ALWAYS_ALLOWED 1 // SySync options // ============== // - enhanced profile record #define ENHANCED_PROFILES_2004 1 #define CLIENTFEATURES_2008 1 // - support for automatic syncing (timed, IPP, server alerted...) #define AUTOSYNC_SUPPORT 1 // - support for intelligent push & poll (IPP) //#define IPP_SUPPORT 1 //#define IPP_SUPPORT_ALWAYS 1 // regardless of license flags // - support for timed sync #define TIMEDSYNC_SUPPORT 1 // - support for WAP push alerted sync #define SERVERALERT_SUPPORT 1 // - support for Proxy #define PROXY_SUPPORT 1 // - support for multiple profiles #define MULTI_PROFILE_SUPPORT 1 // - show progress events #define PROGRESS_EVENTS 1 // - we do not need to squeeze code #undef MINIMAL_CODE // - script with regex support #define SCRIPT_SUPPORT #define REGEX_SUPPORT // - client does not need target options #undef SYSYNC_TARGET_OPTIONS // - filters #define OBJECT_FILTERING // - client does not need superdatastores #undef SUPERDATASTORES // general options needed for email #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 #define ARRAYFIELD_SUPPORT 1 // - if defined, stream field support will be included #define STREAMFIELD_SUPPORT 1 // - if defined, semi-proprietary zipped-binary for items (any type) can be used // (enabled on a by type basis in the config) #define ZIPPED_BINDATA_SUPPORT 1 // - where to save application data by default (if not otherwise configured) // APPDATA_SUBDIR is a subdirectory of the user's "application data" dir. #define APPDATA_SUBDIR "synthesis.ch\\SySyncLib" // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 // Datastore Options // ----------------- // - support DBApi tunnel #define DBAPI_TUNNEL_SUPPORT 1 // - link in customimplds on top of binfile #define BASED_ON_BINFILE_CLIENT 1 // - SQL and API datastores have changedetection, so build binfile for that #define CHANGEDETECTION_AVAILABLE 1 // - we need a separate changelog mechanism #define CHECKSUM_CHANGELOG 1 // - string localIDs with sufficiently large size #define STRING_LOCALID_MAXLEN 256 // - supports ODBC, SQLite and DBApi #define SQL_SUPPORT 1 #define ODBCAPI_SUPPORT 1 #define SQLITE_SUPPORT 1 // - master detail (array) tables supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included #define SDK_SUPPORT 1 #define PLUGIN_DLL 1 // external DLL allowed as well // - define what SDK modules are linked in //#define DBAPI_DEMO 1 #define DBAPI_TEXT 1 //#define DBAPI_SILENT 1 #define DBAPI_LOGGER 1 #define DBAPI_SNOWWHITE 1 #define JNI_SUPPORT 1 #define FILEOBJ_SUPPORT 1 #define ADAPTITEM_SUPPORT 1 #ifdef _WIN32 #define CSHARP_SUPPORT 1 #endif /* eof */ syncevolution-1.5/src/synthesis/src/Targets/sysytool/0000755000373300037200000000000012424517753024633 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Targets/sysytool/define.h0000755000373300037200000000777612424517753026262 0ustar00nightlyallusers00000000000000 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: this is a local copy for this specific target // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /*************************************************************************/ /* module: Compiler Flag Definition File */ /* file: define.h */ /* target system: mac os x */ /* target OS: mac os x */ /*************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for MacOS X Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H //#define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target */ #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND //#define ATOMIC_SEND //#define ATOMIC_RECEIVE //#define COPY_SEND //#define COPY_RECEIVE //#define EXEC_SEND //#define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE //#define SEARCH_SEND //#define SEARCH_RECEIVE //#define SEQUENCE_SEND //#define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC #endif syncevolution-1.5/src/synthesis/src/Targets/sysytool/sysytool++.pch0000755000373300037200000000077612424517753027377 0ustar00nightlyallusers00000000000000// precompiled headers source file // SySync is a C++ project, make sure precomp headers // are compiled as C++! #pragma cplusplus on // determine target file name #if __INTEL__ #pragma precompile_target "sysytool_x86++.mch" #else #error "undefined target, cannot set precompiled header file name" #endif // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - precompilable headers #include "sysytool_precomp.h" // eof syncevolution-1.5/src/synthesis/src/Targets/sysytool/sysytool.pch0000755000373300037200000000075412424517753027245 0ustar00nightlyallusers00000000000000// precompiled headers source file // C-version for SyncML toolkit files #pragma cplusplus off // determine target file name #if __INTEL__ #pragma precompile_target "sysytool_x86.mch" #else #error "undefined target, cannot set precompiled header file name" #endif // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - SML toolkit including xpt part #include "smltk_precomp_xpt.h" // eof syncevolution-1.5/src/synthesis/src/Targets/sysytool/sysytool_linux_x86_prefix.h0000755000373300037200000000116212424517753032215 0ustar00nightlyallusers00000000000000/* prefix file * =========== * */ #ifdef __cplusplus // include all headers that are suitable for precompiled use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - precompilable headers #include "sysytool_precomp.h" #else // include all headers that are suitable for precompiled // C version use // - target options can incfluence everything #include "target_options.h" // - platform specifics #include "platform_headers.h" // - SML toolkit including xpt part #include "smltk_precomp_xpt.h" #endif /* eof */ syncevolution-1.5/src/synthesis/src/Targets/sysytool/sysytool_x86++.mch0000644000373300037200002022253412424517753030076 0ustar00nightlyallusers00000000000000Îúï¾#Ë$xço·ã5Ƶɿ}ô6(€@v>ô.hö@3<ŽGÜÜo•€Ýo°æo,-XÌ\¬@$pØd„È80XèH |  @ \ ä , 8 °  < Ô ÄdD0€0¨,,`ìX(„°H $¤äЄð<¤¨Ìt Ð P!ø!D"Ä"P#è#4$¨$8%%Ð%Ô&d' (¨(,)´)¨*„+,”,-à-d.Ø.¤/`0Ð01t1t2Ð2\3À3484ü4ˆ5¼56¤6t748„8$9ì9Ô:@;ì;È<T=Ü=H>¨>p?ð? @€@È@A¤AB˜B CœCDŒDØDFlF¤GL>œ>t?Ð?x@AxAÔA„BÈB@CìCœDèD¸EŒFTG GÀG@HüH˜IðILJìJK4LxLèL@M€MàM¬NÜ>ø?´@@AøA˜BCÀC\D´DE¼E@FlFÌF˜GHÔHìIàJ|KˆLÌLÀMøM4N¼N@O„OpPÌPxQìQRTRŒRlS¤T0UVÌVTW X XhY$Z Z8[L[`\4]8^ô^(_@_ _¤`Œapb,c„cTdÜd”e`f¸fpgŒg$hÄh i¨iÀidj@kxkŒkÈkœ>h?ä?à@ˆALBèB¬C°DxE(F`FxF GôG°H IŒI(Jà>d?Ü?$@\@Ä@ A$B„B$C”ClDœDElETF(GdGðGLHÐHXIäIlJ´JK|K(LüL„M8N|NôNÌOTPØP„QøQ¤RÄR$SXSÔSpTLUÔUtVˆVøVlWüW˜XìXYlY¨Y$ZDZÐZP[Ä[\Œ\]À]”^ð^\_\`Ä`$aèaðbcœcÈc4d¤dôdˆeftfðfì>X?Ô?(@p@4AÄABàB\CD¸DDExE¤ELF¸F8GDH¼HDIÐI4J”JK´K€LMPMðMN@NL>¨>Ø>?˜?`@ A¨AàApB´B CD”DlE$FTF°G|HðH0I€I$J¸JKÀKðKhL8MœMTNÜNÄOøO8PPàPQQœRXSÜS,TàTøT$U¸UðU`VWDWXLX¬X,YÌY Z˜ZÌZ0\@]„]À]ü]^ˆ^ô^L_`ð`@aÈaHbc€c$dXdðd`e8f°fg`g@høhli(jk`kØkD>°>?¨?T@4AdAHBC ´> t? à? 0@ ¬@ @A ´A ¤B ðB D `D E œE ÔE 8F äF @G ¨G H ØH €I øI |J ¸J \K ¨K @L TM ÐM $N O ¼O P ¬P (Q œQ ìQ lR üR ÈS $T DT ŒT (U ðU PV W |W PX Y $Y ÄY 8Z ”Z Ì[ „\ ð\ Ì] T^ Ô^ 4_ ` ¼` la Pb c Àc @d ¼d ,? ? @ @ A dA B äB 0C ¤C PD ¨D ¼D èD (E ÀE $F °F €G ðG ¨H I °I J \> ? ð? A ˜A  B øB (C ÈC 8D €D ø> h? ¼? ,@ `@ @ Ð@ pA B @B ÄB ÔC L?„?@Ô@PAìA,B¸B?\?Ì?X@ì@ŒABÀB C°C,D`DE\?œ@tAèA´BìC,DE”E$>¸>Ø>ü>?0>@>`>>À>à>?@?`?¤?Ä?ä?@$@D@d@¤@´@ä@ø@A(AXAˆA¨AÈAB(BHBxBˆB¸BØBèBøB(CˆC¨CØCèCD(DhDˆDÈDèDøDE(E8EHExE˜E¸EØEèE(FHFxF˜FÈFøFG8GHGˆGèGøGH(HhHxH¨HÈHØHHIhI˜I¨I¸IÈIJJHJxJ˜JÌJKLK€KK´KÄK$LDLtL”L¤LØLèLøL8MXMhMxM˜MÈMèMN(NHNXNhNxNÈNèNO8OHOxOˆO¼OÌO P,>L>l>|>¬>Ì>Ü>ì>\?¬?Ì?ü?@\@|@œ@¼@ì@ A,A,><>L>|>œ>Ü>ì> ??,?L?\?|?¼? @L@|@Œ@Ì@ø@AAXAhA˜A¨AèABhB¸BèBøB(CXC˜CÜC D$>\>|>¬>¼>Ü>ü>?JhËJ¼K˜0K ¹KècL@~Lh´L¿LPÕLpM¸/M”}MؼM,ÝMtùM¸ NÈ$N9NHFNÔTNLuN €Nô½NøËNäÔN ßNøOHO3O GOø_OÀwO €OÈ”O´ÞO`îOTPLyP(ŽPlšPܧP8ÄP„èPœÿPQ´ QP+QLQ„gQ€vQœ‡Qü“Q £Qø±Q4¼QèËQláQPûQ\RRÌBR`gRpqR(yRÈŸR”ØR0ÞRÀìRûRÄSØS<;S IS°XSô_SàrS,€SxSܨS`ÀSXÙS@êS óSýSäTô TÔT -Tä5TXHT„RT¨`T¼qT {T€ˆT¨”TôžT|¢Td­T¼TèÆTäÒTLßTûT@U"UÔ2U0^TG^N^¨Z^¼a^ài^ o^w^¤}^(’^Ę^€ ^®^h¹^ÌÈ^ÜÐ^â^ è^4ð^Lü^äþ^ø__8_¤_€*_è-_ 1_P;_„E_¤P_tV_´e_¬t_$y_0ƒ_L_à¡_ø§_`³_Ľ_œÆ_<Ï_€Ù_Äá_ðé_ó_¼ø_¬`Œ ``°`<"` *`8<`0D`ôH`P` ]`lf`ôl`œw`4ƒ`€``”`Ä¢`Hª`\±`¸`hÁ`xÇ`@Ô`dÝ`â`äð`Œò`Äû`Ôaà a¸aÐaøa€#að&a\1a07aÔMaÀTacFcdKcøPcTcØXc¸^c ec|nchvcÀ€cð…c‘cˆšc¤cĬcð³cä¹cTÄcÔÌc€ÐcÕcÚcLçc4ðc¸úcÜÿc$d` dPd|d¬(d4d,;d(AdäGd\NdäNdàSd$Xd[dà^d8gdkdÄndÈqd”ydè~dÄ‚dü‡dXŒdtd¬–død`¦dÔªdØ´dDÀdÜÄd$Êd$ÒdlÕdXÙd¼ÛdØãd`ídŒòdØúdþd et e¬e|!eà#e.e°5eÀ9e,>ej¨AjìDjÄNjkàBkDk8MkSk|]küekÐnk´rkØukÈzkôkx‡knœCn0InØLnLRnpVnp[n@^n0anhn0mnsnðynˆ}n´n<‡nìŽn¼—np›nÈ¢n¨nè®nè³nȸnÀÀnøÆn ÌnèÐn|ÒnlÚntàn¸ènüïnÈôn ooD o¤o¬otoà oÜ)oð2oü7oè:ot@oTCopGoØMoÀRo¼Woddoho,noTuox{o0oÜoX‡oøŒod”oXœo¤¡oÔ¦o<®oD´o¼oÃoËoXÐoÄÕoãè mon_cmpt_ptrá,è@6818TèSTATUS_FLOAT_INEXACT_RESULTâ|èSEC_E_UNSUPPORTED_FUNCTIONã”è DOF_PROGMANâ´èLOCALE_SENGLANGUAGEâÔèLPMCI_SYSINFO_PARMSâðèIN_CLASSA_NSHIFTëSTGM_SHARE_DENY_READá å @6819Då_EXIT_THREAD_DEBUG_INFOâ`åGetCommandLineWâ|åPMCI_OPEN_PARMSWá”å MO_5_LIMDOWâ¬åtagDISPPARAMSèSERVICE_TABLE_ENTRYAáàå spawnvpeâåNdrClearOutParametersåSQLSpecialColumns@åSQL_DESC_MAXIMUM_SCALEëSQL_SET_DEFAULTâxåOffsetToEntriesâˆåcArgsèINET_E_REDIRECT_TO_DIRãàå'ERROR_DS_HIERARCHY_TABLE_MALLOC_FAILEDäåVS_FFI_STRUCVERSIONâå GetClassIDë!IDataObject_EnumDAdvise_ProxyTåroundfãhå construct„åoverflow_errorã¨åEXCEPTION_INVALID_HANDLEáÀå VerFindFileWáàåMCI_GETDEVCAPS_PARMSáåJOB_NOTIFY_FIELD_NOTIFY_NAMEéVarFormatDateTime@åMB_RETRYCANCELãTåwireSNBêcbSizeInstanceã”åTAPE_DRIVE_FIXED_BLOCKã¬å WSAEREFUSEDâ¼åcchâÔåptMinPositionìå CopyLZFileãå PATCHARRAYã åWSASYS_STATUS_LENLå CRYPT_OID_DECODE_OBJECT_EX_FUNCâhåPSNRET_INVALIDãˆåAPD_STRICT_UPGRADEã˜å @7800¼åODBC_ERROR_INVALID_PATHêSQL_CONCUR_LOCKâøå SECTION_ALL_ACCESSã(å# CMSG_CMS_ENCAPSULATED_CONTENT_FLAGãDå pszHeaderTitleë RegisterObjectParamâtå @6812è Sbzâ¤å MAX_SYNCML_VERSIONã´å @6813è HPALETTEáÜå vsnprintfðå roundläå @6814å SS_CENTERIMAGEë IOleInPlaceSiteâHå @6815`å elfCultureã€å OUTLINETEXTMETRICAã”å GWL_IDã¸å VP_TV_STANDARD_WIN_VGAãäå! RPC_CONTEXT_HANDLE_DEFAULT_FLAGSáøå WSADataâ å MP2_8mmê SQL_API_SQLPRIMARYKEYSã@å@6816è IXMLDOMNodeâhå @6817„åNORM_IGNOREWIDTHá´å#CertGetSubjectCertificateFromStoreãÌå DECIMAL_NEGêEnumObjectParamã å CS_SAVEBITSâ å VerFindFileAá4 åIN_CLASSC_NSHIFTé RemHBRUSHè)IInternetSecurityMgrSite_GetWindow_Proxyá” å LocalUnlock⬠å PS_GEOMETRICáÐ åCTRY_TRINIDAD_Y_TOBAGOë+IXMLDOMDocument_put_resolveExternals_Proxyã$ åwcProviderDataëWN_NOT_SUPPORTEDéSQL_FILE_TABLEãt ånegative_signˆ å ne_modtab¨ åPEMRPOLYPOLYLINE16ãÌ åtagEMRGLSBOUNDEDRECORDëIClassFactoryü å DMBIN_AUTOã åWN_OPEN_FILESè TYSPEC_CLSIDáH åGetCommandLineAâl åPSINJECT_BEGINPAGESETUP∠åPMCI_OPEN_PARMSAá° åCHANGER_MOVE_EXTENDS_IEPORTâÜ å%IOleClientSite_GetContainer_Proxyü åSERVICE_TABLE_ENTRYWá åSQL_FN_STR_LTRIMéSQL_GB_NO_RELATIONãH å Grouph åMETA_SETVIEWPORTORGâ„ åIN_CLASSB_NSHIFTé_CMSG_KEY_AGREE_RECIPIENT_INFOãÈ å _MSL_POSIXãÜ åRC_NONEêPCMSG_KEY_TRANS_RECIPIENT_INFOã$ å_MSL_MEM_FUNCSëstartSyncFunc\ åOUTLINETEXTMETRICWãt å tagEMRFORMATጠåIID_IPipeLong¤ å ResizeBorderáÀ åSetParamCustDataéV_BYREFâô åSYSTEM_AUDIT_ACE_TYPEèdwTickCountDeadlineâ,å SML_PE_ALERTáXå!ERROR_DS_ILLEGAL_BASE_SCHEMA_MODápåWM_SHOWWINDOWœå IOleLink_SetSourceMoniker_ProxyêIXMLDocument2_put_URL_StubãÔåatanáôåWT_EXECUTEINUITHREADáå HTNOWHERE$åDDE_FREQUESTEDãPå"MIXERCONTROL_CT_SC_TIME_MILLISECSè LogActionˆåwglSetLayerPaletteEntries åCharUpperBuff¸å mixerGetIDãÜåMCI_WAVE_STATUS_CHANNELSáå%IRunningObjectTable_Register_Stub(åSQL_SDF_CURRENT_TIMEéSQL_DS_CASCADEãdå SmlDevInfFilterCap_táå! PIMAGE_CE_RUNTIME_FUNCTION_ENTRYá¼å% CMSG_SIGNER_INFO_PKCS_1_5_VERSIONèå% PRINTER_CHANGE_ADD_PRINTER_DRIVERå! ITypeInfo2_GetParamCustData_Stubé SQL_API_SQLTABLESLå!_SW_STACKOVERFLOWhå!NETINFO_DISKREDê!SetClientSite˜å"dwLowDateTime¼å"ERROR_EXE_MARKED_INVALIDáÐå"ASPECTYâðå"RPC_FLAGS_VALID_BITê"CMSG_OID_EXPORT_KEY_TRANS_FUNCã0å#ASPECTXâHå#SetBrushOrgExXå #hTasktå#EnumCalendarInfoW å!#CERT_DIGITAL_SIGNATURE_KEY_USAGEá¸å#LPJOB_INFO_2WÜå#INET_E_CANNOT_LOAD_DATAâå/#IInternetZoneManager_SetZoneActionPolicy_Proxyë #VarUI2FromR4áDå $SBS_VERTáhå$RPC_AUTH_IDENTITY_HANDLEá€å $pPackageNameé!$__IMalloc_INTERFACE_DEFINED__¸å %nCodeÔå%WNNC_NET_MASFAXâìå %_JOB_INFO_1Wáå%IOleObject_GetUserType_Proxyé %REGKIND_NONEáDå &lpReserved2â\å &WA_INACTIVEâpå &DFCS_MONOœå%&szOID_CERTIFICATE_REVOCATION_LISTÄå!&ISurrogate_LoadDllServer_Stubøå-&IOleInPlaceObject_ReactivateAndUndo_Proxyå&OnUIDeactivateë &NODE_INVALIDáHå'TransactNamedPipeè 'tmFirstCharâxå (PTOKEN_USERâ å!(ERROR_CLUSTER_INVALID_NETWORK¸å (X509_INTEGERé)(CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFOáå)AUTH_BUFFER_SIZEá å )tagCWPSTRUCTáDå)IPersistStream_Save_Proxyè)SQLREALâxå*SML_PE_ATOMIC_STARTâ”å*SE_SHUTDOWN_NAMEá°å*DMPAPER_B_PLUSãÌå*PFD_SUPPORT_GDIâèå*BAD_TRACK_NUMBERáüå*pRecordê*IXMLElement2_setAttribute_Stubã@å+lpThousandSepXå +MIDIPROP_SETálå+tyspecë +PJOB_INFO_2Aá˜å ,Subsystemè ,waveInStartâÌå-DynamicAvailableáäå -STOCK_LASTãå-RpcBindingInqAuthClientEx å -hStoreProvã4å -GetBufferè -PARAMDATA\å.tm_minã”å-.CERT_PHYSICAL_STORE_DS_USER_CERTIFICATE_NAMEá¨å.pparrayâÈå.??_7ITypeComp@@6B@ãèå.BSTR_UserUnmarshalãüå .V_BOOLREFè.SQL_ROW_NUMBER_UNKNOWNãDå/TOKEN_ADJUST_SESSIONIDãpå/JOB_OBJECT_SECURITY_ONLY_TOKENã„å /fReservedœå /ModifyMenuWâÄå/CRYPT_OID_DECODE_OBJECT_FUNCáôå#/IXMLDOMNamedNodeMap_nextNode_Proxyã å /VarUI2FromR8é /lpCustColorsáDå0DMMEDIA_TRANSPARENCYá\å 0SO_MAXPATHDGá|å0OLEMISC_NOUIACTIVATEé0IInternetProtocol_Seek_Proxyá¼å 1first_nodeãèå"1RPC_C_PROTECT_LEVEL_PKT_INTEGRITYè1IXMLElement_get_parent_Proxyá$å 2OF_CANCELDå2WSA_QOS_NO_SENDERSã\å 2NTE_BAD_VERâpå 2nVersionáˆå 2MM_HIMETRICâ¬å2EMRMODIFYWORLDTRANSFORMâÀå 2ELEMDESCé2URLDownloadToCacheFileãå3SmlDevInfSyncCap_tã(å3SCARD_E_FILE_NOT_FOUNDã@å3OffsetClipRgnlå!3OBSOLETE_IOCTL_STORAGE_RESET_BUSá„å 3_JOB_INFO_1Aá å3GetParamCustDataá¼å3GetTypeInfoOfGuidè3V_I8REFâìå4SQL_SCROLLABLEë4SQL_ATTR_CP_MATCH$å5EnumCalendarInfoA<å5LPJOB_INFO_2AXå5MessagePendingãlå5boolValê 5IID_IBindingá”å 6coshf¨å 6NTSYSAPIáÐå6ERROR_INVALID_REPARSE_DATAë6WSA_QOS_EOBJLENGTHãå 7RC_DIBTODEVê(7MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISCâXå8smlResultsCmdFunclå8nRadiusâ„å 8RDW_ERASENOWé8SQL_IS_SELECT_INTOãÄå9GenericReparseBufferáàå9EnableMenuItemãøå 9ModifyMenuAâå 9LPDROPSTRUCTá0å9VIF_CANNOTLOADCABINETPå9rcv_any_outstandingâpå9_MIDL_FORMAT_STRINGâ€å9CYë9FSCTL_REQUEST_BATCH_OPLOCKë:RPC_S_SERVER_UNAVAILABLEáèå;SYSYNC_PRECOMP_Há å!;ERROR_REMOTE_STORAGE_MEDIA_ERRORá0 å;CERT_E_REVOKEDãD å ;NCBNAMSZé$;__IWindowForBindingUI_FWD_DEFINED__â„ å <coshl  å<__wrap_iterator⸠å <NtCurrentTebé <ExtFloodFilláì å=InputIterator1ã!å =DMLERR_BUSYâ!å =PJOB_INFO_2Wá4!å=LPENUMUNKNOWNè=ODBC_SYSTEM_DSNâl!å>InputIterator2ã„!å>LANG_ESTONIAN¬!å>SPAPI_E_KEY_DOES_NOT_EXISTãÈ!å>GetPaletteEntriesä!å>IBM_Magstar_3590é >Continueá"å?MKF_MOUSEKEYSONâ("å?IOC_INë?CMSG_CTRL_ADD_CRLT"å @@6838p"å@HANGEUL_CHARSETâŒ"å@EMRPOLYBEZIERTO16¬"å@tagMCI_OPEN_PARMSWë @SQL_NUMERICâÐ"åAaà"å A@6839ø"å AEnumPropsAã#åAVFT2_DRV_DISPLAYá0#åAmciGetDeviceIDWêACLSID_PSInPlaceActive\#åBbp#å BKillTimerˆ#å BIChannelHooká¤#åBGetFuncCustDataâÈ#åBEnumDependentServicesWëBSQL_CP_STRICT_MATCHâô#åCc $å CGetDCOrgExã$$åCLPJOB_INFO_1WèCcacâL$å DFLT_EPSILONâX$åDd|$åDERROR_INVALID_DWP_HANDLEé DDNS_ERROR_RECORD_ALREADY_EXISTSâ´$åEeÈ$åEwcsncmpâä$åEWM_NOTIFYFORMATâü$å E_JOB_INFO_2Wá%åEVarAddëESQL_ATTR_CURSOR_SENSITIVITYâL%åFwcsrevãX%åFft%åFVirtualQueryExëFTIMEFMT_ENUMPROCW¤%åGtm_mdayâ°%åGgèG_CERT_CHAIN_ELEMENTâà%å H@6830ì%åHh&åHCreateWindowExAâL&å9HIOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxyáx&åHIXMLDocument2_get_dtdURL_Proxyãˆ&åHcahâ¬&åHSQL_DESC_CASE_SENSITIVEêHSQL_EXPRESSIONS_IN_ORDERBYãä&å I@6831ð&åIi'å ILANG_RUSSIANá0'åIIXMLElement_get_type_Proxyã@'åIcaiêIPIDMSI_STATUS_INPROGRESSáx'å Jstrncolláˆ'å J@6832”'åJj¬'å JlcsEndpointsáÈ'åJDMPAPER_A_PLUSãÜ'å JWidenPathü'åJPCERT_TRUST_STATUSë JlVerb(å K@6833((åKk@(åKpfnUnmarshallX(å KPJOB_INFO_1Aál(å KpuintValá„(å Kday_secondëKSQL_OSCC_NOT_COMPLIANTã¸(å L@6834Ä(åLlä(åLIMAGE_REL_BASED_HIGHá)åLTAPE_ABSOLUTE_POSITIONã)åLTIME_MSêLcalâ8)åMmH)å M@6835d)åMCBN_SELENDCANCELáˆ)åMtagMCI_OVLY_OPEN_PARMSAâ )å MPF_VOICEVIEWé M_CPS_URLSÀ)åNnÐ)å N@6836ð)åNFILE_WRITE_ATTRIBUTES*åN_IMAGE_SEPARATE_DEBUG_HEADERá4*åNVER_PRODUCT_TYPEáH*å NDebugInfol*åNDRAGDROP_E_NOTREGISTEREDá„*å NcaBlueGammaêNMCI_ANIM_OPEN_NOSTATICã¸*å O@6837Ô*åOnext_permutationáà*åOoá+åOmaxWorkspaceAvailMemá+å OWM_KEYLASTãH+å$OIRpcChannelBuffer_IsConnected_Proxyâh+åOSafeArrayPutElementêOOFN_SHARENOWARNâ+åPp +åPcapâ¼+åPTIMEFMT_ENUMPROCAÔ+åPMCI_ANIM_RECTè+å PFARSTRUCTèPdwModemModelSizeá ,åQTCI_SRCCHARSETã8,åQSetBoundsRect\,åQPERF_COUNTER_DEFINITIONâh,åQq|,å Qclipdataé Qcaclipdataã ,åRrÄ,åR_TOKEN_INFORMATION_CLASSáØ,å RbVersionáô,åRDIALOPTION_QUIETéRSQL_ATTR_MAX_ROWS-åSs<-åSOF_SHARE_DENY_NONEã\-åSERROR_BAD_USERNAMEãx-åSCTRY_SOUTH_AFRICAŒ-å SMMVERSION´-åSRpcServerInqDefaultPrincNameáÌ-å S_JOB_INFO_2Aé SSC_HANDLEì-åTtü-å TCLSID.åTMMIOERR_CANNOTCLOSEâ@.åTMS_DEF_DH_SCHANNEL_PROVêTEnumDependentServicesAãx.åUisspaceâ„.åUuœ.å UWNNC_NET_DCEáÀ.åUCHANGER_EXCHANGE_MEDIAëULPJOB_INFO_1Aä.åVv/åVtagMCI_OPEN_PARMSAã/åVbuflenã4/åVpPrintProcessorâ`/å VITypeInfo_ReleaseFuncDesc_Proxyâ„/åVCLSID_InternetZoneManagerèVSQL_SR_DELETE_TABLEâ°/åWwÈ/å WEnumPropsWãè/åWHKEY_PERFORMANCE_DATA0åWmciGetDeviceIDAâ(0åWCertRegisterPhysicalStore<0åWFR_DOWNêWIMC_GETCOMPOSITIONFONTãl0åXx„0å XPROFILE_USERáœ0å XDLGC_BUTTONâ´0åXSO_DISCOPTLENèXtagRemSTGMEDIUMâÜ0åYyèYERROR_REPARSE_TAG_INVALID 1åZz01åZ_CRYPT_RC2_CBC_PARAMETERSD1å ZcVersioné#ZIBindCtx_RemoteSetBindOptions_Stubã¤1å$[SML_ERR_A_UTI_UNKNOWN_PROTO_ELEMENTâÀ1å[GMEM_DISCARDABLEáè1å[FindCloseChangeNotificationâ2åYPE_E_DLLFUNCTIONNOTFOUNDã42å[tagMCI_OVLY_OPEN_PARMSWâH2å [wLibFlagsè [IXMLDOMEntity_get_systemId_Stubâ2å\PENHMETAHEADERã¬2å\SS_ENHMETAFILEë\CMSG_SIGNER_CERT_ID_PARAMä2å]fstreamâü2å ]is_pointerã3å ]smlStatusCmdáD3å$]ERROR_CLUSTER_SYSTEM_CONFIG_CHANGEDê ]PJOB_INFO_1Wáx3å^CreateWindowExWâœ3å^MCI_GETDEVCAPS_CAN_PLAYê^SERVICE_STATUS_PROCESSãì3å _AsyncIPipeLong_Finish_Push_Stubê _IPropertyBagá4å `FillMemoryë`TF_REUSE_SOCKETâH4å a@6829T4åaA|4åaIMAGE_SYM_CLASS_FAR_EXTERNALá˜4åaTYPE_E_SIZETOOBIGÄ4å a__IRpcProxyBuffer_FWD_DEFINED__âä4åaHACCEL_UserMarshalë aSQL_NC_LOWã5åbERROR_CREATE_FAILEDâ05å bLR_SHAREDH5å bREGISTERINGâl5åbPRINTER_STATUS_OFFLINEëb??_7IMarshal@@6B@œ5å c_PRSHT_H_ècDeletePrinterDriverâè5å dERROR_ITERATED_DATA_EXCEEDS_64kê!dIXTLRuntime_formatIndex_Proxy,6åeCreateProcessAãL6åeSEC_E_CERT_UNKNOWNãl6åe??_7IEnumSTATSTG@@6B@ˆ6åeBegin_OnRenameëeSQL_ATTR_NOSCANâÌ6åfsmlAllocDevInfDatastoreListâà6å fPlaySound7å!fCERT_STORE_SAVE_TO_FILENAME_W,7åf??_7IFillLockBytes@@6B@âT7åfIOleCacheControl_OnStop_ProxyèfIOInetThreadSwitchã„7å h@6820œ7å hLANG_SERBIANá´7å hTokenGroupsâÐ7åhIMAGE_ROM_HEADERSì7åhWriteFileGatherâ 8åhMETA_SETMAPPERFLAGSêhCMSG_SIGNER_INFO_CMS_VERSIONáD8å i@6821P8åiId8å iPDWORD32éiGRADIENT_FILL_RECT_Vá”8å j@6822¸8åjERROR_INVALID_CATEGORYãÔ8åjtagMIDIOUTCAPSAâü8åjIDataAdviseHolder_Advise_StubèjIME_ESC_SET_EUDC_DICTIONARYâ89åk_wcssetâH9å k@6823h9åkERROR_DS_DS_REQUIREDá|9å kWM_ENABLE”9å kHELPWININFOâ´9åkVP_FLAGS_TV_STANDARDáÌ9å kPARSE_DOMAINékMDM_AUTO_ML_DEFAULTâü9å l@6824:ålWSAEINPROGRESSã@:ålTRUST_E_SUBJECT_FORM_UNKNOWNád:ålIXMLDocument_put_URL_Stub:å%lIXMLElement_removeAttribute_Proxy¼:ålINET_E_AUTHENTICATION_REQUIREDëlPSD_NOWARNINGø:åmERROR_UNSUPPORTED_TYPEã;åmSetICMProfile0;åmEMRSETARCDIRECTIONë mifaceL;ånNt;å!nERROR_INVALID_KEYBOARD_HANDLE˜;ånRPC_S_INVALID_STRING_UUID¸;ånERROR_DS_CLIENT_LOOPáÐ;ånDM_BITSPERPELèntagEMRANGLEARCãü;åoptr_á<åoANONYMOUS_LOGON_LUIDá<<åoIMAGE_REL_BASED_DIR64\<åoSECURITY_SQOS_PRESENTp<å oFW_BLACKáŒ<åoClientToScreenã¤<å oPSU_DEFAULTêoSQL_DTC_ENLIST_EXPENSIVEáä<åpSmlDevInfNOfM_fâð<åpP=å pNPPATTERN,=åpCRL_REASON_SUPERSEDED_FLAGë!pCERT_STORE_SAVE_TO_FILENAME_Ad=åqltoaáˆ=åqERROR_NOT_ENOUGH_MEMORYâ¬=åqBSM_INSTALLABLEDRIVERSã¸=åqQÌ=åqppdataë qDelayô=å rLPCOMMPROPã>årERROR_TOO_MANY_SEMAPHORES0>å rlStructSizeêrHC_SYSMODALONT>åsSl>å sZeroMemoryãˆ>åsCreateProcessWã >åsHCBT_MOVESIZE¼>åsPCRYPT_DER_BLOBâØ>åsPROXY_CALCSIZEãô>åsIID_AsyncIUnknown ?åsIErrorInfo_GetHelpContext_StubësSQL_RESET_PARAMSáH?åtTX?å tclsid?å+tAsyncIAdviseSink_Begin_RemoteOnRename_Stubã´?åtPD_ENABLESETUPTEMPLATEëtSQL_DESC_CATALOG_NAMEà?åuUø?å uQS_ALLINPUTâ@åudwBytesRecordedêuPUBLICKEYSTRUCã<@åvVè vRPC_MGR_EPVâp@åwGenericExecuteãŒ@åwSetAclInformation¬@åwGRADIENT_FILL_RECT_HáÈ@åwSPI_GETFILTERKEYSä@åwOFN_ENABLESIZINGéwGL_ID_UNKNOWNAåxX0AåxSECURITY_DESCRIPTOR_RELATIVEáPAåxCRYPT_E_ASN1_BADTAGâpAåxGetCharacterPlacementAåxWS_OVERLAPPEDWINDOWâ¬AåxSPLDS_PRINT_COLOR¼AåxPusháÐAå xVAR_CONSTèxSystemTimeToVariantTimeãBåyYBå ynew_valueexceptionð¬å >RIP_INFOá ­å>GetLogColorSpaceW$­å >SW_MAXIMIZEâH­å>CERT_CHAIN_FIND_BY_ISSUERè >UIDeactivateርå?RPC_X_PIPE_DISCIPLINE_ERRORâ´­å%?ERROR_CLUSTER_NETINTERFACE_EXISTSÔ­å?PAGESETUPDLGORDMOTIFáð­å?waveOutGetPitchâ ®å?TIMERR_NOERRORã4®å???_7IXMLDOMDocumentType@@6B@áT®å?MDM_SHIFT_X75_DATAë?SQL_CONVERT_VARBINARYŒ®å@value_context¬®å@IID_IXMLDOMCommentë@LPSERVICE_DESCRIPTIONWãð®åAIMAGE_REL_BASED_REL32¯åAERROR_UNKNOWN_PRODUCT0¯åACAT_E_NODESCRIPTIONâH¯å APS_JOIN_MASKá\¯åALineDDA⌯å)ACMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA°¯åASPLDS_BYTES_PER_MINUTEëAMKSYS_OBJREFMONIKERâð¯åBshort_array_from_ndré)BIInternetProtocol_UnlockRequest_Proxy@°åCINPLACE_E_NOTOOLSPACEèCHDBCá`°åD_W64á°å)D_JOBOBJECT_SECURITY_LIMIT_INFORMATION °åDIdãÀ°åDNTE_PROVIDER_DLL_FAILÔ°å DUuidIsNilä°åDmemidèDget_resolveExternalsá±åEmyTypeã(±å EdelimD±åEWS_EX_TOOLWINDOWé,EIXMLDOMDocument_createDocumentFragment_Stub⌱åFIf㨱åFsmlSetUserDataãбåF_ACCESS_ALLOWED_OBJECT_ACEãè±å FQUERYCONTEXTá ²åFURLACTION_HTML_JAVA_RUNêFSQL_INITIALLY_DEFERREDë Gdatatypeád²åI_STDCALL_SUPPORTED〲åIremove_volatile⬲åIERROR_DS_OBJECT_CLASS_REQUIREDãIJåIRC_STRETCHBLTà²åILOCALE_ITLZEROã ³å!IIOleObject_GetClipboardData_Stubé$IITypeInfo_GetRefTypeOfImplType_StubâX³åJMAXIMUM_ALLOWEDâp³å JGetTopWindowሳå JSBS_SIZEGRIPᤳåJWAVE_FORMAT_2S08ḳå JcChannelsè JAF_CHAOSáè³åKRPC_AUTHZ_HANDLEá´åKDRIVER_INFO_5Wë KDiscardCacheá0´å LLC_MARKERD´å LGCW_ATOMá`´åLIMalloc_Free_Stubˆ´åLIDispatch_RemoteInvoke_ProxyéLremoveAttributeâ´´åMEDOMáÜ´åMSCARD_W_SECURITY_VIOLATIONãµåMCOMADMIN_E_COMP_MOVE_LOCKEDêMget_urlâ4µåNunary_functionãPµåNBACKUP_OBJECT_IDé%NSORTED_CTL_EXT_HASH_BUCKET_OFFSET”µåOLPCHARSETINFO¬µå OPMIXERCAPSãÀµåOsendtoãäµåOSERIAL_LSRMST_LSR_DATAë'OIXMLElementCollection_get_length_Proxyã,¶åQwcsnsetâ`¶å(Q_JOBOBJECT_BASIC_ACCOUNTING_INFORMATIONâx¶å QPCHARSETINFOጶå QRT_STRING ¶åQbExtraãÀ¶åQszOID_OIWSEC_mdc2RSAáä¶åQCreatePropertySheetPageâ·åQJOB_STATUS_PAPEROUTê QvtReturná4·åRCriticalSectionâT·åRDdeImpersonateClientéR??_7ISynchronizeHandle@@6B@â ·åSACCESS_DENIED_ACE_TYPEë!SITypeLib_ReleaseTLibAttr_Stubè·åTIMAGE_REL_IA64_SREL32ü·å TEV_EVENT2¸å TBS_HATCHEDã$¸åTcditéTLeftáH¸å UsmlPutCmd`¸å UEM_SETMODIFYá|¸åUPID_MAX_READONLYéUID_DEFAULTINST㬸å Vis_iec559Ô¸åVSUBLANG_ARABIC_SAUDI_ARABIAêVLPSERVICE_DESCRIPTIONAã ¹å Wshift_iná ¹å WEV_EVENT18¹å WGetColorSetê WSQL_IS_DAYãh¹å XDefHookProcê XnBaseShift㜹åYPEVENTSFORLOGFILEÀ¹åYPERF_COUNTER_BULK_COUNTâè¹åYPCMSG_KEY_TRANS_ENCRYPT_INFOáºåYPSNRET_MESSAGEHANDLED,ºåY__IUnknown_FWD_DEFINED__éYIStream_CopyTo_ProxyálºåZDCX_LOCKWINDOWUPDATEéZSQL_CONVERT_LONGVARBINARY¨ºå [USE_ODBCMAPSἺå [SM_CYEDGEè"[IXMLElement2_get_attributes_Proxyá»å \waveInGetIDâ»å \dwDataOffseté\NdrRpcSmSetClientToOsfã\»å]tagEMRSELECTOBJECTã„»å]MIXERCONTROL_CT_CLASS_LIST㘻å]ncb_rtoê]DRIVER_INFO_5AãÄ»å^sinâÜ»å ^e32_fpagetabáô»å^_COMMTIMEOUTS¼å^REMOTE_NAME_INFO_LEVELë^VariantCopyIndë_GetMetaFileBitsExd¼å`WINAPI〼å`REG_REFRESH_HIVEᔼå `HeapWalkᬼå `EMRANGLEARCâмå`CertFindCertificateInCRLáð¼å`VERIFY_INFORMATIONã½å`Extentsê `apDispatchëaLPOPENFILENAMEWâX½åbPointerToLinenumbersáp½å bNPCWPSTRUCT┽åbLOCALE_IPOSSYMPRECEDESã¼½åbszOID_KP_TIME_STAMP_SIGNINGê bV_ERRORREFãø½åcTAPE_SELECT_PARTITIONSã¾åcCTRY_SAUDI_ARABIA<¾åcMCI_WAVE_SET_BITSPERSAMPLEãt¾å-cCERT_CHAIN_FIND_BY_ISSUER_LOCAL_MACHINE_FLAGᄾåcDST_Sè/cIInternetZoneManager_GetZoneActionPolicy_Proxyãø¾å,dJOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTIONâ ¿å dSpinCount0¿ådTRUST_E_BASIC_CONSTRAINTSL¿ådWAVE_FORMAT_2S16édDISK_GEOMETRYx¿å eGUID_NULLŒ¿åeLOWORD㤿å eHeapUnlockãÈ¿åeERROR_WINDOW_NOT_COMBOBOXà¿åeSS_WHITEFRAMEèeSCardForgetCardTypeâÀåfthread_handle(ÀåfnlenáDÀåf_HRESULT_DEFINEDátÀå$fCOMADMIN_E_CAN_NOT_EXPORT_APP_PROXYâŒÀåfLPKERNINGPAIR Àå fIContinueè fNODE_COMMENTáÌÀå grgbGreenáàÀå gHORZSIZEáôÀå gGetPixelá Áå gNRC_NAMTFULêgcDigá4Áå hsmlFreeMapãLÁå hHINSTANCE__âdÁå hSTARTUPINFOâ„ÁåhMOUSEEVENTF_LEFTDOWNá¬Áå!hCMSG_KEY_AGREE_RECIPIENT_INFOØÁå"hIMarshal_ReleaseMarshalData_ProxyèhMDM_PROTOCOLID_V110â$Âå iERROR_DEPENDENCY_ALREADY_EXISTSâ4ÂåiHiã`ÂåiIXMLElement2_put_tagName_ProxyëiCloseServiceHandleã ÂåjGetSystemPowerStatusá¸ÂåjcAccumRedBitsØÂåjChangeDisplaySettingsáÃåjMIXERCONTROL_CT_CLASS_MASKëjCMSG_ENCODING_TYPE_MASKâ<Ãå k_P_NOWAIT0ã`ÃåkGetNamedPipeHandleStateWékDRIVER_INFO_4WãÃå lLLONG_MINèl__IStorage_FWD_DEFINED__áÌÃå mdwFileTypeëm_CERT_SIGNED_CONTENT_INFOáÄånINãÄånEffectiveOnly4ÄånEMRPOLYPOLYGON16áLÄå nShellAboutWâpÄånCERT_COMPARE_NAME_STR_AâŒÄånLPCPROPSHEETPAGEAènIEnumMoniker_Reset_ProxyáØÄå!oCriticalSectionDefaultTimeoutðÄå ohWindowMenuâÅåoCERT_RDN_TYPE_MASKã4ÅåodwMsgAndCertEncodingTypeéoODBC_CONFIG_DRIVER_MAXëpRpcNsBindingLookupNextã ÅåqERROR_DS_ALIAS_PROBLEMã¼ÅåqGETDEVICEUNITSãÐÅåqdwLoopsâôÅåqCERT_QUERY_FORMAT_BINARYé#qITypeInfo2_GetAllVarCustData_ProxyãDÆårSEF_SACL_AUTO_INHERITlÆårIXTLRuntime_childNumber_StubérdwInactivityTimeoutêsV_I2REFâ°ÆåtSidâÐÆåtIMAGE_REL_IA64_SREL22ðÆåtERROR_NO_SYSTEM_MENUáÇåtNdrUserMarshalFreeë tdwHandleTypeáHÇåuPointerToSymbolTableá\ÇåulHeightâpÇåurclClipâˆÇåuJOY_RETURNPOV°ÇåuSQL_FN_STR_CHARACTER_LENGTHêuwinnt.hâàÇåvint_frac_digitsâÈåvCERT_STORE_PROV_READ_CTL_FUNCè1vCERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAGdÈåwSERVICE_RECOGNIZER_DRIVERxÈå wWSAEINTRéwLPOPENFILENAMEAâ¨Èå xdmDuplexáÀÈåxDMDITHER_FINEØÈå xShellAboutAâüÈåxCERT_COMPARE_NAME_STR_WâÉåxLPCPROPSHEETPAGEWèxSQL_FUNC_EXISTSâXÉåySYSYNC_VERSION_MINOR_TXTáxÉåy_ACCESS_ALLOWED_ACEâ”ÉåySS_ENDELLIPSISã¨Éå ypIBindCtx¼ÉåyVarImpëySQL_ATTR_IMP_PARAM_DESCâôÉå zhStdInput ÊåzDMPAPER_15X110ÊåzDMDISPLAYFLAGS_TEXTMODEâLÊåzCreateColorSpaceézPCANDIDATEFORMãˆÊå{NdrServerInitializeê{SQL_PARAM_BIND_BY_COLUMNáÀÊå |SignatureÜÊå|FS_CASE_SENSITIVEËå|ERROR_BAD_DESCRIPTOR_FORMATâËå|DST_Lè|ISequentialStream_Read_StubâlËå#}IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARYãËå}GetNamedPipeHandleStateAá Ëå }DST_M¼Ëå}DRIVER_INFO_4AãàËå}IPropertyBag_Write_ProxyáøËå }get_nodeNameáÌå}OleCreateLinkFromDataExê}SQL_OJ_NESTED\Ìå~GetSecurityDescriptorGroupãtÌå~RpcEndFinallyè~FADF_DISPATCH Ìå int2typeáÈÌåsmlFreeSourceTargetParentPtráàÌå lWidthOffsetáøÌå mixerMessageáÍå_CERT_REVOCATION_PARAèMO_5_RWâLÍå€PEMRSTROKEANDFILLPATHdÍå €tagVARFLAGSâŒÍå€URLPOLICY_ACTIVEX_CHECK_LISTé€MDM_PROTOCOLID_X75ãÌÍåPEXCEPTION_RECORD64âìÍåVER_SERVICEPACKMAJORáÎåERROR_OUT_OF_STRUCTURESâ,ÎåDMICM_CONTRASTãDÎå midiInStopãdÎåPRINTER_ALL_ACCESSëSQL_GD_ANY_ORDERáÎå‚iterá°Îå‚get_temporary_bufferáÔÎå‚IMAGE_SCN_MEM_NOT_PAGEDâøÎå‚tagEMREXTSELECTCLIPRGNãÏå‚DFCS_SCROLLCOMBOBOXê‚SQLInstallODBCWâXÏåƒERROR_DS_DRA_OUT_OF_MEMâ€ÏåƒCONVERT10_S_NO_PRESENTATIONâ”Ïå ƒScrollDCé ƒITypeLib2_GetLibStatistics_StubâàÏå„IMAGE_SCN_MEM_FARDATAôÏå „hResDataáÐå„ObjectPrivilegeAuditAlarmWãDÐå„LPPRINTER_NOTIFY_OPTIONS_TYPEè0„AsyncIAdviseSink_Begin_RemoteOnDataChange_ProxyâÐå …hFile¸Ðå…MsgWaitForMultipleObjectsExâàÐå…MIXERCONTROLDETAILS_LISTTEXTWè …get_nodeTypeáÑå †ne_autodataâ,Ñå†_OSVERSIONINFOWâ\Ñå#†ERROR_INSTALL_LANGUAGE_UNSUPPORTEDãxÑå†SBM_GETSCROLLINFOÑå †DOC_INFO_1Wê †GetFileTitleáÌÑå‡RPC_S_UNKNOWN_MGR_TYPEãàÑå‡DC_TEXTâøÑå ‡LPFILTERKEYSáÒå‡PRINTER_STATUS_PAPER_OUTé‡PropVariantInitâhÒå#ˆFILE_ATTRIBUTE_NOT_CONTENT_INDEXEDãÒåˆERROR_SET_POWER_STATE_FAILEDá¤Òå ˆCAL_HIJRI¼Òå ˆMMIO_FHOPENâÔÒå ˆSHFILEINFOAâÓå#ˆ__ICancelMethodCalls_FWD_DEFINED__ãÓå ˆCoInitializeáTÓå,ˆIInternetSecurityManager_MapUrlToZone_Proxyê ˆSQL_SP_LIKEâŒÓå‰PEMRSETVIEWPORTEXTEXé‰NDR_LITTLE_ENDIAN¼Óå ŠMF_LINKSáØÓåŠWAVE_FORMAT_4S08éŠPATHNAME_BUFFERâÔå!‹ERROR_INSTALL_PACKAGE_INVALIDHÔå!‹ERROR_DS_REFERRAL_LIMIT_EXCEEDEDádÔå‹FOF_CONFIRMMOUSEáˆÔå‹CertCompareCertificateã¤Ôå‹DRIVER_INFO_3Wë%‹__IPersistStream_INTERFACE_DEFINED__áüÔåŒMIXERCONTROL_CT_CLASS_TIMEãÕåŒCRYPT_IMPORT_KEYá4ÕåŒSafeArrayCopyDataèŒSQL_ROWSET_SIZE_DEFAULTâlÕå MEM_IMAGE„ÕåGetFileSizeEx ÕåEMR_POLYPOLYLINEáÈÕåIViewObject2_GetExtent_ProxyáìÕåLPENCODINGFILTERFACTORYê%IPropertyStorage_WriteMultiple_Proxyá@ÖåŽCERT_FIRST_USER_PROP_IDâTÖå ŽReadCountèŽOLEIVERB_SHOW„ÖåLimitEmsPages¤ÖåICM_REGISTERICMATCHERÄÖåPCERT_REVOCATION_PARAè VarR8FromIntáøÖåLANG_BELARUSIANâ×å_OSVERSIONINFOAâ0×åRemHENHMETAFILEâH×å DOC_INFO_1Aâ`×åDeleteVarDescèREGKIND_DEFAULTâ¤×å‘SUBLANG_GERMAN_LIECHTENSTEINáÌ×å‘TAPE_DRIVE_WRITE_FILEMARKSãð×å‘STORAGE_BUS_RESET_REQUESTè‘??_7AsyncIMultiQI@@6B@ã<Øå’ObjectPrivilegeAuditAlarmAã`Øå’CRYPT_E_NO_REVOCATION_DLL€Øå’DFCS_BUTTONRADIOIMAGEè’lpstrReplaceWithá¬Øå“cosâÌØå“SCARD_E_INVALID_ATRâÜØå “cySrcÙå!“MIXERCONTROLDETAILS_LISTTEXTA Ùå“DisconnectObjecté“SQL_DS_RESTRICTâ\Ùå”IMAGE_REL_IA64_UREL32lÙå”Textá€Ùå ”BS_CENTER˜Ùå ”LPNUMBERFMTâ´Ùå”MCI_MSF_SECONDãÔÙå”FOF_NOCONFIRMMKDIRãðÙå”SafeArrayGetIIDê”IGP_SETCOMPSTRã$Úå •_BASETSD_H_âDÚå•IMAGE_SYM_TYPE_MOEã\Úå•CBS_UPPERCASEtÚå•XTYPF_NOBLOCKè!•IWaitMultiple_WaitMultiple_ProxyáÀÚå–ASYNC_MODE_DEFAULTë–SQLSetDescRecáÛå—OSS_INDEFINITE_NOT_SUPPORTEDá$Ûå—NETSCAPE_SSL_CA_CERT_TYPE@Ûå—MEMCTX_UNKNOWNë#—ISoftDistExt_ProcessSoftDist_Proxyã„Ûå ˜WNDCLASSá Ûå˜ScrollWindowExãÈÛå˜mciGetDeviceIDFromElementIDâìÛå˜FOF_NOCOPYSECURITYATTRIBSÜå˜X509_BASIC_CONSTRAINTS2ê ˜CERT_SYSTEM_STORE_LOCATION_MASKâTÜå™IN_CLASSB_MAXè ™szExtraInfoâ„ÜåšDRV_MCI_FIRSTèšSO_DONTLINGER´Üå›COLOR_BTNFACEÐÜå›CTRL_LOGOFF_EVENTðÜå›SPLDS_PRINT_NUMBER_UPè!›ITypeInfo2_GetTypeFlags_Proxy0Ýå œDragObjectãXÝåœRPC_C_SECURITY_QOS_VERSIONãpÝå œszOID_DSALGâˆÝå œpOtherNameã¬ÝåœIDropTarget_Drop_Proxyë!œODBC_ERROR_INVALID_KEYWORD_VALUEáèÝåitemáÞåPrivilegeCheckãÞåPMONHSZSTRUCT8ÞåPLAINTEXTKEYBLOBá\ÞåPCERT_SIGNED_CONTENT_INFOèDRIVER_INFO_3AãœÞåžWRITE_WATCH_FLAG_RESETã´Þå žSC_MAXIMIZEâÌÞå žEM_CANUNDOãèÞåžCascadeWindowsäßå žSHFILEINFOWê5žIInternetProtocolSinkStackable_CommitSwitch_Proxy\ßåŸPDERR_PRINTERNOTFOUNDxßåŸwaveOutSetPitchâ”ßåŸMCIERR_INTERNALâ°ßåŸCRYPT_MODE_CBCOFMÌßåŸCALLTYPE_NESTEDâàå0ŸIInternetSecurityManager_QueryCustomPolicy_Stubâ$àåŸSQL_TIMESTAMP_LENèŸSQL_LOCK_RECORDâXàå  _splitpathã|àå SUBLANG_ENGLISH_CARIBBEANè RPC_C_STATS_PKTS_INâ°àå ¡__io_EOFáÈàå ¡MAXHALF_PTRâäàå¡VER_MINORVERSIONáüàå ¡NUMBERFMTAã áå¡ctl1á<áå#¡IXMLDOMDocument_createElement_Stubã`áå¡MDM_PROTOCOL_V110_38DOT4K„áå¡SQL_GETDATA_EXTENSIONSë¡SQL_COLUMN_IGNORE¸áå£WAVECAPS_SYNCäáå £PCERT_X942_DH_VALIDATION_PARAMSê£SQL_CODE_DAY_TO_HOURá âå¤WAVE_FORMAT_4S16á<âå¤RPC_IF_ID_VECTORáTâå¤PSM_GETRESULTè¤SQLDescribeColAâ„âå ¥FS_ARABIC¤âå¥RPC_C_PROFILE_ALL_ELTÐâå!¥IRpcChannelBuffer_GetBuffer_Stubáðâå¥SQL_NO_COLUMN_NUMBERé¥SQL_FN_TD_EXTRACT ãå¦msgRefã8ãå ¦GetClipRgnãPãå ¦__unknwn_h__áhãå ¦VariantInitê¦SQL_ALL_CATALOGSá˜ãå§mem_funâ°ãå §SO_SNDLOWATâØãå§NdrComplexStructBufferSizeääå§FILE_DEVICE_TAPE_FILE_SYSTEMá äå§IID_ISequentialStreamè§SQL_SR_CASCADEãPäå ¨cbLengthápäå¨METRICS_USEDEFAULTãˆäå ¨dwProvTypeë¨IID_ITypeCompÌäå%©JOB_OBJECT_LIMIT_SCHEDULING_CLASSôäå©CreateScalableFontResourceë%©ITypeInfo2_GetDocumentation2_StubLåå!ªIMAGE_SCN_CNT_UNINITIALIZED_DATAá`åå ªWINADVAPI|ååªCTLCOLOR_STATICâ˜ååªLPHIGHCONTRASTWâ´ååªLPMIDIOUTCAPSAãÄååªblobéªBLOBáðåå«_MSL_NEEDS_EXTRASæå«VK_LWINâ æå«DRIVER_INFO_2Wã@æå«SQL_ATTR_ODBC_CURSORS\æå«SQL_BATCH_SUPPORTè«SQL_DT_RESTRICTâ”æå¬first_param_typeé ¬CTRY_PRCHINAáÄæå ­VK_OEM_ENLWâÜæå ­PrivateKeyë­SQL_PARAM_TYPE_DEFAULTãçå®NPMIDIOUTCAPSAë ®__IOleCache_INTERFACE_DEFINED__âhçå¯WSA_QOS_EUNKOWNPSOBJáçå¯IOCTL_SERENUM_REMOVE_HARDWAREè¯lpBinaryPathNameáÄçå °smlAllocSyncáÜçå°DMBIN_ONLYONEè °RegOpenKeyExáèå±SPI_GETMOUSEKEYSá8èå±I_RpcStopMonitorAssociationâTèå±STATFLAG_DEFAULTé±SQL_ATTR_ROW_ARRAY_SIZEâ¤èå²COMQC_E_APPLICATION_NOT_QUEUEDãÀèå²OIBDG_DATAONLYë²SQLDescribeColWãéå³ERROR_DS_UNKNOWN_ERRORãéå³GCPCLASS_NEUTRALá,éå ³cxSrc@éå ³VT_CLSIDáhéå³IViewObject2_GetExtent_Stubê³V_I4REFâœéå´IMAGE_REL_IA64_UREL22´éå ´fRtsControlê´ExtractThumbnailáôéåµERROR_MESSAGE_SYNC_ONLYâêåµWSAECONNABORTEDâ(êå µszAbstractãDêåµMDM_COMPRESSIONêµMDM_GEN_V120_PROTOCOL_DATAãŒêå¶SmlDevInfExtList_tã¬êå¶DDD_RAW_TARGET_PATHâÜêå%¶ERROR_CTX_MODEM_RESPONSE_NO_DIALTONEáøêå¶GetStockObjectã(ëå%¶IXMLDOMDocument_createAttribute_Stubé¶SQL_AGGREGATE_FUNCTIONSâhëå·MSGBOXCALLBACKë ·NUMBERFMTWã˜ëå ¸__pos_procã´ëå¸AUDIT_EVENT_TYPEáÈëå ¸FW_LIGHTáäëå¸tagEMRPIXELFORMATøëå¸VK_HOMEâìå¸NPMIDIOUTCAPSWë ¸wIDLFlags@ìå ¹ReparseGuidâ`ìå¹VER_CONDITION_MASKã€ìå¹PSP_USEHEADERTITLEë¹BINDSTRING_LANGUAGEâÀìåºMCI_STATUS_POSITIONâØìå ºtagIDLDESCëºSQL_PARC_BATCHãíå »bV4Height(íå»ILLUMINANT_MAX_INDEXá@íå »SWP_NOSIZEã\íå»FloppyClassGuidâ|íå»WriteFmtUserTypeStgê»SQL_DV_RESTRICTâ¬íå ¼EV_RXCHARÈíå¼TTPOLYGONHEADERâäíå¼LPHIGHCONTRASTAãîå¼LPMIDIOUTCAPSWë¼FOF_NOERRORUI8îå½smlFreeDevInfXmitList\îå½CB_GETDROPPEDCONTROLRECTáxîå½DRIVER_INFO_2Aã”îå½SERVICE_STATE_ALLè½SQL_LIKE_ONLYÌîå¾PFD_TYPE_COLORINDEXâäîå ¾DlgDirListë¾get_nodeTypedValueã$ïå¿smlTransmitChunkFuncá8ïå ¿PATPAINTáLïå¿MO_3_RWê¿IErrorInfo_GetHelpFile_Stubâ”ïåÀLOCALE_SMONTHNAME3ã¬ïå ÀLPOFNOTIFYë À_dwOptionsãØïåÁwcsncatâøïåÁLOCALE_SMONTHNAME2ë ÁMCI_STEPá ðåÂ_IOSFWDâ4ðåÂ_POINTLâTðåÂERROR_NO_MORE_ITEMSâtðåÂWM_NCRBUTTONDBLCLKã”ðåÂLOCALE_SMONTHNAME1ã¨ðå ÂPF_CHAOSáÀðåÂMS_DEF_PROV_AèðåÂUSER_MARSHAL_CB_BUFFER_SIZEê#ÂITypeInfo_LocalReleaseVarDesc_Stubë ÃGGL_PRIVATEâ@ñåÄcmdâ\ñåÄOSS_UNIMPLEMENTED|ñåÄLOCALE_SMONTHNAME7ã”ñå ÄExtractIconâ°ñåÄABN_WINDOWARRANGEèÄDeletePrinterConnectionâìñåÅ?$to_signed@GáòåÅResultãòåÅlocNameâ0òåÅENUMLOGFONTEXAãPòåÅLOCALE_SMONTHNAME6ãxòåÅszOID_RSA_SMIMEalgCMS3DESwrapè ÅCache òåÆ?$to_signed@D´òåÆPST_FAXâØòåÆPAN_LETT_NORMAL_FLATTENEDøòåÆLOCALE_SMONTHNAME5ã óåÆCertEnumSubjectInSortedCTLãHóåÆaGenericBindingRoutinePairsâ`óå ÆDOC_INFO_3Wê!ÆIXMLDOMDocument_get_url_Proxy óåÇ?$to_signed@E´óåÇdocNameâÔóåÇSECURITY_INFORMATIONáèóå ÇPFPO_DATA ôåÇAccessCheckAndAuditAlarmW,ôåÇCLIPBRD_E_CANT_SETãDôå ÇPC_RECTANGLEáXôå ÇSetPixelápôå ÇVK_OEM_RESETáôåÇLOCALE_SMONTHNAME4ã¤ôåÇMO_5_WOâÌôåÇIInternetHostSecurityManageré(ÇIInternetSecurityMgrSite_GetWindow_Stubâõå ÈDate_Formatsá<õåÈSetThreadExecutionStateâXõåÈdwCharacteristicsèÈGetDriverModuleHandleõåÉ?$to_signed@K´õåÉFILE_CASE_PRESERVED_NAMESÜõåÉERROR_DS_CANT_REM_MISSING_ATTèÉSQL_FN_STR_INSERT öå Êstrtoullá,öåÊLOCALE_SMONTHNAME9ãLöåÊCommDlgExtendedErroréÊSQL_DESC_BIND_TYPEã„öåË?$to_signed@Iœöå Ë_DWORDLONG_â´öå ËIsEqualGUIDâÐöåËgmptGlyphOriginâìöåËcaColorfulnessã ÷åËLOCALE_SMONTHNAME8ã(÷åËMM_STREAM_DONEãD÷åËDRIVER_INFO_1WëË__IMarshal_INTERFACE_DEFINED__ã÷åÌDebugDirectorySizeã¨÷å ÌPostMessageâ¼÷åÌwInputãä÷åÌCERT_FIND_NO_CTL_USAGE_FLAGâø÷åÌtagBLOBâ øåÌpointlëÌMODEMSETTINGS8øå ÍlfWeightáLøåÍPathIdë ÍActionCodeë!ÏMCIERR_WAVE_OUTPUTUNSPECIFIED¬øåÐsmlFreeDevInfCTCapãÔøåÐIMAGE_FILE_EXECUTABLE_IMAGEâäøåÐcmpâüøå ÐDOC_INFO_3Aâ ùåÐZAFLAGS_UNC_AS_INTRANETêÐIGP_UIãXùåÑPSID_IDENTIFIER_AUTHORITYlùåÑHWINSTAâùåÑAccessCheckAndAuditAlarmA´ùåÑCO_E_FAILEDTOCREATEFILEâÜùåÑ_CRYPT_VERIFY_MESSAGE_PARAãüùåÑCERT_CHAIN_POLICY_SSL,úå%ÑIInternetThreadSwitch_Continue_ProxyéÑIDataFilter_DoDecode_Stub`úå ÒDVD_Rtúå ÒcMemberséÒSERVICE_STATUS_HANDLE__â´úåÓENUMLOGFONTEXWãÌúåÓmidievent_tagè ÓGetJavaTrustâûåÔrcNormalPositionáûåÔGuidá(ûåÔMS_DEF_PROV_WHûåÔNdrContextHandleSizeéÔSQL_SR_REFERENCES_COLUMNáˆûåÕCS_E_INVALID_PATH ûåÕSelectPalette´ûå ÕcfFormaté ÕInitCacheØûåÖatofáðûå Ö__copy_memãüåÖGetSystemDefaultLangIDë ÖSQLROWCOUNTâHüå×PBITMAPFILEHEADERè×USERCLASSTYPE_APPNAME„üåØOSS_BAD_ENCRULESá üåØLPLOGCOLORSPACEêØCAL_GREGORIAN_ARABICáÐüåÙatoiéÙIOCTL_DISK_FORMAT_TRACKS_EXâýåÚDMPAPER_10X110ýåÚPERF_SAMPLE_COUNTERêÚSQL_ATTR_ROW_OPERATION_PTRãhýåÜatolá€ýåÜtagBINDSTATUS”ýå ÜnMaxPageéÜODBC_ERROR_INVALID_DSNãÈýåÝATOMáÜýåÝdwModeëÝDRIVER_INFO_1Aãþå ÞSM_CXHTHUMBêÞIMallocSpy_PostRealloc_StubâPþåßDMPAPER_10X14dþå ßcSignersé ßPARSE_ANCHORá˜þåàLOCALE_SDAYNAME1á°þå àNRC_REMTFULê àpwszNameáàþåáDEFAULT_QUALITYãÿåáMCI_OVLY_OPEN_PARMSâÿå á_NTDDSTOR_H_á,ÿå áEnumJobsáHÿåáLPCREATETYPELIBê!áIInternetProtocolRoot_Start_StubáŒÿå âGetFontDataâ ÿåâPWR_OKëâLOCALE_SDAYNAME3áÐÿå ãkey_compáèÿå ãCompressionâä"ãRPC_S_NOT_ALL_OBJS_UNEXPORTED,äãLOCALE_SDAYNAME2áDä ãLPHMIXEROBJâXäãAddJobAêãSetFuncAndParamNamesáŒääDCB_RESET¬ääGETSETPAPERMETRICSãÄä äPMDINEXTMENUáàääLOCALE_SDAYNAME5âääTAPE_GET_STATISTICSâä äPMEDIA_TYPEêäIMC_GETCANDIDATEPOSâXäåhas_trivial_copy_ctorèåLOCALE_SDAYNAME4áäæLOCALE_SDAYNAME7á¨äærgpRecipientsÀä æDOC_INFO_2WêæSQL_AT_ADD_COLUMN_DEFAULTáäç_MSL_WCHAR_MINã(äçPF_ALPHA_BYTE_INSTRUCTIONSãHäçEnumResourceNamesWãdäçLOCALE_SDAYNAME6áxä çrgpChainá äçIPersistStorage_IsDirty_ProxyèçDROPEFFECT_NONEêèGETCOLORTABLEìäéadd_referenceäéPROFILE_SERVERãäéRT_DIALOG0äércPaintêéMftWritesLazyWriterêêLPOUTLINETEXTMETRICAáˆäëtagMETARECORD¨äëNPOUTLINETEXTMETRICAáÀä ëKP_MODE_BITSéëSQL_SCC_ISO92_CLIôäìCreateDesktop ä ìWN_BAD_LEVELá(äìDdeUninitializeê ìdwEventStateáPäífdimáläíSEC_I_RENEGOTIATE€ä íDEVMODEWá˜ä ícSignerStoreéíIOleLink_BindIfRunning_StubâØä îHandleToLongáðäîUnlockSegmentä îMK_E_SYNTAXâ$äîQUERYDIBSUPPORTâ@äîLPNEWTEXTMETRICWáXä îhwndSourceë îSubjectUsageá„äïmbsrtowcsœä ï_TAPE_ERASEâ¸äïIsDialogMessageâÐäïsndPlaySoundWøäïCERT_ID_ISSUER_SERIAL_NUMBERáäïLoã ä ïVarR4FromIntá@äïSQL_API_SQLGETDATAã`äïSQL_CUR_USE_DRIVERë ïSQL_CN_ANYã˜äðIMAGE_SCN_LNK_OTHERâÀäðREG_FULL_RESOURCE_DESCRIPTORáÔäðtagBITMAPèä ðARW_LEFTé ðDOC_INFO_2Aâ äñEnumResourceNamesAã<äñRPC_BLOCKING_FNêñSQL_ATTR_FETCH_BOOKMARK_PTRâ|ä òPtrToShortã˜äòdwProcessorTypeâ¸äòRPC_S_NO_MORE_MEMBERSää!òERROR_DS_CANT_MOVE_ACCOUNT_GROUPâäòSTG_E_OLDFORMATâäòVK_SCROLL4äòSPI_SETFASTTASKSWITCHXäòRPC_C_NS_SYNTAX_DEFAULTâläòtimevalâäò_CMSG_SIGNER_ENCODE_INFOá°äòUPDFCACHE_NORMALCACHEè òSQL_AF_ALLãèäóGetUserDefaultLCIDëóCoGetStandardMarshalá ä ôFillRectá@ äôCERT_KEYGEN_REQUEST_INFOéôResumeãl ä õWSAEMSGSIZE†äõAddJobWêõDD_DEFSCROLLDELAY¸ äösmlPcdata2Stringáà äöERROR_DS_SEC_DESC_TOO_SHORTâø ä öSCODE_CODEã ä öeSweepAngleê*öIXMLDOMNamedNodeMap_setNamedItem_Stubp ä$÷CryptVerifyDetachedMessageSignature∠ä÷HintsClusters¤ ä÷LPOINETPROTOCOLê÷ODBC_ERROR_INVALID_BUFF_LENâÜ äøflipáø äøLPNEWTEXTMETRICAá äøPFN_CERT_STORE_PROV_FIND_CERTèøGetMarshalSizeMaxT äùsndPlaySoundAl ä ùdwCallbackã„ äùMCIERR_DRIVERè ù__CGUID_H__â¼ äú_MSL_IMP_EXP_RUNTIMEáà äúERROR_EVENTLOG_CANT_START äúERROR_DS_DUP_SCHEMA_ID_GUIDâ äúLPMDINEXTMENUèúNdrComplexArrayMarshallâ\ ä ûfilelengthã| äûNumberOfAuxSymbolsã ä ûDEVMODEAá° äûRpcMgmtEpEltInqNextâÌ äûLPADDJOB_INFO_1êûGetZoneActionPolicyã äü_doserrno äüFirstEntryRVA0 äüDMPAPER_11X17èüLPOUTLINETEXTMETRICWáp äýNPOUTLINETEXTMETRICWጠäýCurrentBlockSizeéýIXMLAttribute_get_name_ProxyáÐ äþSTG_S_MONITORINGéþPFILESYSTEM_STATISTICSãä ÿ.drectveáä ÿh_lengthá4ä ÿALG_TYPE_ANYáXäÿCERT_FIND_ENHKEY_USAGEãpä ÿpStartPageãäÿPropSheet_SetCurSelê)ÿIXMLDocument2_get_fileModifiedDate_ProxyáØå nextnonceøåEMR_SETWINDOWORGEXãå PWINDOWPOSã,åDATEFMT_ENUMPROCADå MIDI_UNCACHEêUSER_MARSHAL_FC_HYPERxä UserNameáä SetVarNameë%IInternetBindInfo_GetBindString_StubáÐäRBãìäMapGenericMaskë WINOLEAPIècCertsã4äSECTION_EXTEND_SIZEâLä WM_PAINTICONé IRecordInfoâ|ä CLSID_NULLã˜äTKF_HOTKEYSOUNDê CFS_RECTáÄä TOKEN_READãìäERROR_DS_EXISTS_IN_MAY_HAVEêCO_E_INIT_TLS$ä_MSL_IMP_EXP_SIOUXã@ä__msl_ctype_mapâXäWM_MOUSEFIRST€äCERT_ALT_NAME_EDI_PARTY_NAMEá¨äCERT_STORE_CRL_CONTEXT_FLAGêCryptMemReallocâØä is_moduloèSQL_CA_CONSTRAINT_DEFERRABLEáä XptProtocolInfoâ8ä SP_HANDSHAKINGã\ä PAN_LETT_OBLIQUE_CONTACTátä PM_CLOSE_PROCè SQL_ATTR_TRACEFILEã¸ä ERROR_INVALID_LB_MESSAGEáÐä WSANO_DATAãèä pending_sessáä SPLDS_PRINT_MEDIA_SUPPORTEDê IXMLDOMEntityReferenceãTä SE_CREATE_TOKEN_NAMEá|ä PIMAGE_ARCHIVE_MEMBER_HEADERáä fDummy2â¨ä FindWindowExáÀä TOGGLEKEYSãØä CALLBACK_NULLüä MCI_GETDEVCAPS_USES_FILESè FreePropVariantArrayá,ä hypotTä IMAGE_DEBUG_TYPE_OMAP_TO_SRCálä FindResourceW„ä cDepthBitsã ä EMR_DELETEOBJECTá´ä BF_SOFTâÌä cbCustomDataé CommDlg_OpenSave_GetSpecáä ERROR_DS_CANT_MOD_OBJ_CLASSâ<ä PCRYPT_PRIVATE_KEY_INFOê SMEXF_HANDLERxäSPAPI_E_WRONG_INF_STYLEâ”äCTRY_AUSTRALIAã´äCTRY_UNITED_STATESë INADDR_NONEâôäTAPE_SPACE_SEQUENTIAL_SMKSãätagEMRSETCOLORADJUSTMENTá4äRESOURCETYPE_DISKLä NETRESOURCEâhäHDATA_APPOWNEDã€ä MM_JOY2MOVEê pchEndReadã¬äENOTDIRâÈäSPAPI_E_NO_BACKUPÜä STATFLAGélhashval2ä__MSL__ê SERVERCALLã,ä len12LäScaleViewportExtExãhäMM_JOY1BUTTONDOWNè!CERT_TRUST_HAS_NAME_MATCH_ISSUERá¬ä_MSL_STDDEF_HÀäMF_REMOVEèä"IBindCtx_EnumObjectParam_StubäPARSE_ROOTDOCUMENTëlhashval1<äsmlFreeDevInfCTDataâPäptlEndë GetClassURLâ€äPIMAGE_SYMBOL äRvaToFirstByteOfDataáÈäCERT_STORE_PROV_FIND_CRL_FUNCáä,__ITimeAndNoticeControl_INTERFACE_DEFINED__ê_tagPROTOCOLFILTERDATAã8ä_getdriveTäDATEFMT_ENUMPROCWè ReadClassStmá”äSML_ERR_XLT_INVAL_PUB_IDENTâ°äPSIDENT_PSCENTRICèCryptVerifyDetachedMessageHashãðä PAUXCAPSá äX509_ASN_ENCODING$ätagPENDINGMSGè0ICreateTypeInfo2_SetFuncHelpStringContext_ProxyêMDM_BEARERMODE_ISDNâ˜äFindResourceA¬ä VarCyCmpéSQL_API_SQLPROCEDURECOLUMNSâèäbV4Planesä#IXMLDOMCharacterData_get_data_Stubã0ä ReadClassStgé FindTextáhäCOMADMIN_E_NOTDELETEABLEá|ä DeviceKeyèdwRegPolicySettingsâÄäSE_PROF_SINGLE_PROCESS_NAMEâàäDOWNLOADHEADERãøäVFF_CURNEDEST0ä,IOleClientSite_RequestNewObjectLayout_Proxyê SQL_MAXIMUM_COLUMNS_IN_GROUP_BYâxäGetTapeParametersèLPD_SHARE_DEPTHâ¼ä PAN_XHEIGHT_CONSTANT_SMALLë VT_STORAGEãèä !__dest_osáä !MF_SENDMSGSâä!SCARD_RESET_CARDá<ä!??_7IEnumVARIANT@@6B@hä !IXMLDocument2_get_fileSize_Stubâˆä!VarNumFromParseNumë!SQLManageDataSourcesáÈä"SizeOfOptionalHeaderáÜä "wButtonsáôä"MMIO_FINDRIFFè"midl_allocate ä#PCWSTRã8ä#FindNextFileAXä#USER_MARSHAL_CB_TYPEé #FSCTL_OPBATCH_ACK_CLOSE_PENDINGâ¬ä"$??_Edomain_error@std@@UAE@I@ZÈä$LPTTPOLYGONHEADERèä$RPC_SYNTAX_IDENTIFIERè$CADATEãä %PCF_RLSDá,ä%XST_ADVDATASENTâDä%CP_WINUNICODE|ä+%IRpcChannelBuffer2_GetProtocolVersion_Stubã˜ä%VarUintFromDateê%CDN_SHAREVIOLATIONãÐä &WNDCLASSEXWê&SQL_DIAG_DROP_TABLEâ ä'MSSIPOTF_E_NOHEADTABLEë'tagMCI_ANIM_WINDOW_PARMSWX ä(IMAGE_ORDINAL_FLAG32át ä(ERROR_DDE_FAILã ä(szlMillimetersë(ODBC_CONFIG_SYS_DSNâÌ ä)OffsetModuleNameáè ä)SEC_E_TIME_SKEWê)ITypeInfo_GetMops_Stubã !ä *wCharStrá@!ä*wSettableStopParityâ`!ä*MCI_MODE_NOT_READYãŒ!ä!*IAdviseSink_RemoteOnRename_Proxyá¤!ä *CF_ANSIONLYê*SQL_TIMEDATE_FUNCTIONSãð!ä+SML_ERR_A_XPT_NO_TRANSPORTSâ"ä+IMAGE_REL_IA64_IMM22á$"ä+RGN_ORë+NdrPointerBufferSizeá`"ä,CREATE_FOR_IMPORTt"ä,FS_LATIN2Œ"ä ,LZOpenFileWâ¤"ä ,WAVE_MAPPERâÌ"ä,szOID_AUTO_ENROLL_CTL_USAGEâì"ä,SCARD_SYSTEM_READERSá#ä,Finish_QueryMultipleInterfacesë,SQL_DESC_UNNAMEDáH#ä -lfHeightá\#ä -PLOGFONTát#ä -HTSIZELASTãˆ#ä-HashIdë-PID_FIRST_USABLEáÈ#ä.ERROR_ONLY_IF_CONNECTEDâè#ä.EnumPrinterDriversAê.SQL_DIAG_NATIVEâ$ä /FS_LATIN1è/PFN_CMSG_EXPORT_KEY_TRANSd$ä0pointer_to_binary_functionã|$ä0InitializeSidè 0WNDCLASSEXAâ¸$ä1SML_ERR_XLT_XML_UKN_TAGâÜ$ä1tagMCI_ANIM_WINDOW_PARMSAá%ä1CertVerifyTimeValidityë1bP1â8%ä2PROCESSOR_ARCHITECTURE_ARMãX%ä2short_from_ndr_tempâp%ä 2MIDLVersionâ%ä2ELEMENT_STATUS_IMPEXP %ä2bP2ê*2__IXMLHttpRequest_INTERFACE_DEFINED__à%ä3srcâø%ä3DWL_MSGRESULT&ä 3pi_R0_1valã0&ä3MCIERR_BAD_INTEGERãT&ä3CERT_STORE_NO_CRL_FLAGãd&ä3bP3â&ä3IXTLRuntime_formatNumber_Proxyë3IID_IWinInetInfoáÀ&ä4IsSmallâÔ&ä4ULONG32ã'ä!4ERROR_SERVICE_CANNOT_ACCEPT_CTRLé4GetStringTypeExâ@'ä5SML_ERR_A_XPT_SERVER_AUTHX'ä5FindNextFileWl'ä5sampleã”'ä5CERT_QUERY_CONTENT_FLAG_CERTá¨'ä5ReadAtãÀ'ä 5RecordCreateáè'ä5IXMLDOMDocument_get_url_Stubé5SERVICES_FAILED_DATABASEá4(ä6IMAGE_SEPARATE_DEBUG_HEADERê6FILE_DEVICE_BATTERYâh(ä 7BootLoadá|(ä7GCL_HICON(ä 7KeyEventá¤(ä7PSN_FIRSTÄ(ä7PORT_STATUS_TONER_LOWè7IAdviseSink_OnSave_Proxyá)ä8PEMRSETMAPMODEë8EnumPrinterDriversWâL)ä9ERROR_LISTBOX_ID_NOT_FOUNDãl)ä9RPC_S_NOT_RPC_ERRORê9MM_MAXã˜)ä :LZOpenFileAâ°)ä :WAVE_MAPPEDê :IAsyncManager_CompleteCall_Stubâü)ä;EXPIRY_DATE_STRINGã*ä ;MAXULONG_PTRé;LPHIT_LOGGING_INFOãT*ä<ERROR_FILE_OFFLINEë <PCHAR_INFOãˆ*ä=SPLDS_UNC_NAMEë=Marshalâ´*ä ?PM_NOREMOVEâÌ*ä ?MM_WIM_OPENê ?SND_FILENAMEáü*ä @ErrorOffsetâ+ä @GENERIC_ALLâ0+ä@szOID_COMMON_NAMEL+ä@wireCLIPFORMATãh+ä@_DISK_GEOMETRYã€+ä @LayoutScripté@CANDIDATEFORM¸+äA_EXCEPTION_RECORD64âÐ+ä ACOMMTIMEOUTSáø+äAERROR_DIRECT_ACCESS_HANDLEã,äAstc1á8,ä$AIMessageFilter_MessagePending_Proxyâ`,äAFLAG_STGMEDIUM_UserMarshalë ANUMPRS_NEGãˆ,äBstc2éBINET_E_ERROR_FIRSTã¼,äCPCTSTRãÜ,äCIMAGE_SCN_MEM_EXECUTEø,äCEVENTLOG_SUCCESSá-äCpSecurityDescriptorâ(-äCstc3éCLPSCARD_T0_COMMANDã`-ä DWM_NCCREATEâx-ä DBeginPaintã-ä D_CHAR_INFOã -äDstc4á´-ä Dsin_porté%DIXMLDOMParseError_get_errorCode_Stubâ.äESecurityAnonymous .äEERROR_BAD_PATHNAMEã0.äEstc5áT.äEMCI_ANIM_WINDOW_PARMSWã„.ä%EICreateErrorInfo_SetDescription_StubéESQLColumnPrivilegesAá¸.äFLDT_ENTRYÔ.äFPOSVERSIONINFOWâð.äFSetClassLongPtrã/äFstc6éFCRYPT_DECODE_ALLOC_FLAGâD/äGSCARD_E_UNEXPECTEDãT/äGstc7áx/äG??_7ICreateTypeLib@@6B@âŒ/ä Gget_rootéGCFSTR_MIME_AIFFâÄ/äHERROR_WRONG_EFSâÔ/äHstc8áø/äHHTTPSPolicyCallbackDataêHSCardIntroduceReaderGroup40ä I__get_charãD0äIstc9ád0äIMCI_OVLY_WINDOW_PARMS„0äI_DEVICE_MEDIA_INFOã˜0ä ILPVARIANTè"ISQL_STATIC_CURSOR_ATTRIBUTES1Ô0äJPS_NULLâð0äJCONNDLG_HIDE_BOXá1äJWN_NO_NET_OR_BAD_PATH,1äJmciGetYieldProcâD1ä JPP_CONTAINERáx1ä'J__ICreateErrorInfo_INTERFACE_DEFINED__ë"JSQL_STATIC_CURSOR_ATTRIBUTES2´1äKwcscspnâÔ1äKIMAGE_REL_SH3_SECTIONì1ä KLPDOCINFOAëKDeletePrinterKeyA 2äLLZERROR_WRITEP2ä$LAsyncIAdviseSink_Begin_OnClose_Stubê.LIXMLDOMDocument_getElementsByTagName_Stub¤2äMIMAGE_REL_IA64_IMM14áÄ2äMPMCI_OVLY_OPEN_PARMSAà2äMFIND_NAME_HEADERéMSQL_CODE_YEAR_TO_MONTHã3äNtmDescent<3äNURLACTION_CREDENTIALS_USET3ä NVarUI2FromCyéNSQL_CVT_TINYINTâˆ3äOjoyGetDevCapsœ3äOSONY_D2â°3äOAddFormâÈ3ä OLPCUSTDATAëOICreateTypeLib_SetLcid_Proxyá 4äPPOSVERSIONINFOAêPDNS_ERROR_ZONE_CREATION_FAILEDãP4äQWSAECONNRESETl4äQVK_OEM_FJ_TOUROKUŒ4äQPARTITION_INFORMATIONèQPropSheet_RemovePageáÀ4äRstruprãà4äRIMAGE_REL_ALPHA_REFHIô4äRcbBmiMask 5ä R_DEVIOCTL_ëRCoDisconnectObjectãD5ä SHeapDestroyâX5ä SNTM_BOLDáp5ä Spi_R3_1valã”5äSMCI_ANIM_WINDOW_PARMSAã¸5äSMCI_OVLY_WINDOW_DEFAULTâÜ5äSRpcNsMgmtBindingUnexportá6äSCRYPT_FIND_USER_KEYSET_FLAGâ6ä SPSPCB_ADDREFéSSQLColumnPrivilegesWáT6ä T_MSL_UTILITYáh6äTfRlsdHold€6ä TLPBITMAPINFOáœ6äTMCI_WAVE_MAPPERâÀ6äTIPersistStorage_Load_Stubè TIXMLDOMNode_get_nodeValue_Proxyâ7äUIMAGE_REL_IA64_ABSOLUTEêUAdjustTokenGroupsP7äV?$__two_complement@_W$0A@l7äVsmlGetEncodingã€7äVShortName 7äVSTG_E_SHAREREQUIREDê&VCryptAcquireCertificatePrivateKeyð7äWSPI_GETPOWEROFFTIMEOUTã8äWX509_KEY_ATTRIBUTESâ$8ä WTYPEATTRáH8äWImmGetCandidateListCountéWSQL_ATTR_ENLIST_IN_XAè XIEnumMonikeráœ8äYtagMONMSGSTRUCTâ´8ä YPWAVEINCAPSâÜ8äYIDispatch_GetTypeInfo_Proxyâü8äYNUMPRS_TRAILING_WHITEè"YSQL_AD_DROP_DOMAIN_CONSTRAINT@9äZEndPagePrinterã`9äZVARIANT_NOVALUEPROPâx9äZDN_DEFAULTPRNèZSQLExecDirect°9ä[PMCI_OVLY_OPEN_PARMSWè%[AsyncIAdviseSink_Finish_OnClose_Stubâ:ä\CBF_SKIP_DISCONNECTSá$:ä\_CTL_VERIFY_USAGE_STATUSáL:ä"\_NDR_USER_MARSHAL_INFO_LEVEL1€:ä(\IRunningObjectTable_NoteChangeTime_Stubê \VARCMP_NULLâ°:ä ]key_compareâÐ:ä]PROCESS_DUP_HANDLEãè:ä ]LPDOCINFOWã;ä]DFCS_MENUCHECKã,;ä]CERT_STORE_PROV_CONTROL_FUNCé]DeletePrinterKeyW\;ä^shortName„;ä"^CONVERT10_E_STG_NO_STD_STREAM¨;ä^PAN_STROKE_INSTANT_VERTâÀ;ä ^DrawCaptionâì;ä^CRYPT_EXT_OR_ATTR_OID_GROUP_IDã<ä^PDISK_GEOMETRYë!^IOleAdviseHolder_EnumAdvise_StubáH<ä_WM_HOTKEYd<ä__HYPER_DEFINEDã„<ä_PCHANGER_ELEMENT_LISTœ<ä_BSTR_UserSizeÌ<ä&_IXMLDOMDocumentType_get_entities_Stubè!_IPropertySetStorage_Delete_Proxyá=ä`smlFreeDevInfDatastoreã4=ä `FRAME_TRAPã\=ä`ERROR_VOLUME_NOT_SIS_ENABLEDáx=ä`RPCFLG_NON_NDRã=ä `LPSOCKADDRë!`IXMLDOMElement_setAttribute_StubéaCOMADMIN_E_NOTINREGISTRYâ>äbOpenBackupEventLogWê bNextUpdateã4>äcWM_DISPLAYCHANGEá\>äcFROM_LEFT_2ND_BUTTON_PRESSEDá€>äcMCI_ANIM_STATUS_STRETCHêcIOleObject_SetMoniker_Stubã¼>ädverdtdãØ>ädPEMROFFSETCLIPRGNô>ädTracksPerCylinder(?ä)dPRINTER_CHANGE_FAILED_CONNECTION_PRINTERá8?ädReadé+dAsyncIAdviseSink_Begin_RemoteOnClose_Proxyãˆ?ä e__msl_punctâ°?äeBELOW_NORMAL_PRIORITY_CLASSâÌ?äeGMDI_GOINTOPOPUPSèeSQL_IS_INSERT_LITERALSã@ä fSML_PE_MAPë fPO_REN_PORTâ@@ägSORT_GEORGIAN_MODERNá`@ägCERT_E_WRONG_USAGEëgRegOpenCurrentUserã˜@ähAPPCLASS_MASKè%hIBindStatusCallback_GetBindInfo_StubáÜ@äiMSHCTXãAäiIXMLElement2_addChild_StubëiBOLD_FONTTYPE_DisposeThreadData〫ä>FLT_DIGâ «ä>ERROR_PROC_NOT_FOUNDáЫä*>ERROR_DS_FILTER_USES_CONTRUCTED_ATTRSè«ä >EMR_PAINTRGNá¬ä>tagWNDCLASSEXAë>MSHLFLAGS_NOPINGá<¬ä?RtlCompareMemoryáT¬ä ?MAKE_HRESULTáp¬ä?VIFF_FORCEINSTALL”¬ä?MCI_DEVTYPE_DIGITAL_VIDEOè???_7IPersistStorage@@6B@áЬä @lpBaseOfDllâü¬ä@ERROR_SUCCESS_REBOOT_INITIATEDã­ä@RPC_S_ZERO_DIVIDE4­ä@wglGetProcAddressP­ä@_CRYPT_BIT_BLOBâ|­ä!@CMSG_SP3_COMPATIBLE_ENCRYPT_FLAGᜭä@CLSID_CCDOptionButtonÄ­ä@__IXMLDocument2_FWD_DEFINED__è@SQL_SP_MATCH_PARTIALáü­ä APOINTER_32ã ®äAIMAGE_FILE_MACHINE_THUMBá@®äATAPE_SPACE_SETMARKSâ`®äAFILE_MAP_ALL_ACCESSêAIID_IClassFactory”®ä BExtTextOut㨮äBWNDCLASSAÄ®äBSM_CXSIZEFRAMEãÜ®ä BIDH_CANCELãü®äBIMoniker_Enum_Stubã¯äBIsLoggingEnabledAèBVarUI2FromIntD¯äCNT_TIBãX¯äCOpenMutexl¯äCUpperLeft¯äCwaveOutGetPlaybackRate㬯äCIOleCacheControlé CVarUI2FromI4áà¯äD_PRINTER_INFO_4Wá°äDIXMLDocument2_get_URL_ProxyêDMDM_PROTOCOL_HDLCPPP_128K_CHAPãH°äEMOUSEKEYS\°ä EAF_CCITTát°ä ESectorNumberá°äESEARCH_ALTERNATEá°°äESCARD_READER_EJECTSâаäEPRINTPROCESSOR_INFO_1è EVarUI2FromI2é FVarUI2FromI1á±äGOSS_MEM_ERROR4±äGpPrimitiveHandleáh±ä(G__AsyncIAdviseSink2_INTERFACE_DEFINED__∱äGVARFLAG_FDISPLAYBINDá´±äGITypeInfo_ReleaseTypeAttr_StubëGSQL_CA2_CRC_EXACTì±äHInt64ShrlMod32ëHImmGetStatusWindowPos(²äIWSA_QOS_EFLOWDESC<²ä IitemData2è5ICERT_CHAIN_POLICY_IGNORE_CTL_SIGNER_REV_UNKNOWN_FLAGá²äJitemData1¬²äJSM_CYSIZEFRAMEë JhyperزäKLPPCMWAVEFORMATâø²äKSO_SYNCHRONOUS_ALERTá ³ä KSZM_FLAGSèKSQL_PRED_BASICãP³äLCRYPTPROTECT_LOCAL_MACHINEãp³äLIMalloc_Realloc_Proxy¨³ä,LIRpcChannelBuffer2_GetProtocolVersion_ProxyêLSQLGetStmtOptionáä³äMSERVICE_ERROR_SEVEREá´äMCERT_COMPARE_SHIFTë MSTGFMT_FILEêNLB_GETTOPINDEXã\´äOSUBLANG_NORWEGIAN_NYNORSKt´äONPCHARSETINFOˆ´äOEMREOF㨴äOSendMessageTimeoutAâÀ´ä OTIME_SMPTEãè´äOIBindHost_CreateMoniker_ProxyèOOLEIVERB_OPENµä Pdigits10á0µäPCB_GETTOPINDEXãHµäPMMIO_FINDLISTèPMCI_FORMAT_BYTESáxµäQVT_BOOLêQSQL_SC_SQL92_FULL°µäRSML_PE_GENERICãÀµäR_TEBáܵäRI_RpcRequestMutexøµäR_PRINTER_INFO_4Aá¶ä RtagLIBFLAGSêRSQL_LOGIN_TIMEOUTH¶äS_OBJECT_TYPE_LIST`¶äSDataDirectory„¶äSERROR_TOO_MANY_MODULESã ¶äSCONNDLG_PERSIST⸶ä SABE_BOTTOMëS_CERT_SIMPLE_CHAINä·äTERROR_DS_WRONG_OM_OBJ_CLASSâ·ä TWNDCLASSWèTIsLoggingEnabledWH·ä Ue32_objtabã`·ä UShellExecuteéUIBinding_GetBindResult_Proxyá ·ä VGCLP_HICONSMá´·äVMOD_WINâÌ·äV_MCIDEVICEID_Ü·äVbyrefèVFR_RAWã¸äWJOB_OBJECT_ALL_ACCESSè WSetEventáH¸äXERROR_DS_BAD_NAME_SYNTAXád¸äXSQL_API_SQLSETPOSèXSQL_CT_CONSTRAINT_DEFERRABLEᨸäYSmlSourceList_têYSendMessageTimeoutWâì¸äZDIGSIG_E_EXTENSIBILITYëZVarUI1FromIntè[SQL_FN_TD_TIMESTAMPDIFFâT¹ä!\_JOBOBJECT_BASIC_PROCESS_ID_LISTál¹ä \SC_MINIMIZE⌹ä\midiStreamPositionë"\ILockBytes_RemoteWriteAt_Stubعä]RPC_S_MAX_CALLS_TOO_SMALLì¹ä]FW_BOLDãºä]BLACK_PENºä ]EnumMetaFileá4ºä]ShowOwnedPopupsâdºä#]MIXER_GETCONTROLDETAILSF_QUERYMASKë!]IXMLDOMNode_get_definition_Proxyᨺä ^_SIZEOF_LONGé ^dwContextIdâàºä_IMAGE_IMPORT_BY_NAMEáüºä_CryptGenRandomã»ä_BindToStorageè_SQL_ISV_CHARACTER_SETSãH»ä `asinhl»ä`round_toward_neg_infinity˜»ä `CERT_STORE_PROV_WRITE_CERT_FUNCâÄ»ä`ICreateTypeInfo2_SetName_Proxyãä»ä`ImmSetStatusWindowPosè `SQL_TRANSACTION_REPEATABLE_READâ(¼ä bDataSelectoráL¼äbCO_E_SETSERLHNDLFAILEDãh¼äbWINSTAENUMPROCA‼ä bLPCWPSTRUCTâ ¼äbRpcNsMgmtInqExpAgeë%bIInternetZoneManager_LogAction_Proxyáè¼äc__sort_switchø¼äcSysâ ½äcMoveFileW8½äcERROR_FLOPPY_ID_MARK_NOT_FOUNDãX½äcNTE_BAD_KEYSET_PARAMáp½ä cMMIO_RWMODE┽äcCRYPT_FORMAT_SEMICOLONë ccbstgmedDataá¼½ä dasinlà½ädERROR_NO_NET_OR_BAD_PATHáü½äd_PRINTER_INFO_5WédQueryContinueDrag,¾äeUserIDãL¾äeGetWindowsDirectoryAáx¾äeSetSecurityDescriptorRMControl㜾äePAN_STRAIGHT_ARMS_WEDGEâ´¾ä eWN_BAD_VALUEé eJOYCAPSWáؾä fisinfð¾äfENHMETAHEADER ¿äfLBS_EXTENDEDSELâ ¿äfS_un_wã<¿äffHasNewCorrDescê fPAGESETUPDLGáh¿ägwcsrchrâ„¿äg_TOKEN_STATISTICS¤¿äglpProcessAttributesêgFMFD_URLASFILENAMEãà¿ähTHREAD_TERMINATEâÀähCDERR_REGISTERMSGFAILÀähALG_CLASS_HASHëhSCS_CAP_COMPSTRâLÀäiPolygonâlÀäiMMIOERR_PATHNOTFOUNDéiPRINTER_ENUM_ICONMASK¬Àäj_MSL_MATH_CONFIG_HãÐÀäjSUBLANG_SPANISH_BOLIVIAâèÀäjDEBUG_PROCESSÁäjSHGNLI_NOUNIQUEâ ÁäjAsyncIPipeLongã@ÁäjIStream_Revert_StubêjSQLSetConnectOptionAé#kERROR_DS_SENSITIVE_GROUP_VIOLATIONã¨Áä lcall_traitsâÐÁälFindFirstChangeNotificationAáèÁä lGetMetaFileAélCLSID_CCDFontPropertyPage ÂämRpcExcept<ÂämtagSAFEARRAYBOUNDèmSafeArrayDestroyDescriptorãtÂä nasinfŒÂä nFS_CYRILLICâ ÂänHideCaret´ÂänIDC_ARROWÌÂä nnBlockAlignâðÂänPCERT_REVOCATION_STATUSâ ÃänElementAddressã8Ãä nPRINTER_NOTIFY_FIELD_UNTIL_TIMEâ`ÃänLPSERVICE_FAILURE_ACTIONSWë nSQL_MAXIMUM_COLUMNS_IN_ORDER_BYâ¤Ãä oPEMRELLIPSEê oMIXERCONTROL_CT_SC_METER_POLLEDâìÃäpREPLACE_PRIMARYâÄäpIMallocSpy_PostDidAlloc_Proxyè)pIRunningObjectTable_NoteChangeTime_ProxyápÄäqSECURITY_RESTRICTED_CODE_RIDáˆÄäqGetWriteWatch Ää qPMIXERLINEëqCoRevokeClassObjectâäÄärIMAGE_FILE_MACHINE_ALPHAâÅär_PRINTER_INFO_5AáÅärVarUI4FromIntè rSQL_TC_DMLãHÅä sPARITY_SPACEáhÅäsGetWindowsDirectoryWá”Åä sERROR_DS_NO_CHECKPOINT_WITH_PDCâ¬Åä sSIZEPALETTEâÀÅäsVK_DOWNâÔÅä sJOYCAPSAáèÅäsS_un_bãÆäsCTL_FIND_MD5_HASH0Æä"sIRpcChannelBuffer_GetBuffer_ProxyèsCHANGEKIND_ADDMEMBERádÆä tllroundlá„ÆätSERVICE_KERNEL_DRIVER ÆätWINSTAENUMPROCWâÀÆätSCardGetProviderIdëtSQL_MAX_TABLES_IN_SELECTáøÆäuMoveFileA ÇäuERROR_EA_LIST_INCONSISTENTãHÇäuCO_E_WRONG_SERVER_IDENTITYã`ÇäuSYQUEST_EZ135èuNonCachedWriteBytesâ Çäv_MSL_FLOAT_WIN32_Hã¼ÇävWM_MDIGETACTIVEâØÇävCALINFO_ENUMPROCé vsin_familyãÈä wWM_NEXTMENUâ0ÈäwGetMenuCheckMarkDimensionsãHÈä wMNC_EXECUTEâhÈäwCRYPT_MODE_CBCOFMIëwSQL_DIAG_MESSAGE_TEXT´ÈäxIRunnableObject_IsRunning_StubëxLPSERVICE_FAILURE_ACTIONSAãøÈäyWSA_QOS_RECEIVERS ÉäyODBC_ERROR_CREATE_DSN_FAILEDéySQLInstallerErrorWãhÉäzFindFirstChangeNotificationWá€Éä zGetMetaFileWá´Éä(z__ISynchronizeEvent_INTERFACE_DEFINED__âäÉä%zIOleInPlaceFrame_EnableModeless_StubézIMN_SETSENTENCEMODEâÊä{gmtime_tm4Êä{RPC_X_PIPE_EMPTYáLÊä{RDW_UPDATENOW`Êä{NumDigits€Êä{MIDIERR_DONT_CONTINUE˜Êä {NRC_MAXAPPSâ´Êä{LOCK_UNLOCK_DOORé0{IInternetZoneManager_CreateZoneEnumerator_ProxyãËä |IsPODËä |SmlExecPtr_tá0Ëä |PTEXTMETRICâDËä|ABM_NEWê|SQLSetConnectOptionWátËä}SymâˆËä}cbInQueâ¨Ëä}PSINJECT_DOCNEEDEDRESÄËä}RegCreateKeyExë }SQL_CVT_BITâðËä ~llroundfáÌä~ThisPeriodTotalUserTimeâ@Ìä ~JOBOBJECT_BASIC_PROCESS_ID_LISTâ`Ìä~META_SETTEXTCHAREXTRAˆÌä~__IOleWindow_FWD_DEFINED__ë~IME_CMODE_LANGUAGEãÐÌäsml_unknown_proto_element_sâìÌätransmitChunkFuncÍäPSECURITY_QUALITY_OF_SERVICEá(ÍäHTASK__âDÍäSetCommTimeoutsâdÍäCHANGEKIND_SETNAMESêIID_ITypeFactoryáÍä€stopá¬Íä€LANG_SLOVENIANãØÍä€ERROR_DS_NCNAME_MISSING_CR_REFãðÍä€PROP_SM_CYDLGÎä €STDMSHLFLAGSé€SQL_HANDLE_STMTâLÎä"IO_REPARSE_TAG_RESERVED_RANGE`ÎäszTitleâ„ÎäMIXERLINE_TARGETTYPE_AUXá ÎäChangerTransporté_MONITOR_INFO_2AáÔÎä ‚child2_ptrë‚_DCBáüÎäƒSetDlgItemIntÏäƒ__RPCNDR_H_VERSION__éƒSERVICE_RUNS_IN_SYSTEM_PROCESSã\Ïä„memmoveâpÏä„e32_cpuâŒÏä„GetWorldTransform¤Ïä„dwFileSubtypeØÏä.„CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAGôÏä„_PRINTER_INFO_2Wé„IOLETypes_v0_0_c_ifspecâ(Ðä †atanfXÐä#†SUBLANG_SPANISH_DOMINICAN_REPUBLICãlÐä†DDEPOKEê†IID_IErrorInfoã°Ðä‡szOID_INFOSEC_SuiteAKMandSigáØÐä‡CERT_STORE_CTL_CONTEXT_FLAGê‡PCERT_CHAIN_ELEMENTâÑä ˆatanh0ÑäˆSML_ERR_ALREADY_INITIALIZEDâDÑäˆwConvstâ`ÑäˆdwStoreProvFlagsáxÑäˆTapeClassGuidÑä ˆulSectorSizeáÀÑä#ˆIOleLink_GetSourceDisplayName_StubëˆlptcompâðÑä‰__TestForErrorãÒä ‰CreateFileWâ$Òä‰SKF_STICKYKEYSONé ‰SetConsoleCPáTÒä Šremove_nodesápÒäŠMCI_SYSINFO_PARMSèŠMCI_ANIM_STATUS_HPALá°Òä‹?$__num_bits@$0DPPP@áÐÒä‹SHFILEINFO_DEFINEDë ‹pInterfaceãøÒä Œatanl Óä ŒOF_PARSEá4ÓäŒERROR_PROTOCOL_UNREACHABLEã\ÓäŒERROR_CONTROL_ID_NOT_FOUNDãtÓä ŒCLIP_TO_PATHáÓäŒHELP_FORCEFILEëŒwireHENHMETAFILEáÄÓä I_UuidCreateáôÓä%CERT_ACCESS_STATE_WRITE_PERSIST_FLAGéOFN_LONGNAMES ÔäŽ_fastcall8Ôä ŽDMPAPER_B5ë ŽInflateRectâtÔäSetEnvironmentVariableë DMPAPER_B4ã¬ÔäSmlPcdataListPtr_tãÀÔäfBinaryâÜÔätagSTYLESTRUCTäÕäCertVerifyCRLTimeValidityè'IXMLHttpRequest_setRequestHeader_ProxyãHÕä ‘pvRecordé‘SQLGUIDâpÕä’_P_NOWAITŒÕä’EMR_POLYBEZIERãœÕä’_rã´Õä’CTRY_ZIMBABWEÐÕä’RpcBindingCopyãìÕä’_tagBLOB_DEFINEDáüÕä’CD_Ré’_PRINTER_INFO_2Aá4Öä“WAIT_GRANDCHILDâHÖä “capacityáXÖä“_sãlÖä “cElementsè“SQL_API_SQLCOLATTRIBUTEâ°Öä”IMAGE_REL_CEF_ADDR64áÄÖä”HIBYTEãØÖä”_FILETIMEøÖä”ReadEncryptedFileRawá×ä”iWindowsEffectMSecã(×ä”Uuidá<×ä”KP_INFOâd×ä”CRYPT_HASH_ALG_OID_GROUP_IDât×ä”oInstè”IRecordInfo_GetName_Stubá¼×ä•EVENT_E_NOT_ALL_REMOVEDâÐ×ä •DATA_BLOBè%•IXMLDOMNamedNodeMap_get_length_Proxyá Øä–DOMAIN_USER_RID_ADMIN8Øä –WM_DDE_POKEâXØä–MAX_VOLUME_ID_SIZEãpØä–SCARD_PCI_RAWœØä!–IViewObject_RemoteGetAdvise_StubáÀØä–CreateILockBytesOnHGlobalè –SQL_CL_STARTáôØä—SCHANNEL_ENC_KEYé—_MONITOR_INFO_2Wá$Ùä˜UintToPtrPÙä˜WININETINFO_OPTION_LOCK_HANDLEë˜LockServiceDatabaseâ˜Ùä™PROCESSOR_ARCHITECTURE_MSILâÄÙä™ERROR_DS_NAME_ERROR_NO_MAPPINGãØÙä ™dwDevNumáìÙä ™HashMaské™SetHelpFileNameâ Úä šrotate_leftâ<ÚäšSmlMetInfMemPtr_tdÚä"šNdrConformantStringBufferSizeˆÚäšIID_IForegroundTransferêšcstdlibâ¸Úä›SM_CXFIXEDFRAMEâÔÚä›vDriverVersionãìÚä ›MMIO_DELETEâÛä!›IOleAdviseHolder_SendOnSave_Stubé›DROPEFFECT_COPYâPÛäœdmDisplayFlagsãhÛä œfIncUpdateãxÛäœPullá˜ÛäœSQLRemoveTranslatorê œSQL_C_CHARëERROR_TOO_MANY_MUXWAITERSøÛäž_CERT_REVOCATION_STATUSâ Üä"ž_GENERIC_BINDING_ROUTINE_PAIR<ÜäžPROXY_SENDRECEIVE`ÜäžIID_IRunningObjectTableâ”Üä*ž__IForegroundTransfer_INTERFACE_DEFINED__èž__IViewObject_FWD_DEFINED__âÔÜä ŸCreateFileAâìÜä ŸeMiterLimitêŸSTGTY_STORAGE8Ýä. ??_C?0??what@bad_cast@std@@UBEPBDXZ@4QBDBTÝä tagWAVEINCAPSWãtÝä RPC_C_EP_MATCH_BY_IFáŒÝä WinExecErrorW¨Ýä CryptFindOIDInfoáÀÝä PROP_SM_CXDLGØÝä VarDateFromI4è SQLRemoveTranslatorWáÞä¢ERROR_BAD_EXE_FORMATá4Þä¢PEMRSELECTPALETTELÞä ¢MNC_SELECTãlÞä¢szOID_SEARCH_GUIDEë.¢AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARAÐÞä#£JOB_OBJECT_MSG_ACTIVE_PROCESS_ZEROãüÞä £COMADMIN_E_APPLID_MATCHES_CLSIDê£PERF_100NSEC_MULTI_TIMERá<ßä¤dwMajorVersionã\ßä¤_SYSTEM_POWER_STATUSátßä ¤BS_GROUPBOXâ”ßä¤RpcServerUseProtseqAá°ßä¤SHELLEXECUTEINFOáÜßä&¤CMSG_RECIPIENT_ENCRYPTED_KEY_INFO àä*¤CMSG_MAIL_LIST_ENCRYPT_FREE_PARA_FLAGàä¤Sendé.¤IInternetSession_RegisterMimeFilter_Proxydàä¥smlGetCmdxàä ¥Revisionáàä ¥VkKeyScanExâ¨àä¥_INC_SHELLAPIÐàä¥CERT_VERIFY_UPDATED_CTL_FLAGáôàä¥JOB_NOTIFY_FIELD_STATUSê¥VarDateFromI1áä¦xlená@áä¦SetEnvironmentVariableAâXáä ¦bV4GammaRedâpáä ¦NUMRESERVEDâˆáä ¦PPOLYTEXTWã¨áä¦GetWindowTextLengthAáÀáä ¦CALG_DH_SFãØáä¦VarDateFromI2è¦StartServiceCtrlDispatcherAââä§DT_LEFTâ4âä§PCRYPT_DECODE_PARAã`âä&§SCARD_ATTR_SUPRESS_T1_IFS_REQUEST„âä§PropSheet_GetTabControlâ˜âä§DCOM_NONE°âä §_wireBRECORDé§IME_ESC_QUERY_SUPPORTôâä¨TRUST_E_PROVIDER_UNKNOWNáãä¨ELEMENT_STATUS_INENABè¨??_7IForegroundTransfer@@6B@áPãä©UHALF_PTRlãä©SizeOfHeapCommitáãä©LPCRITICAL_SECTION_DEBUGá¸ãä©ERROR_EVENTLOG_FILE_CORRUPTâÐãä ©NRC_SNUMOUTâôãä©PERF_DISPLAY_NO_SUFFIXã ää©ALG_CLASS_ALLè©SQL_CONVERT_FLOAT<ääªcount_onePääªFARPROCâhää ªMENU_EVENTã„ääªPeekConsoleInputáœää ª_GDI_OBJECTê"ªIEnumSTATPROPSETSTG_Skip_Stubäää«IMAGE_SYM_TYPE_NULLâåä«EMR_REALIZEPALETTEë«tagEMRARC(åä ¬execl@åä ¬dwMemoryLoadé ¬SM_CYCAPTIONá|åä­ERROR_DS_DRA_PREEMPTEDãœåä­RPC_DISPATCH_FUNCTIONÄåä­CertCreateSelfSignCertificateè­LPPRINTPROCESSOR_INFO_1ê®BINDVERB_CUSTOMâ(æä¯SizeOfUninitializedDataê¯_NOTIFYICONDATAWáhæä°DOMAIN_ALIAS_RID_ADMINSâŒæä°SetEnvironmentVariableWâ¬æä°ERROR_MOD_NOT_FOUNDâÄæä °PPOLYTEXTAãØæä°VK_ZOOMâøæä°GetWindowTextLengthWá çä°BINDF_NOPROGRESSIVERENDERINGé°StartServiceCtrlDispatcherWâ`çä±TCP_BSDURGENTè±CHANGER_VOLUME_UNDEFINEâœçä ²MEM_COMMITãÈçä²ERROR_DS_CANT_REMOVE_ATT_CACHEãèçä²WSA_QOS_EPROVSPECBUFáèä²DEFAULT_CHARSETâ$èä²DM_DISPLAYFREQUENCYâDèä²RpcServerUseProtseqWá`èä²IXMLDOMElementë"²SQL_CA2_SENSITIVITY_ADDITIONS¤èä³_MSL_MATH_CDECLâ¼èä ³XPT_SECTIONâØèä³LPNEWTEXTMETRICâôèä³DMPAPER_A4SMALLâéä³_CERT_STORE_PROV_FIND_INFOã4éä³_LCID_DEFINEDXéä³IEnumMoniker_Reset_Stubê³VAR_DATEVALUEONLYˆéä ´_strspnpá°éä´ERROR_WINDOW_OF_OTHER_THREADáÄéä ´ABE_LEFTáðéä´IDataObject_RemoteSetData_Stubë´URLACTION_JAVA_PERMISSIONSã<êäµPBT_APMQUERYSTANDBYFAILEDPêäµCALG_SEALpêäµCRYPT_VERIFYCONTEXTâˆêäµSQL_C_UBIGINTèµSQL_SQL92_REVOKEá´êä ¶execvÜêä¶??_Gbad_typeid@std@@UAE@I@Zâøêä¶MOUSEEVENTF_WHEELëä¶tagSTICKYKEYS,ëä¶tagWAVEINCAPSAãDëä ¶NRC_DUPNAMEâ\ëä¶WinExecErrorAè¶PFN_CMSG_STREAM_OUTPUTë·CERT_VERIFY_REV_CHAIN_FLAGãÈëä¸SetUserObjectSecurityàëä ¸CTRY_UKRAINEáðëä ¸pHashìä¸??_7IPipeByte@@6B@ã$ìä ¸aVarianté&¸ITypeInfo_RemoteGetTypeAttr_Proxyxìä"¹CONVERT10_E_STG_DIB_TO_BITMAP”ìä¹_NOTIFYICONDATAAá°ìä¹IID_IOleWindowë¹PSTYLEBUFàìäºEMR_PIXELFORMATâüìäºdwMaxUnscaledXã íäºRPC_C_AUTHN_LEVEL_CONNECT8íä ºBLOBHEADERãHíäºLo32éºIDLFLAG_FRETVALâˆíä»ERROR_NO_SUCH_PRIVILEGEâ¤íä»dwMaxUnscaledYë»MCIERR_WAVE_SETINPUTINUSEè¼dispidãîä ½PSECURITY_CONTEXT_TRACKING_MODEâ$îä½WSAENETUNREACHë½DFCS_SCROLLSIZEGRIPRIGHTátîä¾MIXERCONTROL_CT_UNITS_DECIBELSã îä¾szOID_PKIX_KP_EMAIL_PROTECTIONã¼îä¾SetVarHelpContextè¾ITypeLib_RemoteIsName_StubäïäÀ_MSL_THREADSAFEâïäÀWSA_E_NO_MORE4ïäÀFmtStringOffsetêÀSQL_MAX_DRIVER_CONNECTIONSã|ïäÁSmlDevInfXmitPtr_tãœïäÁERROR_ADAP_HDW_ERRã´ïä ÁCTRY_EGYPTãÌïä ÁWaitMultipleáäïä ÁwParamFlagsêÁSQL_CONVERT_INTEGERêÂPAGE_READWRITEã@ðäÃMCI_OVLY_SAVE_PARMSWáXðä Ãt1_timeoutsâpðä Ã_PRIVKEYVER3áœðä ÃFSCTL_FILESYSTEM_GET_STATISTICSêÃSQL_CURSOR_FORWARD_ONLYâÔðäÄDELETEãøðäÄERROR_BAD_THREADID_ADDRâñäÄMSSIPOTF_E_FILETOOSMALLâ0ñä ÄPolyDrawáHñä ÄGCLP_WNDPROCáxñä$ÄIInternetZoneManager_LogAction_StubêÄIEnumSTATPROPSTG_Skip_Stubã´ñäÅCOMSTATâÐñäÅSKF_HOTKEYSOUNDâèñä ÅDRV_RESERVEDáòä(ÅSCHEME_OID_RETRIEVE_ENCODED_OBJECT_FUNCâ<òäÅPSM_ISDIALOGMESSAGEêÅSQLGetTypeInfoWâpòä Æguard_backã”òäÆFEATURESETTING_PROTOCOLâ°òäÆDLGC_RADIOBUTTONáÌòäÆCAL_SERASTRINGëÆDRVCNF_OKøòä ÇLPMMCKINFOãóä Çncb_lengthã,óäÇszOID_RSA_dataãTóäÇCryptFreeOIDFunctionAddressêÇURL_OID_GET_OBJECT_URL_FUNCâ óäÈDdeCreateStringHandleWëÈIRpcStubBuffer_Connect_Proxyáàóä ÉMinorVersionâôäÉSetColorAdjustmentãôäÉSWP_SHOWWINDOWã4ôäÉMAP_FOLDCZONELôäÉEncryptedHashpôäÉ_GET_CHANGER_PARAMETERSê)É__ISynchronizeHandle_INTERFACE_DEFINED__á¸ôäÊ_DEFINE_HÜôäÊERROR_CONNECTION_INVALIDáðôäÊAsciiCharõä&ÊMIXERLINE_COMPONENTTYPE_SRC_FIRSTTõä-ÊCRYPT_ENCODE_NO_SIGNATURE_BYTE_REVERSAL_FLAGéÊulCntCharˆõäËTIMER_MODIFY_STATEã¤õäËNPPCMWAVEFORMATâÀõäËAUXCAPS_CDAUDIOêËICreateTypeInfo_SetMops_ProxyèÌCommDlg_OpenSave_GetSpecA,öäÍDC_DATATYPE_PRODUCEDáPöäÍLCMAP_TRADITIONAL_CHINESEdöä ÍPF_CCITTéÍImmGetCandidateWindow¬öäÎERROR_DEPENDENCY_NOT_FOUNDãÄöä ÎKLF_REORDERâèöäÎPERF_COUNTER_TIMER_INVä÷ä ÎlpVendorInfoá÷ä ÎKP_PREHASHã4÷äÎParseDisplayNameáP÷äÎIsAsyncMonikerë ÎSQL_SUCCESSâ|÷äÏERROR_CRCœ÷äÏwaveOutPrepareHeaderá´÷ä ÏdwDeviceIDëÏMCI_OVLY_WINDOW_STATEèÐSETWALLPAPER_DEFAULTéÑSetZoneCustomPolicyâ$øä Òatan2HøäÒ_SYSTEM_AUDIT_OBJECT_ACEá\øäÒs_impnoêÒSQLTablePrivilegesã¤øäÓEVENT_E_INVALID_PER_USER_SIDáÀøäÓPNONCLIENTMETRICSØøä ÓpUsageParaëÓSQLGetTypeInfoAâùäÔPAN_ARMSTYLE_INDEXã$ùäÔeventè ÔCERT_SYSTEM_STORE_LOCAL_MACHINEâpùäÕBasicLimitInformation˜ùä"ÕJOB_OBJECT_LIMIT_PROCESS_TIME°ùä ÕlpfilenameãÐùäÕMCI_OVLY_SAVE_PARMSAâúä&ÕCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARAèÕSQL_SP_ISNULL,úä ÖinternaláLúäÖFileTimeToSystemTimeé ÖSTM_MSGMAXãŒúä×RPC_S_NOT_ALL_OBJS_EXPORTEDâ¤úä ×NPMMCKINFOã¼úä ×LittleEndianáèúä ×IProgressNotify_OnProgress_Stubâûä"×__IUrlMon_INTERFACE_DEFINED__4ûä×PSD_ENABLEPAGESETUPHOOKê×LPENUM_SERVICE_STATUSlûä ØAveragePPMãŒûäØURLACTION_JAVA_MAXë ØPIDMSI_OWNERá¸ûäÙTIME_MIDIÔûäÙRPC_C_VERS_EXACTéÙReadFmtUserTypeStgãüäÚPGENERIC_MAPPINGá<üäÚICreateTypeInfo_SetSchema_Stubãlüä#ÚIPersistMoniker_SaveCompleted_StubãŒüäÚ??_7ISoftDistExt@@6B@èÚCommDlg_OpenSave_GetSpecWÈüäÛbinary_searchè Û_WINDEF_éÜLPSAFEARRAY_UserUnmarshalýä ÝSetCursorè ÝHDDEDATA__ãHýäÞDRAGDROP_S_FIRSTáhýäÞEMR_INTERSECTCLIPRECTŒýäÞDdeCreateStringHandleAã¤ýä ÞidldescTypeêÞODBC_REMOVE_DRIVERë.ß__IRunningObjectTable_INTERFACE_DEFINED__þäàPIMAGE_RESOURCE_DIRECTORYHþäàDNS_ERROR_RCODE_SERVER_FAILUREã\þä àelfMatchéàFO_COPYâˆþä áStorageClassá þäáFatalAppExitA¸þä áVIEW_E_DRAWâØþäáGetColorAdjustmentãìþäáJOYCAPSâÿäá_MONITOR_INFO_1Aé!áIXMLDocument2_get_fileSize_ProxyáLÿä âMoveFromSlotéâGL_LEVEL_ERRORãˆÿäãKP_EFFECTIVE_KEYLENâ¤ÿäãpTrustListInfoëãLPSAFEARRAY_UserMarshalâèÿääSetCurrentDirectoryâä"äRPC_S_UNSUPPORTED_NAME_SYNTAX4ääNdrVaryingArrayUnmarshallPää_PRINTER_INFO_1WéäDeleteãäåACCESS_ALLOWED_OBJECT_ACE_TYPEã°äåUIRestrictionsClassâÈä åGMEM_SHAREëåImmSetCandidateWindowüäæWCHAR_MIN äæSelféæAsyncIMultiQI@äçSmlDevInfUTC_fãXä çPOINTER_64ãpä çChangeMenuëçtagCLIENTCREATESTRUCT°äèabnormal_terminationáÐäèERROR_NOT_SAME_DEVICEèä èDMPAPER_A3ãüäèRT_FONTâäèODBC_REMOVE_SYS_DSNê èSQL_CODE_DAYáXäéSTATUS_ABANDONED_WAIT_0âpä éDMPAPER_A2ã”äéRpcServerUseProtseqEpExAééNDRSContextMarshallExää#êIS_TEXT_UNICODE_REVERSE_STATISTICSëêMENUITEMTEMPLATEHEADERã(äësmlFreeDevInfDevInfâHäëERROR_DS_GC_REQUIREDádäë_CRYPT_URL_ARRAYáˆäëSQL_CONVERT_LONGVARCHARêëSQLForeignKeysWâ¸äìwcsncpyâàäìCRYPT_LAST_ALG_OID_GROUP_IDêìPRINTER_STATUS_NOT_AVAILABLEáäíLZStartâ4ä íMIXERCAPSWãDäíatimeèíIDataObject_DUnadvise_Proxyâ„äî_STATIC_FILES äîEXT_DEVICE_CAPSâ¸ä îDMPAPER_A5ãÐä îWM_SETCURSORáèäîWSANO_ADDRESSäîPIDSI_DOC_SECURITYëîdwRequiredSizeë ïDMPAPER_A4ã\äðSCARD_E_CANT_DISPOSEáläðHDWPá”äðMIXERCONTROL_CONTROLTYPE_MUXá¼äðPSTORAGE_BUS_RESET_REQUESTëðCLSID_DOMDocumentðäñconst_pointeräñ__iterator2pointerã8ä"ñERROR_SUCCESS_REBOOT_REQUIREDXäñWSAESOCKTNOSUPPORTãxäñLOCALE_SINTLSYMBOLã˜äñMCI_ANIM_INFO_TEXTã¸äñIOCTL_DISK_LOAD_MEDIAÜäñTransmissionRetryTimeouté ñdwActualSizeá ä òERROR_DS_DRA_SOURCE_REINSTALLEDâ4äòKP_KEYVAL`ä!òNdrNonConformantStringUnmarshallá|äò_ROTFLAGS_DEFINED˜äò_PRINTER_INFO_1AéòIID_IOleInPlaceActiveObjectâÔäó__io_procìä óSecondEmptyâäóDRAGDROP_S_USEDEFAULTCURSORSá(äóWM_UNDOâ<ä óFO_DELETEè*óCERT_CREATE_CONTEXT_NO_HCRYPTMSG_FLAG”äôSECURITY_WORLD_SID_AUTHORITYá°äôMapViewOfFileExâÀä ôEventØä ôncb_lana_numáðä ô_WINSPOOL_ëôLPFINDREPLACE$ äöSPLDS_PRIORITYëöIEnumFORMATETC_Clone_Stub` ä÷FatalAppExitWx ä ÷PCMSG_ATTRë÷_MONITOR_INFO_1Wá° äøSHFileOperationêøSQL_SCOPE_SESSIONà ä ùDrawTextáø äùVTBIT_DECIMALèùIME_PROP_SPECIAL_UIâ, äú_MSL_C9X_H äúwNullCharDetectedè$úStgOpenAsyncDocfileOnIFillLockBytesâ  äûRTL_CRITICAL_SECTION_DEBUG㸠ä ûMIXERCAPSAãÔ äûSEE_MASK_HMONITORèûCRYPT_MODE_OFBã ä!üERROR_REPARSE_ATTRIBUTE_CONFLICTá@ äüERROR_CTX_SHADOW_DENIEDâX ä üSW_MINIMIZEât äüCF_PRIVATELAST㌠äüALG_CLASS_ANY  ä üHMAC_INFOèüAsyncIPipeByte_Begin_Push_Stubãä ä ýwrite_procãø äýspliceã äýTokenSessionIdã, ä ýIDI_ASTERISKáL äýSetContainedObjectãh äýSQL_PARAM_IGNOREéýSQLForeignKeysA⨠äþRPC_S_INVALID_RPC_PROTSEQÀ ä þve_valuenameáØ ä þgrfKeyStateêþIID_IPersistMonikerâ äÿRpcServerUseProtseqEpExWéÿOnObjectAvailableH å@7101éGetImplTypeCustDataâx ä @7100˜ äSPI_SETKEYBOARDDELAYéCONSOLE_SCREEN_BUFFER_INFOãÐ ä @7103à ä HTASKð äccë UI_CAP_2700â<ä.?$basic_istream@_WU?$char_traits@_W@std@@Lä @7102ˆä/_JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATIONã´äIMAGE_REL_ALPHA_INLINE_REFLONGãÄäcbãàäCallNamedPipeAë??_7IOleClientSite@@6B@âä @7105,äEMRPOLYLINETO@äHTLEFTãXä hItemHandleâ|äCreateConsoleScreenBuffer°ä(MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZERâÜäGET_CERT_UNICODE_RDN_ERR_INDEXääURLMON_OPTION_USERAGENTêPROPSETFLAG_NONSIMPLETä.?$basic_ostream@_WU?$char_traits@_W@std@@dä @7104ˆä__scaled_random_numberã´äIMAGE_SEPARATE_DEBUG_SIGNATUREãÈäuuid_tãääASYNC_STGMEDIUMâäNODE_DOCUMENT_TYPEëURLACTION_COOKIES0ä @7107XäPROCESSOR_ARCHITECTURE_ALPHAátäSCS_OS216_BINARYéIXMLDOMNode_put_nodeValue_StubãÈäSYSYNC_MAIN_VERSION_STRINGãØä @7106ôätagICONMETRICSAâäMCI_DEVTYPE_FIRST_USERë$IOleInPlaceObject_UIDeactivate_StubâXä @7109ˆä$PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRYâ¤äWM_STYLECHANGEDâÄäMCI_ANIM_PLAY_SPEEDêRpcNsEntryExpandNameWôä @7108ä GetProcessAffinityMaskë IXTLRuntimeâDä vswprintfTä @6913pä PIMAGE_VXD_HEADERˆä IsCharAlphaâ¨ä SPI_SETHIGHCONTRASTâÀä VIF_WRITEPROTÔä fsActioné fractionáä _ACCESS_DENIED_ACEãä ISPTR0ä NRC_NOCALLãDä TYSPECë LPPRINTER_INFO_7A”ä. ?$basic_fstream@_WU?$char_traits@_W@std@@¨ä WSADATAê SQL_CA1_LOCK_EXCLUSIVEë SUBLANG_SPANISH_URUGUAYâä__RPC_WIN32__è#__IRootStorage_INTERFACE_DEFINED__ãLänTrackPoshäLPREGISTERWORDAêIMN_CLOSECANDIDATEã ä _strnicollã°älen1áÀäa1ãàäIDLE_PRIORITY_CLASSâüäPSM_INDEXTOHWNDâ,ä$__IWaitMultiple_INTERFACE_DEFINED__âPäAllowForegroundTransferêITypeMarshal_Unmarshal_Stubâ”äMEMORYSTATUSEXã´äGetSystemDirectoryãØäNTE_PROV_TYPE_NO_MATCHãôätagICONMETRICSWêIXTLRuntime_depth_Stubã(äa3ã8äcsãpä,__IXMLDOMImplementation_INTERFACE_DEFINED__êcElemsã”älen2á¤äa2ã¼äsml_results_sØäFILE_SHARE_WRITEáìäcchBuffer äCLIP_DEFAULT_PRECISâ(äPBT_APMBATTERYLOWè__IMalloc_FWD_DEFINED__âhäsmlGetFreeBufferáäIMAGE_REL_BASED_MIPS_JMPADDRá¨ä DLGC_STATICê EncryptedKeyáÔäS_SERDVNAðäCallNamedPipeWãä bV4BitCountâäyExté XST_DATARCVDá@äcwãXä NULLREGIONãxäRegisterWindowMessageŒä MK_SHIFTá°äDestroyAcceleratorTableâÔäSPI_GETNONCLIENTMETRICSâðäCMSG_CTRL_DEL_CRLèCompressionRatioReads4äERROR_DS_RANGE_CONSTRAINTè val_buff_ptrá\äcyã€äSPI_ICONVERTICALSPACINGâ”äPD_5_RWê%__MIDL_itf_urlmon_0188_v0_0_c_ifspecáàäxptSelectProtocolðäcxãäInvalidateRgnèLPREGISTERWORDWâ8äV_CYREFâTäIMN_SETOPENSTATUSèSQL_LOCK_TYPESãˆä MM_ISOTROPICá°ä"MIXERCONTROL_CONTROLTYPE_MONOÄä dwActionáôä$ICreateTypeLib_SaveAllChanges_Proxyê LPMETHODDATAá$ä SmlChalPtr_téICreateTypeLib_SetName_Stubâˆä/PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATIONãœäCC_NONEâ¬ärclâÀä pfxStartéLPPRINTER_INFO_7Wôä not_this_oneáäMETA_SETPOLYFILLMODEá(ädwValueâHäRpcNsEntryExpandNameAèFinish_AddRefˆäERROR_TOKEN_ALREADY_IN_USEã¨äCERT_STORE_ADD_NEWë ActualCountâÐä @7111ðä RTS_CONTROL_HANDSHAKE ä DISP_E_DIVBYZEROá$ä LPMIDIINCAPSé GetClientSitePä !isxdigitá`ä !@7110€ä!TOKEN_QUERY_SOURCEã”ä!MF_HELPâ¬ä !IID_IMonikeré!MDM_PROTOCOL_V110_28DOT8Kàä "@7113øä"GetBrushOrgExä "htask$ä"URLDownloadToFileè"MDM_PROTOCOL_V120_56KXä #LONG_MAXáhä #@7112˜ä%#IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTORáÌä*#IXMLDOMDocument_get_validateOnParse_Proxyè#SQL_API_SQLENDTRANãüä $@7115 ä $second_falseá0 ä$XST_EXECACKRCVDâH ä$DdeAccessDatat ä $MIXERCONTROL_CONTROLTYPE_TREBLE☠ä$RPC_NCA_FLAGS_IDEMPOTENTá¼ ä$PKCS_SMIME_CAPABILITIESê$MDM_PROTOCOLID_ANALOGì ä %@7114!ä%ERROR_DS_NO_SUCH_OBJECTâ(!ä %ve_valuelenê%MDM_SHIFT_PROTOCOLINFOã\!ä&@7117è"&szOID_INFOSEC_mosaicIntegrity”!ä'@7116è'LPOSVERSIONINFOEXWãÄ!ä (@7119ä!ä(LPSYSTEM_POWER_STATUSè (LPDISPATCHã "ä )@6900"ä )@7118<"ä)SPI_GETKEYBOARDDELAYé )IXMLDOMNamedNodeMap_reset_Proxyâ€"ä*WaitCommEventœ"ä*_DISPLAY_DEVICEWá´"ä *MIXERLINEAãÐ"ä*MCI_VD_SPIN_UPãè"ä*byte_from_ndrü"ä *ppunkValé!*INET_E_CANNOT_INSTANTIATE_OBJECTáD#ä+tagWAVEOUTCAPSAâp#ä"+CRYPT_X942_KEY_LENGTH_BYTE_LENGTHè+SZ_URLCONTEXT¨#ä,SYSER_VARIANT_CODEãÈ#ä,UNIVERSAL_NAME_INFOâì#ä,RpcBindingSetAuthInfoExAé,FR_MATCHALEFHAMZA$$ä-SCARD_S_SUCCESSâ8$ä-iActiveâH$ä -JobIdd$ä-PROVIDOR_INFO_1Wé-AddressOfMemberâ˜$ä.__SML_WBXML__´$ä.ETO_GLYPH_INDEXâÈ$ä.bReservedè$ä.tagMEASUREITEMSTRUCTâ%ä .szOID_MEMBERá%ä.aRecordâ@%ä .CommDlg_OpenSave_GetFolderPathWê.SQL_UNICODE_LONGVARCHARât%ä /mblenŒ%ä/PAGE_NOACCESS´%ä/ERROR_DS_UNKNOWN_OPERATIONë/SCARD_W_UNSUPPORTED_CARDáü%ä0FILE_NOTIFY_INFORMATIONâ&ä 0IsZoomedá(&ä 0BN_SETFOCUSâ@&ä 0NPMIDIINCAPSá`&ä0RPC_NCA_FLAGS_MAYBEê0SHGFI_LINKOVERLAYœ&ä1LPOSVERSIONINFOEXAã¼&ä1STARTF_USEPOSITIONãÜ&ä1GetLastActivePopupãô&ä 1DDE_FACKREQâ'ä1VT_UI1ã0'ä1IStorage_OpenStorage_Proxyã`'ä%1IAsyncRpcChannelBuffer_Receive_Proxyé1VarDecIntŒ'ä 2wSuiteMaskã 'ä 2_WINNLS_é2VT_UI2ãØ'ä3ERROR_CANNOT_IMPERSONATEé3ExtEscape (ä4SUBLANG_ARABIC_OMANâ (ä4VT_UI4ãP(ä#4__IEnumUnknown_INTERFACE_DEFINED__ë4COINITãt(ä5xExtá(ä5SetStretchBltMode¸(ä5URLACTION_NETWORK_CURR_MAXë5SQL_API_SQLSTATISTICSì(ä6dmScaleâ)ä6DM_PANNINGWIDTHâ$)ä6CONNECTDLGSTRUCTé6WAVECAPS_LRVOLUMET)ä7DC_DUPLEX)ä27CRYPT_UNICODE_NAME_ENCODE_ENABLE_T61_UNICODE_FLAGè7USER_MARSHAL_FC_FLOATÀ)ä8byãà)ä8SORT_KOREAN_UNICODEâ*ä8MESSAGE_RESOURCE_UNICODEá(*ä8CreateIconFromResourceExáL*ä8PCRYPT_SEQUENCE_OF_ANYãp*ä8sz_CERT_STORE_PROV_SYSTEM„*ä8VT_UI8ã¼*ä.8IInternetZoneManager_SetZoneActionPolicy_Stubè 8CommDlg_OpenSave_GetFolderPathAâø*ä9bxã +ä9ERROR_CANT_DELETE_LAST_ITEMâ8+ä9CloseMetaFile`+ä9IRpcChannelBuffer3_Send_Stubé9IHttpNegotiateã +ä:RpcBindingSetAuthInfoExWáÄ+ä:CryptEnumProviderTypesë:IViewObject_Draw_Stubá,ä;VerifyVersionInfo,ä ;FIOASYNCá0,ä;PROVIDOR_INFO_1Aé;SQL_CVT_DECIMALâl,ä<SUBLANG_SYS_DEFAULTâˆ,ä<_DISPLAY_DEVICEAá¤,ä<LOCALE_IDIGITSãÄ,ä<CFERR_CHOOSEFONTCODESÜ,ä <MIXERLINEWãø,ä<MKSYS_FILEMONIKER-ä<wCodeè <OFN_EXPLORERá8-ä=PURGE_TXABORTT-ä=tagWAVEOUTCAPSWê=IID_IMarshal2|-ä>c_ã -ä>PAN_LETT_NORMAL_ROUNDEDâ¼-ä>WS_TILEDWINDOWãÔ-ä>MS_SCARD_PROV.ä)>IXMLHttpRequest_get_responseStream_Proxyé">BSCF_AVAILABLEDATASIZEUNKNOWND.ä?HSTR__ãX.ä ?JOB_READé?VarUintFromIntã„.ä @@7121 .ä@WM_LBUTTONDBLCLKá´.ä@PC_5_WOâÈ.ä @BOOKMARKé@SQL_CVT_WVARCHARáô.ä A@7120/äA_IMAGE_NT_HEADERS64â,/äAGMEM_MOVEABLET/äACOMADMIN_E_ALREADYINSTALLEDâ€/ä ADISPLAY_DEVICE_MIRRORING_DRIVERâ”/ä ANPAUXCAPSè/AIInternetSecurityManager_GetZoneMappings_Proxyãà/ä B@71230äBGetOpenClipboardWindowã 0äBMenuItemFromPoint80ä BPMIDIINCAPSAáX0äBUSER_MARSHAL_FC_BYTEáx0äB_wireSAFEARRAY_UNIONáˆ0äBCACêBSQLULENâ¬0äC@7122èCbV4CSTypeÐ0ä D@7125ð0äDSCARD_W_CHV_BLOCKEDâ 1äDMKF_HOTKEYSOUNDâ$1ä DLOCALE_SLISTáL1äDPERF_PRECISION_OBJECT_TIMERêDCMSG_ENCRYPTED_ENCODE_INFOãˆ1äEwcssetã˜1ä E@7124¼1äEIMAGE_REL_MIPS_JMPADDR16áÐ1äEMM_TEXTã2ä#E_CMSG_RECIPIENT_ENCRYPTED_KEY_INFOã,2ä"ECERT_VERIFY_ALLOW_MORE_USAGE_FLAGèENODE_PROCESSING_INSTRUCTIONâd2ä F@7127x2ä FDataTypeáŒ2ä FFS_JOHABá 2äFhmenuNextÀ2äFMCI_ANIM_PLAY_REVERSEèFIID_IEnumSTATPROPSETSTGâô2ä G@71263äGDM_DUPLEX 3äGPEMRSETPIXELV<3äGHSHELL_LANGUAGEâX3äGCreateMDIWindowWá€3äGIStorage_SetStateBits_Stubã 3äGURLPOLICY_DISALLOWë GOFNOTIFYEXAâÌ3äH__int8ãÜ3ä H@71294äHsmlFreeDevInfDatastoreListã4ä HCreateHitsã44ä HtagSYSKINDãP4äHulavrPacketSizeêHCAIâp4ä I@71284äISML_PE_SEQUENCE_ENDâ°4äIIMAGE_SYM_ABSOLUTEãÔ4äIERROR_WAIT_NO_CHILDRENãì4ä ILPWINDOWPOSâ5ä ISCardStateã5äIPROPSHEETPAGEL5ä#ISPLREG_RESTART_JOB_ON_POOL_ENABLEDëICAHâx5äJRemoveDirectoryâ”5äJLGRPID_SUPPORTEDá¬5ä JVFT2_UNKNOWNáÄ5äJRegSetValueExÜ5äJLPMIDIINCAPSWè JEndMonitorã6äKPEMRRESIZEPALETTE,6äKLPPRINTER_INFO_5AX6ä!K__IPSFactoryBuffer_FWD_DEFINED__éKSetObjectRectsãŒ6ä LFreeResourceá°6äLRPC_S_INTERFACE_NOT_FOUNDÐ6äLNTE_FIXEDPARAMETERãè6ä LUP_WORD_BLOBéLSQL_INTERVAL_MONTHã 7äMPEMRINVERTRGN87ä Mi64NumItemsâh7ä%MCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARAá„7äMPROVIDOR_INFO_2Wá”7äMCALêMCF_FORCEFONTEXISTÌ7äNFACILITY_WIN32ãì7äNPMCI_WAVE_OPEN_PARMSá8ä!NGET_CERT_UNICODE_VALUE_ERR_INDEXéNpMsgé OKF_DLGMODEãP8äPc1ãh8äPGetBoundsRect|8äPWC_DIALOG”8äPFreeDDElParam¨8ä PXST_NULLáÔ8äPI_RpcBindingInqDynamicEndpointë PpvFindParaãü8äQapã9ä QCBR_2400á,9äQCreateMDIWindowAá<9ä QVT_R8l9ä$QIInternetThreadSwitch_Continue_Stubâ„9ä QOFNOTIFYEXWêQMDM_V110_SPEED_19DOT2Kã¼9äRPO_RENAMEÌ9äRc3ãä9ä R_userHBITMAPéRSQL_SR_SELECT_TABLEâ:äSc2ã8:äSDBG_EXCEPTION_NOT_HANDLEDX:äSLOCALE_STIMEFORMATãp:ä SNRC_SABORTãˆ:äSrgCertEncoded¤:äSSERIAL_LSRMST_MSTèSIOleInPlaceFrameáè:äTFILE_ATTRIBUTE_SPARSE_FILEä;äTCloseEventLog;ä TiType(;äTpalNumEntries@;ä TPMIDIINCAPSWáP;äTc5ëTPUREát;ä U__n64_osá„;äUatãœ;ä Une_cmoventãÌ;ä*UMIXERLINE_COMPONENTTYPE_DST_UNDEFINEDÜ;äUc4ëUFILE_DEVICE_PARALLEL_PORT0<ä#VERROR_DS_NOTIFY_FILTER_TOO_COMPLEXãP<äVRpcNsGroupMbrInqDoneéVc7ãx<ä WS_PERIOD512êWc6ã <äXdmOrientationÐ<ä%X__MIDL_itf_urlmon_0189_v0_0_c_ifspecéXSQL_COLUMN_LABELá=äYCertOpenStore=äYc8ã<=äYIXMLHttpRequest_abort_Proxyâ`=äYCFSTR_MIME_X_REALAUDIOë YOleConvertIStorageToOLESTREAMExâ¤=ä ZUpperIndexëZSCARD_ATTR_CHARACTERISTICSãè=ä[AlternateVolumeID>ä[PROVIDOR_INFO_2Aé [SQL_NC_ENDã4>ä\LPMIDIINCAPSAè\CryptHashData\>ä]NULLál>ä ]VT_R4€>ä]ByNameë]LPPRINTER_INFO_5W°>ä^hInstanceÈ>ä ^hStdOutputãè>ä^DMPAPER_ENV_PERSONALá?ä^SetMetaFileBitsEx?ä ^pCrlInfoá8?ä^SCardListReaderGroupsè0^IInternetHostSecurityManager_GetSecurityId_Stubâˆ?ä_ostreamâœ?ä_MHDR_DONE°?ä _X509_BITSè_OleCreateLinkFromDataä?ä`IsArrayâô?ä `@6929@ä `@7131@ä`GetKBCodePage8@ä`PADDJOB_INFO_1WâT@ä`SQL_INTERVAL_HOURè`SQL_CCOL_CREATE_COLLATION@äa_EM_UNDERFLOW @ä a@6928°@ä a@7130Ð@äaLPMIXERCONTROLDETAILSì@äaALG_SID_SKIPJACKé astgmedDataãAä b@71330AäbdwSettableBaudãLAäbSCardListReaderséb__IStorage_INTERFACE_DEFINED__ãˆAä c@7132´Aä cJOB_OBJECT_SECURITY_VALID_FLAGSêcSERVICE_DESCRIPTIONâäAä d@7135üAä dCTRY_BAHRAINáBädWNetGetUniversalNameá4Bä dXST_POKESENTáXBädPPRINTER_NOTIFY_OPTIONSê dIXMLDOMDocument_nodeFromID_Stubâ”Bä e@7134¨BäepBufferêeHISTOGRAM_BUCKET_SIZEØBä f@7137ôBäfftCreationTimeãCäfRPC_S_NO_PROTSEQS_REGISTEREDéftagMCI_ANIM_STEP_PARMSãPCä gsqrtf`Cä g@7136xCä gTOKEN_WRITEâ CägRpcServerRegisterAuthInfoWãÐCä%gPCERT_REGISTRY_STORE_CLIENT_GPT_PARAégXMLHTTPRequestäDäh_wcsrevâDä h@71390DähPAN_FAMILY_DECORATIVEDDähPT_LINETO\Dä hLPD_STEREOãtDä hBSF_NOHANGëhIOCTL_SMARTCARD_CONFISCATEã¬Dä i@7138ÀDäiXoffLimê"iCERT_NAME_STR_NO_QUOTING_FLAGüDäjsetlocaleEäjTAPE_DRIVE_FILEMARKSá4Eä jRPC_E_RETRYâ\EäjPEMREXTCREATEFONTINDIRECTWãxEäjCTRY_PUERTO_RICOáœEäjDeletePrinterDriverExAëjIStream_Stat_StubÌEä kLPCRECTLáìEäkotmsStrikeoutPositionFä kCP_INSTALLEDá0Fä kMIXERCONTROL_CONTROLTYPE_SLIDERâXFäkCERT_KEY_CERT_SIGN_KEY_USAGEátFäkLPPRINTER_INFO_4AèkDeletePrinter¬FälERROR_RESOURCE_ONLINEÔFälERROR_DEPENDENCY_NOT_ALLOWEDáìFälGetICMProfileGälcStoreProvFuncã,GälFUNCFLAG_FDEFAULTCOLLELEMèlSQL_CATALOG_NAME_SEPARATORãdGä msqrtl|GämERROR_TIMEOUTèmPAN_MIDLINE_LOW_SERIFEDâ°Gän@6927ènPMSGáÐGä o@6926ôGäoIMAGE_REL_ALPHA_SECRELHIáHäoSCARD_E_NO_DIRã$Hä oMSG_PEEKéoSQL_FETCH_LASTãPHäpb1ã€Hä#pERROR_LM_CROSS_ENCRYPTION_REQUIREDãHä pAlpha¨HäpEMRSETMETARGNÀHä pVK_ICO_HELPâÐHäpcmb9áèHä pSCARD_ABSENTéplpstrFileIäqMS_CTS_ON0IäqEMR_CREATECOLORSPACEá@Iäqcmb8áXIä qMCI_SET_ONã€IäqRpcServerRegisterAuthInfoAë qCACLIPDATAã¨Iärb3ãÔIär__IMultiQI_INTERFACE_DEFINED__ërSTREAM_SEEK_ENDãJäsb2ãJäsSML_PCDATA_STRINGè*sIXMLDOMCharacterData_replaceData_StubdJä tPDWORDLONGãtJätb5ãˆJätNPLOGFONT Jä tBS_INDEXEDã¼JätWM_CHANGECBCHAINáÌJätdwUseètWM_PSD_MINMARGINRECTáüJäub4ë uImmIsIMEá Kävb7ã@KävLBS_WANTKEYBOARDINPUT\KävSPI_SETFILTERKEYS|KävMCI_OVLY_WHERE_VIDEOá”KävPP_KEYSTORAGE¤Kä vpvArgÌKävCERT_STORE_ADD_USE_EXISTINGâèKävPADDJOB_INFO_1AâLävJOB_NOTIFY_FIELD_MACHINE_NAMEèvSQL_MAX_COLUMNS_IN_SELECTDLäwb6ë'wJOBOBJECT_BASIC_ACCOUNTING_INFORMATIONãˆLäxcmb1á¤LäxSPLDS_DRIVER_KEYáÈLäxIME_KHOTKEY_SHAPE_TOGGLEéxSQL_SG_SELECT_TABLEâøLäyb8ãMä yGetCommMaskâ(MäyCTRY_PORTUGALèyIID_IBindHostTMä z_ttynameádMäzcmb3ézTraceVSControlãœMä{MaximumBlockSizeá¸Mä{ERROR_IO_DEVICEâÐMä {dwSecurityë{cmb2áôMä|PRECTLãNä|WS_ICONIC Nä |SMALL_RECTã0Nä|cmb5áLNä|DVASPECT_DOCPRINTpNä|DeletePrinterDriverExWãˆNä |dwMaxDCERateé|IME_CHOTKEY_SHAPE_TOGGLEáÔNä}IMAGE_SYM_CLASS_EXTERNAL_DEFáäNä}cmb4áOä}MCIERR_NEW_REQUIRES_ALIAS$Oä}LPPRINTER_INFO_4Wè }SQLValidDSNâLOä~a_ã\Oä ~owns_„Oä~IS_TEXT_UNICODE_ODD_LENGTHã¤Oä~COLOR_BTNHIGHLIGHTã´Oä~cmb7áÔOä~RpcNsGroupMbrInqBeginìOä ~QueueDepthë*~IFillLockBytes_RemoteFillAppend_Proxy0Päopen_modeDPäDay_NamesXPäwcspbrkâpPä HS_VERTICALâ€Päcmb6á˜Pä ALG_SID_MACâ¸Pä_NDR_ASYNC_MESSAGEãàPä__IDataObject_FWD_DEFINED__âQäICreateTypeLib_SetName_Proxyá$QäCLSID_FtpProtocolèSQL_ATTR_CURSOR_SCROLLABLEã\Qä €@7141€Qä€ERROR_OVERRIDE_NOCHANGESáœQä€HANGUL_CHARSETãÄQä€IMallocSpy_PreRealloc_StubãäQä€??_7IEnumMoniker@@6B@è'€IInternetProtocolInfo_CompareUrl_Proxyã(Rä @7140PRäsmlFreeDevInfCTDataPropListâtRäGetKeyboardLayoutNameAãRäNEWTRANSPARENTã´RärgpszCertPolicyElementIdé SQLNUMERICãÜRä‚putsáìRä ‚@7143 Sä‚FLOATING_SAVE_AREAã,Sä‚NMPWAIT_WAIT_FOREVERáHSä‚EC_QUERYWAITINGâlSä‚LPMCI_OVLY_WINDOW_PARMSAá˜Sä ‚IEnumSTATPROPSETSTG_Reset_Proxyê‚CC_ENABLETEMPLATEHANDLEâÌSä ƒ@7142ìSäƒSecurityImpersonationTäƒWSAENAMETOOLONGâ$TäƒLOCALE_ENUMPROCê ƒSQL_NO_DATAâLTä „@7145pTä„smlFreeDevInfCTDataListâ”Tä„ERROR_SHUTDOWN_CLUSTERã¬Tä „SBS_SIZEBOXê „BINDVERB_PUTáÔTä …@7144üTä…IMAGE_FILE_MACHINE_UNKNOWNë…STREAM_CONTAINS_SECURITYáMSSIPOTF_E_OUTOFMEMRANGEá¸ä >VK_F74¸ä>SC_NEXTWINDOWL¸ä >CTRY_QATARãd¸ä >LPTYPELIB2ã|¸ä >get_lengthë>SQL_ALL_EXCEPT_LIKE⼸ä?TOKEN_DEFAULT_DACLãظä?GlobalDeleteAtomáô¸ä?SetPaletteEntries¹ä ?VK_F6(¹ä?CRYPT_DECODE_NOCOPY_FLAGá@¹ä ?F5_180_512ë ?SPLDS_FLAGSât¹ä@GetExitCodeThreadŒ¹ä@LPTTPOLYCURVE¨¹ä@WM_MBUTTONDBLCLKáȹä@get_validateOnParseê @SQLDriversãü¹äAEM_SETLIMITTEXTâºä ACapabilitiesá,ºä A_CRL_ENTRYë$ACRYPT_VERIFY_CERT_SIGN_ISSUER_CHAINêBSOFTDIST_ADSTATE_AVAILABLE㘺äC_lseekã´ºäC_RGNDATAHEADERã̺äCLR_MONOCHROMEèºäCEnumCalendarInfoâ»ä CNPTIMECAPSã»ä CAF_IMPLINKã0»äCPCCRL_CONTEXTH»ä CtagSTATSTGã`»ä CDISCARDCACHEéCSetFuncCustDataâ”»äDalloc_ptr_refèDMCI_CUE⸻äEidãØ»äELOCALE_INEGSEPBYSPACEð»ä ERpcEndExceptá¼äEs_hostã0¼ä&EszOID_CERT_POLICIES_95_QUALIFIER1T¼äECERT_QUERY_CONTENT_CTLãl¼ä EVARIANT_BOOLéEsizelèFMulDiv㬼äGFLT_MIN_10_EXPãļäGMB_RTLREADINGä¼äGSCARD_ATTR_MAX_IFSDêGSQL_CODE_HOUR½ä HlcsIntentèHIID_IThumbnailExtractorâ\½ä"I_MSL_CMATH_DEFINED_MATH_ITEMSx½äINumberOfSymbols✽äIMCI_GETDEVCAPS_HAS_AUDIOá°½ä IpAuthInfoèICLSID_CCDScrollBarãô½äJGetPrivateProfileSectionWèJPEMRSELECTCOLORSPACEá0¾äKMCI_MODE_RECORDêKIOCTL_DISK_HISTOGRAM_DATAl¾äLReadEventLogA”¾ä"LERROR_DS_NONEXISTENT_POSS_SUP¸¾äLIOCTL_STORAGE_RESET_BUSâÔ¾äL_userSTGMEDIUMãô¾äLwireASYNC_STGMEDIUMêLget_URLâ¿ä MLC_CTYPEá,¿äMceiláT¿ä"MSTATUS_FLOAT_DENORMAL_OPERANDp¿äMPSYSTEM_ALARM_ACEˆ¿äMRtlMoveMemory¤¿äMMETA_POLYPOLYGONáÄ¿äMSZDDESYS_ITEM_HELPãÜ¿ä MlpFileListãÀäMCMSG_HASHED_DATA_CMS_VERSIONéM??_7IPipeLong@@6B@ëNcreateTextNodeãTÀäOSB_PAGEUPpÀäOWVR_ALIGNRIGHTã€ÀäOinë+OCERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBEDãÜÀäPIMAGE_SNAP_BY_ORDINAL64ãÁäPIMAGE_DEBUG_TYPE_FIXUPã ÁäPSTARTF_USECOUNTCHARSá<ÁäPAddAuditAccessAceXÁäPFACILITY_SCARDã€ÁäPERROR_DS_DRA_ACCESS_DENIEDëP__DOMDocument_FWD_DEFINED__â¸ÁäQ_dupáÌÁäQwcscmpãèÁäQOF_SHARE_COMPATâÂäQ_BY_HANDLE_FILE_INFORMATIONêQHC_ACTION4ÂäRisãTÂäRSID_AND_ATTRIBUTESãhÂä RAutoLoadé RDNS_REGISTERá¨ÂäSERROR_SCREEN_ALREADY_LOCKEDê SLPTIMECAPSãÔÂä T_wcsspnpáðÂäTDCBA_FACEUPNONEê TFADF_STATICâ Ãä Ufrac_digitsâ0ÃäUbitâ@ÃäUleftáPÃäUSIDâtÃäUERROR_NO_MEDIA_IN_DRIVEâˆÃäUMCI_CUTâ°ÃäUCMSG_ENVELOPED_ENCODE_INFOëU_CHANGER_SET_POSITIONôÃäVGetUserObjectInformationáÄäVRESOURCEDISPLAYTYPE_NETWORKâHÄä!VCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTRáhÄäVIExternalConnectionâ„ÄäVOnLinkSrcChangeêVV_DECIMAL¼ÄäWSPAPI_E_NO_DEVICE_ICONë WihPenìÄäXERROR_INVALID_LIBRARYÅäXIXMLDocument2_put_async_ProxyèXMDM_PROTOCOLID_DEFAULTãTÅäYWS_EX_RTLREADINGápÅäYWS_EX_LTRREADINGáŒÅäYCB_SHOWDROPDOWNâ¼Åä%YIRunnableObject_GetRunningClass_StubéYSQL_C_INTERVAL_MINUTEôÅäZReadEventLogWÆä ZSM_CXEDGEè#ZIBindCtx_RemoteGetBindOptions_StubãXÆä[SPAPI_E_DI_NOFILECOPYè.[IXMLDOMDocument_put_validateOnParse_Proxy°Æä\__copy_longs_rev_alignedáÔÆä\GetPrivateProfileSectionAüÆä\MCIERR_INVALID_DEVICE_NAMEë\ncb_stoâ Çä ]FLOAT<Çä]PRGNDATAHEADERãPÇä]GWL_STYLE€Çä%]szOID_PKCS_12_KEY_PROVIDER_NAME_ATTRé]PARTITION_XINT13_EXTENDED¸Çä ^HKL_NEXTé^PRINTACTION_OPENNETPRNãôÇä _gethostnameâÈä_CRYPT_ENCRYPT_MESSAGE_PARAãTÈä2__AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA€Èä _ICancelMethodCalls_Cancel_Proxyâ¤Èä_BINDSTATUS_ACCEPTRANGESê_MDM_MASK_HDLCPPP_SPEEDãèÈä`ERROR_DS_SERVER_DOWNé`NdrClientInitializeNewã4Éä"aOSS_COMPARATOR_DLL_NOT_LINKEDTÉäaLPNONCLIENTMETRICSAâtÉäaLOCALE_RETURN_NUMBERáŒÉä aMM_WIM_DATAâ¬ÉäamciGetErrorStringAãÈÉäaPMIDL_XMIT_TYPEâèÉäa_STORAGE_MEDIA_TYPEâÊäaPRINTER_ENUM_VALUESWé$aIXMLDOMDocument_get_readyState_StubâHÊäbrhsâ`ÊäbSmlItemList_ttÊä b_DOCINFOAèbNdrByteCountPointerMarshallâÀÊäcIMAGE_RESOURCE_DIRECTORYáÔÊä cS_NORMALáøÊäcNMPWAIT_USE_DEFAULT_WAITáËä cREASON_OTHERá(Ëä cSetVersionëcPSD_ENABLEPAGESETUPTEMPLATEâdËädgeteuidâxËädsmlAddCmd Ëäd__IBlockingLock_FWD_DEFINED__è#dIOleInPlaceUIWindow_GetBorder_StubãàËä eSIZELøËä eWSAEISCONNãÌäeFinish_OnSave(Ìä e__oleidl_h__éeSQL_QUIET_MODEãhÌäfEXCEPTION_NONCONTINUABLEá„ÌäfPAN_CONTRAST_HIGH˜Ìä fDrawStateèfEC_RIGHTMARGINãÔÌägEMRSCALEVIEWPORTEXTEXèÌä gcRDNAttrâÍä g_DWORD_BLOBê%gPRINTER_NOTIFY_FIELD_PRINT_PROCESSORáDÍäh_status87dÍähPCOMPAREITEMSTRUCTë hCADV_LATEACKáœÍäiCB_GETDROPPEDSTATEã¸ÍäiCRYPT_INITIATORâÌÍäiOLEVERBâàÍä iVarDecAddèiSQL_FN_NUM_TRUNCATEâÎäjOSVERSIONINFO,ÎäjSM_CYMENULÎäjszOID_STREET_ADDRESSálÎäjIStorage_Revert_ProxyèjIME_ESC_GET_EUDC_DICTIONARYâ¨Îä kN_TSHIFTékDISCDLGSTRUCTAãìÎämPBY_HANDLE_FILE_INFORMATIONâÏämERROR_BROKEN_PIPE8Ïä$mERROR_DS_COUNTING_AB_INDICES_FAILEDâTÏämWH_SYSMSGFILTERâtÏämBeginDeferWindowPosê mFinish_Pushâ°ÏänFILE_SUPPORTS_ENCRYPTIONáÈÏä npchEndWriteâàÏä nPSP_DEFAULTâ Ðä"nURLACTION_DOWNLOAD_SIGNED_ACTIVEXènSafeArrayRedimã@Ðä oSYSTEM_LUIDâXÐäoFILE_TRAVERSEŒÐä.o__InlineInterlockedCompareExchangePointer´Ðä"oERROR_HOST_NODE_NOT_AVAILABLEÐÐäodwRecipientChoiceôÐäoPROPSHEETHEADER_V1_SIZEâ4Ñä5oIGlobalInterfaceTable_RevokeInterfaceFromGlobal_StubáHÑä otdescElemèoSQL_DESC_COUNTãtÑäpj1ã˜ÑäpIMAGE_DEBUG_TYPE_CODEVIEW°Ñä pFACILITY_RPCépGetCharABCWidthsFloatôÑäq_DisposeThreadDataIndexâÒäqDMLERR_POSTMSG_FAILED,Òä q_CTL_ENTRYãHÒäqURLZONE_TRUSTEDâlÒäqMDM_V110_SPEED_12DOT0KëqSQL_CREATE_TRANSLATIONã¬ÒärSCRIPT_SUPPORTãÀÒä rMGR_FUNCáàÒärGRADIENT_FILL_OP_FLAGüÒärIPPORT_RESERVEDê"rFMTID_AudioSummaryInformationDÓäs__file_orientationãTÓäsj2ãdÓäshrã€ÓäsMETA_EXTFLOODFILLœÓäsRC_GDI20_OUTPUTêsPCCTL_CONTEXTÈÓätReferenceäÓätSCARD_W_WRONG_CHVøÓä t_DOCINFOWètPCTL_USAGE_MATCHé umidiConnectâ<Ôä vsize_PÔävIE_MEMORYlÔävGetAclInformation€ÔävMIDIEVENT ÔävCMSG_MAX_LENGTH_FLAGá¼ÔävuserHMETAFILEPICTèvOLESTREAMðÔäwLPNONCLIENTMETRICSWâÕäwmciGetErrorStringWã0ÕäwRPC_C_OPT_MQ_DELIVERYPÕäwSCARD_ATTR_MAXINPUTâpÕäwPRINTER_ENUM_VALUESAé0wURLACTION_INFODELIVERY_NO_EDITING_SUBSCRIPTIONSâÈÕäxERROR_NOT_JOINEDáÜÕä xDST_TEXTéxRpcNsBindingImportBeginâ$ÖäySCHED_E_CANNOT_OPEN_TASKá<ÖäyGRADIENT_RECTTÖäyEMRPOLYBEZIERlÖä yToUnicodeExâ€Öä yCLIPDATAáœÖäyMDMSPKRFLAG_DIALéyIGP_GETIMEVERSIONÐÖä zis_void_impâøÖä"zDNS_WARNING_PTR_CREATE_FAILED×ä zHS_DIAGCROSSá,×äzDMPAPER_LEDGERãH×äzNOTIFYICONDATAã`×äzcbCertEncodedx×ä z__wtypes_h__á×ä zpServerInfoêzPENDINGMSG_WAITDEFPROCESSÔ×ä{ERROR_NOT_CONTAINERâì×ä {PLOGBRUSH32âØä {FADF_VARIANTé{get_value,Øä|reference`Øä'|PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARAë|IPersistStream_IsDirty_Stubâ¬Øä}ERROR_DS_NAME_TOO_LONGãÈØä}CF_ENHMETAFILEãäØä}DISCDLGSTRUCTWãÙä}LPOLEINPLACEACTIVEOBJECTé}OleDuplicateDataá4Ùä~i_ãLÙä ~JOB_EXECUTEâlÙä~IStream_Commit_Stubê ~PIDDSI_SCALEáœÙä DeleteAtomãÄÙäERROR_OBJECT_ALREADY_EXISTSâäÙätagMCI_VD_STEP_PARMSéCERT_STORE_PROV_CLOSE_FUNCã,Úä€SPAPI_E_INVALID_CLASSDÚä €_DRAWPATRECTádÚä€tagCBTACTIVATESTRUCTáxÚä €WS_CHILDáŒÚä €mtOptioné€CryptHashSessionKeyâÄÚä mtNoObjectsâØÚäfAckReqâüÚäszOID_RSA_DES_EDE3_CBCãÛäSTGMOVEê PSN_WIZNEXTâLÛäƒAclRevisionInformationãpÛäƒHasOverlappedIoCompletedáˆÛä ƒLoadImageAã¸Ûä#ƒCHANGER_PREDISMOUNT_ALIGN_TO_DRIVEëƒRegisterMediaTypesãìÛä„OperationüÛä„hMemáÜä„SCHED_S_TASK_READYã8Üä„CBS_AUTOHSCROLLâPÜä „EnumPrintersé!„SQL_TRANSACTION_READ_UNCOMMITTEDáœÜä…EVENT_E_QUERYSYNTAXâ´Üä …IFID_DEFINEDáØÜä…CERT_QUERY_CONTENT_CRLãìÜä…pCorrInfoÝä …IID_IStreamê…OFN_NODEREFERENCELINKSã@Ýä†GCP_DIACRITIClÝä†RPC_C_PROTSEQ_MAX_REQS_DEFAULTãŒÝä†DocumentPropertiesAê†IBindCtx_EnumObjectParam_ProxyãÌÝä‡strrchrâôÝä‡SUBLANG_CHINESE_SIMPLIFIEDã Þä ‡LB_GETCOUNTâ(Þä‡SBM_SETSCROLLINFOè%‡_CERT_REGISTRY_STORE_CLIENT_GPT_PARAáxÞäˆIMAGE_THUNK_DATA32ãŒÞä ˆwErrorRetèˆCoAddRefServerProcessÌÞä‰EnumSystemLocalesAãäÞä ‰userHPALETTEâßä‰FirstSlotNumberâ ßä‰_wireSAFEARR_UNKNOWNáDßä‰dwTemplateCurrentLevelë‰MDM_SHIFT_V120_SPEEDáŒßäŠSE_GROUP_USE_FOR_DENY_ONLYã´ßäŠ_IMAGE_ARCHIVE_MEMBER_HEADERáÐßäŠMMIO_READWRITEãôßäŠCryptRetrieveObjectByUrlWàäŠSCardIntroduceReaderAèŠEnumPrinterDataExWã€àä?‹?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@ã˜àä‹ntmCellHeight¸àä‹_GLYPHMETRICSFLOATãÐàä ‹PSH_MODELESSáìàä‹IID_IWaitMultipleè‹CS_NOMOVECARETã áä ŒCONSOLEINFOâ<áäŒCOLOR_BTNSHADOWâTáäŒUserFileReadstáäŒSCardListInterfacesWéŒSQL_TXN_SERIALIZABLEá°áäxptBeginExchangeáÄáä ne_alignáàáäSTARTF_USEHOTKEYáøáäEnumDesktopsWâätagMENUITEMINFOWá$âädmhdá<âä IPPROTO_IGMPáXâäPROPSHEETHEADERWápâäTKIND_COCLASSèIEnumVARIANT_RemoteNext_StubéŽdwStyleâÈâäSE_SACL_PRESENTâðâäGetPriorityClipboardFormatããä UpdateWindowá$ãäCertStrToNameAã<ãä AbortPrinterálãä&IXMLDOMCharacterData_appendData_Proxyè$IXMLDOMEntity_get_notationName_Stubâ´ãäSTATUS_WAIT_0Øãä@class$7669sysytool___pcháääFRS_ERR_CHILD_TO_PARENT_COMMáääCUR_BLOB_VERSIONá4äädwLongNameLenXää@class$7768sysytool___pchxääSCARD_PROTOCOL_RAWã˜ääEnumPrintProcessorsâ¸ääDocumentPropertiesWêRegisterInterfaceInGlobalìää‘opãåä#‘IMAGE_AXP64_RUNTIME_FUNCTION_ENTRYã8åä‘DRVCONFIGINFOEXâXåä‘SYMMETRICWRAPKEYBLOBá€åä‘IRecordInfo_GetField_Proxyã¤åä‘INET_E_INVALID_REQUESTã¸åä‘_pdataë‘MDM_SHIFT_V110_SPEEDáèåä’osãüåä’lpClassâæä’EMRCREATEPALETTEá8æä’RPC_SETFILTER_FUNCã`æä’CMSG_RECIPIENT_COUNT_PARAMë’IIDFromStringŒæä“__EQUALâ æä“GetYValue¸æä “LZOpenFileë “guidVersionâäæä”lpNameäçä”ERROR_BAD_LENGTHé ”NRC_NOSAPSã(çä•TEXTá<çä •dwLengtháTçä •LoadImageWë•PRINTER_CONTROL_SET_STATUSã çä–CO_E_NETACCESSAPIFAILEDâÀçä–CRYPT_E_PENDING_CLOSEÔçä –PostAllocè–IID_ITypeInfoèä—CERT_CHAIN_POLICY_AUTHENTICODEã8èä—IDummyHICONIncluderâ`èä—IXMLError_GetErrorInfo_Stubê—SQL_ACTIVE_CONNECTIONSã¤èä˜PIPE_ACCESS_OUTBOUNDáÀèä˜WNNC_NET_SYMFONETìèä˜CMSG_OID_IMPORT_MAIL_LIST_FUNCë˜IErrorInfo_GetSource_Stub(éä ™CTRY_ESTONIAá@éä ™ncb_retcodeê™CertStrToNameWã„éäšERROR_DS_NC_STILL_HAS_DSASã¤éäšSCardListInterfacesAáÌéäšIXMLDOMNode_put_dataType_StubèšBINDF_DONTPUTINCACHEáêä›_EVENTLOGRECORDâ êä›EnumDesktopsA<êä›tagMENUITEMINFOAáhêä!›RPC_CONTEXT_HANDLE_DEFAULT_GUARDá€êä ›TCP_NODELAYâœêä›PROPSHEETHEADERAé ›SQLPrepareãÌêä œ_SW_DENORMALáàêäœ_RECTLãøêä œFreeConsoleâëäœCryptRetrieveObjectByUrlA<ëäœSCardIntroduceReaderWèœEnumPrinterDataExAã|ëäSetMenuItemBitmapsã”ëä MCI_SEQ_FILEá°ëäPROVIDOR_INFO_1âàëä$ICreateTypeLib_SetHelpFileName_Stubâìä#IXMLDOMCharacterData_put_data_StubëPIDMSI_SOURCE@ìä žReplyMessageá\ìäžPROVIDOR_INFO_2êžIID_IPropertyStorageá”ìä Ÿ_SIZEOF_INTâ´ìäŸEnumSystemLocalesWëŸIID_IRpcProxyBufferê! ERROR_CLUSTER_NODE_SHUTTING_DOWNáíä¡KLF_NOTELLSHELLâ4íä¡_NETRESOURCEAXíä¡RpcNsProfileEltRemoveWã€íä¡CERT_ALT_NAME_REGISTERED_IDâœíä¡varDefaultValueê¡MDMSPKRFLAG_ONãØíä¢SE_SYSTEMTIME_NAMEãðíä¢CreateDialogW$îä'¢CRL_REASON_CESSATION_OF_OPERATION_FLAGã8îä¢nUsersãdîä!¢ICreateTypeInfo_AddImplType_Stubé¢WriteClassStmîä£_makepath îä £c_strÌîä£DOMAIN_GROUP_RID_SCHEMA_ADMINSãðîä£TAPE_DRIVE_COMPRESSIONãïä£LPGCP_RESULTS$ïä£LB_GETSELCOUNTë£RpcBindingToStringBindingAãlïä¤smlFreeDevInfDSMemãïä¤PIMAGE_OPTIONAL_HEADER32á ïä ¤HFILEÈïä¤ERROR_PRINT_MONITOR_IN_USEãèïä¤DialogBoxIndirectWãðä¤_CERT_POLICIES_INFOâ0ðä¤SPLDS_PRINT_PAGES_PER_MINUTEé¤SQL_ISV_DOMAINSâ`ðä¥strtodãxðä¥PPSINJECTDATA¤ðä ¥CERT_OFFLINE_CRL_SIGN_KEY_USAGEâÔðä#¥PCMSG_RECIPIENT_ENCRYPTED_KEY_INFOë¥PCHANGER_SET_POSITIONñä¦PFN_CRYPT_ALLOCê¦SAFEARR_UNKNOWNâPñä§SCARD_W_CANCELLED_BY_USERpñä§UNIVERSAL_NAME_INFOWá”ñä§MS_DEF_DH_SCHANNEL_PROV_Aè§PROPSETHDR_OSVER_MINORãÐñä ¨CONTEXT_i386áüñä ¨EXCEPTION_DATATYPE_MISALIGNMENTâ òä¨RPC_S_NOTHING_TO_EXPORTâ4òä ¨lpszIconé¨WriteClassStgpòä©STARTF_FORCEONFEEDBACKã”òä©ERROR_CONNECTION_ABORTEDá¨òä ©fOptionsá¼òä©paramHë©DeletePropertyNamesâðòäªstrtokãóä ªLDBL_MAXá óäªDefineDosDeviceAé"ªIXMLDocument_get_dtdURL_Proxyhóä«ERROR_DEV_NOT_EXISTê«ERROR_IS_SUBSTEDáœóä ¬SetStdHandleáÀóä¬szOID_ORGANIZATION_NAMEâàóä¬IOCTL_SMARTCARD_EJECTôä¬ITypeInfo_GetVarDesc_Stubôä¬SETRGBSTRINGWè¬ImmIsUIMessageAâLôä­strtolãpôä­SmlUnknownProtoElement_tá„ôä­paramLë&­AsyncIPipeDouble_Finish_Pull_StubÈôä ®GenericAllãÜôä ®HMETAFILEè ®_NAME_BUFFERáõä¯ERROR_CTX_LICENSE_EXPIREDDõä¯DNS_ERROR_NO_CREATE_CACHE_DATAãdõä¯tagMCI_INFO_PARMSAã|õä ¯pszTemplateâ”õä ¯SERVER_READâ¸õä¯IEnumOLEVERB_Skip_Stubë¯SQL_IS_HOUR_TO_SECONDüõä°WSA_QOS_RESERVED_PETYPEâ öä°l1ë&°IXMLDOMNode_get_nextSibling_ProxyXöä±UNIVERSAL_NAME_INFOAápöä ±MM_MIM_DATAâöä±RPC_C_NS_SYNTAX_DCEâ´öä±MS_DEF_DH_SCHANNEL_PROV_Wè±IInternetSessionáðöä²DialogBoxIndirectAë ²CertIsRDNAttrsInCertificateNameâ,÷ä³l2ãH÷ä³NTE_BAD_KEYSETã\÷ä³mtVersionˆ÷ä³USER_MARSHAL_ROUTINE_QUADRUPLEã˜÷ä³SNBê³cParamsâÀ÷ä´MERGECOPYØ÷ä´CreateDialogAô÷ä´MCIERR_SET_DRIVEé´SPLDS_SHORT_SERVER_NAMEâ8øäµDLGC_DEFPUSHBUTTONãXøäµVP_MODE_TV_PLAYBACKâ€øäµRpcBindingToStringBindingWãœøäµSQL_SPEC_STRINGêµSQL_DESC_BASE_COLUMN_NAMEÐøä¶nwãèøä ¶_TOKEN_TYPEê¶DRAWSTATEPROC ùä·SECURITY_DESCRIPTORâLùä·COMADMIN_E_ROLE_DOES_NOT_EXISTãdùä·_NETRESOURCEWˆùä·RpcNsProfileEltRemoveAã¤ùä·LocalProcStringâÀùä·FORMAT_PARAMETERSèùä·SCARD_READER_TYPE_KEYBOARDãúä·CLSID_CCDCheckBoxè·ProcessSoftDistâ<úä¸LPENUMSTATPROPSTGdúä¸SQL_ATTR_CONNECTION_POOLINGê¸SQL_CP_ONE_PER_HENVâ¬úä¹IMAGE_RUNTIME_FUNCTION_ENTRYáÔúä¹InitializeSecurityDescriptoráôúä¹EMRDELETECOLORSPACEâ ûä¹hbrBackground,ûä¹tagMCI_INFO_PARMSWã`ûä(¹IRunnableObject_SetContainedObject_Stubê¹SQL_BEST_ROWIDã˜ûäºrandom_shuffleã´ûäºCO_E_PATHTOOLONGáÌûä ºNRC_BRIDGEãäûäºSETRGBSTRINGAáüäºImmIsUIMessageWêºSQL_CONVERT_DOUBLEãDüä»GetTimeZoneInformationãlüä»DestroyPrivateObjectSecurityá„üä »DOUBLE_CLICKá°üä!»LPIINTERNETPROTOCOLSINKStackableé»SQL_CA2_MAX_ROWS_UPDATEâðüä¼DefineDosDeviceWáýä¼PEMRSETBKMODE ýä ¼CONVCONTEXTâ<ýä¼MCI_SEEK_TO_START\ýä¼CLSCTX_REMOTE_SERVERé¼IID_IOleInPlaceObjectœýä½XPT_REQUEST_SENDERã´ýä ½LOCALE_SDATEáÌýä ½recv_successé½PKCS_CONTENT_INFOüýä¾newnodeâþä¾EMR_POLYBEZIERTOá@þä¾IRecordInfo_PutField_ProxyãTþä ¾VarDecAbsè¾IME_REGWORD_STYLE_USER_FIRSTáœþä¿TOKEN_SOURCE_LENGTHê¿NRC_ENVNOTDEFÈþäÀHTHELPëÀIID_IWinInetHttpInfoáÿäÁ?$to_unsigned@Fê ÁMousePosá8ÿäÂSML_ERR_XLT_ENC_UNKâ\ÿäÂExceptionContinueSearchâxÿäÂTOKEN_DUPLICATEâ˜ÿäÂFRS_ERR_INTERNAL_APIá¸ÿäÂMCI_WAVE_OPEN_PARMSAáÌÿä ÂSQL_ERRORè ÂSQL_C_DATEåäÃ?$to_unsigned@Dâä ÃGetVersionã8äÃCLIPBRD_E_BAD_DATAãXäÃCRYPT_E_ASN1_ERRORã€äÃSERVICE_ACCEPT_NETBINDCHANGEéÃSQLPrimaryKeysã¸äÄ?$to_unsigned@CâÌä ÄFILE_ENDáää ÄbSerifStyleê ÄlpstrSchemaâäÅresultã4äÅIMAGE_REL_PPC_ADDR32NBãLäÅGM_COMPATIBLEdäÅWM_FONTCHANGEè ÅCTRY_INDIAã äÆAuditEventObjectAccessãÀäÆInterlockedExchangeâØä ÆGetTextFaceAáüäÆPORT_STATUS_OUT_OF_MEMORYèÆ??_7ITypeInfo@@6B@ã,äÇmfãPäÇSPI_SETSCREENSAVETIMEOUTéÇLPICONMETRICSAãäÈIMAGE_SUBSYSTEM_UNKNOWNâ¤äÈS_SERQFUL¸ä ÈSetTimeráÈä ÈHMIDIèäÈALG_SID_SSL3SHAMD5ãä$ÈCERT_STORE_CERTIFICATE_CONTEXT_FLAGêÈ_pchBufâXä&ÉSECURITY_CREATOR_OWNER_SERVER_RIDˆä%ÉERROR_RESOURCE_PROPERTY_UNCHANGEABLEá¬äÉCERT_ACCESS_STATE_PROP_IDÔäÉSCARD_ATTR_CURRENT_IO_STATEâôäÉREGCLS_MULTIPLEUSEë ÉSetTimesá,äÊERROR_GRACEFUL_DISCONNECTHäÊCWP_SKIPDISABLEDéÊIBindCtx_GetBindOptions_StubáŒäËLookupAccountName¤ä ËLogonUserAã¼äËDT_SINGLELINEÐä ËMCI_SEEKáèä ËPF_IMPLINKãäËLPPRINTER_INFO_9AèËPPRINTER_ENUM_VALUESá<ä ÌMonthNamesãPäÌSmlCopy_tdä ÌStopBitsátäÌmmëÌSQL_INFO_FIRSTã¬äÍ?$to_unsigned@JâÈäÍSML_PCDATA_CDATAáàä ÍSmlCredPtr_táøäÍDRIVERVERSIONäÍSPI_GETSCREENSAVETIMEOUTá<äÍCRYPT_IMPL_HARDWAREêÍ_CERT_CHAIN_CONTEXTê#ÎIXMLDOMNotation_get_publicId_Proxyã¨äÏ?$to_unsigned@HâÄäÏ?$chooser@$0A@ãèäÏRPC_NCA_FLAGS_BROADCASTâ äÏMDM_HDLCPPP_ML_DEFAULTã$äÏSQLSETPOSIROW@äÏSQL_DESC_LABELëÏSQL_COLUMN_NUMBER_UNKNOWNtäÐo1ãœä"ÐRPC_X_SS_CHAR_TRANS_OPEN_FAIL´ä ÐGetTextFaceWáÈäÐKEY_EVENTàä ÐrgAltEntryãä(ÐSTGC_DANGEROUSLYCOMMITMERELYTODISKCACHEâ8äÐ@class$7769sysytool___pchèÐCLSID_PSEnumeratorsâ€äÑIS_TEXT_UNICODE_UNICODE_MASKáäÑnMaxá¬äÑLPICONMETRICSWãÈäÑPKCS_TIME_REQUESTØäÑmpãðäÑMSHCTX_INPROCèÑSPLREG_EVENT_LOGá äÒmsã< äÒIMAGE_SIZEOF_SYMBOLâ` äÒCRYPT_OID_INFO_OID_KEYã| äÒNDR_CHAR_REP_MASKèÒGetBindString¤ äÓo2ãÀ äÓMCI_SEQ_SET_PORTáä äÓszOID_ENHANCED_KEY_USAGEá ä"ÓIBindCtx_ReleaseBoundObjects_StubèÓdwSpeakerVolumeâH äÔnext_file_structဠä,ÔERROR_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN☠äÔMOD_WAVETABLE¸ äÔMCI_WAVE_OPEN_PARMSWéÔBYTE_BLOBä äÕSYSYNC_ENGINEô äÕGUIDá ä ÕihPal$ äÕtagDCOM_CALL_STATEëÕguidáT äÖAreAllAccessesGrantedx äÖSCHED_S_TASK_HAS_NOT_RUNጠäÖCFSEPCHAR  äÖdwSlave⸠ä ÖPNAME_BUFFERáÐ ä ÖHeaderLengtháè ä ÖMAX_SID_SIZEá äÖSCardGetAttribë#ÖIXMLDOMNode_get_namespaceURI_Proxyë×??_7ISurrogate@@6B@â€ ä ØIMAGE_COMDAT_SELECT_EXACT_MATCH⤠äØRPC_E_INVALID_CALLDATAëØ@class$7826sysytool___pchØ äÙmxãô äÙPCF_TOTALTIMEOUTS ä ÙLBS_STANDARDé*ÙCRYPT_OID_EXPORT_PUBLIC_KEY_INFO_FUNCT ä ÚLANG_TELUGUâh äÚTIMEVALêÚ_CHANGER_ELEMENT_STATUS⨠äÛSORT_KOREAN_KSCâÌ äÛPAGE_EXECUTE_WRITECOPYãì äÛTHREAD_PRIORITY_IDLEáäÛERROR_DS_AUX_CLS_TEST_FAILã,ä ÛEMR_FILLPATHáHäÛLPD_SWAP_EXCHANGEèÛIEnumFORMATETC_Skip_Stubá|äÜPSIZEèÜCoGetTreatAsClass°ä ÝLogonUserWãÄä ÝLPCIEXYZáàäÝWN_EXTENDED_ERRORäÝPSTORAGE_DEVICE_NUMBERã äÝLPPRINTER_INFO_9W@äÝIUnknown_AddRef_StubáXä ÝPARSEACTIONâtäÝSQL_AUTOCOMMIT_ONèÝSQL_DESC_SCHEMA_NAMEá°äÞSTGTY_PROPERTYãÄäÞOLEUPDATEÜä ÞSQLRowCountâøäÞSQL_CONVERT_TIMEéÞSQL_ROW_PROCEEDâ8äßCONTEXT_DEBUG_REGISTERSâTäßLPMCI_SEEK_PARMSéßIEnumSTATPROPSTG_Reset_Stubâä àNEARPROCá¬äàDESKTOPENUMPROCWáÄäàLB_FINDSTRINGàäàPPRINTER_INFO_2âüäàPMONITOR_INFO_2ê%àITypeLib_RemoteGetTypeInfoCount_StubáDäáPC_NOCOLLAPSE`äáEM_GETLIMITTEXTâxäáBS_PUSHBUTTONŒäáAF_OSIã¨äá_PROPSHEETPAGEWâÄäáPPRINTER_INFO_3êáIMoniker_Reduce_StubáäâSUBLANG_SPANISH_MODERNëâITypeMarshal_Marshal_Stub<äãlbãPäãUOI_FLAGSläãMapWindowPointsâˆäãPPRINTER_INFO_1êãPMONITOR_INFO_1âÈääPerProcessUserTimeLimitâàääLPDRVCALLBACKáääPMCI_OVLY_LOAD_PARMSAèäPPRINTER_INFO_6â,ä åfmodl<ä åmodflXäåQueryDosDeviceã„ä åERROR_DS_NAME_ERROR_DOMAIN_ONLYâœäåVS_FF_PATCHED¸äåMCI_TMSF_TRACKëåPPRINTER_INFO_7âüäæRPC_S_UNKNOWN_AUTHZ_SERVICEâä æHRESULT_CODEá,ä æPEMRFILLRGNâ\ä#æCERT_FIND_PROP_ONLY_CTL_USAGE_FLAGãxäæPPRINTER_INFO_4êæIViewObject_Freeze_Stubâ¬äçfmináÈäçCreateDIBSectionáääçWM_CHILDACTIVATEâäçPPRINTER_INFO_5âäçAddPrintProcessorè!çIOleItemContainer_GetObject_Stubáläè??_7range_error@std@@6B@áˆäèSUBLANG_ITALIANâ¤äèERROR_BAD_FORMATáÈäèSPAPI_E_FILEQUEUE_LOCKEDáàä èWM_DRAWITEMãäèI_RpcNsRaiseException äèPropSheet_InsertPageá0äèliãdä(è__IParseDisplayName_INTERFACE_DEFINED__êèVAR_PERINSTANCEâœäéwlower_map_ptrã´ä éislessequalâÌä édo_replaceãðäéERROR_INVALID_COLORSPACEééSETCOLORTABLE(äêdwOpenEncodingTypeã@äêuserHMETAFILE\äêPPRINTER_INFO_8êêDATA_E_FORMATETCáä ëStatusWordã¤äëHGDIOBJâÀäëRUSSIAN_CHARSETâÜäëLPWAVEOUTCAPSAãøäëScsiInformationâä ëMAXPROPPAGESá,äëLPPRINTER_INFO_8AèëPPRINTER_INFO_9â`ä ìAclRevisionâtäìPOINTLãˆäì_lreadã¨äìLookupPrivilegeValueAØä#ì__IAdviseSink2_INTERFACE_DEFINED__ãðä ì_INC_COMMDLGéìSQL_SP_MATCH_UNIQUE_PARTIALâ0ä í__strerrorëíVarBstrFromBoolê*îCERT_QUERY_CONTENT_PKCS7_SIGNED_EMBEDŒä ïfmodfœä ïmodffÀäïERROR_CLIPBOARD_NOT_OPENáØä ïLPPOLYTEXTWâèä ïDDELNäïNPWAVEOUTCAPSAë"ïPRINTER_NOTIFY_INFO_DISCARDED<äðn1ã\äðsml_source_ref_list_späðIDHELPëðdwKeySpec˜äñTokenUser¼äñERROR_CONTROLLING_IEPORTáÔä ñMCI_SEQ_MIDIéñCertGetNameStringäòHeaderã$äòCERT_E_UNTRUSTEDROOTá<ä òtagEMRBITBLTá\äòPMCI_OVLY_LOAD_PARMSWèòCRYPT_CONTENT_INFOãäówcschrã¨ä ótvalue_typeâ¸äón2ãÈäónearáØäóNEARáøäóTAPE_DRIVE_INITIATORá äóPOINTSã,äószOID_CERT_EXTENSIONSèóLPOINETPRIORITYêôSizePtrOffsetArrayãxäõltëõBINDSTATUS_PROTOCOLCLASSIDãÄäöIMAGE_SNAP_BY_ORDINAL32âàäöICM_QUERYPROFILEáüäöDESKTOPENUMPROCAéöfrmr_recv,ä÷EMR_SETBRUSHORGEXHä÷_PROPSHEETPAGEAâxä%÷IXMLDOMCharacterData_deleteData_Stubé÷SC_LOCKâ¨äøis_specializedãÄäøDC_ORIENTATIONãØäøCBR_110âðä øPDRAWPATRECTáäøBlendOpê øPEMRFRAMERGNá4ä ùLPPOLYTEXTAâHä ùDeleteDCádäùNPWAVEOUTCAPSWëùFlipá”äúLookupPrivilegeValueW¬ä úCTRY_FRANCEâÄä úPDRVCALLBACKáääúLPMCI_GENERIC_PARMSâøäúpAsyncãäúCMSG_KEY_AGREE_VERSIONã@äúPRINTER_CHANGE_DELETE_JOBè úGCS_COMPATTRá€ä"ûIMAGE_NT_OPTIONAL_HDR64_MAGIC˜ä ûGMEM_LOWERã¬ä ûbcPlaneséûIOCTL_CHANGER_MOVE_MEDIUMðäüERROR_DIR_NOT_ROOTã äüLPMOUSEHOOKSTRUCT( äüBDR_SUNKENINNERâ< äüfrmr_xmith ä!üIRecordInfo_PutFieldNoCopy_Proxyé üCLEANLOCALSTORAGE_UserUnmarshal⬠ä ýsml_item_sãÀ äýCE_MODEâØ äýRPC_E_TIMEOUTì äýGCL_STYLE!äýLPWAVEOUTCAPSWã$!äýLPPRINTER_INFO_8WèýIID_IXMLElement2áP!äþm_ãd!äþcdwParams€!äþRPC_C_VERS_ALLã˜!ä þcbNDRContextá´!äþWDT_REMOTE_CALLêþget_JavaDSOCompatibleèÿPROBE_ALIGNMENTâ"å iLayerTypeìCryptGetObjectUrlH"äCO_E_RUNAS_LOGON_FAILUREád"äRASTER_FONTTYPEê ChooseColorAá "äSYSYNC_BUILDNUMBER_TXTã°"ä lseekÌ"äis_fundamentalãô"ä_IMAGE_BOUND_FORWARDER_REFã#äscã #ämixerGetDevCapsWáX#ä-AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARAéSQL_SR_GRANT_OPTION_FORâ˜#äIMAGE_REL_PPC_NEG¸#äDLL_PROCESS_DETACHãØ#äRPC_S_INVALID_TIMEOUTèWINSTA_EXITWINDOWSã$ä dsmem,$äIMAGE_REL_MIPS_JMPADDRëcadateã`$äERROR_WRONG_PASSWORDá€$äPEMRGLSBOUNDEDRECORDá $äRPC_C_OPT_MQ_JOURNALáÄ$äCERT_STORE_SAVE_TO_MEMORYè$äCERT_CHAIN_POLICY_NT_AUTHèLPPROVIDOR_INFO_1,%äERROR_DS_INVALID_SEARCH_FLAGáL%äENHMETA_STOCK_OBJECTáh%äRPC_C_VERS_UPTOâ„%äLPPROVIDOR_INFO_2èrgdispidNamedArgs¸%ä IsCharAlphaAáÜ%äFRERR_BUFFERLENGTHZEROã &ä7CRYPT_SORTED_CTL_ENCODE_HASHED_SUBJECT_IDENTIFIER_FLAGã0&ä cbBufL&ä??_7IStream@@6B@éSQL_SC_SQL92_ENTRYãˆ&äEMR_SELECTOBJECTá¤&ä_WAVEFORMATEX_ë'_CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARAãô&ä LPDRVCONFIGINFOEX'ä _LPCATALOGFILEINFO_DEFINEDë CHOOSECOLORAáP'ä ACCESS_MAX_LEVELáp'ä STG_E_BADBASEADDRESSáŒ'ä ENDSESSION_LOGOFF¨'ä UNLOCK_ELEMENTãÌ'ä IStream_LockRegion_Stubâü'ä$ IOleInPlaceSite_OnUIDeactivate_Stubâ(ä OInetParseUrlè PUAF_FORCEUI_FOREGROUNDâ\(ä EMREXTCREATEFONTINDIRECTWè IOCTL_STORAGE_EJECT_MEDIA˜(ä LT_DONT_CAREá´(ä IMessageFilterë tagStorageLayoutáð(ä GetDevicePowerStateâ)ä MOD_MAPPERë PCERT_CHAIN_CONTEXTâ8)äcur_áH)ä tree_h)äGetFileAttributesAã„)äGetEnhMetaFileã )äwVirtualKeyCodeâ¸)äPFORM_INFO_1AèVarCyFromBoolà)äsnãü)äPFN_CMSG_ALLOCã *ä VT_CF *ä MEMBERIDé!ICreateTypeInfo2_Invalidate_Stubá`*ä _strdateá*ä$PROTECTED_SACL_SECURITY_INFORMATIONâ *äVT_CYè@class$7766sysytool___pchÜ*ä smlAllocExecáô*ä IsCharAlphaWá +ä"CertAddEnhancedKeyUsageIdentifierèSQL_CUR_USE_ODBCá`+äGetPrivateProfileStructâ€+äPSINJECT_PAGESATENDâœ+äDATE_SHORTDATEëpfltValâÄ+äCE_DNSãØ+äBoundsãð+ä SE_ERR_SHAREá,äSQL_COLUMN_TABLE_NAME0,äSQL_COLATT_OPT_MAXëSQLColumnPrivilegesâl,älpDebugStringData„,äEMR_ABORTPATH ,ämixerGetDevCapsAé lpszVerbNameáÈ,ästãô,äERROR_NO_BROWSER_SERVERS_FOUNDã -ä!ICreateTypeInfo_AddVarDesc_ProxyéVarDecFromStrT-ä_MSL_VA_LIST_Hãt-äCRYPT_IMPL_UNKNOWNë BufferStartâ¨-äRestrictedSidsãÌ-äPCRYPT_SMIME_CAPABILITIESà-ä TYPEDESCé ChooseColorWá.ä MEM_RESERVEâ0.äGetFileAttributesWãT.äERROR_NOT_LOGON_PROCESSâl.ä METAHEADERã„.ä lpCaretPosã¨.äCreateEllipticRgnIndirectÈ.äMMIOERR_FILENOTFOUNDáì.ä@class$7726sysytool___pch/äPFORM_INFO_1W4/ä%__MIDL_itf_urlmon_0180_v0_0_c_ifspecé%__MIDL_itf_urlmon_0182_v0_0_s_ifspecá„/äSUBLANG_FRENCH_SWISSá /äEMRPIXELFORMATã¼/äCAL_ICALINTVALUEáð/ä'CONTEXT_OID_CREATE_OBJECT_CONTEXT_FUNCã0äJOB_CONTROL_SENT_TO_PRINTERêWM_PSD_PAGESETUPDLGêCLSID_CCDTextBoxPropertyPageáŒ0ä _DN_SAVE_OPERANDS_FLUSH_RESULTSâœ0äszã´0ä VER_GREATERâÜ0ä"SEF_DEFAULT_OWNER_FROM_PARENTô0äMMIO_ALLOCBUFèRpcSsAllocate$1ä F5_1Pt2_512êSQL_FN_STR_LENGTHP1äcUrléSQL_MAX_USER_NAME_LEN˜1äDeCommitFreeBlockThresholdãÀ1äCOMPRESSION_ENGINE_STANDARDê SM_CYVTHUMBâü1äCERT_RDN_PRINTABLE_STRING2äDVD_RWã02ädataRepresentationë CHOOSECOLORWád2ä ?$__char@$0BP@ã„2ä ERROR_INDEX_ABSENTãœ2ä WM_SETTEXTãÐ2ä) CERT_PHYSICAL_STORE_PREDEFINED_ENUM_FLAGáø2ä IOCTL_STORAGE_CHECK_VERIFY2â3ä POPENCARDNAMEè SQL_MAX_SCHEMA_NAME_LENâL3ä !DMNUP_SYSTEMáh3ä!_PRINTER_INFO_3â„3ä!GetTypeInfoCounté!SERVICE_CONTROL_CONTINUEá¸3ä"rcãÌ3ä"SELECTDIBä3ä"uuid_vector_tè#"CRYPT_CONTENT_INFO_SEQUENCE_OF_ANYã84ä#REG_OPENED_EXISTING_KEYâP4ä #VK_RBUTTONãd4ä#MF_INSERT4ä #szOID_PKIX_POLICY_QUALIFIER_CPSâ 4ä#pbAtrè#SQL_API_SQLMORERESULTSãì4ä"$??_Gdomain_error@std@@UAE@I@Z5ä$UInt32x32To64(5ä$IMAGE_SCN_MEM_NOT_CACHEDáT5ä!$FRS_ERR_PARENT_INSUFFICIENT_PRIVát5ä$CDERR_DIALOGFAILUREâ5ä$MCI_HMS_MINUTEã¬5ä$_PRINTER_INFO_6âÄ5ä $pConfigFileâÜ5ä $pValueNameãø5ä$AddPrintProvidorA$6ä!$IROTData_GetComparisonData_Proxyé$SCS_SETRECONVERTSTRINGã`6ä %WM_GETTEXTãx6ä %CTRY_DEFAULTáˆ6ä%rdë%_FLAGGED_WORD_BLOBãÈ6ä&SetFileAttributesAãð6ä&tMIXERCONTROLDETAILS_UNSIGNEDè&CRYPT_USERDATAã 7ä'e_oemidâD7ä'ERROR_DS_NAMING_VIOLATION`7ä'GetCharABCWidthsA„7ä'szOID_EMBEDDED_NT_CRYPTOé+'CRYPT_OID_SYSTEM_STORE_LOCATION_VALUE_NAMEãÐ7ä(FLT_MAXâä7ä(peGreenê(PHELPWININFOW8ä )PPATTERNá$8ä )DrawEdgeá<8ä )DestroyMenuâ`8ä)CRYPT_RC2_CBC_PARAMETERSáx8ä )BytesWrittené)CLSID_CCDXObjectPropertyPageá´8ä *S_SEROFMáà8ä *ERROR_DS_OBJ_STRING_NAME_EXISTSâü8ä*PostAppMessageAâ9ä *STM_SETICONâ09ä*DdeQueryConvInfoáL9ä*WAVE_FORMAT_PCMâh9ä*CHANGER_TO_IEPORT|9ä *LPSTREAMá´9ä-*AsyncIAdviseSink_Finish_RemoteOnRename_Proxyé*SQL_WCHARè9ä+ERROR_SPL_NO_STARTDOC :ä+ERROR_PROMOTION_ACTIVEã4:ä+MCI_OVLY_WHERE_DESTINATIONãT:ä+HACCEL_UserUnmarshaláx:ä+SQL_DESCRIBE_PARAMETERë+SQL_CA1_LOCK_NO_CHANGEã°:ä,va_copyâÀ:ä ,PBYTEè:ä,ERROR_DS_DRA_RPC_CANCELLEDä;ä ,_RPC_IF_IDã;ä ,BusTypeScsiâ0;ä ,F3_1Pt2_512â@;ä,hpageè,STGMEDIUMp;ä-WSA_QOS_SENDERSâˆ;ä -SERIALKEYSWâ¤;ä-RPCFLG_LOCAL_CALLÀ;ä-PPRINTER_DEFAULTSè-ICreateTypeLib_SetLcid_Stubâ<ä.SmlSourcePtr_tã<ä.PATCOPYâ,<ä .SC_HOTKEYè .NUMLOCK_ONë /STM_GETICONâl<ä0p1ãŒ<ä0SetFileAttributesWã <ä 0VK_OEM_2áÈ<ä0MCIERR_UNRECOGNIZED_COMMANDâø<ä#0USER_MARSHAL_UNMARSHALLING_ROUTINEë0_FORMAT_EX_PARAMETERS4=ä1GetCharABCWidthsWH=ä 1VK_OEM_3ád=ä1PRPC_ASYNC_STATEáx=ä 1CTL_INFOé1SCARD_CTL_CODEã¬=ä 2__win32_osãÀ=ä2SETDTRãà=ä2OSS_MUTEX_NOT_CREATEDü=ä2AddPrintProvidorW >ä2tdescè2NUMPRS_LEADING_WHITEá<>ä3p2ãP>ä 3VK_OEM_1ál>ä3tagMONCBSTRUCTãˆ>ä3NCBCHAINSENDNAã¤>ä3RpcNsGroupDeleteáÀ>ä3FuncVerifyImageê3SQL_PACKET_SIZEâø>ä4_MSL_LOCALE_NONEá?ä4PIMAGE_OPTIONAL_HEADERã8?ä4TAPE_ERASE_LONGâL?ä 4VK_OEM_6ád?ä 4tagHELPINFOâ€?ä4szOID_SERIALIZEDá˜?ä 4CLSCTX_ALLãÐ?ä-4AsyncIAdviseSink2_Begin_OnLinkSrcChange_Stubé4BINDF_IGNORESECURITYPROBLEMâ @ä5isdigitâ @ä5atan2lã4@ä5PLONG32âD@ä5RECTáX@ä 5VK_OEM_7át@ä5MIDICAPS_CACHEã„@ä5rtë#5IPersistMoniker_GetCurMoniker_StubãÈ@ä 6REG_NONEáÜ@ä 6VK_OEM_4âAä6PropSheet_SetFinishTextâ,Aä"6ICreateTypeInfo2_Invalidate_Proxyè 6DoDecodeádAä7ullAvailExtendedVirtualâ|Aä 7DMTT_BITMAPâAä 7VK_OEM_5á°Aä7SE_ERR_DLLNOTFOUNDãÀAä7recváèAä7NdrInterfacePointerBufferSizeè7PUAFáBä8IsProcessRestrictedâ0Bä 8ERROR_LOCKEDá\Bä 8ICreateTypeLib_SetVersion_Proxyâ€Bä8ITypeInfo_GetNames_Stubê 8VarCyFromUI2á¨Bä9rxãÌBä9ERROR_NESTING_NOT_ALLOWEDäBä9SCROLLLOCK_ONè%9__MIDL_itf_objidl_0054_v0_0_c_ifspecá,Cä:p_cs_precedesDCä:GENERIC_WRITEXCä :VK_OEM_8ápCä:iScrollHeight˜Cä:CERT_STORE_TIME_VALIDITY_FLAGè":NdrConformantStructMemorySizeàCä;ERROR_INVALID_FLAGSâôCä ;EVENTMSGá Dä ;SERIALKEYSAâ$Dä;PSM_UNCHANGEDDDä;HandleInComingCallë ;VarCyFromUI1á€Dä<REALTIME_PRIORITY_CLASSâ˜Dä<ResizePaletteè<PostAppMessageWâÐDä=tagEMRGLSRECORDâäDä=Simpleë=SPLDS_PRINT_COLLATEâEä>PHELPWININFOA8Eä>MIDICAPS_LRVOLUMEhEä#>I_RpcServerRegisterForwardFunctionã„Eä>NdrServerMarshall¤Eä>SERIAL_IOC_MCR_RTSë >VarCyFromUI4áÐEä?atan2fãðEä?PSINJECT_BEGINPROLOGáFä?BI_PNGã(Fä?OUT_SCREEN_OUTLINE_PRECISè ?CreateCallë @GET_CERT_UNICODE_ATTR_ERR_INDEXâ„Fä AWS_SYSMENUã˜Fä ALPAUXCAPSè)A__ICancelMethodCalls_INTERFACE_DEFINED__áøFä BCERTSRV_E_UNSUPPORTED_CERT_TYPEâGäBwaveOutSetPlaybackRateã4Gä BNCBDGRECVBCâ`GäB__IPersistStream_FWD_DEFINED__ë+BICreateTypeInfo2_DeleteVarDescByMemId_Stubã¸GäCCRYPT_E_HASH_VALUEãÔGäCPGRADIENT_RECTãðGäCPEMRPOLYBEZIERëCCERT_RDN_BMP_STRINGâ8HäDInterlockedCompareExchangeã\HäDIsValidSecurityDescriptor|HäDSetWinMetaFileBitsã˜HäDGetKerningPairsâ´HäDX509_DH_PUBLICKEYèDRootIndexWriteBytesâèHäEstricmpâIäEIMAGE_ARCHIVE_LONGNAMES_MEMBERãFLT_MINâ´Êä>ERROR_LOCAL_USER_SESSION_KEYáÐÊä>PEMRPOLYLINETOãäÊä >lpszClassè>SQL_CVT_VARBINARYËä ?LockFileé ?wvsprintfAãPËä@MESSAGE_RESOURCE_ENTRYãhËä @TECHNOLOGYã”Ëä!@PCERT_KEY_USAGE_RESTRICTION_INFOé@MONITOR_INFO_1AâÔËäAERROR_DS_NAME_UNPARSEABLEôËäAWM_WINDOWPOSCHANGINGáÌäAVS_FF_PRIVATEBUILDã8ÌäASND_ALIAS_SYSTEMDEFAULTê ArgCertStoreâ`Ìä BtruncpÌäBcmykéBCMYKá˜Ìä CCS_VREDRAWã¬Ìä CcbBufferéCHPROPSHEETPAGEãØÌäDhereáøÌäDIMAGE_REL_PPC_IMGLUEáÍäDPSPROTOCOL_ASCIIá4ÍäDMCI_WAVE_SET_CHANNELSèDtagCANDIDATELISTálÍäENORM_IGNORECASEâŒÍäELOCALE_SENGCOUNTRYã ÍäEMCI_SETâÀÍäERpcBindingInqAuthInfoÜÍäEPRINTER_INFO_1WâÎäEIRecordInfo_RecordCopy_Proxyé!EIID_IInternetHostSecurityManageráPÎäFTIME_ZONE_ID_INVALIDátÎäFIPersistFile_Save_ProxyâŒÎä FGetDestCtxExé!FSID_SInternetHostSecurityManageráØÎäGTAPE_CREATE_PARTITIONøÎäGAddAccessDeniedAceãÏäGGetClassLongPtrâ(ÏäGES_LEFTâHÏäGRpcEpResolveBindingâdÏäGCALG_SSL3_SHAMD5á„ÏäGszOID_POSTAL_ADDRESSá¬ÏäGCERT_STORE_OPEN_EXISTING_FLAGè GszCodeBaseãèÏäHHSHELL_WINDOWDESTROYEDäÐäHWM_TIMECHANGEÐä HReadRequestâHÐä*HIPersistStorage_HandsOffStorage_Proxy`Ðä HLPADVISESINKé HtagVARKINDãŒÐä ISHRT_MAXá´ÐäIEXCEPTION_PRIV_INSTRUCTIONãÈÐäICharLoweräÐäIEnumThreadWindowsÑäIRESOURCETYPE_RESERVEDèIOLECONTF_ONLYUSER@ÑäJSmlDevInfCTDataProp_tdÑäJSE_IMPERSONATION_STATEãÑä JJOB_OBJECT_LIMIT_ACTIVE_PROCESSâ°ÑäJFILE_SEGMENT_ELEMENTáÌÑäJCombineTransformáèÑäJPEMRSETMETARGNãÒäJESB_ENABLE_BOTHâÒä JSSWF_CUSTOMâ8ÒäJCRYPT_URL_ARRAYê"JCHANGER_VOLUME_IDENTIFICATIONxÒä KIOMEGA_ZIPëKTYMED_ISTREAM¬ÒäLsml_callbacks_sâÀÒä LlstrcatAáèÒä"LERROR_DS_DRA_SCHEMA_INFO_SHIPÓäLCO_E_APPDIDNTREGáÓäLSB_CTLã8ÓäLRpcProtocolSequenceâTÓäLObjectHelpTitleâtÓäL_tagHIT_LOGGING_INFOéLSQL_NULL_HDBC¨ÓäMIMAGE_ENHMETAFILEÐÓäMMIXERCONTROL_CT_CLASS_SWITCHáàÓä MntohlôÓä MhContextá ÔäMIXMLDocument_get_doctype_ProxyëMSQLSetStmtOptionáTÔäNGCP_MAXEXTENTtÔäNWM_CTLCOLORLISTBOXã˜ÔäNALG_TYPE_SECURECHANNELëNIID_IInternetBindInfoÜÔäOsml_source_or_target_sãÕä.OERROR_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER$Õä OPDEVMODEéODlgDirSelectComboBoxExãdÕäPround_to_nearestáxÕäPszPnameâœÕäP@class$7763sysytool___pch¼ÕäPLOCK_UNLOCK_KEYPADëPGetBindOptionsãøÕäQERROR_NETNAME_DELETEDèQPSM_CANCELTOCLOSE8ÖäRSID_IDENTIFIER_AUTHORITYá\ÖäRDNS_ERROR_DS_UNAVAILABLEáxÖäRCRYPT_E_REVOKEDê Rntohs´ÖäSERROR_DS_NONSAFE_SCHEMA_CHANGEãÈÖä SMF_GRAYEDèSPRINTER_INFO_1Aâ ×äTRPC_C_PROTECT_LEVEL_DEFAULTê TbstrHelpFileáP×ä UIS_TEXT_UNICODE_REVERSE_ASCII16âh×ä UXTYP_EXECUTEé USO_KEEPALIVEá ×äVGCPGLYPH_LINKAFTERãÈ×äVCERT_TRUST_IS_COMPLEX_CHAINêVMONITOR_INFO_1Wâô×ä WEXDEVØäWLookupIconIdFromDirectoryExêWNCBACTION`Øä%X__MIDL_itf_urlmon_0185_v0_0_c_ifspecé%X__MIDL_itf_urlmon_0187_v0_0_s_ifspecá Øä Yldexp°Øä Ylog10ÈØä YWSATRY_AGAINáäØäYCONVERT10_S_FIRSTÙäYEMR_SETWINDOWEXTEXëYSQL_AT_CONSTRAINT_DEFERRABLEáTÙä"ZFILE_NOTIFY_CHANGE_LAST_WRITEhÙä ZlstrcatWéZ??_7IProgressNotify@@6B@á Ùä [_COMMPROPè[ERROR_DS_DRA_NAME_COLLISIONê\ERROR_CTX_PD_NOT_FOUNDã Úä]SYSYTOOL_PRECOMP_HãÚä ]front8Úä]PTAPE_WRITE_MARKSTÚä]MakeAbsoluteSD2âdÚä ]tymedˆÚä]IBinding_Suspend_Proxyë]lpLogFont¬Úä^x_ãÄÚä ^e32_objmapãàÚä^ERROR_GEN_FAILUREÛä^ERROR_CLUSTER_INVALID_NODEã Ûä ^__RPCNSI_H__á@Ûä^SEE_MASK_INVOKEIDLISTXÛä ^pszProviderê^IStream_Seek_Proxyã¤Ûä _COMQC_E_NO_QUEUEABLE_INTERFACESâÀÛä_WM_IME_KEYLASTãÔÛä_KP_MODEâÜä._ISynchronizeContainer_AddSynchronize_Stub$Üä_CFSTR_MIME_JPEGâLÜä_IInternetProtocol_Read_Stubê_SQL_C_TYPE_DATEâ˜Üä$`PROTECTED_DACL_SECURITY_INFORMATIONâ¼Üä`TAPE_DRIVE_ABS_BLK_IMMEDáäÜä"`ERROR_CLEANER_CARTRIDGE_SPENTÝä`tmDigitizedAspectXã$Ýä`MCI_WAVE_SET_ANYINPUT8Ýä `NextJobIdè`ODBC_BOTH_DSNpÝäatmDigitizedAspectYãŒÝäaDATATYPES_INFO_1W°ÝäaIOleCache_Uncache_ProxyâäÝä(aIXMLDOMNode_transformNodeToObject_ProxyâÞä!aIXMLDOMElement_getAttribute_Stubé+aURLACTION_INFODELIVERY_NO_EDITING_CHANNELSã`Þä b__open_modesáˆÞäbFILE_SUPPORTS_REPARSE_POINTSá´ÞäbPMIXERCONTROLDETAILS_LISTTEXTAãÜÞäbIOleObject_GetMoniker_StubëbImmConfigureIMEâ ßä coptimizeá(ßäcQS_POSTMESSAGEãLßäc__MIDL_DECLSPEC_DLLEXPORTdßä cFUNC_VIRTUALécSQL_FD_FETCH_PRIORã˜ßädSML_WBXML°ßä dTAPE_UNLOCKâÔßädERROR_CTX_WD_NOT_FOUNDãðßädDdeUnaccessDataêdCryptReleaseContextâ$àäecuseridâ4àäelog2lè eSQL_C_BINARYátàäfERROR_WMI_ALREADY_DISABLEDãˆàäfSB_HORZâ¬àäfNdrXmitOrRepAsBufferSizeéfGL_ID_CHOOSECANDIDATEèàägLookupAccountSidAáä gERROR_PATCH_PACKAGE_UNSUPPORTEDâ(áägDRAFTMODE@áä gLPFNDEVMODEâTáä gSS_BITMAPègCLSID_CCDGeneralPropertyPageá”áä hGetAtomNameAá¼áähIMallocSpy_PreDidAlloc_StubêhSQL_INTERVAL_SECONDâøáäiLPFONTSIGNATUREâ$âä iICreateTypeInfo_SetVarName_StubêiIXTLRuntime_uniqueID_Proxyã`âäjOF_CREATE|âäjREGCLS_SUSPENDEDéjCF_SCALABLEONLYâ¬âäkislowerêkwHourèlSmlCred_täâäm_NT_TIBâüâä mVK_HANGEULë mSQLSMALLINTâ@ãänRPC_X_SS_CHAR_TRANS_SHORT_FILEãXãä nMF_OWNERDRAWápãä nEM_LIMITTEXTá”ãänszOID_RSA_digestedDataën??_7ICreateErrorInfo@@6B@Èãä olog2fàãä ofOutxDsrFlowá ääoERROR_CLUSTER_NODE_UNREACHABLEë oFS_GREEKá@ääp_TAPE_GET_POSITIONãhää"pERROR_DS_COULDNT_CONTACT_FSMOˆääpCreateDIBPatternBrush¤ääpWM_CTLCOLOREDITâÔää%pCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFOáìää p_COAUTHINFOêpSQL_PT_PROCEDUREá$åäq_MSL_ANSI_PARMS_H4åä qstripTåäqRandomAccessIterator2dåäqxpã€åäqLookupAccountSidW åäqdwMaximumWindowSizeâ¼åäqPCRYPT_URL_INFOâØåäqAsyncIPipeDoubleé qIFillLockBytes_SetFillSize_Stubâ$æärRandomAccessIterator1Pæä!rMIXERLINE_COMPONENTTYPE_SRC_LASTátæärPRINTER_CHANGE_PRINTERërpullValâ æäsENUMPAPERBINS´æäspszFileâÐæäsAddPrintProvidorésPIDDSI_SLIDECOUNTüæä tNOWSMçätset_terminate@çätPMIXERCONTROLDETAILS_LISTTEXTWã\çätSEE_MASK_IDLISTâtçä tJOB_INFO_3ëtSQL_FN_NUM_ASINâ¨çä u_INC_WINDOWSáÄçäuEnumICMProfilesê uJOB_INFO_2ãèä"vACCESS_DENIED_OBJECT_ACE_TYPEèävCharToOem<èävPFN_CMSG_IMPORT_KEY_TRANSTèä vJOB_INFO_1ëvVARFLAG_FDEFAULTCOLLELEMá”èäwLPGLYPHMETRICSã¨èä wVK_SPACEáÌèäwPCERT_KEYGEN_REQUEST_INFOèèäwSCARD_READERSTATEéäwDATATYPES_INFO_1Aéä wSTDOLE2_LCIDé wSQL_AA_TRUEâLéäxgethostbyaddrhéäxSetBindOptionsë xCC_SYSCALLã˜éä yDRIVE_REMOTEá´éäyMK_E_NEEDGENERICáÔéäyPFD_GENERIC_FORMATëySC_MOVEâüéä zSetupCommèziFSGrafEffect0êä{smlStartSyncFuncáLêä{CONTEXT_E_ABORTEDlêä{PBT_APMRESUMESTANDBYá€êä {wMaxAxesá êä{szOID_CRL_DIST_POINTSè{szOID_NETSCAPE_BASE_URLâàêä|smlFreeItemListâëä|IMAGE_REL_ALPHA_GPRELLOâëä |LocalDiscardá8ëä|OpenInputDesktopáLëä|cMsgCrlê|FILE_DEVICE_WAVE_INâ”ëä}SML_ERR_XLT_INVALID_CODEPAGEá°ëä}PEMRSETBRUSHORGEXÐëä}CryptEnumProvidersãüëä }CryptFindCertificateKeyProvInfoê }TYMED$ìä ~GetAtomNameWé~DFCS_BUTTONPUSHâpìä#SCHED_E_UNSUPPORTED_ACCOUNT_OPTIONë%SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTEáÄìä€PARTITION_ENTRY_UNUSEDë€CHANGER_STORAGE_DRIVEüìä node_alloc_âíäPIMAGE_NT_HEADERS64â4íä dmPaperWidthé PFNCALLBACKâxíä ‚IMAGE_CE_RUNTIME_FUNCTION_ENTRYâ˜íä‚CO_E_INIT_CLASS_CACHE¸íä‚tagEMRSELECTCLIPPATHáÐíä‚GetDlgItemIntðíä‚MCI_RECORD_OVERWRITEé‚tagSQL_INTERVAL_STRUCTëƒMDM_PROTOCOL_V120_112KãLîä „LPPOINTSádîä „RemovePropAâ€îä„CTRL_CLOSE_EVENTá˜îä „SHGNLI_PIDLâ¸îä„PCTL_FIND_USAGE_PARAé„HaveWriteAccessâäîä…rendâïä…PCF_PARITY_CHECKá$ïä…CERT_STORE_PROV_SYSTEM_Wá@ïä…PRINTER_INFO_7Wê…SQL_SP_UNIQUExïä†SCARD_E_NO_SERVICEã¨ïä#†FindFirstPrinterChangeNotificationë†ILockBytes_LockRegion_Proxyâôïä‡_CERT_KEYGEN_REQUEST_INFOè‡CERT_COMPARE_ISSUER_OFã4ðäˆiFSGrafEffectMSecLðä ˆKP_PADDINGãlðäˆEncryptedPrivateKeyêˆdwDevSpecificSize¸ðä$‰JOBOBJECT_ASSOCIATE_COMPLETION_PORTâÜðä‰WINSTA_ACCESSCLIPBOARDãüðä‰VS_FFI_FILEFLAGSMASKé‰LPCANCELMETHODCALLSâ@ñäŠERROR_SHARING_VIOLATIONêŠmixerGetControlDetailsAâxñä‹make_heap¤ñä‹IMAGE_WEAK_EXTERN_SEARCH_ALIASãÀñä‹GetFileSecurityWáàñä‹dmDisplayFrequencyãüñä‹ExcludeClipRectâòä‹ENUM_SERVICE_STATUSAé‹SQL_SCROLL_KEYSET_DRIVENá\òäŒWSA_QOS_BAD_STYLEèŒgmfptGlyphOrigináòä __msl_alnumâ òä PUINTÀòäSetDefaultCommConfigAèCryptUnregisterOIDInfoäóäŽGetModuleHandleAáóä ŽbV4GammaBlueé ŽpShareNameãHóä _MSL_STDIO_Háhóä_SINGLE_LIST_ENTRYãˆóäIMAGE_SCN_SCALE_INDEX¤óäCRYPT_FORMAT_X509èNdrFixedArrayBufferSizeâäóäVOS_OS216_PM16ãôä@class$7760sysytool___pchèMDM_AUTO_ML_NONEé‘SPI_SETKEYBOARDPREFâ`ôä’THREAD_ALL_ACCESS€ôä’PEMREXTSELECTCLIPRGNá˜ôä ’RemovePropWê’lpstrInitialDirâÔôä“_SYS_GUID_OPERATORS_áìôä“PURGE_TXCLEARõä “GW_HWNDPREVâ(õä“CERT_STORE_PROV_SYSTEM_AáDõä“PRINTER_INFO_7Aê“__IPropertyBag_FWD_DEFINED__áŒõä”CloseWindowStationë”SQL_SNVF_BIT_LENGTHâÌõä•CRYPT_E_BAD_ENCODEãàõä•DS_CENTERðõä•UUIDâöä •n_netöä•dwNameLen8öä•PSM_GETCURRENTPAGEHWNDë$•IRunningObjectTable_IsRunning_ProxyâŒöä–ERROR_CTX_SHADOW_DISABLED¨öä–SPI_SETDRAGWIDTHá¼öä –ABL_5_WOé–VarR8FromBoolìöä —aPolyCountsâ÷ä—SCARD_ATTR_CURRENT_CLKë—dwTagIdâL÷ä˜THREAD_BASE_PRIORITY_LOWRTãl÷ä˜FILE_ATTRIBUTE_DEVICEˆ÷ä˜GetModuleHandleWá¬÷ä˜@class$7720sysytool___pchØ÷ä˜_CMSG_KEY_TRANS_RECIPIENT_INFOãøä%˜__MIDL_itf_urlmon_0184_v0_0_s_ifspecé%˜__MIDL_itf_urlmon_0186_v0_0_c_ifspecáTøä™ERROR_FAIL_I24ãxøä™tagEMRSETVIEWPORTEXTEXã¤øä™PCMSG_KEY_AGREE_RECIPIENT_INFOãÄøä™JOB_ACCESS_ADMINISTERôøä%™__IHttpNegotiate_INTERFACE_DEFINED__é™dwTemplateMinLevelã8ùäšPROCESSOR_HITACHI_SH3EãXùäšALG_CLASS_SIGNATUREâtùäšCRYPT_NEWKEYSETâùäš_REASSIGN_BLOCKSé1šIForegroundTransfer_AllowForegroundTransfer_Stubáìùä›SetDefaultCommConfigWúä›CDS_SET_PRIMARYê ›IID_IOInetã<úäœLGRPID_CYRILLICâ`úäœmixerGetControlDetailsWâtúä œPSN_HELPáˆúäœDISPIDãÀúä,œIXMLDOMProcessingInstruction_get_data_ProxyêœSFLOATãìúä LANG_ITALIANáûäGetFileSecurityAá$ûäSCARD_E_NO_ACCESSDûäDMPAPER_TABLOID_EXTRAXûä MMRESULTá€ûä_FULL_PTR_TO_REFID_ELEMENTã¤ûäQUERY_IS_CACHED_OR_MAPPED¼ûäOLEIVERB_HIDEèENUM_SERVICE_STATUSWáðûä žmultimapáüäžERROR_DIR_NOT_EMPTYâ0üäžPDERR_SETUPFAILUREãdüä)žCRYPT_OID_USE_PUBKEY_PARA_FOR_PKCS7_FLAGáŒüäžIOleObject_SetHostNames_Stubá üäžWordStrê žgrfBindInfoFáÜüäŸFSCTL_MARK_AS_SYSTEM_HIVEèŸSQLInstallerError$ýä! _IMAGE_CE_RUNTIME_FUNCTION_ENTRYáPýä  ERROR_DS_CANT_RETRIEVE_INSTANCEâlýä WGL_SWAP_OVERLAY7ˆýä WS_EX_APPWINDOWâœýä CP_ACPã´ýä  CTRY_MEXICOâÔýä ALG_SID_PCT1_MASTERâðýä NTFS_STATISTICSâ þä _ADDJOB_INFO_1Wê% JOB_NOTIFY_FIELD_SECURITY_DESCRIPTORáXþä¡WGL_SWAP_OVERLAY6xþä¡szOID_CRL_REASON_CODEè¡SERVICE_ENUMERATE_DEPENDENTSá¼þä¢WGL_SWAP_OVERLAY5èþä ¢IXMLDocument2_get_mimeType_Stubê¢GL_ID_NOCONVERTâ ÿä£SetFileSecurityWá<ÿä£WGL_SWAP_OVERLAY4`ÿä£RegQueryMultipleValuesAâ|ÿä£JOYERR_NOERRORë£RPC_AUTH_KEY_RETRIEVAL_FNÄÿä¤IMAGE_SCN_ALIGN_16BYTESâàÿä¤WGL_SWAP_OVERLAY3è¤WM_COPYâ ä ¥__num_bitsã(ä¥WGL_SWAP_OVERLAY2Hä¥RPCFLG_AUTO_COMPLETEáXä¥sendáxä¥szOID_OIWSEC_desMACâ˜ä¥CERT_STORE_ADD_NEWERá´ä¥PartitionEntryãÔä¥IID_IPersistStorageê¥IMN_SETCANDIDATEPOSê¦WGL_SWAP_OVERLAY1$ä§NewInstâ<ä §OSS_TOO_LONGálä*§CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC„ä§OPENCARDNAMEWè§PIDDSI_NOTECOUNTá¼ä¨SCODE_SEVERITYãàä¨SPI_SETICONTITLELOGFONTâðä ¨chx11 ä¨PMCI_LOAD_PARMSWé¨_cchBufâ0ä ©chx10Lä©JOY_CAL_READVONLYè#©__ISynchronizeHandle_FWD_DEFINED__ãäªCIEXYZã äªchx13èªGetOpenCardNameAáÔä «R2_NOTXORPENáìä «SetWindowPosáüä «chx12 ä«CERT_STORE_SIGNATURE_FLAG8ä«nMaxFileTitleè«CommDlg_OpenSave_HideControlá|ä¬__inplace_mergeâŒä¬chx15è¬CHANGER_REPORT_IEPORT_STATEâØä­_TIME_ZONE_INFORMATIONãìä ­DT_CENTERè ­chx14ä®WGL_SWAP_OVERLAY9è®IMoniker_ComposeWith_StubXä¯WGL_SWAP_OVERLAY8hä ¯chx16ˆä¯LPSCARD_T0_REQUESTë¯szHREFã´ä°smlLibMemmoveÔä°SW_SHOWMINNOACTIVEãüä°NdrConformantArrayMemorySizeé°VarBoolFromDecã,ä±strnsetâDä ±result_firstá\ä ±CWPRETSTRUCTé±OPENCARDNAMEAä²NPWAVEFORMATEXã¨ä ²MCI_ESCAPEãÔä ²PCRYPT_DECRYPT_PRIVATE_KEY_FUNCâøä²__IMoniker_FWD_DEFINED__áä ²_xml_errorë²SQL_BP_TRANSACTIONã@ä³PEMRáxä,³IXMLDOMProcessingInstruction_put_data_Proxyê³??_7ICodeInstall@@6B@¬ä ´_getegidáÄä ´__io_resultsáðä ´IXMLDOMNode_put_nodeValue_Proxyâä!´IXMLElement2_get_attributes_Stubá8ä´SQL_ACCESS_MODEê´SQL_NOT_DEFERRABLEãläµCondition€äµnot_eofâœäµSetFileSecurityAá¸äµBS_DIBPATTERN8X8áÔäµSW_SHOWNOACTIVATEèµRegQueryMultipleValuesWâä ¶DRIVE_CDROMâ,ä¶STG_E_INCOMPLETEáHä¶LPWAVEFORMATEXãpä¶CERT_STORE_SAVE_TO_FILENAMEâ„ä ¶MediaTypeè¶_ADDJOB_INFO_1AâÈä·??_Ebad_typeid@std@@UAE@I@Zâðä"·ERROR_DS_NAME_ERROR_RESOLVING ä·SCARD_E_INSUFFICIENT_BUFFERâ, ä ·dwExStyleè·CERT_ID_SHA1_HASHl ä¸STATUS_FLOAT_UNDERFLOWã˜ ä ¸ERROR_UNABLE_TO_REMOVE_REPLACEDê¸HSHELL_GETMINRECTØ ä¹SmlDevInfCTDataPropPtr_táü ä¹_CERT_FORTEZZA_DATA_PROPá ä ¹ReuseBufferâ0 ä¹STORAGE_BUS_TYPEáH ä¹SQLFreeHandleè¹SQL_FN_NUM_ACOS†äºTAPE_STATISTICSêºSQLGetDiagFieldê»LPDLGTEMPLATEð ä/¼IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWAREã ä¼IMAGE_TLS_DIRECTORY640 ä¼SWP_NOSENDCHANGINGã` ä%¼CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNEDé¼GetOpenCardNameWᘠä½char_coll_seq_ptr¼ ä½ERROR_COLORSPACE_MISMATCHè ½IMallocSpy_PreHeapMinimize_Stubâ ä¾ARRAYFIELD_SUPPORTã, ä¾IMAGE_REL_SH3_DIRECT32_NBH ä¾PMCI_LOAD_PARMSAá` ä ¾CC_FASTCALL∠ä¾IInternetProtocol_Seek_Stubê¾GetHGlobalFromStreamá¼ ä¿tree_typeÔ ä ¿iLayerPlaneê¿CFSTR_MIME_MPEGâ äÀCreateWindowExã$ ä ÀpszUsernameâL ä"ÀI_RpcServerUnregisterEndpointh äÀISynchronizeEventèÀlpszStyle˜ äÁUnmapViewOfFileâÀ äÁERROR_FILENAME_EXCED_RANGEãð ä#ÁERROR_DS_INVALID_LDAP_DISPLAY_NAMEãäÁPF_OSIë ÁLogFileReadsáDäÂIMAGE_SYM_CLASS_END_OF_STRUCTèÂSetMailslotInfoâxä Ã__mips_bareâœäÃIMAGE_DIRECTORY_ENTRY_IAT´ä ÃCTRY_KUWAITâØäÃNdrInterfacePointerFreeâä#ÃCHANGER_PREDISMOUNT_EJECT_REQUIREDã<ä)Ã__IRpcChannelBuffer3_INTERFACE_DEFINED__é ÃlpLockOwnerâhäÄPSIZELãˆäÄCB_SETDROPPEDWIDTHëÄSQL_SRJO_UNION_JOINâ¸äÅquotáàä"ÅERROR_INSTALL_TEMP_UNWRITABLEäÅCONVERT10_E_OLESTREAM_GETä ÅSND_RESOURCEá8äÅPRINTER_INFO_5WêÅPUAF_CHECK_TIFSâläÆRtlFillMemory„ä ÆVK_SEPARATORá¬äÆIOleInPlaceSite_Scroll_ProxyéÆSQLInstallDriverExãää Çround_styleãäÇSubAuthorityCount4ä(ÇERROR_FAILED_SERVICE_CONTROLLER_CONNECTâ`äÇ__IBindCtx_INTERFACE_DEFINED__ë#Ç__IViewObject2_INTERFACE_DEFINED__ã¨äÈSML_PE_SEARCHÀä ÈReportEventêÈXMLDSOControlðä ÉdwMaxTxQueueáäÉUSERCLASSTYPEèÉSQL_STATIC_SENSITIVITYãHäÊ_IMAGE_VXD_HEADERläÊOLE_E_NOT_INPLACEACTIVEâŒäÊSTG_E_INVALIDFUNCTION¤äÊDT_RASPRINTER¸ä ÊEN_UPDATEè ÊVariantCopyâðäËRpcServerTestCancelêËCLSIDFromStringâ$ä ÌdmPositionë ÌIDataAdviseHolder_Unadvise_StubâtäÍTAPE_DRIVE_ERASE_BOP_ONLYäÍObjectNameTitleêÍCryptQueryObjectáÄäÎSUBLANG_DUTCHÜä ÎVK_OEM_CUSELéÎISynchronize_Wait_Stubã(äÏPIMAGE_SEPARATE_DEBUG_HEADERá@äÏBLENDFUNCTIONèÏQUERYROPSUPPORTâxäÐSORTIDFROMLCIDã˜äÐ_TAPE_SET_POSITIONã¨äÐdummyèÐ@class$7761sysytool___pchää ÑLockSegmentê ÑTC_CP_STROKEáä ÒcrBkColorSrcé%ÒIXMLDOMDocument_get_readyState_ProxyáXäÓGetKValuetäÓSM_MIDEASTENABLED”äÓCRYPT_USER_PROTECTEDá°äÓPRINTER_INFO_5Aâää)Ó__IRpcChannelBuffer2_INTERFACE_DEFINED__éÓSQL_KEYSET_SIZEê ÔpbstrValá(äÕungetwcâ@äÕRtlZeroMemoryXäÕwSettableDataxäÕGetHandleInformationá äÕGetSecurityDescriptorOwnerã¸äÕRpcTestCancelÜäÕIStorage_SetClass_StubëÕintValãä Ö_STDEXCEPTãäÖ_tagá4äÖerror_status_tëÖFMTID_DiscardableInformationápä×__neutral„ä×getenvã ä×MM_STREAM_ERRORê×SQL_FN_TD_NOWÔäØERROR_BAD_PIPEãðäØEMREXTFLOODFILLâäØ@class$7721sysytool___pchDä%Ø__MIDL_itf_urlmon_0185_v0_0_s_ifspecátä%Ø__MIDL_itf_urlmon_0187_v0_0_c_ifspecéØCF_SELECTSCRIPTâ äÙ_MAPá´äÙXPTAPIëÙWINSTAENUMPROCãìäÚIMAGE_RELOCATIONáä ÚERROR_DEVICE_ALREADY_REMEMBEREDâ4äÚszOID_RSA_SHA1RSALä ÚVT_SAFEARRAYéÚIWinInetInfo_QueryOption_Proxyã˜äÛERROR_ACCESS_DENIEDâÀäÛERROR_DS_SUB_CLS_TEST_FAILãÔä ÛptlPixeláüäÛszOID_KEY_USAGE_RESTRICTIONâ$äÛCMSG_KEY_TRANS_CMS_VERSIONã<ä Û_midl_addpëÛ??_7IPropertySetStorage@@6B@áxä ÜwistreamáœäÜ__SML_WBXML_TEXTTOKENS__á°äÜLong_tãÐäÜSEC_E_CANNOT_INSTALLéÜCRYPT_CREDENTIALSäÝset_differenceã$äÝWM_STYLECHANGINGá<ä ÝWS_MINIMIZEêÝVerInstallFileãpä ÞResetEventãˆä ÞCreatePipeëÞSQL_UNSEARCHABLEáÄäßSetHandleInformationéßCHANGEKIND_INVALIDATEøä àSEC_E_OKéàIXMLDocument_get_root_Stubã4äá_ultoaãPäáMUTANT_ALL_ACCESS|ä áIMAGE_SUBSYSTEM_EFI_APPLICATIONâ¤äáDNS_ERROR_ZONE_ALREADY_EXISTSèáIS_INTRESOURCEãÔäâstringbufôäâ_JOBOBJECTINFOCLASSâä âtmItalicá$äâSWP_FRAMECHANGEDá8äâDDE_FBUSYdä âCryptVerifyCertificateSignatureêâIStorage_Commit_ProxyèãSPAPI_E_NO_DEVICE_SELECTEDãÈääExtendedRegistersìäätagMCI_OVLY_LOAD_PARMSAêäSQLMoreResultsã ä åPAGE_EXECUTEá8ä åMAXINTATOMãXäåMCI_VD_GETDEVCAPS_CLVläåMP_8mmãˆäåPRINTER_INFO_4WêåAddPrinterConnectionAÄäæ?$is_void_imp@Xê æBaseOfCodeãðäçSCHAR_MINäçSB_LINEUPä çFILEOPENORDê*çIXMLHttpRequest_get_responseXML_Proxydä è_MSL_CMATHãxäèRDW_ERASE˜äèHKEY_CURRENT_CONFIGâ¼äè_RPC_NOTIFICATION_TYPESâðä'èPCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARAã äèFILE_DEVICE_MIDI_INâ8 äèFMTID_UserDefinedPropertiesêèGL_LEVEL_NOGUIDELINEá¼ äXé?$__wrap_iterator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PB$$CBDâØ äéMETA_CREATEREGIONô äéEMR_SETMAPMODEã!äétagMCI_LOAD_PARMSWã(!ä épwcsNameáD!äéREGKIND_REGISTERééMOD_IGNORE_ALL_MODIFIERâ€!äêQDI_GETDIBITS˜!ä êTC_SCROLLBLTá°!ä êCTRY_BELIZEêêLOCALE_ENUMPROCWáä!ä ëWriteFileExã"äëWNNC_NET_MSNETã "äëIOCTL_STORAGE_BASEã8"äëAddConnectionT"äëPropVariantCopyê ëCF_NOSIZESELá„"ä ìlcsFilenameâœ"ä ìSO_RCVLOWATêìszOID_OIWSEC_desECBâÔ"ä í_MSL_CTIMEãô"äíVerifyVersionInfoWã#äíwMidá(#äíRpcMgmtIsServerListeningáH#äíIsHashValCompatibleê íSC_HANDLE__â|#äîsmlAllocDeleteãœ#äîGDICOMMENT_BEGINGROUPè îEnumPortsWãÈ#ä ï_execlpeáà#ä ïNPPOLYTEXTWê ïMFS_ENABLEDâ $äðlpDataã8$äðIEnumFORMATETC_RemoteNext_StubãH$äðDummyè ðTKIND_RECORDá€$äñIMPORT_OBJECT_ORDINALœ$äñERROR_PRINTQ_FULL´$ä ñMIM_LONGDATAáÌ$äñMCI_MAKE_TMSFèñMCI_ANIM_OPEN_PARMSâü$äòlessá%äòsmlFreeGetPut<%äòIMAGE_ARCHIVE_MEMBER_HEADERâ`%äòtagMCI_OVLY_LOAD_PARMSWêòFLAG_STGMEDIUM_UserUnmarshalá¨%äó_MSL_UNISTD_WIN32_HâÄ%äóPMCI_STATUS_PARMSè%äó_CMSG_SIGNED_ENCODE_INFOá&äóPRINTER_INFO_4Aâ$&äóAddPrinterConnectionWH&äóPSD_INTHOUSANDTHSOFINCHESèóSQL_HANDLE_SENVê ôEXPENTRYáŒ&äõselectã¤&ä õSTDMETHODIMPáÌ&äõSE_PRIVILEGE_USED_FOR_ACCESSáä&ä õHP_HASHVALä'äõCLSID_CCDLabelã'äõDeleteTypeInfoã8'äõCDN_INCLUDEITEMâL'äõintvalëõSQL_MAX_LENGTH_DEFAULTã 'ä%öERROR_DS_CANT_FIND_DC_FOR_SRC_DOMAINáÈ'äöCHANGER_SERIAL_NUMBER_VALIDê öPIDSI_AUTHORáô'ä÷_ultowã(ä÷_MSL_WSTRING_Hã8(ä"÷ERROR_DS_DRA_INCONSISTENT_DITT(ä÷ReleaseCaptureãt(ä÷X509_DSS_PARAMETERSâˆ(ä ÷MOD_LEFTé÷SQL_FD_FETCH_LASTÀ(äøPDRAWITEMSTRUCTâÜ(äørgCmsRecipientsâô(äøpTransmitTypeè øEnumPortsAã )äùlcsCSTypeD)äùPAN_MIDLINE_HIGH_SERIFEDá\)ä ùNPPOLYTEXTAât)äùANIMATIONINFO¤)ä&ùIInternetBindInfo_GetBindString_Proxyè ùVarCyFromDecáà)äúIMAGE_REL_ALPHA_GPRELHIã*äúSEC_E_ILLEGAL_MESSAGE*äúMAKEINTRESOURCEâ<*äúRpcServerUseProtseqIf\*äúCRYPT_OID_FUNC_ENTRYéúpUnká€*äûODDPARITY *äûVerifyVersionInfoAëûSTYLE_DESCRIPTION_SIZEãØ*ä üset_colorá+ä"üsml_source_or_target_parent_s+äüPFLOATã0+äüLOCALE_ENUMPROCAá\+ä"üAsyncIPipeDouble_Begin_Push_ProxyèüSOFTDIST_FLAG_USAGE_EMAIL˜+ä þSmlSource_tâÀ+äþERROR_DS_CROSS_DOM_MOVE_ERRORèþVP_TV_STANDARD_NTSC_433â,äÿtagMCI_LOAD_PARMSAã$,äÿCERT_NAME_RDN_TYPEëÿtagSTREAM_SEEKãP,å @7202p,åERROR_NO_USER_KEYSãˆ,å HTSIZEFIRSTâ¬,åMDM_PROTOCOL_V110_57DOT6Ké%SQL_SQL92_FOREIGN_KEY_UPDATE_RULEè,ä@7203á-ä EV_RX80FULLâ -äOpenEncryptedFileRawAèPEMRSTRETCHBLTãL-ä @7200l-äCS_E_NO_CLASSSTOREãŒ-äPERF_DETAIL_WIZARDã´-ä"BINDINFO_OPTIONS_BINDTOOBJECTÔ-äBINDSTRING_PASSWORDâø-äSQL_ATTR_ENABLE_AUTO_IPDé SQL_BP_DROPâ .ä @7201H.äPIMAGE_BOUND_FORWARDER_REFã\.äWIZ_CYDLGœ.ä6IGlobalInterfaceTable_RevokeInterfaceFromGlobal_ProxyèSQL_ATTR_CURSOR_TYPEáÌ.ä @7206ô.äEXCEPTION_CONTINUE_EXECUTIONá$/ä*PJOBOBJECT_EXTENDED_LIMIT_INFORMATION4/ä hIconX/äCRYPT_LAST_OID_GROUP_IDêCMSG_CMS_RECIPIENT_COUNT_PARAMã”/ä @7207¬/ä ReleaseMutexáÄ/ätagTOGGLEKEYSè/äRpcNetworkIsProtseqValidAèIXMLDOMNode_get_prefix_Proxyá$0ä wmemmoveá40ä @7204L0äDOF_SHELLDATA\0äIfIdáŒ0ä$CERT_CHAIN_POLICY_BASIC_CONSTRAINTSâ¸0ä IXMLElementCollection_item_StubâÐ0äVarUI1FromStrèSQL_ATTR_LOGIN_TIMEOUTã1ä @72051ä SmlGet_tá@1ä"JOB_OBJECT_LIMIT_BREAKAWAY_OKd1äPPRINTPROCESSOR_INFO_1ë ReadPrinterâ¤1äERROR_FLOPPY_UNKNOWN_ERRORã¼1äBS_AUTO3STATEÔ1ä iMenuHeightã2ä __IContinue_INTERFACE_DEFINED__êPIDMSI_PRODUCTION@2ä smlFreeDevInfFilterCapãX2ä SidTypeDomaint2ä CO_E_SCM_ERRORãŒ2ä MIDIMAPPERã¨2ä _CERT_RDN_ATTRë PI_DATAPROGRESSâÔ2ä @7208ô2ä tagUSEROBJECTFLAGSë DD_DEFSCROLLINSET 3ä @7209<3ä POSVERSIONINFOEXA\3ä _PALETTEENTRY_DEFINEDp3ä HOOKPROCáŒ3ä szOID_LICENSESã 3ä cAltEntry´3ä parrayë SQL_SG_UPDATE_COLUMNé ILockBytes_SetSize_Proxyá4ä STG_E_INUSEâ,4ä NTE_BAD_SIGNATUREL4ä CLIP_STROKE_PRECISãl4ä MIXER_OBJECTF_MIDIINá”4ä MCIERR_DEVICE_NOT_INSTALLEDâ¼4ä CRYPT_FORMAT_RDN_SEMICOLONãì4ä$ CERT_ALT_NAME_VALUE_ERR_INDEX_SHIFTâ5ä CERT_STORE_PROV_COLLECTIONã45ä USAGE_MATCH_TYPE_ANDáX5ä IPersist_GetClassID_Stubáp5ä szCustomVerbé SQL_AT_ADD_COLUMN_COLLATIONâ¬5ä CBS_SORTáÄ5ä midiInStartâä5äPSM_SETHEADERSUBTITLEèImmGetDescriptionAã(6äsmlAllocDevInfXmitListã<6äPASCALãX6äPTOKEN_PRIVILEGESp6ä SIOCSLOWATãˆ6ä NO_PRIORITYâ¨6ä??_7ICallFactory@@6B@è6ä4IOleInPlaceActiveObject_OnFrameWindowActivate_Proxyê2IXMLDOMProcessingInstruction_get_target_Proxy47ä @no_name@èSTG_E_INVALIDHEADERâx7äOSS_CANT_OPEN_TRACE_FILEáœ7äHSHELL_WINDOWACTIVATEDã°7ädwCPKeyâÔ7äPROPSHEETPAGEA_V1_SIZEë SQL_DOUBLEã8ä _MSL_CSTDLIBá(8äWin32ServiceOwnProcessã@8ä iVertSpacingáX8äMCI_OVLY_RECTt8äCERT_DSS_R_LENë#NETSCAPE_SSL_CLIENT_AUTH_CERT_TYPEã¼8äNEWTEXTMETRICÔ8ä MM_LOMETRICâø8äRESOURCEDISPLAYTYPE_ROOTá9ä_NETCONNECTINFOSTRUCT09ä MMIOM_SEEKëRpcNetworkIsProtseqValidWx9äRpcNsEntryObjectInqBeginé(IOleInPlaceSite_DeactivateAndUndo_Proxyâ¼9äend_áØ9äERROR_PATH_BUSYâ :ä'ERROR_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBERã$:ä GetRandomRgnáH:äwglGetLayerPaletteEntriesèVIDEOPARAMETERSâ|:ä dSignatureã:äIsEqualâ¨:ä PENDINGMSGë tagOLEUPDATEáÔ:äCONTEXTâð:äSTD_ERROR_HANDLEá;äOpenEncryptedFileRawW,;äNRC_OSRESNOTAVãH;äPCERT_RDN_ATTRãp;äCERT_KEY_IDENTIFIER_PROP_IDâŒ;äLPSTDMARSHALINFOá¸;ä!IStorage_RemoteEnumElements_Stubé IOleLink_GetSourceMoniker_Proxyâø;ä spawnlpeá$<ä!SPAPI_E_DEVICE_INTERFACE_REMOVEDá<<ä WM_DROPFILESéImmGetDescriptionWã|<äIMAGE_SYM_TYPE_VOIDâ˜<äReportSetmarksã¬<äPC_NONEê IXMLDOMDocument_get_async_Proxyâè<äPCHêINET_E_USE_DEFAULT_SETTINGã@=ä#IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRYãX=äLockSemaphoret=äRecognizerTypeã=äIDHOT_SNAPDESKTOPè.URLACTION_INFODELIVERY_NO_CHANNEL_LOGGINGØ=ä_SW_TOPâü=äAccessCheckAndAuditAlarmá>ä dwReserved2êPRINTER_CONTROL_PURGEP>äPOSVERSIONINFOEXW|>ä CRYPT_OID_ENCODE_OBJECT_EX_FUNCêSQL_SNVF_OCTET_LENGTH¬>äinitáÌ>äJOB_OBJECT_TERMINATEáä>ä ExitProcessâü>ä dwReserved0â?äLC_NONEâ0?äPRPC_PROTSEQ_ENDPOINTH?äVarUI2FromStrèSQL_NULLABLE_UNKNOWNá„?ä_REFCOUNTEDPTR_Há˜?äPrivilege°?ä dwReserved1âÈ?ätagSERVERCALLèBINDF_PULLDATAãô?ä @7212@ä S_SERDVLá$@ä tagLOGCOLORSPACEA@@ä LPCDLGTEMPLATEã\@ä CONNDLG_USE_MRUâl@ä stc12@ä CryptFlushTimeValidObjectÄ@ä( IBindStatusCallback_OnStartBinding_Stubê CF_SCREENFONTSãð@ä !@7213Aä!TYPE_E_INVALIDSTATEâ Aä !stc13HAä!PRINTER_STATUS_PAPER_PROBLEMálAä!MDM_PROTOCOL_V110_14DOT4Kè!SQL_UNSPECIFIEDâ˜Aä "@7210¸Aä"SUBLANG_ENGLISH_AUSâÜAä"BSF_NOTIMEOUTIFNOTHUNGãìAä "stc10Bä$"PERF_COUNTER_OBJ_TIME_QUEUELEN_TYPEâ4Bä "wireHPALETTEé "VarUI4FromR4á\Bä #@7211lBä #stc11Bä#LPMCI_VD_ESCAPE_PARMSAãÀBä%#NdrConformantVaryingStructMemorySizeáÔBä #WIZ_CXDLGè #DEVNAMESáüBä$lroundfâ Cä $@7216Cä $stc160Cä$__RPC_FAR\Cä&$RPC_CONTEXT_HANDLE_DONT_SERIALIZExCä$RCRYPT_SUCCEEDEDá”Cä$FINDMSGSTRINGAë$SQLGetDiagRecÈCä%max_exponent10ãØCä%@7217áDä"%CACHE_S_SOMECACHES_NOTUPDATED Dä%META_OFFSETCLIPRGNã8Dä%otmMacLineGapHDä %stc17dDä%_midl_unmarsh_upáŒDä%IXMLElement2_get_type_Stubë%IME_CONFIG_REGISTERWORDâÀDä &@7214ØDä&FACILITY_NULLüDä&TYPE_E_CANTLOADLIBRARYã Eä &stc144Eä&CRYPTPROTECT_PROMPT_RESERVEDáPEä&NdrSH_UPDecisioná`Eä&Startè &PSBTN_BACKãˆEä '@7215œEä'scBaseã°Eä 'nVirtKeyáÀEä 'stc15ØEä 'KP_ADMIN_PINáFä&'IHttpSecurity_OnSecurityProblem_Proxyè'SQL_CT_COLUMN_DEFAULTisequalâìOä >LowId Pä>LBS_OWNERDRAWFIXEDã4Pä>CRYPT_ALGORITHM_IDENTIFIERãHPä>_CERT_RDNdPä>USER_MARSHAL_CBê>SQL_BP_DELETE”Pä ?SYSTEM_INFOâ´Pä?GetForegroundWindowâÐPä?dwControlKeyStateüPä!?CertAddCertificateContextToStoreáQä???_7IAdviseSink2@@6B@è ?extras.háDQä@bufferãTQä @@7222„Qä%@ERROR_CLUSTER_NETINTERFACE_NOT_FOUNDá”Qä@stc22è @SQL_CVT_REALá¼Qä A@7223èQäAIMAGE_FILE_LOCAL_SYMS_STRIPPEDãøQäAstc23èASQLSetDescFieldWá$Rä B@72204RäBstc20è"BIPropertyBag_RemoteRead_ProxylRä C@7221€RäCVK_LEFTâRä Cstc21´RäC_PERF_INSTANCE_DEFINITIONÌRä CTailLengthëCSQL_FETCH_FIRSTâSäDLPCREATE_THREAD_DEBUG_INFOã4SäDERROR_BAD_DRIVER_LEVELãDSä Dstc26XSäDCRYPT_MAC„Sä&DPCMSG_CTRL_KEY_TRANS_DECRYPT_PARA¸Sä(DIXMLDOMCharacterData_substringData_StubâÔSäDPIDDSI_DOCPARTSêDVarBoolFromCyüSä Estc27 TäEIXMLDOMNode_get_xml_ProxyèEtagOFNAâDTä Fstc24`TäFCryptMsgDuplicateèFSQL_FN_TSI_FRAC_SECONDã TäGWN_BAD_DEV_TYPEâ°Tä Gstc25ÌTäGPAGESETUPDLGORDãUä*G__IOleInPlaceUIWindow_INTERFACE_DEFINED__èGIHttpNegotiate_OnResponse_StubãPUäHERROR_ILL_FORMED_PASSWORDxUäHIID_IXMLDOMEntityReferenceë HLPOFNOTIFYAâ¤UäItraitsã¼UäISS_BLACKFRAMEèII_RpcServerUnregisterEndpointAãVäJ_MEMORYSTATUSEXâVä Jstc28@VäJszOID_AUTHORITY_KEY_IDENTIFIERë&JIRpcChannelBuffer3_GetState_ProxyˆVäKPUSEROBJECTFLAGSáœVäKVFT_VXDâ¬Vä Kstc29ØVä"K_CMSG_CTRL_KEY_TRANS_DECRYPT_PARAèKSQLRemoveDSNFromIniWáWäMLongá4Wä MCERT_INFO_ISSUER_UNIQUE_ID_FLAGê%MCMSG_ENVELOPED_DATA_PKCS_1_5_VERSIONátWä Nchild”WäNsml_metinf_anchor_sâ¤Wä N_LUIDÀWäNJOY_RETURNPOVCTSáØWä NPARRAY_INFOâøWäNOLEMISC_SIMPLEFRAMEâXäNIMC_CLOSESTATUSWINDOWè NSQLDriversAâLXäO_MSL_C_VERSION_HátXä"OERROR_SERVICE_DATABASE_LOCKEDŒXäOFS_VIETNAMESE¬XäORPC_S_OUT_OF_MEMORYâÀXä OPlatformáÔXä OIMarshaléOcapropvar YäPCERT_CHAIN_POLICY_STATUSá,YäPMSHLFLAGS_RESERVED1â\Yä$P__MIDL_itf_oaidl_0000_v0_0_c_ifspecê$P__MIDL_itf_oaidl_0103_v0_0_s_ifspecâ¬YäQSTG_E_PATHNOTFOUNDãÔYä"QNdrConformantStructUnmarshallèYäQUntilTimeZäQAdvancedDocumentPropertiesã(Zä QPreDidAllocâ@ZäQOnStopBindingè QIID_StdOleã|ZäRSCARD_E_COMM_DATA_LOSTã˜ZäREMR_STRETCHDIBITS°Zä REMRINVERTRGNáÜZä!RCMSG_MAIL_LIST_HANDLE_KEY_CHOICEáüZäRMSHLFLAGS_RESERVED3â0[ä'RIOleInPlaceSite_OnInPlaceActivate_Stubë%RICreateTypeLib_SetHelpFileName_Proxyáˆ[äSCRYPT_E_UNEXPECTED_ENCODINGâ¤[äSiSmCaptionHeightáÄ[äSMCI_SEQ_DIV_SMPTE_30áÜ[äSpbContextInfoü[äSMSHLFLAGS_RESERVED2â,\ä&S__ICreateTypeLib2_INTERFACE_DEFINED__èStagOFNWâ\\äTlpConnectionNameát\ä TJOY_RETURNZêTJOY_RETURNRAWDATA¬\äUsmlAllocReplaceâÐ\äUThisPeriodTotalKernelTimeì\äUCreateMetaFileã ]äUIsDlgButtonCheckedã<]ä*UMIXERLINE_COMPONENTTYPE_SRC_TELEPHONEP]ä UXlatTableèUMSHLFLAGS_RESERVED4âŒ]äVne_psegrefbytesâ¤]ä VGetMenuStateá¼]ä VJOY_RETURNXâì]ä%VCERT_TRUST_REVOCATION_STATUS_UNKNOWNâ^äVIStreamê Vfmtid$^äW_cwaitãD^äWtagEMRSETARCDIRECTION\^ä WJOY_RETURNYê WIPPROTO_RAWâŒ^ä XEMRSETPIXELVá¤^ä XJOY_RETURNVâÀ^äXX509_KEY_USAGEë XSQLDriversWâø^äYSUBLANG_FRENCH_MONACOèYMK_S_REDUCED_TO_SELFá<_äZ_MSL_NO_REFCOUNT_STRINGâd_äZMCI_GETDEVCAPS_DEVICE_TYPEë.ZIOleInPlaceObject_InPlaceDeactivate_ProxyÄ_ä&[IS_TEXT_UNICODE_REVERSE_SIGNATUREà_ä[SCARD_P_SHUTDOWNáø_ä [JOY_RETURNUê[SQL_PARAM_INPUTâ<`ä\ERROR_DS_CANT_FIND_DSA_OBJãP`ä\MWT_MINâh`ä \JOY_RETURNRê\SERVICE_CONTROL_PAUSE¸`ä#]DNS_ERROR_ZONE_CONFIGURATION_ERRORãÐ`ä ]CB_LIMITTEXTáô`ä]CRYPT_RC2_64BIT_VERSIONâaä ]pvFindArgè ]SQL_CA1_NEXTáHaä^SCARD_E_NO_SUCH_CERTIFICATEâ`aä^elpStyleEntry|aä^MCI_VD_MODE_PARKáaä^ulClipFmt aä ^UWORD¸aä ^PreGetSizeãÈaä^bValé ^LPOFNOTIFYWãbä_ulNumEventsForLogFile,bä_I_RpcServerUnregisterEndpointWã iValáhÔä%> ICreateErrorInfo_SetHelpContext_Stubé> SQL_FETCH_PREVã¨Ôä? ERROR_CONNECTION_UNAVAILáÈÔä? TRUST_E_BAD_DIGESTãàÔä ? adapter_typeáôÔä ? TapeInfoáÕä? IStorage_EnumElements_Proxyê? SQL_FN_TD_MINUTEáTÕä@ CTRY_KAZAKSTANã|Õä@ ReadConsoleOutputCharacterWê@ CounterHelpTitleá¸ÕäA META_SETVIEWPORTEXTâÐÕäA FixBrushOrgExèÕä A WNetGetUserâÖäA _CRYPT_OID_FUNC_ENTRY(ÖäA PRINTER_CHANGE_ALLëA MDM_PROTOCOL_V110_19DOT2KtÖäB ERROR_NO_TRUST_SAM_ACCOUNTë B BusTypeRAIDâ ÖäC EDEADLKâÀÖäC SHGetDiskFreeSpaceExAèC GetDocumentationâ×äD PROCESS_SET_INFORMATIONâ ×äD PRTL_OSVERSIONINFOEXW<×äD ERROR_INVALID_DLL\×äD ERROR_FUNCTION_FAILEDè D ERROR_DS_DSA_MUST_BE_INT_MASTERâ ×ä E EMR_ELLIPSEâ¼×äE LPMCI_SAVE_PARMSáÜ×äE PIDMSI_STATUS_VALUEêE SQL_SP_INØä F LPCOLORREFãØäF MCI_PUTâ8ØäF CERT_HASH_PROP_IDèF PCERT_CHAIN_ENGINE_CONFIGxØäG dmDefaultSourceâØäG getservbyport¬ØäG PCERT_KEY_CONTEXTèG SCardIntroduceReaderGroupWãðØäH lpstrDeviceTypeêH SCARD_STATE_PRESENTâ0ÙäI CreateFileMappingWãLÙäI GetFieldNoCopyëI VarBoolFromI4|Ùä J DataPaddingâÙäJ MWT_MAXêJ PAN_SERIF_FLAREDáÈÙäK I_RpcClearMutexâäÙäK SHFILEOPSTRUCTAãÚäK PERF_TEXT_UNICODEèK DATADIRâ,Úä L PROV_DSS_DHâDÚä L OnProgressã`ÚäL OnDataAvailableâ€ÚäL VAR_CALENDAR_HIJRIã˜ÚäL VarBoolFromI1è L SQL_DATE_LENáØÚäM DONT_RESOLVE_DLL_REFERENCESêM CO_E_OBJNOTCONNECTEDáÛäN cOIDáÛä N pFileExtá@ÛäN PRINTER_ATTRIBUTE_DIRECTáXÛä N LPENUMSTRINGéN iidâ€Ûä O TokenPrimaryá”Ûä O e32_res3á¨ÛäO FSHIFTã¼ÛäO WIM_CLOSEÜÛäO IMoniker_IsEqual_StubáÜäO IID_IBindStatusCallbackâ4Üä'O URLACTION_CHANNEL_SOFTDIST_PERMISSIONSëO VarBoolFromI2`ÜäP res_argâ|ÜäP SUBLANG_KOREANãœÜäP WM_IME_COMPOSITIONëP SQL_FETCH_BY_BOOKMARKÔÜä Q CTRY_GREECEâüÜäQ SCardIntroduceReaderGroupAã ÝäQ IMallocSpy_PreAlloc_Proxyè"Q ILockBytes_UnlockRegion_ProxyhÝäR ERROR_DS_COMPARE_TRUEŒÝäR ICM_UNREGISTERICMATCHERâ¤Ýä R pMonitorNameáÈÝäR CLSID_IdentityUnmarshalêR CoUnmarshalHresultãÞäS ERROR_PRODUCT_VERSION,ÞäS MCI_INFO_MEDIA_IDENTITYâPÞäS GET_CHANGER_PARAMETERSëS OleGetIconOfClass”ÞäT TAPE_DRIVE_SEQUENTIAL_SMKSë T nextNodeáÈÞäU SHGetDiskFreeSpaceExWèU VolumeTagInfoðÞä V devidßäV NO_PROPAGATE_INHERIT_ACEá,ßä V _WINERROR_ãTßäV ReadConsoleOutputCharacterAâ|ßäV I_RpcGetAssociationContextãßä V wireHWNDá°ßäV SCARD_ATTR_ESC_CANCELÀßäV llValè$V ITypeInfo2_GetFuncIndexOfMemId_Stubâàä W ZAWPROXYAPIêW MCI_ANIM_WHERE_SOURCELàäX FRS_ERR_SYSVOL_IS_BUSYëX CertDeleteCTLFromStoreãœàä!Y SID_IDENTIFIER_AUTHORITY_DEFINEDá´àä Y cBlueShiftãÄàäY MB_OKèY JOB_STATUS_RESTARTãáäZ ERROR_DS_ATT_NOT_DEF_IN_SCHEMAã(áäZ CTLCOLOR_EDITDáäZ CERT_RDN_ANY_TYPEháäZ IID_IInternetProtocolSinkèZ SQL_API_SQLSETSTMTATTRë [ PJOYCAPSá¼áä\ currency_symbolâÔáä \ S_PERIOD1024é\ EMRSETCOLORSPACEáâä] TokenImpersonationLevelâ<âä] ERROR_DEVICE_NOT_AVAILABLEãXâä] SHFILEOPSTRUCTWê] SQL_FETCH_RELATIVEã âä^ SCHED_E_NO_SECURITY_SERVICESáÀâä^ CRYPT_E_ASN1_INTERNALè^ LCTYPEãôâä_ CreateFileMappingAããä_ ERROR_DISK_OPERATION_FAILEDâ@ãä_ ERROR_DS_SYNTAX_MISMATCHápãä#_ MIXER_SETCONTROLDETAILSF_QUERYMASKãœãä&_ BINDSTATUS_CACHEFILENAMEAVAILABLE¸ãä_ LPCOMPOSITIONFORMè_ SQL_API_SQLPREPAREãüãä` SmlDevInfHierarchical_fâää` GetNextCodeBaseê` NPCANDIDATEFORMâ\ääa IMAGE_DIRECTORY_ENTRY_EXPORTápääa EV_DSRã”ääa SEC_E_ALGORITHM_MISMATCHáÀää a SCARD_ATTR_VENDOR_IFD_SERIAL_NOâÜääa PADDJOB_INFO_1ëa SQL_FN_NUM_COSãåäb DEFAULT_UNREACHABLEâDåä&b ERROR_DOMAIN_CONTROLLER_NOT_FOUNDXåäb VK_MENUêb hwndOwner„åä c TYMED_MFPICTéc CLSID_MkProtocoláÀåäd PSIDENT_GDICENTRICãÜåäd EMR_POLYBEZIER16áôåäd WM_INITDIALOGæäd VP_CP_CMD_DEACTIVATEá4æäd ReadConsoleOutputWãPæäd DdeNameServiceëd NdrNsGetBufferã€æä e ADD_SENDá¨æä"e ERROR_INVALID_OPLOCK_PROTOCOLÀæäe DMPAPER_LEGALÜæäe MENUITEMTEMPLATEâçäe IMallocSpy_PreAlloc_Stubáçä e __oaidl_h__êe SQL_SQ_INPçäf PRPC_SYNTAX_IDENTIFIERãhçä f tagEXTCONNã„çäf PutFieldNoCopyã¤çäf SERVICE_CONTROL_STOPáÄçäf SQL_QUALIFIER_USAGEêf SQL_FN_NUM_COTã(èäBg ?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@<èä g distanceáPèäg __rbitsâ|èäg GetSecurityDescriptorRMControlãèä g VFT_FONTá¤èä g SOCK_RAWáÀèäg _CRYPT_OID_INFOêg ITypeLib2_GetCustData_Stubã éäh ??_Ebad_cast@std@@UAE@I@Z éäh ENOLCKãHéäh IMAGE_NT_OPTIONAL_HDR_MAGICâ`éä h pvCompletioné(h IPropertyStorage_ReadPropertyNames_Stubâ¬éä i mmioSetInfoâÔéäi PRINTER_CHANGE_CONFIGURE_PORTèi PARAMFLAG_FOUTã êäj COMPAREITEMSTRUCT,êäj PCRYPT_KEY_PROV_PARAMè j STGFMT_ANYã\êä k mon_groupingá„êäk PrivilegedServiceAuditAlarmâœêä k CreateFontWêk SQL_QUERY_TIMEOUT_DEFAULTÜêäl tagCWPRETSTRUCTâôêä l mmioGetInfoêl IME_CMODE_JAPANESEã4ëäm GetTextExtentPoint32ATëäm GDICOMMENT_IDENTIFIERdëä m HSZ__„ëäm XTYP_XACT_COMPLETEëm CLSID_ManualResetEventãÄëän ENUMRESNAMEPROCAé n _textøëäo XptCommunicationInfoPtr_t ìäo ERROR_CALL_NOT_IMPLEMENTEDã8ìä o ETO_CLIPPEDêo Cancelãlìäp WSA_QOS_EPSFLOWSPECâìäp midiOutUnprepareHeaderã¼ìäp CERT_RDN_DISABLE_IE4_UTF8_FLAGãðìä'p __ICreateTypeInfo2_INTERFACE_DEFINED__ãíäp SERVICE_START_PENDINGèp SQL_DIAG_DROP_ASSERTIONâPíäq PAN_SERIF_THINëq PFN_CERT_ENUM_SYSTEM_STOREã”íär FILE_READ_DATAã¨íär dwOptionsÈíär ReadConsoleOutputAër SQL_DIAG_CREATE_TRANSLATIONâîäs CRL_REASON_CA_COMPROMISEá<îäs __ITypeMarshal_FWD_DEFINED__á\îäs LPOINETPROTOCOLROOTâtîä s URLZONEREGës VarCmpã˜îä t scanf°îä t wDayOfWeekãÌîät PARTITION_FAT32âìîät ELEMENT_STATUS_SVALIDïät PRINTER_STATUS_IO_ACTIVEé t get_fileSizeáPïäu PROCESSOR_ARCHITECTURE_SHXãdïäu nHeightêu _CERT_KEY_ATTRIBUTES_INFOœïäv strspnpâ¸ïäv DLL_THREAD_DETACHÔïäv WM_CTLCOLORDLGãðïäv RpcServerListenâðä"v CHANGER_KEYPAD_ENABLE_DISABLE<ðäv IOleCache_InitCache_Stubév IME_CAND_UNKNOWNáxðäw IMPORT_OBJECT_CODEãðäw WM_NEXTDLGCTL¸ðäw CERT_STORE_PROV_READ_CRL_FUNCèw ??_7IPersistMoniker@@6B@áôðä x PARITY_NONEâñäx ENUMRESNAMEPROCWá0ñäx ERROR_INVALID_CLEANERTñäx szOID_PKIX_KP_IPSEC_USERé x rgbCounterã€ñäy to_signed ñäy SEE_MASK_DOENVSUBSTâ¼ñäy DISK_LOGGING_DUMPìñä$y CHANGER_DEVICE_REINITIALIZE_CAPABLEêy DestroyPropertySheetPageéz AbnormalTerminationâHòä { _MSL_CLIMITSápòä{ RPC_S_WRONG_KIND_OF_BINDINGâòä{ GetTextExtentPoint32Wè{ SQL_DRIVER_HENVâÐòä| SYSER_PRODUCT_CODE_ALT1âøòä| SetSecurityDescriptorGroupã óä| CERTSRV_E_BAD_REQUESTSUBJECTá8óä | CLOSECHANNELáLóä | VK_LMENUáhóä| BSF_POSTMESSAGEê | CP_OEMCPá”óä } CreateFontAâ¬óä } DLGTEMPLATEâÔóä} CERT_COMPARE_SIGNATURE_HASHâìóä } DOMDocumentâôä } setNamedItemé} SERVICE_STOP_PENDINGáHôä~ SYSER_PRODUCT_CODE_ALT3â\ôä~ insertã|ôä~ ERROR_BUFFER_OVERFLOW˜ôä~ SYMBOL_CHARSETã°ôä ~ midiInGetIDê"~ IBindCtx_GetObjectParam_Proxyüôä SYSER_PRODUCT_CODE_ALT2âõä WOM_CLOSE0õä SCARD_SHARE_SHAREDë$ ITypeInfo2_GetAllParamCustData_Stubâtõä € INFINITYá˜õä€ PMENUITEMTEMPLATEHEADERê€ dwErrorControlãÐõä GetTempFileNameWáàõä qosãöä szOID_OIWSEC_rsaXchgá öä CRL_DIST_POINT_NAMEâPöä% CRYPT_OID_REG_FUNC_NAME_VALUE_NAME_Aáhöä IRpcHelperã öä, IInternetSession_UnregisterMimeFilter_Proxyê GCS_COMPSTRâèöä$‚ PIMAGE_AXP64_RUNTIME_FUNCTION_ENTRYâ÷ä‚ EMR_SETPOLYFILLMODEâ$÷ä‚ PEMRPIXELFORMATê‚ WN_ACCESS_DENIEDá\÷äƒ VER_MAJORVERSIONáx÷äƒ PARSE_FRIENDLYëƒ SQL_RESULT_COLã´÷ä„ RPC_E_INVALID_OBJECTáÐ÷ä„ bSetPageDeviceãì÷ä„ LoadAcceleratorsWøä „ sz_CERT_STORE_PROV_SMART_CARD_Wâ0øä „ MAX_PRIORITYáLøä„ CreateInstanceë„ SQL_API_SQLDRIVERSã„øä … DECIMAL_DIGâ øä… LANG_USER_DEFAULT¸øä … DO_PRINTFILEáÌøä … MIXERCAPSè… PCERT_KEY_ATTRIBUTES_INFOùä† ERROR_DS_MASTERDSA_REQUIREDê† JOB_STATUS_DELETEDãHùä‡ xNumá\ùä‡ VK_HELPâ€ùä‡ _TRANSMIT_FILE_BUFFERSã¸ùä,‡ IXMLDOMDocument_createEntityReference_Proxyê‡ _LPPERSISTMONIKER_DEFINED(úä?ˆ ?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@ã<úäˆ ENDDOCãXúäˆ lfOutPrecisionã|úäˆ PAN_MIDLINE_HIGH_TRIMMEDáúäˆ EndDocëˆ PP_CLIENT_HWNDãÈúä‰ GetEnhMetaFileAâàúä‰ HELP_MULTIKEYûä‰ tagMCI_WAVE_OPEN_PARMSAê‰ OFN_NOLONGNAMESâ@ûäŠ PIPE_ACCESS_INBOUNDâ\ûäŠ tagCBT_CREATEWNDAlûä Š HDROPûäŠ URL_OID_CTL_NEXT_UPDATEâ¨ûä Š NdrSH_IfFreeéŠ IsRecognizedPartitionàûä ‹ DC_TRUETYPEâüûä‹ TC_OP_CHARACTERâüä‹ SPI_SETCURSORSã0üä ‹ MF_POSTMSGSê‹ IME_ESC_SEQUENCE_TO_INTERNALápüäŒ MEM_4MB_PAGESˆüä Œ _CTL_CONTEXTá´üä Œ CERT_CREATE_CONTEXT_NOCOPY_FLAGâÔüäŒ FILE_DEVICE_TERMSRVêŒ DPD_DELETE_SPECIFIC_VERSIONê EMRSETMITERLIMITá4ýäŽ set_intersectionáLýä Ž MS_DEF_PROVâ`ýäŽ RevokeãtýäŽ IBindHost ýä!Ž URLACTION_HTML_SUBMIT_FORMS_FROMéŽ SQL_CLOSEÈýä HACCELãäýä ALL_TRANSPORTSãþä szOID_INTERNATIONAL_ISDN_NUMBERâ4þä BINDSTATUS_RAWMIMETYPEãXþä ImmSetCompositionFontWë SQL_SP_BETWEENãˆþä GprMaskâœþä C1_XDIGIT¼þä ??_7IRecordInfo@@6B@é lpwstrãäþä‘ CprMaskâÿä‘ GetSidIdentifierAuthority$ÿä‘ MCI_DEVTYPE_OTHERHÿä‘ IOCTL_STORAGE_LOAD_MEDIAápÿä‘ IXMLDocument2_put_async_StubáŒÿä‘ IID_IAsyncMonikerè"‘ INET_E_CODE_DOWNLOAD_DECLINEDÐÿä’ LoadAcceleratorsAè’ I_RpcNsSendReceiveãä“ __XMLHTTPRequest_FWD_DEFINED__ë“ IRecordInfo_GetField_Stub\ä” ALG_TYPE_STREAMâxä” PVTableProvStrucáŒä ” cbAtrLené ” SOFTDIST_FLAG_USAGE_AUTOINSTALLâÌä • MAXDWORDáèä• SMTO_ABORTIFHUNGé• DCX_NORESETATTRSá,ä"– DNS_ERROR_ZONE_DOES_NOT_EXISTHä– MCI_SEQ_OFFSETë$– CRYPT_MESSAGE_BARE_CONTENT_OUT_FLAGâ”ä— AddressOfNamesã°ä— GetTempFileNameAáÌä— DdeQueryStringë!— SQL_AT_CONSTRAINT_NON_DEFERRABLEé ˜ ACLineStatusá ä™ iosâDä™ SUBLANG_CHINESE_HONGKONGá`ä™ ERROR_NO_TOKENã„ä™ COMADMIN_E_OBJECTEXISTSâ˜ä ™ xformSrcá¬ä ™ SetParentè™ ImmSetCompositionFontAãøäš IMAGE_REL_SH3_SIZEOF_SECTIONáä š IE_BYTESIZEâ4äš ERROR_NO_TRACKING_SERVICEPäš MCI_BREAK_PARMSâpäš _CRYPT_KEY_PROV_PARAM„ä š tagMEMCTXè š SysStringLenáÀä› ERROR_ACTIVE_CONNECTIONSé› SQL_ATTR_MAX_LENGTHâøäœ smlAddCmdFunc ä œ INFINITEá(äœ tagCBT_CREATEWNDW@ä œ CF_OEMTEXTãXäœ GetWindowTask€äœ PFULL_PTR_TO_REFID_ELEMENTã˜ä œ NdrGetBufferéœ GL_ID_READINGCONFLICTÌä alloc_ãèä ERROR_NOT_EMPTYâ ä SPAPI_E_LINE_NOT_FOUNDë EMRSETCOLORADJUSTMENTDä ž _MSL_CSTDDEFá\ä ž e32_datapageátä ž iStartScanã„äž lValéž SQL_FN_NUM_ATAN2á¸ä Ÿ __GetAwCharâèä%Ÿ JOBOBJECT_SECURITY_LIMIT_INFORMATIONáä"Ÿ IMPORT_OBJECT_NAME_UNDECORATE4äŸ PAN_CONTRAST_MEDIUM_LOWâPäŸ GetEnhMetaFileWâtäŸ tagMCI_WAVE_OPEN_PARMSWêŸ PF_LATã ä   ODA_SELECTã¸ä  SPI_GETBORDERÜä  PFN_CRYPT_ENUM_KEYID_PROPè  IEnumString_Clone_Stubãä¡ SORT_CHINESE_PRCPè ¡ C1_DIGITáHä¢ TimeDateStampè'¢ IDataObject_GetCanonicalFormatEtc_Stubã”ä £ EMRSETBKMODEé£ LPNETRESOURCEAë¤ I_RpcSetServerContextListôä¥ smlFreeMetinfAnchorâ ä ¥ SetCommStateá8ä¥ GetPrivateProfileSectionNamesWãTä¥ WM_COMPAREITEMãlä ¥ lfMenuFontã˜ä¥ _CRYPT_KEY_VERIFY_MESSAGE_PARAë ¥ __RPCNDR_H__áÈä ¦ LANG_TAMILãðä¦ ACCESS_DS_OBJECT_TYPE_NAME_Wá ä¦ DMORIENT_PORTRAIT( ä¦ ChoosePixelFormatL ä¦ ??_7IBlockingLock@@6B@ãl ä¦ IID_ICatalogFileInfoé¦ SQL_CC_DELETE” ä§ yNumá¬ ä§ MCI_MODE_SEEKÌ ä§ LPTYPECHANGEEVENTSë§ SQLInstallDriveráü ä¨ CharStrâ( ä ¨ ERROR_DS_OBJ_CLASS_NOT_SUBCLASSâ@ ä¨ RPCOLEMESSAGEh ä¨ __IXMLElement2_FWD_DEFINED__é!¨ __ICreateErrorInfo_FWD_DEFINED__á´ ä© IMAGE_SNAP_BY_ORDINALà ä© NdrEncapsulatedUnionBufferSizeã ä)© IXMLDOMDocument_createCDATASection_Proxyé"© IXMLElement2_get_parent_ProxyT ä ª HWND_DESKTOPáh ä ª VOS__BASEè ª LPMIXERCONTROLDETAILS_LISTTEXTAâ´ ä« ContextTrackingModeâà ä"« CHANGER_INIT_ELEM_STAT_WITH_RANGEè « wireVARIANTâ ä ¬ _MSL_WMEM_Hâ( ä ¬ XCLASS_MASKâ@ ä ¬ VT_RESERVEDâ\ ä¬ PROPSHEETPAGEAãˆ ä¬ ZAFLAGS_INCLUDE_PROXY_OVERRIDEë¬ SQL_FN_NUM_SINãÄ ä­ SML_ERR_WRONG_PARAMâì ä­ ERROR_DS_DRA_SINK_DISABLEDã ä­ APPCMD_FILTERINITSã8 ä­ ITypeLib2_GetAllCustData_Proxyë­ CreateURLMonikeráh ä® dwFullãŒ ä® I_RpcGetServerContextListœ ä® LoadáÀ ä® MDM_SHIFT_HDLCPPP_AUTHë® SQL_CB_DELETEø ä¯ EXCEPTION_RECORD32ãä¯ RPC_E_SERVERFAULT0ä¯ CRYPT_E_NO_MATCHé¯ DeletePrinterDataExAáxä° ACCESS_DS_OBJECT_TYPE_NAME_Aá¤ä° ERROR_DS_DRA_BAD_INSTANCE_TYPEãÄä° TYPE_E_BADMODULEKINDáðä ° szOID_ENROLL_CERTTYPE_EXTENSIONâä ° MftReadBytesá$ä° IID_IOleObjectë%° __IXMLDOMComment_INTERFACE_DEFINED__átä± PCRYPT_OID_FUNC_ENTRYä± LPHTTPNEGOTIATEâÄä(± __IInternetBindInfo_INTERFACE_DEFINED__ê± SQL_IS_DAY_TO_HOURãä ² JOB_OBJECT_MSG_JOB_MEMORY_LIMITê² SQL_ASYNC_ENABLE_DEFAULTá`ä³ GetPrivateProfileSectionNamesAã|ä³ _SHQUERYRBINFOë³ IStorage_CreateStorage_ProxyáÈä´ ERROR_INVALID_TRANSFORMâää´ WM_EXITMENULOOPê´ USER_MARSHAL_FC_SMALLäµ elementâ(ä µ node_Däµ LPNETRESOURCEWãdäµ PFORMAT_PARAMETERSëµ SQL_FN_STR_UCASEáœä¶ ERROR_READ_FAULTáÄä¶ CERT_FIND_OR_CTL_USAGE_FLAGâèä¶ _CERT_CHAIN_ENGINE_CONFIG ä¶ PRINTER_CHANGE_ADD_PORTâDä,¶ AsyncIAdviseSink_Finish_RemoteOnRename_Stubê¶ SQLGetFunctionsâ|ä· FACILITY_CONTROLé· RPC_CONTEXT_HANDLE_FLAGSá´ä¸ modulusâÈä¸ lopnStyleàä ¸ STICKYKEYSãüä¸ dwFileFlagsMaskê¸ szOID_OIWSEC_dsaSHA1á4ä ¹ idFirstChildáPä¹ FKF_CONFIRMHOTKEYpä¹ DeletePrinterDataExWé¹ tagOLEGETMONIKERá¨äº CRYPT_E_NO_SIGNERÀä º PSINJECTDATAáØä º RT_PLUGPLAYãä"º MIXERCONTROL_CONTROLF_UNIFORMäº PROPSHEETPAGEWëº CreateBindingLä» _MSL_WSTDIO_Hpä» EVENTLOG_INFORMATION_TYPEŒä» SERVICE_TYPE_ALLá¨ä» FILE_TYPE_PIPEãÀä » EVENT_E_LASTáØä » _PSHNOTIFYë » SQL_DTC_DONEáä¼ nearbyint ä¼ __red_black_treeá4ä¼ BAUD_9600Lä ¼ bV4RedMaskãxä&¼ MIXERCONTROL_CT_SC_SWITCH_BOOLEAN¤ä ¼ LPMIXERCONTROLDETAILS_LISTTEXTWê ¼ _CRL_CONTEXTáÐä½ ENODEVãèä ½ dwContrastã ä½ MIXER_SHORT_NAME_CHARSã,ä½ PP_KEY_TYPE_SUBTYPEâ@ä½ Elementê ½ LPIINTERNETâlä¾ GWLP_IDê¾ IXMLDocument2_get_async_Stubá°ä¿ SetFilePointerExáÐä¿ MCI_ANIM_REALIZE_NORMðä¿ RpcNsProfileDeleteë¿ HlinkNavigateStringâ,äÀ EVENTLOGRECORDã@äÀ PST_LATâ\äÀ OpenSemaphoreAãxäÀ OffsetWindowOrgExŒä À styleOldá¤ä À waveInStopãÀäÀ LPSHNAMEMAPPINGAáÜäÀ _userHENHMETAFILEüäÀ VARFLAG_FUIDEFAULTëÀ URLACTION_ACTIVEX_MIN0äÁ encode_wcLäÁ MinorImageVersionläÁ ERROR_TAG_NOT_FOUNDâŒäÁ MMIOERR_OUTOFMEMORYâ¨äÁ CounterNameTitleáÈäÁ ALG_SID_RSA_ENTRUSTâääÁ FILE_DEVICE_MODEMèÁ SetJobWâ$ä PIMAGE_BOUND_IMPORT_DESCRIPTORã@ä LGRPID_INSTALLEDá\ä RegSetValueExAã„ä _CMSG_ENVELOPED_ENCODE_INFOâ¨ä PRINTER_STATUS_PRINTINGâÈä IGlobalInterfaceTableèä CoUnmarshalInterfaceé _wireSAFEARRAYã äà FILE_IS_ENCRYPTED<äà ROT_COMPARE_MAXâXäà SCARD_ATR_LENGTHéà SQL_CATALOG_TERMá˜äÄ PAN_CONTRAST_MEDIUM_HIGHá´äÄ NRC_NORESOURCESâÔäÄ _PERF_COUNTER_BLOCKâìä Ä PCRL_CONTEXTâäÄ GetJobWêÄ IMoniker_Reduce_Proxy@äÅ PIMAGE_TLS_CALLBACKâ\äÅ NumberOfObjectsâtä Å SQLAllocStmtéÅ SQL_ROW_UPDATEDâ¸äÆ BY_HANDLE_FILE_INFORMATIONãØäÆ DV_E_DVTARGETDEVICEãäÆ _PRINTER_NOTIFY_OPTIONS_TYPEá(äÆ IXMLElement_addChild_ProxyëÆ SQL_COLUMN_LENGTH\ä Ç __lower_mapê Ç SM_CLEANBOOTáˆäÈ __freadêÈ _CRYPT_ENCRYPT_MESSAGE_PARAâÌäÉ IsDBCSLeadByteãÜä É magicøäÉ PARAMFLAG_FOPTãäÉ PARSE_URL_FROM_PATHêÉ QUERY_CONTENT_TYPEãLäÊ EILSEQã`äÊ wMonthã„äÊ SetUserObjectInformationA¤äÊ SizePtrLengthArrayëÊ IMarshal2àäË IMAGE_SUBSYSTEM_WINDOWS_CUIâøä Ë MH_CLEANUPãäË CRYPT_DATA_KEYëË _remoteMETAFILEPICTêÍ ??_7IEnumUnknown@@6B@häÎ HRESULTâ„äÎ ProcessLocksListá˜äÎ LPARAMã¼äÎ ERROR_RESOURCE_NOT_ONLINEèÎ PSBTN_APPLYNOWääÏ FILE_NOTIFY_CHANGE_CREATIONâäÏ LRESULTâ(ä Ï LoadMenuWèÏ CALLBACK_EVENTã\ä Ð SmlVersion_tá€äÐ RPC_S_INVALID_ASYNC_CALLáœäÐ BATTERY_FLAG_LOWéÐ ??_7IOleInPlaceFrame@@6B@Øä Ñ MCI_UPDATEëÑ CertOIDToAlgIdã äÒ SHNAMEMAPPING$ ä Ò PP_ENUMALGSâH äÒ CRYPT_KEYID_MACHINE_FLAGá` ä Ò SEARCH_ALLãt äÒ GetJobAêÒ SQL_ROW_UPDATES⨠ä Ó EndAddressãÌ äÓ DNS_ERROR_INVALID_DATAãì äÓ WH_JOURNALPLAYBACKã!ä$Ó IPropertyStorage_WriteMultiple_StubêÓ BstrFromVectorãT!äÔ SYSYNC_SUBVERSIONp!äÔ KEY_ALL_ACCESSã!äÔ ERROR_VC_DISCONNECTED¬!äÔ RegSetValueExWëÔ IXMLDOMDocument_put_async_Stubãð!ä Õ MF_DEFAULTã"äÕ HDRVR__êÕ TARGET_IS_NT40_OR_LATERâP"äÖ EVENTLOG_START_PAIRED_EVENTâl"äÖ OpenSemaphoreWãŒ"äÖ RPC_S_NO_PRINC_NAMEâ¨"äÖ LPSHNAMEMAPPINGWáÀ"ä Ö TrustStatusêÖ SCARD_T1_MAX_IFSáô"ä × EC_ENABLEONEá#ä× rghSignerStoreã(#ä × pSignerInfoâ@#ä× data_into_ndr`#ä× USER_MARSHAL_FC_ULONGt#ä× SetJobAê× INET_E_NO_SESSION´#äØ ERROR_JOURNAL_NOT_ACTIVEáÐ#äØ PRPC_SECURITY_QOSèØ URLACTION_SCRIPT_MINá$äÙ P_NOWAIT0($äÙ JOB_OBJECT_LIMIT_JOB_TIMEè Ù LoadMenuAèÚ _RemotableHandleéÛ NdrConformantArrayUnmarshallá¤$äÜ SetUserObjectInformationWÀ$äÜ ScreenToClientãÜ$äÜ VarBstrFromIntë Ü msl_utilityâ%äÝ DRIVE_REMOVABLEâ4%äÝ FRS_ERR_STARTING_SERVICEáP%äÝ MAXSTRETCHBLTMODEh%ä Ý lpClassNameâ|%ä Ý SOCK_RDMá”%ä Ý getNamedIteméÝ tagSTATPROPSTGëÞ CertControlStoreáà%äß __readã&äß LOCKFILE_EXCLUSIVE_LOCKâ,&äß COMADMIN_E_BADREGISTRYLIBIDâH&äß ENABLE_LINE_INPUT`&ä ß STGM_WRITEã|&äß NPCOMPOSITIONFORM˜&äß SQL_CREATE_SCHEMAè%ß SQL_CA_CONSTRAINT_INITIALLY_DEFERREDáä&äà LPCMENUITEMINFOAâ'äà DMLERR_SYS_ERRORéà LPCANDIDATEFORMâ4'ä á NFR_UNICODEâH'ä á PtInRectáX'äá Lockáp'ä á SystemTimeëá SQL_BS_SELECT_EXPLICITëâ TAPE_DRIVE_SPACE_IMMEDIATEãÜ'äã allocator_referenceâü'äã META_SELECTPALETTEã(äã BS_HOLLOW$(äã SW_MAXã<(ä ã CP_SUPPORTEDéã tagMIXERCAPSWx(ää szOID_OIWSEC_dsaCommSHA1á˜(ää pszPrivateKeyObjIdã´(ää POPENCARDNAME_EXéä ??_7IPropertyBag@@6B@ø(äå IMAGE_REL_ALPHA_LITERALâ )äå CO_E_INIT_SCM_MUTEX_EXISTSã8)ä å PMONCBSTRUCTáP)ä å WHDR_INQUEUEéå CommFaultOffsetsá|)ä æ ceillœ)äæ SmlInstanceOptions_tá´)ä æ SmlNoResp_fêæ BF_LEFTâÜ)äç lResultâô)ä ç PJOYINFOEXã *äç IXMLDocument2_get_doctype_Stubëç PID_MIN_READONLYád*äè PF_FLOATING_POINT_EMULATEDã„*äè SizeOfInitializedData˜*äè DI_NORMAL¬*äè h_addrãÈ*äè CryptSetProvideráì*äè _ROT_COMPARE_MAX_DEFINEDá +äè PVERIFY_INFORMATIONâ$+ä è SC_DLG_NO_UIéè SQL_LOCK_EXCLUSIVEãd+äé EMAIL_FORMAT_SUPPORTát+ä é Magic+äé MCI_VD_SPIN_DOWNá¬+äé max_dgram_sizeãÜ+ä$é NdrConformantVaryingArrayBufferSizeâ,ä"é IXMLDOMNode_selectSingleNode_Stubè/é IInternetZoneManager_SetZoneCustomPolicy_ProxyãX,äê execlpãt,äê ReleaseConnection,äê OleSaveToStreamêê _SERVICE_FAILURE_ACTIONSAÐ,äë ERROR_SEM_IS_SETáð,äë DISP_E_NONAMEDARGSã -äë DispatchMessageê"ë ITypeInfo_ReleaseVarDesc_StubD-ä ì ceilfT-äì hMFâx-äì IEnumOLEVERB_Clone_Proxyá-äì OleInitializeèì CDM_GETFILEPATHâÄ-ä í OSS_BAD_ARGâÜ-ä í LeadingZeroâ.ä!í I_RpcLaunchDatagramReceiveThreadéí userFLAG_STGMEDIUMãH.äî smlAllocTargetRefListè î FACILITY_ITFát.äï VK_ADDãŒ.ä ï BN_CLICKEDã¤.äï MCI_SET_AUDIO¸.ä ï FIONREADéï IXMLDOMNode_replaceChild_Proxyë ð S_PERIOD2048á/äñ _FILE_SEGMENT_ELEMENTä Green$>ä ARW_BOTTOMRIGHTâD>ä MonikerBindToStorageé lpOFNh>ä lstrcpynA>ä" ERROR_NO_SHUTDOWN_IN_PROGRESS¸>ä RPC_C_PROTECT_LEVEL_CONNECTê CryptExportPublicKeyInfoExãø>ä  XTYP_ERRORã?ä MONCONVSTRUCT(?ä  MIDI_MAPPERâL?ä PFN_CMSG_EXPORT_MAIL_LISTè  pbCrlEncodedáˆ?ä GetThreadSelectorEntryã ?ä  VALID_NTFTã¸?ä  DISPPARAMSë IID_IOInetProtocolSinkãø?ä ELF_VENDOR_SIZEâ@ä OemToCharBuffAë HSZâ<@ä  FORM_INFO_1Aé SQL_CA1_POS_POSITIONá|@ä IdentifierAuthorityâ”@ä  DC_SMALLCAPâ°@ä CryptDecodeObjectè DragEnterØ@ä wNextCharô@ä IMAGE_SCN_GPRELâAä DNS_STATUS_PACKET_UNSECUREã4Aä  BM_SETCHECKâ\Aä CAL_GREGORIAN_XLIT_ENGLISHã€Aä CLSID_DeCompMimeFilterë SQL_FETCH_BOOKMARKãÀAä RPC_S_ADDRESS_ERRORâäAä FlushConsoleInputBufferâ Bä CERT_STORE_PROV_FIND_CTL_FUNCè  ClosePrinteráDBä SCARD_E_INVALID_CHVâdBä WNetCancelConnectionAè LPCPROPSHEETHEADERã Bä PROCESSOR_ARM920áÄBä ERROR_NOT_EXPORT_FORMATâèBä CMSG_VERIFY_SIGNER_PUBKEYCä XMLELEMTYPE_DTDê IID_IXMLDOMParseError8Cä ne_imptabPCä  SearchPathãpCä LPPRINTER_DEFAULTSë IRecordInfo_GetGuid_Stubá¤Cä __nbáÌCä" IMAGE_RESOURCE_NAME_IS_STRINGäCä  PMIDIINCAPSãDä _RPC_SECURITY_QOS8Dä+ _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARAãTDä SCARD_PROTOCOL_T1è  IGP_SELECTã€Dä  hMonitoré SCARD_PROTOCOL_T0ÀDä THREAD_PRIORITY_HIGHESTâàDä CryptSetProviderExãEä CryptGetMessageSignerCountë V_UNKNOWN SML_ERR_XLT_WBXML_UKN_TOKÄVä > MM_WOM_OPENâäVä> MCIERR_INVALID_FILEê> cchUsedâWä? IMAGE_REL_IA64_DIR64á0Wä ? ValidateRectáHWä ? OPENCARDNAMEé? IEnumOLEVERB_Reset_StubâˆWä@ ?$restrict_to@$00¨Wä@ IMAGE_REL_MIPS_SECRELÀWä@ hbmpUncheckedÜWä@ LBS_HASSTRINGSë@ LPPRINTER_ENUM_VALUESXäA do_insert,XäA WM_RBUTTONDBLCLKáHXäA MCI_ALL_DEVICE_IDlXäA RPC_C_OPT_MQ_AUTHN_LEVELé!A IOleContainer_LockContainer_Stubá¬Xä B e_lfanewáÄXä B VK_NUMLOCKãÜXä B VK_OEM_MINUSéB _authè C e_maxallocãYä D scalblnfá xvalá8Üä > _GUIDDEF_H_âXÜä> IMAGE_REL_ALPHA_PAIRá€Üä> __IOleCache2_FWD_DEFINED__ã¬Üä!> IOleClientSite_GetContainer_StubáÔÜä> _ENUM_SERVICE_STATUS_PROCESSWè> SQLDataSourcesãÝä ? SML_PE_EXECâÝä? HELP_QUIT4Ýä? CertNameToStrPÝä? LPPERSISTSTORAGEé? StartServiceAˆÝä@ DISP_CHANGE_RESTARTâ Ýä @ IID_IBindCtxáÌÝä@ IDataObject_EnumFormatEtc_Stubë@ GetMopsâüÝäA TAPE_ERASE_SHORTá ÞäA RPC_S_OUT_OF_RESOURCESã4Þä A KEYARRAYéA MIXERLINE_LINEF_DISCONNECTEDé B VarUI4FromI4á˜ÞäC SUBLANG_NORWEGIAN_BOKMALá°Þä C LPLOGBRUSH32áÐÞäC PFNPROCESSPOLICIESAêC CERT_SIGNATURE_HASH_PROP_IDâßäD JOYCAPS_POVCTSã,ßäD MCI_BREAK_KEY\ßä&D __IInternetProtocolRoot_FWD_DEFINED__è D VarUI4FromI2áŒßä E HCOLORSPACEâ¬ßäE _OUTLINETEXTMETRICAâÈßäE WM_NCLBUTTONUPëE SetMopsâðßäF is_PODãàä"F ??_7invalid_argument@std@@6B@<àäF WT_EXECUTEINTIMERTHREADâTàä F FACILITY_AAFáhàäF BS_LEFTâ€àä F SE_ERR_PNFãœàäF MS_DEF_DSS_PROV_Wè!F IXMLDocument_createElement_ProxyáààäG SizeOfHeadersè G VarUI4FromI1á áä H S_SERDMDéH SQL_PC_NOT_PSEUDODáäI SHOW_ICONWINDOWâdáäI WindowBufferSizeEventèI put_URLâ”áäJ PMONLINKSTRUCTã¼áäJ ReLayoutDocfileOnILockBytesê J SQLCopyDescâôáäK GetCurrentPositionExáâäK GetLogColorSpaceá,âäK PROV_ENUMALGS_EXéK IDataObject_SetData_StubápâäM CheckColorsInGamutã„âä M FD_ISSETá¨âäM CRYPT_RC2_56BIT_VERSIONêM VarI4FromBoolÔâäN puiValëN SQL_TYPE_DATEãäO Int64ShllMod32ã(ãäO IMAGE_REL_PPC_IFGLUEáLãäO DNS_ERROR_INVALID_TYPEãlãäO tagEMRPOLYTEXTOUTAãˆãäO RPC_C_AUTHN_MSNâ¤ãäO CMSG_CRL_PARAMëO NUMPRS_EXPONENTâèãäP ERROR_NO_IMPERSONATION_TOKENáää P ERROR_UNABLE_TO_INVENTORY_DRIVEâ(ääP CTRY_OMANDääP MS_DEF_DSS_PROV_Aè$P IOleInPlaceUIWindow_GetBorder_Proxyâˆää Q categoryá¤ääQ PF_PAE_ENABLEDãÀääQ I_RpcSendReceiveáÜääQ CRYPT_MODE_ECBãøääQ _COAUTHIDENTITYâ$åä!Q IXMLDOMDocument_nodeFromID_ProxyéQ QUERY_IS_SAFETåäR cbContextInfoè*R IRunnableObject_RemoteIsRunning_Proxyœåä S NPLOGBRUSH32á¼åäS _OUTLINETEXTMETRICWâäåäS NdrConformantArrayMarshallëS pProtocol(æä#T PJOBOBJECT_BASIC_LIMIT_INFORMATIONãDæäT TransparentBltã\æä T SIZE_MAXHIDEé T ByteOffsetãæäU FILE_TYPE_DISKã¨æä U CTRY_LATVIAêU PFNPROCESSPOLICIESWâØæä V srandüæäV OUTPUT_DEBUG_STRING_EVENTçäV DESKTOP_HOOKCONTROLâ8çäV PCRYPT_HASH_BLOBá`çä"V IOCTL_DISK_GET_DRIVE_GEOMETRYŒçäV ISurrogate_FreeSurrogate_Proxyã°çäV ??_7IOleInPlaceSite@@6B@áÌçäV CFSTR_MIME_GIFãøçä V IID_IOInetProtocolSinkStackableêV URLZONE_LOCAL_MACHINE@èäW STATUS_INVALID_DISPOSITIONã`èäW SECURITY_PROXY_RIDãtèäW bottomë W GCL_HMODULEâ¨èäX _set_newpoolsizeáÈèäX SetDebugErrorLevelãäèäX ReLayoutDocfileê"X IXMLDocument_get_charset_Stub,éäY SML_ERR_A_XPT_IN_USEáLéäY IMAGE_SYM_TYPE_WORDâtéäY ERROR_DUPLICATE_SERVICE_NAMEáœéäY sz_CERT_STORE_PROV_COLLECTIONè Y F5_320_1024âÈéäZ fflushãÜéäZ FF_MODERNôéäZ ExtractIconEx êä&Z PFN_CERT_DLL_OPEN_STORE_PROV_FUNC8êäZ PROP_LG_CXDLGXêäZ HBITMAP_UserMarshalêZ FR_MATCHKASHIDAâœêä[ SCHED_E_SERVICE_NOT_RUNNINGâ´êä[ URLACTION_MINè[ SQL_ATTR_READONLYìêä\ can_derive_fromãëä \ XPTDEF_Háëä \ CAT_E_FIRSTâ0ëä \ CRYPT_OAEPãTëä\ CoDosDateTimeToFileTimeê'\ ICreateTypeLib2_SetHelpStringDll_Proxyã˜ëä] _NEWáÀëä] ExceptionContinueExecutionãìëä] IRootStorage_SwitchToFile_Stubãìä ] LPOLEUPDATEê] SQL_DYNAMIC_CURSOR_ATTRIBUTES1ãPìä^ CS_E_INTERNAL_ERRORâhìä ^ CTRY_MOROCCOá„ìä^ dwMsgEncodingTypeœìä ^ PENDINGTYPEâ¼ìä^ ??_7ITypeLib2@@6B@ãèìä^ MDM_PROTOCOL_HDLCPPP_112K_CHAPãíä^ SQL_MAX_NUMERIC_LENê^ SQL_DYNAMIC_CURSOR_ATTRIBUTES2ãHíä_ iCtrlIdê _ PDATA_BLOBã€íä` SYSER_REGISTRATIONã˜íä ` SyntaxGUIDë` ObtainUserAgentStringèa OFN_ENABLETEMPLATEãüíäb _EXCEPTION_DISPOSITIONãîä b S_SERDLNá$îäb PEMREOFâ<îä b WM_MOUSEMOVEá`îäb __MIDL_IAdviseSink_0003êb BINDINFO_OPTIONSá”îä c PUHALF_PTRã¨îäc GW_MAXãØîä%c IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTSáøîäc PDATATYPES_INFO_1Wëc __MIDL_IAdviseSink_0002â<ïäd SML_FIRST_DATA_ITEMâdïäd ERROR_INVALID_MONITOR_HANDLEá|ïä d DV_E_LINDEXâ”ïä d PCONVCONTEXTé d OnUIActivateáÄïä e min_elementê e GCP_RESULTSâðäf ERROR_DOMAIN_LIMIT_EXCEEDEDâ$ðäf SendNotifyMessageWãDðäf MMIOERR_CANNOTWRITEâdðäf CertFindCTLInStoreã€ðäf MSHCTX_CROSSCTXêf PRINTER_ENUM_ICON8ãÀðäg IMAGE_REL_MIPS_PAIRâèðäg SERVICE_FILE_SYSTEM_DRIVERäñä g cAlphaShiftêg GetCharWidth32Aâ<ñäh VER_PLATFORM_WIN32sâ\ñäh PRINTER_ENUM_ICON6ëh IRpcStubBuffer_CountRefs_Proxyã¤ñäi DMPAPER_LETTERã¸ñäi ReleaseDCØñäi ALG_SID_CYLINK_MEKãìñä i pStubMsgáòä i fCheckBoundsá,òäi PRINTER_STATUS_INITIALIZINGâLòäi PRINTER_ENUM_ICON7ëi ??_7ISynchronizeEvent@@6B@ãŒòä j EXPIRY_DAYã¤òä j sml_filter_sá¼òäj InitializeAclèòä&j ERROR_SESSION_CREDENTIAL_CONFLICTüòäj KP_KEYLEN óäj PRINTER_STATUS_PROCESSINGèj PRINTER_ENUM_ICON4ã\óäk defaultPrintFuncátóä k auxSetVolumeáóäk RPC_OBJECT_INQ_FNèk PRINTER_ENUM_ICON5ãÄóä l POLYTEXTWèl PRINTER_ENUM_ICON2äôäm LANG_VIETNAMESEâôäm iButtonâ4ôäm PRINTER_ENUM_ICON3ëm SQL_DESC_ARRAY_STATUS_PTRlôän PNT_TIBâˆôän WM_RENDERFORMATâ ôä n put_dataTypeá¸ôä n CommitSwitchén SQL_API_SQLNATIVESQLâõäo SECURITY_LOCAL_SID_AUTHORITYáõäo short_from_ndrã<õäo PRINTER_ENUM_ICON1ã`õäo PRINTER_CHANGE_ADD_FORMâˆõäo SC_MANAGER_MODIFY_BOOT_CONFIGèo SQL_IS_SECOND´õäp versionâØõäp XPT_CLIENT_ADDRESS_SIZEâøõäp SendNotifyMessageAëp IXMLDocument_get_root_Proxyâ<öäq GetCharWidth32Wêq MIDL_FORMAT_STRINGãpöär floormask˜öär FORMAT_MESSAGE_ARGUMENT_ARRAYèr RegDeleteValueãÜöäs EXCEPTION_MAXIMUM_PARAMETERSáôöä s IDC_UPARROWâ÷äs PERF_OBJ_TIME_TIMERâ<÷äs szOID_RSA_SMIMEalgCMSRC2wrapé+s IXMLDOMDocument_createEntityReference_Stubã”÷ät EM_EMPTYUNDOBUFFERã´÷ät RpcProtseqEndpointãÌ÷ä t ALG_SID_CASTâøä(t CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAGâ4øä(t IClassFactory_RemoteCreateInstance_Stubâ\øät IXMLDOMNode_cloneNode_Stubã„øät BINDINFO_OPTIONS_WININETFLAGét MAX_ZONE_DESCRIPTIONá¼øäu _GLYPHMETRICSÜøäu PSCARD_READERSTATEëu PDATATYPES_INFO_1Aã ùäv ERROR_CANT_OPEN_ANONYMOUSèv wFmtáXùäw ERROR_DATABASE_BACKUP_CORRUPTèw CONNECT_REFCOUNTáˆùäx Versionâ ùä x lpOverlappedá´ùä x ST_INLISTèx PSM_INSERTPAGEãìùäy MKF_CONFIRMHOTKEYúäy CLSCTX_INPROC_HANDLER16êy SQL_DATABASE_NAME@úäz POLYTEXTAXúäz PROP_LG_CYDLGèz __IDataFilter_FWD_DEFINED__â úä{ RPC_S_NO_CALL_ACTIVEá¸úä { EVENT_S_LASTáÔúä{ TT_POLYGON_TYPEâìúä{ GWL_HINSTANCEè{ PROV_INTEL_SECãûä| FP_ZEROâ8ûä| numeric_limitsãPûä | otmDescentë| SQL_API_SQLGETSTMTOPTIONáˆûä} INT_MINê} MDM_MASK_EXTENDEDINFOÀûä~ BS_USERBUTTONØûä ~ IOCPARM_MASKé$~ IAsyncRpcChannelBuffer_Receive_Stubâüä Flag_tã<üä PIMAGE_FUNCTION_ENTRYPüä  WriteFileè  MB_ICONHANDâˆüä€ LookupPrivilegeNameAé$€ IDataObject_RemoteGetDataHere_ProxyâÐüä GetAtomNameâðüä EMRSETPOLYFILLMODEë! IPersistMoniker_GetClassID_Proxyá0ýä‚ ENOTTYãPýä‚ sml_devinf_ctdata_sâhýä‚ RegRestoreKey„ýä‚ tagMIDIINCAPSWã˜ýä ‚ hkeyClassè#‚ IRunningObjectTable_IsRunning_Stubãðýäƒ _InitializeThreadDataIndexã þäƒ DBL_MIN_10_EXPã(þäƒ GlobalGetAtomName@þäƒ GDI_NONREMOTElþäƒ __IROTData_INTERFACE_DEFINED__ã þä)ƒ __IInternetSecurityMgrSite_FWD_DEFINED__é ƒ NPSTYLEBUFãäþä!„ ERROR_DS_WRONG_LINKED_ATT_SYNTAXâÿä„ InformationLeveláÿä „ IID_IROTDataé!„ ILayoutStorage_BeginMonitor_Stubáhÿä… IMAGE_REL_IA64_GPREL22ã|ÿä… HRSRC__â ÿä… GetEnvironmentVariableë… KEYEVENTF_EXTENDEDKEYÜÿä† dwMinorVersionãôÿä † TTPOLYCURVEâä† BS_TEXTâ4ä† MIXERCONTROL_CONTROLF_MULTIPLEãXä† RPC_C_IMP_LEVEL_IDENTIFYé† IID_IEnumSTATPROPSTGáä‡ COLOR_DESKTOP¨ä ‡ SignedInfoë‡ ITypeLib2_GetCustData_Proxyâääˆ Sectionâ ä"ˆ COMADMIN_E_COREQCOMPINSTALLED$ä ˆ dmPelsHeightá<ä ˆ PWNDCLASSAãLäˆ _NCBéˆ winbase.h”ä(‰ ERROR_CLUSTERLOG_RECORD_EXCEEDS_MAXSIZEâ¨ä ‰ VTA_LEFTáÈä‰ tagEMRSELECTPALETTEâèä‰ PMCI_WAVE_OPEN_PARMSAáä ‰ remote_nameâä‰ NIF_TIPê*‰ ICatalogFileInfo_GetCatalogFile_ProxyTä Š fOutX|äŠ ERROR_INVALID_TARGET_HANDLEâ¤äŠ GDICOMMENT_WINDOWS_METAFILEâÈäŠ InitiateSystemShutdownëŠ LPOLEVERBôä‹ GetObjectTypeè‹ WN_NOT_AUTHENTICATEDé Œ CryptGenKeyâDä choose_appendlä THREAD_DIRECT_IMPERSONATIONâˆä EMR_SETBKCOLORë LPVIDEOPARAMETERS´äŽ x_tâÔäŽ IMAGE_REL_MIPS_REFLOáèä Ž ciCharsetáä Ž XTYPF_ACKREQéŽ IPropertyStorage_Enum_StubãHä _IMAGE_FUNCTION_ENTRYhä RESOURCE_REMEMBEREDâ„ä tagMCI_SET_PARMSá¤ä MCI_OVLY_WHERE_SOURCEè pboolValáÔä ExceptionHandleré PRODUCT_ID_LENGTHä ‘ IDH_HELPé ‘ tagOLERENDERá8ä’ is_function_impâXä’ DESKTOP_READOBJECTSâtä’ CRYPT_OID_REGPATHœä’ __ICallFactory_FWD_DEFINED__é’ RenameElementÈä “ _wcsnsetáìä“ PFILE_NOTIFY_INFORMATIONáä “ WNDCLASSEXã ä“ DELETEITEMSTRUCTé “ LPSTYLEBUFãXä” IMAGE_SYM_CLASS_FILEáxä” SZDDESYS_ITEM_FORMATS”ä” tagMIDIINCAPSAãÐä1” AsyncIMultiQI_Begin_QueryMultipleInterfaces_Stubé ” V_UNKNOWNREFáä• SZDDESYS_TOPICã ä• PSCARD_T0_REQUESTè• VarR4FromBool`ä– JOB_OBJECT_SECURITY_NO_ADMINáxä – ulOffStartã˜ä– LookupPrivilegeNameWá¸ä– SPI_GETACCESSTIMEOUTé– OLERENDER_DRAWãìä — MCI_WAVE_PCMáä— PARTITION_IFS0ä!— __IMallocSpy_INTERFACE_DEFINED__áLä— DeactivateAndUndoè— OleDestroyMenuDescriptoráˆä ˜ SM_RESERVED4á ä ˜ dwFileDateMSáÄä˜ MIXERLINE_LINEF_ACTIVEãðä ˜ __ITypeComp_INTERFACE_DEFINED__ê˜ SQL_PC_NON_PSEUDO ä™ destroyâD ä™ IMAGE_REL_ALPHA_GPDISPãl ä™ IS_TEXT_UNICODE_NULL_BYTESãˆ ä™ MMSYSERR_BADDBã´ ä ™ PRINTER_NOTIFY_FIELD_SHARE_NAMEâä ä%™ ITypeInfo2_GetImplTypeCustData_Proxyâ ä™ IME_ESC_AUTOMATAé™ SQL_UB_VARIABLEêš MonikerRelativePathToX ä› DMICMMETHOD_NONEát ä› WM_ENTERMENULOOPá ä› MM_STREAM_CLOSEâ¬ ä› PROP_MED_CYDLGë$› __AsyncIUnknown_INTERFACE_DEFINED__â äœ IO_REPARSE_TAG_RESERVED_ONEâ äœ MenuEvent@ äœ MIXERCONTROL_CT_CLASS_SLIDERéœ IXMLElement2_get_text_Proxy†ä SM_RESERVED1á” ä VOS_OS232° ä NumberMediaSidesé EMBDHLP_DELAYCREATEâø äž __uninitialized_copy_helperâ ä ž equal_rangeâ0 äž SEC_E_INTERNAL_ERRORáH ä ž HC_GETNEXTã` ä ž PWNDCLASSWãx ä ž SM_RESERVED2á ä ž timeSetEventá¨ ä ž PROV_STT_MERéž tagDISCARDCACHEâÜ ä Ÿ CBR_128000ä äŸ DI_ROPS_READ_DESTINATIONá ä Ÿ SM_RESERVED3á8 äŸ PMCI_WAVE_OPEN_PARMSW` äŸ PCRYPT_KEY_SIGN_MESSAGE_PARAát äŸ MK_ALTã˜ äŸ SQL_COLUMN_AUTO_INCREMENTèŸ SQL_POSITION_TOâÈ ä  DM_COPYâà ä   RevertToSelfáü ä  VK_OEM_FJ_LOYAãä  PDERR_PRINTERCODESë  MCI_ANIM_PUT_DESTINATIONáTä¡ BITSPIXELhä¡ BS_BOTTOM€ä ¡ STN_ENABLEã˜ä¡ MoveFromDriveè¡ SC_GROUP_IDENTIFIERAáÐä ¢ FileHeaderãìä¢ RpcStringFreeAã ä¢ CERT_RDN_FLAGS_MASKê¢ PRINTER_ERROR_OUTOFPAPERáXä"£ CMSG_ENVELOPE_ALGORITHM_PARAM€ä£ PCRYPT_PASSWORD_CREDENTIALSê£ HCERTCHAINENGINEá¸ä¤ LPRUNNABLEOBJECTé$¤ IOleInPlaceFrame_SetStatusText_Stubâä¥ SQLFetchScrollë¥ SQL_CATALOG_USAGE4ä¦ MCI_WHEREXä¦ RPC_C_BINDING_MAX_TIMEOUTä,¦ AsyncIAdviseSink_Finish_RemoteOnClose_Proxyê¦ IME_SMODE_PHRASEPREDICTâÐä§ PIPE_TYPE_BYTEãðä§ ERROR_DS_INIT_FAILUREä § BST_CHECKEDâ$ä§ ENABLE_ECHO_INPUTè"§ OleConvertIStorageToOLESTREAMlä¨ __pointer_plus_bitã„ä ¨ SmlStatus_tâœä¨ DMPAPER_ENV_9è¨ SPI_SETDESKPATTERNë© UuidFromStringãüäª SUBLANG_GERMAN_AUSTRIANâ äª DlgDirSelectComboBoxExWâ<äª JOY_CAL_READUONLYdä"ª IOleCache2_DiscardCache_Proxy”ä*ª IOleInPlaceSite_OnPosRectChange_Proxy°äª PARSE_LOCATIONë ª _bearermodeâää« LDBL_MAX_10_EXPâä« IMAGE_SYM_CLASS_FUNCTIONá(ä« SCARD_E_NO_SMARTCARDé« IID_IDirectWriterLock`ä ¬ _MSLCONFIGã|ä¬ IMAGE_ARCHIVE_END˜ä¬ lpStartAddressã°ä ¬ CS_NOCLOSEãÐä¬ PCCERT_CHAIN_CONTEXTáèä¬ NdrSH_IfAllocä!¬ IMallocSpy_PostHeapMinimize_Stubé¬ URLACTION_SHELL_VERBáLä® VK_OEM_PERIODdä® PCWPRETSTRUCTä® IOleObject_SetClientSite_Proxyë® ITypeInfo_GetTypeAttr_StubãÌä¯ LC_ALLãìä¯ AddAccessAllowedAceâä ¯ GRAY_BRUSHãä ¯ WM_PASTEé¯ MCI_OVLY_LOAD_PARMSAáTä° TokenPrimaryGrouppä° DSSPRIVKEY_VER3âœä ° CMSG_ENVELOPED_DATA_CMS_VERSIONâÄä° CCERT_STORE_PROV_FIND_INFOë° PDRIVER_INFO_1ã ä± ERROR_INSTALL_PACKAGE_REJECTEDã<ä#± ERROR_DS_SAM_NEED_BOOTKEY_PASSWORDë± TYSPEC_FILENAMEâlä ² inserteráˆä² const_mem_fun1_tá ä ² SmlReplace_tá¼ä² XPT_DOC_TYPE_SIZEèä ² ERROR_VOLUME_CONTAINS_SYS_FILESãä ² HWND_TOPMOSTáä² PDRIVER_INFO_3ë ² SetClassáPä³ iFSGrafEffectColorãpä³ RpcSmEnableAllocateâŒä³ PDRIVER_INFO_2ã´ä³ ITypeMarshal_Marshal_ProxyãÜä³ IXMLElement2_put_text_Proxyâüä³ RegisterMimeFilterë³ LPPAGESETUPHOOKâ8ä´ BATTERY_FLAG_CHARGINGPä´ WS_OVERLAPPEDpä´ LZERROR_UNKNOWNALGãŒä´ RpcStringFreeWã¬ä´ IOCTL_DISK_RELEASEãÈä´ PDRIVER_INFO_5ãä4´ AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Stubâ$ä´ ITypeChangeEventsè´ SQL_C_SBIGINTXäµ dwStreamNameSizeáläµ dwYSizeâŒäµ BatteryLifePercentã´äµ sz_CERT_STORE_PROV_SYSTEM_Wêµ PDRIVER_INFO_4ãøä¶ _MSL_FORCE_ENUMS_ALWAYS_INTâä¶ charTè¶ lpfnPageSetupHookPä· JobObjectBasicLimitInformationãpä· OF_SHARE_DENY_WRITEâ”ä· DNS_ERROR_INVALID_NAMEã´ä· NumberStorageElementsÐä· PDRIVER_INFO_6ãôä· URLACTION_SHELL_CURR_MAXé· SC_GROUP_IDENTIFIERWá4ä¸ LR_COPYFROMRESOURCEâHä ¸ CP_SYMBOLè ¸ dwFileDateLSáŒä&¹ ERROR_DS_CONFIDENTIALITY_REQUIRED¬ä¹ MCI_OVLY_LOAD_PARMSWé ¹ PIN_ADDRáÔäº __reverseôäº IMAGE_SYM_TYPE_LONGâäº MB_SYSTEMMODALã(äº WNetCloseEnumèº SQL_ATTR_TXN_ISOLATIONãdä» TRANSFORM_CTMxä» bcWidthâä» EMR_RESTOREDC¤ä» MIXERLINEÄä» RpcSmSetThreadHandleáàä» PROP_MED_CXDLGë » CALPWSTRáä¼ DlgDirSelectComboBoxExAê ¼ IUrlMon_AsyncGetClassBits_Proxyâhä½ TAPE_DRIVE_REPORT_SMKSã€ä ½ WINSPOOLAPIê ½ ICodeInstallá¸ä¾ SORTVERSIONFROMLCIDâØä¾ SPI_SETACCESSTIMEOUTé¾ PRINTER_NOTIFY_OPTIONS_TYPEâä ¿ denorm_minã8ä¿ SUBLANG_AZERI_LATINâLä¿ ne_segtab`ä¿ AF_LATã|ä¿ EndCylinderNumberè¿ IStorage_OpenStream_Proxy¸ä À caRedGammaãàäÀ RPC_C_PROFILE_MATCH_BY_BOTHâøä À IRootStorageéÀ SQL_SFKD_CASCADEá<äÁ ERROR_DS_DRA_MISSING_PARENTâXäÁ R2_NOTMERGEPENãxäÁ SPI_GETMOUSETRAILSë Á cbElementsã´ä _REPARSE_GUID_DATA_BUFFERÐä HEAP_MAXIMUM_TAGáüä ITypeInfo_RemoteGetNames_Proxyã( ä& IXMLDOMElement_setAttribute_Proxy@ ä SQL_C_DEFAULTè SQL_FN_STR_OCTET_LENGTHâ„ äà SUBLANG_ARABIC_KUWAIT˜ äà EndHeader´ äà GetTapePositionâÈ äà VK_NEXTâÜ äà WM_MOVINGü äà CERT_FIND_ISSUER_ATTR !äà _CHANGER_EXCHANGE_MEDIUMáH!äà __IAuthenticate_FWD_DEFINED__è(à __ISupportErrorInfo_INTERFACE_DEFINED__â”!ä Ä TokenSourceâÀ!ä!Ä IXMLHttpRequest_get_status_ProxyéÄ SQLExecDirectWãü!äÅ ERROR_DS_DRA_SHUTDOWN"äÅ LPMCI_WAVE_OPEN_PARMS8"äÅ SHGNLI_PREFIXNAMEè Å szCardNameëÆ FILE_DEVICE_SERIAL_PORTê#Ç IXMLDocument2_get_readyState_Proxyã´"ä È WIN32à"äÈ IXMLDOMNode_insertBefore_ProxyëÈ VarFormatPercentá$#äÉ ERROR_INVALID_MSGBOX_STYLEã@#äÉ SEC_E_NOT_OWNERâX#ä É WH_MINHOOKãx#äÉ LPMCI_STATUS_PARMSã˜#äÉ FUNCFLAG_FDEFAULTBINDÈ#ä%É IInternetZoneManager_GetZoneAt_ProxyéÉ SQL_DS_DROP_SCHEMAãø#ä Ê _TEMP$äÊ IMAGE_SYM_TYPE_FLOATá4$äÊ szOID_SUR_NAMEë Ê Begin_Pushãh$äË _OSVERSIONINFOEXAè Ë OpenDesktopAá”$ä Ì CS_OWNDCá°$äÌ RegisterHotKeyãÐ$äÌ _PRINTER_ENUM_VALUESAè$Ì ICreateTypeInfo_SetTypeIdldesc_Stubâ%ä Í __dolphin_osá,%ä Í strncmpiéÍ ??_7IInternetProtocolSink@@6B@ã|%äÏ SE_SYSTEM_PROFILE_NAMEã˜%äÏ _TOKEN_PRIVILEGESÀ%äÏ TAPE_DRIVE_GET_LOGICAL_BLKãÔ%äÏ Rectangleä%ä Ï styleü%ä Ï WM_MBUTTONUPá&äÏ pvEncryptionAuxInfoêÏ SQL_LOCK_NO_CHANGEãT&äÐ IPPORT_SUPDUP|&äÐ PFN_FREE_ENCODED_OBJECT_FUNCéÐ OBJECTDESCRIPTORá¼&äÑ FILE_ATTRIBUTE_ARCHIVEãä&äÑ IMAGE_COMDAT_SELECT_NEWESTãü&ä Ñ NUMBRUSHESã'äÑ PPCMWAVEFORMATëÑ CMSG_CTRL_DEL_SIGNERá`'ä"Ò ERROR_LOGON_SESSION_COLLISIONx'ä Ò TC_OP_STROKEá'ä Ò BINDSTATUSëÒ SQLExecDirectAãÀ'äÓ set_unionÔ'äÓ locURIãø'äÓ ERROR_SETMARK_DETECTEDã(äÓ PMCI_ANIM_WINDOW_PARMSã8(äÓ NonCachedReadsãT(äÓ LPSERVICEPROVIDERèÓ SQL_ATTR_RETRIEVE_DATAãŒ(ä Ô tagACCELá¬(äÔ DVASPECT_THUMBNAILãÈ(äÔ FILE_DEVICE_SMBâà(ä Ô IsConnectedê.Ô SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE<)äÕ PCERT_AUTHORITY_KEY_ID2_INFOád)äÕ CRL_REASON_REMOVE_FROM_CRLã€)äÕ PROXY_UNMARSHALâ¤)äÕ SCARD_PROTOCOL_UNDEFINEDáÔ)ä&Õ IXMLElementCollection_get_length_Stubè"Õ BINDINFOF_URLENCODEDEXTRAINFO*äÖ IMAGE_NT_HEADERSá8*äÖ CreateObjrefMonikerâl*ä'Ö __IXMLDOMEntityReference_FWD_DEFINED__ë'Ö IXMLDOMNamedNodeMap_get__newEnum_Proxyã¼*ä× pszHeaderSubTitleØ*ä× LPWININETHTTPINFOè × SQL_C_SHORTâ+äØ decode_mb,+äØ PERF_COUNTER_MULTI_TIMER_INVáL+äØ _MIDL_STUB_MESSAGEãt+äØ FILE_DEVICE_FULLSCREEN_VIDEOéØ SQL_MAX_COLUMNS_IN_INDEXéÙ VOS_OS216À+äÚ FiberDataì+ä!Ú IS_TEXT_UNICODE_NOT_UNICODE_MASKá ,äÚ _PRINTER_ENUM_VALUESW4,äÚ IRpcProxyBuffer_Connect_StubáH,äÚ syskindêÚ SQL_BS_ROW_COUNT_PROC„,äÛ ReadProcessMemory ,äÛ DRAGDROP_E_FIRSTá¼,äÛ LPDRAWTEXTPARAMSáÐ,äÛ h_aliasesì,äÛ JOB_STATUS_PAUSED-äÛ IXMLDOMCommentëÛ URLACTION_SHELL_MINâH-äÜ IMAGE_SYM_UNDEFINEDê Ü GW_OWNERáx-äÝ _MSL_MATH_X87_Hâ”-äÝ _OSVERSIONINFOEXW°-äÝ LPBITMAPV4HEADERáÈ-ä Ý SB_LINEDOWNâì-äÝ ActivateKeyboardLayoutã.ä Ý OpenDesktopWá$.äÝ CLIENTCREATESTRUCTã<.ä Ý iMinAnimateâ`.äÝ SCARD_READER_TYPE_SERIALá„.äÝ __IUrlMon_FWD_DEFINED__â´.ä$Ý ISequentialStream_RemoteWrite_ProxyêÝ IID_ISynchronizeHandleãô.äÞ denorm_presentã /ä Þ sml_sync_sã$/äÞ CTRY_MALAYSIAD/äÞ FNERR_SUBCLASSFAILUREd/äÞ PCRYPT_CREDENTIALSëÞ LPCREATETYPELIB2é ß wfstreamá´/äà WT_EXECUTEONLYONCEãÈ/ä à SBS_HORZáä/äà tagMULTIKEYHELPAáü/äà CTRY_VIET_NAM0ä à formatIndexêà SQL_DIAG_DROP_VIEWãT0äá GetProcessIoCountersáx0äá FRS_ERR_STOPPING_SERVICEá”0äá tagPALETTEENTRYâ¸0äá CB_GETHORIZONTALEXTENTãè0ä*á CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO1äá RecoveredReadsã$1äá IID_AsyncIAdviseSink2X1ä(á ICreateTypeInfo_SetFuncHelpContext_Stubêá SQL_ROW_IDENTIFIERëâ RpcNsGroupMbrInqNextAèã PostThreadMessageWãÌ1ää _P_DETACHè1ää PEMRPOLYLINE16ã2ää CMSG_SIGNER_CERT_INFO_PARAMê ä tagSTGMEDIUMáP2äå __MSL_CALLINGCONV_WIN32_H_ãt2äå IMAGE_SCN_ALIGN_64BYTESâˆ2äå HMENU__â¨2äå ERROR_PATH_NOT_FOUNDáÀ2ä å METARECORDãØ2ä å dwLayerMaskâø2äå RpcNsBindingExportPnPèå DRIVER_KERNELMODE(3ä æ dwContextèæ Mft2WritesLazyWriteráh3äç MCI_VD_STEP_FRAMESã”3ä"ç IInternetProtocolRoot_Start_Proxyèç SQL_PT_FUNCTIONâÔ3äè IsProcessorFeaturePresentè3äè LC_STYLED4äè WM_MEASUREITEMã4ä è SOUNDSENTRYâ44ä è CTRY_GERMANYáX4äè RpcAsyncInitializeHandleáp4äè LoadTypeLibExè è CHOOSEFONTWêé SPI_SETMOUSETRAILSãÐ4ä"ê EXCEPTION_INVALID_DISPOSITIONð4äê PMIXERCONTROLDETAILSá5äê TYPEFLAG_FDISPATCHABLEã@5ä&ê IXMLDOMElement_getAttribute_ProxyT5ä ê V_UINTREFè ê cmath|5ä ë MajorVersioná¤5äë ERROR_DS_DRA_SOURCE_DISABLEDáÀ5äë MCI_MODE_PAUSEãÜ5äë CMSG_DATA_FLAGã6ä&ë IFillLockBytes_RemoteFillAt_Proxy,6äë IDataObject_GetData_Stubéë SQL_SCCO_READ_ONLYãd6ä ì otmMacAscentáˆ6äì RpcStringBindingParseWã¤6äì HandsOffStorageêì SQLProcedureColumnsWáØ6äí SW_SHOWNAì6ä í PMMCKINFOá7ä í name_numéí ADDJOB_INFO_1Aã<7äî OpenWindowStationAãd7äî RPC_C_OPT_SECURITY_CALLBACKâ„7äî CHANGER_SET_POSITIONá 7äî CLSID_CSystemPage´7äî pulValë î dwOutFlagsãÜ7ä ï ctimeü7äï EMRSCALEWINDOWEXTEXê&ï CERT_UNICODE_VALUE_ERR_INDEX_MASK88äð LnSzá\8äð MCIERR_BAD_TIME_FORMATãx8äð PP_SIGNATURE_ALGéð STGFMT_STORAGEã¬8äñ META_SETPIXELÐ8äñ CryptSignMessageWithKeyâä8äñ uintValêñ BINDF_ASYNCSTORAGEã,9ä"ò ERROR_DISK_RECALIBRATE_FAILEDX9ä ò ERROR_INSTALL_REMOTE_DISALLOWEDêò OLEMISC_SUPPORTSMULTILEVELUNDOã¤9äó GetCurrentThreadIdãÀ9äó CONTEXT_OID_PKCS7èó CLSID_SoftDistExtá:äô is_dynamically_allocatedá:äô smlFreeMetinfMemá8:äô xptGetProtocolã`:äô TAPE_DRIVE_SEQUENTIAL_FMKSã€:äô WSA_QOS_EFILTERSTYLEá¬:äô EVENT_E_ALL_SUBSCRIBERS_FAILEDãÌ:äô RpcNsGroupMbrInqNextWè:äô PSM_REBOOTSYSTEMâ;äô FUNC_DISPATCHèô BINDSTATUS_BEGINUPLOADDATAãH;äõ PostThreadMessageAã`;ä õ IDLFLAG_FINê õ LPOLESTREAMâˆ;ä ö _tell¤;äö tagMULTIKEYHELPWáÄ;äö ID_PSRESTARTWINDOWSâô;ä#ö ICreateErrorInfo_SetHelpFile_Proxyëö SQL_SSF_UPPER$<ä ÷ insert_multiáD<ä÷ PSINJECT_PAGENUMBERâX<ä ÷ FW_HEAVYál<ä÷ EM_UNDOâ€<ä ÷ Positioné÷ URLOpenPullStreamÐ<ä(ø IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVERâô<äø WT_EXECUTEINWAITTHREADã=äø DM_ORIENTATIONã0=äø OpenWindowStationWãL=äø SWP_NOREPOSITIONál=äø tMIXERCONTROLDETAILSáˆ=äø TYPEFLAG_FHIDDENé ø SQL_CVT_GUIDéù CRYPT_IMPL_REMOVABLEáä=äú IMAGE_REL_PPC_ABSOLUTEãô=ä ú dmNup>äú RpcStringBindingParseAëú SQLProcedureColumnsAáX>äû _MSL_DO_NOT_INLINEãp>ä û wHighVersionáˆ>äû dwPromptFlags¤>äû NDR_BIG_ENDIANãÀ>äû ADDJOB_INFO_1WãÔ>ä û VarCyAbsé û V_DISPATCHã ?äü WINSTA_ENUMDESKTOPSâ,?äü CERT_KEY_SPEC_PROP_IDèü IRecordInfo_RecordCreate_Proxyãp?ä ý PrepareTapeâ”?äý LCS_WINDOWS_COLOR_SPACEâ°?äý CERT_OID_NAME_STRèý FULL_PTR_TO_REFID_ELEMENTø?äþ LOCALE_INEGSYMPRECEDESã@ä þ get_baseNameé þ CHOOSEFONTAâ<@ä ÿ copysignáX@äÿ FIND_NAME_BUFFERé ÿ SQLBindColãŒ@å FILLER_SUPPORTã¤@å __mcore_bareáÀ@å GetModuleHandleâè@å ERROR_DS_NAME_VALUE_TOO_LONGâAå lfOrientationAå rgrcê SafeArrayCreateVectorExâTAä SecurityLimitFlagsãtAä DNS_ERROR_BAD_PACKETá”Aä VIEW_S_ALREADY_FROZEN°Aä PMIXERCONTROLWë MSG_OOBâÜAä  S_WHITEVOICEâBä SHInvokePrinterCommandWê  CERT_CHAINã0Bä  FILENAME_MAXáTBä SetProcessAffinityMaskãpBä SetMessageQueueâœBä& MIXERCONTROL_CONTROLTYPE_UNSIGNED°Bä  CALG_MACáÄBä  pvSubjectè SCardLocateCardsAôBä  VK_FINALá Cä  DT_CALCRECTâ Cä booleanâDCä MDM_PROTOCOL_V110_4DOT8Ké SQL_NO_ACTIONpCä BlockSize”Cä PTAPE_CREATE_PARTITIONã¤Cä  iIconÐCä  _CERT_CHAIN_FIND_BY_ISSUER_PARAâðCä PropSheet_IndexToHwndè" IXMLDocument_get_doctype_Stub smlFreePcdataList¤aä> GMEM_VALID_FLAGSáÀaä> waveInAddBufferê> CERT_KEY_AGREEMENT_KEY_USAGEáøaä? sortábä ? mmioRenameAê'? IBindStatusCallback_OnStopBinding_StubãTbä @ fputslbä @ smlLibStrdupá€bä@ Bufferã”bä @ BM_CLICKá¬bä @ iScrollWidtháÐbä@ MCIERR_WAVE_INPUTSINUSEê@ SQLGetDescFieldWéA CreateDCAcä B LoadLibraryâ8cäB PEMRPOLYBEZIERTO16ã`cäB CERT_DECIPHER_ONLY_KEY_USAGEéB SQLCreateDataSourceêC DMPAPER_EXECUTIVE°cäD first_ãÔcäD COMADMIN_E_OBJECTINVALIDáðcäD RDW_INTERNALPAINTdäD MCIERR_WAVE_OUTPUTSINUSEá0däD SCARD_IO_REQUESTé D GetFieldáldäE IStorage_CreateStream_StubëE dwServiceSpecificExitCode´däF PAN_PROP_VERY_EXPANDEDãÐdäF SetWindowTextWëF SQL_API_SQLFREESTMTâ(eä,G ??_C?0??what@bad_typeid@std@@UBEPBDXZ@4QBDBâHeäG RPC_S_CALL_CANCELLEDádeäG otmsCharSlopeRise€eäG EnumPrinterKeyë G Field¸eäH IMAGE_DEBUG_TYPE_EXCEPTIONãÌeäH EMR_ARCTOìeäH ALG_SID_SAFERSK128ãfäH szOID_SORTED_CTLá,fäH CRYPT_POLICY_OID_GROUP_IDHfäH CERT_TRUST_STATUSèH SQL_C_VARBOOKMARK|fäI shuffle_rangefä I nChannelsèI ICreateTypeLibãÈfäJ CONTEXT_SEGMENTSéJ CRYPT_DECRYPTøfä K OLE_E_ADVFëK OLE_E_CLASSDIFFâ$gäL LONGá __GREATERTHANëä > e32_dirtabã,ëä > OEM_CHARSETâLëä> GetKeyboardLayoutListè> IOleObject_GetUserType_Stubâ”ëä? SetForegroundWindowâ¬ëä ? DrawIconExë? SQL_DIAG_UPDATE_WHEREàëä@ streamoffôëä@ EV_ERRã ìä @ META_POLYGONá0ìä@ _MIDL_STUBLESS_PROXY_INFOdìä'@ IExternalConnection_AddConnection_Stubë @ ITypeInfo_GetImplTypeFlags_Stubâ ìäA wctobè A elfVersionãÈìä B PHKEYäìäB szOID_OIWDIR_md2éB AddSynchronizeëC TAPE_DRIVE_CLEAN_REQUESTS8íäD lstrcmpiAPíä D LPTEXTMETRICápíäD _MENU_EVENT_RECORDëD MDM_PROTOCOL_V110_2DOT4Ká°íäE smlAllocDevInfExtÌíäE SidTypeInvalidãèíäE CoCreateInstanceé E GUID_CUSTOM_CONFIRMOBJECTSAFETYâ(îäF EFAULTã<îäF PST_RS422PîäF dwMaxBaudlîäF FormatMessageWãŒîäF FRS_ERR_SERVICE_COMMá´îäF IViewObject_GetAdvise_StubëF SetUrlPolicyPermissionsâôîäG _MSL_INT32_TYPEâïäG smlFreeDevInfExtá$ïäG PST_RS4238ïäG WM_HELPâPïä G SIZE_MAXSHOWé G AddPrinterAâ€ïä H BAUD_19200ã´ïä'H PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFOëH PIDMSI_SUPPLIERâäïäI _fseekãøïäI KF_REPEATðäI PCERT_EXTENSIONâ,ðä I OffsetArrayâ`ðä'I IXMLHttpRequest_get_responseBody_ProxyëI VarDecFromIntŒðä J exponentá ðä J includesá¸ðä J bV4SizeImageáÜðäJ TIME_CALLBACK_FUNCTIONãøðäJ ASSERT_ALTERNATEá$ñä!J ICreateTypeLib2_SetCustData_StubéJ SQL_SR_UPDATE_COLUMNáXñä K max_childè"K __IClassFactory_FWD_DEFINED__ ñäL ERROR_DS_LOOP_DETECTá¸ñä L SS_RIGHTJUSTáÜñäL CRYPTPROTECT_PROMPTSTRUCTòä"L SOFTDIST_FLAG_DELETE_SUBSCRIPTIONèL VarI2FromBoolè M FW_SEMIBOLDâLòäN removeã\òäN nodeáxòäN TerminateProcessá òä"N RPC_S_UNSUPPORTED_AUTHN_LEVELÈòäN ERROR_DS_ATT_ALREADY_EXISTSâôòä!N ERROR_DS_SAM_NEED_BOOTKEY_FLOPPYéN MIXERLINE_TARGETTYPE_UNDEFINEDã0óäO IIDâXóä"O GetPrivateProfileSectionNamesxóäO PAN_SERIF_OBTUSE_COVEóäO CP_THREAD_ACP°óäO RpcAsyncGetCallHandleÀóä O ulValàóäO put_resolveExternalséO SQL_INDEX_HASHEDáôäP FormatMessageAã8ôäP PEMRINTERSECTCLIPRECTèP QICâlôäQ SCardForgetReaderGroupã„ôä Q PSWIZB_NEXTâœôä Q AddPrinterWêQ StgOpenStorageExáìôä(R PJOBOBJECT_BASIC_ACCOUNTING_INFORMATIONãõäR lstrcmpiW0õä#R COMADMIN_E_COMPFILE_NOTINSTALLABLEãLõäR BS_MONOPATTERNãhõäR destination_addréR CMSG_OID_EXPORT_MAIL_LIST_FUNCã´õäS _abnormal_terminationÌõäS SC_SCREENSAVEèõäS SPIF_SENDCHANGEâöäS FKF_FILTERKEYSONá4öä%S ITypeInfo_RemoteCreateInstance_ProxyéS PIDSI_REVNUMBERâdöä T EXTERN_Cá„öäT HEAP_MAKE_TAG_FLAGSâœöä T NPTEXTMETRICé'T IXMLDOMDocumentType_get_notations_Stubãøöä"U PSECURITY_IMPERSONATION_LEVEL$÷ä&U JOBOBJECT_BASIC_LIMIT_INFORMATION8÷äU ne_cmodâ\÷äU SERVICE_ERROR_CRITICALã|÷äU szOID_OIWSEC_shaRSAê"U CRL_DIST_POINT_ERR_INDEX_MASKÌ÷äV CRYPT_E_UNEXPECTED_MSG_TYPEâà÷äV PatBltãü÷äV szOID_RSA_RC2CBCéV _LPBINDHOST_DEFINEDâ0øäW maxsizeâHøä W PCF_DTRDSRãhøäW SEC_E_INVALID_HANDLEé W rgbtBlueá¬øä*X ?$basic_ios@_WU?$char_traits@_W@std@@Äøä X offBitsMaskâØøäX dwFormatsøøäX CERT_FIND_ISSUER_STRéX PI_MIMEVERIFICATIONâPùä,Y ?$basic_streambuf@_WU?$char_traits@_W@std@@âhùä Y ?$__char@$00á„ùäY WNNC_CRED_MANAGER¨ùäY CRYPT_ACQUIRE_CACHE_FLAGéY CC_PASCALÐùäZ LimitHiâèùä Z SW_RESTOREäúä Z FullPtrRefIdéZ FILE_DEVICE_STREAMSâ8úä [ ?$__char@$02áXúä[ MOUSEEVENTF_RIGHTUPâxúä[ CreateIconIndirectãúä [ midiOutGetIDé [ ReportResultáÄúä\ LPCOMMTIMEOUTSãäúä\ ERROR_INVALID_SEGDPLâûä\ LPBITMAPCOREINFOáûä\ GB2312_CHARSETã@ûä\ SetUserObjectInformationáTûä\ MOD_SHIFTlûä\ MCI_MODE_PLAY„ûä \ SCardControlá˜ûä \ NODE_TEXTè*\ __MIDL_itf_propidl_0000_v0_0_s_ifspecèûä] MAXLOGICALLOGNAMESIZEáüä ] DDL_ARCHIVEâüä] wireHDCâLüä-] __IReleaseMarshalBuffers_INTERFACE_DEFINED__áhüä] tagSTDMSHLFLAGSâ„üä] CFSTR_MIME_X_WAVé ] CHOOSEFONTã´üä^ RELEASE_MONTHÐüä^ SizeOfHeapReserveðüä^ DNS_ERROR_SECURE_BASEýä^ DFCS_BUTTONRADIOMASKá0ýä^ IsCharAlphaNumericë ^ GetScrollPosá`ýä _ ?$__char@$06é_ DNS_WARNING_DOMAIN_UNDELETEDá¤ýä` SmlMetInfAnchor_tÐýä ` IMAGE_SYM_CLASS_MEMBER_OF_UNIONãþä#` _IMAGE_IA64_RUNTIME_FUNCTION_ENTRYã$þä` ERROR_REVISION_MISMATCHâLþä` FROM_LEFT_3RD_BUTTON_PRESSEDé` NDR_NOTIFY_ROUTINEãˆþäa GCPCLASS_HEBREWâ¤þäa WNNC_NET_FTP_NFSáÀþäa MCIERR_FILE_READáèþäa PFN_CERT_STORE_PROV_WRITE_CTLèa URLPOLICY_JAVA_MEDIUM ÿä b rdFunctionã4ÿäb SB_LEFTâPÿäb WM_PAINTCLIPBOARDlÿäb C2_ARABICNUMBERâ„ÿä b CTRY_MONACOâ¨ÿäb RpcSmDestroyClientContextèb IErrorInfo_GetGUID_Stubâàÿäc WB_LEFTâä'c szOID_PKIX_POLICY_QUALIFIER_USERNOTICEã4äc PropSheet_UnChangedâ`ä"c IEnumSTATPROPSTG_RemoteNext_Proxyèc SQL_IS_INTEGERã˜äd _IC_PROJECTIVEã´äd HP_TLS1PRF_LABELéd SQL_DL_SQL92_INTERVAL_SECONDáôä e smlFreeSyncâäe xptReceiveDataë e ExtCreatePenáLäf GetEnhMetaFilePixelFormatdäf EMRSETBKCOLOR|ä f _BYTE_BLOBã˜äf _DRIVER_INFO_6Aêf IXMLElement2_put_text_StubãÐä g logblàäg logláüäg LPD_TRANSPARENTâä g FVIRTKEYá(ä g SBM_SETRANGEáHäg CertFindCRLInStoreëg __ITypeInfo_FWD_DEFINED__è6h AsyncIMultiQI_Begin_QueryMultipleInterfaces_ProxyÌäi ??_Gbad_cast@std@@UAE@I@ZÜäi logbáüäi float_denorm_styleã äi IS_TEXT_UNICODE_SIGNATURE8ä i MARKPARITYãXäi RPC_E_DISCONNECTEDãläi SetBkModeŒäi LCID_ALTERNATE_SORTSéi ICreateTypeInfoâÀä j PARITY_EVENâØäj GlobalDiscardìä j RGN_COPYé j bstrSourceãä k LB_SETCURSELék guiddef.hXäl ERROR_LOGIN_TIME_RESTRICTIONél SQL_PRED_CHAR€ä m logbfäm logfá¨ä m NTM_REGULARâÀä m WM_INITMENUâÜäm PCMSG_SIGNER_INFOäm IPersistStorage_Load_Proxyëm CLSID_ComBindingáHä"n ERROR_DS_CONFIG_PARAM_MISSINGdän WSA_E_CANCELLEDâ„än VIF_CANNOTDELETECURâ°ä n MIXERCONTROL_CONTROLTYPE_VOLUMEâÄän dwItemën IViewObject_SetAdvise_Stubëo VerSetConditionMaskâ4äp JOB_OBJECT_UILIMIT_HANDLESãXäp GCPCLASS_NUMERICSEPARATORxäp CAL_SABBREVMONTHNAME6œäp CERT_RDN_VIDEOTEX_STRINGá¸äp _DRIVER_INFO_6Wâàäp IBindCtx_GetObjectParam_Stubé+p IXMLDOMDocument_getElementsByTagName_Proxyã0ä q SmlAtomic_tâXä"q ERROR_SERVER_HAS_OPEN_HANDLESxäq CAL_SABBREVMONTHNAME7è$q SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTHâÈär SetTokenInformationâàä r GetCharWidtháøär GetUpdateRectär CAL_SABBREVMONTHNAME48är RESOURCE_CONNECTEDër RPC_NOTIFICATION_TYPESãpä s _strnsetáäs CAL_SABBREVMONTHNAME5¤ä s MCI_COPYáØä*s IXMLDOMDocument_put_ondataavailable_Proxyè1s IInternetProtocolSinkStackable_CommitSwitch_Stubá4 ät CAL_SABBREVMONTHNAME2èt CertSerializeCRLStoreElementál ä u lconvˆ äu WS_CLIPCHILDRENâ  ä u CharPrevExAêu CAL_SABBREVMONTHNAME3Ô äv getegidâô äv VER_SUITE_TERMINALã äv IMAGE_OPTIONAL_HEADER$ äv Pieâ@ äv VP_FLAGS_CONTRASTX äv PKCS_UTC_TIMEt äv MDM_X75_DATA_128Kèv SQL_FETCH_ABSOLUTE㨠äw atanhlãÌ äw WINSTA_ACCESSGLOBALATOMSáì äw CAL_SABBREVMONTHNAME1á äw _loaddsâ ä w KeyId( ä w RunsReturnedéw IEnumOLEVERB_Clone_Stubâl äx SML_FIRST_FREE_ITEMêx CertSerializeCTLStoreElementá° äy smlAllocSequenceáà ä$y CONVERT10_E_OLESTREAM_BITMAP_TO_DIBâô ä y PTIMECAPSè%y ISynchronizeMutex_ReleaseMutex_ProxyáD äz PCRYPT_CONTENT_INFOêz PRINTER_ERROR_JAM„ ä{ SUBLANG_ARABIC_LEBANON㤠ä{ ERROR_ALREADY_EXISTSá¼ ä { NO_ADDRESSãØ ä{ RemotableHandleê{ MDMSPKRFLAG_OFFâ ä| AreAnyAccessesGranted4 ä| ERROR_INVALID_NAMEãL ä | DM_FORMNAMEâx ä!| __IRpcHelper_INTERFACE_DEFINED__á ä | IXMLElementê)| ITypeInfo2_RemoteGetDocumentation2_ProxyáØ ä} atanhfë} SERVICE_ACCEPT_SHUTDOWNâä~ CAL_SABBREVMONTHNAME8<ä~ RPC_IMPORT_CONTEXT_Pé~ IPropertySetStorage_Enum_Proxyã„ä SetSwapAreaSizeâœä  GetTextColorá¼ä CAL_SABBREVMONTHNAME9è CRYPT_DONT_CACHE_RESULTâðä€ posâä€ cScansë € C3_DIACRITICá4ä DATA_S_LASTâTä PDERR_DNDMMISMATCHãlä MAX_MONITORSá”ä FILE_DEVICE_DISK_FILE_SYSTEMá°ä GetPrinterDataExWÔä IME_SMODE_PLAURALCLAUSEê SQLGetTranslatorWä ‚ MONHSZSTRUCTá,ä‚ ___MISSING_ALIGNMENT__ë‚ SQL_FN_STR_LOCATE_2âtäƒ ERROR_PASSWORD_MUST_CHANGEãäƒ PERF_SIZE_LARGEâ¬äƒ CERT_FIND_HASHãÌäƒ PRINTER_CHANGE_PORTâøäƒ IPersistStream_GetSizeMax_Stubãäƒ IID_IOleAdviseHolderéƒ URLZONE_INTERNETáDä„ powâdä„ DISP_CHANGE_BADFLAGSáˆä„ NdrByteCountPointerFreeâ¤ä„ SCS_CHANGECLAUSEáÌä„ SQL_QU_PRIVILEGE_DEFINITIONê„ SQL_ISV_USAGE_PRIVILEGESé… SUBLANG_ENGLISH_USã8ä† PROVIDER_KEEPS_VALUE_LENGTHâPä † ST_ISLOCALãpä† CMSG_CTRL_DEL_CERTãŒä† _DRIVER_INFO_1Aâ ä † AddPortWáÀä† HICON_UserUnmarshalâèä† URLACTION_HTML_USERDATA_SAVEáä† SQL_DRIVER_HLIBê† SQL_ASYNC_MODEãDä‡ IMAGE_REL_I386_DIR32NBã`ä‡ VK_OEM_NEC_EQUALé‡ SectorsPerTrackâ¬ä#ˆ JOB_OBJECT_LIMIT_PRESERVE_JOB_TIMEãÄä ˆ CharToOemWãääˆ PMCI_OVLY_SAVE_PARMSWôäˆ IOCê ˆ _WINSVC_á(ä‰ PRINTER_ENUM_NETWORKáHä‰ IInternetProtocolSinkdä‰ LPCODEBASEHOLDã„ä‰ SQL_API_SQLALLOCSTMTé‰ SQLSetConnectAttrWã¸ä Š __wcstoulèŠ dwModemVersionOffsetáìä‹ WM_NULLâ ä‹ SendDlgItemMessageã,ä‹ ChangeClipboardChaináPä‹ LOCALE_SNATIVECTRYNAMEãtä‹ NdrClientContextMarshallé ‹ SCardStatusWá¬äŒ COLOR_ACTIVECAPTIONâÜä&Œ CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALIDèŒ ??_7IXMLDOMImplementation@@6B@ã ä mapped_typeâ4ä PST_RS449Hä IOC_VOIDé PageSetupDlgWxäŽ num_bits_wordä Ž LANG_SLOVAKâ¬äŽ HRESULT_FACILITYáÌäŽ midiStreamPropertyãüä#Ž __IEnumMoniker_INTERFACE_DEFINED__ëŽ MKRREDUCE_TOUSERá0ä RASTERCAPSãDä SO_LINGER\ä CryptEncryptá€ä NdrVaryingArrayMemorySizeè PIDDSI_MANAGERã¸ä _PACKEDEVENTINFOáÔä _DRIVER_INFO_1Wâèä AddPortAâä IID_IOleLinké IMN_PRIVATEâ,ä‘ IDH_OKãPä‘ CERT_DSS_SIGNATURE_LENãlä‘ PIDDSI_LINECOUNTé‘ WM_PSD_ENVSTAMPRECTâ°ä’ CBF_SKIP_ALLNOTIFICATIONSÄä’ PF_MAXãää’ PRINTER_STATUS_PAUSEDè$’ SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTEâ$ä “ frexp4ä“ ciACPè“ MMSYSERR_INVALFLAGãpä” SE_SACL_DEFAULTED”ä” INET_E_DOWNLOAD_FAILUREâ¸ä” dwPreferredModemOptionsê” SQLSetStmtAttrãôä• TranslateAcceleratoráä• dwEventâ ä • DefaultScaleáLä• ITypeLib_ReleaseTLibAttr_Proxyë • IEnumSTATPROPSETSTG_Clone_Proxyâ˜ä– HKEY_LOCAL_MACHINEë – MCI_STATUSãÌä— GetPrinterDataExAè— get_preserveWhiteSpaceãä˜ LPEXCEPTION_POINTERSá4ä˜ RPC_S_PRF_ELT_NOT_REMOVEDHä˜ DT_BOTTOMhä˜ UnregisterMimeFilteré˜ SQL_DIAG_ALTER_DOMAINœä ™ __usableá´ä ™ ENUM_S_LASTâÌä™ DispatchTableðä™ szOID_YESNO_TRUST_ATTRãä!™ NdrNonConformantStringMemorySizeé ™ rgboundsáTäš @class$7639sysytool___pchpäš BatteryLifeTimeâäš WriteConsoleOutputã¨äš IN_CLASSA_MAXèš OleGetIconOfFileáÜä › __msl_xdigitá ä#› ERROR_INSTALL_PLATFORM_UNSUPPORTEDã$ä › HaveIidStrãHä› ITypeLib_FindName_Proxyâ`ä› PageSetupDlgAè› SQL_ODBC_KEYWORDSè œ MAKEWPARAMã´ä SUBLANG_ENGLISH_UKãÌä SND_ALIAS_IDáðä RpcNsMgmtEntryInqIfIdsã ä# CERT_FILE_STORE_COMMIT_ENABLE_FLAGã8ä SCardStatusAé# IOleInPlaceFrame_InsertMenus_ProxyãŒäž ERROR_CAN_NOT_COMPLETEã´äž ERROR_FLOPPY_WRONG_CYLINDERâÌä ž CharToOemAãìäž PMCI_OVLY_SAVE_PARMSAèž dwActiveProtocolá(äŸ EXCEPTION_DEBUG_INFOáHäŸ NumberCleanerSlotsã`ä Ÿ pszMfgNameãˆäŸ ICreateTypeLib_SetGuid_StubêŸ SQLSetConnectAttrAãÈä  TYPE_E_CIRCULARTYPEâàä   HWND_BOTTOMâüä  pszDisplayTextã ä  SPLREG_DS_PRESENT8 ä  MDM_PROTOCOL_X75_64Ké  SQL_CP_RELAXED_MATCHá| ä¡ SML_ERR_A_XPT_INVALID_IDá˜ ä¡ PENHMETARECORDãÀ ä"¡ PFN_CERT_STORE_PROV_WRITE_CRLØ ä¡ IME_CAND_CODEè¡ SQL_INTERVAL_DAYá!ä¢ sml_devinf_ctcaplist_sã4!ä¢ RPC_S_FP_OVERFLOWL!ä ¢ dwBrightnessáh!ä¢ IClientSecurityê¢ MDM_FLOWCONTROL_SOFTá¤!ä£ SND_ALIAS_STARTâ¸!ä£ I_RpcFreeì!ä'£ CERT_POLICY_QUALIFIER_NOTICE_REFERENCEë£ URLACTION_HTML_FONT_DOWNLOADáD"ä*¤ CREDENTIAL_OID_PASSWORD_CREDENTIALS_Ax"ä*¤ IInternetSession_UnregisterNameSpace_Stubè¤ SQL_SU_PRIVILEGE_DEFINITIONê¥ JOB_POSITION_UNSPECIFIEDáä"ä¦ PIMAGE_THUNK_DATA64ã#ä¦ STG_E_NOTCURRENTá#ä¦ EMR_POLYLINETO16é/¦ __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__ãl#ä § _cuseridá|#ä§ BOOLá #ä§ ERROR_CLUSTER_NODE_EXISTS¸#ä § NTE_BAD_UIDâÌ#ä§ iStartãä#ä § LOCALE_IDATEá $ä§ MCI_WAVE_SET_AVGBYTESPERSECê§ LPOFNHOOKPROC8$ä¨ TlsFreeâT$ä¨ META_SETRELABSãp$ä¨ PSP_USEREFPARENTé¨ V_R4REFâ°$ä © IMAGE_DIRECTORY_ENTRY_EXCEPTIONê(© IOleInPlaceSite_OnInPlaceActivate_Proxyâü$äª UserSidOffset%äª SCARD_E_TIMEOUTâ4%äª CryptSignHashAëª SZ_ASYNC_CALLEEât%ä« ACCESS_PROPERTY_SET_GUIDá„%ä« e_ipáœ%ä « TC_SA_DOUBLEá°%ä « EqualRgné« PlayEnhMetaFileâì%ä¬ AddressOfCallBacksã&ä"¬ SPAPI_E_INVALID_FILTER_DRIVER(&ä ¬ hKeyBaseáH&ä¬ UserIndexReadBytesãd&ä¬ DROPEFFECT_SCROLLè¬ SQL_FN_STR_LCASEá˜&ä­ GetMenuString¸&ä­ MCI_SEQ_SET_MASTERë­ ROTFLAGS_ALLOWANYCLIENTâð&ä® wStyleã'ä ® LOGFONTWá'ä ® NPJOYINFOEXê® CreateMonikerH'ä¯ isprintâ\'ä¯ ENOMEMãp'ä¯ haccelë¯ loadá”'ä° LPWSTRã´'ä° FILE_READ_ATTRIBUTESé° PMIDL_STUBLESS_PROXY_INFOð'ä ± protocolIdã(ä± REPARSE_GUID_DATA_BUFFERá8(ä± SetTimeZoneInformationãX(ä± POSTSCRIPT_IDENTIFYâx(ä± EMRSETVIEWPORTORGEXâ(ä± HTBOTTOMRIGHT´(ä± CRYPT_VERIFY_MESSAGE_PARAÐ(ä± TYPEFLAG_FCONTROLè ± MDMVOL_LOWã )ä² IMAGE_SYM_CLASS_ARGUMENTá$)ä ² RegEnumValueáL)ä² PCERT_STORE_PROV_FIND_INFOë*² CREDENTIAL_OID_PASSWORD_CREDENTIALS_W”)ä ³ ODT_BUTTONã¬)ä ³ XTYP_ADVSTOPáÈ)ä³ cUsageIdentifieráü)ä)³ CIP_TRUST_VERIFICATION_COMPONENT_MISSINGé³ NI_FINALIZECONVERSIONRESULTâD*ä´ SML_ERR_A_XPT_MEMORYáh*ä´ RPC_X_WRONG_PIPE_VERSIONáˆ*ä´ DMICMMETHOD_DEVICEã¬*ä´ ENABLE_PROCESSED_INPUTë ´ tagOLECONTFâä*äµ const_mem_fun1_ref_tá +äµ __ISurrogate_FWD_DEFINED__ã(+äµ IXMLHttpRequestâX+ä&µ IXMLHttpRequest_get_responseBody_Stubè$µ IEnumSTATPROPSETSTG_RemoteNext_Stubâœ+ä¶ ALG_IDë¶ REGULAR_FONTTYPEáØ+ä· PTOKEN_DEFAULT_DACLâø+ä· WSAVERNOTSUPPORTEDë· MARSHAL_E_LASTã(,ä ¸ LOGFONTAáT,ä ¸ CERT_SYSTEM_STORE_RELOCATE_FLAGê ¸ get_dtdURLãŒ,ä¹ SECURITY_ANONYMOUSã¨,ä¹ CERT_COMPARE_HASHè¹ CreateURLBindingáä,äº xptDeselectProtocolã-äº SE_DACL_DEFAULTED-ä º AmaskValueã<-äº CertVerifyCRLRevocationêº PropVariantClearé » BAUD_56Ká„-ä ¼ COMMCONFIGë¼ CryptSignHashWãÀ-ä½ LookupPrivilegeValueáÜ-ä½ PCRYPT_ATTR_BLOBá.ä½ InterfaceSupportsErrorInfoë½ SQL_DIAG_RETURNCODEâH.ä¾ NOTIFYICONDATAA_V1_SIZEâ|.ä)¾ PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTORé¾ IXMLElement_get_parent_Stubâ´.ä¿ INTâÌ.ä ¿ CTRY_URUGUAYáà.ä ¿ lMinimumé¿ OtherExceptionsâ/äÀ MaxJobObjectInfoClass,/ä À wFunc@/ä À ctrlCodeé À NUMPARSEáh/äÁ PPOINTLâ€/ä Á LPWNDCLASSAâœ/äÁ WM_DDE_INITIATEê Á dwReturnáÔ/ä SE_DACL_AUTO_INHERIT_REQáø/ä IEnumSTATSTG_Clone_Stubê$ SQL_SQL92_RELATIONAL_JOIN_OPERATORSâ@0ä à MAXLONG_PTRâT0äà S_FALSEâx0äà RPC_C_AUTHN_GSS_KERBEROSáŒ0äà CTL_ENTRY¼0ä%à CERT_PROT_ROOT_INHIBIT_PURGE_LM_FLAGáì0ä$à OBSOLETE_IOCTL_STORAGE_RESET_DEVICEêà dwConfigVersionâ1äÄ _execlpâ<1äÄ ERROR_NO_VOLUME_LABEL`1äÄ PAN_MIDLINE_LOW_POINTEDâ|1äÄ CONTEXT_OID_CTLâ˜1äÄ FILE_DEVICE_DISKé Ä _OLESTREAMãØ1ä"Å CO_E_ACTIVATIONFAILED_TIMEOUTì1ä Å BDR_OUTERá2ä Å FNOINVERTèÅ SCARD_ALL_READERS@2äÆ RegisterClipboardFormatAáX2ä Æ LPMOUSEKEYSêÆ _DRIVER_INFO_3Aâ2äÇ DLL_THREAD_ATTACH¬2äÇ STG_E_REVERTEDãÄ2ä Ç SBM_GETRANGEáØ2äÇ ncb_eventø2äÇ CALG_SCHANNEL_ENC_KEY3äÇ SERVER_EXECUTEã03äÇ IID_IEnumSTATSTGáL3äÇ ReleaseVarDescãt3äÇ ??_7IEnumSTATPROPSETSTG@@6B@éÇ VarIntFromStrèÈ DUPLICATE¼3äÉ CUST_SYNC_MODELêÉ CMSG_HASHED_ENCODE_INFOã4äÊ SidTypeWellKnownGroup4äÊ OpenSemaphoreèÊ ERROR_DS_SCHEMA_ALLOC_FAILEDáT4äË _Arrayãp4äË OSVERSIONINFOAëË IOCTL_CHANGER_BASEã´4äÌ PRINTER_ENUM_CONNECTIONSéÌ URLTEMPLATE_MEDIUMãè4äÎ lParamã5äÎ STG_E_SEEKERRORâ 5äÎ PERF_TYPE_NUMBERá85äÎ SCARD_PRESENTè-Î IXMLHttpRequest_put_onreadystatechange_Proxyá„5ä Ï wcstoullá 5äÏ CreateMailslotWâ¸5äÏ VirtualUnlockÔ5äÏ ERROR_DS_DUP_OIDáü5äÏ COMADMIN_E_APPLICATIONEXISTSá 6äÏ uhValèÏ SQL_ALTER_TABLEâ<6äÐ targetRefP6äÐ LPTSTRãt6äÐ _SE_IMPERSONATION_STATEâ˜6äÐ CO_E_SERVER_EXEC_FAILUREá´6äÐ EMR_STRETCHBLTãØ6äÐ RegisterClipboardFormatWáð6ä Ð iTimeOutMSecá 7äÐ _DRIVER_INFO_3WêÐ IDataFilter_DoDecode_ProxyãH7äÑ _execleâ`7ä Ñ EDGE_RAISEDêÑ QueryServiceLockStatusã¬7ä"Ò IMAGE_NT_OPTIONAL_HDR32_MAGICÐ7äÒ IMAGE_REL_SH3_PCREL8_LONGèÒ @class$7678sysytool___pch8äÓ PRIVILEGE_SET_ALL_NECESSARYâ08äÓ EMRFORMATH8ä Ó IsCharLowerâl8äÓ CERT_FIND_SIGNATURE_HASHéÓ MDM_V110_SPEED_DEFAULTãÄ8ä)Ô IXMLDOMDocument_put_ondataavailable_Stubé Ô OPENFILENAMEéÕ MCI_NOTIFY_FAILUREëÖ MFT_RADIOCHECKã09ä × LPWNDCLASSWê × HWND_TOPáX9äØ MK_S_USâp9ä Ø DRV_ENABLEã€9äØ hmsâ 9äØ PartitionClassGuidãÀ9äØ SCARD_STATE_UNAWAREê/Ø IInternetSecurityManager_GetSecuritySite_Proxyã:ä Ù _MSL_CFLOATâ0:äÙ CreateMailslotAâT:äÙ RPC_S_GRP_ELT_NOT_REMOVEDèÙ GetTextExtentPoint32á˜:äÚ @class$7638sysytool___pch¸:äÚ PSID_AND_ATTRIBUTESâÜ:äÚ _MESSAGE_RESOURCE_ENTRYâø:äÚ wPacketVersionã ;äÚ CBR_300â$;ä Ú WC_SEPCHARSâ8;äÚ n_aliasesd;äÚ IRpcStubBuffer_Disconnect_StubëÚ SQL_POS_REFRESHâ;äÛ compá¬;äÛ MA_ACTIVATEANDEATÌ;äÛ PERF_DISPLAY_SECONDSéÛ __SQLDATEü;äÜ GetSystemMetricsá$<äÜ SBS_SIZEBOXBOTTOMRIGHTALIGNâ<<ä Ü mmtime_tagãX<äÜ CRYPT_CREATE_SALT|<äÜ CertSetCRLContextProperty <äÜ NdrEncapsulatedUnionFreeáÀ<äÜ STGM_DELETEONRELEASEé*Ü __MIDL_itf_propidl_0000_v0_0_c_ifspec =äÝ OSVERSIONINFOWã8=ä Ý ERROR_DYNLINK_FROM_INVALID_RINGâX=äÝ wglSwapLayerBuffersâx=äÝ CBF_FAIL_CONNECTIONSéÝ pvarRight =äÞ PPOINTSâ¸=ä Þ IAdviseSink2áà=äÞ IOleLink_GetBoundSource_ProxyèÞ ITypeInfo_GetIDsOfNames_Stubá>ä ß rfind4>äß FILE_TYPE_UNKNOWNè ß SetTextColorál>äà WSA_QOS_NO_RECEIVERSáˆ>äà WS_MINIMIZEBOXëà URLACTION_NETWORK_MAX¼>ä á CWPSTRUCTèá FR_HIDEMATCHCASEáì>ä â ne_magicá?äâ UuidCreateNilèâ MKRREDUCECBR_115200ã¬nä>MEDIA_WRITE_PROTECTEDÄnä>ResetPrinterWè)>IOleInPlaceObject_ReactivateAndUndo_Stubá oä ?OBJECTIDá oä?lpCommentETO_RTLREADINGãLÿä >_SHFILEINFOWá`ÿä >cMsgCertáxÿä >PDOC_INFO_2Wé>LPROOTSTORAGE¼ÿä?ERROR_DESTINATION_ELEMENT_FULLë ?EMRMASKBLTãìÿä @getCmdFuncãä!@CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTRá<ä@CHANGER_ELEMENT_STATUSãTä@LPDOC_INFO_1Wè@tagOLELINKBINDãˆäALMEM_MOVEABLE ä ADATA_E_LASTâ¼äADDE_FADVRESERVEDáØäADceErrorInqTextWáä AIRpcProxyBuffer_Disconnect_StubêACreateTypeLib0äBSS_LEFTêBCALG_AGREEDKEY_ANYãxäCCOMADMIN_E_REGISTRARFAILEDãŒä CSRCPAINTá äCLPHMIDIâ¸äCLPCODEINSTALLè CVarUI1FromI4áðäDraw_storage_iteratoráä DGWL_EXSTYLEâ ä DCS_HREDRAWã8ä DVarR4CmpR8ëDNI_OPENCANDIDATEá|äEDNS_ERROR_NEED_WINS_SERVERSâ˜äE_CRYPT_BLOB_ARRAYè EVarUI1FromI2áÌäFDISPLAY_DEVICEãìäFRpcMgmtEpEltInqNextAá äFLPSHELLEXECUTEINFOWâ,äFszOID_OIWSEC_desOFBâPäFCERT_TRUST_IS_SELF_SIGNEDhä F_DOC_INFO_2Wá€ä FtagCACLSIDë FVarUI1FromI1áÀäGPACCESS_ALLOWED_OBJECT_ACEëGBINDF_RESYNCHRONIZEâä%HERROR_DS_STRING_SD_CONVERSION_FAILEDá,äHSPI_GETANIMATIONáHäHPP_SIGNATURE_PINá`ä HPDOC_INFO_1AáŒä&H__ISupportErrorInfo_FWD_DEFINED__´äHIXMLDOMDocument_abort_Proxyâää*HIXMLDOMParseError_get_errorCode_ProxyäHSQL_FD_FETCH_BOOKMARKèHSQL_CV_CREATE_VIEWãHäIPAN_FAMILY_TEXT_DISPLAYâ`ä IlpszOutputã|äIMapVirtualKeyAë IszOID_PKCSã¨ä JFLOAT128á¼ä JVER_LESSáàäJPRINTER_STATUS_POWER_SAVEèJSwitchã äKhas_quiet_NaN4ä"KMIXERCONTROL_CONTROLTYPE_MUTETäKMCI_SEQ_SET_OFFSETëKBINDF_PRAGMA_NO_CACHE¨ä'LERROR_CLUSTER_INVALID_NETWORK_PROVIDERã¼äLDCB_SETâØäLDialogBoxParamWâðä LXST_ADVSENTâäLFUNCFLAG_FIMMEDIATEBINDê LIWinInetHttpInfo_QueryInfo_Stubâpä*MERROR_DS_MEMBERSHIP_EVALUATED_LOCALLYŒäMEM_SETREADONLYëMRpcServerInqIfãÀä NwDeviceTypeêNPCPS_URLSüäOSCHED_S_TASK_NOT_SCHEDULEDãäOMDICREATESTRUCTWá0ä O_HMAC_InfoãHä OSetPrinterAêOPIDMSI_PROJECTãtä PminusœäPPRTL_CRITICAL_SECTION_DEBUGâ´ä PLPOVERLAPPEDáàä!PMIXERCONTROL_CONTROLTYPE_PERCENTâ äPRpcMgmtEpEltInqNextWá$ äPRpcNotificationTypeApcãD äPLPSHELLEXECUTEINFOAâ\ ä P_DOC_INFO_2Aát ä PTestCancelëP??_7ISupportErrorInfo@@6B@ãÀ äQ?$__two_complement@_J$00éQSQL_SFKU_NO_ACTIONëRUILANGUAGE_ENUMPROCâ äSe32_level, ä SDFC_BUTTONãD ä SLOCALE_S2359éScreateAttributeâ| äTVOS_OS232_PM32㜠äTMCI_GETDEVCAPS_ITEMâÀ äTCERT_STORE_PROV_MEMORYãä äTIMoniker_IsRunning_Proxyáü äTFreeSurrogateèTITypeComp_Bind_Proxyá0 ä UGET_SENDáD ä UKEY_READád äUNORMAL_PRIORITY_CLASSèUwUminèVLPDOC_INFO_1A¤ ä WUniquifierãÈ äWIMAGE_SIZEOF_SHORT_NAMEâì äWERROR_ENCRYPTION_FAILEDã äWRGN_MAXâ äWWM_ACTIVATEAPPã0 äWBottomãH ä W__RPC_USERãd äWDceErrorInqTextAሠäWPFN_CMSG_IMPORT_MAIL_LIST¬ äWIOleObject_Unadvise_ProxyÀ äWullValë Wcallconváè äXENOERRã äXABN_POSCHANGEDã ä XALG_SID_SHA1éXSQL_PRED_SEARCHABLEâL ä YEINTRh äYSmlDevInfXmit_t†ä YENUM_E_LAST✠äYMDICREATESTRUCTAáÀ äYCertDeleteCRLFromStoreë YSetPrinterWâô äZDialogBoxParamAâ äZOpenClipboard(äZVP_CP_CMD_CHANGEáHäZPRINTER_CHANGE_FORMâläZIDropTarget_DragOver_Stubœä%Z__MIDL_itf_urlmon_0195_v0_0_c_ifspecé%Z__MIDL_itf_urlmon_0197_v0_0_s_ifspecáèä[BACKGROUND_BLUEê[URLZONE_UNTRUSTED ä\CONVERT10_E_FIRST<ä\tagEMRFILLPATHãTä\MMIO_FINDPROC€ä!\CERT_UNICODE_ATTR_ERR_INDEX_MASKá”ä\VT_BLOBê*\__MIDL_itf_propidl_0109_v0_0_s_ifspecàä]WM_SETTINGCHANGEáôä ]addChildé]VarDecSub$ä^META_SETBKMODEã8ä^lValueãPä ^PDOC_INFO_1Wáxä^ITypeInfo2_GetCustData_Stubê^SQLGetDescFieldâ¸ä_ERROR_PRODUCT_UNINSTALLEDÔä_DM_DISPLAYFLAGSâðä_MapVirtualKeyWë_HYPER_SIZEDARRã ä`HMIXEROBJ4ä `PTIMEVALáTä`szOID_LICENSE_SERVERá„ä$`CRYPT_DEFAULT_CONTEXT_CERT_SIGN_OIDâ¬ä`__IViewObject2_FWD_DEFINED__é `SQL_MAX_ROWSáèäaGetCharacterPlacementAëaAF_DECnet äbIMPORT_OBJECT_NAME_TYPEêbGetPrinterDriverDirectoryAãpäcCO_E_INIT_MEMORY_ALLOCATORãäcMEM_E_INVALID_ROOTã¸äcCRYPT_E_MISSING_PUBKEY_PARAâÌä chwndItemáüä%c__MIDL_itf_objidl_0081_v0_0_c_ifspecécVarUintFromStrã,ä dMAKEROP4áDädFW_EXTRALIGHTdädEMRGLSBOUNDEDRECORDâ”ä$d_CMSG_CTRL_VERIFY_SIGNATURE_EX_PARAâ´ädCryptMsgCountersignâÜädSTUB_CALL_SERVER_NO_HRESULTâðä dSTDMETHODèdLPPERSISTMONIKERá,äeXPT_SERVER_PRECOMP_Hádä2eJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION|ä eHintsHonoredáœäe??_7ILockBytes@@6B@êe??_7IXMLDOMText@@6B@áääftagEMRCREATEDIBPATTERNBRUSHPTè f_DOC_INFO_3Wáä gDMPAPER_NOTEá,ä gST_BLOCKEDãHägCLEANER_CARTRIDGEè gLPDATAOBJECTá|ähhas_denorm_lossâ˜ähSUBLANG_SPANISHâ¼ähERROR_ACCOUNT_LOCKED_OUTáØähR2_MERGENOTPENëhLOCALE_SABBREVDAYNAME4ãäiSmlDevInfSyncCapPtr_t@äiLOCALE_SABBREVDAYNAME5ãhäiPRINTER_STATUS_MANUAL_FEEDë$i__MIDL_itf_msxml_0000_v0_0_s_ifspecâ´äjSetMapperFlagsãÐäjMF_RIGHTJUSTIFYêjLOCALE_SABBREVDAYNAME6ãäkwServicePackMinor0äkERROR_CTX_NO_OUTBUFâTäkLOCALE_SABBREVDAYNAME7ãpäkmidl_user_freeã˜äkICreateTypeInfo_LayOut_ProxyékGetContainingTypeLibáÌälTokenTypeôäl_RTL_CRITICAL_SECTION_DEBUGâälVTA_RIGHT0älNdrServerInitializeMarshallêlSQL_MAXIMUM_INDEX_SIZEãtäm__generic_iteratorãˆämHWND__ã¤ämLBS_MULTICOLUMNâÈämLOCALE_SABBREVDAYNAME1ãÜä mVT_ARRAYáôämIXMLDocument2èm??_7ICreateTypeInfo2@@6B@(änmoveáDänGetCaretBlinkTimehänLOCALE_SABBREVDAYNAME2ãŒän??_7ILayoutStorage@@6B@â¤ä nISoftDistExténZAFLAGS_REQUIRE_VERIFICATIONáàä ohProcessáäoLOCALE_SABBREVDAYNAME3ã äoVFT2_DRV_LANGUAGEè oCRYPT_Y_ONLYá\äpIMAGE_FILE_MACHINE_R4000áxäpbiClrImportantãä pMCI_SET_OFFê p_DOC_INFO_3AáÀä qCTLCOLOR_MAXáääqLOCALE_IDEFAULTLANGUAGEâäqPROV_EC_ECNRA_FULLã$äqCoGetObjectContextëqSetTypeIdldescãdärERROR_FUNCTION_NOT_CALLED„ärSubjectPublicKeyInfoé rIDataObject_EnumFormatEtc_ProxyâÔäsPIMAGE_IMPORT_DESCRIPTORáüäsFillConsoleOutputAttributeë*sICreateErrorInfo_SetDescription_ProxyLätRESTRICTED_POINTERãdä tEMRSETROP2ëtGetPrinterDriverDirectoryWã äuis_empty1¸ä uMB_TYPEMASKê#uIBindCtx_RegisterObjectBound_Proxyãüävis_empty2$ä"vMCI_VD_GETDEVCAPS_NORMAL_RATEPä!v__ISurrogate_INTERFACE_DEFINED__évODBC_VS_FLAG_RETCODEáŒäwMARSHAL_S_LASTã°äwGetCharacterPlacementWãÈä wpDriverPathêw__IXMLDOMText_FWD_DEFINED__âäxSECURITY_NT_AUTHORITY<ä xERROR_DEPENDENT_RESOURCE_EXISTSâdäxMCIERR_MISSING_DEVICE_NAMEã€äxdwInterfaceCountá äxtdDriverNameOffsetã¸ä xLPVIEWOBJECTáää xIXMLDOMNode_get_parentNode_StubêxOFN_ENABLETEMPLATEHANDLEé yLIB_FUNCá4ä zGlobalUnlockáTäzCRYPT_SEQUENCE_OF_ANYèzSQL_ATTR_DISCONNECT_BEHAVIORáä{ST_ISSELF¬ä{PCERT_NAME_VALUEáÌä{PRINTER_ENUM_LOCALãøä{AsyncIPipeByte_Begin_Pull_Stubë {width ä |reservedáL ä$|ERROR_CTX_MODEM_RESPONSE_NO_CARRIERê|SysReAllocStringLenâ„ ä}has_extension˜ ä}XTYP_MASK¼ ä}IOleObject_Close_ProxyãØ ä}GL_ID_CANNOTSAVEé}SQL_API_SQLSETSTMTOPTIONá!ä ~bFamilyTypeê~pMimeTypeä°_IMAGE_OS2_HEADERè °DRAGINFOá(>ä±?Rë±VOS_DOS_WINDOWS32X>ä²AF_MAXãx>ä²KP_KEYEXCHANGE_PINë+²IOleInPlaceActiveObject_ResizeBorder_ProxyãÀ>ä³?Pãà>ä³MM_SNDBLST_WAVEOUTë%³__MIDL_itf_objidl_0000_v0_0_s_ifspecá$?ä´dwXSizeâT?ä$´IInternetPriority_GetPriority_Proxyât?ä´LPOINETTHREADSWITCHâ”?ä´MDM_GET_EXTENDEDINFOé´wszArgãÀ?ä µ_MSL_NULL_HâÔ?äµsscanfãì?ä µcbReserved2â @äµERROR_LOG_FILE_FULLâ@ä µwRmin4@ä µSO_RCVTIMEOêµELEMENT_STATUS_INVERTx@ä¶LINK_TRANSPORT_STATICALLY@ä ¶free_bufferâ¬@ä¶TrackPopupMenuãÔ@ä¶ScrollConsoleScreenBufferAäAä ¶CertAddSerializedElementToStoreê'¶IMultiQI_QueryMultipleInterfaces_ProxyãLAä ·WSAStartupë ·GetClassFileá|Aä ¸PEMRANGLEARCá˜Aä¸WNNC_NET_LANMANâ´Aä¸midiOutShortMsgâìAä,¸ICreateTypeInfo2_DeleteVarDescByMemId_Proxyâ(Bä0¸IInternetProtocolSinkStackable_SwitchSink_Proxyê¸_LPDATAFILTER_DEFINEDXBä¹?ZãxBä¹ERROR_DUP_DOMAINNAMEá”Bä¹NEWTEXTMETRICEXWá¤Bä¹houráÀBä¹PNDR_PIPE_DESCãØBä ¹FixedMediaãøBä¹ReleaseBoundObjectsê¹REGISTERWORDW Cäº?YëºSQL_WLONGVARCHARáXCä»RESULT_RECEIVEãtCä»ERROR_BAD_NETPATHˆCä»CAL_KOREA¨Cä»MCI_OVLY_OPEN_PARENTé »VarI1FromDecé,¼CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAGâDä ½BF_TOPRIGHTê½MDM_MASK_V120_MLáSID_AND_ATTRIBUTES_ARRAYἋä>ERROR_IO_PENDINGáÔ‹ä >META_PATBLTâè‹ä>lbColorê>BIND_MAYBOTHERUSERã$Œä?DMPAPER_ENV_ITALY@Œä?GCP_DISPLAYZWGãXŒä ?MIDIPROP_GETátŒä?MCI_VD_PLAY_FASTé ?BindMoniker✌ä @@7424¬Œä@chaláÀŒä@lstrcatê@KEYEVENTF_KEYUPâìŒäA@7425áäADC_PAPERSäAPAN_PROP_MODERNâ<äAImmAssociateContextêASQL_PROCEDURE_TERMãläBNANâ|ä B@7426 äBPIMAGE_BASE_RELOCATIONã¼äBDMPAPER_QUARTOãØäBSWP_NOACTIVATEãðä BVS_FF_DEBUGêBCD_LBSELNOITEMSâŽä C@74270ŽäCDimensionLŽäCDLGC_WANTCHARSãdŽäCLPENUMSTATSTGèCSQL_MAX_TABLE_NAME_LEN㘎ä D@7420¸ŽäDCERT_E_CN_NO_MATCHãÐŽä DMEVT_VERSIONáøŽäD__IRootStorage_FWD_DEFINED__á äDICreateTypeInfo_LayOut_Stubâ8äDcreateCommentèDSQLDATEâ\ä E@7421xäEGetGraphicsModeâä EIDataFilterâ°äEITypeInfo_Invoke_StubèEATTR_CONVERTEDãÜäF@7422áäFERROR_NO_SYSTEM_RESOURCES(äFSPAPI_E_REMOTE_COMM_FAILUREâPäFCLSID_SynchronizeContainerë FLPELEMDESCãxä G@7423”äGERROR_OPEN_FILESá¸äGSPI_SETDOUBLECLKHEIGHTãðä,GCRYPT_MESSAGE_ENCAPSULATED_CONTENT_OUT_FLAGâ‘äGPENCRYPTION_CERTIFICATE_LISTá8‘äGCHANGER_MEDIUM_FLIPâX‘äGLPPROVIDOR_INFO_2Aë"GSERVICE_CONTROL_NETBINDENABLE”‘ä HwcsicollᤑäHLHNDáÄ‘äHBATTERY_FLAG_UNKNOWNáà‘äHSTATFLAG_NOOPENâü‘äHIRunnableObjectâ ’äHPSD_INWININIINTLMEASUREêHMDM_HDLCPPP_AUTH_DEFAULTáh’äIMSSIPOTF_E_FAILED_POLICYሒäISPI_SETDESKWALLPAPERᬒäIszOID_OIWSEC_dsaCommSHAâÈ’äICMSG_CERT_PARAMâð’äI__ITypeInfo2_FWD_DEFINED__ëISTDOLE_MINORVERNUMã0“äJSCARD_E_UNKNOWN_CARDáD“äJEMRTEXTâ\“ä JLPMIXERLINEWáx“äJjoyReleaseCapture˜“äJPCERT_ALT_NAME_INFOâÄ“äJNdrConformantVaryingStructFreeãà“äJSQLColAttributeê JSQL_AF_MAXã”äKIMAGE_SYM_CLASS_AUTOMATICè KKEY_NOTIFYãD”ä L@7428h”äLCRYPT_E_SIGNER_NOT_FOUNDá„”äLtagEMRPOLYDRAW16᜔ä LWN_NO_ERRORêLNonCachedDiskWritesâÌ”ä M@7429ì”äMPMCI_ANIM_OPEN_PARMSW•äMPointerBufferMarkè MlpwstrNameã<•äNPROPENUMPROCEXWêNCMSG_UNPROTECTED_ATTR_PARAMâ|•äOPEMRCREATEPENœ•äORpcBindingSetObjectâЕä(OIOleInPlaceUIWindow_SetBorderSpace_Stubâô•äO??_7IXMLDOMDocument@@6B@é#OIBindHost_MonikerBindToObject_StubãL–äPPCERT_BASIC_CONSTRAINTS_INFOéPboolean_from_ndréQLPPROVIDOR_INFO_2W㜖äRsp_family¸–äRHP_TLS1PRF_SEEDê Rcabstrblobãì–äSHEAP_NO_SERIALIZE—äSPTAPE_SET_DRIVE_PARAMETERSã<—äSszOID_INFOSEC_sdnsKMandSigã\—äSEnumPrinterDriversã|—äSSQL_CA1_LOCK_UNLOCKê"SSQL_SRJO_CORRESPONDING_CLAUSEÄ—äTMajorSubsystemVersionð—ä!TIMAGE_SIZEOF_STD_OPTIONAL_HEADERá˜ä&TERROR_DS_CANT_CREATE_UNDER_SCHEMA@˜äTNdrComplexStructMarshalláh˜ä"TIRpcChannelBuffer3_Send_Proxy”˜ä&TITypeInfo2_GetAllVarCustData_Stub°˜äTQueryCustomPolicy̘äTPIDDSI_PARCOUNTêTIME_ESC_RESERVED_LASTèUGetDocumentation2(™äV?$is_extension_imp@_K8™äVFARâP™ä VMIDIINCAPSëVCMSG_SIGNER_ENCODE_INFOâ”™äW?$is_extension_imp@_J¸™äWPSYSTEM_ALARM_OBJECT_ACEáÔ™äWNPDRVCONFIGINFOê#WIOleInPlaceFrame_RemoveMenus_Proxyãšä XYield0šäXDMMEDIA_STANDARDáLšäXPROPENUMPROCEXAâlšäXpszOpenStoreProvideré XSWORD¤šäYPTAPE_GET_DRIVE_PARAMETERS㸚äYLPCRECTêYERROR_INVALID_PRINTER_NAMEãøšä ZdmFormNameã ›äZ_WINUSER_8›ä"ZNdrNonEncapsulatedUnionBufferSizeèZLPVARDESCp›ä[COMADMIN_E_INVALIDUSERIDSˆ›ä [DM_ICMMETHOD᜛ä [MCI_SPINá¼›ä[PMCI_ANIM_OPEN_PARMSAè'[ICreateTypeInfo_SetVarHelpContext_Stubãœä\ARW_RIGHT œä\CTRY_LUXEMBOURGâ8œä \LPMIXERLINEAáTœä\tagMCI_PLAY_PARMSè\SHGFI_EXETYPEˆœä]__wide_orientedâ œä ]timerclearãÌœä]__IXMLDSOControl_FWD_DEFINED__ë]MDM_HDLCPPP_SPEED_56Küœä^CHARáä^LANG_THAI(ä ^VIF_SRCOLDë ^__SQLUCODEãXä ___upper_mapCá„ä_SPAPI_E_NO_CATALOG_FOR_OEM_INFãœä _MIIM_SUBMENUá¸ä_CRYPT_DIGEST_BLOBÌä_V_BSTRë_SQL_DESC_INDICATOR_PTRäžä `@7434 žä`GetCompressedFileSize<žä`LGRPID_VIETNAMESE\žä`REASON_PLANNED_FLAG∞ä!`IMallocSpy_PreHeapMinimize_Proxyᤞä`MDM_V23_OVERRIDEé `SQLBindParamáÌžä a@7435ÜžäaNameáŸäaIMAGE_SYM_CLASS_STRUCT_TAGã$ŸäaCS_E_CLASS_NOTFOUNDâ8ŸäaLPRGNDATALŸäaiMaxUdpDgpŸäaPFN_CRYPT_ENUM_OID_FUNCâŸäaContextSensitiveHelpé"aIXMLDOMNode_insertBefore_StubÈŸäb@7436èbCREATE_BREAKAWAY_FROM_JOBüŸä c@7437$ äcERROR_PRIVATE_DIALOG_INDEXã< ä cbV4AlphaMaskáX äcSCS_CAP_MAKEREADáx äcSQL_FN_TD_DAYOFWEEKêcSQL_SRJO_INTERSECT_JOIN⬠ä d@7430РädIMAGE_REL_SH3_ABSOLUTEãà ädppspá ¡ä"dPRINTER_CHANGE_SET_PRINTER_DRIVERèdLPUNKNOWN0¡ä e@7431H¡äeLCMAP_SORTKEYè&eCLSID_CCDOptionButtonPropertyPage„¡ä f@7432˜¡ä fitemListá´¡äfSOCK_SEQPACKETãÌ¡äfhMetaFilePictèfIOleCache2_DiscardCache_Stubá ¢äg__StringWrite,¢äg??_7bad_cast@std@@6B@<¢ä g@7433X¢ägCLIPBRD_E_LAST〢ägMCIERR_NOTIFY_ON_AUTO_OPENëgJOB_CONTROL_RESTARTâ´¢äh_closeãТähEMR_EXTTEXTOUTAâè¢ä h_CTL_USAGEëhNUMPRS_HEX_OCTã,£äiERROR_NOT_SUPPORTED_ON_SBSã\£ä%iERROR_DS_SOURCE_AUDITING_NOT_ENABLEDဣäiCRYPT_E_NO_KEY_PROPERTY┣äiR2_NOTëiIMallocSpy_PostGetSize_ProxyáУäjstreamposø£äjERROR_PAGED_SYSTEM_RESOURCESá(¤ä%jITypeInfo_LocalReleaseTypeAttr_ProxyéjITypeInfo_GetDllEntry_Stubãh¤ä kerrorMessageá|¤äktagMSG㔤ä kCB_ADDSTRINGá°¤äkC2_BLOCKSEPARATORФäkFILE_DEVICE_SERENUMê kConfigDSNWãø¤ä l@7438¥älMajorLinkerVersionã@¥älTAPE_DRIVE_SET_REPORT_SMKSãd¥älPAN_LETT_OBLIQUE_BOXED㌥älCERT_NAME_STR_SEMICOLON_FLAGᤥä l__RPC_CALLEEáÀ¥älIInternetBindInfoô¥ä)lIBindHost_RemoteMonikerBindToObject_Stubá¦älStgOpenPropStgëlImmSetCompositionStringWáL¦ä minvariantsã\¦ä m@7439p¦ämR2_NOPã ¦ä%mAsyncIAdviseSink_Begin_OnRename_StubḦä mMETHODDATAëmSQL_API_SQLFREEENVãô¦änSTD_OUTPUT_HANDLE §ä nDMRES_HIGHã4§än??_7IInternetZoneManager@@6B@ènwDeviceOffset`§äocallocãx§äolpstrFindWhatèoODBC_VS_FLAG_STOP¨§äpasinhlãÀ§ä pelement_typeáä§äpIMAGE_REL_CEF_ADDR32NBä¨äpGetMangledSiteSid ¨äpERROR_NO_ASSOCIATIONá8¨äpCallMsgFilterè pSQL_DM_VER㈨ä-qCMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAMá´¨ä q??_7IXMLDOMEntityReference@@6B@êqSQL_MAX_LENGTHãì¨ärwistringstreamã©ärAddressOfIndexã(©ärREGDB_E_WRITEREGDBãL©ärI_RpcBindingIsClientLocalèrExchangeFromTransport˜©ä sIMAGE_SYM_CLASS_UNDEFINED_LABEL⸩äsSPI_SETDOUBLECLKWIDTHØ©äsCOMMON_LVB_UNDERSCOREü©äsCRYPT_KEYID_DELETE_FLAGêsSQL_ISV_ASSERTIONSã8ªäthas_trivial_dtoráXªät_ACL_SIZE_INFORMATIONètMDM_MASK_HDLCPPP_MLâªä usmlLibStrstrᤪäuGetPath⼪ä uEMR_MOVETOEXáàªäuJOB_NOTIFY_FIELD_POSITIONøªä utagDEVNAMESêuSERVICE_INTERROGATEâ8«ävMaximumWorkingSetSized«ävERROR_CTX_MODEM_RESPONSE_ERROR〫ävLB_INSERTSTRING┫ä vMM_ADLIBᬫävmmioSetBufferèvIOCTL_VOLUME_BASEä«äwIPPORT_TTYLINKãü«ä wpIssuerCertê"wREVOCATION_OID_CRL_REVOCATIOND¬äxDESKTOP_WRITEOBJECTSéxdwUnauthAttrIndex€¬äyMAXIMUM_PROCESSORS㜬äyLookupAccountSidéyHCRYPTDEFAULTCONTEXTáЬäzwiostreamä¬äzasinhfãø¬ä zpamxctrlá$­ä&zNdrConformantVaryingArrayMarshall<­ä zdwSelectionêzImmSetCompositionStringAá|­ä{EM_CHARFROMPOSã”­ä {_RPC_POLICY⸭ä{UNRECOVERED_READS_VALIDâð­ä+{IInternetSession_UnregisterNameSpace_Proxyë{IME_KHOTKEY_ENGLISHâ(®ä |SetCommMaskâ<®ä|LPRGBQUADT®ä |EM_GETTHUMBê|SQL_DRIVER_ODBC_VER∮ä}memicmp⨮ä}PrivilegesToDeleteãÀ®ä}FACILITY_MSMQè}IID_IStubì®ä~lpDisplayName¯ä~EMR_EXTTEXTOUTWâ ¯ä ~SIOCATMARKã8¯ä ~rgAccDescrã`¯ä~PRINTER_ATTRIBUTE_PUBLISHEDâx¯ä ~DATE_STRUCTê~SQL_BS_SELECT_PROCã°¯äe32_debuginfo̯äTRUNCATE_EXISTINGܯäBiasáü¯äFILE_DIR_DISALLOWEDâ°ä cbBmiSrcá(°ä COLOR_3DFACEáD°äMCIERR_MULTIPLEâd°äCertOpenSystemStoreâx°äLPBLOBëImmGetProperty㨰ä€va_endãÀ°ä €to_char_typeáаä €@7444ø°ä"€IMAGE_FILE_LINE_NUMS_STRIPPED±ä €TC_IA_ABLEã(±ä €SC_HSCROLLã<±ä €GetFormWé€IPersistMonikerâh±ä @7445€±ä MEM_DECOMMITᘱä LocalReAllocḱäNotifyChangeEventLogáè±ä%CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAGá²ä%CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAGé%IXMLHttpRequest_get_responseXML_StubáX²ä ‚@7446€²ä‚SetMessageWaitingIndicator㤲ä‚EnumResourceLanguagesAãȲä‚MB_DEFAULT_DESKTOP_ONLYâܲä‚NPWAVEHDRð²ä‚Reallocê‚VarUintFromUI4ã³ä ƒ@7447<³äƒMCI_DEVTYPE_OVERLAYâ\³äƒX509_SEQUENCE_OF_ANYéƒLPOPENCARDNAMEA_EXãŒ³ä „@7440¬³ä„PACL_SIZE_INFORMATIONȳä„CommConfigDialogáô³ä„ERROR_DS_ATT_NOT_DEF_FOR_CLASSã´ä„MCIERR_FILE_WRITE4´ä„pvKeyEncryptionAuxInfoãP´ä„IID_IAdviseSink2á|´ä „URLACTION_INFODELIVERY_CURR_MAXê„VarUintFromUI2ã¨´ä …@7441È´ä…VER_SERVICEPACKMINORáð´ä…LookupPrivilegeDisplayNameWâ µä…KLF_REPLACELANGâ,µä…I_RpcGetExtendedErrorLµä…WSAAsyncGetServByNametµä…RegisterBindStatusCallbackë…_LPHTTPSECURITY_DEFINEDâ¨µä †@7442ĵä†MCI_WAVE_OUTPUTâàµä†SQL_ROWSET_SIZEê†SQL_ATTR_WRITEã ¶ä ‡putwc¶ä ‡@74434¶ä ‡NTSYSCALLAPIáX¶ä‡IMAGE_COFF_SYMBOLS_HEADER|¶ä‡FreeEnvironmentStringsWâ”¶ä ‡TC_UA_ABLEã¼¶ä‡MCIERR_DEVICE_TYPE_REQUIREDâè¶ä"‡szOID_INFOSEC_SuiteAKeyManagementá·ä‡wireHMETAFILEè‡VarUintFromUI1ã0·äˆrecommendD·äˆVoidPtr_t\·ä ˆVIF_TEMPFILEá„·äˆCryptMsgGetAndVerifySignerëˆIOleCache_EnumCache_Stubá¼·ä ‰SmlMap_táзä‰cttypeãà·ä‰dParmá¸ä‰_DDEHEADER_INCLUDED_é"‰IOCTL_SMARTCARD_SET_ATTRIBUTE<¸äŠreallocâX¸äŠp_sep_by_spaceãt¸äŠLPD_DOUBLEBUFFERé ŠChooseColorâ¤¸ä ‹MEM_TOP_DOWNáĸä‹PointerToLinenumberâà¸ä‹LB_SETITEMHEIGHTé,‹AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUSâ(¹ä Œ@7448@¹ä ŒTAPE_PREPAREáX¹äŒlong_from_ndrèŒPatháx¹ä@7449èPERF_DETAIL_NOVICEã¼¹äŽDialogBoxIndirectParamã̹ä ŽuCharì¹äŽFNERR_INVALIDFILENAMEè#ŽPCERT_POLICY_QUALIFIER_USER_NOTICEã<ºäSUBLANG_URDU_INDIAã\ºäIMAGE_SYM_TYPE_UINT∺ä SystemTimeToTzSpecificLocalTime⤺äGdiGetBatchLimitáкä!IAsyncManager_CompleteCall_Proxyáèºä LPPRINTDLGëSQL_US_UNION_ALLá,»äSPAPI_E_MACHINE_UNAVAILABLEâ@»äSS_CENTERT»äLZDoneãh»äPLINGERêPIDMSI_SEQUENCE_NO㬻ä‘FreeEnvironmentStringsAâÈ»ä‘DefineDosDeviceâÜ»ä‘NPJOYINFOô»ä‘imr_interface¼ä‘URL_OID_CTL_ISSUERë‘CLSCTX_NO_WX86_TRANSLATIONãT¼ä ’MF_UNHILITEâp¼ä’SetSystemCursorê’RpcNsProfileEltInqBeginâ¬¼ä “PrivilegesãÔ¼ä“LookupPrivilegeDisplayNameAâð¼ä“CryptImportKeyã ½ä“NumberOfEntriesê“SQL_PARAM_ERRORâ@½ä ”cbOverheadãd½ä”EnumResourceLanguagesWㄽä”PCMSG_RC2_AUX_INFO㬽ä”CERT_NAME_STR_NO_PLUS_FLAGãÀ½ä”lindexë ”dwSrcOfCopyâ¾ä&•IRunningObjectTable_EnumRunning_Proxyè&•IBinding_RemoteGetBindResult_StubL¾ä–__closed_file`¾ä –PtrToIntᄾä–BuildCommDCBAndTimeoutsâ˜¾ä –HDDEDATAá´¾ä–iframe_recv_errâؾä–CryptGetTimeValidObjectâì¾ä –GetFormAá¿ä–SetDescriptionë–SQL_LCK_NO_CHANGED¿ä—IMAGE_SCN_MEM_READã\¿ä —DMICM_USERãp¿ä—BF_MIDDLE”¿ä—LOCALE_SISO639LANGNAMEë—SCARD_POWER_DOWNáÔ¿ä˜LPEXCEPTION_DEBUG_INFOãì¿ä ˜RES_CURSORãÀä˜pszParametersè˜GetNameâ(Àä™TypeáHÀä™FILE_PERSISTENT_ACLSádÀä™ERROR_NO_MATCHã|Àä ™lpLocalNameâ¬Àä*™PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARAÀÀä™cascodeê ™ptCurrentPosáüÀäšSUBLANG_ENGLISH_ZIMBABWEáÁäšCRYPT_SGC4ÁäšNdrFullPointerXlatInitãdÁä%š__ICreateTypeLib_INTERFACE_DEFINED__éš__IBinding_INTERFACE_DEFINED__ã¨Áä ›LANG_SINDHIâÀÁä›FILE_ROOT_DIRØÁä›dwVisibleMaskìÁä ›UuidHashé ›IdleTimeéœERROR_DS_MUST_BE_RUN_ON_DST_DCãDÂäDirectoryNamelÂäPCHANGER_READ_ELEMENT_STATUSá„Âä IEnumSTATSTGéSetNameâ°Âä žVirtualFreeêžVAR_FORMAT_NOSUBSTITUTEâðÂäŸCWP_SKIPINVISIBLE ÃäŸuCallbackMessageá,ÃäŸKP_CMS_DH_KEY_INFOãHÃäŸLPCANDIDATELISTêŸSQL_DESC_ALLOC_TYPEâxÃä  @7454Ãä  SORT_DEFAULTá´Ãä DMLERR_UNADVACKTIMEOUTãÔÃä URLACTION_HTML_MAXë SQL_CONVERT_WVARCHARáÄä ¡@7455$Ää¡CertVerifyRevocationá4Ää¡SaveáXÄä¡DOMFreeThreadedDocumentâ„Ää&¡__ITypeChangeEvents_FWD_DEFINED__´Ää#¡ITypeLib_LocalReleaseTLibAttr_StubãÜÄä¡IXMLDocument2_get_URL_Stubë¡lpPrintTemplateNameâ Åä ¢@7456,Åä¢PTOKEN_PRIMARY_GROUPáLÅä¢LCS_CALIBRATED_RGBë#¢CERT_INFO_SIGNATURE_ALGORITHM_FLAGãŒÅä £@7457¨Åä£CBS_OEMCONVERTë£PERF_NO_UNIQUE_IDÔÅä ¤@7450ðÅä¤DBG_CONTROL_BREAK Æä$¤DNS_ERROR_PRIMARY_REQUIRES_DATAFILEâ8Æä ¤SetTextAlignáXÆä¤DCX_INTERSECTUPDATEâhÆä¤KP_RPè¤PCMSG_RC4_AUX_INFOã˜Æä ¥@7451¼Æä¥IMAGE_REL_PPC_TOCREL16ãìÆä#¥DNS_ERROR_NEED_SECONDARY_ADDRESSESãÇä ¥REGDB_E_LASTá@Çä0¥AsyncIAdviseSink_Finish_RemoteOnDataChange_Stubê¥SQL_CODE_MONTHãlÇä ¦@7452„Çä ¦RecordNumberá Çä¦LMEM_LOCKCOUNTãÄÇä¦ERROR_DATATYPE_MISMATCHâÜÇä ¦WMSZ_RIGHTãðÇä¦ToAsciiExÈä¦BN_PUSHEDÈä ¦RpcTryExcepté¦SetActiveObjectâHÈä §@7453lÈä§IMAGE_REL_PPC_TOCREL14ãÈä§SCARD_E_UNKNOWN_READERã¤Èä §NPMMTIMEáÀÈä§MMIO_CREATELISTê §CoGetObjectâôÈä¨SERVICE_NODE_TYPE Éä¨WM_MENUSELECTè ¨IOleLink_GetUpdateOptions_ProxyâLÉä©Wint_tãlÉä©front_insert_iteratorŒÉä©PRTL_OSVERSIONINFOWâ¨Éä©FILE_ENCRYPTABLEá¼Éä©DataBytesÔÉä ©NRC_LOCTFULâìÉä ©cUnauthAttrâüÉä©Cloneè©SQLCancel0ÊäªPMCI_VD_STEP_PARMSëª__IInternet_FWD_DEFINED__pÊä«GETVECTORPENSIZEáˆÊä «KF_MENUMODEâ Êä «VK_DECIMALë«CFSTR_MIME_X_PNGáÌÊä ¬@7458ÜÊä¬cpfxáôÊä ¬wFindWhatLené¬IME_ESC_PRIVATE_FIRST$Ëä ­@7459HËä­SmlDevInfCtcapListPtr_tâhËä­BeginUpdateResourceâËä"­DISPLAY_DEVICE_PRIMARY_DEVICE¨Ëä ­DS_SYSMODALâÄËä­_PROV_ENUMALGS_EXè­LocalFormatTypesáôËä®EMLINKãÌä ®TCHARÌä®COLOR_BTNTEXT4Ìä®_PORT_INFO_1W`Ìä ®__IPipeLong_INTERFACE_DEFINED__ê®OFN_SHAREAWAREãÌä¯getcharâ¤Ìä¯do_append¼Ìä ¯LPOCNDSCPROCé¯IInternalUnknownáôÌä°GMEM_LOCKCOUNTã Íä°PHYSICALWIDTH$Íä °DT_DISPFILEê°rgbResultXÍä±smlSetMaxOutgoingSizexÍä±IMAGE_REL_I386_DIR16áŒÍä±bmTypeë±TIME_VALID_OID_GET_OBJECT_FUNCãÜÍä²_MSL_MATH_X87_INLINES_HãÎä²?$__two_complement@J$00â,Îä²IMAGE_DIRECTORY_ENTRY_RESOURCEã@Îä²BAUD_1800TÎä ²NEXTBANDápÎä²tagFONTSIGNATUREá„Îä²DVD_ROMâ¤Îä²TYPEFLAG_FREVERSEBINDè²ITypeInfo_AddressOfMember_StubãðÎä³__USE_EXTENSIONS__ãÏä ³WSAEHOSTDOWNá$Ïä³INPLACE_E_FIRSTâ@Ïä³PI_FORCE_ASYNCë³MOD_RIGHTpÏä´partial_sort_copyˆÏä ´C3_HIRAGANAâ¨Ïä´NdrIsAppDoneWithPipesè$´ISynchronizeMutex_ReleaseMutex_StubâôÏäµVirtualAddressã$Ðä$µERROR_DS_LOCAL_MEMBER_OF_LOCAL_ONLYâ@ÐäµSPI_GETSERIALKEYSè µKP_RAlÐä¶n_sep_by_spaceãˆÐä¶PEMRFLATTENPATHâ¤Ðä¶MCIERR_SEQ_TIMERé ¶KP_RBÐÐä·SmlGenericCmd_tê ·LPMMTIMEáøÐä¸time_tãÑä ¸SE_TCB_NAMEâ,Ñä¸MIDICAPS_VOLUMEâDÑä¸_PORT_INFO_1Aè¸IContinue_FContinue_Stubá„Ñä¹KEY_QUERY_VALUEâœÑä ¹wHitTestCodeá¬Ñä¹hMenuè¹CoResumeClassObjectsáäÑä ºCLIENT_NAMEâÒäºTRUST_E_ACTION_UNKNOWNã Òä ºSIZEZOOMSHOWá<ÒäºPSM_SETFINISHTEXT`ÒäºIEnumSTATSTG_Skip_Proxyê ºSQL_CB_CLOSEá Òä»SECURITY_PRINCIPAL_SELF_RIDâ¼Òä»LT_LOWEST_LATENCYÔÒä »dwShareModeâøÒä»ERROR_DS_CANT_CACHE_CLASS Óä"»SPAPI_E_BAD_SECTION_NAME_LINEHÓä»IDataObject_EnumDAdvise_Stubé »SLONGpÓä¼mem_fun_ref_t˜Óä"¼DNS_ERROR_UNKNOWN_RECORD_TYPE°Óä ¼EMR_POLYGONâÌÓä¼PDEBUGHOOKINFOãèÓä¼szOID_KEYID_RDNê¼SQL_POS_UPDATEãÔä½NTM_TYPE18Ôä½tagCOMPAREITEMSTRUCTáTÔä½PCERT_NAME_BLOBê½MDMSPKRFLAG_CALLSETUPÔä¾ungetwc_bufferã¨Ôä¾VER_NT_SERVERÀÔä ¾LPBIND_OPTS2áÜÔä¾GetDescriptionãøÔä¾SQL_POS_POSITIONé ¾SQL_CR_CLOSEá(Õä¿PeekNamedPipe<Õä ¿MCIERRORá\Õä¿FULL_PTR_XLAT_TABLESé¿CFSTR_MIME_AVIãˆÕä À@7464°ÕäÀJobObjectBasicUIRestrictionsáÔÕäÀCreateAcceleratorTableãøÕäÀITypeInfo_GetMops_Proxyâ ÖäÀcreateProcessingInstructionâDÖäÀQUERY_CONTENT_ENCODINGëÀSQL_OIC_LEVEL1ãtÖäÁsystemã„Öä Á@7465”ÖäÁoemâ´ÖäÁDESKTOP_JOURNALRECORDàÖäÁMIXER_GETLINEINFOF_DESTINATIONã ×ä ÁszOID_INFOSEC_sdnsKeyManagementêÁMDM_MASK_HDLCPPP_AUTH<×ä Â@7466`×äÂSetSecurityDescriptorSacl„×äÂERROR_COMMITMENT_LIMITã˜×ä ÂLPBITMAPá´×äÂMFT_MENUBARBREAKáÐ×äÂpcmwaveformat_tagì×äÂALG_SID_DSS_PKCSáØäÂEnumPrintersAè ÂSQL_C_ULONGâ8ØäÃDATAOBJ_SUPPORTâHØä Ã@7467hØäÃSmlCallbacksCPtr_tã„ØäÃMCI_SEQ_SET_PARMS´Øä#ÃIInternetPriority_GetPriority_StubëÃSQL_OIC_LEVEL2ãàØäÄ@7460èÄRPC_E_INVALID_HEADERáÙäÅbasic_fstream(Ùä Å@7461DÙäÅMF_MOUSESELECTã`ÙäÅGetCurrencyFormatxÙäÅPDISK_LOGGING˜ÙäÅLPSCARD_READERSTATE_WèÅPSH_WIZARD_LITEâÈÙä Æ__rotateáØÙä Æ@7462ðÙäÆCCHDEVICENAMEÚäÆLB_GETSELÚä ÆMF_HSZ_INFOâ@ÚäÆCERT_INFO_NOT_AFTER_FLAGádÚäÆCertComparePublicKeyInfoáŒÚäÆ__IChannelHook_FWD_DEFINED__éÆSQLSpecialColumnsWã¼ÚäÇ@7463èÇPMESSAGE_RESOURCE_DATAëÈPAGE_EXECUTE_READWRITEãÛäÉmiddleã4ÛäÉ_CERTIFICATE_BLOBPÛäÉEnumPrinterDataêÉPRINTER_CHANGE_WRITE_JOBá„ÛäÊgenâœÛä Êpv_valuenameá¼ÛäÊPDERR_NODEFAULTPRNãäÛäÊMIXERCONTROL_CT_CLASS_METERâøÛäÊCRYPT_KEK ÜäÊCERT_NAME_SIMPLE_DISPLAY_TYPEèÊTIME_VALID_OID_FLUSH_CTLá\Üä Ëne_rsrctabãtÜä ËDaylightDateáŒÜä ËE_INVALIDARGá¤Üä ËlcsGammaBlueáÀÜäËMB_USEGLYPHCHARSéËPARAMDESCèÜäÌ_filenoâøÜä Ì@7468 ÝäÌWritePrivateProfileStringAã<ÝäÌLPMENUTEMPLATEWâxÝä1ÌCERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIME_VALID_FLAGá˜ÝäÌSCardListCardTypesë ÌPSP_HASHELPâÀÝä Í@7469ØÝä ÍInternalHigháðÝä ÍLocalFlagsãÞäÍVIF_SHARINGVIOLATIONéÍrecv_buff_unavailLÞäÎCRYPT_E_ASN1_CORRUPTálÞäÎCRYPT_E_ASN1_BADPDUâˆÞäÎLPMIDIPROPTEMPOâ ÞäÎdwErrorStatusèÎ_PORT_INFO_2WÌÞä ÏABORTDOCáðÞäÏRPC_SECURITY_CALLBACK_FNéÏVarR4FromDispßäÐgetâ<ßäÐTAPE_GET_MEDIA_PARAMETERSTßäÐWM_IME_SELECTxßäÐIXMLDocument_get_URL_Stub ßäÐ_LPWININETHTTPINFO_DEFINEDãÄßäÐSQL_SG_REFERENCES_TABLEêÐSQLSpecialColumnsAäàäÑOffsetToDirectoryàä ÑOSS_LIMITEDâ0àäÑACCESSTIMEOUTHàäÑDdePostAdvise`àä ÑrgAuthAttrãxàä ÑVARIANT_TRUEéÑSQLReadFileDSNã¨àä ÒNPBITMAPáÐàäÒSCardRemoveReaderFromGroupë ÒpdispValâáäÓsmlAllocSourceã(áäÓERROR_CLIPPING_NOT_SUPPORTEDáLáäÓSTG_E_INSUFFICIENTMEMORYáláäÓWGL_SWAP_MAIN_PLANEâˆáäÓdwCtlEntryIndexâ°áäÓPENCRYPTION_CERTIFICATE_HASHáÐáäÓLPSCARD_READERSTATE_AèÓhwndFrameüáä ÔI_RPC_HANDLEá âäÔEXPO_OFFLOAD_FUNC_NAMEã8âä ÔrgDistPointâXâäÔCertCreateCRLContextá|âäÔRpcSsSetClientAllocFreeâ”âäÔEnumPrintersW¬âä ÔLPDROPSOURCEé ÔLPSC_ACTIONâäâäÕSCARD_F_UNKNOWN_ERRORüâä ÕBusTypeFibreáãä ÕIUnknowná(ãä ÕLPCLIPFORMATé,ÕIInternetZoneManager_GetZoneAttributes_Stubâãä$ÖIMAGE_DLLCHARACTERISTICS_WDM_DRIVERâ°ãäÖENABLE_MOUSE_INPUTëÖMCI_WAVE_OFFSETâàãä×nwordsãüãä×LPDRVCONFIGINFOâää ×MHDR_ISSTRMâ4ää×CMSG_CRL_COUNT_PARAMé×CertAddEncodedCTLToStoreálääØunusedã|ääØHintáœääØWaitForSingleObjectâÌää%ØERROR_DS_DRA_EARLIER_SCHEMA_CONFLICTáàääØCALTYPEâüääØsmall_from_ndrãåäØ_PORT_INFO_2AèØtagINTERFACEINFOáDåäÙsourceãlåäÙERROR_INVALID_VERIFY_SWITCHâ åä*ÙIOleInPlaceSite_OnInPlaceDeactivate_ProxyèÙSQL_FN_TD_DAYNAMEàåäÚTAPE_SET_MEDIA_PARAMETERSæäÚWritePrivateProfileStringWã æä ÚIsValidAclã@æäÚERROR_ALIAS_EXISTSãdæäÚERROR_TOO_MANY_SECRETSã€æäÚLPMENUTEMPLATEAâ”æäÚSND_PURGE¨æäÚsa_familyÌæäÚCertUnregisterSystemStoreáçä'ÚISynchronizeEvent_SetEventHandle_ProxyëÚIOleLink_BindToSource_Proxyâ@çä ÛCA_NEGATIVEêÛDSSSEEDâ|çäÜ??_Gbad_alloc@std@@UAE@I@Zã çäÜMETA_CREATEFONTINDIRECTâÀçäÜGetTextExtentExPointáØçä ÜMMIOM_USERäèäÜMCI_ANIM_GETDEVCAPS_PALETTESá èäÜPCHANGER_PRODUCT_DATAèÜGCS_COMPREADATTRá`èäÝSML_ERR_XLT_MISSING_CONTá„èäÝSCARD_E_CARD_UNSUPPORTEDá èäÝGetViewportExtExáÄèäÝMCIERR_NO_ELEMENT_ALLOWEDØèä Ýs_aliasesè ÝpfnFreeInstâéä!ÞERROR_SERVICE_DEPENDENCY_DELETEDáDéäÞ??_7IDataAdviseHolder@@6B@ëÞVarDecDivxéäß?$compile_assert@$00áéä ße32_dircntã¤éäßGetObjectÐéä!ßAsyncIUnknown_Finish_AddRef_StubáäéäßpvarValêßCLSID_StdURLProtocoláêä à@7474@êäàERROR_UNABLE_TO_INVENTORY_SLOTãXêä àbiBitCountãpêä àSB_ENDSCROLLé àIXMLHttpRequest_get_status_Stubâ¬êä áerase¼êä á@7475Ôêä ánCert_HashëáBegin_QueryInterfaceáëäâ_loc_mon_cmpt_valsã$ëä â@74768ëä âLeadByteáhëä$âszOID_INFOSEC_SuiteATokenProtectionâëäâPRINTER_ATTRIBUTE_RAW_ONLYëâIID_ISynchronizeEventÀëä ã@7477äëäãMOVEFILE_WRITE_THROUGHäìäãLPMCI_SAVE_PARMSAèãPSH_WIZARDCONTEXTHELP0ìä ä@7470TìääSPAPI_E_INVALID_HWPROFILElìääLGRPID_ARABIC€ìä äRPC_ENTRYè ä_RPC_VERSIONá¨ìä å@7471ÈìäåTAPE_RETURN_ENV_INFOéåPIDMSI_STATUS_PRELIMáøìä æ@7472íä æUpdateColorsá4íäæLB_SETHORIZONTALEXTENTë æMEMCTX_SAMEâ\íä ç@7473xíäç_IMAGE_DOS_HEADERŒíä çMMIOPROCá¬íäçMCIERR_SEQ_PORT_INUSEèçDeviceSpecificãÜíäèispunctâìíäèDacléèpszContentEncObjIdãîä éEPIPE4îä éMAXLONGLONGâ\îäéERROR_DS_ROOT_CANT_BE_SUBREFátîäéiCaptionWidthœîäéRPC_C_PARM_MAX_PACKET_LENGTHá´îä éHCRYPTHASHãÌîä éKP_SALT_EXë é??_7IAsyncRpcChannelBuffer@@6B@âïäêExceptionCollidedUnwindâDïäêCryptInstallDefaultContextëêVarI4FromDatetïäëctype_map_ptrŒïä ëtagMULTI_QIê#ëIInternetPriority_SetPriority_StubãÌïä ì@7478Üïäìapfxáôïä ì_numberfmtAâðäìIEnumFORMATETC_Next_Proxy8ðäìXMLELEMTYPE_ELEMENTêìSQLWriteDSNToIniádðä í@7479€ðäíSmlOptionsPtr_tâœðäíTRANSPORT_TYPE_DG¼ðäí_CERT_DSS_PARAMETERSáÌðäíSTGTYèíITypeLib_GetTypeInfo_Stubñä îsmlLibStrcpyáñäîTextOutâ0ñäîEMRARCãHñä îHWAVEOUT__ãhñäîCryptAcquireContextâ€ñäî_PORT_INFO_3WèîSQL_ATTR_OUTPUT_NTSâ´ñäïAbortPathØñäïPOPENCARD_SEARCH_CRITERIAèïSQL_FN_STR_ASCIIáòäð__X86_PREFIX_Hã,òäðERROR_SAME_DRIVEáDòäðTabbedTextOutèðGetâxòäñIMAGE_ARCHITECTURE_ENTRYáœòäñPIPE_UNLIMITED_INSTANCESá´òä ñFLI_GLYPHSëñIXMLElement_addChild_Stubüòäò?$__two_complement@H$00âóä ò_WORD_BLOBëòformatetcDóäó__throw_bad_alloc`óäóSWP_NOOWNERZORDERxóäóAnsiUpperBuff”óäóSESSION_BUFFERëóSafeArrayGetElementâÌóä ôtargetParentáäóä ôCS_DBLCLKSëôCERT_V1âôäõIMAGE_REL_I386_DIR32á4ôäõSetViewportExtExáTôäõLOCALE_ICALENDARTYPEápôäõLPMCI_SAVE_PARMSW˜ôäõ_CRYPT_PKCS8_IMPORT_PARAMSãÄôäõCERT_STORE_PROV_FIND_CERT_FUNCë!õIXMLDOMDocument_createNode_ProxyáõäösmlSetOutgoingBeginâ0õäöERROR_WMI_INVALID_MOFDõäöCERT_V3êöSQL_SQ_CORRELATED_SUBQUERIESá„õä÷_MSL_STDARG_H˜õä ÷TlsAllocé÷CERT_V2âÈõäø_MSL_NO_FLOAT_HEXäõäø_compare_functionøõäøMAXWORDâöäøERROR_DLL_INIT_FAILED4öäøIsValidCodePageêø_PORT_INFO_3AèùEXTEND_IEPORT„öäúERROR_SERVICE_EXISTSá˜öäúPS_DASHâ°öä ú_numberfmtWê ú_INC_DDEMLHâàöä ûTOKEN_TYPEãüöäûCO_E_INVALIDSIDê"ûIXMLDOMNode_selectNodes_ProxyL÷äü??_Ebad_alloc@std@@UAE@I@Zãp÷äüSECURITY_SERVER_LOGON_RIDŒ÷äüRPC_C_EP_ALL_ELTSèüSQL_CU_TABLE_DEFINITIONâÐ÷äýWAIT_IO_COMPLETIONãì÷äýERROR_NOT_LOCKEDá øäýEMR_SETVIEWPORTEXTEXá(øäýSetWindowsHookExéýVT_VERSIONED_STREAMâhøäþIMAGE_REL_IA64_ADDEND„øäþSCALINGFACTORYã°øäþIOleClientSite_SaveObject_Stubë þtagBINDPTRãèøäÿIMAGE_SYM_DTYPE_ARRAYùäÿSCALINGFACTORXã$ùäÿMCI_SEQ_STATUS_OFFSETLùäÿBINDINFO_OPTIONS_ENABLE_UTF8éÿIMM_ERROR_NODATAáxùå @7484ŒùåPUINT32â´ùåPFSCTL_QUERY_FAT_BPB_BUFFERë.__IInternetSecurityManager_INTERFACE_DEFINED__ãúä _FUNCTIONALâúä @74858úäIMPORT_OBJECT_TYPEãTúäWIN32_FIND_DATAAá€úäERROR_DS_NAME_ERROR_NOT_UNIQUEã¤úäLPMCI_OVLY_OPEN_PARMSAë&FreeEncryptionCertificateHashListàúä @7486üúäERROR_TIME_SKEWâûätagICEXYZTRIPLEâ4ûäCRYPT_ATTR_BLOBâtûä5AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Proxyé'__IOleInPlaceFrame_INTERFACE_DEFINED__ã¸ûä @7487ÔûäINVALID_SOCKETëSQL_OUTER_JOIN_CAPABILITIESâ üä @7480üä XPT_H4üäTimeGeneratedXüäERROR_HANDLE_DISK_FULLãlüäciexyzXâˆüä_CERT_OTHER_NAMEé%IOleWindow_ContextSensitiveHelp_StubáÈüä @7481àüä CO_S_FIRSTãôüäciexyzYâýäwglUseFontBitmapsAã4ýäCTL_ANY_SUBJECT_INFOéSQL_DEFAULT_PARAM`ýä @7482týäciexyzZêIPersistStorage_Save_Stub¨ýä @7483ÈýäCMSG_HASH_DATA_PARAMéIServerSecurityâþä!IMAGE_DLLCHARACTERISTICS_NO_BINDá(þä HeapValidateáLþäPRINTER_ATTRIBUTE_SHAREDáxþäIFillLockBytes_Terminate_Proxyë _OLEAUTO_H_â¤þä PSHORTãÈþä ERROR_INVALID_FLAG_NUMBERàþä SetCursorPosé MMSYSERR_LASTERRORã ÿä FILE_GENERIC_WRITEãHÿä IMAGE_LOAD_CONFIG_DIRECTORYê nodeFromIDã|ÿä PSINJECT_SHOWPAGEè PWINDOW_BUFFER_SIZE_RECORDã´ÿä @7488Üÿä CONTEXT_EXTENDED_REGISTERSãðÿä e_cblpã ä FILE_FLAG_POSIX_SEMANTICS< ä ERROR_DS_NCNAME_MUST_BE_NCã\ ä SEC_E_OUT_OF_SEQUENCEx ä DMBIN_LARGEFMT㘠ä CONNECT_CURRENT_MEDIA¼ ä IAdviseSink_OnRename_Stubì ä* __IXMLDOMImplementation_FWD_DEFINED__ ä TYPEFLAG_FPROXYê FINDREPLACEAá0 ä @7489T ä TAPE_PSEUDO_LOGICAL_BLOCKh ä EV_RXFLAG” ä! ERROR_RESOURCE_PROPERTIES_STOREDḠä OSS_REAL_CODE_NOT_LINKEDáÜ ä GRADIENT_FILL_TRIANGLEãø ä NumObjectTypesë GetSecuritySiteâ, ä cchNewPathëCERT_BASIC_CONSTRAINTS2_INFOáp ä__handle_reopen⬠ä/??_C?0??what@bad_exception@std@@UBEPBDXZ@4QBDBãÀ äe_crlcãØ ä XST_EXECSENTéCERT_SMART_CARD_DATA_PROP_IDá ä OF_WRITEá4 äszOID_PKIX_ACC_DESCRá` äIXMLElement_setAttribute_Proxyë$__IAuthenticate_INTERFACE_DEFINED__⬠äRegisterClassExâÔ äSND_ALIAS_SYSTEMEXCLAMATIONâè äFillAtã äStgOpenLayoutDocfileé IXMLDOMNode_hasChildNodes_ProxyâL ä DATABITS_16âh äPAN_XHEIGHT_INDEX€ ä LB_ADDFILEã´ ä'MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETERëGetUnmarshalClassä äCURVECAPS äwglUseFontBitmapsWã  äIMPLINK_LOWEXPERá@ äMkParseDisplayNameã\ äICreateTypeLib2êget_attributesã ä xptCleanUp㨠ä SS_USERITEMêMDM_HDLCPPP_ML_NONEâð äDOMAIN_ALIAS_RID_POWER_USERSá äCONNECT_INTERACTIVEâ0 äUSERCLASSTYPE_SHORTê OleIsRunningát äERROR_SUCCESS_RESTART_REQUIRED㜠äPERF_100NSEC_MULTI_TIMER_INVéSERVICE_CONFIG_FAILURE_ACTIONSãÜ äNWPSTRãø äWIN32_FIND_DATAWá äOSS_UNAVAIL_ENCRULESá< äLPMCI_OVLY_OPEN_PARMSWëSQL_ATTR_ROW_NUMBERêPartitionNumberâ ä NTE_BAD_TYPEé MF_CHECKEDãÀ äREGDB_S_FIRSTè äPCMSG_MAIL_LIST_ENCRYPT_INFOá äVT_STREAMED_OBJECTë FINDREPLACEWéSQL_FN_TD_CURTIMET ä HFILE_ERROR†ä ERROR_CLUSTER_NETWORK_NOT_FOUNDâ  äRPC_C_MQ_TEMPORARYëSE_ERR_ACCESSDENIEDâä äX509_BASIC_CONSTRAINTSëLPENUM_SERVICE_STATUS_PROCESSè_PC_53ã< äDIB_PAL_COLORSãT ä RT_VERSIONãl äSM_CXDLGFRAMEè BufferMarkã” ä @7494¬ ä FindWindowExAÄ ä MaxCharSizeâÔ ä __SQLè SQL_SR_USAGE_ON_DOMAINã ä!handleã( ä!?$__num_bits@$0A@8 ä !@7495T ä!SmlResultsPtr_tâh ä!Lineage⌠ä!PAN_STROKE_GRADUAL_DIAG⨠ä!PP_DISPLAYERRORSé!LocalFmtStringOffsetáØ ä "@7496ð ä "GetDriveTypeá ä"FOREGROUND_INTENSITYá, ä"CERT_ENHKEY_USAGEH ä"PSM_GETTABCONTROLè$"SQL_MAX_ASYNC_CONCURRENT_STATEMENTSâ” ä#stable_partitionᤠä #@7497¸ ä #PPVALUEAé#PPRINTER_NOTIFY_INFO_DATAì ä$@7490á ä$dwErrorâ ä$PSN_QUERYCANCELâ< ä$PropSheet_HwndToIndexX ä$CF_NOVECTORFONTSé$SQL_API_SQLSETENVATTRˆ ä %@7491¬ ä%GetLogicalDriveStringsWâÐ ä%RpcServerUseProtseqIfExAáø ä"%sz_CERT_STORE_PROV_FILENAME_W$ ä!%AsyncIPipeByte_Finish_Pull_ProxyáD ä%IBinding_Resume_ProxyX ä %fIsLockedè%SQL_ADDâ| ä &@7492¤ ä&ERROR_DS_EXISTS_IN_POSS_SUPê&JOB_NOTIFY_FIELD_PAGES_PRINTEDãà ä 'clockð ä'fposâ ä '@7493  ä'GCPCLASS_PREBOUNDLTRá4 ä'MOD_SYNTHX ä'CMSG_INDEFINITE_LENGTHë'PIDSI_LASTSAVE_DTM㌠ä(failed㤠ä (GMEM_FIXEDã´ ä(GHNDáÔ ä(SPIF_SENDWININICHANGEè(pszValãø ä)Sizeá0 ä-)CMSG_KEY_AGREE_ENCRYPT_FREE_PUBKEY_PARA_FLAGáX ä)PFN_CERT_ENUM_PHYSICAL_STOREဠä)IRecordInfo_RecordInit_Stubê)VarModã° ä*WN_NOT_CONNECTEDé *mmioDescendâÜ ä +wReservedá ä+MAX_COMPUTERNAME_LENGTHê!+IPropertySetStorage_Create_Proxyá< ä ,@7498P ä,tagMSHCTXd ä,IDispatchŒ ä",ITypeLib_GetTypeInfoType_Stub° ä,ImmGetCompositionStringWáÐ ä,SQL_LEN_BINARY_ATTRê,SQL_SCC_XOPEN_CLI_VERSION1ã ä -@74990 ä"-ERROR_DS_CONSTRAINT_VIOLATIONH ä -WM_SETFOCUSâ` ä -PaintDesktopé -ARW_HIDEá” ä.IMAGE_SYM_TYPE_BYTEê.LPD_SHARE_STENCILÈ ä /E_UNEXPECTEDáà ä/DISCDLGSTRUCTè#/CERT_UNICODE_VALUE_ERR_INDEX_SHIFTã, ä0XptServiceIDPtr_tT ä"0SPAPI_E_NO_CONFIGMGR_SERVICESl ä 0_WINIOCTL_ã„ ä 0DISK_BINNINGᨠä0CoFileTimeToDosDateTimeê"0SQL_ATTR_PARAMS_PROCESSED_PTRè ä 1_SMALL_RECTâ ä1_PERF_OBJECT_TYPE, ä1??_7ITypeChangeEvents@@6B@ë 1VarI1FromI2âh ä2?$__two_complement@F$00✠ä)2ERROR_REQUIRES_INTERACTIVE_WINDOWSTATIONé2OSS_PDU_RANGEÌ ä 3EXIT_FAILUREáð ä3GetLogicalDriveStringsAâ ä 3TA_RIGHTá ä 3lfFaceNameã0 ä3ICM_ONãT ä3RpcServerUseProtseqIfExWé3HICON_UserSizeã” ä4RPC_E_INVALID_EXTENSIONâ´ ä4NTE_DOUBLE_ENCRYPTãÌ ä4HCBT_ACTIVATEè4CTRY_FAEROE_ISLANDSã ä 5PPVALUEWé5SetHelpStringContextá< ä6FreeProcInstanceáT ä6FindWindowExWh ä6ST_CLIENT„ ä6RPC_CLIENT_FREEê6SQL_CONCURRENCYâ´ ä7_DN_FLUSHÈ ä 7MM_TWIPSáì ä7EXPO_OFFLOAD_REG_VALUEã ä*7IInternetProtocolSink_ReportData_Stub8 ä7GetFirstCodeBaseád ä 7IPropertySetStorage_Create_Stubê 7VarI1FromI4â ä8ctlLastâ° ä8_RPC_CLIENT_INTERFACEè8IXMLElement_getAttribute_Proxyãü ä9IMAGE_REL_I386_REL16á ä9lfClipPrecisionâ0 ä9HCF_INDICATORP ä9NdrAsyncClientCallãp ä9SCARD_SHARE_DIRECTã” ä9ISynchronize_Reset_Proxyé9OnStartBindingãÄ ä :strnicmpáØ ä :pos_typeáì ä:DC_SIZEâ ä:ImmGetCompositionStringAé:SQL_FN_TD_DAYOFYEARâP ä;basic_ostringstreamâp ä;IMAGE_REL_PPC_REFLOê&;ERROR_DS_UNICODEPWD_NOT_IN_QUOTESÄ ä<_FSCTL_QUERY_FAT_BPB_BUFFERâÜ ä <LPBIND_OPTSê<SQL_PRED_NONE  ä =EMR_LINETOã( ä=KEY_LENGTH_MASKê=ODBC_ERROR_REQUEST_FAILEDd ä>GetWindowLong„ ä>MCI_DEVTYPE_ANIMATION¨ ä>CryptRetrieveObjectByUrláÔ ä >ITypeInfo_AddressOfMember_Proxyê>IOInetBindInfoã ä?CRYPT_E_DELETED_PREVé?MCI_WAVE_GETDEVCAPS_OUTPUTSâH ä@Fillád ä@SM_CYKANJIWINDOWé@IN_CLASSB˜ äAEMR_POLYPOLYLINE16㬠äAIN_CLASSCÜ ä#AITypeInfo2_GetAllFuncCustData_Stubãø äAAfterTypeChangeâ  äAIXMLDOMDocument_abort_StubëA_tagPROTOCOLDATAéBSQL_DRIVER_HSTMTሠä$CJOB_OBJECT_MSG_ACTIVE_PROCESS_LIMITâ  ä CCombineRgnã¼ äCPMENUITEMTEMPLATEÐ äCIN_CLASSAä äCARRAYDESC  ä"CIXMLDOMNodeList_get_item_Stub< ä&CIXMLHttpRequest_setRequestHeader_StubèCIID_IInternetProtocolRootx ä DalertCmdFuncá ä DDMPAPER_9X11ᬠäDGetDlgItemTextWâÄ äDDestroyCursorð äDRPC_C_LISTEN_MAX_CALLS_DEFAULTã äDCryptVerifySignatureA< ä DszOID_NETSCAPE_CERT_RENEWAL_URLâd äDPORT_STATUS_USER_INTERVENTIONèDSQL_ASYNC_ENABLE_OFFᜠä ELPSERIALKEYSá° äENetbiosâÌ äEszOID_DSALG_RSAâà äEExtraInfo äECERT_COMPARE_SUBJECT_CERT ä ETotalPagesëEVarUintFromDecãP ä FTAPE_REWINDâx äFSPAPI_E_DEVINFO_DATA_LOCKEDêFMS_STRONG_PROV_WᨠäGfsetposâÄ äGQS_MOUSEBUTTONãØ äGDSS_UNIONø äGJOB_CONTROL_DELETEã ä GGetTypeInfoêGPIDMSI_EDITOR< äHHGLOBALâX äHALG_TYPE_BLOCKãp ä HXLAT_SERVER∠ä HExtentLengthá¼ ä'HIDirectWriterLock_HaveWriteAccess_StubëHSQL_MAXIMUM_DRIVER_CONNECTIONSãø äIFileá äIWSAEPROTONOSUPPORTëIpLocationD ä JLPRIP_INFOãd äJDMPAPER_FANFOLD_USã| ä JGetKeyStateê JBINDF¬ äKERROR_ALREADY_WAITINGÈ äKRpcMgmtInqStatsâä äKpvExtraPolicyPara! äKINET_E_CONNECTION_TIMEOUTèKVarR4FromUint@! äLRPC_X_INVALID_BUFFERáX! äLPSM_INDEXTOIDp! ä LLPSAFEARRAYêLcbSizeVft¬! äMMSSIPOTF_E_BAD_OFFSET_TABLEâÔ! äMEMRCREATEDIBPATTERNBRUSHPTãô! äMCountClipboardFormatsèMHMETAFILEPICT@" ä(NIThumbnailExtractor_OnFileUpdated_Proxyê NHDC_UserFreeéOEnumTimeFormatsWáˆ" äPfile_kind¨" äPMinorSubsystemVersionÌ" äPIMAGE_SCN_MEM_DISCARDABLEà" äPGCP_ERRORø" ä PVK_NUMPAD7ã# äPMS_STRONG_PROV_Aá8# äPUSER_MARSHAL_CB_SIGNATURET# äPDeletePrinterKeyáp# äPIPSFactoryBufferé+PIExternalConnection_ReleaseConnection_StubãÌ# äQSTATUS_ACCESS_VIOLATIONâä# ä QPACCESS_MASKá$ äQIsReparseTagHighLatencyâ$$ äQWAIT_ABANDONEDã<$ ä QVK_NUMPAD6ã\$ äQPERF_COUNTER_QUEUELENt$ äQCacheClustersèQLPBINDPROTOCOLã°$ äRDISP_E_PARAMNOTFOUNDáÈ$ ä RVK_NUMPAD5ãä$ äRGetDlgItemTextAâü$ ä RLPSCROLLINFOá% äRCryptVerifySignatureWè&RSQL_CT_CONSTRAINT_NAME_DEFINITIONl% äSERROR_SETCOUNT_ON_BAD_LBá„% ä SVK_NUMPAD4ëSEM_SETPASSWORDCHARãÈ% äTIMAGE_REL_IA64_SECREL22ê TVK_NUMPAD3ãø% ä UVK_NUMPAD2ã& äUCRYPT_FLAG_TLS1â4& äULPPRINTER_NOTIFY_INFOèULoadRegTypeLibãh& ä VVK_NUMPAD1ã€& ä VSM_CXVSCROLLá˜& äVRPC_VAR_ENTRY¸& äVSetFuncHelpContextëVMDM_PROTOCOL_GPRSì& ä WVK_NUMPAD0ã' ä WIAdviseSinkê&W??_7IInternetSecurityMgrSite@@6B@P' äXpguidPrimaryProviderád' äXpcyValëXVARFLAG_FREQUESTEDITáœ' ä Ye32_autodataáÄ' äYCOMADMIN_E_DLLREGISTERSERVERáÜ' ä YlfEscapementáô' ä YDMBIN_LASTã( äYEnumTimeFormatsAéYLogFileWriteBytes<( äZlpfnáX( äZWNNC_NET_AS400ãh( äZopená€( äZDeleteServiceœ( äZSQL_NULL_HANDLEê&ZSQL_AT_CONSTRAINT_NAME_DEFINITIONØ( ä [_X86_ô( ä[CLIPBRD_S_FIRSTâ ) ä [StretchBltë[iBaudRate8) ä \MFENUMPROCãP) ä \StartParamãx) ä\PROTOCOLFLAG_NO_PICS_CHECKã˜) ä\SC_GROUP_IDENTIFIERâ´) ä\SQLGetTypeInfoë \SQL_AF_MINãà) ä ]hwndBreakè]IID_IXMLDOMEntity* ä^BinaryOperationâ8* ä^TAPE_LOGICAL_BLOCKãP* ä ^VK_NUMPAD9ãh* ä ^SM_CYVSCROLLé^HELP_CONTEXTMENUáœ* ä _VK_NUMPAD8ã´* ä _ShowWindowë_VP_CP_CMD_ACTIVATEãè* ä`hGlobalâü* ä `OLECLOSEé*`__IPersistMoniker_INTERFACE_DEFINED__H+ äaTokenPrivilegesâl+ äaRPC_S_ENTRY_TYPE_MISMATCH„+ ä aARW_TOPRIGHTá + äaCERT_KEY_CONTEXTáÐ+ ä$aIPersistMoniker_GetCurMoniker_ProxyêatagCADATEø+ ä bVK_RMENUá, äbtagMCI_SEEK_PARMS@, ä!bCRYPT_OID_ENUM_SYSTEM_STORE_FUNCáh, äbLPOPENCARD_SEARCH_CRITERIAAêbLPREGISTERWORDãœ, äcchoose_insert¸, äcSetComputerNameâä, äcGCPCLASS_LATINNUMERICSEPARATORãü, ä cmmioRenameã- äcncb_numâ(- ä c_UUID_VECTORáL- äcI_RpcGetCurrentCallHandle|- ä#cIXMLDOMNamedNodeMap_get_item_Proxyë cVarDecRoundâ¼- ädERROR_RESMON_ONLINE_FAILEDëdDefDriverProcð- äeIP_MULTICAST_IFê etagSTYLEBUFWá8. ä*fSYNCFEST_ALLOW_ALERT_WITHOUT_ITEMLIST\. äfreturn_temporary_bufferâ€. äfSCARD_E_WRITE_TOO_MANYã . äfLoadKeyboardLayoutWêfNPREGISTERWORDãÐ. ägidle_procä. ä gPPELARRAYá/ ägRPC_C_DONT_FAILâ / ägSQL_CONCUR_TIMESTAMPégODBCGetTryWaitValueâl/ ähIMAGE_RESOURCE_DIRECTORY_ENTRYã”/ ä"hERROR_DS_STRONG_AUTH_REQUIRED¬/ ähMSGBOXPARAMSWèhSO_DISCDATALENãì/ äiASYNC_STGMEDIUM_UserFreeéiSSHORTã 0 äj_userHMETAFILEPICTãT0 ä.jIXMLDSOControl_get_JavaDSOCompatible_Stubˆ0 ä(jIInternetSession_RegisterNameSpace_StubêjLPOINETPROTOCOLSINKâÀ0 ä kclose_procãà0 äkCreateEnhMetaFileWãø0 ä kPolyTextOutWá1 äkRegisterClipboardFormatâ41 ä kIDC_SIZENWSEáP1 äkCommonPrefixWithé*kIXMLDOMElement_getAttributeNode_Proxy 1 älIMAGE_SECTION_HEADERáÈ1 älERROR_INVALID_PRINT_MONITORâÜ1 äl_CTL_INFOô1 ä lPagesPrintedélSQLTIMEâ$2 äm_EXCEPTION_RECORD<2 ämDECLSPEC_UUIDT2 ä mMAKEFOURCCãp2 ämpVoidResolveFuncémIErrorLog_AddError_Stubâ¬2 ä nFIRMWARE_PTRáÈ2 änAllocationBaseãÜ2 änUnicodeâü2 änCRYPT_E_ASN1_CHOICEâ3 änLPWINDOWPLACEMENTè#n_CERT_POLICY_QUALIFIER_USER_NOTICEë otagPELARRAYâ„3 äpKEY_ENUMERATE_SUB_KEYSãœ3 ä pLMEM_FIXEDã¼3 äpLoadKeyboardLayoutAâÜ3 äpwaveOutGetErrorTextâ4 ä2pCERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG,4 ä pVarCyFromI1êptagDATE_STRUCTãd4 äqWNNC_NET_9TILESâœ4 ä.qAsyncIAdviseSink2_Begin_OnLinkSrcChange_Proxyèq??_7IInternetProtocolInfo@@6B@ãì4 är?$__two_complement@D$00â 5 ärSUBLANG_URDU_PAKISTAN,5 ärFILE_VOLUME_QUOTASãL5 ärDMLERR_SERVER_DIEDã\5 ärfIVâ„5 ärCERT_TRUST_IS_UNTRUSTED_ROOTáœ5 ä rINVOKEKINDãÀ5 ärImmSetConversionStatusãà5 ärGCL_REVERSECONVERSIONèrIME_CMODE_SYMBOLá$6 äsITypeInfo_GetTypeComp_ProxyâH6 äs??_7IAuthenticate@@6B@ã`6 ä sVarCyFromI2ê stagSTYLEBUFAáœ6 ätIMAGE_REL_IA64_SECREL32âÀ6 ät_IMAGE_IMPORT_DESCRIPTORáè6 ätLPOPENCARD_SEARCH_CRITERIAWâ7 ätCLIPFORMAT_UserFreeâ7 ätSF_I8è ttypekindáL7 äuLOCALE_USER_DEFAULTâ`7 ä uPSERVENTé uVarCyFromI4â¤7 ä!vTIME_VALID_OID_GET_CRL_FROM_CERTá¼7 ä vget_entitiesévSQL_DELETE_BY_BOOKMARKã8 äwERROR_DS_INSUFF_ACCESS_RIGHTSèwWSAAsyncGetProtoByNumberáL8 äxANON_OBJECT_HEADERãl8 äxSPI_GETSCREENREADERâ„8 äxgetservbyname¤8 äxPCRYPT_KEY_PROV_INFOáÀ8 äxLPOLECONTAINERãÐ8 ä xSF_I4à8 äx_idêxSQL_FN_NUM_MODã9 äy_PC_64ã$9 äy__lbitsâL9 äy_CMSG_KEY_AGREE_ENCRYPT_INFOéyPRINTER_NOTIFY_FIELD_SEPFILEáŒ9 ä z__move_memã´9 äzSmlUnknownProtoElementPtr_tâÐ9 äzPEMRSETCOLORSPACEè9 ä zHeapMinimizeézIXMLDOMParseError_get_url_Stubã(: ä {cbPrologá<: ä{HDESK__â`: ä{CertDuplicateCRLContextê{SafeArrayGetElemsizeá : ä|MKF_REPLACENUMBERSãÈ: ä|JOB_NOTIFY_FIELD_TOTAL_BYTESé|SQL_DESC_TABLE_NAMEâ; ä}IMAGE_REL_I386_REL32á; ä }BS_SOLIDá<; ä}CreateEnhMetaFileAãT; ä }PolyTextOutAát; ä}WN_NOT_INITIALIZINGê }SF_I1œ; ä~MSGBOXPARAMSAÐ; ä*~IThumbnailExtractor_ExtractThumbnail_Stubè~SF_I2èMCI_ANIM_STATUS_FORWARDâ < ä€_MSL_LOCALE_CUTF8<< ä€WS_EX_CLIENTEDGEáT< ä€pi_R3_allvalsl< ä €__RPC_STUBã˜< ä"€ICreateErrorInfo_SetHelpFile_Stubè€SQL_COLUMN_MONEYáØ< äxptInternalTransportInfoáô< äDISP_E_OVERFLOWâ= ä"PRINTER_NOTIFY_FIELD_PRIORITYH= ä!AsyncIPipeDouble_Begin_Push_Stubé$IOleAdviseHolder_SendOnRename_Proxyâœ= ä‚GetSecurityDescriptorSaclÀ= ä‚TYPEFLAG_FOLEAUTOMATIONê‚lpDependenciesãü= äƒsml_devinf_dsmem_së ƒpMemoryListâ4> ä„SYSYNC_VERSION_MINORáP> ä„smlAllocFilterãh> ä „WM_MENUCHARâx> ä„_PSPá”> ä„CDM_GETFOLDERPATHè„SQL_API_SQLGETENVATTRÐ> ä…PagedPoolLimitãø> ä"…ERROR_RESOURCE_DATA_NOT_FOUND ? ä…WM_SIZING@? ä(…__IOleItemContainer_INTERFACE_DEFINED__âX? ä …VarI2FromStré…SQLConfigDriverWá˜? ä†TAPE_DRIVE_WRITE_SETMARKS¸? ä†ERROR_DS_NO_CHAININGé†RegisterServiceCtrlHandlerWâð? ä‡fNCâ@ ä‡LPPROPSHEETHEADERAë‡LPOLEINPLACEOBJECTã@@ äˆexitád@ äˆCreateCompatibleBitmapãx@ ä ˆPaintRgnáˆ@ äˆBindéˆSQL_MAX_CATALOG_NAME_LENá¼@ ä‰_asmáÔ@ ä ‰ENUM_E_FIRSTáì@ ä ‰NPDEVMODEWãA ä‰szOID_LOCAL_MACHINE_KEYSETë‰SQL_ATTR_PARAM_BIND_OFFSET_PTRãlA äŠSCHED_E_ACCOUNT_NAME_NOT_FOUNDã˜A ä"ŠMultinetGetConnectionPerformanceAèŠ_VTableProvStrucáÜA ä"‹??_Gout_of_range@std@@UAE@I@ZüA ä‹THREAD_IMPERSONATEãB ä‹IE_OPENâ$B ä‹PF_BANãDB ä‹CERT_DSS_PARAMETERSâXB ä‹CDN_FIRSTxB ä‹IME_ESC_SYNC_HOTKEYê‹SQL_MAXIMUM_CURSOR_NAME_LENGTHã¸B äŒDC_BINSâØB äŒRPC_S_CALL_FAILED_DNEèŒGetBindResultC ä?$__red_black_tree@$00ã0C äsmlAllocResultsâPC äxptGetDocumentInfoãlC äMM_MPU401_MIDIINáˆC äRPC_ASYNC_EVENTâ¤C äMIDL_STUB_DESCãÄC äIsContainerPartitionáìC äIEnumSTATPROPSTG_Next_ProxyêSQL_STRING_FUNCTIONSá D äŽfilterã4D ä ŽMAXUIDLENè&ŽSQL_SQL92_FOREIGN_KEY_DELETE_RULE„D äERROR_DS_DRA_ABANDON_SYNCœD ä LPDEVMODEAã´D ä MWMO_WAITALLáÜD äPCRYPT_ATTRIBUTE_TYPE_VALUEãE äELEMENT_STATUS_NOT_BUSëReleaseFuncDescâ8E äDISP_E_BADINDEXâPE ä EC_ENABLEALLátE äIEnumMoniker_Next_StubëRegisterServiceCtrlHandlerAâ´E ä ‘SO_BROADCASTé‘LPPROPSHEETHEADERWãøE ä’?$__two_complement@C$00âF ä’OSS_PER_DLL_NOT_LINKEDë’SCARD_E_CANCELLED\F ä“ERROR_MAX_THRDS_REACHEDâxF ä“DESKTOPENUMPROCâF ä “ALG_TYPE_DHâ´F ä“PRINTER_ATTRIBUTE_DEFAULTÌF ä “AddVarDescë“VarI4FromUintøF ä”filtercap G ä”DWORD_PTR,G ä”DESKTOP_CREATEMENUë”wOutputâTG ä•_STRINGâtG ä•IMAGE_ORDINAL_FLAGãŒG ä•PEMRRESTOREDCè•PRINTACTION_OPENáÄG ä–PCRYPT_UINT_BLOBáôG ä#–IBindCtx_ReleaseBoundObjects_Proxyë–??_7IXMLDSOControl@@6B@â8H ä—IMAGE_REL_PPC_SECTIONdH ä —DNS_ERROR_RCODE_NOT_IMPLEMENTEDâ€H ä—GLYPHMETRICSFLOATœH ä—MCI_STATUS_ITEMâ¼H ä—CLSID_HttpSProtocolê—SafeArrayUnlockâøH ä˜CRYPT_E_ASN1_BADARGSáI ä˜PERF_NUMBER_DECIMALâPAN_STRAIGHT_ARMS_HORZã`£ ä>RT_ICONâx£ ä>SetClassLongA”£ ä>GetThreadLocaleê>CHANGER_POSITION_TO_ELEMENTâÌ£ ä?_scâ࣠ä ?DOCINFOA⤠ä?CertRDNValueToStrAã@¤ ä3?IOleInPlaceActiveObject_OnFrameWindowActivate_Stubë ?ITypeLib_GetDocumentation_Proxy∤ ä@SUBLANG_FRENCH㜤 ä@GetAce㸤 ä@LPMENUITEMINFOAâÔ¤ ä@waveOutMessageãì¤ ä @pAlgorithm㥠ä@SPLDS_PRINT_STAPLING_SUPPORTEDãH¥ ä%@__IOleClientSite_INTERFACE_DEFINED__é@IXMLElement_removeChild_StubᥠäA_MSL_DEFAULT_LOCALE⤥ äAXST_INIT2À¥ äALPDRIVER_INFO_5Aé ASQL_SO_MIXEDáì¥ ä BgenerateᦠäBPSECURITY_DESCRIPTOR_CONTROLá,¦ ä Be32_fixupsumá@¦ äBHRGN__ã\¦ äBGetCommandLineㄦ äBSetConsoleActiveScreenBufferᘦ äBXST_INIT1°¦ ä Bwavehdr_tagâЦ äBszOID_OIWSEC_dsaComméBOnCloseâü¦ ä C__ctype_mapCá § äCszOID_PKIX_KP_CLIENT_AUTH@§ äCLPOPENCARDNAMEW_EXãp§ ä#C__ITypeMarshal_INTERFACE_DEFINED__ë CSQLUSMALLINTá´§ ä DFRS_ERR_SYSVOL_POPULATE_TIMEOUTâÔ§ äDSEC_E_NOT_SUPPORTEDâì§ ä DDMTT_SUBDEV⨠äDPMSGBOXPARAMSAëD_SET_PARTITION_INFORMATIONãH¨ ä EReadConsoleAéECMSG_BARE_CONTENT_PARAM
 äFnothrow_t”¨ ä FLB_SETSELè FPromptActionáÀ¨ äGP_OVERLAYШ äGHGLRCè GGGO_METRICSâ© äHSE_SELF_RELATIVEá4© ä#HDISPLAY_DEVICE_ATTACHED_TO_DESKTOPãX© äH_PRINTPROCESSOR_INFO_1AêHIID_IEnumGenericá © äIERROR_CTX_MODEM_RESPONSE_VOICEãÀ© äINdrFullPointerFreeãØ© ä IpNotifyNameê ISOFTDISTINFO᪠äJ?$__two_complement@_K$0A@èJERROR_SERVICE_NEVER_STARTEDâTª äKVirtualFreeExpª äKDMBIN_ENVMANUAL〉 äKPIDMSI_STATUS_NEWèKSQL_CA2_SIMULATE_NON_UNIQUEâÔª äL__throws_bad_allocãðª äLTIME_NOSECONDSã« ä"LIMallocSpy_PostHeapMinimize_ProxyèLSQLSetConfigModeá\« äMtagMCI_ANIM_OPEN_PARMSWê MConfigDriverá« äNIsBadHugeWritePtr¼« äNDNS_ERROR_NODE_CREATION_FAILEDãÔ« äNCREATESTRUCTAè N__ICreateTypeInfo_FWD_DEFINED__â(¬ äOSML_ERR_XLT_INVAL_LIST_TYPEê OCRLIssuerèPpaXExtãp¬ äQ_MSL_BEGIN_EXTERN_C⬠äQ__LPGUID_DEFINED__㬬 äQReuseDDElParamëQCERT_CREATE_CONTEXT_PARAáè¬ ä RfFixedDiskã­ äRPMSGBOXPARAMSWã­ äRMCI_TOã4­ äRJOB_CONTROL_PAUSEèRSQL_FN_TD_YEARë SReadConsoleWᘭ ä$T__IHttpSecurity_INTERFACE_DEFINED__êTCreateStdProgressIndicatorãÜ­ äUSET_MIRROR_MODEâü­ äUMCI_DEVTYPE_CD_AUDIOéUSQL_SQL_CONFORMANCEâ4® ä VEWX_REBOOTãP® äVLPMENUITEMINFOWâh® ä VwireHBRUSHã„® äVPSCB_PRECREATEã ® äVSTGM_TRANSACTEDêV??_7IClassFactory@@6B@ãä® äWPEMRSELECTCLIPPATHãü® ä WVK_ICO_CLEARá ¯ äWInitiateSystemShutdownExá8¯ ä WMCI_FREEZEãL¯ äWFO_RENAMEl¯ äWWSAAsyncGetHostByNameˆ¯ äWLPDRIVER_INFO_5Wé WVarI1FromR4âį äXObjectDeleteAuditAlarmãܯ äXCREATESTRUCTWì¯ äX_pdêXSQL_IS_MINUTE ° äYdwAvailPageFileâ4° äYCtlTypeâP° äYDMLERR_NO_ERRORê&YPSSL_EXTRA_CERT_CHAIN_POLICY_PARA˜° äZbV4XPelsPerMeterá°° ä ZAppendMenuãа äZUP_FLAGGED_BYTE_BLOBé ZIBindingá± ä[EFS_USE_RECOVERY_KEYS± ä [IS_ERRORá0± ä [CP_RECTANGLEáD± ä [MCI_OPENáh± ä[tagMCI_ANIM_OPEN_PARMSAê [VarI1FromR8â ± ä\WriteTransferCountãȱ ä\PCRYPT_PKCS8_EXPORT_PARAMSãä± ä\MIDL_wchar_strcpyø± ä\VARENUMê\ELEMENT_STATUS_FULLâ<² ä]RPC_S_OBJECT_NOT_FOUNDë]OutputDebugStrãx² ä^tagEMREXTCREATEPEN㜲 ä^WINDOW_BUFFER_SIZE_EVENTé^_PRINTPROCESSOR_INFO_1Wâä² ä__IMAGE_TLS_DIRECTORY32ä³ ä_SWP_NOCOPYBITSã³ ä_GetKeyboardTypeâ8³ ä_CryptGetKeyParamáX³ ä__CLIENT_CALL_RETURNâ|³ ä_PRINTER_ERROR_INFORMATIONè_QUERY_EXPIRATION_DATE°³ ä `_MAX_EXTáȳ ä `PostGetSizeâè³ ä`IID_IRpcStubBufferë`PREGISTERWORD ´ äaunexpected_handlerã4´ äasmlMapCmdH´ äaNPRGNDATA`´ ä aIDANI_OPENã|´ äaMIDIERR_NOTREADYᘴ äaLPDRIVER_INFO_4AáÌ´ ä.aAsyncIAdviseSink_Begin_OnViewChange_Proxyè´ äaFADF_HAVEVARTYPEéaVarMulã,µ ä#bCRYPT_OID_FIND_LOCALIZED_NAME_FUNCëbCERT_STORE_ADD_ALWAYShµ äciFSTextEffectMSec„µ äcCTL_FIND_SUBJECTécIOInetProtocolSinkStackableâ̵ ädMinorLinkerVersionë dNO_ERRORáøµ ä eREGDB_S_LASTá¶ äeFEATURESETTING_NEGATIVEâ4¶ ä eEN_ERRSPACEâL¶ ä ePP_PROVTYPEâl¶ äeCERT_REVOCATION_INFOéeIPipeByte_Pull_Stub⤶ ä f__file_modesḶ äfAllocatorȶ äfGPTRáè¶ äfRPC_DISPATCH_TABLEëf??_7IDataObject@@6B@á0· ägCERT_STORE_PROV_FILENAME_Aã\· ä gIRunningObjectTable_Revoke_Stubê*gSQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT¨· ähCLOCKS_PER_SECãз ähPROCESS_HEAP_ENTRY_MOVEABLEâô· ähLOCALE_SNATIVELANGNAME㸠ähPSH_PROPSHEETPAGEèhSQL_DTC_UNENLIST_EXPENSIVEã`¸ äiCALLTYPE_TOPLEVEL_CALLPENDINGè iVarBstrCat㌸ äjLPPOINTFX¨¸ äjtagEMREXTTEXTOUTAÀ¸ ä jtimecaps_tagáÔ¸ ä jFD_CLOSEé jSQLExecuteã¹ äkBuildCommDCBAndTimeoutsWá4¹ äkERROR_DS_NO_CHAINED_EVALékIXMLHttpRequest_send_Proxyãp¹ älisgraph‹ äl@338é lSTATUS_NONCONTINUABLE_EXCEPTIONâĹ ä mGenericReadâع ämlstrcpyâð¹ ä mMWT_IDENTITYẠä mpbAtrMaskèmITypeLib_GetTypeInfoType_ProxyãDº änallocator\º ä nCSDVersionãtº ä nLPMETAHEADERጺ änEPS_SIGNATURE¨º änHWND_BROADCASTãĺ änPredictFailureënSQLReadFileDSNWê oEND_PATHá» äpllrintã» äppaYExtëpIPipeLong_Push_ProxyáT» ä qTPM_VERTICALá|» ä"qMCI_WAVE_STATUS_BITSPERSAMPLE¤» äqCERT_STORE_PROV_FILENAME_Wã´» ä qUsageÔ» äqUSER_CALL_IS_ASYNCãø» äqERROR_TRAY_MALFUNCTIONëqIID_IOplockStorageã8¼ ärUPDFCACHE_ONLYIFBLANKèrDIID_XMLDOMDocumentEventsx¼ äsERROR_NO_SITENAMEŒ¼ ä sProductIdèsIMM_ERROR_GENERALètCERT_STORE_DELETE_FLAGã༠ä uI_RpcSendè#u__IXMLElement2_INTERFACE_DEFINED__ã4½ ävSYSTEM_AUDIT_OBJECT_ACEâL½ ä vMETA_BITBLTêvlpServiceName€½ äwERROR_IS_JOINED✽ äwLPDRIVER_INFO_4Wá´½ ä wtagBIND_OPTSé-wIEncodingFilterFactory_GetDefaultFilter_Stubâ¾ äxLC_WIDEêxSTG_TOEND8¾ äyIMAGE_DIRECTORY_ENTRY_TLST¾ äyWM_CTLCOLORBTNëySPI_GETDEFAULTINPUTLANG☾ äzFS_FILE_ENCRYPTION㸾 äzCertFreeCRLContextãྠäzCryptInstallCancelRetrievalêzPrinterProperties ¿ ä{IMAGE_DEBUG_MISC_EXENAMEá0¿ ä{HKL__è{SQL_MAX_COLUMNS_IN_ORDER_BYê|ITypeInfo_GetVarDesc_Proxy㤿 ä}BuildCommDCBAndTimeoutsAé%}AsyncIAdviseSink_Begin_OnClose_Proxyáð¿ ä~DDE_FACKRESERVEDé~QueryUsersOnEncryptedFile,À ä TMPF_DEVICEâ@À äPC_WIDEâdÀ äIEnumSTATDATA_Reset_Proxyè&__IDataObject_INTERFACE_DEFINED__¤À ä €__mac_osáÐÀ ä&€CO_E_REMOTE_COMMUNICATION_FAILUREèÀ ä€pi_R0_allvalsøÀ ä€rad14è%€__IXMLDOMCharacterData_FWD_DEFINED__á@Á ä e32_ddkverãPÁ ä rad15|Á äCERT_CHAIN_FIND_BY_ISSUER_PARAëLPDRIVER_INFO_3Aá¬Á ä ‚offsetofá¼Á ä‚@346áÌÁ ä ‚fabsfÜÁ ä ‚rad16ôÁ ä ‚MM_MIM_CLOSEáÂ ä ‚LPWAVEHDRè$‚URLPOLICY_AUTHENTICATE_CLEARTEXT_OKâ` äƒDNS_ERROR_NBSTAT_INIT_FAILEDáxÂ ä ƒLPMMIOINFOã Â äƒPFN_CMSG_EXPORT_ENCRYPT_KEYâÈ ä"ƒURLACTION_AUTHENTICATE_CLIENTè äƒURLZONEREG_DEFAULTë ƒVarCyFromIntáÃ ä „ciexyzBlueã4à ä„GetTextMetricsWâDÃ ä „KF_UP\à ä„LBN_SELCANCELlà ä„rad10è„KP_Pá Ã ä…SCHED_E_TASK_NOT_RUNNINGá¼Ã ä…GETPRINTINGOFFSETÌÃ ä …rad11Üà ä…KP_QáøÃ ä…VT_STORED_OBJECTá$Ä ä…??_7IGlobalInterfaceTable@@6B@ë…tagURLTEMPLATEã\Ä ä†ERROR_NOT_FOUNDâlÄ ä†rad12è †grfStateBitsá˜Ä ä ‡QuadPartá´Ä ä‡AddressOfRawDataáÔÄ ä‡RESOURCETYPE_UNKNOWNáäÄ ä ‡rad13Å ä)‡__IInternetSecurityManager_FWD_DEFINED__é ‡GetMonikerã@Å ä ˆfabslTÅ äˆLPDOCINFOtÅ äˆParentObjectInstanceéˆIOCTL_CHANGER_SET_POSITIONã´Å ä ‰DATA_E_FIRSTáÌÅ ä ‰WM_COMMANDãôÅ ä‰IPersistFile_IsDirty_ProxyãÆ ä‰IPipeLong_Pull_Proxyá4Æ ä‰SQL_API_SQLDISCONNECTè‰SQL_SSF_TRANSLATEtÆ äŠ??_7exception@std@@6B@ãŒÆ ä ŠszShortNameêŠMS_ENH_DSS_DH_PROVãÀÆ ä‹char_typeÜÆ ä‹SELECTPAPERSOURCEøÆ ä‹COLOR_MENUTEXTë‹??_7IXMLElementCollection@@6B@ã8Ç äŒnGlyphsâLÇ ä ŒSO_ERRORá\Ç äŒKP_XáxÇ äŒkeyLocatorInfoãŒÇ äŒwMethodêŒ__IBinding_FWD_DEFINED__áÐÇ äIMAGE_SYM_TYPE_PCODEáôÇ äIMAGE_REL_BASED_SECTIONâ È ä COMADMIN_E_COMPFILE_LOADDLLFAILâ8È ä PFD_STEREOãTÈ ätagEMRCREATEPENâdÈ äKP_Yá|È ä PP_UI_PROMPTéNODE_NOTATION´È äŽSERVICE_SYSTEM_STARTáÌÈ ä ŽPSYSTEMTIMEâìÈ äŽWriteProcessMemoryãÉ äŽObjectPrivilegeAuditAlarm(É ä ŽMessageBeepâ@É ä ŽVIF_MISMATCHáhÉ äŽCRYPTPROTECT_PROMPT_STRONGëŽSERVER_ROUTINEã¤É äCONVERT10_E_STG_FMTêIAuthenticateÐÉ ärclsid1âðÉ äGetAcceptExSockaddrsé BORDERWIDTHSáÊ ä‘LPJOYINFODÊ ä‘NdrInterfacePointerUnmarshallè‘MSHLFLAGS_NORMALá|Ê ä’GetTextMetricsAâ¬Ê ä%’IXMLDOMCharacterData_appendData_Stubé ’SQL_IC_MIXEDáÜÊ ä “SmlDelete_tâðÊ ä“rclsid2âË ä “BM_GETIMAGEâ Ë ä “NPMMIOINFOã0Ë ä“KP_GáPË ä“CERT_STORE_PROV_LDAPé“CAPROPVARIANT”Ë ä!”??_Eunderflow_error@std@@UAE@I@Zá¨Ë ä ”LONG_PTRé”TF_WRITE_BEHINDâèË ä•LOAD_LIBRARY_AS_DATAFILEáÌ ä•BATTERY_FLAG_CRITICALè•IXMLDocument2_put_charset_StubãHÌ ä –__fwriteé–??_7IBinding@@6B@xÌ ä—VK_DIVIDEÌ ä—PROXY_MARSHALè—LPDRIVER_INFO_3WáÔÌ ä˜TAPE_DRIVE_LOAD_UNLD_IMMEDãìÌ ä ˜PARITY_MARKâÍ ä˜GetCurrentProcess$Í ä˜PSH_NOAPPLYNOWë$˜IXMLDOMDocument_get_parseError_StubâhÍ ä™SIZE_Tã€Í ä ™OPENCHANNELâ¤Í ä™PRINTER_ATTRIBUTE_LOCALê ™__urlmon_h__éšEndHeadNumberðÍ ä›__extended_hugeâ Î ä›ERROR_NOT_READYâ$Î ä ›SS_OWNERDRAWé›X509_CERT_TO_BE_SIGNEDãtÎ ä!œ??_Gunderflow_error@std@@UAE@I@ZáˆÎ äœDI_MASKêœSCONTEXT_QUEUEëERROR_DS_DATABASE_ERRORâðÎ äžIMAGE_SIZEOF_BASE_RELOCATIONáÏ äžX509_DH_PARAMETERSã,Ï äžIOleInPlaceObjectè(ž__DOMFreeThreadedDocument_FWD_DEFINED__âxÏ ä ŸNLS_HIRAGANAáœÏ äŸ_CERT_ACCESS_DESCRIPTIONéŸuArrayStructsÌÏ ä  XPT_SERVERãäÏ ä  xmit_abortsâÐ ä* _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO,Ð ä  NIKON_12_RWê  get__newEnumálÐ ä¡ERROR_BAD_VALIDATION_CLASSãŒÐ ä¡dwDistPointNameChoice¨Ð ä¡LPDRIVER_INFO_2Aé¡BINDF_FREE_THREADEDâèÐ ä¢?$__num_bits@$0PP@äÑ ä ¢NONZEROLHNDâ0Ñ ä$¢ERROR_DS_DRA_EXTN_CONNECTION_FAILEDâDÑ ä ¢recvfromá`Ñ ä¢PrinterMessageBoxè¢SQL_SS_ADDITIONSé£SQL_DATE_STRUCTâ°Ñ ä ¤RegOpenKeyWâÐÑ ä¤SPLDS_PRINTER_MODELê¤LPSTORAGEøÑ ä ¥R2_WHITEáÒ ä¥PEMRSETTEXTCOLORá<Ò ä¥PMIXERCONTROLDETAILS_SIGNEDê¥MDM_PROTOCOL_HDLCPPP_112K„Ò ä¦RegisterWindowMessageAã´Ò ä#¦CRYPT_VERIFY_CERT_SIGN_SUBJECT_CRLãäÒ ä%¦__AsyncIPipeLong_INTERFACE_DEFINED__é"¦ITypeLib_RemoteFindName_Proxy(Ó ä§CLIPBRD_S_LASTã8Ó ä§aptsáLÓ ä §hbmColoré§rgbColors„Ó ä¨SCARD_E_INVALID_HANDLEã˜Ó ä¨methodã´Ó ä¨pUnkForReleaseãÔÓ ä¨GL_ID_INPUTREADINGë¨SQL_INITIALLY_IMMEDIATEâ Ô ä ©IDC_ICONé©NdrFullPointerQueryPointerãTÔ äªinput_iterator_tagãxÔ äªSetSystemTimeAdjustmentêªWM_VKEYTOITEM¨Ô ä «DaylightNameáÌÔ ä«ERROR_DS_FILTER_UNKNOWNâèÔ ä«ANSI_FIXED_FONTãÕ ä «CloseFigureâ(Õ ä«CERT_QUERY_FORMAT_FLAG_ALLë «SCardCancelâXÕ ä¬ATF_TIMEOUTONlÕ ä¬HashAlgid¨Õ ä/¬AsyncIAdviseSink2_Finish_OnLinkSrcChange_ProxyãÀÕ ä ¬INVOKE_FUNCâÜÕ ä¬LBSELCHSTRINGAë¬ODBC_REMOVE_DSNâÖ ä­PEXCEPTION_RECORD,Ö ä ­TRUST_E_FAILáLÖ ä­I_RpcFreePipeBufferâhÖ ä­NODE_ATTRIBUTEë­SQL_ACCESSIBLE_TABLES°Ö ä®TYPE_E_INCONSISTENTPROPFUNCSáÈÖ ä®LPCURSORSHAPEØÖ ä®expráüÖ ä®PPRINTPROCESSOR_INFO_1Wê ®IMEVER_0310ê¯VER_SUITE_SMALLBUSINESSâH× ä°explál× ä°THREAD_SET_INFORMATIONã× ä°RegisterWindowMessageWã°× ä°MCIERR_DEVICE_LOCKEDáÐ× ä°X509_PUBLIC_KEY_INFOé"°IXMLDOMDocument_loadXML_ProxyØ ä±sml_devinf_devinf_sâ@Ø ä±PTAPE_GET_MEDIA_PARAMETERSãhØ ä±PERF_PRECISION_100NS_TIMERãŒØ ä±SQL_ODBC_API_CONFORMANCEé±SQL_LCK_EXCLUSIVEÀØ ä²__file_handleÜØ ä²VER_BUILDNUMBERâôØ ä ²RegOpenKeyAâ Ù ä ²MM_MOM_CLOSEá(Ù ä²MCI_INFO_PRODUCTáHÙ ä²??_7IEnumOLEVERB@@6B@è²IME_ESC_GETHELPFILENAMEâÙ ä³RPC_C_PARM_BUFFER_LENGTHá¬Ù ä³SCARD_T1_REQUESTáÌÙ ä³tdDeviceNameOffsetë+³IInternetSecurityManager_MapUrlToZone_StubãÚ ä´SetCommConfigDÚ ä´IOCTL_STORAGE_CHECK_VERIFYë!´StgGetIFillLockBytesOnILockBytesáˆÚ ä µDaylightBiasá¬Ú äµSCARD_E_DUPLICATE_READERáÀÚ äµBITMAPëµSQL_ENTIRE_ROWSETôÚ ä ¶_IO_COUNTERSá Û ä ¶HELP_TCARDë!¶RESOURCEDISPLAYTYPE_NDSCONTAINERá\Û ä·NETSCAPE_SIGN_CERT_TYPEâxÛ ä·LPDRIVER_INFO_2Wé ·MODEMDEVCAPSá¤Û ä¸size_tã¼Û ä ¸PACE_HEADERâÌÛ ä¸aptláäÛ ä¸CALLBACK_TASKøÛ ä¸PSCODEë¸PPRINTPROCESSOR_INFO_1Aâ0Ü ä ¹store_asáTÜ ä¹STATUS_INTEGER_OVERFLOWê ¹FR_FINDNEXTâ|Ü äºexpfáœÜ äº?$__num_bits@$0HP@ãÄÜ äºERROR_INVALID_MINALLOCSIZEëºLBSELCHSTRINGWãøÜ ä »FLT_MANT_DIGáÝ ä»reverse_iteratorá<Ý ä»PTAPE_SET_MEDIA_PARAMETERSë»IUrlMonâpÝ ä¼SECURITY_BATCH_RIDã”Ý ä¼UNIVERSAL_NAME_INFO_LEVELÄÝ ä$¼IViewObject_RemoteGetColorSet_ProxyâäÝ ä¼??_7IXTLRuntime@@6B@áüÝ ä ¼PARSE_ESCAPEáÞ ä¼NI_IMEMENUSELECTEDë¼SQL_OU_DML_STATEMENTSdÞ ä"½RPC_E_CANTCALLOUT_INASYNCCALL|Þ ä ½tmStruckOutâœÞ ä½RPC_C_MQ_PERMANENTãÐÞ ä*½CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAGè½IID_ICreateTypeInfo2áß ä¾bitmaskê*¾CMSG_KEY_AGREE_ENCRYPT_FREE_PARA_FLAGTß ä¿hyper_from_ndr_tempâxß ä¿VariantTimeToSystemTimeê ¿SQL_IS_HOURâ¨ß äÀdwProvSubType¼ß äÀMMTIMEãØß äÀrgCertPolicyIdëÀ??_7IDropTarget@@6B@áà ä ÁDS_S_SUCCESSéÁLPDRIVER_INFO_1AáXà ä ÂERROR_NONPAGED_SYSTEM_RESOURCESâxà äÂWNetCancelConnectioná¨à ä#ÂMIXERCONTROL_CONTROLTYPE_MILLITIMEãÈà äÂUSER_MARSHAL_FC_SHORTìà äÂPDRIVE_LAYOUT_INFORMATIONè ÂInsertMenusâá ä ÃsmlLibStrcatá4á äÃCRYPT_SUCCEEDèÃ??_7IWinInetHttpInfo@@6B@tá äÄCreateProcessInfoŒá ä ÄpPrinterNameéÄSQL_SR_USAGE_ON_COLLATIONÈá ä ÅSETLINECAPãðá äÅPAN_XHEIGHT_CONSTANT_LARGEëÅDFCS_INACTIVEâ ä ÆOBJ_BRUSHèÆEM_SCROLLXâ äÇtMIXERCONTROLDETAILS_BOOLEANé&ÇICreateTypeInfo_SetDocString_Stub”â ä È_gcvt¸â äÈSPI_GETWINDOWSEXTENSIONâÌâ äÈHOSTENTê"Èsz_CERT_STORE_PROV_SMART_CARD ã ä ÉSML_PE_FINALá$ã ä ÉIMAGE_BITMAPáHã äÉRPC_C_MQ_CLEAR_ON_OPENãhã äÉTAPE_RESET_STATISTICS€ã äÉHWND_UserSizeèÉSC_MANAGER_ALL_ACCESS¼ã äÊmax_sess_pkt_sizeÜã äÊFSCTL_DISMOUNT_VOLUMEøã äÊVarBoolFromIntë ÊSQL_AM_NONEâ0ä äËPCERT_ALT_NAME_ENTRYá\ä ä ËCERT_STORE_PROV_NO_PERSIST_FLAGâ|ä äËBeginningTransactionáœä äËMDM_HDLCPPP_AUTH_CHAPèËSQL_FN_STR_SOUNDEXãÐä ä Ìmaxoccuráüä ä ÌERROR_SERVICE_MARKED_FOR_DELETEâå äÌPSINJECT_TRAILERá,å äÌVK_RETURNLå äÌSM_MENUDROPALIGNMENTádå äÌDATE_LONGDATEŒå ä"ÌOLEVERBATTRIB_ONCONTAINERMENU¤å ä ÌSF_UNKNOWNãÈå äÌSQL_PARAM_INPUT_OUTPUTëÌSQL_SP_QUANTIFIED_COMPARISONé ÍVT_VARIANTã æ äÎLANG_GUJARATI8æ ä ÎPIO_COUNTERSáPæ ä ÎdshSectionãhæ äÎWM_CANCELMODE€æ ä ÎIEnumVARIANTéÎSQLInstallODBCã¸æ äÏLPENUMLOGFONTEXWáÔæ äÏEMRPOLYBEZIER16âìæ ä ÏMB_USERICONâç äÏMCI_USER_MESSAGES4ç ä Ï__IMarshal2_INTERFACE_DEFINED__ê+ÏIXMLHttpRequest_getAllResponseHeaders_StubãŒç äÐERROR_SEVERITY_ERRORá°ç äÐSUBLANG_SPANISH_GUATEMALAÄç ä ÐAceCountáØç ä ÐHMIDISTRMèÐIEnumUnknown_Skip_Proxyâè äÑVALENTã(è ä ÑdwAttributesáXè ä&ÑCMSG_KEY_TRANS_ENCRYPT_FREE_PARA_FLAGèÑCryptVerifyMessageSignatureâ”è ä ÒgrfFlagsé ÒCTRL_C_EVENTáÈè äÓFILE_SHARE_DELETEÜè äÓ_lopenãé ä!ÓERROR_DS_SECURITY_ILLEGAL_MODIFYá$é äÓtagPROPVARIANTëÓQueryServiceStatusã`é äÔis_member_pointer|é äÔDdeConnectListãœé äÔPCERT_TRUST_LIST_INFOè ÔSQL_RD_OFFãÌé äÕSKF_AVAILABLEèé äÕPCRYPT_ATTRIBUTEéÕfMDIAppâê äÖWM_MDICASCADE0ê äÖVIF_CANNOTREADDSTèÖIRecordInfo_GetSize_Stubátê ä×TAPE_DRIVE_PADDINGã˜ê ä×GetEnhMetaFileDescription¼ê ä×szOID_ISSUER_ALT_NAME2ãØê ä×szOID_PKCS_7_DATAôê ä×LPDRIVER_INFO_1Wé$×IInternetProtocolRoot_Suspend_Proxyâ<ë ä Ø__msl_spaceâLë äØwhatá`ë äØControlâ„ë äØPSINJECT_BEGINDEFAULTSë ØMOM_OPENá´ë äÙLPENUMLOGFONTEXAáÔë äÙDCTT_DOWNLOAD_OUTLINEèë ä ÙAuthFlagsèÙPCCRYPT_OID_INFOá ì äÚDRAGDROP_S_DROPâ4ì äÚBS_ICONâPì äÚDlgDirSelectExãlì äÚLCMAP_KATAKANAã”ì ä"ÚRPC_C_NOTIFY_ON_SEND_COMPLETE´ì äÚCertEnumSystemStoreê*ÚIOleInPlaceUIWindow_SetActiveObject_ProxyèÛcbInnerStringèÜSQL_BS_ROW_COUNT_EXPLICIT4í äÝSig1áTí äÝLookupPrivilegeNameâ|í äÝERROR_CLASS_ALREADY_EXISTSã˜í äÝPFD_OVERLAY_PLANEè ÝCAL_HEBREWãÈí ä ÞSML_PE_ADDãØí äÞSig2áìí äÞMK_S_LAST î äÞDMTT_DOWNLOAD_OUTLINE$î ä ÞC3_HALFWIDTHéÞdwOptDataSizeTî ä ßwstreambufãdî äßBitsáˆî äßACL_REVISION_INFORMATIONá î ä ßWH_MAXHOOKã¼î äßSendNotifyMessageèßhPrintTemplateãðî äà__wOutStrCtrl ï äàtagENHMETARECORDá0ï äàRpcNsProfileEltInqBeginWéàszOID_X957_DSAã`ï äáULONGLONGxï äáUserSidLength”ï äáotmPanoseNumberâ´ï äáPERF_COUNTER_TIMERãðï ä0áISoftDistExt_AsyncInstallDistributionUnit_ProxyêáSQL_C_TIMESTAMPâ0ð äâERROR_DS_OBJ_TOO_LARGEãDð äâDDS_4mmâlð äâSQL_C_INTERVAL_YEAR_TO_MONTHéâSQL_CU_INDEX_DEFINITIONâ ð äã_t_âÄð äãERROR_NOT_CHILD_WINDOWë ãNODE_ENTITYâøð ääNEWTEXTMETRICAãñ äätagEMRSETTEXTCOLORã<ñ ääRESOURCEDISPLAYTYPE_FILEéäSQL_SC_TRY_UNIQUExñ äåEnterCriticalSectionáñ äåR2_NOTMASKPENèåWSAIsBlocking¼ñ ä æ__localeáäñ äæPIMAGE_COFF_SYMBOLS_HEADERãøñ äæCE_TXFULLò ä æInsertMenuWâ0ò äæmidiOutPrepareHeaderé.æAsyncIAdviseSink_Finish_OnDataChange_Stub€ò äçGetGlyphOutlineAáœò äçExtSelectClipRgná¬ò äçcptséçLOCALE_USE_CP_ACPèò äèTIME_ZONE_INFORMATIONó äèOpenFileMappingAá ó äèCreateMetaFileAâ4ó äècyDestëèGetNumberFormatâhó ä éPRF_CHILDRENáˆó äéCMSG_VERSION_PARAMã¨ó äéCMSG_HASHED_DATA_V0âÄó äéNumberOfBucketsêéNdrSimpleStructFreeâüó ä êreplace_ifëê_SERVICE_DESCRIPTIONA<ô äëCMSG_HASHED_DATA_V2âPô äëTravanëëLPBINDINGˆô äìEVENTLOG_BACKWARDS_READâ¬ô äìGetPrivateProfileStructAáÐô äìSCHED_S_TASK_NO_MORE_RUNSèô ä ìNTE_BAD_HASHá õ äìSPI_SCREENSAVERRUNNINGã,õ äìWAVERR_STILLPLAYINGêìPARSE_SECURITY_URLãdõ ä ípfnDlgProcëí__MSXML_LIBRARY_DEFINED__˜õ äîexp2á¬õ ä îLOGBRUSHáÄõ ä îParamNumberâôõ ä%îNdrConformantVaryingStructBufferSizeé-îIOleInPlaceUIWindow_RequestBorderSpace_ProxyáPö äïRPC_X_INVALID_PIPE_OBJECTpö äïDNS_ERROR_SETUP_BASEéïImmIsUIMessageã ö äðrgbRedë ðInsertMenuAâÔö äñXPT_DATA_SECTIONáìö ä ñDeviceNameã÷ äñGetGlyphOutlineWá ÷ äñiArcDirection@÷ äñSetMenuContextHelpIdáT÷ ä ñLoadIconáx÷ äñRPC_MGMT_AUTHORIZATION_FN”÷ äñPPERF_OBJECT_TYPE¨÷ äñSOCKETãÄ÷ äñCFSTR_MIME_NULLê ñUDATEð÷ äòNEWTEXTMETRICWãø äòjoyGetPosø ä ònode_countã8ø äòDragQueryPointëòRegisterServiceCtrlHandlerExáxø äóMM_DRVM_ERRORœø äóMCI_GETDEVCAPS_CAN_RECORD¼ø äóMCI_VD_ESCAPE_STRINGáÜø äóMCI_SEQ_STATUS_PORTâðø äóVarEqvëóEnumServicesStatusExá4ù äôSE_INC_BASE_PRIORITY_NAMEPù äôDM_OUT_DEFAULTãhù äôSetMiterLimit„ù äôLCMAP_LOWERCASEê"ôIXMLElement_put_tagName_ProxyÈù äõsmlAllocSyncHdrâàù äõframe_controlèõCryptMsgSignCTLâú äösmlAllocAlert4ú äöSCARD_E_DIR_NOT_FOUNDPú äöPFD_SWAP_EXCHANGElú äöWINDOWPLACEMENTâ€ú äödwUserã¤ú äöRpcNsProfileEltInqBeginAéö__MIDL_DECLSPEC_DLLIMPORTè÷bmBitsãìú äøcptláû äøRegQueryInfoKeyêø_XMIT_ROUTINE_QUINTUPLEâLû äùsml_metinf_metinf_sâdû äùANYSIZE_ARRAYˆû äù_IMAGE_TLS_DIRECTORY64ã¤û äùJOB_STATUS_ERRORá¸û äùSetDataêùSetStatusTextäû ä úhmacInfoáü ä%úJOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OKá8ü äúGetPrivateProfileStructWáXü äúwglGetCurrentContextéúCALG_SKIPJACKü äûSYSTEM_ALARM_ACE_TYPE¬ü äûEMR_POLYPOLYGONâÌü äûGetMenuContextHelpIdáèü äûWAVECAPS_PITCHëûImmSetOpenStatusáý äüGetDataâHý ä*üIXMLDOMCharacterData_insertData_ProxyXý äüdepthèü_SERVICE_DESCRIPTIONW”ý äýgetprotobynumberá¬ý ä ýOpenStorageêýIWindowForBindingUIâàý ä þmakepathâþ äþSE_LOCK_MEMORY_NAMEâþ äþWT_EXECUTEDEFAULT8þ äþOpenFileMappingWáTþ äþEqualPrefixSidãpþ äþMETAFILE_DRIVERâŒþ äþCreateMetaFileWâ¨þ äþEMRSTRETCHDIBITSáÄþ äþNdrServerCall2ãðþ ä!þPRINTER_NOTIFY_FIELD_TOTAL_BYTESéþput_value ÿ äÿFILE_ACTION_ADDED@ÿ äÿPEMRREALIZEPALETTEãTÿ äÿNCBUNLINKtÿ äÿX509_CRL_REASON_CODEéÿbstrDescriptionâ¨ÿ å push_frontã¼ÿ å DC_DRIVERé LPJOB_INFO_1áðÿ ä?$__num_bits@$0P@ äFILE_ACTION_RENAMED_OLD_NAMEáH ä#IMAGE_FILE_REMOVABLE_RUN_FROM_SWAPã\ äLocalFreep ä C1_UPPERሠä NPJOYCAPSWã° äCMSG_KEY_AGREE_ENCRYPT_INFOâÔ äPFN_IMPORT_PRIV_KEY_FUNCé WINOLEAPI_ã ä LPJOB_INFO_3éPIDDSI_COMPANYã8 ä __va_startã` äERROR_DRIVE_MEDIA_MISMATCH㌠ä SPAPI_E_DEVICE_INTERFACE_ACTIVEê LPJOB_INFO_2áÀ äfirst_referenceâà äIStorage_Revert_Stubáø ä CreateStubã ä UnknownStrã$ ä hreftypeéSQL_INTERVAL_DAY_TO_SECONDãh äMMIO_EXCLUSIVE㤠ä6CRYPT_UNICODE_NAME_ENCODE_DISABLE_CHECK_TYPE_FLAGÀ äpRpcChannelBufferè äNdrInterfacePointerMarshallêwireSTGMEDIUM äistringstream( äLPTRéPRF_CHECKVISIBLEáT äphhkál ä LPJOYCAPSAëQUERY_REFRESH¨ äBidirectionalIterator1ãÈ äGetTextExtentPointWâà ä EMRPOLYGON16áô äHTHSCROLL äCERT_COMPARE_EXISTING4 ä_wireSAFEARR_BRECORDé hstmth ä IMAGE_REL_MIPS_REFWORD㌠ä ERROR_INVALID_SERVICENAMEè CloseÀ ä BidirectionalIterator3ë DFCS_SCROLLUPü ä BidirectionalIterator2ã ä HCBT_CLICKSKIPPED@ ä" BINDINFO_OPTIONS_DISABLE_UTF8h ä SQL_MAX_COLUMNS_IN_GROUP_BYê SQL_FN_TD_WEEK㨠ä ERROR_BAD_QUERY_SYNTAXãÄ ä CheckRadioButtonáä ä tagMINIMIZEDMETRICSê# ICreateTypeInfo_SetDocString_Proxyë SZDDESYS_ITEM_TOPICSé SOL_SOCKETãd ä ReadFileExëdwInFlags ä PP_IMPTYPEëSQL_DESC_UNSIGNEDÔ äERROR_NETLOGON_NOT_STARTEDãð äCO_E_APPNOTFOUNDá ä LPJOYCAPSWã ä ncb_nameá< äCFSTR_MIME_X_BITMAPâ` äURLACTION_HTML_CURR_MAXêSQL_INDEX_KEYWORDS㨠äIRpcStubBuffer_Invoke_StubëSQL_CS_DEFAULT_CHARACTER_SETáä ä dwFramesáü ä SHGFI_ICONëSQL_API_SQLFOREIGNKEYSãD äCRYPT_E_SECURITY_SETTINGSl äDMLERR_DLL_NOT_INITIALIZEDëdwTemplateRecommended¤ ä DM_IN_PROMPTáÈ ätagEMRCREATECOLORSPACEãè äGetFileVersionInfoã äPRINTER_STATUS_PAGE_PUNTé3__IInternetHostSecurityManager_INTERFACE_DEFINED__ãl äNdrSH_TLUPDecision㌠äISynchronizeContainerèPROPSETFLAG_DEFAULTâÌ äERROR_UNKNOWN_PORTãè äCRYPT_E_ASN1_NYIâ ä NPJOYCAPSAã äSPLREG_RETRY_POPUPã4 ä tagSTGTYéIME_CMODE_ROMANâp äERROR_INSTALL_FAILURE„ äEMR_MIN✠ä DT_WORDBREAKá° äMCI_CLOSEÔ äIDataObject_DAdvise_Proxyì ä AddFuncDescê IGP_SENTENCEá$ äTRUST_E_TIME_STAMPë SQL_DESC_DATETIME_INTERVAL_CODEâl äOUT_RASTER_PRECISè GetClassInfoéCERT_EFSBLOB_REGPATHá¼ ä SYSPAL_ERRORáØ äSCARD_COLD_RESETáô äcguidInterfacesâ äIAdviseSink_OnClose_Proxyè SQL_C_DOUBLEéPRINTER_STATUS_DOOR_OPENát äGetTextExtentPointAêPIDDSI_HEADINGPAIRãÀ ä!CRYPT_E_STREAM_INSUFFICIENT_DATAáà äszOID_PKCS_7_DIGESTED äCMSG_OID_IMPORT_KEY_AGREE_FUNCã8 ä&CERT_SYSTEM_STORE_CURRENT_SERVICET äFirstDriveNumberéVARIANT_LOCALBOOLè COLOR_WINDOWFRAME¤ ä!CreateRectRgnÀ ä!EMR_SETMITERLIMITÜ ä!DFCS_BUTTON3STATEô ä !midiInCloseâ  ä !MMIOM_WRITEâ, ä!SHFreeNameMappingsë!HlinkSimpleNavigateToStringâp ä"smlStatusCmdFuncá” ä"GetOldestEventLogRecordâ¼ ä"CreateDialogIndirectParamWãÜ ä"WNetUseConnectionAãô ä "PF_APPLETALKá  ä "szOID_OIWSECé2"SORTED_CTL_EXT_HASHED_SUBJECT_IDENTIFIER_FLAGX ä#Regionãp ä #META_CHORD㈠ä#CTRY_HONDURAS˜ ä#uiLoá° ä #NRC_IFBUSYãÈ ä #FORM_PRINTERé!#ITypeInfo_RemoteGetTypeAttr_Stubá ä$WNetAddConnection0 ä$WNetDisconnectDialogáT ä$RpcBindingSetAuthInfoWã„ ä$$NdrConformantVaryingArrayMemorySizeê$BINDSTRING_PTR_BIND_CONTEXTê%dwContextHelpIdâè ä&SPI_SETPOWEROFFACTIVE ä&MKF_HOTKEYACTIVEá( ä&CLSID_InProcFreeMarshalerè&&IXMLDOMNotation_get_systemId_Stubp ä'PIMAGE_DOS_HEADERŒ ä'HCBT_KEYSKIPPED⤠ä 'wCountryID㸠ä'lpfnCheckÜ ä'IID_IOleInPlaceUIWindowâø ä'SAFEARR_BRECORDâ ä'SQL_ISV_TRANSLATIONSé 'SQL_ENSUREãH ä (DIFFERENCEãd ä(EnumSystemLocales| ä(ImageableAreaŒ ä(pIIDá¼ ä#(IInternetProtocolRoot_Suspend_StubãÌ ä(HSTMTè (SQLPrepareAâô ä )close$ ä%)ERROR_DS_ILLEGAL_XDOM_MOVE_OPERATIONáH ä)NdrFixedArrayUnmarshallâh ä)LPCSCARD_IO_REQUESTê)Timeá ä *SO_OOBINLINEá° ä*VARFLAG_FNONBROWSABLEè*SQL_CA1_POSITIONED_UPDATEø ä+IMAGE_REL_ALPHA_SECRELã ä+REGDB_E_BADTHREADINGMODEL4 ä +CopyCursorãP ä+ABN_FULLSCREENAPPè+szOID_X21_ADDRESS˜ ä&,ACE_INHERITED_OBJECT_TYPE_PRESENT¨ ä,LPTxé#,RPC_C_QOS_CAPABILITIES_MUTUAL_AUTHë .ODBC_SUPPORTá  ä/front_inserterã$ ä/tagEMRELLIPSE4 ä /lpposL ä /dwFileFlagsâh ä/PMONHSZSTRUCTAë/PMCI_OVLY_WINDOW_PARMSAâ  ä0getpidë0PD_PRINTSETUPÔ ä1NumberParametersáð ä1dwFlickerFilterâ  ä1MetaDataWritesë 1BindTypeá8 ä 2RPC_E_FAULTâ\ ä2RpcBindingSetAuthInfoAãp ä2listen㈠ä2DHPUBKEY_VER3  ä 2PostRealloc⸠ä 2VT_HARDTYPEâÜ ä2SQL_ODBC_SQL_CONFORMANCEé2SQL_CA1_POS_REFRESHâ ä3SML_ERR_WRONG_USAGEâ8 ä3SS_LEFTNOWORDWRAPP ä 3_BIN_COUNTë 3SQLINTERVALâ ä4CreateDialogIndirectParamAã° ä4WNetUseConnectionWãÌ ä4DDE_FAPPSTATUSë4chx8áð ä5wcstollâ  ä$5JOB_OBJECT_UILIMIT_SYSTEMPARAMETERSâ@ ä5SCARD_W_RESET_CARDãX ä 5DST_COMPLEXê5chx9é6ISurrogate_LoadDllServer_Proxyã° ä7RPC_S_WAITONTIMERØ ä7COMADMIN_E_OBJECTNOTPOOLABLEáì ä7FW_MEDIUM  ä7FOCUS_EVENT_RECORDã4 ä7WN_CONNECTED_OTHER_PASSWORDê7SQL_CB_NON_NULLâd ä8LC_TIMEâ| ä 8smlAllocGet☠ä8biXPelsPerMeter⬠ä 8WM_TCARDá¼ ä8chx4áØ ä8ALG_SID_TLS1PRFâì ä 8VTBIT_UI4è8SQL_CVT_LONGVARCHARâ( ä9PMONHSZSTRUCTWã8 ä9chx5á\ ä9PMCI_OVLY_WINDOW_PARMSW⌠ä#9CERT_STORE_SET_LOCALIZED_NAME_FLAGã° ä9GetInterfaceFromGlobalë9CFSTR_MIME_TEXTâÜ ä:chx6á ä:IOleAdviseHolder_Unadvise_Stubë :LPOLEOBJECTâ0 ä ;__raw@ ä;chx7é ;ITypeInfo2_GetVarCustData_Proxy∠ä<SML_PE_REPLACEã  ä<FILE_MAP_READÌ ä!<ERROR_DS_RDN_DOESNT_MATCH_SCHEMAáä ä <SM_CYSMSIZEâ ä<PP_KEYEXCHANGE_ALGã, ä<CRYPT_GET_URL_FROM_EXTENSIONáH ä<IID_IEnumStringê <CF_USESTYLE†ä=CREATE_SHARED_WOW_VDMœ ä=GCP_GLYPHSHAPE㸠ä=tagEMRPOLYLINEãÈ ä=chx1áà ä=REPLACEDLGORDü ä=waveOutGetVolumeá ä=IStorage_Stat_Proxyê=VTBIT_UI1P ä>EASTEUROPE_CHARSETã` ä>chx2ጠä >szOID_AUTHORITY_REVOCATION_LIST⨠ä>NdrAsyncStubCallá¼ ä>BytesReadÐ ä >VTBIT_UI2è >SQLPrepareWâ ä?LOCALE_INEGCURRâ ä?chx3á( ä?WSARecvEx@ ä?NODE_DOCUMENTè?selectSingleNodeáx ä@GetStringTypeWã” ä@tagMIXERCONTROLWáÈ ä(@IStdMarshalInfo_GetClassForHandler_Stubê@SQLBulkOperationsá äACERT_E_EXPIREDã äAPFD_NEED_PALETTEéApszStatusH ä BCreateEventWáp äBERROR_CLUSTER_NETWORK_EXISTSá äBLPMCI_VD_ESCAPE_PARMS¼ äB__IMessageFilter_FWD_DEFINED__ãÔ äBINTERFACEDATAèBGL_ID_TYPINGERRORè CCF_DSPTEXTã$ äDERROR_DISK_FULLâ< ä DCTRY_JAMAICAáX äDCreateDataCacheê%D__MIDL_itf_oleidl_0000_v0_0_s_ifspecᤠäEsmlFreeItemPtrãÀ äEMARSHAL_E_FIRSTâÜ äEWNNC_NET_SERNETâô ä EwaveOutCloseá! äEPAUXCAPSW! ä EDIBINDEXéERpcNsBindingImportNextãX! ä FFRAME_NONFPOát! äFDCBA_FACEDOWNLEFTŒ! äFMEVT_SHORTMSGèFPINNACLE_APEX_5_RWë GsmlLibStrcmpáà! äHDECLSPEC_IMPORTâð! äHCOORDè$HSCARD_ATTR_USER_TO_CARD_AUTH_DEVICEâ8" ä I_EM_DENORMALáL" äIMIM_CLOSEl" äILPMCI_SEQ_SET_PARMSê IJOB_WRITEè.JIBindStatusCallback_OnDataAvailable_ProxyØ" äKERROR_MEMBER_NOT_IN_GROUPø" äKDNS_ERROR_RCODE_LASTá# äKPMCI_ANIM_RECT_PARMSá<# äKtagMCI_OVLY_RECT_PARMSë KPBIN_COUNTãl# ä LFLT_MIN_EXPê LFillPathá¬# ä MSE_PRIVILEGE_ENABLED_BY_DEFAULTâÔ# äMNumberOfModuleForwarderRefsâì# ä MbProportionâ$ ä MtagAUXCAPSWâ $ äMRootIndexReadsëMSQL_PROCEDURESã\$ äNsml_target_ref_list_sx$ äNPrologEndAddressá”$ äNCreateFileMapping°$ äNKP_SCHANNEL_ALGâÌ$ äNCHANGER_ELEMENTâè$ äNVarUI4FromDateëNSQL_SEARCHABLEã% ä OLANG_UZBEKãD% äOmciGetDeviceIDFromElementIDAáx% ä'OCRYPT_OID_REGISTER_PHYSICAL_STORE_FUNCëOVAR_LOCALBOOL¨% ä PSE_ERR_FNFëPPD_HIDEPRINTTOFILEãà% ä QPCF_RTSCTSãü% äQWN_WINDOWS_ERRORá& ä QJOYSTICKID2â0& äQMCI_OVLY_OPEN_WSá\& äQCMSG_CMS_RECIPIENT_INDEX_PARAMãp& ä QBinRangeéQIMalloc_DidAlloc_Stub¬& äRLANG_UKRAINIANãÄ& ä RJOYSTICKID1êR_CERT_AUTHORITY_INFO_ACCESSâ' äSGCL_HBRBACKGROUND' ä SPAUXCAPSAè SSMEXF_SERVERáL' ä TCreateEventAál' äTPEMRSETWINDOWORGEXã„' äTSHGetFileInfo˜' ä TSO_RCVBUFèTIPropertyStorage_SetTimes_Stubãì' äVSTATUS_DATATYPE_MISALIGNMENTá( äVGetStringTypeAã$( äVtagMIXERCONTROLAáD( äVX942_DH_PARAMETERSëVIInternetThreadSwitch|( ä Wlogic_errorâœ( äWsmlFreeDevInfSynccapá¼( äWDISABLE_MAX_PRIVILEGEØ( äWtagEMRRESTOREDCêWJOB_CONTROL_RESUMEã) äXERROR_INVALID_STATEâ8) äXDMPAPER_LETTER_PLUSê%XIInternetProtocolRoot_Terminate_Stubáˆ) äYERROR_INVALID_LEVELâ°) äYmciGetDeviceIDFromElementIDWé YLockRegionãÜ) äZfreopenâô) ä Z_MSL_ERRNOã* äZHBITMAP__$* äZbV4YPelsPerMeteré ZCALLTYPEáX* ä[output_iterator_tagâp* ä[CACHE_S_FIRSTˆ* ä [midiInOpenã * ä [tagAUXCAPSAê[RPC_X_INVALID_TAGè\MSSIPOTF_E_FILEâð* ä ]_SML_DTD_Hã+ ä]SUBLANG_ARABIC_BAHRAINã4+ ä]MaximumPartitionCountP+ ä]PSINJECT_PAGEBBOXl+ ä]DMBIN_ENVELOPEã€+ ä]WM_APPë]MIXERR_INVALVALUEÀ+ ä^MAX_VOLUME_TEMPLATE_SIZEé&^IXMLDOMNamedNodeMap_nextNode_Stub , ä'_DNS_ERROR_SECONDARY_REQUIRES_MASTER_IPã4, ä_LPNMHDRê_NdrNsSendReceiveé`OLDFONTENUMPROCWá€, äabinary_ioœ, äais_integral_impâ¼, äaERROR_PROCESS_ABORTEDä, äaERROR_UNKNOWN_PRINTER_DRIVERá- äaPFD_DRAW_TO_WINDOWã - äaEMRSETTEXTALIGNâ4- äaCERT_IDêaIID_IPSFactoryãt- äbGetSecurityDescriptorDaclèbSCHED_E_TRIGGER_NOT_FOUND´- äc__encode_mbyteãÌ- ä cDataOffsetãè- äcCompletionPortã. äcERROR_NO_WILDCARD_CHARACTERSá,. äcSCARD_SPECIFICëcCFSTR_MIME_PJPEGád. ädhKeyEncryptionKey. ädNdrEncapsulatedUnionMemorySizeë dWINSCARDAPIâÐ. äeHEAP_REALLOC_IN_PLACE_ONLYãð. äeInterlockedDecrementá/ äeJOB_NOTIFY_FIELD_SUBMITTEDã8/ äeIID_AsyncIPipeByteëePODBC_VS_ARGSp/ äfAddressOfEntryPointâˆ/ ä fSystemLoadã¨/ äfERROR_INVALID_PROFILEÀ/ ä fHCONVLIST__âÔ/ ä fSQL_TRUEéfSQL_CONVERT_BIGINTã 0 ä g_MSL_ERRORã(0 ägFindResourceExëgSetConsoleCursorPositionéhERROR_PRINT_CANCELLEDˆ0 äjCharUpperBuffWã¬0 äjWINDOW_BUFFER_SIZE_RECORDÈ0 äjauxGetDevCapsAãì0 äjRpcNsProfileEltInqNextã1 ä jCERT_NAME_FRIENDLY_DISPLAY_TYPEêjSQL_SCROLL_CONCURRENCYãd1 äkLPWIN32_FILE_ATTRIBUTE_DATAâˆ1 äkWNetGetResourceParentWã¸1 ä$kPCMSG_CTRL_VERIFY_SIGNATURE_EX_PARAâà1 äkWRITE_COMPRESSION_INFO_VALIDék_DATATYPES_INFO_1Aã2 älTAPE_GET_POSITION,2 älHashélIXMLDOMNode_put_text_Stubh2 ä mround_errorâ2 ämLPEVENTLOG_FULL_INFORMATIONêmMCI_SAVE_PARMSWâÄ2 ä nSKF_TRISTATEáì2 änPCERT_AUTHORITY_INFO_ACCESSâ3 änLPREMFORMATETCë$nSetSoftwareUpdateAdvertisementStateâX3 äoPAN_CONTRAST_VERY_LOWx3 äoOffsetViewportOrgExâ 3 äoszOID_PKIX_KP_IPSEC_TUNNELëopMallocFreeStructÌ3 ä printlä3 ä pHMETAFILE__ã4 äpSPI_SETSHOWSOUNDSèpSubjectAlgorithmá44 ä qSCARD_W_EOFêqRCRYPT_FAILEDl4 ärPIMAGE_TLS_DIRECTORYá„4 ä rIMAGE_ICONã¤4 ärIID_IOleInPlaceSiteê rSQL_OJ_LEFTâÜ4 äsPKCS_7_ASN_ENCODINGêsSQLROWSETSIZEètTPM_HORIZONTALã05 äuPCERT_PUBLIC_KEY_INFOèuCMSG_SIGNER_AUTH_ATTR_PARAMâ€5 ävTAPE_PSEUDO_LOGICAL_POSITIONáœ5 ävOLDFONTENUMPROCAáÀ5 ävWINSTA_WRITEATTRIBUTESãÔ5 ävIP_TOSãð5 ävCRYPT_MODE_CBCã6 ävNdrServerContextUnmarshallëvSQL_AT_ADD_COLUMNP6 äwTEST_NEW_LOGGERâx6 äwszOID_INFOSEC_SuiteASignatureè wSetLibFlagsâ¸6 äxMIXERLINE_TARGETTYPE_MIDIOUTáÐ6 ä xLPDOC_INFO_1áè6 ä xGetSizeMaxä7 ä xCPS_COMPLETEéxIME_ESC_PRIVATE_LASTá47 äyMOM_CLOSET7 äymidiOutGetErrorTextâl7 ä ySwitchSinkã„7 ä ySQL_CB_NULLê"ySQL_GB_GROUP_BY_EQUALS_SELECT¼7 ä zrintfÐ7 äzLB_MSGMAXä7 äzBIN_RANGEü7 ä zLPDOC_INFO_3á8 äzNODE_ENTITY_REFERENCE48 ä zSQL_OJ_FULLêzSQL_CODE_MINUTEâh8 ä{RT_GROUP_ICON„8 ä{MCI_DEVTYPE_VCRâ 8 ä{MCI_SAVE_PARMSAê {LPDOC_INFO_2áÔ8 ä|CharUpperBuffAãð8 ä|auxGetDevCapsWë |removeChildâ 9 ä }DMBIN_UPPERâD9 ä}WNetGetResourceParentAãd9 ä}_DATATYPES_INFO_1Wã9 ä&}ISequentialStream_RemoteRead_Stub°9 ä}CFSTR_MIME_X_MSVIDEOé}SQL_CDO_CREATE_DOMAINð9 ä~ERROR_SHARING_PAUSEDá : ä~offDescriptionã0: ä~RPC_C_USE_INTRANET_PORTê ~FOF_SILENTã`: ä tagCALPSTRëSQL_FETCH_FIRST_SYSTEMã”: ä €first¸: ä€CO_E_FAILEDTOGETWINDIRãØ: ä€ColorMatchToTargetãô: ä€LCMAP_HIRAGANAë€MSHLFLAGS_TABLESTRONG,; ä NameStringëGMEM_NOT_BANKEDât; ä!‚AuditEventDirectoryServiceAccessáˆ; ä ‚ReadFileá°; ä‚CRYPT_E_STREAM_MSG_NOT_READYáÈ; ä‚ES_WANTRETURNè ‚WritePrinteráð; ä ƒE2BIG< äƒCreateHalftonePalette<< ä!ƒPRINTER_STATUS_USER_INTERVENTIONáT< ä ƒFILEOKSTRINGéƒSQL_ASYNC_ENABLE_ONâ˜< ä„POSTSCRIPT_PASSTHROUGHã°< ä„DNS_FILTEROFFÔ< ä„CERT_CHAIN_POLICY_BASEãø< ä„DPD_DELETE_UNUSED_FILESâ= ä„_ichá(= ä„SQL_API_SQLGETDIAGRECè„SQL_FN_NUM_EXPã\= ä …NTE_BAD_DATAáx= ä…PAN_SERIF_SQUAREé…_CERT_PUBLIC_KEY_INFO°= ä †BackupWriteê†DEBUGHOOKINFOè= ä‡?$__num_bits@$0HPPP@â> ä ‡palPalEntryâ > ä‡SPI_GETFONTSMOOTHINGé&‡__IViewObject_INTERFACE_DEFINED__l> äˆ?$is_floating_imp@MâŒ> äˆERROR_MEDIA_OFFLINEâ°> äˆDialogBoxIndirectParamAâÀ> ä ˆs_netÜ> äˆHOST_NOT_FOUNDãü> äˆPCERT_RDN_VALUE_BLOBá ? äˆLPHKLèˆSQL_FD_FETCH_FIRSTãD? ä‰islessgreater\? ä ‰__vector_impáx? ä‰SCS_PIF_BINARYë ‰pcRefParentâ°? äŠ?$is_floating_imp@OâÌ? äŠMCI_DEVTYPE_LASTáì? äŠ_CERT_ALT_NAME_INFOêŠCERT_FRIENDLY_NAME_PROP_IDã(@ ä ‹double_táH@ ä‹?$is_floating_imp@Nâx@ ä%‹IInternetSession_CreateBinding_Proxyé ‹URLTEMPLATEâ¨@ äŒ__stable_sort¸@ ä ŒHTTOPÔ@ äŒSPI_SETTOGGLEKEYSè)ŒAsyncIAdviseSink_Begin_OnDataChange_StubáERROR_QUORUM_RESOURCE$ ä >lpszPortáD ä>PCRYPT_CSP_PROVIDERâd ä>PositionCapabilitiesá ä >AsyncIUnknown_Begin_AddRef_Stubê>SERVERCALL_RETRYLATERÌ ä?GetMenuStringWãä ä?SetWindowLongè ?CALG_SHAá! ä@FILE_ATTRIBUTE_READONLYâ8! ä@EDITWORDBREAKPROCL! ä@SSGF_NONEd! ä @lpstrAliasë @CC_CDECLáˆ! äAfillá¬! äAVER_SUITE_SINGLEUSERTSãÈ! äALPSTARTUPINFOWãè! äARPC_E_INVALID_OBJREFé!A__ICreateTypeInfo2_FWD_DEFINED__á<" äBSEM_NOALIGNMENTFAULTEXCEPTãT" ä BBACKUP_DATAâ|" äBDISPLAY_DEVICE_MODESPRUNEDã˜" äBWM_NCRBUTTONUPã°" äBMCI_SEQ_SMPTEè" ä+BCERT_CHAIN_FIND_BY_ISSUER_COMPARE_KEY_FLAGä# ä BSTGMOVE_COPYá# äBtagOIFIêBSQLRemoveDefaultDataSourceãX# äCsmlGetUserDataãx# äCWORKERCALLBACKFUNCã # äCERROR_DS_RECALCSCHEMA_FAILEDá´# äCfResponseÔ# äCPERF_COUNTER_DELTAãô# äCszOID_OIWSEC_shaDSAêCPSD_MINMARGINSã$$ ä DNextChará8$ äDHeapAllocT$ äDSetGraphicsModeâh$ äDSSWF_NONE„$ äDLPSOUNDSENTRYAëDX509_MULTI_BYTE_INTEGERâÀ$ äE?$__char@$0A@Ü$ äEtagNEWTEXTMETRICAèEBINDSTRING_HEADERSã% ä Fdescriptionâ(% äFPtrToLongT% ä&FERROR_DS_SCHEMA_UPDATE_DISALLOWEDt% äFtagEMRSETMAPPERFLAGSá˜% äFSPI_SETGRIDGRANULARITYã´% äFRPC_X_NO_MEMORYâÈ% äFLPCOLESTRä% äFExchangeFromSlotâ& äFVarDecFromUintëFSQL_API_SQLROWCOUNTâ8& ä GMessageBoxExéGCryptSetProviderWd& äHFILEát& äHfileáˆ& äHByte_tã¨& äHCS_E_PACKAGE_NOTFOUND¼& äHmtTypeãÔ& ä HCLR_INVALIDâì& ä HGCL_HICONSMâ' äHPINPUT_RECORD' äHVFT_APPê$HICreateTypeLib_CreateTypeInfo_ProxyêIImmediatet' äJOLEOBJ_E_LASTè!JPRINTER_NOTIFY_FIELD_SERVER_NAMEáÌ' äKclass_has_trivial_default_ctorãÜ' ä Kbeginü' äKMIXERLINECONTROLSWã( äKCMSG_SIGNER_INFOá8( äKPIDMSI_STATUS_DRAFTêKSQL_FETCH_NEXTãt( äLERROR_LABEL_TOO_LONGá ( ä!LRPC_C_MQ_AUTHN_LEVEL_PKT_PRIVACYá¸( äL_CMS_KEY_INFOè LwFuncFlagsãì( äMX509_EXTENSIONSê'MIXMLDocument_get_fileModifiedDate_Stubã@) äNIMAGE_SCN_CNT_CODEãT) äNtagSIZEâl) ä NPLOGPALETTEê NULISet32á°) ä%OERROR_DEVICE_REINITIALIZATION_NEEDEDáÌ) äOStrokeAndFillPathà) äOHTERRORâü) äOSetLastErrorExã* äOCBF_FAIL_ADVISESá4* äOCOLORMGMTDLGORDâH* äOwChannelst* ä O__IXMLHttpRequest_FWD_DEFINED__êOVarUI2FromDateã¨* ä PPlayMetaFileáÀ* ä PEM_GETMODIFYáà* äPMB_ERR_INVALID_CHARSâ+ äPNdrCorrelationFreeë"PICreateTypeInfo_SetGuid_Proxy@+ ä Q__io_statesâT+ äQHUGE_VALLp+ äQOutputIteratorã˜+ äQDOMAIN_GROUP_RID_CERT_ADMINSá¼+ äQWin32ServiceShareProcessáà+ äQERROR_SERVICE_START_HANGáø+ ä QWM_SYNCPAINTá, äQFALTá$, äQCryptSetProviderAè QCAFLTL, ä RSML_PE_COPYâ`, äRSETXONãx, ä RCM_IN_GAMUTâ˜, äRTranslateCharsetInfoá´, äRLPSOUNDSENTRYWãÄ, äR_IOâè, äRCLSCTX_INPROC_SERVER16ë RVarR4FromUI4á(- äSERROR_BOOT_ALREADY_ACCEPTEDâH- äSTYPE_E_TYPEMISMATCHâ`- ä SMETAFILEPICTá|- äStagNEWTEXTMETRICW”- ä SEMR_POLYDRAWá°- äSMCIERR_NO_WINDOWáÔ- äSszOID_PKIX_KP_SERVER_AUTHü- ä"Ssz_CERT_STORE_PROV_PHYSICAL_W . äSCTL_FIND_NO_SIGNER_PTRëSIEnumVARIANT_Clone_Stubâ\. ä TDM_TTOPTIONâp. äTDSS_RIGHT˜. äTCERT_AUTHORITY_KEY_ID_INFOë TVarR4FromUI2áÈ. ä UBS_PATTERNë UQS_MOUSEMOVEáü. äVSML_NEXT_MESSAGEá / äVSID_MAX_SUB_AUTHORITIESâ äwlpVerbã@> äwPORT_STATUS_TYPE_INFOèwSQL_SERVER_NAMEât> ä xe32_borderã> äxVerLanguageNameWá¬> äxtagRemHPALETTEãÄ> ä xELEMENT_TYPEáè> äxDeviceNotSelectedTimeouté xSetPrinterã ? äyRPC_E_SYS_CALL_FAILED8? äyC3_NONSPACINGX? äyMCI_INFO_MEDIA_UPCãx? äyDeletePrinterDataAãœ? äyIStream_RemoteSeek_Stubâ°? äydblValãÈ? ä yGetTypeCompêySOFTDIST_ADSTATE_DOWNLOADEDâ @ äzGETSCALINGFACTORá$@ ä zGWL_WNDPROCâD@ äzCopyAcceleratorTableáh@ äzWAVECAPS_SAMPLEACCURATEâˆ@ äzMCI_ANIM_STEP_REVERSE¤@ äzCRYPT_CREATE_IVâ¸@ ä zBSTRBLOBáÔ@ äzOPENCARDNAME_Wãè@ ä zlpvardescèzSQL_FN_NUM_LOGãA ä{refCount_4A ä{C2_RIGHTTOLEFTã\A ä{MIXERCONTROL_CONTROLTYPE_PANá|A ä{UserKeyingMaterialë{_DISK_HISTOGRAMâ¬A ä|_RC_UPã¼A ä|mid1áÐA ä|WH_MAXãèA ä |SMTO_BLOCKäB ä |mmioFOURCCã0B ä%|IXMLDOMNode_put_nodeTypedValue_Proxyá\B ä&|__IXTLRuntime_INTERFACE_DEFINED__„B ä|URLPOLICY_NOTIFY_ON_DISALLOWé|SQL_TXN_CAPABLEâ´B ä}wcsxfrmâÌB ä }Default_Bigê&}ERROR_DS_ATTRIBUTE_TYPE_UNDEFINEDC ä~_InitializeThreadDataè~ihCSáHC ä__create_or_truncateáXC ämid2ápC ä LANG_BENGALIá˜C äSPAPI_E_NO_CLASS_DRIVER_LISTá¬C ä otmFillerèSPLDS_DRIVER_NAMEäC ä€SCS_DOS_BINARYãD ä$€CERT_PHYSICAL_STORE_ENTERPRISE_NAMEê€_REMSECURITY_ATTRIBUTESâTD äDMPAPER_TABLOIDâlD ä NCBFINDNAMEêpCertInfoœD ä‚LANG_PORTUGUESEâ¼D ä‚MMIO_DEFAULTBUFFERãäD ä‚CERT_STORE_ALL_CONTEXT_FLAGâE ä‚_CERT_SYSTEM_STORE_INFOâ E ä ‚put_lengthë‚RegisterDragDropáPE äƒbinder1stlE äƒ_SML_DEVINFDTD_Há”E äƒPIMAGE_ROM_OPTIONAL_HEADERë0ƒAsyncIAdviseSink_Begin_RemoteOnViewChange_ProxyâìE ä„GetViewportOrgExáF ä„_BYTE_SIZEDARRë'„IXMLDocument2_get_fileUpdatedDate_StubãdF ä…SML_ERR_XLT_INVAL_TAG_TYPEã€F ä…ENUMRESLANGPROCâ F ä…LPMCI_WAVE_SET_PARMSá¸F ä …CRYPT_ONLINEáÔF ä…X509_NDR_ENCODINGøF ä…CRYPT_OID_INFO_SIGN_KEYâ4G ä0…AsyncIAdviseSink_Finish_RemoteOnViewChange_Stubê'…IXMLDOMCharacterData_replaceData_ProxyãŒG ä†RPC_S_PROTSEQ_NOT_FOUNDâ¨G ä†DV_E_FORMATETCãÀG ä †EnumMonitorsé†SQL_PT_UNKNOWNãðG ä‡EV_CTSãH ä‡CreateProcessH ä ‡LINECAPSá0H ä ‡ctlFirsté ‡CRYPT_SFá\H ä ˆEncryptFileAá€H äˆERROR_BAD_USER_PROFILEã¤H äˆPSD_DISABLEPAGEPAINTINGêˆSQL_API_SQLTRANSACTâÔH ä ‰__stdèH ä‰__treeãüH ä ‰N_TMASK2áI ä‰UnionRect(I ä ‰IPPROTO_ICMPá8I ä‰bindáPI ä ‰ALG_SID_ANYê‰SQL_NEED_DATAŒI äŠSUBLANG_SPANISH_HONDURASé ŠN_TMASK1áÈI ä"‹??_Eout_of_range@std@@UAE@I@ZäI ä‹GetLongPathNameWáJ ä‹BeginUpdateResourceWá,J ä‹MCI_VD_GETDEVCAPS_FAST_RATEê‹IBlockingLock_Unlock_StubhJ ä ŒWHDR_ENDLOOPéŒSQL_AM_STATEMENTá˜J ämake_pairÀJ äIMAGE_REL_SH3_DIRECT8_WORDãØJ ä CIEXYZTRIPLEáôJ äCTRY_VENEZUELAãK äRESOURCEDISPLAYTYPE_SERVERãFAILED_ACCESS_ACE_FLAG㢠ä>GetSidSubAuthorityã8¢ ä>ERROR_INVALID_EA_HANDLEâ\¢ ä>SPAPI_E_SECTION_NOT_FOUND|¢ ä>RPC_S_ACCESS_DENIED⬢ ä$>_CRYPT_CONTENT_INFO_SEQUENCE_OF_ANYâÈ¢ ä>put_XMLDocumentâࢠä >VarDecFromCyé>IME_SMODE_NONE㣠ä?tagHANDLETABLEã0£ ä?GetClassLongAH£ ä ?MCI_SYSINFOê?SHGFI_ATTR_SPECIFIEDá|£ ä@rename㔣 ä@runtime_error¬£ ä @CopyMetaFileáÔ£ ä@WNetGetNetworkInformationWë@MIXERR_INVALLINEéADRAGINFOW¤ ä BREG_MULTI_SZá4¤ ä BLC_POLYLINEâL¤ ä BGetIconInfoâx¤ ä&BszOID_INFOSEC_sdnsConfidentiality˜¤ äBCHANGER_SET_ACCESSëBIEnumSTATSTG_Reset_ProxyáÔ¤ ä CPrimaryGroupáô¤ äCRPC_E_CALL_CANCELED⥠ä ClCustDataèCCommDlg_OpenSave_GetFilePatháP¥ äDGlobalMemoryStatusExál¥ äDInsertMenuItemã„¥ äDMCI_INFO_NAME¤¥ äDFILE_DEVICE_MIDI_OUTéDSERVICE_ACCEPT_POWEREVENTè¥ äECO_S_NOTALLINTERFACESᦠä EEnumObjects⦠äEGetTimeFormatAã4¦ ä EIRpcOptionsêEFINDMSGSTRINGl¦ äFSUBLANG_ARABIC_JORDANèFPABCᔦ ä Ge32_frectab⸦ äGPFN_EXPORT_PRIV_KEY_FUNCáئ äGSCardUIDlgSelectCardáø¦ äGURLACTION_SCRIPT_RUNá§ äGVarTokenizeFormatStringêGSQL_DESC_MINIMUM_SCALEã\§ äHsmlFreeResultsã|§ äHPAN_LETTERFORM_INDEXᨧ ä"HPFN_CERT_STORE_PROV_FREE_FIND_CRLèHPRINTER_CHANGE_SET_PRINTERë ICBR_56000ᨠäJVENDOR_ID_LENGTHé'JSQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATEãL¨ äKCriticalErrorp¨ äKERROR_DS_DRA_DN_EXISTSëKPICONINFO¨¨ äL@class$7585sysytool___pchĨ äLPTOKEN_CONTROLãܨ ä LPCERT_CHAINâð¨ äLalDataã © ä#LIRpcChannelBuffer_SendReceive_Stubã@© äLSC_MANAGER_CONNECTëLSQL_COLUMN_OWNER_NAMEx© äMptMaxPositionœ© äMszOID_RSA_envelopedDataêMSQLGetConfigModeáÔ© äNsml_item_list_sâè© ä NUINT_PTR᪠äNCBS_DISABLENOSCROLLâ ª äNRegOpenKeyExW8ª äNNETINFOSTRUCT\ª äNCryptGetDefaultProviderAápª ä NIMonikeréNITypeComp_RemoteBind_Proxy㬪 ä OC_ASSERTáȪ äOotmTextMetricsãઠä OLPEVENTMSGãøª ä OMIDIERR_BASEá « ä OPMIDIHDRá,« äOSCardDlgExtendedErrorD« ä OVariantStrëOVarUI1FromDate〫 äPGetFontLanguageInfo☫ ä PGetClassWordá´« äPdwBufferSecondsâÌ« ä PALG_TYPE_DSSáô« äPIID_IReleaseMarshalBuffers㬠äPPD_ENABLESETUPHOOKëPSQL_MAXIMUM_COLUMNS_IN_INDEXáP¬ äQclock_tâd¬ äQlrintlㄬ äQDNS_INFO_NO_RECORDSâ°¬ ä!QIXMLDOMNode_get_attributes_ProxyéQLPPRINTHOOKPROCâè¬ äR_TOKEN_CONTROLã ­ äRSECURITY_CONTEXT_TRACKING,­ äRDATE_USE_ALT_CALENDARèRNUMPRS_TRAILING_MINUS`­ ä Swhat_argá|­ äSsmlSetEncodingã”­ äSSectionNumber´­ äSFILE_FLAG_OVERLAPPEDáØ­ äSERROR_INVALID_PARAMETERâô­ äSGetTimeFormatWë SCMS_KEY_INFOá0® äT@class$7646sysytool___pchL® äTPIPE_CLIENT_ENDâp® äTPEMRCREATEBRUSHINDIRECTâ® äT_CRL_DIST_POINTS_INFO´® äT@class$7747sysytool___pchà® ä TIMarshal_MarshalInterface_Proxyê TCF_EFFECTS㯠äU__insertion_sortá4¯ äUOLE_E_NOCONNECTIONãH¯ äUAF_SNAãd¯ äUDEVICE_MEDIA_INFOèU??_7ITypeMarshal@@6B@œ¯ äVargument_typeį äVWNetGetNetworkInformationAãܯ ä VwPeriodMinãø¯ äVJOY_BUTTON4CHGã° äVRpcProtseqEndpointCountâ@° äVCryptImportPublicKeyInfoá\° äVtagSTATPROPSETSTGt° ä VVarI4FromR4êVSQL_SO_DYNAMIC㨰 ä WDSS_NORMALã¼° äWDRAGINFOAà° äWCMSG_SIGNED_ENCODE_INFOâ± ä.WIInternetSecurityManager_GetSecuritySite_Stubè+WIPropertyStorage_DeletePropertyNames_Proxyãl± äXIMAGE_THUNK_DATAᄱ äXRegOpenKeyExA¨± äXCryptGetDefaultProviderWéXPCERT_REQUEST_INFOãä± äYmon_decimal_pointü± ä YotmpFaceNameá² äYCRYPT_OBJID_BLOBé YPERF_BINá<² äZcap_áP² äZMS_NBFë ZVarI4FromR8â|² ä[lrintf㨲 ä![JobObjectEndOfJobTimeInformationá̲ ä[FILE_NOTIFY_CHANGE_SIZEê[ERROR_BAD_ENVIRONMENTè\@class$7707sysytool___pch<³ ä!]PCMSG_KEY_AGREE_KEY_ENCRYPT_INFOád³ ä]BINDSTATUS_ENDDOWNLOADDATA㜳 ä.]IInternetSecurityManager_SetSecuritySite_Stubè]SQL_DL_SQL92_TIME̳ ä ^NLS_ROMANè^SQL_DL_SQL92_TIMESTAMPã´ ä_SmlDevInfSharedMem_fá0´ ä_IMAGE_FIRST_SECTIONâT´ ä_ERROR_RESOURCE_DISABLEDâl´ ä _NPEVENTMSG〴 ä_FOURCC㤴 ä_szOID_RSA_messageDigestâ¼´ ä _dwAuthTypeãØ´ ä_SCARD_T0_COMMANDé_URLACTION_ACTIVEX_RUN µ ä`maxmemã$µ ä `CE_RXPARITYâ@µ ä`WNNC_NET_LOCUSë`PRINTER_STATUS_OUT_OF_MEMORYáµ ä"aEXCEPTION_ILLEGAL_INSTRUCTION¬µ äaLPDISCDLGSTRUCTWáĵ ä aUUID_DEFINEDáèµ äaI_RpcServerUseProtseqEp2W¶ ä$aszOID_INFOSEC_mosaicConfidentialityâ,¶ äaulKindëaSQLColAttributesW`¶ ä bsmlLibMemsetሶ äbSECURITY_LOGON_IDS_RID_COUNTá ¶ ä bPM_NOYIELDãĶ äbNETSCAPE_SMIME_CERT_TYPEébSQL_QU_INDEX_DEFINITIONâü¶ äc_RIP_INFO· ä cBS_BITMAPècfPortType<· ä d__io_modesãX· ädPEMRSETICMMODEãl· ä dOpenIconሷ ädCTRY_UZBEKISTAN⬷ ädLOCALE_SABBREVMONTHNAME8é"d__IXMLAttribute_FWD_DEFINED__ô· äesmlAllocDevInfCTDataḠäeszLogicalLogFileá4¸ äeLOCALE_SABBREVMONTHNAME9áH¸ ä eNCBHANGUPèe_CERT_DH_PARAMETERSâ|¸ ä fPINT_PTRá ¸ äfMCI_STATUS_TIME_FORMATë'fIRpcStubBuffer_DebugServerRelease_Stubãð¸ ägtagHIGHCONTRASTAég_ELEMENT_TYPE,¹ ähGetQueuedCompletionStatusP¹ ähSEM_NOOPENFILEERRORBOXãl¹ ähSetThreadToken〹 ährdParm㤹 ähLOCALE_SABBREVMONTHNAME4áÀ¹ ähRpcNsGroupMbrAddW๠äh_tagBSTRBLOB_DEFINED⺠ähIID_IFillLockBytesë hVarIntFromI1á8º äiconst_mem_fun_ref_tâPº ä iLANG_LATVIANá`º äiPACL် äiCRYPT_E_ASN1_NOEOD㤺 äiLOCALE_SABBREVMONTHNAME5éiATTR_TARGET_NOTCONVERTEDáðº äjERROR_DS_NAME_TOO_MANY_PARTSá» äjLOCALE_SABBREVMONTHNAME6á,» ä jLPCMMCKINFOâD» ä jclosesocketâp» ä!jCRYPT_OID_CREATE_COM_OBJECT_FUNCé jFORM_INFO_1⬻ äkEXCEPTION_CONTINUE_SEARCHÈ» äkOUT_DEVICE_PRECISì» äkLOCALE_SABBREVMONTHNAME7á¼ ä#kCRYPT_MESSAGE_KEYID_RECIPIENT_FLAGë kVarIntFromI2áX¼ älIMAGE_SYM_CLASS_SECTION‼ ä"lERROR_DS_NONEXISTENT_MAY_HAVE¤¼ älCERT_RSA_PUBLIC_KEY_OBJIDȼ älOPENCARD_SEARCH_CRITERIAél??_7ICreateTypeInfo@@6B@á ½ ämERROR_SIGNAL_REFUSEDá(½ ämSCODE_FACILITYãL½ ämLOCALE_SABBREVMONTHNAME1é mVarIntFromI4áx½ änis_objectœ½ änLOCALE_SABBREVMONTHNAME2ḽ ändwProviderVersion̽ änPCRL_INFOè½ änIProgressNotifyênCoGetInterfaceAndReleaseStreamã0¾ äoWINSTA_ENUMERATEáT¾ äoLOCALE_SABBREVMONTHNAME3áp¾ äoCMS_SIGNER_INFO⨾ ä.oICreateTypeInfo2_SetVarHelpStringContext_StubèoIRecordInfo_GetFieldNames_Stubãè¾ ä p_strcmpiáü¾ ä pencodingépERROR_QUORUM_OWNER_ALIVEá<¿ äq_MSL_IMP_EXP_CãX¿ äqtagHIGHCONTRASTWát¿ äqMCI_SET_AUDIO_ALLèqpSigner⤿ ärwostringstream㸿 ä rMAXSHORTáÜ¿ ärPIMAGE_ARCHITECTURE_ENTRYü¿ ärCRYPT_FORMAT_RDN_CRLF(À ä rCERT_NAME_DISABLE_IE4_UTF8_FLAGêrSF_BSTRâdÀ äsDOMAIN_ALIAS_RID_PRINT_OPSãˆÀ äsERROR_NODE_NOT_AVAILABLEá¨À äsSEC_E_TARGET_UNKNOWNé sIPropertyStorage_SetClass_ProxyâìÀ ä tdwPlatformIdáÁ ä tWM_ENTERIDLEáÁ ätGetACPë)tIClassFactory_RemoteCreateInstance_ProxyápÁ äuIMAGE_REL_ARM_BRANCH11ãŒÁ äutagMONCONVSTRUCTéuLINKSRCDESCRIPTORèvfpsâÐÁ äwLANG_SANSKRITìÁ äwLPDISCDLGSTRUCTAá äwI_RpcServerUseProtseqEp2AèwSQLColAttributesAD äxPEMRROUNDRECTh äxILockBytes_SetSize_Stubâ˜Â ä#xIAdviseSink2_OnLinkSrcChange_ProxyëxPCOMPOSITIONFORMáРäySymbolTableIndexáô äyIMAGE_DEBUG_TYPE_BORLANDáà äyFRS_ERR_INVALID_API_SEQUENCEá<à äyPSINJECT_ENDPAGESETUP\à äyCRYPT_X942_OTHER_INFOŒÃ ä$y__IXMLAttribute_INTERFACE_DEFINED__êyODBC_ERROR_INVALID_INFãÄà äzPAN_ANYâàà äzWS_CHILDWINDOWë"zMDM_PROTOCOL_HDLCPPP_112K_PAP Ä ä {NdrOleFreeë#{IXMLDSOControl_get_readyState_StubãtÄ ä|InitializeCriticalSection”Ä ä|ERROR_DS_DRA_BAD_DNâ´Ä ä|DNS_ERROR_NO_PACKETâÔÄ ä|PSINJECT_BOUNDINGBOXáìÄ ä |PTRIVERTEXãÅ ä |SSWF_WINDOWâÅ ä|GetDateFormat4Å ä |dwOEMVersioné |SQL_DBMS_VERádÅ ä }has_infinityá„Å ä}SEM_NOGPFAULTERRORBOX¨Å ä}STARTF_FORCEOFFFEEDBACKâÔÅ ä }RPC_E_SERVER_CANTUNMARSHAL_DATAâôÅ ä}MOUSEEVENTF_LEFTUPã Æ ä }LPTOGGLEKEYSá@Æ ä.}_CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFOhÆ ä}JOB_NOTIFY_FIELD_TOTAL_PAGESé}IAdviseSink_OnRename_Proxyã¨Æ ä~bV4GammaGreenÄÆ ä~DOF_EXECUTABLEãàÆ ä~RpcNsGroupMbrAddAè~MDM_SHIFT_BEARERMODEá(Ç äCreatePrivateObjectSecurityâ@Ç ä DM_PELSWIDTHáXÇ ä EDGE_ETCHEDâpÇ ä lpParametersá„Ç äPreFreeâ¨Ç äCLSID_CGridPropertyPageâÄÇ äpfnDeferredFillInäÇ äSOFTKEYBOARD_TYPE_T1éSQL_ATTR_ROW_STATUS_PTRâ$È ä€BDR_SUNKENOUTERê&€__IInternetBindInfo_FWD_DEFINED__pÈ äERROR_EXTENDED_ERRORáŒÈ äWM_IME_CONTROLëpidlá°È ä‚FLT_RADIXÔÈ ä‚ERROR_NO_LOGON_SERVERSãìÈ ä ‚MINMAXINFOãÉ ä‚GetClipboardDataá4É ä‚IAdviseSink_RemoteOnSave_Proxyë ‚VarR4FromR8âxÉ ä ƒMCI_OVLY_GETDEVCAPS_MAX_WINDOWSâˆÉ äƒsignéƒSQL_NO_DATA_FOUNDè„WNNC_NET_COGENTâÜÉ ä…REGDB_E_IIDNOTREGøÉ ä…ISequentialStreamè…LPSAFEARRAY_UserFreeé†_RPC_TRANSFER_SYNTAXáXÊ ä‡IMAGE_REL_PPC_ADDR32átÊ ä‡CALINFO_ENUMPROCAÊ ä‡_SHNAMEMAPPINGAâ¨Ê ä ‡PM_OPEN_PROCáÄÊ ä‡SQL_CUR_DEFAULTê‡SQL_OUTER_JOINSâøÊ ä ˆ__distanceãË äˆ_PRIVILEGE_SETã8Ë äˆERROR_DS_COMPARE_FALSEãdË ä&ˆPFN_CERT_STORE_PROV_FREE_FIND_CTLŒË äˆIXTLRuntime_formatTime_StubêˆSQL_CREATE_VIEWâÀË ä ‰LongToHandleáàË ä‰IMAGE_REL_PPC_REL24âøË ä‰EventCategoryÌ ä‰SERVICE_LOAD_TYPE0Ì ä‰SW_SHOWMINIMIZEDáHÌ ä ‰MSGBOXPARAMSé ‰nSizeMaxátÌ ä ŠDMBIN_FIRSTâŒÌ äŠOLEVERBATTRIBèŠRegisterServiceCtrlHandlerãÐÌ ä‹DdeEnableCallbackè‹SQL_SRVC_NULLÍ äŒsmlProcessDataãÍ ä ŒWM_KILLFOCUSá4Í ä ŒLTO_AccelisêŒWM_PSD_MARGINRECT`Í ä@248áˆÍ äSECURITY_TERMINAL_SERVER_RIDá¨Í äSZDDE_ITEM_ITEMLISTâÌÍ äCERT_RDN_GENERAL_STRINGâìÍ äNdrPointerUnmarshalláÎ äLPOINETPROTOCOLSINKSTACKABLEá,Î ä VarR8FromR4êSQL_INDEX_CLUSTEREDâ`Î äŽ__msizeâ€Î äŽSTATUS_STACK_OVERFLOW¤Î äŽSEC_E_SECPKG_NOT_FOUNDãÈÎ äŽGetWindowContextHelpIdë ŽSF_ERRORáôÎ ä _MSL_IMP_EXPáÏ ä_GET_FILEEX_INFO_LEVELSâ4Ï äCO_E_MSI_ERRORã`Ï ä&CERT_POLICY_QUALIFIER_USER_NOTICEtÏ äNDRcopyêSQL_FN_NUM_ROUNDá¤Ï äepsilonâ´Ï ärad5éURL_OID_CRL_ISSUERãðÏ ä‘CALINFO_ENUMPROCWáÐ ä‘rad4á Ð ä‘RpcBindingVectorFreeé‘_SHNAMEMAPPINGWâ\Ð ä’LPD_TYPE_COLORINDEXâlÐ ä’rad7á€Ð ä ’ALGIDDEFá¤Ð ä’GET_CMSG_ENCODING_TYPEë’PCERT_CHAIN_PARAáÐÐ ä“fwvâðÐ ä“PGRADIENT_TRIANGLEäÑ ä“rad6é“SCardEndTransactionâ8Ñ ä ”sml_alert_sâ\Ñ ä”@class$7645sysytool___pchtÑ ä ”iCtrlSpeedã”Ñ ä”XTYP_CONNECT_CONFIRMá¤Ñ ä”rad1áÈÑ ä”CreateFormatEnumeratorãäÑ ä”tagSQL_DAY_SECONDè”ODBC_ERROR_USER_CANCELEDá Ò ä•SM_SHOWSOUNDS4Ò ä•DRV_CLOSETÒ ä•CERT_NAME_ATTR_TYPEê•SQL_ROW_IGNOREãŒÒ ä–PPRIVILEGE_SETã°Ò ä–RPC_E_CANTPOST_INSENDCALLÈÒ ä –TC_SA_CONTINáØÒ ä–rad3áôÒ ä–JOY_BUTTON2CHGãÓ ä –DidAllocé–OLESTREAMVTBL<Ó ä—_MSL_SIZE_T_TYPEáTÓ ä —buffer_ptrãdÓ ä—rad2é —VarCyFixá”Ó ä˜PCRITICAL_SECTION¸Ó ä˜PAN_LETT_OBLIQUE_SQUAREâÔÓ ä˜SPI_GETWORKAREAâðÓ ä˜HMENU_UserMarshalÔ ä˜pscodeë˜minuteã8Ô ä™RPC_S_INVALID_BOUNDâPÔ ä ™dmICMMethodê™PSD_RETURNDEFAULTŒÔ äšWNNC_NET_CLEARCASEã¨Ô äšxmit_buf_unavailáÄÔ äšIID_IRootStorageéšSQL_DRIVER_NOPROMPTãÕ ä›fDsrSensitivityâ$Õ ä›EVENT_E_INTERNALEXCEPTIONè›_CMSG_MAIL_LIST_ENCRYPT_INFOá\Õ äœrad9á€Õ äœ@class$7704sysytool___pch¨Õ äœIEnumSTATSTG_RemoteNext_StubéœOleCreateFromFileàÕ äsmlMoveCmdFuncãÖ äERROR_DHCP_ADDRESS_CONFLICTâ$Ö äWNetUseConnection4Ö ärad8áPÖ äPIDSI_CHARCOUNTê pvarLeftá€Ö äžLB_SETCOLUMNWIDTH°Ö ä$žCMSG_CONTENT_ENCRYPT_FREE_PARA_FLAGâÈÖ ä žSTGM_SIMPLEêžSQL_SR_RESTRICTâ× äŸszOID_SUBJECT_ALT_NAMEã$× äŸpvOidSpecificInfoD× äŸBINDSPEED_IMMEDIATEêŸSQL_MAX_ROWS_DEFAULTá„× ä RPC_S_FP_UNDERFLOWãœ× ä BYTE_SIZEDARR°× ä get_xmlê SQL_API_SQLDESCRIBECOLãô× ä¡SML_ERR_INVALID_SIZEáØ ä¡IMAGE_REL_PPC_ADDR24á(Ø ä¡tagCAUBê¡SQL_ODBC_INTERFACE_CONFORMANCEãtØ ä¢smlAllocMetInfMetInfáŒØ ä¢DMPAPER_FIRST¤Ø ä ¢HELP_WM_HELPé¢ITypeInfo2_GetVarCustData_StubãàØ ä£@256áüØ ä£TAPE_FILEMARKSãÙ ä£dwCountâ$Ù ä£LineToã@Ù ä£WM_SIZECLIPBOARDápÙ ä#£RPC_C_MQ_AUTHN_LEVEL_PKT_INTEGRITYãŒÙ ä£_CERT_EXTENSIONSé£PSWIZB_DISABLEDFINISHÌÙ ä¤SCHED_S_TASK_RUNNINGáäÙ ä ¤tmBreakCharâüÙ ä ¤WM_VSCROLLãÚ ä¤PCRL_DIST_POINTS_INFOè¤INET_E_CANNOT_CONNECT\Ú ä¥RPC_X_NO_MORE_ENTRIEStÚ ä ¥PR_JOBSTATUSá Ú ä ¥MIXER_SETCONTROLDETAILSF_CUSTOMâ¼Ú ä¥CRYPT_MODE_CFBPê¥CryptDecodeMessageãðÚ ä¦tagDECãÛ ä ¦AddFormAé ¦OFN_SHOWHELPáLÛ ä*§ERROR_DS_COULDNT_LOCK_TREE_FOR_DELETE|Û ä%§ERROR_DS_CANT_CREATE_IN_NONDOMAIN_NCá”Û ä §pArrayInfoë§RequestTypeChangeÌÛ ä¨_TCHAR_DEFINEDãàÛ ä¨MethodãÜ ä¨ERROR_PASSWORD_EXPIREDã(Ü ä¨LPMCI_OVLY_LOAD_PARMSAãHÜ ä¨IPipeLong_Pull_Stubê¨tag_inner_PROPVARIANTŒÜ ä©ENCAPSULATED_POSTSCRIPTâ¤Ü ä ©SIZEZOOMHIDEá¼Ü ä©CreateWindowWØÜ ä©VFF_BUFFTOOSMALLáðÜ ä ©RP_INIFILEãÝ ä©??_7IOleInPlaceUIWindow@@6B@é!©IAuthenticate_Authenticate_Proxyá\Ý äªLANG_KASHMIRIxÝ äªSetClipboardDataá”Ý äªWN_NOT_LOGGED_ONáÀÝ äªRPC_C_MQ_USE_EXISTING_SECURITYãØÝ ä ªcbCtlContentáìÝ äªtagCAUIêªSQL_CA1_BOOKMARKá$Þ ä«MEVT_F_CALLBACKâ<Þ ä«pProtocolSinkPÞ ä «tagCAFLTé«tagCAUHâ|Þ ä¬CRYPT_NO_SALT°Þ ä)¬AsyncIAdviseSink_Begin_OnViewChange_StubáÔÞ ä¬CoReleaseServerProcessäß ä¬IOleInPlaceFrame_SetMenu_Proxyë¬__IXMLDOMComment_FWD_DEFINED__ãXß ä ­ERROR_CTX_CLIENT_LICENSE_IN_USEâpß ä ­pszProvNameê ­tagMSHLFLAGSá˜ß ä ®LPABC°ß ä®WM_SYSCOMMANDØß ä®MCI_ANIM_WHERE_DESTINATIONë®QueryServiceConfigã(à ä%¯IXMLDSOControl_get_XMLDocument_Proxyé¯tagCAULâ`à ä°FILE_FLAG_OPEN_NO_RECALLátà ä °AddFormWé°PIDSI_THUMBNAILâ¨à ä ±LANG_NEUTRALáØà ä$±ERROR_CLUSTER_RESTYPE_NOT_SUPPORTEDâðà ä±EMR_WIDENPATHá ä±tagEMRSETPALETTEENTRIESâ4á ä±wglDescribeLayerPlanePá ä±ESB_DISABLE_UPãpá ä±WNetDisconnectDialog1„á ä ±LPHMIXERá˜á ä±MCI_PAUSE¼á ä±IS_CERT_RDN_CHAR_STRINGê±SysAllocStringLenüá ä²WS_EX_OVERLAPPEDWINDOWãâ ä²FILE_DEVICE_DFSâ4â ä²FindMimeFromDataádâ ä$²IInternetThreadSwitch_Prepare_Proxyê²VarUI1FromDispãœâ ä³remove_pointerë ³GetClassLongáÈâ ä´SSIZE_Tâàâ ä ´MEM_RELEASEê ´Linenumberãã äµGetCommConfig(ã ä µtagTPMPARAMSéµSPLDS_PRINT_RATE_UNIT\ã ä¶tagPOINTSxã ä¶JOY_BUTTON3CHGã ã ä¶IXMLElement_getAttribute_Stubè¶IPropertyStorage_Enum_Proxyê·ERROR_SOME_NOT_MAPPED ä ä¸ERROR_INVALID_USER_BUFFER(ä ä¸MB_SETFOREGROUNDá@ä ä ¸ChangerDriveá`ä ä¸SCARD_LOCAL_READERSê¸LPFNPSPCALLBACKâ ä ä¹SORT_HUNGARIAN_DEFAULTã¼ä ä¹JOB_OBJECT_QUERYáÜä ä¹IMAGE_REL_PPC_GPRELâå ä"¹ERROR_CTX_MODEM_INF_NOT_FOUND$å ä¹PP_SIG_KEYSIZE_INCãDå ä¹STGM_SHARE_DENY_WRITEè¹PD_RETURNDEFAULTáxå ä ºSML_PE_UNDEFáˆå ä ºISTAGœå ä ºVK_EXSELé)ºIInternetProtocolSink_ReportResult_Proxyáðå ä»TAPE_SHORT_FILEMARKSáæ ä »FeaturesHighá$æ ä»SM_CYMINSPACINGâ@æ ä»PDISK_HISTOGRAMâXæ ä»IHttpSecurityˆæ ä$»IXMLDOMDocument_createTextNode_Stubâ¨æ ä»IPropertySetStorageê»SQL_SFKU_SET_DEFAULTáÜæ ä¼wMinuteâç ä¼NDR_LOCAL_DATA_REPRESENTATIONè¼StgOpenStorageãDç ä½PSID_AND_ATTRIBUTES_ARRAY\ç ä ½SerialNumberáŒç ä#½CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESSë½SQL_DIAG_COLUMN_NUMBERë¾LPMCI_OVLY_LOAD_PARMSWãìç ä¿CreateWindowAè¿mmioSendMessageâ$è äÀtmInternalLeading@è äÀPROPENUMPROCEXëÀabsoluteChildNumberâ€è äÁIMAGE_REL_PPC_ADDR14áè ä ÁPRECT°è äÁERROR_NO_SIGNAL_SENTéÁWN_BAD_PROVIDERâäè ä ÂCTRY_NORWAYãé äÂCALG_CYLINK_MEKâ4é ä*Â__IXMLDOMCDATASection_INTERFACE_DEFINED__èÂSQL_SUBQUERIESãhé ä ÃPtrToUshortâˆé äÃIMAGE_REL_PPC_ADDR16á¤é äÃMCI_SEEK_PARMSëÃLPOPENCARDNAME_EXÜé äÅxptSendCompleteâøé äÅERROR_DISK_CHANGE ê ä ÅnRgnSizeá0ê äÅPERF_COUNTER_LARGE_DELTAá`ê ä$ÅCREDENTIAL_OID_PASSWORD_CREDENTIALSâ„ê äÅCONTEXT_OID_CERTIFICATEêÅPIDSI_LASTAUTHORá´ê äÆPartitionÐê äÆPAN_SERIF_ROUNDEDèÆPRPC_SERVER_INTERFACEë äÇszOID_DEVICE_SERIAL_NUMBERã8ë äÇIOCTL_STORAGE_RESERVEPë ä ÇSNB_UserSizeá`ë äÇCAUBéÇcaubáˆë äÈchoose_assign˜ë ä È_TREE¬ë ä ÈPJOYINFOáÐë äÈCHANGER_STORAGE_TRANSPORTáì ä$ÈIOleLink_GetSourceDisplayName_ProxyêÈOleCreateDefaultHandlerâ@ì äÉMEDIA_WRITE_ONCEáPì äÉCAULéÉcaulátì äÊStackBaseŒì ä ÊMft2Writesë!ÊIRecordInfo_IsMatchingType_ProxyáÌì äËfill_nãøì ä ËSCHED_E_SERVICE_NOT_LOCALSYSTEMâí äËCRYPT_DATA_BLOBâ4í äËSCardGetStatusChangeé ËSQLGetInfoãdí ä ÌsourceListã|í ä ÌQS_ALLEVENTSáœí äÌDMLERR_POKEACKTIMEOUTÈí äÌX509_CERT_REQUEST_TO_BE_SIGNEDãôí ä!ÌICreateTypeLib_SetLibFlags_Proxyáî äÌCAUIéÌcauiá(î äÍCP_REGION@î ä ÍWSACleanupãPî äÍCAUHéÍcauhátî äÎpartition¤î ä$ÎERROR_REMOTE_SESSION_LIMIT_EXCEEDEDâÀî äÎRT_ACCELERATORãäî äÎMMIOERR_SHARINGVIOLATIONéÎSCARD_ATTR_DEFAULT_DATA_RATEá,ï äÏXML2GODB_PRECOMP_HãLï äÏERROR_NOTIFY_ENUM_DIR`ï äÏMCI_TRACK„ï äÏMCI_GETDEVCAPS_CAN_SAVEâ°ï äÏAsyncIPipeLong_Begin_Push_StubãØï äÏIID_IInternetSecurityManageré ÏSQLUBIGINTãð äÐBACKUP_SECURITY_DATAá0ð äÐCFERR_MAXLESSTHANMINáHð äÐXTYP_REGISTERèÐRPC_C_VERS_MAJOR_ONLY|ð äÑrfmtid1â˜ð äÑPAGE_WRITECOPYã¼ð äÑERROR_NO_RECOVERY_PROGRAMÐð äÑsocketãìð äÑKEY_TYPE_SUBTYPEáñ äÑVARIANT_FALSEèÑ_pidá(ñ äÒrfmtid2âHñ äÒCreateTapePartitionâ`ñ ä ÒHOLLOW_BRUSHá€ñ äÒMCI_WAVE_STATUS_LEVEL¤ñ äÒSPLDS_PRINT_MIN_Y_EXTENTáÄñ äÒIStream_SetSize_Stubáìñ äÒIEnumVARIANT_RemoteNext_ProxyèÒODBC_VS_FLAG_UNICODE_ARGéÓSQL_FD_FETCH_NEXTPò äÔ@class$7644sysytool___pchpò äÔERROR_UNEXP_NET_ERRâŒò äÔwglDeleteContextá¨ò äÔCERT_ALT_NAME_URLèÔ@class$7745sysytool___pchäò äÕWM_GETDLGCODEèÕCertCreateCTLContextáó äÖENOTEMPTY0ó ä ÖCONTEXT_FULLáPó äÖRPC_S_NO_ENTRY_NAMEâhó äÖLCSGAMUTMATCH€ó äÖtimeEndPeriod¤ó äÖCertAddEncodedCRLToStoreá¸ó äÖadwDataâàó äÖIStorage_RenameElement_StubêÖSQL_DIAG_CLASS_ORIGINô ä×LANG_ALBANIAN<ô ä×FILE_ATTRIBUTE_OFFLINEãTô ä ×S_WHITE512ãlô ä ×CS_CLASSDCãô ä×SERVER_ACCESS_ENUMERATEê×IBinding_Abort_StubâÈô ä Ø_SW_INEXACTâØô äØBYTEáðô ä ØCF_DSPBITMAPâõ äØbyteá õ äØIPipeDouble_Pull_Stub8õ ä ØDISPID_VALUEéØget_responseBodyádõ äÙOUTâ„õ äÙ_PRINTER_NOTIFY_INFOéÙlpServiceStartNameãÌõ äÚclass_has_trivial_copy_ctorâèõ äÚconst_iteratorãö äÚfind_first_not_of ö äÚBITMAPINFOHEADERá<ö äÚPSESSION_HEADERêÚSPLDS_PRINT_MIN_X_EXTENTátö ä ÛPWAVEHDRáŒö ä ÛszOID_TITLEê ÛIXMLDOMAttribute_put_value_Stubâàö äÜSTATUS_ILLEGAL_INSTRUCTIONã÷ äÜMOVEFILE_REPLACE_EXISTING÷ äÜDMCOLOR_COLORèÜMCI_OVLY_LOAD_PARMSâd÷ äÝSetUnhandledExceptionFilterâˆ÷ äÝGetComponentIDFromCLSSPECèÝSQLForeignKeysã´÷ äÞbitsáØ÷ äÞUnhandledExceptionFilteráì÷ äÞSS_ICONê ÞPID_BEHAVIORá0ø äßERROR_DS_CANT_FIND_NC_IN_CACHEãPø äßGetProtocolVersionãdø ä ßRecordStrèßFaultInIEFeatureáœø äàSmlMetInfMem_tã°ø äàDC_FIELDSÐø äàPIPE_ACCESS_DUPLEXãôø äàCO_E_CLSREG_INCONSISTENTáù ä àWM_CLOSEá ù ä àwaveOutOpenâ4ù äàhostentâ\ù äàNdrServerInitializeUnmarshallèàSQL_NAMED”ù äáSND_ALIAS_SYSTEMASTERISKáÀù ä!áSPLREG_SCHEDULER_THREAD_PRIORITYáÜù äáIRpcProxyBufferâøù äáCFSTR_MIME_PDFëáOpenSCManagerWã<ú äâCryptUninstallCancelRetrievalèâSQL_SU_INDEX_DEFINITIONêã@276á”ú ää_ImageArchitectureEntryâ¸ú ääTAPE_DRIVE_RELATIVE_BLKSáèú ä$äERROR_DS_NO_FPO_IN_UNIVERSAL_GROUPSâû ääcAccumBlueBitsã$û ääJOY_CAL_READXYONLYëäAuthorityCertSerialNumber`û ä åLC_NUMERICãpû äånthâû äåpEphemeralAlgorithmâ°û äåPSCARD_READERSTATEAâàû ä#åIPSFactoryBuffer_CreateProxy_Proxyãüû äåLPOLECLIENTSITEê å_SC_ACTIONã4ü äæEMR_EXTSELECTCLIPRGNáTü äæBitmapWritesUserLevelèæget_notationNameá”ü äçIMAGE_FILE_MACHINE_ARMã°ü äçRtlEqualMemoryãÜü äçERROR_INVALID_COMBOBOX_MESSAGEãøü äçmidiOutMessageã ý äçRPC_C_OPT_BINDING_NONCAUSALâDý äçpszContentEncryptionObjId|ý ä-çCERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAGá”ý ä çGDI_OBJECTëçIID_ICodeInstalléèERROR_OPLOCK_NOT_GRANTEDáôý äéIMAGE_REL_PPC_REL14âþ äécxDestãþ ä éu_int4þ äéMftBitmapReadsë%éIXMLHttpRequest_get_statusText_Proxyá|þ ä êout_of_rangeá þ äêLANGGROUPLOCALE_ENUMPROCAÐþ ä*êIOleInPlaceObject_SetObjectRects_Stubðþ äêINET_E_INVALID_URLëêNUMPRS_DECIMALã$ÿ ä ëlower_sizeãHÿ äëLPPIXELFORMATDESCRIPTORâxÿ ä&ëCERT_STORE_PROV_SET_CTL_PROPERTY_FUNCèëVarI2FromDateè ìwaveOutPauseáÄÿ äíSML_PCDATA_OPAQUEàÿ äíGetProcAddressãøÿ äíGetBinaryType äíDNS_ERROR_NAME_NOT_IN_ZONEã4 ä ímtStringáP äíIID_IPipeDoubleâ„ ä)íIXMLDOMDocument_put_ontransformnode_Stubé%íIInternetProtocolInfo_QueryInfo_StubáØ äîSE_ENABLE_DELEGATION_NAMEá äîRpcServerUseAllProtseqsIfExêîQueryServiceStatusExáD äï_MSL_CALLINGCONV_3DCALLâd äïGetFileAttributesExAጠäïERROR_INFLOOP_IN_RELOC_CHAINéïSQL_INTERVAL_HOUR_TO_SECONDâÄ ä ðtbaseè äðERROR_MEDIA_UNAVAILABLEã ä ðSetClassWordá äðIDABORTêðMEDIA_READ_ONLYâH ä ñGUID_DEFINEDáh äñDNS_ERROR_NO_MEMORYê$ñCRYPT_GET_URL_FROM_UNAUTH_ATTRIBUTEâ° ä òLATENCY_TIMEáÈ ä òRelocCountãè äòRPC_S_INTERNAL_ERRORéòCODEPAGE_ENUMPROC  äóxptGetProtocolsâ@ äóFOF_WANTMAPPINGHANDLE` äóPSCARD_READERSTATEWê!ó_LPIINTERNETPROTOCOLINFO_DEFINEDᤠä ôdwExtraInfoâÀ äôSM_CXMAXIMIZEDãØ ä ôWN_BAD_USERê ôIXMLDOMAttribute_get_value_Stubâ äõstrtoulâ4 äõLANG_MALAYALAMãL äõGetMiterLimitd ä õKP_CLEAR_KEYá ä"õCryptUnregisterDefaultOIDFunctionèõPENDINGMSG_WAITNOPROCESSáÌ ä öCERT_E_ROLEâä ä öSM_CMETRICSã äöJOY_BUTTON1CHGã äöCacheMiss@ ä öPRINTER_NOTIFY_FIELD_START_TIMEêöGetRefTypeOfImplTypeá| ä÷LEFT_ALT_PRESSEDé÷OpenSCManagerAã° ä øXCLASS_FLAGSéøPCMSG_KEY_AGREE_ENCRYPT_INFOéùGetFileAttributesExWá äúGetArcDirectionâ, ä úMM_MOM_DONEâD ä úMCI_NOTIFYãt ä%úIInternetProtocolRoot_Continue_Proxyጠä úV_ISVECTORëúImmGetOpenStatusáÌ äûQueryMultipleInterfacesê$ûIXMLDOMNode_get_nodeTypeString_Stubâ äüSETMITERLIMIT0 äüSM_CYMAXIMIZEDãH ä üszKeyphraseâl äüLANGGROUPLOCALE_ENUMPROCW¨ ä0üIInternetZoneManager_DestroyZoneEnumerator_StubêüNI_SETCANDIDATE_PAGESIZEáä äýGetClientRect äýPRINTER_ATTRIBUTE_WORK_OFFLINEë'ýURLPOLICY_CREDENTIALS_MUST_PROMPT_USERãl äþCOMPRESSION_ENGINE_MAXIMUMã„ ä þPDIBSECTION⤠äþ_CRYPT_CSP_PROVIDERê þCompareUrlãÔ ä ÿxptSendDataâø äÿIMAGE_REL_ALPHA_REFQUADâ äÿDefineHandleTable@ ä ÿERROR_HOST_NODE_NOT_GROUP_OWNERâd äÿCRYPT_E_NO_DECRYPT_CERT∠äÿLookupIconIdFromDirectoryœ ä ÿPSN_APPLYèÿLPMONIKERÈ å BACKUP_LINKâü å&CRYPT_OID_UNREGISTER_SYSTEM_STORE_FUNCã åVarCyNegêSQLTCHARá4 ä@284áX äERROR_DECRYPTION_FAILEDât äCRYPT_E_BAD_MSG∠ä TA_CENTERè PriorityáÈ äOSS_COMPARATOR_CODE_NOT_LINKEDãà ä DT_INTERNALâø ä CTRY_PANAMAê"SCardSetCardTypeProviderNameA< äSetWindowLongPtráX äWN_BAD_LOCALNAMEéALG_SID_SAFERSK64Œ ä SmlOptions_tᨠäUnlockResourceãÄ ätagTEXTMETRICWãÜ ä midiOutCloseáø äFILE_WRITE_ACCESSè!IInternetProtocolRoot_Abort_StubáL äIMAGE_REL_BASED_IA64_IMM64ãh äFILE_READ_ONLY㌠äERROR_CHILD_NOT_COMPLETEᤠä CS_PARENTDCâÄ äRpcServerUnregisterIfÜ ä Destination1áô ä PARSE_SITEë*URLPOLICY_CREDENTIALS_SILENT_LOGON_OK4 ä lmaskX äPAN_CONTRAST_VERY_HIGHãx äBusTypeMaxReservedë Destination2ᤠäoffBmiSrcÄ äDdeFreeStringHandleâà äPEFS_HASH_BLOBëSQL_DROP_SCHEMAâ äresizeã$ ärdSizeã@ ämidiInGetNumDevséSQL_PS_POSITIONED_UPDATEá„ ä META_DIBSTRETCHBLTã  ä SS_ETCHEDFRAMEë LPMIDIOUTCAPSØ ä FEATURESETTING_NUPë CreateDialogParamAã ä PEMRSETWORLDTRANSFORM0 ä CERT_FIND_ANYP ä CryptCloseAsyncHandleè ADVFCACHE_NOHANDLER⌠ä CreateColorSpaceA¨ ä DFCS_CAPTIONMINâÄ ä IID_IEnumCallbackð ä IXMLDOMNode_get_attributes_Stubê SQL_NULL_HDESCã( ä DataIsDirectoryâD ä LPMEMORYSTATUSEXé BINDSPEED_INDEFINITEጠäTAPE_DRIVE_WRITE_LONG_FMKS㨠äPT_CLOSEFIGUREãÀ ä SetBkColorëSafeArrayCreateExô ä IsEqualIIDã  ä bV4Endpointsá( äcMultipleItemsã@ äEndDocPrinter` äDIALOPTION_DIALTONEê SQL_TC_NONE⌠äne_expver  ä CPS_URLSḠä SQL_OJ_RIGHTé SQL_IK_ASCëSetFilePointerã  äSE_CHANGE_NOTIFY_NAME( ätagTEXTMETRICAã@ äCOLOR_3DLIGHT\ ä??_7IUrlMon@@6B@áp äSQLLENë SQL_VARCHARâ  äServiceStatusèSQL_SETPOS_MAX_OPTION_VALUEâÜ ä PFLOAT128á ä@class$7643sysytool___pch, ä ERROR_CLUSTER_RESNAME_NOT_FOUNDâP ä_PARTITION_INFORMATIONãx äSCardSetCardTypeProviderNameWè??_7IXMLDOMNode@@6B@ᬠä ESIGPARMáÄ äR2_MASKPENNOTØ ä SetFocusé"IXMLElement_get_tagName_Proxy änum_words0 äNumberOfIdEntriesL ä_PROV_ENUMALGSëSQL_FN_STR_REPLACE〠ä_strncoll˜ ä WSAEALREADYâ¼ äCO_E_ALREADYINITIALIZEDâØ äVerLanguageNameâð ä PMIDIOUTCAPSépchBuffer ä JobTokená8 äERROR_DUPLICATE_TAGê ByObjectIdãt äEXIT_PROCESS_DEBUG_INFOâ ä_EFS_HASH_BLOBã´ äIID_IInternetProtocolInfoè _protØ äwcrtombâô äCreateColorSpaceW äCBR_BLOCK äwVoicesâ< äCreatePointerMonikerá` äURLACTION_DOWNLOAD_MAXëSQL_DD_CASCADEã” ä_MSLGLOBALS_H° älpszDCIAliasNameáÔ äPRINTER_STATUS_PAPER_JAMá ä(IAdviseSink2_RemoteOnLinkSrcChange_StubêOFN_NONETWORKBUTTONâH ädwDebugInfoFileOffseth äCreateDialogParamW㌠ä@class$7702sysytool___pchè_CHANGER_READ_ELEMENT_STATUSáà ä!IMAGE_WEAK_EXTERN_SEARCH_LIBRARYâ äLPMINIMIZEDMETRICSëCRL_V1ã( ä_getpidâ8 äwioséCRL_V2ã` äENOSPCã„ äRpcInterfaceInformationêBINDSTATUS_ENCODINGâÀ ä GLOBAL_OPTIONS_HáÜ ä int_n_cs_precedesô ä _MSL_LOCALE_C ä IMAGE_FUNCTION_ENTRY64ã< ä EXCEPTION_FLT_STACK_CHECKh ä" CO_E_ACTIVATIONFAILED_EVENTLOGGEDè CryptRegisterDefaultOIDFunction⨠ä!MemByte_tÈ ä!BATTERY_LIFE_UNKNOWNáà ä!PMULTIKEYHELPü ä!RESOURCE_CONTEXTá ä!lpNextã, ä!RpcRaiseExceptionD ä !SCS_SETSTRë !SQL_CA1_BULK_DELETE_BY_BOOKMARKâ” ä"SECURITY_LOGON_IDS_RIDë "LBS_NOTIFYãÐ ä#SUBLANG_SPANISH_NICARAGUAð ä#TAPE_LONG_FILEMARKSâ ä#LPDLGITEMTEMPLATEWã, ä#_CERT_POLICY_IDâD ä#BootIndicatorè#SQL_CONVERT_GUIDáx ä $BuildCommDCBé$_XFORM_⨠ä%CRYPT_MODE_OFBPâÜ ä(%__ISequentialStream_INTERFACE_DEFINED__ê%MDM_V120_ML_2l än'?$reverse_iterator@V?$__wrap_iterator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PAD@std@@è!'URLACTION_HTML_SUBFRAME_NAVIGATEᨠä(timeáÀ ä (LockResourceáÜ ä(tagEXTLOGFONTAë (SO_DEBUGá ä )DC_MINEXTENTá0 ä)ERROR_CLEANER_SLOT_NOT_SETãL ä)DISP_E_EXCEPTIONáh ä)LCS_GM_GRAPHICS†ä )CTRY_SYRIA㬠ä&)CERT_FIND_OPTIONAL_CTL_USAGE_FLAGØ ä&)CERT_STORE_LOCALIZED_NAME_PROP_ID ä)IOCTL_DISK_HISTOGRAM_STRUCTUREã  ä)SEARCH_PRIMARYãH ä)FMTID_ImageSummaryInformationè)CFSTR_MIME_X_ARTé*STG_E_INVALIDPARAMETER㤠ä+_ULARGE_INTEGERâÀ ä+TMPF_FIXED_PITCHáÜ ä+GetWindowLongPtráü ä+MCI_ANIM_PLAY_PARMSâ ä+FOF_SIMPLEPROGRESSãH ä!+CERT_DEFAULT_OID_PUBLIC_KEY_XCHGáh ä+PSM_RECALCPAGESIZESê+SQL_SCROLL_FORWARD_ONLYâ´ ä",ERROR_AUTODATASEG_EXCEEDS_64kÜ ä,CRYPT_SIGN_ALG_OID_GROUP_IDã ä,CERT_CTL_USAGE_PROP_IDã ä,FUNCFLAG_FUIDEFAULTê,SQLProceduresAãX ä-__double_epsiloná„ ä&-ERROR_CLUSTER_NO_SECURITY_CONTEXTÄ ä5-__IInternetProtocolSinkStackable_INTERFACE_DEFINED__é-ImmGetRegisterWordStyleAé.SQL_ATTR_CONNECTION_TIMEOUTâ,! ä/IMAGE_DEBUG_MISCáD! ä /JOY_POVLEFTâd! ä/SQL_SCROLL_OPTIONSë/SQL_CT_CREATE_TABLEâœ! ä 0__msl_copyë0IViewObject_RemoteDraw_ProxyáÔ! ä 1LPINTô! ä1_RTL_CRITICAL_SECTION" ä1SetFileApisToANSI0" ä1ERROR_DS_DRA_BAD_NCâH" ä 1HANDLETABLEâp" ä1PAN_MIDLINE_STANDARD_SERIFEDá" ä1MMSYSERR_NOTSUPPORTEDè 1VT_FILETIMEâÀ" ä 2smlDeleteCmdáÔ" ä2BaseOfBssè" ä 2NameTypeá# ä2??_7IMultiQI@@6B@0# ä 2IFillLockBytes_FillAppend_Proxyê2CLSID_CCDFormDialogâd# ä3BASETYPES|# ä 3tagPOINTFXã˜# ä3SERKF_INDICATORâ°# ä 3VarDecFromI4é3OpenSCManagerà# ä 4MAP_RECEIVEâü# ä4PAN_WEIGHT_NORDâ$ ä4MCI_MSF_FRAMEè4ASYNCHã<$ ä5strcollâd$ ä5SPAPI_E_INVALID_MACHINENAMEâ„$ ä5LPDLGITEMTEMPLATEAã $ ä5ExchangeFromDrive¸$ ä 5VarDecFromI2é5SELECT_CAP_CONVERSIONô$ ä6NdrSendReceiveã % ä 6SZM_DELETEã$% ä 6VarDecFromI1é6VarUI1FromUintãP% ä7pairáh% ä 7CTRY_HUNGARYá„% ä7WNetEnumResourceá°% ä!7MIXERCONTROL_CT_SC_LIST_MULTIPLEáÐ% ä7szOID_OIWSEC_md4RSA2áð% ä7CryptExportPKCS8Exë7get_childNodesã & ä 8PRF_OWNEDè8CLSID_AggStdMarshalâT& ä9synccapâ|& ä9CERT_CONTEXT_REVOCATION_TYPEá˜& ä9hRestrictedOtherá°& ä9LogFileWritesè9IXMLDOMText_splitText_Proxyê:SQLProceduresWã' ä;basic_istringstreamâ<' ä;PROPSETHDR_OSVERSION_UNKNOWNé;ImmGetRegisterWordStyleWá€' ä<ERROR_NO_MORE_DEVICES˜' ä <SM_CXSMSIZEâ¬' ä <sockaddré<NdrConformantStringUnmarshallè=dwActiveProcessorMask( ä>RPC_S_NO_INTERFACESâ0( ä>tagEXTLOGFONTWë>FADF_EMBEDDEDd( ä?SetThreadLocaleê ?IAdviseSink_RemoteOnClose_Proxyâ¨( ä @__float_nanâÄ( ä@tagEMRSTRETCHBLTáÜ( ä @MK_CONTROLãø( ä@GetWindowLongWã) ä @wPeriodMaxã0) ä@MCI_VD_STEP_REVERSEâH) ä @RPC_MESSAGEât) ä@IRpcChannelBuffer3_Cancel_Stubë1@URLACTION_INFODELIVERY_NO_REMOVING_SUBSCRIPTIONSáÜ) ä!AERROR_UNABLE_TO_MOVE_REPLACEMENTá * ä%Asz_CERT_STORE_PROV_SYSTEM_REGISTRY_Wá* äApuuidè ASQL_GD_BOUNDáL* ä Brandom_nextâh* äBMK_E_NOTBINDABLEá|* äBEMRSAVEDC˜* äBPERF_AVERAGE_BASE¼* äBNdrVaryingArrayBufferSizeà* äBREAD_ELEMENT_ADDRESS_INFOèBHBITMAP_UserUnmarshal+ äC_ThreadLocalDataá,+ äCtanféCSQL_CT_TABLE_CONSTRAINTâx+ ä"DERROR_RESOURCE_LANG_NOT_FOUNDœ+ äDCERT_STORE_PROV_LDAP_Wã´+ äDLPPERSISTFILEä+ ä&DIOleWindow_ContextSensitiveHelp_ProxyèDOLEVERBATTRIB_NEVERDIRTIESã0, äEIMAGE_REL_PPC_SECRELLOãL, äEGMEM_DISCARDEDãd, ä EIPPROTO_NDëESQL_C_STINYINTã°, ä#FCERT_ALT_NAME_ENTRY_ERR_INDEX_MASKãÐ, äF??_7IViewObject@@6B@éFSQLBindParameterá- äGIID_IRpcProxy0- ä GICreateTypeInfo_SetVersion_StubêGBINDSTRING_USER_AGENTd- äHfcloseã|- ä HFirstEmptyã¤- äHIOleCache2_UpdateCache_StubâÜ- ä,HIXMLDOMDocument_put_onreadystatechange_StubêHSQL_QUALIFIER_NAME_SEPARATORá. ä I_RC_CHOPéItanláD. äJRemovableDiskInfoèJITypeLib_GetTypeComp_Proxyãˆ. äKLB_SETTOPINDEXã°. äKCERT_STORE_UPDATE_KEYID_FLAGáÐ. äKVOLUME_DISK_EXTENTSâè. ä KTYMED_NULLã/ ä"KILayoutStorage_BeginMonitor_ProxyèKGL_ID_NOMODULEãL/ äLHENHMETAFILE__ëLPSECURITY_ATTRIBUTESá|/ äMtanhá/ äMBaseHiã¼/ ä MDMPAPER_LETTER_EXTRA_TRANSVERSEâØ/ äMpi_key_contextãì/ äMPPROTOENT0 ä*MCERT_NAME_STR_ENABLE_T61_UNICODE_FLAG80 äMDestroyElementãT0 äM_tagRemBINDINFOâh0 ä MVarDecMulèMSQL_COLUMN_DISPLAY_SIZEâ°0 äNDNS_STATUS_DOTTED_NAMEãÄ0 äNnPolysãà0 äNESB_DISABLE_BOTHá1 äNFRERR_FINDREPLACECODESã1 ä NcAttributeã01 äNtagTYSPEC`1 ä#NIOplockStorage_OpenStorageEx_ProxyëNSetTypeDescAliasá”1 ä O_controlfpã´1 äOPFD_DRAW_TO_BITMAPãØ1 äOMIXERLINE_LINEF_SOURCEãô1 äOCERT_SIMPLE_CHAIN 2 ä OSQL_COMMITëOSQLDescribeColãL2 äPERROR_FILE_NOT_ENCRYPTEDál2 äPCRYPT_E_ASN1_PDU_TYPEˆ2 äPpVoidDecryptFuncá 2 ä PF3_128Mb_512á¸2 ä PtagEXCEPINFOáä2 ä"PIInternetProtocolRoot_Abort_ProxyèPWM_PSD_YAFULLPAGERECT3 äQldexplã,3 äQlog10lã<3 äQlrintèQLPTOP_LEVEL_EXCEPTION_FILTERá|3 ä RDebugStringâ¨3 äRERROR_DS_NONEXISTENT_MUST_HAVEãÐ3 äR_ENCRYPTION_CERTIFICATE_HASHéRSCARD_PROVIDER_PRIMARYã4 äSLMEM_DISCARDEDã(4 äSIsTextUnicodeL4 äSGetKernelObjectSecurityê SRGN_DIFFá€4 äTOUT_DEFAULT_PRECISãœ4 äTpszContentTypeãÀ4 äT@class$7743sysytool___pchì4 ä!TNdrNonConformantStringBufferSizeá5 äTRpcSmSetClientAllocFreeêTSQL_ADD_RECORDãH5 äUCB_SETTOPINDEXã€5 ä,UCERT_SET_PROPERTY_IGNORE_PERSIST_ERROR_FLAGêU_midl_ma8´5 äVsmlAllocTargetParentáØ5 äVIMAGE_REL_BASED_HIGH3ADJáô5 äVDCX_EXCLUDERGNã6 äVGetWindowLongAë VFADF_UNKNOWNá86 äWMAT2é WSQL_TC_ALLãd6 äXptSizeã€6 äXEMRPOLYPOLYGONëXIPersistStreamã°6 ä Y_midl_ma4è$YURLPOLICY_CHANNEL_SOFTDIST_PRECACHEâô6 äZSP_PARITY7 äZRequestWakeupLatencyá07 äZPBITMAPV4HEADERâD7 ä ZUOI_TYPEéZPRINTEROP_FLAGSât7 ä[ldexpfãˆ7 ä[log10fã 7 ä [getpeernameâ¸7 ä [CERT_CONTEXTé[StgCreatePropSetStgâü7 ä\LPEXIT_THREAD_DEBUG_INFOá 8 ä\DNS_ERROR_RCODE_NOTZONEâD8 ä\@class$7703sysytool___pchl8 ä"\sz_CERT_STORE_PROV_SERIALIZED€8 ä\_midl_ma1¬8 ä!\ITypeLib2_GetDocumentation2_StubáÐ8 ä\LPSERVICE_MAIN_FUNCTIONâì8 ä\IME_CMODE_FIXEDê\SQL_COLUMN_NULLABLEê]PAN_SERIF_BONEã@9 ä ^MAXINT_PTRãX9 ä ^pOtherAttrë^??_7IMoniker@@6B@ˆ9 ä__spawnvpe¤9 ä_RPC_S_CALLPENDING¼9 ä _SET_CLIP_BOXáÐ9 ä__midl_ma2è9 ä _tagFUNCKINDê._IXMLDOMDocument_get_resolveExternals_Stub0: ä `off_typeáH: ä `multipliesã\: ä `PF_HYLINKè `VarIntFromCyáŒ: ä aPeekMessageâ°: äa_RPC_SYNTAX_IDENTIFIERãÌ: äaPERF_TYPE_ZEROë#aIXMLDOMNodeList_get__newEnum_Proxyã ; äbERROR_DS_INTERNAL_FAILURED; äbOSS_BERDER_DLL_NOT_LINKED`; äbDFCS_CAPTIONCLOSEèbISC_SHOWUICANDIDATEWINDOW¤; äcERROR_MEDIA_CHANGEDâÈ; äcTIME_NOMINUTESORSECONDSâà; ä cLPCPINFOEXä< äcszOID_DN_QUALIFIERëcFILE_DEVICE_NAMED_PIPEãH< ädIRunnableObject_Run_Stubé dIXMLDocument_createElement_StubâŒ< äe?$__char@$0P@¨< äedwProviderSubTypeèe_CERT_NAME_VALUEé fCOLORONCOLORáô< ägIEnumSTATDATA = ä gURLACTION_SHELL_INSTALL_DTITEMSêgSQLInstallTranslatorExã`= ähSetWindowLongWãx= ä hEM_GETLINEã”= ähMETHOD_OUT_DIRECT´= ähGetTimeOfLastChangeêhGetZoneMappingsâì= äiDT_END_ELLIPSISâ> äiCERT_NAME_INFOã,> äiSERIAL_IOC_FCR_RCVR_RESETèiGL_ID_INPUTSYMBOLl> äjRpcSsDontSerializeContextŒ> äjCERT_TRUST_NO_ERRORâ¸> ä jIMarshal_GetMarshalSizeMax_StubâÜ> äjFLAG_STGMEDIUM_UserFreeêjSQL_OPT_TRACEFILE? äk_MSL_WCTRANS_Hã0? äkWaitForDebugEventH? ä kEnumWindowsêkSTGOPTIONS_VERSIONã€? älMCI_INFO_FILE˜? älWINCRYPT32APIèlCERT_DESCRIPTION_PROP_IDáØ? ämWSANO_RECOVERYãø? äm??_7IRpcHelper@@6B@ê(mIXMLDocument2_get_fileUpdatedDate_Proxyê(nCERT_STORE_ADD_NEWER_INHERIT_PROPERTIESât@ ä oTagIndexéoCertNameToStrAã¬@ äpGetLogicalDrivesépRPC_C_MGMT_INQ_PRINC_NAMEð@ äqEMR_GLSBOUNDEDRECORDáA ä qEMRCHORDá$A äqRDW_NOINTERNALPAINTâ@A äqSPI_GETSHOWSOUNDS\A äqSTGFMT_DOCFILEëqtagCOINITˆA ä rLBS_NODATAã A ä rSE_ERR_OOMãÀA ärCRL_FIND_ISSUED_BYãØA ä rCreateProxyê"rITypeLib2_GetAllCustData_Stub B äsKEY_CREATE_SUB_KEYësNTM_NONNEGATIVE_ACã`B ätCO_E_OLE1DDE_DISABLEDtB ätp_protoâB ätCRYPT_FORMAT_CRLF¨B ätSQL_BIND_TYPEètSQL_PARC_NO_BATCHèB äuERROR_ALREADY_ASSIGNEDäC äuCBT_CREATEWNDC ä udwProtocolsâ@C äuNdrNonEncapsulatedUnionFreeâhC äuIMallocSpy_PreRealloc_Proxyâ„C äuCLSID_CCDFormKrnlœC ä usetAttributeá¸C äuSQL_C_UTINYINTëuSQL_DL_SQL92_DATEìC ä vsmlLibMemcmpáD ävSidTypeUnknownãD ä vLPHANDLEévRpcAsyncCleanupThread\D äw_MSL_TIME_T_DEFINEDâtD äwpszObjectGUIDè"wIXMLDocument_put_charset_Stub¸D äxSetHandleCountëxIPipeByteÜD ä yCONSTìD äyUINTáE äySPI_SETDEFAULTINPUTLANGâEcxê>SQL_FETCH_FIRST_USERá ­ ä?WM_PALETTEISCHANGINGá<­ ä?SPI_SETSTICKYKEYSè?ELEMENT_STATUS_ACCESSp­ ä@wcslen〭 ä@man☭ ä@LARGE_INTEGER°­ ä @DSS_DISABLEDáÄ­ ä @UniqueIDáØ­ ä@WORD_BLOB® ä-@IXMLDOMDocument_createDocumentFragment_Proxyé@URLZONE_PREDEFINED_MINãL® ä AdwReservedãh® äAFS_CHINESETRAD〮 äAFOF_FILESONLY¤® äAHashEncryptionAlgorithmâ¼® äAMEMCTX_SHAREDè ASQL_SMALLINTáè® äB__int32âø® ä BAlgid ¯ äBIStream_UnlockRegion_Proxyã@¯ äBCoFreeUnusedLibrariesèBSQL_UB_DEFAULTãt¯ ä Cis_boundedëCIStream_Clone_Stub㤯 ä Drmdir¼¯ äDXST_CONNECTEDЯ ä DPI_FLAGSéDOleNoteObjectVisibleâ° ä Esputc(° äEERROR_DS_REFUSING_FSMO_ROLESéESQL_DIAG_DROP_SCHEMAá`° ä FVK_OEM_102〰 äF_REMOTE_NAME_INFOAã ° äFCMSG_ENCRYPT_PARAMãÀ° äFNODE_CDATA_SECTIONëFSQL_COLUMN_TYPEâü° äGRpcNsBindingExportAâ$± äGPropSheet_SetHeaderSubTitleê&GICreateTypeInfo_SetAlignment_Stubx± äHREG_NOTIFY_CHANGE_SECURITY㘱 äHOutputDebugStringWã°± ä HSavedHandleâä± ä(HIXMLDocument2_get_fileModifiedDate_Stubâø± ä HVTBIT_CYéHOleTranslateAcceleratorâ8² äISML_ALL_COMMANDSáP² äICopyMetaFileWt² äIMCIERR_NO_CLOSING_QUOTEêI__VARIANT_NAME_1éJ__VARIANT_NAME_2áȲ äK__VARIANT_NAME_3éK_QUERY_SERVICE_LOCK_STATUSAâ³ äLCreateICA ³ äL__VARIANT_NAME_4éLcwcharãD³ äMmacâ`³ äMLMEM_DISCARDABLEá|³ äMPDRVCONFIGINFO㜳 äMMCI_ANIM_PUT_SOURCEêMV_DISPATCHREFг äNERROR_BAD_UNITãô³ äNERROR_RING2_STACK_IN_USEá ´ äNFF_DECORATIVE,´ äNPAN_FAMILY_PICTORIALáH´ äNwglCreateContextá`´ ä NLPHWAVEOUTã„´ äNALG_CLASS_KEY_EXCHANGEë NCERT_UNICODE_RDN_ERR_INDEX_MASKâÌ´ äOExceptionRecordâä´ ä OALG_SID_HMACá µ äOSPLDS_PRINT_NETWORK_ADDRESSêOapUnknown8µ äPthousands_sep\µ äPGetExceptionInformationâ|µ äP_REMOTE_NAME_INFOWë!PIXMLDOMNode_get_firstChild_Proxyá¼µ äQEraseTapeܵ äQRpcNsBindingExportWâôµ ä QALG_SID_RC2â¶ äQGET_CERT_ENCODING_TYPEã,¶ äQAddRefãD¶ ä Q__tagBRECORDéQLPSUPPORTERRORINFO㈶ äRSML_ERR_XLT_END_OF_BUFFER¸¶ ä#RERROR_DS_SRC_OBJ_NOT_GROUP_OR_USERãÔ¶ äRMSGF_DIALOGBOXãð¶ äRVFT2_DRV_KEYBOARD· ä RNCBTRACEá· ä RsignscaleèRODBC_ERROR_INVALID_HWNDâP· äSlocaltimep· äSFILE_DEVICE_8042_PORT¬· ä/SAsyncIAdviseSink_Begin_RemoteOnViewChange_Stubë SprecisionèT_CERT_TRUST_STATUSä¸ äUPST_NETWORK_BRIDGEëUSEC_E_DECRYPT_FAILURE0¸ äVmaxâT¸ äVIMAGE_REL_ALPHA_ABSOLUTEáx¸ äVOSS_REAL_DLL_NOT_LINKED⸠ä VALG_SID_RC5ê VPP_KEYSPECãĸ äWSmlPcdataPtr_tãä¸ äWFOF_MULTIDESTFILESãü¸ ä WALG_SID_RC4â ¹ äW_PREVENT_MEDIA_REMOVALë WLPDEVNAMESãX¹ äXLPSCARD_IO_REQUEST〹 äXIDropTarget_DragEnter_StubëXSQL_TABLE_STATãÀ¹ äYLOGON32_PROVIDER_WINNT35áð¹ ä&YMIXERLINE_COMPONENTTYPE_DST_TELEPHONEè YMMIO_WRITE㺠äZCreateICW,º ä ZfVirtPº äZtagMCI_ANIM_PLAY_PARMSãlº äZDUMMYUNIONNAME3êZIStream_Commit_Proxyá´º ä[ERROR_MAGAZINE_NOT_PRESENTãغ ä[ERROR_INVALID_HOOK_FILTERôº ä[RPC_S_INVALID_TAG» ä[DNS_ERROR_NON_RFC_NAMEã(» ä [fType@» ä [HMIXEROBJ__âX» ä[cDestinationst» ä[DUMMYUNIONNAME2ê[LayOut㜻 ä\?B?BPBDâ°» ä\Iterator1È» ä\NTE_BAD_ALGIDÜ» ä \WM_POWERáø» ä\DUMMYUNIONNAME5â ¼ ä\PERF_COUNTER_HISTOGRAM_TYPEê\STGMOVE_SHALLOWCOPYâ\¼ ä]DUMMYUNIONNAME4‼ ä]CertFreeCertificateChainá ¼ ä]PORT_TYPE_REDIRECTEDáȼ ä]_QUERY_SERVICE_LOCK_STATUSWâì¼ ä]IME_SMODE_SINGLECONVERTê]SQL_CONCAT_NULL_BEHAVIORá ½ ä^mapâ8½ ä^SidsToDisableP½ ä^DRIVE_RAMDISKp½ ä^OutputDebugStringA㌽ ä^QS_ALLPOSTMESSAGE¨½ ä^IPPORT_NETSTATë^SetLcidâн ä_Iterator2ð½ ä_SmlMetInfMetInfPtr_tá¾ ä_CopyMetaFileA¾ ä _AngleArcé_LOCK_UNLOCK_IEPORTãL¾ ä `@7636h¾ ä`GetProfileIntW㌾ ä`LCS_GM_ABS_COLORIMETRICê`RpcAsyncCancelCallãÔ¾ äaMCIERR_SEQ_DIV_INCOMPATIBLEâè¾ äaDomainã¿ ä*aCERT_PHYSICAL_STORE_OPEN_DISABLE_FLAG<¿ äaPROPSHEETHEADERW_V1_SIZEáT¿ ä aOpenPrinterAé aCDN_LASTá|¿ äbstrcat㌿ ä bcmdID°¿ äbXMIT_ROUTINE_QUINTUPLEãà¿ ä%bICreateTypeInfo2_DeleteImplType_Stubáø¿ äbGetFieldNamesÀ äbACTIVEOBJECT_WEAKèbSQLCreateDataSourceWáXÀ äcIMAGE_REL_BASED_ABSOLUTEátÀ äcLPWIN32_STREAM_IDècBALTIC_CHARSETã À ädabcBé dtagELEMDESCâÈÀ äeabcCáàÀ ä eEMRBEGINPATHéeSCARD_READER_SWALLOWS$Á äftagEMRSETDIBITSTODEVICEâ@Á äfPMCI_PLAY_PARMSâdÁ äfLPPRINTER_ENUM_VALUESWãxÁ äfREGKINDê fFR_SHOWHELPâ Á ä g@7631ÄÁ ägOSS_CONSTRAINT_VIOLATEDâÔÁ ägabcAégGCS_DELTASTARTã  äh_loc_time_cmptã( ähSB_THUMBPOSITIONáP ähIPersistStorage_InitNew_ProxyèhSERVICE_STOPPEDâˆÂ äi__decode_mbyteëiBSM_ALLCOMPONENTSÀ äjGMEM_NOCOMPACTãà äjwaveOutGetPositionãøÂ äjtree_into_ndrà äjGetPrinterDriverA8à äjQueryServiceLockStatusWêjtagTIMESTAMP_STRUCTâlà äkdwTypeã„à ä kWSAENETDOWNâ¨Ã äkSCardForgetReaderGroupWê kIMarshal_GetUnmarshalClass_Stubâèà ä lVK_KANJIâÄ ä lPRF_CLIENTãÄ ä lMB_TASKMODALá8Ä älMessageBoxIndirectãPÄ ä lCRYPT_READëlVarIdivâxÄ äm_INT32ëmIAsyncManager_GetState_Stubâ¸Ä ä nWAIT_TIMEOUTáÐÄ ä ntagEMRLINETOénRpcSmClientFreeâÅ äoJOB_OBJECT_LIMIT_VALID_FLAGSá0Å äoHCBT_DESTROYWNDâLÅ äoGET_USER_DATA_REPlÅ äoSPLREG_MAJOR_VERSIONá˜Å äo__IUnknown_INTERFACE_DEFINED__ã¸Å äoPSU_SECURITY_URL_ONLYèoSQL_CONCUR_READ_ONLYáüÅ äpLPPRINTER_ENUM_VALUESAëp??_7ISynchronizeContainer@@6B@ãDÆ äqExcludeUpdateRgná\Æ ä qBM_SETSTYLEâtÆ äqMCIERR_SET_CDè$q__IXMLDOMDocumentType_FWD_DEFINED__âÈÆ ärIS_TEXT_UNICODE_ASCII16âÜÆ ä rPHOSTENTáðÆ ä rDSSPUBKEYè)rIPropertyStorage_WritePropertyNames_Stubá4Ç äsfreeáLÇ äsBF_BOTTOMLEFThÇ äsDISPATCH_METHODâ„Ç äsOFN_NOVALIDATEë sSQL_RESTRICTá°Ç ät__maskãÌÇ ätSizeOfStackCommitàÇ ä tWN_CANCELètIPersistStream_IsDirty_Proxyá,È äuIMAGE_OS2_SIGNATURE_LEãHÈ äuSetEventHandleëudwModemVersionSizeã€È ävbase_iteratorœÈ ävGetProfileIntAã¼È ävWN_NO_MORE_ENTRIESãØÈ ävMCI_SYSINFO_NAMEáôÈ ävCERT_COMPARE_ATTRèv_tagStartParamã(É ä wwaveOutWriteáHÉ äwPERF_LARGE_RAW_BASEâ`É ä wOpenPrinterWé%w__MIDL_itf_unknwn_0005_v0_0_s_ifspecá¤É äxBAUD_7200ÄÉ äxERROR_NO_LOG_SPACEãàÉ äxERROR_DS_DUP_RDNéxMCIERR_FLAGS_NOT_COMPATIBLEê ysbuf_0Ê äzPTOKEN_SOURCETÊ äzFILE_ATTRIBUTE_COMPRESSED|Ê äzERROR_INVALID_SUB_AUTHORITYâ¨Ê ä&zERROR_DS_SRC_AND_DST_NC_IDENTICALÄÊ äzMWT_RIGHTMULTIPLYèzGCP_JUSTIFYINüÊ ä{sml_devinf_extlist_sáË ä{SETDIBSCALING(Ë ä{idFromë{??_7IHttpSecurity@@6B@ãhË ä|_EmptyMemberOptâ€Ë ä |smlAllocCopyá¤Ë ä|IMAGE_SUBSYSTEM_OS2_CUIâÀË ä|LMEM_NOCOMPACTãäË ä|ERROR_OBJECT_NOT_FOUNDãøË ä|WHITENESSÌ ä|SCARD_DEFAULT_READERS4Ì ä|GetPrinterDriverWè|QueryServiceLockStatusAâtÌ ä}PSINJECT_VMSAVEâŒÌ ä}hszSvcPartner°Ì ä}SCardForgetReaderGroupAê}MDM_V110_SPEED_4DOT8KàÌ ä~Eaxâ Í ä~PIMAGE_LOAD_CONFIG_DIRECTORY32ã$Í ä~DMDITHER_NONEè~ISequentialStream_Read_ProxyáhÍ ä_MSL_END_EXTERN_CŒÍ äPIMAGE_EXPORT_DIRECTORYâ¤Í äDV_E_STATDATAÄÍ ä_FOCUS_EVENT_RECORDâÜÍ äDragQueryFileáÎ äIXMLElement_get_text_Stubè.__IWindowForBindingUI_INTERFACE_DEFINED__DÎ ä€pBufápÎ ä"€IOleAutomationTypes_v1_0_s_ifspecè€IXMLDOMNode_get_dataType_Proxyã¸Î äTOKEN_STATISTICSéNotifyRoutineTableãôÎ ä‚_EM_ZERODIVIDEã Ï ä ‚maxmsgsizeã Ï ä‚LoadDllâ<Ï ä‚pv_value_contextá`Ï ä‚szOID_ENROLLMENT_AGENTãxÏ ä ‚NdrFcShortë‚SQL_CB_PRESERVEê ƒModifyMenuãÀÏ ä „GCP_DBCSáÜÏ ä„GetWindowOrgExãôÏ ä „EMR_PLGBLTã(Ð ä(„IDataAdviseHolder_SendOnDataChange_Stubê„GetAdvisehÐ ä …IOleObject_GetUserClassID_Proxyê…XMLELEMTYPE_COMMENTâ Ð ä†SM_PENWINDOWS¸Ð ä †_BIN_TYPESãÔÐ ä†LPSCARDCONTEXTë†PRINTER_ATTRIBUTE_NETWORKÑ ä‡SelectClipPathã,Ñ ä ‡SC_VSCROLLãDÑ ä ‡NRC_PENDINGê‡INET_E_REDIRECTINGã„Ñ äˆpszCurrentDirectoryâœÑ äˆPUBLICKEYBLOB¼Ñ äˆszOID_PKIX_CA_ISSUERSè!ˆURLACTION_SCRIPT_OVERRIDE_SAFETYáüÑ ä ‰fd_countá(Ò ä ‰IStorage_RemoteOpenStream_Proxyê#‰IInternetProtocolRoot_Resume_ProxyãxÒ äŠmidistrmbuffver_tagâˆÒ ä ŠpbVal¸Ò ä&ŠIXMLDOMCharacterData_get_length_ProxyèŠSQL_CC_PRESERVEâìÒ ä ‹LPBINDHOSTãÓ ä‹SafeArrayCreateâ$Ó ä‹CreateServiceWë%‹SQL_AT_CONSTRAINT_INITIALLY_DEFERREDápÓ äŒSHFileOperationWéŒ_wireSAFEARR_DISPATCH¨Ó äworkspaceSizeÈÓ äRPC_SERVER_INTERFACEáôÓ ä&PKCS_CONTENT_INFO_SEQUENCE_OF_ANYÔ ädwDriverAttributesëStgCreateDocfileOnILockBytesáTÔ ä ŽtmLastCharãtÔ äŽNPOUTLINETEXTMETRICâÔ äŽBS_RIGHTBUTTONã¬Ô äŽRegQueryInfoKeyAáÌÔ äŽPSM_SETHEADERTITLEAêŽGetDCOMProtocolVersionã Õ äSORT_CHINESE_PRCá0Õ ä_IMAGE_EXPORT_DIRECTORYâLÕ äLPMCI_LOAD_PARMSWlÕ ärghAdditionalStoreãˆÕ äPI_CLASSINSTALLêdwInstalledVersionMSáÄÕ äsmlDeleteCmdFuncáÜÕ äsmlPutCmdFuncèERROR_DS_DRA_GENERICá Ö ä‘mf_â,Ö ä‘SE_GROUP_DEFAULTEDãLÖ ä‘WNNC_NET_MANGOSOFTãlÖ ä‘CryptMsgOpenToEncodeáˆÖ ä‘SetVarCustDataã¼Ö ä)‘IXMLDOMDocument_get_implementation_Proxyé‘SQL_DESC_AUTO_UNIQUE_VALUEãüÖ ä ’e32_pagesizeá× ä ’C3_VOWELMARKá4× ä’RpcMgmtSetComTimeoutád× ä$’CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATEâ”× ä&’IOleInPlaceFrame_EnableModeless_Proxyè’BINDSTATUS_PROXYDETECTINGÐ× ä “ReparseTagãô× ä“IMAGE_REL_BASED_HIGHLOWâØ ä“lfSmCaptionFontê “_tagBINDINFOá<Ø ä”setvbufâPØ ä ”FLI_MASKé”CRGBá¨Ø ä;•?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@ãÈØ ä•TAPE_DRIVE_TENSIONãìØ ä•CERT_FIND_SUBJECT_NAMEäÙ ä•mFlagsë•STGMEDIUM_UserMarshal<Ù ä–ClearCommErrorë–MIXER_OBJECTF_MIDIOUTpÙ ä—S_SERMACT˜Ù ä—MCIERR_ILLEGAL_FOR_AUTO_OPENá¬Ù ä —DHPUBKEYáÔÙ ä—SCARD_ATTR_VENDOR_IFD_TYPEë2—IRpcStubBuffer_DebugServerQueryInterface_Stub0Ú ä˜SmlRecordOrFieldFilter_táLÚ ä˜FACILITY_SECURITYxÚ ä ˜DNS_ERROR_FILE_WRITEBACK_FAILEDâÚ ä ˜DS_ABSALIGNâ¬Ú ä˜RegQueryInfoKeyWé˜PSM_SETHEADERTITLEWâôÚ ä™ERROR_DS_DRA_SCHEMA_MISMATCHáÛ ä™WM_CTLCOLORSCROLLBARá(Û ä ™hszTopicáDÛ ä™LPMCI_LOAD_PARMSAè ™PSBTN_HELPãxÛ äšSHFileOperationAá”Û äšILayoutStorageëšV_DATEã¼Û ä ›auto_ptráÜÛ ä›THREAD_SUSPEND_RESUMEôÛ ä ›SetFileTimeâÜ ä›fdwLineâ$Ü ä›PERF_COUNTER_BASEDÜ ä›HCCE_LOCAL_MACHINEë2›IInternetSecurityManager_GetZoneMappings_StubÜ äœRipInfoêœPEMREXCLUDECLIPRECTâÄÜ äGlobalFixèÜ äRPC_C_OPT_MQ_ACKNOWLEDGEâÝ äTF_DISCONNECTèCreateServiceAãDÝ äžERROR_INVALID_PIXEL_FORMATãhÝ äžSTG_E_EXTANTMARSHALLINGSáŒÝ äžCERT_RDN_ISO646_STRINGã°Ý äžCoRegisterMessageFilterâØÝ äžUPDFCACHE_ALLBUTNODATACACHEêžLPQUERY_SERVICE_LOCK_STATUSâ$Þ äŸIMAGE_REL_PPC_SECREL16ãHÞ äŸEVENT_E_USER_EXCEPTIONãhÞ äŸLoadCursorFromFileãˆÞ äŸIEnumSTATPROPSETSTGêŸIEnumSTATPROPSETSTG_Reset_StubãÈÞ ä  key_typeáàÞ ä MessageBoxExAß ä LPUNIVERSAL_NAME_INFOWãß ä  __WINEFS_H__á<ß ä DeletePrinterDriverExè SQL_TRANSLATE_OPTIONátß ä ¡GetUserNameWá”ß ä¡dwPathLenConstraintâ¸ß ä¡??_7IXMLDOMNodeList@@6B@é ¡__MIDL_IBindStatusCallback_0006â à ä¢CERT_CREATE_SELFSIGN_NO_SIGNá8à ä ¢IOleLink_SetUpdateOptions_Proxyê ¢__MIDL_IBindStatusCallback_0005â„à ä£_DisposeAllThreadData¤à ä£CRYPT_E_NOT_DECRYPTEDÀà ä£MCI_MSF_MINUTEãÜà ä£ActualCountArrayáøà ä£LPCREATETYPEINFO2è £__MIDL_IBindStatusCallback_0004â8á ä¤numberãXá ä¤lpProcessInformationá„á ä ¤__MIDL_IBindStatusCallback_0003â¤á ä¤BINDF_GETCLASSOBJECTé ¤SQL_ARD_TYPEáÜá ä¥_TOKEN_PRIMARY_GROUPââ ä¥LANGGROUPLOCALE_ENUMPROCé ¥__MIDL_IBindStatusCallback_0002âHâ ä¦NPDEBUGHOOKINFOâlâ ä¦RegNotifyChangeKeyValueââ ä¦InitiateSystemShutdownExWè ¦__MIDL_IBindStatusCallback_0001âÐâ ä§e32_eipâôâ ä§ERROR_INVALID_DOMAINNAMEáã ä§RPC_S_NO_BINDINGS,ã ä§MWT_LEFTMULTIPLYáHã ä§DeleteColorSpaceáhã ä§pvKeyEncryptionKeyë §IXMLElement2á°ã ä$¨szOID_PHYSICAL_DELIVERY_OFFICE_NAMEê¨SQL_CS_CREATE_SCHEMAâä ä$©IAdviseSink_RemoteOnViewChange_Stubâä ä©HACCEL_UserSizeê©ImmGetCandidateListCountWTä äªrespURIê ªpcVal€ä ä«_SIZEOF_LONG_LONG¨ä ä«ERROR_INVALID_HANDLE_STATEã¼ä ä«VK_ENDãÔä ä «SO_DONTROUTEé«OleFlushClipboard å ä¬SetWindowOrgExã(å ä¬NDR_ASCII_CHARã@å ä¬LPFORM_INFO_1è¬IServiceProviderá|å ä­EndUpdateResourceAã”å ä ­BLACK_BRUSHê ­DMBIN_USERãÀå ä ®bitmaskxáÜå ä®PERF_RAW_FRACTIONè®SAFEARR_DISPATCHá æ ä ¯bitmaskyá æ ä¯BeginPathTæ ä'¯CERT_GROUP_POLICY_SYSTEM_STORE_REGPATHãtæ ä¯CryptHashCertificateé¯dwInstalledVersionLSá¨æ ä°XPTEXP2âÌæ ä°InitiateSystemShutdownExAè °WN_SUCCESSë ±CRYPT_X942_PUB_INFO_BYTE_LENGTHâ(ç ä ²sml_cred_sãDç ä²SEVERITY_ERRORãdç ä²CryptEncodeObjectExâˆç ä²CERT_PRIVATE_KEY_VALIDITY ç ä ²PFORM_INFO_1é$²__IClassFactory_INTERFACE_DEFINED__âäç ä³XPTEXP1âüç ä³SECTION_QUERYè ä ³OF_EXISTá$è ä ³DM_COPIESè³VS_FIXEDFILEINFOáTè ä´RIP_EVENT|è ä´ERROR_UNABLE_TO_LOCK_MEDIAã˜è ä´MULTIFILEOPENORDá°è ä´__RPCDCEP_H__Äè ä´GetSourceÜè ä ´PROPVAR_PAD2é´SQL_QUICK é äµOBJECT_TYPE_LISTá,é äµCS_BYTEALIGNWINDOWã@é äµTRY_AGAIN\é äµPP_ENUMMANDROOTSáˆé ä µIXMLDocument_get_mimeType_Proxyâ é ä µPROPVAR_PAD3é µCDM_GETSPECâÌé ä¶MS_DSR_ONèé ä¶INPLACE_S_FIRSTãê ä¶MessageBoxExW$ê ä¶LPUNIVERSAL_NAME_INFOAã\ê ä,¶IOleInPlaceFrame_TranslateAccelerator_Proxyâê ä*¶ICreateTypeInfo_SetFuncAndParamNames_Stubè ¶SQL_BP_CLOSEáÄê ä·tmpnam_temp_nameáÜê ä·PSID_NAME_USEøê ä·dwCommittedSizeâë ä ·GetUserNameAá(ë ä·HS_HORIZONTALXë ä$·IXMLDSOControl_get_readyState_Proxyê ·PROPVAR_PAD1á„ë ä¸BAUD_1200¤ë ä¸OUT_OUTLINE_PRECISã¼ë ä ¸DEREGISTEREDáØë ä¸RevocationDateë¸SERIAL_IOC_MCR_OUT2âì ä¹LOCALE_IMONLZEROá0ì ä¹NdrMarshSCtxtHdlé¹GetVarCustDataãpì äºlexicographical_compareâŒì äºCLIP_TT_ALWAYSã¬ì äºGetCanonicalFormatEtcèºGetCurMonikeräì ä»EndUpdateResourceWãøì ä»CreatePení ä»wglCopyContextã,í ä »hwndPartnerâHí ä»LPMIDICALLBACKë»SERIAL_IOC_MCR_OUT1â€í ä ¼_MSL_CTYPE_Háí ä ¼FCHAR°í ä¼LR_LOADTRANSPARENTãÐí ä¼FILE_DEVICE_SCREENãôí ä¼IOCTL_DISK_IS_WRITABLEã$î ä$¼ICreateTypeLib2_DeleteTypeInfo_Stubê¼IXMLDOMNode_selectNodes_Stubáhî ä½VirtualProtectã|î ä½LINGERãî ä½cLocksã¬î ä½MDM_MASK_AUTO_MLé½ImmDestroyContextðî ä"¾CO_E_FAILEDTOOPENPROCESSTOKENï ä¾dwDisplayType(ï ä¾SCardIntroduceReaderáTï ä"¾IOleCache2_RemoteUpdateCache_Stubè¾SQL_COLUMN_NAMEâ„ï ä¿dwTrackâ ï ä¿LPOINETBINDINFOê¿ImmGetCandidateListCountAÜï ä À_MSL_TIME_Hâìï äÀsbufáð äÀIMAGE_REL_MIPS_SECTIONã(ð äÀMB_DEFBUTTON3èÀSQL_FN_TD_CURRENT_TIMEãdð äÁMK_E_NOPREFIX€ð äÁBITMAPV4HEADERã˜ð äÁMB_DEFBUTTON2´ð äÁSQL_OAC_LEVEL2ëÁirowáÔð ä ÂCountìð äÂMB_DEFBUTTON1áñ äÂLZCloseâ,ñ ä&ÂMIXERLINE_COMPONENTTYPE_DST_FIRST@ñ äÂNRC_INUSEXñ ä ÂLPDRAGINFOWâ„ñ ä ÂszOID_PREFERRED_DELIVERY_METHODâ¤ñ äÂCERT_ALT_NAME_INFOãÀñ äÂSQL_OAC_LEVEL1ëÂwszCorrelationãðñ äÃPointerãò äÃmemâ$ò äÃXptErrorInformationPtr_táLò äÃSE_SYSTEM_ENVIRONMENT_NAMEã`ò äÃDC_COPIES€ò äÃSTG_E_INVALIDHANDLEâ”ò äÃPEMRARCâ°ò äÃPEMRPOLYPOLYGONâÌò äÃWM_HANDHELDFIRSTé&ÃCHANGER_IEPORT_USER_CONTROL_CLOSEó äÄisgreaterequalã0ó äÄForwarderStringâPó äÄERROR_WMI_DP_FAILEDâxó äÄERROR_DS_INVALID_DN_SYNTAXãó ä ÄPTEXTMETRICAá¬ó äÄ_ADAPTER_STATUSâÈó äÄpszAccessMethodâÜó äÄVT_RECORDüó äÄSCARD_CLASS_ICC_STATEèÄPRINTPROCESSOR_INFO_1WãDô äÅERROR_BAD_INHERITANCE_ACL`ô äÅPPSFEATURE_OUTPUT„ô äÅLPMCI_WAVE_OPEN_PARMSAã¨ô äÅRpcNsBindingUnexportPnPAáÄô äÅPropertySheetAãàô äÅCoTaskMemAllocëÅCALPSTRâõ äÆSTG_S_MULTIPLEOPENSâ,õ ä ÆLPDIBSECTIONáPõ äÆSE_ERR_ASSOCINCOMPLETEãpõ äÆ_SHELLEXECUTEINFOAëÆSERVICES_ACTIVE_DATABASEA´õ äÇLPSECURITY_ATTRIBUTESÜõ äÇDNS_STATUS_SINGLE_PART_NAMEâøõ äÇDRAWTEXTPARAMSãö äÇMB_DEFBUTTON4,ö äÇMCI_VD_PLAY_SCANé ÇpAdvSinkáTö äÈ__sort132xö äÈTAPE_DRIVE_ERASE_SHORTã ö äÈRpcMgmtStopServerListeningãÄö äÈRpcBindingInqAuthInfoAãäö äÈMS_DEF_DSS_DH_PROV_Wá÷ äÈszOID_OIWDIR_md2RSAê'È__ICatalogFileInfo_INTERFACE_DEFINED__ãT÷ äÉDNS_ERROR_AXFRãp÷ äÉMAKEINTRESOURCEAá÷ äÉNLS_IME_CONVERSIONã¨÷ ä ÉWAVERR_SYNCâÔ÷ ä!ÉBINDSTATUS_ENDDOWNLOADCOMPONENTSéÉCreateTypeLib2ã ø äÊFOF_NORECURSIONâ8ø ä&ÊCMSG_HASHED_DATA_PKCS_1_5_VERSIONPø äÊF5_1Pt23_1024dø ä ÊnMinPageéÊSQL_DB_DEFAULTã”ø äËpointerâ¼ø äËPF_COMPARE_EXCHANGE_DOUBLEãÔø ä ËPolyPolylineáìø äËGetMenuItemIDù äËRPC_BUFFER_EXTRAé ËSIOCSHIWATã8ù ä ÌPCF_XONXOFFâPù äÌLPTEXTMETRICWhù ä ÌWM_IME_CHARâ„ù äÌTotalByteLengthêÌCERT_ARCHIVED_PROP_ID¸ù äÍ_getcwdâàù äÍSUBLANG_ENGLISH_PHILIPPINESâüù äÍPHYSICALHEIGHTëÍDMRES_LOW$ú äÎLongToPtr@ú äÎBackupEventLogWêÎHlinkNavigateMonikerápú äÏEdiâ”ú äÏGetFileVersionInfoSizeëÏlpszLoggedUrlNameÄú ä Ðget_sizeáÜú ä ÐUuidCreateãüú äÐ_SHELLEXECUTEINFOWëÐSERVICES_ACTIVE_DATABASEWLû äÑERROR_DS_ATT_SCHEMA_REQ_SYNTAXãlû äÑFirstTransportNumberé!ÑIXMLDOMNode_get_parentNode_Proxyá¨û äÒcredáÈû äÒSTG_E_ACCESSDENIEDãàû ä ÒPTEXTMETRICWáüû äÒWS_EX_TRANSPARENTü ä ÒDestroyCaretá$ü äÒbRedáHü äÒPRINTPROCESSOR_INFO_1Aãlü äÒ??_7IEnumFORMATETC@@6B@êÒVarDecFix¤ü äÓERROR_UNKNOWN_REVISIONãÀü äÓShowWindowAsyncâäü äÓLPMCI_WAVE_OPEN_PARMSWãý äÓRpcNsBindingUnexportPnPWéÓPropertySheetWã8ý äÔmemberãPý ä ÔLPDRAGINFOAêÔCRYPT_VERIFY_CONTEXT_SIGNATUREãý äÕwstrrevâ¸ý äÕCRYPT_E_ISSUER_SERIALNUMBERâÜý äÕRpcServerUseAllProtseqsâþ ä'ÕCRYPT_PARAM_ASYNC_RETRIEVAL_COMPLETIONã(þ ä ÕComposeWithâLþ äÕURLACTION_COOKIES_SESSION|þ ä$ÕICatalogFileInfo_GetJavaTrust_Proxyâœþ äÕGetServiceDisplayName¼þ äÕdwModemModelOffsetëÕSQL_API_SQLERRORé#Ö__IEnumOLEVERB_INTERFACE_DEFINED__ë×MediaInfoCountã8ÿ äØLANG_URDUdÿ äØPIMAGE_LOAD_CONFIG_DIRECTORY64ã€ÿ äØBackupEventLogAâ˜ÿ ä ØNRC_INCOMPã¬ÿ äØABE_RIGHTÌÿ äØCHANGER_CLEANER_SLOTáàÿ ä ØHyperStréØ_LPIINTERNETSESSION_DEFINEDâ( äÙWSA_QOS_EFILTERCOUNTáD äÙWH_CALLWNDPROCã` äÙCHANGER_TO_SLOTêÙIME_CMODE_NOCONVERSION㤠äÚSUBLANG_DUTCH_BELGIANÐ äÚJOB_OBJECT_UILIMIT_GLOBALATOMSãè äÚdwBuildNumberá äÚLPTEXTMETRICA äÚ_ABCFLOAT, ä ÚLPHMIDIOUTëÚCTL_USAGEd äÛIMAGE_RESOURCE_DATA_ENTRYt äÛdsBmሠäÛDC_ICON⬠äÛPCTL_FIND_SUBJECT_PARAëÛOLEWHICHMK_CONTAINERâ ä.Ü?$basic_filebuf@_WU?$char_traits@_W@std@@ äÜMMIOM_WRITEFLUSHé ÜCRYPT_NEXTë#ÝCRYPT_DEFAULT_CONTEXT_PROCESS_FLAGãt äÞEdxâ äÞLPMDICREATESTRUCT¬ äÞWHDR_BEGINLOOPãÐ äÞRpcBindingInqAuthInfoWãô äÞRpcNsBindingImportDoneã äÞMS_DEF_DSS_DH_PROV_AéÞINET_E_OBJECT_NOT_FOUNDâL äß_strrevâd ä ß_MAX_DRIVE〠äßMAKEINTRESOURCEWᜠäßRPC_C_MQ_EXPRESSáÄ äß??_7AsyncIAdviseSink2@@6B@ãü ä,ßIInternetZoneManager_SetZoneAttributes_StubêßSQL_PARAM_PROCEED8 äàuninitialized_fill_náP äàLPEXTLOGFONTAd ä àCreateDCá| ä àEnableWindowᘠäàLOCALE_STHOUSANDḠäàLPOPENCARDNAME_EXAãÐ ä àLayoutTypeëàGetObjectStorageéáSQL_UNKNOWN_TYPEá ä âcount< äâcompressed_pair_switchãX äâERROR_NOT_OWNER∠ä$âMIXERLINE_COMPONENTTYPE_SRC_WAVEOUT⤠äâPERF_SIZE_ZEROëâLPINTERFACEDATAâà äãSPLDS_DRIVER_VERSIONéã??_7IOleInPlaceObject@@6B@ã ää__int64â0 ä äbitmask2áT ääERROR_TOO_MANY_OPEN_FILES€ ääSPAPI_E_DEVINST_ALREADY_EXISTS㘠ääPMIXERCONTROL¸ ääPERF_INVERSE_COUNTERáÔ ääSCARD_STATE_EMPTYì ääSQL_VARBINARY ä äSQL_IK_DESCêäSQL_SRJO_CROSS_JOINâ< ä åLGRPID_GREEKáX äåWNetGetLastErrorAt äåIPPORT_TIMESERVER  äåCERT_STORE_PROV_WRITE_ADD_FLAG㸠ä åCRL_FIND_ANYéåMoveFromIePortãô äæszOID_OEM_WHQL_CRYPTO äæNdrPointerMemorySizeé æAsyncIPipeByte_Begin_Push_ProxyâT äçwmemsetâh ä çbitmask1ሠäçPROCESSOR_INTEL_486â  äçGetWindowTextèçLPADDJOB_INFO_1WáÔ ä èPEXTLOGFONTWáì ä èUnlockRegionéèSQL_CP_ONE_PER_DRIVER ä êqsort< äêPCERT_DSS_PARAMETERSáX äêIOplockStorageë êSQLValidDSNWá äëWSA_QOS_EPSFILTERSPEC¨ ä ëENUMLOGFONTâÜ ä'ëCERT_MAX_ASN_ENCODED_DSS_SIGNATURE_LENãü äëDISPATCH_PROPERTYPUTé ëSQLErrorá$ äìCLRRTSã8 ä ìIsWindowáT äìKeyWrapAlgorithmát äìget_implementation㌠äìWINOLEAUTAPI_èìSQL_API_SQLPARAMDATAéíCOMMON_LVB_SBCSDBCSâì äîSECURITY_DIALUP_RIDêîRegQueryValueExAá4 ä!ïERROR_DS_NO_REQUESTED_ATTS_FOUNDáL äïtmDefaultChart äïPERF_COUNTER_LARGE_RAWCOUNTâ” äïCRL_DIST_POINTS_INFOé&ïCERT_TRUST_HAS_EXACT_MATCH_ISSUERÔ äðexpm1fãð äðOUT_STRING_PRECIS ä ðRequestSizeâ( äðMftWritesUserLevelëðIEnumString_Reset_Proxyâd ä ñ_COMMCONFIG∠äñRpcNsProfileEltInqDone㤠äñLPADDJOB_INFO_1AéñNI_CLOSECANDIDATEÔ äòstrsetãð äòLB_SETTABSTOPSã äòtagCRGBâ äòPCERT_NAME_INFOê(òIInternetProtocolSink_ReportResult_Stubât äóERROR_NOT_LOGGED_ONâ” äóWM_VSCROLLCLIPBOARDâ° äóWNetGetLastErrorWè ä+óIInternetSession_UnregisterMimeFilter_StubëóSQLBIGINT äôSUBLANG_ARABIC_IRAQâ@ äôERROR_INVALID_HOOK_HANDLE\ äôAPPCLASS_STANDARDèô??_7ICreateTypeLib2@@6B@é õSM_CYSCREENâ´ äöERROR_CANTREADãÌ äöLPEXTLOGFONTWä äöPFD_TYPE_RGBAø äöVT_DATEâ äöLPOPENCARDNAME_EXWëöSQL_ATTR_AUTO_IPDP ä÷exception_codeãx ä÷szOID_RSA_preferSignedData㘠ä÷lpDisplayInformationé%÷__MIDL_itf_unknwn_0005_v0_0_c_ifspecáÜ ä ønew_sizeáø äøRegQueryValueExWá äøszOID_RENEWAL_CERTIFICATE8 äøNdrOleAllocateëøURLTEMPLATE_PREDEFINED_MAXãx ä ùPolyBezierToá ä ùPPOINTFLOAT⬠äù_CMSG_STREAM_INFOèùMDM_X75_DATA_BTXáÜ äúexpm1lãð äú_Memberâ äúLMEM_INVALID_HANDLEâ( ä úDebugBreakãH äúWS_EX_CONTROLPARENTâ` äúF3_1Pt23_1024Œ ä úOleMetafilePictFromIconAndLabelêúSQL_SR_REFERENCES_TABLEâÀ ä ûquoteÜ äûSECURITY_NULL_RIDø äûCTLCOLOR_LISTBOXéûIRpcStubBufferã< äüSTATUS_ARRAY_BOUNDS_EXCEEDEDá` äüERROR_DS_DECODING_ERROR†äüRpcAsyncGetCallStatus” äüpfnFreeâ´ äüAPD_COPY_ALL_FILESë&ü__ISynchronizeMutex_FWD_DEFINED__ ä%ýIXMLDOMDocument_get_parseError_ProxyéýOleDoAutoConvertáD ä þsml_pcdata_sá` äþftLastAccessTimeáx ä þPEXTLOGFONTAá” äþotmusMinimumPPEMᨠäþMIIM_DATAÀ ä þIID_IPersisté þelemdescVarâø äÿRvaToFirstByteOfCodeá äÿDISP_CHANGE_BADPARAMá0 ä ÿpServerNameê ÿSQLFreeStmtâ\ åBaseLowât å CO_E_FIRST㘠åOSS_CANT_CLOSE_TRACE_FILE´ åBSF_FORCEIFHUNGâÔ åMCI_SET_DOOR_CLOSEDâô åRPC_C_AUTHN_LEVEL_PKT åFOF_RENAMEONCOLLISIONéSHGFI_DISPLAYNAMED ä max_sizeál äVER_PLATFORM_WIN32_WINDOWSã„ ä BI_BITFIELDSá  äVP_FLAGS_POSITIONÌ ä"IXMLDocument2_get_readyState_StubèV_ISBYREFü ä_set_newnonptrmax äSCHED_E_INVALID_TASKáD äCRYPT_E_INVALID_X500_STRINGâd äGCP_NEUTRALOVERRIDEâ„ äBACKGROUND_INTENSITYá  äFILE_DEVICE_KSãÀ äSCardReleaseContextâð ä$IInternetBindInfo_GetBindInfo_Proxyê.URLPOLICY_AUTHENTICATE_CHALLENGE_RESPONSE8 ä _getppidáT äMK_E_UNAVAILABLEáp äAnimatePaletteã„ äHTCLOSE✠ä MessageBoxWâ´ ä FoldStringAêCERT_STORE_CTL_CONTEXTãð äSML_PE_STATUS äIMPORT_OBJECT_HEADERéERROR_CTX_CONSOLE_DISCONNECTáP ä e32_impmodãt äERROR_ALREADY_REGISTEREDሠäEndPath✠äTIMERPROC¸ äEnumDateFormatsWáÜ äRPC_C_AUTHN_LEVEL_CALLãð änPagesë SQL_CVT_TIMEá4 ä IMAGE_SYM_CLASS_END_OF_FUNCTIONâ\ ä"ERROR_INVALID_SERVICE_ACCOUNTt äwaveInMessage” äRpcNsGroupMbrRemoveWéGetSessionOptionáÈ ä @temp_ptr@ëITypeLib_GetLibAttr_Stubá änDebugInfoSizeã, äPCERT_PHYSICAL_STORE_INFOD ä hbmWatermarká` äLPPROPSHEETHEADERè VarCyMulሠä AclSize⨠ä ERROR_HOOK_NEEDS_HMODÄ ä STG_S_RETRYNOWãÜ ä FlashWindowê MIXER_OBJECTF_WAVEINá ä otmAscentè dwPositionXâ@ ä RC_BITMAP64â\ ä MFT_RIGHTJUSTIFYát ä dwPositionY∠ä dwAudio⬠ä TYPEFLAG_FNONEXTENSIBLEâÄ ä CDN_INITDONEé CPS_CONVERTâü ä STARTF_USESHOWWINDOWá ä SW_SHOWê URLPOLICY_JAVA_CUSTOMP ä ModifyWorldTransformád ä AddJobã„ ä ??_7IMallocSpy@@6B@✠ä LPERRORINFOê SQLTRANSIDãÐ äGetPriorityClassé CTRY_BELARUSâ äungetc_buffer  äERROR_TOO_MANY_NAMESá4 ä SS_RIGHTé IROTData_GetComparisonData_Stubâ„ äSCARD_E_SERVICE_STOPPED⤠äRpcNsGroupMbrRemoveAḠä MaxCountáè ä*__ITimeAndNoticeControl_FWD_DEFINED__ äGetComparisonData8 ä'ITypeInfo_RemoteGetDocumentation_Proxyë formatNumberáh ä PF_DATAKITësecurityAttributes㜠äwcstodã¼ äAdjustTokenPrivilegesÔ ä get_charsetâè ä DATAINFOéSQL_C_TINYINT äE_FAILã0 äEnumDateFormatsAá\ ä CERT_SYSTEM_STORE_RELOCATE_PARAâx äUserIndexReadsã  ä"IXMLDOMNode_removeChild_ProxyÄ äINET_E_REDIRECT_FAILEDãÜ äCC_ENABLEHOOKèSQL_TYPE_NULL ä_lwriteâ, äERROR_BEGINNING_OF_MEDIAá@ äcbBitsSrcT ä dwBitLené*__IXMLElementCollection_FWD_DEFINED__œ ä SmlPutPtr_tâÌ ä#DNS_ERROR_RECORD_ONLY_AT_ZONE_ROOTãä ä MessageBoxAâü ä FoldStringWê PROV_RNGá,! äGetExceptionCodeáT! äIMAGE_RESOURCE_DIR_STRING_Uâh! äWSAEUSERS€! ä CB_GETCURSELéSPLDS_PRINT_END_TIMEáÀ! äCLIENT_CALL_RETURNãÜ! äget_firstChildëSQL_ATTR_PARAM_OPERATION_PTRá(" äSTATUS_FLOAT_STACK_CHECKáH" äSourceConstantAlphaêPSM_HWNDTOINDEXâ€" äMK_E_CANTOPENFILEèDragLeave¨" äwcstolãÀ" ä logical_andâÜ" äPC_POLYPOLYGONãð" ä iVertGapá # äWAVE_FORMAT_1M16éNdrServerInitializePartialãT# äSE_OWNER_DEFAULTEDãt# äSetSystemPowerStateâ”# äLPGRADIENT_TRIANGLEâÄ# ä%__MIDL_itf_wtypes_0000_v0_0_s_ifspecéSendOnDataChangeáô# äwcstokã$ ä??_7length_error@std@@6B@4$ äPST_PARALLELPORTéRPC_S_CALL_IN_PROGRESSãx$ äIMAGE_NT_SIGNATUREëERROR_CANT_ACCESS_FILEãÄ$ äPLUID_AND_ATTRIBUTES_ARRAYãÜ$ äREGDB_E_FIRSTè IErrorInfo_GetHelpContext_Proxyâ(% ä FILE_NAMED_STREAMSã@% ä FACILITY_URTá\% ä DISK_HISTOGRAMë& ODBC_ERROR_INVALID_PARAM_SEQUENCE¤% ä!int_p_cs_precedesÄ% ä!__LPCGUID_DEFINED__âð% ä&!COMADMIN_E_COMPFILE_CLASSNOTAVAIL& ä !EMRELLIPSEã& ä !VK_RIGHTá8& ä!dwlDriverVersioné!PPROVIDOR_INFO_2át& ä"OtherOperationCountâˆ& ä "HACCEL__á˜& ä"frm4é"PPROVIDOR_INFO_1áÜ& ä#sml_devinf_ctdataproplist_sâð& ä#LANGIDã' ä#DBG_UNREFERENCED_PARAMETERã,' ä#_OFSTRUCTH' ä#ERROR_FULL_BACKUPd' ä#EnumICMProfilesAá|' ä #ABM_SETPOSã¤' ä#CHANGER_CARTRIDGE_MAGAZINEãÄ' ä#PropSheet_PressButtonø' ä)#AsyncIUnknown_Begin_QueryInterface_Proxyé#Finish_OnViewChangeâ(( ä$frm2áP( ä$szOID_PRESENTATION_ADDRESSãt( ä$SCARD_T1_EPILOGUE_LENGTHáœ( ä$IEnumFORMATETC_Clone_ProxyãÀ( ä$COINIT_APARTMENTTHREADEDáÜ( ä$memidConstructoráô( ä$SQL_CVT_WCHARè$SQL_SO_STATIC0) ä%FILE_FLAG_DELETE_ON_CLOSEH) ä %MF_MENUBREAKáX) ä%frm3á€) ä%ICreateTypeInfo_SetMops_Stubé%QueryServiceObjectSecurityãÄ) ä&SetPriorityClassáÜ) ä &PC_EXPLICITê&SND_ASYNC* ä 'COLORRESá* ä'frm1á8* ä'tagMCI_OVLY_WINDOW_PARMSAL* ä'AF_PUPãl* ä'pszUsageIdentifierë 'rtMarginá”* ä(Remaining¨* ä(Vertex2âÄ* ä(SetWindowsHookWâà* ä(LR_DEFAULTSIZEãü* ä(midiOutSetVolumeá+ ä(IPPORT_SYSTATè(_SERVICE_STATUSâX+ ä)ERROR_DEVICE_NOT_PARTITIONEDá|+ ä)SPAPI_E_NO_COMPAT_DRIVERS+ ä)Vertex3ê)MCIERR_UNNAMED_RESOURCEâÐ+ ä*LBS_MULTIPLESELâä+ ä*OnSaveë*VectorFromBstrã, ä+int_n_sign_posnâ8, ä+ForwardIteratorâL, ä+PINT64ã`, ä+Vertex1ât, ä +HKL_PREVá˜, ä+MCIERR_CANNOT_LOAD_DRIVERÄ, ä!+CertVerifyCertificateChainPolicyâ- ä1+ILayoutStorage_ReLayoutDocfileOnILockBytes_Proxyá- ä+DCOM_CALL_STATEê +LPCHOOSEFONTáX- ä,LOGON32_LOGON_INTERACTIVE€- ä",ERROR_BAD_LOGON_SESSION_STATE˜- ä ,_devicemodeAé,HCF_HOTKEYACTIVEáÈ- ä-UINT32ãè- ä-RpcSsDisableAllocateá. ä -CHANGER_PREMOUNT_EJECT_REQUIREDê -elemdescFuncáH. ä.CreateDIBitmapã\. ä .NF_QUERYáp. ä .fReleaseáŒ. ä.PDRVCONFIGINFOEXá¤. ä._SCHANNEL_ALGè.SetSessionOptionáà. ä/PRINTER_ERROR_SEVEREáô. ä /IBindCtxé/TYPEFLAG_FCANCREATEâ4/ ä0smlAllocDevInfCTCapê0CCH_MAX_PROPSTG_NAMEál/ ä 1AccessCheckâ˜/ ä 1DNS_ERROR_DATAFILE_OPEN_FAILUREâ°/ ä 1GCP_CLASSINâÔ/ ä1tagMCI_OVLY_WINDOW_PARMSWè!1_CERT_SYSTEM_STORE_RELOCATE_PARAá0 ä2freeidã(0 ä 2COLORREFá@0 ä 2TEXTMETRICë 2DT_PLOTTERãx0 ä3WSA_QOS_ESERVICETYPEáœ0 ä3CERT_STORE_CRL_CONTEXTãÀ0 ä3WMI_DISK_GEOMETRY_GUIDãì0 ä 3IMarshal_DisconnectObject_Proxyâ1 ä3IMoniker_CommonPrefixWith_Stubã01 ä 3LPOLEWINDOWê3_speedãd1 ä4MaximumAllocationSize€1 ä4WAVE_FORMAT_1M08é4pwszChallengeStringâÈ1 ä5CO_E_WRONGTRUSTEENAMESYNTAXâä1 ä5EnumICMProfilesWáü1 ä5EMR_RECTANGLE$2 ä5PD_ENABLESETUPTEMPLATEHANDLEé*5SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATEp2 ä6ERROR_SWAPERRORê6BINDSTATUS_FINDINGRESOURCEã¸2 ä7IMAGE_REL_I386_SEG12áÐ2 ä 7dwAvailPhysâè2 ä7PC_WIDESTYLED3 ä%7__MIDL_itf_unknwn_0000_v0_0_s_ifspecé*7SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATEp3 ä8TAPE_DRIVE_WRITE_MARK_IMMEDâ˜3 ä8DNS_ERROR_RECORD_TIMED_OUTã¬3 ä8VK_BACKâÐ3 ä8ERROR_LABEL_UNREADABLEãô3 ä8IOleInPlaceActiveObjectê8SQL_CA1_SELECT_FOR_UPDATEè9RpcMgmtInqIfIdsâL4 ä :ne_swapareaâl4 ä:LOGON32_LOGON_BATCHâ„4 ä :_devicemodeWá¬4 ä":CMSG_CMS_RECIPIENT_INFO_PARAMÌ4 ä:SCARD_ATTR_MAX_CLKãô4 ä:IMPLTYPEFLAG_FDEFAULTVTABLEê:GetSecurityId5 ä;fromá<5 ä;MCIERR_CREATEWINDOWâT5 ä;CF_ENABLEHOOKx5 ä;MDM_PROTOCOL_ANALOG_RLPê;SQL_CA2_LOCK_CONCURRENCYáÈ5 ä <IMAGE_COMDAT_SELECT_ASSOCIATIVEâè5 ä<Finish_OnDataChangeê <TIME_STRUCTâ6 ä=DM_REPOSITION06 ä =CTRY_JAPANë=MDM_V110_SPEED_2DOT4Kp6 ä>TYPE_E_OUTOFBOUNDSãŒ6 ä>SetWindowsHookAê>SuspendâÀ6 ä?PROCESSOR_STRONGARMê?cbDetailsä6 ä@minâ 7 ä@PAN_MIDLINE_STANDARD_TRIMMEDá 7 ä @CreateICá@7 ä@EMRSETWORLDTRANSFORMáX7 ä @itemActionãx7 ä@SWP_ASYNCWINDOWPOSãœ7 ä@RpcNsBindingLookupBeginAá°7 ä @cCustDataè @uniqueIDáè7 äAPMEMORY_BASIC_INFORMATIONá8 ä AlpImageNameâ$8 äAObjectDeleteAuditAlarmWâ@8 äASESSION_HEADERëA_NDR_PIPE_MESSAGEx8 äBTYPE_E_INVALIDIDé BCodePageNameá¨8 ä CPRLIST_ENTRYáÈ8 äCRTL_RESOURCE_DEBUGãà8 äC_STARTUPINFOWá9 äCtagMCI_VD_PLAY_PARMSá$9 äCRpcNsBindingUnexportPnPâL9 äCIXMLDocument2_get_root_Stubê$CIInternetSession_CreateBinding_Stubâ9 äDstrchrã¤9 äDSSTF_NONE¸9 ä DCmdByteséDWaitForPrinterChangeâ: äEERROR_DS_TIMELIMIT_EXCEEDEDâ: äEcBlueBits,: ä EMM_MCINOTIFYáP: äEMCI_OVLY_WINDOW_PARMSAãt: äEIWinTypes_v0_1_s_ifspecâ´: ä5EIGlobalInterfaceTable_RegisterInterfaceInGlobal_StubáÜ: äEURLOSTRM_USECACHEDCOPY_ONLYâô: ä EVariantCleará; ä EVarDecNegèEdwModemManufacturerOffsetD; ä FTC_SO_ABLEã`; äFGetPrinterDataWê"FIPersistFile_GetCurFile_Proxy¤; äGiterator_categoryÀ; äGMCI_INFO_PARMSWê GpParametersâ< ä*HJOBOBJECT_END_OF_JOB_TIME_INFORMATION$< äHPEMRPOLYPOLYGON168< äH_ICONINFOd< ä"H__IDropSource_INTERFACE_DEFINED__èHLPQUERY_SERVICE_CONFIGAâ°< äIERROR_SEVERITY_INFORMATIONALéIIXMLDOMNode_get_parsed_Stubâè< äJmidâ= äJsmlEndSyncFuncã$= äJDdeClientTransactionáD= äJwaveInGetErrorTextWâl= ä"JIUnknown_QueryInterface_Proxy|= äJplValèJSQL_SNVF_CHAR_LENGTHá¼= äKPMCI_SYSINFO_PARMSAê4KBASIC_CONSTRAINTS_CERT_CHAIN_POLICY_END_ENTITY_FLAGâ> äLGetHandle$> äLMSGF_USER8> ä LKP_ALGIDáT> äLCERT_COMPARE_ANYáx> äLCIP_NEWER_VERSION_EXISTSéLSysFreeString¸> ä"MFORMAT_MESSAGE_MAX_WIDTH_MASKÐ> ä MLPPELARRAYãì> äMMCI_SEQ_DIV_PPQNá? äMSCARD_WARM_RESETá$? äMCALLTYPE_ASYNCë MVarR8Roundã\? äNPROCESS_HEAP_REGIONât? ä NWSAENOTSOCKâŒ? äNlpszClassName¸? ä"NCERT_QUERY_CONTENT_SERIALIZED_CRLèNIID_IDummyHICONIncluderâð? äOdetailsâ @ äOSE_ERR_DDEBUSYã$@ ä O_CERT_CHAINâP@ ä!OIXMLDOMAttribute_get_value_Proxyá€@ ä#OIBinding_RemoteGetBindResult_ProxyëOSQL_API_SQLALLOCHANDLESTDÌ@ äPSmlDevInfDatastoreListPtr_tâì@ äPRPC_S_INVALID_BINDINGA äPVP_TV_STANDARD_SECAM_Kã,A äPGetPrinterDataAâDA ä PlpszFileNameéPIsIIDSupportedãtA äQwmemchrâ”A äQIMAGE_SCN_MEM_SHAREDá´A äQtagEMRSETCOLORSPACEâÌA ä QSM_CXHSCROLLáèA äQMCI_INFO_PARMSAâB ä#QCHANGER_BAR_CODE_SCANNER_INSTALLEDëQIBinding_SetPriority_ProxyãhB äRERROR_INVALID_SECURITY_DESCRé&RCERT_CREATE_CONTEXT_NO_ENTRY_FLAG¬B äSPFD_SWAP_COPYÐB äSVP_TV_STANDARD_SECAM_HãðB äSCONNDLG_NOT_PERSISTêSMCI_OVLY_WINDOW_PARMSWã0C äTWNNC_NET_IBMALãLC äTWAVE_FORMAT_2M08á`C ä THP_ALGIDáxC ä TXLAT_CLIENTêTILockBytes_WriteAt_ProxyáÄC äUJOB_OBJECT_UILIMIT_DESKTOPãÜC äU_STARTUPINFOAüC äUCOMM_FAULT_OFFSETSëUNdrCorrelationPassãHD ä VERROR_DS_DRA_REF_ALREADY_EXISTSâhD äVotmsUnderscoreSizeãŒD äVRpcNsBindingLookupBeginWá°D äVCMSG_RECIPIENT_INFO_PARAMÌD äVpfnFindCallbackâðD äVURLZONE_PREDEFINED_MAXëVSQLBrowseConnectá0E äWObjectDeleteAuditAlarmAâTE äWVP_TV_STANDARD_SECAM_LãlE ä WINPUT_RECORDá„E ä WWAVERR_BASEâ¬E ä"WNdrConformantStringMemorySizeÀE ä WtagMKSYSéWMDMVOLFLAG_LOWãF äXFILE_FLAG_BACKUP_SEMANTICSã0F ä&XERROR_DS_CANT_DEL_MASTER_CROSSREFDF ä XhwndSinká\F ä XMB_COMPOSITEáxF äXMENU_EVENT_RECORD”F äXPMCI_SEEK_PARMSâ¨F ä XFD_WRITEé&XSQL_AD_CONSTRAINT_NAME_DEFINITIONìF ä YSM_CYHSCROLLáG äYVP_TV_STANDARD_SECAM_Bã@G ä%YCERT_SYSTEM_STORE_CURRENT_SERVICE_IDálG ä YBitmapWritesFlushForLogFileFullâœG ä%YPRINTER_CHANGE_DELETE_PRINTER_DRIVERáÀG äYIEnumSTATSTG_Next_StubëYCreateAsyncBindCtxãøG ä ZWM_MDINEXTë,ZURLACTION_INFODELIVERY_NO_REMOVING_CHANNELSâDH ä[uniqueãhH ä[SUBLANG_ENGLISH_JAMAICAâ€H ä [lpszMenuNameá H ä[RPC_C_FULL_CERT_CHAIN¸H ä [SHGFI_PIDLãÐH ä [PROV_STT_ISSâI ä%[__MIDL_itf_wtypes_0003_v0_0_c_ifspecé [UI_CAP_ROT90á0I ä \OLE_E_LASTãDI ä\VK_CANCEL\I ä \rgchMemberã€I ä\VP_TV_STANDARD_SECAM_Gã¤I ä\LOCALE_SABBREVLANGNAMEãÄI ä\waveInGetErrorTextAê\SCARD_READER_TYPE_PCMCIAâJ ä ]NPPELARRAYã(J ä"]MCIERR_NONAPPLICABLE_FUNCTIONHJ ä]PMCI_SYSINFO_PARMSWâ`J ä ]STUB_THUNKë]IID_IAsyncManager”J ä ^PDWORD_PTRãÀJ ä^PISECURITY_DESCRIPTOR_RELATIVEãÜJ ä^CLIPBRD_E_FIRSTâôJ ä ^FreeBufferã K ä ^CC_RGBINITë^LPQUERY_SERVICE_CONFIGWâLK ä_ClearCommBreakãhK ä_ImpersonateSelfâ€K ä_MFT_SEPARATOR˜K ä _SC_RESTOREã¼K ä_VP_TV_STANDARD_SECAM_DãäK ä_LPMIXERCONTROLDETAILS_SIGNEDé_??_7IEnumSTATPROPSTG@@6B@ L ä `elementTypeâ8L ä `smlAllocMoveáPL ä `HeapReAllocâpL ä`CLIPBRD_E_CANT_CLOSEáL ä`GCLP_HBRBACKGROUNDã¤L ä`HWAVEINâ¼L ä`__RPCNSIP_H__ØL ä`LPPRINTER_INFO_5áìL ä `get_typeé `VTBIT_I1á M äaSmlDevInfCTCapPtr_tâSetProcessWorkingSetSizeáÀ½ ä>SetConsoleCursorInfoáؽ ä >MMIOM_RENAMEáø½ ä>ELEMENT_STATUS_EXENABè >StgSetTimesâ(¾ ä ?BEGIN_PATHãH¾ ä?EMR_SETPALETTEENTRIES`¾ ä ?dwCPStandardé?_CRYPT_SEQUENCE_OF_ANY㜾 ä @FP_INFINITEâ´¾ ä @mixerCloseë@IOleLink_BindIfRunning_Proxyáø¾ äAinsert_iteratorêADBG_CONTROL_C(¿ ä B__FileReadãD¿ äBEMROFFSETCLIPRGNá\¿ ä BCTRY_LEBANONéBSHAREVISTRINGAã¿ ä C__float_min⨿ ä CSetLastErroré CRDW_VALIDATEáè¿ äDDNS_ERROR_RCODE_FORMAT_ERRORéDSQL_PARAM_TYPE_UNKNOWNã(À äEGetProcessHeapsâ@À ä EPolylineToã\À äEHELP_PARTIALKEYâxÀ äECONNECT_PROMPTã˜À äECryptGetAsyncParamëEITypeLib_GetTypeInfo_ProxyãÜÀ äFPEMREXTTEXTOUTWâôÀ ä FCTRY_JORDANâÁ äFCRL_DIST_POINTã(Á ä FtagSTATFLAGêFSQLGetAvailableDriversã|Á ä#GCERT_QUERY_CONTENT_SERIALIZED_CERTã´Á ä-GIXMLDOMDocument_putref_documentElement_Proxyé*GIXMLHttpRequest_get_responseText_StubøÁ äHstrspnã  äHERROR_DS_DNS_LOOKUP_FAILUREâ8 ä HOLE_E_STATICáP äH_INPUT_RECORD| äHAsyncIPipeLong_Begin_Pull_StubëHFUNCFLAG_FBINDABLEã°Â ä ICE_FRAMEáÈ ä IHC_NOREMOVEâä äILB_GETITEMRECTãü ä IlpvarValueë-IIInternetZoneManager_GetZoneAttributes_ProxyáLà ä JSTARTUPINFOAáhà äJdwComponentTypeêJGetDisplayNameã¤Ã äKRPC_S_SERVER_TOO_BUSY¼Ã ä KSIOCGHIWATëKSQLPostInstallerErrorüà äLERROR_DS_CANT_STARTâÄ äLPCMS_KEY_INFO0Ä äLSetImplTypeFlagsáLÄ äLGetLibStatisticséLLPCHOOSECOLOR|Ä ä MSML_VERS_1_2á¬Ä ä#MERROR_NOLOGON_SERVER_TRUST_ACCOUNTëMOFN_EXTENSIONDIFFERENTãèÄ ä NSML_VERS_1_1áüÄ äNrgbBlueâÅ äNLPMETAFILEPICTã0Å ä NSelectObjectáLÅ äNGCL_CBWNDEXTRAë"N__IXMLDOMEntity_FWD_DEFINED__ˆÅ äOstrcpyã Å ä OSML_VERS_1_0áÀÅ äOWINSTA_READATTRIBUTESØÅ ä OSOUNDSENTRYWáøÅ äOCryptSignCertificateéOFILE_DEVICE_CD_ROMã@Æ äPERROR_DS_SCHEMA_NOT_LOADEDã\Æ äPPEMREXTTEXTOUTAâtÆ ä PMOUSE_MOVEDâ˜Æ äPCMSG_ENVELOPED_DATA_V2ã°Æ äPGUID_TRISTATEÜÆ ä&PICreateTypeLib_SetDocString_ProxyÇ äPIXMLElement2_addChild_Proxyê4PIInternetProtocolSinkStackable_RollbackSwitch_ProxyâTÇ ä Qkeep_tÇ äQPOSTSCRIPT_INJECTIONáˆÇ äQGetRgnBox Ç ä QWS_CAPTIONã¸Ç äQDT_EXPANDTABSè"QCRYPT_PRIVATE_KEY_BLOB_AND_PARAMSáÈ äRSM_CXDOUBLECLKã È äRWNNC_NET_PATHWORKSã8È äRszOID_RSA_MD5\È äRCMSG_ENVELOPED_DATA_V0ëRNdrFieldOffsetã”È äSSmlDevInfExt_tëSszOID_RSA_MD4ÈÈ äTsmlAllocSearchãàÈ ä TDC_BINNAMESâÉ äTDNS_ERROR_ZONE_NOT_SECONDARYá É ä TGCP_KASHIDAâDÉ äTSetProcessWindowStationâ\É äTOemToCharBufftÉ äTSetLocaleInfoˆÉ äTAccessã°É äTSCARD_ATTR_ICC_TYPE_PER_ATRâÌÉ äTSHAREVISTRINGWëTSQL_ISV_COLUMN_PRIVILEGESÊ äUszOID_RSA_MD2è#U__ITypeFactory_INTERFACE_DEFINED__ãLÊ äVwcsdupëVRPC_C_PROFILE_DEFAULT_ELT”Ê äWTAPE_DRIVE_ABSOLUTE_BLKâ´Ê äWSEC_E_UNTRUSTED_ROOTáÜÊ äWCERT_ENCIPHER_ONLY_KEY_USAGEáøÊ äWCryptHashMessageáË äWPDEVICE_MEDIA_INFOëWpUserNameLË äXERROR_INTERNAL_ERRORátË ä"XIEnumSTATDATA_RemoteNext_Stub˜Ë äXILockBytes_ReadAt_Proxyê,XIBindStatusCallback_RemoteGetBindInfo_ProxyâôË äYRPC_S_INVALID_NAME_SYNTAX Ì ä YSOUNDSENTRYAá(Ì äYMCI_SAVE_PARMSã<Ì ä YUnadviseáXÌ äYURLPOLICY_QUERYâ€Ì ä"YIEnumSTATPROPSETSTG_Next_Stub¤Ì äYdwNegotiatedModemOptionséYSQL_CONVERT_WCHARÔÌ äZwmemcpyâðÌ äZRecursionCountãÍ äZERROR_MEMBER_IN_ALIAS,Í äZSM_CYDOUBLECLKãTÍ äZI_RpcBindingInqWireIdForSnegoèZCERT_REQUEST_INFO„Í ä[_getlogin¤Í ä[SECTION_MAP_EXECUTEâ¸Í ä[sa_dataê([IOleInPlaceSite_CanInPlaceActivate_StubâÎ ä \STARTUPINFOWá$Î ä\MCI_SYSINFO_QUANTITYá8Î ä\pDigestê\_NDR_CORRELATION_INFOlÎ ä ]swprintfáÎ ä]IsReparseTagNameSurrogate¬Î ä]EM_POSFROMCHARãÈÎ ä]CTRY_TATARSTANãèÎ ä]ReservedForRuntimeãÏ ä]IFillLockBytes_FillAt_Stubã(Ï ä ]MDM_CELLULARé]SQL_INDEX_OTHERâlÏ ä"^SYSER_FORBIDDEN_PRODUCT_FLAGS€Ï ä^searchã˜Ï ä ^upper_boundâ´Ï ä^_AUDIT_EVENT_TYPEè^offBitsâäÏ ä_SetConsoleTitleâÐ ä_IOCTL_SERENUM_PORT_DESCê_IPipeDouble_Push_Stub<Ð ä`scalbnãTÐ ä `FILE_READ_EAálÐ ä `midihdr_tagâ˜Ð ä!`CERT_STORE_NO_CRYPT_RELEASE_FLAGá´Ð ä`CertFindAttributeè `StackTopáèÐ äaMETA_SCALEWINDOWEXTâ Ñ äaSCARD_T1_PROLOGUE_LENGTHé#aSQL_CDO_CONSTRAINT_NAME_DEFINITIONãPÑ ä bMIIM_TYPEèbRPC_C_AUTHN_GSS_SCHANNELáŒÑ ä cNTM_ITALICã¤Ñ ä cDOF_DOCUMENTáÌÑ äcEnumPrintProcessorDatatypesAáäÑ äctagMETHODDATA Ò äcSQL_PARAM_BIND_TYPE_DEFAULTêcSQL_C_INTERVAL_DAYã@Ò ä dfUnicodeáPÒ ädcAttrèdGetImplTypeFlagsá„Ò ä fTOKEN_USERãœÒ ä fLoaderFlagsâ´Ò ä fnDescriptionáÔÒ äfPEMRSETDIBITSTODEVICEèÒ ä fDDE_FACKâÓ ä fLPMALLOCSPYâ(Ó äfIXMLDocument_put_URL_ProxyãHÓ äfLPHANDLER_FUNCTIONë fATTR_INPUTãŒÓ ä gSID_RECOMMENDED_SUB_AUTHORITIESâ¤Ó ä gEMRROUNDRECTá¼Ó ä gWH_MSGFILTERáÜÓ ägWSACancelBlockingCalløÓ ägMEDIA_ERASEABLEêgCHANGER_EXCHANGE_MEDIUMâ8Ô ähMAP_FOLDDIGITSë'hIXMLDocument_get_fileUpdatedDate_ProxyãŒÔ äi__uncheck_iteratorã¬Ô äiMediaCharacteristicsé iSID_BindHostáðÔ äjERROR_INVALID_GROUP_ATTRIBUTESëjSCS_QUERYRECONVERTSTRINGá8Õ äksml_devinf_filtercap_sãTÕ äkPFIND_NAME_HEADERxÕ äkCertCompareIntegerBlobãÕ ä kBindToObjectá¨Õ ä kSAFEARR_BSTRékIID_IInternetSecurityMgrSiteáðÕ älERROR_DEVICE_IN_USEâÖ älCRL_DIST_POINT_ERR_INDEX_SHIFTëlSQL_DTC_TRANSITION_COSTêmDDL_EXCLUSIVEtÖ änMCI_STATUS_READYénCLSCTX_LOCAL_SERVERâ°Ö äoVirtualProtectExáÄÖ ä opwszValueèoSQL_API_SQLGETFUNCTIONSâ× äp_IMAGE_FILE_HEADERã$× äpSERVICE_ADAPTERâL× äpSERIAL_IOC_FCR_FIFO_ENABLEãd× ä pSwitchToFileáx× ä pParseUrlép_pinfoã¤× ä qparam_typeãÄ× äq__partition_const_refÜ× äqFindFirstFile Ø ä#qSPAPI_E_DEVINSTALL_QUEUE_NONNATIVEã Ø ä qBINDSPEEDèqPSD_NONETWORKBUTTONâXØ ärSML_PE_DELETElØ ä rSONY_DTFérCreateStdDispatch°Ø äsJOB_NOTIFY_FIELD_DRIVER_NAMEáØØ äsJOB_NOTIFY_FIELD_UNTIL_TIMEêsSQL_FN_NUM_ATANâ Ù ät__handle_open Ù ä tvsprintfá@Ù ätERROR_NOT_DOS_DISKã\Ù ätWN_BAD_PROFILEãxÙ ätIID_ISynchronizeé tLPCFHOOKPROCá¤Ù ä uvwprintfáÀÙ äuLANG_LITHUANIANâØÙ äuIsBadWritePtrèÙ ä uwZposÚ äuLPMCI_OVLY_SAVE_PARMSÚ ä upfnAllocáLÚ ä#uCERT_SYSTEM_STORE_LOCAL_MACHINE_IDãhÚ äuPRINTER_ENUM_NAMEèuEnumPrintProcessorDatatypesWá¤Ú ävulOffsetsÀÚ ävERROR_BUS_RESETâèÚ ä"vOSS_CONSTRAINT_DLL_NOT_LINKEDüÚ ä v__TVOUT__èvMCI_DEVTYPE_SEQUENCER<Û äwMCI_OVLY_PUT_FRAMEãTÛ äwStorageLayouttÛ äwPLINKSRCDESCRIPTORë%wIXMLDOMNode_get_nodeTypedValue_Proxyá¼Û ä xMFT_BITMAPãÔÛ äxSKF_INDICATORðÛ äxVOS__WINDOWS16ãÜ ä xWN_NET_ERRORá(Ü äxPERF_SAMPLE_FRACTIONé#xAsyncIUnknown_Finish_Release_ProxyãxÜ äySBM_SETRANGEREDRAWã¤Ü äyIInternetProtocolSinkStackableã¼Ü ä ySQL_DEFAULTê ySQL_UB_FIXEDáèÜ äz_accessâüÜ ä zHighWordáÝ äzPSPROTOCOL_BINARY<Ý äzCERT_COMPARE_ENHKEY_USAGEhÝ ä&zIAsyncManager_GetCallContext_Stub€Ý ä zIXMLDocumentáÝ äz_pidlèzSQL_MAX_STATEMENT_LENÌÝ ä{PERF_COUNTER_RATEðÝ ä{CRYPT_FORMAT_RDN_REVERSEá Þ ä%{CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFOá@Þ ä{pwszStoreDirectoryë{get_nodeTypeStringãtÞ ä|CLK_TCKâ”Þ ä|ERROR_SPECIAL_USERã¨Þ ä |wsprintfá¼Þ ä |FD_ACCEPTè|URLZONE_USER_MAXáôÞ ä}_RefCountedPtrãß ä}CertAddCTLLinkToStore8ß ä}NdrSimpleStructBufferSizePß ä}PSH_WATERMARKpß ä}IStream_Stat_Proxyë }SQLINTEGERã¨ß ä~STATUS_CONTROL_C_EXITè~SQL_API_SQLBINDPARAMETERáàß äbsearchâøß ä GetUserNameêERROR_REQUEST_ABORTED0à ä€DC_PAPERNAMESPà ä€MOVEFILE_COPY_ALLOWEDlà ä€CO_E_ERRORINDLLâà ä€OSS_OID_DLL_NOT_LINKEDë€GetServiceKeyNameAãÐà äIMAGE_SYM_CLASS_NULLáðà äERROR_DS_PARAM_ERRORá á äPNDR_PIPE_MESSAGE(á äID_PSREBOOTSYSTEMè IPipeDoubleâdá ä‚IMAGE_SCN_ALIGN_8192BYTESŒá ä‚PostQueuedCompletionStatusã¨á ä‚bStrokeVariationáÈá ä‚CTRY_LIECHTENSTEINãìá ä‚SO_SYNCHRONOUS_NONALERTê‚SQL_DIAG_DROP_DOMAINá â ä ƒcbOutQueáDâ äƒMCIERR_CUSTOM_DRIVER_BASEdâ äƒMCI_DEVTYPE_VIDEODISCèƒPRSPEC_PROPID â ä„REG_LEGAL_CHANGE_FILTERâÀâ ä„ERROR_IS_JOIN_PATHãÔâ ä„offDataâôâ ä„IBinding_Suspend_Stubè„BINDSTATUS_SENDINGREQUEST4ã ä…_MSL_IMP_EXP_CPPáXã ä…ACCESS_DENIED_OBJECT_ACEálã ä…VK_ESCAPEŒã ä…DATEFMT_ENUMPROCEXAâ¸ã ä…IXMLElement2_get_children_StubãÐã ä…HELPMSGSTRINGè…SQL_CURSOR_KEYSET_DRIVENá ä ä†InputIterator(ä ä†ALG_SID_RSA_ANYâDä ä†rgNoticeNumbersâhä ä†CreatePropertySheetPageWé †ImmNotifyIMEá˜ä ä ‡is_class_impáÀä ä‡SCardRemoveReaderFromGroupWê ‡GetUserTypeâøä äˆSmlSourceRefListPtr_tå ä ˆhrPreviousã$å äˆRGN_XORâ@å äˆGetPrinterDataë$ˆ__IDummyHICONIncluder_FWD_DEFINED__ê‰IID_IXMLDOMCharacterDataá°å äŠPSPROTOCOL_BCPãÈå äŠlpDescriptionèŠSQL_SNVF_CHARACTER_LENGTHæ ä‹ERROR_INVALID_PASSWORDNAMEã4æ ä‹CTRL_SHUTDOWN_EVENTâHæ ä‹iMethodê ‹CDN_FILEOKãxæ ä ŒDATA_S_FIRSTá˜æ äŒCS_E_SCHEMA_MISMATCHá¸æ äŒ_CONNECTDLGSTRUCTWëŒLPENUM_SERVICE_STATUSAãðæ äunlinkãç ä strftimeáç ä _IC_AFFINEã4ç äES_CONTINUOUSPç äBS_DIBPATTERNPTâlç äLPCREATESTRUCTã”ç äLPOPENCARD_SEARCH_CRITERIAãÌç ä+IBindHost_RemoteMonikerBindToStorage_Proxyë SQL_SVE_CASEáüç ä ŽSTILL_ACTIVEáè äŽEMR_FLATTENPATHêŽRPC_ASYNC_STATEâHè ä SRCERASEádè äLPDISCDLGSTRUCTâ€è äFindExecutableAâ¬è ä!IMarshal_GetMarshalSizeMax_ProxyáÄè äIID_IPipeByteèVarDateFromDecãüè äbasic_streambufâé äIMAGE_DATA_DIRECTORYá8é äLPCIEXYZTRIPLEãPé ä PS_TYPE_MASKádé äEllipseâé ä SCARD_ATTR_DEVICE_FRIENDLY_NAMEâ¬é äPROPSHEETHEADERêCreatePropertySheetPageAáôé ä‘SUBLANG_GERMAN_LUXEMBOURGê ä‘GRADIENT_TRIANGLE(ê ä ‘lpstrCommandáDê ä‘ALG_SID_DSS_ANYâlê ä‘IOCTL_SMARTCARD_IS_PRESENTã”ê ä‘SCardRemoveReaderFromGroupAê ‘URL_ENCODINGáÀê ä’ptMaxSizeàê ä’MCI_ANIM_REALIZE_BKGDøê ä ’CRYPT_SGCKEYé’PSNRET_NOERRORã4ë ä“DATEFMT_ENUMPROCEXWâXë ä“_STORAGE_PREDICT_FAILUREá„ë ä “IDummyHICONIncluder_Dummy_Proxyâœë ä“LPPARAMDESCEX´ë ä “BINDVERB_GETáÔë ä“URLTEMPLATE_MEDLOWë“ODBC_ERROR_GENERAL_ERRãì ä”_MSL_TIME_WIN32_H0ì ä”NTE_BAD_PROVIDERáDì ä”pProgIdâhì ä”IOleCache_Uncache_Stubë”CFSTR_MIME_QUICKTIMEé•ITypeInfo_ReleaseVarDesc_ProxyãØì ä–PROCESS_QUERY_INFORMATIONí ä$–ERROR_CLUSTER_LAST_INTERNAL_NETWORKâ í ä –PEMRPOLYGONâ8í ä–PMSGBOXPARAMS\í ä–NdrUnMarshConfStringHdrâ€í ä–MediumChangerClassGuidã˜í ä –pDescriptioná¬í ä–nCopiesâÌí ä–GetServiceKeyNameWë–SQL_API_SQLGETDESCRECî ä—GlobalReAlloc$î ä—MultiByteToWideCharâDî ä—MCI_FORMAT_SMPTE_30ê —I_RPC_MUTEXâtî ä ˜_LIST_ENTRYâˆî ä˜PBITMAPâ¤î ä˜CBS_DROPDOWNLISTá¼î ä ˜SaveObjectãÐî ä ˜EXCEPINFOè ˜GetHelpFileâï ä™HWND_NOTOPMOSTã ï ä™FindExecutableWâ<ï ä™getprotobynameë™MDM_SHIFT_HDLCPPP_SPEEDâ€ï äštagMOUSEHOOKSTRUCTã ï äš_CONNECTDLGSTRUCTAã¼ï äšWSAGetLastErrorêšLPENUM_SERVICE_STATUSWäð ä›PRINTER_STATUS_ERRORé›SQL_NOSCAN_DEFAULTã4ð ä œString_táLð ä œwChannelMaskápð äœODBC_REMOVE_DEFAULT_DSNê œSQL_SVE_CASTá¨ð äWNNC_NET_EXTENDNETãÈð äszOID_RSA_signingTimeÜð ähInprocêS_ASYNCHRONOUSã ñ äžHBITMAPâ$ñ äžPSM_IDTOINDEXè'ž__IOleAdviseHolder_INTERFACE_DEFINED__ëŸDynamicChargedã„ñ ä prevá ñ ä FACILITY_SETUPAPIÐñ ä# MIXERCONTROL_CONTROLTYPE_QSOUNDPANãäñ ä EndTimeê SetPrinterDataãò ä ¡Length_tá,ò ä¡dmSpecVersionLò ä¡REFERENCE_WHITE_MAXâlò ä¡MOUSE_EVENT_RECORDãò ä¡I_RpcServerUseProtseqEp2á¼ò ä¡CMSG_CMS_ENCAPSULATED_CTL_FLAGë¡SC_MANAGER_CREATE_SERVICEøò ä ¢StackLimitãó ä¢LPCRITICAL_SECTIONã4ó ä¢DdeQueryStringWâDó ä ¢dwRetTó ä¢grp4á|ó ä¢RpcServerInqDefaultPrincNameAè¢SetConvertStg°ó ä£OSS_MORE_INPUTãÐó ä£PSP_USEHEADERSUBTITLEìó ä£_tagOIBDG_FLAGSê£SQL_QUALIFIER_LOCATIONã(ô ä¤CallNamedPipePô ä"¤COMADMIN_E_APP_FILE_WRITEFAILhô ä ¤WHITEONBLACKáxô ä¤grp2á˜ô ä¤RPC_C_MGMT_INQ_STATSá¬ô ä¤u_charãÔô ä¤IXMLDOMNode_appendChild_Proxyè ¤SQL_KEYWORDSáõ ä¥DMPAPER_FANFOLD_LGL_GERMANã(õ ä ¥DrawIconé¥grp3áTõ ä¦InjectionPointãdõ ä¦uvpâ€õ ä¦LPPROPSHEETPAGEWé!¦IOleItemContainer_IsRunning_StubáÀõ ä§_sleepãÜõ ä§smlFreeCredPtrãøõ ä§DETACHED_PROCESSáö ä§grp1á,ö ä§PCERT_X942_DH_PARAMETERSé§UnknownâTö ä ¨DRV_USERálö ä ¨pAttributesê¨IXMLDOMElement_normalize_Proxyã°ö ä ©ONE5STOPBITSáÄö ä ©PMMIOINFOè©CONFIRMSAFETYøö äªFACILITY_DISPATCH÷ äªFILE_DEVICE_CHANGERâH÷ ä%ªIOleInPlaceSite_OnUIDeactivate_Proxyé ªSQL_CN_NONEâx÷ ä «WC_DISCARDNSé«DESCKIND_TYPECOMP¼÷ ä"¬SECURITY_NON_UNIQUE_AUTHORITYØ÷ ä¬MCI_SEEK_TO_ENDê¬PNDR_CORRELATION_INFO ø ä­sbumpcã ø ä­RoundRect<ø ä­ESB_DISABLE_LTUPáLø ä ­MKSYSxø ä ­IXMLDOMNode_get_specified_Proxyâ˜ø ä­IME_SMODE_AUTOMATICê­SQL_INSENSITIVEâÈø ä®PurgeCommàø ä®SM_CXMENUSIZEáù ä®RESOURCETYPE_PRINTã(ù ä®IXMLDOMDocument_loadXML_Stubé"®IXTLRuntime_formatNumber_Stublù ä¯DT_PATH_ELLIPSISé¯SetActiveWindowâ¨ù ä°?$__num_bits@$0BP@ãÐù ä°ERROR_CLUSTER_SHUTTING_DOWNâìù ä°LPPROPSHEETPAGEAâú ä°pHelpFile<ú ä/°__IInternetProtocolSinkStackable_FWD_DEFINED__ë°MDM_PROTOCOLID_HDLCPPPã€ú ä±WM_WINDOWPOSCHANGEDâœú ä±GetKeyNameTextë'±ICreateTypeInfo_SetFuncDocString_Proxyãàú ä²predé²MCI_FORMAT_SMPTE_25âû ä ³SetCaptureã4û ä³BS_DEFPUSHBUTTONáTû ä³MCI_FORMAT_SMPTE_24ê³PP_UNIQUE_CONTAINERâˆû ä´PSIZE_Tâ¨û ä´RPC_S_SEC_PKG_ERRORâÌû ä´CONNECT_UPDATE_PROFILEãèû ä´DdeQueryStringAâü ä´RpcServerInqDefaultPrincNameWè´transformNode8ü ä µsgetcXü äµCreateDialogIndirectéµSQL_SP_COMPARISONˆü ä¶hBitmapâ°ü ä¶CRYPTPROTECT_DEFAULT_PROVIDERè¶dwServiceTypeôü ä ·AsyncIPipeByte_Finish_Pull_Stubê·SQL_CA_CREATE_ASSERTIONâ8ý ä¸PROCESSOR_HITACHI_SH4Pý ä ¸BackupReadãhý ä¸SSF_INDICATOR˜ý ä#¸CRYPT_INSTALL_OID_FUNC_BEFORE_FLAGã¸ý ä¸FSCTL_SET_COMPRESSIONè¸SQL_CREATE_ASSERTIONé¹ERROR_CTX_INVALID_MODEMNAMEâþ äºSML_PE_SYNC_ENDâDþ äºPIMAGE_RESOURCE_DATA_ENTRYã`þ äºTYPE_E_IOERRORãxþ ä ºGGO_BEZIERã”þ äºSHGFI_ATTRIBUTESéºIEnumString_Next_ProxyãÌþ ä»pIOProcâøþ ä!»USER_MARSHAL_MARSHALLING_ROUTINEé»SPLDS_ASSET_NUMBERã,ÿ ä ¼buf_sizeáDÿ ä ¼XPT_CLIENTë¼FILE_WRITE_EAtÿ ä ½sml_search_sá”ÿ ä½SUBLANG_GERMAN_SWISSá¼ÿ ä"½EVENT_E_COMPLUS_NOT_INSTALLEDÔÿ ä ½ENHANCED_KEYáüÿ ä½szOID_PKIX_KP_CODE_SIGNINGã ä½IXMLElement_get_type_Stubè½SQL_SQ_COMPARISON\ä¾SYSYNC_BUILDNUMBERãtä ¾DMBIN_MIDDLEáä¾WM_LBUTTONDOWNë ¾iBorderWidtháÈä¿PROCESSOR_HITACHI_SH3èä¿BufferConformanceMarkè¿CoMarshalHresultá$äÀERROR_GROUP_EXISTSã@äÀRevokeObjectBoundè$À__IBindStatusCallback_FWD_DEFINED__â”äÁENUM_REGISTRY_SETTINGSã¬ä ÁIPPORT_WHOISé ÁVarI1FromIntáÔä Âacoslìä ÂmtHeaderSizeé ÂPD_SELECTIONáäÃe32_fixupsize@äÃLANGUAGEGROUP_ENUMPROCãXä ÃRegSaveKeyãxäÃIMalloc_Alloc_StubëÃSQLRemoveDSNFromIniâ¸äÄEXCEPTION_BREAKPOINTáÔäÄImmGetDescriptionèÄSQL_SFKU_CASCADEáäÅSmlDevInfFilterCapListPtr_tâ,äÅFindAtomADä ÅXTYP_REQUESTádäÅRPC_BUFFER_PARTIALë ÅpUserSidáˆä Æacosh°äÆOLEOBJ_S_CANNOT_DOVERB_NOWãÌäÆPACTION_HEADERãøä ÆI_RpcBindingInqDynamicEndpointWâäÆCERT_STORE_PROV_INFOá4äÆDISPID_NEWENUMë'ÆIInternetProtocolInfo_CombineUrl_Proxyã|ä Çequal_toá˜äÇSmlSyncHdrPtr_tâÄä ÇVER_NUM_BITS_PER_CONDITION_MASKêÇWM_POWERBROADCASTðä ÈacosfäÈERROR_REGISTRY_RECOVEREDá,ä ÈdmDeviceNameá@ä ÈAnsiNextá\äÈLPMSGBOXPARAMSWâxäÈDLGC_HASSETSELã ä"ÈICreateErrorInfo_SetGUID_StubÐä%ÈIXMLDOMNode_get_previousSibling_Stubáüä"ÈIDataFilter_SetEncodingLevel_Stubè'È__IEnumSTATPROPSTG_INTERFACE_DEFINED__ã@ä Énext_häÉFORMAT_MESSAGE_FROM_HMODULEêÉLPMCI_INFO_PARMSA äÊSHNAMEMAPPINGWã´ä ÊLPLINGERáÐäÊDSPRINT_UNPUBLISHèÊSQL_MAX_PROCEDURE_NAME_LENã äË_wcsuprâ0äËsz_CERT_STORE_PROV_MEMORY\ä ËCERT_REGISTRY_STORE_REMOTE_FLAGâpäËMediaInfoˆä ËF3_120M_512ê'ËICreateTypeInfo2_SetFuncCustData_ProxyãÔäÌNPTEXTMETRICWôäÌ_CERT_ALT_NAME_ENTRYáäÌPPRINTER_INFO_8Aé$Ì__IXMLDOMCDATASection_FWD_DEFINED__â`äÎSUBLANG_ARABIC_QATARáxäÎS_PERIODVOICE˜äÎPSFEATURE_CUSTPAPERâÀäÎI_RpcNsBindingSetEntryNameAâÜäÎCRYPT_ATTRIBUTESáøäÎHCERTSTOREPROVã äÎCryptUninstallDefaultContextáD äÎFILE_DEVICE_MASS_STORAGEá` äÎCoTaskMemReallocéÎSQL_SG_USAGE_ON_COLLATIONœ ä ÏEntryCount㸠äÏCHECKJPEGFORMATâØ äÏDMCOLOR_MONOCHROMEãô äÏotmsCapEmHeightê ÏCC_STDCALLã äÐiMaxSpeed8 ä ÐmmioAscendãX äÐLPMCI_OVLY_RECT_PARMS„ ä ÐI_RpcBindingInqDynamicEndpointAêÐIMoniker_RelativePathTo_Stubáà ä(Ñ?$basic_filebuf@DU?$char_traits@D@std@@âø ä ÑBS_MULTILINEá äÑSCARD_UNKNOWNèÑ__IOplockStorage_FWD_DEFINED__ã\ äÒGetPrivateProfileIntá| äÒWAVECAPS_PLAYBACKRATE  äÒCERT_STORE_SAVE_TO_FILEâÌ äÒCERT_VERIFY_NO_TIME_CHECK_FLAGëÒIStream_Revert_Proxyá äÓIMAGE_AUX_SYMBOLá äÓFindAtomW4 äÓLGRPID_KOREANèÓPCERT_PRIVATE_KEY_VALIDITYãt ä ÔUSE_TEXTMAPSሠäÔstrstrë&ÔIBindStatusCallback_GetBindInfo_ProxyèÕSORT_HUNGARIAN_TECHNICALáü äÖLUID_AND_ATTRIBUTESâ äÖSERVICE_ERROR_TYPEã0 äÖGetWindowP äÖmidiOutCachePatchesêÖCycleDetectionModulusŒ ä×handleErrorFunc⤠ä ×NameIsStringáÈ ä×TAPE_DRIVE_SET_PADDINGãà ä ×PEXTLOGPENë×SQL_DIAG_SQLSTATEäØMAPITEM_RECEIVEâ4äØ_ACTION_HEADERëØI_RpcNsBindingSetEntryNameWâxäÙ__nec_eabi_bareâŒä ÙMIM_OPENá°äÙURLACTION_SCRIPT_PASTEë ÙVarI2FromIntáØä ÚabortðäÚNPTEXTMETRICAäÚPAN_SERIF_NORMAL_SANS$äÚREGSAMã@äÚPPRINTER_INFO_8Wé ÚrpcFlagsápäÛPMOUSEHOOKSTRUCTé ÛMOD_SWSYNTHâ¨äÜGetSidLengthRequiredáÀäÜPOLYFILL_LASTÔäÜOemToCharðäÜSHNAMEMAPPINGAã äÜMIDL_SERVER_INFOá$ä ÜNdrStubCallê*Ü__ISynchronizeContainer_FWD_DEFINED__lä ÝSM_CYSMICONâ„ä ÝPSBTN_NEXTëÝBstrStrâ°ä ÞsmlPrintFuncáÌäÞLPMSGBOXPARAMSAê ÞdwOffsetáäßERROR_DS_CANT_RETRIEVE_DNä ßdsOffsetá4äßLPMCI_INFO_PARMSWHäßMEMCTXãhäßPSN_QUERYINITIALFOCUSè+ßICreateTypeInfo2_SetHelpStringContext_Stubã¸äàNPEXTLOGFONTAÜäàDMLERR_INVALIDPARAMETERêàLPCPROPSHEETHEADERWâ äá@177áä á__how<äá_CRYPT_ENCODE_PARAãXäáPOPENCARDNAME_WêáSTGM_NOSCRATCHã”äâSmlSourceParentPtr_tá´äâDOMAIN_USER_RID_GUESTÔäâSERVICE_BOOT_STARTë âbcBitCountãä ãGetLastErroráäãhIconSmâ0ä ãSTUB_PHASEëãSQL_CTR_CREATE_TRANSLATIONãpääwglShareListsˆä äOpenDesktopâ ä äSND_NOWAITãÄääNdrUserMarshalMarshallãìääMftWritesFlushForLogFileFulléäIME_CMODE_KATAKANAã$ä åbad_typeidë åSZM_CREATEã`äæDNS_ERROR_RCODE_BADSIGëæIUrlMon_AsyncGetClassBits_Stubã¤ä çPtrToUlongãÐä!çERROR_DS_SOURCE_DOMAIN_IN_FORESTáèäçRGB_GAMMA_MINè çSIZEICONICãäèPPROVIDER,ä èMEVT_COMMENTáHäèGET_MEDIA_TYPESêèINET_E_RESOURCE_NOT_FOUND„ä ékeybd_eventâœä éES_MULTILINEá¼äéDlgDirListComboBoxWâÜäéGetFileVersionInfoAâüäéCERT_RDN_VALUE_BLOBâäé_LPIINTERNETBINDINFOáDäéCoInternetGetProtocolFlagsë éVarI4FromIntáxäêCreateHatchBrushá”äêHSHELL_TASKMANã¼ä"êszOID_NETSCAPE_CERT_EXTENSIONìä%êICreateTypeInfo_SetVarDocString_Stubé!êIBindProtocol_CreateBinding_Stubá@äëGetSecurityDescriptorLengthâdäëERROR_INVALID_COLORINDEXá|ä ëWSAENOTCONNâ˜äëDispatchMessageWá°ä ëIDC_SIZENSãÌäëDS_SETFOREGROUNDáèäëWNFMT_MULTILINEêëShellExecuteW äìCO_E_BAD_SERVER_NAMEá<äìLPD_SHARE_ACCUMâPäìDDEDATAâläìPPRINTER_INFO_9AéìControlServiceã¨äíNORM_IGNOREKANATYPEâ¼äíPMMTIMEâÔäípvSystemStoreèíAddPrinterDriveráäîPRPC_DISPATCH_TABLEêîURLACTION_HTML_SUBMIT_FORMSâPä ïFIELD_OFFSETáhä ïTOKEN_OWNERêïERROR_TOO_MANY_POSTSá ä ðisNonUniqueâÈäðCO_E_INIT_SCM_EXEC_FAILUREãÜä ðPEMRTEXTáäð_LPIINTERNETPROTOCOL_DEFINEDéðSQL_NONSCROLLABLE8äñMCIERR_GET_CDlä'ñICreateTypeInfo_SetImplTypeFlags_Proxyë!ñICreateTypeInfo_SetVarName_Proxyá¸äòC2_COMMONSEPARATORëòLIBFLAG_FCONTROLáä#óJOB_OBJECT_SET_SECURITY_ATTRIBUTESëóPS_STYLE_MASKDäôCMSG_CMS_SIGNER_INFO_PARAMëôVAR_TIMEVALUEONLYxä õ_P_OVERLAYãŒä õfwprintfá¬äõallocator_param_typeáÈäõistream_iteratoráèäõGetTabbedTextExtentâüäõCB_DIRëõVARIANT_UserFreeá@äöPAN_BENT_ARMS_SINGLE_SERIFãXäöNPEXTLOGFONTWxäöPBT_APMQUERYSTANDBYâ˜äöLPCPROPSHEETHEADERAâÈä#öIInternetBindInfo_GetBindInfo_StubëöIME_JHOTKEY_CLOSE_OPENää ÷ExChangeáä ÷CACHE_S_LASTá8ä÷PFD_SUPPORT_OPENGLãLä÷dwDataãhä÷pszSystemStoreë÷POPENCARDNAME_Aâœä øOLE_S_STATICá´ä øSOCK_DGRAMãàä øCERT_PROT_ROOT_ONLY_LM_GPT_FLAGâ ä!ø__IOleAdviseHolder_FWD_DEFINED__á0äøBSCF_LASTDATANOTIFICATIONèøSQL_FN_TD_HOURãpäùsmlFreeDevInfCtcapListãˆä ùLowerRightã¨äùCOLOR_INACTIVEBORDERáÄäùPrimaryVolumeIDâÜäùIXMLAttributeèùVARFLAG_FBINDABLEäúEMRSETPALETTEENTRIESá<äúNdrVaryingArrayMarshallâXäúPPRINTER_INFO_9Wé úAbort|äû__fillã äûSCARD_ATTR_CURRENT_IFSDê ûSCARD_ATTR_ICC_INTERFACE_STATUSâðäüIMAGE_SYM_CLASS_STATICã äüPVALENTâ äüPFNGETPROFILEPATH8 ä üWM_DDE_DATAâT äümidiStreamPauseât äüMCIERR_CANNOT_USE_ALL˜ äüszOID_NETSCAPE_DATA_TYPEéüSCARD_ATTR_CURRENT_IFSCâä äýERROR_UNABLE_TO_UNLOAD_MEDIAâ!äýDispatchMessageAá!äýdwDestinationä+6ERROR_DS_SRC_AND_DST_OBJECT_CLASS_MISMATCHãH>ä6VK_F19ãh>ä6_CMSG_CMS_SIGNER_INFOˆ>ä6PRINTER_ERROR_WARNING¤>ä6CoGetClassObjecté 6IXMLDOMParseError_get_line_Stubâä>ä7VK_F18ãü>ä 7CTRY_ALGERIAá(?ä 7_USER_MARSHAL_ROUTINE_QUADRUPLEê7SQL_IS_INSERT_SEARCHEDãp?ä8ERROR_DS_OBJ_GUID_EXISTSé8VK_F17ã´?ä#9ERROR_DS_UNABLE_TO_SURRENDER_ROLESãÌ?ä 9PolyBezierãà?ä9VK_F16ãü?ä9dwButtonNumberë9PCMSG_STREAM_INFO,@ä:VK_F15ãT@ä:HSHELL_ACTIVATESHELLWINDOWãx@ä:RpcMgmtSetAuthorizationFn”@ä:PPRINTER_INFO_7Wá¼@ä:MDM_PROTOCOL_HDLCPPP_128K_PAPè :TraceReturnâè@ä;PlgBltãü@ä;VK_F14ãAä;PJOYCAPSW4Aä;MCI_SEQ_DIV_SMPTE_30DROPé;szOID_DSALG_CRPTáxAä"<SPAPI_E_NO_ASSOCIATED_SERVICEŒAä<VK_F13ã¨Aä<CreateDialogParam¼Aä<EM_SETSELÜAä<byte_array_from_ndrê<Hi32âBä =E_HANDLEáBä=VK_F12ë =PROTOCOLDATAáPBä>THREAD_PRIORITY_NORMALãtBä>_UNLOAD_DLL_DEBUG_INFOãˆBä>VK_F11ã Bä >MULTIKEYHELPé >OnShowWindowáÜBä?ERROR_MEDIA_NOT_AVAILABLEðBä?VK_F10ãCä?MCI_BREAK_OFF$Cä?NDRSContextValueé?CANDIDATELISTXCä@MARSHAL_S_FIRSTâlCä @VK_PAUSEá€Cä@NCBLISTEN¤Cä@RPC_X_SS_CONTEXT_MISMATCHÄCä@CERT_INFO_ISSUER_FLAGìCä@CLEANLOCALSTORAGE_UserSizeë @put_dataá(Dä"A??_Elength_error@std@@UAE@I@ZPDäALPPRINTER_NOTIFY_INFO_DATAë/A__IInternetSecurityMgrSite_INTERFACE_DEFINED__ã¤DäBRPC_IF_HANDLEàDä1BIReleaseMarshalBuffers_ReleaseMarshalBuffer_Stubé"BIPropertySetStorage_Open_Stub Eä CsmlMoveCmdãPSINJECT_ENDSETUP°Âä>EMRCREATEBRUSHINDIRECTãÈÂä >MB_ICONSTOPâäÂä>SPI_GETSTICKYKEYSÃä>ALG_SID_SSL2_MASTERâ Ãä>CoBuildVersionë >_URLZONEREGâPÃä ?__msl_alphaâhÃä ?LPFNDEVCAPSâ˜Ãä#?PRINTER_NOTIFY_FIELD_STATUS_STRINGë?tagDOMNodeTypeë @e32_stackobjáàÃä ASEEK_ENDáüÃäAfloat_from_ndrã$Ää"AIAdviseSink_OnViewChange_StubPÄä"AITypeLib2_GetDocumentation2_ProxyèAnMaxCustFilterãˆÄäBOLEOBJ_E_NOVERBSáœÄäBPS_DOTã¸ÄäBLPCDLGTEMPLATEAâÌÄä BdwHotKeyé!BIXMLDocument2_createElement_StubáÅäCDCOM_CALL_CANCELEDëCITypeLib_FindName_Stubã\ÅäD?$numeric_limits@_WâtÅä DSPACEPARITYâœÅäDERROR_MEDIUM_NOT_ACCESSIBLEâ¸ÅäDDdeDisconnectListØÅäDmidiOutGetDevCapsAëDDeletePrinterDriverWá ÆäEWINAPIVâ,ÆäESPI_SETICONTITLEWRAPéEPSET_PARTITION_INFORMATIONãpÆäFPAN_WEIGHT_LIGHTá„ÆäFve_typeâœÆä FMCIERR_BASEâ°Æä FTKIND_MAXè%F__MIDL_itf_urlmon_0179_v0_0_c_ifspecáøÆä GSizeOfBlockâÇäGSetPrinterDataWêGSERVICE_DESCRIPTIONWé HIgnoreErrorêICFSTR_MIME_RICHTEXTâ|Çä JwType¤Çä"JDNS_ERROR_NAME_DOES_NOT_EXIST¼ÇäJDestroyWindowÜÇäJCDS_UPDATEREGISTRYëJGetMiscStatus$Èä#KERROR_CANNOT_DETECT_DRIVER_FAILUREã@ÈäKHRESULT_SEVERITYé Kncb_commandâ€ÈäLIMAGE_FILE_MACHINE_ALPHA64ã”ÈäLcCtlStore¸ÈäLCRYPT_SIGN_MESSAGE_PARAêLPSH_NOCONTEXTHELPèÈä MstricolláÉäMPROCESS_VM_READâ$ÉäMRPC_S_ENTRY_NOT_FOUND@ÉäMDRAGDROP_S_LASTâPÉä MlpstrhÉä MhCryptProvã”ÉäMIOCTL_STORAGE_EJECTION_CONTROLëMReleaseStgMediumáÐÉäNMUTANT_QUERY_STATEãìÉäNGetConsoleTitleWé NRegCreateKeyéOPM_QUERY_PROC4Êä PEMRCREATEPENádÊä#PPCRYPT_PRIVATE_KEY_BLOB_AND_PARAMSãŒÊäPITypeInfo_GetFuncDesc_Stubã´ÊäPIBinding_GetPriority_ProxyãÐÊäPBINDSTRING_URLãìÊäPSQL_UNICODE_CHARéPSQL_FN_TD_MONTHNAMEâ(ËäQCONTAINING_RECORD@Ëä QbmWidthBytesá`ËäQtagLOCALESIGNATUREãxËä QShowCursorã˜ËäQmidiInUnprepareHeaderÀËäQMIXERCONTROL_CT_CLASS_FADERâÜËäQSetPrinterDataAâÌäQISequentialStream_Write_ProxyèQSERVICE_DESCRIPTIONAáLÌä"RRPC_S_INVALID_ENDPOINT_FORMATlÌäRmidiOutGetDevCapsWã€ÌäRpvBaseã ÌäRDeletePrinterDriverAéRSQL_FN_TD_CURRENT_TIMESTAMPâìÌäSERROR_ACCOUNT_RESTRICTIONáÍäSihFontãÍä SLPHMIDISTRMâ4ÍäSIMPLINK_HIGHEXPER`ÍäSCryptMsgCalculateEncodedLengthãŒÍä!S__IOleObject_INTERFACE_DEFINED__éSSQL_OU_PROCEDURE_INVOCATIONâÈÍäTpaRGBsãäÍäTLPCDLGTEMPLATEWãÎäTLPMCI_SET_PARMSê TSQLROWOFFSETá0Îä U__double_maxáTÎäUERROR_INVALID_MENU_HANDLEèUIOleObject_Unadvise_StubáÎä VPMETAHEADERâ¨Îä VPF_FIREFOXë!VCMSG_CTRL_MAIL_LIST_DECRYPT_PARAáðÎäWCBTACTIVATESTRUCTèWSQL_DIAG_CREATE_ASSERTION4ÏäX?$numeric_limits@_KâHÏäXTC_CR_ANYdÏäXGetConsoleTitleAá„ÏäXtagMCI_WAVE_SET_PARMSè XcPolicyInfoâ¬ÏäYtanâÌÏäY?$numeric_limits@_JâäÏä Ynode_pointeráüÏä YDM_GETDEFIDêYpPresentedTypeã4ÐäZLPDISPLAY_DEVICEáXÐäZMCIERR_INVALID_DEVICE_IDá€ÐäZIOleObject_GetMiscStatus_Stubè'ZICreateTypeInfo2_SetParamCustData_StubãÄÐä [PWORDàÐä[DefaultBlockSizeáüÐä[CRYPT_E_ASN1_UTF8Ñä [ST_CONNECTEDá8Ñä[PCTL_VERIFY_USAGE_STATUSé [userContextâxÑä\REG_NOTIFY_CHANGE_ATTRIBUTESá Ñä\FindNextChangeNotificationãÄÑä\tagEMRCREATEBRUSHINDIRECTäÑä\EMRCREATEMONOBRUSHäÒä\TPM_RIGHTALIGNã Òä\cSubtreesConstraintê\IEnumOLEVERB_Next_StubãdÒä]?$numeric_limits@_NâxÒä]rguid2ã Òä]PERF_COUNTER_QUEUELEN_TYPEãÀÒä]PCRYPT_DIGEST_BLOBãèÒä]_CRYPT_PKCS8_EXPORT_PARAMSë]IOleObject_EnumAdvise_Stubã0Óä^STDMETHODVCALLTYPEãDÓä^rguid1ãhÓä^ERROR_SERIAL_NO_DEVICEãˆÓä^MMIOERR_CHUNKNOTFOUND˜Óä^dayê^SQL_TC_DDL_IGNOREÜÓä"_ERROR_CLUSTER_INVALID_REQUESTÔä_CERT_SYSTEM_STORE_CURRENT_USERã$Ôä__STORAGE_BUS_TYPEè_SQL_ISV_TABLE_CONSTRAINTS\Ôä `_clear87átÔä `BKMODE_LASTê `RuntimeInfoâ¤ÔäaGETTECHNOLOGY¸ÔäaWAVEHDRâØÔäaPNDR_ASYNC_MESSAGEë!aIFillLockBytes_RemoteFillAt_StubébReleaseWriteAccessãDÕäcIMAGE_REL_ARM_SECRELá\Õä cDrawTextExã|ÕäcRPCLT_PDU_FILTER_FUNCècPIDMSI_STATUS_PROOFâ´ÕädSML_PE_HEADERàÕä dLPOVERLAPPED_COMPLETION_ROUTINEãÖädEMRCREATECOLORSPACEâÖä dHCRYPTPROVëdLPENUMSTATDATAã`ÖäeERROR_CONNECTED_OTHER_PASSWORDãxÖä eCOLOR_WINDOWáÖä eXTYP_SHIFTëeSQL_ATTR_ASYNC_ENABLEÌÖäf_TIME_T_DEFINEDâäÖäfremove_boundsôÖä fNTAPI×äfGetCompressedFileSizeWã0×ä fVK_OEM_CLEARáL×äfSetConsoleTitleWéfSQL_IDENTIFIER_CASEâ€×ä g_CPPRTTIáœ×ägdifference_typeâÀ×ägSUBLANG_ARABIC_MOROCCOãÜ×ägICM_DELETEPROFILEü×ägAddPrintProcessorAãØägImmEnumRegisterWordAá4ØägSQL_DIAG_CALLègSQL_UPDATE_RECORDhØä hDBL_MANT_DIGá€Øä hCURSORSHAPEâœØähLGRPID_GEORGIANâ¸ØähHICON_UserFreeãèØä$hICreateTypeInfo_SetHelpContext_StubâÙähSQLAllocHandleã ÙähSQL_CURSOR_STATICè hSQL_BINARYã\ÙäiMSSIPOTF_E_TABLE_CHECKSUMtÙäiFONTENUMPROCW”ÙäiRPC_C_AUTHZ_DEFAULTâÄÙä%iICreateTypeLib2_DeleteTypeInfo_ProxyéiVarNegëjPI_SYNCHRONOUSãÚäkCLASS_E_NOTLICENSEDâ(ÚäkDOCINFOâHÚäk_CONSOLE_CURSOR_INFOékPPROVIDOR_INFO_2WˆÚäl_MSL_CALLINGCONV_SSE2CALL ÚälGWLP_USERDATAÄÚälCRL_DIST_POINT_NO_NAMEãìÚälIEnumUnknown_RemoteNext_ProxyèlDISPID_COLLECTãÛä mLPSTR4ÛämEMRRESIZEPALETTEáTÛämSPI_GETICONTITLEWRAPálÛämMCI_OPEN_TYPEèm_CMSG_HASHED_ENCODE_INFOá¬ÛänRemHMETAFILEPICTáÔÛänIXMLDOMNode_appendChild_StubénSQL_C_INTERVAL_SECONDÜäoERROR_DC_NOT_FOUNDã8ÜäoERROR_NO_RECOVERY_POLICYáXÜäoILLUMINANT_DAYLIGHTâ„ÜäoIDummyHICONIncluder_Dummy_StubëoVarBoolFromDispâ´ÜäpcdwLocalsØÜäpGetCompressedFileSizeAãôÜäpFACILITY_WINDOWSáÝäpDNS_ERROR_DATABASE_BASEâ4ÝäpSetConsoleTitleAáDÝäpscr7épTagâdÝäqscr6á|Ýä qMM_MCISIGNALá˜ÝäqSCARD_STATE_INUSE¸ÝäqAddPrintProcessorWëqImmEnumRegisterWordWáìÝär_tzsetäÞärLPBOOLã$ÞärSACL_SECURITY_INFORMATION@ÞärwglMakeCurrentãXÞä rDC_INBUTTONâtÞärRESOURCE_RECENTâ„Þärscr5á˜ÞärJOYINFOâ¨ÞärFreeércreateEntityReferenceôÞä sCOMADMIN_E_COMPFILE_NOREGISTRARâßäsEMR_EXTFLOODFILLá(ßä shbmpCheckedâ8ßässcr4áPßä sfdwControlësIOCTL_CHANGER_GET_PRODUCT_DATAã˜ßätSYSTEM_FIXED_FONT¬ßätLB_ERRã¼ßätscr3étJOY_CAL_READALWAYSãôßä u_SW_SQRTNEGâàäuscr2éuMCI_VD_STATUS_MEDIA_TYPEáLàäv??_7bad_typeid@std@@6B@âdàävLDBL_MANT_DIGŒàä"vCO_E_TRUSTEEDOESNTMATCHCLIENT¬àävMB_ABORTRETRYIGNOREâ¼àävscr1áÐàävpvDataãáä*vITypeInfo_RemoteGetContainingTypeLib_StubèvBINDF_GETFROMCACHE_IF_NET_FAILãLáäwSmlPcdataList_tâláäwERROR_DATABASE_FULLâ€áäwlbHatchâ áäwURLPOLICY_JAVA_HIGHê wlpstrDefExtâÔáäxPointerToRefIdãøáäxMSHCTX_DIFFERENTMACHINEââäxRegisterAsync,âäxget_nextSiblingê xget_prefixãhâäyERROR_DS_SHUTTING_DOWNã|âä yCB_MSGMAXèyCryptSignAndEncryptMessageã¸âäzfwriteãÐâä zODS_SELECTEDé,zCERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICYâ ãä {OffsetHighãHãä{RESOURCEDISPLAYTYPE_GENERICâtãä{SQL_DIAG_DYNAMIC_FUNCTION_CODEë{SQL_COLUMN_TYPE_NAMEá¬ãä |DCB_ENABLEë|tagSQL_NUMERIC_STRUCTàãä}mbrtowcâøãä }UOI_USER_SIDá ää }Groupingá,ää}DrvGetModuleHandleãLää}CMSG_SIGNED_DATA_V3âlää}CertAddCRLLinkToStoreˆää}PPROVIDOR_INFO_2A¬ää}IStream_UnlockRegion_StubØää"}ITypeInfo_RemoteGetFuncDesc_Proxyè }SQL_TIMEáåä~SCardGetCardTypeProviderNameá4åä~EMBDHLP_INPROC_SERVERè~SQL_COLUMN_UPDATABLEá|åäCREATE_UNICODE_ENVIRONMENTã”åäFONTENUMPROCA°åäDMLERR_LOW_MEMORYÀåäscr8áàåäCMSG_SIGNED_DATA_V1âæä-IXMLDOMProcessingInstruction_get_target_StubéCFSTR_MIME_X_SGI_MOVIEã`æä€SPI_ICONHORIZONTALSPACINGè€CERT_STORE_CREATE_NEW_FLAGã æä _MGR_UTIL_Hâ¼æäe32_instpreloadâØæäREG_RESOURCE_LISTüæäszOID_RSA_extCertAttrsëNdrXmitOrRepAsMarshallã4çä‚HLOCALãPçä‚otmItalicAngleãhçä ‚NF_REQUERYã|çä ‚CharNextá çä‚PropSheet_RestartWindowsé‚OleGetAutoConvertØçäƒPST_TCPIP_TELNETéƒWSA_QOS_ADMISSION_FAILURE èä„SEC_E_SECURITY_QOS_FAILED0èä „ticksPèä„MIXER_OBJECTF_HMIXERá€èä$„IPersistMoniker_SaveCompleted_Proxyê„URLACTION_SHELL_WEBVIEW_VERBá¸èä…Arg2áÈèä…PSTRáàèä …IPPROTO_GGPâéä'…CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLYë%…IXMLDOMDocument_createTextNode_ProxyáTéä†Arg1áléä†BS_PATTERN8X8„éä †TC_RA_ABLEãœéä †dwTVStandardé%†__MIDL_itf_urlmon_0178_v0_0_s_ifspecé ‡TC_VA_ABLEã êäˆSML_ERR_A_XPT_COMMUNICATIONâ0êäˆIMAGE_ARCHIVE_START_SIZEáLêäˆGetDiskFreeSpaceAdêäˆRPC_E_NO_SYNCèˆOIBDG_APARTMENTTHREADEDâ°êä‰ERROR_CONNECTION_COUNT_LIMITáÄêä‰POINTFXâäêä‰AbortSystemShutdownâëä‰NT351_INTERFACE_SIZEáëä ‰HP_HASHSIZEâ8ëä‰IDirectWriterLockLëä ‰VarRoundé ‰SQLFreeEnvã€ëäŠSKF_TWOKEYSOFFãœëäŠLOCALE_SCURRENCYáÄëäŠCMSG_CTRL_VERIFY_SIGNATUREëŠICreateTypeLib_SetVersion_Stubã ìä‹LPLOGCOLORSPACEWá ìä‹tmCharSet4ìä ‹GetPropWáLìä ‹AUX_MAPPERãdìä ‹tagARRAYDESCátìä‹CADBLè ‹SQL_ISV_REFERENTIAL_CONSTRAINTSâ¸ìäŒtagMINMAXINFOàìäŒRPC_C_IMP_LEVEL_IMPERSONATEêŒCALG_RSA_KEYX íächild_ptr,íäOBJECT_INHERIT_ACEãLíäRvaToLastByteOfCodeâ`íäFatalExit|íäPAN_CONTRAST_NONE˜íäWS_POPUPWINDOWã´íä_CMS_DH_KEY_INFOáÜíäNdrContextHandleInitializeë CommDlg_OpenSave_SetControlTextâ(îäŽ__stable_sort_copyã@îä ŽGlobalFlagsâ\îäŽWSAEADDRNOTAVAILá|îäŽSCardForgetCardTypeWéŽGCS_COMPCLAUSEã°îä MM_JOY2ZMOVEáÌîäCID_CDfsVolumeëSQL_ATTR_QUIET_MODEãïä_strncmpi(ïäSUBLANG_CHINESE_TRADITIONALâPïäCOMPRESSION_FORMAT_DEFAULTãlïäQDI_STRETCHDIBã„ïäCALG_3DES_112èpstgá´ïä‘ERROR_INVALID_HANDLEé‘SYS_MACâèïä’WS_EX_PALETTEWINDOWâðä’MCI_NOTIFY_ABORTEDã0ðä’ASYNC_STGMEDIUM_UserUnmarshalè’VarBoolFromDateâdðä“PTAPE_PREPARE|ðä“dwXCountCharsðä“CF_WAVEâ ðä“rct4á°ðä“ico4áÈðä “lpDirectoryê“SQL_CU_PROCEDURE_INVOCATIONâñä”BST_UNCHECKEDñä”rct3é”ico3á<ñä•isupperâdñä•WSA_QOS_TRAFFIC_CTRL_ERRORã€ñä•SHIFTJIS_CHARSETáñä•rct2á ñä•ico2é•CRYPT_PKCS8_IMPORT_PARAMSÜñä–value_compareðñä–SP_BAUDâòä–META_OFFSETVIEWPORTORGã$òä–rct1á4òä–ico1ápòä0–CRYPT_UNICODE_NAME_DECODE_DISABLE_IE4_UTF8_FLAGâ”òä–PFN_CRYPT_ENUM_OID_INFOâ°òä–CMSG_RC2_AUX_INFOÐòä–IID_ITypeChangeEventsìòä–GetAltMonthNamesé–SQL_BITâóä —WS_VISIBLEë)—URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETYálóä˜REG_OPTION_OPEN_LINKá„óä ˜WSAEREMOTEã¤óä˜SCardForgetCardTypeAáÐóä˜__IFillLockBytes_FWD_DEFINED__äôä%˜__IEnumFORMATETC_INTERFACE_DEFINED__é˜SQL_IS_HOUR_TO_MINUTE8ôä™GetTapeStatusLôä™CopyToë™SQL_MAX_IDENTIFIER_LENã€ôä šmergeœôäšMETA_ROUNDRECTã´ôäšlElementIndexèšpstmáÜôä ›KODAK_14_WOâôôä›BindIfRunningè›FR_ENABLEHOOK(õäœAllocationProtect@õä œRecipientIdâ`õäœSCARD_READER_TYPE_USB„õäœIID_IRpcChannelBuffer2ëœVarBstrFromCy´õä SP_APPABORTâÐõäLPLOGCOLORSPACEAáäõä GetPropAáøõälingerëIID_IRpcChannelBuffer3ã4öäžGMEM_DDESHAREPöäžGetDiskFreeSpaceWtöäžERROR_INVALID_FORM_SIZEê žLPEXTLOGPENâ¬öäŸERROR_SEEK_ON_DEVICEáÔöäŸERROR_CHILD_MUST_BE_VOLATILEáôöäŸMCI_OVLY_SAVE_PARMSâ ÷ä ŸcExtensionã(÷äŸCTL_FIND_EXISTINGH÷äŸCERT_TRUST_LIST_INFOáh÷äŸSCARD_CLASS_SECURITYé(ŸIBindStatusCallback_OnLowResource_Proxyâ°÷ä BI_JPEGâÌ÷ä tmAveCharWidthãì÷ä WGL_SWAP_UNDERLAY7ãøä SIZE_MINIMIZEDã øä  fNullHGlobalá<øä VT_USERDEFINEDãLøä Drawé  SQLParamDataá€øä¡ERROR_INVALID_ACL øä¡WGL_SWAP_UNDERLAY6ë¡IViewObject_Unfreeze_Proxyãèøä¢_MSL_STDARG_WIN32_Hãùä¢ERROR_NO_DATA ùä¢WGL_SWAP_UNDERLAY5ë¢EXPORTãDùä £fminlTùä£LCIDádùä£lcidáùä&£FRS_ERR_INVALID_SERVICE_PARAMETER°ùä£WGL_SWAP_UNDERLAY4ãÄùä £HC_NOREMé'£__IAsyncRpcChannelBuffer_FWD_DEFINED__ãúä ¤Flinkúä¤Numberã4úä ¤dmLogPixelsâTúä¤WGL_SWAP_UNDERLAY3ãhúä¤HCBT_QSâ|úä¤cStepsã¤úä¤CRYPT_OID_FIND_OID_INFO_FUNCé¤lpadescâÐúä ¥__dup_coreãðúä¥WGL_SWAP_UNDERLAY2ãûä¥CAL_GREGORIAN,ûä¥WNetCancelConnection2WãXûä¥CERT_STORE_PROV_READ_CERT_FUNCãxûä¥CertEnumPhysicalStoreœûä¥__IContinue_FWD_DEFINED__Ðûä(¥ICreateTypeInfo2_SetParamCustData_Proxyê"¥ITypeInfo_GetIDsOfNames_Proxyüä¦IMAGE_REL_ALPHA_REFLONGâ<üä¦WGL_SWAP_UNDERLAY1ãXüä¦ReadConsoleInputátüä¦CMSG_RC4_AUX_INFO˜üä¦PFN_CMSG_IMPORT_KEY_AGREEÄüä¦JOB_NOTIFY_FIELD_STATUS_STRINGãàüä¦VarBstrFromDecë¦nFileExtensionã ýä§ERROR_DS_GCVERIFY_ERRORâ<ýä§SC_MONITORPOWERâdýä§szOID_PKCS_9_MESSAGE_DIGESTâ€ýä§CFS_CANDIDATEPOSé§SQL_API_SQLGETDESCFIELDâÀýä¨CLIENTSITE_S_LASTØýä ¨BS_VCENTERãôýä¨MCI_OPEN_PARMSAâþä¨MCI_VD_STEP_PARMS,þä¨_SESSION_BUFFERê¨SQL_FETCH_PRIORâXþä ©fminfxþä©IMAGE_SYM_CLASS_BLOCK”þä©TransmitCommChará´þä©EnumWindowStationsë©SCardForgetReaderWãìþä ªfind_last_ofáÿäªERROR_CLASS_DOES_NOT_EXISTã,ÿä ªWSAESHUTDOWNáPÿäªMK_E_ENUMERATION_FAILEDâhÿäªSM_CYMINTRACK|ÿäªtv_usecâ˜ÿäªCertAlgIdToOIDãÀÿäªIOCTL_STORAGE_MEDIA_REMOVALâäÿäªOLEGETMONIKER_TEMPFORUSERèªOleSetAutoConvertä «wctype_tá(ä«hThreadâ<ä «IE_NOPENádä«PTOP_LEVEL_EXCEPTION_FILTERâ|ä «R2_MERGEPENâä«IDC_IBEAM¨ä «NRC_GOODRETê «cadblÜä¬IMAGE_FILE_MACHINE_IA64ãä¬FILE_DEVICE_INPORT_PORTâä¬LPPORT_INFO_1Wë ¬__IDispatch_INTERFACE_DEFINED__âXä ­WCHARpä­AddressOfData˜ä­IDropTarget_DragOver_ProxyãÄä!­IXMLDOMEntity_get_systemId_Proxyáàä­LHashValOfNameää­CDM_SETCONTROLTEXTë­STYLEBUFW4ä®WGL_SWAP_UNDERLAY9ãHä®LBS_NOSELlä®CERT_ALT_NAME_IP_ADDRESSé!®IXMLDOMAttribute_put_value_Proxyá¸ä¯ES_SYSTEM_REQUIREDãÐä ¯e32_itermapâðä¯DMPAPER_B5_TRANSVERSEä¯WGL_SWAP_UNDERLAY8ã4ä¯ENABLE_PROCESSED_OUTPUTâLä ¯STK_DATA_D3ê¯__IPersistFile_FWD_DEFINED__á¤ä#°DOMAIN_GROUP_RID_ENTERPRISE_ADMINSã¸ä°AceTypeâàä°_TAPE_GET_MEDIA_PARAMETERSã ä °SPAPI_E_BAD_SERVICE_INSTALLSECTâ$ä °DC_HASDEFIDê°SQL_CVT_LONGVARBINARY\ä±DV_E_DVASPECTè±szOID_OIWDIR_HASHŒä²strcmpiâ ä ²difftimeáÀä²IP_MAX_MEMBERSHIPSãÔä²pFieldsâøä²IEnumUnknown_Next_Proxyê²SQL_C_BIT$ä³EM_GETMARGINSHä³WNetCancelConnection2Aãhä³RpcNsProfileEltAddë$³IXMLDOMParseError_get_srcText_Proxyâ¬ä´LogonUserÌä´EVENT_E_INTERNALERRORèä´cPolicyQualifieré.´AsyncIAdviseSink_Begin_RemoteOnClose_Stub@äµEXIT_PROCESS_DEBUG_EVENTéµpcuráhä ¶LPSYSTEMTIMEáä¶CMSG_SIGNER_UNAUTH_ATTR_PARAMè%¶__XMLDOMDocumentEvents_FWD_DEFINED__áàä·MAXIMUM_WAIT_OBJECTSáôä·FS_THAIâä ·CharUpperè ·free_ncbsè ¸PLONG@ä ¹P_DETACHáTä ¹CHAR_MINálä ¹LANG_SWEDISHá„ä ¹name_countë¹POPENCARDNAMEA_EXÈäº_TAPE_SET_MEDIA_PARAMETERSãèäºCLASSFACTORY_S_FIRSTáäºCOMADMIN_E_SESSIONãäºbfTypeã8äºCAL_SSHORTDATEëºLPPORT_INFO_1Aã|ä»SML_ERR_XLT_INVAL_WBXML_DOCâ˜ä»POSTSCRIPT_DATAâ°ä »WaitMessageâÔä»CERT_STORE_SAVE_AS_PKCS7áüä»IDropTarget_DragLeave_Proxyê»STYLEBUFA( ä¼_MSL_OFFSETOF@ ä¼balance_eraseX ä ¼PCF_SETXCHARá| ä¼ERROR_DS_SEC_DESC_INVALID” ä¼DrawFocusRectè6¼IForegroundTransfer_AllowForegroundTransfer_Proxyè ä ½_CPPUNWINDã ä½IO_REPARSE_TAG_SISã ä½Blocksã< ä½ERROR_POINT_NOT_FOUNDP ä ½WM_CLEARé½SQL_CA2_MAX_ROWS_CATALOGᜠä¾DEFAULT_IMPERSONATION_LEVELâ´ ä ¾WSAENOBUFSãÐ ä¾MCI_OPEN_PARMSWê¾Shell_NotifyIconé¿SCardForgetReaderAëÀLPMCI_ANIM_RECT_PARMS< äÁlenâ\ äÁPMCI_SEQ_SET_PARMS〠äÁNdrConformantStructFree⤠äÁPRINTER_STATUS_WARMING_UPèÁDAdviseâØ äÂWM_QUERYENDSESSIONãø äÂLOCALE_SNATIVEDIGITSá äÂTRANSMIT_FILE_BUFFERSèÂLPFNCANUNLOADNOWáH äÃmemsetãd äÃPC_WINDPOLYGONëÃAsyncIAdviseSink2¨ ä"ÄCOMADMIN_E_CLSIDORIIDMISMATCHÈ äÄBROADCAST_QUERY_DENYáä äÄCMSG_ALL_FLAGSëÄdecâ äÅcompressed_pairâ0 äÅERROR_NO_SUCH_PACKAGET äÅMETA_CREATEPENINDIRECTãx äÅRPC_C_MQ_JOURNAL_ALWAYSâ” äÅGetDefaultPrinterèÅCLSIDFromProgIDExÈ äÆbasic_istreamð äÆERROR_DS_CANT_RETRIEVE_CHILDé%Æ__MIDL_itf_urlmon_0179_v0_0_s_ifspecá@äÇsmlFreeDevInfExtListéÇAllocateLocallyUniqueIdâ€äÈGetCommPropertiesèÈMIDI_CACHE_BESTFITãÀäÉPMCI_VD_ESCAPE_PARMSéÉtagDVTARGETDEVICEôä Ê_control87ã ä ÊScrollWindowáHä/ÊCERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGSãxä*ÊPRINTER_CHANGE_DELETE_PRINT_PROCESSORä ÊSendOnRenameéÊIOleObject_GetClientSite_StubèËIPropertyBag_Read_StubãøäÌDuplicateTokenExáäÌERROR_SPECIAL_ACCOUNT4äÌLPPORT_INFO_2WëÌVarR8FromDisppäÍ?$__two_complement@G$0A@á„ä ÍN_BTSHFTá˜ä ÍMF_APPENDèÍ__IXMLDOMElement_FWD_DEFINED__ãÜä Îfpclassifyãôä ÎDecryptFileâäÎWM_MDIICONARRANGE$ä ÎNotAfteréÎSQL_DB_RETURN_TO_POOLläÏERROR_FLOPPY_BAD_REGISTERSëÏImmSetCompositionFont¨äÐ_SIZE_T_DEFINEDâØä%ÐJOBOBJECT_EXTENDED_LIMIT_INFORMATIONáä Ð__IClassActivator_FWD_DEFINED__â äÐDiscardUndoStateéÐVarCyFromUintèÑDNS_ERROR_DATAFILE_PARSINGã„äÒSEM_FAILCRITICALERRORSã äÒDATEFMT_ENUMPROCá´äÒIOC_OUTêÒPCHANGER_MOVE_MEDIUMáðäÓCreateDirectoryExäÓGetSystemPaletteUseâ,äÓwaveOutGetNumDevsDä ÓdwSignerTypeápä"ÓISoftDistExt_ProcessSoftDist_Stubè ÓPD_COLLATEã°äÔIMAGE_FILE_NET_RUN_FROM_SWAPáÌäÔdwCurrentTxQueueáää ÔbLetterformãäÔSM_CXFULLSCREENâäÔMKF_AVAILABLEè-Ô__IXMLDOMEntityReference_INTERFACE_DEFINED__ádäÕsubstrãˆäÕACCESS_MAX_MS_V3_ACE_TYPE¤äÕLPCBT_CREATEWNDâ¸äÕrgbAtrëÕSCARD_SHARE_EXCLUSIVEôäÖDECLSPEC_NORETURN äÖ_TOKEN_GROUPS0äÖFILE_ATTRIBUTE_DIRECTORYáDäÖCLSCTXãhäÖURLPOLICY_JAVA_PROHIBITâ€äÖSHAREVISTRINGèÖGL_ID_NODICTIONARYãÄä×THREAD_BASE_PRIORITY_MINáää×ERROR_TOO_MANY_SIDSê×DDEML_MSG_HOOK_DATAâä ØpaYCountá4äØESB_DISABLE_LEFTáLäØhNameMappingstäØCRYPT_RDN_ATTR_OID_GROUP_IDâŒä ØCryptMemFreeéØSafeArrayGetUBoundãÄä ÙSWP_NOREDRAWáìäÙSCardSetReaderCapabilitiesë*ÙIInternetProtocolRoot_Terminate_Proxy<äÚCertEnumCRLsInStoreâTä ÚDISK_LOGGINGátäÚSCARD_STATE_CHANGEDâ”äÚPROPSHEETPAGE_V1_SIZE°äÚLPPORT_INFO_2AãÔäÚIPipeDouble_Pull_Proxyãìä ÚdwPageStartêÚSQL_BATCH_ROW_COUNTâ(äÛ_MSL_WCSTOUL_HãDäÛ__extended_minã\ä ÛOBJ_METAFILEápäÛPXFORMãˆä ÛMCI_SEQ_NONEá°äÛCryptGetOIDFunctionAddressãØäÛIEnumOLEVERB_RemoteNext_ProxyèÛIID_IDispatchäÜ_strsetâäÜINT_PTRâ0ä ÜNRC_CANOCCRâPäÜMS_DEF_DSS_DH_PROVëÜSQL_TRANSACTION_READ_COMMITTEDãäÝ__writing ä Ýcolor´äÝWRITE_DACØäÝACCESS_MAX_MS_V2_ACE_TYPEôäÝWN_DEVICE_ERRORâäÝIOCTL_DISK_BASEêÝSCARD_STATE_EXCLUSIVEDä ÞDRV_FREEá\ä ÞAF_FIREFOXëÞ_CERT_REVOCATION_INFOœäßERROR_DS_INVALID_DMDáÈä&ßCOMADMIN_E_CAN_NOT_EXPORT_SYS_APPìäßotmsUnderscorePositionëßIOleObject_EnumAdvise_Proxyê à__slab_sizeâHäáPROV_EC_ECNRA_SIGdäáSCardForgetReaderè áCF_LIMITSIZEá˜äâMETA_PAINTREGIONá¼äâSPI_GETMINIMIZEDMETRICSâÐä âcbmxctrlé"âIOleObject_SetClientSite_Stub äãgetcwdãä ãroundDäãTAPE_DRIVE_LOCK_UNLK_IMMEDã„ä3ãCRYPT_UNICODE_NAME_ENCODE_ENABLE_UTF8_UNICODE_FLAGëãFMTID_SummaryInformationá¸ä ä_execÐä änew_handlerâää äis_unioná ääCO_E_THREADINGMODEL_CHANGEDâ,ääCreateCompatibleDCãDä äALG_SID_IDEAátä#äSPLDS_PRINT_ORIENTATIONS_SUPPORTEDë%äIRunnableObject_RemoteIsRunning_StubáÐä!åX509_KEYGEN_REQUEST_TO_BE_SIGNEDáðäåIMoniker_Hash_Proxyâä åinsertDataë åMDMVOL_HIGHâPä#æIMAGE_DIRECTORY_ENTRY_DELAY_IMPORTãdäæGetDCExâ|äæSetWindowText¬ä$æCRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOBâÔä"æMft2WritesFlushForLogFileFullä)æAsyncIAdviseSink_Begin_RemoteOnSave_Stubá4ä æITypeInfo_GetDocumentation_Stubê æGGL_STRINGãtäç_IMAGE_COFF_SYMBOLS_HEADERã˜äçSPI_SETMENUDROPALIGNMENTá´äçwaveInGetDevCapsWèçImmGetCompositionFontôäèILLUMINANT_TUNGSTENâ äèRT_RCDATA ä èEnumPropsExAá8 ä èMM_DRVM_DATAéèSQL_ODBC_SQL_OPT_IEFá| äéIMAGE_REL_ALPHA_LITUSEëéResetDC⸠ä"êDISPLAY_DEVICE_VGA_COMPATIBLEØ äêPMCI_WAVE_SET_PARMSâø äêCertEnumCTLsInStoreâ!ä êDensityCodeêêBINDINFOFä$PFD_DEPTH_DONTCAREã$>ä$MCI_STATUS_MODEâL>ä$CRYPT_ATTRIBUTE_TYPE_VALUEãl>ä$szOID_TELEX_NUMBERã”>ä$CERT_PROT_ROOT_FLAGS_REGPATHé($__IDataAdviseHolder_INTERFACE_DEFINED__âð>ä%ERROR_DS_CANT_DELETE_DSA_OBJé%CMSG_ENVELOPED_FLAGâ$?ä &S_LEGATOá@?ä&RealizePaletteë&MM_SNDBLST_MIDIIN|?ä'ERROR_NO_SUCH_USERã˜?ä'GetWindowLongPtrAè.'AsyncIUnknown_Finish_QueryInterface_Proxyà?ä(__cmath__@ä(ChangeDisplaySettingsAã$@ä(WNNC_NET_SUN_PC_NFSê((__IInternetProtocol_INTERFACE_DEFINED__â„@ä )ERROR_DS_INAPPROPRIATE_MATCHINGâœ@ä )IsCharLowerAá¸@ä)WSAAsyncSelectë.)CMSG_CONTENT_ENCRYPT_PAD_ENCODED_LEN_FLAGAä*SizeOfZeroFillã$Aä*AUXCAPS_LRVOLUMEáDAä*MIXERR_INVALCONTROLâlAä*IStorage_RenameElement_Proxyé*PENDINGTYPE_TOPLEVELá°Aä+FILE_CREATE_PIPE_INSTANCEÄAä +WB_RIGHTáÜAä+NPWAVEOUTCAPSBä+CRYPT_OID_REG_DLL_VALUE_NAMEé +cImplTypesã0Bä,PHANDLEâLBä,GetBinaryTypeWãdBä ,PEVENTMSGMSGáˆBä,CertGetEnhancedKeyUsageâ¤Bä,FindCertsByIssuerè,get_statusTextãÔBä-_inlineâôBä-CERT_DH_PARAMETERSë-FSCTL_QUERY_RETRIEVAL_POINTERSã4Cä.spawnleâXCä.SCARD_READER_TYPE_VENDORáxCä._PRINTER_DEFAULTSAã”Cä.GetPrinterDataExé.IID_IBindProtocolÐCä/SML_ERR_XLT_BUF_ERRâèCä /nFileSizeLowáDä/GetQueueStatusãDä /tagCLIPDATAê /@7798LDä0OSS_OPEN_TYPE_ERRORê0FW_THINâ€Dä1MK_E_INVALIDEXTENSION˜Dä 1hWndActiveã¬Dä 1ICON_BIGáÈDä1GetWindowLongPtrWàDä 1BinsRangesãøDä 1DOMNodeTypeê1SC_ACTION_RESTART(Eä 2putwchará@Eä 2STOPBITS_15âhEä2OSS_TRACE_FILE_ALREADY_OPENâ€Eä2LPEVENTMSGMSG˜Eä2GetInputState°Eä2CTRY_COLOMBIAÔEä2_CTL_VERIFY_USAGE_PARAãìEä 2ChangerSlotâ$Fä+2ITimeAndNoticeControl_SuppressChanges_Stubë 2VarI2FromI1âTFä 3ShiftCountãtFä3dwStreamAttributesãŒFä 3EN_HSCROLLë3SetUpdateOptionsáÄFä4is_pointer_impãØFä4TA_BOTTOMìFä4caFlagsê4IXMLDOMParseError$Gä5PROCESS_TERMINATE@Gä5PPATHNAME_BUFFERé5PropSheet_IsDialogMessageˆGä6RPC_E_CANTCALLOUT_AGAINâ¨Gä6CryptDecryptMessageâÌGä6CERT_QUERY_CONTENT_CERTê6LPOLESTREAMVTBLãHä 7STOPBITS_10âHä7CreateDirectoryWá8Hä7LPCBT_CREATEWNDAá`Hä7ReadConsoleOutputAttributeãxHä 7VarI2FromI4ê7ODBC_ERROR_INVALID_STRã°Hä 8nCmdShowáÈHä 8PJOB_INFO_1ê8_PRINTER_DEFAULTSWãIä9SPI_SETLANGTOGGLEIä 9PHCRYPTASYNCáChangeDisplaySettingsWã4Mä>CDERR_LOADSTRFAILUREáPMä>WM_DDE_REQUESTãpMä>MCI_VD_MEDIA_OTHERãMä>CERT_PUBLIC_KEY_INFOá¤Mä >Histogramè>SCardSetCardTypeProviderNameáàMä ?wcsnicmpâNä?IMAGE_SYM_TYPE_SHORTáNä ?IsCharLowerWé?SC_SIZEâXNä!@ERROR_DS_SECURITY_CHECKING_ERRORé @PDOC_INFO_1âNäARPC_S_INVALID_NAF_IDá¬NäAOLE_E_INVALIDRECTÐNäATRUST_E_CERT_SIGNATUREãôNäAPPIXELFORMATDESCRIPTORãOäACERT_SYSTEM_STORE_USERSêA??_7IROTData@@6B@TOäBtagTTPOLYGONHEADERãtOäBwaveOutGetDevCapsWã”OäBMCI_VD_SEEK_REVERSEâ¸OäBNdrFixedArrayMemorySizeâÐOä BPDOC_INFO_3âäOä BFUNCDESCéBDIALOPTION_BILLINGãPä C__double_mináInterlockedIncrementé>ioRequestËä?ERROR_INTERNAL_DB_CORRUPTIONá,Ëä?IsWindowUnicodeâLËä?RpcNsProfileEltAddWê?SCardListCardsWâ„Ëä@BITMAPCOREINFOë!@IWinInetHttpInfo_QueryInfo_ProxyáÈËäAtagDROPSTRUCTäËäACompareStringAãÌäA??_7AsyncIAdviseSink@@6B@ Ìä AtagTYPEDESCêAIXMLHttpRequest_open_StubpÌäBIS_TEXT_UNICODE_NOT_ASCII_MASKëBdwGroupId¤ÌäC__WReadProcActionsã¸Ìä CiteratoráàÌäCREAD_COMPRESSION_INFO_VALIDâÍä'C__AsyncIAdviseSink_INTERFACE_DEFINED__ëCSQL_CA1_BULK_ADDáHÍä DRPC_VERSIONâhÍäDCryptSetAsyncParamë DSQL_OJ_INNERá¨ÍäESUBLANG_SPANISH_COSTA_RICAãÈÍäEIMAGE_SYM_TYPE_UNIONé EDispCallFuncáüÍäFSmlSequencePtr_tá ÎäFSCARD_E_UNKNOWN_RES_MNGâ@ÎäFITypeComp_Bind_StubâpÎä%F__MIDL_itf_urlmon_0171_v0_0_c_ifspecá Îä%F__MIDL_itf_urlmon_0173_v0_0_s_ifspecé"FSQL_INTERVAL_MINUTE_TO_SECONDðÎäGszOID_INFOSEC_mosaicKMandSigéGGetRunningObjectTable,ÏäHCREATE_SUSPENDEDáHÏäHERROR_BAD_DRIVERá\Ïä HCopyRectápÏä HdwDrivesáŒÏäHCdRomClassGuidã¤Ïä HLPPARAMDESCê%HSQL_DL_SQL92_INTERVAL_HOUR_TO_SECONDáðÏäIconst_referenceâ ÐäIUnwindInfoAddress$Ðä ICTRY_FINLANDáLÐä"IMIXERCONTROL_CONTROLTYPE_BASShÐäI_GET_MEDIA_TYPESéIIME_CMODE_CHINESE¸Ðä.JERROR_DS_MISSING_INFRASTRUCTURE_CONTAINERÐÐä JDeleteObjectáìÐäJMMIO_INSTALLPROCá ÑäJPMCI_ANIM_PLAY_PARMSéJVarBstrFromDateâ8ÑäKDplâXÑäKERROR_BAD_DEV_TYPEãtÑäKUpdateICMRegKeyWáŒÑäKtagRemHBITMAPè KURLMON_OPTION_USERAGENT_REFRESHâØÑäLTHREAD_SET_CONTEXTäÒäLMCI_WAVE_STATUS_BLOCKALIGNëLpPipeDesc(ÒäM_TYPEINFODÒäMsmlFreeSourceList`ÒäMEMRCLOSEFIGUREã|ÒäMEXTCONN_CALLABLEáÒäMPrepareâ¬ÒäMlpstrFileTitleë M__SQLEXTáØÒä NDMBIN_MANUALáüÒäNNdrConformantArrayFreeëN@class$7797sysytool___pchèOIMAGE_REL_CEF_ABSOLUTEã`ÓäPset_new_handlerâpÓäPDr7âŒÓäPnSamplesPerSecã¨ÓäPSetZoneMappingëPSQL_AT_DROP_COLUMNãØÓäQDr6âðÓäQPOINTTOPOINTSèQZAFLAGS_CUSTOM_EDITâ8ÔäR_TAPE_SET_DRIVE_PARAMETERSãPÔä RS_WHITE1024âxÔä"RERROR_SERVICE_REQUEST_TIMEOUT¤Ôä!R??_7IOleInPlaceActiveObject@@6B@éRSQL_ISV_CHECK_CONSTRAINTSäÔäS_SW_ZERODIVIDEãÕäSERROR_UNKNOWN_PROPERTYã Õä SWindowFromDCáDÕäSCMSG_CMS_RECIPIENT_INFOâdÕäSSCARD_SCOPE_SYSTEMë)SISynchronizeContainer_WaitMultiple_Proxyá¬ÕäTaccessã¼ÕäTDr3âàÕäTSetProcessPriorityBoostâÖäTRPC_X_SS_IN_NULL_CONTEXTáÖä TES_READONLYâ4Öä TWNNC_NET_CSCáHÖäTdwZposëTRemSNBãlÖäUDr2âˆÖäUSE_DACL_PROTECTED¬ÖäUPTOKEN_INFORMATION_CLASSáÐÖäURPC_E_FULLSIC_REQUIREDãìÖäUEMRSELECTCLIPPATH×äUGetLocaleInfo(×äURPC_S_ASYNC_CALL_PENDINGáT×ä!UIDataAdviseHolder_Unadvise_Proxyál×äUput_nodeValueèUSQL_SFKD_NO_ACTIONãœ×äVDr1âÀ×äV@class$7656sysytool___pchà×äVERROR_LUIDS_EXHAUSTEDèV@class$7757sysytool___pchØäWDr0â8ØäWSERVICE_WIN32_OWN_PROCESSTØäWCompareStringWãtØäWSCARD_STATE_UNKNOWNâŒØä WVarI2FromR4êWSC_ACTIONÈØäX_TAPE_GET_DRIVE_PARAMETERSãàØä XR2_COPYPENãôØäXWNDPROCâÙäXSND_ALIAS_SYSTEMEXITé XcUnusedBitsâHÙäYIMAGE_ARCHIVE_PADdÙäYETO_NUMERICSLATINèYWHDR_DONEŒÙäZPrologLen ÙäZLocalSizeÈÙäZERROR_DS_DRA_OBJ_NC_MISMATCHáØÙä ZxformðÙäZMOUSE_WHEELEDÚäZs_nameã ÚäZpszCredentialsOidè.ZIOleInPlaceActiveObject_ResizeBorder_StubhÚä [snprintfáˆÚä[TRUST_E_SYSTEM_ERRORáœÚä [tmAscentá¸Úä[MIDICAPS_STREAMâÜÚä[szOID_NT_PRINCIPAL_NAMEâÛä'[IBindStatusCallback_OnLowResource_Stubë [VarI2FromR8âHÛä\MCI_NOTIFY_SUPERSEDEDhÛä\PSH_WIZARDHASFINISHê\GetVarIndexOfMemIdã¤Ûä]UpdateICMRegKeyAé]MCI_OVLY_PUT_SOURCEâäÛä^SUBLANG_ITALIAN_SWISSøÛä^DCB_DIRTYÜä^META_INTERSECTCLIPRECTë^PSP_USEICONIDLÜä _UnlockFileExáxÜä_ERROR_DS_BAD_ATT_SCHEMA_SYNTAXã˜Üä_EMR_CREATEMONOBRUSHâ´Üä_ColorAdjustmentê_SQL_INTERVAL_MINUTEâðÜä`shortProtocolNameÝä`IMAGE_SCN_ALIGN_2BYTESã0Ýä`SCARD_E_NOT_READYTÝä`SPLDS_PRINT_MAX_Y_EXTENTé"`IME_THOTKEY_IME_NONIME_TOGGLEŒÝä afmaxf¬ÝäaDD_DEFSCROLLINTERVALé aMSLstring.hâÜÝä bMoveWindowë bHELPINFOáÞäcEMR_INVERTRGN$ÞäcPRF_ERASEBKGNDã@ÞäcCB_SETITEMDATAãpÞä%cIOleInPlaceSite_OnPosRectChange_StubécSQL_ATTR_READWRITE_UNKNOWNã¬Þäd_SingleâØÞä&dRPC_E_CANTCALLOUT_ININPUTSYNCCALLðÞädST_TERMINATEDßä dPMIXERLINEAâ ßädszOID_PKCS_10<ßädIOleClientSiteãhßä&dIXMLDOMNodeList_get__newEnum_Stub€ßä dget_parentëdURLOpenPullStreamAã´ßä eCLRBREAKáÔßäeERROR_JOIN_TO_JOINãèßäePEVENTMSGàäeGetKeyNameTextWâ$àäeMCI_ANIM_STATUS_HWNDéePF_DECnetPàäfLOG_ONEPX_MIN|àäfEVENTLOG_END_ALL_PAIRED_EVENTSã àäfGetCharABCWidthsFloatWãÀàäfENUM_ALL_CALENDARSãØàäfszOID_PKCS_12èfLPAUTHENTICATIONááägparent_â áä gMB_NOFOCUSã8áägMetaDataReadsXáägIID_IXMLDOMNotationêg_rlpá„áähCLIENTSITE_E_LASTœáähSM_CYMAXTRACK´áä hSO_DISCOPTãØáähSPLDS_PRINT_MAX_X_EXTENTé.hIXMLDSOControl_put_JavaDSOCompatible_Stub4âäiIMAGE_FILE_BYTES_REVERSED_LOáTâäiERROR_FILE_INVALIDãlâäiEMR_SETPIXELV„âä ipszCaptionã´âä%i__IInternetZoneManager_FWD_DEFINED__é iSetCustDataâäâä j__fill_memããäjIMAGE_DEBUG_TYPE_CLSIDã,ãäjINVALID_SET_FILE_POINTERáDãä jptPositionëjLoadIconWhãä kfmaxl„ãäkERROR_DS_IS_LEAFá ãäkListIdentifierã¼ãäk_PROPSHEETHEADERWèkDeleteMonitorèãä lszlCorneráäälmciSendStringèlDeleteImplTypeã4ää mtagEVENTMSGâLää mwMaxButtonsâpäämCertVerifyValidityNestingäämSCARD_READERSTATEAã¨ää mPSH_WIZARDãÌäämIEnumOLEVERB_Next_Proxyâåä+mIBindStatusCallback_RemoteGetBindInfo_StubëmSQL_ATTR_TRACEã4åänspawnveâXåänCRITICAL_SECTION_DEBUGãxåänMCI_SEQ_STATUS_SLAVEá”åänDriveCleanTimeoutè nGetErrorInfoá¼åäoPCCHáØåäowServicePackMajoræä#oERROR_DS_PDC_OPERATION_IN_PROGRESSëoPCTL_INFO8æäpSCS_32BIT_BINARYá\æäpERROR_INVALID_EVENTNAMEâ€æäpGetCharABCWidthsFloatAëpIID_IXMLDOMNamedNodeMapâ¸æä qvfprintfáÐæäqsmlResultsCmdðæäqUSER_CALL_CTXT_MASKê qSTGM_CONVERTá0çärTAPE_DRIVE_SET_COMPRESSIONãXçärERROR_DS_BAD_INSTANCE_TYPEãtçärSetMenuItemInfoâŒçä rPMIXERLINEWêrURLOpenPullStreamWãÀçäsllrintlâØçäsPACCESS_TOKENøçäsLPMEASUREITEMSTRUCTâèäsGetClipboardOwner0èäsGetKeyNameTextAâLèäsMMSYSERR_NOMEMã`èä sSTGM_READè sSQL_CVT_CHARé tpwszProvNameá¬èäuDECLSPEC_ALIGNãÄèä uPIPE_NOWAITâàèäuFACILITY_COMPLUSáøèäuTYMED_HGLOBALè%uIXMLDOMElement_setAttributeNode_Stubá@éävLANG_GEORGIANhéävERROR_DS_CONSTRUCTED_ATT_MODévSQL_API_ODBC3_ALL_FUNCTIONSâ¬éäwWM_SYSCOLORCHANGEè wTPM_NONOTIFYáØéäx_wcsdupâøéäxACCESS_OBJECT_GUIDãêä xDATADIR_SETêx_SC_ENUM_TYPE<êäyllrintfâ`êäyPIMAGE_DEBUG_DIRECTORYã€êäySetConsoleWindowInfoáœêäyMIDIPROPTIMEDIVâ¸êäyPOPENCARDNAMEW_EXèyStringFromGUID2âìêä zEXIT_SUCCESSáüêä zXFORM,ëä#zIBindCtx_RegisterObjectParam_ProxyëzIBindProtocolXëä{spawnvpâtëä{SE_SACL_PROTECTEDˆëä{CC_WIDEâœëä{SetDIBits¼ëä{MMSYSERR_BADERRNUMãÔëä {_userBITMAPâôëä{SCARD_READERSTATEWãìä{dwModemManufacturerSizeâ4ìä{SQL_RD_DEFAULTë{SQL_API_SQLBULKOPERATIONS„ìä!|IMAGE_SYM_CLASS_MEMBER_OF_STRUCTá´ìä$|ERROR_DS_SUBTREE_NOTIFY_NOT_NC_HEADâÈìä |LoadIconAè|tagCABSTRBLOBôìä }NOMINMAXáíä}ActiveProcessLimitã<íä"}SPAPI_E_EXPECTED_SECTION_NAMEdíä}SPAPI_E_NO_ASSOCIATED_CLASSâ€íä}LB_SETITEMDATAãœíä}MIXERR_LASTERRORá¸íä}NDR_LOCAL_ENDIANé}_PROPSHEETHEADERAèíä~memcpyãüíä ~REG_LINKáîä~WN_NO_MORE_DEVICESã8îä~CALG_TLS1_MASTERá\îä~??_7IOleCacheControl@@6B@ˆîä ~__IXMLDOMNotation_FWD_DEFINED__ê~IPropertyStorage_Stat_StubãØîäERROR_DS_ATT_SCHEMA_REQ_IDãðîä REGISTERWORDé%SQL_DESC_DATETIME_INTERVAL_PRECISIONá4ïä€RUNDLGORDTïä€RPC_S_OUT_OF_THREADSé,€__IInternetProtocolRoot_INTERFACE_DEFINED__â¨ïä_SML_METINFDTD_HáÄïäENUMRESTYPEPROCâàïäGGO_GRAY8_BITMAPáüïäCMSG_SIGNED_FLAGéDSPRINT_UPDATEã0ðä ‚DecryptFileAáLðä‚META_EXTTEXTOUTâ`ðä‚RGNDATAâ|ðä‚MCI_STATUS_STARTá˜ðä‚IME_CMODE_EUDCë‚SQL_SCOPE_TRANSACTIONÜðä„SetWindowContextHelpIdãôðä „QueryOptionê!„__MIDL_IInternetZoneManager_0001á<ñä…DFCS_BUTTONCHECKé…IRecordInfo_RecordCopy_Stubâ€ñä†RELEASE_MONTH_TXTœñä†smlFreeMapItemPtrÀñä†IMAGE_SUBSYSTEM_NATIVEãàñä†ERROR_RPL_NOT_ALLOWEDòä†RpcBindingFromStringBindingAá(òä†RpcSsGetThreadHandleá\òä(†IRpcHelper_GetDCOMProtocolVersion_ProxyâŒòä#†IWaitMultiple_AddSynchronize_Proxyã¼òä%†__MIDL_itf_urlmon_0170_v0_0_s_ifspecáìòä%†__MIDL_itf_urlmon_0172_v0_0_c_ifspecé"†RegisterServiceCtrlHandlerExA$óä ‡LPCCHHóä‡QueryPerformanceCounterâxóä%‡CertRemoveEnhancedKeyUsageIdentifierá¤óä!‡__MIDL_IInternetZoneManager_0002é‡VARCMP_GTÌóäˆ_PUBKEYâðóäˆPropSheet_SetHeaderTitleéˆIPropertyStorage_SetClass_Stubã,ôä‰isnanè ‰LCMapStringAá`ôäŠCONNDLG_RO_PATHêŠSQL_ATTR_CONNECTION_DEADáœôä ‹__float_hugeáÀôä‹CERT_E_REVOCATION_FAILUREÔôä ‹SP_ERRORé‹SQL_DRIVER_VERãõäŒptlCenter õäŒlpszActivePortãDõäŒNdrRpcSsDefaultAllocateâ\õä Œget_systemIdé ŒIXMLDOMEntity_get_publicId_Stubâ¤õäDRAGDROP_E_LASTê SONY_12_WOãÜõäŽRequestDeviceWakeupâôõä ŽBlendFlagsãöäŽCallMsgFilterAëŽIEnumFORMATETC_Skip_Proxy\öä"IMAGE_LOAD_CONFIG_DIRECTORY32|öälpszDCISectionNameëDllGetClassObject°öä SID_DEFINEDâØöäRpcBindingFromStringBindingWáôöäNumberOfElementsá ÷ä tagLOCKTYPEê"RegisterServiceCtrlHandlerExWT÷ä‘STG_E_DOCFILETOOLARGEt÷ä‘MARSHALINTERFACE_MINá ÷ä"‘ICreateTypeLib2_SetCustData_Proxyè‘SQL_ISV_TABLESãÐ÷ä ’LC_FIRSTáè÷ä ’SetEndOfFileáøä’dwCursorPositioné ’SetFillSizeâ@øä“GetSystemWindowsDirectoryè “_BIN_RESULTSápøä ”DecryptFileWáˆøä ”DestroyIconâ øä”SO_ACCEPTCONN¸øä ”STGM_CREATEê ”SQL_GD_BLOCKáèøä •EVENPARITYãùä*•IPropertyStorage_DeletePropertyNames_Stubè •SQL_CV_LOCALáXùä–@class$7655sysytool___pch|ùä–CHANGER_VOLUME_REPLACEë'–AsyncIAdviseSink_Finish_OnRename_ProxyãÐùä—LPEXCEPTION_RECORDãøùä—DNS_ERROR_WINS_INIT_FAILEDã úä—COMADMIN_E_CAN_NOT_START_APPá4úä —WMSZ_TOPáDúä —szTiphúä—dwAcquirePrivateKeyFlagsáˆúä—CHANGER_PRODUCT_DATAé—SPLDS_PRINTER_NAME_ALIASESãÐúä˜ERROR_IS_SUBST_PATHâøúä˜PAN_MIDLINE_STANDARD_POINTEDáûä˜CallMsgFilterWã4ûä˜ABM_WINDOWPOSCHANGEDá\ûä˜PCERT_POLICY_QUALIFIER_INFOâxûä˜URLTEMPLATE_LOWê˜SQL_CURSOR_ROLLBACK_BEHAVIORá¸ûä ™MetrowerksãÐûä ™OBJ_BITMAPë™GetCharWidth32ã üäšGetWindowsDirectoryâ$üä šIOleWindowã8üäšsfTypeãXüäštransformNodeToObjectèšURL_ENCODING_NONE”üä›IMAGE_REL_PPC_SECRELé›BAUD_USERÈüäœNdrMarshConfStringHdrôüäœIXMLDOMAttribute_get_name_StubëœMDM_BEARERMODE_ANALOGèMCI_BREAK@ýä žLANG_ENGLISHáXýä žNPEXTLOGPENâtýäžMAX_DEFAULTCHARêžLPWININETINFO ýäŸtype_info´ýäŸRGBQUADâÌýä ŸLCMapStringWéŸADVF_PRIMEFIRSTâ þä IMAGE_SCN_ALIGN_4BYTESã þä DDEADVISE8þä  NIM_MODIFYãLþä  VT_CARRAYè rgvargë&¡OLEMISC_IGNOREACTIVATEWHENVISIBLE¤þä ¢PARITY_ODDã¸þä¢CharPrevWÔþä¢midiStreamStopãìþä¢auxGetNumDevsáÿä ¢StubDescé ¢VT_ERRORá(ÿä£_unlinkâLÿä£DOMAIN_GROUP_RID_GUESTSâlÿä£ERROR_BAD_NET_NAMEã€ÿä£RgnDataâ˜ÿä £WM_HSCROLLã´ÿä£SBS_RIGHTALIGNë£GetConvertStgàÿä¤islessãðÿä¤Presá ä¤OpenThreadTokenâ$ä ¤DDL_SYSTEMã4ä ¤wCaps\ä¤_CERT_POLICY_QUALIFIER_INFOâ€ä¤CERT_AUTO_ENROLL_PROP_IDá´ä'¤__IWinInetHttpInfo_INTERFACE_DEFINED__ãÌä ¤QUERYOPTIONê¤SQL_DESC_FIXED_PREC_SCALEä¥?$allocator@Xè ¥IErrorInfoã<ä¦R2_MERGEPENNOTãTä¦DRAFT_QUALITYxä¦RIGHTMOST_BUTTON_PRESSEDá¨ä*¦CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNCÌä¦PFN_CERT_STORE_PROV_CLOSEää¦DESCKIND_NONEè¦ImmSetCompositionWindowâä§RGN_ANDâ4ä §SS_GRAYRECTâDä§tvpâ\ä§MftWriteBytesè§_LPSOFTDISTEXT_DEFINEDã˜ä ¨RESTORE_CTMâ¼ä¨PFD_GENERIC_ACCELERATEDâØä¨HDC_UserUnmarshaløä¨GetFuncIndexOfMemIdâä¨PMODEMDEVCAPSè¨SQL_DIAG_ROW_COUNTãXä©Begin_QueryMultipleInterfacesè©IAdviseSink_OnSave_StubâŒä ªfwide äªputcharâÈäªGetNumberOfEventLogRecordsãÜäªlopnColorôä ªdwCommandIdâäªVIF_ACCESSVIOLATIONêªCertGetNameStringAãLä«PAGE_READONLYxä«I_RpcConnectionInqSockBuffSizeë«CMSG_ENCRYPTEDã´ä¬HEAP_CREATE_ALIGN_16áÄä ¬NPABCØä¬DWLP_USERðä ¬SLE_WARNINGê¬ImmGetCompositionWindowâ<ä­SPAPI_E_DEVINFO_LIST_LOCKEDâ\ä­MA_NOACTIVATEANDEATâtä­DDL_DIRECTORYè­__RPCASYNC_H__ã´ä®BF_DIAGONAL_ENDBOTTOMLEFTìä,®IXMLDOMDocument_get_preserveWhiteSpace_Stubâ ä®SQL_API_SQLEXECUTEë®SQL_MAX_DSN_LENGTHã@ä¯bad_allocdä¯_SYS_GUID_OPERATOR_EQ_ë¯mmioStringToFOURCCã¤ä°MMSYSERR_HANDLEBUSYê°PFN_RPCNOTIFICATION_ROUTINEâèä±SM_CXMINIMIZEDã ä±CBF_FAIL_SELFCONNECTIONSá(ä±mixerGetNumDevsâDä±MCI_FORMAT_FRAMESpä!±PCERT_SYSTEM_STORE_RELOCATE_PARAé ±CertDuplicateCertificateContextê²LGRPIDë³LPPARSEDISPLAYNAMEãèä ´e32_objcntãüä´cbRegsãä´CharPrevA(ä ´EXTCONN_WEAKáDä´_STGMEDIUM_UNIONé%´IInternetProtocol_UnlockRequest_StubáœäµsmlFreeRecordFieldFilterPtrâÄäµIMAGE_DEBUG_TYPE_RESERVED10âÜä µEMRENDPATHãðä µpRecInfoé$µITypeInfo_RemoteCreateInstance_StubâD ä¶DMPAPER_LETTER_TRANSVERSEX ä¶TRIVERTEXp ä ¶HIDE_WINDOWâ ä¶DdeQueryNextServerë¶OLEMISC_INVISIBLEATRUNTIMEãØ ä·SmlDevInfNoTruncate_fø ä·PI_DOCFILECLSIDLOOKUP ä·URLOpenStream0 ä·SOFTDIST_ADSTATE_NONEè·VarBstrFromDispâp ä¸SPAPI_E_GENERAL_SYNTAXãˆ ä ¸GetMetaRgn㜠ä¸pshHelpâ¼ ä¸IMalloc_Free_Proxyë*¸IXTLRuntime_absoluteChildNumber_Proxy ä¹?$allocator@D$ ä¹OSS_NEGATIVE_UINTEGER8 ä¹BDR_INNERT ä¹SM_CYMINIMIZEDãl ä ¹SOCKET_ERRORဠä¹VARDESCê¹IOInetProtocolSinkëºSNB_UserMarshalâà ä»PSINJECT_ENDPAGECOMMENTSé»RootIndexWritesâ ä¼DMBIN_SMALLFMTã< ä¼CreateDIBPatternBrushPtâ\ ä¼CertGetNameStringW〠ä¼IEnumSTATDATA_Reset_Stubᜠä¼PARAMFLAG_FLCIDê ¼SQL_INTEGERâÔ ä½SmlDevInfXmitList_tâì ä ½CTRY_ISRAELâ ä½PCERT_BASIC_CONSTRAINTS2_INFOè½IOleLink_BindToSource_StubãT ä ¾node_allocãd ä¾dwYê¾ABORTPROC” ä¿wProcessorLevel⤠ä¿dwXâ¼ ä¿MM_DRVM_CLOSEÐ ä ¿PROV_SSLáü ä&¿CERT_QUERY_CONTENT_PKCS7_UNSIGNEDä¿OLEMISC_ALIGNABLEè¿IMN_GUIDELINEPäÀVP_TV_STANDARD_PAL_MáläÀTIMEFMT_ENUMPROCá€ä ÀRPCNSAPIáœäÀLPOCNCONNPROCAã¼äÀINET_E_NO_VALID_MEDIAèÀWriteHitLoggingâôäÁLPOSVERSIONINFOWá äÁWM_MDISETMENU<ä#ÁI_RpcBindingToStaticStringBindingWë.Á__IBindStatusCallback_INTERFACE_DEFINED__ŒäÂRemoveDirectoryAá¨äÂMIDIPROP_TEMPOãÀä ÂmidiOutOpenêÂVARCMP_EQôäÃSUBLANG_ARABIC_YEMENáäÃSTATUS_GUARD_PAGE_VIOLATIONâDäÃJobObjectBasicProcessIdListâläÃIMAGE_COMDAT_SELECT_LARGESTâ€ä ÃSC_CLOSEá äÃVP_TV_STANDARD_PAL_NáÌä!ÃCertCreateCertificateChainEngineé-Ã__IXMLDOMProcessingInstruction_FWD_DEFINED__á äÄPFD_MAIN_PLANEã4ä ÄHTOBJECTáTäÄVP_TV_STANDARD_PAL_IáxäÄLPMCI_OVLY_SAVE_PARMSWã˜äÄRPC_C_EP_MATCH_BY_OBJèÄSQLSetCursorNameAÔäÅVP_TV_STANDARD_PAL_HáôäÅWNNC_NET_OBJECT_DIREáäÅMetricsâäÅBSTRá(äÅbSw2áTäÅIDropSource_GiveFeedback_ProxyãpäÅSetVarDocStringêÅSQL_CONVERT_FUNCTIONS¤äÆEvtCharâÄäÆPSINJECT_VMRESTOREãØä ÆMF_STRINGáäÆMIXERLINE_TARGETTYPE_WAVEINâäÆbSw1á(ä ÆchildNumberâXä%Æ__MIDL_itf_urlmon_0171_v0_0_s_ifspecé%Æ__MIDL_itf_urlmon_0173_v0_0_c_ifspecá¨äÇERROR_INVALID_MEDIAâÀäÇlcsGammaGreenèäÇCMSG_RECIPIENT_INDEX_PARAMãäÇ_SCONTEXT_QUEUEâä ÇDispatchStrê%ÇITypeInfo_LocalAddressOfMember_ProxyáhäÈIPPORT_WHOSERVERáŒäÈ??_7IXMLDocument2@@6B@ëÈIME_CMODE_NATIVEáÈäÉWriteProfileSectionâàä ÉCreateFontääÉVP_TV_STANDARD_PAL_Dá,äÉCRYPT_DECODE_TO_BE_SIGNED_FLAGëÉENCRYPTION_CERTIFICATEãpäÊVP_TV_STANDARD_PAL_GáŒäÊPDERR_INITFAILURE¬äÊPCHANGER_SET_ACCESSâÀäÊSignalãðä$ÊIOleLink_SetSourceDisplayName_Proxyê ÊSetDocStringá$äËWM_IME_KEYDOWNã8äËHTRIGHTâlä)ËIXMLDOMDocument_get_documentElement_StubáŒäËIID_IXMLHttpRequestê ËV_INT¸äÌSUBLANG_SWEDISHâÐäÌLMEM_ZEROINITìäÌSW_SHOWMAXIMIZEDá äÌPERF_MULTI_COUNTERëÌCMSG_CTRL_DECRYPT_PARAãLäÍHELP_CONTEXTPOPUPhäÍMM_JOY2BUTTONUPâ”äÍCERT_STORE_CERTIFICATE_CONTEXTë ÍSQL_BIGINTãÄä ÎiBounceMSecâÜä ÎMM_MIM_ERRORáøäÎhRestrictedRootâäÎURLPOLICY_ALLOWê ÎSetErrorInfoáLäÏACL_SIZE_INFORMATIONátäÏERROR_INVALID_WINDOW_HANDLEâ”äÏVP_TV_STANDARD_PAL_Bá°äÏWN_FUNCTION_BUSYáÜä&ÏSQL_MAXIMUM_CONCURRENT_ACTIVITIESøäÏSQL_SSF_CONVERTê Ïmath_x87.hã,äÐQueryInterfaceãLäÐODBC_CONFIG_DRIVERëÐSQL_TABLE_TERMã”ä Ñ??_Eoverflow_error@std@@UAE@I@Zâ°äÑGGO_GRAY2_BITMAPáÈäÑEMR_GLSRECORDèÑPP_ENUMALGS_EXääÒCF_UNICODETEXTãä ÒHIGHCONTRASTá0ä ÒCTRY_SLOVAKâTäÒLPMCI_OVLY_SAVE_PARMSAã„ä$ÒCERT_REGISTRY_STORE_SERIALIZED_FLAGâ¨äÒSQL_API_SQLCLOSECURSORëÒSQLSetCursorNameWÔäÓ_SIDáìä ÓWIN31_CLASSâ ä.Ó__IDummyHICONIncluder_INTERFACE_DEFINED__8ä ÓAddImplTypeâhä#ÓITypeInfo2_GetDocumentation2_ProxyëÓLPBINDSTATUSCALLBACKá¨äÔ__create_if_necessaryèÔRemoveDirectoryWáÔäÕdw2âðäÕI_RpcWindowProcâä!ÕCRYPT_OID_VERIFY_REVOCATION_FUNCáPä'ÕCERT_QUERY_CONTENT_FLAG_SERIALIZED_CTLë*Õ??_7IInternetHostSecurityManager@@6B@ äÖUSER_MARSHAL_FC_LONGá¼äÖLPOCNCONNPROCWë ÖLPOFNOTIFYEXáää×dupâüä×_SW_UNDERFLOWä×LPOSVERSIONINFOAé ×_PUBKEYVER3âLäØARW_STARTRIGHTãpäØMCIERR_MUST_USE_SHAREABLEŒäØSEARCH_PRI_NO_SEQ¨äØLPPERSISTSTREAMâØä%ØIAdviseSink_RemoteOnViewChange_ProxyéØIEnumSTATSTG_Next_ProxyâäÙ__stable_partitionã@äÙERROR_MEDIA_INCOMPATIBLEá`äÙCRYPT_E_ASN1_MEMORYâtä ÙPOLYTEXTéÙIXMLElementCollection¬ä ÚMaxCharCountá¼ä Ú_BaseÔä ÚEMRPOLYDRAWê Ú__IPersistStorage_FWD_DEFINED__âäÛSYSTEM_AUDIT_ACEá<äÛLOAD_DLL_DEBUG_EVENTáPäÛcbRgnDataläÛmidiOutGetNumDevsŒäÛPSH_USEHBMWATERMARKâ¤ä ÛformatTimeë ÛBINDSTRINGãÜäÜCO_E_ACNOTINITIALIZEDè ÜLCS_sRGBá äÝCS_E_LAST ä ÝSM_CXSMICONâ8 äÝHANGUP_COMPLETEêÝIME_ESC_PRIVATE_HOTKEYã„ äÞCRYPT_E_ATTRIBUTES_MISSINGã  äÞDM_DEFAULTSOURCEáÀ äÞPPRINTER_NOTIFY_INFOéÞGetAllVarCustDataá!äßDNS_ERROR_UNSECURE_PACKET!äßMB_PRECOMPOSEDëßSQL_API_SQLCOLUMNPRIVILEGESâl!äàRPC_S_TYPE_ALREADY_REGISTEREDèàFUNCFLAG_FHIDDENáœ!äáne_revã¬!ä áISFCNÈ!äáGGO_GRAY4_BITMAPáì!äáPFD_NEED_SYSTEM_PALETTEâü!äáLunêáIStorage_CopyTo_Proxy4"ä âUNALIGNED64âH"ä âCC_CHORDál"äâGetWindowThreadProcessIdá˜"ä âMCI_ANIM_GETDEVCAPS_MAX_WINDOWSâÈ"ä*âCryptDecryptAndVerifyMessageSignatureø"ä#âIDataObject_RemoteGetDataHere_StubëâIPipeByte_Push_Stubâ8#äãMK_E_NO_NORMALIZEDëãRPC_IF_AUTOLISTENl#ä äCTL_FIND_ANYáŒ#ääDISPID_CONSTRUCTORë/äIInternetZoneManager_CreateZoneEnumerator_StubãÜ#äåwcsuprã$äåIMAGE_FILE_AGGRESIVE_WS_TRIMá$ä åVK_JUNJAá0$ä å_DRAGINFOAëåCERT_RDN_T61_STRINGâp$äæOriginalFirstThunkã”$äæNOTIFYICONDATA_V1_SIZEã°$äæPP_ENUMCONTAINERSÔ$äæCRL_REASON_UNSPECIFIEDëætagPSDWã%ä ç__must_existá%äçset_unexpectedã4%ä çOpenEventLogáL%ä çMETA_TEXTOUTád%ä çaPalEntriesâ€%äçrgguidInterfaceséçCLSID_XMLDocument´%ä èMEM_PHYSICALáÔ%äèGCP_NUMERICOVERRIDEâô%äèSPI_SETLOWPOWERACTIVE &ä èSTUB_MARSHALá,&äèCHANGER_OPEN_IEPORTâL&äèDI_MEMORYMAP_WRITEë/èISoftDistExt_AsyncInstallDistributionUnit_Stubã &ä éHCBT_MINMAXâÀ&äéWAVE_INVALIDFORMATëéMKRREDUCE_ONEèêdwExtendedStyleâ 'ä ëGCPCLASS_LATINNUMERICTERMINATORâP'ä$ëszOID_SUPPORTED_APPLICATION_CONTEXTê ëPBIN_RESULTSá€'ä ìSQLUINTEGERâ 'äìSQL_OJ_CAPABILITIESêìSQLGetCursorNameAä'äísmlFreeDevInfFilterCapListë#í__ISoftDistExt_INTERFACE_DEFINED__ã,(ä îLANG_FARSIãP(äîERROR_NO_USER_SESSION_KEYè-îIXMLDOMDocument_put_preserveWhiteSpace_Proxyá°(äïIMAGE_FILE_BYTES_REVERSED_HIáÌ(äïmidiInGetDevCapsWð(äïIEnumSTATDATA_Next_Stubâ)äïBINDF_ASYNCHRONOUSã()ä ïMDMSPKR_OFFêïSQL_SCHEMA_USAGEáh)äð__uncheck_const_iteratorá|)äðWSAEDQUOT”)ä ðLOGPIXELSYã¸)äðDISCARDCACHE_SAVEIFDIRTYáð)ä,ðIXMLDOMDocument_put_preserveWhiteSpace_Stubâ*äðtagPSDAêðSQL_TIMESTAMP4*ä ñLOGPIXELSXãP*äñDFCS_BUTTONRADIOáh*ä ñDRV_DISABLEâ€*ä ñMCI_MAKE_MSFéñVarBstrFromR4¸*äóDNS_ERROR_NO_TCPIPãÐ*ä óWSAEDISCONãà*ä ófractø*ä ó_DRAGINFOWëóSERVICE_RUNNINGâ8+äôwaveOutUnprepareHeaderãh+ä$ôMIXERLINE_COMPONENTTYPE_SRC_DIGITALâ|+äôFD_CLRã¤+äôPCRYPT_PKCS8_IMPORT_PARAMSãÌ+äôPFN_CERT_STORE_PROV_READ_CTLáì+äôPFULL_PTR_XLAT_TABLESè$ôIXMLDOMNode_put_nodeTypedValue_Stubâ,,ä õotherP,äõTHREAD_SET_THREAD_TOKENêõSQL_SUCCEEDED|,ä öHALF_PTRéöERROR_SECTOR_NOT_FOUNDãÀ,ä÷FEATURESETTING_OUTPUTè÷PublicKeyì,ä ø_MSLstringã-ä ølpszDocNameâ -äøWS_EX_CONTEXTHELP4-äøCF_TIFFêøCAL_SABBREVMONTHNAME10ã€-äù??_7bad_exception@std@@6B@ã¬-ä ùERROR_PATCH_PACKAGE_OPEN_FAILEDâÈ-äùELF_CULTURE_LATINì-äùCAL_SABBREVMONTHNAME11ëùmidiInGetDevCapsA,.äúCAL_SABBREVMONTHNAME12ãH.äúLZERROR_GLOBLOCKát.ä!úCERT_STORE_PROV_DELETE_CERT_FUNCéúSQLGetCursorNameW´.äûCAL_SABBREVMONTHNAME13ëûSQL_API_SQLALLOCCONNECTâð.ä üMB_TOPMOSTã/ä üLoadBitmapã /ä ü_INC_CDERRãP/ä$üMIXERLINE_COMPONENTTYPE_DST_DIGITALâd/äüpchNextâˆ/äüCERT_RDN_NUMERIC_STRINGâ´/äüPCRYPT_TIME_STAMP_REQUEST_INFOãÐ/äüPARTITION_XENIX_1ð/äüPSD_DISABLEPRINTERã0äüSQL_MAXIMUM_TABLES_IN_SELECTéüSQL_BIND_BY_COLUMNãT0äýEMRREALIZEPALETTE|0äýGET_CRL_DIST_POINT_ERR_INDEXá¨0äýIXMLDocument_get_fileSize_StubëýVarBstrFromR8Ø0ä þS_WHITE2048âð0ä þFOURCC_MEMã 1äþFILE_DEVICE_VDMêþIME_ESC_HANJA_MODEã<1ä ÿESRCH`1äÿERROR_USER_MAPPED_FILEãx1ä ÿlpOutStringâ”1äÿDWLP_MSGRESULTã°1äÿPARTITION_XENIX_2è ÿHUGEPØ1å lpReservedãø1åERROR_INSTALL_NOTUSED2å DT_RASCAMERAá,2åGetKerningPairsAêSPLDS_DESCRIPTIONd2äSetFileSecurityâ€2äEndDeferWindowPos˜2ä CTRY_ICELANDá°2ä _MCIERROR_ãØ2äCERT_STORE_PROV_EXTERNAL_FLAGèSQL_CT_COMMIT_PRESERVEã3ä WM_GETHOTKEYá83äCTRY_DOMINICAN_REPUBLICâT3äCONNECT_RESERVEDáp3äIID_IEnumMonikeréSTREAM_SEEK_CURâ¬3äWS_EX_LEFTSCROLLBARâÀ3äIDCLOSEâä3äPCERT_POLICY95_QUALIFIER1èQUERY_IS_SECUREâ4ä ne_cbenttabâP4ä+ERROR_CLUSTER_MAXNUM_OF_RESOURCES_EXCEEDEDãl4äPAN_MIDLINE_INDEX„4äMCI_LOAD_FILE¨4äNdrRpcSsEnableAllocateë!CHANGER_IEPORT_USER_CONTROL_OPENáð4äCreatePenIndirect5ä MIM_ERRORèSHGetDiskFreeSpaceãH5äSECURITY_NT_NON_UNIQUEãh5äOUT_PS_ONLY_PRECISã€5ä gmfBlackBoxXá 5äPFNGETPROFILEPATHWãÐ5ä%__MIDL_itf_urlmon_0174_v0_0_c_ifspecé%__MIDL_itf_urlmon_0176_v0_0_s_ifspecá6ä gmfBlackBoxYá46äGetDateFormatAãT6äPERF_DETAIL_EXPERTãl6äget_notationsèSQL_SUCCESS_WITH_INFO¤6änFileSizeHighÄ6äGetVolumeInformationAì6äRPC_S_INTERFACE_NOT_EXPORTEDá7äMETA_SELECTOBJECT7äBS_NOTIFY<7äConvertDefaultLocaleé"SCardGetCardTypeProviderNameAx7ä SM_CXMINá”7ä szOID_SEE_ALSOë IMalloc_HeapMinimize_StubÌ7ä _chdriveáè7ä tinyness_beforeâ8ä _WINDOW_BUFFER_SIZE_RECORDã,8ä MCI_ANIM_OPEN_WSáD8ä VT_ILLEGALë ODBC_ERROR_REMOVE_DSN_FAILEDá„8ä ERROR_BADKEYá 8ä STRETCH_ORSCANSâÌ8ä __IInternet_INTERFACE_DEFINED__ê tagCASCODEãü8ä GCP_JUSTIFYâ9ä lpConnRes,9ä UnrecoveredReadsé FirstCleanerSlotAddressâh9ä __unorientedáŒ9ä IMAGE_REL_MIPS_SECRELHIê SetConsoleCtrlHandlerÐ9äERROR_DS_GC_NOT_AVAILABLEì9äSM_CMOUSEBUTTONSéRpcNsProfileEltInqNextAâ,:äsmlInitInstanceêPP_SESSION_KEYSIZEãd:ä EMR_SETROP2â„:äPFNGETPROFILEPATHAã :äSEE_MASK_UNICODEáØ:ä,__IInternetProtocolSink_INTERFACE_DEFINED__ê"IME_CHOTKEY_IME_NONIME_TOGGLE;ä TileWindowsâ8;äLOCALE_IPOSSEPBYSPACET;äGetDateFormatWãt;äMM_MIXM_LINE_CHANGEâˆ;ä rgRDNAttrè+ISynchronizeContainer_AddSynchronize_Proxyãð;ä$JobObjectBasicAccountingInformationêOleCreateLinkExâ4<äSetProcessShutdownParametersáP<äCDS_FULLSCREENãl<äMCI_HMS_SECONDãŒ<äGCS_RESULTREADCLAUSEéSQL_NOSCAN_ONÈ<äGetProcessPriorityBoostâð<äERROR_DS_RIDMGR_INIT_ERRORã=ä DrawMenuBarâ$=äCAL_SMONTHNAME9ê#IInternetProtocolSink_Switch_Proxyãh=äTAPE_LOAD€=ä CC_ELLIPSESâœ=äWM_HANDHELDLASTêCAL_SMONTHNAME8âÔ=äis_extension_impá>ä=?$__pointer_plus_bit@Unode_base@?$__red_black_tree@$00@std@@á@>ä@class$7653sysytool___pchd>äWSA_QOS_POLICY_FAILUREã„>äTYPE_E_NAMECONFLICTâ >äGetKerningPairsWé MEVT_F_LONGâÔ>äSP_PARITY_CHECKâì>äPEMRPOLYGON16?äWM_IME_SETCONTEXT ?ä FD_SETSIZEãH?äCMSG_CTRL_ADD_CMS_SIGNER_INFOènFromPage€?äIS_TEXT_UNICODE_CONTROLSá¤?äEXCEPTION_FLT_UNDERFLOWâÀ?äDM_PANNINGHEIGHTáÜ?äCAL_SMONTHNAME5ã@äRpcNsProfileEltInqNextWâ@ä HP_HMAC_INFOá<@äCERT_SYSTEM_STORE_INFOã\@äIMalloc_GetSize_Proxy|@äIID_AsyncIPipeDoubleé??_7ITypeFactory@@6B@¸@äRPC_E_TOO_LATEãÔ@ätmPitchAndFamilyáð@äCAL_SMONTHNAME4â Aä#IInternetProtocol_LockRequest_StubãHAäIID_IEncodingFilterFactoryë&PSD_ENABLEPAGESETUPTEMPLATEHANDLEAäSECTION_MAP_READá¨Aä MOD_CONTROLâÄAäCAL_SMONTHNAME7êREMSECURITY_ATTRIBUTESãüAätear_down Bä PVOID$Bä LANG_PUNJABIáDBäSidTypeDeletedAccount\Bä SendMessageâpBäSetPropâŒBäCAL_SMONTHNAME6ê__ICodeInstall_FWD_DEFINED__áÈBäe32_osãìBäHEAP_GENERATE_EXCEPTIONSáCäGETSETPAPERBINSâ Cä cAccumBitsãDCäiFSTextEffectColorBitsã`CäCAL_SMONTHNAME1âˆCäRPC_S_INVALID_SECURITY_DESCâ°CäCERT_LAST_RESERVED_PROP_IDãÐCäChangeServiceConfig2éSQL_GD_ANY_COLUMNDätagENHMETAHEADERéSPI_GETSCREENSAVEACTIVEâLDäGetVolumeInformationW`DäGetPropâ|DäCAL_SMONTHNAME3â DäCMSG_CTRL_DEL_ATTR_CERTâÈDä"SCardGetCardTypeProviderNameWäDälpstrCardNamesëMDM_V120_ML_NONEá,EäIMAGE_SCN_CNT_INITIALIZED_DATAãHEäSetThreadPriority\EäSW_HIDEâxEäCAL_SMONTHNAME2êSQL_DROP_TABLEã¸Eä SECURITY_DYNAMIC_TRACKINGÜEä IMAGE_SCN_ALIGN_8BYTESãFä ERROR_DS_ADD_REPLICA_INHIBITEDã Fä BusTypeSsaë SQL_ISV_COLUMNSâPFä!mbrlenãlFä!UnregisterHotKeyá˜Fä"!CERT_CHAIN_REVOCATION_CHECK_CHAINè!IMPLTYPEFLAG_FRESTRICTEDáÔFä "__msl_printâôFä"__MSL_FIX_ITERATORS__ Gä "GetLengthSidáGä "frameEMR_CREATEPALETTEôSä>Flip1è>DosDateTimeToVariantTimeá,Tä ?fRestoreé?RSA1024BIT_KEYãdTä@fTXContinueOnXofftTä@psh7é@lst7á¬Tä"A??_Glength_error@std@@UAE@I@ZÄTäAPRIMARYLANGIDàTäAlpCreateParamsãðTäApsh6éAlst6áUä BDisableLoadâ8UäBtagMDICREATESTRUCTWâHUäBpsh5áXUäBlst5álUäBAF_UNSPEC„UäBPropertySheetèBSQL_CURSOR_SENSITIVITYã¼Uä CIteratoráÔUä C__find_endãäUäCpsh4áôUäClst4áVäCMIXER_OBJECTF_HWAVEOUTã8VäCRPC_C_STATS_PKTS_OUTéCIForegroundTransferâ|VäDPMESSAGE_RESOURCE_BLOCKâ˜VäDVFFF_ISSHAREDFILE¨VäDpsh3á¸VäDlst3éDremoveNamedItemâèVäE_spawnlpeøVä EERROR WäErclBounds WäECF_SYLKâ0WäEpsh2á@WäElst2éEIStorage_SetClass_Proxyâ€WäFOutputDebugString°Wä%FERROR_DESTROY_OBJECT_OF_OTHER_THREADáØWäFERROR_DS_GOVERNSID_MISSINGãèWäFpsh1áøWäFlst1áXäFszOID_POSTAL_CODEDXä%F__MIDL_itf_urlmon_0175_v0_0_c_ifspecé%F__MIDL_itf_urlmon_0177_v0_0_s_ifspecá˜XäGERROR_DS_GENERIC_ERRORã°Xä GRC_DEVBITSãÐXäGIRunningObjectTableâìXäGget_namespaceURIéGSQL_API_SQLPARAMOPTIONSâ,YäHdwProviderOffsetáPYäHPMCI_ANIM_UPDATE_PARMSëHFUNCFLAG_FRESTRICTEDá˜YäIERROR_DS_CROSS_NC_DN_RENAMEâ°Yä IWS_EX_LEFTãÄYäISIF_POSêIdwAvailableTVStandardZäJIMAGE_SCN_ALIGN_1024BYTES Zä JwRepeatCountéJszOID_OIWSEC_desCFBâXZä KsmlFreeAlertáxZäK_SECURITY_ATTRIBUTESáZä KBLACKONWHITEá¬ZäKNTM_PS_OPENTYPEâÄZä KSetMapModeãÜZä KEM_SETRECTNPáøZäKLB_INITSTORAGEã[äKMMSYSERR_MOREDATAèKCERT_INFO_VERSION_FLAGãL[äLPM_REMOVEd[ä LGiveFeedbacká„[äLPIDMSI_STATUS_EDITëLSQL_DROP_TRANSLATIONáÐ[äN_MSL_MALLOC_IS_ALTIVEC_ALIGNEDãô[äNOLE_E_ADVISENOTSUPPORTEDá\äNPT_MOVETO(\äNLPD_SUPPORT_OPENGLãD\äNMWMO_ALERTABLEãh\äN@class$7692sysytool___pchx\äNpsh9áˆ\äNlst9á¨\äNPERF_DELTA_COUNTERãÈ\äNPCTL_ANY_SUBJECT_INFOèNPSCARD_READERSTATE_Wâ]ä Ostrcasecmpã]äOSetClassLongPtrWá,]äOpsh8á<]äOlst8á`]äORPC_C_BIND_TO_ALL_NICSãt]ä OhCrlStoreè/OCERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOTãÄ]ä Paemrtextáä]äPVP_FLAGS_MAX_UNSCALEDô]ä PnShow^äPNdrComplexArrayFreeâ,^ä PIEnumStringêPSQL_API_SQLCANCELh^äQTAPE_LOGICAL_POSITION ^ä-QPAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUSéQEnumPrintProcessorDatatypesâä^äROBJ_COLORSPACEä_äROEM_FIXED_FONTë RVK_RCONTROLâ,_äSlog1plã@_ä SES_NUMBERèSFreezeãt_äTtagMDICREATESTRUCTAêTdwRposã¨_äUinternal_allocatorãÄ_äUCB_INITSTORAGEãà_äUmidiStreamCloseâ`äUIEnumSTATSTG_Clone_ProxyéUBINDF_RESERVED_1á8`ä V__GetACharãT`äVSTDMETHODCALLTYPEx`äV@class$7652sysytool___pch”`äVEMRSETWINDOWORGEX°`äVBINDF_RESERVED_2é$VIPropertyStorage_ReadMultiple_Proxyâü`äWCryptExportPKCS8á aäWNCTPéWBINDF_RESERVED_3á8aä XerrnoLaäXHICON__âtaä"XMCI_ANIM_GETDEVCAPS_FAST_RATE¤aä$XCMSG_KEY_AGREE_EPHEMERAL_KEY_CHOICEâÄaäXPSCARD_READERSTATE_AéXSQL_CVT_INTERVAL_YEAR_MONTHãbäYlog1pfãbäYSetClassLongPtrAáDbäYFSCTL_REQUEST_OPLOCK_LEVEL_2éYSQL_DB_DISCONNECTtbäZTAPE_LOCKbäZ_WIN32_STREAM_IDá¤bäZDeleteAce¸bäZmmioWriteÜbäZCERT_RDN_UNIVERSAL_STRINGcä"ZCERT_TRUST_IS_NOT_SIGNATURE_VALIDèZFSCTL_REQUEST_OPLOCK_LEVEL_1áPcä[GETVECTORBRUSHSIZEãhcä [EMR_MASKBLTâ„cä[EMRSETBRUSHORGEXé[IOleContainer¸cä\FORMATDLGORD31ãØcä\MMSYSERR_INVALPARAMê\g_rgSCardRawPciâ dä ]min_exponentá(dä]FORMATDLGORD30ãLdä]CERT_STORE_MANIFOLD_FLAGé ]BINDSTATUS_INSTALLINGCOMPONENTSâ”dä^GetConsoleTitleâ´dä^X509_MULTI_BYTE_UINTé^CryptRegisterOIDInfoáðdä_IMAGE_FILE_SYSTEM eä_timeBeginPeriodê_CRYPT_SEC_DESCRâLeä`LPMCI_WAVE_DELETE_PARMSâdeä`PFN_CMSG_FREEè`SERVICE_QUERY_CONFIGá¬eäaSTATUS_FLOAT_DIVIDE_BY_ZEROâÔeäaDOMAIN_GROUP_RID_CONTROLLERSâfä"aICreateTypeInfo2_SetCustData_StubèaSQL_LCK_UNLOCKã8fäbDragQueryFileWã`fäbIMallocSpy_PreGetSize_Stubã”fä'bIRpcChannelBuffer3_RegisterAsync_ProxyëbCLSID_CCDPropertyPageØfäcFILE_SYSTEM_NOT_SUPPORTâôfäcGetStartupInfoWâgäcwCmdá$gäcWNNC_NET_DOCUSPACEã8gä cCERT_RDNáTgäcpValidationParamspgäcPSH_USEPSTARTPAGEèc??_7IXMLAttribute@@6B@ã´gädERROR_LOCK_VIOLATIONáÜgädERROR_INVALID_PRINTER_STATEâügädMK_E_EXCEEDEDDEADLINE$hädCryptUnregisterOIDFunctionãLhä"dCERT_TRUST_IS_NOT_TIME_NESTEDhhädRetryRejectedCallèdSQL_CURRENT_QUALIFIER˜hä eerror´häeGENERIC_MAPPINGêeFR_ENABLETEMPLATEøhä"fRPC_S_INVALID_NETWORK_OPTIONSiäftagDRAWTEXTPARAMS0iäfPropSheet_ChangedXiäfIXMLElement_removeChild_ProxyèfSQL_DIAG_NUMBERâ¨iä)gJobObjectBasicAndIoAccountingInformationáÄiägGetClassLongPtrWáÜiä gLPPROTOENTë gBegin_OnSaveá jä hTT_PRIM_LINEá$jähSM_CXMAXTRACK> CERT_ALT_NAME_ENTRY_ERR_INDEX_SHIFT) & CERT_ALT_NAME_ENTRY_ERR_INDßEX_MASK)"2.16.840.1.101.2.1.1.21"0x8000_HRESULT_TYPEDEF_(0x80010129L)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_DATA ( MDM_X75_DATA_128K ) )"2.5.4.15"0x002_HRESULT_TYPEDEF_(0x80090018L)1781L512(ßCERT_COMPARE_MD5_HASH << CERT_COMPARE_SHIFT)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_PIAFS, MDM_PIAFS_OUTGOING )1913L60x00000010(MCIERR_BASE + 34)0x00030000438L((DWORD)0x00000100)20UL0x00000080CALINFO_ENUMPROCEXA37ß40x001010x21F0x170x01000000L_HRESULT_TYPEDEF_(0x8011042EL)((LPCSTR) 12)(MMIOERR_BASE + 8)0x000F_HRESULT_TYPEDEF_(0x00040180L)((DWORD)0x00000000)71222(TEXT("image/tiff"))0x20000x00000008132SCARD_ATTR_VALUE(ßSCARD_CLASS_IFD_PROTOCOL, 0x0209)(MIDIERR_BASE + 2)0x00000002L130x00540x00000008L( PARAMFLAG_NONE )((LPCSTR) 25)010891152670x00020x00000002(MIDIERR_BASE + 6)_HRESULT_TYPEDEF_(0x80028019L)((DWORD)0x0004)0xßffU0x00370xffffU0x00020x00000010L5071LSQL_CP_STRICT_MATCHIInternet0x0002BN_DOUBLECLICKED0x0000CharPrevA(BF_BOTTOM | BF_RIGHT)0x00000002L0x1F0xffffffffUIInternetProtocolInfo0x00040000L6(1)_MSL_THREADSAFE_ßHRESULT_TYPEDEF_(0x00041302L)9603L5056L0x00F000000x000000020x21210L0x0000000830x0003f0000x00000000L535L"1.3.14.3.2.11"0x00000200101100L((DWORD)0x00000020)220x000000082007_HRESULT_TYPEDEF_(0x800300F0L)2ß9L43COLOR_BTNHIGHLIGHT(0x00000008L)0x5RPC_X_WRONG_PIPE_ORDER0x0013GetSiteDirectoryA0x00140x080x000000040x0000001F(2<<4)8401L1020L0x00150x00000080L0x00000003L660x01175064L0x00004004L0x00000001ConfigureßPortA(WM_USER + 104)8_HRESULT_TYPEDEF_(0x80091003L)641789L0x130x11024CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)18_HRESULT_TYPEDEF_(0x80004012L)0x496550x00000004àß0x3B6(BDR_RAISEDOUTER | BDR_RAISEDINNER)V_UNION(, pcVal)0xff00000064420x00040000LCryptVerifySignatureA0x001400000x10x000000068234L((DWORD )0x00000102L)0x21"1.3.6.1.5.5.7.48.1"3CharToOemBuffA0L((LONG)0x800ß00002)0x000877_HRESULT_TYPEDEF_(0x800B0108L)FatalAppExitA40x00D00x0001(0x0020)0x00070x01000x031_HRESULT_TYPEDEF_(0x800C0200L)0x00020139L0x000000080x000000020x00040000L13(READ_CONTROL)0x01009553L_HRESUßLT_TYPEDEF_(0x80004001L)0x800000100x2005120x00000001480x0004E000L0ReadEventLogA0x616sz_CERT_STORE_PROV_SYSTEM_REGISTRY_W0x00100x00020000L(MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)0x000000020x000000000x00000002Làß_HRESULT_TYPEDEF_(0x8011042AL)ERROR_SUCCESS0x000000800x000000402_HRESULT_TYPEDEF_(0x8000400FL)1150x08060x00001000GetDiskFreeSpaceExA0x00000004(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_TLS1PRF)SQL_BIND_TYPE0xFFFFß00009670x11180x000000120x00000080midiInGetDevCapsA1058L10x04000000L0x00000001L0x000000010x00D129707L"3"_HRESULT_TYPEDEF_(0x80030105L)0x03250x0000040013690x0(0)15505046L1917LTEXT("bytesPerMinute")0ßx0000F000_HRESULT_TYPEDEF_(0x80040161L)1605L7_HRESULT_TYPEDEF_(0x800401A1L)_HRESULT_TYPEDEF_(0x8009001DL)0x00000080L50x000016050x000000250x08008315L50x000000200x0010L(0x02000000L)(-32)4_HRESULT_TYPEDEF_(0x8ß011042DL)_HRESULT_TYPEDEF_(0x8010006AL)33(3*4)0x00000007((BYTE )0x01)0x00000040CreatePropertySheetPageA"1.3.14.3.2.14"MAKEINTRESOURCE(6)(0x1)20x10000x0013-2( 0xbfffffff )0x00B90x010x0800CallNextHookEx(*,ß , , )3(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)710x00000400L4610x70000000L0x00000002(0x00000002L)__stdcallV_UNION(, pscode)"1ß.3.6.1.4.1.311.10.3.2"0x000000540x00080x00200000L9661L0x00000080_HRESULT_TYPEDEF_(0x80096019L)0x00000400SCardForgetCardTypeA0x00000009L1423L((WORD)((DWORD_PTR)() & 0xffff))_HRESULT_TYPEDEF_(0x8011044AL)0x0e4àß0x40x00025003L0xFFFF00000xF0000000LChangeDisplaySettingsA1(~LLONG_MAX)71000x000000FF1428241L0x02V_UNION(, piVal)1437L0x00110x00200000L0x00000040l0x0004910004L0x00000008((*(((UWORD*) ()) + (() >>ß 4)) & (1 << (() & 0x000F)) ) ? SQL_TRUE : SQL_FALSE )83100130x00004000L"0"CreateColorSpaceA0x00000004460UL1361LFILE_CASE_SENSITIVE_SEARCH0x00000008L1( 0x400 )}0x30x000100000x00000002L(STANDARD_RIGHTS_REßQUIRED | PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE)284L0x00000200x00050x08000000_HRESULT_TYPEDEF_(0x000401C0L)8446L0x00008000GetFileTitleA0x00EA1623L0x000000100x00081716L0x00000200L0x001061141L0x00002ß000(unsigned long)0X00000010L0x000002000x200000000x00028260L1620L1UL0x00800x60000000L7SEC_IMAGE(-1L)0x00008000VarR8FromI450x230x820000000x050x0001_HRESULT_TYPEDEF_(0x80092011L)0x00000002L_HRESULT_TYPEDEßF_(0x80100015L)0x000000140x0200((BYTE)(((WORD)()) >> 8))0x00000300L0x00140x00020x2000L0x000B0x00000000L0x04_HRESULT_TYPEDEF_(0x8009300DL)0x00FF0000((LPCSTR) 15)0x0800mciGetDeviceIDFromElementIDA65536(u_intß)(~SO_LINGER)DRV_RESERVEDTEXT("printNumberUp")5158"2.5.8"1L0x80x00C60xF0300x01SQLSetPos(,,SQL_POSITION,)199(MCIERR_BASE + 21)0x100B20x09SQL_IGNORE81MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEßN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_38DOT4K ) )0x04A00x0000001((HALF_PTR)(MAXUHALF_PTR >> 1))80x0010(WM_USER + 135)0x000008000x00100000L(-1)10x00000040L"%"0x00000020L0x000000200x1003-1CreateScalableFontResßourceA0x000000806DECLSPEC_IMPORT0x000000800x00000002L121SQL_ODBC_CURSORS0x5B186SQL_PARAM_INPUT_OUTPUT0xF4CTL_CODE(FILE_DEVICE_SERENUM,129,METHOD_BUFFERED,FILE_ANY_ACCESS)11024LRegOpenKeyExA12754_HRESULT_TYßPEDEF_(0x80110600L)V_UNION(, plVal)38431L0x0012(((()<tv_sec || ()->tv_usec)0x000000020x0000100010x000810x0004(DWORD)0x005500090x0002((WCHAR)0)"1.2.840.113549.1.9.8"4306LMM_TEXT0x0100(27)3080x000100ß00L100000x00010x80000000x01000x0c0x00000002L0x00080x00000x93FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)(MCIERR_BASE + 39)SQL_BIND_BY_COLUMN( (() << 16) | (() << 14) | (() << 2) | () )0xß20001620x01A2L"Flags"((DWORD)0x0008)(-1)V_UNION(, boolVal)(TEXT("audio/x-aiff"))0x0000000021344L748555L127L65200x0001((HRESULT) (((unsigned long)()<<31) | ((unsigned long)()<<16) | ((unsigned long)()ß)) )0x00000010L0x800000001767L1641LSECTION_ALL_ACCESS8L0x01c2VarUI2FromI428444SM_CXFRAMEExtTextOutAOpenMutexAMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MßDM_HDLCPPP_AUTH_CHAP, MDM_HDLCPPP_ML_2 ) )0x000000020x2100x00001000L_HRESULT_TYPEDEF_(0x8009300EL)0x0000020011026L__int64SM_CYFRAME20x100x43160x000000020x018E(-2L)0x00080x0280x00400x015b0x00000008L103àß30x00000010214L8476LShellExecuteA0x000200000x0008(-34)(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1F )0x00000080L688335LVarUI1FromI4_HRESULT_TYPEDEF_(0x800B0007L)0x00004000L0xF0200x0000000FL77001742L40x0ß0000002LSQL_TXN_REPEATABLE_READ2_HRESULT_TYPEDEF_(0x80010133L)CRYPT_FORMAT_RDN_SEMICOLON0x00000003_HRESULT_TYPEDEF_(0x8009001FL)1122L1203LERROR_INVALID_PARAMETER30x0800L(fpclassify() == FP_INFINITE)0x00000001ß0x00000001(4 << 13)0x000C(0x0001)0x00ff0000(MMIOERR_BASE + 11)0x0000000040x000000010x108505L} __except () {SQL_MAX_COLUMNS_IN_ORDER_BY0x11MAKEINTRESOURCE(32512)0x00000004L0x00000000L0xA(0x0000000CL)1VarUßI4FromI40x018420x281048551L((WORD)0x1000)106SCardGetProviderIdA0x00000001_HRESULT_TYPEDEF_(0x80004015L)255LCALINFO_ENUMPROCA0x022961020x02131811005L0x00070x020x36(MIDIERR_BASE + 7)0x01001918L0x00000ß0000x00001000LRegCreateKeyExA50x00030x010831888412L0x245IO_REPARSE_TAG_RESERVED_ONE0x00000001( 475 )0x80000x07(1 << CERT_STORE_CTL_CONTEXT)"2.16.840.1.101.2.1.1.18"0x10040x000000010x00004004L0x0009L4097àß1421L1233L0x000001000x002000000x113__fastcall12SetEnvironmentVariableA263216_WAIT_GRANDCHILD118((BYTE)((DWORD_PTR)() >> 8))0x0002_HRESULT_TYPEDEF_(0x8004020BL)SQL_QL_START(&g_rgSCardRawPci)36(WM_DDE_FßIRST+7)(0x000001F4L)0x0000000165534UIntToPtr()8472L8( 1 )0x00000200SM_CXDLGFRAMESQL_CHAR152L2121"2.5.4.14"3193L(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100ßNS | PERF_MULTI_COUNTER | PERF_DISPLAY_PERCENT)_HRESULT_TYPEDEF_(0x80110446L)40x000000010x00000007L0x0A0x1VkKeyScanExA(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_SANDF)1060x0003(HWND)SNDMSG(, PSM_GETTABCONTROßL, 0, 0)SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0007)0x000000000x00000020_HRESULT_TYPEDEF_(0x800B0001L)60(7 << 13)0x000000000x081500LPeekConsoleInputA0x0008520x000048461L0xFB126L(0x00000220L)0x010000000x70ß000x00000010L0x00400000L111018L8403L0x1000((DWORD)0x00000002)10_MSL_CDECL0x00001C0001408L162(SQL_BIGINT+SQL_UNSIGNED_OFFSET)0xF0000000(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_STREAM|ALG_SID_SEAL)0x00030x0d0x08000ßx00000001380_HRESULT_TYPEDEF_(0x800401C6L)( PARAMFLAG_FRETVAL )2104(MCIERR_BASE + 67)1313L0x001010051L"1.3.6.1.5.5.7.3.4"0x00040000L010110L1612057L0x040ULCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFEßRED, FILE_ANY_ACCESS)(-24)_HRESULT_TYPEDEF_(0x8009700BL)159L(0x00010000L)(WM_USER + 117)"SchemeDllRetrieveEncodedObject"0x08000x000000100x00010x000000040x00406"UrlDllGetObjectUrl""1.2.840.113549.1.7.1"0x000000ß100x00400x80x00001000L1229L10x0002(int)SNDMSG(, CDM_GETSPEC, (WPARAM), (LPARAM)(LPSTR))AF_CCITT0x0400000021034(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTERß | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)0x000000085002L0x00040000L23L((LPWSTR)-1)S_un.S_un_b.s_b4_HRESULT_TYPEDEF_(0x80040207L)(CERT_SYSTEM_STORE_LOCAL_MACHINE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)60x00000ß004L0x000000020x01740x000020001923L0x00000008L0x00001Cff30x0010(int)SNDMSG(, CDM_GETSPEC, (WPARAM), (LPARAM)(LPWSTR))2300x00040100L0x00029002L_HRESULT_TYPEDEF_(0x80040140L)0x00000002191737LSetCurrentßDirectoryA0x2000(0x5)_MSL_WCHAR_MINChangeMenuA0x000136MAKEINTRESOURCE(8)817L_abnormal_termination66((DWORD )0x00000080L)0x0020628547L0x00001000CRYPT_SIGN_ALG_OID_GROUP_ID0x00000013LWSANO_DATA0x00201140ß9949(MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1)_HRESULT_TYPEDEF_(0x8010000EL)CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)0x00010000L0x0000001510044L3010L308459L0x40x00030x0304_HRESULT_TßYPEDEF_(0x00040102L){0,0,0,0,0,1}TEXT("priority")2SHFileOperationA0x00020000(1 << VT_DECIMAL)DrawTextA30x00200000(0)0x02FF67044L4391L1MAKEINTRESOURCE(32516)1704L230x000000010x0009( 1 )0x10000001(( >>ß CERT_UNICODE_RDN_ERR_INDEX_SHIFT) & CERT_UNICODE_RDN_ERR_INDEX_MASK)(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4)100x00001A02UUID0x4944520x1000SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT0x00010000L0x007D0x00ß000040L67IsCharAlphaA0x14((() & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT))0x00000080L0x0e0x0004(WM_USER + 130)0x00000040_HRESULT_TYPEDEF_(0x8009001BL)GetSystemDirectoryA0x000900x000000020x010056(-ß1)13410x0004RegisterWindowMessageA18322L24780x0008V_UNION(, pcyVal)(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3)700x010611375L_HRESULT_TYPEDEF_(0x80020012L)0x02MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GENß_V110_PROTOCOL_DATA ( MDM_V110_SPEED_28DOT8K ) )0x00004000L(0x0010)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_56K, MDM_V120_ML_NONE ) )URLDownloadToFileA1005140x7fffffffL0xß7((LPCSTR) 42)0x00000001(MIXERCONTROL_CONTROLTYPE_FADER + 3)10MDM_SHIFT_PROTOCOLID8240L"2.16.840.1.101.2.1.1.6"22_HRESULT_TYPEDEF_(0x800C0010L){ *() = *(*(char __RPC_FAR * __RPC_FAR *)&()->Buffer)++; }0x000100ß00LOLESTR("URL Context")40x80000000SYSER_VARIANT_PRONO_ERRORSQL_WLONGVARCHAR(int)SNDMSG(, CDM_GETFOLDERPATH, (WPARAM), (LPARAM)(LPWSTR))"2.5.4.31"0x0010_HRESULT_TYPEDEF_(0x80100065L)8365L0x010x0000080000xß0000000460x80000x000000041368L0x08530x00001A030x00080x08000000L10CERT_RDN_ENABLE_T61_UNICODE_FLAG7(int)SNDMSG(, CDM_GETFOLDERPATH, (WPARAM), (LPARAM)(LPSTR))sz_CERT_STORE_PROV_SYSTEM_W0x00010x14335LCrßyptEnumProviderTypesA0x00000004L_IOW('f', 125, u_long)VerifyVersionInfoA0x000800000x20000x000000110x020x0001MS_SCARD_PROV_AWS_OVERLAPPEDWINDOW6VarUI4FromI4(STANDARD_RIGHTS_READ | JOB_ACCESS_ADMINISTER)0x0080000ß0L0x02030x00000008_HRESULT_TYPEDEF_(0x80110404L)0x0002SQLUINTEGER1(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT )0x0000000C0x00000010_ßHRESULT_TYPEDEF_(0x8010006CL)0x810x00100x00020000L0x00200000L0x0380x00001000LcharTEXT("RestartJobOnPoolEnabled")PROPSHEETPAGEA128L(SHORT)-1RegSetValueExA0x00000000L0x00000002RemoveDirectoryA(100 + SQL_CODE_ßMONTH)_HRESULT_TYPEDEF_(0x80090025L)1759L0x00010000L( & CERT_UNICODE_VALUE_ERR_INDEX_MASK)70x0800I_RpcBindingInqDynamicEndpointA0(MAKEINTATOM(0x8002))0x724000x00001000L0x0014((BYTE )0x03)0x180x00001003((DWßORD )0x80010001L)= 00x000002000x00000016(MIXERLINE_COMPONENTTYPE_DST_FIRST + 0)118377L018(TEXT("audio/x-pn-realaudio"))SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, 0x0150)0x00040LSCardListReaderGroupsA38((LPCSTR) ß26)0x000000010x00000001L(100 + SQL_CODE_HOUR)10(1U << 4)SCardListReadersA0x0000000f7WNetGetUniversalNameA973sizeof(HISTOGRAM_BUCKET)1714L(STANDARD_RIGHTS_WRITE | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TßOKEN_ADJUST_DEFAULT)SCARD_CTL_CODE( 4)0x000000080x000000020x0240x100000001_HRESULT_TYPEDEF_(0x80010109L)0x800400000x04(MIXERCONTROL_CT_CLASS_SLIDER | MIXERCONTROL_CT_UNITS_SIGNED)0x00000001SQL_QUALIFIER_NAME_SEPßARATORGetICMProfileA5069L5019L131460L30x2_HRESULT_TYPEDEF_(0x80100025L)0x001210x04780xE31390L0x00002000L0x047799((DWORD)0x0010)(WM_USER+2)0x030D41000x012170x00100000L510x0400L0x00000400L0x50TEXTß("DsDriver")0x04703510x04720x04711117L0x110x0474WS_MINIMIZE(MCIERR_BASE + 43)0x04730x0005RpcNsGroupMbrInqBeginA0x0476200x0200(-1)50x047511291252L30x0000004020xffffffff100LOCALE_ENUMPROCA10063L0x0ß008L5008L0x0000000200x000000040x008064142L(0x00000003L)CERT_STORE_PROV_PHYSICAL_W0x00000200_HRESULT_TYPEDEF_(0x80094007L)5067L0x1160x00000020L524005L650x00040140L0x00000200L0x000000010x0000001E0x00000ß0041(SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER)0x0001WNetGetResourceParentASWP_FRAMECHANGED72011785L1740L0x00200000L0x000000010x00004001L60x10x000000080x9OPENCARDNAME_EXßA3const20x00004000L8432L49852LIsEqualGUID(, )EnumPortsA0x00000400( & (15 << 9))0x0003SIZE_RESTORED0x000A23NO_ERROR1490x000080001384L0x00800000_HRESULT_TYPEDEF_(0x80004002L)0x0000000D0x110x0020ß00000x0080CreateDialogA8493L7035L0x010x000004000x20x0040MAXCHAR5(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_NOSHOW)0x0204GetStartupInfoA0x078362L(* (long double *) __extended_mßin)50x00100000LCMSG_ENVELOPED_RECIPIENT_V40x3CC(STANDARD_RIGHTS_WRITE | PRINTER_ACCESS_USE)0x000000011040x01001346L720x000002001_HRESULT_TYPEDEF_(0x80093015L)TEXT("printAttributes")0x001B10022L(((()<Internal != STATUS_PENDING)SQL_TXN_READ_UNCOMMITTEDEnumPrintersA0x0040L_HRESULT_TYPEDEF_(0x00041300L)0ßx001000003_HRESULT_TYPEDEF_(0x80040203L)100x01000x00E90x018B0x020x00x00000002(0x00000010L)0x40000x000004000x00000008L16120x00000200(0x0010)EnumPrintProcessorsA0x0001000028011L((DWORD )0x00000000L)0x0ß_HRESULT_TYPEDEF_(0x800C000CL)0xB17LZOpenFileA((BYTE)(()>> 8))0x40000x3724L4__TEXT()_HRESULT_TYPEDEF_(0x8009200FL)_HRESULT_TYPEDEF_(0x8001012BL)0((LPCSTR) 2)"CryptMsgDllImportMailList"0x001500000x00000002àß372BINDF_NOWRITECACHE8546L0x0001((void *)0xFFFFF00D)(1U << 1)0x00000004L0x400245073L0x0000000490x000000800x04CreateDialogParamW(, , , , 0L)TEXT("SeSystemtimePrivilege")0x01900x00020000(0x00000206L)ß0x00000400LTEXT("printPagesPerMinute")DialogBoxIndirectParamW(, , , , 0L)3008L0x02HIBYTE(LOWORD( () ))"Microsoft DH SChannel Cryptographic Provider"_HRESULT_TYPEDEF_(0x8010006EL)1754LSTATUS_DATATYPE_MISALIßGNMENT0x000100001236L0x00000040(* (long double *) __extended_max)135L55LL"commdlg_SetRGBColor"SCARD_CTL_CODE( 6)"2.5.4.10"(STANDARD_RIGHTS_READ | SERVER_ACCESS_ENUMERATE)9713L7056L11031LL"Microsoft DH SChannel ßCryptographic Provider"30x3C3DialogBoxIndirectParamA(, , , , 0L)_HRESULT_TYPEDEF_(0x80090016L)TEXT("shortServerName")(MCIERR_BASE + 53)CreateDialogParamA(, , , , 0L)(DWORD)0x00C000CA22"03.52"0x0002àß0x00100x04_HRESULT_TYPEDEF_(0x80110447L)2UL201159"commdlg_SetRGBColor"0x23_HRESULT_TYPEDEF_(0x80010135L)0x00000400L0x00020x00000100L((LPCSTR) 33)0x0000001D0x10x8000000050x34821SQL_DATE(-1)8004L(0x0002ß)0x20070x00000010_HRESULT_TYPEDEF_(0x80093100L)_HRESULT_TYPEDEF_(0x800401D3L)2910x001D10x000A915(1 << CERT_STORE_CERTIFICATE_CONTEXT)8(-4)0SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0302)145089L(0x00000002Lß)0x00021226LAF_IMPLINK0x08070x00000020LookupAccountNameA01140(-2)SQL_COLUMN_LABELSQLUSMALLINT0x00x000000020x00011773LTEXT("EventLog")((LPCSTR) 18)0x000F(unsigned long)0X0000000FL118"2.5.29.37"0x00020ß000L68514L1256'+'_HRESULT_TYPEDEF_(0x00041303L)_HRESULT_TYPEDEF_(0x8001010CL)4"CryptDllExportPublicKeyInfoEx"(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)((DWORD)0x0040)0x4a0x00000200628389LTHREAD_BASE_PRIßORITY_IDLE0x800x0SQL_COLUMN_OWNER_NAME1ULERROR_EXTENDED_ERROR066(CONTEXT_i386 | 0x00000010L)0x018FAF_ISO0x00000000L0x00D50x040x031((BYTE)())0x00000004L8473LQueryDosDeviceACERT_FIND_PROP_ONLY_ENHKEY_USAGßE_FLAG(() & 0xFFFF)1750LAddPrintProcessorA0x0022SNDMSG(, PSM_INSERTPAGE, (WPARAM)(), (LPARAM)())0x002B_HRESULT_TYPEDEF_(0x800F0216L)11L0x0142017LDV_E_FORMATETC1002040x00000040L100x011418L9CertGetNßameStringA0x40034329L_HRESULT_TYPEDEF_(0x800B0109L)LPIINTERNETPRIORITY"1.3.6.1.4.1.311.2.1.14"0x00000004near3(( & IMAGE_ORDINAL_FLAG32) != 0)13110170x00100x00000400CMSG_ENVELOPED_RECIPIENT_V333CTL_CODE(IOCßTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS)GMEM_NOT_BANKED0x20b0x0008144L(-26)_HRESULT_TYPEDEF_(0x8001011FL)0x8000( 0x52746457 )201TYPE_ALIGNMENT( DWORD )0x0001_HRESULT_TYPEDEF_(0x8000401AL)0x00ß000010L"8"0x0040L1709L00x01000x0003((LPCSTR) 6)231323L50x800000008500L0x00000001L0x100000x400137CoInternetParseUrl10x80000000_HRESULT_TYPEDEF_(0x80030110L)4CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BßUFFERED, FILE_READ_ACCESS)5GetEnhMetaFileA(0x40000000L)1UL0x000000013GetPrivateProfileStructASQL_COLUMN_LABEL15260x0800686118L4(MMIOERR_BASE + 1)1362L0x2000(WM_USER )6"ContextDllCreateObjectContext"0x000ß000010x040x000100000x2020U0x00000010L1079(0x0000)432CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)0x10x000C1611L0x000000031UUID_VECTOR4161"1.3.6.1.5.5.7.2.1"0x00000000L0x02(0x0ß0000002L)0x00010000((BYTE)(((WORD)()) >> 8))0xFFFF8009L0x04000000(ULONGLONG)((ULONGLONG)(DWORD)() * (DWORD)())00x000D1L"SystemStoreLocation""1.3.6.1.4.1.311.10.3.8"8247L(* (float *) __float_max)(-8)0x04ß10x0170PostThreadMessageA((DWORD), , , )8305L(-2)0x00000040L100020x00040000L8221L3003L8455L = 0x10000000UL11006L0x00200xF150(DWORD)0x00F000210x0171(MCIERR_BASE + 5)0xBFCTL_CODE(FILE_DEVICE_SMAßRTCARD, (), METHOD_BUFFERED, FILE_ANY_ACCESS)0xC00x0001_HRESULT_TYPEDEF_(0x8009302DL)53112RpcNsGroupDeleteA0x720xBA(CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER )"1.3.6.1.4.1.311.10.3.3.1"0xßDD1L00x00040xDESNDMSG(, PSM_SETFINISHTEXT, 0, (LPARAM))0xDB( 0 )320xDC1212L0x0040215L0x000000020xDF(0x40000000L)(WM_USER + 109)1004LPostThreadMessageW((DWORD), , , )0x00000100TEXT("printCollaßte")((DWORD)0x00000002)0x000295L14(( >> CERT_UNICODE_ATTR_ERR_INDEX_SHIFT) & CERT_UNICODE_ATTR_ERR_INDEX_MASK)0x00080000L0x23_HRESULT_TYPEDEF_(0x80094800L)12_HRESULT_TYPEDEF_(0x80091007L)X509_MULTI_BYTE_UINTGeßtKerningPairsA0x00020000L0x000194"// "_stricmpCOLORONCOLOR( UPDFCACHE_IFBLANK | UPDFCACHE_ONSAVECACHE )0x0000001L10x00004000"1.3.6.1.5.5.7.1.1"8007L3((() &= ~MDM_MASK_PROTOCOLDATA), (() |= (((ß)<Buffer, (unsigned ßint)(()-())); *(unsigned long __RPC_FAR *)&()->Buffer += (()-()); }155074L3808248L0x21748L0x40000000UL0x00000019((BYTE)(((WORD)()) >> 8))11015LFindAtomA1002LOpenEventA((LPCSTR)1)_HRESULT_TYPEDEF_(ß0x00030201L)9607LSQL_CURSOR_FORWARD_ONLY0x000000040x010x00002000L_HRESULT_TYPEDEF_(0x80090300L)0x081010StartServiceA0x0103_HRESULT_TYPEDEF_(0x80093008L)0x0000000260x0000L1OPENCARDNAME_EXW0x0400MAKEINTRESOURßCE(2)(~SHRT_MAX)TEXT("DsPresentForUser")0x40000x0000000BL00x200B0x10x04292((()&MDM_MASK_PROTOCOLDATA) >> MDM_SHIFT_PROTOCOLDATA)0x0415RpcServerUseProtseqExA_HRESULT_TYPEDEF_(0x80040170L)8220L( 0x1 )8512L2ß01L0x00000006LPOPENCARDNAMEW76901316L0x0080TEXT("printStartTime")"2.5.4.40"0x00000004CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)((LPCSTR) 3)_HRESULT_TYPEDEF_(0x800F0201L)0x80000000LRßpcServerUseProtseqEpA0x211163PageSetupDlgA770x0000000A0x00000005(CF_SCREENFONTS | CF_PRINTERFONTS)LPOPENCARDNAMEA_HRESULT_TYPEDEF_(0x80097012L)GetTempFileNameASQL_QUALIFIER_LOCATION0x0428257L60x00000008L_HßRESULT_TYPEDEF_(0x800B0111L)MIDL_user_allocate(4)SQL_TYPE_TIMETEXT("printMemory")_HRESULT_TYPEDEF_(0x8010000FL)_HRESULT_TYPEDEF_(0x80040066L)8392L1503LINET_E_USE_EXTEND_BINDING4205L0x000000402930x00010000L(JOYßERR_BASE+7)10_HRESULT_TYPEDEF_(0x80110449L)0x0840(WM_USER + 112)"Microsoft RSA SChannel Cryptographic Provider"0x000121764L0x00000010COLOR_BTNSHADOW"2.5.4.27"(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7)0x00021728LßTEXT("SeMachineAccountPrivilege")0x0002"0.9.2342.19200300.100.1.25"0x80000000UL(WVR_HREDRAW | WVR_VREDRAW)15020x0002151110042L0x000004000x000fffff(()->pvRecord)0x150x0000001B0"1.2.840.113549.1.9.7"(MCI_CDß_OFFSET + 1)0xA0000000(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL3_MASTER)230x000000807005L1434L12_HRESULT_TYPEDEF_(0x800F0214L)20CTL_CODE(FILE_DEVICE_SERENUM,131,METHOD_BUFFERED,FILE_ANY_ACCESS)0x00ß01L21244L0x00000000((LPCSTR)2)L"Microsoft RSA SChannel Cryptographic Provider"23(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SSL2_MASTER)6_HRESULT_TYPEDEF_(0x80100066L)4321L4103MDM_GEN_PROTOCOLINFO( MDM_ßPROTOCOLID_AUTO, MDM_GEN_AUTO_PROTOCOL_DATA ( MDM_AUTO_SPEED_DEFAULT, MDM_AUTO_ML_2 ) )0x0000100D0x00000008L0x800000046243323(-4)CreateFileA50x00001000L5028LIInternetProtocolRoot0xD"CryptMsgDllExportEncryptKeyß"TEXT("printBinNames")__declspec(thread)0x00000020L0x000B0x00100000L8394L10x010D1247L40x00080000_HRESULT_TYPEDEF_(0x00040130L)0x21(-2)390x00100x0007"2.16.840.1.101.2.1.1.5"0x0103100x2d0x00000001"1.2.84ß0.113549.3.4"25411SC_MAXIMIZE18_HRESULT_TYPEDEF_(0x80092020L)10062L4324LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_MSCHAP, MDM_HDLCPPP_ML_2 ß) )LoadImageA8const IID &MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_ANALOG, MDM_GEN_ANALOG_PROTOCOL_DATA ( MDM_ANALOG_V34 ) )0x00031402L1152L98393LExpandEnvironmentStringsA_MSL_FILENAME_MAX9SNDMSG(, PSM_SETTITLE, ß, (LPARAM)(LPCTSTR))CharPrevA(sizeof(SECURITY_DESCRIPTOR))0x10x0000000740x40x0080L( 0x0001 )30518541L0x000000300x00000FF0L0x80000000160EXTERN_C DECLSPEC_IMPORT  STDAPICALLTYPE0x00000001(unsigned long)0Xß00000100L0x01000000UL8520L0x0000010030x0100L0x000000800x0B0x00010x00000006L255110L0x00020xEESQL_CONCUR_READ_ONLY(1U << 31)10x00000011L122((BYTE)(()>>24))0x00100000L0x10RpcMgmtInqServerPrincNameA0x00ß80130x0040L100x000020000x000B0x00080000OpenWindowStationA3FILE_FILE_COMPRESSION0x00080000L120150x00000200((LPCSTR) 7)0x020000x000f0xF2(0x00000008L)0GetCurrentDirectoryA"1.3.6.1.4.1.311.20.3"_HRESULT_TßYPEDEF_(0x80040181L)0x2013"2.5.4.37"1069L85140x00080x000000172EDEADLK(CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT)0x02((LPCSTR)2)IID_IInternetProtocol0x0080(PVOID)InterlockedExchange((PLONG)(), (LONG)())ß0x0C( 0x0002 )0x7f0x1(MCIERR_BASE + 16)0x0004((BYTE)(()>>16))1158L2250(-4)0x0000000230x000300000x0000003910x00080000LDECLSPEC_IMPORT1412L8374L1380x0000000830x0002(0x0200)1580x2(PERF_SIZE_LARGE | ßPERF_TYPE_COUNTER | PERF_COUNTER_ELAPSED | PERF_OBJECT_TIMER | PERF_DISPLAY_SECONDS)32DoEnvironmentSubstA_HRESULT_TYPEDEF_(0x80092021L)5"1.2.840.113549.3"0x00000005L0x00040000L4322L(-1021)11221_HRESULT_TYPEDEF_(0ßx8011043CL)5025L0x80000000SQL_COLUMN_COUNT113(RPC_C_AUTHN_LEVEL_PKT_PRIVACY)0x00000010_MSL_WEOF(MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)"1.2.840.10046.2.1"0x04"1.3.14.3.2.17"0x00000200378206L1054L0x01((DWORD)0ßx00000040)14720x020x00000008L0x0004(WM_USER + 103)_HRESULT_TYPEDEF_(0x80092005L)0x000BCERT_STORE_PROV_SYSTEM_REGISTRY_W255_HRESULT_TYPEDEF_(0x80100067L)0x000018021372L4sndAlias('S', '?')((BYTE)(()>>16))0xß70010x021765L4002L0x080000001374L108L40x8000000815520x02000000L2UL91018L(0x0002)0x00000004L1011636L0x0(0x0000022AL)(( HKEY ) (ULONG_PTR)((LONG)0x80000006) )GlobalAddAtomAMAKEINTRESOURCE(17)_HRESULT_TYPßEDEF_(0x8009001AL)5062L_HRESULT_TYPEDEF_(0x80010140L)8332L02CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)_HRESULT_TYPEDEF_(0x8011040AL)5012L1612L10x00010x0000000828"1.3.6.1.5.5.7.3.5"WritßeConsoleInputA671L_HRESULT_TYPEDEF_(0x80028018L)0x000000010x20000x02601_HRESULT_TYPEDEF_(0x00090315L)0x000000087007L95500x0000002810x000000801SCARD_CTL_CODE( 5)_HRESULT_TYPEDEF_(0x800F020EL)0x00040x200x0ß0081209LCreateWindowA0x0002(-1)0x00000020L0x26(unsigned long)0X0000FF00L( 1 << CERT_QUERY_CONTENT_PKCS10)0x00040x000400000x000000030x30030x00020x00000800L1303L(* (float *) __float_min)2sndAlias('S', 'D')0xß00000008L0x00468350L((COLORREF)((((BYTE)()|((WORD)((BYTE)())<<8))|(((DWORD)(BYTE)())<<16))|(((DWORD)(BYTE)())<<24)))0x00010x00020000L00x000ERpcBindingInqAuthInfoA0x080D0x000010020x00000001IID_IInternetHosßtSecurityManager((DWORD)0xFFFFFFFF)0x00004000"2.5.4.16"(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SSL3SHAMD5)0x0000LGetClassLongPtrA0x001E20x00000008CharLowerASTATUS_PRIVILEGED_INSTRUCTION0x7fff0x0010000040x0000àß0x0000000802_HRESULT_TYPEDEF_(0x800401FEL)8542L0x20000000L3(6 << 9)0x01340x00100000LDlgDirSelectComboBoxExA8518L0x04(WM_USER + 107)64L_HRESULT_TYPEDEF_(0x80092010L)9717L0x00000001L8508L(RPC_C_AUTHN_LEVEL_DßEFAULT)0x0008(0x0050 | XCLASS_FLAGS )0x00100x000100000x40000x77180x00040000L90x000401C0L11002L0x000000108458L7003L0x0000000c5039L31LSQL_TYPE_DATE(TEXT("image/jpeg"))40x010F_HRESULT_TYPEDEF_(0x80110601L)àß00x04000000L4333L0x80002000(0x80000000L)0x00001D01ImmConfigureIMEA0x000000800x00000008L__declspec(dllexport)0x00087004L4LSQL_BINARY0x0000002804212L0x0000000EL71637L(100 + SQL_CODE_SECOND)0x00020000L0x00ß0010000x15"1.2.840.113549.1.7.5"0x00C50x00000100L1774L0x00000008L5051L10x01338367L0x000000FF(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)0x00000007AddPrintProvidorA310x00000004L0x000000041EnumICMProfilesACharTßoOemA(0x6)1L0x00000x200xF0100x00000040_HRESULT_TYPEDEF_(0x800401E2L)4"2.16.840.1.113730.1.2""2.5.29.31"0x0008_HRESULT_TYPEDEF_(0x8004E002L)0x00000025LocalReAlloc( (), 0, LMEM_MOVEABLE )0x0016CryptEnumProvidßersA0x20110x00100x00002000L_HRESULT_TYPEDEF_(0x80041314L)0x000010000x000x00000200L_HRESULT_TYPEDEF_(0x80004009L)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_56K, MDM_V120_MLß_2 ) )0x00000000120x00000100L((LPCSTR) 10)((DWORD)0x0008)_HRESULT_TYPEDEF_(0x8010001DL)1230x0000003FL0x0004L32L(-1L)311012L(__msl_alpha | __msl_digit)0x00020x000000010x10x00020002L69(STANDARD_RIGHTS_REQUßIRED | SYNCHRONIZE | 0x3FF)((LPCSTR) 9)30x00040x00000001L(WM_USER + 118)0x0800L_HRESULT_TYPEDEF_(0x80092002L)767051LSCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0202)0x00000040150x0000001083L0x00000008(1 << 1ß3)10004IID_IInternet0x00000010(PSN_FIRST-5)0x0005(-3L)52_HRESULT_TYPEDEF_(0x80100027L)0x100x20x1001145LCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS)0x0C45200x00040000L0x0000008084ß07L0x0008"2.5.29.21"0x000000400x000000200x00000020(0)0x000000100x03010x000000080x005000000x00096"1.3.14.3.2.10"0x08000000UL0x000000040x000000020x0000000819_HRESULT_TYPEDEF_(0x80093010L)0x041a34((() >>ß 31) & 0x1)0x08000000l0x04190x041c(void)SNDMSG(, CDM_HIDECONTROL, (WPARAM), 0)0x000000010x041b100x000008000x041e0x041d0x000000010x000002000x041f0x0000010070x00000008L0x0805710148CERT_STORE_SAVE_TO_FßILENAME_W_HRESULT_TYPEDEF_(0x80030201L)53_HRESULT_TYPEDEF_(0x80100008L)8469L51175L((DWORD )0xC0000093L)0x00000002L( 1 << CERT_QUERY_CONTENT_PKCS7_SIGNED)0x04000x80002021L0x00101(TEXT("video/mpeg"))I_RpcServeßrUnregisterEndpointACreateWindowExAAF_OSI8479L206L0x00660x000200009651290x00000200L0x01600x00040004L_HRESULT_TYPEDEF_(0x800401C0L)1632L0x6Cmemset((),(),())1063LReportEventA830x04002_HRESULT_TYPEDEßF_(0x80030001L)_HRESULT_TYPEDEF_(0x80040010L)0x000000400xEF0x0140((WORD )((((DWORD)()) >> 16) & 0xf))0x00000004GlobalFix((HANDLE)())80x0000000274((BYTE)())memset((),0,())0x00000001L0x3D70x00400000Lß230L"1.2.840.113549.1.1.5"1202L( += )CMSG_ENVELOPED_RECIPIENT_V2"2.5.29.4"8391L5L_HRESULT_TYPEDEF_(0x80090307L)VerInstallFileA0x20000000L0x007C0((HRESULT)0x00000000L)(((ULONG_PTR)() >> 16) == 0)9609L10ß(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE| MUTANT_QUERY_STATE)0x40000x0020_HRESULT_TYPEDEF_(0x800F0211L)0x00010000L0xC0000x1015360(~SCHAR_MAX)0x000000000x0000000d(( HKEY ) (ULONG_PTR)((LONG)0x80000005) )0x00040x040ß0170x06FF5010x0001000020x00200000LFILE_DEVICE_MASS_STORAGE0x00010000"1.3.14.3.2.6"0x1004((BOOL) ((0x00ff0000 & ()) == (0x00ff0000 & ())))0x00000002MF_ENABLED((DWORD)(((BYTE)() | ((WORD)()<<8)) | (((DWORßD)(BYTE)() | ((WORD)()<<8))<<16)))MM_MIM_LONGDATA61L50x00000004CALLBACK0UL(CDN_FIRST - 0x0007)0x0002(0x80000000L)HRESULT STDMETHODCALLTYPE0x00000004L0x040000008537L0x00000004L0x8000((LPCSTR) 39)8443L7RßpcServerUseProtseqIfAMAKEINTRESOURCEA_HRESULT_TYPEDEF_(0x80090326L)0x00173210x000000010x000100008216L2157MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_57DOT6K ) )HTLEFT60ß06L0x04000x00000004L15400_HRESULT_TYPEDEF_(0x80040168L)SQL_CURSOR_TYPE140338-1SQL_LOGIN_TIMEOUT((LPCSTR) 5)0x00020x000008000x0000000AL0x00000006L1124L((UINT)-1)_HRESULT_TYPEDEF_(0x80080002L)( 11 )0x00001ß000L"1.3.6.1.4.1.311.10.6.1"0x00000080L0x00000000((LPCSTR) 11)00x0100(MCIERR_BASE + 50)0x40000000L2_HRESULT_TYPEDEF_(0x80090006L)_HRESULT_TYPEDEF_(0x80030100L)PSM_SETHEADERSUBTITLEA0x0100L0_IOW('s', 2, u_long)àß__stdcall_HRESULT_TYPEDEF_(0x800300FBL)8CCSIZEOF_STRUCT(PROPSHEETPAGEA, pcRefParent)4_HRESULT_TYPEDEF_(0x8009301BL)0x80200x00010000L20x000000072RpcNsEntryObjectInqBeginA8516L148L200x35((DWORD)-12)0x0233_HRßESULT_TYPEDEF_(0x800F021CL)00x0001_HRESULT_TYPEDEF_(0x800C0012L)0x00001D06(-2)3AccessCheckAndAuditAlarmA(7U << 11)0x00000010L"CryptDllEncodeObjectEx"20(0x0008)0x000000010x044b0x00000004(-9)0MDM_GEN_PROTOCOßLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_14DOT4K ) )0x000000400x044c_HRESULT_TYPEDEF_(0x80028029L)(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_OBJECT_TIMER | PERF_DELßTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)0x04490x000000400x032760x044a"commdlg_FindReplace"(() == CRYPT_SUCCEED)0x20000000UL0x044f2(*(*(unsigned long **)&)++)0x04500x0220_HRESULT_TYPEDEF_(0x00040172L)00x040x0ß44d_HRESULT_TYPEDEF_(0x80029C4AL)00x00000400L310x044e0x00AF_DLI0x04510x04520x04000xBB0x000008002_HRESULT_TYPEDEF_(0x80091001L)0x00000010L0x8(&__std(__files[1]))7unsigned __int64_HRESULT_TYPEDEF_(0x8004000ß0L)13L"commdlg_FindReplace"0x7002289554L_HRESULT_TYPEDEF_(0x80090004L)0x1470x03070x00000003L_HRESULT_TYPEDEF_(0x80097011L)0x80DialogBoxParamA1031355L0x2000940x1100( 3 )0x00000002L0x0010L0x00000040L0ßx04555047L0x04560x00080x045320x04540x250x0000000D0x00200x0459119L0x045a0x00000001L0x045715460x0458ERROR_BAD_DEV_TYPE1324L0x00000007L"2.5.29.1"0x045b0x045c0x00000005LCMSG_ENVELOPED_DATA_V090x00210x0ß0000200lERROR_OUTOFMEMORY0x00000100L1055LAdvancedDocumentPropertiesA_HRESULT_TYPEDEF_(0x80030003L)181_HRESULT_TYPEDEF_(0x8010002FL)(4 + MCI_SEQ_OFFSET)_HRESULT_TYPEDEF_(0x80091005L)0x00000100l0x00000004l(MIXERLIßNE_COMPONENTTYPE_SRC_FIRST + 6)CreateMetaFileA0x000000400x00000001l2550x00000002l((LPCSTR) 14)0x00000020l_HRESULT_TYPEDEF_(0x000401E2L)0x060x00000004L10x00000010l_HRESULT_TYPEDEF_(0x80100018L)0x00800x00000002ß0x00000008lMWT_IDENTITY8419L0x00000001L1200x01419604L(MCI_VD_OFFSET + 1)_HRESULT_TYPEDEF_(0x8010002CL)0x00200x045f0x000a0x960x00035053L( 0x0040 )MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOßL_DATA ( MDM_V110_SPEED_12DOT0K ) )MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_64K, MDM_V120_ML_NONE ) )0x00000008"2.16.840.1.101.2.1.1.14"0x045d10091L0x045e0x10050x10x0000ß0003381(PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_HEX | PERF_DISPLAY_NO_SUFFIX)0x20000x00400x02FC(~(DDE_FACKREQ | DDE_FRELEASE | DDE_FREQUESTED))033_HRESULT_TYPEDEF_(0x800C0017L)0x0000000010xFFFFFFFFL230ßx00000001LCopyEnhMetaFileA1105L0x5A4D0x0138((STATUS_ABANDONED_WAIT_0 ) + 0 )0x000F100x000000F0L17_HRESULT_TYPEDEF_(0x80097016L)0x00000004IInternetPriority0x000A((int)0x80000000)PostAppMessageA(0x00000000L)"1ß.2.840.113549.1.9.6"6500010024L0x80000x720x10000000WritePrivateProfileSectionA(2 + MCI_SEQ_OFFSET)0x0002L1(1 + MCI_SEQ_OFFSET)0x00000008L0x1C120x000AGetPrinterDriverDirectoryA(CERT_COMPARE_ISSUER_OF << CERT_CßOMPARE_SHIFT)385_HRESULT_TYPEDEF_(0x80020001L)_HRESULT_TYPEDEF_(0x00040002L)0x00040190L0x8RegQueryValueExA650010x000B(-8)SIZE_MAXIMIZED(-9)SQL_TYPE_TIMESTAMP0x90x0000C000L16101L( 1 )01206L0x00400000L10xß00001000((LPCSTR) 49)AddFontResourceA20x3BF0x00000010210104L(-11)2_HRESULT_TYPEDEF_(0x8009000DL)_HRESULT_TYPEDEF_(0x80010138L)(MCIERR_BASE + 11)1356L((HCERTCHAINENGINE)NULL)0x360x0226( 0xfff )0x4028207L(ßPERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PER_SEC)5256mixerGetDevCapsA0x00000000120x00000800(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_TEK)_HRESßULT_TYPEDEF_(0x80004013L)0x00000020FILE_VOLUME_IS_COMPRESSED2(0x80000000L)0x0153(-100)0x00000100L0x00000002L148213L(-16)0xffffffffffffffffULL2(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_DES)SCARD_ATTR_VALUEß(SCARD_CLASS_SECURITY, 0x0142)"1.3.6.1.4.1.311.10.1""1.2.840.10040"SHGetNewLinkInfoAGetWindowTextLengthATEXT("SeUndockPrivilege")5(-15)0x1AauxGetDevCapsA0x0008"2.5.4.43"0x00000004SetPortA0x060x00200000L_HRESUßLT_TYPEDEF_(0x80092012L)(WM_USER + 131)7_HRESULT_TYPEDEF_(0x800300FCL)ERROR_INSUFFICIENT_BUFFER4211L02_HRESULT_TYPEDEF_(0x80092013L)1(-6)DialogBoxIndirectA0x3fOpenFileMappingA(0x7)0x3e(0xA0000003)0x00000020Làß3(int)SNDMSG(, CDM_GETFILEPATH, (WPARAM), (LPARAM)(LPSTR))105_HRESULT_TYPEDEF_(0x8001011AL)TEXT("SeRestorePrivilege")0x00030000WNetGetNetworkInformationA0x0000_HRESULT_TYPEDEF_(0x00040182L)(1U << 10)0x000000ß020x00000020((fpclassify() > FP_INFINITE))0x3BC0x00101060L0x000400001793L(int)SNDMSG(, CDM_GETFILEPATH, (WPARAM), (LPARAM)(LPWSTR))0x800000400x00040000L0x00000005284400x00000200L0x00000001L".GroupPolicßy"sz_CERT_STORE_PROV_PHYSICAL_W8447L0x200CMMIO_READ1(CERT_COMPARE_PUBLIC_KEY << CERT_COMPARE_SHIFT)__std(vsnprintf)( 4 )0x00002000L0x000000040x02(-22)0x02329130x00000080L(MCIERR_BASE + 83)DialogBoxParamA(ß, , , , 0L)(SQL_C_LONG+SQL_SIGNED_OFFSET)10x000000020x00000001(MATH_ERRNO|MATH_ERREXCEPT)10x0000000250x00001D03{().Lo64 = 0; ().Hi32 = 0; ().signscale = 0;}198301L0x00000010((WORD )() >> 10)(TEXTß("application/postscript"))7120x046b0x040bRpcNsGroupMbrRemoveA0x046c0x040c35021L0x0080( 0x8 )0x000002000x04690x0409220x10000x046a0x040a(-1 * (int)())0x046f0x040f30x0110x000015ff0x046d0x040d0x000ß000020x046e0x040e0x0000000E0x030EI_RpcNsBindingSetEntryNameA100x0008SQL_C_CHAR_HRESULT_TYPEDEF_(0x800C000DL)0x0101L2RpcNetworkIsProtseqValidA0x200320x0020487L4L0x00080x20"1.3.14.3.2.19"DialogBoxParamW(ß, , , , 0L)10x000013ff26_HRESULT_TYPEDEF_(0x8002802EL)240x0004IsLoggingEnabledA0x00020x00000008L0x00200000L0x0a_WAIT_CHILD0x00080000GetTextExtentPointA_HRESULT_TYPEDEF_(0x80110419L)9504L0x02825014L1ß13EnumPropsExA2((BYTE)(()>>16))0x0008((DWORD )0xC0000006L)1(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5)5_HRESULT_TYPEDEF_(0x80010130L)1921L0x00030x000000040x00038487L8306L0x0005RPC_BINDING_VECTORmidiOutGetDevCaßpsA0x00000009"CryptMsgDllImportKeyTrans"19L(-3L)IDI_EXCLAMATION68513L(MCIERR_BASE + 13)0x00000010LOWORD()CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)0x01000000LCTL_CODE(IOCTL_CHANGER_ßBASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)X509_UNICODE_NAME_VALUE(STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3)10x000400000x3f0x10x05(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERßF_DELTA_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)(0x1F)(-1)(-12)0x00000800L0x2010140x00001004DeletePortA(MCIERR_BASE + 15)0x0000charERROR_NO_LOGON_SERVERS(MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULßT))290x00000001L310x000000000x00020x0000000117_HRESULT_TYPEDEF_(0x80004021L)0x0001120x00001_HRESULT_TYPEDEF_(0x800401EBL)10093L210x12(CDM_FIRST + 0x0003)0x20000000snprintf996L6L8486L115037LCP_WINANSIàß(CERT_COMPARE_NAME_STR_A << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)BN_UNHILITE0x800000001655MAKELONG(,)0x00000004L9((LONG)0x80000000)39560L60LDECLSPEC_IMPORT0x00080000LGetTextFaceA0x00070x001000000xß00000004L0x040010xffffff000x3BMAKEINTRESOURCE(32515)40_HRESULT_TYPEDEF_(0x80010126L)(~((UINT_PTR)0))8336L(CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)8( (() & 0x80000000) )(0x0100000ß0L)0x000000010x00055L".LocalMachineGroupPolicy"7002L0x00000010TEXT("NetPopup")0x0010_HRESULT_TYPEDEF_(0x80010106L)7017LCreateEventA((DWORD)(((BYTE)() | ((WORD)()<<8)) | (((DWORD)(BYTE)())<<16)))7045L0x000ß000800x000000040x00000100L0x4000_HRESULT_TYPEDEF_(0x8004E00FL)GetPrintProcessorDirectoryA18382L0xF130"sysytool"0x40x80000x400x0004(*(double*) __double_huge)518_HRESULT_TYPEDEF_(0x8004E006L)70x000122422(SßTANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE)0x0000001020x8004E000LSQL_CB_DELETE(MMIOERR_BASE + 10)(( HKEY ) (ULONG_PTR)((LONG)0x80000001) )17_HRESULT_TYPEDEF_(0x8001013DLß)((DWORD)0x0080)0x885362GetFileAttributesA0x1221180x000000040x0004( 200 )GetFileAttributesExA_HRESULT_TYPEDEF_(0x8009000EL)0x00000080L(MCIERR_BASE + 54)10066L(-1021)SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0xß0124)0x0203L_HRESULT_TYPEDEF_(0x80040007L)0x0004L_HRESULT_TYPEDEF_(0x80030021L)(0x00000225L)SQL_FETCH_PRIOR0x00000800L_HRESULT_TYPEDEF_(0x80096010L)1201L7MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROßTOCOL_DATA ( MDM_V110_SPEED_19DOT2K ) )0x7777FFFFWNetGetUserA0x020E1787L358342L1627L1154L(0x0200)0x00000400L42CERT_SHA1_HASH_PROP_ID0x08420x0000002014MWT_RIGHTMULTIPLY0x0000000010((DWORD)0x00000008)13_HRßESULT_TYPEDEF_(0x800401FDL)0x000000010x000000020x00001E05MM_WIM_CLOSE0x0470x010F0x013068230L0x00000800L1638L0x80200000SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA003)(0x4)0x00020000LDECLSPEC_IMPORT8015ßL0x000008000x00000000L1020018303L164319L_HRESULT_TYPEDEF_(0x80093101L)_HRESULT_TYPEDEF_(0x80041312L)190x0000000FL8384L1127L0x00400x00000040LSCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0103)_HRESULT_TYPEDEFß_(0x80090331L)0x001000x121908L0x00020x01108500x00000004L5301L0x00000080L920x0000000130x00000004LIMAGE_NT_OPTIONAL_HDR32_MAGIC77( 0x2 )0x0020000040ULPrivilegedServiceAuditAlarmAIME_CMODE_NATIVE(0x0080ß | XCLASS_NOTIFICATION )0x434944470x0004120L240x000000020x0100000011027L779( 0x0001 )LPIINTERNETPROTOCOLROOT20x000001000x008000000x0B40x00000x100000000x0136350x0028"1.3.6.1.5.5.7.3.7"4310L((WORD)0x01ß00)0x0800000020x00000200_abnormal_termination41701L10x000000100xA44112_HRESULT_TYPEDEF_(0x80094001L)SYSER_PRODCODE_SERVER_STD0x00000003142111LSYSER_PRODCODE_SERVER_XML2GO2MM_WOM_CLOSESYSER_PRODCODE_SERVERß_DEMO(*(float*) __float_huge)0x0008"FuncName""1.3.14.3.2.22"ERROR_ACCESS_DENIED1930x00000027199"SmartCard"_HRESULT_TYPEDEF_(0x80010114L)0x544E5250L(MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))170x000001008314Làß0x2F15110x000400000x0201L( (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FAT_12)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FAT_16)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_IFS)) ||ß (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_HUGE)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FAT32)) || (( & PARTITION_NTFT) && (( & ~0xC0) == PARTITION_FAT32_XINT13)) || (( & PARTITION_NTFT) &&ß (( & ~0xC0) == PARTITION_XINT13)) || (( & ~PARTITION_NTFT) == PARTITION_FAT_12) || (( & ~PARTITION_NTFT) == PARTITION_FAT_16) || (( & ~PARTITION_NTFT) == PARTITION_IFS) || (( & ~PARTITION_NTFT) == PARTITION_HUGE) ß|| (( & ~PARTITION_NTFT) == PARTITION_FAT32) || (( & ~PARTITION_NTFT) == PARTITION_FAT32_XINT13) || (( & ~PARTITION_NTFT) == PARTITION_XINT13) )((LPCSTR)4)0x000000010x10010x04000000870x00000001150x000000020x00ß0000380x10x8000000000x00001602MS_DEF_PROV_A0x00000800L"2.5.4.25""M\0\0\0"0x0080_HRESULT_TYPEDEF_(0x800C0100L)CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)5210x00000004(4 << 9)0x000000ß04L0x00020xffffffff0x112169601L0x00080000LDdeQueryStringA_HRESULT_TYPEDEF_(0x80110438L)1008L0x031172L(-11)0x000DSQL_MAX_LENGTH2402L0x00000023((HANDLE)(DWORD_PTR)GetWindowThreadProcessId(, NULL))70xFFFFFFßFF_HRESULT_TYPEDEF_(0x800F0102L)4307L0x00000010LAF_LAT550x00020x00040x00x0039SQL_CB_DELETE1L"Directory Service Object"0x49(MCI_STRING_OFFSET + 16)8372LIMAGE_SNAP_BY_ORDINAL32()0x00000000L((HWND)0)0x0000ß00020x00002000L0xFC000x00000020L8457L0x2000x3_HRESULT_TYPEDEF_(0x80092009L)_HRESULT_TYPEDEF_(0x80010105L)"1.3.6.1.4.1.311.20.2"_HRESULT_TYPEDEF_(0x800288BDL)8445L"Directory Service Object"SQL_ASYNC_ENABLE_OFF1ß030x02122020L0x00001000L0x00100000CERT_FIND_OR_ENHKEY_USAGE_FLAG30L0x30000000UL10"1.3.14.3.2.27"0x000000080x00000001LMAKEINTRESOURCE(19)_HRESULT_TYPEDEF_(0x8009200EL)0L0x8004021FL0x0003(SERVICE_WIN32 | SERVßICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS)0x00040x00000000L((DWORD)0x00000800)101619(-12)RpcNsProfileDeleteA0x00010000L0x00001200((DWORD)0x00000101)0x0000002b3(MMIOERR_BASE + 2)2012L0x0000040ß00x00000001SQL_QUALIFIER_TERM33204810x38723_HRESULT_TYPEDEF_(0x80040065L)67( 0x10 )880x000008004345004L0x00050000l0x000000400x021915L0x0854110x00x0000002011ERROR_INVALID_DATA240L((STANDARD_RIGHßTS_ALL | KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | KEY_CREATE_LINK) & (~SYNCHRONIZE))000x00001000L2541822L0x0001_HRESULT_TYPEDEF_(0x800C0003L)9ST_BLOCKNEXT0x000014ß001179L0x00000004_P_NOWAIT0VarBstrFromI4448002L20x00000010L1310x00000001L0x0002_HRESULT_TYPEDEF_(0x8011041EL)0x000000020x400f0x00000001L20x808000000x0000000211BS_NULL0x0234"1.3.14.3.2.28"0x00000010_HßRESULT_TYPEDEF_(0x8000400EL)0x00040x00010x0100( 0x80000000 )10x02CryptSetProviderAh_addr_list[0]0x000310x00020000L1DispatchMessageA_HRESULT_TYPEDEF_(0x80020007L)102L(CDM_FIRST + 0x0001)_HRESULT_TYPEDEF_(0x80ß093006L)4_IOR('f', 127, u_long)0x00000800L00x6B21602L1222LWriteProfileStringATEXT("printMediaReady")1429L(0x0002)8205L0x0002struct DECLSPEC_UUID() DECLSPEC_NOVTABLEERROR_NOT_ENOUGH_SERVER_MEMORY231L0x0004àßWinHelpA0x000A1354L100x000000020xFFFFFFFF0x2SNDMSG(, PSM_RECALCPAGESIZES, 0, 0)0xFC0x041B78(((fd_set FAR *)())->fd_count=0)_HRESULT_TYPEDEF_(0x80040011L)20x30x10050x000F00000x00400x01891799L57049L0xß1E(4<<4)0x00010000LGetOpenCardNameALookupPrivilegeDisplayNameA0x00010x0002( sizeof()==8 ? *(1+(_UINT32*)&) : (*(_UINT32*)&))NULL0x0000080030x000010000x00ffffff0x00000001420147L13_HRESULT_TYPEDEF_(0x8ß00F022DL)98501L10x0001L8385L(RPC_C_AUTHN_LEVEL_CONNECT)1116L((UINT)-1)(0x0000 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK )IID_IInternetProtocolSink0xC040x00000200L0x00028110x00F1DNS_ERROR_UNSECURE_PACKET0x00008ß000201768LLPCPROPSHEETHEADERA_HRESULT_TYPEDEF_(0x8010002AL)16008L2336SearchPathA0x000000180x000000020x800000000x00000001V_UNION(, punkVal)CryptSetProviderExATHREAD_BASE_PRIORITY_MAX0x019DTEXT("RestartJobOnßPoolError")0x0000C000L111064L50x00000800L0x0200L8100000x004000000x00000001L30xFF0x000000408323L52043310x000f0000DeleteFormA0x04GetWindow(, )(LPTSTR)((ULONG_PTR)((WORD)()))28495L0x00000008((LPCßSTR) 20)8517L(0L)10x00080x00000008_HRESULT_TYPEDEF_(0x80093000L)1453L1899L(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)0x00000080LAddPrinterConnectionA(&g_rgSCardT1Pci)0xF0(&g_rgSCardT0Pci)6200x00001000àß_HRESULT_TYPEDEF_(0x800F021AL)0UL"2.5.29.16"(100 + SQL_CODE_DAY_TO_MINUTE)0x019C3027(TIMERR_BASE+1)0x150x00000030"1.3.6.1.4.1.311.13.2.3"_HRESULT_TYPEDEF_(0x80093201L)0x020x00004000L1383L120x1000210x007Bß(-13)(MCIERR_BASE + 40)0x3BB0x200F0x00050x0040L0x000B6((MCIDEVICEID)-1)0x02060xBD0x900x000010001166L0x0000040000x00A80x000000ffstruct(0x0008)20x00000100L59LoadMenuA1732L648(-2)0x0080111((LPCSTR)ß 29)ERROR_INVALID_HANDLE0x000B_HRESULT_TYPEDEF_(0x80020011L)SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1TEXT("printDuplexSupported")0x00004003L0x1010108LSTATUS_NONCONTINUABLE_EXCEPTION(QS_MOUSE | QS_KEY)0x00000004L219ß60x200000000x00000008ILLUMINANT_CCreateDirectoryA(TEXT("audio/wav"))0x00060x01730x01690x00000020(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PEßRCENT )10059LSQL_WCHAR0x000000021281((DWORD)0x0040)"CertDllOpenSystemStoreProv"( -5 )0x00000001L_HRESULT_TYPEDEF_(0x80092022L)0x0200L_HRESULT_TYPEDEF_(0x8004E025L)0x10038560x22ERROR_ALREADY_ASSIGNED141445Làß0x00000020L(MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)0x2C0920x0000ffffWNetCancelConnection2A0x01500x00000008LMF_MENUBREAK1613L128366Lstrcpy(,)0x00000009L70x00000040L12_HRESULT_TYPEDEF_(0x8001012FL)6040x7ßfffffff0x00000001603660170CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)MAKELONG(,)0x00102330x00000001"\\SQL.LOG""2.16.840.1.113730.1.12"GetExpandedNameA_HRESULT_TYPEDEF_(0x000401E7L)ß(BDR_RAISEDOUTER | BDR_SUNKENINNER)0x710x00000008L256_HRESULT_TYPEDEF_(0x80040204L)0x00070000virtual  STDMETHODVCALLTYPE 0x32SQL_LIKE_ONLY20x01995060x00018_HRESULT_TYPEDEF_(0x80090311L)300x10000000ULSetFßormA0x00000000L0x00000200L10041L(SHORT)-21EnumFontFamiliesA0x00081804L160GetFormA0x80010x00010000(-14)0x000010000x00008000L"1.2.840.113549.1.3.1"_HRESULT_TYPEDEF_(0x800B0100L)9718L9708L(0x0000FFFFL)0x000ß01603GetPrinterDriverA(((DWORD)( & 0xffff0000)) >> 16)(MMIOERR_BASE + 3)5930x0156MAKEINTRESOURCE(4)0x3CA0x01460x00000001(0x00000001L)(*(_UINT32*)&)RpcNetworkInqProtseqsA(BF_LEFT | BF_TOP | BF_RIGHT | BF_BOTTßOM)2S_un.S_addr0x00008000L91231L8CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)MAKEINTRESOURCE(11)0x000008000x00000010LSetWindowsHookA320x2A3529340_IOR('s', 3, u_long)0x400d33(-7)0ßxff0x00000008((() &= ~MDM_MASK_BEARERMODE), (() |= ((()<> MDM_SHIFT_BEARERMODE)SNDMSG(, PSM_REBOOTSYSTEM, 0, 0L)60x00000200_HRESULT_TYPEDEF_(0x80040153ßL)((DWORD)-1)4"2.5.4.42"(MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1)_HRESULT_TYPEDEF_(0x8004E026L)1SEC_WINNT_AUTH_IDENTITY_A3MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V120, MDM_GEN_V120_PROTOCOL_DATA ( MDM_V120_SPEED_64ßK, MDM_V120_ML_2 ) )(CERT_COMPARE_SUBJECT_CERT << CERT_COMPARE_SHIFT)0x0004L0x00000010LSCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0006)70x0002L1341LEndUpdateResourceA0x001_HRESULT_TYPEDEF_(0x8009030EL)((DWORD )0xC000ß02B5L)5150x0000010040513(CONTEXT_i386 | 0x00000008L)0x0000120500x8000SML_ERR_A_XPT_ERROR + 0x1200x0000400BL0x000019ff0x00000012_HRESULT_TYPEDEF_(0x80100021L)( 0x0004 )0x000000040x02019709L36L0x0202(100ß + SQL_CODE_YEAR_TO_MONTH)14_HRESULT_TYPEDEF_(0x80090010L)5050LTEXT("printKeepPrintedJobs")0x200000x000000080x00000003L0x80040200L1005L(0x0020)0x010x00001C00SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004)(PERF_SIZßE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_PERCENT)0x000001000x2000x4d5918325L((DWORD )0xC0000090L){0,0,0,0,0,3}101657006L1342LRPC_X_ENUM_VALUE_OUT_OF_RANGE920x00000020(STANDARD_RIGHTS_ßREQUIRED | SERVER_ACCESS_ADMINISTER | SERVER_ACCESS_ENUMERATE)(0x00000002L)0x020x014C0x00000002L80x0a8543L30x080A55_HRESULT_TYPEDEF_(0x80041311L)_HRESULT_TYPEDEF_(0x80004018L)0x004B15(CERT_SYSTEM_STORE_SERVICßES_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)MAKEINTRESOURCE(20)820x00A0410x40_HRESULT_TYPEDEF_(0x00040171L)_HRESULT_TYPEDEF_(0x8004016AL)1550x870x0308_HRESULT_TYPEDEF_(0x8004E023L)153"CryptDllEncodeObject"0x0080ß0x0231(0<<4)8waveOutGetDevCapsA0x3C7100420x00000004L1250x00000200RpcNsGroupMbrAddAMAKEINTRESOURCE(32651)610241007100120x10000x00081187025L(-5)2SQL_CP_OFF0x00000004970x01720x1007_HRESULT_TYPEDEF_(0xß800401F8L)570x0002L0x00000002LChangeServiceConfigA10x001000x00060x000DEnumDisplaySettingsA0x00010x004EGetOutlineTextMetricsA_HRESULT_TYPEDEF_(0x80100029L)0x00000008L0x002000000x00001D00160x000000040x00000ß001L(CDN_FIRST - 0x0004)1(0x0)0x8012(MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_SIGNED)5029L0x100A((HRESULT)() <= 0 ? ((HRESULT)()) : ((HRESULT) ((() & 0x0000FFFF) | ß(FACILITY_WIN32 << 16) | 0x80000000)))EXTERN_C const GUID FAR 0x000000801407L0x0142_HRESULT_TYPEDEF_(0x8000400BL)0x000008000x0032(0x0100)0x00000002L0x00040x00040x0008AbnormalTermination()(-8)"Status"0x00210ß0001397L0x0001GetNamedPipeHandleStateA0x001F00000x000000020x00000002(TEXT("application/octet-stream"))( 0x50746457 )0x00805060L10x0400200x000000040xFEEF04BDLExitWindowsEx(EWX_LOGOFF, 0xFFFFFFFF)0x00008000DlßgDirListComboBoxA240x0004130( 0 )4008434L40x00000001L_HRESULT_TYPEDEF_(0x800B0106L)(0x001F0000L)_HRESULT_TYPEDEF_(0x80030004L)1160L0x0004000020x0004( 0x10 )41630x00000020161RpcServerRegisterAuthInfoAEßRROR_NOT_CONTAINER0x00A4116088sndAlias('S', 'W')struct __ { int unused; }; typedef struct __ *sz_CERT_STORE_PROV_LDAP_W0x0001RegEnumKeyExA218_HRESULT_TYPEDEF_(0x80094003L)CommDlg_OpenSave_GetFolderPathA0x0ß0000002LOLDFONTENUMPROCA4208L0x000x020x03(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES)(0x00000227L)0x8X509_MULTI_BYTE_UINT0x000000041(PERF_SIZE_VARIABLE_LEN | PERF_TYPE_TEXT | PERF_TEXT_UNICODE | PERF_DISPßLAY_NO_SUFFIX)0x0005((LPCSTR) 52)0x00200x080x00000004_HRESULT_TYPEDEF_(0x800F0224L)0x00080000L63(STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE)RegLoadKeyA1_HRESULT_TYPEDEF_(0x8004130ßAL)84SQL_INTERVAL_DAY_TO_SECOND0x700444TEXT("OSVersion")1130L0x0040L0x0120x000CCertNameToStrA0x0002L10x00008000L1721L0L150x010x00000100L0x00400x00A2L"Microsoft Base DSS Cryptographic Provider"30x00000ß100L180x000000201(-10)2GetLogColorSpaceA52__WSAFDIsSet((SOCKET)(), (fd_set FAR *)())910x080014189551L0x000D"Microsoft Base DSS Cryptographic Provider"9684325L1309L2943710x0001IID_IInternetProtocolßSinkStackable(TEXT("image/gif"))CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0008L8(-16)(0x00000008L)((DWORD )0xC0000026L)"Collection"1078L0x000DSML_ERR_A_XPT_ERROR + 0x150x40000000252ExßtractIconExA(3<<4)00x00001000_HRESULT_TYPEDEF_(0x80041315L)0x000000400x80040160L14414516MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_CHAP, MDßM_HDLCPPP_ML_2 ) )212_HRESULT_TYPEDEF_(0x8004016FL)10x000000400x0200(-6)CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)5_HRESULT_TYPEDEF_(0x80040068L)1461L0x00800000(MMIOERR_BASE + 6)1357L0x000ß000020x00250x0020000000x004000000x000080001210x000800000x0000400091219L310x001000000x00020000210x000400000x2a620x03050x00200x000100000x00010000{0,0,0,0,0,2}80RegDeleteValueA0x00002000"1.2.840.11354ß9.1.9.16.3.7"(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_OBJECT_TIMER | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)MAKEINTRESOURCE(32516)150x0000001060x00CD1347L0x000000405087L(WM_USER + 119)0x0ß040160x0000000821822(-6)240x0004021FL1725L463(MDM_MASK_BEARERMODE|MDM_MASK_PROTOCOLINFO)(~INT_MAX)0x7f0x00000008L0x00000010LGetAtomNameARegRestoreKeyA25GlobalGetAtomNameA(-308)8528L0x0001GetEnvironmentßVariableA0x000920x00000002L0x00000000LCOLOR_BACKGROUND_HRESULT_TYPEDEF_(0x80110435L)0x00000004TA_BOTTOM5030LInitiateSystemShutdownA0x80000001114LERROR_NOT_AUTHENTICATED25(0x0200)0x00080x00050x00020000L0x00ß0000031628445"Software\\Microsoft\\Cryptography\\OID"0x0001LV_UNION(, ppunkVal)"Formats"0x0067"System"600x000000010x07(MCI_WAVE_OFFSET + 0)10x00000001L272UL0x10090x02(MMSYSERR_BASE + 14)0x10000x000621ß50x3D50x021110x40000000L(1)0x00010000L0x00030000L247251_HRESULT_TYPEDEF_(0x80090304L)SQLSetPos(,,SQL_POSITION,SQL_LOCK_NO_CHANGE)11( 0x20 )260x000000021280000x00040000L0x10000x952'+'20x00000800Lß120x000000010xFF00000015SQL_QUALIFIER_USAGE0x000890x08430x00040x00018532L0x000000002119UuidFromStringA0x04000000l0x03_HRESULT_TYPEDEF_(0x8010000CL)0x00653080x000018040x0200"`\n"0xBE0x030220x1FCMSG_ßENVELOPED_DATA_V28529L1625L((HWND)-1)4337L63(SQL_BIGINT+SQL_SIGNED_OFFSET)CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)(-8)0x00000000L0x08"System"0L'+'0x00001805ERROR_INVALID_NAME0x0000ß0020420x40008237LSQL_TXN_ISOLATION0x00001000L0x0005227344107DECLSPEC_IMPORT0x0008000061((WORD )((((DWORD)()) >> 20) & 0xf))140x010x00000001L49428460L0x00400000L990x0FFF(CERT_COMPARE_ATTR << CERT_COMßPARE_SHIFT | CERT_INFO_ISSUER_FLAG)0x02160x220x0d0x0000000028463L0x0000001b1000x00000001LWH_MIN_HRESULT_TYPEDEF_(0x80090306L)1438L"2.5.4.4"0x00060x00201800x02080x00200000TEXT("SeSystemProfilePrivilege")95àß71670x000000200x000000021366LSQL_RETRIEVE_DATA1103L0x00000040L0x0000002e0x000000008SQL_SMALLINT980x00000034(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_COUNTER | PERF_MULTI_COUNTER | PßERF_TIMER_TICK | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)0x00020000L0x00000008L0x0F000x000018000x000000010x80040100L4(SHORT)00x0110x30016036840x0000L0x0000000810x015d8003L730x00000001RpcNsBindingExßportPnPA3L0x0070000020x00010000L490x002C3293V_UNION(, puintVal)STATUS_INVALID_DISPOSITION0x00000001L(1 << CMSG_DATA)(MCI_STRING_OFFSET + 17)8456L8100x0000FFFF015(MCIERR_BASE + 37)0x041F1640L1126L((LßPCSTR)4)(WM_USER + 106)_HRESULT_TYPEDEF_(0x80040201L)11019L0x80080000( PARAMFLAG_FIN )0x00000004L0x2URLOpenPullStreamA0x00C79001000x01000000LSWP_NOOWNERZORDER0x00000001L0x000000041180x0000V_UNION(, pdispßVal)(unsigned long)0X00000000L__declspec(weak)60x0001L2'Win '0x000000568349LGetModuleHandleA1210x1_HRESULT_TYPEDEF_(0x00040140L)9502L7(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MAC)(MIXERCONTROL_CT_CLASS_NUMBEßR | MIXERCONTROL_CT_UNITS_UNSIGNED)_MSL_FILENAME_MAX3MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_4DOT8K ) )0x000004000x18(HWND)SNDMSG(, PSM_INDEXTOHWND, (WPARAM)(), 0)0x0ß0000020L( & URLPOLICY_MASK_PERMISSIONS)0x80000004512PSM_SETTITLEA1340x00100000L00x7f11539557L"1.3.6.1.5.5.7.3.8"9003L970x00060x020x00020x05(()->vt)0x00020x00000100LGetLongPathNameA_HRESULT_TYPEDEFß_(0x80093005L)0x00100x00000100L201071L(-21)8258L(MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_MULTIPLE | MIXERCONTROL_CT_UNITS_BOOLEAN)(8L)321(CDN_FIRST - 0x0001)0x00000020L960x0000220x000000002240RßpcServerUseProtseqA_HRESULT_TYPEDEF_(0x80040005L)10(-1)0-1STATUS_CONTROL_C_EXIT((DWORD)0x00000004)0x0020000027630x0000000230x0020L40xF160(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MAC_KEYß)8334L0x0000000BL0x00000100LGetProfileSectionA2566V_UNION(, pdblVal)EnumPrinterDataExA41_HRESULT_TYPEDEF_(0x80110412L)(1)0x00000005((LPCSTR) 43)(2)"2.16.840.1.101.2.1.1.15"((DWORD)(()&0x00FFFFFFL))0x080ß0(3)40x037F(4)90x000000FF100x00001202"CertDllEnumPhysicalStore"5__stdcallSQL_COLUMN_TYPE52PolyTextOutA4302LTEXT("printMaxResolutionSupported")_HRESULT_TYPEDEF_(0x8002802AL)1304L_HRESULT_TYPEDEF_(0x80010132ßL)SetFileAttributesACreateMutexA400x000000080x000c_HRESULT_TYPEDEF_(0x80090022L)0x00011707L((BYTE)(()>>24))4316L0x00072"1.3.6.1.4.1.311.13.2.2"0x00020x080x7F72(MCIERR_BASE + 66)0x00F50x80LoadLibraryA7ß(MCIERR_BASE + 64)0x0002_HRESULT_TYPEDEF_(0x80110402L)167EnumPrinterKeyA1818LSQL_C_BINARY8"1.3.6.1.4.1.311.10.1.1"85550x0002(CONTEXT_i386 | 0x00000004L)_HRESULT_TYPEDEF_(0x80040008L)_HRESULT_TYPEDEF_(0x800400ß01L)1SQL_COLUMN_SEARCHABLE0x00000x40001315LSQL_MAX_USER_NAME_LEN0x10CTL_CODE(IOCTL_CHANGER_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)0x000008009006L0x40000(0x0008)-1OpenEncryptedFileRawA771(0x00000229L)àßCTL_CODE(FILE_DEVICE_SERENUM,128,METHOD_BUFFERED,FILE_ANY_ACCESS)1074L(WAVERR_BASE + 3)(-12)0xFFFFFFFF(ALG_CLASS_SIGNATURE | ALG_TYPE_RSA | ALG_SID_RSA_ANY)0x00000100L0x001044ERROR_CONNECTION_UNAVAIL20(( HKEY ) (UßLONG_PTR)((LONG)0x80000000) )GetModuleFileNameA8DeletePrintProcessorATEXT("printSeparatorFile")0x00080000256"1.2.840.113549"COLOR_BTNHIGHLIGHT0x004A0x000000030x80000000L(0x00000208L)0x0002L-150x00080x00000010ßLMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_9DOT6K ) )0x0000000fL70x0220010mmioFOURCC('L', 'I', 'S', 'T')0x00000010L0x001000000_HRESULT_TYPEDEF_(0x80100001L)10011(MIXEßRCONTROL_CONTROLTYPE_SIGNEDMETER + 1)160L0x0080"CryptMsgDllImportEncryptKey"0x00000003(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 0x00002277)8449L0x000000800x01060x00000010L6(1U << 5)1((LPCSTR) 30)_HRESULT_TYPEDEF_(0x8ß0080001L)_HRESULT_TYPEDEF_(0x80040165L)SystemParametersInfoA0xEA_HRESULT_TYPEDEF_(0x80090320L)216L0x00020x00000000ERROR( & 0xffff)190x00004001LV_UNION(, pbstrVal)RpcEpRegisterA0x00010x71IInternetProtocolß2161"2.5.4.22"11319L0x380x004030x00000001SQL_FILE_QUALIFIERMM_MIM_MOREDATA_HRESULT_TYPEDEF_(0x8010000BL)0x00000001ChooseFontACTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)92(() & N_BTßMASK)(0x8)5EnumDependentServicesA3005LSTATUS_INTEGER_OVERFLOW0x0E414(-10)0x00000010LIsEqualGUID(, )0x00000008L5038L0x000400000x00004003L(MCIERR_BASE + 8)1007L((DWORD)0x00040000)0x8000370x000b630x0ß004011FL7024L( & (511))wglUseFontBitmapsA1436L1387L1926L0x000000230x800001000x03( 2 )LBSELCHSTRINGA5((DWORD)0x0100)VarUI4FromR8"1.3.6.1.4.1.311.20.2.2"30x00B6WS_OVERLAPPED481798L2490x0B23_HRESULT_TYßPEDEF_(0x80093012L)0x015468515L0120x80040140L0x0380(MMSYSERR_BASE + 1)0x400a0x00000004L_HRESULT_TYPEDEF_(0x80100022L)"1.3.6.1.4.1.311.10.3.6"MAKEINTRESOURCE(21)_HRESULT_TYPEDEF_(0x80094002L)0x000000100x000008ß00L1395L0x00000010LImmEscapeAVarUI4FromR4CreateMDIWindowA0x01050_HRESULT_TYPEDEF_(0x8003001DL)760x440x00000004L0x00000080L(-8)10x000000040x00CESQL_QU_PRIVILEGE_DEFINITION0x20000000(JOYERR_BASE+6)0x0000004ß04_HRESULT_TYPEDEF_(0x80110414L)1217L1009L0x00000x00020000L105130x200x40000x20170x00000010x00000040SML_ERR_A_XPT_ERROR + 0x03299L0x0000000210_HRESULT_TYPEDEF_(0x8004006DL)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOßLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_MSCHAP, MDM_HDLCPPP_ML_2 ) )9719L5063L0x0001900018SETRGBSTRINGAEnumFontsA1752L0x05__int32DEFINE_GUID(, , , , 0xC0,0,0,0,ß0,0,0,0x46)0x90x000000040x02090x8004014FL8309L(0x0200)((USHORT) (0x0000ffff & ()))1703L200x00000100(1U << 0)0x0010LIDI_ASTERISK0x000000011205L"1.2.840.113549.3.9"3_HRESULT_TYPEDEF_(0x80004007L)8496L8380ßL1779L520231720L(STANDARD_RIGHTS_EXECUTE | PRINTER_ACCESS_USE)0x4000( 0x2 )0(unsigned long)0X000000F0L(WM_USER + 102)528454L__declspec(dllimport)0x2460x03110x00000004L( 0x0001 )0SQL_SCCO_OPT_ROWVER::SeßndMessage130x001300008437LGetMessageA1446L0x060x00000021(100 + SQL_CODE_YEAR)1756L0x02000x00021121L1CreateNamedPipeA(TEXT("image/x-wmf"))CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS ß| FILE_WRITE_ACCESS)181928L0x0001(CERT_COMPARE_KEY_SPEC << CERT_COMPARE_SHIFT)0x00200x0(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD2)0x00000002L1312L(-5)0x0020L0x00000002(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_ßMD4)( & 0xffff)(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_MD5)MAKEINTRESOURCE(32648)1409LlstrlenA0x000100000x0012TEXT("printStatus")0x000200001746L20xFFFFFFFF7_HRESULT_TYPEDEF_(0x80094004L)0x020x00004000L836ß9L( 0 )"1.2.840.113549.1.9.3"0x01842004L8438L1173L21"1.2.840.113549.1.7.6""2.5.4.7"0x00000020L((DWORD )0x000000C0L)(MMIOERR_BASE + 14)0x00000x00000400L30x11V_UNION(, dblVal)2(0x00000001L)47_HRESULT_TßYPEDEF_(0x8009030DL)0x00200x00000028_HRESULT_TYPEDEF_(0x800C0300L)0x000000800x060x020000000x040000000x000300000x1450x080000000x2f0x100000000CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG0x200000008005L = __va_startß()(MCI_STRING_OFFSET + 13)0x400000000x00001000L0(SHORT)100643V_UNION(, fltVal)234L0x08550x000014L01391L_HRESULT_TYPEDEF_(0x80093014L)0x00200x00001A000x00000400((ULONG)(ULONG_PTR)() )0x000200000x000ß00008534L((LPCSTR)5)0x8000((BYTE)((()>>24)&0xFF))0x2B1816L1IInternetSessionSTATUS_FLOAT_DIVIDE_BY_ZERO0x800000000x17MS_DEF_DSS_PROV_A2240x400000000x0000000A_HRESULT_TYPEDEF_(0x8009001EL)170x4((LPCSTR)2)àß900x000151"1.2.840.113549.1.9.16.3.5"1780x000000000x00000080LSCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102)0x000000040x000000001300L0x04000x000000010x40000000MFS_GRAYED1000LoadAcceleratorsA41090x001E0UßL0x1f(0x8)0x0004CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS)10240x014EmmioFOURCC('R', 'I', 'F', 'F')AddAtomA0xffff00000x000004000x002700000x00000010L22(MMSYSERR_BASE + 13)210x01_HRESULßT_TYPEDEF_(0x800401F7L)(WM_USER + 108)0xFFFF0x00000080_HRESULT_TYPEDEF_(0x8009100CL)const GUID &0x080x00000004998L0x0a5(0x00100000L)0x0000000520x0000000c_HRESULT_TYPEDEF_(0x80030002L)0x000000020x000260x400ß1151300x011751L0x000019702L0x002A14_HRESULT_TYPEDEF_(0x000401E8L)AF_INET_HRESULT_TYPEDEF_(0x8009300BL)0x00110xFD189L(0x0001)0x00000001L(WM_USER + 105)1056L180LCreateMailslotA0x000ERegQueryMultipleValueßsA(THREAD_PRIORITY_LOWEST+1)00xC000000F600x00090x80000000(1U << 3)96000x00000040L00x00000000CopyFileA0x0000000170x000000080x00011403L0x00000002L0x00004000LCTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFEREßD, FILE_ANY_ACCESS)8343L1376L(0x00000222L)0x120x400x00000080((HRESULT) )1MM_MOM_POSITIONCB8425L2550820x03240x0080"1.3.14.7.2.2.1"0x02000000MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDM_GEN_V110_PROTOCOL_ßDATA ( MDM_V110_SPEED_2DOT4K ) )(() = (() & ~(URLPOLICY_MASK_PERMISSIONS)) | ())8006L((DWORD)0x00000003)1430x0053((DWORD)0x00000004)int0x00000003L((DWORD)0x00002000)VarDecFromI40x40000x00004000L0x90x0000àß0x000000080x00000400L8246L60008530L8318L1821L2(((PRPC_ASYNC_STATE) )->RuntimeInfo)33GetPrivateProfileSectionNamesA0x00000002SCardForgetReaderGroupA"CryptMsgDllExportMailList"9_HRESULT_TYPEDEF_(0x80110429L)àß0x00000009L0x00000001SPIF_SENDWININICHANGE0xF140((DWORD)(() + (() << 18)))extern "C"0x7F"1.3.14.3.2.15"0x00000003"1.2.840.113549.3.2"_HRESULT_TYPEDEF_(0x8009200AL)_HRESULT_TYPEDEF_(0x80090301L)((DWORD)0x0001)àßCERT_FIND_ISSUER_STR_W0x10xFFFF00000x0000001e90x0010(MCI_STRING_OFFSET + 14)0x0004SetUserObjectInformationA134198L(TEXT("audio/x-wav"))0x0020256IsCharAlphaNumericA0x0002980019716L0x00081306L0x000B0x0002ß0000(MCIERR_BASE + 92)0x000C00002330x00060x03096(-6)SNDMSG(, PSM_UNCHANGED, (WPARAM), 0L)"1.3.6.1.5.5.7.2.2"00x00000100L0x0006(0U << 12)0x00E2TRUE0x000010000x00000004_HRESULT_TYPEDEF_(0x80010108L)30xß00085GlobalReAlloc( (), 0, GMEM_MOVEABLE )((WORD)0x0400)0x018611239L0x01160x00000040L(MIXERCONTROL_CONTROLTYPE_FADER + 1)0x00004000L10111L8427L60x0000002780x000000010x00000200L0x000000281811L0x00000001ß0x00000025GetCharWidthA0x08520x000000260x000000230x000000240x02000000L50x2((LPCSTR) 17)0x00800x000000100x000000220x0020L_HRESULT_TYPEDEF_(0x800401C3L)0x000000020x00000001WSANO_ADDRESS183L0x0c0x00010000L1ß23L0x000000040x000000290x000000080x0000002a()0x00020x00010x0000000840x10090x0004013FL0x00010000L0x00700000CERT_FIND_SHA1_HASH0x000001001907L0x00080000L0x00000010L(GCS_COMPREADCLAUSE|GCS_COMPCLAUSE)-40xß0110021760x00001606110x00040x10x920x00070x0000004030x000000400x00000008SendDlgItemMessageA0x00000x0004000020x20000000((DWORD)0x00000005)((() >> 16) & 0x1fff)0x1b0x0000000E0x0080380x000E(WM_USER+5)ß0x00000005(CERT_DSS_R_LEN + CERT_DSS_S_LEN)284430x00000800L0x00000001AF_MAX0x003c0000(MMSYSERR_BASE + 10)_HRESULT_TYPEDEF_(0x800C0008L)(0x0020)TranslateAcceleratorA0x0814(( HKEY ) (ULONG_PTR)((LONG)0x80000002) )ß30x000000081927L"1.3.6.1.4.1.311.10.4.1"0x000401BFL128WriteConsoleOutputA"ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,""ASC,ASSERTION,AT,AUTHORIZATION,AVG,""BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CßASCADED,CASE,CAST,CATALOG,""CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,""COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,""CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURßRENT,""CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,""DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,""DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,""DISTINCT,DOMAIN,DOUBLE,DßROP,""ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,""EXISTS,EXTERNAL,EXTRACT,""FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,""GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,""IDENTITY,IMMEDIATE,IN,INCLUDßE,INDEX,INDICATOR,INITIALLY,INNER,""INPUT,INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,""JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,""MATCH,MAX,MIN,MINUTE,MODULE,MONTH,""NAMES,NATIONAL,ßNATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,""OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,""PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,""PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLICß,""READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS""SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_USER,SET,SIZE,""SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,""SUBSTRING,SUM,SYSßTEM_USER,""TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,""TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,""UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,""VALUE,VALUES,VARCHAR,VARYING,VIEW,ßWHEN,WHENEVER,WHERE,WITH,WORK,WRITE,""YEAR,ZONE"1633L0x0400((WPARAM)(DWORD)MAKELONG(, ))0x10000RpcNsMgmtEntryInqIfIdsA0x00110000L0x021123L1003L1ULMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_ßDATA ( MDM_X75_DATA_64K ) )TEXT("DsPresent")((HWND)1)_HRESULT_TYPEDEF_(0x80029C84L)(100 + SQL_CODE_DAY)0x0002SML_ERR_A_XPT_ERROR + 0x130x000000201771L0x000016040SQL_OU_PRIVILEGE_DEFINITION((LPCSTR)1)089_HRESULßT_TYPEDEF_(0x80030101L)0x00080000L0x00000021_HRESULT_TYPEDEF_(0x80090001L)5040LV_UNION(, pfltVal)0x000000400x01053OLESTR("AsyncCallee")_HRESULT_TYPEDEF_(0x8010000AL)0x0000004010x00000040L( 0x80000000 )_HRESUßLT_TYPEDEF_(0x800F022CL)0x20x00080000LGetMenuStringA12( 0x0080 )0x00000000174117((LPCSTR)2)RegEnumValueA0x00090x0014(0x0040 | XCLASS_NOTIFICATION)40x000141832LSML_ERR_A_XPT_ERROR + 0x140x04000x8004012FL1ß0092L0x80000000CERT_COMPARE_SHA1_HASH( SecurityAnonymous << 16 )(0x0008)((DWORD)0x00008000)1LookupPrivilegeValueA0x0CFIELD_OFFSET(NOTIFYICONDATAA, szTip[64])598(WM_DDE_FIRST)161(0x0100)CTL_CODE(IOCTL_STORAGE_BAßSE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)0x416((HRESULT)0x00000001L)((LONG_PTR)(MAXULONG_PTR >> 1))0x00000007((LPCSTR)3)12125LTEXT("SCard$AllReaders\000")0x02(BDR_RAISEDOUTER | BDR_SUNKENOßUTER)_HRESULT_TYPEDEF_(0x8004E024L)VarI4FromStr(STANDARD_RIGHTS_EXECUTE | SERVER_ACCESS_ENUMERATE)(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_ENC_KEY)0x00E3_HRESULT_TYPEDEF_(0x80030102L)20x06"SySyßnc SyncML Diagnostic Tool"8415LOpenSemaphoreAFILE_DEVICE_CHANGER0x0000000420x00000000_HRESULT_TYPEDEF_(0x80030019L)86_HRESULT_TYPEDEF_(0x8011040BL)8379L77_HRESULT_TYPEDEF_(0x80080005L)QueryServiceLockStatusA(BDßR_RAISEDOUTER | BDR_RAISEDINNER)0x000A0x10b0x0(CERT_COMPARE_SIGNATURE_HASH << CERT_COMPARE_SHIFT)IsCharLowerA(1)0x00080x00000200L((HWND)0)0x000000000x0002_HRESULT_TYPEDEF_(0x000401E6L)GetTextExtentPoint32A1929Làß0x00000002L0x000000203000x3000000020x04000000L0x000000040x0004L0x00002000196L0x00000x00001Bff0x00020000L11008L0x00008000_HRESULT_TYPEDEF_(0x80040167L)4305L157L4MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_V110, MDßM_GEN_V110_PROTOCOL_DATA ( MDM_V110_SPEED_1DOT2K ) )0x80000x400x1010x00000010_HRESULT_TYPEDEF_(0x800F0225L)0x84000000(WM_USER+4)0x00000200MB_ICONEXCLAMATIONV_UNION(, parray)0x1000_HRESULT_TYPEDEF_(0x80040006L)àß( 1 << CERT_QUERY_FORMAT_BASE64_ENCODED)GetOpenFileNameA0x00BC0x01000x0e0x00020000L29( _RC_NEAR | _PC_64 | _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW | _EM_UNDERFLOW | _EM_INEXACT | _EM_DENORMAL)11UL1393L0x0002"ß2.5.29.2"0x08454110x000A"PKCS7"7"1.2.840.113549.1.7.3"FW_SEMIBOLD380x00000x00020x00020000L(SHORT)-1000x100x0000800030x00000800L3()4(0xC0000000L)0x000200009(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERßF_COUNTER_BASE | PERF_MULTI_COUNTER | PERF_DISPLAY_NOSHOW)7( 11 )0x0940"1.3.6.1.5.5.7"STATUS_ARRAY_BOUNDS_EXCEEDED0x00x0102L7void CALLBACK0x0002"ReturnMessage"0x000000080x0EnumResourceLanguagesASCARD_ATTR_DEVIßCE_SYSTEM_NAME_A_HRESULT_TYPEDEF_(0x80110428L)0x00000007L0x01392L0x3A00x00000100L0x200022L0x00000001L0x003200000x00208231L(STANDARD_RIGHTS_EXECUTE)0x000000010x000A00008212L0208020x0200SQL_C_ULONGRpcServßerUseProtseqEpExA4327L4((CHAR)0)14(BF_DIAGONAL | BF_TOP | BF_RIGHT)1MM_WOM_DONEGetTickCount()CharLowerA8310L0x170x048c"1.3.6.1.4.1.311.13.2.1"0x048b0x048aCharToOemA(-12)0x00000200L"2.5.29.3"00x04890x000ß10x010x048f0x048e2579605L(TEXT("application/fractals"))0x048d60x10010x000000080x00000003LTEXT("SeTakeOwnershipPrivilege")0x360x0000000bL0x000000172_HRESULT_TYPEDEF_(0x80010122L)0-21308L11ERROR_INVALID_PßARAMETERmixerGetControlDetailsA20xF31104L(JOYERR_BASE+5)120x800000010x00039701L1901L0x00040000870x00x000100000x000000200x29A0x000000046010L1413L1(-14)469L6DECLSPEC_IMPORT1128L0x020x00000100((()ß < ()) ? () : ())0x000001001152000x000B203LRGN_AND0x000002000x000002000x000000011827LSQL_INTERVAL_MONTHIMAGE_FILE_MACHINE_ALPHA64MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_PIAFS, MDM_PIAFS_INCOMING )((((ULONG)(ß)) << 16) | ((ULONG)()))320x00040000AF_UNSPEC0x00510x00000008L"1.2.840.113549.1.9.20"0x800000000x00040x000010000x00021850LMAKEINTRESOURCE(23)0x8004011FL(0x00000001L)0x00004000LRegReplaceKeyA0x0100000016àß3STATUS_FLOAT_INVALID_OPERATION14DWORD1L6V_UNION(, uiVal)0x004000000x100000000x00000002L0x00041329L90V_UNION(, bVal)0x010000004313L50(2 << 9)595((DWORD)-10)0x00110x000C13V_UNION(, ulVal)(CERT_CßOMPARE_ATTR << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)0x08530x0000000382L( 0x20 )RpcStringFreeA((UHALF_PTR)~0)V_UNION(, ullVal)0x00000001(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_DELTA_CßOUNTER | PERF_TIMER_TICK | PERF_MULTI_COUNTER | PERF_DISPLAY_PERCENT)0xF09010x080B0x00000001L(DS_SETFONT | DS_FIXEDSYS)0x80000000L0x018A_HRESULT_TYPEDEF_(0x80110437L)10x02VarI4FromDate(0x0030 | XCLASS_BOOL )177ß4102CCSIZEOF_STRUCT(PROPSHEETHEADERA, pfnCallback)1460x02220x1024AddMonitorA42844210210x000000020x130x000000250x400000001165L57600_HRESULT_TYPEDEF_(0x8009300FL)(CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)0x0ß004014FL0x40((UINT)(UINT_PTR) () )(0x00D0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)(*(_INT32*)&)VerQueryValueA4320L4IID_IBindHost0x804331L_HRESULT_TYPEDEF_(0x80040110L)V_UNION(, pulVal)0x00008000420x0223CEßRT_FIND_VALID_ENHKEY_USAGE_FLAG0x0002(0x10)_HRESULT_TYPEDEF_(0x80020010L)0x00000400L0x00000100LNULL(-11)0x00000020L_HRESULT_TYPEDEF_(0x8004130FL)((WORD)0x0008)0x000E123(0x00000007L)(0 != ( & CRL_DIST_POINT_ERßR_CRL_ISSUER_BIT))0x01550x00001000L95001UL0x7(MCIERR_BASE + 9)IME_CMODE_NATIVE0x0000000025CoInternetCompareUrlwglUseFontOutlinesA0x040x000400000x0001_HRESULT_TYPEDEF_(0x80110433L)CTL_CODE(FILE_DEVICE_SERIAL_PßORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)0x00010x80000000S_un.S_un_w.s_w2337_HRESULT_TYPEDEF_(0x800F0203L)((WORD)0x0001)0x00000001((WORD)0x0002)(0x4)39( 0x1 )(WM_USER + 101)"CertDllVerifyCertificateChainPolicy"(ß(WORD)0x0004)0x000820x0000002L_HRESULT_TYPEDEF_(0x8004016CL)180x000000020x10001(REG_OPTION_RESERVED | REG_OPTION_NON_VOLATILE | REG_OPTION_VOLATILE | REG_OPTION_CREATE_LINK | REG_OPTION_BACKUP_RESTORE | REG_OPTION_OßPEN_LINK)_HRESULT_TYPEDEF_(0x80010001L)9005Lconst IID &FreeEnvironmentStringsA120x13TEXT("SeSecurityPrivilege")470x000000020xfVarI4FromDisp_HRESULT_TYPEDEF_(0x00030205L)10240x000000080x000000060x00000004GetßClassNameA0x0200SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003)240x01000x20000x80000000LV_UNION(, cyVal)1(QS_MOUSEMOVE | QS_MOUSEBUTTON)"1.3.14.7.2"0x00000002(ALG_CLASS_SIGNATURE | ALG_TYPE_DSS | ALG_SID_DSS_ANY)ß(WM_DDE_FIRST+2)0xF90x000000020x0006GetKeyboardLayoutNameA3((LPCSTR) 12)9L0x070x00300x0000005A_HRESULT_TYPEDEF_(0x80093013L)_HRESULT_TYPEDEF_(0x8001010EL)((DWORD )0x80000004L)WriteConsoleA0x0850CoInternetQuerßyInfo0x0031_HRESULT_TYPEDEF_(0x80110411L)0x0000002014_HRESULT_TYPEDEF_(0x8004006CL)8465L0x800000080x8000000010x0008L320x00000002L0x000000010x00100x00001000SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0005)0x00000ß800_HRESULT_TYPEDEF_(0x8004E003L)0x21607L2V_UNION(, puiVal)0x00020x3C6505011L40x019191826L0x200D((LPCSTR) 13)mciGetDeviceIDA7022L5017L(0x0080)6"2.16.840.1.101.2.1.1.7"00x10x0000004000x00000002L0x0ß0A9TEXT("SchedulerThreadPriorityDefault")6((DWORD )0xC0000094L)36(MCIERR_BASE + 18)0x00000002L0x2GetDlgItemTextACOLOROKSTRINGA0x00000031MM_MOM_DONE(PERF_SIZE_ZERO | PERF_DISPLAY_NOSHOW)0x04_HRESULT_TYPEDEF_(0x0ß00401E4L)((HRESULT) (() | FACILITY_NT_BIT))1343L0x0080L600x000000220x000008000x001256L8470L0x000001000x0000002025075L0x000000000x00000200LSHGetDiskFreeSpaceExA40x0001L10V_UNION(, pbVal)"2.5.4.26"PosßtThreadMessageA3RpcStringBindingParseA0x41"1.3.6.1.4.1.311.10.3.4"4_HRESULT_TYPEDEF_(0x8004000EL)920x20x3CGUID_NULLV_UNION(, pvarVal)0x02(-2)0x08560x0010SetDlgItemTextA0x203((LPCSTR) 16)"2.16.840.1.101.ß2.1.1.8"0x015e_HRESULT_TYPEDEF_(0x80028CA3L)(MIDIERR_BASE + 4)2402_HRESULT_TYPEDEF_(0x80010131L)0x0002(0x00000004L)(* (double *) __double_min)0x0000000450x00028013L7050L0x000x0000000B0x0000000211_HRESULTß_TYPEDEF_(0x80041313L)0x05TEXT("DNSMachineName")(( HKEY ) (ULONG_PTR)((LONG)0x80000003) )3410045L7012L0x00008000L0x000110x00000100((BYTE)0x02)_HRESULT_TYPEDEF_(0x80040160L)ERROR_OUTOFMEMORY58L( sizeof()==8 ?ß *(1+(_INT32*)&) : (*(_INT32*)&))VarUI4FromCy2STATUS_IN_PAGE_ERROR STDMETHODCALLTYPE0x00001E00SNDMSG(, PSM_GETRESULT, 0, 0)0x0002"1.3.14.3.2.29"0x0001_HRESULT_TYPEDEF_(0x80028027L)65L0x002300000x00010000ßL39_HRESULT_TYPEDEF_(0x8011043BL)5015L0x0007ffff1L".Default"0x00000001L2(DWORD)0x00BB0226STATUS_FLOAT_OVERFLOW((LPCSTR) 500)(SND_ALIAS_START + (DWORD)(BYTE)() | ((DWORD)(BYTE)() << 8))_HRESULT_TYPEDEF_(0x800ß401FCL)6HRESULT STDMETHODVCALLTYPE11CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)8860x0001((LPARAM)(DWORD)MAKELONG(, ))3EnumSystemCodePagesA0xE421237LSTATUS_GUARD_PAGE_VIOLATIONSCARßD_ATTR_VALUE(SCARD_CLASS_PERF, 0x0003)0x0008LDECLSPEC_IMPORT391UL0x400006PSM_SETHEADERTITLEA0x206870x0002000010106L380x01014((DWORD)-1)_HRESULT_TYPEDEF_(0x80110408L)5052L1017L0x00000400L0x000000010x0400ßL630x00000010L_HRESULT_TYPEDEF_(0x80030050L)( 0x0020 )0x047c20x047b0x00030x047a0x00060000(MMSYSERR_BASE + 5)0x0479(MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_DECIBELS)0x047f240x015138506L8355L50ß65L1215LFindExecutableA0x047e"SysItems"0x2000((LPCSTR) 45)0x0000000040x047d267L((LONG)(((WORD)((DWORD_PTR)() & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)() & 0xffff))) << 16))VarI4FromUI40x0000000f(ALG_CLASS_KEYß_EXCHANGE|ALG_TYPE_DH|ALG_SID_DH_EPHEM)0L_HRESULT_TYPEDEF_(0x000401A0L)13L((DWORD )0x80000003L)0x00081831L0x040000000x00040(0x00000020L)0x014B0x00040x00000008L136_HRESULT_TYPEDEF_(0x00040200L)1424L50x20080ßx00008000LSQL_TXN_CAPABLE0x00020000MS_DEF_RSA_SIG_PROV_A0x0027182L0x006000000x010x00000200AF_UNIX0x0020_HRESULT_TYPEDEF_(0x80110413L)30xFASetVolumeLabelA0x00000002_HRESULT_TYPEDEF_(0x8009001CL)LPIINTERNETPROßTOCOLINFO17(MCIERR_BASE + 86)489018L_HRESULT_TYPEDEF_(0x00040202L)0x0366(MCIERR_BASE + 26)1444L122L((() > ()) ? () : ())GlobalFindAtomA0x000400000x000220x0000000eL_HRESULT_TYPEDEF_(0x8009310AL)(MCI_CßD_OFFSET + 0)170x000001000x3C40x2b0x000000010x000200000x00040x000000040x00010x00010x00000100L(PERF_SIZE_DWORD | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX)(WM_DDE_FIRST+3)TEXT("SeSyncAgentPßrivilege")__declspec(selectany)"2.5.29.14"0x80000000(LONGLONG)((LONGLONG)(LONG)() * (LONG)())0x0004ImmGetRegisterWordStyleA191L(-3)0x000000010x00801161L9(~(DDE_FACKREQ | DDE_FDEFERUPD))0x8004013FL0x0002(AßLG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_AGREED_KEY_ANY)0x00000000L(DWORD)0x00EE0086_HRESULT_TYPEDEF_(0x80110423L)0x00100x0002(-20)9616L0x00000008"1.3.14.3.2.8"0x00000001L0x00000080L33728522L"1.2.840.113549.1ß"20x0100000040x01000000L(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)11(DCB_RESET | DCB_ACCUMULATE)5049L0x00CF8201L0x00000006L_HRESULT_TYPEDEF_(0x00041305L)(MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_PERCENT)àß0x00000002LUILANGUAGE_ENUMPROCA0x000000294((LPCSTR) 2)0x00000100L0x00030003L0x00000020((STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & (~SYNCHRONIZE))__stdcall0x001CRGN_COPY6000Lß8SQL_SEARCHABLE40x000000100x800401BFL40x000700000x00040x00100x003F0x000400000x800401C0LWM_WININICHANGE0x01020x00200000L1614L11"1.3.6.1.4.1.311.10.6.2"12VarUI4FromStr_HRESULT_TYPEDEF_(0x8009202CL)_HRESUßLT_TYPEDEF_(0x80080009L)_HRESULT_TYPEDEF_(0x80004008L)virtual HRESULT STDMETHODCALLTYPE 200(DWORD)(((() << 8) & 0xFF000000) | ())0x0008180x00000034121909L0x010x000000200x000000350x000000360x00004000LMIDLß_user_free0x000000377008LSQL_MAX_INDEX_SIZETA_TOP0x000000310x0200L0x000000320x000000010x00000003L0x000000330x00004000L0x0166170x0000000971626L0x0000000FL0x00000004L0x00004005L0x0004012FL0x00000080(MCIERßR_BASE + 36)5001L{0,0,0,0,0,5}1140x000000020x01007013L510x000000110x00F00x0501MAKEINTRESOURCE(1)1( 11 )((()&MDM_MASK_PROTOCOLINFO ) |((()<Buffer)++; }0x00070x00000001L0x00000100LEnumPrinterDriversA"2.16.840.1.101.2.1.1.11"0x000000010x07FF0xß000000068510L28far11801L0x080C0x00800000L_HRESULT_TYPEDEF_(0x80110410L)0x0000020003520x0000L0x2()->tv_sec = ()->tv_usec = 00x00000004L0x1e1009V_UNION(, bstrVal)0x00000004_HRESULT_TYPEDEF_(0x800F022FLß)0x000004000x800000000x000eGetCompressedFileSizeA_HRESULT_TYPEDEF_(0x80040166L)0x000A0x010000000x00000020L0x00000008L0x000000021415L0x200000000x00000x0000040054(MCIERR_BASE + 44)0x800401DFL0x0040836_HREßSULT_TYPEDEF_(0x8009200BL)8552L1254L1452L0x000000370x00080x0143__stdcall0x40000000110x800008001511(-4)((DWORD)-11)0x00000008L171CallMsgFilterA1155L0x0003335_HRESULT_TYPEDEF_(0x80040151L)0x00000001L0x0ß00000100x8000290x0007(0x3<<6)0x00800x0F27((DWORD) 'V')90x01817011L((LPCSTR)1)870x0080LLookupAccountSidA320x520x000000080x00D7770x00BE14_memicmp0x00000004L0x00002000_IOR('s', 7, u_long)84CertOpenSyßstemStoreA(MCIERR_BASE + 24)COLOR_BTNFACE950xF0800x000004000x0004((void) 0)0x10x800000x4000VarUI4FromUI40x00020000LLPOPENCARDNAME_EXA((LPCSTR) 34)515VarUI4FromUI20x00001D06(MCIERR_BASE + 93)8317LCommConfßigDialogA0x000000100x0000010190x00800000LVarUI4FromUI1"2.16.840.1.101.2.1.1.17"(MCIERR_BASE + 31)0x00000800DECLSPEC_IMPORT0x00000001LSCARD_CTL_CODE( 3)ChooseColorA0x000000010x01A00x1000001000x3002DialogBoxßIndirectParamASQL_U_UNION_ALL0x000E0x020x00000005L0x00000001L_HRESULT_TYPEDEF_(0x800F0222L)((LPCSTR)3)DefineDosDeviceARpcNsProfileEltInqBeginA0x00000000L50x200000000x00000001LBuildCommDCBAndTimeoutsA((INT)(INTß_PTR) () )00x000000590x08002560x4000000021169L0x000000080x00010x0c30x598558L((DWORD)0x00000020)1099380x00011260x000017ff0x40100x030x00000000L-10x0080L230x00000200L9651L((DWORD )0x40010008L)20ßx8004015FL9614L0x0008__try {BN_HILITE21629L0x00FF0x0040_HRESULT_TYPEDEF_(0x80100009L)0x00090x011F0x110(TEXT("image/x-png"))0x6E0x1000260x08000x02L0x00000004BeginUpdateResourceA0x00004000183161100x0ß0FF"TimeValidDllGetObject"0x00013((DWORD)0x00000080)20x40000x800401A0L10064L0x002016628548L17(MCIERR_BASE + 85)0x0001TEXT("SeTcbPrivilege")(0x0001)1PSM_SETFINISHTEXTASIZE_MAXSHOW_HRESULT_TYPEDEF_(0x800B0ß002L)"Synthesis SyncML Client/" SYSYNC_FULL_VERSION_STRING " [en] (" SYSYNC_PLATFORM_NAME "; I)"_HRESULT_TYPEDEF_(0x800F0001L)8402L(0x0000000AL)0x00000004L"1.3.6.1.4.1.311.10.7.1"39704L0x000000080x00100000SQL_CB_CßLOSE0x00000001L0x0000003(TEXT("video/avi"))2ULCreateAcceleratorTableA(0x7<<3)"2.16.840.1.101.2.1.1.9"0x00000000L0x0010L(SQL_C_LONG+SQL_UNSIGNED_OFFSET)1MF_MENUBARBREAK1455L3UL1_HRESULT_TYPEDEF_(0x80010111L)0ßx00400000LPSCARD_READERSTATEWGetCurrencyFormatA0x00008000L60x010000000x0187320x400x00000800EnumPrinterDataA((LPCSTR)1)40x000004000x10000000L0x10080x00000004_HRESULT_TYPEDEF_(0x80070057L)0x00000020SCardListßCards0x000000020x00000400L_HRESULT_TYPEDEF_(0x80093108L)_HRESULT_TYPEDEF_(0x80093103L)20x00000100L0x0285((VARIANT_BOOL)-1)_HRESULT_TYPEDEF_(0x8009300AL)SCardRemoveReaderFromGroupALPSCARD_READERSTATEA0x00000001_HßRESULT_TYPEDEF_(0x80030008L)2005L"OffloadModExpo"_HRESULT_TYPEDEF_(0x80100014L)11520x00100x2000130x00000008{ *() = *(*(char __RPC_FAR * __RPC_FAR *)&()->Buffer)++; }8544L0x00008000L118L0x00401381L1379L0x0ß0010x00020x00004006L0x8000GetTextExtentExPointA0x02FB(MCIERR_BASE + 45)_HRESULT_TYPEDEF_(0x8010001CL)0x20011075LGetObjectA84326L0x00001000"2.16.840.1.101.2.1.1.16"0x000010000x00000008__stdcall0x000d_HRESULßT_TYPEDEF_(0x800F0210L)1L0x0194(MCIERR_BASE + 81)1018326L(0x7fffffffffffffff)320x0210001CryptAcquireContextATextOutA0x00002000LTabbedTextOutA143L0x00040000L255CharUpperBuffA0x020000x0008140x000010090xß00060x00000010L24210L11114L0xffff211073L_HRESULT_TYPEDEF_(0x8001012DL)SQL_QU_TABLE_DEFINITION0SECURITY_ENTERPRISE_CONTROLLERS_RIDSetWindowsHookExA11158LSTATUS_USER_APC1150x001F(-1)0x00004009L11438471Làß1398LSQL_OJ_CAPABILITIES(SOCKET)(~0)39L(-5)0x000401F0L210x000000080x0800(MMSYSERR_BASE + 21)186L(STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE)10ß50x0000020010_HRESULT_TYPEDEF_(0x80090310L)8357L0x01000000(CONTEXT_i386 | 0x00000020L)0x00000002_HRESULT_TYPEDEF_(0x80093020L)5024L0x00023L169"1.3.6.1.5.5.7.48"0x00000001sndAlias('S', '!')RegisterClassExA(MßIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_UNSIGNED)0x01969((WORD)0x0010)156280x10x0000000AL0x00000008(0x00000223L)2(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_DELTA_COUNTßER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_MULTI_COUNTER | PERF_INVERSE_COUNTER | PERF_DISPLAY_PERCENT)3011LSQL_ROW_NUMBER_HRESULT_TYPEDEF_(0x80093017L)0x00000008L_HRESULT_TYPEDEF_(0x8009000AL)0x00040150L0x00000ß200L50x00005045L((HFILE)-1)((LPCSTR) 13)(2U << 8)7MAKEINTRESOURCE(16)10x00000001L0x01210022(WM_USER + 116)0x0008GetDriveTypeA10190x00000800L(int)SNDMSG(, PSM_HWNDTOINDEX, (WPARAM)(), 0)(PSN_FIRST-9)4àß"File"0x158395L0x0000000dL(0xFFFFFFFF)20x800x0002(GMEM_MOVEABLE | GMEM_ZEROINIT)0x00000x00000008ERROR_NOT_CONNECTED150x00000001L(-()+SQL_LEN_BINARY_ATTR_OFFSET)0x0008L0x00078239L0x000000800x000C0_HRESUßLT_TYPEDEF_(0x8000FFFFL)213_HRESULT_TYPEDEF_(0x800F0223L)_HRESULT_TYPEDEF_(0x80093003L)1459L2212985_HRESULT_TYPEDEF_(0x80090012L)_HRESULT_TYPEDEF_(0x80010112L)70x0010()"ExpoOffload"60U0x04ff30x00000020àß0x00020x00000010L88556L0x00110110xFFFF000054IInternetBindInfoCryptRetrieveObjectByUrlA519GetWindowLongA0x00004002L_HRESULT_TYPEDEF_(0x80092008L)(((long)() & 0xc0000000) == 0x80000000)18(((long)() & 0xe00ß00000) == 0xc0000000)905(((long)() & 0x80000000) == 0)30UL8"2.16.840.1.113730.1.7"123444VarUI4FromDec11"2.5.8.1.1"L"Microsoft Strong Cryptographic Provider"_HRESULT_TYPEDEF_(0x800F0213L)0L0x00000002L50x00ß100x0004SQL_MAX_DRIVER_CONNECTIONS(3 << 9)10043L39VarR4FromUI4_HRESULT_TYPEDEF_(0x800C000BL)1904L(WM_USER + 134)ERROR_INVALID_USER_BUFFER_HRESULT_TYPEDEF_(0x80097005L)DeletePrinterKeyA'USRC'"Microsoft Strong Crßyptographic Provider"0x670x80000x020000000x000500000x66((STATUS_ABANDONED_WAIT_0 ) + 0 )( (() & 0x40000000) )((DWORD )0xC0000005L)0x00002000L0x65_HRESULT_TYPEDEF_(0x80020004L)0x00CC0x641433L0x630x000C0x000ß80x62MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_GPRS, 0 )__cdecl20x610x60DMBIN_FORMSOURCE_HRESULT_TYPEDEF_(0x8011041AL)0x00008000L0L0x000B00000x000401D0L0x00000008LSC_GROUP_IDENTIFIERA0x000000010x000a200x692L0xß00010x680x0003L1922L"CertDllEnumSystemStore"0xA5mmioRenameA7SetComputerNameA5018L2_HRESULT_TYPEDEF_(0x80100028L)1SQL_CONCUR_ROWVER0x40x70068232LLPIINTERNETPROTOCOLSINKMAKEINTRESOURCE(32642)RegisterClipboarßdFormatA3007L((DWORD)(BYTE)() | ((DWORD)(BYTE)() << 8) | ((DWORD)(BYTE)() << 16) | ((DWORD)(BYTE)() << 24 ))__declspec(uuid())_HRESULT_TYPEDEF_(0x8009310CL)POINTER_320x00000100waveOutGetErrorTextA0x0000(0xß0008)0x000900000x04000x00020x000000200x400e0x000000200x010x000E(MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT))6((LPCSTR)3)8344L0x00000800L700x08(3U << 8)SQL_COLUMN_TABLE_NAME0x160x00000080ERROR_ALREADY_INITIAßLIZED00x00140x00004002L9__stdcall0x00000200L20x0E_HRESULT_TYPEDEF_(0x8002000AL)1012(CDM_FIRST + 0x0002)0x012000x02141812L8327L0x810000003417"1.3.6.1.4.1.311.17.2"0x800401B0Lasm_HRESULT_TYPEDEF_(0x80041ß310L)SQL_MAX_CURSOR_NAME_LEN0x1007(0U-601U)AF_BAN(-2)(0x0100)1727L650(( == PARTITION_EXTENDED) || ( == PARTITION_XINT13_EXTENDED))11156640x000080000x00018462L0_HRESULT_TYPEDEF_(0x8002000BL)0x0020_HRESßULT_TYPEDEF_(0x80100002L)_HRESULT_TYPEDEF_(0x8009302BL)VarI4FromUI40x00000004(5 << 9)164L0x0004L0IMAGE_ORDINAL_FLAG320x00000100L9004L0x000C"2.5.29.19"0x00010000_HRESULT_TYPEDEF_(0x80093109L)0x012C170x0000200ß0L0x000000040x000000086CERT_STORE_PROV_SMART_CARD_W0x00000080L1(MCIERR_BASE + 87)70x01F98256L(((uInt32)SYSYNC_VERSION_MAJOR<<24)+((uInt32)SYSYNC_VERSION_MINOR<<16)+((uInt32)SYSYNC_SUBVERSION<<8)+(uInt32)SYSYNC_BUIßLDNUMBER)(DWORD)0x003300080x0004(0x20000000L)24(WM_USER + 128)0x00010x00000100L(MCIERR_BASE + 82)0_HRESULT_TYPEDEF_(0x800B0004L)13SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0206)1454L1225L(-1)((DWORD )0x400ß10004L)5_HRESULT_TYPEDEF_(0x8002802BL)4201Lmemset(,,)CERT_STORE_PROV_SYSTEM_W_HRESULT_TYPEDEF_(0x800C0007L)320x00000002_HRESULT_TYPEDEF_(0x80100016L)110x0b(0x00000001L)0x00060x0000000cL00x000d0x000008ß00LSCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0204)"2.5.4.11"_HRESULT_TYPEDEF_(0x8002000CL)0x00004000SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0203)"2.5.4.18"RpcNsEntryExpandNameA0x00000001210x00000002L0x03FßF191624L0x000100000x00020000L30x00001600(WM_USER + 127)0x410067L0x7ffe8320L4096SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0205)0x0000002a0x00000400l0x0000100C200x00000800103_HRESULT_TYPEDEF_(0x80040169Lß)8550L5006L(((()&~N_BTMASK)<= 0)1SQL_INTERVAL_MINUTE_TO_SECOND-10x3030x0000010054REGISTERWORDENUMPROCA((DWORD)0x00000004)MapVirtualKeyExA23MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PROTOCOL_DATA ( MDM_X75_DßATA_BTX ) )lstrcmpA"CertDllUnregisterPhysicalStore"0xC0000000CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)(CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)16àß0x00000200400x01003(NULL)_HRESULT_TYPEDEF_(0x80092001L)0x012E0x000080005041L0x200x00000010790x0006SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0002)10x00000002L"1.3.14.3.2.16"(PERF_SIZE_DWORD | PERF_TYPE_NUMBER | ßPERF_NUMBER_HEX | PERF_DISPLAY_NO_SUFFIX)((DWORD)0x00020000)9007L0x00040000LSQL_ALL_EXCEPT_LIKE(2*4)0x000000000x0001(BDR_SUNKENOUTER | BDR_SUNKENINNER)0x00200x00000005L0x4b0x00000007L1322L"2.5.29.17"((BYTE)(((ßWORD)()) >> 8))SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, 0x0131)0x0000000FL0x022141_HRESULT_TYPEDEF_(0x80093027L)0x1000x00000002L108(MMSYSERR_BASE + 17)0x10021328L0x00000024160x0D0x25_HRESULT_TYPEDEF_(0x80ß00400CL)0x00000008L1747L0x4011_HRESULT_TYPEDEF_(0x80110448L)_HRESULT_TYPEDEF_(0x800F0205L)10013L8468LCERT_FIND_SUBJECT_STR_W(int)SNDMSG(, PSM_IDTOINDEX, 0, (LPARAM)())0x00000002L_HRESULT_TYPEDEF_(0x80030070L)ß8554L( 1 << CERT_QUERY_CONTENT_PFX)8480LGetVolumeInformationADeleteFileA0x000x00000200L"1.2.840.113549.1.9.16.3"0x0000(LMEM_FIXED)00x020A800x001011456L(0x40)51L(1 << CMSG_HASHED)SHInvokePrinterCommandA0x0ß003L0x00100000LCharToOemBuffA8331LOpenPrinterA(0U << 8)0x000040000x0000001FL9SQL_NUMERIC2(-3)0x000000400x000000080x00000004L0x0e0x57"0"MapVirtualKeyA1363L8_HRESULT_TYPEDEF_(0x800F020AL)SQL_INTERVAL_DAY_ßTO_MINUTE_HRESULT_TYPEDEF_(0x80097007L)10052L9751L8304L0xEC0x00350x00040000L0xED10xEB1302L0x00000000L0x0fMM_WOM_OPEN1377L((DWORD)0xE73CF52E)::std0x00080000L_HRESULT_TYPEDEF_(0x800F0209L)0x00x37SCARD_ATTßR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303)(WORD) -11_HRESULT_TYPEDEF_(0x8001FFFFL)1431L1040MAKEINTRESOURCE(32514)0x7fff{ ().x = (LONG)(SHORT)LOWORD(*(LONG*)&); ().y = (LONG)(SHORT)HIWORD(*(LONG*)&); }1749L10MßDM_SHIFT_BEARERMODE0x40x00000026(MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN)0x0000000BL144001L0x00000002_HRESULT_TYPEDEF_(0x8000000AL)IID_IInternetProtocolRoot"ß2.16.840.1.113730.1.3"0x0000400AL40x00000009290x01010x00080000L18240x00004008Lunsigned short0x010x000200000x000000011808L0x0000000C0x00040000L8008L_HRESULT_TYPEDEF_(0x800C000EL)VarI4FromUI20x00000001"2.5"àß(MCIERR_BASE + 25)10070L275LVarI4FromUI10x000000000x0800000070((LPCSTR) 35)VarI4FromUI4(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)8533L59510109L0x04000x00000002L0x030F8373L00x0000000155242640x00080000ßL0x10000x00200000(MMSYSERR_BASE + 18)8484L19"EncodingType "(MCIERR_BASE + 48)DeletePrinterDataA4121_HRESULT_TYPEDEF_(0x80110401L)91(-4)TEXT("SeCreatePagefilePrivilege")CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOßD_BUFFERED, FILE_ANY_ACCESS)0x00004003L103( 0x1 )1110x00F70x0000004L(MCIERR_BASE + 49)_HRESULT_TYPEDEF_(0x80090309L)104VarUI4FromUI439(0x00000001L)0x00100x00080x08000000L0x000000226002L1715L1250L0x00000ß400MAKEINTRESOURCE(3)2TEXT("printStaplingSupported")0x010x00000008L4_MSL_LOCALE_C"1.3.14.3.2.20"3GetCommandLineALPOPENCARDNAME_EXW"1.3.6.1.5.5.7.3.2"3SEC_E_UNSUPPORTED_FUNCTION8014L30x01850_P_OVERLAY0x000ß00001(0x8000)7016L1077L0x00004000L60x000000029703L0x2004extern "C" {0x00000100L10x00000008L11851641100x00010000L20x000000020x00040x0844InitiateSystemShutdownExA0xE6ObjectDeleteAuditAlarmA0AppendMenuAàß0x08031((unsigned long)() >> 31 == SEVERITY_ERROR)(0x1)0x00000001OutputDebugString1710L0x00040x800000000x0100256( 0x80 )(MIDIERR_BASE + 3)14"CryptDllFindLocalizedName"IInternetProtocolSinkStackable40L16ß0x050050x0004015FL(GMEM_FIXED | GMEM_ZEROINIT)0x00004000L((LPCSTR) 7)0x00000002L0x000000080x000000040x0010_MSL_CLOCKS_PER_SEC0x208328L((DWORD )0xC0000025L)1lstrcpyA((HWND)0xffff)0x4653504540980x000000100xß0100((LPCSTR) 8)0x00004006L0x0040L( 0x80000000 )(-2)1919L0x000000100x0922134L0xFFFFFFFFL16890x01359FILE_SUPPORTS_ENCRYPTION991(~(DDE_FACK | DDE_FBUSY | DDE_FAPPSTATUS))160x080x042d_HRESULT_TYPEDEF_(0x80ß00401DL)10x042e0x000000000x3C20x042f_MSL_OFFSETOF(, )VarCyFromI40x00001A019617L110x042930x8000130x042a13_HRESULT_TYPEDEF_(0x8004130BL)0x042b1168L0x042c0xFFFFFFFFCTL_CODE(IOCTL_CHANGER_BASE, 0x0007, ßMETHOD_BUFFERED, FILE_READ_ACCESS)0x00000010L90x01110x80040130LMS_ENH_DSS_DH_PROV_A718140x100721150x00000002_HRESULT_TYPEDEF_(0x80110425L)60x80000x080x00000002LObjectPrivilegeAuditAlarmA0x00000001_HRESULTß_TYPEDEF_(0x800401C4L)4CERT_STORE_PROV_LDAP_W120x00F60x040x040x000000020x6F0x00000080((WORD)0x0800)0x800000200x000000404110((LPCSTR) 2)0x0000000DL21L0x00018409L((LPCSTR) 47)80x000400000x21348L0x000000ß01LPrinterMessageBoxA8466L(LMEM_MOVEABLE)TEXT("printerModel")MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUTH_DEFAULT, MDM_HDLCPPP_ML_2 ) )1630x000ß401DFL60x00000024_HRESULT_TYPEDEF_(0x80100003L)MAKEINTRESOURCE(32641)0x002ECERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED118254L3"commdlg_LBSelChangedNotify"0x0000000119_HRESULT_TYPEDEF_(0ßx800B010BL)0x0003000A_HRESULT_TYPEDEF_(0x80029C83L)0x00000001((LPCSTR) 8)(MCIERR_BASE + 32)(0x0020)0x00000002L9(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_PRECISION | PERF_TIMER_100NS | PERF_DELTA_COUNTER | ßPERF_DISPLAY_PERCENT )0x100b0x00000100L0x3C80x00000042CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)0_HRESULT_TYPEDEF_(0x8010001BL)0x0000000B0x80000x100x00020000l0x00000008((DWORD )0xC0ß000095L)L"commdlg_LBSelChangedNotify"195L240x00000001L0x00180x00000001(0x00000003L)0x000000200x0001_HRESULT_TYPEDEF_(0x80010004L)0x00000001NO_ERROR6(MIXERCONTROL_CT_CLASS_TIME | MIXERCONTROL_CT_SC_TIME_MILLISECßS | MIXERCONTROL_CT_UNITS_UNSIGNED)WNetCancelConnectionA1451LTRUE0x00000004L0x01004210x00B52sz_CERT_STORE_PROV_SMART_CARD_W92(STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGERß_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG)2L0x000200VarBoolFromI4CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00020000L0x30x420xß00002000L0x00000002400x0D181072L0x001F0x47(DRV_MCI_FIRST + 0x400)0x00000080L0x040xC00000000x0000000108423L0x000000040UL0x000000020x00020000L0x0227"1.2.840.113549.1.7.1""2.5.29.18"GetEnhMetaFileDescriptißonA0x00040000MM_MOM_OPEN120x01000x0000008L0x10x00200000DlgDirSelectExA0x00000040L_HRESULT_TYPEDEF_(0x00040100L)0x00000002L811410LLookupPrivilegeNameA0x004040x000401EFLSendNotifyMessageAWH_MAX"1.2.840.100ß40.4.1"SQL_TIMESTAMP(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)SQL_QU_INDEX_DEFINITIONSQL_INTERVAL_YEAR_TO_MONTH8312L1442L1UL0x0000000480xß01000x40000000GetNumberFormatA0300x00000010L2(WAVERR_BASE + 1)SPI_SETSCREENSAVERRUNNING_HRESULT_TYPEDEF_(0x80090002L)_HRESULT_TYPEDEF_(0x00041304L)0x0008ImmIsUIMessageA98501830LNULLLoadIconARegisterServiceCtßrlHandlerExAEnumServicesStatusExA0x00004003L0x00000100L0x00000001L0x3D30x00000100DM_UPDATETEXT("SeIncreaseBasePriorityPrivilege")__declspec(dllimport)0x00000200_HRESULT_TYPEDEF_(0x80100023L)RegQueryInfoKeyA0x000ß000021(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_SKIPJACK)0x000010000x00018(0x3)0x1820490x00000000TEXT("SeLockMemoryPrivilege")X509_ENUMERATED0x700x0000000111EXTERN_C DECLSPEC_IMPORT  STDAPICALLTYPE0x00ß010x04000x000000040x0000000F_HRESULT_TYPEDEF_(0x800F021BL)4303L(__std(va_list)) ((long) (&) + ((((long) (& + 1) - (long) (&))+3)/4*4))(100 + SQL_CODE_DAY_TO_SECOND)CERT_RDN_DISABLE_CHECK_TYPE_FLAG0x000000100xß00000001L(LMEM_FIXED | LMEM_ZEROINIT)1361213L0x00020x00000x00000080L9761615L"Topics"0xffffSQL_COLUMN_UNSIGNED31480x00001607(TEXT("image/x-xbitmap"))_HRESULT_TYPEDEF_(0x800401F5L)1792L0x00000004L600x0000ß001000x4003_HRESULT_TYPEDEF_(0x80092026L)0x00080000GetFileVersionInfoADM_PROMPT( 0 )0x0010TEXT("RetryPopup")_HRESULT_TYPEDEF_(0x80093134L)1796L0x0000000c0x08040x0000001011603L1007_HRESULT_TYPEDEF_(0x80096005ßL)GetClassInfoA6CERT_GROUP_POLICY_SYSTEM_STORE_REGPATH L"\\EFS"SQL_DOUBLE100x004000000x0000000C0x10(CERT_SYSTEM_STORE_CURRENT_SERVICE_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)"CryptMsgDllImportKeyAgree""1.2.840.113ß549.1.7.5"_HRESULT_TYPEDEF_(0x80091011L)6MMIO_WRITE0x0008580x1"1.3.14.3.2"AF_APPLETALK0x000000020x215040x0830WNetAddConnectionA0x000000048610x00040000L7EnumSystemLocalesA118492L0x00002000L0x0100"2.5.4ß.24"0x0000002((HCURSOR)CopyIcon((HICON)()))_HRESULT_TYPEDEF_(0x80040156L)0x000F10x800x210x000000400x00001000L15VT_RESERVED_HRESULT_TYPEDEF_(0x80010104L)0x0000000CL0x130x04170x00ff0x04180x0000_HRESULT_TYßPEDEF_(0x80100068L)0x000000080x0001ERROR_CONNECTED_OTHER_PASSWORD500_HRESULT_TYPEDEF_(0x8011043FL)_HRESULT_TYPEDEF_(0x80010116L)0x00000200L(1 << VT_UI4)100x04130x00520x10(TEXT("text/plain"))0x000000020x04140xß04150x04160x00000080L0x0000000214538307LSECTION_MAP_READ(1 << VT_UI1)15410x04100x00100x00001000(1 << VT_UI2)"2.5.4.38"0x04112380x04120x0000001C0x00000080_HRESULT_TYPEDEF_(0x800B0101L)0x000000215044L0x0ß0811112LMAKELONG((),0x10FF)0x001D00000x80040120L((BYTE)0x00)0x01023SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0140)__declspec(dllimport)(STANDARD_RIGHTS_WRITE | JOB_ACCESS_ADMINISTER)MM_MIM_CLOSE(1U << 1)DNS_ERßROR_RCODE_BADTIME1321L(-125)21(0x00000001L)320CreateFileMappingA((DWORD)0x00000010)"CertDllRegisterPhysicalStore"0x430x001000002340x00010000L1ERROR_UNEXP_NET_ERR((DWORD)0x0002)00x22(-10)0x1002SHGetFileIßnfoA((LPCSTR) 50)((DWORD )0x80000002L)20x1595023L124L(_GetThreadLocalData(_MSL_TRUE)->errno)RPC_S_INVALID_TAG0x00040170L_HRESULT_TYPEDEF_(0x80097013L)(MIXERR_BASE + 2)0x800051060x0f409612L0x000000041797Lß1067L_HRESULT_TYPEDEF_(0x80041309L)(TEXT("image/pjpeg"))61417L0x100x000000105312011LFindResourceExAthrow ()63L435RpcNsProfileEltInqNextA0x000000100x00000080"1.3.6.1.5.5.7.3.6"357(() == CRYPT_FAILEDß)_HRESULT_TYPEDEF_(0x8010006DL)0x00000001L1SQLUINTEGER0x000100000x0000L90x00000001L180x0010L2L"2.16.840.1.101.2.1.1.13"10x0FFF0x000130x00010x0000midiOutGetErrorTextAMM_MOM_CLOSE50x00000004L0x01B0513ßMAKEINTRESOURCE((ULONG_PTR)RT_ICON + DIFFERENCE)0x00000001L(TEXT("video/x-msvideo"))10x00040x270L320x00100000_HRESULT_TYPEDEF_(0x80010134L)0x10000x1000L_HRESULT_TYPEDEF_(0x80091010L)1ULFILEOKSTRINGA0x00100000ß70x00000100L10110x00000001((LPCSTR) 1)0x000841156_HRESULT_TYPEDEF_(0x80090005L)740x00000002LWSAHOST_NOT_FOUNDS_un.S_un_b.s_b14304L311MCI_DEVTYPE_SEQUENCER5312100x0000004020x00004002LMultinetGetConnectißonPerformanceA(FILE_ANY_ACCESS)25109712L(0x00000201L)SCardConnectA( 0x1 )0x00002000L_HRESULT_TYPEDEF_(0x8001010AL)345(CDN_FIRST - 0x0002)0x00004001LEnumPropsA(TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)8ß012L0x4110071606L0x50010x000000010x000000010x0400STATUS_FLOAT_INEXACT_RESULT0x7f0000010TEXT("SeIncreaseQuotaPrivilege")0x00000080L45800x00000030L18444L1769L(0x00000002L)00x0100CTL_CODE(IOCTL_DISK_BASEß, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)94TEXT("SeBackupPrivilege")0x020x000000030__stdcall16210x0022000020x10040x6D75::0x00000001DRV_MCI_FIRST_HRESULT_TYPEDEF_(0x800F021DL)(-6L)FW_NORMAL1783LTEXT("ßprintSpooling")0x00020000L0x00000020L3989753L((LPCSTR) 24)0x014A0x00010x00004006L0x00040000L_HRESULT_TYPEDEF_(0x800401FBL)(THREAD_PRIORITY_HIGHEST-1)0x11F((LPCSTR) 31)0x00000800l"2.16.840.1.101.2.1"CTL_CODE(ßIOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)MUTANT_ALL_ACCESS(GCS_COMPREADATTR|GCS_COMPATTR)(()->)void_HRESULT_TYPEDEF_(0x8001011BL)0x0001((DWORD)0x00000010)111((DWORD )0x4000ß0005L)01UL0x00010x10000x000200009710x298559LGetProfileIntA_HRESULT_TYPEDEF_(0x80090017L)"1.2.840.113549.1.9.15"0x40000x00020U0x0004103RpcNsBindingLookupBeginA0x070x00080x0000000BL_HRESULT_TYPEDEF_(0x80040ß111L)030UL0x0040_HRESULT_TYPEDEF_(0x80091006L)0x21440x0419_HRESULT_TYPEDEF_(0x80092025L)_HRESULT_TYPEDEF_(0x8001010BL)0x00000008L_HRESULT_TYPEDEF_(0x00090313L)40x2E2"CryptDllExportPrivateKeyInfoEx"14330x0ß40x400x00100x00000020x00000010L0x00000010L0x00000200_HRESULT_TYPEDEF_(0x80040154L)0x00000040WNetGetResourceInformationA28(0x0008)VarI4FromDec1820LLC_ALLRegisterEventSourceA160x00000003L12L0x00000002_HRESUßLT_TYPEDEF_(0x80110602L)CERT_STORE_PROV_FILENAME_W0x000000080x10000000_HRESULT_TYPEDEF_(0x80100069L)0x00120000const IID &0x00000004(MMIOERR_BASE + 12)0(MIXERLINE_COMPONENTTYPE_DST_FIRST + 5)1WNetGetProviderNameAß8539L0x00000002__stdcall1118451L1211002SQL_WVARCHAR0x0001L8251L0x050x10000SCARD_CTL_CODE(12)_HRESULT_TYPEDEF_(0x8004E007L)0x00081726LSECTION_MAP_WRITE4ERROR_RETRY4_HRESULT_TYPEDEF_(0x8011044DL)0ULERRßOR_TIMEOUT1925L(0xC0000004)SQL_COLUMN_DISPLAY_SIZE0x00008214LEnumServicesStatusA(MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4)32(MAXLONG)1370x00000004L0xFFFFFFFF1090x000000020x00000000L0x02098252L0x000C0x00000008ßScrollConsoleScreenBufferA20(__std(wint_t))(0xFFFF)ImmUnregisterWordA0x40000000PERF_LARGE_RAW_BASE20x6A(()=VerSetConditionMask((),(),()))(0x00000002L)PostMessage(, PSM_SETWIZBUTTONS, 0, (LPARAM))(-2)1àßBackupEventLogA0x0050CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)0x02001317L0x40000x1((LPCSTR) 6)10x08000000L10885(* (long double *) __extended_epsilon)0x0080191160x00200x00000004ß0x0000001060x001A0x0007374_HRESULT_TYPEDEF_(0x80030020L)1230L68520x0020SQL_CONCURRENCY20x000000030x0001_HRESULT_TYPEDEF_(0x8011040FL)0x00004000L1"1.3.14.3.2.3"0x00023012L0x0000002030x045078L1621L0x0ß80x000008000x140x00004000( 0x1 )CertAddEncodedCertificateToSystemStoreA0x00100x00008000_HRESULT_TYPEDEF_(0x00041308L)I_RpcServerUseProtseq2A0x000010100x3"1.3.6.1.4.1.311.25.1"0x0f43((DWORD )0xC00002B4L)80x000ß00400_HRESULT_TYPEDEF_(0x80090003L)_HRESULT_TYPEDEF_(0x8001011CL)0x000000100x00A70x000008000x000000080x5F0x000010005068L0x2256550x0000200000x00000008L8452L0x0F72__cdecl00x80040180L0x80100000L"EFSBlob"1ß54MF_OWNERDRAW1788L0x03510x00021079L0x0000FFFF0x00000020RegisterClassA11030Lthrow()ERROR_DEVICE_IN_USE_HRESULT_TYPEDEF_(0x80020013L)VarUI2FromUI43196501WSAGetLastError()"1.3.14.3.2.2"254L730x0004L256MFß_UNCHECKED0x01031807L128namespace std {0x000000019561L(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_DH|ALG_SID_KEA)"1.2.840.113549.1.1.3"2_HRESULT_TYPEDEF_(0x8011041DL)10100x00000001LEXTERN_C DECLSPEC_IMPORT HRESULT STDAPICAßLLTYPE25600x000001002560x00040x000000400x00000200V_UNION(, pdecVal)LPCPROPSHEETPAGEASCARD_CTL_CODE(11)20x20L0x00400000IID_IInternetProtocolInfo5BINDF_PULLDATA1_HRESULT_TYPEDEF_(0x800F0226L)(CONTEXT_i386 ß| 0x00000002L)0x00D2(1<<4)0x00000080LGetExceptionCode()(PSN_FIRST-1)420x00300x00000002SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0001)( CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG | CERT_CHAIN_POLICY_IGNORE_CTL_NOT_TIßME_VALID_FLAG | CERT_CHAIN_POLICY_IGNORE_NOT_TIME_NESTED_FLAG )120UL0x0D0x00000001MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_DEFAULT, MDM_HDLCPPßP_ML_DEFAULT ) )RPC_S_INVALID_BOUND(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0)(DWORD)0x00CC0020"1.3.6.1.4.1.311.10.5.1"_HRESULT_TYPEDEF_(0x80092004L)0x00000008LVIEW_E_DRAW0x010020481241L400x000000100x0a43HIWORD(ß)0x00000080L0x00000001L"1.2.840.113549.1.1.4"1GetComputerNameA1794LSTATUS_INTEGER_DIVIDE_BY_ZERO0x830013541450x190x00000008LAddPrinterA3700x0000L8222L0x00080000L0x4000L(-1)((SCODE) (((unsigned long)()<ß<31) | ((unsigned long)()<<16) | ((unsigned long)())) )0x8025L55TEXT("DefaultSpoolDirectory")7037L(MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_BOOLEAN)1382LWNetAddConnectßion2A4WNetAddConnection3A10x0080150x61MS_DEF_RSA_SCHANNEL_PROV_A1AF_SNA0x00000020LMAKEINTRESOURCE(7)(void)SNDMSG(, CDM_SETDEFEXT, 0, (LPARAM)(LPSTR))17MS_STRONG_PROV_A_HRESULT_TYPEDEF_(0x00090320L)0x01000ß0000x0000002160x000000010x000000200x0000002071HTGROWBOX0x0000001f00x00000800(0x0000)0x0000001e0x020x00000004L0x00000004L0x000000530x002D52IID_IBindHostBINDF_GETNEWESTVERSION(WORD)08203L( 10 )0x000000ß10L0x1FFF(CERT_SHA1_HASH_PROP_ID == () || CERT_MD5_HASH_PROP_ID == () || CERT_SIGNATURE_HASH_PROP_ID == ())330x00011013131L470x0f((LPCSTR) 40)"1.2.840.113549.1.1.2"0x000100000x00000002L70x00400000L8363ßLSCARD_CTL_CODE( 2)0x80000000ShellAboutA1439L0x01A1((LPCSTR) 6)0x20010x00023001L4214LDECLSPEC_IMPORT994L170L0x800x0001(MMSYSERR_BASE + 2)0x04000000L0x01015LTEXT("SeAssignPrimaryTokenPrivilege")VarI1FromUßI40x0002L10014L0x00000x00000004284410x006999"2.5.29.8"0x00000x00000x0000140225920_HRESULT_TYPEDEF_(0x80080010L)640x00000040L90x00000008(-()+SQL_LEN_DATA_AT_EXEC_OFFSET)((DWORD )0xC00002C9L)_HRESULT_TYPßEDEF_(0x800401FFL)4800130x00000001LSQL_INTERVAL_YEAR0x00020x00010x000228SendMessageCallbackA20x00000008LLOBYTE(LOWORD( () ))0x30000000LRegSetValueA0x00002000RpcBindingSetAuthInfoExA359GetDefaultCommConfigßA0x00001000L0x0000003347053L0x0000001d40x0000000FL_HRESULT_TYPEDEF_(0x800F0232L)0x00000020L2_HRESULT_TYPEDEF_(0x800B0105L)0x00008000L_MSL_MATH_ERRHANDLING790x00800000SetDefaultCommConfigA0x0002CERT_QUERY_COßNTENT_FLAG_CERT | CERT_QUERY_CONTENT_FLAG_CTL | CERT_QUERY_CONTENT_FLAG_CRL | CERT_QUERY_CONTENT_FLAG_SERIALIZED_STORE | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CERT | CERT_QUERY_CONTENT_FLAG_SERIALIZED_CTL | CERT_QUERY_CONTENT_FßLAG_SERIALIZED_CRL | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_UNSIGNED | CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED | CERT_QUERY_CONTENT_FLAG_PKCS10 | CERT_QUERY_CONTENT_FLAG_PFX_HRESULT_TYPEDEF_ß(0x00090312L)0x8000CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)320x00000010L(-6)1214L233L0x010x00000020L((LPCSTR) 1)630x0CMM_TWIPS0x00020000L80x80040161L0x00090x000x0008730x0418SßQL_CB_CLOSE1006_HRESULT_TYPEDEF_(0x800F022AL)0x00000010(READ_CONTROL)1367L0x14EXTERN_C HRESULT STDAPICALLTYPE0x8000CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0400L0xf0x80040110L_HREßSULT_TYPEDEF_(0x80110409L)8235L110065L_HRESULT_TYPEDEF_(0x80010103L)0x0000000414209L0x000400x00(MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SORT_DEFAULT))0x00040x0000008SQL_USE_BOOKMARKSSCARD_ATTR_VALUßE(SCARD_CLASS_IFD_PROTOCOL, 0x020c)(NULL)0x02051622L0x0000000A7_HRESULT_TYPEDEF_(0x80080006L)20x000000080x00080000L21753L0x000B0x00000x0214SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0121)0x07ReadConsoleOutputAàß0x80400000_P_NOWAITIID_IInternetThreadSwitch0x00000002L10x00000100Lstrlen()SecurityDelegation0x45000x0d330x040x800401CFL0x000020000x0000_HRESULT_TYPEDEF_(0x80096003L)1331L__stdcallImmInstallIMEA_HRESULT_TßYPEDEF_(0x80093009L)0x00000008L0x00000000LSC_MINIMIZEImmGetConversionListA0x00000008L"2.16.840.1.113730.2.5"41200x0001_HRESULT_TYPEDEF_(0x80040069L)0x0000200016L( 0xffffffff )2266L"1.2.840.113549.1.9.14"8491Làß( 5 )(STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)0x00080000L0x0002(CDM_FIRST + 0x0006)"Microsoft RSA Signature Cryptographic Provider"80TA_LEFT(0x00000012L)CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, ßFILE_ANY_ACCESS)0x010000000x00400x10x0001000022560x00000001FormatMessageA((DWORD)0x00001000)0x00080x000000020x40000x0FFF0x23190L0x0000000000x00800x00000003L_HRESULT_TYPEDEF_(0x800F020BL)2PostMessage(, ßPSM_CANCELTOCLOSE, 0, 0L)89L7000111560x00000008L0x000001008(DWORD)(-1)0x001090x03170x800310x00100x001010x2SQL_OU_TABLE_DEFINITION(0U-299U)60x00000004(V_VT()&VT_ARRAY)0x0001L155LSNDMSG(, PSM_SETßCURSELID, 0, (LPARAM))9L"Microsoft RSA Signature Cryptographic Provider"(SQL_IK_ASC | SQL_IK_DESC)29RpcNsBindingUnexportA(0x000F0000L)L"CryptFlags"7_HRESULT_TYPEDEF_(0x8009000FL)VarI4FromR868245L(PERF_SIZE_LARßGE | PERF_TYPE_COUNTER | PERF_COUNTER_RATE | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_PERCENT)4110035L8016L90x000000024336Linterface DECLSPEC_NOVTABLE  : public 9555L((DWORD)0x00000010)(1 << CMSG_EßNCRYPTED)0x0010MF_UNHILITE24((HRESULT)()<0)L".LocalMachine"0x04000x0100101195_HRESULT_TYPEDEF_(0x800F022EL)_HRESULT_TYPEDEF_(0x800401D0L)6VarI4FromR40x000000808535LSCARD_ATTR_VALUE(SCARD_CLASS_PERF, 0x0002)àß50x0000004092600x00C2CreateEnhMetaFileA80x00000400L65_HRESULT_TYPEDEF_(0x8009300CL)9652L2CertRDNValueToStrA120x0000004WSANO_RECOVERY27_HRESULT_TYPEDEF_(0x80080004L)0x000200000x000b0x000000010x0001(MIDIßERR_BASE + 5)50x02000x014c0x390x0006(int)SNDMSG(, CDM_GETFOLDERIDLIST, (WPARAM), (LPARAM)(LPVOID))0x050x80000400(MCIERR_BASE + 84)8371L0x800040000x800x100000001000(-5)8224L((HANDLE)-1)70x00A10xF572àß4338LGetDiskFreeSpaceA0x26(0x00000004L)0x0FFFFFFF0x4ReadConsoleA_HRESULT_TYPEDEF_(0x80030013L)5_HRESULT_TYPEDEF_(0x8004006AL)80x00040000L0x00000004L0x00000100L2(3U << 8)0x00000002L2568521L(1)0x000000010xß00000002LTEXT("SeUnsolicitedInputPrivilege")(-20)0x00040004L0x0602_HRESULT_TYPEDEF_(0x8000401CL)(*() = ())"1.2.840.10040.4.3"44640x01(WM_USER + 113)0x00002000L25620x010015324_HRESULT_TYPEDEF_(0x800101ß17L)((STATUS_WAIT_0 ) + 0 )2162L0x00000001L*(*(  **)&)++5020L(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA)SetWindowLongA00x00000001_HRESULT_TYPEDEF_(0x8001011DL)0x000001000x00010x40040x00A50x080000000x00ß0000010x00040x00000001"1.3.14.3.2.13"(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_VALUE | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)8396L((LPCSTR) 28)020VarDecFromUI4RPC_S_OUT_OF_MEMORY198509L((LONG)(LOßNG_PTR) () )MessageBoxExA0x00000001L(-34)0xFFFFFFFF_HRESULT_TYPEDEF_(0x80040164L)0x000x8004018FL10x0010154L((LPCSTR) 5)(().HighPart = 0, ().LowPart = ())0x0000002015510x00004000(-2)1164L0x000000080ßx00B80x100x00881070L(0x00000205L)(*(long double*)__extended_huge)(IOC_VOID|(()<<8)|())02((PCERT_INFO) -1)"Physical""1.3.6.1.5.5.7.3.1"(MCIERR_BASE + 90)56_HRESULT_TYPEDEF_(0x80028CA0L)1076L0x80000x000040ß00L0x000230x00000080L(15)0L81814L700x00000020L103L0x0200(*(float*) __float_huge)(SQL_C_SHORT+SQL_UNSIGNED_OFFSET)5061L10x000000020x00000020L0x00040000(MAKELCID(LANG_SYSTEM_DEFAULT, SORT_DEFAULT))((DWORD)0ßx00000001)112ImmEnumRegisterWordA(PSN_FIRST-3)0x000000100x000100002010L0x00x20x00040000l0x00080000l1388L(0*4)0x00400000l(-1)4_HRESULT_TYPEDEF_(0x8000401EL)0x000200000x000000020x100000040x00000800L0x00800ß000l__inline0x00000004L(WORD)4000(0x00000002L)(0x8)0x00040000L0x000000100x000000090x000010000x00000005OPENCARDNAMEATEXT("printLanguage")(MCIERR_BASE + 41)18(0xFFFFFFFFL)0x0005__cdecl(3U << 10)0x00008000L0ßx000C0x002000000x00001004_HRESULT_TYPEDEF_(0x8002801DL)255EnumDateFormatsA80x000401E0L0x00070x0001_HRESULT_TYPEDEF_(0x8004130CL)133SetPrinterA0x000000020x00000400L0x0001_HRESULT_TYPEDEF_(0x80010100L)0x00000ß400LOPENCARDNAMEW0x000002000x00010000L0x0020CopyAcceleratorTableA(-4)14(MIXERCONTROL_CONTROLTYPE_SLIDER + 1)0x0002460x20MAKEFOURCC(, , , )0x000112(2U << 10)8204LTEXT("driverName")_HRESULT_TYPEDEF_(0ßx800F0218L)0x45L".Enterprise"10x783(~0UL)81920x1640x000000020x00000080ENUMRESLANGPROCA0x20050EnumMonitorsA_HRESULT_TYPEDEF_(0x80040064L)1744L0x000001000x040030CreateProcessA0x0008230x000800001253L99àß(0)10x00F0::std::0x00C00x120x00004003L20x000000080x00008000"CryptDllImportPrivateKeyInfoEx"0x00000002580x00040x1000L341790L47(BF_DIAGONAL | BF_TOP | BF_LEFT)1HIWORD()_HRESULT_TYPEDEF_(0x80004004L)51àß3((int)(__HI()&0x80000000))18483L13RegOpenKeyA( 8 )0x000000040x0002(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_SCHANNEL_MASTER_HASH)1326L1280x00070CreateDialogIndirectParamA8(SQL_C_SHORT+SQL_SIGNEßD_OFFSET)0x0000000220x0004_HRESULT_TYPEDEF_(0x8001013AL)1708LWinExecErrorA9611LEXTERN_C DECLSPEC_IMPORT  STDAPICALLTYPE90x00044111210x00000001L_HRESULT_TYPEDEF_(0x8001011EL)_HRESULT_TYPEDEF_(0x8001000DL)0ßx00000010L_IOW('f', 126, u_long)0_HRESULT_TYPEDEF_(0x00090314L)0x000000010x00000002L21mciGetErrorStringA_HRESULT_TYPEDEF_(0x80093026L)8351L240x074204L0x00040x000000200x00400x000000080x000000020x00000004VT_ßUI40x00000002_HRESULT_TYPEDEF_(0x80097006L)( 0xffffffff )L"Software\\Microsoft\\Cryptography\\IEDirtyFlags"CMSG_SIGNED_DATA_V30x2SQL_OU_DML_STATEMENTS0x00008000_HRESULT_TYPEDEF_(0x800B010DL)10061L139_HRESULT_TYPEßDEF_(0x80096002L)8450L15UL0x00007(-1248)TEXT("printerLocations")750x00800000LVarI4FromBool0x0F0x00BA1640(MMSYSERR_BASE + 15)0x00000010L5086L26(MCIERR_BASE + 20)10x00000002320x00020x00C000000x00400x00ß000008LTA_RIGHT143ImmRegisterWordA1112_HRESULT_TYPEDEF_(0x80090021L)0x00030000((LPCSTR) 36)RPC_BINDING_HANDLE(MIDIERR_BASE + 0)680x480x000x000000020x0080GetPrinterA50x00000002(-24)0x438_HRESULT_TYPEDEFß_(0x8009030FL)GetCharWidthFloatA1DRVCNF_CANCEL"2.5.4.20"13CharLowerBuffA8411L0x00010000l0x00000080L(unsigned long)0X00000000L0x000004005026L( SecurityImpersonation << 16 )CharUpperA4(0x5)0x00000004L00x0000ß0007L0x01930x100x0020GetShortPathNameA00x0E25720x3153SQLSetPos(,,SQL_DELETE,SQL_LOCK_NO_CHANGE)350x0000000231132LSTATUS_FLOAT_DENORMAL_OPERAND0x0008SQL_LOCK_UNLOCK0x000003000x0000000225810020x000ß00006ResetPrinterA0x00020000"!\n"(0x0400)1_HRESULT_TYPEDEF_(0x80080011L)0x0013CompareStringA_HRESULT_TYPEDEF_(0x800F1000L)0x0003(0x0004)ERROR_INVALID_ADDRESS0x00010x010000008311L11_HRESULT_TYPEDEF_(0x8ß0030112L)0x00000000L_HRESULT_TYPEDEF_(0x80010139L)1337L0x000A_HRESULT_TYPEDEF_(0x800401E9L)SQLSetPos(,,SQL_REFRESH,)0x000200000x16(STANDARD_RIGHTS_READ | PRINTER_ACCESS_USE)7(1U << 0)1281(-8)SCARD_ATTR_VßALUE(SCARD_CLASS_COMMUNICATIONS, 0x0110)315(0x00000002L)SML_ERR_A_XPT_ERROR + 0x110x00000020((LPCSTR) 14)0x00000002LRT_VERSION210L9_HRESULT_TYPEDEF_(0x80094801L)1351L144000x00D000000x00001fff0x0020_HRESULT_ßTYPEDEF_(0x8011041FL)_HRESULT_TYPEDEF_(0x8002000EL)0x00000020L0x00001000"1.2.840.113549.1.7.6"0x0000000113MB_ICONASTERISK(TEXT("text/html"))0x0003L0x0003(1U << 12)"1.3.6.1.4.1.311.10.3.3"0x000000080x0010SetClaßssLongA0x0000000142SQL_GUID0x000401CFL__stdcall6{0,0,0,0,0,0}(IOC_IN|(((long)sizeof()&IOCPARM_MASK)<<16)|(()<<8)|())RpcProtseqVectorFreeA0x000210x00170000321SCARD_CTL_CODE( 7)0x40000000x00020x0000000ß2L0x000800000x0149(IOC_OUT|(((long)sizeof()&IOCPARM_MASK)<<16)|(()<<8)|())4207L0x0021_HRESULT_TYPEDEF_(0x8001000AL)__int640x04360x00020x0001(TEXT("image/xbm"))0x00000010"2.16.840.1.113730.1.8"0x00080000CßTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)STATUS_STACK_OVERFLOW800x4000840x00000002L0x6CERT_FIND_ENHKEY_USAGE_HRESULT_TYPEDEF_(0x80100026L)0x000100000x000001000x3BDL"DS"30x0c0x00000ß00272L0x00000010IsCharUpperAEnumDesktopsA0x0020SCARD_READERSTATEWsizeof(DISK_HISTOGRAM)88380x00000F001419L0x8000(HPROPSHEETPAGE)SNDMSG(, PSM_INDEXTOPAGE, (WPARAM)(), 0)0x00000002_HRESULT_TYPEDEF_(0x8007000ßEL)SQL_MAX_IDENTIFIER_LEN0x0200((HRESULT)0x80040000L)"2.5.8.2"EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE"1.2.840.113549.1.9.1"0x02_HRESULT_TYPEDEF_(0x8010002DL)0x0b10x000000049600256000XcvDataWSCARD_READEßRSTATEA0x00000002_HRESULT_TYPEDEF_(0x800B0006L)0x00000080L(CERT_COMPARE_PROPERTY << CERT_COMPARE_SHIFT)0x000000010x004100x000000028504L0x100000000x000100000x0008"DS"0x0000000140x0000ERROR_ACCESS_DENIED_HRESßULT_TYPEDEF_(0x800F0101L)278L(0x80)0x0000200000x0810(MIXERR_BASE + 0)CopyMetaFileA"2.16.840.1.101.2.1.1.3"2( 7 )CommDlg_OpenSave_GetFilePathA_HRESULT_TYPEDEF_(0x80010002L)0x000000400x0000000e0x00001000LInsertMßenuItemAFINDMSGSTRINGA_HRESULT_TYPEDEF_(0x00080012L)0x0b310x00001400SCardUIDlgSelectCardA0x000000027560000x00000040L88441L160x0001"1.2.840.113549.1.7.3"0x0800L64typedef char __C_ASSERT__[()?1:-1]SQL_MAX_ßCOLUMNS_IN_INDEX0x00002000(1 << 9)9501L0x00200x000000040x0004000087L0x400000000x00000100L0x0000000011_HRESULT_TYPEDEF_(0x80040004L)0x00000004L0x08000x0000"MNBF"10L0x000000080x00000002L0x00000004L0x004000ß000x00001200"1.2.840.113549.1.9.4"4309L((PIMAGE_SECTION_HEADER) ((ULONG_PTR) + FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + ((PIMAGE_NT_HEADERS)())->FileHeader.SizeOfOptionalHeader ))0x00040x002000000x000600ß000x0004"2.16.840.1.101.2.1.1.4"STATUS_ILLEGAL_INSTRUCTION0x00000008L0x200x0002(3L)0x00000080L0x0000004B70x120x0000004C0x00000006LVarI4FromI10x000000470x80000x030x00000048_HRESULT_TYPEDEF_(0x80093202L)0x2ß6"CryptDllCreateCOMObject"0x000000498347LVarI4FromI20x40x0000004A50szOID_RSA_RSA8387L0x0068VarI4FromI40x00000044((() >> 16) & 0x1fff)156L0x00000045((LPCSTR) 501)0x000000460x0100L5034L0x00000000L_MSL_IßMP_EXP0x000100000x02000x7fff_HRESULT_TYPEDEF_(0x80090303L)5036L(0x00000226L)0x01210x00040x4f101028001L9MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDßLCPPP_AUTH_PAP, MDM_HDLCPPP_ML_2 ) )(WS_CHILD)018GetDateFormatA299503L8439L0x140x0004_HRESULT_TYPEDEF_(0x8001000EL)0x000000800x0002120x8001250x0001(BDR_SUNKENOUTER | BDR_RAISEDINNER)0x00080000L0x00020x02ß831208L1311L2SQL_NO_DATA0x00004003L0x00110000_HRESULT_TYPEDEF_(0x80040155L)38SQL_CUR_USE_DRIVER0x00021348229L20x0006((HANDLE)(LONG_PTR) ())RegisterServiceCtrlHandlerADMBIN_UPPER0x00000002L(WM_USER+3)0x0ß0081LPIINTERNETPROTOCOLSINKSTACKABLE10"TopicItemList"(0x0000000DL)_HRESULT_TYPEDEF_(0x80090305L)((DWORD )0xC00000FDL)0x00400000L_HRESULT_TYPEDEF_(0x80004023L)((LPCSTR)5)0x04240x0423( & CMSG_ENCODING_TYPE_MASK)àß0x042610x0425160x0420(0x0070 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)130x0004700x02000x04220x00000100_HRESULT_TYPEDEF_(0x80010003L)0x0421__typeof__(sizeof(0))48150x000004001734L00x00160000_HRESULT_TYPEDEFß_(0x80040205L)0x04280x00000010L0x0427WNetUseConnectionA4100L0x00000040L0x08000000L0x000000010x01950UL"2.5.29.7"81770L1520x00030x210x000cDMPAPER_LETTER0x000000080x00080x030B1L_HRESULT_TYPEDEF_(0x800C000ß4L)0x0115_HRESULT_TYPEDEF_(0x00041301L)70x00000001L0x00001772L0x000000108553L8502L1330L0x020x0004CreateWindowExW(0L, , , , , ,, , ,  ,  ,  )SIZE_MAXHIDE41160x00000008L0x0004ERROR_NOT_LOGGßED_ON0x600x40000000L0x000000107052LQueryServiceConfigA0x00040000L0x01120x00000011L0x00100000((() & CERT_RDN_TYPE_MASK) >= CERT_RDN_NUMERIC_STRING)0x0809WNetDisconnectDialog1A0x0001665079L0x000x00000006(WSß_EX_WINDOWEDGE | WS_EX_CLIENTEDGE)GetClassLongA0x8000TEXT("printRateUnit")0x04001301LLPFNPSPCALLBACKATEXT("SCard$LocalReaders\000")0x00010000L1784L0x000004000x00000020L347009L0x0015(0x0004)0x00xF8(()==IMAßGE_SYM_CLASS_STRUCT_TAG || ()==IMAGE_SYM_CLASS_UNION_TAG || ()==IMAGE_SYM_CLASS_ENUM_TAG)0x00000004L482L(unsigned long)0X00000010L(-1247)0x20000000CreateWindowExA(0L, , , , , ,, , ,  ,  ,  )ERRßOR_BAD_PROVIDER205L0x000595(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_CYLINK_MEK)470x0004((unsigned short)(ULONG_PTR)() )0x00000008L((LPCSTR)1)CREDENTIAL_OID_PASSWORD_CREDENTIALS_A(PERF_SIZE_LARGE | PERF_TYPßE_COUNTER | PERF_COUNTER_VALUE | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)107L15CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)"2.5.4.5"0x000080000x00000002SCardGetStatusChangeA6200L((LPCSßTR) 4)0x400b(QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY)2SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0123)(MMIOERR_BASE + 13)MAKEINTRESOURCE(9)1220L0x00000009L0x00000010L1022L4(0x00A0 | XCLASS_NOTIFßICATION | XTYPF_NOBLOCK)0x20020x00000003((VARIANT_BOOL)0)1082L0x080x00000001LTEXT("printMinYExtent")0x00004007LNULL_BRUSH0x00000001L759L0x008781735L(CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)390xß000000020x004040x000010000x1c( 0 )0x0082(1U << 5)TEXT("printMinXExtent")"2.5.4.12"20x00000001((DWORD )0xC000001DL)( 0x80000003 )0x00000003L8421L00x0010_HRESULT_TYPEDEF_(0x8000401FL)0x000000031(TEXT("applßication/pdf"))TEXT("SchedulerThreadPriority")sndAlias('S', '*')SQL_OU_INDEX_DEFINITION0x00020000l8549L0x800200000x08750x0000040091422L(!memcmp((),(),()))0x01c0300L0x00070x0100_HRESULT_TYPEDEF_(0x800C00ß02L)129706LGetBinaryTypeATEXT("SeEnableDelegationPrivilege")(100 + SQL_CODE_HOUR_TO_SECOND)202L10x0000000434308L0x00000004ERROR_OUTOFMEMORYCODEPAGE_ENUMPROCA1766L0x0020ERROR_BAD_USERNAME61270x4c0x100x010ß076_HRESULT_TYPEDEF_(0x800B0103L)0x00020x4000(V_VT()&VT_VECTOR)0x00000001L0x3C90x001762230x000100000x00000400(0x0100)(PSN_FIRST-2)_HRESULT_TYPEDEF_(0x8009200CL)5016L((),TRUE)0x0002"CertDllUnregisterSysßtemStore"0x000000056_HRESULT_TYPEDEF_(0x8009200DL)6001L5070x00001000_HRESULT_TYPEDEF_(0x80093025L)7ERROR_BAD_DEVICESetWindowLongPtrA( 0x0002 )((), 0)0x000000000x0080129L8991400x00000002L0x00000012L0x0ßb410(CERT_COMPARE_ANY << CERT_COMPARE_SHIFT)00x00010x010x8800000000x00000100IsEqualGUID(, )0x00000001L0x00000002L12SQLINTEGER22TEXT("SeChangeNotifyPrivilege")SQL_ADD5080L5260x00000100LVerLanguageNameßA_HRESULT_TYPEDEF_(0x800401F1L)10037L2014L0x00000004L0x000011FF((HDDEDATA)0xffffffffL)0x000200000x0000000802128_HRESULT_TYPEDEF_(0x8004E022L)STATUS_FLOAT_STACK_CHECK10x00040000L(GCS_COMPREADSTR|GCS_COMPSTR)ß0x000000050xFFFFFFFF0x0001L(0x00000005L)1733L0x13BuildCommDCBA0x280x000016070x0001(TEXT("image/x-jg"))0x1CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS)0x1000CERT_FIND_OPTIONAL_ENHKEY_USAGßE_FLAG9630x00000002L_HRESULT_TYPEDEF_(0x80020009L)4332L4_HRESULT_TYPEDEF_(0x80030057L)0L(WM_USER + 136)szOID_RSA_RSA0x0100GetWindowLongPtrA0x01CERT_ENHKEY_USAGE_PROP_ID4199L5059L1130x00000001L4427000(MMSßYSERR_BASE + 8)48440LOpenSCManagerA0x000000040x80((BYTE)(()>>16))110x00000001_HRESULT_TYPEDEF_(0x800F0220L)VarUI1FromUI4"1.3.14.3.2.4"0x01000000LWNetEnumResourceA360x00000020L10xFFFFFFFF521248L( 0x4 )1ß817L0x00001D050x00020000L0x00080x00000008L"SystemRegistry"1176L(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW | 0x00000002)_HRESULT_TYPEDEF_(0x800401E8L)0x00001000L((LPCSTR) 16)1815ßL(SQL_TINYINT+SQL_SIGNED_OFFSET)770x40000x00130xFF41(3U << 10)0x000000010x000004000x019760x00020000560x40000x00039558L00x80000000L0x00000008(WM_USER+6)_HRESULT_TYPEDEF_(0x80093133L)6007L18388L40x400ß0SQLSetPos(,,SQL_ADD,SQL_LOCK_NO_CHANGE)0*(*(  **)&)++0x800000000x015c( 0x200 )0x00000040L1120x00020000*(*(  **)&)++3((DWORD)0x0001)70x0800LPSERVICE_MAIN_FUNCTIONA*(*(  **)&)++"Serialized"9ß010L8((INT_PTR)(MAXUINT_PTR >> 1))*(*(  **)&)++4108_HRESULT_TYPEDEF_(0x80010115L)VarI4FromCyAF_HYLINK0x00000C00PeekMessageA0x000000010x0000_HRESULT_TYPEDEF_(0x8009302AL)8430L0x00000011"2.5.4.46"0x00000001àß1110L30x0000180020x00C40x00000027((DWORD)0x00000002)0x000080001050x00000000113DECLSPEC_IMPORT0x00000200L11003L715560x0010103180x2000L0x00010000(0x0004)25CRYPT_FORMAT_RDN_CRLF_HRESULT_TYPEDEF_(0x8ß0004016L)0x00000001L(SQL_TINYINT+SQL_UNSIGNED_OFFSET)85L352(MCIERR_BASE + 73)90const(PSN_FIRST-6)22005"2.16.840.1.113730.1.1"} __finally {11017L0x00000004L0x00001000L0x00000004L330xFF00000000x02008503Lß_HRESULT_TYPEDEF_(0x8002802CL)1829LDefWindowProcA0x000014053288L0x000000040x0004(0x00000000L)0x080070x10000000x0004018FL170RpcServerUseProtseqIfExA0x000E0x00000008L520xFF21(0x00080000L)((RPC_AUTH_IDENTIßTY_HANDLE) ~0UL)(0x00000221L)0x00209810x00080000l9640x00100000l170x0000LVarI2FromUI40x00200000l0x00000003L19(MCIERR_BASE + 6)0x00400000l0x00040000GetSaveFileNameA0x00800000l30x01000000l0x02000000l0x4005ß920x00001000L130x04000000l0x08000000l(-8)0x110x10000000l_HRESULT_TYPEDEF_(0x800B0008L)(0x0020)20x05( ( DWORD )~UPDFCACHE_ONLYIFBLANK )DWLP_MSGRESULT + sizeof(LRESULT)_HRESULT_TYPEDEF_(0x800401E5L)0x001fUCoIntßernetCombineUrl0xFFFFFFFF0x00000100_HRESULT_TYPEDEF_(0x800401F2L)133L(CDN_FIRST - 0x0006)0x0813(3 << 13)20_HRESULT_TYPEDEF_(0x8004000FL)(-4L)0x01000000l(CERT_COMPARE_CERT_ID << CERT_COMPARE_SHIFT)0x7000(0x0040ß)0x0b3UL0x00022UL51218(MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED)"Synthesis SyncML Server/" SYSYNC_FULL_VERSION_STRING22SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSIONß_TXT "." SYSYNC_BUILDNUMBER_TXT90x02000000l0x00030x00000100L0x4000{ NDRcopy ( (((char __RPC_FAR *)())+()), ()->Buffer, (unsigned int)(()-())); *(unsigned long __RPC_FAR *)&()->Buffer += (()-()); }0x200ß00000l_HRESULT_TYPEDEF_(0x800B000BL)13700x40000000l0x000010000x80000000l0x00000005230x0000001010010(DWORD)0x000000420x00000100244203L0x000000020x0A00x0f0307708523L7040L0x00000004L0x0100LTEXT("printßNotify")110xF11047"2.16.840.1.101.2.1.1.20"0x00000020LCTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS)((LONG)0x80000001)GetPrivateProfileStringA0URemovePropA(DWORD)0x005A00490x000D21_HRESULT_ßTYPEDEF_(0x800F020CL)_HRESULT_TYPEDEF_(0x8001010FL)0x00000004L(-4)((COLORREF)(0x01000000 | (DWORD)(WORD)()))163648(WM_USER + 115)5027L0x00141590x00000001L0x0022(ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA1)0ßx00082((HRESULT) ())0x100C0x0100L512(MCIERR_BASE + 65)_HRESULT_TYPEDEF_(0x80020003L)1249L0x000000003211029L12DeletePrinterDataExASML_ERR_A_XPT_ERROR + 0x040x00000200L464200L0xFFFF(0x00000224L)((DWORD )ß0x00000103L)0x0004(*() = ())4213L0x100x00000002(0x00000004L)(CALLBACK_TASK)10102L(-2)0x00000200ERROR_MORE_DATA0x0400_HRESULT_TYPEDEF_(0x800401FAL)0x000000580x00000002768SQL_U_UNION(WM_USER + 121)0x0000ß4001L0x000000700x00000002LGetTextMetricsA((DWORD)0x00000103)19DMPAPER_A3_EXTRA_TRANSVERSE((HRESULT))3650x00000008L0x00000004"2.5.8.3"260x00000000LLoadCursorA(0x0090 | XCLASS_FLAGS )276L20x0020_HRESULT_TßYPEDEF_(0x8004E004L)0x00040000"2.5.29.32"0x00060x0000C000L9(IOC_IN|IOC_OUT)0x00CB_HRESULT_TYPEDEF_(0x80010128L)SQL_MAX_COLUMNS_IN_SELECT3( 0x2 )_HRESULT_TYPEDEF_(0x800F020DL)2L(~MAXHALF_PTR)0x000000800x0400DßRVCNF_OKEXTERN_C  STDAPICALLTYPE0x019B0x0002_HRESULT_TYPEDEF_(0x80004024L)1616LlstrcmpiASTATUS_SINGLE_STEP8140x00000006L80x0004_HRESULT_TYPEDEF_(0x80110403L)EXTERN_C HRESULT STDAPIVCALLTYPE0x021032_HRESULTß_TYPEDEF_(0x8000401BL)10x00000200l0x400000000x00000400l583((LPCSTR) 3)0x00000800l0x00001000lERROR_NOT_ENOUGH_MEMORYGetCharABCWidthsA0x0040( (RpcExceptionCode() == STATUS_ACCESS_VIOLATION) || (RpcExceptionCode()ß == STATUS_DATATYPE_MISALIGNMENT) || (RpcExceptionCode() == RPC_X_BAD_STUB_DATA) || (RpcExceptionCode() == RPC_S_INVALID_BOUND) )0x00100000L0x00002000l0x00004000l0x00f7_HRESULT_TYPEDEF_(0x80110436L)RpcBindingFromStringßBindingA0x00008000l0x00010000l0x00001000L0x00020000l0x00C1100x00100000L0x00040000l0x000A0x00000800ChangeDisplaySettingsExA_HRESULT_TYPEDEF_(0x80010010L)(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9)_HRESULT_TYPEDEF_(0ßx80100006L)_HRESULT_TYPEDEF_(0x80092028L)(WM_USER + 114)0x0626"1.2.840.113549.1.9.2"_HRESULT_TYPEDEF_(0x80094006L)(WM_USER + 200)0x0014SQL_CB_PRESERVE0x10000000L3(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTERß_QUEUELEN | PERF_TIMER_100NS | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)_HRESULT_TYPEDEF_(0x80090329L)32256short0x00800000L1730L0x00000400L_HRESULT_TYPEDEF_(0x8011040CL)1227L2_HRESULT_TYPEDEF_(0x80090328L)07àß20(PSN_FIRST-8)1762L0x000800004((BYTE)0x80)FindNextFileA0x00000001L0x014D( PARAMFLAG_FLCID )0x0012MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_56K, MDM_HDLCPPP_AUßTH_DEFAULT, MDM_HDLCPPP_ML_DEFAULT ) )CF_ANSIONLYRpcBindingSetAuthInfoA0xA0_HRESULT_TYPEDEF_(0x800401E7L)0x40x000020000x0004DdeCreateStringHandleASTATUS_ACCESS_VIOLATION0x000000800x01174L30x01680x0000000100x0ß0008000L5085L1062L0x00008000L0x33(DWORD)0x0066004620x000010000x2SetWindowLongA6_HRESULT_TYPEDEF_(0x80100007L)0x0000000e0x000F30721795L0x00000004"CryptMsgDllGenEncryptKey"0x00000010SML_ERR_A_XPT_ERROR + 0x1ß6CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)0x0000000f0x00200x0360V_UNION(, pparray)0x000000120x000000021314L0x00008000L"1.3.6.1.5.5.7.3"0x00000011112070x00000014(STANDARD_RIGHTS_REQßUIRED|SYNCHRONIZE|0x3)EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE0x000000130x00000004L0x00004000SetWindowLongW0x0002L0xE18219L0x00200000L10060x000000221168526L(void)0(0x0010 | XCLASS_FLAGS )0x8004017FL(ßNDRCContextMarshall( (NDR_CCONTEXT),  ),+20)HALFTONE11(-12)0x7008(MCIERR_BASE + 19)0x02197( 0x0002 )310x00000008590x03100x002050x00800x00100000LSQL_UB_OFFlong2318433L2260xE2SNDMSG(, PSM_SETHßEADERSUBTITLE, (WPARAM)(), (LPARAM)())(1 << VT_CY)(0x00000008L)(MCIERR_BASE + 38)V_UNION(, ppdispVal)0x00020000L0x0F000x3FF(5 << 13)5(5<<4)207L20LTEXT("printNetworkAddress")9(struct _EXCEPTION_POINTERS *ß)_exception_info( & CERT_ENCODING_TYPE_MASK)230x790x00000002L08538L0x20120x00000027_HRESULT_TYPEDEF_(0x80090330L)((DWORD)0x00000100)3913_HRESULT_TYPEDEF_(0x8009301FL)0x000010x000100x00000001(MIXERLINE_CßOMPONENTTYPE_DST_FIRST + 6)19556L1733L1426L1163L0x800000000x0048_HRESULT_TYPEDEF_(0x80090008L)220x00020x0004150x010060x010x00000008L(0U-699U)CCSIZEOF_STRUCT(PROPSHEETHEADERW, pfnCallback)0x2(MCIERR_BASE +ß 80)0x118600x000000010x000000800x0100_HRESULT_TYPEDEF_(0x80093011L)0x0000000140x000000000x001010050L0x0008MessageBoxIndirectA0x00002000L0x00000004L0x19258L1TEXT("MajorVersion")(() >> 16)40x0007ffff(ßMCIERR_BASE + 52)0x00F40x000110x000001000x1(BF_BOTTOM | BF_LEFT)ERROR_CANCELLED0x454C30x00000400LERROR_NO_MORE_ITEMS(PERF_SIZE_LARGE | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW )(MCIERR_BASE + ß28)8378L1019L((DWORD)0x00000400)0x00200000L38485L1335L0x0000080032TEXT("SCard$DefaultReaders\000")(DWORD)0x00FF00624312L0x001050x32001DragQueryFileA_HRESULT_TYPEDEF_(0x80040067L)}2(unsigned char)( & 0ßxff), (unsigned char)( >> 8)"1.3.6.1.4.1.311.20.2.1"(1U << 2)ModifyMenuA790x00010x0000001041_HRESULT_TYPEDEF_(0x800C0014L)0xff0xF0700x00001401"1.3.6.1.5.5.7.48.2"0x6SQL_CB_PRESERVE0x00010000L((LPCSTR) 23)(ßWM_USER + 125)BS_LEFTTEXT0x28436LSQL_COLUMN_AUTO_INCREMENT0x001C0000(0x0002)0x000000100x000430x103B(CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG)0x800000020x30000000LSCARD_ATTR_VALUE(SCARD_CßLASS_VENDOR_INFO, 0x0101)(MCIERR_BASE + 47)(-3)(WM_USER + 126)0x01L9654L960x01378418LV_UNION(, date)((HCERTCHAINENGINE)0x1)0x00030000(0x0002)0x014( UPDFCACHE_ALL & ( DWORD )~UPDFCACHE_NODATACACHE )9_HRESUßLT_TYPEDEF_(0x80030108L)2000LLoadCursorFromFileA_HRESULT_TYPEDEF_(0x80040208L)0x000F107DeletePrinterDriverExA1((BYTE)())_HRESULT_TYPEDEF_(0x8009100AL)(-99)LANGGROUPLOCALE_ENUMPROCA21718L1212L0x00000001L"2.5ß.4.19"0x00100x231609L8(unsigned long)0X00000000L2564(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DISPLAY_PERCENT)L"Software\\Policies\\Microsoft\\SystemCertificates"NO_ERROR(512/8)10x00000ß100L0x000040000x0001015371108L9(CDM_FIRST + 0x0000)25WSATRY_AGAIN0x20000x00000001L0x000401A0L((DWORD)0x0020)0((DWORD)0x00000008)0x058((DWORD)0x00000040)(NdrSContextMarshall((NDR_SCONTEXT),, (NDR_RUNDOWßN))0x00000027(2<<4)((DWORD)0x00000004)CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0000001c0x0020(0x3<<6)1SCardIntroduceReaderA_HRESULT_TYPEDEF_(0x8001013CL)LPIINTERNETBINDINFO0x00040000ßL0x00000200L0x000A0x00020x00000100L_HRESULT_TYPEDEF_(0x800401EEL)0x0001"2.5.4.28"0x160x00000000L0x00000000L0x800001000x0358_HRESULT_TYPEDEF_(0x80030006L)18TEXT("SeSystemEnvironmentPrivilege")98242L4209L134ß0L"ServicesActive"27_HRESULT_TYPEDEF_(0x00030204L)0x00080000L0x00000300L9559L"1.3.14.7.2.3.1"L"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"0x00000010(WAVERR_BASE + 3)0x00800000(LPSTR)((ULONG_PTR)ß((WORD)()))9752LSQL_DB_RETURN_TO_POOLCMSG_HASHED_DATA_V00x1000_IOW('s', 0, u_long)0x000040002190x0286((DWORD)0x0010)(-2)1110x0d((VOID *)(LONG_PTR)((long)))GetFileVersionInfoSizeAL"ServicesActive"8416L0xß00000020L_HRESULT_TYPEDEF_(0x80030005L)1305L0x0000002010GetServiceDisplayNameA0x00001A03((LPCSTR)1)_HRESULT_TYPEDEF_(0x8009100DL)0x0000004020x060x200x01000x02411021L0x000000200x020x0004250x00000002_HREßSULT_TYPEDEF_(0x800C0006L)"Microsoft Base DSS and Diffie-Hellman Cryptographic Provider"0x0000000400(LPWSTR)((ULONG_PTR)((WORD)()))30x0000000FCreateDCA00x00000200(MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8)288LTEXTß("driverVersion")0x00000002L0x00000002L(-3)0x000000100x01000000_HRESULT_TYPEDEF_(0x800F0207L)4Llong long00x1370x0004"1.3.6.1.4.1.311.10.3.7"GetWindowTextA4861UL0x4(2 + 2*(2 + 20 +1))11028L48EXTERN_C DECLßSPEC_IMPORT  STDAPICALLTYPE40x0300(0x00000001L)0x00000001(PERF_SIZE_LARGE | PERF_TYPE_NUMBER | PERF_NUMBER_DECIMAL | PERF_DISPLAY_NO_SUFFIX)8308L10x00110x01920x030A1245L0x00000000L1404L0x0211000101012L"1ß.2.840.113549.1.9.15.1"_exception_code"1.3.6.1.4.1.311.13.1"0x40x00000400L0x00010000L0x80002(0x00000000L)0x000000048253L((DWORD )0xC000008CL)0x00000020-50x0000002000x000840x00000200L0x00000020_HRESULT_TYPEßDEF_(0x8009302EL)0x800401F0L(V_VT()&VT_BYREF)0x00203L10x000100000x0000002f0x00800x02000000L_HRESULT_TYPEDEF_(0x80092023L)_HRESULT_TYPEDEF_(0x8004130EL)320_HRESULT_TYPEDEF_(0x800401E3L)7041L0x00010000L3124ß2L1057L(BYTE )-1LPPROPSHEETHEADERA0x20000000L_HRESULT_TYPEDEF_(0x00030202L)1428L0x0002(CDN_FIRST - 0x0000)MF_RIGHTJUSTIFY80x0080000050x00000001DWORDAddJobA3750x00000002L68L_HRESULT_TYPEDEF_(0x8010001EL)AFß_DATAKITSQL_TINYINT00x00000010_HRESULT_TYPEDEF_(0x800C0014L)_HRESULT_TYPEDEF_(0x80004005L)1102L219710LTEXT("printEndTime")0x014710068L_exception_code19(WM_USER + 129)((DWORD )0xC0000092L)_HRESULT_TYPEDEF_(0x8ß00401EAL)0x00000004256(0x0001)1791L((DWORD)0x00000002)1920L0x000045500x80040150L14190x000400000x27_HRESULT_TYPEDEF_(0x80110427L)0x0437PostMessage(, PSM_PRESSBUTTON, (WPARAM), 0)0x000001000x000000034004Làß()0x00000010L0x00200000L2"2.5.4.29"0x04350x04360x00000040L0x040000000x00010x0240x0434108110x0040(MCIERR_BASE + 42)_HRESULT_TYPEDEF_(0x800F0228L)1107L0x0008L(MCIERR_BASE + 10)00x000000041365L20x0008ß000030x20000000310x00080000L9653L0{ 0x25007f51, 0x57c2, 0x11d1, { 0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10 } }211016L0x000000010x00000040L0x0002000043_HRESULT_TYPEDEF_(0x8001012CL)999L0x00020000L640x000ß90x00008000L0x000000010x089705L0x90000000( 0x8 )SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0122)3640x00000002LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_ANALOG, MDM_GEN_ANALOG_PROTOCOL_DATA ( MDM_ANALOG_RLP_ON ) )0x00000ß008L(MCIERR_BASE + 91)50x281(WM_USER+2)_HRESULT_TYPEDEF_(0x80028CA1L)25770x4000CreateICA2_HRESULT_TYPEDEF_(0x800288CFL)RpcNsBindingUnexportPnPA00x10x3B98226L0x000010000x400000000x00000002L0x40000000074ß0962(0 + MCI_SEQ_OFFSET)0x000000FF710038L0x000173300x10001702L0x00000001210x100000000x81338L0x000000200x08000x000004000x00010x000000100x003400000x00000040198448L0x00000001320x40000x00000001L0x02ß0x000000028375L0x020000000x4000000040x010030x00001D020x02240x00000002110x0000000080x00010x080x400x000000030x04000x03((HRESULT)0x800400FFL)(MCIERR_BASE + 46)0x000000010x800401D0L0x02000xF120MF_SEPARATOßR(1 << VT_I1)(-10)_HRESULT_TYPEDEF_(0x800401D4L)0x200_HRESULT_TYPEDEF_(0x800F021EL)(1 << VT_I2)SQL_TXN_SERIALIZABLE(1 << VT_I4)HIWORD( () )TEXT("printRate")8227LICMENUMPROCAGetProfileStringA0x51_HRESULT_TYPEßDEF_(0x80090322L)0x00000400160x010x00030000lMAKEINTRESOURCE(32643)0x018408L0x00000800L129(0x20000000L)10x0400x00010x01880xF10x020B100030x0002"DEFAULT""1.2.840.113549.1.3"128560L"1.2.840.113549.1.2""1ß.2.840.113549.1.1"_HRESULT_TYPEDEF_(0x8009202AL)_HRESULT_TYPEDEF_(0x80020006L)"1.2.840.113549.1.7"70x04000000LMAKEINTRESOURCE((ULONG_PTR)RT_CURSOR + DIFFERENCE)0x06"1.2.840.113549.1.6"_HRESULT_TYPEDEF_(0x80092024L)ß1642L104L0x0010"1.2.840.113549.1.5"(0x00000001L)0x0000FFFF"1.2.840.113549.1.4"0x00000001"1.2.840.113549.1.9"0x000000400x000000020x0000000007"1.2.840.113549.1.8"410xffffffffUL0x000000028EnumFontFamiliesExAß0x00000002L(WM_USER + 101)TEXT("Architecture")0x0530x00000008_HRESULT_TYPEDEF_(0x80004022L)0x1VarUI4FromBool0x00000040L0x000E0x00002000(()&MDM_MASK_PROTOCOLINFO)4230x00008000L0x0002351755L0x0000100B0x0ß0000200L_HRESULT_TYPEDEF_(0x8009310DL)3002L0x0102GetEnvironmentStrings0x01501719L0x00000020L0x04_HRESULT_TYPEDEF_(0x80100020L)_P_WAIT0x00000800L0x000401B0LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_X75, MDM_GEN_X75_PßROTOCOL_DATA ( MDM_X75_DATA_T_70 ) )(unsigned char)( & 0xff), (unsigned char)(( & 0x0000ff00) >> 8), (unsigned char)(( & 0x00ff0000) >> 16), (unsigned char)( >> 24)0x00000010(0x00000009L)6(()->tv_sec  ()->ßtv_sec || ()->tv_sec == ()->tv_sec && ()->tv_usec  ()->tv_usec)0x00000010LTHREAD_BASE_PRIORITY_MIN0x00000040L31360L1059L256630x000040000x0001100x0000SQL_INTERVAL_HOUR_TO_MINUTE0x000001000x000000020xß00200000310x001800000x0284110x00028010L(100 + SQL_CODE_DAY_TO_HOUR)90x00001000L_HRESULT_TYPEDEF_(0x80020005L)0x0000000810StartServiceCtrlDispatcherA0x70098338L0x000000800x14ERROR_NO_NETWORK(0x00020000L)1ß19(WAVERR_BASE + 2)(CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)8202L5933"commdlg_ColorOK"573_HRESULT_TYPEDEF_(0x80092007L)5621001721900L1115L1((() &= ~MDM_MASK_PROTOCOLINFO), ((ß) |= (()&MDM_MASK_PROTOCOLINFO)))_HRESULT_TYPEDEF_(0x80091009L)_HRESULT_TYPEDEF_(0x80004020L)(0x00000004L)0x00004002L(0x2)0x00000080UnregisterClassA0x00001406( 4 )71690x000100000x0002_HRESULT_TYPEDEF_(0x8009ß4005L)4351L2AF_ECMAMAKEINTRESOURCE(32514)0x00000020(MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_SIGNED)0x15((()<> 16))IMAGE_SIZEOF_NT_OPTIONAL32_HEADER( 1 << CERT_QUERY_CONTENT_PKCS7_UNSIGNED)0x00000020"2.16.840.1.113730.4.1"00x40x00020000L((DWORD)0x00000004)"2.16.840.1.113730"ß(TIMERR_BASE+33)8370L0x0000000283_HRESULT_TYPEDEF_(0x80010125L)0x26DocumentPropertiesAEXTERN_C const IID DECLSPEC_SELECTANY  = {,,,{,,,, , , , }}0x0000001A0x00BDFileEncryptionStatusA(CERT_COMßPARE_KEY_IDENTIFIER << CERT_COMPARE_SHIFT)20x041910LLPOCNCONNPROCALoadStringA0x00000080SQL_QL_END_HRESULT_TYPEDEF_(0x800F0002L)0x000000184"2.16.840.1.101.2.1.1.1"0x000000003110x100x000000030x200040x200000ßx00010x00000001"2.5.29.35"0x03180x00040000CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)UpdateResourceA_MSL_BUFSIZ_HRESULT_TYPEDEF_(0x800F021FL)"1.3.6.1.4.1.311.10.3.5"0x40000000GetFileSecßurityA0x12VarDateFromUI40x00001407_HRESULT_TYPEDEF_(0x80010107L)1333L5SQL_CURRENT_QUALIFIER(1 << VT_R4)0x20090x00000080LDRVCNF_RESTART0x4001167L(1 << VT_R8)"2.5.4.33"MM_WIM_OPEN108489L((WORD )())20x00ß0200000x00200000L90x00080x000B0x00001D00(MCI_VD_OFFSET + 3)0x80000x0000400CL_HRESULT_TYPEDEF_(0x80090308L)0x00000004200x00004000"1.2.840.113549.1.1.6"0x730x00004001L_HRESULT_TYPEDEF_(0x800B0005L)0x00000001Lß(WM_USER + 102)0x800000000340x000000020x00080000"2007"0x80x00060xffffU5586L0x00000040L0x00000001130x2016SNDMSG(, PSM_INDEXTOID, (WPARAM)(), 0)(WM_DDE_FIRST+1)((DWORD)0x0200)170x0100SQL_AUTOCOMMIT_OßN0x00BB0x000000400x39"2.5.4.8"FILE_UNICODE_ON_DISK10x000002000xF0508210x000000000x00000004_HRESULT_TYPEDEF_(0x8001013BL)0UL0x020080x00000004SNDMSG(, PSM_APPLY, 0, 0L)4750x00010000((LPCSTR) 4)190x0020ß7((DWORD)0x00000001)0x0000000aLRpcNsProfileEltRemoveA0x000008006_HRESULT_TYPEDEF_(0x80020008L)8209L_HRESULT_TYPEDEF_(0x80092027L)(* (double *) __double_epsilon)2_HRESULT_TYPEDEF_(0x800C0016L)0x097054L((DWORD )0ßx40010003L)1111018TEXT("printOwner")321640x00000010(0x20000000L)0x00000001_HRESULT_TYPEDEF_(0x8009030CL)0L0x400000000x00000004L40x80000x00000002L0x00000001800x00000004L0UL0x0000001065040962((DWORD ß)0x40010005L)"commdlg_ShareViolation"9610x000809001L0x000000100x0105L9625_HRESULT_TYPEDEF_(0x8004000BL)8524L0x019830x0008_IOR('s', 1, u_long)1723L8531L0x000004001809L(-18)0x000000020x0002L20x00018414ßL0x000000400x00C00000L4118(LONG_PTR)(& ((( __RPC_FAR *)0)->))0"1.2.840.113549.2.5"0x000D000036"1.2.840.113549.2.4"0x00000020LL"commdlg_ShareViolation"SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0304)SetLocaleIßnfoAOemToCharBuffA0x04009613L12"1.2.840.113549.2.2"00x01_HRESULT_TYPEDEF_(0x80090325L)0x800010001359L1220x011736L371378L0x00080x00000100L30x0000000870x00D6( (() & 0x20000000) )0CTL_CODE(FILE_DEVICE_ßSERENUM,130,METHOD_BUFFERED,FILE_ANY_ACCESS)SetConsoleTitleA0x00000001( 0x0008 )0x00000010L30x0410140x00000010SQL_INTERVAL_DAYSQL_PARAM_BIND_BY_COLUMN0x80020x00000001L0x000x80000x00000001(-1)(1)0x000000800ßx000200001345L1750242404L0x80000x00000007L44((DWORD)0x00000001)0x000000040x00200000_HRESULT_TYPEDEF_(0x800F0230L)FindFirstFileA0x00000008L0x120x08ERROR_BAD_PROFILE26L0x0000000820x27523_HRESULT_TYPEDEF_(ß0x80093023L)1111L0x00080000L(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_FRACTION | PERF_DELTA_COUNTER | PERF_DELTA_BASE | PERF_DISPLAY_PERCENT)ERROR_UNEXP_NET_ERR0x00000001L0x00000020MF_BITMAPSQL_UB_ON990x0ß0E61051030x08000x000100000x08wsprintfA1373L_MSL_CLOCKS_PER_SEC0x0000800072((DWORD )0xC000013AL)1235LGetUserNameA_HRESULT_TYPEDEF_(0x8009301AL)_HRESULT_TYPEDEF_(0x800401F9L)0x0000000216(ID_PSRESTARTWINDOWS ß| 0x1)8255L0x0000270x20410x00E00000( 1 )514(MCIERR_BASE + 256)147L(REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_ATTRIBUTES | REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_SECURITY)1ULHELPMSGSTRINGA0x1B_MSL_IMP_ßEXP0GetPrinterDataA30x00000004L1(CDN_FIRST - 0x0005)61216L_HRESULT_TYPEDEF_(0x8004016EL)0x00040130L0x00000001L6((DWORD)0x80000000)(1U << 12)65STATUS_PENDING(DWORD)0x00440328PROPSHEETHEADERASCARD_ATTR_DEVICßE_FRIENDLY_NAME_A0x000F0000SCARD_CTL_CODE(10)00x0400x000020000x00020000L1(TEXT("video/quicktime"))_HRESULT_TYPEDEF_(0x80090013L)1009((=_midl_unma4(,unsigned long), (_midl_addp(,4)), (=_midl_unma4(,unsigßned long))5066L(0x0400)60x0003L0x0((HWND)-2)SQL_NOSCAN_OFF0x000000020x00000002L7MK_S_ASYNCHRONOUS"1.2.840.113549.1.9.5"0x00290000(WM_USER + 133)SetPrinterDataA(MIXERCONTROL_CONTROLTYPE_SLIDER + 2)150x00020ßx00008000I_RpcServerUseProtseqEp2A(WORD)100000x04331140x00002000_HRESULT_TYPEDEF_(0x80093004L)8920x04312_HRESULT_TYPEDEF_(0x80110407L)CallNamedPipeA0x0432410x04300x000000080x400010x00000x0000003020x0000ß00100x00000200L{0,0,0,0,0,4}10x0004ESB_DISABLE_LEFT0x00000002540x000040000x15022LGetKeyNameTextA0x004753640x00000001L0x000000011825L0x00001000LCreateDialogIndirectA{ 0xdf9d8cd0, 0x1501, 0x11d1, {0x8c, 0xß7a, 0x00, 0xc0, 0x4f, 0xc2, 0x97, 0xeb} }0x00000001L127CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)10x00000004100057010L0x0000008003_HRESULT_TYPEDEF_(0x80028CA2L)TEXT("aßssetNumber")( 0x0010 )0x10x00000001L"1.3.6.1.5.5.7.3.3"0x0100_HRESULT_TYPEDEF_(0x8004020CL)0x020x020138100031318LVarI1FromI443((DWORD)-2)0x00000001RegSaveKeyALANGUAGEGROUP_ENUMPROCA0x00000001LImmGetDescrißptionASTATUS_BREAKPOINT0x00002000(0x00B0 | XCLASS_DATA )( -4 )_HRESULT_TYPEDEF_(0x00040181L)0x021830x0008CharNextA1014L0x00000800330x000000040x10000"Memory"0x00000004L0x0000002d30x101411900x00002000L0ßx410x0002GetPrivateProfileIntA0x000810x140x80000400VarI2FromI40x00001407MM_MIM_OPEN7117OemToCharA2150(PSN_FIRST-13)8405L0x40060x00100000LPOPENCARDNAMEW0x00000000(0x000001F5L)0x00000001L0x00020x000ß02000LOpenDesktopA9016LSIZE_MINIMIZED(WORD)025008534L((ULONG)(ULONG_PTR) () )_HRESULT_TYPEDEF_(0x800C0005L)((BYTE)0x82)VarI4FromI40x0004L"2.16.840.1.113730.1"70x010x200LMAKEINTRESOURCE(32645)10057L2022L0xß00000100_HRESULT_TYPEDEF_(0x80004014L)AddPrinterDriverA0x000100000x00001601298L((LONG)(LONG_PTR)&((( *)0)->))0_HRESULT_TYPEDEF_(0x80004011L)(MCIERR_BASE + 51)0x00070x0000000F(0x0010)((DWORD)0x00000001)390xß0145GetTabbedTextExtentA00x300x000110POPENCARDNAMEA0x000000200x0004017FL0x00000400L0x82_HRESULT_TYPEDEF_(0x00040001L)11SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0301)SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, ß0x0208)SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0207)"2.16.840.1.113730.2"(MCIERR_BASE + 23)(WM_DDE_FIRST+5)PFNGETPROFILEPATHA0x0003(RPC_C_AUTHN_LEVEL_CALL)1109L40x00000002(WM_USER + 110)SCardIntroduceCardTypße(, , , , , , , )0x202"CryptDllFormatObject"0x0010000040x00000001L0x30001810L1119L995LWritePrivateProfileStringA7( 0x80000001 )TEXT("printShareName")_HRESULT_TYPEDEF_(0x8002000DL)AF_PUP(-2)(WßM_DDE_FIRST+8)0x02159128CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)0x00000010L10x00000000LImmGetGuideLineA0x01f0240x00054390L188Lmalloc()( 2 )7THREAD_BASE_PRIORITY_LOWRTsndAlißas('S', 'H')((BYTE)((DWORD_PTR)() & 0xff))0x40000x012A2655350x00000004L0x000000060x000000040x018D1786L_HRESULT_TYPEDEF_(0x80040002L)0x00000002L173009L(TEXT("application/octet-stream"))CTL_CODE(IOCTL_DISK_BAßSE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)0x00001Dff1320L0x0013_SEC_WINNT_AUTH_IDENTITY_A0x00160x000000040x000410x0004L0x0007246(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAY_NOSHOW ß| 0x00000003)1911L0x004013((LPCSTR) 1)11UL0x000000100x00000020L4(-1)0x000000020x0158"2.16.840.1.101.2.1.1.19"0x00010000L(SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)((DWORD)0x0080)20x00000001(MCIERR_BASEß + 12)_HRESULT_TYPEDEF_(0x80010008L)"1.3.14"MAKEINTRESOURCE(22)SECTION_QUERY0x00020x000000000x000080001003TEXT("RemoteFax")0x10000000CreateFontIndirectA8321L0x00000001L5170x50000000L_HRESULT_TYPEDEF_(0x800040ß19L)(0x0004)0x01SCardListCardsA0x00E10x464D45200x01a40x00030x400000000x828540L0x00000002L2130x810x808361L0x7F8435LMDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_HDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPßEED_64K, MDM_HDLCPPP_AUTH_PAP, MDM_HDLCPPP_ML_2 ) )30x7E"2.5.8.1"(3 + MCI_SEQ_OFFSET)0x7D{ NDRcopy ( (((char __RPC_FAR *)())+()), ()->Buffer, (unsigned int)(()-())); *(unsigned long __RPC_FAR *)&()->Buffer ß+= (()-()); }0x00B1CreateDialogParamA0x7C_HRESULT_TYPEDEF_(0x800F0219L)0x7B_HRESULT_TYPEDEF_(0x80070006L)0x7A0(&()->userContext)0x00000400L0x794318L4ERROR_INVALID_HANDLE0x110x130x00040120L32_HRESULT_ßTYPEDEF_(0x80040012L)0x10000x2000_HRESULT_TYPEDEF_(0x80091008L)_HRESULT_TYPEDEF_(0x8010002EL)(0x10000000L)0x00000100LGetCPInfoExAMAKEINTRESOURCE(32640)20x0183CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, ßFILE_ANY_ACCESS)0x0010L1_HRESULT_TYPEDEF_(0x800401A0L)0x004000002ERROR_CANNOT_OPEN_PROFILE_HRESULT_TYPEDEF_(0x80097009L)0x0000080038(MMIOERR_BASE + 16)10x00020000L( = (RPC_BUFPTR )((ULONG_PTR)(+3) & ~0x3))ß0x10050x00000100ESB_DISABLE_RIGHT( = (RPC_BUFPTR )((ULONG_PTR)(+1) & ~0x1))RegUnLoadKeyA0x700000000x00000006L2002LSCardStatusA0x140x10000000_HRESULT_TYPEDEF_(0x800401F3L)"1.3.6.1.5.5.7.1""1.3.14.3.2.26"0x87àß(-2)0x86_HRESULT_TYPEDEF_(0x80090318L)(0x0080)0x850( = (RPC_BUFPTR )((ULONG_PTR)(+7) & ~0x7))0x00000003L0x840x80040170L0x0400000000x83_HRESULT_TYPEDEF_(0x80010118L)1743L0x00000002L0x000000139017LmmioOpeßnA0x0001000018LWaitNamedPipeADeviceCapabilitiesA0x00000000L0x00000800L( SecurityDelegation << 16 )0x00F30x80000000( 4 )__cdecl160x00000080LIDI_HAND_HRESULT_TYPEDEF_(0x80010101L)1020x00020000L1780L31(DWORßD)0xFFFFFFFFTEXT("portName")0x000A0x7SCARD_CTL_CODE(15)1281220x00040000GetMenuItemInfoA(-7)"CertDllOpenStoreProv"_HRESULT_TYPEDEF_(0x80090020L)(0x0)CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_REAßD_ACCESS)0x00004001L51898L140x00020x01270x62"2.16.840.1.101.2.1.1.2"_HRESULT_TYPEDEF_(0x80004003L)SQL_TRANSLATE_OPTION_HRESULT_TYPEDEF_(0x80080008L)SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020b)330x040000ß000x00000001L2VkKeyScanASQL_INTERVAL_DAY_TO_HOUR0x00090x00000001L(0x00C0 | XCLASS_NOTIFICATION | XTYPF_NOBLOCK)137L0x00000011(~MAXLONG_PTR)5(MCIERR_BASE + 55)8424L0x000000020x04((DWORD)0x00000002)0x030C1010ß5L0x80008525L0x010x0390x01A68218L128_HRESULT_TYPEDEF_(0x80093018L)10x03E0_HRESULT_TYPEDEF_(0x80110808L)0WSANO_DATA"2.5.29.15"45_HRESULT_TYPEDEF_(0x8011040DL)9606L(0x00000000L)10x14100x02003790x0001àß0x0000000480x00000002L0x0000800020x40000x090x00000400L4((HRESULT)0x000400FFL)550x01000000(BF_DIAGONAL | BF_BOTTOM | BF_RIGHT)GetTempPathABLACKONWHITE5013L0x10x02(0x00000203L)0x00000007L11140x02000x0000ß0008IID_IInternetBindInfoCRYPT_HASH_ALG_OID_GROUP_ID0xAWriteConsoleOutputCharacterA0x00010000L10047L0x00200000l0x000000020x019E0x000D0x000000018mmioFOURCC('D', 'O', 'S', ' ')145042L0x000110200550x00000200àß_HRESULT_TYPEDEF_(0x80097002L)(MCI_VD_OFFSET + 2)5058L0x18((DWORD)0x00000020)0x000x00000008815072L20x00000800L((DWORD)0x00000010)_HRESULT_TYPEDEF_(0x80028028L)0x00022_HRESULT_TYPEDEF_(0x80010136L)"1.2.840.113ß549.1.7.2"0x002500000x00000040L0x00100000L15((LPCSTR) 19)0x3D00x000100001406Lsizeof(DWORD)12(WORD)60000x00000001L0x00011181L"%"0x00000001LFIELD_OFFSET(NOTIFYICONDATAW, szTip[64])_HRESULT_TYPEDEF_(0x8001000FßL)200x00001000L1178L149L0x000000020x10x000400000x0207SCARD_CTL_CODE(16)(u_long)0xffffffff0x08416480x00000002L4334L2MF_DEFAULT911060x00000080200x00000005360x050x494f0x00000000L65390x0010(()->pRßecInfo)(MIDIERR_BASE + 1)50x00F2LoadKeyboardLayoutA20x020000000x1003MessageBoxA((LPCSTR) 15)_HRESULT_TYPEDEF_(0x80092029L)320x00100000L_HRESULT_TYPEDEF_(0x8002000FL)typename Allocator::rebind<>::other0x0080àß0x0( -7 )8442L"1.2.840.113549.1.7.5"0x00010000LGetServiceKeyNameA0x08000U0x000FGetClipboardFormatNameA10TA_BASELINE0x00000020L0x018C1052L0x00000400x0010"CryptMsgDllExportKeyAgree"0x00000009L0x0000_HRESULTß_TYPEDEF_(0x80093105L)CallWindowProcA11283_HRESULT_TYPEDEF_(0x80090321L)_HRESULT_TYPEDEF_(0x80030202L)13SYSYNC_OEMDialogBoxA0xA10x0300(MMIOERR_BASE + 15)0x00000001L0x0000004070x0d0x00000100LMAKEINTRESOURCEß(32513)FW_EXTRALIGHT0x0000L0x0008CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)(-2L)0271828L(1U << 3)8_HRESULT_TYPEDEF_(0x800B0102L)8320x000000FF12SQL_MAX_STATEMEßNT_LEN0x00000020L64615_HRESULT_TYPEDEF_(0x8004E027L)0L10x0300(WORD)65000_HRESULT_TYPEDEF_(0x800300FAL)1106L0x000500000x000001000x00x0100'PSOC'0x000F10x000000040x015A0x0008L_HRESULT_TYPEDEF_(0x800C0013L)àß0x2030x00100x00004007L0x00000001_HRESULT_TYPEDEF_(0x8009700DL)0x000110x03000x10000x00001201RpcBindingInqAuthInfoExA0x000000020x00020x000240x026610014(((int)((LPBYTE)(&((*)0)->) - ((LPBYTE)((*)0)))) + ßsizeof(((*)0)->))( 0x40 )"1.3.14.3.2.24"0x00000400L0x00004002L2565120x800000000x0001_HRESULT_TYPEDEF_(0x80093107L)1017(2)1824L1051L80L0x30010x0400208L"2.16.840.1.113730.1.13""1.2.840.10046"_HRESULT_TYßPEDEF_(0x80030103L)6100x00000002SQL_MAX_ROW_SIZE(((int)((LPBYTE)(&((*)0)->) - ((LPBYTE)((*)0)))) + sizeof(((*)0)->))0x20xC0EF((DWORD )0xC0000017L)(WM_DDE_FIRST+4)_HRESULT_TYPEDEF_(0x80097018L)TEXT("printßQueue")0x0144(((()>>N_TSHIFT)&~N_BTMASK)|(()&N_BTMASK))0x00D3_HRESULT_TYPEDEF_(0x800F0215L)140L1396L52000x0003( 0x20 )((DWORD)0x00000008)7038L1745L3006L( -3 )8200LmidiInGetErrorTextA5009L_HRESULT_TYPEDßEF_(0x8004000AL)ExtractAssociatedIconA0x40020x000000030x11OemToCharBuffA197L0x000000010x000000400x1a11013L8404L(0x0002)0x000000011240x000000100x00080x00030x008E((LPCSTR) 32)1711L0x0100L10048LV_UNION(ß, scode)0x0001*((  *))++_HRESULT_TYPEDEF_(0x800300FFL)*((  *))++0x00000020(WM_USER+1)*((  *))++0x00000020((DWORD )0xC0000091L)0xffffffffTEXT("MinorVersion")*((  *))++0x00000000L0x00040180L1140ßL5400x03424328L199_HRESULT_TYPEDEF_(0x80093021L)_HRESULT_TYPEDEF_(0x8001012AL)_HRESULT_TYPEDEF_(0x80010102L)1153LSQL_INTERVAL_HOUR5031448L((DWORD)0x00000006)2"2.5.4.23"1EnumTimeFormatsA0x0003( ().cbSizeß - sizeof(().ulClipFmt) )12000x00000010L_HRESULT_TYPEDEF_(0x80090019L)"1.3.14.3.2.25"290x000000020x00000100L_HRESULT_TYPEDEF_(0x80010007L)30x80000000558MB_ICONHAND170x130x000122_HRESULT_TYPEDEF_(0x800401ß80L)4323L426__cdecl2563(TEXT("text/richtext"))0x000000019714L((() >> 31) & 0x1)1080L0x020000000x0284CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)0x0004010FL1761L(0x0010)RegCreateKßeyA0x00010x00010000LSQL_WCHAR0x50000000L(( *)( (PCHAR)() - (ULONG_PTR)(&(( *)0)->)))0x00080000L1706L0x00000002L1581327LSQLINTEGER1401LAF_FIREFOX60x00000010(WM_USER+0)(MCIERR_BASE + 1)0x0001_HRESULTß_TYPEDEF_(0x8009310EL)0x0008L(0x00000002L)(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_QUEUELEN | PERF_TIMER_TICK | PERF_DELTA_COUNTER | PERF_DISPLAY_NO_SUFFIX)4(MMIOERR_BASE + 9)1118L__cdecl0x00008000L(CERT_ßSYSTEM_STORE_CURRENT_USER_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)5048L220DrawTextExA0x000F4452108L280xFE__stdcallSQLSetPos(,,SQL_UPDATE,SQL_LOCK_NO_CHANGE)720x06(-2)3UL0x0010530xffffffff_HRESULT_TYPßEDEF_(0x8009700CL)_HRESULT_TYPEDEF_(0x80040112L)( -8 )0(-21)30x00002000L25SQL_INTERVAL_SECONDILLUMINANT_C6003L1425L0x0496970080x000001000x3CB0x04950x04940x000000040x0010(0x00000008L)tzsetCTL_CODE(IOCTLß_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)0x049353_HRESULT_TYPEDEF_(0x80110434L)0x00010000l0x0492(-1)160x00004004L0x04910U0x04900x00000002L_HRESULT_TYPEDEF_(0x80010127L)530x000100004314L0x0162àß8364L(CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY_ID << CERT_SYSTEM_STORE_LOCATION_SHIFT)0x000114120x000000000x00041034100x0001LSCardGetCardTypeProviderNameA(TEXT("video/x-sgi-movie"))10x04970x40070x00000400àß0x0000200013"1.2.840.113549.1.9.9"( 8 )SNDMSG(, PSM_RESTARTWINDOWS, 0, 0L)CharNextA411010L((DWORD)0x00000102)0x00001805(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)_HRESULT_TYPEDEF_(0x80090332L)0x8000000030x0000ß200070x00004000_HRESULT_TYPEDEF_(0x80010120L)8SML_ERR_A_XPT_ERROR + 0x100x00040x40AbortSystemShutdownA1238L10x000000140x000001000x00001000L((UINT)-1)(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_RSA|ALG_SID_RSA_ANY)3(voißd)SNDMSG(, CDM_SETCONTROLTEXT, (WPARAM), (LPARAM)(LPSTR))(WS_POPUP | WS_BORDER | WS_SYSMENU)2(0x1)0x002010049LSQL_QUIET_MODE0x3A3(ALG_CLASS_DATA_ENCRYPT|ALG_TYPE_BLOCK|ALG_SID_3DES_112)8(0x0001)0x016L0x000ß4(WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)SQL_QU_PROCEDURE_INVOCATION0x043f0x043b120x043e0x043a0x00000x043d0x043912811014L(-7)CERT_RDN_DISABLE_IE4_UTF8_FLAG0x043c0x04380x0211((DWORD)0x0002)0x00ß0012030x10000000L10071L(0x00000008L)100050x061C0x000001000x20(-2)1903L0x2000551021L132L10x004000004L0x002000001336L0x00100000232LHC_NOREMOVE0x000800008017L"CryptDllFindOIDInfo"20x00040000110x000ß200000x0BReadConsoleInputA0x000100000x000110080x0040"1.2.840.113549.1.9.4"0xF1708417L40x00000C00L0x0004019FLEnumWindowStationsA0x0064CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)35_ßHRESULT_TYPEDEF_(0x800401EFL)10058L1411L0x00MAKEINTRESOURCE(32513)15(-3)0x0000000a0x0200(CDM_FIRST + 0x0004)LHashValOfNameSys(SYS_WIN32, , )80x4000L0x010000000x00010x0080000062((DWORD)0x00000001)0x00040ß000L0x534B_HRESULT_TYPEDEF_(0x800F0217L)(0x00000207L)"1.3.14.7.2.2"_HRESULT_TYPEDEF_(0x8004006BL)SQL_BIT20RpcNsProfileEltAddA0x00D4_HRESULT_TYPEDEF_(0x80040206L)LogonUserA510CharUpperA0x00010000L64POPENCARDNßAME_EXA0x1dSCHAR_MIN_P_DETACH0x00000005_HRESULT_TYPEDEF_(0x8011042CL)0x00040110L2370x200E8354L((DWORD)0x0020)((__std(size_t)) &((( *) 0)->))0x00000800L0x03031171L(0x80000007)Shell_NotifyIconA10055LSecußrityImpersonation0x000100000x000000130x00114(~0UL)0x424D5144_HRESULT_TYPEDEF_(0x80110418L)GetDefaultPrinterA20x02FA1364L8422L20x04000000( CERT_CHAIN_POLICY_IGNORE_END_REV_UNKNOWN_FLAG | CERT_CHAIN_POLICY_IGNORßE_CTL_SIGNER_REV_UNKNOWN_FLAG | CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG | CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG )1371L0x00000100L40UL0x0228DecryptFileA((sizeof() == sizeof(float)) ? __fpclassifyf((floaßt)()) : (sizeof() == sizeof(double)) ? __fpclassifyd((double)()) : __fpclassifyl((long double)()) )ImmSetCompositionFontA1125LVarCyFromUI49655L0x40000000DATEFMT_ENUMPROCA0x00010x00000010CreateDirectoryExA0xß00000002160x08001(0x4)0x00000010SHAREVISTRINGA0x000000000x000000101389L-250x0001SCardSetAttrib0x0008120PROPSHEETPAGEA_V1_SIZE0x00000002655339SQL_TXN_READ_COMMITTEDMS_DEF_DSS_DH_PROV_A0x240x00000080FILßE_DEVICE_DISKERROR_GEN_FAILURE(0x3)(0x00040000L)190x0006_HRESULT_TYPEDEF_(0x8011044CL)8360L0x00002000LSCardForgetReaderA15430x012BCERT_RDN_ENABLE_UTF8_UNICODE_FLAG0x80000080TEXT("printOrientationsSupported")5àß_HRESULT_TYPEDEF_(0x8004E028L)0x00000002((LPCSTR) 21)0x000000031SetWindowTextA13ImmGetCompositionFontA28730x3D2MAKEINTRESOURCE(10)ILLUMINANT_AResetDCA0x00050x00000010( & (7 << 13))0x0000000227(STANDARD_RßIGHTS_REQUIRED|SYNCHRONIZE| TIMER_QUERY_STATE|TIMER_MODIFY_STATE)(0x8)100x00010x3A220x220x00000007L0x08190x000210x00000040SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA005)MAKEINTRESOURCE(32515)0(MCIERR_BASßE + 72)517(PSN_FIRST-12)20x0d20x00002000L(WM_USER+1)(-1)0x1004WNetConnectionDialog1AFindWindowA"/ "0x000401FFL1210x00058494L0x00800000RpcNsBindingExportA_HRESULT_TYPEDEF_(0x8010001AL)_HREßSULT_TYPEDEF_(0x800300FDL)27(CERT_COMPARE_NAME << CERT_COMPARE_SHIFT | CERT_INFO_ISSUER_FLAG)_HRESULT_TYPEDEF_(0x80097017L)_HRESULT_TYPEDEF_(0x80010124L)71L0x00000800(0x00000004L)0x00200x000000040x000002000x00010ßx010000005WNetGetLastErrorA0x00C9SetPrinterDataExA(ALG_CLASS_MSG_ENCRYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_PCT1_MASTER)8481LwaveInGetErrorTextA32SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSIßON_TXTCMSG_SIGNED_DATA_V10x100070x000000022013L((DWORD )0x00010002L)(CDM_FIRST + 0x0005)0x00040x10080x00100000LERROR_DEVICE_ALREADY_REMEMBERED94(MMIOERR_BASE + 7)0x00021234L0x00021717L22AddPrinterDriverExAàß0x00000040L(-6)((()<> MDM_SHIFT_PROTOCOLID)0x00100x000000010x00000008__stdcall1610L850x000E0000_HRESULT_TYPßEDEF_(0x80097004L)20()0x00000100L0x000000000x00000002L0x00000000QueryServiceConfig2A5RpcNsMgmtEntryDeleteAENUMRESNAMEPROCA0x01000x00000004(PERF_SIZE_DWORD | PERF_TYPE_COUNTER | PERF_COUNTER_BASE | PERF_DISPLAYß_NOSHOW | 0x00000001)5084L0x00080000LAF_NS0x0104(struct _EXCEPTION_POINTERS *)_exception_infoDeletePrintProvidorA0xC0xFFFFFFFFV_UNION(, pintVal)0x800x00000040l(MMSYSERR_BASE + 6)3(SERVICE_WIN32_OWN_PROCESS | ßSERVICE_WIN32_SHARE_PROCESS)0x0010000000x00000020l"2.5.29.5"0x00000010l0x01000000L0x00080x00040x00021240L0x000000800x00010x00000001L0x00002000L((DWORD)-1)327672( 1 << CERT_QUERY_CONTENT_SERIALIZED_STORE)10àßLoadMenuIndirectA10009L5057L0x00000010L0x80008000450x00000100l0x00000080l0x50001(-5L)0x00000005L70x040x0000002((((WORD )()) << 10) | (WORD )())0x00240000FindResourceAImmGetIMEFileNameAURLOpenBlockingStßreamACTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)CCSIZEOF_STRUCT(PROPSHEETPAGEW, pcRefParent)mixerGetLineControlsA1024( 1 << CERT_QUERY_CONTENT_SERIALIZED_CRL)3170x00000400L40x800000100x0000ß00010x00000008268TEXT("printerName")0x0003LCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00000400L( 4 )14_HRESULT_TYPEDEF_(0x80010012L)0xffff( 0x100 )0x000000240x4001((STANDARD_RIGHTßS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE))0x000000800x0000800011120x00010000(0x00000000L)1549RegEnumKeyA30x00000001(WM_USER + 132)0x000080000x1003((DWORD)0x00000001)0x0f1802L2560x8(MCßIERR_BASE + 71)240x0000005200x000100000x08000x000000010x0008121218L__inline0x00060x10x40GetTimeFormatA((HRESULT)0x00040000L)1332L(MCI_STRING_OFFSET + 18)_HRESULT_TYPEDEF_(0x800401ECL)0x0200"2.5.4.36"0x00ß004001L11CreateSemaphoreA00x00000080LRpcBindingInqAuthClientA0x000000070x150x81131L0x00010x0007CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00000040(MIXERCONTROL_CONTROLTYPE_BOOLEAN +ß 1)0xffff10x800401FFL1358L0xF0000x00010000L0x000000200x00000020L0x00090x05(100 + SQL_CODE_MINUTE_TO_SECOND)_HRESULT_TYPEDEF_(0x8010002BL)"2.16.840.1.101.2.1.1.12"0x00004000L2001L0x00000004IME_CMODE_NATIVE(MßIXERCONTROL_CONTROLTYPE_FADER + 2)3580x000100008497L0x1000000266L0x00004005L(0x0010)40x00000x00000002L(MAKELONG((short)(().x), (short)(().y)))0x00000004L1053L521608L(1U << 2)0x002600000x0800L1775L0x0ß0000002LERROR_IO_PENDINGGetLocaleInfoA_HRESULT_TYPEDEF_(0x80010121L)(0x1000)1334L0x000000040x00000010sndAlias('S', 'E')130x000000010x0800"\n"0x00048545L"1.3.6.1.4.1.311.20.2.3"0x0008_HRESULT_TYPEDEF_(0x80096ß001L)0x000000100x00020x00020000L0x000000040x0416DCB_ACCUMULATE0x02(100 + SQL_CODE_MINUTE)938400L0x70TEXT("printMaxYExtent")_HRESULT_TYPEDEF_(0x80100010L)0x00200000( 50 )20x01510x00000008L73"1.2.840.113549ß.1.10"0x0020_HRESULT_TYPEDEF_(0x8001010DL)AF_DECnet0x00004003L138L9"1.2.840.113549.1.12"0xffffffff0x0004qword ptr 0xbfd2bec3330188660x00008000LTEXT("printMaxXExtent")0x7003600x8004019FL151006L0x0080((DWORDß)-1)11DeleteMonitorA8243LmciSendStringASQL_OPT_TRACE0x000000200x00004007L8490L1211L00x00020000L(() & 0x00ff)SetMenuItemInfoA8313L0x800002000x00000001L0x00000000L(MMSYSERR_BASE + 7)170x000000019998475Làß0x370x0080L0x00150POPENCARDNAME_EXW024SQL_RD_ON(MMSYSERR_BASE + 9)16(0x2000)8376L0x0008NDR_LITTLE_ENDIAN(MIXERR_BASE + 2)0x019A_HRESULT_TYPEDEF_(0x800F0200L)_HRESULT_TYPEDEF_(0x800F0000L)(ALG_CLASS_MSG_ENCRßYPT|ALG_TYPE_SECURECHANNEL|ALG_SID_TLS1_MASTER)ERROR_NO_MORE_DEVICES( 6 )268399LERROR_MAX_THRDS_REACHED15450x00000002(1 << CMSG_SIGNED)6ENUMRESTYPEPROCA10x02000x00000200L0x0a320x00004006L1"1"2SNDMSG(, PßSM_SETHEADERTITLE, (WPARAM)(), (LPARAM)())(fpclassify() == FP_NAN)12090x000000017(-1)_HRESULT_TYPEDEF_(0x800B010EL)0x8004010FL0x00020000L500_HRESULT_TYPEDEF_(0x80030111L)0GetSystemWindowsDirectoryA0x000000ß04L0x00001000L0x00020x00000008L20x00800000TEXT("printerNameAliases")3_HRESULT_TYPEDEF_(0x8011044BL)9615L240x00000093146LGetCharWidth32A7GetWindowsDirectoryA((DWORD)0x10000000)0x000B0x0(_midl_ma4( , unsißgned long) = , _midl_ma4( , unsigned long) = 0, _midl_ma4( , unsigned long) = )0x081120x090x000000010x00300000((WORD)0x0200)0x0004L0x011467L(0x00000202L)SQL_COLUMN_MONEY210x0004"CryptMsgDllGenContentEncßryptKey"0x00021140x00000005L130x0000100041000x00000200L60x020x00000003DWLP_DLGPROC + sizeof(DLGPROC)0x000100000x00104_HRESULT_TYPEDEF_(0x800F0212L)3212(BF_DIAGONAL | BF_BOTTOM | BF_LEFT)mmioStringToFOURCßCA(MMSYSERR_BASE + 12)30x0000100057100540x00000000URLOpenStreamAPI_CLSIDLOOKUP0x0020psh15_HRESULT_TYPEDEF_(0x800F0003L)IInternetProtocolSink(-1)58(BDR_RAISEDINNER | BDR_SUNKENINNER)_HRESULT_TYPEDEF_(0x80093ß002L)1074( 0x4 )99720x000D960x3D1_HRESULT_TYPEDEF_(0x800C000AL)DECLSPEC_IMPORTTIMEFMT_ENUMPROCA0x00400x023010x00000002L0x00800xF0606((DWORD )0x80000001L)0x0920x0020190480x003000000x001020x000000ß00L201184300L0x00015130x20x0008CreateFontAWriteProfileSectionA0x10060x00020000V_UNION(, intVal)110x02900x0200000030x00400x01(-5)10x3B80x0008L0x000x3C50x00000001LSQL_MAX_CONCURRENT_ACTIVITIESERRORß_BUSY0x00041400L45322102410030x2000042113NULL( 1 << CERT_QUERY_CONTENT_SERIALIZED_CTL)"CertDllVerifyRevocation"8(1U << 4)0x5(MCIERR_BASE + 35)0x0001L_HRESULT_TYPEDEF_(0x80093106L)4315L0x000100006'sRGBß'_HRESULT_TYPEDEF_(0x8001013FL)0x100a0x05490x8004016FL0x00000200L_HRESULT_TYPEDEF_(0x8009100FL)560x000000019505L1712L0x000001005((() & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT))0x00004008L40x0001ß_HRESULT_TYPEDEF_(0x80080007L)( -6 )050x170x001002NOTIFYICONDATAA_V1_SIZE0x0521OpenEventLogA0x000000010x00000008850x01000000L0x4000000x000000001"2.5.4.30"61151394L0x29SQL_OWNER_USAGE0x000000000x8000ß119010069L((DWORD)(((BYTE)() | ((WORD)()<<8)) | (((DWORD)(BYTE)())<<16)))0x00050x0004880x0000000410101L9851Ldo { u_int __i; for (__i = 0; __i < ((fd_set FAR *)())->fd_count ; __i++) { if (((fd_set FAR *)(ß))->fd_array[__i] == ) { while (__i < ((fd_set FAR *)())->fd_count-1) { ((fd_set FAR *)())->fd_array[__i] = ((fd_set FAR *)())->fd_array[__i+1]; __i++; } ((fd_set FAR *)())->fd_count--; break; } } } while(0)(MIXERßLINE_COMPONENTTYPE_SRC_FIRST + 1)((()&(~1))==0)(0x0080)27L10x0000002b60x00000400L0x0000002c01635L3(-6)0x0000002d10x0000002e0ULSQL_MAX_TABLES_IN_SELECT0x000000200x023(MIXERLINE_COMPONENTTYPE_DST_FIRST +ß 1)LoadBitmapA0x00040000L(( >> CRL_DIST_POINT_ERR_INDEX_SHIFT) & CRL_DIST_POINT_ERR_INDEX_MASK)0x10080x0000002cmmioFOURCC('M', 'E', 'M', ' ')60x0301224L3TEXT("description")31634L0x00000002L0x1354SetFileSeßcurityA0xFF00000010x003380x00004000L0x800000800x00000100L85076LSHGetDiskFreeSpaceExMM_MIM_ERROR10(0x00000015L)13000x00004000L0x012D1924L"2.5.4.34"28200x00010000LWHITEONBLACK1010L0x00010000L0x000D43àß8217L200x100x00004000200x3D00x000000551UL0x0400((BYTE)(()>>16))0x000000040x0000001d8211L0x0000001c0x035F80L0x80000000L_HRESULT_TYPEDEF_(0x8002802DL)11011L20640x0281((DWORD)0x0020)0x00050x000000190ßx10000000LSTATUS_FLOAT_UNDERFLOW0x00040x000200000x00000018_HRESULT_TYPEDEF_(0x80010119L)0x0000001b0x00020x00040x0000001aSetPropASendMessageA0x460x00000001LChangeServiceConfig2A0x00007FFFERROR_INVALID_SECURITYß_DESCR0x00000015290x00000004160x1150x00000017GetPropA1410x0000001600x000000400x00000040L8302L0x00400000(TRUE)( 0x4 )0x200000000x000100000x004021064SCardAddReaderToGroupA0x0004E02FLwaveInGetDevCapsAPFßNRECONCILEPROFILEA0x0002(0x00000006L)22((KEY_READ) & (~SYNCHRONIZE))2920x00800000L5140x046637_HRESULT_TYPEDEF_(0x8003001EL)SYSER_PRODCODE_SERVER_PRO80x000000020x000020000x60x130x5D0x400010VarBstrFromUI4ß30x00050000L0x000121_MSL_ERROR(, )6717(CERT_COMPARE_EXISTING << CERT_COMPARE_SHIFT)WNetOpenEnumA110x00000003L70x0000100440x00000004690x0005L(0x000001F6L)0x80010000INFINITE_HRESULT_TYPEDEF_(0x00040000Lß)CreateProcessAsUserA490x040000000x04660x04060x04650x0405((WORD )() & 0x3ff)10001PropertySheetA00x04640x04043(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)0x04630x04030x04620x04020x00010x04610x040140ß"2.5.4.17"0x04600x04008410L1435LOutputDebugStringA640x80008341L0x00040x00000000L8368L"1.3.14.3.2.9"0x00B000001(MMSYSERR_BASE + 21)0x01A80x00B40x0002000011420x0001PSCARD_READERSTATEW0x004000000x04680xß04080x00020x000000200x06_HRESULT_TYPEDEF_(0x80040003L)00x4000000010x04670x0407SetClassLongW50x0010EnumPrintProcessorDatatypesA1L0xA310140x2000L0x0161__stdcall0x00080000LPSCARD_READERSTATEA10x00004002Làß_MSL_ERRNO1ULCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)SetClassLongACTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)0x00000008113L7827(MMSYSERR_BASE + 11)15430x00ß0001001544((LPCSTR) 38)GetConsoleTitleA0x000000010x10000x00010x00000004L(0x00000204L)((DWORD )0xC000008EL)0x000000400x001B000061090x00000002_HRESULT_TYPEDEF_(0x800401E1L)1906L33L0x000002002SNDMSG(, PSM_ßCHANGED, (WPARAM), 0L)1724LGetClassLongW0x00000004L10x00004004L(0x0020 | XCLASS_DATA | XTYPF_NOBLOCK )0x00000001L5910x00002000LCryptSignHashA104(PSN_FIRST-0)"1.2.840.113549.1.7.4"9009L_HRESULT_TYPEDEF_(0x80ß100017L)8352L5( 1 << CERT_QUERY_CONTENT_CRL)0x0004000041060x3050x00000002RegQueryValueA4339Lqword ptr 0x3fda82795703f2d4GetClassLongA113L0x000000001012250L11RegDeleteKeyA0x00000002L0x00008000( 0xf008 )àß25FW_EXTRABOLD8482L_HRESULT_TYPEDEF_(0x8009030BL)0x00100x00000020510x007F8420L(&__std(__files[0]))695043L80x00100x00801_HRESULT_TYPEDEF_(0x00041306L)1550x40040x00000020CTL_CODE(IOCTL_DISK_BASE, 0x0005, MEßTHOD_BUFFERED, FILE_ANY_ACCESS)0x000000150x0010L1840x00000000L90000x00804100x000000013RemoveFontResourceA18488L{ *() = *(*(char __RPC_FAR * __RPC_FAR *)())++; }0x00021081L(TEXT("audio/basic"))0x00000020ßL0x000020000x00010000L_HRESULT_TYPEDEF_(0x800401E0L)0x0415EnumResourceNamesA384000x000C}0x2( 0x80000000 )L1916L0x20000000UL4SQL_INTEGER0x00000080l0x0148SQL_COLUMN_TYPE_NAME2(0x8)0x1000000018EnumFormsßA0x00001011_HRESULT_TYPEDEF_(0x800300FEL)09618LSQL_COLUMN_UPDATABLE((DWORD)0x00000004)0x0086()(0)SNDMSG(, PSM_QUERYSIBLINGS, , )CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)10x0ß0040000L_HRESULT_TYPEDEF_(0x80100005L)9552L140x0001173L120x00100x4000_HRESULT_TYPEDEF_(0x8001012EL)_HRESULT_TYPEDEF_(0x800401F6L)0x0000000238MAKEINTRESOURCE(32512)0x00000003671162L1640xA20x0000FFFF(MCIERßR_BASE + 69)_HRESULT_TYPEDEF_(0x80100011L)DefFrameProcASQL_AUTOCOMMIT0x019F_HRESULT_TYPEDEF_(0x80010005L)0x000000040x00100000l55CF_NOVECTORFONTSCertStrToNameAszOID_RSA_RSA0x14_HRESULT_TYPEDEF_(0x80100019L)0x800ß401AFLCTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)3"2.5.4.6"130x000000018CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)"1.2.840.113549.1.7.4"0x000100001601L( 1 <ß< CERT_QUERY_CONTENT_CTL)0x00000080L0x0004_HRESULT_TYPEDEF_(0x80091004L)32853551369L1129L0x00040x000000080x00400x000561"Limited to 1 simultaneous sync sessions"0x00020000L_HRESULT_TYPEDEF_(0x80100012L)0x0040ß0000L3AF_IPX370x0000200000x00048233LGetPrivateProfileSectionACTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)(-1)2TEXT("BeepEnabled")0x0001"%"ERROR_NONE_MAPPEDMB_ICONHAND0x0400L0x0002àß40x01001030x00000F00L0x20000xFFFFFFFFCreateServiceA0x00AF_ISO0x00010000L0x3D1do { if (((fd_set FAR *)())->fd_count < FD_SETSIZE) ((fd_set FAR *)())->fd_array[((fd_set FAR *)())->fd_count++]=();} while(0)ß80x0000000032MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_ANALOG, MDM_GEN_ANALOG_PROTOCOL_DATA ( MDM_ANALOG_RLP_OFF ) )388477L0x00000020(TEXT("image/bmp"))0x00000019((VOID *)(INT_PTR)((int)))0x0400(-3L)14"1.3.14.3.2.ß7"290x01000000GetJobA0x421538153L0x0400"1.3.6.1.4.1.311.10.3.1"_HRESULT_TYPEDEF_(0x80040209L)60x00000400141L28L0x00020x01820virtual HRESULT STDMETHODVCALLTYPE 0x150x000000403()0x153004L(PSN_FIRST-ß10)0x00000001100x000900x0002sz_CERT_STORE_PROV_FILENAME_W0x00000040L(1*4)(MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)5virtual  STDMETHODCALLTYPE 0x00000001320x107 STDMETHODVCALLTYPE10060L612UL(().ßHighPart = () < 0 ? -1 : 0, ().LowPart = ())60x00020x001A000080x80000020(2)1_HRESULT_TYPEDEF_(0x800401F4L)0x00023300x00010000L0x00FF0x00020000(8<<4)MDM_GEN_PROTOCOLINFO( MDM_PROTOCOLID_HDLCPPP, MDM_GEN_ßHDLCPPP_PROTOCOL_DATA ( MDM_HDLCPPP_SPEED_64K, MDM_HDLCPPP_AUTH_DEFAULT, MDM_HDLCPPP_ML_2 ) )0CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)(ALG_CLASS_KEY_EXCHANGE|ALG_TYPE_ANY|ALßG_SID_MD5)(MIXERLINE_COMPONENTTYPE_DST_FIRST + 3)0x000023280x0004L(~MAXINT_PTR)0x1000_HRESULT_TYPEDEF_(0x80093022L)0x000000010x454C4946L(-5)0x00000040L_HRESULT_TYPEDEF_(0x80092003L)8329L0x00801(-3)1004((LPCSßTR) 3)0x100x00000001((BYTE)())(MCIERR_BASE + 33)_HRESULT_TYPEDEF_(0x00030206L)FILE_CASE_PRESERVED_NAMES25_HRESULT_TYPEDEF_(0x80090024L)0x800000((DWORD)((((DWORD)((WORD )())) << 16) | ((DWORD)((WORD )()))))SC¾ardIntroduceCardTypeA(MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_SINGLE | MIXERCONTROL_CT_UNITS_BOOLEAN)TA_CENTER1353L"LocalizedNames"0x0310x00000004( 2 )1713L70x000000ffá€ûð⤾äûÔâ°¾ä û”â³¾ä°û|â¾¾äÀûTâžè,âä¾äàû@áú¾èáü¾èˆáÿ¾äüàá¿è¬á*¿ä0üàá0¿è„á5¿è$áK¿ä`ü¼áW¿äpü˜áY¿ä€ühá\¿äüLág¿ä ü ái¿ä°üá‚¿äÀü”ᆿèpá¿äàüøá˜¿èØá£¿è„áÀéá.Àä ý á:Àä0ý¸á=Àä@ý”áJÀè€áQÀä`ý´áWÀèhádÀä€ý áoÀèèáqÀä ý¬ áxÀè” ázÀè$ á…Àè@ á™Àäàýü á Àèä á±Àåþ á³Àäþü áºÀä þˆ áÆÀèH áÑÀä@þh áÕÀèH áØÀä`þÈ í° áßÀè íÀ ááÀâü@åÔ áôÀä´þXáúÀè,áÁäÔþ$áÁääþáÁäôþôáÁèÔáÁäÿ(á'Áä$ÿá3Áä4ÿ¸á?ÁèˆáKÁäTÿáZÁädÿ¼á]ÁèáhÁä„ÿLá|Áè0á‡Áä¤ÿðá’Áä´ÿÐá®ÁäÄÿ¼á¹Áè˜á¼Áääÿ¸áÁÁäôÿtáàÁèáåÁä€í0áèÁè¸áðÁäDpáûÁäT\áÂèDá Âät áÂèxáÂèìá#Â䤰á'Âä´”á2Âèxá5Âè@áQÂäääá]ÂèÌáxÂäüá{Âäèá€Ââü@å\á–Âä8œáªÂäHDáÁÂè áÌÂähDáÕÂè$áÜÂè¼áÞÂä˜ÀâÃä¨páÃä¸DáÃäÈ$á9Ãèá@Ãäì¼áKÃâü@áü@á_Ãèá»ÃäìáÚÃèÐáÞÃä<ÐáàÃäL¨áçÃè”áíÃäláýÃèðá%Ä䌄á,Äèlá8Ä䬀á?Äèá†Äè¨á’ÄäÜD éì0 á˜Ääü á›Ää èáºÄèÌé,4!áÀÄèì áÂÄäL„!áÉÄèl!áèÄäl("áíÄä|"áðÄèø!áûÄ䜬"áÅèT"áÅèø"á ÅèÈ#áÅäÜ|$áÅäìX$á"Åè4$á(Åä %áFÅèÈ$áKÅä,¬&áRÅèˆ&áUÅèð&áoÅè¬'átÅè„(áwÅä|)á~ÅäŒä(á…ÅèÄ(áˆÅ䬈)áŠÅèH)á—ÅäÌ„*ášÅäÜH*á¦Åäì*áÅÅèÐ)áÏÅä h+áÚÅé+áÜÅä,Ô+áãÅè¼+áçÅè,áóÅä\ô,áõÅèØ,áÆä|Œ-á ÆäŒ\-á+Æäœ<-á.Æè-á4Æä¼.á?Æèü-áYÆäÜœ.álÆè„.áwÆè„/á‚Æä <0áŽÆä(0á•ÆèÈ/á Æä<œ0áÊÆäL„0áÑÆèl0áØÆèÜ0áãÆä|è1áéÆäŒ¤1áÇèt1áÇ䬬2áÇè2áÇè3á%Çèx3á+Çäì4á7Çè4á<Çä ä4áJÇä˜4é,|4áLÇèT4ákÇäLH5árÇä\05á}Çäl5á‚Çèü4á‰Ç䌜5áÇèˆ5í¼5á¤Ç伈6á©Çè,6á´ÇäÜT7áÓÇäìà6áéÇèÌ6áëÇä  8áöÇäì7á Èè„7áÈèd8áÈäLü8á!Èè”8á(ÈälÌ9á-Èä|”9á1ÈäŒh9á8ÈèH9á?È䬼:áEÈä¼:áPÈäÌ:áoÈèü9áŽÈäìø:á•ÈèÔ:á¤Èä ¸;áªÈä ˜;á¶Èä, t;á¼ÈèL;áÂÈäL ¤<áÈÈä\ \<áÔÈäl <<áÝÈä| <áèÈèü;áëÈäœ ,=áúÈä¬ =áüÈèÈ<áÉäÌ ˆ=áÉèd=áÉäì 0>áÉèô=áÉä  ?áÉä ˆ>áÉèT>á!Éä< ´?á/Éè?áIÉèà?áTÉè<@á£Éä| ä@á¨ÉäŒ È@á³Éäœ ¬@á¾ÉèŒ@áÁÉä¼ AáÌÉäÌ pAáßÉäÜ PAá;Êè0AáRÊäü TBáqÊä Ïä|ZáDÏèDZáPÏä<¸ZáoÏèZáuÏä\€[él@[áwÏè [áÏäŒT\á–ÏèÌ[á¢Ï䬤\íŒ\á®ÏäÌ]á±Ïèð\á³Ïäì¸]á¿Ïè„]áÂÏä °^áÍÏä”^áÏÏä,p^áÝÏä<^áéÏèÜ]áÐä\´_áÐäl8_é|ü^áÐèÜ^á3Ð䜌`î`á5Ðä¼ aáFÐèÈ`áQÐè,aáTÐèœaásÐèbé ´báuÐèXbá€ÐèÜbá†Ðè@cáŒÐäL°cáŽÐèˆcážÐèàcá¤Ðä||dá°Ðèddá¼Ðäœ`eá¾Ðè(eáÃÐ伸eáÚÐèœeáæÐäÜ`féì fáîÐè fáôÐä gá÷ÐäØfáÑä,ÀfádÑè¨fáƒÑäL|gáŠÑä\dgáŽÑälPgáÑè4gáœÑäŒ4hážÑäœhá©Ñèôgá°Ñä¼Õät8yá@Õä„áyáDÕèÀxáOÕ䤈yácÕèPyágÕèÜyánÕäÔôzápÕääÈzávÕäôœzá{Õè˜ãïèxéïè<ôïä 4>°÷ïä D>ðä T>4 ðä d> ðät>áðä „>äðä ”>¸4ðä ¤>˜:ðèd@ðâ„+á È>€ YðèT `ðä ì>à gðâô"ä¸ wðä ?¤ }ðèˆ ðä,?„ ìl “ðä L?à ¦ðä \?¼ ¬ðèœ ²ðè ¿ðè Ôðè´ ×ðä ¬?ô öðä È?pñâ0[á0;á \ Ø?4:ñèlñä ø?Dpñä @,sñèØuñèìxñä 8@4¨ñè¯ñä X@˜¶ñä h@|½ñèdÈñä ˆ@ìÒñä ˜@Äññè¬÷ñä ¸@€òä È@X:òä Ø@@<òèCòèØPòä At\òä A8nòèpòä 8Aè€òä HA¸œò蔣òä hAØ©òä xAÀµòä ˆAÁòè4Ïòä ¨AÌîòä ¸A óä ÈA„óè,óèðóä øA´óä B”%óä Bx'óèT*óä 8BhIóä HBLOóä XBVóèÌaóä xB¬dó蘃óèð†óä ¨Bh‘óèLœóä ÈB¬¢óè”èèBÈì ®óä C”±óèl³óèðºóè`Åóè¬Éóè0ÌóèDÖóä xC0õóä ˆCàôä ˜CÄôèœôèxEôè”PôäØCáRôä èCèTôèÔ_ôèÜjôèXqôä (D˜¸ôä 8D|Íôä HD,Üôä XDáôèüäôèÐôôèð÷ôä ˜D õä ¨DX õè8 õèÌ )õä ØD¤!Hõä èDŒ!Kõè@!Wõä E"põä Eð!rõèÈ!yõä 8E#”õä HEÌ"™õä XE¤"¹õä hEŒ"Ðõä xE`"ÛõèD"çõä ˜Eˆ#ëõè\#óõä ¸Eè#öè¤#öè$ öè”$öäøE %è Fp%öè%'öä (F0&)öä 8F&4öèà%GöäXFá'IöèÔ&Zöä xFè'`öä ˆFl'zöè'šöè4(µöä ¸F¤(Àöä ÈF(Ãöèh(Íöä èFl)Óöä øFL)âöè$)èöè˜)îöä (Gü)õöèÜ)÷è4*÷èl*÷ä hGÌ**÷ä xG´*6÷èœ*<÷ä ˜G+C÷èü*M÷ä ¸G`,[÷ä ÈGø+c÷èÐ+j÷ä èGˆ,o÷èx,Ž÷ä H-•÷ä HÜ,œ÷è¼,£÷ä 8H-®÷èH-µ÷ä XH .¼÷é.Ã÷äxHá/È÷ä ˆHð.Ï÷èÔ.Ö÷ä ¨HŒ/ç÷ä ¸HD/ü÷è$/øä ØHø/"øä èHÄ/=øè¨/Døä I˜0Jøè40Nøä (Ix1Uøä8ID1è HI,1Yøä XIð0[øä hIÔ0tøèÀ0øè´1øè2ˆøä ¨Ià2øè„2øä ÈIT3–øè3¢øä èIœ3­øèp3¶øè 4Åøä $JŒ4Ëøâ0[â\ 0;4JP4öøè84ûøäTJô4ìÀ4ùä tJ6 ùä „JÜ5 ùä ”J¸5ùä ¤J”5)ùèD55ùä ÄJ€6Aùè<6ìì6Wùè€7^ùä KH8}ùä K$8‚ùä $Kð7œùèÌ7ªùä DKü8­ùèÜ8¹ùä dK`9Àùè@9Çùä „K€:Ìùèà9Îùä ¤K;Ùùä ´Kè:Üùè°:ãùä ÔKÀ;ìùä äK„;îùè\;ðùäLH<ì4<úä $L\=úä 4L4=#úè=)úè¼=+úä dL\>Júä tL4>Vúè>]úèô>dúä ¤LÌ?oúä ´L°?{úä ÄLˆ?ƒúèp?Žúè@•úä ôL@@œúè @»úè€@¿úèAËúèAè DMøAÒúä TMÈAÝúè¤Aâúä tMtBðúä „MXBóúä ”M4BûèB"ûèàB'ûè\C2ûä ÔMÜC5ûä äMÈC8ûèœC?ûä NpDFûä NTDYûè8Deûä 4N´Dlûè¤D´ûä TNèE»ûä dN¼EÆûä tNœEÍûä „N„EÔûä ”NTEÛûä ¤N$EáûèEçûä ÄN\Fíûä ÔN@FôûèFøûä ôNdGüä OGüä OèF=üä $O´FCüèlFIüä DOHPüä TO´GSüè¤G^üä tO€HeüèPHhüä ”OÐHoüä ¤OÀH{üè H‚üä ÄO˜I„üä ÔOˆIüèlI–üä ôOÜI˜üè¼IŸüä PHJ¾üèJÄüä 4PÜJÐüè¼JÛüä TP\Kþüä dP@Kýè,Kýä „P¼Kýè”K#ýä ¤P„L)ýä ´PhL2ýä ÄPLLEýä ÔP(LXýè L[ýä ôPdMaýèDMcýä QìMeýèÐMyýä 4QpN{ýä DQHN‡ýè$NŽýä dQÜN”ýä tQÀN›ýè¤N ýä ”QO§ýèDO³ýä ´QhP¶ýä ÈQàO¼ýâà%å°OËýä èQÔQÐýä øQ°QÒýä RxQÞýä RLQåýè0Qõýä 8R@RþèRþè`R$þä hR\S+þä xRS-þèäR;þä ˜R T=þä ¨RÜSGþè|SOþä ÈRLTbþè,Tiþä èRìTˆþä øRÌT“þètT–þèœU˜þèüU¤þä 8S¨V°þä HSXV¼þè,VÈþä lSôVðþâü@åÈVùþèWûþä œS¼WýþèhW ÿèÜWÿäÌSpXè àS\XÿâÅ äHX2ÿâ,ŽTYYÿäTáYgÿä $TÔXiÿè¸Xˆÿä DT°Y§ÿèlY¿ÿä dT„ZÒÿä tTlZÞÿä „TPZíÿä ”T8Zðÿä ¤TZòÿä´TáZâèÜYè¼Zä äT€[.ä ôT8[9ä U[>èøZAä $U\`ä 4UÈ[gèœ[nèL\uèL]ˆèL^“è¨^—è,_™ä ¤UŒ_§è`_¬ä ÄU a²ä ÔUä`µèä_¸ä ôUøa»ä VàaÇè¤aÚèXbàä 4Vcëä DVèböä TVÐbä dV¸bèxbèhc ä ”V°d'ä ¤Vxd)ä ´V\d.ä ÄVDdAèècDä äV eYèôdlè°enéfqä $Wlf|è4f‡è¤f‰ä TWTgä dW4gèg’ä „W¼g™è˜g¬ä ¤W\hËè hÍä ÄWÀhÓä ÔW¬hÚèphÜèèhßä X¼iãä Xœiïä $X€iñèhióä DX¨júäTX|jáä dXdjä tX,jèj ä ”XPkè k+ä ´Xk.èpkMè4lRâL%á èX¼lbä øX˜ldèxlwä Y˜m‚ä(Ylmè 8YTm„ä LY èØ›F èôœe ä ld„— ä|dPì¢ ä œd ž© ä¬dáž´ èÈà è@žæ ä ÜdÀžë 蔞ö äüdŸìôžø ètŸ â40e@ # ä@eá . 褟9 ä `eˆ ; èX B ä €eô D èà K ä  e`¡] ä °eH¡d è4¡è ÐeÜ¡o èÄ¡† è4¢ì£Œ ä f(¤” ä fø£› èÀ£  ä @f¬¤¤ ä Pfx¤° ä `fX¤¶ è@¤½ ä €f¥Ç èФÎ ä  f¦Ó ä°fÈ¥è Àf„¥ß è@¥æ 踦í èô¦ò èä§/ ä g©B ä 0g˜¨U âІ  ¬ÌÛ tÉ @gd¨Š èH¨‘ èH©• ä pgü©œ 訩¥ ä g0«µ ä ¤g«º âü@á´gá«Ï ä Äg ªæ ä ÔgŒªñ èdªó ä ôgЫù ä h «ü ä h€« èl« ä 4hp¬ ä DhT¬ è<¬ âÈkᘠðÃphÄ­q ä€hœ­è hP­} ä  hü¬ˆ èЬŽ ä Àh@®” ä Ðh ®§ ä àhü­ª èä­é i¯± ä iÄ®¾ ä i¨®Ä è|®Ï èD¯Û è°æ ä `i°wä pit°‚èH°†ä i´±‰ä i4±í±•ä Ài<²´è ²¿ä ài¬²Æè²Îå j ³ÙèزÛè(³àä 0j´ää @j䳿èijéè´ôä pjè´ûä €j¨´è8´ä  jHµ ä °j0µèµèxµè¶)ä ðj ¶-å k„¶/è`¶:èض?èH·Eä @kÜ·SäPk´·è `k ·^舷eèð·kä kd¸œä  kH¸¨è$¸«ä Àk츱èȸ¾è¹ÝèT¹éå l4ºðä lì¹üä lعþè´¹èºè» ä `lä»èl».è(¼0ä lp½Oä  lX½jä °l8½uè ½”è¼½šä àlœ¾ èx¾¸å mð¾ºèȾÂâ`0夿âä 4mÀíäDmáÀøä Tmà¿èÄ¿ ä tmlÀèLÀä ”mèÀ1ä ¤mÐÀ=ä ´m¬ÀHèŒÀì`ÁMè ÂSâÈÖ øm`Ãeä n Ãä n Â†ètÂè¤Ã©èÐõèHĹä hnÅÇäxnáÅÉèÀÄÖä ˜nèÅÝä ¨n¬Åßä ¸n”Åää ÈnhÅèè0Åîä ènÀÆýä øn ÆèdÆä o Ç èøÆ?ä 8o¼ÇDä Ho ÇVè€Çè hohÈ]ä xoHÈ_ä ˆo0ÈbèðÇdä ¨oøÈkèÜÈnä ÈoäÉuè€Éè èo˜Ê|ä øo€Êä p`ʆä p4Ê™èÊ è0˦ä HpÄ˱ä Xp¨Ë½èˆËÍä xpˆÌÏäˆp`Ìì@ÌÖä ¨pÎÝä ¸pØÍßä Èp¬ÍãèÍéä èp`Îîè$Îðä qÏ èüÎè¤Ïè(Ð&ä Hq°Ð+èˆÐIèÑcèÒjèpÒuè°Òè ¨qtÓä ¸q\Ó‰ä Èq4ÓŽä Øq Ó”èøÒšä øqôÓ¥èÄÓ°ä r Ô´è Ô·ä 8rtÔÂèPÔÅäXrÐÕè hrœÕÝä xrpÕáè\Õãä ˜rlÖåèÖçä ¸r<×øä Èr(×úä Ür°Öýâ¤/åÖè˜×#ä sÀØBä sXØOä ,s8Øbä èÈÿDä }°Yèd`èèfä L}Xuä\}@ì$ä |}ˆä Œ}üŠä œ}èŒä ¬}ÐŸä ¼}°¡è¥ä Ü}X»è4¾è´Ôä ~dÛè(Þä ,~àäè¸ïä L~è ä \~Ðä l~¸"ä |~ )ä Œ~„,èl1è$3ä ¼~l5è<aä Ü~˜€ä ì~xÅä ü~XÑä 8Üèãä,`è < éèôìä \<òä l(öä |ýèìäœØìl#è 1ä ̰ Bè” Dä ìø Uä üà `èÌ rè è ,€Ô |è¸ ~ä L€t ‰ä \€X ä l€@ ”ä |€ –èð œä œ€L ¢è ¤è„ »èx Áèð ÄèˆÏäü€áÖä ÜÜä °çâü@á 0|4è,\ä P_ä `´jèˆoä €Xvè0xä  ôzè ä À¤·èˆÃä à¨Êä ðˆÖèpÙä ‚æèëâ`0å¨' èÌ3 äT‚ìðìh8 ä„‚üè ”‚à? èÀO ä ´‚´Z è”y è8èä‚(è ô‚  ä ƒì” è¼– ä $ƒ¡ èh¨ ä Dƒª èÀ¬ ä dƒÔ± ä tƒ°´ ä „ƒx· ä ”ƒX¾ è@Õ è× è\Ý ä ÔƒTà ä äƒ8ã è$ê âü@á „ˆþ èp%!èˆ'!èô)!ä H„ˆ0!è`2!ä h„ð8!èÐW!ä ˆ„¬\!ä ˜„€¿!è`Ë!ä ¸„$Ô!èE"ä Ø„ÌX"ä è„h]"èD`"ä …¼ l"ä …˜ p"ä (…t ~"ä 8…H ‰"è ®"ä X…(!±"èì Æ"è\!Ì"è"å"ä ˜…ü"è"ä °…Ð"#â0夭ä´"F#ä Ð…p#R#èD#h#ä ð…ì#j#èˆ#u#è$‡#ä †@%#ä <†%¡#âl‚@)èL>G)ä œŒ?J)èÈ>a)ä ¼Œœ?d)èˆ?r)ä ÜŒT@})è8@‰)ä üŒÐ@Ÿ)èx@¢)äLAì0A¬)èˆA¾)ä LBÉ)ä \üAË)èäAá)è¨Bå)èôBþ)è`C*ä ¬tDc*ä ¼\Dv*ä ÌDD*ä Ü0DŒ*èD‘*èÀD“*ä Ž\Ež*ä ŽE *èüD¿*ä <Ž0FÊ*ä LŽFÏ*èìE +ä lŽ,G+ä |ŽÔF5+ä ŒŽ¬FD+èŒFJ+ä ¬Ž|GP+èdGS+ä ÌŽ$HY+ä ÜŽH[+ä ìŽôG_+èÐG~+ä ÐH…+ä ÀH‡+ä ,¨HŽ+èPH“+ä L@I™+ä \0I¥+ä lI¬+èüH¯+è¨Iè œÌJ¿+ä ¬ JË+èˆJÒ+ä ÌLÔ+ä ÜèKØ+ä ì¤KÝ+ä ü|Kß+ä \Kâ+ä @Kî+è Kñ+ä <ÈLù+ä L¤L,ä \ˆL ,èxL,èM",èTM&,ä œÐM-,èœM4,ä ¼ˆN:,ä Ì N?,èôMF,ä ìäNR,ä üÔNe,è¬Nl,ä ‘´Os,ä ,‘¤OŠ,ä <‘„O‘,è\O”,ä \‘$Q›,äl‘¸Pè |‘€P ,ä Œ‘pP¢,èXP©,ä ¬‘€Q«,è\Q¯,ètRµ,ä Ü‘˜S·,ä ì‘,SÂ,è SÄ,ä ’$TÏ,ä ’TÓ,èìSä,ä <’”Të,èpTó,ä \’üTù,èÔT-ä |’(V-䌒ÐUì´U-ä ¬’ØV-ä ¼’¼V-èV -è W.-ä ì’àWI-ä ü’¨WT-èxWs-èpXy-è¸X}-èlY-ä L“ðY-ä \“ÔY-è”Y-èxZ–-è¸Z™-ä œ“¨[¥-è$[±-èè[¼-ä Ì“¼\Ç-ä Ü“h\Ò-èL\Ô-è$]%.ä ”œ],.ä ”„]C.è`]T.ä <”4_V.ä L”_Y.ä \”à^[.è¼^a.ä |”`g.ä Œ”Ð_s.ä œ”x_~.èT_Š.ä ¼”¬`Œ.èT`.èì`›.ä ì”PaŸ.ä ü”8a°.è a².ä •ôa¸.èàaº.èÐbÆ.è$cÌ.ä \•„cÎ.èlcÔ.â¼É ÜÊ ä,dè.ä ”•Èdó.è°dþ.â`0á ¸•„e/ä È•Pe/è,e$/è´e+/ä ø•Hf-/è$f//ä –g8/è¼f4 Xxpk 䨂Ü4ä Ìœ¼ƒá4ä Üœ¤ƒø4舃ý4ä üœ°„ 5ä `„5èD„5ä ,…5èà„25蜅è \\†J5é†}5ä |„‡€5ä Œh‡…5ä œ8‡ˆ5è܆Ž5ä ¼Hˆ•5ä Ì$ˆž5è쇯5ä ìüˆ²5ä ü䈵5ä ž̈¸5ä žœˆ¼5ä ,ž„ˆ¿5è`ˆÃ5ä Lžp‰É5ä \žP‰Ô5è4‰ß5è Šâ5èTŠí5ä œžЊô5脊6ä ¼žL‹(6è‹<6èÄ‹[6ä 잌h6ä üž|ŒU7ä ŸDŒ_7ä Ÿ0Œb7âÐZ0ŸŒo7èä‹u7ä `ŸìŒ{7âœ>4 Xxpk äÈŒª7èpÉ7ä Ÿ4Žò7è¼õ7脎ü7ä ÀŸ`8ä ПøŽ 8èàŽ8ä ðŸ`8å  @8ä   8ä  !8èœ%8ä @ œ'8è„J8ä ` ‘M8ä p àl8èÀn8ä  $’x8è´‘Š8ä ° “8è ’8耓’8ä à €”š8èà“¥8踔¬8èè”±8è0•³8ä @¡d–µ8â-áL%á„+áà-á P¡H–9ä `¡(–9è–9ä €¡È–9訖9ä ¡ ˜è °¡—99ä À¡`—›9ä СH—À9ä à¡0—Ë9èø–×9å ¢œ˜í9ä ¢x˜ó9èT˜÷9ä 0¢°šü9ä@¢<šá:ä P¢$š :ä `¢š:ä p¢à™:ä €¢À™:訙#:âÄ+,é Ĭ¢D›::ä ¼¢0›A:è›D:ä Ü¢œœc:ä ì¢ œf:ä ü¢Ø›q:ä £¼›€:蜛‚:èÌœˆ:èè L£\:èD–:ä l£4ž:ä |£ž¡:設:èXž´:ä ¬£ŸÀ:ä ¼£ôžÅ:èÈžÇ:ä Ü£$ ß:ä ì£ðŸë:ä ü£ÀŸö:èŸü:ä ¤À ;èL  ;è¡;ä L¤h¡;ä \¤L¡';è,¡);ä |¤0¢4;é¢?;ä œ¤À¢F;èL¢^;伤˜£è ̤P£;ä ܤ$£—;裣;ä ü¤\¤¥;ä ¥8¤§;è ¤¿;訤Î;ä <¥p¥é;è¥õ;ä \¥D¦ú;ä l¥¦<ä |¥ð¥~<ä Œ¥È¥…<褥‹<ä ¬¥x¦“<è`¦Ÿ<è ¦¤<ä Ü¥d§Ã<ä ì¥@§Ê<èô¦Ð<èD¨Ò<èü¨Ý<ä ,¦¸©è<è ©ê<ä L¦tªì<ä \¦Pªî<ä l¦0ªú<èÜ©þ<ä Œ¦@«=ä œ¦«=茪=ä ¼¦$¬=èÜ«$=ä ܦ­+=ä 즴¬7=ä ü¦œ¬;=èp¬==èD­\=ä ,§ì­q=蜭s=èl®„=ä \§`¯Š=è8¯Ž=ä |§´°­=ä Œ§˜°±=ä œ§°¼=ä ¬§ø¯¾=ä ¼§ܯÅ=訯Ð=ä ܧ±×=ä ì§ô°è=èÔ°ì=ä ¨x±î=ä ¨X±ó=è4±õ=ä <¨x²û=ä L¨T²>ä \¨² >èô± >ä |¨³>èܲ/>舳;>èسA>ä ¼¨„´J>ä ̨\´’>ä ܨ,´©>è´µ>ä ü¨4µº>ä ©µÁ>ä ©ü´È>èÜ´Ë>ä <©ôµÒ>褵×>ä \©˜¶å>ä l©t¶è>ä |©d¶?è,¶?ä œ©ð¶?è´¶!?ä ¼©œ·,?èh·1?ä Ü©|¸7?ä ì©4¸9?ä ü©¸=?ä ª ¸D?èè·I?ä ,ª@¹h?ä <ª¹v?èô¸z?茹?ä lª,º†?è่?è\º•?䜪Ỡ?ä ¬ª̺¢?è´º´?è”»»?ä ܪ0¼Â?ä 쪼Ä?ä üªð»à?ä «Ø»ñ?踻ó?ä ,«ä¼þ?ä<«ļá@ä L«¬¼/@è¼;@ä l«x½A@è4½è Œ«0¾M@辑@ä ¬«”¾ª@èl¾ò@ä ̫ܿø@ä Ü«¤¿ Aä 쫈¿Aä ¬p¿AâÄ+,é Ĭ,¿2Aè¿HAä 8¬€ÀMAä H¬TÀ{Aè@À‚Aäh¬€Áè x¬XÁ„Aä ˆ¬<ÁŠA䘬áÁAä ¨¬ÜÀ˜Aè¸ÀšAâxÃ̬½AèÌÁ¿AèhÂÊAè€ÂÑAä ­ðÂ×AèÔÂßAä ,­tÃæAèPÃíAä P­„ÄóAâü@á `­ÄBä p­ôà BèÐÃBè˜Ä.Bä  ­ÅMBèÌÄQBä À­¼ÅWBä ЭpÅkBä à­TÅrBè8Å~BèôÅŠBè8ÆBèÔÆ¬Bä 0®€Ç¾Bä @®PÇÃBè<ÇÚBä `®¸ÇàBè¤ÇâBè¤ÈäBèÈÈèBä  ®tÉîBä °®TÉôBè ÉÿBä Ю(ËCä à®øÊ)Cä ð®ÔÊ+CèÀÊ6CèxËè ¯(Ì8Cä0¯ÌìàËÐæXxpk ä¸í³Hä |·ïÑHä Œ·ÌîØHè îãHä ¬·0ðñHä ¼·ðýHä Ü·ÈïIâœ>4 Xxpk ä ïEIèxðKIä ¸”ñPIâ0z ¸pñgIè,ñ–Iä @¸üñµIä P¸Ðñ»Iè¸ñØIä p¸pòãIèLòéIèðòôIä  ¸hóJèHóJä À¸ô Jä иÀó7JèœóJJä ð¸|õUJå ¹õ†JèôôŒJèØõ’Jä 0¹ö™Jä @¹pöÉJèXöËJèÐöÑJâœ>4 Xxpk ä,÷ýJä ¹ô÷Kä  ¹Ø÷4Kä À¹À÷GKâœ>ÐæXxpk ä¬÷nKä ๜ø€Kä ð¹€øƒKå º8ø‹Kèø’Kä ºÀù™Kè ùžKä @ºdú½Kè<úÁKè`ûÅKäpºáüÇKä €ºÌûÊKä º´ûàKè˜ûåKä °º°üLèlüLè ýLä àºÌý#Lä ðºœý1Lè|ý'Wä $ËÀ=.Wä 4ˬ=MWè”=OWä TËÀ>QWä dˈ>UWä tËl>gWè<>lWä ”Ë€?qWä ¤Ëd?µWä ´Ë8?ÐWä ÄË?ÕWèÜ>ØWä äËX@ÚWèD@áWä ÌÜ@æWâ0[á|%ÌÈ@Xè´@Xä <ÌAXä LÌ|A!XèdA&XèB(Xä |ÌÌB-Xè¨B4Xä œÌpC9Xä ¬ÌDCDXè,CIXä ÌÌ DWXèÀCgXä ü̘DmXâXx h¨ªÔ4ä\D—XèäD¢Xä ,Í„E·XèEËXä LÍFÒXä \ÍðEÔXèÐE×Xè@FÚXâü@á͘FìlF)Yä°Í4Gè ÀÍG5YèÌF:Yä àÍðGYYè˜G\Yå ΘH{Yè|HYä ÎxI¡Yä 0ÎTI­Yä @ÎI´Yä PÎèH·YèÔHÊYäpÎ8JíJÓYä ÎPKàYä  ÎKZä°ÎáKìàJZäÐÎ(Lè àÎÈKZä ðΠK&Zè|K:ZèˆL@Zä (Ï MBZâ¬ïáܯ 8ÏM§ZäHÏáMªZèèL¶Zä hÏàMºZèÀM[èN [ä ¨Ï˜N [â,é lwŒ=œ– ¸Ï\N [è4N£[ä ØÏøN©[èÔN¬[èXO®[ä ÐüO´[èØO¸[è”P¾[ä8Ð0QìÌPË[ä \мQÖ[âÐZäœQò[èìQù[èR\èTR \ä ¬ÐS\ä ¼ÐÈR \è¨R?\ä ÜÐdTE\ä ìÐìS]\èÄSh\è¼Tè Ñ€Um\ä,ÑlUè <ÑHUy\è0U˜\ä \ѰV\ä lјV¢\è_ä °ÔÀcN_è¤cm_ä ÐÔte~_ä àÔ(e•_èeš_åÕfè ÕÀeœ_è”e¢_ä 0Õ˜f¤_è`f°_ègÏ_èpgâ_ä pÕhæ_ä €ÕÌgô_è¨g`ä  Õxh'`ä °ÕLhF`è$hL`ä ÐÕðhR`èÄhl`ä ðÕˆir`è i}`ä Öcä ”ÙÐvIcè¨vUcä ´ÙDx†cä ÄÙˆw‰cä ÔÙlwÌcèHwÎcèlxícè°xócèyøcè8yjdä 4Úzudä DÚðydä TÚ¨yŒdèŒyŽdä tÚ\{‘dä „ÚÄz”dä ”Ú¬z—dä ¤Ú”zœdè4z¨dä ÄÚÀ{ªdè˜{¶dä äÚ`|¼dä ôÚ|Òdèè{Ödä ÛÌ|ôdè | eä 4Û }eèì|)eä TÛœ}0eä dÛ@}kä äD¢EkâÐZä¢Xkä 4䨣^kä D䬣`kä T䔣dkä dä|£ikè<£tkè¤vkè4¤kä ¤ä¤¤Œk茤Žkä Ääü¤škèؤªkèT¥°kä ôäÀ¥¶kä 唥ºkèx¥è $å¦Åkä 4å¦Çkèà¥Îkä T夦×kä d儦Ûkè8¦ßkèø¦Glè,§Jlè`§^lä ´å@¨}lè¨lè´¨’lä äåÈ©žlä ô婪lèD©°lä æ(«¸lä $æøª¼lä 4æЪ¿lä D欪Þl航älä dæä«ïlè|«ámè¬mä ”æ´¬$m褬/mé­9mèЭamèð­umä 俀®zmèD®Šmä ç ¯•mä çô®˜mä $çЮžm踮¤m蘯©mä Tç`°½mä dç0°¿mä tç°ÂmèܯÄmä ”ç€±Émä ¤ç\±Õmä ´çD±Ümè±ìmä Ô猲 nääçá²nä ôçб4n謱8nä èð²Wnè°²bnèH³hnä Dè|³jnèh³}nâ`Ìää³nèh´—n耴œnèµ¢nä ¨èص¨nä ¸è°µ³nèµ¹nä ØèÀ·¾nè(·Ànä øè,¸Ëné¸Ðnä éè¹Ünä(éйè 8é¹ànä Héü¸ânèظènä h騺ñnä x鄺ýnè8ºoèĺoèðº oä ¸éØ»oèÀ»Coä Øé”¼Roä èét¼foèH¼…oäê$½è êм‹o謼ªoèh½°o耽²oèȽ´oè ¾øo舾pä ˆêà¾pè̾#pä¨êáÀ%pä ¸êÀ¿,pä Èê ¿7pä Øêt¿:pèX¿Npä øêhÀapèÀdpè¼Àgpä (ëÌÁ†pä 8ë°Á‘pä Hë”Á˜pè<Ápä hëH pä xë,¢pèäÁÁpèÈÂÌpè<ÃÒpä ¸ë°Ã×pèdÃâpä Øë ÄäpèðÃïpè\Äñpä ì´ÄqèœÄ#qä (ìdÅ*qèHÅ/qä HìôÅ6qèàÅè hìÐÆwèçè ØôèOwèÜçZwä øôé`wä õécwè”èjwä (õÔéowä 8õ´évwä Hõ˜éwè€é wä hõ ê¢wä xõ€êºwä ˆõLêÆwè0êÍwä ¨õLëìwä ¼õë÷wâà%åàêxä Üõ°ë%xèlë9xè$ì@xä öpìGxè@ìSxä ,öÄìrxè ì}xä LöÐí‚xèxíŽxèî­xä |ö€îyèdî'yä œö@ï)yä¬öáï5yèäîCyèXïSyèôïryè4ðuyä üöÜðwyè¸ðƒyèñ‹yä ,÷òyèxñ•yè@ò—yèxòžyä l÷ˆóºyä |÷hóÁyè0óè œ÷ôÌyèÈóÐyè$ôÜyèDôßyäÜ÷Dõè ì÷õzä ü÷ìôzä øÔôzè´ôìŒõ&zä <øö2zä LøÌõBzè¬õJzä løŒöizèhölzèìörzä œøL÷¥zè$÷°zä¼øÄøè Ìø¤ø³zè8ø¾zä ìøXùÂzä üø8ùÍzèù×zä ùúÝzèìùëzä <ù`úözè ú{ä \ù¤û {ä lù$û{ä |ùû{èÔú3{ä œù0ü8{ä ¬ùü<{èðûC{è¸üH{ä Üù þ{ä ìù´ý”{ä üùœý–{ä úˆý™{ä úlý›{ä ,úPý§{è$ý²{ä Lúxþ¸{ä \úXþ¿{è<þË{ä |úèþÖ{è þá{ä œú`ÿì{è ÿð{ä ¼úàÿû{ä ÌúÄÿ|è ÿ |ä ìúÔ|ä üúx|ä ûX!|ä û(1|è >|èôI|ä Lû„T|ä \û<_|è$b|ä |ûà|ä Œû¼ˆ|è ‹|â ô"°ûLè Àû0 |è ¬|è³|ä øû8º|âl‚Ð8 üüë|ä üìö|è¼ý|ä8üŒá}è| }ä Xüì}èØ}èü$}ä ˆüX/}è<6}è´A}ä ¸üC}äÈüÔìO}ä èü8V}èX}ä ý¸\}èœ^}ä (ýH`}ä 8ý~}èø}ä Xý, Ÿ}ä hýð¡}èÈÀ}ä ˆý˜ Æ}ä ˜ýl È}èH Î}èH ä}ä Èý0 ð}ä Øý ~è´ ~è˜ &~ä þ ,~èè 3~èÔ 5~ä 8þ$ J~èð i~ä Xþð y~ä hþÀ €~è˜ †~è‹~ä˜þè ¨þØ’~ä ¸þœ~ä Èþx¡~è`¤~ä èþˆ¦~èh²~ä ÿ¹~ä ÿàÅ~è¸ä~ä 8ÿlê~èTï~âÄ+Ä8 dÿ`ètÿ4íè¨ èä ´ÿ¤ä ÄÿŒ#ä Ôÿl%èHDèPcä Änè¬sè@xè\{âTùHä¢èÌ­â¤/á läÅä|°è ŒtÇä œXÒèDÕâ`Ìä(ââÄ+Ääðè è öè„€ä t€è¸€ä( ìè H€èì0€ä p$6€â„+á´)á €üA€ä Ô]€ä  ˜h€èxn€ä À°q€èxè à<€ä ð$ €è¬€èˆ³€èäµ€ä 4¤Ì€âŒÕD|ë€ä TPñ€è4ô€ä t$/è6è„=ä ¤8\ä ´ hèoä Ôtä äðyèÜ{ä 8 ˆä ð“ä $xžä 4dÈèLè TD!Ïä dØ Öè¼ Ùä „˜!àä ”€!äèh!ïä ´T"ñäÄá"ýèä!‚ä äœ"!‚è„"0‚ä (#7‚âÜä¼"ì|#m‚èà#x‚ä \´$ƒ‚âà-á,)á-áL%á lœ$Û‚è€$ë‚ä ŒH&ï‚ä œ$&ñ‚èˆ%ìd&ü‚ä ÌL'ƒä Ü' ƒä ìÌ&ƒä ü¤&%ƒèŒ&3ƒä È'Mƒä , 'Yƒèp'dƒä Lˆ(jƒä \t(vƒä lT(}ƒä |(‹ƒèô'ì )‘ƒä ¬*“ƒä¼á*ªƒä Ìà)»ƒè¼)Úƒä ì *áƒèl*äƒè\+æƒä À+ñƒè˜+üƒè,„ä L¬,„ä \ˆ,„ä lp,k„èP,r„èè,x„ä œø-„ä ¬Ô-‹„ä ¼l-Ž„èL-’„ä Üœ.±„èH.Á„ä üX/Å„ä 4/È„èÌ.Ê„ä ,Ð0Í„ä <\0ß„è40ì„è1ó„älá2þ„ä|Ô1è Œ¤1 …è|1…ä ¬t2…èX2'…èô2F…ä Ü´3M…ä ìp3Y…è<3è p5r…ä 5~…ä ,ì4‰…ä <¼4—…ä L”4™…ä \l4 …ä lL4³…ä |,4¿…ä Œ4Á…èø3à…ä ¬Ä5ÿ…è˜5†ä Ìp6†ä ÜX6 †è(65†è47?†ä Ô7^†ä  °7`†ä , x7†èT7†ä L t8®†ä \ X8³†ä l @8¶†èì7è Œ 9†ä œ Ô8Ćè¼8φèT9цä Ì Ø9ë†è¼9ñ†ä ì H;ö†ä ü ;ù†èÔ:þ†ä  $< ‡èø;‡ä < ˜<1‡è\<3‡èè<:‡ä l =Y‡èt=d‡ä Œ >i‡ä œ Ø=k‡èÄ=…‡ä ¼ |>‡èP>œ‡ä Ü H?µ‡ä ì ü>·‡è¬>¹‡èh?è  Ä@‡ä , \@͇ä < @@Ô‡èô?߇ä \ lAä‡ä l HAæ‡ä |  AIˆä Œ ATˆèð@[ˆä ¬ ìAzˆä ¼ ÜAúˆä Ì ¸A‰è˜A ‰ä ì ÀB‰è\B‰ä xC‰ä \C2‰ât@0 0CJ‰ä@ Cì CW‰ä ` ŒD^‰ä t HD`‰â„+á „ 8D~‰ä” áD…‰èØCŒ‰ä ´ `E«‰ä Ä  E­‰ä Ô üD²‰ä ä ØD¹‰èÀD؉ä  FÚ‰ä  ÀEæ‰è°Eé‰è`Fð‰ä D ´Fõ‰èˆFü‰ä d \GŠä t HG ŠèGŠä ” tHŠä ¤ TH!Šè H#Šä Ä ìHBŠèÈHNŠè IRŠäô áJgŠä èIiŠè¬IzŠè(J™Šä 4KœŠè¼J³Šä TDKºŠè K½Šè\KÊä „ÌKâŠètKæŠèLéŠä ´ØLðŠèœLüŠä ÔpM‹ä äTM ‹è0M0‹ä ðM3‹è¬M5‹ä $tN;‹è@NB‹ä D,OD‹èOF‹ä dOJ‹èxON‹ä „dPT‹èìO`‹ä ¤”Qh‹ä ´„Qt‹èTQ{‹ä ÔèQ‹è¼Qˆ‹è$R‹ä ÌR–‹ä €R˜‹èlRŸ‹ä 4¸S¤‹ä DDS¯‹ä T4S¶‹èS½‹èìS‹ä „`TÉ‹è4TÕ‹ä¤ÌTè ´°TÜ‹ä Ä Tá‹è„Tè‹è,Uû‹è¤UŒä V ŒèVŒä $œVŒèˆV&Œä D4W2ŒèWIŒä døWKŒè¤WRŒä „ŒX^Œä ”tXpŒä ¤LX|Œè0Xè ÄèY‚ŒèŒYžŒä ä°Z½Œä ô|Z¿ŒèXZÂŒäü[è $¤[áŒè`[öŒä Dt\è\\!ä d ]-èÐ\Uä „¼]eè¤]pä ¤\^|èD^€ä Ĥ^ŒèŒ^šä äø^¦èØ^Åä <_Êè_è $ø_Öä 4à_Øä DÄ_äè˜_Žä dh` Žä tP`Žä „<`!Žè`.Žä ¤a4Žä ´Ð`@Žä ĸ`DŽèˆ`KŽä ä`aQŽè aeŽèdb„Žä Pc‹Žä $,c’Žä 4c™Žä DôbžŽä T´b¥Žè„b«Žä td¶Žä „ðcèÈcŠä ¤`d•ä ´Pd¯è4d¶è¼d½ä äàeÄä ô˜eËèdeÏèfÚä $„fÞèlf.ä D g5èèf<èhCä t`htèHhvä”áiyè€h˜èdi£è¼i¥äÔäjè ähj±ä ôLj´ä 0jÀè jÑèk×ä4°kè D”kÞä Txkåä dTk‘è@k‘èàk‘ä”|lè ¤Tl‘è0l ‘ä ÄÌm?‘ä Ô°mJ‘ä ädm\‘ä ôLmc‘ä 0mu‘èm…‘ä $dn“‘ä 48nª‘ä D$n°‘èn·‘ä dün¾‘ä t¬nÑè„nΑä ”poê‘è\oÿ‘ä ´hp’ä ÄHp ’ä Ô0p’èp*’äô4 Xxpk  !á—hšä °!Ж‡šä À!°–‰šä Ð!Œ–”šèl–Ÿšä ð!L—»šå "8—½šè—Èšä "p˜Êšä 4"˜Õšâä D"ü— ›ä T"¨— ›ä d"„—›èp—›âÌ™ˆ"8™1›èȘR›ä ¨"¬™T›ä ¸"œ™W›èŒ™^›ä Ø"Lše›ä è"<šz›ä ø",š›ä #šˆ›èÌ™Š›ä (#››ä 8#àš—›ä H#ÈšŸ›ä X#¸šª›ä h#¨š±›èŒš¸›ä ˆ#h›»›ä ˜#X››èH›É›ä ¼# œЛâ`0á Ì#œá›äÜ#áœè›ä ì#à›ï›ä ü#¬›ñ›èˆ›ö›ä $¬œø›ä ,$`œœèPœ œä L$œä \$€œä l$p#œä |$T*œè45œä œ$ü<œä ¬$ÐXœè°[œä Ì$LŸbœä Ü$(Ÿmœè´žŒœä ü$°Ÿ”œä %ŒŸ–œèdŸ°œä ,%¤ ·œä <%h ¹œä L%H Àœä \%$ ÅœèìŸí¡Èœä Œ%t¢Ïœä œ%ð¡Óœä ¬%Œ¡Õœä Ì%`¡åœâœ>4 Xxpk ä@¡ ä ì%ì¢ ä ü%Ԣ财ä &\£8è£;ä <& £B舣Tä \&<¤[ä l&¤gä |&Ô£sè¼£xä œ&¼¤„ä ¬&œ¤ä ¼&t¤£èX¤Âä Ü&H¥Èè$¥Ï褥Õèà¥Ùè°¦æä0'á§èâtŠäȦûèT§žä `'ˆ¨žä p'X¨žä €'<¨Ažä '¨Cžä  'ð§bžȩ̀hžèܨožä Ð'l©zžä à'<©žè©‡žå (ªžèè©”žè4ª§žèPªºžä @(«ÅžèЪážä `(Ыåžè„«ëžä €( ¬ûžèä«ýžèä¬Ÿä °(D­Ÿè(­!ŸâÔ4Ô(À­,Ÿè€­sŸä ô(p®Ÿä )L®ÇŸä )®ߟèì­  èè®  èd¯ ä T)H± ä d)ܰ  ä t)¸°% è|°µ ä ”)|²¼ è0²Á è³Ç è(³Ó ä Ô)<´Ú ä ä)´Ý ä ô)ü³è èسô ä *ü´¡ä$*Ì´è 4*¨´¡ä D*Œ´¡ä T*l´*¡èX´Z¡ä t*¼µ]¡ä „*tµi¡ä ”*Hµl¡ä ¤*4µw¡èµ~¡ä Ä*üµ‰¡èܵŒ¡ä ä*¨¶«¡ä ô*Œ¶²¡èh¶µ¡ä +·¼¡ä $+ô¶¾¡èضÝ¡ä D+Ì·ä¡è¨·ç¡ä d+„¸ì¡ä t+4¸¢ä „+¸ ¢èð·è ¤+ü¸¢è¤¸¢è<¹¢èȹ#¢èXº&¢èàº,¢ä ,¬¼7¢ä ,x¼€¢èd¼Œ¢ä 4,˜½—¢ä D,$½›¢ä \,½¢â/áˆhäð¼­¢èÔ½è Œ,d¾¹¢èD¾»¢ä ¬,´¿΢ä ¼,L¿Тä Ì,,¿Ö¢è¿Ú¢ä ì,\Àê¢èпö¢èxÀ£ä -üÀ £ä ,-ÜÀ£èÄÀ!£ä L-€Á(£ä \-hÁ*£èPÁ5£è¤Áè Œ- Ã:£ä œ-øÂQ£ä ¬-ÔÂT£è¼Âs£èxÄ£ä Ü-ÄŠ£èØÃÓ£å .ÄÄÕ£âäˆÄí£èøÄû£è@Ťä @.Æ ¤ä P.´Å¤ä `.”Å+¤èpÅ1¤ä €.ÄÆ<¤ä .¬ÆM¤ä  .ŒÆT¤ä °.lÆs¤èTÆy¤ä Ü.<dž¤âà%á,)á-á ì. Ç̤èàÆÒ¤ä /TÈݤä /8Èè¤ä ,/ Èô¤èäÇû¤ä L/øÈ¥ä \/¼È6¥èÈ8¥ä |/4É>¥è ÉE¥ä œ/ÜÉP¥è¬ÉT¥èhÊ[¥ä Ì/ØÊ`¥èÄÊg¥ä ì/@Ë‚¥ä ü/ˆ¥èË¥¥ä0ðËè ,0¬Ë§¥è€Ë®¥ä L0d̲¥è0̵¥è¨Ì¦ä |0,ͦèÍ¦ä œ0°Í*¦èxÍ8¦ä ¼0 ÎL¦èðÍv¦ä Ü0¤Îx¦ä ì0lÎz¦èTΙ¦èÏ©¦ä 1\Ï­¦è@ϱ¦èœÐ´¦ä L1¼ÑǦä \1ŒÑ̦ä l1dÑϦä |1LÑÒ¦è0Ñݦä œ1Òä¦èäÑì¦ètÒ§è¸Ò §ä Ü1Ó,§ä ì1Ó?§èìÒF§ä 2ŒÓN§ä 2pÓ}§èXÓ…§ä <2øÓ¤§ä L2ØÓ¬§è°Ó˧èhÔÙ§ä |2Õé§ä Œ2¨Ôõ§è„Ô¨è8Õ¨ä ¼2(Ö¨ä Ì2Ö¨ä Ü2ÐÕЍè˜Õ—¨èLÖž¨èŒÖ¤¨ä 3\×§¨ä ,3<×­¨ä <3 ׳¨èÜÖ¹¨ä \3Üרèˆ×Ψä |3ØѨèØè¨èðØï¨ä ¬3Ùú¨è|Ùý¨èäÙ©ä Ü3˜Ú©ä ì3`Ú©èÚ1©ä 4ØÚ4©è°ÚS©èÛ^©ä<4áÜi©ä L4¨Ût©è”Û©ä l4œÜ†©ä |4|܈©è`Ü©è¼Ü”©ä ¬4hÝ—©èHÝ™©ä Ì4ÞŸ©èèÝ«©èlÞ±©ä ü4ß¼©ä 5ßìðÞñ©ä ,5à÷©èðߪè(àªä \5Äàªä l5´à$ªèpàè Œ5há0ªä œ5(á5ªä ¬5á7ªèäà9ªè¼á?ªä Ü5XâAªèâCªä ü5 âIªèxâhªä 6¸ã‡ªä ,6@㊪ä <6ã–ªèô✪èØã¢ªä l6Ü䩪ä |6”äµªä Œ6päçªä œ6\ä«è4ä «ä ¼6Då«ä Ì6å«èøäè ì6ôå«ä ü6Üå!«ä 7Àå(«è å+«ä ,7ç-«ä<7áçè L7¨æ9«ä \7€æ;«èlæè |7Äç@«ä Œ7¤çL«è„çO«ä ¬7èZ«è|è\«ä Ì7 éh«è 醫ä ì7Ô鉫è¬é‘«è,ꜫä 8œêž«è\ꢫèôê¿«ä L8dëЫè4ëð«ä l8 ìû«èøë¬ä Œ8í¬ä œ8ðì ¬ä¬8¼ìè ¼8ì¬èLì ¬è4í'¬ä ì8Èí)¬èxí,¬ä 9<î7¬ä9îìðíO¬ä <9ìîQ¬ä L9Ìî\¬è°îg¬è(ïl¬ä |9<ðn¬ä Œ9ðïu¬ä œ9¸ï€¬èœï‡¬ä ¼9ð‰¬èxð‹¬ä Ü90ñ’¬ä ì9ñ¦¬èÜð¬¬ä :¼ñ»¬ä : ñƬè€ñȬèòÓ¬ä L:òé¬ä \:Hòë¬è0òè |:hóñ¬ä Œ:Lóó¬ä œ:8óþ¬ä ¬: ó­ä ¼:øò­è¬ò'­ä Ü:ôA­è¬óL­ä ü:|ôO­ä ;\ôQ­è$ôV­ä ,;õs­ä <;üôu­èØô‚­è`õ­ä l; ö¶­ä |; ö½­èàõÈ­ä œ;$÷Ø­èèöì­ä ¼;x÷ï­è@÷ñ­ä Ü;Løû­ä ì;øþ­ä ü;ì÷®è”÷ ®ä < ø,®ä ,<„ø8®èlød®ä L<ùg®èðør®äl<¸ùìHùx®ä Œ<ú}®ä œ<Xú®è(ú®ä ¼<û„®èÈú®ä à<¨û—®âÂð<lû¯±è û»±ä =0üƱä =üͱä 0=üûرä @=àûÛ±èÈûæ±ä `=Ôüé±ä p=´üô±ä €=ˆüÿ±èXü²ä  = ý²ä °=tý²è4ý²ä Ð=Xþ)²ä à=äý5²èÈý@²èˆþJ²ä >ŒÿQ²ä >$ÿp²èÿ¸²èðÿè P>Œ¼²è@Dzä p>èвä €>Ìܲè¸ã²ä  >Hî²ä °>,ò²è÷²ä Ð>Ìý²è° ³ä ð>`³å ?D8³è >³ä ?C³ä 0?øI³èÐO³ä P?ÀV³èœe³ä p?˜k³ä „?@v³â¬Ç”?(®³èø°³ä ´?軳èÌÚ³ä Ô?„à³è,è ô?tì³èó³ä @ õ³èˆ÷³ä 4@þ³é´äT@˜ì8 ´ä t@l ´ä „@ð´ä ”@È ´è°<´è” A´äÄ@h èÔ@@ ìü Z´è” `´âxÃAT |´è< ˆ´è´ ’´ä 8Aˆ ´ä HA ©´èø è hAì °´ä xAÄ ¼´è¤ ´ä ˜AÀ Ç´èœ É´ä ¸AÍ´èø ì´äØA$è èAÄ µä øA¤"µä BxAµèPGµèè 8Bbµèäwµä XBäzµä hBÈ|µè¤ƒµèd‰µä ˜Bè•µä ¨Bœ µè€¿µä ÈB|õè`еèüÓµè4ãµä CØîµä CÀúµèŒ¶ä 8CØ-¶ä HC¨0¶ä XCŒ<¶ä hCpC¶ä xCL”¶è4è ˜CL›¶è §¶ä ¸C »¶ä ÈCè¾¶è¼Á¶èXĶä øCÐʶè°Þ¶ä Düê¶è,õ¶ä 8DÈ ·ä HD¨·ä XDl·èL)·ä xD„/·è$:·ä ˜DXE·ä ¨D<X·ä ¸D [·è`·ä ØD˜b·ètg·èti·ä E(k·è¸m·è\Œ·èÜ·è8˜·ä XEø›·ä hEষ踨·ä ˆE¼ª·è˜¬·ä ¨E(²·èؾ·ä ÈE€É·è\ηèÀÔ·ä øEt Û·ä FH Þ·ä F$ â·è í·ä 8FÌ ï·è¨ ñ·ä XFp!¸ä hFT! ¸è8!¡¸ä ˆF"£¸èØ!¥¸ä ¨FÀ"±¸ä ¸Fl"µ¸è("»¸ä ØFt#¸ä èF@#á¸èÜ"ã¸ä GÐ#ð¸è#û¸ä (G$¹èð# ¹èÀ$¹ä XGh%%¹ä hG4%'¹ä xG%)¹èô$/¹ä ˜G˜&1¹ä ¨G|&=¹ä ¸GH&A¹ä ÈG,&M¹ä ØG&T¹èà%s¹èä&~¹ä Hp'…¹è'‘¹è”'“¹ä 8H$(ž¹ä HH(©¹ä XHü'¬¹èÜ'´¹èT(»¹ä ˆH8)˹ä ˜Hø(Ö¹èÔ(õ¹ä ¸H´)ü¹èœ)ºè * ºä èH$+ºä øH +ºäIÈ*è I¬* ºä (I˜*2ºä 8I„*Aºè<*Hºä XIt+JºèD+Vºä xIð,Xºä ˆIÐ,iºè´,ˆºè-ºè¬-¢ºèH.Áºä ØI¤.úä èIŒ.Úºä øIt.æºè`.èºèä.íºä (JX/ïºä 8J½ä ˆMì<A½è¬<D½ä ¨Mh=c½ä ¸M=e½é=k½ä ØM>m½èÐ=u½ä øM>{½èh>—½ä N?½èà>¨½ä 8N¸?ؽèˆ?ò½èÜ?÷½è<@ù½è|@¾ä ˆN€A ¾ä ˜N4A¾ä ¨NA¾ä ¸Nô@¾èØ@2¾ä ØNäA=¾è A@¾ä øNdBF¾è$BZ¾ä OÄBy¾ä (O B{¾è„B¾è8C†¾ä XOTD’¾ä hO8D¾è¤C¨¾è€D³¾ä œOE¾¾âü@á ¬OÀDÓ¾èœDç¾èPEá¿äÜOáF¿ä ìOÌE%¿ä üO¨E1¿è€E4¿ä P˜F:¿ä ,PpF<¿èTFH¿è(GP¿ä \PÐGR¿ä lP˜GX¿ä |P|Gc¿èdGo¿èLHq¿ä ¬PüHv¿èÐH¿äÌP¼Iè ÜPœI‡¿èXI‹¿ä üPHJŽ¿ä Q(J‘¿ä QJœ¿èäI¨¿è„J­¿â¬ÇôfäÌJ¿¿âä&á hQ\Ká¿ä xQ,Kã¿èKé¿ä ˜Q´Kô¿è|KÀä ¸QàLÀä ÈQ˜L Àä ØQ„LÀä èQhLÀä øQLL!Àè(L@Àä RMFÀèüLLÀèPN}Àè¼N‰Àä XRDOŸÀè,O±Àä xRÈä d]èxIÈèÄxOÈä „]ÄzZÈä ”]$zfÈä ¤]ìy}Èä ´]ÀyœÈä Ä]œy¢Èè|y¨Èä ä]´{¶Èä ô]˜{ÁÈä ^t{ÓÈâ,/^T{öÈè<{ Éä8^H|ì,| Éè€|Éä h^¬|'Éè”|-Éä ˆ^P}4Éä ˜^}?Éèø|MÉâ`0á ¼^ð}^ÉèÈ}uÉä Ü^p~ŸÉè~è ü^0¡Éä _­Éä _ü~¹Éè¼~»Éä <_ÔÁÉä L_¬ÃÉèÊè €Êä |_'Êä Œ_è€3Êè°€CÊä ¬_‚FÊèìKÊä Ì_”‚NÊèx‚QÊä ì_xƒTÊä ü_DƒVÊä `(ƒkÊä ` ƒrÊä ,`ø‚uÊèä‚zÊè ƒÊä d` „ŠÊâ¬ïáXtä܃éÊèH„ëÊè…ñÊä ¤`À…üÊè|…Ëä Ä`ˆ† Ëä Ô`P†•Ëè8†™Ëä ô`T‡œËä a4‡¨Ëä a‡½Ëä $aø†ÅËè؆äËä Da\ˆëËä TaDˆíËèȇøË踈ÿËèH‰Ìèh‰Ì謉,Ìèà‰.Ìä Äa,‹3Ìä ÔaØŠ>Ìä äa´Š—Ì蘊¶Ìä bl‹½ÌèP‹ÉÌ踋ÛÌä 4bŒàÌä Dbü‹ãÌèÜ‹åÌèPŒÍä tb|Íä „bT#Íä ˜büŒ.ÍâÔ4伌9Íä ¸b<Ž;Íä ÈbäGÍä Øb´JÍè˜PÍä øb¸ŽVÍäcœŽè cpŽaÍèXŽdÍä 8cDgÍä Hc(iÍä XctÍèÜŽzÍä xc €Í耆Íä ˜ch‘Íä ¨c,˜Íä ¸cüÍèØ¯Íä Üc ÊÍâ0;å„éÍä üc$‘ïÍä d ‘ÎèÜ Îä ,dt‘ÎèX‘ÎäLdŒ’è \d4’Îä ldð‘!Îä |dÀ‘$Îè°‘CÎè¼’EÎä ¬dœ“KÎè„“SÎä ÌdP”]Î輓iÎä ìd¼”oÎä üdŒ”‡Îèp”ŽÎä e`••Îè0•Ïè–Ïä LeÔ–!Ï謖&Ïè$—-Ïä €eÜ—9Ïâ¬ïá ”e¸—nÏâ0[á ¤e˜—’Ïè\—”Ï蘟ÏèH˜¾Ïä äel™ÊÏä ôe™ÌÏä fܘ×Ïä fÀ˜Ð舘$Ðä 4f¸™&Ð蜙@Ðä Tf˜šBÐä dftš°Ðè`šâÐä „f„›êÐä ”f@›öÐä ¤f›#Ñä ´føš%Ñä ÄfØš-Ñ輚3Ñä äf8œFÑä ôfœKÑä gä›MÑè¼›lÑ謜‚Ñèðœ…ÑèT‡Ñ蜒ÑèDž”Ñätgàžè „gÀž–ÑètžšÑä ¤gØŸ·Ñä ´g´ŸÂÑä ÄgXŸÄÑè0ŸËÑä äg@ æÑè  èÑä h8¡ôÑä h¡ÿÑä $hÜ  Ò訠)Òä DhØ¡4Òä Th¤¡?Òä dh€¡FÒèX¡LÒèô¡PÒä ”h¤¢WÒä ¤h¢vÒä ´h|¢yÒèX¢˜Òä Ôhü¢žÒèÌ¢»ÒèX£ÃÒä i¤£ÎÒ茣ÚÒä $i”¤æÒèx¤ìÒèä¤õÒä TiØ¥úÒä di¬¥Óä tit¥2Óä „i4¥‡Óä ”i¥’Ó襘Óä ´iˆ¦Óä Äi@¦¡Ó覧Óèܦ½Óä ôiì§ËÓä j€§ÐÓä jT§ÒÓè0§ØÓè¨ÞÓè`¨üÓè°¨ÿÓä djô¨ ÔèШZÔä „jÜ©hÔ蔩mÔä ¤jüªtÔä ´j\ª€Ôè<ª‚ÔäÔj|«èäjL«ì$«‡ÔèÌ«Ôè@¬Ôä $kج–Ôä 4k¤¬˜Ôä Dk|¬šÔèT¬¹Ôä dkT­ØÔè$­ßÔä „kÔ­âÔèÀ­&Õä ¤k°®:Õè”®=ÕèÌ®DÕä Ôkd¯GÕä äkH¯LÕè ¯kÕèொÕä lD°ŽÕä $l(°“Õèø¯šÕä Dl<±¹Õä Tl±½Õä dlü°ÔÕä tlȰÛÕè°°âÕä ”lܱéÕä ¤lœ±ëÕ脱þÕä Äl(²Öèô± Öä äl4´ Öä ôl´Öä mX³Öäm$³è $m³&Öä 4mô²8Öä DmزOÖè|²QÖä dm¬´VÖä tmŒ´[ÖèT´aÖä ”m|µhÖä ¤m`µoÖè<µsÖä ÄmàµyÖè°µ~Öä äm´·€Öäôm4·è nä¶‹Öä n”¶–Öè|¶™Öä 4n¸ Ö鸧Öä Tn ¸ÆÖè|¸ÉÖä tnP¹ÑÖä „n ¹ÝÖèĸòÖä ¤nœºôÖä ´n€ºûÖä Än`ºýÖè<º×ä än|» ×ä ôn\» ×ä oH»'×ä o(».×è »E×èÄ»d×ä Do°¼p×ä To|¼{×輆×èм‰×ä „o¾”×ä ”oܽ ×ä ¤o`½µ×è ½·×ä ÄoP¾½×è,¾Â×ä äo˜¾Å×èt¾$Øä p,¿*Øèô¾1Øâ`0á Xp¤¿¢Ø â°ª ¸(á2D’¤“@HðI˜IìJdJ4LKèLhp俽Øè¼¿ÈØä ˆpLÀÎØè ÀÕØä ¨pÈÀôØä ¸p°ÀÿØè”ÀÙä Øp°ÁÙä èp8ÁÙèÁ"ÙèÂ)Ùä qœÂ0ÙædÂFÙèÀÂKÙä HqÃTÙèøÂ_Ùä hqàÄeÙä xq@ÄlÙä ˆqüÃ…ÙèÌÃÙè@Å›Ùä ¸q,ƦÙä ÈqðÅÉÙä Øq¸ÅØÙèˆÅßÙä øq„ÆåÙèlÆçÙèðÆîÙä (r¤ÇñÙä 8rlÇüÙä PrTÇÚâ4® ˜®ä<Ç.Úä prìÇ9Úä €rØÇMÚèÀÇOÚä r\Èì0ÈQÚä Àr¬ÉXÚä ÐrÉ\Úä àr@ÉbÚèÉfÚèÈÉlÚä sLÊnÚä sÊzÚèäÉ™ÚètʧÚäPs”ËìLËÆÚäpsôËìÔËÌÚä säÌ×Úä  s¼ÌÙÚä °s ÌàÚè(ÌéÚäÐsáÎëÚä àsÐÍïÚä ðslÍúÚå tXÍýÚè4ÍÿÚä tHÎÛè,Î.Ûä @t”Î5Ûè|Î7Ûä `t¤Ï;Ûä ptèÎ>Ûä „tÌÎQÛâ°ª ä¸Îè ¤tôφÛèÐÏ Ûä Ät„ЧÛä ÔtlеÛèDйÛä ôtœÑØÛä uXÑøÛä u<ÑÜä $uÑÜä 4uôÐÜä DuÐÐ Üè¬Ð%Üä duÒ*ÜèÈÑ_Üä „uàÒmÜä”u˜ÒìxÒqÜä ´u(Ó†ÜéÓ‘ÜäÔuáÕ“ÜèàÔêÜä ôupÕñÜè0ÕÿÜä vÔÕÝä $v¸Õ ÝèŒÕÝè Ö5Ýä Tv ÖAÝè\ÖDÝèÐÖ’Ýè,מÝè´× Ýä ¤vèØ¿Ýä ´vÀØÂÝäÄv¨Øè Ôv<ØÝÝè(ØäÝèDÙçÝè¼ÙùÝèLÚÿÝèðÚÞä4wàÛì¬Û ÞäTwXÜè dw8ÜÞè Üè „wÝÞèÝ$ÞèhÝ,Þä ´w4Þ.Þä ÄwüÝ:ÞèàÝ@Þä äwÐÞCÞètÞFÞäx,ßè xßKÞèøÞWÞè¬ß^Þä Dx€àeÞä Txhà’Þä dxTà”Þä tx<à Þèà£Þä ”x á®Þèøà°Þè(á¶Þèôá¸Þä Ôx„âÊÞèpâÍÞâd”jåÔâüÞä y¤ãÿÞä yˆãßä ,ylã ßä íè<7@íèü7Cíä `Žx8Níä pŽ\8Píè88Síè”8fíä  Ž,9míè9síè¤9yíä ÐŽÌ:…íä àŽ€:•íä ðŽ`:´íè8:»íèH;Æíä ô;Øíè¤;äíä @€<èíä PX<ûíä `D<îè$<îä €ˆ= îä 0=îä  ô<(îä °Ð<4îèœ<?îè =BîèÀ=Dîä ôÔ>Kîâü@á ˆ>aîè8>|îä $ ?îèì>îä D”?—îèp?™îèÔ? îä tÀ@«îä „¤@±îä ”Œ@Âîèp@Åîä ´°AÇîä ÄtAËîèTAêîèÄAðîä ôœBòîä ‘pB ïèB`ïä $‘DCrïä 4‘ Ctïä D‘ôBÖïèàBáïèÐCæïâ0[áä&á |‘˜Dðä ‘tD%ðâÐäDGðä °‘$ERðä À‘ EVðä БÐDdðè¸DgðèXEiðå ’ŒEuðèxEwðä ’0F|ðä 0’àE€ðèÄE‚ðä P’tFˆðèLFœðä p’ðF¢ðè¸F¥ðè8G¬ðä  ’hH±ðèDH¸ðä Ä’4I½ðâü@åàHÈðä ä’¬IÏðèDIÛðä “üIìðèÐI ñèhJè 4“ØJñä D“¼Jñè”J!ñä d“XK'ñè0K-ñèÐK3ñä ”“ÔL“ñä ¤“ L˜ñè€L›ñèPMìðMñä ä“$N²ñèN¾ñä ” OÁñä ”œNÈñä $”€NËñèTN×ñä D”pOÛñèTOðñä d”tPòè$Pòä „”øPòä ””ÔPòè¨PòèTQ2òä Ä”ðQFòä Ô”ÈQQòä 䔬QSòä ô”QUòèpQXòä •HRcòä $•(ReòèRè D•ÔRmòè¼Roòä d•`Svòè8S¾òä „•4TÄò䔕Tè ¤•ìSÐòä ´•ÐSÜòè´SïòètTóòä è•ðTõòâü@á ø•ÔT óè°Tóä –lUóä (–DU!óè,U@óä H–$VDóä X–ØUOóèÀU]óä x–ðVaóä Œ–¼V{óâ`0á œ–˜V—óèHVžóä ¼–XW¢óä Ì–@W¤óèW«óä ì–œW¯óèxW±óèä ±ÂIä ±ÈÁTä $±tÁXä 4±TÁ[è8Áfä T±ˆÂkè`Âvä t±8Ãxä „±Ãä ”±ü¨èÔ®âì8ðž ¼±¸ÃÂè˜ÃÛä ܱÄæä ì±`Äòäü±áÄôèÐÃÿä ²ØÄä 0²ÈÄâü@å¬Ää P²\Åä `²<Å$ä p² Å+è Å/è˜Å1èÆ7èlÆVä À²hÇ]ä вHÇhèÇsâà%å¼Çä ³È˜èäÇ£ä $³PȨè8È´èÄÈ»â`0á X³pÉÕä h³LÉÚè(Éàä ˆ³DÊâä ˜³àÉóèÈÉ èìÊ èLË ä Ø³ÄË1 èŒË4 è@Ì6 ä ´ÄÌA ä´”ÌìpÌL ä 8´´Ík ä H´Ín ä X´tÍr è<Í~ äx´,Ïè ˆ´„Î è<Έ èèÏŠ ä ¸´àÐŒ èÄШ è\Ѭ ä è´ôÒ· ä ø´ÌÒà ä µ¬Òõ äµÒá ä (µàÑ ä 8µœÑ ètÑ ä XµXÓ# è@Ó. ä xµÔÓ9 ä ˆµœÓ> ä ˜µ„ÓP èlÓU ä ¸µÔ\ äȵhÔìüÓ` è¬Ôe è,Õk ä ¶HÖr èìÕ¶ è Ö» ä 8¶ìÖ èØÖá ä X¶¨×ê ä h¶Œ×õ äx¶t×á è\× ä ˜¶ Ø èØ× ä ¸¶hØ/ èHØ2 èÌØ7 ä è¶äÙV ä ø¶¨Ùf è,Ùm ä ·Úx éÚ— èXÚ¤ ä H·°Ú© ä X·”Ú´ è|Ú¹ ä x·LÛ¾ è4ÛÀ ä ˜·ôÛÎ èÜÛÙ ä ¸·„ÜÛ ä È·dÜæ èHÜ ä è·(Ý ä ø· Ý ä ¸èÜ èÔÜ èXÝ# ä 8¸¼Ý' èœÝ, èøÝ2 ä h¸ÌÞ9 è¨Þ; ä ˆ¸|ßA èdßH èÔßK ä ¸¸àj éàr äظ¨àìŒà‘ ä ø¸\á˜ ä ¹8á èᢠä (¹hâ« ä 8¹Hâ· ä H¹âÇ ä X¹àáÍ ä h¹ÄáÒ è˜áâ ä ˆ¹¼ãé è”ã éä ä ¸¹Tå ä ȹÐä) ä Ø¹¸ä+ è”ä- ä ø¹˜å4 èlå? èüåI ä (ºˆæN ä 8ºlæZ èLæ\ è¼æg èèæq ä xºàç| èÄç~ è<èè ¨º˜è‰ èpè ä Ⱥxé– ä Øº\é¢ ä èº4é® ä øºéò ä »ðèø ä »Ìèþ è´è ä 8»ôéä H»ÜéèÀé!âøä ˆEp»Ìê0ä €»°ê2ètêDä  »ëJèäêNè¬ëPä лôëSèàëZèÈìaéírèpí}ä (¼´îßâÐÄ8¼lîä H¼(îèî0ä h¼8ï3ä x¼$ï5ä ˆ¼ï<èØîPä ¨¼´ïTèhï`ä ȼ`ðtèäïä è¼$ñˆä ø¼Üð”è¸ð˜èXñè (½ÜñŸä 8½ ñªè€ñ¶è ò¼ä h½ôòÀä x½ÈòÂä ˆ½ òÈèxòÎä ¨½àóÔä ¼½óÖâä̽xóýä ܽXóÿè0óä ü½lô èHô+ä ¾hõCä ,¾0õ_éõaä L¾4ö€ä \¾èõŒä l¾Ìõ—è´õ­ä ”¾dö´âP#áÔ*åPöÓä ´¾|÷Þä ľ\÷ãè8÷óää¾ü÷è ô¾à÷þè¤÷ä ¿Hø2è0øQèØøaä D¿„ùxèhù|äd¿áú‡èÐù’è8ú”ä ”¿Tû›ä ¤¿@û´ä ´¿û»äÄ¿áûÕèÄúÙä ä¿hüÞäô¿üè ÀèûôèÈûûä $Àýÿä 4Àðüä DÀÐüèœüè`ý!ä tÀ$þ'ä„Àáþ.è¤ý4ä ¤Àèþ;ä ´À¤þFä ÄÀˆþYèlþdä äÀlÿfä ôÀPÿiä Á4ÿpè ÿwä $Á`yä <Á~â0[á4¶LÁàÿ¨èÌÿ¼ä lÁ´¾ä |Á˜Êè|ÑäœÁHè ¬ÁÜä ¼Áüãèàèä ÜÁlóä ìÁ8þä üÁ èüä ÂØ&ä 0ÂÀ(âà%å¨Pè_ä `ÂXfè0hä €Â¨nèuä  Â„ä °Âd¦ä ÀÂH²è ¹ä àÂx¿ä ðÂXÁå Ã4Ìè Îä ÃxÙä 0ÃXåè0ðä PÃöä `ÃøèÈ ä €Ãèp!è ,ä °Ã  7èl Bä ÐÃt Nä àÃX Pä ðÃ@ Tå Ä$ bèÔ iä Äì è 0ÄÌ tè¨ è° ‡èD ¦ä pÄØ ±ä €Ä¤ ¼ä Ä„ Êè` Ïä°ÄL è ÀÄ4 Ôè àèØ åèü ðå żûä Åœèhâ¤/åä DŰä TÅl$ä dÅT/ä tÅ41è8è,Dä ¤Å¬Pä ´Å[ä ÄÅtoèLzä äÅÌ€ä ôŤŒä ƈ˜èD¼èð¿ä 4ÆÄä DÆèÊä TÆÀÍä dÆPØä tÆ8Ûèâä ”ÆDæè ëä´Æôì|òä ÔÆdýèÿä ôÆ, ä ÇìèØ)ä $Ǭ0èŒ;ä DÇ4=è HädÇÌè xÇ\âTÓäxtä ˜Ç€yä ¨Ç0„è‹éŽä ØÇl•ä èÇP¡ä øÇ,¬èÎä ÈäÔä (ÈÄàä 8ȰëèŒòè4ýä hÈpèT1èÔ:ä ˜È˜PèxWä ¸Èhä ÈÈ4ƒèŽä èÈ̔蜭ä ɹèp½ä (É`Ñä 8Éܲèĸè|¿â¸(áà%á pÉðáä €ÉÌéä É´è” ä °ÉŒèhä ÐÉ8 ä àÉ "ä ðÉü}å ÊÈ訙ä ÊØ ¸ä 0ÊÀ ÍèX Ôä PÊh!ïè!úäpÊì!á èˆ! ä Êx" è") è "5 äÀÊ#èÐÊá#7 èä": ä ðÊä#Y å ËÌ#e ä Ë #p è|# ä 4Ëp$• âü@á DËT$ª è8$µ è„$¼ ä tË4%¾ èü$Ô ä ”Ë„%ó èP%þ ä´Ëd&á!ä ÄËH& !èì%!ä ä˸&:!ä ô˘&>!è€&J!èH'Y!è”'\!ä 4ÌÐ(g!ä DÌx(r!è8(u!ä dÌL)z!ä tÌ )†!èè(”!ä ”Ìü)›!ä ¤Ì”)¢!è|)Á!ä Ä̈*Ã!ä ÔÌh*Ê!ä äÌD*Ì!è$*Ò!èä*ìœ+í!ä $Íø+ô!èØ+á"è(,"ä TÍŒ,"èl,)"èä,E"èX-N"ä ”Í.b"è -d"ä ´ÍH.z"è$."è´.¨"è€/¬"ä ôÍø/»"è°/¿"ä μ0È"ä $ÎŒ0$#ä 4ÎT0(#ä DÎ@0+#è(0B#ä dÎ|1b#ä tÎ`1m#ä „Î<1y#è1|#ä¤Îá2#ä ´Îì1ž#ä ÄÎØ1£#è°1Ç#ä äÎt3æ#ä ôÎø2ó#ä ÏØ2'$ä Ϭ2o$ä $Ï2v$èt2•$èŒ3—$è 3œ$ä dÏ4¼$é4Â$èp4Ñ$è4å$ä ¤Ï 5ð$ä ´Ï5ò$èè4ý$ä ÔÏ 6%ä äÏÔ5%è¸5>%ä И6D%èt6G%ä $Ð`7f%èH7~%ä DЬ7¢%è„7©%ä dÐl8¯%ä tÐH8³%ä „Ð08ç%èô7ô%èÜ8ø%èü8ÿ%è09 &ä ÔР9&ä äÐX9 &èD9'&ä ÑT:F&ä Ñ0:\&èü9è 4Ñd;b&ä DÑ ;n&èø:y&ädÑÌ;è tѬ;}&è;ˆ&ä ”Ñ <Š&ä ¤Ñ<<–&èü;¡&ä ÄÑX=©&è =´&è>¹&ä ôш>À&ä Òl>Ë&èL>×&è¼>Þ&ä 4Òx?é&ä DÒX?'ä TÒÕÀNœ)èlNž)ä °ÕTO¬)ä ÀÕ*èàP[*ä @ÖLQ_*è,Qg*ä `Ö0Ri*ä pÖRw*ä €ÖôQ~*è¨QŽ*ä  Ö8S™*èÐR*èˆS´*èÜSÔ*ä àÖÄTó*ä ðÖdTÿ*èDT+ä × U +èøT+ä 0× U+è„U"+è@V&+ä `פV2+èŒV=+ä €×°WD+è`WJ+ä  ×$Xd+èXo+è¬Xz+èDY€+èÌY‚+ä ð×\Z‡+è Z‰+è°Z+ä Ø¬[œ+ä 0ØH[µ+ä @Ø$[»+èÌZ½+ä `Ø]Ç+äpØœ\è €Ød\Ê+èL\ì+ä  Øp]î+èT]ú+æ˜] ,èÀ],èü],è@^,å ÙÈ^&,èœ^?,ä Ù _F,ä 0Ù _M,èô^X,ä PÙ`^,ä `Ù¤_j,ä pÙˆ_u,èh_w,ä Ùd`~,è`…,èaŠ,ä ÀÙœa‘,ä ÐÙla˜,è@aœ,ä ðÙ(b¢,å ÚbÁ,ä ÚèaÈ,èÈaÊ,ä 0Ú¨bÑ,ä @ÚˆbÜ,ä PÚdbè,èHb -ä pÚdc-èc-äÚücè  ÚÀc%-èœc'-è@dF-ä ÐÚ€dH-èXdK-ä ðÚfQ-å ÛøeT-ä Û¸el-ä Ûœe„-ä 0Û„e†-è`e‹-ä PÛ„f‘-èhf¡-èg¤-ä€Ûhì°g¯-è@h¶-èøh¼-äÀÛjè ÐÛ¤iÂ-èliÍ-ä ðÛôjÐ-å ÜŒjÔ-è8è(¡@8ä àèТ\8èL¢_8å éT£j8ä é8£n8èè¢|8ä 0霣›8è„£ 8è裫8ä `éH¤¶8è0¤Á8ä €é¥Ï8ä éܤÖ8èĤ9ä °éP¥9ä Àé8¥ 9è$¥9èô¥ 9âü@á ôéD¦39è¦59èl¦U9脦b9ä4êT§è Dê§m9ä Tê즤9ä dêئµ9èÀ¦º9ä „êœ§Å9è|§Ì9ä ¤êX¨ã9ä ´ê,¨å9èȧó9ä Ôê°¨ö9脨û9é©:ä 묩 :ä 댩,:èl©K:è(ªa:輪o:ä Tëä«v:ä dëd«Š:ä të<«‘:è«°:ä ”ë̬»:ä ¤ë¨¬¾:èt¬Ý:茭ã:ä Ôë®î:èè­ù:è„®û:ä ì<¯;ä ìè®;èÌ®;ä 4ìè¯;ä DìÀ¯;è|¯%;è °0;ä tì±];èü°h;ä ”ìŒ±‡;ä¤ì\±ì8±‹;ä Äì@³‘;ä Øì,³“;âü@áèìܲèøì¬²è 픲§;èx²®;ä (í|³´;è\³·;è°³½;ä XíÔ´¿;ä hí¼´Æ;ä x휴È;èD´Î;èlµÕ;ä ¨í|¶ã;ä ¸í<¶ó;ä Èí¶ù;è°µÿ;èȶ<ä øí|· <è0·#<ä î0¸%<ä (î¸)<ä 8îè·5<èÈ·A<ä Xî̸H<ä hî´¸o<èx¸q<ä ˆîH¹‡<è ¹Š<ä ¨îHº<躩<è|º­<ä Øîˆ»½<è@»Ì<è¼»èïD¼ì0¼×<ä (祿ã<ä 8 =èx¼=ä \ï ½.=â`0åä¼S=è\½Y=äŒï¾ìܽa=ä ¬ïH¿d=ä ¼ï0¿o=ä Ìz=èl¾=äìïà¿ìh¿…=ä ð<Á‹=ä ðÁ–=ä ,ð´À¡=ä <ð„À£=èXÀ©=èäÁ´=älðlÂè |ðLÂÀ=ä Œð0ÂÖ=èÂØ=èüÂà=ä ÀðœÄã=âü@á Ðð Äö=èðÃ>äððáÅ>å ñàÄ>èÈÄ->ä ñœÅ2>ä 0ñ€ÅK>ä @ñ`ÅM>ä Pñ4Ål>èÅè pñÆn>ä €ñ\Æp>ä ñDÆt>èüÅy>ä ´ñ ǃ>âü@åÀƘ>ä Ôñ˜Ç>ä äñ€Ç¢>ä ôñhÇ©>èLǰ>ä òŒÈÀ>ä $òTÈÆ>ä 4ò$ÈÔ>äDòáÈí>èÜÇô>ä dòÌÈ?è´È&?ä „ò°É(?ä ”òŒÉ*?ä ¤òlÉ,?ä ´òHÉ.?äÄò0Éì ÉìèÉM?ä ôò¼ÊT?è¨Êb?ä óøË~?ä $óŒË‰?ä 4ótË‹?ä Dó8Ë’?ä Tó˘?èôÊž?è0Ì£?è˜Í®?ä”óDÎè ¤óι?èèͼ?èhÎÛ?ä ÔóLÏà?ä äó Ï÷?èðÎ!@ä ô°Ï$@è„Ï+@ä $ô|Ð1@è(Ð=@è¬ÐD@ä Tô¸ÑF@ä dôÑQ@è\Ñ^@ä „ôÒ}@ä ”ôüÑ@èìÑ“@â`0á ¸ôTÓÊ@ä ÈôÓ×@ä Øô¸ÒÙ@è Òî@âÅ üôÄÓAä õ¤ÓAâ0[ålÓ.Aä 0õŒÔ5Aä @õ\ÔEAä PõÔLAèðÓkAä põÕoAä €õtÕzAä õ8Õ†Aä  õÕ‰Aä °õàÔ¨Aè°Ô®Aä ÐõXÖ¹Aä àõ,Ö»Aä ðõØÕÇAå öÄÕÓAè¬ÕÕAé×çAä 0ö°×ýAä Höœ× Bâœ¦á §á Xöt×MBä hö`×lBèH×nBä ˆöh؉Bä˜ö@Øè ¨öØŒBéØÓBäÈö8Ùè ØöÜØ×BèÄØÞBâ¸(áà%â÷¼ÙáCä ÷€ÙCèlÙCä 0÷ÚCèøÙCèŒÚ$Cè¬Û@Cè(ÜkCä €÷ÐÜsCèˆÜƒCä  ÷ Ý†Cè(ÝŠCè´Ý’Cä Ð÷HÞ”Cä à÷ Þ¨CèÔÝ­CèhÞ°CèÄÞ²CèDß½Cä 0ø°ßÄCä @øœßÇCè€ßÎCä `øxàÐCä pøPàÜCä €ø(àûCèàDèäàDä °øTáDä Àø<áDèá&Dä àøÐá)Dä ðøá5DèxáTDä ùâ_DèèáfDä 0ùÌâhDè°âoDéãvDä `ùXã}Dä pù8ãˆDè(ãœDä ùøä£Dä  ùèäãDä °ùÐäêDä Àù¸äíDä Ðù äòDä àùtäöDä ðùPäüDå ú$äEéäEä ú˜åEä 0úˆåEä @údå%EèLå0Eä `úXæ7Eä pú8æEEä €ú(æQEä úøåXEèäå]EâÄ"áP#á ¸úŒç¾Eä ÈúpçËEä ØúXçÖEä èúDç Fä øú$çFä ûç.Fèèæ2Fä (ûèHFä 8ûàçOFè¸çUFè€è`Fä hûhégFè$éiFèpêwFè¨ê~Fè¤ë…FèÌë‘Fä Èûpì•FèLì´Fä èûøìºFè´ì¼Fä üÔîÃFä ü°îÏFä(ü|îè 8ü îßFäHüáîêFäXüäíáGä hü¬íGèˆí Gä ˆüXïGä ˜ü0ïGèï'Gä ¸ü,ð/GèÜï6Gä Øü ñUGä èüÐðWGè˜ð\Gäýðñè ý˜ñlGèDñwGä 8ýìò–Gä Hý ò®Gä Xýxò±Gä hý`òÄGè<òÇGä ˆý4óÍGè óìGä ¨ýüóóGä ¸ýØóHä Èý´ó HèlóHâÄ"áP#å ô/Hå þ@õ?Hè(õJHèÀõQHä 0þ˜öSHä@þhöì ö_Hèðö~Hèd÷’Hè4ø•Hä þÔø Hè ø¦Hä °þ¸ù«Hä Àþ˜ù¶HèpùÁHä àþ”úÈHä ðþ@úÓHè(úÚHè ûáHä ÿ,üíHä 0ÿüAIä @ÿØûRIè¸ûoIä `ÿÜü…Iè¤ü‘IèdýœIâÄ"áP#á ˜ÿþÊIä ¨ÿlþÑIèäýêIä ÈÿÿïIèàþôIèÿÿIèÿJèìÿ Jä  Jä (ˆ/Jèp;Jä H0BJè~Jä hxŠJèPœJä ˆ8»Jä ˜ÂJèðÉJèTÏJä È,ÕJè àJä èïJä øäûJä`è ,Kä ( Kèà Kä H|Kè$&Kä h¼(Kè¨3Kä ˆ45Kè AKä ¨ØhKä ¸¨kKètˆKä ØpŽKè@•Kä øH›KèÔ§Kè´ÆKèÀ Lèà Lä H, &Lè 1Lä hœ 3Lä x| @Lè` LLä ˜D XLä ¨0 cLè è È0 ÅLäØá ÏLä èì ÖLä øÈ ßLè¤ åLä  çLä ( öLä 8è øLèÔ Mä Xh Mè< Mä x(Mè MèÌ$Mä ¨T+Mä ¸<2Mè=MèÄIMèYMä ø¸`Mè”lMä ¬rMä(„è 8TtMè4vMèèMä hü’Mä x Mä ˆp¿MèHÞMä ¬ÜýMâ„Ó ¼,"Nè&N⸚°’ ä è ôQNèüXNä Ø[Nä $¼fNä 4˜iNè|oNä T@tNèNä tЊNè´•Nä ”T¡Nä ¤0°Nè»Nä Ä0ÁNèôÔNä ä¤ÛNèˆæNèDîNä  ùNä $OèàOä DxOè8'Oä dä.Oä tÀ1Oè¨Oè,ì DOä ÄPPOäÔ$ìü\OäôÈìphOä ätOä $<Oä 4’Oèð˜OèìT¦Oä t¬ªOè|µOè ¼Oä ¤Ø ÂOä ´¼ ÅOè„ ÐOä Ôd!×Oä äP!ÞOä ô´Uä ¸X>ÀUèD>ÃUèÀ>ÆUä ìt?ÈUâ¬ïåT?åUä 4@ýUä @Vä ,ì?Vè¨?ìT@Vä\(Bì|AVèXB"Vè C(Vä œˆC.Vä ¬tC:Vä ¼XCYèlTìxU@YätØUì¨ULYè€VOYä ¤ÜV[YèÄV¯YèW»Yä ÔXÆYèÀWè ô´XÒYä |X×Yèaéè ”4€Laä ¤ôXaèàyaä Ä €­aä ÔŒ€²aèl€çaä ôéaä Ô€bâ4ä¼€:bä (¬‚?bä 8x‚Nbä Hd‚Ybä XL‚bä h4‚”bä x‚–bäˆðìеbä ¨lƒºbä ¸TƒÆbä È<ƒÛbä Øƒcèô‚8cä øôƒScä  ЃWc謃]cä ( ¤„_cä 8 p„qcä H L„vcè$„}cä h †„cä x €…cä ˆ `…¤cè<…Ãcè4†Ìcä ¸ ¨‡Òcä È h‡dä Ø P‡dä è ‡ dèü†dèˆdä !ôˆdâü@á ,!܈?dä Ôûðvè¸ûwä <>4üwè üè \>4ýwèÈüwè¨ý&wäŒ>xþè œ>(þ)wèäý4wä ¼>àþ;wè¤þPwéÿUwè`ÿÈwäü>¼ è ?x Ìwä ?\ ×wä ,?< Úwä }ä FÔ A}ä ,F„ S}ä e„ä àNx> j„ä ðNP> „è> †„äO ? è Oø> ˆ„èÐ> „ä @O˜? •„èt? ›„èˆ@ ¦„ä pOA ©„ä €Oì@ ¬„ä O¼@ Äè¬@ Ï„è@A Ó„ä ÀOxB ò„ä ÐOXB …ä àODB …ä ðOB …å PüA "…èÜA '…ä P¸B 0…è¤B 6…ä @PìC 8…ä TP¤C ;…âÂäPC }…ä tP4D €…è D „…ä ”PÜD ‡…ä ¤PœD ’…è`D ™…ä ÄP8E Ÿ…èE ¡…èœE À…ä ôPF Ç…èøE æ…ä QÌF †ä $QF †ä 4QxF †è8F &†è G +†ä dQŒG 3†ä tQTG 5†è@G è ”Q€H J†ä ¤Q8H V†èH \†äÄQ—è™ A—ä |fÌ™ D—ä Œf¨™ P—耙 W—ä ¬fš b—èì™ w—ä Ìf<› }—äÜfðš è ìfÀš €—èœš —ä gÜ› £—ä gŒ› ¶—èh› »—ä í> ¸ä ¤‘ ? ¸ä ´‘À> ¸ä Ä‘°> (¸èl> 9¸è\? ?¸ä ô‘ì? A¸è°? D¸ä ’¸@ Z¸è¨@ ]¸ä 4’ðA `¸èdA c¸ä T’ÄB n¸ä d’XB p¸è,B |¸ä „’C ž¸èøB °¸ä ¤’xC ³¸ä ´’TC ¶¸è0C ¼¸è D ʸä ä’D ظä ô’xD à¸èPD ì¸è¨D ¹èÐD ¹è E ¹ä D“pE %¹ä T“\E 1¹è(E <¹èÀE n¹ä „“tF t¹ä ”“XF y¹è$F è ´“ðF }¹ä Ä“ÐF ¹è°F …¹ä 䓨G Œ¹ä ô“ÄG —¹ä ”¨G ¢¹è€G ©¹ä $”ŒH Źä 4”tH йèH Ò¹ä T”„I ó¹ä d”dI ÿ¹è(I ìÜI è ””K ºä ¤”øJ ºä ´”ØJ ºä Ä”¼J ºä Ô”J ºä ä”tJ ºè4J ºä•DL è •L .ºä $•ìK 0ºèÔK è D•$M 7ºä T•ÐL |ºä d•°L ~ºè”L €ºèLM šºèüM Ÿºä ¤•O ªºèôN ¬ºèTO ¶ºè„O ¹ºä 䕨O ¼ºè˜O è –pP Ǻä –PP ɺè8P кä 4–èP Õºè P غâ T–ÌQ Ûºä d–¸Q æºèŒQ ôºä „–8R »ä ”– R »éR #»è¬R )»èÒä ô´8Ê AÒèÊ VÒä µ¬Ë XÒä (µˆË dÒâ0z8µË {Òä HµðÊ ‡Òè¼Ê ”Òä hµÌ ŸÒä xµøË ¸ÒèØË ¼Òä ˜µ0Í ÒÒ䨵ÜÌ è ¸µÀÌ ÞÒä ȵ¨Ì éÒè`Ì ëÒä èµ8Î ñÒè Î üÒä ¶¼Î þÒè”Î Óä (¶ Ï )ÓèXÏ 5ÓèÀÏ 7ÓèÐ VÓèLÐ bÓä x¶TÑ xÓè$Ñ {ÓèìÑ †Óä ¨¶tÒ œÓä ¸¶LÒ £Óè,Ò _ÕèðÒ ~Õä è¶˜Ó …Õä ø¶xÓ ÊÕä ·\Ó ÍÕè@Ó ÙÕä (·tÔ ÞÕä 8·PÔ äÕè(Ô éÕèðÔ îÕä h·Õ úÕä x·tÕ Öä ˆ·`Õ ÖèDÕ Öä ¨·ðÕ ÖèÔÕ $ÖèèÖ &Öä Ø·L× 2Öä è·4× 9Öè× >Öä ¸¤× EÖèŒ× HÖä (¸øØ OÖä 8¸ÜØ \Öè,Ø aÖè8Ù €ÖèTÙ ‹Öä x¸ÈÙ šÖä ˆ¸ Ù  ÖèŒÙ ¥Öè Ú ÅÖä ¸¸ðÚ ÌÖä ȸØÚ ×ä Ø¸ÄÚ ×è¤Ú ×ä ø¸PÛ ,×è4Û K×ä ¹ôÛ Q×èØÛ S×èPÜ Z×ä H¹LÝ y×ä X¹Ý „×èØÜ ‡×ä x¹ÜÝ Œ×ä ˆ¹ÈÝ “×è¬Ý •×è`Þ š×èÄÞ Þ×è0ß å×ä Ø¹Là ï×ä è¹(à Øä ü¹ à 4Øâ¬Ç ºôß ;ØèÐß BØä ,ºá HØä <ºÈà SØè„à UØä \º`â tØä lº<â vØä |ºâ ØäŒºáâ Øä œºàá Øè¼á •Øä ¼ºÀâ œØè”â £Øä ܺˆä ªØä ìºlä ÙØä üºPä ÞØä »øã ñØèÀã üØä ,»hå Ùä <»,å Ùè å ,Ùè¼å .Ùä p»`æ :Ùâ|J äèå EÙè|æ XÙèÐæ è°»áè _Ùèàç fÙä лè kÙè|è wÙä ð»Ðè ‚Ùè¬è ‰Ùä ¼Xé ¨Ùèé ®Ùèê ¸Ùè¸ê ÇÙèLë æÙä `¼|ë òÙèhë þÙè,ì ÚèÀì Úä  ¼ í ,Úèìì DÚèÌí è м`î IÚè,î PÚä ð¼$ï oÚéï zÚä ½àï ~Úä ½¬ï Úèï Úä @½¨ð ”Úä P½`ð ¬Úä `½@ð ²Úè ð ¸Úä €½ñ éÚèñ õÚä  ½Lò üÚä °½ò Ûä À½ôñ BÛä нàñ EÛè¼ñ MÛä ð½Äò [Ûå ¾˜ò £Ûè|ò ®Ûèó µÛèÜó ¹Ûä @¾ô ÄÛèøó ÆÛè”ô ÊÛä p¾„õ ÕÛä €¾lõ äÛä ¾Dõ øÛèõ ÿÛèìõ Üä À¾Lö Üèö Üèpö Üä ð¾<÷ "Üè$÷ .Üä ¿¤÷ 5Üè€÷ AÜä 0¿Œø `Üä D¿ø bÜâ0[á T¿Ü÷ ŒÜè¼÷ Üä t¿tù –Üä „¿,ù ˜Üä ”¿ù ›Üä ¤¿ôø Üä ´¿¼ø ©Üè¨ø ´Üä Ô¿,ú ¶Üä ä¿Ìù ÂÜè ù ÉÜä À|ú ËÜä Àdú ÐÜèLú ÓÜä 4Àû ÚÜéû ÜÜä TÀ”û ãÜè|û êÜèÈû ìÜè ü è ”Àìü ðÜä ¤ÀØü Ýä ´À¤ü Ýè|ü Ýä ØÀHý Ýâü@á èÀ0ý 3Ýèý ;Ýä Á´ý @Ýâ0[ᨻ Á|ý kÝè\ý mÝä @Áôþ ŸÝä PÁÐþ ºÝä `Áþ ½Ýèlþ ÓÝä €Áÿ áÝä Á8ÿ ïÝè ÿ ñÝä °Áˆ Þä ÀÁ Þèôÿ Þä àÁ $Þä ðÁü ÞèÈ ŸÞä  ¡Þèp ¨Þä 0ÂX ®Þä @ °ÞèÐ »Þä h ÁÞâ0;á4¢á xÂÜ ìÞè¸ òÞä ˜Â¸ ßèT ßä ¸Â  #ßä È /ßèð 2ßâtPá ìÂÀ Dßä üÂŒ Ußèd \ßè cßä ,è hßä <À kßä LÃ` Šßè( ì< ©ßä |Ãü «ßä ŒÃÜ ·ßè˜ Âßä ¬ÃŒ Èßä ¼Ãt óßä ÌÃP õßè0 áàä ìÃ$ àä üà  àä Äð àä ÄÐ àè´ "àä <Ä .àä LÄø 0àä \Äà 2àè´ Qàè¤ Wàä ŒÄ Yàèè làä ¬Ä¨ oàèx yàä ÌÄt ˆàä ÜÄ\ ‹àè< ªàè¬ µàä Å„ ¼àè Çàä ,Åì ÎàèÐ áàä LÅh ãàä \Å$ êàè  ñàä |Å4 öàä ˜Å ýàâl‚€Ý àž¨ÅÌ Báè¤ Gáèd Ráä ØÅ4 eáä èÅ káèü váèÐ è Æ8 {áé †áä 8Æ$ ‹áä HÆŒ áèl –áèp £áä xÆ ¥áèt ¬áä ˜Æ ±áä ¨Æä ´áèÈ ºáä ÈÆŒ ÌáèP ÑáäèÆ8 è øÆ ßáä ÇÜ êáèÄ îáè| ûáä 8Ç, âä HÇø âèÌ ;âè” =âä xÇt Iâä ˆÇX UâèÐ aâè” câä ¸Ç| mâè yâä ØÇ¸ }âè  ƒâä øÇˆ ‡âä Èp ’âä ÈL žâè4 è 8ÈL Ââä HÈ Èâé Ôâèh Ûâä €Èx úââpÀ•È( ãä  È ãä °Èü ãèÜ #ãè (ãä àÈ„ 8ãä ðÈ` Dãå ÉD Hãä É0 Jãä Éð ìÔ Qãè\ Sãä PÉü Uãä `ÉÌ Wãä pɬ Zãè” yãä ÉX ‘ãè8 “ãä °ÉÐ ˜ãè´ ¤ãâ„+á|Œ äð ¶ãä èÉä ¼ãèÌ êãä Ê8! ùãèø ûãä(Êè! è 8ÊÈ! äèˆ! %ää Xʰ" 0ää hʘ" 7ää xÊ|" >ää ˆÊT" Eää ˜Ê<" Päè" [ää ¸Êô# bää ÈÊÔ# mää ØÊ´# }äèx# æää øÊ„$ ìäèT$ úääËá& üää (Ëä% ÿää 8˘% åä HËt% !åä XË(% $åè% *åâ„+å & Cåä ŒË' Qåä œËÔ& ]åä ¬Ë¼& cåèˆ& nåä ÌËt' åè\' ’åè8( žåä üËt(  åèT( §åèÐ( ¬åä 4Ìl) ¹åâ Ø.å ) âåäTÌH* è dÌ* íåä tÌü) òåä „ÌÌ) ýåè€) æä ¤ÌÀ* æè¨* æä ÄÌø+ æä ÔÌà+ æä ä̼+ &æä ôÌp+ ,æè@+ :æä Í´, [æâ`0áÐ0á ,Í`, uæèL, wæä LÍü- yæä \ÍÔ- ‹æä lͰ- –æä |Í”- ªæä ŒÍ|- ½æä œÍ(- Àæé- ßæä ¼Í\. åæèD. ìæä ÜÍÈ. øæè°. ÿæä üÍ êè > "êèè> $êä ŒÒÈ? 0êä œÒ8? ;êä ¬Ò ? Gêé? Nêä ÌÒè@ mêä ÜÒ¸@ yêä ìÒˆ@ ‡êä üÒh@ ’êä ÓD@ žêä Ó$@ ¥êä ,Ó @ »êèð? Àêä LÓ4A ÃêèA éêä lÓ„B ðêä |Ó\B óêäŒÓ0B è ¬ÓèA øêâœ¦á §á0§á¨á ¼ÓÐA ëä ÌÓ¼A ëè˜A ëèÌB (ëä üÓ¬C .ëä ÔpC AëèXC `ëä ,ÔäC eëèÈC tëä LÔTD vëè8D {ëä lÔ¼D }ëä |ÔœD „ëè€D ‰ëèPE è ¬ÔÔF Žëä ¼Ô¸F ëä ÌÔ F ›ëä ÜÔdF ¦ëèðè0_ Tðä LÛ˜` _ðè|` ~ðä lÛTa …ðä |Ûè` ‰ðè¼` ¨ðè a ®ðä ¬Ûb ³ðèàa ºðèŒb ¼ðèÀb Äðä ìÛŒc Ýðä üÛpc àðä ÜTc ìðä Ü$c úðä ,Üc ÿðä <Üôb ñèäb ñä \Üd ñä lÜøc !ñè°c -ñè4d 3ñä œÜÈd 6ñè¸d Iñä ¼Ü¨e Kñä ÌÜe Vñä ÜÜ|e YñèúèÔ™ Iúè š Vúä Héøš dúä XéØš kúä h阚 ~úä x通 •úèlš ˜úä ˜é€› ›úä ¨é@› ¦úè(› ¬úä Ðé°œ ³úâ0[áä&á à鄜 ðúèlœ ûúå êp ûä êT 1ûé 8ûä 0ê¬ Oûè˜ Yûä Pꔞ ‰ûä `ê|ž  ûä pêPž ¥ûè8ž Äûäê០Éûä  êìž Ëûä °êÌž Öûè´ž Ûûä Ðê´Ÿ âûä àꔟ ëûä ðêdŸ þûèHŸ üä ë\  (üä ë<  4üä 0ë(  büä @ë  müèèŸ tüä `ëÄ  vüä pë   üè|  ‡üä ëL¡ ’üä  ë,¡ üè ¡ ¤üä Àë°¡ ©üè|¡ ´üä àëࢠ¶üä ðë\¢ ½üå ì8¢ Ñüä ì¢ ðüèС õüä 0ìH£ üüè0£ ýä PìÔ£ ý蔣 !ýä pìL¤ /ýä €ì¤ Hýè¤ Jýä  ì¥ PýèÔ¤ nýä À줥 ýä Ðì„¥ ˜ýä àìl¥ £ýèP¥ ¯ýå í4¦ ¿ýèÈ¥ ÎýèL¦ íýä 0í§ òýä @íئ õý踦 áþä `í¨§ þè\§ !þèЧ #þäíᨠ)þèä§ 5þèL¨ 7þä Àí@© =þè © @þèx© Gþèè© ^þå îઠfþ蘪 iþâ¨$á $î¬ Žþä 4îô« §þè´« ²þèd¬ »þä dî,­ Áþä tî ­ Èþèè¬ Óþä ”î´­ Þþè”­ âþä ´îà® íþè0® ùþä Ôî4¯ ÿè¯ ÿä ôît° &ÿèܯ 2ÿè° 9ÿè<² @ÿä 4ï̲ Gÿ訲 Kÿ蜳 Vÿä dï̳ bÿ踳 nÿä „ïØ´ yÿä ”ï€´ „ÿä ¤ï0´ ›ÿä ¸ï´ ¡ÿâ¨Zäð³ <ä Øï@µ Cä èï$µ Nè µ Yä ðèµ `ä𬵠ìhµ yä 8ðĶ ”ä Hð ¶  ä Xðˆ¶ ¥è`¶ ¬èü¶ ±äˆð¬· è ˜ðˆ· ½èl· Èä ¸ð4¸ Êè¸ Ïè|¸ ÚäèðẠæäøðÀ¹ è ñ€¹ òè,¹ ýä (ñ¤º ä 8ñ€º ä Hñ`º è8º 3ä hñD» 8ä xñðº RèȺ ]ä ˜ñ¼ cä ¨ñì» oä ¸ñÈ» sä Èñ¬» ~舻 €ä èñ€¼ ‚ä øñX¼ è4¼ –ä òL½ ä (ò(½ ©ä <ò ½ ´âô"äì¼ Ìèx½ Ñä lòT¾ Üä |ò0¾ ëè¾ öèü¾ þä ¬òX¿ è ¿ ä Ìòü¿ ä ÜòÜ¿ (褿 /ä üòˆÀ 6ä ódÀ Uè<À [èìÀ ièLÁ pè¸Á wä \óŒÃ |äló\à è |óà ä Œóô ƒèР‰ä ¬óàà ‹ä ¼óÄà è°Ã &ä Üó4Å (ä ìóÅ +ä üóìÄ :ä ô´Ä <ä ô”Ä >ètÄ Dä <ô@Æ Jä LôÔÅ Oä \ô¨Å Vä lô„Å uèdÅ €ä ŒôàÆ ‡è¨Æ Šä ¬ôäÇ ‘ä ¼ôÄÇ ”ä Ìô@Ç ›è(Ç ¿äìô$È ìÈ Ëä õpÈ ÒèPÈ Ùä ,õ°È ßèœÈ åä LõˆÉ çèLÉ óè¤É ÿèÀÉ ä ŒõÄÊ )ä œõ¨Ê ,è8Ê ?ä ¼õŒË FèË Jä ÜõÌ Pä ìõÀË Rè¨Ë Yâà%á öŒÌ sè\Ì èÐÌ ›ä @ö4Í §èÍ ³ä `ö,Î ºä pöìÍ ¼ä €ö¨Í Ýä öˆÍ àè`Í ðä °ö€Î þè`Î ä ÐötÏ 3ä àöÏ ?èÜÎ é ÷´Ï ^è¤Ï jèðÏ qä 4÷€Ð xâü@áD÷lÐ è T÷\Ð —è<Ð žèðÐ  ä „÷äÑ §ä ”÷”Ñ ªètÑ ±ä ´÷TÒ àä Ä÷4Ò âä Ô÷ Ò äèÒ ëä ô÷ØÒ îä øÈÒ õä ø°Ò üèŒÒ ä 4øTÓ &è Ó -ä Tø¸Ó Cè”Ó Fä tøPÔ IèÔ Tä ”øÄÔ ZèlÔ \éÕ gèLÕ †ä Ôø4Ö ä äø$Ö ™ä ôøÖ  èàÕ ³ä ùÈÖ ¹ä $ù°Ö Åä 4ù€Ö ÑèdÖ Üä TùD× ãèäÖ çä tù°× òèd× ôä ”ù(Ø úä ¤ùô× þèÔ× ä ÄùŒØ ètØ ä äùŒÙ ä ôù@Ù +ä ú$Ù 2èàØ 9ä $úÚ <ä 4úäÙ [è¬Ù bä Tú Ú ä dútÚ ƒä tú\Ú è<Ú –èÛ œä ¤úLÛ §èÛ ­äÄúHÜ è ÔúàÛ ³è°Û è ôúØÜ ¹ä û¼Ü ¾ä @û¤Ü Å â P%ð`PûŒÜ èhÜ ä pûìÝ ä €û”Ý "ä ûxÝ )èDÝ =èÞ BäÀûáß ìdÞ Nè,ß Yä ðûØß _å ü°ß sè˜ß ä ütà †è<à ’ä Dü˜á âü@á Tü„á Öä düPá Ýä tü4á ôä „üØà ûä ”ü¨à þèà  ä ´üüá èØá  èœâ : èÈâ H è(ã O è\ã e èÈã l ä $ý`ä r ä 4ý@ä ƒ ä Dý ä ¢ èèã ® ä dýDå ´ ä tý$å ¿ ä „ýå Ë ä ”ýÜä Î ä ¤ý¼ä Ô ä ´ý ä Û è|ä ä ä Ôýˆå è èxå í â`0á øý¨æ U ä þæ a èÐå d èÜæ g ä 8þŒç ‚ è\ç Š èÔç •  â P%ð`”þ°è Ô ä ¤þè ç è`è ì ä Äþ4é ó äÔþáé è äþäè ö èÌè 1 ä ÿhé 4 èPé ; â„+á (ÿ„ê ^ ä 8ÿ`ê j ä Hÿ0ê v ä Xÿ ê œ èÜé  è´ê ä ˆÿë èðê U ä ¨ÿ¬ë _ èˆë ì$ì j ä Øÿí u èÌì ‹ ä øÿœí ‘ ä |í ž èdí ¥ èî ã ä 8äî å ä HÀî  ä X¤î ( ètî ; ä x`ï A ä ˆLï M ä ˜,ï Y è ï è ¸Hð _ ä È0ð a ä Øð èðï — ä øìð ¢ ä ˜ð ´ è|ð º ä (ìñ ¿ ä 8€ñ Ë ä H`ñ ã èHñ ï èò ú ä xŒò èPò èÌò ä ¨àó ä ¸0ó ä Èó èó Rä èlô Uä øTô `ä <ô gä ô iéô tä 8 õ yä HØô è°ô †èTõ ì<ö ètö ¨ä ˜÷ ³ä ¨àö µè¸ö Àä Èì÷ ÖèØ÷ åèø ñä ø\ù ÷ä ôø ùäÐø áä (°ø èœø *ä HÜù ,ä X”ù Fèpù fè<ú yä ˆû ‘ä ˜¸ú è”ú £èHû ®èü ³ä ØDý ¶ä èøü Áä ø°ü Ãä ”ü Éâ Ä+,é Ääpü ãè°ý êèÔý ïä Tðþ öèÐþ ýèHÿ ä „øÿ èàÿ %è´ 4ä ´Œ Xä Äd xè  }ä ä äôá ŠèÄ Œä h ’ä $H è0 è Dè ¯èÈ Âäd` ì  Èä „À Ïè¤ âä ¤L åè èä Ä íä Ôä òä äÌ ùè´ üè` è˜ "ä (t )âü@á 8, >è Jä X¨ Pä h Wèü Zä ˆ ]èä hèD sä ¸ˆ |ä È@ Šä Ø ©ä ìø ¯â¤/åÔ »ä È Âè° áä ,t ìä <X îè4 ä \à ä lÈ èœ "ä ŒX Aä œ< Cè Tä ¼Ü fèŒ qâàÏá àô {ä ðŒ †å h ä L ’è$ ”è4 –èà ˜è@ œä `„ ¨èd ´è¸ »è ½ä  ð æèŒ èä ÀŒ ïèd ôä à` ÿä ð@ èÜ âXàðß ¸ è  ,ä 8 p 8ä H \ ;ä X ( Fèì Iè  ié qä ˜ ¬ wè˜ yèL |ä È ¼ ˆä Ø ˜ ™è€ ¸è ¿ä  ` Åä  < Ñèô Üä 8  ôä H ° ÿè| èh á è´ è8 èL ä ¨ < ä ¸  2ä È Ü Kè¤ è è D Mä ø , Yä  à wè¨ ‚ä ( ” èp •ä H D £ä X Ð §è¬ ªäx x ì` ¯ä ˜ Ü ½ä¨ ¨ ìŒ Áèl ÃèÜ Îä è H Õä ø  êä  Ø îä  ¬ 2ä ( € 9ä 8 h ^ä H L bä X 0 nä h  èð “èd •ä ˜ h ´ä ¨ H ·ä ¸  Çä È ü Õä Ø À Üè¤ îä ø Ü óä  ´ èŒ ä( „ ìX èè ä X d! ä h D! *è,! -ä ˆ p" 3ä ˜ H" Gè" Iä ¸ °# Oä È |# ^èP# è è $ iä ü ü# nâ(£ à# èÈ# è ,¸$ „è<$ è$% ®ä \°% ¼ä l„% Ëä |h% ×èP% éè & ìèT& øè' úä Ì€' è`' ä ì0( èô' ä t) ä ) 'èÄ( 3ä <* :ä LÜ) Fè°) Wä l|* ]èL* ºè,+ Ùä œx+ åèP+ óä ¼d, ùä ÌL, ä Ü0, è , #è€, *èÜ- /è. 2ä ,/ =ä <ˆ. Hèl. Sä \h0 Zä lì/ \è/ gä Œà0 jä œÄ0 qèŒ0 xä ¼ô1 ~ä Ì´1 €è”1 Œä ìä2 —ä üL2 £è(2 Âä Ð3 Èè|3 Êä <L4 Ðèô3 Òä d5 Ùâ4 ´ð ä`4 ä Œ€5 â„+á|Œ œH5 è,5 $ä ¼6 +ä ÌØ5 5è´5 Aè86 Dä ü°6 Fèœ6 Qâ„+á|Œ $07 cèà6 eä Dì8 uä TÐ8 wä d¬8 ~ä |l8 —â„+á|Œ ŒD8 ©èü7 ¶è 9 ¼è(9 ¾ä Ô¼9 Üâ„+á|Œ ä¤9 îèˆ9 óä \: èH: ä $°: (èt: 3ä D`; @ä TD; Kä d ; Rèü: qä„á< wä ”à; ‚ä ¤¤; è„; ˜èÄ< žèô<  ä äx= «è`= ­ä ,> ´ä > ¿èÐ= Óä 4Ü> Þèl> âä TH? íèø> è t˜? ïä „€? òèh? è¼? è,@ è¬@ ä Ô@A ä ä$A ä ôA èÐ@ %ä  A )ä $ˆA +èpA -ä D B 5éB @ä d¨B Iä tB Kä „tB Mè@B cä ¤¸C ‚ä ´œC ŽèÄB °èèHG Iä ìG Kè°G Rä$I è4I è DÐH Xè¬H wèHI }ä t¬J Œä „LJ —ä ” J šä ¤ðI žä ´ÌI ©è¤I °èK ¾èdK ììK ÅèM Çè,M Ñè¼M Ýä 4øM áèÔM úä TìN ä d˜N ä tdN ä „LN ä ”4N èN ä ´@O 'èO Iä ÔtO Wè`O ^ä ôÈO bè´O nèDP rä $@Q ~ä 4Q ä DQ ‰ä TÌP –ä d¸P ¢è P ®ä „´Q ±èœQ Ãä ¤,S Ïä ´S ÚèøR ëä Ô€S ÷èPS ùä ôìS ä ÌS ä ´S èœS ä 4ÔT 'ä D¤T *èPT è dPU 6ä t4U BèU Gè°U LèDV Xè¨V wä Ä4W €èW ‚ä äðW ‡ä ô W «ä ˆW ÌèTW ëä $HX óä 4(X èX ä TäX èÄX =ä tdY Bè$èˆl @$â ô"L!,n è \!n Q$ä l!ðm X$è¸m è Œ!Øo `$ä œ!o d$ä ¬!To w$è4o –$ä Ì!xp œ$ä Ü!Tp §$ä ì!@p ©$è p «$ä "0q ²$ä"q è,"ôp è <"Ôp µ$èŒp Ê$ä\"ár å$ä l"xq ñ$èTq ô$ä Œ"|r ú$ä œ"Tr %è8r %ä ¼"àr %%ä Ô"Èr ,%âpÀ•ä¨r ;%èør A%ä #Ps F%è4s Q%ä $#Ht _%è0t o%ä D#u v%ä T#èt {%ä d#Ðt †%ä t#¼t –%èœt %ä ”#|u ¼%ä ¤#du Ç%èDu Ò%ä Ä#$v Ö%èìu â%ä ä#°v ò%ä ô#”v þ%ä $€v &ä $dv &è8èÈÓ J8ä „;¬Ô X8ètÔ h8èðÔ t8èÜÕ x8ä Ä;¼Ö ~8ä Ô;,Ö ˜8è Ö £8ä ô;4× ¬8èüÖ ·8èÐ× ¾8è<Ø À8ä 4<ÈØ Ç8è¨Ø 9è<Ù 9ä d<¬Ù !9ä t<pÙ S9è\Ù f9ä ”<¬Ú k9ä ¤<xÚ {9ä ´<LÚ 9è0Ú ‡9ä Ô<DÛ ‰9ä ä<ôÚ ‹9èÌÚ ’9è”Û ˜9âü@á =$Ü ª9ä (=Ü Â9è¼Û Í9ä H=èÜ Ö9èÄÜ Û9ä h=°Ý Ý9ä x=hÝ :ä ˆ=DÝ :èÝ 2:ä ¨=HÞ 8:ä ¸=$Þ L:éÞ k:ä Ø=<ß r:ä è=ß v:èß ìäß :ä >¤à :â(£ ä„à œ:è¤á »:èÜá Á:ä \>ã Û:ä l>ôâ Ý:èÐâ ã:ä Œ>°ã é:è€ã õ:ä¬>¼ä á;ä ¼>¨ä ;ä Ì>€ä ;èdä ;è å ;ä ü>”å /;è|å 3;èÀå 5;è æ Š;ä ä xBÌò >ä ˆB°ò >ä ˜B`ò !>ä ¨BLò @>è$ò C>ä ÈBÜó h>ä ØBPó j>è0ó p>è ô v>ä Cpõ |>ä C,õ >èôô >ä 8Cö ¯>ä HCøõ »>è´õ Ç>ähC÷ è xCäö Í>ä ˆCÄö Þ>èTö ?ä ¨C÷ )?ä ¸Cp÷ ;?ä ÌCT÷ F?âä&å8÷ g?ä ìCdø m?ä üC ø ƒ?èð÷ —?ä Dù ž?ä ,Dìø ³?è”ø ¾?ä LD„ù À?ä \DPù Ã?è ù Ê?ä |Düù Ú?ä ŒDàù ß?è¸ù ã?èú è?â¸(åpú @èüú @è û 1@ä ðDàû 7@è¨û C@è€ü b@èPý h@ä 0E¼þ s@ä @E|þ v@ä PE(þ @ä `EÜý ˜@èý ¤@èØþ èEàÿ è  E¬ÿ Ã@ä °E˜ÿ Î@ä ÀE€ÿ Ð@è$ÿ Õ@ä àE` Ú@ä ðED á@å F( æ@è è@ä F¤ ï@è„ ú@èt ÿ@ä PF Aé Aè4 Aä €F Aä Fô 4Aè sAä °Fü ~Aä ÀF€ €Aä ÔFd ‚Aâä&åL ¤Aä ôF| ¦AèP ±Aèì »Aä $Gˆ ½Aä 4GX ÈAè< ðAèÀ õAä dG Bä tGì Bä „GÔ #Bä ”G¸ (Bä ¤G˜ 3Bä ´GT >Bä ÄG0 ]Bè `Bä äG  jBä ôGt lBä HX pBè$ sBèÔ zBä 4Hˆ “Bèh ¢Bèì ¦Bä dHÜ ªBä tH¨ ®Bèp ÂBä ”HŒ ÉBä ¨Ht ÌBâÅ ä ÷Bè¬ ùBèÌ áCä èH” Cä øHL Cè mCèÔ sCè¤ uCèÔ |Cä HIt ƒCèT ŠCä hI@ Cä xI œCèü ¢Cè€ §Cä ¨I ©Cä ¸IÌ ¯Cè˜ ±Cä ØIP ·Cè4 ÑCèø áCè¬ øCä JŒ üCä (J( Dèð Dä HJÜ DèÀ DähJ´ è xJ” +Dä ˆJ< 6Dè Eä ìKp @Eè8 CEè bEä Lð hEä ,L¸ tEèP vEä LL4 |Eè ‚EèD ŒEä |LÜ ŸEä ŒL¨ «Eèˆ ÊEä ¬LÄ ÐEä ¼L¬ ×Eä ÌL@ ìEè( üEä ìL þEä üLü FèÜ Fä Mœ FèP FèÐ $Fä LM  (Fé 4FälM¸ ì` 8FèP WFèè bFä ¬MÜ nFä ¼MÄ pFä ÌM  {Fé šFäìMT ì ¹Fä Nü ¿Fèœ ÂFä ,N€! ÈFä •Kä ÈT$> —Kè> ™Kä èTì> žKä øTÐ>  Kè> µKä UŒ? ÀKä (U\? ÂKèiè¤Ù @iä Ø}üÚ Eiäè}èÚ è ø}ÀÚ Iiè¤Ú hièÛ niä (~Ü ziä 8~ðÛ öiä H~ÔÛ jä X~¼Û jè¤Û !jä x~¼Ü +jä ˆ~¤Ü 5jèXÜ 8jä ¨~Ý ?jä ¸~Ý CjèüÜ Fjä Ø~ÌÝ Hjè°Ý Ojä ø~¨Þ Zjä ”Þ _jä tÞ ijè`Þ ojè8ß ƒjä H¨ß Žjèˆß ‘jä høß §jèàß ­jä ˆlà ºjä ˜Pà Ùjä ¨0à øjèà kä È á kä ØÐà "kè°à (kä øìá /kä €Èá 2kä €¨á 7kè@á :kä 8€dâ Ekä H€Dâ Kkè â Okä h€ â ckè|â hkä ˆ€Ðã Úkä ˜€¸ã Þkä ¨€Xã íkèã òkè ä ÿk䨀@å è è€$å lèå lä Èå lè”å lä (Hæ !lä 8æ 6lèìå 8lä Xxæ >lè`æ ]lä xÌç ilä ˆ4ç ulä ˜ç wlèç ‹lä ¸üç –lèäç ™lè4è ¨lä èé ºlä ødé Ëlè8é ílä ‚Dê ølä (‚(ê mèÐé mä H‚øê mä X‚àê mèÀê mèÔë +mä ˆ‚hì -mä ˜‚ì Gmèøë è ¸‚Ìí fmä Ô‚8í kmâ„+á-á¸(á ä‚Øì Æmè´ì Ìmè$î Õmèˆî ×mä $ƒ<ï ßmèèî ãmäDƒáð îmèàï ýmä dƒpð nèLð nä „ƒÜð nä ”ƒ¨ð (nèˆð ?nä´ƒ$ñ ì ñ Jnä Ôƒäñ Znä 䃠ñ jnè„ñ nä „¼ò “nä „ò šnä $„lò ¥nè,ò ¿nèDó Ënä T„ìó Ònä d„°ó Önè”ó ánä„„Ôô áoä ”„xô oä ¤„hô oä ´„Pô oä Ä„(ô oèô -oä ä„(õ Þ|ä ¸—4>é|èü=î|ä Ø—(?ô|äè—ä>á}èÐ>}ä ˜p? }èL?}ä (˜Ì?}è„?}ä H˜”@}ä X˜,@¯}è@±}ä x˜4A¶}ä ˆ˜AÀ}èè@Õ}ä ¸˜¼AÚ}â,é lwŒ=œ– Ș¨Am~ä Ø˜ŒAt~ä è˜xA‡~èPAŒ~ä™áB«~èìA°~ä (™tBÏ~è,BÔ~ä L™CÖ~âàÓ\™ðBë~ä l™ÜB÷~è¸Bü~ä Œ™¤Cä œ™€Cä ¬™lCä ¼™XCèƒä ¨žhXFƒèPXIƒä ÈžôXUƒèÐX^ƒä èž„Y}ƒä øžTYƒè0Yƒä Ÿ(Z“ƒä (ŸÄY•ƒè¤Y—ƒä HŸ¬Z©ƒèˆZºƒä hŸ°[ÁƒäxŸŒ[舟`[è ˜Ÿ4[Ńé[؃ä ¸Ÿ\܃ä ÈŸø[ÞƒèÜ[áƒèX\ìƒä øŸ|]ýƒè]„ä  ð]„è˜]8„ä 8 ”^>„ä H l^†„ä X T^’„è^”„ä x ð^š„ä ˆ Ô^„è¸^¤„䨠á`«„èÐ_¯„ä È h`±„è<`Ê„ä è Haé„èaþ„è¸a…ä ¡$bP…èbR…ä 8¡èbT…èœb_…ä X¡äck…è´cm…ä x¡Pdx…è(d‘…ä ˜¡e˜…ä ¨¡äd¤…èdÓ…ä È¡°eØ…è˜eã…ä 衬fò…ä ø¡hfô…èä °°œEèä›Qè8œp輜väð°lì@ä ±0žŒä ±žä0±áž—ä @±Üžè°¥ä `±°ž§ä p±˜ž²èxž¹ä ±,ŸÁä  ±Ÿàèôžåä À±ÜŸçä б°Ÿîä ౘŸúètŸè $ä ²ä +ä ²Р-踠4ä @²ø¡;è0¡Fä `²`¢_è,¢jä €²ü¢qä ²Тxèx¢zè`£ä ȲØ£‡ãJ$ý äÀ£Öä è²(¤ßè¤ïèL¤ûèÔ¤‘èð¤è 8³˜¥ ‘èH¥‘äX³8¦è h³¦‘èø¥!‘ä ˆ³§@‘èܦE‘ä ¨³l§I‘è@§O‘ä ȳܧU‘è´§Y‘ä è³ ¨`‘èø§g‘ä ´ì¨l‘ä ´Ш…‘è´¨•‘ä 8´ª´‘ä H´Ä©¶‘茩¹‘èXªÄ‘ä €´0«Õ‘ãJ$ý ´øª$’ä  ´¨ª(’茪/’ä À´ «E’耫V’ä à´œ¬u’ä ð´l¬ˆ’è<¬’â`0á µ ®¾’ä $µô­Å’èÔ­ä’ä Dµl®é’èT®ï’ä dµ¯ñ’ä tµx¯õ’ä „µX¯ü’ä ”µ¯“ä ¤µü®“èÔ®“äĵh°ìü¯%“ä äµÀ°+“蜰2“ä ¶±8“èô°L“èÀ±R“è,²q“ä D¶¸²ˆ“蔲“ä d¶t³š“ä t¶0³ž“ä „¶³ “èô²¯“ä ¤¶À³´“訳¿“èسÊ“ä Ô¶h´Ï“ä ä¶<´Ö“è´Ü“èÔ´å“ä ·ˆµð“ä $·Lµô“è8µÿ“è´µ”è¶ ”ä d·p¶”è4¶"”ä „·°¶(”蘶0”ä ¨·4·7”âü@åð¶J”ä з¸Q”â„+á|Œ äÀ·`”ä ø·¬¸”â„+á|Œ 与”ä ¸`¹™”ä 0¸H¹¥”â„+á|Œ @¸¹´”èĸ¿”ä `¸$ºÕ”踹à”ä ˆ¸Àºõ”â„+á|Œ ˜¸¨º•ä ¨¸Œº•èdº•ä ȸ¨»"•èh»$•èÈ»'•ä ø¸P¼,•è0¼/•ä ¹ä¼5•ä (¹´¼9•è¼X•ä H¹ ½w•è½–•ä h¹¾œ•äx¹á¾®•ä ˆ¹ؽ²•èĽ¸•ä ¨¹¿Ì•ä ¸¹”¾Εä ȹt¾Ù•è<¾Û•ä è¹d¿ì•ä ü¹L¿ó•âh,å ¿–ä º¼¿!–蜿-–ä <º4ÀL–èÀ\–ä \ºÈÀ_–ä lº¬Àj–èxÀv–ä Œº(•–èÔÁ—–ä ¬ºä¢–ä ¼ºÈ¤–ä ̺°Â§–èp³–ä ìºhö–è8û–èÌÃ–ä »ˆÄÄ–èlÄÆ–ä <»tÅå–è\Åë–ä \» Æí–èøÅð–ä |»„Æø–èTÆü–èLÇþ–ä ¬»¼Ç—è|Ç!—ä л$È'—âTÓäôÇ<—ä ð»¸ÈB—èXÈM—ä ¼hÉT—ä ¼$É›—ä 0¼É§—èèÈ­—ä P¼ìɶ—è°ÉÄ—ä p¼ìÊË—èÐÊ×—ä ¼˜Ëá—è Ëí—ãÆÅ v¼¼ Ì"˜è$Ì.˜ä ܼŒÍ4˜äì¼`Íè ü¼Í@˜èÈÌD˜éÎJ˜è0ÎU˜èÎ[˜èðÎf˜è4Ïh˜èäÏs˜è4Ð˜ä Œ½üБ˜èàИ˜ä ¬½äÑ·˜èPÑ¿˜èxÒ͘ä ܽ˜ÓK™ä ì½hÓM™ä ü½DÓ`™èÓf™ä ¾$Ôn™ä ,¾ÜÓz™è´Ó™è\ÔÈ™èŒÔÊ™ä l¾DÕÍ™è$ÕÙ™ä Œ¾Öà™ä œ¾xÖâ™ä ¬¾`Öä™è4Öæ™ä ̾L×ì™ä ܾ×ï™ä ì¾äÖô™è°Öè ¿4Øþ™â4 ´ð $¿Ø-šä 4¿À×/šä D¿œ×1šèl×è d¿ Ù6šä t¿Ù;šä „¿€Ø?šèPØFšä ¤¿tÙIšè8ÙTšèôÙsšä Ô¿ìÚ’šä ä¿ Ú™šä ô¿ˆÚ›šèdÚ¡šä ÀTÛ£šè4Û¯šèÔÛ²šä DÀ8ÜÆšä TÀÜÓšèôÛÙšä tÀ4Ýßšä „ÀôÜæšèØÜëšä ¤À|Ýíšä ´ÀdÝøšèTÝþšä ÔÀtÞ›ä äÀXÞ ›ä ôÀ@Þ›äÁáÞ›èØÝ,›ä $ÁPß2›ä 4Á(ßz›ä DÁôÞ›èÈÞ„›ä dÁ¼ß£›ä tÁ¬ß¯›ä „Á˜ß¶›è|ß»›ä ¤Áà¾›ä ´ÁôßÊ›èÜßÑ›ä ÔÁ¬àÔ›ä äÁŒàÛ›ä ôÁdàç›èLàœä Â€á œèLáœä 4ÂhâœèDâ!œä TÂÐâ'œè¸â|œä tÂtãƒœä „ÂH㆜è ㉜è”ã”œä ´ÂØä›œä ÄÂ,äžœèàã œä äÂ4墜ä ôÂ奜èìä­œä ÃæËœä $ÃÀåçœä 4ðåéœä DÔåðœèTå÷œä dÃ`æè<æ ä „ÃØæä ”üæ'èˆæè ¸Ã|ç-â0[á ÈÃhçSèPç]ä èÃØç_è¼çfä Ä€èzä Ä0è…èüç°ä 8ÄàèÏèÈèÚä XÄléÜèTéçèÌééä ˆÄLêôä ˜Ä êžèäéžä ¸Äë0žä ÈÄäê7žä ØÄÄê<žèˆêQžä øÄœëWžä Å€ëYžèdëdžä (Åtìožè4ì{žä HÅà솞è¸ì¼žä tÅÜí¾žâl‚Ð8 Äë„Å|íŸä ”Å`í&Ÿè í(Ÿä ´Å|î.Ÿè@î5Ÿä ÔÅÌî<Ÿè˜îKŸä ôÅlïQŸä ÆPïŠŸä Æ(éè”ä DÆèïŸèÈ蘭ä dÆÈðÚŸä tÆ ðöŸä „ÆðýŸè|ð ä ¤Æñ ä ´Æñ èðð ä ÔÆñ ä 䯀ñ# ä ôÆdñ* è<ñ. ä Çìò5 ä $Ç4ò: ä 4Ç$òY ä DÇò` ä TÇðñg èÜñn ä tÇó~ éó‰ ä”ÇÐóè¤Ç¤óè ´Çló• èLóœ èLôª è€ô° èôô· è@õ èœõÇ ä $ÈPöÌ èöÒ ä DÈH÷Ù ä TÈ ÷Û ä dȬöÝ èŒöã ä „Èì÷è ä ”ÈÌ÷ê èœ÷õ ä ´È€øø èdø¡äÔÈ ùèäÈáù ¡ä ôÈèø¡èÈøèÉÄùè $ɰù¡ä 4Éù%¡èdù0¡ä TÉ|ú6¡ä dÉTúL¡è4úN¡ä„Éxûè ”É,ûY¡ä ¤Éðú[¡èÐú]¡ä Äɘüh¡ä ÔÉ<üm¡ä äÉü¡èøûŠ¡ä Ê€ý‘¡ä Êdý–¡ä $Ê<ý¡ä 4Ê ý´¡èüü»¡ä TÊ,þÁ¡ä dÊÀýáè¤ýÏ¡ä „Ê”þÛ¡èXþï¡ä ¤Ê˜ÿö¡ä ´ÊPÿ>¢ä ÄÊ,ÿA¢ä ÔÊÿ`¢èìþg¢ä ôÊm¢ä Ë|r¢ä Ëd‰¢è(Œ¢ä4Ëè DËÜ‘¢è¸œ¢ä dË࣢èĸ¢âTùHŒËHÝ¢ä œË4ߢèç¢ä¼ËLè ÌËò¢ä ÜËðù¢ä ìËУ蘣ä Ì$£ä Ì '£ä ,Ìà.£ètM£ä LÌ\[£èDj£ä lÌø‰£è ‘£ä ŒÌH”£è ¨£ä ¬Ì¬¯£è˜ΣèÙ£äÜÌìhÛ£ä üÌôÞ£ä Íàé£èÀõ£ä ,Í„ø£ä <ÍT ¤ä LÍ@¤è,¤ä lÍ#¤ä |Íè.¤èÈM¤ä œÍ°Y¤ä ¬Í|[¤èT^¤ä ÌÍX e¤ä ÜÍ@ k¤è {¤âÅ $ý ÎP Ÿ¤ä Î< «¤ä $Î ²¤ä 4Îè ¸¤èÐ è TÎÐ Ťä dΜ פèt Þ¤è€ ô¤ä ”ÎØ ÿ¤è¸  ¥èH ¥ä ÄÎÈ ¥ä ÔΨ ¥è€ %¥ä ôÎx D¥ä ÏT W¥ä Ï0 Y¥è `¥èÈ f¥è€l¥ä TÏHn¥è y¥èøB¦ä„Ï˜è ”Ï„H¦èpT¦ä ´Ï$V¦ä ÄÏôZ¦ä ÔÏÜa¦èÄn¦â`0á øÏl§èD%§ä Ð +§ä(ÐØìŒì88§ä XР>§ä hЄI§è`[§ä ˆÐpb§èÔm§ä¨Ðè¸Ðဧä ÈÐä‹§èˆާä èи•§èd—§ä Ñ€§ä Ñh¨§ä (ÑD·§ä 8Ñ §èØè XÑÄͧè Ó§ä xÑLÖ§èاä ˜ÑÄß§è¬î§ä ¸Ñìõ§ä ÈÑtù§èT¨ä èÑp¨ä øÑD!¨è è ÒP#¨ä (Ò0:¨èO¨ä HÒT¨ä XÒô_¨ä hÒØp¨ä xÒ´‚¨è ˆ¨ä ˜ÒD–¨è0™¨ä ¸Òœ ¨è|¿¨ä ØÒdŨä èÒHѨè,ä¨ä Ó˜ç¨è|ê¨ä (ÓDñ¨è©ä HÓD©ä XÓ,A©èäC©ä xÓb©è¤m©ä ˜Ó4{©ä ¨Ó|†©ä ¸Ódˆ©è —©ä ØÓ´š©èt±©ä øÓ8 ´©ä Ô ·©ä Ôô½©èÔÑ©ä 8Ô| Þ©èX ç©è î©èt!ù©â`0á |Ô@" ªä ŒÔ"ªäœÔá"ªèÜ!eªè¤"kªä ÌÔˆ#nªèp#uªä ìÔ ${ªèô#}ªä ÕL$‚ªè8$Žªä ,Õø$“ªèÈ$–ªä LÕT%ªè,%Ÿªä lÕ &ªªä |Õø%ߪèà%öªèl&øªä ¬Õè& «è¼& «ä ÌÕ”'«ä ÜÕh'«è'!«ä üÕ4(&«ä Ö((«ä Öä'4«ä ,ÖÐ'@«è¸'E«ä LÖX)K«ä \Ö8)M«è )d«èp)p«äŒÖØ)ìÄ)ƒ«ä ¬ÖH*«ä ¼Ö,*‘«é*”«è`*›«ä ìÖh+¡«ä üÖ0+¬«ä ×+À«ä ×ð*ß«èÌ*þ«ä <×€,¬ä L× ,C¬ä \×ü+b¬èÜ+¬ä |×à,…¬è ,¬èh-ž¬ä ¬×4.¥¬ä ¼×.°¬ä Ì×ì-»¬èÈ-¬ä ì×°.ͬä ü×x.Ϭè\.á¬ä Ø/è¬èÔ.ú¬èˆ/=­ä LØü/C­èä/W­älØl0ìL0Z­ä ŒØ˜1ª­ä œØ`1¾­ä ¬ØL1Å­ä ¼Ø$1Ç­ä ÌØ1Ò­èì0Ø­èT2î­èp2®ä Ù03 ®ä Ùì2®èÄ2®èÌ3=®ä LÙ„4@®ä \Ùh4S®ä lÙ04Z®è 4`®ä ŒÙ¸4g®è¤4m®ä ¬Ù5p®èÔ4„®ä ÌÙì5®ä àÙÈ5•®âÈ"ä5Ä®å ÚÐ6Ë®ä Ú”6Ò®ä Úx6Õ®èX6Ü®ä @ÚD7ß®ä PÚ$7î®è 7ù®èp7¯ä€Úá8%¯èà71¯ä  Ú|8=¯ä °Ú`8M¯ä ÀÚD8d¯è$8ƒ¯ä àÚd9¢¯ä ðÚ9©¯èà8®¯èˆ9´¯ä Ûh:¶¯ä 0Û :º¯èì9½¯ä PÛÜ:ůä `ÛÄ:í¯è¨:ð¯ä €Ût;ö¯ä Û\;ù¯è<;á°ä ÀÛ<°âÜZ„+áà%áL  ÐÛ<?°èè;C°ä ðÛ@=J°å Ü(=S°ä Ü =U°ä Üœ<`°èx<b°ä @Ü|=m°èX=Œ°ä`Ü”>è pÜl>’°ä €ÜL>Ó°ä Ü>Þ°ä  Üè=ê°èÔ=õ°ä ÀÜð> ±èÈ>±ä àÜ@?%±è?'±å Ý|?)±è\?8±ä Ý$@è 0Ý@>±èÌ?è Pݸ@I±èX@T±ä pÝ$AZ±èAl±ä ÝÜAs±ä  Ý°Az±èŒA|±ä ÀÝôB‡±èÀBαä àÝxCÕ±è4Cç±è°Cì±ä ÞLDó±è,D÷±ä 0Þ¬D²ä @Þ˜D%²è`D'²ä `Þ˜EF²ä pÞ@EI²è(Eh²ètFw²èÄF~²ä ¸Þ@G€²â0[á8äGµ²ä ØÞ¨G¾²èdGÀ²ä øÞxHß²èèGá²ä ß\Ið²èèHò²ä8ßáJõ²ä HßäI³ä XßÀI3³èŒIìäJ9³èTK@³ä ˜ßÐLE³ä ¨ßœLH³ä ¸ßdLs³èDLz³ä Øß¤M³ä èßPM®³ä øß4M³èMÓ³ä àNÚ³èàMá³è,Nè³ä HàôNî³ä Xà¬N/´ä hàNN´èpNm´ä ˆàäOs´ètO~´ä ¨àTPŠ´ä ¸àÙä Ä4@Ùä Ô GÙèJÙä ôpLÙä ÔOÙè´ZÙä $ØaÙä 4ÄcÙè¤oÙä TÀsÙèˆvÙä tŒ|ÙèLƒÙä”á‡Ùä ¤à‹Ùä ´È’Ù訞Ùä Ôp³ÙèPºÙä øŒÅÙâü@á $ÙÙèÜÙä (ìãÙä 8ÐîÙä H¸ðÙèœ÷Ùä h”üÙä xhÚä ˆLÚè0 Úä ¨øÚèÄÚä ÈÜÚä Ø°(Úä è”FÚä øtQÚèLXÚä L^Úè,aÚä 8ÈcÚä H°fÚè”jÚä h„lÚä xTqÚä ˆyÚèä}Úä¨ììÔ€Úä È…Úèð¯Úè€ÉÚèäËÚä pÕÚä LÙÚè0ìÚä 8@ôÚèÛèÔè hlÛè$Ûä ˆÜ&Ûè¼-Ûä ¨8 LÛä ¸ SÛä È XÛèð[Ûä è„ gÛè\ sÛä !’Ûäá!•ÛèÜ  ÛèD!¦Ûä HÈ!¬Ûä X¬!·Ûèœ!¹Ûâ`0á |l"öÛä Œ4"Üè"è ¬8#Üè# Üä Ìl#*ÜèT#1Üä ì0$3Üä ü$5ÜèÜ#:Üä °$AÜä ,”$CÜèp$EÜä L4%]Üè%dÜä l,&rÜä | &}Üä ŒÔ%ˆÜä œ´%‹Üèœ%—Üä ¼ & Üèˆ&«Üä Ü '­Üèô&¸Üè€'ºÜèä'è ,(¾Üè(ÄÜä <()ÉÜä L)ÙÜèˆ(äÜä l*ëÜä ||)îÜèh)ñÜä ¨h*øÜâ,)á-áL%á ¸P*>Ýä È4*EÝè*LÝä èø*OÝä ø¸*ZÝè˜*aÝä h+gÝâd”jå8+¥Þä DP,ÍÞâ¨3ä,,ÞÞè|,çÞè ,ëÞä „4-íÞä ” -øÞè-úÞä ´È-ßä Ĭ-ßè€-ßä äH.ßä ô,.ßè. ßä ´.+ßè.-ßä 408ßä Dð/<ßä TÐ/Ußä d´/`ßä td/eßä „ /gßä”/è ¤ð.ßèØ.›ßèT0§ßâü@á Ø 1ðßä èð0÷ßä øØ0àèÀ0!àä°1è (”1#àä 8x1(àä H<1*àè,10àä h,22àä xø1FàèØ1Hàä ˜Ø2Nàä ¨°2Zà丘2è È€2^àèH2bàä è83sàä ø3~àèü2€àä ¬3‡àèŒ3‰àä 8¨4•àä Hl4 àä XP4¬àè4®àä x5´àèð4Éàä ˜H5Öàè$5Ùàä ¸l6çàè46éàä Ø7íàä èì6ùàèÄ6ááä x7áèd7áä (D8áè8áäH 8è X„8#áèl80áèä86áèh9Báä ˜Ð9Iáè¬9Láè,:Ráä ÈØ:Uá䨠:è è„:ZáèL:eáä T;háè;náä (Œ<yáä 8l<}áä LP<„áâp9ä4<—áä l=¢áèÈ<­áä Œœ=³áä œ€=¾áä ¬h=ÅáèT=Çáä Ì >Êáä Üd>Öáè@>õáä ü ?üáä ?ÿáä  ì>âè¸> âä< á@âä L À? âä \ ¤?+âä l €?7âè\?Nâä Œ HAUâä œ Ô@`âèœ@kâä ¼ ¨AŠâä Ì A•âètAœâäì ŒBè ü pB£âä !\B®âä !DB·âè BÄâä öä ø<ЦDöè´¦Söä =@¨^öä (=|§aöä 8=`§höèH§jöè|¨qöä h=¼©öä x=©›öä ˆ=ਡöèĨÎöä °=¨ªÐöâÅ „Ó À=<ªðöä Ð=$ªûöä à=ü©þöèà©÷âÅ äÔª÷ä >l«!÷è8«#÷ä 4>¬%÷ä L>¤«)÷â Ø.倫b÷ä l>˜­d÷èl­k÷ä Œ>®v÷ä œ>ä­x÷踭ƒ÷è4®‡÷ä Ì>Ô®‰÷踮¨÷ä ì>¸¯¯÷èD¯²÷ä ?`°´÷è<°À÷ä ,?±Ç÷ḛ̀Ò÷èd±Ù÷ä \? ²møä l?è±oøè̱Èøä Œ?<²úøè ²"ù耲-ùè@³5ùä Ì?|³CùèX³Jùä ì?ȳiù蘳tùè´€ùä @4µ…ùä ,@ä´‘ùä <@À´°ùä L@¨´¶ùè|´½ùè쵿ùä |@¼¶Äùè0¶ì@·Éùèà·Öùä ¼@ü¸Ûùä Ð@䏿ùâp9à@À¸óùä ð@œ¸úè|¸%úä A€º?úä A ºBúä 0Aø¹aúèä¹júâÌ™lŠXA<»­ú診ì`»Åúä ˆA¼#ûèÜ»-ûä ¨Ap¼3ûèP¼Dûèü¼Iûä ØAܽKûä èAœ½VûèL½\ûä BL¾bûè¾dûäàEˆz ä(Bäˆz dBÿìä€Bïá¬BèœBì ì8DèÈBì âØBæâCtèDèâpêtäØBä(CãáøC˜Rä8CC˜RtCÿèä°Cä CäãØBì âØB äÜCèÌCì âØBð Cê DXääDæXäðtä0DØBâdDèTDì ì€DøœDèTDì¸DøäDèÔDì ÿè¬IAäEäALEááÿåä=äÔ>=äì>=S=èdT= U=ä0U=HU=ä`U=äpU=áV=V=ôÜX=ìì^>¨_>ô,`>D`>px>@‘?äX‘?”¶?䬶?à¶?è̹?èà¼?€½?¬½?h¾?ä €¾?¨¾?tØ?èÙ?Œä?ÿàæ?è(æ?ôÌú?äÜú?ìú?äD @ìX@ô œ!@´!@8"@äT%@ä°;@èü;@„<@ät?@è ä?@ô?@ @@è øA Ah(Aì €(A(A)AäÐ6AäÐCAðô~A°AäÌAì,‚Aä´‚AìÄ‚AädƒA蜃Aè<„Aäø„AíAäA0Aä HA|A¤“A伓A謣AÈ£A¬·Ah¸Aä@ÈAìÄÈAäœÉAXÊAèpÊAŒÊAäHËAä`ËAáÌA¤àAáâA”âAä¤âAä ØãA\äAàäAä˜åA¨åAä B8Bä ,BÄBtBäŒêBè|íBôíBäÔÃCäDÊCäàÙCäÝCÈÞCð¼äCLèCä€êC ëCèTìCØìCè lýC”ýCÐýCìŒþC¼ÓDäÜÓDøÓDìÔDð$ÔDTÔDäpÔDèˆÔD ÔDìüÕDìåDðüåDô æDä<æD¤æDäÔæDŒðDÿàœðDŒóDDôD\ôD(õD õD°õDÈõDäàõD€öDöD¨öDH÷Dä”÷D¤÷DÌ÷D\øDì@þDXþDììþDüþDäÀE|E¬EÄEEtE„E°EäàEèüEEöÿÿô;öpõýÿí„: ä,öqõýÿí´)å)öùÿõ*öýÿí„: ä=öýÿítÛä(ö)ö;öùÿõ}þ€â$ƒØ¥ âH€üX‚ò0€, ôÄ] î{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ*öýÿí„: ä=öýÿítÛä(ö)ö;öùÿõ}öÌkØ¥ ”‚îÈä "îä°‚ìâÜ‚„: äÌ‚ì ìø‚… äÌ‚ðtÛäƒì äîtƒâ ‡x! ⤃üD†òŒƒ, ôövõýÿíˆ; äýÿítää;öùÿõýÿíhä(öýÿí„: ä,öýÿí… ä,öýÿífä,öýÿítää(ö)ö)ö;öùÿõ}öÌkx! €†î$ƒäL!î䜆ìâȆ„: 丆ì ì䆅 丆ðfå‡ê ⇠ä äîp‡âdhâ ‡üP‰òˆ‡, ôâø¿ü¨Áöö(ö!ö(öýÿí`0å<öýÿíÐ0å)ö)ö;öùÿõ}öäÁ°>TÚî¿ä8ïÌk0×ìÂâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÒ\×ô4ÚÿÿÿÿøDÚÿÿÿÿø´:äÒäÁ´:PÒîÄÒä¤ïälÒìâ¨Ò`0åˆÒê â˜Ò ä ðÐ0åˆÒòÓâ”Ô´:â,ÓüÒöö(öýÿíÐ0å<öýÿí`0å)ö;öùÿõ}þäÔæôTâüÔü¬Ööö(ö!ö(öýÿí`0åjõýÿíÐ0å)ö)ö;öùÿõ}öäÁôTèÖî”Ôädïä×ìâ@×`0å ×ê â0× ä ðÐ0å ×îØ;äl×äÁØ;¨×îØäðïäÄ×ìãØ`0åà×ê âð× ä ðÐ0åà×òlØâÄÒØ;â„Øül×öö(ö!ö(öýÿíÐ0å<öýÿí`0å)ö)ö;öùÿõ}ú°>ä¨ÁäôTä¬ÖäpÚìâ¬Ú`0åŒÚê âœÚ ä ðÐ0åŒÚêàÚØeô$fî ÄÜ,Û<»îâ\ÛòDÛØeô$fî:öýÿí„: ä(öýÿí`0å)ö,öùÿõýÿíô<ä(öýÿíÐ0å)öùÿõ{öùÿõ}úøÜ ºî â(ÝòÝØeô$fî:öýÿí„: ä(ö)ö,öùÿõýÿíô<ä(ö)öùÿõ{öùÿõ}öˆÞøø¹æ°Þø$ºæØÞøPºæáßøhºæ(ßø ºæü<»æä¨ßûôpä$/è ˆë ëœB+è|I+ÌkûäPßäÈßãáàßûäØßPßâ,àŒäðßâ¨ßŒä ÿèÀàÔ6 ä<à¨ßÔ6 xàÿèè´à¤àä€âPßæâ øDá ¸ äÐà¨ß ¸ áÿèè8á¤àä€âPßæîáuäTáâ¨ßuä ÿèÜááµä áâ¨ßáµä ÿè(âüÇ äìáâ¨ßüÇ ä ÿètâ6ä8ââ¨ß6ä ÿèÀâ„‹ä„ââ¨ß„‹ä ÿè ã ‡ äÐââ¨ß ‡ ä ÿèãÏ äã¨ßÏ Xãÿèè„ã¤àä€âPßæîäP2 ä ã¨ßP2 Üãÿèèä¤àä€âPßæî`äôcä$äâ¨ßôcä ÿè¬äÄQåpäâ¨ßÄQå ÿèøäœƒ ä¼äâ¨ßœƒ ä ÿèDå¬Cäåâ¨ß¬Cä ÿèåLÅ äTåâ¨ßLÅ ä ÿèÜåôä åâ¨ßôä ÿè(椘äìåâ¨ß¤˜ä ÿèÔæÌaå8æâ¨ßÌaátæ ÿèâÌkŒæäÜ䤿°ç tæÿÿÿÿÿÿÿÿã ¼æàttæðØ.tæè ç`ääæâ¨ß`ä ÿè¤ç0šä0ç¨ß0šlçÿèè˜ç¤àä€âPßæî(èœ{ ä´ç¨ßœ{ ðçÿèèè¤àä€âPßæî¬è ^ä8è¨ß ^tèÿèè è¤àä€âPßæî0éáä ¼è¨ßá øèÿèè$é¤àä€âPßæî|阸å@éâ¨ß˜¸å ÿèÈé\¯ äŒéâ¨ß\¯ ä ÿèêÄäØéâ¨ßÄä ÿè`ê`½ ä$êâ¨ß`½ ä ÿè¬êÌ7äpêâ¨ßÌ7ä ÿìÌä¼êâ¨ßÌøê ÿèâÌkëäØÈä(ëÐÄ øêÿÿÿÿÿÿÿÿã @ë@r øêì XëHÕøêê pëoøêîH»øêìö4ä”>èÌkH2äð<äX=ãáp=(°äh=ð<âÄ=¤÷ ä€=â8=¤÷ äKâêöh4ê˜RäÔ=8=˜R>ÿèäL>ä<>äãð<ì âð< äx>èh>ì âð<ð<>ñ¨>è4êþâ?(°ôápä¸@ö4äx@èÌk¾äÔ>äâ¨?¤÷ äd?â?¤÷ äKâêöh4ê˜Rä¸??˜Rô?ÿèä0@ä @äãÔ>ì âÔ> ä\@èL@ì âÔ>ð @ñŒ@è4ê?þãA(°ôápäœBö4ä\BèÌk€cä¸@ä Aãá8A(°ä0A¸@âŒA¤÷ äHAãA¤÷ äKâêöh4ê˜RäœAá A˜RØAÿèäBäBäã¸@ì â¸@ ä@Bè0Bì â¸@ðBñpBè4êþâäB(°ôápäö(öýÿídqä-öýÿíÔ*å)ö;öùÿõ}ö T”RKîâ¬Rö8„ð{öùÿõDõýÿíà ä<öýÿí8„ä>ö(öýÿídqä+öýÿíÔ*å)ö;öùÿõ}ö ˜UHTTJî â`Tö8„ð{öùÿõýÿídqäbõýÿíÔ*å;öùÿõDõ*öOõ;öùÿõ}ö WÌU”Iî âäUö8„ð{öùÿõýÿídqäaõýÿíÔ*å;öùÿõDõ*öOõ;öùÿõ}öXPWáIîâhWö8„ð{öùÿõDõýÿídqä;öùÿõ}úDX@Hîâ\Xö8„ð:öýÿídqä(öýÿíÔ*å)ö,öùÿõýÿí0tä(öýÿí8„ä(ö)ö)öùÿõ{öùÿõ}öZø@HæDZùIælZø”Iæ”ZøTJæ¼ZøKæäZø´Kæ [ødLæ4[ùMæüØMæä ´[ؼ|*äd*èpäôgè*äô*èø&*Ìkؼä\[äÔ[ ãáì[ؼää[\[â\¬Æ äü[\æ ìD\0©ä(\4\æ äæ *Ä%äT\`\æ â p\ø*äÈ\àè õæ8òé]èðôÌkàè äp\äè\ãåàè äø\p\â]øôUâ0]è â @]Äðä˜]ÌÁôápð h0h<ÂèäîÌkÌÁä@]ä¸]ãáÐ]ÌÁäÈ]@]âü]¬Æ äà]ì]æ ì^´ ä ^ê4^: ä(^êP^Ä äD^Næl^¤²ä`^ë!`DÀ,_|^˜]DÀ¸^ÿèää^ì€â@]æâ_@8å_ì âì] è:å_î4_˜]DÀp_ÿèä¬_äœ_ä€â@] æâ âì]æÈ_-åœ_ìä_´)ùÄ"åì]ì°`øxä`˜]øxL`ÿèäx`ì€â@]æâ”`@8å_î:å_ê`ahäÀ`˜]hü`ÿèä(aì€â@]æâDa@8å_î:å_ê,bÐu äpa˜]Ðu ¬aâÿèäØaì€â@]æâôa„Oäœ_êbxQäœ_î´)õÀbبäöÿÿô;öqõýÿí´)å)öùÿõýÿíDÀä(ö*öqõýÿí„Oä,ö*öqõýÿíxQä)ö;öùÿõ}öùÿõDõýÿí”,å;öùÿõ}ö 8áØÚÐbîCâðÚöøð{öùÿõ;õ(öýÿí´)åjõÿÿô)öùÿõDõÿÿô;öùÿõ!õýÿí¬Æ ä*öýÿí„+å=öýÿí-å;öùÿõýÿíÛ äýÿíä&å=öÿÿô;öùÿõ>õ(ö!öýÿíøxä(ö*öýÿí„+å,öýÿíÄ"å)ö)öùÿõ{öùÿõpõýÿíä&å;öùÿõ;õ(öýÿíä&åjõýÿí´)å)öùÿõDõÿÿô;öùÿõpõýÿí„+å;öùÿõ}öùÿõDõýÿí„+å;öùÿõ}ö ,åláõ(ö!öýÿíøxä(ö*öýÿí-å,öýÿíøä(ö)ö)ö)öùÿõ{öùÿõpõýÿí-å;öùÿõpõýÿí, ä;öùÿõ}öùÿõDõýÿí, ä;öùÿõ}ö ë`åpaîAâxåöøð{öùÿõ@õ(öýÿíÛ äýÿíä&å=öÿÿô;öýÿíä&å<öýÿí´)å;öpõýÿíä&å,öpõýÿí„Oä,öpõýÿíxQä)öùÿõ{öùÿõ;õ(öýÿíhä(ö*öýÿí„Oä,ö*öýÿíxQä)ö)öùÿõDõ-öÿÿìæ;öùÿõ;õ(öýÿíhä(ö*öýÿíxQä,ö*öýÿí„Oä)ö)öùÿõDõÿÿìæ;öùÿõ}öùÿõDõÿÿô;öùÿõ}ö ´ìÄëÀ`î âÜëöøð{öùÿõDõýÿí@8ä<öýÿí:ä;öùÿõ}ö Øíèì`î ãíöøð{öùÿõDõýÿí@8äjõýÿí:ä;öùÿõ}ú î|^îâ$îöøð{öùÿõýÿí@8ä=öýÿí:ä;öùÿõ}ö ïøà]æ4ïø|^æ\ïø`æ„ïøÀ`æ¬ïøpaæÔïøövõýÿíˆ; ä(ö)ö)ö;öùÿõ}öÌk°… @î¤þä4œïä\ì∄: äxì ð… äxôôâØ°… â üö„¢ñ{öùÿõ@õ(ö;öýÿí„: ä<öýÿí… ä;öpõýÿí„: ä)öùÿõýÿí°… ä(ö&ö*öýÿí„: ä)ö;öùÿõ}öÌk°… Xî¤ä|¥ïätìâ „: äì ì¼… äð 7äHŠô(â °… â@üPö, ð{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿí°… ä(ö&ö*öýÿí„: ä)ö;öùÿõ}öÌk°… ŒîØäè¤ïä¨ìâÔ„: äÄì ìð… äÄð 7äàŒô\â °… âtü| ö â ü° òx ˆFôð•áî{öùÿõDõ!ö(öýÿí`0å<öýÿíÐ0å)ö;öùÿõ}öÌk°>ì î äD£ïä ì⌠`0å$ ê â4  ä â ˆ•D h äX è ðâ| è äêÐ0å¨ ê ⸠ ä â ˆ•È Ü äX ìâ| ð@ âø°> ∠ü¨òX ˆFðp ð•áò°–áî{öùÿõDõ!ö(öýÿí`0å<öýÿíÐ0å)ö;öùÿõ}öÌk°>äîð 䤢ïåìâ„`0åê â, ä â ˆ•<`äPè ðâtè äêÐ0å ê â° ä â ˆ•ÀÔäPìâèè äîHâ´: âxüPò`ˆFôð•áî{öùÿõDõýÿíÐ0å<öýÿí`0å;öùÿõ}öÌk´:ŒîøäÌ¡ïä¨ìâ,`0åÄê âÔ ä â ˆ•ääøè ðâè äêÐ0åHê âX ä â ˆ•h|äøìâðàâP´: â(ýòøˆFðð•áò°–áî{öùÿõDõýÿíÐ0å<öýÿí`0å;öùÿõ}öÌk´:<î䜠ïäXìâÜ`0åtê â„ ä â ˆ•”¸ä¨è ðâÌè äêÐ0åøê â ä â ˆ•,ä¨ìâ@è äî â0Ø; âÐüðò¸ˆFôð•áî{öùÿõDõ!ö(öýÿíÐ0å<öýÿí`0å)ö;öùÿõ}öÌkØ;,îPä¼hïäHìâÌ`0ådê ât ä â ˆ•„¨ä˜è ðâ¼è äêÐ0åèê âø ä â ˆ•ä˜ìâ¼ð€â8Ø; âÈüèò˜ˆFð°ð•áò°–áî{öùÿõDõ!ö(öýÿíÐ0å<öýÿí`0å)ö;öùÿõ}öÌkØ;$î0ä´gïä@ìâÄ`0å\ê âl ä â ˆ•| äè ðâ´è äêÐ0åàê âð ä ∕áäìâ(è äîˆâ <â¸üPò ˆFôð•áî{öùÿõDõýÿí`0å.öýÿí“ ä(ö)ö<öýÿíÐ0å.öýÿí“ ä(ö)ö;öùÿõ}öÌk <Œî8åpïä¨ìâ,`0åÄê âÔ ä â ˆ•ääøè ðâè äêÐ0åHê âX ä â ˆ•h|äøìâðàâ" <â(üÀ òøˆFðð•áò°–áî{öùÿõDõýÿí`0å.öýÿí“ ä(ö)ö<öýÿíÐ0å.öýÿí“ ä(ö)ö;öùÿõ}öÌk <ü îäŒoïä!ìâœ!`0å4!ê âD! ä â ˆ•T!x!äh!è ðâŒ!è äêÐ0å¸!ê âÈ! ä â ˆ•Ø!ì!äh!ìã"è äî`"âð$ôT â"ü°#òx"ˆFôð•áî{öùÿõDõ!ö(öýÿí`0åjõýÿíÐ0å)ö;öùÿõ}öÌkôTì#î"ä oïä$ìâŒ$`0å$$ê â4$ ä â ˆ•D$h$äX$è ðâ|$è äêÐ0å¨$ê â¸$ ä â ˆ•È$Ü$äX$ìâ|$ð@%âø'ôT âˆ%ü¨&òX%ˆFðp%ð•áò°–áî{öùÿõDõ!ö(öýÿí`0åjõýÿíÐ0å)ö;öùÿõ}öÌkôTä&îð$äÄnïå'ìâ„'`0å'ê â,' ä â ˆ•<'`'äP'è ðât'è äêÐ0å 'ê â°' ä â ˆ•À'Ô'äP'ìâè'è äîH(âP+˜Uâx(ü*ò`(ˆFôð•áî{öùÿõDõýÿí`0å.öýÿí“ ä(ö)öjõýÿíÐ0å.öýÿí“ ä(ö)ö;öùÿõ}öÌk˜UL*îø'äÔmïäh*ìâì*`0å„*ê â”* ä â ˆ•¤*È*ä¸*è ðâÜ*è äêÐ0å+ê â+ ä â ˆ•(+<+ä¸*ìâÜ*ð +âÐ.˜Uâè+ü€-ò¸+ˆFðÐ+ð•áò°–áî{öùÿõDõýÿí`0å.öýÿí“ ä(ö)öjõýÿíÐ0å.öýÿí“ ä(ö)ö;öùÿõ}öÌk˜U¼-îP+äpmïäØ-ìâ\.`0åô-ê â. ä â ˆ•.8.ä(.è ðâL.è äêÐ0åx.ê âˆ. ä â ˆ•˜.¬.ä(.ìâÀ.è äî /âð2l6âh/ü1ò8/ˆFðP/ð•áò°–áî{öùÿõDõ õýÿíˆFävõýÿí€×ä(öýÿí`0å.öýÿí“ ä(ö)ö-öýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌkl6Ì1îÐ.äPmïä2äè1äâ â ø1€× ì|2`0å$2ê â42 ä â ˆ•D2X2äø1ìâl2è äêÐ0å˜2ê â¨2 ä â ˆ•¸2Ì2äø1ìâà2è äî@3â€6ì9âp3ü5òX3ˆFô¨Uî{öùÿõDõýÿí„ å<öýÿíˆFä,öýÿí¨Uä>ö(öýÿíÐ0å)öaõýÿí´)å;öùÿõ}öÌkì9D5îð2äülïä¸5ä`5äâ â ˆ•p5”5ä„5è ðâ¨5è äæ6´)åÔ5ì â ä5€× â ˆ•ô56ä„5ìâ¨5ìÐ0å86ê âH6 ä â ˆ•X6l6ä„5ìâ¨5躕äÐ6âØ8ôO âè6üÀ7öhuâì:öýÿí@¤ä(öýÿíä&å.öýÿí@¤ä)ö{ö}öà•ôOü7ë€6ähyïä(8ì∕ìT8|W äD8ì ∕èä&åp8ê â€8 ä â ˆ•8´8ä¤8è ðâÈ8è æì(9â¬x)°> â@9ü`:ö ‰ ð{öùÿõDõ!ö(öýÿí`0å<öýÿíÐ0å)ö;öùÿõ}öÌk°>œ:îØ8ä xïä¸:ìâ\x)`0åÔ:ê âä: ä â ô:8x)äL;Tp èDèpäTWèÐDäèDèR ÌkTp äô:äl;ãá„;Tp ä|;ô:âÀ;\ ä”; ;æ â °;\  ìü; 5 äÐ;Ü;æ â ì; 5 ìL<ˆ; ä <<æ â (<ˆ; âT–8<èÜ;èœ< |ä\<h<æ â x< | âT–ˆ<è ;èì<€×ä¬<¸<æ â È<€× âT–Ø<èÜ;è=€ø äü<ê$=Øä=h<æô=ôOä4=L;ôOp=Pÿèäœ=ì€âô:êÈ=|W ä¸=ì âô:èä&åä=ê âÜ; äˆ>P7ä>L;P7@>ÿèäl>äh<䀀âô:î|W ä¸=ê"Ô?ì6,?˜>L;ì6Ô>ÿèä?å?ä€âô:ê âô: è|W ä¸=ð4?L;ì6p?ÿèäœ?äô:ä€âô:ê¸?|W ä¸=ð 7ô"A|6h@ä?L;|6 @ÿèäL@å?ä€âô:î|W ä¸=ðp@L;|6¬@ÿèäØ@äô:ä€âô:êô@|W ä¸=ð 7ôÀACä AL;C\AÿèäˆAå?ä€âô:ê¤A|W ä¸=ð´)å¸<ìpBì9äÐAL;ì9 Bÿèä8Bäô:䀀âô:êTB|W ä¸=î´)å¸<ì CHBä€BL;HB¼BÿèäèBå?ä€âô: êC|W ä¸=ð´)å¸<ìÐCl6ä0CL;l6lCÿèä˜Cäô:䀀âô: ê´C|W ä¸=î´)å¸<ì€D˜5äàCL;˜5DÿèäHDäh<䀀âô: êdD|W ä¸=î´)å¸<ìÀD$ÙäDá ¨D$ÙÜ;èål-ì;ìl-ä¨Dä ‰ ðÜEäàCîâEò{öDõýÿí$Ùä[öýÿí´)å]ö;ö}öGä0Cî âFò{öDõýÿíTp ä(ö*öOõ)öbõýÿí´)å;ö}öî âtOò{öpõýÿí$Ùä;öDõ*öOõ;ö}ö@Qä>îâ€Pò{öDõýÿíl-ä(öýÿí$Ùä)ö;ö}þ4=îâtQò:öýÿí$Ùä(öýÿíä&å)ö{ö}öDRø”;ælRøÐ;æ”Rø <æ¼Rø\<æäRø¬<æ Sø=æ4Sø4=æ\Sø>æ„Sø˜>æ¬Sø4?æÔSøä?æüSøp@æ$Tø AæLTøÐAætTø€BæœTø0Cæ\UøÄTæôTèl6HUäöäUä¸<ê,Ué?÷?òì;è„UøàCæDVø¬UæÜUè˜U0VäöäøUòVé?÷?òì;èWølVæœVè <ðVäöä¸VòÔVé?÷?òì;è,WøDæü¨Dæä¬W´qôápäìWXä x)öÌW´qäTWäx)ãáÌk|…äìWä`w) ãáäÌW|…ôpäÀcèDXätXè´a\X8ƒô|Iîà[ä¨XîâZòÌW|Œ äXÿèäTYäY䀀âìWê â  Y | âT–0YèDYè ì€Y|W äpYê âìWä¬YL%åœYì äê 7äÈYì âTWØYæìYè4ÿê{öýÿíˆ äýÿíÄä=ö*öýÿíL%å;öDõ*ö(öýÿíä*ö)ö(ö&öýÿíÄä)ö;ö}öp^ä\îâ ]òÌW|Œ P\ÿèä|\äY䀀âìWê˜\|W äpYê´\L%åœYð 7äÐ\ì âTWà\æô\è4êþ{öDõ*ö(öýÿíä*ö)ö(ö&ö*öýÿíL%å)ö;ö}þ¤^îâD_òÌW>à^ÿèä _äY䀀âìWê(_|W äpYîL%åœYì{öDõýÿí|Œ ä(öýÿíL%å,öýÿí´qä<öýÿí ûävõýÿí¤lä<öõ(ö*öýÿíL%å)ö>övõýÿífä>ö(ö)ö)ö;ö}öèaøÜaæDYæbøbæœYæDbøTWè¬bølbæxbæ â ˆbØ âT–˜bèœYècøÔbæàbæ â ðb | âT–ácèœYèHcøäed>DeÿèäpeäÄd䀀âÀcêœe|W äŒeê âÀcèL%å¸eê â˜d äàe8ƒô|Iöeîâ,fò{öDõ*öýÿíL%å;ö}öäfø`dæ gøŒdæ4gø¸dæüeæä´gðpè±èpä$¶&hèä´²è,µÔgðpä\gäL°ãáÌkäŠäôgä\¯ ãáäÔgäŠèLhèpä$—èÌhä0iè P åÊ dhè âthæ â p\„h¨hä˜hè ðâ¼hè äæähøôUâühè â@] iè iè ì ´mdi”iî$âTjò|iøôUîÔgÜzÐiÿèäüi쀀âôgê(j|W äjê âôgèP#åDjê âôg ä{öùÿõDõXõ<öõ>ö(ö!ö(öXõ<öõ>ö(öýÿíÊ äkõÿÿô)ö^öXõ<öõ>ö(öýÿíP#å.öýÿíÊ äkõÿÿô)ö)ö)ö;öùÿõ}ö hsèmnî2â¸nónøôUîÔgì6Tnÿèä€nä\gä€âôgêœn|W äjð 7ô{öùÿõýÿíðpäýÿíüä(öýÿíUävõýÿí¨°ä(öýÿíÊ ärõýÿíø÷ ä(ö)ö)ö,öýÿíÊ ä)ö;öùÿõ;õ(öýÿíUävõýÿíxä(öýÿíÊ ärõýÿí(ü ä(ö)ö,öýÿíUävõýÿíœ_ ä(ö)ö)ö)öùÿõýÿíÊ ä=öÿÿô;öùÿõDõýÿíüä;öùÿõ}ö xœsÌsî(âPtò´søôUîÔgì6tÿèä4täDjä€âôgî|W äjì{öùÿõýÿíÊ ärõýÿíø÷ ä(ö)ö;öùÿõ;õ(öýÿíUävõýÿíxä(öýÿíÊ ärõýÿí(ü ä(ö)ö,öýÿíUävõýÿíœ_ ä(ö)ö)ö)öùÿõýÿíÊ ä=öÿÿô;öùÿõDõ*öOõ;öùÿõ}ö xzDxtxîâøxò\xøôUîÔgP7°xÿèäÜxä˜h䀀âôgî|W äjê{öùÿõDõýÿíUävõýÿí¨°ä(öýÿíÊ ärõýÿí(ü ä(ö)ö)ö;öùÿõ}ö X¬zÜzî(â˜{òÄzøôUîÔgôO{ÿèäD{Œ{è€âôgê`{|W äjð„+å|{ê â\g ð:öýÿíÊ ä(öýÿí„+å.öýÿíÊ ä)öùÿõ{öùÿõ;õ(öýÿíÊ äkõÿÿôiõýÿíUävõýÿíxä(öýÿíÊ ärõýÿí(ü ä(ö)ö,öýÿíUävõýÿíœ_ ä(ö)ö)ö)öùÿõýÿíÊ ä=öÿÿô;öùÿõ}ö øƒŒ¼î&âh€ò¤øôUîÔgôOøÿèä$€\€è€âôgê@€|W äjð-ådhø:öýÿíÊ ä(öýÿí-å)öùÿõ{öùÿõ;õ(öýÿíÊ äkõÿÿôiõýÿíUävõýÿíxä(öýÿíÊ ärõýÿí(ü ä(ö)ö,öýÿíUävõýÿíœ_ ä(ö)ö)ö)öùÿõýÿíÊ ä=öÿÿô;öùÿõ}ö „‹,„\„î*┇òD„øôUîÔgôO˜„ÿèäÄ„ˆ‡è€âôgêà„|W äjð-åü„ì â … ä â …`‡ät…° õæp\謅†ôÌk° ä…ä”…ãå° ä¤……âÄ…øôUâÜ…è â@]ì…é†è ìäX†° õ踆N…ä†êÌkä†äx†ãå° äˆ††â¤†ôâ0hè凰 õìN…ä8‡êÌktbä¸†ä ‡ãå° ä0‡¸†âL‡ô⨓èt‡ä˜hìâ¼hô:öýÿíÊ ä(öýÿí-å.öýÿ툇ä(ö)ö)öùÿõ{öùÿõ;õ(öýÿíÊ äkõÿÿôiõýÿíUävõýÿíxä(öýÿíÊ ärõýÿí(ü ä(ö)ö,öýÿíUävõýÿíœ_ ä(ö)ö)ö)öùÿõýÿíÊ ä=öÿÿô;öùÿõ}ú¸‹è‹î âxŒòЋøôUîÔgôO$ŒÿèäPŒlŒè€âôgî|W äjø:öýÿíÊ ä(öÿÿô)öùÿõ{öùÿõ}öp”øxæ ⠈̓äà¤ÌôápäT–èôŽŒì“âÌk¤ÌäˆåŽãᎤÌ䎈âDŽ |ä(Ž4Žæ äæpŽ€×äTŽ`Žæ äæœŽ€ø 䀎ŒŽæ äæÈŽØä¬Ž¸Žæ äêˆ; äØŽäŽæ ì ð^ð$övõýÿíˆ; ä(ö)ö)ö;öùÿõ}öÌk(è°îü äð]ïääÌäâ â Ü€× âT–ìéè ì,„: åð… åô˜âxàÊ â°üˆö„¢ñ{öùÿõDõýÿí… ä-öýÿí„: ä;öùÿõ}öÌkàÊ ÄîHät]ïä$äàäâ â ð€× âT–áèè ì@„: äì\… äð 7äHŠôÈãàÊ "âàüöôã ð{öùÿõ õýÿíÌLä<öýÿíôã ä>övõýÿí€×äýÿíüä=öÿÿô;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõpõýÿíüä;öùÿõDõýÿíüä;öùÿõ}öÌkàÊ LîxäÐ\ïä¬ähäâ â x€× âT–ˆèœè ìÈ„: äœìä… äœð 7ä,ŽôPâ8,‚â€üxòhôã ôÔfî{öùÿõýÿí´ ä(öýÿíä&å,öýÿí´)å,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}öÌk,‚´ïäl\ïäÐìâ ä&åìì âü ä ð´)å(ì äîˆâT´ â¸üxò „¢õÔfî{öùÿõýÿíä&åaõýÿí´)å;öùÿõ}öÌk´ ´î8ä¬[ïäÐìâ ä&åìì âü ä ì8´)å(ì äê 7äHŠô¤â  ´ *âÔüÄò¼üT ôÔfî{öùÿõ;õ(öýÿí´)åmõÿÿô)öùÿõ@õ(ö;öýÿí´)å>öÿÿô;öqõýÿí´)å)öùÿõpõýÿíä&å;öùÿõ<õùÿõ@õ(ö;öýÿí´)å<öÿÿô;öpõýÿí´)å)öùÿõqõýÿíä&å;öùÿõ}ö Ìk´ á îTäÐ"ïä ìâX ä&å8 ì âH  ä ì„ ´)åt ì äê 7䔋ôð â¬#´ â !üÐ"ò!ôã ôÔfî{öùÿõ@õ(ö;öýÿí´)å>öÿÿô;öqõýÿí´)å)öùÿõpõýÿíä&å;öùÿõ}öÌk´ #î  äD"ïä(#ìâd#ä&åD#ì âT# ä ì#´)å€#ì äê 7ä,Žôü#â¼nˆp âD$üL%ò$"<ä0>çlŸ`±äÄ<ä,=ãáD=Ü ä<=Ä<â`=Å äT=î˜Räp= =˜R¬=ÿèäè=äØ=äãÄ<ì âÄ< ä>è>ì âÄ<ðØ=þâŒ>Ü ôápäÄ?"<ä°?çlŸKäD>ä¬>ãáÄ>Ü ä¼>D>âà>Å äÔ>î˜Räð>Œ>˜R,?ÿèäh?äX?äãD>ì âD> ä”?è„?ì âD>ðX?þâ @Ü ôápäDA"<ä0AçlŸTNäÄ?ä,@ãáD@Ü ä<@Ä?â`@Å äT@î˜Räp@ @˜R¬@ÿèäè@äØ@äãÄ?ì âÄ? äAèAì âÄ?ðØ@þâŒAÜ ôápäÄB"<ä°BçlŸ€£äDAä¬AãáÄAÜ ä¼ADAâàAÅ äÔAî˜RäðAŒA˜R,BÿèähBäXBäãDAì âDA ä”Bè„Bì âDAðXBþâ CÜ ôápäDD"<ä0DçlŸhLäÄBä,CãáDCÜ ä ä¸®ä ¯ãá8¯¸Õ ä0¯¸®â„¯fäH¯ã¯fä îü˜Rä”¯á ¯˜RЯÿèä °äü¯ä㸮ì ⸮ ä8°è(°ì ⸮ðü¯ÿæªèIꨰfôâ â ¸°\³ä±¸Öôápädªè”±¬±òÜ(¸Ö丰ä0±ãáH±¸Öä@±¸°æfäX±â±fä ÿìøé|=|>øé¨=ø=øIêÔ=fôâ â°ýä=èÈ)èé$>P>øIêÈ)øâ4êþé¨>üIêÔ>fôâ âØÔä>èÈ)èIê$?fôâ â Û4?èÈ)è¬?á\?èIêˆ?fôâ â€Ì˜?èÈ)ìáÀ?èIêì?fôâ âØÔü?èÈ)è"ÈBôO´@ @H)ôO\@ÿèäˆ@äœBä€âð(î|W ä¤@ì âð(äxA¼@H)ôOø@ÿèä$AäœBä€âð(ê@A|W ä¤@ì\A`0åô)ðÐ0å¨-ì B€AH)ôO¼APÿèäèAäœBä€âð(êB|W ä¤@ð`0åô)ð(BH)ôOdBPÿèäBäœBä€âð(ê¬B|W ä¤@ðÐ0å¨-ì"èC„: \CØBH)„: Cÿèä@Cä\1ä€âð(î|W ä¤@ðdCH)„:  CÿèäÌCäÄ8䀀âð(î|W ä¤@ê"Eô<|DøCH)ô<4Dÿèä`Dä5ä€âð(î|W ä¤@ð„DH)ô<ÀDÿèäìDäx<䀀âð(î|W ä¤@êÈEˆpäEH)ˆpTEÿèä€Eì€âð( êœE|W ä¤@ðÐ0å¸Eì âð( èœcäØEåœcœ)èFØeô$fî4HäEîâTFò{öùÿõYõvõýÿíx†ävõýÿíˆpä;öùÿõýÿíˆpä(öýÿíœcä,öýÿíÐ0å.öýÿíœcä)ö;öùÿõ}öøHä„DîâhHò{öDõ*öOõ;ö}ö¼IäøCîâ,Iò{öDõ*öOõ;ö}öhJädCîâðIò{öDõýÿíœcä;ö}öKäØBîâœJò{öDõýÿíœcä;ö}öðKä(BîâHKò:öýÿí|kä(öýÿíÐ0å)ö{ö}öÌLä€Aîâ$Lò:öýÿíœcä(öýÿí`0å)ö{ö}ö Nä¼@î ãMò:öýÿíœcä(öýÿí`0å)ö,öýÿí|kä(öýÿíÐ0å)ö{ö}þ @îâTNò{ö}ö¬NøÈ)äÔNø)æüNø¼)æ$Oøè)æLOøœ-ætOøP1æœOø5æÄOø¸8æìOøl<æPø @æö(öýÿí`0å,öýÿíÐ0å)ö;öùÿõ}öÌk„J üî¨ä89ïäpääâ â X¹(Lä<è ðâ`è äæŒ`0å<ðÐ0å`ôøâØ;â(üØòØeô$fî{öùÿõDõXõ<öõ>ö(ö!ö(öýÿíÐ0å<öýÿí`0å)ö)ö;öùÿõ}öÌkØ;î¨ä„8ïä0ìâ´`0åLê â\ ä â X¹lä€è ðâ¤è äêÐ0åÐê âà ä â X¹ðä€ìâ¤ðh∠°>â˜üH ò€Øeô$fî{öùÿõDõXõ<öõ>ö(ö!ö(öýÿí`0å<öýÿíÐ0å)ö)ö;öùÿõ}öÌk°>„ îä48ïä  ìâ$ `0å¼ ê âÌ  ä âX¹Ü á äð è ðâ è äêÐ0å@ ê âP  ä â X¹` t äð ìâ ðØ â ´: â üà òð Øeô$fî{öùÿõDõýÿíÐ0å<öýÿí`0å;öùÿõ}öÌk´: îˆ ät7ïä8 ìâ¼ `0åT ê âd  ä â X¹t ˜ äˆ è ð⬠è äêÐ0åØ ê âè  ä â X¹ø  äˆ ì⬠ðp âôTâ  üPòˆ Øeô$fî{öùÿõDõXõ<öõ>ö(ö!ö(öýÿí`0åjõýÿíÐ0å)ö)ö;öùÿõ}öÌkôTŒî äïä¨ìâ,`0åÄê âÔ ä â X¹ääøè ðâè äêÐ0åHê âX ä â X¹h|äøìâðàâ( <)âüèòøØeô$fî{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí„: ä<öýÿíÐ0å.öýÿí„: ähõùÿõ(ö!ö(öýÿíÐ0å.öýÿí„: ä<öýÿí`0å.öýÿí„: ä)öiõýÿí`0å.öýÿíô<ä<öýÿíÐ0å.öýÿíô<ä)ö)ö;öùÿõ}öÌk <$îäðä@ìâÄ`0å\ê âl ä â X¹| äè ðâ´è äêÐ0åàê âð ä âX¹áäìâ´ðxâH½˜Uâ¨ü0òØeô$fî{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí„: äjõýÿíÐ0å.öýÿí„: äiõýÿí`0å.öýÿíô<äjõýÿíÐ0å.öýÿíô<ä)ö;öùÿõ}öÌk˜Ulî(äXïäˆìâ `0å¤ê â´ ä â X¹ÄèäØè ðâüè äêÐ0å(ê â8 ä â X¹H\äØìâüèD„: ä€ä„: ¼äYÿå â Ì„: â \úÜðä ßèâ0ßìáèIê€ßfôâô<äTäô<äYÿå â  ô< â \ú°Ää ßèØâ0ßìáìèIê€ßfôæˆpä(”Þˆpdÿèäì€â<Þê¬|W ädøð`0åÈì â<Þ äðØeô$fîä(î â<ò{öýÿí“ ävõýÿíˆpä(öýÿí`0å)ö;ö}öðäèùîâHò:öýÿí“ ä(öýÿíÐ0å)ö{ö}öÌä@ùîâ$ò:öýÿí“ ä(öýÿí`0å)ö{ö}öØ ä|øî ã ò:öýÿí“ ä(öýÿí`0å,öýÿíÐ0å)ö{ö}þà÷îâ !ò{ö}ö¼#ød!ä â \út!ˆ!ä ßèœ!â0ßìá°!èIêÜ!fôâ â˜âì!á"ä ßè"â0ßèô"á("èIêT"fôâ â 4‹d"¬"äx"è â ˆ"Š⤯˜"è ßìâÀ"è â Ð"Š⤯à"è0ßèX#á#èIê4#fôâ â°äD#è ßìál#èIê˜#fôâ â°ä¨#è0ßèä#øÜÞæ $øpáæ4$øŒáæ\$ø¨áæ„$ø\忬$øéæÔ$øÄìæü$øxðæ$%ø,ôæL%øà÷æt%ø|øæœ%ø@ùæÄ%øèùæt&øì%æ â ü%„: â \ú & &ä ßè4&â0ßìáH&èIê€ßfôâ$'øœ&æ â ¬&ô< â \ú¼&Ð&ä ßèä&â0ßìáø&èIê€ßfôþ(æp'ä`'è äêâ¬Ûè"\ôOp(”'8&ôOÐ'Pÿèäü'ì€âà%ê((|W ä(ì âà%è„+áD(¬Ûì4ÿê|)x(8&ôO´(ÿèäà(ì€âà%êü(|W ä(ì)„+å¬Ûì4)ÀÑ äPÏð Œ0P)`'ìIî`'ôâ4*„)8&ôOÀ)ÿèäì)ì€âà%ê*|W ä(ð`0å$*ì âà% ä<<*8&ôOx*ì,ä (ïä¤*ìâà%ìÀ*|W ä(ð`0åÜ*ì âì* ä â à%ü* +ä+è æäì+â4+è â D+, â T+Ø+ â d+|\ â t+ | â Ø&„+˜+äÀËìá¬+èIêÌfôê+ìâ`'è&äP,â /ôOâh,ü<*öÔ?ãì:öýÿíì;å(öýÿíô ä(öýÿí`0å.öýÿí0º ä(ö)ö)ö,öýÿíŒ ä(öýÿí`0å.öýÿí°ú ä(ö)ö,öýÿí`0å.öýÿíX™ ä(ö)ö)ö)ö{ö}ö¢/äô8â<9ôOâ 9ü¼2òäÈ/Vôápä¬6èl4ä„4è”5lŸVäp/äè/ ãâ0Väø/p/â0|rä0ê80€×ä,0êt0€ø äH0T0æ âd0æ ì0Øä „0T0ä¼0Øä 0¬0æ âd0 äØ0ÔÏä Ì0¬0ä2|\ äè0ð0âäH1|\ ôápäp/¢/äÐ1ðè1âÈ/|\ äð0äh1ãá€1|\ äx1ð0æ,ä1œ1æ âp/¬1èÀ1è æèÔ?ãÿè1æ$ 3ôO´2 2È/ôO\2ÿèäˆ2ì€âp/î|W ä¤2ì âp/è¼2È/ôOø2ë /äx'ïä$3ìâp/ì@3|W ä¤2ð 7ä\3ê âl3 ä âp/|3è3è æèÔ ä°3È/Ô ì3ÿèä4ì€âp/ê44|W ä¤2ìP4„+åT0ð 7øäœ=èH@á$>èéP>ø?øé|>|?øé¨>ø>øIêÔ>fôâ â°ýä>èœ=èé$?P?øIêœ=øâ4êþé¨?üIêÔ?fôâ âØÔä?èœ=èIê$@fôâ â Û4@èœ=è¬@á\@èIêˆ@fôâ â€Ì˜@èœ=ìáÀ@èIêì@fôâ âØÔü@èœ=èÄDŒä A,Aæ â övõýÿí,ä,öýÿíè ä>ö(öýÿíX™ ä(ö)ö,öùÿõýÿí0º ä(ö)ö,öùÿõýÿí°ú ä(ö)ö)ö;ö}ú$m8&X5`më¼näÀ)ïä näŒmäRâà%ì â à%œmÀmä°mè æäŒnâÔmè â äm, â ômxn â n|\ â n | â Ø&$n8näÀËìáLnèIêÌfôê°mìâ`'ì|W ä(ì&ä oâliX5"â$oü$möÔ?ãì{öDõýÿíPä<öýÿíÔ?å,ö õýÿíô ävõýÿí|\ ä<öýÿíÔ?å>övõýÿí,ä,öýÿíè ä>ö(öýÿíX™ ä(ö)ö,öùÿõýÿí0º ä(ö)ö,öýÿí°ú ä(ö)ö)ö;ö}ö"ts0º èrdr8&0º  rÿèäÌräÓä€âà%î|W ä(ððr8&0º ,sÿèäXsä¸Ö䀀âà%î|W ä(êt°ú ä„s8&°ú Àsÿèäüsäìsä€âà%ê â`' è|W ä(ì¬t4Öä(t8&4ÖdtÿèätälÚ䀀âà%î|W ä(ê\uˆpä¼t8&ˆpøtÿèä$uì€âà%ê@u|W ä(ðÐ0å$*ðì;åluåì;á„uè â <Þ”u¨uäÀËìâ¼uè â <ÞÌuàuä`'ìâ¬Ûè vö(öýÿíì;å.öýÿíô<ä(ö)ö.öýÿí„: ä(ö)ö)ö;ö}ö0ä„sî âø}ò{öDõýÿíì;å.öýÿíô<ä(ö)ö.öýÿí„: ä(ö)ö;ö}ö<€äðrî âdò{öDõýÿíì;å.öýÿí„: ä(ö)ö;ö}öHädrî âp€ò{öDõýÿíì;å.öýÿí„: ä(ö)ö;ö}ötƒäaîâ|ò{öýÿíx{ä(öýÿí”,å.öýÿíX™ ä(ö)ö,öýÿí”,å.öýÿí°ú ä(ö)ö)ö;öDõ*öOõ;ö}ö†ä <î⨃ò:öýÿíì;å(öýÿí”,å.öýÿí0º ä(ö)ö,öýÿíŒ ä(öýÿí”,å.öýÿí°ú ä(ö)ö,öýÿí”,å.öýÿíX™ ä(ö)ö)ö)ö{ö}ödŒägîAâL†ò{öùÿõ;õ(öýÿíßä(ö)ökõýÿí„+å)öùÿõ{öùÿõ;õ(öýÿíßä(ö)ö)öùÿõýÿí0º ä(ö)ö.öýÿíÔ ä(öýÿíßä(ö)ö,öýÿí4Öä(ö)ö)ö;öùÿõýÿíì;å.öýÿíô<ä(ö)ö.öýÿíô<ä(ö)ö=öýÿí„+å;öùÿõýÿíì;å.öýÿíô<ä(ö)ö.öýÿí„: ä(ö)ö=öýÿí¤ ä;öùÿõ}öùÿõ}öx‘ä4fî4☌ò{öùÿõ;õ(öýÿíßä(ö)ökõýÿí„+å)öùÿõ{öùÿõ;õ(öýÿíßä(ö)ö)öùÿõýÿí0º ä(ö)ö.öýÿíÔ ä(öýÿíßä(ö)ö,öýÿí4Öä(ö)ö)ö;öùÿõýÿíì;å.öýÿíô<ä(ö)ö.öýÿíô<ä(ö)ö=öýÿí„+å;öùÿõ}öùÿõ}öì“ä eî⬑ò{öýÿí€ø äýÿí„+å=öýÿíßä(ö)ö;öýÿíì;å.öýÿíô<ä(ö)ö.öýÿíô<ä(ö)ö=öÿÿô;öDõýÿí„+å;ö}öX•ä eî â ”ò{öDõýÿíì;å.öýÿíô<ä(ö)ö.öýÿíô<ä(ö)ö;ö}ö¬–ä\dî ⌕ò{öDõ*ö(öýÿíßä(ö)ö+öýÿí´)å)ö;ö}÷˜ä´cî âà–ò{öDõ*ö(öýÿíßä(ö)ö+öýÿí´)å)ö;ö}öܘä cîâ4˜ò{öDõýÿíßä(ö)ö;ö}öЙäŒbîâ™ò{öDõ*öýÿíßä(ö)ö;ö}öü›ä¼\îâšò{öýÿíx{ä(öýÿí`0å.öýÿíX™ ä(ö)ö,öýÿí`0å.öýÿí°ú ä(ö)ö)ö;öDõ*öOõ;ö}öˆžä(\îâ0œò{ö;õ(öýÿíßä(ö)ökõÿÿô)öýÿí0º ä(ö)ö.öýÿíÔ ä(öýÿíßä(ö)ö,öýÿí4Öä(ö)ö)ö;ö}ö$ ä„)î⼞ò:öýÿíì;å(öýÿí`0å.öýÿíì;å)ö{öýÿí`0å.öýÿíX™ ä(ö)ö;ö}ö¨¡äx(îâX ò:öýÿíì;å(öýÿíÀÑ ä,öýÿíŒ ä(öýÿíŒ0ä,öýÿí„+å)ö)ö{ö}þ”'îâÜ¡ò:öýÿíì;å(öýÿíô ä(ö)ö,öýÿíŒ ä(öýÿíè ä(ö)ö,öýÿí„+å)ö)ö{ö}ö´£ø€&æÜ£ø¬&æ¤øDÏæ,¤øøÒæT¤ø¬Öæ|¤ø`Úæ¤¤ùÛæ̤ø Ûæô¤ø@Üæ¥øàÜæD¥ø€Ýæl¥ø Þæ”¥ø”'æ¼¥øx(æä¥ø„)æ ¦ø(\æ4¦ø¼\æ\¦øŒb愦ø c欦ø´cæÔ¦ø\dæü¦ø eæ$§ø eæL§ø4fæt§øg朧ø <æħøaæì§ødræ¨øðræ<¨ø„sæd¨ø(t挨ø¼tæüluæä ©|\ ôápäL©~©äÄ­ðÜ­â,©|\ ä´¨äl­ãálŸövõýÿí |ä(öýÿí`0å)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿí°… ä(öýÿí”0ä,öýÿí„: ä)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öÌk xÕîÎäDîä”ÕìâÀÕ„: ä°Õì ììÕ´)åÜÕì äê`0åÖê âÖ ä äæÎäDÖááÜÙä€ÖXÖä|JäâlÖêæêâÌk ¼Öî,×è(ÖêäØÖì âôÖ„: ä|Jì×´)ù`0åÐiê ×Ü×åçäçæááxýâ„: |Jäá@´)é á@`0áÐiâ á @á,hä Øä!á,hì8á|Jä 8ØdØ,nô:ânäœnü ÄØlØá|Jä˜Øü:á8oäý |ÙÌØ2éøØüè$ÙüÐiäPÙü:xkä ÿá„Ùé°Ùü:ápä ýÎäøÙáé4Ú Úä ˜äâ ÚêæêâÌk pÚîàÚèÜÙêäŒÚì â¨Ú„: ä ˜ìÄÚ´)ù`0åH•êTÛÛåçäçæááxýâ„: ˜äá@´)éá@`0áH•âá @á,häÀÛäá,hì8áœBä ìÛÜà™ô:âЙäPšü ¤Ü Ü2áœBäLÜüá ˜äxÜü:á›äý \ݬÜ2€èØÜüèÝüH•ä0Ýü:ð–äÿádÝéÝü:ápäÿå Þâ´î © Eâ<Þü´äåî$Þ, ôövõýÿí |ä(öýÿí`0å)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿí°… ä(öýÿí”0ä,öýÿí„: ä)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öÌk © ðäî¼Ýäü!îä åìâ8å„: ä(åì ìTå… ä(åð`0åpåê â€å ä äæ¼Ýä¬åáá8êäÔåÀåä|JäæêâÌk © æî€æèåêä,æì âHæ„: ä|Jìdæ… ä|Jð`0åÐiêôæ0çåçäçæááxýâ„: |Jäûá @… |Jäüá@`0áÐiâýá @ëá,hä`çäðá,hì8á|Jä Œç¸ç,nô:ânäœnü èÀçá|Jäìçü:á8oäûý Ðè è2éLèüèxèüÐiä¤èü:xkäýÿáØè2€èéü é0é êøé\é´éøá|Jäˆéü:á8oäüýá|Jäàéü:á8oäûý4êþ¼ÝäTêáé|êhêä ˜äæêâÌk © ¸êî(ëè8êêäÔêì âðê„: ä ˜ì ë… ä ˜ð`0åH•êœëØëåçäçæááxýâ„: ˜äõá @… ˜äöá@`0áH•â÷á @àá,häìäáá,hì8áœBä 4ì`ìà™ô:âЙäPšü ììhì2áœBä”ìüá ˜äÀìü:á›äõý ¤íôì2€è íüèLíüH•äxíü:ð–ä÷ÿá¬í2€èØíüéî\îøá ˜ä0îü:á›äöýá ˜äˆîü:á›äõÿåïãóøŸá!âïü4òöövõýÿíøŸå(öTõ<öýÿíö(öýÿí„: ä)ö,öTõ<öýÿíö(öýÿí… ä)ö,öýÿíüä)ö;öùÿõ}ö ÌkøŸápòî´îäŠïä¬òäŒòäâ âœòæ ìÈò„: äŒòêäò… äŒòîüäŒòôPóâüõøŸáâhóü0õöövõýÿíøŸå(öýÿí„: ä,öýÿí… ä,öýÿíüä)ö;öùÿõ}ö ÌkøŸálõïóä@‰ïä¨õäˆõäâ â˜õæ ìÄõ„: äˆõìàõ… äˆõðüäˆõôLöâ˜øøŸáâ|öüÌ÷òdöôã ô, î{öùÿõDõýÿíàÁä(öýÿí„: ä,öýÿí… ä,öýÿíüä)ö;öùÿõ}ö ÌkøŸáøîüõ且ïä4øä$øäâ äæ`ø„: äPøì ì|ø… äPøðüä$øôèøâàÁMâùüPóùôã ô, î{öùÿõýÿí, äýÿí”0ä=öýÿíüä;öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿíüä,öpõýÿí„: ä)öùÿõvõIõ(ö&ö*öýÿíüä)ö õýÿíÌLä<öýÿí, ä>övõýÿí |ä(ö*öýÿí„: ä)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿí°… ä(öýÿí”0ä,öýÿíüä)ö;öùÿõPõ;öùÿõ}öùÿõùÿõDõýÿíüä;öùÿõ}öÌkàÁŒî˜øäè“ïä¸ä¨äâ äæä„: äÔì í… äÔðüä¨ôlâ˜8. â„üöö(öýÿí„+å)ö;öùÿõ}öÌk8. @îä´’ïä\ìæ„+åxì âˆæ ôèâ$ ÎáYãüX ööýÿíüä(öÿÿô,öÿÿô)ö;öùÿõ>õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõýÿíüä.öýÿí„: ä=öWõ<öýÿíö(öIõ(öýÿíàVä)öõ[öEõ(öýÿíö(öýÿí… ä-öýÿí„: ä)ö;öùÿõýÿíÔíä(öýÿíüä,öýÿí„: ä,öýÿí´)å*öEõ(öýÿíäT0î âl=ò{öýÿí()äaõýÿí´)å;öDõ*öOõ;ö}ö@@ä¤/îâ>ò{öýÿí¤ÌäýÿíÄä(ö*öOõ)ö;öqõ(ö*öOõ)ö;öDõýÿíÄä;ö}öLAä/î ât@ò{öqõýÿí()ä;öDõ*öOõ;ö}ö0Cäh.îâ€Aò{öýÿí¤ÌäýÿíÄä(ö*öOõ)ö;öpõ(ö*öOõ)ö;öDõýÿíÄä;ö}ööýÿíÐ0å.öýÿí()ä;ö}ö\SøÐQæáRæ°>ø âTRäRì€â8R`0å4.îÐ0å4.ê{öDõýÿí`0å.öýÿí()ämõýÿíÐ0å.öýÿí()ä;ö}öøTø„Sæ´Sæì9ø âTäÐSäh*ä€âìS´)ù8Êä4.ê{öDõýÿí¤Ìä(öýÿí8Êä)öaõýÿí´)å;ö}ö Uøl4æHUø„4æpUø¤+æü˜UæÈUðHù âÜ%ØUèŒ&ì|W ä„'ì{öùÿõDõýÿí¤Ìä(öýÿí4å+öýÿí,² ä,öOõ)ö;öùÿõ}ö HYŒW¤Wî â(Xööýÿí|ä=öýÿíÎå<öýÿíö(öýÿí+å)ö;öùÿõýÿí4å=öýÿí|ä.öýÿí„: ä;öùÿõýÿí,² ä=öýÿí|ä.öýÿíô<ä;öùÿõýÿí,Ôä=öÿÿô;öùÿõ}öaøü`æ Gæ0aøh*èdaøXaæŒ&æ˜aøŒaæ|&æÀaøD%èbøèaæD%ðHù@bøt\æhbø”Yæbø¤Wæ¸bù*æàbøˆ(æcù'æ0cød&ædøXcæ¼%ôO”câÿèäÀcìãÜ% êÜcè„'øøcê âÜ% ÿà0dæ¼%˜Rldâÿèä˜däøcääÜ% ê´dè„'øøcêä (eÐiäðhèpäöè,iä\ièÈqÌkÐäÐdäHeãá`eÐäXeÐdâ0fôOäpe(eôO¬ePÿèäØeì€âÐdêf|W äôeì âÐdè`0å fì ìÔfP7ä@f(eP7|fÿèä¸fä¨fä€âÐdê âÐd è|W äôeì¤g˜Rääf(e˜R gÿèäLgä¨fä€âÐdêhg|W äôeðä„gê â”g ä äæ"àhì68h´g(eì6ðgÿèähä¨fä€âÐdî|W äôeð@h(eì6|hÿèä¨häÐdä€âÐdêÄh|W äôeð 7øœÚäðhåœÚiè ðŒìDiT+ ôöýÿí”,å;öùÿõýÿí”,å.öýÿíì;å=öýÿíX™ ä(ö)ö;öùÿõDõýÿí”,å;öùÿõ}ú´‹<ÉX5ð‹îxŒää?îä PŒlŒŒäRâäÈì âäÈ,Œè@Œè æè|W ä4ÊøÉäÈŒâ‰X5âàŒü´‹öôAãì{öùÿõDõýÿí¨Û ä<öýÿíôAå>ö(öýÿíX™ ä(ö)ö)ö;öùÿõ}úì;åXŽåì;áÈ…ìü@ñ T¼Ž ƒîâÔŽöü@ñ{öùÿõýÿíx{ä(öýÿí”,å.öýÿíì;å)ö;öùÿõDõ*öOõ;öùÿõ}ö ¨‘ˆèî â öü@ñ:öýÿíì;å(öýÿí”,å.öýÿíì;å)öùÿõ{öùÿõ}ö œ’Ü‘†îâô‘öü@ñ{öùÿõDõýÿíì;å;öùÿõ}ö “Ð’`…îâè’öü@ñ{öùÿõDõýÿíì;å;öùÿõ}ö œ”Ä“°„îâÜ“öü@ñ{öùÿõDõ*öýÿíì;å;öùÿõ}ö •Д„îâè”öü@ñ{öùÿõGõýÿíì;å;öùÿõ}ö Œ—Ä•\îâÜ•öü@ñ{öùÿõýÿíx{ä(öýÿíÄ"å.öýÿíX™ ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö ™À—ÀÊî âØ—öü@ñ:öýÿíì;å(öýÿíÄ"å.öýÿíX™ ä(ö)ö)öùÿõ{öùÿõ}ö 4šD™°Éî â\™öü@ñ:öýÿíì;å(öýÿí„+å)öùÿõ{öùÿõ}ö ¨œhšP‡î‚öü@ñ{öùÿõ;õ(öýÿíì;åkõýÿí„+å)öùÿõ{öùÿõGõýÿíì;å;öùÿõýÿíì;å=öýÿí„+å;öùÿõ}öùÿõ}úÜœ°†îâôœöü@ñ{öùÿõýÿíü@å*öýÿíÄä=öýÿíì;å;öùÿõýÿíì;å=öÿÿô;öùÿõDõýÿíÄä;öùÿõ}öäžø„Éæ Ÿø°Éæ4ŸøÀÊæ\Ÿø\感ø„欟ø°„æÔŸø`…æüŸø†æ$ ø°†æL øP‡æt øè朠ø ƒæüXŽæØ ää¹ìâÔ¹èå4á¡è â ¡€ø äæ<¡øðˆ¡UâT¡è â@]d¡èx¡è 𤶠⠡è â|ô°¡èx¡èä ¢4‘ õèÜ·–¹äD¢êÌklœ äÄ¡ä,¢ãå4‘ ä<¢Ä¡âX¢ðl¢â0hìâ,øè ¤®´¢ü¢îoâ ¤òÌ¢øðä¢Uò¤¶ îD¹Ðu 8£âÿèäd£ì€€âd¹iê£|W 䀣ê âd¹ä¬£_äÔ¹ìÈ£,äÔ¹ì¤-åä£ê âô£æ ð¨äÔ¹ì{öùÿõ;õ(öýÿí_ä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿ툮â)ö;öùÿõùÿõýÿí|räýÿí, ä=öýÿíÔ6 ä(öýÿí¤ ä(ö)ö-öýÿí_ä,öýÿí,ä)ö;öùÿõýÿí|räýÿí@ä=öýÿíÔ6 ä(öýÿí, ä,öýÿí¨ä)ö;öùÿõ õýÿíüä=öýÿíUävõýÿíÐu ä(öýÿíðä(öýÿíÌ' ä(ö)ö)ö+öýÿí_ä,öýÿí-å,öýÿí@ä)ö;öùÿõ;õ(öýÿíüäjõÿÿô)öùÿõ{öùÿõ;õ(öýÿí, ä<öýÿí¨ä)öùÿõDõ-öÿÿìæ;öùÿõ;õ(öýÿí, äjõýÿí¨ä)öùÿõDõÿÿô;öùÿõDõÿÿìæ;öùÿõ}öùÿõDõýÿíüä;öùÿõ}östring compare: pos > len⠲خ ¯îâ°òð®øð¯Uò¤¶ îD¹Ðu \¯ÿè䈯쀀âd¹h꤯|W 䀣êÀ¯_äÔ¹ìܯ,äÔ¹ð-åø¯ê â°æ ì{öùÿõDõýÿíÐu ä(öýÿí_ä,öýÿí,ä,öýÿí-å,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö tµD²Œ²îâL³ò\²øðt²Uò¤¶ îD¹Ðu Ȳÿèäô²ì€€âd¹gê³|W 䀣î-å,³ê â<³æ ì{öùÿõDõýÿíÐu ä(öÿÿô,öýÿí¤ ä(ö)ö,öýÿí-å,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö œ¼¨µðµî:â·òÀµøðصUò¤¶ îD¹Ðu ,¶âÿèäX¶ì€€âd¹fêt¶|W 䀣ê¶_äԹ쬶,äÔ¹ìض0}äȶê âd¹ äô¶˜^äÔ¹ð¨äÔ¹ì{öùÿõ;õ(öýÿí˜^ä>öýÿí0}ä.öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿ퀼â)ö;öùÿõùÿõDõýÿíÐu ä(öýÿí_ä,öýÿí,ä,öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö+öýÿí˜^ä,öýÿíÔ6 ä(öýÿí0}ä.öýÿí¤ ä(ö)ö-öýÿí˜^ä,öýÿí¨ä)ö)ö;öùÿõ}östring compare: pos > lenâ ¨Àм½îâð½òè¼øñ½Uò¤¶ îD¹Ðu T½ÿè䀽쀀âd¹eꜽ|W 䀣긽_äÔ¹ìÔ½,äÔ¹ð0}äȶê{öùÿõDõýÿíÐu ä(öýÿí_ä,öýÿí,ä,öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö ¬ÄÜÀ$ÁîâÄÁòôÀøð ÁUò¤¶ îD¹Ðu `ÁÿèäŒÁ쀀âd¹dê¨Á|W 䀣î0}äȶê{öùÿõDõýÿíÐu ä(öÿÿô,öýÿí¤ ä(ö)ö,öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö (ËàÄ(Åî0â€ÆòøÄøðÅUò¤¶ îD¹PdÅâÿèäÅäd¹ä€€âd¹cê¬Å|W 䀣êôÅàÈÅÔ¹ì4ÿî´)áÆÔ¹ìIê <Æd¹d¹ðæDÆâD¹´~Ô¹ÿè{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿîË&â)ö;öùÿõùÿõýÿí|räýÿí@ä=öýÿíÔ6 ä(öýÿí´)å,öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõDõýÿí4‘ ä(ö*öOõ,öýÿíàä,öýÿí@ä)ö;öùÿõ}ö$basic_string::substr pos out of rangeâ ¼Õ\ˤËîaâ¤ÌòtËøðŒËUò¤¶ îD¹ìr àËâÿèä ÌäԹ䀀âd¹bê(Ì|W 䀣êTÌè#åDÌì ð àpÌÔ¹ìIê œÌd¹d¹ðæDÆ{öùÿõ;õ(öýÿí¤ ä(ö)öjõÿÿô)öùÿõDõýÿí´~ä;öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö-öÿÿìæ)öùÿõýÿíàä=öýÿí¤ ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿ픩äýÿíä&å=öýÿíÔîä(ö)ö-öýÿí€×ä(öýÿíàä+öÿÿìæ)ö;öýÿíä&åkõýÿíÔîä(ö)ö;öpõýÿíä&å)öùÿõ;õ(ö!öýÿíUävõýÿíøxä(ö*öýÿíä&å,öýÿíè#å)ö)öùÿõDõýÿí|rä(öýÿíä&å.öýÿí“ ä(ö)ö-öýÿíÌ' ä(ö)ö-öÿÿìæ)ö;öùÿõDõýÿí´~ä;öùÿõ}ö ÙðÕ8ÖîâH×òÖøð ÖUò¤¶ îD¹ìr tÖÿèä ÖäԹ䀀âd¹aê¼Ö|W 䀣êøÖ-åØÖê âèÖæ ð à×Ô¹ìIê @×d¹d¹ðæDÆ{öùÿõDõýÿíìr ä(öýÿí-å,öýÿíàä,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö DçDÙŒÙîˆâ„Úò\ÙøðtÙUò¤¶ îD¹ìr ÈÙâÿèäôÙäԹ䀀âd¹`êÚ|W 䀣êLÚ-å,Úê â<Úæ ìhÚàäÔ¹ð´)åÔ¹ì{öùÿõ;õ(öýÿí¤ ä(ö)öjõÿÿô)öùÿõDõýÿí´~ä;öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö-öÿÿìæ)öùÿõýÿíàä=öýÿí¤ ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿ픩äýÿíä&å=öýÿíÔîä(ö)ö-öýÿí€×ä(öýÿíàä+öÿÿìæ)ö;öýÿíä&åkõýÿíÔîä(ö)ö;öpõýÿíä&å)öùÿõ{öùÿõ!õýÿíøä*öýÿíˆ'å=öýÿí-å;öùÿõ@õ(öýÿí|räýÿí,ä=öÿÿô;öýÿí,ä<öýÿí´)å;öpõýÿí,ä,öpõýÿíˆ'å)öùÿõ;õ(öýÿíUävõýÿíøxä(ö*öýÿíä&å,ö*öýÿíˆ'å)ö)öùÿõAõýÿíÜä;öùÿõDõýÿí|rä(öýÿíä&å.öýÿí“ ä(ö)ö-öýÿíÌ' ä(ö)ö-öÿÿìæ)ö;öùÿõýÿíÜä:öùÿõ;öùÿõ}öùÿõDõýÿí´~ä;öùÿõ}ö 8ëxçÀçîâ°èòçøð¨çUò¤¶ îD¹ìr üçÿèä(èäԹ䀀âd¹_êDè|W 䀣ê`è0}äȶî à|èÔ¹ìIê ¨èd¹d¹ðæDÆ{öùÿõDõýÿíìr ä(öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿíàä,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö $ólë´ëîEâ¬ìò„ëøðœëUò¤¶ îD¹èõ ðëâÿèäìäԹ䀀âd¹^ê8ì|W 䀣êdìè#åTìì ð à€ìÔ¹ì4ÿê{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)ö)öùÿõDõýÿí´~ä;öùÿõ@õ(öýÿíÌõ äýÿíä&å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öýÿíä&åkõýÿíp ä(ö)ö;öpõýÿíä&å)öùÿõ;õ(ö!öýÿíUävõýÿíøxä(ö*öýÿíä&å,öýÿíè#å)ö)öùÿõDõýÿí|rä(öýÿíä&å-öýÿíÌ' ä(ö)ö)ö;öùÿõDõýÿí´~ä;öùÿõ}ö pöXó óîâ¨ôòpóøðˆóUò¤¶ îD¹èõ ÜóÿèäôäԹ䀀âd¹]ê$ô|W 䀣ê`ô-å@ôê âPôæ ð à|ôÔ¹ì4ÿê{öùÿõDõýÿíèõ ä(öýÿí-å,öýÿíàä,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö ¤öìöîwâä÷ò¼öøðÔöUò¤¶ îD¹èõ (÷âÿèäT÷äԹ䀀âd¹\êp÷|W 䀣ê¬÷-åŒ÷ê âœ÷æ ìÈ÷àäÔ¹ð´)åÔ¹ì{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)ö)öùÿõDõýÿí´~ä;öùÿõ;õ(öýÿí´)åjõÿÿô)öùÿõDõýÿíàä;öùÿõ@õ(öýÿíÌõ äýÿíä&å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öýÿíä&åkõýÿíp ä(ö)ö;öpõýÿíä&å)öùÿõ{öùÿõ!õýÿíøä*öýÿíˆ'å=öýÿí-å;öùÿõ@õ(öýÿí|räýÿí,ä=öÿÿô;öýÿí,ä<öýÿí´)å;öpõýÿí,ä,öpõýÿíˆ'å)öùÿõ;õ(öýÿíUävõýÿíøxä(ö*öýÿíä&å,ö*öýÿíˆ'å)ö)öùÿõAõýÿíÜä;öùÿõDõýÿí|rä(öýÿíä&å-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿíÜä:öùÿõ;öùÿõ}öùÿõDõýÿí´~ä;öùÿõ}ö ø@ˆîâpòXøðpUò¤¶ îD¹èõ ÄÿèäðäԹ䀀âd¹[ê |W 䀣ê(0}äȶî àDÔ¹ì4ÿê{öùÿõDõýÿíèõ ä(öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿíàä,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö t,tî`âtòDøð\Uò¤¶ îD¹Ôþ°âÿèäÜäԹ䀀âd¹Zêø|W 䀣ê$è#åì ð à@Ô¹ìIê ld¹d¹ðæDÆ{öùÿõ;õ(öýÿí¤ ä(ö)öjõÿÿô)öùÿõDõýÿí´~ä;öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö-öÿÿìæ)öùÿõýÿíàä=öýÿí¤ ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿ픩äýÿíä&å=öýÿíÔîä(ö)ö-öýÿí€×ä(öýÿíàä+öÿÿìæ)ö;öýÿíä&åkõýÿíÔîä(ö)ö;öpõýÿíä&å)öùÿõ;õ(öýÿíUävõýÿíøxä(ö*öýÿíä&å,öýÿíè#å)ö)öùÿõDõýÿí|rä(öýÿíä&å.öýÿí“ ä(ö)ö-öýÿíÌ' ä(ö)ö-öÿÿìæ)ö;öùÿõDõýÿí´~ä;öùÿõ}ö ȨðîãòÀøðØUò¤¶ îD¹Ôþ,ÿèäXäԹ䀀âd¹Yêt|W 䀣ê°-åê â æ ð àÌÔ¹ìIê ød¹d¹ðæDÆ{öùÿõDõýÿíÔþä(öýÿí-å,öýÿíàä,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö „"üDîƒâ<òøð,Uò¤¶ îD¹Ôþ€âÿèä¬äԹ䀀âd¹XêÈ|W 䀣ê-åäê âôæ ì àäÔ¹ð´)åÔ¹ì{öùÿõ;õ(öýÿí¤ ä(ö)öjõÿÿôhõýÿí´)åjõÿÿô)öùÿõDõýÿí´~ä;öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö-öÿÿìæ)öùÿõýÿíàä=öýÿí¤ ä(ö)ö-öÿÿìæ;öùÿõ@õ(öýÿ픩äýÿíä&å=öýÿíÔîä(ö)ö-öýÿí€×ä(öýÿíàä+öÿÿìæ)ö;öýÿíä&åkõýÿíÔîä(ö)ö;öpõýÿíä&å)öùÿõ{öùÿõ!õýÿíøä*öýÿíˆ'å=öýÿí-å;öùÿõ@õ(öýÿí|räýÿí,ä=öÿÿô;öýÿí,ä<öýÿí´)å;öpõýÿí,ä,öpõýÿíˆ'å)öùÿõ;õ(öýÿíUävõýÿíøxä(ö*öýÿíä&å,ö*öýÿíˆ'å)ö)öùÿõDõýÿí|rä(öýÿíä&å.öýÿí“ ä(ö)ö-öýÿíÌ' ä(ö)ö-öÿÿìæ)ö;öùÿõ}öùÿõDõýÿí´~ä;öùÿõ}öx&¸"á#îâð#òÐ"øðè"Uò¤¶ îD¹Ôþ<#ÿèäh#äԹ䀀âd¹Wê„#|W 䀣ê #0}äȶî à¼#Ô¹ìIê è#d¹d¹ðæDÆ{öùÿõDõýÿíÔþä(öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿíàä,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö L.¬&ô&îDâì'òÄ&øðÜ&Uò¤¶ îD¹hç0'âÿèä\'äԹ䀀âd¹Vêx'|W 䀣ê¤'è#å”'ì ð àÀ'Ô¹ì4ÿê{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)ö)öùÿõDõýÿí´~ä;öùÿõ@õ(öýÿíÌõ äýÿíä&å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öýÿíä&åkõýÿíp ä(ö)ö;öpõýÿíä&å)öùÿõ;õ(öýÿíUävõýÿíøxä(ö*öýÿíä&å,öýÿíè#å)ö)öùÿõDõýÿí|rä(öýÿíä&å-öýÿíÌ' ä(ö)ö)ö;öùÿõDõýÿí´~ä;öùÿõ}ö ˜1€.È.îâÐ/ò˜.øð°.Uò¤¶ îD¹hç/ÿèä0/äԹ䀀âd¹UêL/|W 䀣êˆ/-åh/ê âx/æ ð à¤/Ô¹ì4ÿê{öùÿõDõýÿíhçä(öýÿí-å,öýÿíàä,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö ´<Ì12îgâ 3òä1øðü1Uò¤¶ îD¹hçP2âÿèä|2äԹ䀀âd¹Tê˜2|W 䀣êÔ2-å´2ê âÄ2æ ìð2àäÔ¹ð´)åÔ¹ì{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)öhõýÿí´)åjõÿÿô)öùÿõDõýÿí´~ä;öùÿõ@õ(öýÿíÌõ äýÿíä&å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öýÿíä&åkõýÿíp ä(ö)ö;öpõýÿíä&å)öùÿõ{öùÿõ!õýÿíøä*öýÿíˆ'å=öýÿí-å;öùÿõ@õ(öýÿí|räýÿí,ä=öÿÿô;öýÿí,ä<öýÿí´)å;öpõýÿí,ä,öpõýÿíˆ'å)öùÿõ;õ(öýÿíUävõýÿíøxä(ö*öýÿíä&å,ö*öýÿíˆ'å)ö)öùÿõDõýÿí|rä(öýÿíä&å-öýÿíÌ' ä(ö)ö)ö;öùÿõ}öùÿõDõýÿí´~ä;öùÿõ}ö  @è<0=îâ>ó=øð=Uò¤¶ îD¹hçl=ÿèä˜=äԹ䀀âd¹Sê´=|W 䀣êÐ=0}äȶî àì=Ô¹ì4ÿê{öùÿõDõýÿíhçä(öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿíàä,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö ¬KÔ@AîfâBòì@øðAUò¤¶ îD¹>XAâÿèä„AäԹ䀀âd¹Rê A|W 䀣êÌAè#å¼Aì ð àèAÔ¹ìIê Bd¹d¹ðæDÆ{öùÿõ;õ(öýÿí¤ ä(ö)ö<öÿÿìæ)öùÿõDõýÿí´~ä;öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö-öÿÿìæ)öùÿõýÿíàä=öýÿí¤ ä(ö)ö-öÿÿìæ;öùÿõýÿíÌõ äýÿí„+å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öùÿõ?õùÿõ{öùÿõ;õ(öýÿíUävõýÿíøxä(öýÿíè#å,ö*öýÿí„+å)ö)öùÿõDõXõ<öýÿí|rä>ö(öýÿí„+å-öýÿíÌ' ä(ö)ö)ö;öùÿõ}ö>õ(öýÿí„+å>öýÿíÌ' ä(ö)öiõ(öqõýÿí„+å,öZõ)ö)ö;öùÿõDõýÿí´~ä;öùÿõ}÷ OàK(Lîâ8MòøKøðLUò¤¶ îD¹>dLÿèäLäԹ䀀âd¹Qê¬L|W 䀣êèL-åÈLê âØLæ ð àMÔ¹ìIê 0Md¹d¹ðæDÆ{öùÿõDõýÿí>ä(öýÿí-å,öýÿíàä,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö T^4O|Oî”âtPòLOøðdOUò¤¶ îD¹>¸OâÿèääOäԹ䀀âd¹PëP|W 䀣êöýÿí¤ ä(ö)ö-öýÿí´)å)öùÿõýÿíàä=öýÿí¤ ä(ö)ö-öýÿí´)å;öùÿõ!õýÿíøä*öýÿíÐ)ä=öýÿí-å+öýÿí´)å;öùÿõýÿíÌõ äýÿí„+å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öùÿõ?õùÿõ{öùÿõýÿíÌõ äýÿí\<ä=öýÿí„+å;öùÿõ@õ(ö!õýÿíøä*öýÿí„Oä=öýÿí-å;öýÿí„Oä<öýÿíÐ)ä;öpõýÿí„Oä,öpõýÿí\<ä)öùÿõ;õ(ö!öýÿíUävõýÿíøxä(ö*öýÿí„Oä,ö*öýÿí\<ä)ö)öùÿõAõýÿí<ä;öùÿõDõXõ<öýÿí|rä>ö(öýÿí„+å-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí<ä:ö;öùÿõ}ö>õ(öýÿí„+å>öýÿíÌ' ä(ö)öiõ(öqõýÿí„+å,öZõ)ö)ö;öùÿõDõýÿí´~ä;öùÿõ}ö Hbˆ^Ð^îâÀ_ò ^øð¸^Uò¤¶ îD¹> _ÿèä8_äԹ䀀âd¹OêT_|W 䀣êp_0}äȶî àŒ_Ô¹ìIê ¸_d¹d¹ðæDÆ{öùÿõDõýÿí>ä(öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿíàä,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö dj|bÄbîGâ¼cò”bøð¬bUò¤¶ î D¹| ácâÿèä,cäԹ䀀âd¹NêHc|W 䀣êtcè#ådcì ð àcÔ¹ì4ÿê{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)ö)öùÿõDõýÿí´~ä;öùÿõ@õ(öýÿíÌõ äýÿí„+å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öýÿí„+å<öýÿíp ä(ö)ö;öpõýÿí„+å)öùÿõ;õ(öýÿíUävõýÿíøxä(öýÿíè#å,ö*öýÿí„+å)ö)öùÿõDõXõ<öýÿí|rä>ö(öýÿí„+å-öýÿíÌ' ä(ö)ö)ö;öùÿõDõýÿí´~ä;öùÿõ}ö °m˜jàjîâèkò°jøðÈjUò¤¶ îD¹| kÿèäHkäԹ䀀âd¹Mêdk|W 䀣ê k-å€kê âkæ ð à¼kÔ¹ì4ÿê{öùÿõDõýÿí| ä(öýÿí-å,öýÿíàä,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö „{äm,nî„â$oòümøðnUò¤¶ îD¹| hnâÿèä”näԹ䀀âd¹Lê°n|W 䀣êìn-åÌnê âÜnæ ìoàäÔ¹ð´)åÔ¹ì{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõDõýÿí´~ä;öùÿõýÿí|räýÿí`jä=öýÿí¤ ä(ö)ö-öýÿíàä;öùÿõ!õýÿíøä*öýÿíÐ)ä=öýÿí-å+öýÿí´)å;öùÿõ@õ(öýÿíÌõ äýÿí„+å=öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öýÿí`jämõýÿí´)å;öpõýÿí„+å,öqõýÿí`jä)öùÿõ{öùÿõýÿíÌõ äýÿí\<ä=öýÿí„+å;öùÿõ@õ(ö!õýÿíøä*öýÿí„Oä=öýÿí-å;öýÿí„Oä<öýÿíÐ)ä;öpõýÿí„Oä,öpõýÿí\<ä)öùÿõ;õ(ö!öýÿíUävõýÿíøxä(ö*öýÿí„Oä,ö*öýÿí\<ä)ö)öùÿõAõýÿí<ä;öùÿõDõXõ<öýÿí|rä>ö(öýÿí„+å-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí<ä:ö;öùÿõ}öùÿõDõýÿí´~ä;öùÿõ}öp¸{á|îâè|òÐ{øðè{Uò¤¶ îD¹| <|ÿèäh|äԹ䀀âd¹Kê„||W 䀣ê |0}äȶî à¼|Ô¹ì4ÿê{öùÿõDõýÿí| ä(öýÿí0}ä.öýÿíðä(öýÿí0}ä.öýÿíÌ' ä(ö)ö)ö,öýÿíàä,öýÿí0}ä.öýÿí¤ ä(ö)ö)ö;öùÿõ}ö H¤ìî âp€ò¼øðÔUò¤¶ î D¹è„á(€ÿèäT€ä¡ä€€âd¹Jî|W 䀣ê{öùÿõùÿõDõýÿí¸ä;öùÿõùÿõ}ö  …|Äî#âX‚ò”øð¬Uò¤¶ î D¹… á‚âÿèä<‚ä,‚ âd¹Iê âx¡ê|W 䀣ê{öùÿõùÿõ;õ(öýÿí4åjõÿÿô)öùÿõ{öùÿõõ!õýÿíøäýÿíD^ä=öýÿíøä(ö)ö;öùÿõDõ&öýÿíD^ä;öùÿõ}öùÿõDõýÿí4å;öùÿõùÿõ}ö x‡Ô…†î â †òì…øð†Uò¤¶ îD¹îX†ÿè䄆ä,‚ âd¹Hî|W 䀣ê{öùÿõDõýÿí… ä(ö)ö;öùÿõ}ö 쬇ô‡î9┈òćøð܇Uò¤¶ îD¹ˆp0ˆâÿèä\ˆì€âd¹Gêxˆ|W 䀣ð0}äȶì{öùÿõ;õ(öOõkõ&öýÿí0}ä)öùÿõ{öùÿõùÿõvõýÿíx†ävõýÿíˆpä(öýÿí,Ôä,öýÿí0}ä.öýÿí,Ôä)ö;öùÿõvõýÿíx†ävõýÿíˆpä(öýÿí¸ä,öýÿí0}ä.öýÿí¸ä)ö;öùÿõvõýÿíx†ävõýÿíˆpä(öýÿí4å,öýÿí0}ä.öýÿí4å)ö;öùÿõùÿõùÿõ}öùÿõ}ö ð” ŽhŽî8âŒò8ŽøðPŽUò¤¶ îD¹ŒŠ¤ŽâÿèäÐŽäԹ䀀âd¹FêìŽ|W 䀣ê(-åì âæ ìD´)åÔ¹ð à`Ô¹ì4ÿê{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿíÌ”$â)ö;öùÿõùÿõýÿí|räýÿí@ä=öýÿíÔ6 ä(öýÿí´)å,öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõýÿíUävõýÿ팊ä(öýÿí-å,öýÿíü~ ä(ö)ö+öýÿíàä,öýÿí@ä)ö;öùÿõDõýÿí@ä;öùÿõ}ö.basic_string::copy pos out of range|™$•l•î â|–ò<•øðT•Uò¤¶ îD¹´¨•ÿèäÔ•äȶä€âd¹xêð•|W ä€£ì –àäÔ¹ì(–, äÔ¹ìD–„: ä¡ì`–… ä¡ð 7äHŠì{öùÿõDõýÿí´ä(öýÿíàä,öýÿí, ä,öXõ<öýÿíØä>ö(öýÿí„: ä)ö,öXõ<öýÿíØä>ö(öýÿí… ä)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö ¾°™ø™îqá(›òÈ™øðà™Uò¤¶ îD¹´4šâÿèä`šäȶä€âd¹wê|š|W 䀣옚àäԹ촚, äÔ¹ìðš„: äКì â àšØ äæ ›… äКð 7äHŠì{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿíÀ½'â)ö;öùÿõùÿõýÿí|räýÿí áä=öýÿíÔ6 ä(öýÿí, ä,öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõýÿí|räýÿí@ä=öýÿí|rä(öýÿí… ä-öýÿí„: ä)ö;öùÿõ;õ(öýÿí@ä>öýÿí0 ä(ö)öhõýÿí¤ ä(ö)ö-öýÿí áä>öýÿí0 ä(ö)ö-öýÿí@ä)öùÿõùÿõPõýÿíœf ä(öüÿíè½#â)ö;öùÿõùÿõýÿí|räýÿíÀå=öýÿí¤ ä(ö)ö-öýÿí áä+öýÿí@ä;öùÿõùÿõùÿõ;õ(öýÿíÀå>öýÿí4Öä(ö)öhõýÿí„: ämõýÿíü~ ä(ö)öiõýÿí„: ä<öýÿíü~ ä(ö)ö+öýÿí¤ ä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí€ø äýÿíxÃä=öýÿí¸ä.öýÿí¬±ä(öýÿí·ä(öýÿíÀå)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä,öýÿí4å,öýÿíàä)ö;öùÿõ;õ(öýÿí@ä>öÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä+öýÿíàä,öýÿí„: ä,öýÿí@ä)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä+öýÿíàä+öýÿí@ä,öýÿí4å+öýÿíàä+öýÿí áä,öýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿíxÃä+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõýÿí4å=öýÿíxÃä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿíÀå)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõùÿõ;õ(öýÿí4åkõÿÿô)öùÿõ{öùÿõýÿíUävõýÿíä(öýÿí4å+öýÿíàä+öýÿí@ä,öýÿí4å+öýÿíàä+öýÿí áä,öýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõ;õ(öýÿí@ä>öÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿí4å+öýÿíàä,öýÿí„: ä,öýÿí@ä)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá |Â@¾ˆ¾îâÄ¿òX¾øðp¾Uò¤¶ î D¹\•áľÿèäð¾äȶä€âd¹Eê ¿|W 䀣ì`¿˜ä(¿ì â ˆ•8¿L¿äd¹ìâ¡è|¿<Ÿä(¿ì˜¿´)åÔ¹ðè#å´¿ì ì{öùÿõùÿõDõýÿí\•å(öýÿí|rä(öýÿí˜ä-öýÿíÌ' ä(ö)ö)ö,öýÿí|rä(öýÿí<Ÿä-öýÿí˜ä)ö,öýÿí´)å,öýÿíè#å)ö;öùÿõ}ö xÆ°ÂøÂîâðÃòÈÂøðàÂUò¤¶ î D¹\•á4Ãÿèä`Ãäȶä€âd¹Dê|Ã|W 䀣ì˜Ã˜ä(¿ì´Ã<Ÿä(¿ð-åÐÃê âàÃæ ì{öùÿõùÿõDõýÿí\•å(öýÿí|rä(öýÿí˜ä-öýÿíÌ' ä(ö)ö)ö,öýÿí|rä(öýÿí<Ÿä-öýÿí˜ä)ö,öýÿí-å)ö;öùÿõ}ö ÀʬÆôÆîâÈòÄÆøðÜÆUò¤¶ î D¹\•á0Çÿèä\Çäȶä€âd¹CêxÇ|W 䀣ì”ǘä(¿ì°Ç<Ÿä(¿ììÇ-åÌÇê âÜÇæ ð´)åÔ¹ì{öùÿõùÿõDõýÿí\•å(öýÿí|rä(öýÿí˜ä-öýÿíÌ' ä(ö)ö)ö,öýÿí|rä(öýÿí<Ÿä-öýÿí˜ä)ö,öýÿí-å,öýÿí´)å)ö;öùÿõ}ö œÎôÊ<ËîâÌò Ëøð$ËUò¤¶ î D¹\•áxËÿèä¤Ëäȶä€âd¹BêÀË|W 䀣ìܢä(¿ìøË<Ÿä(¿ð0}äȶê{öùÿõùÿõDõýÿí\•å(öýÿí|rä(öýÿí˜ä-öýÿíÌ' ä(ö)ö)ö,öýÿí|rä(öýÿí<Ÿä-öýÿí˜ä)ö,öýÿí0}ä)ö;öùÿõ}ö xðÐÎÏîVáÐòèÎøñÏUò¤¶ î D¹\•áTÏâÿèä€Ïäȶä€âd¹AêœÏ|W 䀣ì¸ÏàäÔ¹ìÔÏ,äÔ¹ìðϨäÔ¹ðè#å Ðì ì{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿí,ð'â)ö;öùÿõùÿõýÿí|räýÿí áä=öýÿíÔ6 ä(öýÿí,ä,öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõ;õ(öýÿí¨ä>öýÿí0 ä(ö)öhõýÿí¤ ä(ö)ö-öýÿí áä>öýÿí0 ä(ö)ö-öýÿí¨ä)öùÿõùÿõPõýÿíœf ä(öüÿíTð#â)ö;öùÿõùÿõùÿõýÿí|räýÿíÀå=öýÿí¤ ä(ö)ö-öýÿí áä+öýÿí¨ä;öùÿõùÿõ;õ(öýÿíÀå>öýÿí4Öä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí€ø äýÿíxÃä=öýÿí¸ä.öýÿí¬±ä(öýÿí·ä(öýÿíÀå)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä,öýÿí4å,öýÿíàä)ö;öùÿõ;õ(öýÿí¨ä>öÿÿô)öùÿõýÿíUävõýÿíDÀä(öýÿíxÃä+öýÿíàä,öýÿí¨ä,öýÿíè#å)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä+öýÿíàä+öýÿí¨ä,öýÿí4å+öýÿíàä+öýÿí áä,öýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿíxÃä+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõýÿí4å=öýÿíxÃä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿíÀå)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõùÿõ;õ(öýÿí4åkõÿÿô)öùÿõ{öùÿõýÿíUävõýÿíä(öýÿí4å+öýÿíàä+öýÿí¨ä,öýÿí4å+öýÿíàä+öýÿí áä,öýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõ;õ(öýÿí¨ä>öÿÿô)öùÿõýÿíUävõýÿíDÀä(öýÿí4å+öýÿíàä,öýÿí¨ä,öýÿíè#å)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá äó¬ðôðîâìñòÄðøðÜðUò¤¶ î D¹\•á0ñÿèä\ñäȶä€âd¹@êxñ|W 䀣ì”ñàäÔ¹ì°ñ,äÔ¹ð-åÌñê âÜñæ ì{öùÿõDõýÿí\•å(öýÿíàä,öýÿí,ä,öýÿí-å,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö „÷ô`ôîâtõò0ôøðHôUò¤¶ î D¹\•áœôÿèäÈôäȶä€âd¹?êäô|W 䀣íõàäÔ¹ìõ,äÔ¹ìXõ-å8õê âHõæ ð¨äÔ¹ì{öùÿõDõýÿí´ä(öýÿíàä,öýÿí,ä,öýÿí-å,öýÿí-å+öýÿí¨ä,öýÿí@jä(ö)ö)ö;öùÿõ}öè ¸÷áøî’âùòÐ÷øðè÷Uò¤¶ î D¹\•á<øâÿèähøäȶä€âd¹>ê„ø|W ä€£ì ø_äÔ¹ì¼ø,äÔ¹ìØø0}äȶêôø˜^äÔ¹ð¨äÔ¹ì{öùÿõ;õ(öýÿí˜^ä>öýÿí0}ä.öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿíÀ 'â)ö;öùÿõùÿõýÿí|räýÿí@ä=öýÿíÔ6 ä(öýÿí¨ä,öýÿí0}ä.öýÿí¤ ä(ö)ö-öýÿí˜^ä)ö;öùÿõ;õ(öOõjõ&öýÿí0}ä)öùÿõ{öùÿõ!õýÿí4‘ äýÿíxÃä(öýÿí0}ä,öÿÿô,öýÿí´~ä,öýÿí0}ä.öýÿíè„å(ö)ö)ö;öùÿõDõýÿí´ä(öýÿí_ä,öýÿí,ä,öýÿíxÃä.öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿí˜^ä)ö,öùÿõýÿíxÃä.öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿí˜^ä+öýÿí@ä)ö,öýÿí@jä(ö)ö)ö;öùÿõ}öùÿõDõýÿí´ä(öýÿí_ä,öýÿí,ä,öýÿí0}ä.öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿí˜^ä)ö,öýÿí0}ä.öýÿíÌ' ä(ö)öùÿõ+öýÿí€×ä(öýÿí˜^ä+öýÿí@ä)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö%basic_string::replace pos out of rangeá ì  d îâ< ò4 øðL Uò¤¶ î D¹\•á  ÿèäÌ äȶä€âd¹=êè |W 䀣ì _äÔ¹ì  ,äÔ¹ð0}äȶê{öùÿõDõýÿí\•å(öýÿí_ä,öýÿí,ä,öýÿí0}ä,öÿÿô,öýÿí´~ä)ö;öùÿõ}ö Œ h î/â$ ò8 øðP Uò¤¶ îD¹œê¤ ÿèäÐ ä(¿ä€âd¹<êì |W ä€£ì „: ä(¿ð… ä(¿ì{öùÿõùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿí„: ä-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí\•å(öýÿíàä,öýÿí|rä(öýÿí… ä-öýÿí„: ä)ö,öÿÿô,öýÿíøä(ö)ö)ö;öùÿõDõýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öùÿõ}ö „ À  î⌠òØ øðð Uò¤¶ îD¹ôw D ÿèäp ì€âd¹-î|W 䀣ì{öùÿõýÿí\•å(öýÿí¤ ä(ö)ö-öÿÿìæ,öÿÿìæ,öÿÿô,öýÿíøä(ö)ö)ö;öùÿõ}öx ¸ á î)â  òÐ øðè Uò¤¶ îD¹œê< ÿèäh ä(¿ä€âd¹;ê„ |W 䀣ðзä(¿ì{öùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿíзä-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí\•å(öýÿíàä,öÿÿìæ,öÿÿô,öýÿíøä(ö)ö)ö;öùÿõDõýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öùÿõ}ö À ¬ ô îâ òÄ øðÜ Uò¤¶ îD¹œê0 ÿèä\ äȶä€âd¹:êx |W 䀣ìÀ à” Ô¹ì4ÿî´)áÜ Ô¹ìIê  d¹d¹ðæDÆ{öùÿõDõýÿí\•å(öýÿíàä,öýÿí´)å,öÿÿô,öýÿíøä(ö)ö)ö;öùÿõ}ö Œ ô < îâ$ ò  øð$ Uò¤¶ îD¹Hôx ÿèä¤ ì€âd¹9êÀ |W 䀣ìÜ „+å(¿ìø ´)åÔ¹ðè#å ì ì{öùÿõýÿí\•å(öýÿí„+å,öýÿí„+å,öýÿí´)å,öýÿíè#å)ö;öùÿõ}ö |" À  î'âÔ òØ øðð Uò¤¶ îD¹HôD ÿèäp ä(¿ä€âd¹8êŒ |W ä€£ì¨ „+å(¿ðè#åÄ ì ì{öùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿí„+å-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí\•å(öýÿíàä,öÿÿô,öÿÿìæ,öýÿíè#å)ö;öùÿõDõýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíàä)ö;öùÿõ}ö `% °" ø" îâà# òÈ" øðà" Uò¤¶ îD¹Hô4# ÿèä`# äȶä€âd¹7ê|# |W 䀣ì˜# àäÔ¹ì´# ´)åÔ¹ðè#åÐ# ì ì{öùÿõDõýÿí\•å(öýÿíàä,öÿÿô,öýÿí´)å,öýÿíè#å)ö;öùÿõ}ö €( ”% Ü% îâ¸& ò¬% øðÄ% Uò¤¶ îD¹Hô& ÿèäD& äȶä€âd¹6ê`& |W 䀣ì|& àäÔ¹ð-å˜& ê â¨& æ ì{öùÿõDõýÿíHôä(öýÿíàä,öýÿí-å,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö t+ ´( ü( îâô) òÌ( øðä( Uò¤¶ îD¹Hô8) ÿèäd) äȶä€âd¹5ê€) |W 䀣ìœ) àäÔ¹ìØ) -å¸) ê âÈ) æ ð´)åÔ¹ì{öùÿõDõýÿí\•å(öýÿíàä,öÿÿô,öýÿí-å,öýÿí´)å)ö;öùÿõ}ö ”. ¨+ ð+ îâä, òÀ+ øðØ+ Uò¤¶ îD¹Hô,, ÿèäX, äȶä€âd¹4êt, |W 䀣ì, _äÔ¹ì¬, 0}äȶêÈ, ˜^äÔ¹ð´)åÔ¹ì{öùÿõDõýÿí\•å(öýÿí_ä,öÿÿô,öýÿí0}ä,öýÿí˜^ä,öýÿí´)å)ö;öùÿõ}ö L1 È. / îâÌ/ òà. øðø. Uò¤¶ îD¹HôL/ ÿèäx/ äȶä€âd¹3ê”/ |W 䀣ì°/ _äÔ¹ð0}äȶê{öùÿõDõýÿíHôä(öýÿí_ä,öýÿí0}ä,öÿÿô,öýÿí´~ä)ö;öùÿõ}ö X5 €1 È1 îâ 2 ò˜1 øð°1 Uò¤¶ îD¹´B2 ÿèä02 äȶä€âd¹vêL2 |W 䀣ìh2 „: ä¡ì„2 … ä¡ð 7äHŠì{öùÿõDõýÿí´Bä(öXõ<öýÿíØä>ö(öýÿí„: ä)ö,öXõ<öýÿíØä>ö(öýÿí… ä)ö,öùÿõýÿí@jä(ö)ö)ö;öùÿõ}ö ¬? Œ5 Ô5 î`â¬6 ò¤5 øð¼5 Uò¤¶ îD¹´B6 âÿèä<6 äȶä€âd¹uêX6 |W 䀣ìt6 „: äКì6 … äКð 7äHŠì{öùÿõùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)ö(öýÿí… ä-öýÿí„: ä)ö;öùÿõ;õ(öýÿíü~ ä(ö)ölõýÿí„: äiõýÿí„: ä<öýÿíü~ ä(ö)ö+öýÿí¤ ä(ö)ö)öùÿõ{öùÿõùÿõýÿíUävõýÿíä(öýÿíü~ ä(ö)ö,öýÿí„: ä,öýÿí@ä)ö;öùÿõýÿíxrä(öýÿí@ä,öZõ)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíxrä(öýÿí@ä,ö[õ)ö;öùÿõýÿíUävõýÿ팊ä(öýÿíü~ ä(ö)ö,öýÿí„: ä,öýÿí@ä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö ÜC à? (@ îâô@ òø? øð@ Uò¤¶ îD¹DÀd@ âÿèä@ äȶä€âd¹2ê¬@ |W 䀣ìÈ@ ´)åÔ¹ðè#åä@ ì ì{öùÿõùÿõýÿíxrä(öýÿí´)å,ö[õ)ö;öùÿõýÿíUävõýÿíDÀä(öýÿíü~ ä(ö)ö,öýÿí´)å,öýÿíè#å)ö;öùÿõDõ*öOõ;öùÿõ}ö °F D XD îâE ò(D øð@D Uò¤¶ îD¹DÀ”D ÿèäÀD äȶä€âd¹1êÜD |W 䀣ð-åøD ê âE æ ì{öùÿõDõýÿíDÀä(öýÿí-å,öýÿíUävõýÿíبä(öýÿí-å)ö)ö;öùÿõ}ö ðJ äF ,G îâH òüF øðG Uò¤¶ îD¹DÀhG âÿèä”G äȶä€âd¹0ê°G |W 䀣ììG -åÌG ê âÜG æ ð´)åÔ¹ì{öùÿõùÿõýÿíxrä(öýÿí´)å,ö[õ)ö;öùÿõýÿíUävõýÿ팊ä(öýÿíü~ ä(ö)ö,öýÿí-å,öýÿí´)å)ö;öùÿõDõ*öOõ;öùÿõ}ö ŒV $K lK îlâDL òöýÿí0}ä.öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿídV &â)ö;öùÿõùÿõùÿõýÿí|räýÿí@ä=öýÿíÔ6 ä(öýÿí´)å,öýÿí0}ä.öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõùÿõ;õ(öOõjõ&öýÿí0}ä)öùÿõ{öùÿõýÿíœêä(öÿÿô,öýÿíàä)ö;öùÿõýÿíxrä(öýÿí@ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíxrä(öýÿí@ä,ö[õ)ö;öùÿõýÿíUävõýÿ팊ä(öýÿíü~ ä(ö)ö,öýÿí0}ä.öýÿíü~ ä(ö)ö+öýÿíàä,öýÿí@ä)ö;öùÿõ}öùÿõùÿõDõ*öOõ;öùÿõ}ö$basic_string::assign pos out of rangeâ øX ÀV W îâ¨W òØV øððV Uò¤¶ îD¹DÀDW ÿèäpW äȶä€âd¹.êŒW |W 䀣ð0}äȶê{öùÿõDõýÿíDÀä(öýÿí0}ä,öÿÿô,öýÿí´~ä)ö;öùÿõ}ö ,[ ,Y tY î â$Z òDY øð\Y Uò¤¶ îD¹ü„°Y ÿèäÜY ì€âd¹,êøY |W 䀣ðè#åZ ì ì{öùÿõýÿíäB ä(öÿÿìæ,öýÿíè#å)ö;öùÿõ}ö 8_ `[ ¨[ îâ€\ òx[ øð[ Uò¤¶ îD¹Ìä[ ÿèä\ äȶä€âd¹tê,\ |W 䀣ìH\ „: ä¡ìd\ … ä¡ð 7äHŠì{öùÿõDõýÿíÌä(öXõ<öýÿíØä>ö(öýÿí„: ä)ö,öXõ<öýÿíØä>ö(öýÿí… ä)ö,öùÿõýÿí@jä(ö)ö)ö;öùÿõ}ö ti l_ ´_ î_âŒ` ò„_ øðœ_ Uò¤¶ îD¹Ìð_ âÿèä` äȶä€âd¹sê8` |W 䀣ìT` „: äКìp` … äКð 7äHŠì{öùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)ö(öýÿí… ä-öýÿí„: ä)ö;öùÿõýÿí|räýÿ혇ä=öýÿí¤ ä(ö)ö;öùÿõ;õ(öýÿíü~ ä(ö)ölõýÿí„: äiõýÿí„: ä<öýÿíü~ ä(ö)ö+öýÿ혇äiõýÿ혇ä+öýÿí@ä>öýÿí4Öä(ö)ö)öùÿõýÿíäB ä(öýÿí4‘ ä(öýÿí„: ä,öýÿí… ä)ö)ö;öùÿõ<õùÿõ{öùÿõýÿíxrä(öýÿ혇ä+öýÿí@ä)ö;öùÿõýÿíUävõýÿ팊ä(öýÿíü~ ä(ö)ö+öýÿ혇ä,öýÿí„: ä,öýÿí@ä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö Xr ¨i ði îOâ¼j òÀi øðØi Uò¤¶ îD¹äB ,j âÿèäXj äȶä€âd¹+êtj |W 䀣ìj ´)åÔ¹ðè#å¬j ì ì{öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)öhõýÿí¤ ä(ö)ö>öýÿí0 ä(ö)ö-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿí$r 2â)ö;öùÿõùÿõýÿí|räýÿ혇ä=öýÿí¤ ä(ö)ö;öùÿõýÿíxrä(öýÿ혇ä+öýÿí´)å)ö;öùÿõýÿíUävõýÿíDÀä(öýÿíü~ ä(ö)ö+öýÿ혇ä,öýÿí´)å,öýÿíè#å)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö0basic_string::append results in string > max_sizeâ ,u Œr Ôr îâ”s ò¤r øð¼r Uò¤¶ îD¹äB s ÿèäöÿÿô)öùÿõ{öùÿõýÿí|räýÿ혇ä=öýÿí¤ ä(ö)ö;öùÿõ;õ(öýÿíü~ ä(ö)ölõýÿí-åiõýÿí-å<öýÿíü~ ä(ö)ö+öýÿ혇äiõýÿ혇ä+öýÿí´)å>öýÿí4Öä(ö)ö)öùÿõýÿíäB ä(öýÿí4‘ ä(öýÿí-å,öýÿí´)å)ö)ö;öùÿõ<õùÿõ{öùÿõýÿíxrä(öýÿ혇ä+öýÿí´)å)ö;öùÿõýÿíUävõýÿ팊ä(öýÿíü~ ä(ö)ö+öýÿ혇ä,öýÿí-å,öýÿí´)å)ö;öùÿõ}öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö ˆ‰ p ¸ î^†òˆ øð  Uò¤¶ îD¹äB ô âÿèä € äȶä€âd¹(ê<€ |W 䀣ìX€ 0}äȶêt€ àäÔ¹ð´)åÔ¹ì{öùÿõ;õ(öýÿíàä>öýÿí0}ä.öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿí`‰ &â)ö;öùÿõùÿõýÿí|räýÿí@ä=öýÿíÔ6 ä(öýÿí´)å,öýÿí0}ä.öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõ;õ(öýÿí@ä>öÿÿô)öùÿõ{öùÿõýÿí|räýÿ혇ä=öýÿí¤ ä(ö)ö;öùÿõýÿíxrä(öýÿ혇ä+öýÿí@ä)ö;öùÿõýÿíUävõýÿ팊ä(öýÿíü~ ä(ö)ö+öýÿ혇ä,öýÿí0}ä.öýÿíü~ ä(ö)ö+öýÿíàä,öýÿí@ä)ö;öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö$basic_string::append pos out of rangeâ ô‹ ¼‰ Š î⤊ òÔ‰ øðì‰ Uò¤¶ îD¹äB @Š ÿèälŠ äȶä€âd¹'ꈊ |W 䀣ð0}äȶê{öùÿõDõýÿíäB ä(öýÿí0}ä,öÿÿô,öýÿí´~ä)ö;öùÿõ}ö @Ž (Œ pŒ î â ò@Œ øðXŒ Uò¤¶ îD¹C¬Œ ÿèäØŒ äȶä€âd¹&êôŒ |W 䀣ðè#å ì ì{öùÿõDõýÿíäB ä(öÿÿìæ,öýÿíè#å)ö;öùÿõ}ö l tŽ ¼Ž î â| òŒŽ øð¤Ž Uò¤¶ îD¹CøŽ ÿèä$ äȶä€âd¹%ê@ |W 䀣ð-å\ ê âl æ ì{öùÿõDõýÿíäB ä(öýÿí-å)ö;öùÿõ}ö x’   è î ∑ ò¸ øðÐ Uò¤¶ îD¹C$‘ ÿèäP‘ äȶä€âd¹$êl‘ |W 䀣ð0}äȶê{öùÿõDõýÿíäB ä(öýÿí0}ä)ö;öùÿõ}ö ð– ¬’ ô’ î!â´“ òÄ’ øðÜ’ Uò¤¶ îD¹t;0“ âÿèä|“ ä\“ ä€âd¹#ê â l“ Ø äæ˜“ |W 䀣ðàäÔ¹ì{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿíÌ– $â)ö;öùÿõùÿõùÿõDõ*ö(öýÿíü~ ä(ö)ö+öýÿíàä)ö;öùÿõ}ö.basic_string::at index out of rangeP› $— l— î â,˜ ò<— øðT— Uò¤¶ îD¹t;¨— âÿèäô— äÔ— 䀀âd¹"ê â ä— ÔÏ äæ˜ |W 䀣îàäÔ¹ì{öùÿõ;õ(öýÿíàämõýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿí,› $â)ö;öùÿõùÿõDõ*ö(öýÿíü~ ä(ö)ö+öýÿíàä)ö;öùÿõ}ö.basic_string::at index out of rangež „› Ì› îâlœ òœ› øð´› Uò¤¶ îD¹˜5œ âÿèä4œ ä\“ ä€âd¹!êPœ |W 䀣ðàäÔ¹ì{öùÿõùÿõùÿõDõ*ö(öýÿíü~ ä(ö)ö+öýÿíàä)ö;öùÿõùÿõ}ö ˆ  8ž €ž îâ Ÿ òPž øðhž Uò¤¶ îD¹˜5¼ž ÿèäèž äÔ— 䀀âd¹ êŸ |W 䀣îàäÔ¹ì{öùÿõùÿõDõ*ö(öýÿíü~ ä(ö)ö+öýÿíàä)ö;öùÿõ}ö ¢ ¼  ¡ î ∡ òÔ  øðì  Uò¤¶ îD¹°‚ @¡ ÿèäl¡ 쀀âd¹î|W 䀣ê{öùÿõDõýÿí¤ ä(ö)öjõÿÿô;öùÿõ}ö °¤ Ä¢ £ î ⣠òÜ¢ øðô¢ Uò¤¶ îD¹,X H£ ÿèät£ ì€âd¹î|W 䀣ì{öùÿõùÿõýÿíxrä(öÿÿô,ö[õ)ö;öùÿõ}ö ü² ä¤ ,¥ î‰âø¥ òü¤ øð¥ Uò¤¶ îD¹ÈLh¥ âÿè䔥 ì€âd¹ê°¥ |W 䀣ð LÜÌ¥ Ô¹ì4ÿê{öùÿõ;õ(öýÿíLÜä>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíв ,â)ö;öùÿõùÿõùÿõ;õ(öýÿíLÜä<öýÿí,Ôä)öùÿõýÿíLÜä=öýÿí,Ôä;öùÿõýÿíLÜä=öýÿí·ä(öýÿíLÜä)ö;öùÿõ;õ(öýÿíLÜäkõýÿí¸ä.öýÿí@!ä)öùÿõ{öùÿõýÿí€ø äýÿíxÃä=öýÿí¸ä.öýÿí¬±ä(öýÿíLÜä+öÿÿìæ)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõ{öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí4å,öýÿí4å+öýÿí,Ôä+öÿÿìæ,öýÿíxÃä)ö;öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõ}öùÿõ<õùÿõýÿíUävõýÿíDÀä(ö*öýÿíxÃä,öýÿíøä(ö)ö)ö;öùÿõýÿí4å=öýÿíxÃä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿíLÜä;öùÿõ}öùÿõ}ö6basic_string::reserve argument out of rangeµ 0³ x³ î âü³ òH³ øð`³ Uò¤¶ îD¹4Ö´³ ÿèäà³ äԹ䀀âd¹î|W 䀣ê{öùÿõùÿõDõýÿí¸ä.öýÿí@!ä;öùÿõùÿõ}ö Æ 8µ €µ î¥âh¶ òPµ øðhµ Uò¤¶ îD¹xr¼µ âÿèäèµ ì€âd¹yê¶ |W ä€£ì ¶ ´)åÔ¹ðŒŠ<¶ ð4êþ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíàÅ 3â)ö;öùÿõùÿõ;õ(öýÿí´)å>öýÿí¸ä.öýÿí@!ä)öùÿõ{öùÿõýÿí|räýÿíT™ä=öýÿí ¸ ä(öýÿí¸ä.öýÿí@!ä,öýÿí·ä(öÿÿìæ)ö)ö;öùÿõ>õ(öýÿíT™ä<öýÿí´)å)öùÿõýÿíT™ä=öýÿí·ä(öýÿíT™ä*öÿÿìæ)ö;öùÿõýÿí€ø äýÿíxÃä=öýÿí¸ä.öýÿí¬±ä(öýÿíT™ä+öÿÿìæ)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõ{öùÿõ;õ(öýÿ팊ä)öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí4å,öýÿí4å+öýÿí,Ôä,öýÿíxÃä)ö;öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõ}öùÿõýÿí4å=öýÿíxÃä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿíT™ä;öùÿõùÿõ}öùÿõ;õ(öýÿí4å)öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿí´)å)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí,Ôä=öýÿí´)å;öùÿõ}ö1basic_string::length error. Resizing out of rangeá hÈ HÆ Æ î â0Ç ò`Æ øðxÆ Uò¤¶ îD¹ü ÌÆ ÿèäøÆ ì€âd¹êÇ |W 䀣ð´)åÔ¹ì{öùÿõýÿíü ä(öýÿí´)å,öýÿíøä(ö)ö)ö;öùÿõ}ö ¸Í œÈ äÈ î+â°É ò´È øðÌÈ Uò¤¶ îD¹ü É âÿèäLÉ ì€âd¹êhÉ |W 䀣ì„É ´)åÔ¹ðè#å É ì ì{öùÿõùÿõýÿí|räýÿídó ä=öýÿí¤ ä(ö)ö;öùÿõýÿíxrä(öýÿí´)å)ö;öùÿõ;õ(öýÿídó ä<öýÿí´)å)öùÿõýÿíUävõýÿíDÀä(öýÿíü~ ä(ö)ö+öýÿídó ä,öýÿí´)å-öýÿídó ä,öýÿíè#å)ö;öùÿõ}ö PÐ ìÍ 4Î îâ¸Î òÎ øðÎ Uò¤¶ îD¹0 pÎ ÿèäœÎ äԹ䀀âd¹î|W 䀣ê{öùÿõùÿõDõýÿíè„å(ö)ö.öýÿí0 ä(ö)ö-öÿÿìæ;öùÿõùÿõ}ö (Ò „Ð ÌÐ î âPÑ òœÐ øð´Ð Uò¤¶ îD¹بÑ ÿèä4Ñ äԹ䀀âd¹î|W 䀣ê{öùÿõùÿõDõýÿí,Ôä;öùÿõùÿõ}÷ Ô \Ò ¤Ò î â(Ó òtÒ øðŒÒ Uò¤¶ îD¹¤ àÒ ÿèä Ó äԹ䀀âd¹î|W 䀣ê{öùÿõùÿõDõýÿí,Ôä;öùÿõùÿõ}ö |Ö 4Ô |Ô î â\Õ òLÔ øðdÔ Uò¤¶ îD¹Ôî¸Ô ÿèä@Õ ääÔ ä€€âd¹ê â@ôÔ èÕ è â ˆ•Õ ,Õ äd¹ìâКì|W 䀣ê{öùÿõDõýÿ픩ä(öýÿíÌ' ä(ö)ö)ö;öùÿõ}ö ÀØ °Ö øÖ î â × òÈÖ øðàÖ Uò¤¶ îD¹Ôî4× ÿèä„× ä`× ä€âd¹ê â@p× è(¿ì|W 䀣ì{öùÿõDõýÿíøÜ ä(öýÿíÌ' ä(ö)ö)ö;öùÿõ}ö àÚ ôØ <Ù î âÀÙ ò Ù øð$Ù Uò¤¶ îD¹ O xÙ ÿèä¤Ù ääÔ ä€€âd¹î|W 䀣ê{öùÿõDõýÿ픩ä(öýÿíp ä(ö)ö)ö;öùÿõ}÷ Ý Û \Û î âàÛ ò,Û øðDÛ Uò¤¶ îD¹ O ˜Û ÿèäÄÛ ä`× ä€âd¹î|W 䀣ì{öùÿõDõýÿíøÜ ä(öýÿíp ä(ö)ö)ö;öùÿõ}ö €ß 4Ý |Ý îãÞ òLÝ øðdÝ Uò¤¶ îD¹p ¸Ý ÿèääÝ äÕ ä€€âd¹î|W 䀣ê{öùÿõDõýÿíLmä(öýÿíü~ ä(ö)ö+öýÿí¤ ä(ö)ö)ö;öùÿõ}ö â ´ß üß îâ€à òÌß øðäß Uò¤¶ îD¹p 8à ÿèädà ä(¿ä€âd¹î|W 䀣ì{öùÿõùÿõDõýÿíLmä(öýÿíü~ ä(ö)ö+öýÿí¤ ä(ö)ö)ö;öùÿõ}ö 8ä Lâ ”â î âã òdâ øð|â Uò¤¶ îD¹Ì' Ðâ ÿèäüâ äÕ ä€€âd¹î|W 䀣ê{öùÿõDõýÿíLmä(öýÿíü~ ä(ö)ö)ö;öùÿõ}ö pæ lä ´ä î â8å ò„ä øðœä Uò¤¶ îD¹Ì' ðä ÿèäå ä(¿ä€âd¹î|W 䀣ì{öùÿõùÿõDõýÿíLmä(öýÿíü~ ä(ö)ö)ö;öùÿõ}ö ¼è ¤æ ìæ î âœç ò¼æ øðÔæ Uò¤¶ îD¹˜R(ç ÿèäTç äȶä€âd¹êpç |W 䀣ðè#åŒç ì ì{öùÿõDõýÿíDÀä(öÿÿìæ,öýÿíè#å)ö;öùÿõ}ö èê ðè 8é î âøé òé øð é Uò¤¶ îD¹˜Rté ÿèä é äȶä€âd¹ ê¼é |W 䀣ð-åØé ê âèé æ ì{öùÿõDõýÿíDÀä(öýÿí-å)ö;öùÿõ}ö ôì ë dë î âì ò4ë øðLë Uò¤¶ îD¹˜R ë ÿèäÌë äȶä€âd¹ êèë |W 䀣ð0}äȶê{öùÿõDõýÿíDÀä(öýÿí0}ä)ö;öùÿõ}ö Lð (í pí îâôí ò@í øðXí Uò¤¶ îD¹€O¬í âÿèäØí ì €âd¹ î|W 䀣ì{öùÿõùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõ}ö üû €ð Èð îkâÐñ ò˜ð øð°ð Uò¤¶ îD¹œ>ñ âÿèä0ñ ì€âd¹rêLñ |W 䀣ìhñ ´)åÔ¹ì”ñ è#å„ñ ì ð 7ä°ñ ê âÀñ ä äæ{öùÿõýÿí4å=öÿÿô;öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíØû !â)ö;öùÿõùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõýÿíUävõýÿíDÀä(öýÿí4å,öýÿí´)å,öýÿíè#å)ö;öùÿõýÿí,Ôä=öýÿí´)å;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿí´)å)ö,öýÿíøä(ö)ö)ö;öùÿõ}öùÿõ}östring constructor: n > max_sizeã ì!0ü xü îdâŒý òHü øð`ü Uò¤¶ îD¹œ>´ü âÿèäàü ì€âd¹qêüü |W 䀣ìý Ì' äКì4ý p äКìpý 7äPý ê â`ý ä äê 7äHŠì{öùÿõýÿí4å=öÿÿô;öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõ;õ(öýÿíÌ' äkõýÿíp ä)öùÿõ{öùÿõýÿí|räýÿí, ä=öýÿí|rä(öýÿíp ä-öýÿíÌ' ä)ö;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿí, ä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõýÿíUävõýÿ팊ä(öýÿí4å,öýÿíÌ' ä,öýÿí, ä)ö;öùÿõýÿí,Ôä=öýÿí, ä;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿí, ä)ö,öýÿíøä(ö)ö)ö;öùÿõ}öùÿõ}ö L ! !h!îâ|!ò8!øðP!Uò¤¶ îD¹œ>¤!ÿèäÐ!ì€âd¹pêì!|W 䀣ì!Ì' ä¡ì$!p ä¡ì`!Ä"å@!ê âP! ä äê 7äHŠì{öùÿõýÿíœ>ä(öXõ<öýÿíØä>ö(öýÿíÌ' ä)ö,öXõ<öýÿíØä>ö(öýÿíp ä)ö,öýÿíÄ"å,öùÿõýÿí@jä(ö)ö)ö;öùÿõ}ö ô!€ !È !îâü !ò˜ !øð° !Uò¤¶ îD¹ôO !ÿèä0 !ì€âd¹ êL !|W 䀣ìh !´)åÔ¹ì” !è#å„ !ì ðÄ"á° !Ü !êIîä— ôâ âì ! ä äæ:öýÿí¸ä(öýÿíÄ"å)öùÿõùÿõùÿõ{öùÿõýÿíœ>ä(öýÿí´)å,öýÿíè#å,öýÿíÄ"å)ö;öùÿõ}ö \!(!p!î<â˜!ò@!øðX!Uò¤¶ îD¹ôO¬!âÿèäØ!ì€âd¹ êô!|W 䀣ì0!-å!ê â !æ ðÄ"áL!x!êIîä— ôâ âˆ! ä äæ:öýÿí¸ä(öýÿíÄ"å)öùÿõùÿõùÿõ{öùÿõýÿí|räýÿí´)å=öýÿíUävõýÿíبä(öýÿí-å)ö;öùÿõ;õ(öýÿí´)å>öýÿíÄ"å.öýÿí0 ä(ö)ö-öÿÿìæ)öùÿõùÿõPõýÿíœf ä(öüÿí8!!â)ö;öùÿõùÿõýÿíœ>ä(öýÿí-å,öýÿí-å+öýÿí´)å,öýÿíÄ"å,öýÿí@jä(ö)ö)ö;öùÿõ}östring constructor: n > max_sizeã Ø!!Ø!î1â!ò¨!øðÀ!Uò¤¶ îD¹ôO!âÿèä@!ì€âd¹ê\!|W 䀣ì˜!-åx!ê âˆ!æ ì´!´)åÔ¹ðÄ"áÐ!ü!êIîä— ôâ â ! ä äæ:öýÿí¸ä(öýÿíÄ"å)öùÿõùÿõùÿõ{öùÿõ;õ(öýÿí´)å>öýÿíÄ"å.öýÿí0 ä(ö)ö-öÿÿìæ)öùÿõùÿõPõýÿíœf ä(öüÿí´!!â)ö;öùÿõùÿõýÿíœ>ä(öýÿí-å,öýÿí-å+öýÿí´)å,öýÿíÄ"å,öýÿí@jä(ö)ö)ö;öùÿõ}östring constructor: n > max_sizeã ¸&! !T!îSâÈ!ò$!øð<!Uò¤¶ îD¹ôO!âÿèä¼!ì€âd¹êØ!|W 䀣ìô!0}äȶê!àäÔ¹ì`!´)á,!Ô¹ìIê X!d¹d¹ðæDÆäÄ"á|!¨!êIîä— ôâ â¸! ä äæ:öýÿí¸ä(öýÿíÄ"å)öùÿõùÿõùÿõ{öùÿõýÿí|räýÿíô|ä=öýÿí0}ä.öýÿí¤ ä(ö)ö;öùÿõ;õ(öýÿíàä>öýÿíô|ä)öùÿõùÿõPõýÿídþ ä(öüÿí&!'â)ö;öùÿõùÿõýÿí|räýÿí@ä=öýÿíô|ä-öýÿíàä;öùÿõ;õ(öýÿí@ä>öýÿí´)å)öùÿõýÿí@ä=öýÿí´)å;öùÿõùÿõýÿíœ>ä(öýÿí0}ä.öýÿí4å+öýÿíàä,öýÿí0}ä.öýÿí4å+öýÿíàä+öýÿí@ä,öýÿíÄ"å,öýÿí@jä(ö)ö)ö;öùÿõùÿõ}ö%string copy constructor: pos > str lená ”+!ì&!4'!î(âÔ'!ò'!øð'!Uò¤¶ îD¹ôOp'!âÿèäœ'!ì€âd¹ê¸'!|W 䀣ð0}äȶê:öýÿí¸ä(öýÿí0}ä.öýÿí¸ä)öùÿõùÿõ{öùÿõùÿõýÿíœ>ä(öýÿí0}ä.öýÿí4å,öýÿí0}ä.öýÿí4å+öýÿí0}ä.öýÿí¤ ä(ö)ö,öýÿíè„å(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõùÿõ}ö Ì/!È+!,!îâü,!òà+!øðø+!Uò¤¶ îD¹ôOL,!Pÿèäx,!ì€âd¹ê”,!|W 䀣ðÄ"á°,!Ü,!êIîä— ôâ âì,! ä äæ:öýÿí,Ôä(öÿÿô)ö,öùÿõùÿõýÿí¸ä(öýÿíÄ"å)ö,öùÿõùÿõýÿí4å(öÿÿô)öùÿõ{öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõ}ö¼1!å0!î â„0!òD¹·<0!ÿèäh0!äÔ¹ä€âd¹oææ4ÖäÔ¹ì{öùÿõDõýÿí4Öä+öÿÿìæ-öýÿí4Öä%öÿÿìæ;öùÿõ}öì2!äð1!îât2!òD¹ü~ ,2!ÿèäX2!äК䀀âd¹nî|W 䀣ê{öDõýÿí4å;ö}ö4!ä 3!îâ¤3!òD¹ü~ \3!ÿèäˆ3!ä¡ä€âd¹mî|W 䀣ì{öDõýÿí4å;ö}öÀ5!äP4!îã5!òD¹LmŒ4!ÿèä¸4!äÕ ä€€âd¹êÔ4!|W 䀣î„+åð4!ê âК ä{öDõýÿíÌõ ä(öýÿí„+å)ö;ö}öd7!äô5!îâ¤6!òD¹Lm06!ÿèä\6!ä(¿ä€âd¹êx6!|W 䀣ð„+å”6!ê â¡ ä{öDõýÿí¤Ìä(öýÿí„+å)ö;ö}ö9!ä˜7!î â,8!òD¹ðÔ7!ÿèå8!äКä€âd¹ææä&å8!ê âÕ ä{öDõýÿíä&å.öýÿí“ ä(ö)ö;ö}þ89!î âÌ9!òD¹ðt9!ÿèä 9!ä¡ä€âd¹ææä&å¼9!ê â(¿ ä{öDõýÿíä&å.öýÿí“ ä(ö)ö;ö}öÌ:!ø̸è;!øô:!æá;!æ äæd;!ø8;!æD;!æ â T;!¬Æ äæ˜;!øŒ;!æä— æÌ;!øÀ;!æÔ¹æ !ø >!æ`× æ`>!øT>!æäÔ æˆ>!øDÆæ?!øDư>!âIêÜ>!Ô¹ôæä>!4êÿÿÿÿÿÿÿÿ÷8?!ø,!æ`?!ø4'!æˆ?!øT!æ°?!øØ!æØ?!øp!æá@!øÈ !æ(@!øpí æP@!ødë æx@!ø8é æ @!øìæ æÈ@!ø´ä æð@!ø”â æA!øüß æ@A!ø|Ý æhA!ø\Û æA!ø<Ù æ¸A!øøÖ æàA!ø|Ô æB!ø¤Ò æ0B!øÌÐ æXB!ø4Î æ€B!øäÈ æ¨B!øÆ æÐB!øx³ æøB!ø,¥ æ C!ø £ æHC!ø¡ æpC!ø€ž æ˜C!øÌ› æÀC!øl— æèC!øô’ æD!øè æ8D!ø¼Ž æ`D!øpŒ æˆD!øŠ æ°D!ø¸ æØD!ø¨u æáE!øÔr æ(E!øði æPE!øtY æxE!ø æ E!øW æÈE!ølK æðE!ø,G æF!øXD æ@F!ø(@ æhF!ø/ æF!øð+ æ¸F!øü( æàF!øÜ% æG!øø" æ0G!ø æXG!ø< æ€G!øô æ¨G!ù æÐG!øh æøG!ød æ H!ùøæHH!ø`ôæpH!øôðæ˜H!øÏæÀH!ø<ËæèH!øôÆæI!øøÂæ8I!øˆ¾æ`I!øhŽæˆI!øô‡æ°I!ø†æØI!øÄæáJ!øìæ(J!ù|æPJ!ø,næxJ!øàjæ J!øÄbæÈJ!øÐ^æðJ!ø|OæK!ø(Læ@K!øAæhK!ø0=æK!ø2æ¸K!øÈ.æàK!øô&æL!ù#æ0L!øDæXL!øðæ€L!øtæ¨L!øˆæÐL!øìöæøL!ø óæ M!ø´ëæHM!øÀçæpM!øŒÙæ˜M!ø8ÖæÀM!ø¤ËæèM!ø(ÅæN!ø$Áæ8N!ø½æ`N!øðµæˆN!øŒ²æ°N!ø ¯æØN!øü¢æáO!ø¼¹æ(O!øô¹æPO!øì æxO!ø 3!æ O!øð1!æÈO!ù0!æðO!øh!æP!øxü æ@P!øÈð æhP!ø´_ æP!ø¨[ æ¸P!øÔ5 æàP!øÈ1 æQ!øø™æ0Q!øl•æü€µ æpQ!4‘ ähQ!d¹âˆQ!´qä€Q!̸â˜Q!0©ä ô:!¨Q! |ä 8;!¸Q!ô ä Œ;!ÈQ!|rä À;!ØQ!€×ä ô;!èQ!Øä H!ˆR!”©ä T>!˜R!´~ä:DÆ”R&ôO¨R!,!°R!4'!¸R!T!ÀR!Ø!ÈR!p!ÐR!È !äØR!D¹ôOS!ëüS!丩îä@S!ìâd¹ì\S!|W 䀣ìˆS!Ì' äxS!ì æä¤S!p äxS!ðÄ"áÀS!ìS!êIîövõýÿí6ä>ö(ö)ö)ö;öùÿõ}þ´W!âõ(öZõ)öùÿõ{öùÿõýÿíüT äýÿíLUä=öýÿíä&å;öùÿõqõýÿíä&å;öùÿõ;õ(öýÿí€;ä(ö*öýÿíLUä,ö*öýÿíä&å)ö)öùÿõ{öùÿõýÿíüT äýÿíˆ'å=öýÿí… ä;öùÿõqõýÿíˆ'å;öùÿõ>õ(ö!öýÿí€;ä(ö*öýÿíˆ'å,ö*öýÿíä&å)ö)öùÿõqõýÿíˆ'å;öùÿõvõýÿíx†ävõýÿífä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿíLUä,öýÿí… ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíä&åjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}ö ÌkTL áh!âîõ(öZõ)öùÿõ{öùÿõýÿíüT äýÿíLUä=öýÿíä&å;öùÿõqõýÿíä&å;öùÿõ;õ(ö*öýÿíLUä<ö*öýÿíä&å)öùÿõ{öùÿõýÿíüT äýÿíˆ'å=öýÿí… ä;öùÿõqõýÿíˆ'å;öùÿõ>õ(ö!ö(ö*öýÿíˆ'å<ö*öýÿíä&å)ö)öùÿõqõýÿíˆ'å;öùÿõvõýÿíx†ävõýÿífä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿíLUä,öýÿí… ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíä&åjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}öÌkTL Üu!âîh!ä\Rîäøu!ìâ$v!„: äv!ì ð… äv!ôv!┄!¸*á‹âÀv!üȃ!ò¨v!üT ô”r î{öùÿõýÿíüT äýÿíä&å=öýÿí… ä;öùÿõ;õ(öýÿí„: äjõýÿí… ähõýÿí„: äjõqõýÿíä&å)öùÿõDõ[õ;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿíüT äýÿíLUä=öýÿíä&å;öùÿõqõýÿíä&å;öùÿõ;õ(öýÿí€;ä(ö*öýÿíä&å,ö*öýÿíLUä)ö)öùÿõ{öùÿõýÿíüT äýÿíˆ'å=öýÿí… ä;öùÿõqõýÿíˆ'å;öùÿõ>õ(ö!öýÿí€;ä(ö*öýÿíä&å,ö*öýÿíˆ'å)ö)öùÿõqõýÿíˆ'å;öùÿõvõýÿíx†ävõýÿífä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿíLUä,öýÿí… ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíä&åjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}ö Ìk¸*á„!âî@v!äRîä „!ìâL„!„: ä<„!ì ìh„!… ä<„!ð€;ä„„!ì äîä„!âD’!¸*á‡âü„!ü¤‘!öüT ð{öùÿõýÿíüT äýÿíä&å=öýÿí… ä;öùÿõ;õ(öýÿí„: äjõýÿí… ähõýÿí„: äjõqõýÿíä&å)öùÿõDõ[õ;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿíüT äýÿíLUä=öýÿíä&å;öùÿõqõýÿíä&å;öùÿõ;õ(ö*öýÿíä&å<ö*öýÿíLUä)öùÿõ{öùÿõýÿíüT äýÿíˆ'å=öýÿí… ä;öùÿõqõýÿíˆ'å;öùÿõ>õ(ö!ö(ö*öýÿíä&å<ö*öýÿíˆ'å)ö)öùÿõqõýÿíˆ'å;öùÿõvõýÿíx†ävõýÿífä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿíLUä,öýÿí… ä)ö;öùÿõDõZõ;öùÿõ}öùÿõ;õ(öýÿíä&åjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿí¼• ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ[õ;öùÿõ}öùÿõ}öùÿõ}ö Ìk¸*áà‘!â!ä Gîäü‘!ìâ(’!„: ä’!ì ð… ä’!ô”’!âd !¼‰‚âô’!ü$Ÿ!ò¬’!Ð ñÄ’!P!áîÜ’!T+ ò”r î{öùÿõ>õ(öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿíüä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ<õ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿíUä;öùÿõpõýÿíüä;öùÿõpõýÿíUä;öùÿõ}öùÿõ<õùÿõ{öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõ}öÌk¼‰`Ÿ!âîD’!äxFî䌟!ä|Ÿ!äâ 俏Ÿ!¬U䨟!ì ìÔŸ!èÁ䨟!í !UäðŸ!ì äæ !LÁäðŸ!ì8 !üä|Ÿ!ð€;äT !ì äî´ !â°­!¼‰|âü !üœ¬!òÌ !Ð ñä !P!áòT+ î{öùÿõ>õ(öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä)öùÿõ{öùÿõ;õ(ö*öýÿí¬Uä<ö*öýÿíUä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿíüä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ<õ;õ(ö*öýÿíUä<ö*öýÿí¬Uä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿíUä;öùÿõpõýÿíüä;öùÿõpõýÿíUä;öùÿõ}öùÿõ<õùÿõ{öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõ}öÌk¼‰ج!âîd !äÈCîä­!äô¬!äâ äæ0­!¬Uä ­!ì ìL­!èÁä ­!ìx­!Uäh­!ì äæ”­!LÁäh­!ðüäô¬!õ®!âp¸!ì^â`®!ü0·!ò®!Ð ñ0®!P!áîH®!T+ ò”r î{öùÿõ>õ(öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿíüä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ<õ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõpõýÿíUä;öùÿõ<õùÿõ{öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõ}öÌkìl·!âî°­!äüBî䘷!䈷!äâ äæÄ·!¬Uä´·!ì ìà·!èÁä´·!ì ¸!Uäü·!ì äæ(¸!LÁäü·!ìD¸!ü䈷!ð€;ä`¸!ì äîÀ¸!â\Â!ìXâ¹!üHÁ!òظ!Ð ñð¸!P!áòT+ î{öùÿõ>õ(öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä)öùÿõ{öùÿõ;õ(ö*öýÿí¬Uä<ö*öýÿíUä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿíüä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ<õ;õ(ö*öýÿíUä<ö*öýÿí¬Uä)öùÿõpõýÿíUä;öùÿõ<õùÿõ{öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõ}öÌkì„Á!âîp¸!äxEîä°Á!ä Á!äâ äæÜÁ!¬UäÌÁ!ì ìøÁ!èÁäÌÁ!ì$Â!UäÂ!ì äæ@Â!LÁäÂ!ðüä Á!ô¬Â!âÌË!ýPâ Ã!üŒÊ!òÄÂ!Ð ñÜÂ!P!áîôÂ!T+ ò”r î{öùÿõ>õ(öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõpõýÿíUä;öùÿõ<õ;õ(öýÿí€;ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõpõýÿí¬Uä;öùÿõ<õùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿíüä;öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌkýÈÊ!âî\Â!ä°DîäôÊ!ääÊ!äâ äæ Ë!¬UäË!ì ì<Ë!èÁäË!ìhË!UäXË!ì äæ„Ë!LÁäXË!ì Ë!üääÊ!ð€;ä¼Ë!ì äîÌ!âhÔ!ýJâdÌ!üTÓ!ò4Ì!Ð ñLÌ!P!áòT+ î{öùÿõ>õ(öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä)öùÿõ{öùÿõ;õ(ö*öýÿíUä<ö*öýÿí¬Uä)öùÿõpõýÿíUä;öùÿõ<õ;õ(ö*öýÿí¬Uä<ö*öýÿíUä)öùÿõpõýÿí¬Uä;öùÿõ<õùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿíüä;öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌkýÓ!âîÌË!äà@îä¼Ó!ä¬Ó!äâ äæèÓ!¬UäØÓ!ì ìÔ!èÁäØÓ!ì0Ô!Uä Ô!ì äæLÔ!LÁä Ô!ðüä¬Ó!ô¸Ô!âÐâ!¬'…âÕ!üá!òÐÔ!Ð ñèÔ!P!áïÕ!T+ ò”r î{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿíüä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿíUä;öùÿõpõýÿíUä;öùÿõ}öùÿõ<õ;õ(öýÿí€;ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõ}öÌk¬'Ìá!âîhÔ!ää?îäøá!äèá!äâ äæ$â!¬Uäâ!ì ì@â!èÁäâ!ìlâ!Uä\â!ì äæˆâ!LÁä\â!ì¤â!üäèá!ð€;äÀâ!ì äî ã!âdð!¬'âhã!üPï!ò8ã!Ð ñPã!P!áòT+ î{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿíüä)öùÿõ{öùÿõ;õ(ö*öýÿíUä<ö*öýÿí¬Uä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿíUä;öùÿõpõýÿíUä;öùÿõ}öùÿõ<õ;õ(ö*öýÿí¬Uä<ö*öýÿíUä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿí¬Uä;öùÿõpõýÿíUä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõ}öÌk¬'Œï!âîÐâ!äLBîä¸ï!ä¨ï!äâ äæäï!¬UäÔï!ì íð!èÁäÔï!ì,ð!Uäð!ì äæHð!LÁäð!ðüä¨ï!ô´ð!âpø!ŒðDâüð!ü\÷!òÌð!Ð ñäð!P!áò”r î{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿí¬Uä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõDõ[õ;öùÿõ<õ;õ(ö!öýÿí€;ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõpõýÿíUä;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿíUäjõýÿíLÁä)ö;öùÿõ}öÌkŒð˜÷!îdð!äˆAîä´÷!ìâà÷!¬UäÐ÷!ì ìü÷!èÁäÐ÷!ì(ø!Uäø!ì äæDø!LÁäø!ð€;ä`ø!ì äîÀø!âØÿ!Œð@âðø!üðþ!òØø!Ð õP!áî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿí¬Uä)öùÿõ{öùÿõ;õ(ö*öýÿíUä<ö*öýÿí¬Uä)öùÿõDõ[õ;öùÿõ<õ;õ(ö!ö(ö*öýÿí¬Uä<ö*öýÿíUä)ö)öùÿõpõýÿíUä;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿíUäjõýÿíLÁä)ö;öùÿõ}öÌkŒð,ÿ!îpø!ä3îäHÿ!ìâtÿ!¬Uädÿ!ì ìÿ!èÁädÿ!ì¼ÿ!Uä¬ÿ!ì äêLÁä¬ÿ!ô("â ˆ""@™cáX"ü !"ò@"„¢õ”r î{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öýÿí, ä>öÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí`û äjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,övõýÿíx†ävõýÿí¬ïä(öýÿí„: ä,öýÿí… ä,öýÿí€;ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí„¢åýÿíˆ'å=öýÿí… ä-öÿÿìæ;öùÿõ;õ(öýÿí`û äjõýÿíˆ'å)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿíˆ'å,övõýÿíx†ävõýÿí$;ä(öýÿí„: ä,öýÿí… ä,öýÿí€;ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí„¢åýÿí,)å=öýÿí„: ä+öýÿí, ä/öÿÿìæ;öùÿõýÿí@ö ä(öýÿí„: ä,öýÿí,)å,öýÿíˆ'å,öýÿí€;ä)ö;öùÿõýÿí„¢åýÿíä&å=öýÿí„: ä+öÿÿìæ;öùÿõýÿí,)å=öýÿíˆ'å;öùÿõqõýÿíˆ'å;öùÿõ>õ(öýÿíä&å<öýÿíˆ'å)öùÿõ{öùÿõ>õ(öýÿí€;ä(ö*öýÿíä&å,ö*öýÿí,)å)ö)öùÿõpõýÿíä&å;öùÿõ>õ(öýÿíä&å<öýÿíˆ'åiõ!öýÿí€;ä(ö*öýÿíˆ'å,ö*öýÿí,)å)ö)öùÿõqõýÿíˆ'å;öùÿõ;õ(öýÿíä&åmõýÿíˆ'å)öùÿõCõ;öùÿõvõýÿíx†ävõýÿífä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõpõýÿíä&å;öùÿõqõýÿíˆ'å;öùÿõ}öùÿõ;õ(öýÿí`û ä<öýÿíä&å)öùÿõýÿí… ä=öýÿíä&å;öùÿõ<õùÿõ{öùÿõýÿí„: ä=öýÿíä&å;öùÿõvõýÿíx†ävõýÿífä(öýÿíä&å,öýÿí,)å)ö;öùÿõ}öùÿõýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ}öùÿõ=õ(öýÿí, ä)öùÿõ{öùÿõ9õÿÿìæ:öùÿõ{öùÿõýÿí„¢åýÿíä&å=öýÿí„: ä;öùÿõpõýÿíä&å;öùÿõ;õ(öýÿí€;ä(ö*öýÿíä&å,ö*öýÿí„: ä)ö)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿíä&å)ö;öùÿõ}öùÿõCõ;öùÿõ9õÿÿìæ:öùÿõýÿí(Vå(öýÿí„: ä,öýÿí„: ä+öÿÿìæ,öýÿí„: ä+öÿÿìæ,öýÿí€;ä)ö;öùÿõCõ;öùÿõ}öùÿõ}öÌk@™Ü!"âîØÿ!äÄ2îäø!"ìâ$""„: ä""ì ì@""`û ä""ì\""… ä""ð€;äx""ì äîØ""ât7"@™Óâð""ü¸6"ö„¢ñ{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öýÿí, ä>öÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí`û äjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,övõýÿíx†ävõýÿí¬ïä(öýÿí„: ä,öýÿí… ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí„¢åýÿíˆ'å=öýÿí… ä-öÿÿìæ;öùÿõ;õ(öýÿí`û äjõýÿíˆ'å)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿíˆ'å,övõýÿíx†ävõýÿí$;ä(öýÿí„: ä,öýÿí… ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõýÿí„¢åýÿí,)å=öýÿí„: ä+öýÿí, ä/öÿÿìæ;öùÿõýÿí(Vå(öýÿí„: ä,öýÿí,)å,öýÿíˆ'å)ö;öùÿõýÿíö(ö)ö,ö*öýÿí,)å)ö)ö;öùÿõ;õ(öýÿí`û ä<öýÿí,)å)öùÿõýÿí… ä=öýÿí,)å;öùÿõ<õùÿõýÿí„: ä=öýÿí,)å;öùÿõýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ}öùÿõýÿíø® ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ}öÌk@™ô6"âîˆ""ä„/îä7"ìâ<7"„: ä,7"ì ìX7"`û ä,7"ð… ä,7"ôÄ7"âÈE"Tχâ 8"ü´D"òÜ7"ôã ðô7"„¢áò”r î{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõýÿí„¢åýÿíüä=öýÿí,ä;öùÿõ@õ(ö;öýÿí„: äkõýÿí… äiõýÿíüäkõýÿídò ä;öpõýÿí„: ä,öpõýÿíüä)öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõýÿí€×äýÿí, ä=öýÿíüä-öýÿí,ä;öùÿõ;õ(öýÿí, äjõÿÿô)öùÿõDõýÿíüä;öùÿõvõýÿíx†ävõýÿídñä(öýÿí,ä,öýÿíüä,öýÿí€;ä)ö;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(öýÿí€;ä(ö*öýÿí„: ä,ö*öýÿí,ä)ö)öùÿõýÿíÀÔä(öýÿí,ä,öýÿí, ä,öýÿí€×ä(öÿÿô)ö,ö*öýÿí„: ä,öýÿí€;ä)ö;öùÿõvõýÿíx†ävõýÿíX«ä(öýÿí,ä,öýÿíüä,öýÿí€;ä)ö;öùÿõDõýÿíüä;öùÿõ}öÌkTÏðD"âît7"ä¼.îäE"ä E"äâ äæHE"„: ä8E"ì ìdE"… ä8E"ì€E",ä E"ìœE"dò ä E"ð€;ä¸E"ì äîF"ãS"TÏ~âHF"üR"ò0F"ôã ô„¢áî{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõýÿí„¢åýÿíüä=öýÿí,ä;öùÿõ@õ(ö;öýÿí„: äkõýÿí… äiõýÿíüäkõýÿídò ä;öpõýÿí„: ä,öpõýÿíüä)öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõýÿí€×äýÿí, ä=öýÿíüä-öýÿí,ä;öùÿõ;õ(öýÿí, äjõÿÿô)öùÿõDõýÿíüä;öùÿõvõýÿíx†ävõýÿídñä(öýÿí,ä,öýÿíüä)ö;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(ö*öýÿí„: ä<ö*öýÿí,ä)öùÿõýÿíÀÔä(öýÿí,ä,öýÿí, ä,öýÿí€×ä(öÿÿô)ö,ö*öýÿí„: ä)ö;öùÿõvõýÿíx†ävõýÿíX«ä(öýÿí,ä,öýÿíüä)ö;öùÿõDõýÿíüä;öùÿõ}öÌkTÏTR"âîÈE"äô0îä€R"äpR"äâ 俬R"„: äœR"ì ìÈR"… äœR"ìäR",äpR"ðdò äpR"ôPS"âXd"J ªâ€S"üpc"òhS"„¢õ”r î{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíövõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí\v ä=öýÿíÛä-öýÿí„: ä;öùÿõ=õ(öýÿí\v ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõ;öùÿõ9õÿÿìæ:öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,övõýÿíx†ävõýÿí¬ïä(öýÿí„: ä,öýÿí… ä,öýÿí€;ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõvõýÿíx†ävõýÿídñä(öýÿí„: ä,öýÿíÛä,öýÿí€;ä)ö;öùÿõ@õ(öýÿí„¢åýÿíä&å=öýÿíÛä;öýÿíä&åkõýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíä&å,ö*öýÿí„: ä)ö)öùÿõ{öùÿõýÿíövõýÿí |äýÿíövõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí\v ä=öýÿíÛä-öýÿí„: ä;öùÿõ=õ(öýÿí\v ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõ;öùÿõ9õÿÿìæ:öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,övõýÿíx†ävõýÿí¬ïä(öýÿí„: ä,öýÿí… ä)ö)ö;öùÿõDõ;öùÿõ}öùÿõvõýÿíx†ävõýÿídñä(öýÿí„: ä,öýÿíÛä)ö;öùÿõ@õ(öýÿí„¢åýÿíä&å=öýÿíÛä;öýÿíä&åkõýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõ;õ(ö*öýÿíä&å<ö*öýÿí„: ä)öùÿõ{öùÿõýÿíövõýÿí€×äýÿí´† ä;öùÿõýÿí´† äýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿí, älõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõqõýÿí… ä;öùÿõ;õ(öýÿí€;ä(ö*öýÿí… ä,ö*öýÿí„: ä)ö)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíø® ä(öýÿí„: ä,öýÿí… ä,öýÿí€;ä)ö;öùÿõDõ;öùÿõ}öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿílyä;öùÿõýÿíäŽä<öýÿílyä>öýÿí|ä(öýÿí, ä)ö;öùÿõýÿí@ ä(öýÿí„: ä,öýÿí… ä,öýÿí|ä.öýÿíÌ' ä(ö)ö,öýÿí|ä.öýÿíp ä(ö)ö,öýÿí€;ä)ö;öùÿõ}öÌkpÄ@‚"âîdt"ä@,îä\‚"ì∂"„: äx‚"ì 줂"… äx‚"ð€;äÀ‚"ì äî ƒ"âP"pÄ…â8ƒ"ü°"ö„¢ñ{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí´† ä;öùÿõýÿí´† äýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿí, älõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõqõýÿí… ä;öùÿõ;õ(ö*öýÿí… ä<ö*öýÿí„: ä)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíø® ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ;öùÿõ}öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿílyä;öùÿõýÿíäŽä<öýÿílyä>öýÿí|ä(öýÿí, ä)ö;öùÿõýÿí@ ä(öýÿí„: ä,öýÿí… ä,öýÿí|ä.öýÿíÌ' ä(ö)ö,öýÿí|ä.öýÿíp ä(ö)ö)ö;öùÿõ}öÌkpÄì"âîЂ"ä.îä"ìâ4"„: ä$"ì ð… ä$"ô "â¨"@ ëâè"üð¦"ò¸"æðÐ"4åò”r î{öùÿõõ õýÿíÌLä<öýÿíæä>övõýÿí€×äýÿí´† ä;öùÿõýÿí´† äýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿí, älõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõqõýÿí… ä;öùÿõ;õ(öýÿí€;ä(ö*öýÿí… ä,ö*öýÿí„: ä)ö)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíø® ä(öýÿí„: ä,öýÿí… ä,öýÿí€;ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´† äýÿí„ä=öýÿí, ä-öýÿí, ä/öÿÿìæ;öùÿõýÿíæäýÿíÛä=öýÿí„: ä+öýÿí„ä;öùÿõ;õ(öýÿí, älõýÿíȬä-öýÿí$N ä)öùÿõ{öùÿõýÿíîä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä,öýÿí€;ä)ö;öùÿõýÿíîä(öýÿíÛä,öýÿí… ä,öýÿí$N ä+öýÿí„ä,öýÿí€;ä)ö;öùÿõvõýÿíx†ävõýÿípôä(öýÿí$N ä,öýÿí$N ä+öýÿí„ä,öýÿí$N ä+öýÿí„ä,öýÿí$N ä+öýÿí, ä,öýÿí„: ä,öýÿí€;ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí@ ä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä,öýÿíȬä,öýÿí€;ä)ö;öùÿõýÿí@ ä(öýÿíÛä,öýÿí… ä,öýÿí$N ä,öýÿíȬä,öýÿí€;ä)ö;öùÿõýÿí`ä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿí€;ä,öýÿíÛä-öýÿí„: ä,öýÿí… ä-öýÿíÛä,öýÿí$N ä,öùÿõýÿíȬä)ö;öùÿõ}öÌk@ ,§"âîP"ä<-îäH§"ìât§"„: äd§"ì ì§"… äd§"ì¼§"$N 䬧"ì äæا"Ȭ䬧"ð€;äô§"ì äîT¨"âĽ"@ Ùℨ"üܼ"òl¨"æô4åî{öùÿõõ õýÿíÌLä<öýÿíæä>övõýÿí€×äýÿí´† ä;öùÿõýÿí´† äýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿí, älõÿÿìæ)öùÿõDõ;öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõqõýÿí… ä;öùÿõ;õ(ö*öýÿí… ä<ö*öýÿí„: ä)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíø® ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´† äýÿí„ä=öýÿí, ä-öýÿí, ä/öÿÿìæ;öùÿõýÿíæäýÿíÛä=öýÿí„: ä+öýÿí„ä;öùÿõ;õ(öýÿí, älõýÿíȬä-öýÿí$N ä)öùÿõ{öùÿõýÿíîä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä)ö;öùÿõýÿíîä(öýÿíÛä,öýÿí… ä,öýÿí$N ä+öýÿí„ä)ö;öùÿõvõýÿíx†ävõýÿípôä(öýÿí$N ä,öýÿí$N ä+öýÿí„ä,öýÿí$N ä+öýÿí„ä,öýÿí$N ä+öýÿí, ä,öýÿí„: ä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí@ ä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä,öýÿíȬä)ö;öùÿõýÿí@ ä(öýÿíÛä,öýÿí… ä,öýÿí$N ä,öýÿíȬä)ö;öùÿõýÿí`ä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿíÛä-öýÿí„: ä,öýÿí… ä-öýÿíÛä,öýÿí$N ä,öýÿíȬä)ö;öùÿõ}öÌk@ ½"âî¨"äÌ«îä4½"ìâ`½"„: äP½"ì ì|½"… äP½"쨽"$N 䘽"ì äêȬ䘽"ô¾"âlÔ"îáâ\¾"ütÓ"ò,¾"æðD¾"4åò”r î{öùÿõõ õýÿíÌLä<öýÿíæä>övõýÿí€×äýÿí´† ä;öùÿõýÿí´† äýÿí, ä=öýÿíèÁä-öýÿí¬Uä;öùÿõ;õ(öýÿí, älõÿÿô)öùÿõDõ;öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõ*öýÿíUä=ö*öýÿí¬Uä;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*ö(öýÿíèÁä-öÿÿìæ)ö,ö*öýÿí¬Uä)ö)öùÿõvõýÿíx†ävõýÿíÞä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä)ö;öùÿõ<õùÿõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíø® ä(öýÿí¬Uä,öýÿíèÁä,öýÿí€;ä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´† äýÿí„ä=öýÿí, ä-öýÿí, ä/öÿÿìæ;öùÿõýÿíæäýÿíÛä=öýÿí¬Uä+öýÿí„ä;öùÿõýÿí@ ä(öýÿí¬Uä,öýÿíÛä,öýÿíUä,öýÿíUä+öýÿí„ä,öýÿí€;ä)ö;öùÿõýÿí@ ä(öýÿíÛä,öýÿíèÁä,öýÿíUä+öýÿí„ä,öýÿíUä+öýÿí, ä,öýÿí€;ä)ö;öùÿõvõýÿíx†ävõýÿípôä(öýÿí¬Uä,öýÿí¬Uä+öýÿí„ä,öýÿí¬Uä+öýÿí„ä,öýÿí¬Uä+öýÿí, ä,öýÿíUä,öýÿí€;ä)ö;öùÿõ}öÌkî°Ó"âîĽ"ä@¬îäÌÓ"ìâøÓ"¬UäèÓ"ì ìÔ"èÁäèÓ"ì@Ô"Uä0Ô"ì äê€;ä\Ô"ì äî¼Ô"âÈé"îÖâìÔ"üüè"òÔÔ"æô4åî{öùÿõõ õýÿíÌLä<öýÿíæä>övõýÿí€×äýÿí´† ä;öùÿõýÿí´† äýÿí, ä=öýÿíèÁä-öýÿí¬Uä;öùÿõ;õ(öýÿí, älõÿÿô)öùÿõDõ;öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõ*öýÿíUä=ö*öýÿí¬Uä;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, äjõÿÿìæ)öùÿõ{öùÿõ;õ(ö*ö(öýÿíèÁä-öÿÿìæ)ö<ö*öýÿí¬Uä)öùÿõvõýÿíx†ävõýÿíÞä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä)ö;öùÿõ<õùÿõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä)ö;öùÿõDõ;öùÿõ}öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíø® ä(öýÿí¬Uä,öýÿíèÁä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä)ö;öùÿõDõ;öùÿõ}öùÿõýÿí´† äýÿí„ä=öýÿí, ä-öýÿí, ä/öÿÿìæ;öùÿõýÿíæäýÿíÛä=öýÿí¬Uä+öýÿí„ä;öùÿõýÿí@ ä(öýÿí¬Uä,öýÿíÛä,öýÿíUä,öýÿíUä+öýÿí„ä)ö;öùÿõýÿí@ ä(öýÿíÛä,öýÿíèÁä,öýÿíUä+öýÿí„ä,öýÿíUä+öýÿí, ä)ö;öùÿõvõýÿíx†ävõýÿípôä(öýÿí¬Uä,öýÿí¬Uä+öýÿí„ä,öýÿí¬Uä+öýÿí„ä,öýÿí¬Uä+öýÿí, ä,öýÿíUä)ö;öùÿõ}öÌkî8é"âîlÔ"äÌ©îäTé"ìâ€é"¬Uäpé"ì ìœé"èÁäpé"ðUä¸é"ì äîê"â ¤#èa&áHê"üØ#ò0ê"„¢õ”r î{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí´† ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõýÿí´† äýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿí, älõÿÿìæ)öùÿõCõ;öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíð3ä(öýÿí„: ä,öýÿí… ä,öýÿí€;ä)ö;öùÿõCõ;öùÿõ}öùÿõõ!õ õýÿídfä=öýÿíмä/öÿÿìæ;öùÿõõ õýÿí4Jä=ö-öýÿídfä+öÿÿìæ;öùÿõýÿí„¢åýÿí,)å=öýÿí„: ä+ö(öýÿí, ä/öÿÿìæ+öýÿí4Jä%öýÿídfä)ö;öùÿõ;õ(öpõýÿí4Jämõýÿídfä)öùÿõýÿí4Jä=ö-öýÿídfä+öÿÿìæ;öùÿõýÿí„¢åýÿí˜ä=öýÿí„: ä+ö(öÿÿìæ*öýÿí, ä/öÿÿìæ+öýÿí4Jä%öýÿídfä)ö;öùÿõ;õ(öpõýÿí4Jämõýÿídfä)öùÿõýÿí4Jä=ö-öýÿídfä+öÿÿìæ;öùÿõýÿí„¢åýÿíˆ'å=öýÿí… ä-öÿÿìæ;öùÿõýÿí@ö ä(öýÿí,)å,öýÿí˜ä,öýÿíˆ'å,öýÿí€;ä)ö;öùÿõùÿõýÿí,)å=öýÿí„: ä;öùÿõýÿí˜ä=öýÿíˆ'å;öùÿõ>õ(öýÿí€;ä(ö*öýÿí,)å,ö*öýÿíˆ'å)ö)öùÿõpõýÿí,)å;öùÿõ>õ(öýÿí,)åkõqõýÿí˜äiõ!öýÿí€;ä(ö*öýÿí˜ä,ö*öýÿíˆ'å)ö)öùÿõ{ö}öùÿõ;õ(öýÿí,)å<öýÿí˜ä)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí,)å,öýÿí˜ä)ö;öùÿõpõýÿí,)å;öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(öýÿí€;ä(ö*öýÿí,)å,ö*öýÿíˆ'å)ö)öùÿõpõýÿí,)å;öùÿõ>õ(ö!öýÿí€;ä(ö*öqõýÿí˜ä,ö*öýÿíˆ'å)ö)öùÿõ{ö}öùÿõ;õ(öýÿí,)åmõýÿí˜ä)öùÿõCõ;öùÿõvõýÿíx†ävõýÿífä(öýÿí,)å,öýÿí˜ä)ö;öùÿõpõýÿí,)å;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí,)åjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí,)å,öýÿíˆ'å)ö;öùÿõpõýÿí,)å;öùÿõùÿõýÿí˜ä=öýÿí… ä;öùÿõ;õ(ö!öýÿí€;ä(ö*öýÿí„: ä,ö*öqõýÿí˜ä)ö)öùÿõ{öùÿõ>õ(öýÿí,)åkõýÿí… äiõ!öýÿí€;ä(ö*öýÿí„: ä,ö*öýÿí,)å)ö)öùÿõpõýÿí,)å;öùÿõ;õ(öýÿí,)å<öýÿí˜ä)öùÿõvõýÿíx†ävõýÿífä(öýÿí,)å,öýÿí˜ä)ö;öùÿõ}öùÿõ;õ(öýÿí,)å<öýÿí˜ä)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(ö!öýÿí€;ä(ö*öýÿí„: ä,ö*öýÿí,)å)ö)öùÿõpõýÿí,)å;öùÿõ>õ(öýÿí€;ä(ö*öýÿí„: ä,ö*öqõýÿí˜ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿí,)åmõýÿí˜ä)öùÿõCõ;öùÿõvõýÿíx†ävõýÿífä(öýÿí,)å,öýÿí˜ä)ö;öùÿõpõýÿí,)å;öùÿõ}öùÿõ}öùÿõùÿõýÿí„: ä=öýÿí,)å;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí,)å-öýÿí„: ä<öýÿí… ä-öýÿí,)å)öùÿõ{öùÿõvõýÿíx†ävõýÿíèaä(öýÿí„: ä,öýÿí,)å,öýÿí€;ä)ö;öùÿõùÿõýÿí„: ä=öýÿí,)å;öùÿõ}öùÿõ<õùÿõ{öùÿõvõýÿíx†ävõýÿíèaä(öýÿí,)å,öýÿí… ä,öýÿí€;ä)ö;öùÿõùÿõýÿí… ä=öýÿí,)å;öùÿõ}öùÿõ}öùÿõ}öùÿõ}öÌkèa#âîÈé"äĪîä0#ìâ\#„: äL#ì ìx#… äL#ð€;ä”#ì äîô#â Ì>#èaLá #ü,>#ö„¢ñ{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí´† ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öZõ)öùÿõ{öùÿõýÿí´† äýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿí, älõÿÿìæ)öùÿõCõ;öùÿõ;õ(öýÿí, älõýÿíмä)öùÿõ{öùÿõýÿíð3ä(öýÿí„: ä,öýÿí… ä)ö;öùÿõCõ;öùÿõ}öùÿõõ!õ õýÿídfä=öýÿíмä/öÿÿìæ;öùÿõõ õýÿí4Jä=ö-öýÿídfä+öÿÿìæ;öùÿõýÿí„¢åýÿí,)å=öýÿí„: ä+ö(öýÿí, ä/öÿÿìæ+öýÿí4Jä%öýÿídfä)ö;öùÿõ;õ(öpõýÿí4Jämõýÿídfä)öùÿõýÿí4Jä=ö-öýÿídfä+öÿÿìæ;öùÿõýÿí„¢åýÿí˜ä=öýÿí„: ä+ö(öÿÿìæ*öýÿí, ä/öÿÿìæ+öýÿí4Jä%öýÿídfä)ö;öùÿõ;õ(öpõýÿí4Jämõýÿídfä)öùÿõýÿí4Jä=ö-öýÿídfä+öÿÿìæ;öùÿõýÿí„¢åýÿíˆ'å=öýÿí… ä-öÿÿìæ;öùÿõýÿí@ö ä(öýÿí,)å,öýÿí˜ä,öýÿíˆ'å)ö;öùÿõýÿí,)å=öýÿí¤× ä(öýÿí„: ä,öýÿíˆ'å,öýÿí”…ä<öýÿíì$ä<öýÿíö>ö(öýÿíì$ä<öýÿíö(ö)ö,ö*öýÿíˆ'å)ö)ö;öùÿõ;õ(öýÿí,)åjõýÿí„: ä)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí,)å,öýÿíˆ'å)ö;öùÿõpõýÿí,)å;öùÿõýÿí,)å=öýÿí¤× ä(öýÿí,)å,öýÿí… ä,öýÿí@èä(öýÿíŒIä<öýÿíì$ä<öýÿíö>ö(öýÿíì$ä<öýÿíö(ö)ö,ö*öýÿí„: ä)ö)ö)ö;öùÿõùÿõýÿí„: ä=öýÿí,)å;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí,)å-öýÿí„: ä<öýÿí… ä-öýÿí,)å)öùÿõ{öùÿõvõýÿíx†ävõýÿíèaä(öýÿí„: ä,öýÿí,)å)ö;öùÿõùÿõýÿí„: ä=öýÿí,)å;öùÿõ}öùÿõ<õùÿõ{öùÿõvõýÿíx†ävõýÿíèaä(öýÿí,)å,öýÿí… ä)ö;öùÿõùÿõýÿí… ä=öýÿí,)å;öùÿõ}öùÿõ}öùÿõ}öùÿõ}öÌkèah>#âî¤#伨îä„>#ìâ°>#„: ä >#ì ð… ä >#ô?#âØI#ø® hâL?#ü I#ò4?#„¢õ”r î{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿílyä;öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí„¢åýÿíä&å=öýÿí„: ä;öùÿõ@õ(öpõýÿíä&å;öýÿíä&å<öýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõýÿílyäýÿíÄä=ö*öýÿíä&å;öùÿõýÿí„¢åýÿíˆ'å=öýÿíä&å;öùÿõýÿí„¢åýÿí(å=öýÿíˆ'å;öùÿõ>õ(öýÿí„: ä<öýÿí(åiõýÿí€;ä(öýÿíÄä,ö*öqõýÿíˆ'å)ö)öùÿõ{öùÿõ*öýÿí(å=ö*öýÿíˆ'å;öùÿõqõýÿí(å;öùÿõ}öùÿõ*öýÿí(å=öýÿíÄä;öùÿõ}öùÿõ}öùÿõ}öÌkø® HI#âîÌ>#ät©îädI#ìâI#„: ä€I#ì ì¬I#… ä€I#ð€;äÈI#ì äî(J#âXT#ø® eâ@J#ü¸S#ö„¢ñ{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿílyä;öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí„¢åýÿíä&å=öýÿí„: ä;öùÿõ@õ(öpõýÿíä&å;öýÿíä&å<öýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõýÿílyäýÿíÄä=ö*öýÿíä&å;öùÿõýÿí„¢åýÿíˆ'å=öýÿíä&å;öùÿõýÿí„¢åýÿí(å=öýÿíˆ'å;öùÿõ>õ(öýÿí„: ä<öýÿí(åiõýÿíÄä<ö*öqõýÿíˆ'å)öùÿõ{öùÿõ*öýÿí(å=ö*öýÿíˆ'å;öùÿõqõýÿí(å;öùÿõ}öùÿõ*öýÿí(å=öýÿíÄä;öùÿõ}öùÿõ}öùÿõ}öÌkø® ôS#âîØI#ä¨îäT#ìâövõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öZõ)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíÜj ä,ö*öýÿílLä)ö)öùÿõ{öùÿõýÿíövõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öZõ)öùÿõ{öùÿõ;õ(ö*öýÿíÜj ä<ö*öýÿílLä)öùÿõ{öùÿõýÿíövõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíövõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öýÿídWälõýÿí, ä)öùÿõ{öùÿõýÿí„¢åýÿíøìä=öýÿí„: ä+öýÿídWä;öùÿõ;õ(öýÿídWäjõýÿí, ähõýÿí€;ä(ö*öýÿíøìä,ö*ö(öýÿíøìä-öÿÿìæ)ö)ö)öùÿõ{öùÿõqõýÿídWä;öùÿõqõýÿíøìä;öùÿõ}öùÿõ;õ(ö!öýÿí€;ä(öýÿíxÃä,ö*öýÿíøìä)ö)öùÿõCõ;öùÿõ*öýÿíô”ä=ö*öýÿíøìä;öùÿõýÿíô”ä=öýÿíøìä;öùÿõpõýÿídWä;öùÿõýÿídWä^õÿÿìæ;öùÿõ}öùÿõ*öýÿíô”ä=öýÿíxÃä;öùÿõ}öÌkÀÔõ#âîHé#䨔îä0õ#ìâ\õ#„: äLõ#ì ìˆõ#, äxõ#ì 俤õ#\‹äxõ#ìàõ#xÃäÀõ#ê âÐõ# ä äê€;äüõ#ì äî\ö#â,$ÀÔpâ¤ö#ü$$òtö#„¢ñŒö#Ôfòõ(öýÿídWälõýÿí, ä)öùÿõ{öùÿõýÿí„¢åýÿíøìä=öýÿí„: ä+öýÿídWä;öùÿõ;õ(öýÿídWäjõýÿí, ähõ*öýÿíøìä<ö*ö(öýÿíøìä-öÿÿìæ)ö)öùÿõ{öùÿõqõýÿídWä;öùÿõqõýÿíøìä;öùÿõ}öùÿõ;õ(ö!ö(öýÿíxÃä<ö*öýÿíøìä)ö)öùÿõCõ;öùÿõ*öýÿíô”ä=ö*öýÿíøìä;öùÿõýÿíô”ä=öýÿíøìä;öùÿõpõýÿídWä;öùÿõýÿídWä^õÿÿìæ;öùÿõ}öùÿõ*öýÿíô”ä=öýÿíxÃä;öùÿõ}öÌkÀÔ`$âî ö#äÈ…îä|$ìâ¨$„: ä˜$ì ìÔ$, äÄ$ì äæð$\‹äÄ$ðxÃä $ê â$ ä äî|$âx$Xg â¬$ü¬$ò”$„¢õ”r î{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(öýÿí€;ä(ö*öýÿíÜj ä,öýÿíÄä)ö)ö;öùÿõ*öýÿíô”ä=öýÿíÄä;öùÿõ}öùÿõ}öÌkXgè$âî,$ä̆îä$ìâ0$„: ä $ì ìL$… ä $ð€;äh$ì äîÈ$âð!$Xgšâà$üP!$ö„¢ñ{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí |äýÿíõ(ö*öýÿíÜj ä<öýÿíÄä)ö;öùÿõ*öýÿíô”ä=öýÿíÄä;öùÿõ}öùÿõ}öÌkXgŒ!$âîx$äЄîä¨!$ìâÔ!$„: äÄ!$ì ð… äÄ!$ô@"$â€.$  wâp"$ü˜-$òX"$üT ô”r î{öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿí |äýÿíöýÿíüôä(övõýÿíx†ävõýÿíÔ6 ä(öýÿí ä,öýÿí„ä)ö)ö;öùÿõýÿí`ä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿí€;ä,öýÿí ä,öýÿí„ä,öýÿíüôä.öýÿíÌ' ä(ö)ö,öýÿíüôä.öýÿíp ä(ö)ö)ö;öùÿõ}öÌk  Ô-$âîð!$ä0…îäð-$ìâ.$„: ä .$ì ì8.$Ûä .$ìT.$… ä .$ð€;äp.$ì äîÐ.$â ÀQ$`aá0/$üHP$òè.$üT ñ/$”r î/$Ôfò„¢áî{öùÿõ;õ(öýÿí„: äjõýÿíÛähõýÿíÛäjõýÿí… ä)öùÿõDõ;öùÿõ;õ(öýÿí ä+öýÿí„äjõÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíÛä,ö*öýÿí„: ä)ö)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿíÛä)ö;öùÿõDõ;öùÿõ}öùÿõýÿíÔfäýÿíð ä=öXõ<öýÿíÔfä>ö(öýÿíȬä-öýÿí$N ä)ö;öùÿõ;õ(öýÿí älõýÿí„äiõýÿí älõýÿíð ä)öùÿõvõýÿíx†ävõýÿípôä(öýÿí$N ä,övõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä)ö,öýÿíÛä,öýÿí… ä,öýÿí„: ä,öýÿí€;ä)ö;öùÿõ<õ;õ(öýÿí„älõýÿíð ä)öùÿõýÿíd\ ä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä,övõýÿíx†ävõýÿ팊ä(öýÿíÛä,öýÿí… ä,öýÿí$N ä)ö,öýÿí… ä,öýÿí€;ä)ö;öùÿõ<õùÿõ{öùÿõýÿíüT äýÿí¬A ä,öýÿíHC ä;öùÿõýÿíÔfäýÿíä,öýÿíØDä;öùÿõ;õ(öýÿí älõýÿí„ä)öùÿõ{öùÿõýÿíØDä=öýÿí„ä/öÿÿìæ;öùÿõýÿíHC ä=öýÿíÛä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíHC ä,öýÿíØDä)ö;öùÿõýÿí¬A ä=övõýÿíx†ävõýÿí€Ï ä(öýÿí„: ä,öýÿíÛä,ö*öýÿíHC ä,öýÿí€;ä)ö;öùÿõýÿíä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí¬A ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíä=öýÿí ä/öÿÿìæ;öùÿõýÿí¬A ä=öýÿí„: ä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿí¬A ä,öýÿíä)ö;öùÿõýÿíHC ä=övõýÿíx†ävõýÿíÈaä(öýÿíÛä,öýÿí… ä,ö*öýÿí¬A ä,öýÿí€;ä)ö;öùÿõýÿíØDä=övõýÿíx†ävõýÿí(èä(öýÿíÛä,öýÿíHC ä)ö;öùÿõ}öùÿõýÿíÛä=öýÿí´Ùä(öýÿí¬A ä,öýÿíÛä,öýÿíHC ä,öýÿí ä-öýÿíä,öýÿíØDä,öýÿí$N ä,öýÿíȬä)ö;öùÿõýÿí`ä(öýÿí„: ä,öýÿí¬A ä,öýÿíÛä,öýÿí€;ä,öýÿíä,öýÿíØDä,öýÿí$N ä,öýÿíȬä)ö;öùÿõýÿí`ä(öýÿíÛä,öýÿíHC ä,öýÿí… ä,öýÿí€;ä,öýÿí ä-öýÿíä,öýÿí„ä-öýÿíØDä,öýÿí$N ä,öýÿíȬä)ö;öùÿõ}öùÿõ}öÌk`„P$âî€.$ä\ƒîä P$ìâÌP$„: ä¼P$ì ìèP$Ûä¼P$ìQ$… ä¼P$ì0Q$€;ä Q$ì äæ\Q$ äLQ$ì äæxQ$„äLQ$ì¤Q$$N ä”Q$ì äêȬä”Q$ôR$âÜ]$  uâ(R$ü ]$öüT ð{öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿí€×äýÿí€×ä;öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿí |äýÿíöýÿíüôä(övõýÿíx†ävõýÿíÔ6 ä(öýÿí ä,öýÿí„ä)ö)ö;öùÿõýÿí`ä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿí ä,öýÿí„ä,öýÿíüôä.öýÿíÌ' ä(ö)ö,öýÿíüôä.öýÿíp ä(ö)ö)ö;öùÿõ}öÌk  \]$âîÀQ$ä„îäx]$ìâ¤]$„: ä”]$ì ìÀ]$Ûä”]$ð… ä”]$ô,^$â p$`Rát^$ü$~$òD^$üT ð\^$Ôfò„¢áî{öùÿõ;õ(öýÿí„: äjõýÿíÛähõýÿíÛäjõýÿí… ä)öùÿõDõ;öùÿõ;õ(öýÿí ä+öýÿí„äjõÿÿìæ)öùÿõ{öùÿõ;õ(ö*öýÿíÛä<ö*öýÿí„: ä)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿíÛä)ö;öùÿõDõ;öùÿõ}öùÿõýÿíÔfäýÿíð ä=öXõ<öýÿíÔfä>ö(öýÿíȬä-öýÿí$N ä)ö;öùÿõ;õ(öýÿí älõýÿí„äiõýÿí älõýÿíð ä)öùÿõvõýÿíx†ävõýÿípôä(öýÿí$N ä,övõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä)ö,öýÿíÛä,öýÿí… ä,öýÿí„: ä)ö;öùÿõ<õ;õ(öýÿí„älõýÿíð ä)öùÿõýÿíd\ ä(öýÿí„: ä,öýÿíÛä,öýÿí$N ä,övõýÿíx†ävõýÿ팊ä(öýÿíÛä,öýÿí… ä,öýÿí$N ä)ö,öýÿí… ä)ö;öùÿõ<õùÿõ{öùÿõýÿíüT äýÿí¬A ä,öýÿíHC ä;öùÿõýÿíÔfäýÿíä,öýÿíØDä;öùÿõ;õ(öýÿí ä<öýÿí„ä)öùÿõ{öùÿõýÿíØDä=öýÿí„ä/öÿÿìæ;öùÿõýÿíHC ä=öýÿíÛä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíHC ä,öýÿíØDä)ö;öùÿõýÿí¬A ä=övõýÿíx†ävõýÿí€Ï ä(öýÿí„: ä,öýÿíÛä,ö*öýÿíHC ä)ö;öùÿõýÿíä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí¬A ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíä=öýÿí ä/öÿÿìæ;öùÿõýÿí¬A ä=öýÿí„: ä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿí¬A ä,öýÿíä)ö;öùÿõýÿíHC ä=övõýÿíx†ävõýÿíÈaä(öýÿíÛä,öýÿí… ä,ö*öýÿí¬A ä)ö;öùÿõýÿíØDä=övõýÿíx†ävõýÿí(èä(öýÿíÛä,öýÿíHC ä)ö;öùÿõ}öùÿõýÿíÛä=öýÿí´Ùä(öýÿí¬A ä,öýÿíÛä,öýÿíHC ä,öýÿí ä-öýÿíä,öýÿíØDä,öýÿí$N ä,öýÿíȬä)ö;öùÿõýÿí`ä(öýÿí„: ä,öýÿí¬A ä,öýÿíÛä,öýÿíä,öýÿíØDä,öýÿí$N ä,öýÿíȬä)ö;öùÿõýÿí`ä(öýÿíÛä,öýÿíHC ä,öýÿí… ä,öýÿí ä-öýÿíä,öýÿí„ä-öýÿíØDä,öýÿí$N ä,öýÿíȬä)ö;öùÿõ}öùÿõ}öÌk``~$âîÜ]$䀂îä|~$ìâ¨~$„: ä˜~$ì ìÄ~$Ûä˜~$ìà~$… ä˜~$ì $ äü~$ì äæ($„äü~$ìT$$N äD$ì äêȬäD$ôÀ$âˆ$d\ —â €$üHŽ$òØ$„ ðð$Ø î€$œ ò”r î{öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõqõýÿíèÁä;öùÿõqõýÿíLÁä;öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíLÁä,ö*öýÿíèÁä)ö)öùÿõ{öùÿõ*öqõýÿíüä=ö*öýÿíèÁä;öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿíUä,öpõýÿíLÁä,öýÿíüä)ö;öùÿõqõýÿíèÁä;öùÿõ}ö<õùÿõ{öùÿõ*öqõýÿíüä=ö*öýÿíLÁä;öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿí¬Uä,öpõýÿíèÁä,öýÿíüä)ö;öùÿõqõýÿíLÁä;öùÿõ}öùÿõ}öùÿõ}öÌkd\ „Ž$âîp$äÈ‚îä°Ž$ä Ž$äâ äæÜŽ$¬UäÌŽ$ì ìøŽ$èÁäÌŽ$ì$$Uä$ì äæ@$LÁä$ì\$üä Ž$ð€;äx$ì äîØ$â<¡$d\ «â $ü( $òð$„ ð$Ø òœ î{öùÿõõ õýÿíÌLä<öýÿí„ ä>övõýÿí |äýÿí |ä;öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõqõýÿíèÁä;öùÿõqõýÿíLÁä;öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öXõ<öýÿí |ä>ö(ö*öýÿíLÁä)ö<öXõ<öýÿí |ä>ö(ö*öýÿíèÁä)ö)öùÿõ{öùÿõ*öqõýÿíüä=ö*öýÿíèÁä;öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿíUä,öpõýÿíLÁä,öýÿíüä)ö;öùÿõqõýÿíèÁä;öùÿõ}ö<õùÿõ{öùÿõ*öqõýÿíüä=ö*öýÿíLÁä;öùÿõ;õ(öýÿíUäjõýÿíLÁä)öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿí¬Uä,öpõýÿíèÁä,öýÿíüä)ö;öùÿõqõýÿíLÁä;öùÿõ}öùÿõ}öùÿõ}öÌkd\ d $âîˆ$äŒîä $䀠$äâ äæ¼ $¬U䬠$ì ìØ $èÁ䬠$ì¡$Uäô $ì äæ ¡$LÁäô $ðü䀠$ôŒ¡$⤬$pôeâì¡$üd«$ò¤¡$Ð ñ¼¡$P!áîÔ¡$T+ ò”r î{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿíüä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿíUä;öùÿõpõýÿíUä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõ}öÌkpô «$âî<¡$ä‚îäÌ«$伫$äâ äæø«$¬Uäè«$ì ì¬$èÁäè«$ì@¬$Uä0¬$ì äæ\¬$LÁä0¬$ìx¬$ü伫$ð€;䔬$ì äîô¬$⨹$pôyâ<­$ü”¸$ò ­$Ð ñ$­$P!áòT+ î{öùÿõõ õýÿíÌLä<öýÿíÐ å>övõýÿí |äýÿí |ä;öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿíüä)öùÿõ{öùÿõ;õ(öXõ<öýÿí |ä>ö(ö*öýÿíUä)ö<öXõ<öýÿí |ä>ö(ö*öýÿí¬Uä)ö)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿíUä;öùÿõpõýÿíUä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíüä=ö*öýÿí¬Uä;öùÿõpõýÿí¬Uä;öùÿõ}öùÿõ}öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬Uä,öýÿíèÁä,öýÿíüä)ö;öùÿõ}öÌkpôи$â$ä°uîäü¸$äì¸$äâ äæ(¹$¬Uä¹$ì ìD¹$èÁä¹$ìp¹$Uä`¹$ì äæŒ¹$LÁä`¹$ðüäì¸$ôø¹$â8¿$°ü*â@º$ü0¾$òº$, ð(º$ö(öýÿíä&åkõýÿí… äiõ!öýÿí€;ä(öýÿífä,ö*öýÿíä&å)ö)ö;öùÿõ}öÌk°ül¾$$ä0vî䈾$ìâ´¾$„: 䤾$ì ìо$… 䤾$ì ¿$fäì¾$ê âü¾$ ä äê€;ä(¿$ì ä$â<Ä$°ü'⸿$ü`Ã$ò ¿$, ôö(öýÿíä&åkõýÿí… äiõ!ö(öýÿífä<ö*öýÿíä&å)ö)ö;öùÿõ}öÌk°üœÃ$î8¿$ä|tîä¸Ã$ìâäÃ$„: äÔÃ$ì íÄ$… äÔÃ$ðfäÄ$ê â,Ä$ ä äîŒÄ$âT×$ø ¸âÔÄ$üÖ$ò¤Ä$, ð¼Ä$öýÿíìñå;öùÿõõ õýÿíÌLä<öýÿí, ä>övõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ>õ(öýÿí, ä>öÿÿô)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõýÿí€×äýÿí„ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíä&å,öýÿí„ä)ö;öùÿõ;õ(öýÿí€;ä(ö*öýÿíä&å,öýÿífä)ö)öùÿõ{öùÿõýÿí„: ä=öpõýÿíä&å;öùÿõýÿí, äbõýÿí„ä+öÿÿìæ;öùÿõ}öùÿõ<õ;õ(öýÿí€;ä(öýÿífä,ö*öýÿíä&å)ö)öùÿõ{öùÿõýÿí, ä=öýÿí„ä;öùÿõýÿí… ä=öýÿíä&å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí, äýÿíˆ'å=öýÿíä&å;öùÿõDõýÿíìñå(övõýÿíx†ävõýÿíÈaä(öýÿí„: ä,öýÿíä&å,öýÿífä,öýÿí€;ä)ö,öùÿõvõýÿíx†ävõýÿí€Ï ä(öpõýÿíˆ'å,öýÿí… ä,öýÿífä,öýÿí€;ä)ö)ö;öùÿõ}öùÿõ}öùÿõDõýÿíìñå(öýÿí„: ä,öýÿí„: ä)ö;öùÿõ}öÌkø PÖ$âî<Ä$äøtîä´Ö$älÖ$äâ â X¹|Ö$ Ö$äÖ$è ðâÖ$èÐÖ$„: äÖ$ììÖ$… äÖ$ì(×$fä×$ê â×$ ä äê€;äD×$ì äî¤×$â é$ø ­âÔ×$ü è$ò¼×$, ôöýÿíìñå;öùÿõõ õýÿíÌLä<öýÿí, ä>övõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ>õ(öýÿí, ä>öÿÿô)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõýÿí€×äýÿí„ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíä&å,öýÿí„ä)ö;öùÿõ;õ(ö*öýÿíä&å<öýÿífä)öùÿõ{öùÿõýÿí„: ä=öpõýÿíä&å;öùÿõýÿí, äbõýÿí„ä+öÿÿìæ;öùÿõ}öùÿõ<õ;õ(öýÿífä<ö*öýÿíä&å)öùÿõ{öùÿõýÿí, ä=öýÿí„ä;öùÿõýÿí… ä=öýÿíä&å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí, äýÿíˆ'å=öýÿíä&å;öùÿõDõýÿíìñå(övõýÿíx†ävõýÿíÈaä(öýÿí„: ä,öýÿíä&å,öýÿífä)ö,övõýÿíx†ävõýÿí€Ï ä(öpõýÿíˆ'å,öýÿí… ä,öýÿífä)ö)ö;öùÿõ}öùÿõ}öùÿõDõýÿíìñå(öýÿí„: ä,öýÿí„: ä)ö;öùÿõ}öÌkø Hè$âîT×$ä¸sîä¬è$ädè$äâ â X¹tè$˜è$äˆè$è ðâˆè$èÈè$„: äˆè$ìäè$… äˆè$ðfåé$ê âé$ ä äîpé$â€ô$€Ï hâ¸é$üxó$òˆé$, ð é$övõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ>õ(öýÿí, ä>öÿÿô)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõýÿí€×äýÿí„ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíä&å,öýÿí„ä)ö;öùÿõ;õ(ö!öýÿí€;ä(öýÿífä,ö*öýÿíä&å)ö)öùÿõ{öùÿõýÿí„: ä=öpõýÿíä&å;öùÿõýÿí, äbõýÿí„ä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿí, ä=öýÿí„ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öÌk€Ï ´ó$âî é$äüsîäàó$äÐó$äâ ìüó$„: äÐó$ìô$… äÐó$ìTô$fä4ô$ê âDô$ ä äê€;äpô$ì äîÐô$â„ÿ$€Ï gãõ$ü¨þ$òèô$, ôövõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ>õ(öýÿí, ä>öÿÿô)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõýÿí€×äýÿí„ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíä&å,öýÿí„ä)ö;öùÿõ;õ(ö!ö(öýÿífä<ö*öýÿíä&å)ö)öùÿõ{öùÿõýÿí„: ä=öpõýÿíä&å;öùÿõýÿí, äbõýÿí„ä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿí, ä=öýÿí„ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öÌk€Ï äþ$âî€ô$äørîäÿ$åÿ$äâ ì,ÿ$„: åÿ$ìHÿ$… åÿ$ðfädÿ$ê âtÿ$ ä äîÔÿ$âÌ %Èagâ%üÄ %òìÿ$, ð%övõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ>õ(öýÿí, ä>öÿÿô)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõýÿí€×äýÿí„ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíä&å,öýÿí„ä)ö;öùÿõ;õ(öýÿí€;ä(ö*öýÿíä&å,öýÿífä)ö)öùÿõ{öùÿõýÿí„: ä=öpõýÿíä&å;öùÿõýÿí, äbõýÿí„ä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿí, ä=öýÿí„ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}ö ÌkÈaá %âî„ÿ$äsîä, %ä %äâ ìH %„: ä %ìd %… ä %ì  %fä€ %ê â % ä äê€;ä¼ %ì äî %âˆ%ÈadâL %ü¬%ò4 %, ôövõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ>õ(öýÿí, ä>öÿÿô)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõýÿí€×äýÿí„ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíä&å,öýÿí„ä)ö;öùÿõ;õ(ö*öýÿíä&å<öýÿífä)öùÿõ{öùÿõýÿí„: ä=öpõýÿíä&å;öùÿõýÿí, äbõýÿí„ä+öÿÿìæ;öùÿõ}öùÿõ<õùÿõýÿí, ä=öýÿí„ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öÌkÈaè%âîÌ %ä¤qîä%ä%äâ ì0%„: ä%ìL%… ä%ðfäh%ê âx% ä äîØ%â¼(%x ¿â%üð'%òð%üT ô‹ î{öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿí |äýÿíövõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ=õ(öýÿí, ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿí… ä;öùÿõ9õÿÿìæ:öùÿõDõýÿíÐú ä(ö*öýÿí„: ä)ö?öýÿí… ä:öýÿí„: ä;öùÿõ9õÿÿìæ:öùÿõ;õ(öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõ{öùÿõ;õ(öýÿíÐú ä(ö*öpõýÿí„: ä)ö)öùÿõDõýÿí… ä;öùÿõDõýÿí„: ä;öùÿõ}öùÿõ;õ(öýÿíÐú ä(ö*öqõýÿí… ä)ö)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõýÿí… ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öùÿõýÿíäŽä<öýÿíöýÿíüôä(öýÿí, ä)ö;öùÿõDõýÿíüä<öýÿíüT ä,öýÿí‹ ä,öýÿí€×ä,ö õýÿíäŽä<öýÿíövõýÿí¤Ìä>öùÿõ(öýÿí„: ä,öýÿí… ä,öýÿíÐú ä,öýÿí, ä,öýÿíüôä.öýÿíÌ' ä(ö)ö,öýÿíüôä.öýÿíp ä(ö)ö)ö;öùÿõ}öÌkx ,(%âîˆ%äŒrîäX(%äH(%äâ ìt(%„: äH(%ì(%… äH(%ðÐú ä¬(%ì äî )%â TX%üçál)%üW%ò$)%üT ð<)%‹ îT)%Ôfò„¢áî{öùÿõùÿõ=õ(öýÿí, ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿí… ä;öùÿõ9õÿÿìæ:öùÿõDõýÿíÐú ä(ö*öýÿí„: ä)ö?öýÿí… ä:öýÿí„: ä;öùÿõ9õÿÿìæ:öùÿõ;õ(öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõ{öùÿõ;õ(öýÿíÐú ä(ö*öpõýÿí„: ä)ö)öùÿõDõýÿí… ä;öùÿõDõýÿí„: ä;öùÿõ}öùÿõ;õ(öýÿíÐú ä(ö*öqõýÿí… ä)ö)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõýÿí… ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öùÿõùÿõ;õ(öýÿí, älõýÿíȬä-öýÿí¬ ä)öùÿõ{öùÿõùÿõ>õ(öýÿí„: äkõýÿí… äiõýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõpõýÿí„: ä;öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí… ä;öùÿõùÿõýÿíüT äýÿíä&å=öýÿí„: ä;öùÿõùÿõýÿíä&å=övõýÿíx†ävõýÿí¨„å<öýÿíüT ä,ö õýÿí ûävõýÿíÔä<öýÿí‹ ä>övõýÿíÅ ä>öùÿõ(öpõýÿíä&å,öýÿí… ä,öýÿíÐú ä)ö;öùÿõ;õ(öýÿíä&åjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõùÿõýÿí„¢åýÿíˆ'å=övõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿíä&å,öýÿí¬ ä)ö;öùÿõ*öýÿí„: ä=ö*öýÿíä&å;öùÿõ@õ(öpõýÿí„: ä,öpõýÿíä&å;öýÿíä&åkõýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõ;õ(öýÿíÐú ä(ö*öýÿíä&å)ö)öùÿõ{öùÿõ*öýÿí„: ä=ö*öýÿíä&å;öùÿõpõýÿí„: ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ*öýÿíˆ'å=ö*öýÿíä&å;öùÿõpõýÿíˆ'å;öùÿõ}öùÿõ}öùÿõùÿõvõýÿíx†ävõýÿ팊ä(öýÿí¬ ä,öýÿíˆ'å,öýÿí„: ä)ö;öùÿõDõýÿí„: ä;öùÿõ}öùÿõùÿõýÿíüT äýÿíØ< ä=öýÿí„: ä;öùÿõýÿíÔfäýÿí÷ä=öýÿí, ä/öÿÿìæ;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíØ< ä,öýÿí÷ä)ö;öùÿõýÿíüT äýÿíP3 ä=öùÿõýÿíüä<öýÿíüT ä,öùÿõ õýÿí ûävõýÿíÔä<öýÿí‹ ä>övõýÿíÅ ä,öùÿõýÿíÔfä,öýÿí„¢å>ö(öýÿí„: ä,öýÿíØ< ä,öýÿíÐú ä,öýÿí÷ä,öýÿí¬ ä,öýÿíȬä)ö;öùÿõýÿíüT äýÿíüä=öùÿõýÿíüä<öýÿíüT ä,öùÿõ õýÿí ûävõýÿíÔä<öýÿí‹ ä>övõýÿíÅ ä,öùÿõýÿíÔfä,öýÿí„¢å>ö(öýÿíØ< ä,öýÿí… ä,öýÿíÐú ä,öýÿí, ä-öýÿí÷ä,öýÿí¬ ä,öýÿíȬä)ö;öùÿõýÿí÷ä=övõýÿíx†ävõýÿí(èä(öýÿíØ< ä,öýÿíüä)ö;öùÿõ;õ(öýÿí÷äjõÿÿô)öùÿõDõýÿíP3 ä;öùÿõýÿí, ä=övõýÿíx†ävõýÿí(èä(öýÿíP3 ä,öýÿíØ< ä)ö;öùÿõ;õ(öýÿí, ä>öÿÿô)öùÿõýÿíP3 ä=öýÿí´Ùä(öýÿíP3 ä,öýÿíØ< ä,öýÿíüä,öýÿí, ä,öýÿí÷ä,öýÿí¬ ä,öýÿíȬä)ö;öùÿõ<õùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíP3 ä,öýÿí÷ä)ö;öùÿõDõýÿíP3 ä;öùÿõ}öÌküPW%âî¼(%ä¤eîä|W%älW%äâ ì˜W%„: älW%ì´W%… älW%ìàW%Ðú äÐW%ì äæ X%, äüW%ì äæ8X%¬ ä(X%ì äêȬä(X%ô¤X%âÀm%¤× ÖâÔX%üäl%ò¼X%üT ô‹ î{öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿíˆ; äýÿíð^ä;öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõõýÿí€iä=öýÿíÐú ä(ö*öýÿí„: ä)ö;öùÿõõýÿíXòä=ö!öýÿíÐú ä(ö*öqõýÿí… ä)ö;öùÿõ;õ(öýÿí€iäiõýÿíXòä)öùÿõùÿõDõýÿíðÕä<öýÿíüT ä,ö!õýÿí‹ ä&ö>ö(öpõýÿí„: ä,öýÿí… ä,öýÿíÐú ä,öýÿíð^ä(ö)ö)ö;öùÿõ;õ(öýÿíXòä)öùÿõ{öùÿõùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõ>õ(öýÿí„: äkõqõýÿí… äiõ!öýÿíÐú ä(ö*öýÿí… ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõ}öùÿõ<õ;õ(öýÿí€iä)öùÿõ{öùÿõùÿõpõýÿí… ä;öùÿõpõýÿí„: ä;öùÿõ>õ(öýÿí„: äkõýÿí… äiõýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõpõýÿí„: ä;öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõqõýÿí… ä;öùÿõ}öùÿõùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõDõýÿíðÕä<öýÿíüT ä,ö!õýÿí‹ ä&ö>ö(öpõýÿí„: ä,öýÿí… ä,öýÿíÐú ä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌk¤× m%âîTX%äfîäLm%äõ(öZõ)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõCõ;öùÿõpõýÿí„: ä;öùÿõ}öùÿõqõýÿí… ä;öùÿõ>õ(öZõ)öùÿõ{öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõ;õ(öýÿíÐú ä(ö*öýÿí… ä)ö)öùÿõCõ;öùÿõqõýÿí… ä;öùÿõ}öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõpõýÿí„: ä;öùÿõ}öùÿõ}öÌk`î õ(öZõ)öùÿõ{öùÿõ>õ(öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõpõýÿí„: ä;öùÿõ>õ(ö!öýÿíÐú ä(ö*öqõýÿí… ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿí„: ämõýÿí… ä)öùÿõCõ;öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõpõýÿí„: ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öÌkðÕè%îÌx%äeîä€%ä€%äâ ì0€%„: ä€%ìL€%… ä€%ìx€%Ðú äh€%ì äê 7äHŠôä€%â|‰%ðÕPâ%ü”ˆ%òü€%üT ô‹ î{öùÿõ>õ(öZõ)öùÿõ{öùÿõ>õ(öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõpõýÿí„: ä;öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõCõ;öùÿõ>õ(ö!öýÿíÐú ä(ö*öqõýÿí… ä)ö)öùÿõ{ö}öùÿõ;õ(öýÿí„: äjõpõýÿí… ä)öùÿõCõ;öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öqõýÿí… ä)ö;öùÿõpõýÿí„: ä;öùÿõ}öùÿõDõýÿí„: ä;öùÿõ}öÌkðÕЈ%%ä\cîäüˆ%äìˆ%äâ ì‰%„: äìˆ%ì4‰%… äìˆ%ì`‰%Ðú äP‰%ì äê 7䔋ổ%âð%|ûAâü‰%ü%òä‰%„¢õŒqî{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿíL$å=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿíL$å>öÿÿìæ)öùÿõ{öùÿõ@õ(öqõýÿí… ä;öýÿí„: ä<öýÿí… ä;öpõýÿí„: ä,öqõýÿíL$å)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí„: ä+öýÿí€H ä(öýÿíL$å)ö)ö;öùÿõ}öùÿõ}öÌk|ûP%î|‰%äècîäl%ìâ˜%„: äˆ%ì ì´%… äˆ%ð€H äÐ%ì âà% ä äî@‘%âØ™%|ûTâX‘%ü8™%ö„¢ñ{öùÿõõ õýÿíÌLä<öýÿí„¢å>övõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿíL$å=öýÿí… ä-öýÿí„: ä;öùÿõ;õ(öýÿíL$å>öÿÿìæ)öùÿõ{öùÿõ@õ(öqõýÿí… ä;öýÿí„: ä<öýÿí… ä;öpõýÿí„: ä,öqõýÿíL$å)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí„: äùÿõ+öXõ<öýÿí€×ä>ö(öýÿí ä<öZõ>ö(ö)ö(öXõ<öõ õ>ö(öýÿíL$å)ö)ö)ö)ö;öùÿõ}öùÿõ}öÌk|ût™%îð%ä¨bîä™%ìâ¼™%„: 䬙%ì ð… 䬙%ô(š%âôŸ%d8â@š%ü€Ÿ%öX ãë{öùÿõõ õýÿíŒFä=öýÿíä<öýÿíX ä>ö(öýÿía ä)ö;öùÿõõ õýÿíˆä=öýÿíŒFä*öýÿía ä;öùÿõõ õýÿí  ä;öùÿõ?õùÿõýÿí  ä=öýÿíd¶ä<öýÿíX ä>ö(ö)ö;öùÿõ>õ(öýÿí  ämõýÿíˆä)ö;öùÿõDõýÿí  ä/öýÿíŒFä;öùÿõ}öÌkd¼Ÿ%îØ™%äcîäØŸ%ìæa üD %â(¦% â\ %ü”¡%¢%òX ãë{öùÿõDõ(öÿÿ ìænõýÿíX ä)ö/öýÿía ä;öùÿõ}öÌkС%îôŸ%äövõýÿíˆ; äýÿíð^ä;öùÿõýÿí´Ùä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌk8À¬®%îª%äÜRîäÈ®%ìâô®%„: ää®%ì ì¯%Ûää®%ð… ää®%ô|¯%ℹ%´Ùa┯%ü¬¸%öüT ð{öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿí |äýÿíövõýÿí€×äýÿí€×ä;öùÿõýÿí€×äýÿí ä=övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿíÛä)ö;öùÿõýÿí€×äýÿí„ä=övõýÿíx†ävõýÿí(èä(öýÿíÛä,öýÿí… ä)ö;öùÿõýÿíäŽä<öýÿíöýÿíüôä(övõýÿíx†ävõýÿíÔ6 ä(öýÿí ä,öýÿí„ä)ö)ö;öùÿõýÿí´Ùä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿí ä,öýÿí„ä,öýÿíüôä.öýÿíÌ' ä(ö)ö,öýÿíüôä.öýÿíp ä(ö)ö)ö;öùÿõ}öÌk´Ùè¸%âî,¯%ä¼Sîä¹%ìâ0¹%„: ä ¹%ì ìL¹%Ûä ¹%ìh¹%… ä ¹%ð 7䔋ôÔ¹%âÊ%´Ùœâº%ü¼È%òì¹%üT ðº%Ôfò„¢áî{öùÿõýÿíÔfäýÿíÿ ä=öXõ<öýÿíÔfä>ö(öýÿíȬä-öýÿí¬ ä)ö;öùÿõ;õ(öýÿí älõýÿí„äiõýÿí älõýÿíÿ ä)öùÿõ{öùÿõýÿíȬä=övõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿíÛä,öýÿí¬ ä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿíÛä,öýÿí… ä,öýÿí„: ä)ö;öùÿõDõvõýÿíx†ävõýÿíÜä(öýÿí¬ ä,öýÿíȬä,öýÿí… ä)ö;öùÿõ}öùÿõ;õ(öýÿí„älõýÿíÿ ä)öùÿõ{öùÿõýÿíȬä=övõýÿíx†ävõýÿ팊ä(öýÿíÛä,öýÿí… ä,öýÿí¬ ä)ö;öùÿõvõýÿíx†ävõýÿíÜä(öýÿí„: ä,öýÿíÛä,öýÿí… ä)ö;öùÿõDõvõýÿíx†ävõýÿ팊ä(öýÿí¬ ä,öýÿíȬä,öýÿí„: ä)ö;öùÿõ}öùÿõýÿí´Ùä(öýÿí„: ä,öýÿíÛä,öýÿí… ä,öýÿí@Ôä(ö)ö)ö;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿí„: ä,öýÿí„ä)ö;öùÿõDõýÿí„: ä;öùÿõ}öÌk´ÙøÈ%â%äLQîä$É%äÉ%äâ ì@É%„: äÉ%ì\É%ÛäÉ%ìxÉ%… äÉ%ì¤É% ä”É%ì äæÀÉ%„ä”É%ììÉ%¬ äÜÉ%ì äêȬäÜÉ%ôXÊ%âðÑ%´ÙGâpÊ%üÑ%ö, ð{öùÿõýÿí, äýÿíä&å=öýÿíÛä;öùÿõ>õ(öZõ)öùÿõ{öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿíä&å)ö;öùÿõ;õ(öpõýÿí„: äjõýÿíÛä)öùÿõ{öùÿõ;õ(öpõýÿíä&åjõýÿí… ä)öùÿõCõ;öùÿõýÿíÛä=öýÿíä&å;öùÿõ}öùÿõ<õ;õ(öpõýÿíä&åjõýÿí… ä)öùÿõýÿíä&å=öýÿíÛä;öùÿõ}öùÿõ}öÌk´ÙTÑ%âîÊ%äRîäpÑ%ìâœÑ%„: äŒÑ%ì ì¸Ñ%ÛäŒÑ%ìÔÑ%… äŒÑ%ð 7äàŒô@Ò%â¬Õ%ÞâpÒ%üàÔ%òXÒ%üT ôT+ î{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿíüä)öùÿõ*öýÿíüä=ö*öqõýÿí… ä;öùÿõDõýÿíüä;öùÿõ}öÌkÞÕ%îðÑ%åDîäHÕ%ä8Õ%äâ äætÕ%„: ädÕ%ì ìÕ%… ädÕ%ðüä8Õ%ôüÕ%â$Ù%¼• âÖ%ü„Ø%öüT ð{öùÿõõ õýÿíÌLä<öýÿíüT ä>övõýÿíˆ; äýÿíð^ä;öùÿõýÿíÀä(öýÿí„: ä,öýÿí… ä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌk¼• ÀØ%î¬Õ%äœDîäÜØ%ìâÙ%„: äøØ%ì ð… äøØ%ôtÙ%â`Ý%À!âŒÙ%ü¤Ü%ö„¢ñ{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ@õ(ö;öýÿí„: ä<öqõýÿí… ä;öpõýÿí„: ä)öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ}öÌkÀàÜ%î$Ù%äÈBîäüÜ%ìâ(Ý%„: äÝ%ì ìDÝ%… äÝ%ð 7äHŠô°Ý%âŒâ%À+âÈÝ%üÐá%öüT ð{öùÿõ>õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõqõýÿí… ä;öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõCõ;öùÿõvõýÿíx†ävõýÿífä(öýÿí„: ä,öýÿí… ä)ö;öùÿõpõýÿí„: ä;öùÿõ}öùÿõ}öÌkÀ â%î`Ý%äPCîä(â%ìâTâ%„: äDâ%ì ìpâ%… äDâ%ð 7䔋ôÜâ%â¬æ%0H !âôâ%ü æ%ö, ð{öùÿõõ õýÿíÌLä<öýÿí, ä>övõýÿí |äýÿí |ä;öùÿõDõvõýÿíx†ävõýÿí0H ä(öýÿí„: ä,öýÿí… ä,öýÿíhä<öýÿí |ä>ö(ö)ö)ö;öùÿõ}öÌk0H Hæ%îŒâ%äÔAîätæ%ädæ%äâ ìæ%„: ädæ%ð… ädæ%ôüæ%âèñ%0H jâ,ç%üñ%òç%, ôäËî{öùÿõõ õýÿí ûävõýÿíÔä<öýÿíäËä>övõýÿíÅ äýÿí( ä;öùÿõýÿí„: ä=övõýÿíx†ävõýÿídè ä<öýÿí, ä,öýÿí( ä>ö(öýÿí„: ä,öýÿí… ä,öýÿíÐú ä)ö;öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõùÿõýÿí, äýÿ팔ä=öýÿí„: ä;öùÿõpõýÿ팔ä;öùÿõpõýÿ팔ä;öùÿõ>õ(öýÿ팔äkõýÿí… äiõýÿíÐú ä(ö*öýÿí„: ä,ö*öýÿ팔ä)ö)öùÿõpõýÿ팔ä;öùÿõDõvõýÿíx†ävõýÿíèœ ä<öýÿí, ä,öýÿí, ä,öýÿíäËä>ö(öýÿ팔ä,öýÿí… ä,öpõýÿí„: ä,öýÿíÐú ä)ö;öùÿõ}öÌk0H Xñ%âî¬æ%ä„Bîä„ñ%ätñ%äâ ì ñ%„: ätñ%ì¼ñ%… ätñ%ðÐú äØñ%ì äî8ò%â÷%èœ &â€ò%üö%òPò%ôã ðhò%T+ òäËî{öùÿõõ õýÿíÌLä<öýÿíT+ ä>övõýÿíˆ; äýÿíð^ä;öùÿõDõýÿí4hä<öýÿíôã ä,öýÿíT+ ä,öýÿíäËä>ö(öýÿí„: ä,öýÿí… ä,öýÿíüä,öýÿíÐú ä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌkèœ Lö%îèñ%äAîäxö%ähö%äâ 俤ö%„: ä”ö%ì ìÀö%… ä”ö%ìÜö%üähö%ðÐú äøö%ì äîX÷%âœþ%4h?â ÷%üˆý%òp÷%ôã ðˆ÷%, òäËî{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿíüä,ö*öýÿí„: ä)ö)öùÿõ*öpõýÿíüä=ö*öýÿí„: ä;öùÿõpõýÿíüä;öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌk4hÄý%âî÷%äxAîäðý%äàý%äâ äæþ%„: ä þ%ì ì8þ%… ä þ%ìTþ%üäàý%ì€þ%Ðú äpþ%ì äê 7äàŒôìþ%âØ&4h&â4ÿ%üÄ&òÿ%ôã ðÿ%T+ òäËî{öùÿõõ õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; äýÿíð^ä;öùÿõDõýÿíøSä<öýÿíôã ä,öýÿíT+ ä,öýÿíäËä>ö(öýÿí„: ä,öýÿí… ä,öýÿíüä,öýÿíÐú ä,öýÿíð^ä(ö)ö)ö;öùÿõ}ö Ìk4há&îœþ%äô?îä,&ä&äâ äæX&„: äH&ì ìt&… äH&ì&üä&ì¼&Ðú ä¬&ì äê 7ä˜ô(&â4 &øSRâp&ü &ò@&, ðX&T+ òäËî{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí, äýÿíÄä=öýÿí„: ä;öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ{öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿíÄä,ö*öýÿí„: ä)ö)öùÿõ{öùÿõýÿíÄä=öýÿí„: ä;öùÿõ*öpõýÿíüä=ö*öýÿí„: ä;öùÿõ}öùÿõ}öùÿõpõýÿíüä;öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌkøS\ &âîØ&ä @îäˆ &äx &äâ äæ´ &„: ä¤ &ì ìÐ &… ä¤ &ìì &üäx &ì &Ðú ä &ì äê 7äàŒô„ &â &øSXâÌ &ü &òœ &ôã ð´ &T+ òäËî{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõ õýÿíÌLä<öýÿíôã ä>övõýÿí |äýÿíÄä(ö*öýÿí„: ä)ö;öùÿõ*öýÿíüä=öýÿíÄä;öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ{öùÿõ;õ(ö!öýÿíÐú ä(öýÿíÄä,ö*öýÿí„: ä)ö)öùÿõ{öùÿõýÿíÄä=ö*öýÿí„: ä;öùÿõ*öpõýÿíüä=öýÿíÄä;öùÿõ}öùÿõ}öùÿõpõýÿíüä;öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌkøSH&âî4 &äÌ3îät&äd&äâ äæ &„: ä&ì ì¼&… ä&ìØ&üäd&ì&Ðú äô&ì äê 7ä,Žôp&â$&èœ â &üX&òˆ&ôã ôT+ î{öùÿõõ õýÿíÌLä<öýÿíT+ ä>övõýÿíˆ; äýÿíð^ä;öùÿõDõýÿí4hä(öýÿí„: ä,öýÿí… ä,öýÿíüä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌkèœ ”&î &ä`4îäÀ&ä°&äâ äæì&„: äÜ&ì ì&… äÜ&ðüä°&ôt&â\"&4h>â¤&üt!&òŒ&ôã ô, î{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(ö!ö(ö*öýÿíüäjõ*öýÿí„: ä)ö)öùÿõ*öpõýÿíüä=ö*öýÿí„: ä;öùÿõpõýÿíüä;öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌk4h°!&âî$&äT2îäÜ!&äÌ!&äâ äæ"&„: äø!&ì ì$"&… äø!&ì@"&üäÌ!&ð 7äàŒô¬"&âô&&4h"âÜ"&ü &&òÄ"&ôã ôT+ î{öùÿõõ õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; äýÿíð^ä;öùÿõDõýÿíøSä<öýÿíôã ä,öýÿíT+ ä>ö(öýÿí„: ä,öýÿí… ä,öýÿíüä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌk4hH&&î\"&ää2îät&&äd&&äâ äæ &&„: ä&&ì ì¼&&… ä&&ìØ&&üäd&&ð 7ä˜ôD'&âô/&øSQât'&ü /&ò\'&, ôT+ î{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí, äýÿíÄä=öýÿí„: ä;öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ{öùÿõ;õ(ö!ö(ö*öýÿíÄäjõ*öýÿí„: ä)ö)öùÿõ{öùÿõýÿíÄä=öýÿí„: ä;öùÿõ*öpõýÿíüä=ö*öýÿí„: ä;öùÿõ}öùÿõ}öùÿõpõýÿíüä;öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌkøSH/&âîô&&äÀ0îät/&äd/&äâ äæ /&„: ä/&ì ì¼/&… ä/&ìØ/&üäd/&ð 7äàŒôD0&â„9&øSWât0&üœ8&ò\0&ôã ôT+ î{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõ õýÿíÌLä<öýÿíôã ä>övõýÿí |äýÿíÄä(ö*öýÿí„: ä)ö;öùÿõ*öýÿíüä=öýÿíÄä;öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ{öùÿõ;õ(ö!ö(öýÿíÄäjõ*öýÿí„: ä)ö)öùÿõ{öùÿõýÿíÄä=ö*öýÿí„: ä;öùÿõ*öpõýÿíüä=öýÿíÄä;öùÿõ}öùÿõ}öùÿõpõýÿíüä;öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌkøSØ8&âîô/&äˆ1îä9&äô8&äâ äæ09&„: ä 9&ì ìL9&… ä 9&ìh9&üäô8&ð 7ä,ŽôÔ9&ãA&RBâ:&ü4@&òì9&, ô‹ î{öùÿõýÿí, äýÿíä&å=öýÿí„: ä=övõýÿíx†ävõýÿí¨„åùÿõ<öýÿí, ä,ö õýÿí ûävõýÿíÔä<öýÿí‹ ä>övõýÿíÅ ä>ö(öýÿí„: ä,öýÿí… ä,öýÿíÐú ä)ö;öùÿõDõýÿí„: äjõýÿí… ä?öýÿí„: ä:öùÿõvõýÿíx†ävõýÿí„z ä<öýÿí, ä,öýÿí, ä,öýÿí‹ ä>ö(öpõýÿíä&å,öýÿí… ä,öýÿí„: ä,öýÿíÐú ä)ö;öùÿõ}öÌkRp@&âî„9&äÐ/îäœ@&äŒ@&äâ ì¸@&„: äŒ@&ìÔ@&… äŒ@&ðÐú äð@&ì äîPA&â|F&8ò,â€A&ü E&òhA&, ôövõýÿí6ä>ö(ö)ö)ö;öùÿõ}ö¸W&ü„ä tY ÈW&ôw ä2 t[&DÀØW&W àW&lK èW&,G ðW&XD øW&(@ åX&D¹DÀövõýÿí6ä>ö(ö)ö)ö;öùÿõ}ö>t^&Hô„[&/ Œ[&ð+ ”[&ü( œ[&Ü% ¤[&ø" ¬[& ´[&< ä¼[&D¹Hôø[&ë¤\&äܬîä$\&ìâd¹ì@\&|W 䀣ì\\&„+å(¿ìˆ\&„: äx\&ì æè… äx\&ì–¹äô\&âÌX&Hôâ ]&ü¼[&öôã âì{öùÿõýÿí\•å(öýÿí„+å,öýÿí„+å,öýÿí„: ä,öýÿí… ä)ö;öùÿõ}ö”^&œê„^&ô Œ^&á ä h 0d&\•á ¤^&d ¬^&á9ø´^&`ô¼^&ôðÄ^&ÏÌ^&<ËÔ^&ôÆÜ^&øÂä^&ˆ¾ä ì^&D¹\•á (_&ëð_&äL¬îäT_&äȶäâd¹ìp_&|W 䀣ìŒ_&˜ä(¿ì¨_&<Ÿä(¿ìÔ_&dÑäÄ_&ì æèDÓäÄ_&ì–¹ä@`&â¤\&\•á)âX`&üì^&öôã âì{öùÿõDõýÿíèDä(öýÿí|rä(öýÿí˜ä-öýÿíÌ' ä(ö)ö)ö,öýÿí|rä(öýÿí<Ÿä-öýÿí˜ä)ö,öýÿídÑä,öýÿíDÓä,öùÿõýÿí´qä<öýÿíûä<öýÿíôã ä>övõýÿí6ä>ö(ö)ö)ö;öùÿõ}ö@d&ŒŠä hŽPd&ˆpä ô‡`d&îä †pd&… ä Ä€d&è„åì¨d&| d&á|˜d&,n d&àjä"ÄbÐd&>¸d&Ð^Àd&|OÈd&(Lä"Aød&hçàd&0=èd&2ðd&È.äô& e&Ôþe&á#e&De&ðä"tHe&èõ 0e&ˆ8e&ìö@e& óä"´ëpe&ìr Xe&Àç`e&ŒÙhe&8Öä ¤Ë€e&Pä2(Ÿe&Ðu e&$Á˜e&½ e&ðµ¨e&Œ²°e& ¯ä ü¢Èe&,Ôä ¼¹Øe&¸ä ô¹èe&4åì á f&ü~ øe& 3!ä ð1!f&·å%0!`n&$Tj& f&D¹$\f&î”g&äì«îäˆf&ìâd¹ì¤f&|W 䀣ìÐf&Ì' äÀf&ì æäìf&p äÀf&ì(g&Ä"åg&ê âg& ä äê 7äDg&ì â̸Tg&æhg&è4êþ–¹ääg&âð_&$âüg&ü f&öôã âì{öùÿõýÿíœ>ä(öXõ<öýÿí|rä>ö(öýÿíÌ' ä)ö,öXõ<öýÿíøä>ö(öýÿíp ä)ö,öýÿíÄ"å)ö;öùÿõ}ú\j&D¹$˜j&îÐk&䜯îäÄj&ìâd¹ìàj&|W 䀣ì k&Ì' äüj&ì æä(k&p äüj&ìdk&Ä"åDk&ê âTk& ä äê 7ä€k&ì â̸k&æ¤k&è4ÿê–¹ä l&â”g&$â8l&ü\j&öôã âì{öùÿõýÿíœ>ä(öýÿíÌ' ä,öýÿíp ä,öýÿíÄ"å,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}ö˜„&œ>œx&pn&D¹œ>¬n&âî”o&ä8¯îäØn&ìâd¹ìôn&|W 䀣ì o&Ì' äo&ì æä\âüo&üpn&öôã âì{öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõýÿí4å=öÿÿô;öùÿõ;õ(öýÿíÌ' äkõýÿíp ä)öùÿõ{öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíÌ' äkõýÿíp ä;öpõýÿíÌ' ä)öùÿõ*öOõaõ*öýÿíÌ' ä;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öùÿõ}ö€„&¤x&D¹œ>àx&âîÈy&ä0¼îä y&ìâd¹ì(y&|W 䀣ìTy&Ì' äDy&ì æäpy&p äDy&ì¬y& 7äŒy&ê âœy& ä äê 7äàŒì–¹äz&â”o&œ>nâ0z&ü¤x&ö, âì{öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõýÿí4å=öÿÿô;öùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿíÌ' ä,öýÿíp ä)ö;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõýÿí,Ôä=öýÿí´)å;öùÿõýÿí´)å=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿí´)å+öÿÿìæ)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿíÌ' ä,öýÿíp ä,öýÿí4å)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿí´)å)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí´)å;öùÿõ}öùÿõ}öˆ„&h!„&xü ä&Èð @Œ&,ˆˆ&¨„&D¹,ä„&îà…&äd»îä…&äȶäâd¹ì,…&|W 䀣ìX…&„: äH…&ì æät…&… äH…&ð 7ä…&ì â̸ …&æ´…&è4êþ–¹ä0†&âÈy&,âH†&ü¨„&öôã âì{öùÿõDõýÿíäB ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿíøä>ö(öýÿí… ä)ö)ö;öùÿõ}úˆ&D¹,̈&îȉ&䬺îäøˆ&äȶäâd¹ì‰&|W 䀣ì@‰&„: ä0‰&ì æä\‰&… ä0‰&ð 7äx‰&ì â̸ˆ‰&有&è4ÿê–¹äŠ&âà…&,â0Š&üˆ&öôã âì{öùÿõDõýÿíÌä(öýÿí„: ä,öýÿí… ä,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}ö°˜&ÌØ‘&PŒ&D¹ÌŒŒ&âî8&åºî丌&äȶäâd¹ìÔŒ&|W 䀣í&„: äðŒ&ì æä&… äðŒ&ð 7ä,Žì–¹äˆ&âȉ&Ì-â &üPŒ&öôã âì{öùÿõýÿí4‘ äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿí4‘ ä&öýÿí¸_ä=öýÿíxÃä;öùÿõDõýÿíÌä(öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö ˜&à‘&D¹Ì’&âîÈ’&ä(¿îäH’&äȶäâd¹ìd’&|W 䀣ì’&„: 䀒&ì æä¬’&… 䀒&ð 7äàŒì–¹ä“&â8&Ì:â0“&üà‘&ö, âì{öùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõýÿí|räýÿ혇ä=öýÿí¤ ä(ö)ö;öùÿõýÿíxrä(öýÿ혇ä+öýÿí@ä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíü~ ä(ö)ö+öýÿ혇ä)ö;öùÿõDõ*öOõ;öùÿõ}ö¨˜&´_ ä&¨[ X &pë  œ&À˜&D¹pë ü˜&îø™&䬾îä(™&äȶäâd¹ìD™&|W 䀣ìp™&„: ä`™&ì æäŒ™&… ä`™&ð 7䨙&ì â̸¸™&æÌ™&è4êþ–¹äHš&âÈ’&pë â`š&üÀ˜&öôã âì{öùÿõDõýÿíDÀä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿíøä>ö(öýÿí… ä)ö)ö;öùÿõ}ú¨œ&D¹pë äœ&îà&ä¾îä&äȶäâd¹ì,&|W 䀣ìX&„: äH&ì æät&… äH&ð 7ä&ì â̸ &æ´&è4ÿê–¹ä0ž&âø™&pë âHž&ü¨œ&öôã âì{öùÿõDõýÿí´Bä(öýÿí„: ä,öýÿí… ä,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}öð«&´Bð¥&h &D¹´B¤ &âîP¡&äô¼îäР&äȶäâd¹ìì &|W 䀣ì¡&„: ä¡&ì æä4¡&… ä¡&ð 7ä,Žì–¹ä ¡&âà&´B-⸡&üh &öôã âì{öùÿõýÿí4‘ äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿí4‘ ä&öýÿí¸_ä=öýÿíxÃä;öùÿõDõýÿí´Bä(öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}öà«&ø¥&D¹´B4¦&âîà¦&ä@Âîä`¦&äȶäâd¹ì|¦&|W 䀣쨦&„: 䘦&ì æäĦ&… 䘦&ð 7äàŒì–¹ä0§&âP¡&´B1âH§&üø¥&ö, âì{öùÿõùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõýÿíxrä(öýÿí@ä,ö[õ)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíü~ ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}öè«&Ô5 äÈ1 à´&èDx°&á¬&D¹èD<¬&îp­&ä(Áîäh¬&äȶäâd¹ì„¬&|W 䀣젬&àäԹ켬&, äÔ¹ìè¬&„: äج&ì æä­&… äج&ð 7ä ­&ì â̸0­&æD­&è4êþ–¹äÀ­&âà¦&èDâØ­&ý¬&öôã âì{öùÿõDõýÿí\•å(öýÿíàä,öýÿí, ä,öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿíøä>ö(öýÿí… ä)ö)ö;öùÿõ}ú€°&D¹èD¼°&îð±&ä`Ìîäè°&äȶäâd¹ì±&|W ä€£ì ±&àäÔ¹ì<±&, äÔ¹ìh±&„: äX±&ì æä„±&… äX±&ð 7ä ±&ì â̸°±&æı&è4ÿê–¹ä@²&âp­&èDâX²&ü€°&öôã âì{öùÿõDõýÿí´ä(öýÿíàä,öýÿí, ä,öýÿí„: ä,öýÿí… ä,öùÿõ õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}öœÝ&´(»&ð´&D¹´,µ&âî¶&åÌîäXµ&äȶäâd¹ìtµ&|W 䀣ìµ&àäԹ쬵&, äÔ¹ìص&„: äȵ&ì æäôµ&… äȵ&ð 7ä,Žì–¹ä`¶&âð±&´2âx¶&üð´&öôã âì{öùÿõýÿí4‘ äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿí4‘ ä&öýÿí¸_ä=öýÿíxÃä;öùÿõDõýÿí´ä(öýÿíàä,öýÿí, ä,öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öùÿõýÿí@jä(ö)ö)ö;öùÿõ}öŒÝ&0»&D¹´l»&âîP¼&ähËî䘻&äȶäâd¹ì´»&|W 䀣ìл&àäÔ¹ìì»&, äÔ¹ì¼&„: ä¼&ì æä4¼&… ä¼&ð 7äàŒì–¹ä ¼&â ¶&´[Ḽ&ü0»&ö, âì{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿí@Ý&'â)ö;öùÿõùÿõùÿõýÿí|räýÿí áä=öýÿíÔ6 ä(öýÿí, ä,öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí@ä>öýÿí0 ä(ö)öhõýÿí¤ ä(ö)ö-öýÿí áä>öýÿí0 ä(ö)ö-öýÿí@ä)öùÿõùÿõPõýÿíœf ä(öüÿíhÝ&#â)ö;öùÿõùÿõýÿí|räýÿíÀå=öýÿí¤ ä(ö)ö-öýÿí áä+öýÿí@ä;öùÿõùÿõ;õ(öýÿíÀå>öýÿí4Öä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí€ø äýÿíxÃä=öýÿí¸ä.öýÿí¬±ä(öýÿí·ä(öýÿíÀå)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä,öýÿí4å,öýÿíàä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíxÃä+öýÿíàä)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä+öýÿíàä+öýÿí@ä,öýÿí4å+öýÿíàä+öýÿí áä,öùÿõýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿíxÃä+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõýÿí4å=öýÿíxÃä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿíÀå)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõ;õ(öýÿí4åkõÿÿô)öùÿõ{öùÿõýÿíUävõýÿíä(öýÿí4å+öýÿíàä+öýÿí@ä,öýÿí4å+öýÿíàä+öýÿí áä,öùÿõýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿí4å+öýÿíàä)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length errorá”Ý&ø™äl•äxr䀵 ä´qä¼Ý&̸æP#ãëä$Þ&´qõãpäœÞ&þ¸¸\Þ&ê$¸¨äÜÝ&äDÞ&ãå´qäTÞ&ÜÝ&èpÞ&è4ÿêääÞ&´qõãpè þ¸¸ß&ê$¸0ê äœÞ&äß&ãå´qäß&œÞ&è0ß&è4êþä´ß& õáæhö&èìß&ìHà&èÌk ä\ß&äÔß&ãå ääß&\ß&âà&h ãïŠáçà&4éþ Ôí&Tà&Tí&ä¬à& ôápðÐá&äèá&\ß&ä,í&Ìk äTà&äÌà&ãáäà& äÜà&Tà&æ>äôà&¬à&>0á&âÿèä\á&쀀âTà&êˆá&|W äxá&ê âTà&èa ¤á&ð4ÿîh ãïâ&ôà&îuâ4â&öh ãë{öùÿõ=õ(öýÿía ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿíd¶ä<öýÿí9 ä>ö(ö)ö;öùÿõ9õÿÿìæ:öùÿõDõÿÿô;öùÿõ}öùÿõ õýÿí”Cä=öýÿí<èä;öùÿõ>õ(öýÿí”Cä<öýÿí9 äiõýÿía ä>ö(öÿÿ ìænõýÿí”Cä)ö)öùÿõýÿí”CäaõýÿíÔ6 ä(öýÿí<èä,öýÿí9 ä-öýÿí”Cä)ö;öùÿõ=õ(öýÿí”Cä)öùÿõ{öùÿõ9õýÿí<èä:öùÿõDõýÿídä<öýÿí<èä>ö(öýÿía ä)ö;öùÿõ9õÿÿìæ*öýÿí<èä:öùÿõDõýÿídä<öÿÿìæ*öýÿí<èä>ö(öýÿía ä)ö;öùÿõ}öùÿõDõýÿídä<öýÿí9 ä>ö(öýÿía ä)ö;öùÿõ}ÿòôà&æ”í&ãhí&èIíÿá¨í&è4êÿâàí&èõ&ä8î& ôápð\ï&ätï&\ß&äÀõ&Ìk äàí&äXî&ãápî& ähî&àí&æ>ä€î&8î&>¼î&âÿèäèî&쀀âàí&êï&|W äï&ê âàí&èa 0ï&ð4ÿîh ãï¨ï&€î&î@âÀï&öh ãë{öùÿõ=õ(öýÿía ä)öùÿõ{öùÿõ9õÿÿô:öùÿõDõýÿíd¶ä<öýÿí9 ä>ö(ö)ö;öùÿõ9õÿÿìæ:öùÿõDõÿÿô;öùÿõ}öùÿõ;õ(öýÿía älõ(öÿÿ ìænõýÿí<èä)ö)öùÿõDõýÿídä<öýÿí<èä>ö(öýÿía ä)ö;öùÿõDõýÿídä<öýÿí9 ä>ö(öýÿía ä)ö;öùÿõ}ÿò€î&æ(ö&ãüõ&èIíÿá<ö&è4êþäÀö&d¶ôBáæøÿ&èœ÷&䏸&äÌú&Ðÿ&Ìkd¶ähö&äàö&ãáøö&d¶äðö&hö&戥 ä÷&Àö&ˆ¥ D÷&ÿèäp÷&ìR€€âhö&î|W äŒ÷&ê âhö&ä´÷&X ãïP#ááçÌ÷&èø÷&$ø&øIíûèPø&ü:îä|ø&üâÌk<èä êÿà÷&îâìø&ò{öDõXõ<öõ õ>ö(öýÿí€H ä(ö)ö)öoõ(öýÿí<èä-öýÿíX ä)ö;ö}úØú&Pÿ&ä0û&d¶ôBápð ü&ä$ü&hö&ä(ÿ&Ìkd¶äØú&äPû&ãáhû&d¶ä`û&Øú&戥 äxû&0û&ˆ¥ ´û&ÿèäàû&ìR€€âØú&î|W äüû&ê âØú&èX ãóxû&îâXü&ò{öDõXõ<öõ õ>ö(öýÿí€H ä(ö)ö)önõ(öýÿíX ä-öýÿí<èä)ö|öùÿõýÿíd¶ä<öýÿíX ä-öýÿí<èä>ö(ö)ö;ö}ÿòxû&æÿ&ãdÿ&èIíÿá¤ÿ&án½ ã4ÿÿæ÷&æäP'ôÿôápäx 'èÔ'ì'ì$'âÌkôÿäøÿ&äp'ãáˆ'ôÿä€'øÿ&æää˜'âP'ääÿìø¼ãëâ4'ôÿôápäÐ'*'ä'èÌkÚäì'äT'ãál'ôÿäd'ì'âÀ'ää|'â4'ääKâêö˜'ê˜RäÐ'4'˜R 'ÿèäH'ä8'äãì'ì âì' ät'èd'ì âì'ð8'ñ¤'è4êþâ'ôÿôápä´'*'ät'èÌk(ÙäÐ'ä8'ãáP'ôÿäH'Ð'â¤'ää`'â'ääKâêö˜'ê˜Rä´''˜Rð'ÿèä,'ä'äãÐ'ì âÐ' äX'èH'ì âÐ'ð'ñˆ'è4êþâü'ôÿôápä˜'*'äX'èÌk”Úä´'ä'ãá4'ôÿä,'´'âˆ'ääD'âü'ääKâêö˜'ê˜Rä˜'ü'˜RÔ'ÿèä'å'äã´'ì â´' ä<'è,'ì â´'ñ'ñl'è4êþâà'ôÿôápä|'*'ä<'èÌkÔÿ ä˜'å'ãá'ôÿä'˜'âl'ää('âà'ääKâêö˜'ê˜Rä|'à'˜R¸'ÿèäô'ää'äã˜'ì â˜' ä 'è'ì â˜'ðä'ñP'è4êþâÄ'ôÿôápä` '*'ä 'èÌkˆù ä|'ää'ãáü'ôÿäô'|'âP 'ää 'âÄ'ääKâêö˜'ê˜Rä` 'Ä'˜Rœ 'ÿèäØ 'äÈ 'äã|'ì â|' ä 'èô 'ì â|'ðÈ 'ñ4 'è4êþ⨠'ôÿôápäD '*'ä 'èÌkáhä` 'äÈ 'ãáà 'ôÿäØ '` 'â4 'ääð '⨠'ääKâêö˜'ê˜RäD '¨ '˜R€ 'ÿèä¼ 'ä¬ 'äã` 'ì â` ' äè 'èØ 'ì â` 'ð¬ 'ñ 'è4ê?þ⌠'ôÿôápä('*'äè 'èÌk|Ü äD 'ä¬ 'ãáÄ 'ôÿä¼ 'D 'â 'ääÔ '⌠'ääKâêö˜'ê˜Rä( 'Œ '˜Rd 'ÿèä  'ä 'äãD 'ì âD ' äÌ 'è¼ 'ì âD 'ð 'ñü 'è4êþâp'ôÿôápä '*'äÌ'èÌkÈÐ ä('ä'ãá¨'ôÿä '('âü'ää¸'âp'ääKâêö˜'ê˜Rä 'p'˜RH'ÿèä„'ät'äã('ì â(' ä°'è 'ì â('ðt'ñà'è4êÿþâT'ôÿôápäð'*'ä°'èÌk„gä 'ät'ãáŒ'ôÿä„' 'âà'ääœ'âT'ääKâê ö˜'ê˜Räð'T'˜R,'ÿèäh'äX'äã 'ì â ' ä”'è„'ì â 'ðX'ñÄ'è4êÿýâ8'ôÿôápäÔ'*'ä”'èÌkÈŠäð'äX'ãáp'ôÿäh'ð'âÄ'ää€'â8'ääKâê ö˜'ê˜RäÔ'8'˜R'ÿèäL'ä<'äãð'ì âð' äx'èh'ì âð'ð<'ñ¨'è4êÿýâ'ôÿôápä¸'*'äx'èÌk ÓäÔ'ä<'ãáT'ôÿäL'Ô'â¨'ääd'â'ääKâê ö˜'ê˜Rä¸''˜Rô'ÿèä0'ä 'äãÔ'ì âÔ' ä\'èL'ì âÔ'ð 'ñŒ'è4êÿýã'ôÿôápäœ'*'ä\'èÌkHUä¸'ä 'ãá8'ôÿä0'¸'âŒ'ääH'ã'ääKâê ö˜'ê˜Räœ'á '˜RØ'ÿèä'ä'äã¸'ì â¸' ä@'è0'ì â¸'ð'ñp'è4êÿýâä'ôÿôápä€'*'ä@'èÌkèhäœ'ä'ãá'ôÿä'œ'âp'ää,'âä'ääKâê ö˜'ê˜Rä€'ä'˜R¼'ÿèäø'äè'äãœ'ì âœ' ä$'è'ì âœ'ðè'ñT'è4êÿýâÈ'ôÿôápäd'*'ä$'èÌkÒä€'äè'ãâ'ôÿäø'€'âT'ää'âÈ'ääKâêö˜'ê˜Räd'È'˜R 'ÿèäÜ'äÌ'äã€'ì â€' ä'èø'ì â€'ðÌ'ñ8'è4êÿ?ýâ¬'ôÿôápäH'*'ä'èÌkÈ= äd'äÌ'ãáä'ôÿäÜ'd'â8'ääô'â¬'ääKâêö˜'ê˜RäH'¬'˜R„'ÿèäÀ'ä°'äãd'ì âd' äì'èÜ'ì âd'ð°'ñ'è4êÿýâ'ôÿôápè*'ää'çÌk äH'ä°'ãáÈ'ôÿäÀ'H'â'ääØ'â'ää âÿè˜Rä$''˜R`'ÿèäœ'äŒ'äãH'ì âH' äÈ'è¸'ì âH'ðŒ'ñø'è4ÿÿæ˜'L'âéx'¤'ø4êþIêÐ'äôâ âøÿ&à'çô'èé 'L 'øIíû4êþäÐ 'ˆ  ôáæ\*'è"'ä\#'ä¸%'4*'Ìkˆ  äx 'äð 'ãá!'ˆ  å!'x 'æ¸ì ä!'Ð '¸ì T!'ÿèä€!'ì€âx 'æâ¼!'„: äœ!'ì â¬!'æ ìè!'´)åØ!'ì äêfä"'ê â¬!' ä,"'öÿÿô;öpõýÿí„: ä,öqõýÿí´)å)öùÿõ*öýÿí„: ä=öýÿífä;öùÿõ}úÄ%'Ì)'ä&'ˆ  ôápð`''ä''x 'ä¤)'Ìkˆ  äÄ%'ä<&'ãáT&'ˆ  äL&'Ä%'æ¸ì äd&'&'¸ì  &'ÿèäÌ&'ì€âÄ%'æâ''„: äè&'ì âø&'æ ì4''´)å$''ì äêfäP''ê âø&' äx''õ(öýÿí… ä>öýÿí„: ä)öùÿõ*öqõýÿíüä=ö*öqõýÿí… ä;öùÿõDõýÿíüä;öùÿõ}ú\/'$5'ä´/'˜DõápðØ0'äð0'\*'ä ü4'Ìk˜Då\/'äÔ/'ãáì/'˜Dåä/'\/'æÜäü/'´/'Ü80'ÿèä„0'äd0'ä€â\/'æâ ât0'æ ì 0'„: äd0'ì¼0'… äd0'ðüäd0'ðö(öýÿí… ä-öýÿí„: ä)ö;öùÿõýÿíüäbõýÿí´)å;öùÿõýÿíHÏä(öýÿíüä,öýÿí„: ä,öýÿí´)å*öEõ(öýÿíö(öýÿí… ä-öýÿí„: ä)ö;öùÿõýÿíÔíä(öýÿíüä,öýÿí„: ä,öýÿí´)å*öEõ(öýÿíä¸C'ìA'>ôC'ÿèä D'äC'䀀â”A'êñ`E'ä¸M'(L'>ôM'ÿèä N'äPM'䀀âÐK'êõä,T'pR'>hT'ÿèä”T'ä˜S'䀀âR'ê°T'|W äñÔU'äðZ'`Y'>,['ÿèäX['äˆZ'䀀âY'êt['|W ä,Z'î„+å['ê âÐZ'êüÕ ä°['åüÕ È['è âÜ['ÐZ'æäø['äˆZ'䀀ã\'è@C'ö@C'êH\'H>õäda'¨_'> a'ÿèäÌa'äÐ`'䀀âP_'êèa'|W ät`'êb'„+åb'ì âDa' è`0å4a'ðüÕ ä@b'åüÕ Xb'è âlb'Da'æäˆb'äÐ`'ä€ä¤b'è@C'ìÀb'è@C'ö4a'ìôb'H>ñ c'ä(h'˜f'>dh'ÿèäh'äÀg'䀀â@f'ê¬h'|W ädg'î„+åÈh'ì âh' èüÕ äèh'åüÕ ái'è âi'h'æä0i'äÀg'ä€äLi'è@C'ø@C'ê€i'H>õäœn'àl'>Øn'ÿèäo'än'䀀âˆl'ê o'|W ä¬m'êLo'„+åñDp'ä`u'Ðs'>œu'ÿèäÈu'äøt'䀀âxs'êäu'|W äœt'î„+æv'ì â@u'êüÕ ä v'åüÕ 8v'è âLv'@u'æähv'äøt'ä€ä„v'è@C'ø@C'ê¸v'H>õä´{'z'>ð{'ÿèä|'ä<{'䀀âÀy'ê8|'|W ääz'êT|'`0åh{'ðÐ0å”{'ðÈ`ä€|'åÈ`˜|'è â¨|'æäÄ|'ä<{'êà|'èh{'ø”{'ì}'Déð,}'¨èòìñáîh~'ä´{'î âx}'ò{öDõýÿíÈ`ä(öýÿí`0å,öýÿíÐ0å)ö;ö}þ`z'îâœ~'ò:öýÿíÈ`ä(öýÿíL%å)ö{ö}ö¸'øl'æ â àG'|''äh{'è¤'â”{'ìâ<{'èà'ø`z'æ€'ø´{'æü€|'æäˆ€'˜=訂'èpäà…'èƒ'ä8ƒ'è…'Ìk˜=ä0€'䨀'ãáÀ€'˜=一'0€'âè'ôOäЀ'ˆ€'ôO 'Pÿèä8'ì€â0€'êd'|W äT'ì â0€'èL%å€'ì â'æä¼'ä¬'ê äòØ'ì 옂'>äø'ˆ€'>4‚'ÿèä`‚'ä¬'䀀â0€'ê|‚'|W äT'î`0åØ'ðÈ`䨂'åÈ`À‚'è âЂ'æäì‚'ä¬'öØ'ì ƒ'ð9ôìñáî,„'äø'îâlƒ'ò{öDõýÿíÈ`ä(öýÿí`0å)ö;ö}þЀ'îâ`„'ò:öýÿíÈ`ä(öýÿíL%å)ö{ö}öh…'ø0…'æ â ´I'@…'T…'äØ'ìâ¬'è…'øЀ'清'øø'æü¨‚'æä8†'”…謈'èpäÄ'è‰'ä4‰'脌'Ìk”…äà…'äX†'ãáp†'”…äh†'à…'✇'ôO䀆'8†'ôO¼†'ÿèäè†'ì€âà…'ê‡'|W ä‡'ì âà…'äP‡'`0å0‡'ê â@‡' ä ðÐ0ål‡'ê â|‡' ä â Œ‡' ¬ 윈'>䬇'8†'>è‡'ÿèä4ˆ'äˆ'䀀âà…'ê â $ˆ'H ìPˆ'|W ä‡'î`0ålˆ'ê â|ˆ' ä â Œˆ'‘ ì ‰'Üä䬈'á Ĉ'Üä$ˆ'èåf܈'æ âìˆ'æ â üˆ' ¬ ðfäĈ'äØÛ𠸊'h‰'¬‡'î  'öØÛð{öùÿõDõýÿíÜää(öýÿí`0å,ö*öýÿífä)ö;öùÿõ}úìŠ'€†'îâ‹'öØÛð:öýÿíÜää(öýÿí`0å)ö,öùÿõýÿífä(ö&öýÿíÐ0å)öùÿõ{öùÿõ}ö$'ø¬Œ'æ â ´I'¼Œ'ðŒ'äÐŒ'è â àŒ'‘ ðâ'è â 'H ìL'ø€†'æt'ø¬‡'æœ'ø¬ˆ'æüĈ'æäŽ'¬µ èô 'èpä¼§'è4¡'䨡'èD¥'Ìk¬µ äÄ'ä<Ž' ãáTŽ'¬µ äLŽ'Ä'â@'“ ädŽ'pŽ'æ â ´I'€Ž'èŽ'䔎'è â ¤Ž'‘ â ´Ž'Å â$–ÄŽ'èØŽ'è ðâüŽ'è â  'H â 'Å â$–,'èØŽ'è\'HJäP'ØŽ'æˆ' ¬äl'x'æ äæì'„¯ ä˜'¤'æ â ´'„¯ â ´I'Ä'Ø'䔎'ìâüŽ'èP'H äü''æ â 'H â ´I'('<'䔎'ìâüŽ'è\˜'ôOä`'Ž'ôOœ'ÿèäÈ'ì€âÄ'êô'|W ää'ì âÄ'䨔'`0å‘'ì â  ‘'Œ× â Ø&0‘'D‘'äØŽ'ìáX‘'èIê„‘'fôâ â d(”‘'¨‘'äØŽ'èà“'ἑ'èéè‘'“'øé’'“'øé@’'’'øIêl’'fôâ â°ý|’'èØŽ'èé¼’'è’'øIêØŽ'øâ4êþé@“'üIêl“'fôâ âØÔ|“'èØŽ'èI꼓'fôâ â ÛÌ“'èØŽ'èD”'áô“'èIê ”'fôâ â€Ì0”'èØŽ'ìáX”'èIê„”'fôâ âØÔ””'èØŽ'ìÐ0åÄ”'ì â Ô”'Œ× â Ø&ä”'ø”'äx'ìá •'èIê8•'fôâ â d(H•'\•'äx'è”—'áp•'è霕'D—'øéÈ•'È–'øéô•'D–'øIê –'fôâ â°ý0–'èx'èép–'œ–'øIêx'øâ4êþéô–'üIê —'fôâ âØÔ0—'èx'èIêp—'fôâ â Û€—'èx'èø—'ᨗ'èIêÔ—'fôâ â€Ìä—'èx'ìá ˜'èIê8˜'fôâ âØÔH˜'èx'è"ä '>¤œ'l˜'Ž'>¨˜'ÿèäÔ˜'ä'䀀âÄ'êð˜'|W ää'î`0å ™'ì â ™'ÔÏ â Ø&,™'@™'ä¤'ìáT™'èIꀙ'fôâ â d(™'¤™'ä¤'èÜ›'ḙ'èéä™'Œ›'øéš'›'øé<š'Œš'øIêhš'fôâ â°ýxš'è¤'è鸚'äš'øIê¤'øâ4êþé<›'üIêh›'fôâ âØÔx›'è¤'èI긛'fôâ â ÛÈ›'è¤'è@œ'áð›'èIêœ'fôâ â€Ì,œ'è¤'ìáTœ'èIꀜ'fôâ âØÔœ'è¤'쬜'Ž'>èœ'ÿèä'ä'ä€âÄ'ê0'|W ää'ð`0åL'ì â \'Ø â Ø&l'€'ä¤'ìá”'èIêÀ'fôâ â d(Ð'ä'ä¤'è 'áø'èé$ž'ÌŸ'øéPž'PŸ'øé|ž'Ìž'øIꨞ'fôâ â°ý¸ž'è¤'èéøž'$Ÿ'øIê¤'øâ4êþé|Ÿ'üIꨟ'fôâ âØÔ¸Ÿ'è¤'èIêøŸ'fôâ â Û 'è¤'耠'á0 'èIê\ 'fôâ â€Ìl 'è¤'ìá” 'èIêÀ 'fôâ âØÔР'è¤'è$¡'Üääô 'á ¡'ÜäØŽ'èåfx'ìfä ¡'L¡'ØÛô䈩'¨'>Ä©'ÿèäª'äð©'䀀⼧'ê âá ª'H ì,ª'|W äà¨'î`0åHª'ê âXª' ä â hª' ¬ ìèª'Üä䈪'á ª'Üäáª'èåf¸ª'æ âȪ'æ â ت'‘ ðfä ª'äØÛ𠔬'D«'ˆ©'î â\«'öØÛð{öùÿõDõýÿíÜää(ö*öýÿífä,öýÿí`0å)ö;öùÿõ}úȬ'\¨'îâà¬'öØÛð:öýÿíÜää(öýÿí`0å)ö,öùÿõýÿífä(ö&öýÿíÐ0å)öùÿõ{öùÿõ}÷¯'øˆ®'æ â ´I'˜®'Ì®'䬮'è â ¼®' ¬ ðâà®'è â ð®'H ì(¯'ø\¨'æP¯'øˆ©'æx¯'øˆª'æü ª'æäø¯'€¾'Hº'ø¯'>„º'ÿèä°º'ää±'䀀⠯'ê̺'|W äÀ²'î`0åèº'ì â øº'ÔÏ â Ø&»'»'䀱'ìá0»'èIê\»'fôâ â d(l»'€»'䀱'踽'á”»'èéÀ»'h½'øéì»'ì¼'øé¼'h¼'øIêD¼'fôâ â°ýT¼'耱'è锼'À¼'øIꀱ'øâ4êþé½'üIêD½'fôâ âØÔT½'耱'èIꔽ'fôâ â Û¤½'耱'è¾'á̽'èIêø½'fôâ â€Ì¾'耱'ìá0¾'èIê\¾'fôâ âØÔl¾'耱'숾'ø¯'>ľ'ÿèäð¾'ää±'ä€â ¯'ê ¿'|W äÀ²'ð`0å(¿'ì â 8¿'Ø â Ø&H¿'\¿'䀱'ìáp¿'èIꜿ'fôâ â d(¬¿'À¿'䀱'èøÁ'áÔ¿'èêÀ'¨Á'øé,À',Á'øéXÀ'¨À'øIê„À'fôâ â°ý”À'耱'èéÔÀ'áÁ'øIꀱ'øâ4êþéXÁ'üIê„Á'fôâ âØÔ”Á'耱'èIêÔÁ'fôâ â ÛäÁ'耱'è\Â'á Â'èIê8Â'fôâ â€ÌHÂ'耱'ìápÂ'èIêœÂ'fôâ âØÔ¬Â'耱'éÃ'ÜääÐÂ'á èÂ'Üä´°'èåfT±'ìfä èÂ'(Ã'ØÛôä8Ê'ðÉ'>tÊ'ÿèä Ê'쀀â˜É'êÌÊ'|W ä¼Ê'ê â˜É'è 7äèÊ'ê âøÊ' ä ðäÔÍ'¬Ì'>Î'ÿèä<Î'쀀âTÌ'êXÎ'|W äxÍ'ê¤Î'`0åtÎ'ê â„Î' ä â ”Î'‘ ðÐ0åÀÎ'ê âÐÎ' ä â àÎ' ¬ ðˆ˜ åÏ'刘 àÎ'ì‹ ðüÐ'äÔÍ'îâdÏ'ò{öDõXõ<öõ>ö(ö!öýÿ툘 ä(öýÿí`0å,öýÿíÐ0å)ö)ö;ö}þôÌ'îâ0Ñ'ò:öýÿ툘 ä(öýÿíÐú ä)ö{ö}öŒÒ'ùÒ'æ â àG'Ò'DÒ'ä$Ò'è â 4Ò'‘ ìxÒ'âXÒ'è â hÒ' ¬ ðî´Ò'øôÌ'æÜÒ'øÔÍ'æýÏ'æä\Ó'LdédÕ'èpäÙ'è|Õ'ä”Õ'è Ø'ÌkLdåÓ'ä|Ó'ãá”Ó'LdåŒÓ'Ó'âtÔ'ôOä¤Ó'\Ó'ôOàÓ'Pÿèä Ô'ì€âÓ'ê8Ô'|W ä(Ô'ì âÓ'èÐú äTÔ'ê âdÔ' ä ìTÕ'>ä„Ô'\Ó'>ÀÔ'ÿèäìÔ'쀀âÓ'êÕ'|W ä(Ô'î`0å$Õ'ê â4Õ' ä â DÕ'„¯ ðˆ˜ ädÕ'刘 DÕ'ì‹ ð0×'ä„Ô'îâÈÕ'ò{öDõXõ<öõ>ö(ö!öýÿ툘 ä(öýÿí`0å)ö)ö;ö}þ¤Ó'îâd×'ò:öýÿ툘 ä(öýÿíÐú ä)ö{ö}öŒØ'ø4Ø'æ â ´I'DØ'xØ'äXØ'è â hØ'„¯ ðî´Ø'ø¤Ó'æÜØ'ø„Ô'æüdÕ'æä\Ù'\©ôápähÜ'ètÚ'äŒÚ'èàÛ'Ìk\©äÙ'ä|Ù'ãá”Ù'\©äŒÙ'Ù'æ>ä¤Ù'\Ù'>àÙ'ÿèä Ú'쀀âÙ'ê8Ú'|W ä(Ú'ê âÙ'è`0åTÚ'ê âdÚ' ä ðö(ö!öýÿí`0å)ö;ö}ö@Ü'øÜ'æ â ´I'Ü',Ü'ädÚ'ìÿê¤Ù'æäÀÜ'Ä ôápäà'èôÝ'ä Þ'èxß'ÌkÄ ähÜ'äàÜ'ãáøÜ'Ä äðÜ'hÜ'æ>äÝ'ÀÜ'>DÝ'ÿèäpÝ'쀀âhÜ'êœÝ'|W äŒÝ'ê âhÜ'äØÝ'`0å¸Ý'ê âÈÝ' ä ðÐ0å¸Ý'îö(öýÿí`0åhõýÿíÐ0å)ö;ö}öìß'ø ß'æ â àG'°ß'Äß'äÈÝ'èØß'âÈÝ'ìÿêÝ'æälà'¨" ôápäÀã'è á'ä¸á'è$ã'Ìk¨" äà'äŒà'ãá¤à'¨" äœà'à'æ>ä´à'là'>ðà'ÿèäá'쀀âà'êHá'|W ä8á'ê âà'ä„á'`0ådá'ê âtá' ä ðÐ0ådá'îö(öýÿí`0åiõýÿíÐ0å)ö;ö}ö˜ã'øLã'æ â àG'\ã'pã'ätá'è„ã'âtá'ìÿê´à'æää'xhôápä´ç'èLå'ädå'èç'ÌkxhäÀã'ä8ä'ãáPä'xhäHä'Àã'æ>ä`ä'ä'>œä'ÿèäÈä'쀀âÀã'êôä'|W äää'ê âÀã'ä0å'`0åå'ê â å' ä ðÐ0åå'îö(ö!ö(öýÿíÐ0å<öýÿí`0å)ö)ö;ö}öŒç'ø@ç'æ â àG'Pç'dç'ä å'èxç'â å'ìÿê`ä'æä è'¤ ôápä¨ë'è@é'äXé'è ë'Ìk¤ ä´ç'ä,è'ãáDè'¤ ä<è'´ç'æ>äTè' è'>è'ÿèä¼è'쀀â´ç'êèè'|W äØè'ê â´ç'ä$é'`0åé'ê âé' ä ðÐ0åé'îö(ö!ö(öýÿí`0å<öýÿíÐ0å)ö)ö;ö}ö€ë'ø4ë'æ â àG'Dë'Xë'äé'èlë'âé'ìÿêTè'æåì'ì$ôápäTï'è4í'äLí'è¸î'Ìkì$ä¨ë'ä ì'ãá8ì'ì$ä0ì'¨ë'æ>äHì'á ì'>„ì'ÿèä°ì'쀀â¨ë'êÜì'|W äÌì'ê â¨ë'äí'`0åøì'ê âí' ä ðÐ0åøì'îö(öýÿí`0å<öýÿíÐ0å)ö;ö}ö,ï'øàî'æ â àG'ðî'ï'äí'èï'âí'ìÿêHì'æä¬ï'äôï'¬ï'>0ð'ÿèä\ð'쀀âTï'êˆð'|W äxð'ê âTï'äÄð'`0å¤ð'ê â´ð' ä ðÐ0å¤ð'îö(öýÿíÐ0å<öýÿí`0å)ö;ö}öØò'øŒò'æ â àG'œò'°ò'ä´ð'èÄò'â´ð'ìÿêôï'æäXó'˜Zôápäôö'èŒô'ä¤ô'èXö'Ìk˜Zåó'äxó'ãáó'˜Zäˆó'áó'æ>ä ó'Xó'>Üó'ÿèäô'쀀ãó'ê4ô'|W ä$ô'ê ãó'äpô'`0åPô'ê â`ô' ä ðÐ0åPô'îö(ö!ö(öýÿí`0åjõýÿíÐ0å)ö)ö;ö}öÌö'ø€ö'æ â àG'ö'¤ö'ä`ô'è¸ö'â`ô'ìÿê ó'æäL÷'hôápä ú'è€ø'ä˜ø'èú'Ìkhäôö'äl÷'ãá„÷'hä|÷'ôö'æ>ä”÷'L÷'>Ð÷'ÿèäü÷'쀀âôö'ê(ø'|W äø'ê âôö'ädø'`0åDø'ê âTø' ä ðÐ0åDø'îö(öýÿí`0åjõýÿíÐ0å)ö;ö}öxú'ø,ú'æ â àG'<ú'Pú'äTø'èdú'âTø'ìÿê”÷'æäøú'Ðh ôápätý'èü'ä(ü'èìü'ÌkÐh ä ú'äû'ãá0û'Ðh ä(û' ú'æ>ä@û'øú'>|û'ÿèä¸û'ä¨û'䀀â ú'ê ìäû'|W äÔû'ê â ú'è`0æü'ê â¨û' èäþ'Ìý'>Pþ'ÿèäŒþ'ä|þ'䀀âtý'ê ì¸þ'|W ä¨þ'ê âtý'ääþ'`0åÔþ'ê â|þ' èÐ0åÔþ'îä0(è(>l(ÿèä¨(ä˜(䀀â(ê ìÔ(|W äÄ(ê â(å(`0åð(ê â˜( èÐ0åð(îäL((>ˆ(ÿèäÄ(ä´(䀀â¬(ê ìð(|W äà(ê â¬(ä(`0å (ê â´( èÐ0å (îäh( (>¤(ÿèäà(äÐ(䀀âÈ(ê ì (|W äü(ê âÈ(ä8(`0å((ê âÐ( èÐ0å((îä„ (< (>À (ÿèäü (äì (䀀âä (ê ì( (|W ä (ê âä (äT (`0åD (ê âì ( èÐ0åD (îövõýÿí6ä>ö(ö)ö)ö;öùÿõ}þ@(âÔ"(8o#âX(ü !(öøð{öùÿõýÿí4‘ ä<öýÿíøä>öýÿí0}ä;öùÿõ>õ(ö*öýÿí-åkõÿÿô)öùÿõýÿí0}ä.öýÿíü„ä(öýÿíøä(ö*öýÿí-åpõ)ö)ö;öùÿõDõýÿí0}ä;öùÿõ}öÌk8oÜ!(âîð(ä|}îäœ"(äø!(äâ â d¹"(,"(ä"(è ìd"(â@"(è â@]P"(è"(ìâx"(è â|ôˆ"(è"(è¸"(-å ˜î 7ä"(ô$#(â%(x× ÿäl#(ò<#(øðT#(Uò¤¶ îÌkx× ¨#(âîÔ"(ä¬|îä,$(äÄ#(æâ âÔ#( ä â …ä#($(äø#(è ðâ$(è äæ$($ÂäH$(ì âX$( ä â …h$(|$(äø#(ìâ$(ì0}ä¬$(ì â¼$( ä â d¹Ì$(à$(äø#(èô$(â$(ìâ%(è äîh%(âx'(x× ÿä°%(ò€%(øð˜%(Uò¤¶ îÌkx× ì%(âî%(ä4qîäp&(ä&(æâ â&( ä â …(&(L&(ä<&(è ðâ`&(è äæÔ&($ÂäŒ&(ì âœ&( ä â …¬&(À&(ä<&(ìâ`&(è\'(0}äð&(ì ã'( ä â d¹'($'(ä<&(è8'(â`&(ìâL'(è äê±å<&(ôÈ'(âÜ)(”Qÿä((òà'(øðø'(Uò¤¶ îÌk”QL((âîx'(ä¸pîäÐ((äh((æâ âx(( ä â ­ˆ((¬((äœ((è ðâÀ((è äæT)(Øåäì((ì âü(( ä â ­ )(0)(ä )(è ðâD)(è äê0}äp)(ê â€)( ä â d¹)(¤)(ä )(è¸)(âD)(ìâÌ)(è äî,*(â@,(äQÿät*(òD*(øð\*(Uò¤¶ îÌkäQ°*(âîÜ)(äpkîä4+(äÌ*(æâ âÜ*( ä â …ì*(+(å+(è ðâ$+(è 俏+($ÂäP+(ì â`+( ä â …p+(”+(ä„+(è ðâ¨+(è äê0}äÔ+(ì âä+( ä â d¹ô+(,(ä„+(è,(â¨+(ìâ0,(è äî,(âX/(ˆp âØ,(üà-(ò¨,(øðÀ,(Uò¤¶ î{öùÿõýÿíØlä.öýÿíˆpä(öýÿí8Êä)ö;öùÿõ}öÌkˆp.(î@,(ä jîä8.(ìâà.(ØläT.(ì âd.( ä â d¹t.(˜.(äˆ.(è ì¼.(â¬.(è äêâÐ.(è äê8Êäü.(ì â /( ä â d¹/(0/(äˆ.(èD/(â¬.(ìâÐ.(ð¨/(âl2(°>âð/(ü@1(òÀ/(øðØ/(Uò¤¶ î{öùÿõDõýÿí8Êä.öýÿíÐu ä(öýÿíØlä)ölõÿÿô;öùÿõ}öÌk°>|1(îX/(äðiîä˜1(ìâÔ1(Ølä´1(ê âÄ1(æ ð8Êäð1(ê ã2( ä â d¹2($2(äÄ1(èH2(â82(è äêâ\2(è äî¼2(â€5(°>â3(üT4(òÔ2(øðì2(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ömõÿÿô;öùÿõ}öÌk°>4(îl2(äPiîä¬4(ìâT5(ØläÈ4(ê âØ4( ä â d¹è4( 5(äü4(è ì05(â 5(è äêâD5(è äê8Êäp5(ê âü4(îÐ5(âà8(°>â6(üh7(òè5(øñ6(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ömõÿÿô;öùÿõ}öÌk°>¤7(î€5(ämîäÀ7(ìâh8(ØläÜ7(ê âì7( ä â d¹ü7( 8(ä8(è ìD8(â48(è äêâX8(è äê8Êä„8(ê â”8( ä â d¹¤8(¸8(ä8(èÌ8(â48(ìâX8(ð09(âô;(Ø;âx9(üÈ:(òH9(øð`9(Uò¤¶ î{öùÿõDõýÿí8Êä.öýÿíÐu ä(öýÿíØlä)ömõÿÿô;öùÿõ}öÌkØ;;(îà8(äìlîä ;(ìâ\;(Ølä<;(ê âL;(æ ð8Êäx;(ê âˆ;( ä â d¹˜;(¬;(äL;(èÐ;(âÀ;(è äêâä;(è äîD<(â?(Ø;âŒ<(üÜ=(ò\<(øðt<(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ölõÿÿô;öùÿõ}öÌkØ;>(îô;(ä€lîä4>(ìâÜ>(ØläP>(ê â`>( ä â d¹p>(”>(ä„>(è ì¸>(â¨>(è äêâÌ>(è äê8Êäø>(ê â„>(îX?(âhB(Ø;â ?(üð@(òp?(øðˆ?(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ölõÿÿô;öùÿõ}öÌkØ;,A(î?(äükîäHA(ìâðA(ØlädA(ê âtA( ä â d¹„A(¨A(ä˜A(è ìÌA(â¼A(è äêâàA(è äê8Êä B(ê âB( ä â d¹,B(@B(ä˜A(èTB(â¼A(ìâàA(ð¸B(â|E(´:ãC(üPD(òÐB(øðèB(Uò¤¶ î{öùÿõDõýÿí8Êä.öýÿíÐu ä(öýÿíØlä)ö<öÿÿô;öùÿõ}öÌk´:ŒD(îhB(äHàîä¨D(ìâäD(ØläÄD(ê âÔD(æ ð8ÊåE(ê âE( ä â d¹ E(4E(äÔD(èXE(âHE(è äêâlE(è äîÌE(âH(´:âF(üdG(òäE(øðüE(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ö>öÿÿô;öùÿõ}öÌk´: G(î|E(äáîä¼G(ìâdH(ØläØG(ê âèG( ä â d¹øG(H(ä H(è ì@H(â0H(è äêâTH(è äê8Êä€H(ê â H(îàH(âðK(´:â(I(üxJ(òøH(øðI(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ö>öÿÿô;öùÿõ}öÌk´:´J(îH(äèÝîäÐJ(ìâxK(ØläìJ(ê âüJ( ä â d¹ K(0K(ä K(è ìTK(âDK(è äêâhK(è äê8Êä”K(ê â¤K( ä â d¹´K(ÈK(ä K(èÜK(âDK(ìâhK(ð@L(âO( <âˆL(üØM(òXL(øðpL(Uò¤¶ î{öùÿõDõýÿí8Êä.öýÿíÐu ä(öýÿíØlä)ö>öÿÿô;öùÿõ}öÌk <N(îðK(ä4Þîä0N(ìâlN(ØläLN(ê â\N(æ ð8ÊäˆN(ê â˜N( ä â d¹¨N(¼N(ä\N(èàN(âÐN(è äêâôN(è äîTO(âR( <âœO(üìP(òlO(øð„O(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ö<öÿÿô;öùÿõ}öÌk <(Q(îO(ä`ÞîäDQ(ìâìQ(Ølä`Q(ê âpQ( ä â d¹€Q(¤Q(ä”Q(è ìÈQ(â¸Q(è äêâÜQ(è äê8ÊäR(ê â”Q(îhR(âxU( <â°R(ýT(ò€R(øð˜R(Uò¤¶ î{öùÿõDõýÿíØlä.öýÿíÐu ä(öýÿí8Êä)ö<öÿÿô;öùÿõ}öÌk <ö(öýÿíØlä)ö.öýÿíäB ä(öÿÿìæ,öýÿí8Êä)ö;öùÿõ}öÌkì9Üm(îÈj(äðÌîätn(äøm(äâ â d¹n(,n(än(è ìPn(â@n(è äêâdn(è äæo(Ølän(ê â n( ä â d¹°n(Ôn(äÄn(è ìøn(âèn(è äêâ o(è äê8ÊäÄn(ôˆo(âˆs(ì9âÐo(üàq(ò o(øð¸o(Uò¤¶ î{öùÿõDõýÿí4‘ ä<öýÿíøä,öýÿíUä,öýÿí¤¶ ä>ö(öýÿíØlä)ö.öýÿíäB ä(öýÿí8Êä)ö;öùÿõ}öÌkì9r(î8o(äèÍîä´r(ä8r(äâ â d¹Hr(lr(ä\r(è ìr(â€r(è äêâ¤r(è äæ\s(ØläÐr(ê âàr( ä â d¹ðr(s(äs(è ì8s(â(s(è äêâLs(è äê8Êäxs(ê âs(îØs(âøw(ì9â t(ü`v(òðs(øðt(Uò¤¶ î{öùÿõDõýÿí4‘ ä<öýÿíøä,öýÿíUä,öýÿí¤¶ ä>ö(öÿÿìæ,öýÿíØlä)ö.öýÿíäB ä(öýÿí8Êä)ö;öùÿõ}öÌkì9œv(îˆs(äpÏîä4w(ä¸v(äâ â d¹Èv(ìv(äÜv(è ìw(ãw(è äêâ$w(è äæ`w(ØläPw(ì ð8Êä|w(ê âŒw( ä â d¹œw(°w(äPw(èÔw(âÄw(è äêâèw(è äîHx(âH|(ì9âx(ü z(ò`x(øðxx(Uò¤¶ î{öùÿõDõýÿí4‘ ä<öýÿíøä,öýÿíUä,öýÿí¤¶ ä>ö(öýÿíØlä)ö.öýÿíäB ä(öýÿí8Êä)ö;öùÿõ}öÌkì9Üz(îøw(ä(Ðîät{(äøz(äâ â d¹{(,{(ä{(è ìP{(â@{(è äêâd{(è äæ°{(Ølä{(ê â {(æ ð8ÊäÌ{(ê âÜ{( ä âd¹ì{(á|(ä {(è$|(â|(è äêâ8|(è äî˜|(âP¼&ì9âà|(üð~(ò°|(øðÈ|(Uò¤¶ î{öùÿõDõýÿí4‘ ä<öýÿíøä,öýÿíUä,öýÿí¤¶ ä>ö(öýÿíØlä)ö.öýÿíäB ä(öýÿí8Êä)ö;öùÿõ}öÌkì9,(îH|(äËîäÄ(äH(äâ â d¹X(|(äl(è ì (â(è äêâ´(è äæl€(Øläà(ê âð( ä âd¹á€($€(ä€(è ìH€(â8€(è äêâ\€(è äê8Ê䈀(ê ☀( ä â d¹¨€(¼€(ä€(èЀ(â8€(ìâ\€(è€(€Oäô€($¸€O8(âHÿæpí æäd(äœBä €âÜ·ð|W ä@(ì"˜ƒ(˜R8‚(($¸˜RÔ(Hÿædë æå‚(äð(ä€âÜ·ì‚(|W ä@(ð0}äð(êè‚(@‚($¸˜R„‚(Hÿæ8é æä°‚(äð(ä€âÜ·ìÌ‚(|W ä@(ð-å ˜îð‚($¸˜R4ƒ(Hÿæìæ æä`ƒ(äð(ä€âÜ·ì|ƒ(|W ä@(ðè#õ"È„(Ì' 4„(¨ƒ($¸Ì' ìƒ(Hÿæ´ä æä„(ä(ä€âÜ·ð|W ä@(ð<„($¸Ì' €„(Hÿæ”â æä¬„(äH·ä€€âÜ·ð|W ä@(ê"ø…(p d…(Ø„($¸p …(Hÿæüß æäH…(ä(ä€âÜ·ð|W ä@(ðl…($¸p °…(Hÿæ|Ý æäÜ…(äH·ä€€âÜ·ð|W ä@(ê"(‡( O ”†(†($¸ O L†(Hÿæ\Û æäx†(äX(ä€âÜ·ð|W ä@(ðœ†($¸ O à†(Hÿæ<Ù æä ‡(䴶䀀âÜ·ð|W ä@(ê"Xˆ(Ôîć(8‡($¸Ôî|‡(HÿæøÖ æä¨‡(äX(ä€âÜ·ð|W ä@(ð̇($¸Ôîˆ(Hÿæ|Ô æä<ˆ(䴶䀀âÜ·ð|W ä@(êôˆ(¤ ähˆ($¸¤ ¬ˆ(Hÿæ¤Ò æä؈(쀀âÜ·ð|W ä@(ê‰(بä‰($¸بH‰(HÿæÌÐ æät‰(쀀âÜ·ð|W ä@(ê,Š(0 ä ‰($¸0 ä‰(Hÿæ4Î æäŠ(쀀âÜ·ð|W ä@(ê°‹(ü á‹(<Š($¸ü €Š(âHÿæäÈ æä¬Š(ì€âÜ·ìÈŠ(|W ä@(ìäŠ(´)ùè#ù‹($¸ü L‹(HÿæÆ æäx‹(ì€âܷ씋(|W ä@(ð´)õLŒ(4ÖäÀ‹($¸4ÖŒ(Hÿæx³ æä0Œ(쀀âÜ·ð|W ä@(ê0(ÈLä\Œ($¸ÈL Œ(âHÿæ,¥ æäÌŒ(ì€âÜ·ìèŒ(|W ä@(ðLÜ(ð4ÿêÌ(,X ä@($¸,X „(Hÿæ £ æä°(ì€âÜ·ð|W ä@(ìhŽ(°‚ äÜ($¸°‚ Ž(Hÿæ¡ æäLŽ(쀀âÜ·ð|W ä@(ê"Ð(˜5 (xŽ($¸˜5¼Ž(Hÿ怞 æäèŽ(äH• âÜ·ì(|W ä@(îàø(($¸˜5l(âHÿæÌ› æä˜(äH•ä€âÜ·ì´(|W ä@(ðàô8‘(t;ˆ(à($¸t;$(âHÿæl— æäP(äH• âÜ·ìl(|W ä@(îàø($¸t;Ô(âHÿæô’ æå‘(äH•ä€âÜ·ì‘(|W ä@(ðàô"P“(Cð‘(H‘($¸CŒ‘(Hÿæè æä¸‘(äð(ä€âÜ·ìÔ‘(|W ä@(ð0}äð(ê ’(ø‘($¸C<’(Hÿ漎 æäh’(äð(ä€âÜ·ì„’(|W ä@(ð-å ˜î¨’($¸Cì’(HÿæpŒ æä“(äð(ä€âÜ·ì4“(|W ä@(ðè#õ"¤š(äB ”(`“($¸äB ¤“(HÿæŠ æäГ(äð(ä€âÜ·ìì“(|W ä@(ð0}äð(êð”(”($¸äB T”(âHÿæ¸ æä€”(äð(ä€âܷ윔(|W ä@(츔(0}äð(êÔ”(àø´)õ¼•(ø”($¸äB <•(âHÿæ¨u æäh•(äð(ä€âÜ·ì„•(|W ä@(ì •(-å ˜î´)õl–(Ä•($¸äB –(HÿæÔr æä4–(äð(ä€âÜ·ìP–(|W ä@(ð-å ˜ê8—(t–($¸äB ¸–(âHÿæði æää–(äð(ä€âÜ·í—(|W ä@(ì—(´)ùè#ù@—($¸äB |—(ëü—(ä ©î䨗(äð(äâÜ·ìÄ—(|W ä@(ìà—(„: äÔT&ð… äÔT&í U&¸L˜(âˆ(äB âd˜(ü4T&öôã âì{öùÿõDõýÿí,ä(öýÿí„: ä,öýÿí… ä,öýÿí´qä<öýÿíûä<öýÿíôã ä>övõýÿí6ä>ö(ö)ö)ö;öùÿõ}ö\›(ü„ä´š($¸ü„øš(HÿætY æä$›(ì€âÜ·ì@›(|W ä@(ðè#õø›(ôw äl›($¸ôw °›(Hÿæ æäÜ›(ì€âÜ·ð|W ä@(ì"L£(DÀ°œ(œ($¸DÀLœ(HÿæW æäxœ(äð(ä€âܷ씜(|W ä@(ð0}äð(ê˜(¸œ($¸DÀüœ(âHÿælK æä((äð(ä€âÜ·ìD(|W ä@(ì`(0}äð(ê|(àø´)õdž( ($¸DÀä(âHÿæ,G æäž(äð(ä€âÜ·ì,ž(|W ä@(ìHž(-å ˜î´)õŸ(lž($¸DÀ°ž(HÿæXD æäÜž(äð(ä€âÜ·ìøž(|W ä@(ð-å ˜êàŸ(Ÿ($¸DÀ`Ÿ(âHÿæ(@ æäŒŸ(äð(ä€âܷ쨟(|W ä@(ìÄŸ(´)ùè#ùèŸ($¸DÀ$ (뤠(ä8­îäP (äð(äâÜ·ìl (|W ä@(술(„: ä X&ð… ä X&ì ÌX&¸ô (âü—(DÀâ ¡(ýX&öôã âì{öùÿõDõýÿípë ä(öýÿí„: ä,öýÿí… ä,öýÿí´qä<öýÿíûä<öýÿíôã ä>övõýÿí6ä>ö(ö)ö)ö;öùÿõ}ö"$¬(Hô ¤(\£($¸Hô £(Hÿæ/ æäÌ£(äð(ä€âÜ·ìè£(|W ä@(ì¤(_ø0}äð(ê$¥((¤($¸Hôl¤(Hÿæð+ æä˜¤(äð(ä€âÜ·ì´¤(|W ä@(ìФ(_ôì¤(0}äð(ê¥(˜^ø´)õ ¦(,¥($¸Hôp¥(Hÿæü( æäœ¥(äð(ä€âܷ츥(|W ä@(ìÔ¥(àôð¥(-å ˜î´)õئ(¦($¸HôX¦(HÿæÜ% æä„¦(äð(ä€âÜ·ì ¦(|W ä@(켦(àø-å ˜êÀ§(à¦($¸Hô$§(Hÿæø" æäP§(äð(ä€âÜ·ìl§(|W ä@(숧(àô¤§(´)ùè#õŒ¨(ȧ($¸Hô ¨(Hÿæ æä8¨(ä(ä€âÜ·ìT¨(|W ä@(ìp¨(„+å(ðè#õt©(”¨($¸Hôب(Hÿæ< æä©(ì€âÜ·ì ©(|W ä@(ì<©(„+å(ìX©(´)ùè#ù|©($¸Hô¸©(ëTª(äܬîää©(ìâÜ·íª(|W ä@(ìª(„+å(ì8ª(„: äx\&ð… äx\&ì ¤\&¸¤ª(⤠(Hô⼪(ü¼[&öôã âì{öùÿõýÿí\•å(öýÿí„+å,öýÿí„+å,öýÿí„: ä,öýÿí… ä)ö;öùÿõ}ö"Ì®(œêP­(4¬($¸œêx¬(Hÿæô æä¤¬(äð(ä€âÜ·ìÀ¬(|W ä@(ì ­(àܬ(ð4ÿî´)á$­(ðIê  d¹d¹ðã®(X­($¸œêœ­(Hÿç æäÈ­(ä(ä€âÜ·ìä­(|W ä@(ðзä(ð®($¸œêL®(Hÿæh æäx®(ä(ä€âÜ·ì”®(|W ä@(ì°®(„: ä(ð… ä(ìà¼(\•Ἧ(Ü®($¸\•á ¯(Hÿæd æäL¯(äð(ä€âÜ·ìh¯(|W ä@(섯(_ô ¯(,ø0}äð(êܰ(į($¸\•á°(âHÿçøæä4°(äð(ä€âÜ·ìP°(|W ä@(ìl°(_ôˆ°(,ô¤°(0}äð(êÀ°(˜^ø¨ôà±(ä°($¸\•á(±(Hÿæ`ôæäT±(äð(ä€âÜ·ìp±(|W ä@(쌱(àô¨±(,ôı(-å ˜î¨ôȲ(è±($¸\•á,²(HÿæôðæäX²(äð(ä€âÜ·ìt²(|W ä@(ì²(àô¬²(,ø-å ˜ê̳(в($¸\•á³(âHÿæÏæä@³(äð(ä€âÜ·ì\³(|W ä@(ìx³(àô”³(,ô°³(¨øè#õ´´(Ô³($¸\•á´(Hÿæ<ËæäD´(äð(ä€âÜ·ì`´(|W ä@(ì|´(˜ä(옴(<Ÿä(ð0}äð(긵(¼´($¸\•âµ(HÿæôÆæä,µ(äð(ä€âÜ·ìHµ(|W ä@(ìdµ(˜ä(쀵(<Ÿä(융(-å ˜î´)õ ¶(Àµ($¸\•á¶(HÿæøÂæä0¶(äð(ä€âÜ·ìL¶(|W ä@(ìh¶(˜ä(ì„¶(<Ÿä(ð-å ˜ê¤·(¨¶($¸\•áì¶(Hÿ戾æä·(äð(ä€âÜ·ì4·(|W ä@(ìP·(˜ä(ìl·(<Ÿä(숷(´)ùè#ù ¬·($¸\•á è·(ë ¸(äL¬îä¸(äð(äâÜ·ì0¸(|W ä@(ìL¸(˜ä(ìh¸(<Ÿä(세(dÑäÄ_&ðDÓäÄ_&ì ð_&¸ð¸(âÄü\•á)â¹(üì^&öôã âì{öùÿõDõýÿíèDä(öýÿí|rä(öýÿí˜ä-öýÿíÌ' ä(ö)ö)ö,öýÿí|rä(öýÿí<Ÿä-öýÿí˜ä)ö,öýÿídÑä,öýÿíDÓä,öùÿõýÿí´qä<öýÿíûä<öýÿíôã ä>övõýÿí6ä>ö(ö)ö)ö;öùÿõ}öü½(ŒŠäð¼($¸ŒŠ4½(âHÿæhŽæä`½(쀀âÜ·ì|½(|W ä@(꘽(-å ˜ì´½(´)ùàн(ð4ÿê´¾(ˆpä ¾($¸ˆpP¾(âHÿæô‡æä|¾(ì€âܷ옾(|W ä@(ð0}äð(ìP¿(îäľ($¸î¿(Hÿæ†æä4¿(ä ˜â€€âÜ·ð|W ä@(êì¿(… ä`¿($¸… ¤¿(âHÿæÄæäп(ä ˜â€€âÜ·ð|W ä@(êˆÀ(è„å ü¿($¸è„á@À(HÿæìæälÀ(äÀøä€€âÜ·ð|W ä@(ê"`Ä(| ˆÁ(˜À($¸| ÜÀ(Hÿç|æäÁ(쀀âÜ·ì$Á(|W ä@(ê@Á(0}äð(îà\Á(ð4ÿêpÂ(Á($¸| ÔÁ(âHÿæ,næåÂ(쀀âÜ·ìÂ(|W ä@(ê8Â(-å ˜êTÂ(àø´)õhÃ(xÂ($¸| ¼Â(HÿæàjæäèÂ(쀀âÜ·ìÃ(|W ä@(ê Ã(-å ˜îà<Ã(ð4ÿîpÃ($¸| ´Ã(âHÿæÄbæäàÃ(쀀âÜ·ìüÃ(|W ä@(êÄ(è#ùà4Ä(ð4ÿê"8È(>`Å(pÄ($¸>´Ä(HÿæÐ^æäàÄ(쀀âÜ·ìüÄ(|W ä@(êÅ(0}äð(îà4Å(ðIê ¸_d¹d¹ðâHÆ(hÅ($¸>¬Å(âHÿæ|OæäØÅ(쀀âÜ·ìôÅ(|W ä@(êÆ(-å ˜ê,Æ(àø´)õ@Ç(PÆ($¸>”Æ(Hÿæ(LæäÀÆ(쀀âÜ·ìÜÆ(|W ä@(êøÆ(-å ˜îàÇ(ðIê 0Md¹d¹ðæHÇ($¸>ŒÇ(âHÿæAæä¸Ç(쀀âÜ·ìÔÇ(|W ä@(êðÇ(è#ùà È(ðIê Bd¹d¹ðâ"Ì(hç8É(HÈ($¸hçŒÈ(Hÿæ0=æä¸È(쀀âÜ·ìÔÈ(|W ä@(êðÈ(0}äð(îà É(ð4ÿê Ê(@É($¸hç„É(âHÿæ2æä°É(쀀âÜ·ìÌÉ(|W ä@(êèÉ(-å ˜êÊ(àø´)õË((Ê($¸hçlÊ(HÿæÈ.æä˜Ê(쀀âÜ·ì´Ê(|W ä@(êÐÊ(-å ˜îàìÊ(ð4ÿî Ë($¸hçdË(âHÿæô&æäË(쀀âÜ·ì¬Ë(|W ä@(êÈË(è#ùàäË(ð4ÿê"èÏ(ÔþÍ( Ì($¸ÔþdÌ(Hÿç#æäÌ(쀀âÜ·ì¬Ì(|W ä@(êÈÌ(0}äð(îàäÌ(ðIê è#d¹d¹ðâøÍ(Í($¸Ôþ\Í(âHÿæDæäˆÍ(쀀âÜ·ì¤Í(|W ä@(êÀÍ(-å ˜êÜÍ(àø´)õðÎ(áÎ($¸ÔþDÎ(HÿæðæäpÎ(쀀âÜ·ìŒÎ(|W ä@(ê¨Î(-å ˜îàÄÎ(ðIê ød¹d¹ðæøÎ($¸Ôþ<Ï(âHÿætæähÏ(쀀âÜ·ì„Ï(|W ä@(ê Ï(è#ùà¼Ï(ðIê ld¹d¹ðâ"ÀÓ(èõ èÐ(øÏ($¸èõ <Ð(HÿæˆæähÐ(쀀âÜ·ì„Ð(|W ä@(ê Ð(0}äð(îà¼Ð(ð4ÿêÐÑ(ðÐ($¸èõ 4Ñ(âHÿæìöæä`Ñ(쀀âÜ·ì|Ñ(|W ä@(ê˜Ñ(-å ˜ê´Ñ(àø´)õÈÒ(ØÑ($¸èõ Ò(Hÿæ óæäHÒ(쀀âÜ·ìdÒ(|W ä@(ê€Ò(-å ˜îàœÒ(ð4ÿîÐÒ($¸èõ Ó(âHÿæ´ëæä@Ó(쀀âÜ·ì\Ó(|W ä@(êxÓ(è#ùà”Ó(ð4ÿê"˜×(ìr ÀÔ(ÐÓ($¸ìr Ô(HÿæÀçæä@Ô(쀀âÜ·ì\Ô(|W ä@(êxÔ(0}äð(îà”Ô(ðIê ¨èd¹d¹ðâ¨Õ(ÈÔ($¸ìr Õ(âHÿæŒÙæä8Õ(쀀âÜ·ìTÕ(|W ä@(êpÕ(-å ˜êŒÕ(àø´)õ Ö(°Õ($¸ìr ôÕ(Hÿæ8Öæä Ö(쀀âÜ·ì<Ö(|W ä@(êXÖ(-å ˜îàtÖ(ðIê @×d¹d¹ðæ¨Ö($¸ìr ìÖ(âHÿæ¤Ëæä×(쀀âÜ·ì4×(|W ä@(êP×(è#ùàl×(ðIê œÌd¹d¹ðâÄØ(Pä¨×($¸Pì×(âHÿæ(ÅæäØ(äܷ䀀âÜ·ì4Ø(|W ä@(ê |Ø(àPØ(ð4ÿî´)á˜Ø(ðIê <Æd¹d¹ðâ" Þ(Ðu |Ù(ÔØ($¸Ðu Ù(Hÿæ$ÁæäDÙ(쀀âÜ·ì`Ù(|W ä@(î0}äð(êdÚ(„Ù($¸Ðu ÈÙ(Hÿæ½æäôÙ(쀀âÜ·ìÚ(|W ä@(ê,Ú(_ôHÚ(,ø0}äð(ê„Û(lÚ($¸Ðu °Ú(âHÿæðµæäÜÚ(쀀âÜ·ìøÚ(|W ä@(êÛ(_ô0Û(,ôLÛ(0}äð(êhÛ(˜^ø¨ô4Ü(ŒÛ($¸Ðu ÐÛ(Hÿ挲æäüÛ(쀀âÜ·ìÜ(|W ä@(î-å ˜êÝ(<Ü($¸Ðu €Ü(Hÿæ ¯æä¬Ü(쀀âÜ·ìÈÜ(|W ä@(êäÜ(_õÝ(,ø-å ˜î$Ý($¸Ðu hÝ(âHÿæü¢æä”Ý(쀀âÜ·ì°Ý(|W ä@(êÌÝ(_ôèÝ(,ôÞ(-å ˜î¨ô"Pß(ü~ ¼Þ(0Þ($¸ü~ tÞ(Hÿæ 3!æä Þ(ä ˜ä€âÜ·ð|W ä@(ðÄÞ($¸ü~ ß(Hÿæð1!æä4ß(ä ˜â€€âÜ·ð|W ä@(êìß(·ä`ß($¸·¤ß(Hÿç0!æäÐß(ì€âÜ·èæ4Öô"<ç($°ã(üß($¸$8à(îðà(äì«îädà(ìâÜ·ì€à(|W ä@(ìœà(Ì' äÀf&ì¸à(p äÀf&ìÔà(Ä"刿î 7äœÞ&ì ”g&¸@á(â ¸($âXá(ü f&öôã âì{öùÿõýÿíœ>ä(öXõ<öýÿí|rä>ö(öýÿíÌ' ä)ö,öXõ<öýÿíøä>ö(öýÿíp ä)ö,öýÿíÄ"å)ö;öùÿõ}ú¸ã($¸$ôã(î¬ä(䜯îä ä(ìâÜ·ì<ä(|W ä@(ìXä(Ì' äüj&ìtä(p äüj&ìä(Ä"刿î 7äÜÝ&ì Ðk&¸üä(âðà($âå(ü\j&öôã âì{öùÿõýÿíœ>ä(öýÿíÌ' ä,öýÿíp ä,öýÿíÄ"å,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}öìÿ(œ>Hñ(Lç($¸œ>ˆç(âî@è(ä8¯îä´ç(ìâÜ·ìÐç(|W ä@(ììç(Ì' äo&ìè(p äo&ì$è( 7䈿î 7ä,Žì ”o&¸è(â¬ä(œ>\â¨è(üpn&öôã âì{öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõýÿí4å=öÿÿô;öùÿõ;õ(öýÿíÌ' äkõýÿíp ä)öùÿõ{öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿíÌ' äkõýÿíp ä;öpõýÿíÌ' ä)öùÿõ*öOõaõ*öýÿíÌ' ä;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}öùÿõ}öüü(Pñ($¸œ>Œñ(âîDò(ä0¼îä¸ñ(ìâÜ·ìÔñ(|W ä@(ìðñ(Ì' äDy&ì ò(p äDy&ì(ò( 7䈿î 7äàŒì Èy&¸”ò(â@è(œ>nâ¬ò(ü¤x&ö, âì{öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öÿÿô;öùÿõýÿí4å=öÿÿô;öùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿíÌ' ä,öýÿíp ä)ö;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõýÿí,Ôä=öýÿí´)å;öùÿõýÿí´)å=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿí´)å+öÿÿìæ)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿíÌ' ä,öýÿíp ä,öýÿí4å)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿí´)å)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí´)å;öùÿõ}öùÿõ}÷þ(ý($¸œ>Hý(Hÿæh!æätý(ì€âÜ·ìý(|W ä@(ì¬ý(Ì' ä ˜ìÈý(p ä ˜ìäý(Ä"刿î 7äHŠìÿ(þ($¸œ>Lþ(âHÿæxü æäxþ(ì€âÜ·ì”þ(|W ä@(ì°þ(Ì' ä ˜êÌþ(p ä ˜êèþ( 7䈿î 7äHŠð ÿ($¸œ>Pÿ(âHÿæÈð æä|ÿ(ì€âÜ·ì˜ÿ(|W ä@(ì´ÿ(´)õÐÿ(è#ù 7䈿ê"Ô),|)üÿ($¸,8)îÔ)äd»îäd)äð(äâÜ·ì€)|W ä@(ìœ)„: äH…&ì¸)… äH…&ð 7äœÞ&ì à…&¸$)âDò(,â<)ü¨„&öôã âì{öùÿõDõýÿíäB ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿíøä>ö(öýÿí… ä)ö)ö;öùÿõ}ú„)$¸,À)î\)䬺îäì)äð(äâÜ·ì)|W ä@(ì$)„: ä0‰&ì@)… ä0‰&ð 7äÜÝ&ì ȉ&¸¬)âÔ),âÄ)üˆ&öôã âì{öùÿõDõýÿíÌä(öýÿí„: ä,öýÿí… ä,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}öä)Ì\ )ä)$¸Ì )âî¼)åºîäL)äð(äâÜ·ìh)|W ä@(ì„)„: äðŒ&ì )… äðŒ&ð 7ä,Žì 8&¸ )â\)Ì-â$)üPŒ&öôã âì{öùÿõýÿí4‘ äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿí4‘ ä&öýÿí¸_ä=öýÿíxÃä;öùÿõDõýÿíÌä(öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö)d )$¸Ì  )âî< )ä(¿îäÌ )äð(äâÜ·ìè )|W ä@(ì )„: 䀒&ì )… 䀒&ð 7äàŒì È’&¸Œ )â¼)Ì:⤠)üà‘&ö, âì{öùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõýÿí|räýÿ혇ä=öýÿí¤ ä(ö)ö;öùÿõýÿíxrä(öýÿ혇ä+öýÿí@ä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíü~ ä(ö)ö+öýÿ혇ä)ö;öùÿõDõ*öOõ;öùÿõ}öü))$¸Ì`)âHÿæ´_ æäŒ)äð(ä€âÜ·ì¨)|W ä@(ìÄ)„: ä ˜êà)… ä ˜î 7äHŠð)$¸ÌH)Hÿæ¨[ æät)äð(ä€âÜ·ì)|W ä@(ì¬)„: ä ˜ìÈ)… ä ˜ð 7äHŠì"Ì)pë t)ô)$¸pë 0)îÌ)䬾îä\)äð(äâÜ·ìx)|W ä@(ì”)„: ä`™&ì°)… ä`™&ð 7äœÞ&ì ø™&¸)â< )pë â4)üÀ˜&öôã âì{öùÿõDõýÿíDÀä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿíøä>ö(öýÿí… ä)ö)ö;öùÿõ}ú|)$¸pë ¸)îT)ä¾îää)äð(äâÜ·í)|W ä@(ì)„: äH&ì8)… äH&ð 7äÜÝ&ì à&¸¤)âÌ)pë â¼)ü¨œ&öôã âì{öùÿõDõýÿí´Bä(öýÿí„: ä,öýÿí… ä,ö õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}ö))´BT!)Ü)$¸´B)âî´)äô¼îäD)äð(äâÜ·ì`)|W ä@(ì|)„: ä¡&ì˜)… ä¡&ð 7ä,Žì P¡&¸)âT)´B-â)üh &öôã âì{öùÿõýÿí4‘ äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿí4‘ ä&öýÿí¸_ä=öýÿíxÃä;öùÿõDõýÿí´Bä(öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö4')\!)$¸´B˜!)âî4")ä@ÂîäÄ!)äð(äâÜ·ìà!)|W ä@(ìü!)„: 䘦&ì")… 䘦&ð 7äàŒì à¦&¸„")â´)´B1âœ")üø¥&ö, âì{öùÿõùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõýÿíxrä(öýÿí@ä,ö[õ)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíü~ ä(ö)ö)ö;öùÿõDõ*öOõ;öùÿõ}ö()<')$¸´B€')âHÿæÔ5 æä¬')äð(ä€âÜ·ìÈ')|W ä@(ìä')„: ä ˜ë()… ä ˜î 7äHŠð$()$¸´Bh()HÿæÈ1 æä”()äð(ä€âÜ·ì°()|W ä@(ìÌ()„: ä ˜ìè()… ä ˜ð 7äHŠì"41)èD,-)))$¸èDP))î$*)ä(Áîä|))äð(äâÜ·ì˜))|W ä@(ì´))àôÐ)), ôì))„: äج&ì*)… äج&ð 7äœÞ&ì p­&¸t*)â4")èDâŒ*)ý¬&öôã âì{öùÿõDõýÿí\•å(öýÿíàä,öýÿí, ä,öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿíøä>ö(öýÿí… ä)ö)ö;öùÿõ}ú4-)$¸èDp-)îD.)ä`Ìîäœ-)äð(äâÜ·ì¸-)|W ä@(ìÔ-)àôð-), ô .)„: äX±&ì(.)… äX±&ð 7äÜÝ&ì ð±&¸”.)â$*)èDâ¬.)ü€°&öôã âì{öùÿõDõýÿí´ä(öýÿíàä,öýÿí, ä,öýÿí„: ä,öýÿí… ä,öùÿõ õýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}÷\)´l7)D1)$¸´€1)âîT2)åÌîä¬1)äð(äâÜ·ìÈ1)|W ä@(ìä1)àõ2), ô2)„: äȵ&ì82)… äȵ&ð 7ä,Žì ¶&¸¤2)âD.)´2â¼2)üð´&öôã âì{öùÿõýÿí4‘ äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿí4‘ ä&öýÿí¸_ä=öýÿíxÃä;öùÿõDõýÿí´ä(öýÿíàä,öýÿí, ä,öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öùÿõýÿí@jä(ö)ö)ö;öùÿõ}öÀY)t7)$¸´°7)âî„8)ähËîäÜ7)äð(äâÜ·ìø7)|W ä@(ì8)àô08), ôL8)„: ä¼&ìh8)… ä¼&ð 7äàŒì P¼&¸Ô8)â T2)´[áì8)ü0»&ö, âì{öùÿõ;õ(öýÿíàä>öýÿí¤ ä(ö)ö)öùÿõùÿõPõýÿídþ ä(öüÿítY)'â)ö;öùÿõùÿõùÿõýÿí|räýÿí áä=öýÿíÔ6 ä(öýÿí, ä,öýÿí¤ ä(ö)ö-öýÿíàä)ö;öùÿõýÿí|räýÿí@ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí@ä>öýÿí0 ä(ö)öhõýÿí¤ ä(ö)ö-öýÿí áä>öýÿí0 ä(ö)ö-öýÿí@ä)öùÿõùÿõPõýÿíœf ä(öüÿíœY)#â)ö;öùÿõùÿõýÿí|räýÿíÀå=öýÿí¤ ä(ö)ö-öýÿí áä+öýÿí@ä;öùÿõùÿõ;õ(öýÿíÀå>öýÿí4Öä(ö)ö)öùÿõùÿõ{öùÿõùÿõýÿí€ø äýÿíxÃä=öýÿí¸ä.öýÿí¬±ä(öýÿí·ä(öýÿíÀå)ö+öÿÿìæ)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä,öýÿí4å,öýÿíàä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíxÃä+öýÿíàä)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿíUävõýÿ팊ä(öýÿíxÃä+öýÿíàä+öýÿí@ä,öýÿí4å+öýÿíàä+öýÿí áä,öùÿõýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿíxÃä+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿí¸ä.öýÿí@!ä+öÿÿìæ)ö;öùÿõýÿí4å=öýÿíxÃä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿíÀå)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõùÿõ}öùÿõ<õùÿõ{öùÿõùÿõ;õ(öýÿí4åkõÿÿô)öùÿõ{öùÿõýÿíUävõýÿíä(öýÿí4å+öýÿíàä+öýÿí@ä,öýÿí4å+öýÿíàä+öýÿí áä,öùÿõýÿí¤ ä(ö)ö-ö(öýÿíàä+öýÿí áä)ö)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿí4å+öýÿíàä)ö;öùÿõýÿíUävõýÿíDÀä(ö*ö(öýÿí4å+öýÿíÀå)ö,öýÿíøä(ö)ö)ö;öùÿõýÿí,Ôä=öýÿíÀå;öùÿõ}öùÿõùÿõ}öùÿõDõ*öOõ;öùÿõ}ö%basic_string::replace pos out of rangeá!basic_string::replace length erroráàZ)ÈY)$¸´ Z)âHÿæø™æä8Z)äð(ä€âÜ·ìTZ)|W ä@(ìpZ)àôŒZ), ô¨Z)„: ä ˜êÄZ)… ä ˜î 7äHŠðèZ)$¸´,[)Hÿæl•æäX[)äð(ä€âÜ·ìt[)|W ä@(ì[)àô¬[), ôÈ[)„: ä ˜ìä[)… ä ˜ð 7äHŠí])xrä\)$¸xrT\)âHÿ怵 æä€\)ì€âÜ·ìœ\)|W ä@(ì¸\)´)ùŒŠÔ\)ð4êþ°])8‰ ä])$¸8‰ L]) ÿèäx])ì!ãÜ·ì”])è@(ÿ켊 äÀ])$¸¼Š ü]) ÿèä(^)ì!ãÜ·ìD^)è@(ÿèt^)ðˆ^)⨓ìâÀøìâ ˜æ 4`)ä^)üµî âü^)ö„¢ñ{öùÿõDõýÿí0^ä[ö-öýÿí´)å-öÿÿìæ]ö;öùÿõ}ö ¸a)h`)Lµî â€`)ö„¢ñ{öùÿõýÿí0^äaõýÿí´)å;öùÿõDõ*öOõ;öùÿõ}ö ä¤^ä|Œ áx)\ä¨Xä´qäx)TWæP#ãóLx)è ðÐ0åxx)ê âˆx) ä âô:˜x)èLx)ðüx)âôz)´: ây)üìy)ö ‰ ð{öùÿõDõýÿíÐ0å<öýÿí`0å;öùÿõ}öÌk´:(z)î¬x)ä$ïäDz)ìâ¤z)`0å`z)ê âpz) ä âô:€z)è”z)è ðÐ0åÀz)ê âÐz) ä âô:àz)è”z)ðD{)â„})Ø; â\{)ü||)ö ‰ ð{öùÿõDõ!ö(öýÿíÐ0å<öýÿí`0å)ö;öùÿõ}öÌkØ;¸|)îôz)äx€ïäÔ|)ìâ4})`0åð|)ê ã}) ä âô:})è$})è ðÐ0åP})ê â`}) ä âô:p})è$})ðÔ})â,€) < âì})ü$)ö ‰ ð{öùÿõDõýÿí`0å.öýÿí$Ùä<öýÿíÐ0å.öýÿí$Ùä;öùÿõ}öÌk <`)î„})äìïä|)ìâÜ)`0å˜)ê â¨) ä âô:¸)èÌ)è ðÐ0åø)ê â€) ä âô:€)èÌ)ð|€)⼂)ôT ─)ü´)ö ‰ ð{öùÿõDõ!ö(öýÿí`0åjõýÿíÐ0å)ö;öùÿõ}öÌkôTð)î,€)äPïä ‚)ìâl‚)`0å(‚)ê â8‚) ä âô:H‚)è\‚)è ðÐ0刂)ê ☂) ä âô:¨‚)è\‚)ð ƒ)âd…)˜U â$ƒ)ü\„)ö ‰ ð{öùÿõDõýÿí`0å.öýÿí$ÙäjõýÿíÐ0å.öýÿí$Ùä;öùÿõ}öÌk˜U˜„))äÈ~ïä´„)ìâ…)`0åЄ)ê âà„) ä âô:ð„)è…)è ðÐ0å0…)ê â@…) ä âô:P…)è…)ð´…)â@ˆ)l6 âÌ…)ü‡)ö ‰ ð{öùÿõDõýÿí`0å.öýÿí$Ùä-öýÿíÐ0å.öýÿí$Ùä;öùÿõ}öÌkl6@‡)îd…)äl~ïä ‡)ä\‡)äâ â l‡)€× âô:|‡)è‡)è ìð‡)`0弇)ê â̇) ä âô:܇)è‡)ìÐ0å ˆ)ê âˆ) ä âô:,ˆ)è‡)ðˆ)⬊)ì9 ⨈)ü€‰)ö ‰ ð{öùÿõDõýÿí`0å+öýÿí´)å;öùÿõ}öÌkì9¼‰)î@ˆ)äÔ}ïä Š)ä؉)äâ âô:è‰)èü‰)è ì\Š)´)å(Š)ì â 8Š)€× âô:HŠ)èü‰)ì`0åxŠ)ê ∊) ä âô:˜Š)èü‰)ðüŠ)â4Ž)ôTâ,‹)üôŒ)ò‹)øôUî{öùÿõDõXõ<öõ>ö(ö!öýÿíÄ"å.öýÿíÜzä(öýÿíP#å)ö)ö;öùÿõ}öÌkôT0))äX}ïäL)ìâÐ)Ä"åh)ê âx) ä â ôgˆ)¬)äœ)è ðâÀ)è äêP#åì)ê âü) ä â ôg Ž) Ž)äœ)ìâÀ)ð„Ž)â‘)˜U â´Ž)üÔ)òœŽ)øôUî{öùÿõDõýÿíÄ"å.öýÿíÜzä(öýÿíP#å)ö;öùÿõ}öÌk˜U)î4Ž)äXGïä,)ìâ°)Ä"åH)ê âX) ä â ôgh)Œ)ä|)è ðâ )è äêP#åÌ)ê âÜ) ä âôgì)á‘)ä|)ìâ )ðd‘)â<•)ôTâÄ‘)üŒ“)ò|‘)ö(öýÿí`0å.öýÿí€uäkõýÿíÐ0å.öýÿí€uä)ö;öùÿõ}öÌkôTÈ“)î‘)äÐFïää“)ìâ°”)`0æ”)ê â”) ä â TÉ ”)D”)ä4”)è ìh”)âX”)è äæŒ”)â|”)è äêâ ”)è äêÐ0åÌ”)ê âÜ”) ä âTÉì”)á•)ä4”)è•)âX”)è(•)â|”)ìâ ”)ðŒ•)âd™)˜Uâì•)ü´—)ò¤•)ö(öýÿí`0å.öýÿí€uäjõýÿíÐ0å.öýÿí€uä)ö;öùÿõ}öÌk˜Uð—)î<•)äÜNïä ˜)ìâؘ)`0å(˜)ê â8˜) ä â TÉH˜)l˜)ä\˜)è ì˜)‘)è äæ´˜)⤘)è äêâȘ)è äêÐ0åô˜)ê â™) ä â TÉ™)(™)ä\˜)è<™)‘)èP™)⤘)ìâȘ)ð´™)âÀœ)Xâä™)üÜ›)òÌ™)ˆFô¨Uî{öùÿõDõýÿíܾ ä<öýÿíˆFä>ö(öýÿí`0å,ö õýÿíˆFävõýÿí¤Ìä(öýÿíä&å)ö)ö;öùÿõ}öÌkXœ)îd™)ä€Nïähœ)ä4œ)äâ âhàDœ)èXœ)è 씜)`0儜)ì âXœ) èä&å°œ)ì äî)âŸ)ð â()ü`ž)öˆFð{öùÿõDõýÿíLÉä<öýÿíˆFä>ö(öýÿí`0å)ö;öùÿõ}öÌk𠜞)îÀœ)äÈMïäìž)丞)äâ âXîÈž)èÜž)è ð`0åŸ)ì âÜž) ìhŸ)âp¡)Ü¥ ‟)ü¸ )öˆFð{öùÿõDõýÿí@h ä<öýÿíˆFä>ö(öýÿí`0å)ö;öùÿõ}öÌkÜ¥ô )îŸ)ä¸LïäD¡)ä¡)äâ âLú ¡)è4¡)è ð`0å`¡)ì â4¡) ìÀ¡)â̤)ì9âØ¡)ü £)ö„¢ñ{öùÿõDõýÿíøÜ ä<öýÿí„¢å>ö(öýÿí`0å.öýÿí“ ä(ö)ö-öýÿí´)å)ö;öùÿõ}öÌkì9Ü£)âîp¡)ä”Kïä,¤)äø£)äâ â@¤)è¤)è ì|¤)´)åH¤)ì â X¤)€× â@h¤)è¤)ì`0嘤)ê ⨤) ä â@¸¤)è¤)ð¥)â¨)l6â4¥)ü̦)ö„¢ñ{öùÿõDõýÿíÐ0å.öýÿí“ ä(ö)ö-öýÿí`0å.öýÿí“ ä(ö)ö;öùÿõ}öÌkl6§)î̤)äÔJïäh§)ä$§)äâ â 4§)€× â@D§)èX§)è 츧)`0å„§)ê â”§) ä â@¤§)èX§)ìÐ0åÔ§)ê âä§) ä â@ô§)èX§)ðX¨)â «)Ø;âp¨)ü˜ª)ö„¢ñ{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí“ ä(ö)ömõýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌkØ;Ôª)âî¨)äHJïäðª)ìâP«)`0å «)ê â«) ä â@,«)è@«)è ðÐ0ål«)ê â|«) ä â@Œ«)è@«)ðð«)â8¯)°>â¬)ü0®)ö„¢ñ{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí“ ä(ö)ölõýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌk°>l®)î «)äÄIï䈮)ìâè®)`0央)ê â´®) ä â@Ä®)èØ®)è ðÐ0å¯)ê â¯) ä â@$¯)èØ®)ðˆ¯)âв)´:â ¯)üȱ)ö„¢ñ{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí“ ä(ö)ö<öýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌk´:²)î8¯)äÌWïä ²)ì′)`0å<²)ê âL²) ä â@\²)èp²)è ðÐ0圲)ê ⬲) ä â@¼²)èp²)ð ³)âh¶)ôTâ8³)ü`µ)öüT ð{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí“ ä(ö)ökõýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌkôTœµ)îв)äTWï丵)ìâ¶)`0åÔµ)ê âäµ) ä â@ôµ)è¶)è ðÐ0å4¶)ê âD¶) ä â@T¶)è¶)ð¸¶)ãº) <âж)üø¸)ö„¢ñ{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí“ ä(ö)ö>öýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌk <4¹)îh¶)ä¸`ïäP¹)ìâ°¹)`0ål¹)ê â|¹) ä â@Œ¹)è ¹)è ðÐ0å̹)ê âܹ) ä â@ì¹)è ¹)ðPº)â\ ˜Uâhº)ü¼)öüT ð{öùÿõDõXõ<öõ>ö(öýÿí`0å.öýÿí“ ä(ö)öjõýÿíÐ0å.öýÿí“ ä(ö)ö)ö;öùÿõ}öÌk˜U̼)ïº)äÜ_ïäè¼)ìâH½)`0å½)ê â½) ä â@$½)è8½)è ðÐ0åd½)ê ât½) ä â@„½)è8½)ìÔ?ãì{öùÿõ}û¾)ùôO<¾)ÿèäh¾)ìãÀøì„¾)è°ûøˆ¿êHÁ)áÆø¿)°¾)ùá Æ”¿)Hÿæô¾)æÔôá Æ0¿)ÿèä\¿)ä`õ䀀â|ôêx¿)|W äLûî`0å¸õìäÀ¿)ä ˜ä€€âÀøìÜ¿)|W ä°ûî`0åH•ñ À)ùá ÆäÀ)HÿæDÀ)æÔôá Æ€À)ÿèä¬À)ä`õ â|ôêÈÀ)|W äLûî`0å¸õêäÁ)ä ˜â€€âÀøì,Á)|W ä°ûî`0åH•êˆÃ)¬±äXÁ)ù¬±°Â)HÿæœÁ)æÔô¬±ØÁ)ÿèäÂ)ä`õä€â|ôê Â)|W äLûì<Â)´)ù 7XÂ)œBê2œBä„Â)ü4ÿêäÜÂ)ä ˜ä€âÀøìøÂ)|W ä°ûìÃ)´)ù 70Ã)œBê2œBä\Ã)ü4ÿêÅ)Ô ä˜Ã)ùÔ ˜Ä)HÿæÜÃ)æÔôÔ Ä)ÿèäDÄ)ì€â|ôê`Ä)|W äLûì|Ä)„+å`õð 7ôäÄÄ)ì€âÀøìàÄ)|W ä°ûìüÄ)„+å ˜ð 7ôPÆ)0 ä(Å)ù0 üÅ)HÿælÅ)æÔô0 ¨Å)ÿèäÔÅ)ðÅ)耀â|ôî|W äLûöä(Æ)DÆ)耀âÀøð|W ä°û÷È)Tå `Æ)ùTá€Ç)Hÿæ¤Æ)æ ÔôTáàÆ)ÿèä Ç)ì€â|ôê(Ç)|W äLûìDÇ)„+å`õð<§ ä`Ç)ê âpÇ) ä ìä¬Ç)ì€âÀøìÈÇ)|W ä°ûìäÇ)„+å ˜ð<§ äH•êXÉ) äÈ)ù ôÈ)HÿæTÈ)æÔô È)ÿèä¼È)ì€â|ôêØÈ)|W äLûð„+å`õìä É)ì€âÀøì<É)|W ä°ûð„+å ˜ð˜RähÉ)ù˜R¤É)ÿèäÐÉ)䈿äãÀøììÉ)è°ûøˆ¿þ4Ê)0º ä,Ê)Ð÷âPÊ)|räDÊ)êlÊ)€×ä`Ê)êˆÊ)€ø ä|Ê)œBæ¤Ê)Øä ˜Ê)œBäÀÊ) |ä´Ê)êØÊ)|\ äÐÊ)8÷æ˜RäèÊ)°÷˜R$Ë)ÿèä`Ë)äPË)äãÐ÷ì âÐ÷ äŒË)è|Ë)ì âÐ÷ðPË)êÀË)|\ ä¸Ë)8÷æ,äÐË)ÜË)æ â|ôìË)éÌ)è æèÔ?ãÿèÐË)æä¨Ì)ØÞ èüÓ)èBpäèä)è <Ô),Ø)Pç)èø* ÌkØÞ äPÌ)äÈÌ) ãáàÌ)ØÞ äØÌ)PÌ)â°Î)ôOìÍ)ðÌ)¨Ì)ôO,Í)âÿèäXÍ)ì€âPÌ)ê„Í)|W ätÍ)ì âPÌ)è ¸Ç Í)ÌÍ)ì4ÿê âÜÍ)æ ðôÍ)¨Ì)ôO0Î)âÿèä\Î)¤Î)è€âPÌ)êxÎ)|W ätÍ)ð,ä”Î)ê âPÌ) ðPÏ)€OäÀÎ)¨Ì)€OüÎ)âÿèä(Ï)DÏ)è €âPÌ)î|W ätÍ)ø Ð)˜Rä`Ï)¨Ì)˜RœÏ)âÿèäÈÏ)áÐ)”Î)ä€âPÌ)êäÏ)|W ätÍ)ð8Êä”Î)ö"dÑ)5ÌÐ)Ð)¨Ì)5XÐ)ÿèä ¤Ð)ÀÐ)„Ð)ä€âPÌ)ê â”Ð)æ ð|W ätÍ)üÔÐ)¨Ì)5Ñ)ÿèä <Ñ)XÑ)„Ð) âPÌ)î|W ätÍ)ö"¬Ò)P7Ò)tÑ)¨Ì)P7°Ñ)ÿèä ìÑ)Ò)ÜÑ)ä€âPÌ)ê â”Ð) è|W ätÍ)üÒ)¨Ì)P7XÒ)ÿèä „Ò) Ò)ÜÑ) âPÌ)î|W ätÍ)öLÓ)°£å ¼Ò)¨Ì)°£áøÒ)ÿèä $Ó)@Ó)„Ð)âP€€âPÌ) î|W ätÍ)öìÓ)ˆä\Ó)¨Ì)ˆ˜Ó)ÿèäÄÓ)àÓ)耀âPÌ) î|W ätÍ)ö,Ô)ì;åüÓ)áÔ)ì;á„Ð)èåA îìA ä Ô)TÔ)övõýÿí ¸ ä(ö)ö/öEõ(öýÿíö(övõJõIõ(öýÿí´)å*öEõ(öýÿíö(öýÿíÊ äjõÿÿô)ö;öùÿõ}ö ä*ô**îâ$*ò *øôUî{öùÿõDõ*öOõ;öùÿõ}ö **ˆ*îâH*ò0*øôUî{öùÿõDõ*öOõ;öùÿõ}ö , *<*ô*îâl*òT*øôUî{öùÿõDõ*öOõ;öùÿõ}ö $*` *$*î&â *òx *øôUî{öùÿõ;õ(öýÿíÊ äkõÿÿôiõýÿíUävõýÿíxä(öýÿíÊ ärõýÿíð¯ ä(öýÿíè#å)ö,öýÿíUävõýÿíœ_ ä(ö)ö)ö)öùÿõýÿíÊ ä=öÿÿô;öùÿõDõ*öOõ;öùÿõ}ö \%*T$*X*î â„$*òl$*øôUî:öýÿíÊ ä(öýÿí-å)öùÿõ{öùÿõ}ú%*„*î âÀ%*ò¨%*øôUî:öýÿíÊ ä(öýÿí-å.öýÿ툇ä(ö)ö)öùÿõ{öùÿõ}ö '*øü[æH'*ø(\æp'*øT\æ˜'*ø0*æÀ'*ø„*æè'*øX*æ(*ø$*æ8(*øô*æ`(*øˆ*æˆ(*ø*æ°(*øÄ*æüd*æð(*(°äè(*Ä4æ¤÷ äh44êþ8**ø$2T)*â é€)* **ø é¬)*à)*øIê Ø)*ì0ì0ðæØ14êþ4ê þ`**øp2æ|+*øp2ˆ**âIê´**¬2ôæ¼**éè**H+*øIê+*¬2ôæ+*4êþIê t+*ì0ì0ðæØ1¤+*øÌ2æüÌ2Ì+*âIêø+*¬2ôç,*é,,*Œ,*øIêX,*¬2ôæ`,*4êÿÿÿÿÿÿÿÿ÷Iê ¸,*ì0ì0ðæp2Ô,*ä¬2ìáè,*á^? ã4êÿâ ´. -*D-*ä4-*è ðáX-*á^? ã4ÿê˜.*ø¬-*è-*ââ”.uäÿè è.*@.*øIê4-*øâèl.*ü:îä$4üà/*øÀ.*ü.*ââ”.áµäÿè é(/*´/*ø éT/*ˆ/*øIê €/*´.´.ðæ¬-*4êþ4ê þD0*ø0*æâ”.Ô6 4-*ÿèÌ0*ø0*l0*âIê˜0*4-*ôæ 0*4ÿê01*øô0*æâ”. ¸ 4-*ÿÿäô0*X1*âIê„1*4-*ôæŒ1*4êÿÿÿÿÿÿÿÿ÷Ð1*pŽ äÈ1*´.âà1*üÇ ä X.ð1*uä¬-*á2*áµä À.*2*Ô6 ä0*ä ¸ ä ô0*t2*uä02*âÌ-uäKâê@ö¬-*æÈ2*áµä„2*âÌ-áµäKâêöÀ.*æ3*Ô6 äØ2*âÌ-Ô6 äKâÿâ0*æp3* ¸ ä,3*âÌ- ¸ äKâêÿÿÿÿÿÿÿÿïô0*ê˜Rä€3*Ì-˜R¼3*ÿèäø3*äè3*äã„-ì â„- ä$4*è4*ì â„-ðè3*úâh4*ôá|4*è4ÿêâð4*pŽ ôáæ8*1äœ7*â°7*âÌkœ ä¨4*ä5*ãá(5*pŽ ä 5*¨4*â|5*üÇ ä85*âð4*üÇ äKâêöŒ1æÐ5*uäŒ5*âð4*uäKâê?öØ1æ$6*áµäà5*âð4*áµäKâêö$2æx6*Ô6 ä46*âð4*Ô6 äKâñ€ïp2æÌ6* ¸ äˆ6*âð4* ¸ äKâêÿÿÿÿÿÿÿïÌ2ê˜RäÜ6*ð4*˜R7*ÿèäT7*äD7*äã¨4*ì â¨4* ä€7*èp7*ì â¨4*ðD7*úâÄ7*ôáØ7*è4êþâL8*pŽ ôáæ`;*æ.äø:*â ;*âÌkp©ä8*äl8*ãá„8*pŽ ä|8*8*âØ8*üÇ ä”8*âL8*üÇ äKâÿâX.æ,9*uäè8*âL8*uäKâê ö¬-*æ€9*áµä<9*âL8*áµäKâê öÀ.*æÔ9*Ô6 ä9*âL8*Ô6 äKâÿâ0*æ(:* ¸ ää9*âL8* ¸ äKâêÿÿÿÿóô0*ê˜Rä8:*L8*˜Rt:*ÿèä°:*ä :*äã8*ì â8* äÜ:*èÌ:*ì â8*ð :*úâ ;*ôá4;*è4ÿêâ¨;*pŽ ôáæ¼>*1äT>*âh>*âÌkÜÍä`;*äÈ;*ãáà;*pŽ äØ;*`;*â4<*üÇ äð;*â¨;*üÇ äKâêöŒ1æˆ<*uäD<*â¨;*uäKâêöØ1æÜ<*áµä˜<*â¨;*áµäKâê ö$2æ0=*Ô6 äì<*â¨;*Ô6 äKâí€ÿÿÿÿïp2æ„=* ¸ ä@=*â¨;* ¸ äKâêÿÿÿóÌ2ê˜Rä”=*¨;*˜RÐ=*ÿèä >*äü=*äã`;*ì â`;* ä8>*è(>*ì â`;*ðü=*úâ|>*ôá>*è4êþâ?*pŽ ôáæB*æ.ä°A*âÄA*âÌklsä¼>*ä$?*ãá*â?*üÇ äL?*â?*üÇ äKâÿâX.æä?*uä ?*â?*uäKâê ö¬-*æ8@*áµäô?*â?*áµäKâê öÀ.*æŒ@*Ô6 äH@*â?*Ô6 äKâÿâ0*æà@* ¸ äœ@*â?* ¸ äKâêÿÿÿÿóô0*ê˜Räð@*?*˜R,A*ÿèähA*äXA*äã¼>*ì â¼>* ä”A*è„A*ì â¼>*ðXA*úâØA*ôáìA*è4ÿêâ`B*pŽ ôáætE*1ä E*â E*âÌkØòäB*ä€B*ãá˜B*pŽ äB*B*âìB*üÇ ä¨B*â`B*üÇ äKâêöŒ1æ@C*uäüB*â`B*uäKâêöØ1æ”C*áµäPC*â`B*áµäKâê ö$2æèC*Ô6 ä¤C*â`B*Ô6 äKâí€ÿÿÿÿïp2æ*æØ¡*Œäœ¡*â8¡*Œä îø£*Ô6 äè¡*8¡*Ô6 $¢*î\¢*öèP¢*è€âð *èöТ*åçäçæááxýâá“äè¢*ä4ÿéP¤* ¸ ä$£*8¡* ¸ `£**ö茣*è€âð *èö ¤*åçäçæááxýâžá“ä$¤*ä4éÿÿÿÿûœ¤*uä`¤*â8¡*uä î øè¤*áµä¬¤*â8¡*áµä î ø4¥*üÇ äø¤*â8¡*üÇ ä ÿ耥*6äD¥*â8¡*6ä îøÌ¥*„‹ä¥*â8¡*„‹ä îø¦* ‡ äÜ¥*â8¡* ‡ ä îøT§*Ï ä(¦*8¡*Ï d¦**öè¦*è€âð *èö§*åçäçæááxýâ¬á“ä(§*ä4ÿê¨*P2 äd§*8¡*P2  §*îا*öȩ̀*è€âð *èöL¨*åçäçæááxýâ­á“äd¨*ä4ÿêܨ*ôcä ¨*â8¡*ôcä ÿè(©*ÄQåì¨*â8¡*ÄQå ÿèt©*œƒ ä8©*â8¡*œƒ ä ÿèÀ©*¬Cä„©*â8¡*¬Cä ÿè ª*LÅ äЩ*â8¡*LÅ ä ÿèXª*ôäª*â8¡*ôä ÿ褪*¤˜ähª*â8¡*¤˜ä ÿèðª*Ìaå´ª*â8¡*Ìaátæ ÿè<«*`å«*â8¡*`ä ÿèx¬*0šäL«*8¡*0šˆ«*îÀ«*öè´«*è€âð *èö4¬*åçäçæááxýâ¹á“äL¬*ä4ÿê´­*œ{ 䈬*8¡*œ{ Ĭ*îü¬*öèð¬*è€âð *èöp­*åçäçæááxýâºá“䈭*ä4ÿêð®* ^äÄ­*8¡* ^á®*î8®*öè,®*è€âð *èö¬®*åçäçæááxýâ»á“äÄ®*ä4ÿê,°*áå ¯*8¡*á <¯*ît¯*öèh¯*è€âð *èöè¯*åçäçæááxýâ¼á“å°*ä4ÿêx°*˜¸å<°*â8¡*˜¸å ÿèİ*\¯ 䈰*â8¡*\¯ ä îø±*ÄäÔ°*â8¡*Ää îø\±*`½ ä ±*â8¡*`½ ä ÿ許*Ì7äl±*â8¡*Ì7ä ÿèô±*Ì丱*â8¡*Ìøê ÿì˜Rä²*8¡*˜R@²*ÿèä|²*äl²*äãð *ì âð * 䨲*蘲*ì âð *ðl²*î¼>*èöâ 4³*ûÀÄ*ðpäèÄ*‚ßäÔÄ*çÌk´úäì²*äT³*!ãál³*ûäd³*ì²*∳*“ ä|³*B*æÔ³*Œä˜³*â4³*Œä îøµ*Ô6 ää³*4³*Ô6 ´*îX´*öèL´*è€âì²*èöÌ´*åçäçæááxýâfá“ää´*ä4ì€ÿÿÿÿ÷L¶* ¸ ä µ*4³* ¸ \µ**ö舵*è€âì²*èö¶*åçäçæááxýâgá“ä ¶*ä4éÿÿÿû˜¶*uä\¶*â4³*uä îøä¶*áµä¨¶*â4³*áµä î ø0·*üÇ äô¶*â4³*üÇ ä îø|·*6ä@·*â4³*6ä îøÈ·*„‹äŒ·*â4³*„‹ä îø¸* ‡ 䨷*â4³* ‡ ä îøP¹*Ï ä$¸*4³*Ï `¸**ö茸*è€âì²*èö ¹*åçäçæááxýâuá“ä$¹*ä4ÿꌺ*P2 ä`¹*4³*P2 œ¹*îÔ¹*öèȹ*è€âì²*èöHº*åçäçæááxýâvá“ä`º*ä4ÿêغ*ôc䜺*â4³*ôcä ÿè$»*ÄQåèº*â4³*ÄQå ÿèp»*œƒ ä4»*â4³*œƒ ä ÿè¼»*¬C䀻*â4³*¬Cä ÿè¼*LÅ äÌ»*â4³*LÅ ä ÿèT¼*ôä¼*â4³*ôä ÿè ¼*¤˜äd¼*â4³*¤˜ä ÿèì¼*Ìaå°¼*â4³*Ìaátæ ÿè8½*`äü¼*â4³*`ä ÿèt¾*0šäH½*4³*0š„½*î¼½*öè°½*è€âì²*èö0¾*åçäçæááxýâ‚á“äH¾*ä4ÿê°¿*œ{ 䄾*4³*œ{ À¾*îø¾*öèì¾*è€âì²*èöl¿*åçäçæááxýâƒá“ä„¿*ä4ÿêìÀ* ^äÀ¿*4³* ^ü¿*î4À*öè(À*è€âì²*èö¨À*åçäçæááxýâ„á“äÀÀ*ä4ÿê(Â*áä üÀ*4³*á 8Á*îpÁ*öèdÁ*è€âì²*èöäÁ*åçäçæááxýâ…á“äüÁ*ä4ÿêtÂ*˜¸å8Â*â4³*˜¸å ÿèÀÂ*\¯ ä„Â*â4³*\¯ ä îø Ã*ÄäÐÂ*â4³*Ää îøXÃ*`½ äÃ*â4³*`½ ä ÿè¤Ã*Ì7ähÃ*â4³*Ì7ä ÿèðÃ*Ìä´Ã*â4³*Ìøê ÿì˜RåÄ*4³*˜R<Ä*ÿèäxÄ*ähÄ*äãì²*ì âì²* ä¤Ä*è”Ä*ì âì²*ðhÄ*îB*èöâ 0Å*û¼Ö*ðpääÖ*‚ßäÐÖ*çÌk@ûäèÄ*äPÅ*!ãáhÅ*ûä`Å*èÄ*â„Å*“ äxÅ*tE*æÐÅ*Œä”Å*â0Å*Œä îø Ç*Ô6 äàÅ*0Å*Ô6 Æ*îTÆ*öèHÆ*è€âèÄ*èöÈÆ*åçäçæááxýâ/á“äàÆ*ä4ÿéHÈ* ¸ äÇ*0Å* ¸ XÇ*îÇ*öè„Ç*è€âèÄ*èöÈ*åçäçæááxýâ0á“äÈ*ä4éÿÿý”È*uäXÈ*â0Å*uä îøàÈ*áµä¤È*â0Å*áµä îø,É*üÇ äðÈ*â0Å*üÇ ä ÿèxÉ*6ä<É*â0Å*6ä îøÄÉ*„‹äˆÉ*â0Å*„‹ä îøÊ* ‡ äÔÉ*â0Å* ‡ ä îøLË*Ï ä Ê*0Å*Ï \Ê*î”Ê*öèˆÊ*è€âèÄ*èöË*åçäçæááxýâ>á“ä Ë*ä4ÿêˆÌ*P2 ä\Ë*0Å*P2 ˜Ë*îÐË*öèÄË*è€âèÄ*èöDÌ*åçäçæááxýâ?á“ä\Ì*ä4ÿêÔÌ*ôcä˜Ì*â0Å*ôcä ÿè Í*ÄQåäÌ*â0Å*ÄQå ÿèlÍ*œƒ ä0Í*â0Å*œƒ ä ÿè¸Í*¬Cä|Í*â0Å*¬Cä ÿèÎ*LÅ äÈÍ*â0Å*LÅ ä ÿèPÎ*ôäÎ*â0Å*ôä ÿèœÎ*¤˜ä`Î*â0Å*¤˜ä ÿèèÎ*Ìaå¬Î*â0Å*Ìaátæ ÿè4Ï*`äøÎ*â0Å*`ä ÿèpÐ*0šäDÏ*0Å*0š€Ï*î¸Ï*öè¬Ï*è€âèÄ*èö,Ð*åçäçæááxýâKá“äDÐ*ä4ÿê¬Ñ*œ{ ä€Ð*0Å*œ{ ¼Ð*îôÐ*öèèÐ*è€âèÄ*èöhÑ*åçäçæááxýâLá“ä€Ñ*ä4ÿêèÒ* ^ä¼Ñ*0Å* ^øÑ*î0Ò*öè$Ò*è€âèÄ*èö¤Ò*åçäçæááxýâMá“ä¼Ò*ä4ÿê$Ô*áä øÒ*0Å*á 4Ó*îlÓ*öè`Ó*è€âèÄ*èöàÓ*åçäçæááxýâNá“äøÓ*ä4ÿêpÔ*˜¸å4Ô*â0Å*˜¸å ÿè¼Ô*\¯ ä€Ô*â0Å*\¯ ä îøÕ*ÄäÌÔ*â0Å*Ää îøTÕ*`½ äÕ*â0Å*`½ ä ÿè Õ*Ì7ädÕ*â0Å*Ì7ä ÿèìÕ*Ìä°Õ*â0Å*Ìøê ÿì˜RäüÕ*0Å*˜R8Ö*ÿèätÖ*ädÖ*äãèÄ*ì âèÄ* ä Ö*èÖ*ì âèÄ*ðdÖ*îtE*èöâ ,×*û¸è*ðpäàè*‚ßäÌè*çÌk˜ûääÖ*äL×*!ãád×*ûä\×*äÖ*â€×*“ ät×*ÐH*æÌ×*Œä×*â,×*Œä îøÙ*Ô6 äÜ×*,×*Ô6 Ø*îPØ*öèDØ*è€âäÖ*èöÄØ*åçäçæááxýâøá“äÜØ*ä4ê€ÿÿÿÿÿÿ÷DÚ* ¸ äÙ*,×* ¸ TÙ*îŒÙ*öè€Ù*è€âäÖ*èöáÚ*åçäçæááxýâùá“äÚ*ä4éÿýÚ*uäTÚ*â,×*uä îøÜÚ*áµä Ú*â,×*áµä îø(Û*üÇ äìÚ*â,×*üÇ ä îøtÛ*6ä8Û*â,×*6ä îøÀÛ*„‹ä„Û*â,×*„‹ä îø Ü* ‡ äÐÛ*â,×* ‡ ä îøHÝ*Ï äÜ*,×*Ï XÜ*îÜ*öè„Ü*è€âäÖ*èöÝ*åçäçæááxýâá“äÝ*ä4ÿê„Þ*P2 äXÝ*,×*P2 ”Ý*îÌÝ*öèÀÝ*è€âäÖ*èö@Þ*åçäçæááxýâá“äXÞ*ä4ÿêÐÞ*ôcä”Þ*â,×*ôcä ÿèß*ÄQåàÞ*â,×*ÄQå ÿèhß*œƒ ä,ß*â,×*œƒ ä ÿè´ß*¬Cäxß*â,×*¬Cä ÿéà*LÅ äÄß*â,×*LÅ ä ÿèLà*ôäà*â,×*ôä ÿè˜à*¤˜ä\à*â,×*¤˜ä ÿèäà*Ìaå¨à*â,×*Ìaátæ ÿè0á*`äôà*â,×*`ä ÿèlâ*0šä@á*,×*0š|á*î´á*öè¨á*è€âäÖ*èö(â*åçäçæááxýâá“ä@â*ä4ÿê¨ã*œ{ ä|â*,×*œ{ ¸â*îðâ*öèäâ*è€âäÖ*èödã*åçäçæááxýâá“ä|ã*ä4ÿêää* ^ä¸ã*,×* ^ôã*î,ä*öè ä*è€âäÖ*èö ä*åçäçæááxýâá“ä¸ä*ä4ÿê æ*áä ôä*,×*á 0å*îhå*öè\å*è€âäÖ*èöÜå*åçäçæááxýâá“äôå*ä4ÿêlæ*˜¸å0æ*â,×*˜¸å ÿè¸æ*\¯ ä|æ*â,×*\¯ ä îøç*ÄäÈæ*â,×*Ää îøPç*`½ äç*â,×*`½ ä ÿèœç*Ì7ä`ç*â,×*Ì7ä ÿèèç*Ìä¬ç*â,×*Ìøê ÿì˜Räøç*,×*˜R4è*ÿèäpè*ä`è*äãäÖ*ì âäÖ* äœè*èŒè*ì âäÖ*ð`è*îÐH*èöâ (é*û´ú*ðpäÜú*‚ßäÈú*çÌk<Åäàè*äHé*!ãá`é*ûäXé*àè*â|é*“ äpé*,L*æÈé*ŒäŒé*â(é*Œä îøë*Ô6 äØé*(é*Ô6 ê*îLê*öè@ê*è€âàè*èöÀê*åçäçæááxýâ¿á“äØê*ä4ÿé@ì* ¸ äë*(é* ¸ Pë*îˆë*öè|ë*è€âàè*èöüë*åçäçæááxýâÀá“äì*ä4éÿÿýŒì*uäPì*â(é*uä îøØì*áµäœì*â(é*áµä îø$í*üÇ äèì*â(é*üÇ ä ÿèpí*6ä4í*â(é*6ä îø¼í*„‹ä€í*â(é*„‹ä îøî* ‡ äÌí*â(é* ‡ ä îøDï*Ï äî*(é*Ï Tî*îŒî*öè€î*è€âàè*èöáï*åçäçæááxýâÎá“äï*ä4ÿê€ð*P2 äTï*(é*P2 ï*îÈï*öè¼ï*è€âàè*èö<ð*åçäçæááxýâÏá“äTð*ä4ÿêÌð*ôcäð*â(é*ôcä ÿèñ*ÄQåÜð*â(é*ÄQå ÿèdñ*œƒ ä(ñ*â(é*œƒ ä ÿè°ñ*¬Cätñ*â(é*¬Cä ÿèüñ*LÅ äÀñ*â(é*LÅ ä ÿèHò*ôä ò*â(é*ôä ÿè”ò*¤˜äXò*â(é*¤˜ä ÿèàò*Ìaå¤ò*â(é*Ìaátæ ÿè,ó*`äðò*â(é*`ä ÿèhô*0šä<ó*(é*0šxó*î°ó*öè¤ó*è€âàè*èö$ô*åçäçæááxýâÛá“ä<ô*ä4ÿê¤õ*œ{ äxô*(é*œ{ ´ô*îìô*öèàô*è€âàè*èö`õ*åçäçæááxýâÜá“äxõ*ä4ÿêàö* ^ä´õ*(é* ^ðõ*î(ö*öèö*è€âàè*èöœö*åçäçæááxýâÝá“ä´ö*ä4ÿêø*áä ðö*(é*á ,÷*îd÷*öèX÷*è€âàè*èöØ÷*åçäçæááxýâÞá“äð÷*ä4ÿêhø*˜¸å,ø*â(é*˜¸å ÿè´ø*\¯ äxø*â(é*\¯ ä îùù*ÄäÄø*â(é*Ää îøLù*`½ äù*â(é*`½ ä ÿè˜ù*Ì7ä\ù*â(é*Ì7ä ÿèäù*Ìä¨ù*â(é*Ìøê ÿì˜Räôù*(é*˜R0ú*ÿèälú*ä\ú*äãàè*ì âàè* ä˜ú*èˆú*ì âàè*ð\ú*î,L*èöâ $û*û° +ðpäØ +‚ßäÄ +çÌk„üäÜú*äDû*!ãá\û*ûäTû*Üú*âxû*“ älû*ˆO*æÄû*Œäˆû*â$û*Œä îùý*Ô6 äÔû*$û*Ô6 ü*îHü*öè<ü*è€âÜú*èö¼ü*åçäçæááxýâ†á“äÔü*ä4ÿé<þ* ¸ äý*$û* ¸ Lý*î„ý*öèxý*è€âÜú*èöøý*åçäçæááxýâ‡á“äþ*ä4éÿþˆþ*uäLþ*â$û*uä îøÔþ*áµä˜þ*â$û*áµä îø ÿ*üÇ ääþ*â$û*üÇ ä ÿèlÿ*6ä0ÿ*â$û*6ä îø¸ÿ*„‹ä|ÿ*â$û*„‹ä îø+ ‡ äÈÿ*â$û* ‡ ä îø@+Ï ä+$û*Ï P+îˆ+öè|+è€âÜú*èöü+åçäçæááxýâ•á“ä+ä4ÿê|+P2 äP+$û*P2 Œ+îÄ+öè¸+è€âÜú*èö8+åçäçæááxýâ–á“äP+ä4ÿêÈ+ôcäŒ+â$û*ôcä ÿè+ÄQåØ+â$û*ÄQå ÿè`+œƒ ä$+â$û*œƒ ä ÿè¬+¬Cäp+â$û*¬Cä ÿèø+LÅ ä¼+â$û*LÅ ä ÿèD+ôä+â$û*ôä ÿè+¤˜äT+â$û*¤˜ä ÿèÜ+Ìaå +â$û*Ìaátæ ÿè(+`äì+â$û*`ä ÿèd+0šä8+$û*0št+î¬+öè +è€âÜú*èö +åçäçæááxýâ¢á“ä8+ä4ÿê +œ{ ät+$û*œ{ °+îè+öèÜ+è€âÜú*èö\+åçäçæááxýâ£á“ät+ä4ÿêÜ+ ^ä°+$û* ^ì+î$+öè+è€âÜú*èö˜+åçäçæááxýâ¤á“ä°+ä4ÿê +áä ì+$û*á ( +î` +öèT +è€âÜú*èöÔ +åçäçæááxýâ¥á“äì +ä4ÿêd +˜¸å( +â$û*˜¸å ÿè° +\¯ ät +â$û*\¯ ä îøü +ÄäÀ +â$û*Ää îøH +`½ ä +â$û*`½ ä ÿè” +Ì7äX +â$û*Ì7ä ÿèà +Ìä¤ +â$û*Ìøê ÿì˜Räð +$û*˜R, +ÿèäh +äX +äãÜú*ì âÜú* ä” +è„ +ì âÜú*ðX +îˆO*èöâ +û¬+ðpäÔ+‚ßäÀ+çÌkÄýäØ +ä@ +!ãáX +ûäP +Ø +ât +“ äh +äR*æÀ +Œä„ +â +Œä îøü+Ô6 äÐ + +Ô6 +îD+öè8+è€âØ +èö¸+åçäçæááxýâOá“äÐ+ä4é€ÿÿÿÿÿÿÿ÷8+ ¸ ä + + ¸ H+î€+öèt+è€âØ +èöô+åçäçæááxýâPá“ä +ä4éþ„+uäH+â +uä îøÐ+áµä”+â +áµä îø+üÇ äà+â +üÇ ä îøh+6ä,+â +6ä îø´+„‹äx+â +„‹ä îù+ ‡ äÄ+â + ‡ ä îø<+Ï ä+ +Ï L+î„+öèx+è€âØ +èöø+åçäçæááxýâ^á“ä+ä4ÿêx+P2 äL+ +P2 ˆ+îÀ+öè´+è€âØ +èö4+åçäçæááxýâ_á“äL+ä4ÿêÄ+ôcäˆ+â +ôcä ÿè+ÄQåÔ+â +ÄQå ÿè\+œƒ ä +â +œƒ ä ÿè¨+¬Cäl+â +¬Cä ÿèô+LÅ ä¸+â +LÅ ä ÿè@+ôä+â +ôä ÿèŒ+¤˜äP+â +¤˜ä ÿèØ+Ìaåœ+â +Ìaátæ ÿè$+`äè+â +`ä ÿè`+0šä4+ +0šp+î¨+öèœ+è€âØ +èö+åçäçæááxýâká“ä4+ä4ÿêœ+œ{ äp+ +œ{ ¬+îä+öèØ+è€âØ +èöX+åçäçæááxýâlá“äp+ä4ÿêØ+ ^ä¬+ + ^è+î +öè+è€âØ +èö”+åçäçæááxýâmá“ä¬+ä4ÿê+áä è+ +á $+î\+öèP+è€âØ +èöÐ+åçäçæááxýâná“äè+ä4ÿê`+˜¸å$+â +˜¸å ÿè¬+\¯ äp+â +\¯ ä îøø+Ää¼+â +Ää îøD+`½ ä+â +`½ ä ÿè+Ì7äT+â +Ì7ä ÿèÜ+Ìä +â +Ìøê ÿì˜Räì+ +˜R(+ÿèäd+äT+äãØ +ì âØ + ä+è€+ì âØ +ðT+îäR*èöâ +û¨0+ðpäÐ0+‚ßä¼0+çÌkDýäÔ+ä<+!ãáT+ûäL+Ô+âp+“ äd+@V*æ¼+Œä€+â+Œä îøø +Ô6 äÌ++Ô6  +î@ +öè4 +è€âÔ+èö´ +åçäçæááxýâá“äÌ +ä4é€ÿÿÿÿÿÿÿ÷4"+ ¸ ä!++ ¸ D!+î|!+öèp!+è€âÔ+èöð!+åçäçæááxýâá“ä"+ä4éþ€"+uäD"+â+uä îøÌ"+áµä"+â+áµä îø#+üÇ äÜ"+â+üÇ ä îød#+6ä(#+â+6ä îø°#+„‹ät#+â+„‹ä îøü#+ ‡ äÀ#+â+ ‡ ä îø8%+Ï ä $++Ï H$+î€$+öèt$+è€âÔ+èöô$+åçäçæááxýâ'á“ä %+ä4ÿêt&+P2 äH%++P2 „%+î¼%+öè°%+è€âÔ+èö0&+åçäçæááxýâ(á“äH&+ä4ÿêÀ&+ôcä„&+â+ôcä ÿè '+ÄQåÐ&+â+ÄQå ÿèX'+œƒ ä'+â+œƒ ä ÿè¤'+¬Cäh'+â+¬Cä ÿèð'+LÅ ä´'+â+LÅ ä ÿè<(+ôå(+â+ôä ÿèˆ(+¤˜äL(+â+¤˜ä ÿèÔ(+Ìaå˜(+â+Ìaátæ ÿè )+`ää(+â+`ä ÿè\*+0šä0)++0šl)+î¤)+öè˜)+è€âÔ+èö*+åçäçæááxýâ4á“ä0*+ä4ÿê˜++œ{ äl*++œ{ ¨*+îà*+öèÔ*+è€âÔ+èöT++åçäçæááxýâ5á“äl++ä4ÿêÔ,+ ^ä¨+++ ^ä++î,+öè,+è€âÔ+èö,+åçäçæááxýâ6á“ä¨,+ä4ÿê.+áä ä,++á  -+îX-+öèL-+è€âÔ+èöÌ-+åçäçæááxýâ7á“ää-+ä4ÿê\.+˜¸å .+â+˜¸å ÿè¨.+\¯ äl.+â+\¯ ä îøô.+Ää¸.+â+Ää îø@/+`½ ä/+â+`½ ä ÿèŒ/+Ì7äP/+â+Ì7ä ÿèØ/+Ìäœ/+â+Ìøê ÿì˜Räè/++˜R$0+ÿèä`0+äP0+äãÔ+ì âÔ+ äŒ0+è|0+ì âÔ+ðP0+î@V*èöâ1+ûôpè‚ßäˆB+çÌkDÒäÐ0+ä81+ ãáP1+ûäH1+Ð0+âœ1+Œä`1+â1+Œä îøØ2+Ô6 ä¬1+1+Ô6 è1+î 2+öè2+è€âÐ0+èö”2+åçäçæááxýâæâ“ä¬2+ä4ÿê4+ ¸ äè2+1+ ¸ $3+î\3+öèP3+è€âÐ0+èöÐ3+åçäçæááxýâçâ“äè3+ä4êþ`4+uä$4+â1+uä îø¬4+áµäp4+â1+áµä ÿèø4+üÇ ä¼4+â1+üÇ ä ÿèD5+6ä5+â1+6ä îø5+„‹äT5+â1+„‹ä îøÜ5+ ‡ ä 5+â1+ ‡ ä îø7+Ï äì5+1+Ï (6+î`6+öèT6+è€âÐ0+èöÔ6+åçäçæááxýâîâ“äì6+ä4ÿêT8+P2 ä(7+1+P2 d7+îœ7+öè7+è€âÐ0+èö8+åçäçæááxýâïâ“ä(8+ä4ÿê 8+ôcäd8+â1+ôcä ÿèì8+ÄQå°8+â1+ÄQå ÿè89+œƒ äü8+â1+œƒ ä ÿè„9+¬CäH9+â1+¬Cä ÿèÐ9+LÅ ä”9+â1+LÅ ä ÿè:+ôäà9+â1+ôä ÿèh:+¤˜ä,:+â1+¤˜ä ÿè´:+Ìaåx:+â1+Ìaátæ ÿé;+`äÄ:+â1+`ä ÿè<<+0šä;+1+0šL;+î„;+öèx;+è€âÐ0+èöø;+åçäçæááxýâûâ“ä<+ä4ÿêx=+œ{ äL<+1+œ{ ˆ<+îÀ<+öè´<+è€âÐ0+èö4=+åçäçæááxýâüâ“äL=+ä4ÿê´>+ ^äˆ=+1+ ^Ä=+îü=+öèð=+è€âÐ0+èöp>+åçäçæááxýâýâ“äˆ>+ä4ÿêð?+áä Ä>+1+áá?+î8?+öè,?+è€âÐ0+èö¬?+åçäçæááxýâþâ“äÄ?+ä4ÿê<@+˜¸æ@+â1+˜¸å ÿèˆ@+\¯ äL@+â1+\¯ ä îøÔ@+Ää˜@+â1+Ää ÿè A+`½ ää@+â1+`½ ä ÿèlA+Ì7ä0A+â1+Ì7ä ÿè¸A+Ìä|A+â1+Ìøê ÿì˜RäÈA+1+˜RB+ÿèä@B+ä0B+äãÐ0+ì âÐ0+ älB+è\B+ì âÐ0+ð0B+þxC+ä¼èîâÐB+ò{öDõýÿíövõýÿí¸ì ä(öýÿí„: ä,öýÿí´)å,öýÿífä)ö;öùÿõ}öÌk¸ì x~+îÄ{+äÐîä”~+ìâÐ~+„: ä°~+ì âÀ~+æ ìü~+´)åì~+ì äêfä+ê â(+ ä äîˆ+âä‚+¸ì âÐ+üø+ò +T+ ð¸+è òöÿÿô;öpõýÿí„: ä,öqõýÿí´)å)öùÿõ*öýÿí„: ä=öýÿífä;öùÿõ}öÌk¸ì 4‚+î8+äXîäP‚+ìâ|‚+„: äl‚+ì 쨂+´)嘂+ì äêfäÄ‚+ê âÔ‚+ ä äî4ƒ+â(ˆ+$_$┃+üô†+òLƒ+ôã ðdƒ+T+ î|ƒ+‹ òövõýÿíÜä(öTõ<öýÿíö(öýÿí„: ä)ö,öTõ<öýÿíö(öýÿí… ä)ö,öýÿíüä)ö;öùÿõ}öÌkÜ@¬++ä<îä|¬+ä\¬+äâ âl¬+æ 올+„: ä\¬+ê´¬+… ä\¬+îüä\¬+ô ­+â̯+Üâ8­+ý¯+öövõýÿíÜä(öýÿí„: ä,öýÿí… ä,öýÿíüä)ö;öùÿõ}öÌkÜ<¯+îЬ+ä8 îäx¯+äX¯+äâ âh¯+æ 씯+„: äX¯+ì°¯+… äX¯+ðüäX¯+ô°+â@³+ÜâL°+üt²+ò4°+„ ôØ î{öùÿõ>õ(öýÿí… äkõýÿí„: ä)öùÿõ*öqõýÿíüä=ö*öqõýÿí… ä;öùÿõDõýÿíüä;öùÿõ}öÌkܰ²+î̯+äh îäܲ+ä̲+äâ äæ³+„: äø²+ì ì$³+… äø²+ðüä̲+ô³+⤷+ŒŠâس+üH¶+ò¨³+ˆFðÀ³+ö(öýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíüä.öýÿí“ ä(ö)ö)ö)ö;öùÿõ}öÌkŒŠ„¶+î@³+äÜ¡ïäø¶+ä ¶+äâ â ˆ•°¶+Ô¶+äĶ+è ðâè¶+è äæ4·+„: ä·+ì â$·+æ äæP·+… ä·+ðüäl·+ì â ˆ•|·+·+äĶ+ìâè¶+ðô·+⨻+ŒŠâ<¸+üLº+ò ¸+ˆFð$¸+œ» òö(öýÿ팊ä(öýÿí„: ä.öýÿí“ ä(ö)ö,öýÿí… ä.öýÿí“ ä(ö)ö,öýÿíüä.öýÿí“ ä(ö)ö)ö)ö;öùÿõ}öÌkŒŠ¬¿++ä ïä À+äÈ¿+äâ â ˆ•Ø¿+ü¿+äì¿+è ðâÀ+è äæ„À+„: ä<À+ì â ˆ•LÀ+`À+äì¿+ìâtÀ+è 俨À+… ä À+ì â ˆ•°À+ÄÀ+äì¿+ìâtÀ+ìüäôÀ+ì â ˆ•Á+Á+äì¿+ìâÀ+ð|Á+âxÅ+ŒŠ!â”Á+ü¬Ä+öövõýÿ팊ä(öTõ<öýÿíö(öýÿí„: ä)ö,öTõ<öýÿíö(öýÿí… ä)ö,öýÿíüä)ö;öùÿõ}öÌkŒŠèÄ+î,Á+䬟ïä$Å+äÅ+äâ âÅ+æ ì@Å+„: äÅ+ê\Å+… äÅ+îüäÅ+ôÈÅ+âtÈ+ŒŠâàÅ+ü¨Ç+öövõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíüä)ö;öùÿõ}öÌkŒŠäÇ+îxÅ+äŸïä È+åÈ+äâ âÈ+æ ì<È+„: åÈ+ìXÈ+… åÈ+ðüåÈ+ôÄÈ+â`Ì+ŒŠâôÈ+ü”Ë+òÜÈ+ôã ôT+ î{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä,öpõýÿíüä)öùÿõ*öýÿíüä=ö*öýÿí„: ä;öùÿõDõýÿíüä;öùÿõ}öÌkŒŠÐË+îtÈ+ä\žïäüË+äìË+äâ äæ(Ì+„: äÌ+ì ìDÌ+… äÌ+ðüäìË+ô°Ì+â„Ô+Lì EâøÌ+üpÓ+òÈÌ+Ð ñàÌ+P!áò”r î{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿí¬Uä,öpõýÿíUä)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõDõZõ;öùÿõ;õ(öýÿí€;ä(ö*öýÿíUä,ö*öýÿí¬Uä)ö)öùÿõDõ[õ;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿíUäkõýÿíLÁä)ö;öùÿõ}öÌkLì ¬Ó+âî`Ì+ä ïäÈÓ+ìâôÓ+¬UääÓ+ì ìÔ+èÁääÓ+ì<Ô+Uä,Ô+ì äæXÔ+LÁä,Ô+ð€;ätÔ+ì äîÔÔ+âÔÛ+Lì ?âÕ+üìÚ+òìÔ+Ð õP!áî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁäiõýÿíUäkõýÿíLÁä;öpõýÿí¬Uä,öpõýÿíUä)öùÿõ{öùÿõ;õ(ö*öýÿí¬Uä<ö*öýÿíUä)öùÿõDõZõ;öùÿõ;õ(ö*öýÿíUä<ö*öýÿí¬Uä)öùÿõDõ[õ;öùÿõ}öùÿõDõXõ<öõ>ö(öýÿíUäkõýÿíLÁä)ö;öùÿõ}öÌkLì (Û+î„Ô+äïäDÛ+ìâpÛ+¬Uä`Û+ì ìŒÛ+èÁä`Û+ì¸Û+Uä¨Û+ì äêLÁä¨Û+ô$Ü+âÐá+$;2âTÜ+üá+ò<Ü+, ô”r î{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(öýÿí€;ä(ö*öýÿíä&å,ö*öýÿí„: ä)ö)öùÿõýÿíä&å=öýÿí„: ä;öùÿõDõýÿíä&å;öùÿõ}öÌk$;@á+îÔÛ+䜜ïälá+ä\á+äâ ìˆá+„: ä\á+ì¤á+… ä\á+ð€;äÀá+ì äî â+â@ç+$;/â8â+ü æ+ö, ð{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(ö*öýÿíä&å<ö*öýÿí„: ä)öùÿõýÿíä&å=öýÿí„: ä;öùÿõDõýÿíä&å;öùÿõ}öÌk$;Üæ+îÐá+äDœïäç+äøæ+äâ ì$ç+„: äøæ+ð… äøæ+ôç+â<í+¬ï2âÀç+üpì+ò¨ç+, ô”r î{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(öýÿí€;ä(ö*öýÿí„: ä,ö*öýÿíä&å)ö)öùÿõýÿíä&å=öýÿí„: ä;öùÿõDõýÿíä&å;öùÿõ}öÌk¬ï¬ì+î@ç+ä˜ïäØì+äÈì+äâ ìôì+„: äÈì+ìí+… äÈì+ð€;ä,í+ì äîŒí+â¬ò+¬ï/â¤í+ü ò+ö, ð{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ@õ(öpõýÿí„: ä;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(ö*öýÿí„: ä<ö*öýÿíä&å)öùÿõýÿíä&å=öýÿí„: ä;öùÿõDõýÿíä&å;öùÿõ}öÌk¬ïHò+î<í+äüŽïätò+ädò+äâ ìò+„: ädò+ð… ädò+ôüò+âˆõ+ ¸ â,ó+ü¬ô+òó+ö(övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö)ö;öùÿõ;õ(öýÿí`jä<öýÿí ä)öùÿõDõýÿí… ä;öùÿõ@õ(ö;öýÿí`jämõýÿí ä;öpõýÿí„: ä,öqõýÿí`jä)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ@õ(öýÿíè äýÿí´)å=öÿÿô;öýÿí´)å<öýÿí ä;öpõýÿí´)å,öpõýÿíä&å,öqõýÿí`jä)öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿíä&å,öýÿífä)ö)öùÿõAõýÿíäzä;öùÿõDõýÿí„: ä;öùÿõýÿíäzä:öùÿõýÿí„: ä=öýÿíä&å;öùÿõ}öùÿõDõýÿí… ä;öùÿõ}öÌkhl` ,âîý+äÌ‹ïäŒ ,ä| ,äâ ì¨ ,„: ä| ,ìÄ ,… ä| ,ìð , äà ,ì äæ, ,fä ,ê â , ä äêÐú äH ,ì äî¨ ,âP,hlyâð ,üH,òÀ ,, ðØ ,è òö(övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö)ö;öùÿõ;õ(öýÿí`jä<öýÿí ä)öùÿõDõýÿí… ä;öùÿõ@õ(ö;öýÿí`jämõýÿí ä;öpõýÿí„: ä,öqõýÿí`jä)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ@õ(öýÿíè äýÿí´)å=öÿÿô;öýÿí´)å<öýÿí ä;öpõýÿí´)å,öpõýÿíä&å,öqõýÿí`jä)öùÿõ;õ(ö!ö(ö*öýÿíä&åjõýÿífä)ö)öùÿõAõýÿíäzä;öùÿõDõýÿí„: ä;öùÿõýÿíäzä:öùÿõýÿí„: ä=öýÿíä&å;öùÿõ}öùÿõDõýÿí… ä;öùÿõ}öÌkhl„,âîX ,äàŠïä°,ä ,äâ ìÌ,„: ä ,ìè,… ä ,ì, ä,ì äêfä0,ê â@, ä äî ,â€,Ц/âè,üP,ò¸,Ð ñÐ,P!áòäËî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁä;öpõýÿí¬Uä,öpõýÿíUä)öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõCõ;öùÿõDõýÿí@% ä<öýÿíÐ å,öýÿíP!å>ö(öýÿí¬Uä,öýÿíUä)ö;öùÿõ}öÌkЦŒ,îP,ä$Šïå,ä¨,äâ â X¹¸,Ü,äÌ,è ðâð,è äæ,¬UäÌ,ì8,èÁäÌ,ìT,Uäð,ðÐú äp,ì äîÐ,âT#,Ц.ã,üP",òè,Ð õP!áî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁä;öpõýÿí¬Uä,öpõýÿíUä)öùÿõ;õ(ö!ö(ö*öýÿí¬Uäjõ*öýÿíUä)ö)öùÿõCõ;öùÿõDõýÿí@% ä<öýÿíÐ å,öýÿíP!å>ö(öýÿí¬Uä,öýÿíUä)ö;öùÿõ}öÌkЦŒ",î€,äP‰ïå#,ä¨",äâ â X¹¸",Ü",äÌ",è ðâð",è äæ#,¬UäÌ",ì8#,èÁäÌ",ðUäð",ô¤#,âÜ(,D|+âÔ#,üÜ',ò¼#,ôã ô‹ î{öùÿõ õýÿíÌLä<öýÿíôã ä>övõýÿí€×äýÿíüä=öÿÿô;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõpõýÿíüä;öùÿõDõýÿíüä;öùÿõ}öÌkD|(,îT#,ää}ïäx(,ä4(,äâ â D(,€× âT–T(,èh(,è ì”(,„: äh(,ì°(,… äh(,ðÐú äÌ(,ì äî,),â\., *â\),üL-,òD),ôã ôövõýÿí€×äýÿíüä=öÿÿô;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõ;õ(ö*öýÿí„: äjõýÿífä)öùÿõpõýÿíüä;öùÿõDõýÿíüä;öùÿõ}öÌk ˆ-,îÜ(,äh}ïäè-,ä¤-,äâ â ´-,€× âT–Ä-,èØ-,è ì.,„: äØ-,ì .,… äØ-,ðfä<.,ê âL., ä äî¬.,âx5,dè >âÜ.,ü¬4,òÄ.,, ôäËî{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ@õ(öpõýÿíä&å;öýÿíä&åkõýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõ;õ(öýÿíÐú ä(ö*öýÿí„: ä,ö*öýÿíä&å)ö)öùÿõDõýÿí„: ä;öùÿõýÿí„: ä=öýÿíä&å;öùÿõ}öùÿõ}öùÿõDõýÿí… ä;öùÿõ}öÌkdè è4,î\.,äÄ|ïä5,ä5,äâ ì05,„: ä5,ìL5,… ä5,ðÐú äh5,ì äîÈ5,â<,dè ;âà5,üh;,ö, ð{öùÿõ;õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí, äýÿíä&å=öýÿí„: ä;öùÿõ@õ(öpõýÿíä&å;öýÿíä&åkõýÿí… ä;öpõýÿíä&å)öùÿõ{öùÿõ;õ(ö*öýÿí„: äjõ*öýÿíä&å)öùÿõDõýÿí„: ä;öùÿõýÿí„: ä=öýÿíä&å;öùÿõ}öùÿõ}öùÿõDõýÿí… ä;öùÿõ}öÌkdè ¤;,îx5,ä„|ïäÐ;,äÀ;,äâ ìì;,„: äÀ;,ð… äÀ;,ôX<,â¬B,hç5â <,ü˜A,òp<,„Pðˆ<,ìQòäËî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁä;öpõýÿí¬Uä)öùÿõ{öùÿõ@õ(öýÿíìQäýÿíä&å=öýÿíUä;öýÿíä&åkõýÿíLÁä;öpõýÿíä&å)öùÿõ;õ(öýÿíÐú ä(ö*öýÿí¬Uä,ö*öýÿíä&å)ö)öùÿõDõýÿí¬Uä;öùÿõ}öùÿõDõýÿíèÁä;öùÿõ}öÌkhçÔA,âî<,äì{ïåB,äðA,äâ ìB,¬UäðA,ì8B,èÁäðA,ìdB,UäTB,ì 俀B,LÁäTB,ðÐú äœB,ì äîüB,âÄH,hç2â,C,üÜG,òC,„PôìQî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁä;öpõýÿí¬Uä)öùÿõ{öùÿõ@õ(öýÿíìQäýÿíä&å=öýÿíUä;öýÿíä&åkõýÿíLÁä;öpõýÿíä&å)öùÿõ;õ(ö*öýÿí¬Uäjõ*öýÿíä&å)öùÿõDõýÿí¬Uä;öùÿõ}öùÿõDõýÿíèÁä;öùÿõ}öÌkhçH,âî¬B,ä{ïäDH,ä4H,äâ ì`H,¬Uä4H,ì|H,èÁä4H,ì¨H,Uä˜H,ì äêLÁä˜H,ôI,âHN,á^á)â\I,ü4M,ò,I,„PðDI,ìQòäËî{öùÿõõ õýÿíÌLä<öýÿí„Pä>övõýÿíˆ; äýÿíð^ä;öùÿõDõýÿí¼Uä<öýÿí„Pä,öýÿíìQä,öýÿíäËä>öùÿõ(öýÿí¬Uä,öýÿíèÁä,öýÿíUä,öýÿíLÁä,öýÿíÐú ä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌká^ápM,îÄH,ä,zïäœM,äŒM,äâ ì¸M,¬UäŒM,ìÔM,èÁäŒM,íN,UäðM,ì äæN,LÁäðM,ðÐú ä8N,ì äî˜N,âp_,¼U¤âàN,ü@^,ò°N,„ ðÈN,ìQòäËî{öùÿõ õýÿíÌLä<öýÿí„ ä>övõýÿí€×äýÿí`jä=övõýÿíx†ävõýÿí(èä(öýÿí¬Uä,öýÿíèÁä)ö;öùÿõ õýÿíÌLä<öýÿíìQä>övõýÿí€×äýÿíTkä=övõýÿíx†ävõýÿí(èä(öýÿíUä,öýÿíLÁä)ö;öùÿõ;õ(öýÿí`jä<öýÿíTkähõýÿíTkäjõÿÿô)öùÿõDõýÿíèÁä;öùÿõýÿí„ äýÿíüä=öýÿíèÁä;öùÿõ@õ(övõýÿíx†ävõýÿí,‚ä(öýÿíüä,ö-öýÿíTkä)ö;öýÿíüäkõýÿí¬Uä;öqõýÿíüä)öùÿõ;õ(övõýÿíx†ävõýÿíÜzä<öýÿíìQä,öýÿí„ ä,öùÿõ õýÿí ûävõýÿíÔä<öýÿíäËä>övõýÿíÅ ä>öùÿõ(öýÿíUä,öýÿíLÁä,öýÿíüä,öýÿíÐú ä)ö)öùÿõDõýÿíüä;öùÿõ;õ(övõýÿíx†ävõýÿíÜzä<öýÿíìQä,öýÿí„ ä,öùÿõ õýÿí ûävõýÿíÔä<öýÿíäËä>övõýÿíÅ ä>ö(öýÿíUä,öýÿíLÁä,öýÿí¬Uä,öýÿíÐú ä)ö)öùÿõDõýÿí¬Uä;öùÿõDõýÿíèÁä;öùÿõ}öÌk¼U|^,âîHN,äÌyïä¨^,ä˜^,äâ ìÄ^,¬Uä˜^,ìà^,èÁä˜^,ì _,Uäü^,ì äæ(_,LÁäü^,ìT_,Ðú äD_,ì äê 7䔋ôÀ_,âØl,¼U|â`,ü¨k,òØ_,„Pðð_,ìQòäËî{öùÿõýÿí¬Uä=övõýÿíx†ävõýÿílÏ ä<öýÿí„Pä,öýÿíìQä,öùÿõ õýÿí ûävõýÿíÔä<öýÿíäËä>övõýÿíÅ ä>öùÿõ(öýÿí¬Uä,öýÿíèÁä,öýÿíUä,öýÿíLÁä,öýÿíÐú ä)ö;öùÿõýÿí„Päýÿíüä=öýÿí¬Uä;öùÿõ;õ(öýÿí¬UäkõýÿíèÁä)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõpõýÿí¬Uä;öùÿõýÿí¬Uä=övõýÿíx†ävõýÿílÏ ä<öýÿí„Pä,öýÿíìQä,öùÿõ õýÿí ûävõýÿíÔä<öýÿíäËä>övõýÿíÅ ä>öùÿõ(öýÿí¬Uä,öýÿíèÁä,öýÿíUä,öýÿíLÁä,öýÿíÐú ä)ö;öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõCõ;öùÿõýÿíüä=öýÿí¬Uä;öùÿõ}öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌk¼Uäk,âîp_,äxyïäl,ål,äâ ì,l,¬Uål,ìHl,èÁål,ìtl,Uädl,ì äæl,LÁädl,ì¼l,Ðú ä¬l,ì äê 7äàŒô(m,â(q,á^áâXm,ü@p,ò@m,„PôìQî{öùÿõõ õýÿíÌLä<öýÿí„Pä>övõýÿíˆ; äýÿíð^ä;öùÿõDõýÿí¼Uä(öýÿí¬Uä,öýÿíèÁä,öýÿíUä,öýÿíLÁä,öýÿíð^ä(ö)ö)ö;öùÿõ}öÌká^á|p,îØl,ä°xïä¨p,ä˜p,äâ ìÄp,¬Uä˜p,ìàp,èÁä˜p,ì q,Uäüp,ì äêLÁäüp,ôxq,â”~,¼Uâ¨q,ü},òq,„ ôìQî{öùÿõ õýÿíÌLä<öýÿí„ ä>övõýÿí€×äýÿí`jä=övõýÿíx†ävõýÿí(èä(öýÿí¬Uä,öýÿíèÁä)ö;öùÿõ õýÿíÌLä<öýÿíìQä>övõýÿí€×äýÿíTkä=övõýÿíx†ävõýÿí(èä(öýÿíUä,öýÿíLÁä)ö;öùÿõ;õ(öýÿí`jä<öýÿíTkähõýÿíTkäjõÿÿô)öùÿõDõýÿíèÁä;öùÿõýÿí„ äýÿíüä=öýÿíèÁä;öùÿõ@õ(övõýÿíx†ävõýÿí,‚ä(öýÿíüä,ö-öýÿíTkä)ö;öýÿíüäkõýÿí¬Uä;öqõýÿíüä)öùÿõ;õ(övõýÿíx†ävõýÿíÜzä(öýÿíUä,öýÿíLÁä,öýÿíüä)ö)öùÿõDõýÿíüä;öùÿõ;õ(övõýÿíx†ävõýÿíÜzä(öýÿíUä,öýÿíLÁä,öýÿí¬Uä)ö)öùÿõDõýÿí¬Uä;öùÿõDõýÿíèÁä;öùÿõ}öÌk¼UÌ},âî(q,ä`mïäø},äè},äâ ì~,¬Uäè},ì0~,èÁäè},ì\~,UäL~,ì äæx~,LÁäL~,ð 7䔋ôä~,â‰,¼U`â,üˆ,òü~,„PôìQî{öùÿõýÿí¬Uä=övõýÿíx†ävõýÿílÏ ä<öýÿí„Pä,öýÿíìQä>ö(öýÿí¬Uä,öýÿíèÁä,öýÿíUä,öýÿíLÁä)ö;öùÿõýÿí„Päýÿíüä=öýÿí¬Uä;öùÿõ;õ(öýÿí¬UäkõýÿíèÁä)öùÿõ{öùÿõ>õ(öZõ)öùÿõ{öùÿõpõýÿí¬Uä;öùÿõýÿí¬Uä=övõýÿíx†ävõýÿílÏ ä<öýÿí„Pä,öýÿíìQä>ö(öýÿí¬Uä,öýÿíèÁä,öýÿíUä,öýÿíLÁä)ö;öùÿõ;õ(öýÿí¬UäjõýÿíèÁä)öùÿõCõ;öùÿõýÿíüä=öýÿí¬Uä;öùÿõ}öùÿõ}öùÿõDõýÿíüä;öùÿõ}öÌk¼UPˆ,âî”~,ä mïä|ˆ,älˆ,äâ 예,¬Uälˆ,ì´ˆ,èÁälˆ,ìàˆ,UäЈ,ì äæüˆ,LÁäЈ,ð 7äàŒôh‰,â˜,lÏ Žâ°‰,ý—,ò€‰,„Pð˜‰,ìQòäËî{öùÿõ õýÿíÌLä<öýÿíìQä>övõýÿí€×äýÿíTkä=övõýÿíx†ävõýÿí(èä(öýÿíUä,öýÿíLÁä)ö;öùÿõ;õ(öýÿíTkäjõÿÿô)öùÿõDõýÿí¬Uä;öùÿõ õýÿíÌLä<öýÿí„Pä>övõýÿí€×äýÿí`jä=övõýÿíx†ävõýÿí(èä(öýÿí¬Uä,öýÿíèÁä)ö;öùÿõ;õ(öýÿí`jä<öýÿíTkä)öùÿõDõýÿíèÁä;öùÿõýÿí„Päýÿí,)å=öýÿí¬Uä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿí,)å,öýÿíTkä-öÿÿìæ)ö;öùÿõ@õ(ö;öýÿí`jämõýÿíTkä;öpõýÿí¬Uä,öqõýÿí`jä)öùÿõ;õ(övõýÿíx†ävõýÿíÜzäùÿõ<öýÿí„Pä,öýÿíìQä,öùÿõ õýÿí ûävõýÿíÔä<öýÿíäËä>övõýÿíÅ ä>öùÿõ(öýÿí¬Uä,öpõýÿí,)å,öýÿíUä,öýÿíÐú ä)ö)öùÿõDõýÿí¬Uä;öùÿõDõýÿíèÁä;öùÿõ}öÌklÏ <—,âî‰,ä$lïäh—,äX—,äâ ì„—,¬UäX—,ì —,èÁäX—,ìÌ—,Uä¼—,ì äæè—,LÁä¼—,ðÐú ä˜,ì äîd˜,âì¤,lÏ z┘,ü¤,ò|˜,„PôìQî{öùÿõ õýÿíÌLä<öýÿíìQä>övõýÿí€×äýÿíTkä=övõýÿíx†ävõýÿí(èä(öýÿíUä,öýÿíLÁä)ö;öùÿõ;õ(öýÿíTkäjõÿÿô)öùÿõDõýÿí¬Uä;öùÿõ õýÿíÌLä<öýÿí„Pä>övõýÿí€×äýÿí`jä=övõýÿíx†ävõýÿí(èä(öýÿí¬Uä,öýÿíèÁä)ö;öùÿõ;õ(öýÿí`jä<öýÿíTkä)öùÿõDõýÿíèÁä;öùÿõýÿí„Päýÿí,)å=öýÿí¬Uä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿí,)å,öýÿíTkä-öÿÿìæ)ö;öùÿõ@õ(ö;öýÿí`jämõýÿíTkä;öpõýÿí¬Uä,öqõýÿí`jä)öùÿõ;õ(övõýÿíx†ävõýÿíÜzä(öýÿí¬Uä,öpõýÿí,)å,öýÿíUä)ö)öùÿõDõýÿí¬Uä;öùÿõDõýÿíèÁä;öùÿõ}öÌklÏ @¤,âî˜,ä¸kïäl¤,ä\¤,äâ 숤,¬Uä\¤,줤,èÁä\¤,ìФ,UäÀ¤,ì äêLÁäÀ¤,ô<¥,â ª,Üz&â„¥,ü©,òT¥,Ð ñl¥,P!áòäËî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁä;öpõýÿí¬Uä,öpõýÿíUä)öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿí¬Uä,ö*öýÿíUä)ö)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öÌkÜzP©,îì¤,ä,kïäl©,ì☩,¬U䈩,ì ì´©,èÁ䈩,ìà©,UäЩ,ì äêÐú äü©,ì äî\ª,âЮ,Üz%〉,ü®,òtª,Ð õP!áî{öùÿõ@õ(ö;öýÿí¬UäkõýÿíèÁä;öpõýÿí¬Uä,öpõýÿíUä)öùÿõ;õ(ö!ö(ö*öýÿí¬Uäjõ*öýÿíUä)ö)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öÌkÜz@®,î ª,ä¤jïä\®,ì∮,¬Uäx®,ì 줮,èÁäx®,ðUäÀ®,ì äî ¯,ât²,¨„áâP¯,ü¨±,ò8¯,ôã ô‹ î{öùÿõ>õ(öýÿí„: äkõýÿí… äiõ!öýÿíÐú ä(ö*öýÿí„: ä)ö)öùÿõpõýÿí„: ä;öùÿõDõýÿí„: ä;öùÿõ}ö Ìk¨„áä±,îЮ,ä0jïä²,å²,äâ ì,²,„: å²,ìH²,… å²,ðÐú äd²,ì äîIJ,â@¶,| âô²,üdµ,òܲ,ôã ôõ(öýÿí„: äkõýÿí… äiõ!ö(ö*öýÿí„: äjõýÿífä)ö)öùÿõpõýÿí„: ä;öùÿõDõýÿí„: ä;öùÿõ}öÌk|  µ,ît²,ä´iïä̵,ä¼µ,äâ ìèµ,„: ä¼µ,ì¶,… ä¼µ,ðfä ¶,ê â0¶, ä äî¶,âä¹,ä€ âÀ¶,ü¹,ò¨¶,ôã ô ¬î{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíL%å(ö*öýÿí„: ä)ö;öùÿõDõýÿíL%å;öùÿõ}öÌkä€ T¹,î@¶,äÌhï䀹,äp¹,äâ 俬¹,„: 䜹,ì ìȹ,… 䜹,ðL%åp¹,ô4º,∽,°nâ|º,ü¼,òLº,H>ñdº,å,öýÿíö(öýÿíL%å)ö;öùÿõ}öÌk°nP¼,îä¹,äÄgïäè¼,äl¼,äâ â ”A'|¼, ¼,ä¼,è ìļ,â´¼,è äêâؼ,è äêL%å½,ì â½,´¼,æä4½,ä¼,䀀ãP½,è@C'êl½,è@C'öؼ,ôؽ,â¤À,°nâ¾,üp¿,òð½,H>õå,öýÿíö(öýÿíL%å)ö;öùÿõ}öÌk°n¬¿,,ä|\ïä À,äÈ¿,äâ â ÐK'Ø¿,ü¿,äì¿,è ðâÀ,è äêL%å<À,ì âPÀ,À,æälÀ,äì¿,䀀ãˆÀ,è@C'ö@C'òôÀ,âHÄ,„ãáâ<Á,üÔÂ,ò Á,H>ñ$Á,å,öýÿíö(öýÿíL%å)ö;öùÿõ}ö Ìk„ãáÃ,î¤À,ä¼[ïä¨Ã,ä,Ã,äâ â R'<Ã,`Ã,äPÃ,è ì„Ã,âtÃ,è äêâ˜Ã,è äêL%åÄÃ,ì âØÃ,tÃ,æäôÃ,äPÃ,䀀ãÄ,è@C'ê,Ä,è@C'ö˜Ã,ô˜Ä,âdÇ,„ãáâÈÄ,ü0Æ,ò°Ä,H>õå,öýÿíö(öýÿíL%å)ö;öùÿõ}ö Ìk„ãálÆ,îHÄ,äàZïäàÆ,äˆÆ,äâ â Y'˜Æ,¼Æ,䬯,è ðâÐÆ,è äêL%åüÆ,ì âÇ,ÐÆ,æä,Ç,䬯,䀀ãHÇ,è@C'ö@C'ò´Ç,âË,°nâüÇ,ü”É,òÌÇ,H>ñäÇ,å,öýÿíö(öýÿíL%å)ö;öùÿõ}öÌk°nÐÉ,îdÇ,ä¨ZïähÊ,äìÉ,äâ â P_'üÉ, Ê,äÊ,è ìDÊ,â4Ê,è äêâXÊ,è äêL%å„Ê,ì â˜Ê,4Ê,æä´Ê,äÊ,ä€äÐÊ,è@C'ììÊ,è@C'öXÊ,ôXË,â$Î,°nâˆË,üðÌ,òpË,H>õå,öýÿíö(öýÿíL%å)ö;öùÿõ}öÌk°n,Í,îË,äZïä Í,äHÍ,äâ â @f'XÍ,|Í,älÍ,è ðâÍ,è äêL%å¼Í,ì âÐÍ,Í,æäìÍ,älÍ,ä€äÎ,è@C'ø@C'òtÎ,âÈÑ,„ãáâ¼Î,üTÐ,òŒÎ,H>ñ¤Î,å,öýÿíö(öýÿíL%å)ö;öùÿõ}ö Ìk„ãáÐ,î$Î,ääXïä(Ñ,ä¬Ð,äâ â ˆl'¼Ð,àÐ,äÐÐ,è ìÑ,âôÐ,è äêâÑ,è äêL%åDÑ,ì âXÑ,ôÐ,æätÑ,äÐÐ,ä€äÑ,è@C'ì¬Ñ,è@C'öÑ,ôÒ,âäÔ,„ãáâHÒ,ü°Ó,ò0Ò,H>õå,öýÿíö(öýÿíL%å)ö;öùÿõ}ö Ìk„ãáìÓ,îÈÑ,äÄXïä`Ô,äÔ,äâ â xs'Ô,<Ô,ä,Ô,è ðâPÔ,è äêL%å|Ô,ì âÔ,PÔ,æä¬Ô,ä,Ô,ä€äÈÔ,è@C'ø@C'ò4Õ,âhØ,ìpâ|Õ,ü×,òLÕ,DéðdÕ,¨èòìñáî{öùÿõDõýÿí<$ä<öýÿíDéä,öýÿí¨èä,öýÿíìñå>ö(öýÿíL%å)ö;öùÿõ}öÌkìpP×,îäÔ,äPXïäè×,äl×,äâ â Ày'|×, ×,ä×,è ìÄ×,â´×,è äêâØ×,è äêL%åØ,ì âØ,æä0Ø,äØ×,êLØ,è×,ø´×,ô¸Ø,âdÛ,ìpâèØ,üPÚ,òÐØ,ð9ôìñáî{öùÿõDõýÿí˜=ä<öýÿíð9ä,öýÿíìñå>ö(öýÿíL%å)ö;öùÿõ}öÌkìpŒÚ,îhØ,äÜWïåÛ,ä¨Ú,äâ â 0€'¸Ú,ÜÚ,äÌÚ,è ðâðÚ,è äêL%åÛ,ì â,Û,æäHÛ,äðÚ,öÌÚ,ô´Û,â(ß,dµ âäÛ,üÜÝ,òÌÛ,ØÛôö(öýÿíÜää,ö õýÿíØÛävõýÿí ¬ä(öýÿí`0å)ö)ö;öùÿõ}öÌkdµ Þ,îdÛ,ädWïäÀÞ,ä4Þ,äâ â Ä'DÞ,hÞ,äXÞ,è ðâ|Þ,è â ŒÞ, ¬ â œÞ,Å â$–¬Þ,èXÞ,èìÞ,ÜääÜÞ,ê âXÞ, è`0åß,ê âß, ä äîxß,âìâ,¼‰â¨ß,ü á,òß,ØÛôö(öýÿíÜää,ö õýÿíØÛävõýÿí‘ä(öýÿí`0å)ö)ö;öùÿõ}öÌk¼‰Üá,î(ß,äXJïä„â,äøá,äâ â  ¯'â,,â,äâ,è ðâ@â,è â Pâ,‘ â `â,Å â$–pâ,èâ,è°â,Üää â,ê ââ, è`0åÌâ,ê âÜâ, ä äî<ã,âDå,¨ç âTã,üŒä,ö‹ ð{öùÿõDõýÿíhrä<öýÿí‹ ä>ö(öýÿíÐú ä)ö;öùÿõ}öÌk¨çÈä,îìâ,äÔIïäå,äää,äâ âTÌ'ôä,èå,è ðÐú ä4å,ê âå, ì”å,âxŒ@è â¬å,üäæ,ö‹ ð{öùÿõDõýÿíLdå<öýÿí‹ ä>ö(öýÿíÐú ä)ö;öùÿõ}öÌk@è ç,îDå,ä\Iïäpç,ä<ç,äâ âÓ'Lç,è`ç,è ðÐú äŒç,ê â`ç, èX{ ä¬ç,ÌkX{ èç,ð è,öäè,ìí ˜ê”è,¨è,åçäçæááxýâ`0á ˜â˜á @fáøäÀè,ä2€èìè,ü8é é,¬ï,Té,ô:âDé,äŒé,ü âTé,æäpé,ìí ˜êÌk”› Té,äääÈé,ö<ê, dê,åçäçáæááxýâ`0á ˜âháÀìsèlá €úáŒMäTë,äýáŒMä€ë,ŠâþáŒMä ì,ŠâÿáŒMä˜ì,ŠâááŒMä$í,ŠâáŒMä°í,ŠâáŒMìáŒMä<î,ŠâáŒMäÈî,ŠâáŒMäTï,ä>áçlÿí ïÿäáìhááÿÿÿáâ ÿì ïÿäóáÿÿÿâ ÿì ðÿäóáÿÿââæ ÿä ðÿÿäáâàÿñâ,å @ÿã ïÿäóÿåâæ ÿä !ïÿlááÿÿÿÿìãøÿâ ÿì ïÿlááÿÿïÿåâ üé€ï,ü:áälÿá ´ï, ˜äàï,ü:›ä˜ÿádä €Ÿ%<5-hå,ð,4ð,â âdð,há5-è,5-äpæÌkhå4ð,ä„ð,ãáDñ,¼Š ä”ð,dð,¼Š Ðð, ö8¥îäüð,ì!ã4ð,ì(ñ,èñ,ì â4ð,ÿàôñ,8‰ äTñ,dð,8‰ ñ, öhîä¼ñ,ì!ã4ð,ìØñ,èñ,ÿè´ò,˜Räò,dð,˜R@ò,ÿèä|ò,älò,äã4ð,ì â4ð, ä˜ò,èñ,ølò,êHó,€OäÄò,dð,€Oáó,ÿèä,ó,ì0!ã4ð,øñ,í!5-ôO¤/-Xó,dð,ôO”ó,Pîøó,öäÀó,ì€â4ð,ìÜó,|W äñ,ðL­ ä ˜êlô,”ô,åçäçæááxýâ|W ñ,äxá @L­ ˜âyá@lâXYäÜô,älâ XY€--¤--älâ XY(/-L/-äáõ,äH,-ü â 8õ,|£ $,-äL-8,-äpæÌk|£ äõ,äXõ,ãáö,¼Š ähõ,8õ,¼Š ¤õ, öü… îäÐõ,ì!ãõ,ìüõ,èìõ,ì âõ,ÿàÈö,8‰ ä(ö,8õ,8‰ dö, öÄ‹ îäö,ì!ãõ,ì¬ö,èìõ,ÿèˆ÷,˜RäØö,8õ,˜R÷,ÿèäP÷,ä@÷,äãõ,ì âõ, äl÷,èìõ,ø@÷,ê<-€Oä˜÷,8õ,€OÔ÷,îø,öåø,ì2!ãõ,øìõ,ìø,¤ø,åçäçæááxýâ|W ìõ,älá@ìù,äì˜ú,äìL -äìä-äìõ,ä0ù,Äù,øáìõ,ä\ù,üáìõ,äˆù,ü:á´ù,älý âìõ,æèðù,lú,ø:èú,üâ8õ,8ŒXú, ÿäìâ4êþ8ÈéÄú,” -áû,ô:€ðú,äØý,ü ãû,æä,û,ì%ãXû,øHû,ì âXû,äâˆû,Ô,è -èpæÌkÔ,äXû,ä¨û,ãáXü,¼Š ä¸û,ˆû,¼Š ôû, ÿèä ü,ì!ãXû,ì<ü,èHû,ÿèý,8‰ ähü,ˆû,8‰ ¤ü, ÿèäÐü,ì!ãXû,ììü,èHû,ÿèÈý,˜Räý,ˆû,˜RTý,ÿèäý,ä€ý,äãXû,ì âXû, ä¬ý,èHû,ø€ý,êüÿ,€OäØý,ˆû,€Oáû,âêþ,öˆþ,œþ,åçäçæááxýâ|W Hû,ä(á@ìÌþ,äì¤ÿ,ä8Èé øþ,4ÿ,Û)ô:€$ÿ,äÌÚ)ü âÛ)ê<ÿ,áHû,ähÿ,ü:á”ÿ,ä(ý âHû,æéÐÿ,ü:á”ÿ,ä(ý$-4å -å4á,Ø)è@-îä4-ˆû,îp-âê¸-öäœ-ä ˜â„ãXû,øHû,ê,-@-åçäçæááxýâ|W Hû,âá@Dâ¬ÝäX-ä8 ˜ä „-À-´ß)ô:â°-äpß)ü â´ß)ê È-,á)äô-ü: -äý â0-æ âXû,æ"| -ôO, -P-ˆû,ôOŒ-âêð-öä¸-ìãXû,ìÔ-èHû,ø ˜êd-Œ-åçäçæááxýâ|W Hû,äá @f ˜âá@;â¬ÝäÔ-ä=â ¬ÝH-l-ä>⠬ݰ -Ô -äá,Ø)å-ü8á,á)ä ,-h-PÙ)ô:âX-ä Ù)ü âPÙ)æ È-p-áHû,äœ-ü:á”ÿ,äÿáÐ-8á ˜ä ü-¬-8-ô:â(-äp-ü â8-æäT-ïýäd€ 8-ââÿè´- éà--ø2é -üé8-ð-ø8é d--È©ô:⸩åªÿà ˜- ˜äÄ-ü:›äý4êþ4êÿâáÌÚ)ôâ8á ˜ä ˜-d-Ô-ô:âÄ-ä(-ü âÔ-æäð-ä ˜çá -è ˜ø ˜êÌktÅ Ô-æÿä P -l-2á ˜ä˜-ü8 ˜ä Ä-ð-´ß)ô:â°-äpß)ÿàø-á,á)ä$ -ü:á -äÿá X - ˜ä„ -ü:›äÿááÌÚ)ôâê -ü:á”ÿ,äýÔ -4 -ˆû,ôOp -ââÿääœ -ìãXû,ì¸ -èHû,øð(îÜ -ˆû,ôO -ÿèäD -ìãXû,ì` -èHû,ø€ý,îÔ,äŒ -Xû,æœ -áìõ,äÈ - -øáìõ,äô -ü:á´ù,älý4êþ8Èé x -„-´ -ô:€¤ -äˆ-ü â´ -æäà -x-è$€â -ð|W äü -ì â -äâ< -Ȭíh-äpæÌkȬå -ä\ -ãá -¼Š äl -< -¼Š ¨ - öô½îäÔ -ì!ã -ìð -èü -ÿè¼-8‰ ä-< -8‰ X- öD­îä„-ì!ã -ì -èü -ÿèx-<ë äÌ-< -<ë - î\-öä 4-P- ˜â„€â -î|W äü -öÐ-ä-åçäçæááxýâ|W ü -â­â@áWâȬåü-ä: ˜ä(-*K öæ üd-öÄ} î ê äh-€Oäˆ-< -€O´ -âêÄ-ö8-L-åçäçæááxýâ|W ü -ä²â@VâȬå|-äVâȬå-äü -ä¨-<-øáü -äÔ-üáü -å-ü:á,-ä²þ âü -æèh-ä-ø:è”-üâ< -PÆ Ð- ÿäìâ4êþé<-ü:á,-ä²þ`-˜Räx-< -˜R´-î4-öä ð-(-à-ä€â -ì â - ä -|W äü -ð 7äà-ö¨-Ð-åçäçæááxýâ|W ü -ä·â @ 7à-â¸â@áUâȬåè-äá-ä$-ü â -æ:áP-ä·þ â-æ"P-ôOD-p-< -ôO¬-âë-öäØ-ô-è€â -ð|W äü -øt-ˆ-åçäçæááxýâ|W ü -äÁâ@SâȬå¸-äSâȬåì-äü -ää-h-øáü -ä-üáü -ä<-ü:á,-äÁþè”-À-ø:è”-ü4êþé-ü:á,-äÁÿâL-< -ôOˆ-îø-öä´-ì-è€â -ìÐ-|W äü -ð 7äà-öl-”-åçäçæááxýâ|W ü -ä¼â @ 7à-â½â@áTâȬåÄ-äTâȬåø-äü -äð-t-øáü -ä-üáü -äH-ü:á,-ä¼þè -Ì-ø:è”-ü4êþé$-ü:á,-ä¼ÿâȬå`- -â”- -äòŒ-é¸-ü:á´ù,älýé-ü:á´ù,älýd-ÈVäL-åÈVXû,äâä-<ë ät-8õ,<ë °-î-öä Ü-ø- ˜â2„€âõ,î|W äìõ,öx-Œ-åçäçæááxýâ|W ìõ,âYá@_âXYä¤-ä8 ˜ä Ð- -p-ô:âü-ä4-ü âp-ê -@-äP-¸-ø âõ,æ@-ä|-ü:¨-äYý â@-æ4êþ" ,-ôO %-ô-8õ,ôO0-Pâê”-öä\-ì€âõ,ìx-|W äìõ,ðL­ ä ˜ê -0 -åçäçæááxýâ|W ìõ,äbá @L­ ˜âcá@]âXYä -ä]â XYX!-|!-ä]â XY°"-Ô"-ä]â XY€$-È$-ä8á-ä ¼ -ø -¬-ô:âè -äp-ü â¬-ë!-é,!-ü:á´ù,äbÿábáˆ-ôâìõ,ä¨!-,"-øáìõ,äÔ!-üáìõ,å"-ü:á´ù,äbýèX"-„"-ø:èú,ü4êÿâbáˆ-ôâáXû,å#-ü8á0-ä ,#-h#-Œ-ô:âX#-äP-ü âŒ-æ $-p#-áìõ,äœ#-ô#-øáìõ,äÈ#-ü:á´ù,äbý4êÿâ ($- ˜äT$-ü:›äcý¤$-báˆ-ôæbáØý,òâéô$-ü:á´ù,äbýd+-(%-8õ,ôOd%-PâêÈ%-öä%-ì€âõ,ì¬%-|W äìõ,ðL­ äð(ê<&-d&-åçäçæááxýâ|W ìõ,ä]á @L­ ð(â^á@^âXYäÄ&-ä^â XY|'- '-ä^â XYÔ(-ø(-ä^â XYÄ*- +-ä8á-ä ð&-'-¬-ô:âè -äp-ÿà$'-éP'-ü:á´ù,ä]ÿá]áˆ-ôâìõ,äÌ'-P(-øáìõ,äø'-üáìõ,ä$(-ü:á´ù,ä]ýè|(-¨(-ø:èú,ü4êÿâ]áˆ-ôâáXû,ä$)-ü8á0-ä P)-Œ)-p -ô:â|)-ä4 -ü âp -æ D*-”)-áìõ,äÀ)-*-øáìõ,äì)-ü:á´ù,ä]ý4êÿâ L*-x*-äˆ*-ü âÜ·æ:´*-ä^ý âð(æè*-]áˆ-ôæ]áØý,òâé8+-ü:á´ù,ä]ÿál+-8õ,ôO¨+-ÿèäÔ+-ìãõ,ìð+-èìõ,ø@÷,î|£ ä,-õ,æ -ìú,õ,äâ8á@-ä t,-°,-0-ô:â ,-äô-ü â0-æ --¸,-éä,-ü:á--äxý âñ,ê (-- ˜äT--ü:›äyÿáxá˜÷,ôâñ,äÐ--T.-øáñ,äü--üáñ,ä(.-ü:á--äxýè€.-ü.-ø:è¬.-üâdð,|£è.- ÿäìâ4êÿâxá˜÷,ôâéx/-ü:á--äxýX4-¬/-dð,ôOè/-PîL0-öä0-ì€â4ð,ì00-|W äñ,ðL­ äð(êÀ0-è0-åçäçæááxýâ|W ñ,äsá @L­ ð(âtá@mâXYä01-ämâ XY„2-¨2-ämâXYÜ3-á4-äáõ,ä\1-ü8á@-ä ˆ1-Ä1-d%-ô:â´1-ä(%-ü âd%-æ $2-Ì1-éø1-ü:á--äsÿá ,2-x*-äX2-ü:´*-ätÿásá˜÷,ôâñ,äÔ2-X3-øáñ,å3-üáñ,ä,3-ü:á--äsýè„3-°3-ø:è¬.-ü4êÿâsá˜÷,ôâé,4-ü:á--äsÿá`4-dð,ôOœ4-ÿèäÈ4-ìã4ð,ìä4-èñ,ølò,îhå5-4ð,æõ,ì¬.-4ð,äâÈA-@å L5-Ìk@áˆ5-äêÀ5-öä¤5-ìý46-H6-åçäçæááxýâ`0éÐá @Žáøä`6-ä2€èŒ6-ü8é ¸6--ŠââŒMä´>-ŠâžâŒMä@?-ŠâŸâŒMäÌ?-Šâ âŒMäX@-Šâ¢âŒMää@-ä>áç¾ÿíðÿºááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâÿáâæ ÿäðÿÿäáâ¸ÿñâ,å @ÿãðÿä æà?ÿñâ{æ@ÿäðÿÿäá â€ÿñâ3ç@ÿãðÿä æà?ÿñâæ@ÿä ðÿ¾ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ¾ááÿÿÿ÷âŸå€Àÿäðÿºááÿÿÿ÷â•æ@ôéA-ü:áäºÿáDA-2€èpA-üéœA-ü:á`ûäÐÿá0ä ‚äDEäèA-ÌkDE$B-ÿìä@B-ïá\B-è ˜ìxB-è|Jÿê ä¤B-Ìk àB-ðC-öäüB-ìí ˜êŒC- C-åçäçæááxýâ`0á ˜âœá @háøä¸C-ä2€èäC-ü8é D-áçÅý>áçÆÿíðÿÁááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâÿáâæ ÿäðÿÿäá â(ÿñâ,å @ÿãðÿä æà?ÿñâ{æ@ÿäðÿÿäá âðÿñâ3ç@ÿãðÿä æà?ÿñâæ@ÿä ðÿÅááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿÆááÿÿÿ÷â˜æ@ÿä ðÿÅááÿÿÿ÷âŸå€ÀôéD¨-ü:áX-äÆÿáx¨-2€è¤¨-üéШ-ü:á`ûä‚ÿሠ ä ©-x 'æ¤ ä$©-´ç'æU¤°-<©-ÌkUx©-äêÌ©-ö䔩-ìá°©-ÿô@ª-hª-åçäçæááxýâ`0ésá@Ð0étá@¢âøä€ª-ä8é ¬ª-¸¯-èª-ô:âت-ä<«-ü âèª-æä«-ìá «-ÿôÌkØèª-äääx«-öì«-¬-åçäçáæááxýâ`0éãáÀxðèäá À-áŒM䤬-Šâ/áŒMä0­-Šâ0áŒMä¼­-Šâ1áŒMäH®-Šâ2áŒMäÔ®-Šâ4áŒMä`¯-ôðÿäááÿÿÿ÷â–æ@ÿäðÿãááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¿æ@ÿäðÿäáÿøâ•æ@ÿäðÿãááÿÿÿ÷â•æ@ô錯-ü:áäãý °-À¯-éì¯-ü:áäsÿá °-2€èL°-üéx°-ü:áX-ätýܵ-¬°-ÌkUè°-î<±-öä±-ìáá ±-ÿô°±-ر-åçäçæááxýâ`0éá@Ð0éá @¨áT5äð±-ä8é ²-µ-X²-ô:âH²-䬲-ü âX²-æät²-ìá²-ÿôÌkYX²-äêè²-ö\³-„³-åçäçæááxýâ`0éØá@Ð0éÙá @’áøäœ³-ä2€èȳ-ü8é ô³-0´-x©-ô:â ´-ä<©-ü âx©-æ ¼´-8´-2€èd´-üé´-ü:á`ûäØÿáÄ´-éð´-ü:áX-äÙý |µ-$µ-éPµ-ü:á`ûäÿᄵ-é°µ-ü:áX-äý»-äµ-ÌkU ¶-ît¶-öä<¶-ìááX¶-ÿôè¶-·-åçäçæááxýâ`0éá@Ð0éá @ªáT5ä(·-ä8é T·-Dº-·-ô:‷-ää·-ü â·-æä¬·-ìáÈ·-ÿôÌk]·-äê ¸-ö”¸-¼¸-åçäçæááxýâ`0éÝá@Ð0éÞá @”áøäÔ¸-ä2€é¹-ü8é ,¹-X¹-x©-ô:â ´-ä<©-ü ä¹-`¹-2€èŒ¹-ü鸹-ü:áÔíäÝÿáì¹-éº-ü:áX-äÞý ¤º-Lº-éxº-ü:áÔíäÿᬺ-éغ-ü:áX-äý”½- »-ÌkUH»--öäd»-ìáျ-ÿô¼-8¼-åçäçæááxýâ`0éžá@Ð0éŸá @\ áläP¼-ä8é |¼-¨¼-x©-ô:â ´-ä<©-ü 4½-°¼-2€èܼ-üé½-ü:áîäžÿá<½-éh½-ü:áX-äŸý$À-œ½-ÌkUؽ-î,¾-öäô½-ìáá¾-ÿô ¾-Ⱦ-åçäçæááxýâ`0é£á@Ð0é¤á @^ áläà¾-ä8é ¿-8¿-x©-ô:â ´-ä<©-ü Ä¿-@¿-2€èl¿-ü阿-ü:ápä£ÿáÌ¿-éø¿-ü:áX-ä¤ý´Â-,À-ÌkUhÀ-î¼À-öä„À-ìáá À-ÿô0Á-XÁ-åçäçæááxýâ`0é¨á@Ð0é©á @` áläpÁ-ä8é œÁ-ÈÁ-x©-ô:â ´-ä<©-ü TÂ-ÐÁ-2€èüÁ-üé(Â-ü:áX-ä¨ÿá\Â-éˆÂ-ü:áX-ä©ýDÅ-¼Â-ÌkUøÂ-îLÃ-öäÃ-ìáá0Ã-ÿôÀÃ-èÃ-åçäçæááxýâ`0é­á@Ð0é®á @b álåÄ-ä8é ,Ä-XÄ-x©-ô:â ´-ä<©-ü äÄ-`Ä-2€èŒÄ-üé¸Ä-ü:áLbä­ÿáìÄ-éÅ-ü:áX-ä®ýÔÇ-LÅ-ÌkUˆÅ-îÜÅ-öä¤Å-ìááÀÅ-ÿôPÆ-xÆ-åçäçæááxýâ`0é²á@Ð0é³á @e áläÆ-ä8é ¼Æ-èÆ-x©-ô:â ´-ä<©-ü tÇ-ðÆ-2€èÇ-üéHÇ-ü:á\-ä²ÿá|Ç-é¨Ç-ü:áX-ä³ÿáÜÇ-ÌkUÈ-îlÈ-öä4È-ìááPÈ-ÿôàÈ-É-åçäçæááxýâ`0é·á@Ð0é¸á @i álä É-ä8é LÉ-xÉ-x©-ô:â ´-ä<©-ü Ê-€É-2€è¬É-üéØÉ-ü:á(^-ä·ÿá Ê-é8Ê-ü:áX-ä¸ÿá IätÊ-Ìk I°Ê-äêèÊ-öäÌÊ-ìý\Ë-pË-åçäçæááxýâ`0é†á @TáøäˆË-ä8é ´Ë-àË-Ð-ô:âÀ-äž-ÿàèË-2€èÌ-üé@Ì-ü:áÔíä†ý„Ì-ŒIä|Ì-¼§'æd%ä”Ì-Ìkd%ÐÌ-ÿìäìÌ-ïáÍ-è ˜ÿæÕ-È“ ä4Í-ÌkÈ“ pÍ-äê¨Í-öäŒÍ-ìýÎ-0Î-åçäçæááxýâ`0éá @¸áøäHÎ-ä2€ètÎ-ü8é  Î-xÔ-ÜÎ-ô:âÌÎ-äÏ-ü âÜÎ-æäøÎ-ìýÌkPÌÜÎ-äääPÏ-öÄÏ-ìÏ-åçäçáæááxýâ`0é«áÀðzè¯á€_âŒMä¬Ð-äcâŒMäØÐ-ŠâdâŒMädÑ-ŠâeâŒMäðÑ-ŠâfâŒMä|Ò-ŠâgâŒMäÓ-ŠâhâŒMä”Ó-ŠâjâŒMä Ô-ä>áç¯ÿíðÿ«ááÿÿÿ÷â“æ@ÿä ðÿ¯ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ¯ááÿÿÿ÷âŸå€Àÿäðÿ«ááÿÿÿ÷â•æ@ôéLÔ-ü:áä«ÿá€Ô-2€è¬Ô-üéØÔ-ü:áÔíäÿá#ä Ø#`í-\­ ääzäDbäpí-ÌkDb¬í-ÿìäÈí-ïáäí-è ˜÷î-ì âî-æTâ@î-˜x èŒø-èâpæÌk˜x äî-ä`î-ãá0ï-˜Räpî-@î-˜R¬î-ÿèäèî-äØî-äãî-ì âî- äï-èï-ì âî-ðØî-êXï-, ä@ï-æ, áî-äPâ¬ï-¼. ähï-â @ï-¼. €ï-äLâ âï-æúð-¨0 ä¼ï-â hï-¨0 Ôï-äHâ âäï-æåð-ÿîàð-Ì ä,ð-â ¼ï-Ì Dð-äDâ âTð-æäpð-òŒð-ø¨ð-èTDìÄð-èpø€ï-ìñ-Tuäðð-â ,ð-TuDð-ä@âÌñ-LŠ äñ-â ðð-LŠ 0ñ-ä<â â@ñ-æä\ñ-òxñ-ø”ñ-èLbì°ñ-ÿä€ï-ìôñ-8} äÜñ-âñ-8} è8âò-”[ äò-âÜñ-”[ è4âDò- « ä,ò-âò- « è0âlò-ámäTò-â,ò-ámè,â”ò-<Ó ä|ò-â Tò-<Ó TDä(â¼ò-ð ä¤ò-â|ò-ð è$âäò-0QäÌò-â ¤ò-0QTDä â ó-зäôò-âÌò-зèâHó-tÔäó-â ôò-tÔ4ó-äâ êä„ó-è äXó-â ó-è pó-äâ êä¬ó-4b ä”ó-âXó-4b èâÔó-äÅä¼ó-â”ó-äÅèâüó-Ü9ääó-â¼ó-Ü9èâüõ- £ä ô-â äó- £$ô-äââTô-ˆKèØõ-èâpæÌkˆKä$ô-ätô-ãáDõ-˜Rä„ô-Tô-˜RÀô-ÿèäüô-äìô-äã$ô-ì â$ô- ä(õ-èõ-ì â$ô-ðìô-êlõ-ˆhäTõ-æˆhèâ”õ-œ_ ä|õ-âTõ-œ_ èâÈõ-x@ä¤õ-â |õ-x@¼õ-èæãhtäØõ-â ¤õ-htðõ-èç|ø-Üâä ö-â ô-Üâ$ö-äââTö-Œ¶ èXø-èâpæÌkŒ¶ ä$ö-ätö-ãáD÷-˜Rä„ö-Tö-˜RÀö-ÿèäüö-äìö-äã$ö-ì â$ö- ä(÷-è÷-ì â$ö-ðìö-êx÷-l, äT÷-æl, l÷-èæ ¬÷-`äˆ÷-â T÷-` ÷-èæ à÷-t" ä¼÷-â ˆ÷-t" Ô÷-èæø-Œ_äð÷-â ¼÷-Œ_ø-èæHø-ÐŽä$ø-â ð÷-ÐŽ<ø-èæãPäXø-â $ø-Ppø-èç¤ø-ø äŒø-â ö-ø ð˜x ä´ø-î-æ”› äŒé,ä´$å Üø-Ìk´$áù-ÿìä4ù-ïáPù-è|Jêlù-è|JÿëŸ ä˜ù-\šê¸*á´ù-¤‘!äȃ!äiäÌù-Ìkiú-ÿìä$ú-ïá@ú-ÿåî-ð@jälú-HŠâ4. kä„ú-Œú-â â ¼ú- k.è$.äpæÌk käŒú-äÜú-ãáœû-¼Š äìú-¼ú-¼Š (û- öˆa îäTû-ì!ãŒú-ì€û-èpû-ì âŒú-ÿàLü-8‰ ä¬û-¼ú-8‰ èû- öR îäü-ì!ãŒú-ì0ü-èpû-ÿè ý-˜Rä\ü-¼ú-˜R˜ü-ÿèäÔü-äÄü-äãŒú-ì âŒú- äðü-èpû-øÄü-ê ý-€Oäý-¼ú-€OXý-ÿèä„ý-ì0!ãŒú-øpû-ì"ø.ôO¬.°ý-¼ú-ôOìý-PîPþ-öäþ-ì€âŒú-ì4þ-|W äpû-ðL­ ä ˜êÄþ-ìþ-åçäçæááxýâ|W pû-äná @L­ ˜âoá@fâXYä4ÿ-äfâ XYˆ.¬.äfâ XY0.T.äáõ,ä`ÿ-ü8á@-ä Œÿ-¸ÿ-0-ô:â ,-äô-ü (.Àÿ-éìÿ-ü:á.äný âpû-ê 0. ˜ä\.ü:›äoÿáná˜÷,ôâpû-äØ.\.øápû-ä.üápû-ä0.ü:á.änýèˆ..ø:è´.üâ¼ú-Hð. ÿäìâ4êÿâná˜÷,ôâé€.ü:á.änýP.´.¼ú-ôOð.PîT.öä.ì€âŒú-ì8.|W äpû-ðL­ äð(êÈ.ð.åçäçæááxýâ|W pû-ägá @L­ ð(âhá@gâXYä8.ägâ XY|. .ägâ XYÔ.ø.äáõ,äd.ü8á@-ä .¼.d%-ô:â´1-ä(%-ü .Ä.éð.ü:á.ägÿá $.x*-äP.ü:´*-ähÿágá˜÷,ôâpû-äÌ.P.øápû-äø.üápû-ä$.ü:á.ägýè|.¨.ø:è´.ü4êÿâgá˜÷,ôâé$.ü:á.ägÿáX.¼ú-ôO”.ÿèäÀ.ìãŒú-ìÜ.èpû-øÄü-î kä.Œú-æõ,ì´.Œú-äæ<· äD.Ìk<· €.ÿìä¬.äœ.çá âz-òX-îd.å Ø.Ìkd.á .ðL .öä0 .ìáýÀ .Ô .åçäçæááxýâè#éâ@=âpDäì .ä7é  .¤ .Ð .ôéD .ô .øép .È .øéœ .ü:áîäþ4ÿêé .x .øéL .ü:áîäþ4ëý4ÿêéü .Ä.ø2é( .üéT .üá¼p-ä€ ..øá¼p-ä¬ .üáàm-äØ .è .øáàm-ä .üá8a-ä0 .¼ .ø8á8a-ä \ .ˆ .P~-ô:â@~-äˆ~-ÿà .4êþ4ê¼ý4êþ é@.˜.øél.ü:áîäþ4êþ4ëý. ¸ á.(÷+ä¬ô+ä hl.H,ä$ ,äô¥ ä0.î”mx.L.Ìk”mˆ.äääÜ.öä¤.ìáÀ.ÿôP. Œ.åçäçáæááxýâ`0éaáÀÐ0ébáÀá1éfá €ãáŒMä”.äæáŒMäÀ.ŠâçáŒMäL.ŠâèáŒMìèáŒMäØ.ŠâêáŒMäd.ŠâëáŒMäð.ŠâìáŒMä|.ŠâíáŒMä.ŠâîáŒMä”.ŠâñáŒMä .ä>áçfÿíðÿbááÿÿÿ÷â“æ@ÿäðÿaááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¾æ@ÿä ðÿäÿûâ¨æAÿä ðÿäáðáÿââæ ÿäðÿÿäáâ€ÿñâ,å @ÿãðÿfááÿÿÿ÷â•æ@ÿäðÿäÿûâ•æ@ôéL.ü:áäfýÜ.€.Ìk”m¼.î.öäØ.ìááô.ÿô„.¬.åçäçæááxýâ`0éïá@Ð0éðá @˜áT5äÄ.ä8é ð..,.ô:â.ä€.ü â,.æäH.ìád.ÿôÌk o,.äê¼.ö0.X.åçäçæááxýâ`0é²á@Ð0é³á @‚áøäp.ä2€èœ.ü8é È..ˆ.ô:âô.äL.ü âˆ.æ . .2€è8.üéd.ü:á`ûä²ÿá˜.2€èÄ.üéð.ü:á`ûä³ý |.$.éP.ü:á`ûäïÿá„.é°.ü:á`ûäðý0!.ä.Ìk”m .ît.öä<.ìááX.ÿôè..åçäçæááxýâ`0éôá@Ð0éõá @šáT5ä(.ä8é T.p ..ô:â€.ää.ü â.æä¬.ìáÈ.ÿôÌk\s.äê .ö”.¼.åçäçæááxýâ`0é·á@Ð0é¸á @„áøäÔ.ä2€é.ü8é ,.X.ˆ.ô:âô.äL.ü ä.`.2€èŒ.üé¸.ü:áÔíä·ÿáì.2€è .üéD .ü:áÔíä¸ý Ð .x .é¤ .ü:áÔíäôÿáØ .é!.ü:áÔíäõýÀ#.8!.Ìk”mt!.îÈ!.öä!.ìáá¬!.ÿô<".d".åçäçæááxýâ`0éá@Ð0éá @´ álä|".ä8é ¨".Ô".ˆ.ô:âô.äL.ü 4#.Ü".é#.ü:áäÿá<#.2€èh#.üé”#.ü:áîäý|&.È#.Ìk”m$.îX$.öä $.ìáá<$.ÿôÌ$.ô$.åçäçæááxýâ`0éá@Ð0éá @¶ álä %.ä8é 8%.d%.ˆ.ô:âô.äL.ü ð%.l%.2€è˜%.üéÄ%.ü:áîäÿáø%.2€è$&.üéP&.ü:áîäý8).„&.Ìk”mÀ&.î'.öäÜ&.ìááø&.ÿôˆ'.°'.åçäçæááxýâ`0éá@Ð0éá @¸ áläÈ'.ä8é ô'. (.ˆ.ô:âô.äL.ü ¬(.((.2€èT(.üé€(.ü:ápäÿá´(.2€èà(.üé ).ü:áîäýô+.@).Ìk”m|).îÐ).öä˜).ìáá´).ÿôD*.l*.åçäçæááxýâ`0é#á@Ð0é$á @º álä„*.ä8é °*.Ü*.ˆ.ô:âô.äL.ü h+.ä*.2€è+.üé<+.ü:áX-ä#ÿáp+.2€èœ+.üéÈ+.ü:áîä$ý°..ü+.Ìk”m8,.îŒ,.öäT,.ìááp,.ÿôá -.(-.åçäçæááxýâ`0é(á@Ð0é)á @¼ álä@-.ä8é l-.˜-.ˆ.ô:âô.äL.ü $.. -.2€èÌ-.üéø-.ü:áLbä(ÿá,..2€èX..üé„..ü:áîä)ýl1.¸..Ìk”mô..îH/.öä/.ìáá,/.ÿô¼/.ä/.åçäçæááxýâ`0é-á@Ð0é.á @¿ áläü/.ä8é (0.T0.ˆ.ô:âô.äL.ü à0.\0.2€èˆ0.üé´0.ü:á\-ä-ÿáè0.2€è1.üé@1.ü:áîä.ý(4.t1.Ìk”m°1.î2.öäÌ1.ìááè1.ÿôx2. 2.åçäçæááxýâ`0é2á@Ð0é3á @à álä¸2.ä8é ä2.3.ˆ.ô:âô.äL.ü œ3.3.2€èD3.üép3.ü:á(^-ä2ÿá¤3.2€èÐ3.üéü3.ü:áîä3ýä6.04.Ìk”ml4.îÀ4.öäˆ4.ìáá¤4.ÿô45.\5.åçäçæááxýâ`0é7á@Ð0é8á @Æ álät5.ä8é  5.Ì5.ˆ.ô:âô.äL.ü X6.Ô5.2€é6.üé,6.ü:á`ûä7ÿá`6.2€èŒ6.üé¸6.ü:áîä8ýt9.ì6.Ìk”m(7.î|7.öäD7.ìáá`7.ÿôð7.8.åçäçæááxýâ`0é<á@Ð0é=á @È álä08.ä8é \8.ˆ8..ô:â€.ää.ü è8.8.é¼8.ü:áÔíä<ÿáð8.2€è9.üéH9.ü:áîä=ý<.|9.Ìk”m¸9.î :.öäÔ9.ìááð9.ÿô€:.¨:.åçäçæááxýâ`0éAá@Ð0éBá @Ê áläÀ:.ä8é ì:.;.ˆ.ô:âô.äL.ü x;. ;.éL;.ü:áäAÿá€;.2€è¬;.üéØ;.ü:ápäBýÀ>. <.Ìk”mH<.îœ<.öäd<.ìáá€<.ÿô=.8=.åçäçæááxýâ`0éFá@Ð0éGá @Ì áläP=.ä8é |=.¨=.ˆ.ô:âô.äL.ü 4>.°=.2€èÜ=.üé>.ü:áîäFÿá<>.2€èh>.üé”>.ü:ápäGý|A.È>.Ìk”m?.îX?.öä ?.ìáá ál䤶.ä8é ж.ü¶.ˆ.ô:âô.äL.ü ˆ·.·.2€è0·.üé\·.ü:áîä'ÿá·.2€è¼·.üéè·.ü:á`ûä(ýк.¸.Ìk”mX¸..öät¸.ìáá¸.ÿô ¹.H¹.åçäçæááxýâ`0é,á@Ð0é-á @@ álä`¹.ä8é Œ¹.¸¹.ˆ.ô:âô.äL.ü Dº.À¹.2€èì¹.üéº.ü:ápä,ÿáLº.2€èxº.ü餺.ü:á`ûä-ýŒ½.غ.Ìk”m».îh».öä0».ìááL».ÿôÜ».¼.åçäçæááxýâ`0é1á@Ð0é2á @B álä¼.ä8é H¼.t¼.ˆ.ô:âô.äL.ý ½.|¼.2€è¨¼.üéÔ¼.ü:áX-ä1ÿá½.2€è4½.üé`½.ü:á`ûä2ýHÀ.”½.Ìk”mн.î$¾.öäì½.ìáá¾.ÿô˜¾.À¾.åçäçæááxýâ`0é6á@Ð0é7á @D áläؾ.ä8é ¿.0¿.ˆ.ô:âô.äL.ü ¼¿.8¿.2€èd¿.üé¿.ü:áLbä6ÿáÄ¿.2€èð¿.üéÀ.ü:á`ûä7ýÃ.PÀ.Ìk”mŒÀ.îàÀ.öä¨À.ìááÄÀ.ÿôTÁ.|Á.åçäçæááxýâ`0é;á@Ð0é<á @G álä”Á.ä8é ÀÁ.ìÁ.ˆ.ô:âô.äL.ü xÂ.ôÁ.2€è Â.üéLÂ.ü:á\-ä;ÿá€Â.2€è¬Â.üéØÂ.ü:á`ûä<ýÀÅ. Ã.Ìk”mHÃ.îœÃ.öädÃ.ìáá€Ã.ÿôÄ.8Ä.åçäçæááxýâ`0é@á@Ð0éAá @K áläPÄ.ä8é |Ä.¨Ä.ˆ.ô:âô.äL.ü 4Å.°Ä.2€èÜÄ.üéÅ.ü:á(^-ä@ÿá<Å.2€èhÅ.üé”Å.ü:á`ûäAýPÈ.ÈÅ.Ìk”mÆ.îXÆ.öä Æ.ìáá<Æ.ÿôÌÆ.ôÆ.åçäçæááxýâ`0éEá@Ð0éFá @N álä Ç.ä8é 8Ç.dÇ..ô:â€.ää.ü ÄÇ.lÇ.é˜Ç.ü:áÔíäEÿáÌÇ.2€èøÇ.üé$È.ü:á`ûäFýàÊ.XÈ.Ìk”m”È.îèÈ.öä°È.ìááÌÈ.ÿô\É.„É.åçäçæááxýâ`0éJá@Ð0éKá @P áläœÉ.ä8é ÈÉ.ôÉ..ô:â€.ää.ü €Ê.üÉ.2€è(Ê.üéTÊ.ü:áäJÿáˆÊ.é´Ê.ü:áÔíäKýpÍ.èÊ.Ìk”m$Ë.îxË.öä@Ë.ìáá\Ë.ÿôìË.Ì.åçäçæááxýâ`0éOá@Ð0éPá @R álä,Ì.ä8é XÌ.„Ì..ô:â€.ää.ü Í.ŒÌ.2€è¸Ì.üéäÌ.ü:áîäOÿáÍ.éDÍ.ü:áÔíäPþÐ.xÍ.Ìk”m´Í.îÎ.öäÐÍ.ìááìÍ.ÿô|Î.¤Î.åçäçæááxýâ`0éTá@Ð0éUá @T álä¼Î.ä8é èÎ.Ï..ô:â€.ää.ü  Ï.Ï.2€èHÏ.üétÏ.ü:ápäTÿá¨Ï.éÔÏ.ü:áÔíäUýÒ.Ð.Ìk”mDÐ.î˜Ð.öä`Ð.ìáá|Ð.ÿô Ñ.4Ñ.åçäçæááxýâ`0éYá@Ð0éZá @V áläLÑ.ä8é xÑ.¤Ñ..ô:â€.ää.ü 0Ò.¬Ñ.2€èØÑ.üéÒ.ü:áX-äYÿá8Ò.édÒ.ü:áÔíäZý Õ.˜Ò.Ìk”mÔÒ.î(Ó.öäðÒ.ìáá Ó.ÿôœÓ.ÄÓ.åçäçæááxýâ`0é^á@Ð0é_á @X áläÜÓ.ä8é Ô.4Ô..ô:â€.ää.ü ÀÔ.<Ô.2€èhÔ.üé”Ô.ü:áLbä^ÿáÈÔ.éôÔ.ü:áÔíä_ý°×.(Õ.Ìk”mdÕ.î¸Õ.öä€Õ.ìááœÕ.ÿô,Ö.TÖ.åçäçæááxýâ`0écá@Ð0édá @[ álälÖ.ä8é ˜Ö.ÄÖ..ô:â€.ää.ü P×.ÌÖ.2€èøÖ.üé$×.ü:á\-äcÿáX×.é„×.ü:áÔíädý@Ú.¸×.Ìk”mô×.îHØ.öäØ.ìáá,Ø.ÿô¼Ø.äØ.åçäçæááxýâ`0éhá@Ð0éiá @_ áläüØ.ä8é (Ù.TÙ..ô:â€.ää.ü àÙ.\Ù.2€èˆÙ.üé´Ù.ü:á(^-ähÿáèÙ.éÚ.ü:áÔíäiýÐÜ.HÚ.Ìk”m„Ú.îØÚ.öä Ú.ìáá¼Ú.ÿôLÛ.tÛ.åçäçæááxýâ`0émá@Ð0éná @b áläŒÛ.ä8é ¸Û.äÛ..ô:â€.ää.ü pÜ.ìÛ.2€èÜ.üéDÜ.ü:á`ûämÿáxÜ.é¤Ü.ü:áÔíäný`ß.ØÜ.Ìk”mÝ.îhÝ.öä0Ý.ìááLÝ.ÿôÜÝ.Þ.åçäçæááxýâ`0érá@Ð0ésá @d áläÞ.ä8é HÞ.tÞ.ˆ.ô:âô.äL.ý ß.|Þ.2€è¨Þ.üéÔÞ.ü:áîärÿáß.é4ß.ü:áäsýðá.hß.Ìk”m¤ß.îøß.öäÀß.ìááÜß.ÿôlà.”à.åçäçæááxýâ`0éwá@Ð0éxá @f álä¬à.ä8é Øà.á.ˆ.ô:âô.äL.ü á. á.2€è8á.üédá.ü:ápäwÿá˜á.éÄá.ü:áäxý€ä.øá.Ìk”m4â.îˆâ.öäPâ.ìáálâ.ÿôüâ.$ã.åçäçæááxýâ`0é|á@Ð0é}á @h álä<ã.ä8é hã.”ã.ˆ.ô:âô.äL.ü ä.œã.2€èÈã.üéôã.ü:áX-ä|ÿá(ä.éTä.ü:áä}ýç.ˆä.Ìk”mÄä.îå.öäàä.ìááüä.ÿôŒå.´å.åçäçæááxýâ`0éá@Ð0é‚á @j áläÌå.ä8é øå.$æ.ˆ.ô:âô.äL.ü °æ.,æ.2€èXæ.ü鄿.ü:áLbäÿá¸æ.éäæ.ü:áä‚ý é.ç.Ìk”mTç.î¨ç.öäpç.ìááŒç.ÿôè.Dè.åçäçæááxýâ`0é†á@Ð0é‡á @m álä\è.ä8é ˆè.´è.ˆ.ô:âô.äL.ü @é.¼è.2€èèè.üéé.ü:á\-ä†ÿáHé.été.ü:áä‡ý0ì.¨é.Ìk”mäé.î8ê.öåê.ìááê.ÿô¬ê.Ôê.åçäçæááxýâ`0é‹á@Ð0éŒá @q áläìê.ä8é ë.Dë.ˆ.ô:âô.äL.ü Ðë.Lë.2€èxë.üé¤ë.ü:á(^-ä‹ÿáØë.éì.ü:áäŒýÀî.8ì.Ìk”mtì.îÈì.öäì.ìáá¬ì.ÿô<í.dí.åçäçæááxýâ`0éá@Ð0é‘á @t álä|í.ä8é ¨í.Ôí.ˆ.ô:âô.äL.ü `î.Üí.2€èî.üé4î.ü:á`ûäÿáhî.é”î.ü:áä‘ÿáÈî.Ìk”mï.îXï.öä ï.ìáá<ï.ÿôÌï.ôï.åçäçæááxýâ`0é•á@Ð0é–á @v álä ð.ä8é 8ð.dð..ô:â€.ää.ü Äð.lð.é˜ð.ü:áÔíä•ÿáÌð.2€èøð.üé$ñ.ü:áä–ÿáœÏÔñ.`ñ.ÌkœÏœñ.æÿää¸ñ.ïýìõ.Üñ.ÌkœÏò.îPò.öä4ò.ìáýÄò.Øò.åçäçæááxýâ`0éAá @¼áT5äðò.ä8é ó.Œõ.Xó.ô:âHó.äó.ü âXó.æätó.ìáýÌk+ Xó.äêÌó.ö@ô.Tô.åçäçæááxýâ`0éá @¦áøälô.ä2€è˜ô.ü8éÄô.áõ.œñ.ô:âðô.ä`ñ.ü âœñ.êõ.2€è4õ.üé`õ.ü:á`ûäÿá”õ.éÀõ.ü:á`ûäAýôù.ôõ.ÌkœÏ0ö.îhö.öäLö.ìáýÜö.ðö.åçäçæááxýâ`0éEá @¾áT5ä÷.ä8é 4÷.”ù.p÷.ô:â`÷.ä¨÷.ü âp÷.æäŒ÷.ìáýÌk. p÷.äêä÷.öXø.lø.åçäçæááxýâ`0éá @¬áøä„ø.ä2€è°ø.ü8é Üø.ù.œñ.ô:âðô.ä`ñ.ÿàù.2€è<ù.üéhù.ü:áÔíäÿáœù.éÈù.ü:áÔíäEýôû.üù.ÌkœÏ8ú.îpú.öäTú.ìáýäú.øú.åçäçæááxýâ`0é"á @¬ áläû.ä8é <û.hû.œñ.ô:âðô.ä`ñ.ÿàpû.2€èœû.üéÈû.ü:áîä"ýôý.üû.ÌkœÏ8ü.îpü.öäTü.ìáýäü.øü.åçäçæááxýâ`0é&á @® áläý.ä8é <ý.hý.œñ.ô:âðô.ä`ñ.ÿàpý.2€èœý.üéÈý.ü:ápä&ýôÿ.üý.ÌkœÏ8þ.îpþ.öäTþ.ìáýäþ.øþ.åçäçæááxýâ`0é*á @° áläÿ.ä8é <ÿ.hÿ.œñ.ô:âðô.ä`ñ.ÿàpÿ.2€èœÿ.üéÈÿ.ü:áX-ä*ýô/üÿ.ÌkœÏ8/îp/öäT/ìáýä/ø/åçäçæááxýâ`0é.á @² álä/ä8é </h/œñ.ô:âðô.ä`ñ.ÿàp/2€èœ/üéÈ/ü:áLbä.ýô/ü/ÌkœÏ8/îp/öäT/ìáýä/ø/åçäçæááxýâ`0é2á @µ álä/ä8é </h/œñ.ô:âðô.ä`ñ.ÿàp/2€èœ/üéÈ/ü:á\-ä2ÿáü/ÌkœÏ8/îp/öäT/ìáýä/ø/åçäçæááxýâ`0é6á @¹ álä/ä8é </h/œñ.ô:âðô.ä`ñ.ÿàp/2€èœ/üéÈ/ü:á(^-ä6ý/Ð2å/À˜êlœä /ælœ8/èâÌkP/ä$Óä h/P98/ì /”x 8/èÅ8½ ä/˜/âäð/½ è(v8èpä{6è@v8ä w8蔼8$Ìk½ ä˜/ä/*ãá(/½ ä /˜/âT/´Þ ä8/D/æ ì€/äd/p/æ äæÔ/ |ä/œ/æ â X¹¬/À/äD/êâp/é/˜:ää/ð/æ äæ,/ô ä//æ äæh/Øä</H/æ â X/Ø äæ¤/ÔÏäx/„/æ â ”/ÔÏ äæà/|rä´/À/æ â Ð/|r äæ /€×äð/ü/æ â  /€× äæX /€ø ä, /8 /æ â H /€ø äæ” /Øäh /t /æ â „ /Ø äæŒ /„§ä¤ /¬ /âä /„§èL /èápä˜/Ê/èðì /ð/„§ä¬ /ä$ /ãá< /„§ä4 /¬ /â¼ /P¤äL /â t /P¤d /è ⬠/æâŒ /@Eád /èâ ¤ /ôàd /èæ4áœ/èÌ /@Eå t /Ü /ôàäŒ /ä4å¤ / /øL /æ< /øt /æd /øŒ /æü¤ /æÔ/Äñäœ /¤ /âäü /ÄñèÈ/èpä¬ /Ê/èä/è/ð/Äñä¤ /ä /ãá4 /Äñä, /¤ /â"¸/> /D /ü />€ /ÿèä¬ /쀀⤠/êØ /|W äÈ /ê ⤠/ä /`0åô /ê âœ/ èÐ0åô /êô /( /ü />d /ÿèä /쀀⤠/ê¬ /|W äÈ /êØ /`0åÈ /ê âD/ èÐ0åô /îü /ü />8/ÿèäd/쀀⤠/ê€/|W äÈ /êœ/`0åô /îÐ0åÈ /êà/€;äÈ/å€;ð/ìôOt/ð/ü /ôO,/ÿèäX/ì€â¤ /î|W äÈ /ð|/ü /ôO¸/ÿèää/ì€â¤ /ë/|W äÈ /ðè#åð/ìø/ä|/îâP/ò:öýÿí€;ä(öýÿíè#å)ö{ö}ö\/äð/îâ,/ò{ö}öà/äü /îâ/ò{öùÿõDõýÿí€;ä(öýÿí`0å.öýÿí„: ä,öýÿíÐ0å)ö;öùÿõ}öd/ä( /îâ/ò{öùÿõDõýÿí€;ä(öýÿí`0å,öýÿíÐ0å.öýÿí„: ä)ö;öùÿõ}þD /îâ˜/ò{öùÿõDõýÿí€;ä(öýÿí`0å.öýÿí„: ä,öýÿíÐ0å.öýÿí„: ä)ö;öùÿõ}öŒ/ø@/æ â àG'P/d/äœ/èx/âœ/ìî´/øD /æÜ/ø( /æ/øü /æ,/øÈ/æT/øð/æ|/ø|/æü¤/æ˜/ðHùÌP8¨ ää/ð/æ âá/P8ä X/ÔH ´:7äP.7èpäÔÇ5èÈ:7ä;7èˆC88ÌkÔH å/äx/Bãá/ÔH äˆ/á/âhs6“ ä /¬/æâô/ôpèò¿5ä(s6èÌkðB ä¬/ä/ãá,/ä$/¬/âŒ/´)ä</D/ââô/\/ä´)ã t/ÄßD/ëãœ{D/èœ/Äßä \/¬/œ{ä t/àl6¸˜ä¼/Ä/â â /¸˜Ìl6äT/èápèBÁ5Þ/äèô/¸˜äÄ/ä,/ãáD/¸˜ä</Ä/âà¾5@EåT/â|/@Eál/äâ âÄ/ææôà”/äââÜ/Lè$/èBpè/ä̾5èÌkÔ=ä”/äü/ãá/Lä /”/â</ì;å$/åì;ál/è"àº5ôO º5L/Ü/ôO€¹5Hÿæ/æÌ/ôOи5ÿèÌkLäì/ä@¸5ãáäÌ/LèD/èBpä¬4/è |/”/”/è ¤2/ åì;á\/è âl/æ ðææ4Öä@6/ì{öùÿõDõ(öýÿí4Öä-öÿÿìæ)ö/öýÿí`ä+öÿÿìæ;öùÿõ}ö À@/„öÿÿô)öùÿõ(ö(öýÿíœä*ö)öOõ)örõýÿí”jå(öýÿí,Ôä,öýÿí´)å,ö[õ)ö;öùÿõ}ö 3ô@/ A/îµá˜X3ö¤¶ ð $5/ø¸áHA/âÿèätA/ì€âD5/<êA/|W ä =/ì|X3àä¬A/ìäB/lÔ è873èpä,D/v5/èäx73è G3$5/lÔ ä¬A/ä$B/ ãáöÿÿô)öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí… ä,öýÿí¨$å,öýÿí„: ä)ö;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿí„: ä+öýÿí´)å;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí ä(öýÿíä&å)ö;öùÿõýÿí“ ävõýÿí,Ôäbõýÿí|rä(öýÿí… ä-öýÿí„: ä)ö;öùÿõDõýÿí„: ä;öùÿõ}ö Ài/Hb/xb/îGâc/ò`b/öÿÿô)öùÿõvõýÿíx†ävõýÿ팊ä(öýÿíзä+öÿÿìæ,öýÿí¨$å,öýÿíзä)ö;öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí ä(öýÿí“ ävõýÿí… ä(ö)ö+öqõýÿí“ ävõýÿí,Ôä)ö;öùÿõDõýÿíзä;öùÿõ}ö /ôi/$j/îáöýÿí,)åhõýÿí“ ävõýÿí,Ôä>öýÿí,)å-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿíìœ/â)ö;öùÿõùÿõ;õ(öýÿí“ ävõýÿí,Ôä+öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõýÿí|räýÿí\‚ä=öýÿí|rä(öýÿí¨$å-öýÿíзä)ö;öùÿõ!õýÿí |ä*öýÿíTåä=ö&öýÿí`0å;öùÿõ;õ(öýÿí´)å>öýÿí\‚ä)öùÿõ{öùÿõýÿí¤Ìäýÿíˆ'å;öùÿõ@õ(öýÿíˆ'å=öýÿí¨$å;öýÿí´)å>öýÿí\‚ä;öpõýÿíˆ'å,öqõýÿí´)å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,öýÿí`0å)ö;öùÿõ@õ(öýÿí¤Ìäýÿí(å=öýÿíзä;öýÿí(å<öýÿí¨$å;öpõýÿí(å,öpõýÿíˆ'å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿí(å)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí¤Ìäýÿíä&å=öýÿí¨$å-öýÿí´)å;öùÿõ@õ(öýÿí¤Ìäýÿíˆ'å=öýÿí¨$å;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõ;õ(öýÿí¨$å-ö(öýÿí\‚ä-öýÿí´)å)ölõýÿíTåäiõýÿíTåä<öýÿí¨$å)öùÿõýÿíTåäaõýÿí´)å;öùÿõvõýÿíx†ävõýÿíÜä(öýÿíзä,öýÿíзä+ö(öýÿí\‚ä-öýÿí´)å)ö,öýÿí¨$å)ö;öùÿõ}öùÿõvõýÿíx†ävõýÿí¸ì ä(öýÿíзä,öýÿí´)å,ö*öýÿíTåä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíà–ä<öýÿí |ä,öýÿíô ä>öýÿíÄä(öýÿí“ ävõýÿíÀÑ ä(ö)ö)ö;öùÿõýÿí|räýÿíT™ä=öýÿí“ ävõýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí“ ävõýÿí+å(ö)ökõÿÿô?öýÿí“ ävõýÿí+å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí,)å/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí,)å;öùÿõýÿíÄä.öýÿí… ä(ö)ö=öýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿîrä)ö;öùÿõýÿíÄä.öýÿí+å(ö)ö=öýÿîrä;öùÿõýÿí¤Ìäýÿíˆ'å=öýÿíÄä.öýÿí… ä(ö)ö;öùÿõýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõ@õ(ö;öýÿíä&å<öýÿíзä;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõ@õ(ö;öýÿí´)å>öÿÿô;öpõýÿíˆ'å,öqõýÿí´)å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,öýÿí`0å)ö;öùÿõ@õ(ö;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõýÿíÄä.öýÿíˆpä(ö*öOõ)ö;öùÿõ}öùÿõ}ö&vector::insert length errorˆ¡/öýÿí4Öä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí`Í/â)ö;öùÿõùÿõýÿíà–ä<öýÿí |ä,öýÿíô ä>öýÿíÄä(öýÿí“ ävõýÿíÀÑ ä(ö)ö)ö;öùÿõýÿíÄä.öýÿí… ä(ö)ö=öýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿíÄä.öýÿí+å(ö)ö=öýÿí´)å;öùÿõýÿí¤Ìäýÿíˆ'å=öýÿíÄä.öýÿí… ä(ö)ö;öùÿõýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõ@õ(ö;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõýÿíÄä.öýÿíˆpä(ö*öOõ)ö;öùÿõ}öùÿõ}övector::reserve length errorã pÏ/´Í/äÍ/î âhÎ/òÌÍ/öýÿí¤ ä(ö)ö)öùÿõýÿíHôä(öýÿíp ä(ö)ö,öýÿíŒ0ä-öýÿí¤ ä(ö)ö,öýÿífä)ö;öùÿõ<õ;õ(öýÿíŒ0ä<öýÿí¤ ä(ö)ö)öùÿõýÿíœêä(öýÿíÌ' ä(ö)ö+öýÿíŒ0ä,öýÿíp ä(ö)ö)ö;öùÿõ}ö tÝ/”×/Ä×/î6âdØ/ò¬×/öýÿí¤ ä(ö)ö)öùÿõýÿíHôä(öýÿíp ä(ö)ö,öýÿíŒ0ä-öýÿí¤ ä(ö)ö,öýÿí |ä(ö)ö)ö;öùÿõ<õ;õ(öýÿíŒ0ä<öýÿí¤ ä(ö)ö)öùÿõýÿíœêä(öýÿíÌ' ä(ö)ö+öýÿíŒ0ä,öýÿíp ä(ö)ö)ö;öùÿõ}ö Äß/¨Ý/ØÝ/îâ\Þ/òÀÝ/öÿÿô;öqõýÿí´)å,öpõýÿíä&å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíä&å,öýÿíx.å)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíŒ 0â)ö;öùÿõùÿõùÿõýÿí,X ä(ö)ö;öùÿõ;õ(öýÿí“ ävõýÿí… ä(ö)ö)öùÿõ{öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí“ ävõýÿí… ä(ö)ö,öýÿí“ ävõýÿí+å(ö)ö)ö;öùÿõýÿí“ ävõýÿí… ä(ö)ö=öÿÿô;öùÿõýÿí“ ävõýÿí+å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí“ ävõýÿí… ä(ö)ö=öýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿí“ ävõýÿí+å(ö)ö=öýÿí´)å;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öýÿí´)å>öÿÿô;öqõýÿí´)å,öpõýÿíä&å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíä&å,öýÿíx.å)ö;öùÿõ}öùÿõ}ö&vector::assign length error 0Ü 0 0î$⬠0òô 0¬0âÿèäØ0ì€âS/%êô0|W äˆT/ì0´)åàj/ðfäk/ê{öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí40â)ö;öùÿõùÿõýÿí“ ävõýÿí… ä(ö)ö=öýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿí“ ävõýÿí+å(ö)ö=öýÿí´)å;öùÿõýÿí¤Ìäýÿí¨$å=öýÿí“ ävõýÿí… ä(ö)ö+öýÿí´)å;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíä&å,öýÿífä)ö;öùÿõ}öùÿõ}övector length errord0|0¬0î!âL0ò”0ä(öýÿí`0å.öýÿíÌ' ä(ö)ö,öýÿí`0å.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö X!0˜0È0îâÀ0ò°0ä(öýÿí´)å,öýÿífä)ö;öùÿõ}ö €#0Œ!0¼!0î âx"0ò¤!0ä(öýÿí´)å,öýÿífä)ö;öùÿõ}ö ¼%0´#0ä#0î â„$0òÌ#0ä(öýÿí´)å,öýÿí |ä(ö)ö)ö;öùÿõ}ö ¸'0ð%0 &0î âà&0ò&00t;´=0=0T+0t;P=0âÿèä|=0ää+0䀀âü*0ê˜=0|W äH.0î´)å˜,0ð¼=0T+0t;ø=0âÿèä$>0ä¨+0ä€âü*0ê@>0|W äH.0ð´)å˜,0ì"|?0 Úð>0l>0T+0 Ú¨>0ÿèäÔ>0ä¨+0ä€âü*0î|W äH.0ðø>0T+0 Ú4?0ÿèä`?0ää+0䀀âü*0î|W äH.0ê"œ@0°’ @0Œ?0T+0°’ È?0ÿèäô?0ä¨+0ä€âü*0î|W äH.0ð@0T+0°’ T@0ÿèä€@0ää+0䀀âü*0î|W äH.0êLA0ü„ä¬@0T+0ü„è@0ÿèäA0ì€âü*0ê0A0|W äH.0ð`0åŒ00êàA0ôw ä\A0T+0ôw ˜A0ÿèäÄA0ì€âü*0î|W äH.0ì"ŒC0Hô¬B0ðA0T+0Hô,B0ÿèäXB0ä ,0ä€âü*0 êtB0|W äH.0ìB0зä ,0ð`0åŒ00î´B0T+0HôðB0âÿèäC0ì€âü*0!ê8C0|W äH.0ìTC0зä ,0ìpC0´)å˜,0ð`0åŒ00ëE0œêÜM0”J0T+0œ>ÐJ0âî|K0䈎îäüJ0ìâü*0ìK0|W äH.0ìDK0„: ä4K0ì æä`K0… ä4K0ð 7ä,Žì.+0äÌK0â„8)œ>âäK0ü”J0öôã âì{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}öàV0äM0T+0œ> N0âîÌN0äLîäLN0ìâü*0ìhN0|W äH.0ì”N0„: ä„N0ì æä°N0… ä„N0ð 7äàŒì.+0äO0â|K0œ>Qâ4O0üäM0ö, âì{öùÿõýÿí,Ôä=öýÿí+å(ö)ö=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí,Ôä>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíÌV0â)ö;öùÿõùÿõ;õ(öýÿí,Ôä>öÿÿô)öùÿõ{öùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí,Ôä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿí… ä(ö)ö)ö;öùÿõ}öùÿõ}övector length erroräèV0T+0œ>$W0âÿèäPW0ì€âü*0/êlW0|W äH.0ìˆW0´)å˜,0ðfäŒ00êØi0´Bt[0´W0T+0´BðW0âîœX0äÌîäX0ìâü*0ì8X0|W äH.0ìdX0„: äTX0ì æä€X0… äTX0ð 7ä,Žì.+0äìX0âÌN0´BâY0ü´W0öôã âì{öùÿõýÿí,X ä(ö)ö;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}ú|[0T+0´B¸[0âîd\0ähîää[0ìâü*0í\0|W äH.0ì,\0„: ä\0ì æäH\0… ä\0ð 7äàŒì.+0ä´\0âœX0´BŠâÌ\0ü|[0ö, âì{öùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí´)å>öýÿí4Öä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí¼i0â)ö;öùÿõùÿõýÿí,X ä(ö)ö;öùÿõ;õ(öýÿí… ä(ö)ö)öùÿõ{öùÿõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí… ä(ö)ö,öýÿí+å(ö)ö)ö;öùÿõýÿí… ä(ö)ö=öÿÿô;öùÿõýÿí+å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿí+å(ö)ö=öýÿí´)å;öùÿõ}öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿí… ä(ö)ö)ö;öùÿõýÿí,Ôä=öýÿí´)å;öùÿõ}ö:vector::assign length errorT0üW”p0èi0T+0üW$j0âîìj0䌌îäPj0ìâü*0ìlj0|W äH.0ìˆj0зä ,0ì´j0„: ä¤j0ì æäÐj0… ä¤j0ð 7ä,Žì.+0äöýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿíœä<öýÿíö&öýÿí¸_ä=öýÿíxÃä;öùÿõýÿíüWä(öýÿíзä,öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}úœp0T+0üWØp0âî q0äÜŒîäq0ìâü*0ì q0|W äH.0ìöýÿí,)åhõýÿí,Ôä>öýÿí,)å-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿí80â)ö;öùÿõùÿõ;õ(öýÿí,Ôä+öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõýÿí|räýÿí,ä=öýÿí|rä(öýÿí¨$å-öýÿíзä)ö;öùÿõ;õ(öýÿí,ä>öÿÿô)öùÿõvõýÿíx†ävõýÿíÜä(öýÿíзä,öýÿí¨$å,öýÿí¨$å+öýÿí´)å)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíзä)ö;öùÿõýÿí,Ôäaõýÿí´)å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿíзä-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí€ø äýÿí\m ä=öýÿí… ä(ö)ö;öùÿõýÿí|räýÿíT™ä=öýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí+å(ö)ökõÿÿô?öýÿí+å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí,)å/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí,)å;öùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿîrä)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõ{öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí\m ä,öýÿí\m ä+öýÿíàä,öýÿí… ä(ö)ö)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí\m ä+öýÿíàä,öýÿí\m ä+öýÿí,Ôä,öýÿí… ä(ö)ö+öýÿíàä+öýÿí´)å)ö;öùÿõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí\m ä,öýÿí+å(ö)ö)ö;öùÿõ}öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿí… ä(ö)ö+öýÿíàä)ö;öùÿõýÿí,Ôä=öýÿíT™ä;öùÿõýÿí+å(ö)ö=öýÿîrä;öùÿõ}öùÿõ}övector::insert length errorä4¦äd0T+04¦ 0âÿèäÌ0쀀âü*00î|W äH.0ë‘0öÿÿô)öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí… ä,öýÿí¨$å,öýÿí„: ä)ö;öùÿõýÿí,Ôäbõýÿí|rä(öýÿí… ä-öýÿí„: ä)ö;öùÿõDõýÿí„: ä;öùÿõ}ö ¸£0xž0œC0î6⨞0òž0öÿÿô)öùÿõvõýÿíx†ävõýÿ팊ä(öýÿíзä+öÿÿìæ,öýÿí¨$å,öýÿíзä)ö;öùÿõqõýÿí,Ôä;öùÿõDõýÿíзä;öùÿõ}ö ÐÃ0ì£0´B0îQá¤0ò¤0öýÿí,)åhõýÿí,Ôä>öýÿí,)å-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿí´Ã0â)ö;öùÿõùÿõ;õ(öýÿí,Ôä+öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõýÿí|räýÿí\‚ä=öýÿí|rä(öýÿí¨$å-öýÿíзä)ö;öùÿõ!õýÿí |ä*öýÿíTåä=ö&öýÿí`0å;öùÿõ;õ(öýÿí¨$å-ö(öýÿí\‚ä-öýÿí´)å)ölõýÿíTåäiõýÿíTåä<öýÿí¨$å)öùÿõýÿíTåäaõýÿí´)å;öùÿõ;õ(öýÿí\‚ä>öÿÿô)öùÿõvõýÿíx†ävõýÿíÜä(öýÿíзä,öýÿí¨$å,öýÿí¨$å+öýÿí´)å)ö;öùÿõvõýÿíx†ävõýÿí¸ì ä(öýÿíзä,öýÿí´)å,ö*öýÿíTåä)ö;öùÿõýÿí,Ôäaõýÿí´)å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿíзä-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí€ø äýÿí\m ä=öýÿí… ä(ö)ö;öùÿõýÿí|räýÿíT™ä=öýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí+å(ö)ökõÿÿô?öýÿí+å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí,)å/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí,)å;öùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿîrä)ö;öùÿõvõýÿíx†ävõýÿí¸ì ä(öýÿí… ä(ö)ö+öýÿíàä,öýÿí´)å,öýÿí`0å)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõ{öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí\m ä,öýÿí\m ä+öýÿíàä,öýÿí… ä(ö)ö)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí\m ä+öýÿíàä,öýÿí\m ä+öýÿí,Ôä,öýÿí… ä(ö)ö+öýÿíàä+öýÿí´)å)ö;öùÿõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí\m ä,öýÿí+å(ö)ö)ö;öùÿõ}öùÿõýÿí,Ôä=öýÿíT™ä;öùÿõýÿí+å(ö)ö=öýÿîrä;öùÿõ}öùÿõ}ö&vector::insert length errordÇ0Ä0ðA0î"â4Ä0òÄ00î âhÎ0òPÎ00î â¼Ï0ò¤Ï0öýÿí+å(ö)ö)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíøä0â)ö;öùÿõùÿõýÿí€ø äýÿí\m ä=öýÿí… ä(ö)ö;öùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõ{öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí\m ä,öýÿí\m ä+öýÿí,Ôä,öýÿí… ä(ö)ö)ö;öùÿõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí\m ä,öýÿí+å(ö)ö)ö;öùÿõ}öùÿõýÿí+å(ö)ö=öýÿí´)å;öùÿõ}öùÿõ}övector::reserve length errorã Tæ0Lå0x:0î â|å0òdå0öýÿí¤ ä(ö)ö)öùÿõýÿíHôä(öýÿíp ä(ö)ö,öýÿíŒ0ä-öýÿí¤ ä(ö)ö,öýÿíè#å)ö;öùÿõ<õ;õ(öýÿíŒ0ä<öýÿí¤ ä(ö)ö)öùÿõýÿíœêä(öýÿíÌ' ä(ö)ö+öýÿíŒ0ä,öýÿíp ä(ö)ö)ö;öùÿõ}ö pî0í0p80î â8í0ò í0öýÿí4Öä(ö)ö)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí`1â)ö;öùÿõùÿõýÿí,X ä(ö)ö;öùÿõ;õ(öýÿí… ä(ö)ö)öùÿõ{öùÿõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí… ä(ö)ö,öýÿí+å(ö)ö)ö;öùÿõýÿí… ä(ö)ö=öÿÿô;öùÿõýÿí+å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿí+å(ö)ö=öýÿí´)å;öùÿõ}öùÿõvõýÿíx†ävõýÿí¸ì ä(öýÿí… ä(ö)ö,öýÿí´)å,öýÿíx.å)ö;öùÿõýÿí,Ôä=öýÿí´)å;öùÿõ}ö&vector::assign length error@1°1ø20î$âà1òÈ1öÿÿô)öùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí1â)ö;öùÿõùÿõýÿí… ä(ö)ö=öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿí+å(ö)ö=öýÿí,Ôä=öýÿí´)å;öùÿõvõýÿíx†ävõýÿí¸ì ä(öýÿí… ä(ö)ö,öýÿí´)å,öýÿífä)ö;öùÿõ}öùÿõ}övector length errorè1P1¤10î/â€1òh1ä(öýÿí`0å.öýÿíÌ' ä(ö)ö,öýÿí`0å.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö 411¤00îâL1ò41ä(öýÿí´)å,öýÿífä)ö;öùÿõ}ö P1h1Ð/0îâ˜1ò€1ä(öýÿí´)å,öýÿífä)ö;öùÿõ}ö œ1„1(/0îâ´1òœ1ä(öýÿí´)å,öýÿí |ä(ö)ö)ö;öùÿõ}ö ("1Ð1`.0îã 1òè10æH51øø>0æp51øŒ?0æ˜51ø@0æÀ51ø¬@0æè51ø\A0æ61øðA0æ861ø´B0æ`61øœC0æˆ61øDD0æ°61øE0æØ61øÀE0æá71øTF0æ(71ø¤F0æP71ø¼F0æx71øG0æ 71ø G0æÈ71ø4H0æð71øÐH0æ81ødI0æ@81ùJ0æh81øèV0æüd0æäè81œôæ̸èЉ2ä$Š2äÔ¾2¿2*Ìkœä81ä91)ãá 91œä9181âø91“ ä091<91æ â è(0L91p91ä`91è ì”91â„91è äêá¨91èIêÔ91fôâ ⤲ä91è`91èœ:1ˆ ä:1:1æ â $:1ô â è(04:1H:1ä`91è\:1â„91ìáp:1èIêÔ91fôâØ:1Øä¬:1¸:1æ â È:1Ø äæ;1ÔÏäè:1ô:1æ â ;1ÔÏ äæP;1|rä$;10;1æ â @;1|r äæŒ;1€×ä`;1l;1æ â |;1€× 俍;1 |äœ;1`91æÄ;1ô ä¸;1|;1ç<1€ø äÔ;1à;1æ â ð;1€ø äæ<<1Øä<1<1æ â ,<1Ø äæ<1¤ÌäL<1X<1æ â ˆ•h<1|<1ä81ìâà;1èä<1Ìõ ä <1¬<1æ â ˆ•¼<1Ð<1ä81ìâ<1è"$>1ðˆ=1ô<1è81ð0=1ÿèä\=1äà;1ä€â81ææä&åx=1ê âX<1 è=1è81ðÌ=1ÿèäø=1ä<1ä€â81ææä&å>1ê â¬<1 ä"¬?1Lmô>14>1è81Lmp>1ÿèäœ>1äX<1ä€â81êÈ>1|W ä¸>1ì â81è„+åä>1ê âà;1 èü>1è81Lm8?1ÿèäd?1ä¬<1䀀â81ê€?1|W ä¸>1î„+åœ?1ê â<1 äì?1øÜ ä¼?1È?1æ â@Ø?1èX<1è,@1”©äü?1@1æ â@@1è¬<1è"Tk2ôOÀ@1<@1è81ôOx@1ÿèä¤@1ì€â81î|W ä¸>1ìxA1È@1è81ôOA1Pÿèä0A1ì€â81êLA1|W ä¸>1ðÄ"åhA1ê â,<1 ä B1€A1è81ôO¼A1PÿèäèA1ì€â81êB1|W ä¸>1ð´)å0;1ìôB1(B1è81ôOdB1ÿèäB1ì€â81ê¬B1|W ä¸>1ìÈB1´)å0;1ðfääB1ê â`91 äÔC1üB1è81ôO8C1ÿèädC1ì€â81 ê€C1|W ä¸>1ìœC1´)å0;1ì¸C1fääB1îÄ"åhA1êÌf2ÜC1è81ôOD1ë¨D1ä|ÅîäDD1ìâ81ì`D1|W ä¸>1ìŒD1„: ä|D1ì æè… ä|D1ìÂ81äøD1â°G1ôOâE1üÜC1öôã âì{öýÿí“ ävõýÿí$ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}öJS/åH1â p}1üW-áH1ül|1ö, âì{öùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí´)åjõÿÿô)öùÿõDõ;öùÿõ!õýÿí|räýÿí,)å=öýÿí0 ä(ö)ö;öùÿõ;õ(öýÿí´)å>öýÿí,)åhõýÿí“ ävõýÿí,Ôä>öýÿí,)å-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿíP|1â)ö;öùÿõùÿõ;õ(öýÿí“ ävõýÿí,Ôä+öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí|räýÿí\‚ä=öýÿí“ ävõýÿí,Ôä-öXõ<öýÿí|rä>ö(öýÿíзä-öýÿíÌ' ä(ö)ö)ö;öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõ;õ(öýÿí´)å>öýÿí\‚ä)öùÿõ{öùÿõýÿí, äýÿíØ< ä=öýÿí„: ä;öùÿõvõýÿíx†ävõýÿí,‚ä(öýÿíØ< ä,öXõ<öýÿí€×ä>ö(öýÿí\‚ä)ö)ö;öùÿõýÿí¤Ìäýÿíˆ'å=öýÿí¨$å;öùÿõ@õ(öýÿí, äýÿíä&å=öýÿíØ< ä;öýÿíä&åkõýÿí… ä;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõ@õ(öýÿí¤Ìäýÿí(å=öýÿíзä;öýÿí(å<öýÿí¨$å;öpõýÿí(å,öpõýÿíˆ'å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿí(å)ö;öùÿõýÿí… ä=öýÿíØ< ä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí¤Ìäýÿíä&å=öýÿí¨$å-öýÿí´)å;öùÿõ@õ(öýÿí¤Ìäýÿíˆ'å=öýÿí¨$å;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõvõýÿíx†ävõýÿíÜä(öýÿíзä,öýÿíзä+ö(öýÿí\‚ä-öýÿí´)å)ö,öýÿí¨$å)ö;öùÿõ}öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíзä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíà–ä<öýÿí |ä,öýÿíô ä>öýÿíÄä(öýÿí“ ävõýÿíÀÑ ä(ö)ö)ö;öùÿõýÿí|räýÿíT™ä=öýÿí“ ävõýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí“ ävõýÿí+å(ö)ökõÿÿô?öýÿí“ ävõýÿí+å(ö)ö:öÿÿìæ;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí,)å/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí,)å;öùÿõýÿíÄä.öýÿí… ä(ö)ö=öýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿîrä)ö;öùÿõýÿíÄä.öýÿí+å(ö)ö=öýÿîrä;öùÿõýÿí¤Ìäýÿíˆ'å=öýÿíÄä.öýÿí… ä(ö)ö;öùÿõýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öùÿõýÿí¤Ìäýÿí¨$å=öýÿíp ä(ö)ö;öùÿõ@õ(ö;öýÿíä&å<öýÿíзä;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä,öpõýÿíˆ'å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿí„: ä)ö;öùÿõ@õ(ö;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿíˆ'å,öpõýÿíÄä.öýÿí,Ôä)öùÿõýÿíÄä.öýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíˆ'å,ö*öýÿíä&å)ö;öùÿõýÿíÄä.öýÿíˆpä(ö*öOõ)ö;öùÿõ}öùÿõ}ö*vector::insert length errorøR/üW¨|1âî°G1äüÄîäÔ|1ìâS/ìð|1|W äˆT/ì }1зäpX/ì8}1„: ä(}1ì æäT}1… ä(}1ð 7äàŒìJS/äÀ}1â„1üW8âØ}1üƒ1öôã âì{öùÿõýÿíœä<öýÿíöýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿíœä<öýÿíö&öýÿí¸_ä=öýÿíxÃä;öùÿõýÿíüWä(öýÿíзä,öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}öøR/üWTƒ1âîp}1äôÃî䀃1ìâS/윃1|W äˆT/츃1зäpX/ìäƒ1„: äÔƒ1ì æå„1… äÔƒ1ð 7ä,ŽìJS/äl„1⸇1„, â„„1üd†1öôã âì{öýÿíüWä(öýÿíзä,öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}öøR/„,  †1ë„1ähÃîä̆1ìâS/ìè†1|W äˆT/ì‡1зäpX/ì0‡1„: ä ‡1ì æäL‡1… ä ‡1ð 7äh‡1ì â€R/x‡1指1è4ÿêJS/äˆ1✋1„, â ˆ1üHŠ1öôã âì{öýÿíHôä(öýÿíзä,öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;ö}öøR/„, „Š1븇1ä8Èîä°Š1ìâS/ìÌŠ1|W äˆT/ìèŠ1зäpX/ì‹1„: ä‹1ì æä0‹1… ä‹1ð 7äL‹1ì â€R/\‹1æp‹1è4êþJS/äì‹1â ø«1´BJáŒ1ü«1ö, âì{öùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí|räýÿí,ä=öýÿíÔ6 ä(öýÿí´)å,öýÿí“ ävõýÿí,Ôä)ö;öùÿõýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öùÿõýÿí¤Ìäýÿí¨$å=öýÿíä&å+öýÿí,ä;öùÿõ@õ(ö;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å,öpõýÿí„: ä)öùÿõ*öýÿíä&å=ö*öýÿí„: ä;öùÿõ;õ(öýÿí´)å<öýÿí“ ävõýÿí,Ôä)öùÿõ{öùÿõýÿí¨$å=öýÿíp ä(ö)ö;öùÿõ@õ(ö;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí ä(öýÿíä&å)ö;öùÿõýÿí“ ävõýÿí,Ôä=öýÿí´)å;öùÿõ}öùÿõ<õ;õ(öýÿí“ ävõýÿí,Ôä<öýÿí´)å)öùÿõ{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä,öpõýÿíä&å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíä&å,ö*öýÿí„: ä)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíôª1â)ö;öùÿõùÿõýÿí,X ä(ö)ö;öùÿõ;õ(öýÿí“ ävõýÿí… ä(ö)ö)öùÿõ{öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíÔ ä(öýÿí“ ävõýÿí… ä(ö)ö,öýÿí“ ävõýÿí+å(ö)ö)ö;öùÿõýÿí“ ävõýÿí… ä(ö)ö=öÿÿô;öùÿõýÿí“ ävõýÿí+å(ö)ö=öÿÿô;öùÿõ}öùÿõýÿí“ ävõýÿí… ä(ö)ö=öýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿí´)å)ö;öùÿõýÿí“ ävõýÿí+å(ö)ö=öýÿí´)å;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä,öpõýÿíä&å,öpõýÿí“ ävõýÿí,Ôä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíä&å,ö*öýÿí„: ä)ö;öùÿõ}öùÿõ}ö*vector::assign length errorøR/´BL«1â1ä\Çîäx«1ìâS/씫1|W äˆT/ìÀ«1„: ä°«1ì æäÜ«1… ä°«1ð 7äàŒìJS/äH¬1ⸯ1´Bâ`¬1üЮ1öôã âì{öùÿõýÿí,X ä(ö)ö;öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}öøR/´B ¯1âîø«1äˆÆîä8¯1ìâS/ìT¯1|W äˆT/쀯1„: äp¯1ì æäœ¯1… äp¯1ð 7ä,ŽìJS/ä°1â³1pë â °1üб1öôã âì{öýÿí´Bä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}öøR/pë ²1븯1äÄÅîä8²1ìâS/ìT²1|W äˆT/쀲1„: äp²1ì æäœ²1… äp²1ð 7串1ì â€R/Ȳ1æܲ1è4ÿêJS/äX³1â ¶1pë âp³1ühµ1öôã âì{öýÿíDÀä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;ö}öøR/pë ¤µ1ë³1äh¹îäе1ìâS/ììµ1|W äˆT/ì¶1„: ä¶1ì æä4¶1… ä¶1ð 7äP¶1ì â€R/`¶1æt¶1è4êþJS/äð¶1âÃ1œ>vâ·1ü,Â1ö, âì{öùÿõýÿí|räýÿíÈ ä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí“ ävõýÿí,Ôä>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíÂ1â)ö;öùÿõùÿõ;õ(öýÿíÈ ä>öÿÿô)öùÿõ{öùÿõýÿí“ ävõýÿí… ä(ö)ö=öýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿí¬±ä(öýÿíÈ ä)ö;öùÿõýÿí“ ävõýÿí+å(ö)ö=öýÿíÈ ä;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿíÌ' ä(ö)ö;öýÿí„: äkõýÿí… ä;öpõýÿíä&å,öpõýÿí“ ävõýÿí,Ôä,öpõýÿí„: ä)öùÿõýÿí“ ävõýÿíÀÑ ä(ö)ö.öýÿíTå(öýÿíä&å,ö*öýÿí„: ä)ö;öùÿõ}öùÿõ}ö"vector length errorøR/œ>hÂ1âî ¶1ä¹îä”Â1ìâS/ì°Â1|W äˆT/ìÜÂ1„: äÌÂ1ì æäøÂ1… äÌÂ1ð 7äàŒìJS/ädÃ1â\Æ1œ>â|Ã1ütÅ1öôã âì{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}öøR/œ>°Å1îÃ1ä ³îäÜÅ1ìâS/ìøÅ1|W äˆT/ì$Æ1„: äÆ1ì æä@Æ1… äÆ1ð 7ä,ŽìJS/䬯1â¬É1$âÄÆ1ütÈ1öôã âì{öýÿíœ>ä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}öøR/$°È1ë\Æ1äH²îäÜÈ1ìâS/ìøÈ1|W äˆT/ì$É1„: äÉ1ì æä@É1… äÉ1ð 7ä\É1ì â€R/lÉ1æ€É1è4ÿêJS/äüÉ1âDÍ1$âÊ1ü Ì1öôã âì{öýÿíœ>ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;ö}öøR/$HÌ1ë¬É1äX±îätÌ1ìâS/ìÌ1|W äˆT/ì¼Ì1„: ä¬Ì1ì æäØÌ1… ä¬Ì1ð 7äôÌ1ì â€R/Í1æÍ1è4êÿæ”Í1â<ý1ˆp4âÄÍ1ü¤Ò1ò¬Í1õ(öýÿíä&å>öýÿíP#å)öùÿõýÿíÀÑ ä(ö)ö.öýÿí ä(öqõýÿíä&å)ö;öùÿõýÿí,Ôä=öÿÿô;öùÿõ}ö ìè1Ôå1Ø1îâæ1òìå1ö>öýÿíL÷ä;öùÿõõýÿíTp ä<öýÿí|…ä<öýÿí“ ävõýÿí€ø ä,öýÿíL÷ä>ö>öýÿíð†ä;öùÿõýÿí“ ävõýÿíüWä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö,öùÿõýÿíð†ä(öýÿíL÷ä(öýÿí„: ä)ö)ö,öùÿõýÿíð†ä(öýÿíL÷ä(öýÿí… ä)ö)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0„, ˆ2ë<ý1ä ¶îä´2ìâ@*0ìà2|W äÐ2ì â@*0ä2зäü2ì â  2€ø äæH2„: ä82ì æäd2… ä82ìÐ2 7ä€2ì âèû12æ¤2è4ÿî 7äì2ì âèû1ü2æ2è4ÿêr*0äŒ2â, 2„, 3â¤2ül 2öôã âì{öõýÿíTp ä<öýÿí|…ä<öýÿí“ ävõýÿí€ø ä,öýÿíôã ä>ö>öýÿíð†ä;öùÿõýÿí“ ävõýÿíüWä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö,öùÿõýÿíð†ä(öýÿí„: ä)ö,öýÿíð†ä(öýÿí… ä)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0„, ¨ 2ë<2䘵îäÔ 2ìâ@*0ìð 2|W äÐ2ì 2зäü2ì8 2„: ä( 2ì æäT 2… ä( 2ìÀ 2 7äp 2ì âèû1€ 2æ” 2è4êÿâ 7äÜ 2ì âèû1ì 2æ 2è4ÿêr*0ä| 2âì2„, 1â” 2ü,2öôã âì{öõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>öýÿíL÷ä;öùÿõýÿí“ ävõýÿíüWä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö,öùÿõýÿíL÷ä(öýÿí„: ä)ö,öýÿíL÷ä(öýÿí… ä)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0„, h2ë, 2䘴îä”2ìâ@*0ì°2|W äÐ2ìÌ2зäü2ìø2„: äè2ì æä2… äè2ì€2 7ä02ì âèû1@2æT2è4ÿî 7äœ2ì âèû1¬2æÀ2è4êþr*0ä<2âÌ2„, âT2ü 2öôã âì{öýÿí“ ävõýÿíüWä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö,öùÿõýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0„, H2ëì2ä|³îät2ìâ@*0ì2|W äÐ2ì¬2зäü2ìØ2„: äÈ2ì æäô2… äÈ2ì`2 7ä2ì âèû1 2æ42è4êÿâ 7ä|2ì âèû1Œ2æ 2è4êþr*0ä2âà2„, 9â42üŒ2öôã âì{öõýÿíÌLä<öýÿíôã ä>övõýÿí |äýÿíÄ ä;öùÿõýÿí„, ä(öýÿíзä,öýÿí„: ä,öýÿí… ä,öùÿõýÿí´qä<öýÿí ûävõýÿíLm ä<öýÿíÄ ä,öýÿí |ä>övõýÿífä>ö(ö)ö,öùÿõýÿí´qä<öýÿí ûävõýÿíLm ä<öýÿí |ä,öýÿí“ ävõýÿí |ä>övõýÿífä>ö(ö)ö)ö;ö}ö˜*0„, È2ëÌ2äL¦îäô2ìâ@*0ì2|W äÐ2ì,2зäü2ìX2„: äH2ì æät2… äH2ð 7ä2ì âèû1 2æ´2è4ÿêr*0ä0 2â|#2„, âH 2ü("2öôã âì{öýÿíHôä(öýÿíзä,öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,ö(öýÿí |ä)öýÿí… ä)ö;ö}ö˜*0„, d"2ëà2äè¤îä"2ìâ@*0ì¬"2|W äÐ2ìÈ"2зäü2ìô"2„: ää"2ì æä#2… ää"2ð 7ä,#2ì âèû1<#2æP#2è4êþr*0äÌ#2âX+2pë >âä#2ü´)2öôã âì{öõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>öýÿíL÷ä;öùÿõõýÿíTp ä<öýÿí|…ä<öýÿí“ ävõýÿí€ø ä,öýÿíL÷ä>ö>öýÿíð†ä;öùÿõýÿí“ ävõýÿí´Bä(öýÿíð†ä(öýÿíL÷ä(öýÿí„: ä)ö)ö,öùÿõýÿíð†ä(öýÿíL÷ä(öýÿí… ä)ö)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0pë ð)2ë|#2äìŸîä*2ìâ@*0ì8*2|W äÐ2ìd*2„: äT*2ì æä€*2… äT*2ìì*2 7äœ*2ì âèû1¬*2æÀ*2è4ÿî 7ä+2ì âèû1+2æ,+2è4ÿêr*0ä¨+2âT12pë *âÀ+2ü°/2öôã âì{öõýÿíTp ä<öýÿí|…ä<öýÿí“ ävõýÿí€ø ä,öýÿíôã ä>ö>öýÿíð†ä;öùÿõýÿí“ ävõýÿí´Bä(öýÿíð†ä(öýÿí„: ä)ö,öýÿíð†ä(öýÿí… ä)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0pë ì/2ëX+2丟îä02ìâ@*0ì402|W äÐ2ì`02„: äP02ì æä|02… äP02ìè02 7ä˜02ì âèû1¨02æ¼02è4êÿâ 7ä12ì âèû112æ(12è4ÿêr*0ä¤12â 72pë (â¼12ü|52öôã âì{öõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>öýÿíL÷ä;öùÿõýÿí“ ävõýÿí´Bä(öýÿíL÷ä(öýÿí„: ä)ö,öýÿíL÷ä(öýÿí… ä)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0pë ¸52ëT12伞îää52ìâ@*0í62|W äÐ2ì,62„: ä62ì æäH62… ä62ì´62 7äd62ì âèû1t62æˆ62è4ÿî 7äÐ62ì âèû1à62æô62è4êþr*0äp72â ;2pë âˆ72üh92öôã âì{öýÿí“ ävõýÿí´Bä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0pë ¤92ë 72äðîäÐ92ìâ@*0ìì92|W äÐ2ì:2„: ä:2ì æä4:2… ä:2ì :2 7äP:2ì âèû1`:2æt:2è4êÿâ 7ä¼:2ì âèû1Ì:2æà:2è4êþr*0ä\;2âÔA2pë 7ât;2üœ@2öôã âì{öõýÿíÌLä<öýÿíôã ä>övõýÿí |äýÿíÄ ä;öùÿõýÿípë ä(öýÿí„: ä,öýÿí… ä,öùÿõýÿí´qä<öýÿí ûävõýÿíLm ä<öýÿíÄ ä,öýÿí |ä>övõýÿífä>ö(ö)ö,öùÿõýÿí´qä<öýÿí ûävõýÿíLm ä<öýÿí |ä,öýÿí“ ävõýÿí |ä>övõýÿífä>ö(ö)ö)ö;ö}ö˜*0pë Ø@2ë ;2ä,¢îäA2ìâ@*0ì A2|W äÐ2ìLA2„: äö(öýÿí„: ä)ö,ö(öýÿí |ä)öýÿí… ä)ö;ö}ö˜*0pë (D2ëÔA2ät¡îäTD2ìâ@*0ìpD2|W äÐ2ìœD2„: äŒD2ì æä¸D2… äŒD2ð 7äÔD2ì âèû1äD2æøD2è4êþr*0ätE2ãM2$>âŒE2ü\K2öôã âì{öõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>öýÿíL÷ä;öùÿõõýÿíTp ä<öýÿí|…ä<öýÿí“ ävõýÿí€ø ä,öýÿíL÷ä>ö>öýÿíð†ä;öùÿõýÿí“ ävõýÿíœ>ä(öýÿíð†ä(öýÿíL÷ä(öýÿí„: ä)ö)ö,öùÿõýÿíð†ä(öýÿíL÷ä(öýÿí… ä)ö)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0$˜K2ë$E2ä ¡îäÄK2ìâ@*0ìàK2|W äÐ2ì L2„: äüK2ì æä(L2… äüK2ì”L2 7äDL2ì âèû1TL2æhL2è4ÿî 7ä°L2ì âèû1ÀL2æÔL2è4ÿêr*0äPM2âüR2$*âhM2üXQ2öôã âì{öõýÿíTp ä<öýÿí|…ä<öýÿí“ ävõýÿí€ø ä,öýÿíôã ä>ö>öýÿíð†ä;öùÿõýÿí“ ävõýÿíœ>ä(öýÿíð†ä(öýÿí„: ä)ö,öýÿíð†ä(öýÿí… ä)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0$”Q2ìM2䜠îäÀQ2ìâ@*0ìÜQ2|W äÐ2ìR2„: äøQ2ì æä$R2… äøQ2ìR2 7ä@R2ì âèû1PR2ædR2è4êÿâ 7ä¬R2ì âèû1¼R2æÐR2è4ÿêr*0äLS2âÈX2$(âdS2ü$W2öôã âì{öõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>öýÿíL÷ä;öùÿõýÿí“ ävõýÿíœ>ä(öýÿíL÷ä(öýÿí„: ä)ö,öýÿíL÷ä(öýÿí… ä)ö,öùÿõýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0$`W2ëüR2ä¼”îäŒW2ìâ@*0ì¨W2|W äÐ2ìÔW2„: äÄW2ì æäðW2… äÄW2ì\X2 7ä X2ì âèû1X2æ0X2è4ÿî 7äxX2ì âèû1ˆX2æœX2è4êþr*0äY2â´\2$â0Y2ü[2öôã âì{öýÿí“ ävõýÿíœ>ä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö˜*0$L[2ëÈX2ä4”îäx[2ìâ@*0ì”[2|W äÐ2ìÀ[2„: ä°[2ì æäÜ[2… ä°[2ìH\2 7äø[2ì âèû1\2æ\2è4êÿâ 7äd\2ì âèû1t\2æˆ\2è4êþr*0ä]2â|c2$7â]2üDb2öôã âì{öõýÿíÌLä<öýÿíôã ä>övõýÿí |äýÿíÄ ä;öùÿõýÿí$ä(öýÿí„: ä,öýÿí… ä,öùÿõýÿí´qä<öýÿí ûävõýÿíLm ä<öýÿíÄ ä,öýÿí |ä>övõýÿífä>ö(ö)ö,öùÿõýÿí´qä<öýÿí ûävõýÿíLm ä<öýÿí |ä,öýÿí“ ävõýÿí |ä>övõýÿífä>ö(ö)ö)ö;ö}ö˜*0$€b2ë´\2ä Žîä¬b2ìâ@*0ìÈb2|W äÐ2ìôb2„: ääb2ì æäc2… ääb2ð 7ä,c2ì âèû1ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,ö(öýÿí |ä)öýÿí… ä)ö;ö}ö˜*0$Ðe2ë|c2älîäüe2ìâ@*0ìf2|W äÐ2ìDf2„: ä4f2ì æä`f2… ä4f2ð 7ä|f2ì âèû1Œf2æ f2è4êÿâÔf2è81ôOg2ë¼g2ä¼Êîä1ì„g2„: ätg2ì æä g2… ätg2ðÄ"åhA1êÂ81ä h2â¨D1ôO"â$h2üÔf2öôã âì:öýÿí“ ä(öýÿíÄ"å)öùÿõ{öýÿí“ ävõýÿí$ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}ö%Dp2DÀ€o2dk2è81DÀ k2ë0l2äËîäÌk2ìâ81ìèk2|W ä¸>1ìl2„: äl2ì æè… äl2ìÂ81ä€l2â¼g2DÀâ˜l2üdk2öôã âì{öùÿõùÿõýÿí“ ävõýÿípë ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;öùÿõ}úˆo2è81DÀÄo2ÿèäðo2ì€â81 ê p2|W ä¸>1ì(p2´)å0;1ðx.åäB1êØp2è„å Tp2è81è„áp2ÿèä¼p2ä,<1䀀â81 î|W ä¸>1ê"øq2Ì' lq2èp2è81Ì' $q2ÿèäPq2äX<1ä€â81 î|W ä¸>1ðtq2è81Ì' °q2ÿèäÜq2ä¬<1䀀â81 î|W ä¸>1ê"s2p Œr2r2è81p Dr2ÿèäpr2äX<1ä€â81î|W ä¸>1ð”r2è81p Ðr2ÿèäür2ä¬<1䀀â81î|W ä¸>1ê"8t2 O ¬s2(s2è81 O ds2ÿèäs2äÈ?1ä€â81î|W ä¸>1ð´s2è81 O ðs2ÿèät2ä@1䀀â81î|W ä¸>1ê"Xu2ÔîÌt2Ht2è81Ôî„t2ÿèä°t2äÈ?1ä€â81î|W ä¸>1ðÔt2è81Ôîu2ÿèä1êìu2¤ ähu2è81¤ ¤u2ÿèäÐu2ä0;1䀀â81î|W ä¸>1ê€v20 äüu2è810 8v2ÿèädv2ä0;1䀀â81î|W ä¸>1ê"ôw2ü 0w2v2è81ü Ìv2ÿèäøv2ì€â81êw2|W ä¸>1ðŒ0ä0;1ð8w2è81ü tw2ÿèä w2ì€â81ê¼w2|W ä¸>1ìØw2Œ0ä0;1ðè#åäB1êˆx24Öäx2è814Ö@x2ÿèälx2ä0;1䀀â81î|W ä¸>1êy2°‚ ä˜x2è81°‚ Ôx2ÿèåy2쀀â81î|W ä¸>1êÌy2ÈLä,y2è81ÈLhy2ÿèä”y2ì€â81ê°y2|W ä¸>1ð´)å0;1ì"${2t;|z2Üy2è81t;z2ÿèäDz2äô:1䀀â81ê`z2|W ä¸>1î´)å0;1ð„z2è81t;Àz2ÿèäìz2ä¸:1ä€â81ê{2|W ä¸>1ð´)å0;1ì"||2˜5Ô{24{2è81˜5p{2ÿèäœ{2ä¸:1ä€â81ê¸{2|W ä¸>1ð´)å0;1ðÜ{2è81˜5|2ÿèäD|2äô:1䀀â81ê`|2|W ä¸>1î´)å0;1ì"œ}2 Ú}2Œ|2è81 ÚÈ|2ÿèäô|2ä¸:1ä€â81î|W ä¸>1ð}2è81 ÚT}2ÿèä€}2äô:1䀀â81 î|W ä¸>1ê"¼~2°’ 0~2¬}2è81°’ è}2ÿèä~2ä¸:1ä€â81!î|W ä¸>1ð8~2è81°’ t~2ÿèä ~2äô:1䀀â81"î|W ä¸>1êl2ü„äÌ~2è81ü„2ÿèä42ì€â81#êP2|W ä¸>1ð`0åäB1ë€2ôw ä|2è81ôw ¸2ÿèää2ì€â81$î|W ä¸>1ì"4†2HôÌ€2€2è81HôL€2ÿèäx€2äX<1ä€â81%ꔀ2|W ä¸>1ì°€2зäX<1ð`0åäB1ê¬2Ô€2è81Hô2ÿèä<2ì€â81&êX2|W ä¸>1ìt2зäX<1ì2´)å0;1ð`0åäB1î´2è81Hôð2뜂2äÐØîä‚2ìâ81ì8‚2|W ä¸>1ìT‚2зäX<1쀂2„: äp‚2ì æè… äp‚2ìÂ81äì‚2â0l2Hô"âƒ2ü´2öôã âì{öùÿõùÿõýÿí„, ä(öýÿíðä(öýÿíзä)ö,öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;öùÿõ}ö"¨‡2œêä†2D†2è81œê€†2ÿè䬆2äX<1ä€â81'êȆ2|W ä¸>1ðзäX<1ðì†2è81œê(‡2ÿèäT‡2äX<1ä€â81(êp‡2|W ä¸>1쌇2„: äX<1ð… äX<1ìhˆ2ˆp万2è81ˆpô‡2ÿèä ˆ2ì€â81)ê<ˆ2|W ä¸>1ðÐ0åXˆ2ì â81 äüˆ2,X äxˆ2è81,X ´ˆ2ÿèäàˆ2ì€â81*î|W ä¸>1ð4¦ä ‰2ä4¦H‰2äYÿå â X‰24¦ â è(0h‰2|‰2ä`91è‰2â,<1ìᤉ2èIêÔ91fôâè‰21îâ»2ò{öDõýÿíÌõ ä(öýÿí„+å)ö;ö}ö¼¼2ä4>1îâü»2ò{öDõýÿí¤Ìä(öýÿí„+å)ö;ö}öȽ2ä=1î âð¼2ò{öDõýÿíä&å.öýÿí“ ä(ö)ö;ö}þô<1î âü½2ò{öDõýÿíä&å.öýÿí“ ä(ö)ö;ö}ú D5/à¾2ô¾2ôâ¿2ä(Üá ìÜ¿2ø@¿2ä â è(0P¿2d¿2ä`91èx¿2â,<1ìጿ2èI긿2fôâ ⤲ȿ2è`91èÀ2ø091æ,À2ø:1æTÀ2ø¬:1æ|À2øè:1æ¤À2ø$;1æÌÀ2ø`;1æôÀ2øœ;1æÁ2ø¸;1æDÁ2øÔ;1ælÁ2ø<1æ”Á2øL<1æ¼Á2ø <1æäÁ2øô<1æ Â2ø=1æ4Â2ø4>1æ\Â2øü>1æ„Â2ø¼?1æ¬Â2øü?1æÔÂ2ø<@1æüÂ2øÈ@1æ$Ã2ø€A1æLÃ2ø(B1ætÃ2øüB1æœÃ2øˆo2æÄÃ2øTp2æìÃ2øèp2æÄ2øtq2æ<Ä2ør2ædÄ2ø”r2æŒÄ2ø(s2æ´Ä2ø´s2æÜÄ2øHt2æÅ2øÔt2æ,Å2øhu2æTÅ2øüu2æ|Å2øv2æ¤Å2ø8w2æÌÅ2øx2æôÅ2ø˜x2æÆ2ø,y2æDÆ2øÜy2ælÆ2ø„z2æ”Æ2ø4{2æ¼Æ2øÜ{2æäÆ2øŒ|2æ Ç2ø}2æ4Ç2ø¬}2æ\Ç2ø8~2æ„Ç2øÌ~2æ¬Ç2ø|2æÔÇ2ø€2æüÇ2øÔ€2æ$È2øD†2æLÈ2øì†2ætÈ2ø¸‡2æœÈ2øxˆ2æüÄÈ2æ â ÔÈ24¦ â è(0äÈ2øÈ2ä`91è É2â,<1ìá É2èIêÔ91fôâ¤É2ä`É2è â pÉ2Å âð;€É2è”É2è ðâ¸É2è â ÈÉ2, â ØÉ2øÉ2 â èÉ2|\ äî Ê2è â Ê2Å âð;,Ê2è”É2è¤Ê2ˆ äPÊ2\Ê2æ â lÊ2ô â ü*0|Ê2Ê2ä`É2ìâ¸É2è¼Ê2´qä´Ê2èû1âøÊ2ØäÌÊ2ØÊ2æ â èÊ2Ø äæ4Ë2ÔÏäË2Ë2æ â $Ë2ÔÏ äæPË2¤ÌäDË2ü2æŒË2Ìõ ä`Ë2lË2æ â |Ë2Ø äæÈË2|räœË2¨Ë2æ â ¸Ë2|r äæÌ2€×äØË2äË2æ â ôË2€× äæ Ì2 |äÌ2”É2æ<Ì2ô ä0Ì2ôË2æxÌ2€ø äLÌ2XÌ2æ â hÌ2€ø äæ´Ì2ØäˆÌ2”Ì2æ â ¤Ì2Ø äæ\Ð2ôOHÍ2ÄÌ2˜*0ôOáÍ2ÿèä,Í2äœBä€â@*0î|W äÐ2íÎ2PÍ2˜*0ôOŒÍ2Pÿèä¸Í2äœBä€â@*0êÔÍ2|W äÐ2ðÄ"åðÍ2ê â¤Ì2 ä¨Î2Î2˜*0ôODÎ2PÿèäpÎ2äœBä€â@*0êŒÎ2|W äÐ2ð´)å¨Ë2ì|Ï2°Î2˜*0ôOìÎ2ÿèäÏ2äœBä€â@*0ê4Ï2|W äÐ2ìPÏ2´)å¨Ë2ðfälÏ2ê â”É2 è„Ï2˜*0ôOÀÏ2ÿèäìÏ2äœBä€â@*0êÐ2|W äÐ2ì$Ð2´)å¨Ë2ì@Ð2fälÏ2îÄ"åðÍ2ê(Ñ2DÀälÐ2˜*0DÀ¨Ð2ÿèäÔÐ2ì€â@*0êðÐ2|W äÐ2ì Ñ2´)å¨Ë2ðx.ålÏ2ê¼Ñ2è„å 8Ñ2˜*0è„átÑ2ÿèä Ñ2ä¤Ì2䀀â@*0î|W äÐ2ê"ÜÒ2Ì' PÒ2ÌÑ2˜*0Ì' Ò2ÿèä4Ò2äü2ä€â@*0î|W äÐ2ðXÒ2˜*0Ì' ”Ò2ÿèäÀÒ2älË2䀀â@*0 î|W äÐ2ê"üÓ2p pÓ2ìÒ2˜*0p (Ó2ÿèäTÓ2äü2ä€â@*0 î|W äÐ2ðxÓ2˜*0p ´Ó2ÿèäàÓ2älË2䀀â@*0 î|W äÐ2êÔ2¤ ä Ô2˜*0¤ HÔ2ÿèätÔ2ä¨Ë2䀀â@*0 î|W äÐ2ê$Õ20 ä Ô2˜*00 ÜÔ2ÿèäÕ2ä¨Ë2䀀â@*0 î|W äÐ2ê"˜Ö2ü ÔÕ24Õ2˜*0ü pÕ2ÿèäœÕ2ì€â@*0ê¸Õ2|W äÐ2ðŒ0ä¨Ë2ðÜÕ2˜*0ü Ö2ÿèäDÖ2ì€â@*0ê`Ö2|W äÐ2ì|Ö2Œ0ä¨Ë2ðè#ålÏ2ê,×24Öä¨Ö2˜*04ÖäÖ2ÿèä×2ä¨Ë2䀀â@*0î|W äÐ2êÀ×2°‚ ä<×2˜*0°‚ x×2ÿèä¤×2쀀â@*0î|W äÐ2êpØ2ÈLäÐ×2˜*0ÈL Ø2ÿèä8Ø2ì€â@*0êTØ2|W äÐ2ð´)å¨Ë2ì"ÈÙ2˜5 Ù2€Ø2˜*0˜5¼Ø2ÿèäèØ2äØÊ2ä€â@*0êÙ2|W äÐ2ð´)å¨Ë2ð(Ù2˜*0˜5dÙ2ÿèäÙ2äË2䀀â@*0ê¬Ù2|W äÐ2î´)å¨Ë2ì" Û2t;xÚ2ØÙ2˜*0t;Ú2ÿèä@Ú2äË2䀀â@*0ê\Ú2|W äÐ2î´)å¨Ë2ð€Ú2˜*0t;¼Ú2ÿèäèÚ2äØÊ2ä€â@*0êÛ2|W äÐ2ð´)å¨Ë2ì"@Ü2 Ú´Û20Û2˜*0 ÚlÛ2ÿèä˜Û2äØÊ2ä€â@*0î|W äÐ2ð¼Û2˜*0 ÚøÛ2ÿèä$Ü2äË2䀀â@*0î|W äÐ2ê"`Ý2°’ ÔÜ2PÜ2˜*0°’ ŒÜ2ÿèä¸Ü2äØÊ2ä€â@*0î|W äÐ2ðÜÜ2˜*0°’ Ý2ÿèäDÝ2äË2䀀â@*0î|W äÐ2êÞ2ü„äpÝ2˜*0ü„¬Ý2ÿèäØÝ2ì€â@*0êôÝ2|W äÐ2ð`0ålÏ2ê¤Þ2ôw ä Þ2˜*0ôw \Þ2ÿèäˆÞ2ì€â@*0î|W äÐ2ì"Pà2Hôpß2´Þ2˜*0HôðÞ2ÿèäß2äü2ä€â@*0ê8ß2|W äÐ2ìTß2зäü2ð`0ålÏ2îxß2˜*0Hô´ß2ÿèäàß2ì€â@*0êüß2|W äÐ2ìà2зäü2ì4à2´)å¨Ë2ð`0ålÏ2êÄá2œêáá2`à2˜*0œêœà2ÿèäÈà2äü2ä€â@*0êäà2|W äÐ2ðзäü2ðá2˜*0œêDá2ÿèäpá2äü2ä€â@*0 êŒá2|W äÐ2ì¨á2„: äü2ð… äü2ì„â2ˆpäÔá2˜*0ˆpâ2ÿèä<â2ì€â@*0!êXâ2|W äÐ2ðÐ0åtâ2ì â@*0 äã2,X ä”â2˜*0,X Ðâ2ÿèäüâ2ì€â@*0"î|W äÐ2ìäã2œ>ä(ã2˜*0œ>dã2ÿèäã2ì€â@*0#ê¬ã2|W äÐ2ìÈã2´)å¨Ë2ðx.ålÏ2ê.ä2$ôã2”e2üã2Db2ä2[2 ä2$W2ä2XQ2ä2\K2Tä2pë ,ä2ìC24ä2œ@2<ä2h92Dä2|52Lä2°/2ä2´)2Œä2„, dä2("2lä2Œ2tä2 2|ä2,2„ä2l 2äL2ä4¦äœä2ä4¦Øä2äYÿå â èä24¦ â ü*0øä2 å2ä`É2ìâ¸É2è8å2ä(öýÿí´)å,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿíx.å)ö;ö}ö@è2ä”â2îâ€ç2ò{öýÿí“ ävõýÿí,X ä(ö)ö;ö}ö¬é2äÔá2î âtè2ò{öýÿí“ ävõýÿíˆpä(ö(öýÿí“ ä&ö)öýÿíÐ0å)ö;ö}öhì2äá2îâàé2ò{öDõýÿí¤Ìä(öýÿí“ ävõýÿíœêä(ö õýÿí“ ävõýÿí¤Ìä(öýÿí„: ä)ö,ö õýÿí“ ävõýÿí¤Ìä(öýÿí… ä)ö)ö)ö;ö}ödî2ä`à2îâœì2ò{öDõýÿí¤Ìä(öýÿí“ ävõýÿíœêä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö)ö)ö;ö}ö ñ2äxß2îâ˜î2ò{öýÿí“ ävõýÿíHôä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö,öýÿí´)å,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿí`0å)ö;ö}ö ô2ä´Þ2îâTñ2ò{öDõýÿí¤Ìä(öýÿí“ ävõýÿíHôä(ö õýÿí“ ävõýÿí¤Ìä(öýÿíзä)ö,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿí`0å)ö)ö;ö}÷õ2ä Þ2îâ@ô2ò{öýÿí“ ävõýÿíôw ä(ö)ö;ö}öÌö2äpÝ2îâ4õ2ò{öýÿí“ ävõýÿíü„ä(ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿí`0å)ö;ö}ö ø2äÜÜ2î ã÷2ò{öDõýÿíÔÏä(öýÿí“ ävõýÿí°’ ä(ö)ö)ö;ö}ötù2äPÜ2î âTø2ò{öDõýÿíØä(öýÿí“ ävõýÿí°’ ä(ö)ö)ö;ö}öÈú2ä¼Û2î â¨ù2ò{öDõýÿíÔÏä(öýÿí“ ävõýÿí Úä(ö)ö)ö;ö}öü2ä0Û2î âüú2ò{öDõýÿíØä(öýÿí“ ävõýÿí Úä(ö)ö)ö;ö}öˆý2ä€Ú2î âPü2ò{öDõýÿíØä(öýÿí“ ävõýÿít;ä(öýÿí´)å)ö)ö;ö}öôþ2äØÙ2î â¼ý2ò{öDõýÿíÔÏä(öýÿí“ ävõýÿít;ä(öýÿí´)å)ö)ö;ö}ö3ä(Ù2îâ(ÿ2ò{öDõýÿíÔÏä(öýÿí“ ävõJõ[ö]ö(öýÿí´)å)ö)ö;ö}ö,3䀨2îâÄ3ò{öDõýÿíØä(öýÿí“ ävõJõ[ö]ö(öýÿí´)å)ö)ö;ö}ö83äÐ×2î â`3ò{öýÿí“ ävõýÿíÈLä(öýÿí´)å)ö;ö}öD3ä<×2î âl3ò{öDõýÿí“ ävõýÿí°‚ ä(ö)ö;ö}öP3ä¨Ö2î âx3ò{öDõýÿí“ ävõýÿí4Öä(ö)ö;ö}öL3äÜÕ2îâ„3ò{öýÿí“ ävõýÿíü ä(öýÿíŒ0ä,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿíè#å)ö;ö}öX3ä4Õ2î â€3ò{öýÿí“ ävõýÿíü ä(öýÿíŒ0ä)ö;ö}öd 3ä Ô2î âŒ3ò{öDõýÿí“ ävõýÿí0 ä(ö)ö;ö}öp 3ä Ô2î ☠3ò{öDõýÿí“ ävõýÿí¤ ä(ö)ö;ö}öÄ 3äxÓ2î ⤠3ò{öDõýÿíÌõ ä(öýÿí“ ävõýÿíp ä(ö)ö)ö;ö}ö 3äìÒ2î âø 3ò{öDõýÿí¤Ìä(öýÿí“ ävõýÿíp ä(ö)ö)ö;ö}öl3äXÒ2î âL 3ò{öDõýÿíÌõ ä(öýÿí“ ävõýÿíÌ' ä(ö)ö)ö;ö}öÀ3äÌÑ2î â 3ò{öDõýÿí¤Ìä(öýÿí“ ävõýÿíÌ' ä(ö)ö)ö;ö}öÌ3ä8Ñ2î âô3ò{öDõýÿí“ ävõýÿíè„å(ö)ö;ö}öÈ3älÐ2îã3ò{öýÿí“ ävõýÿíDÀä(öýÿí´)å,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿíx.å)ö;ö}öÄ3ä„Ï2îâü3ò:öýÿí“ ä(öýÿí´)å,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿífä,öýÿíÄ"å)ö{ö}ö3ä°Î2îâø3ò:öýÿí“ ä(öýÿí´)å,ö(ö!õ õýÿí“ ävõýÿí |ä&ö)öýÿífä)ö{ö}öl3äÎ2îâÄ3ò:öýÿí“ ä(öýÿí´)å)ö{ö}öH3äPÍ2îâ 3ò:öýÿí“ ä(öýÿíÄ"å)ö{ö}þÄÌ2îâ|3ò{ö}öä3øÔ3ä ∲ä3çø3èIê$3øæ,3éX3„3øIê”É2øâIê°3øâ â À3Å âð;Ð3è”É2é3ø 3ä â ü*03d3ä03è â @3Å âð;P3è”É2ìâx3è â ˆ3, â ˜3¸3 â ¨3|\ äîÌ3è â Ü3Å âð;ì3è”É2è(3øà*0æP3øPÊ2æx3øèû1è 3øÌÊ2æÈ3øË2æð3øDË2æ3ø`Ë2æ@3øœË2æh3øØË2æ3øÌ2æ¸3ø0Ì2æà3øLÌ2æ3øˆÌ2æ03øÄÌ2æX3øPÍ2æ€3øÎ2æ¨3ø°Î2æÐ3ø„Ï2æø3ølÐ2æ 3ø8Ñ2æH3øÌÑ2æp3øXÒ2æ˜3øìÒ2æÀ3øxÓ2æè3ø Ô2æ3ø Ô2æ83ø4Õ2æ`3øÜÕ2æˆ3ø¨Ö2æ°3ø<×2æØ3øÐ×2æá 3ø€Ø2æ( 3ø(Ù2æP 3øØÙ2æx 3ø€Ú2æ  3ø0Û2æÈ 3ø¼Û2æð 3øPÜ2æ!3øÜÜ2æ@!3øpÝ2æh!3ø Þ2æ!3ø´Þ2æ¸!3øxß2æà!3ø`à2æ"3øá2æ0"3øÔá2æX"3ø”â2æ€"3ø(ã2æü¨"3ä â ¸"34¦ â ü*0È"3Ü"3ä`É2ìâ¸É2è#3ä”É2è#3â¨3ä åá,#3áÊ ã4êþ¸#3ø€#3ä â 8Ó1#3¤#3ä,k/ìâ`â/è$$3øà#3æì#3æ â 8Ó1ü#3$3ä,k/ìâ`â/èL$3ø€R/è€$3øt$3æЪ/æ´$3ø¨$3æè§/æè$3øÜ$3æpX/æ%3ø%3æPâ/æP%3øD%3æàj/æ¤%3øx%3æ„%3æ â ”%3€× 俨%3øÌ%3æ,k/æ &3ù&3æ”%3æ`&3ø4&3æ@&3æ â P&3€ø äæ´&3øˆ&3æ”&3æ â ¤&3Ø äæÜ&3ø(0æ'3ø &0æ,'3øä#0æT'3ø¼!0æ|'3øÈ0æ¤'3ø¬0æÌ'3ø 0æô'3øxì/æ(3øˆê/æD(3ø˜è/æl(3ø¨æ/æ”(3øXä/æ¼(3øèá/æä(3ø(à/æ )3øØÝ/æ4)3øÄ×/æ\)3øÄÑ/æ„)3øÔÏ/æ¬)3øäÍ/æÔ)3ø¿/æü)3øŒ¼/æ$*3øº/æL*3ø´µ/æt*3ø`±/æœ*3øX¯/æÄ*3øP­/æì*3øhª/æ+3ø€§/æ<+3ø¥/æd+3øì¡/æŒ+3øl/æ´+3ø$j/æÜ+3øxb/æ,3øX/æ,,3øìU/æT,3øT/æ|,3øp0æü¤,3ä â ´,34¦ â 8Ó1Ä,3Ø,3ä,k/ìâ¤&3è-3D? äü,3S/â-3“ ä à#3,-3´qä$-3€R/â<-3Øä t$3L-3ÔÏä ¨$3\-3¤Ìä Ü$3l-3Ìõ ä %3|-3|rä D%3Œ-3€×ä x%3œ-3 |ä Ì%3¬-3ô å &3¼-3€ø ä 4&3Ì-3Øä2ˆ&3.3ôOÜ-3(0ä-3 &0ì-3ä#0ô-3¼!0ü-3È0ä ¬0.3˜Rä 0$.3DÀä xì/4.3è„åˆê/L.3Ì' D.3˜è/䍿/d.3p \.3Xä/ä èá/t.3¤ ä (à/„.30 äØÝ/œ.3ü ”.3Ä×/ä ÄÑ/¬.34Öä ÔÏ/¼.3°‚ ä äÍ/Ì.3ÈLä¿/ä.3˜5Ü.3Œ¼/äº/ü.3t;ô.3´µ/ä`±//3 Ú /3X¯/äP­/,/3°’ $/3hª/ä €§/Ä/3tÅ1Ì/3,Â1äp0ì/3pë ä/3hµ1äб103´Bü/3Ю1ä«103„, 03HŠ1äd†1403üW,03ƒ1äl|1ä4¦äD03ä4¦¤,3äYÿé´qä03€R/æP#ãï|W äÐB/ê"23ì6p13Ü03B/ì613ÿèäT13äD13ä€â¬A/ê â¬A/ è|W äÐB/ðx13B/ì6´13ÿèäà13ä¬A/ä€â¬A/êü13|W äÐB/ð 7ô"T33|6¬23(23B/|6d23ÿèä23äD13ä€â¬A/î|W äÐB/ð´23B/|6ð23ÿèä33ä¬A/ä€â¬A/ê833|W äÐB/ð 7ôh43Cäd33B/C 33ÿèäÌ33äD13ä€â¬A/êè33|W äÐB/ð´)å43ì â 43€× â $43, â 443T43 â D43|\ ÿà53ì9äx43B/ì9´43ÿèäà43ä¬A/䀀â¬A/êü43|W äÐB/î´)å43ìÈ53HBä(53B/HBd53ÿèä53äD13ä€â¬A/ ê¬53|W äÐB/ð´)å43ìx63l6äØ53B/l663ÿèä@63ä¬A/䀀â¬A/ ê\63|W äÐB/î´)å43ì(73˜5äˆ63B/˜5Ä63ÿèäð63ä,D/䀀â¬A/ ê 73|W äÐB/îä&å@6/ìh73dzä873á P73dzˆC/èå”k@6/ì”käP73ü83äèB/îâ¬73ò:öýÿídzä(öýÿíÐç ä)ö,öùÿõýÿí”kä(öýÿíàä)öùÿõ{ö}ö˜:3äˆ63îâ093ò{öDõýÿíœävõýÿíØä(ö*öýÿídzä,öýÿí”kä+öýÿíä&å)ö;ö}öÔ;3äØ53î âÌ:3ò{öDõýÿílÔ ä(ö*öOõ)öbõýÿí´)å;ö}ö@=3ä(53î â<3ò{öýÿí”käbõ(öýÿí|rä)öýÿí´)å;öDõ*öOõ;ö}ö|>3äx43î ât=3ò{öDõýÿílÔ ä(ö*öOõ)öaõýÿí´)å;ö}öè?3äd33î â°>3ò{öýÿí”käaõ(öýÿí|rä)öýÿí´)å;öDõ*öOõ;ö}ö„A3ä´23îâ@3ò{öýÿílÔ äýÿíÄä(ö*öOõ)ö;öqõýÿí”kä;öDõýÿíÄä;ö}öB3ä(23î â¸A3ò{öqõýÿí”kä;öDõ*öOõ;ö}ö,D3äx13îâÄB3ò{öýÿílÔ äýÿíÄä(ö*öOõ)ö;öpõýÿí”kä;öDõýÿíÄä;ö}ö8E3äÜ03î â`D3ò{öpõýÿí”kä;öDõ*öOõ;ö}ö¼F3äÄC/îâlE3ò{öDõ õýÿíœävõýÿíØä(ö*öýÿídzä,öýÿí”kä)ö;ö}þLB/îâðF3ò{ö}öÌG3øHG3æ â ˆXG3lG3äHŠè€G3î”G3â43è¸G3â¨G3è ðâ,D/èôG3øLB/æH3øÄC/æDH3øÜ03ælH3øx13æ”H3ø(23æ¼H3ø´23æäH3ød33æ I3øx43æ4I3ø(53æ\I3øØ53æXK3ø„I3æ´I3æl6øâJ3äÐI3ä43ä€âìI3`0åD13îÐ0åD13ê{öDõýÿí€×ä(öýÿí`0å.öýÿí”kä-öýÿíÐ0å.öýÿí”kä)ö;ö}ö€K3øˆ63æ4M3ø¨K3æØK3æ˜Uø â,L3äôK3ì€âL3`0åD13îÐ0åD13ê{öDõýÿí`0å.öýÿí”käjõýÿíÐ0å.öýÿí”kä;ö}öèN3ø\M3æŒM3æôTø âàM3ä¨M3ì€âÄM3`0åD13îÐ0åD13ê{öDõýÿí`0å.öýÿí”käkõýÿíÐ0å.öýÿí”kä;ö}öœP3øO3æ@O3æ <ø â”O3ä\O3ì€âxO3`0åD13îÐ0åD13ê{öDõýÿí`0å.öýÿí”kä<öýÿíÐ0å.öýÿí”kä;ö}öPR3øÄP3æôP3æØ;ø âHQ3äQ3ì€â,Q3`0åD13îÐ0åD13ê{öDõýÿí`0å.öýÿí”kälõýÿíÐ0å.öýÿí”kä;ö}öT3øxR3æ¨R3æ´:ø âüR3äÄR3ì€âàR3`0åD13îÐ0åD13ê{öDõýÿí`0å.öýÿí”kä>öýÿíÐ0å.öýÿí”kä;ö}ö¸U3ø,T3æ\T3æ°>ø â°T3äxT3ì€â”T3`0åD13îÐ0åD13ê{öDõýÿí`0å.öýÿí”kämõýÿíÐ0å.öýÿí”kä;ö}öTW3øàU3æV3æì9ø âdV3ä,V3ä¬A/ä€âHV3´)å43ð8ÊäD13ê{öDõýÿílÔ ä(öýÿí8Êä)öaõýÿí´)å;ö}ö|W3ø873æ¤W3øP73æÌW3øèB/æ$X3øôW3æD5/ðHÿõLX3æ¬4/ðHý´)å@6/ì{öùÿõùÿõýÿí|räýÿí\oä=ö(öýÿíàä.öýÿí”kä-öýÿí´)å)ö/öýÿí`ä;öùÿõýÿí4läýÿí\öä=öýÿí4lä(ö-öÿÿìæ)önõ(öýÿíàä.öýÿí”kä-öýÿí´)å)ö%öýÿí`ä;öùÿõùÿõýÿí|räýÿír ä=öýÿí´)å/öýÿí`ä;öùÿõýÿí|räýÿíÌãä=öýÿî ä(öýÿí,Ôä)ö;öùÿõýÿí|räýÿí¨$å=öýÿíÌãä-öýÿír ä;öùÿõ;õ(öýÿír ä>öÿÿô)öùÿõ{öùÿõ;õ(öýÿí\öäjõýÿí4lä(ö-öÿÿìæ)ö)öùÿõýÿí4å[öýÿí\oä]ö=öýÿí4å[öýÿí\oä+öýÿír ä]ö;öùÿõ<õùÿõ{öùÿõýÿí4läýÿíÄä=öýÿí4å[öýÿí\oä]ö;öùÿõýÿí4å[öýÿí\oä]ö=öýÿí4å[öýÿí\oä+öýÿír ä]ö;öùÿõýÿí4å[öýÿí\oä]öeõýÿí\öä;öùÿõýÿí4å[öýÿí\oä]ögõ~öýÿí\öä&öýÿíÄä;öùÿõ}öùÿõ@õ(öýÿí|räýÿíä&å=öýÿí\oä+öÿÿìæ;öýÿíä&å<öýÿí¨$å;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿí4å[öýÿíä&å+öýÿír ä]ö;öùÿõ}öùÿõýÿí4läýÿíl`ä=öýÿí´)å%öýÿí`ä;öùÿõýÿí4läýÿí„Xä=öýÿí`ä-öýÿí´)å%öýÿí`ä;öùÿõ;õ(öýÿí\öäjõýÿí4lä(ö-öÿÿìæ)ö)öùÿõ{öùÿõýÿí4å[öýÿí\oä]ödõýÿíl`ä;öùÿõ;õ(öýÿí\oä<öýÿíÌãä-öÿÿìæ)öùÿõýÿí4å[öýÿí\oä]ögõýÿí4å[öýÿí\oä+öÿÿìæ]önõýÿí„Xä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí4läýÿíÄä=öýÿí4å[öýÿí\oä]ö;öùÿõýÿí4å[öýÿí\oä]ödõýÿíl`ä;öùÿõ;õ(öýÿí\oä<öýÿíÌãä-öÿÿìæ)öùÿõýÿí4å[öýÿí\oä]ögõýÿí4å[öýÿí\oä+öÿÿìæ]önõýÿí„Xä;öùÿõýÿí4å[öýÿí\oä]öeõýÿí\öä;öùÿõýÿí4å[öýÿí\oä]ögõ~öýÿí\öä&öýÿíÄä;öùÿõ}öùÿõ@õ(öýÿí|räýÿíä&å=öýÿí\oä+öÿÿìæ;öýÿíä&å<öýÿíÌãä-öÿÿìæ;öpõýÿíä&å)öùÿõ{öùÿõýÿí4å[öýÿíä&å]ödõýÿíl`ä;öùÿõýÿí4å[öýÿíä&å]ögõýÿí4å[öýÿíä&å+öÿÿìæ]önõýÿí„Xä;öùÿõ}öùÿõ;õ(öýÿí\oäkõýÿíÌãä-öÿÿìæ)öùÿõ{öùÿõ;õ(öýÿí\öäjõýÿí4lä(ö-öÿÿìæ)ö)öùÿõýÿí4å[öýÿíÌãä-öÿÿìæ]ödõýÿíl`ä;öùÿõ<õùÿõ{öùÿõýÿí4läýÿíÄä=öýÿí4å[öýÿíÌãä-öÿÿìæ]ö;öùÿõýÿí4å[öýÿíÌãä-öÿÿìæ]ödõýÿíl`ä;öùÿõýÿí4å[öýÿíÌãä-öÿÿìæ]öeõýÿí\öä;öùÿõýÿí4å[öýÿíÌãä-öÿÿìæ]ögõ~öýÿí\öä&öýÿíÄä;öùÿõ}öùÿõ}öùÿõ}ö È—3Ä3Ü3îâ☂3ö¤¶ ð$5/ôq ‚3âÿèäD‚3ì€âD5/;ê`‚3|W ä =/ì|‚3àä¬A/ð´)å@6/ì{öùÿõùÿõýÿí|räýÿí\oä=öýÿíàä.öýÿí”kä/öýÿí`ä;öùÿõýÿí4läýÿí\öä=öýÿí4lä(ö-öÿÿìæ)önõýÿíàä.öýÿí”kä%öýÿí`ä;öùÿõùÿõýÿí|räýÿír ä=öýÿí´)å/öýÿí`ä;öùÿõýÿí|räýÿíÌãä=öýÿî ä(öýÿí,Ôä+öýÿí´)å)ö;öùÿõýÿí|räýÿí¨$å=öýÿí\oä+öýÿír ä;öùÿõ;õ(öýÿír ä>öÿÿô)öùÿõ{öùÿõ@õ(öýÿí|räýÿíä&å=öýÿíÌãä-öÿÿìæ;öýÿíä&åmõýÿí¨$å;öqõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿí4å[öýÿíä&å-öýÿír ä]ö;öùÿõ}öùÿõýÿí4läýÿíl`ä=öýÿí`ä-öýÿí´)å%öýÿí`ä;öùÿõýÿí4läýÿí„Xä=öýÿí´)å%öýÿí`ä;öùÿõ@õ(öýÿí|räýÿíä&å=öýÿíÌãä-öÿÿìæ;öýÿíä&å>öýÿí¨$å;öqõýÿíä&å)öùÿõ{öùÿõýÿí4å[öýÿíä&å]öcõýÿí„Xä;öùÿõýÿí4å[öýÿíä&å]ögõýÿí4å[öýÿíä&å-öÿÿìæ]öoõýÿíl`ä;öùÿõ}öùÿõ;õ(öýÿír ä>öÿÿôhõýÿí\öäjõýÿí4lä(ö-öÿÿìæ)ö)öùÿõýÿí4å[öýÿí¨$å]öcõýÿí„Xä;öùÿõ<õùÿõ{öùÿõýÿí4läýÿíÄä=öýÿí4å[öýÿí¨$å]ö;öùÿõýÿí4å[öýÿí¨$å]öcõýÿí„Xä;öùÿõýÿí4å[öýÿí¨$å]öeõýÿí\öä;öùÿõýÿí4å[öýÿí¨$å]ögõ~öýÿí\öä&öýÿíÄä;öùÿõ}öùÿõ}ö Ô¯3ü—3˜3îïâl™3ö¤¶ ð$5/„L P˜3âÿèä|˜3ì€âD5/:ꘘ3|W ä =/ì™3ì€ ä´˜3ì â Ę3Ø â Ô˜3, â ä˜3™3 â ô˜3|\ ÿà4™3„: ä@6/ìP™3… ä@6/ð\ ä@6/ì{öùÿõ>õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿí|räýÿí, ä=öýÿí… ä-öýÿí„: ä;öùÿõýÿí|räýÿídä=öýÿí„: ä%öýÿí`ä;öùÿõýÿí|räýÿí” ä=öýÿí\ ä%öýÿí`ä;öùÿõýÿí|räýÿíÄä=öýÿí`ä-öýÿídä;öùÿõ;õ(öýÿí, ä>öýÿíÄä)öùÿõýÿí, ä=öýÿíÄä;öùÿõýÿíÄä=öýÿí`ä-öýÿí” ä;öùÿõ;õ(öýÿí, ä>öýÿíÄä)öùÿõýÿí, ä=öýÿíÄä;öùÿõýÿí4läýÿí$ ä=öýÿí4lä(ö-öÿÿìæ)önõýÿídä;öùÿõýÿí4läýÿíØæä=öýÿí4lä(ö-öÿÿìæ)ö;öùÿõýÿíÄä=ö(öýÿí`ä-ö(öýÿí„: ä+öýÿí, ä)ö%öýÿí`ä)ö;öùÿõ;õ(öýÿíÄä<öýÿí`ä)öùÿõýÿíØæädõýÿíÄä;öùÿõýÿí4läýÿí(r ä=öýÿí$ ä&öýÿíØæä;öùÿõýÿí4läýÿí¤÷ ä=öýÿíì€ ä[öýÿí„: ä/öýÿí`ä]ö&öýÿí(r ä;öùÿõ;õ(öýÿídä<öýÿí” ä)öùÿõ{öùÿõýÿí¤÷ äcõ(öýÿí” ä-öýÿídä)ö;öùÿõýÿí(r äcõ(öýÿí” ä-öýÿídä)ö;öùÿõ}öùÿõ<õ;õ(öýÿí” ä<öýÿídä)öùÿõ{öùÿõýÿí¤÷ ädõ(öýÿídä-öýÿí” ä)ö;öùÿõýÿí(r ädõ(öýÿídä-öýÿí” ä)ö;öùÿõ}öùÿõýÿí4lä&öýÿí¤­ä=öýÿí4å[öýÿí\ ä/öýÿí`ä]ö;öùÿõýÿí¤­äeõ~öýÿí(r ä;öùÿõýÿí¤­ägõýÿí¤÷ ä;öùÿõýÿí„: äaõýÿí, ä;öùÿõýÿí\ äaõýÿí, ä;öùÿõ}öùÿõ}ö е3°3 °3î6âÀ°3ö¤¶ ð$5/Ì \°3âÿè䈰3ì€âD5/9ꤰ3|W ä =/ðàä@6/ì{öùÿõýÿí|räýÿíŸä=öýÿíàä/öýÿí`ä;öùÿõýÿí4läýÿíðÞ ä=ö(öýÿí4lä)öÿÿìænõýÿíàä%öýÿí`ä;öùÿõýÿí4lä&öýÿí¤÷ ä=öýÿí4å[öýÿíŸä]ö;öùÿõ;õ(öýÿí¤÷ ä&öýÿíðÞ ä)öùÿõýÿí¤÷ äeõ~öýÿíðÞ ä;öùÿõ<õùÿõýÿí¤÷ ägõýÿíðÞ ä;öùÿõ}ö <Ì3¶3¶3îãâô¶3ö¤¶ ð $5/”jáX¶3âÿèä„¶3ì€âD5/8ê ¶3|W ä =/ì¼¶3àä@6/ìض3´)å@6/ð`0õ{öùÿõýÿí|räýÿíD’ä=öýÿíàä/öýÿí`ä;öùÿõýÿí|räýÿí¤“ä=ö(öýÿíàä+öýÿí´)å-öÿÿìæ)ö/öýÿí`ä;öùÿõýÿí4läýÿíT ä=öýÿí4lä(ö-öÿÿìæ)önõýÿíàä%öýÿí`ä;öùÿõýÿí4läýÿí ä=öýÿí4lä(ö-öÿÿìæ)ö;öùÿõýÿí4läýÿíÄä=öýÿí`ä-ö(öýÿíàä+öýÿí´)å)ö%öýÿí`ä;öùÿõ;õ(öýÿíÄä<öýÿí`ä)öùÿõýÿí ädõýÿíÄä;öùÿõ;õ(öýÿíD’äjõýÿí¤“ä)öùÿõ{öùÿõýÿíT äeõýÿí ä;öùÿõ;õ(öýÿí`0å)öùÿõýÿí4å[öýÿíD’ä]ögõýÿíT ä;öùÿõ<õùÿõýÿí4å[öýÿíD’ä]öeõ~öýÿíT ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí`0å)öùÿõ{öùÿõýÿí4å[öýÿíD’ä]ögõýÿíT ä;öùÿõ@õ(öýÿí|räýÿíä&å=öýÿíD’ä+öÿÿìæ;öýÿíä&å<öýÿí¤“ä;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿí4lä(ö-öÿÿìæ)ö;öùÿõýÿí4å[öýÿí¤“ä]ögõýÿí ä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí4å[öýÿíD’ä]öeõ~öýÿíT ä;öùÿõ@õ(öýÿí|räýÿíä&å=öýÿíD’ä+öÿÿìæ;öýÿíä&å<öýÿí¤“ä;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿí4lä(öÿÿô)ö;öùÿõýÿí4å[öýÿí¤“ä]öeõ~öýÿí ä;öùÿõ}öùÿõ}öùÿõ}ö ÄÑ3pÌ3ˆÌ3î0âDÍ3ö¤¶ ð $5/”jáÄÌ3âÿèäðÌ3ì€âD5/7ê Í3|W ä =/ì(Í3àä@6/ð`0õ{öùÿõýÿí|räýÿíŸä=öýÿíàä/öýÿí`ä;öùÿõýÿí4läýÿíðÞ ä=ö(öýÿí4lä)öÿÿìænõýÿíàä%öýÿí`ä;öùÿõ;õ(öýÿí`0å)öùÿõýÿí4å[öýÿíŸä]ögõýÿíðÞ ä;öùÿõ<õùÿõýÿí4å[öýÿíŸä]öeõ~öýÿíðÞ ä;öùÿõ}ö Ö3øÑ3Ò3î$â°Ò3ö¤¶ ð$5/œrLÒ3âÿèäxÒ3ì€âD5/6ê”Ò3|W ä =/ðàä@6/ì{öùÿõýÿí|räýÿíŸä=öýÿíàä/öýÿí`ä;öùÿõýÿí4läýÿíðÞ ä=ö(öýÿí4lä)öÿÿìænõýÿíàä%öýÿí`ä;öùÿõDõõ(öýÿí4å[öýÿíŸä]ö&öýÿíðÞ ä)ö;öùÿõ}ö ¸×3DÖ3\Ö3î âàÖ3ö¤¶ ð$5/,X ˜Ö3ÿèäÄÖ3ì€âD5/)î|W ä =/ì{öùÿõùÿõýÿí,Ôä=öÿÿô;öùÿõ}ö 0Ü3ì×3Ø3î'âˆØ3ö¤¶ ð$5/Ì @Ø3âÿèälØ3ì€âD5/(î|W ä =/ì{öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿí,Ôä)ö;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿíÀøä;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=ö~öýÿí4å[öýÿíä&å]ö;öùÿõ}ö $ê3dÜ3|Ü3î‹âÝ3ö¤¶ ð$5/ˆp¸Ü3âÿèääÜ3ì€âD5/'æãÝ3`0å,D/ðÐ0å,D/ì{öùÿõýÿí4läýÿí¬å ä=öýÿí4lä(öÿÿìæ)önõýÿí`0å.öýÿí”kä%öýÿí`ä;öùÿõýÿí4lä&öýÿîyä=öýÿí`0å.öýÿídzä.öýÿí4å[öýÿí`0å.öýÿí”kä/öýÿí`ä]ö;öùÿõõýÿíè*ä=öõ(öýÿîyä&öýÿí¬å ä)ö;öùÿõýÿí4läýÿíøå ä=öýÿí4lä(öÿÿìæ)önõýÿíÐ0å.öýÿí”kä%öýÿí`ä;öùÿõýÿí4lä&öýÿîjä=öýÿíÐ0å.öýÿídzä.öýÿí4å[öýÿíÐ0å.öýÿí”kä/öýÿí`ä]ö;öùÿõõýÿí°)ä=öõ(öýÿîjä&öýÿíøå ä)ö;öùÿõ;õ(öýÿíè*ä^öýÿí°)ä)öùÿõ{öùÿõ;õ(öýÿí°)ä)öùÿõ{öùÿõýÿîyägõýÿí¬å ä;öùÿõýÿîjäeõ~öýÿíøå ä;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿîyäeõ~öýÿí¬å ä;öùÿõýÿîjägõýÿíøå ä;öùÿõ}öùÿõ}öùÿõ}ö 8ð3Xê3pê3î7âë3ö¤¶ ð$5/ˆp¬ê3âÿèäØê3ì€âD5/&êôê3|W ä =/ð`0å G/ì{öùÿõ;õ(öOõkõ&öýÿí`0å)öùÿõ{öùÿõvõýÿíx†ävõýÿíˆpä(öýÿí¸ä,öýÿí`0å.öýÿí¸ä)ö;öùÿõvõýÿíx†ävõýÿíˆpä(öýÿí,Ôä,öýÿí`0å.öýÿí,Ôä)ö;öùÿõvõýÿíx†ävõýÿíˆpä(öýÿí4å,öýÿí`0å.öýÿí4å)ö;öùÿõùÿõ}öùÿõ}ö X÷3lð3„ð3îAâ@ñ3ö¤¶ ð$5/œêÀð3âÿèäìð3ä¬A/ä€âD5/%êñ3|W ä =/ì$ñ3„: ä¬A/ð… ä¬A/ì{öùÿõ;õ(öýÿí„: äjõýÿí… ä)öùÿõDõýÿí„: ä;öùÿõùÿõýÿí|räýÿí´)å=öýÿí|rä(öýÿíp ä(ö)ö-öýÿí… ä)ö;öùÿõýÿí|räýÿí, ä=öýÿí|rä(öýÿí… ä-öýÿí„: ä)ö;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõýÿíø¸å(öýÿí… ä,öýÿí, ä)ö;öùÿõýÿí,Ôäbõýÿí, ä;öùÿõùÿõDõýÿí„: ä;öùÿõùÿõ}ö ”ü3Œ÷3¤÷3î.âDø3ö¤¶ ð$5/œêà÷3âÿèä ø3ä¬A/ä€âD5/$ê(ø3|W ä =/ðзä¬A/ì{öùÿõùÿõýÿí|räýÿí´)å=öýÿí|rä(öýÿíp ä(ö)ö-öýÿíзä-öÿÿìæ)ö;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõýÿíø¸å(öýÿíзä+öÿÿìæ,öÿÿìæ)ö;öùÿõqõýÿí,Ôä;öùÿõùÿõDõýÿíзä;öùÿõùÿõ}ö °4Èü3àü3îHáÔý3ö¤¶ ð$5/üWý3âÿèäHý3ì€âD5/5êdý3|W ä =/ì€ý3зä¬A/ìœý3„: ä¬4/ì¸ý3… ä¬4/ð 7äHŠì{öùÿõýÿí|räýÿí´)å=öýÿí|rä(öýÿí… ä-öýÿí„: ä)ö;öùÿõ;õ(öýÿí´)åjõÿÿô)öùÿõDõ;öùÿõýÿí|räýÿí ä=öýÿí0 ä(ö)ö;öùÿõ;õ(öýÿí´)å>öýÿí ähõýÿí,Ôä>öýÿí ä-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿí”4â)ö;öùÿõùÿõùÿõ;õ(öýÿí,Ôä+öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí|räýÿí,ä=öýÿí|rä(öýÿíp ä(ö)ö-öýÿíзä)ö;öùÿõ;õ(öýÿí,ä>öÿÿô)öùÿõýÿíôq ä(öýÿíзä,öýÿí´)å)ö;öùÿõùÿõýÿí„L ä(öýÿí„: ä.öýÿídzärõýÿí4å,öýÿí„: ä.öýÿí”kä,öýÿí… ä.öýÿí”kä,öýÿíзä.öýÿí”kä)ö;öùÿõùÿõýÿí,Ôäaõýÿí´)å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿíT™ä=öýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí¸ä.öýÿí@!ä;öùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿíзä-öýÿíÌ' ä(ö)ö)ö;öùÿõ;õ(öýÿîräjõÿÿô)öùÿõýÿîrä=öýÿí·ä(öÿÿìæ)ö;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí ä/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí ä;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿíàä>öÿÿô)öùÿõýÿí„L ä(öýÿí\m ä,öÿÿô,öýÿíàä,öÿÿô)ö;öùÿõùÿõýÿí„L ä(öýÿí„: ä.öýÿídzärõýÿí4å,öýÿí„: ä.öýÿí”kä,öýÿí… ä.öýÿí”kä,öýÿíзä.öýÿí”kä)ö;öùÿõùÿõ;õ(öýÿíàä<öýÿí,Ôä)öùÿõýÿí„L ä(öýÿí\m ä,öýÿíàä,öýÿí,Ôä,öýÿíàä+öýÿí´)å)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõýÿí,Ôä=öýÿíT™ä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõ}ö&vector::insert length error 4ä4ü4îâð4ö¤¶ ð$5/üW84ÿèäd4ì€âD5/4ê€4|W ä =/ìœ4зä¬A/ì¸4„: ä¬A/ìÔ4… ä¬A/ð 7äHŠì{öùÿõýÿíüWä(öýÿíзä,öýÿíÌõ ä(öýÿí„: ä)ö,öýÿíÌõ ä(öýÿí… ä)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö (=4L 4d 4î(áL!4ö¤¶ ð$5/Hô  4âÿèäÌ 4ì€âD5/#êè 4|W ä =/ì!4зä¬A/ì !4´)å@6/ð`0åöýÿí ähõýÿí,Ôä>öýÿí ä-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿí =4â)ö;öùÿõùÿõùÿõ;õ(öýÿí,Ôä+öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí|räýÿí,ä=öýÿí|rä(öýÿíp ä(ö)ö-öýÿíзä)ö;öùÿõ;õ(öýÿí,ä>öÿÿô)öùÿõýÿíôq ä(öýÿíзä,öýÿí´)å)ö;öùÿõýÿí”jå(öýÿí|rä(öýÿíзä-öýÿíÌ' ä(ö)ö)ö,öýÿí´)å,öýÿí`0å)ö;öùÿõýÿí,Ôäaõýÿí´)å;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿíT™ä=öýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí¸ä.öýÿí@!ä;öùÿõýÿí|räýÿíàä=öýÿí|rä(öýÿíзä-öýÿíÌ' ä(ö)ö)ö;öùÿõ;õ(öýÿîräjõÿÿô)öùÿõýÿîrä=öýÿí·ä(öÿÿìæ)ö;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí ä/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí ä;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿíàä>öÿÿô)öùÿõýÿí„L ä(öýÿí\m ä,öÿÿô,öýÿíàä,öÿÿô)ö;öùÿõýÿí”jå(öýÿíàä,öýÿí´)å,öýÿí`0å)ö;öùÿõ;õ(öýÿíàä<öýÿí,Ôä)öùÿõýÿí„L ä(öýÿí\m ä,öýÿíàä,öýÿí,Ôä,öýÿíàä+öýÿí´)å)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõýÿí,Ôä=öýÿíT™ä;öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõ}ö&vector::insert length errorA4\=4t=4îâ0>4ö¤¶ ð$5/Hô°=4âÿèäÜ=4ä¬A/ä€âD5/"êø=4|W ä =/ì>4зä¬A/ð`0åöýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíPi4â)ö;öùÿõùÿõùÿõ;õ(öýÿí´)å>öýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿîrä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõ{öùÿõýÿíÀøä=öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿíÀøä;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿí\m ä[öýÿíä&å]ö;öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõ}öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõ}övector::reserve length errorã k4¤i4¼i4î â@j4ö¤¶ ð$5/°‚ øi4ÿèä$j4쀀âD5/î|W ä =/ê{öùÿõDõýÿí,Ôäjõÿÿô;öùÿõ}ö Àl4Lk4dk4î âèk4ö¤¶ ð$5/4Ö k4ÿèäÌk4ä@6/䀀âD5/î|W ä =/ê{öùÿõDõýÿí¸ä.öýÿí@!ä;öùÿõ}ö s4ôl4 m4î7âôm4ö¤¶ ð$5/ü Hm4âÿèätm4ì€âD5/êm4|W ä =/ì¬m4Œ0ä@6/ðè#áÈm4ð4ÿê{öùÿõ;õ(öýÿíŒ0ä>öýÿí¤ ä(ö)ö)öùÿõýÿíHôä(öýÿíp ä(ö)ö,öýÿíŒ0ä-öýÿí¤ ä(ö)ö,öýÿíè#å)ö;öùÿõ<õ;õ(öýÿíŒ0ä<öýÿí¤ ä(ö)ö)öùÿõýÿíœêä(öýÿíÌ' ä(ö)ö+öýÿí€×ä(öýÿíŒ0ä)ö,öýÿíp ä(ö)ö)ö;öùÿõ}ö $x4Ps4hs4î-âìs4ö¤¶ ð$5/0 ¤s4âÿèäÐs4ä@6/䀀âD5/î|W ä =/ê{öùÿõýÿí|räýÿí ä=öýÿí¸ä.öýÿí0 ä(ö)ö;öùÿõýÿí|räýÿíÈ ä=öýÿíûä<öýÿí|rä>övõýÿí ¸ ä(ö)ö;öùÿõ;õ(öýÿí ä>öýÿíÈ ä/öýÿí`ä)öùÿõDõýÿíÈ ä;öùÿõDõýÿí ä*öýÿí`ä;öùÿõ}ö œy4Xx4px4îâôx4ö¤¶ ð$5/¤ ¬x4ÿèäØx4ä@6/䀀âD5/î|W ä =/ê{öùÿõDõýÿí,Ôä;öùÿõ}ö °{4Ðy4èy4î âz4ö¤¶ ð$5/Ôî$z4ÿèätz4äPz4䀀âD5/ê â@`z4è¬4/ì|W ä =/ê{öùÿõDõýÿ픩ä(öýÿíÌ' ä(ö)ö)ö;öùÿõ}ö Ä}4ä{4ü{4î â¤|4ö¤¶ ð$5/Ôî8|4ÿèäˆ|4äd|4ä€âD5/ê â@t|4è¬A/ì|W ä =/ì{öùÿõDõýÿíøÜ ä(öýÿíÌ' ä(ö)ö)ö;öùÿõ}ö ´4ø}4~4î â”~4ö¤¶ ð$5/ O L~4ÿèäx~4äPz4䀀âD5/î|W ä =/ê{öùÿõDõýÿ픩ä(öýÿíp ä(ö)ö)ö;öùÿõ}ö¤4è4á€4î â„€4ö¤¶ ð$5/ O <€4ÿèäh€4äd|4ä€âD5/î|W ä =/ì{öùÿõDõýÿíøÜ ä(öýÿíp ä(ö)ö)ö;öùÿõ}ö ă4Ø4ð4îât‚4ö¤¶ ð$5/p ,‚4ÿèäX‚4ä¬4/䀀âD5/ î|W ä =/ê{öùÿõùÿõDõýÿíÌõ ä(öOõ,öýÿí,Ôä)ö;öùÿõùÿõ}ö ä…4øƒ4„4î┄4ö¤¶ ð$5/p L„4ÿèäx„4ä¬A/ä€âD5/ î|W ä =/ì{öùÿõùÿõDõýÿí¤Ìä(öOõ,öýÿí,Ôä)ö;öùÿõùÿõ}ö ˆ4†40†4îâ´†4ö¤¶ ð$5/Ì' l†4ÿè䘆4ä¬4/䀀âD5/ î|W ä =/ê{öùÿõùÿõDõýÿíÌõ ä(öOõ,öÿÿô)ö;öùÿõùÿõ}ö $Š48ˆ4Pˆ4îâÔˆ4ö¤¶ ð$5/Ì' Œˆ4ÿè丈4ä¬A/ä€âD5/ î|W ä =/ì{öùÿõùÿõDõýÿí¤Ìä(öOõ,öÿÿô)ö;öùÿõùÿõ}ö Œ4XŠ4pŠ4î âôŠ4ö¤¶ ð $5/è„ᬊ4ÿèäØŠ4äô˜3䀀âD5/ î|W ä =/ê{öùÿõùÿõDõýÿíô ä(öýÿí¸ä)ö;öùÿõùÿõ}ö ìš4HŒ4`Œ4î‘â84ö¤¶ ð$5/´BœŒ4âÿèäÈŒ4ì€âD5/3êäŒ4|W ä =/í4„: ä¬4/ì4… ä¬4/ð 7äHŠì{öùÿõùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)ö(öýÿí… ä-öýÿí„: ä)ö;öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíК4â)ö;öùÿõùÿõ;õ(öýÿí´)å>öýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿîrä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõýÿí,Ôä=öýÿí´)å;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõùÿõýÿí„L ä(öýÿí„: ä.öýÿídzärõýÿí4å,öýÿí„: ä.öýÿí”kä,öýÿí… ä.öýÿí”kä,öÿÿô)ö;öùÿõùÿõ}ö&vector::assign length errorž4 ›48›4îâœ4ö¤¶ ð$5/´Bt›4ÿèä ›4ì€âD5/2ê¼›4|W ä =/ìØ›4„: ä¬A/ìô›4… ä¬A/ð 7äHŠì{öùÿõýÿí´Bä(öýÿíÌõ ä(öýÿí„: ä)ö,öýÿíÌõ ä(öýÿí… ä)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö \®4<ž4Tž4î¢âŸ4ö¤¶ ð$5/DÀž4âÿè伞4ì€âD5/êØž4|W ä =/ìôž4´)å@6/ðx.åöýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí@®4â)ö;öùÿõùÿõùÿõ;õ(öýÿí´)å>öýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿîrä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõýÿí,Ôä=öýÿí´)å;öùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõýÿí´)å=öýÿî ä(öýÿí´)å)ö;öùÿõýÿí4läýÿíØ.å=öýÿíx.å?öýÿí4lä(ö-öÿÿìæ)ö:öýÿí4lä(öÿÿô)ö;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿí´)å;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿíØ.å;öùÿõ}öùÿõ}ö&vector::assign length error8¿4®4¨®4îªâH¯4ö¤¶ ð$5/˜Rä®4âÿèä¯4ä G/ä€âD5/ê,¯4|W ä =/ð`0å G/ê{öùÿõ;õ(öOõkõ&öýÿí`0å)öùÿõ{öùÿõùÿõ;õ(öýÿí4Öä(ö)ö<öýÿí`0å.öýÿí¤ ä(ö)ö)öùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿîrä=öýÿí·ä(öýÿí`0å.öýÿí¤ ä(ö)ö)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõýÿí,Ôä=öýÿí`0å.öýÿí¤ ä(ö)ö;öùÿõ;õ(öýÿí`0å.öýÿí¤ ä(ö)ö>öÿÿô)öùÿõ{öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿí`0å.öýÿí¤ ä(ö)ö)ö;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿíÀøä;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿí`0å.öýÿí4å[öýÿíä&å]ö;öùÿõ}öùÿõ}öùÿõDõ*öOõ;öùÿõ}ö `Â4l¿4„¿4îâÀ4ö¤¶ ð$5/èAÀ¿4ÿèäì¿4ì€âD5/1î|W ä =/ì{öùÿõ;õ(öýÿí4åkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí4å,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõ}ö Ä4”Â4¬Â4î â0Ã4ö¤¶ ð$5/€OèÂ4ÿèäÃ4ì €âD5/î|W ä =/ì{öùÿõùÿõýÿíèAä(ö)ö;öùÿõ}ö 8Î4<Ä4TÄ4î_â,Å4ö¤¶ ð$5/œ>Ä4âÿèä¼Ä4ì€âD5/0êØÄ4|W ä =/ìôÄ4„: ä¬4/ìÅ4… ä¬4/ð 7äHŠì{öùÿõýÿí|räýÿí´)å=öýÿí|rä(öýÿí… ä-öýÿí„: ä)ö;öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíÎ4"â)ö;öùÿõùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõùÿõýÿí„L ä(öýÿí„: ä.öýÿídzärõýÿí4å,öýÿí„: ä.öýÿí”kä,öýÿí… ä.öýÿí”kä,öÿÿô)ö;öùÿõùÿõýÿí,Ôä=öýÿí´)å;öùÿõ}öùÿõ}ö vector::construction length errorâ TÑ4lÎ4„Î4îâ\Ï4ö¤¶ ð$5/œ>ÀÎ4ÿèäìÎ4ì€âD5//êÏ4|W ä =/ì$Ï4„: ä¬A/ì@Ï4… ä¬A/ð 7äHŠì{öùÿõýÿíœ>ä(öýÿíÌõ ä(öýÿí„: ä)ö,öýÿíÌõ ä(öýÿí… ä)ö,öýÿí@jä(ö)ö)ö;öùÿõ}ö  Ü4ˆÑ4 Ñ4îlâ\Ò4ö¤¶ ð$5/œ>ÜÑ4âÿèäÒ4ì€âD5/.ê$Ò4|W ä =/ì@Ò4´)å@6/ðfäöýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿí|Ü4"â)ö;öùÿõùÿõ;õ(öýÿí´)å>öÿÿô)öùÿõ{öùÿõýÿí,Ôä=öýÿí´)å;öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõýÿí4läýÿíØ.å=öýÿífä?öýÿí4lä(ö-öÿÿìæ)ö:öýÿí4lä(öÿÿô)ö;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿíÀøä;öpõýÿíä&å)öùÿõýÿí4å[öýÿíä&å]ö=öýÿíØ.å;öùÿõ}öùÿõ}ö vector::construction length errorâ ¼æ4ÔÜ4ìÜ4îbâŒÝ4ö¤¶ ð$5/ôO(Ý4âÿèäTÝ4äœBä€âD5/êpÝ4|W ä =/ð`0å G/ê:öýÿí¸ä(öýÿíˆ_ä(öýÿí`0å.öýÿí¸ä)ö,öýÿí`0å.öýÿí,Ôä)ö,öùÿõùÿõýÿí,Ôä(öýÿí`0å.öýÿí,Ôä)ö,öùÿõýÿí4å(öÿÿô)öùÿõ{öùÿõ;õ(öýÿí¸ä.öýÿí@!ä>öÿÿô)öùÿõ{öùÿõýÿí¸ä.öýÿí@!ä=öýÿí·ä(öýÿí¸ä.öýÿí@!ä)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí`0å.öýÿí4å,öýÿí`0å.öýÿí4å+öýÿíÀøä,öýÿí4å)ö;öùÿõ}öùÿõ}ö ë4ðæ4ç4î!ãè4ö¤¶ ð$5/ôODç4ÿèäpç4äœBä€âD5/êŒç4|W ä =/ì¨ç4´)å@6/ìÄç4føÄ"åàç4ê âðç4 ä ì:öýÿí¸ä(öýÿíˆ_ä(öýÿíÄ"å)ö)ö,öùÿõùÿõýÿí,Ôä(öÿÿô)ö,öùÿõýÿí4å(öÿÿô)öùÿõ{öùÿõýÿíœ>ä(öýÿí´)å,öýÿífä)ö;öùÿõ}ö tî4Lë4dë4îâLì4ö¤¶ ð$5/ôO ë4PÿèäÌë4äœBä€âD5/êèë4|W ä =/ìì4´)å@6/ðf ì4ð4ÿê:öýÿí,Ôä(öÿÿô)ö,öùÿõýÿí4å(öÿÿô)öùÿõ{öùÿõýÿíœ>ä(öýÿí´)å,öýÿífä)ö;öùÿõ}ö Øñ4¨î4Àî4îâ€ï4ö¤¶ ð$5/ôOüî4Pÿèä(ï4äœBä€âD5/êDï4|W ä =/ðÄ"å`ï4ê âpï4 ä ì:öýÿí¸ä(öýÿíˆ_ä(öýÿíÄ"å)ö)ö,öùÿõùÿõýÿí,Ôä(öÿÿô)ö,öùÿõýÿí4å(öÿÿô)öùÿõ{öùÿõ}ö ô4 ò4$ò4îâ¨ò4ö¤¶ ð$5/ôO`ò4ÿèäŒò4äœBä€âD5/î|W ä =/ì:öýÿí,Ôä(öÿÿô)ö,öùÿõýÿí4å(öÿÿô)öùÿõ{öùÿõ}úDô4\ô4î8âàô4ö¤¶ ð$5/4¦˜ô4âÿèäÄô4쀀âD5/*î|W ä =/ê{öùÿõ;õ(öýÿí¸ä.öýÿí@!äjõÿÿôiõýÿí4åkõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿí¸ä.öýÿí@!äkõÿÿôiõýÿí4åjõÿÿô)öùÿõDõ[õ;öùÿõ;õ(öýÿí¸ä.öýÿí@!ä*öýÿí`ä<öýÿí,Ôä)öùÿõDõ[õ;öùÿõDõZõ;öùÿõ}öHú4øØQ/è|ú4øpú4æĘ3æû4ø¤ú4æ°ú4æ â Àú4 | â Ðú4, âàú4áû4 â ðú4|\ ÿà<û4ø,D/èdû4ø¬A/èŒû4ø¬4/èäû4ø´û4æ,D/ðHù<ü4ø ü4æ¬A/ðHù”ü4ødü4æ¬4/ðHùÈü4ø¼ü4æ@6/æüü4øðü4æ43æ0ý4ø$ý4æðú4ædý4øXý4æÔ6/æ˜ý4øŒý4æ´˜3æÌý4øÀý4æ¬A/çþ4øôý4æ¬4/æ4þ4ø(þ4æd|4æhþ4ø\þ4æPz4æþ4ø$ò4æ¸þ4øÀî4æàþ4ødë4æÿ4øç4æ0ÿ4øìÜ4æXÿ4ø¬Â4æ€ÿ4ø¨®4æ¨ÿ4øTž4æÐÿ4øpŠ4æøÿ4øPˆ4æ 5ø0†4æH5ø„4æp5øð4æ˜5ù€4æÀ5ø~4æè5øü{4æ5øèy4æ85øpx4æ`5øhs4æˆ5ø m4æ°5ødk4æØ5ø¼i4æá5øÀ[4æ(5ølY4æP5ø¸V4æx5ø”R4æ 5øÐN4æÈ5øÈL4æð5ø`J4æ5ø(H4æ@5øE4æh5ølC4æ5ødA4æ¸5øt=4æà5ød 4æ5ø¤÷3æ05ø„ð3æX5øpê3æ€5ø|Ü3æ¨5øØ3æÐ5ø\Ö3æø5ø\ô4æ 5øœ5/æH5ø¤6/æp5ø¼6/æÔ5ø˜5æá$5/`@6/ÿè¬5ø˜5ü5â è(5€5øèT5ü:îä$4üIê°ú4øâÔ5ø Ñ4æü5ø„Î4æ$5øTÄ4æL5ø„¿4æt5ø8›4æœ5ø`Œ4æÄ5øü4æì5øàü3æ5øÒ3æ<5øˆÌ3æd5ø¶3æŒ5ø °3æ´5ø˜3æÜ5øÜ3æ 5ø A/æ, 5øœövõýÿí6ä>ö(ö)ö)ö;öùÿõ}þ˜5â5ˆp âÈ5üÐ5ò°5 âp5ü5òX5Ì5îð5ätÖîäè5ìâl5`0å5ê â5 ä â 81$5H5ä85è ðâ\5è äêÐ0åˆ5ê â˜5 ä â 81¨5¼5ä85ìâ\5ð 5âh5´: âP5ü(5ò85övõýÿí6ä>ö(ö)ö)ö;öùÿõ}ú ìÜ4 .5€Oä ¬Â4°.5˜Rä)¨®4$25DÀ25À.5$5/DÀü.5ëŒ/5ä ìîä(/5ìâD5/ìD/5|W ä =/ìp/5„: ä`/5ì æè… ä`/5ìv5/äÜ/5âè)5DÀâô/5üÀ.5öôã âì{öùÿõýÿípë ä(öýÿí„: ä,öýÿí… ä,öýÿí´qä<öýÿíûä<öýÿíôã ä>övõýÿí6ä>ö(ö)ö)ö;öùÿõ}ú Tž4425è„åpŠ4L25Ì' D25Pˆ4ä0†4d25p \25„4äð4|25 O t25á€4ä~4”25ÔîŒ25ü{4ä èy4¤25¤ ä px4´250 ä hs4Ä25ü ä m4Ô254Öä dk4ä25°‚ ä ¼i4ô25ÈLäÀ[4 35˜535lY4ä¸V4$35t;35”R4äÐN4<35 Ú435ÈL4ä`J4T35°’ L35(H4ä E4d35ü„ä lC4t35ôw ädA4<75Hô„35t=4Œ35d 4ä”35$5/HôÐ35ë|45ä˜ìîäü35ìâD5/ì45|W ä =/ì445зä¬A/ì`45„: äP45ì æè… äP45ìv5/äÌ45âŒ/5Hôâä45ü”35öôã âì{öùÿõýÿí„, ä(öýÿíзä,öýÿí„: ä,öýÿí… ä,öýÿí´qä<öýÿíûä<öýÿíôã ä>övõýÿí6ä>ö(ö)ö)ö;öùÿõ}öT75œêL75¤÷3ä„ð3l75ˆpd75pê3ä|Ü3„75Ì |75Ø3ä °3”75,X ä \Ö3¤754¦ä \ô4´75¸ä œ5/Ä75,Ôä ¤6/Ô754å ¼6/ä75`ä)˜5D?5$¼;5ô75$5/$085ë,95äèìîä\85ìâD5/ìx85|W ä =/ì¤85„: ä”85ì æäÀ85… ä”85ð 7äÜ85ì âØQ/ì85æ95è4êþv5/ä|95â|45$â”95üô75öôã âì{öùÿõýÿíœ>ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;öùÿõ}úÄ;5$5/$á<5ëü<5äLíîä,<5ìâD5/ìH<5|W ä =/ìt<5„: äd<5ì æä<5… äd<5ð 7ä¬<5ì âØQ/¼<5æÐ<5è4ÿêv5/äL=5â,95$âd=5üÄ;5öôã âì{öùÿõýÿíœ>ä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}ö$E5T?5$5/œ>?5âî<@5äêîä¼?5ìâD5/ìØ?5|W ä =/ì@5„: äô?5ì æä @5… äô?5ð 7ä,Žìv5/äŒ@5âü<5œ>0â¤@5üT?5öôã âì{öùÿõùÿõQõùÿõ{öùÿõùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿíèAä(ö)ö;öùÿõPõ;öùÿõ}öùÿõùÿõ}ö,E5 Ñ44E5„Î4ä)TÄ4œL5pë I5LE5$5/pë ˆE5ë„F5ä¬êîä´E5ìâD5/ìÐE5|W ä =/ìüE5„: äìE5ì æäF5… äìE5ð 7ä4F5ì âØQ/DF5æXF5è4êþv5/äÔF5â<@5pë âìF5üLE5öôã âì{öùÿõýÿíDÀä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;öùÿõ}úI5$5/pë XI5ëTJ5äëîä„I5ìâD5/ì I5|W ä =/ìÌI5„: ä¼I5ì æäèI5… ä¼I5ð 7äJ5ì âØQ/J5æ(J5è4ÿêv5/ä¤J5â„F5pë â¼J5üI5öôã âì{öùÿõýÿí´Bä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}ö%˜d5´BR5¬L5$5/´BèL5ë”M5ä°ëîäM5ìâD5/ì0M5|W ä =/ì\M5„: äLM5ì æäxM5… äLM5ð 7ä,Žìv5/ääM5âTJ5´B,âüM5ü¬L5öôã âì{öùÿõýÿíœäýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿíœä&öýÿí¸_ä=öýÿíxÃä;öùÿõýÿí´Bä(öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}öˆd5$R5$5/´B`R5âî S5ä¼ïîäŒR5ìâD5/ì¨R5|W ä =/ìÔR5„: äÄR5ì æäðR5… äÄR5ð 7äàŒìv5/ä\S5â”M5´BµâtS5ü$R5ö, âì{öùÿõùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí´)å>öýÿí0 ä(ö)ö)öùÿõùÿõPõýÿíœf ä(öüÿíld5â)ö;öùÿõùÿõ;õ(öýÿí´)ålõýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí,Ôä=öÿÿô;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿí´)å;öpõýÿíä&å,öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí|räýÿîrä=öýÿí·ä(öýÿí´)å)ö;öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿîrä)ö;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿíÀøä)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö)ö;öùÿõýÿí,Ôä=öÿÿô;öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ@õ(öýÿí|räýÿíä&å=öÿÿô;öýÿíä&å<öýÿí´)å;öpõýÿíä&å,öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}öùÿõ}ö"vector::assign length errord58›4ä)`Œ4l5„, ¼h5¨d5$5/„, äd5ëüe5äTðîäe5ìâD5/ì,e5|W ä =/ìHe5зä¬A/ìte5„: äde5ì æäe5… äde5ð 7ä¬e5ì âØQ/¼e5æÐe5è4êþv5/äLf5â S5„, âdf5ü¨d5öôã âì{öùÿõýÿíHôä(öýÿíзä,öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;öùÿõ}úÄh5$5/„, ái5ëj5äüûîä,i5ìâD5/ìHi5|W ä =/ìdi5зä¬A/ìi5„: ä€i5ì æä¬i5… ä€i5ð 7äÈi5ì âØQ/Øi5æìi5è4ÿêv5/ähj5âüe5„, â€j5üÄh5öôã âì{öùÿõýÿíüWä(öýÿíзä,öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;öùÿõ}ö%„‹5üW\r5 l5$5/üWÜl5ë¤m5ä¸üîäm5ìâD5/ì$m5|W ä =/ì@m5зä¬A/ìlm5„: ä\m5ì æäˆm5… ä\m5ð 7ä,Žìv5/äôm5âj5üW.â n5ü l5öôã âì{öùÿõýÿíœäýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿíè„å(ö)ö)ö;öùÿõ!õýÿíœä&öýÿí¸_ä=öýÿíxÃä;öùÿõýÿíüWä(öýÿíзä,öýÿí¸_ä.öýÿíÌ' ä(ö)ö,öýÿí¸_ä.öýÿíp ä(ö)ö,öýÿí@jä(ö)ö)ö;öùÿõ}öt‹5dr5$5/üW r5âîhs5äPýîäÌr5ìâD5/ìèr5|W ä =/ìs5зä¬A/ì0s5„: ä s5ì æäLs5… ä s5ð 7äàŒìv5/ä¸s5â¤m5üWûâÐs5üdr5ö, âì{öùÿõýÿí|räýÿí´)å=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿí„: ä,öýÿí… ä)ö;öùÿõ;õ(öýÿí´)åjõÿÿô)öùÿõDõ;öùÿõýÿí|räýÿí ä=öýÿí0 ä(ö)ö;öùÿõ;õ(öýÿí´)å>öýÿí ähõýÿí,Ôä>öýÿí ä-öýÿí´)å)öùÿõùÿõPõýÿíœf ä(öüÿíX‹5â)ö;öùÿõùÿõùÿõ;õ(öýÿí,Ôä+öýÿí´)å>öýÿí4Öä(ö)ö)öùÿõ{öùÿõýÿí|räýÿíT™ä=öýÿí,Ôä+öýÿí´)å;öùÿõýÿí|räýÿîrä=öýÿí¸ä.öýÿí@!ä;öùÿõ;õ(öýÿîräjõÿÿô)öùÿõýÿîrä=öÿÿìæ;öùÿõ>õ(öýÿíT™ä>öýÿîrä)öùÿõ;õ(öýÿîrä<öýÿí ä/öÿÿìæ)öùÿõýÿîrä^õÿÿìæ;öùÿõ<õùÿõýÿîrä=öýÿí ä;öùÿõýÿí€ø äýÿí\m ä=öýÿí4å;öùÿõýÿí4å=öýÿí¸ä.öýÿí¬±ä(öýÿî ä(öýÿîrä)ö)ö;öùÿõ;õ(öýÿí\m äkõÿÿô)öùÿõ{öùÿõýÿí|räýÿíÀøä=öýÿî ä(öýÿí¸ä.öýÿí@!ä)ö;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí\m ä,öýÿí\m ä+öýÿíÀøä,öýÿí4å)ö;öùÿõýÿí¸ä.öýÿíÔ ä(öýÿí\m ä,öýÿíÀøä)ö;öùÿõ}öùÿõýÿí¸ä.öýÿí@!ä=öýÿîrä;öùÿõ}öùÿõýÿí|räýÿí,ä=öýÿí|rä(öýÿíp ä(ö)ö-öýÿíзä)ö;öùÿõ;õ(öýÿí,ä>öÿÿô)öùÿõýÿíôq ä(öýÿíзä,öýÿí´)å)ö;öùÿõýÿí,Ôäaõýÿí´)å;öùÿõvõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿí… ä,öýÿíзä)ö;öùÿõ}ö"vector::insert length error|‹5ü4ä àü3”‹5èAä „¿4¤‹5œrä Ò3¼‹5”já´‹5ˆÌ3ä ¶3Ì‹5„L ä ˜3Ü‹5ôq ä Ü3ì‹5ø¸å A/ü‹5¬€äœöýÿíÐ0å.öýÿí”kä;ö}öÔµ5øH´5æx´5æ°>ø âÌ´5ä”´5ì€â°´5`0åP5îÐ0åP5ê{öDõýÿí`0å.öýÿí”kämõýÿíÐ0å.öýÿí”kä;ö}öp·5øüµ5æ,¶5æì9ø ‶5äH¶5ä¬4/ä€âd¶5´)å43ð8ÊäP5ê{öDõýÿíD)ä(öýÿí8Êä)öaõýÿí´)å;ö}ö˜·5øà”5æÀ·5øø”5æè·5øˆ5æü¸5æD5/ðHùX¸5LäP¸5ì/âp¸5ôOh¸5/ä 4/ˆ¸5˜R€¸5P-/ä L)/˜¸5  ä´&/°¸5 è¸5|$/ä ˆ/À¸55äà/äì;åD/äü¸5ì€âì/ê¹5|W äd/ð ¸Ç4¹5`¹5ì4ÿê âp¹5æ ì䬹5äœBä€â”/ìع5|W äȹ5ì â”/è ¸Çô¹5l/ì4ÿî(º5Ü/ôOlº5âHÿæ 4/æä˜º5äœBäã”/ì´º5èȹ5øк5ê â”/ ä"H¼5˜R˜»5ðº5Ü/˜R4»5HÿæP-/æä`»5äк5ä€â”/ì|»5|W äȹ5ð`0åк5î »5Ü/˜Rä»5HÿæL)/æä¼5äк5ä€â”/ì,¼5|W äȹ5ð`0ål/ì"”½5 Ãä¼5X¼5Ü/ ܼ5Hÿæ|$/æäȼ5쀀â”/ð|W äȹ5îì¼5Ü/ Ã0½5Hÿæˆ/æä\½5ì€â”/ìx½5|W äȹ5ðP#õ0¾55䤽5Ü/5è½5Hÿæà/æä¾5äl/䀀â”/ð|W äȹ5î Ï ä@¾5Ü/ Ï „¾5Hÿæ´&/æä°¾5äl/äP€€â”/ð|W äȹ5òÄ/èð¾5ôàä|/Èj6ôOj6á¿5 /ôOàh6HÿæD¿5怿5ôOÀg6ÿè ¿5¸˜äÁ5äXg6ãáÌkäÀ¿5äXf6ãáä ¿5ôpäì/è À5¬/0À5è d6äP#äë tØ5dÀ5|À5îiâœÎ5öP#äë ¿5`³ ¸À5âÿèääÀ5ì€âÀ¿5æâpÎ5`0æÁ5ì âÁ5æä€¿5¸˜èhÁ5èápäÀ¿5ò¿5èÄ/¼Á5è¬Ç5â€Á5@EâÁ5èæôà˜Á5è âì/¨Á5èÁ5èÄ5äðÁ5î âèÂ5ò€¿5Ä*,Â5ÿèäXÂ5ì€âÁ5ê„Â5|W ätÂ5ì âÁ5èè#å Â5ìâ ¿5¸Â5ä´)ã ÐÂ5Äß Â5ëãœ{ Â5è{öýÿíôàä.öýÿí Ãä(öõ(öýÿíè#å)ö)ö;ö}öàÅ5ä<Ä5î âÀÄ5ò€¿5xÄ5ÿèä¤Ä5ä Â5䀀âÁ5î|W ätÂ5ê{öDõýÿí´)ä(öýÿíôàä.öýÿí Ãä(ö)ö)ö;ö}þD¿5îâÆ5ò:öýÿí —ä(öýÿí0Ãä)ö,öýÿí@Eå(öýÿíÜì ä)ö,öýÿíôàä(öýÿíðy ä)ö{ö}ö¨Í5øÔÇ5æä,È5 —ètÈ5èápäÁ5ò¿5èxÉ5|Ì5èXÍ5 ¿5 —äÔÇ5äLÈ5ãádÈ5 —ä\È5ÔÇ5âŒÈ5P¤ätÈ5æP¤áÁ5ìôOäœÈ5,È5ôOØÈ5ÿèäÉ5ì€âÔÇ5ê0É5|W ä É5ì âÔÇ5è0ÃLÉ5áÁ5ì4ÿêâÀÉ5 —èÊ5èápèÈ5Þ/äèô/ —äxÉ5äàÉ5ãáøÉ5 —äðÉ5xÉ5â Ê5P¤äÊ5æP¤l/è"ÌË5ôOË50Ê5ÀÉ5ôOtÊ5HÿæœÈ5æä Ê5äœBä€âxÉ5ìÌÊ5|W ä¼Ê5ì âxÉ5è 0ÃèÊ5l/ì4ÿîË5ÀÉ5ôOXË5ÿèä„Ë5ìãxÉ5ì Ë5è¼Ê5ø¼Ë5ê âxÉ5 è˜RäÜË5ÀÉ5˜RÌ5ÿèäDÌ5ä¼Ë5äãxÉ5ì`Ì5è¼Ê5ø¼Ë5òœÈ5îâ°Ì5ò:öýÿíP¤ä(öýÿí0Ãä)ö{ö}ö€Í5øtÈ5æüœÈ5æÐÍ5øhÁ5æøÍ5ø€Á5æ Î5øD¿5æHÎ5ø<Ä5æüðÁ5æäŒDäŒÎ5ì ãÁ5 ä{öùÿõýÿí¸˜ä*öýÿíÐ0å=öýÿí`0årõýÿíP¤ä;öùÿõ;õ(öýÿíŒDäjõýÿí`0å)öùÿõýÿíŒDä=öýÿíÐ0å;öùÿõýÿí`0årõýÿíP¤ä=öýÿíÐ0årõýÿí@Eå;öùÿõ;õ(öýÿíÐ0årõýÿí@Eåkõÿÿô)öùÿõýÿíÐ0årõýÿí@Eårõýÿíôàä=öýÿí`0å;öùÿõýÿíÐ0årõýÿíôàä=öýÿí`0årõýÿíôàä;öùÿõ;õ(öýÿí`0åjõýÿí`0årõýÿíôàärõýÿíP¤ä)öùÿõýÿí`0årõýÿíôàärõýÿíP¤ä=öýÿíÐ0å;öùÿõ<õùÿõýÿí`0årõýÿíôàärõýÿí@Eå=öýÿíÐ0å;öùÿõýÿíÐ0årõýÿí@Eå=öýÿí`0å;öùÿõýÿí`0årõýÿíôàä=öýÿíÐ0å;öùÿõ}ö 8ã5¨Ø5ÀØ5îiâ`Ù5öP#äë ¿5ÚüØ5âÿèä(Ù5ì€âÀ¿5æâDÙ5`0æÁ5ðŒDäŒÎ5ì{öùÿõýÿí¸˜ä*öýÿíÐ0å=öýÿí`0årõýÿí@Eå;öùÿõ;õ(öýÿíŒDäjõýÿí`0å)öùÿõýÿíŒDä=öýÿíÐ0å;öùÿõýÿí`0årõýÿí@Eå=öýÿíÐ0årõýÿíP¤ä;öùÿõ;õ(öýÿíÐ0årõýÿíP¤äkõÿÿô)öùÿõýÿíÐ0årõýÿíP¤ärõýÿíôàä=öýÿí`0å;öùÿõýÿíÐ0årõýÿíôàä=öýÿí`0årõýÿíôàä;öùÿõ;õ(öýÿí`0åjõýÿí`0årõýÿíôàärõýÿíP¤ä)öùÿõýÿí`0årõýÿíôàärõýÿíP¤ä=öýÿíÐ0å;öùÿõ<õùÿõýÿí`0årõýÿíôàärõýÿí@Eå=öýÿíÐ0å;öùÿõýÿíÐ0årõýÿíP¤ä=öýÿí`0å;öùÿõýÿí`0årõýÿíôàä=öýÿíÐ0å;öùÿõ}ö l26lã5„ã5îCá$ä5öP#äë ¿5( Àã5âÿèäìã5ì€âÀ¿5æâä5á1æÁ5ðŒDåÁ5ì{öùÿõùÿõýÿí¸˜ä*öýÿíÐ0å=öýÿî1å;öùÿõ;õ(öýÿî1årõýÿíP¤äkõÿÿôiõýÿî1årõýÿí@Eåkõÿÿô)öùÿõýÿíôjä(ö(ö!õýÿí¸˜ä*ö&ö)öýÿíÐ0å)ö;öùÿõýÿí¸˜ä*öýÿí`0å=öýÿíÐ0årõýÿíP¤äkõÿÿô?öýÿíÐ0årõýÿíP¤ä:öýÿíÐ0årõýÿí@Eå;öùÿõýÿí¸˜ä*öýÿí± ä=öýÿíÐ0årõýÿíôàä;öùÿõ;õ(öýÿí`0åkõÿÿô)öùÿõýÿí`0årõýÿíôàä=öýÿí± ä;öùÿõõýÿí< ä;öùÿõ;õ(öýÿíÐ0åjõýÿíÐ0årõýÿíôàärõýÿíP¤ä)öùÿõ{öùÿõýÿíÐ0årõýÿíôàärõýÿíP¤ä=öýÿí`0å;öùÿõýÿí< ä=öZõ;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿíÐ0årõýÿíôàärõýÿí@Eå=öýÿí`0å;öùÿõýÿí< ä=ö[õ;öùÿõ}öùÿõõýÿíH­ä=öýÿíÐ0årõýÿíä(ö)öjõýÿíÄßä;öùÿõ;õ(öýÿíÐ0åkõýÿî1å)öùÿõ{öùÿõýÿíÐ0årõýÿíôàä=öýÿî1årõýÿíôàä;öùÿõ;õ(öýÿî1åjõýÿíÐ0årõýÿíôàärõýÿíP¤ä)öùÿõýÿíÐ0årõýÿíôàärõýÿíP¤ä=öýÿíÐ0å;öùÿõ<õùÿõýÿíÐ0årõýÿíôàärõýÿí@Eå=öýÿíÐ0å;öùÿõýÿíÐ0årõýÿíP¤ä=öýÿî1årõýÿíP¤ä;öùÿõ;õ(öýÿíÐ0årõýÿíP¤äkõÿÿô)öùÿõýÿíÐ0årõýÿíP¤ärõýÿíôàä=öýÿíÐ0å;öùÿõ<õùÿõýÿí± ä=öýÿíÐ0å;öùÿõýÿíÐ0årõýÿí@Eå=öýÿî1årõýÿí@Eå;öùÿõ;õ(öýÿíÐ0årõýÿí@Eåkõÿÿô)öùÿõýÿíÐ0årõýÿí@Eårõýÿíôàä=öýÿíÐ0å;öùÿõ<õùÿõýÿí± ä=öýÿíÐ0å;öùÿõýÿíÐ0årõýÿíÄ*ä(öýÿî1årõýÿíä(ö)ö)ö;öùÿõ;õ(öýÿíŒDäjõýÿî1å)öùÿõýÿíŒDä=öýÿíÐ0å;öùÿõ}öùÿõ<õ;õ(öýÿí`0åjõÿÿôiõýÿî1åjõýÿíŒDä)öùÿõýÿíH­ä=ö[õ;öùÿõ;õ(öýÿíH­ä)öùÿõ{öùÿõ>õ(öýÿí`0åkõýÿíŒDäiõ(öýÿí`0åjõÿÿôhõýÿí`0årõýÿíä(ö)öjõýÿíÄßä)ö)öùÿõ{öùÿõ;õ(öýÿí< ä)öùÿõ{öùÿõýÿí¸˜ä*öýÿí¤/å=öýÿí± ärõýÿí@Eå;öùÿõ;õ(öýÿí¤/årõýÿíä(ö)öjõýÿíœ{ä)öùÿõ{öùÿõýÿí¤/årõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí± ärõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿíÚä(öýÿí± ä,öýÿíŒDä)ö;öùÿõýÿí¤/å=öýÿí± ärõýÿí@Eå;öùÿõ}öùÿõ;õ(ö(öýÿí¤/årõýÿíP¤äjõÿÿôhõýÿí¤/årõýÿíP¤ärõýÿíä(ö)öjõýÿíÄßä)öiõùÿõ(öýÿí¤/årõýÿí@Eåjõÿÿôhõýÿí¤/årõýÿí@Eårõýÿíä(ö)öjõýÿíÄßä)ö)öùÿõ{öùÿõýÿí¤/årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿí`0å=öýÿí± ä;öùÿõýÿí± ä=öýÿí`0årõýÿíôàä;öùÿõýÿí< ä=öýÿí`0åjõýÿí± ärõýÿíP¤ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí¤/årõýÿí@Eåjõÿÿôhõýÿí¤/årõýÿí@Eårõýÿíä(ö)öjõýÿíÄßä)öùÿõ{öùÿõýÿí¤/årõýÿíP¤ärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí¤/årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿí`³ ä(öýÿí¤/å,öýÿíŒDä)ö;öùÿõýÿí¤/å=öýÿí± ärõýÿí@Eå;öùÿõ}öùÿõýÿí¤/årõýÿíÄ*ä(öýÿí± ärõýÿíä(ö)ö)ö;öùÿõýÿí± ärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí¤/årõýÿí@EårõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿíÚä(öýÿí± ä,öýÿíŒDä)ö;öùÿõýÿí`0å=öýÿíŒDä;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí¸˜ä*öýÿí¤/å=öýÿí± ärõýÿíP¤ä;öùÿõ;õ(öýÿí¤/årõýÿíä(ö)öjõýÿíœ{ä)öùÿõ{öùÿõýÿí¤/årõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí± ärõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿí`³ ä(öýÿí± ä,öýÿíŒDä)ö;öùÿõýÿí¤/å=öýÿí± ärõýÿíP¤ä;öùÿõ}öùÿõ;õ(ö(öýÿí¤/årõýÿíP¤äjõÿÿôhõýÿí¤/årõýÿíP¤ärõýÿíä(ö)öjõýÿíÄßä)öiõùÿõ(öýÿí¤/årõýÿí@Eåjõÿÿôhõýÿí¤/årõýÿí@Eårõýÿíä(ö)öjõýÿíÄßä)ö)öùÿõ{öùÿõýÿí¤/årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿí`0å=öýÿí± ä;öùÿõýÿí± ä=öýÿí`0årõýÿíôàä;öùÿõýÿí< ä=öýÿí`0åjõýÿí± ärõýÿíP¤ä;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí¤/årõýÿíP¤äjõÿÿôhõýÿí¤/årõýÿíP¤ärõýÿíä(ö)öjõýÿíÄßä)öùÿõ{öùÿõýÿí¤/årõýÿí@EårõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí¤/årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿíÚä(öýÿí¤/å,öýÿíŒDä)ö;öùÿõýÿí¤/å=öýÿí± ärõýÿíP¤ä;öùÿõ}öùÿõýÿí¤/årõýÿíÄ*ä(öýÿí± ärõýÿíä(ö)ö)ö;öùÿõýÿí± ärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí¤/årõýÿíP¤ärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí`³ ä(öýÿí± ä,öýÿíŒDä)ö;öùÿõýÿí`0å=öýÿíŒDä;öùÿõ}öùÿõ}öùÿõ}öùÿõ;õ(öýÿí`0åkõÿÿô)öùÿõýÿí`0årõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõ}öùÿõ}ö S6 26¸26îSáX36öP#äë ¿5DWô26âÿèä 36ì€âÀ¿5æâ<36`0æÁ5ðŒDåÁ5ì{öùÿõýÿí`0årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõ>õ(öýÿí`0åkõýÿíŒDäiõýÿí`0årõýÿíôàärõýÿíä(ö)öjõýÿíœ{ä)öùÿõ{öùÿõ;õ(öýÿí`0årõýÿíôàäjõýÿí`0årõýÿíôàärõýÿíôàärõýÿíP¤ä)öùÿõ{öùÿõýÿí¸˜ä*öýÿíÐ0å=öýÿí`0årõýÿíôàärõýÿíôàärõýÿí@Eå;öùÿõ;õ(öýÿíÐ0åkõÿÿôiõýÿíÐ0årõýÿíä(ö)öjõýÿíœ{ä)öùÿõ{öùÿõýÿí`0årõýÿíôàärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿíÐ0årõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí`0å=öýÿí`0årõýÿíôàärõýÿíôàä;öùÿõýÿí`0årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí`0åjõýÿí`0årõýÿíôàärõýÿí@Eå)öùÿõ{öùÿõýÿí`0å=öýÿí`0årõýÿíôàä;öùÿõýÿíÚä(öýÿí`0å,öýÿíŒDä)ö;öùÿõ}öùÿõýÿí`0årõýÿíôàärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí`0årõýÿíôàärõýÿíôàärõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿí`³ ä(öýÿí`0årõýÿíôàärõýÿíôàä,öýÿíŒDä)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí¸˜ä*öýÿíÐ0å=öýÿí`0årõýÿíôàärõýÿíôàärõýÿíP¤ä;öùÿõ;õ(öýÿíÐ0åkõÿÿôiõýÿíÐ0årõýÿíä(ö)öjõýÿíœ{ä)öùÿõ{öùÿõýÿí`0årõýÿíôàärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿíÐ0årõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí`0å=öýÿí`0årõýÿíôàärõýÿíôàä;öùÿõýÿí`0årõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõ;õ(öýÿí`0åjõýÿí`0årõýÿíôàärõýÿíP¤ä)öùÿõ{öùÿõýÿí`0å=öýÿí`0årõýÿíôàä;öùÿõýÿí`³ ä(öýÿí`0å,öýÿíŒDä)ö;öùÿõ}öùÿõýÿí`0årõýÿíôàärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõýÿí`0årõýÿíôàärõýÿíôàärõýÿíÄ*ä(öýÿíœ{ä)ö;öùÿõýÿíÚä(öýÿí`0årõýÿíôàärõýÿíôàä,öýÿíŒDä)ö;öùÿõ}öùÿõ}öùÿõ}öùÿõýÿíŒDärõýÿíÄ*ä(öýÿíÄßä)ö;öùÿõ}ö èX6TS6lS6î5âðS6öP#äë ¿5ð²¨S6âÿèäÔS6ì€âÀ¿5ææ`0åŒÎ5ê{öùÿõ;õ(öýÿí`0årõýÿíP¤äkõÿÿô)öùÿõýÿí`0å=öýÿîä(öýÿí`0årõýÿíP¤ä)ö;öùÿõ<õùÿõ{öùÿõ>õ(öýÿí`0åjõýÿí`0årõýÿíôàärõýÿíP¤ä)öùÿõýÿí`0å=öýÿí`0årõýÿíôàä;öùÿõýÿí`0å=öýÿí`0årõýÿíôàä;öùÿõ}öùÿõ}ö °^6Y64Y6î5â¸Y6öP#äë ¿5ôjpY6âÿèäœY6ì€âÀ¿5ææ`0åŒÎ5ê{öùÿõ;õ(öýÿí`0årõýÿí@Eåkõÿÿô)öùÿõýÿí`0å=öýÿíKä(öýÿí`0årõýÿí@Eå)ö;öùÿõ<õùÿõ{öùÿõ>õ(öýÿí`0åkõýÿí`0årõýÿíôàärõýÿíP¤ä)öùÿõýÿí`0å=öýÿí`0årõýÿíôàä;öùÿõýÿí`0å=öýÿí`0årõýÿíôàä;öùÿõ}öùÿõ}ö ¨a6ä^6ü^6îâ€_6öP#äë ¿5á 8_6ÿèäd_6åÁ5ä€âÀ¿5ææ`0æÁ5ì{öùÿõ>õ(öýÿí`0årõýÿí@Eåkõÿÿô)öùÿõýÿí`0å=öýÿí`0årõýÿí@Eå;öùÿõDõýÿí`0å;öùÿõ}úÜa6ôa6îâxb6öP#äë ¿5K0b6ÿèä\b6åÁ5ä€âÀ¿5ææ`0æÁ5ì{öùÿõ>õ(öýÿí`0årõýÿíP¤äkõÿÿô)öùÿõýÿí`0å=öýÿí`0årõýÿíP¤ä;öùÿõDõýÿí`0å;öùÿõ}öÈd6ø Â5æðd6øÁ5èe6øÔÇ5è@e6øôa6æhe6øü^6æe6ø4Y6æ¸e6ølS6æàe6ø¸26æf6ø„ã5æ0f6øÀØ5æü|À5æpf6ähf6À¿5âˆf6´)ä€f6 Â5â˜f6Äßä ¸Â5¨f6œ{ä ÐÂ5Àf6¸˜ä¸f6Á5âØf6 —äÐf6ÔÇ5âèf6Käôa6øf6áä ü^6g6ôjä 4Y6g6ð²ä lS6(g6DWä ¸268g6( ä „ã5Hg6ÚäÀØ5ä`³ ä |À5pg6¸˜ähg6Á5â€g6@Eå hÁ5g6ôàä €Á5 g6ôOä D¿5°g6ä<Ä5äÄ*äðÁ5äìg6ì€âÁ5êh6|W ätÂ5ì Ph60Ã$h6áÁ5ì4ÿê ˜h6Üì lh6áÁ5ì4ÿîðy ´h6áÁ5ì4ÿêä i6äœBä€âÄ/ì8i6|W ä(i6ì âÄ/ä€i60ÃTi6l/ì4ÿêÈi6Üì œi6l/ì4ÿî ðy äi6l/ì4ÿîj6 /ôOTj6ÿèä€j6ìãÄ/ìœj6è(i6ø¸j6ê âÄ/ ädk6äØj6 /k6Hÿæ<Ä5æäHk6äD/䀀âÄ/ð|W ä(i6êl6Ä*ätk6 /Ä*¸k6HÿæðÁ5æääk6ì€âÄ/íl6|W ä(i6ðè#åD/ð˜Rä,l6 /˜Rhl6ÿèä”l6ä¸j6äãÄ/ì°l6è(i6ø¸j6îxÉ5ìøl6 —äðl6xÉ5â”m6Käm6ô/KLm6Hÿæôa6æäxm6äl/ä€â¬/èæ`0ål/ì0n6áä ¤m6ô/á èm6Hÿæü^6æän6äl/ä€â¬/èæ`0ål/ìÜn6ôjä@n6ô/ôj„n6âHÿæ4Y6æä°n6ì€â¬/èæ`0åÌn6ê âl/ äxo6ð²äìn6ô/ð²0o6âHÿælS6æä\o6ì€â¬/èæ`0åÌn6ê0p6DWäˆo6ô/DWÌo6âHÿæ¸26æäøo6ì€â¬/èâp6`0ål/ðŒDäl/ìèp6( ä@p6ô/( „p6âHÿæ„ã5æä°p6ì€â¬/èâÌp6á1ål/ðŒDäl/ì q6Úäøp6ô/Ú âèª6ü¬6ö¤¶ ð{öùÿõDõ!ö(öýÿí`0å<öýÿíÐ0å)ö;öùÿõ}öÌk°>D¬66ä¨ûîä`¬6ìâÔ¬6`0å|¬6ê ⌬6 ä â 81œ¬6°¬6ôâĬ6è ðÐ0åð¬6ê ã­6 ä â 81­6$­6ôâĬ6ðˆ­6⨯6´: â ­6üx®6ö¤¶ ð{öùÿõDõýÿíÐ0å<öýÿí`0å;öùÿõ}öÌk´:´®6î8­6äÐúîäЮ6ìâD¯6`0åì®6ê âü®6 ä â 81 ¯6 ¯6ôâ4¯6è ðÐ0å`¯6ê âp¯6 ä â 81€¯6”¯6ôâ4¯6ðø¯6â`²6ôT â°6ü0±6ö¤¶ ð{öùÿõDõ!ö(öýÿí`0åjõýÿíÐ0å)ö;öùÿõ}öÌkôTl±66äúî䈱6ìâü±6`0失6ê â´±6 ä â 81ı6ر6ôâì±6è ðÐ0å²6ê â(²6 ä â 818²6L²6ôâì±6ð°²6âø¶6 < âȲ6üȵ6ö¤¶ ð{öùÿõDõýÿíLì ä(öýÿí`0å.öýÿíÌ' ä(ö)ö,öýÿí`0å.öýÿíp ä(ö)ö,öýÿíÐ0å.öýÿíÌ' ä(ö)ö,öýÿíÐ0å.öýÿíp ä(ö)ö)ö;öùÿõ}öÌk <¶6î`²6ähùîä ¶6ìâ”¶6`0å<¶6ê âL¶6 ä â 81\¶6p¶6ôâ„¶6è ðÐ0å°¶6ê âÀ¶6 ä â 81ж6ä¶6ôâ„¶6ðH·6âhs5˜UUâ`·6üX¿6ö¤¶ ð{öùÿõ;õ(öýÿí`0å.öýÿí¤ ä(ö)ökõýÿíÐ0å.öýÿí¤ ä(ö)ö)öùÿõDõ[õ;öùÿõ;õ(öýÿí`0å.öýÿí¤ ä(ö)öjõÿÿô)öùÿõDõZõ;öùÿõýÿí`0å.öýÿí¬€ä(ö)ö;öùÿõýÿíÐ0å.öýÿí¬€ä(ö)ö;öùÿõDõvõýÿíx†ävõýÿíÜzä(öýÿí`0å.öýÿí4å,öýÿí`0å.öýÿí4å+öýÿíœä<öõ,öýÿí¤¶ ä>övõýÿî ä(öýÿí`0å.öýÿí,Ôä)ö,öýÿíÐ0å.öýÿí4å)ö;öùÿõ}öÌk˜U”¿6âîø¶6ä˜ýîä°¿6ìâ$À6`0åÌ¿6ê âÜ¿6 ä â81ì¿6áÀ6ôâÀ6è ðÐ0å@À6ê âPÀ6 ä â 81`À6tÀ6ôâÀ6ìÀ6X/ôOÌÀ6âÿèäøÀ6ì€ã/êÁ6|W äl›6ð`0å0Á6ê ã/ äÔÁ6€OäPÁ6X/€OŒÁ6ÿèä¸Á6ì €ã/î|W äl›6ì„Â6˜RääÁ6X/˜R Â6âÿèäLÂ6ä0Á6ä€ã/ êhÂ6|W äl›6ð`0å0Á6êÃ6è„å ”Â6X/è„áÐÂ6ÿèäüÂ6ä´€6䀀ã/ î|W äl›6ê"8Ä6Ì' ¬Ã6(Ã6X/Ì' dÃ6ÿèäÃ6ä<—6ä€ã/ î|W äl›6ð´Ã6X/Ì' ðÃ6ÿèäÄ6䨗6䀀ã/ î|W äl›6ê"XÅ6p ÌÄ6HÄ6X/p „Ä6ÿèä°Ä6ä<—6ä€ã/ î|W äl›6ðÔÄ6X/p Å6ÿèä<Å6䨗6䀀ã/î|W äl›6ê"xÆ6 O ìÅ6hÅ6X/ O ¤Å6ÿèäÐÅ6ätš6ä€ã/î|W äl›6ðôÅ6X/ O 0Æ6ÿèä\Æ6ä´š6䀀ã/î|W äl›6ê"˜Ç6Ôî Ç6ˆÆ6X/ÔîÄÆ6ÿèäðÆ6ätš6ä€ã/î|W äl›6ðÇ6X/ÔîPÇ6ÿèä|Ç6ä´š6䀀ã/î|W äl›6ê,È6°‚ ä¨Ç6X/°‚ äÇ6ÿèäÈ6쀀ã/î|W äl›6êÀÈ6¤ ä<È6X/¤ xÈ6ÿèä¤È6ä€t6䀀ã/î|W äl›6êTÉ60 äÐÈ6X/0 É6ÿèä8É6ä€t6䀀ã/î|W äl›6êìÚ6`kädÉ6X/`k É6âî4Ê6äx îäÜÉ6äÌÉ6äã/ì â„s6 äøÉ6|W äl›6ðõ(öýÿí´)åkõÿÿô)öùÿõ{öùÿõýÿí„+å=öýÿí´)å;öùÿõ;õ(öýÿí€;ä(ö)ö(öýÿíöýÿíä&å=öýÿíø ä(öýÿí`0å)ö;öùÿõýÿí|räýÿíüä=ö(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿíä&å.öýÿí„: ä,öýÿíä&å.öýÿíô<ä)ö;öùÿõýÿíœêä(öýÿíä&å.öýÿí„: ä,öýÿíä&å.öýÿíô<ä)ö;öùÿõDõýÿíüä;öùÿõ}öõ6ˆpätô6X/ˆp°ô6âÿèäÜô6ì€ã/ êøô6|W äl›6ð`0å0Á6ì¨õ6,X ä$õ6X/,X `õ6âÿèäŒõ6ì€ã/!î|W äl›6ì<ö6´ˆä¸õ6X/´ˆôõ6ÿèä ö6ä°s6䀀ã/"î|W äl›6ê 7| ü7Lö6X/| ˆö6âî ÷6äÈ îä´ö6ä<—6äã/ìÐö6|W äl›6ð`0åìö6ê âüö6 ä æä2/ä\÷6âìî6| {ât÷6üLö6öÔ‚ãì{öùÿõýÿíLòä*öýÿíä&å=öýÿíŒDä(ö)ö;öùÿõýÿíLòä*öýÿíˆ'å=ö(öýÿíLòä*ö)ö&öýÿí\ ä(ö)ö;öùÿõ>õ(öýÿíä&åkõÿÿô)öùÿõ{öùÿõ;õ(ö!öýÿí€;ä(ö)ö(öýÿíä&årõýÿí4å,öýÿí`0å)ö)öùÿõ{öùÿõýÿíˆ'å=öýÿíä&å;öùÿõýÿíä&å=ö(öýÿíLòä*ö)öýÿíä&årõýÿíP¤ä;öùÿõ}öùÿõ<õùÿõýÿíä&å=ö(öýÿíLòä*ö)öýÿíä&årõýÿí@Eå;öùÿõ}öùÿõ;õ(öýÿíˆ'åjõ(öýÿíLòä*ö)ö&öýÿí\ ä(ö)öhõýÿí€;ä(ö)ö(öýÿí`0å,öýÿíˆ'årõýÿí4å)ö)öùÿõDõýÿíp ä(ö)ö;öùÿõDõýÿíLmä(öýÿíˆ'å)ö;öùÿõ}ú7X/| @7îÄ7ä” îäl7䨗6ä€ã/ìˆ7|W äl›6î`0å¤7ê â´7 ä æä2/ä7â ÷6| â,7ü7öÔ‚ãì{öùÿõDõTõ<öýÿíÔH ä&ö>ö(ö*öOõ)ö.öýÿí| ä(öýÿí`0å)ö;öùÿõ}ö$ 7(ää7X/(äX7îÜ7ä, îä„7ä€t6ä€ã/ì 7|W äl›6î`0å¼7ê âÌ7 ä æä2/ä,7âÄ7(äâD7ü7öÔ‚ãì{öùÿõDõýÿí|rä(ö!ö(öýÿí| ä(öýÿí`0å)öjõýÿíp ä(ö)ö)ö)ö;öùÿõ}ö¼ 7(Ž ä4 7X/(Ž p 7îô 7äø îäœ 7ä€t6ä€ã/ì¸ 7|W äl›6î`0åÔ 7ê âä 7 ä æä2/äD 7âÜ7(Ž $â\ 7ü4 7öÔ‚ãì{öùÿõýÿí@% ä<öýÿíÌõ ä,öýÿíÌõ ä>öýÿíä&å=öýÿíø ä(öýÿí`0å)ö;öùÿõDõ(öýÿí|rä)övõýÿíx†ävõýÿí(èä(öýÿíä&å.öýÿí„: ä,öýÿíä&å.öýÿíô<ä)ö;öùÿõ}ö¤7Èa”7Ì 7X/Èa7âîŒ7å} îä47ä<—6äã/ìP7|W äl›6ð`0ål7ê â|7 ä æä2/äÜ7âô 7Èa\âô7üÌ 7öÔ‚ãì{öùÿõýÿíLòä*öýÿíä&å=öýÿíŒDä(ö)ö;öùÿõýÿíLòä*öýÿíˆ'å=ö(öýÿíLòä*ö)ö&öýÿí\ ä(ö)ö;öùÿõ>õ(öýÿíä&åkõÿÿô)öùÿõ{öùÿõ;õ(ö!öýÿí€;ä(ö)ö(öýÿíä&årõýÿí4å,öýÿí`0å)ö)öùÿõ{öùÿõýÿíˆ'å=öýÿíä&å;öùÿõýÿíä&å=ö(öýÿíLòä*ö)öýÿíä&årõýÿíP¤ä;öùÿõ}öùÿõ<õùÿõýÿíä&å=ö(öýÿíLòä*ö)öýÿíä&årõýÿí@Eå;öùÿõ}öùÿõDõýÿíLmä(öýÿíˆ'å)ö;öùÿõ}úœ7X/ÈaØ7î\7ä| îä7䨗6ä€ã/ì 7|W äl›6î`0å<7ê âL7 ä æä2/ä¬7âŒ7ÈaâÄ7üœ7öÔ‚ãì{öùÿõDõTõ<öýÿíÔH ä&ö>ö(ö*öOõ)ö.öýÿíÈaä(öýÿí`0å)ö;öùÿõ}öt'7€Ï d$7´7X/€Ï ð7âît7ä”} îä7ä<—6äã/ì87|W äl›6ð`0åT7ê âd7 ä æä2/äÄ7â\7€Ï [âÜ7ü´7öÔ‚ãì{öùÿõýÿíLòä*öýÿíä&å=öýÿíŒDä(ö)ö;öùÿõýÿíLòä*öýÿíˆ'å=ö(öýÿíLòä*ö)ö&öýÿí\ ä(ö)ö;öùÿõ>õ(öýÿíä&åkõÿÿô)öùÿõ{öùÿõ;õ(öýÿí€;ä(ö)ö(öýÿí`0å,öýÿíä&årõýÿí4å)ö)öùÿõ{öùÿõýÿíˆ'å=öýÿíä&å;öùÿõýÿíä&å=ö(öýÿíLòä*ö)öýÿíä&årõýÿíP¤ä;öùÿõ}öùÿõ<õùÿõýÿíä&å=ö(öýÿíLòä*ö)öýÿíä&årõýÿí@Eå;öùÿõ}öùÿõDõýÿíLmä(öýÿíˆ'å)ö;öùÿõ}úl$7X/€Ï ¨$7î,%7ä4} îäÔ$7䨗6ä€ã/ìð$7|W äl›6î`0å %7ê â%7 ä æä2/ä|%7ât7€Ï â”%7ül$7öÔ‚ãì{öùÿõDõTõ<öýÿíÔH ä&ö>ö(ö*öOõ)ö.öýÿí€Ï ä(öýÿí`0å)ö;öùÿõ}ö"¬-7ø ”*7„'7X/ø À'7î|(7ä¤z îä$(7äì'7äã/ì â X¹ü'7(7ä<—6ìâ<—6è@(7|W äl›6ð`0å\(7ê âl(7 ä æä2/äÌ(7â,%7ø âä(7ü„'7öÔ‚ãì{öùÿõDõýÿí„J ä(öýÿíÈaä(öýÿí`0å)ö,öýÿí€Ï ä(öýÿí`0å)ö)ö;öùÿõ}úœ*7X/ø Ø*7î”+7äÄy îä<+7ä+7ä€ã/ì â X¹+7(+7䨗6ì⨗6èX+7|W äl›6î`0åt+7ê â„+7 ä æä2/ää+7â|(7ø âü+7üœ*7öÔ‚ãì{öùÿõDõýÿí„J ä(öýÿíÈaä(öýÿí`0å)ö,öýÿí€Ï ä(öýÿí`0å)ö)ö;öùÿõ}ö@.74¦ä¼-7X/4¦ø-7âÿèä$.7쀀ã/#î|W äl›6êP/7¸äP.7á  .7¸h.7è â <Þx.7Œ.7ä´€6ìâ€t6èá ð.7äì¸.7è â <ÞÈ.7Ü.7ä„€6ìâxÉ5èåÄ+/7è â <Þ/7,/7ä°s6ìâ@/7è â¤u6æ`/7äìä  .7p/7Ä+ä&ð.7 07ÀÑ 07€/7X/ÀÑ ¼/7ÿèäø/7äè/7ä€ã/'ê â´€6 è|W äl›6ð07X/ÀÑ X07ÿèä„07äè/7 ã/(î|W äl›6ê"Ð17Œ0D17°07X/Œ0ì07ÿèä(17ä17ä€ã/)ê â€t6 è|W äl›6ðL17X/Œ0ˆ17ÿèä´17ä17 ã/*î|W äl›6ë!37< t27à17X/< 27ÿèäX27äH27ä€ã/+ê â„€6 è|W äl›6ð|27X/< ¸27ÿèää27äH27 ã/,î|W äl›6ê" 47\ ”3737X/\ L37ÿèäx37ä¼Ë5ä€ã/-î|W äl›6ðœ37X/\ Ø37ÿèä47ä¼Ë5 ã/.î|W äl›6ê"P57€;Ä47047X/€;l47ÿèä¨47ä˜47ä€ã//ê â°s6 è|W äl›6ðÌ47X/€;57ÿèä457ä˜47 ã/0î|W äl›6ê"€67 Úô57`57X/ Úœ57ÿèäØ57äÈ57ä€ã/1ê â@/7 è|W äl›6ðü57X/ Ú867ÿèäd67ä@/7䀀ã/2î|W äl›6ê077{ä67X/{Ì67âÿèäø67쀀ã/3ê77|W äl›6î`0ål/ì"P87ŒDÄ77@77X/ŒD|77ÿèä¨77ä@/7䀀ã/4î|W äl›6îÌ77X/ŒD87ÿèä487äÈ57ä€ã/5î|W äl›6í97 ä`87X/ œ87âÿèäÈ87ì€ã/6êä87|W äl›6ð„+å@/7ì°97ŒŠä97X/ŒŠL97âÿèäx97ä@/7ä€ã/7ê”97|W äl›6ð`0å@/7î@R äÀ97X/@R ü97âÿèä(:7ä@/7ä€ã/8êD:7|W äl›6ì`:7„+å@/7ì|:7Ä’õ˜:7pn ø`0åÌÉ6î¬/èâà:7õ(öýÿí„: äkõýÿí… ä)öùÿõýÿíœêä(öýÿí„: äpõ)ö;öùÿõ}ö Pƒ7|7Ìæ6îJâ`|7ò0|7öýÿí0 ä(ö)ö-öÿÿìæ)öùÿõùÿõPõýÿíœf ä(öüÿí´’7â)ö;öùÿõùÿõýÿíLòä*öýÿí´)å=öýÿí< ä(ö)ö.öýÿí¬±ä(öÿÿìæ)ö;öùÿõùÿõQõùÿõ{öùÿõùÿõýÿíÀÑ ä(ö)ö.öýÿíTå(ö&öýÿí´)årõýÿí4å,öýÿí`0å)ö;öùÿõùÿõ}öùÿõFõ(ösõ)öùÿõ{öùÿõýÿí< ä(ö)ö.öýÿíÔ ä(öýÿí´)å,öÿÿìæ)ö;öùÿõPõ;öùÿõ}öùÿõùÿõýÿí´)årõýÿíP¤ä=öýÿí´)årõýÿí@Eå=öÿÿô;öùÿõýÿí´)årõýÿíôàä=öýÿí„+å;öùÿõ;õ(öýÿíÄ’å)öùÿõýÿí„+årõýÿíP¤ä=öýÿí´)å;öùÿõ<õùÿõýÿí„+årõýÿí@Eå=öýÿí´)å;öùÿõpõýÿíŒ0ä(ö)ö;öùÿõýÿíDWä(öýÿí´)å,öýÿíŒDä(ö)ö)ö;öùÿõ;õ(öýÿípn ä)öùÿõýÿí Úä(ö)ö=öýÿí´)å;öùÿõDõýÿí´)å;öùÿõ}ötree::insert length errorâ ô¨7“7¨á6îçâL“7ò“7ä;öùÿõõýÿí¤å=ö[õ;öùÿõ;õ(öýÿíзäjõýÿíp ä(ö)öhõ!öýÿí€;ä(ö)ö(ö*öýÿíзä,öýÿí`0å)ö)öùÿõ{öùÿõýÿí¤Ìäýÿí\ªä=öýÿíзä;öùÿõ;õ(öýÿí\ªäkõýÿíÌ' ä(ö)öiõýÿí€;ä(ö)ö(öýÿí`0å,ö*öqõýÿí\ªä)ö)öùÿõ{öùÿõýÿí\ªä=öýÿíзä=öýÿí€Ï ä(öýÿí`0å)ö;öùÿõ;õ(öýÿí\ªäkõýÿíÌ' ä(ö)ö)öùÿõqõýÿí\ªä;öùÿõ}öùÿõýÿí\<ä=öýÿíðä(öýÿí\ªä)ö;öùÿõýÿí,>ä=öýÿíðä(öýÿíзä)ö;öùÿõýÿí¤å=öýÿíзäjõýÿíÌ' ä(ö)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí¤ÌäýÿíÐÍ ä=öýÿíзä;öùÿõpõýÿíÐÍ ä;öùÿõ;õ(öýÿíÐÍ äkõýÿíp ä(ö)öiõýÿí€;ä(ö)ö(ö*öýÿíÐÍ ä,öýÿí`0å)ö)öùÿõ{öùÿõýÿíÐÍ ä=öýÿíзä=öýÿíÈaä(öýÿí`0å)ö;öùÿõqõýÿíзä;öùÿõ}öùÿõýÿí\<ä=öýÿíðä(öýÿíзä)ö;öùÿõýÿí,>ä=öýÿíðä(öýÿíÐÍ ä)ö;öùÿõ}öùÿõ;õ(öýÿí,>ärõýÿíP¤äjõÿÿô)öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí,>ä,öZõ,öýÿí¤å,öýÿí`0å)ö)ö;öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí\<ä,ö[õ,ö[õ,öýÿí`0å)ö)ö;öùÿõ}ö °À7(©7ÜÛ6îøâp©7ò@©7ä=öýÿíðä(öýÿíзä)ö;öùÿõ;õ(öýÿí,>ärõýÿíP¤äjõÿÿô)öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí,>ä,öZõ,öýÿíзäjõýÿíÌ' ä(ö)ö,öýÿí`0å)ö)ö;öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí\<ä,ö[õ,ö[õ,öýÿí`0å)ö)ö;öùÿõ}öùÿõ}öùÿõ<õ;õ(öýÿí€;ä(ö)ö(ö*öýÿíзä,öýÿí`0å)ö)öùÿõ{öùÿõýÿí¤ÌäýÿíÐÍ ä=öýÿíзä;öùÿõpõýÿíÐÍ ä;öùÿõ;õ(öýÿíÐÍ äjõýÿíp ä(ö)öhõýÿí€;ä(ö)ö(öýÿí`0å,ö*öýÿíÐÍ ä)ö)öùÿõ{öùÿõýÿíLòä*öýÿí\<ä=öýÿíðä(öýÿíзä)ö;öùÿõýÿíLòä*öýÿí,>ä=öýÿíðä(öýÿíÐÍ ä)ö;öùÿõ;õ(öýÿí\<ärõýÿí@Eåjõÿÿô)öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí\<ä,ö[õ,ö[õ,öýÿí`0å)ö)ö;öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí,>ä,öZõ,ö[õ,öýÿí`0å)ö)ö;öùÿõ}öùÿõ}öùÿõ<õùÿõDõýÿíзä;öùÿõDõýÿí¤xä(öýÿí`0å)ö.öýÿí„: ä;öùÿõ}ötÍ7äÀ7áá6îƒâ,Á7òüÀ7õ(öýÿí´)åkõÿÿô)öùÿõ{öùÿõýÿí„+å=öýÿí´)å;öùÿõ;õ(öýÿí€;ä(ö)ö(öýÿí`0å,öýÿí´)årõýÿí4å)ö)öùÿõ{öùÿõýÿí´)å=ö(öýÿíLòä*ö)öýÿí´)årõýÿíP¤ä;öùÿõýÿíÄ’å=öZõ;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿí´)å=ö(öýÿíLòä*ö)öýÿí´)årõýÿí@Eå;öùÿõýÿíÄ’å=ö[õ;öùÿõýÿípn ä=ö[õ;öùÿõ}öùÿõ}öùÿõDõýÿíLmä(öýÿí@R ä(öýÿí„+å,öýÿíÄ’å,öýÿípn ä,öýÿí`0å)ö)ö;öùÿõ}ö hà7¨Í7üÚ6îÅâðÍ7òÀÍ7õ(öýÿí´)åkõÿÿô)öùÿõ{öùÿõýÿí„+å=öýÿí´)å;öùÿõ;õ(öýÿí€;ä(ö)ö(öýÿí`0å,öýÿí´)årõýÿí4å)ö)öùÿõ{öùÿõýÿí´)å=ö(öýÿíLòä*ö)öýÿí´)årõýÿíP¤ä;öùÿõýÿíÄ’å=öZõ;öùÿõ}öùÿõ<õùÿõ{öùÿõýÿítñ ä=öýÿí„+å;öùÿõýÿí´)å=ö(öýÿíLòä*ö)öýÿí´)årõýÿí@Eå;öùÿõýÿíÄ’å=ö[õ;öùÿõýÿípn ä=ö[õ;öùÿõ}öùÿõ}öùÿõ;õ(öýÿítñ äjõÿÿôhõýÿí€;ä(ö)ö(öýÿítñ ärõýÿí4å,öýÿí`0å)ö)öùÿõ{öùÿõýÿí´)å=öýÿí@R ä(öýÿí„+å,öýÿíÄ’å,öýÿípn ä,öýÿí`0å)ö;öùÿõDõýÿí@% ä<öýÿí¤Ìä,öõ>ö(öýÿíLmä(öýÿí´)å)ö,öZõ)ö;öùÿõ}öùÿõDõýÿí@% ä<öýÿí¤Ìä,öõ>ö(öýÿíLmä(öýÿítñ ä)ö,ö[õ)ö;öùÿõ}ö 4â7œà7ÐÈ6îâäà7ò´à7övõýÿí ¸ ä(ö)ö;öùÿõ}ö ˆã7hâ7<È6î â°â7ò€â7ö(öýÿíðä(öýÿí„: ä)ö)ö)ö,öùÿõýÿíLmä(öTõ<öýÿíÌÏä>ö(öýÿíðä(öýÿí… ä)ö)ö)ö)ö;ö}ö`;8ätç6îâ˜98ò{öýÿíœêä(öýÿíLmä(öTõ<öýÿíÌÏä>ö(öýÿíðä(öýÿíзä)ö)ö)ö)ö;ö}ö¤=8älâ6îâ”;8ò{öDõýÿí <ä(öýÿíLmä(öTõ<öýÿíÌÏä>ö(öýÿíðä(öýÿíзä)ö)ö)ö,öýÿí`0å)ö;ö}öè?8ä Ü6îâØ=8ò{öDõýÿí¤xä(öýÿíLmä(öTõ<öýÿíÌÏä>ö(öýÿíðä(öýÿíзä)ö)ö)ö,öýÿí`0å)ö;ö}öÜ@8äÔ™6îâ@8ò{öDõýÿíÌõ ä(öýÿí„+å)ö;ö}öÐA8äH™6îâA8ò{öDõýÿí¤Ìä(öýÿí„+å)ö;ö}ö¬B8䤘6îâB8ò{öDõýÿíä&å.öýÿíì;å;ö}þ˜6îâàB8ò{öDõýÿíä&å.öýÿíì;å;ö}ö°C8øxs6æØC8ø¤s6æáD8øÐs6æ(D8øüs6æPD8ø8t6æxD8øtt6æ D8ø°t6æÈD8øìt6æðD8ø(u6æE8ø¤u6è@E8øtw6æhE8øäw6æE8ødx6æ¸E8øìx6èàE8ø{6èˆF8øF8æ8F8ðHù â{6HF8æ\F8è4ÿê0G8ø°F8æàF8ðHù â{6ðF8æG8è4êþXG8ø0—6æ€G8øœ—6æ¨G8ø˜6æÐG8ø¤˜6æøG8øH™6æ H8øÔ™6æHH8øhš6æpH8ø¨š6æ˜H8øèš6æÀH8ø„›6æèH8øÀ6æI8øPÁ6æ8I8øäÁ6æ`I8ø”Â6æˆI8ø(Ã6æ°I8ø´Ã6æØI8øHÄ6æáJ8øÔÄ6æ(J8øhÅ6æPJ8øôÅ6æxJ8øˆÆ6æ J8øÇ6æÈJ8ø¨Ç6æðJ8ø<È6æK8øÐÈ6æ@K8øüÚ6æhK8ùá6æK8øÜÛ6æ¸K8ø Ü6æàK8ø¨á6æL8ølâ6æ0L8øÌæ6æXL8øtç6æ€L8øè6æ¨L8øàè6æÐL8øtô6æøL8ø$õ6æ M8ø¸õ6æHM8ø¼-7æpM8øP.7æ˜M8ø .7æÀM8øð.7æèM8ø€/7æN8ø07æ8N8ø°07æ`N8øL17æˆN8øà17æ°N8ø|27æØN8ø37æáO8øœ37æ(O8ø047æPO8øÌ47æxO8ø`57æ O8øü57æÈO8ø67æðO8ø@77æP8øÌ77æ@P8ø`87æhP8ø97æüÀ97æ¤P8äœ/è¸P8⤠/ìâ„ /èDQ8¤ÌäÜP8èP8æ â øP8¤Ì âá /Q8Q8äœ/è0Q8⤠/ìâ„ /è¼Q8Ìõ äTQ8`Q8æ â pQ8Ìõ âá /€Q8”Q8äœ/è¨Q8⤠/ìâ„ /èüQ8øÜ äÌQ8ØQ8æ â@èQ8èèP8èö(öýÿí`0å)ö.öýÿíô<ä;öùÿõùÿõ}ö Œ¤8$£8e8î â„£8ò<£8Ô‚ñT£89Šâ1áŒMäÈ>9Šâ2áŒMäT?9Šâ4áŒMäà?9ä7áŒMì7áŒMä8@9Šâ;áŒMäÄ@9ä=áŒMä,B9ôðÿ2ááÿÿÿ÷â“æ@ÿä ðÿä æð?ÿñâ}æBÿä ðÿäÿûâ¨æAÿäñÿÿÿÿââlæ ÿäðÿÿäáâHÿõ,å @ÿãðÿäÿûâ“æ@ÿä ïÿäóáÿââ|æ@ÿä ðÿä æð?ÿñâæ@ÿäñÿÿÿÿââ´æ@ÿäñÿÿÿÿââ{æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿäðÿ2ááÿÿÿ÷â•æ@ôé @9ü:áä2ÿíðÿäÿûâ•æ@ôéð@9áB9øéA9üá8a-äHA9ÔA9ø8á8a-ä tA9 A9P~-ô:â@~-äˆ~-ÿà¨A94êþ4êþ4ê!þ2€èXB9üé„B9ü2á`ûä°B9ü:âîäœûÿàäB92€èC9üéáç¹ÿíðÿµááÿÿÿ÷â“æ@ÿä ðÿ¹ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ¹ááÿÿÿ÷âŸå€Àÿäðÿµááÿÿÿ÷â•æ@ôéÌI9ü:áäµýN9áJ9Ìk\oLº9p¹9(¹9>¬¹9ÿèäع9쀀âи9êº9|W äô¹9ê âи9ä0º9`0å º9ê âÈ´9 èÐ0å º9ê »9Tº9(¹9>º9ÿè伺9쀀âи9êغ9|W äô¹9ê»9`0åôº9ê âp´9 èÐ0å º9î(»9(¹9>d»9ÿèä»9쀀âи9ꬻ9|W äô¹9êÈ»9`0å º9îÐ0åôº9ê ¼9€;äô»9å€;µ9ìôO ¼9¼9(¹9ôOX¼9ÿè䄼9ì€âи9î|W äô¹9ð¨¼9(¹9ôOä¼9ÿèä½9ì€âи9ê,½9|W äô¹9ðè#åµ9ì$¾9䨼9îâ|½9ò:öýÿí€;ä(öýÿíè#å)ö{ö}öˆ¾9ä¼9îâX¾9ò{ö}ö À9ä(»9îâ¼¾9ò{öùÿõDõýÿí€;ä(öýÿí`0å.öýÿí„: ä,öýÿíÐ0å)ö;öùÿõ}öÁ9äTº9îâ@À9ò{öùÿõDõýÿí€;ä(öýÿí`0å,öýÿíÐ0å.öýÿí„: ä)ö;öùÿõ}þp¹9îâÄÁ9ò{öùÿõDõýÿí€;ä(öýÿí`0å.öýÿí„: ä,öýÿíÐ0å.öýÿí„: ä)ö;öùÿõ}ö¸Ã9ølÃ9æ â àG'|Ã9Ã9äÈ´9è¤Ã9âÈ´9ìîàÃ9øp¹9æÄ9øTº9æ0Ä9ø(»9æXÄ9øô»9æ€Ä9ø¼9æ¨Ä9ø¨¼9æüÐÄ9æij9ðHùhÅ9¨ äÅ9Å9æ âá /,Å9@Å9äÈ´9èTÅ9âи9ìâ°¶9èàÅ9¤ÌäxÅ9„Å9æ â ”Å9¤Ì âá /¤Å9¸Å9äÈ´9èÌÅ9âи9ìâ°¶9èXÆ9Ìõ äðÅ9üÅ9æ â  Æ9Ìõ âá /Æ90Æ9äÈ´9èDÆ9âи9ìâ°¶9è˜Æ9øÜ ähÆ9tÆ9æ â@„Æ9è„Å9èØÆ9”©ä¨Æ9´Æ9æ â@ÄÆ9èüÅ9è"Èï9ôO|Ç9èÆ9´9ôO$Ç9ÿèäPÇ9ì€âij9î|W älÇ9ì âij9äDÈ9„Ç9´9ôOÀÇ9PÿèäìÇ9ì€âij9êÈ9|W älÇ9ð€;ä$È9ê â4È9 ä äæHÉ9LÈ9´9ôOˆÈ9ÿèä´È9ì€âij9êÐÈ9|W älÇ9ì É9€;äìÈ9ê âüÈ9 ä äêÄ"å(É9ê â8É9 ä äæìè9PÉ9´9ôOŒÉ9ëÊ9ä@‹ îä¸É9ìâij9ìÔÉ9|W älÇ9íÊ9„: äðÉ9ì æè… äðÉ9ìö³9älÊ9â|Ì9ôOâ„Ê9üPÉ9öôã âì:öýÿí8)ä(öýÿí„: ä,öýÿí… ä,öZõ,öýÿíÄñä(ö)ö,öýÿíô ä(ö)ö)öùÿõ{öùÿõ}þÌÌ9âäÏ9ˆp â,Í9ü4Î9òäÌ9Ô‚ñüÌ9 âÔ9ü4Õ9òÌÓ9Ô‚ñäÓ9pÕ9îdÓ9䀊 îäŒÕ9ìâXÖ9`0å¨Õ9ê â¸Õ9 ä â ˜/ÈÕ9ìÕ9äÜÕ9è ìÖ9ãÖ9è äæ4Ö9â$Ö9è äêâHÖ9è äêÐ0åtÖ9ê â„Ö9 ä â ˜/”Ö9¨Ö9äÜÕ9è¼Ö9ãÖ9èÐÖ9â$Ö9ìâHÖ9ð4×9âÚ9´: â”×9ülØ9òL×9Ô‚ñd×9:òÔ=:Ô‚ñì=::”r ò¤¶ î{öùÿõDõýÿí8)ä.öýÿíp ä(ö)ö;öùÿõ}ö À@:X?:øð9î â¸?:òp?:Ô‚ñˆ?: â€W:ü X:ò8W:Ô‚ñPW:ÜX:îÐV:äš îäøX:ìâÄY:`0åY:ê â$Y: ä â ij94Y:XY:äHY:è ì|Y:âlY:è äæ Y:âY:è äêâ´Y:è äêÐ0åàY:ê âðY: ä âij9áZ:Z:äHY:è(Z:âlY:èö(öýÿí€;ä)ö;öùÿõýÿíøŽä.öNõýÿíèaä<öýÿí”r ä>ö(öýÿí€;ä)ö;öùÿõýÿípôä<öýÿí”r ä>ö(öýÿíøŽä,öýÿí€;ä)ö;öùÿõCõ;öùÿõ}öùÿõ}öùÿõ}ö؇:¼• äT‡:üd9¼• ‡:âÿè伇:ì€â¤d9î|W ä°Œ9ì"øˆ:ÀÑ lˆ:è‡:üd9ÀÑ $ˆ:ÿèäPˆ:äh9ä€â¤d9î|W ä°Œ9ðtˆ:üd9ÀÑ °ˆ:ÿèä܈:äh9 â¤d9î|W ä°Œ9ê"(Š:Œ0œ‰:‰:üd9Œ0D‰:ÿè䀉:äp‰:ä€â¤d9ê â¨e9 è|W ä°Œ9ð¤‰:üd9Œ0à‰:ÿèä Š:äp‰: â¤d9î|W ä°Œ9ê"X‹:< ÌŠ:8Š:üd9< tŠ:ÿèä°Š:ä Š:ä€â¤d9ê âxr9 è|W ä°Œ9ðÔŠ:üd9< ‹:ÿèä<‹:ä Š: â¤d9î|W ä°Œ9ê"ˆŒ:\ ü‹:h‹:üd9\ ¤‹:ÿèäà‹:äЋ:ä€â¤d9 ê âìg9 è|W ä°Œ9ðŒ:üd9\ @Œ:ÿèälŒ:äЋ: â¤d9!î|W ä°Œ9ê:4¦ä˜Œ:üd94¦ÔŒ:âÿèå:쀀â¤d9"î|W ä°Œ9êÌ:,Ôä,:á |:,ÔD:è â <ÞT:h:ä¨r9ìâ¨e9èå¬9”:è â <Þ¤:¸:äxr9ìâìg9èÜ:¬9ä |:ŒŽ:˜Räì:üd9˜R(Ž:âÿèäTŽ:ä Ž9ää¤d9&êpŽ:è°Œ9ø Ž9ê<:<Ò䜎:üd9<ÒØŽ:ÿèä:ì€â¤d9'æâ :„: äj9ð… äj9ðÄnäL:üd9Änˆ:ÿèä´:ì€â¤d9(æâÐ:ÈÌäj9ìì:„: äj9ð… äj9ì :öÿÿô)öùÿõýÿíà-å.öýÿí0ärõýÿí$¯ ä=öýÿíà-å.öýÿí$¯ ärõýÿí0ä=ö(öýÿíÌÏä)ö&öýÿíà-å;öùÿõ<õùÿõýÿíà-å.öýÿí0ä=öýÿíà-å.öýÿí$¯ ä=ö(öýÿíÌÏä)ö&öýÿíà-å;öùÿõýÿí¸˜ä&öýÿí¤ä=öýÿí`0å.öýÿí\ ä(ö)ö;öùÿõ;õ(öýÿí`0å.öýÿíŒ0ä(ö)ö>öÿÿô)öùÿõýÿí¤ä.öýÿí0ärõýÿí$¯ ä=öýÿí¤ä.öýÿí$¯ ärõýÿí0ä=ö(öýÿíÌÏä)ö&öýÿí¤ä;öùÿõ<õùÿõýÿí¤ä.öýÿí0ä=öýÿí¤ä.öýÿí$¯ ä=ö(öýÿíÌÏä)ö&öýÿí¤ä;öùÿõùÿõ}öùÿõ}ö ð²:ܦ:™9î}â §:òô¦:öÿÿô)öùÿõ{öùÿõ;õ(öýÿíÀÑ ä(ö)ökõýÿí`0å.öýÿíÀÑ ä(ö)ö)öùÿõùÿõPõýÿí|£ ä(öüÿíœÈ:,â)ö;öùÿõùÿõýÿí¸˜ä&öýÿí”$ä=öýÿí`0å.öýÿí\ ä(ö)ö;öùÿõýÿíÜ£äýÿí„Oä=öýÿí”$ä.öýÿí0ä;öùÿõýÿíÜ£äýÿíxQä=öýÿí”$ä.öýÿí$¯ ä;öùÿõýÿí”$ä.öýÿí$¯ ä=öýÿí”$ä.öýÿí0ä=ö(öýÿíÌÏä)ö&öýÿí”$ä;öùÿõýÿíÄnä(öýÿíðä(öýÿíзä)ö,öýÿí„Oä,öýÿíxQä)ö;öùÿõýÿíŒ0ä(ö)öaõýÿí`0å.öýÿíŒ0ä(ö)ö;öùÿõùÿõýÿí`0å.öýÿíŒ0ä(ö)ö=öÿÿô;öùÿõ}öùÿõ}ö6list::splice called with unequal allocatorsœÑ:üÈ:Ø”9îZâ,É:òÉ:õ(öýÿí„: äkõýÿí… ä)öùÿõ{öùÿõýÿíÀÑ ä(ö)ö.öýÿí ä(ö&ö*öýÿí„: ä)ö;öùÿõýÿíÌÏäýÿíà-å=öýÿíðä(öýÿí„: ä)ö;öùÿõùÿõpõýÿí„: ä;öùÿõùÿõýÿí< ä(ö)ö.öýÿíÔ ä(öýÿíà-å,öÿÿìæ)ö;öùÿõqõýÿíŒ0ä(ö)ö;öùÿõ}öùÿõDõýÿí… ä;öùÿõ}ö Ð×:ÐÑ:0”9î>ãÒ:òèÑ:öýÿíì8ä(öýÿí< ä(ö)ö.öýÿí¬±ä(öÿÿìæ)ö,öýÿí< ä(ö)ö)ö;öùÿõýÿíÀÑ ä(ö)ö.öýÿíTå(ö&öýÿíì8ärõýÿí4å,öýÿí`0å)ö;öùÿõýÿíÌÏäýÿíèýä=öýÿíì8ä.öýÿíX™ ä(ö)ö;öùÿõýÿíÄnä(öýÿíðä(öýÿíзä)ö,öýÿíèýä,öýÿíèýä)ö;öùÿõpõýÿíŒ0ä(ö)ö;öùÿõDõýÿíLmä(öýÿíèýä)ö;öùÿõ}ö Pä:èß:ÈŒ9î-âà:óà:ö(ö)ö)ö;ö}ö˜ ;äÌ–9îâH ;ò{öýÿíœêä(öýÿíLmä(öýÿí\ ä(ö)ö.öýÿí$¯ ä)ö)ö;ö}ö ;ä8–9îâÌ ;ò{öýÿíœêä(öýÿíLmä(öýÿí\ ä(ö)ö.öýÿí0ä)ö)ö;ö}öˆ ;䤕9î âP ;ò{öýÿíœêä(öýÿíÌ' ä(ö)ö,öýÿíp ä(ö)ö)ö;ö}öÄ;äÀ’9î â¼ ;ò{öDõýÿí\ ä(ö)ö.öýÿí$¯ ärõýÿí4å;ö}÷;ä4’9î âø;ò{öDõýÿí\ ä(ö)ö.öýÿí$¯ ärõýÿí4å;ö}ö<;ä ‘9î â4;ò{öDõýÿí\ ä(ö)ö.öýÿí0ärõýÿí4å;ö}öx;ä‘9î âp;ò{öDõýÿí\ ä(ö)ö.öýÿí0ärõýÿí4å;ö}ö´;ä€9î â¬;ò{öDõýÿíÌõ ä(ö&öýÿí\ ä(ö)ö)ö;ö}öð;äô9î âè;ò{öDõýÿí¤Ìä(ö&öýÿí\ ä(ö)ö)ö;ö}öD;ä`9î â$;ò{öDõýÿíÌõ ä(öýÿí\ ä(ö)ö.öýÿí0ä)ö;ö}ö˜;äÔŽ9î âx;ò{öDõýÿí¤Ìä(öýÿí\ ä(ö)ö.öýÿí0ä)ö;ö}ö;ä@Ž9î âÌ;ò{öýÿíœêä(öýÿíÌ' ä(ö)ö,öýÿíp ä(ö)ö)ö;ö}öø;䘋9îâ8;ò{öDõýÿí¤Ìä(öýÿí„+å)ö;ö}þôŠ9îâ,;ò{öDõýÿíä&å.öýÿíä;ö}öü;øDe9æ$;øpe9æL;øœe9æt;øØe9æœ;øf9æÄ;øPf9æì;øŒf9æ;øÈf9æ<;ø g9èd;ø¸i9æŒ;øÔi9æ´;øìg9èÜ;øj9æ;øj9è,;øŠ9æT;øˆŠ9æ|;øôŠ9æ¤;ø˜‹9æÌ;ø,Œ9æô;øÈŒ9æ;ø@Ž9æD;øÔŽ9æl;ø`9æ”;øô9æ¼;ø€9æä;ø‘9æ ;ø ‘9æ4;ø4’9æ\;øÀ’9æ„;øT“9æ¬;ø0”9æÔ;øØ”9æü;ø¤•9æ$ ;ø8–9æL ;øÌ–9æt ;ø`—9æœ ;ø$˜9æÄ ;ø™9æì ;øš9æ!;øhl:æövõýÿífä>ö(ö)ö)ö;ö}úì.;@d9ôO(/;ÿèäT/;ì€âèc9êp/;|W ä˜';ð`0åŒ/;ê âèc9 ä%Ä5;$D3;¬/;@d9$è/;ëä0;丬 îä0;ìâèc9ì00;|W ä˜';ì\0;„: äL0;ì æäx0;… äL0;ð 7ä”0;ì âô#;¤0;æ¸0;è4êþd9ä41;â¬+;$âL1;ü¬/;öôã âì{öýÿíœ>ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;ö}úL3;@d9$ˆ3;ë„4;äЭ îä´3;ìâèc9ìÐ3;|W ä˜';ìü3;„: äì3;ì æä4;… äì3;ð 7ä44;ì âô#;D4;æX4;è4ÿêd9äÔ4;âä0;$ âì4;üL3;öôã âì{öýÿíœ>ä(öýÿí„: ä,öýÿí… ä)ö;ö}öt6;˜RäÔ5;@d9˜R6;ÿèä<6;äŒ/;ä€âèc9êX6;|W ä˜';ð`0åŒ/;ê%t=;pë :;„6;@d9pë À6;ë¼7;ä(­ îäì6;ìâèc9ì7;|W ä˜';ì47;„: ä$7;ì æäP7;… ä$7;ð 7äl7;ì âô#;|7;æ7;è4êþd9ä 8;â„4;pë â$8;ü„6;öôã âì{öýÿíDÀä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;ö}ú$:;@d9pë `:;ë\;;ä« îäŒ:;ìâèc9ì¨:;|W ä˜';ìÔ:;„: äÄ:;ì æäð:;… äÄ:;ð 7ä ;;ì âô#;;;æ0;;è4ÿêd9ä¬;;â¼7;pë âÄ;;ü$:;öôã âì{öýÿí´Bä(öýÿí„: ä,öýÿí… ä,öýÿíÌLä<öýÿíôã ä>övõýÿíˆ; ä(ö)ö)ö;ö}ö@>;DÀä„=;@d9DÀÀ=;âÿèäì=;ì€âèc9ê>;|W ä˜';ì$>;´)åø%;ðà-åÌ);ê[;´B€G;P>;@d9´BŒ>;âî8?;äÀª îä¸>;ìâèc9ìÔ>;|W ä˜';í?;„: äð>;ì æä?;… äð>;ð 7ä,Žìd9äˆ?;â\;;´BTâ ?;üP>;öôã âì{öùÿõýÿí¤Ìäýÿíä&å=öýÿí“ ävõýÿíÌ' ä(ö)ö;öùÿõýÿí¤Ìäýÿí¨$å=öýÿí“ ävõýÿíp ä(ö)ö;öùÿõ@õ(ö;öýÿí„: äkõýÿí… äiõýÿíä&åkõýÿí¨$å;öpõýÿí„: ä,öpõýÿíä&å)öùÿõ*öýÿíä&å=ö*öýÿí„: ä;öùÿõ;õ(öýÿíä&åjõýÿí¨$å)öùÿõýÿí„, ä(öýÿíä&å,öýÿí„: ä,öýÿí… ä,öýÿí´qä<ö[õ>ö(ö)ö)ö;öùÿõ<õùÿõýÿí“ ävõýÿíœêä(öýÿíä&å,öýÿí¨$å)ö;öùÿõ}öøL;ˆG;@d9´BÄG;âîpH;ä¬ îäðG;ìâèc9ì H;|W ä˜';ì8H;„: ä(H;ì æäTH;… ä(H;ð 7äàŒìd9äÀH;â8?;´B,âØH;üˆG;ö, âì{öùÿõýÿí, äýÿíL%å=öýÿí„: ä;öùÿõ@õ(öýÿí|räýÿíè#å=öýÿí¤ ä(ö)ö;öýÿíè#åkõÿÿôiõýÿíL%åkõýÿí… ä;öqõýÿíè#å)öùÿõpõýÿíL%å;öùÿõýÿí´Bä(öýÿí„: ä,öýÿíL%å,öýÿí… ä)ö;öùÿõ}ö(R;áM;@d9´Bövõýÿí€×äýÿí€×ä;öùÿõýÿí´Bä(öýÿí„: ä,öýÿí„: ä+övõýÿíx†ävõýÿíÔ6 ä(öýÿí€×ä(öýÿí¤ ä(ö)ö)ö,öýÿí… ä-öýÿí„: ä)ö,öýÿí… ä)ö;öùÿõ}ú0R;@d9´BlR;âîS;ä± îä˜R;ìâèc9ì´R;|W ä˜';ìàR;„: äÐR;ì æäüR;L%åÐR;ð… äÐR;ìd9ähS;âèM;´BQâ€S;ü0R;ö, âì{öùÿõ;õ(öýÿíL%åkõýÿí… ä)öùÿõ{öùÿõýÿíü·äýÿíxÃä(öýÿíL%å,öýÿí… ä,öýÿí“ ävõýÿíÀÑ ä(ö)ö)ö;öùÿõýÿíä ä(övõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿíL%å,öýÿí“ ävõýÿíÌ' ä(ö)ö)ö,öýÿíxÃä)ö;öùÿõ}öùÿõ<õùÿõýÿí“ ävõýÿíœêä(övõýÿíx†ävõýÿ팊ä(öýÿí„: ä,öýÿíL%å,öýÿí“ ävõýÿíÌ' ä(ö)ö)ö,öýÿí“ ävõýÿíp ä(ö)ö)ö;öùÿõ}ö¬[;ÀÑ ä([;äÀÑ d[;äYÿå â t[;ÀÑ â ¤d9„[;˜[;ä¨#;ìâô&;è@\;Ì' ä¼[;äÌ' ø[;äYÿå â \;Ì' â ¤d9\;,\;ä¨#;ìâô&;èÔ\;p äP\;äp Œ\;äYÿå â œ\;p â ¤d9¬\;À\;ä¨#;ìâô&;èh];°‚ ää\;@d9°‚ ];ÿèäL];쀀âèc9 î|W ä˜';êü];¤ äx];@d9¤ ´];ÿèäà];äø%;䀀âèc9 î|W ä˜';ê^;0 ä ^;@d90 H^;ÿèät^;äø%;䀀âèc9 î|W ä˜';ê`;ü @_; ^;@d9ü Ü^;âÿèä_;ì€âèc9 ê$_;|W ä˜';ðŒ0äø%;ðH_;@d9ü „_;âÿèä°_;ì€âèc9 êÌ_;|W ä˜';ìè_;Œ0äø%;ðfäÌ);ê˜`; Úä`;ä ÚP`;äYÿå â ``; Ú â ¤d9p`;„`;ä¨#;ìâô&;è,a;°’ ä¨`;ä°’ ä`;äYÿå â ô`;°’ â ¤d9a;a;ä¨#;ìâô&;èÜa;ÿ äö(öýÿí„: ä)ö,öXõ<öýÿí |ä>ö(öýÿí… ä)ö)ö;ö}ú\i;@d9„, ˜i;âî°j;äì¼ îäÄi;ìâèc9ìài;|W ä˜';ìüi;зä0%;ì(j;„: äj;ì æäDj;… äj;ð 7ä`j;ì âô#;pj;æ„j;è4ÿêd9åk;âÄf;„, âk;ü\i;öôã âì{öùÿõýÿíü·äýÿíxÃä(öýÿí„: ä,öýÿí… ä,öýÿí“ ävõýÿíÀÑ ä(ö)ö)ö;öùÿõýÿíä ä(öýÿíзä,öýÿíxÃä)ö;öùÿõ}ön;œêä˜m;äœêÔm;äYÿå â äm;œê â ¤d9ôm;n;ä¨#;ìâô&;è°n;,X ä,n;ä,X hn;äYÿå â xn;,X â ¤d9ˆn;œn;ä¨#;ìâô&;è`o;ˆpäÀn;@d9ˆpün;ÿèä(o;ì€âèc9êDo;|W ä˜';ð`0åŒ/;ì"r;ä ,p;po;@d9ä ¬o;ÿèäØo;ì€âèc9êôo;|W ä˜';ìp;зä0%;ð`0åŒ/;ì q;4p;@d9ä pp;ÿèäœp;ì€âèc9ê¸p;|W ä˜';ìÔp;зä0%;ìðp;`0åŒ/;ðä&å0%;ðq;@d9ä Pq;ÿèä|q;ì€âèc9ê˜q;|W ä˜';ì´q;зä0%;ìÐq;`0åŒ/;ììq;„: ä0%;ð… ä0%;ì¸r;8òär;@d98òTr;ÿèä€r;ì€âèc9êœr;|W ä˜';ðfäÌ);êˆ};RäÈr;@d9Rs;âîxs;ä|¼ îä0s;ìâèc9ìLs;|W ä˜';ðÐú ähs;ì æäd9äÈs;â°j;Rgâàs;üÈr;ö‹ âì{öùÿõýÿí¤Ìäýÿí¨$å=öýÿí“ ävõýÿíp ä(ö)ö;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿí“ ävõýÿíÌ' ä(ö)ö;öýÿíä&åkõýÿí¨$å;öpõýÿíä&å)öùÿõ{öùÿõ;õ(öýÿíÐú ä(ö*öýÿíä&å)ö)öùÿõ{öùÿõýÿí¤Ìäýÿíˆ'å=öýÿíä&å;öùÿõ@õ(öpõýÿíˆ'å;öýÿíˆ'åkõýÿí¨$å;öpõýÿíˆ'å)öùÿõ;õ(ö!öýÿíÐú ä(ö*öýÿíˆ'å)ö)öùÿõCõ;öùÿõýÿíä&å=öýÿí“ ävõýÿíœêä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõ;õ(öýÿíä&åjõýÿí¨$å)öùÿõCõ;öùÿõ}öùÿõ}öùÿõ}ö"܇;0H ~;˜};@d90H Ô};ÿèå~;ì€âèc9î|W ä˜';ð$~;@d90H `~;âîÔ~;ä¾ îäŒ~;ìâèc9ì¨~;|W ä˜';ð“äÄ~;ì æäd9ä$;âxs;0H \â<;ü$~;öäËâì{öùÿõýÿí¤Ìäýÿí¨$å=öýÿí“ ävõýÿíp ä(ö)ö;öùÿõ@õ(öýÿí¤Ìäýÿíä&å=öýÿí“ ävõýÿíÌ' ä(ö)ö;öýÿíä&åkõýÿí¨$å;ö)öùÿõ{öùÿõýÿí¤Ìäýÿíˆ'å=öýÿíä&å;öùÿõ@õ(öpõýÿíˆ'å;öýÿíˆ'åkõýÿí¨$å;öpõýÿíˆ'å)öùÿõ;õ(ö!öýÿí“ä(ö*öýÿíä&å,ö*öýÿíˆ'å)ö)öùÿõCõ;öùÿõpõýÿíä&å;öùÿõ;õ(öýÿíä&åkõýÿíˆ'å)öùÿõýÿíä&å=öýÿí“ ävõýÿíœêä(öýÿíä&å,öýÿíˆ'å)ö;öùÿõ}öùÿõ}öˆŠ;pôäì‡;@d9pô(ˆ;븈;äp½ îäTˆ;ìâèc9ìpˆ;|W ä˜';쌈;`0åŒ/;ð€;䨈;ì æäd9ä‰;âÔ~;pôâ ‰;üì‡;ö”r âì{öýÿí“ ävõNõýÿípôä<öýÿí”r ä>ö(öýÿí`0å,öýÿí€;ä)ö;ö}ö‹;èa䘊;äèaÔŠ;äYÿå â äŠ;èa â ¤d9ôŠ;‹;ä¨#;ìâô&;è°‹;¼• ä,‹;伕 h‹;äYÿå â x‹;¼• â ¤d9ˆ‹;œ‹;ä¨#;ìâô&;è°;œ>|Œ;À‹;@d9œ>ü‹;âÿèä(Œ;ì€âèc9êDŒ;|W ä˜';ì`Œ;´)åø%;ðfäÌ);;@d9œ>ÀŒ;âîP;ä,» îäìŒ;ìâèc9ì;|W ä˜';ì4;„: ä$;ì æè… ä$;ìd9ä ;⸈;œ>â¸;ü„Œ;öôã âì{öùÿõ@õ(ö;öýÿí„: äkõýÿí… ä;öpõýÿí„: ä)öùÿõýÿíü„ä(ö*öýÿí„: ä)ö;öùÿõ}öD;4¦äÀ;ä4¦ü;äYÿå â  ;4¦ â ¤d9;0;ä¨#;ìâô&;ìØ ô;T;@d9Ø ;âÿèä¼;ä0%;ä€âèc9êØ;|W ä˜';ð„+åø%;ðü;@d9Ø 8‘;ÿèäd‘;ä”%;䀀âèc9ꀑ;|W ä˜';î„+åø%;ì´‘;öýÿí(ä)öùÿõýÿíHôä(öýÿí“ ävõýÿíp ä(ö)ö,öýÿíŒ0ä-öýÿí(ä,öýÿífä)ö;öùÿõ<õ;õ(öýÿíŒ0ä<öýÿí(ä)öùÿõýÿí“ ävõýÿíœêä(öýÿíØ ä(öýÿíŒ0ä)ö,öýÿí“ ävõýÿíp ä(ö)ö)ö;öùÿõ}ö Ô;ì—; ^;î=â˜;ò˜;öýÿí(ä)öùÿõýÿíHôä(öýÿí“ ävõýÿíp ä(ö)ö,öýÿíŒ0ä-öýÿí(ä,öýÿí |ä(ö)ö)ö;öùÿõ<õ;õ(öýÿíŒ0ä<öýÿí(ä)öùÿõýÿí“ ävõýÿíœêä(öýÿíØ ä(öýÿíŒ0ä)ö,öýÿí“ ävõýÿíp ä(ö)ö)ö;öùÿõ}ö ¨ ;ž;ˆd;îâ8ž;ò ž;öýÿíŒ0ä)öùÿõ{öùÿõýÿíü·äýÿíxÃä(öýÿí´)å-öýÿíŒ0ä,öýÿíà-å,öýÿí“ ävõýÿíÀÑ ä(ö)ö)ö;öùÿõ@õ(ö;öýÿíä&åkõýÿí¨$å;öpõýÿíä&å)öùÿõ*öýÿíä&å=öýÿíà-å;öùÿõýÿíä ä(öýÿíä&å,öýÿíxÃä)ö;öùÿõ}öùÿõ<õùÿõ{öùÿõ@õ(ö;öýÿí´)åkõÿÿô;öqõýÿí´)å,öpõýÿíä&å)öùÿõ*öýÿíä&å=öýÿíà-å;öùÿõýÿí“ ävõýÿíœêä(öýÿíä&å,öýÿí¨$å)ö;öùÿõ}öùÿõ}ö À´;€¬;T;îVâ°¬;ò˜¬;öÿÿô;öqõýÿí´)å)öùÿõýÿíü„ä(öýÿífä)ö;öùÿõ}öè¸;äü;îâ8·;ò{öDõTõ<öýÿíü·ä&ö>ö(ö*öOõ)ö.öýÿíØ ä(öýÿí„+å)ö;ö}ö<º;ä˜};î â¹;ò{öýÿí0H ä(öýÿíhä<öýÿí |ä>ö(ö)ö)ö;ö}öø¼;är;îâpº;ò{öýÿíRä(öýÿí¬µ ä<öýÿíhä<öýÿí |ä>ö,ö!õýÿí |ä&ö>ö(öýÿíhä<öýÿí |ä>ö(ö)ö,öýÿífä)ö)ö;ö}ö”¾;äq;îâ,½;ò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å,öýÿí„: ä,öýÿí… ä)ö;ö}÷À;ä4p;î âȾ;ò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å,öýÿíä&å)ö;ö}ö<Á;äpo;î â4À;ò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å)ö;ö}öHÂ;äÀn;î âpÁ;ò{öýÿí“ ävõýÿíˆpä(öýÿí`0å)ö;ö}öœÃ;äÄc;î â|Â;ò{öDõýÿí“ ävõýÿíHôä(öýÿíзä,öýÿí`0å)ö;ö}ö8Å;ä€b;îâÐÃ;ò{öýÿí“ ävõýÿíHôä(öýÿí“ ävõýÿíp ä(ö)ö,öýÿí`0å)ö;ö}öÔÆ;äövõýÿí ¸ ä(ö)ö;ö}ö|É;äx];î â¤È;ò{öDõýÿí“ ävõýÿíŒ0ä(ö)ö;ö}ö¸Ê;ää\;î â°É;ò{öDõýÿí“ ävõýÿíŒ0ä(ö)öjõÿÿô;ö}öœÏ;äÔ5;î2âìÊ;ò{ö;õ(öOõkõ&öýÿí`0å)öùÿõýÿí´Bä(öýÿí`0å.öýÿíÌ' ä(ö)ö,öýÿí`0å.öýÿíØ ä(övõýÿíx†ävõýÿíÔ6 ä(öýÿí¤ ä(ö)ö,öýÿí`0å.öýÿí¤ ä(ö)ö)ö)ö,öýÿí`0å.öýÿíp ä(ö)ö)ö;öDõ*öOõ;ö}ö@Ò;äì.;îâÐÏ;ò:öýÿí“ ä(öýÿí`0å.öýÿíÀÑ ä(ö)ö)ö{öýÿíœ>ä(öýÿí`0å.öýÿíÌ' ä(ö)ö,öýÿí`0å.öýÿíp ä(ö)ö)ö;ö}öÄÓ;ää);îâtÒ;ò:öýÿí“ ä(öýÿíÄ"å)ö{öýÿíœ>ä(öýÿí´)å,öýÿífä)ö;ö}öÐÔ;ä);î âøÓ;ò{öýÿíœ>ä(öýÿí´)å,öýÿífä)ö;ö}ö Ö;äh(;î âÕ;ò{öýÿíœ>ä(öýÿí´)å,öýÿí |ä(ö)ö)ö;ö}öèÖ;ä°';îâ@Ö;ò:öýÿí“ ä(öýÿíÄ"å)ö{ö}þ';îâ×;ò{ö}ö¬×;øt×;ä â ¤d9„×;˜×;ä¨#;ìâô&;èÔ×;øˆd9æü×;øô#;è$Ø;ø¬$;æLØ;øè$;ætØ;ø$%;æœØ;øˆ%;æÄØ;øì%;æìØ;ø(&;æÙ;ød&;æ<Ù;ø€&;ædÙ;øœ&;æŒÙ;øØ&;æ´Ù;ø';æÜÙ;ø°';æÚ;øh(;æ,Ú;ø);æTÚ;øä);æ|Ú;øì.;æ¤Ú;øÔ5;æÌÚ;ø„=;æ<Û;øôÚ;ä â Û;ÀÑ â ¤d9Û;(Û;ä¨#;ìâô&;è¬Û;ødÛ;ä â tÛ;Ì' â ¤d9„Û;˜Û;ä¨#;ìâô&;èÜ;øÔÛ;ä â äÛ;p â ¤d9ôÛ;Ü;ä¨#;ìâô&;èDÜ;øä\;ælÜ;øx];æ”Ü;ø ^;æ¼Ü;ø ^;æäÜ;øH_;æTÝ;ø Ý;ä â Ý; Ú â ¤d9,Ý;@Ý;ä¨#;ìâô&;èÄÝ;ø|Ý;ä â ŒÝ;°’ â ¤d9œÝ;°Ý;ä¨#;ìâô&;èìÝ;øáçÕÿíðÿÑááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿä ðÿÿÕááÿÿÿÿÿõâ¤å@Aÿä ïÿÕááÿÿÿÿìáÏÿÿáâæ ÿä ðÿÿÕááÿÿÿÿÿõâžæ@ÿäðÿÑááÿÿÿ÷â•æ@ôéÄ<ü:áäÑÿáø<2€è$ <üéP <ü:áÔíä¤ÿá¸äŒ <˜ <æ ⨠<æÿ„äü9äüï ää <Ìküï <ÿìä< <ïáX <ÿåî-ì<¿ä„ <Ìk¿À <äê <öäÜ <ìááø <ÿôˆ <° <åçäçæááxýâ`0é­á@Ð0é®á @€áøäÈ <ä2€èô <ü8é <ì <\ <ô:âL <ä° <ü â\ <æäx <ïá” <ÿôÌk4\ <æÿä x <ô <2€è <üéL <ü:áÔíä­ÿဠ<2€è¬ <üéØ <ü:áÔíä®ý<@ äœnäðð ä$<â l<ðð <<èâÌkT<äÀ]ä $< `<<ðÔÑ<<ìÈíä”<ÌkÈíÐ<ð<öäì<ìáý|<<åçäçæááxýâè#é{â@;âpDä¨<ä7é Ô<`<Œ<ôê<°<øé,<„<øéX<ü:áîä{þ4ÿêéÜ<4<øé<ü:áîä{þ4ëý4ÿêé¸<€<ø2éä<üé<üá¼p-ä<<Ð<øá¼p-äh<üáàm-ä”<¤<øáàm-äÀ<üá8a-äì<x<ø8á8a-ä <D<P~-ô:â@~-äˆ~-ÿàL<4êþ4ê¼ý4êþ éü<T<øé(<ü:áîä{þ4êþ4ê€þè< ä¼<Ìk ø<ÿìä<ïá0<èœBìL<øh<ÿä„<ì â”<æä°<òÌ<èœBöœBîÔ‡äø<<æâ4<Ô‡è\<èâpæÌkÔ‡ä<äT<ãá$<˜Räd<4<˜R <ÿèäÜ<äÌ<äã<ì â< ä<èø<ì â<ðÌ<êL<, ä4<æ, èæÄ@ä\<â 4<Ä@|JìPó ä„<äžæ¨<è <hž+äÄ™+ä<å ¸<Ìk<áô<ð,<öä<ìáý <´<åçäçæááxýâè#é‹â@CâpDäÌ<ä7é ø<„<Ü<ôé$<Ô<øéP<¨<øé|<ü:áîä‹þ4ÿêê<X<øé,<ü:áîä‹þ4ëýé°<ü:áîä‹þ2é<üé4<üáTDä`<ô<øáTDäŒ<üáàm-ä¸<È<øáàm-ää<üá8a-ä<œ<ø8á8a-ä <<h<P~-ô:â@~-äˆ~-ÿàp<4êþ4ê¼ý4êþé <ü:áîä‹þd<¼‰\<œ¬!ä$Ÿ!äˆÃät<ÌkˆÃ°<äê<öäÌ<ìááè<ÿôx< <åçäçæááxýâ`0é¨á@Ð0é©á @~áøä¸<ä2€èä<ü8é <<<\ <ô:âL <ä° <ü È<D<2€èp<üéœ<ü:á`ûä¨ÿáÐ<2€èü<üé( <ü:á`ûä©ÿâõ ä d <Ìkáõ   <äêØ <öä¼ <ìýL!<`!<åçäçæááxýâ`0é á @jáøäx!<ä2€è¤!<ü8é Ð!<ü!<@<ô:â0<äx<ÿà"<2€è0"<üé\"<ü:á`ûä ÿáÀ ä˜"<ÌkÀ Ô"<äê #<öäð"<ìý€#<”#<åçäçæááxýâ`0éÜá@îâøä¬#<ä2€èØ#<ü8é $<E<@$<ô:â0$<äx$<ü â@$<æä\$<ìýÌk,• @$<äää´$<ö(%<(P%<åçäçáæááxýâ`0éáÀðzèá €”áŒMä)<ä•áŒMä<)<ä—áŒMìšáŒMä*<Šâ›áŒMä+<ŠâœáŒMä¨+<ŠâáŒMä4,<ŠâžáŒMäÀ,<ŠâŸáŒMäL-<Šâ áŒMäØ-<Šâ¡áŒMäd.<Šâ¢áŒMäð.<Šâ£áŒMä|/<Šâ¤áŒMä0<Šâ¥áŒMä”0<Šâ¦áŒMä 1<Šâ§áŒMä¬1<Šâ¨áŒMä82<Šâ©áŒMì©áŒMäÄ2<Šâ¬áŒMäP3<Šâ­áŒMäÜ3<Šâ®áŒMäh4<Šâ¯áŒMäô4<Šâ°áŒMä€5<Šâ±áŒMä 6<Šâ²áŒMä˜6<Šâ³áŒMä$7<Šâ´áŒMì´áŒMä°7<Šâ¶áŒMä<8<Šâ¹áŒMäÈ8<ä»áŒMì¼áŒMä 9<#â½áŒMäˆB<ä½áŒMìÀáŒMäàB<&âÁáŒMä@D<äÁáŒMìÃáŒMälD<ä>áçý\)<äâ âðåðãéˆ)<d*<øé´)<üáîäà)<8*<ø2áîä *<ü:áäý4êþ4ìðÿë ðÿááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäðÿááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ²æ@ÿäñÿÿÿÿââ|æ@ÿä ðÿäÿûâ“æ@ÿäñÿÿÿÿââ»æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâ@ÿáâæ ÿäðÿÿäáâ8ÿñâ,å @ÿãñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ¬æ@ÿä ðÿäáÿøâ•æ@ÿäðÿÿäáâ°ÿñâ3ç@ÿã ïÿäáðÿåâæ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ¬æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ{æ@ÿäñÿÿÿÿââ¿æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââæ@ÿä ðÿäáÿøâ•æ@ÿä ðÿááÿÿÿ÷âŸå€Àÿä ðÿááÿÿÿ÷â•æ@ôéô8<ü:áäýéL9<\B<ø8é x9<üA<´9<ô:â¤9<äì9<ü â´9<æäÐ9<ìýä,ƒ ´9<âê(:<öœ:<°:<åçäçæááxýâ`0é®áÀkâT5äH<<ämâT5ìoâT5ä°=<âoâT5ää><âoâT5ìoâT5äh?<äoâT5ìpâT5ä”?<äsâT5ìuâT5äÀ?< âuâT5äô@< âuâT5ìuâT5äxA<äuâT5ìvâT5ä¤A<äzâT5ì{âT5äÐA<ä|<<äâðâðåðåé¨<<„=<øéÔ<<üáîå=<X=<ø2áîä,=<ü:áä®ý4êþ4ìðûéÜ=<¸><øé><üáîä4><Œ><ø2áîä`><ü:áä®ý4êþ4êÿÿüé?<ü2áîä=è|Jö8oì4>=0×ä,>=äÁæ×äD>=Ìk×€>=ÿìäœ>=ïá¸>=éî-ø ˜îÄ ää>=hÜ'æ`7p?=ü>=Ìk`78?=æÿääT?=ïýˆC=x?=Ìk`7´?=îì?=öäÐ?=ìáý`@=t@=åçäçæááxýâ`0éÍá @ÀáT5äŒ@=ä8é ¸@=(C=ô@=ô:âä@=ä,A=ü âô@=æäA=ìáýÌkdÂô@=äêhA=öÜA=ðA=åçäçæááxýâ`0éˆá@®âøäB=ä2€è4B=ü8é `B=œB=8?=ô:âŒB=äü>=ü â8?=ê¤B=2€èÐB=üéüB=ü:á`ûäˆÿá0C=é\C=ü:á`ûäÍýG=C=Ìk`7ÌC=îD=öäèC=ìáýxD=ŒD=åçäçæááxýâ`0éÑá @ÂáT5ä¤D=ä8é ÐD=0G= E=ô:âüD=äDE=ü â E=æä(E=ìáýÌk¬½ E=äê€E=öôE=F=åçäçæááxýâ`0é”á@´âøä F=ä2€èLF=ü8é xF=¤F=8?=ô:âŒB=äü>=ÿà¬F=2€èØF=üéG=ü:áÔíä”ÿá8G=édG=ü:áÔíäÑýI=˜G=Ìk`7ÔG=î H=öäðG=ìáý€H=”H=åçäçæááxýâ`0é‰á@>âlä¬H=ä8é ØH=I=8?=ô:âŒB=äü>=ÿà I=2€è8I=üédI=ü:áîä‰ýK=˜I=Ìk`7ÔI=î J=öäðI=ìáý€J=”J=åçäçæááxýâ`0éá@@âlä¬J=ä8é ØJ=K=8?=ô:âŒB=äü>=ÿà K=2€è8K=üédK=ü:ápäýM=˜K=Ìk`7ÔK=î L=öäðK=ìáý€L=”L=åçäçæááxýâ`0é‘á@Bâlä¬L=ä8é ØL=M=8?=ô:âŒB=äü>=ÿà M=2€è8M=üédM=ü:áX-ä‘ýO=˜M=Ìk`7ÔM=î N=öäðM=ìáý€N=”N=åçäçæááxýâ`0é•á@Dâlä¬N=ä8é ØN=O=8?=ô:âŒB=äü>=ÿà O=2€è8O=üédO=ü:áLbä•ýQ=˜O=Ìk`7ÔO=î P=öäðO=ìáý€P=”P=åçäçæááxýâ`0é™á@Gâlä¬P=ä8é ØP=Q=8?=ô:âŒB=äü>=ÿà Q=2€è8Q=üédQ=ü:á\-ä™ÿá˜Q=Ìk`7ÔQ=î R=öäðQ=ìáý€R=”R=åçäçæááxýâ`0éá@Kâlä¬R=ä8é ØR=S=8?=ô:âŒB=äü>=ÿà S=2€è8S=üédS=ü:á(^-äý¨S=¨" ä S=à'æ”" ä¸S=Ìk”" ôS=ÿìäT=ïá,T=è|JêHT=è8oÿìà# ätT=Ìkà# °T=ÿìäÌT=ä|JçáèT=è|JìU=è|Jö8oðT äœÙ-ä $;@U= æ+äá+ä ЦXU=P",äP,äx ä ð'%€U=Þä àÔ%˜U=\©äU=Ù'æD©ä¨U=ÌkD©äU=ÿììpt-çå”Éä à¢+0V=øŸá V=Ì÷(V=0õä 4òHV=à ä@V= Gâ°V=Ð äXV=ÌkÐ ”V=ÿì÷å´ªäÀV=Ìk´ªüV=î4W=öäW=ìîî-ì¨W=¼W=åçäçæááxýâd& áî-äSâ@ƒâD€äÔW=ä2€éX=üé,X=üâî-äXX=°X=øâî-ä„X=ü:áDò8äSþ4ê þ Œ|=œâìa=ìX=Ìkœâ(Y=äää|Y=öäDY=ìá`Y=ÿäìðY= ,Z=åçäçáæááxýâ`0éèá À€M äéáÀðzèíá €9áŒMäd[=ä=áŒMä[=Šâ>áŒMä\=Šâ?áŒMä¨\=Šâ@áŒMä4]=ŠâAáŒMäÀ]=ŠâBáŒMäL^=ŠâCáŒMäØ^=ŠâDáŒMäd_=ŠâEáŒMäð_=ŠâFáŒMä|`=ŠâGáŒMäa=ŠâIáŒMä”a=ä>áçíÿíðÿèááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿä ðÿíááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿäðÿäÿûâ“æ@ÿä ðÿíááÿÿÿ÷âŸå€Àÿä ïÿäáìéááÿÿÿáâ ÿìðÿäáÿÿÿõâ•æ@ÿäñÿÿÿÿââæ@ÿäðÿèááÿÿÿ÷â•æ@ôéÀa=ü:áäèýŒg=ôa=Ìkœâ0b=î„b=öäLb=ìááhb=ÿäÔíìøb=Hc=åçäçæááxýâ`0éÏá @€M ÔíäÐá@lÅ èÔá€üèÕãqáT5äÀc=äráT5äìc=äráT5äd=äsáT5äðe=ätáT5ä4g=ä>áçÔý>áçÕýéDd=œd=øépd=ü:áÔíäÕý2€èÈd=ü8é ôd=0e=(Y=ô:â e=äìX=ü â(Y=æ ¼e=8e=2€ède=üée=ü:áÔíäÏÿáÄe=:áäÔýéf=°f=øéHf=üáÔíätf=ü:á f=äÐý âÔíæ2€èÜf=üég=ü:áäÔýé`g=ü:áÔíäÕým=”g=ÌkœâÐg=î$h=öäìg=ìááh=ÿä`ûì˜h=èh=åçäçæááxýâ`0éÖá @€M `ûä×á@lÅ èÛá€üèÜãyáT5ä`i=äzáT5äŒi=äzáT5ä¸i=ä{áT5ä€k=ä|áT5äÄl=ä>áçÛý>áçÜýéäi=álädË=ä8é Ë=¼Ë=Ø|=ô:â‡=äœ|=ü HÌ=ÄË=2€èðË=üéÌ=ü:áLbäµ ÿáPÌ=2€è|Ì=üé¨Ì=ü:áX-ä¶ ýÏ=ÜÌ=Ìk(¯Í=îlÍ=öä4Í=ìááPÍ=ÿôàÍ=Î=åçäçæááxýâ`0éº á@Ð0é» á @Aálä Î=ä8é LÎ=xÎ=Ø|=ô:â‡=äœ|=ü Ï=€Î=2€è¬Î=üéØÎ=ü:á\-äº ÿá Ï=2€è8Ï=üédÏ=ü:áX-ä» ýLÒ=˜Ï=Ìk(¯ÔÏ=î(Ð=öäðÏ=ìáá Ð=ÿôœÐ=ÄÐ=åçäçæááxýâ`0é¿ á@Ð0éÀ á @EáläÜÐ=ä8é Ñ=4Ñ=Ø|=ô:â‡=äœ|=ü ÀÑ=<Ñ=2€èhÑ=üé”Ñ=ü:á(^-ä¿ ÿáÈÑ=2€èôÑ=üé Ò=ü:áX-äÀ ýÕ=TÒ=Ìk(¯Ò=îäÒ=öä¬Ò=ìááÈÒ=ÿôXÓ=€Ó=åçäçæááxýâ`0éÄ á@Ð0éÅ á @Hálä˜Ó=ä8é ÄÓ=ðÓ=Ø|=ô:â‡=äœ|=ü |Ô=øÓ=2€è$Ô=üéPÔ=ü:á`ûäÄ ÿá„Ô=2€è°Ô=üéÜÔ=ü:áX-äÅ ý˜×=Õ=Ìk(¯LÕ=î Õ=öähÕ=ìáá„Õ=ÿôÖ=<Ö=åçäçæááxýâ`0éÉ á@Ð0éÊ á @JáläTÖ=ä8é €Ö=¬Ö=,‹=ô:â‹=䀋=ü ×=´Ö=éàÖ=ü:áÔíäÉ ÿá×=2€è@×=üél×=ü:áX-äÊ ý(Ú= ×=Ìk(¯Ü×=î0Ø=öäø×=ìááØ=ÿô¤Ø=ÌØ=åçäçæááxýâ`0éÎ á@Ð0éÏ á @LálääØ=ä8é Ù=<Ù=Ø|=ô:â‡=äœ|=ü œÙ=DÙ=épÙ=ü:áäÎ ÿá¤Ù=2€èÐÙ=üéüÙ=ü:áLbäÏ ýäÜ=0Ú=Ìk(¯lÚ=îÀÚ=öäˆÚ=ìáá¤Ú=ÿô4Û=\Û=åçäçæááxýâ`0éÓ á@Ð0éÔ á @NálätÛ=ä8é  Û=ÌÛ=Ø|=ô:â‡=äœ|=ü XÜ=ÔÛ=2€éÜ=üé,Ü=ü:áîäÓ ÿá`Ü=2€èŒÜ=üé¸Ü=ü:áLbäÔ ý ß=ìÜ=Ìk(¯(Ý=î|Ý=öäDÝ=ìáá`Ý=ÿôðÝ=Þ=åçäçæááxýâ`0éØ á@Ð0éÙ á @Pálä0Þ=ä8é \Þ=ˆÞ=Ø|=ô:â‡=äœ|=ü ß=Þ=2€è¼Þ=üéèÞ=ü:ápäØ ÿáß=2€èHß=üétß=ü:áLbäÙ ý\â=¨ß=Ìk(¯äß=î8à=öåà=ìááà=ÿô¬à=Ôà=åçäçæááxýâ`0éÝ á@Ð0éÞ á @Ráläìà=ä8é á=Dá=Ø|=ô:â‡=äœ|=ü Ðá=Lá=2€èxá=üé¤á=ü:áX-äÝ ÿáØá=2€èâ=üé0â=ü:áLbäÞ ýå=dâ=Ìk(¯ â=îôâ=öä¼â=ìááØâ=ÿôhã=ã=åçäçæááxýâ`0éâ á@Ð0éã á @Tálä¨ã=ä8éÔã=áä=Ø|=ô:â‡=äœ|=ü Œä=ä=2€è4ä=üé`ä=ü:áLbäâ ÿá”ä=2€èÀä=üéìä=ü:áLbäã ýÔç= å=Ìk(¯\å=î°å=öäxå=ìáá”å=ÿô$æ=Læ=åçäçæááxýâ`0éç á@Ð0éè á @Wálädæ=ä8é æ=¼æ=Ø|=ô:â‡=äœ|=ü Hç=Äæ=2€èðæ=üéç=ü:á\-äç ÿáPç=2€è|ç=üé¨ç=ü:áLbäè ýê=Üç=Ìk(¯è=îlè=öä4è=ìááPè=ÿôàè=é=åçäçæááxýâ`0éì á@Ð0éí á @[álä é=ä8é Lé=xé=Ø|=ô:â‡=äœ|=ü ê=€é=2€è¬é=üéØé=ü:á(^-äì ÿá ê=2€è8ê=üédê=ü:áLbäí ýLí=˜ê=Ìk(¯Ôê=î(ë=öäðê=ìáá ë=ÿôœë=Äë=åçäçæááxýâ`0éñ á@Ð0éò á @^áläÜë=ä8é ì=4ì=Ø|=ô:â‡=äœ|=ü Àì=<ì=2€èhì=üé”ì=ü:á`ûäñ ÿáÈì=2€èôì=üé í=ü:áLbäò ýÜï=Tí=Ìk(¯í=îäí=öä¬í=ìááÈí=ÿôXî=€î=åçäçæááxýâ`0éö á@Ð0é÷ á @`álä˜î=ä8é Äî=ðî=,‹=ô:â‹=䀋=ü Pï=øî=é$ï=ü:áÔíäö ÿáXï=2€è„ï=üé°ï=ü:áLbä÷ ýlò=äï=Ìk(¯ ð=îtð=öä<ð=ìááXð=ÿôèð=ñ=åçäçæááxýâ`0éû á@Ð0éü á @cálä(ñ=ä8é Tñ=€ñ=Ø|=ô:â‡=äœ|=ü àñ=ˆñ=é´ñ=ü:áäû ÿáèñ=2€èò=üé@ò=ü:á\-äü ý(õ=tò=Ìk(¯°ò=îó=öäÌò=ìááèò=ÿôxó= ó=åçäçæááxýâ`0ê á@Ð0é á @fálä¸ó=ä8é äó=ô=Ø|=ô:â‡=äœ|=ü œô=ô=2€èDô=üépô=ü:áîå ÿá¤ô=2€èÐô=üéüô=ü:á\-ä ýä÷=0õ=Ìk(¯lõ=îÀõ=öäˆõ=ìáá¤õ=ÿô4ö=\ö=åçäçæááxýâ`0é á@Ð0é á @hálätö=ä8é  ö=Ìö=Ø|=ô:â‡=äœ|=ü X÷=Ôö=2€é÷=üé,÷=ü:ápä ÿá`÷=2€èŒ÷=üé¸÷=ü:á\-ä ý ú=ì÷=Ìk(¯(ø=î|ø=öäDø=ìáá`ø=ÿôðø=ù=åçäçæááxýâ`0é á@Ð0é á @jálä0ù=ä8é \ù=ˆù=Ø|=ô:â‡=äœ|=ü ú=ù=2€è¼ù=üéèù=ü:áX-ä ÿáú=2€èHú=üétú=ü:á\-ä ý\ý=¨ú=Ìk(¯äú=î8û=öåû=ìááû=ÿô¬û=Ôû=åçäçæááxýâ`0é á@Ð0é á @láläìû=ä8é ü=Dü=Ø|=ô:â‡=äœ|=ü Ðü=Lü=2€èxü=üé¤ü=ü:áLbä ÿáØü=2€èý=üé0ý=ü:á\-ä ý>dý=Ìk(¯ ý=îôý=öä¼ý=ìááØý=ÿôhþ=þ=åçäçæááxýâ`0é á@Ð0é á @oálä¨þ=ä8éÔþ=áÿ=Ø|=ô:â‡=äœ|=ü Œÿ=ÿ=2€è4ÿ=üé`ÿ=ü:á\-ä ÿá”ÿ=2€èÀÿ=üéìÿ=ü:á\-ä ýÔ> >Ìk(¯\>î°>öäx>ìáá”>ÿô$>L>åçäçæááxýâ`0é á@Ð0é á @sáläd>ä8é >¼>Ø|=ô:â‡=äœ|=ü H>Ä>2€èð>üé>ü:á(^-ä ÿáP>2€è|>üé¨>ü:á\-ä ý>Ü>Ìk(¯>îl>öä4>ìááP>ÿôà>>åçäçæááxýâ`0é á@Ð0é á @válä >ä8é L>x>Ø|=ô:â‡=äœ|=ü >€>2€è¬>üéØ>ü:á`ûä ÿá >2€è8>üéd>ü:á\-ä ý >˜>Ìk(¯Ô>î(>öäð>ìáá >ÿôœ>Ä>åçäçæááxýâ`0é# á@Ð0é$ á @xáläÜ>ä8é >4>,‹=ô:â‹=䀋=ü ”><>éh>ü:áÔíä# ÿáœ>2€èÈ>üéô>ü:á\-ä$ ý° >(>Ìk(¯d>î¸>öä€>ìááœ>ÿô, >T >åçäçæááxýâ`0é( á@Ð0é) á @{áläl >ä8é ˜ >Ä >Ø|=ô:â‡=äœ|=ü $ >Ì >éø >ü:áä( ÿá, >2€èX >üé„ >ü:á(^-ä) ýl >¸ >Ìk(¯ô >îH >öä >ìáá, >ÿô¼ >ä >åçäçæááxýâ`0é- á@Ð0é. á @~áläü >ä8é ( >T >Ø|=ô:â‡=äœ|=ü à >\ >2€èˆ >üé´ >ü:áîä- ÿáè >2€è >üé@ >ü:á(^-ä. ý(>t >Ìk(¯° >î>öäÌ >ìááè >ÿôx> >åçäçæááxýâ`0é2 á@Ð0é3 á @€álä¸>ä8é ä>>Ø|=ô:â‡=äœ|=ü œ>>2€èD>üép>ü:ápä2 ÿá¤>2€èÐ>üéü>ü:á(^-ä3 ýä>0>Ìk(¯l>îÀ>öäˆ>ìáá¤>ÿô4>\>åçäçæááxýâ`0é7 á@Ð0é8 á @‚álät>ä8é  >Ì>Ø|=ô:â‡=äœ|=ü X>Ô>2€é>üé,>ü:áX-ä7 ÿá`>2€èŒ>üé¸>ü:á(^-ä8 ý >ì>Ìk(¯(>î|>öäD>ìáá`>ÿôð>>åçäçæááxýâ`0é< á@Ð0é= á @„álä0>ä8é \>ˆ>Ø|=ô:â‡=äœ|=ü >>2€è¼>üéè>ü:áLbä< ÿá>2€èH>üét>ü:á(^-ä= ý\>¨>Ìk(¯ä>î8>öå>ìáá>ÿô¬>Ô>åçäçæááxýâ`0éA á@Ð0éB á @‡áläì>ä8é >D>Ø|=ô:â‡=äœ|=ü Ð>L>2€èx>üé¤>ü:á\-äA ÿáØ>2€è>üé0>ü:á(^-äB ý>d>Ìk(¯ >îô>öä¼>ìááØ>ÿôh>>åçäçæááxýâ`0éF á@Ð0éG á @‹álä¨>ä8éÔ>á>Ø|=ô:â‡=äœ|=ü Œ>>2€è4>üé`>ü:á(^-äF ÿá”>2€èÀ>üéì>ü:á(^-äG ýÔ> >Ìk(¯\>î°>öäx>ìáá”>ÿô$>L>åçäçæááxýâ`0éK á@Ð0éL á @Žáläd>ä8é >¼>Ø|=ô:â‡=äœ|=ü H>Ä>2€èð>üé>ü:á`ûäK ÿáP>2€è|>üé¨>ü:á(^-äL ýd >Ü>Ìk(¯>îl>öä4>ìááP>ÿôà>>åçäçæááxýâ`0éP á@Ð0éQ á @álä >ä8é L>x>,‹=ô:â‹=䀋=ü Ø>€>é¬>ü:áÔíäP ÿáà>2€è >üé8 >ü:á(^-äQ ýô">l >Ìk(¯¨ >îü >öäÄ >ìááà >ÿôp!>˜!>åçäçæááxýâ`0éU á@Ð0éV á @’álä°!>ä8é Ü!>">Ø|=ô:â‡=äœ|=ü h">">é<">ü:áäU ÿáp">2€èœ">üéÈ">ü:á`ûäV ý°%>ü">Ìk(¯8#>îŒ#>öäT#>ìááp#>ÿôá $>($>åçäçæááxýâ`0éZ á@Ð0é[ á @”álä@$>ä8é l$>˜$>Ø|=ô:â‡=äœ|=ü $%> $>2€èÌ$>üéø$>ü:áîäZ ÿá,%>2€èX%>üé„%>ü:á`ûä[ ýl(>¸%>Ìk(¯ô%>îH&>öä&>ìáá,&>ÿô¼&>ä&>åçäçæááxýâ`0é_ á@Ð0é` á @–áläü&>ä8é ('>T'>Ø|=ô:â‡=äœ|=ü à'>\'>2€èˆ'>üé´'>ü:ápä_ ÿáè'>2€è(>üé@(>ü:á`ûä` ý(+>t(>Ìk(¯°(>î)>öäÌ(>ìááè(>ÿôx)> )>åçäçæááxýâ`0éd á@Ð0ée á @˜álä¸)>ä8é ä)>*>Ø|=ô:â‡=äœ|=ü œ*>*>2€èD*>üép*>ü:áX-äd ÿá¤*>2€èÐ*>üéü*>ü:á`ûäe ýä->0+>Ìk(¯l+>îÀ+>öäˆ+>ìáá¤+>ÿô4,>\,>åçäçæááxýâ`0éi á@Ð0éj á @šálät,>ä8é  ,>Ì,>Ø|=ô:â‡=äœ|=ü X->Ô,>2€é->üé,->ü:áLbäi ÿá`->2€èŒ->üé¸->ü:á`ûäj ý 0>ì->Ìk(¯(.>î|.>öäD.>ìáá`.>ÿôð.>/>åçäçæááxýâ`0én á@Ð0éo á @álä0/>ä8é \/>ˆ/>Ø|=ô:â‡=äœ|=ü 0>/>2€è¼/>üéè/>ü:á\-än ÿá0>2€èH0>üét0>ü:á`ûäo ý\3>¨0>Ìk(¯ä0>î81>öå1>ìáá1>ÿô¬1>Ô1>åçäçæááxýâ`0és á@Ð0ét á @¡áläì1>ä8é 2>D2>Ø|=ô:â‡=äœ|=ü Ð2>L2>2€èx2>üé¤2>ü:á(^-äs ÿáØ2>2€è3>üé03>ü:á`ûät ýì5>d3>Ìk(¯ 3>îô3>öä¼3>ìááØ3>ÿôh4>4>åçäçæááxýâ`0éx á@Ð0éy á @¤álä¨4>ä8éÔ4>á5>,‹=ô:â‹=䀋=ü `5>5>é45>ü:áÔíäx ÿáh5>2€è”5>üéÀ5>ü:á`ûäy ý|8>ô5>Ìk(¯06>î„6>öäL6>ìááh6>ÿôø6> 7>åçäçæááxýâ`0é} á@Ð0é~ á @¦álä87>ä8é d7>7>,‹=ô:â‹=䀋=ü 8>˜7>2€èÄ7>üéð7>ü:áä} ÿá$8>éP8>ü:áÔíä~ ý ;>„8>Ìk(¯À8>î9>öäÜ8>ìááø8>ÿôˆ9>°9>åçäçæááxýâ`0é‚ á@Ð0éƒ á @¨áläÈ9>ä8é ô9> :>,‹=ô:â‹=䀋=ü ¬:>(:>2€èT:>üé€:>ü:áîä‚ ÿá´:>éà:>ü:áÔíäƒ ýœ=>;>Ìk(¯P;>î¤;>öäl;>ìááˆ;>ÿô<>@<>åçäçæááxýâ`0é‡ á@Ð0éˆ á @ªáläX<>ä8é „<>°<>,‹=ô:â‹=䀋=ü <=>¸<>2€èä<>üé=>ü:ápä‡ ÿáD=>ép=>ü:áÔíäˆ ý,@>¤=>Ìk(¯à=>î4>>öäü=>ìáá>>ÿô¨>>Ð>>åçäçæááxýâ`0éŒ á@Ð0é á @¬áläè>>ä8é ?>@?>,‹=ô:â‹=䀋=ü Ì?>H?>2€èt?>üé ?>ü:áX-äŒ ÿáÔ?>ê@>ü:áÔíä ý¼B>4@>Ìk(¯p@>îÄ@>öäŒ@>ìáá¨@>ÿô8A>`A>åçäçæááxýâ`0é‘ á@Ð0é’ á @®áläxA>ä8é ¤A>ÐA>,‹=ô:â‹=䀋=ü \B>ØA>2€èB>üé0B>ü:áLbä‘ ÿádB>éB>ü:áÔíä’ ýLE>ÄB>Ìk(¯áC>îTC>öäC>ìáá8C>ÿôÈC>ðC>åçäçæááxýâ`0é– á@Ð0é— á @±áläD>ä8é 4D>`D>,‹=ô:â‹=䀋=ü ìD>hD>2€è”D>üéÀD>ü:á\-ä– ÿáôD>é E>ü:áÔíä— ýÜG>TE>Ìk(¯E>îäE>öä¬E>ìááÈE>ÿôXF>€F>åçäçæááxýâ`0é› á@Ð0éœ á @µálä˜F>ä8é ÄF>ðF>,‹=ô:â‹=䀋=ü |G>øF>2€è$G>üéPG>ü:á(^-ä› ÿá„G>é°G>ü:áÔíäœ ýlJ>äG>Ìk(¯ H>îtH>öäìááXH>ÿôèH>I>åçäçæááxýâ`0é  á@Ð0é¡ á @¸álä(I>ä8é TI>€I>,‹=ô:â‹=䀋=ü J>ˆI>2€è´I>üéàI>ü:á`ûä  ÿáJ>é@J>ü:áÔíä¡ ýüL>tJ>Ìk(¯°J>îK>öäÌJ>ìááèJ>ÿôxK> K>åçäçæááxýâ`0é¥ á@Ð0é¦ á @ºálä¸K>ä8é äK>L>Ø|=ô:â‡=äœ|=ü œL>L>2€èDL>üépL>ü:áîä¥ ÿá¤L>éÐL>ü:áä¦ ýŒO>M>Ìk(¯@M>î”M>öä\M>ìááxM>ÿôN>0N>åçäçæááxýâ`0éª á@Ð0é« á @¼áläHN>ä8é tN> N>Ø|=ô:â‡=äœ|=ü ,O>¨N>2€èÔN>üêO>ü:ápäª ÿá4O>é`O>ü:áä« ýR>”O>Ìk(¯ÐO>î$P>öäìO>ìááP>ÿô˜P>ÀP>åçäçæááxýâ`0é¯ á@Ð0é° á @¾áläØP>ä8é Q>0Q>Ø|=ô:â‡=äœ|=ü ¼Q>8Q>2€èdQ>üéQ>ü:áX-ä¯ ÿáÄQ>éðQ>ü:áä° ý¬T>$R>Ìk(¯`R>î´R>öä|R>ìáá˜R>ÿô(S>PS>åçäçæááxýâ`0é´ á@Ð0éµ á @ÀálähS>ä8é ”S>ÀS>Ø|=ô:â‡=äœ|=ü LT>ÈS>2€èôS>üé T>ü:áLbä´ ÿáTT>é€T>ü:áäµ ý´T>Ìk(¯ðT>îDU>öä U>ìáá(U>ÿô¸U>àU>åçäçæááxýâ`0é¹ á@Ð0éº á @ÃáläøU>ä8é $V>PV>Ø|=ô:â‡=äœ|=ü ÜV>XV>2€è„V>üé°V>ü:á\-ä¹ ÿáäV>éW>ü:áäº ýÌY>DW>Ìk(¯€W>îÔW>öäœW>ìáá¸W>ÿôHX>pX>åçäçæááxýâ`0é¾ á@Ð0é¿ á @ÇáläˆX>ä8é ´X>àX>Ø|=ô:â‡=äœ|=ü lY>èX>2€èY>üé@Y>ü:á(^-ä¾ ÿátY>é Y>ü:áä¿ ý\\>ÔY>Ìk(¯Z>îdZ>öä,Z>ìááHZ>ÿôØZ>á[>åçäçæááxýâ`0éà á@Ð0éÄ á @Êálä[>ä8é D[>p[>Ø|=ô:â‡=äœ|=ü ü[>x[>2€è¤[>üéÐ[>ü:á`ûäà ÿá\>é0\>ü:áäÄ ÿád\>Ìk(¯ \>îô\>öä¼\>ìááØ\>ÿôh]>]>åçäçæááxýâ`0éÈ á@Ð0éÉ á @Ìálä¨]>ä8éÔ]>á^>,‹=ô:â‹=䀋=ü `^>^>é4^>ü:áÔíäÈ ÿáh^>2€è”^>üéÀ^>ü:áäÉ ÿá€ääü^>Ìk€ä8_>ÿìäT_>ïáp_>éî-ìŒ_>è ˜ö ˜ðEä¸_>ÌkEô_>ÿìä`>ïÿá hç<`>ÜG,ä˜A,äôçPd>T`>Ìkôç`>äääÈ`>öä¬`>ìýPa>åçäçáæááxýâ`0êá ÀYáŒMäÈa>ŠâZáŒMäTb>Šâ[áŒMäàb>Šâ\áŒMälc>Šâ^áŒMäøc>ôñÿÿÿÿââ«æ@ÿäðÿáááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ°æ@ÿäðÿáááÿÿÿ÷â•æ@ôé$d>ü:áåýhh>Xd>Ìkôç”d>îÌd>öä°d>ìáý@e>Te>åçäçæááxýâ`0é¯á @`áT5äle>ä8é ˜e>h>Ôe>ô:âÄe>ä f>ü âÔe>æäðe>ìýÌk¸ãÔe>äêHf>ö¼f>Ðf>åçäçæááxýâ`0ébá @Báøäèf>ä2€èg>ü8é @g>|g>`>ô:âlg>äT`>ü â`>ê„g>2€è°g>üéÜg>ü:á`ûäbÿáh>éü:á`ûä¯ýpl>ph>Ìkôç¬h>îäh>öäÈh>ìáýXi>li>åçäçæááxýâ`0é³á @báT5ä„i>ä8é °i>l>ìi>ô:âÜi>ä$j>ü âìi>æäj>ìýÌk$àìi>äê`j>öÔj>èj>åçäçæááxýâ`0éfá @Dáøåk>ä2€è,k>ü8é Xk>„k>`>ô:âlg>äT`>ÿàŒk>2€è¸k>üéäk>ü:áÔíäfÿál>éDl>ü:áÔíä³ýpn>xl>Ìkôç´l>îìl>öäÐl>ìáý`m>tm>åçäçæááxýâ`0éá @6áläŒm>ä8é ¸m>äm>`>ô:âlg>äT`>ÿàìm>2€èn>üéDn>ü:áîäýpp>xn>Ìkôç´n>îìn>öäÐn>ìáý`o>to>åçäçæááxýâ`0é á @8áläŒo>ä8é ¸o>äo>`>ô:âlg>äT`>ÿàìo>2€èp>üéDp>ü:ápä ýpr>xp>Ìkôç´p>îìp>öäÐp>ìáý`q>tq>åçäçæááxýâ`0éá @:áläŒq>ä8é ¸q>äq>`>ô:âlg>äT`>ÿàìq>2€èr>üéDr>ü:áX-äýpt>xr>Ìkôç´r>îìr>öäÐr>ìáý`s>ts>åçäçæááxýâ`0éá @<áläŒs>ä8é ¸s>äs>`>ô:âlg>äT`>ÿàìs>2€èt>üéDt>ü:áLbäýpv>xt>Ìkôç´t>îìt>öäÐt>ìáý`u>tu>åçäçæááxýâ`0éá @?áläŒu>ä8é ¸u>äu>`>ô:âlg>äT`>ÿàìu>2€èv>üéDv>ü:á\-äÿáxv>Ìkôç´v>îìv>öäÐv>ìáý`w>tw>åçäçæááxýâ`0éá @CáläŒw>ä8é ¸w>äw>`>ô:âlg>äT`>ÿàìw>2€èx>üéDx>ü:á(^-äÿá Hˆ>€x>Ìk ¼x>äää,y>öäØx>ìáôx>øy>ÿäîì y>z>åçäçáæááxýâ`0éWáÀÐ0éXá À ¨îäYá@1é]á€ðzè^ဠgé_á €ÁáŒMä|>äÂáŒMä<|>äÃáŒMäh|>äÇáŒMä”|>ŠâÈáŒMä }>ŠâÉáŒMìÉáŒMä¬}>ŠâËáŒMä8~>ŠâÌáŒMäÄ~>ŠâÍáŒMäP>ŠâÎáŒMäÜ>ŠâÒáŒMäh€>ŠâÓáŒMäô€>ŠâÔáŒMä€>ŠâÕáŒMä ‚>ŠâÖáŒM䘂>Šâ×áŒMä$ƒ>ŠâØáŒMä°ƒ>ŠâÙáŒMä<„>ŠâÜáŒMäÈ„>äÞáŒMäð‡>ä>áç]ý>áç^ý>áç_ÿíðÿXááÿÿÿ÷â“æ@ÿäðÿWááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¾æ@ÿä ðÿäÿûâ¨æAÿä ðÿäáðáÿââæ ÿäðÿÿäáâ¸ÿñâ,å @ÿãðÿ]ááÿÿÿ÷â•æ@ÿäðÿWááÿÿÿ÷â“æ@ÿäðÿXááÿÿÿ÷â“æ@ÿäñÿÿÿÿââæ@ÿä ðÿ^ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿä ðÿ_ááÿÿÿ÷â˜æ@ÿä ðÿ^ááÿÿÿ÷âŸå€Àÿäðÿäÿûâ•æ@ôéô„>ˆ…>øé …>üáîäL…>ü:áx…>äYý âîæ2€è´…>üéà…>¼†>ø2€è †>üé8†>†>øéd†>ü:á\-ä_ý4êÿÿÿûéè†>ć>ø2€è‡>üé@‡>˜‡>øél‡>ü:á\-ä_ý4ê þ4í€ûéˆ>ü:áä]ýÌŽ>Pˆ>Ìk Œˆ>îüˆ>ö䨈>ìááĈ>øàˆ>ÿäîìp‰>¬‰>åçäçæááxýâ`0éùá@Ð0éúá@1áîäûá @œáT5äĉ>ä8é ð‰>¬>,Š>ô:âŠ>䜊>ü â,Š>æäHŠ>ìádŠ>ø€Š>ÿäîìÌk È,Š>äêØŠ>öL‹>ˆ‹>åçäçæááxýâ`0é¼á@Ð0é½á@1áîä¾á @†áøä ‹>ä2€èÌ‹>ü8é ø‹>4Œ>¼x>ô:â$Œ>ä€x>ü â¼x>æ ÀŒ><Œ>2€èhŒ>ü锌>ü:á`ûä¼ý L>ÈŒ>2€èôŒ>üé >ü:á`ûä½ÿáT>áîä€>ü:áx…>ä¾ý Ž>´>éà>ü:á`ûäùý lŽ>Ž>é@Ž>ü:á`ûäúÿátŽ>áîä Ž>ü:áx…>äûý@•>ÔŽ>Ìk >î€>öä,>ìááH>ød>ÿäîìô>0>åçäçæááxýâ`0éÿá@Ð0êá@1áîäá @žáT5äH>ä8é t> ”>°>ô:â >ä ‘>ü â°>æäÌ>ìáè>ø‘>ÿäîìÌk(ð>äê\‘>öБ> ’>åçäçæááxýâ`0éÂá@Ð0éÃá@1áîäÄá @ˆáøä$’>ä2€èP’>ü8é |’>¨’>¼x>ô:â$Œ>ä€x>ü 4“>°’>2€èÜ’>üé“>ü:áÔíäÂý À“><“>2€èh“>ü锓>ü:áÔíäÃÿáÈ“>áîäô“>ü:áx…>äÄý €”>(”>éT”>ü:áÔíäÿý à”>ˆ”>é´”>ü:áÔíåÿáè”>áîä•>ü:áx…>äý`˜>H•>Ìk „•>îô•>öä •>ìáἕ>øØ•>ÿäîìh–>¤–>åçäçæááxýâ`0éšá@Ð0é›á@1áîäœá @x álä¼–>ä8é è–>—>¼x>ô:â$Œ>ä€x>ü t—>—>éH—>ü:áäšþ ˜>|—>2€è¨—>üéÔ—>ü:áîä›ÿá˜>áîä4˜>ü:áx…>äœý¬›>h˜>Ìk ¤˜>î™>öäÀ˜>ìááܘ>øø˜>ÿäî숙>Ä™>åçäçæááxýâ`0é á@Ð0é¡á@1áîä¢á @z áläÜ™>ä8é š>4š>¼x>ô:â$Œ>ä€x>ü Àš><š>2€èhš>ü锚>ü:áîä ý L›>Èš>2€èôš>üé ›>ü:áîä¡ÿáT›>áî䀛>ü:áx…>ä¢ýøž>´›>Ìk ð›>î`œ>öä œ>ìáá(œ>øDœ>ÿäîìÔœ>>åçäçæááxýâ`0é¦á@Ð0é§á@1áîä¨á @| álä(>ä8é T>€>¼x>ô:â$Œ>ä€x>ü ž>ˆ>2€è´>üéà>ü:ápä¦ý ˜ž>ž>2€è@ž>üélž>ü:áîä§ÿá ž>áîäÌž>ü:áx…>ä¨ýD¢>áŸ>Ìk <Ÿ>>öäXŸ>ìáátŸ>øŸ>ÿäîì  >\ >åçäçæááxýâ`0é¬á@Ð0é­á@1áîä®á @~ álät >ä8é   >Ì >¼x>ô:â$Œ>ä€x>ü X¡>Ô >2€é¡>üé,¡>ü:áX-ä¬ý ä¡>`¡>2€èŒ¡>ü鸡>ü:áîä­ÿáì¡>áîä¢>ü:áx…>ä®ý¥>L¢>Ìk ˆ¢>îø¢>ö䤢>ìááÀ¢>øÜ¢>ÿäîìl£>¨£>åçäçæááxýâ`0é²á@Ð0é³á@1áîä´á @€ áläÀ£>ä8é ì£>¤>¼x>ô:â$Œ>ä€x>ü ¤¤> ¤>2€èL¤>üéx¤>ü:áLbä²ý 0¥>¬¤>2€èؤ>üé¥>ü:áîä³ÿá8¥>áîäd¥>ü:áx…>ä´ýܨ>˜¥>Ìk Ô¥>îD¦>öäð¥>ìáá ¦>ø(¦>ÿäî츦>ô¦>åçäçæááxýâ`0é¸á@Ð0é¹á@1áîäºá @ƒ álä §>ä8é 8§>d§>¼x>ô:â$Œ>ä€x>ü ð§>l§>2€è˜§>üéħ>ü:á\-ä¸ý |¨>ø§>2€è$¨>üéP¨>ü:áîä¹ÿᄨ>áîä°¨>ü:áx…>äºý(¬>ä¨>Ìk ©>î©>öä<©>ìááX©>øt©>ÿäîìª>@ª>åçäçæááxýâ`0é¾á@Ð0é¿á@1áîäÀá @‡ áläXª>ä8é „ª>°ª>¼x>ô:â$Œ>ä€x>ü <«>¸ª>2€èäª>üé«>ü:á(^-ä¾ý È«>D«>2€èp«>ü霫>ü:áîä¿ÿáЫ>áîäü«>ü:áx…>äÀýt¯>0¬>Ìk l¬>îܬ>ö䈬>ìá᤬>øÀ¬>ÿäîìP­>Œ­>åçäçæááxýâ`0éÄá@Ð0éÅá@1áîäÆá @Š ál䤭>ä8é Э>ü­>¼x>ô:â$Œ>ä€x>ü ˆ®>®>2€è0®>üé\®>ü:á`ûäÄý ¯>®>2€è¼®>üéè®>ü:áîäÅÿá¯>áîäH¯>ü:áx…>äÆý”²>|¯>Ìk ¸¯>î(°>öäÔ¯>ìááð¯>ø °>ÿäî윰>ذ>åçäçæááxýâ`0éÊá@Ð0éËá@1áîäÌá @Œ áläð°>ä8é ±>H±>°>ô:â >ä ‘>ü ¨±>P±>é|±>ü:áÔíäÊý 4²>°±>2€èܱ>üé²>ü:áîäËÿá<²>áîäh²>ü:áx…>äÌý´µ>œ²>Ìk ز>îH³>öäô²>ìáá³>ø,³>ÿäîì¼³>ø³>åçäçæááxýâ`0éÐá@Ð0éÑá@1áîäÒá @Ž álä´>ä8é <´>h´>¼x>ô:â$Œ>ä€x>ü È´>p´>霴>ü:áäÐý Tµ>д>2€èü´>üé(µ>ü:ápäÑÿá\µ>áî䈵>ü:áx…>äÒþ¹>¼µ>Ìk øµ>îh¶>öä¶>ìáá0¶>øL¶>ÿäîìܶ>·>åçäçæááxýâ`0éÖá@Ð0é×á@1áîäØá @ álä0·>ä8é \·>ˆ·>¼x>ô:â$Œ>ä€x>ü ¸>·>2€è¼·>üéè·>ü:áîäÖý  ¸>¸>2€èH¸>üét¸>ü:ápä×ÿᨸ>áîäÔ¸>ü:áx…>äØýL¼>¹>Ìk D¹>î´¹>öä`¹>ìáá|¹>ø˜¹>ÿäîì(º>dº>åçäçæááxýâ`0éÜá@Ð0éÝá@1áîäÞá @’ álä|º>ä8é ¨º>Ôº>¼x>ô:â$Œ>ä€x>ü `»>ܺ>2€è»>üé4»>ü:ápäÜý ì»>h»>2€è”»>üéÀ»>ü:ápäÝÿáô»>áîä ¼>ü:áx…>äÞý˜¿>T¼>Ìk ¼>ï½>ö䬼>ìááȼ>øä¼>ÿäîìt½>°½>åçäçæááxýâ`0éâá@Ð0éãá@1áîääá @” áläȽ>ä8é ô½> ¾>¼x>ô:â$Œ>ä€x>ü ¬¾>(¾>2€èT¾>ü逾>ü:áX-äâý 8¿>´¾>2€èà¾>üé ¿>ü:ápäãÿá@¿>áîäl¿>ü:áx…>ääýäÂ> ¿>Ìk Ü¿>îLÀ>öäø¿>ìááÀ>ø0À>ÿäîìÀÀ>üÀ>åçäçæááxýâ`0éèá@Ð0ééá@1áîäêá @– áläÁ>ä8é @Á>lÁ>¼x>ô:â$Œ>ä€x>ü øÁ>tÁ>2€è Á>üéÌÁ>ü:áLbäèý„Â>áÂ>2€è,Â>üéXÂ>ü:ápäéÿáŒÂ>áîä¸Â>ü:áx…>äêý0Æ>ìÂ>Ìk (Ã>î˜Ã>öäDÃ>ìáá`Ã>ø|Ã>ÿäîì Ä>HÄ>åçäçæááxýâ`0éîá@Ð0éïá@1áîäðá @™ álä`Ä>ä8é ŒÄ>¸Ä>¼x>ô:â$Œ>ä€x>ü DÅ>ÀÄ>2€èìÄ>üéÅ>ü:á\-äîý ÐÅ>LÅ>2€èxÅ>üé¤Å>ü:ápäïÿáØÅ>áîäÆ>ü:áx…>äðý|É>8Æ>Ìk tÆ>îäÆ>öäÆ>ìáá¬Æ>øÈÆ>ÿäîìXÇ>”Ç>åçäçæááxýâ`0éôá@Ð0éõá@1áîäöá @ álä¬Ç>ä8é ØÇ>È>¼x>ô:â$Œ>ä€x>ü È> È>2€è8È>üédÈ>ü:á(^-äôý É>˜È>2€èÄÈ>üéðÈ>ü:ápäõÿá$É>áîäPÉ>ü:áx…>äöýÈÌ>„É>Ìk ÀÉ>î0Ê>öäÜÉ>ìááøÉ>øÊ>ÿäîì¤Ê>àÊ>åçäçæááxýâ`0éúá@Ð0éûá@1áîäüá @  áläøÊ>ä8é $Ë>PË>¼x>ô:â$Œ>ä€x>ü ÜË>XË>2€è„Ë>üé°Ë>ü:á`ûäúý hÌ>äË>2€èÌ>üé<Ì>ü:ápäûÿápÌ>áîäœÌ>ü:áx…>äüýèÏ>ÐÌ>Ìk Í>î|Í>öä(Í>ìááDÍ>ø`Í>ÿäîìðÍ>,Î>åçäçæááxýâ`0êá@Ð0éá@1áîäá @¢ áläDÎ>ä8é pÎ>œÎ>°>ô:â >ä ‘>ü üÎ>¤Î>éÐÎ>ü:áÔíåý ˆÏ>Ï>2€è0Ï>üé\Ï>ü:ápäÿáÏ>áîä¼Ï>ü:áx…>äýÓ>ðÏ>Ìk ,Ð>îœÐ>öäHÐ>ìáádÐ>ø€Ð>ÿäîìÑ>LÑ>åçäçæááxýâ`0éá@Ð0éá@1áîäá @¤ álädÑ>ä8é Ñ>¼Ñ>¼x>ô:â$Œ>ä€x>ü Ò>ÄÑ>éðÑ>ü:áäý ¨Ò>$Ò>2€èPÒ>üé|Ò>ü:áX-äÿá°Ò>áîäÜÒ>ü:áx…>äýTÖ>Ó>Ìk LÓ>î¼Ó>öähÓ>ìáá„Ó>ø Ó>ÿäîì0Ô>lÔ>åçäçæááxýâ`0é á@Ð0é á@1áîäá @¦ álä„Ô>ä8é °Ô>ÜÔ>¼x>ô:â$Œ>ä€x>ü hÕ>äÔ>2€èÕ>üé<Õ>ü:áîä ý ôÕ>pÕ>2€èœÕ>üéÈÕ>ü:áX-ä ÿáüÕ>áîä(Ö>ü:áx…>äý Ù>\Ö>Ìk ˜Ö>î×>öä´Ö>ìááÐÖ>øìÖ>ÿäîì|×>¸×>åçäçæááxýâ`0éá@Ð0éá@1áîäá @¨ áläÐ×>ä8é ü×>(Ø>¼x>ô:â$Œ>ä€x>ü ´Ø>0Ø>2€è\Ø>üéˆØ>ü:ápäý @Ù>¼Ø>2€èèØ>üéÙ>ü:áX-äÿáHÙ>áîätÙ>ü:áx…>äýìÜ>¨Ù>Ìk äÙ>îTÚ>öåÚ>ìááÚ>ø8Ú>ÿäîìÈÚ>Û>åçäçæááxýâ`0éá@Ð0éá@1áîäá @ª áläÛ>ä8é HÛ>tÛ>¼x>ô:â$Œ>ä€x>ý Ü>|Û>2€è¨Û>üéÔÛ>ü:áX-äý ŒÜ>Ü>2€è4Ü>üé`Ü>ü:áX-äÿá”Ü>áîäÀÜ>ü:áx…>äý8à>ôÜ>Ìk 0Ý>î Ý>öäLÝ>ìááhÝ>ø„Ý>ÿäîìÞ>PÞ>åçäçæááxýâ`0éá@Ð0éá@1áîä á @¬ álähÞ>ä8é ”Þ>ÀÞ>¼x>ô:â$Œ>ä€x>ü Lß>ÈÞ>2€èôÞ>üé ß>ü:áLbäý Øß>Tß>2€è€ß>üé¬ß>ü:áX-äÿáàß>áîä à>ü:áx…>ä ý„ã>@à>Ìk |à>îìà>öä˜à>ìáá´à>øÐà>ÿäîì`á>œá>åçäçæááxýâ`0é$á@Ð0é%á@1áîä&á @¯ álä´á>ä8é àá> â>¼x>ô:â$Œ>ä€x>ü ˜â>â>2€è@â>üélâ>ü:á\-ä$ý $ã> â>2€èÌâ>üéøâ>ü:áX-ä%ÿá,ã>áîäXã>ü:áx…>ä&ýÐæ>Œã>Ìk Èã>î8ä>öääã>ìáâä>øä>ÿäîì¬ä>èä>åçäçæááxýâ`0é*á@Ð0é+á@1áîä,á @³ álåå>ä8é ,å>Xå>¼x>ô:â$Œ>ä€x>ü äå>`å>2€èŒå>üé¸å>ü:á(^-ä*ý pæ>ìå>2€èæ>üéDæ>ü:áX-ä+ÿáxæ>áî䤿>ü:áx…>ä,ýê>Øæ>Ìk ç>î„ç>öä0ç>ìááLç>øhç>ÿäîìøç>4è>åçäçæááxýâ`0é0á@Ð0é1á@1áîä2á @¶ áläLè>ä8é xè>¤è>¼x>ô:â$Œ>ä€x>ü 0é>¬è>2€èØè>üéé>ü:á`ûä0ý ¼é>8é>2€èdé>üéé>ü:áX-ä1ÿáÄé>áîäðé>ü:áx…>ä2ý<í>$ê>Ìk `ê>îÐê>öä|ê>ìáá˜ê>ø´ê>ÿäîìDë>€ë>åçäçæááxýâ`0é6á@Ð0é7á@1áîä8á @¸ álä˜ë>ä8é Äë>ðë>°>ô:â >ä ‘>ü Pì>øë>é$ì>ü:áÔíä6ý Üì>Xì>2€è„ì>üé°ì>ü:áX-ä7ÿáäì>áîäí>ü:áx…>ä8ý\ð>Dí>Ìk €í>îðí>öäœí>ìáá¸í>øÔí>ÿäîìdî> î>åçäçæááxýâ`0é<á@Ð0é=á@1áîä>á @º álä¸î>ä8é äî>ï>¼x>ô:â$Œ>ä€x>ü pï>ï>éDï>ü:áä<ý üï>xï>2€è¤ï>üéÐï>ü:áLbä=ÿáð>áîä0ð>ü:áx…>ä>ý¨ó>dð>Ìk  ð>îñ>öä¼ð>ìááØð>øôð>ÿäîì„ñ>Àñ>åçäçæááxýâ`0éBá@Ð0éCá@1áîäDá @¼ áläØñ>ä8é ò>0ò>¼x>ô:â$Œ>ä€x>ü ¼ò>8ò>2€èdò>üéò>ü:áîäBý Hó>Äò>2€èðò>üéó>ü:áLbäCÿáPó>áîä|ó>ü:áx…>äDýôö>°ó>Ìk ìó>î\ô>öäô>ìáá$ô>ø@ô>ÿäîìÐô> õ>åçäçæááxýâ`0éHá@Ð0éIá@1áîäJá @¾ álä$õ>ä8é Põ>|õ>¼x>ô:â$Œ>ä€x>ü ö>„õ>2€è°õ>üéÜõ>ü:ápäHý ”ö>ö>2€è<ö>üéhö>ü:áLbäIÿáœö>áîäÈö>ü:áx…>äJý@ú>üö>Ìk 8÷>î¨÷>öäT÷>ìááp÷>øŒ÷>ÿäîìø>Xø>åçäçæááxýâ`0éNá@Ð0éOá@1áîäPá @À áläpø>ä8é œø>Èø>¼x>ô:â$Œ>ä€x>ü Tù>Ðø>2€èüø>üé(ù>ü:áX-äNý àù>\ù>2€èˆù>üé´ù>ü:áLbäOÿáèù>áîäú>ü:áx…>äPýŒý>Hú>Ìk „ú>îôú>öä ú>ìáá¼ú>øØú>ÿäîìhû>¤û>åçäçæááxýâ`0éTá@Ð0éUá@1áîäVá @ álä¼û>ä8é èû>ü>¼x>ô:â$Œ>ä€x>ü  ü>ü>2€èHü>üétü>ü:áLbäTý ,ý>¨ü>2€èÔü>üêý>ü:áLbäUÿá4ý>áîä`ý>ü:áx…>äVýØ?”ý>Ìk Ðý>î@þ>öäìý>ìááþ>ø$þ>ÿäîì´þ>ðþ>åçäçæááxýâ`0éZá@Ð0é[á@1áîä\á @Å áläÿ>ä8é 4ÿ>`ÿ>¼x>ô:â$Œ>ä€x>ü ìÿ>hÿ>2€è”ÿ>üéÀÿ>ü:á\-äZý x?ôÿ>2€è ?üéL?ü:áLbä[ÿá€?áîä¬?ü:áx…>ä\ý$?à?Ìk ?îŒ?öä8?ìááT?øp?ÿäîìá ?<?åçäçæááxýâ`0é`á@Ð0éaá@1áîäbá @É áläT?ä8é €?¬?¼x>ô:â$Œ>ä€x>ü 8?´?2€èà?üé ?ü:á(^-ä`ý Ä?@?2€èl?üé˜?ü:áLbäaÿáÌ?áîäø?ü:áx…>äbýp?,?Ìk h?îØ?öä„?ìáá ?ø¼?ÿäîìL?ˆ?åçäçæááxýâ`0éfá@Ð0égá@1áîähá @Ì álä ?ä8é Ì?ø?¼x>ô:â$Œ>ä€x>ü„?á?2€è,?üéX?ü:á`ûäfý ?Œ?2€è¸?üéä?ü:áLbägÿá?áîäD?ü:áx…>ähý ?x?Ìk ´?î$?öäÐ?ìááì?ø?ÿäîì˜?Ô?åçäçæááxýâ`0élá@Ð0émá@1áîäná @Î áläì?ä8é  ?D ?°>ô:â >ä ‘>ü ¤ ?L ?éx ?ü:áÔíälý 0 ?¬ ?2€èØ ?üé ?ü:áLbämÿá8 ?áîäd ?ü:áx…>äný° ?˜ ?Ìk Ô ?îD ?öäð ?ìáá ?ø( ?ÿäîì¸ ?ô ?åçäçæááxýâ`0érá@Ð0ésá@1áîätá @Ñ álä ?ä8é 8 ?d ?¼x>ô:â$Œ>ä€x>ü Ä ?l ?é˜ ?ü:áärý P ?Ì ?2€èø ?üé$ ?ü:á\-äsÿáX ?áîä„ ?ü:áx…>ätýü?¸ ?Ìk ô ?îd?öä?ìáá,?øH?ÿäîìØ??åçäçæááxýâ`0éxá@Ð0éyá@1áîäzá @Ô álä,?ä8é X?„?¼x>ô:â$Œ>ä€x>ü ?Œ?2€è¸?üéä?ü:áîäxý œ??2€èD?üép?ü:á\-äyÿá¤?áîäÐ?ü:áx…>äzýH??Ìk @?î°?öä\?ìááx?ø”?ÿäîì$?`?åçäçæááxýâ`0é~á@Ð0éá@1áîä€á @Ö áläx?ä8é ¤?Ð?¼x>ô:â$Œ>ä€x>ü \?Ø?2€è?üé0?ü:ápä~ý è?d?2€è?üé¼?ü:á\-äÿáð?áîä?ü:áx…>ä€ý”?P?Ìk Œ?îü?öä¨?ìááÄ?øà?ÿäîìp?¬?åçäçæááxýâ`0é„á@Ð0é…á@1áîä†á @Ø áläÄ?ä8é ð??¼x>ô:â$Œ>ä€x>ü ¨?$?2€èP?üé|?ü:áX-ä„ý 4?°?2€èÜ?üé?ü:á\-ä…ÿá<?áîäh?ü:áx…>ä†ýà?œ?Ìk Ø?îH?öäô?ìáá?ø,?ÿäîì¼?ø?åçäçæááxýâ`0éŠá@Ð0é‹á@1áîäŒá @Ú álä?ä8é <?h?¼x>ô:â$Œ>ä€x>ü ô?p?2€èœ?üéÈ?ü:áLbäŠý €?ü?2€è(?üéT?ü:á\-ä‹ÿáˆ?áîä´?ü:áx…>äŒý,?è?Ìk $?î”?öä@?ìáá\?øx?ÿäîì?D?åçäçæááxýâ`0éá@Ð0é‘á@1áîä’á @Ý álä\?ä8é ˆ?´?¼x>ô:â$Œ>ä€x>ü @?¼?2€èè?üé?ü:á\-äý Ì?H?2€èt?üé ?ü:á\-ä‘ÿáÔ?áîå?ü:áx…>ä’ýx!?4?Ìk p?îà?öäŒ?ìáá¨?øÄ?ÿäîìT??åçäçæááxýâ`0é–á@Ð0é—á@1áîä˜á @á álä¨?ä8éÔ?á ?¼x>ô:â$Œ>ä€x>ü Œ ? ?2€è4 ?üé` ?ü:á(^-ä–ý !?” ?2€èÀ ?üéì ?ü:á\-ä—ÿá !?áîäL!?ü:áx…>ä˜ýÄ$?€!?Ìk ¼!?î,"?öäØ!?ìááô!?ø"?ÿäîì "?Ü"?åçäçæááxýâ`0éœá@Ð0éá@1áîäžá @ä áläô"?ä8é #?L#?¼x>ô:â$Œ>ä€x>ü Ø#?T#?2€è€#?üé¬#?ü:á`ûäœý d$?à#?2€è $?üé8$?ü:á\-äÿál$?áîä˜$?ü:áx…>äžýä'?Ì$?Ìk %?îx%?öä$%?ìáá@%?ø\%?ÿäîìì%?(&?åçäçæááxýâ`0é¢á@Ð0é£á@1áîä¤á @æ álä@&?ä8é l&?˜&?°>ô:â >ä ‘>ü ø&? &?éÌ&?ü:áÔíä¢ý„'?á'?2€è,'?üéX'?ü:á\-ä£ÿáŒ'?áîä¸'?ü:áx…>ä¤ý+?ì'?Ìk ((?î˜(?öäD(?ìáá`(?ø|(?ÿäîì )?H)?åçäçæááxýâ`0é¨á@Ð0é©á@1áîäªá @é álä`)?ä8é Œ)?¸)?¼x>ô:â$Œ>ä€x>ü *?À)?éì)?ü:áä¨ý ¤*? *?2€èL*?üéx*?ü:á(^-ä©ÿá¬*?áîäØ*?ü:áx…>äªýP.? +?Ìk H+?î¸+?öäd+?ìáá€+?øœ+?ÿäîì,,?h,?åçäçæááxýâ`0é®á@Ð0é¯á@1áîä°á @ì álä€,?ä8é ¬,?Ø,?¼x>ô:â$Œ>ä€x>ü d-?à,?2€è -?üé8-?ü:áîä®ý ð-?l-?2€è˜-?üéÄ-?ü:á(^-ä¯ÿáø-?áîä$.?ü:áx…>ä°ýœ1?X.?Ìk ”.?î/?öä°.?ìááÌ.?øè.?ÿäîìx/?´/?åçäçæááxýâ`0é´á@Ð0éµá@1áîä¶á @î áläÌ/?ä8é ø/?$0?¼x>ô:â$Œ>ä€x>ü °0?,0?2€èX0?üé„0?ü:ápä´ý <1?¸0?2€èä0?üé1?ü:á(^-äµÿáD1?áîäp1?ü:áx…>ä¶ýè4?¤1?Ìk à1?îP2?öäü1?ìáá2?ø42?ÿäîìÄ2?á3?åçäçæááxýâ`0éºá@Ð0é»á@1áîä¼á @ð álä3?ä8é D3?p3?¼x>ô:â$Œ>ä€x>ü ü3?x3?2€è¤3?üéÐ3?ü:áX-äºý ˆ4?4?2€è04?üé\4?ü:á(^-ä»ÿá4?áîä¼4?ü:áx…>ä¼ý48?ð4?Ìk ,5?îœ5?öäH5?ìáád5?ø€5?ÿäîì6?L6?åçäçæááxýâ`0éÀá@Ð0éÁá@1áîäÂá @ò áläd6?ä8é 6?¼6?¼x>ô:â$Œ>ä€x>ü H7?Ä6?2€èð6?üé7?ü:áLbäÀý Ô7?P7?2€è|7?üé¨7?ü:á(^-äÁÿáÜ7?áîä8?ü:áx…>äÂý€;?<8?Ìk x8?îè8?öä”8?ìáá°8?øÌ8?ÿäîì\9?˜9?åçäçæááxýâ`0éÆá@Ð0éÇá@1áîäÈá @õ álä°9?ä8é Ü9?:?¼x>ô:â$Œ>ä€x>ü ”:?:?2€è<:?üéh:?ü:á\-äÆý ;?œ:?2€èÈ:?üéô:?ü:á(^-äÇÿá(;?áîäT;?ü:áx…>äÈýÌ>?ˆ;?Ìk Ä;?î4ô:â$Œ>ä€x>ü à=?\=?2€èˆ=?üé´=?ü:á(^-äÌý l>?è=?2€è>?üé@>?ü:á(^-äÍÿát>?áîä >?ü:áx…>äÎýB?Ô>?Ìk ??î€??öä,??ìááH??ød??ÿäîìô??0@?åçäçæááxýâ`0éÒá@Ð0éÓá@1áîäÔá @ü áläH@?ä8é t@? @?¼x>ô:â$Œ>ä€x>ü ,A?¨@?2€èÔ@?üêA?ü:á`ûäÒý ¸A?4A?2€è`A?üéŒA?ü:á(^-äÓÿáÀA?áîäìA?ü:áx…>äÔý8E? B?Ìk \B?îÌB?öäxB?ìáá”B?ø°B?ÿäîì@C?|C?åçäçæááxýâ`0éØá@Ð0éÙá@1áîäÚá @þ álä”C?ä8é ÀC?ìC?°>ô:â >ä ‘>ü LD?ôC?é D?ü:áÔíäØý ØD?TD?2€è€D?üé¬D?ü:á(^-äÙÿáàD?áîä E?ü:áx…>äÚýXH?@E?Ìk |E?îìE?öä˜E?ìáá´E?øÐE?ÿäîì`F?œF?åçäçæááxýâ`0éÞá@Ð0éßá@1áîäàá@á álä´F?ä8é àF? G?¼x>ô:â$Œ>ä€x>ü lG?G?é@G?ü:áäÞý øG?tG?2€è G?üéÌG?ü:á`ûäßÿâH?áîä,H?ü:áx…>äàý¤K?`H?Ìk œH?î I?öä¸H?ìááÔH?øðH?ÿäîì€I?¼I?åçäçæááxýâ`0éäá@Ð0éåá@1áîäæá @ áläÔI?ä8ê J?,J?¼x>ô:â$Œ>ä€x>ü ¸J?4J?2€è`J?üéŒJ?ü:áîääý DK?ÀJ?2€èìJ?üéK?ü:á`ûäåÿáLK?áîäxK?ü:áx…>äæýðN?¬K?Ìk èK?îXL?öäL?ìáá L?øô:â$Œ>ä€x>ü N?€M?2€è¬M?üéØM?ü:ápäêý N? N?2€è8N?üédN?ü:á`ûäëÿá˜N?áîäÄN?ü:áx…>äìýô:â$Œ>ä€x>ü PQ?ÌP?2€èøP?üé$Q?ü:áX-äðý ÜQ?XQ?2€è„Q?üé°Q?ü:á`ûäñÿáäQ?áîäR?ü:áx…>äòýˆU?DR?Ìk €R?îðR?öäœR?ìáá¸R?øÔR?ÿäîìdS? S?åçäçæááxýâ`0éöá@Ð0é÷á@1áîäøá @ álä¸S?ä8é äS?T?¼x>ô:â$Œ>ä€x>ü œT?T?2€èDT?üépT?ü:áLbäöý (U?¤T?2€èÐT?üéüT?ü:á`ûä÷ÿá0U?áîä\U?ü:áx…>äøýÔX?U?Ìk ÌU?îô:â$Œ>ä€x>ü èW?dW?2€èW?üé¼W?ü:á\-äüý tX?ðW?2€èX?üéHX?ü:á`ûäýÿá|X?áîä¨X?ü:áx…>äþý \?ÜX?Ìk Y?îˆY?öä4Y?ìááPY?ølY?ÿäîìüY?8Z?åçäçæááxýâ`0éá@Ð0éá@1áîäá @ áläPZ?ä8é |Z?¨Z?¼x>ô:â$Œ>ä€x>ü 4[?°Z?2€èÜZ?üé[?ü:á(^-äý À[?<[?2€èh[?üé”[?ü:á`ûäÿáÈ[?áîäô[?ü:áx…>äý@_?(\?Ìk d\?îÔ\?öä€\?ìááœ\?ø¸\?ÿäîìH]?„]?åçäçæááxýâ`0éá@Ð0é á@1áîä á @ áläœ]?ä8é È]?ô]?°>ô:â >ä ‘>ü T^?ü]?é(^?ü:áÔíäý à^?\^?2€èˆ^?üé´^?ü:á`ûä ÿáè^?áîä_?ü:áx…>ä ý`b?H_?Ìk „_?îô_?öä _?ìáá¼_?øØ_?ÿäîìh`?¤`?åçäçæááxýâ`0éá@Ð0éá@1áîäá @ álä¼`?ä8é è`?a?°>ô:â >ä ‘>ü  a?a?2€èHa?üéta?ü:áäþb?¨a?éÔa?ü:áÔíäÿáb?áîä4b?ü:áx…>äý€e?hb?Ìk ¤b?îc?öäÀb?ìááÜb?øøb?ÿäîìˆc?Äc?åçäçæááxýâ`0éá@Ð0éá@1áîäá @ áläÜc?ä8é d?4d?°>ô:â >ä ‘>ü Àd?äý h?ˆe?Ìk Äe?î4f?öäàe?ìááüe?øf?ÿäîì¨f?äf?åçäçæááxýâ`0éá@Ð0éá@1áîäá @ áläüf?ä8é (g?Tg?°>ô:â >ä ‘>ü àg?\g?2€èˆg?üé´g?ü:ápäý @h?èg?éh?ü:áÔíäÿáHh?áîäth?ü:áx…>äýÀk?¨h?Ìk äh?îTi?öåi?ìáái?ø8i?ÿäîìÈi?j?åçäçæááxýâ`0é á@Ð0é!á@1áîä"á @ áläj?ä8é Hj?tj?°>ô:â >ä ‘>ý k?|j?2€è¨j?üéÔj?ü:áX-ä ý `k?k?é4k?ü:áÔíä!ÿáhk?áîä”k?ü:áx…>ä"ýàn?Èk?Ìk l?îtl?öä l?ìááô:â >ä ‘>ü n?œm?2€èÈm?üéôm?ü:áLbä&ý €n?(n?éTn?ü:áÔíä'ÿáˆn?áîä´n?ü:áx…>ä(þr?èn?Ìk $o?î”o?öä@o?ìáá\o?øxo?ÿäîìp?Dp?åçäçæááxýâ`0é,á@Ð0é-á@1áîä.á @ álä\p?ä8é ˆp?´p?°>ô:â >ä ‘>ü @q?¼p?2€èèp?üéq?ü:á\-ä,ý  q?Hq?étq?ü:áÔíä-ÿá¨q?áîäÔq?ü:áx…>ä.ý u?r?Ìk Dr?î´r?öä`r?ìáá|r?ø˜r?ÿäîì(s?ds?åçäçæááxýâ`0é2á@Ð0é3á@1áîä4á @# álä|s?ä8é ¨s?Ôs?°>ô:â >ä ‘>ü `t?Üs?2€èt?üé4t?ü:á(^-ä2ý Àt?ht?é”t?ü:áÔíä3ÿáÈt?áîäôt?ü:áx…>ä4ý@x?(u?Ìk du?îÔu?öä€u?ìááœu?ø¸u?ÿäîìHv?„v?åçäçæááxýâ`0é8á@Ð0é9á@1áîä:á @& áläœv?ä8é Èv?ôv?°>ô:â >ä ‘>ü €w?üv?2€è(w?üéTw?ü:á`ûä8ý àw?ˆw?é´w?ü:áÔíä9ÿáèw?áîäx?ü:áx…>ä:ý`{?Hx?Ìk „x?îôx?öä x?ìáá¼x?øØx?ÿäîìhy?¤y?åçäçæááxýâ`0é>á@Ð0é?á@1áîä@á @( álä¼y?ä8é èy?z?¼x>ô:â$Œ>ä€x>ü  z?z?2€èHz?üétz?ü:áîä>þ{?¨z?éÔz?ü:áä?ÿá{?áîä4{?ü:áx…>ä@ý€~?h{?Ìk ¤{?î|?öäÀ{?ìááÜ{?øø{?ÿäîìˆ|?Ä|?åçäçæááxýâ`0éDá@Ð0éEá@1áîäFá @* áläÜ|?ä8é }?4}?¼x>ô:â$Œ>ä€x>ü À}?<}?2€èh}?üé”}?ü:ápäDý ~?È}?éô}?ü:áäEÿá(~?áîäT~?ü:áx…>äFý ?ˆ~?Ìk Ä~?î4?öäà~?ìááü~?ø?ÿäîì¨?ä?åçäçæááxýâ`0éJá@Ð0éKá@1áîäLá @, áläü?ä8é (€?T€?¼x>ô:â$Œ>ä€x>ü à€?\€?2€èˆ€?üé´€?ü:áX-äJý @?è€?é?ü:áäKÿáH?áîät?ü:áx…>äLýÀ„?¨?Ìk ä?îT‚?öå‚?ìáá‚?ø8‚?ÿäîìÈ‚?ƒ?åçäçæááxýâ`0éPá@Ð0éQá@1áîäRá @. áläƒ?ä8é Hƒ?tƒ?¼x>ô:â$Œ>ä€x>ý „?|ƒ?2€è¨ƒ?üéÔƒ?ü:áLbäPý `„?„?é4„?ü:áäQÿáh„?áî䔄?ü:áx…>äRýà‡?È„?Ìk …?ît…?öä …?ìáá<…?øX…?ÿäîìè…?$†?åçäçæááxýâ`0éVá@Ð0éWá@1áîäXá @1 álä<†?ä8é h†?”†?¼x>ô:â$Œ>ä€x>ü ‡?œ†?2€èȆ?üéô†?ü:á\-äVý €‡?(‡?éT‡?ü:áäWÿሇ?áîä´‡?ü:áx…>äXþ‹?è‡?Ìk $ˆ??öä@ˆ?ìáá\ˆ?øxˆ?ÿäîì‰?D‰?åçäçæááxýâ`0é\á@Ð0é]á@1áîä^á @5 álä\‰?ä8é ˆ‰?´‰?¼x>ô:â$Œ>ä€x>ü @Š?¼‰?2€èè‰?üéŠ?ü:á(^-ä\ý  Š?HŠ?étŠ?ü:áä]ÿᨊ?áîäÔŠ?ü:áx…>ä^ý Ž?‹?Ìk D‹?î´‹?öä`‹?ìáá|‹?ø˜‹?ÿäîì(Œ?dŒ?åçäçæááxýâ`0ébá@Ð0écá@1áîädá @8 álä|Œ?ä8é ¨Œ?ÔŒ?¼x>ô:â$Œ>ä€x>ü `?ÜŒ?2€è?üé4?ü:á`ûäbý À?h?é”?ü:áäcÿáÈ?áîäô?ü:áx…>ädÿá(Ž?Ìk dŽ?îÔŽ?ö䀎?ìáᜎ?ø¸Ž?ÿäîìH?„?åçäçæááxýâ`0éhá@Ð0éiá@1áîäjá @: áläœ?ä8é È?ô?°>ô:â >ä ‘>ü T?ü?é(?ü:áÔíähý à?\?2€èˆ?üé´?ü:áäiÿáè?áîä‘?ü:áx…>äjÿá0 äP‘?Ü¢æ,Läh‘?p‘?â â  ‘?,Lp¶?è„¶?äpæÌk,Läp‘?äÀ‘?ãဒ?¼Š äБ? ‘?¼Š ’? öÄ4îä8’?ì!ãp‘?ìd’?èT’?ì âp‘?ÿà0“?8‰ ä’? ‘?8‰ Ì’? ö„îäø’?ì!ãp‘?ì“?èT’?ÿèð“?˜Rä@“? ‘?˜R|“?ÿè专?䨓?äãp‘?ì âp‘? äÔ“?èT’?ø¨“?ê„”?€Oå”? ‘?€O<”?ÿèäh”?ì0!ãp‘?øT’?ì"X¶?ôOü°?””? ‘?ôOД?Pî4•?öäü”?ì€âp‘?ì•?|W äT’?ðL­ ä ˜ê¨•?Е?åçäçæááxýâ|W T’?ä6á @L­ ˜â7á@EâXYä–?äEâ XYØ®?ü®?äEâ XY€°?¤°?äáD–?ä ­?ü â t–?d( |­?äž?­?äpæÌkd( äD–?ä”–?ãáT—?¼Š 䤖?t–?¼Š à–? ö4~ îä —?ì!ãD–?ì8—?è(—?ì âD–?ÿà˜?8‰ äd—?t–?8‰  —? öŒm îäÌ—?ì!ãD–?ìè—?è(—?ÿèĘ?˜Rä˜?t–?˜RP˜?ÿè䌘?ä|˜?äãD–?ì âD–? 䨘?è(—?ø|˜?êô?€OäÔ˜?t–?€O™?îX™?öä<™?ì2!ãD–?ø(—?ìÌ™?à™?åçäçæááxýâ|W (—?ä4á@ì@š?äìÔ›?äìäœ?äìœ?ä(—?älš?á›?øá(—?䘚?üá(—?äÄš?ü:áðš?ä4ý â(—?æè,›?¨›?ø:èX›?üât–?p¨”›? ÿäìâ4êþ8Èêœ?,œ?áû,ô:€ðú,äØý,ÿà4œ?á(—?ä`œ?¸œ?øá(—?䌜?ü:áðš?ä4ý4êþ8Èé ?âXYä\Ÿ?ä8 ˜ä ˆŸ?´Ÿ?p-ô:âü-ä4-ÿà ¼Ÿ?èŸ?äøŸ?` ?ø âD–?æèŸ?ä$ ?ü:P ?äý âèŸ?æ4êþ"d­?ôO¨¦?œ ?t–?ôOØ ?Pâê<¡?öä¡?ì€âD–?ì ¡?|W ä(—?ðL­ ä ˜ê°¡?Ø¡?åçäçæááxýâ|W (—?ä*á @L­ ˜â+á@<âXYä8¢?ä<â XYð¢?£?ä<â XYH¤?l¤?ä<â XY¦?P¦?ä8á-ä d¢?¢?¬-ô:âè -äp-ÿà˜¢?éÄ¢?ü:áðš?ä*ÿá*áˆ-ôâ(—?ä@£?Ä£?øá(—?äl£?üá(—?䘣?ü:áðš?ä*ýèð£?¤?ø:èX›?ü4êÿâ*áˆ-ôâáXû,䘤?ü8á0-ä Ĥ?ð¤?Œ-ô:âX#-äP-ü ¨¥?ø¤?á(—?ä$¥?|¥?øá(—?äP¥?ü:áðš?ä*ý4êÿâ °¥? ˜äÜ¥?ü:›ä+ý,¦?*áˆ-ôæ*áØý,òâé|¦?ü:áðš?ä*ý¼¬?°¦?t–?ôOì¦?PâêP§?öä§?ì€âD–?ì4§?|W ä(—?ðL­ äð(êħ?ì§?åçäçæááxýâ|W (—?ä#á @L­ ð(â$á@=âXYäL¨?ä=â XY©?(©?ä=â XY\ª?€ª?ä=â XY¬?d¬?ä8á-ä x¨?¤¨?¬-ô:âè -äp-ÿନ?éب?ü:áðš?ä#ÿá#áˆ-ôâ(—?äT©?Ø©?øá(—?䀩?üá(—?䬩?ü:áðš?ä#ýèª?0ª?ø:èX›?ü4êÿâ#áˆ-ôâáXû,䬪?ü8á0-ä Øª?«?p -ô:â|)-ä4 -ü ¼«? «?á(—?ä8«?«?øá(—?äd«?ü:áðš?ä#ý4êÿâ Ä«?x*-äð«?ü:´*-ä$ý@¬?#áˆ-ôæ#áØý,òâé¬?ü:áðš?ä#ÿáĬ?t–?ôOá­?ÿèä,­?ìãD–?ìH­?è(—?ø|˜?îd( ät­?D–?æ -ìX›?D–?äâ8áèŸ?ä Ì­?®?Ø ?ô:âø­?䜠?ü âØ ?æ x®?®?é<®?ü:áh®?ä6ý âT’?ê €®? ˜ä¬®?ü:›ä7ÿá6áÔ˜?ôâT’?ä(¯?¬¯?øáT’?äT¯?üáT’?䀯?ü:áh®?ä6ýèد?T°?ø:è°?üâ ‘?ظ@°? ÿäìâ4êÿâ6áÔ˜?ôâéа?ü:áh®?ä6ý°µ?±? ‘?ôO@±?P?öäl±?ì€âp‘?숱?|W äT’?ðL­ äð(ê²?@²?åçäçæááxýâ|W T’?ä/á @L­ ð(â0á@FâXY䈲?äFâXYܳ?á´?äFâ XY4µ?Xµ?äáD–?ä´²?ü8áèŸ?ä à²?³?ì¦?ô:â ³?ä°¦?ü âì¦?æ |³?$³?éP³?ü:áh®?ä/ÿá „³?x*-ä°³?ü:´*-ä0ÿá/áÔ˜?ôâT’?ä,´?°´?øáT’?äX´?üáT’?ä„´?ü:áh®?ä/ýèÜ´?µ?ø:è°?ü4êÿâ/áÔ˜?ôâ鄵?ü:áh®?ä/ÿḵ? ‘?ôOôµ?ÿèä ¶?ìãp‘?ì<¶?èT’?ø¨“?î,Läh¶?p‘?æD–?ì°?p‘?äæȬ夶? -âĶ?Ô6 ¼¶?Tü+äØù+äÌëäÔ¶?êð¶?x! äD†äìå·?Ìkì<·?ît·?öäX·?ìýè·?ü·?åçäçæááxýâè#é,á@)â ³ ä¸?ä7€è @¸?¹?H¹?ôél¸?ð¸?ø2阸?üéĸ?ü:á|Jä,ý4ëÿý4êÿÿÿÿÿÿÿÿ÷2€èt¹?üé ¹?ü:á|Jä,ÿá|9 lº?ܹ?Ìk|9 º?æÿää4º?ä ˜çáPº?è ˜ÿêtº?Ìk|9 °º?î»?öä̺?ä ˜äááèº?è ˜ÿèx»? »?åçäçæááxýâ-á ˜ä“â@è#é”â@@â”^ 主?ä8á ˜ä ä»? ¼?º?ô:â¼?äܹ?ü âº?怼?(¼? ˜äT¼?ü:á›ä“ÿ∼?é´¼?ü:áîä”ÿâ” äð¼?Ìk” ,½?ÿìäH½?ïád½?éî-øLbê½?Rä4@&äT& ä ½?î-êÐïä¼½?ÌkÐïø½?ÿìä¾?ïá0¾?éî-ìL¾?ÿø Œðx¾?ðþ!ä\÷!äøS¾?œ8&˜¾? /& ¾? &ä &ä¿TÄ?¸¾?Ìk¿ô¾?äää,¿?öä¿?ìý ¿?È¿?åçäçáæááxýâ`0é°áÀðzè´á€oâŒMäˆÀ?äsâŒMä´À?ŠâtâŒMä@Á?ŠâuâŒMäÌÁ?ŠâvâŒMäXÂ?ŠâwâŒMääÂ?ŠâxâŒMäpÃ?ŠâzâŒMäüÃ?ä>áç´ÿíðÿ°ááÿÿÿ÷â“æ@ÿä ðÿ´ááÿÿÿ÷â¢å@@ÿäðÿä  ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿ´ááÿÿÿ÷âŸå€Àÿäðÿ°ááÿÿÿ÷â•æ@ôé(Ä?ü:áä°ýlÈ?\Ä?Ìk¿˜Ä?îÐÄ?öä´Ä?ìáýDÅ?XÅ?åçäçæááxýâ`0é÷á @ÜáT5äpÅ?ä8é œÅ? È?ØÅ?ô:âÈÅ?äÆ?ü âØÅ?æäôÅ?ìýÌk4-ØÅ?äêLÆ?öÀÆ?ÔÆ?åçäçæááxýâ`0é²á@ÊâøäìÆ?ä2€èÇ?ü8é DÇ?€Ç?ô¾?ô:âpÇ?举?ü âô¾?êˆÇ?2€è´Ç?üéàÇ?ü:á`ûä²ÿáÈ?é@È?ü:á`ûä÷ýtÌ?tÈ?Ìk¿°È?îèÈ?öäÌÈ?ìáý\É?pÉ?åçäçæááxýâ`0éûá @ÞáT5äˆÉ?ä8é ´É?Ì?ðÉ?ô:âàÉ?ä(Ê?ü âðÉ?æä Ê?ìýÌkl)ðÉ?äêdÊ?öØÊ?ìÊ?åçäçæááxýâ`0é¶á@ÌâøäË?ä2€è0Ë?ü8é \Ë?ˆË?ô¾?ô:âpÇ?举?ÿàË?2€è¼Ë?üéèË?ü:áÔíä¶ÿáÌ?éHÌ?ü:áÔíäûýtÎ?|Ì?Ìk¿¸Ì?îðÌ?öäÔÌ?ìáýdÍ?xÍ?åçäçæááxýâ`0éoá @BáläÍ?ä8é ¼Í?èÍ?ô¾?ô:âpÇ?举?ÿàðÍ?2€èÎ?üéHÎ?ü:áîäoýtÐ?|Î?Ìk¿¸Î?îðÎ?öäÔÎ?ìáýdÏ?xÏ?åçäçæááxýâ`0ésá @DáläÏ?ä8é ¼Ï?èÏ?ô¾?ô:âpÇ?举?ÿàðÏ?2€èÐ?üéHÐ?ü:ápäsýtÒ?|Ð?Ìk¿¸Ð?îðÐ?öäÔÐ?ìáýdÑ?xÑ?åçäçæááxýâ`0éwá @FáläÑ?ä8é ¼Ñ?èÑ?ô¾?ô:âpÇ?举?ÿàðÑ?2€èÒ?üéHÒ?ü:áX-äwýtÔ?|Ò?Ìk¿¸Ò?îðÒ?öäÔÒ?ìáýdÓ?xÓ?åçäçæááxýâ`0é{á @HáläÓ?ä8é ¼Ó?èÓ?ô¾?ô:âpÇ?举?ÿàðÓ?2€èÔ?üéHÔ?ü:áLbä{ýtÖ?|Ô?Ìk¿¸Ô?îðÔ?öäÔÔ?ìáýdÕ?xÕ?åçäçæááxýâ`0éá @KáläÕ?ä8é ¼Õ?èÕ?ô¾?ô:âpÇ?举?ÿàðÕ?2€èÖ?üéHÖ?ü:á\-äÿá|Ö?Ìk¿¸Ö?îðÖ?öäÔÖ?ìáýd×?x×?åçäçæááxýâ`0éƒá @Oálä×?ä8é ¼×?è×?ô¾?ô:âpÇ?举?ÿàð×?2€èØ?üéHØ?ü:á(^-äƒýŒØ?µå„Ø?´I'æ8òÙ?œØ?Ìk8òØØ?ÿìäôØ?ïí ˜î E&Ü?`A (Ù?ì}ä0Ù?Ìk`A lÙ?îÜÙ?öäˆÙ?ä|Jäáá¤Ù?è|JìÀÙ?ÿôPÚ?ŒÚ?åçäçæááxýâ-á|JäHá@è#éIá@´)éJá@ âô^ä¤Ú?ä8á|Jä ÐÚ?üÚ?|}ô:âl}äì}ü\Û?Û?|Jä0Û?ü:á8oäHý ¼Û?dÛ?éÛ?ü:á|JäIÿáÄÛ?éðÛ?ü:ápäJý¼Ü?¸Áä,Ü?Ìk¸ÁhÜ?ÿìä„Ü?ïá Ü?è|Jö|Jêtä?äUÌÞ?ÌÜ?ÌkäUÝ?ÿìä”Þ?ä$Ý?çáâTÝ?œRè|Þ?èâpæÌkœRä$Ý?ätÝ?ãáDÞ?˜Rä„Ý?TÝ?˜RÀÝ?ÿèäüÝ?äìÝ?äã$Ý?ì â$Ý? ä(Þ?èÞ?ì â$Ý?ðìÝ?êlÞ?PäTÞ?æPèæ¨ä|Þ?âTÞ?¨ì°Þ?ÿô@á?ÔÞ?ÌkäUß?îdß?öä,ß?ä´09äááHß?ÿôØß?áà?åçäçæááxýâ%è4â@¨†è5â@†âˆÚäà?ä8á´09ä Dà?€à?˜09ô:âpà?ä\09ü â˜09æ àà?ˆà?é´à?ü:áX-ä4ÿâèà?éá?ü:áX-ä5ÿâHá?ÌkäU„á?îØá?öä á?ähæ8äáá¼á?ÿôLâ?˜â?åçäçæááxýâ° ˆâ?ä?â@%è=â@¨†è>â@ âhæ8æŒâˆÚä°â?äáhæ8äÜâ?ü8áˆâ?ä ã?Dã?Læ8ô:â4ã?äæ8ü âLæ8æ ´ã?Lã?áˆâ?äxã?ü:á¤ã?ä?þ âˆâ?æ ä?¼ã?éèã?ü:á\-ä=ÿâä?éHä?ü:á\-ä>ÿâ(+ ä„ä? å-æàVäœä?â ÌkàVØä?âÿåâå?l¨ ôápæÌkl¨ äØä?ä(å?ãáøå?˜Rä8å?å?˜Rtå?ÿèä°å?ä å?äãØä?ì âØä? äÜå?èÌå?ì âØä?ð å?îl¨ äæ?Øä?æ 0H æ?ñ%ä æ%ä´»á¬æ?8æ?Ìk´»átæ?æÿääæ?ïýÄê?´æ?Ìk´»áðæ?î(ç?öä ç?ìáýœç?°ç?åçäçæááxýâ`0é)á @°áT5äÈç?ä8é ôç?dê?0è?ô:â è?ähè?ü â0è?æäLè?ìáýÌkÄ] 0è?äê¤è?öé?,é?åçäçæááxýâ`0éìá @šáøäDé?ä2€èpé?ü8é œé?Øé?tæ?ô:âÈé?ä8æ?ü âtæ?êàé?2€è ê?üé8ê?ü:á`ûäìÿálê?é˜ê?ü:á`ûä)ýÌî?Ìê?Ìk´»áë?î@ë?öä$ë?ìáý´ë?Èë?åçäçæááxýâ`0é-á @²áT5äàë?ä8é ì?lî?Hì?ô:â8ì?ä€ì?ü âHì?æädì?ìáýÌk,Y Hì?äê¼ì?ö0í?Dí?åçäçæááxýâ`0éøá @ áøä\í?ä2€èˆí?ü8é ´í?àí?tæ?ô:âÈé?ä8æ?ÿàèí?2€èî?üé@î?ü:áÔíäøÿátî?é î?ü:áÔíä-ýÌð?Ôî?Ìk´»áï?îHï?öä,ï?ìáý¼ï?Ðï?åçäçæááxýâ`0éÚá @| áläèï?ä8é ð?@ð?tæ?ô:âÈé?ä8æ?ÿàHð?2€ètð?üé ð?ü:áîäÚýÌò?Ôð?Ìk´»áñ?îHñ?öä,ñ?ìáý¼ñ?Ðñ?åçäçæááxýâ`0éÞá @~ áläèñ?ä8é ò?@ò?tæ?ô:âÈé?ä8æ?ÿàHò?2€ètò?üé ò?ü:ápäÞýÌô?Ôò?Ìk´»áó?îHó?öä,ó?ìáý¼ó?Ðó?åçäçæááxýâ`0éâá @€ áläèó?ä8é ô?@ô?tæ?ô:âÈé?ä8æ?ÿàHô?2€ètô?üé ô?ü:áX-äâýÌö?Ôô?Ìk´»áõ?îHõ?öä,õ?ìáý¼õ?Ðõ?åçäçæááxýâ`0éæá @‚ áläèõ?ä8é ö?@ö?tæ?ô:âÈé?ä8æ?ÿàHö?2€ètö?üé ö?ü:áLbäæýÌø?Ôö?Ìk´»á÷?îH÷?öä,÷?ìáý¼÷?Ð÷?åçäçæááxýâ`0éêá @… áläè÷?ä8é ø?@ø?tæ?ô:âÈé?ä8æ?ÿàHø?2€ètø?üé ø?ü:á\-äêÿá Ôø?Ìk´»áù?îHù?öä,ù?ìáý¼ù?Ðù?åçäçæááxýâ`0éîá @‰ áläèù?ä8é ú?@ú?tæ?ô:âÈé?ä8æ?ÿàHú?2€ètú?üé ú?ü:á(^-äîÿá$_äô†+ä8. ä üú?<èä |ø& û?(èä t`@Ðäû?ÌkÐXû?äêû?öätû?ìáýü?ü?åçäçæááxýâ`0évá @Láøä0ü?ä2€è\ü?ü8é ˆü?Ô@Äü?ô:â´ü?äüü?ü âÄü?æäàü?ìáýÌk|qÄü?äää8ý?ö¬ý? Àý?åçäçáæááxýâ`0éôáÀááŒMäàþ?âáŒMäÿ?äáŒMäø@äáŒMìáŒMä¨@Šâ áŒMä4@Šâ áŒMäÀ@Šâ áŒMäL@Šâ áŒMäØ@Šâ áŒMäd@ŠâáŒMäð@ŠâáŒMä|@äé ÿ?dÿ?øé8ÿ?ü:áäôý5ÿêé¼ÿ?Ì@øéèÿ?üá8a-ä@ @ø8á8a-ä @@l@P~-ô:â@~-äˆ~-ÿàt@4êþ4êþ4ê!þ2€è$@üéP@ü2á`ûä|@ü:âîäœûÿìðÿôááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿäðÿôááÿÿÿ÷â•æ@ôé¨@ü:áäôÿáÜ@2€è@üé4@ü:áÔíävÿáÀäp@ÌkÀ¬@äêä@öäÈ@ìýX@l@åçäçæááxýâ`0éná @Háøä„@ä2€è°@ü8é Ü@¸ @@ô:â@äP@ü â@æä4@ìýÌkÌ@äääŒ@öá @ @åçäçáæááxýâ`0éá ÀeáŒMä¤ @ŠâfáŒMä0 @ŠâgáŒMä¼ @ŠâháŒMäH @ŠâiáŒMäÔ @ŠâkáŒMä` @ôðÿááÿÿÿ÷â“æ@ÿäñÿÿÿÿââºæ@ÿäñÿÿÿÿââ›æ@ÿäðÿááÿÿÿ÷â•æ@ÿäðÿäÿûâ•æ@ôéŒ @ü:áäÿáÀ @2€èì @üé @ü:áÔíäný\ @ÜäT @tææ&Ìl @P@t@t @Ìk̰ @îè @öäÌ @ìáý\@p@åçäçæááxýâ`0é·á @dáT5äˆ@ä8é ´@@ð@ô:âà@ä(@ü âð@æä @ìýÌkpð@äêd@öØ@ì@åçäçæááxýâ`0éjá @Fáøä@ä2€è0@ü8é \@ˆ@@ô:â@äP@ÿà@2€è¼@üéè@ü:á`ûäjÿá@éH@ü:á`ûä·ýX@|@Ìk̸@îð@öäÔ@ìáýd@x@åçäçæááxýâ`0é»á @fáT5ä@ä8é ¼@ø@¬@ô:âè@äp@ü â¬@ë@é,@ü:áÔíä»ýX@`@ÌkÌœ@îÔ@öä¸@ìáýH@\@åçäçæááxýâ`0éá @Fálät@ä8é  @Ì@@ô:â@äP@ÿàÔ@2€é@üé,@ü:áîäýX@`@ÌkÌœ@îÔ@öä¸@ìáýH@\@åçäçæááxýâ`0é#á @Hálät@ä8é  @Ì@@ô:â@äP@ÿàÔ@2€é@üé,@ü:ápä#ýX@`@ÌkÌœ@îÔ@öä¸@ìáýH@\@åçäçæááxýâ`0é'á @Jálät@ä8é  @Ì@@ô:â@äP@ÿàÔ@2€é@üé,@ü:áX-ä'ýX@`@ÌkÌœ@îÔ@öä¸@ìáýH@\@åçäçæááxýâ`0é+á @Lálät@ä8é  @Ì@@ô:â@äP@ÿàÔ@2€é@üé,@ü:áLbä+ýX@`@ÌkÌœ@îÔ@öä¸@ìáýH@\@åçäçæááxýâ`0é/á @Oálät@ä8é  @Ì@@ô:â@äP@ÿàÔ@2€é@üé,@ü:á\-ä/ÿá`@ÌkÌœ@îÔ@öä¸@ìáýH@\@åçäçæááxýâ`0é3á @Sálät@ä8é  @Ì@@ô:â@äP@ÿàÔ@2€é@üé,@ü:á(^-ä3ýŒ!@€äh@Ìk€¤@äêÜ@öäÀ@ìáýP @d @åçäçæááxýâ`0érá @Jáøä| @ä2€è¨ @ü8éÔ @á!@Äü?ô:â´ü?äüü?ÿà!@2€è4!@üé`!@ü:á`ûärÿápä(@ä$Óä¬!@8/æˆîäÄ!@Ìkˆîá"@ÿìä"@ïí ˜ê<%@iH"@4­äP"@ÌkiŒ"@îü"@öä¨"@äœBäááÄ"@èœBìà"@ÿôp#@¬#@åçäçæááxýâ-áœBä§â@è#é¨â@´)é©â@\â”^ äÄ#@ä8áœBä ð#@$@Ĭô:â´¬ä4­ü|$@$$@œBäP$@ü:áØfä§þ Ü$@„$@é°$@ü:áîä¨ÿâä$@é%@ü:ápä©ÿâ\ äL%@€t-æ” äd%@Ìk”  %@äêØ%@öä¼%@ìáýL&@`&@åçäçæááxýâ`0éªá@¾âøäx&@ä2€è¤&@ü8é Ð&@$;@ '@ô:âü&@äD'@ü â '@æä('@ìáýÌkøÐ '@äää€'@öô'@(@åçäçáæááxýâ`0é)á ÀúáŒMäÀ*@âüáŒMäÐ+@äýáŒMä8-@äþáŒMìáŒMäè-@âáŒMäø.@äáŒMìáŒMäP/@ŠâáŒMäÜ/@ŠâáŒMäh0@Šâ áŒMäô0@Šâ áŒMä€1@Šâ áŒMä 2@Šâ áŒMä˜2@Šâ áŒMä$3@ŠâáŒMä°3@ŠâáŒMä<4@ŠâáŒMäÈ4@ŠâáŒMäT5@ŠâáŒMäà5@ŠâáŒMäl6@ŠâáŒMäø6@ŠâáŒMä„7@ŠâáŒMä8@ŠâáŒMäœ8@ŠâáŒMä(9@ŠâáŒMä´9@ŠâáŒMä@:@ŠâáŒMäÌ:@äéì*@¤+@ø8é +@D+@dÝ-ô:âTÝ-äœÝ-ÿàL+@éx+@ü:áä)ý5ðð?÷éü+@ -@øé(,@üá8a-äT,@à,@ø8á8a-ä €,@¬,@P~-ô:â@~-äˆ~-ÿà´,@4êþ4êþ4ê!þ2€èd-@üé-@ü2á`ûä¼-@ü:âîäœûüé.@Ì.@ø8é @.@l.@dÝ-ô:âTÝ-äœÝ-ÿàt.@é .@ü:áä)ý5ð°<÷é$/@ü:áä)ÿíðÿ)ááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿä ðÿä æð?ÿñâæ@ÿäñÿÿÿÿââªæ@ÿäñÿÿÿÿââ›æ@ÿä ðÿä æð?ÿñâ{æ@ÿä ðÿä æð?ÿñâ“æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿäñÿÿÿÿââ›æ@ÿä ðÿä æð?ÿñâ“æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿä ïÿäóáÿââ€æ@ÿäðÿä æà?ÿñâ|æ@ÿäðÿäáÿøâ•æ@ÿäðÿ)ááÿÿÿ÷â•æ@ôéø:@ü:áä)ÿá,;@2€èX;@üé„;@ü:áÔíäªÿá9 äÀ;@âÌk9 ä ê üÄlä <@æÄl$<@èâÌk<<@ä$· ä T<@Ì%$<@ê l<@¤p$<@ê <@ˆÀ$<@è¸>@Ä ä”<@ÌkÄ Ð<@äê=@öäì<@ìáý|=@=@åçäçæááxýâ`0é¦á@¼âøä¨=@ä2€èÔ=@ü8ê >@,>@ '@ô:âü&@äD'@ÿà4>@2€è`>@üéŒ>@ü:á`ûä¦ÿá B äÈ>@Ìk B ?@ÿìä ?@ïáá @F áläôœ@ä8é @L@À <ô:â4D@ä„ <ü ¬@T@é€@ü:áÔíä=ÿá´@2€èà@üé ž@ü:áLbä>ýÈ @@ž@Ìk4|ž@îО@ö䘞@ìáá´ž@ÿôDŸ@lŸ@åçäçæááxýâ`0éBá@Ð0éCá @I ál䄟@ä8é °Ÿ@ÜŸ@\ <ô:âL <ä° <ü < @äŸ@é @ü:áäBÿáD @2€èp @ü霠@ü:á\-äCý„£@Р@Ìk4 ¡@î`¡@öä(¡@ìááD¡@ÿôÔ¡@ü¡@åçäçæááxýâ`0éGá@Ð0éHá @L álä¢@ä8é @¢@l¢@\ <ô:âL <ä° <ü ø¢@t¢@2€è ¢@üéÌ¢@ü:áîäGÿâ£@2€è,£@üéX£@ü:á\-äHý@¦@Œ£@Ìk4È£@î¤@öää£@ìáâ¤@ÿô¤@¸¤@åçäçæááxýâ`0éLá@Ð0éMá @N áläФ@ä8é ü¤@(¥@\ <ô:âL <ä° <ü ´¥@0¥@2€è\¥@ü鈥@ü:ápäLÿá¼¥@2€èè¥@üé¦@ü:á\-äMýü¨@H¦@Ìk4„¦@îئ@öä ¦@ìáἦ@ÿôL§@t§@åçäçæááxýâ`0éQá@Ð0éRá @P ál䌧@ä8é ¸§@ä§@\ <ô:âL <ä° <ü p¨@ì§@2€è¨@üéD¨@ü:áX-äQÿáx¨@2€è¤¨@üéШ@ü:á\-äRý¸«@©@Ìk4@©@@öä\©@ìááx©@ÿôª@0ª@åçäçæááxýâ`0éVá@Ð0éWá @R áläHª@ä8é tª@ ª@\ <ô:âL <ä° <ü ,«@¨ª@2€èÔª@üê«@ü:áLbäVÿá4«@2€è`«@ü錫@ü:á\-äWýt®@À«@Ìk4ü«@îP¬@öä¬@ìáá4¬@ÿôĬ@ì¬@åçäçæááxýâ`0é[á@Ð0é\á @U álä­@ä8é 0­@\­@\ <ô:âL <ä° <ü è­@d­@2€è­@üé¼­@ü:á\-ä[ÿáð­@2€è®@üéH®@ü:á\-ä\ý0±@|®@Ìk4¸®@î ¯@öäÔ®@ìááð®@ÿô€¯@¨¯@åçäçæááxýâ`0é`á@Ð0éaá @Y áläÀ¯@ä8é ì¯@°@\ <ô:âL <ä° <ü ¤°@ °@2€èL°@üéx°@ü:á(^-ä`ÿᬰ@2€èذ@üé±@ü:á\-äaýì³@8±@Ìk4t±@îȱ@öä±@ìáᬱ@ÿô<²@d²@åçäçæááxýâ`0éeá@Ð0éfá @\ álä|²@ä8é ¨²@Ô²@\ <ô:âL <ä° <ü `³@ܲ@2€è³@üé4³@ü:á`ûäeÿáh³@2€è”³@üéÀ³@ü:á\-äfý|¶@ô³@Ìk40´@î„´@öäL´@ìááh´@ÿôø´@ µ@åçäçæááxýâ`0éjá@Ð0éká @^ álä8µ@ä8é dµ@µ@À <ô:â4D@ä„ <ü ðµ@˜µ@éĵ@ü:áÔíäjÿáøµ@2€è$¶@üéP¶@ü:á\-äký ¹@„¶@Ìk4À¶@î·@öäܶ@ìááø¶@ÿôˆ·@°·@åçäçæááxýâ`0éoá@Ð0épá @a áläÈ·@ä8é ô·@ ¸@\ <ô:âL <ä° <ü €¸@(¸@éT¸@ü:áäoÿሸ@2€è´¸@üéà¸@ü:á(^-äpýÈ»@¹@Ìk4P¹@@öäl¹@ìáሹ@ÿôº@@º@åçäçæááxýâ`0étá@Ð0éuá @d áläXº@ä8é „º@°º@\ <ô:âL <ä° <ü <»@¸º@2€èäº@üé»@ü:áîätÿáD»@2€èp»@ü霻@ü:á(^-äuý„¾@л@Ìk4 ¼@î`¼@öä(¼@ìááD¼@ÿôÔ¼@ü¼@åçäçæááxýâ`0éyá@Ð0ézá @f álä½@ä8é @½@l½@\ <ô:âL <ä° <ü ø½@t½@2€è ½@üé̽@ü:ápäyÿâ¾@2€è,¾@üéX¾@ü:á(^-äzý@Á@Œ¾@Ìk4Ⱦ@î¿@öää¾@ìáâ¿@ÿô¿@¸¿@åçäçæááxýâ`0é~á@Ð0éá @h áläп@ä8é ü¿@(À@\ <ô:âL <ä° <ü ´À@0À@2€è\À@üéˆÀ@ü:áX-ä~ÿá¼À@2€èèÀ@üéÁ@ü:á(^-äýüÃ@HÁ@Ìk4„Á@îØÁ@öä Á@ìáá¼Á@ÿôLÂ@tÂ@åçäçæááxýâ`0éƒá@Ð0é„á @j áläŒÂ@ä8é ¸Â@äÂ@\ <ô:âL <ä° <ü pÃ@ìÂ@2€èÃ@üéDÃ@ü:áLbäƒÿáxÃ@2€è¤Ã@üéÐÃ@ü:á(^-ä„ý¸Æ@Ä@Ìk4@Ä@î”Ä@öä\Ä@ìááxÄ@ÿôÅ@0Å@åçäçæááxýâ`0éˆá@Ð0é‰á @m áläHÅ@ä8é tÅ@ Å@\ <ô:âL <ä° <ü ,Æ@¨Å@2€èÔÅ@üêÆ@ü:á\-äˆÿá4Æ@2€è`Æ@üéŒÆ@ü:á(^-ä‰ýtÉ@ÀÆ@Ìk4üÆ@îPÇ@öäÇ@ìáá4Ç@ÿôÄÇ@ìÇ@åçäçæááxýâ`0éá@Ð0éŽá @q áläÈ@ä8é 0È@\È@\ <ô:âL <ä° <ü èÈ@dÈ@2€èÈ@üé¼È@ü:á(^-äÿáðÈ@2€èÉ@üéHÉ@ü:á(^-äŽý0Ì@|É@Ìk4¸É@î Ê@öäÔÉ@ìááðÉ@ÿô€Ê@¨Ê@åçäçæááxýâ`0é’á@Ð0é“á @t áläÀÊ@ä8é ìÊ@Ë@\ <ô:âL <ä° <ü ¤Ë@ Ë@2€èLË@üéxË@ü:á`ûä’ÿá¬Ë@2€èØË@üéÌ@ü:á(^-ä“ýÀÎ@8Ì@Ìk4tÌ@îÈÌ@öäÌ@ìáá¬Ì@ÿô<Í@dÍ@åçäçæááxýâ`0é—á@Ð0é˜á @v álä|Í@ä8é ¨Í@ÔÍ@À <ô:â4D@ä„ <ü 4Î@ÜÍ@éÎ@ü:áÔíä—ÿá<Î@2€èhÎ@üé”Î@ü:á(^-ä˜ýPÑ@ÈÎ@Ìk4Ï@îXÏ@öä Ï@ìáá<Ï@ÿôÌÏ@ôÏ@åçäçæááxýâ`0éœá@Ð0éá @x álä Ð@ä8é 8Ð@dÐ@\ <ô:âL <ä° <ü ÄÐ@lÐ@é˜Ð@ü:áäœÿáÌÐ@2€èøÐ@üé$Ñ@ü:á`ûäý Ô@XÑ@Ìk4”Ñ@îèÑ@öä°Ñ@ìááÌÑ@ÿô\Ò@„Ò@åçäçæááxýâ`0é¡á@Ð0é¢á @z áläœÒ@ä8é ÈÒ@ôÒ@\ <ô:âL <ä° <ü €Ó@üÒ@2€è(Ó@üéTÓ@ü:áîä¡ÿáˆÓ@2€è´Ó@üéàÓ@ü:á`ûä¢ýÈÖ@Ô@Ìk4PÔ@î¤Ô@öälÔ@ìááˆÔ@ÿôÕ@@Õ@åçäçæááxýâ`0é¦á@Ð0é§á @| áläXÕ@ä8é „Õ@°Õ@\ <ô:âL <ä° <ü <Ö@¸Õ@2€èäÕ@üéÖ@ü:ápä¦ÿáDÖ@2€èpÖ@üéœÖ@ü:á`ûä§ý„Ù@ÐÖ@Ìk4 ×@î`×@öä(×@ìááD×@ÿôÔ×@ü×@åçäçæááxýâ`0é«á@Ð0é¬á @~ áläØ@ä8é @Ø@lØ@\ <ô:âL <ä° <ü øØ@tØ@2€è Ø@üéÌØ@ü:áX-ä«ÿâÙ@2€è,Ù@üéXÙ@ü:á`ûä¬ý@Ü@ŒÙ@Ìk4ÈÙ@îÚ@öääÙ@ìáâÚ@ÿôÚ@¸Ú@åçäçæááxýâ`0é°á@Ð0é±á @€ áläÐÚ@ä8é üÚ@(Û@\ <ô:âL <ä° <ü ´Û@0Û@2€è\Û@üéˆÛ@ü:áLbä°ÿá¼Û@2€èèÛ@üéÜ@ü:á`ûä±ýüÞ@HÜ@Ìk4„Ü@îØÜ@öä Ü@ìáá¼Ü@ÿôLÝ@tÝ@åçäçæááxýâ`0éµá@Ð0é¶á @ƒ áläŒÝ@ä8é ¸Ý@äÝ@\ <ô:âL <ä° <ü pÞ@ìÝ@2€èÞ@üéDÞ@ü:á\-äµÿáxÞ@2€è¤Þ@üéÐÞ@ü:á`ûä¶ý¸á@ß@Ìk4@ß@î”ß@öä\ß@ìááxß@ÿôà@0à@åçäçæááxýâ`0éºá@Ð0é»á @‡ áläHà@ä8é tà@ à@\ <ô:âL <ä° <ü ,á@¨à@2€èÔà@üêá@ü:á(^-äºÿá4á@2€è`á@üéŒá@ü:á`ûä»ýHä@Àá@Ìk4üá@îPâ@öäâ@ìáá4â@ÿôÄâ@ìâ@åçäçæááxýâ`0é¿á@Ð0éÀá @Š áläã@ä8é 0ã@\ã@À <ô:â4D@ä„ <ü ¼ã@dã@éã@ü:áÔíä¿ÿáÄã@2€èðã@üéä@ü:á`ûäÀýØæ@Pä@Ìk4Œä@îàä@öä¨ä@ìááÄä@ÿôTå@|å@åçäçæááxýâ`0éÄá@Ð0éÅá @Œ álä”å@ä8é Àå@ìå@À <ô:â4D@ä„ <ü xæ@ôå@2€è æ@üéLæ@ü:áäÄÿá€æ@鬿@ü:áÔíäÅýhé@àæ@Ìk4ç@îpç@öä8ç@ìááTç@ÿôäç@ è@åçäçæááxýâ`0éÉá@Ð0éÊá @Ž álä$è@ä8é Pè@|è@À <ô:â4D@ä„ <ü é@„è@2€è°è@üéÜè@ü:áîäÉÿáé@é<é@ü:áÔíäÊýøë@pé@Ìk4¬é@ïê@öäÈé@ìááäé@ÿôtê@œê@åçäçæááxýâ`0éÎá@Ð0éÏá @ álä´ê@ä8é àê@ ë@À <ô:â4D@ä„ <ü ˜ë@ë@2€è@ë@üélë@ü:ápäÎÿá ë@éÌë@ü:áÔíäÏýˆî@áì@Ìk4<ì@îì@öäXì@ìáátì@ÿôí@,í@åçäçæááxýâ`0éÓá@Ð0éÔá @’ áläDí@ä8é pí@œí@À <ô:â4D@ä„ <ü (î@¤í@2€èÐí@üéüí@ü:áX-äÓÿá0î@é\î@ü:áÔíäÔýñ@î@Ìk4Ìî@î ï@öäèî@ìááï@ÿô”ï@¼ï@åçäçæááxýâ`0éØá@Ð0éÙá @” áläÔï@ä8ê ð@,ð@À <ô:â4D@ä„ <ü ¸ð@4ð@2€è`ð@üéŒð@ü:áLbäØÿáÀð@éìð@ü:áÔíäÙý¨ó@ ñ@Ìk4\ñ@î°ñ@öäxñ@ìáá”ñ@ÿô$ò@Lò@åçäçæááxýâ`0éÝá@Ð0éÞá @— álädò@ä8é ò@¼ò@À <ô:â4D@ä„ <ü Hó@Äò@2€èðò@üéó@ü:á\-äÝÿáPó@é|ó@ü:áÔíäÞý8ö@°ó@Ìk4ìó@î@ô@öäô@ìáá$ô@ÿô´ô@Üô@åçäçæááxýâ`0éâá@Ð0éãá @› áläôô@ä8é õ@Lõ@À <ô:â4D@ä„ <ü Øõ@Tõ@2€è€õ@üé¬õ@ü:á(^-äâÿáàõ@é ö@ü:áÔíäãýÈø@@ö@Ìk4|ö@îÐö@öä˜ö@ìáá´ö@ÿôD÷@l÷@åçäçæááxýâ`0éçá@Ð0éèá @ž álä„÷@ä8é °÷@Ü÷@À <ô:â4D@ä„ <ü hø@ä÷@2€èø@üé<ø@ü:á`ûäçÿápø@éœø@ü:áÔíäèýXû@Ðø@Ìk4 ù@î`ù@öä(ù@ìááDù@ÿôÔù@üù@åçäçæááxýâ`0éìá@Ð0éíá @  áläú@ä8é @ú@lú@\ <ô:âL <ä° <ü øú@tú@2€è ú@üéÌú@ü:áîäìÿâû@é,û@ü:áäíýèý@`û@Ìk4œû@îðû@öä¸û@ìááÔû@ÿôdü@Œü@åçäçæááxýâ`0éñá@Ð0éòá @¢ álä¤ü@ä8é Ðü@üü@\ <ô:âL <ä° <ü ˆý@ý@2€è0ý@üé\ý@ü:ápäñÿáý@é¼ý@ü:áäòýxAðý@Ìk4,þ@î€þ@öäHþ@ìáádþ@ÿôôþ@ÿ@åçäçæááxýâ`0éöá@Ð0é÷á @¤ álä4ÿ@ä8é `ÿ@Œÿ@\ <ô:âL <ä° <ü A”ÿ@2€èÀÿ@üéìÿ@ü:áX-äöÿá AéLAü:áä÷ýA€AÌk4¼AîAöäØAìááôAÿô„A¬Aåçäçæááxýâ`0éûá@Ð0éüá @¦ áläÄAä8é ðAA\ <ô:âL <ä° <ü ¨A$A2€èPAüé|Aü:áLbäûÿá°AéÜAü:áäüý˜AAÌk4LAî AöähAìáá„AÿôA<Aåçäçæááxýâ`0êá@Ð0éá @© áläTAä8é €A¬A\ <ô:âL <ä° <ü 8A´A2€èàAüé Aü:á\-åÿá@AélAü:áäý(A AÌk4ÜAî0AöäøAìááAÿô¤AÌAåçäçæááxýâ`0éá@Ð0éá @­ álääAä8é A<A\ <ô:âL <ä° <ü ÈADA2€èpAüéœAü:á(^-äÿáÐAéüAü:áäý¸ A0AÌk4lAîÀAöäˆAìáá¤Aÿô4 A\ Aåçäçæááxýâ`0é á@Ð0é á @° álät Aä8é   AÌ A\ <ô:âL <ä° <ü X AÔ A2€é Aüé, Aü:á`ûä ÿá` AéŒ Aü:áä ýH AÀ AÌk4ü AîP Aöä Aìáá4 AÿôÄ Aì Aåçäçæááxýâ`0éá@Ð0éá @² álä Aä8é 0 A\ AÀ <ô:â4D@ä„ <ü ¼ Ad Aé Aü:áÔíäÿáÄ A2€èð Aüé Aü:áäýØAP AÌk4Œ Aîà Aöä¨ AìááÄ AÿôTA|Aåçäçæááxýâ`0éRá@Ð0éSá @ßáT5ä”Aä8é ÀAìA°<ô:âÀA@ät<ü LAôAé Aü:á`ûäRÿáTA2€è€Aüé¬Aü:áîäSýhAàAÌk4AîpAöä8AìááTAÿôäA Aåçäçæááxýâ`0éWá@Ð0éXá @ááT5ä$Aä8é PA|A\ <ô:âL <ä° <ü ÜA„Aé°Aü:áäWÿáäA2€èAüé<Aü:áîäXÿápAÌk4¬AïAöäÈAìááäAÿôtAœAåçäçæááxýâ`0é\á@Ð0é]á @ãáT5ä´Aä8é àA AÀ <ô:â4D@ä„ <ü lAAé@Aü:áÔíä\ÿátA2€è AüéÌAü:áîä]ÿá¸Ý˜AAÌk¸ÝDAæÿää`Aä ˜çá|Aè ˜ÿê AÌk¸ÝÜAî0AöäøAä ˜äááAè ˜ÿè¤AÌAåçäçæááxýâ-á ˜äâ@è#éžâ@Nâ”^ ääAä8á ˜ä ALADAô:â<AäAü âDAæ¬ATA ˜ä€Aü:á›äÿâ´AéàAü:áîäžþä'A|qAüü?áA$AÌk|q`Aî˜Aöä|Aìáý A Aåçäçæááxýâ`0é—á @TáT5ä8Aä8é dA A¤@ô:âAäh@ü â¤@ê¨AéÔAü:á`ûä—ýäAAÌk|qDAî|Aöä`AìáýðAAåçäçæááxýâ`0é›á @VáT5äAä8é HA„AXû?ô:âtAäû?ü âXû?êŒAé¸Aü:áÔíä›ýäAìAÌk|q(Aî`AöäDAìáýÔAèAåçäçæááxýâ`0é¿á @álåAä8é ,AXAÄü?ô:â´ü?äüü?ÿà`A2€èŒAüé¸Aü:áîä¿ýäAìAÌk|q(Aî`AöäDAìáýÔAèAåçäçæááxýâ`0éÃá @álåAä8é ,AXAÄü?ô:â´ü?äüü?ÿà`A2€èŒAüé¸Aü:ápäÃýä!AìAÌk|q( Aî` AöäD AìáýÔ Aè Aåçäçæááxýâ`0éÇá @ álå!Aä8é ,!AX!AÄü?ô:â´ü?äüü?ÿà`!A2€èŒ!Aüé¸!Aü:áX-äÇýä#Aì!AÌk|q("Aî`"AöäD"AìáýÔ"Aè"Aåçäçæááxýâ`0éËá @ álå#Aä8é ,#AX#AÄü?ô:â´ü?äüü?ÿà`#A2€èŒ#Aüé¸#Aü:áLbäËýä%Aì#AÌk|q($Aî`$AöäD$AìáýÔ$Aè$Aåçäçæááxýâ`0éÏá @álå%Aä8é ,%AX%AÄü?ô:â´ü?äüü?ÿà`%A2€èŒ%Aüé¸%Aü:á\-äÏÿáì%AÌk|q(&Aî`&AöäD&AìáýÔ&Aè&Aåçäçæááxýâ`0éÓá @álå'Aä8é ,'AX'AÄü?ô:â´ü?äüü?ÿà`'A2€èŒ'Aüé¸'Aü:á(^-äÓÿá0@ äô'AÌk0@ 0(AÿìäL(AïÿáÔH äx(Aá/æ„J äÀ¨(Aý (ATÓ!äŒÊ!äuä¸(AÌkuô(Aÿì÷åœf ä )A()Aâ â X)Aœf ¬6AèÀ6AäpæÌkœf ä()Aäx)Aãá8*A¼Š äˆ)AX)A¼Š Ä)A ö„Tîäð)Aì!ã()Aì*Aè *Aì â()Aÿàè*A8‰ äH*AX)A8‰ „*A ÷Dîä°*Aì!ã()AìÌ*Aè *Aÿè¨+A˜Räø*AX)A˜R4+Aÿèäp+Aä`+Aäã()Aì â()A äŒ+Aè *Aø`+Aê<,A€Oä¸+AX)A€Oô+Aÿèä ,Aì0!ã()Aø *Aì"”6AôOH1AL,AX)AôOˆ,APîì,Aöä´,Aì€â()AìÐ,A|W ä *AðL­ ä ˜ê`-Aˆ-Aåçäçæááxýâ|W *AäJá @L­ ˜âKá@QâXYäÐ-AäQâ XY$/AH/AäQâ XYÌ0Að0AäáD–?äü-Aü8áèŸ?ä (.AT.AØ ?ô:âø­?䜠?ü Ä.A\.Aéˆ.Aü:á´.AäJý â *Aê Ì.A ˜äø.Aü:›äKÿáJáÔ˜?ôâ *Aät/Aø/Aøá *Aä /Aüá *AäÌ/Aü:á´.AäJýè$0A 0Aø:èP0AüâX)Aô# Œ0A ÿäìâ4êÿâJáÔ˜?ôâé1Aü:á´.AäJýì5AP1AX)AôOŒ1APîð1Aöä¸1Aì€â()AìÔ1A|W ä *AðL­ äð(êd2AŒ2Aåçäçæááxýâ|W *AäEá @L­ ð(âFá@RâXYäÔ2AäRâ XY4A<4AäRâ XYp5A”5AäáD–?å3Aü8áèŸ?ä ,3AX3Aì¦?ô:â ³?ä°¦?ü ¸3A`3AéŒ3Aü:á´.AäEÿá À3Ax*-äì3Aü:´*-äFÿáEáÔ˜?ôâ *Aäh4Aì4Aøá *Aä”4Aüá *AäÀ4Aü:á´.AäEýè5AD5Aø:èP0Aü4êÿâEáÔ˜?ôâéÀ5Aü:á´.AäEÿáô5AX)AôO06Aÿèä\6Aìã()Aìx6Aè *Aø`+Aîœf ä¤6A()AæD–?ìP0A()AäæTväà6AÌkTv7AäêT7Aöä87AìýÈ7AÜ7Aåçäçæááxýâ`0éÔá@êâøäô7Aä2€è 8Aü8é L8ADCAˆ8Aô:âx8AäÀ8Aü âˆ8Aæä¤8AìýÌkˆõ ˆ8Aäääü8Aöp9A˜9Aåçäçáæááxýâ`0éáÀðzè!á €ÉáŒMä;AäÌáŒMäD;AŠâÍáŒMäÐ;AŠâÎáŒMä\AŠâÒáŒMäŒ>AŠâÓáŒMä?AŠâÔáŒMä¤?AŠâÕáŒMä0@AŠâÖáŒMä¼@AŠâ×áŒMäHAAŠâØáŒMäÔAAŠâÙáŒMä`BAŠâÛáŒMäìBAä>áç!ÿí ðÿ!ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäðÿááÿÿÿ÷â“æ@ÿä ðÿäÿûâ“æ@ÿäñÿÿÿÿââ»æ@ÿäñÿÿÿÿââ›æ@ÿä ïÿäóáÿââæ@ÿäñÿÿÿÿââ¬æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ{æ@ÿäñÿÿÿÿââ¿æ@ÿä ðÿ!ááÿÿÿ÷âŸå€Àÿäðÿäáÿøâ•æ@ÿäðÿááÿÿÿ÷â•æ@ôéCAü:áäÿáLCA2€èxCAüé¤CAü:á`ûäÔý PjAPAàCAÌkDAäääpDAöä8DAìáTDAÿäîìäDA EAåçäçáæááxýâ`0éÜá ÀxðîäÝá ÀáŒMäìFAŠâáŒMäxGAŠâáŒMäHAŠâáŒMäHAŠâáŒMäIAŠâáŒMä¨IAŠâáŒMä4JAŠâáŒMäÀJAŠâáŒMìáŒMäLKAŠâáŒMäØKAŠâáŒMädLAŠâáŒMäðLAŠâáŒMä|MAŠâáŒMäNAŠâ!áŒMä”NAŠâ"áŒMä OAŠâ#áŒMì#áŒMä¬OAŠâ&áŒMä8PAôðÿÜááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ¨æAÿä ïÿäóâ@ÿáâæ ÿäðÿÿäáâ ÿñâ,å @ÿã ïÿäáìÝááÿÿÿáâ ÿìðÿäáÿÿÿõâ—æ@ÿäðÿÿäáâ@ÿñâ3ç@ÿãñÿÿÿÿââºæ@ÿä ðÿä æà?ÿñâ“æ@ÿäñÿÿÿÿââ|æ@ÿäñÿÿÿÿââ›æ@ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ{æ@ÿä ïÿäáìÝááÿÿÿáâ ÿì ðÿäáÿÿÿõâ˜æ@ÿäðÿÜááÿÿÿ÷â•æ@ôédPAü:áäÜýÈUA˜PAÌkÔPAî(QAöäðPAìáá QAÿäîìœQAÄQAåçäçæááxýâ`0éiá@Ð0áîäjá @(áT5äÜQAä8é RAUADRAô:â4RAä˜RAü âDRAæä`RAìá|RAÿäîìÌk4UDRAäêÔRAöHSApSAåçäçæááxýâ`0é$á@Ð0áîä%á @áøäˆSAä2€è´SAü8é àSATADAô:â TAäàCAü âDAæ ¨TA$TA2€èPTAüé|TAü:á`ûä$ÿá°TAáîäÜTAü:áx…>ä%ý hUAUAéäjýðZAÐUAÌk VAî`VAöä(VAìááDVAÿäîìÔVAüVAåçäçæááxýâ`0éná@Ð0áîäoá @*áT5äWAä8é @WA0ZA|WAô:âlWAäÐWAü â|WAæä˜WAìá´WAÿäîìÌk¼R|WAäê XAö€XA¨XAåçäçæááxýâ`0é)á@Ð0áîä*á @áøäÀXAä2€èìXAü8é YADYADAô:â TAäàCAü ÐYALYA2€èxYAüé¤YAü:áÔíä)ÿáØYAáîäZAü:áx…>ä*ý ZA8ZAédZAü:áÔíänÿá˜ZAáîäÄZAü:áx…>äoý€]AøZAÌk4[Aîˆ[AöäP[Aìáál[Aÿäîìü[A$\Aåçäçæááxýâ`0éÍ á@Ð0áîäÎ á @Îálä<\Aä8é h\A”\ADAô:â TAäàCAü ]Aœ\A2€èÈ\Aüéô\Aü:áîäÍ ÿá(]AáîäT]Aü:áx…>äÎ ý`Aˆ]AÌkÄ]Aî^Aöäà]Aìááü]AÿäîìŒ^A´^Aåçäçæááxýâ`0éÒ á@Ð0áîäÓ á @ÐáläÌ^Aä8é ø^A$_ADAô:â TAäàCAü °_A,_A2€èX_Aüé„_Aü:ápäÒ ÿá¸_Aáîää_Aü:áx…>äÓ ý bA`AÌkT`Aî¨`Aöäp`AìááŒ`AÿäîìaADaAåçäçæááxýâ`0é× á@Ð0áîäØ á @Òálä\aAä8é ˆaA´aADAô:â TAäàCAü @bA¼aA2€èèaAüébAü:áX-ä× ÿáHbAáîätbAü:áx…>äØ ý0eA¨bAÌkäbAî8cAöåcAìáácAÿäîì¬cAÔcAåçäçæááxýâ`0éÜ á@Ð0áîäÝ á @ÔáläìcAä8é dADdADAô:â TAäàCAü ÐdALdA2€èxdAüé¤dAü:áLbäÜ ÿáØdAáîäeAü:áx…>äÝ ýÀgA8eAÌkteAîÈeAöäeAìáá¬eAÿäîìäâ ÿáÈgAÌkhAîXhAöä hAìááäç ÿáœØáÔjA`jAÌkœØáœjAæÿää¸jAïýìnAÜjAÌkœØákAîPkAöä4kAìáýÄkAØkAåçäçæááxýâ`0é á @äáT5äðkAä8é lAŒnAXlAô:âHlAälAü âXlAæätlAìáýÌk$UXlAäêÌlAö@mATmAåçäçæááxýâ`0éÄá@ÒâøälmAä2€è˜mAü8éÄmAánAœjAô:âðmAä`jAü âœjAênA2€è4nAüé`nAü:á`ûäÄÿá”nAéÀnAü:á`ûä ýôrAônAÌkœØá0oAîhoAöäLoAìáýÜoAðoAåçäçæááxýâ`0é á @æáT5äpAä8é 4pA”rAppAô:â`pAä¨pAü âppAæäŒpAìáýÌk¬RppAäêäpAöXqAlqAåçäçæááxýâ`0éÐá@Øâøä„qAä2€è°qAü8é ÜqArAœjAô:âðmAä`jAÿàrA2€èáçÍý>áçÎÿíðÿÉááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ¸æBÿä ðÿäÿûâ§æAÿä ïÿäóâÿáâæ ÿäðÿÿäá â(ÿñâ,å @ÿãðÿä æà?ÿñâ{æ@ÿäðÿÿäá âðÿñâ3ç@ÿãðÿä æà?ÿñâæ@ÿä ðÿÍááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäñÿÿÿÿââ»æ@ÿä ðÿÎááÿÿÿ÷â˜æ@ÿä ðÿÍááÿÿÿ÷âŸå€Àôé,ðAü:á\-äÎýDôA`ðAÌkàq œðAîÔðAöä¸ðAìáýHñA\ñAåçäçæááxýâ`0éá @MáT5ätñAä8é  ñAäóAÜñAô:âÌñAäòAü âÜñAæäøñAìýÌkÜËÜñAäêPòAöÄòAØòAåçäçæááxýâ`0éJá @6áøäðòAä8é óAXóAôåAô:âHóAä¸åAü âôåAê`óA2€èŒóAüé¸óAü:á`ûäJÿáìóAéôAü:á`ûäý øALôAÌkàq ˆôAîÀôAöä¤ôAìáý4õAHõAåçäçæááxýâ`0é“á @QáT5ä`õAä8é ŒõAÀ÷AÈõAô:â¸õAåöAü âÈõAæääõAìýÌkPÆÈõAäê<öAö°öAÄöAåçäçæááxýâ`0éNá @8áøäÜöAä8é ÷A4÷AôåAô:âHóAä¸åAÿà<÷A2€èh÷Aüé”÷Aü:áÔíäNÿáÈ÷Aéô÷Aü:áÔíä“ý úA(øAÌkàq døAîœøAö䀸AìáýùA$ùAåçäçæááxýâ`0é§á @ëálä<ùAä8é hùA”ùAôåAô:âHóAä¸åAÿàœùA2€èÈùAüéôùAü:áîä§ý üA(úAÌkàq dúAîœúAöä€úAìáýûA$ûAåçäçæááxýâ`0é«á @ïálä<ûAä8é hûA”ûAôåAô:âHóAä¸åAÿàœûA2€èÈûAüéôûAü:ápä«ý þA(üAÌkàq düAîœüAöä€üAìáýýA$ýAåçäçæááxýâ`0é¯á @óálä<ýAä8é hýA”ýAôåAô:âHóAä¸åAÿàœýA2€èÈýAüéôýAü:áX-ä¯ý B(þAÌkàq dþAîœþAöä€þAìáýÿA$ÿAåçäçæááxýâ`0é³á @÷álä<ÿAä8é hÿA”ÿAôåAô:âHóAä¸åAÿàœÿA2€èÈÿAüéôÿAü:áLbä³ý B(BÌkàq dBîœBöä€BìáýB$Båçäçæááxýâ`0é·á @üálä<Bä8é hB”BôåAô:âHóAä¸åAÿàœB2€èÈBüéôBü:á\-ä·ÿá(BÌkàq dBîœBöä€BìáýB$Båçäçæááxýâ`0é»á @álä<Bä8é hB”BôåAô:âHóAä¸åAÿàœB2€èÈBüéôBü:á(^-ä»ÿáTp ä0Bô:椞äHBÌk¤ž„BäêØBöä Bìá¼BÿôLBtBåçäçæááxýâ`0éùá@Ð0éúá@üâøäŒBä2€è¸Bü8é äBB Bô:âBätBü â Bæä<BìáXBÿôÌk@ Bäää°Bö$B `Båçäçáæááxýâ`0éIáÀÐ0éJáÀá1éNá €áŒMä€BäáŒMä¬Bä’áŒMä\ BŠâ“áŒMäè BŠâ”áŒMät BŠâ•áŒMå BŠâ–áŒMäŒ BŠâ—áŒMä BŠâ˜áŒMä¤ BŠâ™áŒMì™áŒMä0 BŠâœáŒMä¼ Bä>áçNýéØB0 Bøé Bü:áäNý5ÿúðÿJááÿÿÿ÷â“æ@ÿäðÿIááÿÿÿ÷â}æBÿä ðÿäÿûâ§æAÿä ïÿäóâGÿáâæ ÿäðÿÿäá âøÿñâ,å @ÿã ðÿIááÿÿÿ÷â€æ@ÿäðÿNááÿÿÿ÷â”æ@ÿäðÿäÿûâ•æ@ôéè Bü:áäNý  BB2€èHBüétBü:áÔíäùÿá¨B2€èÔBüêBü:áÔíäúý´B,ä<BÌk,xBðÌBöä”Bìá°BÿäÔíì@BBåçäçæááxýâ`0é‘á @€M Ôíä’á@lÅ è–á€üè—ã_áøäBä`áøä4Bä`áøä`Bäaáøä(Bäbáøä\Bä>áç–ý>áç—ýéŒBäBøé¸Bü:áÔíä—ý2€èBü8é <BhB(Y=ô:â e=äìX=ü ôBpB2€èœBüéÈBü:áÔíä‘ÿáüB:áä–ýéTBØBøé€BüáÔíä¬Bü:á f=ä’ý2€èBüé0Bü:áä–ýéˆBü:áÔíä—ÿáä €‹=ÔBl)ä(Ê?ä`‘ ääBÌk`‘ Bæÿää<BïáXBè ˜ö ˜î&œ„B 9øBŒBÌkœÈBîBöääBìáâBÿôB¸Båçäçæááxýâ`0éUá@Ð0éVá @ áT5äÐBä8é üB8Bh9ô:â(Bä,9ü âh9æ ˜B@BélBü:á`ûäUÿá BéÌBü:á`ûäVýlBáBÌkœ<BîBöäXBìáátBÿôB,Båçäçæááxýâ`0éZá@Ð0é[á @"áT5äDBä8é pB¬B09ô:âœBäô9ü â09æ B´BéàBü:áÔíäZÿáBé@Bü:áÔíä[ýüBtBÌkœ°BîBöäÌBìááèBÿôxB Båçäçæááxýâ`0éÁ á@Ð0é á @Fálä¸Bä8é äBBÌ9ô:â¼9ä 9ü pBBéDBü:áäÁ ÿáxB2€è¤BüéÐBü:áîä ý¸BBÌkœ@Bî”Böä\BìááxBÿôB0Båçäçæááxýâ`0éÆ á@Ð0éÇ á @HáläHBä8é tB BÌ9ô:â¼9ä 9ü ,B¨B2€èÔBüêBü:áîäÆ ÿá4B2€è`BüéŒBü:áîäÇ ýt"BÀBÌkœüBîP Böä Bìáá4 BÿôÄ Bì Båçäçæááxýâ`0éË á@Ð0éÌ á @Jálä!Bä8é 0!B\!BÌ9ô:â¼9ä 9ü è!Bd!B2€è!Büé¼!Bü:ápäË ÿáð!B2€è"BüéH"Bü:áîäÌ ý0%B|"BÌkœ¸"Bî #BöäÔ"Bìááð"Bÿô€#B¨#Båçäçæááxýâ`0éÐ á@Ð0éÑ á @LáläÀ#Bä8é ì#B$BÌ9ô:â¼9ä 9ü ¤$B $B2€èL$Büéx$Bü:áX-äÐ ÿá¬$B2€èØ$Büé%Bü:áîäÑ ýì'B8%BÌkœt%BîÈ%Böä%Bìáá¬%Bÿô<&Bd&Båçäçæááxýâ`0éÕ á@Ð0éÖ á @Nálä|&Bä8é ¨&BÔ&BÌ9ô:â¼9ä 9ü `'BÜ&B2€è'Büé4'Bü:áLbäÕ ÿáh'B2€è”'BüéÀ'Bü:áîäÖ ý¨*Bô'BÌkœ0(Bî„(BöäL(Bìááh(Bÿôø(B )Båçäçæááxýâ`0éÚ á@Ð0éÛ á @Qálä8)Bä8é d)B)BÌ9ô:â¼9ä 9ü *B˜)B2€èÄ)Büéð)Bü:á\-äÚ ÿá$*B2€èP*Büé|*Bü:áîäÛ ýd-B°*BÌkœì*Bî@+Böä+Bìáá$+Bÿô´+BÜ+Båçäçæááxýâ`0éß á@Ð0éà á @Uáläô+Bä8é ,BL,BÌ9ô:â¼9ä 9ü Ø,BT,B2€è€,Büé¬,Bü:á(^-äß ÿáà,B2€è -Büé8-Bü:áîäà ý 0Bl-BÌkœ¨-Bîü-BöäÄ-Bìááà-Bÿôp.B˜.Båçäçæááxýâ`0éä á@Ð0éå á @Xálä°.Bä8é Ü.B/BÌ9ô:â¼9ä 9ü ”/B/B2€èBöäÔ=Bìááð=Bÿô€>B¨>Båçäçæááxýâ`0é á@Ð0é á @dáläÀ>Bä8é ì>B?BÌ9ô:â¼9ä 9ü ¤?B ?B2€èL?Büéx?Bü:áLbä ÿá¬?B2€èØ?Büé@Bü:ápä ýìBB8@BÌkœt@BîÈ@Böä@Bìáá¬@Bÿô á@Ð0é? á @„álä8_Bä8é d_B_BÌ9ô:â¼9ä 9ü `B˜_B2€èÄ_Büéð_Bü:á`ûä> ÿá$`B2€èP`Büé|`Bü:áX-ä? ý8cB°`BÌkœì`Bî@aBöäaBìáá$aBÿô´aBÜaBåçäçæááxýâ`0éC á@Ð0éD á @†áläôaBä8é bBLbB09ô:âœBäô9ü ¬bBTbBé€bBü:áÔíäC ÿá´bB2€èàbBüé cBü:áX-äD ýÈeB@cBÌkœ|cBîÐcBöä˜cBìáá´cBÿôDdBldBåçäçæááxýâ`0éH á@Ð0éI á @ˆálä„dBä8é °dBÜdBÌ9ô:â¼9ä 9ü á @ál䏿Bä8é äæBçBÌ9ô:â¼9ä 9ü œçBçB2€èDçBüépçBü:á`ûä= ÿá¤çBéÐçBü:áä> ÿáèBÌkœ@èBî”èBöä\èBìááxèBÿôéB0éBåçäçæááxýâ`0éB á@Ð0éC á @áläHéBä8é téB éB09ô:âœBäô9ýêB¨éBéÔéBü:áÔíäB ÿáêB2€è4êBüé`êBü:áäC ÿáp¡äœêBÌkp¡ØêBäê,ëBöäôêBìáëBÿô ëBÈëBåçäçæááxýâ`0éôá@Ð0éõá@úâøäàëBä2€è ìBü8é 8ìBdìB Bô:âBätBü ðìBlìB2€è˜ìBüéÄìBü:á`ûäôÿáøìB2€è$íBüéPíBü:á`ûäõýŒíB4-äÆ?äàw äœíBÌkàw ØíBâÿè÷á îBØ¢äîB˜â*$ÃC@îBtBðB$îBÌk@`îBî´îBöä|îBìáá˜îBÿô(ïBPïBåçäçæááxýâ`0é9á@Ð0é:á @ áT5ähïBä8é ”ïBÐïBØêBô:âÀïBäœêBü âØêBæ 0ðBØïBéðBü:á`ûä9ÿá8ðBédðBü:á`ûä:ýóB˜ðBÌk@ÔðBî(ñBöäððBìáá ñBÿôœñBÄñBåçäçæááxýâ`0é>á@Ð0é?á @áT5äÜñBä8é òBDòB„Bô:â4òBäHBü â„Bæ ¤òBLòBéxòBü:áÔíä>ÿá¬òBéØòBü:áÔíä?ý”õB óBÌk@HóBîœóBöädóBìáá€óBÿôôB8ôBåçäçæááxýâ`0éá@Ð0éžá @®áläPôBä8é |ôB¨ôB Bô:âBätBü õB°ôBéÜôBü:áäÿáõB2€è<õBüéhõBü:áîäžýPøBœõBÌk@ØõBî,öBöäôõBìááöBÿô öBÈöBåçäçæááxýâ`0é¢á@Ð0é£á @°áläàöBä8é ÷B8÷B Bô:âBätBü Ä÷B@÷B2€èl÷Büé˜÷Bü:áîä¢ÿáÌ÷B2€èø÷Büé$øBü:áîä£ý ûBXøBÌk@”øBîèøBöä°øBìááÌøBÿô\ùB„ùBåçäçæááxýâ`0é§á@Ð0é¨á @²áläœùBä8é ÈùBôùB Bô:âBätBü €úBüùB2€è(úBüéTúBü:ápä§ÿáˆúB2€è´úBüéàúBü:áîä¨ýÈýBûBÌk@PûBî¤ûBöälûBìááˆûBÿôüB@üBåçäçæááxýâ`0é¬á@Ð0é­á @´áläXüBä8é „üB°üB Bô:âBätBü <ýB¸üB2€èäüBüéýBü:áX-ä¬ÿáDýB2€èpýBüéœýBü:áîä­ý„CÐýBÌk@ þBî`þBöä(þBìááDþBÿôÔþBüþBåçäçæááxýâ`0é±á@Ð0é²á @¶áläÿBä8é @ÿBlÿB Bô:âBätBü øÿBtÿB2€è ÿBüéÌÿBü:áLbä±ÿãC2€è,CüéXCü:áîä²ý@CŒCÌk@ÈCîCöääCìáâCÿôC¸Cåçäçæááxýâ`0é¶á@Ð0é·á @¹áläÐCä8é üC(C Bô:âBätBü ´C0C2€è\CüéˆCü:á\-ä¶ÿá¼C2€èèCüéCü:áîä·ýüCHCÌk@„CîØCöä Cìáá¼CÿôLCtCåçäçæááxýâ`0é»á@Ð0é¼á @½áläŒCä8é ¸CäC Bô:âBätBü pCìC2€èCüéDCü:á(^-ä»ÿáxC2€è¤CüéÐCü:áîä¼ý¸CCÌk@@Cî”Cöä\CìááxCÿôC0Cåçäçæááxýâ`0éÀá@Ð0éÁá @ÀáläHCä8é tC C Bô:âBätBü ,C¨C2€èÔCüêCü:á`ûäÀÿá4C2€è`CüéŒCü:áîäÁýH CÀCÌk@üCîP Cöä Cìáá4 CÿôÄ Cì Cåçäçæááxýâ`0éÅá@Ð0éÆá @Âálä Cä8é 0 C\ C„Bô:â4òBäHBü ¼ Cd Cé Cü:áÔíäÅÿáÄ C2€èð Cüé Cü:áîäÆýØ CP CÌk@Œ Cîà Cöä¨ CìááÄ CÿôT C| Cåçäçæááxýâ`0éÊá@Ð0éËá @Äálä” Cä8é À Cì C Bô:âBätBü L Cô Cé Cü:áäÊÿáT C2€è€ Cüé¬ Cü:ápäËý”Cà CÌk@CîpCöä8CìááTCÿôäC Cåçäçæááxýâ`0éÏá@Ð0éÐá @Æálä$Cä8é PC|C Bô:âBätBü C„C2€è°CüéÜCü:áîäÏÿáC2€è<CüéhCü:ápäÐýPCœCÌk@ØCî,CöäôCìááCÿô CÈCåçäçæááxýâ`0éÔá@Ð0éÕá @ÈáläàCä8é C8C Bô:âBätBü ÄC@C2€èlCüé˜Cü:ápäÔÿáÌC2€èøCüé$Cü:ápäÕý CXCÌk@”CîèCöä°CìááÌCÿô\C„Cåçäçæááxýâ`0éÙá@Ð0éÚá @ÊáläœCä8é ÈCôC Bô:âBätBü €CüC2€è(CüéTCü:áX-äÙÿáˆC2€è´CüéàCü:ápäÚýÈCCÌk@PCî¤CöälCìááˆCÿôC@Cåçäçæááxýâ`0éÞá@Ð0éßá @ÌáläXCä8é „C°C Bô:âBätBü <C¸C2€èäCüéCü:áLbäÞÿáDC2€èpCüéœCü:ápäßý„CÐCÌk@ Cî`Cöä(CìááDCÿôÔCüCåçäçæááxýâ`0éãá@Ð0éäá @ÏáläCä8é @ClC Bô:âBätBü øCtC2€è CüéÌCü:á\-äãÿâC2€è,CüéXCü:ápääý@CŒCÌk@ÈCîCöääCìáâCÿôC¸Cåçäçæááxýâ`0éèá@Ð0ééá @ÓáläÐCä8é üC(C Bô:âBätBü ´C0C2€è\CüéˆCü:á(^-äèÿá¼C2€èèCüéCü:ápäéýü CHCÌk@„CîØCöä Cìáá¼CÿôLCtCåçäçæááxýâ`0éíá@Ð0éîá @ÖáläŒCä8é ¸CäC Bô:âBätBü p CìC2€è CüéD Cü:á`ûäíÿáx C2€è¤ CüéÐ Cü:ápäîýŒ#C!CÌk@@!Cî”!Cöä\!Cìááx!Cÿô"C0"Cåçäçæááxýâ`0éòá@Ð0éóá @ØáläH"Cä8é t"C "C„Bô:â4òBäHBý#C¨"CéÔ"Cü:áÔíäòÿá#C2€è4#Cüé`#Cü:ápäóý&C”#CÌk@Ð#Cî$$Cöäì#Cìáá$Cÿô˜$CÀ$Cåçäçæááxýâ`0é÷á@Ð0éøá @ÚáläØ$Cä8é %C0%C Bô:âBätBü %C8%Céd%Cü:áä÷ÿá˜%C2€èÄ%Cüéð%Cü:áX-äøýØ(C$&CÌk@`&Cî´&Cöä|&Cìáá˜&Cÿô('CP'Cåçäçæááxýâ`0éüá@Ð0éýá @Üáläh'Cä8é ”'CÀ'C Bô:âBätBü L(CÈ'C2€èô'Cüé (Cü:áîäüÿáT(C2€è€(Cüé¬(Cü:áX-äýý”+Cà(CÌk@)Cîp)Cöä8)CìááT)Cÿôä)C *Cåçäçæááxýâ`0éá@Ð0éá @Þálä$*Cä8é P*C|*C Bô:âBätBü +C„*C2€è°*CüéÜ*Cü:ápäÿá+C2€è<+Cüéh+Cü:áX-äýP.Cœ+CÌk@Ø+Cî,,Cöäô+Cìáá,Cÿô ,CÈ,Cåçäçæááxýâ`0éá@Ð0éá @àáläà,Cä8é -C8-C Bô:âBätBü Ä-C@-C2€èl-Cüé˜-Cü:áX-äÿáÌ-C2€èø-Cüé$.Cü:áX-äý 1CX.CÌk@”.Cîè.Cöä°.CìááÌ.Cÿô\/C„/Cåçäçæááxýâ`0é á@Ð0é á @âáläœ/Cä8é È/Cô/C Bô:âBätBü €0Cü/C2€è(0CüéT0Cü:áLbä ÿáˆ0C2€è´0Cüéà0Cü:áX-ä ýÈ3C1CÌk@P1Cî¤1Cöäl1Cìááˆ1Cÿô2C@2Cåçäçæááxýâ`0éá@Ð0éá @åáläX2Cä8é „2C°2C Bô:âBätBü <3C¸2C2€èä2Cüé3Cü:á\-äÿáD3C2€èp3Cüéœ3Cü:áX-äý„6CÐ3CÌk@ 4Cî`4Cöä(4CìááD4CÿôÔ4Cü4Cåçäçæááxýâ`0éá@Ð0éá @éálä5Cä8é @5Cl5C Bô:âBätBü ø5Ct5C2€è 5CüéÌ5Cü:á(^-äÿâ6C2€è,6CüéX6Cü:áX-äý@9CŒ6CÌk@È6Cî7Cöää6Cìáâ7Cÿô7C¸7Cåçäçæááxýâ`0éá@Ð0éá @ìáläÐ7Cä8é ü7C(8C Bô:âBätBü ´8C08C2€è\8Cüéˆ8Cü:á`ûäÿá¼8C2€èè8Cüé9Cü:áX-äýÐ;CH9CÌk@„9CîØ9Cöä 9Cìáá¼9CÿôL:Ct:Cåçäçæááxýâ`0éá@Ð0é á @îáläŒ:Cä8é ¸:Cä:C„Bô:â4òBäHBü D;Cì:Cé;Cü:áÔíäÿáL;C2€èx;Cüé¤;Cü:áX-ä ý`>CØ;CÌk@Cüé4>Cü:áLbä%ýACh>CÌk@¤>Cîø>CöäÀ>CìááÜ>Cÿôl?C”?Cåçäçæááxýâ`0é)á@Ð0é*á @òálä¬?Cä8é Ø?C@C Bô:âBätBü @C @C2€è8@Cüéd@Cü:áîä)ÿá˜@C2€èÄ@Cüéð@Cü:áLbä*ýØCC$ACÌk@`ACî´ACöä|ACìáá˜ACÿô(BCPBCåçäçæááxýâ`0é.á@Ð0é/á @ôálähBCä8é ”BCÀBC Bô:âBätBü LCCÈBC2€èôBCüé CCü:ápä.ÿáTCC2€è€CCüé¬CCü:áLbä/ý”FCàCCÌk@DCîpDCöä8DCìááTDCÿôäDC ECåçäçæááxýâ`0é3á@Ð0é4á @öálä$ECä8é PEC|EC Bô:âBätBü FC„EC2€è°ECüéÜECü:áX-ä3ÿáFC2€èá @ûáläœJCä8é ÈJCôJC Bô:âBätBü €KCüJC2€è(KCüéTKCü:á\-ä=ÿáˆKC2€è´KCüéàKCü:áLbä>ýÈNCLCÌk@PLCî¤LCöälLCìááˆLCÿôMC@MCåçäçæááxýâ`0éBá@Ð0éCá @ÿáläXMCä8é „MC°MC Bô:âBätBü álä¬Cä8é ØC‘C Bô:âBätBü ‘C ‘C2€è8‘Cüéd‘Cü:áLbä¿ÿᘑC2€èÄ‘Cüéð‘Cü:á`ûäÀýØ”C$’CÌk@`’Cî´’Cöä|’CìáᘒCÿô(“CP“Cåçäçæááxýâ`0éÄá@Ð0éÅá @Aáläh“Cä8é ”“CÀ“C Bô:âBätBü L”CÈ“C2€èô“Cüé ”Cü:á\-äÄÿáT”C2€è€”Cü鬔Cü:á`ûäÅý”—Cà”CÌk@•Cîp•Cöä8•CìááT•Cÿôä•C –Cåçäçæááxýâ`0éÉá@Ð0éÊá @Eálä$–Cä8é P–C|–C Bô:âBätBü —C„–C2€è°–CüéÜ–Cü:á(^-äÉÿá—C2€è<—Cüéh—Cü:á`ûäÊý$šCœ—CÌk@Ø—Cî,˜Cöäô—Cìáá˜Cÿô ˜CȘCåçäçæááxýâ`0éÎá@Ð0éÏá @Háläà˜Cä8é ™C8™C„Bô:â4òBäHBü ˜™C@™Cél™Cü:áÔíäÎÿá ™C2€èÌ™Cüéø™Cü:á`ûäÏý´œC,šCÌk@hšCCö䄚Cìáá šCÿô0›CX›Cåçäçæááxýâ`0éÓá@Ð0éÔá @Jáläp›Cä8é œ›CÈ›C„Bô:â4òBäHBü TœCЛC2€èü›Cüé(œCü:áäÓÿá\œC鈜Cü:áÔíäÔýDŸC¼œCÌk@øœCîLCöäCìáá0CÿôÀCèCåçäçæááxýâ`0éØá@Ð0éÙá @LálåžCä8é ,žCXžC„Bô:â4òBäHBü äžC`žC2€èŒžCü鸞Cü:áîäØÿáìžCéŸCü:áÔíäÙýÔ¡CLŸCÌk@ˆŸCîÜŸCö䤟CìááÀŸCÿôP Cx Cåçäçæááxýâ`0éÝá@Ð0éÞá @Nálä Cä8é ¼ Cè C„Bô:â4òBäHBü t¡Cð C2€è¡CüéH¡Cü:ápäÝÿá|¡C騡Cü:áÔíäÞýd¤CÜ¡CÌk@¢Cîl¢Cöä4¢CìááP¢Cÿôà¢C£Cåçäçæááxýâ`0éâá@Ð0éãá @Pálä £Cä8é L£Cx£C„Bô:â4òBäHBü ¤C€£C2€è¬£Cü騣Cü:áX-äâÿá ¤Cé8¤Cü:áÔíäãýô¦Cl¤CÌk@¨¤Cîü¤CöäĤCìááà¤Cÿôp¥C˜¥Cåçäçæááxýâ`0éçá@Ð0éèá @Rálä°¥Cä8é Ü¥C¦C„Bô:â4òBäHBü ”¦C¦C2€è<¦Cüéh¦Cü:áLbäçÿᜦCéȦCü:áÔíäèý„©Cü¦CÌk@8§CCöäT§Cìááp§Cÿôá ¨C(¨Cåçäçæááxýâ`0éìá@Ð0éíá @Uálä@¨Cä8é l¨C˜¨C„Bô:â4òBäHBü $©C ¨C2€ę̀Cüéø¨Cü:á\-äìÿá,©CéX©Cü:áÔíäíý¬CŒ©CÌk@È©CîªCöää©CìáâªCÿôªC¸ªCåçäçæááxýâ`0éñá@Ð0éòá @YáläЪCä8é üªC(«C„Bô:â4òBäHBü ´«C0«C2€è\«Cü鈫Cü:á(^-äñÿἫCéè«Cü:áÔíäòý¤®C¬CÌk@X¬CCöät¬Cìáá¬Cÿô ­CH­Cåçäçæááxýâ`0éöá@Ð0é÷á @\álä`­Cä8é Œ­C¸­C„Bô:â4òBäHBü D®CÀ­C2€èì­Cüé®Cü:á`ûäöÿáL®Céx®Cü:áÔíä÷ý4±C¬®CÌk@è®Cî<¯Cöä¯Cìáá ¯Cÿô°¯CدCåçäçæááxýâ`0éûá@Ð0éüá @^áläð¯Cä8é °CH°C Bô:âBätBü Ô°CP°C2€è|°Cü騰Cü:áîäûÿáܰCé±Cü:áäüýijC<±CÌk@x±Cî̱Cöä”±Cìáá°±Cÿô@²Ch²Cåçäçæááxýâ`0ê á@Ð0é á @`ál䀲Cä8é ¬²CزC Bô:âBätBü d³Cà²C2€è ³Cüé8³Cü:ápå ÿál³C阳Cü:áä ýT¶C̳CÌk@´Cî\´Cöä$´Cìáá@´CÿôдCø´Cåçäçæááxýâ`0é á@Ð0é á @báläµCä8é <µChµC Bô:âBätBü ôµCpµC2€èœµCüéȵCü:áX-ä ÿáüµCé(¶Cü:áä ýä¸C\¶CÌk@˜¶Cîì¶Cöä´¶CìááжCÿô`·Cˆ·Cåçäçæááxýâ`0é á@Ð0é á @dálä ·Cä8é Ì·Cø·C Bô:âBätBü„¸Cá¸C2€è,¸CüéX¸Cü:áLbä ÿጸC鸸Cü:áä ýt»Cì¸CÌk@(¹Cî|¹CöäD¹Cìáá`¹Cÿôð¹CºCåçäçæááxýâ`0é á@Ð0é á @gálä0ºCä8é \ºCˆºC Bô:âBätBü »CºC2€è¼ºCüéèºCü:á\-ä ÿá»CéH»Cü:áä ý¾C|»CÌk@¸»Cî ¼CöäÔ»Cìááð»Cÿô€¼C¨¼Cåçäçæááxýâ`0é á@Ð0é á @káläÀ¼Cä8é ì¼C½C Bô:âBätBü ¤½C ½C2€èL½Cüéx½Cü:á(^-ä ÿᬽCéؽCü:áä ý”ÀC ¾CÌk@H¾CCöäd¾CìáှCÿô¿C8¿Cåçäçæááxýâ`0é á@Ð0é á @náläP¿Cä8é |¿C¨¿C Bô:âBätBü 4ÀC°¿C2€èÜ¿CüéÀCü:á`ûä ÿá<ÀCéhÀCü:áä ÿáœÀCÌk@ØÀCî,ÁCöäôÀCìááÁCÿô ÁCÈÁCåçäçæááxýâ`0é á@Ð0é á @páläàÁCä8é ÂC8ÂC„Bô:â4òBäHBü ˜ÂC@ÂCélÂCü:áÔíä ÿá ÂC2€èÌÂCüéøÂCü:áä ýÄÃCä4ÃCÌkpÃCÿìäŒÃCä ˜çá¨ÃCÿä ˜ð”x ä h/\ÉCŒääÃCÌkŒ ÄCðtÄCöä<ÄCìáXÄCÿä`ûìèÄC8ÅCåçäçæááxýâ`0éŠá @€M `ûä‹á@lÅ èá€üèãWáøä°ÅCäXáøäÜÅCäXáøäÆCäYáøäÐÇCäZáøäÉCä>áçý>áçýé4ÆCŒÆCøé`ÆCü:á`ûäý2€è¸ÆCü8é äÆCÇC(Y=ô:â e=äìX=ü œÇCÇC2€èDÇCüépÇCü:á`ûäŠÿá¤ÇC:áäýéüÇC€ÈCøé(ÈCüá`ûäTÈCü:á0l=ä‹ý2€è¬ÈCüéØÈCü:áäýé0ÉCü:á`ûäýlÉC|ä†=äpä|ÉCÌkp¸ÉCÿìäÔÉCïáðÉCè|Jì ÊCè›ê(ÊCÿäîìTÊC„z ä|K&å¥ä dÊCÌkᥠÊCäêôÊCöä¼ÊCìáØÊCÿôhËCËCåçäçæááxýâ`0é.á@Ð0é/á @áøä¨ËCä2€èÔËCü8ê ÌCÈØC<ÌCô:â,ÌCäÌCü â<ÌCæäXÌCìátÌCÿôÌk<ÌCäääÌÌCö@ÍCÍCåçäçáæááxýâ`0éPáÀÐ0éQáÀè#èUá€á1éVá €¡áŒMäXÏCä¢áŒMä„ÏCä¥áŒMä°ÏCŠâ¦áŒMä<ÐCŠâ§áŒMäÈÐCŠâ¨áŒMäTÑCŠâ©áŒMäàÑCŠâªáŒMälÒCŠâ«áŒMäøÒCŠâ¬áŒMä„ÓCŠâ­áŒMäÔCŠâ®áŒMäœÔCŠâ¯áŒMä(ÕCŠâ°áŒMä´ÕCŠâ±áŒMä@ÖCŠâ²áŒMäÌÖCŠâ³áŒMäX×CŠâ´áŒMää×CŠâ¶áŒMäpØCä>áçUý>áçVÿí ðÿUááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€ÀÿäðÿPááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿäðÿQááÿÿÿ÷â“æ@ÿäðÿäÿûâ“æ@ÿäðÿäáÿøâ›æ@ÿäñÿÿÿÿââ{æ@ÿä ïÿäóÿåâ|æ@ÿäðÿäáÿøâ›æ@ÿäñÿÿÿÿââ|æ@ÿä ïÿäóÿåâ{æ@ÿäñÿÿÿÿââæ@ÿäñÿÿÿÿââ´æ@ÿä ðÿUááÿÿÿ÷âŸå€ÀÿäðÿVááÿÿÿ÷â•æ@ôéœØCü:áäVý TÙCÐØC2€èüØCüé(ÙCü:á`ûä.ÿá\ÙC2€èˆÙCüé´ÙCü:á`ûä/ýðÙCܥ丠)áÚCŒ˜ ä´wä| ÚCÚCÌk|LÚCæÿäähÚCä|Jçá„ÚCè|Júî¨ÚCÌk|äÚCî8ÛCöåÛCä|JäááÛCè|Jÿè¬ÛCÔÛCåçäçæááxýâ-á|Jä4á@è#é5á@+✵äìÛCä8á|Jä ÜCTÜCLÚCô:âDÜCäÚCü âLÚCæ´ÜC\ÜC|JäˆÜCü:á8oä4ÿá¼ÜCèèÜCü:á|Jä5ÿáX™ ä$ÝC0ÝCæ â`ÝCX™ è°ÞCèâpæÌkX™ ä0ÝCä€ÝCãáPÞC˜RäÝC`ÝC˜RÌÝCÿèäÞCäøÝCäã0ÝCì â0ÝC ä4ÞCè$ÞCì â0ÝCðøÝCêxÞC¬Iå`ÞCæ¬Iéâ ÞC”äˆÞCâ`ÞC”èæè ä°ÞCâ ˆÞCè  ˜ì¨1äØÞCÌk¨1ßCäêLßCöä0ßCìáýÀßCÔßCåçäçæááxýâ`0é á @ªáøäìßCä2€èàCü8é DàC0äC€àCô:âpàCä¸àCü â€àCæäœàCìáýÌkl/ €àCäêôàCöháC|áCåçäçáæááxýâ`0é7á @BáŒMä”áCäéÀáCìáCø5ðð?÷ éâCDâCø5ñ@÷épâCœâCø5ðð?÷8é ÈâCxãCãCô:âôâCä<ãCü âãCæä ãCïýÌk^ãCæÿè€ãC é¬ãCØãCø5ñ@÷éäCü:áä7ÿá8äC2€èdäCüéäCü:áÔíä ý¬çCì©äÌäCÌkì©åCäê\åCöä$åCìá@åCÿôÐåCøåCåçäçæááxýâ`0é3á@Ð0é4á @áøäæCä2€è<æCü8é hæC”æC<ÌCô:â,ÌCäÌCü çCœæC2€èÈæCüéôæCü:áÔíä3ÿá(çC2€èTçCüé€çCü:áÔíä4ÿဠä¼çCÌk€ øçCÿìäèCïá0èCéî-ø ˜îø4ä\èCÌkø4˜èCäêÐèCöä´èCìáýDéCXéCåçäçæááxýâ`0éá @¨áøäpéCä2€èœéCü8é ÈéCôéC€àCô:âpàCä¸àCÿàüéC2€è(êCüéTêCü:á`ûäÿဠäêCÌk€ ÌêCÿìäèêCïáëCè ˜ø ˜ê0ëCä€ ä ¹,´ëCЀ ä@ëCÌkЀ |ëCÿìä˜ëCïí|Jî‚ äÄëCÌk‚ áìCÿìäìCïá8ìCè ˜ö ˜ðh  ädìCÌkh   ìCÿìä¼ìCä ˜çý*°üC°PèìCðç-ÌîCðìCÌk°P,íCîdíCöäHíCìáýØíCìíCåçäçæááxýâ`0éá @èáT5äîCä8é 0îClîCLæ-ô:â\îCäæ-ü âLæ-êtîCé îCü:á`ûäý°ðCÔîCÌk°PïCîHïCöä,ïCìáý¼ïCÐïCåçäçæááxýâ`0éá @êáT5äèïCä8é ðCPðCPë-ô:â@ðCäë-ü âPë-êXðCé„ðCü:áÔíäý°òC¸ðCÌk°PôðCî,ñCöäñCìáý ñC´ñCåçäçæááxýâ`0é%á @&áläÌñCä8é øñC$òC¸ç-ô:â¨ç-äðç-ÿà,òC2€èXòCüé„òCü:áîä%ý°ôC¸òCÌk°PôòCî,óCöäóCìáý óC´óCåçäçæááxýâ`0é)á @(áläÌóCä8é øóC$ôC¸ç-ô:â¨ç-äðç-ÿà,ôC2€èXôCüé„ôCü:ápä)ý°öC¸ôCÌk°PôôCî,õCöäõCìáý õC´õCåçäçæááxýâ`0é-á @*áläÌõCä8é øõC$öC¸ç-ô:â¨ç-äðç-ÿà,öC2€èXöCüé„öCü:áX-ä-ý°øC¸öCÌk°PôöCî,÷Cöä÷Cìáý ÷C´÷Cåçäçæááxýâ`0é1á @,áläÌ÷Cä8é ø÷C$øC¸ç-ô:â¨ç-äðç-ÿà,øC2€èXøCü鄸Cü:áLbä1ý°úC¸øCÌk°PôøCî,ùCöäùCìáý ùC´ùCåçäçæááxýâ`0é5á @/áläÌùCä8é øùC$úC¸ç-ô:â¨ç-äðç-ÿà,úC2€èXúCüé„úCü:á\-ä5ÿá¸úCÌk°PôúCî,ûCöäûCìáý ûC´ûCåçäçæááxýâ`0é9á @3áläÌûCä8é øûC$üC¸ç-ô:â¨ç-äðç-ÿà,üC2€èXüCüé„üCü:á(^-ä9ÿáTƒ äÀüCÌkTƒ üüCÿìäýCäœBçá4ýCèœBìPýCè|Jÿê°… |ýC| „ýCPŒýCä ¤ýC¼Rä ÐWA´ýC¬Rä¨pAäœRäÄýC$Ý?êXSäàýCÌkXSþCÿìä8þCïáTþCéî-ìpþCÿô¤þC˜=äœþC0€'æ&´þCÌC(D¼þCÌkøþCîLÿCöäÿCìáá0ÿCÿôÀÿCèÿCåçäçæááxýâ`0ésá@Ð0étá @,áT5æDä8é ,DhD ÊCô:âXDädÊCü â ÊCæ ÈDpDéœDü:á`ûäsÿáÐDéüDü:á`ûätýœD0DÌklDîÀDöäˆDìáá¤Dÿô4D\Dåçäçæááxýâ`0éxá@Ð0éyá @.áT5ätDä8é  DÜDåCô:âÌDäÌäCü âåCæ <DäDéDü:áÔíäxÿáDDépDü:áÔíäyý,D¤DÌkàDî4DöäüDìááDÿô¨DÐDåçäçæááxýâ`0éë á@Ð0éì á @ÞáläèDä8é D@D<ÌCô:â,ÌCäÌCü  DHDétDü:áäë ÿá¨D2€èÔDüêDü:áîäì ýèD4DÌkpDîÄDöäŒDìáá¨Dÿô8D`Dåçäçæááxýâ`0éð á@Ð0éñ á @àáläxDä8é ¤DÐD<ÌCô:â,ÌCäÌCü \DØD2€èDüé0Dü:áîäð ÿádD2€èDüé¼Dü:áîäñ ý¤ DðDÌk, Dî€ DöäH Dìáád Dÿôô D Dåçäçæááxýâ`0éõ á@Ð0éö á @âálä4 Dä8é ` DŒ D<ÌCô:â,ÌCäÌCü  D” D2€èÀ Düéì Dü:ápäõ ÿá D2€èL Düéx Dü:áîäö ý`D¬ DÌkè Dî< Döä Dìáá Dÿô° DØ Dåçäçæááxýâ`0éú á@Ð0éû á @äáläð Dä8é  DH D<ÌCô:â,ÌCäÌCü Ô DP D2€è| Düé¨ Dü:áX-äú ÿáÜ D2€èDüé4Dü:áîäû ýDhDÌk¤DîøDöäÀDìááÜDÿôlD”Dåçäçæááxýâ`0éÿ á@Ð0êá @æálä¬Dä8é ØDD<ÌCô:â,ÌCäÌCü D D2€è8DüédDü:áLbäÿ ÿá˜D2€èÄDüéðDü:áîåýØD$DÌk`Dî´Döä|Dìáá˜Dÿô(DPDåçäçæááxýâ`0éá@Ð0éá @éálähDä8é ”DÀD<ÌCô:â,ÌCäÌCü LDÈD2€èôDüé Dü:á\-äÿáTD2€è€Düé¬Dü:áîäý”DàDÌkDîpDöä8DìááTDÿôäD Dåçäçæááxýâ`0é á@Ð0é á @íálä$Dä8é PD|D<ÌCô:â,ÌCäÌCü D„D2€è°DüéÜDü:á(^-ä ÿáD2€è<DüéhDü:áîä ýPDœDÌkØDî,DöäôDìááDÿô DÈDåçäçæááxýâ`0éá@Ð0éá @ðáläàDä8é D8D<ÌCô:â,ÌCäÌCü ÄD@D2€èlDüé˜Dü:á`ûäÿáÌD2€èøDüé$Dü:áîäýàDXDÌk”DîèDöä°DìááÌDÿô\D„Dåçäçæááxýâ`0éá@Ð0éá @òáläœDä8é ÈDôDåCô:âÌDäÌäCü TDüDé(Dü:áÔíäÿá\D2€èˆDüé´Dü:áîäýpDèDÌk$DîxDöä@Dìáá\DÿôìDDåçäçæááxýâ`0éá@Ð0éá @ôálä,Dä8é XD„D<ÌCô:â,ÌCäÌCü äDŒDé¸Dü:áäÿáìD2€èDüéDDü:ápäý,!DxDÌk´DîDöäÐDìááìDÿô|D¤Dåçäçæááxýâ`0éá@Ð0éá @öálä¼Dä8é èD D<ÌCô:â,ÌCäÌCü   D D2€èH Düét Dü:áîäÿᨠD2€èÔ Düê!Dü:ápäýè#D4!DÌkp!DîÄ!DöäŒ!Dìáá¨!Dÿô8"D`"Dåçäçæááxýâ`0é"á@Ð0é#á @øáläx"Dä8é ¤"DÐ"D<ÌCô:â,ÌCäÌCü \#DØ"D2€è#Düé0#Dü:ápä"ÿád#D2€è#Düé¼#Dü:ápä#ý¤&Dð#DÌk,$Dî€$DöäH$Dìáád$Dÿôô$D%Dåçäçæááxýâ`0é'á@Ð0é(á @úálä4%Dä8é `%DŒ%D<ÌCô:â,ÌCäÌCü &D”%D2€èÀ%Düéì%Dü:áX-ä'ÿá &D2€èL&Düéx&Dü:ápä(ý`)D¬&DÌkè&Dî<'Döä'Dìáá 'Dÿô°'DØ'Dåçäçæááxýâ`0é,á@Ð0é-á @üáläð'Dä8é (DH(D<ÌCô:â,ÌCäÌCü Ô(DP(D2€è|(Düé¨(Dü:áLbä,ÿáÜ(D2€è)Düé4)Dü:ápä-ý,Dh)DÌk¤)Dîø)DöäÀ)DìááÜ)Dÿôl*D”*Dåçäçæááxýâ`0é1á@Ð0é2á @ÿálä¬*Dä8é Ø*D+D<ÌCô:â,ÌCäÌCü +D +D2€è8+Düéd+Dü:á\-ä1ÿá˜+D2€èÄ+Düéð+Dü:ápä2ýØ.D$,DÌk`,Dî´,Döä|,Dìáá˜,Dÿô(-DP-Dåçäçæááxýâ`0é6á@Ð0é7á @áläh-Dä8é ”-DÀ-D<ÌCô:â,ÌCäÌCü L.DÈ-D2€èô-Düé .Dü:á(^-ä6ÿáT.D2€è€.Düé¬.Dü:ápä7ý”1Dà.DÌk/Dîp/Döä8/DìááT/Dÿôä/D 0Dåçäçæááxýâ`0é;á@Ð0é<á @álä$0Dä8é P0D|0D<ÌCô:â,ÌCäÌCü 1D„0D2€è°0DüéÜ0Dü:á`ûä;ÿá1D2€è<1Düéh1Dü:ápä<ý$4Dœ1DÌkØ1Dî,2Döäô1Dìáá2Dÿô 2DÈ2Dåçäçæááxýâ`0é@á@Ð0éAá @áläà2Dä8é 3D83DåCô:âÌDäÌäCü ˜3D@3Dél3Dü:áÔíä@ÿá 3D2€èÌ3Düéø3Dü:ápäAý´6D,4DÌkh4Dî¼4Döä„4Dìáá 4Dÿô05DX5Dåçäçæááxýâ`0éEá@Ð0éFá @ áläp5Dä8é œ5DÈ5D<ÌCô:â,ÌCäÌCü (6DÐ5Déü5Dü:áäEÿá06D2€è\6Düéˆ6Dü:áX-äFýp9D¼6DÌkø6DîL7Döä7Dìáá07DÿôÀ7Dè7Dåçäçæááxýâ`0éJá@Ð0éKá @ álå8Dä8é ,8DX8D<ÌCô:â,ÌCäÌCü ä8D`8D2€èŒ8Düé¸8Dü:áîäJÿáì8D2€è9DüéD9Dü:áX-äKý,D4DØ=D2€è>Düé0>Dü:áX-äTÿád>D2€è>Düé¼>Dü:áX-äUý¤ADð>DÌk,?Dî€?DöäH?Dìáád?Dÿôô?D@Dåçäçæááxýâ`0éYá@Ð0éZá @álä4@Dä8é `@DŒ@D<ÌCô:â,ÌCäÌCü AD”@D2€èÀ@Düéì@Dü:áLbäYÿá AD2€èLADüéxADü:áX-äZý`DD¬ADÌkèADîálånDä8é ,nDXnD<ÌCô:â,ÌCäÌCü änD`nD2€èŒnDüé¸nDü:áX-ä®ÿáìnD2€èoDüéDoDü:á\-ä¯ý,rDxoDÌk´oDîpDöäÐoDìááìoDÿô|pD¤pDåçäçæááxýâ`0é³á@Ð0é´á @@álä¼pDä8é èpDqD<ÌCô:â,ÌCäÌCü  qDqD2€èHqDüétqDü:áLbä³ÿá¨qD2€èÔqDüêrDü:á\-ä´ýètD4rDÌkprDîÄrDöäŒrDìáá¨rDÿô8sD`sDåçäçæááxýâ`0é¸á@Ð0é¹á @CáläxsDä8é ¤sDÐsD<ÌCô:â,ÌCäÌCü \tDØsD2€ètDüé0tDü:á\-ä¸ÿádtD2€ètDüé¼tDü:á\-ä¹ý¤wDðtDÌk,uDî€uDöäHuDìááduDÿôôuDvDåçäçæááxýâ`0é½á@Ð0é¾á @Gálä4vDä8é `vDŒvD<ÌCô:â,ÌCäÌCü wD”vD2€èÀvDüéìvDü:á(^-ä½ÿá wD2€èLwDüéxwDü:á\-ä¾ý`zD¬wDÌkèwDîˆõDˆpPõDøÿXõDä§+`õDà-(hõD¤Ò1põDÐ5xõD4Î9€õD0³9äkä„Ìä˜õDl‚AæY䬲-ähräÀõDTÌ'æl¨ äØõDØä?æäÁ äðõDÌkäÁ ,öDÿìäHöDïádöDè ˜ö ˜î0äÔ-9äÌLä öDT–æ 1ä¸öDÌk 1ôöDÿìä÷Dïá,÷Dè|Jö|Jî´ª äX÷DâÌk´ª æÿé]ä ä·-´÷DtÅ ä(-äÀ]äÄ÷D<<æDÓäÜ÷DÌkDÓøDâÿèä 4øDPøD˜ <ö˜ <ø$þDP¬ äløDÌkP¬ ¨øDäêàøDöäÄøDìýTùDhùDåçäçæááxýâ`0é~á @Páøä€ùDä8é ¬ùD˜ýDèùDô:âØùDä úDü âèùDæäúDìýÌk,3 èùDäää\úDöÐúDøúDåçäçáæááxýâ`0é¡áÀ`U è¥á€GâŒMäpûDäJâŒMäœûDŠâKâŒMä(üDŠâLâŒMä´üDŠâNâŒMä@ýDä>áç¥ÿíðÿ¡ááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿä ðÿ¥ááÿÿÿ÷â˜æ@ôélýDü:áX-ä¥ÿá ýD2€èÌýDüéøýDü:áÔíä~ÿá<¬ ä4þDî ø® PþD¸S#ä I#hþDD|äÜ',ä,|äxþDÌk,|´þDÿìäÐþDïîî-ðÀÌ ä Ô…Eh² ä ÿDÌkh² HÿDäê€ÿDöädÿDìýôÿDEåçäçæááxýâ`0ézá @Náøä Eä8é LExEèùDô:âØùDä úDÿà€E2€è¬EüéØEü:á`ûäzÿáTÚäEÌkTÚPEÿìälEïáˆEè ˜ì¤Eÿä ˜îXÎ äÐEÌkXÎ Eÿìä(EïáDEè|Jì`Eÿä|Jê”E€Ï ŒE¨þ$äxó$ä lÏ ¤E¤,å—,ä Xä¼E,¨æ&(Ð ÔExÇ8HEÜEÌk(Ð EîlEöä4EìááPEÿôàEEåçäçæááxýâ`0éá@Ð0é á @¬áT5ä Eä8é LEˆEˆÅ8ô:âxEäLÅ8ü âˆÅ8æ èEEé¼Eü:á`ûäÿáðEéEü:áîä ý¼EPEÌk(Ð ŒEîàEöä¨EìááÄEÿôTE|Eåçäçæááxýâ`0é$á@Ð0é%á @®áT5ä”Eä8é ÀEüEøÌ8ô:âìEä¼Ì8ü âøÌ8æ \EEé0Eü:áÔíä$ÿádEéEü:áîä%ýL EÄEÌk(Ð áEîTEöäEìáá8EÿôÈEðEåçäçæááxýâ`0é¼á@Ð0é½á @l álä Eä8é 4 E` E$Ç8ô:âÇ8äxÇ8ü ì Eh E2€è” EüéÀ Eü:áîä¼ÿáô Eé Eü:áîä½ýÜ ET EÌk(Ð Eîä Eöä¬ EìááÈ EÿôX E€ Eåçäçæááxýâ`0éÁá@Ð0éÂá @n álä˜ Eä8é Ä Eð E$Ç8ô:âÇ8äxÇ8ü | Eø E2€è$ EüéP Eü:ápäÁÿá„ Eé° Eü:áîäÂýlEä EÌk(Ð Eît Eöä< EìááX Eÿôè EEåçäçæááxýâ`0éÆá@Ð0éÇá @p álä(Eä8é TE€E$Ç8ô:âÇ8äxÇ8ü EˆE2€è´EüéàEü:áX-äÆÿáEé@Eü:áîäÇýüEtEÌk(Ð °EîEöäÌEìááèEÿôxE Eåçäçæááxýâ`0éËá@Ð0éÌá @r álä¸Eä8é äEE$Ç8ô:âÇ8äxÇ8ü œEE2€èDEüépEü:áLbäËÿá¤EéÐEü:áîäÌýŒEEÌk(Ð @Eî”Eöä\EìááxEÿôE0Eåçäçæááxýâ`0éÐá@Ð0éÑá @u áläHEä8é tE E$Ç8ô:âÇ8äxÇ8ü ,E¨E2€èÔEüêEü:á\-äÐÿá4Eé`Eü:áîäÑÿá”EÌk(Ð ÐEî$EöäìEìááEÿô˜EÀEåçäçæááxýâ`0éÕá@Ð0éÖá @y áläØEä8é E0E$Ç8ô:âÇ8äxÇ8ü ¼E8E2€èdEüéEü:á(^-äÕÿáÄEéðEü:áîäÖý,E|Ýä˜T<å´ ä<EHEæ âXEæ÷å Zä ((9œExhä”EÀã'æ8[<E¬EÌk8[èEæÿääEä|Jçá Eè|Jö|JîDEÌk8[€EîÔEöäœEä|Jäáá¸Eè|Jø|JêHEpEåçäçæááxýâ„O|JäCá @xQ|JâDá@@✵äˆEä8á|Jä ´EðEèEô:âàEä¬Eü âèEæPEøE|Jä$Eü:á8oäCÿá XE|Jä„Eü:8oäDýÈE˜ÞäÀE|Ô)æ$· äØE$<@挶 äðE$ö-êº ä EÐK'æ@_ä$EÌk@_`Eð˜Eöä|Eìáý E Eåçäçæááxýâè#écâ@/âpDä8Eä7é dEðEEôéE@Eøé¼EEøéèEü:áîäcþ4ÿêélEÄEøé˜Eü:áîäcþ4ëý4ÿêéHE!Eø2étEüé Eüá¼p-äÌE` Eøá¼p-äøEüáàm-ä$E4 Eøáàm-äPEüá8a-ä|E Eø8á8a-ä ¨EÔEP~-ô:â@~-äˆ~-ÿàÜE4êþ4ê¼ý4êþ éŒ Eä Eøé¸ Eü:áîäcþ4êþ4êÿâXãäüY<ä\¹ ä\!EÌk\¹ ˜!EðÐ!Eöä´!EìáýD"EX"Eåçäçæááxýâè#éoâ@5âpDäp"Eä7é œ"E($ET$EôéÈ"Ex#Eøéô"EL#Eøé #Eü:áîäoþ4ÿêé¤#Eü#EøéÐ#Eü:áîäoþ4ëý4ÿêé€$EH'Eø2é¬$EüéØ$Eüá¼p-ä%E˜&Eøá¼p-ä0%Eüáàm-ä\%El&Eøáàm-äˆ%Eüá8a-ä´%E@&Eø8á8a-ä à%E &EP~-ô:â@~-äˆ~-ÿà&E4êþ4ê¼ý4êþ éÄ&E'Eøéð&Eü:áîäoþ4êþ4êþŒ'E Cä„'EàG'âœ'EoäXëä0º ä¬'E|ôæôº t+EÄ'EÌkôº á(Eäää8(Eöä(Eìý¬(EÔ(Eåçäçáæááxýâ`0é¦áÀ`U èªá€SâŒMäL)EäVâŒMäx)EŠâWâŒMä*EŠâXâŒMä*EŠâZâŒMä+Eä>áçªÿíðÿ¦ááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿä ðÿªááÿÿÿ÷â˜æ@ôéH+Eü:á\-äªý`/E|+EÌkôº ¸+Eîð+EöäÔ+Eìáýd,Ex,Eåçäçæááxýâ`0é‡á @EáT5ä,Eä8é¼,Eá/Eø,Eô:âè,Eä0-Eü âø,Eæä-EìýÌk(êø,Eäêl-Eöà-Eô-Eåçäçæááxýâ`0éBá @2áøä .Eä8é8.Et.Eá(Eô:âd.EäÄ'Eü ã(Eê|.E2€è¨.EüéÔ.Eü:á`ûäBÿá/Eé4/Eü:á`ûä‡ý<3Eh/EÌkôº ¤/EîÜ/EöäÀ/EìáýP0Ed0Eåçäçæááxýâ`0é‹á @IáT5ä|0Eä8é ¨0EÜ2Eä0Eô:âÔ0Eä1Eü âä0Eæå1EìýÌk¬çä0EäêX1EöÌ1Eà1Eåçäçæááxýâ`0éFá @4áøäø1Eä8é$2EP2Eá(Eô:âd.EäÄ'EÿàX2E2€è„2Eüé°2Eü:áÔíäFÿáä2Eé3Eü:áÔíä‹ý<5ED3EÌkôº €3Eî¸3Eöäœ3Eìáý,4E@4Eåçäçæááxýâ`0éá @ÏáläX4Eä8é„4E°4Eá(Eô:âd.EäÄ'Eÿà¸4E2€èä4Eüé5Eü:áîäý<7ED5EÌkôº €5Eî¸5Eöäœ5Eìáý,6E@6Eåçäçæááxýâ`0é“á @ÓáläX6Eä8é„6E°6Eá(Eô:âd.EäÄ'Eÿà¸6E2€èä6Eüé7Eü:ápä“ý<9ED7EÌkôº €7Eî¸7Eöäœ7Eìáý,8E@8Eåçäçæááxýâ`0é—á @×áläX8Eä8é„8E°8Eá(Eô:âd.EäÄ'Eÿà¸8E2€èä8Eüé9Eü:áX-ä—ý<;ED9EÌkôº €9Eî¸9Eöäœ9Eìáý,:E@:Eåçäçæááxýâ`0é›á @ÛáläX:Eä8é„:E°:Eá(Eô:âd.EäÄ'Eÿà¸:E2€èä:Eüé;Eü:áLbä›ý<=ED;EÌkôº €;Eî¸;Eöäœ;Eìáý,E@>Eåçäçæááxýâ`0é£á @æáläX>Eä8é„>E°>Eá(Eô:âd.EäÄ'Eÿà¸>E2€èä>Eüé?Eü:á(^-ä£ýL?E¤× ääl%䤿ä\?EÌk¤æ˜?Eÿìä´?EïáÐ?Eéî-ìì?Eè ˜ö ˜ì.@@EŒŠ@E”Ë+ @E¨Ç+(@E¬Ä+0@Ep¿+8@ELº+ä H¶+\@Eˆ¿ äP@E ¤êÜdäl@EÌkÜd¨@EÿìäÄ@Eä ˜çí ˜ð¬çä 1E¬AE Ù åAEÌk Ù áç ÿí ðÿ ááÿÿÿ÷â¢å@@ÿäðÿä ÿ÷âŸå€Àÿäðÿááÿÿÿ÷â“æ@ÿäðÿä  ÔòWy‚Ú?ÿñâ}æBÿä ðÿäÿûâ¨æAÿäñÿÿÿÿââlæ ÿäñÿÿÿÿââ«æ@ÿäñÿÿÿÿââ›æ@ÿäðÿÿäáâ ÿñâ,å @ÿãðÿä  fˆ3þҿÿñâ}æBÿä ðÿäÿûâ¨æAÿäñÿÿÿÿââlæ ÿäðÿÿäáâ ÿõ,å @ÿãñÿÿÿÿââ±æ@ÿäðÿÿäáâ@ÿñâ3ç@ÿã ïÿäóáÿââ{æ@ÿäñÿÿÿÿââ°æ@ÿäñÿÿÿÿââ½æ@ÿäñÿÿÿÿââ|æ@ÿä ðÿ ááÿÿÿ÷âŸå€Àÿäðÿááÿÿÿ÷â•æ@ôéÜFü:áäý F FÌk¤¶L Fî„ Föäh Fìáýø F Fåçäçæááxýâ`0é§á @\áT5ä$ Fä8é P FÀ FŒ Fô:â| FäÄ Fü ⌠Fæä¨ FìýÌkìaŒ Fäë Föt Fˆ Fåçäçæááxýâ`0éZá @>áøä  Fä2€èÌ Fü8é ø F4 FÜùEô:â$ Fä ùEü âÜùEê< F2€èh Füé” Fü:á`ûäZÿáÈ Féô Fü:á`ûä§ý(F( FÌk¤¶d Fîœ Föä€ FìáýF$Fåçäçæááxýâ`0é«á @^áT5ä<Fä8é hFÈF¤Fô:â”FäÜFü â¤FæäÀFìýÌk_¤FäêFöŒF Fåçäçæááxýâ`0é^á @@áøä¸Fä2€èäFü8é F<FÜùEô:â$ Fä ùEÿàDF2€èpFüéœFü:áÔíä^ÿáÐFéüFü:áÔíä«ý(F0FÌk¤¶lFî¤FöäˆFìáýF,Fåçäçæááxýâ`0éïá @&áläDFä8é pFœFÜùEô:â$ Fä ùEÿà¤F2€èÐFüéüFü:áîäïý(F0FÌk¤¶lFî¤FöäˆFìáýF,Fåçäçæááxýâ`0éóá @(áläDFä8é pFœFÜùEô:â$ Fä ùEÿà¤F2€èÐFüéüFü:ápäóý(F0FÌk¤¶lFî¤FöäˆFìáýF,Fåçäçæááxýâ`0é÷á @*áläDFä8é pFœFÜùEô:â$ Fä ùEÿà¤F2€èÐFüéüFü:áX-ä÷ý(F0FÌk¤¶lFî¤FöäˆFìáýF,Fåçäçæááxýâ`0éûá @,áläDFä8é pFœFÜùEô:â$ Fä ùEÿà¤F2€èÐFüéüFü:áLbäûý(F0FÌk¤¶lFî¤FöäˆFìáýF,Fåçäçæááxýâ`0éÿá @/áläDFä8é pFœFÜùEô:â$ Fä ùEÿà¤F2€èÐFüéüFü:á\-äÿÿá0FÌk¤¶lFî¤FöäˆFìáýF,Fåçäçæááxýâ`0éá @3áläDFä8é pFœFÜùEô:â$ Fä ùEÿà¤F2€èÐFüéüFü:á(^-äý8F@èääæ,äÄ äHFÌkÄ „Fÿìä Fïá¼Fè ˜ìØFÿäîð( äF,óêÀËä F›æèFä ðÕÌ"F”ˆ%ä ¬%#FÜ ää"FÌkÜ #Fÿìä<#FïáX#Fè|Jêt#Fè8oÿè$Fùä #FÌkùÜ#Fÿìäø#Fïí|Jî($ ä$$FÌk($ `$Fÿìä|$Fïá˜$Fè ˜ö ˜î@% äÄ$FX¹æ È䜊>äô& äì$F„¥æ&PÌ%FÏ-è&F %FÌkPÌH%Fî€%Föäd%Fìáýô%F&Fåçäçæááxýâ`0éQá @ÌáT5ä &Fä8é L&Fˆ&Fé-ô:âx&FäÈè-ü âé-ê&Fé¼&Fü:á`ûäQÿáð&FÌkPÌ,'Fîd'FöäH'FìáýØ'Fì'Fåçäçæááxýâ`0éUá @ÎáT5ä(Fä8é 0(Fl(FpÍ-ô:â\(Fä4Í-ü âpÍ-êt(Fé (Fü:áÔíäUýô(F¼UÜ(Fˆ,ä(F},ì(F¨k,ä@^,ä+ äó.äÐä)FÐdæP- ä,)FÌkP- h)Fÿìä„)Fïîî-ð. ä¨÷.ä&l/ À)F¸àC¤+FÈ)FÌkl/ *Fî<*Föä *Fìáý°*FÄ*Fåçäçæááxýâ`0éIá @ÀáT5äÜ*Fä8é +FD+F˜èCô:â4+Fä\èCü â˜èCêL+Féx+Fü:á`ûäIýˆ-F¬+FÌkl/ è+Fî ,Föä,Fìáý”,F¨,Fåçäçæááxýâ`0éMá @ÂáT5äÀ,Fä8é ì,F(-FßCô:â-FäØÞCü âßCê0-Fé\-Fü:áÔíäMýˆ/F-FÌkl/ Ì-Fî.Föäè-Fìáýx.FŒ.Fåçäçæááxýâ`0é:á @¼ álä¤.Fä8é Ð.Fü.F€àCô:âpàCä¸àCÿà/F2€è0/Füé\/Fü:áîä:ýˆ1F/FÌkl/ Ì/Fî0Föäè/Fìáýx0FŒ0Fåçäçæááxýâ`0é>á @¾ álä¤0Fä8é Ð0Fü0F€àCô:âpàCä¸àCÿà1F2€è01Füé\1Fü:ápä>ýˆ3F1FÌkl/ Ì1Fî2Föäè1Fìáýx2FŒ2Fåçäçæááxýâ`0éBá @À álä¤2Fä8é Ð2Fü2F€àCô:âpàCä¸àCÿà3F2€è03Füé\3Fü:áX-äBýˆ5F3FÌkl/ Ì3Fî4Föäè3Fìáýx4FŒ4Fåçäçæááxýâ`0éFá @ álä¤4Fä8é Ð4Fü4F€àCô:âpàCä¸àCÿà5F2€è05Füé\5Fü:áLbäFýˆ7F5FÌkl/ Ì5Fî6Föäè5Fìáýx6FŒ6Fåçäçæááxýâ`0éJá @Å álä¤6Fä8é Ð6Fü6F€àCô:âpàCä¸àCÿà7F2€è07Füé\7Fü:á\-äJÿá7FÌkl/ Ì7Fî8Föäè7Fìáýx8FŒ8Fåçäçæááxýâ`0éNá @É álä¤8Fä8é Ð8Fü8F€àCô:âpàCä¸àCÿà9F2€è09Füé\9Fü:á(^-äNý 9Fdä˜9FÈ(æHÕä.@ëˆIF,3 À9F úD¤;FÈ9FÌk,3 :Fî<:Föä :Fìáý°:FÄ:Fåçäçæááxýâ`0é¿á @háT5äÜ:Fä8é ;FD;FHÿDô:â4;Fä ÿDü âHÿDêL;Féx;Fü:á`ûä¿ýˆ=F¬;FÌk,3 è;Fî Föäè=Fìáýx>FŒ>Fåçäçæááxýâ`0é7á @Válä¤>Fä8é Ð>Fü>FèùDô:âØùDä úDÿà?F2€è0?Füé\?Fü:áîä7ýˆAF?FÌk,3 Ì?Fî@Föäè?Fìáýx@FŒ@Fåçäçæááxýâ`0é;á @Xálä¤@Fä8é Ð@Fü@FèùDô:âØùDä úDÿàAF2€è0AFüé\AFü:ápä;ýˆCFAFÌk,3 ÌAFîBFöäèAFìáýxBFŒBFåçäçæááxýâ`0é?á @Zálä¤BFä8é ÐBFüBFèùDô:âØùDä úDÿàCF2€è0CFüé\CFü:áX-ä?ýˆEFCFÌk,3 ÌCFîDFöäèCFìáýxDFŒDFåçäçæááxýâ`0éCá @\álä¤DFä8é ÐDFüDFèùDô:âØùDä úDÿàEF2€è0EFüé\EFü:áLbäCýˆGFEFÌk,3 ÌEFîFFöäèEFìáýxFFŒFFåçäçæááxýâ`0éGá @_álä¤FFä8é ÐFFüFFèùDô:âØùDä úDÿàGF2€è0GFüé\GFü:á\-äGÿáGFÌk,3 ÌGFîHFöäèGFìáýxHFŒHFåçäçæááxýâ`0éKá @cálä¤HFä8é ÐHFüHFèùDô:âØùDä úDÿàIF2€è0IFüé\IFü:á(^-äKýÜTF3 ä˜IFÌk3 ÔIFäê JFöäðIFìáý€JF”JFåçäçæááxýâ`0éVá @<áøä¬JFä2€èØJFü8é KFPTF@KFô:â0KFäxKFü â@KFæä\KFìáýÌk Ø@KFäää´KFö(LF á @(áøä0VFä2€è\VFü8é ˆVF´VFèª-ô:âت-ä<«-ü @WF¼VF2€èèVFüéWFü:áÔíä=ÿáHWFétWFü:áîä>ÿá_ä ÜF4XFÈæäÀWFÌkÈæüWFÿìäXFïÿá `äT<äd( äTXFD–?æŒèälXFÌkŒè¨XFâÿåäÄXFÿîðXFìaä Ä FìjF Øá!YFxKF]FYFÌk ØDYFî|YFöä`YFìáýðYFZFåçäçæááxýâ`0éŸá @XáT5äZFä8é HZF¨\F„ZFô:âtZFä¼ZFü â„ZFæä ZFìáýÌkt7 „ZFäêøZFöl[F€[Fåçäçæááxýâ`0éRá @:áøä˜[Fä2€èÄ[Fü8é ð[F\F@KFô:â0KFäxKFÿà$\F2€èP\Füé|\Fü:á`ûäRÿá°\FéÜ\Fü:á`ûäŸýì^F]FÌk ØL]Fî„]Föäh]Fìáýø]F ^Fåçäçæááxýâ`0é£á @ZáT5ä$^Fä8é P^FŒ^FÔIFô:â|^Fä˜IFü âÔIFê”^FéÀ^Fü:áÔíä£ýì`Fô^FÌk Ø0_Fîh_FöäL_FìáýÜ_Fð_Fåçäçæááxýâ`0é×á @álä`Fä8é 4`F``F@KFô:â0KFäxKFÿàh`F2€è”`FüéÀ`Fü:áîä×ýìbFô`FÌk Ø0aFîhaFöäLaFìáýÜaFðaFåçäçæááxýâ`0éÛá @áläbFä8é 4bF`bF@KFô:â0KFäxKFÿàhbF2€è”bFüéÀbFü:ápäÛýìdFôbFÌk Ø0cFîhcFöäLcFìáýÜcFðcFåçäçæááxýâ`0éßá @álädFä8é 4dF`dF@KFô:â0KFäxKFÿàhdF2€è”dFüéÀdFü:áX-äßýìfFôdFÌk Ø0eFîheFöäLeFìáýÜeFðeFåçäçæááxýâ`0éãá @áläfFä8é 4fF`fF@KFô:â0KFäxKFÿàhfF2€è”fFüéÀfFü:áLbäãýìhFôfFÌk Ø0gFîhgFöäLgFìáýÜgFðgFåçäçæááxýâ`0éçá @álähFä8é 4hF`hF@KFô:â0KFäxKFÿàhhF2€è”hFüéÀhFü:á\-äçÿáôhFÌk Ø0iFîhiFöäLiFìáýÜiFðiFåçäçæááxýâ`0éëá @#áläjFä8é 4jF`jF@KFô:â0KFäxKFÿàhjF2€è”jFüéÀjFü:á(^-äëÿá&ØüjF<«-$pFkFÌkØ@kFî”kFöä\kFìááxkFÿôlF0lFåçäçæááxýâ`0é}á@Ð0é~á @8áT5äHlFä8é tlFdoF°lFô:â lFämFü â°lFæäÌlFìáèlFÿôÌk`7 °lFäê@mFö´mFÜmFåçäçæááxýâ`0é8á@Ð0é9á @&áøäômFä2€è nFü8é LnFxnFèª-ô:âت-ä<«-ü oF€nF2€è¬nFüéØnFü:á`ûä8ÿá oFé8oFü:áîä9ý ÄoFloFé˜oFü:á`ûä}ÿáÌoFéøoFü:áîä~ý˜rF,pFÌkØhpFî¼pFöä„pFìáá pFÿô0qFXqFåçäçæááxýâ`0é‚á@Ð0éƒá @:áT5äpqFä8é œqFØqF(UFô:âÈqFäìTFü â(UFæ 8rFàqFé rFü:áÔíä‚ÿá@rFélrFü:áîäƒý(uF rFÌkØÜrFî0sFöäørFìáásFÿô¤sFÌsFåçäçæááxýâ`0éqá@Ð0érá @¢álääsFä8é tFäT¿¼”F,”FÌkT¿h”Fæÿää„”Fä|Jçá ”Fè|JÿêÄ”FÌkT¿á•FîT•Föä•Fä|Jäáá8•Fè|JÿèÈ•Fð•Fåçäçæááxýâ-á|Jä>á@è#é?á@9✵ä–Fä8á|Jä 4–Fp–Fh”Fô:â`–Fä,”Fü âh”FæЖFx–F|J䤖Fü:á8oä>ÿáØ–Fé—Fü:á|Jä?ÿákä@—FŒŸê˜âä\—FÌk˜â˜—FðЗFöä´—FìáýD˜FX˜Fåçäçæááxýâè#ésâ@7âpDäp˜Fä7é œ˜F(šFTšFôéȘFx™Føéô˜FL™Føé ™Fü:áîäsþ4ÿê餙Fü™FøéЙFü:áîäsþ4ëý4ÿê通FHFø2鬚FüéØšFüá¼p-ä›F˜œFøá¼p-ä0›Füáàm-ä\›FlœFøáàm-䈛Füá8a-ä´›F@œFø8á8a-ä à›F œFP~-ô:â@~-äˆ~-ÿàœF4êþ4ê¼ý4êþ éÄœFFøéðœFü:áîäsþ4êþ4ê ÿâdÂä,A=ä¸ãä f>ä¼3 ä¤FÌk¼3 àFäêžFöäüFìýŒžF žFåçäçæááxýâ`0éÌá @Œáøä¸žFä2€èäžFü8é ŸF¤¢FLŸFô:â<ŸF䄟Fü âLŸFæähŸFìýÌkŒU LŸFäääÀŸFö4 FH Fåçäçáæááxýâ`0éáÀ>âŒM䨠FŠâ?âŒMä4¡FŠâ@âŒMäÀ¡FŠâBâŒMäL¢Fôðÿááÿÿÿ÷â“æ@ÿäñÿÿÿÿââ»æ@ÿäðÿááÿÿÿ÷â•æ@ôéx¢Fü:áäÿᬢF2€èØ¢Füé£Fü:áÔíäÌý@£FPÆå öAУFüæäP£FÌkü挣Fâÿèä ¨£FÄ£FÄÜEçíÄÜEü¤päT<@ä&^ð£F<ãCÔ¥Fø£FÌk^4¤Fîl¤FöäP¤Fìáýà¤Fô¤Fåçäçæááxýâ`0éá @üáT5ä ¥Fä8é 8¥Ft¥FPEô:âd¥FäEü âPEê|¥F騥Fü:á`ûäý¸§FÜ¥FÌk^¦FîP¦Föä4¦FìáýĦFئFåçäçæááxýâ`0éá @þáT5äð¦Fä8é §FX§FÔ…Eô:âH§F䘅Eü âÔ…Eê`§F錧Fü:áÔíäý¸©FÀ§FÌk^ü§Fî4¨Föä¨Fìáý¨¨F¼¨Fåçäçæááxýâ`0é=á @náläÔ¨Fä8ê ©F,©FãCô:âôâCä<ãCÿà4©F2€è`©Fü錩Fü:áîä=ý¸«FÀ©FÌk^ü©Fî4ªFöäªFìáý¨ªF¼ªFåçäçæááxýâ`0éAá @páläÔªFä8ê «F,«FãCô:âôâCä<ãCÿà4«F2€è`«Fü錫Fü:ápäAý¸­FÀ«FÌk^ü«Fî4¬Föä¬Fìáý¨¬F¼¬Fåçäçæááxýâ`0éEá @ráläÔ¬Fä8ê ­F,­FãCô:âôâCä<ãCÿà4­F2€è`­Fü錭Fü:áX-äEý¸¯FÀ­FÌk^ü­Fî4®Föä®Fìáý¨®F¼®Fåçäçæááxýâ`0éIá @táläÔ®Fä8ê ¯F,¯FãCô:âôâCä<ãCÿà4¯F2€è`¯Fü錯Fü:áLbäIý¸±FÀ¯FÌk^ü¯Fî4°Föä°Fìáý¨°F¼°Fåçäçæááxýâ`0éMá @wáläÔ°Fä8ê ±F,±FãCô:âôâCä<ãCÿà4±F2€è`±Fü錱Fü:á\-äMÿáÀ±FÌk^ü±Fî4²Föä²Fìáý¨²F¼²Fåçäçæááxýâ`0éQá @{áläÔ²Fä8ê ³F,³FãCô:âôâCä<ãCÿà4³F2€è`³Fü錳Fü:á(^-äQÿá¬7 äȳFÌk¬7 ´Fäê<´Föä ´Fìý°´FÄ´Fåçäçæááxýâ`0éÈá @ŠáøäÜ´Fä2€èµFü8é 4µF`µFLŸFô:â<ŸF䄟FÿàhµF2€è”µFüéÀµFü:á`ûäÈÿáè`äüµF4 æûä¶FPßæÜËäòAä€H ä<¶FÌk€H x¶Fÿì÷åHÏä ´±ÐÀF€zä´¶FÌk€zð¶FäêD·Föä ·Fìá(·Fÿô¸·Fà·Fåçäçæááxýâ`0éºá@Ð0é»á@Îâøäø·Fä2€è$¸Fü8é P¸F¸¿FŒ¸Fô:â|¸Fäà¸Fü ⌸Fæä¨¸FìáĸFÿôÌk(@Œ¸Fäää¹Fö¹F ̹Fåçäçáæááxýâ`0é–áÀÐ0é—áÀ`U è›á€)âŒMäÔºFä,âŒMå»FŠâ-âŒM䌻FŠâ.âŒMä¼FŠâ/âŒM䤼FŠâ0âŒMä0½FŠâ1âŒMä¼½FŠâ2âŒMäH¾FŠâ4âŒMì4âŒMäÔ¾FŠâ7âŒMä`¿Fä>áç›ÿíðÿ–ááÿÿÿ÷â“æ@ÿä ïÿäï—ááÿÿÿÿþâ ÿì ïÿäáì–ááÿÿÿÿþâ ÿì ïÿäóáÿââæ ÿä ïÿäóä€ÿâæ ÿäðÿÿäáâèÿñâ,å @ÿãñÿÿÿÿââªæ@ÿäðÿ›ááÿÿÿ÷â•æ@ô錿Fü:áä›ý DÀFÀ¿F2€èì¿FüéÀFü:á`ûäºÿáLÀF2€èxÀFüé¤ÀFü:á`ûä»ÿáÐä¤K-øÀFTL ðÀF u!ä Äg!ÁFÐ{äÁFY'æ&øÐ ÁFD'@ÃF(ÁFÌkøÐdÁFîœÁFöä€ÁFìáýÂF$ÂFåçäçæááxýâ`0éïá @ÐáT5ä<ÂFä8é hÂF¤ÂFÐ<@ô:â”ÂFä”<@ü âÐ<@ê¬ÂFéØÂFü:á`ûäïýèÄF ÃFÌkøÐHÃFî€ÃFöädÃFìáýôÃFÄFåçäçæááxýâ`0éóá @ÒáT5ä ÄFä8é LÄFˆÄF %@ô:âxÄFäd%@ü â %@êÄFé¼ÄFü:áÔíäóýèÆFðÄFÌkøÐ,ÅFîdÅFöäHÅFìáýØÅFìÅFåçäçæááxýâ`0éWá @2áläÆFä8é 0ÆF\ÆF '@ô:âü&@äD'@ÿàdÆF2€èÆFü鼯Fü:áîäWýèÈFðÆFÌkøÐ,ÇFîdÇFöäHÇFìáýØÇFìÇFåçäçæááxýâ`0é[á @4áläÈFä8é 0ÈF\ÈF '@ô:âü&@äD'@ÿàdÈF2€èÈFüé¼ÈFü:ápä[ýèÊFðÈFÌkøÐ,ÉFîdÉFöäHÉFìáýØÉFìÉFåçäçæááxýâ`0é_á @6áläÊFä8é 0ÊF\ÊF '@ô:âü&@äD'@ÿàdÊF2€èÊFüé¼ÊFü:áX-ä_ýèÌFðÊFÌkøÐ,ËFîdËFöäHËFìáýØËFìËFåçäçæááxýâ`0écá @8áläÌFä8é 0ÌF\ÌF '@ô:âü&@äD'@ÿàdÌF2€èÌFüé¼ÌFü:áLbäcýèÎFðÌFÌkøÐ,ÍFîdÍFöäHÍFìáýØÍFìÍFåçäçæááxýâ`0égá @;áläÎFä8é 0ÎF\ÎF '@ô:âü&@äD'@ÿàdÎF2€èÎFüé¼ÎFü:á\-ägÿáðÎFÌkøÐ,ÏFîdÏFöäHÏFìáýØÏFìÏFåçäçæááxýâ`0éká @?áläÐFä8é 0ÐF\ÐF '@ô:âü&@äD'@ÿàdÐF2€èÐFüé¼ÐFü:á(^-äkþÑFD? äøÐFè(0æÔÑäl<ä Xg ÑFP!$ä¬$@ÑFdñ8ÑFDÒ#äº#ä@ äPÑFêtÑF@ lÑFܼ"ä"ð¦"œÑF4h„ÑF &&ŒÑFt!&”ÑFÄ&ä ˆý%ŒÔF¤~ä¬ÑFÌk¤~èÑFäê<ÒFöäÒFìá ÒFÿô°ÒFØÒFåçäçæááxýâ`0é¿á@Ð0éÀá@ÐâøäðÒFä2€èÓFü8é HÓFtÓFŒ¸Fô:â|¸Fäà¸Fý ÔF|ÓF2€è¨ÓFüéÔÓFü:áÔíä¿ÿáÔF2€è4ÔFüé`ÔFü:áÔíäÀÿáèÒä¼O-ä¨*ä¬ÔFÌk¨*èÔFÿìäÕFïá ÕFè ˜ê<ÕFè ˜ö ˜ìpÕF|…ähÕFìWæ&ŒU €ÕF„ŸFd×FˆÕFÌkŒU ÄÕFîüÕFöäàÕFìáýpÖF„ÖFåçäçæááxýâ`0éá @ áT5äœÖFä8é ÈÖF×F´Fô:âôÖFäȳFü â´Fê ×Fé8×Fü:á`ûäýHÙFl×FÌkŒU ¨×Fîà×FöäÄ×FìáýTØFhØFåçäçæááxýâ`0é á @¢áT5䀨Fä8é ¬ØFèØFàFô:âØØFä¤Fü âàFêðØFéÙFü:áÔíä ýHÛFPÙFÌkŒU ŒÙFîÄÙFöä¨ÙFìáý8ÚFLÚFåçäçæááxýâ`0éná @< álädÚFä8é ÚF¼ÚFLŸFô:â<ŸF䄟FÿàÄÚF2€èðÚFüéÛFü:áîänýHÝFPÛFÌkŒU ŒÛFîÄÛFöä¨ÛFìáý8ÜFLÜFåçäçæááxýâ`0érá @> álädÜFä8é ÜF¼ÜFLŸFô:â<ŸF䄟FÿàÄÜF2€èðÜFüéÝFü:ápärýHßFPÝFÌkŒU ŒÝFîÄÝFöä¨ÝFìáý8ÞFLÞFåçäçæááxýâ`0évá @@ álädÞFä8é ÞF¼ÞFLŸFô:â<ŸF䄟FÿàÄÞF2€èðÞFüéßFü:áX-ävýHáFPßFÌkŒU ŒßFîÄßFöä¨ßFìáý8àFLàFåçäçæááxýâ`0ézá @B álädàFä8é àF¼àFLŸFô:â<ŸF䄟FÿàÄàF2€èðàFüéáFü:áLbäzýHãFPáFÌkŒU ŒáFîÄáFöä¨áFìáý8âFLâFåçäçæááxýâ`0é~á @E álädâFä8é âF¼âFLŸFô:â<ŸF䄟FÿàÄâF2€èðâFüéãFü:á\-ä~ÿáPãFÌkŒU ŒãFîÄãFöä¨ãFìáý8äFLäFåçäçæááxýâ`0é‚á @I álädäFä8é äF¼äFLŸFô:â<ŸF䄟FÿàÄäF2€èðäFüéåFü:á(^-ä‚ÿáðG äXåFÌkðG ”åFÿìä°åFïáÌåFè ˜ìèåFè ˜ÿææFÜûäæFij9â4æFø ,æF è$äÖ$äÐ äDæF°æ ìp\æFPÚ,ä×,äœX ätæFÌkœX °æFÿìäÌæFäœ.çíX-ë çFJ øæF¨s"äpc"ä,Y ä€ì?ä€5ä„‚Aä Z ä0çFÌk Z lçFÿìäˆçFïí ˜êÌçFl6´çF̦)¼çF‡)ÄçF1ä4Y!ääŠäÜçFôgâüçFôÿäôçFøÿ&æ&[ èF˜G<ðéFèFÌk[ PèFîˆèFöälèFìáýüèFéFåçäçæááxýâ`0é1á @´áT5ä(éFä8é TéFéFD1=ô:â€éFä1=ü âD1=ê˜éFéÄéFü:á`ûä1ýÔëFøéFÌk[ 4êFîlêFöäPêFìáýàêFôêFåçäçæááxýâ`0é5á @¶áT5ä ëFä8é 8ëFtëFôE<ô:âdëFä¸E<ü âôE<ê|ëFé¨ëFü:áÔíä5ýÔíFÜëFÌk[ ìFîPìFöä4ìFìáýÄìFØìFåçäçæááxýâ`0éòá @Œ áläðìFä8é íFHíF`G<ô:âPG<ä˜G<ÿàPíF2€è|íFüé¨íFü:áîäòýÔïFÜíFÌk[ îFîPîFöä4îFìáýÄîFØîFåçäçæááxýâ`0éöá @Ž áläðîFä8é ïFHïF`G<ô:âPG<ä˜G<ÿàPïF2€è|ïFüé¨ïFü:ápäöýÔñFÜïFÌk[ ðFîPðFöä4ðFìáýÄðFØðFåçäçæááxýâ`0éúá @ áläððFä8é ñFHñF`G<ô:âPG<ä˜G<ÿàPñF2€è|ñFüé¨ñFü:áX-äúýÔóFÜñFÌk[ òFîPòFöä4òFìáýÄòFØòFåçäçæááxýâ`0éþá @’ áläðòFä8é óFHóF`G<ô:âPG<ä˜G<ÿàPóF2€è|óFüé¨óFü:áLbäþýÔõFÜóFÌk[ ôFîPôFöä4ôFìáýÄôFØôFåçäçæááxýâ`0éá @• áläðôFä8é õFHõF`G<ô:âPG<ä˜G<ÿàPõF2€è|õFüé¨õFü:á\-äÿáÜõFÌk[ öFîPöFöä4öFìáýÄöFØöFåçäçæááxýâ`0éá @™ áläðöFä8é ÷FH÷F`G<ô:âPG<ä˜G<ÿàP÷F2€è|÷Füé¨÷Fü:á(^-äÿádŒää÷F ˜êLåøFì/â>PøFì9øF £) øF€‰)(øF50øFð~(8øF z(@øF`v(HøFàq(ä m(äÄ] ähè?xøF`pøF$~$äHP$ä´:ˆøFà øFȱ)˜øFìy) øFáA¨øFP°øFxJ(¸øFdG(ÀøFPD(ÈøF(5ÐøFx®6ØøFlØ9àøFØ[:äèøFÌk´:$ùFîØHäHã îä@ùFìâtH`0å\ùFê âlùF ä â |ùF,HäÔùFአôæô#;è )Gät)Gä4?G4òGÌkአä|ùFäôùF+ãá úFአäúF|ùFâ€úF“ äúF(úFæ â èc98úF\úFäLúFè ðâpúFè äæ¼úFØäúFœúFæ â ¬úFØ äæøúFÔÏäÌúFØúFæ â èúFÔÏ äæ\ûF¤ÌäûFûFæ â $ûF¤Ì â èc94ûFHûFäLúFìâèúFèÀûFÌõ älûFxûFæ â ˆûFÌõ â èc9˜ûF¬ûFäLúFìâèúFèüûF|räÐûFÜûFæ â ìûF|r äæ8üF€×ä üFüFæ â (üF€× äæTüF |äHüFLúFæpüFô ädüF(üFæ¬üF€ø ä€üFŒüFæ â œüF€ø äæèüFØä¼üFÈüFæ â ØüFØ äæ(ýFøÜ äøüFýFæ â@ýFèûFèhýF”©ä8ýFDýFæ â@TýFèxûFè"„ GôO þFxýFÔùFôO´ýFÿèäàýFì€â|ùFî|W äüýFì â|ùFäÄþFþFÔùFôOPþFPÿèä|þFì€â|ùFê˜þF|W äüýFðÄ"å´þFê âØüF älÿFÌþFÔùFôOÿFPÿèä4ÿFì€â|ùFêPÿF|W äüýFð´)åÜûFì@GtÿFÔùFôO°ÿFÿèäÜÿFì€â|ùFêøÿF|W äüýFìG´)åÜûFðfä0Gê âLúF ä GHGÔùFôO„Gÿèä°Gì€â|ùFêÌG|W äüýFìèG´)åÜûFìGfä0GîÄ"å´þFêüG(GÔùFôOdGëôG䌺 îäGìâ|ùFì¬G|W äüýFìØG„: äÈGì æè… äÈGì®ùFäDGâP;ôOâ\Gü(Göôã âì{öýÿí“ ävõýÿí$ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}úGÔùFôO@GëìGä0¼ îälGìâ|ùFìˆG|W äüýFì´G„: ä¤Gì æäÐG… ä¤GðÄ"å´þFê®ùFä<GâôGôO"âTGüGöôã âì:öýÿí“ ä(öýÿíÄ"å)öùÿõ{öýÿí“ ävõýÿí$ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}ö",GDÀP G” GÔùFDÀÐ Gÿèäü Gì€â|ùFê G|W äüýFì4 G´)åÜûFðà-å0GîX GÔùFDÀ” Gë$ Gä´» îäÀ Gìâ|ùFìÜ G|W äüýFì G„: äø Gì æè… äø Gì®ùFät GâìGDÀ⌠GüX Göôã âì{öýÿí“ ävõýÿípë ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}öÀGè„å <GÔùFè„áxGÿèä¤GäØüF䀀â|ùFî|W äüýFêTGÌ' äÐGäÌ' GäYÿå â GÌ' â èc9,G@GäLúFìâØüFèèGp ädGäp  GäYÿå â °Gp â èc9ÀGÔGäLúFìâØüFè"G O |GøGÔùF O 4Gÿèä`GäýFä€â|ùFî|W äüýFð„GÔùF O ÀGÿèäìGäDýF䀀â|ùF î|W äüýFê"(GÔîœGGÔùFÔîTGÿèä€GäýFä€â|ùF î|W äüýFð¤GÔùFÔîàGÿèä GäDýF䀀â|ùF î|W äüýFê¼G°‚ ä8Gä°‚ tGäYÿå â „G°‚ â èc9”G¨GäLúFìâØüFèPG¤ äÌGä¤ GäYÿå â G¤ â èc9(G<GäLúFìâØüFèäG0 ä`Gä0 œGäYÿå â ¬G0 â èc9¼GÐGäLúFìâØüFèxGü äôGäü 0GäYÿå â @Gü â èc9PGdGäLúFìâØüFè G ÚäˆGä ÚÄGäYÿå â ÔG Ú â èc9äGøGäLúFìâØüFè G°’ äGä°’ XGäYÿå â hG°’ â èc9xGŒGäLúFìâØüFè"tGHôlG°GÔùFHôìGÿèäGäûFä€â|ùF ê4G|W äüýFìPGзäûFð`0å0GêLGtGÔùFHô°GÿèäÜGì€â|ùF êøG|W äüýFìGзäûFì0G´)åÜûFð`0å0GîTGÔùFHôGë<GäÁ îä¼Gìâ|ùFìØG|W äüýFìôGзäûFì G„: äGì æè… äGì®ùFäŒGâ$ GHôâ¤GüTGöôã âì{öýÿí“ ävõýÿí„, ä(öýÿíзä,öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}öGÿ ä„Gäÿ ÀGäYÿå â ÐGÿ â èc9àGôGäLúFìâØüFèœGü„äGäü„TGäYÿå â dGü„ â èc9tGˆGäLúFìâØüFè0GdLä¬GädLèGäYÿå â øGdL â èc9GGäLúFìâØüFèÄGôw ä@Gäôw |GäYÿå â ŒGôw â èc9œG°GäLúFìâØüFèXGœêäÔGäœêGäYÿå â  Gœê â èc90GDGäLúFìâØüFèìG,X ähGä,X ¤GäYÿå â ´G,X â èc9ÄGØGäLúFìâØüFè¬GˆpäüGÔùFˆp8GÿèädGì€â|ùFê€G|W äüýFð`0åœGì â|ùF ä"T"Gä x G¼GÔùFä øGÿèä$ Gì€â|ùFê@ G|W äüýFì\ GзäûFð`0åœGìX!G€ GÔùFä ¼ Gÿèäè Gì€â|ùFê!G|W äüýFì !GзäûFìö(öýÿí`0å,öýÿí€;ä)ö;ö}öø'Gèaät'Gäèa°'GäYÿå â À'Gèa â èc9Ð'Gä'GäLúFìâØüFèŒ(G¼• ä(G伕 D(GäYÿå â T(G¼• â èc9d(Gx(GäLúFìâØüFì4¦äœ(Gä4¦Ø(GäYÿå â è(G4¦ â èc9ø(G )GäLúFìâØüFè8)Gö(ö)ö)ö;ö}öÄ,Gä`!Gîâ\+Gò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å,öýÿí„: ä,öýÿí… ä)ö;ö}ö0.Gä€ Gî âø,Gò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å,öýÿíä&å)ö;ö}öl/Gä¼Gî âd.Gò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å)ö;ö}öx0GäüGî â /Gò{öýÿí“ ävõýÿíˆpä(öýÿí`0å)ö;ö}öä1GätGî â¬0Gò{öýÿí“ ävõýÿíHôä(öýÿíзä,öýÿí´)å,öýÿí`0å)ö;ö}ö83Gä°Gî â2Gò{öDõýÿí“ ävõýÿíHôä(öýÿíзä,öýÿí`0å)ö;ö}öŒ4Gä¤Gî âl3Gò{öDõýÿ픩ä(öýÿí“ ävõýÿíÌ' ä(ö)ö)ö;ö}öà5GäGî âÀ4Gò{öDõýÿíøÜ ä(öýÿí“ ävõýÿíÌ' ä(ö)ö)ö;ö}ö47Gä„Gî â6Gò{öDõýÿ픩ä(öýÿí“ ävõýÿíp ä(ö)ö)ö;ö}öˆ8GäøGî âh7Gò{öDõýÿíøÜ ä(öýÿí“ ävõýÿíp ä(ö)ö)ö;ö}ö”9Gä<Gî â¼8Gò{öDõýÿí“ ävõýÿíÀÑ ä(ö)ö;ö}öÐ:Gä” Gî âÈ9Gò{öýÿí“ ävõýÿíDÀä(öýÿí´)å,öýÿíà-å)ö;ö}ö GäþFîâ(>Gò:öýÿí“ ä(öýÿíÄ"å)ö{ö}þxýFîâ?Gò{ö}ú@?G òGä˜?GአôpðÔ¼Gä½G|ùFä àåG#Ìkአä@?Gä¸?G1ãáÐ?GአäÈ?G@?Gâx@G“ äà?Gì?Gæ â èc9ü?G@GäœBêâ$@Gè â 4@G, â D@Gd@G â T@G|\ äîœBæ”@Gô äˆ@GT@GæÐ@GØä¤@G°@Gæ â À@GØ äæ AGÔÏäà@Gì@Gæ â ü@GÔÏ äæHAG|räAG(AGæ â 8AG|r äæ„AG€×äXAGdAGæ â tAG€× äæÀAG |ä”AG AGæ â°AGæ ìüAG€ø äÐAGÜAGæ â ìAG€ø äæ8BGØä BGBGæ â (BGØ äæ0^GœRåHBGPBGâä¨BGœRéÄKGèBpä|ùFr?GäpLGäˆLGè HWG ˜?GœRåPBGäÈBGãáàBGœRåØBGPBGâüBG |äðBG AGæCG€×ä CGdAGæ¼CG€ø ä(CG4CGæ â DCGÅ â ¸OTCG”CGãhCGèIìû¨CGâBGìâÜAGè`DGØäÌCGØCGæ â èCGÅ â ¸OøCG8DGã DGèIìûLDGâì@Gìâ°@Gè|DGˆ; äpDG”‹æ"èGGôO EGŒDG¨BGôOÈDGÿèäôDGì€âPBGî|W äEGì âPBGä(FG(EG¨BGôOdEGÿèäEGì€âPBGê¬EG|W äEGðä&åÈEGê âØEG ä âPBGèEGæüEGè4ÿî0FG¨BGôOlFGÿèä˜FGì€âPBG ê´FG|W äEGðä&åÐFGì â àFGÅ â ¸OðFG0GGãGGèIìûŒGGâDGGè â TGGÌõ â èc9dGGxGGäœBêâ$@Gìâ GGè â °GG¤Ì â èc9ÀGGÔGGäœBêâ$@Gè|HGP7äøGG¨BGP74HGÿèä`HGäØCG䀀âPBGî|W äEGêIG5äŒHG¨BG5ÈHGÿèäôHGä4CG䀀âPBGî|W äEGê"\JGì6´IG IG¨BGì6\IGÿèä˜IGäˆIGä€âPBGê âPBG è|W äEGð¼IG¨BGì6øIGÿèä$JGäPBGä€âPBGê@JG|W äEGð 7ô"˜KG|6ðJGlJG¨BG|6¨JGÿèäÔJGäˆIGä€âPBGî|W äEGðøJG¨BG|64KGÿèä`KGäPBGä€âPBGê|KG|W äEGð 7ô´KGhÈ ä¨KGÐFGæÜKG$ÙäÄKGå$ÙÐFGì4Ì äìKG¨BG4Ì (LGÿèäTLGäÐFGäR€€âPBG î|W äEGîèKâë4MGäìKGîâ¼LGò{öDõýÿí$Ùä;ö}öNGä0FGîâhMGò:öýÿí$Ùä(öýÿíä&å)ö{ö}ö¬OGäøJGîâDNGò{öýÿíœRåýÿíÄä(ö*öOõ)ö;öqõýÿí$Ùä;öDõýÿíÄä;ö}ö¸PGälJGî âàOGò{öqõýÿí$Ùä;öDõ*öOõ;ö}öTRGä¼IGîâìPGò{öýÿíœRåýÿíÄä(ö*öOõ)ö;öpõýÿí$Ùä;öDõýÿíÄä;ö}ö`SGä IGî âˆRGò{öpõýÿí$Ùä;öDõ*öOõ;ö}öÌTGäŒHGî â”SGò{öDõýÿí€ø ä(öýÿí$Ùä.öJõrõ(ö)ö)ö;ö}öØUGäøGGî ãUGò{öDõýÿíØä(ö*öýÿí$Ùä)ö;ö}öäVGä(EGî â VGò:öýÿí$Ùä(öýÿíä&å.öýÿí$Ùä)ö{ö}þŒDGîâWGò{ö}öpWGøðBGæ˜WGø CGæÀWGø(CGæèWGøÌCGæXGøŒDGæ8XGø(EGæ`XGøøGGæˆXGøŒHGæ°XGø IGæØXGø¼IGæáYGølJGæ(YGøøJGæÜZGøPYGæ€YGæ˜Uø âÔYGäœYGì€â¸YG`0åˆIGîÐ0åˆIGê{öDõýÿí`0å.öýÿí$ÙäjõýÿíÐ0å.öýÿí$Ùä;ö}ö\Gø[Gæ4[GæôTø âˆ[GäP[Gì€âl[G`0åˆIGîÐ0åˆIGê{öDõýÿí`0å.öýÿí$ÙäkõýÿíÐ0å.öýÿí$Ùä;ö}ö¸\Gø¨KGæ`]Gøà\Gæ]GðHù âPBG ]Gæ4]Gè4êþ¸]Gøˆ]Gæ@?GðHùà]GøÄKGæ^Gø0FGæüìKGæœ^G¤Ìä@^GL^Gæ âPBG\^Gæp^Gè4ÿê_GÌõ ä¬^G¸^Gæ âPBGÈ^GæÜ^Gè4êþH_GøÜ ä_G$_Gæ â@4_GèL^Gèˆ_G”©äX_Gd_Gæ â@t_Gè¸^Gè"TkGôO,`G˜_G˜?GôOÔ_Gÿèå`GäœBä€â@?Gî|W ä`Gì â@?Gää`G4`G˜?GôOp`GPÿèäœ`GäœBä€â@?Gê¸`G|W ä`GðÄ"åÔ`Gê â(BG äŒaGì`G˜?GôO(aGPÿèäTaGäœBä€â@?GêpaG|W ä`Gð´)å(AGìpbG”aG˜?GôOÐaGÿèäüaGäœBä€â@?GêbG|W ä`Gì4bG´)å(AGðfäPbGì â`bG ä â°AGäPcGxbG˜?GôO´bGÿèäàbGäœBä€â@?GêübG|W ä`GìcG´)å(AGì4cGfäPbGðÄ"åÔ`GêüfGXcG˜?GôO”cGë$dGäÈË îäÀcGìâ@?GìÜcG|W ä`GìdG„: äøcGì æè… äøcGìr?GätdGâ”%GôOâŒdGüXcGöôã âì{öýÿí$ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}úgG˜?GôO@gGëìgGäàÍ îälgGìâ@?GìˆgG|W ä`Gì´gG„: ä¤gGì æäÐgG… ä¤gGðÄ"åÔ`Gêr?Gäövõýÿífä>ö(ö)ö)ö;ö}ö"ÌoGDÀ lGdkG˜?GDÀ kGÿèäÌkGì€â@?GêèkG|W ä`GìlG´)å(AGðà-åPbGð(lG˜?GDÀdlGëôlGä`Í îälGìâ@?Gì¬lG|W ä`GìØlG„: äÈlGì æè… äÈlGìr?GäDmGâìgGDÀâ\mGü(lGöôã âì{öýÿípë ä(öýÿí„: ä,öýÿí… ä,ö õýÿí“ ävõýÿí´qä<öýÿí ûävõýÿíø˜ä<öýÿíôã ä>övõýÿífä>ö(ö)ö)ö;ö}ö`pGè„å ÜoG˜?Gè„ápGÿèäDpGä(BG䀀â@?Gî|W ä`Gê"€qGÌ' ôpGppG˜?GÌ' ¬pGÿèäØpGäL^Gä€â@?Gî|W ä`GðüpG˜?GÌ' 8qGÿèädqGä¸^G䀀â@?G î|W ä`Gê" rGp rGqG˜?Gp ÌqGÿèäøqGäL^Gä€â@?G î|W ä`GðrG˜?Gp XrGÿèä„rGä¸^G䀀â@?G î|W ä`Gê"ÀsG O 4sG°rG˜?G O ìrGÿèäsGä$_Gä€â@?G î|W ä`Gðövõýÿífä>ö(ö)ö)ö;ö}ö¤€Gÿ ä€G˜?Gÿ @€Gÿèäl€Gì€â@?GꈀG|W ä`Gð`0åPbGìTGü„ä´€G˜?Gü„ð€GÿèäGì€â@?Gê8G|W ä`Gð`0åPbGìèGdLädGädL GäYÿå â °GdL â èc9ÀGÔGäœBêâ$@Gè|‚Gôw äøGäôw 4‚GäYÿå â D‚Gôw â èc9T‚Gh‚GäœBêâ$@Gè"ðƒGœê,ƒGŒ‚G˜?GœêÈ‚Gÿèäô‚GäL^Gä€â@?GêƒG|W ä`GðзäL^Gð4ƒG˜?GœêpƒGÿè䜃GäL^Gä€â@?G긃G|W ä`GìÔƒG„: äL^Gð… äL^Gì„„G,X å„Gä,X <„GäYÿå â L„G,X â èc9\„Gp„GäœBêâ$@GèD…Gˆp䔄G˜?GˆpЄGÿèäü„Gì€â@?Gê…G|W ä`Gð`0å4…Gì â@?G ä"ì‡Gä †GT…G˜?Gä …Gÿèä¼…Gì€â@?GêØ…G|W ä`Gìô…GзäL^Gð`0å4…Gìð†G†G˜?Gä T†Gÿè䀆Gì€â@?G꜆G|W ä`G츆GзäL^GìÔ†G`0å4…Gðä&åL^Gðø†G˜?Gä 4‡Gÿèä`‡Gì€â@?Gê|‡G|W ä`G옇GзäL^Gì´‡G`0å4…GìЇG„: äL^Gð… äL^G쀈G¼• äü‡G伕 8ˆGäYÿå â HˆG¼• â èc9XˆGlˆGäœBêâ$@Gè‰G4¦äˆGä4¦̈GäYÿå â ܈G4¦ âèc9ìˆGá‰GäœBêâ$@Gè$ŽGàƒ ä$‰G,‰Gâ䄉Gàƒ èL‹GèpäPBGr?Gäd‹Gä|‹Gè¬G˜?Gàƒ ä,‰G䤉GãἉGàƒ ä´‰G,‰G⌊GôOä̉G„‰GôOŠGÿèä4ŠGì€â,‰Gê`ŠG|W äPŠGì â,‰Gè€;ä|ŠGì æä<‹G>䜊G„‰G>ØŠGÿèä‹Gì€â,‰Gê ‹G|W äPŠGð`0åœBîÄ+äL‹GåÄ+|ŠGì”r âìÐŒG䜊Gî â°‹Gò{öDõýÿíÄ+ä(ö(öýÿíä¬G”ŽG>èGÿèäGì€â<ŽGê0G|W ä`GìLG`0åœBîÐ0åœBîÄ+äxGåÄ+ŒGì”r â쌒Gä¬GîâÜGò{öDõýÿíÄ+ä(ö(öýÿíö(öýÿíÐú ä)ö)ö;ö}ö"<šG0H ´—G0—G˜?G0H l—Gÿè䘗Gì€â@?G!î|W ä`Gð¼—G˜?G0H ø—Gël˜GäŒÊ îä$˜Gìâ@?Gì@˜G|W ä`Gð“ä\˜Gì æär?G优GâP•G0H âÔ˜Gü¼—GöäËâì{öýÿí“ ävõýÿí0H ä(öýÿí Zä<öýÿíäËä>ö(öýÿí“ä)ö)ö;ö}ö"ÀGpôìšGLšG˜?GpôˆšGÿèä´šGì€â@?G"êКG|W ä`Gð`0å4…GðôšG˜?Gpô0›GëÀ›GäðÉ îä\›Gìâ@?Gìx›G|W ä`Gì”›G`0å4…Gð€;ä°›Gì æär?GäœGâl˜Gpôâ(œGüôšGö”r âì{öýÿí“ ävõýÿípôä(öýÿí`0å,öýÿí Zä<öýÿí”r ä>ö(öýÿí€;ä)ö)ö;ö}ö"Ü GèaTžGÐG˜?Gèa žGÿèä8žGì€â@?G#î|W ä`Gð\žG˜?Gèa˜žGë ŸGäÑ îäÄžGìâ@?GìàžG|W ä`Gð€;äüžGì æär?Gä\ŸGâÀ›GèaâtŸGü\žGö”r âì{öýÿí“ ävõýÿíèaä(öýÿí Zä<öýÿí”r ä>ö(öýÿí€;ä)ö)ö;ö}ö%Ô©G$´¤Gì G˜?G$(¡Gël¢GähÐ îäT¡Gìâ@?Gìp¡G|W ä`G육G„: 䌡Gì æä¸¡G… 䌡Gð 7äÔ¡Gì â ä¡G,¢G â ô¡G´q â èc9¢G¢GäœBêâ$@Gï@¢Gè4êþr?Gä¼¢Gâ ŸG$âÔ¢Güì Göôã âì{öýÿí“ ävõýÿíœ>ä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,ö(öýÿí |ä)öýÿí… ä)ö;ö}ú¼¤G˜?G$ø¤Gë<¦GäPÞ îä$¥Gìâ@?Gì@¥G|W ä`Gìl¥G„: ä\¥Gì æäˆ¥G… ä\¥Gð 7䤥Gì â ´¥Gü¥G â Ä¥G´q â èc9Ô¥Gè¥GäœBêâ$@Gï¦Gè4ÿêr?G䌦Gâl¢G$"⤦Gü¼¤Göôã âì{öýÿí“ ävõýÿíœ>ä(öýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>ö(öýÿí„: ä)ö,öùÿõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>ö(öýÿí… ä)ö)ö;ö}ö%ü²Gpë ¬­Gä©G˜?Gpë ªGëd«GäœÝ îäLªGìâ@?GìhªG|W ä`G씪G„: 䄪Gì æä°ªG… 䄪Gð 7ä̪Gì â ܪG$«G â ìªG´q â èc9üªG«GäœBêâ$@Gï8«Gè4êþr?Gä´«Gâ<¦Gpë âÌ«Güä©Göôã âì{öýÿí“ ävõýÿíDÀä(öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,ö(öýÿí |ä)öýÿí… ä)ö;ö}ú´­G˜?Gpë ð­Gë4¯Gäß îä®Gìâ@?Gì8®G|W ä`Gìd®G„: äT®Gì æä€®G… äT®Gðè#圮Gì â ¬®Gô®G â ¼®G´q â èc9Ì®Gà®GäœBêâ$@Gï¯Gè4ÿêr?G䄯Gâd«Gpë $✯Gü´­Göôã âì{öýÿí“ ävõýÿípë ä(öýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>ö(öýÿí„: ä)ö,öùÿõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>ö(öýÿí… ä)ö,öýÿíè#å)ö;ö}ú!„, ·G ³G˜?G„, H³G먴Gä¤Þ îät³Gìâ@?Gì³G|W ä`G쬳GзäL^GìسG„: äȳGì æäô³G… äȳGð 7ä´Gì â  ´Gh´G â 0´G´q â èc9@´GT´GäœBêâ$@Gï|´Gè4êþr?Gäø´Gâ4¯G„, âµGü ³Göôã âì{öýÿí“ ävõýÿíHôä(öýÿíзä,öXõ<öýÿí|rä>ö(öýÿí„: ä)ö,ö(öýÿí |ä)öýÿí… ä)ö;ö}ú(·G˜?G„, d·GëĸGäÈÛ îä·Gìâ@?G쬷G|W ä`GìÈ·GзäL^Gìô·G„: ää·Gì æä¸G… ää·Gðè#å,¸Gì â <¸G„¸G â L¸G´q â èc9\¸Gp¸GäœBêâ$@GGè4ÿêr?Gä¹G⨴G„, 'â,¹Gü(·Göôã âì{öýÿí“ ävõýÿí„, ä(öýÿíзä,öùÿõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>ö(öýÿí„: ä)ö,öùÿõýÿíTp ä<öýÿí }ä<öýÿí€ø ä,öýÿíôã ä>ö>ö(öýÿí… ä)ö,öýÿíè#å)ö;ö}öì¼Gö(ö)ö)ö;ö}öpÀGä0—Gîâ°¿Gò{öýÿí“ ävõýÿí0H ä(ö)ö;ö}ö|ÁGäð“Gî â¤ÀGò{öýÿí“ ävõýÿí8òä(öýÿífä)ö;ö}öÃGäø†Gîâ°ÁGò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å,öýÿí„: ä,öýÿí… ä)ö;ö}ö„ÄGä†Gî âLÃGò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å,öýÿíä&å)ö;ö}öÀÅGäT…Gî â¸ÄGò{öýÿí“ ävõýÿíä ä(öýÿíзä,öýÿí`0å)ö;ö}öÌÆG䔄Gî âôÅGò{öýÿí“ ävõýÿíˆpä(öýÿí`0å)ö;ö}ö ÈGä4ƒGî ãÇGò{öDõýÿí“ ävõýÿíœêä(öýÿí„: ä,öýÿí… ä)ö;ö}öDÉG䌂Gî âTÈGò{öDõýÿí“ ävõýÿíœêä(öýÿíзä)ö;ö}öPÊGä´€Gî âxÉGò{öýÿí“ ävõýÿíü„ä(öýÿí`0å)ö;ö}ö\ËGä€Gî â„ÊGò{öýÿí“ ävõýÿíÿ ä(öýÿí`0å)ö;ö}öÈÌGä${Gî âËGò{öýÿí“ ävõýÿíHôä(öýÿíзä,öýÿí´)å,öýÿí`0å)ö;ö}öÎGä`zGî âüÌGò{öDõýÿí“ ävõýÿíHôä(öýÿíзä,öýÿí`0å)ö;ö}öpÏGäÌyGî âPÎGò{öDõýÿíÔÏä(öýÿí“ ävõýÿí°’ ä(ö)ö)ö;ö}öÄÐGä@yGî â¤ÏGò{öDõýÿíØä(öýÿí“ ävõýÿí°’ ä(ö)ö)ö;ö}öÒGä¬xGî âøÐGò{öDõýÿíÔÏä(öýÿí“ ävõýÿí Úä(ö)ö)ö;ö}ölÓGä xGî âLÒGò{öDõýÿíØä(öýÿí“ ävõýÿí Úä(ö)ö)ö;ö}ö¨ÔGäTwGî â ÓGò{öýÿí“ ävõýÿíü ä(öýÿíŒ0ä,öýÿífä)ö;ö}ö´ÕGä¬vGî âÜÔGò{öýÿí“ ävõýÿíü ä(öýÿíŒ0ä)ö;ö}ö×Gä\tGî âèÕGò{öDõýÿ픩ä(öýÿí“ ävõýÿíÌ' ä(ö)ö)ö;ö}ö\ØGäÐsGî â<×Gò{öDõýÿíøÜ ä(öýÿí“ ävõýÿíÌ' ä(ö)ö)ö;ö}ö°ÙGä â€Hü HòhHÜHïHä„â îäøHìâ|H`0åHê â$H ä â |ùF4HXHäHHè ðâlHè äêÐ0å˜Hê â¨H ä â |ùF¸HÌHäHHìâlHì <ðHèøHø¸)áH$)HÀ HPHá1T( HìP((HØM(0H058Hȵ6@HLá9HH¸d:ä øHhHlä`HR'æXäÜ›)Háa äˆHP_'æb°> HH ¨H0®)°H`:¸H¨ÀH° ÈHh7(ÐHT4(ØH@1(àH5èH¬6ðH4Õ9øH X:ä Hä¬äHä9æÀ?ä(HÌkÀ?dHÿìä€HïáœHè ˜ö ˜î ÀÈHÐá%ä¤Ü%äÐh äàH ú'æ”…äøHà…'æôj äHü*0æ¸Z ä(HÌk¸Z dHÿìä€HïáœHéî-øLbð¼‰ä á,äDNäØHÌkDNHÿìä0Hïîî-ì*dîHø\HéDÐHdHÌkø HîôHöä¼HìááØHÿôhHHåçäçæááxýâÐ0éåá@`0éæá @ÌáT5ä¨Hä8é ÔHHèðDô:ãHä¬ðDü âèðDæ pHHéDHü:á`ûäåÿáxHé¤Hü:á`ûäæýDHØHÌkøHîhHöä0HìááLHÿôÜHHåçäçæááxýâÐ0éêá@`0éëá @ÎáT5äHä8é HH„H çDô:âtHääæDü â çDæ äHŒHé¸Hü:áÔíäêÿáìHéHü:áÔíäëýÔ HLHÌkøˆHîÜHöä¤HìááÀHÿôPHxHåçäçæááxýâÐ0éÑá@`0éÒá@nâläHä8é ¼HèH¼èDô:â¬èDäéDü H HðHé Hü:áäÑÿáP H2€è| Hüé¨ Hü:áîäÒý#HÜ HÌkø!Hîl!Höä4!HìááP!Hÿôà!H"HåçäçæááxýâÐ0éÖá@`0é×á@pâlä "Hä8é L"Hx"H¼èDô:â¬èDäéDü #H€"H2€è¬"HüéØ"Hü:áîäÖÿá #H2€è8#Hüéd#Hü:áîä×ýL&H˜#HÌkøÔ#Hî($Höäð#Hìáá $Hÿôœ$HÄ$HåçäçæááxýâÐ0éÛá@`0éÜá@râläÜ$Hä8é %H4%H¼èDô:â¬èDäéDü À%H<%H2€èh%Hüé”%Hü:ápäÛÿáÈ%H2€èô%Hüé &Hü:áîäÜý)HT&HÌkø&Hîä&Höä¬&HìááÈ&HÿôX'H€'HåçäçæááxýâÐ0éàá@`0éáá@tâlä˜'Hä8é Ä'Hð'H¼èDô:â¬èDäéDü |(Hø'H2€è$(HüéP(Hü:áX-äàÿá„(H2€è°(HüéÜ(Hü:áîäáýÄ+H)HÌkøL)Hî )Höäh)Hìáá„)Hÿô*H<*HåçäçæááxýâÐ0éåá@`0éæá@vâläT*Hä8é €*H¬*H¼èDô:â¬èDäéDü 8+H´*H2€èà*Hüé +Hü:áLbäåÿá@+H2€èl+Hüé˜+Hü:áîäæý€.HÌ+HÌkø,Hî\,Höä$,Hìáá@,HÿôÐ,Hø,HåçäçæááxýâÐ0éêá@`0éëá@yâlä-Hä8é <-Hh-H¼èDô:â¬èDäéDü ô-Hp-H2€èœ-HüéÈ-Hü:á\-äêÿáü-H2€è(.HüéT.Hü:áîäëý<1Hˆ.HÌkøÄ.Hî/Höäà.Hìááü.HÿôŒ/H´/HåçäçæááxýâÐ0éïá@`0éðá@}âläÌ/Hä8é ø/H$0H¼èDô:â¬èDäéDü °0H,0H2€èX0Hüé„0Hü:á(^-äïÿá¸0H2€èä0Hüé1Hü:áîäðýø3HD1HÌkø€1HîÔ1Höäœ1Hìáá¸1HÿôH2Hp2HåçäçæááxýâÐ0éôá@`0éõá@€âläˆ2Hä8é ´2Hà2H¼èDô:â¬èDäéDü l3Hè2H2€è3Hüé@3Hü:á`ûäôÿát3H2€è 3HüéÌ3Hü:áîäõýˆ6Há4HÌkø<4Hî4HöäX4Hìáát4Hÿô5H,5HåçäçæááxýâÐ0éùá@`0éúá@‚âläD5Hä8é p5Hœ5H çDô:âtHääæDü ü5H¤5HéÐ5Hü:áÔíäùÿá6H2€è06Hüé\6Hü:áîäúý9H6HÌkøÌ6Hî 7Höäè6Hìáá7Hÿô”7H¼7HåçäçæááxýâÐ0éþá@`0éÿá@„âläÔ7Hä8ê 8H,8H¼èDô:â¬èDäéDü Œ8H48Hé`8Hü:áäþÿá”8H2€èÀ8Hüéì8Hü:ápäÿýÔ;H 9HÌkø\9Hî°9Höäx9Hìáá”9Hÿô$:HL:HåçäçæááxýâÐ0éá@`0éá@†âläd:Hä8é :H¼:H¼èDô:â¬èDäéDü H;HÄ:H2€èð:Hüé;Hü:áîäÿáP;H2€è|;Hüé¨;Hü:ápäý>HÜ;HÌkøH€=H2€è¬=HüéØ=Hü:ápäÿá >H2€è8>Hüéd>Hü:ápä ýLAH˜>HÌkøÔ>Hî(?Höäð>Hìáá ?Hÿôœ?HÄ?HåçäçæááxýâÐ0é á@`0éá@ŠâläÜ?Hä8é @H4@H¼èDô:â¬èDäéDü À@H<@H2€èh@Hüé”@Hü:áX-ä ÿáÈ@H2€èô@Hüé AHü:ápäýDHTAHÌkøAHîäAHöä¬AHìááÈAHÿôXBH€BHåçäçæááxýâÐ0éá@`0éá@Œâlä˜BHä8é ÄBHðBH¼èDô:â¬èDäéDü |CHøBH2€è$CHüéPCHü:áLbäÿá„CH2€è°CHüéÜCHü:ápäýÄFHDHÌkøLDHî DHöähDHìáá„DHÿôEHá@`0é?á @$áläàâHä8é ãH8ãH¼èDô:â¬èDäéDü ÄãH@ãH2€èlãHüé˜ãHü:áLbä>ÿáÌãHéøãHü:áä?ý´æH,äHÌkøhäHî¼äHöä„äHìáá äHÿô0åHXåHåçäçæááxýâÐ0éCá@`0éDá @'áläpåHä8é œåHÈåH¼èDô:â¬èDäéDü TæHÐåH2€èüåHüé(æHü:á\-äCÿá\æHéˆæHü:áäDýDéH¼æHÌkøøæHîLçHöäçHìáá0çHÿôÀçHèçHåçäçæááxýâÐ0éHá@`0éIá @+álåèHä8é ,èHXèH¼èDô:â¬èDäéDü äèH`èH2€èŒèHüé¸èHü:á(^-äHÿáìèHééHü:áäIýÔëHLéHÌkøˆéHîÜéHöä¤éHìááÀéHÿôPêHxêHåçäçæááxýâÐ0éMá@`0éNá @.áläêHä8é ¼êHèêH¼èDô:â¬èDäéDü tëHðêH2€èëHüéHëHü:á`ûäMÿá|ëHé¨ëHü:áäNÿáÜëHÌkøìHîlìHöä4ìHìááPìHÿôàìHíHåçäçæááxýâÐ0éRá@`0éSá @0álä íHä8é LíHxíH çDô:âtHääæDü ØíH€íHé¬íHü:áÔíäRÿáàíH2€è îHüé8îHü:áäSÿát ätîHh™æ ¬'ŒîHPï!ä á!¤îH”Qä((ää´îHÌkðîHÿìä ïHïá(ïHÿåî-ðäQä t*(ØïHÜv ädïHÌkÜv  ïHÿìä¼ïHïîî-ì\ðHpäèïHÌkp$ðHÿìä@ðHä ˜çí ˜î\ä¸å-„ðHX«|ðHè¡#ä\ž#ä‚ôT”ðHPœðH`µ)¤ðHŒ“)¬ðHôŒ)´ðH´)¼ðH¨&ÄðH°#ÌðHpÔðH4ÜðH¨^(äðHtZ(ìðH`W(ôðH"5üðH0±6ñHìÛ9 ñHX_:äØH,ñH°ü$ñH`Ã$ä‚0¾$´ñH˜U<ñH0DñH¼)LñH´—)TñHÔ)\ñH\„)dñH€-lñH*tñH¼|ñHPi(„ñHe(ŒñHb(”ñH¨'5œñHX¿6¤ñH<ç9¬ñH¨j:äpHä„e äÄñHÌk„e áòHÿìäòHïá8òHè ˜ìTòHè8oêpòHÿäîðdäœòH†æÀòHì¸òHHÁ!ä0·!ä°VäÐòH ®êØ.伿ä€/äüòH˜êXh äóHÔªâ<óHÀä0óHªêD} äLóH¬›æ(°ädóHÄ4æ¤ä|óHÌk¤¸óHÿìäÔóHä|JçáðóHè|Jì ôHè|Jÿæ@ôHì³ä8ôH¤d9æÌ7äPôHÌkÌ7ŒôHÿìä¨ôHä ˜çíX-îÄaäÔôHðæì$äìôH¨ë'æÀäõHDð-ëŠ ä õH|ùFæ&(@8õHà¸F¬÷H@õHÌk(@|õHîÐõHöä˜õHìáá´õHÿôDöHlöHåçäçæááxýâ`0éÿá@Ð0êá @àáT5ä„öHä8é °öHìöHð¶Fô:âÜöHä´¶Fü âð¶Fæ L÷HôöHé ÷Hü:á`ûäÿÿáT÷Hé€÷Hü:á`ûåý úH´÷HÌk(@ð÷HîDøHöä øHìáá(øHÿô¸øHàøHåçäçæááxýâ`0éá@Ð0éá @âáT5äøøHä8é $ùH`ùHèÑFô:âPùHä¬ÑFü âèÑFæ ÀùHhùHé”ùHü:áÔíäÿáÈùHéôùHü:áÔíäý°üH(úHÌk(@dúHî¸úHöä€úHìááœúHÿô,ûHTûHåçäçæááxýâ`0é‡á@Ð0éˆá @RálälûHä8é ˜ûHÄûHŒ¸Fô:â|¸Fäà¸Fü $üHÌûHéøûHü:áä‡ÿá,üH2€èXüHüé„üHü:áîäˆýlÿH¸üHÌk(@ôüHîHýHöäýHìáá,ýHÿô¼ýHäýHåçäçæááxýâ`0éŒá@Ð0éá @TáläüýHä8é (þHTþHŒ¸Fô:â|¸Fäà¸Fü àþH\þH2€èˆþHüé´þHü:áîäŒÿáèþH2€èÿHüé@ÿHü:áîäý(ItÿHÌk(@°ÿHîIöäÌÿHìááèÿHÿôxI Iåçäçæááxýâ`0é‘á@Ð0é’á @Válä¸Iä8é äIIŒ¸Fô:â|¸Fäà¸Fü œII2€èDIüépIü:ápä‘ÿá¤I2€èÐIüéüIü:áîä’ýäI0IÌk(@lIîÀIöäˆIìáá¤Iÿô4I\Iåçäçæááxýâ`0é–á@Ð0é—á @XálätIä8é  IÌIŒ¸Fô:â|¸Fäà¸Fü XIÔI2€éIüé,Iü:áX-ä–ÿá`I2€èŒIüé¸Iü:áîä—ý IìIÌk(@(Iî|IöäDIìáá`IÿôðIIåçäçæááxýâ`0é›á@Ð0éœá @Zálä0Iä8é \IˆIŒ¸Fô:â|¸Fäà¸Fü II2€è¼IüéèIü:áLbä›ÿáI2€èHIüétIü:áîäœý\ I¨IÌk(@äIî8IöåIìááIÿô¬IÔIåçäçæááxýâ`0é á@Ð0é¡á @]áläìIä8é  ID IŒ¸Fô:â|¸Fäà¸Fü Ð IL I2€èx Iüé¤ Iü:á\-ä ÿáØ I2€è Iüé0 Iü:áîä¡ý Id IÌk(@  Iîô Iöä¼ IìááØ Iÿôh I Iåçäçæááxýâ`0é¥á@Ð0é¦á @aálä¨ Iä8éÔ Iá IŒ¸Fô:â|¸Fäà¸Fü Œ I I2€è4 Iüé` Iü:á(^-ä¥ÿá” I2€èÀ Iüéì Iü:áîä¦ýÔI IÌk(@\ Iî° Iöäx Iìáá” Iÿô$ILIåçäçæááxýâ`0éªá@Ð0é«á @dálädIä8é I¼IŒ¸Fô:â|¸Fäà¸Fü HIÄI2€èðIüéIü:á`ûäªÿáPI2€è|Iüé¨Iü:áîä«ýdIÜIÌk(@IîlIöä4IìááPIÿôàIIåçäçæááxýâ`0é¯á@Ð0é°á @fálä Iä8é LIxIèÑFô:âPùHä¬ÑFü ØI€Ié¬Iü:áÔíä¯ÿáàI2€è Iüé8Iü:áîä°ýôIlIÌk(@¨IîüIöäÄIìááàIÿôpI˜Iåçäçæááxýâ`0é´á@Ð0éµá @hálä°Iä8é ÜIIŒ¸Fô:â|¸Fäà¸Fü hIIé<Iü:áä´ÿápI2€èœIüéÈIü:ápäµý°IüIÌk(@8IîŒIöäTIìáápIÿôá I(Iåçäçæááxýâ`0é¹á@Ð0éºá @jálä@Iä8é lI˜IŒ¸Fô:â|¸Fäà¸Fü $I I2€èÌIüéøIü:áîä¹ÿá,I2€èXIüé„Iü:ápäºýlI¸IÌk(@ôIîHIöäIìáá,Iÿô¼IäIåçäçæááxýâ`0é¾á@Ð0é¿á @láläüIä8é (ITIŒ¸Fô:â|¸Fäà¸Fü àI\I2€èˆIüé´Iü:ápä¾ÿáèI2€èIüé@Iü:ápä¿ý(ItIÌk(@°IîIöäÌIìááèIÿôxI Iåçäçæááxýâ`0éÃá@Ð0éÄá @nálä¸Iä8é äIIŒ¸Fô:â|¸Fäà¸Fü œII2€èDIüépIü:áX-äÃÿá¤I2€èÐIüéüIü:ápäÄýäI0IÌk(@lIîÀIöäˆIìáá¤Iÿô4I\Iåçäçæááxýâ`0éÈá@Ð0éÉá @pálätIä8é  IÌIŒ¸Fô:â|¸Fäà¸Fü XIÔI2€éIüé,Iü:áLbäÈÿá`I2€èŒIüé¸Iü:ápäÉý "IìIÌk(@( Iî| IöäD Iìáá` Iÿôð I!Iåçäçæááxýâ`0éÍá@Ð0éÎá @sálä0!Iä8é \!Iˆ!IŒ¸Fô:â|¸Fäà¸Fü "I!I2€è¼!Iüéè!Iü:á\-äÍÿá"I2€èH"Iüét"Iü:ápäÎý\%I¨"IÌk(@ä"Iî8#Iöå#Iìáá#Iÿô¬#IÔ#Iåçäçæááxýâ`0éÒá@Ð0éÓá @wáläì#Iä8é $ID$IŒ¸Fô:â|¸Fäà¸Fü Ð$IL$I2€èx$Iüé¤$Iü:á(^-äÒÿáØ$I2€è%Iüé0%Iü:ápäÓý(Id%IÌk(@ %Iîô%Iöä¼%IìááØ%Iÿôh&I&Iåçäçæááxýâ`0é×á@Ð0éØá @zálä¨&Iä8éÔ&Iá'IŒ¸Fô:â|¸Fäà¸Fü Œ'I'I2€è4'Iüé`'Iü:á`ûä×ÿá”'I2€èÀ'Iüéì'Iü:ápäØý¨*I (IÌk(@\(Iî°(Iöäx(Iìáá”(Iÿô$)IL)Iåçäçæááxýâ`0éÜá@Ð0éÝá @|áläd)Iä8é )I¼)IèÑFô:âPùHä¬ÑFü *IÄ)Iéð)Iü:áÔíäÜÿá$*I2€èP*Iüé|*Iü:ápäÝý8-I°*IÌk(@ì*Iî@+Iöä+Iìáá$+Iÿô´+IÜ+Iåçäçæááxýâ`0éáá@Ð0éâá @~áläô+Iä8é ,IL,IŒ¸Fô:â|¸Fäà¸Fü ¬,IT,Ié€,Iü:áäáÿá´,I2€èà,Iüé -Iü:áX-äâýô/I@-IÌk(@|-IîÐ-Iöä˜-Iìáá´-IÿôD.Il.Iåçäçæááxýâ`0éæá@Ð0éçá @€álä„.Iä8é °.IÜ.IŒ¸Fô:â|¸Fäà¸Fü h/Iä.I2€è/IüéIöå>Iìáá>Iÿô¬>IÔ>Iåçäçæááxýâ`0éá@Ð0éá @áläì>Iä8é ?ID?IŒ¸Fô:â|¸Fäà¸Fü Ð?IL?I2€èx?Iüé¤?Iü:á`ûäÿáØ?I2€è@Iüé0@Iü:áX-äýìBId@IÌk(@ @Iîô@Iöä¼@IìááØ@IÿôhAIAIåçäçæááxýâ`0é á@Ð0é á @’álä¨AIä8éÔAIáBIèÑFô:âPùHä¬ÑFü `BIBIé4BIü:áÔíä ÿáhBI2€è”BIüéÀBIü:áX-ä ý|EIôBIÌk(@0CIî„CIöäLCIìááhCIÿôøCI DIåçäçæááxýâ`0éá@Ð0éá @”álä8DIä8é dDIDIŒ¸Fô:â|¸Fäà¸Fü ðDI˜DIéÄDIü:áäÿáøDI2€è$EIüéPEIü:áLbäý8HI„EIÌk(@ÀEIîFIöäÜEIìááøEIÿôˆFI°FIåçäçæááxýâ`0éá@Ð0éá @–áläÈFIä8é ôFI GIŒ¸Fô:â|¸Fäà¸Fü ¬GI(GI2€èTGIüé€GIü:áîäÿá´GI2€èàGIüé HIü:áLbäýôJI@HIÌk(@|HIîÐHIöä˜HIìáá´HIÿôDIIlIIåçäçæááxýâ`0éá@Ð0éá @˜álä„IIä8é °IIÜIIŒ¸Fô:â|¸Fäà¸Fü hJIäII2€èJIüéèLJèâpêü>ä@ Jä Jãá` J˜Rä  Jp J˜RÜ Jÿèä Jä Jäã@ Jì â@ J äD Jè4 Jì â@ Jð Jêì J€ äp Jæ€ ˆ Jä â ☠Jæä´ JïáÐ JèLbøœBì” J((åü Jâp J((á Jäâ â$ Jæä@ JäTDçá\ JèLbìx JèTDøœBì<JÀ~ä¤ Jâ ü JÀ~¼ Jäâ âÌ Jæäè JäTDçáJèLbì JèTDøœBìäJÄô äLJâ ¤ JÄô dJè âtJæäJïá¬JèLbìÈJÿäœBðü>äôJ@ Jâ¼JP)ä Jâ  JP)$Jâ4â â4JæâdJ„ èŒJèâpê„ ä4Jä„JãáTJ˜Rä”JdJ˜RÐJÿèä JäüJäã4Jì â4J ä8Jè(Jì â4JðüJê|J°¶ädJæ°¶èâ¤JØwäŒJâdJØwð„ ä´J4JâäJX%äÌJâ JX%è0â4J 3 äôJâ ÌJ 3 Jä,â âJæâLJìPè¼JèâpêìPäJälJãá<J˜Rä|JLJ˜R¸JÿèäôJääJäãJì âJ ä JèJì âJðäJê¬J€ äLJæ€ dJäâ âtJæäJïíœBìJ¸pä¼Jâ LJ¸pÔJè âäJæåJäœBçÿáìPä,JJâ\JtùäDJâôJtùè(â„JìñälJâDJìñè$â¬Jˆvä”Jâ lJˆvTDâ âJ”ä¼Jâ ”J”ÔJââ âäJæâJû èÔJèâpêû ääJä4JãáJ˜RäDJJ˜R€Jÿèä¼Jä¬JäãäJì âäJ äèJèØJì âäJð¬JêtJØèäJæØè,Jä â â<JæäXJïí4íIìœJÄŒä„Jâ JÄŒ,JäâÄJpä¬Jâ „Jp,JäâìJ¬‡äÔJâ ¬J¬‡,Jìû äüJäJâ„JáªäJâ¼Jáª,Jäâ â<Jæ âLJäähJïí4íIìðJ óå”JâJ óá¬Jââ â¼JæâìJøÛèxJèâpêøÛä¼Jä JãáÜJ˜RäJìJ˜RXJÿèä”Jä„Jäã¼Jì â¼J äÀJè°Jì â¼Jð„JêhJ`äìJæ`Jäâ âJæä0JïáLJèœBøTDìØJü äxJâ ìJü Jè â Jæä¼JäœBçíœBðøÛäèJ¼JâpJiåJâ ”JiJäâ â(Jæ â8JääTJïíœBìJØ“ä€Jã JØ“˜Jä ââÈJ¨ò éJèpæ J¨ò ä˜JäèJãá¸J˜RäøJÈJ˜R4JÿèäpJä`Jäã˜Jì â˜J äœJèŒJì â˜Jð`JêÈJè[äÈJæè[àJè âðJæâ J< è˜Jèâpê< äðJä@JãáJ˜RäPJ J˜RŒJÿèäÈJä¸JäãðJì âðJ äôJèäJì âðJð¸Jê8J`ä Jæ`Jä â`Jü äHJâ Jü JäâˆJè äpJâHJè èâ°JÀ‚ä˜Jâ pJÀ‚œBì< äÀJðJâðJ±äØJâ ÈJ±Øfíe åJâØJáe ØfèˆJ€ ä(Jâ €J€ @Jäâ âPJæälJïíœBìøJ¸pä˜Jâ (J¸p°Jäâ âÀJæäÜJäœBçý J` äJâ ˜J` œB옗ä0JäJâ`J˜± äHJâ ¼J˜± œBä\âˆJÜ(äpJâ HJÜ(TDäXâ°JüÏä˜Jâ pJüÏTDäTâØJ´Ð äÀJâ ˜J´Ð TDäPâHJ€ äèJâÀJ€ áJäLâ âJæä,JïíœBì¸J¸päXJâ èJ¸ppJäHâ â€JæäœJäœBçýàJ¨äÈJâXJ¨èDâ J¨n äðJâÈJ¨n è@â0 J¤ ä JâðJ¤ è<âX J`kä@ Jâ J`kè9†JŒ†äh Jâ@ JŒ†è8⨠Jì”ä Jâ h Jì”TDä4âÐ JP„ä¸ Jâ JP„è0âø J”ƒäà Jâ ¸ J”ƒTDä,â !JØ› ä!Jâ à JØ› TDä(âH!Jü ä0!Jâ!Jü è$âp!J@äX!Jâ0!J@è â˜!J¬Qä€!Jâ X!J¬QTDäâÀ!J(Àä¨!Jâ€!J(Àèâè!J”e äÐ!Jâ¨!J”e èâ"Jl äø!Jâ Ð!Jl TDäâ8"JH ä "Jâ ø!JH TDä â`"Jt-äH"Jâ "Jt-TDäâˆ"Jlbäp"Jâ H"JlbTDäâÐ(Jd‡ ä˜"Jâ p"Jd‡ °"Jè âÀ"Jæ,âð"J°Ž è (Jèâpê°Ž äÀ"Jä#J ãáà#J˜Rä #Jð"J˜R\#Jÿèä˜#Jäˆ#JäãÀ"Jì âÀ"J äÄ#Jè´#Jì âÀ"Jðˆ#Jê$J ’äð#Jæ ’è(â0$Jbä$Jâ ð#JbœBä$âX$J@‚ä@$Jâ $J@‚œBä â€$JÈÎ äh$Jâ @$JÈÎ œBäâ¨$J` ä$Jâ h$J` œBäâð'Jèlä¸$Jâ $JèlÐ$Jäâ âà$Jæâ%JŒ: èÀ'JèâpêŒ: äà$Jä0%Jãâ&J˜Rä@%J%J˜R|%Jÿèä¸%Jä¨%Jäãà$Jì âà$J ää%JèÔ%Jì âà$Jð¨%Jê°'J,ä&Jæ,(&JäââX&J€ìè€'Jèâpê€ìä(&Jäx&JãáH'J˜Räˆ&JX&J˜RÄ&Jÿèå'Jäð&Jäã(&Jì â(&J ä,'Jè'Jì â(&Jðð&Jêp'JÈóäX'JæÈóèâ˜'Jd5ä€'JâX'Jd5ð€ìä¨'J(&JâØ'J€íäÀ'Jâ &J€í´OìŒ: äè'Jà$Jâ(J§å(Jâ¸$J§èâ@(J”e ä((Jã(J”e è âh(JlbäP(Jâ ((JlbœBäâ(JYäx(JâP(JYèâ¸(J¼ ä (Jâ x(J¼ œBì°Ž äÈ(JÀ"Jæ,+äà(JDíIâ)Jè)Jì âTDæ0)JèTDÿæx+J´æ\)Jh)Jæ âx)Jæâ¨)J„› èH+Jèâ@ê„› äx)JäÈ)Jãá˜*J˜RäØ)J¨)J˜R*JÿèäP*Jä@*Jäãx)Jì âx)J ä|*Jèl*Jì âx)Jð@*JêÀ*J¨ä¨*Jæ¨èâè*JDF äÐ*Jâ¨*JDF è â+J0„ äø*JâÐ*J0„ èâ8+Jà{ä +Jâ ø*Jà{ ˜äâ`+JT äH+Jâ +JT ð„› äp+Jx)Jâ”+Jèy äˆ+JPÏIêÔy ä¤+J°+Jæ âà+Jô.èh;Jèâpêô.ä°+Jå,J ãáÐ,J˜Rä,Jà+J˜RL,Jÿèäˆ,Jäx,Jäã°+Jì â°+J ä´,Jè¤,Jì â°+Jðx,Jêè/J K äà,Jæ K ø,Jäâ â-Jæ â8-J, è(/Jèâpê, ä-JäX-Jãá(.J˜Räh-J8-J˜R¤-Jÿèäà-JäÐ-Jäã-Jì â-J ä .Jèü-Jì â-JðÐ-JêP.JxÚä8.JæxÚœBäâx.Jبä`.Jâ8.Jبèâ/J¬b äˆ.Jâ `.J¬b  .Jäâæ¸.Jä6ä Ð.Jh± .Jì è.JTj .Jë /J°¯ .JîàA .JèÐ/J¼Ô ä(/Jâ ˆ.J¼Ô @/JèæX/JäD.ä p/J¼] @/Jìˆ/JáJ@/Jê  /J¨ÿ @/Jê ¸/Jtk@/Jî¬@/Jì, äà/J-Jâ0Jàºäø/Jâ à,Jàºø,Jäâ 9J0åä 0Jâ ø/J0å80Jäâ âH0Jæ âx0J¸Ôèð8Jèâpê¸ÔäH0Jä˜0Jãáh1J˜Rä¨0Jx0J˜Rä0Jÿèä 1Jä1JäãH0Jì âH0J äL1Jè<1Jì âH0Jð1Jê¸8J D äx1Jæ D 1Jäâ â 1JæâÐ1JŒòèˆ8JèâpêŒòä 1Jäð1JãáÀ2J˜Rå2JÐ1J˜R<2Jÿèäx2Jäh2Jäã 1Jì â 1J ä¤2Jè”2Jì â 1Jðh2Jêè2J@šäÐ2Jæ@šø,Jä âP8J¼Häø2Jâ Ð2J¼H3Jäâ â 3JæâP3JH èP4JèâpêH ä 3Jäp3Jãá@4J˜Rä€3JP3J˜R¼3Jÿèäø3Jäè3Jäã 3Jì â 3J ä$4Jè4Jì â 3Jðè3Jê88JØÝåP4JæØÝáh4Jè âx4Jæâ¨4J” è8Jèâpê” äx4JäÈ4J ãá˜5J˜RäØ4J¨4J˜R5JÿèäP5Jä@5Jäãx4Jì âx4J ä|5Jèl5Jì âx4Jð@5JêÀ5Jø‡ä¨5Jæø‡èâè5J… äÐ5Jâ ¨5J… ø,Jäâ6Jàºäø5Jâ Ð5Jàºø,Jäâ¨7JLIä 6Jâ ø5JLI86Jä â âH6Jæâx6JØ*èx7JèâpêØ*äH6Jä˜6Jãáh7J˜Rä¨6Jx6J˜Rä6Jÿèä 7Jä7JäãH6Jì âH6J äL7Jè<7Jì âH6Jð7Jê7JÀ'äx7JæÀ'ø,JìØ*ä 7JH6JâÐ7J´óä¸7Jâ 6J´ó86Jäâø7J0åäà7Jâ ¸7J0å80Jäâ 8J¤­ä8Jâ à7J¤­80Jì” ä08Jx4JæH äH8J 3Jâx8Jvä`8Jâ ø2Jv3Jäâ 8Jàºäˆ8Jâ `8Jàºø,JìŒòä°8J 1Jâà8JáòåÈ8Jâx1Jáòáø,Jäâ9JÀ'äð8Jâ È8JÀ'ø,Jì¸Ôä9JH0JâH9J¤­ä09Jâ 0J¤­80Jäâ;J˜û äX9Jâ 09J˜û p9Jä â â€9Jæâ°9Jç èØ:Jèâpêç ä€9JäÐ9Jãá :J˜Räà9J°9J˜R:JÿèäX:JäH:Jäã€9Jì â€9J ä„:Jèt:Jì â€9JðH:JêÈ:J… ä°:Jæ… ø,Jäâð:JàºäØ:Jâ °:Jàºø,Jìç å;J€9Jâ0;Jø‡ä;JâX9Jø‡èâX;J|¿ ä@;Jâ ;J|¿ ø,Jäâ>JL äh;Jâ @;JL €;Jèæ˜;Jäì ä °;J`å €;Jì È;J0w€;Jê à;J°í €;Jêø;Já€;JêJ°+Jâ(@J¬å0>J<>Jæâl>JD²èø?JèâpêD²ä<>JäŒ>Jãá\?J˜Räœ>Jl>J˜RØ>Jÿèä?Jä?Jäã<>Jì â<>J ä@?Jè0?Jì â<>Jð?Jêè?JŸäl?J柄?Jäâ â”?Jæä°?JïáÌ?Jÿä›ì@JL½ äø?Jâ l?JL½ ˜ìD²ä @J<>Jâ$ªJ”å8@J@@Jââp@J”éèAJèâpê”å@@Jä@Jãá`AJ˜Rä @Jp@J˜RÜ@JÿèäAJäAJäã@@Jì â@@J äDAJè4AJì â@@JðAJêˆAJLzäpAJæLzè â°AJxå˜AJâpAJxéâØAJ„%äÀAJâ ˜AJ„%X-äâ ªJLþäèAJâÀAJLþáBJè âBJæâ@BJP²èÜ©JèâpêP²äBJä`BJ4ãá0CJ˜RäpBJ@BJ˜R¬BJÿèäèBJäØBJäãBJì âBJ äCJèCJì âBJðØBJêÐEJô‚ä@CJäô‚XCJèâˆCJÜÚ è EJèâpêÜÚ äXCJä¨CJ ãáxDJ˜Rä¸CJˆCJ˜RôCJÿèä0DJä DJäãXCJì âXCJ ä\DJèLDJì âXCJð DJê DJ›äˆDJä›èâÈDJfä°DJˆDJfè âðDJ8íäØDJâ°DJ8íèâEJÜAåEJâØDJÜAèâ@EJ· ä(EJáEJ· èâhEJxÉ äPEJ(EJxÉ èâEJdÒäxEJâPEJdÒèâ¸EJÈ ä EJâxEJÈ ðÜÚ äÈEJXCJâP™JÜäàEJ@CJÜøEJä â âFJæâ 8FJL̘Jèà˜Jä @áp@™JæLäFJäXFJãá"´GJôOüFJhFJ8FJôO¤FJÿèäÐFJìãFJøìFJì âFJèGJ8FJôO@GJÿèälGJìãFJìˆGJèìFJø¤GJê âFJ ädHJ˜RäÄGJ8FJ˜RáHJÿèä,HJä¤GJäãFJìHHJèìFJø¤GJêIJh…ätHJ8FJh…°HJâÿèäÜHJìááFJHêøHJèìFJøœBìàIJ\ˆ ä$IJ8FJ\ˆ `IJâÿèäŒIJìááFJDê¨IJèìFJìÄIJèœBøØfìtJJ¨'äðIJ8FJ¨',JJâÿèäXJJäœBäááFJ@öìFJì$KJT_ ä„JJ8FJT_ ÀJJâÿèäìJJìááFJ<êKJèìFJøøEJìðKJà¿ ä4KJ8FJà¿ pKJâÿèäœKJìááFJ8ê¸KJèìFJìÔKJèLbø8oìôLJhçåLJ8FJhçê L­J€LªJ?ê d­J¨öLªJ@ê |­JŒ! LªJAê ”­J¤õLªJBê ¬­J¤d LªJCê Ä­JL`LªJDê Ü­JXiLªJEê ô­JÄôLªJFê ®JpË LªJGê $®JÐ LªJHê <®J`ÒLªJIê T®J´PLªJJê l®JHÇLªJKê „®Jø“LªJLê œ®JÈ‹ LªJMê ´®Jœu LªJNêÌ®JøáLªJOêä®Jt¾áLªJPêü®JËáLªJQê¯JËáLªJRê ,¯JXTLªJSê D¯JULªJTê \¯Jl²LªJUê t¯JT®LªJVîÍ LªJWèH°JÌz 䜯JäÌz دJááÿåäô¯JïDá°Jè4íIì,°JèTDøTDêt²J`åX°Jd°Jæ ât°Jæâ¤°JŒ"éD²Jèâ@êŒ"åt°JäİJãá”±J˜RäÔ°J¤°J˜R±JÿèäL±Jä<±Jäãt°Jì ât°J äx±Jèh±Jì ât°Jð<±Jê¼±JL! 䤱JæL! |Jââä±JØ^ä̱Jâ ¤±JØ^|Jâ â ²JÔØäô±Jâ ̱JÔØ|Jââ4²JhŒä²Jâô±JhŒèâ\²JT äD²Jâ²JT ðŒ"ål²Jt°Jâ¹J”A䄲J²Jæ â ²JæäâвJx èà¸Jèâ@êx ä ²Jäð²J ãáÀ³J˜Rå³JвJ˜R<³Jÿèäx³Jäh³Jäã ²Jì â ²J 䤳J蔳Jì â ²Jðh³JꔵJôäгJæôè³JäÌââ´Jü¬è|µJè@æвJü¬äè³Jä8´JãáµJ˜RäH´J´J˜R„´JÿèäÀ´Jä°´Jäãè³Jì âè³J äì´JèÜ´Jì âè³Jð°´JêDµJ4® äµJæ4® 0µJè êälµJ´äTµJâµJ´ðhúä|µJâTµJhú츷JÄ+䤵Jâ гJÄ+¼µJä´ââìµJR è ·Jè@æвJR ä¼µJä ¶JãáܶJ˜Rä¶JìµJ˜RX¶Jÿèä”¶Jä„¶Jäã¼µJì â¼µJ äÀ¶Jè°¶Jì â¼µJð„¶Jê·J4® äì¶Jæ4® ·Jè êä@·J„ ä(·Jì¶J„ èâh·JبåP·Jâ(·Jبí·JDÏ äx·JP·JDÏ èæÌ.ä ·Jâx·JÌ.ìô·JHäÈ·Jâ ¤µJHà·Jä4â €ê@ä0¸JtÆ ä¸Jâ È·JtÆ ¸Jäâ êäX¸J  ä@¸Jâ¸J  è‸J8ßäh¸Jâ@¸J8ßè ⨸Jxtä¸Jâh¸JxtèâиJØv丸Jâ¸JØvèâø¸J ûäà¸J⸸J ûðx ä¹J ²J⌾J˜ ä ¹J,¹Jæâ\¹JÜ~è\¾JèâpêÜ~ä,¹Jä|¹JãáLºJ˜R䌹J\¹J˜RȹJÿèäºJäô¹Jäã,¹Jì â,¹J ä0ºJè ºJì â,¹Jðô¹Jêü»J€åä\ºJæ€åtºJäâ⤺JDnèÌ»JèâpêDnätºJäĺJãá”»J˜RäÔºJ¤ºJ˜R»JÿèäL»Jä<»JäãtºJì âtºJ äx»Jèh»Jì âtºJð<»Jê¼»JôA夻JæôAéâä»Jü@åÌ»J⤻Jü@ñDnäô»JtºJâü½JxKä ¼Jâ \ºJxK$¼Jä ââT¼JÐ è̽JèâpêÐ ä$¼Jät¼JãáD½J˜R䄼JT¼J˜RÀ¼Jÿèäü¼Jäì¼Jäã$¼Jì â$¼J ä(½Jè½Jì â$¼Jðì¼Jêl½J äT½Jæ è┽J Ü ä|½JâT½J Ü èâ¼½Jd䤽Jâ|½Jdèâä½J$¸å̽J⤽J$¸ñÐ äô½J$¼Jâ$¾Jl‚ä ¾Jâ ¼Jl‚èâL¾Jè÷ä4¾Jâ ¾Jè÷tºJäât¾Jà‹ ä\¾Jâ 4¾Jà‹ tºJìÜ~䄾J,¹Jâ¿J j䜾Jä jؾJááÿåäô¾Jä|JçDí|JêÌÈJ -ä ¿J,¿Jæ â<¿Jælâl¿J¨( èÇJèâpê¨( ä<¿J䌿Jãá\ÀJ˜R䜿Jl¿J˜RØ¿JÿèäÀJäÀJäã<¿Jì â<¿J ä@ÀJè0ÀJì â<¿JðÀJê„ÀJÌØålÀJæÌØéhâ¬ÀJéå”ÀJâlÀJéédâÔÀJ, ä¼ÀJâ”ÀJ, è`âüÀJt ääÀJâ¼ÀJt è\â$ÁJü¯ä ÁJâäÀJü¯èXâLÁJ ä4ÁJâ ÁJ èTâtÁJW ä\ÁJâ4ÁJW èPâœÁJüä„ÁJâ\ÁJüèLâìÃJ„ä¬ÁJâ „ÁJ„ÄÁJä4ââôÁJ¤nè¼ÃJèâpê¤näÄÁJäÂJãáäÂJ˜Rä$ÂJôÁJ˜R`ÂJÿèäœÂJäŒÂJäãÄÁJì âÄÁJ äÈÂJè¸ÂJì âÄÁJðŒÂJê ÃJð)äôÂJæð)èâ4ÃJŒ*äÃJâôÂJŒ*èâ\ÃJ@ äDÃJâÃJ@ è â„ÃJD¡älÃJâDÃJD¡èâ¬ÃJ$×ä”ÃJâlÃJ$×èâÔÃJŒ×ä¼ÃJâ”ÃJŒ×ð¤nääÃJÄÁJâÄJìWäüÃJâ¬ÁJìWè0â<ÄJ$iä$ÄJâüÃJ$iè,âdÄJh—äLÄJâ$ÄJh—è(âŒÄJ ó ätÄJâLÄJ ó è$â´ÄJôý äœÄJâtÄJôý è âÜÄJ˜ äÄÄJâœÄJ˜ èâÅJ@– äìÄJâÄÄJ@– èâÇJøVäÅJâ ìÄJøV,ÅJäââ\ÅJÌêèÔÆJèâpêÌêä,ÅJä|ÅJãáLÆJ˜RäŒÅJ\ÅJ˜RÈÅJÿèäÆJäôÅJäã,ÅJì â,ÅJ ä0ÆJè ÆJì â,ÅJðôÅJêtÆJ`èä\ÆJæ`èè âœÆJÜì 䄯Jâ\ÆJÜì èâÄÆJXq䬯Jâ„ÆJXqèâìÆJ0ÃäÔÆJâ¬ÆJ0ÃðÌêäüÆJ,ÅJâ´ÈJ̉ äÇJâ ÅJ̉ ,ÇJèâ\ÇJhT è„ÈJèâpêhT ä,ÇJä|ÇJãáLÈJ˜RäŒÇJ\ÇJ˜RÈÇJÿèäÈJäôÇJäã,ÇJì â,ÇJ ä0ÈJè ÈJì â,ÇJðôÇJêtÈJð ä\ÈJæð èâœÈJá;ä„ÈJâ\ÈJá;ðhT ä¬ÈJ,ÇJæ¨( äÄÈJ<¿Jâ4ÉJDåÜÈJäDáÉJááÿåì|JçDáðÉJá-äDÉJå-€ÉJááÿåäœÉJïDá¸ÉJè ˜êÔÉJÿäØfð æÊJÊJââ8ÊJ é8ËJèâpê åÊJäXÊJãá(ËJ˜RähÊJ8ÊJ˜R¤ÊJÿèäàÊJäÐÊJäãÊJì âÊJ ä ËJèüÊJì âÊJðÐÊJêPËJŒz ä8ËJæŒz ð å`ËJÊJâèÌJáåxËJåá´ËJÿìäÐËJïáìËJèœBìÌJø$ÌJèTDì@ÌJø\ÌJèTDìxÌJø”ÌJèTDì°ÌJøÌÌJÿô|ÕJ˜¤äøÌJ䘤4ÍJÿìäPÍJïá(ÕJèlÍJì â|ÍJæâ ¬ÍJø ¤ÔJè¸ÔJä @ápÕJæø ä|ÍJäÌÍJ ãá"(ÏJôOpÎJÜÍJ¬ÍJôOÎJÿèäDÎJìã|ÍJø`ÎJì â|ÍJèxÎJ¬ÍJôO´ÎJÿèäàÎJìã|ÍJìüÎJè`ÎJøÏJê â|ÍJ äØÏJ˜Rä8ÏJ¬ÍJ˜RtÏJÿèä ÏJäÏJäã|ÍJì¼ÏJè`ÎJøÏJêˆÐJ äèÏJ¬ÍJ $ÐJâÿèäPÐJìáá|ÍJ$êlÐJè`ÎJøœBì8ÑJp’ä˜ÐJ¬ÍJp’ÔÐJâÿèåÑJìáá|ÍJ êÑJè`ÎJøØfìÌÑJ¬ËäHÑJ¬ÍJ¬Ë„ÑJâÿèä°ÑJìáá|ÍJö`ÎJì|ÒJDA äÜÑJ¬ÍJDA ÒJâÿèäDÒJälÍJäáá|ÍJê`ÒJè`ÎJø|PêHÓJ\œäŒÒJ¬ÍJ\œÈÒJâÿèäôÒJìáá|ÍJêÓJè`ÎJì,ÓJè„øIøôIìÜÓJ –äXÓJ¬ÍJ –”ÓJâÿèäÀÓJìáá|ÍJö`ÎJìŒÔJKäâ â>Kæâ H>Kì& ´‡KèȇKä @áp(ˆKæì& ä>Käh>Kãá"Ä?KôO ?Kx>KH>KôO´>Kÿèäà>Kìã>Køü>Kì â>Kè?KH>KôOP?Kÿèä|?Kìã>Kì˜?Kèü>Kø´?Kê â>K ät@K˜RäÔ?KH>K˜R@Kÿèä<@Kä´?Käã>KìX@Kèü>Kø´?KêAKЦ ä„@KH>KЦ À@Kâÿèäì@Kìáá>Köü>KìœAKÐ+ äAKH>KÐ+ TAKâÿèä€AKìáá>Köü>Kì|K„œ ä¬AKH>K„œ èAKâÿèäBKìáá>Kê0BKèü>KøLBKì â\BKæâ ŒBK\ª 4rKè¨{Kä @áp|Kæ\ª ä\BKä¬BKãá"DKôOPCK¼BKŒBKôOøBKÿèä$CKìã\BKø@CKì â\BKèXCKŒBKôO”CKÿèäÀCKìã\BKìÜCKè@CKøøCKê â\BK ä¸DK˜RäDKŒBK˜RTDKÿèä€DKäøCKäã\BKìœDKè@CKøøCKêhEK0då ÈDKŒBK0dáEKâÿèä0EKìáá\BKXêLEKè@CKøLbìüfK÷äxEKŒBK÷´EKâÿèäàEKìáá\BKTêüEKè@CKìŒfKèFKì â(FKæâ XFKà. fKèfKä @áp|fKæà. ä(FKäxFK ãá"ÔGKôOGKˆFKXFKôOÄFKÿèäðFKìã(FKø GKì â(FKè$GKXFKôO`GKÿèäŒGKìã(FKì¨GKè GKøÄGKê â(FK ä„HK˜RääGKXFK˜R HKÿèäLHKäÄGKäã(FKìhHKè GKøÄGKê4IKôØä”HKXFKôØÐHKâÿèäüHKìáá(FK0êIKè GKø|JìØOKÌå DIKXFKÌá€IKâÿèä¬IKìáá(FK,êÈIKè GKøäIKì âôIKæ âJKæâ 4JK^TOKèhOKä @ápÈOKæ^äJKäTJKãá"°KKôOøJKdJK4JKôO JKÿèäÌJKìãJKøèJKì âJKéKK4JKôOKÀ™ d|Kâÿèä|Kìáá>Kê¬|Kèü>KìÈ|Kÿôœ‡K(Š äô|KH>K(Š 0}Kâÿèä\}Kìáá>K êx}Kèü>KìðKè”}Kì â¤}KæâÔ}K¬˜ èÀKèâp꬘ ä¤}Käô}KãáÄ~K˜Rä~KÔ}K˜R@~Kÿèä|~Käl~Käã¤}Kì â¤}K ä¨~Kè˜~Kì â¤}Kðl~Kêì~KTÚäÔ~KæTÚèâK¬½äü~KâÔ~K¬½è â<Kô ä$Kâü~Kô èâ°KpÖäLKâ $KpÖdKäâ âtKæâ¤KÀè€KèâpêÀätKäÄKãᔀK˜RäÔK¤K˜R€KÿèäL€Kä<€KäãtKì âtK äx€Kèh€Kì âtKð<€KêЀKlï 䤀Kælï ¼€Kä â êäø€KœŒäà€K⤀KœŒè â K ÂäKâà€K ÂèâHK¬Ù ä0KâK¬Ù èâpK€äXKâ0K€èâ˜KPn ä€KâXKPn ðÀä¨KtKâØK ûåÀKâLK ûñ¬˜ äèK¤}Kî ‚Kì â‚Kæ âL‚K2èl‡Kèâpê2ä‚Käl‚K ãá<ƒK˜Rä|‚KL‚K˜R¸‚Kÿèäô‚Kää‚Käã‚Kì â‚K ä ƒKèƒKì â‚Kðä‚KêdƒK˜Ó äLƒKæ˜Ó „ëIä⌃K„ïätƒKLƒK„ïðJäâ´ƒK´ô䜃KtƒK´ô$ÓIäâ܃K,A äăKœƒK,A |Jäâ„KÔ* äìƒKăKÔ* œBä✅Kè¾ä„KìƒKè¾,„Käâ â<„Kæâl„K0/ èl…Kèâpê0/ ä<„K䌄Kãá\…K˜R䜄Kl„K˜RØ„Kÿèä…Kä…Käã<„Kì â<„K ä@…Kè0…Kì â<„Kð…Kê„…KXääl…KæXäð0/ ä”…K<„KâÄ…K´¡ä¬…K„K´¡œBäâ\‡Ktü äÔ…Kâ ¬…Ktü ì…Käâ âü…Kæâ,†Kô) è,‡Kèâpêô) äü…KäL†Kãá‡K˜Rä\†K,†K˜R˜†KÿèäÔ†KäĆKäãü…Kì âü…K å‡Kèð†Kì âü…KðĆKêD‡KXää,‡KæXäðô) äT‡Kü…KℇKTÚäl‡KâÔ…KTÚð2䔇K‚Kæì& 䬇K>Kæˆbì؇K>Kä(ââH>KÔb ˆKÿä(ìâåÀåF`ˆKÌäHˆKâð=KÌè∈KóäpˆKâ HˆKó¤}Kì$žä˜ˆK˜KøLbìÌ‘K˜Jå ‹Kp4K˜JáX‹Kâÿèä„‹Kìáá@4K ê ‹Kè$5K켋Kÿ䨋Kì âè‹Kæ âø‹Kæâ (ŒKDpH‘Kè\‘Kä @áp¼‘KæDpäø‹KäHŒKãá"¤KôOìŒKXŒK(ŒKôO”ŒKÿèäÀŒKìãø‹KøÜŒKì âø‹KèôŒK(ŒKôO0Kÿèä\Kìãø‹KìxKèÜŒKø”Kê âø‹K äTŽK˜Rä´K(ŒK˜RðKÿèäŽKä”Käãø‹Kì8ŽKèÜŒKø”KêKìÉädŽK(ŒKìÉ ŽKâÿèäÌŽKìááø‹KêèŽKèÜŒKøØ‹Kì˜K”äK(ŒK”PKâÿèä|Kìááø‹KöÜŒKìHKpRä¨K(ŒKpRäKâÿèäKìááø‹Kê,KèÜŒKÿè0‘KwäXK(ŒKw”KâÿèäÀKìááø‹K êÜKèÜŒKìøKø‘Kè”}KøLbðDpä@‘Kø‹Kæˆbìl‘Kø‹Kä$ââ(ŒKHü ¨‘Kÿä$ìâåÀåF´’K¤û äÜ‘Kp4K¤û ’KâÿèäD’Kìáá@4Kê`’Kè$5Kì|’Kè”}K옒Kè ‚Kÿ耓KŒì äÄ’Kp4KŒì á“Kâÿèä,“Kìáá@4KêH“Kè$5Kìd“Kè”}Kø”}Kì0”K„wä“Kp4K„wÌ“Kâÿèäø“Kìáá@4Kê”Kè$5Kø”}Kìü”KüZä@”Kp4KüZ|”Kâÿè䨔Kìáá@4KêÄ”Kè$5Kìà”Kè”}Kø ‚KìÈ•Ký ä •Kp4Ký H•Kâÿèät•Kìáá@4K ê•Kè$5K쬕Kè”}Kø ‚Kðˆ[ 䨕K@4Kæˆbì–K@4Kä8ââp4Kè¶ @–Kÿä8ìâåÀåFëL7KìX—K| ä–Kä| Ì–Käÿåäè–Kïá—Kø —Kè ˜ê<—Kè ˜øLbìt—K Cäh—KꬠKt ä„—Kät À—KááÿåäÜ—KïDáø—Kè|Jö˜Kì â$˜KæâT˜Kàl è| Kèâpêàl ä$˜Kät˜KãáD™K˜R䄘KT˜K˜RÀ˜Kÿèäü˜Käì˜Käã$˜Kì â$˜K ä(™Kè™Kì â$˜Kðì˜Kêl KÈZäT™KæÈZl™Käâ â|™Kæ ⌙Kæ â¼™K<¤ è< Kèâpê<¤ 䌙KäÜ™KãᬚK˜Räì™K¼™K˜R(šKÿèädšKäTšKä㌙Kì ⌙K äšK耚Kì ⌙KðTšKꔜK¬“会K欓ԚKäâ âäšKæ â›KÛèdœKèâpêÛääšKä4›KãáœK˜RäD›K›K˜R€›Kÿèä¼›K䬛KäãäšKì âäšK äè›KèØ›Kì âäšKð¬›Kê,œKtsäœKætsTDäâTœKdPä<œKâœKdPèâ|œKüˆädœKâ<œKüˆðÛ䌜KäšKâ, Kd䤜Kâ ¼šKd¼œKäâ âÌœKæ âüœKÄèüŸKèâpêÄäÌœKäKãáìK˜Rä,KüœK˜RhKÿèä¤Kä”KäãÌœKì âÌœK äÐKèÀKì âÌœKð”Kê(žK )äüKæ )žKäâ êäÄŸK\@ä8žKâ üK\@PžKäâ„K¬œé€ŸKèâp꬜åPžKä žKãápŸK˜Rä°žK€žK˜RìžKÿèä(ŸKäŸKäãPžKì âPžK äTŸKèDŸKì âPžKðŸK꬟Kly䀟Kæly˜ŸKè ê謜弟KPžKâìŸKääÔŸKâ8žKäèâ KdàäüŸKâÔŸKdàðÄä$ KÌœKâT KXoä< K⤜KXoð<¤ äd KŒ™Kâ” K$îä| KâT™K$îðàl 䤠K$˜Kâ`£KXä¼ KäXø Kááÿåä¡KäœBçDá0¡KøL¡Kø(£Kèh¡Kê âx¡Kæ ⨡KXZèø¢KèâpêXZäx¡KäÈ¡KãᘢK˜R䨡K¨¡K˜R¢KÿèäP¢Kä@¢Käãx¡Kì âx¡K ä|¢Kèl¢Kì âx¡Kð@¢KêÀ¢KÀ‡ä¨¢KæÀ‡èâè¢K°ÚäТKâ ¨¢K°ÚœBäâ£K|äø¢KâТK|ðXZä £Kx¡KâD£KÿäœBìh¥Käp£K|£Kæ$⬣Kœ è8¥Kèâpêœ ä|£KäÌ£KãᜤK˜RäÜ£K¬£K˜R¤KÿèäT¤KäD¤Käã|£Kì â|£K 䀤Kèp¤Kì â|£KðD¤KêؤK¼Û 䬤Kæ¼Û ĤKäâ â0 Käå¥KÜú äè¤K⬤KÜú èâ(¥KøVä¥Kâ è¤KøV,ÅJäâP¥K̉ ä8¥Kâ ¥K̉ ,ÇJìœ ä`¥K|£Kâ\§K läx¥Kä l´¥KááÿåäÐ¥KïDíì¥Kì âü¥Kæâ,¦K0,è,§Kèâpê0,äü¥KäL¦Kãá§K˜Rä\¦K,¦K˜R˜¦KÿèäÔ¦KäĦKäãü¥Kì âü¥K å§Kèð¦Kì âü¥KðĦKêD§KXää,§KæXäð0,äT§Kü¥K⸭Kd äl§Kx§Kæâ¨§KÔÎ舭KèâpêÔÎäx§KäȧKãᘨK˜RäاK¨§K˜R¨KÿèäP¨Kä@¨Käãx§Kì âx§K ä|¨Kèl¨Kì âx§Kð@¨KêÀ¨KÌV䨨KæÌVèâè¨KäШK⨨Kèâ©Kœ| äø¨KâШKœ| èâ8©K\êä ©Kâø¨K\êèâ`©K<• äH©Kâ ©K<• è∩K ~ äp©KâH©K ~ èâ°©KP䘩Kâp©KPèâØ©KteäÀ©K☩KteèãªKTb äè©KâÀ©KTb èâ(ªK¬DäªKâè©K¬DèâPªK8=ä8ªKâªK8=èâxªKÈ ä`ªKâ8ªKÈ è ⬪K|䈪Kâ `ªK| ªKäâæàªK¬»ä¼ªKâ ˆªK¬»ÔªKäâæ«KœéåðªK⼪Kœéá«Käâæ H«K€‚ä$«Kâ ðªK€‚<«Käâæ |«K4]äX«Kâ $«K4]p«Käâæ °«KØ äŒ«Kâ X«KØ ¤«Käâæ ä«KDäÀ«Kâ Œ«KDØ«Käâæ¬KHTäô«Kâ À«KHT ¬KäâæL¬KäÔ ä(¬Kâ ô«KäÔ @¬Käâæ€¬KØ’å\¬Kâ(¬KØ’át¬Käâæ´¬KÈãä¬Kâ \¬KÈ㨬Käâæè¬KH)äĬKâ ¬KH)ܬKäâæ­K”Täø¬Kâ ĬK”T­KäâæP­K¬Ôä,­Kâ ø¬K¬ÔD­Käâçx­Køoä`­Kâ,­Køoèâ ­KP³äˆ­Kâ`­KP³ðÔÎä°­Kx§Kâ´K| äÈ­KÔ­Kæ âä­Kæ â®KÌèè³KèâpêÌää­Kä4®K ãá¯K˜RäD®K®K˜R€®Kÿèä¼®K䬮Käãä­Kì âä­K äè®KèØ®Kì âä­Kð¬®Kê@¯K$ä¯Kæ$,¯Käâ êäh¯KHßäP¯Kâ¯KHßèâ¯K„ äx¯KâP¯K„ èâP±Khä ¯Kâ x¯Kh¸¯Käââè¯K\î è ±Kèâpê\î 丯Kä°KãáذK˜Rä°Kè¯K˜RT°Kÿèä°K䀰Kä㸯Kì ⸯK ä¼°K謰Kì ⸯKð€°Kê±K •äè°Kæ •á±Käâ ⸯKæ8±Køùä ±Kâè°Køùá±Kì\î äH±K¸¯Kâ°³K·å`±Kâ ¯K·áx±Käâ ∱Kæâ¸±KÔ! 耳KèâpêÔ! 䈱KäرKãᨲK˜Räè±K¸±K˜R$²Kÿèä`²KäP²Kä㈱Kì ∱K 䌲Kè|²Kì ∱KðP²KêвKø¾å¸²Kæø¾éâø²K@=äà²Kâ ¸²K@=œBäâ ³Kdå³Kâà²KdáœBä âH³KÔÌ ä0³Kâ³KÔÌ èâp³K4Ÿ äX³Kâ0³K4Ÿ è☳K4*倳KâX³K4*áÔ­KìÔ! 䨳Kˆ±KâسK\P äÀ³Kâ`±K\P èã´KÀäè³KâÀ³KÀðÌä´Kä­Kæô.ä(´K4´Kæ âD´Kæpât´K€ è<¶Kèâpê€ äD´Kä”´KãádµK˜R䤴Kt´K˜Rà´KÿèäµKä µKäãD´Kì âD´K äHµKè8µKì âD´Kð µKꌵK¸øätµKæ¸øèlâ´µKˆn 䜵KâtµKˆn èhâܵK[äĵK✵K[èdâ¶Kx“äìµKâĵKx“è`â,¶Kì_å¶KâìµKì_á¸+Kä0âô¸KPùä<¶Kâ ¶KPùT¶Kè0â„¶Kè”èĸKèâpêè”äT¶K䤶K ãát·K˜Rä´¶K„¶K˜Rð¶Kÿèä,·Kä·KäãT¶Kì âT¶K äX·KèH·Kì âT¶Kð·KꜷKhUå„·KæhUé(âÄ·K¬½ä¬·Kâ„·K¬½è$âì·KäBäÔ·K⬷KäBè â¸Kôìäü·KâÔ·Kôìèâ<¸K«ä$¸Kâü·K«èâd¸Kìz äL¸Kâ$¸Kìz è⌸K_ ät¸KâL¸K_ èâ´¸Kèm䜸Kâ t¸Kèm”ÜIäâܸK¤äĸKâ œ¸K¤”ÜIìè”äì¸KT¶Kæ€ ä¹KD´K✻KX ä¹K(¹Kæ â8¹Kæâh¹K4Íèl»Kèâpê4Íä8¹K䈹K ãáXºK˜R䘹Kh¹K˜RÔ¹KÿèäºKåºKäã8¹Kì â8¹K ä<ºKè,ºKì â8¹KñºKꔺKÌähºKæÌ€ºKäâ ê伺KȔ夺KâhºKÈ”éâäºKÔä̺K⤺KÔèâ »K$­äôºKâ̺K$­è â4»KüØ ä»KâôºKüØ èâ\»K˜âäD»Kâ»K˜âèâ„»Kà‹ äl»KâD»Kà‹ ð4Íä”»K8¹KâX¼K< 䬻Kä< è»Kááÿåä¼KïDá ¼Kè rJì<¼Kÿä|JêÄK¬¥äh¼K䬥¤¼KÿìäÀ¼KïíܼKì âì¼Kæâ ½K\p ÄKè ÄKä @áp€ÄKæ\p äì¼Kä<½Kãá"˜¾KôOà½KL½K½KôOˆ½Kÿèä´½Kìãì¼KøнKì âì¼Kèè½K½KôO$¾KÿèäP¾Kìãì¼Kìl¾KèнKøˆ¾Kê âì¼K äH¿K˜R䨾K½K˜Rä¾Kÿèä¿K䈾Käãì¼Kì,¿KèнKøˆ¾KêÀKìÉäX¿K½KìÉ”¿KâÿèäÀ¿Kìááì¼KêÜ¿KèнKøø¿Kì âܼKæœÀK”äÀK½K”TÀKâÿèä€ÀKìááì¼KöнKìLÁKpRä¬ÀK½KpRèÀKâÿèäÁKìááì¼Kê0ÁKèнKÿèôÃKwä\ÁK½Kw˜ÁKâÿèäÄÁKìááì¼K êàÁKèнKìüÁKøØÃKèÂKì â(ÂKæ âXÂK”%è¨ÃKèâpê”%ä(ÂKäxÂKãáHÃK˜RäˆÂKXÂK˜RÄÂKÿèåÃKäðÂKäã(ÂKì â(ÂK ä,ÃKèÃKì â(ÂKððÂKêpÃKt„äXÃKæt„èâ˜ÃK´§ä€ÃKâXÃK´§èâÀÃK•ä¨ÃKâ €ÃK•|Jì”%äÐÃK(ÂKîLbð\p äÄKì¼Kæˆbì0ÄKì¼Kä$ââ½KäK lÄKÿä$ìâ9åÀåFhÅKðCä ÄKäðCÜÄKÿìäøÄKïáÅKèlÍJì0ÅKèôIìLÅKè°"JøLbì´ÅK äxÅKæ ´OâÿåìOLè/äÄÅKäè/áÆKÿìäÆKïáÐOLè8ÆKì âHÆKæâxÆK@áLOLè`OLä @ápÀOLæ@åHÆKä˜ÆK'ãá"ôÇKôO<ÇK¨ÆKxÆKôOäÆKÿèäÇKìãHÆKø,ÇKì âHÆKèDÇKxÆKôO€ÇKÿèä¬ÇKìãHÆKìÈÇKè,ÇKøäÇKê âHÆK ä¤ÈK˜RäÈKxÆK˜R@ÈKÿèälÈKääÇKäãHÆKìˆÈKè,ÇKøäÇKêpÉK8üä´ÈKxÆK8üðÈKâÿèäÉKìááHÆK¨ê8ÉKè,ÇKìTÉKè8ÆKøBJì ÊKø?ä€ÉKxÆKø?¼ÉKâÿèäèÉKìááHÆK¤êÊKè,ÇKø8oìÐÊK,âä0ÊKxÆK,âlÊKâÿèä˜ÊKìááHÆK ê´ÊKè,ÇKø8oì€ËKÐXäàÊKxÆKÐXËKâÿèäHËKìááHÆKœêdËKè,ÇKø8oì0ÌKáªä ËKxÆKáªÌËKâÿèäøËKìááHÆK˜êÌKè,ÇKøÔDì ÍK@ ä@ÌKxÆK@ |ÌKâÿèä¨ÌKìááHÆK”êÄÌKè,ÇKìàÌKè|JøüÌKì â8ÆKæ`ÔKœë äÍKxÆKœë XÍKâÿèä„ÍKìááHÆKê ÍKè,ÇKì¼ÍKè|JøØÍKì âèÍKæ âøÍKæâ (ÎKÔeÜÓKèðÓKä @ápPÔKæÔeäøÍKäHÎKãá"¤ÏKôOìÎKXÎK(ÎKôO”ÎKÿèäÀÎKìãøÍKøÜÎKì âøÍKèôÎK(ÎKôO0ÏKÿèä\ÏKìãøÍKìxÏKèÜÎKø”ÏKê âøÍK äTÐK˜Rä´ÏK(ÎK˜RðÏKÿèäÐKä”ÏKäãøÍKì8ÐKèÜÎKø”ÏKêÑK,Ð ädÐK(ÎK,Ð  ÐKâÿèäÌÐKìááøÍK,êèÐKèÜÎKø ìIì˜ÑKx{äÑK(ÎKx{PÑKâÿèä|ÑKìááøÍK(öÜÎKìHÒK”Þä¨ÑK(ÎK”ÞäÑKâÿèäÒKìááøÍK$ê,ÒKèÜÎKøüÌKìøÒKd¸äXÒK(ÎKd¸”ÒKâÿèäÀÒKìááøÍK êÜÒKèÜÎKøX-ìÄÓKàuäÓK(ÎKàuDÓKâÿèäpÓKìááøÍKêŒÓKèÜÎKì¨ÓKÿäüÌKðÔeäÔÓKøÍKæ8œJíÔKøÍKä8ââ(ÎK”ß <ÔKÿä8ìâ‚¿3)6{Ò²ÀO˜>`,ÕKü äpÔKxÆKü ¬ÔKâÿèäØÔKìááHÆKŒêôÔKè,ÇKìÕKè8ÆKø8oìÜÕKœ× ä<ÕKxÆKœ× xÕKâÿèä¤ÕKìááHÆKˆêÀÕKè,ÇKø8oìŒÖKˆôäìÕKxÆKˆô(ÖKâÿèäTÖKìááHÆK„êpÖKè,ÇKø|Jì<×KPŽäœÖKxÆKPŽØÖKâÿèä×KìááHÆK€ê ×Kè,ÇKùBJìì×KwäL×KxÆKwˆ×Kâÿèä´×KìááHÆK|êÐ×Kè,ÇKøBJìœØKäîå ü×KxÆKäîá8ØKâÿèädØKìááHÆKxê€ØKè,ÇKùBJìLÙKP 䬨KxÆKP èØKâÿèäÙKìááHÆKtê0ÙKè,ÇKøüÌKìüÙK¤Pä\ÙKxÆK¤P˜ÙKâÿèäÄÙKìááHÆKpêàÙKè,ÇKøÔDì¬ÚKŸä ÚKxÆKŸHÚKâÿèätÚKìááHÆKlêÚKè,ÇKø|Jì\ÛKÐjä¼ÚKxÆKÐjøÚKâÿèä$ÛKìááHÆKhê@ÛKè,ÇKø8oì ÜK@Þ älÛKxÆK@Þ ¨ÛKâÿèäÔÛKìááHÆKdêðÛKè,ÇKø8oìØÜK´¬äÜKxÆK´¬XÜKâÿèä„ÜKìááHÆK`ê ÜKè,ÇKì¼ÜKÿäüÌKì,BL€0 äèÜKxÆK€0 $ÝKâÿèäPÝKìááHÆK\êlÝKè,ÇKøˆÝKì â˜ÝKæ â¨ÝKæâ ØÝK8¨ALè¼ALä @ápBLæ8ä¨ÝKäøÝK$ãá"TßKôOœÞKÞKØÝKôODÞKÿèäpÞKìã¨ÝKøŒÞKì â¨ÝKè¤ÞKØÝKôOàÞKÿèä ßKìã¨ÝKì(ßKèŒÞKøDßKê â¨ÝK äàK˜RädßKØÝK˜R ßKÿèäÌßKäDßKäã¨ÝKìèßKèŒÞKøDßKê´àK@ÄäàKØÝK@ÄPàKâÿèä|àKìáá¨ÝK,é˜àKèŒÞKøBJìdáK€jäÄàKØÝK€jááKâÿèä,áKìáá¨ÝK(éHáKèŒÞKøBJìâKLÃätáKØÝKLðáKâÿèäÜáKìáá¨ÝK$éøáKèŒÞKøBJìÄâKÔZä$âKØÝKÔZ`âKâÿèäŒâKìáá¨ÝK é¨âKèŒÞKÿètãKÌäÔâKØÝKÌãKâÿèä<ãKìáá¨ÝKéXãKèŒÞKøÔDì$äKÀóä„ãKØÝKÀóÀãKâÿèäìãKìáá¨ÝKéäKèŒÞKÿèÔäKä°å 4äKØÝKä°ápäKâÿèäœäKìáá¨ÝKé¸äKèŒÞKøÔDì„åK¬Wå ääKØÝK¬Wá åKâÿèäLåKìáá¨ÝKéhåKèŒÞKÿè4æK¨¹ä”åKØÝK¨¹ÐåKâÿèäüåKìáá¨ÝK éæKèŒÞKøÔDìäæKpÉ äDæKØÝKpÉ €æKâÿè䬿Kìáá¨ÝKéÈæKèŒÞKøBJì°çK(‘äôæKØÝK(‘0çKâÿèä\çKìáá¨ÝKéxçKèŒÞKì”çKè|JøÔDìDèKÈäÀçKØÝKÈüçKâÿèä(èKìáá¨ÝKáõŒÞKìôèK“äTèKØÝK“èKâÿèä¼èKìáá¨ÝKüêØèKèŒÞKÿè¤éKŒqäéKØÝKŒq@éKâÿèäléKìáá¨ÝKøêˆéKèŒÞKøÔDìTêKµå ´éKØÝKµáðéKâÿèäêKìáá¨ÝKôê8êKèŒÞKø8oììòK€iädêKØÝK€i êKâÿèäÌêKìáá¨ÝKðêèêKèŒÞKøëKì âëKæ â$ëKæâ TëKìFhòKè|òKä @ápÜòKæìFä$ëKätëK ãá"ÐìKôOìK„ëKTëKôOÀëKÿèäìëKìã$ëKøìKì â$ëKè ìKTëKôO\ìKÿèäˆìKìã$ëKì¤ìKèìKøÀìKê â$ëK ä€íK˜RäàìKTëK˜RíKÿèäHíKäÀìKäã$ëKìdíKèìKøÀìKê0îKèxäíKTëKèxÌíKâÿèäøíKìáá$ëK4êîKèìKøX-ìàîKÐxä@îKTëKÐx|îKâÿèä¨îKìáá$ëK0êÄîKèìKøX-ìïKw äðîKTëKw ,ïKâÿèäXïKìáá$ëK,êtïKèìKøX-ì@ðKÐÝä ïKTëKÐÝÜïKâÿèäðKìáá$ëK(ê$ðKèìKø8oìððKá± ä PðKTëKá± ŒðKâÿèä¸ðKìáá$ëK$êÔðKèìKø8oì ñKµæ ñKTëKµá<ñKâÿèähñKìáá$ëK ê„ñKèìKø8oìPòK°¬å °ñKTëK°¬áìñKâÿèäòKìáá$ëKê4òKèìKøX-ðìFä`òK$ëKæ8œJìŒòK$ëKä@ââTëK¸ÈòKÿä@ìâ &¤ú>/'Òƒoá øzw‚œóKœ• äüòKØÝKœ• 8óKâÿèädóKìáá¨ÝKìê€óKèŒÞKøX-ìhôKp'ä¬óKØÝKp'èóKâÿèäôKìáá¨ÝKèê0ôKèŒÞKìLôKèBJøÔDì4õKHÿäxôKØÝKHÿ´ôKâÿèäàôKìáá¨ÝKäêüôKèŒÞKìõKè|JøüÌKì8öKd…äDõKØÝKd…€õKâÿèä¬õKìáá¨ÝKàêÈõKèŒÞKìäõKèBJíöKè|JìöKè|JøüÌKì÷KP˜äHöKØÝKP˜„öKâÿèä°öKìáá¨ÝKÜêÌöKèŒÞKìèöKè|JøØÍKìèúK¨Þä÷KØÝK¨ÞP÷Kâÿèä|÷Kìáá¨ÝKØê˜÷KèŒÞKì´÷Kè|JøÐ÷Kì âà÷Kæ âð÷Kæâ øKdúKèxúKä @ápØúKæäð÷Kä@øKãá"œùKôOäøKPøK øKôOŒøKÿè䏸Kìãð÷KøÔøKì âð÷KèìøK øKôO(ùKÿèäTùKìãð÷KìpùKèÔøKøŒùKê âð÷K äLúK˜Rä¬ùK øK˜RèùKÿèäúKäŒùKäãð÷Kì0úKèÔøKøŒùKîä\úKð÷KæHÆKìˆúKð÷Kä´ââ øKˆ¨ÄúKÿä´ì⎿3)6{Ò²ÀO˜>`ÜLD äøúKØÝKD 4ûKâÿèä`ûKìáá¨ÝKÔê|ûKèŒÞKì˜ûKè|Jø´ûKì âÄûKæ âÔûKæâ üKЬXLèlLä @ápÌLæЬäÔûKä$üKãá"€ýKôOÈüK4üKüKôOpüKÿèäœüKìãÔûKø¸üKì âÔûKèÐüKüKôO ýKÿèä8ýKìãÔûKìTýKè¸üKøpýKê âÔûK ä0þK˜RäýKüK˜RÌýKÿèäøýKäpýKäãÔûKìþKè¸üKøpýKêàþKðþ ä@þKüKðþ |þKâÿèä¨þKìááÔûK´êÄþKè¸üKøBJìÿKØäðþKüKØ,ÿKâÿèäXÿKìááÔûK°êtÿKè¸üKùBJì@L€k ä ÿKüK€k ÜÿKâÿèäLìááÔûK¬ê$Lè¸üKø8oðЬäPLÔûKæHÆKì|LÔûKäÀââüKl–¸LÿäÀìâ…¿3)6{Ò²ÀO˜>`ìLøÕäìLØÝKøÕ(LâÿèäTLìáá¨ÝKÐêpLèŒÞKìŒLè|Jì¨Lè|JøÄLì âÔLæ âäLæâ L$hLè|Lä @ápÜLæ$ääLä4Lãá"LôOØLDLLôO€Lÿèä¬LìãäLøÈLì âäLèàLLôOLÿèäHLìãäLìdLèÈLø€Lê âäL ä@L˜Rä LL˜RÜLÿèäLä€LäãäLì$LèÈLø€LêðLìCäPLLìCŒLâÿèä¸LìááäL´êÔLèÈLø|Jì Lä¡åLLä¡<LâÿèähLìááäL°ê„LèÈLø8oìPL”K ä°LL”K ìLâÿèäLìááäL¬ê4LèÈLø8oð$ä`LäLæHÆKìŒLäLäÀââLá ²ÈLÿäÀì≿3)6{Ò²ÀO˜>`ÔLIäüLØÝKI8LâÿèädLìáá¨ÝKÌê€LèŒÞKìœLè|Jø¸Lì âÈLæ âØLæâ LH°L LèdLä @ápÄLæH°äØLä(Lãá"„ LôOÌL8LLôOtLÿèä LìãØLø¼Lì âØLèÔLLôO Lÿèä< LìãØLìX Lè¼Løt Lê âØL ä4 L˜Rä” LL˜RÐ Lÿèäü Lät LäãØLì Lè¼Løt LîH°äD LØLæ` Lìâ L\¢À LèôLä @ápTLæ\¢ä` Lä° Lãá" LôOT LÀ L LôOü Lÿèä( Lìã` LøD Lì â` Lè\ L LôO˜ LÿèäÄ Lìã` Lìà LèD Løü Lê â` L ä¼ L˜Rä L L˜RX Lÿèä„ Läü Läã` Lì  LèD Løü Lê¨ LD©äÌ L LD© Lâÿèä4 Lìáá` LÌêP LèD Lìl Lÿäˆ Lì ☠Læ â` Lê\¢ä¸ L` LæÔ LìâL ¦ápLè„Lä @ápäLæ ¦åÔ Lä$L ãá"€LôOÈL4LLôOpLÿèäœLìãÔ Lø¸Lì âÔ LèÐLLôO Lÿèä8LìãÔ LìTLè¸LøpLê âÔ L ä0L˜RäLL˜RÌLÿèäøLäpLäãÔ LìLè¸LøpLêLð©ä@LLð©|Lâÿèä¨LìááÔ LÈêÄLè¸LìàLøüLÿä|JìäLÈM ä(LLÈM dLâÿèäLìááÔ LÄê¬Lè¸LìÈLÿô°LðäôLLð0Lâÿèä\LìááÔ LÀêxLè¸Lì”Lÿä|Jì`L£å ÀLL£áüLâÿèä(LìááÔ L¼êDLè¸Lø|JìHLå pLLá¬LâÿèäØLìááÔ L¸êôLè¸LìLø,Lÿä8oìøLd¸äXLLd¸”LâÿèäÀLìááÔ L´êÜLè¸LøX-ì¨LìCäLLìCDLâÿèäpLìááÔ L°êŒLè¸Lø|JìXLä¡ä¸LLä¡ôLâÿèä LìááÔ L¬ê<Lè¸Lø8oð ¦åhLÔ LæHÆKì”LÔ LäÔââLÔ„ÐLÿäÔìâ„¿3)6{Ò²ÀO˜>`L` LäØââ Lœ@LÿäØì⇿3)6{Ò²ÀO˜>`tLØLäØââLhi°LÿäØì⊿3)6{Ò²ÀO˜>`¸L ääLØÝK  LâÿèäLLìáá¨ÝKÈêhLèŒÞKì„Lè|Jø Lì â°Læ âÀLæâ ðLì,4LèHLä @áp¨Læì,äÀLäLãá"lLôO´L LðLôO\LÿèäˆLìãÀLø¤Lì âÀLè¼LðLôOøLÿèä$LìãÀLì@Lè¤Lø\Lê âÀL äL˜Rä|LðL˜R¸LÿèääLä\LäãÀLíLè¤Lø\Lîì,ä,LÀLæÔ LìXLÀLäÔââðL Ð”LÿäÔì∿3)6{Ò²ÀO˜>`„L$ÀäÈLØÝK$ÀLâÿèä0Lìáá¨ÝKÄêLLèŒÞKìhLè|Jøˆ LìL L8Ÿ ä”LØÝK8Ÿ ÐLâÿèäüLìáá¨ÝKÀêLèŒÞKø4Lì âDLæ âTLæâ „Lh ÈLèÜLä @áp< Læh äTLä¤Lãâ!LôOHL´L„LôOðLÿèäLìãTLø8Lì âTLèPL„LôOŒLÿèä¸LìãTLìÔLè8LøðLê âTL ä°L˜RäL„L˜RLLÿèäxLäðLäãTLì”Lè8LøðLîh äÀLTLæHÆKììLTLä´ââ„L˜T( Lÿä´ìâ ¤ú>/'Òƒoá øzw‚ì*LX¥ ä\ LØÝKX¥ ˜ LâÿèäÄ Lìáá¨ÝK¼êà LèŒÞKìü Lè|Jø!Lì â(!Læ â8!Læâ h!LDèh*Lè|*Lä @ápÜ*LæDèä8!Läˆ!L ãá"ä"LôO,"L˜!Lh!LôOÔ!Lÿèå"Lìã8!Lø"Lì â8!Lè4"Lh!LôOp"Lÿèäœ"Lìã8!Lì¸"Lè"LøÔ"Lê â8!L ä”#L˜Räô"Lh!L˜R0#Lÿèä\#LäÔ"Läã8!Lìx#Lè"LøÔ"Lê($LUä¤#Lh!LUà#Lâÿèä $Lìáá8!LÌö"Lìô$LP˜ä8$Lh!LP˜t$Lâÿèä $Lìáá8!LÈê¼$Lè"LìØ$Lè|JøØÍKìÀ%Lh;ä%Lh!Lh;@%Lâÿèäl%Lìáá8!LÄêˆ%Lè"Lì¤%LèÄûKø´ûKìŒ&LTšäÐ%Lh!LTš &Lâÿèä8&Lìáá8!LÀêT&Lè"Lìp&LèÄûKø´ûKìX'L\¥äœ&Lh!L\¥Ø&Lâÿèä'Lìáá8!L¼ê 'Lè"Lì<'Lè|Jø´ûKì(Lˆ´å h'Lh!Lˆ´á¤'LâÿèäÐ'Lìáá8!L¸êì'Lè"Lø|JìÔ(L„C ä(Lh!L„C T(Lâÿèä€(Lìáá8!L´êœ(Lè"Lì¸(Lè|JøBJì )L v ää(Lh!L v )LâÿèäL)Lìáá8!L°êh)Lè"Lì„)Lè|JùBJìP*Läfä°)Lh!Läfì)Lâÿèä*Lìáá8!L¬ê4*Lè"Lø8oðDèä`*L8!LæHÆKìŒ*L8!LäØââh!L¬ŒÈ*LÿäØì↿3)6{Ò²ÀO˜>`œ+L Šäü*LØÝK Š8+Lâÿèäd+Lìáá¨ÝK¸ê€+LèŒÞKø(!LìL,Lá›ä ¬+LØÝKá›è+Lâÿèä,Lìáá¨ÝK´ê0,LèŒÞKø!Lìü0LT ä\,LØÝKT ˜,LâÿèäÄ,Lìáá¨ÝK°êà,LèŒÞKøü,Lì â -Læ â-Læâ L-LIx0LèŒ0Lä @ápì0LæIä-Läl-Lãá"È.LôO.L|-LL-LôO¸-Lÿèää-Lìã-Lù.Lì â-Lè.LL-LôOT.Lÿèä€.Lìã-Lìœ.Lé.Lø¸.Lê â-L äx/L˜RäØ.LL-L˜R/Lÿèä@/Lä¸.Läã-Lì\/Lé.Lø¸.Lê`0LTäˆ/LL-LTÄ/Lâÿèäð/Lìáá-Lê 0Lé.Lì(0Lè|JìD0Lè|JøÔDðIäp0L-Læ8œJìœ0L-Lä(ââL-LÜØ0Lÿä(ìâ¿3)6{Ò²ÀO˜>`AL\M ä 1LØÝK\M H1Lâÿèät1Lìáá¨ÝK¬ê1LèŒÞKø¬1Lì â¼1Læ âÌ1Læâ ü1LÐ ALè ALä @áp€ALæÐäÌ1Lä2Lãá"x3LôOÀ2L,2Lü1LôOh2Lÿèä”2LìãÌ1Lø°2Lì âÌ1LèÈ2Lü1LôO3Lÿèä03LìãÌ1LìL3Lè°2Løh3Lê âÌ1L ä(4L˜Räˆ3Lü1L˜RÄ3Lÿèäð3Läh3LäãÌ1Lì 4Lè°2Løh3Lê”?LT6ä84Lü1LT6t4Lâÿèä 4LìááÌ1L´ê¼4Lè°2LøØ4Lì âè4Læ âø4Læâ (5L„a?Lè$?Lä @áp„?Læ„aäø4LäH5L ãá"¤6LôOì5LX5L(5LôO”5LÿèäÀ5Lìãø4LøÜ5Lì âø4Lèô5L(5LôO06Lÿèä\6Lìãø4Lìx6LèÜ5Lø”6Lê âø4L äT7L˜Rä´6L(5L˜Rð6Lÿèä7Lä”6Läãø4Lì87LèÜ5Lø”6Lê8L,Ð äd7L(5L,Ð  7LâÿèäÌ7Lìááø4L@êè7LèÜ5Lø ìIì˜8Lx{ä8L(5Lx{P8Lâÿèä|8Lìááø4L<öÜ5LìH9L”Þä¨8L(5L”Þä8Lâÿèä9Lìááø4L8ê,9LèÜ5LøüÌKì0:L° äX9L(5L° ”9LâÿèäÀ9Lìááø4L4êÜ9LèÜ5Lìø9Lè|Jì:Lè|JøüÌKì;LPyä@:L(5LPy|:Lâÿèä¨:Lìááø4L0êÄ:LèÜ5Lìà:Lè|Jìü:Lè|JøüÌKìÈ;Ld¸ä(;L(5Ld¸d;Lâÿèä;Lìááø4L,ê¬;LèÜ5LøX-ì”Lìóäp=L(5Lìó¬=LâÿèäØ=Lìááø4L êô=LèÜ5Lì>Lè8ÆKøüÌKìø>L|%ä<>L(5L|%x>Lâÿèä¤>Lìááø4LêÀ>LèÜ5LìÜ>Lè|JøüÌKð„aä?Lø4Læ8œJì4?Lø4LäLââ(5L”Pp?LÿäLì⃿3)6{Ò²ÀO˜>`D@L¤7 ä¤?Lü1L¤7 à?Lâÿèä @LìááÌ1L°ê(@Lè°2LøØ4Lìô@L€k äT@Lü1L€k @Lâÿèä¼@LìááÌ1L¬êØ@Lè°2Lø8oðÐäALÌ1LæHÆKì0ALÌ1LäÀââü1L ®á lALÿäÀìâ‹¿3)6{Ò²ÀO˜>`ã8ä AL¨ÝKæHÆKìÌAL¨ÝKä8áâØÝKЕBLÿä8ëâ¿3)6{Ò²ÀO˜>`ÜBL°Û ä`ë8oìüOLää ÜLLPLÈä PL‚KæÄ^L¤Cä(PL0PLâ â`PL¤Cè”^Lèâpê¤Cä0PLä€PL ãáPQL˜RäPL`PL˜RÌPLÿèäQLäøPLäã0PLì â0PL ä4QLè$QLì â0PLðøPLêxQLô`ä`QLæô`œBäâ¼]L°D äˆQLâ `QL°D  QLäâ â°QLæäÌQLïá ]LèèQLê âøQLæâ(RL,œ èp]Lèâpê,œ äøQLäHRLãáSL˜RäXRL(RL˜R”RLÿèäÐRLäÀRLäãøQLì âøQL äüRLèìRLì âøQLðÀRLê@SLävä(SLæävœBäâ]LlD äPSLâ (SLlD hSLä â âxSLæpâ¨SLTÌèà\LèâpêTÌäxSLäÈSLãá˜TL˜RäØSL¨SL˜RTLÿèäPTLä@TLäãxSLì âxSL ä|TLèlTLì âxSLð@TLê€VL¸ä¨TLæ¸ÀTLälâ âÐTLæãUL8—èPVLèâpê8—äÐTLä ULãáðUL˜Rä0ULá UL˜RlULÿèä¨ULä˜ULäãÐTLì âÐTL äÔULèÄULì âÐTLð˜ULêVLlyåVLæly°Käâ@VLäªä(VLãVLäªèâhVLž äPVLâ (VLž ˜ì8—äxVLÐTLâ¨VLôöäVLâ¨TLôöèhâ€XL$èä¸VLâ VL$èÐVLä\â ãWL4­èPXLèâpê4­äÐVLä WLãáðWL˜Rä0WLá WL˜RlWLÿèä¨WLä˜WLäãÐVLì âÐVL äÔWLèÄWLì âÐVLð˜WLêXLÙåXLæÙèâ@XLtsä(XLã XLtsTDäâhXLdPäPXLâ(XLdPð4­äxXLÐVLâ¨XLÄl äXLâ ¸VLÄl ÐVLäPâà[Ldä¸XLâ XLdÐXLä8âãYLx= è(ZLèâpêx= äÐXLä YLãáðYL˜Rä0YLá YL˜RlYLÿèä¨YLä˜YLäãÐXLì âÐXL äÔYLèÄYLì âÐXLð˜YLêZLÀ,åZLæÀ,ÐVLä âÈ[L¸gä(ZLã ZL¸g@ZLè âpZL`fè˜[Lèâpê`fä@ZLäZLãá`[L˜Rä ZLpZL˜RÜZLÿèä[Lä[Läã@ZLì â@ZL äD[Lè4[Lì â@ZLð[Lêˆ[LXäp[LæX°Käâ°[Lž ä˜[Lâ p[Lž ˜ì`fäÀ[L@ZLæx= äØ[LÐXLâ\L„­äð[Lâ ¸XL„­°Kä0â0\Lä\Lâ ð[LRä(âX\Là*ä@\Lâ \Là*Rä â€\LŒkäh\Lâ @\LŒk°Käâ¨\L°ä\Lâ h\L°@ZLä âÐ\LDç ä¸\Lâ \LDç °Käâø\LT›äà\Lâ¸\LT›ðTÌä]LxSLâ8]LH×ä ]LâPSLH×èâ`]L¨iäH]Lâ ]L¨iTDäâˆ]Lüˆäp]LâH]Lüˆð,œ ä˜]LøQLîœBìä]L”‰ äÌ]Lâ ˆQL”‰  Käâ ^Lô“äô]LâÌ]Lô“èâ4^LDúä^Lâô]LDúè â\^LpäD^Lâ^Lpèâ„^LL* äl^Lâ D^LL* ˜ââ¬^Lìâä”^Lâl^Lìâð¤Cä¼^L0PLâH_LÄ/äÔ^LäÄ/_Lááÿåä,_LïDíTDìè`L¬/äX_L`_Lââ_L¬/è¸`Lèâpê¬/ä`_Lä°_Lãá€`L˜RäÀ_L_L˜Rü_Lÿèä8`Lä(`Läã`_Lì â`_L äd`LèT`Lì â`_Lð(`Lê¨`Lls ä`Læls èâÐ`Lìâä¸`Lâ`Lìâð¬/äà`L`_LâˆaL|¥äø`Lä|¥4aLááÿåäPaLïDálaLè ˜ÿæ bL”/ä˜aLä”/ÔaLááÿåäðaLïDíœBðpCäbL(bLæ â8bLæ âhbLð‚ è¸cLèâpêð‚ ä8bLäˆbLãáXcL˜Rä˜bLhbL˜RÔbLÿèäcLåcLäã8bLì â8bL ä øìh> ä8¼L䈼Lãåh> 䘼L8¼Lÿúð¼LØ‘ äè¼LhŸLâ¼½LÄå½LäÄ<½LááÿåäX½LïDát½Lø½Lè¼p-ø¬½Lì â¼p-æì½Lìå̽LؽLæ áé€äŒ¾LÔåü½LäÔá8¾LÿìäT¾Lïáp¾Lÿô¸¾LX䜾L¨¾Læ âx­LêDEäȾLÌkDE$B-òèA-öLÀLh ä¿Läh P¿Lÿìäl¿LïሿLø¤¿LèœBìÀ¿LøÜ¿Lè|Jìø¿LèX-ìÀLè|Jì0ÀLÿäÔDìÄÁL¨2ä\ÀLâ ÁL¨2tÀL@èæŒÀLäl®ä ¤ÀLþ tÀLê ¼ÀLhÖtÀLê ÔÀL$ÏtÀLê ìÀLÀƒ tÀLê ÁLøøtÀLê\ÀLáHtÀL ê 4ÁLØÙtÀL€ê LÁLèktÀLáé dÁLlÕ tÀLáé |ÁLà«tÀLá é”ÁLᢠtÀLá€é ¬ÁLÜAtÀLá@í„ZtÀLâæØÌLÈÌLÔÁLàÁLæâ ÂLDÌLèXÌLä @áp¸ÌLæäàÁLä0ÂL ãá"ŒÃLôOÔÂL@ÂLÂLôO|ÂLÿèä¨ÂLìãàÁLøÄÂLì âàÁLèÜÂLÂLôOÃLÿèäDÃLìãàÁLì`ÃLèÄÂLø|ÃLê âàÁL ä<ÄL˜RäœÃLÂL˜RØÃLÿèäÄLä|ÃLäãàÁLì ÄLèÄÂLø|ÃLê@ÅLŒäLÄLÂLŒˆÄLâÿèä´ÄLìááàÁLÌêÐÄLèÄÂLììÄLèBJìÅLè|Jì$ÅLèBJø8oìDÆL¤¶äPÅLÂL¤¶ŒÅLâÿèä¸ÅLìááàÁLÈêÔÅLèÄÂLìðÅLèBJì ÆLè|Jì(ÆLèBJø8oì,ÇL8 äTÆLÂL8 ÆLâÿè伯LìááàÁLÄêØÆLèÄÂLìôÆLøÇLè|Jø8oìÈLü/ä<ÇLÂLü/xÇLâÿèä¤ÇLìááàÁLÀêÀÇLèÄÂLìÜÇLøøÇLè|Jø8oìàÈL@è ä$ÈLÂL@è `ÈLâÿèäŒÈLìááàÁL¼ê¨ÈLèÄÂLìÄÈLè8ÆKøX-ìÈÉL˜°äðÈLÂL˜°,ÉLâÿèäXÉLìááàÁL¸êtÉLèÄÂLìÉLè|Jì¬ÉLè8ÆKøX-ì”ÊLäØÉLÂLÊLâÿèä@ÊLìááàÁL´ê\ÊLèÄÂLìxÊLè8ÆKøX-ì`ËLHý ä¤ÊLÂLHý àÊLâÿèä ËLìááàÁL°ê(ËLèÄÂLìDËLè8ÆKøX-ì,ÌL°7 äpËLÂL°7 ¬ËLâÿèäØËLìááàÁL¬êôËLèÄÂLìÌLè8ÆKøX-ðä<ÌLàÁLæHÆKìhÌLàÁLäØââÂLÄÝ ¤ÌLÿäØìâ %¤ú>/'Òƒoáøzw‚ãÐÌLàÁLâ ÎLŒ2äèÌLðÌLââ ÍLŒ2èpÎLèâpêŒ2äðÌLä@ÍLãáÎL˜RäPÍL ÍL˜RŒÍLÿèäÈÍLä¸ÍLäãðÌLì âðÌL äôÍLèäÍLì âðÌLð¸ÍLê8ÎLlyä ÎLæly°Käâ`ÎL”‡äHÎLâ ÎL”‡èâˆÎLž äpÎLâ HÎLž ˜ìŒ2ä˜ÎLðÌLâ¸ÎLDnä°ÎLtºJâÏLt’ äÈÎLät’ ÏLááÿåä ÏLïDá<ÏLè ˜êXÏLè ˜êtÏLÿä ˜êLÐLôä ÏLäôÜÏLááÿåäøÏLïDáÐLèœBì0ÐLèLbøLbìLÑL@2ä\ÐLâ ¼ÐL@2tÐLèæŒÐLäc ä ¤ÐLotÐLê \ÐLÈttÐLê ÔÐL¤ÆtÐLê ìÐLà3tÐLê ÑL$BtÐLê ÑL°ítÐLê 4ÑLìC tÐLîH’tÐL ì2ä\ÑLä2˜ÑLÿìä´ÑLþÐÑLì âàÑLæâÒLÕ è ÕLèâpêÕ äàÑLä0ÒLãâÓL˜Rä@ÒLÒL˜R|ÒLÿèä¸ÒLä¨ÒLäãàÑLì âàÑL ääÒLèÔÒLì âàÑLð¨ÒLêÀÔL\läÓLæ\l(ÓLä â â8ÓLæâhÓLlƒèÔLèâpêlƒä8ÓLäˆÓLãáXÔL˜Rä˜ÓLhÓL˜RÔÓLÿèäÔLåÔLäã8ÓLì â8ÓL ä<ÔLè,ÔLì â8ÓLñÔLê€ÔLŒ”ähÔL挔(ÓLäâ¨ÔL… äÔLâ hÔL… ø,Jìlƒä¸ÔL8ÓLâèÔLÈ‚ äÐÔLâ ÓLÈ‚ (ÓLäâÕLsäøÔLâ ÐÔLsø,Jäâ8ÕL¼·ä ÕLâ øÔL¼·ø,JìÕ äHÕLàÑLâ(ÖL¬oä`ÕLä¬oœÕLÿìä¸ÕLïáÔÕLèlÍJìðÕLèôIì ÖLè°"JøLbìâL“ ä8ÖLä“ tÖLÿìäÖLïátâLè¬ÖLì â¼ÖLæâ ìÖLx ðáLèâLä @ápdâLæx ä¼ÖLä ×Lãá"hØLôO°×L×LìÖLôOX×Lÿèä„×Lìã¼ÖLø ×Lì â¼ÖLè¸×LìÖLôOô×Lÿèä ØLìã¼ÖLì<ØLè ×LøXØLê â¼ÖL äÙL˜RäxØLìÖL˜R´ØLÿèäàØLäXØLäã¼ÖLìüØLè ×LøXØLêÈÙLð8 ä(ÙLìÖLð8 dÙLâÿèäÙLìáá¼ÖLHê¬ÙLè ×Lø¬ÖLì°ÚLàäØÙLìÖLàÚLâÿèä@ÚLìáá¼ÖLDê\ÚLè ×LìxÚLè¬ÖLì”ÚLÿô`ÛLŸäÀÚLìÖLŸüÚLâÿèä(ÛLìáá¼ÖL@êDÛLè ×Lø|JìÜLÐjäpÛLìÖLÐj¬ÛLâÿèäØÛLìáá¼ÖL<êôÛLè ×Lø8oìÀÜLØL ä ÜLìÖLØL \ÜLâÿèäˆÜLìáá¼ÖL8ê¤ÜLè ×LøX-ìpÝLÔ{å ÐÜLìÖLÔ{á ÝLâÿèä8ÝLìáá¼ÖL4êTÝLè ×LøáJì ÞLˆ´å €ÝLìÖLˆ´á¼ÝLâÿèäèÝLìáá¼ÖL0êÞLè ×Lø|JììÞL v ä0ÞLìÖL v lÞLâÿèä˜ÞLìáá¼ÖL,ê´ÞLè ×LìÐÞLè|JùBJì¸ßL„C äüÞLìÖL„C 8ßLâÿèädßLìáá¼ÖL(ê€ßLè ×LìœßLè|JøBJìxàLhßäÈßLìÖLhßàLâÿèä0àLìáá¼ÖL$êLàLè ×LøhàLì â¬ÖLæ(áL` äˆàLìÖL` ÄàLâÿèäðàLìáá¼ÖL ê áLè ×Lø|JìØáLäfä8áLìÖLäftáLâÿèä áLìáá¼ÖLê¼áLè ×Lø8oðx äèáL¼ÖLæ8œJìâL¼ÖLäTââìÖLعPâLÿäTìâ¬1?_áМ%ÀOÉœŽë8oì¨éL„oä âLä„oÜâLÿìäøâLïáŒéLèãLì â$ãLæâ TãLéLèéLä @áp|éLæä$ãLätãLãá"ÐäLôOäL„ãLTãLôOÀãLÿèäìãLìã$ãLøäLì â$ãLè äLTãLôO\äLÿèäˆäLìã$ãLì¤äLèäLøÀäLê â$ãL ä€åL˜RäàäLTãL˜RåLÿèäHåLäÀäLäã$ãLìdåLèäLøÀäLê0æL ÐäåLTãL ÐÌåLâÿèäøåLìáá$ãLêæLèäLøLbìàæLÐî ä@æLTãLÐî |æLâÿè䍿Lìáá$ãLêÄæLèäLø8oìçLÀÔäðæLTãLÀÔ,çLâÿèäXçLìáá$ãLêtçLèäLø8oì@èL°è ä çLTãL°è ÜçLâÿèäèLìáá$ãLê$èLèäLø8oìðèL¯äPèLTãL¯ŒèLâÿèä¸èLìáá$ãL êÔèLèäLøPÏIðåéL$ãLæˆbì,éL$ãLä(ââTãL4ž héLÿä(ìâ ±ò}TŽe++Ñë8oì¸éLFä LeJÐéLøEäÈéLTjJâêL`oäàéLæ`o´OâÿåhêLŒ¨ä,êL挨´OâÿåPëLHoäxêLâ 8ëLHoêLèæ¨êLäð¸ ä ÀêLÔÐêLì ØêL„ÎêLê ðêLÔEêLê ëL ÏêLê ëL(ä êLê xêLlc êLîêLéìLìnä`ëLäìnœëLÿìääëLä¸ëLçá âÈëLæ÷í¸ëLì¤ïLä äìLìLæâLìLø„ètïLèâ@êø„äìLälìLãá<íL˜Rä|ìLLìL˜R¸ìLÿèäôìLääìLäãìLì âìL ä íLèíLì âìLðäìLêdíLð™äLíLæð™ì¥KäâdïL¨3ätíLâ LíL¨3ŒíLäââ¼íLˆQè4ïLèâpêˆQäŒíLäÜíLãá¬îL˜RäìíL¼íL˜R(îLÿèädîLäTîLäãŒíLì âŒíL äîLè€îLì âŒíLðTîLêÔîL`èä¼îLæ`èè âüîLÜì ääîLâ¼îLÜì èâ$ïLXqä ïLâäîLXqèâLïL0Ãä4ïLâ ïL0ÃðˆQä\ïLŒíLâŒïLT ätïLâtíLT ðø„äœïLìLâ”ñL`¨ä´ïL¼ïLââìïL`¨èdñLèâ@ê`¨ä¼ïLä ðLãáÜðL˜RäðLìïL˜RXðLÿèä”ðLä„ðLäã¼ïLì â¼ïL äÀðLè°ðLì â¼ïLð„ðLêñLÈäìðLæÈè â,ñLØÙ äñLâìðLØÙ èâTñLhª ä<ñLâñLhª èâ|ñL<¸ ädñLâ<ñL<¸ ð`¨äŒñL¼ïLâtóL8¨ä¤ñL°ñLæHâàñLìÈèDóLèâ@êìÈä°ñLåòLãáÐòL˜RäòLàñL˜RLòLÿèäˆòLäxòLäã°ñLì â°ñL ä´òLè¤òLì â°ñLðxòLê óLHäàòLæHøòLäâ @ê@ä4óL8ÏäóLâàòL8Ïèâ\óLàÏäDóLâóLàÏðìÈälóL°ñLâhõL´ ä„óLä´ ÀóLÿìäLõLäÜóLçá âìóLæâôL dèõLèâpê däìóLä<ôLãá õL˜RäLôLôL˜RˆôLÿèäÄôLä´ôLäãìóLì âìóL äðôLèàôLì âìóLð´ôLê4õLXääõLæXäð däDõLìóLîÜóLì0÷LÔ2äxõL€õLâ â°õLÔ2é÷LèâpêÔ2ä€õLäÐõLãá öL˜RäàõL°õL˜RöLÿèäXöLäHöLäã€õLì â€õL ä„öLètöLì â€õLðHöLêÈöLls ä°öLæls èâðöLpåØöLâ°öLpéâ÷L€Äå÷LâØöL€ÄðÔ2ä(÷L€õLâ ùLÈnä@÷LH÷Lââx÷LÈnèðøLèâpêÈnäH÷Lä˜÷LãáhøL˜Rä¨÷Lx÷L˜Rä÷Lÿèä øLäøLäãH÷Lì âH÷L äLøLè<øLì âH÷LðøLêøL˜iäxøLæ˜ièâ¸øL8M ä øLâxøL8M è âàøL ä8MâM\> èâxMìuä`Mâ8Mìuð,äˆMLùLæ¤Eä M¬Mæ â¼MæpâìM°Kè@Mèâpê°Kä¼Mä M ãáÜM˜RäMìM˜RXMÿèä”Mä„Mäã¼Mì â¼M äÀMè°Mì â¼Mð„MêMèx äìMæèx èlâ@M8oäMâ ìM8o,Mäâ PêPähM¼äPMâM¼èâM´- äxMâPM´- èâ¸M$Çä MâxM$ÇèâàMä*äÈMâ Mä*è âM°”äðMâÈM°”èâ0MxäMâðMxèâXMlaå@MâMlañ°KähM¼Mâ` M€pä€Mä€p¼MäÿåäØMïáôMè|JöMì â Mæ4âPM¼© è0 Mèâp꼩 ä MäpMãá@M˜Rä€MPM˜R¼MÿèäøMäèMäã Mì â M ä$MèMì â MðèMêhM4® äPMæ4® è0âM°;äxMâPM°;è,â¸MLä MâxMLè(âàM»äÈMâ M»è$âM$¨äðMâÈM$¨è â0Mtæ äMâðMtæ èâXMˆÕ ä@MâMˆÕ èâ€MˆähMâ @Mˆ|Jäâ¨MêåMâhMêá|JäâÐMLÎä¸Mâ MLÎ|Jä âøM´ÂäàMâ¸M´Âèâ Mls ä MâàMls èâH Mìâä0 Mâ Mìâ𼩠äX M Mâ(M˜€ äp M䘀 ¬ MÿìäÈ MïáÔMèä Mì âô Mæâ $ MÌåPMèdMä @ápÄMæÌåäô MäD Mãá"  MôOè MT M$ MôO Mÿèä¼ Mìãô MøØ Mì âô Mèð M$ MôO, MÿèäX Mìãô Mìt MèØ Mø Mê âô M äP M˜Rä° M$ M˜Rì Mÿèä Mä Mäãô Mì4 MèØ Mø MêLM,”ä` M$ M,”œ MâÿèäÈ Mìááô Mêä MèØ Mí Mÿä Mì â, Mæâ\ MÌnèMèâpêÌnä, Mä| MãáLM˜RäŒ M\ M˜RÈ MÿèäMäô Mäã, Mì â, M ä0Mè Mì â, Mðô Mê MÌÅä\MæÌÅtMäâ â„Mæ â´M”¸ èÜMèâpꔸ ä„MäÔMãá¤M˜RääM´M˜R Mÿèä\MäLMäã„Mì â„M äˆMèxMì â„MðLMêÌMì×ä´Mæì×BJäâôM$ äÜMâ ´M$ ´O씸 äM„Mâ4Mœ7 äMâ\Mœ7 ðÌnäDM, MâMÀ ä\M$ MÀ ˜MâÿèäÄMìááô MŒêàMèØ MìüMÿä MíMô[ä(M$ Mô[dMâÿèäMìááô Mˆê¬MèØ MìÈMøäMÿä MìÌM² äM$ M² LMâÿèäxMìááô M„ê”MèØ Mì°Mÿä Mì|Mdi äÜM$ Mdi MâÿèäDMìááô M€ê`MèØ Mø MìœMì˜äŒM$ Mì˜ÈMâÿèäôMìááô M|êMèØ Mì,MøHMødMè8oì€MèLbø8oì„MH ä¬M$ MH èMâÿèäMìááô Mxê0MèØ MìLMøhMè|P÷BJìlM0ì ä”M$ M0ì ÐMâÿèäüMìááô MtêMèØ Mì4MøPMè|P÷BJìpM„å |M$ M„á¸MâÿèääMìááô MpëMèØ MìMø8MøTMè|P÷BJìXMˆ#å €M$ Mˆ#á¼MâÿèäèMìááô MlêMèØ Mì Mø<Mè|P÷BJì$MlnähM$ Mln¤MâÿèäÐMìááô MhêìMèØ MìMè|P÷BJìðMhÛä4M$ MhÛpMâÿèäœMìááô Mdê¸MèØ MìÔMÿäpìØMØåM$ MØ<MâÿèähMìááô M`ê„MèØ Mì Mø¼MèìdJøpìˆM ÀäèM$ M À$MâÿèäPMìááô M\êlMèØ MøLbì8M Fä˜M$ M FÔMâÿèåMìááô MXêMèØ MùJðÌåäHMô Mæ´PJìtMô Mäœââ$ MÐ{°MÿäœìâäÀåFðMø Mÿä MìM(©ä8MDMæ âTMæ â„M ¡èÔMèâpê ¡äTMä¤MãátM˜Rä´M„M˜RðMÿèä,MäMäãTMì âTM äXMèHMì âTMðMêœM¢ ä„Mæ¢ |JäâÄMÈ/ ä¬Mâ „MÈ/ |JäâìM cåÔMâ¬M cá|Jì ¡äüMTM⸠MDäM Mæ â0Mæâ`M¤èˆ Mèâpê¤ä0Mä€MãáP M˜RäM`M˜RÌMÿèä MäøMäã0Mì â0M ä4 Mè$ Mì â0MðøMêx M°ä` Mæ°èâ  M\D äˆ Mâ ` M\D ˜ì¤ä° M0Mâ”!M0äÈ MÔ Mææì Mä1 ä!M áÔ Mì !M…Ô Mê 4!M@ÖÔ Mê L!M<Ô Mê d!MìrÔ Mê |!M8‹Ô MîX‰ Ô Mè4"M©ä¤!Mâ Ô!M©¼!Mêæ¤!Mät‡ä ì!M@†¼!Mê "M ¼!Mê "Mà¼!M¼!Mèd%M`€ äD"ML"Mâ0â|"M`€ è4%Mèâpê`€ äL"Mäœ"Mãál#M˜Rä¬"M|"M˜Rè"Mÿèä$#Mä#MäãL"Mì âL"M äP#Mè@#Mì âL"Mð#Mê”#MÐuä|#MæÐuÜóLä,â¼#Má¡ä¤#Mâ|#Má¡ÜóLä(âä#M0©äÌ#Mâ¤#M0©è$â $M ùäô#MâÌ#M ùè â4$MÈI ä$Mâ ô#MÈI ¬Käâ\$MÛ äD$Mâ $MÛ ¬Käâ„$MXsäl$Mâ D$MXs¬Käâ¬$Mx€ä”$Mâl$Mx€èâÔ$M¤vä¼$Mâ”$M¤vè âü$MHåä$Mâ¼$MHáœBäâ$%M˜“ä %Mâä$M˜“èâL%M´ä4%Mâ %M´ð`€ ä\%ML"Mã&M\3ät%M€%Mæ â%Mæä¬%MïáÈ%Møä%Mÿô)M pä&M&Mæ â,&Mæ@á\&M¤­èì(Mèâp꤭ä,&Mä|&M ãáL'M˜RäŒ&M\&M˜RÈ&Mÿèä'Mäô&Mäã,&Mì â,&M ä0'Mè 'Mì â,&Mðô&Mêˆ'M$iä\'Mæ$it'Mä0á êäÄ'MŒ(ä˜'Mâ \'MŒ(°'Mä,â éãì'M˜?äÔ'Mâ˜'M˜?è(â(Mä>äü'MâÔ'Mä>è$â<(MÐCä$(Mâü'MÐCè âd(MŒ6äL(Mâ$(MŒ6èâŒ(MpT ät(Mâ L(MpT Räâ´(MD äœ(Mâ t(MD Rä âÜ(MØBäÄ(Mâ œ(MØBRäâ)M¼¬äì(MâÄ(M¼¬ð¤­ä)M,&Mâ¨*M´å,)M8)Mæ âH)Mæâx)Mdj èx*Mèâpêdj äH)Mä˜)Mãáh*M˜Rä¨)Mx)M˜Rä)Mÿèä *Mä*MäãH)Mì âH)M äL*Mè<*Mì âH)Mð*Mê*MXääx*MæXäðdj ä *MH)MâØ-M 3ä¸*MÄ*Mæ âÔ*Mæœâ+ML$è¨-MèâpêL$äÔ*Mä$+M ãáô+M˜Rä4+M+M˜Rp+Mÿèä¬+Mäœ+MäãÔ*Mì âÔ*M äØ+MèÈ+Mì âÔ*Mðœ+Mê,MÈ ä,MæÈ è›âD,M<}ä,,Mâ,M<}èšâl,Mt'äT,Mâ,,Mt'è˜â”,Môä|,MâT,Môè–â¼,M¼åä¤,Mâ|,M¼åè”âø,M CäÌ,Mâ ¤,M Cä,Mäâ €ê€ä -MÔÀ ä-MâÌ,MÔÀ èâH-MÐ ä0-Mâ-MÐ è âp-MÀÿäX-Mâ0-MÀÿèâ˜-M ßä€-MâX-M ßèâÀ-M´œ ä¨-Mâ€-M´œ ðL$äÐ-MÔ*Mâð-M€ äè-MD´Kæèå.M.Mâ â8.Mèèˆ/Mèâpêèä.MäX.Mãá(/M˜Räh.M8.M˜R¤.Mÿèäà.MäÐ.Mäã.Mì â.M ä /Mèü.Mì â.MðÐ.MêP/M´}ä8/Mæ´}èâx/M|^ ä`/Mâ8/M|^ èâ /Mðäˆ/Mâ `/Mð¼tLìèä°/M.Mâ0MqäÈ/Mäq0Mÿìä 0Mïá<0MèlÍJìX0MèôIìt0Mè°"JøLbìT]Má D]M 0M¬0MæâÜ0MáÀ\MèÔ\Mä @áp4]Mæå¬0Mäü0M ãá"X2MôO 1M 1MÜ0MôOH1Mÿèät1Mìã¬0Mø1Mì â¬0Mè¨1MÜ0MôOä1Mÿèä2Mìã¬0Mì,2Mè1MøH2Mê â¬0M ä3M˜Räh2MÜ0M˜R¤2MÿèäÐ2MäH2Mäã¬0Mìì2Mè1MøH2MêÈ3MÔñä3MÜ0MÔñT3Mâÿèä€3Mìáá¬0M8êœ3Mè1Mø¸3Mê âŒíLæ\4M0äØ3MÜ0M04Mâÿèä@4Mìáá¬0M4ö1Mìð4Mäl4MÜ0M¨4MâÿèäÔ4Mìáá¬0M0ö1Mì„5M´å5MÜ0M´<5Mâÿèäh5Mìáá¬0M,ö1Mì46Møå ”5MÜ0MøáÐ5Mâÿèäü5Mìáá¬0M(ê6Mè1Mÿèl8M` äD6MÜ0M` €6Mâÿèä¬6Mìáá¬0M$êÈ6Mè1Møä6Mìâ7M@) è<8Mèâpê@) ää6Mä47Mãá8M˜RäD7M7M˜R€7Mÿèä¼7Mä¬7Mäãä6Mì âä6M äè7MèØ7Mì âä6Mð¬7Mê,8MLä8MæLèâT8Màä<8Mâ8Màð@) äd8Mä6MâìZMàÈä|8MÜ0Màȸ8Mâÿèää8Mìáá¬0M ë9Mè1MììVMè9Mì â,9Mæ â<9Mæâ l9M¤:lEMè|VMä @ápÜVMæ¤:ä<9MäŒ9M ãá"è:MôO0:Mœ9Ml9MôOØ9Mÿèä:Mìã<9Mø :Mì â<9Mè8:Ml9MôOt:Mÿèä :Mìã<9Mì¼:Mè :MøØ:Mê â<9M ä˜;M˜Räø:Ml9M˜R4;Mÿèä`;MäØ:Mäã<9Mì|;Mè :MøØ:Mêœ>M‰å ¨;Ml9M‰áä;MâÿèäMèHMèâpêh¤äXM¨ªå>MâØ=M¨ªèâ@>MPGä(>Mã>MPGèâh>M4¶äP>Mâ (>M4¶ÈBìh¤äx>MXMl9MÀè>Mâÿèä?Mìáá<9M4ê0?Mè :Mÿèü?M¸û ä\?Ml9M¸û ˜?MâÿèäÄ?Mìáá<9M0êà?Mè :Mø|JêBMìu ä @Ml9Mìu H@Mâÿèät@Mìáá<9M,ê@Mè :Mø¬@Mì â¼@Mæâì@Mt2èìAMèâpêt2ä¼@Mä AMãáÜAM˜RäAMì@M˜RXAMÿèä”AMä„AMäã¼@Mì â¼@M äÀAMè°AMì â¼@Mð„AMêBMXääìAMæXäðt2äBM¼@MâCM„Jå ,BMl9M„JáhBMâÿèä”BMìáá<9M(ê°BMè :MìÌBMè¬@MìèBMèœBøÈBìTEMìà äCMl9Mìà PCMâÿèä|CMìáá<9M$ê˜CMè :Mì´CMè¬@MøÐCMì âàCMæâDM¨ÌèEMèâpê¨ÌäàCMä0DMãâEM˜Rä@DMDM˜R|DMÿèä¸DMä¨DMäãàCMì âàCM ääDMèÔDMì âàCMð¨DMêäàkMâ¤kMX>èâ lML†ålMâàkML†ñäå0lMÀiMâ zMÀ“ äHlMäÀ“ „lMááÿåä lMïDáðyMè¼lMì âÌlMæ@âülMœÂèÀyMèâpêœÂäÌlMämM ãáìmM˜Rä,mMülM˜RhmMÿèä¤mMä”mMäãÌlMì âÌlM äÐmMèÀmMì âÌlMð”mMê(nMTŽäümMæTŽnMä0â êäÈwMx.å8nMâümMx.áPnMä ââ€nMœè@vMèpæülMœäPnMä nMãápoM˜Rä°nM€nM˜RìnMÿèä(oMäoMäãPnMì âPnM äToMèDoMì âPnMðoMêxpMÈ— ä€oMæÈ— ˜oMè â¨oMæäÄoMïáàoMè¼lMìüoMèœBøpMìæ0pMäd ä HpMÐu pMì `pMGpMî|°pMè pMáRäˆpMâ€oMáRœBè8rMá¶ä°pMâˆpMá¶ÈpMèâøpMðµè rMèâpæ€nMðµäÈpMäqMãáèqM˜Rä(qMøpM˜RdqMÿèä qMäqMäãÈpMì âÈpM äÌqMè¼qMì âÈpMðqMêrMt² äøqMæt² èæ¬Çä rMâ øqM¬ÇÈBè0vMääHrMâ °pMä`rMèârMðèvMèâpæ€nMðä`rMä°rMãá€sM˜RäÀrMrM˜RürMÿèä8sMä(sMäã`rMì â`rM ädsMèTsMì â`rMð(sMê¸uMˆùäsMæˆù¨sMä â â¸sMæâèsM¨‡èˆuMèâpꨇä¸sMätMãáØtM˜RätMèsM˜RTtMÿèätMä€tMäã¸sMì â¸sM ä¼tMè¬tMì â¸sMð€tMëuMáRäètMçRœBäâ(uMãäuMâètMãè âPuM¨n ä8uMâuM¨n èâxuMÀÝä`uMâ8uMÀÝèâ uMìwäˆuMâ`uMìwð¨‡ä°uM¸sMâàuMœ´äÈuMâsMœ´èâvM»äðuMâÈuM»èæø×ävMâ ðuMø×œBìL‚ä@vMâ HrML‚XvMèâˆvMˆ÷è°wMèâpæ€nMˆ÷äXvMä¨vMãáxwM˜Rä¸vMˆvM˜RôvMÿèä0wMä wMäãXvMì âXvM ä\wMèLwMì âXvMð wMê wMäˆwMæœBäæÈ— ä°wMâ ˆwMÈ— ˜oMè˜xMX¾äØwMâ 8nMX¾ðwMäâæxMä˜ä xMD ðwMì 8xM€z ðwMêPxMá ðwMê hxM”¤ðwMê €xM¨ö ðwMît‚ðwMèÀxM°ä¨xMâ ØwM°pMäâèxMtÔäÐxMâ ¨xMtÔœBäâyM¬yäøxMâ ÐxM¬yœBäâ8yMHP ä yMâ øxMHP œBäâ`yMLxäHyMâ yMLxè âˆyMH'äpyMâHyMH'èâ°yM¬Êå˜yMâpyM¬ÊéâØyMè äÀyMâ˜yMè ðœÂäèyMÌlMþtzM “ äzMä “ XzMááÿå÷Dá¼{Mˆ“ ä„zM䈓 ÀzMááÿåäÜzMïDáøzMèì¥Kì{Mø0{MøL{Møh{Mè¸3Mê„{Mè ˜ê {MÿäîêH}M´©äÌ{MØ{Mæ âè{Mæâ|MìZè}MèâpêìZäè{Mä8|Mãá}M˜RäH|M|M˜R„|MÿèäÀ|Mä°|Mäãè{Mì âè{M äì|MèÜ|Mì âè{Mð°|Mê0}MXää}MæXäðìZä@}Mè{MæÈå X}MÌkÈáH-òàG-öP~Mtqä¤}Mätqà}Mááÿåäü}MïDá~MèœBì4~MÿäÓIì8M Hä`~Mâ M Hx~Mèæ~M䜗 ä ¨~M0Æx~Mì À~M §x~Mê Ø~MDÍx~Mê ð~MÀjx~Mê MpÛx~Mê `~MÄx~MîØGx~Mè€MôGäHMäôG„Mÿìä Mïá¼MèèvJìØMè|JìôMÿä”PJìÔ£M¼Gä €Mä¼G\€Mÿìäx€MïḣM蔀Mì ⤀Mæâ Ô€M¤¸ŽMèH£Mä @áp¨£Mæ¤ä¤€Mäô€Mãá"P‚MôO˜MMÔ€MôO@MÿèälMì㤀MøˆMì ⤀Mè MÔ€MôOÜMÿèä‚Mì㤀Mì$‚MèˆMø@‚Mê ⤀M åƒM˜Rä`‚MÔ€M˜Rœ‚MÿèäÈ‚Mä@‚Mä㤀Mìä‚MèˆMø@‚Mê°ƒM„ÂäƒMÔ€M„ÂLƒMâÿèäxƒMìáᤀM ê”ƒMèˆMø|JìD„M€XäÀƒMÔ€M€XüƒMâÿèä(„MìáᤀMœöˆMì…M¬÷äT„MÔ€M¬÷„Mâÿè伄MìáᤀM˜êØ„MèˆMìô„MÿôÜ…MDÀä …MÔ€MDÀ\…Mâÿè䈅MìáᤀM”꤅MèˆMìÀ…MÿôŒ†Má ä ì…MÔ€Má (†MâÿèäT†MìáᤀMêp†MèˆMÿèt‡MÔ‰å œ†MÔ€MÔ‰á؆Mâÿèä‡MìáᤀMŒê ‡MèˆMì<‡MøX‡Mè|P÷BJì\ˆMlÖ ä„‡MÔ€MlÖ À‡Mâÿèäì‡MìáᤀMˆêˆMèˆMì$ˆMø@ˆMè|P÷BJì`‰M¤ å lˆMÔ€M¤ ᨈMâÿèäÔˆMìáᤀM„êðˆMèˆMì ‰Mø(‰MøD‰Mè|P÷BJìHŠM`»äp‰MÔ€M`»¬‰Mâÿèä؉MìáᤀM€êô‰MèˆMìŠMø,ŠMè|P÷BJì‹M´âäXŠMÔ€M´â”ŠMâÿèäÀŠMìáᤀM|êÜŠMèˆMìøŠMè|P÷BJìÄ‹Máää $‹MÔ€Máä`‹Mâÿè䌋MìáᤀMxꨋMèˆMÿètŒM˜®äÔ‹MÔ€M˜®ŒMâÿèä<ŒMìáᤀMtêXŒMèˆMÿè$MH×å „ŒMÔ€MH×áÀŒMâÿèäìŒMìáᤀMpêMèˆMÿèðMpƒ ä4MÔ€Mpƒ pMâÿèäœMìáᤀMlê¸MèˆMìÔMÿäìdJì ŽM0N åŽMÔ€M0N <ŽMâÿèähŽMìáᤀMhꄎMèˆMÿì¤ä°ŽM¤€MæÌŽMìâ üŽMŒÄ¢MèØ¢Mä @áp8£MæŒäÌŽMäMãá"xMôOÀM,MüŽMôOhMÿèä”MìãÌŽMø°Mì âÌŽMèÈMüŽMôOMÿèä0MìãÌŽMìLMè°MøhMê âÌŽM ä(‘M˜RäˆMüŽM˜RÄMÿèäðMähMäãÌŽMì ‘Mè°MøhM꼑Mt» ä8‘MüŽMt» t‘Mâÿèä ‘MìááÌŽMdö°Mì|’M$äÌ‘MüŽM$’Mâÿèä4’MìááÌŽM`êP’Mè°Møl’Mì âpZJæH“MÈß䌒MüŽMÈßÈ’Mâÿèäô’MìááÌŽM\ê“Mè°Mì,“Mÿä|Jì”M îäX“MüŽM î”“MâÿèäÀ“MìááÌŽMXêÜ“Mè°Mìø“Mÿôà”M˜& ä$”MüŽM˜& `”Mâÿè䌔MìááÌŽMTꨔMè°MìÄ”Mÿô¬•MTäð”MüŽMT,•MâÿèäX•MìááÌŽMPêt•Mè°Mì•Mÿä|Jìx–MìJ伕MüŽMìJø•Mâÿèä$–MìááÌŽMLê@–Mè°Mì\–Mÿä|Jì`—M c 䈖MüŽM c Ä–Mâÿèäð–MìááÌŽMHê —Mè°Mì(—MøD—Mè|Jø|Jì˜M`1 äp—MüŽM`1 ¬—Mâÿè䨗MìááÌŽMDêô—Mè°Mø´_JìܘMxä ˜MüŽMx\˜Mâÿè䈘MìááÌŽM@ꤘMè°MìÀ˜Mÿä|JìÄ™MXäì˜MüŽMX(™MâÿèäT™MìááÌŽM<êp™Mè°M쌙Mø¨™Mè8oÿèšM´F äÔ™MüŽM´F šMâÿèä<šMìááÌŽM8êXšMè°MìtšMÿäÀSJì@›Mèsä šMüŽMèsÜšMâÿèä›MìááÌŽM4ê$›Mè°Mø|Jìð›M$¯äP›MüŽM$¯Œ›Mâÿè丛MìááÌŽM0êÔ›Mè°Mÿ輜MÄ åœMüŽMÄ <œMâÿèähœMìááÌŽM,ꄜMè°Mì œMÿôˆM äÌœMüŽM Mâÿèä4MìááÌŽM(êPMè°MìlMÿôTžMÔ ä˜MüŽMÔ ÔMâÿèåžMìááÌŽM$êžMè°Mì8žMÿä\aJì ŸM¢ ädžMüŽM¢  žMâÿèäÌžMìááÌŽM êèžMè°MìŸMè¤PJøLbììŸMËä0ŸMüŽMËlŸMâÿè䘟MìááÌŽMê´ŸMè°MìПMÿôœ M`ãäüŸMüŽM`ã8 Mâÿèäd MìááÌŽMꀠMè°MÿèL¡Mð䬠MüŽMðè Mâÿèä¡MìááÌŽMê0¡Mè°Mø|Jìü¡M‹ä\¡MüŽM‹˜¡MâÿèäÄ¡MìááÌŽMêà¡Mè°Mÿ謢M”¡å ¢MüŽM”¡áH¢Mâÿèät¢MìááÌŽM ê¢Mè°Mø|PîŒä¼¢MÌŽMæˆbìè¢MÌŽMäpââüŽMȼ $£MÿäpìâäÀåFX£M¤€Mä¬ââÔ€Mô”£Mÿä¬ìâäÀåFû¬¤M45ää£Mä45 ¤Mÿìä<¤MïáX¤MèlÍJìt¤MèôIì¤Mè°"JøLb켤Møå ´®Jl¥M4ªä̤Mä4ª¥Mááÿåä$¥MïDá@¥Mÿä\¥Mì âÐXLæH©M\” ä|¥Mˆ¥Mæâ¸¥M8] è©Mèâpê8] 䈥M䨥MãᨦM˜Räè¥M¸¥M˜R$¦Mÿèä`¦MäP¦Mä㈥Mì ∥M 䌦Mè|¦Mì ∥MðP¦Mê¨M€ñ並Mæ€ñЦMäâ âà¦Mæ â§M˜Ÿè`¨Mèâpꘟäà¦Mä0§Mãâ¨M˜Rä@§M§M˜R|§Mÿè丧M䨧Mäãà¦Mì âà¦M ää§MèÔ§Mì âà¦Mð¨§Mê(¨Mˆ\ä¨Mæˆ\ KäâP¨Mð´ä8¨Mâ¨Mð´èâx¨Mž ä`¨Mâ 8¨Mž ˜ì˜Ÿäˆ¨Mà¦M⸨M1 ä ¨M⸦M1 èâà¨MÖäȨMâ  ¨MÖ°Käâ©M€4 äð¨Mâ ȨM€4 ˜äâ0©MÈœ ä©Mâ ð¨MÈœ ˜ì8] ä@©Mˆ¥Mâ`©MäåX©MÀiMâÔ¶M`åp©M|©MæÔ⬩MŒß褶MèâpêŒßä|©MäÌ©M"ãᜪM˜RäÜ©M¬©M˜RªMÿèäTªMäDªMäã|©Mì â|©M 䀪MèpªMì â|©MðDªMêĪM°S 䬪Mæ°S ˜äÐâìªM°àäÔªMâ ¬ªM°à ˜äÌâ«Mä± äüªMâ ÔªMä± ˜äÈâ<«M” ä$«Mâ üªM” ˜äÄâd«MÈäL«Mâ$«MÈèÀ⌫MHD ät«MâL«MHD è¼â´«MÌE䜫Mât«MÌEè¸âÜ«MáSäÄ«M✫MáSè´â¬Møcäì«Mâ Ä«Møcð$Kä¬â,¬MÒä¬Mâ ì«MÒð$Kä¤âT¬MØ ä<¬Mâ ¬MØ ð$Käœâ|¬M8&äd¬Mâ <¬M8&ð$Kä”⤬Mx 䌬Mâd¬Mx èâ̬M Dä´¬M⌬M DèŒâô¬MtÙ äܬMâ´¬MtÙ èˆâ­ML6ä­MâܬML6è„âD­M ¢ä,­Mâ ­M ¢ŒíLätâl­MÄœäT­Mâ,­MÄœèpâ”­MØ ä|­MâT­MØ èlâ¼­M$ 䤭Mâ|­M$ èhâä­M8ûäÌ­M⤭M8ûèdâ ®Mü äô­MâÌ­Mü è`â4®MÐæä®Mâô­MÐæè\â\®M4çäD®Mâ®M4çèXâ„®M¸Áäl®MâD®M¸ÁèT⬮MHeä”®Mâl®MHeèPâÔ®Mè—ä¼®Mâ”®Mè—èLâü®M ää®Mâ¼®M èHâì±Mxï ä ¯Mâ ä®Mxï $¯Mä=â âT¯Mܑ輱MèâpêÜ‘ä$¯Mät¯M ãáD°M˜R䄯MT¯M˜RÀ¯Mÿèäü¯Mäì¯Mäã$¯Mì â$¯M ä(°Mè°Mì â$¯Mðì¯Mêl°M¬_äT°Mæ¬_è â”°Mlˆ ä|°MâT°Mlˆ èâ¼°MÌ䤰Mâ|°MÌèâä°Mì¨ä̰M⤰Mì¨èâ ±MŒá äô°Mâ̰MŒá èâ4±MÀg ä±Mâô°MÀg èâ\±MÔ# äD±Mâ±MÔ# èℱMP…äl±MâD±MP…è⬱MÌä”±Mâl±MÌèâÔ±Mü ä¼±Mâ”±Mü ðÜ‘ää±M$¯Mâ²M˜C äü±Mâ ¯M˜C è<â”¶M¬ª ä$²Mâ ü±M¬ª <²Mäâ8âl²M  èd¶Mèâpê  ä<²M䌲Mãá\³M˜R䜲Ml²M˜RزMÿèä³Mä³Mäã<²Mì â<²M ä@³Mè0³Mì â<²Mð³MꄳM ìäl³Mæ ìè4⬳M¸@䔳Mâl³M¸@è3âÔ³MdÞ ä¼³M┳MdÞ è2âü³MøŸää³Mâ¼³MøŸè1â$´Môä ´Mâä³Môè0âL´MÌÙ ä4´Mâ ´MÌÙ è/ât´M4 ä\´Mâ4´M4 è.✴M<Ô ä„´Mâ\´M<Ô è-âÄ´MH嬴Mâ„´MHé,âì´MPÝäÔ´M⬴MPÝè(âµMäÜäü´MâÔ´MäÜè$â<µMdºä$µMâü´Mdºè âdµMÔäLµMâ$µMÔè⌵M`ÔätµMâLµM`Ôèâ´µM°÷䜵MâtµM°÷èâܵMw äĵM✵Mw èâ¶Mè äìµMâĵMè è â,¶M3ä¶MâìµM3èâT¶MˆÚä<¶Mâ¶MˆÚèâ|¶MhÐäd¶Mâ<¶MhÐð  䌶M<²Mâ¼¶Mh~ 䤶Mâ$²Mh~ ðŒßä̶M|©Mâð¶Mì ää¶M€;Jê¬ å·Mä¬ <·Mâêt·MöäX·Mìýè·M ü·Måçäçæááxýâ`0é¡áÀVâT5ä4¹MäXâT5ìZâT5äDºMâZâT5ä »MäZâT5ì[âT5äL»Mä^âT5ì`âT5äx»M â`âT5äT¼Mä`âT5ìaâT5䀼MädâT5ìeâT5䬼Mäh¹Mä âðâ€å€å锹MºMøéÀ¹Mü2áîäì¹Mü:á`ûä¡ý4ì€ûépºMôºMøéœºMü2áîäȺMü:á`ûä¡ý4êÿÿü4êþ4êþ餻M(¼MøéлMü2áîäü»Mü:á`ûä¡ý4êÿÿü4êþ4êþ4êþ¿Mä5äè¼Mää5$½Mÿìä@½Mïá̾Mè\½Mì âl½Mæâœ½M ¿ 蜾Mèâpê ¿ äl½Mä¼½MãጾM˜Rä̽Mœ½M˜R¾MÿèäD¾Mä4¾Mäãl½Mì âl½M äp¾Mè`¾Mì âl½Mð4¾Mê´¾MXä䜾MæXäð ¿ äľMl½Mâè¾Mè ˜ÿè¬ÍM„Hä¿Mä„HP¿Mÿìäl¿Mïá<ÍM舿Mì ☿Mæâ È¿MÐ1 ¸ÌMèÌÌMä @áp,ÍMæÐ1 䘿Mäè¿Mãá"DÁMôOŒÀMø¿MÈ¿MôO4ÀMÿèä`ÀMì㘿Mø|ÀMì ☿Mè”ÀMÈ¿MôOÐÀMÿèäüÀMì㘿MìÁMè|ÀMø4ÁMê ☿M äôÁM˜RäTÁMÈ¿M˜RÁMÿèä¼ÁMä4ÁMä㘿MìØÁMè|ÀMø4ÁMêÄÉMˆÆäÂMÈ¿MˆÆ@ÂMâÿèälÂMìáᘿMêˆÂMè|ÀMì¤ÂMè|JêÀÂMè|JöÜÂMì âìÂMæ âüÂMæâ ,ÃMx@ÉMèTÉMä @áp´ÉMæxäüÂMäLÃMãá"¨ÄMôOðÃM\ÃM,ÃMôO˜ÃMÿèäÄÃMìãüÂMøàÃMì âüÂMèøÃM,ÃMôO4ÄMÿèä`ÄMìãüÂMì|ÄMèàÃMø˜ÄMê âüÂM äXÅM˜Rä¸ÄM,ÃM˜RôÄMÿèä ÅMä˜ÄMäãüÂMì<ÅMèàÃMø˜ÄMêÆMœ§ähÅM,ÃMœ§¤ÅMâÿèäÐÅMìááüÂMêìÅMèàÃMÿè˜ÇM,AäÆM,ÃM,ATÆMâÿè䀯MìááüÂMêœÆMèàÃMì¸ÆMøÔÆMøðÆMèTDì ÇMø(ÇMèTDìDÇMø`ÇMèX-ì|ÇMèX-ÿè(ÉMüFä¨ÇM,ÃMüFäÇMâÿèäÈMìááüÂM ê,ÈMèàÃMìHÈMødÈMø€ÈMèTDìœÈMø¸ÈMèTDìÔÈMøðÈMèX-ì ÉMèX-ÿìxä8ÉMüÂMæˆbìdÉMüÂMä ââ,ÃM =  ÉMÿä ìâ€LÑiŽÁЩÎ`—”# ÌMøª äÔÉMÈ¿Møª ÊMâÿèä<ÊMìáᘿM êXÊMè|ÀMìtÊMè|JêÊMè|Jê„ÌMè¬ÊMìâÜÊM([èTÌMèâpê([ä¬ÊMäüÊMãáÌËM˜Rä ËMÜÊM˜RHËMÿèä„ËMätËMäã¬ÊMì â¬ÊM ä°ËMè ËMì â¬ÊMðtËMêôËMÃäÜËMæÃè âÌMÜ äÌMâÜËMÜ èâDÌM44ä,ÌMâÌM44èâlÌM”½äTÌMâ,ÌM”½ð([ä|ÌM¬ÊMîÜÂMðÐ1 ä°ÌM˜¿MæˆbìÜÌM˜¿MäââÈ¿M|}ÍMÿäìãÞ½pŽÁЩÎ`—”#XÍMè|JêtÍMè|JêÍMè¬ÊMøÜÂMì„ÎMü‚ ä¼ÍMäü‚ øÍMÿìäÎMïá0ÎMèlÍJìLÎMèôIìhÎMè°"JøLbì°ÎM@á  ÎM”ÎMHÆKê¨ÎMHÆKâlÏMd«äÀÎMäd«üÎMááÿåäÏMïDá4ÏMè„ëIìPÏMÿä ìIì¸ÏML«ä|ÏMæL«´Oâÿå8ÕMÜ” äÈÏMäÜ” ÐMÿìä ÐMïí<ÐMì âLÐMæâ |ÐMt´ÔMèÈÔMä @áp(ÕMætÂäLÐMäœÐMãá"øÑMôO@ÑM¬ÐM|ÐMôOèÐMÿèäÑMìãLÐMø0ÑMì âLÐMèHÑM|ÐMôO„ÑMÿèä°ÑMìãLÐMìÌÑMè0ÑMøèÑMê âLÐM ä¨ÒM˜RäÒM|ÐM˜RDÒMÿèäpÒMäèÑMäãLÐMìŒÒMè0ÑMøèÑMê<ÓM”ä¸ÒM|ÐM”ôÒMâÿèä ÓMìááLÐMö0ÑMìÐÓM¬äLÓM|ÐM¬ˆÓMâÿèä´ÓMìááLÐMö0ÑMìœÔM€_ äàÓM|ÐM€_ ÔMâÿèäHÔMìááLÐM êdÔMè0ÑMì€ÔMÿøtÂä¬ÔMLÐMæˆbìØÔMLÐMä ââ|ÐM€ÕMÿä ìâ0æÀåFxÙM$räHÕMTÕMæ@â„ÕM<èHÙMèâpê<äTÕMä¤ÕMãátÖM˜Rä´ÕM„ÕM˜RðÕMÿèä,ÖMäÖMäãTÕMì âTÕM äXÖMèHÖMì âTÕMðÖMêœÖMÄ2ä„ÖMæÄ2œBä<âØÖM¸Üä¬ÖMâ „ÖM¸ÜÄÖMä2â ê å×MøRäèÖMâ¬ÖMøRè1â(×MÀä×MâèÖMÀè0â¨×M”Ää8×Mâ ×M”ÄP×Mä,â â`×Mæä|×Mïí˜×Mì âTÕMæÐ×MüÆä¸×Mâ8×MüÆè+âø×M„»åà×Mâ¸×M„»é*â4ØM äØMâ à×M ØMäâ êäpØM\ËäDØMâ ØM\Ë\ØMä â êä˜ØMøò䀨MâDØMøòèâÀØM”®ä¨ØMâ €ØM”®TDäâèØMü, äÐØMâ¨ØMü, èâÙMPp äøØMâÐØMPp èâ8ÙM(éä ÙMâøØM(éèâ`ÙM@ÈäHÙMâ ÙM@Èð<äpÙMTÕMâlÛM¬5äˆÙMä¬5ÄÙMááÿåäàÙMïDíüÙMì â ÚMæâ<ÚMPª è<ÛMèâ@êPª ä ÚMä\ÚMãá,ÛM˜RälÚM<ÚM˜R¨ÚMÿèääÚMäÔÚMäã ÚMì â ÚM äÛMéÛMì â ÚMðÔÚMêTÛMXää<ÛMæXäðPª ädÛM ÚMâäÜM̪ä|ÛM„ÛMââ´ÛM̪è´ÜMèâpê̪ä„ÛMäÔÛMãá¤ÜM˜RääÛM´ÛM˜R ÜMÿèä\ÜMäLÜMäã„ÛMì â„ÛM äˆÜMèxÜMì â„ÛMðLÜMêÌÜM̉ ä´ÜMæ̉ ,ÇJì̪äÜÜM„ÛMâÝM¤” äôÜMáÝMæ â|©Mêxªä ÝMX-æàÞMLä<ÝMHÝMæ âXÝMæâˆÝM¤a è°ÞMèâpê¤a äXÝMä¨ÝMãáxÞM˜Rä¸ÝMˆÝM˜RôÝMÿèä0ÞMä ÞMäãXÝMì âXÝM ä\ÞMèLÞMì âXÝMð ÞMê ÞM0[äˆÞMæ0[ ˜äâÈÞM¼Zä°ÞMâ ˆÞM¼Z ˜ì¤a äØÞMXÝMâ€ßMè6äðÞMäè6,ßMÿìäHßMïádßMèÔLø8oìüçMÀräßMäÀrÌßMÿìäèßMïáàçMèàMì âàMæâ DàMh*\çMèpçMä @ápÐçMæh*äàMädàMãá"ÀáMôOáMtàMDàMôO°àMÿèäÜàMìãàMøøàMì âàMèáMDàMôOLáMÿèäxáMìãàMì”áMèøàMø°áMê âàM äpâM˜RäÐáMDàM˜R âMÿèä8âMä°áMäãàMìTâMèøàMø°áMê0ãMìÉä€âMDàMìɼâMâÿèäèâMìááàMêãMèøàMø ãMì âàMæÄãM”ä@ãMDàM”|ãMâÿèä¨ãMìááàMöøàMìtäMpRäÔãMDàMpRäMâÿèä<äMìááàMêXäMèøàMÿèDçMwä„äMDàMwÀäMâÿèäìäMìááàM êåMèøàMì$åMø(çMè@åMì âPåMæâ€åMä¾èøæMèâpêä¾äPåMä åMãápæM˜Rä°åM€åM˜RìåMÿèä(æMäæMäãPåMì âPåM äTæMèDæMì âPåMðæMê˜æM´†ä€æMæ´†è âÀæMÔ|䍿Mâ€æMÔ|èâèæM ,äÐæMâ ¨æM ,|JäâçMü'åøæMâÐæMü'ñä¾ä çMPåMîLbðh*äTçMàMæˆbì€çMàMä$ââDàM(Ù ¼çMÿä$ìâåÀåFûœèM¨6ä èMä¨6HèMÿìädèMïá€èMèŒHMÿèèèMð«ä¬èMæð«´OâÿåéMtƒ äøèMJæÀéM„åéMä„áPéMááÿåäléMäèQLåDáˆéMèœBì¤éMÿähSLì˜ìM¸«äÐéM丫 êMááÿåä(êMïDáDêMÿä`êMì âpêMæ$â êMTSéhìMèâ@êTSåpêMäÀêMãáëM˜RäÐêM êM˜R ëMÿèäHëMä8ëMäãpêMì âpêM ätëMèdëMì âpêMð8ëMê¸ëMÔ4ä ëMæÔ4è âàëM¨3äÈëMâ  ëM¨3ŒíLäâìMüQåðëMâÈëMüQé â0ìMðÂäìMâðëMðÂèâXìM¬Çä@ìMâ ìM¬ÇÈBäâ€ìMìâähìMâ@ìMìâðTSåìMpêMâ¤îM`ƒ ä¨ìM´ìMæâäìM`ƒ è€îMèâpê`ƒ ä´ìMäíMãáÔíM˜RäíMäìM˜RPíMÿèäŒíMä|íMäã´ìMì â´ìM ä¸íMè¨íMì â´ìMð|íMêîMÀÁ ääíMæÀÁ üíMèæ<îM¬¯äîMâ äíM¬¯0îMèæpîM äLîMâ îM dîMèæã°Lä€îMâ LîM°L˜îMèç|óM<6ä´îMÀîMæ âÐîMæãïM|%èLóMèâpê|%äÐîMä ïMãáðïM˜Rä0ïMá ïM˜RlïMÿèä¨ïMä˜ïMäãÐîMì âÐîM äÔïMèÄïMì âÐîMð˜ïMê<óM”¼åðM攼ðMäâ â,ðMää â\ðMyè„ñMèâ`êyä,ðMä|ðMãáLñM˜RäŒðM\ðM˜RÈðMÿèäñMäôðMäã,ðMì â,ðM ä0ñMè ñMì â,ðMðôðMêtñMˆ€å\ñM戀éâ$óMHbå„ñMâ\ñMHbáœñMèâÌñM”WèôòMèâpê”WäœñMäìñMãá¼òM˜RäüñMÌñM˜R8òMÿèätòMädòMäãœñMì âœñM ä òMèòMì âœñMðdòMêäòMNäÌòMæNèâ óMœu äôòMâÌòMœu ð”WäóMœñMæyä4óM,ðMâdóMÀqåLóMãðMÀqñ|%ätóMÐîMâ˜õMÐHäŒóM˜óMæâÈóMM èhõMèâpêM ä˜óMäèóMãá¸ôM˜RäøóMÈóM˜R4ôMÿèäpôMä`ôMäã˜óMì â˜óM äœôMèŒôMì â˜óMð`ôMêàôM¤iäÈôMæ¤ièâõM°ç äðôMâÈôM°ç èâ0õMt äõMâðôMt èâXõMpjä@õMâõMpjèâ€õMHähõMâ@õMHðM äõM˜óMâ˜÷M6ä¨õMä6äõMÿìíöMê âöMæâ@öM¼“ èh÷Mèâp꼓 äöMä`öMãá0÷M˜RäpöM@öM˜R¬öMÿèäèöMäØöMäãöMì âöM ä÷Mè÷Mì âöMðØöMêX÷MŒ”ä@÷M挔áöMäâ€÷M… äh÷Mâ @÷M… à¯L켓 ä÷MöMâdùMDƒ ä¨÷M´÷Mæ âä÷MÜ= è4ùMèâpêÜ= ä´÷MäøMãáÔøM˜RäøMä÷M˜RPøMÿèäŒøMä|øMäã´÷Mì â´÷M 䏸Mè¨øMì â´÷Mð|øMêüøMø‡ääøMæø‡èâ$ùMg ä ùMâ äøMg ø,JäâLùMø´ ä4ùMâ ùMø´ ø,JìÜ= ä\ùM´÷Mæ,ƒ ä ì9<húMsä„ùMäsÀùMÿìäÜùMïáøùMè¤PJìúMø0úMè8oìLúMÿäpì@ûMPäxúMäP´úMÿìäÐúMïáìúMèlÍJìûMèôIì$ûMè°"JøLbììN€IäPûMä€IŒûMÿìä¨ûMïáÐNèÄûMì âÔûMæâ üMÐu LNè`Nä @ápÀNæÐu äÔûMä$üM ãá"€ýMôOÈüM4üMüMôOpüMÿèäœüMìãÔûMø¸üMì âÔûMèÐüMüMôO ýMÿèä8ýMìãÔûMìTýMè¸üMøpýMê âÔûM ä0þM˜RäýMüM˜RÌýMÿèäøýMäpýMäãÔûMìþMè¸üMøpýMêÄþM„ïä@þMüM„ï|þMâÿèä¨þMìááÔûM ö¸üMìXÿM,œäÔþMüM,œÿMâÿèä<ÿMìááÔûMö¸üMìNxähÿMüMx¤ÿMâÿèäÐÿMìááÔûMêìÿMè¸üMøLBKì¸NÄcäNüMÄcTNâÿèä€NìááÔûMêœNè¸üMøL7KìhN(Ì äÈNüM(Ì Nâÿèä0NìááÔûMêLNè¸üMÿè4Nìò äxNüMìò ´NâÿèäàNìááÔûM êüNè¸üMìNè>KøLbðÐu äDNÔûMæˆbìpNÔûMä,ââüM´ƒá ¬Nÿä,ìâåÀåFëL7Kì¤N4 åüNNæâ8Nè©ètNèâpêè©äNäXNãá(N˜RähN8N˜R¤NÿèäàNäÐNäãNì âN ä NèüNì âNðÐNêdN… ä8Næ… PNäâ êäŒNdPätNâ8NdPðè©äœNNâ|Nxsä´NäxsðNááÿåä NïDá(Nè ˜ìDNèœBì`NÿäLbì0N`säŒN˜Næ â¨NæâØNТéNèâpêТä¨NäøNãáÈN˜RäNØN˜RDNÿèä€NäpNäã¨Nì â¨N ä¬NèœNì â¨NðpNêðN` äØNæ` ›äâN¬)åNâØN¬)ðТä(N¨N✠N`Iä@NLNæâ|N2él Nèâ@ê2åLNäœN ãálN˜Rä¬N|N˜RèNÿèä$NäNäãLNì âLN äPNè@Nì âLNðNê”NXxä|NæXxÈBäâ¼N˜âä¤Nâ|N˜âèâäNL! äÌNâ ¤NL! |Jââ NØ^äôNâ ÌNØ^|Jâ â4 NÔØä Nâ ôNÔØ|Jââ\ NhŒäD Nâ NhŒèâ„ NT äl NâD NT ð2å” NLNâä Ná å¬ Nå áè Nÿìä Nïá Nø< Nè ˜ìX Nè ˜ìt Nè ˜ì Nè ˜ì¬ NèpìÈ Nè ˜øpìü NP¬äô Ná Næ â Næ â@ N@Ëè¸ Nèâpê@Ëä Nä` Nãá0 N˜Räp N@ N˜R¬ Nÿèäè NäØ Näã Nì â N ä Nè Nì â NðØ Nêl N4Gä@ Næ4GX Näâ êä¨ Nëä| Nâ @ Në” Näâ êää N,‘ä¸ Nâ | N,‘Ð Nè êè@Ëäô N Næˆä NäˆH Nÿìäd NïဠNè ˜êœ Nè ˜ÿæÀNH åÈ NäH áNÿìä Nïá¤Nè<Nì âLNæâ |N ^ Nè4Nä @áp”Næ ^ äLNäœNãá"øNôO@N¬N|NôOèNÿèäNìãLNø0Nì âLNèHN|NôO„Nÿèä°NìãLNìÌNè0NøèNê âLN ä¨N˜RäN|N˜RDNÿèäpNäèNäãLNìŒNè0NøèNêXNÀä¸N|NÀôNâÿèä NìááLNê<Nè0NÿèN ähN|N ¤NâÿèäÐNìááLN êìNè0Nø˜RMð ^ äNLNæˆbìDNLNäââ|N' €NÿäìâíÉêyùºÎŒ‚ªK© ë˜RMìÐNèƒ äÐNäèƒ Näÿåä(NïáDNè„ëIì`Nè ˜ê|Nè ˜ì˜Nø´NÿäPLì¨NôäàNäôNÿìä8NïáTNèlÍJìpNèôIìŒNè°"JøLbì€N­ä¸Nä­ôNÿìäNïá,NèlÍJìHNèôIìdNè°"JøLbìXN täNä tÌNÿìäèNïáNèlÍJì NèôIì<Nè°"JøLbìØNJähNtNæ â„Næ\â´N\èÀNèâpê\ä„NäÔNãá¤N˜RääN´N˜R Nÿèä\NäLNäã„Nì â„N äˆNèxNì â„NðLNêÌNv ä´Næv èXâôN<³äÜNâ ´N<³XšLäTâN¤ äNâÜN¤ á›LäPâàN”nä,Nâ N”nDNäLâ âTNæäpNïáŒNø¨Nè ˜ìÄNè ˜øœBìNìäðNâ,NìèHâ0Nœ› äNâðNœ› èDâXN¼Òä@NâN¼Òè@â€N¨‰ ähNâ @N¨‰ œBä<â¨Nls äNâhNls è8âÐN8ª ä¸Nâ N8ª ˜â4âøNl›åàNâ¸Nl›é0â N̶äNâ àN̶ ˜ä,âHNpä0NâNpè(âpNl}äXNâ 0Nl} ˜ä$â˜NØ ä€NâXNØ è âÀNd%ä¨Nâ €Nd%PÏIââèN¥äÐNâ¨N¥èâNÈDäøNâ ÐNÈD ˜äâ8N\xå NâøN\xéâ`N|zäHNâ N|z ˜ä âˆN _ äpNâHN _ èâ°NXåä˜Nâ pNXåÈBäæ< äÀNâ˜N< ìôNجäèN¼Jæˆ!NØäN Nâlâ<NØèX!NèâpêØä Nä\Nãá,N˜RälN<N˜R¨NÿèääNäÔNäã Nì â N äNéNì â NðÔNêÐ NŒ’ä<N挒TNäâ\â„Nt~ è  Nèâpêt~ äTNä¤NãátN˜Rä´N„N˜RðNÿèä,NäNäãTNì âTN äXNèHNì âTNðNê°N ä„Næ œNäâ @ê äØN€¡äÀNâ„N€¡èãNl~äèNâÀNl~èâ(Nü äNâèNü èâPN<úä8NâN<úèâxNÔ{ä`Nâ8NÔ{èâ Nœ‰äˆNâ`Nœ‰èâÈNìg ä°NâˆNìg èâðNTÌäØNâ°NTÌèâ N$øæ NâØN$øéâ@ Nè@ä( Nã Nè@è âh NÄ' äP Nâ( NÄ' èâ NX˜äx NâP NX˜è⸠N4#ä  Nâx N4#ðt~ äÈ NTNâø NÌäà Nâ<NÌè â !N(8ä!Nâà N(8èâH!Nè ä0!Nâ!Nè èâp!NìâäX!Nâ0!NìâðØä€!N Nâ "NЃ ä˜!NäЃ Ô!Nááÿåäð!NïDí|Jîxä"N("Næ@âX"NèUè˜$NèâpêèUä("Näx"N ãáH#N˜Räˆ"NX"N˜RÄ"Nÿèå#Näð"Näã("Nì â("N ä,#Nè#Nì â("Nðð"Nêp#N@AäX#Næ@Aè8â˜#Nüêä€#NâX#Nüêè0âÀ#N|¹ä¨#Nâ€#N|¹è(âè#N4^äÐ#Nâ¨#N4^è â$Nè… äø#NâÐ#Nè… èâ8$N|ºä $Nâø#N|ºèâ`$NlÀäH$Nâ $NlÀèâˆ$N(åäp$NâH$N(åèâ°$N(çä˜$Nâp$N(çðèUäÀ$N("NâL%N|– äØ$Nä|– %Nááÿåä0%NïDíhEìL&N„­ä\%Nâ 4&N„­t%NèæŒ%Näð^ä ¤%NDh t%Nì ¼%Nlyt%Nê Ô%NT> t%Nê ì%N„Ót%Nê &Nˆ\t%Nê &NÈ)t%Nê \%Nlt%Nî°Yt%Nèì&NÐ å\&NäÐ á˜&Nÿìä´&NïáÐ&Nè˜ÝKÿèÌ1N´„ äü&Nä´„ 8'NÿìäT'Nïá°1Nèp'Nì â€'Næâ °'Nf,1Nè@1Nä @áp 1Næfä€'NäÐ'N ãá",)NôOt(Nà'N°'NôO(NÿèäH(Nìã€'Nød(Nì â€'Nè|(N°'NôO¸(Nÿèää(Nìã€'Ní)Nèd(Nø)Nê â€'N äÜ)N˜Rä<)N°'N˜Rx)Nÿèä¤)Nä)Näã€'NìÀ)Nèd(Nø)Nêp*Nd äì)N°'Nd (*NâÿèäT*Nìáá€'N0öd(Nì +Nx6 ä€*N°'Nx6 ¼*Nâÿèäè*Nìáá€'N,ê+Nèd(NÿèÐ+N¨½ ä0+N°'N¨½ l+Nâÿèä˜+Nìáá€'N(ê´+Nèd(Nÿè€,N`ãäà+N°'N`ã,NâÿèäH,Nìáá€'N$êd,Nèd(Nÿè0-NìÙä,N°'NìÙÌ,Nâÿèäø,Nìáá€'N ê-Nèd(Nø|Jìà-Nðä@-N°'Nð|-Nâÿèä¨-Nìáá€'NêÄ-Nèd(Nø|Jì.N”¡å ð-N°'N”¡á,.NâÿèäX.Nìáá€'Nêt.Nèd(Nø|Pê\/NËä .N°'NËÜ.Nâÿèä/Nìáá€'Nê$/Nèd(Nì@/Nÿô 0N„Âäl/N°'N„¨/NâÿèäÔ/Nìáá€'Nêð/Nèd(Nø|Jì1Nìkä0N°'NìkX0Nâÿèä„0Nìáá€'N ê 0Nèd(Nì¼0Nè|JìØ0NèTjJøô0Nì â1Næ âÌŽMêfä$1N€'NæˆbìP1N€'Nä<ââ°'NT/Œ1Nÿä<ìâäÀåFë|Pê¤2N|„ äÜ1Nä|„ 2Nÿìä42NïáP2NèlÍJìl2NèôIìˆ2Nè°"JøLbìð2NHJä´2NæHJ´Oâÿå ü6N`­ì6Ná3N 3Næâ <3N`­h6Nè|6Nä @ápÜ6Næ`­ä 3Nä\3Nãá¸4NôOá4Nl3N<3NôO¨3NÿèäÔ3Nìã 3Nøð3Nì â 3Nè4N<3NôOD4Nÿèäp4Nìã 3NìŒ4Nèð3Nø¨4Nê â 3N äh5N˜RäÈ4N<3N˜R5Nÿèä05Nä¨4Näã 3NìL5Nèð3Nø¨4NêP6NØ] äx5N<3NØ] ´5Nâÿèäà5Nìáá 3N êü5Nèð3Nì6Nè„øIì46Nÿä„ëIð`­ä`6N 3NæˆbìŒ6N 3Näââ<3NGÈ6Nÿäìâ è¹ ë–yÒ‡.áøYãô6N 3NâÔ7N`„ ä 7Nä`„ H7Näÿåäd7Nïá€7Nøœ7Nè|Jê¸7Nè|JøLbìX8N| åä7Nä| á 8Nááÿåä<8NïDíœBð8äh8Nâ È8N8€8Nèæ˜8NäÄiä °8N@ €8Nê h8NŒP€8Nê à8N˜+ €8N ê ø8N¸b€8NîX=€8NèL;N8®ä 9Nä8®\9Nÿìäx9NäTDçá”9NèLbì°9NèTDøÌ9Nì âÜ9Næ âì9Næâ:N8aè;Nèâpê8aäì9Nä<:Nãá ;N˜RäL:N:N˜Rˆ:NÿèäÄ:Nä´:Näãì9Nì âì9N äð:Nèà:Nì âì9Nð´:Nê4;NXää;NæXäð8aäD;Nì9Nâh;ND… ä\;NœBæì;N09äx;Nä09´;NááÿåäÐ;NïDí¼p-ì>Nø8äü;NN >NæHâP>NÀ$ èèBNèâ`êÀ$ ä >Näp>Nãá@?N˜Rä€>NP>N˜R¼>Nÿèäø>Näè>Näã >Nì â >N ä$?Nè?Nì â >Nðè>Nêh?Nä1äP?Næä1èDâ?N€àäx?NâP?N€àè@â¸?Nü ä ?Nâx?Nü è<âà?N¤ äÈ?Nâ ?N¤ è8â@N ìäð?NâÈ?N ìè4â0@N¸@ä@Nâð?N¸@è3âX@NdÞ ä@@Nâ@NdÞ è2â€@NøŸäh@Nâ@@NøŸè1â¨@Nôä@Nâh@Nôè0âÐ@NÌÙ ä¸@Nâ@NÌÙ è/âø@N4 äà@Nâ¸@N4 è.â AN<Ô äANâà@N<Ô è-âHANHå0ANâANHé,âpANPÝäXANâ0ANPÝè(â˜ANäÜä€ANâXANäÜè$âÀANdºä¨ANâ€ANdºè âèANÔäÐANâ¨ANÔèâBN`ÔäøANâÐAN`Ôèâ8BN°÷ä BNâøAN°÷èâ`BNw äHBNâ BNw èâˆBNè äpBNâHBNè è â°BN3ä˜BNâpBN3èâØBNˆÚäÀBNâ˜BNˆÚèãCNhÐäèBNâÀBNhÐðÀ$ äCN >Nâ¸CN¸­ä(CN中dCNááÿåä€CNïDáœCNè|Jÿê¤äÈCNÐCNâ ãDN¤èFNèâpê¤äÐCNä DN ãáðDN˜Rä0DNá DN˜RlDNÿèä¨DNä˜DNäãÐCNì âÐCN äÔDNèÄDNì âÐCNð˜DNêEN„¡åENæ„¡<Käâ@EN,¾ä(ENã EN,¾ø,JäâhEN(6äPENâ (EN(6ø,JäâENàºäxENâ PENàºø,Jäâ¸EN,˜ ä ENâ xEN,˜ ø,Jä âàEN ãåÈENâ EN ãáø,JäâFN|¿ äðENâ ÈEN|¿ ø,Jäâ0FNL äFNâ ðENL €;Jì¤ä@FNÐCNâèFN8— äXFNä8— ”FNÿìä°FNïáÌFNè4mJøpìHHN— äøFNâ HN— GNáçæ(GN䘹 ä @GNPYGNê XGN\uGNê pGN| GNê ˆGNvGNê  GNì)GNê ¸GNx#GN ê ÐGNl!GN@ê èGNHˆ GN€ë HNGGNáéøFNá GNáé 0HN¨LGNáíðGNáçÜHNx9äXHNäx9”HNÿìä°HNïíÌHNì â¬0MæŒNN u|NNìHNøHNæâ (IN uøMNè NNä @áplNNæ uäøHNäHINãá"¤JNôOìINXIN(INôO”INÿèäÀINìãøHNøÜINì âøHNèôIN(INôO0JNÿèä\JNìãøHNìxJNèÜINø”JNê âøHN äTKN˜Rä´JN(IN˜RðJNÿèäKNä”JNäãøHNì8KNèÜINø”JNêàMN¨ ädKN(IN¨  KNâÿèäÌKNìááøHN êèKNèÜINìLNÿä LNì â0LNæ â`LNtïè°MNèâpêtïä0LNä€LNãáPMN˜RäLN`LN˜RÌLNÿèäMNäøLNäã0LNì â0LN ä4MNè$MNì â0LNðøLNêxMNTÓä`MNæTÓèâ MN Ð äˆMNâ `MN Ð „ëIäâÈMN| ä°MNâ ˆMN| PÏIêtïäØMN0LNæ uäðMNøHNæˆbìNNøHNäââ(INè" XNNÿäìâ æÀåFã„NNøHNâ¸QN”KäœNN¨NNæ âØNN(eéPNèâpê(eä¨NNäøNNãáÈON˜RäONØNN˜RDONÿèä€ONäpONäã¨NNì â¨NN ä¬ONèœONì â¨NNðpONêðONØöäØONæØöèâ QN,åPNâ ØON,PNèâHPN<„ èpQNèâpê<„ äPNähPNãá8QN˜RäxPNHPN˜R´PNÿèäðPNäàPNäãPNì âPN äQNè QNì âPNðàPNê`QNðÂäHQNæðÂèâˆQNlQ äpQNâ HQNlQ êLì<„ ä˜QNPNæ(eä°QN¨NNâ¬RNpKäÈQNäpKRNááÿåä RNïDáä -O,-Oæ â<-Oæál-Ox-è0Oèâpêx-ä<-OäŒ-O ãá\.O˜Räœ-Ol-O˜RØ-Oÿèä.Oä.Oäã<-Oì â<-O ä@.Oè0.Oì â<-Oð.Oê„.OÈ äl.OæÈ èá¬.O<}ä”.Oâl.O<}èáÔ.Ot'ä¼.Oâ”.Ot'èáü.Oôää.Oâ¼.Oôèá$/O¼åä /Oâä.O¼åèá`/O Cä4/Oâ /O CL/Oäâ áé€äˆ/OÔÀ äp/Oâ4/OÔÀ èâ°/OÐ ä˜/Oâp/OÐ è âØ/OÀÿäÀ/Oâ˜/OÀÿèã0O ßäè/OâÀ/O ßèâ(0O´œ ä0Oâè/O´œ ðx-ä80O<-Oâl0OLäP0O\0Oæ âp*Kæô2O¬ˆ ä|0O䬈 ¸0OÿììÔ0Oè âä0Oæâ1O|q èÜ2Oèâpê|q ää0Oä41Oãá2O˜RäD1O1O˜R€1Oÿèä¼1Oä¬1Oäãä0Oì âä0O äè1OèØ1Oì âä0Oð¬1Oê,2OP¤ä2OæP¤ ˜ââT2O¼zä<2Oâ2O¼zèâ|2O~äd2Oâ <2O~ ˜â â¤2OÔÜäŒ2Oâ d2OÔÜ ˜ââÌ2O Zä´2OâŒ2O ZèæØ'äÜ2Oâ´2OØ'ðå à;JÜ3O0?ä3Oä0?P3Oááÿåäl3OïDáˆ3Oè|Jì¤3OøÀ3Oÿä¼p-ì„:O\³äì3Oø3Oæ â4Oæâ84OL7á:Oè:Oä @ápt:OæL7ä4OäX4Oãá"´5OôOü4Oh4O84OôO¤4OÿèäÐ4Oìã4Oøì4Oì â4Oè5O84OôO@5Oÿèäl5Oìã4Oìˆ5Oèì4Oø¤5Oê â4O äd6O˜RäÄ5O84O˜Rá6Oÿèä,6Oä¤5Oäã4OìH6Oèì4Oø¤5Oêh7Oˆaät6O84Oˆa°6OâÿèäÜ6Oìáá4Oêø6Oèì4Oì7Oè04Kì07OøL7Oè0 KøLbìü7O€" äx7O84O€" ´7Oâÿèäà7Oìáá4Oöì4Oìä8O$þä 8O84O$þH8Oâÿèät8Oìáá4Oê8Oèì4Oì¬8OøÈ8Oè0 KøLbìè9O°@äô8O84O°@09Oâÿèä\9Oìáá4O êx9Oèì4Oì”9Oè04Kì°9OøÌ9Oè0 KøLbðL7äø9O4Oæˆbì$:O4Oä$ââ84OØß `:Oÿä$ìâ"åÀåFÀAO zä”:Oä zÐ:Oÿìäì:Oïí;Oì â;Oæâ H;OŒŸOÐ&ä„=OH;OÐ&À=Oâÿèäì=Oìáá;O öü;Oìœ>O4mä>OH;O4mT>Oâÿèä€>Oìáá;Oöü;Oì0?OHä¬>OH;OHè>Oâÿèä?Oìáá;Oöü;OìÄ?Oô¹ä@?OH;Oô¹|?Oâÿèä¨?Oìáá;Oöü;Oìt@O¤A äÔ?OH;O¤A @Oâÿèä<@Oìáá;OêX@Oèü;OøØfì$AOÔêä„@OH;OÔêÀ@Oâÿèäì@Oìáá;O êAOèü;Oø|Pä4AO;Oæˆbì`AO;Oä,ââH;O8 œAOÿä,ìääÀåFDBO|› äÐAOä|› BOÿìä(BOïí ˜ê¬DOäOäTBO\BOâ,âŒBOäOè|DOèâpêäOä\BOä¬BO ãá|CO˜Rä¼BOŒBO˜RøBOÿèä4COä$COäã\BOì â\BO ä`COèPCOì â\BOð$COê¤CO´\ äŒCOæ´\ @ZLä âÌCOGä´COâ ŒCOGœBäâôCOäIåÜCOâ´COäIá@ZLäâDOpäDOâÜCOpè âDDOPÉä,DOâDOPÉèâlDOÅåTDOâ,DOÅéâ”DOìâä|DOâTDOìâðäOä¤DO\BOâhEO(ä¼DOä(øDOááÿåäEOïDá0EOøLEOèTDø)JìGO?äxEO„EOæ â”EOæâÄEO,®èìFOèâpê,®ä”EOääEOãá´FO˜RäôEOÄEO˜R0FOÿèälFOä\FOäã”EOì â”EO ä˜FOèˆFOì â”EOð\FOêÜFOȺäÄFOæȺTDäâGOÓäìFOâ ÄFOÓTDì,®äGO”EOæÌ>ä,GOäÌ>hGOááÿåä„GOïDýèHOĉ ä°GOäĉ ìGOÿìäHOïá$HOø@HOèœBì\HOøxHOèTDì”HOèX-ì°HOèTDìÌHOÿäÔDìIOàzäøHO(¹KælKOÈ?äIOâ ìIOÈ?,IO€èæDIOäXá ä \IOð(,IOê tIOä8,IOê ŒIOøæ,IOê ¤IO ¦,IOê ¼IO|Â,IOê ÔIOL¯,IO ê IO\ƒ,IO@ê JOÐ?,IOáé JOÀ,IOáé 4JO³,IOáé LJO ¥,IOáé dJOЦ ,IOáé |JOT,IOá é ”JO„á ,IOá@é ¬JO`,IOá€é ÄJO¨Ð ,IOâè ÜJOp3,IOâè ôJOÐ÷,IOâè KOá,IOâè $KO”‰,IOâè KøLbìlÿOè–ä þO¼øOè–ÜþOâÿèäÿOìááŒøOHê$ÿOèpùOì@ÿOÿä\ÿOì âä6Mæ8PØXä|ÿO¼øOØX¸ÿOâÿèääÿOìááŒøODìPèpùOìPÿä\ÿOìPÀä äHP¼øOÀä „Pâÿèä°PìááŒøO@êÌPèpùOìèPÿä8oì´P9äP¼øO9PPâÿèä|PìááŒøO<ê˜PèpùOøPÏIìHPˆÐäÄP¼øOˆÐáPâÿèä,PìááŒøO8öpùOìÜP |äXP¼øO |”PâÿèäÀPìááŒøO4öpùOìŒPäGäìP¼øOäG(PâÿèäTPìááŒøO0êpPèpùOø ãMìÈPôwäœP¼øOôwØPâÿèäPìááŒøO,ê PèpùOì<PøXPèHKøLbð€SäðP PæˆbìP Pä$ââL PéXPÿä$ìâåÀåFã„P PâäPÔåœP¤Pâ@âÔPÔé´PèâpêÔå¤PäôPãáÄP˜RäPÔP˜R@Pÿèä|PälPäã¤Pì â¤P ä¨Pè˜Pì â¤PðlPêìPP—äÔPæP— ÆOä0âPÜ1 äüPâÔPÜ1 è,â<P ä$PâüP è(âdPl<äLPâ$Pl<è$âŒPˆ ätPâLPˆ è â´PtPåœPâtPtPéâÜPäÄPâ œP|JäâPô• äìPâ ÄPô• |Jäâ,Pð‡ äPâ ìPð‡ |JäâTPË ä<Pâ PË |Jä â|P”±ädPâ <P”±|Jäâ¤Ptá äŒPâ dPtá |JäâÌP8$ä´PâŒP8$ðÔåÜP¤PâÔPØ}äôPáPæ âPæä,PïáHPèœBìdPèèQLê€PøœPø¸PèœBøLbìðP°}ääP„ÛMæ8PÀ åPäÀ <PááÿåäXPïDátPèœBìPø¬PèœBìÈPøäPèœBíPøPèLbø¨sMð(SäHPÜ9Næè]PàŽ ädPäàŽ  Pÿìä¼Pïá°]PèØPì âèPæâ P4¨,]Pè@]Pä @áp ]Pæ4¨äèPä8Pãá"”PôOÜPHPPôO„Pÿèä°PìãèPøÌPì âèPèäPPôO PÿèäLPìãèPìhPèÌPø„Pê âèP äDP˜Rä¤PP˜RàPÿèä Pä„PäãèPì(PèÌPø„PêTP´IäTPP´IPâÿèä¼PìááèP8êØPèÌPøôPì âPæ@â4P@° è$Pèâpê@° äPäTP ãá$P˜RädP4P˜R PÿèäÜPäÌPäãPì âP äPèøPì âPðÌPêLPȧå4Pæȧé<âtP4ä\Pâ 4P4Rä4âœPÌ7ä„Pâ \PÌ7Rä,âÄP|i ä¬Pâ „P|i Rä$âìP€è äÔPâ¬P€è è âPH?åüPâÔPH?á´Oäâ<Pá^ä$PâüPá^´Oì@° äLPPâPädPP PâÿèäÌPìááèP4êèPèÌPø|PêìPôäPPôPPâÿèä|PìááèP0ê˜PèÌPì´Pè,ZêÐPè,Zö,Zêœ P`RäüPP`R8 Pâÿèäd PìááèP,ê€ PèÌPøø¿Kì0!PØgä¬ PPØgè Pâÿèä!PìááèP(öÌPìà!PÜä@!PPÜ|!Pâÿèä¨!PìááèP$êÄ!PèÌPÿè¬"P¼òäð!PP¼ò,"PâÿèäX"PìááèP êt"PèÌPì"PÿäLbæâ´#Pü«ä¼"PPü«ø"Pâÿèä$#PìááèPê@#PèÌPì\#Pøx#PèLbæî”#Pèâ â¤#Pæ æäœ$PxpäÄ#PPxpá$Pâÿèä,$PìááèPêH$PèÌPìd$Pø€$PèLbæî8oèâ('PЩä¬$PPЩè$Pâÿèä%PìááèPê0%PèÌPìL%Pÿäh%Pæâ âx%Pæâ¨%PˆO èø&PèâpêˆO äx%PäÈ%Pãá˜&P˜RäØ%P¨%P˜R&PÿèäP&Pä@&Päãx%Pì âx%P ä|&Pèl&Pì âx%Pð@&PêÀ&P¼þä¨&Pä¼þ|Jäâè&P´§äÐ&Pâ¨&P´§èâ'P¶ äø&PâÐ&P¶ ðˆO ä 'Px%Pâ,\Pèvä8'PPèvt'Pâÿèä 'PìááèPê¼'PèÌPìØ'Pøô'Pèh%Pæâ\Pè(Pæâ â (PæâP(Pé èà[Pèâpêé ä (Päp(POãá@)P˜Rä€(PP(P˜R¼(Pÿèäø(Päè(Päã (Pì â (P ä$)Pè)Pì â (Pðè(Pêh)Pô‚äP)Päô‚XCJè)PÐéäx)PP)PÐé(Päâ¸)P”å  )Px)P”áà›Jäâà)P„wäÈ)P )P„wœJäâ*Pè"äð)PÈ)Pè" ìIäâ0*Páä *Pð)Pá8oäâX*PX”ä@*P*PX”äâ€*PP' äh*P@*PP' ü£Jäâ¨*PðÓ ä*Ph*PðÓ X-äâÐ*Pøeå ¸*P*PøeášJäâø*P¤äà*P¸*P¤ÔDäâ +Ph[ä+Pà*Ph[äâH+Pœ+ä0+P+Pœ+`ûäâp+PX(å X+P0+PX(ápäâ˜+Paä€+PX+PaîäâÀ+P 7ä¨+P€+P 7Lbäâè+Pl= äÐ+P¨+Pl= X-äâ,PÀâäø+PÐ+PÀâ¼p-äâ8,Pˆ“ ä ,Pø+Pˆ“ ÔDäâ`,PxÒ äH,P ,PxÒ TDäâˆ,PTä äp,PH,PTä ˜äâ8.PÔXä˜,Pp,PÔX°,Päââà,PÈÌè.PèâpêÈÌä°,På-PãáÐ-P˜Rä-Pà,P˜RL-Pÿèäˆ-Päx-Päã°,Pì â°,P ä´-Pè¤-Pì â°,Pðx-Pêø-PDeäà-PæDe(Päâ .Ppä.Pâà-PpðÈÌä0.P°,Pâè/P”žäH.P˜,P”ž`.Päââ.P`o è¸/Pèâpê`o ä`.Pä°.Pãá€/P˜RäÀ.P.P˜Rü.Pÿèä8/Pä(/Päã`.Pì â`.P äd/PèT/Pì â`.Pð(/Pê¨/PDeä/PæDe8oäâÐ/Ppä¸/Pâ/Ppð`o äà/P`.Pâ˜1P"äø/PH.P"0Päââ@0PH: èh1PèâpêH: ä0Pä`0Pãá01P˜Räp0P@0P˜R¬0Pÿèäè0PäØ0Päã0Pì â0P ä1Pè1Pì â0PðØ0PêX1PDeä@1PæDe›äâ€1Ppäh1Pâ@1PpðH: ä1P0Pâà4P¸–ä¨1Pø/P¸–À1Päââð1PÈìè°4PèâpêÈìäÀ1Pä2Pãáà2P˜Rä 2Pð1P˜R\2Pÿèä˜2Päˆ2PäãÀ1Pì âÀ1P äÄ2Pè´2Pì âÀ1Pðˆ2Pê 4PDeäð2PæDe3Päâ â3PæâH3P0âèp4Pèâpê0âä3Päh3Pãá84P˜Räx3PH3P˜R´3Pÿèäð3Päà3Päã3Pì â3P ä4Pè 4Pì â3Pðà3Pê`4PÀuäH4PæÀuTDäâˆ4Pìâäp4PâH4Pìâð0âä˜4P3PâÈ4Ppä°4Pâð2PpðÈìäØ4PÀ1Pâ6P·äð4P¨1P·5Päââ85P˜q è`6Pèâpê˜q ä5PäX5Pãá(6P˜Räh5P85P˜R¤5Pÿèäà5PäÐ5Päã5Pì â5P ä 6Pèü5Pì â5PðÐ5PêP6PDeä86PæDe8oäâx6Ppä`6Pâ86Ppð˜q äˆ6P5Pã:P|,å  6Pð4P|,á¸6Päââè6P‘èÐ9Pèâpê‘ä¸6Pä7PãáØ7P˜Rä7Pè6P˜RT7Pÿèä7Pä€7Päã¸6Pì â¸6P ä¼7Pè¬7Pì â¸6Pð€7PêÀ9PDeäè7PæDeá8Päâ â8Pæ â@8PDè9PèâpêDä8Pä`8Pãá09P˜Räp8P@8P˜R¬8Pÿèäè8PäØ8Päã8Pì â8P ä9Pè9Pì â8PðØ8PêX9Pð.ä@9Pæð.TDäâ€9P|aäh9Pâ@9P|aèâ¨9Pìâä9Pâh9PìâðDä¸9P8Pâè9PpäÐ9Pâè7Ppð‘äø9P¸6Pâ°;PŒP ä:P 6PŒP (:PäââX:Phè€;Pèâpêhä(:Päx:PãáH;P˜Räˆ:PX:P˜RÄ:Pÿèå;Päð:Päã(:Pì â(:P ä,;Pè;Pì â(:Pðð:Pêp;PDeäX;PæDePÏIäâ˜;Ppä€;PâX;Ppðhä¨;P(:Pâ`=P¼r äÀ;P:P¼r Ø;PäââPèâpêÐ+ äˆ=PäØ=Pãá¨>P˜Räè=P¸=P˜R$>Pÿèä`>PäP>Päãˆ=Pì âˆ=P äŒ>Pè|>Pì âˆ=PðP>PêÐ>PDeä¸>PæDeäâø>Ppäà>Pâ¸>PpðÐ+ ä?Pˆ=Pâ8?P€ˆ ä ?Pp=P€ˆ Oäâè@P¬ÀäH?P ?P¬À`?Päââ?PÌ8è¸@PèâpêÌ8ä`?Pä°?Pãá€@P˜RäÀ?P?P˜Rü?Pÿèä8@Pä(@Päã`?Pì â`?P äd@PèT@Pì â`?Pð(@Pê¨@PDeä@PæDeX-äâÐ@Ppä¸@Pâ@PpðÌ8äà@P`?Pâ˜BP(€äø@PH?P(€APäââ@APˆèhBPèâpêˆäAPä`APãá0BP˜RäpAP@AP˜R¬APÿèäèAPäØAPäãAPì âAP äBPèBPì âAPðØAPêXBPDeä@BPæDeÔDäâ€BPpähBPâ@BPpðˆäBPAPâHDP¨ä¨BPø@P¨ÀBPäââðBPpèDPèâpêpäÀBPäCPãáàCP˜Rä CPðBP˜R\CPÿèä˜CPäˆCPäãÀBPì âÀBP äÄCPè´CPì âÀBPðˆCPêDPDeäðCPæDeäâ0DPpäDPâðCPpðpä@DPÀBPâøEP8; äXDP¨BP8; pDPäââ DP<Þ èÈEPèâpê<Þ äpDPäÀDPãáEP˜RäÐDP DP˜R EPÿèäHEPä8EPäãpDPì âpDP ätEPèdEPì âpDPð8EPê¸EPDeä EPæDe`ûäâàEPpäÈEPâ EPpð<Þ äðEPpDPâ¨GPPî äFPXDPPî FPäââPFPPÞ èxGPèâpêPÞ ä FPäpFPãá@GP˜Rä€FPPFP˜R¼FPÿèäøFPäèFPäã FPì â FP ä$GPèGPì â FPðèFPêhGPDeäPGPæDeÛIäâGPpäxGPâPGPpðPÞ ä GP FPâhIPx&å ¸GPFPx&áÐGPäâãHPpMè8IPèâpêpMäÐGPä HPãáðHP˜Rä0HPá HP˜RlHPÿèä¨HPä˜HPäãÐGPì âÐGP äÔHPèÄHPì âÐGPð˜HPê(IPDeåIPæDeIPäâ â”ÜIæPIPpä8IPãIPpðpMä`IPÐGPâKPPì äxIP¸GPPì IPäââÀIP(à èèJPèâpê(à äIPäàIPãá°JP˜RäðIPÀIP˜R,JPÿèähJPäXJPäãIPì âIP ä”JPè„JPì âIPðXJPêØJPDeäÀJPæDeLbäãKPpäèJPâÀJPpð(à äKPIPâÈLP)å (KPxIP)á@KPäââpKP¸Oè˜LPèâpê¸Oä@KPäKPãá`LP˜Rä KPpKP˜RÜKPÿèäLPäLPäã@KPì â@KP äDLPè4LPì â@KPðLPêˆLPDeäpLPæDeX-äâ°LPpä˜LPâpLPpð¸OäÀLP@KPâxNPî äØLP(KPî ðLPäââ MPØÝ èHNPèâpêØÝ äðLPä@MPãáNP˜RäPMP MP˜RŒMPÿèäÈMPä¸MPäãðLPì âðLP äôMPèäMPì âðLPð¸MPê8NPDeä NPæDe¼p-äâ`NPpäHNPâ NPpðØÝ äpNPðLPâ(PP0'å ˆNPØLP0'á NPäââÐNP$NèøOPèâpê$Nä NPäðNPãáÀOP˜RåOPÐNP˜R”nPê âpÓP4o äXÓPâ0ÓP4o è<â˜ÓP@ ä€ÓPâXÓP@ è:âÀÓP\Øä¨ÓPâ€ÓP\Øè8âèÓPpsäÐÓPâ¨ÓPpsè6âÔPØ(äøÓPâÐÓPØ(è4â8ÔP ä ÔPøÓP 0 Kä,â`ÔPíäHÔP ÔPíè2âˆÔP8CäpÔPHÔP8Cè0â°ÔP”k ä˜ÔPpÔP”k è.âØÔPˆ<äÀÔPâ˜ÔPˆ<è,ãÕPÔP äèÔPâÀÔPÔP è(â(ÕPì äÕPâèÔPì è&âPÕPp_ ä8ÕPâÕPp_ è$âxÕP¤©å`ÕPâ8ÕP¤©é"â ÕPò äˆÕPâ`ÕPò è âÜÕPä°ÕPâ ˆÕPÈÕPè ê è€- äìÕPDÏPâÖPl1äÖPâ ÏPl1 ˜ä$âDÖPÀ; ä,ÖPâ ÖPÀ; ˜ä âlÖP/åTÖPâ,ÖP/á ˜äâ”ÖPô• ä|ÖPâ TÖPô• ˜äâ¼ÖPÀ© ä¤ÖPâ |ÖPÀ© ˜äâäÖPð‡ äÌÖPâ ¤ÖPð‡ ˜äâ ×PË äôÖPâ ÌÖPË ˜ä â4×P”±ä×Pâ ôÖP”± ˜äâ\×Ptá äD×Pâ ×Ptá ˜äâ„×P8$äl×PâD×P8$ð´-å”×P ÌPâTØPlGä¬×P¸×Pæ âÈ×Pæää×PïâØPèœBìØPø8ØPÿäœBê€ÚPH¸ädØPpØPæ â€ØPæâ°ØP ù èPÚPèâpê ù 䀨PäÐØPãá ÙP˜RäàØP°ØP˜RÙPÿèäXÙPäHÙPäã€ØPì â€ØP ä„ÙPètÙPì â€ØPðHÙPêÈÙPìkä°ÙPæìk›ä âðÙPäØÙPâ°ÙPè âÚPÔ åÚPâØÙPÔ èâ@ÚP¼,ä(ÚPã ÚP¼,›äâhÚP8JäPÚPâ (ÚP8J ˜ì ù äxÚP€ØPâÛPÈ£ äÚPäÈ£ ÌÚPááÿåäèÚPïDáÛPèTDì ÛPèTDì<ÛPèTDìXÛPèTDìtÛPèTDø)JìhÜPØVä ÛPäØVÜÛPááÿåäøÛPïDáÜPø0ÜPøLÜPÿô ßP(#äxÜP€ÜPâ4â°ÜP(#èÜÞPèâ@ê(#ä€ÜPäÐÜP ãá ÝP˜RäàÜP°ÜP˜RÝPÿèäXÝPäHÝPäã€ÜPì â€ÜP ä„ÝPètÝPì â€ÜPðHÝPêÈÝPZ ä°ÝPæZ è0âðÝPÌVäØÝPâ°ÝPÌVè.âÞP4* åÞPâØÝP4* è,â@ÞPÄøä(ÞPãÞPÄøè(â|ÞPdÕäPÞPâ (ÞPdÕhÞPäâ ê ä¤ÞP¸ÚäŒÞPâPÞP¸ÚèâÌÞPÔp ä´ÞPâŒÞPÔp èâôÞPô"äÜÞPâ´ÞPô"ð(#äßP€ÜPâ8áP°£ äßPä°£ XßPááÿåätßPïDâáPèßPì â ßPæâÐßP¼=èÐàPèâpê¼=ä ßPäðßPãáÀàP˜RåàPÐßP˜R<àPÿèäxàPähàPäã ßPì â ßP ä¤àPè”àPì â ßPðhàPêèàPXääÐàPæXäð¼=äøàP ßPâáPè|Jöh¡KìÈãP€VäHáPTáPæ âdáPæá”áPhèè˜ãPèâpêhèädáPä´áPãá„âP˜RäÄáP”áP˜RáâPÿèä<âPä,âPäãdáPì âdáP ähâPèXâPì âdáPð,âPêÀâPx8 ä”âPæx8 ¬âPäâ éãèâPô£äÐâPâ”âPô£èâãPp¦äøâPâÐâPp¦èâLãP$ëä ãPâ øâP$ë8ãPäâ ê äˆãPØœä\ãPâ ãPØœtãPäâ êä°ãP¬ ä˜ãPâ\ãP¬ ðhèäÀãPdáPâ„äP4¸äØãPä4¸äPááÿåä0äPïDáLäPèÈBìhäPè|JöœBì(æP`Vä”äP äPæ âÐäP”A èøåPèâpê”A ä äPäðäPãáÀåP˜RååPÐäP˜R<åPÿèäxåPähåPäã äPì â äP ä¤åPè”åPì â äPðhåPêèåPC äÐåPæC èâæP̉ äøåPâ ÐåP̉ ,ÇJì”A ä æP äPâäæPH‘ ä8æPäH‘ tæPááÿåäæPïDá¬æPèT#KìÈæPÿø(‘ äôæPüæPââ,çP(‘ èTèPèâ`ê(‘ äüæPäLçPãáèP˜Rä\çP,çP˜R˜çPÿèäÔçPäÄçPäãüæPì âüæP åèPèðçPì âüæPðÄçPêDèPè ä,èPæè èâlèPØÏäTèPâ,èPØÏð(‘ ä|èPüæPâ”èP„ä €1KéPHä¤èPâ ÔèPH¼èPèæ¤èPäøµä ìèP¸¼èPê éPx ¼èPîT˜ ¼èPè„ëPdä,éP4éPâ=âdéPdè@ëPèâpêdä4éPä„éPãáTêP˜Rä”éPdéP˜RÐéPÿèä êPäüéPäã4éPì â4éP ä8êPè(êPì â4éPðüéPê|êPІ ädêPæІ è<â¸êPDç äŒêPâ dêPDç ¤êPäâ ê äôêPdàäÈêPâ ŒêPdààêPäâ êä0ëPx¼ äëPâ ÈêPx¼ ëPäâ êälëPXªä@ëPâ ëPXªXëPè êèdä|ëP4éPâìP8ä”ëP ëPæ â°ëPæäÌëPïáèëPè ˜øœBì¤ìP¤ äìPä¤ PìPááÿåälìPïDáˆìPèèQLö˜NìÀîPt¤ ä´ìPÀìPæâðìP˜íèîPèâpê˜íäÀìPäíPãáàíP˜Rä íPðìP˜R\íPÿèä˜íPäˆíPäãÀìPì âÀìP äÄíPè´íPì âÀìPðˆíPêîPИ äðíPæИ œBäâ0îPð*äîPâ ðíPð*°Kä âXîPìíä@îPâ îPìí ˜äâ€îPè® ähîPâ@îPè® èâ¨îPT›äîPâhîPT›ð˜íä¸îPÀìPâÔñPÈ#äÐîPäÈ# ïPááÿåä(ïPïDáDïPèœBì`ïPèTDì|ïPø˜ïPø´ïPèœBìÐïPÿäìïPì âüïPæâ,ðPäCè¤ñPèâpêäCäüïPäLðPãáñP˜Rä\ðP,ðP˜R˜ðPÿèäÔðPäÄðPäãüïPì âüïP åñPèððPì âüïPðÄðPêDñP|†ä,ñPæ|†è âlñPð›äTñPâ,ñPð›èâ”ñPü¹ä|ñPâTñPü¹èâ¼ñPtùä¤ñPâ|ñPtùðäCäÌñPüïPâÈóP˜åäñPä˜á òPááÿåä<òPïDíXòPì âhòPæâ˜òPèŒè˜óPèâ@êèŒähòPä¸òPãáˆóP˜RäÈòP˜òP˜RóPÿèä@óPä0óPäãhòPì âhòP älóPè\óPì âhòPð0óPê°óPXää˜óPæXäðèŒäÀóPhòPâDõP¨#äØóPäóPæâôP|ÂèõPèâpê|ÂääóPä4ôPãáõP˜RäDôPôP˜R€ôPÿèä¼ôPä¬ôPäãäóPì âäóP äèôPèØôPì âäóPð¬ôPê,õPìl äõPæìl ˜ì|Âä<õPäóPãöPQ § äX=Qä § ”=Qÿìä°=QïáÌ=Qè$ÓIìè=Qè”ÜIì>QÿäÛIì<>Q(&ä0>Q gOæL?Q»äL>Q仈>Qááÿåä¤>QïDáÀ>Qèì¥KìÜ>Qè ˜ìø>Qø?Qè¸3Mì0?QÿäuPìÐ?Qü%ä\?Qäü%˜?Qááÿåä´?QïDíÈBì JQƒäà?Qè?Qâøâ@QƒèÜIQèâ`êƒäè?Qä8@QãáAQ˜RäH@Q@Q˜R„@QÿèäÀ@Qä°@Qäãè?Qì âè?Q äì@QèÜ@Qì âè?Qð°@QêTGQðGäAQæðG0AQäâàâ`AQ€¨ è$GQèâ`ꀨ ä0AQä€AQ!ãáPBQ˜RäAQ`AQ˜RÌAQÿèäBQäøAQäã0AQì â0AQ ä4BQè$BQì â0AQðøAQêŒBQH¶ä`BQæH¶xBQä`â €âüæPää´BQ “äœBQâ`BQ “è\âÜBQ„Ò äÄBQâœBQ„Ò èXâCQPãäìBQâÄBQPãèTâ,CQ´üäCQâìBQ´üèPâTCQ°Ç äKæ|çQˆ„䤿QpãQˆ„àæQâÿèä çQìáá@ãQê(çQè$äQìDçQø`çQÿä>Kì,èQœs äŒçQpãQœs ÈçQâÿèäôçQìáá@ãQêèQè$äQÿè0éQ@_ä<èQpãQ@_xèQâÿèä¤èQìáá@ãQêÀèQè$äQìÜèQøøèQøéQèœBøLbì|êQ ¹å @éQpãQ ¹á|éQâÿèä¨éQìáá@ãQêÄéQè$äQìàéQøüéQøêQèœBì4êQèdKìPêQèì¥KølêQì â‡Oæ€ìQ<øäŒêQpãQ<øÈêQâÿèäôêQìáá@ãQ êëQè$äQì,ëQøHëQødëQèœBì€ëQèdKìœëQèì¥Kì¸ëQèì¥KìäëQèÔëQê â,ÅJçìQèÔëQêdìQèìQì â,ìQæäHìQïÿýèP äìQ@ãQæˆbì¼ìQ@ãQä,ââpãQ°, øìQÿä,ìâ åÀåF8íQøTíQøpíQøŒíQèdKì¨íQøÄíQøàíQèÔëQêüíQèÔëQöîQì â(îQæâXîQŒÀá0ñQèDñQä @áp¤ñQæŒÀå(îQäxîQãá"ÔïQôOïQˆîQXîQôOÄîQÿèäðîQìã(îQø ïQì â(îQè$ïQXîQôO`ïQÿèäŒïQìã(îQì¨ïQè ïQøÄïQê â(îQ ä„ðQ˜RääïQXîQ˜R ðQÿèäLðQäÄïQäã(îQìhðQè ïQøÄïQêñQ…ä”ðQXîQ…ÐðQâÿèäüðQìáá(îQ ö ïQðŒÀå(ñQ(îQæˆbìTñQ(îQäââXîQX ñQÿäìâ*åÀåFòQáÁäÄñQçÁ´Oâÿå,óQ|+äòQä|+LòQááÿåähòQïDá„òQèœBì òQè¼p-ì¼òQøØòQøôòQèœBìóQÿäìïPìÐôQàÀä<óQHóQæâxóQ# è ôQèâ@ê# äHóQä˜óQãáhôQ˜Rä¨óQxóQ˜RäóQÿèä ôQäôQäãHóQì âHóQ äLôQè<ôQì âHóQðôQêôQ¨3äxôQæ¨3ŒíLäâ¸ôQT ä ôQâxôQT ð# äÈôQHóQâìôQ˜NäàôQ”{NæxöQXŠäüôQõQæ âõQæâHõQ¨/ èHöQèâpê¨/ äõQähõQãá8öQ˜RäxõQHõQ˜R´õQÿèäðõQäàõQäãõQì âõQ äöQè öQì âõQðàõQê`öQXääHöQæXäð¨/ äpöQõQâP÷Q\— äˆöQä\— ÄöQááÿåäàöQïDáüöQèÈBì÷Qø4÷Qÿô$ûQ`Nä`÷Ql÷Qædâœ÷Q$èôúQèâpê$äl÷Qä¼÷QãáŒøQ˜RäÌ÷Qœ÷Q˜RøQÿèäDøQä4øQäãl÷Qì âl÷Q äpøQè`øQì âl÷Qð4øQê´øQ, äœøQæ, è`âÜøQt äÄøQâœøQt è\âùQü¯äìøQâÄøQü¯èXâ,ùQ äùQâìøQ èTâTùQW ä<ùQâùQW èPâ|ùQüädùQâ<ùQüèLâ¤ùQ„äŒùQâ dùQ„ÄÁJä4âÌùQìWä´ùQâŒùQìWè0âôùQ$iäÜùQâ´ùQ$iè,âúQh—äúQâÜùQh—è(âDúQ ó ä,úQâúQ ó è$âlúQôý äTúQâ,úQôý è â”úQ˜ ä|úQâTúQ˜ èâ¼úQ@– ä¤úQâ|úQ@– èâäúQøVäÌúQâ ¤úQøV,ÅJäâ ûQ̉ äôúQâ ÌúQ̉ ,ÇJì$äûQl÷Qæ”Àä4ûQ@ûQæ â„ÛMæðûQ\˜ ä`ûQä\˜ œûQááÿåä¸ûQïDáÔûQè ¤JøX-ìÈüQTÁåüQäTÁ<üQÿìäXüQïátüQèlÍJìüQèôIì¬üQè°"JøLbìäüQ,äØüQì&OçýQ˜ äôüQÐŒOæýQØNä d’P,ýQà— ä ýQø©NæHýQ8Áä<ýQÜOæÈR`« äXýQä`« ”ýQááÿåä°ýQäœBçDá<ÿQèÌýQì âÜýQæâ þQ4Áé ÿQèâpê4ÁåÜýQä,þQãáüþQ˜Rä<þQ þQ˜RxþQÿèä´þQä¤þQäãÜýQì âÜýQ äàþQèÐþQì âÜýQð¤þQê$ÿQXää ÿQæXäð4Áå4ÿQÜýQîXÿQì âhÿQæâ˜ÿQhÿè˜RèâpêhÿähÿQä¸ÿQãáˆR˜RäÈÿQ˜ÿQ˜RRÿèä@Rä0RäãhÿQì âhÿQ älRè\Rì âhÿQð0Rê°RXää˜RæXäðhÿäÀRhÿQâäR„ŠäØR<-OêD« äôRäD« 0RÿììLRê â\eQæ\RÜ,älRâ ÌRÜ,„RèæœRä¬E ä ´R,G„Rì lRdÄRê äR¤T„Rê üRW„Rê Rüê „Rê ,RL¸ „RêDR°¯á„RîT¸„R è RL`älRtRâXâ¤RL`èpRèâpêL`ätRäÄRãá”R˜RäÔR¤R˜RRÿèäLRä<RäãtRì âtR äxRèhRì âtRð<RêÐRÀQä¤RæÀQ¼RäDâ êäøRloäàRâ¤Rloè@â R»äRâ àR»”ÜIä8âHRÅä0RâRÅè4âpRÔOäXRâ0RÔOè0â˜Rðää€RâXRðäè,âÀR@Öå¨Râ€R@Öé(âèRìÁäÐRâ ¨RìÁ”ÜIä âRôÅäøRâ ÐRôÅ”ÜIäâ8R s ä Râ øR s ”ÜIäâ`R`8äHRâ R`8”ÜIäâˆR¨ äpRâ HR¨ ”ÜIìL`ä˜RtRâ0RXOä°Râ àRXOÈRèæ°Rä¼+ä øRHLÈRê RtÖ ÈRê (RÄ, ÈRê @R<ýÈRê XRìùÈR ê pRÄšÈR@ê ˆRÄYÈR€ê  R¸W ÈRáé ¸R˜rÈRáé ÐRd‹ ÈRáé èR¼ÈRáê RðgÈRáé R›ÈRá 혻 ÈRá@ç$RÀ« ä@RäÀ« |Rááÿåä˜RïDá´RøÐRè¼p-ììRè\¯PìRÿäT±PìŒ Rá`ä4Rå`pRááÿåäŒRïDá¨RèœBìp RèÄRì âÔRæâ RŒ‡è@ RèâpꌇäÔRä$ Rãáô R˜Rä4 R R˜Rp Rÿèä¬ Räœ RäãÔRì âÔR äØ RèÈ Rì âÔRðœ Rê0 Rh[ä Ræh[ Räâ âœBääX RÄð ä@ Râ RÄð ðŒ‡äh RÔRîT±PìD RDOäœ R¨ RæááØ R°Né Rèâpê°Nå¨ Räø RãáÈ R˜Rä RØ R˜RD Rÿèä€ Räp Rä㨠Rì ⨠R ä¬ Rèœ Rì ⨠Rðp Rê Rœ äØ Ræœ ð Räâ ÿêÿä, Rبä RâØ Rبð°Nå< R¨ RâìRÄ,äT R` Ræá Rìgè¼Rèâ@êìgä` Rä° RãဠR˜RäÀ R R˜Rü Rÿèä8 Rä( Räã` Rì â` R äd RèT Rì â` Rð( RêÌRœ– ä R朖 ¨ RäÈâPâØ R 8 è´Rèâ@æ R 8 ä¨ Räø RãáÈR˜RäRØ R˜RDRÿèä€RäpRä㨠Rì ⨠R ä¬RèœRì ⨠RðpRêRdÕäØRædÕðRäâ @ê ä,R¸ÚäRâØR¸Úè âTRÔp ä<RâRÔp è â|Rô"ädRâ<Rô"èâ¤Rœ÷äŒRâdRœ÷èæXà ä´RâŒRXà ìRHäÜRâ RHôRäHâ €ê@äDRtÆ äRâ ÜRtÆ 0Rä(â êälR˜ýäTRâR˜ýè$â”RŸä|RâTRŸè â¼R¤³å¤Râ|R¤³éâäRLà äÌRâ¤RLà èâ Rlú äôRâÌRlú èâ4RôÛ äRâôRôÛ èâ\Rðª äDRâRðª è â„Rü—älRâDRü—èâ¬Rá!ä”RâlRá!èâÔR ûä¼Râ”R ûðìgääR` RâÄRàŠäüRäàŠ8RááÿåäTRïDápRèì¥KìŒRè¸3Mì¨Rÿô¸R¸ åÔRä¸ áRááÿåä,RïDáHRèì¥KìdRø€RøœRÿôÐRl,äÈRP’OâŒRœÁäàRäœÁRááÿåä8RïDáTRèœBìpRÿäX-ì|R€ÁäœR¤Râ âÔR€ÁèLRèâPê€Áä¤RäôRãáÄR˜RäRÔR˜R@Rÿèä|RälRäã¤Rì â¤R ä¨Rè˜Rì â¤RðlRêìRÀäÔRæÀèâR´Â äüRâÔR´Â èâ<R° ä$RüR° ìdRØÏäLRâ$RØÏð€ÁätR¤Râ\R  åŒRä  áÈRÿììäRê âôRæä$R°µøì°µäôRäDRãå°µäTRôRæØ_älRäØ_¨RÿìäÄRä|JçáàRøüRè|JÿèäR¬Oä(Rä¬OdRÿìä€RäTDçáœRèLbì¸RèTDøÔRì â8oæ¼R@aäôRä@a0RÿìäLRïáhRèlÍJì„RèôIì Rè°"JøLbìØR!åÌR˜Næ¼&RaäèRäa$Rÿìä@RäœBçá„&Rè\Rì âlRæâœR¸– á&Rè&Rä @ápt&R渖 älRä¼Rãá"RôO`RÌRœRôORÿèä4RìãlRøPRì âlRèhRœRôO¤RÿèäÐRìãlRììRèPRøRê âlR äÈR˜Rä(RœR˜RdRÿèäRäRäãlRì¬RèPRøRê\RT¦äØRœRT¦Râÿèä@RìáálR8öPRìðR@¼ älRœR@¼ ¨RâÿèäÔRìáálR4öPRìØRØzåRœRØz<RâÿèähRìáálR0ê„RèPRì RèœBì¼Rÿô¤RZäèRœRZ$RâÿèäPRäœBäáálR,êlRèPRìˆRèœBÿèp R°³ ä´RœR°³ ðRâÿèä RìáálR(ê8 RèPRìT Rÿôä@-Râ-Rá>Rä$â€-Rˆ§äh-Râ @-Rˆ§Räâ¨-R0_ä-Râ h-R0_°KäâÐ-R„ãä¸-Râ -R„ã°Kä âø-RXäà-Râ ¸-RX¨Näâ .RT›ä.Râà-RT›ðÈ1 ä0.Rˆ)RâŒ3RèT.Rì âd.Ræâ”.RÄ%è\3RèâpêÄ%äd.Rä´.R ãá„/R˜RäÄ.R”.R˜Rá/RÿèäR\ÂäÔ=Rä\Â>Rááÿåä,>RïDáH>RèÈBìd>Rè ˜öœBìä@R@Âä>Rœ>Ræ â¬>RæâÜ>R‹èÌ@RèâPê‹ä¬>Räü>RãáÌ?R˜Rä ?RÜ>R˜RH?Rÿèä„?Rät?Räã¬>Rì â¬>R ä°?Rè ?Rì â¬>Rðt?Rêô?R¨»äÜ?R樻èâ@RLä@RâÜ?RLèâD@Ràä,@Râ@Ràè âl@RÐ0åT@Râ,@RÐ0é â”@R`0å|@RâT@R`0éâ¼@RØ&ä¤@Râ|@RØ&èæÔ%äÌ@Râ¤@RÔ%ì,BRÌ`äô@RäÌ`0ARááÿåäLARäœBçDáhARèœBì„ARèÈBì ARèÈBì¼ARøØARøôARøBRÿøüŠäáçrÿí ðÿmááÿÿÿ÷â“æ@ÿä ðÿnááÿÿÿ÷â~æBÿä ðÿäÿûâ¨æAÿä ïÿäóâEÿáâæ ÿä ïÿrááÿÿïÿåâ ÿìñÿÿÿÿââÈåÀõéHfRü:áÔDärý ÔfR|fRé¨fRü:áä‘ÿáÜfRégRü:áä’ý4ë@þhRØ™ äpgR䨙 ¬gRááÿåäÈgRïDáägRÿäšJìØhRbähRäbLhRÿìähhRïá„hRèlÍJì hRèôIì¼hRè°"JøLbìðhR˜ÃäèhRÔKLâÈiRtŒåiRätŒKì ˆRÿôRøš ä̈R؈Ræ(â‰Rl èäŒRèâpêl ä؈Rä(‰Rãáø‰R˜Rä8‰R‰R˜Rt‰Rÿèä°‰Rä ‰Räã؈Rì â؈R ä܉Rè̉Rì â؈Rð ‰RꬌR˜äŠRæ˜ ŠRäâ â4ŠRää âdŠR, è|ŒRèâpê, ä4ŠR䄊R ãáT‹R˜R䔊RdŠR˜RЊRÿèä ‹RäüŠRäã4ŠRì â4ŠR ä8‹Rè(‹Rì â4ŠRðüŠRê|‹RÔKäd‹RæÔKè⤋R¼äŒ‹Râd‹R¼èâÌ‹R, ä´‹R⌋R, èâô‹RÂäÜ‹Râ´‹RÂèâŒR\ äŒRâÜ‹R\ èâDŒR$¥ ä,ŒRâŒR$¥ èâlŒR@µäTŒRâ ,ŒR@µ”ÜIä┌RðRä|ŒRâ TŒRðR”ÜIì, 䤌R4ŠRâÔŒR¬Ê弌RâŠR¬ÊéâüŒRá• ääŒR⼌Rá• ðl ä R؈Râ´R¤® ä$Râ lR¤® Nìà‰äü”R|“RâÈœRô.ä•R•RâáL•Rô.蘜Rèâ`êô.ä•Räl•Rãá<–R˜Rä|•RL•R˜R¸•Rÿèäô•Rää•Räã•Rì â•R ä –Rè–Rì â•Rðä•Rê`œRðGäL–RæðGd–Räâðâ”–RÀ%è0œRèâ`êÀ%äd–Rä´–R ãá„—R˜RäÄ–R”–R˜Rá—Rÿèä<—Rä,—Räãd–Rì âd–R äh—RèX—Rì âd–Rð,—RêÀ—RH¶ä”—RæH¶¬—Räpâ €âüæPääè—R “äЗRâ”—R “èlâ˜R„Ò äø—RâЗR„Ò èhâ8˜RPãä ˜Râø—RPãè`â`˜R´üäH˜Râ ˜R´üèX∘R°Ç äp˜RâH˜R°Ç èPâ°˜RPÆä˜˜Râp˜RPÆèHâؘR$u äÀ˜R☘R$u èFã™R„åè˜RâÀ˜R„éDâ(™RT·ä™Râè˜RT·è@âP™RÈàä8™Râ™RÈàè<âx™R­ä`™Râ8™R­è8â ™R¤W 䈙Râ`™R¤W è4âÈ™Rˆ" ä°™R∙Rˆ" è2âð™R¤—䨙Râ°™R¤—è0âšR0åšRâØ™R0è.â@šR„žä(šRãšR„žè,âhšR`l äPšRâ(šR`l è*âšR¬K äxšRâPšR¬K è(⸚RôÄä šRâxšRôÄè$âàšRÀ~äÈšRâ šRÀ~è â›R$¿ äðšRâÈšR$¿ èâ0›RÄä›RâðšRÄèâX›RP/ ä@›Râ›RP/ è‛Ræäh›Râ@›Ræè ⨛Rd*ä›Râh›Rd*èâЛRpí丛Râ›Rpíèâø›R¬µ äà›R⸛R¬µ èâ œRø¤äœRâà›Rø¤èâHœRd+ä0œRâœRd+ðÀ%äXœRd–R∜R¸äpœRâ L–R¸|GQäâ°œR¬Ê嘜RâpœR¬Êñô.äÀœR•RâôœR´š äØœRäœRæ âœñMꘚ äRRæ â RæääLñRâ $ñRœ>ÌýQäâŒñRXåätñRâ LñRXåÈBäâ´ñR>åœñRâtñR>ñ TäÄñRØìRâˆòRü$åÜñRäü$áòRäÿåä4òRïáPòRéBJìlòRéBJùBJì8óR@ ä˜òRä@ ÔòRÿìäðòRïáóRè óRì âÔ Lò8oìØóRüSäHóRäüS„óRÿìä óRïá¼óRè8ÆKø8oìèóR,2ä ”LLlôRäøóRä4ôRÿìäPôRïí¤PJì˜ôRxˆôR|ôRüÂMêôRüÂMâpõRDdä¨ôRäDdäôRÿìåõRïáõRèlÍJì8õRèôIìTõRè°"JøLbìˆõRä$å€õRtÄOâ÷R,Æä˜õR¤õRæ â´õRæâäõR¨ èäöRèâpê¨ ä´õRäöRãáÔöR˜RäöRäõR˜RPöRÿèäŒöRä|öRäã´õRì â´õR ä¸öRè¨öRì â´õRð|öRêüöRÂääöRæÂð¨ ä ÷R´õRâÌøR( ä$÷R0÷Ræâ`÷RtÑèœøRèâpêtÑä0÷Rä€÷RãáPøR˜Rä÷R`÷R˜RÌ÷RÿèäøRäø÷Räã0÷Rì â0÷R ä4øRè$øRì â0÷Rðø÷RêŒøR… ä`øRæ… xøRäâ êä´øRdPäœøRâ`øRdPðtÑäÄøR0÷RâäøRÐ1äÜøR¤ÄNâ°ùR äôøRä 0ùRááÿåäLùRïDáhùRèÌVOì”ùRè„ùRì â` RÿâlúRðœ äÀùRäðœ üùRááÿåäúRïDá4úRèÈBìPúRÿä|JêðúR\ä|úRä\¸úRááÿåäÔúRïDíì¥Kðt1åûRät1<ûRÿìäXûRä|JçátûRè|Jÿè˜ýRø ä ûR¬ûRæâÜûR¬ãèhýRèâpê¬ãä¬ûRäüûRãáÌüR˜Rä üRÜûR˜RHüRÿèä„üRätüRäã¬ûRì â¬ûR ä°üRè üRì â¬ûRðtüRêýR<§ äÜüRæ<§ ôüRäâ êä0ýRxÉ äýRâÜüRxÉ èâXýRdÒä@ýRâýRdÒèâ€ýR¬· ähýRâ@ýR¬· ð¬ãäýR¬ûRâäýRÀ2ä¨ýRæÀ2´Oâÿå0þR°ÆäôýRæ°ÆœBäÿå@þR ° ä LLL\þRPäPþRDfJælþRœÆä ,kJ¸þR(ä|þRæ(´Oâÿå<ÿRDTäÈþRäDTÿRááÿåä ÿRäœBçDíœBìS`° äLÿRTÿRâ â„ÿR`° èÔSèâpê`° äTÿRä¤ÿRãátS˜Rä´ÿR„ÿR˜RðÿRÿèä,SäSäãTÿRì âTÿR äXSèHSì âTÿRðSêœSèE ä„SæèE ˜äâÄS@\ä¬Sâ „S@\ ˜äâìSìl äÔSâ ¬Sìl ˜ì`° äüSTÿRâhSt%åS Sæ â0SæäLSïí|JìS´däxSä´d´SááÿåäÐSïDáìSèÈBø|Jê@SX%åSäX%áTSááÿåäpSïDáŒSèœBì¨SèœBê$SèÄSì âÔSæâSDw èôSèâpêDw äÔSä$S ãáôS˜Rä4SS˜RpSÿèä¬SäœSäãÔSì âÔS äØSèÈSì âÔSðœSêSÀäSæÀèâDS°‹ä,SâS°‹èâlS ²äTSâ,S ²èâ”SÔ°ä|SâTSÔ°è â¼S õä¤Sâ|S õèâäS¬2 äÌSâ ¤S¬2 œBäâ S0‰äôSâ ÌS0‰œBìDw äSÔSÿâ8%åPSä8%áŒSÿìä¨Sä|Jçí|Jì@SÇäÔSàSæâSXý èSèâpêXý äàSä0SãâS˜Rä@SS˜R|Sÿèä¸Sä¨SäãàSì âàS ääSèÔSì âàSð¨Sê(S°å äSæ°å |JìXý ä8SàSâô S 3äPS\SæâŒSL®è Sèâ@êL®ä\Sä¬Sãá|S˜Rä¼SŒS˜RøSÿèä4Sä$Säã\Sì â\S ä`SèPSì â\Sð$Sê¤SŒÈ äŒSæŒÈ œBäâÌSYä´Sâ ŒSYœBäâ SD>äÜSâ ´SD>ôSä â âØìRæÜ SŒÈä Sâ ÜSŒÈ, Sè â\ S´´ è¬ Sèâpê´´ ä, Sä| SãáL S˜RäŒ S\ S˜RÈ Sÿèä Säô Säã, Sì â, S ä0 Sè Sì â, Sðô Sêt SðÃä\ SæðÃè✠SË ä„ Sâ\ SË èâÄ S\k ä¬ Sâ „ S\k ÈBì´´ äÔ S, SæL®äì S\SâÌ SáUä SåU@ Sÿìä\ Sïáx SèlÍJì” SèôIì° Sè°"JøLbì¤ S$± äÜ Sä$±  Sÿìä4 SïáP SèlÍJìl SèôIìˆ Sè°"JøLbì| SX3ä´ SäX3ð Sÿìä Sïá( SèlÍJìD SèôIì` Sè°"JøLbìdSÀž äŒ SäÀž È Sÿìää SïáSéSì â@àIæ,SèTDìHSÿäLbìðS8‘ätS€Sæ âSæâÀSH™èÀSèâpêH™äSäàSãá°S˜RäðSÀS˜R,SÿèähSäXSäãSì âS ä”Sè„Sì âSðXSêØS|äÀSæ| ˜ìH™äèSSâäSøÆåSäøÆ<SÿìäXSïátSèœBìSè|Jì¬SøÈSèTDÿèôS˜ž äôS䘞 0SÿìäLSïáhSè ˜ì„Sè ˜ì Sø¼SèTDìØSÿäLbìSðäS˜KæˆS°%å S(SââXS°%éXSèâpê°%å(SäxSãáHS˜RäˆSXS˜RÄSÿèåSäðSäã(Sì â(S ä,SèSì â(SððSêpSôjåXSæôjáQäâ S¨"ä€Sâ XS¨"˜SäââÈSÀ· èðSèâpêÀ· ä˜SäèSãá¸S˜RäøSÈS˜R4SÿèäpSä`Säã˜Sì â˜S äœSèŒSì â˜Sð`SêàS¼b äÈSæ¼b èâSˆÞäðSâÈSˆÞðÀ· äS˜SâHS ‡ ä0Sâ €S ‡ èQLââpSìâäXSâ0Sìâð°%å€S(Sâ|Sܰ ä˜Säܰ ÔSááÿåäðSïDá Sø(SèTDìDSèœBì`SèÄRøT±PìüS<3äŒSä<3ÈSááÿåääSäÈBçDâSè|JêSè|Jê8SøTSøpSøŒSø¨SøÄSèÈBìàSèÌýQÿì3ä SSæ â(SæâXSÈmè¨SèâpêÈmä(SäxSãáHS˜RäˆSXS˜RÄSÿèåSäðSäã(Sì â(S ä,SèSì â(SððSêpSlÊäXSælÊèâ˜SÀä€Sâ XSÀ0 KäâÀS̉ ä¨Sâ €S̉ ,ÇJìÈmäÐS(Sâ´SxUäèSôSæ âSæâ4SXè„Sèâ@êXäSäTSãá$S˜RädS4S˜R SÿèäÜSäÌSäãSì âS äSèøSì âSðÌSêLS æä4Sæ æ ˜äâtSD>ä\Sâ 4SD>ôSä âœSŒÈä„Sâ \SŒÈ, SìXä¬SSâpSø± äÄSäø± áSááÿåäSïDá8Sè,9MìTSèlWMøHSøŸ äL=SäøŸ ˆ=Sÿìä¤=SïáÀ=SèlÍJìÜ=SèôIìø=Sè°"JøLbì?Sì4ä$>Säì4`>Säÿåä|>Sïá˜>Sø´>SèLbìÐ>SèLbìì>SèTDøLbìXDS¬Ÿ ä?S$?Sæ â4?Sæâd?SD#è(DSèâpêD#ä4?Sä„?SãáT@S˜Rä”?Sd?S˜RÐ?Sÿèä @Säü?Säã4?Sì â4?S ä8@Sè(@Sì â4?Sðü?SëDSx.åd@Sæx.á|@Säââ¬@S\’èÐCSèpæd?S\’ä|@SäÌ@SãáœAS˜RäÜ@S¬@S˜RASÿèäTASäDASäã|@Sì â|@S ä€ASèpASì â|@SðDASêÄASÐä¬ASæÐìÀCSœ¤åÔASâ¬ASœ¤áìASè âüASæ â,BSLzèCSèâpêLzäüASäLBSãáCS˜Rä\BS,BS˜R˜BSÿèäÔBSäÄBSäãüASì âüAS åCSèðBSì âüASðÄBSêXCSpä,CSæpDCSäâ êä€CS¨ ähCSâ,CS¨ èâ¨CSp™ äCSâhCSp™ ðLzä¸CSüASâèCSÈð äÐCSâÔASÈð ð\’äøCS|@SâDS\’äDS|@Sâ@DSàÉä(DSâd@SàÉðD#äPDS4?SâES”Ÿ ähDS䔟 ¤DSÿìäÀDSïáÜDSøøDSÿäLbì´ES¼Uä$ESä¼U`ESááÿåä|ESïDá˜ESèTDøTDì0HSÔ4äÄESÐESæ âàESæâFS°©éHSèâpê°©äàESä0FS ãâGS˜Rä@FSFS˜R|FSÿèä¸FSä¨FSäãàESì âàES ääFSèÔFSì âàESð¨FSê(GSø‡äGSæø‡èâPGSLä8GSâGSLèâxGSàä`GSâ8GSàèâ GSÐ0åˆGSâ`GSÐ0é âÈGS`0å°GSâˆGS`0éâðGSxÉäØGSâ °GSxÉÈBäâHS4¶åHSâ ØGS4¶ÈBì°©ä(HSàESâÐHS8² ä@HSä8² |HSááÿåä˜HSäàßQçDá´HSèàßQø|JêìHStŸ äàHSzLæüHSp4å=Jä² ä  tQ8JSÄ“äISäÄ“XISÿìätISïáISèœBì¬ISøÈISøäISèœBíJSøJSèÔDøœBìôJS@VäHJSä@V„JSÿìä JSïá¼JSèD²OìØJSè„øIøLbì°KS˜“äKS䘓@KSááÿåä\KSïDáxKSè4íIì”KSèTDøTDêÜKSÜ'åÀKSÌKSæ â˜Sæ°QSx“äìKSøKSæ âLSæâ8LSÌ? è€QSèâpêÌ? äLSäXLSãá(MS˜RähLS8LS˜R¤LSÿèäàLSäÐLSäãLSì âLS ä MSèüLSì âLSðÐLSêpQSÈä8MSæÈPMSäâ â`MSæ âMSÔè@QSèâpêÔä`MSä°MS ãá€NS˜RäÀMSMS˜RüMSÿèä8NSä(NSäã`MSì â`MS ädNSèTNSì â`MSð(NSê¨NS\P äNSä\P ˜äâÐNS0¶ä¸NSNS0¶°KäâøNS$Q äàNS¸NS$Q |Jäâ OS,ÂäOSàNS,°KäâHOSt•ä0OSOSt•|JäâpOS¯ äXOS0OS¯ |Jäâ0QSpÝå€OSâXOSpÝá˜OSäâ â¨OSæ âØOSlüéQSèâpêlüä¨OSäøOSãáÈPS˜RäPSØOS˜RDPSÿèä€PSäpPSäã¨OSì â¨OS ä¬PSèœPSì â¨OSðpPSêðPSlyäØPSæly°KäâQSž åQSâ ØPSž ˜ìlüä(QS¨OSâXQSTµä@QSâ€OSTµðÔähQS`MSâ˜QSŒ3ä€QSâ8MSŒ3ðÌ? ä¨QSLSâ4RS\“äÀQSä\“üQSááÿåäRSïDýPRSD“äDRS„ùRæTSÄ5ä`RSlRSæ â|RSæLâ¬RShýè`TSèâ@êhýä|RSäÌRSãáœSS˜RäÜRS¬RS˜RSSÿèäTSSäDSSäã|RSì â|RS ä€SSèpSSì â|RSðDSSêÄSSZ ä¬SSæZ èHãTSdÕäÔSSâ ¬SSdÕìSSäâ @ê ä(TS¸ÚäTSâÔSS¸ÚèâPTSÔp ä8TSâTSÔp èâxTSô"ä`TSâ8TSô"ðhýäˆTS|RSâUS¤Çä TSä¤ÇÜTSááÿåäøTSïDíÈBìXWS0“ä$US0USæ(â`US›è(WSèâpê›ä0USä€USãáPVS˜RäUS`US˜RÌUSÿèäVSäøUSäã0USì â0US ä4VSè$VSì â0USðøUSêxVS`Oå`VSæ`Oé$â VSœäˆVSâ `VSœ,ÅJäâÈVS”òä°VSâˆVS”òèâðVSlŽ äØVSâ°VSlŽ è âWSH½åWSâØVSH½èâ@WSœä(WSã WSœ0 Kì›äPWS0USâÜWSÈ'åhWSäÈ'á¤WSááÿåäÀWSïDíì¥KìôWSèUäìWS("Næd'åXSäd'á@XSÿìä\XSïáxXSè ˜ê”XSè ˜ÿæ4YSØVäÀXSäØVüXSÿìäYSïí|JêüZSȲ äDYSLYSâ â|YSȲ èÌZSèâpêȲ äLYSäœYSãálZS˜Rä¬YS|YS˜RèYSÿèä$ZSäZSäãLYSì âLYS äPZSè@ZSì âLYSðZSê”ZS¨\ä|ZSæ¨\èâ¼ZS<ä¤ZSâ |ZS< ˜äâäZSD äÌZSâ¤ZSD ðȲ äôZSLYSâ([S@(å [S[Sæ â´wQæT]S6ä8[SD[Sæ âT[Sæâ„[SäÄè$]SèâpêäÄäT[Sä¤[Sãát\S˜Rä´[S„[S˜Rð[Sÿèä,\Sä\SäãT[Sì âT[S äX\SèH\Sì âT[Sð\Sêœ\S¸ä„\Sæ¸èâÄ\SÄ> ä¬\Sâ„\SÄ> è âì\Sˆ€åÔ\Sâ¬\Sˆ€éâ]SÈVåü\SâÔ\SÈVá ˜äâ<]Stá ä$]Sâ ü\Stá ˜ìäÄäL]ST[Sâl]S¬Väd]SäYNâì]SÈ  ä|]Sˆ]Sæ â˜]Sæä´]SïáÐ]Sè ˜ÿè^SlVäü]S^Sæ â€õLêô5ä(^S4^Sæ âD^Sæât^S´qèÄ_Sèâpê´qäD^Sä”^Sãád_S˜Rä¤^St^S˜Rà^Sÿèä_Sä _SäãD^Sì âD^S äH_Sè8_Sì âD^Sð _SêŒ_SÜœ ät_SæÜœ è â´_Sô äœ_Sât_Sô èâÜ_S̉ äÄ_Sâ œ_S̉ ,ÇJì´qäì_SD^SâôdSø  ä`Säø  @`Sÿìä\`Sïá„dSèx`Sì âˆ`Sæâ¸`StY ádSèdSä @áptdSætY äˆ`SäØ`Sãá"4bSôO|aSè`S¸`SôO$aSÿèäPaSìãˆ`SølaSì âˆ`Sè„aS¸`SôOÀaSÿèäìaSìãˆ`SìbSèlaSø$bSê âˆ`S ääbS˜RäDbS¸`S˜R€bSÿèä¬bSä$bSäãˆ`SìÈbSèlaSø$bSêècS(FäôbS¸`S(F0cSâÿèä\cSìááˆ`S êxcSèlaSì”cSè|Pê°cSè„ëIìÌcSè|Pö ìIðtY äøcSˆ`Sæˆbì$dSˆ`Säââ¸`Sˆ6`dSÿäìâ0:s*έåªDw= dSè|Pê¼dSè„ëIìØdSè|Pö ìIì eSÐ6äeSeSæ âhtRæ„oS”Èä0eSäÌlSâ¤lSá>Rä â mSˆ§äôlSâ ÌlSˆ§Räâ4mSŒkämSâ ôlSŒk°Käâ\mS°äDmSâ mS°@ZLäâ„mST›älmSâDmST›ð´T ä”mSiSâÄmSd…ä¬mSâìhSd…èâìmSL?äÔmSâ ¬mSL?TDäânSüˆäümSâÔmSüˆð¤ä$nS”gSâTnS8ëääT’SøŽS$>’Sâÿèä¼’SìááÈŽSêØ’Sè¬Sìô’SèLBKì“SèFKì,“SèPLìH“Sè|PöØfìh”S'ät“SøŽS'°“SâÿèäÜ“SìááÈŽS êø“Sè¬Sì”Sè|Jì0”SèFKìL”SèˆZKÿì`ýäx”SÈŽSæˆb줔SÈŽSä ââøŽS(6à”Sÿä ìâ¡Hü©+Ï¢)ª=sR •SèLBKì<•SèFKìX•SèPLìt•Sè|Pö ìIìh–Sœ•ä •S䜕ܕSÿìäø•Sïá–SèlÍJì0–SèôIìL–Sè°"JøLbìì–S+åx–Sä+á´–SÿìäЖSïíôIì  SÀXüŸSü–S—Sæâ 8—SÀXxŸS茟Sä @ápìŸSæÀXä—SäX—S ãá"´˜SôOü—Sh—S8—SôO¤—SÿèäЗSìã—Søì—Sì â—Sè˜S8—SôO@˜Sÿèäl˜Sìã—S수Sèì—Sø¤˜Sê â—S äd™S˜RäĘS8—S˜Rá™Sÿèä,™S䤘Säã—SìH™Sèì—Sø¤˜SêšSÙå t™S8—SÙá°™SâÿèäÜ™Sìáá—S êø™Sèì—SÿèÄšSôk ä$šS8—Sôk `šSâÿè䌚Sìáá—SꨚSèì—Sø$ÓI쬛SŒYäÔšS8—SŒY›Sâÿèä<›Sìáá—SêX›Sèì—Sìt›Sè$ÓIì›Sè|PöØfìèœSÔ«ä¼›S8—SÔ«ø›Sâÿèä$œSìáá—Sê@œSèì—Sì\œSè$ÓIìxœSè|PꔜSèœBì°œSøÌœSèœBÿè$žS äøœS8—S 4Sâÿèä`Sìáá—Sê|Sèì—Sì˜Sè|Pê´SèœBìÐSøìSèœBìžSÿäLbì`ŸS´ ä4žS8—S´ pžSâÿè䜞Sìáá—S 긞Sèì—SìÔžSè|PêðžSèœBì ŸSø(ŸSèœBìDŸSÿäPÏIðÀXäpŸS—Sæˆb윟S—Sä,ââ8—Sl5á ØŸSÿä,ìâæÀåFã S—Sâ´ SÊä S( SæäD Sïá` SèLbì| SèØf옠SèLbøLbìT¡S|•äÄ Sä|•á¡Sááÿåä¡SïDá8¡SèœBøPÏIìp¡Sˆ¢ äd¡StÙQæ,¢SØh䀡SäØh¼¡Sááÿå䨡SïDáô¡SèÈBì¢Sÿô¸¥Sd•ä<¢SH¢Sæ âX¢Sæâˆ¢S8È èˆ¥Sèâpê8È äX¢S䨢Sãáx£S˜R丢Sˆ¢S˜Rô¢Sÿèä0£Sä £SäãX¢Sì âX¢S ä\£SèL£Sì âX¢Sð £SêP¥S\#䈣Sæ\# £Sä ââУSØÀè ¥SèâpêØÀä £Säð£SãáÀ¤S˜Rå¤SУS˜R<¤Sÿèäx¤Säh¤Säã £Sì â £S 䤤S蔤Sì â £Sðh¤Sêè¤SÈäФSæÈè â¥SÒäø¤Sâ ФSÒð$Käâ8¥S´ä ¥Sâø¤S´ðØÀäH¥S £Sâx¥S¼Ää`¥S∣S¼Äèâ ¥S̉ 䈥Sâ `¥S̉ ,ÇJì8È ä°¥SX¢S⬦S¨häÈ¥Sä¨h¦Sááÿåä ¦SïDá<¦Sèì¥KìX¦Sè,„Kìt¦SètOì¦SèœBø¸3Mêh§S ¢ 伦Sä ¢ ø¦Sááÿåä§SïDá0§Sè ˜êL§Sè ˜ÿ耧S¢ äx§SÔºQ✧Sphä§SêX¨S\h䬧Sä\hè§Sÿìä¨Sïá ¨Sè|Jê<¨Sè|Jÿê@häh¨Sä@h¤¨SÿìäÀ¨SïýЩSØ¢ äì¨S䨢 (©SááÿåäD©SïDá`©SèÔ‰Jì|©Sø˜©Sø´©SéBJøpìà©S´Êä ÜÖJ€ªSŒÊäð©SäŒÊ,ªSÿìäHªSïádªSèÌ‹LøX-ì «S|µ äªSä|µ ̪SÿìäèªSïá«Sè8ÆKøüÌK츭SdÊä0«SädÊl«Sÿì䈫SïᤫSè¤PJìÀ«SøÜ«Sè\’Jøø«Sì â¬Sæ â8¬S V舭Sèâpê Vä¬SäX¬Sãá(­S˜Räh¬S8¬S˜R¤¬Sÿèäà¬SäЬSäã¬Sì â¬S ä ­Sèü¬Sì â¬SðЬSêP­Sø‡ä8­Sæø‡èâx­Shg ä`­Sâ 8­Shg œBäâ ­SÐÒ䈭Sâ `­SÐÒ„ëIì Vä°­S¬Sâ®S\YäÈ­Sæ\YœBäÿåP®S,Yä®Sæ,YœBäÿå8¯S Yä`®Sâ ð®S Yx®Sèæ®Säpß ä ¨®SDÊ x®Sì À®Sô: x®Sê Ø®Süc x®Sê `®S¬x®Sê ¯SÜ[x®Sê ¯SÜZx®S îP]x®S@èT±SèXäH¯ST¯Sæâ„¯SÈ_è$±SèâpêÈ_äT¯S䤯Sãát°S˜Rä´¯S„¯S˜Rð¯Sÿèä,°Sä°SäãT¯Sì âT¯S äX°SèH°Sì âT¯Sð°SꜰSÔ_ ä„°SæÔ_ œBäâİSœô䬰Sâ„°Sœôè âì°S(r äÔ°S⬰S(r èâ±Sì äü°SâÔ°Sì èâ<±Sìâä$±Sâü°SìâðÈ_äL±ST¯S″S$–äd±Sp±Sæ ‱Sæâ°±Sˆs èP³Sèâpêˆs 䀱SäбSãá ²S˜Räà±S°±S˜R²SÿèäX²SäH²Sä〱Sì ‱S 䄲Sèt²Sì ‱SðH²SêȲS(’ ä°²Sæ(’  Käâð²SáÒäزSâ°²SáÒèâ³Stß å³SâزStß èâ@³Sè ä(³Sã³Sè è âh³SÔäP³Sâ (³SÔÐVLìˆs äx³S€±SâdºS4Êä³Sœ³Sæ ⬳SæâܳSpôè4ºSèâpêpô䬳Säü³SãáÌ´S˜Rä ´SܳS˜RH´Sÿèä„´Sät´Sä㬳Sì ⬳S ä°´Sè ´Sì ⬳Sðt´Sêô´Sl2 äÜ´Sæl2 œBäâÔµS„fåµSâÜ´S„fáµSäâ â,µSæäHµSïádµSè@ZL쀵Sè°K융SèTD층SèLbøœBìüµST2 ääµSâ µST2 œBä â$ºSIä ¶Sâ äµSI$¶Säâ â4¶SæäP¶Sïáì¹Sèl¶Sì â|¶Sæâ¬¶S̋輹SèâpêÌ‹ä|¶Sä̶Sã᜷S˜RäܶS¬¶S˜R·SÿèäT·SäD·Säã|¶Sì â|¶S 䀷Sèp·Sì â|¶SðD·Sê\¹STö 䬷SæTö Ä·Säâ âÔ·Sæâ¸Sx¡é,¹Sèâpêx¡åÔ·Sä$¸Sãáô¸S˜Rä4¸S¸S˜Rp¸Sÿè䬸S䜸SäãÔ·Sì âÔ·S äظSèȸSì âÔ·Sðœ¸Sê¹St„ä¹Sæt„ЦMäâD¹S@Ò ä,¹Sâ¹S@Ò ðx¡åT¹SÔ·SℹSÄæål¹S⬷SÄæá°Kä⬹S¸g䔹Sâ l¹S¸g@ZLäâÔ¹Stùä¼¹S┹StùðÌ‹ää¹S|¶SâºSèLbøœBìLºSÄæå4ºSâ ¶SÄæá°Kìpôä\ºS¬³Sâ»S|8ätºSä|8°ºSÿìä̺SïáèºSÿô»S\µ ä»S oS※S +å,»S8»Sæ âH»Sæäd»Sïí ˜ì ¼S(iä»Sä(iÌ»Sááÿåäè»SïDá¼SèÈBø ˜ê<¿S¼¢ ä0¼S<¼Sæ âL¼Sæ,â|¼S êè ¿Sèâpê êäL¼S䜼S ãál½S˜R䬼S|¼S˜Rè¼Sÿèä$½Sä½SäãL¼Sì âL¼S äP½Sè@½Sì âL¼Sð½SꔽS¬å|½Sæ¬é(â¼½S|夽Sâ|½S|á ˜ä$âä½S€~ä̽S⤽S€~è â ¾S¨Wäô½Sâ ̽S¨Wì…Käâ4¾Sßä¾Sâ ô½Sßì…Käâ\¾S€t äD¾Sâ ¾S€t ¬@MäℾS; äl¾SâD¾S; è⬾S䔾Sâl¾Sè âÔ¾S» ä¼¾S┾S» èâü¾S*ää¾Sâ¼¾S*èâ$¿Sìâä ¿Sâä¾Sìâð êä4¿SL¼SâX¿SÊäL¿SX¢SæÀSP8äh¿SäP8¤¿SááÿåäÀ¿SïDáÜ¿Sèì¥Kìø¿Sè¸3Mÿìiä$ÀSÌkiú-òÌù-öÜÁSÌäpÀS|ÀSæâ¬ÀSüó è¬ÁSèâpêüó ä|ÀSäÌÀSãáœÁS˜RäÜÀS¬ÀS˜RÁSÿèäTÁSäDÁSäã|ÀSì â|ÀS ä€ÁSèpÁSì â|ÀSðDÁSêÄÁS°å ä¬ÁSæ°å ˜ìüó äÔÁS|ÀSâ8ÈSl9äìÁSøÁSæâ(ÂSø³èÈSèâ@êø³äøÁSäHÂSãáÃS˜RäXÂS(ÂS˜R”ÂSÿèäÐÂSäÀÂSäãøÁSì âøÁS äüÂSèìÂSì âøÁSðÀÂSê@ÃSŒÈ ä(ÃSæŒÈ œBäâhÃSYäPÃSâ (ÃSYœBäâøÇSD>äxÃSâ PÃSD>ÃSä â â ÃSæLâÐÃS,\èÈÇSèâ@ê,\ä ÃSäðÃSãáÀÄS˜RåÄSÐÃS˜R<ÄSÿèäxÄSähÄSäã ÃSì â ÃS ä¤ÄSè”ÄSì â ÃSðhÄSêèÄS„läÐÄSæ„l|JâHâÅS˜ÅäøÄSâ ÐÄS˜ÅHîRäDâ8ÅSô¤ ä ÅSâøÄSô¤ è@â`ÅS áäHÅSâ ÅS á|Jâ<âˆÅSàüäpÅSâHÅSàüè:â°ÅSÔµä˜ÅSâpÅSÔµè8âØÅSLxäÀÅSâ˜ÅSLxè4ãÆS8ª äèÅSâ ÀÅS8ª |Jâ0â(ÆS˜ôäÆSâ èÅS˜ô|Jâ,âPÆS ä8ÆSâÆS è(âxÆSÒä`ÆSâ 8ÆSÒ|Jä$â ÆSGäˆÆSâ`ÆSGè âÈÆSèHä°ÆSâ ˆÆSèH|JäâðÆS\"䨯Sâ°ÆS\"èâÇSPÄåÇSâØÆSPÄèâ@ÇSdH ä(ÇSã ÇSdH |JäâhÇS˜°äPÇSâ (ÇS˜°|Jâ âÇSœ>äxÇSâ PÇSœ>ÌýQäâ¸ÇSXåä ÇSâ xÇSXåÈBäâàÇS>åÈÇSâ ÇS>ñ,\äðÇS ÃSâ ÈSŒÈäÈSâ xÃSŒÈ, Sìø³ä0ÈSøÁSâ„ÈS@ZäHÈSæ@Z´Oâÿå\ÉS<9ä”ÈSä<9ÐÈSÿìäìÈSïáÉSèlÍJì$ÉSèôIì@ÉSè°"JøLbì0ÍSD¶ älÉSxÉSæ âˆÉSæâ ¸ÉSxI¬ÌSèÀÌSä @áp ÍSæxIäˆÉSäØÉSãá"4ËSôO|ÊSèÉS¸ÉSôO$ÊSÿèäPÊSìãˆÉSølÊSì âˆÉSè„ÊS¸ÉSôOÀÊSÿèäìÊSìãˆÉSìËSèlÊSø$ËSê âˆÉS ääËS˜RäDËS¸ÉS˜R€ËSÿèä¬ËSä$ËSäãˆÉSìÈËSèlÊSø$ËSê”ÌSÜ-äôËS¸ÉSÜ-0ÌSâÿèä\ÌSìááˆÉS êxÌSèlÊSø|PîxIä¤ÌSˆÉSæˆbìÐÌSˆÉSäââ¸ÉSt  ÍSÿäìâ`= ßTŽe++Ñ@ÍS(£ ä Ì,QÎSÜËäPÍSäÜËŒÍSÿìä¨ÍSïáÄÍSéSìàÍSèœBêüÍSÿäLbìDÎSh–ä(ÎS4ÎSæ âœsSæ8ÏSÀËäTÎSäÀËÎSÿìä¬ÎSïáÈÎSèœBìäÎSè ˜íÏSøÏSèTDÿèHÐSᣠäHÏSå£ „ÏSÿìä ÏSïá¼ÏSè|JìØÏSè|JìôÏSøÐSèTDì,ÐSÿäLbìXÐS,9ä $oP0ÑS¬YähÐSä¬Y¤ÐSááÿåäÀÐSäTDçDáÜÐSè4íIìøÐSè)JìÑSèTDÿæÔS8,å@ÑSLÑSæ(â|ÑS°{ èäÓSèâpê°{ äLÑSäœÑS ãálÒS˜Rä¬ÑS|ÑS˜RèÑSÿèä$ÒSäÒSäãLÑSì âLÑS äPÒSè@ÒSì âLÑSðÒSê”ÒSáÝ ä|ÒSçÝ è$â¼ÒSX ä¤ÒSâ|ÒSX è âäÒS@‰ äÌÒSâ¤ÒS@‰ èâ ÓSZ äôÒSâÌÒSZ èâ4ÓSäÓSâôÒSèâ\ÓS|ÕäDÓSâ ÓS|Õ|Jäâ„ÓSHU älÓSâDÓSHU è â¬ÓSŒä”ÓSâ lÓSŒ|JäâÔÓS¨cä¼ÓSâ”ÓS¨cèâüÓS|‰ ääÓSâ¼ÓS|‰ ð°{ ä ÔSLÑSâÕS¼µ ä$ÔSä¼µ `ÔSááÿåä|ÔSïDá˜ÔSø´ÔSè¼p-ìÐÔSèœBììÔSèÄRøT±PìÄÕSxËäÕSäxËTÕSááÿåäpÕSïDáŒÕSèüÙMì¨ÕSèLxNÿèD×S9äÔÕSä9ÖSááÿåä,ÖSäÈBçDáHÖSè ˜êdÖSè ˜ê€ÖSøœÖSø¸ÖSøÔÖSøðÖSø ×SèÈBì(×SèÌýQÿèÈ×S`ËäT×Sä`Ë×Sááÿåä¬×SïDý„ØS ,åØ×Sä ,áØSááÿåä0ØSïDáLØSèì¥KìhØSè¸3MÿæœØS@Ë䔨S N樵 䬨S䨵 èØSááÿåäÙSïDá ÙSèœBì<ÙSÿôÜÙSkähÙSäk¤ÙSäÿåäÀÙSïí„ëIì´ÚSÜjäìÙSäÜj(ÚSÿìäDÚSïá`ÚSèlÍJì|ÚSèôIì˜ÚSè°"JøLbìTÛS0[äÄÚSä0[áÛSÿìäÛSïá8ÛSèp'Nø|Jì,ÜSüZädÛSäüZ ÛSÿìä¼ÛSïáØÛSèlÍJìôÛSèôIìÜSè°"JøLbìèÜS€Ìä<ÜSä€ÌxÜSÿìä”ÜSïá°ÜSè ˜ìÌÜSè ˜ø ˜ìÄâSÌ9äøÜSáÝSââ0ÝSÌ9è”âSèâpêÌ9åÝSäPÝSãá ÞS˜Rä`ÝS0ÝS˜RœÝSÿèäØÝSäÈÝSääÝSì ãÝS äÞSèôÝSì ãÝSðÈÝSêlâSx.å0ÞSæx.áHÞSäââxÞSL•è<âSèpæ0ÝSL•äHÞSä˜ÞSãáhßS˜Rä¨ÞSxÞS˜RäÞSÿèä ßSäßSäãHÞSì âHÞS äLßSè<ßSì âHÞSðßSê,âSœ¤åxßS朤áßSè â ßSæâÐßS¼ëèüáSèâpê¼ëä ßSäðßS ãáÀàS˜RåàSÐßS˜R<àSÿèäxàSähàSäã ßSì â ßS ä¤àSè”àSì â ßSðhàSêüàS”BäÐàSæ”BèàSäâ êä$áSìâä áSâÐàSìâèâLáS|Kä4áSâ áS|KèâtáS0Kä\áSâ4áS0KèâœáS(Ëä„áSâ\áS(Ëè âÄáStä¬áSâ„áStèâìáSáwäÔáSâ¬áSáwèââSxÍäüáSâÔáSxÍð¼ëä$âS ßSâTâSÈð ä<âSâxßSÈð ðL•ädâSHÞSâ„âSL•ä|âSHÞSâ¬âSàÉä”âSâ0ÞSàÉðÌ9ä¼âSáÝSâÔâSÜZä ¯SãS¼jääâSä¼j ãSááÿåä<ãSïDáXãSè4íIìtãSèTDÿè0äS¸£ ä ãS丣 ÜãSááÿåäøãSïDáäSèèQLÿæ´äS¨jä@äSä¨j|äSÿìä˜äSïí ˜ê4èSLÌäÄäSäLÌáåSááÿåäåSïDá8åSøèSèTåSì âdåSæTâ”åSLCéèçSèâ@êLCådåSä´åS ãá„æS˜RäÄåS”åS˜RáæSÿèä<æSä,æSäãdåSì âdåS ähæSèXæSì âdåSð,æSê¬æSZ 䔿SæZ èPâÔæS4ð 伿Sâ”æS4ð èNâüæSˆ\ääæSâ¼æSˆ\èLâ$çS ä çSâäæS èJâLçS¼Iä4çSâ çS¼IèHâˆçSdÕä\çSâ 4çSdÕtçSäâ @ê ä°çS¸Úä˜çSâ\çS¸ÚèâØçSÔp äÀçSâ˜çSÔp èãèSô"äèçSâÀçSô"ðLCåèSdåSþPèS˜ZäDèS}SæÔèSd£ ä`èSäd£ œèSááÿåä¸èSïDý$êS ,åäèSìèSâæéSä ,å éS„ìèSê4éSœ7áìèSê LéS,+ ìèSê déS¨ÓìèSê |éS8ìèSê ”éS`}ìèSê ¬éS|!ìèSê ÄéS¸ìèSê ÜéSðáìèS ê ôéS|„ ìèS ê êS… ìèS îø ìèS ìD£ ä4êSä*Sæ\êSÌ-åPêSÐyPætêS,\älêS ÃSâëS`¤ ä„êSä`¤ ÀêSááÿåäÜêSïDáøêSÿäšJì@ëS¤:0ëS$ëS<9Mê8ëS<9MâìSp· äPëSäp· ŒëSÿìä¨ëSïáÄëSèlÍJìàëSèôIìüëSè°"JøLbì0ìS´-å(ìS ÌPâ@ìSÜ[ä ð®SXìS<¤ äPìSŒ™KâhíS4ÍähìSä4ͤìSááÿåäÀìSïDáÜìSøøìSøíSø0íSèœBêLíSè ˜ÿè4îS¤ äxíSä¤ ´íSááÿåäÐíSïDáìíSèÌVOìîSèîSì â³PÿâÐïSáÍäDîSPîSæ â`îSæ âpîSæâ îSÈ|è ïSèâ@êÈ|äpîSäÀîSãáïS˜RäÐîS îS˜R ïSÿèäHïSä8ïSäãpîSì âpîS ätïSèdïSì âpîSð8ïSê¸ïSXää ïSæXäðÈ|äÈïSpîSâìïSx-åàïSê¨ðSè£ äüïSäè£ 8ðSááÿåäTðSïDápðSèÈBìŒðSÿä ˜êÔòSì–ä¸ðSÄðSæ âÔðSæâñSÔè¤òSèâpêÔäÔðSä$ñSãáôñS˜Rä4ñSñS˜RpñSÿèä¬ñSäœñSäãÔðSì âÔðS äØñSèÈñSì âÔðSðœñSêòS~äòSæ~èâDòS|<ä,òSâòS|<èâlòSdÙäTòSâ,òSdÙèâ”òSÐÿå|òSâTòSÐÿéâ¼òS ¥ä¤òSâ|òS ¥ðÔäÌòSÔðSæ<· ääòSÌk<· €.òD.öðõS@.å0óSä@.álóSááÿåäˆóSïDá¤óSèÐyPìÀóSøœõSèÜóSì âìóSæ$âôSÄÎèlõSèâpêÄÎäìóSä<ôSãá õS˜RäLôSôS˜RˆôSÿèäÄôSä´ôSäãìóSì âìóS äðôSèàôSì âìóSð´ôSê4õSˆ äõSæˆ |¢Räâ\õSÔ®äDõSâ õSÔ® ˜äâ„õSL½ älõSâ DõSL½ ˜ìÄÎä”õSìóSâ¸õSøÔõSèLbøLbìÈöSh˜åöSäh˜<öSÿìäXöSïátöSèlÍJìöSèôIì¬öSè°"JøLbì„÷S@˜äØöSä@˜÷Sÿìä0÷SïáL÷SèD²Oìh÷Sè„øIøLbì@øS˜ä”÷Sä˜Ð÷Sááÿåäì÷SäTDçDáøSè4íIì$øSèTDøTDêXøSÀ· äPøS˜Sâ úSÈkähøSpøSââ øSÈkèðùSèâpêÈkäpøSäÀøSãáùS˜RäÐøS øS˜R ùSÿèäHùSä8ùSäãpøSì âpøS ätùSèdùSì âpøSð8ùSê¸ùS$û ä ùSæ$û °KäâàùS‰äÈùSâ  ùS‰LSäâúSá äðùSâÈùSá °KìÈkäúSpøSâÜúS ¤ ä0úSä ¤ lúSááÿåäˆúSïDá¤úSèœBìÀúSÿäLbì¸üSäÍäìúSøúSæ âûSæ â8ûShèˆüSèâ@êhäûSäXûSãá(üS˜RähûS8ûS˜R¤ûSÿèäàûSäÐûSäãûSì âûS ä üSèüûSì âûSðÐûSêPüSt ä8üSæt èâxüS¼“ ä`üSâ8üS¼“ èâ üST äˆüSâ`üST ðhä°üSûSâÔüS(;äÈüSlRSæðüSÈÍä äüSàiOätýSè:åýSäè:<ýSááÿåäXýSïDíœBðì-å„ýS´Oæ¬ýSP¥ ä ýS¨XJæ„þSTÎä¼ýSäTÎøýSÿìäþSïá0þSèlÍJìLþSèôIìhþSè°"JøLbìÐþS(¥ ä”þSæ(¥ ´OâÿåìþSÀ.åàþS[SæüþSP]ä ¯S€ÿS¥ ä ÿSä¥ HÿSááÿåädÿSïDíœBì Tì\äÿSäì\ÌÿSááÿåäèÿSïDáTèÈBÿèˆT\ä0Tä\lTÿììLRê˜TÎä$äd.å ¨TÌkd.á .ðØ.öôTDmäôTäDm0TÿìäLTïáhTèœBì„Tø Tø¼TèœBìØTÿäX-ì@T`/åTæ`/á´OâÿåàT4/åPTä4/áŒTÿìä¨TïáÄTè¤PJø\aJì Tì]üTðT4ÓIêT4ÓIâ(T¨ÎäThŸLæT´¥ ä8T@TââpT´¥ èèTèâpê´¥ ä@TäTãá`T˜Rä TpT˜RÜTÿèäTäTäã@Tì â@T äDTè4Tì â@TðTêˆTÔ¡äpTæÔ¡è â°Tpä˜TâpTpèâØTPÉäÀTâ˜TPÉèãTìâäèTâÀTìâð´¥ äT@Tâ4TP™ä(T\0Ræ¸T0<äDTä0<€TááÿåäœTïDíØfìÐTä.åÈTªNâìT8™äàT°gOæ¨TŒ]äüTäŒ]8TááÿåäTTïDápTè¬@MìŒTÿôÔTxÎä¸TÄTæ â }NæðT|lääTÔëQ꘥ åT Tæ@â<Tè=èÄ TèâPêè=ä Tä\T ãá,T˜RälT<T˜R¨TÿèääTäÔTäã Tì â T äTéTì â TðÔTêTTx ä<Tæx è>â|T44 ädTâ<T44 è<â¤Tp]äŒTâdTp]è:âÌTd` ä´TâŒTd` è8âôT„©äÜTâ´T„©è7â TlÃä TâÜTlÃè6âD Tˆyä, Tâ Tˆyè4âl T°áäT Tâ, T°áè2â” T„;ä| TâT T„;è0â¼ Tè×ä¤ Tâ| Tè×è,âä T$CäÌ T⤠T$Cè*â Tt åô TâÌ Tt é(â4 T\Åä Tâô T\Åè&â\ TDÜäD Tâ TDÜè$â„ T8äl TâD T8è"⬠T¯ä” Tâl T¯è âÔ T$÷ä¼ Tâ” T$÷èâü TŒ~ ää Tâ¼ TŒ~ èâ$ TÌë ä Tâä TÌë èâL T8S ä4 Tâ T8S èât TxWä\ Tâ4 TxWè✠TpBä„ Tâ\ TpBèâÄ TøÐå¬ Tâ„ TøÐéâì Ttn äÔ T⬠Ttn è â Tè äü TâÔ Tè èâ< Tá4ä$ Tâü Tá4èâd TгäL Tâ$ Tгè⌠Tˆ!ät TâL Tˆ!èâ´ TÈÇäœ Tât TÈÇèâÜ TØ>äÄ T✠TØ>ðè=äì T Tâ T ¹ ä T Tæ â–OæÀ TÔ™ä0 TäÔ™l Tÿìäˆ TïᤠTè,9Mø¬@Mì˜TÀ¦ äÐ TäÀ¦ Tÿìä(TïáDTèlÍJì`TèôIì|Tè°"JøLbìäT¨¦ ä¨T樦 ´Oâÿå\Tü¸ äôTüTââ,Tü¸ è,Tèâpêü¸ äüTäLTãáT˜Rä\T,T˜R˜TÿèäÔTäÄTäãüTì âüT åTèðTì âüTðÄTêDT¬2ä,Tæ¬2ðü¸ äTTüTâ°T0ålTä0á¨TááÿåäÄTïDáàTèœBêüTøTè|Jê”Tè4Tì âDTæ âtT(› èdTèâpê(› äDTä”T ãádT˜Rä¤TtT˜RàTÿèäTä TäãDTì âDT äHTè8Tì âDTð TêŒTH¬åtTæH¬éâ´Tls äœTâtTls èâÜT ¿äÄTâ œT ¿°KäâTL{äìTâÄTL{è â,TäTâìTèâTTLšä<Tâ TLš ˜äâ|TìâädTâ<Tìâð(› äŒTDTîœBì4Tè/åÀTäè/áüTááÿåäTïDí ˜êPT¸™äDT0{SæpT°/å`Tä°/áœTááÿåä¸TïDáÔTèÈBøðTì ãTæäTïá8TèÈBìTTè|JöœBìTÔÎä€TŒTæâ¼TDÚèäTèâpêDÚäŒTäÜTãá¬T˜RäìT¼T˜R(TÿèädTäTTäãŒTì âŒT äTè€Tì âŒTðTTêÔT€Dä¼Tæ€DÈBäâüT¸ääTâ¼T¸ðDÚä TŒTâ´T$^ä$T,Tâ â\T$^è„Tèâpê$^ä,Tä|TãáLT˜RäŒT\T˜RÈTÿèäTäôTäã,Tì â,T ä0Tè Tì â,TðôTêtT÷ ä\Tæ÷ èâœT̉ ä„Tâ \T̉ ,ÇJì$^ä¬T,TâŒTpmäÄTäpmáTááÿåäTäì¥KçDá8Tè|JêTTè|JêpTè|JöÊOêàT”™äœT¨Tæ â¸Tæ0âèTáxè°Tèâpëxä¸TäTãáØT˜RäTèT˜RTTÿèäTä€Täã¸Tì â¸T ä¼Tè¬Tì â¸Tð€TëT´}äèTæ´}è,â(T,“äTâ èT,“´OäâPT8N ä8Tâ T8N ´Oä âxTLxä`Tâ8TLxèâ T|^ äˆTâ`T|^ èâÈTðä°Tâ ˆTð¼tLíxäØT¸TâüT`mäðTLbæT¨¸ ä Tø,Jê^ä(Tä^dTÿìä€TïáœTèîì¸TÿôTÀ^ääTäÀ^ Tÿìä<TïáXTèœBìtTøTè|Jì¬TøÈTèÔDìäTè|JíTÿäÔDì8Tlšä,Tê€TPnäHTäPn„Tááÿåä TïDá¼TèœBìØTè¤PJìôTøTø,TèÔ‰JìHTéBJìdTèŠJøpìÌT <äTæ <œBäÿå¤ TX¹ äÜTäX¹  Tÿìä4 TïáP TèlÍJìl TèôIìˆ Tè°"JøLbìø"T´0å´ T¼ Tââì T´0éÈ"Tèâpê´0å¼ Tä !TãáÜ!T˜Rä!Tì T˜RX!Tÿèä”!Tä„!Täã¼ Tì â¼ T äÀ!Tè°!Tì â¼ Tð„!Tê"T… äì!Tæ… "Täâ êä@"TdPä("Tâì!TdPèâh"T˜Ó äP"Tâ("T˜Ó è â"TÀuäx"TâP"TÀuèâ¸"TÇå "Tâx"TÇéâà"TTÚäÈ"Tâ "TTÚð´0åð"T¼ Tâ$#T8¹ ä#T#Tæ â|âRæÌ&TdÏä4#T<#Tâ,âl#TdÏèœ&Tèâ@êdÏä<#TäŒ#Tãá\$T˜Räœ#Tl#T˜RØ#Tÿèä$Tä$Täã<#Tì â<#T ä@$Tè0$Tì â<#Tð$Tê„$TlSäl$TælSè*â¬$Tábå”$Tâl$Tábé(âÔ$TìTä¼$Tâ”$TìTè&âü$T´Âää$Tâ¼$T´Âè$â$%Tìrä %Tâä$Tìrè âL%TpÓä4%Tâ %TpÓèât%T$Xä\%Tâ4%T$Xèâœ%T|fä„%Tâ\%T|fèâÄ%TüXä¬%Tâ„%TüXèâì%Tä‡äÔ%Tâ¬%Tä‡èâ&T,G äü%TâÔ%T,G èâ<&T¨÷å$&Tâü%T¨÷é âd&Tt äL&Tâ$&Tt èâŒ&T¼“ ät&TâL&T¼“ èâ´&TT äœ&Tât&TT ðdÏäÄ&T<#Tâl'THÏäÜ&TäHÏ'Tááÿåä4'TïDáP'Tè ˜ÿèD(Tümä|'Täüm¸'TááÿåäÔ'TïDáð'Tø (Tø((TèœBÿèø)TämäT(T`(Tæ âp(Tæâ (TÀÔèÈ)TèâpêÀÔäp(TäÀ(Tãá)T˜RäÐ(T (T˜R )TÿèäH)Tä8)Täãp(Tì âp(T ät)Tèd)Tì âp(Tð8)Tê¸)T,Æä )Tæ,Æèâà)TxäÈ)Tâ )TxðÀÔäð)Tp(Tâ°*T0šä*T*Tæ â$*Tæä@*Tïá\*TèÈBìx*Tè ˜ì”*TèœBÿèÌ*Tt^äÀ*T(Sê¨mäÜ*Tè*Tæ âø*Tæâ(+TÀ² èð,Tèâ`êÀ² äø*TäH+Tãá,T˜RäX+T(+T˜R”+TÿèäÐ+TäÀ+Täãø*Tì âø*T äü+Tèì+Tì âø*TðÀ+Tê@,T@yä(,Tæ@yèâh,Tì@äP,Tâ(,Tì@èâ,TÌ%äx,TâP,TÌ%è â¸,Tì¨ä ,Tâx,Tì¨èâà,TÔ äÈ,Tâ ,TÔ èâ-Tøµäð,TâÈ,TøµðÀ² ä-Tø*TâL.T`=ä0-Tä`=l-Tááÿåäˆ-TïDá¤-TèðJìÀ-TøÜ-Tøø-Tø.Tø0.Tè ‚Køì´Lì\.Tønä l¿Nà.T=äl.Tä=¨.TÿìäÄ.TïíxCRì,/TÜnäð.TæÜn´Oâÿå 0Tì<äTŒ¨ ä´=Tâ ,>TŒ¨ Ì=T@èæä=TäMä ü=T¢Ì=Tê >TÌýÌ=Tê´=Táž Ì=Tê D>TP Ì=Tê \>TøO Ì=Tî8ÂÌ=T è?Tlº ä„>Tälº À>TÿìäÜ>Tïáø>Tè$ÓIÿèì?TD1å$?TäD1á`?Tÿìä|?Tïá˜?TèlÍJì´?TèôIìÐ?Tè°"JøLbìäüTTä4>8UTááÿåäTUTïDápUTøŒUTèTDê¨UTÿôŒWT8œäÔUTÜUTâ â VT8œè\WTèâ@ê8œäÜUTä,VTãáüVT˜Rää¸WT gOæ0ZTÄÑäÔWTàWTæ âXTX­ éZTèâpêX­ äàWTä0XT ãâYT˜Rä@XTXT˜R|XTÿèä¸XTä¨XTäãàWTì âàWT ääXTèÔXTì âàWTð¨XTê(YTáÂäYTçÂèâPYT´Ï ä8YTâYT´Ï èâxYTĘä`YTâ8YTĘèâ YT¬â äˆYTâ`YT¬â èâÈYT€„ ä°YTâˆYT€„ è âðYT|2 äØYTâ°YT|2 èâZT̉ åZTâ ØYT̉ ,ÇJìX­ ä(ZTàWTâHZT Ñä@ZT˜YRâ|^Tt2åXZTdZTæ âtZTædâ¤ZTìCèL^TèâpêìCätZTäÄZTãá”[T˜RäÔZT¤ZT˜R[TÿèäL[Tä<[TäãtZTì âtZT äx[Tèh[Tì âtZTð<[Tê¼[TЕä¤[TæЕè`âä[T0²äÌ[Tâ¤[T0²è\â \Täô[TâÌ[TèXâ4\Tt ä\Tâ ô[Tt ä6MäPâ\\T¸¤äD\Tâ \T¸¤ä6MäHâ„\TäÔdTàdTæ âðdTæâ eTà½èÀfTèâpêà½äðdTä@eTãáfT˜RäPeT eT˜RŒeTÿèäÈeTä¸eTäãðdTì âðdT äôeTèäeTì âðdTð¸eTê8fT¸ä fTæ¸èâ`fTÄ> äHfTâ fTÄ> è âˆfTˆ€åpfTâHfTˆ€éâ°fTÈVå˜fTâpfTÈVá|JäâØfTtá äÀfTâ ˜fTtá |Jìà½äèfTðdTãgT\>ä oPàlmT\¼ ägTä\¼ LgTááÿåähgTïDí„gTê â”gTæâÄgT<èäüuTâ ÔuTD>ÃSä âäÜyTäè>zTááÿåä4zTäàßQçDáPzTÿäTDêðzTP½ ä|zTäP½ ¸zTááÿåäÔzTïDí ˜îìœå{Tê8|T°?ä{Tä°?X{Tááÿåät{TïDá{Tè04Kì¬{Tè|PêÈ{Tøä{Tè”}Kí|Tè Nì|TèðJøØfìØ|T qäH|Tä q„|Täÿåä |Tïá¼|TèšJøšJìx}T˜ª äè|T䘪 $}Tááÿåä@}TïDá\}TÿäšJìP~Táçœý>áçÿí ðÿÿœááÿÿÿÿÿõâ¤å@Aÿä ïäïœááÿÿÿÿþâÕÿì ïÿááÿÿïÿåâ ÿìïÿœááÿÿÿÿìáàÿÿÿÿâæ ÿä ðÿÿœááÿÿÿÿÿõâžæ@ôé|”Tü:ápäý€•TŸä¸”TäŸô”Tÿìä•Tïá,•TèlÍJìH•TèôIìd•Tè°"JøLb쬕T´cœ•T•T´PJꤕT´PJâx–TÄ4引TäÄ4áø•Tÿìä–TäTDçá0–TèLbìL–TèTDøh–Tì âìXMæP—TØÔ䈖TäØÔÄ–Tÿìäà–Tïáü–TèlÍJì—TèôIì4—Tè°"JøLbìÌ™T<¿ ä`—Tä<¿ œ—Tÿì丗TïáÔ—Tè ˜ìð—TèØfø ˜Tì â˜Tæ âL˜TXC蜙TèâpêXCä˜Täl˜Tãá<™T˜Rä|˜TL˜T˜R¸˜Tÿèäô˜Tää˜Täã˜Tì â˜T ä ™Tè™Tì â˜Tðä˜Têd™T̆ äL™Tæ̆ è⌙Täbät™Tâ L™Täb4ÏPäâ´™Tô• 䜙Tâ t™Tô• ˜ìXCäÄ™T˜Tâè™T¸ÔäÜ™T¸ïIæL›TLŸäø™TšTæ âšTæä0šTïáLšTøhšTè ˜ê„šTè ˜ê šTø¼šTèLbæâØšTè”#Pæâ›TèôšTæâ â›Tæ æä0›TèLbæîœBìÈT°@ä\›Th›Tæ âx›Tæâ¨›TL=è˜Tèâ@êL=äx›TäÈ›T ãᘜT˜R䨛T¨›T˜RœTÿèäPœTä@œTäãx›Tì âx›T ä|œTèlœTì âx›Tð@œTêÀœTˆI䨜TæˆIœBäâèœTÀ6 äМT⨜TÀ6 èâT  äøœTМT  è â8TXåä Tâ øœTXåÈBä â`T¤³åHTâ T¤³éâˆTØväpTâHTØvèâ°T ûä˜TâpT ûðL=äÀTx›TâäTÔräØTxTçžT¤ÔäôTèVRæØžTœcäžTžTæ â,žTæäHžTïátžTèdžTê âì§Læ žTèžTê â<²M漞Tÿø$ŸäèžT0ÇQ攟TÀ äŸTäÀ @ŸTÿìä\ŸTïáxŸTèÈBø|JêàŸTès䤟Tæès´Oâÿ帠T¼säðŸTä¼s, TÿìäH Tïád TèlÍJ쀠TèôI유Tè°"JøLbì¡T säÈ Tæ s´OâÿåÜ¡T°¿ ä¡Tä°¿ P¡Tÿìäl¡TïሡTèlÍJ줡TèôIìÀ¡Tè°"JøLbìø¡Tè« äì¡T#Tæ¢TŒ¿ ä¢TäJæ0¢Tˆ« ä$¢T<#Têh¿ ä@¢TÌkh¿ ¸Ê8ò|Ê8ö˜¢T´A䌢T|ÀS樢T|Õä ä|ÀTâ TÀT°>œBä<â¼ÀTàÉå¤ÀTâ|ÀTàÉáœBä8âäÀT,åÌÀTâ¤ÀT,áTDä4â ÁTÔ?äôÀTâÌÀTÔ?è2â4ÁTpMäÁTâôÀTpMè0â\ÁTls äDÁTâÁTls è,â„ÁT O älÁTâDÁT O è(â¬ÁT¤wä”ÁTâlÁT¤wè$âÔÁTdðä¼ÁTâ”ÁTdðè âüÁTXääÁTâ¼ÁTXèâ$ÂT?ä ÂTâäÁT?èâLÂTT ä4ÂTâ ÂTT èâtÂT” ä\ÂTâ4ÂT” èâœÂT˜¹ä„ÂTâ \ÂT˜¹ ˜ä âÄÂT”ƒä¬ÂTâ „ÂT”ƒ ˜äâìÂTÀ1äÔÂTâ ¬ÂTÀ1 ˜äâÃT´äüÂTâÔÂT´ðÄC ä$ÃT$¿TîHÃTì âXÃTæâˆÃT ÄéÅTèâpê ÄäXÃTä¨ÃTãáxÄT˜Rä¸ÃTˆÃT˜RôÃTÿèä0ÄTä ÄTäãXÃTì âXÃT ä\ÄTèLÄTì âXÃTð ÄTê ÄT\J äˆÄTæ\J è âÈÄTœ×ä°ÄTâˆÄTœ×èâðÄTäØÄTâ °ÄTœBäâÅTÌåÅTâ ØÄTÌœBì Ää(ÅTXÃTæ­ ä@ÅTLÅTæâ|ÅTÌE è¤ÆTèâpêÌE äLÅTäœÅTãálÆT˜Rä¬ÅT|ÅT˜RèÅTÿèä$ÆTäÆTäãLÅTì âLÅT äPÆTè@ÆTì âLÅTðÆTê”ÆTˆCå|ÆTæˆCáœñMäâÐÆTܤ 䤯Tâ |ÆTܤ ¼ÆTè êèÌE äàÆTLÅTâlÇT°­ äøÆTä°­ 4ÇTÿìäPÇTïýŒÈT°fä|ÇTä°f¸ÇTááÿåäÔÇTïDáðÇTè|Pê ÈTø(ÈTøDÈTø`ÈTè|Pö|ÈTì âøEJæàÊTLväœÈTäLvØÈTááÿåäôÈTïDá¨ÊTèÉTì â ÉTæâPÉThüèxÊTèâpêhüä ÉTäpÉTãá@ÊT˜Rä€ÉTPÉT˜R¼ÉTÿèäøÉTäèÉTäã ÉTì â ÉT ä$ÊTèÊTì â ÉTðèÉTêhÊT`úåPÊTæ`úéâÊTð¢äxÊTâ PÊTð¢(ßNìhüä ÊT ÉTâÄÊTÿä”PJìüÊTdÁ äðÊTˆîOæ€ËT,7å ËTä,7áHËTÿìädËTïíȈQìXÌTÌ¡äËTäÌ¡ÌËTÿìäèËTïáÌTèlÍJì ÌTèôIì<ÌTè°"JøLbì0ÍT­ ähÌTä­ ¤ÌTÿìäÀÌTïáÜÌTèlÍJìøÌTèôIìÍTè°"JøLbì\ÏT@Á ä@ÍTLÍTæ â\ÍTæâŒÍTì+è,ÏTèâpêì+ä\ÍTä¬ÍTãá|ÎT˜Rä¼ÍTŒÍT˜RøÍTÿèä4ÎTä$ÎTäã\ÍTì â\ÍT ä`ÎTèPÎTì â\ÍTð$ÎTê¤ÎTdPäŒÎTædPèâÌÎTÀuä´ÎTâ ŒÎTÀuTDä âôÎTXà äÜÎTâ´ÎTXà èâÏTÌdäÏTâÜÎTÌdèâDÏTÄ5ä,ÏTâ ÏTÄ5|Jìì+äTÏT\ÍTâüÐTCälÏTtÏTââ¤ÏTCèÌÐTèâ@êCätÏTäÄÏTãá”ÐT˜RäÔÏT¤ÏT˜RÐTÿèäLÐTä<ÐTäãtÏTì âtÏT äxÐTèhÐTì âtÏTð<ÐTê¼ÐTÐ ä¤ÐTæÐ èâäÐTT äÌÐTâ¤ÐTT ðCäôÐTtÏTâ(ÑT$Á ä ÑTÑTæ âÜUTæ¬ÑT0×ä8ÑTä0×tÑTááÿåäÑTïDí|JêÄÑTX­ ä¼ÑTàWTâÜÑTáÁ äÔÑT\ Qâ|ÒTôÖäìÑTäôÖ(ÒTááÿåäDÒTïDá`ÒTè|JöLbð¤6åŒÒTä¤6áÈÒTÿììT)SêPÕTgäôÒTáÓTæâ0ÓT8à è ÕTèâpê8à åÓTäPÓT ãá ÔT˜Rä`ÓT0ÓT˜RœÓTÿèäØÓTäÈÓTääÓTì ãÓT äÔTèôÓTì ãÓTðÈÓTêHÔTÔä0ÔTæÔè âpÔTô<äXÔTâ0ÔTô<è â˜ÔTÔ ä€ÔTâXÔTÔ èâÀÔT”Bä¨ÔTâ€ÔT”BèâèÔTˆÓäÐÔTâ¨ÔTˆÓèâÕT¤:äøÔTâÐÔT¤:èâ8ÕTÀ³ä ÕTâøÔTÀ³ð8à äHÕTáÓTâüÖTü×ä`ÕTäüלÕTÿìä¸ÕTïáÔÕTè\½MìŒÖTèðÕTì ãÖTæäÖTïá8ÖTè ˜êTÖTøpÖTè ˜öœBì¨ÖTè ˜êÄÖTøàÖTè ˜öœBì×T,® ä ×TlQæœ×T® ä(×Tä® d×Tÿìä€×TïíÌÄPì@ØTÐC0ØT¬×T¸×Tæäè×TÐCöâ ØTæÐCä¸×TäØTãåÐCäØT¸×T⎌íICÒ‘¤ÀOyièã8ØT¸×Tâ4ÙTwäPØTäwŒØTÿì䍨TïáÄØTè¤_MìàØTèTìüØTèTDêÙTÿäLbì ÚTÜ×äDÙTäÜ×€ÙTÿìäœÙTïá¸ÙTè ˜ìÔÙTè ˜ìðÙTè ˜ø ˜ìÈÚTtgäÚTätgXÚTááÿåätÚTïDáÚTè4íIì¬ÚTè)Jÿè|ÜT CäØÚTäÚTæ âôÚTæâ$ÛT(ÞèLÜTèâpê(ÞäôÚTäDÛTãáÜT˜RäTÛT$ÛT˜RÛTÿèäÌÛTä¼ÛTäãôÚTì âôÚT äøÛTèèÛTì âôÚTð¼ÛTê<ÜT Xä$ÜTæ X|JäâdÜT&äLÜTâ $ÜT&ßPì(ÞätÜTôÚTâ˜ÜTPgäŒÜT|¶Sæ(ÞTxCä¨ÜTäxCäÜTááÿååÝTïDáÝTè¼p-ì8ÝTø ÞTèTÝTì âdÝTæä€ÝTïáœÝTèœBì¸ÝTè¼p-ìÔÝTøðÝTèØføX-øœBìÈÞT,gä8ÞTä,gtÞTááÿåäÞTïDá¬ÞTèœBÿìà­ äØÞTäà­ ßTááÿåä0ßTïDíì¥KìàTèØä\ßTäèØ˜ßTÿìä´ßTïáÐßTøìßTèœBøØfìààT¸ØäàT䏨TàTÿìäpàTïáŒàTèlÍJì¨àTèôIìÄàTè°"JøLbì€áTp® äðàTäp® ,áTááÿåäHáTïDádáTè|PöˆZKì âTœØäáTäœØÌáTÿìäèáTïáâTèLbøÌ9NìÌéT( ä0âTä( lâTÿìäˆâTïá°éTè¤âTì â´âTæâ äâThê ,éTè@éTä @áp éTæhê ä´âTäãT ãá"`äTôO¨ãTãTäâTôOPãTÿèä|ãTìã´âTø˜ãTì â´âTè°ãTäâTôOìãTÿèääTìã´âTì4äTè˜ãTøPäTê â´âT äåT˜RäpäTäâT˜R¬äTÿèäØäTäPäTäã´âTìôäTè˜ãTøPäTê¤åTˆ6ä åTäâTˆ6\åTâÿèäˆåTìáá´âT$ö˜ãTìTæTÌLä´åTäâTÌLðåTâÿèäæTìáá´âT ê8æTè˜ãTøðJì çT$ÄädæTäâT$Ä æTâÿèäÌæTìáá´âTêèæTè˜ãTìçTèðJÿèÐçTŒ ä0çTäâTŒ lçTâÿèä˜çTìáá´âTê´çTè˜ãTøðJì€èTüU äàçTäâTüU èTâÿèäHèTìáá´âTêdèTè˜ãTøðJìéTxP äèTäâTxP ÌèTâÿèäøèTìáá´âTö˜ãTðhê ä$éT´âTæwKìPéT´âTä0ââäâT”¬ŒéTÿä0ìâ åÀåFëðJìäéTТäÜéT¨Nâ„êTD® äôéTäD® 0êTááÿåäLêTïDáhêTè$¡PÿèíT„wä”êT êTæ â°êTæPâàêT8ÝèäìTèâ@ê8Ýä°êTåëT ãáÐëT˜RäëTàêT˜RLëTÿèäˆëTäxëTäã°êTì â°êT ä´ëTè¤ëTì â°êTðxëTêøëTÌVäàëTæÌVèNâ ìT4* äìTâàëT4* èLâHìTÄøä0ìTâìTÄøèHâ„ìTdÕäXìTâ 0ìTdÕpìTäâ @ê ä¬ìT¸Úä”ìTâXìT¸ÚèâÔìTÔp ä¼ìTâ”ìTÔp èâüìTô"ääìTâ¼ìTô"ð8Ýä íT°êTâ€ïThØä$íT0íTæâ`íTX`èPïTèâpêX`ä0íTä€íT ãáPîT˜RäíT`íT˜RÌíTÿèäîTäøíTäã0íTì â0íT ä4îTè$îTì â0íTðøíTêxîT¨ä`îTæ¨èâ îTL²äˆîTâ`îTL²èâÈîT02ä°îTâˆîT02èâðîTLäØîTâ°îTLè âïTàåïTâØîTàèâ@ïTxd ä(ïTãïTxd èâhïT _ äPïTâ(ïT _ ðX`äxïT0íTâ òTÐ7åïTäÐ7áÌïTááÿåäèïTïDáðTèœBì¸ñTè ðTèâ â0ðTæâ`ðTü.èˆñTèpêü.ä0ðTä€ðTãáPñT˜RäðT`ðT˜RÌðTÿèäñTäøðTäã0ðTì â0ðT ä4ñTè$ñTì â0ðTðøðTêxñT ˜ä`ñTæ ˜ì ñTlbäˆñTâ `ñTlbœBìü.ä°ñT0ðTâÔñTøðñTèLbø¨sMìLôTègäòT$òTââTòTègèôTèâpêègä$òTätòTãáDóT˜Rä„òTTòT˜RÀòTÿèäüòTäìòTäã$òTì â$òT ä(óTèóTì â$òTðìòTêlóT,Ò äTóTæ,Ò èâ”óTè7 ä|óTâ TóTè7 œBäâ¼óTì ä¤óTâ|óTì è âäóT( äÌóTâ¤óT( èâ ôT¸¬äôóTâ ÌóT¸¬œBäâ4ôT€ÐåôTâôóT€ÐáœBìègäDôT$òTâDùT´7å\ôThôTæLâ˜ôTð³ èùTèâ`êð³ ähôTä¸ôTãáˆõT˜RäÈôT˜ôT˜RõTÿèä@õTä0õTäãhôTì âhôT älõTè\õTì âhôTð0õTêùTðGä˜õTæðG°õTäâ8âàõTŒcèÔøTèâ`êŒcä°õTåöTãáÐöT˜RäöTàõT˜RLöTÿèäˆöTäxöTäã°õTì â°õT ä´öTè¤öTì â°õTðxöTêøöT¬±äàöT欱è4â4÷TÐþä÷Tâ àöTÐþ ÷Tä$â êä\÷TtþäD÷Tâ÷Ttþè â„÷TÀ" äl÷TâD÷TÀ" èâ¬÷TÄ1ä”÷Tâl÷TÄ1èâÔ÷TÄä¼÷Tâ”÷TÄèâü÷TP/ ää÷Tâ¼÷TP/ èâ$øTæä øTâä÷Tæè âLøTd*ä4øTâ øTd*èâtøTpíä\øTâ4øTpíèâœøT¬µ 䄸Tâ\øT¬µ èâÄøTø¤ä¬øTâ„øTø¤èâìøTd+äÔøTâ¬øTd+ðŒcäüøT°õTâ,ùT¸äùTâ ˜õT¸|GQìð³ ä<ùThôTâTùTœ7å éS¼ùTHwädùTäHw ùTÿììø,JêÔùTÔgäÌùTÌnTâäùT0wä °;JüùTðÁ äôùTUxÄ äœ=UäxÄ Ø=Uÿìäô=Uïá>UèlÍJì,>UèôIìH>Uè°"JøLbìT@UlÛät>U|>Uââ¬>UlÛè$@UèâpêlÛä|>UäÌ>Uãáœ?U˜RäÜ>U¬>U˜R?UÿèäT?UäD?Uäã|>Uì â|>U ä€?Uèp?Uì â|>UðD?UêÄ?UGä¬?UæGœBäâì?UäIåÔ?Uâ¬?UäIá@ZLäâ@UPÉäü?UâÔ?UPÉèâ<@Uìâä$@Uâü?UìâðlÛäL@U|>Uâp@UÛäd@UD^SæŒ@U;å€@U,Tæ¨@UÛäœ@U ˜êdÄ ä¸@UêðAU(käÔ@Uä(kAUÿìä,AUïáHAUèœBìdAUè|Jì€AUøœAUè|Jì¸AUøÔAUè|Jÿè`BUD{åBUæD{BUã åæ0BUäøà ä HBUXüBUí BU,tBUãå8CU¬ÛäpBUä¬Û¬BUÿìäÈBUïáäBUèlÍJíCUèôIìCUè°"JøLbìTCUÛäHCU ¤TæØCUÐÄ ädCUäÐÄ  CUááÿåä¼CUïDíœBìðCUôzäèCUÄcNâ¬DUØzåDUäØzåäjUäô>á kUÿìäå¼kUæØ>á´Oâÿå˜lU¼>ålUâ8lU¼>á lUêælUäŒq ä PlUÈ‘ lUê hlUxÌ lUê €lU Ü lUîd) lUèmU„mä¨lUä„mälUááÿååmUïDíèQLê8mU >å,mU KæÐrUl>åHmUäl>á„mUááÿåä mUïDá¼mUè|JêØmUè|JìômUèh¡KìnUèh¡Kì,nUøHnUødnUèœBì€nUè|Jê´rUèœnUì â¬nUæDâÜnUÈ8 è„rUèâpêÈ8 ä¬nUäünUãáÌoU˜Rä oUÜnU˜RHoUÿèä„oUätoUäã¬nUì â¬nU ä°oUè oUì â¬nUðtoUêôoUx äÜoUæx œBä@âpU°>äpUâ ÜoU°>œBä<âDpUàÉå,pUâpUàÉáœBä8âlpU,åTpUâ,pU,áTDä4â”pUÔ?ä|pUâTpUÔ?è2â¼pUpMä¤pUâ|pUpMè0âäpUls äÌpUâ¤pUls è,â qU O äôpUâÌpU O è(â4qU¤wäqUâôpU¤wè$â\qUdðäDqUâqUdðè â„qUXälqUâDqUXèâ¬qU?ä”qUâlqU?èâÔqUT ä¼qUâ”qUT èâüqU” ääqUâ¼qU” èâ$rU˜¹ä rUâ äqU˜¹|Jä âLrU”ƒä4rUâ rU”ƒ|JäâtrUÀ1ä\rUâ 4rUÀ1|JäâœrU´ä„rUâ\rU´ðÈ8 ä¬rU¬nUîHÃTìsU$Ç äàrUÌk$Ç °Ý8òtÝ8ûJä p/JtUX?å è‡Uèâpê> ä$†Uät†UãáD‡U˜R䄆UT†U˜RÀ†Uÿèäü†Uäì†Uäã$†Uì â$†U ä(‡Uè‡Uì â$†Uðì†UꀇU… äT‡Uæ… l‡Uäâ ê䨇UdPä‡UâT‡UdPð> 万U$†U☈U”«äЇU䔫 ˆUááÿåä(ˆUïDáDˆUè$¡Pì`ˆUè ˜ì|ˆUÿô´ˆU¬~䨈U êTæp‰U€È äĈUä€È á‰Uááÿåä‰UïDá8‰Uè ˜êT‰Uè ˜ÿêLo䀉U´O渉U$¨‰Uœ‰UäLê°‰UäLâŠUÐpäȉUæÐp´OâÿåPŠU`É äŠUæ`É œBäÿåÌŒUHÉ ä`ŠUäHÉ œŠUÿì上UïáÔŠUè|JìðŠUèØfø ‹Uì â‹Uæ âL‹UÈH蜌UèâpêÈHä‹Uäl‹Uãá<ŒU˜Rä|‹UL‹U˜R¸‹Uÿèäô‹Uää‹Uäã‹Uì â‹U ä ŒUèŒUì â‹Uðä‹UêdŒŬ äLŒUæ̆ è⌌UäbätŒUâ LŒUäbÊOäâ´ŒUô• 䜌Uâ tŒUô• |JìÈHäÄŒU‹UâU˜päÜŒUèŒUæâU°EèàŽUèâpê°EäèŒUä8UãáŽU˜RäHUU˜R„UÿèäÀUä°UäãèŒUì âèŒU äìUèÜUì âèŒUð°Uê0ŽUô"äŽUæô"ØfäâXŽU€ä@ŽUâŽU€è‎U@iähŽUâ @ŽU@iØfä⨎U€ÈäŽUâhŽU€Èè âÐŽU„ã与Uâ ŽU„ã°KäâøŽUìâäàŽU⸎Uìâð°EäUèŒUâÌUÉ ä UäÉ \UááÿåäxUïDá”Uè”{Nì°UèØVRÿèüUp@åÜUäp@áUááÿåä4UïDá`UèPUì â˜óMæ|UèœBì˜Uÿä´UìæÌUäTžä äU(Û´Uîä¬Uâ ô«Uœ>ÌýQä<â\¬Ul* äD¬Uâ ¬Ul* ŒíLä,ℬU„œäl¬Uâ D¬U„œŒíLä⬬Ut¤ä”¬Uâ l¬Ut¤ð$KäâÔ¬ULx伬U┬ULxèâü¬U°ää¬Uâ ¼¬U°œBä â$­Uìä ­Uâ ä¬UìœBäâL­UXåä4­Uâ ­UXåÈBäât­U>å\­Uâ4­U>ñð)ä„­Uì¨Uâ`¸U¸­äœ­U中حUÿìäô­Uïá(¸Uè®Uì â ®Uæâ P®U´ö¤·U踷Uä @áp¸Uæ´öä ®Uäp®U ãá"̯UôO¯U€®UP®UôO¼®Uÿèäè®Uìã ®Uø¯Uì â ®Uè¯UP®UôOX¯Uÿè䄯Uìã ®Uì ¯Uè¯Uø¼¯Uê â ®U ä|°U˜RäܯUP®U˜R°UÿèäD°U伯Uäã ®Uì`°Uè¯Uø¼¯UꀱU” 䌰UP®U” ȰUâÿèäô°Uìáá ®U$ê±Uè¯Uì,±UøH±UèœBìd±UèLbÿ脲U¤. ä±UP®U¤. ̱Uâÿèäø±Uìáá ®U ê²Uè¯Uì0²UøL²UèœBìh²UÿôгU䔲UP®UвUâÿèäü²Uìáá ®Uê³Uè¯Uì4³UèFKìP³Uè|Jêl³Uè„ëI숳Uè ìIì´³U褳Uì âÌãNÿ✴UHäà³UP®UH´UâÿèäH´Uìáá ®Uêd´Uè¯U쀴Uè¸çIø|JꄵUÜ䬴UP®UÜè´UâÿèäµUìáá ®Uê0µUè¯UìLµUè¸çIìhµUè|Pö|JêP¶U X 䔵UP®U X еUâÿèäüµUìáá ®Uê¶Uè¯Uì4¶Uè¸çIø|JꌷUTrä`¶UP®UTrœ¶UâÿèäȶUìáá ®U êä¶Uè¯Uí·Uè¸çIì·Uè|Pê8·Uè|JêT·Uøp·Uè”#Pÿê´ö䜷U ®UæˆbìÈ·U ®Uä0ââP®UÄ ¸Uÿä0ìâçÉêyùºÎŒ‚ªK© D¸Uè¸çIø|Jê8¹UèBåp¸UäèBᬸUÿìäȸUïáä¸UèlÍJí¹UèôIì¹Uè°"JøLbì¼¹U¤· äH¹U䤷 „¹Uááÿåä ¹UïDí LTê„»U|­ä̹UÔ¹Uâ âºU|­èT»Uèâpê|­äÔ¹Uä$ºUãáôºU˜Rä4ºUºU˜RpºUÿè䬺U䜺UäãÔ¹Uì âÔ¹U äغUèȺUì âÔ¹UðœºUê»Up=ä»Uæp=èâD»UH‰ ä,»Uâ»UH‰ èâl»UÄäT»Uâ,»UÄð|­ä|»UÔ¹U∽Uh· ä”»U »Uæ â°»Uæâà»U¨à èX½Uèâpê¨à ä°»Uå¼UãáмU˜Rä¼Uà»U˜RL¼Uÿè䈼Uäx¼Uäã°»Uì â°»U ä´¼U褼Uì â°»Uðx¼Uêø¼UÔ4äà¼UæÔ4è â ½U¨ªä½Uâà¼U¨ªèâH½UPGä0½Uâ½UPGèâp½U4¶äX½Uâ 0½U4¶ÈBì¨à 䀽U°»UæÜÊ ä˜½U ½UââнUÜÊ è¿UèâpêÜÊ ä ½Uäð½UãáÀ¾U˜Rå¾UнU˜R<¾Uÿèäx¾Uäh¾Uäã ½Uì â ½U 䤾U蔾Uì â ½Uðh¾Uêø¾UŒ”äоU挔è¾Uäâ â ½Uæ¸ÀU… ä¿Uâ оU… ¿Uè â0¿Uæâ`¿U(„èˆÀUèâpê(„ä0¿U䀿UãáPÀU˜Rä¿U`¿U˜RÌ¿UÿèäÀUäø¿Uäã0¿Uì â0¿U ä4ÀUè$ÀUì â0¿Uðø¿UêxÀUÜä`ÀUæÜ(ÓLäâ ÀUœÐäˆÀUâ `ÀUœÐø,Jì(„ä°ÀU0¿UæÜÊ äÈÀU ½UâèÀU¬ãäàÀU¬ûRâÐÁU4Ì äøÀUä4Ì 4ÁUááÿåäPÁUïDálÁUèÐyPì˜ÁUèˆÁUì âLYSæ´ÁUÿäLbìÂUü· äàÁUæü· ´Oâÿå¼ÂUT‚ä,ÂUäT‚hÂUááÿåä„ÂUäÌýQçDá ÂUè|Jÿè°ÃULNäÌÂUäLNÃUÿìä$ÃUïá@ÃUè|Jì\ÃUè|JìxÃUè|Jì”ÃUÿôÀÄUÌ äÀÃUäÌ üÃUÿìäÄUïá4ÄUèœBìPÄUè|JìlÄUøˆÄUèTDì¤ÄUÿäLbì ÆUÈsäÐÄUÜÄUæ4â ÅU¬y èpÆUèâpê¬y äÜÄUä,ÅUãáüÅU˜Rä<ÅU ÅU˜RxÅUÿèä´ÅUä¤ÅUäãÜÄUì âÜÄU äàÅUèÐÅUì âÜÄUð¤ÅUê8ÆU˜¡ä ÆU昡$ÆUä â (ê(ä`ÆULøåHÆUâ ÆULøéâˆÆU$YäpÆUâ HÆU$YPNì¬y ä˜ÆUÜÄUâ°ÆU0Nä —QlÇU‚äÀÆUä‚üÆUááÿåäÇUä$¡PçDá4ÇUè|JìPÇUèÌŸPÿè„ÇULCå|ÇUdåSâ ÇUNä”ÇU$¼Jæ\ÈU¤sä°ÇUä¤sìÇUááÿåäÈUïDá$ÈUø@ÈUè ˜ÿèˆÈU(®älÈUxÈUæ â°ùPæ(ÉU®ä˜ÈUä®ÔÈUááÿåäðÈUïDá ÉUèœBÿèDÉUàMä8ÉUÔëQæ´ÉUüäTÉUæülÉUèæ„ÉUäúä œÉUXðlÉUì TÉUTH lÉUèÊUhË äÄÉUähË áÊUÿììLRîCå,ÊUäCáhÊUÿìä„ÊUò ÊUèœBì¼ÊUè)JøX-ì<ÌUDtäèÊUäDt$ËUÿìä@ËUïá\ËUèœBìxËUèTDì”ËUø°ËUèTDìÌËUøèËUèTDìÌUø ÌUèTDÿèÀÌU$OäLÌUä$OˆÌUÿìä¤ÌUïí ˜ê˜ÍU¬ääÐÌUä¬ä ÍUÿìä(ÍUïáDÍUè¤PJì`ÍUø|ÍUè\’Jøø«SìäÍUÀ®ä¨ÍUæÀ®´Oâÿå”ÎU(täôÍUä(t0ÎUÿìäLÎUïáhÎUèLbø„ÎUì âì…KælÏUˆää¤ÎUäˆäàÎUÿìäüÎUïáÏUèlÍJì4ÏUèôIìPÏUè°"JøLbìDÐUܸ ä|ÏUäܸ ¸ÏUÿìäÔÏUïáðÏUèlÍJì ÐUèôIì(ÐUè°"JøLbì`ÐUlääTÐU€Sæ¨ÑUtäpÐUät¬ÐUÿìäÈÐUïáäÐUèœBíÑUè|JêÑUèTDì8ÑUøTÑUèTDìpÑUøŒÑUèLbøLbìðÒU¨‚ä¸ÑU䨂ôÑUÿìäÒUïá,ÒUèœBìHÒUødÒUø€ÒUøœÒUèTDì¸ÒUøÔÒUèLbøLbìÌÔUOåÓU ÓUæ âÓUæ âLÓUįèœÔUèâpêįäÓUälÓUãá<ÔU˜Rä|ÓULÓU˜R¸ÓUÿèäôÓUääÓUäãÓUì âÓU ä ÔUèÔUì âÓUðäÓUêdÔUˆ€åLÔU戀éâŒÔU ätÔUâ LÔU |Jäâ´ÔUtá äœÔUâ tÔUtá |JìįäÄÔUÓUâlÕUŒÌ äÜÔUäŒÌ ÕUäÿåä4ÕUïáPÕUÿä ˜êDÖULää|ÕUäLä¸ÕUááÿåäÔÕUïDáðÕUèœBì ÖUè„gSê(ÖUÿätgSê„ØU¼¸ äTÖU\ÖUââŒÖU¼¸ èTØUèâp꼸 ä\ÖUä¬ÖUãá|×U˜Rä¼ÖUŒÖU˜RøÖUÿèä4×Uä$×Uäã\ÖUì â\ÖU ä`×UèP×Uì â\ÖUð$×Uê¤×Uô+äŒ×Uæô+œBäâÌ×UDÑä´×UâŒ×UDÑèâô×UåÜ×Uâ´×UáœBä âØU\] äØUâ Ü×U\] ØfäâDØUìFä,ØUâØUìFèâlØUìâäTØUâ,ØUìâ𼸠ä|ØU\ÖUâxÚU ä䔨Uä äÐØUááÿåäìØUäÌýQçDíÙUì âÙUæâHÙUð!èHÚUèâ@êð!äÙUähÙUãá8ÚU˜RäxÙUHÙU˜R´ÙUÿèäðÙUäàÙUäãÙUì âÙU äÚUè ÚUì âÙUðàÙUê`ÚUXääHÚUæXäðð!äpÚUÙUâ¨ÝUìCåˆÚU”ÚUæ â¤ÚUæÀâÔÚUÀ èxÝUèâpêÀ ä¤ÚUäôÚU ãáÄÛU˜RäÛUÔÚU˜R@ÛUÿèä|ÛUälÛUäã¤ÚUì â¤ÚU ä¨ÛUè˜ÛUì â¤ÚUðlÛUêìÛU\¯äÔÛUæ\¯$¯Mä´âÜUHåüÛUâÔÛUHé°âPÜUœ} ä$ÜUâ üÛUœ} <ÜUä¬â êäxÜU Jä`ÜUâ$ÜU Jè¨â ÜUHþäˆÜUâ`ÜUHþè¤âÈÜU¼rä°ÜUâˆÜU¼rè âðÜU ìäØÜUâ°ÜU ìèœâ,ÝUô§åÝUâ ØÜUô§ÝUä|â ê ähÝU€oä<ÝUã ÝU€oTÝUä<â @ê@äÝU$›äxÝUâ <ÝU$›ì§LìÀ ä ÝU¤ÚUâHÞU¤Cå¸ÝUä¤CáôÝUááÿåäÞUïDá,ÞUèœBøîð`¸ äXÞU¤/Sæ0àU`¯ätÞU€ÞUæâ°ÞU,4 éàUèâpê,4 ä€ÞUäÐÞUãá ßU˜RäàÞU°ÞU˜RßUÿèäXßUäHßUäã€ÞUì â€ÞU ä„ßUètßUì â€ÞUðHßUêÈßUˆÓä°ßUæˆÓèâðßU¤:äØßUâ°ßU¤:èâàUÀ³åàUâØßUÀ³ð,4 ä(àU€ÞUâHàU˜¹ ä@àUGNâ áU$Í äXàUä$Í ”àUÿìä°àUïáÌàUéSìèàUèœBìáUÿäLbìøáUìOä0áUäìOláUÿìäˆáUïá¤áUè úJìÀáUèTDêÜáUÿäLbìâU ƒä ¬ATŒâUƒäâUäƒTâUááÿåäpâUïDí4íIì¨âU€¹ äœâU¼p-æÄâUð‚ä¸âUxTæàâUØDåÔâUÌýQæpåU´DåðâUøâUââ(ãU´Dé@åUèâ`ê´DåøâUäHãU ãáäU˜RäXãU(ãU˜R”ãUÿèäÐãUäÀãUäãøâUì âøâU äüãUèìãUì âøâUðÀãUê@äUäy ä(äUæäy èâhäU˜Ä äPäUâ(äU˜Ä èâäUdf äxäUâPäUdf èâ¸äUÀä äUâxäUÀè âàäUÈóäÈäUâ äUÈóè âåUd5äðäUâÈäUd5èâ0åU0äåUâðäU0èâXåU@yä@åUâåU@yð´DåhåUøâUâ éUàÌ ä€åUŒåUæ âœåUæ@âÌåU4öèˆéUèâ`ê4öäœåUäìåUãá¼æU˜RäüåUÌåU˜R8æUÿèätæUädæUäãœåUì âœåU ä æUèæUì âœåUðdæUêøæUTŽäÌæUæTŽäæUä<â êä çU4Æ äçUâÌæU4Æ è8âHçU°<ä0çUâçU°<è6âpçUDº äXçUâ0çUDº è4â˜çU¬ä€çUâXçU¬è0âÀçUᜠä¨çUâ€çUᜠè,âèçUˆp äÐçUâ¨çUˆp è(âèUD1 äøçUâÐçUD1 è$â8èUÀ¹ä èUâøçUÀ¹è â`èUÈ äHèUâ èUÈ èâˆèUp1äpèUâHèUp1èâ°èU°Äå˜èUâpèU°ÄéâØèUÀ¤äÀèUâ˜èUÀ¤èãéUŒ!äèèUâÀèUŒ!è â(éUÈóäéUâèèUÈóè âPéUd5ä8éUâéUd5èâxéU0ä`éUâ8éU0èæ@yäˆéUâ`éU@yðˆDå °éUÌkˆDáLæ8æêæ8öŒêUx°äüéUäx°8êUÿìäTêUïápêUè\½MÿèØêUQäœêUæQ´Oâÿå°ëUÜÍ äèêUäÜÍ $ëUÿìä@ëUïá\ëUèlÍJìxëUèôIì”ëUè°"JøLbìˆìUàåäÀëUäàåüëUÿìäìUïá4ìUèlÍJìPìUèôIìlìUè°"JøLbì`íU Få˜ìUä FáÔìUÿìäðìUïá íUè óRì(íUøDíUÿä8oíîUàPäpíUäàP¬íUÿìäÈíUïáäíUèp'Nø|JìîU ƒä Ô@T<îUd°ä îU,îUæ âˆVPæTîU˜PäLîUÈïIâÌïU¤Í ädîUlîUââœîU¤Í èœïUèâpê¤Í älîUä¼îUãáŒïU˜RäÌîUœîU˜RïUÿèäDïUä4ïUäãlîUì âlîU äpïUè`ïUì âlîUð4ïUê´ïU¨QäœïUæ¨Qð¤Í äÄïUlîUâèïU|åäÜïUžTæˆðUpƒäøïUäpƒ4ðUááÿåäPðUäœBçDálðUè|Jö|Jê¤óUhÍ ä˜ðU¤ðUæ â´ðUæ(âäðU Õ ètóUèâ`ê Õ ä´ðUäñU ãáÔñU˜RäñUäðU˜RPñUÿèäŒñUä|ñUäã´ðUì â´ðU ä¸ñUè¨ñUì â´ðUð|ñUêüñU$dääñUæ$dè$â$òUxä òUâäñUxè âLòUÔoä4òUâ òUÔoèâtòU8Òä\òUâ4òU8ÒèâœòUÔöä„òUâ\òUÔöèâÄòU„’ ä¬òUâ„òU„’ èâìòUÌžäÔòUâ¬òUÌžè âóUÈóäüòUâÔòUÈóè â<óUd5ä$óUâüòUd5èâdóU0äLóUâ$óU0èâŒóU@yätóUâLóU@yð Õ äœóU´ðUâHõUPƒä´óUÀóUæâðóU„ÆèõUèâpê„ÆäÀóUäôUãáàôU˜Rä ôUðóU˜R\ôUÿèä˜ôUäˆôUäãÀóUì âÀóU äÄôUè´ôUì âÀóUðˆôUêõU€ÈäðôUæ€È,ËNäâ0õU°´ äõUâ ðôU°´ ¨ÈNì„Æä@õUÀóUæ8ƒäXõU`õUââõU8ƒèX÷Uèâpê8ƒä`õUä°õUãá€öU˜RäÀõUõU˜RüõUÿèä8öUä(öUäã`õUì â`õU ädöUèTöUì â`õUð(öUê¨öUØÝåöUæØÝáh4JäâÐöUàºä¸öUâ öUàºø,JäâøöU˜û äàöUâ ¸öU˜û p9Jä â ÷Uø‡ä÷UâàöUø‡èâH÷U|¿ ä0÷Uâ ÷U|¿ ø,Jäâp÷UL äX÷Uâ 0÷UL €;Jì8ƒä€÷U`õUâÀVäQä˜÷UääQÔ÷Uÿìäð÷UïálVè øUì âøUæâ LøU´\ èVèüVä @áp\Væ´\ äøUäløUãá"ÈùUôOùU|øULøUôO¸øUÿèääøUìãøUùùUì âøUèùULøUôOTùUÿèä€ùUìãøUìœùUéùUø¸ùUê âøU äxúU˜RäØùULøU˜RúUÿèä@úUä¸ùUäãøUì\úUéùUø¸ùUê8ýU4©å ˆúULøU4©áÄúUâÿèäðúUìááøUê ûUéùUì(ûUè|Jê¬üUèDûUìæ\ûUä`q ä tûU|³ DûUê ŒûUTXDûUê ¤ûU ÖDûUê ¼ûUDûUê ÔûUl DûUê ìûUè½ DûUê üU<½ DûUê üUàƒDûUê 4üUü DûU ê LüULs DûU ê düU€ûDûU ê |üUS DûU ê ”üUä3DûU î$åDûUèÈüUøäüUèœBíýUøýUèLbÿè þU¤ äHýULøU¤ „ýUâÿèä°ýUìááøUêÌýUéùUìèýUè|JêþUè|JÿæxÿU¤[ä0þULøU¤[lþUâÿèä˜þUìááøUê´þUéùUìÐþUè|JêìþUè|JêÿUø$ÿUè|Jì@ÿUø\ÿUèLbÿèÐVd× äˆÿULøUd× ÄÿUâÿèäðÿUìááøU ê VéùUì(Vè|JêDVèÀ0Kì`Vø|Vè|Jì˜Vø´VèLbÿì´\ äàVøUæˆbì VøUä$ââLøUœ4 HVÿä$ìâìÉêyùºÎŒ‚ªK© ˆVè|Jê¤Vè|Jÿæ˜V4GåÐVä4Gá Vÿìä(VïáDVèlÍJì`VèôIì|Vè°"JøLbì8VpÎ ä¨VäpÎ äVÿìåVïáVè8ÆKùBJì„VDÎ äHVæDÎ œBäÿå\Vèº ä”Väèº ÐVÿìäìVïáVèlÍJì$VèôIì@Vè°"JøLbì, V<± VlVxVæâ ¨V<±˜ Vè¬ Vä @áp Væ<±äxVäÈV ãá"$VôOlVØV¨VôOVÿèä@VìãxVø\Vì âxVètV¨VôO°VÿèäÜVìãxVìøVè\VøVê âxV äÔV˜Rä4V¨V˜RpVÿèäœVäVäãxVì¸Vè\VøVê„V¬ì ääV¨V¬ì VâÿèäLVìááxV êhVè\VøˆZKìPVÌLä”V¨VÌLÐVâÿèäüVìááxVêVè\Vì4VèLBKøFKì8 V$Ää`V¨V$ÄœVâÿèäÈVìááxVêäVè\Ví VèLBKì VèFKÿè< VŒ äH V¨VŒ „ Vâÿèä° VìááxVêÌ Vè\Vìè Vø VèLBKì VèFKÿèÐ VxP äL V¨VxP ˆ Vâÿèä´ VìááxVö\Vì€ Váå à V¨Váá VâÿèäH VìááxV êd Vè\VøPÏIð<±ä VxVæˆbì¼ VxVä,ââ¨V¸ðø Vÿä,ìâÉÉêyùºÎŒ‚ªK© ã$ VxVâ VœQä< VäœQx Vÿìä” Vïá° VèlÍJìÌ VèôIìè Vè°"JøLbìV(±ä Vä(±P Vÿìäl VïሠVèœBì¤ Vè|JìÀ VøÜ VèTDìø VÿäLbì$V0uä$Vä0u`Vÿìä|Vïá˜VèœBì´Vè|JêÐVè|JêìVøVèTDÿèPVGå4V@Væ âÐVLæ|Vuä`VlVæ âähLæ˜VáGåŒV„ÛMætVìƒä¨V´Væ âÄVæ âôVÐýèDVèâ`êÐýäÄVäVãáäV˜Rä$VôV˜R`VÿèäœVäŒVäãÄVì âÄV äÈVè¸Vì âÄVðŒVê VðÏäôVæðÏèâ4V äVâôV èâ\V( äDVâV( ðÐýälVÄV机 ä„VŒVâä¼Vœº øìœº äŒVäÜVã场 äìVŒVâÌV¼„äV伄@Vÿìä\VïáxVèœBì”Vø°VÿôèV´RäÜVêøVáHå ”ÁNÐV²äVä²DVÿìä`Vïá|VèlÍJì˜VèôIì´Vè°"JøLbìŒVüæäàVäüæVááÿåä8VäTDçDáTVè4íIìpVèTDøTDêVPRäœVäPRØVááÿåäôVïDí ˜ìV`» ä Vä`» \VááÿåäxVïDá”VèPUì°VøÌVøèVèœBÿè¤V˜±äV䘱PVááÿåälVïDáˆVèœBøœBì`V€±ä´V䀱ðVááÿåä VäœBçDá(VèœBìDVÿôŒVœÎ äpV|Væ8â¬Vh¿è\Vèâpêh¿ä|VäÌV ãáœV˜RäÜV¬V˜RVÿèäTVäDVäã|Vì â|V ä€VèpVì â|VðDVêÄV\^ä¬Væ\^œñMä,âìVÀqåÔVâ¬VÀqé(âVÍäüVâÔVÍè$â<V°å$VâüV°é âdVXñ äLVâ$VXñ èâŒV ätVâ LV  OäâüV¸äœVâ tV¸´VäâæÌVäÐøä äVhÛ´VîœÊ ´Vè$V°„ ä Vâ œV°„ ”ÜIäâLV"ä4Vâ V"œñMäâtVü¸ä\Vâ 4Vü¸œñMìh¿ä„V|Væ(RäœVä(RØVÿìäôVþ1Sì°V çä Vä ç\VááÿåäxVïDá”Vè|PöPÏIì("VlSäÀVälSüVÿìäVïí4Vì âDVæâ tVhÞ ¤!Vè¸!Vä @áp"VæhÞ äDVä”Vãá"ðVôO8V¤VtVôOàVÿèä VìãDVø(Vì âDVè@VtVôO|Vÿèä¨VìãDVìÄVè(VøàVê âDV ä V˜RåVtV˜R<VÿèähVäàVäãDVì„Vè(VøàVê`VìÉä°VtVìÉìVâÿèäVìááDVê4Vè(VøPVì â4VæôV”äpVtV”¬VâÿèäØVìááDVö(Vì¤ VpRä VtVpR@ Vâÿèäl VìááDVêˆ Vè(VÿèŒ!Vwä´ VtVwð Vâÿèä!VìááDV ê8!Vè(VìT!Vøp!VèôPøLbðhÞ äœ!VDVæˆbìÈ!VDVä$ââtVL3"Vÿä$ìâ;åÀåF#Vá¼ ä8"Vå¼ t"Vÿìä"Vïá¬"VèlÍJìÈ"VèôIìä"Vè°"JøLbìØ#Vvä#VävL#Vÿìäh#Vïá„#VèlÍJì #VèôIì¼#Vè°"JøLbì\$V„Håè#Vä„Há$$Väÿåä@$VïýÔ%VdHål$Vt$Vââ¤$VdHé¤%VèâpêdHåt$VäÄ$Vãá”%V˜RäÔ$V¤$V˜R%VÿèäL%Vä<%Väãt$Vì ât$V äx%Vèh%Vì ât$Vð<%Vê¼%VØÛä¤%VæØÛðdHåÌ%Vt$VâX&Vð„ää%Väð„ &Vááÿåä<&VïDíØfì\(VHSäh&Vt&Væ â„&Væâ´&V* è,(Vèâ@ê* ä„&VäÔ&Vãá¤'V˜Rää&V´&V˜R 'Vÿèä\'VäL'Väã„&Vì â„&V äˆ'Vèx'Vì â„&VðL'VêÌ'V@Ñ ä´'Væ@Ñ ˜â âô'VœHäÜ'Vâ´'VœHèâ(V¬Çä(Vâ Ü'V¬ÇÈBäâD(VT ä,(Vâ(VT ð* äT(V„&Vâx(VȲäl(VØVRæ$*V€²äˆ(V䀲Ä(Vááÿåäà(VïDáü(VèÌýQì)Vè ˜ê4)Vè ˜ê*VèP)Vì â`)Væä|)Vïá˜)VèÌýQì´)Vè ˜êÐ)Vè ˜êì)VÿÿðÄ*VX²ä4*VäX²p*VááÿåäŒ*VïDá¨*VèœBÿèà*VЄäÔ*VHÃTæü*V çäð*VœBæ+VìRä +V¼MêÌRä(+VÌkÌRí8òàì8ö€+V¬…ät+VÌNæ -VŒ…ä+Vœ+Væ â¬+VæâÜ+VtúéÜ,Vèâpêtúå¬+Väü+VãáÌ,V˜Rä ,VÜ+V˜RH,Vÿèä„,Vät,Väã¬+Vì â¬+V ä°,Vè ,Vì â¬+Vðt,Vêô,VXääÜ,VæXäðtúå-V¬+VâÈ-VX…ä-VäX…X-Vÿìät-Vïá-Vè1Nì¬-VÿôØ-VÌSähOä…ä èVèpæì6VÔä8VäT8Vãá$9V˜Räd8V48V˜R 8VÿèäÜ8VäÌ8Väã8Vì â8V ä9Vèø8Vì â8VðÌ8VêL9V„Øä49Væ„ØlîUèÔ:V ä\9Vâ 49V t9Vèâ¤9VPíè¤:VèâpêPíät9VäÄ9Vãá”:V˜RäÔ9V¤9V˜R:VÿèäL:Vä<:Väãt9Vì ât9V äx:Vèh:Vì ât9Vð<:Vê¼:VÜä¤:VæÜðPíäÌ:Vt9Vâ\VÈÃälVèâpêV(¥ ä>VâÜ=V(¥ èâD>VЯä,>Vâ >VЯtºJìV„Vâ lVèâ´>VÀêèìAVèâpêÀêä„>VäÔ>Vãá¤?V˜Rää>V´>V˜R ?Vÿèä\?VäL?Väã„>Vì â„>V äˆ?Vèx?Vì â„>VðL?VêÌ?V´Pä´?Væ´Pè âdAV¼¹äÜ?Vâ ´?V¼¹ô?Vä ââ$@VH£èLAVèpæ´>VH£äô?VäD@VãáAV˜RäT@V$@V˜R@VÿèäÌ@Vä¼@Väãô?Vì âô?V äø@Vèè@Vì âô?Vð¼@VêVâDBVÀªä,BVâì7VÀªð8 äTBV¼6VâxBVÿäLbìÄEVŒ¼ ä¤BV¬BVâ0âÜBVŒ¼ è”EVèâpꌼ ä¬BVäüBVãáÌCV˜Rä CVÜBV˜RHCVÿèä„CVätCVäã¬BVì â¬BV ä°CVè CVì â¬BVðtCVêôCV¤däÜCVæ¤dè,âDV¡äDVâ ÜCV¡ ˜ä(âDDVøÖä,DVâDVøÖè$âlDV ÎäTDVâ,DV Îè â”DV0ä|DVâTDV0èâ¼DVðä¤DVâ|DVðèâäDVüéäÌDVâ¤DVüéèâ EV CäôDVâÌDV Cèâ4EVLµ äEVâôDVLµ è â\EVx£ äDEVâEVx£ èâ„EVls älEVâDEVls èâ¬EVìâä”EVâlEVìâðŒ¼ ä¼EV¬BVâàEVÈ…äÔEVHäd{Vâ <{Vœ>ÈBäâ¤{VXåäŒ{Vâ d{VXåÈBäâÌ{V>å´{VâŒ{V>ñ$¡äÜ{V¨xVâ |V|Kåô{Vä|Ká0|VÿìäL|Vïáh|Vè|Jê„|Vè|Jÿè@}VˆÒ ä°|VäˆÒ ì|Vÿìä}Vïá$}Vè óRøX-ì~VÄëäP}VäÄëŒ}Vÿìä¨}VïáÄ}VèlÍJìà}VèôIìü}Vè°"JøLbìd~VT¿ ä(~VæT¿ ´OâÿåàVÀzät~V€~Væâ°~Vpè°Vèâpêpä€~VäÐ~Vãá V˜Räà~V°~V˜RVÿèäXVäHVäã€~Vì â€~V ä„VètVì â€~VðHVêÈV cå°Væ cá ˜ìpäØV€~Vâ€V zäðVøVââ(€V zèPVèâpê zäøVäH€VãáV˜RäX€V(€V˜R”€VÿèäЀVäÀ€VäãøVì âøV äü€Vèì€Vì âøVðÀ€Vê@V@ ä(Væ@ èâhVìâäPVâ(Vìâð zäxVøVâHƒVXÒ äV˜Vâ âÈVXÒ èƒVèâ@êXÒ ä˜VäèVãḂV˜RäøVÈV˜R4‚Vÿèäp‚Vä`‚Väã˜Vì â˜V 䜂V茂Vì â˜Vð`‚Vêà‚VÅ äÈ‚VæÅ èâƒVXÁäð‚VâÈ‚VXÁèâ0ƒVT›äƒVâð‚VT›ðXÒ ä@ƒV˜Vâ<„V\zäXƒVä\z”ƒVááÿåä°ƒVïDá̃VèœBìèƒVø„VèœBì „VÿäLbìð…VDKåL„VX„Væ âh„Væâ˜„V èÀ…Vèâpê äh„V丄VãህV˜RäÈ„V˜„V˜R…Vÿèä@…Vä0…Väãh„Vì âh„V äl…Vè\…Vì âh„Vð0…Vê°…VøV䘅VæøV,ÅJäâØ…V̉ äÀ…Vâ ˜…V̉ ,ÇJì äè…Vh„Vâ<†V(¸å†VÌk(¸@î8òî8úôˆäL†Väôˆˆ†Vðø†Vö䤆Vä ˜äááÀ†Vø܆Vè ˜ÿèl‡V¨‡Våçäçæááxýâ`0é&â@Ð0á ˜ä'â@1é(â@MâQäÀ‡Vä8á ˜ä ì‡VˆV°`Uô:â `Uä aUü xˆV ˆVéLˆVü:áîä&þ ؈V€ˆVá ˜ä¬ˆVü:á›ä'ÿâàˆVé ‰Vü:áîä(þô‰Vä‰äH‰Vä䉄‰Vÿìä ‰VïἉVè|Jê؉VÿäLbìÈ‹VÓ äŠVäÓ @ŠVááÿåä\ŠVäÐyPçDáxŠVèÐyP씊Vè|Jê°ŠVè|JêÌŠVøèŠVø‹Vø ‹Vø<‹Vè|JêX‹Vè|Jêt‹VèLbì‹Vè|JꬋVè|Jö|JꔌVìÒ äØ‹VäìÒ ŒVááÿåä0ŒVähEçDáLŒVøhŒVÿ䄌Vì âÔFæ°ŒVdì䤌VÀBPæÌŒVÔÒ äÀŒV¸ŽSæVDÀ äÜŒVæDÀ ´Oâÿå¸VLWä(VäLWdVÿìä€VïáœVè8ÆKø8oìÐVLìäÈVÈ]J‒VhLåàVìVæ âüVæäŽVïá4ŽVèÈBìPŽVÿälŽVì â|ŽVæ0⬎V,èP’Vèâ`ê,ä|ŽVäÌŽVãáœV˜RäÜŽV¬ŽV˜RVÿèäTVäDVäã|ŽVì â|ŽV ä€VèpVì â|ŽVðDVêÄV *ä¬Væ * ˜â,âìV(åÔVâ¬V(á ˜â(âVx? äüVâ ÔVx? pä$âå’Vâ Ø‘Vœ>ÌýQäâ@’Vls ä(’Vã’Vls èâh’Và‹ äP’Vâ(’Và‹ ð,äx’V|ŽV✒V0Wä’VtNæD•V0{䬒V¸’Væâè’Vø<è•Vèâpêø<丒Vä“V ãáØ“V˜Rä“Vè’V˜RT“Vÿèä“V䀓Vä㸒Vì ⸒V 伓V謓Vì ⸒Vð€“Vê”V\°äè“Væ\°á”Väâ êä<”V`ä$”Vâè“V`èâd”V0`äL”Vâ$”V0`è⌔V¼Í ät”VâL”V¼Í èâ´”Vta䜔Vât”Vtaè âÜ”V`äÄ”V✔V`èâ•VpOäì”VâÄ”VpOèâ,•Vpä•Vâ ì”Vp@Tìø<ä<•V¸’Vâè–Và¸äT•V`•Væâ•VÔJ踖VèâpêÔJä`•Vä°•VãဖV˜RäÀ•V•V˜Rü•Vÿèä8–Vä(–Väã`•Vì â`•V äd–VèT–Vì â`•Vð(–VꨖVœ™ä–V朙èâЖVìâ世Vâ–VìâðÔJäà–V`•VâܘV Låø–V—Væâ4—VÜ|謘VèâpêÜ|ä—VäT—Vãá$˜V˜Räd—V4—V˜R —VÿèäÜ—VäÌ—Väã—Vì â—V ä˜Vèø—Vì â—VðÌ—VêL˜VHå4˜VæHáœBä ât˜V˜“ä\˜Vâ4˜V˜“è✘V”‘䄘Vâ\˜V”‘èâĘV´ä¬˜V℘V´ðÜ|äÔ˜V—Vâ|™V ìäì˜Vä ì(™VááÿåäD™VäœBçDá`™VèÈBø|JêšV°‰äŒ™V䰉șVááÿåää™VïDâšVè ˜ÿè8šVðKå,šVø½PêðëäHšVTšVæ â¯Qæ<›V°MåtšVä°Má°šVÿìäÌšVïáèšVè\½Mì›Vø ›VÿäœBìÀžV°ŠäL›VX›VæT∛VÔ$èžVèâ@êÔ$äX›V䨛VãáxœV˜R丛Vˆ›V˜Rô›Vÿèä0œVä œVäãX›Vì âX›V ä\œVèLœVì âX›Vð œVê œVˆr䈜VæˆrœBäPâÈœVÌMä°œVâ ˆœVÌM|JâLâðœV`¸äØœVâ °œV`¸„ªUäHâVåVâ ØœVH«UäDâ@Vô¤ ä(VãVô¤ è@âhVœ>äPVâ (Vœ>ÌýQä<âVl* äxVâ PVl* ŒíLä,â¸V„œä Vâ xV„œŒíLäâàVt¤äÈVâ  Vt¤ð$KäâžVLxäðVâÈVLxèâ0žV°äžVâ ðV°œBä âXžVìä@žVâ žVìœBä„VXåähžVâ @žVXåÈBä⨞V>åžVâhžV>ñÔ$丞VX›VâDŸVÔÀ äОVäÔÀ ŸVÿìä(ŸVïí¤PJì\ŸVpÓ äTŸVŒÍRâ@¡VŒMålŸVäŒM᨟VÿìäÄŸVïáàŸVè0ãQìüŸVø Vø4 VèœBìP VèdKìl Vèì¥K술Vèì¥K줠VèÔëQêÀ VèÔëQê$¡VèÜ Vì âì Væä¡Vïÿùà¡V”ŠäP¡V䔊Œ¡Vááÿå䨡VïDáÄ¡Vè|Pö|PꀢVüWäð¡VäüW,¢VÿìäH¢Vïád¢Vè\7KÿèÌ¢VlMå¢VælMá´OâÿåÜ£VTMåÜ¢VäTMá£Vÿìä4£VïáP£Vè ˜ìl£Vøˆ£VèTD줣VøÀ£VèLbøLbì|¤V@¹äì£Vä@¹(¤VááÿåäD¤VïDá`¤Vè°"JøLbìH¦V´À 䌤V˜¤Væ âȤV°u è¦Vèâpê°u 䘤Väè¤VãḥV˜Räø¤VȤV˜R4¥Vÿèäp¥Vä`¥Vä㘤Vì ☤V 䜥V茥Vì ☤Vð`¥Vêà¥VL¦äÈ¥VæL¦„gTââ¦VŒõäð¥Vâ È¥VŒõ„gSââ0¦VÔvä¦Vâ ð¥VÔv¬jSì°u ä@¦V˜¤VâT©VTÓ äX¦VäTÓ ”¦Vááÿåä°¦VïDí̦Vì âܦVæâ §VhMè$©Vèâ@êhMäܦVä,§V ãáü§V˜Rä<§V §V˜Rx§Vÿèä´§V䤧VäãܦVì âܦV äà§VèЧVì âܦVð¤§Vê$¨Vün ä ¨Væün |JââL¨V4ä4¨Vâ ¨V4œBäât¨Vljä\¨Vâ4¨Vljè✨Vp™ 䄨Vâ\¨Vp™ èâĨVœ»ä¬¨Vâ „¨Vœ»|Jâ âì¨V¼EäÔ¨Vâ ¬¨V¼E|Jââ©V/äü¨VâÔ¨V/èâ<©V4¶ä$©Vâ ü¨V4¶ÈBìhMäL©VܦVâØ©VMåd©VäMá ©Vááÿå伩Vä¬@MçDíÈBì\ªVMåè©VäMá$ªVááÿåä@ªVïDýt¬V ìälªVtªVâ(⤪V ìèD¬Vèâpê ìätªVäĪVãᔫV˜RäÔªV¤ªV˜R«VÿèäL«Vä<«VäãtªVì âtªV äx«Vèh«Vì âtªVð<«V꼫VP9 䤫VæP9 ð$Kä âä«Vø›äÌ«Vâ ¤«Vø›ð$Käâ ¬V`© äô«Vâ Ì«V`© ð$Käâ4¬V¬ê ä¬Vâ ô«V¬ê ð$Käâ\¬V˜•äD¬Vâ ¬V˜•ð$Kì ìäl¬VtªVâh­Vt{䄬Vät{À¬VááÿåäܬVïDáø¬VèœBì­Vø0­VøL­Vÿô ¯V(¹äx­V„­Væâ´­VÀC èÜ®VèâpêÀC ä„­VäÔ­Vã᤮V˜Rää­V´­V˜R ®Vÿèä\®VäL®Väã„­Vì â„­V 䈮Vèx®Vì â„­VðL®VêÌ®VH' ä´®VæH' èâô®VØÛäÜ®Vâ´®VØÛðÀC ä¯V„­Vâì°VP{ä¯V$¯VââT¯VP{è°°Vèâ`êP{ä$¯Vät¯VãáD°V˜R䄯VT¯V˜RÀ¯Vÿèäü¯Väì¯Väã$¯Vì â$¯V ä(°Vè°Vì â$¯Vðì¯Vêl°Vá äT°Vç èâ °VÐÍä|°Vâ T°VÐÍ”°VèæÔ°Vá-ä°°Vâ|°Vá-ȰVèçãP{ää°V$¯VætÀ äü°VätÀ 8±VÿìäT±Vòp±VèœBøŒ±Vê ✱VæTá̱V´j錵Vèâpê´j圱Väì±Vãá¼²V˜Räü±V̱V˜R8²Vÿèät²Väd²Vä㜱Vì ✱V ä ²Vè²Vì ✱Vðd²Vêä²V¼¶ ä̲Væ¼¶ èPá ³V$†äô²Vâ ̲V$†œBäLáÜ´VÐû ä³Vâ ô²VÐû 4³VäHá âD³Væ ât³V_ èÄ´Vèâpê_ äD³V䔳Vãád´V˜R䤳Vt³V˜Rà³Vÿèä´Vä ´VäãD³Vì âD³V äH´Vè8´Vì âD³Vð ´VꌴV4³ ät´Væ4³ ˜ââ´´Vô§äœ´Vâ t´Vô§ ˜âædcäÄ´Vâ œ´Vdc ˜æµV óåì´Vâ³V óáµVäHâ áêãTµVD— ä(µVâ ì´VD— @µVäâ @ê@ä|µV<äådµVâ(µV<äéæìâ䌵VâdµVìâì|¶V\Nå´µVä\NáðµVÿìä ¶Vïá(¶VèlÍJìD¶VèôIì`¶Vè°"JøLbìT·VÔ äŒ¶VäÔ È¶Vááÿåää¶VïDâ·Vè¤_Mì·Vø8·VÿäàJìP»V|äd·Vp·VæPâ ·V|è »Vèâpê|äp·VäÀ·Vãá¸V˜RäзV ·V˜R ¸VÿèäH¸Vä8¸Väãp·Vì âp·V ät¸Vèd¸Vì âp·Vð8¸V길V@Ûä ¸Væ@Û ˜äLâà¸V„LåȸVâ ¸V„Lá ˜äHâ¹V`Y äð¸Vâ ȸV`Y ˜äDâ0¹VHä¹Vâ ð¸VH ˜ä@âX¹V& ä@¹Vâ¹V& è8‹V¤uäh¹Vâ @¹V¤uRä,⨹V|Eä¹Vâ h¹V|E ˜ä(âйVl®ä¸¹Vâ ¹Vl® ˜ä$âø¹VŒÝäà¹Vâ ¸¹VŒÝ ˜ä â ºVtGäºVâ à¹VtG ˜äâHºVìù ä0ºVâ ºVìù ˜äâpºV¬5äXºVâ 0ºV¬5 ˜ä☺Vd䀺Vâ XºVd ˜äâÀºV°ä¨ºVâ €ºV° ˜ä âèºVÈ/ äкVâ ¨ºVÈ/ ˜äâ»V cåøºVâкV cá ˜äâ8»V01å »VâøºV01ñ|äH»Vp·Vâ`¼V‹ä`»V䋜»Vááÿå主VïDáÔ»VèôIìð»Vè°"Jì ¼Vè4íIì(¼VèÔJêD¼VèTDöœBí½V´íäp¼Vä´í¬¼VááÿåäȼVäŒýIçDáä¼Vè4íIøTDê,½VLÁ ä½V½Væ â\ÖUæD½V˜íä<½VÀìPãÂV¨Ó äT½V`½VæDâ½Vž èÐÁVèâpêž ä`½Vä°½V ãှV˜RäÀ½V½V˜Rü½Vÿèä8¾Vä(¾Väã`½Vì â`½V äd¾VèT¾Vì â`½Vð(¾V꨾VLxä¾VæLxè@âоVä’ ä¸¾Vâ ¾Vä’ œBâ<âø¾VÈ¢ äà¾Vâ ¸¾VÈ¢ œBä8â ¿V”÷ä¿Vâ à¾V”÷„EOä4âH¿Vø¯ ä0¿Vâ¿Vø¯ è0âpÁV´äX¿Vâ 0¿V´p¿Vä,â ‿Væ â°¿Vȶ èXÁVèâpêȶ 䀿VäпVãá ÀV˜Räà¿V°¿V˜RÀVÿèäXÀVäHÀVä〿Vì ‿V ä„ÀVètÀVì ‿VðHÀVêÈÀVTŽä°ÀVæTŽèâHÁV´äØÀVâ °ÀV´ðÀVäâ ãÁVæ âÁVæä,ÁVïí°"JðÈ™åXÁVâØÀVÈ™í˜ÁVèlä€ÁVâ X¿Vèlà$JäâÀÁV@Æä¨ÁVâ €ÁV@Æà$JäâèÁVÄäÐÁVâ¨ÁVÄðž äøÁV`½VâÂVTXäÂV$¬Næ ÂVLíä,ÂVäLíhÂVááÿåä„ÂVïDÿá Xä°ÂV@tQæ”ÃVàÁ äÌÂVäàÁ ÃVÿìä$ÃVïá@ÃVèlÍJì\ÃVèôIìxÃVè°"JøLbìPÆVD|ä¤ÃV°ÃVæ$âàÃVÌÏè ÆVèâpêÌÏä°ÃVåÄV ãáÐÄV˜RäÄVàÃV˜RLÄVÿèäˆÄVäxÄVäã°ÃVì â°ÃV ä´ÄVè¤ÄVì â°ÃVðxÄVêøÄV¤ŠåàÄV椊é â ÅVì0äÅVâàÄVì0èâHÅVôÓ ä0ÅVâÅVôÓ èâpÅV¬5äXÅVâ 0ÅV¬5 ˜äâ˜ÅVdä€ÅVâ XÅVd ˜äâÀÅV°ä¨ÅVâ €ÅV° ˜ä âèÅVÈ/ äÐÅVâ ¨ÅVÈ/ ˜äâÆV cåøÅVâÐÅV cá ˜äâ8ÆV01å ÆVâøÅV01ñÌÏäHÆV°ÃVâðÆV\îä`ÆVä\îœÆVäÿå䏯VïáÔÆVÿä|Jê¤ÈVì¹åÇV ÇVæ âÇVæâLÇV3 ètÈVèâpê3 äÇVälÇVãá<ÈV˜Rä|ÇVLÇV˜R¸ÇVÿèäôÇVääÇVäãÇVì âÇV ä ÈVèÈVì âÇVðäÇVêdÈVàäLÈVæà|JäâŒÈVÄ~ ätÈVâ LÈVÄ~ øQVì3 äœÈVÇVâÀÈVÈNå´ÈVœBæØÈV°NåÐÈV¨ RâÊVÔ äèÈVäÔ $ÉVááÿåä@ÉVïDá\ÉVèßPìxÉVè ˜ì”ÉVèLbì°ÉVèLbìÌÉVèLbìèÉVèLbìÊVèLbì ÊVèLbì<ÊVèLbìXÊVèLbìtÊVèLbø,ZìËV¤Á ä ÊVä¤Á ÜÊVááÿåäøÊVïDý0ËVTÔ ä$ËVáÝMæ´ËV(îä@ËVä(î|ËVááÿåä˜ËVïDíœBìÐËV0|äÄËVpêlÁ äàËVälÁ ÌVÿìä8ÌVþœBìôÌVø‹ädÌVäø‹ ÌVÿìä¼ÌVïáØÌVÿä UìÍVPYäÍVHÝMæÒVкä ÍV,ÍVæ â<ÍVæBâlÍVltèØÑVèâ@êltä<ÍVäŒÍVãá\ÎV˜RäœÍVlÍV˜RØÍVÿèäÎVäÎVäã<ÍVì â<ÍV ä@ÎVè0ÎVì â<ÍVðÎVê„ÎV ‘älÎVæ ‘œBä>â¬ÎV¼î ä”ÎVâ lÎV¼î œBä:âÔÎV€Ùä¼ÎVâ ”ÎV€Ù ˜â6âüÎVÜÄääÎVâ ¼ÎVÜÄ ˜â2â$ÏV8»ä ÏVâ äÎV8»²Qä.âèÏV « ä4ÏVâ ÏV « LÏVä*â â\ÏVæäxÏVïá”ÏVèÈBì°ÏVøÌÏVÿôÐVô¤ äøÏVâ4ÏVô¤ è&â8ÐVœ>ä ÐVâ øÏVœ>ÌýQä"â`ÐV˜í äHÐVâ ÐV˜í è âˆÐV€ýåpÐVâHÐV€ýéâ°ÐVPø ä˜ÐVâpÐVPø èâØÐV¬·äÀÐVâ˜ÐV¬·èãÑVH?äèÐVâÀÐVH?èâ(ÑVLxäÑVâèÐVLxèâPÑVð™ä8ÑVâ ÑVð™ì¥KäâxÑV°ä`ÑVâ 8ÑV°œBä â ÑVìäˆÑVâ `ÑVìœBäâÈÑVXåä°ÑVâ ˆÑVXåÈBäâðÑV>åØÑVâ°ÑV>ñltåÒV<ÍVâÒVlÕ ä LÁLÔÒVYä(ÒVäYdÒVÿìä€ÒVäTDçáœÒVèLbì¸ÒVèTDø˜RMì ÓV°îääÒVæ°î´OâÿåÀÓV¤ºä0ÓV䤺lÓVÿìäˆÓVïá¤ÓVè|µOÿèÜÓVøXäÐÓVˆWèœBì0>WèLbøL>Wì â\>Wæ âŒ>WĸèHAWèâpêĸä\>Wä¬>W ãá|?W˜Rä¼>WŒ>W˜Rø>Wÿèä4?Wä$?Wäã\>Wì â\>W ä`?WèP?Wì â\>Wð$?Wê¤?W â äŒ?Wæ â èâÌ?WtËä´?WâŒ?WtËèã@WpåÜ?Wâ´?Wpáô?Wèæ4@W8pä@Wâ Ü?W8p(@Wèæh@W —äD@Wâ @W —\@Wèæœ@Wø2äx@Wâ D@Wø2@WèæÐ@Wœdä¬@Wâ x@WœdÄ@WèæAWT6äà@Wâ ¬@WT6ø@Wèæ8AW¨^ äAWâ à@W¨^ ,AWèælAW¼ZäHAWâ AW¼Z`AWèçãĸä|AW\>Wæ¬~ä”AWä¬~ÐAWêäìAWöôáâ `BWtBWåçäçæááxýâ0èŒá€‚âT©äìBWä‚âT©äCWä†âT©äÈCWŠâ‡âT©äTDWŠâ‰âT©ì>áçŒýéDCWœCWøépCWü:á¼p-äŒý4ê?ÿíñÿÿÿÿââÍå‚ÀÿäðÿŒááÿÿÿ÷âŸå€Àô,EW]äðDWæ]´OâÿåèEWðää@€Wâ €Wœ>ÌýQä Wls äh€Wâ@€Wls è⨀Wà‹ ä€Wâh€Wà‹ ðŒä¸€WX}WâÜ€Wt`äЀWؘLæ‚WDÂäì€Wø€Wæ âWæâ8WŒ è`‚WèâpêŒ äWäXWãá(‚W˜RähW8W˜R¤WÿèäàWäÐWäãWì âW ä ‚WèüWì âWðÐWêP‚WÈÞä8‚WæÈÞè âx‚W„£ ä`‚Wâ 8‚W„£ ¨NNìŒ äˆ‚WW⨂Wäõä ‚WäÝVâHƒWÐõ丂WäÐõô‚WááÿåäƒWäœBçDá,ƒWèÈBø ˜êèƒW\”äXƒWä\””ƒWááÿåä°ƒWïDá̃Wè|Jÿè„WtVåøƒWP’Oæ0„W´õä„W „Wæ â nOæ´„W°Ü ä@„Wä°Ü |„Wááÿå䘄WïDíœBì|†W8`äÄ„WÌ„Wâ âü„W8`èL†Wèâpê8`äÌ„Wä…Wãáì…W˜Rä,…Wü„W˜Rh…Wÿè䤅Wä”…WäãÌ„Wì âÌ„W äÐ…WèÀ…Wì âÌ„Wð”…Wê†WH' äü…WæH' èâ<†WÄð ä$†Wâü…WÄð èâd†WÀäL†Wâ$†WÀð8`ät†WÌ„Wæ`ãÜ­W\­Wâ„®W øäô­Wä ø0®WÿìäL®Wïáh®Wè0ãQÿèЮWH„ä”®WæH„´Oâÿå8³W b(³Wà®Wì®Wæâ ¯W b¤²W踲Wä @áp³Wæ bäì®Wä<¯Wãá"˜°WôOà¯WL¯W¯WôOˆ¯Wÿèä´¯Wìãì®WøЯWì âì®Wèè¯W¯WôO$°WÿèäP°Wìãì®Wìl°WèЯWøˆ°Wê âì®W äH±W˜R䨰W¯W˜Rä°Wÿèä±W䈰Wäãì®Wì,±WèЯWøˆ°WêܱWä äX±W¯Wä ”±WâÿèäÀ±Wìááì®WöЯW쌲W`Áäì±W¯W`Á(²WâÿèäT²Wìááì®W êp²WèЯWø|Pî b䜲Wì®WæˆbìȲWì®Wäââ¯W4 ³Wÿäìâ"æÀåFã0³Wì®WℸWÄäH³WäÄ„³Wááÿåä ³WïDá¼³WøسWøô³Wø´WèØfèâ,´Wø€¶WèH´Wì âX´Wæâˆ´WøÌéP¶WèâpêøÌåX´W䨴WãáxµW˜R临Wˆ´W˜Rô´Wÿèä0µWä µWäãX´Wì âX´W ä\µWèLµWì âX´Wð µWê µWX¢ 䈵WæX¢ ,ZäâȵW`]ä°µWâ ˆµW`]œBäâðµW8ÌäصWâ °µW8ÌØfä â¶WøIå¶WâصWøIèâ@¶Wä«ä(¶Wã ¶Wä«èQLââh¶WìâäP¶Wâ(¶WìâðøÌåx¶WX´WWì ⬶WæâܶWÔÛèT¸WèâpêÔÛ䬶Wäü¶WãáÌ·W˜Rä ·WܶW˜RH·Wÿèä„·Wät·Wä㬶Wì ⬶W ä°·Wè ·Wì ⬶Wðt·Wêô·W`ß äÜ·Wæ`ß è â¸Wì ä¸WâÜ·Wì èâD¸W¨œä,¸Wâ¸W¨œèâl¸WìâäT¸Wâ,¸WìâðÔÛä|¸W¬¶Wâ ¸WÉ ä”¸WÜOê\ß ä°¸Wä\ß ì¸Wááÿåä¹WïDá$¹Wè|JøLbìX¹W8à äP¹Wd×Jâø¹W à äh¹Wä à ¤¹WÿìäÀ¹WïáܹWèèƒNÿè|ºWЄäºWäЄDºWÿìä`ºWïí Ní»W—䌺Wä—ȺWÿìääºWïíÄûMìL»WXÊ ä»WæXÊ ´Oâÿå¼WØ–ä\»W䨖˜»Wááÿåä´»WäTDçDáлWè4íIìì»WèTDøTDê$¼Wd„ä¼WRæ@¼Wübä4¼W,ÙOæà¼W¬–äP¼W䬖Œ¼Wááÿå䨼WäœBçDáļWè|Jö|JꀽW–äð¼Wä–,½WááÿåäH½WïDád½Wè|Jö|Jê$¿WáÊ ä½Wœ½Wæâ̽W„èô¾Wèâpê„䜽Wäì½Wãá¼¾W˜Räü½W̽W˜R8¾Wÿèät¾Wäd¾Wä㜽Wì ✽W ä ¾Wè¾Wì ✽Wðd¾Wêä¾WH' ä̾WæH' èâ ¿WÀäô¾Wâ̾WÀð„ä¿Wœ½Wâ4¿W¸bä à8NÀÀW ÅäD¿WP¿Wæ â`¿Wæâ¿W¼á èÀWèâpê¼á ä`¿Wä°¿Wãá€ÀW˜RäÀ¿W¿W˜Rü¿Wÿèä8ÀWä(ÀWäã`¿Wì â`¿W ädÀWèTÀWì â`¿Wð(ÀWê¨ÀW¼¤ äÀW漤 œBì¼á ä¸ÀW`¿Wâ|ÁW|–äÐÀWä|– ÁWÿìä(ÁWïáDÁWè ˜ê`ÁWè ˜ÿêh–äŒÁWäh–ÈÁWðäÁWöôéXÂWåçäçæááxýâ6âøt äpÂWä4ê(#ý´ÂWøà ä¬ÂWBUâÐÂWÜà äÄÂW”€MæìÂWØ—äàÂWè]QæüÂWpË ä ô­JÃWDcä ÃWê4ÃWLË ä(ÃW|™KæPÃW0Ë äDÃWœJVæ(ÄWÔÊ ä`ÃWäÔÊ œÃWááÿåä¸ÃWïDáÔÃWèÈBìðÃWè¬@Mì ÄWÿä¸3Mì8ÄWœÊ ä äVTÄWDùäHÄWîdà ädÄWädà  ÄWÿì÷áÌÄW„á ä |JOäÄWXá äÜÄW,IOâÌW …ÌWôÄWáÅWæâ 0ÅW …„ËWè˜ËWä @ápøËWæ …åÅWäPÅWãá"¬ÆWôOôÅW`ÅW0ÅWôOœÅWÿèäÈÅWìäÅWøäÅWì ãÅWèüÅW0ÅWôO8ÆWÿèädÆWìäÅWì€ÆWèäÅWøœÆWê ãÅW ä\ÇW˜R伯W0ÅW˜RøÆWÿèä$ÇWäœÆWääÅWì@ÇWèäÅWøœÆWê ÈW˜ÞälÇW0ÅW˜Þ¨ÇWâÿèäÔÇWìáâÅWêðÇWèäÅWøœBì,ÉW@Š äÈW0ÅW@Š XÈWâÿèä„ÈWìáâÅWê ÈWèäÅWì¼ÈWèœBìØÈWøôÈWøÉWèTDøLbìhÊWˆ*ä<ÉW0ÅWˆ*xÉWâÿèä¤ÉWìáâÅWêÀÉWèäÅWìÜÉWèœBìøÉWøÊWèœBì0ÊWøLÊWèTDøLbìlËWè äxÊW0ÅWè ´ÊWâÿèäàÊWìáâÅW êüÊWèäÅWìËWèœBì4ËWøPËWèœBøLbð …ä|ËWáÅWæˆbì¨ËWáÅWä$ââ0ÅWd¯ äËWÿä$ìâ-æÀåFãÌWáÅWâ4ÎW°Yå(ÌW4ÌWæâdÌWüäèÎWèâpêüää4ÌWä„ÌWãáTÍW˜Rä”ÌWdÌW˜RÐÌWÿèä ÍWäüÌWäã4ÌWì â4ÌW ä8ÍWè(ÍWì â4ÌWðüÌWê|ÍWTŽädÍWæTŽèâ¤ÍW· äŒÍWâdÍW· è âÌÍW€í ä´ÍWâ ŒÍW€í ˜äâôÍWŒÝäÜÍWâ ´ÍWŒÝ ˜äâÎWÈVåÎWâÜÍWÈVá ˜ìüää,ÎW4ÌWâèÏWhÆäDÎWPÎWæ â`ÎWæâÎWð‘è¸ÏWèâpêð‘ä`ÎWä°ÎWãá€ÏW˜RäÀÎWÎW˜RüÎWÿèä8ÏWä(ÏWäã`ÎWì â`ÎW ädÏWèTÏWì â`ÎWð(ÏWê¨ÏW@ äÏWæ@ èâÐÏWìâä¸ÏWâÏWìâðð‘äàÏW`ÎWâdÒWtYåøÏWÐWæ âÐWæâDÐWPaè4ÒWèâ@êPaäÐWädÐW ãá4ÑW˜RätÐWDÐW˜R°ÐWÿèäìÐWäÜÐWäãÐWì âÐW äÑWèÑWì âÐWðÜÐWê\ÑWä¬äDÑWæä¬$¬Näâ„ÑW¼älÑWâDÑW¼èâ¬ÑW˜ýä”ÑWâlÑW˜ýè âÔÑWxtä¼ÑW”ÑWxtèâüÑWØvääÑWâ¼ÑWØvèâ$ÒWðª ä ÒWâäÑWðª èâLÒW ûä4ÒWâ ÒW ûðPaä\ÒWÐWâÓW ÆätÒWä Æ°ÒWááÿåäÌÒWïDáèÒWèì¥Kÿìð—äÓWäð—PÓWááÿåälÓWïDí|JêœÖWø…ä˜ÓWäø…ÔÓWÿìäðÓWïá ÔWèPLì(ÔWøDÔWøpÖWè`ÔWì âpÔWæâ ÔWàM è@ÖWèâpêàM äpÔWäÀÔWãáÕW˜RäÐÔW ÔW˜R ÕWÿèäHÕWä8ÕWäãpÔWì âpÔW ätÕWèdÕWì âpÔWð8ÕWê¸ÕWTÚä ÕWæTÚèâàÕW¬½äÈÕWâ ÕW¬½è âÖWô äðÕWâÈÕWô èâ0ÖWpÖäÖWâðÕWpÖèâXÖW ûå@ÖWâÖW ûñàM ähÖWpÔWîŒÖWì â¼ Tæ×WÍ ä¬ÖWäÍ èÖWÿìä×Wïá ×WèÌ‹Lì<×WèPÏIìX×WèLbìt×Wè8oÿèð×Wáâ ä ×W¨×WâæÀ×Wåâ ä Ø×WðQ ¨×WîÔ)¨×WèÈØW\dåØWä\d<ØWÿìäXØWïátØWèÀ®TìØWè|Jì¬ØWè8ÆKøX-ì ÙWÐû䨨WäÐûÙWÿìä0ÙWïáLÙWè¤PJìhÙWè8oì„ÙWÿäX-ì”ÚWœûä°ÙWäœûìÙWÿìäÚWïá$ÚW蔀Mì@ÚWø\ÚWøxÚWè|P÷BJìàÚW@dä¤ÚWæ@d´Oâÿå¸ÛWÇäðÚWäÇ,ÛWÿìäHÛWïádÛWèlÍJì€ÛWèôIìœÛWè°"JøLbì„ÝWdZåÈÛWÔÛWæ âÜW4öèTÝWèâpê4öäÔÛWä$ÜWãáôÜW˜Rä4ÜWÜW˜RpÜWÿèä¬ÜWäœÜWäãÔÛWì âÔÛW äØÜWèÈÜWì âÔÛWðœÜWêÝWœäÝWæœèâDÝW ä,ÝWâ ÝW ˜äâlÝW ;äTÝWâ,ÝW ;ð4öä|ÝWÔÛWâ@ÞWÔ…ä”ÝWäÔ…ÐÝWááÿåäìÝWïDáÞWè4íIì$ÞWèŒýIøOììßWXûäPÞWäXûŒÞWááÿåä¨ÞWïDáÄÞWèœBêàÞWøüÞWèœBøßWì â(ßWæäDßWïá`ßWèœBê|ßWø˜ßWè|Jê´ßWè4TìÐßWèœBøœBì¨àWûäüßWäû8àWÿìäTàWïápàWè|JêŒàWÿôÀàWŒÌ ä¸àW8vRâDáWDÌ äÐàWäDÌ áWááÿåä(áWïDí ˜ê`áWøcäTáWDêRæxáW¼á äpáW`¿WââWðYåˆáWäðYáÄáWÿìäàáWïáüáWè|Jö|Jî¸úä(âWä¸údâWÿìä€âWïáœâWèœBøØfìãWÄüäÈâWäÄüãWááÿåä ãWïDá<ãWèšJìXãWøtãWÿä8oì0äW ‡ä ãWä ‡ÜãWÿìäøãWïáäWèØPøôPìHäWâ ä@äWPŽPâ åWàdäXäWäàd”äWÿìä°äWïáÌäWèlÍJìèäWèôIìåWè°"JøLbìæW¤Í ä0åWä¤Í låWÿìäˆåWïá¤åWèðJìÀåWè|JêÜåWè,ZêøåWè,Zö,ZêÐèWð†ä$æW0æWæ$â`æW¼’è èWèâpê¼’ä0æW䀿W ãáPçW˜RäæW`æW˜RÌæWÿèäçWäøæWäã0æWì â0æW ä4çWè$çWì â0æWðøæWêxçWœ”ä`çW朔è â çW¬¨äˆçWâ`çW¬¨èâÈçW`Çä°çWâˆçW`ÇèâðçWx_äØçWâ°çWx_èâèWtËåèWâØçWtËèâ@èW(ä(èWãèW(è âhèW¼[äPèWâ(èW¼[èâèWüpäxèWâPèWüpèâ¸èW4ä èWâxèW4ð¼’äÈèW0æWâŒéWȆäàèWäȆéWááÿåä8éWïDáTéWè4íIìpéWèTDøTDê¨éW¤†äœéWJæììWtüä¸éWÄéWæ âÔéWæäðéWïá êWè´5Rì˜ìWè(êWì â8êWæ$âhêWœ²èhìWèâpꜲä8êWäˆêW ãáXëW˜Rä˜êWhêW˜RÔêWÿèäëWåëWäã8êWì â8êW ä<ëWè,ëWì â8êWñëWê€ëWØO ähëWæØO ÐVLäâ¨ëW˜­äëWâhëW˜­èâÐëWÔ¡ä¸ëWâëWÔ¡èâìWè äàëWâ ¸ëWè øëWä â â<ÃNæ0ìWpäìWâàëWpèâXìWPÉä@ìWâìWPÉèâ€ìWìâähìWâ@ìWìâðœ²äìW8êWâ´ìWøÐìWèœBøLbìíW€Í äüìWíWæ â@Tæ4íWXüä(íW`ÎWæDîWlâ äDíWälâ €íWááÿåäœíWïDá¸íWè|JìÔíWè|JìðíWø îWø(îWÿô8ïWHâ äTîWäHâ îWááÿåä¬îWïDáÈîWèßPìäîWùïWøïWèœBÿèHðWÜÇäHïWäÜÇ„ïWááÿåä ïWïDá¼ïWøØïWøôïWèTDêðWè¼p-ì,ðWÿä\½MìdðW,â äXðWXôO>Xp=X@=XôO¬=XÿèäØ=Xìã=Xøô=Xì â=Xè >X@=XôOH>Xÿèät>Xìã=Xì>Xèô=Xø¬>Xê â=X äl?X˜RäÌ>X@=X˜R?Xÿèä4?Xä¬>Xäã=XìP?Xèô=Xø¬>Xê@XTü ä|?X@=XTü ¸?Xâÿèää?Xìáá=X´ë@Xèô=Xø8oìÌ@XDõä,@X@=XDõh@Xâÿèä”@Xìáá=X°ê°@Xèô=XùBJì|AXð§äÜ@X@=Xð§AXâÿèäDAXìáá=X¬ê`AXèô=XùBJðè† äŒAX=XæHÆKì¸AX=XäÀââ@=XØ… ôAXÿäÀìâ¿3)6{Ò²ÀO˜>`ìBJì CX`_åDBXä`_á€BXÿìäœBXïá¸BXèlÍJìÔBXèôIìðBXè°"JøLbìäCXpäCXäpXCXÿìätCXïáCXèø3Oì¬CXøÈCXè0 KøLbì DXˆÑ äôCXäˆÑ 0DXÿìäLDXïáhDXè|øOì„DXè|Jö|Jê¸DX$žä°DX˜KìÈŽXèLbìäŽXè NíXèðJøØfì8XÄè ä,XêX,ŽäHXä,Ž„Xÿìä Xïá¼XèlÍJìØXèôIìôXè°"JøLbìÌXT£ä XäT£\XÿìäxXïá”Xè|øOì°XÿäLb중X¨ÏäÜXä¨Ï‘Xÿìä4‘XïáP‘XèlÍJìl‘XèôI숑Xè°"JøLbì|’Xèä´‘Xäèð‘Xÿìä ’Xïá(’XèlÍJìD’XèôIì`’Xè°"JøLbìT“XŽäŒ’XäŽÈ’Xÿìää’Xïâ“XèlÍJì“XèôIì8“Xè°"JøLbìp“X bå d“XTDäô“XˆÏ䀓XäˆÏ¼“Xááÿå䨓XïDíXðIì”X€bå”XàJæ,”Xlä ”XHaNæD”X £ä<”XØfNâÈ”XläT”Xäl”Xááÿå䬔XäÜ9NçDíÜ9NìL•Xô¢äØ”Xäô¢•Xááÿåä0•XïDíÈBì(—XÐä\•Xd•Xâ┕XÐèø–XèâpêÐäd•Xä´•Xãá„–X˜RäÄ•X”•X˜Rá–Xÿèä<–Xä,–Xäãd•Xì âd•X äh–XèX–Xì âd•Xð,–XêÀ–XD„ ä”–XæD„ ¬–Xä â êäè–XdPäЖXâ”–XdPèâ—X̉ äø–Xâ ЖX̉ ,ÇJìÐä —Xd•XâÈ—XÀ¢ä8—XäÀ¢t—Xááÿåä—XäœBçDᬗXè ˜ö ˜êh˜X¤¢äØ—X䤢˜Xááÿåä0˜XïDáL˜Xè ˜ö ˜ê„˜Xˆ¢äx˜X,&Mê$Õ ä”˜XØ{L漘Xˆé ä°˜Xê<¦X\é ä̘Xä\é ™Xÿìä$™Xïá ¦Xè@™Xì âP™Xæâ €™XhÝ œ¥Xè°¥Xä @áp¦XæhÝ äP™Xä ™Xãá"üšXôODšX°™X€™XôOì™XÿèäšXìãP™Xø4šXì âP™XèLšX€™XôOˆšXÿèä´šXìãP™XìКXè4šXøìšXê âP™X 䬛X˜Rä ›X€™X˜RH›Xÿèät›XäìšXäãP™Xì›Xè4šXøìšXꔜXX¥ ä¼›X€™XX¥ ø›Xâÿèä$œXìááP™XPê@œXè4šXì\œXèBJìxœXèBJøhàLìDXT,䤜X€™XT,àœXâÿèä XìááP™XLê(Xè4šXø8oìôX\M äTX€™X\M Xâÿèä¼XìááP™XHêØXè4šXø8o줞X‚ äžX€™X‚ @žXâÿèälžXìááP™XDꈞXè4šXø8oìTŸX ä´žX€™X ðžXâÿèäŸXìááP™X@ê8ŸXè4šXø|Jì X¼ ädŸX€™X¼  ŸXâÿèäÌŸXìááP™X<êèŸXè4šXø8oì´ Xœ• ä X€™Xœ• P Xâÿèä| XìááP™X8꘠Xè4šXøX-ìd¡X<“äÄ X€™X<“á¡Xâÿèä,¡XìááP™X4êH¡Xè4šXø8oì¢Xdáät¡X€™Xdá°¡XâÿèäÜ¡XìááP™X0êø¡Xè4šXø|JìÄ¢Xô¾ä$¢X€™Xô¾`¢Xâÿè䌢XìááP™X,ꨢXè4šXø8oìt£XpP äÔ¢X€™XpP £Xâÿèä<£XìááP™X(êX£Xè4šXø8oì$¤X´žä„£X€™X´žÀ£Xâÿèäì£XìááP™X$ê¤Xè4šXø8oìÔ¤Xïä4¤X€™Xïp¤Xâÿè䜤XìááP™X 긤Xè4šXø8oì„¥Xx/ää¤X€™Xx/ ¥XâÿèäL¥XìááP™Xêh¥Xè4šXøhàLðhÝ ä”¥XP™Xæ8œJìÀ¥XP™Xä\â’Xlü¥Xÿä\ìâa+.õ¡Ñ±€_I‘kë8oì¬XÖ äL¦XäÖ ˆ¦Xÿì䤦Xïá´«XèÀ¦Xì âЦXæã §X0«XèD«Xä @áp¤«XæäЦXä §Xãá|¨XôOħX0§Xá §XôOl§Xÿè䘧XìãЦXø´§Xì âЦXȩ̀Xá §XôO¨Xÿèä4¨XìãЦXìP¨Xè´§Xøl¨Xê âЦX ä,©X˜R䌨Xá §X˜RȨXÿèäô¨Xäl¨XäãЦXì©Xè´§Xøl¨XêªXÜ ä<©Xá §XÜ x©Xâÿè䤩XìááЦXêÀ©Xè´§XìÜ©Xèx~Mìø©Xè¤PJø|Jì«X”Û ä$ªXá §X”Û `ªXâÿè䌪XìááЦX ꨪXè´§XìĪXèx~MìàªXè¤PJìüªXè|Jøîðä(«XЦXæˆbìT«XЦXäâã§X «XÿäìâäÀåFЫXèx~Mìì«Xè¤PJø|J쨬X°Žä¬Xä°ŽT¬Xááÿåäp¬XïDጬXèœBøœBìĬXðè 丬XLWêLläÔ¬XœñM渭X\ê äð¬Xä\ê ,­XÿìäH­Xïád­XèlÍJ쀭XèôI윭Xè°"JøLbìt®X$ê äÈ­Xä$ê ®Xÿìä ®Xïá<®Xè,9MìX®XèHä`ÕXâ ÈÓXl>xÕXèâ¨ÕXà×èÐÖXèâpæÈÒXà×äxÕXäÈÕXãá˜ÖX˜RäØÕX¨ÕX˜RÖXÿèäPÖXä@ÖXäãxÕXì âxÕX ä|ÖXèlÖXì âxÕXð@ÖXêÀÖXÜdä¨ÖXæÜd´OäæhåÐÖXâ¨ÖXhá|Jè×X@häøÖXâ `ÕX@h|Jè8×X0ì ä ×Xâ øÖX0ì |Jè`×X!äH×Xâ ×X!|Jèˆ×XÛäp×Xâ H×XÛ|Jè°×XH?å˜×Xâp×XH?á´OìÔŽäÀ×X˜ÒXâà×XÔŽäØ×X˜ÒXâØXXåð×Xâ€ÒXXñ”äØXPÑXâ0ÙXØ ä0ØXäØ lØXááÿåäˆØXäœBçDá¤ØXøÀØXøÜØXøøØXøÙXèhSLø¼ëVìHÙXð‘ä@ÙX`ÎWâÚXÜ‘äXÙXäÜ‘”ÙXÿìä°ÙXïáÌÙXøèÙXøÚXèœBì ÚXø<ÚXøXÚXøtÚXèLbø¨sMì ÛX¼‘ä ÚX休ÜÚXÿìäøÚXäœBçáÛXèÈBì0ÛXøLÛXøhÛXè ˜ê„ÛXè ˜ÿè¼ÛXpØ ä°ÛXÐWæ”ÜX eåÌÛXä eáÜXááÿåä$ÜXïDá@ÜXèÈBì\ÜXøxÜXÿô\ÞXTØ ä¤ÜX¬ÜXâ âÜÜXTØ è,ÞXèâpêTØ ä¬ÜXäüÜXãáÌÝX˜Rä ÝXÜÜX˜RHÝXÿèä„ÝXätÝXäã¬ÜXì â¬ÜX ä°ÝXè ÝXì â¬ÜXðtÝXêôÝXÔãäÜÝXæÔãä6MäâÞXXIäÞXâ ÜÝXXI,ÅJäâDÞX̉ ä,ÞXâ ÞX̉ ,ÇJìTØ äTÞX¬ÜXâ4ßXØ älÞXäØ ¨ÞXááÿåäÄÞXäXÿQçDáàÞXèÌýQìüÞXè|JêßXè|JÿæðßXoäDßXäo€ßXááÿåäœßXïDá¸ßXè|JêÔßXè|Jÿè<íX¨¥åàX àXæ âàXæ`âLàX°¸è íXèâpê°¸äàXälàXãá<áX˜Rä|àXLàX˜R¸àXÿèäôàXääàXäãàXì âàX ä áXèáXì âàXðäàXê¬ìXx.åLáXæx.ádáXä âTâ”áX´ãè”ìXèpæLàX´ãädáXä´áX ãá„âX˜RäÄáX”áX˜RáâXÿèä<âXä,âXäãdáXì âdáX ähâXèXâXì âdáXð,âXê4äX|Ü ä”âXæ|Ü ¬âXèâÜâXè¶ èäXèâpêè¶ ä¬âXäüâXãáÌãX˜Rä ãXÜâX˜RHãXÿèä„ãXätãXäã¬âXì â¬âX ä°ãXè ãXì â¬âXðtãXêôãXXà äÜãXæXà èâäXì ääXâÜãXì ðè¶ ä,äX¬âXâ æXd3 äDäXâ ”âXd3 \äXèâŒäX„ªèÜåXèâpꄪä\äXä¬äXãá|åX˜Rä¼äXŒäX˜RøäXÿèä4åXä$åXäã\äXì â\äX ä`åXèPåXì â\äXð$åXê¤åXd¥äŒåXæd¥èâÌåX,Ò ä´åXâŒåX,Ò èâôåXP,äÜåXâ ´åXP, ˜ì„ªäæX\äXâ”çX¤äæXâ DäX¤4æXèâdæXPBèdçXèâpêPBä4æX䄿XãáTçX˜R䔿XdæX˜RÐæXÿèä çXäüæXäã4æXì â4æX ä8çXè(çXì â4æXðüæXê|çX¸¬ädçX測œBìPBäŒçX4æXâ¼çX Ï ä¤çXâ æX Ï $òTèDéXÌ>äÌçXâ ¤çXÌ>äçXèâèXð‡èéXèâpêð‡ääçXä4èXãáéX˜RäDèXèX˜R€èXÿèä¼èXä¬èXäãäçXì âäçX äèèXèØèXì âäçXð¬èXê,éXŒz äéXæŒz ðð‡ä<éXäçXâléX0\äTéXâ ÌçX0\ÊJè\ìXXá ä|éXâ TéXXá ”éXè(âÄéXÀ¦è,ìXèâpêÀ¦ä”éXääéX ãá´êX˜RäôéXÄéX˜R0êXÿèälêXä\êXäã”éXì â”éX ä˜êXèˆêXì â”éXð\êXêÜêX,Ò äÄêXæ,Ò è$âëXè7 äìêXâ ÄêXè7 œBä â,ëX|äëXâ ìêX|ŒëRäâTëX™ ä<ëXâ ëX™ œBäâ|ëXì ädëXâ<ëXì èâ¤ëX( äŒëXâdëX( èâÌëXánä´ëXâŒëXánœBä âôëXäÜëXâ ´ëXœBäâìXÌäìXâ ÜëXÌœBäâDìX€Ðå,ìXâìX€ÐáœBìÀ¦äTìX”éXâ„ìXà•älìXâ |éXà•DêRì(ªå”ìXâlìX(ªáhTWèÔìX\J ä¼ìXâLáX\J èâüìXœ×ääìXâ¼ìXœ×èâ$íXyä íXâäìXyð°¸ä4íXàXâã äLíXTíXââ„íX è„îXèâpê äTíXä¤íXãátîX˜Rä´íX„íX˜RðíXÿèä,îXäîXäãTíXì âTíX äXîXèHîXì âTíXðîXêœîX\Cä„îXæ\Cð ä¬îXTíXâÐîXHÓäÄîXêìîXüäàîX`¼QæpïXÔäüîXäÔ8ïXÿìäTïXïíø3OìœïX¨¦ŒïX€ïX¨Qê”ïX¨Qâ ðXx¦ä¬ïXäx¦èïXÿìäðXïî/QìøðX Óä0ðXä ÓlðXÿìäˆðXïá¤ðXèlÍJìÀðXèôIìÜðXè°"JøLbììñXÜeåñXäÜeáDñXÿìä`ñXïá|ñXèœBì˜ñXè|Jê´ñXè|JìÐñXÿäLbìÀòX,í äüñXòXæ âòXæä4òXïáPòXèÙUìlòXøˆòXø¤òXÿô´óXD¦äÐòXäD¦ óXááÿåä(óXïDáDóXè¬@Mì`óXø|óXè ˜ê˜óXÿôôX˜äÄóXä˜áôXááÿå÷DáØôXøì ä,ôXäøì hôXááÿåä„ôXïDá ôX踆Sì¼ôX踆Sÿè÷Xäì äèôXääì $õXááÿåä°öXä@õXçDá âPõXæâ€õXŸ è€öXèâpêŸ äPõXä õXãápöX˜Rä°õX€õX˜RìõXÿèä(öXäöXäãPõXì âPõX äTöXèDöXì âPõXðöXê˜öXXää€öXæXäðŸ ä¨öXPõXâÌöXøèöXÿô¤÷XÄì ä÷XäÄì P÷Xááÿåäl÷XïDáˆ÷XèœBÿè”ùXÙ ä´÷X¼÷Xââì÷XÙ èdùXèâ`êÙ ä¼÷Xä øXãáÜøX˜RäøXì÷X˜RXøXÿè䔸X䄸Xäã¼÷Xì â¼÷X äÀøXè°øXì â¼÷Xð„øXêùXTŽäìøXæTŽè â,ùXô£äùXâìøXô£èâTùXè ä<ùXâùXè èâ|ùX¬-ädùXâ<ùX¬-ðÙ äŒùX¼÷Xæ Òä¤ùXæ Ò¼ùXèæÔùXä˜ ä ¤ùX€(¼ùXêÄúX$î äüùXä$î 8úXÿìäTúXïápúXèlÍJìŒúXèôIì¨úXè°"JøLbìœûXôí äÔúXäôí ûXÿìä,ûXïáHûXèlÍJìdûXèôIì€ûXè°"JøLbìôÿX” ä¬ûXä” èûXÿìäüXïáØÿXè üXì â0üXæâ `üX8VTÿXèhÿXä @ápÈÿXæ8Vä0üXä€üXãá"ÜýXôO$ýXüX`üXôOÌüXÿèäøüXìã0üXøýXì â0üXè,ýX`üXôOhýXÿèä”ýXìã0üXì°ýXèýXøÌýXê â0üX äŒþX˜RäìýX`üX˜R(þXÿèäTþXäÌýXäã0üXìpþXèýXøÌýXê<ÿX,äœþX`üX,ØþXâÿèäÿXìáá0üX ê ÿXèýXøœBð8VäLÿX0üXæˆbìxÿX0üXäââ`üXã´ÿXÿäìâEåÀåFëœBìÌY “äYä “@Yÿìä\YïáxYèlÍJì”YèôIì°Yè°"JøLbìèYð’äÜYø©NæˆY| äøYä| 4YááÿåäPYïDálYèì¥Kø¸3Mê¤Y°Óä˜Yä44Yâ 4Yœ>ÈBäât4YXåä\4Yâ 44YXåÈBäâœ4Y>å„4Yâ\4Y>ñœ•ä¬4Y2Yâp5Y¬Ü äÄ4Yä¬Ü á5Yááÿåä5YïDá85Yè(œJìT5YÿäšJì¸5Y ä€5YŒ5Yæ âœ5Yæ÷á6Y(«äÈ5Yä(«6Yÿìä 6Yïá<6YèlÍJìX6YèôIìt6Yè°"JøLbì¼7Yì×ä 6Yäì×Ü6Yÿìäø6Yïá7Yø07Yè ˜ìL7Yøh7YèTDì„7Yø 7YèLbøLbìØ7Y„ñ äÌ7YLSæô7Yø äè7YȬPæ :Y@ñ ä8Y8Yæ â 8YæâP8Yà*èð9Yèâ@êà*ä 8Yäp8Yãá@9Y˜Rä€8YP8Y˜R¼8Yÿèäø8Yäè8Yäã 8Yì â 8Y ä$9Yè9Yì â 8Yðè8Yêh9YÀ äP9YæÀ èâ9YÄ¿äx9Yâ P9YÄ¿|Jäâ¸9Yà? ä 9Yâx9Yà? è âà9YágäÈ9Yâ 9Yágð$Käâ:Yd~ äð9YâÈ9Yd~ ðà*ä:Y 8YâÀ=Y´×ä0:Y8:Yââh:Y´×è;Yèâ@ê´×ä8:Yäˆ:YãáX;Y˜Rä˜:Yh:Y˜RÔ:Yÿèä;Yå;Yäã8:Yì â8:Y ä<;Yè,;Yì â8:Yñ;Yê€;Yábåh;Yçbéâ¨=YŒoä;Yâ h;YŒo¨;YèâØ;Y\…èx=Yèâ@ê\…ä¨;Yäø;YãáÈYìð äÐ=Yäìð >Yÿìä(>YïýH@YàiåT>Y`>Yæ âp>Yæâ >Y ²è@Yèâpê ²äp>YäÀ>Yãá?Y˜RäÐ>Y >Y˜R ?YÿèäH?Yä8?Yäãp>Yì âp>Y ät?Yèd?Yì âp>Yð8?Yê¸?YpÆä ?YæpÆè âà?YP… äÈ?Yâ ?YP… èâ@Y!äð?YâÈ?Y!èâ0@Y¨ ä@Yâ ð?Y¨ |Jì ²ä@@Yp>Yâd@Y„×äX@Yˆ¸TæäD[Yâ [Yœ>ÌýQä â„[Y täl[Yâ D[Y tÈBäâ¬[Yls ä”[Yâl[Yls èâÔ[Yà‹ ä¼[Yâ”[Yà‹ ð¸íää[YTWYâÈ]Y`Ùäü[Y\Yæ â\Yæ âH\YŸè˜]YèâpêŸä\Yäh\Yãá8]Y˜Räx\YH\Y˜R´\Yÿèäð\Yäà\Yäã\Yì â\Y ä]Yè ]Yì â\Yðà\Yê`]YÜd äH]YæÜd èâˆ]YÈ¿äp]Yâ H]YÈ¿œBäâ°]Y ¬ä˜]Yâp]Y ¬ðŸäÀ]Y\Yâ ^Y„ô äØ]Yä„ô ^Yÿìä0^YïáL^Yøh^YèTDì„^YèœBøT±Pì¼^Y`ô ä°^Y¼Sæ\_YŒ¬äÌ^Y䌬_Yááÿåä$_YïDá@_Yèì¥KÿèaYDô äl_Yx_Yæ âˆ_Yæâ¸_Yä%èà`Yèâpêä%äˆ_YäØ_Yãá¨`Y˜Räè_Y¸_Y˜R$`Yÿèä``YäP`Yäãˆ_Yì âˆ_Y äŒ`Yè|`Yì âˆ_YðP`YêÐ`Y´÷ä¸`Yæ´÷èâø`Y€³äà`Yâ¸`Y€³ðä%äaYˆ_Yæ\¬ä aY,aYæ â ähpYâ @pY > ˜â â¨pY4¶äpYâ hpY4¶ÈBäâÐpY*ä¸pYâpY*èâøpYìâäàpYâ¸pYìâðPõ äqYXmYâÌqYØkå qYäØká\qYááÿåäxqYïDá”qYèÌVOì°qYè`4XÿèøqYäÞ äÜqYèqYæ â¼´Tæ$rYõ ärYrYæ âHgXêÌ—ä4rYdZTæ\rY¸­äPrYœBæürY ™älrYä ™¨rYÿìäÄrYïáàrYè@™Xø8oì¸sYœß ä sYäœß HsYÿìädsYïá€sYè1NìœsYÿôáçƒÿí ðÿƒááÿÿÿ÷â¥å@@ÿä ïÿäïááÿÿÿáâ ÿìïÿ~ááÿÿïÿåâæ ÿäðÿäÿûâ&ÿì ïÿƒááÿÿïÿåâæ ÿä ïÿäï~ááÿÿÿáâ ÿì ïÿƒááÿÿïÿåâæ ÿäðÿƒááÿÿÿ÷âŸå€Àÿä ðÿƒááÿÿÿ÷â¥å@@ô2€è”–YüéÀ–Yü:á¼p-äƒýü—Y¸äü–Yä¸8—YÿìäT—Yïáp—Yé§R쌗Yè|JꨗYéBJìÄ—Yè «Rìà—Yÿä„ëIì˜YÀÜä ˜Y(WJ渘YXnå(˜YâX˜YXná@˜Yèæ(˜Yä¬*ä p˜Y0Â@˜Yê ˆ˜YÔw @˜Yê  ˜YÑ@˜Yîpƒ@˜Y輚YlwäȘYÔ˜Yæ âä˜Yæâ™Y|茚Yèâpê|ää˜Yä4™YãášY˜RäD™Y™Y˜R€™Yÿèä¼™Y䬙Yäãä˜Yì âä˜Y äè™YèØ™Yì âä˜Yð¬™Yê,šY¬oäšYæ¬o ˜ä âTšY cå<šYâšY cá ˜äâ|šY€í ädšYâ <šY€í ˜ä⤚YLx䌚YâdšYLxð|ä´šYä˜Yâ”›Y@nåÌšYä@ná›Yááÿåä$›YïDá@›YèÈBì\›Yøx›YÿôPœY$n夛Yä$náà›Yááÿåäü›YïDáœYèßPì4œYÿäœBìðœYÔø ä`œYäÔø œœYááÿå东YïDáÔœYè¬@MÿèY0›åYä0› äð®Yâ È®Y > |Jâ â0¯Y4¶ä¯Yâ ð®Y4¶ÈBäâX¯Y*ä@¯Yâ¯Y*è Yìâäh¯Yâ@¯YìâðÜú ä¯Yà«Yâ$±Y¸w䨯Y´¯Yæ âįYæâô¯Yzèô°Yèâ@êzäįYä°Yãáä°Y˜Rä$°Yô¯Y˜R`°Yÿè䜰Y䌰YäãįYì âįY äȰY踰Yì âįYðŒ°Yê ±YXääô°YæXäðzä±YįYâ@±YÜâ ä4±Y¬œQæl±YT°äP±Y\±Yæ âtªV戱Y Ýä|±YœB椱Y8ù 䘱Y8Uæ´²YÜä´±YäÜð±Yááÿåä ²YïDá(²YèœBìD²Yø`²Yèh¡Kì|²Yè O옲Yè´VøØf쌳YøÜäIJYäøÜá³Yááÿåä³YïDá8³Yè ˜êT³Yè ˜êp³Yè ˜ö ˜ê€´Y°äœ³Yä°سYááÿåäô³YïDá´Yø,´YèÀUìH´Yød´Yÿôœ´YÔnå´Y1JêÔÜ䬴YäÔÜè´YÿìäµYïîî-ìøµYD±ä0µYäD±lµYÿì䈵YïᤵYè4VìÀµYøܵYèôPøLbì´¶Yô°ä¶Yäô°D¶Yÿìä`¶Yïá|¶Yè‡R옶YèLbøLbìжY4œäĶY4°Ræü¶Y °äà¶Yì¶Yæ â0PL怷YØÝä ·YäØÝH·Yááÿåäd·YïDíœB윷Yáxä·Yð$Kê¤ù 䬷Yä¤ù è·Yÿìä¸Yä ˜çá ¸Yè ˜ÿèܸY@ú äL¸Yä@ú ˆ¸Yäÿå䤸YïáÀ¸Yè„ëIøLBKì(¹Y ã äì¸Yæ ã ´OâÿæºYtã ä8¹Yätã t¹Yÿìä¹YïᬹYèlÍJìȹYèôIìä¹Yè°"JøLb쌻YˆxäºYºYæ â,ºYæâ\ºYx è\»Yèâpêx ä,ºYä|ºYãáL»Y˜R䌺Y\ºY˜RȺYÿèä»YäôºYäã,ºYì â,ºY ä0»Yè »Yì â,ºYðôºYêt»Y cå\»Yæ cá|Jìx ä„»Y,ºY⤻Y Þ䜻Y˜¡Yâ(¼YŒœä´»Y䌜ð»Yÿìä ¼YïíœBìD¼YXã ä8¼YøúSç½YpœäT¼Yäpœ¼Yááÿå䬼YïDáȼYèüÙMìä¼YèLxNÿè´¾YlÞä½Y½Yæ â,½Yæâ\½YD¢è„¾Yèâ@êD¢ä,½Yä|½YãáL¾Y˜R䌽Y\½Y˜RȽYÿèä¾Yäô½Yäã,½Yì â,½Y ä0¾Yè ¾Yì â,½Yðô½Yêt¾YÄLä\¾YæÄLè✾Y û䄾Yâ\¾Y ûðD¢ä¬¾Y,½YâŒÂYäoåľYääoâ¿Yááÿåä¿YïDá8¿Yè¬@MìT¿Yøp¿Yÿ䌿Yê ✿Yæ,âÌ¿Yøáè\ÂYèâpêøá䜿Yäì¿Y ãá¼ÀY˜Räü¿YÌ¿Y˜R8ÀYÿèätÀYädÀYä㜿Yì ✿Y ä ÀYèÀYì ✿YðdÀYêäÀY¬åÌÀYæ¬é(â ÁY|åôÀYâÌÀY|á|Jä$â4ÁY€~äÁYâôÀY€~è â\ÁY¨WäDÁYâ ÁY¨Wì…Käâ„ÁYßälÁYâ DÁYßì…Käâ¬ÁY€t ä”ÁYâ lÁY€t ¬@MäâÔÁY; ä¼ÁYâ”ÁY; èâüÁYääÁYâ¼ÁYè â$ÂY» ä ÂYâäÁY» èâLÂY*ä4ÂYâ ÂY*èâtÂYìâä\ÂYâ4ÂYìâðøáä„ÂYœ¿Yâã$ú äœÂYä$ú ØÂYááÿåäôÂYïDáÃYèœBø|JêèÃYðÞä<ÃYäðÞxÃYááÿåä”ÃYïDá°ÃYè(œJìÌÃYÿä`ûìÄYØä äøÃY®UæPÄY`påÄYæ`pá´Oâÿå(ÅY¬ä ä`ÄYä¬ä œÄYÿìä¸ÄYïáÔÄYèlÍJìðÄYèôIì ÅYè°"JøLbìäÅYL²ä8ÅYäL²tÅYÿìäÅYïá¬ÅYè¥QìÈÅYèX-øLbì8ÆYÌÞäôÅYáÆYæäÆYïíœBìTÆY8ä äHÆYd•Xæ¬ÉYðœädÆYäðœ ÆYááÿå伯YïDáØÆYè ˜êôÆYèÈBøÇYì â ÇYæ4âPÇYL è|ÉYèâpêL ä ÇYäpÇY ãá@ÈY˜Rä€ÇYPÇY˜R¼ÇYÿèäøÇYäèÇYäã ÇYì â ÇY ä$ÈYèÈYì â ÇYðèÇYê|ÈY åPÈYæ áhÈYä0â êä¤ÈYtµäŒÈYâPÈYtµè,âÌÈYYä´ÈYâŒÈYYè(âôÈYŒ< äÜÈYâ´ÈYŒ< è$âÉYl¥äÉYâ ÜÈYl¥x§KäâDÉYÈ ä,ÉYâÉYÈ èâlÉYL†åTÉYâ,ÉYL†éâ”ÉYà‹ ä|ÉYâTÉYà‹ ðL ä¤ÉY ÇYâ\ÊY ä ä¼ÉYä ä øÉYááÿåäÊYïDá0ÊYè|JöLÊYì âx§KæxÊYpålÊY(^-êÌœäˆÊYÌkÌœ¸b9ò|b9öDÌYÄßäÔÊYäÄßËYÿìä,ËYïáHËYèœBìdËYø€ËYèTDìœËYø¸ËYèTDìÔËYøðËYèTDì ÌYø(ÌYÿôÍYTßäTÌYäTßÌYÿìä¬ÌYïáÈÌYèlÍJìäÌYèôIíÍYè°"JøLbìÎY¨yä,ÍYä¨yhÍYÿìä„ÍYïá ÍYè4mJì¼ÍYè|JìØÍYøôÍYèîø8oì\ÎYTžä ÎYæTžœBäÿå¨ÎY$žälÎYæ$žœBäÿå€ÏY„yä¸ÎYä„yôÎYÿìäÏYïá,ÏYèlÍJìHÏYèôIìdÏYè°"JøLbìøÏYÔ²äÏY˜ÏYâæ°ÏYäÔ²ä ÈÏY¬ ˜ÏYê àÏYD˜ÏYîü˜ÏYè´ÐY@å äÐYä@å DÐYÿìä`ÐYïá|ÐYè04Kì˜ÐYè”}Kø ‚KìŒÑYqåÄÐYäqâÑYÿìäÑYïá8ÑYèlÍJìTÑYèôIìpÑYè°"JøLbì¤ÑYÜú äœÑYà«Yâ(ÒYÄú ä´ÑYäÄú ðÑYááÿåä ÒYïDíPÏIìäÒYèpå8ÒYäèpátÒYááÿåäÒYïDá¬ÒYèÌVOìÈÒYèÐWÿè˜ÔY,yäôÒYáÓYæ âÓYæâ@ÓYàlèhÔYèâpêàläÓYä`ÓYãá0ÔY˜RäpÓY@ÓY˜R¬ÓYÿèäèÓYäØÓYäãÓYì âÓY äÔYèÔYì âÓYðØÓYêXÔYÔŠä@ÔYæÔŠ0 Käâ€ÔỶ ähÔYâ @ÔỶ ,ÇJìàläÔYÓYâ´ÔYßä¨ÔYtiXæøÖYœpåÄÔYÐÔYæãÕYœ6 èÈÖYèâ`êœ6 äÐÔYä ÕYãáðÕY˜Rä0ÕYá ÕY˜RlÕYÿèä¨ÕYä˜ÕYäãÐÔYì âÐÔY äÔÕYèÄÕYì âÐÔYð˜ÕYêÖYdhåÖYædhèâ@ÖYÌžä(ÖYãÖYÌžè âhÖY`xäPÖYâ(ÖY`xèâÖY0äxÖYâPÖY0èâ¸ÖYP$ä ÖYxÖYP$ìàÖY@yäÈÖYâ ÖY@yðœ6 äðÖYÐÔYâ×Y¨ä×YD´Kæ0×Yøä ä$×Y\eQæ@×Yx²ä°óä„påP×Yä„páŒ×Yÿìä¨×YïáÄ×Yè ˜êà×Yè ˜ÿæ ÙYxàä ØYäxàHØYÿìädØYïá€ØYè ˜êœØYè ˜ê¸ØYè ˜êÔØYè ˜ìðØYÿä¼p-ì¬ÙYlû äÙYälû XÙYÿìätÙYïáÙYè8ÆKøüÌKìdÛYôžä¼ÙYäôžøÙYÿìäÚYïá0ÚYè(œJìLÚYøhÚYè|Pê„ÚYø ÚYø¼ÚYèÔ‰JìØÚYéBJìôÚYèŠJìÛYèpì,ÛYøHÛYèpùBJìèÛYÈžätÛYäÈž°ÛYÿìäÌÛYïí Nì4ÜY å äøÛYæ  å |âRáÿåàâY@³äDÜYä@³€ÜYÿìäœÜYä ˜çí¸ÜYìâèÜY\›èèÝYèâpê\›ä¸ÜYäÝYãáØÝY˜RäÝYèÜY˜RTÝYÿèäÝYä€ÝYäã¸ÜYì â¸ÜY ä¼ÝYè¬ÝYì â¸ÜYð€ÝYêÈâY(°äèÝYæ(°áÞYèâ0ÞYø•èðàYèpæèÜYø•åÞYäPÞYãá ßY˜Rä`ÞY0ÞY˜RœÞYÿèäØÞYäÈÞYääÞYì ãÞY äßYèôÞYì ãÞYðÈÞYêHßYð–ä0ßYæð–ìààY ¿äXßYâ 0ßY ¿pßYèâ ßY SèÈàYèâpæ0ÞY SäpßYäÀßYãáàY˜RäÐßY ßY˜R àYÿèäHàYä8àYäãpßYì âpßY ätàYèdàYì âpßYð8àYê¸àYÄÀä àYæÄÀèæ”ÁäÈàYâ àY”ÁðÔÅäðàYâ XßYÔÅáYèâ8áYÈ.è°âYèâpæ0ÞYÈ.äáYäXáYãá(âY˜RäháY8áY˜R¤áYÿèäàáYäÐáYäãáYì âáY ä âYèüáYì âáYðÐáYêPâY´wä8âYæ´wèâxâY¬tä`âYâ8âY¬tèâ âYôtäˆâYâ`âYôtèæˆuä°âYâˆâYˆuð\›äØâY¸ÜYâœãY€qåðâYä€qá,ãYááÿåäHãYïDádãYø€ãYè¼p-øØfì<äY$³ä¬ãYä$³èãYááÿåääYïDá äYÿäpìøäY0àäLäYä0àˆäYÿìä¤äYïáÀäYøÜäYè¬Kø¬KìåYàäåY XææY³ä$åYä³`åYááÿåä|åYäœBçDá˜åYèœBì´åYèœBìÐåYøìåYÿôpèYÈyäæY æYââPæYÈyè@èYèâpêÈyä æYäpæY ãá@çY˜R䀿YPæY˜R¼æYÿèäøæYäèæYäã æYì â æY ä$çYèçYì â æYðèæYêhçYÜíäPçYæÜíPUäâçY¨… äxçYâ PçY¨… PUä â¸çY8 å çYâxçY8 áœBäâàçYƒäÈçYâ  çYƒœBäâèYLë äðçYâÈçYLë èâ0èYpjäèYâðçYpjèâXèYdàä@èYâèYdàðÈyähèY æYâŒèYŒå ä€èYî,qå aUÈéYrå¬èYäráèèYÿìäéYïá éYø<éYèœBìXéYøtéYøéYèœBì¬éYÿäÔDìhêYlü äØéYälü êYäÿåä0êYïáLêYèšJøšJì„êY$ü äxêY\—LæˆìY´ä”êY êYæ â°êYæâàêY0ç èXìYèâpê0ç ä°êYåëYãáÐëY˜RäëYàêY˜RLëYÿèäˆëYäxëYäã°êYì â°êY ä´ëYè¤ëYì â°êYðxëYêøëYdäàëYædèâ ìYÄ+äìYâ àëYÄ+PNäâHìY,é ä0ìYâ ìY,é PNäâpìY näXìYâ 0ìY nPNì0ç ä€ìY°êYâ´ìY<æ ä˜ìY¤ìYæ â`‹OæÌìYæ äÄìYtyXâ4íYüû äÜìYäüû íYááÿå÷DáPíYÈû äDíY8UælíY”àä`íYˆ¸TæˆôY\zä|íY„íYââ´íY\zèXôYèâpê\zä„íYäÔíY ãá¤îY˜RääíY´íY˜R îYÿèä\îYäLîYäã„íYì â„íY äˆîYèxîYì â„íYðLîYê€óYD ä´îYäD ÌîYä ââüîYÐ7èhóYèâpæïYÐ7äÌîYäòYãá´íY¬yä<ïYä ñYãáâïY¬yèlïYèpæâ ñYÌ „ïYèâ´ïYŒWèððYèâpæïYŒWä„ïYäÔïYãá¤ðY˜RääïY´ïY˜R ðYÿèä\ðYäLðYäã„ïYì â„ïY äˆðYèxðYì â„ïYðLðYêàðY4® ä´ðYæ4® ÌðYäâ êèìÛäððYâ ´ðYìÛœBèæD ÌîYèðñY˜Rä0ñYïY˜RlñYÿèä¨ñYä˜ñYäã<ïYì â<ïY äÔñYèÄñYì â<ïYð˜ñYëòYD äñYäÌ ä lïYàòY˜Rä òYüîY˜R\òYÿèä˜òYäˆòYäãÌîYì âÌîY äÄòYè´òYì âÌîYðˆòYêóY„} äðòYæ„} œBä â0óYl‡åóYâðòYl‡áœBäâXóY¬žä@óYâóY¬žèæÜê ähóYâ@óYÜê ì¨óYÌ äóYâ ´îYÌ „ïYä âÐóY<ä¸óYâóY<è âøóYá¼äàóYâ¸óYá¼è â ôY(½äôYâàóY(½èâHôYdPä0ôYâôYdPèâpôYø#äXôYâ 0ôYø#œBì\zä€ôY„íYæp³ä˜ôYäp³ÔôYÿìäðôYä ˜çí ˜ì(õYè äõY(ÂKçöYDä8õYäDtõYÿìäõYïá¬õYèlÍJìÈõYèôIìäõYè°"JøLbìœúYý äöYäý LöYááÿåähöYïDí„öYê â”öYæ4âÄöY ãèlúYèâ`ê ãä”öYääöYãá´÷Y˜RäôöYÄöY˜R0÷Yÿèäl÷Yä\÷Yäã”öYì â”öY ä˜÷Yèˆ÷Yì â”öYð\÷YêÜ÷Y̨äÄ÷Yą̈|Jâ0âøY(bäì÷Yâ Ä÷Y(bì…Kä0â,øYL¿äøYâ ì÷YL¿8)Mä,âTøYT‚ ä<øYøYT‚ |Jâ(â|øY, ädøYâ <øY, ì…Kä(â¤øYlaäŒøYâ døYladYYä$âÌøYHNå ´øYŒøYHNá ZYä âôøYРäÜøYâ ´øYРH}Wâ âùYXäùYÜøYX|JââDùY$•å,ùYâùY$•éâlùYÜ äTùYâ,ùYÜ èâ”ùYlâä|ùYâ TùYlâ|Jââ¼ùY<Òä¤ùY|ùY<Ò|JââäùY$/äÌùYâ ¤ùY$/Ü9Näâ úYœ>äôùYâ ÌùYœ>ÌýQä â4úY täúYâ ôùY tÈBäâ\úYls äDúYâúYls èâ„úYà‹ älúYâDúYà‹ ð ãä”úY”öYâ¸úYˆáä¬úYL YæXûYT´äÈúYäT´ûYááÿåä ûYïDá<ûYèœBÿèpûY| ähûYdäRâHüYäü ä€ûYääü ¼ûYÿìäØûYïáôûYøüYè¼p-ì,üYèœBøT±PìœþYÀü äXüYdüYæ âtüYæâ¤üYPèlþYèâ@êPätüYäÄüYãá”ýY˜RäÔüY¤üY˜RýYÿèäLýYä<ýYäãtüYì âtüY äxýYèhýYì âtüYð<ýYê¼ýY˜« ä¤ýY昫 èâäýYL! äÌýYâ ¤ýYL! |Jââ þYØ^äôýYâ ÌýYØ^|Jâ â4þYÔØäþYâ ôýYÔØ|Jââ\þYhŒäDþYâþYhŒèâ„þYT älþYâDþYT ðPä”þYtüYâÿYä¬þYäèþYááÿå÷Dá¤ÿY¤ü äÿYä¤ü PÿYááÿåälÿYïDáˆÿYèÈBÿè(Zðä´ÿYäððÿYááÿåä ZïDíì¥Kðäàä8ZääàtZÿìì80Jê¼Z¬âä Z¬Zæ â¼ZæâìZüû èZèâpêüû ä¼Zä ZãáÜZ˜RäZìZ˜RXZÿèä”Zä„Zäã¼Zì â¼Z äÀZè°Zì â¼Zð„ZêZÌ=åìZæÌ=éâ¤ZÀäZâ ìZÀ,ZèæDZäÔ‹ä\Zᇠ,Zì tZøD,Zê ŒZTO,Zî 3,Zìüû ä´Z¼ZâÔZ$¡äÌZ¨xVâðZ”âääZ`xOæZ|âåZä|â<ZÿìäXZïátZøZè|Jì¬ZøÈZèTDìäZùZèLbøLbìLZXâä,ZäXâhZááÿåä„ZïDáèZè Zì â°ZæäÌZäœBçÿéZì âZæä0ZïíœBìZ8âä\Zä8â˜Zááÿåä´Zä„gSåDáÐZøìZèTDÿæ ZŒ´äZ¨zUâLZ8ý ä0Z<Zæ âLZæâ|Z$èZèâ@ê$äLZäœZãálZ˜Rä¬Z|Z˜RèZÿèä$ZäZäãLZì âLZ äPZè@Zì âLZðZê”ZÀ ä|ZæÀ èâ¼ZÄ¿ä¤Zâ |ZÄ¿ ˜äâäZà? äÌZâ¤Zà? è â ZágäôZâÌZágð$Käâ4Zd~ äZâôZd~ ð$äDZLZâhZäáä\ZœBæl ZÜråxZ„Zæ â”ZæâÄZ(«è< Zèâpê(«ä”ZääZãá´ Z˜RäôZÄZ˜R0 Zÿèäl Zä\ Zäã”Zì â”Z ä˜ Zèˆ Zì â”Zð\ ZêÜ ZpÆäÄ ZæpÆè â ZP… äì ZâÄ ZP… èâ, Z!ä Zâì Z!èâT Z¨ ä< Zâ  Z¨  ˜ì(«äd Z”ZâÔ Z´æ ä| Zä´æ ¸ Zááÿåì¬@MçD唿 ää Zð Zæ âàWTæ¼ Zˆç ä Zäˆç L Zááÿåäh ZïDá„ Zø  Zÿäà›JìÄZLþ äÌ ZäLþ  Zÿìä$ Zïá¨Zè@ Zì âP Zæâ € ZHg $Zè8Zä @áp˜ZæHg äP Zä  Zãá"ü ZôOD Z° Z€ ZôOì Zÿèä ZìãP Zø4 Zì âP ZèL Z€ ZôOˆ Zÿèä´ ZìãP ZìÐ Zè4 Zøì Zê âP Z ä¬Z˜Rä Z€ Z˜RHZÿèätZäì ZäãP ZìZè4 Zøì Zê\ZÌúå ¼Z€ ZÌúáøZâÿèä$ZìááP Zê@Zè4 ZøØfì ZtGälZ€ ZtG¨ZâÿèäÔZìááP Z êðZè4 Zø›ðHg äZP ZæˆbìHZP Zäâ†Zø\„ZÿäìãvqHkÑ´ª¹*ñëØfìœZ(ãäÔZä(ãZÿìä,ZïáHZèlÍJìdZèôIì€Zè°"JøLbì´Zpç ä¬Z¤ÕJâÄZPç äÀwXðZ\¢àZÔZ` LêèZ` LâtZ,¢åZä,¢<ZÿìäXZïíÌHNìÀZè{ä„Zæè{´OâÿåÐZ¢ä ä=TìZãäàZ¼p-æZüâZüZˆbêZˆbâ0Z0ç ä(Z°êYâ@Zäâä @€T¨ZСäPZäСŒZááÿå÷DátZ¨¡ä¸ZÄZæ âôZlèDZèâpêläÄZäZãáäZ˜Rä$ZôZ˜R`ZÿèäœZäŒZäãÄZì âÄZ äÈZè¸Zì âÄZðŒZê ZPÉäôZæPÉèâ4ZhìäZâôZhìèâ\ZìâäDZâZìâðlälZÄZâZ¸ý ä„Zä¸ý ÀZááÿåäÜZïDáøZÿäœBìðZˆä$Z0Zæ â@ZæâpZ@ûè˜Zèâpê@ûä@ZäZãá`Z˜Rä ZpZ˜RÜZÿèäZäZäã@Zì â@Z äDZè4Zì â@ZðZêˆZxÉäpZæxÉÈBäâØZ,u ä˜Zâ pZ,u °Zè âÀZæ0âðZˆiè¨ZèâpêˆiäÀZäZãáàZ˜Rä ZðZ˜R\Zÿèä˜ZäˆZäãÀZì âÀZ äÄZè´Zì âÀZðˆZêZ äðZæ è,â0ZÐÊäZâ ðZÐÊ ˜â(âXZxËä@Zâ ZxË ˜â$â€ZÔ%ähZâ@ZÔ%è â¨Z`0åZâhZ`0éâÐZÐ0å¸ZâZÐ0éâøZàäàZâ¸Zàèâ ZLäZâàZLèâHZ tä0Zâ Z tÈBä âpZœÑäXZâ 0ZœÑ¬@Mäâ˜Zœ>ä€Zâ XZœ>ÌýQäâÀZÄTä¨Zâ €ZÄTœBìˆiäÐZÀZæ@ûäèZ@ZâZç åZ Zæ â„YOæ8Z$så,ZÌýQê|ý äHZä|ý „Zÿìä Zä|Jçí|Jì\Z<è äÌZä<è Zááÿåä$ZïDá@Zè„ëIø ìIìlZè älZäè ¨ZÿìäÄZïáàZèœBìüZøZèÈBì4Zè|JìPZè|JÿèˆZ0ä|ZÈRæÜZˆµä˜Z¤ZæäÀZïíœBì˜Z\såìZä\sá(ZááÿåäDZïDá`Zè¬@Mì|ZÿôZ4|ä¨Zä4|äZááÿååZä,„KçDíì¥KìÐ Zôä,Z4Zâ âdZôè  Zèâpêôä4Zä„ZãáT Z˜Rä”ZdZ˜RÐZÿèä ZäüZäã4Zì â4Z ä8 Zè( Zì â4ZðüZê Zøpäd Zæøp| Zäâ â°˜Pää¸ ZÍä  Zâd ZÍðôäÈ Z4Zâì Zhµäà ZœBꔢäü Zè¾Uæ$!Z8}ä!ZœBæ4!ZHtå ,IVD"Z4ääD!Zä4ä€!Zááÿåäœ!ZïDá¸!ZèœBìÔ!Zøð!ZèTDê "Zø("ZÿäLTê`"ZàãäT"Z0{Sæ|"Zääp"Zð2Væ8#Z,tåŒ"Zä,táÈ"Zááÿåää"ZïDâ#ZèßPì#Zè|JÿæT#Zá¶äH#ZÈBêäµäd#Z80Jæ<&ZÜtå€#ZŒ#Zæ âœ#Zæ$âÌ#Zˆ¾è &Zèâpꈾäœ#Zäì#Z ãá¼$Z˜Räü#ZÌ#Z˜R8$Zÿèät$Zäd$Zäãœ#Zì âœ#Z ä $Zè$Zì âœ#Zðd$Zêä$ZÔ®äÌ$ZæÔ® ˜ä â %Z„õ äô$Zâ Ì$Z„õ ˜äâ4%ZÀ= ä%Zâ ô$ZÀ= ˜äâ\%Z÷äD%Zâ%Z÷èâ„%Z81äl%Zâ D%Z81 ˜äâ¬%Zçå”%Zâl%Zçá ˜ä âÔ%Z˜õä¼%Zâ”%Z˜õèâü%Z„Mää%Zâ¼%Z„Mèâ$&Z°ü ä &Zâä%Z°ü ðˆ¾ä4&Zœ#Zâø&ZŒäL&Z䌈&Zááÿåä¤&ZïDáÀ&ZèhEìÜ&ZÿäX-ì'Z¼tå |;ST'Z¤}ä'Zæ¤}œBäÿå,(Z¤¶äd'Z䤶 'Zÿìä¼'ZïáØ'ZèlÍJìô'ZèôIì(Zè°"JøLbìD(Zåä<(Zè]Qâä(Zìè äT(Zäìè (Zÿìä¬(ZïáÈ(ZèôIKÿèp*Zˆ}äô(Zá)Zæ â)Zæâ@)Zìþè@*Zèâpêìþä)Zä`)Zãá0*Z˜Räp)Z@)Z˜R¬)Zÿèäè)ZäØ)Zäã)Zì â)Z ä*Zè*Zì â)ZðØ)ZêX*Z cå@*Zæ cá ˜ììþäh*Z)Zâˆ*Züää€*Z4ÌWâ +Ztä˜*ZätÔ*Zááÿåäð*ZïDíœBì(+ZÌää+Zë,Z|tå8+Zä|tát+Zááÿåä+ZïDá¬+Zè¬@MìÈ+Zøä+Zÿä<¼Sê,,Z„¶ä,Z,Zæ â äPæH,Zdtå<,Z|£Kæè,Zdÿ äX,Zädÿ ”,Zááÿåä°,ZïDáÌ,ZèœBø ˜êˆ-Z|ääø,Zä|ä4-ZááÿåäP-ZïDál-ZèœBÿì8ÿ ä˜-Z¤-Zæ â´-ZæHâä-Z¿è 1Zèâ`ê¿ä´-Zä.ZãáÔ.Z˜Rä.Zä-Z˜RP.ZÿèäŒ.Zä|.Zäã´-Zì â´-Z ä¸.Zè¨.Zì â´-Zð|.Zê/ZTŽää.ZæTŽü.ZäDâ êä8/Z4Æ ä /Zâä.Z4Æ è<â`/Z°<äH/Zâ /Z°<è:âˆ/ZDº äp/ZâH/ZDº è8â°/Z¬ä˜/Zâp/Z¬è4âØ/ZᜠäÀ/Zâ˜/Zᜠè0ã0Zˆp äè/ZâÀ/Zˆp è,â(0ZD1 ä0Zâè/ZD1 è(âP0ZÀ¹ä80Zâ0ZÀ¹è âx0ZÈ ä`0Zâ80ZÈ èâ 0Zp1äˆ0Zâ`0Zp1èâÈ0Z°Äå°0Zâˆ0Z°Äéâð0ZÀ¤äØ0Zâ°0ZÀ¤èâ1ZŒ!å1ZâØ0ZŒ!è â@1ZÈóä(1Zã1ZÈóè âh1Zd5äP1Zâ(1Zd5èâ1Z0äx1ZâP1Z0èæ@yä 1Zâx1Z@yìX2ZìäÈ1Zäì2Zÿìä 2Zïá<2ZèègVÿè03Z|é äh2Zä|é ¤2ZÿìäÀ2ZïáÜ2ZèlÍJìø2ZèôIì3Zè°"JøLbì´3Zlåä@3Zälå|3Zÿìä˜3ZïíÌHNìp4Z8·äÄ3Zä8·á4Zááÿåä4ZïDá84ZøT4Zÿô,5Zô£ä€4Zäô£¼4ZááÿåäØ4ZïDáô4Zè|Jê5ZèÈBøÇYð@é ä<5Zä@é x5Zááÿåä”5ZïDá°5Zè ˜öLÊYìp7Zà~äÜ5Zè5Zæâ6Zp~ è@7Zèâpêp~ äè5Zä86Zãá7Z˜RäH6Z6Z˜R„6ZÿèäÀ6Zä°6Zäãè5Zì âè5Z äì6ZèÜ6Zì âè5Zð°6Zê07Z¤:ä7Zæ¤:èâX7ZÀ³ä@7Zâ7ZÀ³ðp~ äh7Zè5Zâ€7Z ¥ä 4JOX8Z¼~ä7Zä¼~Ì7Zÿìäè7Zïá8ZèlÍJì 8ZèôIì<8Zè°"JøLbì9Záçäh8Zåç¤8ZÿìäÀ8ZïáÜ8ZèèƒNìø8ZÿäFKì¸9Zà¤ä$9Z09Zæ â@9ZææX9Zää p9Z8R@9Zì ˆ9Z¸@9Zê  9Z„p@9ZîÜh@9Zè:Z°äÈ9Zä°:Zÿìä :Zïá<:Zè̬OìX:Zèìt:ZÿäLbìBZÌæä :ZäÌæÜ:Zÿìäø:ZïátBZè;Zì â$;Zæâ T;ZL H>ZèBZä @ápdBZæL ä$;Zät;Zãá"ÐZ,È ä=ZT;Z,È Ì=Zâÿèäø=Zìáá$;Zê>ZèZ$;Zæ\>Zìâ Œ>Zˆl€AZè”AZä @ápôAZæˆlä\>Zä¬>Zãá"@ZôOP?Z¼>ZŒ>ZôOø>Zÿèä$?Zìã\>Zø@?Zì â\>ZèX?ZŒ>ZôO”?ZÿèäÀ?Zìã\>ZìÜ?Zè@?Zøø?Zê â\>Z ä¸@Z˜Rä@ZŒ>Z˜RT@Zÿèä€@Zäø?Zäã\>Zìœ@Zè@?Zøø?ZêhAZü= äÈ@ZŒ>Zü= AZâÿèä0AZìáá\>Z êLAZè@?ZøØfðˆläxAZ\>Zæˆbì¤AZ\>ZäââŒ>ZT·á àAZÿäìâ1æÀåFBZ$;ZäââT;ZLòPBZÿäìâ2æÀåFëØfì0CZáê ä BZåê ÜBZÿìäøBZïáCZèœBø ˜ì\CZ”ä@CZLCZæ â4ÌWæ°JZäé älCZxCZæ âˆCZæHâ¸CZ¬Éè˜JZèâpê¬ÉäˆCZäØCZãá¨DZ˜RäèCZ¸CZ˜R$DZÿèä`DZäPDZäãˆCZì âˆCZ äŒDZè|DZì âˆCZðPDZêÐDZv ä¸DZæv èDâøDZìäàDZâ¸DZìè@â EZl›åEZâàDZl›é<âHEZ̶ä0EZâ EZ̶ ˜ä8âpEZpäXEZâ0EZpè4â˜EZl}ä€EZâ XEZl} ˜ä0âÀEZœ› ä¨EZâ€EZœ› è,âèEZ¼ÒäÐEZâ¨EZ¼Òè(âFZ¨‰ äøEZâ ÐEZ¨‰ œBä$â8FZ”nä FZâ øEZ”nDNä â˜IZ´ˆäHFZâ FZ´ˆ`FZäâ âpFZæ4â FZlªè€IZèâpêlªäpFZäÀFZãáGZ˜RäÐFZ FZ˜R GZÿèäHGZä8GZäãpFZì âpFZ ätGZèdGZì âpFZð8GZê¸GZœ› ä GZ望 è0âàGZ¼ÒäÈGZâ GZ¼Òè,âHZ¨‰ äðGZâ ÈGZ¨‰ œBä(â0HZ<³äHZâ ðGZ<³XšLä$âXHZ”nä@HZâ HZ”nDNä â€HZ¤ ähHZâ@HZ¤ á›Läâ¨HZ¥äHZâhHZ¥èâÐHZÈDä¸HZâ HZÈD ˜äâøHZØ äàHZâ¸HZØ èâ IZd%äIZâ àHZd%PÏIâ âHIZ\xå0IZâIZ\xéâpIZ|zäXIZâ 0IZ|z ˜äæ< ä€IZâXIZ< ìÀIZ$/ä¨IZâ HFZ$/Ü9NäâèIZ,¨äÐIZâ ¨IZ,¨ ˜ââJZ8ª äøIZâ ÐIZ8ª ˜ââ8JZls ä JZâøIZls è â`JZXåäHJZâ JZXåÈBäâˆJZ _ äpJZâHJZ _ èæ< ä˜JZâpJZ< ìÌJZ<äÀJZ\YælKZ¨æäÜJZ䍿KZááÿåä4KZïDáPKZèœBÿæ LZä|KZä¸KZááÿåäÔKZä„gSåDáðKZèœBø„gSê(LZ, äLZ¨NæDLZÄ·ä8LZXmYædMZàuåTLZäàuáLZááÿåä¬LZïDáÈLZèœBìäLZùMZè\¯PìMZø8MZèPÏIøTMZì âØfæMZ ätMZ€MZæ âðRXæ0NZÈuå MZäÈuáÜMZááÿåäøMZïDáNZÿôLNZ´é ä@NZ,ÙOæhNZdæä\NZœBæ0PZá äxNZ€NZâ â°NZá éPZèâpë ä€NZäÐNZãá OZ˜RäàNZ°NZ˜ROZÿèäXOZäHOZäã€NZì â€NZ ä„OZètOZì â€NZðHOZêÈOZŒcä°OZæŒcèâðOZäbäØOZâ°OZäbèâPZdåPZâØOZdñ ä(PZ€NZâLPZè ä@PZžTæÐPZæä\PZäæ˜PZááÿåä´PZïDíPUì¨QZàåäàPZäàåQZááÿåä8QZïDáTQZè|JêpQZè|JêŒQZè|Jö|Jî¼åä¸QZTíXæRZØäÔQZæØ´OâÿåÜRZœê ä RZäœê \RZÿìäxRZïá”RZèLbì°RZÿäÌRZì â¬@Mæ´SZ°äìRZä°(SZÿìäDSZïá`SZèàMì|SZø˜SZè@åMøLbìÄSZ¬ ä °ÏYXZh¸äÔSZäh¸TZÿìä,TZïâXZèHTZì âXTZæâ ˆTZà|WZèWZä @ápðWZæàäXTZä¨TZãá"VZôOLUZ¸TZˆTZôOôTZÿèä UZìãXTZøVæàoZÈ¥äPoZäÈ¥ŒoZááÿåä¨oZïDáÄoZè ˜ö ˜ì€pZ„èäðoZä„è,pZááÿåäHpZïDádpZèì¥Kø\ÿOðTwåpZ@’OæXqZDéä¬pZäDéèpZäÿåäqZïá qZèšJìäÜZâ ´Zœ>ÌýQäâZLJäZâÜZLJèâDZŒDä,ZâZŒDè â‘Z”ó äTZâ ,Z”ó lZäâ â|Zæä˜Zïá´ZèÈBìÐZøìZÿô0‘ZÔ%ä‘ZâTZÔ%èâX‘Zìâä@‘Zâ‘ZìâðÌŸäh‘Z¼ZâP“Zè¦ä€‘ZŒ‘Zæâ¼‘Z´Dè “Zèâpê´D䌑ZäÜ‘ZãᬒZ˜Räì‘Z¼‘Z˜R(’Zÿèäd’ZäT’Zä㌑Zì ⌑Z ä’Z耒Zì ⌑ZðT’Zêè’ZD„ ä¼’ZæD„ Ô’Zä â êä“ZdPäø’Zâ¼’ZdPèâ8“Z̉ ä “Zâ ø’Z̉ ,ÇJì´DäH“ZŒ‘Zæ8 ä`“Z”ÚUæD”ZX‚ä|“ZäX‚¸“ZÿìäÔ“Zïáð“ZèlÍJì ”ZèôIì(”Zè°"JøLbìT”Z yå ä%Qp”Z<‚äd”ZÑTêí 䀔Zäí ¼”Zááÿå䨔ZïDí¸3Mê•Z¤ ä•ZÉTæ°•Züí ä •Zäüí \•Zÿìäx•ZïᔕZèÌãNÿè4–Z˜í äÀ•Zä˜í ü•Zÿìä–ZïíÌHNì —ZÐäD–ZäЀ–Zÿì䜖ZïḖZèlÍJìÔ–ZèôIìð–Zè°"JøLbìX—Zëä—Zæë´Oâÿå0˜Z¼äh—Z伤—ZÿìäÀ—ZïáÜ—Zè\7Kìø—Zø˜Zèˆå«ZâèªZ>ñ° ä8«Z ¨Zâ\«ZdzåP«Zˆ_Yæü«ZÀ¨äl«ZäÀ¨¨«ZááÿåäÄ«ZïDáà«ZèœBø ˜ê€¬Z¤¨ä ¬Z䤨H¬Zÿìäd¬ZþHxLðøä¬Zäø̬Zÿìäè¬Zä ˜çá­Zè ˜ÿè0­Zàƒä üU@­Z¸{å ŒwN®ZȽäP­ZäȽŒ­Zÿì䨭ZïáÄ­Zè˜XQìà­ZèdKìü­Zÿôð®Ztä(®Zätd®Zÿì䀮ZïᜮZèlÍJ츮ZèôIìÔ®Zè°"JøLbìt¯Z¬½å¯Z䬽<¯ZááÿåäX¯ZïDí|Jìd²ZHï 䄯ZäHï À¯ZááÿåäܯZïDáø¯ZèœBì°ZèèQLê0°Zè,ZìL°ZèœBí²Zèh°Zì âx°Zæâ¨°Zp™èбZèâpêp™äx°ZäȰZãᘱZ˜RäذZ¨°Z˜R±ZÿèäP±Zä@±Zäãx°Zì âx°Z ä|±Zèl±Zì âx°Zð@±ZêÀ±Z@S 䨱Zæ@S lZäâè±ZìâäбZ⨱Zìâðp™äø±Zx°Zâ²Zø8²ZèœBøT²Zê â„gTæ|²Z€ìät²Z(&Jâø´Zˆ©äŒ²Z˜²Zæ ⨲ZæâزZô›èÈ´Zèâpêô›ä¨²Zäø²Z ãáȳZ˜Rä³ZزZ˜RD³Zÿè䀳Zäp³Zä㨲Zì ⨲Z 䬳Z蜳Zì ⨲Zðp³Zêð³ZLxäسZæLxèâ´Zäœ×Zâ t×Zœ>ÌýQäâÜ×ZLJäÄ×Zâœ×ZLJèâØZŒDäì×ZâÄ×ZŒDè â,ØZ”ó äØZâ ì×Z”ó lZäâTØZÔ%ä<ØZâØZÔ%èâ|ØZìâädØZâ<ØZìâðè«äŒØZ|ÕZâ°ØZ†ä¤ØZ°§TæTÚZðªäÀØZÌØZæâüØZTøè$ÚZèâpêTøäÌØZäÙZãáìÙZ˜Rä,ÙZüØZ˜RhÙZÿèä¤ÙZä”ÙZäãÌØZì âÌØZ äÐÙZèÀÙZì âÌØZð”ÙZêÚZ8åäüÙZæ8åä6Mäâ<ÚZ̉ ä$ÚZâ üÙZ̉ ,ÇJìTøäLÚZÌØZâ€ÚZ¼ ädÚZpÚZæ âìUæœÚZè…äÚZˆŒPêÈíä¬ÚZÌkÈíÐ<ð”<öˆÛZ´«äøÚZä´«4ÛZááÿåäPÛZïDálÛZÿäLbì`ÜZœ‡ä˜ÛZ䜇ÔÛZÿìäðÛZïá ÜZèlÍJì(ÜZèôIìDÜZè°"JøLbì8ÝZôÀäpÜZäôÀ¬ÜZÿìäÈÜZïáäÜZèlÍJíÝZèôIìÝZè°"JøLbìTÝZÔÀäHÝZlWMæpÝZœîädÝZêÞZœ«ä€ÝZ䜫¼ÝZááÿåäØÝZïDáôÝZèPÏIø)Jì”ÞZ¬Àä ÞZä¬À\ÞZááÿåäxÞZïDí¸3MìPßZô}å¤ÞZäô}áàÞZááÿåäüÞZïDáßZèÈBì4ßZèìXMøHKì¨ [`[ä,ââ[üPä [ÿä,ìâ%åÀåFëLBKìü [ôïä4 [äôïp [ÿìäŒ [ïᨠ[èè‹KìÄ [øà [è”}KøLbì [dÃä ´Rè [À!ä [( [æ â8 [æ âh [hñè¸ [èâpêhñä8 [äˆ [ãáX [˜Rä˜ [h [˜RÔ [ÿèä [å [äã8 [ì â8 [ ä< [è, [ì â8 [ñ [ê€ [œäh [æœè⨠[ ä [â h [ |JäâÐ [ ;ä¸ [â [ ;ðhñäà [8 [â([Üïäø [á [ââ0 [Üïèø[èâpêÜïå [äP [ãá [˜Rä` [0 [˜Rœ [ÿèäØ [äÈ [ää [ì ã [ ä[èô [ì ã [ðÈ [êH[\´ ä0[æ\´ èâp[(åX[â0[(á ˜äâ˜[€eä€[â X[€e ˜ä âÀ[øãä¨[â€[øãèâè[Ä-äÐ[â¨[Ä-èâ[LÊäø[âÐ[LÊðÜïä [á [âD[¨!ä8[¤¦LæÈ[$ äT[ä$ [ááÿåä¬[ïDíÈBð<å Ø[Ìk<áô<ð¸<öì[Üô ä$[äÜô `[ÿìä|[ïá˜[èlÍJì´[èôIìÐ[è°"JøLbìÄ[Ìðäü[äÌð8[ÿìäT[ïáp[èlÍJìŒ[èôIì¨[è°"JøLbìd[t"äÔ[ät"[ááÿåä,[ïDáH[è|Pö|Pêø[¼ðät[€[ææ˜[ä ä °[ìÜ€[ê È[ì_€[ê à[L€€[[è[œðä[êZâ,[`"ä [ê([dðä<[H[æ âX[æâˆ[Ø] è°[èâpêØ] äX[ä¨[ãáx[˜Rä¸[ˆ[˜Rô[ÿèä0[ä [äãX[ì âX[ ä\[èL[ì âX[ð [ê [à*åˆ[æà*éâ[@óä°[â ˆ[@óÈ[è âØ[æäô[þ ˜ðØ] ä [X[æØå8[äØát[ÿìä[ïí ˜êÈ[tÄä¼[¬™Oæ [,ŠäØ[ä,Š[ÿìä0[ïáL[èlÍJìh[èôIì„[è°"JøLbìx[Ü"ä°[äÜ"ì[ÿìä[ïá$[èlÍJì@[èôIì\[è°"JøLbìÄ[¼õ äˆ[æ¼õ ´Oâÿåœ[ÄäÔ[äÄ[ÿìä,[ïáH[èlÍJìd[èôIì€[è°"JøLbìÀ[Ä"ä¬[¸[æ âÈ[æâ ø[¤<[èP[ä @áp°[æ¤äÈ[ä[ãá"t[ôO¼[([ø[ôOd[ÿèä[ìãÈ[ø¬[ì âÈ[èÄ[ø[ôOá[ÿèä,[ìãÈ[ìH[è¬[ød[ê âÈ[ ä$[˜Rä„[ø[˜RÀ[ÿèäì[äd[äãÈ[ì[è¬[ød[î¤ä4[È[æ—Sì`[È[ä,ââø[¨uœ[ÿä,ìâÏåÀåFØñäÐ[8 [âð[,®äè[”EOâ[ø‰å[[ââ8[ø‰èØ[èâ@êø‰ä[äX[ãá([˜Räh[8[˜R¤[ÿèäà[äÐ[äã[ì â[ ä [èü[ì â[ðÐ[êP[ls ä8[æls èâx[á»å`[â8[á»é â [„”äˆ[â`[„”èâÈ[àÞä°[âˆ[àÞèâð[èSäØ[â°[èSðø‰å[[â [0ñä[¤{Nâ0[ì ä0[äì l[ááÿåäˆ[ïDá¤[èßPìÀ[è ˜êÜ[èLbìø[èLbì[èTDøLbì$ [à‰ä@[äà‰|[ááÿåä˜[ïDá´[èÈBìÐ[èÈBìì[ø [ÿô@ [ñä4 [¨Xæ4![œõ äP [äœõ Œ [ááÿåä¨ [ïDáÄ [è|Jêà [è|Jêü [ø![è|JøÊOîððäD![äðð€![ÿìäœ![ä ˜ê¸![è ˜ö ˜êð![´ñää![`FZæ"[À®å"[ "[æ âdäRæ€%[t ä,"[8"[æâh"[p® èP%[èâpêp® ä8"[äˆ"[ãáX#[˜Rä˜"[h"[˜RÔ"[ÿèä#[å#[äã8"[ì â8"[ ä<#[è,#[ì â8"[ñ#[ê@%[ âäh#[æ â€#[äâ â#[æ âÀ#[@’ è%[èâpê@’ ä#[äà#[ãá°$[˜Räð#[À#[˜R,$[ÿèäh$[äX$[äã#[ì â#[ ä”$[è„$[ì â#[ðX$[êØ$[(¬ äÀ$[æ(¬ LSäã%[ìßäè$[â À$[ìßÐVLä â(%[èTä%[â è$[èTÌŠZì@’ ä8%[#[âh%[LäP%[âh#[Lðp® äx%[8"[â&[¨®ä%[䨮Ì%[ááÿåäè%[ïDá&[ø &[ø<&[øX&[øt&[èTDøLbì'[ ñä &[ä ñÜ&[ááÿåäø&[ïDíì¥Kì,'[Øõ ä$'[PqOâô([H#ä<'[H'[æ âX'[æâˆ'[YèÄ([èâ`êYäX'[ä¨'[ãáx([˜Rä¸'[ˆ'[˜Rô'[ÿèä0([ä ([äãX'[ì âX'[ ä\([èL([ì âX'[ð ([ê´([; äˆ([æ;  ([äâ êäÜ([ÄäÄ([âˆ([ÄðYäì([X'[æ8#ä )[|Jä”)[( ä )[ä( \)[ÿìäx)[ïíôIKì¤)[ð ä “Q$+[l‚å´)[äl‚áð)[ÿìä *[ïá(*[øD*[ø`*[èTDì|*[ø˜*[èTDì´*[øÐ*[øì*[èœBì+[ÿäœBìü+[¬Šä4+[䬊p+[ááÿåäŒ+[ïDá¨+[èðRXìÄ+[øà+[è¼p-ÿèÔ,[4ö ä ,[ä4ö H,[ááÿåäd,[ïDá€,[èßPìœ,[ø¸,[è|Jÿè-[4‚åä,[ä4‚á -[ááÿåä<-[ïDáX-[èÈBìt-[ÿô¼-[‚å -[¬-[æ âl÷QêìåÌ-[äìá.[ááÿåä$.[ïDá@.[ÿôü.[(ƒål.[ä(ƒá¨.[ááÿåäÄ.[ïDáà.[è„ëIÿèÔ/[´òä /[ä´òH/[ÿìäd/[ïá€/[èlÍJìœ/[èôIì¸/[è°"JøLbì¬0[èö ää/[äèö 0[ÿìä<0[ïáX0[èlÍJìt0[èôIì0[è°"JøLbì„1[<¯ä¼0[ä<¯ø0[ÿìä1[ïá01[èlÍJìL1[èôIìh1[è°"JøLbì 1[ˆ ä”1[`„Uæ\2[Œ‹ä°1[䌋ì1[äÿåä2[ïá$2[ø@2[è ˜ö ˜ê¨2[Ìö äl2[æ Ìö |âRáÿåä3[l‹ä¸2[äl‹ô2[ááÿåä3[ïDá,3[øH3[ød3[èœBì€3[è˜Nìœ3[øÈ3[è¸3[ì âèŒUò@JTìô3[¨ö ä hxMx4[d ä4[äd @4[ááÿåä\4[ïDíØfìP5[ÜÅäˆ4[äÜÅÄ4[ááÿåäà4[ïDáü4[è¼p-ì5[ø45[èœBøŒÇZì 6[ÈÅä`5[äÈÅœ5[ááÿåä¸5[ïDáÔ5[è$¡Pìð5[ÿôÈ6[Ø#ä6[äØ#X6[ááÿåät6[ïDá6[ø¬6[èxTÿèL7[,¯äØ6[ä,¯7[ááÿåä07[äì¥KçDíÈBì<9[0‹ä\7[d7[âá”7[0‹è 9[èâpê0‹äd7[ä´7[ãá„8[˜RäÄ7[”7[˜Rá8[ÿèä<8[ä,8[äãd7[ì âd7[ äh8[èX8[ì âd7[ð,8[êÀ8[ô§ä”8[æô§¬8[äÜâ @ê äü8[€oäÐ8[â ”8[€oè8[ä\â €ê@ä$9[$›ä 9[â Ð8[$›TNì0‹ä49[d7[âX9[”ö äL9[¤aZæp9[L äh9[ ÇYâ;[Tòä€9[Œ9[æâ¼9[pú èä:[èâ`êpú äŒ9[äÜ9[ãá¬:[˜Räì9[¼9[˜R(:[ÿèäd:[äT:[äãŒ9[ì âŒ9[ ä:[è€:[ì âŒ9[ðT:[êÔ:[ä¼:[æèâü:[xdää:[â¼:[xdðpú ä ;[Œ9[â0;[ˆÅä$;[ ˜ê¨#ä@;[ä¨#|;[ÿìä˜;[ä ˜çí ˜ìŒ<[ äÄ;[ä á<[ÿìä<[ïá8<[èlÍJìT<[èôIìp<[è°"JøLbì¨<[XÆäœ<[UJæœ=[¤¯ä¸<[䤯ô<[ÿìä=[ïá,=[è¤_MìH=[èTìd=[èTDê€=[ÿäLbìÈ>[p$ä¬=[äp$è=[ÿìä>[ïá >[èðJì<>[è|JêX>[øt>[èTDì>[ø¬>[ÿäÓIì ?[`ƒåØ>[ä`ƒá?[ÿìä0?[ïáL?[èlÍJìh?[èôIì„?[è°"JøLbì¸?[üòä°?[htRâ|A[ äÈ?[Ô?[æ âä?[æâ@[„<èLA[èâpê„<ää?[ä4@[ãáA[˜RäD@[@[˜R€@[ÿèä¼@[ä¬@[äãä?[ì âä?[ äè@[èØ@[ì âä?[ð¬@[êæa[âØ`[>ñ ä(a[^[âÐa[œ°ä@a[䜰|a[ááÿåä˜a[ïDá´a[èœBø|Jî´%äàa[ä´%b[ÿìä8b[ïí ˜êôb[Žädb[䎠b[ÿìä¼b[ïáØb[èÄûKø8oì°c[ä±äc[ää±@c[ÿìä\c[ïáxc[è|øOì”c[ÿä\ÿOìˆd[àäÀc[äàüc[ÿìäd[ïá4d[è]ìPd[øld[è NøLbì¤d[ø ä˜d[´£Yæ´d[ä ä ToPTe[À±äÄd[äÀ±áe[ááÿåäe[ïDá8e[è4íIøTDê€e[¼„åde[pe[æ ⨠Ræf[ôù äe[œe[æ â¬e[æäÈe[ïáäe[è|Jëf[è|Jÿæ8f[0Çä,f[lÕZæTf[´ äHf[pÚZælf[H&ädf[¬rLâˆf[„±ä|f[¼tLæ g[ðôä˜f[äðôÔf[ÿìäðf[þœBðh±ä ¸.JØg[²ä,g[ä²hg[äÿåä„g[ïá g[éBJì¼g[éBJùBJì°h[ Žäèg[ä Ž$h[ÿìä@h[ïá\h[èlÍJìxh[èôIì”h[è°"JøLbìPi[¤ú äÀh[ä¤ú üh[ÿìäi[ïá4i[èãLø8oìœi[˜ ä`i[æ˜ œBäÿå j[0…å¬i[ä0…áèi[ááÿåäj[ïDíTJìÜj[”&ä0j[ä”&lj[ááÿåäˆj[ïDá¤j[è4íIìÀj[èTDøTDêDk[„õäìj[ä„õ(k[ááÿå÷Dá¬k[ˆÇäTk[äˆÇk[ááÿå÷DáÈk[dŽä¼k[ô'Xæl[PŽäØk[ÌkPŽÈ©óªúÔ„å$l[äÔ„á`l[ÿìä|l[ïá˜l[è ˜öKê„m[8 äÄl[æ8 Ül[âææôl[ä$Ä ä m[Ôo Ül[ì $m[ – Ül[âè V渄[<‘䬄[@ûQêÈöäÈ„[´Væð„[’ää„[(:PæØ…[ð‡æ…[âH…[ð‡á…[èæ0…[äxóå …[ðÓ…[ê `…[¤…[ê x…[\ …[ê …[˜…[ê ¨…[ø5…[ ê À…[8\…[@îüøá…[€è”†[ćåè…[äćá$†[ÿìä@†[ïá\†[è1Nìx†[ÿä\aJì°†[¬É䤆[ˆCZæl‡[ˆÉäÀ†[äˆÉü†[ááÿåä‡[äTDçDá4‡[è4íIìP‡[è)JÿèDˆ[ä‘ä|‡[ä䑸‡[ááÿåäÔ‡[äTDçDáð‡[è4íIì ˆ[è)Jì(ˆ[èTDÿæ‰[¤‡åTˆ[䤇áˆ[ááÿå䬈[ïDáȈ[è°"Jìäˆ[ù‰[ÿä\-ì8‰[Àü ä,‰[pêM漉[` äH‰[ä` „‰[ááÿåä ‰[ïDí¼lMìÔ‰[È‘ä̉[Ì+UâŠ[„‡åä‰[ä„‡á Š[ááÿåä<Š[ïDáXŠ[øtŠ[è ˜ÿì˜)ä Š[ä˜)ÜŠ[ááÿåäøŠ[ïDá‹[èœBÿè´‹[xÊä@‹[äxÊ|‹[ááÿå䘋[ïDíœBìTŒ[ äÄ‹[ä áŒ[ááÿåäŒ[ïDá8Œ[èðJøPÏIìôŒ[à ädŒ[äà  Œ[ÿì伌[ïáØŒ[è˜ÝKøëKì¤[ Êä[ä Ê@[ÿìä\[ïáˆ[èx[ì ãÅWòœBì0[ø’ä´[À[æ âÐ[æãŽ[à1 é[èâpêà1 äÐ[ä Ž[ãáðŽ[˜Rä0Ž[á Ž[˜RlŽ[ÿè䨎[䘎[äãÐ[ì âÐ[ äÔŽ[èÄŽ[ì âÐ[ð˜Ž[ê[ cæ[æ cá ˜ìà1 ä([Ð[âL[Ø’ä@[xKæd[¼’ä\[0æWât[(øä lrPð‘[À³ä„[[æ â [æâÐ[,ÅèÀ‘[èâpê,Åä [äð[ ãáÀ[˜Rå[Ð[˜R<[ÿèäx[äh[äã [ì â [ ä¤[è”[ì â [ðh[êè[$$äÐ[æ$$èâ‘[¬ô äø[âÐ[¬ô èâ8‘[ ) ä ‘[âø[ ) èâ`‘[ äH‘[â ‘[ ˜ä ∑[õäp‘[â H‘[õ ˜äâ°‘[ls 䘑[âp‘[ls èâØ‘[ìâäÀ‘[☑[ìâð,Åäè‘[ [âÈ’[Xˆæ’[äXˆá<’[ááÿåäX’[ïDát’[èÈBì’[ø¬’[ÿôä’[d’䨒[\ÿOç“[œ³äô’[$¯VêH’ä 4ÑL°“[þ ä “[äþ \“[äÿåäx“[ïᔓ[è ‚Kö ‚KìÀ“[þ ä ŒÀLØ“[°øäГ[\|Jâ°”[Øý äè“[äØý $”[ÿìä@”[ïá\”[èlÍJìx”[èôIì””[è°"JøLb숕[„øäÀ”[䄸ü”[ÿìä•[ïá4•[èlÍJìP•[èôIìl•[è°"JøLbìÔ•[¨ 䘕[æ¨ ´Oâÿæ–[¸´ää•[ð•[æ â—Sæô–[œ“ä–[䜓L–[ááÿåäh–[ïDá„–[èœBì –[è ˜ê¼–[øØ–[ètºJøLbì°—[*ä—[ä*@—[ááÿåä\—[ïDáx—[èÈBì”—[è´…SÿèÌ—[¼ÊäÀ—[¬Zæè—[` äÜ—[”ÚUæ<š[˜Êäø—[˜[æ â˜[æ(âD˜[dû è š[èâ`êdû ä˜[äd˜[ãá4™[˜Rät˜[D˜[˜R°˜[ÿèäì˜[äܘ[äã˜[ì â˜[ ä™[è™[ì â˜[ðܘ[ê\™[@yäD™[æ@yè$â„™[ì@äl™[âD™[ì@è ⬙[Ì%ä”™[âl™[Ì%èâÔ™[ì¨ä¼™[â”™[ì¨èâü™[Ô ää™[â¼™[Ô èâ$š[øµä š[âä™[øµðdû ä4š[˜[âTš[4“äLš[0€Xâpš[ˆådš[h%Wê, 䀚[-Jâ(›[0 䘚[ä0 Ôš[ÿìäðš[ïá ›[èœBÿéœ[Œµä8›[䌵t›[ÿìä›[ïᬛ[èlÍJìÈ›[èôIìä›[è°"JøLbìœ[$ùä ”×J\œ[°þ ä œ[æ°þ ´Oâÿå4[T”älœ[äT”¨œ[ÿìäÄœ[ïáàœ[èlÍJìüœ[èôIì[è°"JøLbìÔ[œ*äD[äœ*€[ÿìäœ[ïá¸[é•UøPÏIìä[<”ä ATô[Ëä ¼@T”ž[\µäž[ä\µ@ž[ááÿåä\ž[ïDáxž[èPÏIø¬½LìŸ[ÔÊ䤞[äÔÊàž[ááÿåäüž[ïDíXòPìÔŸ[‰å(Ÿ[ä‰ádŸ[ááÿå䀟[ïDᜟ[èÈB츟[èìXMøH äHÈ[â È[´> ðä8äpÈ[PÆ[â”È[8-äˆÈ[î$ ä¤È[ä$ àÈ[ÿì÷áÔÉ[ˆüä É[äˆüHÉ[ÿìädÉ[ïá€É[èlÍJìœÉ[èôIì¸É[è°"JøLbì°Ë[|åäÉ[ìÉ[ââÊ[|é€Ë[èâpê|åìÉ[ä<Ê[ãá Ë[˜RäLÊ[Ê[˜RˆÊ[ÿèäÄÊ[ä´Ê[äãìÉ[ì âìÉ[ äðÊ[èàÊ[ì âìÉ[ð´Ê[êHË[ÈDäË[æÈD4Ë[äâ âÜ}QääpË[œ¨äXË[âË[œ¨èâ˜Ë[©å€Ë[âXË[©ñ|å¨Ë[ìÉ[âÌË[,·äÀË[¬¶WæèË[¬ äÜË[á£WçÌ[lüäøË[¨OSâôÌ[øŒåÌ[äøŒáLÌ[ááÿåähÌ[ïDá„Ì[ø Ì[ø¼Ì[è|JêØÌ[ÿä¼p-ìxÍ[ÍäÍ[äÍ@Í[ááÿåä\Í[ïDíIPìüÍ[áÍäˆÍ[åÍÄÍ[ááÿåäàÍ[ïDí ˜ê Ï[à•ä Î[äà•HÎ[ááÿåädÎ[äœBçDá€Î[èh¡KìœÎ[ø¸Î[èŒëRìÔÎ[èœBìðÎ[ÿäLbìLÒ[ð <Ò[Ï[(Ï[æâXÏ[ð è Ò[èâpêð ä(Ï[äxÏ[ ãáHÐ[˜RäˆÏ[XÏ[˜RÄÏ[ÿèåÐ[äðÏ[äã(Ï[ì â(Ï[ ä,Ð[èÐ[ì â(Ï[ððÏ[ê|Ð[TŽäXÐ[æTŽpÐ[äâæ °Ð[Ô" äŒÐ[â XÐ[Ô" ¤Ð[äâæäÐ[ÀäÀÐ[â ŒÐ[ÀØÐ[äâç Ñ[lääôÐ[ÀÐ[läèâ4Ñ[xÃäÑ[âôÐ[xÃèâ\Ñ[df äDÑ[âÑ[df è â„Ñ[0älÑ[âDÑ[0èâ¬Ñ[Yå”Ñ[âlÑ[YéâÔÑ[tùä¼Ñ[â”Ñ[tùèâüÑ[Èí ääÑ[â¼Ñ[Èí èâ$Ò[$í ä Ò[âäÑ[$í ðð ä4Ò[(Ï[æDÒ[(Ï[æØ ä =JÓ[(ŽålÒ[ä(Žá¨Ò[äÿåäÄÒ[ïáàÒ[éBJìüÒ[éBJùBJìdÓ[”.ä(Ó[æ”.´Oâÿå<Ô[| ätÓ[ä| °Ó[ÿìäÌÓ[ïáèÓ[èlÍJìÔ[èôIì Ô[è°"JøLbìÕ[øÎäLÔ[äøÎˆÔ[ÿìä¤Ô[ïáÀÔ[è8RQìÜÔ[è„øIìøÔ[èLbøØfìdÜ[ÔÎä$Õ[äÔÎ`Õ[ÿìä|Õ[ïá,Ü[è˜Õ[ì â¨Õ[æâ ØÕ[`a ¨Û[è¼Û[ä @ápÜ[æ`a ä¨Õ[äøÕ[ãá"T×[ôOœÖ[Ö[ØÕ[ôODÖ[ÿèäpÖ[ìã¨Õ[øŒÖ[ì â¨Õ[è¤Ö[ØÕ[ôOàÖ[ÿèä ×[ìã¨Õ[ì(×[èŒÖ[øD×[ê â¨Õ[ äØ[˜Räd×[ØÕ[˜R ×[ÿèäÌ×[äD×[äã¨Õ[ìè×[èŒÖ[øD×[ê´Ø[DœäØ[ØÕ[DœPØ[âÿèä|Ø[ìáá¨Õ[ ê˜Ø[èŒÖ[ø8oìdÙ[ÌLäÄØ[ØÕ[ÌLáÙ[âÿèä,Ù[ìáá¨Õ[êHÙ[èŒÖ[ø|Jê0Ú[$ÄätÙ[ØÕ[$İÙ[âÿèäÜÙ[ìáá¨Õ[êøÙ[èŒÖ[ìÚ[è|JÿæüÚ[Œ ä@Ú[ØÕ[Œ |Ú[âÿèä¨Ú[ìáá¨Õ[êÄÚ[èŒÖ[ìàÚ[è|JÿæÛ[xP ä Û[ØÕ[xP HÛ[âÿèätÛ[ìáá¨Õ[öŒÖ[ð`a ä Û[¨Õ[æwKìÌÛ[¨Õ[ä,ââØÕ[0° Ü[ÿä,ìâ åÀåFHÜ[è|JÿæÞ[ýätÜ[€Ü[æâ°Ü[8šèØÝ[èâpê8šä€Ü[äÐÜ[ãá Ý[˜RäàÜ[°Ü[˜RÝ[ÿèäXÝ[äHÝ[äã€Ü[ì â€Ü[ ä„Ý[ètÝ[ì â€Ü[ðHÝ[êÈÝ[|„ä°Ý[æ|„°Kä âðÝ[á4 äØÝ[â°Ý[á4 @ZLì8šåÞ[€Ü[â|á[¸ÎäÞ[$Þ[æ â4Þ[æ âdÞ[d¹èLá[èâpêd¹ä4Þ[ä„Þ[ãáTß[˜Rä”Þ[dÞ[˜RÐÞ[ÿèä ß[äüÞ[äã4Þ[ì â4Þ[ ä8ß[è(ß[ì â4Þ[ðüÞ[êá[ˆMädß[æˆM|ß[äâ âŒß[æ â¼ß[4èäà[èâpê4äŒß[äÜß[ãá¬à[˜Räìß[¼ß[˜R(à[ÿèädà[äTà[äãŒß[ì âŒß[ äà[è€à[ì âŒß[ðTà[êÔà[@bä¼à[æ@b°Käâüà[”Xääà[â ¼à[”X ˜ì4ä á[Œß[â<á[Ìä$á[âdß[Ìèâdá[¤ÊäLá[â $á[¤Ê ˜ìd¹ätá[4Þ[âøâ[€·äŒá[˜á[æâÈá[È6èÈâ[èâ@êÈ6ä˜á[äèá[ãá¸â[˜Räøá[Èá[˜R4â[ÿèäpâ[ä`â[äã˜á[ì â˜á[ äœâ[èŒâ[ì â˜á[ð`â[êàâ[äÈâ[æðÈ6äðâ[˜á[âÜä[< äã[ä< Dã[ÿìä`ã[ïá|ã[èLbì¤ä[è˜ã[ì â¨ã[æäÄã[ä4ìOçáàã[øüã[øä[èÜóLì4ä[è¬KìPä[è¬Kìlä[è4ìOìˆä[ÿôÀä[ÿôàå[œ äìä[äœ (å[ááÿåäDå[ïDá¨å[è`å[ì âpå[æäŒå[ïí|JìÄå[ÿô@ë[hÎäðå[øå[â(â(æ[hÎèë[èâpêhÎäøå[äHæ[ ãáç[˜RäXæ[(æ[˜R”æ[ÿèäÐæ[äÀæ[äãøå[ì âøå[ äüæ[èìæ[ì âøå[ðÀæ[ê@ç[ˆôä(ç[æˆôè$âèé[pÿ äPç[â (ç[pÿ hç[ä â âxç[æä”ç[ïí°ç[ì âÀç[æâðç[L?è¸é[èâpêL?äÀç[äè[ãáàè[˜Rä è[ðç[˜R\è[ÿèä˜è[äˆè[äãÀç[ì âÀç[ äÄè[è´è[ì âÀç[ðˆè[êé[ÿäðè[æÿð$Käâ0é[¨ºäé[âðè[¨ºèâXé[@ä@é[â é[@œBä â€é[4íähé[â@é[4íèâ¨é[S äé[âhé[S èâÐé[ìâä¸é[âé[ìâðL?äàé[Àç[âê[¬ äøé[âPç[¬ èâ8ê[ òä ê[â øé[ ò ˜ââ`ê[˜âäHê[â ê[˜âèâˆê[ ¡ äpê[â Hê[ ¡ ˜ââ°ê[|%ä˜ê[â pê[|% ˜â âØê[œ>äÀê[â ˜ê[œ>ÌýQäãë[Xåäèê[â Àê[XåÈBäâ(ë[ìâäë[âèê[ìâðhÎä8ë[øå[âøë[ˆ äPë[\ë[æ âlë[æäˆë[ïá¤ë[èÈBìÀë[øÜë[ÿôÐì[ôüäì[äôüDì[ááÿåä`ì[ïDá|ì[èì¥Kì˜ì[ø´ì[ÿôüì[ü äàì[ìì[æ âT¶Tæ€í[t ä í[ät Hí[ááÿåädí[ïDíì¥Kìî[$Îäí[ä$ÎÌí[ááÿåäèí[ïDíî[ì âàlRæ´î[h·ä$î[äh·`î[ááÿåä|î[ïDá˜î[èœBøLÊYðøÍäÄî[êüî[L/äàî[ìî[æ â<>Jæ¸ï[0 ä ï[ä0 Hï[äÿåädï[ïá€ï[èFKìœï[èè‹Kÿèð[ /äÈï[ä /ð[ÿìä ð[ïá<ð[èlÍJìXð[èôIìtð[è°"JøLbìhñ[týä ð[ätýÜð[ÿìäøð[ïáñ[èlÍJì0ñ[èôIìLñ[è°"JøLbìxñ[T¸ä DRñ[ÌÏäˆñ[°ÃVâhò[t ä ñ[ät Üñ[ááÿåäøñ[ïDáò[ø0ò[è¼p-ìLò[ÿä¼p-ì$ó[´Ïäxò[ä´Ï´ò[ááÿåäÐò[ïDáìò[èPÏIìó[èPÏIøX-ìüó[\ ä4ó[ä\ pó[ááÿåäŒó[ïDá¨ó[èXòPìÄó[øàó[ÿô€ô[hŽå ô[ähŽáHô[ááÿåädô[ïDí\»[ì<õ[€Ïäô[ä€ÏÌô[ááÿåäèô[ïDáõ[èì¥Kì õ[èLbø ˜ìXõ[$¸äLõ[\½Mê\Ïähõ[ä\Ϥõ[ÿìì ˜çáÐõ[¹ä ÜÁNŒö[È äàõ[äÈ ö[ÿìä8ö[ïáTö[è4mJìpö[èXJøø«Sì¨ö[PÐäœö[´¼Ræ<÷[Èý,÷[¸ö[Äö[æäôö[ÈýøìÈýäÄö[ä÷[ãåÈýä$÷[Äö[æ4÷[Äö[âø÷[ä—äL÷[ää—ˆ÷[ááÿåä¤÷[äTDçDáÀ÷[è4íIìÜ÷[èTDøTDê¬ù[°/äø[ø[æ â$ø[æâTø[èè|ù[èâpêèä$ø[ätø[ãáDù[˜R䄸[Tø[˜RÀø[ÿèäüø[äìø[äã$ø[ì â$ø[ ä(ù[èù[ì â$ø[ðìø[êlù[(päTù[æ(p|ýIäâ”ù[@ä|ù[âTù[@ðèä¤ù[$ø[â¼ú[À—ä¼ù[äÀ—øù[ááÿåäú[ïDá0ú[øLú[èLbìhú[ø„ú[èLbì ú[è|JøLbì@û[Œ äÌú[äŒ û[ááÿåä$û[ïDíLbì4ü[ظäPû[äظŒû[ááÿåä¨û[ïDáÄû[èœBìàû[øüû[èœBìü[ÿäLbðĸäDü[\>Wâý[` ä\ü[ä` ˜ü[äÿåä´ü[ïáÐü[è ¤Jììü[è ¤Jøü£Jì$ý[™äý[ØSPæ4ý[80ä PrJ þ[Ô˜äDý[äÔ˜€ý[ÿìäœý[ïá¸ý[èlÍJìÔý[èôIìðý[è°"JøLbì¬þ[Lþäþ[äLþXþ[ÿìätþ[ïáþ[è úJÿèØþ[”¹ä¼þ[Èþ[æ âLJæôþ[ äèþ[4Tæÿ[x¹äÿ[djWæÜ\0ä ÿ[,ÿ[æ â\ÿ[Dõè¬\èâ@êDõä,ÿ[ä|ÿ[ãáL\˜RäŒÿ[\ÿ[˜RÈÿ[ÿèä\äôÿ[äã,ÿ[ì â,ÿ[ ä0\è \ì â,ÿ[ðôÿ[êt\0„ ä\\æ0„ èâœ\à{ä„\â \\à{ ˜äâÄ\T ä¬\â„\T ðDõäÔ\,ÿ[â4\`¹äì\ô\â4â$\`¹è\èâ@ê`¹äô\äD\ãá\˜RäT\$\˜R\ÿèäÌ\ä¼\äãô\ì âô\ äø\èè\ì âô\ð¼\ê<\ü=ä$\æü=è0âd\˜?äL\â$\˜?è,âŒ\¬j ät\âL\¬j è(â´\à?äœ\ât\à?è$âÜ\HŠäÄ\âœ\HŠè â\§äì\âÄ\§èâ,\à“ä\âì\à“èâT\t_ä<\â\t_èâ|\4Öäd\â<\4Öèâ¤\àÄäŒ\âd\àÄè âÌ\\¶ä´\âŒ\\¶èâô\ls äÜ\â´\ls èâ\à‹ ä\âÜ\à‹ ð`¹ä,\ô\ã\hÐäD\ähЀ\ááÿåäœ\ïDá¸\èìXMìä\èÔ\ì âLQÿæþä\äþL\ááÿåäh\ïDá„\èœBì \ÿäœBêx\t™äÌ\ät™\ÿìä$\ïá@\èè4Lì\\è|JøüÌKì4\,ºäˆ\ä,ºÄ\ÿìäà\ïáü\è¤PJì\ÿä”PJì \H™äD\äH™€\ÿìäœ\ïá¸\è0ãQìÔ\èLbìð\èLbø„æQìä\áºä\åºX\ÿìät\ïá\èlÍJì¬\èôIìÈ\è°"JøLbìˆ \Tåô\á \æâ0 \ÀèX \èâ`êÀå \äP \ãá \˜Rä` \0 \˜Rœ \ÿèäØ \äÈ \ää \ì ã \ ä \èô \ì ã \ðÈ \êH \Ô4ä0 \æÔ4è âp \ŒÈäX \â 0 \ŒÈ, SìÀä€ \á \⤠\0™ä˜ \ +Ræ` \å´ \äáð \ááÿåä \ïDá( \øD \èœBøŒÇZì| \¨ äp \´æRæ \ÈþäŒ \äÈþÈ \ááÿåää \ïDâ \ÿô¼ \Ä ä, \äÄ h \ááÿåä„ \ïDá  \èÈBÿè@ \åÌ \äá \ááÿåä$ \ïDí\»[ì|\ÈåP \äÈጠ\ááÿåä¨ \ïDáÄ \èÌýQì`\èà \ì âð \æä \ïá(\èÌýQìD\è ˜ÿÿäü\¨¹äŒ\˜\æ˜âÈ\˜+èÌ\èâpê˜+ä˜\äè\ ãá¸\˜Räø\È\˜R4\ÿèäp\ä`\äã˜\ì â˜\ äœ\èŒ\ì â˜\ð`\êô\ ¹äÈ\æ ¹à\ä â xêä\¼#ä\âÈ\¼#èâD\¸ ä,\â\¸ èâl\¤£äT\â,\¤£èâ”\°´ ä|\âT\°´ èâ¼\l³ä¤\â|\l³èâä\ä¸äÌ\â¤\ä¸ð˜+äô\˜\â\þä \ÔDæd\P ä(\ÌkP ;=òÔ:=útåt\ätá°\ÿìäÌ\ïí ˜ê\Œšäø\ÜñNæ¤\´ºä\ä´ºP\ÿìäl\ïáˆ\è@™Xø|Jì|\€ºä´\䀺ð\ÿìä \ïá(\èlÍJìD\èôIì`\è°"JøLbìT\¨‘åŒ\䨑áÈ\ÿìää\ïâ\èlÍJì\èôIì8\è°"JøLbì \ô äd\æô ´Oâÿåx\dšä°\ädšì\ÿìä\ïá$\èlÍJì@\èôIì\\è°"JøLbìl\$Ñäˆ\ä$ÑÄ\ÿìäà\ïáü\èLBKì\èFKì4\èLBKìP\è|Pö ìIì \Ì0ä|\„\â â´\Ì0èÜ\èâpêÌ0ä„\äÔ\ãá¤\˜Rää\´\˜R \ÿèä\\äL\äã„\ì â„\ äˆ\èx\ì â„\ðL\êÌ\Lë ä´\æLë èâô\,äÜ\â ´\,PNìÌ0ä\„\â\‘å\ä‘áX\ááÿåät\ïDí ˜ì¬\ ÿä \œåUêÑä¼\äÑø\ÿìä\ïí|Jê\T»ä@\äT»|\ÿìä˜\ïá´\èlÍJìÐ\èôIìì\è°"JøLbìÄ\»ä\ä»T\ÿìäp\ïáŒ\èPLì¨\è|Pö„ëIì€\h’åÔ\äh’á\ÿìä,\ïáH\è˜ÝKìd\è|Jø´ûKì\ˆ ä `wX¨\\›ä \¸ÜYâÄ\øºä¸\t&Væð\|ÿäÔ\à\æ âü:Væt\|1å\ä|1<\ááÿåäX\ïDý\Ä ä„\Œ\â â¼\Ä èä\èâpêÄ äŒ\äÜ\ãá¬\˜Räì\¼\˜R(\ÿèäd\äT\äãŒ\ì âŒ\ ä\è€\ì âŒ\ðT\êÔ\ÈÙä¼\æÈÙÄÁJäâü\̉ ää\â ¼\̉ ,ÇJìÄ ä \Œ\â0!\äšä$\0\æ â@\æPáp\¼²é!\èâpê¼²ä@\ä\ ãá`\˜Rä \p\˜RÜ\ÿèä\ä\äã@\ì â@\ äD\è4\ì â@\ð\êœ\$iäp\æ$iˆ\ä4á êäØ\Œ(ä¬\â p\Œ(Ä\ä,â éä \˜?äè\â¬\˜?è(â( \ä>ä \âè\ä>è$âP \ÐCä8 \â \ÐCè âx \Œ6ä` \â8 \Œ6èâ  \pT äˆ \â ` \pT RäâÈ \D ä° \â ˆ \D Rä âð \ØBäØ \â ° \ØBRäâ!\¼¬å!\âØ \¼¬ð¼²ä(!\@\âÌ!\D ä@!\L!\æ â\!\æäx!\ïá”!\èTDì°!\èœBÿìКäÜ!\äК"\ÿìä4"\ïáP"\ÿô #\@¼ä|"\ä@¼¸"\ÿìäÔ"\ïáð"\ÿä|Jêp$\ü1ä#\äü1X#\ÿìät#\ïá#\èœBì¬#\èTDìÈ#\øä#\èTDí$\ø$\èTDì8$\øT$\èTDÿè(\ ä€$\Œ$\æ(â¼$\¦èè'\èâ@ê¦äŒ$\äÜ$\ ãá¬%\˜Räì$\¼$\˜R(%\ÿèäd%\äT%\äãŒ$\ì âŒ$\ ä%\è€%\ì âŒ$\ðT%\êÔ%\„lä¼%\æ„l ˜â$â˜&\˜Åää%\â ¼%\˜Åü%\ä â â &\æä(&\ïáD&\èÈBì`&\ø|&\ÿôÀ&\ô¤ ä¨&\âä%\ô¤ èâè&\OäÐ&\â¨&\Oèâ'\ÜÊäø&\âÐ&\ÜÊèâ8'\€Øå '\âø&\€Øá ˜äâ`'\`§äH'\â '\`§ ˜äâˆ'\Lxäp'\âH'\Lxè â°'\œ>ä˜'\â p'\œ>ÌýQäâØ'\XåäÀ'\â ˜'\XåÈBäã(\>åè'\âÀ'\>ñ¦ä(\Œ$\âÔ(\ ¼ä((\ä ¼d(\ááÿåä€(\ähEçDáœ(\ø¸(\ÿôä(\ì ä ðwX”)\\œäô(\ä\œ0)\ááÿåäL)\ïDáh)\è|Jö„)\ì â úJæ4*\˜ ä¤)\ä˜ à)\ÿìäü)\ïá*\è>KøLBKìD*\` ä dVV`*\(œäT*\ø1Xæ+\  äp*\ä  ¬*\ááÿåäÈ*\äTDçDáä*\è4íIí+\ÿäœBìD-\¸»ä,+\主h+\ááÿåä„+\ïDí +\ì â°+\æ âÀ+\æâð+\ âé,-\èâpê âåÀ+\ä,\ãáà,\˜Rä ,\ð+\˜R\,\ÿèä˜,\äˆ,\äãÀ+\ì âÀ+\ äÄ,\è´,\ì âÀ+\ðˆ,\ê-\L0äð,\æL0-\äâ â\¯PäèÄð ä,-\âð,\Äð ì.\tÒäT-\ätÒ-\ááÿåä¬-\ïDáÈ-\è|Jêä-\è|Jí.\ÿäÈBì8.\TÒä,.\H¹Pæ/\8ÒäH.\ä8Ò„.\ááÿåä .\ïDá¼.\èœBìØ.\è¬6Vìô.\ÿäLbì”/\Ü1ä /\äÜ1\/\ááÿåäx/\ïDý40\˜»ä¤/\䘻à/\ááÿåäü/\ïDá0\è|Jö|Jê¸0\ÄÑäD0\äÄÑ€0\ááÿåäœ0\ïDíœBì<1\„›äÈ0\ä„›1\ááÿåä 1\äœBçDÿáp›äL1\Ìkp›”;=òX;=öl4\ ä˜1\ä Ô1\ÿìäð1\ïí 2\ì â2\æâL2\€Q è<4\èâpê€Q ä2\äl2\ ãá<3\˜Rä|2\L2\˜R¸2\ÿèäô2\ää2\äã2\ì â2\ ä 3\è3\ì â2\ðä2\êd3\KäL3\æKèâŒ3\”~ät3\L3\”~ ˜ä â´3\Àñ äœ3\â t3\Àñ |Jä âÜ3\˜1äÄ3\œ3\˜1 ˜äâ4\”?äì3\â Ä3\”?|Jäâ,4\ls ä4\âì3\ls èâT4\§ä<4\â 4\§PÏIê€Q äd4\2\âˆ4\„ ä|4\ãLæ¤4\42ä˜4\(*Uæ`5\0 ä´4\ä0 ð4\ááÿåä 5\ïDá(5\èì¥KìD5\è¤aZÿç6\´œäp5\ä´œ¬5\ááÿåäÈ5\ïDáä5\èœBÿì`“å ü`Rè6\`½ä 6\ä`½\6\ÿìäx6\ïá”6\舿Mì°6\è|JêÌ6\è|JöÜÂMìÀ7\H”åø6\äH”á47\ÿìäP7\ïál7\èlÍJìˆ7\èôIì¤7\è°"JøLbìØ7\H½äÐ7\2Xâô7\áäè7\3PæÀ9\, ä8\8\æ â@8\4’è9\èâpê4’ä8\ä`8\ãá09\˜Räp8\@8\˜R¬8\ÿèäè8\äØ8\äã8\ì â8\ ä9\è9\ì â8\ðØ8\êX9\tß ä@9\ætß èâ€9\è äh9\â@9\è èâ¨9\È}ä9\âh9\È}ð4’ä¸9\8\âD:\(”åÐ9\ä(”á :\ááÿåä(:\ïDíQXì\:\èœäT:\‡Oâà:\´ äl:\ä´ ¨:\ááÿåäÄ:\ïDíœBðмäð:\$òTæ€;\˜ ä ;\ä˜ H;\ÿìäd;\ïíÃSì;\xä LÖJ ;\p3ä ÄJOx<\l ä°;\äl ì;\ÿìä<\ïá$<\èlÍJì@<\èôIì\<\è°"JøLbìˆ<\ä½ä LL`=\4 ä˜<\ä4 Ô<\ÿìäð<\ïá =\èlÍJì(=\èôIìD=\è°"JøLbìÐ=\LÔäp=\â  =\LÔˆ=\èæp=\äPçä ¸=\ˆ=\î`Òˆ=\è¨>\H äà=\äH >\ááÿåä8>\ïDáT>\è Zìp>\èZìŒ>\èؤ[ø¥[ì€?\D3ä¸>\äD3ô>\ááÿåä?\äTDçDá,?\è4íIìH?\è)Jìd?\èTDÿæX@\(Ôä?\ä(ÔÌ?\ááÿåäè?\ïDá@\èœBì @\èœBì<@\ÿôÜ@\ìÓäh@\äìÓ¤@\ÿìäÀ@\ïí|Jå ì@\Ìk¤”áP<=ò<=öTA\¨3ä8A\DA\æ â¼€NæHB\àädA\äà A\ÿìä¼A\ïáØA\èPLìôA\øB\ø,B\è`ÔWøŒÖWìC\4 äXB\ä4 ”B\ÿìä°B\ïáÌB\è¬ÖLìèB\è|JøBJìPC\Ô•åC\æÔ•á´Oâÿå|D\ ä`C\ä œC\ÿìä¸C\ïáÔC\è¤PJìðC\ø D\ø(D\è8oìDD\è8oì`D\èLbø8oíE\¾äŒD\ä¾ÈD\ÿìääD\ïî/QìLE\ÀäE\æÀ´Oâÿå$F\D ä\E\äD ˜E\ÿìä´E\ïáÐE\èlÍJììE\èôIìF\è°"JøLbìÜH\Õä4F\ä¸c\â c\œ>ÌýQäâøc\Xåäàc\â ¸c\XåÈBäâ d\ìâäd\âàc\ìâð„Öä0d\pa\æä äHd\ää „d\ááÿåä d\ïDá¼d\èì¥KìØd\øôd\ÿô=òD>=öìt\ ä@t\ä |t\ááÿåä˜t\ïDá´t\è(œJìÐt\ÿä ˜ìÀx\T äüt\äT 8u\ááÿåäTu\ïDípu\ì â€u\æ4â°u\ˆcèx\èâ@êˆcä€u\äÐu\ãá v\˜Räàu\°u\˜Rv\ÿèäXv\äHv\äã€u\ì â€u\ ä„v\ètv\ì â€u\ðHv\êÈv\8á ä°v\æ8á HÃTä0âðv\Ä™äØv\â °v\Ä™œnUä,âw\P®åw\âØv\P®è(â@w\Œ¤ä(w\ãw\Œ¤è$âhw\d±äPw\â (w\d±h¡Kä âw\„¿äxw\â Pw\„¿h¡Käâ¸w\,yä w\â xw\,yœBäâàw\dÑ äÈw\â  w\dÑ |Jââx\ì¿äðw\â Èw\ì¿|Jââ0x\ æäx\â ðw\ æ|Jâ âXx\4¶ä@x\â x\4¶ÈBäâ€x\*ähx\â@x\*èâ¨x\ìâäx\âhx\ìâðˆcä¸x\€u\â$z\< äÐx\ä< y\ááÿåä(y\ïDáDy\èì¥Kì`y\èÞQì|y\èl;Uì˜y\ø´y\øÐy\øìy\øz\ÿô@z\¤—å4z\4ÏPæ\z\,! äPz\X'[ê˜Àälz\tz\ââ¤z\˜Àèà{\èâ`ê˜Àätz\äÄz\ãá”{\˜RäÔz\¤z\˜R{\ÿèäL{\ä<{\äãtz\ì âtz\ äx{\èh{\ì âtz\ð<{\êÐ{\; ä¤{\æ; ¼{\äâ êäø{\Ääà{\â¤{\Äð˜Àä|\tz\â´}\ ! ä |\,|\æâ\|\8³ è„}\èpê8³ ä,|\ä||\ãáL}\˜RäŒ|\\|\˜RÈ|\ÿèä}\äô|\äã,|\ì â,|\ ä0}\è }\ì â,|\ðô|\êt}\ÐDä\}\æÐDìœ}\Üñ ä„}\â \}\Üñ œBì8³ ä¬}\,|\âÐ}\¨¡äÄ}\dJæh€\Ü äà}\äÜ ~\ááÿåä8~\ïDáT~\èœBì0€\èp~\ì â€~\æâ°~\Ê é€\èâpêÊ ä€~\äÐ~\ãá \˜Räà~\°~\˜R\ÿèäX\äH\äã€~\ì â€~\ ä„\èt\ì â€~\ðH\êÈ\…ä°\æ…èâð\$£äØ\â°\$£èâ€\×å€\â Ø\×´OìÊ ä(€\€~\âL€\ÿäp씀\ äx€\„€\æ âLNæ°€\Ü ä¤€\@\æ4\ô6äÀ€\äô6ü€\ááÿåä\ïDíœBìP\È äD\|Jêü—å`\äü—áœ\ÿìä¸\ä ˜çáÔ\è ˜ìð\è ˜ÿæÈ‚\D™å‚\äD™áX‚\äÿåät‚\ïá‚\è ¤J쬂\è ¤Jøü£JìØ‚\|Âä ¤IO°ƒ\TÂäè‚\äTÂ$ƒ\ÿìä@ƒ\ïá\ƒ\èlÍJìxƒ\èôI씃\è°"JøLbìP„\™åÀƒ\ä™áüƒ\ÿìä„\ïá4„\ètLMø¸3MêÔ„\è˜å`„\äè˜áœ„\ÿì丄\ïíèƒNìä„\8Âä \>TÔ†\ Âäô„\ü„\â â,…\ Â褆\èâpê Âäü„\äL…\ãá†\˜Rä\…\,…\˜R˜…\ÿèäÔ…\äÄ…\äãü„\ì âü„\ å†\èð…\ì âü„\ðÄ…\êD†\d ä,†\æd ,ÅJäâl†\è äT†\â ,†\è ä6Mä┆\ cå|†\âT†\ cá|Jä⼆\Lx䤆\â|†\Lxð Âä̆\ü„\âð†\” ää†\$¶Rç‡\Иå ô–Qô‡\´˜å‡\ä´˜áL‡\ááÿåäh‡\ïDᄇ\ø ‡\è ˜ê¼‡\èœBê؇\èTDøLbìxˆ\t˜åˆ\ät˜á@ˆ\ááÿåä\ˆ\ïDíxÃXìàˆ\ÐÁ䈈\äÐÁĈ\ááÿå÷Dᔊ\¢äðˆ\üˆ\æ â ‰\æ â<‰\<»édŠ\èâpê<»å ‰\ä\‰\ãá,Š\˜Räl‰\<‰\˜R¨‰\ÿèää‰\äÔ‰\äã ‰\ì â ‰\ äŠ\éŠ\ì â ‰\ðÔ‰\êTŠ\ˆ¯ä<Š\戯èâ|Š\̉ ädŠ\â <Š\̉ ,ÇJì<»åŒŠ\ ‰\æè¡ä¤Š\äè¡àŠ\ÿìäüŠ\ò‹\èœBøLRì`\à äD‹\P‹\æ â`‹\æâ‹\,è0\èâpê,ä`‹\ä°‹\ãဌ\˜RäÀ‹\‹\˜Rü‹\ÿèä8Œ\ä(Œ\äã`‹\ì â`‹\ ädŒ\èTŒ\ì â`‹\ð(Œ\ꨌ\(;äŒ\æ(;¬ZäâÐŒ\Z丌\âŒ\Zè âøŒ\ØÀäàŒ\â ¸Œ\ØÀ ˜äâ \¼K ä\â àŒ\¼K ˜äâH\(tä0\â\(tð,äX\`‹\âä\Ä äp\äÄ ¬\ÿìäÈ\ïíôS켎\Ùäô\äÙ0Ž\ÿìäLŽ\ïáhŽ\èlÍJ섎\èôIì Ž\è°"JøLbì@“\èØ0“\ÌŽ\ØŽ\æâ \èØ¬’\èÀ’\ä @áp “\æèØäØŽ\ä(\ãá"„\ôOÌ\8\\ôOt\ÿèä \ìãØŽ\ø¼\ì âØŽ\èÔ\\ôO\ÿèä<\ìãØŽ\ìX\è¼\øt\ê âØŽ\ ä4‘\˜Rä”\\˜RÐ\ÿèäü\ät\äãØŽ\ì‘\è¼\øt\êä‘\DõäD‘\\Dõ€‘\âÿè䬑\ìááØŽ\°êÈ‘\è¼\ùBJì”’\ð§äô‘\\ð§0’\âÿèä\’\ìááØŽ\¬êx’\è¼\ùBJðèØä¤’\ØŽ\æHÆKìÐ’\ØŽ\ä¼ââ\˜] “\ÿä¼ì⌿3)6{Ò²ÀO˜>`ã8“\ØŽ\âP“\<Ãä twN`“\è™å ÔpPp”\ä¢äp“\ä䢬“\ááÿåäÈ“\ïDáä“\èœBí”\ø”\èTDê8”\øT”\ÿä jR꜔\¨¢ä€”\Œ”\æ âpOæ •\ˆ¢ä¬”\䈢è”\ááÿåä•\äT#KçDí¸3M꼕\p¢ä0•\<•\æ âL•\æäh•\ïá„•\ø •\ÿø°ØäÌ•\æ°Øäb-äÿå™\ ä–\$–\æ(âT–\L èä˜\èâ@êL ä$–\ät–\ ãáD—\˜Rä„–\T–\˜RÀ–\ÿèäü–\äì–\äã$–\ì â$–\ ä(—\è—\ì â$–\ðì–\êl—\„läT—\æ„l|Jâ$â”—\˜Åä|—\â T—\˜Åü%\ä â¼—\ô¤ 䤗\â|—\ô¤ èâä—\OäÌ—\⤗\Oèâ ˜\ÜÊäô—\âÌ—\ÜÊèâ4˜\€Øå˜\âô—\€Øá|Jäâ\˜\`§äD˜\â ˜\`§|Jä℘\Lxäl˜\âD˜\Lxè ⬘\œ>䔘\â l˜\œ>ÌýQäâÔ˜\Xå优\â ”˜\XåÈBäâü˜\>åä˜\⼘\>ñL ä ™\$–\âì™\´7ä$™\ä´7`™\ÿìä|™\ïᘙ\èlÍJì´™\èôIìЙ\è°"JøLbìš\|£äü™\š\æ âü„\æ(š\è ä rPá›\ # ä8š\ä # tš\ááÿåäš\ïDᬚ\è°"JìÈš\è4íIìäš\èÔJÿæ›\ÄÙä›\JæH›\À ä,›\8›\æ âä Zæd›\¼ÃäX›\˜OSæT\P ät›\|›\â⬛\P è$\èâpêP ä|›\äÌ›\ã᜜\˜RäÜ›\¬›\˜Rœ\ÿèäTœ\äDœ\äã|›\ì â|›\ 䀜\èpœ\ì â|›\ðDœ\êÄœ\0嬜\æ0éâìœ\œ\äÔœ\⬜\œ\èâ\Ü}äüœ\âÔœ\Ü}èâ<\¬Uä$\âüœ\¬UðP äL\|›\â,ž\ŒÙäd\äŒÙ \ááÿåä¼\ïDáØ\è ˜êô\è ˜ìž\ÿäÈBìÌž\¤Ãä<ž\ä¤Ãxž\ááÿå䔞\ïDá°ž\è”{Nøp쀣\lÙäÜž\èž\æ âøž\æâ(Ÿ\˜æ èP£\èâpê˜æ äøž\äHŸ\ãá \˜RäXŸ\(Ÿ\˜R”Ÿ\ÿèäП\äÀŸ\äãøž\ì âøž\ äüŸ\èìŸ\ì âøž\ðÀŸ\ê@ \ÄÙä( \æÄÙèâh \ls äP \â( \ls è â£\ü8äx \â P \ü8 \äâ â  \æ âР\Lùèè¢\èâpêLùä  \äð \ ãáÀ¡\˜Rå¡\Р\˜R<¡\ÿèäx¡\äh¡\äã  \ì â  \ 䤡\蔡\ì â  \ðh¡\êè¡\´} äС\æ´} |Jäâ¢\ oäø¡\â С\ o|Jäâ8¢\œÏä ¢\â ø¡\œÏ|Jäâ`¢\dÀäH¢\â ¢\dÀ|Jä∢\ˆ¬äp¢\âH¢\ˆ¬è â°¢\ðî 䘢\âp¢\ðî èâØ¢\Xà äÀ¢\☢\Xà èã£\T'äè¢\âÀ¢\T'ðLùä£\  \â@£\Xåä(£\â x \XåÈBäâh£\,ÎäP£\â(£\,Îð˜æ äx£\øž\âX¤\PÙä£\äPÙÌ£\ááÿåäè£\ïDá¤\èœBì ¤\è¬6Vì<¤\ÿäLbðXÃäh¤\äXä¤\ááÿåäÀ¤\ïDáܤ\è ˜ö ˜ê¥\´8ä¥\(Pæì¥\\Ää$¥\ä\Ä`¥\ÿìä|¥\ïᘥ\èlÍJì´¥\èôIìÐ¥\è°"JøLbì8¦\”# äü¥\æ”# œBäÿåT¦\PšåH¦\lOTæ0¨\t# äd¦\p¦\æ …\æ â°¦\šé¨\èâpêšä€¦\äЦ\ãá §\˜Räà¦\°¦\˜R§\ÿèäX§\äH§\ä〦\ì …\ ä„§\èt§\ì …\ðH§\êȧ\|+ ä°§\æ|+ èâð§\”* äا\â°§\”* èâ¨\L, å¨\âا\L, ðšä(¨\€¦\æT# ä@¨\äT# |¨\ÿì䘨\ïá´¨\ÿôŒ©\D9äà¨\äD9©\ááÿåä8©\ïDáT©\èhEìp©\èX-øØfì,ª\̤䜩\ä̤Ø©\ÿìäô©\ïáª\è4mJøXJì«\4Úä<ª\ä4Úxª\ááÿå䔪\ïDá°ª\è LTê̪\øèª\èœBøLbìl«\€ ä«\ä€ P«\ááÿå÷Dáð«\ šå|«\䠚ḫ\ááÿåäÔ«\ïDí|Jì¬\H å¬\äH <¬\ááÿåäX¬\丆SçDát¬\èì¥Kÿ謬\„šå ¬\üˆ\ê¬Ä伬\PÆ[æô¬\ä äج\ä¬\æ âœðWæ”­\¤›å­\䤛á@­\äÿåä\­\ïáx­\éBJùBJ줭\Ø9ä üO|®\¤9ä´­\ä¤9ð­\ÿìä ®\ïá(®\èÜñNìD®\ø`®\ÿôT¯\L¥äŒ®\äL¥È®\ÿìää®\ïâ¯\èÌÄPì¯\ø8¯\éBJøLbì°\$¥äd¯\ä$¥ ¯\ÿì伯\ïáد\è04Kìô¯\è”}Kø ‚KìL±\ØÚä °\äØÚ\°\ÿìäx°\ïᤰ\è”°\ì âlâZæÀ°\è|Jêܰ\øø°\ø±\ø0±\è|PöØfìh±\T›å\±\Lbêð¤äx±\&Mæd¸\Ô ä”±\äÔ б\ÿìäì±\ïáH¸\è²\ì â²\æâ H²\È” Ä·\èØ·\ä @áp8¸\æÈ” ä²\äh²\ãá"ij\ôO ³\x²\H²\ôO´²\ÿèäà²\ìã²\øü²\ì â²\è³\H²\ôOP³\ÿèä|³\ìã²\옳\èü²\ø´³\ê â²\ ät´\˜RäÔ³\H²\˜R´\ÿèä<´\ä´³\äã²\ìX´\èü²\ø´³\ꬷ\”åä„´\H²\”åÀ´\âÿèäì´\ìáá²\ êµ\èü²\ø$µ\ì â4µ\æ âdµ\øè|·\èâpêøä4µ\䄵\ ãáT¶\˜R䔵\dµ\˜Rе\ÿèä ¶\äüµ\äã4µ\ì â4µ\ ä8¶\è(¶\ì â4µ\ðüµ\ê|¶\\µäd¶\æ\µè⤶\$´äŒ¶\âd¶\$´èâ̶\$Yä´¶\â Œ¶\$Y|Jäâô¶\ðr äܶ\â ´¶\ðr |Jäâ·\ø< ä·\âܶ\ø< è âD·\ ä,·\â·\ èâl·\äT·\â ,·\|Jäâ”·\€…ä|·\âT·\€…ðøä¤·\4µ\æÈ” ä¼·\²\æˆbìè·\²\äââH²\tÉ$¸\ÿäìâÓZŒ”ÅМ ÀOÉœŽë$µ\ìt¸\(¦ä ÌjJ0¹\”Û䄸\ä”ÛÀ¸\ÿìäܸ\äœBçáø¸\è\Rì¹\èœBÿèº\„:ä@¹\ä„:|¹\ááÿå䘹\ïDá´¹\èœBìй\è LTêì¹\ÿäLTê4»\ˆ äº\äˆ Tº\ÿìäpº\ïጺ\ø¨º\øĺ\èTDìàº\øüº\èTDì»\ÿähSLìð»\`ÛäD»\ä`Û€»\ááÿå䜻\ïDḻ\èìXMìÔ»\èÔ\ÿè¼\4:å¼\ä4:<¼\ááÿåäX¼\ïDát¼\èì¥KÿìT ä ¼\ÌkT dÙ-æêœÙ-ö$¾\4Æäì¼\ä4Æ(½\ÿìäD½\ïá`½\è ˜ê|½\è ˜ê˜½\è ˜ê´½\è ˜ìн\øì½\è¼p-ì¾\ÿäLbìľ\Ü$ ä4¾\äÜ$ p¾\ÿì䌾\ïᨾ\èãLøLbìà¾\ ;äÔ¾\¸­[æÀ\ô›åð¾\äô›á,¿\ááÿåäH¿\ïDád¿\èÌýQíÀ\耿\ì â¿\æä¬¿\ïáÈ¿\èÌýQìä¿\è|Jÿÿä\À\œ$ ä,À\8À\æ âHÀ\æ â,ðMäè¸ÛälÀ\tÀ\â â¤À\¸ÛèôÁ\èâpê¸ÛätÀ\äÄÀ\ãá”Á\˜RäÔÀ\¤À\˜RÁ\ÿèäLÁ\ä<Á\äãtÀ\ì âtÀ\ äxÁ\èhÁ\ì âtÀ\ð<Á\ê¼Á\Ø8ä¤Á\æØ8èâäÁ\Ó äÌÁ\â¤Á\Ó èâlÂ\è¾ äôÁ\â ÌÁ\è¾ Â\èæ$Â\ä@qä <Â\”´ Â\ì TÂ\„ß Â\î\R Â\ì¸Ûä|Â\tÀ\â(Ç\@% ä”Â\ Â\æHâÐÂ\|A èøÆ\èâpê|A ä Â\äðÂ\ ãáÀÃ\˜RåÃ\ÐÂ\˜R<Ã\ÿèäxÃ\ähÃ\äã Â\ì â Â\ ä¤Ã\è”Ã\ì â Â\ðhÃ\ê€Å\MäÐÃ\æMèÃ\ä@â âøÃ\æâ(Ä\0f èPÅ\èâpê0f äøÃ\äHÄ\ãáÅ\˜RäXÄ\(Ä\˜R”Ä\ÿèäÐÄ\äÀÄ\äãøÃ\ì âøÃ\ äüÄ\èìÄ\ì âøÃ\ðÀÄ\ê@Å\Ø-ä(Å\æØ-èâhÅ\`©äPÅ\â(Å\`©ð0f äxÅ\øÃ\â¨Å\ðääÅ\âÐÃ\ðäè<âÐÅ\@Öå¸Å\âÅ\@Öé8âøÅ\è äàÅ\â¸Å\è è4â Æ\h3äÆ\âàÅ\h3è0âHÆ\¸‡ ä0Æ\â Æ\¸‡ ”ÜIä(âpÆ\„äXÆ\â 0Æ\„”ÜIä â˜Æ\á¢ ä€Æ\âXÆ\ᢠ”ÜIäâÀÆ\ô` 䍯\â €Æ\ô` ”ÜIäâèÆ\PEäÐÆ\â ¨Æ\PE”ÜIäâÇ\€ÛäøÆ\â ÐÆ\€Û”ÜIì|A ä Ç\ Â\âDÇ\;ä8Ç\˜NæØÇ\€ äTÇ\ä€ Ç\ÿìä¬Ç\ïíÈÇ\ì â¤Zæ°È\” äèÇ\ä” $È\ááÿåä@È\äÈBçDá\È\èÈBìxÈ\èÈBì”È\è ˜ö ˜î$ÜäÀÈ\ÌÈ\æ âÜÈ\æâ É\P6è„Ê\èâpêP6äÜÈ\ä,É\ãáüÉ\˜Rä<É\ É\˜RxÉ\ÿèä´É\ä¤É\äãÜÈ\ì âÜÈ\ äàÉ\èÐÉ\ì âÜÈ\ð¤É\ê$Ê\œ±ä Ê\朱 OäâLÊ\áÄå4Ê\â Ê\áÄéâtÊ\¡ ä\Ê\â4Ê\¡ èâœÊ\á‡ä„Ê\â\Ê\ᇜBìP6ä¬Ê\ÜÈ\âpË\¼§äÄÊ\ä¼§áË\ÿìäË\ïá8Ë\èè4LìTË\è8ÆKøüÌKìôÏ\tÇäÏ\€Ë\ŒË\æâ ¼Ë\tÇ`Ï\ètÏ\ä @ápÔÏ\ætÇäŒË\äÜË\ãá"8Í\ôO€Ì\ìË\¼Ë\ôO(Ì\ÿèäTÌ\ìãŒË\øpÌ\ì âŒË\èˆÌ\¼Ë\ôOÄÌ\ÿèäðÌ\ìãŒË\ì Í\èpÌ\ø(Í\ê âŒË\ äèÍ\˜RäHÍ\¼Ë\˜R„Í\ÿèä°Í\ä(Í\äãŒË\ìÌÍ\èpÌ\ø(Í\ê˜Î\x!äøÍ\¼Ë\x!4Î\âÿèä`Î\ìááŒË\ê|Î\èpÌ\øX-ìHÏ\Ð`ä¨Î\¼Ë\Ð`äÎ\âÿèäÏ\ìááŒË\ ê,Ï\èpÌ\ÿìtÇäXÏ\ŒË\æˆbì„Ï\ŒË\äââ¼Ë\á j ÀÏ\ÿäìâëÉêyùºÎŒ‚ªK© ãìÏ\ŒË\âÌÐ\P<äÐ\äP<@Ð\ÿìä\Ð\ïáxÐ\èlÍJì”Ð\èôIì°Ð\è°"JøLbìÜÑ\§äÜÐ\ä§Ñ\ÿìä4Ñ\ïáPÑ\èðJìlÑ\øˆÑ\ø¤Ñ\èTDìÀÑ\ÿäô\ìøÑ\8& äìÑ\€SæÓ\áåÒ\åáDÒ\ÿìä`Ò\ïá|Ò\èœBì˜Ò\ø´Ò\èTDìÐÒ\øìÒ\èLbøLbìä×\Ì;äÓ\$Ó\æ â4Ó\æâdÓ\ èŒÔ\èâpê ä4Ó\ä„Ó\ãáTÔ\˜Rä”Ó\dÓ\˜RÐÓ\ÿèä Ô\äüÓ\äã4Ó\ì â4Ó\ ä8Ô\è(Ô\ì â4Ó\ðüÓ\ê|Ô\xÉädÔ\æxÉÈBäâÌ×\,u äŒÔ\â dÔ\,u ¤Ô\è â´Ô\æ0âäÔ\L_èœ×\èâpêL_ä´Ô\äÕ\ãáÔÕ\˜RäÕ\äÔ\˜RPÕ\ÿèäŒÕ\ä|Õ\äã´Ô\ì â´Ô\ ä¸Õ\è¨Õ\ì â´Ô\ð|Õ\êüÕ\ ääÕ\æ è,â$Ö\ÐÊä Ö\â äÕ\ÐÊ|Jâ(âLÖ\xËä4Ö\â Ö\xË|Jâ$âtÖ\Ô%ä\Ö\â4Ö\Ô%è âœÖ\`0å„Ö\â\Ö\`0éâÄÖ\Ð0å¬Ö\â„Ö\Ð0éâìÖ\àäÔÖ\â¬Ö\àèâ×\LäüÖ\âÔÖ\Lèâ<×\ tä$×\â üÖ\ tÈBä âd×\œÑäL×\â $×\œÑ¬@MäâŒ×\œ>ät×\â L×\œ>ÌýQäâ´×\ÄTäœ×\â t×\ÄTœBìL_äÄ×\´Ô\æ äÜ×\4Ó\âˆÙ\ð% äô×\áØ\æâ0Ø\  èXÙ\èâpê  åØ\äPØ\ãá Ù\˜Rä`Ø\0Ø\˜RœØ\ÿè䨨\äÈØ\ääØ\ì ãØ\ äÙ\èôØ\ì ãØ\ðÈØ\êHÙ\XIä0Ù\æXI,ÅJäâpÙ\̉ äXÙ\â 0Ù\̉ ,ÇJì  ä€Ù\áØ\â(Ú\°;ä˜Ù\ä°;ÔÙ\ááÿåäðÙ\ïDá Ú\è ˜öh¡KìÛ\§ä8Ú\ä§tÚ\ááÿåäÚ\ïDá¬Ú\è ˜êÈÚ\è ˜êäÚ\èœBíÛ\ÿä ˜ê4Û\¬œå,Û\PžKæ8 äDÛ\xËQæðÛ\pÝä`Û\äpÝœÛ\ÿìä¸Û\ïáÔÛ\èœBøØfìÈÜ\Ø<åÜ\äØ<<Ü\ÿìäXÜ\ïátÜ\èlÍJìÜ\èôIì¬Ü\è°"JøLbìäÜ\˜& äØÜ\Ü&OçÝ\¨äôÜ\tNæÝ\\åÝ\t´Râ4Ý\ ä(Ý\¨Næ Þ\°ÇäDÝ\ä°Ç€Ý\ááÿåäœÝ\ïDá¸Ý\èßPìÔÝ\è ˜êðÝ\è ˜ö ˜ëß\ÇäÞ\äÇXÞ\ááÿåätÞ\ïDáÞ\èÈBì¬Þ\øÈÞ\øäÞ\ÿøt& äß\üXMâ à\pÈä(ß\äpÈdß\ááÿåä€ß\ïDáœß\èœBì¸ß\èÈBìÔß\èÈBìðß\è,9MøŒHMìäà\žåà\äžáXà\ÿìätà\ïáà\èlÍJì¬à\èôIìÈà\è°"JøLbìüà\ìåôà\`pJâ<á\”¨ä á\攨$á\èæ á\äTâÜá\Ä' äLá\äÄ' ˆá\ÿìä¤á\ïáÀá\è;Oø|Pêüæ\¸ äìá\øá\æ ââ\æâ8â\@i èÌæ\èâpê@i äâ\äXâ\ãá(ã\˜Rähâ\8â\˜R¤â\ÿèäàâ\äÐâ\äãâ\ì ââ\ ä ã\èüâ\ì ââ\ðÐâ\êDæ\xmä8ã\æxmPã\ä ââ€ã\x³èæ\èpæ8â\x³äPã\ä ã\ãápä\˜Rä°ã\€ã\˜Rìã\ÿèä(ä\ää\äãPã\ì âPã\ äTä\èDä\ì âPã\ðä\êæ\D„ ä€ä\æD„ ˜ä\èâÈä\üÒèðå\èâpæ€ã\üÒä˜ä\äèä\ãá¸å\˜Räøä\Èä\˜R4å\ÿèäpå\ä`å\äã˜ä\ì â˜ä\ äœå\èŒå\ì â˜ä\ð`å\êàå\4Î äÈå\æ4Î œBäæ &äðå\âÈå\ &ð¤ó äæ\â €ä\¤ó 0æ\è êälæ\°åTæ\â8ã\°éâ”æ\TŽä|æ\âTæ\TŽèâ¼æ\€e䤿\â|æ\€eèâäæ\ÀäÌæ\â¤æ\Àð@i äôæ\â\âŒë\ü ä ç\ç\æ â(ç\æhâXç\ 4è\ë\èâpê 4ä(ç\äxç\ãáHè\˜Räˆç\Xç\˜RÄç\ÿèåè\äðç\äã(ç\ì â(ç\ ä,è\èè\ì â(ç\ððç\êLë\lÌäXè\ælÌpè\äâ dâ„è\äädâ´è\h èë\èâpêh ä„è\äÔè\ ãá¤é\˜Rääè\´è\˜R é\ÿèä\é\äLé\äã„è\ì â„è\ äˆé\èxé\ì â„è\ðLé\êàé\Ì=ä´é\æÌ=Ìé\ä@â $ê$äê\¨äðé\â ´é\¨ê\äâ $ê$äDê\TŽä,ê\âðé\TŽèâlê\ì!äTê\â,ê\ì!èâ”ê\ô»ä|ê\âTê\ô»èâ¼ê\ä¸ä¤ê\â|ê\ä¸èâäê\LxäÌê\â¤ê\Lxèâ ë\€‘ äôê\â Ìê\€‘ PNäâ4ë\,äë\â ôê\,PNìh äDë\„è\âtë\Øöä\ë\âXè\Øöð 4ä„ë\(ç\â,ì\°=äœë\ä°=Øë\ÿìäôë\ä,|\çáì\èÔJöTDêHì\Ì ä<ì\4Þ[æ í\ÄåXì\äÄá”ì\ááÿåä°ì\ïDáÌì\èüÙMìèì\øí\ÿôÄî\X¨ä0í\<í\æâlí\€ è”î\èâpꀠä<í\äŒí\ãá\î\˜Räœí\lí\˜RØí\ÿèäî\äî\äã<í\ì â<í\ ä@î\è0î\ì â<í\ðî\ê„î\Û älî\æÛ ¬Käâ¬î\Xsä”î\â lî\Xs¬K쀠ä¼î\<í\âàî\¤ äÔî\lR[ædï\œ=äðî\äœ=,ï\ááÿåäHï\ïDí¬@Mì„ð\H' ätï\äH' °ï\ááÿåäÌï\ïDáèï\èì¥Kìhð\èð\ì âð\æä0ð\ïáLð\è ˜ÿÿäœð\° ä”ð\ ¨Zâ¸ð\Èä¬ð\Ð]Ræ ó\' äÈð\Ðð\âˆãñ\' èÜò\èâpê' äÐð\ä ñ\ãáðñ\˜Rä0ñ\á ñ\˜Rlñ\ÿèä¨ñ\ä˜ñ\äãÐð\ì âÐð\ äÔñ\èÄñ\ì âÐð\ð˜ñ\ê,ò\Djåò\æDjò\äâ €ê€äTò\<ä<ò\ãò\<èâ|ò\°<ädò\â<ò\°<èâ¤ò\ÄZ äŒò\âdò\ÄZ èâÌò\Ь ä´ò\âŒò\Ь èâôò\‹äÜò\â´ò\‹ð' äó\Ðð\â(ó\Ü& äó\î´& ä8ó\$1Sâô\©äPó\䩌ó\ÿìä¨ó\ïáÄó\èlÍJìàó\èôIìüó\è°"JøLbì(ô\œ( ä À’QÈô\t( ä8ô\ät( tô\ÿìäô\ïá¬ô\èè‹KøØ‹Kìäô\ÜÈäØô\‹Uçõ\Àžåôô\4?Sæ,ö\è äõ\äè Lõ\ááÿåähõ\ïDá„õ\èdœUì õ\ø¼õ\øØõ\è)Jæâôõ\èLbèâö\èTDøLbí÷\¸ ä<ö\Hö\æ âXö\æätö\ïáö\èœBì¬ö\èèQLêÈö\øäö\ÿäœBê÷\$>ä÷\¸¢Læ8÷\˜ ä,÷\¬ÕOæ¤ù\ä¨äH÷\T÷\æâ„÷\Tóètù\èâpêTóäT÷\ä¤÷\ ãátø\˜Rä´÷\„÷\˜Rð÷\ÿèä,ø\äø\äãT÷\ì âT÷\ äXø\èHø\ì âT÷\ðø\êœø\8䄸\æ8èâÄø\ m䬸\â„ø\ mèâìø\³ äÔø\â¬ø\³ èâù\€äüø\âÔø\€è â<ù\`uä$ù\âüø\`uèâdù\*äLù\â$ù\*èâŒù\ìâätù\âLù\ìâðTóäœù\T÷\â`ú\̨ä´ù\ą̈ðù\ááÿåä ú\ïDá(ú\è¸3MìDú\è¸3Mö¸3MêŒú\X äpú\|ú\æ âøFUê@ ä ˜8Nû\€) ä¬ú\ä€) èú\ááÿåäû\ïDá û\èÐyPì<û\øXû\èœBìtû\ÿäLbìü\$ ä û\ä$ Üû\ÿìäøû\ïíÌ‹Lììü\X) ä$ü\äX) `ü\ÿìä|ü\ïá˜ü\èlÍJì´ü\èôIìÐü\è°"JøLbìüü\ŒŸå¸vX(ý\DÞý\ ý\ÜãNê ý\ÜãNâäý\ø ä8ý\äø tý\ÿìäý\ïá¬ý\èðKOìÈý\èTDøLbìØþ\¬ äôý\ä¬ 0þ\ááÿåäLþ\ïDáhþ\èTDì„þ\ø þ\èœBì¼þ\èœBøŒÇZì´]¬ äèþ\ôþ\æ âÿ\æ â4ÿ\Ô5 è„]èâ@êÔ5 äÿ\äTÿ\ãá$]˜Rädÿ\4ÿ\˜R ÿ\ÿèäÜÿ\äÌÿ\äãÿ\ì âÿ\ ä]èøÿ\ì âÿ\ðÌÿ\êL]Ì) ä4]æÌ) ÈBäât]œEä\]â4]œEèâœ]T ä„]â\]T ðÔ5 ä¬]ÿ\âÌ]H äÄ]°ùPâl]ˆ äÜ]äˆ ]ááÿåä4]ïDáP]ÿä|Jìð]$ ä|]ä$ ¸]ááÿåäÔ]ïDí,Zðôžæ]äôžá<]ÿìäX]ïát]ÿô¨],Êä ]4¡Râd]ªä¸]äªô]ÿìä]ïá,]èLbìH]ÿä„ÎUì€]ô©ät] ‹Uæ˜]ßä]øÓVâ°]ÀÉä¨]°]ââà]ÀÉè€]èâpêÀÉä°]å]ãáÐ]˜Rä]à]˜RL]ÿèäˆ]äx]äã°]ì â°] ä´]è¤]ì â°]ðx]êø]ls äà]æls èâ ]œÏä]â à]œÏ|Jä âH]dÀä0]â ]dÀ|Jäâp]XåäX]â 0]XåÈBäâ˜],Îä€]âX],ÎðÀÉä¨]°]âÌ] äÀ]¬’PæP]$?äÜ]ä$?]ááÿåä4]ïDíì¥Kìð]¨) ä`]ä¨) œ]ááÿåä¸]ïDáÔ]èœBÿè ]”Þå]L>WêpÞä](]æ0âX]¨±é ]èâpꨱå(]äx]ãáH]˜Räˆ]X]˜RÄ]ÿèå]äð]äã(]ì â(] ä,]è]ì â(]ðð]êp]´}äX]æ´}è,â˜],“ä€]â X],“´OäâÀ]8N ä¨]â €]8N ´Oä âè]LxäÐ]â¨]Lxèâ ]|^ äø]âÐ]|^ èâ8 ]ðä ]â ø]ð¼tL쨱åH ](]â ]¸«ä` ]丫œ ]äÿåä¸ ]ïáÔ ]éBJìð ]éBJùBJìÈ ]ˆ«ä ]䈫X ]ÿìät ]ïá ]è1Nì¬ ]è¤PJøLbì„ ]˜ßäØ ]ä˜ß ]ÿìä0 ]ïáL ]é•Uìh ]ÿô$ ]˜?ä” ]ä˜?Ð ]ÿìäì ]ïá ]è;OøØfì< ]* ä4 ]„&Vâ ]\«äL ]ä\«ˆ ]ááÿåä¤ ]ïDáÀ ]øÜ ]øø ]ÿô¸]x ä$ ]0 ]æâ` ]¨¸ èˆ]èâ@꨸ ä0 ]ä€ ]ãáP]˜Rä ]` ]˜RÌ ]ÿèä]äø ]äã0 ]ì â0 ] ä4]è$]ì â0 ]ðø ]êx]ø( ä`]æø( èâ ]į äˆ]â`]į 𨸠ä°]0 ]â]ˆÊäÈ]äˆÊ]ÿìä ]ïá<]øX]øt]èpøpì¨](«ä ]”ZâÔ]ôªä¸]Ä]æ âÜÈZæð]LÊää]&MæX]D æ] ]æ â]æPâL]Üè(]èâpêÜä]äl]ãá<]˜Rä|]L]˜R¸]ÿèäô]ää]äã]ì â] ä ]è]ì â]ðä]êx] ¹äL]æ ¹d]äâ <êä ]¸ äˆ]âL]¸ èâÈ]¤£ä°]âˆ]¤£è âð]°´ äØ]â°]°´ èâ]l³å]âØ]l³èâ@]ä¸ä(]ã]ä¸ðÜäP]]â¤]Ð äh]ÌkÐ ”V=òXV=öð]´ªä´]Ìk´ªüV=îÀV=ú ªå]ä ª<]ÿìäX]ïí ˜êŒ]+ ä„]|¢Râ]` äœ]ä` Ø]ááÿåäô]ä|JçDí|Jê,]ðÊä ]P[æD]x¡å<]Ô·Sâä]à* äT]äà* ]ááÿåä¬]ïDáÈ]èðRXÿè„]à?äô]äà?0]ááÿåäL]ïDáh]è4ÏPÿè$]¨* ä”]ä¨* Ð]ááÿåäì]äØ{MçDá]ÿä€%Mìà]¡å4]ä¡áp]ááÿåäŒ]ïDá¨]èðùWìÄ]è „Wÿì´ äð]ä6Mæ¸]€ ä ]ä€ H]äÿåäd]ïá€]éBJìœ]éBJùBJì]`ËäÈ]æ`Ë´OâÿåÜ]X ä]äX P]ÿìäl]ïáˆ]èlÍJì¤]èôIìÀ]è°"JøLbì˜]à¬äì]äà¬(]ááÿåäD]ïDá`]è4íIì|]èTDøTDê´]0 ä¨]ßWæÐ],àäÄ]°Kæ¨]œ@äà]äœ@]ÿìä8]ïáT]øp]èÈBìŒ]ÿôœ]¤ ä¸]ä¤ ô]ááÿåä]ïDá,]è¬@MìH]ød]è ˜ì€]ÿô ]„@ä¬]ä„@è]ááÿåä]ïDÿáP¬ä0]äP¬l]ááÿåäˆ]äœBçDá¤]èœBìÀ]èh¡KìÜ]øø]èŒëRì]èœBì0]ÿäLbì\]Ìä\]ä̘]ÿìä´]ïáÐ]èœBìì]ø]ø$]èœBì@]ÿäX-ìœ] äl]æ „]êæl]ä`RâX]ˆ­ä¬]䈭è]äÿåä]ïá ]éBJì<]éBJùBJìø]ä+ äh]ää+ ¤]ááÿåäÀ]ïDáÜ]è|Jøà›Jì ]äàå wXŒ ]Ààä ]äÀàT ]ááÿåäp ]ïDí¤_Mìd!]ÄËäœ ]äÄËØ ]ÿìäô ]ïá!]èlÍJì,!]èôIìH!]è°"JøLbì¼!]lAät!]â ¤!]lAŒ!]èæt!]äÔ^è´µŒ!]èx"]DAäÌ!]äDA"]ÿìä$"]ïá@"]èðJì\"]è|Jö|Jê¤"]d­äˆ"]”"]æ â„è\æÀ"]ì ä´"]\ Yæ¨#]° äÐ"]ä° #]ááÿåä(#]ïDáD#]è$¡Pìp#]è`#]ì â[æŒ#]è`#]ÿæÔ#](­ä¸#]Ä#]æ â°ìZêhàää#]ð#]æ ã$]æâ0$]¸:è”%]èâpê¸:å$]äP$]ãá %]˜Rä`$]0$]˜Rœ$]ÿèäØ$]äÈ$]ää$]ì ã$] ä%]èô$]ì ã$]ðÈ$]ê\%]\Ùå0%]æ\ÙáH%]äâ êä„%]Lxäl%]â0%]Lxèâ¬%]Ää”%]âl%]Äð¸:ä¼%]á$]âD*]- äÔ%]à%]æ âð%]æ<â &]`²è*]èâ@ê`²äð%]ä@&]ãá']˜RäP&] &]˜RŒ&]ÿèäÈ&]ä¸&]äãð%]ì âð%] äô&]èä&]ì âð%]ð¸&]ê8']HÌ ä ']æHÌ è8â`']dX äH']â ']dX è4âˆ']äp']âH']è2â°']tVä˜']âp']tVè0âØ']h äÀ']â ˜']h  ˜ä,ã(]œ>äè']â À']œ>ÌýQä(â((]„lä(]â è']„l ˜â$âì(]˜Åä8(]â (]˜ÅP(]ä â â`(]æä|(]ïá˜(]èÈBì´(]øÐ(]ÿô)]ô¤ äü(]â8(]ô¤ èâ<)]LÓ ä$)]âü(]LÓ èâd)]LxäL)]â$)]LxèâŒ)]_ät)]âL)]_èâ´)]ˆÚäœ)]â t)]ˆÚdžTä âÜ)]ð™äÄ)]â œ)]ð™ì¥Käâ*]Xåäì)]â Ä)]XåÈBäâ,*]>å*]âì)]>ñ`²ä<*]ð%]âÄ1]á äT*]å *]ÿìä¬*]ïá81]èÈ*]ì âØ*]æâ +]ˆæ ´0]èÈ0]ä @áp(1]æˆæ äØ*]ä(+]ãá"„,]ôOÌ+]8+]+]ôOt+]ÿèä +]ìãØ*]ø¼+]ì âØ*]èÔ+]+]ôO,]ÿèä<,]ìãØ*]ìX,]è¼+]øt,]ê âØ*] ä4-]˜Rä”,]+]˜RÐ,]ÿèäü,]ät,]äãØ*]ì-]è¼+]øt,]êä-]`RäD-]+]`R€-]âÿèä¬-]ìááØ*]êÈ-]è¼+]øPVì”.]Päô-]+]P0.]âÿèä\.]ìááØ*]êx.]è¼+]ø|Pê|/]2 ä¤.]+]2 à.]âÿèä /]ìááØ*]ê(/]è¼+]ìD/]è|Pê`/]ÿäô6Uìœ0]käŒ/]+]kÈ/]âÿèäô/]ìááØ*] ê0]è¼+]ì,0]è|PêH0]èPÏIêd0]ø€0]ÿäô6Uðˆæ ä¬0]Ø*]æˆbìØ0]Ø*]ä$ââ+]<1]ÿä$ìâ:åÀåFT1]è|Pêp1]èPÏIêŒ1]ø¨1]ÿäô6Uìœ2]®äÔ1]ä®2]ÿìä,2]ïáH2]èlÍJìd2]èôIì€2]è°"JøLbì¸2]á- ä¬2]èÙRæh3]Ä, äÈ2]äÄ, 3]ÿìä 3]ïáL3]è<3]ì âX_Wò¤_Mìd7]x£åx3]„3]æPâ´3]œè47]èâpêœä„3]äÔ3]ãá¤4]˜Rää3]´3]˜R 4]ÿèä\4]äL4]äã„3]ì â„3] äˆ4]èx4]ì â„3]ðL4]êÌ4]@Ûä´4]æ@Û|JäLâô4]„LåÜ4]â´4]„Lá|JäHâ5]`Y ä5]â Ü4]`Y |JäDâD5]Hä,5]â 5]H|Jä@âl5]& äT5]â,5]& è8â”5]¤uä|5]â T5]¤uRä,â¼5]|Eä¤5]â |5]|E|Jä(âä5]l®äÌ5]â ¤5]l®|Jä$â 6]ŒÝäô5]â Ì5]ŒÝ|Jä â46]tGä6]â ô5]tG|Jäâ\6]ìù äD6]â 6]ìù |Jäâ„6]¬5äl6]â D6]¬5|Jäâ¬6]dä”6]â l6]d|JäâÔ6]°ä¼6]â ”6]°|Jä âü6]È/ ää6]â ¼6]È/ |Jäâ$7] cå 7]âä6] cá|JäâL7]01å47]â 7]01ñœä\7]„3]â9]Эät7]|7]ââ¬7]Эèè8]èâpêЭä|7]äÌ7]ãáœ8]˜RäÜ7]¬7]˜R8]ÿèäT8]äD8]äã|7]ì â|7] ä€8]èp8]ì â|7]ðD8]êØ8]Ìžä¬8]æÌžÄ8]äâ êå9]¤õäè8]â¬8]¤õðЭä9]|7]âÀ;]˜, ä(9]ä˜, d9]ááÿåä€9]ïDáœ9]è ˜ê¸9]è„gTê”;]èÔ9]ì âä9]æ â:]`èd;]èâpê`ää9]ä4:]ãá;]˜RäD:]:]˜R€:]ÿèä¼:]ä¬:]äãä9]ì âä9] äè:]èØ:]ì âä9]ð¬:]ê,;]È ä;]æÈ œBäâT;]ls ä<;]â;]ls èâ|;]ìâäd;]â<;]ìâð`äŒ;]ä9]î°;]ì âT¯Sæì<]T£åÐ;]äT£á <]ááÿåä(<]ïDáD<]èèQì`<]èTDì|<]ø˜<]èTDì´<]èLbìÐ<]èTDøLbìX?]8 äü<]=]æâ8=]˜A è(?]èâpê˜A ä=]äX=] ãá(>]˜Räh=]8=]˜R¤=]ÿèäà=]äÐ=]äã=]ì â=] ä >]èü=]ì â=]ðÐ=]êP>]Xß ä8>]æXß ˜äâx>]<åä`>]â8>]<åèâ >]Ä[äˆ>]â `>]Ä[TDäâÈ>]päå°>]âˆ>]päé âð>]4‰äØ>]â °>]4‰¸ëLäâ?]¤>å?]â Ø>]¤>¸ëLäâ@?]tùä(?]ã?]tùð˜A äP?]=]â„?]ÄAäh?]t?]æ â€ÜPæØ?]LÌä”?] ?]æä¼?]ïáÌÚNèœBì@]¸­äè?]ô?]æ âè¥Pê8, ä@]\-æø@]Œ ä0@]äŒ l@]ÿìäˆ@]ïá¤@]øÀ@]øÜ@]èœBÿèÐA] ¤åA]ä ¤áDA]ÿìä`A]ïá|A]èlÍJì˜A]èôIì´A]è°"JøLbìŒB]àÌäàA]äàÌB]ÿìä8B]ïáTB]è óRìpB]ÿô,C]” äœB]ä” ØB]ÿìäôB]ïáC]è˜ÝKøÔDìD]d ääÐF]â¨F]p>èâG]ìâäøF]âÐF]ìâðä£å G]PE]âdH]ˆBä8G]äˆBtG]ÿìäG]ïá¼G]è¬G]ì âøKæØG]èLbìôG]èLbìH]èTDì,H]øHH]è|Jÿæä„X]â \X]œ>ÌýQä(âÄX]„lä¬X]â „X]„l|Jâ$âìX]˜ÅäÔX]â ¬X]˜ÅP(]ä âY]ô¤ äüX]âÔX]ô¤ èâåZ]âìY]>ñˆ­äYâ(‡]Ð ä ‡]$¼JâŒ]ܱä8‡]@‡]â€âp‡]ܱèà‹]èâpêܱä@‡]ä‡]ãá`ˆ]˜Rä ‡]p‡]˜R܇]ÿèäˆ]äˆ]äã@‡]ì â@‡] äDˆ]è4ˆ]ì â@‡]ðˆ]ꈈ]lYäpˆ]ælYè|â°ˆ]¬øä˜ˆ]âpˆ]¬øèxâ؈]à4äÀˆ]☈]à4ètã‰]Ôoäèˆ]âÀˆ]Ôoèpâ(‰]ðOå‰]âèˆ]ðOélâP‰]8³ä8‰]â‰]8³èhâx‰](–ä`‰]â8‰](–èdâ ‰], 䈉]â`‰], è`âȉ]t ä°‰]∉]t è\âð‰]ü¯ä؉]â°‰]ü¯èXâŠ] åŠ]â؉] èTâ@Š]W ä(Š]ãŠ]W èPâhŠ]üäPŠ]â(Š]üèLâŠ]„äxŠ]â PŠ]„ÄÁJä4⸊]ìWä Š]âxŠ]ìWè0âàŠ]$iäÈŠ]â Š]$iè,â‹]h—äðŠ]âÈŠ]h—è(â0‹] ó ä‹]âðŠ] ó è$âX‹]ôý ä@‹]â‹]ôý è ​]˜ äh‹]â@‹]˜ è⨋]@– ä‹]âh‹]@– èâЋ]øV下]â ‹]øV,ÅJäâø‹]̉ äà‹]â ¸‹]̉ ,ÇJìܱäŒ]@‡]â<Œ]À±ä Œ],Œ]æ âd7[æl]T/ äLŒ]äT/ ˆŒ]ááÿå䤌]ïDáÀŒ]èœBìÜŒ]èœBìøŒ]øüŽ]è]ì â$]æâT]H†èÌŽ]èâpêH†ä$]ät]ãáDŽ]˜Rä„]T]˜RÀ]ÿèäü]äì]äã$]ì â$] ä(Ž]èŽ]ì â$]ðì]êlŽ]°ôäTŽ]æ°ôè ┎]T@å|Ž]âTŽ]T@é⼎]„Ç䤎]â|Ž]„ÇèâäŽ]¬¹ äÌŽ]⤎]¬¹ ðH†äôŽ]$]â]è°d]ì4]èLbìP]èLbøîìˆ]áÏä|]0\æh‘]äÎä˜]¤]æâÔ]œè8‘]èâpêœä¤]äô]ãáÄ]˜Rä]Ô]˜R@]ÿèä|]äl]äã¤]ì â¤] ä¨]è˜]ì â¤]ðl]ë‘]Ú äÔ]æÚ ì]äâ ò(‘]àaä‘]âÔ]àaèâP‘]¼{ ä8‘]â‘]¼{ ðœä`‘]¤]æ€ääx‘]Ìk€ä8_>òü^>öБ]ÄåäÄ‘]Œ$\æp’] äà‘]ä ’]ááÿåä8’]ïDáT’]ÿäì“]$F䀒]ä$F¼’]ááÿå䨒]ïDáô’]ÿäÔDìè“]¨§å “]䨧á\“]ÿìäx“]ïᔓ]èlÍJì°“]èôIìÌ“]è°"JøLbìÀ”]ìEäø“]äìE4”]ÿìäP”]ïál”]èlÍJ숔]èôI줔]è°"JøLbìÜ”]´ÏäД]˜Tæì”]ÔEä ØêLü”]X§å „«J•]°Eä •]èŒUâì•]á ä$•]å `•]ááÿåä|•]ïDᘕ]ø´•]èLbìЕ]ÿäLb쌖]tÏäü•]ätÏ8–]ááÿåäT–]ïDáp–]èœBøØf쨖]à 䜖],™Qæ(—]„å世]Ä–]æ âÔ–]æäð–]ïá —]ÿô—]€Eä8—]ä€Et—]ááÿå÷Dᬗ]hEä —]tK]æÈ—](0 ä¼—]<²Mê0 䨗]ꄘ]è äô—]äè 0˜]ááÿåäL˜]ïDáh˜]ÿäX-ì\™]¼ 䔘]ä¼ И]ÿìäì˜]ïá™]èlÍJì$™]èôIì@™]è°"JøLbì4š]LÐäl™]äLШ™]ÿìäÄ™]ïáà™]èlÍJìü™]èôIìš]è°"JøLbì ›]P¨åDš]äP¨á€š]ÿì䜚]ïḚ]èä MìÔš]øðš]èìdJøpìä›] Ðä›]ä ÐX›]ÿìät›]ïá›]èlÍJ쬛]èôIìÈ›]è°"JøLbíœ]1 äô›]äsW漜]T äœ]äT Lœ]ÿìähœ]ïᄜ]èLbì œ]ÿäÌ9Nì\]ðÏäÌœ]äðÏ]ÿìä$]ïá@]è¤âTøðJì4ž]ì0 äl]äì0 ¨]ÿìäÄ]ïáà]èlÍJìü]èôIìž]è°"JøLbìÔž]À0 äDž]äÀ0 €ž]ÿì䜞]ïḞ]èð•[ÿè<£]æ,£]äž]ðž]æâ Ÿ]樢]è¼¢]ä @áp£]ææäðž]ä@Ÿ]ãá"œ ]ôOäŸ]PŸ] Ÿ]ôOŒŸ]ÿè丟]ìãðž]øÔŸ]ì âðž]èìŸ] Ÿ]ôO( ]ÿèäT ]ìãðž]ìp ]èÔŸ]øŒ ]ê âðž] äL¡]˜R䬠] Ÿ]˜Rè ]ÿèä¡]䌠]äãðž]ì0¡]èÔŸ]øŒ ]êà¡]\ ä\¡] Ÿ]\ ˜¡]âÿèäÄ¡]ìááðž]öÔŸ]ì¢]8ìäð¡] Ÿ]8ì,¢]âÿèäX¢]ìááðž] êt¢]èÔŸ]ÿìæä ¢]ðž]æˆbìÌ¢]ðž]äââ Ÿ]ˆQ£]ÿäìâ)æÀåFã4£]ðž]â0¤]0 äL£]ä0 ˆ£]ááÿå䤣]ïDáÀ£]è¼p-ìÜ£]øø£]èœBì¤]èœBøŒÇZìL¤]Œ²ä@¤] [æì¤]Ì ä\¤]äÌ ˜¤]ááÿåä´¤]ïDáФ]ÿä ˜ìp¥]ÐÏäü¤]äÐÏ8¥]ááÿåäT¥]ïDíx±KðÜå䀥]<'WæH¦]H©åœ¥]äH©áØ¥]ÿìäô¥]ïá¦]èœBì,¦]èTDÿèè¦]4 äX¦]ä4 ”¦]ááÿåä°¦]ïDá̦]ÿäì§]ìF§]ø¦]$ëKê §]$ëK⸩]Ñä$§]0§]æ â@§]æ âp§]pÁ 舩]èâpêpÁ ä@§]ä§] ãá`¨]˜Rä §]p§]˜Rܧ]ÿèä¨]ä¨]äã@§]ì â@§] äD¨]è4¨]ì â@§]ð¨]ꈨ]á¡äp¨]ç¡ÜóLäâ°¨]Ðu䘨]â p¨]ÐuÜóLäâب]Û äÀ¨]â ˜¨]Û ¬Käã©]Xsäè¨]â À¨]Xs¬Käâ(©]Hå©]âè¨]HáœBä âP©]˜“ä8©]â©]˜“èâx©]8¹ä`©]â8©]8¹èâ ©]´äˆ©]â`©]´ðpÁ ä°©]@§]âª]øÐäÈ©]äøÐª]ááÿåä ª]ïDá<ª]èßPìXª]è|Jêtª]è|Jö|Jꬪ]IJä ª]„ÚNæ «]¸Ð伪]ä¸Ðøª]ááÿåä«]ïDá0«]èÈBìL«]øh«]ø„«]ÿô$¬]¤¨å°«]䤨áì«]ááÿåä¬]ïDíì¥Kìð­]¤²ä4¬]@¬]æ âp¬](èÀ­]èâ`ê(ä@¬]ä¬]ãá`­]˜Rä ¬]p¬]˜Rܬ]ÿèä­]ä­]äã@¬]ì â@¬] äD­]è4­]ì â@¬]ð­]ꈭ]räp­]ærèâ°­]¨w嘭]âp­]¨wéâØ­]Ø• äÀ­]☭]Ø• ð(äè­]@¬]æpÐå®]tz\æä®]P³ä®]äP³X®]ÿìät®]ïá®]èœB쬮]èTDìÈ®]ÿäÔDì ¯]4³äô®]ä4³0¯]ÿìäL¯]äTDçáh¯]èLb섯]èTDø˜RMìx°]ܩ尯]äÜ©áì¯]ÿìä°]ïá$°]èlÍJì@°]èôIì\°]è°"JøLb줰]$G䈰]”°]æ â|7]æ`±]¬ ä´°]ä¬ ð°]ááÿåä ±]ïDá(±]è4íIìD±]èTDøTDêd³]ì äp±]|±]æ ⌱]æâ¼±]8{è4³]èâpê8{䌱]äܱ]ãᬲ]˜Räì±]¼±]˜R(²]ÿèäd²]äT²]ä㌱]ì ⌱] ä²]耲]ì ⌱]ðT²]êÔ²]È– ä¼²]æÈ– è âü²] Ï ää²]â ¼²] Ï œBäâ$³]8kä ³]âä²]8kèâL³]„Ûä4³]â ³]„Û|Jì8{ä\³]Œ±]â„´]È1 ät³]äÈ1 °³]ááÿåä̳]ïDáè³]èì¥Kìh´]è´]ì â´]æä0´]ïáL´]è|Jÿÿ䜴] ä”´]^[æd©å¬´]´´]ââä´]d©é ¹]èPêd©å´´]äµ]ãáÔµ]˜Räµ]ä´]˜RPµ]ÿè䌵]ä|µ]äã´´]ì â´´] 丵]訵]ì â´´]ð|µ]ê ¸]Ðääµ]æÐüµ]èâ,¶]>èô·]èâPæä´]>äüµ]äL¶]ãá·]˜Rä\¶],¶]˜R˜¶]ÿèäÔ¶]äĶ]äãüµ]ì âüµ] å·]èð¶]ì âüµ]ðĶ]êD·] p ä,·]æ p èâl·]úäT·]â,·]úè â”·]T·ä|·]âT·]T·èâ¼·]”䤷]â|·]”èâä·]¼/äÌ·]⤷]¼/èæÄäô·]âÌ·]Äì¹]è ä¸]â äµ]è 4¸]èâd¸]T`èd¹]èâPæä´]T`ä4¸]䄸]ãáT¹]˜R䔸]d¸]˜Rи]ÿèä ¹]äü¸]äã4¸]ì â4¸] ä8¹]è(¹]ì â4¸]ðü¸]îÌžäd¹]æÌž|¹]è êä”Â]dËä ¹]â ¸]d˸¹]èâè¹] ® è|Â]èâPæä´] ® 丹]äº]ãáغ]˜Räº]è¹]˜RTº]ÿèäº]䀺]ä㸹]ì ⸹] 伺]謺]ì ⸹]ð€º]ë»]<‘äèº]æ<‘èâd¿]Êä»]â èº]Ê(»]äââX»]HN èܽ]èPæè¹]HN ä(»]äx»]ãáH¼]˜R䈻]X»]˜RÄ»]ÿèå¼]äð»]äã(»]ì â(»] ä,¼]è¼]ì â(»]ðð»]ê̽]¸—äX¼]渗p¼]èâ ¼]L„è ½]èâPæX»]L„äp¼]äÀ¼]ãá½]˜Räм] ¼]˜R ½]ÿèäH½]ä8½]äãp¼]ì âp¼] ät½]èd½]ì âp¼]ð8½]îŽä ½]掸½]è êè ¬äܽ]â X¼] ¬ô½]èâ$¾]X¨èL¿]èâPæX»]X¨äô½]äD¾]ãá¿]˜RäT¾]$¾]˜R¾]ÿèä̾]ä¼¾]äãô½]ì âô½] äø¾]èè¾]ì âô½]ð¼¾]ê<¿]ôÈä$¿]æôÈèæ¤¸äL¿]â$¿]¤¸ìlÂ]Œ^ ät¿]â »]Œ^ Œ¿]äâ⼿]° èäÀ]èPæè¹]° 䌿]äÜ¿]ãá¬À]˜Räì¿]¼¿]˜R(À]ÿèädÀ]äTÀ]ä㌿]ì ⌿] äÀ]è€À]ì ⌿]ðTÀ]êÔÀ]œcä¼À]æœcð(8ääÀ]â ¼À](8üÀ]èâ,Á]ôh èTÂ]èâP漿]ôh äüÀ]äLÁ]ãáÂ]˜Rä\Á],Á]˜R˜Á]ÿèäÔÁ]äÄÁ]äãüÀ]ì âüÀ] åÂ]èðÁ]ì âüÀ]ðÄÁ]êDÂ]è ä,Â]æè èæàâ äTÂ]â,Â]àâ ð`@ ä|Â]ât¿]`@ ðd©å¤Â]´´]âHÄ]pªå¼Â]äpªáøÂ]ÿìäÃ]ïá0Ã]èœBìLÃ]øhÃ]èTDì„Ã]ø Ã]èÔDì¼Ã]èÔDìØÃ]èÔDìôÃ]èX-ìÄ]èÔDì,Ä]èÔDøÔDìdÄ]ÌGäXÄ]D¶LætÄ]p2 ä <¿NÄ] çä„Ä]\aJæ¨Ä]Òä Ä]ükQâÄÄ]h ä¸Ä]Zæ¼Ç]ˆGäÔÄ]äˆGÅ]ááÿåä,Å]ïDá0Ç]èHÅ]ì âXÅ]æâˆÅ]xéÇ]èâpêxäXÅ]ä¨Å]ãáxÆ]˜Rä¸Å]ˆÅ]˜RôÅ]ÿèä0Æ]ä Æ]äãXÅ]ì âXÅ] ä\Æ]èLÆ]ì âXÅ]ð Æ]ê Æ]h¦äˆÆ]æh¦Øfä âÈÆ]øIä°Æ]âˆÆ]øIèâðÆ]Å娯]â°Æ]ÅéâÇ]ìâåÇ]âØÆ]ìâðxä(Ç]XÅ]âLÇ]èTDêhÇ]ø„Ç]èTDì Ç]èLbø jRêØÇ]¬³äÌÇ]Ô¹Uê< äèÇ]ä< $È]ááÿåä@È]äÈBçDá\È]èÈBìxÈ]èÈBì”È]è|Jö|JêlÉ]Ä äÀÈ]äÄ üÈ]äÿåäÉ]ïá4É]éBJìPÉ]éBJùBJì Ê]d ä|É]äd ¸É]ááÿåäÔÉ]ïDáðÉ]ÿä ˜ì¬Ê]¬ äÊ]ä¬ XÊ]ááÿåätÊ]ïDáÊ]ÿäìLË]`Hä¼Ê]ä`HøÊ]ááÿåäË]ïDá0Ë]ÿäÔDì$Ì]8 ä\Ë]ä8 ˜Ë]ÿìä´Ë]ïáÐË]èlÍJììË]èôIìÌ]è°"JøLbìüÌ]ì ä4Ì]äì pÌ]ÿìäŒÌ]ïá¨Ì]èlÍJìÄÌ]èôIìàÌ]è°"JøLbìHÍ]è2 ä Í]æè2 œBäÿåXÎ]àªåXÍ]äàªá”Í]ÿìä°Í]ïáÌÍ]èœBìèÍ]øÎ]èTDì Î]ø<Î]èLbøLbì Ð]$çähÎ]pÎ]â$â Î]$çèðÏ]èâpê$çäpÎ]äÀÎ]ãáÏ]˜RäÐÎ] Î]˜R Ï]ÿèäHÏ]ä8Ï]äãpÎ]ì âpÎ] ätÏ]èdÏ]ì âpÎ]ð8Ï]ê¸Ï]œŠä Ï]朊´OäâàÏ]ÀäÈÏ]â  Ï]À´OäâÐ]päðÏ]âÈÏ]pð$çäÐ]pÎ]âüÑ]¨ªå0Ð]<Ð]æ âLÐ]æâ|Ð]`èÌÑ]èâ@ê`äLÐ]äœÐ]ãálÑ]˜Rä¬Ð]|Ð]˜RèÐ]ÿèä$Ñ]äÑ]äãLÐ]ì âLÐ] äPÑ]è@Ñ]ì âLÐ]ðÑ]ê”Ñ] 7ä|Ñ]æ 7è â¼Ñ]Hw ä¤Ñ]â|Ñ]Hw èâäÑ]ìâäÌÑ]â¤Ñ]ìâð`äôÑ]LÐ]âðÒ]8Hä Ò]ä8HHÒ]ááÿåädÒ]ïDá€Ò]èœBìœÒ]è¼p-ì¸Ò]øÔÒ]ètºJøLbì Ó]HåÓ]0Zæ¬Ó]áHäÓ]åHXÓ]ááÿåätÓ]ïDáÓ]è|Jöh¡Kì Ô]ô³ä¼Ó]äô³øÓ]ááÿåäÔ]ïDá0Ô]è|JêLÔ]è|JêhÔ]èœBì„Ô]ÿä|Jîijä°Ô]äijìÔ]ÿìäÕ]ïá$Õ]è ˜ê@Õ]èKöKêPÖ]ŒÒälÕ]äŒÒ¨Õ]ÿìäÄÕ]ïáàÕ]èœBìüÕ]øÖ]èœBì4Ö]ÿäÔDìlÖ]Ä´ä`Ö]à%]æ(×]° ä|Ö]ä° ¸Ö]ÿìäÔÖ]ïáðÖ]è¬ÖLì ×]è|JùBJìT×]Ð3 D×]8×]œHMêL×]œHMâ¼×]”«åd×]䔫á ×]ááÿå÷DáÔ×]ÈHäÌ×]‹Uâð×]°Hää×][Sæ8Ù]  åØ]ä  <Ø]ááÿåäXØ]ïDátØ]øØ]ø¬Ø]øÈØ]èœBìäØ]ùÙ]èœBìÙ]ÿäœBìðÛ] äHÙ]PÙ]âDâ€Ù] èÀÛ]èâpê äPÙ]ä Ù] ãápÚ]˜Rä°Ù]€Ù]˜RìÙ]ÿèä(Ú]äÚ]äãPÙ]ì âPÙ] äTÚ]èDÚ]ì âPÙ]ðÚ]ê˜Ú]Lxä€Ú]æLxè@âÀÚ]ä’ ä¨Ú]â €Ú]ä’ œBâ<âèÚ]TŽäÐÚ]â¨Ú]TŽè8âÛ]”÷äøÚ]â ÐÚ]”÷„EOä4â8Û]ø¯ ä Û]âøÚ]ø¯ è0â`Û]´äHÛ]â Û]´p¿Vä,âˆÛ]èläpÛ]â HÛ]èlà$Jäâ°Û]@Æä˜Û]â pÛ]@Æà$JäâØÛ]ÄäÀÛ]â˜Û]Äð äèÛ]PÙ]â Ü]D´åÜ]îSæ¬Ü]¨çäÜ]ä¨çXÜ]ááÿåätÜ]ïDáÜ]èì¥Kø|Jì Ý]€çä¼Ü]ä€çøÜ]ááÿåäÝ]ïDá0Ý]è|JêLÝ]è|JêhÝ]èœBì„Ý]è°d]ÿèxß] ä°Ý]ä ìÝ]ÿììÞ]ê âÞ]æâHÞ]¨ÌèHß]èâpê¨ÌäÞ]ähÞ]ãá8ß]˜RäxÞ]HÞ]˜R´Þ]ÿèäðÞ]äàÞ]äãÞ]ì âÞ] äß]è ß]ì âÞ]ðàÞ]ê`ß]L äHß]æL €;Jì¨Ìäpß]Þ]æ<«åˆß]ä<«áÄß]ÿìäàß]ä ˜êüß]è ˜êà]è ˜ÿæ á]tµäDà]ätµ€à]ÿìäœà]ïá¸à]èlÍJìÔà]èôIìðà]è°"JøLbìÈá]^¸9 ä>^ä¸9 P>^ÿìäl>^ïáˆ>^èœBÿè´?^ð ä´>^äð ð>^ááÿåä ?^ïDá(?^øD?^èTDê`?^ø|?^ø˜?^è ˜ÿæT@^À°åÄ?^äÀ°â@^ááÿåä@^ïDá8@^èPÏIøX-ìl@^Píäd@^t9Vâˆ@^h$ ä|@^„a]æ A^¬ ä˜@^ä¬ Ô@^ááÿåäð@^ïDíÜ9NìäA^ äA^ä XA^ááÿåätA^ïDáA^èÈBì¬A^øÈA^è|Jÿè„B^8$ äôA^ä8$ 0B^ááÿåäLB^ïDáhB^èì¥Kÿè B^8íä”B^žTæ@C^$íä°B^ä$íìB^ááÿåäC^ïDá$C^è ˜ö ˜êüC^$$ äPC^ä$$ ŒC^ááÿåä¨C^äœBçDáÄC^èœBìàC^ÿôD^á×ä D^,-Oæ@F^`°å(D^0D^ââ`D^`°éF^èâpê`°å0D^ä€D^ãáPE^˜RäD^`D^˜RÌD^ÿèäE^äøD^äã0D^ì â0D^ ä4E^è$E^ì â0D^ðøD^êˆE^Œ-ä`E^æŒ-xE^äâ â4Zæ°E^ˆ®ä˜E^â `E^ˆ®ÀîMä âØE^ ½ äÀE^â ˜E^ ½ xE^äãF^ äèE^â ÀE^ œBäâ(F^4AäF^âèE^4Að`°å8F^0D^â¨F^¸PäPF^ä¸PŒF^ÿììD9SêÄF^˜Pä¸F^È{Lê|9 G^ÔF^Ìk|9 º?æêܹ?úG^Ìk|9 °º?îtº?öôG^ô: ädG^äô:  G^äÿåä¼G^ïáØG^èšJøšJìxH^Ü: äH^äÜ: @H^ááÿåä\H^ïDîBJìH^¼×äˆH^d;SâÜH^èíä H^æèí´OâÿåìH^Ü$ ä ¼ÕJÄI^D±åüH^äD±á8I^ÿìäTI^ïápI^èlÍJìŒI^èôIì¨I^è°"JøLbì¸J^ÌíäÔI^äÌíJ^ááÿåä,J^ïDáHJ^è|PêdJ^è„ëIì€J^øœJ^è|PöØfìK^t: äÈJ^ät: K^ÿìä K^ïáNâ´M^°íäÑLä”íäÄM^ä”íáN^ÿìì ¿UêôN^Œîä,N^äŒîhN^ÿìä„N^ïá N^è0ãQì¼N^èLbìØN^èLbø„æQì”O^`; äO^ä`; @O^ÿìä\O^ïáxO^è˜Õ[ø8oì¤P^D; ä¤O^äD; àO^ÿìäüO^ïáP^èœBì4P^è|JìPP^èLbìlP^èTDìˆP^ÿäLbì˜T^бå´P^ÀP^æ âðP^2èhT^èâpê2äÀP^äQ^ãáàQ^˜Rä Q^ðP^˜R\Q^ÿèä˜Q^äˆQ^äãÀP^ì âÀP^ äÄQ^è´Q^ì âÀP^ðˆQ^êR^¡äðQ^æ¡èâ0R^˜]äR^âðQ^˜]èâXR^à’ ä@R^âR^à’ èâXT^¬XähR^â @R^¬X€R^äââ°R^ì6 è(T^èâpêì6 ä€R^äÐR^ãá S^˜RäàR^°R^˜RS^ÿèäXS^äHS^äã€R^ì â€R^ ä„S^ètS^ì â€R^ðHS^êÈS^0æä°S^æ0æè âðS^¡äØS^â°S^¡èâT^˜]åT^âØS^˜]èâ@T^ÔÀ ä(T^ãT^ÔÀ ðì6 äPT^€R^â€T^3ähT^âhR^3ð2äT^ÀP^â´T^´% ä ¨T^|JäàT^pQÐT^ÄT^ôIêØT^ôIâÔW^8ØäðT^üT^æ â U^æ(â äô~^äx> 0^ááÿåäL^ïDí|Jìx^T> ä ¼%Nˆ^\Tä 8rJ@^`´å˜^ä`´áÔ^ÿìäð^ïá €^è(œJì(€^øD€^è|Pê`€^ø|€^ø˜€^èÔ‰Jì´€^éBJìЀ^èŠJìì€^èpì^ø$^èpùBJì\^X! äP^hEæ˜^Ô¾äl^x^æ âˆ^æâ¸^¸¾è¸‚^èâp긾äˆ^äØ^ãᨂ^˜Räè^¸^˜R$‚^ÿèä`‚^äP‚^äãˆ^ì âˆ^ 䌂^è|‚^ì âˆ^ðP‚^êЂ^˜Ó 丂^æ˜Ó „ëIè€^(äà‚^è‚^ââƒ^(èP^èâpæ¸^(äè‚^ä8ƒ^ãá„^˜RäHƒ^ƒ^˜R„ƒ^ÿèäÀƒ^ä°ƒ^äãè‚^ì âè‚^ äìƒ^è܃^ì âè‚^ð°ƒ^ê(^x.å„^æx.á0„^äââ`„^<îèøŒ^èpæƒ^<îä0„^䀄^ ãáP…^˜Rä„^`„^˜RÌ„^ÿèä…^äø„^äã0„^ì â0„^ ä4…^è$…^ì â0„^ðø„^êx…^„ïä`…^æ„ï`Qè …^´ô䈅^â `…^´ô`QèÈ…^,A ä°…^â ˆ…^,A |Jèð…^Ô* 䨅^â °…^Ô* $?S舉^àŸ å†^â Ø…^àŸ †^è â(†^æâX†^„äèX‰^èâpê„ää(†^äx†^ãáH‡^˜R䈆^X†^˜RĆ^ÿèå‡^äð†^äã(†^ì â(†^ ä,‡^è‡^ì â(†^ðð†^ê0‰^x.åX‡^æx.áp‡^äââ ‡^øîèðˆ^èpæX†^øîäp‡^äÀ‡^ãáˆ^˜RäЇ^ ‡^˜R ˆ^ÿèäHˆ^ä8ˆ^äãp‡^ì âp‡^ ätˆ^èdˆ^ì âp‡^ð8ˆ^금^¥ ä ˆ^æ¥ $?Sèàˆ^®äȈ^â  ˆ^®d„Oè‰^tü äðˆ^â Ȉ^tü ‰^è ãÝSêøîä(‰^p‡^âH‰^øîä@‰^p‡^âp‰^8N äX‰^âX‡^8N ð„ä䀉^(†^âèŒ^˜4䘉^ã †^˜4°‰^è âÀ‰^æâð‰^À踌^èâpêÀäÀ‰^äŠ^ãáàŠ^˜Rä Š^ð‰^˜R\Š^ÿè䘊^䈊^äãÀ‰^ì âÀ‰^ äÄŠ^è´Š^ì âÀ‰^ðˆŠ^êŒ^x.åðŠ^æx.á‹^äââ8‹^x”è`Œ^èpæð‰^x”ä‹^äX‹^ãá(Œ^˜Räh‹^8‹^˜R¤‹^ÿèäà‹^äЋ^äã‹^ì â‹^ ä Œ^èü‹^ì â‹^ðЋ^êPŒ^œ¤å8Œ^朤á`QèxŒ^Èð ä`Œ^â8Œ^Èð ðx”䈌^‹^⨌^x”ä Œ^‹^âÐŒ^àÉ丌^âðŠ^àÉðÀäàŒ^À‰^â^´¡äøŒ^â ˜‰^´¡ÈQì<îä ^0„^â@^<îä8^0„^âh^TÚäP^â„^TÚð(äx^è‚^渾ä^ˆ^â°^¸¾ä¨^ˆ^∎^D´åÀ^äD´áü^ÿìäŽ^ïá4Ž^èlÍJìPŽ^èôIìlŽ^è°"JøLb줎^¸ñ䘎^PE]æ”^ ( ä´Ž^¼Ž^ââìŽ^ ( èd^èâpê ( 伎^ä ^ãáÜ^˜Rä^ìŽ^˜RX^ÿèä”^ä„^ä㼎^ì ⼎^ äÀ^è°^ì ⼎^ð„^ê^ W äì^æ W è â,^Œ} ä^â ì^Œ} TDäâT^è® ä<^â^è® èâ|^T›äd^â<^T›ð ( äŒ^¼Ž^âÀ‘^T¾ä¤^äT¾à^ááÿåäü^ïDá‘^èœBì4‘^øP‘^øl‘^èœB숑^ø¤‘^èLbøLbðü= äБ^äü= ’^ÿì÷áä’^$? ä8’^ä$? t’^äÿåä’^ïᬒ^øÈ’^ÿä켓^ì( äô’^äì( 0“^ÿìäL“^ïáh“^èlÍJì„“^èôIì “^è°"JøLbìÌ“^? ä ü‚[è“^ô! äÜ“^œBæP”^Ô! äø“^äÔ! 4”^ááÿå÷Dá¼–^¬! ä`”^l”^æ ✔^¼èŒ–^èâpê¼äl”^ä¼”^ ãጕ^˜RäÌ”^œ”^˜R•^ÿèäD•^ä4•^äãl”^ì âl”^ äp•^è`•^ì âl”^ð4•^ê´•^áÂ䜕^çÂèâÜ•^´Ï äÄ•^✕^´Ï èâ–^Ęäì•^âÄ•^Ęèâ,–^¬â ä–^âì•^¬â èâT–^€„ ä<–^â–^€„ è â|–^|2 äd–^â<–^|2 è⤖^̉ 䌖^â d–^̉ ,ÇJì¼ä´–^l”^âè–^¸> äÌ–^Ø–^æ â ç]êT¿äø–^—^æ â—^æ âD—^hr蔘^èâpêhrä—^äd—^ãá4˜^˜Rät—^D—^˜R°—^ÿèäì—^äÜ—^äã—^ì â—^ ä˜^è˜^ì â—^ðÜ—^ê\˜^´}äD˜^æ´}è℘^|^ äl˜^âD˜^|^ è⬘^ð䔘^â l˜^ð¼tLìhr优^—^âd™^@" äÔ˜^ä@" ™^ÿìä,™^ïáH™^èLbø€VNì°™^¸? ät™^æ¸? ´OâÿåDŸ^ " äÀ™^ä " ü™^ÿìäš^ïá(Ÿ^è4š^ì âDš^æâ tš^$h ¤ž^踞^ä @ápŸ^æ$h äDš^䔚^ãá"ð›^ôO8›^¤š^tš^ôOàš^ÿèä ›^ìãDš^ø(›^ì âDš^è@›^tš^ôO|›^ÿè䨛^ìãDš^ìÄ›^è(›^øà›^ê âDš^ ä œ^˜Råœ^tš^˜R<œ^ÿèähœ^äà›^äãDš^서^è(›^øà›^êP^p¾ä°œ^tš^p¾ìœ^âÿèä^ìááDš^ê4^è(›^øðJ쌞^´éå `^tš^´éáœ^âÿèäÈ^ìááDš^ êä^è(›^íž^èðJìž^ø8ž^øTž^èLbìpž^èLbø„ÎUð$h 䜞^Dš^æˆbìÈž^Dš^äââtš^LÉŸ^ÿäìâ Ç–v\Ñ†áø°WëðJì`Ÿ^@ÛäTŸ^ôIKæ|Ÿ^T) äpŸ^‡Oæ ^\ò䌟^ä\òÈŸ^ááÿåääŸ^ïDâ ^èœBÿè4 ^@) ä, ^ä6Mæ8òäD ^Ìk8òØØ?òœØ?ö ¡^t* ä ^ät* Ì ^ááÿåäè ^ïDá¡^ÿä¼p-ìÀ¡^4Üä0¡^ä4Ül¡^ááÿå䈡^ïDᤡ^ÿäÔDì ¢^ÜÛäС^æÜÛ´Oâÿæ£^P@ ä¢^äP@ X¢^ÿìät¢^ïá¢^èÌ‹L쬢^èPÏIìÈ¢^èLbìä¢^è8oÿè £^äµå£^ääµáL£^ÿìäh£^ïá„£^è(áJøX-ì@¤^$@ ä°£^ä$@ ì£^ÿìä¤^ïá$¤^èÄûKùBJì¥^¼ÛäP¤^ä¼ÛŒ¤^ÿì䨤^ïáĤ^èlÍJìà¤^èôIìü¤^è°"JøLbìð¥^hUä(¥^ähUd¥^ááÿå䀥^äTDçDᜥ^è4íI츥^è)JìÔ¥^èTDÿæ¦^ @ å¦^øKâ§^¬µå¦^䬵áT¦^ÿìäp¦^ïጦ^ø¨¦^è ˜êĦ^øà¦^øü¦^è€TOÿ怩^”µå(§^4§^æ âD§^æ0ât§^T1èP©^èâ@êT1äD§^ä”§^ãád¨^˜R䤧^t§^˜Rà§^ÿèä¨^ä ¨^äãD§^ì âD§^ äH¨^è8¨^ì âD§^ð ¨^ꌨ^@» ät¨^æ@» è,â´¨^Èp䜨^ât¨^Èpè(âð¨^dÕäĨ^â œ¨^dÕܨ^äâ ê ä©^¸Úå©^âĨ^¸Úèâ@©^Ôp ä(©^ã©^Ôp èâh©^ô"äP©^â(©^ô"ðT1äx©^D§^â<ª^X" ä©^äX" Ì©^ááÿåäè©^ïDáª^è Sì ª^ÿôܪ^à) äLª^äà) ˆª^ááÿå䤪^ïDáÀª^ÿô`«^°) äìª^ä°) («^ááÿåäD«^ïDíì¥Kì<­^|µåp«^|«^æ ⌫^æ ⼫^,–è ­^èâpê,–䌫^äÜ«^ãᬬ^˜Räì«^¼«^˜R(¬^ÿèäd¬^äT¬^ä㌫^ì ⌫^ ä¬^耬^ì ⌫^ðT¬^êÔ¬^(k伬^æ(kHÅQäâü¬^$ää¬^⼬^$èâ$­^Ôä ­^âä¬^Ôð,–ä4­^Œ«^âÜ­^4UäL­^ä4Uˆ­^ááÿå䤭^ïDáÀ­^èœBø,ËNêì­^hÛäÌVä óäü­^´O樮^á+ ä®^å+ T®^ÿìäp®^ïጮ^è1Nø|Pꀯ^p# 丮^äp# ô®^ÿìä¯^ïá,¯^èlÍJìH¯^èôIìd¯^è°"JøLbì°´^T#  ´^¯^œ¯^æâ ̯^T# ´^è0´^ä @áp´^æT# 䜯^äì¯^ãá"H±^ôO°^ü¯^̯^ôO8°^ÿèäd°^ì㜯^ø€°^ì ✯^蘰^̯^ôOÔ°^ÿèå±^ì㜯^ì±^耰^ø8±^ê ✯^ äø±^˜RäX±^̯^˜R”±^ÿèäÀ±^ä8±^ä㜯^ìܱ^耰^ø8±^êð²^à ä²^̯^à D²^âÿèäp²^ìáᜯ^ꌲ^耰^쨲^è|PêIJ^è„ëIøà²^ì âlÍJæ´^ÀA å³^̯^ÀA <³^âÿèäh³^ìáᜯ^ ꄳ^耰^ì ³^è„ëIì¼³^è|Pêè³^èس^ì âà8QòØfðT# ä´^œ¯^æˆbì@´^œ¯^äââ̯^(Ã|´^ÿäìâÐiõÕ;Yµi+-¿z㨴^œ¯^âÀµ^A äÀ´^äA ü´^ÿìäµ^ïá4µ^èœBìPµ^è ˜ìlµ^èLb숵^èTD줵^ÿäLbìе^8ôä ¬ªJT¶^à* äàµ^äà* ¶^ááÿåä8¶^ïDí4íIìp¶^ôäd¶^ xWæ·^* 䀶^ä* ¼¶^ááÿåäض^ïDáô¶^èì¥KøàßQì ¸^ Áä ·^ä Á\·^ááÿåäx·^ïDá”·^èPUì°·^øÌ·^øè·^èœBì¸^ÿôL¹^üóä0¸^äüól¸^ááÿå䈸^ïDᤸ^øÀ¸^èœBêܸ^øø¸^ø¹^è ˜ì0¹^ÿä›ð¤@ ä\¹^T)S愹^$, äx¹^pDPæ$º^B 䔹^äB й^ÿìäì¹^ïáº^èÌ‹Lÿè@¾^t$ ä4º^@º^æ âPº^æâ €º^,ë¼½^èн^ä @áp0¾^æ,ëäPº^ä º^ãá"ü»^ôOD»^°º^€º^ôOìº^ÿèä»^ìãPº^ø4»^ì âPº^èL»^€º^ôOˆ»^ÿèä´»^ìãPº^ìл^è4»^øì»^ê âPº^ 䬼^˜Rä ¼^€º^˜RH¼^ÿèät¼^äì»^äãPº^ì¼^è4»^øì»^ꤽ^ä¼¼^€º^ø¼^âÿèä$½^ìááPº^ ê@½^è4»^ì\½^è|Jêx½^èFKø”½^ì âÌ‹Lê,ëä´½^Pº^æˆbìà½^Pº^äâ›^èF¾^ÿäìâÍÉêyùºÎŒ‚ªK© ˜¿^œôäP¾^äœôŒ¾^ááÿå䨾^ïDáľ^è|Jêà¾^øü¾^ø¿^øD¿^è4¿^ì âp]Mæ`¿^èœBì|¿^è|PöØfìpÀ^ Ý䨿^ä Ýä¿^ÿìåÀ^ïáÀ^è¤_Mì8À^èTìTÀ^èTÿèÁ^üÜä€À^äüܼÀ^ÿìäØÀ^ïáôÀ^è\RÿèÌÁ^„ôä Á^ä„ô\Á^ÿìäxÁ^äœBçá”Á^è|Jì°Á^ÿäTDìlÂ^ÔÜäÜÁ^äÔÜÂ^äÿåä4Â^ïáPÂ^ÿä ˜êˆÂ^\Vä|Â^ŒýIæ(Ã^, ä˜Â^ä, ÔÂ^ááÿåäðÂ^ïDá Ã^è ˜ÿæDÃ^ÌA ä8Ã^,ÿ[æ`Ã^8VäTÃ^ÜóLæxÃ^”A äpÃ^ äPâ”Ã^`¶åˆÃ^|«^ætÆ^èÁä¤Ã^¬Ã^â4âÜÃ^èÁèDÆ^èâpêèÁä¬Ã^äüÃ^ ãáÌÄ^˜Rä Ä^ÜÃ^˜RHÄ^ÿèä„Ä^ätÄ^äã¬Ã^ì â¬Ã^ ä°Ä^è Ä^ì â¬Ã^ðtÄ^êôÄ^°äÜÄ^æ°è0âÅ^‚äÅ^âÜÄ^‚è,âDÅ^X¬ä,Å^âÅ^X¬è(âlÅ^ÐCäTÅ^â,Å^ÐCè$â”Å^Œ6ä|Å^âTÅ^Œ6è â¼Å^Ôªä¤Å^â|Å^ÔªèâäÅ^pT äÌÅ^â ¤Å^pT Räâ Æ^D äôÅ^â ÌÅ^D Rä â4Æ^ØBäÆ^â ôÅ^ØBRäâ\Æ^¼¬äDÆ^âÆ^¼¬ðèÁälÆ^¬Ã^â„Æ^˜+ ä È8NœÆ^,¶å”Æ^.Kâ¸Æ^Ì# 䬯^LbæŒÇ^äUÇ^ÈÆ^ÌkäUÝ?òÌÜ?öHÇ^ Ç^ÌkäUß?îÔÞ?úPÇ^ÌkäU„á?îHá?öHÈ^¶åœÇ^ä¶áØÇ^ÿìäôÇ^ä|JçáÈ^è|Jì,È^ÿø¨ÁäXÈ^ä¨Á”È^ÿìä°È^ïýPÉ^4WäÜÈ^ä4WÉ^ááÿåä4É^ïDí04KìðÉ^è, ä`É^äè, œÉ^ááÿåä¸É^ïDáÔÉ^ÿä`ûìÊ^ÈÝåÊ^äÈÝ<Ê^ááÿåäXÊ^ïDátÊ^è$ÓIøX-ìÜÊ^¤Ýä Ê^æ¤Ý´Oâÿå´Ë^ôVäìÊ^äôV(Ë^ÿìäDË^ïá`Ë^èKì|Ë^è„ëIì˜Ë^è|PöLbìÄË^Ä, ä RÔÌ^ü$ äÔË^äü$ Ì^ááÿåä,Ì^ïDáHÌ^ødÌ^èTDê€Ì^øœÌ^ø¸Ì^è|JÿæXÍ^4·åäÌ^ä4·á Í^ÿìä<Í^ïíÜóLì„Í^˜, ähÍ^tÍ^æ â4ùVæ°Í^ä$ ä”Í^ Í^æ âT÷\æˆÎ^È$ äÀÍ^äÈ$ üÍ^ááÿåäÎ^ïDá4Î^èÈBìPÎ^ølÎ^è ˜ÿèDÏ^x, ä˜Î^äx, ÔÎ^ááÿåäðÎ^ïDá Ï^èLbì(Ï^è|«^ÿèäÏ^ìôäTÏ^äìôÏ^ááÿåä¬Ï^ïDáÈÏ^è|Jö|Jê„Ð^TÂäôÏ^â TÐ^T Ð^èæ$Ð^äœSä <Ð^T( Ð^ì ôÏ^p/ Ð^ê lÐ^¤r Ð^ïU Ð^è°Ð^¸ôä”Ð^ Ð^æ â.KæÌÐ^4ÂäÀÐ^°˜Pê4, ä (Kê8ý^>KâPý^´/ ä |ªJðý^„E ä`ý^ä„E œý^ááÿåä¸ý^ïDáÔý^è4íIøTDê þ^TE åþ^¼6VæÈþ^ E äþ^ä E Xþ^ááÿåätþ^ïDáþ^è ˜ê¬þ^èœBÿì\/ äØþ^¿Tæ ÿ^ 0 äôþ^ä 0 0ÿ^ÿìäLÿ^ïáhÿ^è ˜ê„ÿ^ÿäLbì°ÿ^øøä ìÀLP_ìÄäÀÿ^äìÄüÿ^ÿìä_ïá4_è8ÙJÿè°_d' ä`_â Ø_d' x_èæ_äLÍå ¨_[x_ê À_$  x_ê `_Üx_ê ð_h±x_ê _©x_ ê _P x_@ê 8_$™x_€ê P_Tèx_áé h_Üx_áé €_ x_áé ˜_x°x_áîšx_áçˆ_ZäÀ_äZü_ÿìä_ïá4_èlÍJìP_èôIìl_è°"JøLbì _Làä˜_äLàÔ_ááÿåäð_ïDí LTêÀ_xF ä_(_æ â8_æâh_ø+ è_èâ@êø+ ä8_äˆ_ãáX_˜Rä˜_h_˜RÔ_ÿèä_å_äã8_ì â8_ ä<_è,_ì â8_ñ_ê€_ˆFäh_æˆFèâ¨_T ä_âh_T ðø+ ä¸_8_âÜ_\F äÐ_t9Vê˜Yäì_œBæà_ÀG ä_äÀG D_äÿåä`_ïá|_ø˜_èPLì´_èè‹KøÐ_ì âFKæð_¨ùä dJÈ_œG å_äœG <_ÿìäX_ïát_è]ì_ø¬_è NøLbì¼_,ºåØ_ä,ºá_ÿìä0_ïáL_è$ÓIìh_è$ÓIì„_èTì _èÛIøÛIì”_ŒÅäÌ_äŒÅ_ÿìä$_ïá@_èlÍJì\_èôIìx_è°"JøLbìP _\0 ä¤_ä\0 à_ááÿåäü_äTDçDá _è°"Jì4 _è4íIøÔJê| _À¹å` _l _æ âè Wæ8 _ô' äŒ _äô' È _ááÿåää _ïDâ _è8»Sì _ÿø€¹åH _T _æ âd _æá” _œXèì_èâpêœXäd _ä´ _ãá„ _˜RäÄ _” _˜Rá _ÿèä< _ä, _äãd _ì âd _ äh _èX _ì âd _ð, _êx_@£ä” _æ@£¬ _äá äÀ _ê8âð _ìéèH_èâpêìéäÀ _ä _ãáà _˜Rä _ð _˜R\ _ÿèä˜ _äˆ _äãÀ _ì âÀ _ äÄ _è´ _ì âÀ _ðˆ _ê _´- äð _æ´- è4â0 _˜Tä _âð _˜Tè0âX _ä$ä@ _â _ä$è,†_`ï äh _â@ _`ï è(⨠_ÈOä _âh _ÈOè$âÐ _Œ<ä¸ _â _Œ<è âø _ä äà _⸠_ä èâ _àË ä_âà _àË èâH_¨éä0_â_¨éèâp_ÀªäX_â0_Àªèâ˜_ôdä€_âX_ôdèâÀ_$ää¨_â€_$äèâè_üäÐ_â¨_üè â_lÇäø_âÐ_lÇèâ8_TŽä _âø_TŽèâ`_ÄäH_â _Äðìéäp_À _â _lƒ äˆ_â” _lƒ èáÜ_ô· ä°_â ˆ_ô· È_äâ áêã_¼{ äì_â°_¼{ ðœXä_d _â _h( ä,_äh( h_ááÿåä„_ïDíÐyPìì_Dáä°_æDá´Oâÿå_ˆZäü_èvJæà_Æä_äÆT_ÿìäp_ïáŒ_èlÍJì¨_èôIìÄ_è°"JøLbì _ì0 äð_ü_æ ât9VêÜÅä_äÜÅX_ááÿåät_ïDá_èœBì¬_øÈ_øä_èœBí_ø_èLbøLbìØ_¼ºåH_伺á„_ÿìä _ïá¼_èüÝJøáJìx_XÆäè_äXÆ$_ÿìä@_ïá\_è˜ÝKÿè_ô1 äˆ_¨XJâ¼_Ð1 ¬_ _˜¿Mê´_˜¿MâØ_´1 äÌ_ˆCZæ$_ÐH äè_æÐH œBäÿå4_[ä |qP`_”1 äD_P_æ âHóQæx_p1 äp_ä#Yâ”_Œáäˆ_°µ[æ4_xúä¤_äxúà_ááÿåäü_ïDá_èðRXøpìÈ_XúäD_äXú€_ááÿåäœ_äÜ9NçDí¸_ì âôe^æd_ô( äØ_äô( _ááÿåä0_ïDáL_èì¥Kìh_ø„_ø _ø¼_øØ_èì¥Kìô_ø_ø,_øH_ÿôè_ÐZät_äÐZ°_ááÿåäÌ_ïDíœBðP1 äø_äP1 4_ááÿåäP_ïDál_øˆ_ÿä,Zì`_`2 ä´_ä`2 ð_ÿìä _ïá(_øD_èœBøØfí_˜) äp_ä˜) ¬_ÿìäÈ_ïáä_èœBÿèL_˜ûä_æ˜ûœBäÿåh_8) ä\_Ô€Uæx_„ûä 4LL¤_lûäˆ_älûÄ_äÿåäà_ïáü_ø_ø4_èœBêP_øl_èœBìˆ_ÿäLbì(_»å´_ä»áð_ááÿåä _ïDí4íIìÈ_èºå8_äèºát_ááÿåä_ïDá¬_èXòPøpì„_¤I äØ_ä¤I _ááÿåä0_ïDáL_øh_è ˜ÿè _Ôáä”_ äPæH!_ ) ä°_¼_æ âÌ_æäè_ïá_èì¥Kì _èØOì!_è<_ì âL_æâ|_pèà _èâpêpäL_äœ_ãál _˜Rä¬_|_˜Rè_ÿèä$ _ä _äãL_ì âL_ äP _è@ _ì âL_ð _ê¨ _l¹ ä| _æl¹ ” _äâ êäÐ _ÿä¸ _â| _ÿèâø _ äà _⸠_ ðpä!_L_â,!_ÿôÀ&_äúäX!_d!_æ ât!_æâ¤!_ è$_èâpê ät!_äÄ!_ãá”"_˜RäÔ!_¤!_˜R"_ÿèäL"_ä<"_äãt!_ì ât!_ äx"_èh"_ì ât!_ð<"_ê€$_p£ä¤"_æp£¼"_ä â âÐ"_ääã#_,y èP$_èâ@ê,y äÐ"_ä #_ãáð#_˜Rä0#_á #_˜Rl#_ÿèä¨#_ä˜#_äãÐ"_ì âÐ"_ äÔ#_èÄ#_ì âÐ"_ð˜#_ê$_l‚å$_æl‚èâ@$_°Yä($_ã$_°Yèâh$_høäP$_â($_høð,y äx$_Ð"_â¨&_´Öä$_â ¤"_´Ö¨$_è âØ$_üîèx&_èâpêüîä¨$_äø$_ãáÈ%_˜Rä%_Ø$_˜RD%_ÿèä€%_äp%_äã¨$_ì â¨$_ ä¬%_èœ%_ì â¨$_ðp%_êð%_ÔäØ%_æÔè â&_˜å&_âØ%_˜èâ@&_äVä(&_ã&_äVèâh&_däP&_â(&_dèâ&_À½äx&_âP&_À½ðüîä &_¨$_æ ä¸&_t!_â˜'_°ÆäÐ&_ä°Æ '_ááÿåä('_ïDáD'_è ˜ê`'_è ˜ì|'_ÿä ˜êÄ)_¨úä¨'_´'_æ âÄ'_æâô'_Ü»é”)_èâpêÜ»åÄ'_ä(_ãáä(_˜Rä$(_ô'_˜R`(_ÿèäœ(_äŒ(_äãÄ'_ì âÄ'_ äÈ(_è¸(_ì âÄ'_ðŒ(_ê )_@I äô(_æ@I èâ4)_è}ä)_âô(_è}è â\)_˜‹äD)_â)_˜‹èâ„)_ˆeäl)_âD)_ˆeèâ¬)_„¢ä”)_âl)_„¢ðÜ»å¼)_Ä'_æŒÆäÔ)_äŒÆ*_ÿìä,*_ïáH*_èœBìd*_èœBÿæœ*_„üä*_ð%]æt+_¼[ä¬*_ä¼[è*_ááÿåä+_ïDá +_èp!Qì<+_øX+_ÿäìÀ+_à) ä„+_æà) ´Oâÿå ,_LüäÐ+_Ø+_âæð+_äLüä ,_' Ø+_î<Ø+_èl,_`J ä0,_æ`J ´Oâÿåˆ,_˜»å|,_°ÃVæ¤,_áüä˜,_çOæ-_HJ ä´,_À,_æ âÐ,_æäì,_ïí4íIì$-_<âä-_ܦVæ@-_(J ä4-_ pQæ\-_¬2 äP-_ÐWæt-_<»ål-_ ‰\â -_ Çä„-_-_æ âÄÈQæ¼-_èI ä°-_Ø–^æÌ-_ðáäÄéSäÇäÜ-_ê._ K äø-_._æ â J[æ´._¼å$._ä¼á`._ááÿåä|._ïDá˜._éBJùBJìÄ._P\ä ìÕJœ/_(\äÔ._ä(\/_ÿìä,/_ïáH/_èlÍJìd/_èôIì€/_è°"JøLbìè/_3 ä¬/_æ3 ´Oâÿå0_Àâäø/_ê¤0_0ýä0_ä0ýP0_ááÿåäl0_ïDáˆ0_èÈBÿèÀ0_ð2 ä´0_½[æØ0_Ü»åÐ0_Ä'_â1_”J äè0_ô0_æ â°—Uê|J ä1_Lbæü2_œãä01_<1_æ âL1_æâ|1_ÈŸ èÌ2_èâpêÈŸ äL1_äœ1_ãál2_˜Rä¬1_|1_˜Rè1_ÿèä$2_ä2_äãL1_ì âL1_ äP2_è@2_ì âL1_ð2_ê”2_œ‚ä|2_朂ŒíLä â¼2_ÀÀä¤2_â |2_ÀÀð$Käâä2_˜âäÌ2_â¤2_˜âðÈŸ äô2_L1_â 3_€Èä $ÂN3_pãä \ÀNÌ3_TÈä,3_äTÈh3_ÿìä„3_ïá°3_è 3_ì âðž]ÿâ”5_ÈäÜ3_ä3_â â4_Èèd5_èâpêÈää3_ä44_ãá5_˜RäD4_4_˜R€4_ÿèä¼4_ä¬4_äãä3_ì âä3_ äè4_èØ4_ì âä3_ð¬4_ê,5_œ™ä5_朙èâT5_|ä<5_â5_|èâ|5_ìâäd5_â<5_ìâðÈäŒ5_ä3_â°5_ôÇä¤5_ œUæP6_ÜÇäÀ5_äÜÇü5_ÿìä6_ïá46_è ˜ÿèÜ7_¼K ä`6_l6_æ â|6_æâ¬6_øž è¬7_èâ@êøž ä|6_äÌ6_ãáœ7_˜RäÜ6_¬6_˜R7_ÿèäT7_äD7_äã|6_ì â|6_ ä€7_èp7_ì â|6_ðD7_êÄ7_$ä¬7_æ$ðøž äÔ7_|6_â|8_œ* äì7_äœ* (8_ááÿåäD8_ïDá`8_èÈBÿè89_4¼åŒ8_ä4¼áÈ8_ááÿåää8_ïDâ9_èàßQì9_ÿäœBì¼9_LK äH9_äLK „9_ááÿåä 9_ïDí OìÌ:_ÔâäÌ9_äÔâ:_ááÿåä$:_äœBçDá@:_èœBì\:_èh¡Kìx:_ø”:_ø°:_ÿä ˜î0K äÜ:_ä0K ;_ááÿåä4;_ïDíœBìT=_ää`;_l;_æ â|;_æ â¬;_@Éè$=_èâpê@Éä|;_äÌ;_ãáœ<_˜RäÜ;_¬;_˜R<_ÿèäT<_äD<_äã|;_ì â|;_ ä€<_èp<_ì â|;_ðD<_êÄ<_œ‚ä¬<_朂ŒíLäâì<_ÀÀäÔ<_â ¬<_ÀÀð$Käâ=_˜âäü<_âÔ<_˜âèâ<=_¨œä$=_âü<_¨œð@ÉäL=_|;_âô=_@]äd=_ä@] =_ÿìä¼=_ïáØ=_è(áJÿè”>_ ]ä>_ä ]@>_ÿìä\>_ïáx>_è¼1LøØ4Lì°>_è* ä¤>_ükQæÌ>_¼L äÀ>_D[Sæp@_мåÜ>_è>_æâ?_èKè@@_èâpêèKäè>_ä8?_ãá@_˜RäH?_?_˜R„?_ÿèäÀ?_ä°?_äãè>_ì âè>_ äì?_èÜ?_ì âè>_ð°?_ê0@_Ää@_æÄèâX@_ðRä@@_â @_ðR”ÜIìèKäh@_è>_âHA_èÈä€@_äèȼ@_ááÿåäØ@_ïDáô@_è°"JìA_è4íIì,A_èÔJÿætA_LþäXA_dA_æ âì JæxB_¬¼å„A_䬼áÀA_ááÿåäÜA_ïDáøA_èèQLêB_è„gSê0B_øLB_èœBøhB_ì â¬jSæ”B_L äˆB_XòPæ°B_”¼å¤B_àDUæPC_Ü\äÀB_äÜ\üB_ááÿåäC_ïDá4C_èì¥KÿéD_€¼å`C_䀼áœC_ááÿåä¸C_ïDáÔC_èœBøðC_ì â„íYæØD_8L äD_ä8L LD_ááÿåähD_äœBçDá„D_èœBì D_ø¼D_èœBÿèðD_ÐýäèD_ÄVãE_°\ä XhE_ L äE_ä L LE_ÿììLRîˆýäxE_à‹Sæ E_½å”E_ÃSæxF_¼]ä°E_ä¼]ìE_ááÿåäF_ïDá$F_ø@F_ø\F_ÿä8oìF_Ð+ äˆF_ˆ=Pâ0G_ + ä F_ä + ÜF_ÿìäøF_ïáG_èô/VøˆZKììG_ÈM ä@G_äÈM |G_ÿìä˜G_ïá´G_è(!LìÐG_èÄûKø´ûKìÄH_ÊäüG_äÊ8H_ÿìäTH_ïápH_èlÍJìŒH_èôIì¨H_è°"JøLbìdI_œM äÔH_äœM I_ÿìä,I_ïáHI_èä Mø Mì J_tM ätI_ätM °I_ÿìäÌI_ïáèI_è>KìJ_è”}Kø ‚KìÀJ_äk_âÜj_Ø>è âDk_pä,k_â k_p@Täâlk_8–äTk_â ,k_8–”ÜIìL+ä|k_„i_â@l_Pæä”k_äPæÐk_ááÿåäìk_äTDçDál_è4íIì$l_ÿäœBìül_X_äPl_äX_Œl_ááÿåä¨l_ïDáÄl_è4íIìàl_èTDøTDêm_Ô5 ä m_ÿ\ân_¼- ä$m_ä¼- `m_ááÿåä|m_ïDá˜m_ø´m_èÙUìÐm_øìm_ÿôàn_4æän_ä4æTn_ÿìäpn_ä4ìOçáŒn_ø¨n_è¬KìÄn_è¬Kÿèìr_æäðn_äæ,o_ááÿåäHo_ïDádo_èœBìˆr_è€o_ì âo_æâÀo_x-èèp_èâpêx-äo_äào_ãá°p_˜Räðo_Ào_˜R,p_ÿèähp_äXp_äão_ì âo_ ä”p_è„p_ì âo_ðXp_êØp_ˆ€åÀp_戀éâpr_ˆª äèp_âÀp_ˆª áq_èâ0q_D\èXr_èpæÀo_D\åq_äPq_ãá r_˜Rä`q_0q_˜Rœq_ÿèäØq_äÈq_ääq_ì ãq_ är_èôq_ì ãq_ðÈq_êHr_Üôä0r_æÜôð°’äXr_â0r_°’ðx-ä€r_o_â¤r_ètºJìÀr_ètºJøÜr_ì â$¼JæŒs_dËäür_ädË8s_ÿìäTs_òps_èœBøLRðPËäœs_äPËØs_ðôs_öôéht_åçäçæááxýâ3âøt ä€t_ä4êÈþÄt_ð- ä¼t_|QâÜt_`äÔt_üHVâ(u_d¿åìt_æd¿á´Oâÿæv_Üæä8u_äÜætu_ÿìäu_ïá¬u_èlÍJìÈu_èôIìäu_è°"JøLbìv_ì6 äv_€R^â4v_Àæä(v_H9^æ(w_äDv_ä€v_ááÿåäœv_ä@õXçDá¸v_øÔv_øðv_èàQUê w_ÿäLbê¬w_Œ¿å8w_䌿átw_ááÿåäw_ïDíœBìÈw_ÐËä¼w_ä6Mæ x_ôäØw_äôx_ÿìä0x_òLx_èœBìhx_èœBì„x_ÿäpðÜä°x_äÜìx_ÿìäy_þd,Wì@y_ . ä4y_HÝMæPz_ `äPy_ä `Œy_ááÿåä¨y_ïDáÄy_éBJìày_è|Jìüy_èTDìz_ø4z_è8oÿè({_˜ä`z_䘜z_ÿìä¸z_ïáÔz_èlÍJìðz_èôIì {_è°"JøLbì8{_ Àå¬LLd{_èP T{_H{_@ãQê\{_@ãQâ{_ŒÀá €{_t{_(îQêˆ{_(îQâ¨{_Pçä {_ˆ=\âÀ{_|ä¸{_p·VâL}_ÌP äÐ{_Ü{_æ âì{_æâ|_L3è}_èâpêL3äì{_ä<|_ãá }_˜RäL|_|_˜Rˆ|_ÿèäÄ|_ä´|_äãì{_ì âì{_ äð|_èà|_ì âì{_ð´|_ê4}_ø,ä}_æø,œBìL3äD}_ì{_âd}_dä\}_pQâ€}_,çät}_Ð$Jæ˜}_X`ä}_0íTâ8~_€. ä¨}_ä€. ä}_ááÿåå~_ä\½MçDá~_è|JÿæÜ_LäH~_T~_æ â„~_øð è¬_èâpêøð äT~_ä¤~_ãát_˜Rä´~_„~_˜Rð~_ÿèä,_ä_äãT~_ì âT~_ äX_èH_ì âT~_ð_êœ_lÊä„_ælÊèâÄ_̉ ä¬_â „_̉ ,ÇJìøð äÔ_T~_â¸_tÀåì_ø_æ â€_æâ8€_Œªèˆ_èâpꌪä€_äX€_ãá(_˜Räh€_8€_˜R¤€_ÿèäà€_äЀ_äã€_ì â€_ ä _èü€_ì â€_ðЀ_êP_¸?ä8_æ¸?èâx_<'ä`_â8_<'èâ _Üo äˆ_â`_Üo ðŒªä°_€_ât‚_(äÈ_ä(‚_ááÿåä ‚_ïDá<‚_è,„KìX‚_ÿä#^ð˜P ä„‚_ä˜P À‚_ááÿåäÜ‚_ïDáø‚_èœBìƒ_è ˜ÿ蘃_ / ä@ƒ_ä / |ƒ_ÿì÷á´ƒ_´a䨃_\{P挄_˜aäă_ä˜aá„_ááÿåä„_ïDá8„_øT„_øp„_ÿä8oìd…_Àè䜄_äÀèØ„_ÿìäô„_ïá…_èlÍJì,…_èôIìH…_è°"JøLb쀅_PQ ät…_4ÀX朅_4Q ä…_ìXæÈ…_áQ 䬅_¸…_æ âêLæà…_èÌ䨅_á«Pâð†_(äð…_ä(,†_ááÿåäH†_ä„gSåDád†_èœB쀆_øœ†_ø¸†_øÔ†_èœBö„gSê‡_¤èå‡_ü9Wâü‡_paä‡_äpaT‡_ÿìäp‡_ïጇ_ø¨‡_øć_øà‡_è ˜øîìˆ_Paä ˆ_ÐWâ‰_0aä$ˆ_ä0a`ˆ_ááÿåä|ˆ_ïDáüˆ_蘈_ì ⨈_æäĈ_ïáàˆ_è|Jÿÿä4‹_´Ìä(‰_4‰_æâd‰_8Ôè‹_èâpê8Ôä4‰_䄉_ãáTŠ_˜R䔉_d‰_˜RЉ_ÿèä Š_äü‰_äã4‰_ì â4‰_ ä8Š_è(Š_ì â4‰_ðü‰_ê|Š_ˆaädŠ_æˆaè⤊_„ 䌊_âdŠ_„ èâÌŠ_àQä´Š_⌊_àQè âôŠ_8ùäÜŠ_â´Š_8ùèâ‹_̉ ä‹_â ÜŠ_̉ ,ÇJì8Ôä,‹_4‰_âð‹_àÀåD‹_äàÀဋ_ááÿå䜋_ïDḋ_èì¥KìÔ‹_ÿô Œ_Ð. åŒ_Ø–^欌_PèäŒ_äPèXŒ_ááÿåätŒ_ïDáŒ_èœBøTDðÜ`伌_äÜ`øŒ_ááÿåä_ïDá0_èœBø,ËNì$Ž_`éä\_ä`é˜_ÿìä´_ïáÐ_èlÍJìì_èôIìŽ_è°"JøLbìàŽ_Œbä4Ž_äŒbpŽ_ÿì䌎_ïᨎ_è¤PJìÄŽ_ÿä\’Jì ”_läðŽ_äl,_ÿìäH_ïáè“_èd_ì ât_æâ ¤_ d“_èx“_ä @ápØ“_æ ät_äÄ_ãá" ‘_ôOh_Ô_¤_ôO_ÿèä<_ìãt_øX_ì ât_èp_¤_ôO¬_ÿèäØ_ìãt_ìô_èX_ø‘_ê ât_ äБ_˜Rä0‘_¤_˜Rl‘_ÿè䘑_ä‘_äãt_ì´‘_èX_ø‘_ꀒ_ì"äà‘_¤_ì"’_âÿèäH’_ìáát_êd’_èX_ø LNìL“_0ä’_¤_0Ì’_âÿèäø’_ìáát_ ê“_èX_ì0“_ÿä LNð ä\“_t_æˆb숓_t_äââ¤_ð×á Ä“_ÿäìâ äÀåF”_ÿä LNìÀ”_¬Áå0”_ä¬Áál”_ÿì䈔_ïᤔ_èð•[ø$ÓIì–_PbäД_äPb •_äÿåä(•_ïáD•_ø`•_è ˜ê|•_èPÏIꘕ_èPÏIê´•_øЕ_èTDêì•_èTDÿæ$–_„Áå–_<ÃNæ@–_”/ ä4–_pa\æl–_DÍäP–_\–_æ âÔ Y或_LÁå|–_$¿Tæ –_4Á嘖_ÜýQâ<™_@/ ä°–_¼–_æâì–__é™_èâ`ê_ä¼–_ä —_ ãáÜ—_˜Rä—_ì–_˜RX—_ÿèä”—_ä„—_äã¼–_ì â¼–_ äÀ—_è°—_ì â¼–_ð„—_ê˜_  äì—_ä  ˜_äâæD˜_äßä ˜_ì—_äß8˜_äâçl˜_¬-äT˜_â ˜_¬-è┘_°å |˜_T˜_°í¼˜_̞䤘_|˜_Ìžìð˜_Œ ä̘_¤˜_Œ ä˜_èæ$™_\v å™_â ̘_\v ™_èçã_ä4™_¼–_âÀ™_ÁåL™_äÁሙ_ÿì䤙_þ¼nTð0ÍäЙ_ä0Í š_äää(š_öôáâ œš_°š_åçäçæááxýâìsèဎâT©åœ_äŽâT©ä,œ_äâT©äÜœ_Šâ“âT©äh_ â•âT©äž_ä–âT©äÈž_ä™âT©äxŸ_ âšâT©ä( _äšâT©ä æšâT©ìœâT©äØ _äœâT©ìâT©ìŸâT©äˆ¡_ä>áçýéXœ_°œ_øé„œ_ü:ápäý4ÿúðÿááÿÿÿ÷â¨æAôé”_ì_øéÀ_ü:ápäý4ê@þ&éDž_œž_øépž_ü:ápäý4ê¿ÿÿÿû(éôž_LŸ_øé Ÿ_ü:ápäý4êþ餟_üŸ_øéП_ü:ápäý4ë8ý(éT _¬ _øé€ _ü:ápäý4í@û(é¡_\¡_øé0¡_ü:ápäý4í€ûé´¡_ü:ápäýü¡_ì/ äð¡_ꀢ_`Âå ¢_ä`ÂáH¢_ááÿåäd¢_ïDíÐyPì<£_€8 ä¢_ä€8 Ì¢_äÿåäè¢_ïá£_è ¤Jì £_ÿäü£Jìø£_ÌÍäL£_äÌ͈£_äÿå䤣_ïáÀ£_èšJìÜ£_èšJøšJ오_4Âå¤_ä4ÂáD¤_ÿìä`¤_ïá|¤_èüÝJø|Jìp¥_\c䨤_ä\cä¤_ÿìå¥_ïá¥_èlÍJì8¥_èôIìT¥_è°"JøLb윥_ŒŒ¥_€¥_ÌŽMꔥ_ÌŽM⸥_¸Í䬥_PåMæX¦_È/ äÈ¥_äÈ/ ¦_ÿìä ¦_ïá<¦_èLbø ‚Kì§_”éäh¦_ä”餦_ááÿåäÀ¦_ïDáܦ_è$¡Pìø¦_èÌŸPÿæ´§_Xä$§_äX`§_ááÿåä|§_ïDᘧ_èì¥Kÿèà§_øbäħ_Ч_æ â˜Ú^ê´bäð§_ OâШ_|R ä¨_ä|R D¨_ááÿåä`¨_ïDá|¨_è„ëI온_ø´¨_èì¥Kø¸3Mꨩ_T0 äà¨_äT0 ©_ÿìä8©_ïáT©_èlÍJìp©_èôI쌩_è°"JøLbìtª_LR 丩_äLR ô©_ÿìäª_ïá<ª_è,ª_ì â8€PæXª_è|Pö˜RMìL«_ 0 䄪_ä 0 Àª_ÿìäܪ_ïáøª_èlÍJì«_èôIì0«_è°"JøLbìЫ_LÎä\«_äLΘ«_ÿìä´«_ïíðJìì«_Ô8 äà«_0RKæ¬_á0 äü«_ØQ⤭_¨cä¬_¬_â âL¬_¨cèt­_èâpê¨cä¬_äl¬_ãá<­_˜Rä|¬_L¬_˜R¸¬_ÿèäô¬_ää¬_äã¬_ì â¬_ ä ­_è­_ì â¬_ðä¬_êd­_¤» äL­_椻 ¨Nä⌭_Xà ät­_âL­_Xà ð¨c䜭_¬_âÀ­_ êä´­_°KæØ­_ˆcäЭ_€u\âh°_¸8 äè­_ð­_â â ®_¸8 è8°_èâpê¸8 äð­_ä@®_ ãá¯_˜RäP®_ ®_˜RŒ®_ÿèäÈ®_丮_äãð­_ì âð­_ äô®_èä®_ì âð­_ð¸®_ê8¯_\Ïä ¯_æ\Ïèâ`¯_  äH¯_â ¯_  è∯_Эäp¯_âH¯_Эèâ°¯_d® 䘯_âp¯_d® èâد_<õåÀ¯_☯_<õé ã°_ ;äè¯_âÀ¯_ ;èâ(°_œ½ ä°_âè¯_œ½ èâP°_,Îä8°_â°_,Îð¸8 ä`°_ð­_â„°_ðéäx°_Ô Yæ±_€Âå”°_ä€Âáа_ÿìäì°_ïí•PñÎä±_$±_æ”âT±_øÖé0³_èâpêøÖå$±_ät±_ãáD²_˜R䄱_T±_˜RÀ±_ÿèäü±_äì±_äã$±_ì â$±_ ä(²_è²_ì â$±_ðì±_ꀲ_ CäT²_æ Cl²_äâ €ê€ä¨²_ÔÀ ä²_âT²_ÔÀ èâв_Р串_â²_Ð è âø²_Àÿäà²_⸲_Àÿèâ ³_ ßä³_âà²_ ßèâH³_´œ ä0³_â³_´œ ðøÖåX³_$±_â´_<9 äp³_ä<9 ¬³_ááÿåäȳ_ïDáä³_è¤âTí´_èðJÿèØ´_P1 ä,´_äP1 h´_ÿìä„´_ïá ´_è(!Lì¼´_è|Jø´ûKìô´_`Ãåè´_Ðt]æµ_¨Îäµ_Ðm]æ,¸_à0 ä µ_äà0 \µ_ááÿåäxµ_ïDᔵ_èì¥Kì¸_è°µ_ê âÀµ_æ(âðµ_h}èà·_èâpêh}äÀµ_ä¶_ ãáà¶_˜Rä ¶_ðµ_˜R\¶_ÿè䘶_䈶_äãÀµ_ì âÀµ_ äĶ_è´¶_ì âÀµ_ðˆ¶_ê·_xÂäð¶_æxÂîä$â0·_œä·_â ð¶_œŒíLäâX·_Ü“ ä@·_â·_Ü“ è‷_@Éäh·_â @·_@É|Jâ ⨷_´)å·_âh·_´)éâз_Ð0帷_â·_Ð0éâø·_`0åà·_⸷_`0ñh}ä¸_Àµ_þ¹_À0 ä<¸_äÀ0 x¸_ááÿå䔸_äì¥KçDá°¸_èì¥Kì̸_è|Jêè¸_è¸3Mö|Jêd¼_„êä¹_ä„êP¹_ááÿåäܺ_äl¹_çDá â|¹_æâ¬¹_œr謺_èâpêœrä|¹_ä̹_ã᜺_˜Räܹ_¬¹_˜Rº_ÿèäTº_äDº_äã|¹_ì â|¹_ 䀺_èpº_ì â|¹_ðDº_êĺ_Xä䬺_æXäðœräÔº_|¹_âøº_ø»_ø0»_øL»_øh»_ø„»_ø »_ø¼»_øØ»_øô»_ø¼_ø,¼_øH¼_ÿä|Jê½_<Ãåt¼_ä<Ãá°¼_ááÿåä̼_ïDáè¼_èœBì½_èLbì ½_èLbì<½_èLbìX½_èLbìt½_è|Jÿ謽_ádä ½_—^êR ä¼½_ð¯Lâà½_ô1 äÔ½_êl¿_ðS äð½_ü½_æ â ¾_æâ<¾_”…è<¿_èâpê”…ä ¾_ä\¾_ãá,¿_˜Räl¾_<¾_˜R¨¾_ÿèää¾_äÔ¾_äã ¾_ì â ¾_ ä¿_é¿_ì â ¾_ðÔ¾_êT¿_äbä<¿_æäb4ÏPì”…äd¿_ ¾_âÀ_´S ä|¿_ˆ¿_æ ☿_æä´¿_ïáп_èœBìì¿_è LTÿæ À_È1 äÀ_ˆ)RâÀÀ_(eä0À_ä(elÀ_ááÿåäˆÀ_ïDá¤À_èTDøPÏIì|Á_ÜêäÐÀ_äÜê Á_ááÿåä(Á_ïDáDÁ_è$¡Pì`Á_èÌŸPÿè”Á_ÀêäŒÁ_$Xâ°Á_Ðdä¤Á_|ú\æ4Â_ŒS äÀÁ_äŒS üÁ_ááÿåäÂ_ïDíì¥Kð€1 äDÂ_PÂ_æ(â€Â_¤¨èXÆ_èâ`ꤨäPÂ_ä Â_ ãápÃ_˜Rä°Â_€Â_˜RìÂ_ÿèä(Ã_äÃ_äãPÂ_ì âPÂ_ äTÃ_èDÃ_ì âPÂ_ðÃ_ê˜Ã_@yä€Ã_æ@yè$âÀÃ_”ä¨Ã_â€Ã_”è"âèÃ_¼/äÐÃ_â¨Ã_¼/è âÄ_8½åøÃ_âÐÃ_8½éâ8Ä_ ä Ä_âøÃ_ èâ`Ä_äy äHÄ_â Ä_äy èâˆÄ_<ÛäpÄ_âHÄ_<Ûèâ°Ä_ØÏä˜Ä_âpÄ_ØÏè âHÆ_Œ^ äÀÄ_â ˜Ä_Œ^ ØÄ_äââÅ_Ü è0Æ_è`æ€Â_Ü äØÄ_ä(Å_ãáøÅ_˜Rä8Å_Å_˜RtÅ_ÿèä°Å_ä Å_äãØÄ_ì âØÄ_ äÜÅ_èÌÅ_ì âØÄ_ð Å_ê Æ_@äÆ_æ@ð”ä0Æ_âÆ_”ì„Æ_ÌžäXÆ_â ÀÄ_ÌžpÆ_è êè¤¨ä”Æ_PÂ_â Ç_`e䬯_ä`eèÆ_ÿìäÇ_ïíÌ‹LìøÇ_p2 ä0Ç_äp2 lÇ_ÿìäˆÇ_ïá¤Ç_èlÍJìÀÇ_èôIìÜÇ_è°"JøLbìDÈ_„ëäÈ_æ„ë´OâÿåÈ_äTÈ_æ´Oâÿå0É_Üä È_äÜÜÈ_ÿìäøÈ_ïáÉ_è¤âTøðJì¼Ê_ÈT ä@É_LÉ_æ â\É_æâŒÉ_ vèŒÊ_èâpê vä\É_ä¬É_ãá|Ê_˜Rä¼É_ŒÉ_˜RøÉ_ÿèä4Ê_ä$Ê_äã\É_ì â\É_ ä`Ê_èPÊ_ì â\É_ð$Ê_ê¤Ê_äbäŒÊ_æäb4ÏPì vä´Ê_\É_âèÊ_ÀäÌÊ_ØÊ_æ âÈw^æ°Ì_ÌÃåøÊ_áË_â â0Ë_ÌÃé€Ì_èâpêÌÃæË_äPË_ãá Ì_˜Rä`Ë_0Ë_˜RœË_ÿèäØË_äÈË_ääË_ì ãË_ äÌ_èôË_ì ãË_ðÈË_êHÌ_¬Êå0Ì_æ¬ÊáÐVLäâpÌ_°äXÌ_â 0Ì_°@ZLäâ˜Ì_¨† ä€Ì_â XÌ_¨† °KìÌÃå¨Ì_áË_âÈÌ_´T äÀÌ_iSâ„Í_”T äØÌ_ä”T Í_ááÿåä0Í_ïDáLÍ_èXòPìhÍ_èØVRÿèœÍ_Tëä”Í_¼Kâ Î_TÏä¬Í_äTÏèÍ_ááÿåäÎ_äœBçDýøÎ_ëä0Î_äëlÎ_ááÿåäˆÎ_ïDá¤Î_èì¥KìÀÎ_è ˜êÜÎ_ÿä\ÿOì$Ï_ÄÎäÏ_Ï_æ â¬Ã^ê2 ä4Ï_¸ÈNâÜÏ_ ÐäLÏ_ä ЈÏ_ááÿåä¤Ï_ïDáÀÏ_èhEø„ŒVììÏ_ fä Ø0KÄÐ_ÄäüÏ_äÄ8Ð_ÿìäTÐ_ïápÐ_èlÍJìŒÐ_èôIì¨Ð_è°"JøLbìœÑ_àeäÔÐ_äàeÑ_ÿìä,Ñ_ïáHÑ_èlÍJìdÑ_èôIì€Ñ_è°"JøLbìXÒ_¸eä¬Ñ_ä¸eèÑ_ÿìäÒ_ïá Ò_èLBKì<Ò_èLBKøˆZKìÜÒ_ŒÄåhÒ_äŒÄá¤Ò_ÿìäÀÒ_ïí\UKìøÒ_pÄå ìÒ_lŽVä¬Ô_˜eäÓ_Ó_ââ@Ó_˜eè|Ô_èâpê˜eäÓ_ä`Ó_ãá0Ô_˜RäpÓ_@Ó_˜R¬Ó_ÿèäèÓ_äØÓ_äãÓ_ì âÓ_ äÔ_èÔ_ì âÓ_ðØÓ_êlÔ_… ä@Ô_æ… XÔ_äâ êä”Ô_dPä|Ô_â@Ô_dPð˜eä¤Ô_Ó_âÄÔ_3 ä¼Ô_ÇVâœÕ_4ÄåÔÔ_ä4ÄáÕ_ááÿåä,Õ_ïDáHÕ_èÈBìdÕ_è|Jê€Õ_è|JöÜ9NìXÖ_$: ä¬Õ_ä$: èÕ_ÿìäÖ_ïá Ö_ø<Ö_è ˜ÿè¬Ø_ü2 ähÖ_tÖ_æ â„Ö_æ,â´Ö_hSè|Ø_èâpêhSä„Ö_äÔÖ_ãá¤×_˜RääÖ_´Ö_˜R ×_ÿèä\×_äL×_äã„Ö_ì â„Ö_ äˆ×_èx×_ì â„Ö_ðL×_êÌ×_äúå´×_æäúáŒíLäâô×_`© äÜ×_â ´×_`© ð$KäâØ_¼åØ_âÜ×_¼áð$Kä âDØ_”™ ä,Ø_âØ_”™ èâlØ_ø‡äTØ_â,Ø_ø‡èâ”Ø_بä|Ø_âTØ_بðhS䤨_„Ö_âÈØ_Ä弨_ünNê¨ë䨨_äØ_æ âôØ_æäÙ_ïá,Ù_èÌýQìHÙ_è ˜êdÙ_è ˜ÿè<Ú_ V äÙ_ä V ÌÙ_ÿìäèÙ_äTDçáÚ_èLbì Ú_èTDø€VNìÛ_ôÐäLÚ_äôЈÚ_ÿìä¤Ú_ïáÀÚ_èlÍJìÜÚ_èôIìøÚ_è°"JøLbì´Û_àU ä$Û_äàU `Û_ÿìä|Û_ïá˜Û_èFKø|JìTÜ_h: äÄÛ_äh: áÜ_ÿìäÜ_ïá8Ü_èœBø|JìlÜ_¼U ädÜ_¬ÕOâ„Ü_H3 ä|Ü_ ç]âìà_XÐä”Ü_äXÐÐÜ_ð@Ý_öäìÜ_äœBäááÝ_èØfì$Ý_èœBøœBì´Ý_ðÝ_åçäçæááxýâÄ+Øfäöá @ìœBä÷á @ô‹ œBäøá @áLäÞ_ä2áœBä4Þ_ü8é `Þ_Hß_œÞ_ô:âŒÞ_ä ß_ü âœÞ_æä¸Þ_ïDáÔÞ_èX-ìðÞ_ÿôäHœÞ_ááÿä Ôß_Pß_2áX-ä|ß_üáØfä¨ß_ü:áTMZäöý `à_Üß_2éà_üáœBä4à_ü:áØfä÷ÿáhà_2é”à_üáœBäÀà_ü:áØfäøý¨á_ìäüà_äì8á_ÿìäTá_ïápá_øŒá_ÿøÔëä¸á_Œ±VæÜá_,4 äÔá_€ÞUâ|â_4 äìá_ä4 (â_ááÿåäDâ_ïDá`â_ÿäü£JìXä_œ: äŒâ_˜â_æ â¨â_æ âØâ_D è(ä_èâpêD ä¨â_äøâ_ãáÈã_˜Räã_Øâ_˜RDã_ÿèä€ã_äpã_äã¨â_ì â¨â_ ä¬ã_èœã_ì â¨â_ðpã_êðã_À‡äØã_æÀ‡èâä_°Úåä_âØã_°Úèâ@ä_|ä(ä_ãä_|ðD äPä_¨â_âå_àähä_äà¤ä_ÿìäÀä_ïáÜä_è˜ÝKìøä_è|JøØÍKì´å_Üfä$å_äÜf`å_ÿìä|å_ïá˜å_èÌÄPøèÇPìŒæ_¸äÄå_ä¸áæ_ÿìäæ_ïá8æ_èlÍJìTæ_èôIìpæ_è°"JøLbì¤æ_œäœæ_„3]âTç_XÅå´æ_äXÅáðæ_ááÿåä ç_ïDá(ç_èœBøDç_ì âÄRæè_lìädç_älì ç_ááÿåä¼ç_ïDáØç_èðRXìôç_èLxNÿè°è_œ3 ä è_äœ3 \è_ááÿåäxè_ä\½MçDá”è_è ˜ÿælé_DV äÀè_äDV üè_ááÿåäé_ïDá4é_èœBìPé_è|Jÿì|fä|é_ä|f¸é_ááÿåäÔé_äœBçDíœBëê_,Òä sR¼ê_ôÅåê_äôÅáLê_ÿìähê_ïá„ê_èä Mì ê_ÿä Mì\ë_d4 äÌê_äd4 ë_ÿìä$ë_ïá@ë_è<9TøLBKì4ì_˜gälë_ä˜g¨ë_ááÿåäÄë_ïDáàë_èœBìüë_è°"Jìì_è ˜ÿèxî_PíäDì_Pì_æ â`ì_æä|ì_ïá˜ì_èœBê´ì_ø@î_èÐì_ì âàì_æâí_äD èî_èâpêäD äàì_ä0í_ãâî_˜Rä@í_í_˜R|í_ÿèä¸í_ä¨í_äãàì_ì âàì_ ääí_èÔí_ì âàì_ð¨í_ê(î_ìâäî_æìâðäD ä8î_àì_â\î_èœBøœBìî_Òäˆî_0+Râ¨î_xgä î_p4Xâ¬ï_Xgä¸î_äXgôî_ááÿåäï_ïDáï_è,ï_ì â<ï_æäXï_ïátï_è ˜ÿÿäØï_á; ä¼ï_Èï_æ â@‡]æ”ò_ðV äèï_ôï_æ$â$ð_\ÿ èdò_èâpê\ÿ äôï_äDð_ ãáñ_˜RäTð_$ð_˜Rð_ÿèäÌð_ä¼ð_äãôï_ì âôï_ äøð_èèð_ì âôï_ð¼ð_ê<ñ_… ä$ñ_æ… ø,Jä âdñ_àºäLñ_â $ñ_àºø,JäâŒñ_,› ätñ_â Lñ_,› ø,Jäâ´ñ_Lí äœñ_â tñ_Lí øý]äâÜñ_¤­äÄñ_â œñ_¤­80Jäâò_˜û äìñ_â Äñ_˜û p9Jä â,ò_ø‡äò_âìñ_ø‡èâTò_|¿ ä<ò_â ò_|¿ ø,Jäâ|ò_L ädò_â <ò_L €;Jì\ÿ äŒò_ôï_â°ò_ä¤ò_8ñVêÐÑäÀò_äÐÑüò_ÿì÷áÔó_œ5 ä(ó_äœ5 dó_ÿìä€ó_ïáœó_ø¸ó_ÿô¬ô_DÆåäó_äDÆá ô_ÿìä<ô_ïáXô_èlÍJìtô_èôIìô_è°"JøLbìÈô_„5 ä¼ô_ìdJæõ_üÒäØô_æüÒ´Oâÿåìõ_LW ä$õ_äLW `õ_ÿìä|õ_ïá˜õ_èlÍJì´õ_èôIìÐõ_è°"JøLbìüõ_°; ä Ø%Sö_Œ; ä ö_Ðì_æ4ö_8ä(ö_ðwMæ(÷_¨íäDö_ä¨í€ö_ááÿåäœö_ïDá¸ö_èœBìÔö_è€o_ìðö_ètºJì ÷_ètºJøÜr_ìä÷_àä8÷_äàt÷_ááÿåä÷_ïDá¬÷_èÈBìÈ÷_è¸3Mÿì¨äô÷_ä¨0ø_ááÿåäLø_ïDáhø_èœBì„ø_èìèSì ø_èœBÿèÔø_`6 äÌø_`¼Qâðø_t< ääø_|¢Ræ ý_tîÈù_áù_ätî<ù_äÿääXù_ïátù_éBJìù_éBJì¬ù_ÿøÐù_ä tî ú_î|ú_öä(ú_ìááDú_éBJì`ú_éBJÿèðú_,û_åçäçæááxýâPÖ áBJäŠá@x=áBJä‹á@TùèŒá @áÀÈäDû_ä8é pû_¬û_<ù_ô:âœû_åù_ü â<ù_æ ü_´û_âBJäàû_ü:á ü_äŠý ãBJæ |ü_$ü_âBJäPü_ü:á ü_ä‹ý Üü_„ü_é°ü_ü:áLbäŒÿáäü_4ÿê°ý_H6 ä ý_äH6 \ý_ááÿåäxý_ïDá”ý_ÿäü£JìÌý_\îäÀý_ÔÍNæ¤þ_ØäÜý_äØþ_ÿìä4þ_ïáPþ_èlÍJìlþ_èôIìˆþ_è°"JøLbì|ÿ_@< ä´þ_ä@< ðþ_ÿìä ÿ_ïá(ÿ_èlÍJìDÿ_èôIì`ÿ_è°"JøLbì`¤äŒÿ_ä¤Èÿ_ÿìääÿ_ïã`è˜ÝKøBJì¼`ü5 ä,`äü5 h`ÿìä„`ïá `è¤PJøØvJì”`°häÌ`ä°h`ÿìä$`ïá@`èlÍJì\`èôIìx`è°"JøLbì°`œÓä ¤` LTä4`„häÀ`ä„hü`ááÿåä`äÞQçDýP`xW äD`d,Wæ `\ä``ä\œ`ÿìä¸`ä ˜çáÔ`è ˜ìð`ÿôãXhä`äXhX`ÿìät`ïá`ÿô„`4iä¼`ä4iø`ÿìä`ïá0`èlÍJìL`èôIìh`è°"JøLbì”`7 ä „%Q4`è6 ä¤`äè6 à`ÿìäü`ïá`èLbø¼p-ìP`À6 äD`œ¦Yæ `ðÆå``äðÆáœ`ááÿåä¸`ïDáÔ`è4íIìð`èTDøTDê8`øÓä`(`æ â¬_æ`4 äH`ä4 „`ááÿåä `ïDá¼`è„gSêØ`øô`èTDøLbì( `äÓä `(`ââX`äÓèø`èâpêäÓä(`äx`ãáH`˜Räˆ`X`˜RÄ`ÿèå`äð`äã(`ì â(` ä,`è`ì â(`ðð`êp`(£ äX`æ(£ èâ˜`Tµä€`â X`Tµ|Jâ âÀ`Hä¨`â €`H|Jââè`ì,äÐ`â ¨`ì,|Jââ `ìâäø`âÐ`ìâðäÓä `(`â@ `œ6 ä8 `ÐÔYæˆîäP `Ìkˆîá"@òÄ!@ö, ``7 äœ `ä`7 Ø `ááÿåäô `ïDá `ÿäü£JìH `ÌY ä< ``pJæ `dïäX `` `ââ `dïèð `èâpêdïä` `ä° `ãဠ`˜RäÀ ` `˜Rü `ÿèä8 `ä( `äã` `ì â` ` äd `èT `ì â` `ð( `ê¸ `4jä `æ4j¨ `äâ âtyXæà `t¿äÈ `â `t¿ÐVLäâ `á äð `âÈ `á °Kìdïä `` `â< `L7 ä0 `XI]æø `lY äL `älY ˆ `ááÿåä¤ `ïDáÀ `øÜ `è°µ[ÿè´ `Ôä `äÔD `ááÿåä` `ïDá| `è8¥Zì˜ `èðRXøœBìŒ`ˆ äÄ `äˆ á`ááÿåä`ä ˜çDá8`øT`è ˜êp`è ˜ÿæ€`ØX äœ`äØX Ø`ááÿåäô`ïDá`èœBì,`è,ZìH`è,Zìd`è,Zø,ZðiÌ``ÌkiĬæê4­úÔ`ÌkiŒ"@îP"@ö,`¼Ôä `ü´Læ`Ô= ä<`äÔ= x`ÿìä”`ïá°`èlÍJìÌ`èôIìè`è°"JøLbìÜ`´= ä`ä´= P`ÿìäl`ïáˆ`èlÍJì¤`èôIìÀ`è°"JøLbì´`ðäì`äð(`ÿìäD`ïá``èlÍJì|`èôIì˜`è°"JøLbìÐ` ÔäÄ`ØQæŒ`Ôïäà`äÔï`ááÿåä8`ïDáT`øp`ÿô”`lÔäœ`¨`æâØ`´úéd`èâ@ê´úå¨`äø`ãáÈ`˜Rä`Ø`˜RD`ÿèä€`äp`äã¨`ì â¨` ä¬`èœ`ì â¨`ðp`ê`ì±äØ`æì±ð`ä â êä,`ôä`âØ`ôèâT`0c ä<`â`0c èâ|`8Áäd`â<`8Áð´úåŒ`¨`âø` ä¤`ä à`ááÿåäü`ïDá`èì¥Kì4`øP`øl`øˆ`ø¤`øÀ`øÜ`ÿôÐ`PÔä`äPÔD`ááÿåä``ïDá|`èPUì˜`èœBì´`ÿä´Uìì`ô äà`0AQæà`t= äü``æ(â8`̬ è°`èâpê̬ ä`äX`ãá(`˜Räh`8`˜R¤`ÿèäà`äÐ`äã`ì â` ä `èü`ì â`ðÐ`êP`|!ä8`æ|!LÅTäâx`\^ä``â 8`\^œñMäâ `"äˆ`â ``"œñMäâÈ`ü¸ä°`â ˆ`ü¸œñMì̬ äØ``âð`Tjä Ð.J`ˆïå`äˆï<`ÿìäX`ä ˜çát`è ˜ø ˜îÀ ä `äÀ Ü`ðø`öôél`åçäçæááxýâ5âøt ä„`ä4êdþÌ`xÈåÀ`ôSæ¤`( äÜ`ä( `ÿìä4`ïáP`èlÍJìl`èôIìˆ`è°"JøLbìÀ`PÕä´`øMUæ´`8 äÐ`ä8 `ÿìä(`äœBçáD`èÈBì``ø|`ø˜`è ˜ÿèp`ðÔäÄ`äðÔá`ááÿåä`ïDá8`øT`è|Jÿè,"`ÐÔä€`Œ`æ âœ`æôáÌ`hKèü!`èâpêhKäœ`äì`ãá¼`˜Räü`Ì`˜R8`ÿèät`äd`äãœ`ì âœ` ä `è`ì âœ`ðd`êä``… äÌ`æ`… TNä˜á `»äô`â Ì`»TNä<á4 `Tä `â ô`TTNäàâ\ `¼1äD `â `¼1èÜâ„ `(gäl `âD `(gèØâ¬ `ô× ä” `â l `ô× TNä|âÔ `ˆ[ä¼ `â” `ˆ[èxâü `Њ ää `â¼ `Њ ètâ$!`D} ä !`â ä `D} TNäâL!`Ü] ä4!`â !`Ü] èât!`\îä\!`â4!`\îèâœ!`XCä„!`â\!`XCè âÄ!`”bä¬!`â„!`”bèâì!`äÔ!`â¬!`èâ"`ìâäü!`âÔ!`ìâðhKä$"`œ`æXðä „ÉU#`<[ äL"`ä<[ ˆ"`ÿìä¤"`ïáÀ"`èlÍJìÜ"`èôIìø"`è°"JøLbì$#`À8 ä l%Q@#`¤8 ä4#`$”Næ\#`üÈå P#`H}Wäx#`¬> äl#`êLæ#`> äˆ#`$†Uâh$`l ä #`äl Ü#`ááÿåäø#`ïDá$`è LTê0$`øL$`èTDøLbì”$`„8 äx$`„$`æ â@Kæ4%`l8 ä¤$`äl8 à$`ÿìäü$`äXI]çá%`è ˜ö ˜ê &`ÀÈåD%`äÀÈá€%`ááÿåäœ%`ïDá¸%`èÈBìÔ%`è ˜êð%`è ˜öÜ9NìÈ&`t> ä&`ät> X&`ÿìät&`ïá&`ø¬&`è|Jÿè€'`ôðäØ&`ä&`æ âô&`æä'`ïá,'`èÌýQìH'`è|Jêd'`è|Jÿèè'`øZ ä'`äøZ Ì'`ááÿå÷Dád*`,8 T*`ø'`(`æ â4(`,8 è$*`èâ`ê,8 ä(`äT(` ãá$)`˜Räd(`4(`˜R (`ÿèäÜ(`äÌ(`äã(`ì â(` ä)`èø(`ì â(`ðÌ(`êL)`df ä4)`ædf èât)`@µä\)`â 4)`@µ´Oä âœ)`0ä„)`â\)`0èâÄ)`Yå¬)`â„)`Yéâì)`tùäÔ)`â¬)`tùèâ*`Èí äü)`âÔ)`Èí èâ<*`$í ä$*`âü)`$í ð,8 äL*`(`æ\*`(`â€*`àZ ät*`¼nTæ*`tkä /JäL ä ì!U\+`¨Éå°*`ä¨Éáì*`äÿåä+`ïá$+`éBJì@+`éBJùBJì|/`ô äl+`äô ¨+`ÿìäÄ+`ïíà+`ì âð+`æâ ,`Ðwø.`è /`ä @ápl/`æÐwäð+`ä@,`ãá"œ-`ôOä,`P,` ,`ôOŒ,`ÿèä¸,`ìãð+`øÔ,`ì âð+`èì,` ,`ôO(-`ÿèäT-`ìãð+`ìp-`èÔ,`øŒ-`ê âð+` äL.`˜Rä¬-` ,`˜Rè-`ÿèä.`äŒ-`äãð+`ì0.`èÔ,`øŒ-`êà.`”/ä\.` ,`”/˜.`âÿèäÄ.`ìááð+`öÔ,`ðÐwäð.`ð+`æLÐMì/`ð+`ä$ââ ,`l¨X/`ÿä$ìâ%æÀåFT0`x? äŒ/`äx? È/`ÿìää/`ïâ0`èlÍJì0`èôIì80`è°"JøLbì€0`ˆ[ p0`d0`@4Kêx0`@4Kâ 1`X? ä0`äX? Ì0`ÿìäè0`ïá1`èœBø ˜ì¤1`ìñä01`äìñl1`ááÿåäˆ1`ïDí(¼LìÀ1`lÖä´1`8PæH6`$9 äÐ1`Ø1`âDâ2`$9 è6`èâpê$9 äØ1`ä(2` ãáø2`˜Rä82`2`˜Rt2`ÿèä°2`ä 2`äãØ1`ì âØ1` äÜ2`èÌ2`ì âØ1`ð 2`ê 3`ls ä3`æls è@âð4`ôœä03`â 3`ôœH3`ä<â âX3`æ âh3`æ â˜3`Hp èÀ4`èâpêHp äh3`ä¸3`ãáˆ4`˜RäÈ3`˜3`˜R4`ÿèä@4`ä04`äãh3`ì âh3` äl4`è\4`ì âh3`ð04`ê°4`¨ä˜4`樰KäâØ4`ìâäÀ4`â˜4`ìâðHp äè4`h3`â5`så5`â03`sè8â@5`¨{ä(5`á 5`¨{ÐXLä âh5`á{äP5`â(5`á{ü\Nä â5`\›äx5`âP5`\›èâ¸5`\A ä 5`â x5`\A °Käâà5`”ÁäÈ5`â  5`”Á@ZLäâ6`Ô¡äð5`âÈ5`Ô¡èâ06`ìâä6`âð5`ìâð$9 ä@6`Ø1`â`6`d[ äX6`,™Qâ|6`à äp6` 9^æ¨7`TÖäŒ6`äTÖÈ6`ááÿåää6`ïDâ7`ø7`ø87`èTDêT7`è|Jìp7`øŒ7`ÿä\½MìÄ7`<Öä¸7`|£Kæh9`$ÖäÔ7`à7`æâ8`¬Wè89`èâpê¬Wäà7`ä08`ãâ9`˜Rä@8`8`˜R|8`ÿèä¸8`ä¨8`äãà7`ì âà7` ää8`èÔ8`ì âà7`ð¨8`ê(9`pä9`æpèâP9`X¯ä89`â9`X¯ð¬Wä`9`à7`â:`Økäx9`äØk´9`ááÿåäÐ9`ïDáì9`è ˜ÿæÐ;`XÉå:` :`â âP:`XÉé ;`èâpêXÉå :`äp:`ãá@;`˜Rä€:`P:`˜R¼:`ÿèäø:`äè:`äã :`ì â :` ä$;`è;`ì â :`ðè:`êh;`´}äP;`æ´}èâ;`|^ äx;`âP;`|^ èâ¸;`ðä ;`â x;`ð¼tLìXÉåÈ;` :`æ” äà;`ä” <`ÿìì(ñVêT<`LÊåH<`l;_æ,=`è9 äd<`äè9  <`ÿìä¼<`ïáØ<`èlÍJìô<`èôIì=`è°"JøLbì<=`×ä xN>`<\ äL=`ä<\ ˆ=`ÿìä¤=`ïáÀ=`èè‹KìÜ=`øø=`è”}KøLbì0>`¤@ ä$>`3Pæä?`$ ä@>`L>`æ â\>`æ âŒ>`¨±è´?`èâpꨱä\>`ä¬>`ãá|?`˜Rä¼>`Œ>`˜Rø>`ÿèä4?`ä$?`äã\>`ì â\>` ä`?`èP?`ì â\>`ð$?`ê¤?`ÖäŒ?`æÖ°KäâÌ?`ž ä´?`â Œ?`ž ˜ì¨±äÜ?`\>`âdB`,×äô?`á@`æXâ0@`xìè4B`èâ@êxìå@`äP@` ãá A`˜Rä`@`0@`˜Rœ@`ÿèäØ@`äÈ@`ää@`ì ã@` äA`èô@`ì ã@`ðÈ@`ê\A`4úä0A`æ4úHA`äâ @ê@ä„A`$/älA`â 0A`$/Ü9Näâ¬A`ðÂä”A`âlA`ðÂèâÔA``kä¼A`â”A``kè âüA` hääA`â¼A` hèâ$B`¬Çä B`â äA`¬ÇÈBäâLB`ìâä4B`â B`ìâðxìä\B`á@`âC`lätB`äl°B`ááÿåäÌB`ïDáèB`è¼p-øPÏIì C`´9 äC`,ZæKì R`èLbì`ãÜS`\S`ãT`äØäôS`ŒHMæØT`„] äT`ä„] LT`ÿìähT`ïá„T`èlÍJì T`èôIì¼T`è°"JøLbìôT` ËåèT`øÓVæU`Ëå ä®JÀU`tmäU`ätmPU`ááÿåälU`ïDáˆU`è4íIì¤U`èTDøTDêØU`8] äÐU`ˆ¥MâôU`ÈØäèU`°]æV`”óäV`ðiOæ,Y`<; ä V`ä<; \V`ááÿåäxV`ïDá”V`èì¥KìY`è°V`ê âÀV`æ(âðV` ƒèàX`èâpê ƒäÀV`äW` ãáàW`˜Rä W`ðV`˜R\W`ÿèä˜W`äˆW`äãÀV`ì âÀV` äÄW`è´W`ì âÀV`ðˆW`êX`xÂäðW`æxÂîä$â0X`œäX`â ðW`œŒíLäâXX`Ü“ ä@X`âX`Ü“ èâ€X`@ÉähX`â @X`@É ˜â â¨X`´)åX`âhX`´)éâÐX`Ð0å¸X`âX`Ð0éâøX``0åàX`â¸X``0ñ ƒäY`ÀV`þZ`; äNæTl`„Ùäàk`ä„Ùl`ááÿåä8l`ïDýpl`”^ ädl`d _ê Ìå€l`ä Ìá¼l`ÿìäØl`þ86Jì m`D äm`¨â_âäm`l< äm`äl< Xm`ÿìätm`ïám`èlÍJì¬m`èôIìÈm`è°"JøLbìüm`LÍåôm`x_âœn`\` ä n`ä\` Hn`ÿìädn`ïá€n`èLbøÌRZìÈp`8` ä¬n`¸n`æâèn`€¶è˜p`èâpꀶä¸n`äo`ãáØo`˜Räo`èn`˜RTo`ÿèäo`ä€o`äã¸n`ì â¸n` ä¼o`è¬o`ì â¸n`ð€o`êp`È‚äèo`æÈ‚áp`äâ â¸vSæ8p``cä p`âèo``cè â`p`ìläHp`â p`ìl ˜äâˆp`¬®äpp`â Hp`¬® ˜äâ°p`0Ää˜p`â pp`0Ä|J쀶äÀp`¸n`â„q`ŒÚäØp`äŒÚq`ááÿåä0q`ïDáLq`øhq`ÿô s`tõä”q` q`æ â°q`æâàq`äès`èâpêää°q`år`ãáÐr`˜Rär`àq`˜RLr`ÿèäˆr`äxr`äã°q`ì â°q` ä´r`è¤r`ì â°q`ðxr`êør`r äàr`ær èæ˜Bäs`âàr`˜Bì8s`DÚä0s`ŒTâTs`,ÍåHs`X„Væôt`ü_ äds`ls`â âœs`ü_ èÄt`èâpêü_ äls`ä¼s`ãáŒt`˜RäÌs`œs`˜Rt`ÿèäDt`ä4t`äãls`ì âls` äpt`è`t`ì âls`ð4t`ê´t`ÔÜäœt`æÔÜèâÜt`̉ äÄt`â œt`̉ ,ÇJìü_ äìt`ls`â u`¤näu`ÄÁJâüv`,Úäu`$u`ââTu`,ÚèÌv`èâpê,Úä$u`ätu`ãáDv`˜Rä„u`Tu`˜RÀu`ÿèäüu`äìu`äã$u`ì â$u` ä(v`èv`ì â$u`ðìu`êlv`¤äTv`æ¤èâ”v`Ü&ä|v`âTv`Ü&èâ¼v`P6 ä¤v`â |v`P6 ð$Käâäv`,ãäÌv`â ¤v`,ãð$Kì,Úäôv`$u`â€w`È_ ä w`äÈ_ Hw`ááÿåädw`ïDíœBð¬_ äw`êäx`Ôä¬w`äÔèw`ÿìäx`ïá x`èÈBì äŸ`8¼Lâ4Ÿ`ìE ä,Ÿ`Ô·RâðŸ`däDŸ`äd€Ÿ`ááÿå䜟`ïDḟ`è4íIìÔŸ`èTDøTDê `Ð÷å `äÐ÷< `ááÿåäX `äìXMçDát `èÌýQø|Jê0¡`ÐE ä  `äÐE Ü `ááÿåäø `ïDá¡`èì¥Køà$Kì@¢`ôÏå@¡`äôÏá|¡`ááÿå䘡`ïDá´¡`è|JêС`èœBìì¡`èœBì¢`ø$¢`è°d]ÿè\¢`ìa äP¢`¼p-ê4> äl¢`ä4> ¨¢`ÿìì1Jêð£`X? äÔ¢`äX? £`ÿìä,£`ïáH£`èÈBìd£`ø€£`è|Jꜣ`è|J긣`è|JìÔ£`ÿä¼p-ìȤ`@? å¤`ä@? <¤`ááÿåäX¤`ïDát¤`è|Jì¤`ø¬¤`ÿäÔDì ¥`4G äؤ`ä4G ¥`ÿìä0¥`ïáL¥`è óRìh¥`ø„¥`ÿä|Jìì¥`„b ä°¥`æ„b ´OâÿåĦ`øF äü¥`äøF 8¦`ÿìäT¦`ïáp¦`èlÍJ쌦`èôI쨦`è°"JøLbì§`ìÜäÔ¦`æìÜ´Oâÿå<§`Ìøä §`,§`æ â` `æX§`€F äL§`èëZæ8©`¸Ðåh§`t§`æˆâ¤§`hÁè©`èâ@êhÁät§`äħ`ãᔨ`˜RäÔ§`¤§`˜R¨`ÿèäL¨`ä<¨`äãt§`ì ât§` äx¨`èh¨`ì ât§`ð<¨`êШ`H䤨`æH¼¨`äâ €ê@äø¨`8Ïäà¨`⤨`8Ïèâ ©`àÏä©`âà¨`àÏðhÁä0©`t§`âT©`¸øäH©`D§^êÐåd©`äÐá ©`ááÿå伩`ïDáØ©`øô©`èÀUìª`ø,ª`ÿô0«`¸? äXª`ä¸? ”ª`ááÿåä°ª`äœ+VçDá̪`è|Jöèª`ì âøª`æä«`ïýì«` ä@«`ä |«`ÿì䘫`äTDçá´«`èLbìЫ`èTDøÌ9N쌬`ŒÝäü«`äŒÝ8¬`ÿìäT¬`ïáp¬`èFKøäIKìH­`Œäœ¬`äŒج`ÿìäô¬`ïá­`è|Jì,­`èÈBø|JìX®`lÝäX­`älÝ”­`ÿìä°­`ïáÌ­`èÈBìè­`èœBì®`è ˜ì ®`è4ÏPì<®`è4ÏPÿè$°`xÑåh®`t®`æ ⤮`Lðèô¯`èâpêLðät®`äÄ®`ãᔯ`˜RäÔ®`¤®`˜R¯`ÿèäL¯`ä<¯`äãt®`ì ât®` äx¯`èh¯`ì ât®`ð<¯`꼯`ô• 䤯`æô• |Jäâä¯``%ä̯`â ¤¯``%|Jäâ °`àsäô¯`â ̯`às|JìLðä°`t®`â<°`pä4°`€~VâÀ°`áqäL°`åqˆ°`ááÿå䤰`ïDíœBìذ`Ñåа`„}OæÀb äè°`äÀb $±`ÿìä@±`ïýô³`Òål±`äÒᨱ`ðà±`öäı`ìð(PìT²`h²`åçäçæááxýâèí`èâpêH>äðê`ä@ë` ãáì`˜RäPë` ë`˜RŒë`ÿèäÈë`ä¸ë`äãðê`ì âðê` äôë`èäë`ì âðê`ð¸ë`ê8ì`À×ä ì`æÀ×Ô·Sä@â`ì` XäHì`â ì` XÔ·Sä8âˆì`4ôäpì`â Hì`4ô°Kä0â°ì`€® ä˜ì`â pì`€® @ZLä$âØì`äIåÀì`â˜ì`äIá@ZLäãí`ÈU äèì`â Àì`ÈU ü\Näâ(í`T›äí`âèì`T›ðH>ä8í`ðê`â\í`lC äPí`pMætí`øáälí`œ¿Yâ0î`àáä„í`äàáÀí`ááÿåäÜí`ïDáøí`è„KUìî`蘈_ÿèLî`üüä@î`ls`æhî`ÀJ ä\î`pOæï`lÕåxî`älÕá´î`ááÿåäÐî`ïDáìî`èœBøIPì ï`,täï` ÆOâ<ï`€e ä0ï`êXï`äø5aâ Ð5aœ>ÌýQäâ86aLJä 6aâø5aLJè â`6aŒDäH6aâ 6aŒDèâˆ6a”ó äp6aâ H6a”ó lZäâ°6aÔ%ä˜6aâp6aÔ%ðÈ—äÀ6aá4aâä6aðäØ6aô'Xêk äô6aÌkk \Aò Aöx8a°zä@7aä°z|7aÿìä˜7aïá´7aèœBìÐ7aøì7aø8aø$8aø@8aø\8aèœBøX-ì9a¬äˆ8aä¬Ä8aÿìäà8aïáü8aÿädžTìD9aŒzä(9a49aæ âØqTæ9aük äT9aæük ´Oâÿå0:aðä 9aäðÜ9aááÿåäø9aïDá:aè4íIøTDê\;a@éä@:aä@é|:aááÿåä˜:aïDá´:aøÐ:aè|Jêì:aø;aèœBì$;aèTDì@;aèLbø8oêIaHP äl;at;aâ4â¤;aHP èäHaèâpêHP ät;aäÄ;a ãá”aÐa èHaèâpêÐa äÜ=aä,>aãáü>a˜Rä<>a >a˜Rx>aÿèä´>aä¤>aäãÜ=aì âÜ=a äà>aèÐ>aì âÜ=að¤>aêüAa,~ä ?aä,~$?aäâ â4?aæ4âd?aäÏ èÌAaèâpêäÏ ä4?aä„?a ãáT@a˜Rä”?ad?a˜RÐ?aÿèä @aäü?aäã4?aì â4?a ä8@aè(@aì â4?aðü?aê|@a@9 äd@aæ@9 ¨¢Lä0â¤@að äŒ@aâ d@að Rä(âÌ@aá ä´@aâŒ@aá °Kä âô@aHã äÜ@a´@aHã œBäâAaH. äAaâÜ@aH. èâDAaUä,AaâAaUèâlAaPÉäTAaâ,AaPÉèâ”Aa´ä|Aaâ TAa´œBäâ¼Aa”Áä¤Aaâ |Aa”Á@ZLäâäAaìâäÌAaâ¤AaìâðäÏ äôAa4?aâ”Eaè ä Ba ?aè $Baäâ â4BaæDâdBa¤N èdEaèâpê¤N ä4Baä„BaãáTCa˜Rä”BadBa˜RÐBaÿèä CaäüBaäã4Baì â4Ba ä8Caè(Caì â4BaðüBaêŒCa‰ ädCaæ‰ |Caä@â â,d`æ´Caˆf äœCaâdCaˆf è<âÜCa\A äÄCaâ œCa\A °Kä4âDaàœäìCaÄCaàœDaä0â âü\Næäsaâ èra¨>ø,Jìø× ä8saápaâŒsa\ìäPsaæ\ì´OâÿåðxaáßåœsaåßáØsaÿìäôsaïítaì â taæâ PtaxÜ lxaè€xaä @ápàxaæxÜ ä taäptaãá"ÌuaôOua€taPtaôO¼taÿèäètaìã taøuaì â taèuaPtaôOXuaÿèä„uaìã taì uaèuaø¼uaê â ta ä|va˜RäÜuaPta˜RvaÿèäDvaä¼uaäã taì`vaèuaø¼uaêwa ÂäŒvaPta ÂÈvaâÿèäôvaìáá taöuaì¤wa ôä waPta ô\waâÿèäˆwaìáá taöuaìTxaT7 ä´waPtaT7 ðwaâÿèäxaìáá ta ê8xaèuaøÜñNðxÜ ädxa taæˆbìxa taä ââPtatS Ìxaÿä ìâðÉêyùºÎŒ‚ªK© ya\|åyal,Qâ$ya@ìäyaSæüyaèK ä4yaäèK pyaááÿåäŒyaäTDçDá¨yaè4íIìÄyaèTDìàyaÿô´za4n ä zazaæ â(zaæäDzaïá`zaèœBì|zaèèQLê˜zaÿä jRêø|aèÞåÄzaÐzaæ´â{a4ÿèÈ|aèâ@ê4ÿäÐzaä {aãáð{a˜Rä0{aá {a˜Rl{aÿèä¨{aä˜{aäãÐzaì âÐza äÔ{aèÄ{aì âÐzað˜{aê,|aÄüå|aæÄü|aäá  êPäh|a€Mä<|aã |a€MT|aä â éã|aè äx|aâ<|aè èâ¸|a”Cä |aâx|a”Cèâà|a$/äÈ|aâ  |a$/Ü9Nì4ÿäð|aÐzaâ$}aÌä}a}aæ ⸚Wæ(~aÌÞå4}aäÌÞáp}aááÿåäŒ}aïDá¨}aèÈBìÄ}aøà}aè¸3Mêü}aÿä~aì âÌCæÈ~a´ä8~aä´t~aááÿåä~aïDá¬~aè ˜ö ˜ìLa(ìäØ~aä(ìaááÿåä0aïDýÐa´R ä\aä´R ˜aááÿåä´aïDí|Jîn äàaìaæ âüaææ€aä˜Ï ä ,€a|üaðH; üaèaˆäT€a䈀aÿì䬀aïáÈ€aèœBìä€aùaèœBÿèôaÌßå,aäÌßáhaÿìä„aïá aèlÍJì¼aèôIìØaè°"JøLb씂aP}ä‚aäP}@‚aÿìä\‚aïáx‚aè˜ÝKø¬1Lìlƒa`䤂aä`à‚aÿìäü‚aïáƒaèlÍJì4ƒaèôIìPƒaè°"JøLbì,„aðn ä|ƒaäðn ¸ƒaááÿåäÔƒaïDáðƒaÿä „aì â„aæ âÀ—`æx„a´ìä<„aæ´ì´OâÿåP…aÄn 䈄aäÄn Ä„aÿìäà„aïáü„aè8RQì…aè„øIì4…aè<ÐMøLbì`…a°ßå ä‚[x…a(M äp…aX¤Wâ…aP䈅atüYâ@†aM ä …aäM Ü…aááÿåäø…aïDá†aÿä0†aì âô\æà†a\ßåP†aä\ßጆaááÿå䨆aïDáĆaè”{Nÿèȇa”ìäð†aä”ì,‡aááÿåäH‡aïDᬇaèd‡aì ât‡aæä‡aïí|Jÿèà‡aLS ä؇aðaâdˆa4äð‡aä4,ˆaááÿåäHˆaä,„KçDí|JêèˆaÈ|ätˆaäÈ|°ˆaááÿåä̈aäl¹_çDí Uê‰aÜL äøˆa4ÏPæl‰aˆn ä‰aäˆn P‰aááÿåì|JçDሉaä|‰ahTW昉aèä t(X´‰a¸ä¨‰a0D^ê\n ä œà‰a¼M äÔ‰aœBæü‰a˜o äð‰aœ#ZæÔŠaðS ä ŠaäðS HŠaÿìädŠaïညaèlÍJ윊aèôI츊aè°"JøLb쬋aÜääŠaäÜ ‹aÿìä<‹aïáX‹aèlÍJìt‹aèôIì‹aè°"JøLbìÔŒa¸ä¼‹aÈ‹aæ âØ‹aæäô‹aïáŒaè Kê,ŒaøHŒaèœBìdŒaèœB쀌aøœŒaèLb츌aèØføLbìtaD~ääŒaäD~ aááÿåäâÄ b¼î ä¬ bâ „ b¼î œBä:âì b€ÙäÔ bâ ¬ b€Ù|Jâ6â bÜÄäü bâ Ô bÜÄ|Jâ2â< b8»ä$ bâ ü b8»²Qä.âd b « äL bâ $ b « LÏVä*⌠bô¤ ät bâL bô¤ è&â´ bœ>äœ bâ t bœ>ÌýQä"âÜ b˜í äÄ b✠b˜í è â b€ýåì bâÄ b€ýéâ, bPø ä bâì bPø èâT b¬·ä< bâ b¬·èâ| bH?äd bâ< bH?è⤠bLxäŒ bâd bLxèâÌ bð™ä´ bâ Œ bð™ì¥Käâô b°äÜ bâ ´ b°œBä âbìäbâ Ü bìœBäâDbXåä,bâ bXåÈBäâlb>åTbâ,b>ñHoä|bT bâœbÌZ ä”bT¶LâXb°Z ä¬bä°Z èbááÿåäbïDá bè(œJì<bÿä¼p-ìÜb|x ähbä|x ¤bááÿåäÀbïDí|Jììb¤èå \]VÄbðöäübäðö8bááÿåäTbïDápbøŒbø¨bè Kø,A[ì€bÀV äÔbäÀV bááÿåä,bïDáHbèœBêdbÿä|Jêb˜Z äbä˜Z ÌbááÿåäèbïDábèœBì bø<bøXbøtbèœBÿè¼b$)ä b¬bæ â¼bæâìbôèèŒbèâpêôèä¼bä bãáÜb˜Räbìb˜RXbÿèä”bä„bäã¼bì â¼b äÀbè°bì â¼bð„bêbÔ8äìbæÔ8œBââ,bÌ®äbâìbÌ®è âTbP+ä<bâbP+èâ|bÅådbâ<bÅéâ¤bìâäŒbâdbìâðôèä´b¼bâ@b”‡äÌb䔇bÿìä$bïí4ìOìÄbTZ äPbäTZ Œbÿìä¨bþÈ{Lð\‡äÔbH6JæðbÈ)ä &NÈb@éæbä@éá<bÿìäXbïátbèlÍJìbèôIì¬bè°"JøLbìØb|äØbä|bÿìä0bïáLbèðJìhbè|Jê„bø bø¼bÿäàJìôbˆ÷äèb8oæbèZ äb°êYæ b,éå TrP<b\÷ä0b@ JæTbTW äLb¸¢Lâlb`ädbLÐ]âDb°‡ä|bä°‡¸bááÿåäÔbïDáðbø bè¼p-ì(bèœBøT±Píb4W äTbä4W bááÿåä¬bïDáÈbèœBìäbèPÏIøœBìØb W äbä W LbááÿåähbïDá„bèÈBì bè|Jê¼bÿôôbäx äèbÊOê4äbä4@bááÿåä\bïDáxbè ˜ì”bÿä ˜êÌb$X äÀbSæäb¬*äÜb@˜Yâ¼b¸y äôbä¸y 0bÿìäLbïáhbèlÍJì„bèôIì bè°"JøLbìØbðW äÌbî ˆäèbôbæ âðaæÜbìX äbäìX PbááÿåälbïDáˆbè|Jì¤bøÀbÿäX-ì´bX+äìbäX+(bÿìäDbïá`bèlÍJì|bèôIì˜bè°"JøLbìŒb(+äÄbä(+ábÿìäbïá8bèlÍJìTbèôIìpbè°"JøLbì¸b +¨bœbˆCRê°bˆCRâÔb\ äÈbXQRç bDääbðbæ âœÛaæØ bÈX ä bäÈX L bááÿåäh bäTDçDá„ bè4íIì  bè)Jì¼ bèTDÿæ0#bÔ[ äè bð bââ !bÔ[ èH"bèâpêÔ[ äð bä@!bãá"b˜RäP!b !b˜RŒ!bÿèäÈ!bä¸!bäãð bì âð b äô!bèä!bì âð bð¸!bê8"bHéä "bæHéœBäâ#b¤ŽäH"bâ "b¤Ž`"bè âp"bæäŒ"bïá¨"bèœBìÄ"bøà"bè ˜êü"bè ˜øœBðÔ[ ä(#bð bâL#bKì¸1b Y äð0bä Y ,1bÿìäH1bïád1bèlÍJì€1bèôIìœ1bè°"JøLbì2bŒ{ äÈ1bæŒ{ œBäÿå 2b¤ùä2bœÛaæ3bdùä02bädùl2bááÿåäˆ2bïDá¤2bøÀ2bèTDìÜ2bè\¯Pìø2bÿäTDì,3bLùä$3b  \âH3bhëå<3b~[æd3bLëåX3bhç[æÜ4b$Y ät3b|3bââ¬3b$Y è¬4bèâpê$Y ä|3bäÌ3bãáœ4b˜RäÜ3b¬3b˜R4bÿèäT4bäD4bäã|3bì â|3b ä€4bèp4bì â|3bðD4bêÄ4bT ä¬4bæT ð$Y äÔ4b|3bâ5b¸+äì4bø4bæ â ^ëùä5b æYæ46bL| ä45bäL| p5bÿìäŒ5bïá¨5bè\½MìÄ5bøà5bè ˜êü5bè(¹Kì6bÿôP6b úäD6bܼKæ`7b¼Šä`6b伊œ6bÿìä¸6bïáÔ6bèLBKìð6bèFKì 7bèLBKì(7bè|JìD7bèLbøˆZKì|7bŠäp7bP¡Læ˜7bøëåŒ7bTåSæT8bpŠä¨7bäpŠä7bÿìå8bïá8bø88bè ˜øLbìø9bÈäd8bp8bæâ 8bøêèÈ9bèâpêøêäp8bäÀ8bãá9b˜RäÐ8b 8b˜R 9bÿèäH9bä89bäãp8bì âp8b ät9bèd9bì âp8bð89bê¸9bls ä 9bæls èâà9bìâäÈ9bâ 9bìâðøêäð9bp8bâ|:bT] ä:bäT] D:bááÿåä`:bïDí¬Zê”:bÈëåŒ:bà†`â°:b,ä¤:bì§Lê˜ëåÀ:büaæÜ:b€ìå ÖJì:bpZ ä POQ¨;b¨,äü:bä¨,8;bäÿåäT;bïáp;bè|JêŒ;bèFKø”½^ì€bæâ 4>b<~DAbèXAbä @áp¸Abæ<~ä>bäT>bãá"°?bôOø>bd>b4>bôO >bÿèäÌ>bìã>bøè>bì â>bé?b4>bôObì„?bèè>bø ?bê â>b ä`@b˜RäÀ?b4>b˜Rü?bÿèä(@bä ?bäã>bìD@bèè>bø ?bê,AbÜ„ äp@b4>bÜ„ ¬@bâÿèäØ@bìáá>b êô@bèè>bìAbÿø<~äbæˆbìhAb>bäââ4>b€má ¤Abÿäìâ®ö ¼xˆÑƒéÀOÂÆÔäAbÿôØBb,ûäBbä,ûLBbÿìähBbïá„BbèlÍJì BbèôIì¼Bbè°"JøLbìxCb8} äèBbä8} $Cbÿìä@CbäœBçá\CbèÈBÿè4DbPäˆCbäPÄCbÿìäàCbïáüCbèœBìDbè|Jö|JêPDbh‹äDDb`FZæhDb ûä`Db<_^âEbü| äxDbäü| ´DbááÿåäÐDbïDáìDbÿô$EbÔúäEb äPæÄEb¬úä4Ebä¬úpEbááÿåäŒEbïDá¨EbèœBÿèàEb„úäÔEbx­Lêˆ] äðEbÌkˆ] ÈAðŒAöGbäûäUæð b°ä| bä°¸ bááÿåäÔ bïDþ¡b|„ äÜéSä`„ ä Kìd¦bèLb쀦bè N윦bèðJøØfìÔ¦bäȦbèMUæð¦b(÷åä¦bðÿ`æ §bèå§bü½_æ(§b¤e ä§bXCJæ@§bä8§bxQâ\§bÐ… äP§b¬_æà§b’äl§bä’¨§bááÿåäħbäœBçDíœBì$ªb`e äð§bü§bæLâ,¨bŒ¸ èô©bèâpꌸ äü§bäL¨bãá©b˜Rä\¨b,¨b˜R˜¨bÿèäÔ¨bäĨbäãü§bì âü§b å©bèð¨bì âü§bðĨbêD©bt« ä,©bæt« 0USä$âl©bHhäT©bâ,©bHhè ┩bˆWä|©bâT©bˆWè⼩bÔ¡ 䤩bâ|©bÔ¡ èâä©bøVäÌ©bâ ¤©bøV,ÅJäâ ªb̉ äô©bâ Ì©b̉ ,ÇJ쌸 äªbü§bâ4«bŒä4ªbäŒpªbááÿå䌪bïDᨪbè ˜ìĪbè ˜ìàªbè ˜ìüªbø«bÿäØfìP«bXe äD«bÔ­Kæl«bT4ä`«b$±_æ|«b… äôéSäœö匫bäœöáÈ«bäê¬böää«bìå¬bè|Pö|Pê¬b¸¬båçäçæááxýâ0Ó|Pâ¼á @dÒ|Pâ½á@ âäЬbä2€èü¬büé(­bü8é T­b€­b¦ô:âø¥äx¦ü®bˆ­b2œBä´­büPÏIäà­bü: ®bä¼ý â|P樮b$®b2œBäP®büPÏIä|®bü: ®bä½ÿá°®b4êþ$²b øåì®bø®bæ0â(¯bèô±bèâpêäø®bäH¯bãá°b˜RäX¯b(¯b˜R”¯bÿèäЯbäÀ¯bäãø®bì âø®b äü¯bèì¯bì âø®bðÀ¯bêT°b<\ä(°bæ<\@°bä,â êä|°b0Yäd°bâ(°b0Yè(⤰b€Ì 䌰bâd°b€Ì è$â̰b”ä´°b⌰b”è âô°bjåܰbâ´°bjéâ±b ä±bâܰb èâD±blÆå,±bâ±blÆéâl±bèŒäT±bâ,±bèŒèâ”±blðä|±bâT±blðè â¼±b©ä¤±bâ|±b©èâä±bä̱b⤱bèâ ²bÜäô±bâ̱bÜðä²bø®bâ4²b´4ä Tm[ ³b°’äD²bä°’€²bÿì䜲bïḲbèlÍJìÔ²bèôIìð²bè°"JøLbì³bf ä LdJ,´b8† ä,³bä8† h³bááÿå䄳bïDá ³bèLbì¼³bè|Pêسbè„ëIìô³bø´bèœBÿè°´bØe ä<´bäØe x´bÿìä”´bïî/QìÈ´b0f äÀ´bøÃ\âà´bä÷娴bˆVPâü´bf äð´bP—Qæµbœ’ä µbœBæ4µb\’ä(µbdžTê<äDµb\eQ朵bì† ä`µbæì† ´Oâÿå´µb<䬵b”gTâ8¶b f äĵbä f á¶bááÿåä¶bïDíXaêT¶bÈäH¶bp9Jæd¶b¬ä¸/Jäà’ä ðØ·bðf ä„¶bäðf À¶bÿìäܶbïáø¶bèœBì·bèTDì0·bøL·bèTDìh·bø„·bèTDì ·bø¼·bèTDÿèx¸b85äè·bä85$¸bÿìä@¸bïá\¸bèxCRø(œJì(¹b\䈸bä\ĸbÿìäà¸bïá ¹bèü¸bì âØŽ\óBJìT¹b|“ä8¹bD¹bæ âp8bæp¹b„äd¹bꜹb0‡ 䀹bŒ¹bæ â,Q渹bT䬹bî0“ä ȹb|Jäºb°g ää¹bä°g ºbÿìä<ºbïáXºbèœBìtºbÿäœBìL»b4ˆ ä ºbä4ˆ ܺbááÿåäøºbïDá»bè„ëIì0»bÿô$¼bdg ä\»bädg ˜»bÿìä´»bïáлbèlÍJìì»bèôIì¼bè°"JøLbìP¼bHg @¼b4¼bP ZêH¼bP Zâ`¼b$ˆ ä ä«J|¼bì‡ äp¼bÄæRæ8½bЇ 䌼bäЇ ȼbááÿåää¼bïDâ½bèXòPì½bèdUÿèP¾bÀ“äH½bT½bæäp½bä4ìOçጽbø¨½bøĽbèÜóLìà½bè¬Kìü½bè¬Kì¾bè4ìOì4¾bÿôl¾bg ä`¾b\Sbæ ¿bä|¾b举bááÿåäÔ¾bä¬@MçDáð¾bèÌýQø|Jꬿb 5ä¿bä 5X¿bááÿåät¿bïDá¿bèœBÿè„Àb„5伿bä„5ø¿bááÿåäÀbäœBçDá0Àbè|JêLÀbøhÀbÿäh¡Kñä”ÀbêÌÁbäf ä°Àbääf ìÀbááÿåäÁbïDá$Ábè04Kì@Ábè|Pê\ÁbøxÁbè”}Kì”Ábè Nì°ÁbèðJøØfìLÃb 7äÜÁbä 7Âbÿìä4ÂbïáPÂbèìÂMìlÂbøˆÂbø¤ÂbèTDìÀÂbøÜÂbèTDìøÂbøÃbèX-ì0ÃbèX-ÿè\Ãbüøå À…[DÄb$”älÃbä$”¨ÃbÿìäÄÃbïáðÃbèàÃbì âô(Xæ Äbè|Pê(Äbè|PöØfìÄb8äTÄbæ8´Oâÿå¬Äbäøå Äb(+^æÄÄbð6ä¼Äb€Õ`âÔÄbàä "MtÆbÌg ääÄbìÄbââÅbÌg èDÆbèâ@êÌg äìÄbä<Åbãá Æb˜RäLÅbÅb˜RˆÅbÿèäÄÅbä´ÅbäãìÄbì âìÄb äðÅbèàÅbì âìÄbð´Åbê4Æb¤ÜäÆbæ¤Üèâ\Æb ûäDÆbâÆb ûðÌg älÆbìÄbâŒÆb ”䄯b<ÙOâ¨ÆbPˆ äœÆbhQbæ,Çb´6䏯bä´6ôÆbááÿåäÇbïDí|JêèÇbœä<ÇbäœxÇbááÿåä”ÇbïDá°Çbèì¥KìÌÇbÿä|Jì¤Èbì“äøÇbäì“4ÈbááÿåäPÈbïDálÈbè,„KìˆÈbÿädZTì¼ÈbØ“ä´ÈbÞQâÔÈbP6äÌÈbÜÈ\âðÈb<6ääÈb ˜ætÉbŒøæÉbäŒøá<ÉbÿìäXÉbþ”/SðDä„Éb´ûWæhÊb,úå Ébä,úáÜÉbÿìäøÉbïáÊbèlÍJì0ÊbèôIìLÊbè°"JøLbìÏbüùåxÊbäüùá´ÊbÿìäÐÊbïíìÊbì âüÊbæâ ,ËbD( ˜Îbè¬Îbä @áp ÏbæD( äüÊbäLËbãá"¨ÌbôOðËb\Ëb,ËbôO˜ËbÿèäÄËbìãüÊbøàËbì âüÊbèøËb,ËbôO4Ìbÿèä`ÌbìãüÊbì|ÌbèàËbø˜Ìbê âüÊb äXÍb˜Rä¸Ìb,Ëb˜RôÌbÿèä Íbä˜ÌbäãüÊbì<ÍbèàËbø˜ÌbêìÍbä!å hÍb,Ëbä!á¤ÍbâÿèäÐÍbìááüÊböàËbì€Îb|ÒäüÍb,Ëb|Ò8ÎbâÿèädÎbìááüÊb öàËbðD( äÎbüÊbæˆbì¼ÎbüÊbäââ,ËbHz øÎbÿäìâèÉêyùºÎŒ‚ªK© 8Ïbè”ä,Ïb,ª_æHÏb¤ˆ ä èvXXÏbØä €•UtÏbДähÏbœBæŒÏb´ùå„ÏbýaâÐbØäœÏb䨨ÏbááÿåäôÏbïDí ˜êèÐb,g ä Ðbä,g \ÐbááÿåäxÐbïDá”ÐbèœBì°Ðbè¬6VêÌÐbÿäLbìÑbäøÐbÑbæ â Næ°Òblùå$Ñbälùá`Ñbááÿåä|ÑbïDá˜Ñbè ˜ê´ÑbèœBìÐÑbè ˜ììÑbè ˜ìÒbèœBì$Òbø@Òbè]ì\ÒbøxÒbèLbì”ÒbèîøîìÌÒbT”äÀÒbˆbæèÒbXùåÜÒb„KUæÓb4ùåøÒb˜ aê47äÓbä47PÓbÿìälÓbïí ˜ê Óbtúå˜Ób¬+VâxÔbh•ä°Óbäh•ìÓbÿìäÔbïá$ÔbèlÍJì@ÔbèôIì\Ôbè°"JøLbìPÕb<•äˆÔbä<•ÄÔbÿìäàÔbïáüÔbèlÍJìÕbèôIì4Õbè°"JøLbìlÕbÔg ä`Õb¤}Kæ|Öb` ä|Õbä` ¸ÕbÿìäÔÕbïáðÕbèœBì Öbø(ÖbøDÖbèTDì`ÖbÿäLbìŒÖbPúå Œ¬J¨ÖbôäœÖb`dbæÄÖb¨g ä¸ÖbX-êlg äÔÖbälg ×bÿìì3Jê”×b –ä<×bä –x×bÿì÷á4Øb!ä¤×bä!à×bááÿåäü×bïDáØbèhEø8oì Ùbì äDØbäì €ØbÿìäœØbïá¸ØbèlÍJìÔØbèôIìðØbè°"JøLbì¬Ùbˆ–äÙb䈖XÙbäÿåätÙbïáÙbèX„LöX„LìLÚb|h ä¼Ùbä|h øÙbÿìäÚbïá0Úbè<3]ø|JìdÚb`h ä\Úb”øIâ<Ûbä ätÚbää °ÚbÿìäÌÚbïáèÚbèlÍJìÛbèôIì Ûbè°"JøLbìTÛb@i äLÛbâ\â,Üb$i ädÛbä$i  Ûbäÿåä¼ÛbïáØÛbøôÛbøÜbèTDÿæHÜb8–ä<Üb†Pæ`Üb´úåXÜb¨`âTÝbÔh äpÜbäÔh ¬ÜbááÿåäÈÜbïDáäÜbèœBíÝbøÝbø8ÝbètºJøLbì,Þb‰ ädÝbä‰  Ýbááÿåä¼ÝbïDáØÝbè¬@MìôÝbøÞbÿä<¼SêHÞb8ä<ÞbpOæèÞbp‰ äXÞbäp‰ ”Þbááÿåä°ÞbïDáÌÞbèì¥Kÿèáb˜úåøÞbßbæ\á4ßbìdèèàbèâpêìdäßbäTßbãá$àb˜Rädßb4ßb˜R ßbÿèäÜßbäÌßbäãßbì âßb äàbèøßbì âßbðÌßbê`àb˜~ä4àbæ˜~Làbäá @ê äœàbô§äpàbâ 4àbô§ˆàbäÜâ @ê äØàb€oä¬àbâ pàb€oÄàbä\â €ê@åáb$›äèàbâ ¬àb$›TNììdäábßbæ´•ä(ábä´•dábð¸áböä€ábìãœábè|Pö|Pê,âbTâbåçäçæááxýâ0Ó|Pâ·á @dÒ|Pâ¸á@—âälâbä2€è˜âbüéÄâb ébøéðâbäæbøéãb¨äbøéHãbøãbøétãbü2áLbä ãbüPÏIäÌãbü: ®bä·ýé$äbü2áLbäPäbüPÏIä|äbü: ®bä¸ýéÔäbÜåbøêåbüáLbä,åb°åbø2áLbäXåbüPÏIä„åbü: ®bä·ý4êþéæbüáLbä4æb¸æbø2áLbä`æbüPÏIäŒæbü: ®bä¸ý4êþéçbèbøé<çbüáLbähçbìçbø2áLbä”çbüPÏIäÀçbü: ®bä·ý4êþéDèbüáLbäpèbôèbø2áLbäœèbüPÏIäÈèbü: ®bä¸ý4êþéLébTêbøéxébüáLbä¤éb(êbø2áLbäÐébüPÏIäüébü: ®bä·ý4ê þé€êbüáLbä¬êb0ëbø2áLbäØêbüPÏIäëbü: ®bä¸ý4ê þxëbÄ8älëbØìRæPìb8j äˆëbä8j ÄëbÿìäàëbïáüëbèlÍJììbèôIì4ìbè°"JøLbì(íbhi ä`ìbähi œìbÿìä¸ìbïáÔìbèlÍJìðìbèôIì íbè°"JøLbíîb8ä8íbä8tíbÿìäíbïá¬íbèlÍJìÈíbèôIìäíbè°"JøLbìØîb¬!äîbä¬!Lîbÿìähîbïá„îbèlÍJì îbèôIì¼îbè°"JøLbì”ïb4Š äèîbä4Š $ïbÿìä@ïbïá\ïbè ˜ìxïbè ˜ø ˜ì8ñbŠ ä¤ïb°ïbæâàïb`Åèñbèâpê`Åä°ïbåðbãáÐðb˜Räðbàïb˜RLðbÿèäˆðbäxðbäã°ïbì â°ïb ä´ðbè¤ðbì â°ïbðxðbêøðb´däàðbæ´dè â ñb„£ äñbâ àðb„£ ¨NNì`Åä0ñb°ïbâPñb0i äHñbˆäaâlñb¸ ä`ñbpQæ|ñbj ä h•U8òb(ûåŒñbä(ûáÈñbááÿåääñbïDâòbè4íIìòbèTDøTDêTòb˜ äHòbtüYædób!ädòbä! òbááÿåä¼òbïDáØòbèßPìôòbè|Jêóbø,óbøHóbèTDÿæèóbì‰ ätóbäì‰ °óbááÿåäÌóbä¬@MçDíœBî܉ äøób, Sæ ôbj äôbdIUæ8ôb ä0ôbèÙRâ¼ôbk äHôbäk „ôbááÿåä ôbïDýØôbøj äÌôb0pQæôôbT—äèôbÐWæ õbð!äõbÙUâ(õbD—äõb,ÇJæäõbˆûå8õbäˆûátõbááÿåäõbä8)MçDá¬õbèì¥KìÈõbè8)Mÿè8øb —äôõbáöbæ âöbæ0â@öb$øèøbèâpê$øäöbä`öbãá0÷b˜Räpöb@öb˜R¬öbÿèäèöbäØöbäãöbì âöb ä÷bè÷bì âöbðØöbêX÷b´}ä@÷bæ´}è,â€÷b,“äh÷bâ @÷b,“´Oäâ¨÷b8N ä÷bâ h÷b8N ´Oä âÐ÷bLxä¸÷bâ÷bLxèâø÷b|^ äà÷bâ¸÷b|^ èâ øbðäøbâ à÷bð¼tLì$øä0øböbâTøbä äHøb´Oæ øb´i ädøbÌk´i áAòTáAú€j ä°øbä€j ìøbÿìäùbåî-çá$ùbÿä ˜êàùb€j äPùbä€j Œùbÿìä¨ùbïáÄùbè8ÙJø|Jì€úb äðùbä ,úbÿìäHúbïádúbè8ÆKø8oìœúb Š äúbx_ætûbè ä¬úbäè èúbäÿåäûbïá ûbø<ûbøXûbèTDøLbìŒûb˜—ä„ûbäJâýbŒ"äœûb¨ûbæ â¸ûbæâèûb Ð è`ýbèâ@ê Ð ä¸ûbäübãáØüb˜Räübèûb˜RTübÿèäübä€übäã¸ûbì â¸ûb ä¼übè¬übì â¸ûbð€übëýb äèübæ è â(ýb ¬ äýbâèüb ¬ èâPýb$‹å8ýbâýb$‹á|JäâxýbxJä`ýbâ 8ýbxJ|Jì Ð äˆýb¸ûbâ¼ýb  ä ýb¬ýbæ â¬ïaæ$þbðûåÌýbäðûáþbááÿå÷Dá@þb¬k ä4þb@ûQæàþb4 äPþbä4 Œþbááÿåä¨þbïDáÄþbÿôœÿbP"äðþbäP",ÿbááÿåäHÿbäœBçDádÿbø€ÿbÿä|Jêèÿb@j ä¬ÿbÌk@j ×-æêD×-ö4cÈûå øÿbÌkÈûá\âAò âAúØûåDcäØûá€cÿìäœcïá¸cèœBìÔcèœBÿæÈc ™åcä ™<cÿìäXcïátcèlÍJìcèôIì¬cè°"JøLbì cxl äØcäxl cÿìä0cïáLcèlÍJìhcèôIì„cè°"JøLbì°c4k å|JÀcHüålhV˜cák äÐcåk cÿìä(cïáDcèlÍJì`cèôIì|cè°"JøLbì´c8l ä¨cFKæŒcàj äÄcäàj ácÿìäcïá8cèlÍJìTcèôIìpcè°"JøLbì€c`#äœcä`#ØcÿìäôcïácèœBì,cøHcødcèTDÿèXc(#äcä(#ÌcááÿåäècïDácèœBì cè°"Jì<cè ˜ÿè0c™ähc䙤cÿìäÀcïáÜcè4ìOìøcèTDìcÿôLcÈj ä@cŒaæÐcÔ˜ä\cäÔ˜˜cááÿåä´cïDí¬@MìÄ c9äàcìcæ âücæ(â,c £è” cèâpê £äücäLc ãá c˜Rä\c,c˜R˜cÿèäÔcäÄcäãücì âüc å cèðcì âücðÄcêD ct? ä, cæt? |Jâ$âl chH äT câ , chH |Jâ â” côúä| câ T côúÞQäâ¼ c¼D ä¤ câ | c¼D Ü9Näâä c$/äÌ câ ¤ c$/Ü9Näâ cœ>äô câ Ì cœ>ÌýQäâ4 cLJä câô cLJè â\ cŒDäD câ cŒDèâ„ c”ó äl câ D c”ó lZä⬠cÔ%ä” câl cÔ%ð £ä¼ cücâÜ càk äÔ c„YOâ c,üåì cø cæ â cæâ8 c$5èØ cèâPê$5ä cäX cãá( c˜Räh c8 c˜R¤ cÿèäà cäÐ cäã cì â c ä cèü cì â cðÐ cêP cÜ*ä8 cæÜ*è âx cáŸä` câ8 cáŸèâ  chŸäˆ câ` chŸèâÈ c¤0ä° c∠c¤0èâð cäØ câ° cð$5å c câ$ c4˜ä c|3bæÄ cÈŠ ä4 cäÈŠ p cááÿåäŒ cäœBçDᨠcÿø ˜äÔ cÌk ˜¦æêx¦ötc4m ä cä4m \cÿìäxcïá”cèœBì°cè|JìÌcøècè|Jìcø cè|Jì<cøXcè|Jÿèck ä„cäk ÀcÿìäÜcïáøcè|Jö|Jê´cÀ9ä$cäÀ9`cÿìä|cïá˜cè@{Røä„RícŒ™äÄc挙´OâÿåLc€9äcæ€9´Oâÿåhch‹ ä\c`Qæ„c´#äxcìïPæ@ch™ä”cäh™ÐcááÿåäìcäÈBçDácèÈBì$cèð$Kÿì„üåPc „Wæ4c,šälcä,š¨cÿìäÄcïáàcéSìücèTDêcÿäLbì c˜‹ äDc䘋 €cÿìäœcïá¸cèlÍJìÔcèôIìðcè°"JøLbì¬cxm äcäxm Xcÿìätcïácè¸çIÿèhcÔk ä¼cäÔk øcááÿåäcïDá0cè¬@MìLcÿôc($äxcä($´cááÿåäÐcä¬@MçDáìcèÌýQø ˜êàc:äcä:TcááÿåäpcäœBçDáŒcè ˜ê¨cøÄcÿäh¡Kì,cÀüå ðcÌkÀüá ãAòdãAú¬k ä<cÌk¬k ðâAò´âAö4c,l äˆcä,l Äcÿìäàcïáücè(!Lìcè|JøØÍKì c8;äDcä8;€cÿìäœcïá¸cèlÍJìÔcèôIìðcè°"JøLbì$ch äc„è\â4cÈ‹ ä „®JLc<$äDc,çOâhcHn ä\cÐÓOæ cT äxc„cæâ´cXèÜcèâpêXä„cäÔcãá¤c˜Rääc´c˜R cÿèä\cäLcäã„cì â„c äˆcèxcì â„cðLcêÌchÿä´cæhÿèâôcÐU äÜcâ´cÐU ðXäc„câtcn äcän Xcááÿå÷Dácpšä„c Uæ¨c¸:ä cá$]æ˜:ä¸cÄcæ â°˜Pæ cÈn ääcæÈn ´Oâÿå¤cøl ä0cäøl lcÿìäˆcïî/Qì|cHä´cäHðcÿìä cïá(cèlÍJìDcèôIì`cè°"JøLbìÈctŒ äŒcætŒ œBäÿåØcÄšä XR°cX$äècäX$$cááÿåä@cäTDçDá\cè4íIìxcè)Jì”cèTDÿæÌc`Œ äÀcDaæ4c¤n äÜcä¤n cááÿå÷DáÈcl äDcäl €cááÿåäœcïDí¸cê âpa\æäcˆn äØcd!_ê`l äôcÌk`l $äAòèãAöì c”o ä@ cä”o | cááÿåä˜ cïDá´ cèÐyPìÐ cÿäœBì8!cÀ<äü cæÀ<œBäÿåP!chýåH!c$¿Nâð!c|ä`!cä|œ!cááÿåä¸!cïDáÔ!cè|PöPÏIìt"cho å"cäho <"cÿìäX"cïíðKOì0#c|<ä„"cä|<À"cááÿåäÜ"cïDáø"cè4íIì#cèTDøTDê$cX<ä@#cäX<|#cááÿåä˜#cïDá´#cè„gSêÐ#cøì#cÿäœBê $c$<ä$ctUâÜ$cHm ä0$cäHm l$cááÿåäˆ$cïDá¤$cèÈBìÀ$cÿô|%c¤$äì$cä¤$(%cááÿåäD%cïDá`%cèÈBøà$Kí&cà;äŒ%cäà;È%cááÿåää%cïDýØ&c€$ä&cä€$L&cááÿåäh&cïDá„&cèœBì &cø¼&cèœBÿèô&c`›äè&cdžTæx'cL›ä'cäL›@'cááÿåä\'cïDí ˜ê”'cläˆ'c\ÿOæà'cXýå ¤'cÌkXýá¨äAòläAúèšäð'cäèš,(cÿì쨄Tê`(c”%äX(c(ÂKâ|(c@äp(cÀ0KæT)c äŒ(cä È(cÿìää(cïâ)cèlÍJì)cèôIì8)cè°"JøLbìp)cÜýåd)c€~Væü*cä€)cŒ)cæ âœ)cæâÌ)cÌ~èÌ*cèâpêÌ~äœ)cäì)cãá¼*c˜Räü)cÌ)c˜R8*cÿèät*cäd*cäãœ)cì âœ)c ä *cè*cì âœ)cðd*cêä*cäbäÌ*cæäbÊOìÌ~äô*cœ)câØ,càä +c+cæ â(+cæ âX+cì’è¨,cèâpêì’ä(+cäx+cãáH,c˜Räˆ+cX+c˜RÄ+cÿèå,cäð+cäã(+cì â(+c ä,,cè,cì â(+cðð+cêp,c\ äX,cæ\ èâ˜,cП ä€,câX,cП èâÀ,cІ ä¨,câ€,cІ ðì’äÐ,c(+câð,cHp äè,ch3`â -cÔm å-c€#[æ¬-c0p ä-cä0p X-cááÿåät-cïDá-cèÈBÿèÈ-cp ä¼-clÕZæh.c8=äØ-cä8=.cááÿåä0.cïDáL.cèì¥Kÿè„.c¸m äx.cü§bæ$/c˜›ä”.c䘛Ð.cááÿåäì.cïDá/cèì¥Kø\ÿOìP/c°ä4/c@/cæ âPqOæ`0c˜ä`/c䘜/cááÿåä¸/cïDáÔ/cè|Jìð/cè|Jì 0cè|Jì(0cøD0cÿäØfì|0c¸ýåp0cê˜0cð<äŒ0c„}Oêtm ä¨0cÌktm DåAòåAö„1cÄäô0cäÄ01cÿìäL1cïáh1cèœBøX-ì$2cTn ä”1cäTn Ð1cááÿåäì1cïDá2cè|Pö ãMì¨2cà=ä42cäà=p2cÿìäŒ2cïí¤PJì€3côp ä¸2cäôp ô2cÿìä3cïá,3cèlÍJìH3cèôIìd3cè°"JøLbì 4c¸=ä3cä¸=Ì3cÿìäè3cïá4cèèƒNø ìIì<4c°ä04c\wNæÜ4cÌp äL4cäÌp ˆ4cÿìä¤4cïáÀ4cèȈQø04Kì˜5c¨p äì4cä¨p (5cááÿåäD5cïDá`5cèLBKì|5cèLBKøˆZKì86cn ä¨5cän ä5cÿìå6cïá6cèlÍJøØfì7cPœäH6cäPœ„6cÿìä 6cïá¼6cèlÍJìØ6cèôIìô6cè°"JøLbì 7c”ä à[ø7cþå07cäþál7cÿìäˆ7cïá¤7cèlÍJìÀ7cèôIìÜ7cè°"JøLbì$8c =8c8c`[ê8c`[âü8c°%ä48cä°%p8cááÿåäŒ8cïDá¨8cèœBìÄ8cøà8cÿäœBê9ch ä 9chQbâ@:cH ä$9cäH `9cááÿåä|9cïDá˜9cèì¥Kì´9cè ˜êÐ9cøì9cø:cèîì$:cèîø\ÿOìl:cŒ=äP:c\:cæ âXpNê´›ä|:c<†Qâ$;côœä”:cäôœÐ:cÿìäì:cïá;cèœBøÔDì@;c`&ä4;c<1_æ\;cÔœäP;cœ#Zæ4ä>cä4>@>cááÿåä\>cïDáx>cèì¥Kÿè°>cá'ä¤>cl;_æˆ?c„o äÀ>cä„o ü>cÿìä?cïá4?cèØPìP?cøl?cèLbæî8oèâ`@c0ä˜?cä0Ô?cÿìäð?cïá @cèlÍJì(@cèôIìD@cè°"JøLbì8Ac\o äp@cä\o ¬@cÿìäÈ@cïáä@cèlÍJíAcèôIìAcè°"JøLbìBcüäHAcäü„Acÿìä Acïá¼AcèlÍJìØAcèôIìôAcè°"JøLbìèBcdr ä Bcädr \BcÿìäxBcïá”BcèlÍJì°BcèôIìÌBcè°"JøLbìCcàäøBc4ÀXæ CcÄäCcìXæä¼Jcè¥PæàJc äØJct!_ædäðJcäd,KcááÿåäHKcïDí ˜êä\Mcäì>˜Mcááÿåä´McïDíPÏIìTNc žäàMcä žNcááÿåä8NcïDí\½Mì,OcÔr ädNcäÔr  Ncááÿåä¼NcïDáØNcèì…KìôNcøOcÿä\ÿOì Pctÿåè^cèâpêP>äZcäàZcãá°[c˜RäðZcÀZc˜R,[cÿèäh[cäX[cäãZcì âZc ä”[cè„[cì âZcðX[cêì[cD„ äÀ[cæD„ Ø[cäTâ êä\cdPäü[câÀ[cdPèPâ<\cà ä$\câ ü[cà è~Xä0âd\cá¸äL\câ$\cá¸è,âŒ\ch¶ät\câL\ch¶è(â´\chqäœ\câ t\chq4ìOä$âÜ\c,®äÄ\câ œ\c,®¬Kä â]c¼®äì\câ Ä\c¼®¬Käâ,]c¬V ä]câ ì\c¬V ÜóLäâT]c ùä<]câ]c ùèâ|]clÇäd]câ<]clÇèâ¤]c4ó äŒ]câd]c4ó è âÌ]cHå´]câŒ]cHáœBäâô]c˜“äÜ]câ´]c˜“èâ^c´ä^câÜ]c´ðP>ä,^cZcç‘ äD^cå‘ €^cááÿåäœ^cïDýÔ^cu äÈ^cÌÃRæÈ_cxää^cäx _cÿìä<_cïáX_cè0ãQìt_cø_cø¬_cÿäLbì`cèt äØ_cæèt ´Oâÿå0bc¨ä$`c0`cæâ``cPébcèâpêPä0`cä€`cãáPac˜Rä`c``c˜RÌ`cÿèäacäø`cäã0`cì â0`c ä4acè$acì â0`cðø`cêxac8$ä`acæ8$èâ acÈýåˆacâ`acÈýé âÈacô• ä°acâ ˆacô• |Jäâðac`%äØacâ °ac`%|Jäâbcàsåbcâ Øacàs|JìPä(bc0`câHbcDAä@bcÈnVâdbc\äXbc,'Uæèbc@ ätbcä@ °bcááÿåäÌbcïDí°"JìÀccÔr äøbcäÔr 4ccÿìäPccä4ìOçálccè4ìOìˆccèTDì¤ccÿôìccá äÐccÜccæ âl”^ædcäüccdcæ âD¯aæ4dc€r ä(dcdžTæPdc|)äDdctÀ\æœdc`‘ ä`dcÌk`‘ BòäBúP‘ ä¬dcäP‘ èdcÿìäecïýÜec€u ä0ecä€u lecÿìäˆecïá¤ecèœBìÀecÿô´fcô)äìecäô)(fcÿìäDfcïá`fcèlÍJì|fcèôIì˜fcè°"JøLbìTgcð äÄfcäð ágcÿìägcïá8gcè@™Xø8oìØgc„s ädgcä„s  gcÿìä¼gcïí4mJì”hcds äègcäds $hcÿìä@hcäTDçá\hcèLbìxhcèTDøØfìlicä¤hcäàhcÿìäühcïáicèlÍJì4icèôIìPicè°"JøLbìðicxä|icäx¸icÿìäÔicïí¤âTìjc_æ`tcàäÐscäà tcááÿåä(tcïDáDtcè°"Jÿèxtc0BäptcKøLbìx¶cèäl¶cä5^æ¶c@G䈶c@Ùa┸cáz ä ¶c¬¶cæ â¼¶cæâì¶cTeèd¸cèâpêTeä¼¶cä ·cãáÜ·c˜Rä·cì¶c˜RX·cÿèä”·cä„·cäã¼¶cì â¼¶c äÀ·cè°·cì â¼¶cð„·cê¸c,~äì·cä,~P¡Läâ,¸cè ä¸cì·cè øëWäâT¸cüÒä<¸câ ¸cüÒT[Näâ|¸c´Ðäd¸câ<¸c´ÐðTe䌸c¼¶c∹c¸y 䤸cä¸y à¸cÿìäü¸cäœBçá¹cèÈBì4¹cøP¹cè ˜êl¹cè ˜ÿ褹c¤y 䘹c Uæ¼¹cÀä´¹c˜¸TâÔ¹c<ä̹czLæЖ ä üW„ºcÈ— äô¹cäÈ— 0ºcááÿåäLºcïDáhºcÿäšJì°»cœ/䔺cäœ/кcäÿåäìºcïá»cè|Jê$»cèDûUì@»cø\»cèœBìx»cø”»cèLbÿ舼cPHäÀ»cäPHü»cÿìä¼cïá4¼cèlÍJìP¼cèôIìl¼cè°"JøLbì`½c0¥ä˜¼cä0¥Ô¼cÿìäð¼cïá ½cèlÍJì(½cèôIìD½cè°"JøLbì8¾cœ— äp½c䜗 ¬½cÿìäȽcïáä½cèlÍJí¾cèôIì¾cè°"JøLbì¼¾c¼z äH¾cä¼z „¾cÿìä ¾cïî/Qì¿c|/ä̾cæ|/´Oâÿå ¿côGä¿cèaâ<¿c ä0¿cøä]æÀcÐGäL¿cäÐGˆ¿cááÿå䤿cïDáÀ¿cè¼p-ìÜ¿cøø¿cè¼p-øœBìÁcŒz ä$ÀcäŒz `Àcááÿåä|ÀcïDá˜ÀcèœBì´ÀcèœBêÐÀcøìÀcèLbøœBì$ÁcXz äÁcDµ`æàÁc8z ä4Ácä8z pÁcááÿåäŒÁcïDá¨Ácè¬@MìÄÁcÿôüÁc<— äðÁc cæÔÂcáä ÂcåHÂcááÿåädÂcïDá€ÂcèÌýQìœÂcè ˜ê¸ÂcèäØ_ÿètÃc¥ääÂcä¥ Ãcááÿåä<ÃcïDáXÃcè,Zö,ZêŒÃcü.ä„Ãc0ðTâœÃc„ä éS´Ãc z ä¬Ãc¤/Sæz äÄÃcäz áÄcÿìäÄcò8ÄcèœBøRìÅcp{ ädÄcäp{  Äcäÿåä¼ÄcïáØÄcéBJìôÄcéBJùBJì°Åct˜ ä Åcät˜ \ÅcááÿåäxÅcïDá”ÅcÿäšJìÜÆc$0äÀÅcä$0üÅcäÿåäÆcïá4ÆcèFKìPÆcè|JêlÆcèœBìˆÆcø¤Æcè|JêÀÆcÿäPÏIì@ÈcÌHäìÆcäÌH(ÇcÿìäDÇcïá`Çcè(œJì|Çcø˜Çcè|Pê´ÇcøÐÇcøìÇcèÔ‰JìÈcéBJì$ÈcèŠJøpìPÈcT˜ ä éPðÈcT{ ä`ÈcäT{ œÈcÿìä¸ÈcïáÔÈcèLbøh–TíÉc,˜ ä «JÉc¸HäÉcçOæ ÉcP{ ä,ÉcäP{ hÉcááÿåä„ÉcäœBçDý¸Éclä°Éc\0RâÔÉc\äÈÉc\>`æìÉcXääÉc„câÈËc<äüÉcÊcæ âÊcæâHÊc<%è˜Ëcèâ@ê<%äÊcähÊcãá8Ëc˜RäxÊcHÊc˜R´ÊcÿèäðÊcäàÊcäãÊcì âÊc äËcè Ëcì âÊcðàÊcê`Ëc¨3äHËcæ¨3ŒíLäâˆËc˜ùäpËcâ HËc˜ù|Jââ°ËcT ä˜ËcâpËcT ð<%äÀËcÊcâäËcø— äØËcd¨cæ¼Ìc { äôËcä { 0ÌcááÿåäLÌcïDáhÌcèØ{Mì„Ìcø Ìcÿø$äÌÌcl÷Qâ,Ícd| ääÌcâ Ícd| üÌcçæäÌcäôðè„øüÌcÈèÎc€{ ä<Ícä€{ xÍcÿìä”Ícïá°ÍcèlÍJìÌÍcèôIìèÍcè°"JøLbì¤Îc8| äÎcä8| PÎcÿìälÎcïáˆÎcè¤Oø|JìÄÏcèä´ÎcäèðÎcááÿåä ÏcïDá(Ïcè|PêDÏcè„ëIì`Ïcø|ÏcèœBì˜Ïcÿä´Ïcì âð•[æàÏcIäÔÏc¼jSæHÐcÈäðÏcäÈ,Ðcááÿå÷DádÐcøäXÐcXpNê ¦ätÐcl¹_æ Ñc(™ äÐcä(™ ÌÐcááÿåäèÐcïDáÑcÿäšJìøÑc™ ä0Ñcä™ lÑcÿìäˆÑcïá¤ÑcèlÍJìÀÑcèôIìÜÑcè°"JøLbìÒchIä $BT$Òcô0äÒcœUæ@ÒcÜ0ä4Òc LTæ\Òcà˜ äPÒcT.Ræ(Ôc älÒcxÒcæ â¨ÒcÐïèøÓcèâpêÐïäxÒcäÈÒcãá˜Óc˜RäØÒc¨Òc˜RÓcÿèäPÓcä@ÓcäãxÒcì âxÒc ä|ÓcèlÓcì âxÒcð@ÓcêÀÓc€1 ä¨Ócæ€1 |JäâèÓcdäÐÓcâ ¨ÓcdÐXLäâÔcT›äøÓcâÐÓcT›ðÐïä ÔcxÒcâDÔcHIä8ÔcÔRçÕc äTÔcä Ôcááÿåä¬ÔcïDáÈÔcèì¥KìäÔcè¸3MöÞQð|| äÕcøý]æ ÖcJä,ÕcäJhÕcááÿåä„ÕcïDá Õcè|Jì¼ÕcøØÕcøÖcèôÕcì â°abòTDì<Öc„1ä0Öcx%PæLÖcxä ìÀN$×c} ä\Öcä} ˜Öcÿìä´ÖcïáÐÖcè¸ePììÖcè”}Kì×cè ‚KÿèØcl ä4×cäl p×cÿìäŒ×cïá¨×cèœBìÄ×cøà×cèTDìü×cÿäLbì0Øc°{ ä(ØcLÑSâHØcT1ä@ØcD§^â Ùc¬¦äXØc䬦”Øcááÿåä°ØcïDáÌØcèì¥KìèØcøÙcÿä\ÿOìøÙcì| ä0Ùcäì| lÙcááÿåäˆÙcïDá¤ÙcøÀÙcè ˜êÜÙcè ˜ö ˜îÌIäÚcDÏPæ@Ûcš ä$Úcäš `Úcäÿåä|Úcïá˜Úcè|Jê´ÚcèÀ0KìÐÚcøìÚcè|JìÛcø$ÛcèLbÿèÜc äPÛcä ŒÛcÿìä¨ÛcïáÄÛcèlÍJìàÛcèôIìüÛcè°"JøLbì(Üch§ä ¼eJ âc2ä8ÜcDÜcæ âTÜcæâ „ÜcМácè°ácä @ápâcæÐäTÜcä¤Ücãâ!ÞcôOHÝc´Üc„ÜcôOðÜcÿèäÝcìãTÜcø8Ýcì âTÜcèPÝc„ÜcôOŒÝcÿèä¸ÝcìãTÜcìÔÝcè8ÝcøðÝcê âTÜc ä°Þc˜RäÞc„Üc˜RLÞcÿèäxÞcäðÝcäãTÜcì”Þcè8ÝcøðÝcê`ßc(väÀÞc„Üc(vüÞcâÿèä(ßcìááTÜc êDßcè8Ýcø|JìdàcÐ äpßc„ÜcÐ ¬ßcâÿèäØßcìááTÜcêôßcè8Ýcìàcè|Jì,àcèFKìHàcè|PöØfì„ácÈätàc„ÜcȰàcâÿèäÜàcìááTÜcêøàcè8Ýcìácè|Jì0ácøLácèFKìhácè|PöØfðÐä”ácTÜcæ4”NìÀácTÜcä,ââ„Üc8¨üácÿä,ìâåÀåFlâcŒJä0âcæŒJ´Oâÿå`ãc4| ä|âcä4| ¸âcÿìäÔâcïáðâcè¤_Mì ãcèTì(ãcèTDìDãcÿäLbìäcø{ äpãcäø{ ¬ãcááÿåäÈãcïDáäãcùäcè¼p-ø +\ì8äcü1ä ,äcŒ¿YäTäcØ™ äHäcœ¿Yæpäcàädäc,ï_æ(æcP} ä€äcäP} ¼äcááÿåäØäcïDáôäcè ˜êåcèœBì,åcè ˜ìHåcè ˜ìdåcèœBì€åcèœBìœåcø¸åcøÔåcè°d]ìðåcø æcÿäîìDæcÔ{ ä8æcìèSæÈæcP§äTæcäP§æcÿì䬿cþœBîœ äØæcäœ çcÿìä0çcä ˜öø,Jìhçcxä\çcœBæ\ècø| äxçcäø| ´çcááÿåäÐçcïDáìçcéBJìècéBJì$ècø@ècÿôxècÜ| älècPæ¤èc4¨”ècˆècèPêœècèPâ|éc¤| ä´ècä¤| ðècÿìä écïá(écèlÍJìDécèôIì`écè°"JøLbìTêcHäŒécäHÈécÿìääécïâêcèlÍJìêcèôIì8êcè°"JøLbìHëc3ädêcä3 êcÿìä¼êcïáØêcèøEJìôêcèœBìëcè|Jê,ëcéBJøØfììcðJäXëcäðJ”ëcÿìä°ëcïáÌëcè|øOìèëcÿä\ÿOìPìcÐJäìcæÐJ´OâÿåœìcD~ ä`ìcæD~ ´Oâÿå<ícè2ä¬ìcäè2èìcÿìäícïá ícè úJøTìîct| äLícät| ˆícÿìä¤ícïáÀícèlÍJìÜícèôIìøícè°"JøLbì,îc,ä$îc|ŽVâ„ïc@ ä<îcä@ xîcááÿåä”îcïDáÀîcè°îcì âýaæÜîcøøîcèTDêïcø0ïcøLïcè)JæâhïcèLbèî jRê ïchš ä”ïcØOæ$ðcܧä°ïcäܧìïcááÿåäðcïDí|JîP2ä XtQ ñcÜ3äDðcäÜ3€ðcÿìäœðcïá¸ðcèlÍJìÔðcèôIìððcè°"JøLbì¬ñc”Käñcä”KXñcÿìätñcïáñcè˜ÝKÿèDôcD} ä¼ñcäD} øñcÿìäòcïá0òcè04KìLòcè”}Kì(ôcèhòcì âxòcæâ¨òcØxèøócèâpêØxäxòcäÈòcãá˜óc˜RäØòc¨òc˜RócÿèäPócä@ócäãxòcì âxòc ä|ócèlócì âxòcð@ócêÀócWä¨ócæW‚Käâèóc\y äÐócâ¨óc\y èâôcÀŸäøócâÐócÀŸðØxä ôcxòcþõc\KäTôcä\Kôcÿìä¬ôcïáÈôcèlÍJìäôcèôIíõcè°"JøLbì,öcL› ä,õcäL› hõcááÿåä„õcä„gTåDá õcèœBì¼õcøØõcøôõcøöcèœBö„gTêDöc(› ä<öcDTâ4÷cø äTöc`öcæ âpöcæäŒöcïá¨öcèœBìÄöcè¬bêàöcèèQLêüöcø÷cèØfø jRêP÷càš äD÷c¤Ô\æÔ÷cÄš ä`÷cäÄš œ÷cááÿåä¸÷cä\½MçDý<úcää÷cð÷cæ ãøcæ,â0øcOè úcèâpêOåøcäPøcãá ùc˜Rä`øc0øc˜Rœøcÿè䨸cäÈøcääøcì ãøc äùcèôøcì ãøcðÈøcê\ùclÿä0ùcælÿHùcä(â êä„ùcT älùcâ 0ùcT ä6Mä â¬ùc|2 ä”ùcâlùc|2 èâÔùc<ä¼ùcâ”ùc<èâüùcøVääùcâ ¼ùcøV,ÅJäâ$úc̉ ä úcâ äùc̉ ,ÇJìOä4úcáøcâTúct~ äLúcTNâpúcÜ ädúcÀk`æœúcØä€úcŒúcæ â$u`ê´š ä¬úcT#KæÔúcð¨äÈúc`‹\æhûc„ ääúcä„ ûcÿìä<ûcäÈBçíXûcì â$–\æ´ûcÔ¨äxûcæÔ¨´OâÿåŒücT äÄûcäT áücÿìäücïá8ücèlÍJìTücèôIìpücè°"JøLbìHýc( äœücä( Øücÿìäôücïáýcè04Kì,ýcè”}Kø ‚Kìdýcd4äXýcÐ[æ€ýc¤› ätýct;aæ<þc°¨äýcä°¨ÌýcááÿåäèýcïDáþcø þcè¼p-øˆù^ìTþc„› äLþcx)JâpþcHädþc8/^æÿc< ä€þcä< ¼þcááÿåäØþcïDáôþcè ˜ÿæ,ÿc”¨ä ÿcQæ°ÿc4ä<ÿcä4xÿcááÿåä”ÿcïDíì¥KìÌÿcäÀÿc°V`ê„} ä \(X´d@€ äìÿcä@€ (dÿìäDdïá`dèlÍJì|dèôIì˜dè°"JøLbìTd¬©äÄd䬩ádÿìädïá8dè„aøœBìd©äddä© dÿìä¼dïáØdè ˜ìôdè ˜ø ˜ì\d€ ä dæ€ ´OâÿåldHLä àR(d ä|dä ¸dááÿåäÔdäTDçDáðdè4íIì dèTDøTDêd Lä8dä LtdááÿåädïDá¬dè KìÈdè LTêädùdèœBø KìôdðKä,däðKhdááÿåä„dïDá dèèQLê¼døØdèTDøLbì€dÄäddæ â dæâPd´ŒèPdèâ@ê´Œä däpdãá@d˜Rä€dPd˜R¼dÿèäødäèdäã dì â d ä$dèdì â dðèdêhdT äPdæT ð´Œäxd dâäd¬ädœdæ â¬dæäÈdïáPòXèÙUìLd€4äôdä€40dááÿå÷Dáhd ä\dáWcêtäxdät´dááÿåäÐdïDáìdè|Jêdè|JöäœRì<dp~ ä4dè5ZâLdxªä ¬ÖJ$ dÌ4ä\däÌ4˜dÿìä´dïáÐdèlÍJììdèôIì dè°"JøLbì@ d° ä4 d`„Uæ\ d4ªäP d|JæÄ dMäl däM¨ dááÿå÷DḠdªäÔ däª dááÿåä, dïDáH dèLbìd dè|Jê€ dè|Jêœ dÿô dœ äÈ däœ  dááÿåä dïDá< dè¬@MìX døt dÿä<¼Sì¼ d4~ ä  d¬ dæ âQæØ d| äÌ dDÏPæð d~ äè dˆŒPâ< d€ å dÌk€ øçCò¼çCöÀ dD äL däD ˆ dÿìä¤ dïÿá|€ äÐ dä|€ dÿìä( dåî-çáD dÿä ˜êxdX5äp dx dâ⨠dX5èHdèâpêX5äx däÈ dãá˜d˜RäØ d¨ d˜RdÿèäPdä@däãx dì âx d ä|dèldì âx dð@dêÀd(;ä¨dæ(;¬ZäâèdZäÐdâ¨dZè âdØÀäødâ ÐdØÀ|Jäâ8d¼K ä dâ ød¼K |Jäâ`d(täHdâ d(tðX5äpdx dâ4dh äˆdäh ÄdÿìäàdäTDçáüdèLbìdèTDøø«Sì(d< äDdä< €dÿìäœdïá¸dèøEJìÔdøðdèœBì dè|J÷BJì8d` ä8dä` tdááÿåädäœBåDá¬døÈdøädèTDëdødÿä¤ìYìPdhMäHdܦVâdðœ ä`dldæâœdèìdèâpêäldä¼dãáŒd˜RäÌdœd˜RdÿèäDdä4däãldì âld äpdè`dì âldð4dê´d äœdæ èâÜd ¬ äÄdâœd ¬ èâdÌÇäìdâÄdÌÇðädldâ¼dPMä,däPMhdááÿåä„dïDá dèì¥Kø¸3MêØdH äÌd˜lbæÜdðäèdôdæ âdæâ4d`ï è¬dèâpê`ï ädäTdãá$d˜Rädd4d˜R dÿèäÜdäÌdäãdì âd ädèødì âdðÌdêLdŒ ä4dæŒ èâtd„Ñä\dâ4d„Ñè âœd4¶ä„dâ \d4¶ÈBäâÄdágä¬dâ„dágð$Kì`ï äÔddâød0 äìdPWæd ädÀk`æ,d$5ä$d câèdü~ ä<däü~ xdááÿåä”däœBçDá°dèh¡KìÌdÿä ˜êd¤~ äød ˜êì ädæì èÿåðdŒ ä`däŒ œdÿìä¸dïáÔdèKWø8oì<d$!ådæ$!´OâÿåLd4Nä wX$dü€ ä\däü€ ˜dÿìä´dïáÐdèlÍJììdèôIìdè°"JøLbì°d!ä4d@dæ âPdæâ€doè€dèâpêoäPdä dãápd˜Rä°d€d˜Rìdÿèä(dädäãPdì âPd äTdèDdì âPdðdê˜däbä€dæäbÊOìoä¨dPdâldNäÀdäNüdááÿåädäTDçDá4dèLbìPdèTDÿè˜dèMä|dˆdæ âtÏTæ´dÐMä¨d¨;YæÐdì äÄd8/^æ¨dÔ äàdäÔ dááÿåä8dïDáTdèÈBìpdøŒdÿôHd¸Mä¸dä¸MôdááÿåädïDá,dèT#Kø¸3MêddP äXdPWê” ätdx4Jâd0«äŒdä0«ÈdäÿåäädïâdéBJùBJì d@ž ä,dä@ž hdäÿåä„dïí„ëIì\ dT6ä°däT6ìdÿìä dïá$ dè8ÆKì@ dÿäüÌKì!d € äl dä € ¨ dÿìäÄ dïáà dèøEJìü dèœBøØfìd!dü ä(!dæü ´Oâÿå°!dà ät!dæà ´OâÿåÜ!d$ž Ì!dÀ!dáLOêÔ!dáLOâ˜%dÐ äì!dø!dæ â"dæ8â8"d»èh%dèâpê»ä"däX"dãá(#d˜Räh"d8"d˜R¤"dÿèäà"däÐ"däã"dì â"d ä #dèü"dì â"dðÐ"dêP#dÐQ ä8#dæÐQ è4âx#d´^ä`#dâ8#d´^è0â #dð äˆ#dâ`#dð è,âÈ#d¨• ä°#dâˆ#d¨• è(âð#dá­äØ#dâ°#dá­è$â$d áå$dâØ#d áè â@$d„ä($dã$d„èâh$d¨JäP$dâ($d¨Jèâ$d äx$dâP$d èâ¸$dÄ[ä $dâx$dÄ[èâà$dh™ äÈ$dâ $dh™ è â%d<áäð$dâÈ$d<áèâ0%d0Må%dâð$d0MéâX%dtùä@%dâ%dtùèâ€%dŒPäh%dâ@%dŒPð»ä%d"dâ°%dÄ ä¨%d$¶RâÜ%d,6äÀ%dÌ%dæ â0Xæø%d„€ äì%düïPæ&d¤ ä&d}aæì&d¨Nä$&dä¨N`&dááÿåä|&dïDá˜&dèÈBì´&døÐ&dÿô'dt äü&dÜ‚Zæ 'dD€ ä'd¤Uâ¤'dH ä0'däH l'dááÿåäˆ'dïDí|Jê`(dˆNä´'däˆNð'dááÿåä (dïDá((døD(dÿø€ äp(dÌk€ ÌêCòêCöL)dä¼(däø(dÿìä)dïá0)dè8ÙJø8oìì)dÜž ä\)däÜž ˜)dÿìä´)dïáÐ)dè˜ÝKøBJìÄ*dœOäü)däœO8*dÿìäT*dïáp*dèlÍJìŒ*dèôIì¨*dè°"JøLbìh-dà‚ äÔ*dà*dæ âð*dæ4â +dü“è8-dèâpêü“äð*dä@+d ãá,d˜RäP+d +d˜RŒ+dÿèäÈ+dä¸+däãð*dì âð*d äô+dèä+dì âð*dð¸+dê8,dÀ½ä ,dæÀ½è0â`,dÈcäH,dâ ,dÈcè,âˆ,d ;äp,dâH,d ;è(â°,dø÷å˜,dâp,dø÷á0 Kä âØ,dl¼äÀ,dâ ˜,dl¼ä6Mäã-dH äè,dâÀ,dH èâ(-dH?å-dâè,dH?á´OäâP-dìâä8-dâ-dìâðü“ä`-dð*dâì-dxOäx-däxO´-dÿìäÐ-dïí|øOìü-dd«ä œ,Qœ.d¸‚ ä .d丂 H.dÿìäd.däœBçá€.dè\RøœBìX/dp‚ ä¬.däp‚ è.dÿìä/dïá /dè|Jìd„ ä¸=dä„ ô=dááÿåä>dïDá,>dèTDìH>dèTDìd>dø€>dèœBøœBì¸>dPä¬>ddÙQæÔ>dl¬äÈ>dTRaæ¬?døOää>däøO ?dááÿåäärdä¸>@rdááÿåä\rdïDáxrdø”rdø°rdøÌrdè ˜ìèrdøsdèœBì sdè\¥MøLbìtdܲäLsdäܲˆsdááÿåä¤sdïDáÀsdøÜsdèhSLìøsdèTDÿè´td´²ä$tdä´²`tdááÿåä|tdïDá˜tdè LTÿæÐtdäÄtdl¶Sævd‹ äàtdä‹ udááÿåä8udïDáTudèßPìpudøŒudè|Jì¨udèLbìÄudèLbìàudèLbìüudèTDøLbì¸vdìŠ ä(vdäìŠ dvdááÿåä€vdïDáœvdèßPø|JêÔvd´Š äÈvd8vRæðvd”Š äävd(Æ`æ8xdhUåwdähUäHxdäT>„xdááÿåä xdä ˜çDá¼xdè ˜ìØxdè ˜ÿêÐ(äydäÐ(@ydááÿåä\ydïDáxydèœBøîì4zd¸)ä¤ydä¸)àydááÿåäüydïDázdÿäü£Jì {dЈ äDzdäЈ €zdÿìäœzdïá¸zdèlÍJìÔzdèôIìðzdè°"JøLbì({dÌUä{dx°TæD{d )ä8{dø1Xç|d\³äT{dä\³{dááÿåä¬{däTDçDáÈ{dè4íIìä{dè)JÿèÔ|d(?ä|d|dæ â,|dæäH|dïád|dè¼/dì€|dè$?aìœ|dè8›\ì¸|dÿäœBìð|d³ää|d|6_æ }dø>å}d@§]æÈ}d”¥ ä}d䔥 X}dááÿåät}dïDá}dø¬}dÿä ˜êH~d4‹ äØ}dä}dæ âô}dæä~dïá,~dèœBÿèÌ~dH)äX~däH)”~dááÿåä°~dïDí ˜î ‹ äÜ~dTDæÀd *äø~dä *4dÿìäPdïáldèlÍJìˆdèôIì¤dè°"JøLbìØd VäÐd¬Sâôd ?äèd@@Jæ€d *ä€dê\€dVä €dæV´Oâÿål€dX‰ ä |!M|€dü)ä /'Òƒoáøzw‚ã´¯d´¬dâè¯d(¸دd̯dHRQêà¯dHRQâ°dPCäø¯d ˜TæL±d°ä°dä°P°dááÿåäl°dïDሰdèèQ줰dèTDìÀ°døܰdøø°dè)Jæâ±dèLbèâ0±dèTDøLbìx±d¨-ä\±dh±dæ âüWæl²däŽ äˆ±dääŽ Ä±dááÿåäà±dïDáü±dè¼p-ì²dè¼p-ì4²døP²dèœBøœBìD³dèYä|²däèY¸²dááÿåäÔ²dïDáð²dèì¥Kì ³dø(³dÿäîìT´d<« äT³dä<« ³dááÿå䬳dïDáȳdèœBìä³dù´dø´dèLbì8´dèLbøØfðP äd´däP  ´dÿìä¼´dä|Jçí|Jìè´d|Zä lm[4µd4/äø´dæ4/œBäÿ倵d/äDµdæ/œBäÿåܸdˆ« äµdœµdæHâ̵d80 謸dèâpê80 䜵däìµdãá¼¶d˜Räüµd̵d˜R8¶dÿèät¶däd¶dä㜵dì ✵d ä ¶dè¶dì ✵dðd¶dêä¶d4® ä̶dæ4® èDâ ·d\*äô¶dâ ̶d\*„ëIä@â4·dXÛä·dâ ô¶dXÛ´Oä0â\·dh äD·dâ ·dh ¨â_ä$â„·d\Väl·dâD·d\Vè ⬷dáeä”·dâl·dáeèâÔ·d”íä¼·dâ”·d”íèâü·d”½ää·dâ¼·d”½èâ$¸dX5ä ¸dâ ä·dX5|JäâL¸d$ ä4¸dâ ¸d$ è ât¸d üä\¸dâ4¸d üè✸dTÜ儸dâ\¸dTÜá|Jäâĸdìâ䬸dℸdìâð80 äÔ¸dœµd☹d$äì¸dä$(¹dÿìäD¹dïá`¹d蔀Mì|¹dÿôŒºd,Ž ä¨¹dä,Ž ä¹dÿìåºdïáºdèLBKì8ºdèFKìTºdèLBKìpºdè|PöØf줺d 䜺dÀwNâÀºdì.ä´ºdš\戼dáDäкdغdâ â»dáDèX¼dèâpëDäغdä(»dãáø»d˜Rä8»d»d˜Rt»dÿèä°»dä »däãغdì âغd äÜ»dèÌ»dì âغdð »dê ¼d#ä¼dæ#ØÊ_äâH¼d|ä0¼dâ¼d|èâp¼dìâäX¼dâ0¼dìâñD䀼dغdâ ¼däC䘼düïPâ¼¼dÜä°¼dôŽRæؼdÌCä̼d gO攽dl« äè¼däl« $½dááÿåä@½dïDá\½døx½dÿä|Jê¾dŒ¸ä¤½d䌸à½dááÿåäü½dïDíì¥K윾d„.ä(¾dä„.d¾dááÿå䀾däT#KçDí¸3M긾dT.䬾d }Næ<¿d.äȾdä.¿dááÿåä ¿dïDí|JêÀ¿dŽ äL¿däŽ ˆ¿dááÿå䤿däœBçDíœBêÜ¿d8Zäпdî äì¿dä (Àdÿìì”2SêÁdÈ äTÀdäÈ Àdÿìä¬ÀdïáÈÀdèÈBìäÀdùÁdè ˜ö ˜ê¼ÁdøŽ ä,ÁdäøŽ hÁdááÿåä„ÁdïDá Ádÿäü£Jì°Âd¬Ž äÌÁd䬎 Âdÿìä$Âdïá@ÂdèPLì\ÂdøxÂdø”Âdÿä|JêˆÃd,¬ äÀÂdä,¬ üÂdÿìäÃdïá4ÃdèlÍJìPÃdèôIìlÃdè°"JøLbì Ãd¬ ä˜Ãdh_Zâ¤Ädà« ä°Ãdäà« ìÃdááÿåäÄdïDá$Ädè|Jê@ÄdølÄdè\Ädì âÐzaæˆÄdÿôÀÄd„/ä´Ädà†`êü¸äÐÄdêøÄdp äìÄdê˜Åd˜äÅdä˜DÅdäÿåä`Ådïá|Ådè ¤Jø ¤JìäÅdá\ä¨Ådç\œBäÿå0ÆdÐ[äôÅdæÐ[œBäÿåÇd@ ä@Ædä@ |Ædÿìä˜Ædïá´ÆdèlÍJìÐÆdèôIììÆdè°"JøLbìTÇd80äÇdæ80´OâÿåÈdàDädÇdäàD Çdááÿåä¼ÇdïDáØÇdøôÇdèTDÿæ°Èd˜¹ä Èd䘹\ÈdÿìäxÈdïá”Èdè°"Jø¼lMì4Éd”[äÀÈdä”[üÈdááÿåäÉdïDí¸3MêPÉdx[äDÉdT~_æ Êd€ä`Éd䀜Édááÿåä¸ÉdäXÿQçDáÔÉdèÌýQìðÉdè ˜ö ˜î[äÊd°˜PâÄÊdÀ\ä4ÊdäÀ\pÊdÿìäŒÊdïá¨ÊdèxCRø8oìdËdH‘ äÔÊdäH‘ Ëdÿìä,ËdïáHËdèLbøø«Sì€ËdŒ ätËdx~MæXÌdh äËdäh ÌËdÿìäèËdïáÌdèlÍJì ÌdèôIì<Ìdè°"JøLbìÜÌdô0ähÌdäô0¤ÌdááÿåäÀÌdäœBçDýøÌdô¬ äìÌdˆ Jæ|Íd´¬ äÍdä´¬ DÍdááÿåä`ÍdïDíœBìÄÎdô äŒÍdäô ÈÍdááÿåääÍdïDâÎdèßPìÎdø8Îdè ˜ìTÎdèLbìpÎdèLbìŒÎdèLbì¨ÎdèTDøLbìdÏdØ äÔÎdäØ Ïdááÿåä,ÏdïDáHÏdèßPø ˜ê¬Ðd0\ätÏdä0\°ÏdááÿåäÌÏdäœBçDáèÏdè|JêÐdø Ðdø<ÐdøXÐdøtÐdøÐdÿäh¡KìhÑd_âÔ"eÐKäD"eäÐK€"eÿìäœ"eä,|\çá¸"eèÔJöTDêì"eh— ää"eXædâ#eä7äü"eÄ#]æÄ#eP– ä#eäP– T#eááÿåäp#eïDáŒ#eèÈBì¨#eÿøX— äÔ#eê€$eÈLäð#eäÈL,$eááÿåäH$eïDád$eÿäÔDì<%eP— ä$eäP— Ì$eÿìäè$eïá%eèüÝJì %eè|JøBJì&eè äL%eäè ˆ%eÿìä¤%eïáÀ%eèlÍJìÜ%eèôIìø%eè°"JøLbì,&e8— ä$&e¤cJâx&ex8ä<&eæx8´Oâÿå”&eHcäˆ&eè‹Kæ4'eÀä¤&eäÀà&eÿìäü&eïá'eèLBKøLBKìD(eø¿äD'eäø¿€'eäÿåäœ'eïá¸'eøÔ'eèTDêð'eèPÏIê (eø((eè ˜øLbì`(e(cäT(eLªJç)e¬² äp(e䬲 ¬(eááÿåäÈ(eïDáä(eè°"JøœBìØ)e— ä)eä— L)eááÿåäh)eïDá„)eø )eè Kì¼)eè|JÿèÌ*e¬Läè)eä¬L$*eááÿåä@*eïDá\*eèœBìx*eø”*eø°*eèœBøLbìè*e<8äÜ*eCTæ,e¸¿äø*e丿4+eááÿåäP+eïDál+eøˆ+eèTDì¤+eè\¯PìÀ+eøÜ+eèTDìø+eÿäTDì@,eø– ä$,e0,eæ â„KøLBKìÀ0eh9ä´0e$ÓIæ˜1e,˜ äÐ0eä,˜ 1eÿìä(1eïáD1eèLBKì`1eèLBKì|1eÿäˆZKì`3e¸Àä¨1e´1eæ âÄ1eæ âô1eì™ è03eèâpêì™ äÄ1eä2eãáä2e˜Rä$2eô1e˜R`2eÿèäœ2eäŒ2eäãÄ1eì âÄ1e äÈ2eè¸2eì âÄ1eðŒ2eê 3eð¼åô2eæð¼á 3eäâ â¸N[ääH3e ×ä03eâô2e ×ðì™ äX3eÄ1eâ|3eTMäp3eøÃ\æ˜3e³ äŒ3eä#Yæ84e„Àä¨3eä„Àä3eááÿåå4eïDá4eè 9^ÿèô4e9äH4eä9„4eÿìä 4eïá¼4eèÜóLìØ4eÿäHædì5e°— ä5e$—bê4Mä 5eä4M\5eááÿåäx5eïDá”5eèÈBøtÖ_ìÈ5e$NäÀ5e NPâh6eøMäØ5eäøM6eÿìä06eïáL6eè8ÆKø8oì$7e4:äx6eä4:´6eÿìäÐ6eäTDçáì6eèLbì7eèTDøh–TìÄ7e¸Mä47eä¸Mp7eÿìäŒ7eïá¨7eèd_ø LNìð7e MäÔ7eà7eæ â¸N[ç8eH™ ä \¬J8e,™ ä ¬nPÌ8e$"ä 8eä$"\8eááÿåäx8eïDá”8eè4íIì°8eèTDøTDêˆ9e„MäÜ8eä„M9eááÿåä49eïDáP9eèÈBìl9eè¸3Mÿæ¤9e$dä˜9e@Zêx³ ä´9e(^-æÐ:eÁäÐ9eäÁ :eÿìä(:eïáD:e踎Sì`:eèLBKì|:eèFKì˜:eèPLì´:eè|PöØfìì:e¨™ äà:eê;e@;äü:e‚Kæ;e;äÄAT(;eá;ä ÈTD;e´dä8;epøSæ\;eè:äT;el¯Pâe¸³ äœ=e丳 Ø=eááÿåäô=eïDÿá°:ä >eTDæè>eeäeÿìä”>eïá°>eè|JìÌ>eÿä¼p-ìø?eeäø>eäe4?eäÿåäP?eïál?eèFKìˆ?eø¤?eèPLìÀ?eèè‹KìÜ?eèÐ_ÿèÐ@eÀ;ä@eäÀ;D@eÿìä`@eïá|@eèlÍJì˜@eèôIì´@eè°"JøLbìTAeÜNäà@eäÜNAeááÿåä8AeïDí,ZìpAe¤;ädAe ˜TæˆAeì™ ä€AeÄ1eâ¤Ae Nä˜Aex°Zæ(Be4š ä´Aeä4š ðAeááÿåä Beä|JåDí|Jê8Ceðdä8BeäðdtBeááÿåäBeïDá¬BeèÌýQìÈBeøäBeè ˜ëCeøCeèbæþTCep;äHCe(õZæ,De(´ ädCeä(´  Ceááÿåä¼CeïDáØCeèÈBìôCeøDeè Í^ÿæèDe|NääLieZcâpieÈ ädie|£KæŒieж ä€ie¤ÚUæje° äœieä° ØieááÿåäôieïDíœBð`Ää jeä`Ä\jeÿìäxjeä ˜çá”jeø°jeÿä ˜ìèje¤RäÜjeðÕTæ4keÜž äøjeæÜž ´OâÿåDkeÐ?ä ìIOleäàre”¥aêÀ&äüreêàse„@äseä„@TseÿìäpseïáŒseèlÍJì¨seèôIìÄseè°"JøLbì¸teÀ'äðseäÀ',teÿìäHteïádteèlÍJì€teèôIìœteè°"JøLbìueÜRäÈteäÜRueÿìä ueïáT4veL¸ ä R weÈiäDveäÈi€veÿìäœveïá¸veèlÍJìÔveèôIìðveè°"JøLbì$we`Åäwe°ïbâPxeÄRä4weäÄRpweÿìäŒweïá¨weøÄweèœBìàweøüweøxeè¨sMì4xe踬Pÿèhxeøž ä`xe|6_â€xeˆiäxxeÀZâœxe ¸ äxedjaæKì|eèŸ ät|e€|eæ â„3]æ¬|e,kä |edYYæh}eÀAä¼|eäÀAø|eááÿåä}eïDá0}eè4íIìL}eèTDøTDê@~eô¹ äx}eäô¹ ´}eááÿåäÐ}eïDáì}eèœBì~eèèQLê$~eÿä jRêe°AäP~eä°AŒ~eÿìä¨~eïáÄ~eøà~eè ˜ìü~eÿôœeع ä(eäع deÿìä€eïý¸e@Sä¬e°ìZêT(ä $Ð^äe¡ äØeP¼Qæh€eXÇäôeäXÇ0€eÿìäL€eïíD bìeŸ äx€eäŸ ´€eááÿåäЀeïDáì€eèšJø¼p-ì¨e€Bäeä€BTeááÿåäpeïDáŒeÿäü£J윂e\Bä¸eä\Bôeÿìä‚eïá,‚eè¤PJìH‚eød‚eè8o쀂eÿäpìXƒe0B䬂eä0Bè‚eÿìäƒeïá ƒeèp'Nì<ƒeÿô„„e)ähƒeä)¤ƒeÿìäÀƒeïá܃eè|Jìøƒeè|Jì„eø0„eèTDìL„eøh„eèLbøLbì\…e˜k䔄eä˜kЄeááÿåäì„eïDá…eèœBì$…eèÄRì@…eèT±PøTDìx…eè(äl…eHî]æ†eˆS䈅eäˆSÄ…eááÿåäà…eä,„KçDáü…eè,„Kø ˜ê€†eøAä(†eäøAd†eááÿå÷Dá ‡eÀ  ä†eäÀ  ̆eááÿåäè†eïDá‡eè ˜ÿè<‡e¨  ä0‡eœBæX‡e„  äL‡eô2Tæh‡e¤Æä¼ÐLäXSäx‡eäXS´‡eÿìäЇeïáì‡eÿô ˆeÈŸ äˆeL1_âøˆeÀº ä0ˆeäÀº lˆeÿì䈈eïᤈe蔀MìÀˆeø܈eè|P÷BJ옉elä‰eälD‰eÿìä`‰eïá|‰eèFKødaKìä‰eäB䨉eæäBœBäÿåü‰e¸¡ äô‰e`ì]â ‹e ¡ ä Šeä ¡ HŠeäÿåädŠeïညeøœŠeè ˜ê¸ŠeøÔŠeøðŠeèLbøLbì(‹e„¡ ä‹eÀÆRæ@‹e”º ä8‹e`¡L⤋exŸ äP‹e\‹eæ âl‹eæäˆ‹eïýxŒe0Tä´‹eÀ‹eæ âЋeæäì‹eïáŒeø$Œeè|Jì@Œeè|Jì\Œeÿô¤eT䈌eäTÄŒeááÿåäàŒeäÜ9NçDáüŒeèÌýQìeø4eøPeøleøˆeèœBöœBê|Žeükä´eäükðeááÿåä ŽeäœBçDá(ŽeèœBìDŽeø`ŽeÿøØk䌎eä*SâüŽe4È䤎eä4ÈàŽeááÿå÷DáÔe°)ä eä°)Heÿìädeïá€eèlÍJìœeèôIì¸eè°"JøLbìäe¸» ä ,¬Jôe˜» ä R”e˜Cäeä˜C@eááÿåä\eïDáxeè4íIøTDê‘e\» ä¤eä\» àeÿìäüeïý4‘eÈä(‘eêð‘e€)äD‘eä€)€‘eÿì䜑eïḑeè ˜ìÔ‘eèÈjdÿ褓eøTå’e ’eæ â’eæâL’epèt“eèâpêpä’eäl’eãá<“e˜Rä|’eL’e˜R¸’eÿèäô’eää’eäã’eì â’e ä “eè“eì â’eðä’eêd“eäL“eæè⌓eØÄåt“eâL“eØÄáœBìp䜓e’eâ(”e» ä´“eä» ð“eááÿåä ”eïDýD”eÌTä8”eÜÈZæT”eTäˆ(SäàÇäd”eœB戔e@É䀔e|;_â(•eDD䘔eäDDÔ”eááÿåäð”eïDá •eÿäü£JìT•e*ä8•eD•eæ âôeæp•e”¢ äd•e, Mæ–eÉ䀕eäɼ•eÿì䨕eïáô•eè Nÿè<–eÜ  ä –e,–eæ âÜÄUæT–eäläL–eÌSTâ—ep¢ äd–eäp¢  –eááÿåä¼–eïDáØ–eè4íIìô–eèTDøTDêؘeÀUä —e(—eâ âX—eÀU記eèâpêÀUä(—eäx—eãáH˜e˜R䈗eX—e˜RÄ—eÿèå˜eäð—eäã(—eì â(—e ä,˜eè˜eì â(—eðð—eêp˜e`B äX˜eæ`B è☘e,g 䀘eâ X˜e,g ›äâÀ˜e È䨘eâ €˜e È ˜ìÀUäИe(—eâô˜eôCäè˜e [æ™eàCä™e„K]êè» ä ™e¤tVâ8še(Êä8™eä(Êt™eÿìä™eïᬙe踎SìÈ™eèLBKìä™eèFKíšeèPLìšeè|PöØfìØšeм äHšeäм „šeÿìä šeïἚeè(!Lø|Jì°›e¨¼ äèše䨼 $›eÿìä@›eïá\›eèlÍJìx›eèôIì”›eè°"JøLbìPœeÜÉäÀ›eäÜÉü›eááÿåäœeäŒýIçDá4œeèœBÿèðœeðUä`œeäðUœœeááÿå东eïDáÔœeèœBøØfìexÉåe eæ âTÿRæ8eT*ä,e€o_æØe€DäHeä€D„eááÿåä eïDá¼eè8)MÿìH¼ äèeäH¼ $žeááÿåä@žeïDíì¥KìŸe€Êälžeä€Ê¨žeááÿåäÄžeïDáàžeè|Pêüžeÿä8oì(Ÿe<½ äìûUá e8nä8Ÿeä8ntŸeÿìäŸeïᬟeè˜ÝKìÈŸeè|JìäŸeè|JøÄLì,¡e nä eä nL eäÿåäh eïá„ eø  eè#Tê¼ eèTDêØ eøô eè#Tì¡eèTDøLbìH¡e£ ä<¡e¼WæÌ¡e”¡ äX¡e䔡 ”¡eááÿåä°¡eïDýè¡eÜmäÜ¡e4Ó\ê´Däø¡eŒ‘Zâ ¢eÈ¢ ä¢eäÈ¢ L¢eááÿåäh¢eïDá„¢eè ¤JøšJì@£e¤Eä°¢eä¤Eì¢eááÿåä£eïDá$£eÿäü£Jì¤eÄnäP£eäÄnŒ£eÿì䨣eïáÄ£eèlÍJìà£eèôIìü£eè°"JøLbìð¤eø½ ä(¤eäø½ d¤eááÿå䀤eïDᜤeè|J긤eè,ZêÔ¤eè,Zö,Zê¥e¬nå¥eä¬n<¥eÿìäX¥eïát¥eèœBø ‹Uìh¦ehEä ¥eähEÜ¥eááÿåäø¥eïDá¦eèlÍJì0¦eèôIìL¦eè4íIøTDꀦe|¢ äx¦eTödâ¼§e8Eä¦eä8E̦eááÿåäè¦eïDí§eì â§eæä0§eïáL§eèPÏIìh§eèðOì„§eèPÏIì §eèTDøØfì\¨e ½ ä̧eä ½ ¨eááÿåä$¨eïDá@¨eèœBø@;UêĨex£ äl¨eäx£ ¨¨eááÿå÷Dáà¨eEäÔ¨eÌù]朩e`£ äð¨eä`£ ,©eááÿåäH©eïDád©eèÈB쀩eÿô<ªeô¡ 䬩eäô¡ è©eááÿåäªeäLbçDá ªeèœBÿèøªe|½ äLªeä|½ ˆªeááÿå䤪eïDáÀªeèœBìܪeÿø´Êä«eä´ÊD«eááÿåä`«eïDíX-쌬e@¤ 䌫eä@¤ È«eÿìää«eïâ¬eè4mJì¬eø8¬eè8oìT¬eè8oìp¬eèLbø8oìd­eHW䜬eäHWجeÿìäô¬eïá­eèlÍJì,­eèôIìH­eè°"JøLbì<®eᤠät­eå¤ °­eÿìäÌ­eïáè­eèlÍJì®eèôIì ®eè°"JøLbìX®e0WäL®e„Næh¯eLËäh®eäLˤ®eäÿåäÀ®eïáÜ®eøø®eèTDê¯eèPÏIê0¯eøL¯eè|JøLbì@°e࣠äx¯eä࣠´¯eááÿåäЯeïDáì¯eø°eè Kì$°eè ˜ÿèX°e`¾ äP°eè¿Qℱe,Ëäh°eä,ˤ°eááÿåäÀ°eïDáܰeøø°eè¼p-ì±eè\¯Pì0±eøL±eè¼p-ìh±eÿä¼p-ì ±e oä”±e¼{^æ@²e£ ä°±eä£ ì±eááÿåä²eïDá$²eèÈBÿèà²eWäP²eäWŒ²eááÿå䨲eïDáIJeèÈBø¸3Mêd³eËäð²eäË,³eááÿåäH³eïDíÈB쀳eÌ£ ät³e0U昳eü¢ ä³eèOæøn䨳eÐT_æгe€+äije|;_æà´e„Ëäà³eä„Ë´eÿìä8´eïáT´eè ’bìp´eøŒ´eèœB쨴eèLbìÄ´eèLbøLb층eH¥ äð´eäH¥ ,µeÿìäHµeïádµeèlÍJ쀵eèôI융eè°"JøLbì<¶e´¾ äȵeä´¾ ¶eÿìä ¶eïíèƒNìضe oäL¶eX¶eæ âh¶eæä„¶eïá ¶eè|Pê¼¶eè|PöØfìô¶eÜWäè¶eèMUæ ·eL+ä·e„i_â`ºe0+ä·e(·eæ â8·eæâh·e(L è0ºeèâpê(L ä8·e䈷eãáX¸e˜R䘷eh·e˜RÔ·eÿèä¸eå¸eäã8·eì â8·e ä<¸eè,¸eì â8·eñ¸eêºex.åh¸eæx.းeäââ°¸eÀ“èعeèpæh·eÀ“䀸eäиeãá ¹e˜Räà¸e°¸e˜R¹eÿèäX¹eäH¹eä〸eì ‸e 䄹eèt¹eì ‸eðH¹eêȹe°þå°¹eæ°þá|Jèð¹eäعeâ°¹eðÀ“åºe€¸eâ ºeÀ“äºe€¸eâHºeàÉä0ºeâh¸eàÉð(L äXºe8·eâäºeœ¾ äpºe䜾 ¬ºeááÿåäȺeïDíèqYì¼»e¸¤ äôºe两 0»eááÿåäL»eïDáh»eè”{Nì„»eø »eÿô\¼e¬£ äÌ»e䬣 ¼eÿìä$¼eïá@¼eè|Jö0ªcìx¼eœ¤ äl¼e<¼S攼ehË䈼et!_æP½eˆ¤ 䤼e䈤 à¼eááÿåäü¼eïDá½eèPUì4½eÿäØfðh£ ä`½eÌkh£ ðóDò´óDöt¾e Ì䬽eä Ìè½eÿìä¾eïá ¾eèlÍJì<¾eèôIìX¾eè°"JøLb쌾eÌ䄾e \Jâd¿elX䜾eälXؾeÿìäô¾eïá¿eèlÍJì,¿eèôIìH¿eè°"JøLbì Àe8,ät¿eä8,°¿eÿìäÌ¿eäTDçáè¿eèLbìÀeèTDøhòcìøÀe,ä0Àeä,lÀeÿìäˆÀeïá¤Àeè˜XQìÀÀeèdKìÜÀeÿô$Áe¤¥ äÁeÁeæ â°ÃVæ@Áeð£ ä4Áe 8Yæ\Áe„FäPÁeôŽRælÂeÈËälÁeäÈ˨ÁeááÿåäÄÁeïDáàÁeøüÁeøÂeè ˜ê4ÂeøPÂeè ˜ÿæ(Ãeìoä|Âeäìo¸ÂeááÿåäÔÂeïDáðÂeø ÃeÿäTáPì@Ãe°Ëä8ÃetÙQâ\Ãe¸+äPÃeÄ'_ê˜+älÃe˜\â0Äeppä„ÃeäppÀÃeááÿåäÜÃeäÐyPçDáøÃeèÐyPìÄeè ˜ÿæÅe`Gä@Äeä`G|Äeÿìä˜Äeïá´ÄeèlÍJìÐÄeèôIììÄeè°"JøLbì¨Åe,päÅeä,pTÅeÿìäpÅeïáŒÅeè|øOø‡Oì,Æe˜¤ ä¸Åe䘤 ôÅeÿìäÆeïí]ìHÆex¤ ä<Æe„\æèÆeøFäXÆeäøF”Æeááÿåä°ÆeïDáÌÆeè”{NÿéÇe˜¦ äøÆeèVRâ„Çe\¦ äÇeä\¦ LÇeááÿåähÇeïDíœBì$Èe4¤ ä”Çeä4¤ ÐÇeááÿåäìÇeïDáÈeèÜ9Nø¸_ìÈÉe(¿ ä4Èe@ÈeæâpÈeÜ]è˜ÉeèâpêÜ]ä@ÈeäÈeãá`Ée˜Rä ÈepÈe˜RÜÈeÿèäÉeäÉeäã@Èeì â@Èe äDÉeè4Éeì â@ÈeðÉeêˆÉe¸UäpÉeæ¸U0 Käâ°Éẻ ä˜Éeâ pÉẻ ,ÇJìÜ]äÀÉe@ÈeâàÉe,¦ äØÉed#Kæì¥ äðÉe¼p-æÊep§ ä Êeê¸Ðe”qä(Êeä”qdÊeÿìä€Êeïá€ÐeèœÊeì â¬Êeæâ ÜÊe¼åüÏeèÐeä @áppÐeæ¼åä¬ÊeäüÊeãá"XÌeôO Ëe ËeÜÊeôOHËeÿèätËeìã¬ÊeøËeì â¬Êeè¨ËeÜÊeôOäËeÿèäÌeìã¬Êeì,ÌeèËeøHÌeê â¬Êe äÍe˜RähÌeÜÊe˜R¤ÌeÿèäÐÌeäHÌeäã¬ÊeììÌeèËeøHÌeêœÍetÏäÍeÜÊetÏTÍeâÿèä€Íeìáá¬ÊeöËeìhÎe4$ä¬ÍeÜÊe4$èÍeâÿèäÎeìáá¬Êeê0ÎeèËeìLÎeèÿè4Ïe`päxÎeÜÊe`p´ÎeâÿèäàÎeìáá¬ÊeêüÎeèËeìÏeèøLbìäÏeDIäDÏeÜÊeDI€Ïeâÿèä¬Ïeìáá¬Êe êÈÏeèËeÿì¼åäôÏe¬Êeæˆbì Ðe¬Êeä$ââÜÊe¼l\Ðeÿä$ìâÏ:/Û†/ÑŽÀO¹˜šœÐeèøLbìtÑedqäÈÐeädqÑeÿìä Ñeïá<ÑeèôIìXÑeè„øIøLbìˆÓe(-ä„ÑeÑeæ â ÑeæâÐÑe¼´ èpÓeèâpê¼´ ä ÑeäðÑeãáÀÒe˜RåÒeÐÑe˜R<ÒeÿèäxÒeähÒeäã Ñeì â Ñe ä¤Òeè”Òeì â ÑeðhÒeêèÒeT&äÐÒeæT&èâÓe%äøÒeâÐÒe%èâ8Óeá%ä ÓeâøÒeá%èâ`Óeè_ äHÓeâ Óeè_ èæ\ äpÓeâHÓe\ ì¤ÓeÔGä˜Óe ùZæÐÓe¸Gä´ÓeÀÓeæ âà7`æ¨ÔeÄpäàÓeäÄpÔeááÿåä8ÔeïDáTÔeè|JêpÔeèÛIìŒÔeèÛIøÛIì,Õe¿ ä¸Ôeä¿ ôÔeááÿåäÕeïDýDÕe˜pä<ÕeDtbâ`Õe¨,ä TÕe ˜äpÕex¿ äðää¦ ä€Õeæä¦ ¼Õeäÿå áêã¨Öe´-äàÕeä´-Öeÿìä8ÖeïáTÖeèlÍJìpÖeèôIìŒÖeè°"JøLbìÀÖe¨ ä¸Öe´õRâ˜×eHÍäÐÖeäHÍ ×eááÿåä(×eïDáD×eèœBì`×eè ˜ì|×eèœBø ëPì´×e0Íä¨×e(&Jæà×eräÄ×eÐ×eæ â˜á[æø×ex-äð×eo_âØeì§ äØeXaæ´Øe`-ä$Øeä`-`Øeááÿåä|Øeäì¥KçDá˜ØeèÈBødDcìœÙe\HäÄØeä\HáÙeááÿåäÙeä,„KçDá8ÙeøTÙeèTDêpÙeèì¥KøŒÙeê â¬ß^æ Úe8Hä¬Ùeä8HèÙeááÿåäÚeïDíœBì´Úe0¥ ä0Úeä0¥ lÚeááÿåäˆÚeïDí¤Úeì â("NêHä ß_(Üe„.äÔÚeä„.Ûeÿìä,ÛeïáHÛeèœBìdÛeèTDì€ÛeøœÛeèTDì¸ÛeøÔÛeèTDìðÛeø ÜeèTDÿèpÝeÈÍä8ÜeäÈÍtÜeááÿåäÜeïDá¬ÜeèœBìÈÜeøäÜeè¤cJíÝeøÝeø8Ýeè¼p-ìTÝeè ü_ùBJìHÞeT.ä€ÝeäT.¼ÝeÿìäØÝeïáôÝeèlÍJìÞeèôIì,Þeè°"JøLbìße˜À äXÞeä˜À ”Þeÿìä°ÞeïáÌÞeè4mJìèÞeÿä”PJìÜßeÄIäßeäÄIPßeÿìälßeïáˆßeè|øOì¤ßeè04KìÀßeÿôpàe¦ `àeìßeøßeæä(àe¦ øì¦ äøßeäHàeãå¦ äXàeøßeæhàeøßeâŒàe˜Iä€àeœ)cætáexÀ äœàeäxÀ ØàeááÿåäôàeïDááeèœBì,áeè ˜ìHáeèØfødáeì â ëPæáe0.ä„áe˜'Qæ„âe0¨ ä áeä0¨ ÜáeááÿåäøáeïDáâeèœBì0âeèœBìLâeøhâeèLbøœBì”ãeᦠä”âeå¦ ÐâeááÿåäìâeïDáãeø$ãeø@ãeèø…Qê\ãeè ˜êxãeè ˜ÿèPäe(À ä¤ãeä(À àãeááÿåäüãeïDáäeèì¥Kì4äeèà$Kÿæ(åeè¥ ä`äeäè¥ œäeááÿåä¸äeïDáÔäeèì¥Kìðäeø åeèä}dÿèDåeÔrä8åe”ÚUæäåe À äTåeä À åeááÿåä¬åeïDáÈåeÿäØfìôåe¤rä TÐ^ æe€räæe ×Râæeä-ä8OäÔHä,æeäÔHhæeÿì䄿eïá æeè ˜ö ˜ê”çe(Á äÌæeä(Á çeÿìä$çeïá@çeè ˜ê\çeè ˜ìxçeÿä¼p-ìlèeŒJä¤çeäŒJàçeÿìäüçeïáèeèlÍJì4èeèôIìPèeè°"JøLbì¸èepÎä|èeæpΜBäÿåée@ÎäÈèeæ@ΜBäÿå¤ée`Jäéeä`JPéeÿìäléeïáˆéeé=XùBJì$ëe Îä´éeä Îðéeÿìä êeïá(êeèèvJìDêeè|Jì`êeø|êeø˜êeè”PJì´êeèx{JìÐêeè\’Jììêe耑JìëeèØvJøø«SìÄëeèYä4ëeäèYpëeÿìäŒëeïá¨ëeèŒHMÿèðëeÈsäÔëeàëeæ â€~VæìeÁ åìe¨%SâìeÄYä pR4ìeôÀ ä(ìe#[æLîe¨säDìeLìeâ,â|ìe¨sèîeèâpê¨säLìeäœìeãálíe˜Rä¬ìe|ìe˜Rèìeÿèä$íeäíeäãLìeì âLìe äPíeè@íeì âLìeðíeê”íe€ñä|íeæ€ñЦMä(â¼íe1 ä¤íeâ|íe1 è$âäíedäÌíeâ ¤íedÐXLä â îe„­äôíeâ Ìíe„­°Käâ4îeT›äîeâôíeT›ð¨säDîeLìeâxîeÀÀ ä\îehîeæ âü§bæ”îel¦ äˆîe” eæøïe\sä¤îeä\sàîeááÿåäüîeïDáïeèœBì4ïeøPïeølïeøˆïeèœBì¤ïeøÀïeøÜïeè›öœBìðeHsäðeà$Kæ0ðeìIä$ðeà$KæLðe¸.ä@ðeìXæhðe¤.ä\ðeä fâø fØ>è â` fpäH fâ fpLªJäæ8–äp fâ H f8–”ÜIìi ä˜ fâ 8fi ° fè âà fäóèÐ fèâpæpfäóä° få fãáÐ f˜Rä fà f˜RL fÿèäˆ fäx fäã° fì â° f ä´ fè¤ fì â° fðx fêø fŒÔ äà fæŒÔ èâ f” ä fâà f” èâH f cä0 fâ f cèâp f`äX fâ0 f`è☠fØ>ä€ fâX fØ>è âÀ fpä¨ fâ € fpLªJäæ8–äÐ fâ ¨ f8–”ÜIìd0äø føfâ( fÿ ä fâÌfÿ èâP fІ ä8 fâ fІ ðLÐä` fœÿe†fd0äx føfâ f © ä fä © Ì fááÿåäè fïDáfèTJøœBì0f8uä ¼ÒOLfD0ä@f„&VêØtä\ftÖ_æ@f Ñäxfä Ñ´fááÿåäÐfïDáìføfø$fÿä8oìftMäPfätMŒfÿìä¨fïáÄfèlÍJìàfèôIìüfè°"JøLbì(f[ä_áfPMä8fäPMtfÿìäfïá¬fè˜NìÈføäfè ìIøLbìf|[äf€TOæ8fìÐä,f@lbæØf1äHfä1„fááÿåä fäÄ–]çDá¼fÿäLbìôf8MäèflRSæxf¸Ðäfä¸Ð@fááÿåä\fïDíœBð4à äˆf$¿Tæ4f¼Ã ä¤fä¼Ã àfÿìäüfïáfÿä ˜êDfpª ä ”;Säfì1äTfäì1fÿìä¬fïáÈfèœBø ˜êüftÑäôf0÷Râfp¨ ä f¸_æðfXÑä(fäXÑdfááÿåä€fïDáœfø¸fè|JìÔfè|Jÿè fÔ1åf$ádæäf<ª äfä<ª XfááÿåätfïDáfèœBì¬fèœBìÈfÿø4¨ ä ¸(Sxf« äfä« @fÿìä\fïý”fLÄ äˆf,e\æ4fávä¤fåvàfááÿåäüfïDáfÿä ˜ì fP2äDfäP2€fÿìäœfïá¸fèlÍJìÔfèôIìðfè°"JøLbìf 2äfä 2Xfÿìätfïî/Qìhfð¨ ä fäð¨ ÜfÿìäøfïáfèlÍJì0fèôIìLfè°"JøLbììfðª äxfä𪠴fÿìäÐfïí\RìfĨ äüf¬G]æ4füà äf$fæ ⼎^æ føMäDfäøM€fÿìäœfïá¸fèðºPìÔfè ˜êðfè ˜ÿæf\äfä\XfááÿåätfäTDçDíœB𨨠ä f¬fæ â`æèf\« äÌfä\« fÿìä$fïá@fèÈBì\føxfè ˜ê”fè ˜ê°fè ˜ìÌfÿä¼p-ìlfœ© äøf䜩 4fÿìäPfïí¼p-ì|f`Òä ¸=\˜fÄ2äŒfTÞaæ´f¤2ä¨flVæÌf8« äÄf¬xSâèf´väÜfì¯[æfDÒäøf„ÛMæˆf(Òäfä(ÒPfÿìälfþøý]ðdÄ ä üûW4 f$Oä¨fä$OäfÿìåfïáfèœBì8føTfè|JìpføŒfèÔDì¨fèÔDìÄfèÔDìàfèX-ìüfèÔDì fèÔDøÔDìP f`wäD fêð f<3ä` fä<3œ fááÿåä¸ fïDáÔ fè ¤Jø¼p-ì!fHwå!fäHwf QäT=fä Q=fÿìä¬=fïáÈ=fè$ÓIìä=fèTí>fèTÿè >f zä,>fä zh>fÿìä„>fïí„ëIì¸>fìPä°>fJâä?fØ_äÈ>fäØ_?fÿìä ?fä4ìOçábêpvf>bâ”vf² äˆvfìÉ[æ°vfP° ä¤vfÐŒcæÌvfü± äÀvf°Kæèvf Ì äÜvf,£Zæwfœ8äøvfxTæwf€8äwf¨1VæôË ä,wf¬BVæôwfx9äHwfäx9„wfÿìä wfïá¼wfèœBìØwfèTDÿè”xfP² äxfäP² @xfááÿåä\xfïDáxxfÿäX-ìàxf¼~ä¤xfæ¼~œBäÿå,yfŒ~äðxfæŒ~œBäÿå zf Úääp¯fä€>¬¯fÿìäȯfïáä¯fèlÍJí°fèôIì°fè°"JøLbìd±f¤Ñ äH°fä¤Ñ „°fÿìä °fïá¼°fè ˜ìذfè ˜ìô°fø±fèTDì,±føH±fèLbøLb쀱f „ät±f|[êè¶ ä±f¬âXâ8²f¸„䨱f丄ä±fááÿåå²fïDá²fÿäÔDìH²f8\ä ¨…[ ³f€ßäX²fä€ß”²fäÿåä°²fïá̲fè„ëIìè²fè ˜ê³fÿäPLìø³f<ßä0³fä<ßl³fÿì䈳fïᤳfèlÍJìÀ³fèôIìܳfè°"JøLbì$´f ß´f´f0Nê´f0Nâü´f@iä4´fä@ip´fÿì䌴fïᨴfèlÍJìÄ´fèôIìà´fè°"JøLbìHµf iä µfæ i´Oâÿå̵f8?äXµfä8?”µfÿìä°µfïî/Qìܵf \ä ”VV¨¶ft„äìµfät„(¶fÿìäD¶fïá`¶fèLbì|¶fÿ䘶fì ⼄PæÔ¶fá\丶fĶfæ â£aæð¶fðÞää¶fîSæ ·fiå·f<ÙOæ·fX· ä·fäX· X·fááÿåät·fïDíÈB쬷f°[ä ·fdæØ·f¼>ä¼·fÈ·fæ â@Èeæô·f<· äè·fHî]ê”[ä¸fœÀPâä¸f]ä¸fä]X¸fäÿåät¸fïá¸fè„ëI쬸fè|JêȸfÿäPLí¹f0…äô¸fh„Læعfl¶ ä¹fäl¶ L¹fÿìäh¹fïᄹfèlÍJì ¹fèôIì¼¹fè°"JøLbìô¹fè\äè¹fPdæºfL¶ äºf(Qæ(ºfH¸ ä ºfœQ]âäºfèßä8ºfäèßtºfááÿåäºfïDᬺføȺfè|Jÿé»fÔßäôºftK]æh»fÔ· ä»fäÔ· L»fÿììl5Sî`\äx»fä`\´»fÿìäлfïáì»fø¼fèœBÿè@¼f(Ó ä4¼fèª`æLÀfØàäP¼f\¼fæ âl¼fæâ œ¼f¤É È¿fèÜ¿fä @áp<Àfæ¤É äl¼fä¼¼fãá"¾fôO`½f̼fœ¼fôO½fÿèä4½fìãl¼føP½fì âl¼fèh½fœ¼fôO¤½fÿèäнfìãl¼fìì½fèP½fø¾fê âl¼f äȾf˜Rä(¾fœ¼f˜Rd¾fÿèä¾fä¾fäãl¼f쬾fèP½fø¾fê°¿ftP äؾfœ¼ftP ¿fâÿèä@¿fìáál¼f ê\¿fèP½fìx¿fè˜RM씿fè8oø8oð¤É äÀ¿fl¼fæˆbìì¿fl¼fäâ✼f$6 (ÀfÿäìâÐÉêyùºÎŒ‚ªK© ìÀfáÓ ä\ÀfåÓ ˜Àfÿìä´ÀfïáÐÀfè@™Xø|Jì¨ÁfÜ]äüÀfäÜ]8ÁfÿìäTÁfïápÁfé/QìŒÁfè”}Kø ‚Kì€Âf ¸ ä¸Áfä ¸ ôÁfÿìäÂfïá,ÂfèlÍJìHÂfèôIìdÂfè°"JøLbìœÂfèÒ äÂf\RæØÃf¤]ä¬Âfä¤]èÂfááÿåäÃfïDá Ãfè Kì<Ãfè|JêXÃfè KìtÃfèœBì ÃfèÃfì âPE]æ¼Ãfÿä KìôÃfÄ…äèÃf\BOæÄf¨…ä Äfü9Wä,Äfȶ ä Äf€¿VæXÄf´Ò ä<ÄfHÄfæ â\ Qæ@Åf|àähÄfä|à¤ÄfááÿåäÀÄfïDáÜÄfèì¥KìøÄføÅfÿä0Åfì â€NZæüÅfL]äPÅfäL]ŒÅfááÿåä¨ÅfïDáÄÅfè|JêàÅfè|Jö|Jê(Æfd…ä ÆfÆfæ â”éXæ@ÆfD…ä8ÆfØf]â\ÆflÒ äPÆfh—PæxÆfh¸ älÆfîêð?ä ˆUæØfP‡ä„Øfà¦MæÙf,» ä Øfä,» ÜØfÿìäøØfïý0Ùf» ä $Ùf`#]äHÙf¨¸ ä@Ùf0 ]âèÙfDãäXÙfäDã”Ùfááÿåä°ÙfäÜ9NçDáÌÙfèÌýQø|JëÚfŒ¸ äøÙfü§bâ ÚfYæÌ*g, ä°*g¼*gæ â¬ÜXæè*gltäÜ*g nOæ+gHIäø*g ˜êÄéä+gäÄéP+gÿìäl+gä|Jçí|Jê +gXä˜+gSâ@,g@ä°+gä@ì+gááÿåä,gïDá$,gÿä ˜ìP,g(äxUJ|,gxÜ l,g`,g taêt,g taâ8-g¸êäŒ,gä¸êÈ,gááÿåää,gïDâ-gè|Pê-gè|JÿèT-g<à äH-g|ò]æp-g€êäd-gìÄbæ,.g`êä€-gä`ê¼-gááÿåäØ-gïDáô-gèœBì.gÿäÜr_î<êä<.gH.gæ âøâUæø.g äh.gä ¤.gááÿåäÀ.gïDáÜ.gÿä ˜ì´/gpä/gäpD/gÿìä`/gïá|/gè¤PJì˜/gè$mJøpìà/ghÝ Ð/gÄ/gP™XêØ/gP™Xâ 0g,ëü/gð/gPº^ê0gPº^â¬0gpiä0gäpiX0gááÿåät0gïDá0gè|Pö8oìL1gœvä¼0gäœvø0gÿìä1gïá01gé/QøLBKì$2g<Ý ä\1gä<Ý ˜1gÿìä´1gïáÐ1gèlÍJìì1gèôIì2gè°"JøLbìà2güêä42gäüêp2gÿìäŒ2gïá¨2gèFKìÄ2gè|Jø„ëIì€3gྠäð2gäྠ,3gÿìäH3gïád3gèÈBøœBìœ3g€vä3gì{_æ¬3gXiä Ä­J„4g¸¾ ä¼3g举 ø3gááÿåä4gïDá04gè\ºXìL4gèœBêh4gÿäœBì5g˜¾ ä”4g䘾 Ð4gááÿåäì4gïDí„gSêü5g iä5gä iT5gÿìäp5gïáŒ5gèÈBì¨5gè \ìÄ5gè|Jêà5gè|Jÿæ|6g8vä 6g6gæ â(6gæäD6gïá`6gè ˜ÿè7gväŒ6gävÈ6gááÿåää6gïDâ7gèÈBøHgÀŽå>gäÀŽ<>gááÿåäX>gïDát>gÿä ˜ì¨>gÈìä >gÀ1Pâ¸>g¼Þ ä „sRt?gX¿ äÈ>gäX¿ ?gÿìä ?gïáKøLBKìXFgPß ä¬EgäPß èEgÿìäFgïá Fgè$ÓIìKìì\gôÁ äà\gØVRæp]gìÈ äü\gäìÈ 8]gááÿåäT]gäœBçDýŒ]gÔÈ ä€]gtªVæ_gpläœ]g¨]gæ â¸]gæâè]gœvè`_gèâpêœvä¸]gä^gãáØ^g˜Rä^gè]g˜RT^gÿèä^gä€^gäã¸]gì â¸]g ä¼^gè¬^gì â¸]gð€^gë_g@ äè^gæ@ ¤tVä â(_gD¡ä_gâ è^gD¡¤tVäâP_g$×ä8_gâ _g$פtVäâx_gŒ×ä`_gâ 8_gŒ×¤tVìœväˆ_g¸]gâ¬_gLðä _g@ÇQæ0`g |ä¼_gä |ø_gááÿåä`gäœBçDíœBìÐ`gðä@`gäð|`gááÿåä˜`gïDá´`gè ˜ÿêdá äà`gädá agááÿåä8agïDáTagèœBìpagøŒagÿä¨sMì¸agÈ ä ìÍNXbgô“äÈagäô“bgÿìä bgïáZòØfì$cg€MäcgxQæøcgx ä4cg@cgæ âPcgæälcgïáˆcgø¤cgøÀcgè\¥MìÜcgèTDøLbìdg` ädgÌŸPêÔlä$dgäÔl`dgááÿåä|dgïDá˜dgèì¥KÿèÌdgôðäÄdgüÌcâÜdgôâ ä ÀN´egÔâ äìdgäÔâ (egÿìäDegïá`egèlÍJì|egèôIì˜egè°"JøLbìÄegˆmä ä,Q¸fgà|äÔegäà|fgÿìä,fgïáHfgèœBìdfgèœBì€fgøœfgèLbÿèggpmäÈfgäpmggááÿåä ggïDáKì¤&h,ö ä ,@TÀ&hlä´&hçOæÜ&høäÐ&hì9Wæ'hö äì&hø&hæ ã£Wæ(hH_ä'häH_T'hááÿåäp'hïDáŒ'hè|Jê¨'hè|JêÄ'hè|Jêà'høü'hè|Jø8oìœ(hÀõ ä((häÀõ d(hÿìä€(hþp9Jìè(hl§ä¬(hÌkl§ÐnEò”nEú¬õ äø(hä¬õ 4)hÿìäP)hïýˆ)høä|)hTÐaæ *hÈ`ä˜)häÈ`Ô)häÿåäð)hïíX„Lì*hlö ä*hälö X*hÿìät*hïí(!Lì0+h`ä *hä`Ü*hÿìäø*hïá+hèŒHMÿè,hT`ä@+häT`|+hÿìä˜+hïá´+hèlÍJìÐ+hèôIìì+hè°"JøLbìÄ,h¼ä,hä¼T,hÿìäp,häTDçáŒ,hèLbì¨,hèTDø€VNìœ-h(Ü äÔ,hä(Ü -hÿìä,-hïáH-hèlÍJìd-hèôIì€-hè°"JøLbì¸-h4`ä¬-hœBæÔ-hÜ äÈ-hˆ¬Qæð-h`ää-h´æRæ .hŒŽå.hÙUæ(.hÄä.hKìÀ2h Ô äø1hä Ô 42hááÿåäP2hïDál2hèTJìˆ2hèœBì¤2hÿäLbìÜ2h°ö äÐ2hÌŸPæ`3hè§äì2häè§(3hááÿåäD3hïDí,„Kì4hHaäp3häHa¬3hááÿåäÈ3hïDáä3hè ˜ë4hèœBÿì(aä,4hä(ah4hÿìä„4hþœBì¸4hØÝ ä°4hðLPâX5h÷ äÈ4hä÷ 5hÿìä 5hïá<5hèÌHNÿèt5h´€äh5háÿaæ„6hä„5häÀ5hááÿåäÜ5hïDáø5hèèQLê6hø06høL6hèœBìh6hè ˜ÿè$7h\Ý ä”6hä\Ý Ð6hááÿåäì6häœBçDá7hÿäœBì@7hÄaä47h ùZæà7h äP7hä Œ7hááÿåä¨7hïDáÄ7hèœBøLbì€8hTÔ äð7häTÔ ,8hááÿåäH8hïDád8hÿôÌ8h|ä8hÌk|Tñ8æê¨ñ8ö9hŒäÜ8hÌkŒÀoEî„oEúlä(9häld9hÿìä€9hïáœ9hè ˜öKêÐ9hPÞ äÈ9h FPâè9h<Þ äà9hpDPâø9hx÷ ä è{J|:h$©ä:hä$©D:hÿìä`:hïî/Qí;h(Õ äŒ:hä(Õ È:häÿåää:hïý;hTä ÄnP°;hLä ;häL\;hááÿåäx;hïDá”;hèLbøLbì¤hðä¼=häðø=hÿìä>hïá0>hÿä<1_ìd>hØ©ä\>h¼€Nât>hácä à1K„>h¨Õ ä eJ\?hÔÞ ä”>häÔÞ Ð>hÿìäì>hïá?hè,9Mì$?hè¬@Mì@?hèœBøÈBìÄ?h°Þ äl?hä°Þ ¨?hááÿå÷Dá,@h¼äÔ?hä¼@hááÿå÷Dá°@hDä<@häDx@hÿìä”@hïí<9Tì4AhlÕ äÀ@hälÕ ü@hÿìäAhïí<9TìðAh|Þ äDAhä|Þ €AhÿìäœAhïá¸Ahé/QìÔAhÿô BhØ÷ åBhïIæ(BhäBhpê´ä8Bh” eæäBh°cäTBhä°cBhááÿåä¬BhïDáÈBhè ¤Jøì„ChLø äôBhäLø 0ChÿìäLChïáhChè8ÆKøÔDì”ChLÖ ä LL4Dhˆcä¤ChäˆcàChÿìäüChïáDhè¤PJøÌ“JìPDh<ø äDDh„RæhDhpß ä`Dhx®Sâ€Dh@ªäxDhÈw^âEh,Ö äDhä,Ö ÌDhááÿåäèDhïDí°"Jì EhªäEhÌù]æLFh ø ä0Ehä ø lEhááÿåäˆEhïDá¤Ehèì¥KìÀEhøÜEhøøEhøFhø0FhÿôhFhø©ä\Fh°V`æ„FhøÕ äxFh¨ÈNêTcä”Fh,ËNæ¼Fhüªä°FhpáNæ”Gh(ù äÌFhä(ù Ghÿìä$Ghïá@GhèlÍJì\GhèôIìxGhè°"JøLbìlHh´ä¤Ghä´àGhÿìäüGhïáHhèlÍJì4HhèôIìPHhè°"JøLbìDIháù ä|Hhåù ¸HhÿìäÔHhïáðHhèlÍJì IhèôIì(Ihè°"JøLbìäIh”däTIhä”dIhÿìä¬IhïáÈIhèLbøØfì„JhЪäôIhäЪ0JhÿìäLJhïáhJhè|øOøl PìxKhÄä”JhäÄÐJhÿìäìJhïáKhèLBKì$KhèFKì@KhèLBKì\Khè|PöØfìˆKh¬ä ”XZ¤Kh‘ä˜Kh ‹UæÀKhØÖ ä´KhÜÁ[æ`Lh däÐKhä d Lhááÿåä(LhïDáDLhè°"Jÿè|LhdäpLh°êTæ¨Lh°Ö äŒLh˜Lhæ â0íTæÀLhŒªä¸Lh€_â˜Mh”äÐLhä” Mhááÿåä(MhïDáDMhèì¥Kì`Mhè|Jê|MhèÄUÿè´Mhˆß ä¨Mh” eæTNhpªäÄMhäpªáNhááÿåäNhäœBçDá8Nhè ˜ö&MìôNh´ø ädNhä´ø  Nhááÿåä¼NhïDáØNhèœBÿìD‘äOhêKøLbì¨Th<‚äœThÔÉgæÀTh(eä¸Th¨NNâÜTh|«äÐTh$?aæ`Uhlù äìThälù (UhááÿåäDUhäÈBçDíÈBìVh ’äpUhä ’¬UhááÿåäÈUhïDáäUhè,„KíVhÿä|JðÜ‘ä,Vh$¯MâœVhD“äDVhäD“€Vhÿì÷áXWhÐ× ä¬VhäÐ× èVhÿìäWhïá Whè˜ÝKìJâ‹hœå äÈŠhäœå ‹hÿìä ‹hïá<‹hèÜñNìX‹høt‹hÿä|JêhŒh²ä ‹hä²Ü‹hÿìäø‹hïáŒhèlÍJì0ŒhèôIìLŒhè°"JøLbì@h”þ äxŒhä”þ ´ŒhÿìäÐŒhïáìŒhèôIKìhø$hè8oøLbìüh  äPhä  Œhÿìä¨häTDçáÄhèLbìàhèTDøÔR쀎hè±ä Žhäè±HŽhÿìädŽhïíœÊeìÌŽhìiäŽhæìi´OâÿåPhȱäÜŽhäȱhááÿåä4häœBçDíX-ìhh¨±ä`h\>`â$hü—äxhäü—´hááÿåäÐhïDáìhèœBêhèÄSÿèPhþ ä4h@hæ â¼÷Xæ`háþ äH=Jä`å ä˜;Jœhˆæ Œh€hØ*]ê”hØ*]â¬h³ä JO„‘hXæ ä¼häXæ øhÿìä‘hïá0‘hèlÍJìL‘hèôIìh‘hè°"JøLb씑hÀjäØ~MÀ‘h@æ °‘h¤‘há}P긑há}Pâ–h<Ý €–hБhÜ‘hæâ ’h<Ý ü•hè–hä @ápp–hæ<Ý äÜ‘hä,’hãá"ˆ“hôOÐ’h<’h ’hôOx’hÿè䤒hìãÜ‘høÀ’hì âÜ‘hèØ’h ’hôO“hÿèä@“hìãÜ‘hì\“hèÀ’høx“hê âÜ‘h ä8”h˜R䘓h ’h˜RÔ“hÿèå”häx“häãÜ‘hì”hèÀ’høx“hêä•hLäH”h ’hL„”hâÿèä°”hìááÜ‘h êÌ”hèÀ’hìè”hè|Pê•hè|Jê •hè|Jê<•høX•høt•hè|Jê•hèFK쬕høÈ•hè|Pÿê<Ý äô•hÜ‘hæˆbì –hÜ‘häââ ’h@ \–hÿäìâ&æÀåF㈖hÜ‘hâ¼–h$æ ä –h¬–hæ â Â\æØ–hÌþ äÌ–h¼ JêÝ äè–hô–hæ âTíXæ—häÝ ä X2K@˜h”Ý ä$—hä”Ý `—hÿìä|—hïᘗhè0ãQì´—høЗhøì—hø˜hèdKì$˜hÿälêQìP™hç äP˜häç Œ˜hááÿå䨘hïDáĘhè|Jêà˜hèðJìü˜hø™hè8oì4™hÿäàJì(šh\ ä`™hä\ œ™hÿì丙hïáÔ™hèlÍJìð™hèôIì šhè°"JøLbìDšhh˜ä8šh"dæT›h< äTšhä< šhááÿå䬚hïDáÈšhèèQLêäšhù›hø›hèœBì8›hè|Jÿèl›hŒ‡äd›hÔRâ œh ä|›hä ¸›hááÿåäÔ›häÞQçDáð›hèœBÿêüjäœhäüjXœhááÿåätœhïDáœhè,Zö,Z켜hèkä 4ÁL”hüÿ äÌœhäüÿ hÿìä$hïá@hèlÍJì\hèôIìxhè°"JøLbìlžhD™ä¤häD™àhÿìäühïážhèlÍJì4žhèôIìPžhè°"JøLbì`Ÿh´ä|žhä´¸žhÿìäÔžhïáðžhèÀ®Tì ŸhèBJì(Ÿhè|JìDŸhèBJø8o쬟hÐÞ äpŸhæÐÞ ´Oâÿ弟h$™ä _” h äÌŸhä  hÿìä$ hïá@ hèlÍJì\ hèôIìx hè°"JøLb줠h(ˆä ôªJРhì ä´ hÀ hæ â8\æü há´äà hì hæ âxAd朡hä³ä ¡hää³H¡hááÿåäd¡hïDအhèÈBÿè¢hÌk䬡häÌkè¡hááÿåä¢hïDá ¢hèlZì<¢hèÈBìX¢høt¢hÿô£h°kä ¢hä°kÜ¢hááÿåäø¢hïDíì¥Kì0£h̳ä$£h°V`æH£hð‡ä@£häçXât£h ç äX£hd£hæ âü]Ræ£h´ ä„£höM樣h\ÿ ä £hôï_昳丣h8ñVâУh$µä ŒIVŒ¤hЈäà£häЈ¤hÿìä8¤hïáT¤hè_Pìp¤hè¸3Mö¸3Mꨤh°ç 䜤hÊcæĤhl两hTåSæà¤h¸ˆäÔ¤há»Pæü¤hläð¤h`;Ræ|¥hd ä ¥h¥hæ â(¥hæäD¥hïá`¥hèì¥Kÿ蔥h ˆäŒ¥hHgXâ°¥h€´ä¤¥hˆ±Kêl´äÀ¥hêÜ¥hxß ä D3U|¦hTß äì¥häTß (¦hááÿåäD¦hïDá`¦hÿäø…Q쌦hášä ˜_œ¦hü ä Ô-Q<§hè䬦häèè¦hááÿåä§hïDá §hè$ÓIÿèL§h˜µä |AT¨h4ß ä\§hä4ß ˜§hááÿåä´§hïDáЧhè)Jìì§hè\-ÿè\¨hÜ™ä¨h$¨hæä@¨hïáàoMè¼lMì4©hìç äl¨häìç ¨¨hááÿåäĨhïDáà¨hè$¡Pìü¨hø©hÿôð©hTläD©häTl€©hááÿå䜩hïDḩhè|JêÔ©hèœBÿ숙åªh䈙<ªhÿìäXªhïátªhè ˜êªhèKöKê «hm伪hämøªhÿìä«hïá0«hèœBìL«høh«hèœBì„«hÿäX-ì$¬h¼ä°«hä¼ì«hÿìä¬hïíD•eìü¬hì‰ä4¬häì‰p¬hÿì䌬hïᨬhèlÍJìĬhèôIìà¬hè°"JøLbì­h€ä ­hDNæD­h¼‰ä(­h4­hæ ⸒Væ`­h¨ß äT­htUæ|­h$è äp­h*Tæ”­hàl䌭hÓYâ¯h@šä¤­hä@šà­hááÿåäü­hïDá®hèœBì4®høP®høl®hèÄc숮hø´®h褮hì â,ðMæЮhøì®hèÄcøØfì ¯hðµä¯hèyYæеä0¯h¤¦[âT¯hl›äH¯h ÃSæp¯hà äd¯hàëe怯hpŠä <«J˜¯h·ä¯hØ gâ8°h 䨯hä ä¯hááÿåå°hïDá°hèœBø¬½LìT°h€è äH°h¸3MêØäd°hìXæd±h¨·ä€°h䨷¼°hááÿåäذhïDáô°hèÐyPì±hø,±hèTDìH±hÿäLbì²hüŠät±häüа±hÿìä̱hïáè±hè(!Lø8oìÀ²hXœä²häXœP²hÿìäl²hïሲh蔀M줲hÿô ³hnäвhæn´Oâÿå8³hÈà ä³h(³hæ â؈Ræ,´h¨äH³h䨄³hááÿåä ³hïDá¼³hè€MZìسhøô³hø´hÿôH´h¼mä<´h•PæÌ´hpäX´häp”´hááÿåä°´hïDí ˜î`·äÜ´hä`·µhááÿåä4µhïDáPµhèœBìlµhøˆµhø¤µhøÀµhÿô·h\¸äìµhä\¸(¶hÿìäD¶hïá`¶hèœBì|¶hø˜¶hø´¶hèœBìжhøì¶hèÔDøœB쌷hxä·häxT·hÿìäp·hïí ˜ê¨·hL‹äœ·h´sh怸hX丷häXô·hÿìä¸hïá,¸hèlÍJìH¸hèôIìd¸hè°"JøLb윸h¤é ä¸hxCZæ<¹h ä¬¸hä è¸hááÿåä¹hïDá ¹hèüT^øØfìX¹hˆé äL¹h8_æLºhDnäh¹häDn¤¹hááÿåäÀ¹hïDáܹhèœBìø¹hèLbìºhèLbì0ºhèLbøLbì\ºhä äXüºhá älºhäá ¨ºhÿìäĺhä ˜êàºhè ˜ö ˜î(‹ä »hä(‹H»hÿìäd»hïျhÿôX¼h˜ä¬»hä˜è»hÿìä¼hïá ¼hèœBì<¼hèTDÿèp¼häh¼hØqT∼hԋ䀼h,Zâ ¼ho䘼hPdâ¼¼hTä°¼h<¼`æÔ¼h ¸ä̼h¨Ja挋ää¼hLbæ½h(å½hä(<½hÿìäX½hïát½hè`xOÿèh¾h¨Œä ½h䨌ܽhÿìäø½hïá¾hèlÍJì0¾hèôIìL¾hè°"JøLb섾häx¾h|J朾hd¹ä”¾h4Þ[⸾hl䬾h̦Væ¿há¹äȾh广hÿìä ¿hïá<¿hè|JêX¿høt¿hèœBøLb쬿hdŒä ¿h$—bæ0Àh伿häø¿hááÿåäÀhïDí ˜êÐÀh,ä@Àhä,|Àhááÿåä˜ÀhïDá´ÀhèœBøÏ_ìTÁhÀé äàÀhäÀé Áhÿìä8ÁhþœBððädÁhT,SæˆÁhˆä€ÁhAPâÐÂh4ä˜Áhä4ÔÁhÿìäðÁhïá Âhè øUì(Âhè|JêDÂhè|Jê`Âhø|Âhè|Jì˜Âhø´ÂhèLbÿèÃhXäàÂhæXœBäÿåhÃh(ä,Ãhæ(œBäÿå€Ãhà¹äxÃhìÐRâÄhTpäÃhäTpÌÃhááÿåäèÃhïDí\Rì Äh@äÄh€ò^æ8Ähȹä0ÄhäWâTÄh¬¹äHÄhÁeæpÄhøädÄh\ÖUæÅhÌä€Ähä̼ÄhááÿåäØÄhïDáôÄhèœBø¬½Lì,ÅhÐê ä Åhˆù^æXÅh°ä<ÅhHÅhæ âldæÆh4pähÅhä4p¤ÅhááÿåäÀÅhä°¤PçDáÜÅhøøÅhè°¤Pÿè0Æhpä$ÆhP¯Xæ$Çhä@Æhä|Æhááÿåä˜ÆhïDá´ÆhøÐÆhøìÆhèTDêÇhè¼p-ÿèÄÇhøŒä4ÇhäøŒpÇhááÿåäŒÇhäœBçDá¨Çhèì¥KÿèàÇhôoäÔÇhXc]æHÈhàŒäðÇhäàŒ,Èhááÿå÷DáXÈhoäŒÐL䀹ähÈh䀹¤ÈhÿìäÀÈhþœBì´ÉhŽäìÈhäŽ(ÉhÿìäDÉhïá`Éhè|Jê|Éhè|Jê˜Éhè|Jö|JêÐÉhèäÄÉhL1_æìÉhPë äàÉhPPPæÊhÄpäüÉhÌãNæŒÊhäÊhäTÊhÿìäpÊhïí¤PJìœÊhÌä ¸{JtËhXâ ä¬ÊhäXâ èÊhÿìäËhïá ËhèlÍJì<ËhèôIìXËhè°"JøLbì0Ìh8ë ä„Ëhä8ë ÀËhÿìäÜËhïáøËhèLbìÌhÿäÔRìHÌhèä@Ìh$ø[âtÍhœpäXÌhäœp”Ìhááÿåä°ÌhïDáÌÌhøèÌhøÍhè\¥Mì Íhø<ÍhøXÍhèœBøLbìŒÍh0â ä„Íh€EYâ,Îh´äœÍhä´ØÍhááÿåäôÍhïDáÎhèßPø ˜êÎhü¹ä<ÎhHÎhæ âXÎhæätÎhïí|Jð|ä ÎhÄ-Wæ„Ïháì ä¼Îhåì øÎhááÿåäÏhïDá0Ïhè|PêLÏhè„ëIìhÏhè|PöØfì\ÐhÐä”ÏhäÐÐÏhÿìäìÏhïáÐhèlÍJì$ÐhèôIì@Ðhè°"JøLbì4ÑhкälÐhäк¨ÐhÿìäÄÐhïáàÐhèlÍJìüÐhèôIìÑhè°"JøLbì€Ñh¤ŽäDÑh椎œBäÿå<ÒhtŽäÑhätŽÌÑhÿìäèÑhïáÒhè8ÆKì Òhè|JøüÌKìÓh äLÒhä ˆÒhÿìä¤ÒhïáÀÒhèlÍJìÜÒhèôIìøÒhè°"JøLbììÓhxä$Óhäx`Óhÿìä|Óhïá˜ÓhèlÍJì´ÓhèôIìÐÓhè°"JøLbìŒÔhÐë äüÓhäÐë 8ÔhÿìäTÔhïápÔhèèƒNø8oìdÕhqäœÔhäqØÔhÿìäôÔhïáÕhèlÍJì,ÕhèôIìHÕhè°"JøLbìtÕh°ºä ¬SRÕh¸â ä„Õh€ØPæ¬Õh˜ë ä ÕhPîVæ Öhäpä¼ÕhääpøÕhááÿåäÖhïDá0Öhè¸3MìLÖhøhÖhø„Öhÿô$×h˜ºä°Öh䘺ìÖhááÿåä×hïDí¸3Mì@×h@ä4×h¸cê„â äP×hä„â Œ×hÿìä¨×hä ˜çáÄ×høà×hÿä ˜ìØhárä ØhôSæ4Øh@ì ä(ØhIPæðØhÐqäDØhäÐq€ØhÿìäœØhïá¸Øhè¤PJìÔØhÿäLbì¬Ùhhã åÙhähã <ÙhÿìäXÙhïátÙhèLbìÙhÿä˜RMì„Úh`»ä¼Ùhä`»øÙhÿìäÚhïá0ÚhèlÍJìLÚhèôIìhÚhè°"JøLbì Úh,ä”ÚhŒ™KæÛhžä°Úh¼Úhæ âÌÚhæäèÚhïáÛhèœBì Ûhè LTê<ÛhøXÛhøtÛhèœBøLbì¬Ûhhä Ûh(šdêôâ ä Ø=J”Üh ŸäÌÛhä ŸÜhááÿåä$ÜhïDá@ÜhèÐyPì\Ühè ˜êxÜhè ˜øLbìlÝhprä¤ÜhäpràÜhÿìäüÜhïáÝhèlÍJì4ÝhèôIìPÝhè°"JøLbì ÞhŒì ä|ÝhäŒì ¸ÝhÿìäÔÝhïáðÝhèøEJøøEJì8Þh\r(ÞhÞh0«Rê0Þh0«RâØÞhÀäHÞhäÀ„Þhÿìä Þhïá¼ÞhèèƒNø|JêßhôÞhèÞhpxOêüÞhpxOâ0ßhŒäßh ßhæ â„\æàhrä@ßhär|ßhááÿåä˜ßhïDá´ßhè°"JìÐßhèœBììßhè ˜ÿè$àh äàhÔÝVæ@àh„ä4àh¸ûbæ\àh¬žäPàhàESæxàh »älàh@5fæ,âhâhˆàh”àhæâÄàhèìáhèâpêä”àhääàhãá´áh˜RäôàhÄàh˜R0áhÿèäláhä\áhäã”àhì â”àh ä˜áhèˆáhì â”àhð\áhêÜáh •äÄáhæ •èââhøùäìáhâÄáhøùðäâh”àhæ$âh”àhæ`žä<âhX-æ<ãh4í äXâhä4í ”âhÿìä°âhïáÌâhèœBìèâhøãhèœBì ãhÿäÔDìXãh´äLãhSæ¤ãhlähãhæl´Oâÿå|äh8ä´ãhä8ðãhÿìä ähïá(ähèlÍJìDähèôIì`ähè°"JøLbìTåhˆäŒähäˆÈähÿìääähïâåh蔀Mìåhø8åhè|P÷BJìdåhpä dATtåh˜rä  Råhä ä„åhPMSæ¨åh˜Ÿä åhà¦MâÄåhøì ä¸åh°KæÜåhdäÔåhdjaâøåhä»äìåhxŒPêøäæhäøDæhÿìä`æhä|Jçí|Jíçh` äŒæhä` ÈæhÿìääæhïíôSìçhôí äçhðLPæ¼çhÈí ä,çhäÈí hçhÿìä„çhïá çhèp'NÿèÌçhŒå ä ´%QÜçhdå ä ĉgøçhôäìçhLÉ_æ´èháäèhåDèhäÿåä`èhïá|èhø˜èhè|JöPÏIìÄèhìrä L!Màèh äÔèh@TæøèhÔäðèh`MSâéh äéh Næìéh¼ä$éhä¼`éhááÿåä|éhïDá˜éhèÈBì´éhøÐéhÿôêh¼äüéh8UêÈäêhäÈTêhÿììøý]êŒêh@î ä€êh FPæHëhtsäœêhätsØêhÿìäôêhäTDçáëhèLbì,ëhèTDøÌRZììhØäXëh䨔ëhááÿåä°ëhïDáÌëhèLBKìèëhèLBKøˆZKììhÄä Ì«J,ìh”ä$ìhPÑXâ<ìhðå ä ÌoP¤ìh(î äLìhä(î ˆìhÿì÷åDä´ìhäDðìhááÿåä íhïDá(íhè ˜êDíhèÇYøLbì8îh€æ äpíh䀿 ¬íhÿìäÈíhïáäíhèÈBíîhè ˜êîhè ˜ö ˜êØîhäHîhä„îhááÿåä îhïDá¼îhÿäãLì$ïht‘äèîhæt‘´OâÿåPïhhæ @ïh4ïhÜÄPêHïhÜÄPâðïhD ä`ïhäD œïhááÿåä¸ïhäœBçDáÔïhèœBÿèðhX‘åðhÐQâÄðhøäðhäøTðhááÿåäpðhïDáŒðhèœBì¨ðhÿäœBìàðhÜäÔðhœBæüðhÀäððhÔ·Sæ¸ñh˜ä ñhä˜HñhááÿåädñhïDá€ñhèœBìœñhÿäTDìXòhÀ¡äÈñhäÀ¡òhááÿåä òhïDá<òhèì¥Kÿètôhxähòhtòhæâ¤òhˆuèDôhèâpêˆuätòhäÄòhãá”óh˜RäÔòh¤òh˜RóhÿèäLóhä<óhäãtòhì âtòh äxóhèhóhì âtòhð<óhê¼óhœQ ä¤óhæœQ èâäóhÈÌåÌóhâ¤óhÈÌé â ôhHÇåôóhâÌóhHÇéâ4ôhväôhâôóhvèâ\ôh$gäDôhâôh$gðˆuälôhtòhâ ôh æ ä„ôhôhæ â¸+Kê<‘ä°ôh(ñVæØôhØï äÌôhê$õh°ï äèôhæ°ï ´Oâÿåàõh,’ä4õhä,’põhäÿåäŒõhïá¨õhèFKìÄõhè|Jÿæ¸öh4ç äðõhä4ç ,öhÿìäHöhïádöhèlÍJì€öhèôIìœöhè°"JøLbìÈöhô ä 4dJ ÷h$¢äØöhä$¢÷hÿìä0÷hïáL÷hèàÃbìh÷hè|Pê„÷hè|Pö ìIì@øhˆtä°÷häˆtì÷hááÿåäøhïDá$øhÿäÐ_ìùh„ï äPøhä„ï Œøhÿì䍸hïáÄøhèlÍJìàøhèôIìüøhè°"JøLbìœùh’ä(ùhä’dùhÿìä€ùhïí„aì<úhä‘ä¬ùhää‘èùhááÿåäúhïDá úhÿäTDìTúh(½äLúh8QXâØúhÈ‘ädúhäÈ‘ úhááÿåä¼úhïDí˜lbêôúh¸æ äèúh8vRæ”ûh¬‘äûh䬑@ûhááÿåä\ûhïDáxûhè”sXÿèÀûhœæ ä¤ûh°ûhæ âßbæ(ühļäÐûhäļ ühááÿåì ˜çDáDüh,ä8ühÜwUêtäTühätühÿìä¬ühä ˜çí ˜êôühĽäØühäühæ âÐyPæ”ýh”½äýh䔽@ýhÿìä\ýhïáxýhè8ÆKøüÌKìlþh„ ä¤ýhä„ àýhÿìäüýhïáþhèlÍJì4þhèôIìPþhè°"JøLbì ÿhØç ä|þhäØç ¸þhÿìäÔþhïáðþhè˜Nÿè(ÿhx½äÿhDefæÈÿhX ä8ÿhäX tÿhááÿåäÿhïDá¬ÿhèœBø)Jìäÿh8 äØÿhP_æ i äôÿhä 0iááÿåäLiïDáhiè$¡Pì„iè`#]ÿè\iðtä°iäðtìiááÿåäiä°¤PçDá$iø@iè°¤PÿìÄç äli`îSæPi$£äˆiä$£ÄiÿìäàiïáüièœBìiø4ièœBÿèi$“ä`iä$“œiááÿåä¸iïDáÔiè|Jêðiè|Pê iø(iøDiø`ièLbì|iè”}Kì˜iè>Kì´ièLbìÐiè NììièðJøØfìàièuäiäèuTiÿìäpiïáŒièlÍJì¨ièôIìÄiè°"JøLbì iXè äðiäXè ,iááÿåäHiïDádiè°îcì€iøœièTDê¸iøÔièTDìðièLbø jRê(iÐð äipÎ]æäi¼ð ä8iä¼ð tiÿìäiïá¬iøÈiÿôˆ i”’äôiáiæâ0i”’èd ièâpê”’åiäPiãá i˜Rä`i0i˜RœiÿèäØiäÈiääiì ãi äièôiì ãiðÈiê\iÐZä0iæÐZHiäâ êä„i ûåliâ0i ûéâ¸iÄÚä”iâ liÄÚ¬ièæìipåÈiâ”ipáàièæ i\. äüiâ Èi\.  ièæ T iÀÁ ä0 iâ üiÀÁ H ièæ ãXääd iâ 0 iXä| ièç ( iä¢ä˜ iää¢Ô iááÿåäð iïDá ièßPø|JêD iüç ä8 i”Zêô½äT i` iæ âp iæäŒ iïí ˜ìd i¨ä¸ iä¨ô iÿìä iïá, ièœBìH iè|Jÿè< iÄñ ät iäÄñ ° iÿìäÌ iïáè ièÌÄPì iø iéBJøLbìˆ ip“äL iæp“´Oâÿå´ i¼vä˜ iä¼vÔ iÿìäð iïá iè0ãQì( iøD iø` iø| ièdKì˜ iÿälêQì8iÌ äÄ iäÌ áiÿìäiïí$ÓIìi¤ñ äHiä¤ñ „iÿìä iïá¼ièlÍJìØièôIìôiè°"JøLbì(i vä i\É_âÈipvä8iäpvtiááÿåäiïDá¬iè°"JøpìØi,¾äØiä,¾iááÿåä0iïDáLièœBìhiø„iè|Jê iø¼ièØføØfìôiTväèiÐTLæi0äi}aæ,iáä ilSbæi(ñ ä<iä(ñ xiááÿåä”iïDá°ièœBìÌiøèiÿø@£äiä@£PiááÿåäliïDíœBì(i$é ä˜iä$é ÔiááÿåäðiïDá ièÐyPø05díiì£ä8iäì£tiááÿåäiïDá¬iè|JìÈiøäiÿäìié äi (Pâ iü¾ä(iäü¾diÿìä€iïáœiè ûaì¸iè|JêÔiè|Jêðiÿä8oì(ihäiPLæ8i8ä8iä8tiÿìäiïá¬ièä MìÈiøäiùiè8oìièLbø8oìPiä¾äHiPåMâliÀ¾ä`i°;]æDià“ä|iäà“¸iááÿåäÔiïDáðièœBì iø(iè|JøLbì`i4 äTi¨ `æ|iУäpiTjWæTi ¾äŒiä ¾Èiÿìääiïâiè ˜êiø8ièœBøLbìpiÈ“ädiÑbæôi ä€iä ¼iááÿåäØiïDí|Jê”iÈè äiäÈè @iááÿåä\iïDáxiè ˜ÿæ°iì ä¤i´´]æÈiÄäÀiÌœKæx£äØiêØi$Àäôiä$À0iááÿåäLiïDáhièÐyPì„iø ièTDì¼iÿäLbì”iˆ äèiäˆ $iÿìä@iïá\ièPLìxièLbøX„LìÀi¤°i¤i¤€Mê¸i¤€MâÐipwä  æOìi|é äàiDjTæŒi¨¿äüi䨿8iááÿåäTiä8oçDápiè|Jöîìi`é äœiä`é ØiÿìäôiäõQçáiø,iè¬KìHiè¬KìdièõQø€iì âè~Xæipò ä iäpò ÜiááÿåäøiïDí¸†Sì˜i¨ä$iä¨`iááÿåä|iïDí|Jît äi¨iÌkt Ü¡Eæê ¡EúìiÌkt t¢Eî8¢EöT ixÁä8iäxÁtiÿìäiïá¬ièœBìÈiøäiù ièœBì iø8 ièÔDøœBì€ iÐwp id ið+`êx ið+`âKì83iÿôp3iŒäd3i¸žPæŒ3iðô ä€3iê¤3i–äœ3iè WâD4i0yä´3iä0yð3iÿìä 4iïá(4iè¼lMÿé5i4äT4iä44iááÿåä¬4iïDáÈ4ièœBìä4iÿä¼p-ì5iä5ildâü8il¦ä(5i45iæ âD5iæPât5iø…èÌ8ièâpêø…äD5iä”5iãád6i˜Rä¤5it5i˜Rà5iÿèä6iä 6iäãD5iì âD5i äH6iè86iì âD5ið 6iêŒ6i ó ät6iæ ó èLâ´6iôý äœ6iât6iôý èHâÜ6ih—äÄ6iâœ6ih—èDâ7iW äì6iâÄ6iW è@â,7i, ä7iâì6i, è<âT7it ä<7iâ7it è8â|7iü¯äd7iâ<7iü¯è4â¤7i äŒ7iâd7i è0âÌ7iÌØå´7iâŒ7iÌØé,âô7iéåÜ7iâ´7iéé(â8iìWä8iâÜ7iìWè$âD8i$iä,8iâ8i$iè âl8i˜ äT8iâ,8i˜ èâ”8i@– ä|8iâT8i@– èâ¼8iøVä¤8iâ |8iøV,ÅJäâä8ỉ äÌ8iâ ¤8ỉ ,ÇJìø…äô8iD5iâ9iØ•ä 9i GYæÈô ä$9iêÐ9iÐÂä@9iäÐÂ|9iÿìä˜9iïá´9ièèÍKøüÌKìü9itì9ià9i8áJêô9i8áJâÔ:iÐyä :iäÐyH:iÿìäd:iïá€:ièlÍJìœ:ièôIì¸:iè°"JøLbìì:idõ ää:iÐé^â;ièë ä ü:iì9Wä¨;iÀ–ä;iäÀ–T;iááÿåäp;iïDáŒ;iÿä¼p-ìÀ;i°Âä¸;i˜ÃXâDi4—ä,=iä4—h=iÿìä„=iïá =ièìÂMì¼=iøØ=iøô=ièTDì>iø,>ièTDìH>iød>ièX-ì€>ièX-ÿèè>i Ãä¬>iæ ÃœBäÿå4?ipÃäø>iæpÜBäÿåð?i´ì äD?iä´ì €?iÿìäœ?iïá¸?iètLMìÔ?ièŒHMø|Jê @i$å@i@dæÈ@i—ä@iä—X@iäÿåät@iïá@iø¬@iè ˜öPÏIì Ai”ì äØ@iä”ì Aiááÿåä0AiïDáLAiøhAièœBì„AièœBøPì_ìÌAi ö ä°Ai¼Aiæ â|›\æèAiäÜAiêBi¸§äøAi¤¦LæÜBiÃäBiäÃPBiááÿåälBiïDáˆBièÈBì¤BiøÀBiÿôøBi¼äìBi˜ KæÐCi,zäCiä,zDCiááÿåä`CiïDá|Cièì¥Kì˜CièØOì´Ciè<_ÿèìCiØäàCižTæDiö äüCi°ûPæÄDi§äDiä§TDiááÿåäpDiïDáŒDièœBì¨Diè¼p-øLbðÈäÔDiÌkÈ@¥Eò¥Eö Ei˜ä x…[Kì˜Viè”}Kø ‚KìàVi´™ÐViÄViÌaêØViÌaâüVi4äðViNæ¼tipú ä´tiŒ9[âÌti$¬ä¸Jæô"j¸½äd"j丽 "jááÿåä¼"jïDáØ"jèhEøøEJìÌ#j½ä#jä½@#jÿìä\#jïáx#jèLðgì”#jø°#jèTDøLbì¤$j¬äÜ#jä¬$jÿìä4$jïáP$jèlÍJìl$jèôIìˆ$jè°"JøLbì´$j©ä ð_T%jبäÄ$jäبá%jÿìä%jïá8%j踞PøÛIì47jäd%jl%jâÔâœ%jè7jèâpêäl%jä¼%j/ãáŒ&j˜RäÌ%jœ%j˜R&jÿèäD&jä4&jäãl%jì âl%j äp&jè`&jì âl%jð4&jêd)j 7äœ&jæ 7´&jä¬â(âä&jèL)jèâpæœ%jä´&jä'j ãáÔ'j˜Rä'jä&j˜RP'jÿèäŒ'jä|'jäã´&jì â´&j ä¸'jè¨'jì â´&jð|'jêü'jènää'jæènè$â$(já ä (jâä'já è âL(j\$ ä4(jâ (j\$ èât(jxòå\(jâ4(jxòéâœ(jp ä„(jâ\(jp èâÄ(jdä¬(jâ„(jdèâì(j äÔ(jâ¬(j è â)jìNäü(jâÔ(jìNèâ<)j¥ä$)jâü(j¥èæX[äL)jâ$)jX[ìŒ)j( ät)jâœ&j( è¨â´)j˜& äœ)jât)j˜& è¤âÜ)j˜O äÄ)jâœ)j˜O è â*jäì)jâÄ)jèœâ,*jä ä*jâì)jä è˜âT*j < ä<*jâ*j < è”â|*j(&äd*jâ<*j(&èâ¤*j\ äŒ*jâd*j\ èŒâŒ,j¨¾ä´*jâ Œ*j¨¾Ì*jä‚ââü*j4äèt,jèâpæœ%j4ääÌ*jä+jãáì+j˜Rä,+jü*j˜Rh+jÿèä¤+jä”+jäãÌ*jì âÌ*j äÐ+jèÀ+jì âÌ*jð”+jê,jÐéäü+jæÐéèâ<,jœØä$,jâü+jœØèâd,jkäL,jâ$,jkèæx« ät,jâL,jx« ì´,jȲäœ,jâ´*jȲè€âÜ,jÄk äÄ,jâœ,jÄk è~â-jàKäì,jâÄ,jàKè|â,-j¸š ä-jâì,j¸š èxâT-jl¯ ä<-jâ-jl¯ ètâ|-jxgäd-jâ<-jxgèpâ¤-jþ äŒ-jâd-jþ èlâd/j4ü ä´-jâ Œ-j4ü Ì-jäfââü-jLPèL/jèâpæœ%jLPäÌ-jä.jãáì.j˜Rä,.jü-j˜Rh.jÿèä¤.jä”.jäãÌ-jì âÌ-j äÐ.jèÀ.jì âÌ-jð”.jê/jœØäü.jæœØèâjH äÀ=jäH ü=jááÿåä>jäœBçDíœBìP>jD½äD>jôÊZêx¨ä`>jLbæ„>j#ä|>jdIUâ”>jp#ä 4eJ4?jpÜä¤>jäpÜà>jááÿåäü>jïDá?jè|PöPÏIìD?jp3ä „dU?jT3äT?jæT3´Oâÿå¬?jì ä ?jPì]æ„@jø ä¼?jäø ø?jäÿåä@jïá0@jøL@jè ˜êh@jÿä ˜êœ@jè©ä”@jNâ¸@j\Üä¬@j°µ[æÐ@j°©äÈ@jàESâŒAjÜäà@jäÜAjááÿåä8AjäT#KçDáTAjè¤aZêpAjÿä0ÇQîx©äœAjLRæ¸BjȾä¸AjäȾôAjÿìäBjïá,BjèœBìHBjèTDìdBjø€BjèTDìœBjÿäX-ìÔBj$äÈBjêäBjä3ä|üUáCjPŽäôBjPŽPæØCj4ªäCjä4ªLCjÿìähCjïá„Cjè$ÓIì Cjè”ÜIì¼CjÿäÛIìôCjªäèCjØ]QæDjŒ äDjüËPæT´rj<)ä$rjä<)`rjááÿåä|rjïDá˜rjè|JöôMgì8sj0 äÄrjä0 ásjááÿåäsjïDíœBìTsj`®äHsjlVætjÌßädsjäÌß sjááÿåä¼sjïDáØsjøôsjè ˜ÿìø ä tj,tjæ âŒ\æujÄ äLtjäÄ ˆtjÿìä¤tjïáÀtjèlÍJìÜtjèôIìøtjè°"JøLbì´ujä ä$ujää `ujÿìä|ujïá˜ujè1Nø|JìpvjPÃäÄujäPÃávjÿìävjïá8vjè|øOìTvjÿäLBKì¼vj¨ ä€vjæ¨ ´OâÿåÔvj8ÃäÌvjÌ‚[âðvjH¯äävj(+^æwj,¯åwj@{Sâ wj˜àäwj`;Râ8wjÄ ä0wj:jâ¼wjÔ‘äHwjäÔ‘„wjááÿåä wjïDý”xj¨ äÌwjä¨ xjááÿåä$xjïDá@xjèÈBì\xjøxxjÿôyjp ä¤xjäp àxjááÿåäüxjäðùWçDí „Wð¸‘ä(yj…Tâ@yjD ä0glyjh*\yjPyjàMêdyjàMâˆyjįä|yjä5^æ|zjááä˜yjåáÔyjäÿåäðyjïá zjø(zjøDzjø`zjÿäLbì˜zjŒÃäŒzjRæ8{jŒ9ä¨zjäŒ9äzjááÿåå{jïDá{jè\‹eÿèd{jÈàäH{jT{jæ âìµQæ |j„¯ät{j䄯°{jááÿåäÌ{jïDáè{jø|jÿô<|j( ä0|j¤ÚeæX|jp¯äL|jTDæt|j’äh|j@ŒPê`¯ä„|jä`¯À|jðø|jöäÜ|jìáýl}j€}jåçäçæááxýâ`L è"â@KâQä˜}jä8éÄ}já~jtGdô:âð}jä8Gdü âtGdæ `~j~jé4~jü:áîä"þ”~jh~j4ÿîœ~j4êþ jÀ äØ~jäÀ jááÿåä0jähEçDáLjøhjø„j脌VøœBìx€j´°ä°jä´°ìjÿìä€jïá$€jèlÍJì@€jèôIì\€jè°"JøLbìÄ€j0“䈀jæ0“´Oâÿå€j”°äÔ€jä”°jÿìä,jïáHjèLbìdjÿä ‚Kìœj|°äjØ^æt‚jÀÄä¬jäÀÄèjááÿåä‚jïDá ‚jè|Jê<‚jøX‚jèLbÿèô„jD°ä„‚j‚jæ˜âÀ‚j(æèÄ„jèâ@ê(æä‚jäà‚j ãá°ƒj˜Räð‚jÀ‚j˜R,ƒjÿèähƒjäXƒjäã‚jì â‚j 䔃j脃jì â‚jðXƒjêìƒj4úäÀƒjæ4ú؃jäâ €ê@ä„j$/äüƒjâ Àƒj$/Ü9Näâ<„jðÂä$„jâüƒjðÂèâd„j`käL„jâ$„j`kè ⌄j hät„jâL„j hèâ´„j¬Ç䜄jâ t„j¬ÇÈBäâÜ„jìâäÄ„j✄jìâð(æäì„j‚jâè…jì9ä…jäì9@…jááÿåä\…jïDáx…jèœBì”…jè\¯Pì°…jè)JìÌ…jèLbø)Jì†j¨Ääø…j¬ïaæ܆jÜ’ä†jäÜ’P†jááÿåäl†jïDሆjèÈB줆jè ˜ìÀ†jÿôl‰jdÄäì†jø†jæ â‡jæPâ8‡jLãè<‰jèâpêLãä‡jäX‡j ãá(ˆj˜Räh‡j8‡j˜R¤‡jÿèäà‡jäЇjäã‡jì â‡j ä ˆjèü‡jì â‡jðЇjêdˆj°]ä8ˆjæ°]Pˆjä(â (â0USä䌈jäœ ätˆjâ8ˆjäœ è$â´ˆjHh䜈jâtˆjHhè â܈jˆWäĈj✈jˆWèâ‰jÔ¡ äìˆjâĈjÔ¡ èâ,‰jøVä‰jâ ìˆjøV,ÅJäâT‰j̉ ä<‰jâ ‰j̉ ,ÇJìLãäd‰j‡jâ Šj¨ ä|‰jä¨ ¸‰jááÿåäÔ‰jïDáð‰jèì¥Kÿè8Šjá°äŠj(Šjæ â¨$_æPŠj ÄäHŠjXÃT⸊j´Ãä`Šjä´ÃœŠjÿììLRî˜*äÈŠjä˜*‹jÿìä ‹jäœBÿæL‹j Åä HgЋj( ä\‹jä( ˜‹jÿìä´‹jïíœBìì‹jáÅäà‹j(SæŒj4+äü‹jœ>RæÄŒj,±äŒjä,±TŒjááÿåäpŒjïDጌjèT#K쨌jÿä0ÇQìHj´áäÔŒjä´ájááÿåä,jïDíì¥KìŽj+äXjä+”jááÿåä°jäÌýQçDáÌjè ˜êèjèœBÿèøŽjL äŽjäL PŽjááÿåälŽjïDሎjèœB줎jèœBìÀŽjøÜŽjè¨sMø»Tìjð°äj<-Oê:ä$jä:`jÿìä|jò˜jèX%WêÄjè´jì âtÀ\æàjèœBøØfìÔj Æä jä ÆHjäÿåädjïá€jøœjèœBì¸jÿôt‘j8âääjä8â ‘jÿìä<‘jïáX‘jè˜ÝKøÔDì’jh²ä„‘jäh²À‘jÿìäÜ‘jïáø‘jèøEJøPÏIì,’jP²ä$’jBJâH’j$âä<’j8oæd’jŒ äX’j¸vSç“jd:ät’j€’jæ â’jæä¬’jïáÈ’jè ˜êä’jè ˜ÿèô“jÐÅä“jäÐÅL“jááÿåäh“jïDá„“jèœBì “jè€o_꼓jètºJìØ“jètºJøÜr_ìx”jøáä”jäøá@”jááÿåä\”jïDíHKì<œjèLbìXœjè NìtœjèðJøØfìjÀÆä œjäÀÆÜœjÿìäøœjïí_Pì|jÄ•ä$jäÄ•`jäÿå÷áTžj€ äŒjä€ ÈjÿìääjïâžjèlÍJìžjèôIì8žjè°"JøLbìØžjÜâädžjäÜâ žjÿì伞jïíèž\ìÌŸjD•äèžjäD•$Ÿjááÿåä@ŸjïDá\Ÿjè ˜ìxŸjè ˜ì”Ÿjø°Ÿjÿôl jl,äÜŸjäl, jááÿåä4 jïDáP jèÈBÿè(¡j•ä| j䕸 jááÿåäÔ jïDáð jèÌýQì ¡jè ˜ö˜lbì@¡j  ä8¡j<²Mâ\¡j³äP¡jðC_æl¡jÀ;ä ´X¸¡jD,ä|¡jÌkD,ÐòEð”òEú0,äÈ¡jä0,¢jÿìä ¢jïá<¢jè|JêX¢jè|Jÿæ¼£j ³ä„¢jä ³À¢jááÿåäÜ¢jïDáø¢jèÐyPì£jø0£jøL£jèÜóSìh£jø„£jèLbì £jèLbøLbì\¤jL–äÌ£jäL–¤jÿìä$¤jïá@¤jè1Nÿè¥jãäl¤jx¤jæ ∤jæä¤¤jïáÀ¤jè|Jêܤjøø¤jèœBøœBì0¥j|ãä$¥j(—eæ¦jœ,ä@¥jäœ,|¥jááÿå䘥jïDá´¥jè¬@MìÐ¥jøì¥jÿä|JꌦjÇä¦jäÇT¦jááÿåäp¦jïDíàßQ쨦j –䜦jì“QæH§j <並jä <ô¦jááÿåä§jïDá,§jÿøà•äX§jäà•”§jêä°§jöìœBäãâ $¨j8¨jåçäçæááxýâÁ œBäÎã´á°Ç嘨jŠâµá°Çå$©jŠâ·á°Çå°©jŠâ·á°Çå<ªjô(,1ïÿäóáÿÿÿÿç õâ ÿì(,0ïÿäóãÿÿÿâ ÿÿÿáÎááÿÿïÿåâ üáœBähªjü:áØfäÎý4«jؖ䤪j䨖àªjááÿåäüªjïDá«jèhEø|PêÔ«j$=äD«jä$=€«jÿì䜫jïḫjèÜñNø(ïN쬬j¨–ää«j䨖 ¬jÿìä<¬jïáX¬jèlÍJìt¬jèôIì¬jè°"JøLb켬jˆÇä Œ-Q”­j|–ä̬jä|–­jÿìä$­jïá@­jèlÍJì\­jèôIìx­jè°"JøLbìl®jP 䤭jäP à­jäÿåäü­jïá®jø4®jè|JêP®jÿä|Jê„®j, ä|®j4ŠRâ ®jü³ä”®jê\¯j\-ä°®jä\-ì®jÿìä¯jïá$¯jø@¯jÿôà¯jð<äl¯jäð<¨¯jááÿåäįjïDíÈBìH°já-äð¯jå-,°jááÿåì„KUçDád°jè,äX°jê±jÌ,ät°jäÌ,°°jááÿåä̰jïDáè°jèœBì±jèœBì ±jèœBì<±jèØfìX±jøt±jÿô0²j¤<ä ±jä¤<ܱjááÿåäø±jïDá²jèœBøîðÈ ä@²jL²jæ âl¼Næl²j$.ä LÁN ³jØ ä|²jäØ ¸²jÿìäÔ²jïáð²jè¬ÖLø8oì(³jd—ä³j vX欳jÄ ä8³jäÄ t³jááÿåä³jäÈBçDíÈBìijj¤ ä¼³jT¶T‴jô–äÔ³jäô–´jÿìä,´jä ˜êH´jè ˜êd´jè ˜ÿæÌ´jØãä´jÌkØãùEòØøEú<´äÜ´jä<´µjÿìä4µjïáPµjè|Jö|J꘶jдä|µjäд¸µjááÿåäÔµjïDáðµjéBJì ¶jø(¶jøD¶jø`¶jø|¶jÿä8oìp·j¨´ä¨¶j䨴ä¶jÿìå·jïá·jèlÍJì8·jèôIìT·jè°"JøLb윷jÌ匷j€·jô Mê”·jô MâÈ·j°—¸·j¬·jtVbêÀ·jtVbâô·jl ä·jØ·jÈBfêì·jÈBfâ̸jHÈä¸jäHÈ@¸jÿìä\¸jïáx¸jè|J씸jè|Jì°¸jÿäTDìè¸j´åäܸj+^æl¹j.äø¸jä.4¹jäÿåäP¹jïý ºjL ä|¹jäL ¸¹jááÿåäÔ¹jïDáð¹jè4íIø)Jì$ºj0 äºjnQâàºj„>ä4ºjä„>pºjááÿå䌺jïDᨺjèì¥Kìĺjÿäø_ìüºjœ—äðºj4ÏPæ»jD.ä »j@/Jê Èä(»jä Èd»jÿì䀻jï᜻jèî츻jÿôX¼jœæää»jäœæ ¼jÿìä<¼jïíŒHMìܼj„æäh¼j䄿¤¼jááÿåäÀ¼jïDí|Pêô¼j äì¼j€[â½j¸Èä½jtÏTæ,½jð—ä ½jlOTæH½j/ä<½j×Væ`½jÜ—äX½j4¡Pâ|½jè äp½j°µ[昽jØ äŒ½j´æRæ8¾j˜È䨽jä˜Èä½jÿìå¾jïá¾jè¬Kø¬Kì¼¾jð.äH¾jäð.„¾jááÿåä ¾jïDíßPìؾjæä̾já [æô¾j,µäè¾jdáPæ¿jÔ>ä¿jÐÖRæ Àjì´ä ¿jäì´\¿jááÿåäx¿jïDᔿjè|Jê°¿jè|JêÌ¿jè|Jêè¿jè|JìÀjÿä|Jîl ä0Àjäl lÀjÿìäˆÀjïá¤Àjè ˜êÀÀjè ˜ÿæ(Ájt¶äìÀjæt¶œBäÿåtÁjD¶ä8ÁjæD¶œBäÿåÂjˆ˜ä„Áj䈘ÀÁjÿìäÜÁjïáøÁjèxCRø8oì`Âj\@ä$Âjæ\@´OâÿåTÃj° äpÂjä° ¬ÂjÿìäÈÂjïáäÂjè04KíÃjè”}KìÃjø8Ãjè>KøLbìôÃj<@ädÃjä<@ Ãjÿìä¼ÃjïáØÃjè„aøœBìÄj@äÄjàì_æèÄjpÉä ÄjäpÉ\ÄjááÿåäxÄjïDá”Äjè ˜ê°ÄjøÌÄjèLbÿèÅj¶äøÄjá@`æøÅjÜ?äÅjäÜ?PÅjááÿåälÅjïDáˆÅjèœBì¤Åjè\¯PìÀÅj謽LìÜÅjèLbø¬½LìÐÆjl˜äÆjäl˜DÆjááÿåä`ÆjïDá|ÆjèÈBì˜Æjè|Jì´ÆjÿôìÆjTÉäàÆjø†jæàÇj˜äüÆjä˜8ÇjááÿåäTÇjïDápÇjèœBìŒÇjèLbì¨ÇjèLbìÄÇjèLbøLbðD/äðÇjæD/èÿåHÈj€0ä<Èjê”Èj AäXÈjæ A´OâÿåàÈj ä¤Èjæ ´Oâÿå¸Éjð@äðÈjäð@,ÉjÿìäHÉjïádÉjèlÍJì€ÉjèôIìœÉjè°"JøLbìÈÉj40ä ¨wXLÊj0äØÉjä0Êjÿìä0ÊjïíÀé^ìdÊjt ä\ÊjP'RâÊj™ätÊj€Êjæ ât]jæLËj´¶ä Êjä´¶ÜÊjááÿåäøÊjïDáËjè¬@Mì0ËjÿôhËjø/ä\Ëjœ>Ræ@ÌjÔ/äxËjäÔ/´ËjááÿåäÐËjïDáìËjèì¥KìÌjø$ÌjÿäÐ]Rì4Íj™äPÌj䙌Ìjááÿåä¨Ìjäì…KçDáÄÌjøàÌjøüÌjøÍjÿäœBêðÍj˜/äDÍjä˜/€ÍjááÿåäœÍjäÌýQçDá¸Íjè|JêÔÍjèœBÿè ÎjP åÎjäçX꼘äÎj优XÎjÿìätÎjïí|JêÜÎjôèä ÎjæôèœBäÿå(ÏjÄèäìÎjæÄèœBäÿåDÏjÄAä8Ïj¨â_æäÏj äTÏjä Ïjááÿåä¬ÏjïDáÈÏjè„ëIøˆZKì¼ÐjœèäôÏjäœè0ÐjÿìäLÐjïáhÐjèlÍJì„ÐjèôIì Ðjè°"JøLbì”ÑjÀ0äÌÐjäÀ0Ñjááÿåä$ÑjïDá@Ñjè4íIì\ÑjèŒýIìxÑjèOøTDê4Òjá·ä¤Ñjå·àÑjááÿåäüÑjäèQLåDáÒjèœBøèQLêTÓj¨0äDÒjä¨0€ÒjááÿåäœÒjïDáÈÒjè¸Òjì âXòPæäÒjùÓjèHaNêÓjø8ÓjÿôlÓjhèädÓjdáPâðÓjPèä|ÓjäPè¸ÓjááÿåäÔÓjïDíà$KìÈÔj4ÊåÔjä4Ê<ÔjááÿåäXÔjïDátÔjèÈBìÔjè¸3Mê¬ÔjèT#KÿèLÕj”™äØÔjä”™Õjááÿåä0ÕjïDýhÕjx™ä\Õjœ>RæìÕjØ äxÕjäØ ´ÕjááÿåäÐÕjäðùWçDíTšVìãà¶äüÕjø*TæàÖj”·äÖjä”·TÖjÿìäpÖjïáŒÖjè<3]ì¨ÖjèìdWìÄÖjÿô¸×jÔ äðÖjäÔ ,×jÿìäH×jïád×jèlÍJì€×jèôIìœ×jè°"JøLbìØjàéäÈ×jäàéØjÿìä Øjïá<ØjèlÍJìXØjèôIìtØjè°"JøLbì¨ØjКä ØjQjâHÙj¨é䏨jä¨éôØjááÿåäÙjïDá,ÙjèœBøœBìdÙjl·ä XÙj¬bä€Ùj|éätÙjX¤WæœÙjLéäÙjÐVLæÜj˜Êä¬Ùj¸ÙjæPâèÙjì# èìÛjèâ@êì# ä¸ÙjäÚj ãáØÚj˜RäÚjèÙj˜RTÚjÿèäÚjä€Újäã¸Ùjì â¸Ùj ä¼Újè¬Újì â¸Ùjð€ÚjëÛjZ äèÚjæZ èLâ(ÛjÌVäÛjâèÚjÌVèJâPÛj¼Iä8ÛjâÛj¼IèHâŒÛjdÕä`Ûjâ 8ÛjdÕxÛjäâ @ê ä´Ûj¸ÚäœÛjâ`Ûj¸ÚèâÜÛjÔp äÄÛjâœÛjÔp èâÜjô"äìÛjâÄÛjô"ðì# äÜj¸ÙjâHÜj˜šä,Üj8Üjæ ãØ\ædÜjxšäXÜjÈRNætÜj$Bä ìÐLÜjüAä„ÜjœBê,šä Üjä,šÜÜjÿì÷á˜Ýjh1äÝjäh1DÝjÿìä`Ýjïá|ÝjètüTÿèÞjô ä¨Ýjäô äÝjÿìåÞjïí>KìôÞj¸ä,Þjä¸hÞjÿìä„Þjïá ÞjèlÍJì¼ÞjèôIìØÞjè°"JøLbì ßjŒ äßjWâÈßj`¸äßjä`¸XßjááÿåätßjïDáßjèèQLê¬ßjèèQLöLbìäßjH¸äØßj”gSæüßj,ËäôßjĦWâœàjËä àjäËHàjááÿåädàjïDá€àjèÈBødDcêájH ä¬àjäH èàjááÿåäájäÈBçDá ájèÌýQì<ájè|JêXájèÈBìtájèŒVÿè¬ájÈÊä ájÔ*Sê¬Êä¼áj<KæLâjX2äØájäX2âjÿìä0âjïíœBì$ãj¤¹ä\âj䤹˜âjÿìä´âjïáÐâjè(áJììâjèBJìãjèBJøœJìüãjt¹ä4ãjät¹pãjÿìäŒãjïá¨ãjèlÍJìÄãjèôIìàãjè°"JøLbì åjL¹ä äjäL¹HäjááÿåädäjäèQLåDá€äjèœBìœäjø¸äjøÔäjøðäjèœBöèQLê$åjø1äåj$8jâàåjÜêä4åjäÜêpåjááÿåäŒåjïDá¨åjøÄåjè|JÿèøåjÀêäðåj„>Vâ$æjà äæjæjæ â:jæ<æjìCä4æjtZTæ´¸äLæjáöMæhæj|ëä tÀN@çj¤›äxæj䤛´æjÿìäÐæjïáìæjèlÍJìçjèôIì$çjè°"JøLbì\çjdëäPçjì jæPèj Dälçjä D¨çjäÿåäÄçjïáàçjøüçjè|Jêèjø4èjè|JøLbìlèj`ºä`èjáË_æˆèjd›ä|èj¬Ræ0k€Ïä 4U@k„ ä $×JPk`îä ôÖJ(kXÏä`käXÏœkÿìä¸kïáÔkè|øOìðkø kÿäˆZKìÈk$Ïä8kä$Ïtkÿìäkïá¬kèlÍJøœBìàkxžäØkÈ(Oâðk Ïä ðêL kT å käT < kááÿåäX kïDát kè4íIøTDê  k0 ä  kä0 Ü kááÿåäø kïDá kèœBì0 kè¼p-ìL køh kø„ kèœBÿèx k05ä° kä05ì kÿìä kïá$ kè \ì@ kèœBì\ kèLbø8oì k äˆ kä Ä kÿìäà kïáü kèÈBÿè4 kÌíä( kX-æð ká5äD kå5€ kááÿåäœ käœBçDḠkøÔ kÿä ˜îXžå khTWâà kÀHä käÀHT kÿìäp kïጠkø¨ køÄ kè(¹Kÿè€kHäð käH,kÿìäHkïádkèü¸bùBJìkœïä ôLL¬k¬½ä kÄYæ¼kÜžä \@TÌk”½ä X€TPkì5äÜkäì5kááÿåä4kïDí°"JìhkÔ5ä`kÀµ[â¼k¼5äxk„kæä kïáäÂQø°k¨žäÌk䨞kááÿåä$kïDá@kèßPì\kè ˜êxkø”kè ˜ÿêüîäÀk¨$_â”k8IäØkä8Ikäÿåä0kïáLkèàÃbìxkèhkì â@{Rÿâlk( ä¤kä( àkÿìäükïákèlÍJì4kèôIìPkè°"JøLbì|kdðä DIVTk$7äŒkä$7ÈkÿìääkïâkèlÍJìkèôIì8kè°"JøLbì k ädkæ ´Oâÿå¸kLðä°kt®`âÔkIäÈk°Kækðääkäð kááÿåä<kïDáXkèœBìtk謽LìkèLbì¬kèLbìÈkèØfìäkèLbíkÿäìïPì8káIä,kd°Jæ(kÄ6äHkPkââ€kÄ6èøkèâpêÄ6äPkä kãápk˜Rä°k€k˜Rìkÿèä(käkäãPkì âPk äTkèDkì âPkðkê˜küä€kæüèâÀklÊä¨kâ€klÊèâèkP äÐkâ ¨kP 0 Käâk̉ äøkâ Ðk̉ ,ÇJìÄ6ä kPkãk¤6ä8kä¤6tkááÿåäkïDá¬kèì¥KìÈkøäkÿä`ûì¼kŸäkäŸLkááÿåähkïDá„kèœBì kÿäœBêØkŒ6äÌk¸sMæôkÐäèk´09æk,Ðäk8ñVêÀïä ¨=J<k¼7ä0kœðWæXk4JäLk<ÍVætkÜ ähk\»RæÀk¸ ä„kæ¸ ´Oâÿå`k|ÑäÐkä|Ñ kÿìä(kïáDkèèƒNøFKìpkJä L.QHk\¾ä€kä\¾¼kÿìäØkïáôkèlÍJìkèôIì,kè°"JøLbìtkŒŸdkXk;Oêlk;Oâ kÔIä„käÔIÀkááÿåäÜkïDáøkøkè ˜ê0kè ˜êLkè|JêhkèLbì„kèTDøLbì¼k@¾ä°kªNæØk 7äÌkæjæ\käðäèkääð$kááÿåä@kïDýk´ðälkä´ð¨kááÿåäÄkïDáàkèì¥Kìükÿä#^ê0kl7ä(k¤sXâ\k„Iä@kLkæ âPÂ_æˆká¾älkxkæ âè?Qæ´kT ä˜k¤kæ âôÊZê„ðäÄkä„ðákðköôékåçäçæááxýâ4âøt ä¨kä4êdþ kÌ ääkäÌ kÿìä< kïáX kèœBìt kèTDÿè¬ k¼ ä  kœBæÄ kÒä¼ kœðWâH!k òäÔ kä ò!kááÿåä,!kïDí”Pìè!kü7äX!käü7”!kááÿåä°!kïDáÌ!kÿäœBìÀ"kŒ äø!käŒ 4"kÿìäP"kïál"kèlÍJìˆ"kèôIì¤"kè°"JøLbìÜ"k¼ñäÐ"kÔ5^æø"k$ äì"khVdæ#k¬Jä#kšJæ,#khñä$#kø¹`âH#k¬¾ä<#k§eæ`#kÌŸäX#k¼Zâx#kÀ äp#k¤ÚUâ”#k|Jäˆ#k¨$_æ$k¨ ä¤#kä¨ à#kááÿåäü#käœBçDíœBì0$kðÑä($k0¸Qæ˜ ä@$kÌk˜ à Fò¤ Fö8%kÈÒäŒ$käÈÒÈ$kááÿåää$kïDâ%kèÐyPì%kÿä8oê&k¼òäH%kä¼ò„%kÿìä %kïá¼%kèlÍJìØ%kèôIìô%kè°"JøLbìÌ&k$Kä &kä$K\&kÿìäx&kïá”&kè1Nì°&kÿô'k  äÜ&kæ  ´Oâÿå4'k¨ ä('k¼eæP'kH ä D'k#Tä((k$ ä`'kä$ œ'kááÿåä¸'käTDçDáÔ'kè4íIìð'kè)Jì (kèTDÿæ@(kÔJä8(k`•Vâ¨(kp äP(käp Œ(kááÿå÷Dád)k¿ä¸(kä¿ô(kááÿåä)kïDá,)kè|JìH)kè|Jö ˜ì€)k\Òät)kÀk`êä ä)kää Ì)kÿìäè)kïýÀ*kà¿ä*käà¿P*kááÿåäl*kïDáˆ*kè|Pê¤*kÿäLbìÐ*k„Óä Ô%Nà*k ä h_,+k°8äð*kæ°8´OâÿåH+kdÓä<+kLÍTæd+kÄ äX+kàëeæ€+kHÓät+kØfæ˜+khKä+kœ`â°+kTóä¨+kT÷\æ<¿äÀ+kÌ+kæ â0¸Qæ´,kÀÓäì+käÀÓ(,kÿìäD,kïá`,kèlÍJì|,kèôIì˜,kè°"JøLbìÄ,kôä ˆ5^à,k0LäÔ,kê¸-k Läð,kä L,-kááÿåäH-kïDád-kèTDì€-køœ-kèœBøœBìÔ-kÜ äÈ-kìDTæð-kôKää-kt?]æ.kœóå.kh—Pâ.k¨Óä LéS0.kˆ ä(.kTæ|óä@.kä|ó|.kÿìì 9SêÄ/k ä¨.kä ä.kÿìå/kïá/kèœBì8/kèTDìT/køp/kèTDìŒ/kø¨/kèTDÿèà/k ÁäÔ/k â`æœ0k,Ôäð/kä,Ô,0käÿåäH0kïád0kè ¤Jì€0kè ¤Jøü£Jì¸0kÁä¬0kt%NæÈ0ká å HNä0kœ9äØ0k Mç1kðÀäô0k0LTæ1kTôä1kÐWæ41k€¡ä,1káSXâÔ1kÔäD1käÔ€1kááÿåäœ1kïDá¸1kèœBøxXì2kðÓää1käðÓ 2kááÿåä<2kïDáX2kèì¥Kìt2kèà$Kÿæ¬2k8ôä 2k&Mê09ä¼2kê„3kÄ äØ2käÄ 3kÿìä03kïáL3kè\½Mìh3kÿäP¼Qì”4k”Ôä”3kä”ÔÐ3kÿìäì3kïá4kèDÜcì$4kè|Jì@4kø\4kèFKìx4kè|PöØfì°4ká¢ä¤4k$ñdæÌ4kÔôäÀ4kÃfæè4k|ÔäÜ4kðÌLæ5kÌ9äø4k°µ[æ5khÁä5kt§`â85k¼ôä,5k4¬NæT5k”LäH5k„ÛMê< ä Ð 6k˜:ät5kä˜:°5kÿìäÌ5kïáè5kè¸ePø04KìÜ6k¸¢ä6k丢P6kÿìäl6kïáˆ6kèlÍJì¤6kèôIìÀ6kè°"JøLbì˜7kŒÂäì6käŒÂ(7kÿìäD7kïá`7kè¤âTì|7kèðJÿèÄ7kt´7k¨7kLÐMê¼7kLÐMâà7k€¢äÔ7kÁeæü7k\Âä ð7kÌŸPä8kd¢ä 8kÐWæ48kÂä(8kP)VêõäD8käõ€8kááÿåäœ8kïDíœBìt9kÃäÈ8käÃ9kÿìä 9kïá<9kèœBìX9kèœBÿè„9kL£ä |ÁN$:kÈMä”9käÈMÐ9kÿìäì9kïá:kèøEJøLbìÄ:k˜Mä4:kä˜Mp:kÿìäŒ:kïá¨:kèp'Nÿèà:k0£äÔ:kÈ£fæH;kØ:äð:käØ:,;kááÿå÷Dád;kh äX;kt&Væ käœ! P>kÿìäl>kïáˆ>kè0ãQì¤>køÀ>køÜ>køø>kèdKì?kø0?køL?kèÔëQêh?kèÔëQöîQìœ?kPöä”?kØ^â @kNä¬?käNè?kááÿåä@kïDíœBìhAk,öä0@kä,öl@kááÿåäˆ@kïDá¤@kèœBìÀ@kè)JìÜ@kèLbìø@kèLbìAkèØfì0AkèLbìLAkÿäìïPì„AkìMäxAkø©Næ\Bk`;ä”Akä`;ÐAkááÿåäìAkïDáBkèì¥Kì$Bkø@Bkÿä`ûìxBkøõä lBk ˜èŒ äˆBkäŒ ÄBkÿì÷áüBk€NäðBkT bæ Ck÷ä ´jJCk@Öä !M,Ck" ä ¬qPRæ(dkHPädkàZRædkPùä8dkäPùtdkÿìì@ŒPêÜdk($ ä dkÌk($ `$Fò$$FúÅäìdkäÅ(ekðDeköôé¸ekåçäçæááxýâ2âøt äÐekä4êÈþœfk % ä fkä % HfkááÿåädfkïDá€fkÿäšJì¬fkô$ ä ŒX gkPÆä¼fkäPÆøfkÿìägkïá0gkè®UìLgkøhgkèœBì„gkÿôxhk¤>ä°gkä¤>ìgkÿìähkïá$hkèlÍJì@hkèôIì\hkè°"JøLbìlikˆ>äˆhkäˆ>ÄhkááÿåäàhkïDáühkè|Pêikø4ikèœBìPikè|PöØfì jkh ä|ikäh ¸ikÿìäÔikïáðikèejø|PêXjkÔ¦äjkæÔ¦´Oâÿåtjk4Æähjk°NXæjk|úä„jkÔ5^æhkkˆØä jkäˆØÜjkäÿåäøjkïákkø0kkøLkkèxKÿè„kkpØäxkk ßSæ$lkØ$ ä”kkäØ$ ÐkkááÿåäìkkäTDçDálkè4íIøTDìä4lkðê`âhnkXØäLlkXlkæ âhlkæâ˜lkè8nkèâpêählkä¸lkãáˆmk˜RäÈlk˜lk˜Rmkÿèä@mkä0mkäãhlkì âhlk älmkè\mkì âhlkð0mkê°mkáQä˜mkçQèâØmk ÎäÀmkâ ˜mk ÎTDä ãnkèì äèmkâÀmkèì èâ(nk0n änkâ èmk0n TDäâPnkXÕ ä8nkânkXÕ ðä`nkhlkæ\úäxnkä\ú´nkááÿå÷DáànkáÇä ÁNðnkèÆä ljJÈok`§åokä`§äôok@ JâðpkÐ% ä pkäÐ% HpkááÿåädpkïDá€pkè<‡fìœpkø¸pkèœBìÔpkèTDøLbì qkì åqklîUæ¬qkôúäqkäôúXqkááÿåätqkïDáqkèì¥KÿèÈqk$§ä¼qká Næ„rkÔúäØqkäÔúrkááÿåä0rkïDáLrkè,Zêhrkè¼p-ø¼p-ìœrk¤Æä”rkð$Kâã„Æä¬rkÀóUâ¨sk`ÙäÄrkä`Ùáskäÿåäskïá8skøTskèœBìpskøŒskèLbÿè¸sk §ä ¨~Mtk & äÈskæ & ´OâÿåtkœÇä pP´tk€Çä$tkä€Ç`tkááÿåä|tkïDá˜tkè”{NÿèTukxûäÄtkäxûáukááÿåäukïDá8ukèßPøßPìpukLÇäduk¼Wêd ä€ukäd ¼ukÿììŒÿPêðukhüäèuk ÉTâtvk¼Çåvkä¼ÇKì šk4Ýäšk¤âTæøšk ä0škä lškÿì䈚kïᤚkøÀškè ˜ìÜškÿäîì|›kH( ä›käH( D›kááÿåä`›kïDý8œkË䌛käËÈ›kááÿåää›kïDâœkè ˜ìœkè ˜ö ˜ìTœk¼ÿäHœk@‡]æHkáËädœkåË œkááÿå伜kïDáØœkèœBìôœkøkø,kÿôžk ¬äXkä ¬”kááÿåä°kïDáÌkèœBêèkèœBÿêðÜä XKæÌÚkÐäXÚkäДÚkÿìä°Úkïí¤âTìèÚkHäÜÚkÈ^æÛk,YäøÚkh˜Zæ Ûkà! äÛktºJæ\ákбä0ÛkäбlÛkêäÀÛköäˆÛkìá¤Ûkÿô4ÜkpÜkåçäçæááxýâlyè°áÀl8êä„=lä8êÀ=lÿìäÜ=läTDçáø=lèLbì>lèTDø„ÎUìL>l$* ä@>lÌ‚[æh>lPPä\>l ÓUæt?lôéäx>l„>læ â”>læä°>lïáÌ>lè ˜êè>lø?lø ?lø 䘚lä¸> Ôšlÿìäðšlïá ›lèLbøhòcíœl Áä8›lä Át›lÿìä›lïᬛlèlÍJìÈ›lèôIìä›lè°"JøLbìØœlŒ> äœläŒ> LœlÿìähœlïᄜlèlÍJì œlèôI켜lè°"JøLbìlÁôœlèœl ¥Qêüœl ¥Qâl`âä èæO´lxWä$läxW`lááÿåä|lïDá˜lè4íIøTDêžlH> äÄläH> ážlááÿå÷DáØžl¬0 ä,žlä¬0 hžlááÿå䄞lïDá žlø¼žlèôŽRÿèôžlˆ0 äèžlü:VæèŸl˜käŸlä˜k@Ÿlááÿåä\ŸlïDáxŸlèì¥K씟lè|Jê°ŸløÌŸlè¸3Mÿ舠ll0 äøŸläl0 4 lááÿåäP lïDál lè|Jÿè(¡l˜ä˜ lä˜Ô lááÿåäð lïDá ¡lèì¥Kÿèä¡l¤òä8¡lä¤òt¡lááÿåä¡lïDᬡlèPUìÈ¡lÿøŒòäô¡l 1J•lpä ¢läpH¢lÿìäd¢lïí1NìX£l¨lä¢lä¨lÌ¢lÿìäè¢lïá£lèôIKì £lø<£lè8oøLbì„£lˆlt£lh£l\>Zê|£l\>Z✣là1 䔣lÐ[⸣lpl䬣l€R^æä£lˆ1 äÈ£lÔ£læ â¬ylç¤ltóäô£l¨Kdæ ¤l\óä¤lä\óL¤lááÿåäh¤lïDᄤlÿô\¥ld1 ä°¤läd1 ì¤lÿìä¥lïá$¥lè \ì@¥lèœBøLbìü¥l0? äl¥lä0? ¨¥lááÿåäÄ¥lïDáà¥lèPy]ÿè(¦l<1 ä ¦l¦læ âˆbæȦl? ä8¦lä? t¦lááÿåä¦lïDᬦlè àXÿèä¦lôWäئlÔ-Wê˜âäô¦lÌk˜â˜—Fð\—Fö¨l,2 ä@§lä,2 |§lÿì䘧lïá´§lèlÍJìЧlèôIìì§lè°"JøLbìT¨lèÁä¨læèÁ´Oâÿåp¨l´Xäd¨lD[Sæ©l䀨l伨lááÿåäبlïDáô¨lè°"Jø4íIì°©l,mä ©lä,m\©lááÿåäx©lïDᔩlè|Jö<Ð]ìÌ©l8XäÀ©lêPªlÐÁäÜ©läÐÁªlááÿåä4ªläàßQçDí ˜êlªl°óä`ªlÀµ_æ(«l¨Áä|ªlä¨Á¸ªlááÿåäÔªläœBçDáðªlè ˜ê «lÿôô¬lá2 ä8«lD«læât«l äèĬlèâpê ääD«l䔫lãád¬l˜R䤫lt«l˜Rà«lÿèä¬lä ¬läãD«lì âD«l äH¬lè8¬lì âD«lð ¬lꌬl¨n ät¬læ¨n ”ÜIäâ´¬l ê 䜬lât¬l ê èâܬlÀäĬl✬lÀð ääì¬lD«lâ ­lÌä­lä­Kâ­l¸ä¬éSä¼âä,­l€9JæT­lüâäH­lêØ­l<Âäd­lä< ­lááÿåä¼­lïDíhEìx®lø? äè­läø? $®lÿìä@®lïá\®lè8ÙJø8oì®l Â䈮lÔFâ¼®lܬ®l ®lHÙJê´®lHÙJâÌ®lÈä ´rPè®l2 äÜ®l¼[[æ¯lh2 äø®l¯læ â|3bæ,¯ltä$¯lØBæÐâä<¯l¨ºkâp¯l8ÃäT¯l`¯læ âx dæH°l3 䀯lä3 ¼¯läÿåäدlïáô¯lè|Jê°lø,°lÿôX°l¤ä H…[t°lì2 äh°l`ÔWæÀ°lHnä„°læHn´Oâÿåì°lŒܰlаlxüZêä°lxüZâ±lÌÂäü°lœ¶Wæ4±lÄ2 ä±l$±læ â´læÔ±l0näD±lä0n€±lááÿå䜱lïDḱlÿäLbìð±llYää±l,½Y欲lnå²län<²lÿìäX²lïát²lè ˜ê²lè ˜øLbì0³lŒÂä¼²läŒÂø²lááÿåä³lïDíÈB옳l(ä@³lä(|³lááÿå÷Dáijlàm䨳l´³læ âD«læܳlYäÔ³lX'[æXôäì³lð»kæ´lˆõä t3U¤µl0oä´lä0oT´lááÿåäp´lïDጴlèÐyP쨴løÄ´løà´løü´lè ˜êµlè ˜ê4µlèLbìPµlè ˜êlµlè ˜êˆµlè ˜ö ˜êD¶loä´µläoðµlÿìä ¶lïá(¶lèD²Oø„øIìä¶láõäT¶låõ¶lááÿå䬶lïDáȶlè°"Jø¼p-ì¸lØnäô¶läØn0·lááÿåäL·lïDáh·lè Kê„·lø ·lø¼·lè|JêØ·lèœBìô·lèœBøÈ‹aì¹lt@ ä ¸lät@ \¸lááÿåäx¸lïDᔸlø°¸lè Kì̸løè¸lè ˜ÿèÀ¹l¸nä¹lä¸nP¹lááÿåäl¹lïDሹlèÈB줹lè|JÿæܹlZäйlœÕOæø¹lðYäì¹l<ÇkæìºlØYäºläØYDºlááÿåä`ºlïDá|ºlèH ä4m¬^æ 4mŒ%ä,4mäŒ%h4mááÿåä„4mïDí04Kì¼4mÐfä°4mBJæ”5mÑäÌ4mäÑ5mÿìä$5mïá@5mèlÍJì\5mèôIìx5mè°"JøLbì6m$|ä¤5mä$|à5mááÿåäü5mïDíejìd6m`Ñä(6mæ`Ñ´OâÿåÈ6mÜL ät6m€6mæ â6mæä¬6mïíœBìL7m¸L äØ6mä¸L 7mááÿåä07mïDíœBìh7mL ä\7mÌ=aæ„7mÜ> äx7m Kæœ7m<ä”7mTÕMâ´7mh%ä¬7mL¼`âÐ7m|äÄ7m|ÕNæì7mH%äà7mh)Jæà8m4%äü7mä4%88mááÿåäT8mïDáp8mèX_hìŒ8mø¨8møÄ8mÿôœ9mì$äð8mäì$,9mááÿåäH9mïDád9mè|Jê€9mÿäÊOì:mŒ> ä¬9mäŒ> è9mááÿåä:mïDá :mèÌýQì<:mèàiOêX:mèÈBìt:mèŒVÿè¬:m$ä :m˜lbæÈ:mì{ä¼:m@ûQêpL äØ:mäpL ;mááÿåä0;mïDáL;mèœBìh;mè ˜ê„;mè ˜ì ;mèh¡Kì¼;mèh¡KìØ;møô;mømÈä>m¼Sæ˜>m$Òä$>mä$Ò`>mááÿåä|>mïDý°>m¨ä¨>mmâÌ>m¨%äÀ>mŒ«^æø?mðÑäÜ>mäðÑ?mááÿåä4?mäœBçDáP?mè|Jêl?møˆ?mø¤?mèh¡KìÀ?møÜ?mÿäœBì@mˆðä@m,Qæ,@mM ä$@m˜óMâH@mŒ|ä<@mî,? äX@mä,? ”@mðè@möä°@mìáÌ@mÿô\Am„Amåçäçáæááxýâ`0é‡á@Ð0éˆá@âøäœAmä2€èÈAmüéôAm Cmø8é BmLBm¨`Rô:â˜`Räü`Rü ¬BmTBmé€Bmü:áä‡ÿá´BméàBmü:áäˆý4ëýTCmÈäHCm@åMæ€CmÐ&ädCmpCmæ ã \æœCmL}äCmxKæ¬Cmðgä èRÈCmÌgä¼CmÔ9]æàCmÌ? äØCmLSâüCmTÒäðCmx)Jæ¸Dm@ñä Dmä@ñHDmááÿåädDmïDá€DmèÌVOìœDmèh›Tÿè EmœgäÈDmäœgEmááÿåìÈBçDá Fm4}ä0Emä4}lEmááÿåäˆEmïDá¤Emèì¥KìÀEmèÞQìÜEmè¬-bìøEmøFmø0FmøLFmøhFmø„Fmÿô¼FmDM ä°FmœÀPæ\Gm}äÌFmä}Gmááÿåä$GmïDá@GmèœBÿêlgälGmê”GmüñäˆGmìóSæ°Gmx@ ä¤GmÜl[æÜHmH@ äÀGmäH@ üGmÿìäHmïá4Hmè®UìPHmèFKìlHmè|JêˆHmè„ëIì¤Hmè ìIìÀHm褳Uÿè´ImM äìHmäM (ImÿìäDImïá`ImèlÍJì|ImèôIì˜Imè°"JøLbìÐImtM äÄIm¿RæŒJm|~äàImä|~Jmááÿåä8JmäTDçDáTJmè4íIìpJmè)Jÿè¨JmX~äœJmDTæ,KmH~ä¸JmäH~ôJmÿìäKmïý°KmÜäKøLbì QmÔ@ ä`PmäÔ@ œPmÿìä¸PmïáÔPmé/QìðPmè”}Kø ‚Kì(Qmü'äQm˜XQæDQm¬hä8QmìXæ`QmÓäTQm°‰^æ8RmäpQmä¬QmááÿåäÈQmïDáäQmùRmøRmÿäLbì RmÔ~äHRmäÔ~„Rmááÿå÷Dá¼Rm”hä°Rm´]êŒ'äÌRmLbæôRmRêPàäœÏmäPàØÏmÿìäôÏmòÐmèœBøŒÿPì°ÐmØáä<ÐmäØáxÐmááÿåä”ÐmïDíìî[êPÑmÀáäÀÐmäÀáüÐmááÿåäÑmïDá4ÑmÿäìhÑmàM ä`ÑmpÔWâÒmTtäxÑmäTt´ÑmÿìäÐÑmïáìÑmèxCRøX-ìàÒm(7äÒmä(7TÒmÿìäpÒmïáŒÒmè0ãQì¨ÒmèLbìÄÒmèLbø„æQìdÓmXäðÒmäX,ÓmÿìäHÓmïî/Qì€Óm(ŒätÓmt]jæXÔmŒäÓmäŒÌÓmááÿåäèÓmïDáÔmø ÔmèTDì<ÔmÿäØfì¬ÔmL[ ähÔmtÔmæäÔmïáPòXèÙUìÄÔmM ä¼Ômð2VâHÕmˆáäÔÔmäˆáÕmááÿåä,ÕmïDíÈBìÖmtäXÕmät”Õmááÿåä°ÕmïDáÌÕmèì¥KìèÕmÿô ÖmpáäÖm°µ_æ8Öm<[ ä0ÖmDlOâØÖmáäHÖmäá„Ömááÿåä ÖmïDá¼Ömè ˜ö ˜îØ6äèÖmäØ6$×mÿì÷áà×m$äP×mä$Œ×mááÿåä¨×mïDáÄ×mèðJøì´Lìø×m˜âäð×mļRâDØmü[ äØmæü[ ´OâÿåTØm„âå ÚRÙmÜ7ädØmäÜ7 Ømÿì伨mïáØØmè0RKìôØmèLBKø ìIì,ÙmN ä Ùm˜óWæHÙmlä<Ùmè˜Læ`Ùm¤7äXÙmhðIâ|Ùmt7äpÙm$Baæ¨ÙmâäŒÙm˜Ùmæ âdÌmæÄÙm(uä¸Ùm¸biæÜÙm´ŒäÔÙm dâøÙmuäìÙmXQbæÚmà[ äÚm‡jæÐÚmØtä$ÚmäØt`Úmááÿåä|ÚmïDá˜ÚmèÌýQì´Úmè ˜ÿìdŒäàÚm ˜æ¨ÛmÔN äüÚmäÔN 8ÛmÿìäTÛmïápÛmè¤_MìŒÛmè Nÿè€Üm|8ä¸Ûmä|8ôÛmÿìäÜmïá,ÜmèlÍJìHÜmèôIìdÜmè°"JøLbì Ým`8äÜmä`8ÌÜmááÿåäèÜmäÌ©NçDáÝmè ˜öÔ?[ì8Ým¤N ä0Ým4Baâ,ÞmxäHÝmäx„Ýmááÿåä ÝmïDá¼ÝmøØÝmèTDìôÝmèœBìÞmèPÏIøØfìHÞmðä<Þm×Væßm|N äXÞmä|N ”Þmááÿåä°ÞmïDáÌÞmèÈBìèÞmè|Jÿè ßmLäßmD¯aæ¼àmL\ ä0ßmäL\ lßmááÿåäˆßmïDá¤ßmèì¥KìÀßmøÜßmøøßmøàmø0àmèì¥KìLàmøhàmø„àmø àmÿä4ùZì âmlN äÌàmälN ámááÿåä$ámïDá@ámèì¥Kì\ámøxámø”ámø°ámøÌámøèámøâmÿô8âmˆuä0âmtòhâTâmLN äHâmêpâmìŒädâmÐÑLæŒâmlä€âm°vLê 8äœâmæ 8Øâmäÿå áêãÄãm¬Žäüâm䬎8ãmÿìäTãmïápãmèÈ*]ìŒãmè|Pê¨ãmÿäô6UìämŽäÔãm掴Oâÿå äm¸\ ä ìpP0åm89ä0ämä89lämááÿåäˆämïDá¤ämøÀämè ˜êÜämè ˜êøämøåmèœBøšTìLåm9ä@åm8QXædåm \ ä\åmøÚNâ€åmlãätåmÔ­Kê<ãäåmêtæmœää¬åmäœäèåmÿìäæmïá æmèlÍJì<æmèôIìXæmè°"JøLbì„æm”ä (2K$çmd䔿mädÐæmÿìäìæmïáçmèÌHNø¸3MêÄçm<ä4çmä<pçmÿìäŒçmïá¨çmè˜QÿèÜçm„ääÔçm(†^â`èm äìçmä (èmäÿåäDèmïítNì|èm väpèm@Tæ˜èmìuäŒèm`MSæémlO ä¨èmälO äèmÿìåémäpØPçí ˜êôémüä,émäühémááÿåä„émïDá émèÈBì¼émè|JìØémÿôêm|äêmPqOæ,êm<ää êm¸ëLæHêm4O ä<êmœBêØŽäXêmæØŽèÿåˆëm^ ä¤êmä^ àêmÿìäüêmïáëmèx[ì4ëmèœBìPëmølëmèœBøLbìÔëmÈä˜ëmæÈ´Oâÿå¬ìmx:ääëmäx: ìmÿìä<ìmïáXìmèlÍJìtìmèôIììmè°"JøLbìøìm(ä¼ìmæ(´Oâÿåím¬äímœsSâÌímPvä ímäPv\ímäÿåäxímïá”ímø°ímè ˜øLbìÜímä 8ëL´îmD:äìímäD:(îmááÿåäDîmä„gSåDá`îmèœBì|îmèèQLê˜îmè„gSöLbìÌîm:äÄîmÌEaâˆïmü9äÜîmäü9ïmááÿåä4ïmïDáPïmè¸3Mìlïmÿô´ðmÔä˜ïmäÔÔïmááÿåäðïmïDá ðmèÈBì(ðmèÈBìDðmø`ðmø|ðmø˜ðmÿøåäÄðm¨Xâ¤ñmäÜðmäñmÿìä4ñmïáPñmèlÍJìlñmèôIìˆñmè°"JøLbì|òmx;ä´ñmäx;ðñmÿìä òmïá(òmèlÍJìDòmèôIì`òmè°"JøLbìŒòmP ä _€ómøväœòmäøvØòmÿìäôòmïáómèDÜcì,ómè|JìHómèFKìdómè|PöØfìómøO ä D>ThômL;ä ómäL;ÜómÿìäøómïáômèlÍJì0ômèôIìLômè°"JøLbì@õmèäxômäè´ômÿìäÐômïáìômèlÍJìõmèôIì$õmè°"JøLbìPõm4;ä üoP ömÐä`õmäМõmááÿåä¸õmïDáÔõmè4íIìðõmè)Jÿè(öm°ä öm„gTä¬ömÐvä8ömäÐvtömááÿåäömïDíèQLêL÷mÄO ä¼ömäÄO øömÿìä÷mïá0÷mÿôì÷m¬vä\÷mä¬v˜÷mÿìä´÷mïáÐ÷mè ˜øLbìømœväü÷m¸]gæåäømäåPømÿìälømïí ˜ê˜øm|<ä eP´ømÄå䍸mL—LæÐøm<äÄømüASæúmœåäàømäœåùmááÿåä8ùmäèQLåDáTùmøpùmè KìŒùmø¨ùmè„$`ìÄùmè´5Rìàùmèø…Qìüùmèø…Qøì hì0úm¼ä(úm@¿mâLúm|åä@úmáÁVæ”ûmX^ ä\úmäX^ ˜úmááÿåä´úmïDáÐúmøìúmøûmè|Jê$ûmø@ûmè ˜ì\ûmøxûmè ˜öîð´ä¤ûmàÚVâ¼ûmèåä ˜ŽPxümäÌûmäümÿìä$ümïá@ümè¤PJì\ümèÌ“Jøø«Sì4ýmÈ^ äˆümäÈ^ ÄümÿìäàümïáüümèLbìýmÿåBJìÔýmdäDýmäd€ýmÿìäœýmïá¸ýmè|øOø Nì¬þmääýmä þmÿìä<þmïáXþmèlÍJìtþmèôIìþmè°"JøLbìÈþmÔ‘ä¼þml0Xæôÿm¬‘äØþm䬑ÿmááÿåä0ÿmïDáLÿmè Kêhÿmø„ÿmø ÿmè|Jê¼ÿmèœBìØÿmèœBøLbìnÜ<än0†aæxnx‘ä näx‘\nááÿåìÈBçDá”nLäˆnXæn°^ ä¤nä°^ ànááÿåäünïDíì¥KðÄ<ä(n¿TæPnÀ=äDnXÝMæÔn=ä`nä=œnÿìä¸nïí¤PJìnÐxäänäÐx nÿìä<nïáXnè`xOìtnÿô¬nhä n¨~mæPn¤xä¼nÈnæâønˆµè nèâpꈵäÈnänãáèn˜Rä(nøn˜Rdnÿèä nänäãÈnì âÈn äÌnè¼nì âÈnðnên Þ äønæ Þ |Jäâ8npyä nâ ønpyßP숵äHnÈnâhn¨’ä`n”^Nâ€n(æäxn‚jânQ änäQ ÌnááÿåäènïDíœBì nän˜¬Qæ<ndxä0n¸Í`æÀnPxäLnäPxˆnááÿåä¤nïDíì¥KìÜn`=äÐn|“Ræn´P äìnønæ âtòhæànÌänäÌTnááÿåäpnïDáŒnèPUì¨nøÄnÿäœBìünä^ äðnà \ê=ä nè?Qæœn çä(nä çdnááÿåä€nïDíDA\ê<nüä¬näüènááÿåänïDá nèšJøÔDìLnøæä tIOhntQ ä\nüHVæ„nÄäxnàëeæ°nHyä”n næ âÜ}QæP nÔäÀnäÔünááÿåä nïDá4 nè4íIøTDêl nœä ` n¼bä´ nTQ ä| näTQ ¸ nááÿåäÔ nïDáð nø nè ˜ê( nèTDêD nø` nø| nè˜Ùmì˜ nèœBøLbìÐ nTäÄ nQdæì n>äà nLZæÄ n(“äü nä(“8 nááÿåäT nïDáp nøŒ nè¼p-ì¨ nÿäØfìH nØæäÔ n䨿 nááÿåä, nïDíÈBìd n¬æäX n°V`æ nhæät nähæ° nááÿåäÌ nïDáè nè|Jö|Jê nè=ä n Tâ, n8ä déSD nyä< n,ðMæœäT näœ nÿìä¬ näœBêÈ nèœBìä nèœBÿæ„n¸zänä¸zLnááÿåähnïDí„ëIì@n,` ä”nä,` Ðnÿìäìnïánè‡Rì$nèLbøLbì\nèQ äPn|0Xæxn\äln„Næˆn<ä 4!M nLzä˜nüASâ¼nzä°n| mæÔnzäÌnįYâðnDään$Xæ nà_ ån‡jæÈn˜yänä˜yXnááÿåätnïDánèÌýQì¬nè|JÿìäØnänÿìä0nä ˜çáLnè ˜ìhnÿô@n\R ä”nä\R ÐnÿìäìnïánèœBì$nÿäœBìXnøäPn4µ\â„nDètnhn8!Lê|n8!Lâ\nx>ä”näx>ÐnÿìäìnïánèŒHMì$nè¸3Mê@nètLMÿètn {älnäHnæà>œBäÿå°n`a  n”n¨Õ[ê¨n¨Õ[âÌnpäÀn¼eæènR äÜn¸~mæPnPäønäP4nááÿå÷Dáhnôèä`n¼bâ„n|R äxn[æ nHa ä”n$Û`æ$nà{ä°näà{ìnááÿåänäÜ9NçDí ˜êPn0ä4n@næ â,ÇJæln¼èä`nÀk`êL“ä|nê(n$?ä˜nä$?Ônÿìäðnïá nè´shøX-ínðä8näðtnÿìänïá¬nèlÍJìÈnèôIìänè°"JøLbì nÄänäÄLnÿìähnïá„nè8ÆKøBJìÌn¼n°nЦXêÄnЦXâ n”äÜnæ”´Oâÿåð nÄéä( näÄéd nÿìä€ nïᜠnèlÍJì¸ nèôIìÔ nè°"JøLbìÈ!nÈå!näÈYì¸(nøÔ(nè|JøLbìX)nPb å)näPb <)nááÿåìÈBçDát)näS äh)nh^mæ0*n€ä„)nä€À)nááÿåäÜ)nïDáø)nè ˜ê*nÿäœBìL*nøa ä@*nH6JêÀ?ä\*nÌkÀ?dHò(HöŒ+nh•ä¨*näh•ä*nÿìå+nïá+nè$ÓIì8+nè$ÓIìT+nèTìp+nèÛIøÛIì,,nH•äœ+näH•Ø+nÿìäô+nïá,nè$ÓIøTìè,náAä<,nåAx,nÿìä”,nïá°,nè|1VìÌ,nÿä LNí-n„äø,np„UâH.nÔ@ä-näÔ@L-nááÿåäh-nïDá„-nèœBì -nèTDê¼-nøØ-nøô-nø.nø,.nèLbøØfêd.n\ëäX.n<íVæn¨ëäŒ=nä¨ëÈ=nááÿåää=nïDâ>nèœBì>nèLbøœBðdAäH>nT>næ âàDUæ?n0 ät>nä0 °>nÿìäÌ>nïáè>nÿäœBì ?n°ìä?nP¼QæWêZ ä€}n€‹`â´~n¬ä˜}nä¬Ô}nÿìäð}nïá ~nè ˜ê(~nè ˜êD~nè ˜ì`~nø|~nè¼p-ì˜~nÿäLbì8náJäÄ~nåJánááÿåänïDíhEì„nèŸäHnæèŸœBäÿåÐn¸Ÿä”n渟œBäÿåp€n„äànä„€nÿìä8€nïáT€nèÌHNøä6Mìô€nm 䀀näm ¼€nÿì䨀nïî/QìntŸäná›Læ,n˜Z ä n4íIæDnàl äKí½nè”}Kø ‚K츽nT&ä,½n8½næ âH½næäd½nïွnè ˜êœ½nèŒJVøœBìÔ½n(OäȽn°îcæð½nðNää½n eæ¾nxå¾n@¦nâ4¾nÀ¤ä¾n$¾næ â¼–_êÀNľnD¾näÀN€¾nâÿè䜾n¸¾nëíœBø h¿n̾näÀN¿nâÿèä$¿n\¿nëá@¿nèœBø å?úp¿nä ÀN¬¿nî ÀnöäÈ¿náÀnèáä¿nèœBøœBø€Àn¨Ànåçäçæááxýâ 7œBäoá@á 7œBäpá@ázâ¤é ìDÁnD` äÐÀnäD` Ánÿìä(ÁnäÈBçíXûcì\Án¦äTÁnŒ$\â4Ânðs älÁnäðs ¨ÁnÿìäÄÁnïáàÁnèlÍJìüÁnèôIìÂnè°"JøLbìDÂnÐs ä RO`Ânü_ äTÂn˜¡YæxÂn°s äpÂnKiâÂnˆs äˆÂn€±Sâ¨Ânps ä ÂnÈ­[âÄÂnÜ_ ä¸Ân€u\æàÂnü&äÔÂnpíkæüÂnüäðÂn¼œQæœÃnää ÃnääHÃnááÿåädÃnäÜ9NçDá€ÃnèÌýQø|Jê Än$¥ä¬Ãnä$¥èÃnÿìäÄnïÿáPO¤Än0ÄnäPOlÄnâÿèäˆÄnïý HÅn¬ÄnäPOèÄnâÿèä Ån<ÅnœBçá Ånÿä å?úPÅnä POŒÅnîìÅnöä ¨ÅnàÅnœBäáÄÅnÿäœBø`ÆnˆÆnåçäçæááxýâ 7èjá@á¸ÇœBäká@uâ¤é ä ÆnäáœBäÌÆnü:áØfäký´Çn'äÇnä'DÇnÿìä`Çnïá|ÇnèœBì˜ÇnèTDÿèàÈn\øäÄÇnä\øáÈnÿìäÈnïá8ÈnèœBìTÈnèTDìpÈnøŒÈnèTDì¨ÈnøÄÈnèTDÿèüÈnx'äðÈn$¿NæÔÉn ` ä Énä ` HÉnÿìädÉnïá€ÉnèlÍJìœÉnèôIì¸Énè°"JøLbìtÊnt` ääÉnät` Ênÿìä<ÊnïáXÊnèèÍKøX-ìËnä„ÊnäÀÊnÿìäÜÊnïáøÊnè˜ÝKøX-ì$Ën„t ä øTPÌndt ä4Ënädt pËnááÿåäŒËnïDá¨Ënè KìÄËnè8oìàËnè KìüËnèœBìÌnèÃfì4Ìnÿä KìlÌn¬Oä`Ìn$¶SæˆÌnOä|Ìn¬[[ê$øä˜Ìnöbâ@ÍnØøä°Ìn䨸ìÌnÿìäÍnïá$ÍnèœBÿè\Ínpa äPÍnêxÍn8(älÍnàÃbæ”Ín€ŽäˆÍnàMæ¤ÎnlPä¤ÍnälPàÍnÿìäüÍnïáÎnèðJì4Înè|JêPÎnølÎnøˆÎnÿäÓIì8ÏnTa (Ïn´ÎnÀÎnæäðÎnTa øìTa äÀÎnäÏnãåTa ä ÏnÀÎnæ0ÏnÀÎnâ¼Ïn(a äHÏnä(a „Ïnÿìä Ïnïí;OìØÏn”äÌÏnT[SæôÏnHPäèÏn¼bæÐnø'äÐnÜÖQæ,Ðn¤øä ÐnØL_ê¦ä<Ðnä¦xÐnááÿåä”ÐnïDá°Ðnèì¥KìÌÐnÿäPWíÑn¤a äøÐnXÝMâÑnôŽäÑnìÊbæ,ÒnlQä,ÑnälQhÑnÿìä„Ñnïá ÑnèxCRì¼Ñnè|JìØÑnè|JìôÑnèBJìÒnèBJøBJì<Ònœu ä œ®JLÒnŒ(ä Ü–QdÒnx(ä\ÒnLQæè¦ätÒn˜ KâŒÒnÔ)ä Ø×WdÓn¤)äœÒnä¤)ØÒnÿìäôÒnïáÓnèlÍJì,ÓnèôIìHÓnè°"JøLbì<Ôn¨ätÓn䨰ÓnÿìäÌÓnïáèÓnèlÍJìÔnèôIì Ônè°"JøLbìˆÔnè§äLÔnæè§´Oâÿå(Õnàä˜ÔnäàÔÔnÿìäðÔnïá Õn蔀MÿéÖn¸ä8Õnä¸tÕnÿìäÕnïá¬ÕnèlÍJìÈÕnèôIìäÕnè°"JøLbìLÖnœäÖn朴Oâÿå$×n¸ä\Ön丘Önÿìä´ÖnïáÐÖnèlÍJììÖnèôIì×nè°"JøLbìP×n¸§ä4×n@×næ â°ïbæ`×nd)ä€lUà|×nÐùäp×nàuWæ¨×n)äŒ×n˜×næ âpøSæ¸×nÐu ä 0pM Øn äÈ×nä Ønááÿå÷Dá<Øn°ùä0Øn¸šWæXØnœ§äLØn°“næpØn§ähØn¼‹Wâ,Ùnx䀨näx¼Ønááÿå䨨nïDáôØnèœBìÙnèØføîìÌÙnXä<ÙnäXxÙnááÿåä”ÙnïDá°ÙnèœBøLbìèÙn¤QäÜÙn¸¯Kê°u äøÙnä°u 4ÚnÿìäPÚnþ@ŒPìðÚnÌä|Únä̸ÚnááÿåäÔÚnïDíhEìÛnl*åÛnäl*<ÛnÿìäXÛnïátÛnèè4Lø ìIì0Ün*ä Ûnä*ÜÛnááÿåäøÛnïDáÜnè„ëIøˆZKì|Ün°ä@Ünæ°´OâÿåÈÜn4äŒÜnæ4´OâÿåäÜnäØÜnê¼Ýn”äôÜnä”0ÝnááÿåäLÝnïDáhÝnø„Ýnø ÝnèœBø¤9Wì\ÞnDRäÌÝnäDRÞnááÿåä$ÞnïDá@Þnè°"JøPÏIìüÞn8älÞnä8¨ÞnááÿåäÄÞnïDáàÞnè|JøLbìœßnPv ä ßnäPv HßnááÿåädßnïDá€ßnè|Jö|Jê<àn,úä¬ßnä,úèßnááÿåäànïDá ànè,Zöø…QìXànü)äLànè?Qê„b ähànxE^æàn4ûä„ànÜóSæhán©ä ànä©ÜànÿìäøànïáánèlÍJì0ánèôIìLánè°"JøLbì„án¼*äxán ’bæ\ânLSä”ánäLSÐánÿìäìánïáânèlÍJì$ânèôIì@ânè°"JøLbìlânh©ä ÄÁN ãnðv ä|ânäðv ¸ânÿìäÔânïáðânèÔ²Xø˜ÝKìXãn ‘äãnæ ‘´Oâÿåän Sähãnä S¤ãnÿìäÀãnïáÜãnè>Kìøãnÿôìän¼úä$änä¼ú`änÿìä|änïá˜änèlÍJì´änèôIìÐänè°"JøLbìüänlc ä ëLœån,©ä ånä,©HånááÿåädånäœBçDá€ånÿä|Jêæn‘ä¬ånä‘èånááÿåäænïDá ænè|Jê<ænè|JêXænè|Jìtænèîÿè¬ænŒúä æn`#]æÈænðR伿nìcæ„çnÈR䨿näÈRçnááÿåä0çnïDáLçnèœBìhçnèœBÿèœçn¤¨ä”çnPÂ_âèçnpä¬çnÌkp$ðHòèïHölènc äøçnäc 4ènÿìäPènþœBðÜv ä|ènÌkÜv  ïHòdïHöén ’äÈènä ’énÿìä énïá<énè\½MìXénèÈBìténÿäœBìÜénDä énæDœBäÿå(ênäìénæœBäÿæënä‘ä8ênää‘tênÿìäênïá¬ênèlÍJìÈênèôIìäênè°"JøLbì ënád äënåd Lënÿìähënïá„ënè8ÆKøØÍKìxìnüSä°ënäüSìënÿìäìnïá$ìnèlÍJì@ìnèôIì\ìnè°"JøLbì”ìn¤w äˆìn¬Sæ°ìnèc ä¤ìn¸ePæˆínÜSäÀìnäÜSüìnÿìäínïá4ínèlÍJìPínèôIìlínè°"JøLbì¤ínªä˜ínLCZæÀínlªä´ínpFZæÐínÈ‘ä 8lUèín,+äàínDíIâÜîn¬‘äøín䬑4înááÿåäPînïDálînè ˜êˆînø¤înèÌ9NìÀînèÌ9Nÿèôîn Säìîn°“nâ\ïnlw äïnälw @ïnááÿåìÜ9NçDáàïn€‘älïn䀑¨ïnááÿåäÄïnïDíÈBðÔäðïnPkæ`ñnàTä ðnäàTHðnÿìädðnïá€ðnèœBìœðnèTDì¸ðnøÔðnèTDìððnø ñnèTDì(ñnøDñnèTDÿèònÔûäpñnäÔû¬ñnááÿåäÈñnïDáäñnèðJíònè¼p-ø8oìhònÀTä,ònæÀT´Oâÿå´òn˜Täxònæ˜T´OâÿåÄònXTä ¯JÔòn$«ä ܪJðòn°d ääònÈ­[æón”d åón ónæ â„ÐNæ¼ónìªä,ónäìªhónááÿåä„ónäì…KçDá ónèÌýQø|JêØón´äÌón,ï_æôónìw äèón0Åfæ”ônÐw äônäÐw @ônááÿåä\ônïDáxônèÌýQøXÿQì°ônÀw ä¤ônîê,d äÀônü3SâhõnD“äØônäD“õnÿìä0õnä\½MçáLõnè ˜ö ˜êön$“äxõnä$“´õnááÿåäÐõnïDáìõnèPÏIö|JìàönLäönäLTönÿìäpönïáŒönèLðgì¨önøÄönèœBøLbì,÷nHUäðönæHUœBäÿåx÷nUä<÷næUœBäÿåPøn<üäˆ÷nä<üÄ÷nÿìäà÷nïáü÷nèlÍJìønèôIì4ønè°"JøLbì(ùnüä`ønäüœønÿì䏸nïáÔønèlÍJìðønèôIì ùnè°"JøLbíún ,ä8ùnä ,tùnÿìäùnïá¬ùnèlÍJìÈùnèôIìäùnè°"JøLbìúnì+äún\ÍTâ4únìx ä(úntRæDúnUä ,¯J\únì’äTún(+câlún4ä qPˆúnÐ’ä|ún°Zæ”ûnÄx ä˜ún¤únæ â´únæäÐúnïáìúnøûnø$ûnè´5Rì@ûnè´5Rì\ûnèTDìxûnÿäLbì°ûnÐä¤ûn¤RæÌûnôûäÀûn]êôTäÜûnäôTünðlünöä4ünìäPünè|Pö|Pêàünýnåçäçæááxýâxc|PâÆá @¸Œ |PâÇá@Æâä ýnä2€èLýnüéxýnü8é ¤ýnLoàýnô:âÐýnä4þnü âàýnæäüýnìäþnè|Pö|Pêä˜Uàýnäêpþnöäþn ÿnåçäçæááxýâxc|PâÁá @¸Œ |PâÂá@Áâä$ÿnä8é PÿnŒÿnÈ«bô:â|ÿn䌫bü âÈ«bæìÿn”ÿnPÏIäÀÿnü: ®bäÁÿá ôÿnPÏIä oü: ®bäÂý¬oToPÏIä€oü: ®bäÆÿá ´oPÏIäàoü: ®bäÇýpof äoäf Xoÿìätoïáoè@{Rì¬oè|JêÈoøäoèTDíoøoèTDì8oøToÿô€oàe ä DÀNto´e äoä´e Ìoÿìäèoïáoèä Mì oø<oøXoè|P÷BJì oì,o„oÀLê˜oÀLâ¸o¬y ä°oÜÄUâoŒy äÈoäŒy oááÿåä oïDá<oøXoèLbìtoÿäLbì¬o ,ä ouPæ0oDy ä¼oäDy øoááÿåäoïDíTDìÐoÄUä@oäÄU|oááÿåä˜oïBá´oè|Jø|Jêèo,y äàoÐ"_âÜoh,äøoäh,4oááÿåäPoïDáloèœBìˆoèœBê¤oèœBìÀoÿäLbììo˜Uä4þnä˜e äüo SfæŒo”Väoä”VToÿìäpoïíœBì¤o¬f äœoˆîOâ`oÜüä´oäÜüðoÿìä oäTDçá(oèLbìDoèTDøà›Jì¬oPVäpoæPVœBäÿå¼oà«ä dÁL\ oVäÌoäV oÿìä$ oïá@ oèTýaÿèx oÐäl oˆ7Wæ” odf äˆ o¨àVæl oôy ä¤ oäôy à oááÿåäü oïDá oèì¥Kì4 oè|JêP oèÄUÿè( oáVä| oåV¸ oááÿåäÔ oäœBçDáð oø oÿøœä8 oê` o|g äT o (Pæ8 o@g äp oä@g ¬ oÿìäÈ oïáä oèlÍJí oèôIì oè°"JøLbìP oü“äH oð*d✠o´.ä` oæ´.´Oâÿåt o„.ä¬ oä„.è oÿìä oïá oéSì< oèTDêX oÿäLbìŒ o”¬ä„ oì&OâHo|¬äœ oä|¬Ø oááÿåäô oäÜ9NçDáoèÌýQì,oè ˜ÿæXo€z ä xMøo\¬ähoä\¬¤oÿìäÀoïáÜoÿä¬KìoýäoDìOâ,o.ä o’eæ°oáýä<oåýxoááÿåä”oäÜ9NçDíÜ9Nìˆoì-äÀoäì-üoááÿåäoä\»[çDá4oè|JêPoøloÿô(oÈ-ä˜oäÈ-Ôoááÿåäðoä\½MçDá oè\½MÿèTo<¬ä8oDoæ âŒTæpo”-ädoàAlæŒo g ä€oŒëRêx-äœo<-OâoÔ”ä´oäÔ”ðoÿìä oïá(oèœBìDoèTDì`oø|oèTDì˜oø´oèTDìÐoøìoèTDÿèŒo¨Wäoä¨WToÿìäpoïíà%]ìHo´”äœoä´”ØoÿìäôoïáoèLbì,oÿäà›Jìdod/äXotüTætoWä ìeJo ­ä„oä ­ÀoááÿåäÜoïDáøoè4íIøTDê0oD/ä$ox7WæàoLWä@oäLW|oÿìì˜oçá â¨oæäÄoïíœBìœohýäðoähý,oÿìäHoä¬Kçádoø€oè ˜ÿæXoÜz ä¬oäÜz èoááÿåäoïDá oèÌýQì<oè|Jö¬Zìto0WähoHî]æLopä„oäpÀoááÿåäÜoïDáøoèØfìoèØfì0oèh¡KÿèÐoä¬ä\oä䬘oááÿåä´oïDíœBìToXäàoäXoááÿåä8oïDíœBìØoĬädoäĬ oÿìä¼oþœBìðoô.äèo°+Jæ°¬åoä°¬<oÿìäXoïátoøoè ˜öKêLoh ä¼oäh øoÿìäoïá0oèüÝJøX-ììoìWä\oäìW˜oÿìä´oïáÐoèøEJøœBìüoÄä M¸o´g ä oä´g Hoÿìädoïá€oèœBìœoèœBøîð¤äÈoä¤oááÿåä oïDá<oèœBìXoÿôoôh ä„oäôh ÀoááÿåäÜoïDáøoè|Jö$mJììoøä$oäø`oÿìä|oïá˜oèlÍJì´oèôIìÐoè°"JøLbìŒo¬h äüoä¬h 8oááÿåäToïDápoÿäØfì¨o XäœoÌBnæÄoá| ä¸o€~\æÜoÈ/äÔoÜOâøoD•äìodDcæ oÐ{ ä o¸3Mæ@ oøýä$ o0 oæ âŒc_æ\ o¨{ äP o\-êth äl oäth ¨ oÿìäÄ oþ vLìü oü•äð oœgQæœ!o,} ä !oä,} H!oááÿåäd!oïDá€!oÿäTDìt"oð| ä¬!oäð| è!oÿìä"oïá "oèlÍJì<"oèôIìX"oè°"JøLbì#oÿä„"oäÿÀ"oÿìäÜ"oïáø"oè8ÙJø8oìì#o$1ä$#oä$1`#oÿìä|#oïá˜#oèlÍJì´#oèôIìÐ#oè°"JøLbì$oà•äü#oÌHNæà$oÌ| ä$oäÌ| T$oÿìäp$oïáŒ$oè\UKì¨$oøÄ$oèˆZKøLbì,%o1äð$oæ1´OâÿåD%oìþä<%o)Zâ`%odi äT%oœBæ|%o¸0äp%oèþWæ˜%oØþäŒ%oÀµ[æ´%o°| ä¨%oàiOæT&o¸þäÄ%oä¸þá&oááÿåä&oïDá8&oèì¥KøLíaìl&ox0äd&opˆOâ|'oh| ä|&oäh| ¸&oááÿåäÔ&oïDáð&oèœBì 'oè|Jê('oè|JêD'oø`'oèœBÿè(oˆþäŒ'oäˆþÈ'oááÿåää'oïDâ(oÿä ˜ê¼(o40ä,(oä40h(oááÿåä„(oïDá (oèœBøôhìè(od®äÌ(oØ(oæ âHh^æ)o\•äø(oì3Sæ )oL®ä)oH0Jê ä0)oä l)oÿìäˆ)oä ˜çá¤)oøÀ)oè ˜ÿè$+o$Zäì)oä$Z(*oÿìäD*oïá`*oèœBì|*oèÈBì˜*oèTDì´*oøÐ*oèTDìì*oø+oèÔDÿèü+o¯ä4+oä¯p+oÿìäŒ+oïá¨+oèlÍJìÄ+oèôIìà+oè°"JøLbìÔ,o¬Yä ,oä¬YH,oÿìäd,oïá€,oè4mJìœ,oè|Jì¸,oÿäîìt-odää,oäd -oÿìä<-oïáX-oèðJÿèh.o8ä„-oä8À-oááÿåäÜ-oïDáø-oø.oø0.oèTDêL.oÿä\¥Mì/ox1äx.oäx1´.oááÿåäÐ.oïDáì.oèœBø)Jìü/oð®ä/oäð®T/oááÿåäp/oïDáŒ/oè ˜ê¨/oè4ÏPìÄ/oèÈBìà/oÿäœBì´1opYä 0oäpYH0oááÿåäd0oïDá€0oèì¥Kìœ0oø¸0oøÔ0oøð0oø 1oø(1oøD1oø`1oø|1oèœBê˜1oèo¸°ä´=o丰ð=oááÿåä >oïDá(>oè ˜êD>oèÈjdÿèx>ot2äp>o¼@Mâ?o|j äˆ>oä|j Ä>oÿìäà>oä ˜êü>oè ˜ÿêè~ ä(?oäè~ d?oð€?oöôéô?oåçäçæááxýâ¹âT©ä @oä8é8@oä°Tô:âd@oätTü â°Tæ@oÌk ä„@oä¬\æ @o ä ŒÀNxAo˜k ä°@oä˜k ì@oÿìäAoïá$AoèlÍJì@AoèôIì\Aoè°"JøLbì4Botk äˆAoätk ÄAoÿìäàAoäTDçáüAoèLbìBoèTDø ‚Kì CoHk äDBoäHk €BoÿìäœBoïá¸Boèð•[ìÔBoè$ÓIìðBoè|PöØfì8Co (CoCot_ê0Cot_æ—äHCo$¬NæpCo˜ädCo`¼QæDo0€ ä€Coä0€ ¼CoááÿåäØCoïDáôCoÿäTDì Eoh3ä Doäh3\DoÿìäxDoïá”DoèègVì°Doè|JêÌDoèÜñNìèDoèLøNìEoÿôÀEoä0EoälEoÿìäˆEoïá¤EoèxCRøœJìÜEoDl äÐEoÔÛWæ´Fo€ äìEoä€ (FoááÿåäDFoïDá`FoèèQLê|Foø˜FoÿäœBêÌFo¸±äÄFohI]â Goøk äÜFoèFoæäGoïáPòXèÙUì8Gopä0Go’eâTGoˆ±äHGoÀYbê¸ ädGo´jæŒGop4ä€GoŒV]æHHoX4äœGoäX4ØGoááÿåäôGoïDáHoè|Jê,HoèˆîOø$mJì”Ho äXHoæ ´OâÿåÀHo¼ä¤Ho°Hoæ â^æÜHoœ\äÐHo°Kæ|Io44äìHoä44(IoááÿåäDIoïDá`Ioè¼lMÿè”Io˜äŒIoðwMâ°Io4ä¤Io¬BVæÌIo ˜äÀIo^[æPJo@˜äÜIoä@˜Joááÿåä4JoïDí ˜êÔJo°3ä`Joä°3œJoááÿåä¸JoïDýXKo0\ääJoä0\ KoááÿåäKìT¨oèLbìp¨oè N쌨oèðJøØfìd©o`ºä¸¨oä`ºô¨oááÿåä©oïDá,©oèhEìH©oÿäX-ìt©ol=ä wX©oÀ‰ ä„©o„aæ ªoô(ä ©oäô(Ü©oÿìäø©oïáªoè ˜ì0ªoøLªoèTDìhªoø„ªoèLbøLb켪oHºä°ªo|[æتo,ºä̪o8·eæôªolu äèªoPJTæ «oL=ä«ox›TâT¬o8u ä«oä8u X«oÿìät«oïá«oø¬«oè ˜ìÈ«oè ˜ìä«oè ˜í¬oè ˜ì¬oè ˜ì8¬oè ˜øpìp¬o¤(äd¬oPmæ,­o=䀬oä=¼¬oááÿåäجoä„KUçDáô¬oè|Jê­oÿøu ä<­oäu x­oááÿåä”­oïDá°­oèì¥KìÌ­oøè­oø®oø ®oÿä\ÿOìÜ®o¤)äL®oä¤)ˆ®oááÿå䤮oïDáÀ®oèšJøü£JìЯot)äì®oät)(¯oÿìäD¯oïá`¯oèLøNì|¯oø˜¯oè8oì´¯oÿäLbìT°ov äà¯oäv °oááÿåä8°oïDí$ÓIìl°o»äd°o"d∰otŠ ä|°o@-iæ ±oàºä˜°oäàºÔ°oááÿåäð°oïDý¬±o\Š ä±oä\Š X±oááÿåät±oïDá±oèœBø\¯Pìȱo\)ä¼±oL0Tæ ²oŠ äرoäŠ ²oááÿåä0²oäØ{MçDáL²oøh²oè€%M섲oèÌýQÿè\³opfä°²oäpfì²oááÿåä³oäÈBçDá$³oèÈBì@³oèÈBÿèx³oD)äl³o°V`椳o¼ºäˆ³o”³oæ âäçXêì‰ ä´³oäì‰ ð³oÿìä ´oïá(´oÿä ˜ê¨µo>äT´oä>´oÿì䬴oïáÈ´oèœBìä´oèTDíµoøµoèTDì8µoøTµoèTDìpµoøŒµoèTDÿèH¶o¬‹ 丵o䬋 ôµoááÿåä¶oïDá,¶oÿä¼p-ì”¶oˆ‹ äX¶o戋 ´Oâÿål·o»ä¤¶oä»à¶oÿìäü¶oïá·oèlÍJì4·oèôIìP·oè°"JøLbìD¸oH ä|·oäH ¸·oááÿåäÔ·oïDáð·oè úJì ¸oø(¸oÿäàJì¹oD äT¸oäD ¸oÿì䬸oïáȸoè¸çIìä¸oè„ëIí¹oè|PöØfìعoàfä,¹oäàfh¹oÿì䄹oïá ¹oè|Jì¼¹oèÈBø|Jìô¹o( äè¹o@lZæºod‹ ä ¸R ºo<*äºoÐ^æ0»oô=ä0ºoäô=lºoááÿå䈺oïD᤺oèTDìÀºoè)Jìܺoè)Jìøºoè)Jì»oè)Jø)JìH»o ‹ ä@»o %Xâd»oðŠ äX»oX„Vêœv ät»oäœv °»oááÿåäÌ»oïDáè»oèì¥Kø\ÿO줼oÀ>ä¼oäÀ>P¼oäÿåäl¼oïሼoè ¤Jøü£Jì´¼oü ä üU8½o\w äļoä\w á½oÿìä½oïí4mJìT½o¤>äH½o4‹Tæp½o  äd½oD§^æÔ¾o Œ 䀽oä Œ ¼½oááÿåäؽoïDáô½oèßPì¾oè ˜ê,¾oøH¾oè ˜ìd¾oø€¾oøœ¾oèh¡K츾oèH1^øLbìt¿o,w ää¾oä,w ¿oááÿåä<¿oïDáX¿oèì¥Kÿè0Ào€*ä„¿oä€*À¿oááÿåäÜ¿oïDáø¿oèÄ*MìÀoÿôLÀoˆ ä@ÀoP«TæhÀox ä\Àoä­KêÀ»äxÀoäÀ»´ÀoêäÐÀoöìœBäãâ DÁoXÁoåçäçæááxýâ<¾ œBäÓã¸á°Çå ÁoŠâ¸á°Çå,ÂoŠâ¸á°Çå¸Âoô(27ïÿäóáÿÿÿÿç õâ ÿÿÿáÓááÿÿïÿåâ üáœBääÂoü:áØfäÓý Ão gä dÁNøÃo¬¡ä0Ão䬡lÃoÿìäˆÃoïá¤Ãoèè4LìÀÃoè|JìÜÃoè|JøüÌKìÐÄopŒ äÄoäpŒ DÄoÿìä`Äoïá|ÄoèlÍJì˜ÄoèôIì´Äoè°"JøLbìTÅo,?äàÄoä,?Åoÿìä8ÅoäœBçíøEJì€Åo”¡pÅodÅoæ`êxÅoæ`â<Æo0+äÅoä0+ÌÅoÿìäèÅoïáÆoèœÊeì ÆoèÿèÇo  äLÆoä  ˆÆoÿì䤯oïáÀÆoèlÍJìÜÆoèôIìøÆoè°"JøLbììÇoh¡ä$Çoäh¡`Çoÿìä|Çoïá˜ÇoèlÍJì´ÇoèôIìÐÇoè°"JøLbìÄÈo°¼äüÇoä°¼8ÈoÿìäTÈoïápÈoèlÍJìŒÈoèôIì¨Èoè°"JøLbìdÉo”¼äÔÈo䔼Éoäÿåä,ÉoïáHÉoÿäœBêÉo„gätÉo€Éoæ âtRæhÊoØw ä ÉoäØw ÜÉoááÿåäøÉoïDáÊo謳Sì0ÊoøLÊoèLbøœBì„ÊoŒ äxÊohlkæ Êo+ä”ÊoìÄ`æ¼Êo¡ä°ÊoøFUæèÊo4¼äÌÊoØÊoæ â¤RæËoá+äøÊo`ûêØ*äËoH6JâðÌoh ä,Ëoäh hËoÿìä„Ëoïá ËoèœBì¼ËoèTDìØËoøôËoèTDìÌoø,ÌoèTDìHÌoødÌoèTDì€ÌoøœÌoèTDì¸ÌoøÔÌoèTDÿè Ío°?åÍoüJæÎo äÍoä XÍoááÿåätÍoïDáÍoø¬ÍoèLbìÈÍoøäÍoèLbíÎoè ˜øLbì8ÎoüŒ ä,ÎoÜUTæPÎoD¢äHÎo,½YâÔÎo½ä`Îo作Îoááÿåä¸ÎoïDýìÎoøgääÎoLwPâpÏoàŒ äüÎoäàŒ 8ÏoááÿåäTÏoïDí ˜ê,ÐoX?ä€ÏoäX?¼ÏoááÿåäØÏoïDáôÏoèœBìÐoÿô<Ðoø ä êS䜌 äLÐoápaæLÑoáiähÐoåi¤ÐoÿìäÀÐoïáÜÐoèœBìøÐoøÑoø0ÑoèœBÿèhÑo@ä\Ñoð%]æ´ÑoØ äxÑoæØ ´OâÿåŒÒo¸½äÄÑo丽áÒoÿìäÒoïá8ÒoèlÍJìTÒoèôIìpÒoè°"JøLbì¨Òo¼häœÒoáBJæÔÒoœhÄÒo¸Òo€EMêÌÒo€EMâhÓoxhääÒoäxh Óoááÿåä<ÓoïDíXÓoì âÌcTæ”Óop½äxÓo„Óoæ âÈnæ°Óoä¢ä¤ÓodDcæPÔoh äÀÓoäh üÓoááÿåäÔoïDá4Ôoèì¥Kø¥hìlÔo¸¢ä`Ôo ¨ZæðÔoœ¢ä|Ôo䜢¸ÔoááÿåäÔÔoïDí|JêtÕo0½åÕoä0½<ÕoÿìäXÕoþLRìÕo€+ä„ÕoH0Jæ¬Õo,hä ÕoXxLê8 ä¼Õoüh-âÔÖoX@äÔÕoäX@Öoÿìä,ÖoïáHÖoèœBìdÖoø€ÖoøœÖoèœBì¸ÖoÿäX-ìt×oŽ ääÖoäŽ ×oááÿåä<×oïDáX×oÿä¼p-ìhØoè ä„×oäè À×oÿìäÜ×oïáø×oèô/VìØoø0ØoèLBKìLØoèFKÿè@Ùoxy äxØoäxy ´ØoÿìäÐØoïáìØoèlÍJìÙoèôIì$Ùoè°"JøLbìlÙo¾\ÙoPÙoøƒNêdÙoøƒNâ„Ùo$,ä|ÙoTdUâ@Úoiä”ÙoäiÐÙoÿìäìÙoïáÚoè4§cì$Úoÿô\ÚoD£äPÚoá)ZæÛoy älÚoäy ¨ÚoááÿåäÄÚoäÜ9NçDáàÚoèÌýQìüÚoè ˜ø¼p-ì Üoø ä(Ûoäø dÛoááÿåä€ÛoïDáœÛoè¼p-ì¸ÛoøÔÛoè¼p-ìðÛoèœBøŒÇZì(Üo<@äÜo„ÐNæ@Üoä+ä8ÜoH×NâXÜox¾äPÜoDµ`æ0£ähÜoä0£¤ÜoÿìäÀÜoïý üÜo@uEðÜoä âbad_allocâ Ýo\«EÝoä â bad_typeidá <Ýo §A0Ýoä âbad_castã `Ýo„GEPÝoäâ bad_exceptionæ(-tÝoä âexceptionâߌÝoÈ!VDV˜Ýo0ÄKì¼K¤ÝoØ0]Ø*]°ÝoP]PèP¼ÝoÜÌM˜¿MÈÝodÉMüÂMÔÝoHZP ZàÝo¤[xüZìÝo¼ªO¼™OøÝoxõOdïOÞoà…RP{RÞoDNLNÞo VøU(Þo„Ï\ŒË\4Þo¼ÎbüÊb@ÞoÈ·U ®ULÞoxa taXÞoÐ÷NìñNdÞoþNFÜãNpÞo˜ýNxéN|ÞoÄüN\øNˆÞo YbtVb”Þo¤”SÈŽS Þo„ÍaìÅa¬Þo „PáI}P¸ÞoÍa”ÉaÄÞo@·k¤³kÐÞoœƒP8€PÜÞoÒQtÍQèÞoì¿fl¼fôÞo0“L`Láßßo”’LÜ‹L ßoà½^Pº^ßo¼ VxV$ßoè·\²\0ßoOW$KW<ßoðJ ÞJHßoâL¼ÖLTßo ùJHÙJ`ßoÀ¥XP™XlßoÈæJ8áJxßoì¸Xä²X„ßoLPRˆCRßoL¯d´¬dœßohÌLàÁL¨ßoŒòK$ëK´ßoˆúKð÷KÀßo¸AX=XÌßoÐ’\ØŽ\Øßo0ALÌe1LäßotLØLðßoŒLäLüßoXLÀLàoL` LàoŒ*L8!L ào|LÔûK,ào”LÔ L8ào4?Lø4LDàoáaÔKøÍKPàoÌAL¨ÝK\àoìLTLhàopOLHÆKtàoœ0L-L€ào0¯R§RŒào”®R0«R˜àoð˜JFJ¤ào¨ËWáßÅW°àoÜe\e¼àoÐÌSˆÉSÈào¼#O´OÔào,éL$ãLààoT«XЦXìàoàOàÿNøào¬‚JDmJáotMô Máo”J´PJáoH~JøvJ(áo`ÊPÜÄP4áoü¢J8œJ@áoøU„üTLáoP1N€'NXáoX£M¤€Mdáoè¢MÌŽMpáoà/Xô(X|áo€çMàMˆáo$q:O4O”áo„|OpxO áo°é`æ`¬áo¼ìQ@ãQ¸áoTñQ(îQÄáoä\M¬0MÐáoLdP,_PÜáoŒVM<9MèáoTSMœHMôáoVM€EMáÑâoÀácTÜc âo ŽNøƒNâoäRMÜNM$âoh PŒøO0âoP¤N0N<âo8¢N4”NHâoÈ¡N,žNTâo´ŒQ؈Q`âoØ‘Q¨Qlâo@lPÈePxâopNÔûM„âoÈ-ad*aâoÈž^Dš^œâo Ðe¬Êe¨âo(±OܬO´âo”ªQ ¥QÀâo(—cÜ’cÌâotQOáßLOØâoôWk¨SkäâoxÿX0üXðâo –hÜ‘hüâoð aÌaãoŒ6N 3NãoX`4{` ão$dSˆ`S,ãoPºOŒµO8ãoÌ¢]ðž]Dão/`ð+`PãoøFfÈBf\ãoBZ$;Zhão¤AZ\>ZtãoØÔMLÐM€ãob¼ãoläOàOÈãoHgWX_WÔão ]~]àão”K°úJìão@´^œ¯^øãoÈÔJ|ÍJäoÌK”Mäo WZXTZ äoøˆKl7K¬äol‘Kø‹K¸äo4hM´_MÄäoPéT´âTÐäoÌÛ[¨Õ[ÜäoÔæIáKèäoÜËI]ôäoåI4ÓIáßåo¨äI@àI åoxOKJKåo ŒcŒˆc$åo¸{K\BK0åoH{KHrK<åoØzKwKHåoT`K@RKTåo%SS`åoðZKlUKlåo,fK(FKxåo N,˜N„åo¼^XX[Xåoˆ“_t_œåoNNøHN¨åo0÷^äò^´åoP©NÐ¥NÀåo$&RlRÌåoxž`À—`Øåo`[ÈÍ[äåoœŸS—SðåoìIÈçIüåo`AO;OæolËIˆbæoê;ôâ; æo¬.-4ð,,æo´.Œú-8æoú,õ,DæoÄEð¼EPæoP0A()A\æoØåE°ÞEhæo°?p‘?tæoX›?D–?€æo°xErEŒæoÌ®E0¨E˜æo|ªAà£A¤æoôJEXDEä”- -àØæod¢%äôŸ%¢%òáço€ÖäÎ(Öò(ço4ÚäÎÜÙòPçoÔåä¼Ýåòä|êä¼Ý8êòoç`þüêˆþüêˆþüêˆþüêˆþüüþø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þø„þòþì„þî„þî„þî„þˆ›ãöò†ƒùò†ƒùð†ƒùoÛ†ˆ›oÛüì†ì†ìò†ÒöoÚ\†ˆ›­ì†ì†óßöð†ƒùoÙ„†ˆ›™ò†Òöò†ƒù脌ƒóƒùoØh†ˆ›»ì†ì†ì†Òöo×t†ˆ›µ†ì†ìò†ÒöoÖÔ†ˆ›ŸìØöoÕĆˆ›oÖÄìò†ìòò†Òöøƒùð†ƒùð†ƒùoÔð†ˆ›‘ÒöoÔl†ˆ›‘Òöð†ƒùoÓ°†ˆ›Ÿì†Òöð†ƒù膃ˆñoÒÔ†ˆ›‘‹Çö脌ƒóƒùð†ƒùoÑ´†ˆ›»ì†ì†ì†Òö؆ˆþöð†ƒùoÐX†ˆ›µ†ìòò†Òööƒùö†üoÏp†ˆ›™ò†ÒöoÎ솈›‘Òöò†ƒùoÎP†ˆ›ãöò†ƒùð†ƒùoÍ †ˆ›oÎ ì†ì†ìò†ìØöð†ƒùoˆˆ›o̸†ìò†ìò†ìò†ìò†ìò†ì†Òöøƒùð†ƒù膃ˆñð†ƒùð†ƒùð†ƒùoɆˆ›»ì†ìò†Òö膃ˆñoÈĆˆ›ŸìØöoÇ솈›»ì†ì†ì†Òöodžˆ›»ì†ì†ì†ÒöoÆ<†ˆ›»ì†ì†ì†ÒöoÅ€†ˆ›™†ì†Òö脌ƒóƒùoÄІˆ›‘óßöoÃø†ˆ›»ì†ì†ì†Òöoà †ˆ›»ì†ì†ì†Òöö†üoÀt“ oÁ˜oÂÄ’êoÁøüøüoÀÔºþoÀ„Ÿßöð†ƒùð†ƒùo¿t†ˆ›™ò†Òöo¾Ô†ˆ›‹†Òöo½p†ˆ›o¾Äì†ì†ìòò†ìò†ì†Òöð†ƒùð†ƒùo¼´†ˆ›‘Òöö†üo¼†ˆ›Ÿì†Òöo»pˆ›Ÿì†Òöð†ƒùò†ƒùoº †ˆ›o» ì†ì†ì†ì†ì†Òöð†ƒùö†üð†ƒùo¹†ˆ›­ì†ì†Òöo¸D†ˆ›»ì†ì†ì†Òöo·l†ˆ›»ìòò†Òöo¶”†ˆ›»ì†ì†ì†Òö؆ˆþöoµ¨†ˆ›ŸìØöo´D†ˆ›oµp†ìò†ìò†ìò†ì†Òöo³°ˆ›ŸìØö膃ˆñð†ƒùo² †ˆ›™†ì†óßöo±È†ˆ›§†ì†ìùßöð†ƒùo± †ˆ›Ÿì†Òöo°ˆ†ˆ›ãöð†ƒùò†ƒùo¯Ð†ˆ›‘Òöo®Ü†ˆ›o¯Àìò†ìò†Òöo®<†ˆ›Ÿì†Òöo­8ˆ›o®,ìòòòò†Òöo¬p†ˆ›™ò†óßöð†ƒùo« †ˆ›o¬Dì†ì†ì†ì†ì†ì†ìØöò†ƒùð†ƒùð†ƒùð†ƒùo©†ˆ›oªì†ìò†ìò†Òöð†ƒùö†üo¨¨†ˆ›­ìò†Òöo¦Ô†ˆ›o¨˜ì†ì†ì†ì†ì†ì†ìòòò†ì†ì†Òöo¦$ˆ›™†ìùßöð†ƒùò†ƒùò†ƒùo¥,†ˆ›ŸìØöo¤†ˆ›o¤ô†ìò†ì†ì†Òöð†ƒùð†ƒùʆˆþöð†ƒùð†ƒùò†ƒùo¢¨†ˆ›‘Òöö†üò†ƒùö†üo¡¤†ˆ›™†‹á†ÒöoŸl“®o |Œo¡tä‚΂ˆ’Âü–üàoŸè¸oŸ|›ãöʆˆŸßöò†ƒùož†ˆ›»ì†ì†ì†Òöð†ƒùoL†ˆ›Ÿì†Òöoœt†ˆ›»ì†ì†ì†Òöð†ƒùo›¨ˆ›­ì†ì†Òöð†ƒùošà†ˆ›‹†Òö膃ˆñð†ƒùo™À†ˆ›§òòØöo™†ˆ›­ìòØöð†ƒùo—ô†ˆ›o˜Øì†ì†ì†ìØöð†ƒùð†ƒùo–䆈›»ì†ì†ì†Òöo–`†ˆ›‘Òö؆ˆþöo•X†ˆ›­ìò†Òöð†ƒùo”€†ˆ›­ì†ì†Òöð†ƒùˆ›‘Òöo“@†ˆ›Ÿì†Òöð†ƒùo’†ˆ›o“ìòòòò†óßöʆˆþöo¸†ˆ›o‘œìò†ì†ì†Òöð†ƒùoü†ˆ›Ÿì†Òöo@†ˆ›™†ì†Òöö†üoކˆ›Ÿì†Òöö†üö†üoІˆ›Ÿì†Òöð†ƒùoŒø†ˆ›­ìò†Òöˆ›ãöʆˆþöð†ƒùð†ƒùo‹P†ˆ›‘Òöð†ƒùoа†ˆ›ãöð†ƒùð†ƒùò†ƒùò†ƒùo‰†ˆ›oŠ8ì†ì†ìòò†ìØöð†ƒùoˆ|†ˆ›‘Òöo‡¤†ˆ›»ì†ìò†Òö؆ˆþöˆ›‘Òöð†ƒùð†ƒùo…ü†ˆ›ŸìØöò†ƒù膃ˆño…4†ˆ›‘Òöo„\†ˆ›§†ì†ì†óßöò†ƒù脌ƒóƒùoƒ\†ˆ›­ì†ì†óßö؆ˆþöo‚p†ˆ›‹†Òöö†ü؆ˆþöð†ƒùð†ƒùüüð†ƒùð†ƒùò†ƒùo€ˆ†ˆ›olì†ìò†ì†Òö膃ˆñð†ƒùö†üoX†ˆ›»ì†ì†ì†Òöö†üò†ƒùo~€ˆ›­ì†ìØöö†üð†ƒùò†ƒùð†ƒù膃ˆño}†ˆ›»ì†ì†ì†Òöö†ü؆ˆþöo{܆ˆ›§†ì†ì†Òöð†ƒùð†ƒù膃ˆñˆ›‘Òö؆“õþþøð†ƒùoyІˆ›™†ì†Òöoy†ˆ›™†ì†Òöð†ƒùox †ˆ›§†ì†ìùßöð†ƒùð†ƒùò†ƒùovø†ˆ›»ì†ì†ì†Òöov †ˆ›»ì†ì†ì†Òö脌ƒóƒùouT†ˆ›‹†ÒöЈŸßöð†ƒùotL†ˆ›‘Òöos†ˆ›™ò†óßöorH†ˆ›os€ì†ì†ì†ì†ì†ì†ìØöð†ƒùð†ƒùoq†ˆ›orì†ìò†ìò†Òö؆ˆþöooø†ˆ›­ìò†Òöð†ƒùoo†ˆ›»ì†ì†ì†Òöon,†ˆ›§†ì†ì†Òöom|ˆ›™ò†Òöol †ˆ›om`ì†ì†ìòò†ìò†ì†Òöʆˆþöð†ƒùð†ƒùoj膈›‘Òöojd†ˆ›‘Òöö†üð†ƒùoi˜†ˆ›‹†Òöò†ƒùoh¨†ˆ›§ò†ì†Òöò†ƒùogüˆ›ŸìØöò†ƒùö†üof¸†ˆ›og¸ì†ì†ì†ì†ì†Òöò†ƒùð†ƒùoeȆˆ›­ì†ì†Òöodd†ˆ›oe†ìò†ìò†ìò†ì†Òöoaàoc“ocºodToc´od<þøþoc þŸì†Òobh‚ˆþŸì†Òoaäˆþ‘ÒöoaT†ˆ›‘Òöo``†ˆ›oaDì†ìò†ì†Òöo_܆ˆ›‘Òöo_X†ˆ›‘Òöo^H†ˆ›o_Hì†ì†ìò†ìØöo]T†ˆ›µ†ì†ìòùßöò†ƒùo\H†ˆ›o],ìò†ì†ì†Òöo[p†ˆ›»ì†ì†ì†ÒöoZ솈›‘ÒöoZ0†ˆ›­ì†ì†ÒöoY†ˆ›Ÿì†ÒöoW¼†ˆ›oYX†ìò†ìò†ìò†ìò†ìò†ì†ÒöoW(ˆ›ŸìØöoV`†ˆ›­ì†ì†Òöð†ƒùð†ƒùð†ƒùoUd†ƒˆ»ì†ì†ì†àò†ƒùö†üoT†ˆ›oU,ì†ì†ìòòò†ÒöoST†ˆ›­ì†ì†ÒöoRÀ†ˆ›‘‹Çöˆ›‘Òöð†ƒùð†ƒùò†ƒùoPø†ˆ›oQÜì†ì†ìò†ÒöoP<†ˆ›­ì†ì†óßöð†ƒùoOH†ˆ›»ì†ì†ì†Òöð†üö†üö†üð†ƒù؆ˆþöö†üoM؆ˆ›­ìò†ÒöoK|oL,“oLÖoMxŠ’êöoLÐoMXþöoL<þŸìùßoK„‚ˆþŸìùßöüð†ƒùoJÔ†ˆ›ãöoJP†ˆ›ãöoĬˆ›‘Òöð†ƒùð†ƒùò†ƒùoH܆ˆ›‹†Òöð†ƒù膃ˆñ؆ˆþöoGŒ†ˆ›­ì†ì†Òöð†ƒùöƒùð†ƒùò†ƒùÔ†ƒˆ‹†àò†ƒùoE܆ˆ›»ìòò†Òöð†ƒùoE †ˆ›Ÿì†ÒöoD†ˆ›oDèò†ì†ì†ì†ÒöoCp†ˆ›ŸìØöð†ƒùöƒù脌ƒóƒùoB4†ˆ›»ì†ì†ì†ÒöoAx†ˆ›­ì†ì†óßöo@ †ˆ›»ì†ì†ì†Òöö†üð†ƒùo?$“ ½Žü–ü—Éo?4þöo>x†ˆ›‹†óßöò†ƒùo=¤†ˆ›™†ì†Òöð†ƒùo=†ˆ›‘óßöð†ƒùod†ˆ›ŸìØöñn=|†ˆ›­ì†ì†Òön<܆ˆ›‹†Òöð†üð†ƒùö†üð†ƒùn;؆ˆ›‹†Òön;†ˆ›­ì†ì†Òön:|†ˆ›Ÿì†Òön9ø†ˆ›‘Òööƒùò†ƒùö†ün8ø†ˆ›™†ì†Òön8X†ˆ›ŸìØön7h†ƒˆˆn8Hì†ìò†ì†ì†Øn6†ˆ›»ì†ìò†Òöð†ƒùn5Ô†ˆ›Ÿì†Òön4ü†ˆ›»ì†ì†ì†Òön4hˆ›Ÿì†ÒöʆˆŸßön3T†ˆ›Ÿì†Òön2|†ˆ›§†ì†ì†Òöò†ƒùð†ƒùn1†ˆ›n28ì†ìòòòò†Òöò†ƒùn0†ˆ›n0ôì†ì†ì†ì†Òöò†ƒùð†ƒùn/<†ˆ›ŸìØön.d†ˆ›»ì†ìò†Òöð†ƒùn-†ˆ›n.8ì†ìòòòò†ì†Òöò†ƒùn,,†ˆ›­ìò†Òön+Œ†ˆ›Ÿì†Òön*˜†ˆ›n+|ì†ì†ì†ì†ÒöÞ“õþþøð†ƒùn)t†ˆ›­ìò†Òöð†ƒùʆˆŸßön'ü†ˆ›n(àì†ìò†ì†Òöð†ƒùn'†ˆ›»ì†ì†ì†Òön&†ˆ›n&øìòò†ì†Òöˆ›‘Òöʆˆþön$ˆ†ˆ›Ÿì†óßöò†ƒùn"ІƒŽúþŸn$dƒùꆄ„þöꆈþön#8†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùn"0†ˆ›‘Òöò†ƒùð†ƒùò†ƒùð†ƒùn ð†ˆ›»ì†ì†ì†Òön †ˆ›»ì†ì†ì†Òö؆ˆþö脌ƒóƒùn†ˆ›Ÿì†Òön(†ˆ›»ì†ì†ì†Òönˆ†ˆ›Ÿì†Òööüð†ƒù膃ˆñn †ˆ›‘óßöð†ƒùð†ƒùò†ƒùʆˆþöð†ƒùð†ƒù脌ƒóƒù؆ˆþön`†ˆ›»ì†ì†ì†Òönˆ†ˆ›»ì†ìò†Òön\†ˆ›nxì†ìò†ìò†ì†Òön¼†ˆ›Ÿì†Òön†ˆ›Ÿì†Òöö†ünP†ˆ›­ìò†Òöð†ƒùöƒùð†ƒùð†ƒùn$†ˆ›­ìò†Òöð†ƒùð†ƒùn†ˆ›»ì†ì†ì†Òönt†ˆ›Ÿì†Òöò†ƒùn„†ˆ›§†ì†ì†Òö脌ƒóƒùò†ƒùn„†ˆ›­ìò†ÒönÔˆ›™ò†óßön †ˆ›™†ì†Òöð†ƒùð†ƒùò†ƒùð†ƒùò†ƒùö†üð†ƒùð†ƒùn„†ˆ›­ì†ì†Òön†ˆ›‘Òön Pˆ›™†ì†óßöò†ƒùö†üò†ƒùn d†ˆ›Ÿì†Òöð†ƒùn Ćˆ›‘Òön 솈›»ìò†ìØöð†ƒùð†ƒùn l†ˆ›n ¤ì†ì†ìòò†ì†ìØöð†ƒùn°†ˆ›Ÿì†Òö膃ˆñð†ƒùð†ƒùö†ünœ†ˆ›Ÿì†Òön†ˆ›‘Òööƒùð†ƒùn†ˆ›»ìòò†Òö膃ˆñð†ƒùn<†ˆ›‘Òöð†ƒùð†ƒùn€†ˆ›‘Òöò†ƒùò†ƒùn¬†ƒúþŸnDƒùꆄ„þöꆈþön†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùnÔ†ˆ›™ò†ÒönP†ˆ›‘Òöð†ƒùöƒùn”†ˆ›‘Òöð†ƒùʆˆŸßöð†ƒùmþȆˆ›mÿäì†ì†ì†ìòò†Òöð†ƒùmýÔ†ˆ›»ì†ì†ì†Òömý4†ˆ›Ÿì†Òömüx†ˆ›­ìò†Òömû¼†ˆ›­ì†ì†Òöö†üøƒùmúL†ˆ›mû„ì†ìò†ìò†ìòØöð†ƒùò†ƒùmøÐ†ˆ›múì†ì†ì†ì†ìò†ìùßöð†ƒùð†ƒùö†üˆ›‘Òöò†ƒùm÷L†ˆ›Ÿì†Òömö¬†ˆ›‹Øömö(†ˆ›‘Òöð†ƒùmõP†ˆ›™†ì†Òöö†ümôh†ˆ›»ì†ì†ì†Òöm󆈛»ì†ì†ì†Òöö†ümòŒ†ˆ›mópì†ì†ì†ì†Òöö†ümñ¤†ˆ›»ì†ì†ì†Òömð̆ˆ›»ì†ì†ì†Òöøƒùmˆ›mð|òòòò†ì†Òömî̆ˆ›™ò†Òöò†ƒùmí܆ˆ›»ì†ì†ì†óßöö†üm톈›­ì†ìØöò†ƒù؆ˆþömëÔ†ˆ›»ì†ì†ì†Òö؆ˆþömꔆˆ›mëxì†ìò†ì†ÒöÞ†öð†ƒùð†ƒùð†ƒùm醈›§ò†ì†Òöm蘆ˆ›‘óßöð†ƒùð†ƒùmç܆ˆ›‘Òöò†ƒùmç$†ˆ›‹†Òöm愆ˆ›Ÿì†Òöö†üm圆ˆ›»ì†ì†ì†Òööüð†ƒùò†ƒùð†ƒùmä †ˆ›må ì†ìò†ì†ìØöö†ü؆ˆþömâ솈›»ìò†ì†ÒöÔˆþöð†ƒùð†ƒùð†üò†ƒùm༆ˆ›máèòòòòòòò†Òömß †ˆ›mà¬ìòòòò†ìòòòò†Òöð†ƒùmÞH†ˆ›™†ì†Òöð†ƒùmÝ8†ˆ›mÞì†ì†ì†ìØöò†ƒùmÜ€†ˆ›Ÿì†óßömÛ¨†ˆ›»ì†ì†ì†ÒömÚ솈›™†ì†ÒööƒùmÚ†ˆ›™†ì†Òöð†ƒùð†ƒùò†ƒùð†ƒù膃ˆñð†ƒùò†ƒùð†ƒùð†ƒùmØT†ˆ›­ì†ì†Òöö†ü؆ˆþöò†ƒùm×@†ˆ›Ÿì†ÒöЈþömÖ8†ˆ›Ÿì†Òöò†ƒùð†ƒùmÕH†ˆ›™ò†ÒömÔĆˆ›‘Òöò†ƒùÔ†ƒˆ‹†àmÓ€†ˆ›»ìò†ìØöð†ƒùmÒà†ˆ›‘ÒömÒ†ˆ›»ì†ì†ì†ÒömÑh†ˆ›Ÿì†Òöò†ƒùmа†ˆ›ŸìØömÐ,†ˆ›‘ÒömϘˆ›Ÿì†Òöð†ƒùmÎ솈›‘óßömΆˆ›§ò†ìØömÌH†ƒúþŸm΃ùꆄ‚öꆄ„þöꆈþömÌ´†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþömË\†ˆ›ŸìØöð†ƒùmÊ„†ˆ›™ò†Òöøƒùmɰ†ˆ›­ìò†Òöð†ƒùð†ƒùð†ƒùmÈL†ˆ›mÉLì†ì†ìòò†Òöö†üð†ƒùmÇ8†ˆ›mÈìò†ä†‹ÇömÆ`†ˆ›»ì†ì†ì†Òöò†ƒùmÅp†ˆ›»ì†ì†ì†ÒömÄÀˆ›­ìò†ÒömÃÀ†ˆ›mĤì†ìò†ì†Òöð†ƒùð†ƒùð†ƒùò†ƒùm˜†ˆ›­ì†ì†ÒömÁø†ˆ›Ÿì†Òöøƒù膃ˆñʆˆŸßömÀȆˆ›‘Òöm¿†ƒˆúþŸmÀ¼ƒùꆄ„þöꆈþöm¿†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùð†ƒùò†ƒùm½Ô†ˆ›»ì†ì†ì†Òöm¼ü†ˆ›»ì†ì†ì†Òöö†üöƒùm¼L†ˆ›‘ÒöÞ“õþþøò†ƒùð†ƒùm»H†ˆ›‘óßömº¨†ˆ›Ÿì†Òöʆˆþöð†ƒùð†ƒùm¹†ˆ›m¹øì†ì†ì†ì†Òöò†ƒùm¸\†ˆ›ŸìØöm·„†ˆ›»ì†ìò†Òöm¶È†ˆ›™†ìùßöð†ƒùò†ƒùð†ƒùö†ümµÈ†ˆ›ŸìØömµ(†ˆ›Ÿì†Òöm´ˆ›mµìòò†ìòò†óßöð†ƒùð†ƒù膃ˆñð†ƒù膃ˆñð†ƒùm²x†ˆ›­ì†ì†Òöö†üm±X†ˆ›m²Xìòòò†ì†Òöm°Ô†ˆ›‘Òöm¯à†ˆ›m°Äìò†ì†ìØööƒùm®(†ˆ›m¯´ìòòòòòòòòò†Òöm¬Œ†ˆ›m®ì†ì†ì†ìòò†ì†ì†ì†ì†Òöð†ƒùò†ƒùm«d†ˆ›µ†ì†ì†ì†Òömª¨†ˆ›­ìò†Òöm©´†ˆ›µò†ìòØöò†ƒùò†ƒùò†ƒùö†üö†ü؆ˆþöò†ƒùm¨†ˆ›»ì†ì†ì†Òöm§8†ˆ›»ì†ì†ì†Òöm¥ð†ˆ›m§(ìò†ì†ìò†ìò†ÒöÞ“õþþøð†ƒùö†üö†üm¤t†ˆ›m¥Xìò†ìò†Òö膃ˆñð†üò†ƒùö†üð†ƒùm£ˆ›»ìòò†Òöm¡†ˆ›m¢Øòòòòòò†ì†ì†Òöm Ô†ˆ›™†ì†Òöð†ƒùm †ˆ›Ÿì†Òöð†ümŸ\†ˆ›Ÿì†Òömž¼†ˆ›Ÿì†Òöö†üð†ümð†ˆ›Ÿì†Òöm@ˆ›™†ì†Òömœ°†ˆ›‘Òöð†ƒùð†ƒùò†ƒùð†üm›l†ˆ›»ì†ì†ì†Òömš”†ˆ›»ì†ì†ì†Òöm™¼†ˆ›»ì†ì†ì†Òöð†ƒùöƒùʆˆŸßöð†ƒùð†ƒùm˜(†ˆ›­ì†ì†Òöö†üò†ƒùð†ƒù؆ˆþöm–À†ˆ›»ì†ì†ì†Òöm•膈›§†ì†ì†Òöm•†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöm“¼†ˆ›™ò†Òööƒùm“†ˆ›‘Òöò†ƒùð†ƒùð†ƒù膃ˆñm‘䆈›™†ì†Òöð†ƒùð†ƒùmÔ†ˆ›»ì†ìò†Òöm4†ˆ›Ÿì†Òöð†ƒùˆ›‘óßöm†ˆ›ãöò†ƒùmŽ<†ˆ›­ì†ìØöò†ƒùð†ƒùmŒÜ†ˆ›møì†ì†ìòòòØömŒX†ˆ›‘Òöm‹¸†ˆ›Ÿì†Òö؆ˆþö؆ˆþömŠ€†ˆ›ŸìØöm‰à†ˆ›Ÿì†óßöm‰\†ˆ›‘óßööƒùmˆ †ˆ›ŸìØöò†ƒùmˆ†ˆ›‘Òöö†üm‡†ˆ›»ì†ì†ì†Òöm†˜†ˆ›‘Òöm†ˆ›Ÿì†óßöm… †ˆ›»ì†ì†ì†Òöm„†ˆ›m…ì†ì†ì†ì†ì†Òöö†üö†ümƒ†ˆ›»ì†ì†ì†Òöö†üö†üm‚X†ˆ›ŸìØömŒ†ˆ›­‹áò†Òöm€øˆ›‹†Òöð†ƒùð†ƒùm~Œ†ƒˆúþŸm€˜„„þöꆄ‚öꆄ‚öꆄ„þöà†ˆþöm†ˆ¦õ·ä†‹Ø’ÍþøôüÒm}솈›Ÿì†Òöm}L†ˆ›Ÿì†Òöò†ƒùm|x†ˆ›­ìò†Òöm{؆ˆ›Ÿì†Òöm{†ˆ›»ì†ì†ì†Òömz`†ˆ›ŸìØöüümy°†ˆ›Ÿì†Òöð†üò†ƒùò†ƒùmx¨†ˆ›­ì†ì†Òömx$†ˆ›‘Òömw0†ˆ›µòò†ì†Òöò†ƒùmv\†ˆ›™†ì†Òöð†ƒùmu¼†ˆ›ãömu†ˆ›­ìò†Òömt(†ˆ›»ì†ì†ì†Òöö†ü؆ˆþömrô†ˆ›»ì†ì†ì†Òömrp†ˆ›‘ÒömqÀˆ›™ò†óßöʆˆŸßöð†ƒù膃ˆñò†ƒùmpL†ˆ›‹†ÒömoȆˆ›‘Òöð†ƒùmn¸†ˆ›µò†ì†ì†Òöð†ƒùð†ƒùò†ƒùmm†ˆ›§†ìòØöð†ƒùò†ƒùð†ƒùml †ˆ›Ÿì†Òöml†ˆ›Ÿì†Òömk`†ˆ›Ÿì†ÒömjÀ†ˆ›Ÿì†Òöö†ümj†ˆ›Ÿì†Òöð†ƒùñmhÔ†ˆ›µòò†ìØömh4†ˆ›Ÿì†óßömg”†ˆ›Ÿì†Òömfô†ˆ›‹†Òöö†üò†ƒùmf,†ˆ›Ÿì†ÒöÞ“õþþøð†ƒù膃ˆñð†ƒùò†ƒùò†ƒùmd¬†ˆ›Ÿì†Òöð†ƒùöƒùò†ƒùmc¼†ˆ›Ÿì†Òöð†ƒùmb䆈›­ì†ì†ÒöüümaL†ƒŽúþŸmbȃùↈ‰õöma´†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùm`x†ˆ›­ì†ìØöm^L†ƒˆúþŸm`lƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöm^Ȇˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùm]t†ˆ›™†ì†Òöò†ƒùm\ †ˆ›­ì†ì†Òöm\†ˆ›‘Òöö†üð†ƒùð†ƒùöƒùm[4†ˆ›‘óßöò†ƒùmZ˜†ˆ›ãömY܆ˆ›™ò†ÒömY †ˆ›™ò†ÒömXœ†ˆ›‘ÒömWĆˆ›»ì†ì†ì†ÒööƒùmV솈›­ì†ì†ÒömV0†ˆ›™†ì†Òöð†ƒùð†ƒùð†ƒùmUX†ˆ›‘ÒömTÔ†ˆ›‘ÒömTP†ˆ›‘ÒömS°†ˆ›‹†ÒömRô†ˆ›­ì†ì†Òöð†ƒùöƒùð†ƒùʆˆþömQ`†ˆ›»ìòòØöð†ƒùð†ƒùð†ƒùmPP†ˆ›­ì†ì†ÒömO”†ˆ›­ì†ì†ÒömN¼†ˆ›»ì†ì†ì†Òöˆ›‘ÒömMD†ˆ›mN(ìò†ìò†ÒömL¤†ˆ›‹†ÒömK°†ˆ›µòòò†ÒömK,†ˆ›‘ÒömJ¨†ˆ›ãöð†ƒùmIІˆ›™†ì†óßöð†ƒùmH܆ˆ›»ì†ì†ì†ÒömG°†ˆ›mH¤†ì†ì†ì†ì†ì†Òöð†ƒùð†ƒùöümF¼†ˆ›‹†Òöð†ƒùmE †ˆ›mFhòòòòòò†ì†ì†ÒöʆˆŸßömCü†ˆ›™†ì†Òöð†ƒùò†ƒùð†ƒùö†üð†ƒù膃ˆñð†ƒùm@T“¼mA”Š˜þ˜mB°ˆ’mBL‚ˆ’Âü–ümAŒm@ìmApöm@d›‹Øöð†üò†ƒùð†ƒùm>̆ˆ›m?èìòò†ìòò†óßöð†ƒùò†ƒùm>†ˆ›ãöð†ƒùð†ƒùm= †ˆ›­ì†ì†Òöð†ƒùmh†ƒˆˆl?dì†ì†ìòòò†Øð†ƒùð†ƒùl=t†ˆ›­ì†ì†óßöl<œ†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþööƒùð†ƒùl: †ˆ›l;¼ìòòòòò†Òöð†ƒùl9䆈›ŸìØöl9`†ˆ›‘Òöö†ül8x†ˆ›§†ìò†Òöøƒùð†ƒùl7À†ˆ›ãö脌ƒóƒùl6ô†ˆ›Ÿì†Òöl6†ˆ›»ì†ì†ì†Òöl5D†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöˆ›‘Òöl3¤†ˆ›‘Òöð†ƒùò†ƒùl2|†ˆ›µòòò†Òöl1܆ˆ›ŸìØöl1†ƒˆˆl1Ìì†ìò†ì†Øl/܆ˆ›l0øì†ì†ìò†ìòØöö†ül/,†ˆ›‹†Òöö†üЈŸßö؆“õþþøð†ƒùl-¬†ˆ›‹†Òöl,¸†ˆ›l-œìò†ìòØöò†ƒùð†ƒùð†ƒùð†ƒùl+Ȇˆ›‘Òö脌ƒóƒùö†üö†ül*¤†ˆ›»ì†ìò†Òöö†üüüð†ƒùl)”†ƒˆˆµ†ì†ì†ì†Øl)†ˆ›‘Òöl(T†ˆ›™†ìØöl'´†ˆ›Ÿì†Òöö†ül&°†ˆ›l'”ì†ì†ì†ì†Òöñl%¬†ˆ›»ìòò†óßöl$†ˆ›l%tòòòò†ìòòòò†Òöð†ƒùð†ƒùò†ƒùl#†ˆ›­ì†ì†Òöl"d†ˆ›Ÿì†Òöl!Œ†ˆ›»ì†ì†ì†Òöl `†ˆ›l!|ì†ì†ìòò†ì†Òöl܆ˆ›‘Òöl†ˆ›»ì†ì†ì†Òöøƒùl0†ˆ›­ìò†Òöl<†ˆ›l ìò†ìò†Òöð†ƒùò†ƒù膃ˆñð†ƒùð†ƒùò†ƒùlІˆ›­ì†ì†óßöð†ƒùö†üüüò†ƒùð†ƒùð†ülÀ†ˆ›‘Òöl<†ˆ›ãölœ†ƒŽúþŸl0ƒùꆄ‚öꆈþöl†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùò†ƒùl膈›‘Òöò†ƒùöƒùl0†ˆ›‘Òö膃ˆñò†ƒùö†ül†ˆ›»ì†ì†ì†Òöð†ƒùl,†ˆ›­ì†ì†Òöö†üöƒùð†ƒùlð†ˆ›lÔì†ì†ì†ì†Òöö†üð†ƒùl†ˆ›­ì†ì†Òöö†üò†ƒù脌ƒóƒùl†ˆ›Ÿì†Òöò†ƒùl@†ˆ›™ò†Òöl¬ˆ›Ÿì†Òöl$†“¼lpŒlDˆ’là‚ˆ’lŒü–ü—ÉlÈlLöl@›‹Øöò†ƒùlІ“¼l Øl À’l Ðøüøüøüøüøüøüøültl ööl웋Øöð†ƒùð†ƒùð†ƒùò†ƒùl8†ˆ›lTìòòòòò†Òöð†ƒùl|†ˆ›ŸìØöò†ƒùð†ƒùlp†ˆ›§†ìò†Òöð†ƒùl`†ˆ›µ†ì†ì†ì†Òölü†ˆ›lPì†ì†ì†ì†ìò†ìò†Òöøƒùð†ƒù膃ˆñò†ƒùð†ƒùlt†ˆ›lXì†ì†ì†ì†ÒökÿH†ˆ›ldì†ìòòò†ì†Òö؆ˆþökþ\†ˆ›ŸìØöký¼†ˆ›ŸìØökü†ˆ›ký¬ìòòòòò†Òöˆ›‘óßökû4†ˆ›§†ì†ì†Òöð†ƒùò†ƒùkúD†ˆ›™†ì†Òökùˆ†ˆ›­ì†ì†Òökù†ˆ›ãöð†ƒùð†ƒùkø,†ˆ›Ÿì†Òöò†ƒùö†ük÷d†ˆ›ŸìØököĆˆ›ŸìØökö†ˆ›­ì†ì†ÒökõL†ˆ›™ò†Òöøƒùò†ƒùð†ƒùkô`†ˆ›Ÿì†óßökó܆ˆ›‘Òökò膈›µ†ì†ì†ì†Òöð†ƒùkò†ˆ›™†ì†óßökñ`†ˆ›§ä†‹Çöö†üò†ƒùkð(†ˆ›kñ(ì†ì†ì†ìò†Òöö†ükï\†ˆ›­ìò†Òöˆ›‘Òöò†ƒùkî †ˆ›Ÿì†Òök퀆ˆ›‹†Òö膃ˆñð†ƒùð†ƒùò†ƒùkìd†ˆ›Ÿì†Òöð†ƒùö†ü膃ˆñð†ƒùö†üö†ükëL†ˆ›‘Òökêt†ˆ›»ì†ì†ì†Òök霆ˆ›§†ì†ì†Òö脌ƒóƒùk蘆ˆ›»ì†ì†ì†Òöö†üð†ƒùöƒùð†ƒùð†ƒùð†ƒùkç@†ˆ›­ì†ì†Òöð†ƒù膃ˆñð†ƒùkå膈›kæÌìò†ìò†ÒökåH†ˆ›Ÿì†ÒökäT†ˆ›kå8ì†ìòò†Òökã´†ˆ›Ÿì†Òökã ˆ›‹ØökâX†ˆ›™†ìØöð†ƒùð†ƒù؆ˆþöö†üð†ƒùÞ“õþþøkÛ †“¼kÝ(ká’kÝ øüøüøüøüøüøüøükÛÄkÜ\öökÛ<›‹Øöð†ƒùð†ƒùð†ƒùkÚH†ˆ›‘Òöð†ƒùkÙT†ˆ›§ò†ì†Òöò†ƒùö†ükب†ˆ›‘Òök×Іˆ›»ì†ì†ì†Òök×0†ˆ›Ÿì†ÒökÖ†ˆ›ŸìØökÕð†ˆ›ŸìØöЈŸßökÔ膈›Ÿì†Òö膃ˆñð†ƒùkÓȆˆ›»ìòò†ÒökÓ(†ˆ›Ÿì†ÒökÒˆ†ˆ›Ÿì†Òö脌ƒóƒù؆ˆþöö†ükÑ(†ˆ›»ì†ì†ì†ÒökФ†ˆ›‘Òöö†üö†ükÏ䆈›ŸìØööƒùð†ƒùkθ†ˆ›kÏœì†ì†ì†ì†Òöö†üð†ƒùö†üò†ƒùkͨ†ˆ›™†ì†ÒökÌІˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöò†ƒùkË€†ˆ›ŸìØökÊà†ˆ›ŸìØökÉ`†ˆ›kÊÐìò†ìòòòòòò†ÒökÈ̈›ŸìØökÈ<†ˆ›‘Òöð†ƒùò†ƒùð†ƒùð†ƒùkÇL†ˆ›‘Òö膃ˆñkÆ€†ˆ›Ÿì†Òöò†ƒùð†ƒùð†ƒùkņˆ›Ÿì†ÒökÄÔ†ˆ›­ì†ì†Òö؆ˆþökÃ膈›ŸìØökÃH†ˆ›ŸìØöñð†ƒùkÂ`†ˆ›Ÿì†Òöð†ƒùð†ƒùò†ƒùð†ƒùkÁ†ˆ›»ì†ì†ì†Òö؆ˆþökÀ0†ˆ›‹†Òöö†üð†ƒùk¿d†ˆ›Ÿì†Òök¾Ä†ˆ›ŸìØök¾$†ˆ›‹Øöò†ƒù쌃óƒùk½@†ˆ›Ÿì†ÒökºŒ†ƒúþŸk½4ƒùↄ„‰õöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöↈ‰õökºø†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùk¹œ†ƒˆˆµ†ì†ì†ì†Øk¸ü†ˆ›Ÿì†Òö膃ˆñk¸†ˆ›™†ìØöð†ƒù脌ƒóƒù脌ƒóƒùk³x†ƒˆšøk·4þŽþþk³²k· k³®þŸk·ƒùk¶†ˆ¦õ½†ì†ìò†ÊþøkµP†ˆ¦õ§ì†ëßþøk³ô„k´œˆ¦õ§‹á†Êþk´ˆ¦õ™‹k´ þøôüÒk²Ø†ˆ›ŸìØök²8†ˆ›ŸìØöüük±P†ˆ›»ìòò†óßöð†ƒùð†ƒùk®`†ƒŽúþŸk± ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆök®È†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùk­l†ˆ›­ì†ì†Òöð†ƒùk¬x†ˆ›»ì†ì†ì†Òök« †ˆ›»ì†ì†ì†Òökªä†ˆ›­ì†ì†óßökª`†ˆ›‘Òök©ˆ†ˆ›»ì†ì†ì†Òök¨è†ˆ›ŸìØöð†ƒùìƒùk§ü†ˆ›ŸìØöð†ƒù؆ˆþök¦¼†ˆ›»ì†ì†ì†Òök¥ð†ˆ›­‹á†ì†Òöüüð†ƒùò†ƒùk¤ü†ˆ›§ÝŠÕök¤\†ˆ›‹†Òök£„†ˆ›»ìò†ìØöò†ƒùð†ƒùò†ƒù膃ˆñð†ƒù膃ˆñð†ƒùk¡Ð†ˆ›»ì†ì†ì†Òö؆ˆþök ¬†ˆ›»ì†ì†ì†ÒökŸÔ†ˆ›»ì†ì†ì†Òö؆ˆþöò†ƒùkž´†ˆ›­ìò†Òökž†ˆ›‹†ÒöüükH†ˆ›™†ì†ÒökœT†ˆ›µòòò†Òöð†ƒùk›|†ˆ›­ì†ì†Òökšø†ˆ›ãökš †ˆ›»ìò†ìØöð†ƒùk™€†ˆ›‘Òöö†ük˜´†ˆ›­ìò†Òöð†ƒùЈþöò†ƒùò†ƒùð†ƒùò†ƒùð†ƒùò†ƒùk–À†ˆ›»ì†ì†ì†Òöö†üð†ƒùð†ƒùk• †ˆ›»ì†ì†ì†Òök”䆈›­ìòØöò†ƒùk“„†ˆ›k”¼ìò†ì†ìò†ìò†Òök’Ȇˆ›™†ì†Òök’4ˆ›‹†Òöò†ƒùð†ƒùk‘T†ˆ›Ÿì†Òök|†ˆ›»ì†ìò†Òöð†ƒùð†ƒùö†üö†ü膃ˆñk<†ˆ›™†ì†ÒökŽd†ˆ›»ìò†ì†ÒökĆˆ›Ÿì†Òöö†üö†ü؆ˆþöð†ƒùüüð†ƒùò†ƒùkŒ †ˆ›»ì†ì†ìùßöò†ƒùò†ƒùk‹†ˆ›§†ì†ì†óßöð†ƒùkŠ\†ˆ›‹†Òö؆ˆþökˆä†ˆ›kŠì†ì†ìòò†ì†Òöö†ük‡à†ˆ›µ†ì†ìò†Òöʆˆþööƒùk…܆ˆ›k‡$ò†ìòòòò†ì†ì†Òöð†ƒùk… †ˆ›Ÿì†Òöð†ƒùò†ƒùð†ƒùð†ƒùö†ük‚ĆƒúþŸk„˜ƒùꆄ‚öꆄ‚öà†ˆþökƒ0†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†ükˆ†ˆ›k‚¤ì†ì†ìò†ìò†Òök€°†ˆ›»ì†ìò†Òökô†ˆ›­ìò†Òöˆ›‘Òöð†ƒùk~|†ˆ›»ì†ì†ì†Òök}¤†ˆ›»ì†ì†ì†Òöð†ƒùk|°†ˆ›»ì†ì†ì†Òöð†ƒùk{ô†ˆ›‹ØökzȆˆ›k{¼†ìò†ìò†ì†Òöøƒùkz†ˆ›‹†Òökyp†ˆ›Ÿì†Òökx´†ˆ›™†ì†Òökx†ˆ›Ÿì†óßö膃ˆñð†ƒù膃ˆñð†ƒùò†ƒù膃ˆñö†ükvt†ˆ›­ìò†Òökuð†ˆ›‘Òöò†ƒùЈŸßöð†ƒùkt´†ˆ›Ÿì†Òökt†ˆ›‹†Òöö†ü؆ˆþöö†ükr´†ˆ›µ†ìò†ìØöøƒùò†ƒùkqȆˆ›­ì†ì†Òöð†ƒùkq †ˆ›‹†Òöð†ƒùkoü†ˆ›kpàì†ì†ìò†Òöò†ƒùð†ƒùknð†ˆ›»ì†ì†ì†Òöö†üö†üЈþökl<†ƒˆúþŸkn\ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆökl¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùkk„†ˆ›Ÿì†óßöð†ƒùkj†ˆ›§†ìòØöð†ƒùð†ƒù؆ˆþökil†ˆ›Ÿì†Òökhx†ˆ›ki\ì†ì†ìò†Òökg †ˆ›»ì†ì†ì†Òökf¬†ˆ›µò†ìò†Òöö†ükeü†ˆ›ŸìØökdè“ ½ükdøþö؆“õþþøÊ†ˆŸßöð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùkc†ˆ›‹Øöð†ƒù膃ˆñkaü†ˆ›­ì†ì†óßöka$†ˆ›»ì†ì†ì†Òök`L†ˆ›»ì†ì†ì†Òök_¬†ˆ›ŸìØök_†ˆ›‘‹Çöð†ƒùð†ƒùk]|†ˆ›k^¨òò†ìò†ìò†ì†Òöüüð†ƒùk\\†ˆ›µ†ì†ì†ì†óßök[†ˆ›k\Lì†ì†ìò†ì†ì†ì†ÒökZ †ˆ›k[ìòòòØöð†ƒùkY,†ˆ›»ì†ì†ì†ÒökX¨†ˆ›‘ÒökS†ˆ›kX˜ìò†kS|†‹šøkWèþŽþþkS¶kWÔkS²þŸkWăùkVІˆ¦õkW¨ìò†ì†ÊþøkV†ˆ¦õ¡†ì†ÊþøkUT†ˆ¦õ§ì†ëßþøkSø„kT ˆ¦õ§‹á†ÊþkTˆ¦õ™‹kTþøôükS,öЈþöð†ƒùð†ƒùð†ƒùò†ƒùkQL†ˆ›µ†ìò†ì†Òöò†ƒùkP@†ˆ›µ†ì†ìòØökOh†ˆ›§ò†ì†Òöð†ƒùò†ƒùð†ƒù؆ˆþökN,†ˆ›ŸìØökMT†ˆ›§†ìòØöð†ƒùöƒùkL|†ˆ›Ÿì†Òö膃ˆñkK”†ˆ›­ìòùßöð†ƒùkJ¼†ˆ›­ì†ìØökI䆈›»ì†ì†ì†ÒökHÔ†ˆ›kI¬†ìòò†ì†ÒökH4†ˆ›‹Øöð†ƒùò†ƒùkGD†ˆ›­ì†ìØöð†ƒùò†ƒùkF8†ˆ›»ì†ì†ì†ÒökE`†ˆ›»ìò†ì†Òö؆ˆþöð†ƒùö†ükD†ˆ›»ì†ì†ì†Òööƒùð†ƒùò†ƒùʆˆþöð†ƒùö†üö†üö†üö†üð†ƒùЈþöð†ƒùkA„†ˆ›»ìòò†Òöð†ƒùk@ †ˆ›kAXìò†ì†ì†ì†ì†ì†Òök?œ†ˆ›‘Òöò†ƒùk>†ˆ›k?tì†ì†ìòò†ìòòò†Òööƒùò†ƒùð†ƒùk=†ˆ›Ÿì†óßök<<†ˆ›§òò†óßöð†ƒùk;d†ˆ›™†ì†Òöð†ƒùʆˆþöð†ƒùk:$†ˆ›‹†Òök9„†ˆ›Ÿì†Òöö†ük8¸†ˆ›™†ì†Òöˆ›‘Òöð†ƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùk6܆ˆ›™†ì†Òök6†ˆ›»ì†ì†ì†Òök5d†ˆ›Ÿì†Òöüüð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùð†ƒùk3„†ˆ›k4„ì†ì†ìò†ì†Òök2Ȇˆ›­ìò†Òööüð†ƒùk1Ô†ˆ›™†ì†Òök14†ˆ›Ÿì†Òöò†ƒùð†ƒùð†ƒùð†ƒùö†üð†ƒùk/à†ˆ›­ì†ì†Òöð†ƒùk.˜†ˆ›k/Œ†ìò†ìò†ì†ÒöЈŸßöò†ƒùö†üò†ƒùð†ƒùð†ƒùk,à†ˆ›»ì†ìò†Òöð†üö†ük+܆ˆ›»ì†ì†ì†Òöñò†ƒùò†ƒùð†ƒùð†ƒùð†ƒù؆ˆþöö†üö†ük*†ˆ›­ìò†Òöˆ›ãöð†ƒùk(¨†ˆ›­ì†ì†Òöʆˆþöò†ƒùk'P†ˆ›§†ì†ì†óßöð†ƒùð†ƒù؆ˆþök&†ˆ›™ò†Òök%8†ˆ›»ì†ì†ì†Òök$|†ˆ›­ìò†ÒöÞ“õþþøò†ƒùk#”†ˆ›‘óßöð†ƒùò†ƒùò†ƒùð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùk!膈›»ì†ì†ì†Òök!H†ˆ›ŸìØök Ćˆ›‘Òöò†ƒùð†ƒùkÔ†ˆ›™†ì†ÒökÀ“ ½ükÐþö膃ˆñ膃ˆñ膃ˆñò†ƒùk\†ˆ›­ìò†Òök؆ˆ›ãöð†ƒùð†ƒùkt†ˆ›kì†ì†ì†ì†ì†ìØö脌ƒóƒùkp†ˆ›»ì†ì†ì†Òöö†ükÀ†ˆ›Ÿì†Òö؆ˆþöð†ƒùð†ƒùð†ƒùüüð†ƒùð†ƒùð†ƒùk†ˆ›­ìò†Òök(†ˆ›»ìòò†Òök8†ƒŽúþŸkƒùꆄ„þöꆄ„þöꆄ‚öꆆök †ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùkÔ†ˆ›k ìò†ì†ì†ì†ì†ì†Òöð†ƒùò†ƒù؆ˆþök|†ˆ›»ì†ì†ì†Òöö†ük”†ˆ›»ì†ì†ì†ÒökȆˆ›™†‹á†Òöøƒùk¼†ˆ›µ†ìò†ì†ÒöÔ†ƒˆ‹æò†ƒùk̆ˆ›‘Òöö†üö†üð†ƒùö†ük à†ˆ›Ÿì†Òök †ˆ›§†ìòØöøƒùk 4†ˆ›­ìòùßöð†ƒùk x†ˆ›‹†Òök  †ˆ›»ì†ì†ì†Òök †ˆ›k h†ìòò†ì†Òökð†ˆ›Ÿì†Òöö†üò†ƒùk(†ˆ›Ÿì†ÒökP†ˆ›»ìòò†Òöö†üö†üö†üöƒùò†ƒùò†ƒùð†ƒùk`†ˆ›k¨ì†ì†ìòꆋá†ìØökÀ†ˆ›‹†Òök膈›»ì†ì†ì†Òök†ˆ›»ì†ì†ì†Òöð†ƒùk†ˆ›k¼òò†ìò†ìò†ì†ÒööƒùkÔ†ˆ›Ÿì†ÒökP†ˆ›‘Òöjÿ°†ˆ›Ÿì†Òöjþ¼†ˆ›µ†ì†ì†ì†óßöjýt†ˆ›jþ¬ì†ì†ìò†ì†ì†ì†ÒöÔ†ƒˆ‹†àð†ƒùjü€†ˆ›‘Òöò†ƒùð†ƒùÞ“õþþøð†üjû †ˆ›§òòùßöjúl†ˆ›‹†Òöð†ƒùjù̆ˆ›‘ÒöjùH†ˆ›ãöjøÄ†ˆ›‘Òöð†ƒùjø$†ˆ›‘Òöj÷h†ˆ›™†ì†óßö؆ˆþöö†üjõĆˆ›jöÔò†ì†ì†ì†ì†ì†Òööƒùð†ƒùð†ƒùjô˜†ˆ›»ìòò†ÒöjóÀ†ˆ›»ìò†ìØöö†üö†üö†üjò¸†ˆ›§†ìòØö膃ˆñð†ƒù؆ˆþöjñˆ›‹†Òöjð䆈›‹Øöj︆ˆ›jðÔì†ìòòòò†óßöð†ƒù膃ˆñjîІˆ›Ÿì†Òöö†üjí膈›»ì†ì†ì†ÒöЈþöò†ƒùð†ƒùj솈›­ìò†ÒöjëH†ˆ›jìX†ì†ì†ì†ìò†ì†Òöjé䆈›jëòò†ìòòòò†Òöjé †ˆ›»ìò†ì†Òöj舆ˆ›ãöð†ƒùð†ƒùjç\†ˆ›jè@ì†ìò†ìØöð†ƒùjæh†ˆ›»ì†ì†ì†Òöö†üöƒùò†ƒù膃ˆñò†ƒùjå$†ˆ›™†ìØöò†ƒùjãü†ˆ›jäüì†ìòòò†óßöjã$†ˆ›»ì†ì†ì†ÒöjâL†ˆ›»ì†ì†ì†ÒöjáȆˆ›‘Òööƒùð†ƒùjàœ†ˆ›µ†ì†ì†ì†óßöjßü†ˆ›Ÿì†Òöò†ƒùð†ƒùjß †ˆ›­ì†ì†Òöò†ƒùjÞ†ˆ›»ì†ì†ì†Òöjݘ†ˆ›‘ÒöjÜø†ˆ›‹†ÒöЈþöð†ƒùö†üð†ƒù膃ˆñjÙœ†ƒúþŸj܃ùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöjÚ†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒùjب†ˆ›Ÿì†Òöò†ƒùj׸†ˆ›»ì†ì†ì†ÒöjÖà†ˆ›»ì†ì†ì†ÒöjÖ†ˆ›§ò†ì†ÒööƒùjÕh†ˆ›‘óßöð†ƒùjÔȆˆ›ãöjÓð†ˆ›§†ì†ì†ÒöjÓl†ˆ›‘Òöò†ƒùjÒ4†ˆ›jÓòò†ìꆋÇöjÑ”†ˆ›Ÿì†óßöjм†ˆ›»ì†ì†ì†ÒöjÏ䆈›»ì†ì†ì†ÒöjÏD†ˆ›Ÿì†Òöð†ƒù؆ˆþö؆ˆþöˆ›‘Òöð†ƒùjÍ4†ˆ›™†ì†óßöjÌ@†ˆ›jÍ$ìòòòùßöjËh†ˆ›»ìòò†Òöð†ƒùjʆˆ›™ò†Òö膃ˆñò†ƒùjÉȆˆ›‘Òöö†üjÈà†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöð†üÞ†öjÆì†ˆ›jÇÐì†ì†ì†ì†Òöð†ƒùjÅø†ˆ›§ò†ì†Òöjņˆ›jÅèì†ì†ì†ì†Òöð†ƒùjĆˆ›§†ìò†Òöð†ƒùjÃT†ˆ›Ÿì†ÒöjÂ`†ˆ›jÃDì†ìò†ì†Òö؆ˆþöjÁt†ˆ›Ÿì†Òö؆ˆþö؆ˆþöjÀ,ˆ›™†ì†Òöj¿†ˆ›jÀìò†ì†ì†ì†Òöð†ƒùð†ƒùð†ƒùj¾8†ˆ›‘Òöj½˜†ˆ›Ÿì†Òöð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùò†ƒùj¼X†ˆ›‘Òöj»Ô†ˆ›‘Òöj»$ˆ›™ò†Òöð†ƒùð†ƒùjº$†ˆ›­ìò†Òöò†ƒùj¹l†ˆ›Ÿì†Òöj¸è†ˆ›ãöð†ƒùj·ô†ˆ›»ìò†ì†Òö脌ƒóƒù脌ƒóƒù脌ƒóƒùj¶˜†ˆ›»ì†ì†ì†Òöjµl†ˆ›j¶ˆìòòòòò†Òöj´Øˆ›Ÿì†Òö؆“õþþøj³Ä†ˆ›™†ì†óßöò†ƒùj³(†ˆ›‘óßöð†ƒùj²l†ˆ›Ÿì†Òöö†üñj±†ˆ›Ÿì†Òöj°d†ˆ›j±Xòò†ì†ì†ì†Òöð†üʆˆŸßöj¯\†ˆ›‘Òöj® †ˆ›™òØöð†üò†ƒùj­”†ˆ›»ìò†ìØöj¬¼†ˆ›»ì†ì†ì†Òöö†üj«Ô†ˆ›»ì†ì†ì†Òöj«4†ˆ›Ÿì†Òöjª”†ˆ›Ÿì†Òöj§T“ j¨jªH’êj¨ˆøüøüøüj§´ºþj§dŸßöj¦¨†ˆ›‹Øöð†ƒùj¦†ˆ›‘Òöj¥0†ˆ›»ìòò†Òöð†ƒùj¤\†ƒˆˆ»ì†ìò†Øj£¼†ˆ›‹†Òöj¢t†ˆ›j£¬ì†ì†ìò†ìòò†Òöj¡Äˆ›™†ì†Òö؆“õþþøö†üð†ƒùò†ƒùj l†ˆ›­ì†ì†ÒöjŸÌ†ˆ›‹†ÒöjžØ†ˆ›µòò†ì†ÒöjžT†ˆ›‘Òöj|†ˆ›»ì†ì†ì†Òöʆˆþöjœ†ˆ›‘ÒöjšØ†ˆ›jœ€ì†ì†ì†ì†ì†ì†ìòòò†ì†Òöøƒùj™è†ˆ›§†ìò†Òöj™d†ˆ›‘óßöj˜p†ˆ›j™Tìò†ìò†Òöj—`†ˆ›j˜8†ì†ì†ìòØöð†ƒùj–¤†ˆ›Ÿì†Òöj•̆ˆ›»ì†ì†ì†Òöò†ƒùj• ˆ›Ÿì†Òöj”†ˆ›‘Òöò†ƒùj“ô†ˆ›‘Òöj“†ˆ›j“äì†ì†ì†ì†Òöj’d†ƒˆˆ™†ì†Øð†ƒùð†ƒùò†ƒùj‘t†ˆ›Ÿì†ÒöjÔ†ˆ›Ÿì†Òöjü†ˆ›§ò†ìØöj ˆ›jìì†ä†‹á†Òöð†ƒùjކˆ›jŽèì†ìò†ì†ÒöjH†ˆ›™†ì†óßöjŒÄ†ˆ›‘ÒöjŒ†ˆ›­ìò†Òöð†ƒùð†ƒùj‹L†ˆ›‘Òöö†üˆ›„ßöʆˆŸßöò†ƒù膃ˆñj‰l†ˆ›‹†Òöj†Ü†ƒˆúþŸj‰`ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöj‡X†ˆ¦õ·ä†‹Ø’ÍþøôüÒj††ˆ›§ò†ì†Òöð†ƒùj„ô†ˆ›j…Øì†ì†ì†ì†Òöj‚t†ƒúþŸj„èƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöà†ˆþöj‚à†ˆ¦õ·ä†‹Ø’ÍþøôüÚjœ†ˆ›§†ìò†Òöð†ƒùj€Ä†ˆ›­ìò†Òö؆ˆþöj †ˆ›»ì†ì†ì†Òöj~Ȇˆ›»ì†ìòùßöj|€“®j}Œj~˜ä‚΂ˆ’j}¬ü–ü—Éj|ü¸j|›ãöð†ƒùð†ƒùð†ƒùj{d†ˆ›™òØö膃ˆñjz˜†ˆ›‹†Òöð†ƒùjyˆ†ˆ›jzlìòòòØöð†ƒù脌ƒóƒùö†üøƒùjx”†ˆ›‘óßöjw¼†ˆ›§òò†Òöjw8†ˆ›ãöò†ƒùò†ƒùò†ƒùð†ƒùò†ƒù؆ˆþöju´†ˆ›­ìò†Òöju†ˆ›Ÿì†Òöjt<†ˆ›»ì†ì†ì†ÒöñjsT†ˆ›™†ìØöð†ƒùjr´†ˆ›‘Òöjr†ˆ›Ÿì†Òöö†ü؆ˆþöò†ƒùjpȆˆ›»ì†ì†ì†Òöö†üò†ƒùˆ›ãöjo|†ˆ›Ÿì†Òöjnˆ†ˆ›µ†ì†ì†ì†óßöò†ƒùò†ƒùʆˆþöð†ƒùö†üjl솈›»ì†ì†ìØöЈþöð†ƒù膃ˆñð†ƒùð†ƒùð†ƒùjk†ˆ›»ì†ì†ì†Òöö†üö†üð†ƒùjj†ˆ›­ìò†Òöjh܈›jià†ì†ì†ì†ìò†ì†Òöjgø†ˆ›»ìò†ì†Òöð†ƒùjgX†ˆ›ãöʆˆþöjfl†ˆ›ãöò†ƒùð†ƒùjeD†ˆ›jf(ì†ìò†ìØöð†ƒù膃ˆñò†ƒùjd †ˆ›»ì†ì†ì†Òöjc4†ˆ›»ì†ì†ì†Òöjb$†ˆ›jc$ì†ì†ì†ìò†ÒöjaL†ˆ›§òò†Òöˆ›‘óßöj_¸†ˆ›j`†ì†ì†ìòØöj_†ˆ›ŸìØöð†ƒùj]\†ƒŽúþŸj^ðƒùꆄ„þöꆈþöj]Ćˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùj\„†ˆ›­ì†ì†Òöj\†ˆ›‘Òö؆ˆþö脌ƒóƒùö†üð†üð†ƒùjZXˆ›j[0ì†ì†ì†ì†ÒöjY°†ƒˆˆ™†ì†Øð†ƒùð†ƒùjX؆ˆ›Ÿì†Òöð†ƒùö†ü؆ˆþö؆ˆþöjW<†ˆ›»ì†ì†ì†Òöˆ›‘Òöð†üò†ƒùò†ƒùð†ƒùjŬˆ›‘óßöjTô†ˆ›»ìòò†ÒöjT8†ˆ›™†ì†ÒöjS|†ˆ›­ì†ì†óßöjP؆ƒˆúþŸjSpƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöjQT†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùjP†ˆ›‹†Òöö†üjNĆˆ›jOüì†ì†ìò†ìòò†ÒöÞ“õþþøð†ƒùð†ƒùjM¤†ƒˆˆ­ì†ìÞò†ƒùð†ƒùjL´†ˆ›­ì†ì†ÒöʆˆþöjKX†ˆ›µòò†ì†ÒöjJÔ†ˆ›‘ÒöjJP†ˆ›‘Òö膃ˆñjI †ˆ›‘Òöò†ƒùjH°†ˆ›»ì†ì†ì†Òö؆ˆþöjGp†ˆ›jHTìòòò†Òöð†ƒùjF´†ˆ›Ÿì†ÒöjE܆ˆ›»ì†ì†ì†ÒöjE†ˆ›»ì†ì†ì†Òöò†ƒùˆ›‘Òö膃ˆñ膃ˆñð†ƒùð†ƒùjC†ˆ›»ìò†ì†Òöð†ƒùö†üð†üjA¨†ˆ›jB¨ìò†ìò†ì†Òööƒùj@Іˆ›­ìò†óßöò†ƒùð†ƒùò†ƒùj?¬†ˆ›»ìò†ìØöð†ƒù؆ˆþöö†üj>”†ˆ›Ÿì†Òöö†üò†ƒùöƒùð†ƒùj=°†ˆ›‘óßöj< †ˆ›j= ìò†ì†ì†ì†Òöj<†ˆ›‘Òöj:†ƒúþŸj<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöj:l†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒùj8†ƒúþŸj9 ƒùꆄ‚öꆈþöj8t†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùj74†ƒˆˆ»ìò†ìÞj%T†ƒŽúþŸj7(ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öj4D†„„‘úþŸj6„‚öꆄ‚öꆄ‚öꆆöj4¼†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öj1”†„„‘úþŸj3`„‚öꆄ‚öꆄ‚öꆆöj2 †ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öj-¤†„„‘úþŸj/H„‚öꆄ‚öꆆöj.†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öj*¤†„„‘úþŸj,p„‚öꆄ‚öꆄ‚öꆆöj+†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öj&Œ†ˆ‘úþŸj)H„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöj'†ˆ¦õ·ä†‹Ø’Íþøôüþàöj%¼†ˆ¦õ·ä†‹Ø’ÍþøôüÜj$´†ˆ›Ÿì†Òöö†üj#̆ˆ›»ì†ì†ì†Òöj"ô†ˆ›»ì†ìò†Òöj"T†ˆ›Ÿì†Òöð†ƒùöƒùð†ƒùj!D†ˆ›­ìò†Òöð†ƒùö†üð†ƒù膃ˆñjø†ˆ›»ìò†ì†ÒöjX†ˆ›Ÿì†Òöj¸†ˆ›Ÿì†Òöð†üjЈ›»ìò†ì†Òöð†ƒùj†ˆ›‹†Òöj†ˆ›µòò†ì†Òöð†ƒùj †ˆ›»ìòò†Òöð†ƒùð†ƒùð†ƒùð†ƒù؆ˆþö؆ˆþöj\†ˆ›­ìò†Òöj؆ˆ›‘Òöj†ˆ›»ì†ì†ì†Òöj(†ˆ›§òò†Òöj@ˆ›jì†ì†ì†ì†Òöjx†ˆ›­ìòùßöj؆ˆ›Ÿì†ÒöjT†ˆ›‘óßöð†ƒùð†ƒùj †ˆ›j ìòò†ì†ì†Òöò†ƒùjp†ˆ›‘ÒöjІˆ›Ÿì†Òöjø†ˆ›»ì†ì†ì†Òööƒù膃ˆñj†ˆ›Ÿì†óßöð†ƒùjp†ˆ›‘ÒöjІˆ›Ÿì†Òöð†ƒùj ¤†ˆ›j|†ì†ì†ì†ì†óßöj †ˆ›„ßöò†ƒùð†ƒùj ø†ˆ›j Üìò†ì†ì†Òö脌ƒóƒùj ô†ˆ›»ì†ì†ì†Òöj †ˆ›»ì†ì†ì†Òöj D†ˆ›»ìòòØöjl†ˆ›»ì†ìò†ÒööƒùʆˆŸßöð†ƒùj†ƒˆˆ§†ìòÞð†ƒùjt†ˆ›‘Òö膃ˆñ脌ƒóƒùj`†ˆ›­ìò†Òöö†üjx†ˆ›»ì†ì†ì†Òöò†ƒùöƒùjÀ†ˆ›‘Òöj$†ˆ›j°ì†ì†ì†ì†ì†ì†ì†ì†ì†ì†Òöj †ˆ›‘Òöò†ƒùjx†ˆ›jP†ì†ì†ì†ì†Òöiÿ †ˆ›»ì†ì†ì†ÒöiþȆˆ›»ì†ì†ì†Òöiýð†ˆ›»ì†ì†ì†ÒöiýP†ˆ›‹ØöЈþöiûô†ˆ›iüØìò†ì†ì†Òöiûp†ˆ›‘Òöð†ƒùʆˆŸßöiú0†ˆ›­ìò†Òö膃ˆñiùH†ˆ›­ì†ì†óßöð†ƒùiøŒ†ˆ›Ÿì†Òöi÷Іˆ›­ìò†Òöi÷L†ˆ›ãöiöt†ˆ›»ìò†ì†Òöøƒùiõ؆ˆ›‘Òöò†ƒùð†ƒùiô膈›­ì†ì†Òöiô,†ˆ›™†ìØöð†ƒù脌ƒóƒùö†üöüiòĆˆ›ió¨ìò†ì†ì†Òöiò$†ˆ›Ÿì†Òöð†ƒùò†ƒùö†üiñ0ˆ›™†ì†Òöð†ƒùò†ƒù膃ˆñið@†ˆ›‘Òöiˆ›­ì†ì†óßöiˆ›»ì†ì†ì†Òöií¸†ˆ›iîœì†ì†ì†ì†Òöiìà†ˆ›»ì†ìò†Òöö†üi솈›™†ì†óßöЈŸßöð†üð†ƒùð†ƒùð†ƒùi긆ˆ›ãöð†ƒùð†ƒùié8†ˆ›iêpì†ìòò†ìò†ìØöð†ƒùièD†ˆ›»ì†ì†ì†Òöö†üiç\†ˆ›»ì†ì†ì†Òöi愆ˆ›»ì†ì†ì†Òöiå䆈›‹†Òöð†ƒùЈŸßö؆“õþþøè†ƒˆñiä,†ˆ›­ì†ì†Òöi㌆ˆ›Ÿì†Òöò†ƒùiᄆƒŽúþŸiãhƒùꆄ„þöꆄ„þöꆄ‚öꆆöiá솈¦õ·ä†‹Ø’ÍþøôüÜiàȆˆ›­ì†ìØöißœ†ˆ›ià¸ì†ìò†ìò†ìØöʆˆþöò†ƒùö†üiÞl†ˆ›Ÿì†Òö؆ˆþöøƒùð†üò†ƒùð†ƒùiÝ4†ˆ›‘ÒöiÜx†ˆ›­ìò†Òöð†ƒùiÛ †ˆ›™†ì†Òöð†ƒùiÚ̆ƒˆˆ»ìò†ì†Øð†ƒùiÚ†ˆ›Ÿì†Òöö†üiÙ(†ˆ›»ì†ì†ì†ÒöiØP†ˆ›»ì†ì†ì†Òöi×°†ˆ›Ÿì†ÒöiÖô†ˆ›™†ì†ÒöiÖ@ˆ›¯Ü†‹ˆiÖLöð†ƒùò†ƒùò†ƒùò†ƒùð†ƒùð†ƒùiÔÀ†ˆ›»ì†ì†ì†ÒöiÓ膈›»ì†ì†ì†ÒöiÓ,†ˆ›­ì†ì†Òöð†üöƒùð†ƒùiÒ8†ˆ›ŸìØöiј†ˆ›Ÿì†Òöð†ƒùò†ƒùiÐŒ†ˆ›»ì†ì†ì†ÒöiÏ|†ˆ›iÐ|ìò†ìòò†Òöö†üiÎ̆ˆ›Ÿì†Òöøƒùi͈†ˆ›iΤì†ìò†ìòò†ÒöiÌ膈›‹†ÒöiÌL†ƒˆˆ­ìò†Øè†ƒˆñð†üiˆˆ›iËôì†ì†ì†ì†Òö؆ˆþöð†ƒùiÉІˆ›»ì†ì†ì†Òöò†ƒùò†ƒùiÈ䆈›™ò†ÒöiÈ(†ˆ›­ìò†ÒöiÇP†ˆ›»ì†ìò†ÒöiÆx†ˆ›»ìòòØöð†ƒùò†ƒùiņˆ›iÆ4ì†ìò†ìòò†ÒöiĆˆ›iÅì†ì†ì†ìò†ÒöiÃXˆ›™†ì†Òö膃ˆñiÂ,†ˆ›iÃìòòò†ÒöiÁp†ˆ›™ò†Òöö†üð†ƒùö†üð†ƒùiÀ@†ˆ›»ì†ì†ì†Òö؆ˆþöi¿†ˆ›i¿äìòòò†Òöò†ƒùò†ƒùöƒùi¾†ˆ›ŸìØöi½X†ˆ›­ì†ì†Òöi¼œ†ˆ›™†ìØö膃ˆñi»˜†ˆ›»ì†ìò†Òö脌ƒóƒùiº”†ˆ›»ì†ì†ì†Òöö†üöƒùð†ƒùi¹¬†ˆ›Ÿì†Òöi¸Ô†ˆ›»ì†ì†ìØöð†ƒùi·ü†ˆ›­ì†ì†Òöi·$†ˆ›»ì†ìò†Òöi¶h†ˆ›­ì†ì†ÒöiµÈ†ˆ›Ÿì†Òöi´ð†ˆ›»ì†ì†ì†Òöi´P†ˆ›‹†Òöi³\†ˆ›i´@ìò†ì†ì†Òöi² “ ½Žü–ü—Éi²þöö†üi±l†ˆ›‘Òöi°Ì†ˆ›Ÿì†óßöi°†ˆ›­ìò†Òöi¯p†ˆ›‹†óßöð†ƒùö†üö†ü؆ˆþöi®†ˆ›»ì†ì†ì†Òöi­8†ˆ›»ì†ì†ì†Òöøƒù膃ˆñi¬†ˆ›i¬äìò†ì†ì†Òöi©\†ƒúþŸi«Ø„„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öà†ˆþöi©È†ˆ¦õ·ä†‹Ø’ÍþøôüÚi¨Ø†ˆ›‘Òöi¨†ˆ›­ìò†Òöð†ƒùð†ƒùö†üi§†ˆ›­ìò†Òöð†üi¦$†ˆ›»ìò†ì†Òöi¥ˆ›Ÿì†óßöi¥†ˆ›‘Òöð†ƒùi¤`†ˆ›‘Òöð†ƒùi£À†ˆ›‘Òöi¢°†ˆ›i£ˆ†ì†ì†ì†ì†óßöö†ü膃ˆñi¡Ô†ˆ›‹†Òöð†ƒùi¡†ˆ›ŸìØöüüi „†ˆ›‘ÒöiŸä†ˆ›‹ùßöiŸ,†ƒˆˆ§†ìòÞižp†ˆ›™†ìØöi˜†ˆ›»ì†ì†ì†ÒöiœÀ†ˆ›»ì†ì†ì†Òöi›è†ˆ›»ì†ì†ì†Òöi›†ˆ›»ì†ì†ì†Òöiš8†ˆ›»ì†ì†ì†Òöi™˜†ˆ›‹†Òöò†ƒùi˜´ˆ›§òòØöi—´†ˆ›µòò†ì†Òöð†ƒùi–À†ˆ›»ìòò†Òöð†ƒùð†üð†ƒùi•°†ˆ›­ì†ì†Òöö†ü؆ˆþöi”Іˆ›‘Òöi”0†ˆ›Ÿì†Òöi“t†ˆ›™†ì†Òöi’Ô†ˆ›ŸìØöüüiŒˆ†“¼iŽi’x’iŽˆøüøüøüøüøüøüøüi,iÄööiŒ¤›‹ØöiŒ†ˆ›‘óßöð†ƒùi‹,†ˆ›­ìòùßöiЍ†ˆ›‘óßö膃ˆñð†ƒùò†ƒùð†ƒùö†üð†ƒùi‰(†ˆ›»ì†ì†ì†Òöò†ƒùiˆ8†ˆ›»ì†ì†ì†Òöò†ƒùi‡€†ˆ›ŸìØöò†ƒùi††ˆ›§†ìò†Òöøƒùi…؆ˆ›‹†Òöò†ƒùi„„†ˆ›i…°ì†ìꆋáòò†ÒöiƒÈ†ˆ›™†ì†Òöi‚ð†ˆ›§òò†Òöi‚4†ˆ›­ìòØöò†ƒùò†ƒùi†ˆ›iôì†ì†ì†ì†Òöö†üð†ƒùi€ †ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöò†ƒùøƒù؆“õþþøð†ƒùð†ƒù膃ˆñi}؆ˆ›™†ì†Òöi}T†ˆ›‘Òöi|`†ˆ›i}Dìòòò†Òöi{¤†ˆ›™†ì†Òöð†ƒùð†ƒùiz”†ˆ›»ì†ì†ì†Òöiz†ˆ›‘Òöð†ƒùò†ƒùò†ƒùˆ›‘óßöix¼†ˆ›‘Òöò†ƒùò†ƒùʆˆþöð†ƒùð†ƒùð†ƒùð†ƒùivø†ˆ›™†ì†óßöiv†ˆ›ivèì†ì†ì†ì†Òöð†ƒùiu†ˆ›»ìò†ì†Òöö†üò†ƒùöƒùö†üò†ƒùð†ƒùò†ƒùisІˆ›Ÿì†Òöis†ˆ›­ì†ì†óßöò†ƒùir\†ˆ›Ÿì†Òöiq„†ˆ›»ì†ì†ì†ÒöЈþöip`†ˆ›­ì†ì†Òöioˆ†ˆ›»ìòò†Òöð†ƒùin”†ˆ›»ì†ì†ì†Òöim †ˆ›in„ì†ì†ì†ì†Òöö†üö†üö†üöƒùö†üilˆ†ˆ›­ì†ì†Òöik膈›Ÿì†Òöij„†ˆ›ikØì†ì†ì†ìò†ìò†ì†Òöii䆈›ŸìØöii(†ˆ›­ìò†Òöö†üih@†ˆ›»ì†ì†ì†Òöigh†ˆ›»ì†ì†ì†Òöif†ˆ›»ì†ì†ì†Òöieð†ˆ›‹†Òöie4†ˆ›™†ì†Òöid$†ˆ›ie$ìò†ì†ì†ì†Òöˆ›‘óßöð†üibȆˆ›™†ì†Òö膃ˆñò†ƒùia°†ƒˆˆibtìòò†ì†Øi`ô†ˆ›­ì†ì†óßö脌ƒóƒùi_Ô†ˆ›i`¸ì†ì†ìò†Òö؆ˆþöi^”†ˆ›i_xìò†ì†ì†Òöð†ƒùi]¼†ˆ›™†ì†óßöi]†ˆ›™†ì†Òööƒùò†ƒùð†ƒùð†ƒùð†ƒùi[ô†ˆ›ãöð†ƒùiZȆˆ›i[ òò†ìò†ÒöiY€†ˆ›iZ¸ì†ìòò†ìò†ìØöò†ƒùiX¬†ˆ›­ì†ì†óßöð†ƒùö†üiWà†ˆ›‹†Òöð†ƒùöƒùð†ƒùð†ƒù膃ˆñ膃ˆñð†ƒùð†ƒù脌ƒóƒùiUø†ˆ›­ì†ì†Òöò†ƒùiU†ˆ›»ì†ì†ì†ÒöiT0†ˆ›§†ì†ì†Òööƒùö†üiS€†ˆ›‘Òöð†ƒùð†ƒùð†ƒùð†ƒùiRp†ˆ›Ÿì†Òöö†üöƒùiQÀ†ˆ›‘óßöò†ƒùiQ†ˆ›Ÿì†Òöð†ƒùð†ƒùiNü†ˆ›iP˜†ìò†ìò†ìò†ìò†ìò†ì†ÒöЈŸßöiN†ˆ›ãöð†ƒùð†ƒùò†ƒùiJ솃úþŸiM´ƒùꆄ„þöÚ†„„‰ˆíöꆄ„þöꆄ„þöÚ†„„‰ˆíöꆄ„þöꆄ„þöꆈþöiKX†ˆ¦õ·ä†‹Ø’ÍþøôüÚiJ†ˆ›»ì†ì†ì†Òöð†ƒùiI †ˆ›»ì†ì†ì†ÒööƒùiHH†ˆ›­ì†ì†Òöð†ƒùð†ƒùð†ƒùʆˆþöiF´†ˆ›§†ì†ì†óßöiF†ˆ›Ÿì†ÒöiE<†ˆ›»ì†ì†ì†Òöð†ƒùö†üÞ“õþþøiD†ˆ›­ì†ì†Òöð†ƒùð†ƒùiBø†ˆ›§†ì†ì†Òöð†ƒùiB†ˆ›§òò†Òöð†ƒùð†ü膃ˆñi@Ȇˆ›»ì†ì†ìØöi@ †ˆ›­ì†ìØöð†ƒùi?4†ˆ›­ì†ì†Òö؆ˆþö؆ˆþöi=†ˆ›i>d†ì†ìò†ìò†ìòò†Òöi<˜†ˆ›‘Òööƒùð†ƒùð†ƒùi;À†ˆ›‘Òöò†ƒùi;†ˆ›ŸìØöð†ƒùò†ƒùi9ü†ˆ›»ì†ì†ì†Òö脌ƒóƒùi90†ˆ›Ÿì†Òööüò†ƒùi5†ƒˆúþŸi8ðƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöi5”†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùi4D†ˆ›­ìò†Òöi3¤†ˆ›‹†Òöò†ƒùð†üð†ƒùi2˜†ˆ›™ò†Òöi1À†ˆ›»ì†ì†ì†Òöi0膈›»ì†ìò†Òöö†üö†ü؆ˆþö؆ˆþöˆ›ãöð†ƒùò†ƒùð†ƒùð†ƒùi-(†ƒŽúþŸi/4ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöi-†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùi,4†ˆ›»ì†ì†ì†Òöi+°†ˆ›‘Òöð†ƒùöƒùð†ƒùò†ƒùð†üi*ˆ†ˆ›‹†óßöi)°†ˆ›§†ìò†Òöʆˆþöi(Ćˆ›ãöi'´†ˆ›i(´ìòò†ìò†Òöð†ƒùi&À†ˆ›»ì†ì†ì†Òöi%膈›»ì†ì†ì†Òöi%†ˆ›»ì†ì†ì†Òöò†ƒùi$ †ˆ›»ì†ì†ì†Òöð†ƒùøƒù膃ˆñi#†ˆ›­ì†ì†Òöò†ƒùi"0†ˆ›™ò†Òöi!X†ˆ›§òò†Òöð†ƒùi €†ˆ›™†ìùßö脌ƒóƒùi(†ˆ›i Dì†ìò†ìòò†Òöi ¤“õþþÚ“õþþøi†ˆ›‘Òöi†ˆ›‘ÒöiŒ†ˆ›ip‹á†ì†ì†ìùßöi솈›Ÿì†óßöð†ƒùö†ü脌ƒóƒùi؆ˆ›­ì†ì†Òöi䆈›iÈìò†ìò†Òööüò†ƒùð†ƒùiô†ˆ›‹†Òöip†ˆ›‘Òöð†ƒùi|†ˆ›»ì†ìò†Òöð†ƒùð†ƒùil†ˆ›»ì†ìò†Òöð†ƒùò†ƒùi(†ˆ›i(ì†ì†ìòò†Òöð†ƒùi†ˆ›iüìò†ì†ì†Òöò†ƒùi(†ˆ›»ìòò†Òöiˆ†ˆ›Ÿì†Òöˆ›‘Òöi,†ˆ›§òò†Òöð†ƒùð†ƒùð†ƒùiȆˆ›iÈì†ìò†ìò†Òöi(†ˆ›Ÿì†Òöò†ƒùi8†ˆ›»ì†ì†ì†Òöi ´†ˆ›‘Òöi ˆ†ˆ›i ¤ìò†ìòòò†Òö؆ˆþöi d†ˆ›»ì†ìò†Òöi ¨†ˆ›™†ì†ÒöÒƒˆˆ‘Øð†ƒùi ˆ†ˆ›Ÿì†Òöi䆃úþŸi `„„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öà†ˆþöiP†ˆ¦õ·ä†‹Ø’ÍþøôüÚi(†ˆ›™òØöð†ƒùià†ˆ›iüì†ì†ìò†ìò†Òöi†ˆ›»ì†ì†ì†ÒöiP†ˆ›iøì†ì†ì†ì†ì†ì†ìòòò†ì†Òöix†ˆ›§†ìò†Òööƒùi †ˆ›™†ìùßöhÿ䆈›™†ì†Òöð†ƒùhÿ(†ˆ›Ÿì†Òöð†ƒùhþl†ˆ›‹†Òöhý”†ˆ›»ì†ì†ì†Òöhüô†ˆ›Ÿì†Òö膃ˆñˆ›‘óßöð†ƒùʆˆŸßö膃ˆñhúô†ˆ›‹†Òöð†ƒùhúT†ˆ›‘Òöò†ƒùhùœ†ˆ›ŸìØöhù†ˆ›‘Òöhø@†ˆ›»ì†ì†ì†Òöh÷ †ˆ›ŸìØöhöȆˆ›»ì†ì†ì†Òöö†ühõà†ˆ›»ì†ì†ì†Òöhõ$†ˆ›™†ì†Òö؆ˆþöð†üöƒù膃ˆñhòX†ƒúþŸhôhƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöhòĆˆ¦õ·ä†‹Ø’ÍþøôüÚhñ¸†ˆ›‹†Òöhðü†ˆ›­ìò†Òöð†ƒùð†ƒùhð†ˆ›­ìò†Òöò†ƒùhïP†ˆ›‹†óßö脌ƒóƒù؆ˆþöhî8†ˆ›ŸìØöhí`†ˆ›»ì†ì†ì†Òöhì°ˆ›­ì†ì†Òöʆˆþöö†üò†ƒùö†ühëH†ˆ›­ì†ì†Òöhꌆˆ›­ì†ì†óßöð†ƒùЈŸßöð†ƒùh醈›§òò†Òöð†ƒùò†ƒùð†ƒùö†ühçø†ˆ›­ì†ìØöð†ƒùö†üö†üh熈›‹†Òöð†ƒùhæ|†ˆ›‘Òöˆ›‘óßöð†ƒùò†ƒùð†ƒùò†ƒùð†ƒùö†üö†ühä|†ˆ›»ì†ìò†Òöh㤆ˆ›»ì†ì†ì†Òö؆ˆþöð†ƒùhâH†ˆ›hã,ìò†ìò†Òööƒùhàx„hâ ƒhà„ƒúþŸhâƒùꆄ‚öꆆöhà䆈¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒùð†ƒùhß0†ˆ›§†ì†ì†Òö膃ˆñ脌ƒóƒùhÞ8†ˆ›Ÿì†Òö脌ƒóƒùhÝl†ˆ›Ÿì†ÒöhÜ”†ˆ›»ì†ì†ì†ÒöhÛ¼†ˆ›»ì†ì†ì†Òöüüð†ƒùhÚ †ƒˆˆhÛ€ì†ìòò†ì†Øð†ƒùhÙ¬†ˆ›»ì†ì†ì†ÒöhØð†ˆ›­ìò†ÒöhØ4†ˆ›­ìò†Òöð†ƒùð†ƒùh×Lˆ›­ìòùßöð†ƒùhÖ †ˆ›‘ÒöhÕ¬†ˆ›µòòò†Òöð†ƒùð†ƒùö†ühÔŒ†ˆ›»ì†ì†ì†ÒöhÓ솈›Ÿì†ÒöhÓ†ˆ›»ì†ì†ì†ÒöhÒ<†ˆ›»ì†ì†ì†ÒöhÑ€†ˆ›­ì†ì†Òö؆ˆþöhÐ\†ˆ›»ì†ì†ì†ÒöhÏ„†ˆ›»ì†ì†ì†Òöhά†ˆ›»ì†ì†ì†Òööƒù̆ƒˆˆ‘ØhÍŒ†ˆ›Ÿì†Òöò†ƒùhÌH†ˆ›hÍdì†ìòò†ìòØöò†ƒùhËt†ˆ›­ìò†ÒöhÊœ†ˆ›»ì†ì†ì†Òöö†ühʆˆ›‘Òöð†ƒùð†ƒùð†ƒùhÈ܆ˆ›»ì†ì†ì†Òöˆ›‘Òöö†üʆˆþöð†ƒùhÇ$†ˆ›‹†óßöhÆ0†ˆ›µ†ì†ìòØöð†ƒùhÅX†ˆ›™†ìùßö膃ˆñð†ƒùhÄp†ˆ›Ÿì†Òöð†ƒùð†ƒùò†ƒùð†ƒùhÀ†ˆ›‘Òöò†ƒù؆ˆþö؆ˆþöhÁˆ†ˆ›h˜†ìò†ìò†ì†ì†Òöò†ƒùöƒùhÀІˆ›‘ÒöhÀ0†ˆ›Ÿì†Òöh¿¬†ˆ›‘Òöð†ƒùh¾¸†ˆ›»ì†ìò†Òöð†ƒùò†ƒùð†ƒùh½†ˆ›»ì†ì†ì†Òöh¼ð†ˆ›‹†Òööƒùò†ƒùð†ƒùò†ƒùò†ƒùò†ƒùh»œ†ˆ›™†ì†Òöh»ˆ›‹Øöhº\†ˆ›Ÿì†óßöö†üh¹X†ˆ›hº<ì†ì†ì†ì†Òöð†ƒùh¸œ†ˆ›Ÿì†Òöð†ƒùh·¨†ˆ›»ì†ì†ì†Òöð†ƒùh·†ˆ›‘ÒöhµÜ†ˆ›h¶øì†ìò†ìòò†Òöh´Øˆ›hµ¤òòòò†Òöh´H†ˆ›‘Òöð†ƒùh³8†ˆ›µòòò†Òö膃ˆñ؆ˆþöh²†ˆ›™ò†Òöh±d†ˆ›Ÿì†Òöh°p†ˆ›h±Tìò†ìò†Òööƒùð†ƒùh¯˜†ˆ›Ÿì†Òöò†ƒùö†üð†ƒùð†ƒùøƒùò†ƒùh­”†ˆ›h®øì†ìꆋáò†ìòò†Òöò†ƒùð†ƒùð†ƒù膃ˆñð†ƒùh¬$†ˆ›»ì†ì†ì†Òöh« †ˆ›‘Òöhª¬†ˆ›h«ìò†ìò†Òöh©üˆ›­ì†ì†Òöh©4†ˆ›™†ì†Òöh¨\†ˆ›§òò†ÒöÔ†ƒˆ‹†àh§L†ˆ›™†ì†Òöö†üh¦œ†ˆ›‹†Òöö†üö†üh¥Ü†ˆ›ŸìØöö†üöüð†ƒùò†ƒùh¤ü†ƒˆˆ‹†Øð†ƒùð†ƒùð†ƒùð†ƒùh£Ð†ˆ›­ì†ì†Òöö†üøƒùò†ƒùð†ƒù膃ˆñò†ƒùð†ƒùh¢†ˆ›‘Òöh¡œ†ˆ›µòò†ì†Òöh ü†ˆ›‹†Òö膃ˆñ膃ˆñö†ühŸ¼†ˆ›»ì†ì†ì†Òöö†ü؆ˆþöhžl†ˆ›hŸPì†ì†ì†ì†Òöh”†ˆ›»ì†ì†ì†Òöhœ¼†ˆ›»ì†ì†ì†Òöö†ühœˆ›Ÿì†Òöh›l†ˆ›‹†óßöò†ƒùhšD†ˆ›h›†ì†ìòò†Òöð†ƒùh™P†ˆ›»ì†ì†ì†Òöh˜@†ˆ›h™@ìò†ìò†ì†Òöh—†ˆ›h˜0ìò†ìòòò†Òöö†üñð†ƒù膃ˆñh‘À„h–„ƒh‘̃šøh–þŽþþh‘êh–h‘æþŸh•ðƒùh”8†ˆ¦õh•¬†ìò†ì†ìòò†ì†ì†ì†Êþøh“ˆ†ˆ¦õ§ì†ëßþøh’,„h’Ôˆ¦õ§‹á†Êþh’8ˆ¦õ™‹h’DþøôüÚ脌ƒóƒùö†üh¬†ˆ›»ì†ì†ì†Òöö†ü脌ƒóƒùüüö†ü膃ˆñhh†ˆ›™†ì†Òöò†ƒùhŽÌ†ˆ›‘óßö؆ˆþöhü†ˆ›‘Òöh@†ˆ›­ì†ì†óßöhŒh†ˆ›»ì†ìò†Òöh‹†ˆ›»ì†ì†ì†ÒöhЏ†ˆ›»ìòò†Òöò†ƒùñh‰¸†ˆ›­ìò†Òö؆ˆþöhˆ”†ˆ›»ì†ì†ì†Òöð†ƒùˆ›„ßöð†ü膃ˆñh†€†ˆ›h‡œìòò†ìò†ì†Òöh…à†ˆ›Ÿì†óßöò†ƒùh„ð†ˆ›§†ì†ì†Òöh„P†ˆ›Ÿì†Òöð†ƒùhƒx†ˆ›™†ì†Òöð†ƒùö†üð†ƒùð†ƒùh‚t†ˆ›Ÿì†Òöhœ†ˆ›»ì†ìò†Òöh€à†ˆ›­ì†ì†Òööüð†ƒùh€$†ˆ›„ßöð†ƒùð†ƒùö†üh†ˆ›»ì†ì†ì†Òöö†üh~†ˆ›»ìòò†Òöð†ƒùøƒùò†ƒùh|܆ˆ›h}Àì†ìòò†Òöð†ƒùh| †ˆ›Ÿì†óßöð†ƒùð†üh{†ˆ›»ì†ì†ì†Òöö†ühz(†ˆ›»ì†ì†ì†Òöhyˆ†ˆ›Ÿì†Òööƒùhx膈›‘Òö膃ˆñhx†ˆ›­ì†ì†Òöð†ƒùð†ƒùò†ƒùhv؆ˆ›»ì†ì†ì†Òöò†ƒùhu”†ˆ›hv°ìò†ìò†ì†ì†Òöö†üht¬†ˆ›»ì†ì†ì†Òöhsð†ˆ›­ì†ì†Òöö†ühs0†ˆ›‹†‹Çööƒùð†üò†ƒùhr$†ˆ›™†ì†Òöhq„†ˆ›Ÿì†óßöhpȆˆ›™†ì†ÒöhoÔ†ˆ›µò†ì†ìØöho4†ˆ›ŸìØöhnx†ˆ›­ì†ì†óßöö†ühmȆˆ›Ÿì†Òöhlð†ˆ›»ì†ì†ì†Òöˆ›‘óßöð†ƒùð†ƒùð†ƒùð†ƒùö†ühk†ˆ›»ì†ì†ì†Òöhj<†ˆ›»ìòò†ÒöÞ“õþþøð†ƒùhi4†ˆ›‹†Òöò†ƒùð†ƒùð†ühh(†ˆ›­ì†ì†Òöð†ƒùhg4†ˆ›»ì†ì†ì†Òöhf\†ˆ›»ì†ì†ì†Òöhe†ˆ›hf$†ìò†ìò†ì†ì†Òöò†ƒùhdx†ˆ›‘Òöhc¼†ˆ›­ìò†ÒöÔˆ›ãöò†ƒù膃ˆñð†ƒùha솈›hbìì†ìò†ì†ì†ÒöhaL†ˆ›ŸìØöò†ƒùh`@†ˆ›ha$ìòòò†Òöh_h†ˆ›§ò†ì†Òö膃ˆñʆˆþö膃ˆñh^$†ˆ›‘óßöh]h†ˆ›­ìò†Òöh\†ˆ›»ì†ìò†Òöð†ƒùh[Ô†ˆ›‹†óßöÞ“õþþøð†ƒùhZ膈›‘Òöð†ƒùhZH†ˆ›‘Òöð†ƒùð†ƒùhX¬†ˆ›hZìò†ì†ì†ìò†ìò†ÒöhWð†ˆ›­ìò†Òö؆ˆþö؆ˆþöhVœ†ˆ›­ì†ì†ÒöʆˆþöøƒùhU`†ˆ›­ìò†ÒöhT܆ˆ›‘óßöð†ƒùò†ƒùð†ƒùhS|†ˆ›hT|ì†ìò†ì†ì†ÒöhR¤†ˆ›»ì†ì†ì†ÒöhR†ˆ›Ÿì†Òöò†ƒùhQL†ˆ›‹†ÒöhP<†ˆ›hQ<ì†ì†ìò†ì†ÒöhO†ˆ›hP,ìò†ìò†ì†ì†ÒööühNT†ˆ›‹†ÒöhM´†ˆ›Ÿì†óßöð†ƒùhLÀ†ˆ›§†ì†ì†Òöò†ƒù膃ˆñð†ƒùhKÀ†ˆ›‹†Òöð†ƒùð†ƒùö†ühJ„†ˆ›hKhì†ì†ì†ì†ÒöhI䆈›Ÿì†ÒöhID†ˆ›Ÿì†ÒöhHl†ˆ›»ì†ì†ì†ÒöhG”†ˆ›»ì†ì†ì†ÒöhF¼†ˆ›»ì†ì†ì†Òöð†ƒùöƒùð†ƒùð†ƒùhE †ˆ›hFòòòòò†Òöð†ƒùhD€†ˆ›‘Òöò†ƒùò†ƒùð†ƒùhC”†ˆ›Ÿì†Òöö†ühB䆈›Ÿì†ÒöhBD†ˆ›Ÿì†Òööƒùð†ƒùð†ƒùhA4†ˆ›™ò†Òöh@°†ˆ›‘Òöh@,†ˆ›‘Òöʆˆþöʆˆþöh>„†ˆ›»ì†ì†ì†Òöö†üö†üò†ƒùh=¬†ˆ›ŸìØöˆ›‘óßöh<¤†ˆ›‘Òöh;°†ˆ›µòò†ì†Òöh;†ˆ›Ÿì†Òöö†üh:|†ˆ›ãöh9ø†ˆ›‘Òöö†üò†ƒùò†ƒùh9$ˆ›Ÿì†Òö؆“õþþøØ†“õþþøh7à†ˆ›‹Øöh7@†ˆ›Ÿì†Òöð†ƒùh6„†ˆ›Ÿìùßöh5t†ˆ›h6L†ì†ìòò†Òöð†ƒùh4¸†ˆ›‹†Òöò†ƒùˆ›‘Òöh3`†ˆ›™†ì†Òöh2܆ˆ›‘Òöð†ƒùh1膈›»ìò†ì†Òöh1d†ˆ›‘Òö脌ƒóƒùh0`†ˆ›»ì†ì†ì†Òöh.˜†ƒŽúþŸh0Tƒùꆄ„þöꆄ„þöꆆöh/†ˆ¦õ·ä†‹Ø’ÍþøôüÜöƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùh,Ćˆ›»ì†ì†ì†Òöh,†ˆ›­ì†ì†óßöh+0†ˆ›»ì†ì†ì†Òöh*†ˆ›‹†Òöh* †ˆ›‘Òöh)ˆ†ˆ›‘Òöð†ƒùˆ›ãö؆“õþþøh(†ˆ›‘Òöh'†ˆ›h(ì†ìò†ì†ì†Òö膃ˆñð†ƒùð†ƒùö†üh%¼†ˆ›»ìòò†Òöh%†ˆ›ŸìØöˆ›‘Òöò†ƒùh$†ƒˆˆ‹†Øò†ƒùh#d†ˆ›‘Òöð†ƒùð†ƒùh!Ȇˆ›h#ìò†ì†ì†ìò†ìò†Òöh! †ˆ›­ìò†Òöð†ƒùh †ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†ühD†ˆ›h`ì†ì†ì†ìò†ì†Òöh¤†ˆ›ŸìØöÞ“õþþøò†ƒùð†ƒùð†ƒùh0†ˆ›»ìòò†Òöð†ƒùh@†ˆ›hì†ì†ì†ì†ì†ìòò†ìò†ì†ìØöò†ƒùhP†ˆ›»ìòò†Òö脌ƒóƒùò†ƒùh4†ˆ›§†ìò†ÒöhP“¼hŠ˜þ˜h¬ˆ’hH‚ˆ’Âü–ühˆhèhlöh`›‹Øöhl†ˆ›»ìòò†Òöò†ƒùh˜†ˆ›­ì†ì†Òöð†üh†ˆ›hlì†ìò†ì†ì†ìòòØöò†ƒù膃ˆñð†ƒùhü†ˆ›­ì†ì†Òöð†ƒùˆ›‘Òöʆˆþöh8†ˆ›™ò†Òöh`†ˆ›»ì†ì†ì†Òöò†ƒùö†üò†ƒùh œ†ˆ›‘Òöð†ƒùh ˆ›h pì†ì†h †‹ˆ™ò†ÈØöʆˆŸßöð†ƒùh 膈›Ÿì†óßöh d†ˆ›‘Òöh p†ˆ›µò†ì†ìØöh솈›‘Òöʆˆþöh䆈›ŸìØöhÔ†ˆ›hÔì†ìòò†ìØöh†ˆ›™†ì†Òöö†üö†üh †ˆ›»ì†ì†ì†Òö؆ˆþöh†ˆ›­ì†ì†Òöhx†ˆ›‹†Òööüð†ƒùh¼†ˆ›‘Òöð†ƒùð†ƒùð†ƒù膃ˆñð†ƒùhH†ˆ›»ì†ì†ì†Òöö†üö†üò†ƒùÞ“õþþøð†ƒùgÿ솈›™†ì†óßögý솃úþŸgÿÄ„„þö䆄„þö䆄„þöꆆögþX†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùð†ƒùð†ƒùö†üö†ügü°†ˆ›µì†ä†‹Çögü,†ˆ›‘Òöð†ƒùgûˆ¤“õþþÚ“õþþøò†ƒùð†ƒùgú<†ˆ›gû†ìò†ìòØöò†ƒùð†ƒùö†ügùt†ˆ›‘Òöö†üö†üð†ƒùgø(†ˆ›gù(ìò†ìò†ì†Òög÷xˆ›™†ìØögô|†“¼gõÈŠ˜þ˜gö䈒gö€‚ˆ’Âü–ügõÀgõ gõ¤ögô˜›‹Øöð†ƒùgóÀ†ˆ›Ÿì†Òögó<†ˆ›‘Òöð†ƒùð†ƒùð†ƒùgò†ˆ›»ì†ì†ì†ÒögñŒ†ˆ›‘Òö脌ƒóƒùgð\†ˆ›gñPì†ì†ì†ä†‹Çö膃ˆñgït†ˆ›­ìò†Òööƒùgˆ›§†ì†ì†óßögíà†ˆ›Ÿì†óßööƒù膃ˆñò†ƒùgì䆃ˆˆ­ìò†Øð†ƒùgëð†ˆ›»ì†ì†ì†Òög놈›»ì†ì†ì†ÒögéІˆ›gëì†ì†ì†ìò†ì†ì†Òöüüð†ƒùgè°†ˆ›gé”ì†ì†ì†ì†Òöð†ƒùgç †ˆ›gè„ì†ìòòØöò†ƒùg攆ˆ›gçxì†ì†ì†ìØög娆ˆ›™ò†Òög冈›»ì†ì†ì†Òögä(†ˆ›»ì†ì†ì†ÒöЈŸßöð†ƒùgâ°†ˆ›µ†ìòò†Òöò†ƒùgሆˆ›gâ`†ì†ì†ìòØöò†ƒùð†ƒùʆˆþögàP†ƒˆˆ™†ì†Øö†ü؆ˆþö脌ƒóƒùö†üö†ü؆ˆþö؆ˆþöð†ƒùøƒùð†üò†ƒùð†ƒùgÝD†ˆ›gÞT†ìòò†ìòò†Òöò†ƒùgÜp†ˆ›­ì†ì†óßögÛ܆ˆ›™ëŠÕöö†ügÚô†ˆ›»ì†ì†ì†ÒögÚ`ˆ›‹†Òöò†ƒùð†ƒùʆˆŸßöð†ƒùgØü†ˆ›‹†Òöð†ƒùg؆ˆ›»ì†ì†ì†Òög×0†ˆ›»ì†ì†ì†ÒögÖt†ˆ›­ì†ì†óßöð†ƒùgÕ€†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†üöƒùgÔ†ˆ›™ò†óßöð†ƒùgÒÔ†ˆ›gÓ¬†ìò†ìòØöð†ƒùð†ƒùgÑü†ˆ›Ÿì†Òöö†üð†ƒùð†ƒùgÐ܆ˆ›»ì†ì†ì†ÒögІˆ›»ì†ì†ì†ÒögÏd†ˆ›Ÿì†Òö膃ˆñöƒùð†ƒù膃ˆñð†ƒùgÍĆˆ›gΨìòò†ì†Òöð†ƒùg͆ˆ›Ÿì†Òöò†ƒù؆ˆþögÌ †ˆ›‘Òöð†ƒùgË,†ˆ›»ì†ì†ì†ÒögÉăˆúþŸgˈþögÊ4†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üð†ƒùgÈ솈›Ÿì†ÒögȆˆ›»ì†ì†ì†ÒögÇ<†ˆ›»ì†ì†ì†Òöøƒùð†ügÆh†ˆ›‹†ÒögÅ䆈›ãögÅ`†ˆ›‘ÒögĈ†ˆ›»ì†ì†ì†ÒögÃ̆ˆ›­ì†ì†Òögƈ›­ì†ìØöð†ƒùò†ƒùöƒùð†ƒùð†ƒù膃ˆñð†ƒùgÁÀ†ƒˆˆ‹†Øð†ƒùð†ƒùgÀ°†ˆ›»ì†ì†ì†Òöð†ƒùò†ƒùò†ƒùg¿Ä†ˆ›‹Øöð†ƒùg¾Ü†ˆ›µì†ä†‹Çöð†ƒùö†üö†üð†ƒùð†ƒùð†ƒùöƒùð†üg½†ˆ›‘óßög½ †ˆ›‘Òög¼l†ˆ›Ÿì†Òög»”†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒùgº„†ˆ›»ì†ì†ì†Òög¹Ôˆ›­ì†ì†Òög¹ †ˆ›™†ì†Òö膃ˆñð†ƒùð†ƒùð†ƒùg¸†ˆ›‘Òöò†ƒùg·†ˆ›§†ì†ì†óßöö†üö†üg¶<†ˆ›­ì†ìØö脌ƒóƒùö†ügµD†ˆ›­ì†ì†Òöð†ƒùöƒùð†ƒù膃ˆñg³Ð†ˆ›µòòò†Òöò†ƒùð†ƒùg²Ä†ˆ›§òò†Òöð†ƒùg²†ˆ›Ÿì†Òög°°†ˆ›g±øì†ì†ä†‹áòòò†Òöð†ƒùg°†ˆ›‘óßög¯8†ˆ›»ì†ì†ì†Òöò†ƒùð†ƒùg®,†ˆ›»ì†ì†ì†Òöö†üg­D†ˆ›»ì†ì†ì†Òöð†ƒùg«ü†ˆ›g­ì†ì†ì†ìò†ì†Òöò†ƒùg«(†ˆ›­ì†ì†óßööƒùgªP†ˆ›™òùßöò†ƒùò†ƒùg¨Ø†ˆ›g©è†ìòò†ìòò†Òöð†ƒùg¨†ˆ›­ì†ì†óßöð†ƒùg§(†ˆ›™†ì†Òög¥ü†ˆ›g§ìò†ìò†ì†ì†Òö؆ˆþög¤ô†ˆ›­ì†ì†Òö脌ƒóƒùö†üg¤†ˆ›Ÿì†Òöøƒùò†ƒùð†ƒùg¢Ø†ˆ›g£¼ìò†ì†ì†Òög¢T†ˆ›‘Òöð†ƒùg¡˜†ˆ›‹†Òög¡†ˆ›‘Òög †ˆ›ãögŸð†ˆ›‹†Òöð†ƒùð†ƒùÚ†ƒˆñgž˜†ˆ›»ì†ì†ì†Òögø†ˆ›‹†Òöö†üð†üˆ›‘Òö؆“õþþøò†ƒùò†ƒùò†ƒùð†ƒùg›ø†ˆ›‹†Òöò†ƒùgšì†ˆ›g›Ðì†ìòòØögš4†ƒˆˆ§†ì†ì†Øg™\†ˆ›§†ì†ì†óßöö†üð†ƒùð†ƒùö†üg˜,†ˆ›»ì†ì†ì†Òöö†üg— †ˆ›g˜ ì†ì†ì†ì†ì†Òög–l†ˆ›ŸìØög•؈›Ÿì†Òöð†ƒùg”¼†ˆ›µ†ìòò†Òög“¬†ˆ›g”„†ì†ì†ìòØöò†ƒùð†ƒùð†ƒùò†ƒùg’À†ˆ›„ßöö†üg‘œ†ˆ›g’ ä†‹Ù†‹áò†Òögà†ˆ›­ìò†Òög$†ˆ›­ì†ì†ÒögL†ˆ›»ì†ì†ì†ÒögŽÈ†ˆ›‘Òöð†ƒùüüð†ƒùʆˆþög\†ˆ›™†ìØöð†ƒùgŒ„†ˆ›™†ì†Òö؆ˆþög‹|†ˆ›­ì†ì†Òöö†üöƒùð†ƒùð†ƒùò†ƒùgŠ(†ˆ›»ì†ì†ì†Òö؆ˆþö̆ƒŽü˜þò„þåö†üöƒùð†ƒùgˆ †ˆ›gˆø†ìò†ìòØöð†ƒùò†ƒù脌ƒóƒùg‡<†ˆ›‘Òög†d†ˆ›»ìò†ì†Òög…¨†ˆ›™†ì†Òö؆ˆþöð†ƒùg„0†ˆ›g…0ìò†ìò†ì†Òööƒùò†ƒùò†ƒùð†ƒùgƒD†ˆ›‘Òöò†ƒùg‚t†ƒˆˆ§†ì†ì†Øö†ügŒ†ˆ›»ì†ì†ì†Òög€´†ˆ›»ì†ì†ì†Òööƒùg€†ˆ›‘Òöò†ƒùð†ƒùg$†ˆ›­ìò†Òög~„†ˆ›‹Øöð†ƒù膃ˆñg}¸†ˆ›‘Òöò†ƒùÔ†ƒˆ‘àò†ƒùg|”†ˆ›Ÿì†Òöð†üg{¼†ˆ›­ì†ìØög{†ˆ›Ÿì†ÒögzD†ˆ›»ì†ì†ì†Òö膃ˆñò†ƒùˆ›‘Òöð†ƒùð†ƒùgx¤†ˆ›Ÿì†Òöò†ƒùʆˆŸßögw †ˆ›‘óßögw†ˆ›Ÿì†Òögv`†ˆ›Ÿì†Òö؆ˆþö؆ˆþöò†ƒùgtô†ˆ›­ì†ì†óßögt†ˆ›§òòØöˆ›‘óßöð†ƒùgr܆ˆ›Ÿì†Òöò†ƒùgrD†ƒˆˆ‹†Øð†ƒùgqP†ˆ›»ì†ì†ì†Òögp$†ˆ›gq†ìòò†ìò†óßöð†ƒùö†ü؆ˆþöð†ƒù脌ƒóƒùð†ƒù؆ˆþögn$†ˆ›»ì†ì†ì†Òögmh†ˆ›­ì†ì†óßögl†ˆ›»ì†ì†ì†Òöò†ƒùgk؆ˆ›Ÿì†Òögk†ˆ›»ìò†ì†Òögjlˆ›Ÿì†ÒögiÀ†ˆ›Ÿì†Òögi †ˆ›Ÿì†Òögh€†ˆ›‹†Òögg¨†ˆ›»ì†ì†ì†Òöò†ƒùgf¸†ˆ›§†ì†ì†ÒögeĆˆ›µ†ìò†ì†Òöö†ügd܆ˆ›»ì†ì†ì†Òöö†üò†ƒùgd ˆ›‹†Òöð†ƒùgc$†ƒˆˆgcèì†ì†ìòÞð†ƒùgbX†ˆ›§ä†‹Çöga¸†ˆ›Ÿì†Òöö†üg`܈›»ìòò†Òög`0†ˆ›‹†Òög_¬†ˆ›‘óßöð†ƒùg]Œ†ƒˆúþŸg_„ƒùꆄ„þöꆄ„þöꆄ„þöꆈþög^†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùg\솈›„ßöð†ƒùg\L†ˆ›‘Òög[¬†ˆ›ŸìØööƒùg[ †ˆ›‘Òöò†ƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùgYœ†ˆ›»ì†ì†ì†ÒögXĆˆ›»ì†ì†ì†ÒögX$†ˆ›Ÿì†Òö膃ˆñöƒùgV膈›gWÌìòò†ì†Òöð†ƒùò†ƒùgU܆ˆ›»ì†ì†ì†ÒöÞ“õþþøö†ügTp†ˆ›gUpì†ìò†ì†ì†ÒögS솈›‘óßöð†ƒùð†ƒùö†üð†ƒùð†ƒùgR膈›‘Òö؆ˆþögQĆˆ›»ì†ì†ì†Òöð†ƒùö†üò†ƒùð†ƒùÞ“õþþøð†ƒùð†ƒùgP@†ˆ›Ÿì†ÒögO†ˆ›gP†ì†ìòò†ì†Òöð†ƒùð†ƒùgN†ˆ›»ìò†ìØögMT†ˆ›Ÿ‹á†Òöð†ƒùgL`†ˆ›»ì†ì†ì†ÒöøƒùgKŒ†ˆ›­ì†ì†ÒögJІˆ›­ìò†Òöð†ƒùgIø†ˆ›­ì†ì†ÒögI<†ˆ›™†ì†Òö膃ˆñgHT†ˆ›­ì†ì†Òöò†ƒùgGd†ˆ›»ìò†ì†ÒögF¨†ˆ›­ì†ì†Òöò†ƒùð†ƒùð†ƒùgEœ†ˆ›™†ì†ÒögDü†ˆ›Ÿì†ÒögDx†ˆ›‘ÒögC¼†ˆ›­ìòØöð†ügB䆈›­ìò†Òöˆ›‘óßöð†ƒùgAÀ†ˆ›‘ÒögA †ˆ›Ÿì†óßöð†ƒùò†ƒùg@L†ˆ›Ÿì†óßöð†ƒùð†ƒùg?t†ˆ›Ÿì†Òög>¸†ˆ›­ìò†Òöö†üò†ƒùg=ð†ˆ›ŸìØög=@ˆ›­ì†ìØöð†ƒùò†ƒùð†ƒùg;¸†ˆ›g<¬†ì†ìòò†ì†Òöð†ƒùg;†ˆ›‘Òöò†ƒùð†ƒùð†ƒùð†ƒù؆ˆþög9ˆ†ˆ›»ì†ì†ì†Òög8°†ˆ›»ì†ì†ì†Òög7؆ˆ›»ì†ì†ì†Òög7Dˆ›‹†Òöð†ƒùg6|†ˆ›Ÿì†Òög5ü†ƒˆˆ‹†Øg5†ˆ›µ†ì†ì†ì†Òög4„†ˆ›‘Òög3¬†ˆ›»ìò†ì†Òöö†üð†ƒùg2à†ˆ›Ÿì†Òög2$†ˆ›­ì†ì†Òög1L†ˆ›»ì†ì†ì†Òög0¬†ˆ›Ÿì†Òög0 †ˆ›Ÿì†Òö脌ƒóƒù脌ƒóƒùg.ø†ˆ›­ì†ì†Òög.X†ˆ›ŸìØöñg-p†ˆ›­ìò†Òöð†ƒùð†ƒùg,|†ˆ›™†ì†Òö脌ƒóƒùö†üg+ †ˆ›ŸìØöò†ƒùˆ›‘óßöð†ƒùð†ƒù膃ˆñð†ƒùð†ƒùð†ƒùg)Ȇˆ›‘Òög(ð†ˆ›»ì†ì†ì†Òöö†üg(@†ˆ›Ÿì†Òög'h†ˆ›»ì†ì†ì†Òög&†ˆ›»ì†ì†ì†Òög%¸†ˆ›»ì†ì†ì†Òöò†ƒùð†ƒùøƒùg$膈›‘óßöð†ƒùg#¼†ˆ›g$¼ì†ì†ìò†ì†Òög#†ˆ›Ÿì†Òö膃ˆñò†ƒùð†ƒùð†ƒùg!¸†ˆ›g"ì†ì†ä†‹Çög!†ˆ›Ÿì†Òög x†ˆ›Ÿì†Òög †ˆ›»ì†ì†ì†Òög†ˆ›ŸìØögÔ†ˆ›gðì†ìò†ìòò†Òööƒùgü†ˆ›­ì†ì†Òög\†ˆ›‹†Òöð†ƒùöüg„†ˆ›‹†Òöò†ƒùð†ƒùğˆ›‘ÒögH†ˆ›„ßögp†ˆ›§†ì†ì†ÒögD†ˆ›g`ì†ìò†ìò†ì†Òöö†üð†ƒùgx†ˆ›Ÿì†Òög †ˆ›»ì†ì†ì†Òöö†üÞ“õþþøg¤†ˆ›‹†Òög†ˆ›Ÿì†óßöð†ƒùʆˆþöð†ƒùg¨†ˆ›­ì†ì†Òö؆ˆþög܆ˆ›gLì†ì†ìò†ì†ìòò†ì†Òög<†ˆ›Ÿì†Òöð†ƒùñð†ƒùð†ƒùʆˆŸßög˜†ˆ›™†ìØögˆ†ˆ›g`ò†ì†ìòØög ¼†ƒúþŸg|ƒùꆄ‚öꆄ‚öꆆög (†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùg Ȇˆ›»ìò†ì†Òög €†ˆ›g †ìò†ìò†ì†ì†Òög à†ˆ›Ÿì†ÒöÞ“õþþøö†ü膃ˆñò†ƒùð†ƒùð†ƒùð†ƒùö†üö†ü؆ˆþög¨†ˆ›»ìò†ì†Òög†ˆ›ŸìØög0†ˆ›»ì†ì†ì†ÒöÞ“õþþøgD†ˆ›Ÿì†Òöò†ƒùð†ƒù؆ˆþö؆ˆþöÀ†ƒŽü¤þò„þò„þåö†ügL†ˆ›Ÿì†Òög¬†ˆ›ŸìØögð†ˆ›­ì†ì†Òögü†ˆ›gàìò†ìò†Òöghˆ›Ÿì†Òöfÿ †ˆ›™†ì†Òöfÿ†ˆ›Ÿì†Òöò†ƒùfþ,†ˆ›­ì†ì†Òöð†ƒùfý8†ˆ›»ìòò†Òöð†ƒùð†ƒùfü`†ˆ›‹†Òöò†ƒùð†ƒùfû`†ˆ›¡†ä†‹ÇöfúÀ†ˆ›‹†Òö؆ˆþööƒùfùd†ˆ›fúHìòò†ì†Òöð†ƒùføÄ†ˆ›ãöð†ƒùfø†ˆ›‹†óßöö†üf÷ †ˆ›»ì†ì†ì†ÒöföH†ˆ›»ì†ì†ì†Òö؆ˆþöò†ƒùð†ƒùfôüˆ›»ì†ì†ìØö膃ˆñð†ƒùð†ƒùð†ƒùf󘆈›»ì†ì†ì†Òöð†ƒùö†ü脌ƒóƒùfò„†ˆ›­ì†ì†ÒöfñȆˆ›­ì†ì†Òöfñ†ˆ›Ÿ‹áØöfð†ˆ›fñìò†ì†ì†ì†ÒöøƒùfïP†ˆ›Ÿì†Òöò†ƒùð†ƒùö†üð†ƒùf›»ì†ì†ì†Òöfí@†ˆ›»ì†ìò†Òöò†ƒù؆ˆþöfì †ˆ›­ìò†ÒöfëH†ˆ›»ì†ì†ì†Òöfêp†ˆ›»ì†ì†ì†Òöfé`†ˆ›fê`ì†ì†ì†ìò†ÒöÞ“õþþøfç`„féƒfçlƒúþŸfèøƒùꆄ‚öꆆöfç̆ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùfæP†ˆ›§ò†ì†óßöfå\†ˆ›fæ@ìò†ìò†Òöf伆ˆ›Ÿì†Òöfä<†ƒˆˆ‹†ØfãH†ˆ›µ†ì†ì†ì†Òöf⌆ˆ›­ì†ì†óßöð†ƒùfᘆˆ›»ì†ì†ì†Òöö†üö†ü؆ˆþö膃ˆñøƒùò†ƒùfà†ˆ›­ì†ì†ÒöfßX†ˆ›™†ì†ÒöfÞœ†ˆ›­ì†ì†Òö膃ˆñfÝІˆ›Ÿì†Òöö†üò†ƒùð†ƒùfÜ솈›Ÿì†Òöö†ü؆ˆþöfÛÔ†ˆ›­ìò†ÒöÞ“õþþøfÚ̆ˆ›™ò†Òö膃ˆñfÚ†ˆ›Ÿì†óßöò†ƒùfÙH†ˆ›Ÿì†óßöò†ƒùð†ƒùf؆ˆ›ãöð†ƒù膃ˆñð†ƒùf׌†ˆ›Ÿì†ÒöfÖ´†ˆ›»ì†ì†ì†ÒöfÖ0†ˆ›‘Òööƒùð†ƒùð†ƒùfÕX†ˆ›‘óßöð†ƒùö†üfÔD†ˆ›fÕì†ì†ä†‹ÇöfÓl†ˆ›»ì†ì†ì†Òö؆ˆþöfÒd†ˆ›­ì†ì†ÒööƒùfÑD†ˆ›µ†‹á†ì†ì†ÒöfФ†ˆ›Ÿì†Òöð†ƒùð†ƒùfÏ”†ˆ›»ìò†ìØöð†ƒùð†ƒù؆ˆþö؆ˆþöfÍ솈›»ì†ì†ì†ÒöfÍL†ˆ›Ÿì†ÒöfÌt†ˆ›»ì†ì†ì†Òöð†ƒùf˨ˆ›™†ì†ÒöfÊü†ˆ›Ÿì†Òöð†ƒùð†ƒùʆˆŸßöʆˆŸßöò†ƒùfÉ<†ˆ›ŸìØöʆˆþöò†ƒùð†ƒùfÇȆˆ›»ì†ì†ì†Òö؆ˆþöfƈ†ˆ›fÇlìò†ìò†Òöüüð†ƒùð†ƒùò†ƒù膃ˆñfÅ@†ˆ›­ì†ì†ÒöfÄX†ˆ›»‹áòò†Òö膃ˆñð†ƒùð†ƒùð†ƒùfœ†ˆ›fÃÈìꆋá†ì†ì†ì†Òöð†ƒùfÁ¨†ˆ›»ì†ì†ì†ÒöfÀ솈›­ì†ì†ÒöfÀL†ˆ›Ÿì†Òöf¼@†ƒˆšøf¿àþŽþþf¼zf¿Ìf¼vþŸf¿¼ƒùf¾È†ˆ¦õf¿ ì†ì†ì†Êþøf¾†ˆ¦õ§ì†ëßþøf¼¼„f½dˆ¦õ§‹á†Êþf¼Èˆ¦õ™‹f¼ÔþøôüÒð†ƒùf»tˆ›™†ìØöʆˆŸßöð†ƒùfº(†ˆ›™†ìØöò†ƒùð†ƒùð†ƒùf¹†ˆ›»ì†ì†ì†Òöð†ƒùf¸ †ˆ›»ìò†ì†Òöøƒùð†ƒù膃ˆñð†ƒùf· †ˆ›‘Òöð†ƒùð†ƒù膃ˆñfµÜ†ˆ›­‹áò†Òöö†üfµH†ˆ›‘Òö؆ˆþöf´$†ˆ›»ì†ì†ì†Òö脌ƒóƒùf³ †ˆ›»ì†ì†ì†Òöf²H†ˆ›»ìò†ì†Òöö†üf±˜†ˆ›ŸìØöøƒùð†ƒùf°8†ˆ›f±Tì†ìò†ìò†ì†Òöf¯`†ˆ›»ì†ì†ì†Òöf®ˆ†ˆ›»ì†ì†ì†Òöò†ƒùf­ì†ˆ›‘Òöf­<ˆ›™†ì†Òö؆“õþþøò†ƒùf¬†ˆ›™ò†óßöð†ƒùf«T†ˆ›‹†Òöfª´†ˆ›Ÿì†óßöf©¤†ˆ›fª|òòòò†Òöð†ƒùf¨x†ˆ›f©xì†ìò†ì†ì†Òöð†ƒùf§„†ˆ›§ò†ì†Òöð†ƒùf¦¬†ˆ›­ìò†Òö؆ˆþöf¥À†ˆ›ŸìØöf¥,ˆ›Ÿì†Òöð†ƒùð†ƒùf£Ø†ˆ›f¤Øì†ì†ìò†ì†Òö膃ˆñð†ƒùf¢Ô†ˆ›™ò†Òöf¡ü†ˆ›»ì†ì†ì†Òöf ì†ˆ›f¡ìì†ì†ì†ì†ì†Òöö†üf <†ˆ›ŸìØöfŸ€†ˆ›­ì†ì†ÒöfžT†ˆ›fŸpì†ìò†ìòò†ÒöЈþöð†ƒùfL†ˆ›‘Òöfœ†ˆ›­ì†ì†Òöò†ƒùf›ô†ˆ›‘Òöð†ƒùf›†ˆ›­ìò†óßö膃ˆñ؆ˆþöf™Ì†ˆ›»ì†ì†ì†Òöð†ƒùøƒùf˜¤†ˆ›f™ˆìòòò†Òöð†ƒùf˜†ˆ›ãöð†üf–ô†ˆ›µ†ì†ìòØö膃ˆñò†ƒù膃ˆñð†ƒùf•†ˆ›»ì†ì†ì†Òöf”¸†ˆ›»ì†ì†ì†Òöf“à†ˆ›»ì†ì†ì†Òöf“$†ˆ›­ìò†Òöf’L†ˆ›»ì†ì†ì†Òöö†üf‘œ†ˆ›Ÿì†Òöøƒùf†ˆ›µòòò†óßöò†ƒùf †ˆ›§†ì†ì†Òöf†ˆ›‹†óßö膃ˆñò†ƒùö†üfÔ†ˆ›»ì†ì†ì†Òöö†üøƒùö†üò†ƒùð†ƒùfŒ†ˆ›§†ì†ìØöð†ƒùf‹Ô†ˆ›Ÿì†ÒöfŠà†ˆ›f‹Äìò†ì†ì†Òö؆ˆþöf‰ô†ˆ›Ÿì†Òöf‰T†ˆ›Ÿì†Òöö†üfˆl†ˆ›»ì†ì†ì†Òöf‡°†ˆ›­ìò†Òööƒù膃ˆñð†ƒù膃ˆñò†ƒùf†h†ˆ›Ÿì†Òöò†ƒùò†ƒùò†ƒùf…H†ˆ›»ì†ì†ì†Òöf„p†ˆ›»ì†ì†ì†ÒöfƒÐ†ˆ›Ÿì†ÒöЈŸßö؆“õþþøö†ü膃ˆñò†ƒùð†ƒùð†ƒùf‚ †ˆ›‘Òöf4†ˆ›»ì†ì†ì†Òö؆ˆþöf€H†ˆ›Ÿì†Òöfp†ˆ›»ì†ì†ì†Òöð†ƒùf~´†ˆ›ŸìØöf~†ˆ›ŸìØöˆ›‘Òöf|¸†ˆ›§†ì†ì†Òöf|†ˆ›Ÿì†Òöf{@†ˆ›§†ìòØöð†ƒùð†ƒùð†ƒùð†üfzL†ˆ›‘Òö脌ƒóƒùfy,†ˆ›µ†ì†ì†ì†Òö؆ˆþö؆ˆþöfwô†ˆ›ŸìØöfw8†ˆ›™†ì†Òööƒùò†ƒùð†ƒùð†ƒùð†ƒùð†ƒùð†ƒù脌ƒóƒùð†ƒùfuX†ˆ›»ìòò†Òöft€†ˆ›»ì†ìò†Òöð†ƒùöƒùò†ƒùð†ƒùð†ƒùfs†ˆ›fsèìòò†ì†Òöfrd†ˆ›‹†Òöfqp†ˆ›frTì†ìò†ìØö膃ˆñ脌ƒóƒùfp@†ˆ›»ì†ì†ì†ÒöfoL†ˆ›fp0ìò†ì†ì†Òöfn¬†ˆ›Ÿì†ÒöfmĆˆ›fnœä†‹á†ì†Òö؆ˆþö؆ˆþöö†üfk€†ˆ›fm ì†ì†ì†ì†ì†ì†ìò†ìò†Òööƒùfj¨†ˆ›­ìòØöfi˜†ˆ›fjp†ìò†ìòØöfh܆ˆ›™†ì†Òöð†ƒùfğˆ›µ†ì†ìò†óßöð†ƒùffL†ˆ›fg ì†ì†ì†ì†ì†ìòò†Òö膃ˆñ膃ˆñfeT†ˆ›‹Øö膃ˆñ؆ˆþöð†ƒùfc膈›»ì†ì†ì†Òöfc,†ˆ›­ìò†ÒöfbŒ†ˆ›ŸìØöfa솈›ŸìØöð†ƒùˆ›‘óßöf`œ†ˆ›Ÿ‹á†Òöf`†ˆ›‘Òöf_”†ˆ›‘Òöð†ƒùf^؆ˆ›Ÿì†Òöò†ƒùf]膈›»ì†ìòØöf\؆ˆ›f]Øì†ì†ì†ìò†Òöð†ƒùf\†ˆ›­ì†ì†Òöf[(†ˆ›»ì†ìò†ÒöfZˆ†ˆ›Ÿì†Òöò†ƒùfYІˆ›ŸìØöñfX̆ˆ›»ì†ì†ì†ÒöfW¼†ˆ›fX¼ì†ìò†ìò†Òöð†ƒùð†ƒùð†ƒùfV†ˆ›fWXì†ì†ì†ì†ì†ìòòØöð†ƒùfUH†ˆ›‹†ÒöfT¨†ˆ›Ÿì†ÒöfSІˆ›»ì†ì†ì†ÒöfS<ˆ›‹†Òö†ˆŸŠÕöfR†ˆ›‹†Òöð†ƒù膃ˆñfQL†ˆ›‘Òöò†ƒùfP†ˆ›fPü†ìò†ì†ì†ì†Òöð†ƒùfO†ˆ›»ì†ì†ì†Òöö†üfNd†ˆ›Ÿì†ÒöfMŒ†ˆ›»ì†ì†ì†ÒöfL솈›ŸìØöfL0†ˆ›™†ì†óßöfKœˆ›Ÿì†Òöð†ƒùò†ƒùfJ؆ˆ›‘ÒöfJT†ˆ›‘óßöfID†ˆ›fJ†ì†ì†ìòØöfHP†ˆ›fI4ì†ìò†ì†Òöð†ƒùð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùfB4†ˆ›fGœìòfBœ†‹šøfFìþŽþþfBÖfFØfBÒþŸfFȃùfF †ˆ¦õ§ì†ÊþøfE$†ˆ¦õfEüìòò†ÊþøfDt†ˆ¦õ§ì†ëßþøfC„fCÀˆ¦õ§‹á†ÊþfC$ˆ¦õ™‹fC0þøôüfBLöf@Іˆ›fAü†ìò†ìò†ìò†ì†Òöˆ›‘óßöò†ƒùò†ƒùð†ƒùð†ƒùf>¸†ˆ›f?¬ò†ìòò†ìùßöò†ƒùf>†ˆ›‘Òöf=D†ˆ›§†ì†ì†Òöf<¤†ˆ›‹†Òöf;̆ˆ›§ò†ì†Òöf;,†ˆ›ŸìØööüf:p†ˆ›Ÿì†Òöf9܆ˆ›‘‹Çöf8膈›µòòòØöf8d†ˆ›‘Òöð†ƒùð†ƒùö†üð†ƒùf7`†ˆ›Ÿì†Òöö†üf6@†ˆ›f7@ìòò†ì†ì†Òöf5 †ˆ›ŸìØöð†ƒùøƒùð†ƒù膃ˆñ膃ˆñf3”†ˆ›f4èì†ìòò†ìòòò†Òöf3†ˆ›‘Òöð†ƒùf2T†ˆ›‹†Òö膃ˆñ膃ˆñò†ƒù؆ˆþö؆ˆþöf0¬†ˆ›Ÿì†Òöf/Ô†ˆ›§ò†ì†Òöf/P†ˆ›‘ÒöÞ“õþþøö†üf.p†ˆ›„ßöò†ƒùð†ƒùf-¸†ˆ›‘óßöð†ƒùð†ƒùf,†ˆ›f-pì†ì†ì†ìò†ìòòØöö†üʆˆþöö†üð†ƒùf*؆ˆ›‹†Òöf*8†ˆ›ŸìØöf)˜†ˆ›Ÿì†Òöüüò†ƒùʆˆŸßöð†üf(†ˆ›»ì†ì†ì†Òöf't†ˆ›‹†Òöð†ƒùf&¸†ˆ›Ÿì†óßöð†ƒùf%¨†ˆ›f&Œìòò†ì†Òöð†ƒùf$˜†ˆ›f%|ì†ìò†ìØöf#܆ˆ›­ì†ì†Òöf#X†ˆ›‘Òö脌ƒóƒùð†ƒùf!†ˆ›f#ì†ì†ì†ì†ì†ìòò†ì†Òöf ð†ˆ›Ÿì†Òöf P†ˆ›Ÿì†Òöð†üf˜†ˆ›f $ì†ì†ì†ì†ì†ì†ìò†ìò†Òöüüf†ˆ›‘Òöð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùö†üf膈›‘Òöf¼†ˆ›fØìò†ì†ì†ìò†Òöñf †ˆ›‘óßöf4†ˆ›§†ì†ì†Òö膃ˆñð†ƒùfh†ˆ›‘Òöf†ˆ›»ì†ì†ì†Òöf †ˆ›‘Òöf4†ˆ›»ì†ì†ì†Òöf”†ˆ›ŸìØöð†ƒùfô†ˆ›ãöüüf †ˆ›§ò†ì†Òöð†ƒùf†ˆ›§†ì†ìØöð†ƒùò†ƒùfD†ˆ›Ÿì†Òöö†üf”†ˆ›ŸìØööƒùfô†ˆ›‘Òöð†ƒùf8†ˆ›Ÿìùßöð†ƒùð†ƒùf(†ˆ›»ì†ìò†Òöö†üf@†ˆ›»ì†ì†ì†Òöfh†ˆ›»ìòòØööƒùð†ƒùö†üf €†ˆ›Ÿì†Òöò†ƒùeÿ„†ƒŽúþŸf \ƒùꆄ‚öꆄ‚öf¼†ˆ‰’úþŸf ôƒùf†ˆ‘úþŸf ”„„‘úþŸf Ì„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöf †ˆ¦õ·ä†‹Ø’Íþøôüþàöf(†„„‘úþŸf l„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöf †ˆ¦õ·ä†‹Ø’Íþøôüþàöf`†ˆ‘úþŸf „„þöꆄ‚öꆄ‚öꆄ„þöf¨†ˆ‘úþŸfüˆ‘úþŸfl„‚öꆆöfh†ˆ¦õ·ä†‹Ø’Íþøôüþàöf †ˆ¦õ·ä†‹Ø’Íþøôüþàöf؆ˆ¦õ·ä†‹Ø’Íþøôüþàöf†ˆ¦õ·ä†‹Ø’ÍþøôüþàöfH†ˆ¦õ·ä†‹Ø’ÍþøôüÔöeÿ솈¦õ·ä†‹Ø’ÍþøôüÜð†ƒùeþ†ˆ›»ì†ìò†Òöeý¸†ˆ›»ì†ì†ì†Òöeüü†ˆ›­ìò†Òöð†ƒùÞ“õþþøeü†ˆ›‘Òöeûp†ˆ›‹†óßöeúІˆ›Ÿì†Òöò†ƒùeú†ƒˆˆ§†ì†ì†Øð†ƒùeù †ˆ›§†ì†ì†óßö؆ˆþöò†ƒùe÷Іˆ›»ì†ì†ì†Òö؆ˆþö膃ˆñö†üeö¨†ˆ›Ÿì†Òö؆ˆþööƒùeõ¬†ˆ›‘‹Çöeô †ƒˆˆeõœì†ì†ìò†ìòÞð†ƒùeó䆈›ŸìØöeó(†ˆ›­ì†ì†óßöeòˆ†ˆ›Ÿì†Òöeñ°†ˆ›»ì†ì†ì†Òöeð„†ˆ›eñ ìòòòò†ì†Òööƒùð†ƒùð†ƒùð†ƒùð†ƒùeˆ›eïèì†ìòò†ìòòò†Òöð†ƒù膃ˆñeì4†ƒŽúþŸeî@ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþöe윆ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùö†üò†ƒù膃ˆñeë$†ˆ›‹†Òöe餆ˆ›eëì†ì†ì†ì†ì†ìòò†ì†Òöe醈›Ÿì†Òö؆ˆþö؆ˆþöe甆ˆ›»ì†ì†ì†Òöe漆ˆ›»ìò†ì†Òöeæ(ˆ›Ÿì†Òöö†üò†ƒùö†üeåD†ˆ›ŸìØöð†ƒùeäP†ˆ›§†ìò†Òöe㔆ˆ›™†ì†Òöe℆ˆ›eã\†ì†ì†ìòØöeᆈ›eâtì†ìò†ì†Òöð†ƒùeàŒ†ˆ›»‹á†ì†ì†Òöð†ƒùeßÜ„eàdƒeß胊þŸŒƒùôüÚe߆ˆ›§ò†ì†ÒöeÞH†ˆ›­ìò†ÒöeÝp†ˆ›»ì†ì†ì†ÒöeÜ(†ˆ›eÝ`ì†ì†ìòò†ìò†ÒöeÚĆˆ›eÛð†ìò†ìò†ìò†ì†ÒöüüeÚ †ˆ›‘‹ÇöeÙœ†ˆ›‘ÒöeØ´†ˆ›»‹á†ì†ìùßöe؆ˆ›Ÿì†óßöð†ƒùò†ƒù膃ˆñð†ƒùeÖÀ†ˆ›»ì†ì†ì†Òöò†ƒùeÕІˆ›»ì†ì†ì†ÒöÔˆþöö†üð†ƒùò†ƒùeÔ¨†ˆ›ãöeÓІˆ›»ì†ì†ì†Òö膃ˆñð†ƒùeÑt†ƒˆúþŸeÓl„‚öꆄ‚öꆄ‚öꆄ‚öꆆöeÑð†ˆ¦õ·ä†‹Ø’ÍþøôüÒeи†ˆ›­ì†ì†Òöeʆˆ›eШì†eÊ€†‹šøeÐþŽþþeʺeÐeʶþŸeÏðƒùeÏ4†ˆ¦õ“†ÊþøeÎh†ˆ¦õµì†ì†ÊþøeÍœ†ˆ¦õ¡†ì†Êþøe͆ˆ¦õ™ÊþøeÌX†ˆ¦õ§ì†ëßþøeÊü„eˤˆ¦õ§‹á†Êþeˈ¦õ™‹eËþøôüeÊ0öð†üöƒùò†ƒùeÈ$†ƒúþŸeɼƒùꆄ„þöꆈþöeȆˆ¦õ·ä†‹Ø’ÍþøôüÚeÇ„†ˆ›Ÿì†Òöedžˆ›‘Òöò†ƒùeÆH†ˆ›‹†Òöð†ƒùeŨ†ˆ›‘Òöeņˆ›Ÿì†ÒöeÄ0†ˆ›»ì†ì†ì†ÒöeÃt†ˆ›™†ì†óßöøƒùð†ƒùò†ƒùeÂl†ˆ›­ìòØöeÁ\†ˆ›eÂ4†ìò†ìòØöð†ƒùð†ƒù膃ˆñeÀ †ˆ›§ò†ì†Òöe¿d†ˆ›­ì†ì†óßöe¾Œ†ˆ›»ì†ì†ì†Òöò†ƒùe½œ†ˆ›»ì†ì†ì†ÒöÞ“õþþøe¼”†ˆ›­ìò†Òöð†ƒùð†ƒùe»¼†ˆ›Ÿì†Òöeºä†ˆ›§òò†Òöeº`†ˆ›‘Òöe· †ƒˆúþŸeºTƒùꆄ‚öò†ƒùe¸X†ˆ‘úþŸe¹üƒùꆄ‚öꆈþöe¸Ð†ˆ¦õ·ä†‹Ø’Íþøôüþàöe·ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùe¶<†ƒˆˆ­ì†ì†Øeµ¸†ˆ›‘Òöe´à†ˆ›»ì†ì†ì†Òöe³Ð†ˆ›e´Ðì†ì†ì†ìò†Òöð†ƒùöƒùò†ƒùð†ƒùe²à†ˆ›‘Òöe²@†ˆ›Ÿì†Òöe± †ˆ›‹†Òöð†ƒùe°X†ˆ›e±tìò†ìò†ì†ìØöò†ƒùe¯h†ˆ›§†ì†ìØöe®X†ˆ›e¯Xì†ìò†ì†ìØöð†ƒùe­d†ˆ›»ì†ì†ì†Òöe¬Œ†ˆ›»ì†ì†ì†Òöe«|†ˆ›e¬|ì†ì†ì†ìò†Òöˆ›‘Òöeª<†ˆ›™ò†Òöe©œ†ˆ›‹†óßöe¨à†ˆ›™ò†Òöð†ƒùʆˆþöe§¼†ˆ›Ÿì†Òöe¦€†ˆ›‘‹ˆe§¬ì†ì†ì†ì†e¦˜öò†ƒùe¥†ˆ›»ì†ì†ì†Òöe¤ð†ˆ›Ÿì†Òöe¤†ˆ›»ì†ì†ì†Òöe£@†ˆ›»ì†ì†ì†Òöe¢ †ˆ›ŸìØöe¢†ˆ›Ÿì†Òöøƒùð†ƒùe¡H†ˆ›ãöð†ƒùe †ˆ›e¡ì†ì†ìò†ì†ìØöeŸ(†ˆ›»ì†ì†ì†Òöö†üež\†ˆ›­ìò†Òöˆ›‘Òöe8†ˆ›‹†Òöð†ƒù膃ˆñeœP†ˆ›Ÿì†Òöe›°†ˆ›‹†óßöešØ†ˆ›»ì†ì†ì†Òöeš8†ˆ›Ÿì†Òöe™(†ˆ›eš(ì†ì†ì†ì†ì†Òöøƒùð†ƒùð†ƒùe—†ƒŽúþŸe˜Ìƒùꆄ„þöꆄ„þöꆆöe—x†ˆ¦õ·ä†‹Ø’ÍþøôüÜe–T†ˆ›­ì†ì†Òöò†ƒù膃ˆñe•p†ˆ›‹†Òöð†ƒù膃ˆñe”ˆ†ˆ›ŸìØöò†ƒùöƒùö†üð†ƒùe“¤†ˆ›ãöe‘ð†ƒˆúþŸe“˜ƒùꆄ„þöꆆöe’l†ˆ¦õ·ä†‹Ø’ÍþøôüÒe‘4†ˆ›™†ì†Òöð†üe”†ˆ›ãöeô†ˆ›Ÿì†Òöö†üö†üeŽü†ˆ›»ì†ì†ì†Òöʆˆþöøƒùe¤†ˆ›§òò†óßöeŒx†ˆ›e”ì†ìòòòò†óßöe‹¤†ƒˆˆµò†ì†ìÞ̆ƒˆˆéò†ƒùð†ƒùe‰ü†ˆ›eŠüì†ìòò†ìØöò†ƒù؆ˆþöeˆø†ˆ›Ÿì†Òöeˆ †ˆ›»ì†ìò†Òöò†ƒùe‡tˆ›‹Øöö†üð†ƒùð†ƒùe†€†ˆ›‹†Òöʆˆþöe…x†ˆ›Ÿì†óßöð†ƒùe„„†ˆ›»ì†ì†ì†ÒöeƒX†ˆ›e„tì†ìò†ìò†ì†Òöe‚œ†ˆ›™ò†Òöe¨†ˆ›e‚Œìò†ìò†Òöe†ˆ›ŸìØöe€h†ˆ›Ÿì†Òöe䆈›‘Òöð†ƒùüüð†ƒùe†ˆ›ãöe~@†ˆ›§ò†ìØöe}h†ˆ›»ìò†ì†Òöe|¬†ˆ›­ì†ì†Òöð†ƒù膃ˆñe{à†ˆ›‘Òöö†üð†ƒùez܆ˆ›»ì†ìò†Òööƒù膃ˆñò†ƒùð†ƒùð†ƒùeyÀ†ˆ›‘ÒöÞ“õþþøð†ƒùð†ƒùexœ†ˆ›Ÿì†Òöð†ƒùò†ƒùò†ƒùew$†ˆ›ex†ì†ìòò†ìØöò†ƒùev4†ˆ›»ì†ì†ì†Òöö†üö†üö†üö†üò†ƒù؆ˆþöet¸†ˆ›»ì†ì†ì†Òöesà†ˆ›»ì†ì†ì†Òöes†ˆ›»ì†ì†ì†Òööüð†ƒùer†ˆ›­ì†ì†Òöeqt†ˆ›Ÿì†Òöò†ƒùð†ƒùep †ˆ›Ÿì†Òöeo䆈›™†ìØöeo,†ƒˆˆ»ìò†ì†Øò†ƒùem膈›eoì†ìò†ì†ìò†Òöel¼†ˆ›emØì†ìò†ìò†ì†Òöel†ˆ›Ÿì†ÒöekD†ˆ›»ì†ì†ì†Òöö†ü؆ˆþöð†ƒùejˆ›­ìòùßöeiŒ†ˆ›‘Òöð†ƒùð†ƒùò†ƒùeh†ˆ›ei‹áòòò†ì†ì†Òöeg`†ˆ›ŸìØöef¤†ˆ›­ì†ìØöð†ƒùð†ƒùeĕˆ›Ÿì†Òöö†üed䆈›»ì†ì†ì†Òö؆ˆþöecÀ†ˆ›»ì†ìò†Òö؆ˆþöò†ƒùˆ›‘óßöð†ƒùð†ƒùeb†ˆ›‹†Òöò†ƒùð†ƒùe`ô†ˆ›»ì†ì†ì†Òöò†ƒùe` †ˆ›™†ì†Òöò†ƒùe_L†ˆ›­ìò†Òööƒùe^X†ˆ›»ìòò†Òöe]Ô†ˆ›‘Òöe]†ˆ›­ì†ì†Òöò†ƒùð†ƒùð†ƒùð†ƒù膃ˆñe[à†ˆ›Ÿì†Òöe[†ˆ›»ìòò†ÒöeZL†ˆ›­ìò†ÒööƒùeY†ˆ›‹†ÒöeXÔ†ˆ›™†ì†Òöð†ƒùð†ƒùeWĆˆ›§†ìòØöð†ƒùð†ƒùð†ƒùò†ƒù膃ˆñeVT†ˆ›§†ìò†ÒöeU|†ˆ›»ì†ì†ì†ÒöeT¤†ˆ›»ì†ì†ì†ÒöeSx†ˆ›eT”ìò†ì†ì†ìò†ÒöeRˆ›eShì†ì†ì†ìØöeR†ˆ›‘óßöeQ,†ƒˆˆµò†ì†ìÞò†ƒùeP@†ƒˆˆeQìò†ì†ì†ØeO0†ˆ›eP0ì†ìòò†ìØöeNX†ˆ›»ì†ì†ì†ÒöeM€†ˆ›»ì†ì†ì†ÒöeL¨†ˆ›»ì†ì†ì†Òöð†üöƒùeK|†ˆ›eL`ì†ìò†ì†ÒöeJ܆ˆ›‹†ÒöeJ<†ˆ›Ÿì†óßöò†ƒùò†ƒùeI4†ˆ›»ì†ì†ì†Òö膃ˆñeG܆ˆ›eHøì†ìò†ìò†ì†Òöð†ƒùeG†ˆ›­ìò†ÒöeEô†ˆ›eFôì†ì†ì†ìò†Òöò†ƒùeEX†ˆ›‘Òöð†ƒùöƒùð†ƒùð†ƒùeD,†ˆ›™ò†ÒöeCT†ˆ›§†ìò†Òöð†ƒùeB(†ˆ›eC†ìò†ìò†ÒöeA¤†ˆ›‘óßöð†ƒùò†ƒùð†ƒùe@Іˆ›‘Òöe?ø†ˆ›»ì†ì†ì†Òöe>膈›e?À†ì†ì†ìò†Òöe>,†ˆ›­ìò†Òööƒùe=Œ†ˆ›ãöð†ƒùe<솈›‘Òöe<0†ˆ›­ìò†Òöò†ƒùe;\†ˆ›™†ì†Òöò†ƒùð†ƒùö†üö†üð†ƒùð†üe9À†ˆ›e:Àì†ì†ì†ì†ì†Òööƒùð†ƒùe8̆ˆ›™†ì†Òöe8†ˆ›­ì†ì†Òöö†üö†ü膃ˆñe7$†ˆ›Ÿì†Òöe6h†ˆ›­ì†ì†óßöe5Ȇˆ›Ÿì†Òöò†ƒùe5ˆ›Ÿì†Òöð†ƒùe48†ˆ›­ìò†Òöe3˜†ˆ›‹†Òöð†ƒùð†ƒùe1˜†ƒˆúþŸe3Tƒùꆄ‚öà†ˆ‰õöe2†ˆ¦õ·ä†‹Ø’ÍþøôüÒe0À†ˆ›»ìò†ì†Òöð†ƒùe0†ˆ›Ÿì†Òöe/€†ˆ›‘Òöe.¨†ˆ›»ì†ì†ì†Òöò†ƒùöƒùð†ƒùð†ƒùe-d†ˆ›§ò†ì†Òöe,à†ˆ›‘Òöe,@†ˆ›‹†Òö膃ˆñe*膈›e,ìò†ìò†ì†ìØöð†ƒùe)؆ˆ›e*¼ì†ìòò†Òöe)†ˆ›§†ì†ìØöe(`†ˆ›Ÿì†Òöð†ƒùe'4†ˆ›e(4ì†ìò†ì†ìØöe&”†ˆ›Ÿì†Òöð†ƒù؆ˆþöò†ƒùe%<†ˆ›»ì†ì†ì†Òöe$€†ˆ›­ì†ì†Òöe#à†ˆ›ŸìØööüe#†ˆ›™ò†Òöð†ƒùò†ƒùe"4†ˆ›Ÿì†óßöò†ƒùe!|†ˆ›Ÿì†Òöe ̈›™†ì†Òöð†ƒùe¼†ˆ›»‹áòò†Òöe†ˆ›Ÿì†Òöe`†ˆ›­ì†ì†Òöò†ƒùeĆˆ›‘Òöe˜†ˆ›eŒ†ìò†ì†ì†ìØöe¤†ˆ›µ†ì†ì†ì†Òöĕˆ›»ì†ì†ì†Òöeô†ˆ›»ì†ì†ì†Òöe؆ƒúþŸeèƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöeD†ˆ¦õ·ä†‹Ø’ÍþøôüÚe¬†ˆ›eÈì†ì†ì†ì†ì†ì†Òöeüˆ›­ì†ì†Òöel†ˆ›ãöĕˆ›‹†Òöð†ƒùð†ƒùð†ƒùe †ˆ›§†ìòØöe†ˆ›Ÿì†Òöò†ƒùð†ƒù膃ˆñeȆˆ›§†ìò†Òöeð†ˆ›»ì†ì†ì†Òöe¨†ˆ›eàì†ì†ì†ìòòò†ÒöeІˆ›§†ìò†Òöe ܆ˆ›µ†ì†ì†ì†Òöʆˆþööƒùe d†ˆ›e Hìò†ìò†Òöe Ćˆ›Ÿì†óßö膃ˆñe ܆ˆ›™†ì†Òöe <†ˆ›ŸìØöò†ƒùe L†ˆ›»ì†ì†ì†Òöe@„e @ƒeLƒšøeÐþŽþþeje¼efþŸe¬ƒùe¸†ˆ¦õeì†ì†ì†Êþøe†ˆ¦õ§ì†ëßþøe¬„eTˆ¦õ§‹á†Êþe¸ˆ¦õ™‹eÄþøôüÚe †ˆ›ŸìØöñeð†ˆ›‘óßöe4†ˆ›­ì†ì†Òöe\†ˆ›»ì†ì†ì†Òöò†ƒùð†ƒù膃ˆñò†ƒùð†ƒùò†ƒùeô†ˆ›­ìò†Òöe †ˆ›eäìò†ä†‹Çö؆ˆþöö†üð†ƒù؆ˆþö؆ˆþöð†ƒùð†ƒùdþ†ˆ›­ìò†Òööƒùð†ƒùdýL†ˆ›‘Òödü¬†ˆ›Ÿì†Òödü(†ˆ›‘Òöð†üò†ƒùdû8†ˆ›™†ì†óßöò†ƒùð†ƒùö†üð†ƒùdú ˆ›§†ìò†Òöð†ƒùdùD†ˆ›Ÿì†ÒödøÀ†ˆ›‘Òödø†ˆ›™†ìØödö8†ƒúþŸd÷øƒùꆄ„þöꆄ‚öꆈþödö¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚdõ´†ˆ›„ßö؆ˆþödô<†ˆ›dõXì†ìò†ìò†ì†Òödód†ˆ›»ì†ì†ì†Òödò¨†ˆ›­ì†ì†Òöð†ƒùöƒùʆˆþöð†ƒùð†ƒùdñL†ˆ›‘Òöò†ƒù膃ˆñdð0†ˆ›»ì†ì†ì†ÒödïX†ˆ›»ì†ì†ì†Òöò†ƒùdˆ›‘Òödí䆈›»ìò†ì†Òödí`†ˆ›‘ÒöÞ“õþþødëh†ˆ›díì†ì†ì†d솋ˆ™ò†ÈòØöò†ƒùð†ƒùdê°†ˆ›‘Òödê,†ˆ›ãöð†ƒùdæ,†ƒˆúþŸdêƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöd樆ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùö†üð†ƒù؆ˆþöð†ƒùd䤆ˆ›»ì†ì†ì†Òöð†ƒùö†üdãØ†ˆ›Ÿì†Òödã ˆ›»ì†ìò†Òödâ(†ˆ›»ìòò†Òödá4†ˆ›µò†ì†ì†Òödà„†ˆ›Ÿ‹á†ÒödÞ†ƒˆúþŸdàxƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþödÞ„†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùö†üð†ƒùdÜ膈›§†ìòØödÛ¼†ˆ›dܰ†ìò†ìò†ì†Òöˆ›‘ÒödÚ´†ˆ›‘ÒödÚ0†ˆ›‘ÒödÙX†ˆ›»ì†ì†ì†Òöøƒùð†ƒùdØh†ˆ›™ò†Òöð†ƒùdÖX†ƒúþŸdØ@ƒùà†„„þöꆄ‚öà†ˆþödÖĆˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùò†ƒùð†ƒùdÕˆ†ˆ›‘Òöð†üˆ›‘óßöö†üð†ƒùð†ƒùð†ƒùdÓ¬†ˆ›§†ì†ì†Òöö†üdÒĆˆ›»ì†ì†ì†ÒödÒ$†ˆ›Ÿì†ÒödÑtˆ›­ì†ì†ÒödЬ†ˆ›™†ì†óßödÏd†ˆ›dМìòòòòòò†óßödÎĆˆ›Ÿì†ÒödÍ|†ˆ›dδì†ì†ì†ì†ì†ìò†ÒödÌø†ˆ›‘Òöð†ƒùdÌX†ˆ›„ßödË€†ˆ›»ì†ì†ì†Òöð†ƒùdÊĆˆ›Ÿì†ÒödÊ$†ˆ›Ÿì†ÒöøƒùdÉP†ˆ›­ì†ì†óßöð†ƒùdȰ†ˆ›‘ÒödȆˆ›Ÿì†ÒödÇT†ˆ›™†ìØö؆ˆþödÆ0†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþödÄø†ˆ›Ÿì†Òöð†üöüð†ƒùdà†ˆ›½ê†‹áò†Òöò†ƒùd°†ˆ›»ì†ì†ì†ÒödÁ¼†ˆ›d ìòòò†ÒödÁ†ˆ›ŸìØödÀD†ˆ›»ì†ìò†ÒöЈŸßöð†üd¿<†ˆ›‘óßöd¾¸†ˆ›‘Òöð†ƒùd¾†ˆ›‘óßöd½”†ˆ›‘Òöd¼Ø†ˆ›­ìòØöð†ƒùð†ƒùò†ƒùdºÀ†ƒŽúþŸd¼|ƒùꆄ‚öꆄ‚öꆈþöd»(†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒùd¹˜†ˆ›dº|ì†ì†ì†ì†Òöd¸Ü†ˆ›™ò†Òödµ€†ƒúþŸd¸Ðƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆödµì†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþö؆ˆþöö†üˆ›‘óßöd³D†ˆ›d´Dì†ì†ìòò†Òöd²l†ˆ›»ìòò†Òöd±x†ˆ›d²\ì†ìò†ì†Òö膃ˆñd°†ˆ›d±<ì†ì†ì†ìòò†ì†Òöð†ƒù脌ƒóƒùd¬˜„d¯°ƒd¬¤ƒšød¯@þŽþþd¬Âd¯,d¬¾þŸd¯ƒùd®`†ˆ¦õ§ì†ëßþød­„d­¬ˆ¦õ§‹á†Êþd­ˆ¦õ™‹d­þøôüÚð†ƒù؆ˆþöd«X†ˆ›»ì†ì†ì†ÒödªÔ†ˆ›‘ÒöЈþöð†ƒùð†ƒùð†ƒùd©„†ˆ›‘‹Çöð†ƒùd¨¬†ˆ›­ì†ì†Òöd¨(†ˆ›‘Òöö†ü؆ˆþöö†üd§†ˆ›­ìò†Òöd¦`†ˆ›Ÿì†Òöñð†ƒùð†ƒùð†ƒùd¥@†ˆ›‹†Òöð†ƒùd¤L†ˆ›»ìòò†Òö脌ƒóƒùð†ƒùð†ƒùd£,†ˆ›­ìò†Òöd¢Œ†ˆ›Ÿì†Òöd¡˜†ˆ›d¢|ìò†ì†ì†ÒödŸ€†ƒŽúþŸd¡Œƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆödŸè†ˆ¦õ·ä†‹Ø’ÍþøôüÜdžà†ˆ›ŸìØödž†ˆ›»ìòò†Òöö†üˆ›‘Òödœð†ˆ›‘ÒödœP†ˆ›Ÿì†Òöd›x†ˆ›§†ìò†Òödšô†ˆ›‘Òödš8†ˆ›™†ìØö膃ˆñð†ƒùð†ƒùd™P†ˆ›‘Òöð†ƒùd˜x†ˆ›­ì†ì†óßöd—؆ˆ›Ÿì†Òöd–¬†ˆ›d—Èì†ì†ì†ìò†ì†Òööƒùd•Ô†ˆ›­ìò†Òöð†ƒùʆˆŸßöd””†ˆ›™†ìØöd“¼†ˆ›»ì†ì†ì†Òöd“†ˆ›Ÿì†Òöd’P†ˆ›µì†ä†‹Çö؆ˆþöö†üð†ƒùdt†ˆ›d‘ †ìò†ìò†ìò†ì†Òödàˆ›‹†ÒödŽÄ†ˆ›dÄìòòòò†Òöʆˆþöd0†ˆ›dŽLì†ìòò†ì†ìØödŒX†ˆ›»ì†ì†ì†ÒöȈŸŠÕöð†ƒùd‹†ˆ›­ìò†ÒödŠ„†ˆ›ãöd‰†ˆ›µòòò†óßödˆð†ˆ›Ÿì†Òöð†ƒùð†ƒùdˆ†ˆ›Ÿì†Òöð†ƒùˆ›‘óßöð†ƒùð†ƒùd†„†ˆ›­ìò†Òöd…Ȇˆ›™†ì†Òöð†ƒùð†ƒùd„ð†ˆ›Ÿì†Òöd„l†ˆ›‘Òödƒè†ˆ›‘Òöð†ƒùö†ü膃ˆñd‚ð†ˆ›Ÿì†Òöð†ƒùö†üöƒùd솈›­ìò†Òöò†ƒùð†ƒùð†ƒùd€˜†ˆ›½ê†‹áò†Òöð†ƒùö†üö†ü؆ˆþöð†üð†ƒùò†ƒùd~膈›»ì†ì†ì†Òööƒùd~H†ˆ›‘Òöd}Ȇƒˆˆ‹†Ød} †ˆ›­ìòØöð†ƒùð†ƒùd|†ƒˆˆd|Äìò†ì†ì†Ød{D†ˆ›™†ì†óßöð†ƒùð†ƒùdz4†ˆ›»ì†ì†ì†Òödy”†ˆ›ŸìØödyˆ›Ÿì†Òödx8†ˆ›™†ì†óßödvð†ˆ›dx(ìòòòòòò†óßöð†ƒùð†ƒùdv†ˆ›Ÿì†ÒödtІˆ›dvì†ì†ì†ì†ì†ìò†Òöð†ƒùdt†ˆ›‹†Òöds<†ˆ›§†ì†ìØödqô†ˆ›ds,ì†ì†ìò†ìòòØöð†ƒùö†üöƒùö†üò†ƒùdpȆˆ›­ì†ì†óßödp †ˆ›™ò†óßöð†ƒù脌ƒóƒùò†ƒùð†ƒùdnĆˆ›™†‹áØöñð†ƒùð†ƒùð†ƒùdmˆ†ˆ›™ò†Òöð†ƒùò†ƒùdl|†ˆ›»ì†ì†ì†Òöö†üdk°†ˆ›­ìò†Òödk†ˆ›ŸìØööƒùð†ƒù膃ˆñdiÔ†ˆ›§ò†ì†óßöð†ƒùð†ƒùð†ƒùdh¨†ˆ›»ì†ì†ì†ÒödgІˆ›»ì†ì†ì†Òö脌ƒóƒù؆ˆþöö†üö†üdeƒŽúþŸdg,ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öↈ‰õödex†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùddD†ˆ›Ÿ‹á†Òöð†ƒùↃù脌ƒóƒùdb솈›»ì†ì†ì†Òö脌ƒóƒùda膈›»ì†ì†ì†Òöda†ˆ›»ì†ì†ì†Òöð†ƒùö†üd` †ˆ›§†ìòØöd^à†ˆ›d_Ô†ìò†ìò†ì†ÒöÞ“õþþøð†ƒùö†üð†ƒùò†ƒùd]°†ˆ›‘Òöd\؆ˆ›»ìòò†Òöò†ƒùð†ƒùð†ƒùd[°†ˆ›»ì†ì†ì†Òöd[†ˆ›Ÿì†ÒöÔˆþöʆˆŸßöð†ƒùð†ƒùdYŒ†ˆ›ãödX솈›‹†óßö膃ˆñð†ƒùò†ƒù؆ˆþöð†ƒùøƒùð†ƒùdWP†ˆ›Ÿì†ÒödV”†ˆ›™†ì†Òöð†ƒù膃ˆñð†ƒùdUX†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†ü؆ˆþödSà†ˆ›‘Òöˆ›ãö膃ˆñdP솃úþŸdS$ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþödQX†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üð†ƒùdO膈›»ì†ì†ì†Òöö†üdN䆈›dOÈìò†ìò†Òöøƒù膃ˆñò†ƒù脌ƒóƒùЈŸßöò†ƒùð†ƒùdM<†ˆ›‘ÒödL¸†ˆ›‘ÒödL†ˆ›‹†ÒödK†ˆ›‘‹ˆ­ì†ì†dK,ö؆ˆþöð†ƒùdIÔ†ˆ›»ì†ì†ì†ÒödI4†ˆ›Ÿì†ÒödH@†ˆ›dI$ìò†ì†ì†Òöö†ü؆ˆþödG4ˆ›™òØödFˆ†ˆ›Ÿì†Òö؆“õþþøð†ƒùò†ƒùò†ƒùdEP†ˆ›Ÿì†ÒödD°†ˆ›Ÿì†ÒödC؆ˆ›§†ìò†ÒödC†ˆ›™†ìØöð†ƒùdA\†ƒúþŸdBôƒùꆄ‚öꆈþödAȆˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒùøƒùd?¬†ˆ›d@Øòòòòòòò†Òöd>Ô†ˆ›»ìòò†Òöð†ƒùð†ƒùd=¨†ˆ›d>Œì†ìò†ì†Òö؆ˆþöò†ƒùd<ˆ†ˆ›­ì†ì†Òöd;°†ˆ›»ì†ì†ì†Òöd;,†ˆ›‘Òöøƒùð†ƒùd:t†ˆ›ãöð†ƒùð†ƒùd9¨†ˆ›‘‹Çöd6¸†ˆ›d9˜ì†ä†‹á†d7t†‹úþŸd9ƒùꆄ‚öꆈþöd7ð†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ì†Òöð†ƒùð†üö†üö†ü脌ƒóƒùð†ƒùd5@†ˆ›»ì†ì†ì†Òöd4†ˆ›Ÿ‹á†Òöˆ›‘Òö؆“õþþød3†ˆ›™†ì†Òöd1؆ˆ›d2ôì†ì†ì†ì†ì†ì†Òöò†ƒùd0”†ˆ›d1ˆ†ì†ì†ì†ì†ì†Òö膃ˆñð†ƒùd/X†ƒˆˆd0<ìꆋá†ä†‹Íd.œ†ˆ›­ìò†Òöd-ü†ˆ›Ÿì†óßöö†üd-h†ˆ›‘Òöd*ĆƒˆúþŸd-\ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöd+@†ˆ¦õ·ä†‹Ø’ÍþøôüÒd)솈›»ì†ì†ì†Òöd)L†ˆ›Ÿì†Òöd(¬†ˆ›Ÿì†ÒöÞ“õþþød'¤†ˆ›™òØöd' †ˆ›‘Òöò†ƒùð†ƒùd&†ˆ›§òò†Òöð†ƒùð†ƒù膃ˆñò†ƒùd!܆ƒˆúþŸd%Œƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöd"X†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒù؆ˆþö؆ˆþöd \†ˆ›­ì†ì†Òöd †ˆ›­ìò†Òöd†ˆ›‘Òöd|†ˆ›Ÿì†Òöøƒùð†ƒùd¨†ˆ›Ÿì†ÒödІˆ›§òò†Òöð†ƒùð†ƒù膃ˆñd°†ˆ›™†ì†óßöd$†ƒˆúþŸd¤ƒùꆈþöd †ˆ¦õ·ä†‹Ø’ÍþøôüÒdL†ˆ›»ì†ì†ì†Òöö†ü؆ˆþödP†ˆ›Ÿì†ÒöÞ†öð†ƒùd,†ˆ›­ìò†óßöò†ƒùð†ƒùð†ƒùd؆ƒˆúþŸdЃùꆄ„þöꆄ„þöꆄ‚öꆆödT†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùd†ˆ›Ÿì†ÒödP†ƒúþŸdƒùꆄ‚öꆄ‚öꆆöd¼†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùd(†ˆ›d(ìòò†ìòùßöd4†ˆ›dì†ì†ìò†Òödx†ˆ›­ì†ì†óßöd `†ƒŽúþŸdlƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþöd Ȇˆ¦õ·ä†‹Ø’ÍþøôüÜd ̈›Ÿìùßöd <†ˆ›ãö؆“õþþøò†ƒùð†ƒù膃ˆñd ¸†ˆ›»ìòò†Òöd Ćˆ›µò†ì†ì†Òöʆˆþöð†ƒùð†ƒùdL†ˆ›»ì†ì†ì†Òöö†üò†ƒùdtˆ›­ì†ì†Òöð†ƒùʆˆþö̆ƒˆˆ‹†Ødô†ƒˆúþŸdtƒùꆆödp†ˆ¦õ·ä†‹Ø’ÍþøôüÒd†ˆ›»ì†ìò†Òöd(†ˆ›d ì†ìò†ì†Òödl†ˆ›­ì†ì†óßöö†ü؆ˆþödT†ˆ›­ì†ì†Òöd´†ˆ›Ÿì†Òöcÿ܆ˆ›»ì†ì†ì†Òöüüð†ƒùcÿ,†ˆ›‘Òöð†ƒùcþp†ˆ›‹†Òöð†ƒùò†ƒùcý€†ˆ›­ì†ìØöð†ƒùð†ƒùcüŒ†ˆ›­ì†ì†Òöcû´†ˆ›»ì†ì†ì†Òö؆ˆþöcúÔ†ˆ›‘‹èßöð†ƒùöƒù膃ˆñð†ƒùò†ƒùc÷Ô†ƒˆúþŸcú0ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöà†ˆþöcøP†ˆ¦õ·ä†‹Ø’ÍþøôüÒc÷P†ˆ›„ßöð†ƒùcöD†ƒˆˆc÷$ì†ìò†ì†ì†Øò†ƒùcõ†ˆ›cöì†ìòòò†óßöcôD†ˆ›»ì†ì†ì†Òöcñ¬†ˆ›§†‹úþŸcôƒùꆄ‚öꆄ‚öꆈþöcòȆˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöcñ †ˆ›‹†Òöcð4†ˆ›»ì†ì†ì†Òöüücï †ˆ›‘Òöð†ƒùcî,†ˆ›cïtì†ì†ìòò†ìꆋÇöò†ƒùcí<†ˆ›»ì†ì†ì†Òöc윆ˆ›Ÿì†Òö؆ˆþö؆ˆþöcëH†ˆ›­ìò†ÒöcêT†ˆ›cë8ì†ì†ì†ì†Òöcé|†ˆ›»ì†ì†ì†Òöc褆ˆ›»ì†ì†ì†Òö脌ƒóƒùð†ƒùcçh†ˆ›µòò†ì†Òöð†ƒùˆ›‘óßöcæD†ˆ›‘Òöð†ƒùcäp†ˆ›cæìòò†ìòò†ì†ì†ì†ì†ì†Òöð†ƒùð†ƒùð†ƒùcã`†ˆ›­ì†ìØöcâl†ˆ›cãPìò†ì†ì†Òö؆ˆþöcÜ(†ƒˆšøcá´þŽþþcÜbcá cÜ^þŸcáƒùcàd†ˆ¦õcátì†ì†ìò†ì†Êþøcß`†ˆ¦õcàTì†ì†ì†ì†ÊþøcÞ°†ˆ¦õ§ì†ÊþøcÞ†ˆ¦õ§ì†ëßþøcܤ„cÝLˆ¦õ§‹á†Êþcܰˆ¦õ™‹cܼþøôüÒö†ücÛ@†ˆ›»ì†ì†ì†ÒöcÚ†ˆ›cÛ†ìò†ìò†ì†ÒööƒùcÙ †ˆ›»ì†ì†ìØöcØH†ˆ›»ìòò†Òöò†ƒùò†ƒùc×$†ˆ›cØìò†ìò†ÒöcÖL†ˆ›§†ì†ì†Òöö†üð†ƒùcÕ†ˆ›cÖ䆋áòò†ÒööƒùcÔD†ˆ›­ì†ì†Òöð†ƒùcÒ\†ƒúþŸcÔƒùꆄ‚öꆄ„þöꆈþöcÒȆˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒùö†ücÑ †ˆ›»ì†ì†ì†ÒöcЀ†ˆ›ŸìØööƒùð†ƒùʆˆþöð†ƒùcΤ†ˆ›cϤ‹áò†ìò†ì†ÒöcΆˆ›Ÿì†ÒöcÍ,†ˆ›»ì†ì†ì†ÒöÒ†Ÿþæ„üò÷øƒùcË䆈›§òò†Òöð†ƒùcÉ솃ˆúþŸc˼ƒùꆄ‚öꆄ„þöꆈþöcÊh†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùò†ƒùcɆˆ›„ßöð†ƒùö†ücÈP†ˆ›Ÿì†Òöö†ücÆÜ†ˆ›cÈ0ì†ì†ì†ìòò†ìò†Òöcۆˆ›cÆÌìò†ìò†ì†ì†Òöcņˆ›ŸìØöcÄT†ˆ›­ì†ì†ÒöcÃÀˆ›Ÿì†Òöò†ƒùö†üò†ƒùcÂÔ†ˆ›Ÿì†ÒöcÁü†ˆ›§†ì†ì†Òöð†ƒùcÁ$†ˆ›™ò†Òöð†ƒùcÀ†ˆ›cÀøì†ìò†ì†Òöc¿<†ˆ›»ì†ìò†Òöð†ƒùò†ƒù؆ˆþöc¾8†ˆ›‘Òöc½`†ˆ›»ì†ì†ì†Òöc¼ˆ†ˆ›»ì†ì†ì†Òöc»°†ˆ›»ì†ì†ì†Òöcº„†ˆ›c»x†ìò†ìò†ì†Òöc¹ä†ˆ›ŸìØöüüò†ƒùò†ƒùð†ƒùc¸”†ˆ›µ†ì†ìò†óßöc¶†ƒˆúþŸc¸ˆƒùꆄ‚öꆄ„þöꆄ„þöꆈþöc· †ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒùcµ †ˆ›­ì†ì†Òöc´È†ˆ›»ì†ì†ì†Òöc³ð†ˆ›»ì†ì†ì†Òöˆ›‘Òöò†ƒùð†ƒùc±†ƒúþŸc³„„þö䆄„þö䆄„þö䆄„þöꆆöc±p†ˆ¦õ·ä†‹Ø’ÍþøôüÚc°d†ˆ›‹†Òöð†ƒùò†ƒùc¯t†ˆ›™†ìùßö脌ƒóƒùc®p†ˆ›»ì†ì†ì†Òöc­´†ˆ›­ì†ì†Òö؆ˆþöö†üc¬Ä†ˆ›‘‹èßöЈŸßöc«L†ˆ›c¬Lìòòòò†Òöð†ƒùò†ƒùcª\†ˆ›™ò†Òöð†ƒù膃ˆñc¨8†ƒˆúþŸcªƒùꆄ‚öꆄ‚öꆆöc¨´†ˆ¦õ·ä†‹Ø’ÍþøôüÒc§˜†ˆ›Ÿì†óßöc¦°†ˆ›¯òꆋÇöc¥Ø†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöö†üc¤†ˆ›ŸìØöc£Äˆ›§†ì†ì†Òöð†ƒùð†ƒùc¢¨†ˆ›»ìòò†Òöð†ƒùc¢†ˆ›‘Òöc¡†ˆ›µò†ì†ì†Òö膃ˆñð†ƒùcŸ†ƒúþŸc Àƒùꆄ‚öꆄ‚öꆈþöcŸl†ˆ¦õ·ä†‹Ø’ÍþøôüÚcž(†ˆ›»ì†ì†ì†Òöö†ücx†ˆ›‹†Òöcœ †ˆ›»ì†ì†ì†Òöcœ†ˆ›Ÿì†Òöc›`†ˆ›ŸìØöcšˆ†ˆ›»ìòòØööƒùc™°†ˆ›™†ìØöc˜ô†ˆ›­ì†ì†Òöð†ƒùc˜T†ˆ›ãöc—˜†ˆ›­ì†ì†Òöc’À„c—Œƒc’̃šøc—þŽþþc’êc—c’æþŸc–øƒùc–†ˆ¦õc–Üìò†ì†Êþøc•8†ˆ¦õ¡†ì†Êþøc”ˆ†ˆ¦õ§ì†ëßþøc“,„c“Ôˆ¦õ§‹á†Êþc“8ˆ¦õ™‹c“DþøôüÚc’ †ˆ›Ÿì†Òö脌ƒóƒù؆ˆþöö†üc‘†ˆ›‘Òöøƒùð†ƒùð†ƒùʆˆþöò†ƒùð†ƒùcP†ˆ›§òò†Òöð†üð†ƒùð†ƒùð†ƒùcŒ´†ƒˆúþŸcŽÔƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöc0†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùcˆp„cŒpƒcˆ|ƒšøcŒþŽþþcˆšc‹ìcˆ–þŸc‹ÜƒùcŠè†ˆ¦õc‹Àìò†ì†ÊþøcŠ8†ˆ¦õ§ì†ëßþøcˆÜ„c‰„ˆ¦õ§‹á†Êþcˆèˆ¦õ™‹cˆôþøôüÚc‡ì†ˆ›‘Òöc‡L†ˆ›ŸìØöc†¬†ˆ›ŸìØöc† †ˆ›ŸìØöð†ƒùˆ›‘Òöc„°†ˆ›­ìò†óßöð†ƒùð†ƒùð†ƒùcƒh†ˆ›µòòò†Òöò†ƒùò†ƒùð†ƒùð†ƒù脌ƒóƒùcĆˆ›c‚Äì†ìòò†ì†Òö؆ˆþöc€Ø†ˆ›Ÿì†Òöò†ƒùc}X“¼c~˜Š˜þ˜þ–˜c€ ˆ’c¨‚ˆ’Âü–üc~c}ðc~töc}h›‹Øöc|†ˆ›™†ì†Òöc{d†ˆ›c|€ì†ì†ì†ì†ì†ì†Òöð†ƒù膃ˆñò†ƒùcy؆ˆ›cz̆ì†ì†ì†ì†ì†Òöcy†ˆ›­ì†ì†Òöcx`†ˆ›­ìò†Òöö†ücwx†ˆ›»ì†ì†ì†Òöcvh†ˆ›cwhìò†ì†ìò†ÒöüücuÔ†ˆ›‘Òöcu†ˆ›™†ìØöctx†ˆ›Ÿì†Òöò†ƒùcsÀ†ˆ›‹†Òö膃ˆñcr¼†ˆ›»ì†ì†ì†Òöcq䆈›»ì†ì†ì†Òöö†ücq4†ˆ›‹†Òöcp\†ˆ›»ì†ì†ì†Òöco¼†ˆ›ŸìØöco†ˆ›ŸìØöcn|†ˆ›ŸìØöcm°ˆ›§†ì†ì†Òöcl”†ˆ›cml†ì†ìò†ì†óßöck †ˆ›cl„ì†ìò†ì†Òöð†ƒùcj¬†ˆ›»ì†ìò†Òöð†ƒùcið†ˆ›Ÿì†Òöcil†ˆ›‘Òöch”†ˆ›»ì†ì†ì†Òöcg؆ˆ›­ì†ì†óßöcgT†ˆ›‘Òöcf´†ˆ›Ÿì†Òöce܆ˆ›»ì†ì†ì†Òöce †ˆ›™ò†Òöˆ›ãö؆“õþþøð†ƒùð†ƒù膃ˆñ膃ˆñcb膈›§ò†ì†óßöcbd†ˆ›‘Òöð†ƒùò†ƒùc`†ƒúþŸcb$ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöc`€†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöc^Ô†ˆ›c_¸ìòòò†Òöð†ƒùˆ›ãöcZd†ƒˆúþŸc^(ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öà†ˆþöcZà†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùö†üò†ƒùcX؆ˆ›cYôìò†ì†ì†ìò†ÒöøƒùcV䆃ˆúþŸcX´ƒùꆄ„þöꆄ„þöꆈþöcW`†ˆ¦õ·ä†‹Ø’ÍþøôüÒ̆ƒˆˆ‹†Øð†ƒùcTĆƒŽúþŸcVXƒùꆄ‚öꆆöcU,†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùö†üð†ƒù膃ˆñð†ƒùð†ƒùcSLˆ›»ì†ì†ìØöcRh†ˆ›§†ì†ì†Òö膃ˆñò†ƒùð†ƒùð†ƒùcPø†ˆ›cQÜìò†ìò†ÒöcP,ˆ›§òò†ÒöcO,†ˆ›µ†ìòò†ÒöcNT†ˆ›»ìòò†ÒöcMІˆ›‘ÒöcML†ˆ›‘Òöð†ƒùð†ƒùcL<†ˆ›»ì†ì†ì†ÒöcKd†ˆ›»ì†ì†ì†Òöˆ›‘Òöò†ƒùð†ƒùʆˆþöcI¤†ˆ›Ÿì†Òö膃ˆñð†ƒùò†ƒùð†ƒùcHP†ˆ›»ì†ì†ì†Òöð†ƒùcGx†ˆ›­ì†ì†ÒöcF †ˆ›»ì†ì†ì†Òöö†üàƒˆñcD†ˆ›cF8ìòò†ìòò†ì†ì†ì†ì†ì†Òöð†ƒù膃ˆñð†ƒùð†ƒùò†ƒùcC<†ˆ›­ì†ìØöð†ƒùð†ƒùð†ƒùcB†ˆ›»ì†ì†ì†ÒöcA8†ˆ›»ì†ì†ì†Òöc@`†ˆ›»ì†ì†ì†Òöc?ˆ†ˆ›»ì†ì†ì†Òöc>°†ˆ›»ì†ìò†Òöð†ƒùc>ˆ›‹†Òöð†ƒùc=T†ˆ›‘Òöð†ƒùð†ƒùö†üc<4†ˆ›»ì†ì†ì†Òöc;\†ˆ›»ìòò†Òöð†ƒùð†ƒùc:„†ˆ›Ÿì†Òöøƒù膃ˆñc9†ˆ›c:0ì†ì†ìòò†ì†Òöò†ƒùc8$†ˆ›»ìòò†Òö脌ƒóƒùc7 †ˆ›»ì†ì†ì†Òöö†üc68†ˆ›»ì†ì†ì†Òöc5˜†ˆ›Ÿì†Òöc4܆ˆ›­ì†ì†Òöc4<†ˆ›Ÿì†Òöð†ƒùc3€†ˆ›Ÿì†Òöc2¨†ˆ›»ì†ì†ì†Òöc2$†ˆ›‘Òöc1„†ˆ›Ÿì†Òöc0䆈›Ÿì†ÒöÞ“õþþøð†ƒùð†üc/P†ˆ›c0Pìòò†ì†ì†Òö膃ˆñc.„†ˆ›Ÿì†Òöð†ƒùc-Ȇˆ›‹†Òöð†ƒùc- †ˆ›‹†Òöð†ƒùò†ƒùc*ü†ƒˆúþŸc,̃ùꆄ‚öꆄ‚öꆆöc+x†ˆ¦õ·ä†‹Ø’ÍþøôüÒc)p†ƒˆúþŸc*ðƒùꆈþöc)솈¦õ·ä†‹Ø’ÍþøôüÒð†ƒùc(|†ˆ›»ì†ì†ì†Òöð†ƒùò†ƒùЈŸßö؆“õþþøð†ƒùc&ô†ˆ›‘Òöð†ƒùc&†ˆ›§†ìò†Òöc%|†ˆ›ãöc$܆ˆ›Ÿì†Òöc$ †ˆ›™ò†Òöò†ƒùc#0†ˆ›»ìòò†Òöc"t†ˆ›­ì†ì†Òöc!ð†ˆ›‘Òöc!P†ˆ›Ÿì†Òöò†ƒù؆ˆþöc 0†ˆ›­ìò†ÒöÞ“õþþøð†ƒùc4†ˆ›‘‹Çöʆˆþöð†ƒùc؆ˆ›§†ì†ì†óßöö†ü؆ˆþöc¤†ˆ›»ì†ì†ì†Òöc †ˆ›‘Òö؆ˆþöñò†ƒùð†ƒùʆˆþöch†ƒúþŸcƒùꆄ‚öꆆöcÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒùö†üò†ƒùc4†ˆ›»ì†ì†ì†Òöcx†ˆ›­ì†ì†ÒöÞ“õþþøØ†“õþþøc†ˆ›»ìòò†óßöch†ˆ›Ÿì†óßöc¬†ˆ›™ò†Òöc †ˆ›‹†Òöc4†ˆ›»ì†ì†ì†Òöc\†ˆ›»ìò†ì†Òööƒùc„†ˆ›™†ì†óßöð†ƒùð†ƒù؆ˆþö؆ˆþöc†ˆ›Ÿì†Òöct†ˆ›Ÿì†Òöc†ˆ›c<†ìò†ìò†ìò†ì†ÒöÞ“õþþøc $†ˆ›‹ùßöð†ƒùc ܆ƒˆúþŸc üƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöc X†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùcІƒˆúþŸc ¸ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöcL†ˆ¦õ·ä†‹Ø’ÍþøôüÒcL†ˆ›‘Òöð†ƒùcX†ˆ›§ò†ì†Òöc€†ˆ›§†ì†ì†ÒöcŒ†ˆ›µ†ìòò†Òöc´†ˆ›»ì†ì†ì†Òöð†ƒùcÀ†ˆ›»ì†ì†ì†Òöö†üö†ücȆˆ›»ì†ì†ì†Òöcð†ˆ›»ì†ì†ì†Òöc@ˆ›™†ì†Òö؆“õþþøØ†“õþþøbþà†ˆ›­ìòùßöbþ@†ˆ›‹Øöð†ƒùʆˆþö膃ˆñbûŒ†ƒˆúþŸbý„ƒùꆄ„þöꆄ„þöꆄ‚öꆆöbü†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùbúœ†ˆ›»ì†ìòØöð†ƒùbùà†ˆ›Ÿì†Òöbù@†ˆ›Ÿì†Òöbø¬ˆ›Ÿìùßö؆“õþþøð†ƒùbõ䆃ˆúþŸbø,ƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöbö`†ˆ¦õ·ä†‹Ø’ÍþøôüÒbõ(†ˆ›™†ì†óßöð†ƒùò†ƒùð†ƒùð†ƒùbô8†ˆ›ãöò†ƒùð†ƒùöƒùbód†ˆ›‘óßöbòT†ˆ›bó,†ìòò†ì†Òöð†ƒùbñ|†ˆ›­ì†ì†Òöö†üð†ƒùò†ƒùbƒúþŸbñ,ƒùꆄ„þöꆆöbð†ˆ¦õ·ä†‹Ø’ÍþøôüÚbîØ†ˆ›­ì†ì†Òöb›»ì†ì†ì†Òöbí(†ˆ›»ì†ì†ì†ÒöbìP†ˆ›»ì†ì†ì†Òöbëx†ˆ›»ì†ì†ì†Òöð†ƒùbá$“¼bâdŠ˜bé0bê`˜þ––’êêêbé,–˜þ––’êêêb⤘bæôbè$˜þ––’êêêbæð–˜þ––’êêêbâИbä¸båè˜þ––’êêêbä´–˜þ––’êêêbâü˜bä––’êêbã(–––’êêbâ\bá¼bâDþøþbá4›Ÿì†ÒöbÞ膃úþŸbá ƒùꆄ„þöà†„„þöà†„„þöà†ˆþöbßT†ˆ¦õ·ä†‹Ø’ÍþøôüÚbÞH†ˆ›‹†Òöð†ƒùbÝT†ˆ›»ìòò†ÒöbÜ`†ˆ›bÝDì†ìòò†Òöò†ƒùð†ƒùbÛT†ˆ›§†ìòØöò†ƒùbÚd†ˆ›»ì†ì†ì†Òöò†ƒùbÙ¬†ˆ›Ÿì†ÒöbÙ †ˆ›Ÿì†ÒöbØ4†ˆ›»ì†ì†ì†Òöb×”†ˆ›Ÿì†ÒöʆˆþöЈŸßöð†ƒùð†ƒùö†übÕl†ˆ›bÖlìò†ìòò†Òöð†ƒùbÔx†ˆ›»ì†ì†ì†ÒöbÓ †ˆ›»ì†ì†ì†Òöò†ƒùˆ›‘Òöð†ƒùð†ƒùð†ƒùbцˆ›bÒ ì†ì†ìò†ìò†ì†ì†ì†ì†Òö膃ˆñbІˆ›»ìò†ì†ÒöbÏŒ†ˆ›‘Òöò†ƒùð†ƒùö†üö†üð†ƒùbÊh†ˆ›‘‹šøbΰþŽþþbË bΜbËþŸbÎŒƒùbÍ솈¦õ™ÊþøbÍX†ˆ¦õ™Êþøb̨†ˆ¦õ§ì†ëßþøbËL„bËôˆ¦õ§‹á†ÊþbËXˆ¦õ™‹bËdþøôübÊ€öbɆˆ›»ì†ì†ì†ÒööƒùbÈð†ˆ›‘Òöð†ƒùò†ƒùò†ƒùbÇ膈›­ìò†ÒöbÇ,†ˆ›­ìò†Òöbƨ†ˆ›‘Òöð†ƒùò†ƒùbÄÔ†ƒŽúþŸbÆhƒùꆄ‚öꆆöbÅ<†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üò†ƒùð†ƒù؆ˆþöbÃ\†ˆ›bÄ4ì†ì†ä†‹Çöö†übÁ̆ˆ›bÆì†ìò†ìò†ìòò†ÒöbÀ †ˆ›bÁ¼ì†ì†ì†ìò†ì†Òööüb¿¬†ˆ›»ìòò†óßöb¿ †ˆ›‹†Òöb¾l†ˆ›Ÿì†óßöð†ƒùb½8†ƒˆb¾ò†ì†ì†ì†ìòùíb¼|†ˆ›™†ì†Òöð†ƒùö†ü脌ƒóƒùb»L†ˆ›»ì†ì†ì†Òöbº†ˆ›™ò†Òöb¹Ô†ˆ›­ìò†Òööƒùð†ü膃ˆñð†ü膃ˆñb¸x†ˆ›§ä†‹Çöb·Ø†ˆ›Ÿì†Òöb¶t†ˆ›b· †ìò†ìò†ìò†ì†Òöüüö†üð†ƒùbµ´†ˆ›‘Òöò†ƒù؆ˆþööƒùð†ƒùð†ƒùð†ƒùò†ƒùò†ƒùb´,†ˆ›‘Òöb³†ˆ›b³ô†ìò†ì†ì†Òöö†üb²4†ˆ›»ì†ì†ì†Òöö†üb®Ü†ƒúþŸb²ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöb¯H†ˆ¦õ·ä†‹Ø’ÍþøôüÚb«ˆ“¼b¬ÈŠ–˜b®¬b®‚ˆ–’êêb­€‚ˆ–’—ÓêØü–üb¬Àb¬ b¬¨þøþb«˜›Ÿì†Òöö†üð†ƒùð†ƒùbª$†ˆ›b«$ìòò†ì†ì†Òöb§à†ƒúþŸbªƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆈþöb¨L†ˆ¦õ·ä†‹Ø’ÍþøôüÚb§\†ˆ›‘óßöð†ƒùò†ƒùð†ƒùð†ƒùð†ƒùð†ƒùb¥†ˆ›b¦¨ì†ì†ì†ì†ì†ì†ìòòò†ì†ÒöÞ“õþþøö†üð†ƒùb¤†ˆ›‘Òöð†ƒùb£†ˆ›§†ìò†Òöö†ü脌ƒóƒùb¢4†ˆ›Ÿì†Òöʆˆþöb¡†ˆ›­ìò†Òöüüö†üb l†ˆ›ãöð†ƒùö†üö†üö†üö†üˆ›ãöbž`†ˆ›bŸ|ì†ì†ìòò†ì†Òöbˆ†ˆ›»ìòò†Òöbœ¼†ˆ›µä†‹á†Òöbœ8†ˆ›‘óßöð†ƒù膃ˆñò†ƒùb›†ˆ›»ì†ì†ì†Òöbš`†ˆ›Ÿì†Òöö†üÔˆþöð†ü膃ˆñb˜ †ˆ›b™˜ì†ì†ìò†ìò†ì†ì†ì†ì†Òöb—4†ˆ›§òò†Òö膃ˆñb–0†ˆ›»ìò†ì†Òöb•<†ˆ›µ†ìòòØöö†ü؆ˆþö脌ƒóƒùb“܆ˆ›»ì†ì†ì†Òöb“<†ˆ›Ÿì†Òöb’†ˆ›b“,ì†ì†ì†ìꆋÇöb‘D†ˆ›»ì†ì†ì†Òöbl†ˆ›»ì†ì†ì†Òöüüb¼†ˆ›‹†Òöb†ˆ›Ÿì†ÒöbŽ˜†ˆ›ãöð†ƒùbÀ†ˆ›­ìò†Òöð†ƒùb †ˆ›‘ÒöbФ†ƒˆúþŸbƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöb‹ †ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùb‰´†ˆ›»ì†ì†ì†Òöò†ƒùb‡¨†ƒúþŸb‰ƒùꆄ„þöꆄ„þöꆄ„þöꆆöbˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùb†ð†ˆ›Ÿì†Òöb††ˆ›§ò†ì†Òöb…ˆƒˆˆ­ìò†Øð†ƒùb„ˆ†ˆ›»ìòò†Òöbƒ”†ˆ›b„xì†ìòò†Òö؆ˆþöb‚¨†ˆ›Ÿì†Òöb‚†ˆ›Ÿì†Òöˆ›‘Òö؆“õþþøÊ†ˆŸßöb€†ˆ›™ò†Òöb~œ†ƒŽúþŸb€ƒùꆆöb†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùb|,†ƒˆúþŸb~tƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöb|¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒb{†ˆ›b|ìò†ìòò†Òöbz(†ˆ›b{ ì†ìò†ì†ÒöbyP†ˆ›»ì†ì†ì†Òöbx”†ˆ›­ì†ì†Òöò†ƒùöƒùʆˆþöð†ƒùð†ƒùð†ƒùò†ƒù؆ˆþöö†übv†ˆ›bvø†ìò†ìò†ì†Òöüübt†ƒˆúþŸbuèƒùꆄ‚öꆄ‚öꆆöbt”†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùbs(†ˆ›§òòùßöbr¤†ˆ›‘óßöbq̆ˆ›»ì†ìò†Òöbp¼†ˆ›bq”†ìòò†ì†Òöð†ƒùð†ƒùò†ƒùö†übo †ˆ›­ì†ì†Òö脌ƒóƒùbnœ†ˆ›»ì†ì†ì†Òöbmà†ˆ›­ì†ì†Òöð†ƒùò†ƒùblÔ†ˆ›»ì†ì†ì†Òöñ膃ˆñ膃ˆñ膃ˆñbk0†ˆ›µ†ìòò†ÒöbjX†ˆ›»ì†ì†ì†Òöð†ƒùˆ›‘Òöö†üð†ƒùbh솈›‹Øöbh0†ˆ›­ìòùßöbgX†ˆ›»ìòò†Òöò†ƒùbf¼†ˆ›ãöbf8†ˆ›‘Òöbd4†ƒˆúþŸbf,ƒùꆄ„þöꆄ„þöꆄ‚öꆆöbd°†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùö†ü؆ˆþöba”†ƒúþŸbc¤„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöbb†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùöƒùð†üb`h†ˆ›§†ì†ì†Òöö†üb_€†ˆ›»ì†ì†ì†Òöb^à†ˆ›Ÿì†Òööƒùð†ƒùb]Іˆ›»ì†ì†ì†Òöb\܆ˆ›b]Àì†ì†ìò†Òöb\†ˆ›»ì†ì†ì†Òöb[,†ˆ›»ì†ì†ì†ÒöbZŒ†ˆ›Ÿì†Òöˆ›‘Òöð†ƒùð†ƒù膃ˆñð†ƒùð†ƒùbVH†ƒˆšøbYþŽþþbV‚bXìbV~þŸbX܃ùbX †ˆ¦õ§ì†ëßþøbVÄ„bWlˆ¦õ§‹á†ÊþbVЈ¦õ™‹bVÜþøôüÒöƒùbUp†ˆ›­ì†ìØöð†ƒùð†ƒùð†ƒùbS@†ƒˆúþŸbUƒùꆄ‚öꆄ‚öꆈþöbS¼†ˆ¦õ·ä†‹Ø’ÍþøôüÒbP¸†ˆ›Ÿ‹úþŸbS4ƒùꆄ‚öà†„„þöà†ˆþöbQ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöð†ƒùð†ƒù膃ˆñbOD†ˆ›bPDì†ìò†ìòØöò†ƒùö†ü؆ˆþöbMø†ˆ›§†ì†ì†ÒöøƒùbM\†ˆ›‘ÒöbL؆ˆ›‘ÒöbLT†ˆ›‘óßö؆ˆþöò†ƒùð†ƒùbK†ˆ›­ìò†Òöˆ›‘Òöò†ƒùð†ƒùð†ƒùð†ƒùò†ƒùbI(†ˆ›»‹áò†ìØö膃ˆñbH\†ˆ›Ÿì†Òöð†ƒùbG †ˆ›ŸìØöò†ƒùbG†ˆ›‘ÒöbF,†ˆ›§òò†ÒöÞ“õþþøð†ƒùbE$†ˆ›‹†Òöð†ƒùbDh†ˆ›‹Øöò†ƒùð†ƒùbCx†ˆ›­ì†ì†ÒöbB؆ˆ›‹†óßöbB†ˆ›»ì†ì†ì†Òöb=p†ˆ›bAÈb=؆‹šøbA\þŽþþb>bAHb>þŸbA8ƒùb@`†ˆ¦õ¡ò†Êþøb?°†ˆ¦õ§ì†ëßþøb>T„b>üˆ¦õ§‹á†Êþb>`ˆ¦õ™‹b>lþøôüb=ˆöò†ƒùb<€†ˆ›»ì†ì†ì†Òöb;¨†ˆ›»ì†ì†ì†Òöb:솈›­ì†ì†Òöö†üö†üöƒùð†ƒùò†ƒùb9ø†ˆ›‘Òöb8T†ƒúþŸb9ìƒùꆄ‚öꆆöb8À†ˆ¦õ·ä†‹Ø’ÍþøôüÚb7˜†ˆ›­ì†ìØöð†ƒùð†ƒùb6P†ˆ›b7Pì†ì†ì†ì†ì†Òöð†ƒùb5$†ˆ›b5üò†ì†ìò†Òööƒù膃ˆñb3d†ƒŽúþŸb4Ѓùꆆöb3̆ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùò†ƒùb2 †ˆ›b3ìò†ì†ìØöð†ƒù؆ˆþöb0à†ˆ›»ì†ì†ì†Òöb0\†ˆ›‘Òö؆ˆþöb/8†ˆ›»ì†ìò†Òööƒùò†ƒùð†ƒùb.d†ˆ›„ßöb-†ƒˆˆµòòò†Øb- †ˆ›‘óßö膃ˆñb,@†ˆ›‹†Òöð†üð†ƒùò†ƒùb+†ˆ›»ì†ì†ì†Òöð†ƒùb*\†ˆ›Ÿì†Òöb)„†ˆ›»ì†ì†ì†Òöb(䆈›Ÿì†Òöð†ƒùð†ƒùb'ð†ˆ›­ìò†Òöb'@ˆ›™†ì†Òöʆˆþöð†ƒùð†ƒùb%ô†ˆ›Ÿì†Òöð†ƒùb$$†ƒˆúþŸb%̃ùꆄ„þöꆈþöb$ †ˆ¦õ·ä†‹Ø’ÍþøôüÒb#L†ˆ›»ì†ìò†Òöð†ƒùb ؆ƒŽúþŸb#$ƒùb"8†„„‰ˆb#ì†ì†ìò†Üöꆈþöb!@†ˆ¦õ·ä†‹Ø’ÍþøôüÜb †ˆ›§†ì†ì†óßö膃ˆñð†ƒù脌ƒóƒùb´†ˆ›»ì†ì†ì†Òöb܆ˆ›»ì†ì†ì†Òöb†ˆ›»ìòò†Òöñð†üb䆈›»ì†ì†ì†Òöò†ƒùð†ƒùbˆ›­ìò†Òöð†ƒùb†ˆ›§ò†ì†ÒöbD†ˆ›­ì†ì†Òöbl†ˆ›»ì†ì†ìØöò†ƒùò†ƒùð†ƒùö†üð†ƒùð†ƒùbȆˆ›bÈìòòò†ì†Òöbð†ˆ›»ì†ì†ì†Òöö†üöƒùb@†ˆ›‘Òöb¼†ˆ›‘Òöb†ƒˆúþŸb°ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöb †ˆ¦õ·ä†‹Ø’ÍþøôüÒb€†ˆ›bX†ìòòò†ÒöbĆˆ›­ìò†Òöb솈›»ì†ìòØöö†übX†ˆ›‘Òöbœ†ˆ›­ìò†Òöò†ƒùb (†ƒˆúþŸbxƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöb ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒbĆˆ›b ì†ì†ì†ì†ìò†ìò†Òöøƒùb4†ƒúþŸb ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöbp†ˆ‘úþŸbĈþöb膈¦õ·ä†‹Ø’Íþøôüþàöb †ˆ¦õ·ä†‹Ø’ÍþøôüÚb°†ˆ›‘Òöbp†ƒŽúþŸb¤ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöb؆ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùb˜†ˆ›Ÿì†Òöb†ˆ›‘Òö膃ˆñb,†ˆ›­ìò†óßöaýt†ƒúþŸb ƒùꆄ‚öꆄ‚öꆄ‚öaþ؆„„‰ˆ»ì†ìò†óéöꆈþöaýà†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üaüІˆ›‘‹Çö脌ƒóƒùaû̆ˆ›»ì†ì†ì†Òöö†üaû†ˆ›Ÿì†Òö膃ˆñaúl†ˆ›‘Òöaù”†ˆ›»ì†ìò†Òöö†üЈŸßöð†ƒù膃ˆñ؆ˆþöa÷膈›Ÿì†Òöa÷†ˆ›»ì†ì†ì†ÒöÞ“õþþøØ†“õþþøØ†“õþþøØ†“õþþøð†ƒùò†ƒùð†ƒùaôÔ†ˆ›­ì†ì†Òö脌ƒóƒùaóІˆ›»ì†ì†ì†Òöö†üaó †ˆ›Ÿì†Òööƒùð†ƒùaòd†ˆ›‘Òöañ¨†ˆ›­ì†ìØöð†ƒùð†ƒùaƒŽúþŸañdƒùà†„„þöꆄ‚öꆆöaïü†ˆ¦õ·ä†‹Ø’ÍþøôüÜa›‘óßö膃ˆñö†üaíĆˆ›aîœò†ì†ìò†Òööƒù؆“õþþøè†ƒˆñaìX†ˆ›§†ì†ì†Òöö†üö†üaë`†ˆ›»ì†ì†ì†ÒöaêÀ†ˆ›Ÿì†Òö؆ˆþöa鸆ˆ›­ì†ì†Òöa醈›Ÿì†Òööƒùaè\†ˆ›ŸìØöa焆ˆ›»ìòò†Òöaæè†ƒˆˆ™†ì†Øö†üaä\†ƒˆúþŸaæÌƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöa䨆ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùaãh†ˆ›»ì†ì†ì†Òöaↈ›»ì†ìò†Òöö†üaᨆˆ›§òò†Òööƒùaà솈›Ÿì†Òöaà0†ˆ›­ì†ì†Òö膃ˆñaÞ<†ƒŽúþŸaßøƒùꆄ‚öꆄ‚öꆆöaÞ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜaÝœ†ˆ›Ÿì†ÒöaÛ„†ƒŽúþŸa݃ùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆöaÛ솈¦õ·ä†‹Ø’ÍþøôüÜð†ƒùaÙ$†ƒúþŸaÛ\ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöaÙ†ˆ¦õ·ä†‹Ø’ÍþøôüÚaØ0†ˆ›aÙì†ì†ì†ì†Òöð†ƒùaÖ̆ˆ›aØìò†ìò†ì†ì†ì†ÒöÞ“õþþøð†ƒùaÕ¨†ˆ›­ì†ìØöaÓ̆ƒˆúþŸaÕœƒùꆄ‚öꆄ‚öꆈþöaÔH†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù膃ˆñò†ƒùaÒ\†ˆ›aÓ\ì†ìò†ìòØöð†ƒùaÑ †ˆ›Ÿì†ÒöaÐt†ˆ›aÑh†ìò†ì†ì†ì†Òöö†ü膃ˆñöƒùð†üaÏ|†ˆ›‘ÒöaÎ܆ˆ›‹†Òöð†ƒùaΆˆ›­ì†ì†Òöö†üaÅЄaÍèƒaÅ܃šøaÍxþŽþþaÅúaÉ„øaÍþŽþþaÉ¢aÌôaÉžþŸaÌäƒùaËð†ˆ¦õaÌÈì†ìò†ÊþøaË@†ˆ¦õ§ì†ëßþøaÉä„aÊŒˆ¦õ§‹á†ÊþaÉðˆ¦õ™‹aÉüþøôüaÅöþŸaÉtƒùaÈH†ˆ¦õaÉXì†ì†ì†ìò†Êþøaǘ†ˆ¦õ§ì†ëßþøaÆ<„aÆäˆ¦õ§‹á†ÊþaÆHˆ¦õ™‹aÆTþøôüÚ脌ƒóƒùaÅ †ˆ›‘ÒöaÄH†ˆ›»ì†ì†ì†Òöaƈ›aÄ8ì†ì†ìòòò†ÒöaÂ`†ˆ›­ì†ì†ÒöaÁÀ†ˆ›Ÿì†Òöö†üaÁ†ˆ›ŸìØöˆ›ãöaÀ†ˆ›‘Òöð†ƒùa¾ø†ˆ›a¿Üì†ì†ì†ì†Òöð†ƒù؆ˆþöa½ð†ˆ›Ÿì†Òöa½P†ˆ›Ÿì†Òöa¸Ì†ƒŽúþŸa½Dƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöa¹4†ˆ¦õ·ä†‹Ø’Íþøôü܈›‘óßöʆˆŸßöð†üð†üð†ƒùð†ƒùa¶Ð†ˆ›Ÿì†Òöa¶0†ˆ›Ÿì†Òöaµt†ˆ›­ì†ì†Òö؆ˆþöð†ƒùð†ƒùö†üa´$†ˆ›­ì†ì†Òöð†ƒùa³†ˆ›a³øìò†ì†ì†Òöò†ƒùöƒù膃ˆña²†ˆ›Ÿì†Òöa±t†ˆ›Ÿì†Òöð†ƒùa¯,†ƒŽúþŸa±Lƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†ˆþöa¯”†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒù؆ˆþöa®$†ˆ›‘Òöð†üˆ›‘Òö؆“õþþøa¬˜†ˆ›Ÿì†Òöa«Ü†ˆ›­ìò†Òöaª†ƒˆúþŸa«Ðƒùꆄ‚öꆄ‚öꆆöaª|†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùa© †ˆ›§ò†ì†ÒöƆƒˆŸì†àa§Ä†ˆ›»ì†ì†ìØöð†ƒù膃ˆñð†ƒùò†ƒù膃ˆña¦D†ˆ›»ì†ì†ì†Òöˆ›‘Òöð†ƒù膃ˆñð†üð†ƒùa¤ †ˆ›Ÿì†Òöa£†ƒŽúþŸa¤”ƒùꆄ‚öꆈþöa£h†ˆ¦õ·ä†‹Ø’ÍþøôüÜa¢(†ˆ›»ì†ì†ì†Òöa¡P†ˆ›»ì†ì†ì†Òöa x†ˆ›»ì†ì†ì†ÒöaŸ †ˆ›»ì†ì†ì†Òöö†üò†ƒùð†ƒùaø†ˆ›aŸLì†ì†ì†ì†ìò†ìò†Òöaˆ›aèì†ì†ì†ì†Òöaœd†ˆ›‹†Òöð†ƒùð†ƒùð†ƒùð†ƒùð†ƒùa™p†ƒˆúþŸa›Ìƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆆöa™ì†ˆ¦õ·ä†‹Ø’ÍþøôüÒa˜Ð†ˆ›Ÿì†Òöa˜L†ˆ›‘Òöð†ƒùð†ƒùò†ƒùò†ƒùøƒùa—8„a—Àƒa—DƒŠþŸŒƒùôüÚa–`†ˆ›»ì†ì†ì†Òöa•ˆ†ˆ›»ì†ì†ì†Òöa”°†ˆ›»ì†ì†ì†Òöa”†ˆ›Ÿì†Òööƒùð†ƒùò†ƒùa’̆ˆ›a“°ìò†ì†ìØöa’0†ƒˆˆ™†ì†Øa‘X†ˆ›»ì†ì†ì†Òöö†üa`ˆ›a‘8ì†ì†ì†ì†Òöð†ƒùaެ†ƒˆúþŸa,ƒùꆆöa(†ˆ¦õ·ä†‹Ø’ÍþøôüÒaކƒˆˆ­ì†ì†Øò†ƒùat†ˆ›‘óßöaŒÔ†ˆ›‹†Òöa‹¬†ƒˆˆaŒÄì†ì†ìò†ì†ìò†ØaŠÔ†ˆ›»ì†ì†ì†Òöa‰ü†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒùüüð†ƒùö†üð†ƒùʆˆŸßöð†ƒùaˆd†ˆ›‘óßöa‡à†ˆ›‘óßöò†ƒùa†à†ˆ›‹†‹ˆ‘a†øöa†@†ˆ›‹†Òöa…†ˆ›Ÿ‹áØöò†ƒùò†ƒùö†üa„x†ˆ›»ì†ì†ì†Òö؆ˆþöaƒl†ˆ›Ÿ‹ˆÙØöa‚”†ˆ›»ì†ì†ì†Òöaô†ˆ›Ÿì†Òöa†ˆ›»ì†ì†ì†Òöa€D†ˆ›§†ìò†ÒöʃˆŽü˜þò„þÝaL†ˆ›‘Òöa~Ȇˆ›ãöa~(†ˆ›Ÿì†Òöa}$†ˆ›a~‹áò†ìò†Òö膃ˆñaz´†ƒúþŸa|ìƒùꆄ„þöꆄ‚öꆄ‚öà†„„þöà†ˆþöa{ †ˆ¦õ·ä†‹Ø’ÍþøôüÚayü†ƒˆˆ»ìò†ì†Øay$†ˆ›§ò†ì†óßöð†ƒùò†ƒùasŒ†ˆ›‘‹šøax„þŽþþat.axpat*þŸax`ƒùaw¤†ˆ¦õ§ì†Êþøaw†ˆ¦õ™Êþøav|†ˆ¦õ™Êþøaŭˆ¦õ§ì†ëßþøatp„auˆ¦õ§‹á†Êþat|ˆ¦õ™‹atˆþøôüas¤ö؆ˆþöaoàƒˆúþŸas4ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆆöapP†ˆ¦õ·ä†‹Ø’ÍþøôüÒao†ˆ›™†ì†Òöanx†ˆ›‹†óßöam¼†ˆ›­ì†ì†Òöai†ƒúþŸam°ƒùꆄ„þöaj<†ˆ‘úþŸampƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöaj´†ˆ¦õ·ä†‹Ø’ÍþøôüÞöail†ˆ¦õ·ä†‹Ø’ÍþøôüÚah †ˆ›ahðì†ìòò†Òö膃ˆñ膃ˆñae؆ƒŽúþŸag¨ƒùꆄ‚öꆄ‚öà†ˆþöaf@†ˆ¦õ·ä†‹Ø’ÍþøôüÜad¬†ˆ›aeÈì†ì†ì†ì†ì†ìØöð†ƒùð†ƒùac¸†ˆ›­ì†ì†Òöabà†ˆ›»ì†ì†ì†Òöab†ˆ›»ì†ì†ì†Òöaa0†ˆ›»ìòò†Òööƒùò†ƒùò†ƒùa_ð†ˆ›a`Ôìòò†ì†Òöa_l†ˆ›‘óßöʆˆþöa^d†ˆ›Ÿì†Òöa]†ˆ›a^Tì†ì†ì†ì†ìòò†ì†Òöð†ƒùa\(†ˆ›­ìò†óßöa[l†ˆ›­ì†ìØöaZ\†ˆ›a[\ì†ìò†ì†ì†Òö脌ƒóƒùaY<†ˆ›aZ ì†ìò†ì†Òööƒùò†ƒùaXL†ˆ›™†ì†Òöò†ƒùð†ƒù؆ˆþöð†ƒùaW†ˆ›Ÿì†ÒöaV†ˆ›aWì†ì†ìò†ì†ÒöaU|†ˆ›‘ÒöaTÀ†ˆ›™†ì†ÒöaTˆ›­ìòùßöaR(†ƒˆúþŸaSøƒùꆄ‚öꆄ‚öꆈþöaR¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒaQl†ˆ›­ì†ì†Òöð†ƒùð†ƒùò†ƒùò†ƒùaP,†ˆ›»ì†ì†ìØö؆ˆþöö†üaNø†ˆ›»ì†ì†ì†ÒöaNt†ˆ›‘ÒöaMÔ†ˆ›‹†óßööƒùaJŒ†ƒúþŸaM¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚ö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆈þöaJø†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùaIІˆ›Ÿì†óßöaI†ˆ›­ì†ì†Òöa;\†ƒŽúþŸaIƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öa=¤†„„‰úþŸaH(ƒùꆄ‚öaE”†„„‰úþŸaGèƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆈþöaF†ˆ¦õ·ä†‹Ø’ÍþøôüÖöaAü†„„‰úþŸaEˆƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöↄ„‰õöꆄ„þöꆄ‚öↈ‰õöaB„†ˆ¦õ·ä†‹Ø’ÍþøôüÖöa>ü†ˆ‰úþŸaAðƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöa?„†ˆ¦õ·ä†‹Ø’ÍþøôüÖöa>,†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöƆ„„‰ˆ‘Üöꆄ‚öꆄ‚öꆆöa;Ćˆ¦õ·ä†‹Ø’ÍþøôüÜa:0†ˆ›a;Lì†ì†ì†ìò†ìØöa9†ˆ›Ÿì†Òö؆ˆþö膃ˆña8x†ˆ›ŸìØöa70†ˆ›a8hì†ìòòòòò†ÒöÞ“õþþøð†ƒùa3䆃úþŸa6¼ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöa4P†ˆ¦õ·ä†‹Ø’ÍþøôüÚa2œ†ˆ›a3¬†ì†ì†ì†ìòò†Òöð†ƒù؆ˆþöa1\†ˆ›»ì†ì†ì†Òöa0ˆ›»ìò†ì†Òöa/†ˆ›µòòò†Òöð†ƒùö†üa.8†ˆ›a/Tìò†ì†ì†ì†ì†Òöa*H„a.,ƒa*Tƒšøa-¼þŽþþa*ra-¨a*nþŸa-˜ƒùa,À†ˆ¦õµì†ì†Êþøa,†ˆ¦õ§ì†ëßþøa*´„a+\ˆ¦õ§‹á†Êþa*Àˆ¦õ™‹a*ÌþøôüÚa)p†ˆ›»ì†ì†ì†Òö؆ˆþöa(L†ˆ›»ì†ì†ì†Òöa'Ȇˆ›‘Òöa&ð†ˆ›»ìòòØööƒùa&P†ˆ›‘Òö脌ƒóƒù؆ˆþöa%†ˆ›»ìòò†Òöa#€†ˆ›a$ðì†ì†ìòòòòòò†Òöñð†ƒùa"(†ˆ›a#òòò†ì†óßöa!ˆ†ˆ›Ÿì†Òöa8†ˆ›a!xìa †‹šøa äþŽþþaÚa ÐaÖþŸa Àƒùa؆ˆ¦õµ‹áò†Êþøa(†ˆ¦õ§ì†Êþøax†ˆ¦õ§ì†ëßþøa„aĈ¦õ§‹á†Êþa(ˆ¦õ™‹a4þøôüaPöa˜†ˆ›Ÿì†Òöaø†ˆ›Ÿì†Òööüò†ƒùa$†ˆ›‹ùßöah†ˆ›™†ìØö膃ˆñaœ†ˆ›Ÿì†Òö膃ˆñ膃ˆñaÀ†ˆ›‘Òöa †ˆ›Ÿì†Òöa€†ˆ›Ÿì†Òöa¨†ˆ›»ìòòØöaІˆ›§†ìò†Òööƒùð†ƒùa†ˆ›‘Òöa†ˆ›‘Òöa¸†ˆ›»ì†ì†ì†Òöˆ›‘Òöa°†ˆ›‘Òöa †ˆ›ax†ìò†ì†ì†ÒöaÔ†ƒúþŸa”ƒùꆄ„þöꆄ‚öꆈþöa@†ˆ¦õ·ä†‹Ø’ÍþøôüÚa4†ˆ›Ÿì†óßö̆ƒˆˆ‘Øa 0†ˆ›Ÿì†Òöa †ˆ›Ÿì†Òöa ¸†ˆ›»ìò†ì†Òöa à†ˆ›»ìò†ì†Òööƒùa 0†ˆ›™ëŠÕöò†ƒù脌ƒóƒùa h†ˆ›‘ÒöaH†ˆ›a 0†ä†‹á†ì†ì†ÒöăƒúþŸa<ƒùꆆöa8†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù脌ƒóƒùa¬†ˆ›»ì†ì†ì†ÒöaÔ†ˆ›»ì†ì†ì†Òöaü†ˆ›»ì†ì†ì†Òö؆ˆþöö†üaȆˆ›»ìòòØöaÔ†ˆ›a¸ìò†ìò†Òöøƒùò†ƒùð†ƒùð†ƒùð†ƒù`ÿ؆ƒŽúþŸaDƒùꆈþöa@†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù`þ¬†ˆ›`ÿ„†ì†ì†ì†ì†Òö`ýð†ˆ›­ì†ì†Òö`ý†ˆ›»ì†ìò†Òö脌ƒóƒù؆ˆþöö†üð†ƒùö†ü`ûĆˆ›Ÿì†óßööƒùð†ƒù`ú솈›‹†Òö`úh†ˆ›‘Òö`ù¬†ˆ›­ì†ì†Òö`ø€†ˆ›`ùt†ì†ìòòòØöð†ƒùð†ƒù`÷†ˆ›`ø8ì†ì†ì†ìò†ìØö`ö|†ˆ›Ÿì†Òöö†ü`õ膈›‘Òö؆ˆþöö†ü`ô´†ˆ›»ì†ì†ì†Òö`ô†ˆ›Ÿì†Òö`ó<†ˆ›»ì†ì†ì†Òöö†ü`òŒ†ˆ›ŸìØöñ`ñ¤†ˆ›™†ì†Òö`ñ †ˆ›‘Òöö†ü脌ƒóƒùЈŸßö`ïø†ˆ›‘Òö`ïX†ˆ›Ÿì†Òöð†ƒùð†üò†ƒù`îh†ˆ›Ÿì†Òöð†ƒùð†ƒù`ít†ˆ›™†ì†Òöò†ƒùð†ƒù`êÔ†ƒúþŸ`í4ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö`ë@†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒùð†ƒù`倆ˆ›`êpì†ìò`å膋šø`é¤þŽþþ`æ"`é`æþŸ`逃ù`èp†ˆ¦õ`édì†ìòò†Êþø`çÀ†ˆ¦õ§ì†ëßþø`æd„`ç ˆ¦õ§‹á†Êþ`æpˆ¦õ™‹`æ|þøôü`å˜öö†ü`䘆ˆ›»ì†ì†ì†Òöð†ƒù`㈆ˆ›µ†ì†ìò†Òö`â°†ˆ›»ì†ìò†Òö`ↈ›‘‹Çö`álˆ›­ìòùßö`आˆ›­ì†ì†Òöò†ƒù`ß´†ˆ›»ì†ì†ìØö`Þ܆ˆ›»ì†ì†ì†Òö`Þ†ˆ›»ì†ì†ì†Òö`Ýd†ˆ›Ÿì†Òööü`ÜŒ†ˆ›™†ì†Òö`Û솈›‹†óßöò†ƒù`Û4†ˆ›Ÿì†Òö膃ˆñð†ƒù`Ú0†ˆ›­ì†ìØö`Ùt†ˆ›™†ì†Òö`ØH†ˆ›`Ùdì†ì†ì†ì†ì†ìØö`Õd†ƒúþŸ`Ø<ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö`ÕІˆ¦õ·ä†‹Ø’ÍþøôüÚ`ÔŒ†ˆ›»ì†ì†ì†Òö؆ˆþö`Ò ˆ›`Ô0ì†ì†ì†`Ó4†‹ˆ™ò†ÈòØö`Ï †ƒŽúþŸ`Òˆƒùà†„„þöà†„„þöà†„„þöà†„„þöà†„„þöà†„„þöà†ˆþö`Іˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù`Íà†ƒúþŸ`Ïxƒùꆄ„þöꆆö`ÎL†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒù`͆ˆ›Ÿ‹á†Òö`ËŒ†ƒˆúþŸ`Í ƒùꆆö`̆ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù`ʆˆ›`Ëdì†ì†ì†ì†ìòò†ì†Òö`Ép†ˆ›Ÿì†Òöö†üð†ƒù`Ȉ†ˆ›­ì†ìØö`Çx†ˆ›`Èxì†ìò†ì†ì†Òööƒùð†ƒù`Ƽ†ˆ›‘óßö`Æ8†ˆ›‘óßö膃ˆñ`ÅP†ˆ›­ì†ì†Òö`Äh†ˆ›‹†‹ˆ‘`Ä€öò†ƒù`Ô†ˆ›™†ìØöð†ƒù` †ˆ›»ì†ì†ì†Òö脌ƒóƒùò†ƒùð†ƒù`Áh†ˆ›§†ìò†ÒöÞ“õþþøð†ƒù`À|†ˆ›‘Òö`¿À†ˆ›™ò†óßö`¿ †ˆ›Ÿì†Òö`¾œ†ˆ›‘Òö`½ü†ˆ›Ÿì†Òö`¼ †ƒˆúþŸ`½ðƒùꆄ‚öꆄ„þöꆈþö`¼œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒ`¹Ü†ƒúþŸ`¼ƒùꆄ„þöꆄ‚öꆄ‚öà†„„þöà†ˆþö`ºH†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`¹X†ˆ›‘Òöʆˆþö`¸†ˆ›§†ì†ì†Òö`·¤“õþþÚ“õþþøð†ƒù`µ†ƒˆúþŸ`·`ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö`µ”†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùò†ƒùð†ƒùð†ƒù`³ô†ˆ›­ì†ì†Òö`±\†“®`²ˆø˜`³Ää‚`²ð‚ˆ–’—ÓêØü–üêê`±äºþ`±x›‘Òöˆ›ãöò†ƒù`°<†ˆ›‘Òöò†ƒù`®X†ƒúþŸ`°ƒùꆄ„þöꆄ„þöꆈþö`®Ä†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`­H†ˆ›`® †ì†ì†ì†ì†Òö`¬Œ†ˆ›­ì†ì†Òö`«ì†ˆ›Ÿì†Òö`«0†ˆ›­ì†ì†óßö`ªH†ˆ›Ÿ‹ˆÙ†óßö`©`ˆ›µòò†ìØöð†ƒù`§X†ƒúþŸ`©,ƒùꆄ‚öꆄ‚öà†ˆþö`§Ä†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù膃ˆñ؆ˆþö`¥ì†ˆ›»ì†ì†ì†Òö؆ˆþö`¤È†ˆ›»ìòò†Òö`£ð†ˆ›»ìòò†Òö`¢Ä†ˆ›`£àìò†ì†ì†ìò†ÒöЈŸßöð†ƒù`¡0†ˆ›`¢†ìò†ì†ì†Òö` †ˆ›Ÿì†Òö`Ÿð†ˆ›Ÿì†óßö`Ÿ4†ˆ›­ì†ì†Òöò†ƒùò†ƒùð†ƒù`—¤„`žÜƒ`—°ƒšø`žlþŽþþ`—Î`žX`—ÊþŸ`žHƒù`Œ†ˆ¦õ“†ëßþø`œÀ†ˆ¦õ¡†ì†ëßþø`œ†ˆ¦õ§ì†Êþø`›`†ˆ¦õ§ì†Êþø`š°†ˆ¦õ§ì†Êþø`š†ˆ¦õ™Êþø`™l†ˆ¦õ§ì†ëßþø`˜„`˜¸ˆ¦õ§‹á†Êþ`˜ˆ¦õ™‹`˜(þøôüÚ`–膈›­ì†ì†Òö`–†ˆ›»ì†ì†ì†Òö`•8†ˆ›»ìò†ì†Òö`”`†ˆ›»ìò†ì†Òöøƒùð†ƒùö†ü膃ˆñ`’Ćˆ›`“àì†ì†ì†ìòò†Òö`‘´†ˆ›`’Œòòò†ì†óßö`‘†ˆ›‹†Òö`<†ˆ›»ì†ì†ì†Òö`€†ˆ›™ò†Òö؆ˆþö`Žx†ˆ›­ì†ì†Òö`¼†ˆ›­ì†ìØöö†üö†üð†ƒù`‹`ƒˆúþŸ`tƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö`‹Ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒ`Šl†ˆ›`‹D䆋á†ì†Òö`ˆh†ƒŽúþŸ`Š`ƒùꆄ„þöꆄ‚öꆄ‚öà†ˆþö`ˆÐ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ`†´†ƒˆúþŸ`ˆ\ƒùꆄ„þöꆈþö`‡0†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùò†ƒù؆ˆþöö†ü`…L†ˆ›»ì†ì†ì†Òö`„¬†ˆ›Ÿì†Òö`„ †ˆ›Ÿì†Òö`ƒ4†ˆ›»ì†ì†ì†ÒöăˆþŸŒƒùôüÜ膃ˆñ`°†ˆ›»ìò†ì†Òö`,†ˆ›‘Òöð†ƒùð†ƒù`Ȇˆ›`€äìò†ì†ì†ì†ì†Òö`{„`¼ƒ`{$ƒšø`LþŽþþ`{B`8`{>þŸ`(ƒù`~l†ˆ¦õ§ì†Êþø`}†ˆ¦õµ‹á†ì†Êþø`|à†ˆ¦õ§ì†ëßþø`{„„`|,ˆ¦õ§‹á†Êþ`{ˆ¦õ™‹`{œþøôüÚ`z@†ˆ›»ì†ì†ì†Òö`y †ˆ›Ÿì†Òö`x䆈›­ì†ì†Òö`wœ†ˆ›`xÔì†ìò†ì†ìò†ì†Òööü`vü†ˆ›‘Òö`u †ƒŽúþŸ`vðƒùꆄ„þöꆄ„þöꆄ‚öꆆö`ut†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒù`sT†ƒŽúþŸ`tèƒùꆄ„þöꆆö`s¼†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒù`q„†ƒˆúþŸ`s„‚öꆆö`r†ˆ¦õ·ä†‹Ø’ÍþøôüÒ`pȆˆ›™òØö`nœ†ƒúþŸ`p¼ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öↈ‰õö`o†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`mü†ˆ›Ÿì†Òöò†ƒù`m †ˆ›»ì†ì†ì†Òöò†ƒùˆ›‘Òöð†ƒù`kІˆ›ãö膃ˆñ`k †ˆ›‘Òö`jH†ˆ›§òò†Òöò†ƒù`i†ˆ›‹†óßöò†ƒùò†ƒù`hˆ†ˆ›»ìòò†Òöö†üö†ü؆ˆþö`gD†ˆ›»ì†ì†ì†Òö`fl†ˆ›»ì†ì†ì†Òöˆ›‘Òöò†ƒùð†ƒù`dø†ˆ›­ì†ì†Òöð†ƒù`d<†ˆ›Ÿì†Òö膃ˆñ`b\†ƒúþŸ`cô„„þöꆄ„þöꆈþö`bȆˆ¦õ·ä†‹Ø’ÍþøôüÚ`a†ˆ›`b$†ì†ìò†ì†ì†ìØö``X†ˆ›­ì†ì†Òö`_€†ˆ›»ì†ì†ì†Òö`^¨†ˆ›»ì†ì†ì†Òöö†ü`]À†ˆ›»ì†ì†ì†Òö`] †ˆ›Ÿì†Òö`\ˆ›`\è†ì†ì†ì†ì†ì†Òö`Z†ˆ›`[äìòòòòòòòòòòòòùßö`Y,†ˆ›»ì†ì†ì†óßö`V†ˆ›™†‹úþŸ`Yƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆈþö`W†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒùð†ƒùò†ƒù`U†ˆ›­ì†ì†Òöö†üð†ƒù`T†ˆ›»ì†ì†ì†Òöð†ƒù`S@„`S؃`SLƒšðþŸŒƒùôüÚö†ü`Rt†ˆ›­ì†ì†Òö`P¼†ˆ›`Rdì†ì†ì†ì†ì†ì†ìòòò†ì†Òö`P†ˆ›™ò†óßö`Olˆ›‹Øö`N¤†ˆ›™†ì†Òö膃ˆñ`M„†ˆ›`Nhì†ìòòØöö†ü`Lœ†ˆ›»ì†ì†ì†Òö`KĆˆ›»ìò†ì†Òö脌ƒóƒù`Jl†ˆ›`Kˆì†ì†ìòòò†Òö`Ĭˆ›Ÿì†Òö`Hô†ˆ›»ì†ì†ì†Òöøƒù膃ˆñ`G؆ˆ›»ìò†ì†Òö`GT†ˆ›‘óßö`F˜†ˆ›­ì†ì†óßöð†ƒùò†ƒù`E¨†ˆ›­ì†ì†Òö`DІˆ›»ì†ì†ì†Òöð†ƒù`D0†ˆ›‘Òö`C€ˆ›™†ì†Òöð†ƒùð†ƒùð†ƒùð†ƒù`Bd†ˆ›Ÿì†Òö`?䆃úþŸ`BXƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöà†ˆþö`@P†ˆ¦õ·ä†‹Ø’ÍþøôüÚ`>0†ƒˆúþŸ`?؃ùꆄ„þöꆈþö`>¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù`=<†ˆ›»ì†ìò†Òöö†ü`̆ƒúþŸ_@dƒùꆄ„þöꆆö_?8†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù_=ô†ˆ›Ÿì†Òö_=T†ˆ›‹†Òö_;P†ƒˆúþŸ_=Hƒùꆄ‚öꆄ‚öꆄ„þöꆈþö_;̆ˆ¦õ·ä†‹Ø’ÍþøôüÒˆ›‘Òö_9¼†ˆ›_:¼ìòòò†ì†óßö_98†ˆ›‘Òö_8|†ˆ›­ìò†Òö_7܆ˆ›‹†Òö_6P†ƒˆúþŸ_7Ѓùꆆö_6̆ˆ¦õ·ä†‹Ø’ÍþøôüÒ_5°†ˆ›‹†Òöð†ƒù_3̆ƒŽúþŸ_5ˆƒùꆄ‚öꆄ‚öꆆö_44†ˆ¦õ·ä†‹Ø’ÍþøôüÜ_3†ˆ›‹†‹Çöö†üö†ü_1 †ƒˆúþŸ_2ðƒùꆄ‚öꆄ„þöꆈþö_1œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒù膃ˆñò†ƒùð†ƒù_0†ˆ›‹†Òöð†ü؆ˆþö_.Ćˆ›»ì†ì†ì†Òöö†ü_.†ˆ›Ÿì†Òö膃ˆñöüö†üð†ƒù膃ˆñò†ƒùð†ƒùð†ƒùð†ƒù̆ƒˆˆ‘Øð†ƒùð†ƒù؆ˆþöΆƒŒü˜þò„þçØ†ˆþö_*œ†ˆ›»ìòò†Òöð†ƒù_)Ј›™†ì†Òö_'˜†ƒˆúþŸ_)¸ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö_(†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_&À†ˆ›»ìò†ì†Òö_!H†ƒˆúþŸ_&´ƒù_$€†„„‘úþŸ_&œƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö_$ø†ˆ¦õ·ä†‹Ø’ÍþøôüÞö_"”†ˆ‰’úþŸ_$tƒùꆄ‚öꆄ‚öꆆö_# †ˆ¦õ·ä†‹Ø’ÍþøôüÔö_!Ćˆ¦õ·ä†‹Ø’ÍþøôüÒ_ †ƒˆˆ_!_ †‹úþŸ_!ƒùꆄ‚öꆄ‚öà†ˆþö_œ†ˆ¦õ·ä†‹Ø’ÍþøôüÂ†ì†Øð†ƒù_Ȇˆ›™†ìØö_(†ˆ›Ÿì†Òö_¤†ˆ›‘Òö_x†ˆ›_”ìò†ìò†ìòØöö†üð†ƒù؆ˆþö_`†ˆ›‹†Òö_¤†ˆ›­ì†ìØö_ôˆ›­ìòØö_d†ˆ›‘Òö_Ȇˆ›_,òòòò†ìòòòò†Òö_4†ˆ›‘‹èßö_”†ˆ›Ÿì†Òöð†ƒùò†ƒù膃ˆñö†ü؆ˆþöð†ƒù脌ƒóƒùò†ƒù_؆ˆ›‹†Òö_8†ˆ›Ÿì†Òö_ˆ›_(ì†ìò†ìòò†Òö膃ˆñ_†ˆ›»ì†ì†ì†Òöð†ƒù؆ˆþö_†ˆ›‘Òö_ DƒˆúþŸ_ƒùꆄ‚öà†„„þöꆄ‚ö_ „†ˆ‰’úþŸ_lƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö_ †ˆ¦õ·ä†‹Ø’ÍþøôüÔö_ ´†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_ |†ˆ›™ò†Òö膃ˆñ_”†ˆ›­ì†ì†óßö_¼†ˆ›»ì†ì†ì†Òö_Ȇˆ›_¬ì†ì†ì†ì†Òö_ð†ˆ›»ì†ìò†Òöö†ü_ø†ˆ›»‹á†ì†ìØööƒùð†ƒù_ †ƒˆúþŸ_´ƒùꆄ‚öꆆö_ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒ_ˆ†ˆ›‘Òö_°†ˆ›»ì†ì†ì†Òö_P†_¢þò„þò„þò„þò„þò„þò„þò„þò„þ„ü „þò„þò„þè÷^ÿ°†ˆ›‹†Òöö†ü^þ䆈›­ìò†Òööƒù^þ †ˆ›™†ì†Òöð†ƒù^ýP†ˆ›Ÿì†Òöö†ü脌ƒóƒùò†ƒù^ü\†ˆ›ŸìØöö†üüü^û,†ˆ›^üòòòò†Òö^ú8†ˆ›^ûì†ìò†ì†Òö^ù˜†ˆ›Ÿì†Òö^øÌ†ˆ›­‹á†ìØö^÷¼†ˆ›^ø¼ìò†ì†ì†ìØöð†ƒù^òÈ„^÷”ƒ^òÔƒšø^÷$þŽþþ^òò^÷^òîþŸ^÷ƒù^ö(†ˆ¦õ¡ò†Êþø^õ@†ˆ¦õ¯òò†Êþø^ô†ˆ¦õ§ì†ëßþø^ó4„^ó܈¦õ§‹á†Êþ^ó@ˆ¦õ™‹^óLþøôüÚÆ†«þÚ„üˆ„þè÷^ñ€†ˆ›»ì†ì†ì†Òöö†ü膃ˆñ^ð4†ˆ›^ñ4ìò†ìò†ì†Òö^ï ˆ›Ÿì†Òöð†ƒù膃ˆñð†ƒùò†ƒù^î@†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒù^턆ˆ›‘Òö^뼆ƒŽúþŸ^íxƒùꆄ„þöꆄ„þöꆆö^ì$†ˆ¦õ·ä†‹Ø’ÍþøôüÜ^餆ƒˆúþŸ^ë°ƒùꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õö^ê †ˆ¦õ·ä†‹Ø’ÍþøôüÒö†ü^è †ˆ›^é„ìòòò†Òö^è ˆ›Ÿì†óßöð†ƒù^ç(†ˆ›™†ìØö^å\†ƒúþŸ^çƒùꆄ„þöꆄ„þöꆈþö^åȆˆ¦õ·ä†‹Ø’ÍþøôüÚö†ü^äX†ˆ›^å<ìò†ì†ì†Òö^〆ˆ›»ì†ì†ì†Òöð†ƒù^âĆˆ›ŸìØö^ↈ›­ìò†ÒöЈþöð†ƒù^߆ƒúþŸ^áxƒùꆄ‚öꆄ‚öꆄ‚öꆈþö^ßü†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^Ú€†ƒŽúþŸ^ß„ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^Ú膈¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒù^Ôl†ƒúþŸ^Ú<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö^ÔØ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^Ó°†ˆ›­ìò†Òö^ÒØ†ˆ›»ì†ì†ì†Òö^Ò†ˆ›­ì†ì†Òö^ј†ˆ›‘Òö^Ð܆ˆ›™†ì†óßöüüð†ƒù膃ˆñ^Ïä†^Ðvþò„þ΄ü”„þò„þè÷^ÏD†ˆ›Ÿì†Òö^Έ†ˆ›™†ì†Òö^Ͱ†ˆ›§†ìò†Òö膃ˆñ膃ˆñ^ÌÔ†ˆ›‘Òö^ËĆˆ›^Ìœ†ìòò†ìØöö†ü^Ê܆ˆ›»ì†ì†ì†Òö؆ˆþö^Éð†ˆ›Ÿì†Òö^ÉP†ˆ›ŸìØö^È̆ˆ›‘Òöˆ›ãö^ÇŒ†ˆ›™ò†óßö^Ƹ„^ÇL“õþþØ‚“õþþÚ“õþþøð†ƒùò†ƒùö†ü^Ô†ƒŽúþŸ^Æhƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^Ãü†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒùð†ƒùð†ƒù^ˆ†ˆ›‹†Òöð†ƒù^Á̆ˆ›ŸìØö^Á†ˆ›­ìò†óßö^Àp†ˆ›‹†Òö^¿˜†ˆ›§†ì†ì†Òö^¾@†ˆ›^¿ˆì†ì†ä†‹áòòò†Òö^º$†ƒˆšø^½ÔþŽþþ^º^^½À^ºZþŸ^½°ƒù^¼¬†ˆ¦õ^½„‹á†ì†ì†Êþø^»ü†ˆ¦õ§ì†ëßþø^º „^»Hˆ¦õ§‹á†Êþ^º¬ˆ¦õ™‹^º¸þøôüÒ^¹„†ˆ›‹†Òöð†ƒùöƒù^¸ †ˆ›^¹<ìò†ìòò†ìØö^·†ˆ›^·èò†ìòò†Òö^¶p†ˆ›Ÿì†Òöð†ƒù^µÐ†ˆ›‘Òöö†ü^´°†ˆ›^µ°ìò†ì†ì†ì†Òö^¯€„^´¤ƒ^¯Œƒšø^´4þŽþþ^¯ª^´ ^¯¦þŸ^´ƒù^²ð†ˆ¦õ^³ô䆋á†ì†ì†Êþø^±ø†ˆ¦õ^²Ð‹á†ì†ì†Êþø^±H†ˆ¦õ§ì†ëßþø^¯ì„^°”ˆ¦õ§‹á†Êþ^¯øˆ¦õ™‹^°þøôüÚ^®¨†ˆ›»ì†ì†ì†Òö^®†ˆ›Ÿì†Òööƒùö†ü^­<†ˆ›Ÿì†Òö^«`†ƒˆúþŸ^­0ƒùꆄ‚öꆄ‚öꆈþö^«Ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^ªÜ†ˆ›‘Òö^ª<†ˆ›‹Øö^©€†ˆ›™ò†Òö^§†ƒˆúþŸ^©tƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆆö^§”†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^¦†ˆ›^¦à†ìòò†ìØöò†ƒù^¥†ˆ›§†ì†ì†óßö^¤@†ˆ›»ì†ì†ì†Òö^£ †ˆ›Ÿì†Òö^£†ˆ›Ÿì†Òö^¢ †ˆ›µ†ì†ì†ì†Òö؆ˆþö^¡ †ˆ›ŸìØö^ €†ˆ›ŸìØöÞ“õþþøò†ƒù^Ÿ|†ˆ›‹†Òöð†ƒùð†ƒù^™°†ˆ›^Ÿ4^š†‹šø^ž¼þŽþþ^šR^ž¨^šNþŸ^ž˜ƒù^P†ˆ¦õ^ž|ì†ì†ìòò†ì†Êþø^œ †ˆ¦õ§ì†Êþø^›ð†ˆ¦õ§ì†ëßþø^š”„^›<ˆ¦õ§‹á†Êþ^š ˆ¦õ™‹^š¬þøôü^™Èö؆ˆþö^˜Ä†ˆ›Ÿì†Òö^–ôƒˆúþŸ^˜¸ƒùꆄ„þöꆄ‚öꆆö^—d†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñ^”P†ƒúþŸ^–°ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^”¼†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþöð†ƒùö†ü^’䆈›»ì†ì†ì†Òö^’(†ˆ›­ìòØöЈþö^”†ˆ›^‘°ì†ìò†ìòò†Òö^ޤ†ƒŽúþŸ^ˆƒùꆄ‚öꆄ‚öꆄ„þöꆆö^ †ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù^°†ˆ›»ì†ì†ì†Òöò†ƒù^\†ƒˆúþŸ^Œƒù^‚ІƒŽúþŸ^tƒùꆄ‚öò†ƒù^„†ˆ‘úþŸ^ƒùꆄ„þö^‰ˆ†„„‰úþŸ^ŒÜƒùꆄ‚öò†ƒù^Šà†ˆ‘úþŸ^Œ„ƒùꆄ‚öꆈþö^‹X†ˆ¦õ·ä†‹Ø’Íþøôüþàö^Іˆ¦õ·ä†‹Ø’ÍþøôüÖö^…ð†„„‰úþŸ^‰|ƒùꆄ‚öò†ƒù^‡H†ˆ‘úþŸ^‰$ƒùↄ„‰õöꆄ„þöꆈþö^‡À†ˆ¦õ·ä†‹Ø’Íþøôüþàö^†x†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆈþö^„€†ˆ¦õ·ä†‹Ø’Íþøôüþàö^ƒ8†ˆ¦õ·ä†‹Ø’ÍþøôüþÞꆈþö^؆ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù^ˆ†ˆ›^0ì†ìò†ì†ì†ì†ìòò†ìò†Òöö†üö†ü^~䆈›‘Òö^~D†ˆ›ŸìØö^}¤†ˆ›ŸìØöñð†ƒùð†ƒù^zü†ˆ›Ÿ‹ˆúþŸ^}$„‚öà†ˆþö^| †ˆ¦õ·ä†‹Ø’Íþøôü^{d†Òöð†ƒù^z\†ˆ›‘Òöð†ƒù^w¬†ƒúþŸ^z4ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö^x†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù̆ƒŽü˜þò„þåö†üöƒù^tü†ƒˆúþŸ^vôƒùꆄ‚öꆄ‚öꆄ‚öꆆö^ux†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñ^sø†ˆ›»ìò†ì†Òöð†ƒù^sX†ˆ›ãö^rÔ†ˆ›‘óßö^qŒ†ˆ›^rÄìòòò†ì†ìò†óßö^pІˆ›™†ìØö^p†ˆ›­ì†ì†Òö^o<†ˆ›»ì†ì†ì†Òöð†ƒù^nˆ›^oìòòò†ì†óßöð†ƒù؆ˆþö^lІˆ›»ì†ì†ì†Òö^kø†ˆ›»ì†ì†ì†Òö^k †ˆ›»ì†ì†ì†Òö^j€†ˆ›Ÿì†Òö^ià†ˆ›ŸìØööƒùð†ü^h,†ƒúþŸ^iœƒùꆆö^h˜†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù^e܆ƒŽúþŸ^gèƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþö^fD†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù膃ˆñö†ü^d¬†ˆ›»ì†ì†ì†Òö؆ˆþö^cˆ†ˆ›»ì†ì†ì†Òö^b°†ˆ›»ì†ì†ì†Òö^a؆ˆ›»ì†ìò†Òöð†ƒùÞ“õþþø^`솈›‘Òö^_ †ƒúþŸ^`àƒùꆄ‚öꆄ„þöꆆö^_Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^^€†ˆ›Ÿìùßö^]à†ˆ›‹†Òö^\†ƒˆúþŸ^]Ôƒùꆄ‚öꆄ‚öꆆö^\€†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^[d†ˆ›ŸìØö^Z¨†ˆ›­ìò†óßö^Zˆ›Ÿì†Òöò†ƒùð†ƒù^Y†ˆ›™òØö^W솈›^Yìò†ìòò†ìØöò†ƒù^Tà†ƒˆúþŸ^Wȃùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆö^U\†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒùð†ƒù^P¤†ƒúþŸ^TŒƒùꆄ‚ö^RX†„„‘úþŸ^TLƒùꆄ‚öꆄ‚öꆄ‚öꆆö^RІˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆆö^Q†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^O”†ˆ›^P”ìò†ì†ì†ì†Òö^Nô†ˆ›Ÿì†Òö^N†ˆ›»ì†ì†ì†ÒöЈŸßöö†üò†ƒùð†ƒùð†ƒùð†ƒù^L´†ˆ›‘Òö؆ˆþöð†ü^K†ˆ›­ìò†Òö^J¸†ˆ›»ì†ì†ì†Òö^IĆˆ›^J¨ì†ìò†ì†Òö^H솈›»ì†ì†ì†Òöö†ü؆ˆþöò†ƒù^Gô†ˆ›‘Òö^GT†ˆ›Ÿì†Òö^F̤“õþþÚ“õþþøð†ƒùʆˆŸßö^D†ƒŽúþŸ^F4ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöↈ‰õö^D€†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù^C@†ˆ›™ò†óßö^B †ˆ›Ÿì†Òöð†ƒù^A䆈›‹†Òö^A †ˆ›§†ìò†Òö^@ˆ†ˆ›‘Òöð†ƒùò†ƒù^?´†ˆ›Ÿì†Òö^>¤†ˆ›^?|†ìòò†ìØö^>†ˆ›‹†Òö^=Tˆ›™òØöö†ü^<˜†ˆ›Ÿì†Òöð†ƒùð†ƒù̆ƒˆˆ‘Øò†ƒùò†ƒù^:ô†ˆ›§†ì†ì†Òö^9†ƒˆúþŸ^:Ø„‚öꆄ‚öà†ˆþö^9˜†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñò†ƒù^8†ˆ›»ì†ì†ì†Òöð†ƒù^5¸†ƒˆúþŸ^7؃ùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆö^64†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù̆ƒŽü˜þò„þåð†ƒù^4H†ˆ›»ì†ì†ì†Òö^3p†ˆ›»ì†ì†ì†Òö^2˜†ˆ›»ì†ì†ì†Òö؆ˆþö^1t†ˆ›»ì†ì†ì†Òöð†ƒùñ^/d†ƒŽúþŸ^1 ƒùꆄ‚öꆄ‚öꆈþö^/̆ˆ¦õ·ä†‹Ø’ÍþøôüÜ^.˜†ˆ›™†‹áØö^-À†ˆ›»ìòò†Òö^- †ˆ›Ÿì†Òöö†üö†ü^*ü†ƒˆúþŸ^,ôƒùꆄ„þöꆄ„þöꆄ„þöꆆö^+x†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùð†ƒù^*D†ˆ›‘Òöʆˆþööƒùð†ƒù^(膈›™†ì†Òö^#t†ƒˆúþŸ^(܃ùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö^#ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^"d†ˆ›^#<†ìòòòØö^!Œ†ˆ›»ìòò†Òöð†ƒùò†ƒù^¸†ƒŽúþŸ^!Lƒùꆄ„þöꆈþö^ †ˆ¦õ·ä†‹Ø’ÍþøôüÜ^솃úþŸ^¬ƒùꆄ‚öꆄ‚öꆆö^X†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^l†ƒˆþŸŒƒùôüÜö†ü^„†ˆ›»ì†ì†ì†Òö^¬†ˆ›»ì†ì†ì†Òöò†ƒù^ˆ›Ÿì†Òö^†ƒˆúþŸ^èƒùꆄ‚öꆄ‚öà†ˆ‰õö^€†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒù^؆ˆ›^¼ì†ìò†ì†Òö^Ȇˆ›^Èìò†ì†ì†ìØö^ˆ†ƒŽúþŸ^¼ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö^ð†ˆ¦õ·ä†‹Ø’ÍþøôüÜ^¬†ƒˆúþŸ^|ƒùꆄ„þöꆄ„þöꆈþö^(†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^Ô†ˆ›»ì†ì†ì†Òöö†ü^솈›»ì†ì†ì†Òö؆ˆþö膃ˆñ^,†ˆ›^dìò†ì†ìò†ìò†Òö^|ˆ›™†ì†Òö^ ô†ƒúþŸ^dƒùꆈþö^ `†ˆ¦õ·ä†‹Ø’ÍþøôüÚ^ p†ˆ›ãö^ ˜†ˆ›»ìòò†Òö^ †ˆ›ãö^ †ˆ›µò†ìò†Òö^ œ†ˆ›‘Òö^8†ˆ›^ d†ìòòò†ìòò†Òö^˜†ˆ›Ÿì†Òöö†ü^”†ˆ›^xìò†ìò†Òööƒù^¼†ˆ›™†ì†Òö^ †ˆ›Ÿ‹áØö^l†ˆ›Ÿìùßö^̆ˆ›‹†Òöð†ƒù^Ô†ƒˆúþŸ^¤ƒùꆄ‚öꆄ„þöꆈþö^P†ˆ¦õ·ä†‹Ø’ÍþøôüÒ^ü†ˆ›»ì†ì†ì†Òöö†ü^†ˆ›»ì†ì†ì†Òöð†ƒù]ÿ †ˆ›»ì†ì†ì†Òö]þH†ˆ›»ì†ìò†Òö]ü¤ƒŽúþŸ]þ<ƒùꆄ„þöↈ‰õö]ý†ˆ¦õ·ä†‹Ø’ÍþøôüÜ]úІƒŽúþŸ]üŒƒùꆄ„þöꆄ‚öꆆö]û8†ˆ¦õ·ä†‹Ø’ÍþøôüÜ]úL†ˆ›ãöð†ƒùð†ƒùð†ƒùöƒù膃ˆñ]ù†ˆ›‹Øöð†ƒù]øp†ˆ›‘óßö]÷Іˆ›Ÿì†óßöò†ƒùð†ƒù]öp†ˆ›]÷Œì†ì†ì†ìòò†Òöö†ü]õˆ†ˆ›»ìò†ì†Òöð†ƒù]ô؈›ŸìØöð†ƒùð†ƒùò†ƒù]òP†ƒˆúþŸ]ôpƒùꆄ„þöà†„„þöà†„„þöꆈþö]ò̆ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù؆ˆþö]𠆈›]ñØìò†ì†ì†ì†ì†ì†Òö]ïðˆ›™†ì†Òöò†ƒù]ï,†ˆ›Ÿì†Òö]îp†ˆ›™†ì†Òöò†ƒù膃ˆñð†ƒù]ì4†ƒˆúþŸ]îƒùꆄ‚öꆄ‚öꆆö]ì°†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]ë\†ˆ›»ì†ì†ì†Òöð†ƒù]ê †ˆ›Ÿì†Òö]éȆˆ›§†ìòØö]é4ˆ›‹†Òöð†ü]æð†ƒúþŸ]éƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]ç\†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]æP†ˆ›Ÿì†Òö]唆ˆ›­ìò†Òö]äX†ˆ›™†‹ˆ­ì†ì†È†Òöð†ƒùð†ƒù]〆ˆ›Ÿì†óßö]âĆˆ›­ì†ì†Òö؆ˆþö]áô†ˆ›‘Òö脌ƒóƒù]á †ˆ›­ì†ì†óßö]à4†ˆ›»ì†ì†ì†Òö]ß„ˆ›™†ì†óßö]Ý †ˆŸŠúþŸ]ßlƒùꆈþö]Þh†ˆ¦õ·ä†‹Ø’Íþøôü]ݸö]ܬ†ˆ›µ†ì†ì†ì†Òö]Ü †ˆ›Ÿì†Òöð†ƒù]Ù8†ƒŽúþŸ]Ûäƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆö]Ù †ˆ¦õ·ä†‹Ø’ÍþøôüÜ]×ð†ˆ›]Ù(ìò†ìò†ìòòØöð†ƒùò†ƒùʆˆþö脌ƒóƒù]Öl†ˆ›­ì†ì†Òöð†ƒù]Õ\†ˆ›]Ö@ìò†ìò†Òö]Ô¬ˆ›­ì†ì†Òö]Ó¬†ˆ›]Ôìò†ì†ì†Òö]Ó †ˆ›Ÿì†Òöð†ƒù]Ñü†ˆ›]Òàì†ìò†ì†Òö]Ð †ƒˆúþŸ]Ñðƒùꆄ‚öꆄ‚öꆆö]М†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]ÎX†ƒŽúþŸ]Ѓùꆄ‚öꆄ„þöꆈþö]ÎÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ]ÍH†ˆ›]ÎHì†ìò†ìò†Òö؆ˆþö]Ì$†ˆ›»ì†ì†ì†Òö]ËL†ˆ›»ì†ì†ì†Òö]ʬ†ˆ›ŸìØö]Ê †ˆ›ŸìØö]Él†ˆ›ŸìØö]Ȱ†ˆ›­ì†ì†Òö]Ç䈛»ì†ì†ì†óßöð†ƒù]ÄĆˆ›]Ǭì†ì†ìò†]Å,†‹úþŸ]Ç$ƒùꆄ‚öꆄ‚öꆄ‚öꆈþö]Ũ†ˆ¦õ·ä†‹Ø’Íþøôü]ÄÜöð†ƒùò†ƒùð†ƒùö†üð†ƒù]¬†ˆ›]Ä8ì†ì†ì†ì†ì†ì†ìò†ìò†Òö]´¨ƒŽúþŸ] ƒù]¹†„„‘úþŸ]Âx„‚ö]¿d†„„‘úþŸ]Àà„„‘úþŸ]ÂP„‚öꆆö]ÁL†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆆö]¿Ü†ˆ¦õ·ä†‹Ø’Íþøôüþàö]»†„„‘úþŸ]½Ø„„‘úþŸ]¿H„‚öꆆö]¾D†ˆ¦õ·ä†‹Ø’Íþøôüþàö]¼H†ˆ‘úþŸ]½œˆþö]¼À†ˆ¦õ·ä†‹Ø’Íþøôüþàö]»x†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆆö]º†ˆ¦õ·ä†‹Ø’Íþøôüþàö]¸ †„„‘úþŸ]¹`ˆþö]¸„†ˆ¦õ·ä†‹Ø’Íþøôüþàö]µÔ†ˆ‘úþŸ]·ð„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]¶L†ˆ¦õ·ä†‹Ø’Íþøôüþàö]µ†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒù]³d†ˆ›™†‹ˆ‹†È†Òö]±`†ƒˆúþŸ]³Xƒùꆄ„þöꆄ‚öꆄ„þöꆆö]±Ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]°¤†ˆ›­ì†ì†Òö膃ˆñ]¯ †ˆ›»ì†ì†ì†Òö]®ä†ˆ›­ì†ì†óßö]® †ˆ›»ìò†ì†Òööƒù]¬$†ƒúþŸ]­äƒùꆄ‚öꆄ‚öꆆö]¬†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]« †ˆ›‘Òö]ª¬†ˆ›µòòò†Òöð†ƒù]©¸†ˆ›»ì†ì†ì†Òö]§†ƒˆúþŸ]©¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö]§†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒù]¦H†ˆ›ŸìØö]¥Œ†ˆ›™†ì†Òööƒù]¤ì†ˆ›‘Òö]¤L†ˆ›ŸìØöð†ƒù]£<†ˆ›]¤ ì†ì†ìò†Òö]žÔ„]£0ƒ]žàƒšø]¢ÀþŽþþ]žþ]¢¬]žúþŸ]¢œƒù]¡à†ˆ¦õ“†Êþø]¡L†ˆ¦õ™Êþø] œ†ˆ¦õ§ì†ëßþø]Ÿ@„]Ÿèˆ¦õ§‹á†Êþ]ŸLˆ¦õ™‹]ŸXþøôüÚ]ž4†ˆ›‹†Òö]\†ˆ›»ì†ì†ì†Òö]œ¼†ˆ›Ÿì†Òö]œ†ˆ›­ìò†Òöð†ƒù]› †ˆ›»ì†ì†ì†Òö]š4†ˆ›»ì†ìò†Òö]™\†ˆ›»ì†ì†ì†Òö]˜„†ˆ›»ì†ì†ì†Òö]—䆈›ŸìØööüð†ƒùð†ƒùʆˆþö]–¨†ƒˆˆ‹Þð†ƒù]•솈›Ÿì†Òö]•†ˆ›»ìò†ìØöò†ƒùö†üö†üð†ƒù]“膈›»ì†ì†ì†Òö]“†ˆ›»ì†ì†ì†Òö]’p†ˆ›ŸìØö]‘Іˆ›ŸìØöð†ƒùÞ“õþþø]ˆ†ƒúþŸ]‘\ƒùꆄ‚öꆄ‚öà†ˆþö]ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù]Œ<†ˆ›]\ì†ì†ì†]Œø†‹úþŸ]Žðƒùꆄ‚öꆄ‚öꆄ‚öꆆö]t†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ì†Òö膃ˆñ]‡(†ƒŽúþŸ]Œƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]‡†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùò†ƒù]† †ˆ›§òòØöò†ƒù]‚ˆ†ƒŽúþŸ]…üƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþö]‚ð†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒù]}p†ˆ›]‚8òò]}؆‹šø]”þŽþþ]~]€]~þŸ]pƒù]€`†ˆ¦õ½òòò†Êþø]°†ˆ¦õ§ì†ëßþø]~T„]~üˆ¦õ§‹á†Êþ]~`ˆ¦õ™‹]~lþøôü]}ˆö]||†ˆ›µ†ì†ì†ì†Òöð†ƒù]{¤†ˆ›™†ì†Òö]{†ˆ›ŸìØöö†üˆ›‘ÒöʆˆŸßöð†ƒùð†ƒù]x°†ˆ›™†‹ˆ‹†È†Òö]w؆ˆ›§òò†Òöò†ƒù]t¸†ƒŽúþŸ]w´ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö]u †ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù]sà†ˆ›­ì†ì†Òö]s†ˆ›»ì†ì†ì†Òö]rh†ˆ›ŸìØöò†ƒù]q”†ˆ›™†ì†ÒöЈŸßö]pT†ˆ›»ì†ìò†Òö]oІˆ›ãö]m´†ƒúþŸ]oăùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆö]n †ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù]l܆ˆ›­ìò†Òöò†ƒù]l†ˆ›­ì†ì†Òö脌ƒóƒù]k†ˆ›»ì†ì†ì†Òö脌ƒóƒùö†ü]j4ˆ›ŸìØöò†ƒùò†ƒù]f¼†ƒúþŸ]iìƒù]gø†ˆ‘úþŸ]iÄ„‚öꆄ‚öꆄ‚öꆆö]hp†ˆ¦õ·ä†‹Ø’Íþøôüþàö]g(†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù]c؆ˆ›µ†‹úþŸ]fxƒùꆄ‚öꆄ‚öà†ˆ‰õö]e†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ì†Òö]b¸†ˆ›]c †ì†ìꆋá†óßö]b†ˆ›Ÿì†Òö]a”†ˆ›„ßö膃ˆñ]_d†ƒˆúþŸ]a\ƒùꆄ‚öꆄ„þöꆄ„þöꆆö]_à†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]]L†ƒŽúþŸ]_Xƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö]]´†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒù]\x†ˆ›­ì†ì†Òö][ †ˆ›»ì†ì†ì†Òö؆ˆþö]ZD†ˆ›][Dì†ì†ì†ì†ì†Òö]V`†ƒˆúþŸ]Z8ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆö]V܆ˆ¦õ·ä†‹Ø’ÍþøôüÒ]Ul†ˆ›]VPìò†ìò†Òöˆ›‘Òöð†üʆˆþö]Sà†ˆ›‘Òö]S@†ˆ›Ÿì†Òöð†ƒù]Q€†ƒúþŸ]Sƒùꆄ„þöꆈþö]Q솈¦õ·ä†‹Ø’ÍþøôüÚʆˆþö]P\†ˆ›­ì†ì†Òö]O†ˆ›]PLìò†ì†ì†ì†ì†ì†Òööƒù]NX†ˆ›Ÿì†Òö]Mœ†ˆ›™†ì†Òöò†ƒù]KX†ƒˆúþŸ]Mxƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþö]KÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù]I<†ƒˆúþŸ]K4ƒùꆄ„þöꆄ„þöꆄ‚öꆈþö]I¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]Hd†ˆ›»ì†ìò†Òö]G(†ˆ›]H,†ìò†ì†ì†ä†‹Çö]E8†ƒŽúþŸ]Gƒùꆄ‚öꆄ‚öꆄ„þöꆈþö]E †ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùò†ƒù]D0†ˆ›»ì†ì†ì†Òö脌ƒóƒù]C,†ˆ›»ì†ì†ì†Òö]BŒ†ˆ›Ÿì†Òö]AІˆ›™ò†Òö]@ø†ˆ›»ì†ì†ì†Òö]@ †ˆ›§†ìòØööƒù膃ˆñÔ†ƒˆ‹†à膃ˆñ]<솃úþŸ]?Lƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆈþö]=X†ˆ¦õ·ä†‹Ø’ÍþøôüÚ];À†ˆ›]<Üì†ì†ì†ìò†ì†Òö]9†ˆ›]; ‹]9¸†‹úþŸ];ˆƒùꆄ‚öꆄ‚öꆈþö]:4†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òö]7d†ƒŽúþŸ]9 ƒùꆄ‚öà†ˆþö]7̆ˆ¦õ·ä†‹Ø’ÍþøôüÜ]3h†ƒúþŸ]7Xƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþö]3Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚ]2¸†ˆ›§ä†‹Çöð†ƒù]1Ćˆ›»ì†ì†ì†Òö]*D†ˆ›]1´ìòò†ì†]*¬†‹šø]0ÌþŽþþ]*æ]0¸]*âþŸ]0¨ƒù]/|†ˆ¦õ]0Œìòò†ì†ì†Êþø].”†ˆ¦õ]/lìò†ì†Êþø]-䆈¦õ§ì†Êþø]-4†ˆ¦õ§ì†Êþø],„†ˆ¦õ§ì†ëßþø]+(„]+Ј¦õ§‹á†Êþ]+4ˆ¦õ™‹]+@þøôü]*\ö]%ĆƒˆúþŸ]*8ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚ö]((†„„‰ˆ§òò†Üöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆö]&@†ˆ¦õ·ä†‹Ø’ÍþøôüÒ]#àƒˆúþŸ]%¸ƒùꆄ‚öꆄ‚öà†ˆþö]$P†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñ]"À†ˆ›¯†ä†‹á†Òöð†ƒù膃ˆñ]!¼†ˆ›­ì†ì†ÒöÒ†Ÿþæ„üò÷] Œ†ˆ›»ì†ì†ì†Òö] †ˆ›‘Òöö†ü]X†ˆ›Ÿì†Òö]œ†ˆ›­ì†ì†ÒöÞ†‡üò÷]L†ˆ›]Lìò†ìòò†Òö],ˆ›]<ìò†ì†ìò†ì†óßö]œ†ˆ›ãö]¨†ˆ›µò†ìò†Òö]Іˆ›§ò†ìØöð†ƒùð†ƒù]܆ˆ›­ì†ì†Òö]†ˆ›»ì†ì†ì†Òö؆ˆþö]ü†ˆ›­ì†ì†Òööƒù]$†ˆ›™†ì†Òö]„†ˆ›Ÿìùßö]䆈›‹†Òö]D†ˆ›‹†Òöò†ƒùð†ƒù]Œ†ˆ›‘óßöò†ƒùˆ›‘Òö؆“õþþøØ†“õþþø]ð†ƒˆúþŸ]Lƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö]l†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù膃ˆñò†ƒù]¸†ˆ›»ì†ìòØö] †ƒúþŸ]¬ƒùꆄ‚öꆆö] €†ˆ¦õ·ä†‹Ø’ÍþøôüÚ] <†ˆ›§òòØöò†ƒù] „†ˆ›Ÿì†Òö] Ȇˆ›™ò†Òö] †ˆ›­ì†ì†Òö] P†ˆ›­ì†ì†Òö]ƒúþŸ] Dƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆö]x†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù]P†ˆ›‹†Òö]̆ˆ›‘Òöð†ƒù]˜†ƒŽúþŸ]¤ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆö]†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùð†ƒù]¨†ˆ›­ìò†Òöò†ƒù]üˆ›‹Øö]l†ˆ›‘Òö]̆ˆ›ŸìØöò†ƒù\þ؆ƒˆúþŸ]¨ƒùꆄ‚öꆄ‚öꆈþö\ÿT†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\ý䆈›\þÈì†ì†ìò†Òö\ý(†ˆ›­ì†ì†Òö脌ƒóƒùö†ü\ü†ˆ›»ì†ì†ì†Òö\û†ˆ›‘Òö\úœ†ˆ›\û€ìò†ìò†Òöüü膃ˆñ\ù¤†ˆ›­ì†ì†Òö\÷8†ƒúþŸ\ù˜ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö\÷¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù\ö,†ƒˆˆ\öðìòò†ì†Ø\õ†ˆ›\öì†ì†ì†ìòò†Òöð†ƒùð†ƒù\ô(†ˆ›Ÿì†Òöö†ü\ó@†ˆ›»ì†ì†ì†Òöøƒùð†ü\𸆃ŽúþŸ\óƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö\ñ †ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùò†ƒù\ïd†ˆ›™†‹ˆ‹†È†Òö\îà†ˆ›‘Òöð†ƒù\í †ƒúþŸ\ùꆄ„þöꆈþö\팆ˆ¦õ·ä†‹Ø’ÍþøôüÚ\ìH†ˆ›§òò†Òöð†ƒù\댆ˆ›Ÿì†óßö\æü†ƒˆúþŸ\뀃ùꆄ‚ö\èH†ˆ‰’úþŸ\ë@ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö\èÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÔö\çx†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\á܆ƒˆúþŸ\æðƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚ö\ã(†ˆ‘úþŸ\æ„„þö\äp†ˆ‘úþŸ\åì„‚öꆈþö\ä膈¦õ·ä†‹Ø’Íþøôüþàö\ã †ˆ¦õ·ä†‹Ø’Íþøôüþàö\âX†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\á<†ˆ›Ÿì†ÒöÞ†‡üò÷ò†ƒù\à †ˆ›»ì†ì†ì†Òö\߆ˆ›\ßüì†ì†ì†ì†Òöøƒù\Þ †ˆ›µòòò†Òö\Ý4†ˆ›»ì†ì†ì†Òöð†ƒùò†ƒùð†ƒùð†ƒù\Ûð†ˆ›»ì†ì†ì†Òö\ÛP†ˆ›Ÿì†Òööƒùò†ƒù\Ú(†ˆ›\Û ìò†ì†ì†Òö\Ùˆ†ˆ›Ÿì†Òö\×䆃úþŸ\Ù|ƒùꆄ„þöꆈþö\ØP†ˆ¦õ·ä†‹Ø’ÍþøôüÚ\Ó†ƒˆúþŸ\רƒù\Ô|†„„‰úþŸ\×Àƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆö\Õ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþö\Ó„†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\Ñø†ˆ›\Òøì†ìò†ìò†Òöð†ƒù\Ð̆ˆ›\ÑÌìò†ìòò†Òö\Ïô†ˆ›»ì†ì†ì†Òö\Ëp„\Ïèƒ\Ë|ƒšø\ÏxþŽþþ\Ëš\Ïd\Ë–þŸ\ÏTƒù\Θ†ˆ¦õ“†Êþø\Í膈¦õ§ì†Êþø\Í8†ˆ¦õ§ì†ëßþø\ËÜ„\Ì„ˆ¦õ§‹á†Êþ\Ë舦õ™‹\ËôþøôüÚ\Ê´†ˆ›­ì†ì†Òö\ȼƒˆúþŸ\ʨƒùꆄ„þöꆄ‚öꆄ‚öꆈþö\É,†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\ÇØ†ˆ›»ì†ì†ì†óßö\ÇD†ˆ›‘‹Çöð†ƒù\„†ƒúþŸ\ǃùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚ö\ÃÀ†ˆ‰úþŸ\Åtƒùꆄ‚öꆆö\ÄH†ˆ¦õ·ä†‹Ø’ÍþøôüÖö\Âð†ˆ¦õ·ä†‹Ø’ÍþøôüÚ\ÀhƒŽúþŸ\Âxƒù\Á䆄„ü¤þò„þò„þéöꆄ‚öꆆö\ÀĆˆ¦õ·ä†‹Ø’ÍþøôüÜÞ†ƒˆˆé\¾à†ˆ›™†‹ˆ™†ì†È†Òöð†ƒù\¾$†ˆ›Ÿì†Òö\¼Ü†ˆ›\¾ìò†ìò†ì†ì†ì†ÒöÞ“õþþø\»ð†ˆ›‹†Òö\»4†ˆ›™†ì†Òö\º†ˆ›\»$ìò†ìò†ìòØö\¹0†ˆ›»ìò†ì†Òö\¸t†ˆ›™†ì†óßöö†ü\±„†ˆ›\¸T\±ì†‹šø\·ÜþŽþþ\²&\·È\²"þŸ\·¸ƒù\´t†ˆ¦õ§‹úþŸ\· ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆆö\µ„†ˆ¦õ·ä†‹Ø’Íþøôü†Êþø\³Ä†ˆ¦õ§ì†ëßþø\²h„\³ˆ¦õ§‹á†Êþ\²tˆ¦õ™‹\²€þøôü\±œööƒùð†ƒù\°†ˆ›\±<ì†ìòòò†ä†‹Çö\¯T†ˆ›­ì†ì†Òö\®|†ˆ›»ì†ìò†Òö\­¤†ˆ›§òò†Òöö†ü\¬ô†ˆ›Ÿì†Òö膃ˆñöƒùð†ƒù\«ð†ˆ›‹†óßö\«l†ˆ›‘Òöʆˆþö\ª,†ˆ›»ì†ìò†Òö\©Œ†ˆ›Ÿì†Òö\¨Ð†ˆ›­ì†ì†Òö\¨<ˆ›‹Øö\¦T†ƒˆúþŸ\¨$ƒùꆄ‚öꆄ‚öꆆö\¦Ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒù؆ˆþö\¥†ˆ›»ì†ì†ì†Òöð†ƒù\¤dˆ›Ÿì†Òö\£€†ˆ›»ìò†ì†Òö\žÌ†ƒˆúþŸ\£tƒùꆄ‚öꆄ„þö\ h†„„‰úþŸ\£ ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþö\ ð†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆆö\ŸH†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\ž,†ˆ›Ÿì†Òö\T†ˆ›»ìò†ì†Òö\›d†ƒŽúþŸ\Hƒùꆄ‚öꆄ‚öꆄ‚öꆆö\›Ì†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù膃ˆñð†ƒù\š(†ˆ›§†ì†ì†Òöö†ü膃ˆñ\™†ˆ›»ì†ì†ì†Òö\–†ƒúþŸ\™ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþö\–t†ˆ¦õ·ä†‹Ø’ÍþøôüÚÞˆþö\• †ƒˆˆ™òÞ\”œ†ˆ›‘óßö膃ˆñ\“`†ˆ›\”`ìòò†ìò†Òöö†üö†ü\޼„\“4ƒ\ŽÈƒšø\’ÄþŽþþ\Žæ\’°\ŽâþŸ\’ ƒù\‘䆈¦õ§ì†Êþø\‘4†ˆ¦õ§ì†Êþø\„†ˆ¦õ§ì†ëßþø\(„\Ј¦õ§‹á†Êþ\4ˆ¦õ™‹\@þøôüÚ\䆈›»ì†ì†ì†Òö\`†ˆ›‘Òö\‹4†ƒˆúþŸ\Tƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþö\‹°†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\Š ˆ›Ÿì†Òö\ˆà†ƒˆúþŸ\Šˆƒùꆄ„þöꆆö\‰\†ˆ¦õ·ä†‹Ø’ÍþøôüÒʆˆþö\‡ô†ˆ›‘Òö\‡†ˆ›\‡äì†ì†ì†ìØöö†üð†ƒù\„䆃ŽúþŸ\†Èƒùꆄ‚öꆄ„þöꆄ„þöꆈþö\…L†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†ü\„P†ˆ›‘Òö\ƒ°†ˆ›Ÿì†Òö\‚؆ˆ›»ì†ì†ì†Òöö†ü\‚ †ˆ›­ì†ì†Òö\\ˆ›™†ì†óßöð†ƒù\€°†ˆ›‘Òöð†ƒù膃ˆñ\}Іˆ›\€Xì\~T†‹úþŸ\€$ƒùꆄ„þöꆄ‚öꆆö\~Іˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒù\|†ƒúþŸ\}¨ƒùꆄ„þöꆆö\||†ˆ¦õ·ä†‹Ø’ÍþøôüÚ\zhƒŽúþŸ\|ƒùꆄ‚öà†ˆþö\zĆˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒù\xÀ†ˆ›\yìòòòòò†ì†ì†Òö\t솈›‘‹úþŸ\x´ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþö\uІˆ¦õ·ä†‹Ø’Íþøôü\uö\t0†ˆ›­ìò†ÒöÞ“õþþøð†ƒùð†ƒù\n<†ƒŽúþŸ\s ƒù\p<†„„‘úþŸ\sd„„þö\qÀ†„„‘úþŸ\s<„‚öꆆö\r8†ˆ¦õ·ä†‹Ø’Íþøôüþàöà†ˆþö\p´†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö\n¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜ\md†ˆ›»ì†ìò†Òö\lŒ†ˆ›§†ì†ì†Òö\k˜†ˆ›µ†ìò†ìØöð†ƒù؆ˆþöö†üö†ü\jp†ˆ›Ÿì†Òö\i솈›‘Òöüüʆˆþö\g¬†ƒˆúþŸ\ihƒùꆄ‚öà†ˆþö\h(†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\fð†ˆ›™†ìØöð†ƒù\eĆˆ›\fÄìòò†ì†ì†óßöò†ƒùð†ƒùö†ü膃ˆñò†ƒù膃ˆñ\dDˆ›§òò†Òö\aX†ƒŽúþŸ\d,ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆö\aÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ\`T†ˆ›½Î†‹ˆ‘\`lö\_|†ˆ›§ò†ì†Òö\]`†ƒúþŸ\_pƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö\]̆ˆ¦õ·ä†‹Ø’ÍþøôüÚ\\܆ˆ›‘óßö\\ †ˆ›­ì†ì†Òö膃ˆñ\[†ˆ›»ì†ì†ì†Òö脌ƒóƒù脌ƒóƒù\Z†ˆ›­ì†ì†Òöð†ƒù\Yˆ›\YÜì†ì†ì†ì†Òö\Xt†ˆ›‘Òö\Wd†ˆ›\Xdì†ìò†ìò†Òö\Vp†ˆ›\WTìò†ìòØö\U˜†ˆ›»ìò†ì†Òöð†ƒù؆ˆþöö†üð†ƒù\Td†ˆ›Ÿì†Òö\SĆˆ›‹†Òöˆ›‘ÒöʆˆŸßö\R8†ˆ›Ÿì†Òö\Q(†ˆ›\R(ì†ì†ìò†ìØöʆˆþö\P†ˆ›­ì†ì†Òöò†ƒù؆ˆþö\NȆˆ›»ìòò†Òö\Mð†ˆ›»ì†ì†ì†Òöð†ƒù\M4†ˆ›Ÿì†Òö\L\†ˆ›»ì†ì†ì†Òö\K¬ˆ›­ì†ì†Òö\I´†ƒˆúþŸ\K„„„þöꆄ„þöꆄ‚öꆆö\J0†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\H܆ˆ›»ìò†ìØö\F$†ƒŽúþŸ\HЃùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆö\FŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ\EL†ˆ›»ì†ì†ì†Òö؆ˆþö\D|†ˆ›‘Òö\CP†ˆ›\Dlì†ì†ì†ìòò†Òö؆ˆþö\BH†ˆ›­ì†ì†Òö\AT†ˆ›\B8ì†ìòò†Òö膃ˆñÞ“õþþø\@X†ˆ›‘Òö\?€†ˆ›§ò†ì†Òö\>¨†ˆ›§†ì†ì†óßö\=Іˆ›»ì†ì†ì†ÒöƆ«þò„þæ„üò÷\<ˆ†ˆ›»ì†ì†ì†Òöö†ü\; †ˆ›»ì†ì†ì†Òöö†üö†ü\:ü†ˆ›‘Òööƒù\:\†ˆ›‘Òöò†ƒù\9À†ˆ›‘Òö\7ô†ƒúþŸ\9´ƒùꆄ‚öꆄ‚öꆆö\8`†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒù\6膈›»ì†ì†ì†Òö\6†ˆ›»ì†ì†ì†Òöüü\5`†ˆ›‹†Òö\4¤†ˆ›™†ì†Òöð†ƒùð†ƒù\1ˆ†ˆ›‘‹úþŸ\4`ƒùꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆆö\2l†ˆ¦õ·ä†‹Ø’Íþøôü\1 öÞ“õþþø\0¸†ˆ›„ßö\04†ˆ›‘Òö\/”†ˆ›Ÿì†Òö\/†ˆ›ãö\.8†ˆ›»ìò†ì†Òöð†ƒù\-D†ˆ›»ìò†ì†Òö\+†ˆ›‘‹ˆúþŸ\-(„‚öà†ˆ‰õö\,†ˆ¦õ·ä†‹Ø’Íþøôü\+4ö\*`†ˆ›­ìò†óßöð†ƒùö†ü\)”†ˆ›Ÿì†Òö\(䆈›Ÿ‹á†Òöö†ü\(†ˆ›™òùßö\$p†ƒúþŸ\( ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚ö\%Ô†„„‰ˆ§òò†Üöꆈþö\$܆ˆ¦õ·ä†‹Ø’ÍþøôüÚ\# †ˆ›\$8†ìò†ìò†ìò†ì†Òö\"l†ˆ›ŸìØö\!؈›‹Øö\!0†ƒˆˆ™†ì†Ø\†ƒˆúþŸ\!$ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö\†ˆ¦õ·ä†‹Ø’ÍþøôüÒ\t†ƒŽúþŸ\ƒùꆄ„þöꆈþö\܆ˆ¦õ·ä†‹Ø’ÍþøôüÜ\ð†ˆ›ãö膃ˆñð†ƒùò†ƒùö†ü\Ćˆ›­ì†ì†Òö\†ˆ›­ì†ì†Òö\0†ˆ›»ì†ì†ì†Òöˆ›‘Òöð†ƒù\ †ˆ›‘Òö\l†ƒŽúþŸ\ƒùꆄ„þöꆆö\Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÜ\x†ˆ›\\ì†ì†ì†ì†Òö\ †ˆ›»ì†ì†ì†Òö؆ˆþö\|†ˆ›»ì†ì†ì†Òö\¤†ˆ›»ì†ì†ì†Òö\†ˆ›Ÿì†Òöð†ƒùˆ›‘Òö؆“õþþøð†ƒù\|†ƒúþŸ\ðƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþö\膈¦õ·ä†‹Ø’ÍþøôüÚ\ @†ˆ›™†‹ˆ™†ì†È†Òö\ ¼†ˆ›‘Òö\ †ˆ›‹†Òö\ |†ˆ›‹Øöð†ƒù\ ¤†ˆ›­ì†ìØöð†ƒù\䆃úþŸ\ |ƒùꆄ„þöꆆö\ P†ˆ¦õ·ä†‹Ø’ÍþøôüÚ\ †ˆ›»ì†ì†ì†Òö\4†ˆ›»ì†ì†ì†Òö\x†ˆ›­ìò†Òö\¼†ˆ›­ì†ì†Òö\ ˆ›­ìò†Òö\4†ˆ›™†‹á†Òö\܆ƒŽúþŸ\(ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö\D†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[ÿ†ƒúþŸ\Ѓùꆄ‚öꆄ„þöꆆö[ÿ|†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùð†ƒù膃ˆñ[þ †ˆ›‹†Òö[ý4†ˆ›»ì†ì†ì†Òöö†üð†ƒù[üL†ˆ›­ì†ì†Òöøƒù[û@†ˆ›[ü$ìò†ìò†Òö[ú¼†ˆ›‘Òö[ù¬†ˆ›[ú¬ì†ì†ìò†ìØö[÷ø†ƒˆúþŸ[ù ƒùꆄ‚öꆈþö[øt†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[÷<†ˆ›­ì†ì†óßö[ö¨„[÷0ƒ[ö´ƒŠþŸŒƒùôüÚð†ƒù[õІˆ›­ì†ì†Òöö†üЈŸßöð†ƒù[ô€†ˆ›­ì†ì†Òö[óü†ˆ›‘Òö[ó$†ˆ›§òò†Òö[òh†ˆ›­ì†ì†Òö[ñ†ˆ›»ìò†ìØöò†ƒùö†ü[ð†ˆ›»ì†ì†ì†Òö[︆ˆ›»ì†ì†ì†Òö[îü†ˆ›™†ì†Òö膃ˆñöü[›Ÿì†Òö[퀆ˆ›‘‹Çö[ìü†ˆ›‘Òö膃ˆñ[ëø†ˆ›§òò†Òö[ë@†ƒˆˆ§òò†Ø[åà†ƒŽúþŸ[ë4ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚ö[ç@†„„‰ˆ‘‹úþŸ[é܃ùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆈþö[膈¦õ·ä†‹Ø’Íþøôü[çXöꆆö[æH†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[ä܆ˆ›½Î†‹ˆ‘[äôö[âø†ˆ›[ä¤[ã|†‹ˆ[älò†ì†ì†ì†ìòùÕ†Òö[á|†ƒúþŸ[âìƒùꆆö[á膈¦õ·ä†‹Ø’ÍþøôüÚ[Þ†ƒˆúþŸ[ápƒùꆄ„þöꆄ‚ö[ßT†ˆ‰úþŸ[áƒùꆄ„þöꆈþö[ß܆ˆ¦õ·ä†‹Ø’ÍþøôüÖö[Þ„†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[Üd†ƒúþŸ[Ýüƒùꆄ„þöꆈþö[ÜІˆ¦õ·ä†‹Ø’ÍþøôüÚ[Õ†ˆ›[Ü,†[Õ|†‹šø[ÛÀþŽþþ[Õ¶[Û¬[Õ²þŸ[Ûœƒù[Úü†ˆ¦õ™Êþø[Ú0†ˆ¦õ¡†ì†Êþø[Ùd†ˆ¦õ¡†ì†Êþø[Ø´†ˆ¦õ§ì†Êþø[؆ˆ¦õ§ì†Êþø[×T†ˆ¦õ§ì†ëßþø[Õø„[Ö ˆ¦õ§‹á†Êþ[Öˆ¦õ™‹[Öþøôü[Õ,ö[Ô<†ˆ›»ì†ì†ì†Òö[Ód†ˆ›»ì†ì†ì†Òö؆ˆþö[Ò\†ˆ›­ì†ì†Òöüü[Ï „[Ò@ƒ[σúþŸ[Ò0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚ö䆄„þö䆄„þö䆈þö[Ïx†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[Íü†ˆ›[Îüìò†ì†ìò†óßö[Íx†ˆ›‘Òö[Ìô†ˆ›‘Òö[̆ˆ›[Ìäìò†ìòØöò†ƒùð†ƒùð†ƒù[ÉÔ†ƒŽúþŸ[ˤƒùꆄ‚öꆄ‚öà†ˆ‰õö[Ê<†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[Èü†ˆ›»ì†ì†ì†ÒöЈþöð†ü[Æ$†ƒˆúþŸ[Èlƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþö[Æ †ˆ¦õ·ä†‹Ø’ÍþøôüÒ[ÅL†ˆ›»ì†ìò†Òö[Ät†ˆ›»ìòò†Òö[܆ˆ›§†ì†ì†Òö[¨†ˆ›µ†ìò†ìØöð†ƒù[†ˆ›‘Òöð†ƒù膃ˆñ[À膈›»ì†ì†ì†Òöò†ƒùò†ƒù[¿à†ˆ›»ì†ì†ì†ÒöЈþö膃ˆñð†ƒùò†ƒù[½t†ƒúþŸ[¿ ƒùꆄ„þöꆆö[½à†ˆ¦õ·ä†‹Ø’ÍþøôüÚ[ºô†ˆ›[½dìòò†ì†ì†[»NŠúþŸ[¼Àƒùꆆö[»¼†ˆ¦õ·ä†‹Ø’Íþøôü[» ö[µ”†ƒˆúþŸ[ºèƒùꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþö[¶†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒù[´Ø†ˆ›ãö[´†ˆ›»ì†ì†ì†Òö[³|†ˆ›‘Òö[²À†ˆ›­ì†ì†óßö[²<†ˆ›‘Òö[±d†ˆ›»ì†ì†ì†Òö[°¨†ˆ›­ì†ì†Òö膃ˆñöƒùð†ƒù脌ƒóƒùð†ƒù膃ˆñð†ƒù[­œ†ƒˆúþŸ[¯¨ƒùꆄ‚öꆄ‚öꆄ„þöà†ˆþö[®†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[­†ˆ›‘Òöò†ƒù[¬(†ˆ›§†ì†ì†óßö[«¤†ˆ›‘Òöð†ƒù[ª°†ˆ›»ì†ì†ì†Òö[ª,†ˆ›‘ÒöÞ“õþþøð†ƒù[¦x†ƒˆúþŸ[©¸ƒù[§Ä†ˆ‘úþŸ[©„‚öꆄ‚öꆄ‚öꆆö[¨<†ˆ¦õ·ä†‹Ø’Íþøôüþàö[¦ô†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[¥†ˆ›[¦@òòòòò†ì†ì†Òö[¤†ˆ›[¤ô‹Ù†‹á†ì†Òö[¢|†ƒˆúþŸ[¤ƒùà†ˆþö[¢ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[¡l†ˆ›[¢D†ì†ì†ìò†Òöüüð†ƒù[ ¼†ˆ›‘Òö[ †ˆ›™†ì†Òö膃ˆñ[Ÿ†ˆ›­ì†ì†Òö[ž”†ˆ›‘Òö[ô†ˆ›Ÿì†Òöö†üö†ü[4†ˆ›Ÿì†Òö[œ\†ˆ›»ì†ì†ì†Òö؆ˆþöö†ü[›(†ˆ›»ì†ì†ì†Òö[šˆ†ˆ›‹†Òöøƒùð†ƒùò†ƒù[—膃ˆúþŸ[š0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö[˜d†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒù[–ô†ˆ›™†ì†Òö[–†ˆ›[–äì†ìò†ì†Òö膃ˆñ؆ˆþö[”°†ˆ›»ì†ì†ì†Òö[“؆ˆ›»ì†ì†ì†Òöò†ƒùö†ü[“†ˆ›Ÿì†Òöüüð†ƒùð†ƒù[‘ð†ˆ›§òò†Òö[t†ƒˆúþŸ[‘äƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆö[ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üò†ƒùð†ƒù[¤†ƒˆúþŸ[$ƒùꆈþö[Ž †ˆ¦õ·ä†‹Ø’ÍþøôüÒ[Œô†ˆ›§ä†‹Çö[ŒT†ˆ›Ÿì†Òö[‹´†ˆ›Ÿì†Òö[‹0†ˆ›‘Òö[Šœˆ›‹†Òö[‰Ô†ˆ›™†ìØöò†ƒù[‰8†ˆ›‘Òöð†ƒù[ˆD†ˆ›»ìòò†Òö[‡l†ˆ›§†ì†ì†óßö[†°†ˆ›™†ì†óßöð†ƒù[…؆ˆ›­ìò†Òö[„ð†[…Êþò„þò„þò„þò„þò„þÚ„üˆ„þè÷ð†ƒùöƒùð†ƒùð†ƒùð†ƒù脌ƒóƒù[ƒ`†ˆ›»ì†ì†ì†Òöð†ƒù[‚¤†[ƒ6þò„þò„þò„þæ„üò÷[‚ †ˆ›‘Òö[d†ˆ›­ì†ì†Òö[€Ä†ˆ›Ÿì†Òöð†ƒùЈþö[~†ƒŽúþŸ[€4ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆö[~h†ˆ¦õ·ä†‹Ø’ÍþøôüÜ̆ƒˆˆ‹†Ø[|à†ˆ›­ì†ì†Òöò†ƒù[|(†ˆ›Ÿì†Òöö†ü膃ˆñ[{†ˆ›»ì†ì†ì†Òö[z<†ˆ›§†ì†ì†óßöøƒù[yh†ˆ›™†ì†Òö膃ˆñ[xœ†ˆ›Ÿì†óßöò†ƒù膃ˆñö†ü[wp†ˆ›»ì†ì†ì†Òö[v˜†ˆ›»ì†ì†ì†Òö[uÀ†ˆ›»ì†ì†ì†Òö[t膈›»ì†ì†ì†Òööƒùð†ƒù[s¼†ˆ›[t ì†ìò†ì†Òö[rȆˆ›µòò†ì†Òö[rD†ˆ›ãö[q4†ˆ›[r4ì†ì†ì†ì†ì†Òö[p°†ˆ›‘Òö[p,†ˆ›‘Òö[o¨†ˆ›„ßöö†üò†ƒù[n¨†ˆ›»ì†ìò†Òö[mІˆ›»ì†ì†ì†Òö؆ˆþö[l´†‡ü[mn„þò„þò„þò„þò„þò„þè÷[l ˆ›Ÿì†Òö؆“õþþøð†ƒùʆˆþöʆˆþö[j †ˆ›­ì†ì†Òö[iœ†ˆ›‘Òö؆ˆþö[h°†ˆ›Ÿì†Òö[g؆ˆ›»ì†ì†ì†Òö[g†ˆ›­ì†ì†Òöüü[fˆ†ˆ›‘Òöð†ƒùò†ƒùð†ƒùð†ƒù[e€†ƒˆˆ™†ì†Øè†ƒˆñ[d´†ˆ›Ÿì†Òöö†üð†ƒù[c°†ˆ›»ì†ìò†Òö[bô†ˆ›­ìò†Òö[bT†ˆ›Ÿì†Òöˆ›‘Òö[a0†ˆ›Ÿì†Òö[^d†ƒˆúþŸ[a$ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆö[^à†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñ[]`†ˆ›»ìòò†Òöð†ƒù[[†ƒˆúþŸ[]8ƒùꆄ‚öꆈþö[\ †ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù؆ˆþöö†ü[Z(†ˆ›[[ ì†ì†ì†ì†Òö[YP†ˆ›»ì†ì†ì†Òö[Xx†ˆ›»ì†ì†ì†Òö[W؆ˆ›Ÿì†Òö[V¬†ˆ›[WÈì†ì†ì†ìò†ì†Òö[Vˆ›ŸìØöð†ƒùð†ƒù[UP†ˆ›‘Òö[T̆ˆ›ãö[T,†ˆ›‹†Òö[SŒ†ˆ›Ÿì†Òö[R´†ˆ›§†ì†ì†Òööƒùð†ƒù膃ˆñ[Q\†ˆ›µ†ìò†ì†Òöð†ƒù[Ph†ˆ›»ì†ìò†Òö[Nœ†ƒúþŸ[P\ƒùꆄ‚öꆄ„þöꆈþö[O†ˆ¦õ·ä†‹Ø’ÍþøôüÚ脌ƒóƒùð†ƒù[M|†ˆ›»ì†ì†ì†Òö[LÀ†ˆ›­ì†ì†Òö[J†ƒŽúþŸ[L´ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþö[Jp†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[D̆ƒúþŸ[Iüƒùꆄ„þöꆄ‚ö[F†ˆ‘úþŸ[I„„„þö[GP†ˆ‘úþŸ[Ilƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö[GȆˆ¦õ·ä†‹Ø’ÍþøôüÞö[F€†ˆ¦õ·ä†‹Ø’Íþøôüþàö[E8†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ü[Dˆ›‹†óßöò†ƒù[A|†ƒˆúþŸ[Cìƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆö[Aø†ˆ¦õ·ä†‹Ø’ÍþøôüÒ[?¸†ƒˆúþŸ[Apƒùꆄ‚öↈ‰õö[@4†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù[>Ȇˆ›»ì†ì†ì†Òö[=œ†ˆ›[>¸ìòò†ìò†ì†Òö[<¨†ˆ›[=Œìò†ì†ì†Òöð†ƒù[;´†ˆ›»ì†ì†ì†Òöˆ›‘óßöð†ƒù[9p†ƒúþŸ[;ƒùꆄ‚öꆆö[9܆ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùð†ƒù[7L†ƒŽúþŸ[90ƒùꆄ„þöà†„„þöà†ˆþö[7´†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[6Ȇˆ›‘óßö[6 †ˆ›™†ìØö[5P†ˆ›™ò†Òö[4x†ˆ›»ì†ìò†Òö[3ô†ˆ›‘Òöö†ü[2¨†ˆ›[3Ô䆋áò†ì†ìòØö؆ˆþö[1 †ˆ›­ì†ìØöð†ƒù[0¬†ˆ›»ì†ì†ì†Òö[/Ô†ˆ›»ì†ì†ì†Òö[.ü†ˆ›»ì†ì†ì†Òö[.\†ˆ›‹†Òö[-Ȉ›‹Øö膃ˆñ[,Ô†ˆ›™ò†Òö[+ü†ˆ›§†ìò†Òö[+$†ˆ›§†ìò†Òö[)¤†ˆ›[+ìò†ìòò†ìò†ìòØöö†ü[)†ˆ›‘Òööƒù[',†ƒˆúþŸ[(èƒùꆄ‚öà†ˆþö['¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒù[&†ˆ›‘Òö[%€†ˆ›[&€ì†ìòòòØö["†ƒúþŸ[%tƒùꆄ‚ö[#X†ˆ‰úþŸ[%4ƒùꆄ„þöꆄ„þöꆈþö[#à†ˆ¦õ·ä†‹Ø’ÍþøôüÖö["ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñð†ƒù[!@ˆ›Ÿì†óßö[ @†ˆ›[!$ì†ìò†ì†Òöð†ƒù[0†ˆ›µòò†ì†Òö[ †ˆ›[ ì†ì†ì†ì†ì†Òöò†ƒù[ð†ƒŽúþŸ[üƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö[X†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùò†ƒù[œ†ƒˆšø[TþŽþþ[Ö[@[ÒþŸ[0ƒù[t†ˆ¦õ§ì†ëßþø[„[Àˆ¦õ§‹á†Êþ[$ˆ¦õ™‹[0þøôüÒ[Ćˆ›»ì†ì†ì†Òö؆ˆþö[ †ˆ›»ì†ì†ì†Òö[Ȇˆ›»ì†ì†ì†Òöð†ƒùˆ›‘Òö[,†ƒˆúþŸ[ƒùƆ„„‰ˆ‘Üöꆆö[¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†üò†ƒù[d†ƒŽü°þò„þò„þò„þå[Ćˆ›Ÿì†Òö[솈›»ì†ì†ì†Òö[†ˆ›»ì†ì†ì†ÒöÞ“õþþø[D†ˆ›‘Òöð†ƒù[ 膃ŽúþŸ[ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆö[ P†ˆ¦õ·ä†‹Ø’ÍþøôüÜ[ †ƒˆúþŸ[ ܃ùꆄ‚öꆄ„þöꆆö[ ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†ü[ $†ˆ›»ì†ìò†Òö[̆ˆ›[ [4†‹šø[ œþŽþþ[n[ ˆ[jþŸ[ xƒù[¼†ˆ¦õ§ì†Êþø[ †ˆ¦õ§ì†ëßþø[°„[Xˆ¦õ§‹á†Êþ[¼ˆ¦õ™‹[Èþøôü[äöʆˆþö[Œ†ˆ›»ì†ì†ì†Òö[솈›Ÿì†Òöö†ü[<†ˆ›Ÿì†ÒöZû䆈›[,ì†ZüL†‹šø[˜þŽþþZü†[„Zü‚þŸ[tƒù[€†ˆ¦õ[Xì†ì†ì†Êþø[´†ˆ¦õµì†ì†ÊþøZÿ膈¦õµì†ì†ÊþøZþÔ†ˆ¦õZÿÈ‹áò†ì†ì†ÊþøZþ$†ˆ¦õ§ì†ëßþøZüÈ„Zýpˆ¦õ§‹á†ÊþZüÔˆ¦õ™‹ZüàþøôüZûüöZûD†ˆ›Ÿì†Òööƒùð†ƒùZù†ƒŽúþŸZûƒùꆄ‚öꆄ‚öꆄ‚öꆆöZù„†ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñZø†ˆ›§òò†ÒöZ÷x†ˆ›Ÿì†ÒöZôü†ƒˆúþŸZ÷lƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöZõx†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùð†üZ󆃈úþŸZôœƒùꆈþöZ󘆈¦õ·ä†‹Ø’ÍþøôüÒò†ƒùò†ƒùZòL†ˆ›Ÿì†ÒöZñt†ˆ›»ì†ì†ì†ÒöZð,†ˆ›Zñdìò†ì†ì†ì†ì†ì†ÒöÞ“õþþøö†üZ›™†ìØöZ옆ƒŽúþŸZïƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöZ톈¦õ·ä†‹Ø’ÍþøôüÜZëø†ˆ›‹Øö膃ˆñZéð†ƒˆúþŸZëÀƒùꆄ„þöꆄ„þöꆈþöZêl†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùZé4†ˆ›Ÿì†óßöZè$†ˆ›Zé$ì†ìò†ìòØöð†ƒùð†ƒùZâP„ZçàƒZâ\ƒšøZçpþŽþþZâzZç\ZâvþŸZçLƒùZ憈¦õZç0ì†ìòòò†ì†ÊþøZäȆˆ¦õZåôì†ìòòò†ì†ÊþøZ䆈¦õ§ì†ëßþøZ⼄Zãdˆ¦õ§‹á†ÊþZâȈ¦õ™‹ZâÔþøôüÚZáx†ˆ›»ì†ì†ì†Òöð†ƒùö†üZଆˆ›ŸìØöZà(†ˆ›‘ÒööƒùZßP†ˆ›™†ì†ÒöZÞ”†ˆ›­ì†ì†ÒöZÞ†ˆ›‘ÒöZÝp†ˆ›Ÿì†Òöð†üð†ƒùZÜ`†ˆ›»ì†ì†ì†ÒöZÛˆ†ˆ›»ì†ì†ì†ÒöZÚ膈›ŸìØöÞ“õþþøð†ƒù膃ˆñZذ†ƒúþŸZÚHƒùꆄ„þöꆈþöZÙ†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùZÕP†ƒˆúþŸZ؈ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöZÕ̆ˆ¦õ·ä†‹Ø’ÍþøôüÒZÔ”†ˆ›™†ì†ÒöZÓ †ˆ›ZÔ„ì†ìò†ì†ÒöZÒ†ˆ›ZÓì†ì†ì†ì†ì†Òöð†ƒùö†üZÐ$†ƒŽúþŸZÒXƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöZÐŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÜZÏh†ˆ›­ì†ìØööƒùZÊ܆ƒŽúþŸZÏ@ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öà†„„þöꆆöZËD†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùö†üZÈĆƒŽúþŸZʨƒùꆄ„þöà†„„þöà†ˆþöZÉ,†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùZÇð†ˆ›™†ìØöÔ†ƒˆ‹†àZÆ´†ˆ›»‹á†ìò†Òöò†ƒùZÅà†ˆ›­ì†ìØöð†ƒù؆ˆþöZÄØ†ˆ›Ÿì†ÒöZĆˆ›»ì†ì†ì†ÒöZÃ(†ˆ›»ì†ì†ì†ÒöZÂl†ˆ›­ìò†Òöˆ›‘ÒöZÁ,†ˆ›™†ì†óßöZÀT†ˆ›§†ìò†ÒöZ¿´†ˆ›Ÿì†Òöö†üZ¾Ì†ˆ›»ì†ì†ì†ÒöZ¾†ˆ›™†ì†ÒöZ¼ä†ˆ›Z¾ì†ì†ì†ìòò†Òöö†üZ¼†ˆ›™†ìØööƒùò†ƒù膃ˆñZºÄ†ˆ›µ†ìò†ì†ÒöZº$†ˆ›Ÿì†ÒöZ¹L†ˆ›»ì†ì†ì†ÒöZ¸t†ˆ›»ì†ì†ì†ÒöZ·œ†ˆ›»ìò†ì†Òöö†üò†ƒùˆ›‘Òöò†ƒùZ¶T†ˆ›‘ÒöZµÐ†ˆ›‘óßöð†ƒùZ´ø†ˆ›™†ì†ÒöZ²|†ƒˆúþŸZ´ìƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆöZ²ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùZ¯t†ˆ›Z²D‹á†ìZ°L†‹úþŸZ±ôƒùꆄ‚öꆈþöZ°È†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ì†ì†ÒöZ®ð†ˆ›‘ÒöZ®†ˆ›»ì†ì†ì†ÒöZ­@†ˆ›§ò†ì†Òöö†üö†üZ¬Œˆ›‹†óßöZ«ü†ˆ›‘ÒöZ«\†ˆ›Ÿì†Òöð†ƒùZ¨t†ƒˆúþŸZ«4ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöZ¨ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒZ§¸†ˆ›­ìò†ÒöZ¦à†ˆ›»ì†ìò†ÒöZ¤´†ˆ›Z¦Ðì†Z¥†‹úþŸZ¦œƒùꆆöZ¥˜†ˆ¦õ·ä†‹Ø’ÍþøôüZ¤ÌöZ£†ƒˆúþŸZ¤¨ƒùꆄ‚öꆈþöZ£|†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùZ È†ƒúþŸZ¢Øƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöZ¡4†ˆ¦õ·ä†‹Ø’ÍþøôüÚZŸð†ˆ›§†ì†ì†óßö؆ˆþö؆ˆþöð†ƒùZžœ†ˆ›Ÿì†Òöˆ›‘ÒöZ™€†ƒŽúþŸZž ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöZ™è†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ü؆“õþþøZ˜x†ˆ›ŸìØö膃ˆñð†ƒùZ—X†ˆ›»ì†ìò†Òö؆ˆþöZ–4†ˆ›»ì†ì†ì†ÒöZ•°†ˆ›‘ÒöZ•†ˆ›‹†Òöð†ƒùˆ›‘Òöð†ƒùö†üZ“l†ˆ›»ì†ì†ì†ÒööƒùZ‘p†ƒúþŸZ“Dƒùꆄ„þöꆄ‚öà†ˆþöZ‘܆ˆ¦õ·ä†‹Ø’ÍþøôüÚZ†ƒˆúþŸZ‘dƒùꆄ‚öꆄ‚öZD†„„‰ˆ§òò†Üöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöZŽ †ˆ¦õ·ä†‹Ø’ÍþøôüÒZŒð†ˆ›‹†ÒöZŒT†ƒˆˆ™†ì†ØZŠ †ƒˆúþŸZŒHƒùꆄ‚öꆈþöZ‹†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñZ‰†ƒˆˆZŠdì†ì†È†‹ˆ„Õ†ì†ì†ì†ØZˆ0†ƒˆˆZˆôìòò†ì†Øö†üð†ƒùZ‡,†ˆ›»ì†ì†ì†ÒöZ†T†ˆ›»ì†ì†ì†ÒöZ…´†ˆ›Ÿì†Òöˆ›‘óßöZ„t†ˆ›™†ì†óßöZ̆ˆ›Z‚Ì‹úþŸZ„hƒùꆄ‚öꆈþöZƒ<†ˆ¦õ·ä†‹Ø’Íþøôü†ìòòò†ÒöZ€ô†ˆ›»ì†ì†ìØöZP†ƒúþŸZ€èƒùꆄ‚öꆈþöZ¼†ˆ¦õ·ä†‹Ø’ÍþøôüÚZ~x†ˆ›»ì†ì†ì†ÒöZ}؆ˆ›Ÿì†Òö؆ˆþöZ|˜†ˆ›Z}|ìò†ì†ì†ÒöZ{À†ˆ›»ì†ì†ì†ÒöZx¨ƒˆúþŸZ{´ƒùZz†„„‘úþŸZ{Œ„‚öꆆöZzˆ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöZy†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùZu´†ƒˆúþŸZxtƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöZv0†ˆ¦õ·ä†‹Ø’ÍþøôüÒZsÀ†ƒúþŸZu¨ƒùꆄ„þöꆄ‚öꆄ„þöꆆöZt,†ˆ¦õ·ä†‹Ø’ÍþøôüÚZr°†ˆ›Zs°ì†ì†ì†ì†ì†ÒöZr,†ˆ›‘Òöò†ƒùð†ƒùZqX†ˆ›Ÿì†ÒöZpœ†ˆ›­ì†ì†ÒööƒùZoà†ˆ›Ÿì†ÒöZo@†ˆ›Ÿì†Òö膃ˆñZn†ˆ›‘ÒöʆˆþöZl$†ƒˆúþŸZnƒùꆄ‚öꆄ„þöꆄ„þöꆈþöZl †ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üö†üZk,†ˆ›»ì†ì†ì†ÒöZjT†ˆ›»ì†ì†ì†ÒöZi|†ˆ›»ì†ì†ì†ÒöZh4†ˆ›ZiD†ìò†ìò†ì†ì†ÒöZg ˆ›‹†óßöð†üZeˆ†ƒˆúþŸZglƒùꆄ‚öꆄ‚öà†ˆþöZf†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùò†ƒùZc´†ƒŽúþŸZeHƒùꆄ‚öꆆöZd†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üZc †ˆ›„ßö膃ˆñ脌ƒóƒùZb(†ˆ›ŸìØöð†ƒùüü膃ˆñð†ƒù膃ˆñZa†ˆ›‘óßöZ_L†ƒúþŸZ`øƒùꆄ‚öà†ˆþöZ_¸†ˆ¦õ·ä†‹Ø’ÍþøôüÚZ^<†ˆ›Z_<ì†ìò†ìò†ÒöZZP†ƒˆúþŸZ^0ƒùꆄ‚öZ[솄„‰úþŸZ]ðƒùꆄ‚öꆄ„þöꆄ„þöꆈþöZ\t†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆈþöZZ̆ˆ¦õ·ä†‹Ø’ÍþøôüÒZYx†ˆ›»ìòò†ÒöZX؆ˆ›‹†Òö脌ƒóƒùZX†ƒŒü°þò„þò„þò„þçZSĆˆ›ZX ZT,†‹šøZW”þŽþþZTfZW€ZTbþŸZWpƒùZV´†ˆ¦õ§ì†ÊþøZV†ˆ¦õ§ì†ëßþøZT¨„ZUPˆ¦õ§‹á†ÊþZT´ˆ¦õ™‹ZTÀþøôüZSÜöö†üZR܆ˆ›»ì†ìò†ÒöZR†ˆ›­‹áò†Òö؆ˆþööƒùZPІˆ›»ì†ì†ì†ÒöZPL†ˆ›‘Òöð†ƒùZNh†ƒŽúþŸZP$ƒùꆄ‚öꆄ‚öꆆöZNІˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùZM†ˆ›‹Øö膃ˆñZLD†ˆ›ZMD‹á†ìò†ìò†Òöð†ƒùð†ƒùZKl†ˆ›Ÿì†óßöZJ̆ˆ›‹†Òöð†ƒùZC\†ƒˆúþŸZJ”„‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöZF8†„„‰úþŸZI|„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöZFÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöZC؆ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñZB†ˆ›Ÿì†ÒöZ:†ˆ›ZB€Z:ø†‹šøZBþŽþþZ;2Z>LøZA˜þŽþþZ>jZA„Z>fþŸZAtƒùZ@¸†ˆ¦õ§ì†ÊþøZ@†ˆ¦õ§ì†ëßþøZ>¬„Z?Tˆ¦õ§‹á†ÊþZ>¸ˆ¦õ™‹Z>ÄþøôüZ;.þŸZ><ƒùZ=€†ˆ¦õ§ì†ÊþøZ<Іˆ¦õ§ì†ëßþøZ;t„Z<ˆ¦õ§‹á†ÊþZ;€ˆ¦õ™‹Z;ŒþøôüZ:¨öZ9¸†ˆ›»ìò†ì†ÒöZ9†ƒˆŽü°þò„þò„þò„þÝZ8X†ˆ›­ìò†ÒöZ7€†ˆ›»ì†ì†ì†Òöö†üZ5̆ƒúþŸZ7dƒùꆄ‚öꆆöZ68†ˆ¦õ·ä†‹Ø’ÍþøôüÚZ58ˆ›Ÿì†ÒöZ4p†ˆ›­ì†ì†ÒöZ3´†ˆ›™òØöZ30†ˆ›‘ÒöZ2X†ˆ›»ì†ì†ì†ÒöZ1¸†ˆ›‹†ÒöZ-”ƒˆúþŸZ1œ„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöZ.†ˆ¦õ·ä†‹Ø’ÍþøôüÒZ,膈›‹†ÒöZ,H†ˆ›Ÿì†Òöð†ƒù膃ˆñZ+(†ˆ›»ìòò†Òöð†üZ*ˆ†ˆ›‘Òöò†ƒùZ(䆃ˆúþŸZ*dƒùꆈþöZ)`†ˆ¦õ·ä†‹Ø’ÍþøôüÒZ(D†ˆ›‹†Òöò†ƒùZ'T†ˆ›»ì†ì†ì†Òö؆ˆþöö†üZ&<†ˆ›­ìò†ÒöZ#p†ƒˆúþŸZ&0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöZ#솈¦õ·ä†‹Ø’ÍþøôüÒöƒùð†ƒùZ"|†ˆ›™†ì†Òöð†ƒùð†ƒùZ!4†ˆ›Z"4ìòò†ìò†Òöö†üð†ƒùöƒùð†ƒùZ†ƒŽúþŸZ ăùꆄ‚öà†ˆ‰õöZ„†ˆ¦õ·ä†‹Ø’ÍþøôüÜZ˜†ˆ›‘óßöZ܆ˆ›™ò†ÒöÔ†ƒˆ‘àð†ƒùZ\†ˆ›Z4†ì†ì†ìò†ÒöZ¼†ˆ›Ÿì†Òöˆ›‘óßöð†ƒù膃ˆñZ†ƒˆúþŸZäƒùZˆ†„„‰úþŸZ̃ùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöZ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöZ†ˆ¦õ·ä†‹Ø’ÍþøôüÒZt†ˆ›ŸìØöZ¨†ƒúþŸZhƒùꆄ‚öꆄ‚öꆆöZ†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþöö†üò†ƒù脌ƒóƒùð†ƒùö†ü؆ˆþöZð†ˆ›‘Òö脌ƒóƒùö†üò†ƒùZĆˆ›»ì†ì†ì†ÒöZ ¼†ˆ›Z´Z $†‹šøZ<þŽþþZ ^Z(Z ZþŸZƒùZ\†ˆ¦õ§ì†ÊþøZ¬†ˆ¦õ§ì†ÊþøZ ü†ˆ¦õ§ì†ëßþøZ  „Z Hˆ¦õ§‹á†ÊþZ ¬ˆ¦õ™‹Z ¸þøôüZ ÔöZ †ˆ›­ìòØöñʆˆŸßöZh†ƒˆúþŸZ `ƒùꆄ„þöꆄ‚öꆄ‚öꆆöZ䆈¦õ·ä†‹Ø’ÍþøôüÒð†ƒùZ †ƒˆúþŸZ@ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆöZœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùZL†ˆ›™†ìùßöZ†ˆ›Zô‹ˆ‘Z„†‹ˆ„Z4öZð†ˆ›Z ì†ìò†ìò†ìØöð†ƒùò†ƒùZ†ƒˆúþŸZ°ƒùZ†„„ü°þò„þò„þò„þéöꆆöZ †ˆ¦õ·ä†‹Ø’ÍþøôüÒЈŸßöYÿ¤†ˆ›‘ÒöYÿ†ˆ›‹†ÒöʆˆþöYüH†ƒˆúþŸYþƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöYüĆˆ¦õ·ä†‹Ø’ÍþøôüÒYûp†ˆ›»ì†ì†ìØöò†ƒùYú¸†ˆ›‹†Òöð†ƒùYö†ˆ›‘‹úþŸYúƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöYö䆈¦õ·ä†‹Ø’ÍþøôüYööYõ(†ˆ›»ì†ì†ì†Òöð†ƒùˆ›‘óßöYíl†ƒŽúþŸYô|ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöYˆ‘úþŸYód„‚öꆄ‚öꆄ„þöꆈþöYò†ˆ¦õ·ä†‹Ø’ÍþøYïüþšYò üö†üYñ †ˆ¦õ·ä†‹Ø’ÍþøYï(•YñþYïp„‘úþŸYðì„„þöà†ˆþöYïÔ†ˆ¦õ·ä†‹Ø’ÍþøôüþàéþïþÐöYíÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùʆˆþöò†ƒù膃ˆñYꄆƒˆúþŸYì|ƒùꆄ„þöꆄ„þöꆄ„þöꆆöY놈¦õ·ä†‹Ø’ÍþøôüÒð†ƒùYéȆˆ›Ÿì†ÒöY蜆ˆ›Yé¸ìò†ìòò†ìØöüüð†üY憃ŽúþŸYèdƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöYæp†ˆ¦õ·ä†‹Ø’ÍþøôüÜY冈›µòò†ì†óßöð†ƒùYä<†ˆ›­ì†ìØöY㜆ˆ›ŸìØöYâà†ˆ›­ì†ìØöYÜ4†ˆ›‘“úþŸYâÔƒùYÝØ†ˆ‘úþŸYàì„„‘úþŸY⬄‚öꆄ‚öꆄ‚öꆆöYáX†ˆ¦õ·ä†‹Ø’ÍþøôüþàöYßH†„„‘úþŸYàÄ„‚öꆆöYßÀ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöYÞP†ˆ¦õ·ä†‹Ø’ÍþøôüþàöY݆ˆ¦õ·ä†‹Ø’ÍþøôüÑßö؆ˆþöYÛd†ˆ›‘ÒöYÙ¬†ˆ›YÛTì†ìò†ì†ì†ì†ìòò†ìò†ÒöYÙ †ˆ›Ÿì†ÒöY×ü†ˆ›YØüìò†ì†ì†ì†ÒöY×Lˆ›™†ì†Òöö†üð†ƒùð†ƒùYÔ´†ƒúþŸYÖìƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöYÕ †ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùYÒ䆃ˆúþŸYÔŒƒùꆄ„þöꆈþöYÓ`†ˆ¦õ·ä†‹Ø’ÍþøôüÒYÒ(†ˆ›™†ì†ÒöYѤ†ˆ›‘Òöò†ƒùYд†ˆ›»ì†ì†ì†ÒöYÏø†ˆ›­ì†ì†Òö†ƒŒü¤þò„þò„þçYΨ†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöY͆ˆ›YÎì†ìò†ì†ÒöYÌD†ˆ›»ì†ì†ì†ÒöYÊĆˆ›YÌ òò†ìò†ìò†ìò†ÒöÞ“õþþøð†ƒùYɬ†ˆ›Ÿ‹á†ÒöYÆT†ˆ›­‹úþŸYÉ ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöYÇp†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöð†ƒùÔ†ƒˆ‘àYÅ(†ˆ›­ì†ì†ÒöYÄP†ˆ›»ì†ì†ì†Òö؆ˆþöð†ƒùYÃ,†ˆ›­ìò†ÒöY˜ˆ›Ÿì†ÒöY¾´†ˆ›»‹úþŸY€ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆆöY¿ì†ˆ¦õ·ä†‹Ø’ÍþøôüÂòò†ÒöY½†ƒˆúþŸY¾¨ƒùꆄ‚öꆆöY½|†ˆ¦õ·ä†‹Ø’ÍþøôüÒY¼D†ˆ›™†ì†Òöð†ƒùY»¤†ˆ›‘Òöò†ƒùYº†ƒˆúþŸY»€ƒùꆈþöYº|†ˆ¦õ·ä†‹Ø’ÍþøôüÒY¹(†ˆ›»ì†ì†ì†Òö؆ˆþöY¸<†ˆ›Ÿì†ÒöY·¨ˆ›‹†óßöð†ƒùY¶ü†ˆ›‘Òö膃ˆñð†ƒùYµø†ˆ›­ì†ì†ÒöYµ †ˆ›»ì†ìò†Òöˆ›‘Òöð†ƒùY³Œ†ˆ›µòò†ìØöY²´†ˆ›»ì†ì†ì†ÒöY±¤†ˆ›Y²¤ì†ì†ì†ìò†Òöð†ƒùð†ƒù膃ˆñð†ƒùY¯˜†ƒˆúþŸY±ƒùꆆöY°†ˆ¦õ·ä†‹Ø’ÍþøôüÒY«Ä†ƒúþŸY¯Œƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöY¬0†ˆ¦õ·ä†‹Ø’ÍþøôüÚYªì†ˆ›§†ì†ì†ÒöY£˜†ƒˆúþŸYªÐ„‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöY¦t†„„‰úþŸY©¸„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöY¦ü†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöY¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒY¡l†ƒˆúþŸY£Œƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöY¡è†ˆ¦õ·ä†‹Ø’ÍþøôüÒY Ì†ˆ›Ÿì†Òö؆ˆþöð†ƒùYŸ¨†ˆ›­ìò†ÒöYŸ†ˆ›ŸìØöYžtˆ›ŸìùßöY†ˆ›§†ì†ì†ÒöYœð†ˆ›Ÿì†ÒöYœP†ˆ›‹†ÒöY›”†ˆ›­ìò†ÒöYš¼†ˆ›§òò†ÒöY˜¸†ƒˆúþŸYš°ƒùꆄ‚öꆄ„þöꆄ„þöꆈþöY™4†ˆ¦õ·ä†‹Ø’ÍþøôüÒY˜†Y˜ªþò„þò„þò„þæ„üò÷ð†ƒùY–솈›Y—ììò†ì†ì†ì†ÒöY“¼Y‘HY–t–’Y‘@øüøüøüøüøüøüøüøüøüøüYœY4ööY›‹ØöYކˆ›YŽèì†ìòò†Òö膃ˆñ膃ˆñYŒÔ†ˆ›§†ìòØöö†üYŒ$†ˆ›Ÿì†ÒöY‹L†ˆ›»ì†ì†ì†Òöð†ƒùð†ƒùYІˆ›‘ÒöYˆ\ƒŽúþŸYŠ„ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþöYˆ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùò†ƒùð†ƒùð†ƒùY†ð†ˆ›»ì†ì†ìØöò†ƒùY†8†ˆ›‹†ÒöY…`†ˆ›»ì†ì†ì†ÒöY„ˆ†ˆ›»ì†ì†ì†Òöò†ƒùö†üYƒl†ˆ›Y„Pìò†ì†ì†ÒöY‚ †ˆ›­‹á†ì†ÒöY‚ ˆ›Ÿì†ÒöY|†ˆ›‘ÒöY€l†ˆ›Ylì†ì†ì†ì†ì†ÒöY|†ƒˆˆY€\ì†ìòò†ì†Øð†ƒù؆ˆþöY~t†ˆ›Ÿì†ÒöY}Ĉ›™†ìùßöY}4†ˆ›‘ÒöYy¼†ƒˆúþŸY}(ƒùꆄ‚öY{†ˆ‰’úþŸY|èƒùꆄ‚öꆄ‚öꆆöY{”†ˆ¦õ·ä†‹Ø’ÍþøôüÔöYz8†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùYx䆈›Ÿì†ÒöYx`†ˆ›‘ÒöYw܆ˆ›‘Òöð†ƒùYw<†ˆ›ãöYv€†ˆ›­ì†ìØöYuĆˆ›™†ì†ÒöYt솈›»ì†ìò†ÒöYtL†ˆ›Ÿì†Òöö†üYs¸†ˆ›‘ÒöYrü†ˆ›™ò†ÒöYr\†ˆ›Ÿì†Òöð†ƒùöƒù膃ˆñ膃ˆñYq†ˆ›™†ì†ÒöYm@†ƒŽúþŸYqƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöYm¨†ˆ¦õ·ä†‹Ø’ÍþøôüÜYl„†ˆ›­ì†ìØö؆ˆþöYk(†ˆ›Yl(ìò†ìò†ì†Òö؆ˆþöò†ƒùYiD†ˆ›YjŒòò†ìò†ìò†ìò†ÒöYaƒˆúþŸYi8ƒùꆄ‚öꆄ‚öYb\†ˆ‘úþŸYg„„‘úþŸYhÀ„‚öꆄ‚öꆄ‚öꆆöYgl†ˆ¦õ·ä†‹Ø’ÍþøôüþàöYc¤†ˆ‘úþŸYfÌ„„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆈þöYd†ˆ¦õ·ä†‹Ø’ÍþøôüþàöYbÔ†ˆ¦õ·ä†‹Ø’ÍþøôüþàöYaŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÒY_\†ƒˆúþŸYaƒùꆄ‚öꆆöY_؆ˆ¦õ·ä†‹Ø’ÍþøôüÒY^¼†ˆ›‹†Òöð†ƒùY]Ȇˆ›»ì†ì†ìØöY[솃ˆúþŸY]¼ƒùꆄ‚öꆄ„þöꆆöY\h†ˆ¦õ·ä†‹Ø’ÍþøôüÒYVÀ†ˆ›‘‹úþŸY[àƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöↄ„‰õöYY<†„„‰ˆ™ò†Üöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöYW¤†ˆ¦õ·ä†‹Ø’ÍþøôüYVØö؆ˆþöYUÔ†ˆ›Ÿì†ÒöYUP†ˆ›„ßö؆ˆþöYT,†ˆ›»ì†ì†ì†ÒöYSŒ†ˆ›Ÿì†Òöð†ƒùYR˜†ˆ›»ìòòØöYO“¼YPDŠ–˜þ˜þ–˜YQ䈒YQ€‚ˆ’Âü–üYP<YOœYP öYO›‹Øöð†ƒùð†ƒùò†ƒùYN†ˆ›Ÿì†ÒöYMh†ˆ›‹†Òöö†üYK܆ƒúþŸYMLƒùꆈþöYLH†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöʆˆþöYIü†ˆ›YKìò†ìòò†ìØöÞ“õþþøð†ƒùð†ƒùð†ƒùYFà†ƒˆúþŸYIPƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†„„þöà†ˆ‰õöYG\†ˆ¦õ·ä†‹Ø’ÍþøôüÒYET†ƒˆúþŸYFÔƒùꆆöYEІˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†üö†ü脌ƒóƒù脌ƒóƒùYC܆ˆ›»ì†ì†ì†ÒöYB膈›YCÌìò†ì†ì†ÒöYB,†ˆ›­ì†ì†ÒöYAT†ˆ›»ì†ì†ì†ÒöøƒùY@d†ˆ›§†ìò†Òöð†ƒùY>D†ƒˆúþŸY@<ƒùꆄ„þöꆄ‚öꆄ‚öꆆöY>À†ˆ¦õ·ä†‹Ø’ÍþøôüÒY=À†ˆ›ãöY: †ƒŽúþŸY=´ƒùY;€†„„‘úþŸY=œƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöY;ø†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöY:ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÜY7ô†ƒˆúþŸY:ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆆöY8p†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùY6†ˆ›Y7¬ì†ìò†ìò†ìØöY5¸†ˆ›»ì†ì†ì†ÒöÚ†ƒˆñY4´†ˆ›­ìò†ÒöY1ü†ƒŽúþŸY4¨ƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþöY2d†ˆ¦õ·ä†‹Ø’ÍþøôüÜÞ“õþþøY-T†ƒúþŸY1”„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöY-À†ˆ¦õ·ä†‹Ø’ÍþøôüÚY,˜†ˆ›™†ì†ÒöY)ô†ƒˆúþŸY,Œƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöY*p†ˆ¦õ·ä†‹Ø’ÍþøôüÒY)8†ˆ›­ì†ì†ÒöY(˜†ˆ›Ÿì†Òöö†üY'̆ˆ›­ì†ì†ÒööƒùY'†ˆ›Ÿì†Òöö†üð†ƒùY& †ˆ›§†ì†ì†ÒöY%ˆ†ˆ›‘Òöð†ƒùY#¸†ƒˆúþŸY%`ƒùꆄ‚öꆈþöY$4†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùY <†ƒŽúþŸY#ƒùꆄ‚öY!œ†„„‰úþŸY#Pƒùꆄ‚öꆈþöY"$†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöY ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜY,†ˆ›Y †ì†ì†ìò†ÒöYT†ˆ›»ì†ì†ì†Òö脌ƒóƒùYl†ˆ›­ìò†Òöö†üY¼†ˆ›ŸìØöY†ˆ›Ÿì†ÒöøƒùʆˆŸßöYŒ†ˆ›YŒì†ì†ìò†ì†ÒöYІˆ›™ò†Òöð†üð†ƒùYø†ˆ›ŸìØö؆ˆþö؆ˆþöð†ƒùY¤†ˆ›ŸìØöYˆ›‹†óßöð†ƒùð†üY,†ˆ›‹†Òöò†ƒùð†ƒùY †ˆ›»ìòò†Òöö†üð†ƒùYT†ˆ›Ÿì†ÒöY|†ˆ›»ì†ì†ì†ÒöY¤†ˆ›»ì†ì†ì†Òööüð†ƒùY”†ˆ›»ìòò†ÒöYL†ˆ›Y„ìòòòòòò†ÒöY ¼†ƒŽúþŸY@ƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöY$†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùY D†ˆ›Ÿ‹úþŸY xƒùꆄ‚öY †ˆ‰ˆúþŸY 8ƒùꆄ‚öꆄ„þöↄ„‰õöꆈþöY ¬†ˆ¦õ·ä†‹Ø’ÍþøôüÎöY D†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöY˜†ƒˆúþŸY 8ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöY†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùð†ƒùYˆ†ˆ›»ì†ì†ì†ÒöY†ˆ›ãöY؆ˆ›Y̆ìò†ìò†ì†Òööüò†ƒùð†ƒùY膈›Ÿì†Òöð†ƒùXÿô†ˆ›»ì†ì†ì†ÒöXûœ†ˆ›XÿäXü†‹šøXÿlþŽþþXü>XÿXXü:þŸXÿHƒùXþŒ†ˆ¦õ§ì†ÊþøXý܆ˆ¦õ§ì†ëßþøXü€„Xý(ˆ¦õ§‹á†ÊþXüŒˆ¦õ™‹Xü˜þøôüXû´öXúĆˆ›»ì†ì†ì†ÒöXù솈›»ì†ì†ì†Òö؇üˆ„þè÷X÷¤†ƒŽúþŸXùˆƒùꆄ‚öꆄ‚öꆄ‚öꆆöXø †ˆ¦õ·ä†‹Ø’ÍþøôüÜX÷†ˆ›‹†ÒöXô؆ˆ›XöÌòXõ2ŠúþŸXö¤ƒùꆆöXõ †ˆ¦õ·ä†‹Ø’ÍþøôüXôðöXô†ˆ›™†ì†ÒöʆˆþöXòÀ†ˆ›µò†ìò†ÒöXñ솃ˆˆµòòò†ØXðø†ˆ›XñÜìò†ì†ì†ÒöX𠆈›»ì†ì†ì†ÒöXˆ›‘Òö脌ƒóƒùXî솈›‘Òöð†ƒùð†üXíHƒŽúþŸXùꆆöXí¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜXßð†ƒˆúþŸXí0ƒùꆄ‚öꆄ‚öꆄ‚öXá<†ˆ‘úþŸXì„„þöꆄ„þöXél†„„‘úþŸXìPƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöXé䆈¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöX缆„„‘úþŸXé8ƒùꆆöXè4†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöXæ †„„‘úþŸX爃ùꆈþöX愆ˆ¦õ·ä†‹Ø’ÍþøôüÞöXä4†„„‘úþŸXæƒùꆄ„þöꆄ‚öꆆöX䬆ˆ¦õ·ä†‹Ø’ÍþøôüÞöX℆ˆ‘úþŸXä(ƒùꆄ‚öꆆöXâü†ˆ¦õ·ä†‹Ø’ÍþøôüÞöXá´†ˆ¦õ·ä†‹Ø’ÍþøôüþàöXàl†ˆ¦õ·ä†‹Ø’ÍþøôüÒXß4†ˆ›™†ì†ÒöXÞ\†ˆ›§†ì†ì†óßöXÜ”†ƒŽúþŸXÞPƒùꆄ„þöꆄ„þöꆈþöXÜü†ˆ¦õ·ä†‹Ø’ÍþøôüÜXÛ¼†ˆ›§òò†Òöð†ƒùXÚ†ˆ›XÛh†ì†ìòò†óßöXÙH†ˆ›XÚ€ì†ìòòò†ìòØöò†ƒùXØ †ˆ›XÙ ì†ìòòòùßöXÑ4†ƒúþŸX؃ùꆄ‚öò†ƒùXÒp†ˆ‘úþŸX×¼ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöXÕP†„„‘úþŸXÖÌ„„þöꆈþöXÕȆˆ¦õ·ä†‹Ø’ÍþøôüþàöXÓ¸†ˆ‘úþŸXÕ4„„þöꆈþöXÔ0†ˆ¦õ·ä†‹Ø’ÍþøôüþàöXÒ膈¦õ·ä†‹Ø’ÍþøôüþàöXÑ †ˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñXÐh†ˆ›‹†ÒöXÏ䆈›‘Òöö†üXÏ$ˆ›­ì†ìØö؆“õþþøð†üXΆˆ›Ÿì†ÒöXÍp†ˆ›Ÿì†óßöXÌ솈›‘ÒöXÌL†ˆ›Ÿì†Òö؆ˆþöʆˆþöXˆˆ›‘Òö؆ˆþöXÊ(†ˆ›Ÿì†ÒöXÈà†ˆ›XÉðòò†ìò†ìò†Òööüð†ƒùXȆˆ›ŸìØöð†üXÇ0†ˆ›­ìò†ÒöʆˆþöXÅð†ˆ›§ò†ì†ÒöXÅ4†ˆ›™òØöXÂô†ˆ›‘‹ˆúþŸXÅ(ƒùꆄ‚öà†ˆ‰õöXÃ膈¦õ·ä†‹Ø’ÍþøôüXà öö†üX †ˆ›»ì†ì†ì†óßöò†ƒùXÀ†ƒˆúþŸXÁèƒùꆄ„þöꆄ„þöꆈþöXÀ”†ˆ¦õ·ä†‹Ø’ÍþøôüÒX¿@†ˆ›»ì†ì†ì†ÒöX¾h†ˆ›»ì†ì†ì†ÒöX½†ˆ›»ì†ì†ì†ÒöX¼œ†ˆ›µ†ì†ìò†Òööƒù膃ˆñX»´†ˆ›Ÿì†ÒöX»†ˆ›Ÿì†Òöð†ƒùð†ƒùð†ƒùXº@†ƒˆˆŸìÞX¹h†ˆ›»ì†ì†ì†ÒöX²P†ˆ›X¹XX²¸†‹šøX¸àþŽþþX²òX¸ÌX²îþŸX¸¼ƒùX¸†ˆ¦õ§ì†ÊþøX·P†ˆ¦õ§ì†ÊþøX¶ †ˆ¦õ§ì†ÊþøXµð†ˆ¦õ“†ÊþøXµ@†ˆ¦õ§ì†ÊþøX´†ˆ¦õ§ì†ëßþøX³4„X³Üˆ¦õ§‹á†ÊþX³@ˆ¦õ™‹X³LþøôüX²höð†üˆ›ãö؆“õþþøð†ƒùX°p†ˆ›»ìòò†Òöð†ƒùX¯`†ˆ›µò†ì†ì†Òö膃ˆñò†ƒùö†ü؆ˆþö؆ˆþöX­¸†ˆ›™†ì†ÒöX¬à†ˆ›»ì†ì†ì†Òööƒùð†ƒùX¬†ˆ›Ÿì†ÒöX¦<†ˆ›X«øì†ì†X¦¤†‹šøX«HþŽþþX¦ÞX«4X¦ÚþŸX«$ƒùXª†ˆ¦õX«ì†ì†ì†ì†ÊþøX©,†ˆ¦õXªì†ì†ì†ÊþøX¨|†ˆ¦õ§ì†ëßþøX§ „X§Èˆ¦õ§‹á†ÊþX§,ˆ¦õ™‹X§8þøôüX¦TöX˜¼†ˆ›X¦,X™$†‹šøX¥´þŽþþX™^X¥ X™ZþŸX¥ƒùX¤Ô†ˆ¦õ§ì†ÊþøX¤$†ˆ¦õ§ì†ÊþøX£t†ˆ¦õ§ì†ÊþøX¢Ä†ˆ¦õ§ì†ÊþøX¢†ˆ¦õ§ì†ÊþøX¡d†ˆ¦õ§ì†ÊþøX ´†ˆ¦õ§ì†ÊþøX †ˆ¦õ§ì†ÊþøXŸT†ˆ¦õ§ì†ÊþøXž¤†ˆ¦õ§ì†ÊþøXô†ˆ¦õ§ì†ÊþøXD†ˆ¦õ§ì†ÊþøXœ”†ˆ¦õ§ì†ÊþøX›¬†ˆ¦õXœ„ì†ì†ì†ÊþøXšü†ˆ¦õ§ì†ëßþøX™ „XšHˆ¦õ§‹á†ÊþX™¬ˆ¦õ™‹X™¸þøôüX˜Ôöð†üöƒùð†ƒùX—Ȇˆ›Ÿì†ÒöX—(†ˆ›Ÿì†óßöX•L†ƒŽúþŸX—ƒùꆄ„þöꆄ‚öà†ˆþöX•´†ˆ¦õ·ä†‹Ø’ÍþøôüÜX”Ȇˆ›‘ÒöX”D†ˆ›‘óßöò†ƒùð†ƒùð†ƒùX“p†ˆ›‘Òöð†ƒùX’|†ˆ›»ì†ì†ì†ÒöX‘¤†ˆ›»ì†ì†ì†ÒöX̆ˆ›»ì†ì†ì†ÒöX†ˆ›­ìò†ÒöX8†ˆ›»ì†ì†ì†Òöð†üXd†ˆ›X ì†ì†ì†ì†ì†ì†ìòòò†ì†Òöˆ›‘ÒöXŒ†ˆ›§òò†ÒöX‹h†ˆ›Ÿì†ÒöXˆ †ƒúþŸX‹\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöXˆx†ˆ¦õ·ä†‹Ø’ÍþøôüÚX‡P†ˆ›™ò†Òö膃ˆñX† †ˆ›‘Òö؆ˆþöX…´†ˆ›Ÿì†Òöö†üX„°†ˆ›X…”ì†ìòò†ÒöX„ˆ›Ÿì†Òö؆“õþþøò†ƒùXƒ(†ˆ›‘Òöò†ƒùX~ІƒŽúþŸXƒƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öX€†ˆ‘úþŸXüƒùꆄ‚öꆄ„þöꆄ‚öꆆöX€€†ˆ¦õ·ä†‹Ø’ÍþøôüÞöX8†ˆ¦õ·ä†‹Ø’ÍþøôüÜX~0†ˆ›ŸìØöXzü†ˆ›X~ ì†X{Ô†‹úþŸX}ìƒùꆄ‚öƆ„„‰ˆ„éöꆈþöX|P†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ì†ìØöXyX†ƒúþŸXzðƒùꆄ„þöꆈþöXyĆˆ¦õ·ä†‹Ø’ÍþøôüÚö†üð†ƒù؆ˆþöXx†ˆ›»ì†ìò†ÒöXvx†XwúþXvŠ„üXwÚ„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷Xuô†ˆ›‘ÒöXu`ˆ›‹†ÒöXsx†ƒˆúþŸXuHƒùꆄ‚öꆄ‚öꆆöXsô†ˆ¦õ·ä†‹Ø’ÍþøôüÒXq8†ƒˆúþŸXslƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöXq´†ˆ¦õ·ä†‹Ø’ÍþøôüÒXp|†ˆ›™†ì†ÒöXo܆ˆ›ŸìØöXnd†ƒŽúþŸXoЃùꆆöXn̆ˆ¦õ·ä†‹Ø’ÍþøôüÜØ†ˆþöXm\†ˆ›­ì†ì†Òöð†ƒùXkt†ƒúþŸXm4ƒùꆄ„þöꆄ„þöꆈþöXkà†ˆ¦õ·ä†‹Ø’ÍþøôüÚXihƒŽúþŸXkhƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöXiĆˆ¦õ·ä†‹Ø’ÍþøôüÜXg,†ƒúþŸXiPƒùꆄ„þöꆄ„þöà†„„þöꆄ„þöꆆöXg˜†ˆ¦õ·ä†‹Ø’ÍþøôüÚXf¨†ˆ›‘ÒöXf†ˆ›Ÿì†ÒöXdø†ˆ›XeÐòòò†ì†ÒöXdX†ˆ›Ÿì†ÒöXc †ƒˆˆ»ì†ìòÞÞ“õþþøð†üð†üò†ƒùXb€†ˆ›‘Òöð†ƒùXaĆˆ›‹†ÒöXa@†ˆ›‘ÒöX`„†ˆ›™ò†ÒöX_X†ˆ›X`tì†ìò†ìòòØöö†üð†ƒùX[<„X_ ƒX[HƒšøX^°þŽþþX[fX^œX[bþŸX^ŒƒùX]´†ˆ¦õµì†ì†ÊþøX]†ˆ¦õ§ì†ëßþøX[¨„X\Pˆ¦õ§‹á†ÊþX[´ˆ¦õ™‹X[ÀþøôüÚXZd†ˆ›»ì†ì†ì†Òöð†ƒùXY¨†ˆ›Ÿì†ÒöXX솈›­ì†ì†ÒöЈŸßöð†üð†üXW¬†ˆ›ŸìØöXUô†ˆ›XWtòò†ìòò†ìòòòò†ÒöXU8†ˆ›­ìò†ÒöXT`†ˆ›§ò†ì†ÒöXRÔ†ƒˆúþŸXTTƒùꆆöXSP†ˆ¦õ·ä†‹Ø’ÍþøôüÒXP”†ˆ›‘‹ˆúþŸXRȃùꆄ‚öà†ˆ‰õöXQˆ†ˆ¦õ·ä†‹Ø’ÍþøôüXP¬öð†ƒùò†ƒùXN„†ƒˆúþŸXPTƒùꆄ„þöꆄ„þöꆈþöXO†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üXMœ†ˆ›»ì†ì†ì†ÒöXLĆˆ›»ì†ì†ì†Òöð†ƒùXK솈›­ì†ì†ÒöXKL†ˆ›Ÿì†Òöð†üöƒùð†üXJX†ˆ›‹†ÒöXId†ˆ›µò†ìò†ÒöXF„†ƒŽúþŸXIXƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öà†ˆþöXF솈¦õ·ä†‹Ø’ÍþøôüÜXE¬†ˆ›»ì†ì†ì†ÒöXD¸†ˆ›XEœìò†ì†ì†Òöò†ƒùXC䆈›­ì†ì†ÒöXC †ˆ›»ì†ìò†ÒöXB4†ˆ›»ì†ì†ì†ÒöX<|†ˆ›XB$X<䆋šøXA¬þŽþþX=XA˜X=þŸXAˆƒùX@̆ˆ¦õ§ì†ÊþøX@†ˆ¦õ§ì†ÊþøX?l†ˆ¦õ§ì†ÊþøX>¼†ˆ¦õ§ì†ëßþøX=`„X>ˆ¦õ§‹á†ÊþX=lˆ¦õ™‹X=xþøôüX<”öö†üX;”†ˆ›»ì†ì†ì†Òöð†ƒùX:¬ˆ›»ì†ì†ìØöʆˆþöò†ƒùX9d†ˆ›™†ì†ÒöX8Œ†ˆ›§†ì†ì†óßöX7´†ˆ›»ìòò†Òöð†ƒùX6À†ˆ›§òò†ÒöX4D†ƒˆúþŸX6´ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöX4À†ˆ¦õ·ä†‹Ø’ÍþøôüÒ̆ƒˆˆéX1܆ƒˆúþŸX3Ôƒùꆄ‚öꆄ„þöꆄ„þöꆈþöX2X†ˆ¦õ·ä†‹Ø’ÍþøôüÒX0P†ƒˆúþŸX1ЃùꆈþöX0̆ˆ¦õ·ä†‹Ø’ÍþøôüÒX(Ø„X0DƒX(䃚øX/ÔþŽþþX)X/ÀX(þþŸX/°ƒùX+P„X,<—üX-:–ðX/<X.|ÐèX->û¦X,L¦õµ‹ˆéð†üð†üÎþX+\ˆ¦õX,(ì†ì†ì†ÊþøX* †ˆ¦õ§ì†ëßþøX)D„X)숦õ§‹á†ÊþX)Pˆ¦õ™‹X)\þøôüÚÞ“õþþøX(†·þ΄ü”„þò„þè÷Ćƒˆˆ‘‹ÍX"°†ˆ›X#è‹úþŸX'„ƒùꆄ‚öꆄ‚öX%x†„„‘úþŸX'ƒùꆄ‚öꆆöX%ð†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆆöX$X†ˆ¦õ·ä†‹Ø’ÍþøôüÂòòòòòò†Òöð†ƒùò†ƒùXІƒˆúþŸX"pƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöXL†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒùΆƒŒü˜þò„þçð†ƒùʆˆþööƒùX€†ƒŽüX–þò„þò„þò„þò„þò„þò„þò„þò„þò„þåX|†ƒˆúþŸXtƒùꆄ„þöꆄ„þöꆄ„þöꆈþöXø†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñXˆ†ƒŽúþŸXDƒùꆄ‚öꆄ‚öꆆöXð†ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñ膃ˆñ膃ˆñX€†ˆ›„ßöð†ƒùXŒ†ˆ›»ì†ì†ì†ÒöXІˆ›­ì†ì†Òöö†üð†ƒùX†ˆ›Ÿì†ÒöXTˆ›™†ì†Òö؆“õþþøè†ƒˆñX0†ˆ›‹†Òöò†ƒùXx†ˆ›ŸìØöX †ˆ›»ì†ì†ì†ÒöXȆˆ›»ì†ì†ì†ÒöX †ˆ›­ìò†ÒöX ü†ˆ›Xüì†ì†ì†ìò†ÒöX \†ˆ›‹†ÒöX „†ˆ›»ìòò†ÒöX 䆈›ŸìØöð†üX D†ˆ›‘ÒöX P†ˆ›X 4ìò†ì†ì†Òööƒùð†ƒùX $†ˆ›µòòò†ÒöXø†ƒˆúþŸX ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöXt†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùX8†ƒúþŸXЃùꆄ‚öꆆöX¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚXІƒŽúþŸX,ƒùꆄ‚öꆄ‚öà†„„þöà†„„þöꆄ‚öꆆöX8†ˆ¦õ·ä†‹Ø’ÍþøôüÜWþІƒŽúþŸXăùꆄ‚öꆄ„þöX†ˆ‘úþŸX\ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öↈ‰õöX€†ˆ¦õ·ä†‹Ø’ÍþøôüÞöWÿ8†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üö†üWþ†ˆ›Ÿì†ÒöWý†ˆ›Wþì†ìò†ì†ÒöWüD†ˆ›»ì†ì†ì†Òöò†ƒùWû˜Wüþò„þò„þò„þæ„üò÷膃ˆñWùl†ˆ›‘‹úþŸWûTƒùꆆöWúP†ˆ¦õ·ä†‹Ø’ÍþøôüWù„öʆˆþöð†ƒùWøH†ˆ›ŸìØöWôø†ƒŽúþŸWø<ƒùꆄ‚öò†ƒùWö0†ˆ‘úþŸW÷äƒùꆄ‚öↈ‰õöWö¨†ˆ¦õ·ä†‹Ø’ÍþøôüþàöWõ`†ˆ¦õ·ä†‹Ø’ÍþøôüÜWó|†ƒúþŸWôìƒùꆈþöWó膈¦õ·ä†‹Ø’ÍþøôüÚ脌ƒóƒùWòx†ˆ›»ì†ì†ì†Òö脌ƒóƒùWð€†ƒúþŸWò@ƒùꆄ„þöꆄ„þöꆈþöWð솈¦õ·ä†‹Ø’ÍþøôüÚöƒùð†ƒùWï8†ˆ›Wð8ìò†ì†ìòØöWîD†ˆ›µ†ìòò†ÒöWí4†ˆ›Wî òòò†ì†Òöð†ƒù膃ˆñW騆ƒˆˆWìÜì†ìWê †‹úþŸW쌃ùꆄ‚öꆄ‚öꆄ‚öↄ„‰õöꆄ‚öꆄ‚öꆈþöWꈆˆ¦õ·ä†‹Ø’Íþøôü†Øð†ƒùWèІˆ›­ì†ì†ÒöW憃úþŸWèăùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöW怆ˆ¦õ·ä†‹Ø’ÍþøôüÚWå †ˆ›Wæì†ì†ì†ì†ÒöWäH†ˆ›»ì†ì†ì†Òöò†ƒùWㆈ›Ÿì†ÒöW⸆ˆ›»ìòò†ÒöWâ$ˆ›Ÿì†ÒöWáx†ˆ›Ÿì†Òöò†ƒùð†ƒùWàÀ†ˆ›‘Òöò†ƒùWß솈›™ò†ÒöWÞ@†ˆ›»‹ˆWßÜì†ì†ì†ìò†È†ìò†ÒöWÝ„†ˆ›­ì†ì†ÒöWÛ¸†ƒúþŸWÝxƒùꆄ‚öꆄ„þöꆆöWÜ$†ˆ¦õ·ä†‹Ø’ÍþøôüÚWÚà†ˆ›»ì†ì†ì†Òö؆ˆþöWÙ †ˆ›WÚ„ì†ìòò†ÒöWØÈ†ˆ›»ìò†ì†ÒöW×ð†ˆ›»ì†ì†ì†ÒöΆƒŒü˜þò„þçWÖœ†ˆ›µ†ì†ì†ì†ÒöWÓˆ†ˆ›WÖ|‹WÔD†‹úþŸWÖdƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöWÔÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÂòò†Òöˆ›‘ÒöWÒd†ˆ›‹†ÒöWÏ膃ˆúþŸWÒXƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöWÐd†ˆ¦õ·ä†‹Ø’ÍþøôüÒWÎ4†ƒˆúþŸWÏ܃ùꆄ‚öꆆöWΰ†ˆ¦õ·ä†‹Ø’ÍþøôüÒW̆ƒúþŸWÎ(ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆆöWÌ„†ˆ¦õ·ä†‹Ø’ÍþøôüÚWÄä„WÌ ƒWÄðƒšøWËœþŽþþWÅWˈWÅ þŸWËxƒùWÊh†ˆ¦õWË\ì†ìò†ì†ÊþøWÉ,†ˆ¦õWÊXì†ìò†ìò†ì†ÊþøWÈ †ˆ¦õWÉì†ìòò†ì†ÊþøWÇ\†ˆ¦õ§ì†ÊþøWƬ†ˆ¦õ§ì†ëßþøWÅP„WÅøˆ¦õ§‹á†ÊþWÅ\ˆ¦õ™‹WÅhþøôüÚò†ƒùö†üЈþöð†üö†üWÃP†ˆ›»ìò†ì†Òöð†ƒùð†ƒùð†üö†üð†ƒùð†ƒùò†ƒùWÁˆ“ ½üWÁ˜þöWÀÀ†ˆ›™†ì†ÒöW¿4†ƒˆúþŸWÀ´ƒùꆈþöW¿°†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üW½€†ƒúþŸW¿ƒùꆄ‚öꆆöW½ì†ˆ¦õ·ä†‹Ø’ÍþøôüÚW¼à†ˆ›Ÿì†ÒöW¼@†ˆ›Ÿì†óßöð†ƒùð†ƒùW»L†ˆ›­ì†ì†óßö؆ˆþöWº|†ˆ›‘ÒöW¹ø†ˆ›‘ÒöW¹X†ˆ›‹†Òöò†ƒùW¸¬ˆ›Ÿì†Òöð†ƒùW³8†ˆ›W¶Œ‹úþŸW¸xƒùꆄ‚öꆄ‚öꆄ‚öꆆöW¶ü†ˆ¦õ·ä†‹Ø’ÍþøôüW´,†‹úþŸW¶tƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöW´¨†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìòòØöW®Ð„W³,ƒW®ÜƒšøW²¼þŽþþW®úW²¨W®öþŸW²˜ƒùW±Ü†ˆ¦õ§ì†ÊþøW±H†ˆ¦õ™ÊþøW°˜†ˆ¦õ§ì†ëßþøW¯<„W¯äˆ¦õ§‹á†ÊþW¯Hˆ¦õ™‹W¯TþøôüÚØ†ˆþöW­ä†ˆ›‹†ÒöW­@„W­ØƒW­LƒšðþŸŒƒùôüÚ脌ƒóƒùW¬<†ˆ›»ì†ì†ì†ÒöW«d†ˆ›»ì†ì†ì†Òöò†ƒùWªt†ˆ›»ì†ì†ì†ÒöW©Äˆ›™†ìùßöW©†ˆ›Ÿì†ÒöW¨$†ˆ›µò†ì†ì†ÒöW¦˜†ƒˆúþŸW¨ƒùꆈþöW§†ˆ¦õ·ä†‹Ø’ÍþøôüÒW¢è†ƒŽúþŸW¦Œƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöW¤ †ˆ‰úþŸW¥Ôƒùꆄ„þöꆆöW¤¨†ˆ¦õ·ä†‹Ø’ÍþøôüÖöW£P†ˆ¦õ·ä†‹Ø’ÍþøôüÜW Ì†ƒúþŸW¢Üƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöW¡8†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üWŸÈ†ˆ›W ¬ì†ì†ì†ì†ÒöWžð†ˆ›»ì†ì†ì†ÒöWžP†ˆ›Ÿì†ÒöW„ˆ›»ìòò†óßöWœ„†ˆ›µ†ì†ì†ì†Òöð†ƒùWšœ†ƒúþŸWœ\ƒùꆄ‚öꆄ„þöꆈþöW›†ˆ¦õ·ä†‹Ø’ÍþøôüÚW”ü†ƒúþŸWšƒùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöW•h†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùò†ƒùW”(†ˆ›Ÿì†ÒöʆˆþöW“ †ˆ›‹†ÒöW’H†ˆ›§†ìò†Òö脌ƒóƒùW‘D†ˆ›»ì†ì†ì†Òöð†ƒùăˆˆ‹†ØW솈›™ò†ÒöW†ˆ›»ì†ì†ì†ÒöWŽ †ˆ›Wì†ì†ì†ì†ÒöW‹†ƒˆúþŸWŽƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöWŒ †ˆ¦õ·ä†‹Ø’ÍþøôüÒWЏ†ˆ›»ìòò†ÒöW‰à†ˆ›»ì†ì†ì†ÒöW‰0†ˆ›Ÿ‹á†Òöð†ƒùWˆ<†ˆ›»ìò†ì†ÒöW‡€†ˆ›­ìò†ÒöW†Œ†ˆ›W‡pìò†ìò†ÒöüüW„´†ƒŽúþŸW†pƒùꆄ‚öꆄ‚öꆆöW…†ˆ¦õ·ä†‹Ø’ÍþøôüÜW„0†ˆ›‘Òö膃ˆñð†ƒùWƒH†ˆ›‹†ÒöW‚¨†ˆ›Ÿì†óßöò†ƒùW€Ü†ƒˆúþŸW‚„ƒùꆄ„þöꆆöWX†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùW|¬†ƒˆˆ­‹úþŸW€´ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöW}¨†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†Øè„Œƒóƒù؆ˆþöW{\†ˆ›»ì†ì†ì†Òöð†ƒùWyl†ˆ›W{0ì†ì†ì†ì†ì†ìòòòò†ì†ì†óßöWx¼ˆ›™†ìùßö膃ˆñWw†ˆ›Wxtìò†ìò†ÒöWuȆƒŽúþŸWw„ƒùꆄ‚öꆄ‚öꆈþöWv0†ˆ¦õ·ä†‹Ø’ÍþøôüÜWtð†ˆ›»ì†ìò†Òöö†üWt\†ˆ›‘Òö؆ˆþöWs`†ˆ›§ä†‹ÇöWrˆ†ˆ›»ìòò†ÒöWq̆ˆ›™†ì†Òöˆ›‘ÒöʆˆŸßöWp†ˆ›»ì†ì†ì†Òö膃ˆñð†ƒùWo †ˆ›Ÿì†Òöö†üWnŒ†ˆ›‘ÒöWm´†ˆ›»ì†ì†ì†ÒöWl܆ˆ›»ì†ì†ì†ÒöWi܈›‘‹úþŸWlЃùꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþöWj´†ˆ¦õ·ä†‹Ø’ÍþøôüWièöʆˆþöWhȆˆ›ŸìùßöWg¸†ˆ›Wh¸ì†ìò†ìò†ÒöW_<„Wg¬ƒW_HƒšøWg<þŽþþW_fWg(W_bþŸWgƒùWd<†ˆ¦õWfÔWdІ‹úþŸWfȃùꆄ‚öꆄ„þöꆄ„þöꆈþöWeL†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøWc¨†ˆ¦õ™ÊþøWc†ˆ¦õ™ÊþøWbd†ˆ¦õ§ì†ÊþøWa´†ˆ¦õ§ì†ÊþøWa†ˆ¦õ§ì†ëßþøW_¨„W`Pˆ¦õ§‹á†ÊþW_´ˆ¦õ™‹W_ÀþøôüÚW^d†ˆ›»ì†ì†ì†ÒöW]Œ†ˆ›»ì†ì†ì†ÒöW\´†ˆ›»ì†ì†ì†Òöð†ƒùW[À†ˆ›»ìòò†Òöˆ›‘ÒöWZœ†ˆ›Ÿì†ÒöWYT†ˆ›WZŒì†ì†ì†ì†ì†ìò†Òö膃ˆñ膃ˆñWX@†ˆ›™†ì†Òöð†ƒùWWL†ˆ›»ì†ì†ì†Òöð†ƒùWV†ˆ›ŸìØööƒùʆˆŸßöð†ƒùWT<†ƒˆúþŸWUäƒùꆄ„þöꆆöWT¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒʆˆþöWR†ˆ›WSÄì†ì†ì†ì†ì†ì†ì†ì†ì†ì†ì†Òöò†ƒùWPP†ƒˆúþŸWQøƒùꆄ„þöꆈþöWP̆ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùWO˜†ˆ›ŸìØöWJ†ˆ›WOˆWJø†‹šøWOþŽþþWK2WNüWK.þŸWNìƒùWN0†ˆ¦õ§ì†ÊþøWM€†ˆ¦õ§ì†ÊþøWLІˆ¦õ§ì†ëßþøWKt„WLˆ¦õ§‹á†ÊþWK€ˆ¦õ™‹WKŒþøôüWJ¨ö؆ˆþöWI¤†ˆ›Ÿì†Òöö†üöƒùð†ƒùWH؆ˆ›‘ÒöWG䆈›µòòò†ÒöWG(†ˆ›­ì†ìØöð†ƒù؆ˆþöWE膈›»ì†ì†ì†ÒöWE,†ˆ›­ì†ì†Òö؆ˆþöWA“ WBÜøüøüøWC(þ–’WB”øüWAð¸WA þöW=†ˆ›­‹úþŸWAxƒù䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öꆆöW>¬†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöò†ƒùW<؆ˆ›Ÿì†Òöð†ƒù膃ˆñW9ˆ†ƒˆˆW<€W9І‹úþŸWh„„‘úþŸVBƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öV?̆„„‘úþŸVAH„‚öꆆöV@D†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöV>Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÞöV<\†„„‘úþŸV>Pƒùꆄ„þöꆄ‚öꆄ‚öꆆöV<Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÞöV:Ô†„„‘úþŸVd†ƒŽúþŸU@Hƒùꆄ‚öꆄ‚öꆄ„þöꆈþöU>̆ˆ¦õ·ä†‹Ø’ÍþøôüÜU=Œ†ˆ›»ì†ì†ì†ÒöU<솈›Ÿì†ÒöUt†ˆ›‹†ÒöT=¤†T>fþò„þò„þ„ü „þò„þò„þè÷T8¸†ˆ›T=”T9 †‹šøT=þŽþþT9ZT=T9VþŸT<øƒùT<<†ˆ¦õ§ì†ÊþøT;¨†ˆ¦õ™ÊþøT:ø†ˆ¦õ§ì†ëßþøT9œ„T:Dˆ¦õ§‹á†ÊþT9¨ˆ¦õ™‹T9´þøôüT8ÐöT7à†ˆ›»ì†ì†ì†ÒöT7\†ˆ›‘Òöð†ƒùT6h†ˆ›»ì†ì†ì†ÒöT5䆈›‘ÒöT2ÔƒˆúþŸT5؃ùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöT3D†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùT1ð†ˆ›™†ì†Òöð†üT0 †ƒˆúþŸT1ȃùꆄ‚öꆆöT0œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒT/,†ˆ›T0ìòòò†óßö؆ˆþöT.\†ˆ›‘Òöö†üT- †ˆ›T.<ì†ìòòòò†ÒöT*؃ˆúþŸT-ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöT+H†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùT)ø†ƒˆˆ§†ì†ì†ØT(D†ƒˆúþŸT)ìƒùꆄ‚öꆆöT(À†ˆ¦õ·ä†‹Ø’ÍþøôüÒT'l†ˆ›§†ìòØöT&̆ˆ›‹†ÒöT#$†ƒŽúþŸT&Àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöT#Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÜ膃ˆñT ¤†ƒŽúþŸT"ìƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöT! †ˆ¦õ·ä†‹Ø’ÍþøôüÜT̆ˆ›»ì†ì†ì†Òö؆ˆþöT8†ˆ›Tpì†ì†ì†ìòò†ì†Òöð†üTÔ†ˆ›T ìò†ì†ìò†ìò†ÒöT$ˆ›™ò†Òöð†ƒùð†ƒùTŒ†ƒˆúþŸTÔƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöT†ˆ¦õ·ä†‹Ø’ÍþøôüÒT´†ˆ›»ì†ì†ì†óßöT†ƒŽúþŸT¨ƒùꆄ„þöꆆöT|†ˆ¦õ·ä†‹Ø’ÍþøôüÜTp†ƒúþŸTƒùꆄ‚öꆈþöT܆ˆ¦õ·ä†‹Ø’ÍþøôüÚTP†ˆ›Ÿ‹ˆ­ì†ì†È†Òöð†ƒùT°†ˆ›‘ÒöT\†ˆ›T T†‹úþŸTˆƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆆöT”†ˆ¦õ·ä†‹Ø’Íþøôü†ìò†ÒöT䆃ŽúþŸTPƒùꆆöTL†ˆ¦õ·ä†‹Ø’ÍþøôüÜØ†ˆþöT À†ˆ›»ì†ì†ì†ÒöT †ˆ›Ÿì†Òö膃ˆñTüƒúþŸT èƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöT\†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒù膃ˆñT솈›™ò†Òöð†ƒùò†ƒùT4†ˆ›‘Òöð†ƒùT(†ƒŽúþŸT ƒùꆄ‚öꆄ‚öꆄ‚öꆆöT†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒù脌ƒóƒùT@†ˆ›Ÿì†Òö؆ˆþöT䆈›Täìò†ìòò†ÒöÞ“õþþøö†üʆˆŸßöSÿ€†ˆ›‹†ÒöSþü†ˆ›‘Òöö†üð†ƒù؆ˆþöSý¬†ˆ›»ì†ì†ì†Òöð†ƒùöƒùSüð†ˆ›‘Òöð†ƒùð†ƒùSú܆ƒˆúþŸSü¬ƒùꆄ‚öꆄ‚öꆆöSûX†ˆ¦õ·ä†‹Ø’ÍþøôüÒSú †ˆ›­ìò†ÒöSøX†ƒŽúþŸSúƒùꆄ„þöꆄ„þöꆈþöSøÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùS÷„†ˆ›­ì†ì†óßöSöȆˆ›­ì†ì†ÒöSõð†ˆ›»ì†ì†ì†ÒöSó †ˆ›Sõàì†ìSóÀ†‹úþŸSõƒùꆄ„þöꆄ„þöꆈþöSô<†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÒöÞ“õþþøS𨆃ˆúþŸSòȃùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSñ$†ˆ¦õ·ä†‹Ø’ÍþøôüÒSï솈›­ìò†Òöð†üSî4†ƒˆˆúþŸSïăùꆆöSîÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÊSíh†ˆ›™†‹á†ÒöSìX†ˆ›Sí0†ì†ìòòØöò†ƒùö†üò†ƒùSë@†ˆ›»ì†ì†ì†Òö脌ƒóƒùSêt†ˆ›ŸìØöò†ƒùð†ƒùöƒùSèÔ†ƒŒüSêþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þçSèP†ˆ›ãöð†ƒùSä´†ˆ›™†‹úþŸSè ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSå´†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöSä0†ˆ›‘ÒöSㆈ›‹†ÒöSâÔ†ˆ›™†ì†Òöö†üSÜ膃ŽúþŸS⸃ùꆄ‚öò†ƒùSÞ †ˆ‘úþŸSâ`ƒùꆄ‚öSßh†ˆ‰úþŸSâ ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöSßð†ˆ¦õ·ä†‹Ø’ÍþøôüÖöSÞ˜†ˆ¦õ·ä†‹Ø’ÍþøôüþàöSÝP†ˆ¦õ·ä†‹Ø’ÍþøôüÜSÜ,†ˆ›­ì†ì†ÒöSÛT†ˆ›»ì†ì†ì†ÒöSÚ´†ˆ›Ÿì†ÒöSÙ܆ˆ›»ì†ì†ì†ÒöSÙX†ˆ›‘ÒöSبˆ›™ò†Òöò†ƒùS×Ȇˆ›™†ì†ÒöS×D†ˆ›ãöSÕĆˆ›S× †ì†ìòòòòò†ì†óßöSÕ†ˆ›™†ì†ÒöSÔ†ˆ›SÔøì†ì†ì†ìØöSÑ0†ƒúþŸSÔƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSÑœ†ˆ¦õ·ä†‹Ø’ÍþøôüÚSÐX†ˆ›§†ì†ì†óßöö†üSÏ8†ˆ›SÐ8ìò†ìò†ì†ÒöSÎD†ˆ›µ†ìò†ì†Òö膃ˆñSÍ@†ˆ›»ìò†ì†Òöö†üSÉ\†ƒˆšøSÌÄþŽþþSÉ–S̰SÉ’þŸSÌ ƒùSË䆈¦õ§ì†ÊþøSË4†ˆ¦õ§ì†ëßþøSÉØ„SÊ€ˆ¦õ§‹á†ÊþSÉ䈦õ™‹SÉðþøôüÒSÈ„†ˆ›»ì†ì†ì†Òö؆ˆþöSÁ܆ƒúþŸSÈ,ƒùꆄ„þöSÃh†„„‰úþŸSÇìƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆈþöSÃð†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆈþöSÂH†ˆ¦õ·ä†‹Ø’ÍþøôüÚSÀ`†ƒúþŸSÁЃùꆈþöSÀ̆ˆ¦õ·ä†‹Ø’ÍþøôüÚÞ“õþþøS¿X†ˆ›™†ì†Òöð†ƒùS¼ †ƒˆúþŸS¿0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆆöS¼œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒS»€†ˆ›Ÿì†Òö̆ƒˆˆ‘Øò†ƒùSºd†ˆ›‹ØöS³€†ƒˆúþŸSºXƒùꆄ„þöSµü†„„‰ˆSºì†S¶P†‹úþŸS¹àƒùꆄ‚öꆄ„þöꆄ„þöS·œ†ˆ‰úþŸS¹Pƒùꆄ‚öꆈþöS¸$†ˆ¦õ·ä†‹Ø’ÍþøôüÖöS¶Ì†ˆ¦õ·ä†‹Ø’ÍþøôüS¶öꆄ„þöS´ô†„„‰ˆSµÄì†ì†ì†ì†ÜöꆈþöS³ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒS±T†ƒˆúþŸS³tƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆈþöS±Ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒS¯8†ƒúþŸS±Hƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöS¯¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚS®P†S¯*þò„þò„þS®b„ü¬„þò„þò„þò„þè÷؆ˆþö؆ˆþöS« †ˆ›»‹úþŸS­¬ƒùꆄ„þöꆄ„þöꆆöS¬X†ˆ¦õ·ä†‹Ø’Íþøôü†ìò†ÒöSª€†ˆ›Ÿì†ÒöS©à†ˆ›Ÿì†Òöö†üS¨Ü†ˆ›S©Àì†ìòò†Òöˆ›ãöS§œ†ˆ›™†ì†Òöð†üò†ƒùS¦¬†ˆ›™†ì†ÒöS¥¸†ˆ›S¦œì†ì†ì†ì†ÒöS¢,†ƒˆúþŸS¥¬ƒùꆄ„þöꆄ‚öS£x†ˆ‘úþŸS¥Dƒùꆄ‚öꆄ„þöꆆöS£ð†ˆ¦õ·ä†‹Ø’ÍþøôüÞöS¢¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒS¡p†ˆ›™ò†Òöð†ƒùS ´†ˆ›Ÿì†ÒöS  †ƒˆ»ì†ì†ì†àS–ì„S ƒS–øƒšøSŸþŽþþS—SŸ|S—þŸSŸlƒùSž$†ˆ¦õSŸPìò†ìò†ì†ì†ÊþøSœè†ˆ¦õSžìò†ìò†ì†ì†ÊþøS›¬†ˆ¦õSœ°†ìò†ì†ì†ì†ÊþøSšÄ†ˆ¦õS›œì†ì†ì†ÊþøSš†ˆ¦õ§ì†ÊþøS™d†ˆ¦õ“†ÊþøS˜´†ˆ¦õ§ì†ëßþøS—X„S˜ˆ¦õ§‹á†ÊþS—dˆ¦õ™‹S—pþøôüÚS–h†ˆ›‘ÒöS•†ˆ›»ì†ì†ì†ÒöSŽ4†ˆ›S•€ì†ì†ì†ì†SŽœ†‹šøS”˜þŽþþSŽÖS”„SŽÒþŸS”tƒùS“d†ˆ¦õ½†ì†ì†ì†ÊþøS’D†ˆ¦õS“Tì†ì†ì†ì†ì†ÊþøS‘$†ˆ¦õS’4ì†ì†ì†ì†ì†ÊþøSt†ˆ¦õ§ì†ëßþøS„SÀˆ¦õ§‹á†ÊþS$ˆ¦õ™‹S0þøôüSŽLöSx†ˆ›­ì†ì†ÒöüüS‹È†ƒŽúþŸS\ƒùꆄ„þöꆈþöSŒ0†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùSˆD†ƒŽúþŸS‹¤ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöSˆ¬†ˆ¦õ·ä†‹Ø’ÍþøôüÜS†P†ˆ›Sˆ4S†ªŠúþŸSˆƒùꆆöS‡†ˆ¦õ·ä†‹Ø’ÍþøôüS†höS…˜†ƒˆˆ§†ì†ì†ØS„À†ˆ›§†ìòØöS„ †ˆ›‹†Òö膃ˆñS †ƒˆúþŸSƒèƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöS‚†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùö†üS€,†ˆ›Sdìò†ì†ìò†ìò†ÒöS˜ˆ›Ÿì†ÒöS†ˆ›‘ÒöS|ð†ƒˆúþŸS~üƒùꆄ„þöꆄ„þöꆄ‚öà†ˆþöS}l†ˆ¦õ·ä†‹Ø’ÍþøôüÒS{†ƒˆúþŸS|äƒùꆄ‚öꆄ„þöꆈþöS{†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùSx€†ƒˆúþŸSzðƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöSxü†ˆ¦õ·ä†‹Ø’ÍþøôüÒò†ƒùSv †ƒŽúþŸSx\ƒùꆄ„þöꆄ„þöꆈþöSw†ˆ¦õ·ä†‹Ø’ÍþøôüÜStü†ƒúþŸSv”ƒùꆄ‚öꆈþöSuh†ˆ¦õ·ä†‹Ø’ÍþøôüÚSs€†ƒúþŸStðƒùꆈþöSs솈¦õ·ä†‹Ø’ÍþøôüÚð†ƒùSrà†ˆ›‘ÒööüSr@†ˆ›‘ÒöSqh†ˆ›»ì†ì†ì†óßöò†ƒùSo„†ƒúþŸSqDƒùꆄ„þöꆄ„þöꆈþöSoð†ˆ¦õ·ä†‹Ø’ÍþøôüÚSe †ƒúþŸSoxƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öSgL†„„‰ˆúþŸSn ƒùꆄ‚öꆄ„þöꆄ‚öSh܆„„‰úþŸSmƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öSj„†„„‰úþŸSlˆƒùꆄ„þöꆄ„þöꆄ‚öꆈþöSk †ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆈþöSid†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöSg䆈¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆆöSeŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÚ膃ˆñS_ô†ˆ›Sdäì†ì†ì†S`\†‹šøSdþŽþþS`–SdS`’þŸScôƒùSb䆈¦õScØì†ì†ì†ì†ÊþøSb4†ˆ¦õ§ì†ëßþøS`Ø„Sa€ˆ¦õ§‹á†ÊþS`䈦õ™‹S`ðþøôüS` öS^$ƒˆúþŸS_èƒùꆄ„þöꆄ‚öꆆöS^”†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñS]l†ƒˆˆ‹†Øò†ƒùS[(†ƒˆúþŸS]Hƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆆöS[¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñSY4†ƒŽúþŸSZðƒùꆄ‚öꆄ„þöꆆöSYœ†ˆ¦õ·ä†‹Ø’ÍþøôüÜSX°†ˆ›‘ÒöSXˆ›™†ì†Òöò†ƒùSWX†ˆ›‘ÒöSU†ƒúþŸSWLƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöSU€†ˆ¦õ·ä†‹Ø’ÍþøôüÚST†ˆ›‘ÒöSRP†ƒˆúþŸST„ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöSR̆ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùSQ°†ˆ›ãöSK܆ƒˆúþŸSQ¤ƒùꆄ‚öSM(†ˆ‰úþŸSQdƒùꆄ‚öSOp†„„‰úþŸSQ$ƒùꆄ„þöꆈþöSOø†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöSM°†ˆ¦õ·ä†‹Ø’ÍþøôüÖöSLX†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñSJô†ˆ›­ì†ì†ÒöSJ8†ˆ›­ì†ì†ÒöSI †ˆ›SJ(ì†ìò†ìòò†Òöüüö†üð†ƒùSH0†ˆ›Ÿì†óßöSE´†ƒˆúþŸSH$ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöSF0†ˆ¦õ·ä†‹Ø’ÍþøôüÒSE†ˆ›Ÿì†ÒöSDX†ˆ›­ìòØöS?†ƒˆúþŸSDLƒùꆄ‚öò†ƒùS@T†ˆ‘úþŸSCôƒùꆄ‚öSAĆ„„‰úþŸSC´ƒùꆄ‚öꆄ‚öà†ˆþöSBL†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöS@̆ˆ¦õ·ä†‹Ø’ÍþøôüþàöS?„†ˆ¦õ·ä†‹Ø’ÍþøôüÒS>†ˆ›S>øì†ì†ì†ìØöS=<†ˆ›»ì†ì†ì†Òö脌ƒóƒùSR®tR«:þŸR®dƒùR­Œ†ˆ¦õµì†ì†ÊþøR¬Ü†ˆ¦õ§ì†ëßþøR«€„R¬(ˆ¦õ§‹á†ÊþR«Œˆ¦õ™‹R«˜þøôü†ì†ì†ÊþøR©l†ˆ¦õµì†ì†ÊþøR¨¼†ˆ¦õ§ì†ëßþøR§`„R¨ˆ¦õ§‹á†ÊþR§lˆ¦õ™‹R§xþøôüR¦”öR¥¤†ˆ›»ì†ì†ì†Òöð†ƒùR h†ˆ›R¥xì†ìR¡†‹úþŸR¥(ƒùꆄ„þöꆄ„þöR¢T†ˆ‘úþŸR¤Àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöR¢Ì†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR¡„†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÒöRŸÈ†ˆ›Ÿì†ÒöRƒˆˆ­‹úþŸRŸ¼ƒùꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöRð†ˆ¦õ·ä†‹Ø’ÍþøôüÂ†ì†Øè†ƒˆñR•†ƒŽúþŸRœ¼ƒùꆄ‚öꆄ„þöR–<†ˆ‘úþŸRœTƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöR–´†ˆ¦õ·ä†‹Ø’ÍþøôüÞöR•l†ˆ¦õ·ä†‹Ø’ÍþøôüÜR“`†ƒúþŸR”øƒùꆄ„þöꆈþöR“̆ˆ¦õ·ä†‹Ø’ÍþøôüÚR’ˆ†ˆ›»ì†ì†ì†óßöR‘h†ˆ›Ÿ‹ˆ­ì†ì†È†ÒöRŽØ†ƒˆúþŸR‘\ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöRT†ˆ¦õ·ä†‹Ø’ÍþøôüÒRŽT†ˆ›‘ÒöR´†ˆ›Ÿì†ÒöR†R¦þò„þò„þÚ„üˆ„þè÷Rˆ¼†ƒúþŸRƒùꆄ‚öꆄ‚öR‰ø†ˆ‰’úþŸRŒ ƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöRŠ„†ˆ¦õ·ä†‹Ø’ÍþøôüÔöR‰(†ˆ¦õ·ä†‹Ø’ÍþøôüÚRˆ†ˆ›™ò†Òö؆ˆþöR†”†ˆ›R‡¤ì†ì†ìòꆋÇöRz¼†ˆ›R†\†ìR{$†‹šøR…ÔþŽþþR{^R…ÀR{ZþŸR…°ƒùR„ô†ˆ¦õ§ì†ÊþøR„4†ˆ¦õ§‹á†ÊþøRƒL†ˆ¦õ¯†ì†ì†ÊþøR‚H†ˆ¦õ½†ì†ì†ì†ÊþøR€Ô†ˆ¦õR‚òò†ìò†ìò†ì†ÊþøR|†ˆ¦õR€œò†ì†ì†ì†ì†ì†ÊþøR~”†ˆ¦õ¯†ìò†ÊþøR}¬†ˆ¦õ¯†ìò†ÊþøR|ü†ˆ¦õ§ì†ëßþøR{ „R|Hˆ¦õ§‹á†ÊþR{¬ˆ¦õ™‹R{¸þøôüRzÔöRz†ˆ›‹†ÒöRy(†ˆ›µ†ìòò†ÒöÞ“õþþøRxX†ˆ›‘óßöð†ƒùò†ƒùRv†ƒúþŸRxƒùꆄ„þöꆄ„þöꆄ‚öà†ˆ‰õöRvˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùRtL†ƒúþŸRuøƒùꆄ‚öà†ˆþöRt¸†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üRsœ†ˆ›Ÿì†ÒöRrœ†RsŽþò„þò„þò„þò„þò„þò„þò„þæ„üò÷ð†üRqp†ˆ›Rrpìò†ìòò†ÒöRpƒŽúþŸRqdƒùꆆöRp`†ˆ¦õ·ä†‹Ø’ÍþøôüÜRlĆƒúþŸRoìƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöRm0†ˆ¦õ·ä†‹Ø’ÍþøôüÚRkð†ƒˆˆRl´ì†ìò†ì†ØÊ†ˆŸßöRj°†ˆ›§†ì†ì†ÒöRiȆˆ›»‹áò†ì†ÒöRhð†ˆ›»ì†ìò†Òöò†ƒùRh†ˆ›»ì†ì†ì†ÒöRg`†ˆ›ŸìØöR^ “¼R_àŠ˜þ˜Rf؈’Rft‚ˆ’R`Tü–Ra’Rb Rf(’Rb˜øüøüøüøüøüøüøüRa<RaÔööRaþR`p—ˆ‹R_ØR_8R_¼öR^°›‹ØöR^†ˆ›‘Òö憃ˆñR\ø†ˆ›»‹áòò†ÒöRY|†ƒúþŸR\ìƒùꆄ„þöꆄ‚öRZ¸†ˆ‘úþŸR\„ƒùꆄ‚öꆄ‚öꆆöR[0†ˆ¦õ·ä†‹Ø’ÍþøôüÞöRY膈¦õ·ä†‹Ø’ÍþøôüÚRV8†ˆ›™†‹úþŸRYTƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöRW8†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†ƒùRT|†ƒŽúþŸRVƒùꆄ‚öꆈþöRT䆈¦õ·ä†‹Ø’ÍþøôüÜRQ˜†ƒúþŸRTpƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öRS$†„„ü°þò„þò„þò„þéöꆄ„þöꆈþöRR†ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üÒ†Ÿþæ„üò÷ʆˆþöRBô†ˆ›RP¸RC\†‹šøRP@þŽþþRC–RP,RC’þŸRPƒùRNð†ˆ¦õRPì†ì†ì†ì†ì†ÊþøRN$†ˆ¦õµì†ì†ÊþøRMX†ˆ¦õµì†ì†ÊþøRL¨†ˆ¦õ§ì†ÊþøRKø†ˆ¦õ§ì†ÊþøRKd†ˆ¦õ™ÊþøRJ´†ˆ¦õ§ì†ÊþøRJ†ˆ¦õ§ì†ÊþøRIT†ˆ¦õ§ì†ÊþøRH¤†ˆ¦õ§ì†ÊþøRGô†ˆ¦õ§ì†ÊþøRGD†ˆ¦õ§ì†ÊþøRF”†ˆ¦õ§ì†ÊþøRE䆈¦õ§ì†ÊþøRE4†ˆ¦õ§ì†ëßþøRCØ„RD€ˆ¦õ§‹á†ÊþRC䈦õ™‹RCðþøôüRC öö†üò†ƒùRB8ˆ›Ÿì†ÒöR@䆈›RAôòòòò†ì†ì†óßöR>€†ƒˆúþŸR@È„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöR>ü†ˆ¦õ·ä†‹Ø’ÍþøôüÒR=Ćˆ›­ì†ì†ÒöR;4†ƒˆúþŸR=¸ƒùꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öà†ˆþöR;°†ˆ¦õ·ä†‹Ø’ÍþøôüÒR:x†ˆ›­ì†ì†ÒöR7Ô†ƒŽúþŸR:lƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöR8<†ˆ¦õ·ä†‹Ø’ÍþøôüÜR6Ćˆ›R7Äì†ì†ì†ì†ì†ÒöR3à†ƒúþŸR6¸ƒùꆄ‚öꆄ‚öꆄ„þöR5D†„„‰ˆR6$ì†ì†ì†ä†‹ÑöꆈþöR4L†ˆ¦õ·ä†‹Ø’ÍþøôüÚR(؆ˆ›R3Ðì†ìR.8†‹úþŸR3€ƒùꆄ‚öꆄ‚öR0$†„„‰úþŸR3ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆈþöR0¬†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ„þöꆄ‚öꆈþöR.´†ˆ¦õ·ä†‹Ø’ÍþøôüR)\†‹úþŸR.,ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öR*ø†„„‰úþŸR,Ôƒùꆄ„þöꆄ‚öꆈþöR+€†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆈþöR)؆ˆ¦õ·ä†‹Ø’ÍþøôüÂØöR'4†ƒúþŸR(̃ùꆄ‚öꆈþöR' †ˆ¦õ·ä†‹Ø’ÍþøôüÚö†üð†ƒù؆ˆþöR؆ˆ›R&„†R@†‹šøR&þŽþþRzR&RvþŸR%ôƒùR%8†ˆ¦õ“†ÊþøR$ˆ†ˆ¦õ§ì†ëßþøR#¼†ˆ¦õ¡†ì†ëßþøR# †ˆ¦õ“†ÊþøR"†ˆ¦õ½†ìò†ì†ÊþøR!<†ˆ¦õ¡†ì†ëßþøR p†ˆ¦õ¡†ì†ëßþøR¤†ˆ¦õ¡ò†ÊþøR؆ˆ¦õ¡†ì†ëßþøRð†ˆ¦õ¯ò†ì†ÊþøR\†ˆ¦õ™ÊþøRȆˆ¦õ™ÊþøR†ˆ¦õ§ì†ëßþøR¼„Rdˆ¦õ§‹á†ÊþRȈ¦õ™‹RÔþøôüÉßöð†ƒùR䆈›»ì†ì†ì†ÒöR†ˆ›­‹á†ì†óßöRhˆ›™†ìùßöR|†ˆŸŠŠþŸŒƒùôüR”öRŒ†ƒŽúþŸRpƒùꆄ‚öꆄ‚öꆄ‚öꆆöRô†ˆ¦õ·ä†‹Ø’ÍþøôüÜRІˆ›­ìò†Òöò†ƒùRĆˆ›µòòò†ÒöR솈›§ò†ì†ÒöR D†ƒúþŸRàƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöR €†ˆ‘úþŸR°„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöR ø†ˆ¦õ·ä†‹Ø’ÍþøôüþàöR °†ˆ¦õ·ä†‹Ø’ÍþøôüÚR Œ†ƒúþŸR 8ƒùꆄ‚öà†ˆþöR ø†ˆ¦õ·ä†‹Ø’ÍþøôüÚR$†ˆ›R |R¨†‹úþŸR dƒùꆄ‚öà†ˆ‰õöR $†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöR0†ˆ›Rìò†ì†ìØöR †R"þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þæ„üò÷R\†ƒŽúþŸR”ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öà†ˆþöRĆˆ¦õ·ä†‹Ø’ÍþøôüÜR\†RNþò„þò„þò„þò„þò„þ΄ü”„þò„þè÷ȈŸŠÕöð†ƒùQýH†ˆ›QÿH‹úþŸR¼ƒùꆆöQÿ¸†ˆ¦õ·ä†‹Ø’ÍþøôüQý°†‹úþŸQÿ0ƒùꆆöQþ,†ˆ¦õ·ä†‹Ø’ÍþøôüÉßöð†ƒùð†ƒùö†üð†ƒùð†ƒùQûð†ˆ›»ì†ì†ì†ÒöQûP†ˆ›Ÿì†ÒöñQ÷P†ƒúþŸQûƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ÷¼†ˆ¦õ·ä†‹Ø’ÍþøôüÚQöx†ˆ›§òò†ÒöQô솃ˆúþŸQölƒùꆆöQõh†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùQó,†ƒúþŸQôăùꆄ‚öꆈþöQ󘆈¦õ·ä†‹Ø’ÍþøôüÚQò†ˆ›Qóìò†ìòò†ì†Òö؆ˆþöQ⬆ˆ›QøQñHþŽþþQî6Qñ4Qî2þŸQñ$ƒùQð„†ˆ¦õ™ÊþøQïÔ†ˆ¦õ§ì†ëßþøQîx„Qï ˆ¦õ§‹á†ÊþQ¦õ™‹Qîþøôü†ì†ìòò†ìòòQㆋšøQì°þŽþþQãNQìœQãJþŸQ쌃ùQê|†ˆ¦õQ솋ˆÙ†ä†‹á†ì†ì†ì†ìòò†ÊþøQé0†ˆ¦õQê\‹á†ì†ì†ìòò†ÊþøQè,†ˆ¦õQé ì†ìòò†ÊþøQç|†ˆ¦õ“†ÊþøQ攆ˆ¦õQçlìòò†ÊþøQ圆ˆ¦õQæt‹á†ì†ì†ÊþøQä솈¦õ§ì†ëßþøQã„Qä8ˆ¦õ§‹á†ÊþQ㜈¦õ™‹Qã¨þøôüQâÄöQâ †ˆ›Ÿì†ÒöQál†ˆ›Ÿì†ÒöQß„ˆ›Qá\QßÒŠúþŸQáDƒùꆆöQà@†ˆ¦õ·ä†‹Ø’ÍþøôüQßöQÝL†ˆ›­‹úþŸQßlƒùꆆöQÞh†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÒöQ܆ˆ›™ò†ÒöQÛœ†ˆ›QÜ€ìòòò†ÒöQÙH†ƒˆúþŸQÛƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöQÙĆˆ¦õ·ä†‹Ø’ÍþøôüÒQØÄ†ˆ›„ßöQÖÀ†ƒˆúþŸQظƒùꆄ‚öꆄ„þöꆄ‚öꆈþöQ×<†ˆ¦õ·ä†‹Ø’ÍþøôüÒQÖ†ˆ›­ì†ìØöQÔP†ƒŽúþŸQÕøƒùꆄ‚öà†ˆþöQÔ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùQÓ\†ˆ›»ì†ì†ì†ÒöQÒ„†ˆ›»ì†ì†ì†ÒöQÍX„QÒxƒQÍdƒšøQÒþŽþþQÍ‚QÑôQÍ~þŸQÑäƒùQÐÔ†ˆ¦õQÑÈìò†ì†ì†ÊþøQÏІˆ¦õQÐÄì†ì†ìò†ÊþøQÏ †ˆ¦õ§ì†ëßþøQÍÄ„QÎlˆ¦õ§‹á†ÊþQÍЈ¦õ™‹QÍÜþøôüÚQÌ€†ˆ›»ì†ì†ì†Òö؆ˆþö؆ˆþöÔˆþöQÊ܆ƒˆˆ­‹á†ì†ØQdžƒˆúþŸQÊЃùQÈœ†„„‘úþŸQʸƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöQɆˆ¦õ·ä†‹Ø’ÍþøôüÞöà†ˆþöQdžˆ¦õ·ä†‹Ø’ÍþøôüÒQʆˆ›™†‹úþŸQÆìƒùà†„„þöà†ˆþöQ؆ˆ¦õ·ä†‹Ø’Íþøôü†ÒöQÃl†ˆ›QÄ`òòòòò†óßöò†ƒùQ€†ƒˆˆµòòòÞQÁp†ˆ›QÂpì†ìòòòØöQ¿¼†ƒˆúþŸQÁdƒùꆄ‚öꆈþöQÀ8†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üQ¾Ô†ˆ›»ì†ì†ì†ÒöQ½ü†ˆ›»ì†ì†ì†ÒöQ¼4†ƒˆúþŸQ½ðƒùꆄ‚öà†ˆþöQ¼°†ˆ¦õ·ä†‹Ø’ÍþøôüÒQº´ƒˆúþŸQ¼(ƒùꆈþöQ»$†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ¸†ƒúþŸQºœƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ¸€†ˆ¦õ·ä†‹Ø’ÍþøôüÚQµÐ†ƒúþŸQ¸ƒùꆄ„þöꆄ„þöꆄ‚öà†„„‰õöà†ˆþöQ¶<†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ´ø†ˆ›»ì†ì†ì†ÒöQ´ †ˆ›»ì†ì†ì†ÒöQ³œ†ˆ›‘Òö؆ˆþöQ²°†ˆ›Ÿì†ÒöQ±ø†ƒˆˆ§òò†ØQ¯ƒŽúþŸQ±ìƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöQ¯l†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ®d†ˆ›ŸìØöð†ƒùQ¬l†ƒˆúþŸQ®<ƒùꆄ‚öꆄ„þöꆈþöQ¬è†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ«”†ˆ›»ìò†ì†ÒöQªô†ˆ›Ÿì†ÒöQ¤Œ†ˆ›‘‹šøQªˆþŽþþQ¥.QªtQ¥*þŸQªdƒùQ©¨†ˆ¦õ“†ÊþøQ¨Ü†ˆ¦õµì†ì†ÊþøQ¨†ˆ¦õ¡†ì†ÊþøQ§|†ˆ¦õ™ÊþøQ¦Ì†ˆ¦õ§ì†ëßþøQ¥p„Q¦ˆ¦õ§‹á†ÊþQ¥|ˆ¦õ™‹Q¥ˆþøôüQ¤¤öQ£ì†ˆ›Ÿì†Òö؆ˆþöQ¢ðˆ›­ìò†ÒöQ¢D†ˆ›‹†ÒöQŸð†ƒˆúþŸQ¢8ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ l†ˆ¦õ·ä†‹Ø’ÍþøôüÒQŸl†ˆ›‘ÒöQ›Ô†ˆ›QŸ4†Qœ†‹úþŸQŸ(ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆈþöQ †ˆ¦õ·ä†‹Ø’Íþøôü†ìòØöQš´†ˆ›Q›œòΆ‹ˆ‘QšÌöQ™†ƒˆúþŸQš¨ƒùꆄ‚öꆈþöQ™|†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ—$†ƒˆúþŸQ˜ôƒùꆄ‚öꆄ„þöꆈþöQ— †ˆ¦õ·ä†‹Ø’ÍþøôüÒQ–†ƒŽü°þò„þò„þò„þåð†ƒùQ•œ†ˆ›»ì†ì†ì†Òö؆ˆþöö†üò†ƒùQ“ü†ˆ›Q”ð†ìò†ìò†ì†Òöñö†ü̆ƒŽü˜þò„þåQ’؆ˆ›‘Òö؆ƒŽüŒþåQ†ˆ›Q’Tò†Q|†‹šøQ‘ÌþŽþþQ¶Q‘¸Q²þŸQ‘¨ƒùQ´†ˆ¦õQ‘Œìò†ì†ÊþøQ†ˆ¦õ“†ÊþøQT†ˆ¦õ§ì†ëßþøQø„QŽ ˆ¦õ§‹á†ÊþQŽˆ¦õ™‹QŽþøôüQ,öQˆ¬†ƒˆšøQŒ¨þŽþþQˆæQŒ”QˆâþŸQŒ„ƒùQ‹È†ˆ¦õ§ì†ÊþøQ‹4†ˆ¦õ™ÊþøQŠ„†ˆ¦õ§ì†ëßþøQ‰(„Q‰Ðˆ¦õ§‹á†ÊþQ‰4ˆ¦õ™‹Q‰@þøôüÒQ‡œ†ˆ›Qˆœìò†ìò†ì†ÒöQ†,ƒúþŸQ‡ƒùꆈþöQ†Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùQ…t†ˆ›‘‹ÇöQ„d†ˆ›Q…dìò†ìòò†ÒöQƒ¨†ˆ›™ò†ÒöQ‚´†ˆ›µòòòØöQø†ˆ›­ì†ì†ÒöQ̆ƒˆúþŸQìƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþöQ€H†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üQzô†ƒúþŸQ°ƒùꆄ‚öQ|0†ˆ‰’úþŸQpƒùQ}´†„„‘úþŸQXƒùꆄ„þöꆈþöQ~,†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöQ|¼†ˆ¦õ·ä†‹Ø’ÍþøôüÔöQ{`†ˆ¦õ·ä†‹Ø’ÍþøôüÚQwœ†ƒŽúþŸQzèƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöQx†ˆ¦õ·ä†‹Ø’ÍþøôüÜQw†ˆ›‘Òö؆ˆþö؆ˆþöQtăŽúþŸQvtƒùꆄ„þöꆄ„þöꆈþöQu †ˆ¦õ·ä†‹Ø’ÍþøôüÜQt†Qtªþò„þò„þÚ„üˆ„þè÷ð†üQr0†ƒúþŸQsðƒùꆄ„þöꆄ„þöꆆöQrœ†ˆ¦õ·ä†‹Ø’ÍþøôüÚQp†ƒˆúþŸQr$ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöQp€†ˆ¦õ·ä†‹Ø’ÍþøôüÒQmü†ƒúþŸQoøƒùꆄ‚öꆄ‚öꆄ‚öà†ˆþöQnh†ˆ¦õ·ä†‹Ø’ÍþøôüÚʆˆþöö†üQm†ˆ›‘ÒöQlD†ˆ›­ìò†ÒöƆ«þò„þæ„üò÷ð†ƒùQjà†ˆ›»ì†ì†ì†ÒöQj†ˆ›»ì†ì†ì†ÒöQih†ˆ›ŸìØöð†üQg„†ƒŽúþŸQi@ƒùꆄ‚öꆄ‚öꆆöQg솈¦õ·ä†‹Ø’ÍþøôüÜQeLƒúþŸQgxƒùꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆈþöQe¬†ˆ¦õ·ä†‹Ø’ÍþøôüÚQc „Qe“õþþØ‚“õþþØ‚“õþþØ‚“õþþØ‚“õþþÚ“õþþøð†ƒùQc†ˆ›‘ÒöQb|†ˆ›‘óßöʆˆþöö†üð†ƒùò†ƒùQ`¤†ˆ›QaÀìò†ìò†ì†ì†ÒöQX†ˆ›Q`”ìò†ìQX|†‹šøQ_ÈþŽþþQX¶Q_´QX²þŸQ_¤ƒùQ\Ô†ˆ¦õQ]È‹úþŸQ_Œƒùꆄ„þöꆄ„þöꆆöQ^8†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìò†ÊþøQ[솈¦õ¯ò†ì†ÊþøQ[†ˆ¦õ¯ò†ì†ÊþøQZT†ˆ¦õ§ì†ëßþøQXø„QY ˆ¦õ§‹á†ÊþQYˆ¦õ™‹QYþøôüQX,öQQ´†ˆ›QXì†QR†‹šøQWpþŽþþQRVQW\QRRþŸQWLƒùQVX†ˆ¦õQW0ì†ì†ì†ÊþøQUŒ†ˆ¦õµì†ì†ÊþøQT¤†ˆ¦õQU|ì†ì†ì†ÊþøQSô†ˆ¦õ§ì†ëßþøQR˜„QS@ˆ¦õ§‹á†ÊþQR¤ˆ¦õ™‹QR°þøôüQQÌöQP܆ˆ›»ì†ì†ì†ÒöQP †ˆ›­ì†ì†ÒöQO€†ˆ›Ÿì†ÒöQNÔ†ƒŽü¼þò„þò„þò„þò„þåQN4†ˆ›ŸìØöQM”†ˆ›Ÿì†ÒöQL†ˆ›QM„ì†ì†ì†ìò†ìòò†ì†ÒöQJƒúþŸQLƒùꆄ‚öꆄ‚öꆄ‚öà†ˆþöQJx†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ?ІƒŽúþŸQJƒùꆄ‚öQGT†„„‘úþŸQIÀƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQЈ¦õ·ä†‹Ø’ÍþøôüÞöQA†ˆ‘úþŸQGHƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆ‰õöQA€†ˆ¦õ·ä†‹Ø’ÍþøôüÞöQ@8†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ?L†ˆ›‘ÒöQ><†ˆ›Q?<ìò†ìò†ì†Òöð†ƒùQ=H†ˆ›»ìò†ì†ÒöQ8\†ˆ›Q=8Q8Ć‹šøQ<ÀþŽþþQ8þQ<¬Q8úþŸQ<œƒùQ;à†ˆ¦õ§ì†ÊþøQ;L†ˆ¦õ™ÊþøQ:œ†ˆ¦õ§ì†ëßþøQ9@„Q9舦õ§‹á†ÊþQ9Lˆ¦õ™‹Q9XþøôüQ8töQ.|†ˆ›‘‹šøQ7ðþŽþþQ/Q7ÜQ/þŸQ7̃ùQ6ô†ˆ¦õµì†ì†ÊþøQ6`†ˆ¦õ™ÊþøQ5”†ˆ¦õ¡ò†ÊþøQ5†ˆ¦õ™ÊþøQ4P†ˆ¦õ§ì†ÊþøQ3¼†ˆ¦õ™ÊþøQ3(†ˆ¦õ™ÊþøQ2”†ˆ¦õ™ÊþøQ2†ˆ¦õ™ÊþøQ1l†ˆ¦õ™ÊþøQ0¼†ˆ¦õ§ì†ëßþøQ/`„Q0ˆ¦õ§‹á†ÊþQ/lˆ¦õ™‹Q/xþøôüQ.”öQ,D†Q.nþò„þò„þò„þò„þò„þò„þQ,V„üQ-¾„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷ð†ƒùQ+P†ˆ›»ìò†ì†ÒöÞ“õþþøQ*d†ˆ›Ÿì†ÒöQ)p†ˆ›Q*Tìòòò†ÒöQ'l†ƒˆúþŸQ)dƒùꆄ‚öꆄ„þöꆄ‚öꆈþöQ'膈¦õ·ä†‹Ø’ÍþøôüÒQ&膈›‘ÒöQ&,†ˆ›­ìò†ÒöQ$ð†ƒŽüQ&þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þåQ$P†ˆ›Ÿì†Òöö†üö†üQ#†ˆ›ŸìØöQ"ð†ˆ›ŸìØöQ ´†ˆ›­‹úþŸQ"Ô„„þöꆆöQ!Іˆ¦õ·ä†‹Ø’ÍþøôüÂòØöQ ƒŽúþŸQ ¨ƒùꆄ„þöꆈþöQ|†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùQ0†ƒúþŸQðƒùꆄ‚öꆄ‚öꆆöQœ†ˆ¦õ·ä†‹Ø’ÍþøôüÚQð†ƒŽúþŸQ$ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQX†ˆ¦õ·ä†‹Ø’ÍþøôüÜQ†ƒŽúþŸQäƒùꆄ‚öꆄ‚öꆄ‚öꆆöQh†ˆ¦õ·ä†‹Ø’ÍþøôüÜQü†ƒˆúþŸQôƒùꆄ‚öꆄ‚öꆄ„þöꆈþöQx†ˆ¦õ·ä†‹Ø’ÍþøôüÒQ@†ˆ›­ì†ì†óßöö†üQ†ˆ›‹†óßöQð†ˆ›ŸìØöQ†ˆ›»ìòò†ÒöQP†ƒˆúþŸQ ƒùꆄ‚öà†ˆþöQ̆ˆ¦õ·ä†‹Ø’ÍþøôüÒQ†ˆ›Q@ì†ìò†ì†ìò†ì†ÒööƒùQ @†ƒúþŸQàƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöQ ¬†ˆ¦õ·ä†‹Ø’ÍþøôüÚQ P†ƒˆúþŸQ 4ƒùꆄ‚öꆄ‚öà†ˆþöQ ̆ˆ¦õ·ä†‹Ø’ÍþøôüÒQ ̆ˆ›‘ÒöQ¬†ƒˆúþŸQ Àƒùꆄ‚öò†ƒùQø†ˆ‘úþŸQ hƒùꆄ‚öQ@†ˆ‰úþŸQ (ƒùꆄ‚öꆄ‚öꆄ‚öQ˜†ˆ‰úþŸQ ˜ƒùꆄ‚öò†ƒùQð†ˆ‘úþŸQ @ƒùꆄ‚öQ8†ˆ‰úþŸQ ƒùꆄ‚öà†ˆþöQÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöQh†ˆ¦õ·ä†‹Ø’ÍþøôüþàöQ †ˆ¦õ·ä†‹Ø’ÍþøôüÖöQȆˆ¦õ·ä†‹Ø’ÍþøôüÖöQp†ˆ¦õ·ä†‹Ø’ÍþøôüþàöQ(†ˆ¦õ·ä†‹Ø’ÍþøôüÒð†ƒùPÿ¸†ˆ›»ì†ì†ì†Òöð†ƒùPþüƒˆˆ­‹á†ì†Øð†üð†ƒùPø<†ƒŽúþŸPþ¬ƒùPûˆ†„„‘úþŸPþ”ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPü†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPùt†ˆ‰’úþŸPû|ƒùꆄ‚öꆄ‚öꆄ‚öꆆöPú†ˆ¦õ·ä†‹Ø’ÍþøôüÔöPø¤†ˆ¦õ·ä†‹Ø’ÍþøôüÜPö؆ˆ›Pøòòòòòòò†ÒöPö†ˆ›§òò†ÒöPõD†ˆ›™ò†ÒöPóȆƒúþŸPõ8ƒùꆈþöPô4†ˆ¦õ·ä†‹Ø’ÍþøôüÚPñÔ†ˆ›‘‹úþŸPó¼ƒùꆆöPò¸†ˆ¦õ·ä†‹Ø’ÍþøôüPñìöPîÀ†ˆ›PïÜ‹úþŸPñȃùꆄ‚öꆄ‚öꆄ‚öꆆöPðL†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìòò†ì†ÒöP줆ƒúþŸPî´ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöP톈¦õ·ä†‹Ø’ÍþøôüÚP솈›Ÿì†ÒöP넆ƒˆˆŸì†ØP醃ŽúþŸPëxƒùà†„„þöà†„„þöà†„„þöà†„„þöꆆöP鄆ˆ¦õ·ä†‹Ø’ÍþøôüÜP蔆·þò„þò„þæ„üò÷ö†üPæðƒŽúþŸPèxƒùꆄ‚öꆆöPçL†ˆ¦õ·ä†‹Ø’ÍþøôüÜPæ(†ˆ›™ò†ÒöP䄆ƒúþŸPæƒùꆄ„þöꆆöPäð†ˆ¦õ·ä†‹Ø’ÍþøôüÚPãȆˆ›­ì†ì†ÒöPá8†ƒˆúþŸP㼃ùꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öà†ˆþöPá´†ˆ¦õ·ä†‹Ø’ÍþøôüÒPß †ˆ›Pá(ì†Pßt†‹úþŸPàôƒùꆆöPßð†ˆ¦õ·ä†‹Ø’ÍþøôüPß$öPÜh†ƒŽúþŸP߃ùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöPÜІˆ¦õ·ä†‹Ø’ÍþøôüÜPÛ†ˆ›§òòØöPÚ€†ˆ›PÛ€ì†ì†ì†ì†ì†ÒöPØT†ƒˆúþŸPÚtƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆈþöPØÐ†ˆ¦õ·ä†‹Ø’ÍþøôüÒPל†ƒˆˆ»ìòò†ØPËà†ƒˆúþŸP׃ùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöPÏ †„„‰úþŸPÕèƒùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPÏ”†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆆöPÌ\†ˆ¦õ·ä†‹Ø’ÍþøôüÒ脌ƒóƒùPÊ܆ˆ›»ì†ì†ì†ÒöPÄH†ˆ›‹†‹šøPÊTþŽþþPÄêPÊ@PÄæþŸPÊ0ƒùPÉ<†ˆ¦õPÊì†ìò†ÊþøPÈŒ†ˆ¦õ“†ÊþøPÇø†ˆ¦õ™ÊþøPÇ8†ˆ¦õ§‹á†ÊþøPƈ†ˆ¦õ§ì†ëßþøPÅ,„PÅÔˆ¦õ§‹á†ÊþPÅ8ˆ¦õ™‹PÅDþøôüPÄ`öö†üPȈ›™†ìùßöö†üP°†ˆ›­ì†ì†ÒöPÀp†ƒˆúþŸP¤ƒùꆄ„þöà†„„þöà†„„þöà†ˆþöPÀ솈¦õ·ä†‹Ø’ÍþøôüÒP½à†ƒŽúþŸPÀdƒùꆄ‚öà†„„þöà†„„þöꆄ‚öà†„„þöà†ˆþöP¾H†ˆ¦õ·ä†‹Ø’ÍþøôüÜP¹,†ƒˆúþŸP½Ôƒùꆄ‚öꆄ„þöPºÈ†„„‰úþŸP½lƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöP»P†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆆöP¹¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒP¸¨†ˆ›‘ÒöP³†ƒúþŸP¸œƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöP´<†ˆ‘úþŸP¶l„‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöP´´†ˆ¦õ·ä†‹Ø’ÍþøôüþàöP³l†ˆ¦õ·ä†‹Ø’ÍþøôüÚP® †ˆ›P±D‹úþŸP²ôƒùꆄ‚öà†ˆ‰õöP±´†ˆ¦õ·ä†‹Ø’ÍþøôüÂP¯@†‹úþŸP±ƒùꆄ„þöꆄ‚öꆆöP¯¼†ˆ¦õ·ä†‹Ø’Íþøôü†ìØöP¬œ†ƒˆúþŸP®”ƒùꆄ„þöꆄ‚öꆄ„þöꆆöP­†ˆ¦õ·ä†‹Ø’ÍþøôüÒPªä†ƒúþŸP¬ƒùꆄ‚öà†ˆþöP«P†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ü脌ƒóƒùP©p†ˆ›PªŒì†ì†ì†ìòò†ÒöP¨˜†ˆ›»ì†ì†ì†ÒöP§Ü†ˆ›­ìò†ÒööƒùP¥Ð†ƒŽúþŸP§´ƒùꆄ‚öꆄ‚öꆄ‚öꆈþöP¦8†ˆ¦õ·ä†‹Ø’ÍþøôüÜPŸ†ˆ›§†‹úþŸP¥¨ƒùꆄ‚öꆄ‚öP¤ˆ†„„‰ˆ§òò†Üöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öP ü†ˆ‰úþŸP¢ˆƒùꆆöP¡„†ˆ¦õ·ä†‹Ø’ÍþøôüÖöP ,†ˆ¦õ·ä†‹Ø’Íþøôü†ì†Òöö†üPž4†ˆ›¡†ä†‹ÇöP\†ˆ›»ì†ì†ì†ÒöPœ„†ˆ›»ì†ì†ì†ÒöPœ†ˆ›‘ÒöPšÔ†ˆ›P›È†ìò†ìò†ì†Òö؆ˆþöð†üöƒùP—<†ƒˆúþŸPšDƒùP˜ˆ†ˆ‘úþŸPš,ƒùꆄ„þöꆆöP™†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP—¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒP”膃ˆúþŸP—0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöP•d†ˆ¦õ·ä†‹Ø’ÍþøôüÒP’”†ƒŽúþŸP”܃ùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öà†ˆþöP’ü†ˆ¦õ·ä†‹Ø’Íþøôü܆ƒŒü¤þò„þò„þçö†üPð†ƒúþŸP’ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöP\†ˆ¦õ·ä†‹Ø’ÍþøôüÚP†ˆ›»ì†ìò†Òöð†ƒù؆ˆþöPŽ(†·þò„þÚ„üˆ„þè÷PŠèƒúþŸPŽƒùPŒP†„„‰úþŸPŽƒùꆄ„þöꆈþöPŒØ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöↈ‰õöP‹H†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùP‰”†ˆ›Pаì†ìò†ìò†ì†ÒöP‰†ˆ›‘ÒöP„¤†ƒŽúþŸP‰ƒùꆄ‚öP…܆ˆ‘úþŸPˆÄƒùꆄ„þöꆄ‚öƆ„„‰ˆ„éöƆ„„‰ˆ‘Üöꆄ„þöà†ˆþöP†T†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP… †ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùP|l†ˆ›‹†‹šøP„þŽþþP}P€(øPƒþŽþþP€FPƒ|P€BþŸPƒlƒùP‚”†ˆ¦õµì†ì†ÊþøP䆈¦õ§ì†ëßþøP€ˆ„P0ˆ¦õ§‹á†ÊþP€”ˆ¦õ™‹P€ þøôüP} þŸP€ƒùP\†ˆ¦õ“†ÊþøP~¬†ˆ¦õ§ì†ëßþøP}P„P}øˆ¦õ§‹á†ÊþP}\ˆ¦õ™‹P}hþøôüP|„öPyL†ˆ›P|\ì†ì†ì†ìò†ìòÚ†‘üŒþPy´†‹úþŸP{4ƒùꆆöPz0†ˆ¦õ·ä†‹Ø’ÍþøôüPydöPw,ƒˆúþŸPy@ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPwœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒPt†ˆ›Pu‹úþŸPwƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöPup†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ìò†ì†ÒöPsD†ˆ›­ì†ì†ÒöPnl†Ps6þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þPn~„üPr&„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷Pm”†ˆ›»ì†ì†ì†ÒöPlô†ˆ›‹†ÒöPe4†ˆ›Pläìò†Peœ†‹šøPl4þŽþþPeÖPl PeÒþŸPlƒùPk†ˆ¦õPkôìò†ì†ÊþøPjl†ˆ¦õ“†ÊþøPi¼†ˆ¦õ§ì†ÊþøPi †ˆ¦õ§ì†ÊþøPh$†ˆ¦õ¯†ì†ì†ÊþøPgt†ˆ¦õ§ì†ëßþøPf„PfÀˆ¦õ§‹á†ÊþPf$ˆ¦õ™‹Pf0þøôüPeLöPd¬†·þò„þÚ„üˆ„þè÷P^˜†ˆ›‘‹šøPd@þŽþþP_:Pd,P_6þŸPdƒùPc|†ˆ¦õ™ÊþøPb膈¦õ™ÊþøPb†ˆ¦õµì†ì†ÊþøPaˆ†ˆ¦õ™ÊþøP`؆ˆ¦õ§ì†ëßþøP_|„P`$ˆ¦õ§‹á†ÊþP_ˆˆ¦õ™‹P_”þøôüP^°öö†üP]膈›Ÿì†ÒöPT†ˆ›P]ØìP¼†‹šøP]DþŽþþPöP]0PòþŸP] ƒùP\,†ˆ¦õP]ì†ìò†ÊþøP'(†ˆ¦õ½†‹úþŸP\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöPV`†„„‘úþŸPXƒùꆄ‚öꆈþöPV؆ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöPS°†„„‰úþŸPUdƒùꆄ„þöꆈþöPT8†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöPQ؆„„‘úþŸPS|ƒùꆄ‚öꆈþöPRP†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPP(†„„‘úþŸPQ̃ùꆄ‚öꆈþöPP †ˆ¦õ·ä†‹Ø’ÍþøôüÞöPNx†„„‘úþŸPPƒùꆄ‚öꆈþöPNð†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPLȆ„„‘úþŸPNlƒùꆄ‚öꆈþöPM@†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPK†„„‘úþŸPL¼ƒùꆄ‚öꆈþöPK†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPIh†„„‘úþŸPK ƒùꆄ‚öꆈþöPIà†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPG¨†„„‘úþŸPI\ƒùꆄ‚öↈ‰õöPH †ˆ¦õ·ä†‹Ø’ÍþøôüÞöPEø†„„‘úþŸPGœƒùꆄ‚öꆈþöPFp†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPDH†„„‘úþŸPEìƒùꆄ‚öꆈþöPDÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöPB˜†„„‘úþŸPD<ƒùꆄ‚öꆈþöPC†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP@膄„‘úþŸPBŒƒùꆄ‚öꆈþöPA`†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP?8†„„‘úþŸP@܃ùꆄ‚öꆈþöP?°†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöP=`†„„‘úþŸP?ƒùꆄ‚öꆈþöP=؆ˆ¦õ·ä†‹Ø’ÍþøôüÞöP;°†„„‘úþŸP=Tƒùꆄ‚öꆈþöP<(†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP:†„„‘úþŸP;¤ƒùꆄ‚öꆈþöP:x†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP6†„„‘úþŸP9ôƒùꆄ‚öP7؆ˆ‰úþŸP9´ƒùꆄ‚öꆄ‚öꆈþöP8`†ˆ¦õ·ä†‹Ø’ÍþøôüÖöP7†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP4à†„„‘úþŸP6„ƒùꆄ‚öꆈþöP5X†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP1˜†„„‘úþŸP4Ôƒùꆄ‚öP2à†ˆ‰úþŸP4”ƒùꆄ‚öꆈþöP3h†ˆ¦õ·ä†‹Ø’ÍþøôüÖöP2†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP/膄„‘úþŸP1Œƒùꆄ‚öꆈþöP0`†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP.8†„„‘úþŸP/܃ùꆄ‚öꆈþöP.°†ˆ¦õ·ä†‹Ø’ÍþøôüÞöP,ˆ†„„‘úþŸP.,ƒùꆄ‚öꆈþöP-†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöP(p†ˆ¦õ·ä†‹Ø’Íþøôü†ìò†ÊþøP$œ†ˆ¦õµ‹úþŸP'ƒùꆄ‚öꆄ‚öꆈþöP%Ȇˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøP#´†ˆ¦õP$Œì†ìò†ÊþøP"¬†ˆ¦õP#„‹á†ìò†ÊþøP!à†ˆ¦õµìò†ÊþøP!0†ˆ¦õ“†ÊþøP œ†ˆ¦õ™ÊþøP솈¦õ§ì†ÊþøP†ˆ¦õPÜì†ì†ì†ÊþøPT†ˆ¦õ§ì†ÊþøPD†ˆ¦õ§‹úþŸPHƒùꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöPT†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøP”†ˆ¦õ§ì†ëßþøP8„Pàˆ¦õ§‹á†ÊþPDˆ¦õ™‹PPþøôüPlööƒùPð†ˆ›P(ì†ìò†ìò†ìò†Òöð†ƒùP䆃ˆˆPÄì†ìòò†ì†ØPŒ†ƒŽúþŸP؃ùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöPô†ˆ¦õ·ä†‹Ø’ÍþøôüÜP „P€ƒP ƒšøPþŽþþP *PüP &þŸPìƒùPÀ†ˆ¦õPÐì†ìò†ì†ì†ÊþøP†ˆ¦õ“†ÊþøP`†ˆ¦õ§ì†ÊþøPx†ˆ¦õ¯ò†ì†ÊþøP Ȇˆ¦õ§ì†ëßþøP l„P ˆ¦õ§‹á†ÊþP xˆ¦õ™‹P „þøôüÚO÷ø†ˆ›P ðìOø`†‹šøP \þŽþþOøšP HOø–þŸP 8ƒùP |†ˆ¦õ§ì†ÊþøP ¼†ˆ¦õ§‹á†ÊþøPð†ˆ¦õµì†ì†ÊþøP@†ˆ¦õ“†ÊþøPt†ˆ¦õµìò†ÊþøPŒ†ˆ¦õPdìòò†ÊþøP¤†ˆ¦õ¯ò†ì†ÊþøPȆˆ¦õµ‹áò†ÊþøPŒ†ˆ¦õP¸ì†ìò†ì†ìò†ÊþøP܆ˆ¦õ§ì†ÊþøPH†ˆ¦õ™ÊþøP´†ˆ¦õ™ÊþøP†ˆ¦õ§ì†ÊþøP8†ˆ¦õµìò†ÊþøOÿl†ˆ¦õµìò†ÊþøOþ†ˆ¦õµ‹áò†ÊþøOýĆˆ¦õµì†ì†ÊþøOý†ˆ¦õ“†ÊþøOüd†ˆ¦õ§ì†ÊþøOû˜†ˆ¦õµìò†ÊþøOú膈¦õ§ì†ÊþøOú8†ˆ¦õ§ì†ëßþøOøÜ„Où„ˆ¦õ§‹á†ÊþOøèˆ¦õ™‹OøôþøôüOøöO÷X†ˆ›Ÿì†ÒöOö€†ˆ›»ì†ì†ì†ÒöOîІˆ›OöHò†ì†ì†ì†Oï8†‹šøOõlþŽþþOïrOõXOïnþŸOõHƒùOôT†ˆ¦õ¯†ì†ì†ÊþøOòü†ˆ¦õOôòò†ìò†ìò†ÊþøOñÀ†ˆ¦õOòÄò†ì†ì†ì†ì†ÊþøOñ†ˆ¦õ§ì†ëßþøOï´„Oð\ˆ¦õ§‹á†ÊþOïÀˆ¦õ™‹OïÌþøôüOîèöƆ‡ü”„þò„þè÷Oí̈›‹†óßöOë°†ˆ›Oí°O솋úþŸO혃ùꆆöO씆ˆ¦õ·ä†‹Ø’ÍþøôüÉßöð†ƒùO놈›ãöð†ƒùOêT†ˆ›Ÿì†ÒöO熃ˆúþŸOêHƒùꆄ‚öò†ƒùOèL†ˆ‘úþŸOéðƒùꆄ‚öꆆöOèĆˆ¦õ·ä†‹Ø’ÍþøôüþàöOç|†ˆ¦õ·ä†‹Ø’ÍþøôüÒOæ`†‡ü¬„þò„þò„þò„þè÷O分ˆ›»ì†ì†ì†ÒöOä膈›Ÿì†ÒöOßü†ˆ›‹†‹šøOä`þŽþþOàžOäLOàšþŸOä<ƒùO〆ˆ¦õ“†ÊþøOâ솈¦õ™ÊþøOâ<†ˆ¦õ§ì†ëßþøOàà„Oለ¦õ§‹á†ÊþOà숦õ™‹OàøþøôüOàöOÞ´†ˆ›Oßììò†ì†ì†ìò†ìØöOÝ舛»ìòò†ÒöOÛ솃ˆúþŸOÝЃùꆄ‚öꆄ‚öà†ˆþöOÜh†ˆ¦õ·ä†‹Ø’ÍþøôüÒOØT†ˆ›OÛ´†OÙ†‹úþŸOÛ¨ƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆈþöOÙŒ†ˆ¦õ·ä†‹Ø’Íþøôü†ìòØöO×4†ˆ›OØòΆ‹ˆ‘O×LöOÕ€†ƒˆúþŸO×(ƒùꆄ‚öꆈþöOÕü†ˆ¦õ·ä†‹Ø’ÍþøôüÒOÓ¤†ƒˆúþŸOÕtƒùꆄ‚öꆄ„þöꆈþöOÔ †ˆ¦õ·ä†‹Ø’ÍþøôüÒOÓ†ˆ›Ÿì†ÒöOÒ|†·þò„þò„þæ„üò÷OÄH†ƒˆúþŸOÒpƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöOÉ솄„‰úþŸOÐȃùà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOÊt†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öOÅ䆄„‘úþŸOÈxƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOÆ\†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆆöOÄĆˆ¦õ·ä†‹Ø’ÍþøôüÒO±À†ˆ›OÄ8ì†ì†O²(†‹šøOÈþŽþþO²bO¿ÌøOÃþŽþþO¿êOÃO¿æþŸOÂôƒùOÂ8†ˆ¦õ§ì†ÊþøOÁˆ†ˆ¦õ§ì†ëßþøOÀ,„OÀÔˆ¦õ§‹á†ÊþOÀ8ˆ¦õ™‹OÀDþøôüO²^þŸO¿¼ƒùO¾ä†ˆ¦õµì†ì†ÊþøO½ü†ˆ¦õO¾Ôìò†ì†ÊþøO½L†ˆ¦õ§ì†ÊþøO¼d†ˆ¦õO½<ì†ì†ì†ÊþøO»|†ˆ¦õO¼Tì†ì†ì†ÊþøOº°†ˆ¦õµì†ì†ÊþøO´°†ˆ¦õµ‹šøOºDþŽþþOµšOº0Oµ–þŸOº ƒùO¹d†ˆ¦õ“†ÊþøO¸˜†ˆ¦õµì†ì†ÊþøO·è†ˆ¦õ§ì†ÊþøO·8†ˆ¦õ§ì†ëßþøOµÜ„O¶„ˆ¦õ§‹á†ÊþOµèˆ¦õ™‹Oµôþøôü†ì†ÊþøO´†ˆ¦õ§ì†ëßþøO²¤„O³Lˆ¦õ§‹á†ÊþO²°ˆ¦õ™‹O²¼þøôüO±ØöO¬H†ˆ›O±ˆ†O¬°†‹šøO±þŽþþO¬êO±O¬æþŸO°øƒùO°†ˆ¦õO°Üìò†ì†ÊþøO¯8†ˆ¦õ¡†ì†ÊþøO®ˆ†ˆ¦õ§ì†ëßþøO­,„O­Ôˆ¦õ§‹á†ÊþO­8ˆ¦õ™‹O­DþøôüO¬`öO«¨†ˆ›Ÿì†ÒöO™(†ˆ›O«˜ìò†ìòO™†‹šøOª°þŽþþO™ÊOªœO™ÆþŸOªŒƒùO©´†ˆ¦õµìò†ÊþøO¦$†ˆ¦õµ‹úþŸO©¨ƒùꆄ‚öà†„„þöà†„„þöà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöO§P†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøO¥†ˆ¦õO¦ì†ì†ì†ìò†ÊþøO£ä†ˆ¦õO¤ôìò†ì†ìò†ÊþøO¢Ä†ˆ¦õO£Ôìò†ìòò†ÊþøO¡¤†ˆ¦õO¢´ìò†ìòò†ÊþøO „†ˆ¦õO¡l†ì†ì†ìò†ÊþøOŸ€†ˆ¦õ½†ì†ìò†ÊþøOž˜†ˆ¦õ¯†ì†ì†ÊþøO°†ˆ¦õOžˆìòò†ÊþøO†ˆ¦õ“†ÊþøOœ†ˆ¦õ¯òò†ÊþøO›h†ˆ¦õ§ì†ëßþøOš „Oš´ˆ¦õ§‹á†ÊþOšˆ¦õ™‹Oš$þøôüO™@öO˜ˆ†ˆ›ŸìØöO—膈›ŸìØöO•ô†ƒúþŸO—܃ùꆄ‚öꆄ‚öꆄ‚öꆆöO–`†ˆ¦õ·ä†‹Ø’ÍþøôüÚO”Ȇˆ›O•¼†ìò†ìò†ì†ÒöO’0ƒˆúþŸO”¼ƒùꆄ‚öà†„„þöà†„„þöꆄ‚öà†„„þöà†ˆþöO’ †ˆ¦õ·ä†‹Ø’ÍþøôüÒO‘„†ˆ›Ÿì†ÒöOX†ƒˆˆO‘LO\†‹úþŸO‘@ƒùꆄ‚öꆄ‚öà†ˆþöO؆ˆ¦õ·ä†‹Ø’ÍþøôüO¼†‹úþŸOPƒùà†ˆ‰õöOŽ8†ˆ¦õ·ä†‹Ø’Íþøôü†ØO‹H†ƒŽúþŸOLƒùꆄ‚öƆ„„‰ˆ‘ÜöꆈþöO‹°†ˆ¦õ·ä†‹Ø’ÍþøôüÜO„H†ƒˆúþŸO‹<ƒùꆄ‚öò†ƒùO…”†ˆ‘úþŸOŠäƒùꆄ‚öO†Ü†ˆ‰úþŸOФƒùꆄ‚öꆄ‚öOˆ4†ˆ‰’úþŸOŠ<ƒùꆄ‚öꆄ‚öꆄ‚öꆆöOˆÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÔöO‡d†ˆ¦õ·ä†‹Ø’ÍþøôüÖöO† †ˆ¦õ·ä†‹Ø’ÍþøôüþàöO„Ćˆ¦õ·ä†‹Ø’ÍþøôüÒOƒÄ†ˆ›‘ÒöOƒ†ˆ›™ò†Òö؆ˆþöO¼†O‚®þò„þò„þò„þò„þò„þò„þò„þæ„üò÷O†ˆ›ŸìØöO€ †ˆ›O ìò†ìò†ì†ÒöÞ“õþþøO}h†ƒúþŸO´ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöO}Ô†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöOwÀ†ˆ›O} ìOxD†‹šøO|xþŽþþOx~O|dOxzþŸO|TƒùO{|†ˆ¦õ¡ò†ÊþøOz̆ˆ¦õ“†ÊþøOz†ˆ¦õ§ì†ëßþøOxÀ„Oyhˆ¦õ§‹á†ÊþOẍ¦õ™‹OxØþøôü†Òöøƒùð†ƒùOu0†ƒˆúþŸOw€ƒùꆄ‚ö䆄„þö䆄„þö䆄„þö䆈þöOu¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üOtH†ˆ›»ìòòØöOmô†ƒŽúþŸOt<ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öOoà†„„‘úþŸOs\ƒùꆄ„þöꆄ„þöOq(†ˆ‘úþŸOrôƒùꆄ‚öꆄ‚öꆆöOq †ˆ¦õ·ä†‹Ø’ÍþøôüÞöOpX†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öà†ˆþöOn\†ˆ¦õ·ä†‹Ø’ÍþøôüÜOl(†ƒúþŸOmèƒùꆄ‚öꆄ‚öꆆöOl”†ˆ¦õ·ä†‹Ø’ÍþøôüÚOiĆƒˆúþŸOl „‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOj@†ˆ¦õ·ä†‹Ø’ÍþøôüÒOg„†ƒˆúþŸOi¸ƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöOh†ˆ¦õ·ä†‹Ø’ÍþøôüÒOf†ˆ›Ogtìò†ì†ì†ÒöOe¸†ˆ›»ìò†ì†ÒöOe†ˆ›Ÿì†ÒöOd@†ˆ›»ì†ì†ì†ÒöOch†ˆ›»ì†ì†ì†ÒöOb†ˆ›»ì†ì†ì†ÒöOa¸†ˆ›»ì†ì†ì†ÒöO`à†ˆ›»ì†ì†ì†Òöö†üO_ø†ˆ›»ìò†ì†Òöˆ›‘ÒöO^œ†ˆ›»ìò†ì†ÒöO^†ˆ›‘ÒöOYh†ƒúþŸO^ ƒùꆄ„þöꆄ„þöà†„„‰õöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöOYÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÚOXt†ˆ›OYXìòòò†ÒöOVH†ˆ›OX<†OV°†‹úþŸOX0ƒùꆆöOW,†ˆ¦õ·ä†‹Ø’ÍþøôüOV`öOSà†ˆ›™†‹úþŸOV ƒùꆄ‚öà†ˆþöOTà†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöOS@†ˆ›Ÿì†ÒöORh†ˆ›»ì†ì†ì†Òö†ƒŒü¤þò„þò„þçOKl†ˆ›‹†‹šøOQhþŽþþOLOQTOL þŸOQDƒùOPˆ†ˆ¦õ“†ÊþøOO¼†ˆ¦õµì†ì†ÊþøONð†ˆ¦õ¡†ì†ÊþøON\†ˆ¦õ™ÊþøOM¬†ˆ¦õ§ì†ëßþøOLP„OLøˆ¦õ§‹á†ÊþOL\ˆ¦õ™‹OLhþøôüOK„öOI†OK^þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þOI„üOIÖ„þò„þò„þò„þò„þò„þò„þè÷ð†ƒùOG †ˆ›OHØìò†ì†ì†ìò†ìØöˆ›ãöOEh†ƒˆúþŸOGƒùꆄ„þöꆈþöOE䆈¦õ·ä†‹Ø’ÍþøôüÒOD¬†ˆ›­ì†ìØöOBD†ƒŽúþŸOD ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöOB¬†ˆ¦õ·ä†‹Ø’ÍþøôüÜOAÀ†ˆ›‘ÒöO:„†ˆ›‘‹šøOATþŽþþO;&OA@O;"þŸOA0ƒùO@t†ˆ¦õ§ì†ÊþøO?Ćˆ¦õ§ì†ÊþøO?0†ˆ¦õ™ÊþøO>œ†ˆ¦õ™ÊþøO>†ˆ¦õ™ÊþøO=t†ˆ¦õ™ÊþøO<Ćˆ¦õ§ì†ëßþøO;h„O<ˆ¦õ§‹á†ÊþO;tˆ¦õ™‹O;€þøôüO:œöO3܆ƒˆšøO:þŽþþO4O:O4þŸO9ôƒùO8䆈¦õO9Øì†ìò†ì†ÊþøO7ü†ˆ¦õO8Ôì†ìò†ÊþøO7h†ˆ¦õ™ÊþøO6d†ˆ¦õO7Xì†ìò†ì†ÊþøO5´†ˆ¦õ§ì†ëßþøO4X„O5ˆ¦õ§‹á†ÊþO4dˆ¦õ™‹O4pþøôüÒO3†ˆ›»ìòò†ÒöüüO0l†ˆŸŠúþŸO2Ø„‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆈþöO14†ˆ¦õ·ä†‹Ø’ÍþøôüO0„ö膃ˆñO-†ƒˆúþŸO04ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöO-Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒO,†ˆ›O-ìòòòØöO+(†ˆ›µ†ìòòùßöO*P†ˆ›»ì†ì†ì†ÒöO(œ†ƒˆúþŸO*Dƒùꆄ„þöꆆöO)†ˆ¦õ·ä†‹Ø’ÍþøôüÒO&À†ƒˆúþŸO(ƒùꆄ„þöꆄ„þöꆈþöO'<†ˆ¦õ·ä†‹Ø’ÍþøôüÒO%̆ˆ›O&°ì†ì†ìò†ÒöO$ô†ˆ›»ì†ì†ì†ÒöO$8†ˆ›­ì†ì†ÒöO †ˆ›‹†‹šøO#°þŽþþOÂO#œO¾þŸO#ŒƒùO"Іˆ¦õ§ì†ÊþøO" †ˆ¦õ§ì†ÊþøO!p†ˆ¦õ§ì†ÊþøO À†ˆ¦õ§ì†ÊþøO †ˆ¦õ“†ÊþøO`†ˆ¦õ§ì†ëßþøO„O¬ˆ¦õ§‹á†ÊþOˆ¦õ™‹OþøôüO8öOH†ˆ›»ì†ì†ì†Òööƒù膃ˆñOP†ˆ›Ÿ‹á†ÒöO°†ˆ›Ÿìùßöö†üOȆˆ›»ì†ì†ì†ÒöOœ†ˆ›O¸ì†ì†ì†ìòò†ÒöOø†ƒúþŸOƒùꆄ‚öꆈþöOd†ˆ¦õ·ä†‹Ø’ÍþøôüÚOHˆ›™†ìØöO€†ˆ›™†ì†ÒöOø†‡ü „þò„þò„þè÷ð†ƒùö†üOô†ˆ›§òò†ÒöO H†ƒúþŸOèƒùꆄ‚öO4†„„‘úþŸO¨ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöO¬†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöO ´†ˆ¦õ·ä†‹Ø’ÍþøôüÚOX†ƒŽúþŸO <ƒùꆄ‚öꆄ‚öꆄ‚öꆆöOÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÜOœ†ˆ›™†ì†óßö؆ˆþöNÿÄ„ODƒNÿЃšøOÔþŽþþNÿîOÀNÿêþŸO°ƒùO؆ˆ¦õµì†ì†ÊþøO †ˆ¦õµì†ì†ÊþøO솈¦õOüì†ì†ìòò†ÊþøO<†ˆ¦õ§ì†ÊþøOŒ†ˆ¦õ§ì†ëßþøO0„O؈¦õ§‹á†ÊþO<ˆ¦õ™‹OHþøôüÚð†ƒùNÿ$†ˆ›‘Òöð†ƒù؆ˆþöNãH†ˆ›Nþ¬ìò†Nã°†‹šøNýüþŽþþNãêNéhøNýŒþŽþþNé†NýxNé‚þŸNýhƒùNñ†ˆ¦õNý$Nø0†‹šøNü¸þŽþþNøjNü¤NøfþŸNü”ƒùNû¼†ˆ¦õµì†ì†ÊþøNú¸†ˆ¦õNû¬ìò†ìò†ÊþøNú†ˆ¦õ§ì†ëßþøNø¬„NùTˆ¦õ§‹á†ÊþNø¸ˆ¦õ™‹NøÄþøôüNñÀ†‹šøN÷ÄþŽþþNñúN÷°NñöþŸN÷ ƒùNö䆈¦õ§ì†ÊþøNö†ˆ¦õµìò†ÊþøNõ0†ˆ¦õ¯òò†ÊþøNôH†ˆ¦õNõ ìòò†ÊþøN󘆈¦õ§ì†ëßþøNò<„Nò䈦õ§‹á†ÊþNòHˆ¦õ™‹NòTþøôü†ì†ÊþøNîx†ˆ¦õ§‹úþŸNñƒùꆄ‚öꆄ‚öꆄ„þöꆆöNˆ¦õ·ä†‹Ø’Íþøôü†ÊþøNí¬†ˆ¦õ¡ò†ÊþøNìü†ˆ¦õ“†ÊþøNìh†ˆ¦õ™ÊþøNëÔ†ˆ¦õ™ÊþøNë$†ˆ¦õ§ì†ëßþøNéÈ„Nêpˆ¦õ§‹á†ÊþNéÔˆ¦õ™‹NéàþøôüNãæþŸNéXƒùNèd†ˆ¦õNé<ìò†ì†ÊþøNç|†ˆ¦õNèTìò†ì†ÊþøNæÌ†ˆ¦õ“†ÊþøNæ8†ˆ¦õ™ÊþøN分ˆ¦õ§ì†ëßþøNä,„NäÔˆ¦õ§‹á†ÊþNä8ˆ¦õ™‹NäDþøôüNã`öNß †ƒˆúþŸNã<ƒùꆄ„þöNáH†„„‰úþŸNâüƒùꆄ„þöꆆöNáІˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöN߈†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒùNݨ†ˆ›NÞàìò†ì†ìòòò†ÒöNØÐ†ƒúþŸNÝœƒùꆄ„þöꆄ„þöꆄ„þöNÚ\†„„‰ˆNÜà†ì†ìNÚ̆‹úþŸNÜœƒùꆄ‚öꆄ„þöꆈþöNÛH†ˆ¦õ·ä†‹Ø’Íþøôü†Üöꆄ‚öꆈþöNÙ<†ˆ¦õ·ä†‹Ø’ÍþøôüÚN×,†ƒúþŸNØÄƒùꆄ‚öꆈþöNט†ˆ¦õ·ä†‹Ø’ÍþøôüÚNÕd†ƒŽúþŸN× ƒùꆄ‚öꆄ‚öꆆöNÕ̆ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùʆˆþöЈŸßöNÓ¤†ˆ›»ìò†ìØöNÒ膈›™†ì†ÒöNÐl†ƒŽúþŸNÒ܃ùꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöà†ˆþöNÐÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùð†ƒùð†üNÏx†ˆ›Ÿì†ÒöNÎØ†ˆ›Ÿì†ÒöNΆˆ›­ìò†ÒöƆ‡ü”„þò„þè÷NËø†ƒˆúþŸNÍ ƒùꆄ„þöꆈþöNÌt†ˆ¦õ·ä†‹Ø’ÍþøôüÒNËdˆ›ŸìØöNǬ†ˆ›NËH䆋á†NÈŒ†‹úþŸNÊèƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öà†ˆþöNɆˆ¦õ·ä†‹Ø’ÍþøôüNÈü°þò„þò„þò„þÉöNÃ$†ƒŽúþŸNÇ ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öNÄ\†ˆ‰ˆúþŸNÆpƒùꆄ„þöꆄ„þöꆄ„þöꆈþöNÄô†ˆ¦õ·ä†‹Ø’ÍþøôüÎöNÃŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÜö†üNÂ<†ˆ›»ì†ì†ì†ÒöN¾ü†NÂ.þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þN¿„üN¿þ„þò„þò„þò„þò„þò„þò„þò„þò„þè÷؆ˆþöN½ô†ˆ›™†ì†ÒöN¼`ƒŽúþŸN½èƒùꆄ‚öꆆöN¼¼†ˆ¦õ·ä†‹Ø’ÍþøôüÜN·†ƒúþŸN¼Hƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöN·p†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùN¶,†ˆ›­ìò†ÒöʆˆŸßöð†ƒùNµ$†ˆ›‘óßöN²¤†ƒúþŸNµƒùꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆆöN³†ˆ¦õ·ä†‹Ø’ÍþøôüÚN¬†ƒˆúþŸN²˜ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöN¯(†„„‘úþŸN±0„‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöN¯ †ˆ¦õ·ä†‹Ø’ÍþøôüþàöN­T†ˆ‘úþŸN¯ „‚öꆄ‚öà†ˆþöN­Ì†ˆ¦õ·ä†‹Ø’ÍþøôüþàöN¬„†ˆ¦õ·ä†‹Ø’ÍþøôüÒN©Ü†ƒˆúþŸN«üƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöNªX†ˆ¦õ·ä†‹Ø’ÍþøôüÒ膃ˆñN¥¤†ƒˆšøN©DþŽþþN¥ÞN©0N¥ÚþŸN© ƒùN¨,†ˆ¦õN©ì†ìò†ÊþøN§|†ˆ¦õ§ì†ëßþøN¦ „N¦Èˆ¦õ§‹á†ÊþN¦,ˆ¦õ™‹N¦8þøôüÒN¤Ì†ˆ›»ì†ì†ì†ÒöNŽœ†ˆ›N¤¼N†‹šøN¤DþŽþþN>N¤0N:þŸN¤ ƒùN£€†ˆ¦õ™ÊþøN¢˜†ˆ¦õN£pìòò†ÊþøN“d†ˆ¦õ§‹ˆšøN¢,þŽþþN”BNžøN¡¼þŽþþNž:N¡¨Nž6þŸN¡˜ƒùN ˆ†ˆ¦õN¡|ì†ì†ì†ì†ÊþøNŸØ†ˆ¦õ§ì†ëßþøNž|„NŸ$ˆ¦õ§‹á†ÊþNžˆˆ¦õ™‹Nž”þøôüN”>þŸNž ƒùN—@†ˆ¦õµ‹ˆšøN”þŽþþN˜:N€N˜6þŸNpƒùNœ|†ˆ¦õNTì†ìò†ÊþøN›Ì†ˆ¦õ“†ÊþøN›8†ˆ¦õ™ÊþøNšˆ†ˆ¦õ§ì†ÊþøN™Ø†ˆ¦õ§ì†ëßþøN˜|„N™$ˆ¦õ§‹á†ÊþN˜ˆˆ¦õ™‹N˜”þøôüN—Ôò†ÊþøN–†ˆ¦õ“†ÊþøN•à†ˆ¦õ§ì†ëßþøN”„„N•,ˆ¦õ§‹á†ÊþN”ˆ¦õ™‹N”œþøôüN“܆ÊþøN’Іˆ¦õ™ÊþøN’ †ˆ¦õ“†ÊþøN‘Œ†ˆ¦õ™ÊþøN܆ˆ¦õ§ì†ëßþøN€„N(ˆ¦õ§‹á†ÊþNŒˆ¦õ™‹N˜þøôüNŽ´öNƒd†ˆ›NŽŒNƒÌ†‹šøNŽþŽþþN„NŽN„þŸNðƒùN4†ˆ¦õ“†ÊþøNŒ„†ˆ¦õ§ì†ÊþøN‹¸†ˆ¦õµì†ì†ÊþøN‹†ˆ¦õ§ì†ÊþøNŠX†ˆ¦õ§ì†ÊþøN‰¨†ˆ¦õ§ì†ÊþøNˆÜ†ˆ¦õµìò†ÊþøNˆH†ˆ¦õ™ÊþøN‡˜†ˆ¦õ§ì†ÊþøN‡†ˆ¦õ™ÊþøN†T†ˆ¦õ§ì†ÊþøN…¤†ˆ¦õ§ì†ëßþøN„H„N„ðˆ¦õ§‹á†ÊþN„Tˆ¦õ™‹N„`þøôüNƒ|öN‚¨†ˆ›­ìò†ÒöN€ †ƒúþŸN‚œƒùꆄ„þöN܆ˆ‰ˆŸìâöN †ˆ¦õ·ä†‹Ø’ÍþøôüÚüüN€ †ˆ›‘óßöð†ƒùN}ˆ†ƒŽúþŸNäƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöN}ð†ˆ¦õ·ä†‹Ø’ÍþøôüÜN}†ˆ›‘ÒöN{†ˆ›‘‹úþŸN|øƒùꆆöN{ô†ˆ¦õ·ä†‹Ø’ÍþøôüN{(öNx0†ƒˆúþŸN{ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öà†ˆþöNx¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒö†üÀ†ƒŽü¤þò„þò„þåΆƒŒü˜þò„þç脌ƒóƒùNv”†ˆ›‘ÒöNuL†ˆ›Nv\†ìò†ìò†ì†ì†Òöñ̆ƒŽü˜þò„þåNs†ˆ›Nt„†ìò†ìò†ì†ÒöNrÔ†ˆ›™†ì†ÒöNnІƒˆúþŸNrȃùꆄ„þöꆄ„þöꆄ‚öꆄ‚öà†„„þöNp†ˆ‰’úþŸNqÔƒùꆄ‚öꆆöNp¨†ˆ¦õ·ä†‹Ø’ÍþøôüÔöNoL†ˆ¦õ·ä†‹Ø’ÍþøôüÒNl̆ƒŽúþŸNnăùꆄ„þöꆄ„þöꆄ‚öà†ˆþöNm4†ˆ¦õ·ä†‹Ø’ÍþøôüÜNk؆ˆ›Nl¼ìòòò†Òöð†üNf¼†ƒúþŸNk°ƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöNg(†ˆ¦õ·ä†‹Ø’ÍþøôüÚNf†ˆ›­ì†ì†ÒöNc¨†ƒúþŸNeôƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöà†ˆþöNd†ˆ¦õ·ä†‹Ø’ÍþøôüÚNa,†ƒˆúþŸNcœƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöNa¨†ˆ¦õ·ä†‹Ø’ÍþøôüÒNYȆƒúþŸNa ƒùꆄ‚öꆄ‚öꆄ‚öN[,†„„‰úþŸN`ƒùꆄ‚öN\Ô†„„‘úþŸN`Pƒùꆄ‚öN^l†„„‘úþŸN`ƒùꆄ„þöꆈþöN^䆈¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆈþöN]L†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆈþöN[´†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöNZ4†ˆ¦õ·ä†‹Ø’ÍþøôüÚNV¼†ˆ›§†‹úþŸNY„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöNW؆ˆ¦õ·ä†‹Ø’Íþøôü†ìØö脌ƒóƒùNUĆˆ›­‹áò†Òöò†ƒùNTÔ†ˆ›»ì†ì†ì†Òöˆ›‘ÒöNR¬†ƒúþŸNTDƒùꆄ„þöꆈþöNS†ˆ¦õ·ä†‹Ø’ÍþøôüÚNQ¸†ˆ›µ†ì†ìò†ÒöNNŒ†ƒúþŸNQ¬ƒùNOð†„„‘úþŸNQ”ƒùꆄ„þöꆆöNPh†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆆöNNø†ˆ¦õ·ä†‹Ø’ÍþøôüÚNHÜ„NN€ƒNH胚øNNþŽþþNINMüNIþŸNMìƒùNKT†ˆ¦õµ‹úþŸNMÔƒùꆄ„þöꆄ„þöꆆöNL€†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøNJ¤†ˆ¦õ§ì†ëßþøNIH„NIðˆ¦õ§‹á†ÊþNITˆ¦õ™‹NI`þøôüÚNHH†ˆ›‘‹ÇöNFè†NH:þò„þNFú„üNH„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷NFH†ˆ›Ÿì†ÒöNCăŽúþŸNF<ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöND †ˆ¦õ·ä†‹Ø’ÍþøôüÜNC†ˆ›‹†ÒöN>†ƒúþŸNC ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöN>p†ˆ¦õ·ä†‹Ø’ÍþøôüÚN;솃ŽúþŸN=øƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöNþN%^„üN&„þò„þò„þò„þò„þò„þò„þè÷N$Ȇˆ›‘ÒöN"ƒúþŸN$¼ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöN"x†ˆ¦õ·ä†‹Ø’ÍþøôüÚN!ˆ†ˆ›‘ÒöNô†ƒŽúþŸN!|ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öN,†ˆ‘úþŸN ăùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöN¤†ˆ¦õ·ä†‹Ø’ÍþøôüÞöN\†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùNX†ƒˆúþŸN¼„‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öN†„„‰ˆ»ì†ì†ìâöꆄ„þöꆄ„þöꆆöNÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÒN€†ˆ›»ì†ì†ì†ÒöN¨†ˆ›»ì†ì†ì†ÒöNІˆ›»ì†ì†ì†ÒöNÀ†ˆ›NÀìòò†ì†ì†ÒöN ¸†ˆ›N°N †‹šøN8þŽþþNZN$NVþŸNƒùNX†ˆ¦õ§ì†ÊþøN¨†ˆ¦õ“†ÊþøNø†ˆ¦õ§ì†ëßþøNœ„NDˆ¦õ§‹á†ÊþN¨ˆ¦õ™‹N´þøôüN ÐöN ˆ›™†ì†ÒöN 䆃ˆúþŸN ðƒùà†„„þöà†„„þöà†ˆþöN `†ˆ¦õ·ä†‹Ø’ÍþøôüÒN œ†ˆ›N Ôì†ì†ì†ì†ì†ì†ìØöN0†ƒúþŸN ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöNœ†ˆ¦õ·ä†‹Ø’ÍþøôüÚN|†ƒˆúþŸN$ƒùꆄ‚öꆈþöNø†ˆ¦õ·ä†‹Ø’ÍþøôüÒN¤†ˆ›»ìò†ì†ÒöN솃úþŸN˜ƒùꆄ‚öà†ˆþöNX†ˆ¦õ·ä†‹Ø’ÍþøôüÚMû@†ˆ›NÜMû¨†‹šøNdþŽþþMûâNPMûÞþŸN@ƒùNh†ˆ¦õµì†ì†ÊþøN¸†ˆ¦õ“†ÊþøN†ˆ¦õ§ì†ÊþøMÿX†ˆ¦õ§ì†ÊþøMþĆˆ¦õ™ÊþøMþ0†ˆ¦õ™ÊþøMý€†ˆ¦õ§ì†ëßþøMü$„Mü̈¦õ§‹á†ÊþMü0ˆ¦õ™‹Mü<þøôüMûXöMúh†ˆ›»ì†ì†ì†ÒöMùt†ˆ›MúXìò†ìò†ÒöüüM÷˜†ƒúþŸMùXƒùꆄ„þöꆄ„þöꆆöMø†ˆ¦õ·ä†‹Ø’ÍþøôüÚMõ˜†ˆŸŠúþŸM÷Œƒùꆄ„þöꆈþöMö`†ˆ¦õ·ä†‹Ø’ÍþøôüMõ°öMó|†ƒúþŸMõŒƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMó膈¦õ·ä†‹Ø’ÍþøôüÚMƒˆúþŸMópƒùꆄ‚öMïð†ˆ‰’úþŸMó0ƒùMñt†„„‘úþŸMóƒùꆄ‚öꆆöMñ솈¦õ·ä†‹Ø’ÍþøôüÞöꆆöMð|†ˆ¦õ·ä†‹Ø’ÍþøôüÔöMï †ˆ¦õ·ä†‹Ø’ÍþøôüÒM옆ƒúþŸMî|„„þö䆄„þö䆄„þö䆈þöM톈¦õ·ä†‹Ø’ÍþøôüÚMéÀ†ˆ›Ÿ‹úþŸM쌃ùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆆöMêÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÂØöM醈›­ìò†óßöð†ƒù؆ˆþöMçü†ˆ›‹†ÒöM߀†ˆ›‹†‹šøMçtþŽþþMà"Mç`MàþŸMçPƒùMät†ˆ¦õMç4Må$†‹úþŸMçƒùꆄ‚öꆄ„þöꆄ‚öꆆöMå †ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøMãĆˆ¦õ“†ÊþøMã0†ˆ¦õ™ÊþøMâp†ˆ¦õ§‹á†ÊþøMáÀ†ˆ¦õ§ì†ëßþøMàd„Má ˆ¦õ§‹á†ÊþMàpˆ¦õ™‹Mà|þøôüMߘöMÞà†ˆ›Ÿì†ÒöMÝ,†ƒˆúþŸMÞÔƒùꆄ„þöꆈþöMݨ†ˆ¦õ·ä†‹Ø’ÍþøôüÒöƒù膃ˆñMÛl†ƒŽúþŸMÜØƒùꆈþöMÛÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÜMÙx†ˆ›‘‹úþŸMÛ`ƒùꆆöMÚ\†ˆ¦õ·ä†‹Ø’ÍþøôüMÙöMÕ8†ƒúþŸMÙlƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öM×(†„„‰ˆ‘‹Ñöꆄ‚öꆄ‚öà†„„þöꆈþöMÕ¤†ˆ¦õ·ä†‹Ø’ÍþøôüÚMϸ†ˆ›‘‹šøMÔÌþŽþþMÐZMÔ¸MÐVþŸMÔ¨ƒùMÓІˆ¦õ¡ò†ÊþøMÓ<†ˆ¦õ™ÊþøMÒ¨†ˆ¦õ™ÊþøMÑø†ˆ¦õ§ì†ëßþøMМ„MÑDˆ¦õ§‹á†ÊþMШˆ¦õ™‹MдþøôüMÏÐö؆ˆþöMΰ†ˆ›­ìò†Òö脌ƒóƒùMͬ†ˆ›»ì†ì†ì†ÒöM¿†ˆ›MÍœì†ì†ì†M¿l†‹šøMÌÐþŽþþM¿¦M̼M¿¢þŸM̬ƒùMÉĆˆ¦õMÌMʆ“úþŸMÌxƒùꆄ‚öꆄ‚öꆄ‚öꆆöMÊü†ˆ¦õ·ä†‹Ø’Íþøôüʆì†ì†ÊþøMÁô†ˆ¦õMÂÌ‹ˆšøMÉXþŽþþMà MÉDMÃþŸMÉ4ƒùMǘ†ˆ¦õMÈð†ì†ìò†ìò†ìòò†ÊþøMƆˆ¦õMÇ`†ì†ìò†ìò†ìòò†ÊþøMÅX†ˆ¦õ“†ÊþøMĨ†ˆ¦õ§ì†ëßþøMÃL„MÃôˆ¦õ§‹á†ÊþMÃXˆ¦õ™‹MÃdþøôüM¤†ì†ì†ÊþøMÁD†ˆ¦õ§ì†ëßþøM¿è„MÀˆ¦õ§‹á†ÊþM¿ôˆ¦õ™‹MÀþøôüM¿öM¼Ø†ˆ›M¾Ì†M½@†‹úþŸM¾ÀƒùꆆöM½¼†ˆ¦õ·ä†‹Ø’ÍþøôüM¼ðöM¶ü“®M¹,üôøüôøüøM»ˆþ––’êM¸¬ôøüôøüøMºTþ––’êM¸4ôøM¹4¢þ––’êM¸M·x¸M· ›ãöð†ƒùM©`†ƒúþŸM¶Èƒùꆄ‚öM²†„„‘úþŸM¶ˆƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöM²Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öM®ü†„„‘úþŸM±àƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöM¯t†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöM©Ì†ˆ¦õ·ä†‹Ø’ÍþøôüÚò†ƒùM¥l†ƒúþŸM©<ƒùꆄ„þöꆄ„þöꆄ„þöꆄ‚öM¦¨†ˆ‰úþŸM¨„ƒùꆄ„þöꆄ‚öꆈþöM§0†ˆ¦õ·ä†‹Ø’ÍþøôüÖöM¥Ø†ˆ¦õ·ä†‹Ø’ÍþøôüÚM¤¼†ˆ›Ÿ‹áØöö†üM£Ô†ˆ›»ì†ì†ì†ÒöM€†ˆ›‹†‹šøM£LþŽþþM€²M޼øM¢ÜþŽþþMŽÚM¢ÈMŽÖþŸM¢¸ƒùM¡ü†ˆ¦õ§ì†ÊþøM¡L†ˆ¦õ“†ÊþøM œ†ˆ¦õ§ì†ÊþøMŸì†ˆ¦õ“†ÊþøMŸ †ˆ¦õ¡ò†ÊþøMžT†ˆ¦õµì†ì†ÊþøMˆ†ˆ¦õµìò†ÊþøMœ¼†ˆ¦õ¡ò†ÊþøM›ð†ˆ¦õ¡ò†ÊþøM›@†ˆ¦õ“†ÊþøMš†ˆ¦õ§ì†ÊþøM™Ä†ˆ¦õµìò†ÊþøM˜Ü†ˆ¦õ¯†ìò†ÊþøM˜†ˆ¦õµìò†ÊþøM—`†ˆ¦õ§ì†ÊþøM–x†ˆ¦õM—Pì†ìò†ÊþøM•¬†ˆ¦õµìò†ÊþøM”à†ˆ¦õµìò†ÊþøM”†ˆ¦õ¡ò†ÊþøM“H†ˆ¦õ¡ò†ÊþøM’|†ˆ¦õµìò†ÊþøM‘¼†ˆ¦õ§‹á†ÊþøM‘(†ˆ¦õ™ÊþøMx†ˆ¦õ§ì†ëßþøM„MĈ¦õ§‹á†ÊþM(ˆ¦õ™‹M4þøôüM€®þŸMެƒùMð†ˆ¦õ“†ÊþøM$†ˆ¦õµìò†ÊþøMŒt†ˆ¦õ“†ÊþøM‹Ä†ˆ¦õ“†ÊþøM‹†ˆ¦õ“†ÊþøMŠH†ˆ¦õµì†ì†ÊþøM‰`†ˆ¦õMŠ8ì†ìò†ÊþøMˆ\†ˆ¦õM‰Pì†ìòò†ÊþøM‡t†ˆ¦õMˆLì†ìò†ÊþøM†Œ†ˆ¦õM‡dì†ìò†ÊþøM…܆ˆ¦õ“†ÊþøM…†ˆ¦õ¡ò†ÊþøM„D†ˆ¦õ¡ò†ÊþøMƒ°†ˆ¦õ™ÊþøMƒ†ˆ¦õ§ì†ÊþøM‚P†ˆ¦õ§ì†ëßþøM€ô„Mœˆ¦õ§‹á†ÊþMˆ¦õ™‹M þøôüM€(öM8†ˆ›»ìò†ì†ÒöM~P†M*þM~b„üM „þò„þò„þò„þò„þò„þè÷M}”†ˆ›­ìò†ÒöÞ“õþþøM{¼†ƒˆúþŸM}<ƒùꆆöM|8†ˆ¦õ·ä†‹Ø’ÍþøôüÒMzt†ˆ›M{¬ìò†ì†ìòòò†ÒöʆˆþöMl8†ˆ›‹†‹úþŸMyäƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöMwȆ„„üMxŠþò„þò„þò„þò„þò„þéöMn(†„„‘úþŸMv<„„‘úþŸMw¬„„þöꆈþöMv¨†ˆ¦õ·ä†‹Ø’ÍþøôüþàöMr8†„„‘úþŸMv„„þöꆄ‚öꆄ‚öMs€†ˆ‰úþŸMu¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöMt†ˆ¦õ·ä†‹Ø’ÍþøôüÖöMr°†ˆ¦õ·ä†‹Ø’ÍþøôüþàöMp †„„‘úþŸMr„„þöꆆöMq†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ„þöMop†ˆ‰ˆ­‘ü¤þò„þò„þÕ†ì†ÜöMn †ˆ¦õ·ä†‹Ø’Íþøôüþàöà†ˆþöMm†ˆ¦õ·ä†‹Ø’ÍþøôüMlPöMi¤†ƒúþŸMl,ƒùꆄ‚öꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ‚öꆈþöMj†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùMh°†ˆ›»ì†ì†ì†ÒöM_ †ˆ›Mh M_ˆ†‹šøMh(þŽþþM_ÂMhM_¾þŸMhƒùMfô†ˆ¦õMgèìò†ì†ì†ÊþøMeð†ˆ¦õMfäìò†ì†ì†ÊþøMe\†ˆ¦õ™ÊþøMd¬†ˆ¦õ§ì†ÊþøMcĆˆ¦õ¯†ì†ì†ÊþøMb܆ˆ¦õ¯†ì†ì†ÊþøMb†ˆ¦õ¡†ì†ÊþøMa`†ˆ¦õ§ì†ëßþøM`„M`¬ˆ¦õ§‹á†ÊþM`ˆ¦õ™‹M`þøôüM_8öM]T†ƒúþŸM_ƒùꆄ‚öꆄ‚öꆆöM]À†ˆ¦õ·ä†‹Ø’ÍþøôüÚM0„M]HƒM0œƒšøM\ØþŽþþM0ºM\ÄM0¶þŸM\´ƒùM\†ˆ¦õ™ÊþøM[€†ˆ¦õ™ÊþøMZ솈¦õ™ÊþøM8l†ˆ¦õMW\‹úþŸMZàƒùꆄ‚öꆄ‚öꆄ„þöMXĆ„„‰úþŸMZPƒùꆆöMYL†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöMW̆ˆ¦õ·ä†‹Ø’Íþøôü†ì†ä†‹M9†‹ˆšøMV€þŽþþM9JMEpøMVþŽþþMEŽMUüMEŠþŸMUìƒùMU0†ˆ¦õ§ì†ÊþøMT€†ˆ¦õ§ì†ÊþøMSІˆ¦õ§ì†ÊþøMG܆ˆ¦õMSÀMHp†‹šøMSHþŽþþMHªMNÌøMRØþŽþþMNêMRÄMNæþŸMR´ƒùMQ膈¦õ§‹á†ÊþøMQ8†ˆ¦õ“†ÊþøMPˆ†ˆ¦õ§ì†ëßþøMO,„MOÔˆ¦õ§‹á†ÊþMO8ˆ¦õ™‹MODþøôüMH¦þŸMN¼ƒùMN†ˆ¦õ§ì†ÊþøMMP†ˆ¦õ“†ÊþøML †ˆ¦õ“†ÊþøMK¨†ˆ¦õ¯†‹á†ì†ÊþøMJø†ˆ¦õ“†ÊþøMJH†ˆ¦õ§ì†ëßþøMHì„MI”ˆ¦õ§‹á†ÊþMHøˆ¦õ™‹MIþøôü†ÊþøMG,†ˆ¦õ§ì†ëßþøMEЄMFxˆ¦õ§‹á†ÊþME܈¦õ™‹MEèþøôüM9FþŸME`ƒùMC†ˆ¦õµ‹úþŸMEHƒùà†ˆþöMD0†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÊþøMB†ˆ¦õMBôì†ì†ì†ÊþøM?ü†ˆ¦õ§‹úþŸMBƒùꆆöMA †ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøM?L†ˆ¦õ§ì†ÊþøM>œ†ˆ¦õ“†ÊþøM;˜†ˆ¦õ¡†‹úþŸM>tƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆈþöM<¨†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøM:膈¦õ§ì†ëßþøM9Œ„M:4ˆ¦õ§‹á†ÊþM9˜ˆ¦õ™‹M9¤þøôüM8ä†ÊþøM64†ˆ¦õ§“úþŸM8`ƒùꆄ‚öꆆöM74†ˆ¦õ·ä†‹Ø’ÍþøôüʆÊþøM5„†ˆ¦õ“†ÊþøM4ð†ˆ¦õ™ÊþøM4\†ˆ¦õ™ÊþøM3Ȇˆ¦õ™ÊþøM3†ˆ¦õ§‹á†ÊþøM2X†ˆ¦õ§ì†ëßþøM0ü„M1¤ˆ¦õ§‹á†ÊþM1ˆ¦õ™‹M1þøôüÚM/¸†ˆ›»ì†ì†ì†ÒöM-üƒŽúþŸM/¬ƒùꆄ„þöꆄ‚öꆆöM.X†ˆ¦õ·ä†‹Ø’ÍþøôüÜò†ƒùM*¨†ƒˆúþŸM-̃ùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöM+$†ˆ¦õ·ä†‹Ø’ÍþøôüÒM)†ƒˆúþŸM*œƒùꆆöM)˜†ˆ¦õ·ä†‹Ø’ÍþøôüÒM&†ƒˆúþŸM)ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†ˆþöM&|†ˆ¦õ·ä†‹Ø’ÍþøôüÒM%d†ƒˆˆ™òÞM"4†ƒŽúþŸM%Xƒùꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆈþöM"œ†ˆ¦õ·ä†‹Ø’ÍþøôüÜM!”†M"&þò„þò„þò„þæ„üò÷M ¸†ƒŽüM!†þò„þò„þò„þò„þò„þò„þåM†ƒˆúþŸM ¬ƒùꆄ„þöꆆöM€†ˆ¦õ·ä†‹Ø’ÍþøôüÒM(†ƒˆúþŸMøƒùꆄ„þöꆄ„þöꆈþöM¤†ˆ¦õ·ä†‹Ø’ÍþøôüÒM `†ˆ›MìòM Ȇ‹šøMhþŽþþM MTM þþŸMDƒùMˆ†ˆ¦õ§ì†ÊþøM؆ˆ¦õ§ì†ÊþøMð†ˆ¦õMÈì†ìò†ÊþøM$†ˆ¦õµìò†ÊþøMX†ˆ¦õµì†ì†ÊþøMp†ˆ¦õMHì†ìò†ÊþøMl†ˆ¦õM`ì†ìòò†ÊþøM„†ˆ¦õM\ì†ìò†ÊþøMœ†ˆ¦õMtì†ìò†ÊþøM|†ˆ¦õMŒì†ì†ìòò†ÊþøM̆ˆ¦õ§ì†ÊþøM†ˆ¦õµìò†ÊþøM†ˆ¦õMðìòò†ÊþøML†ˆ¦õµìò†ÊþøM P†ˆ¦õµ‹úþŸM@ƒùꆄ‚öML†ˆ‰úþŸMƒùꆄ„þöꆈþöMÔ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöM |†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøM  †ˆ¦õ§ì†ëßþøM D„M 숦õ§‹á†ÊþM Pˆ¦õ™‹M \þøôüM xöMp†ˆ›Ÿ‹úþŸM Tƒùꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöMp†ˆ¦õ·ä†‹Ø’Íþøôü†ÒöMœƒˆúþŸMdƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆆöM †ˆ¦õ·ä†‹Ø’ÍþøôüÒLù †ƒˆúþŸM„ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöꆄ‚öꆄ‚öꆄ‚öꆆöLùœ†ˆ¦õ·ä†‹Ø’ÍþøôüÒL÷0†ƒŽúþŸLùƒùꆄ„þöꆄ‚öꆄ‚öꆆöL÷˜†ˆ¦õ·ä†‹Ø’ÍþøôüÜLõh†ƒŽúþŸL÷$ƒùꆄ‚öꆄ‚öꆆöLõІˆ¦õ·ä†‹Ø’ÍþøôüÜLót†ˆ›LõXLóΊúþŸLõ@ƒùꆆöLô<†ˆ¦õ·ä†‹Ø’ÍþøôüLóŒöLñ”†ƒúþŸLóhƒùꆄ‚öꆄ‚öà†ˆþöLò†ˆ¦õ·ä†‹Ø’ÍþøôüÚL句ƒŽúþŸLñˆƒùꆄ‚öꆄ‚öꆄ‚öꆆöL𠆈¦õ·ä†‹Ø’ÍþøôüÜL솃úþŸLùꆄ‚öLíd†„„‘úþŸLïXƒùꆄ‚öꆄ‚öꆄ‚öꆆöLí܆ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆈþöLìl†ˆ¦õ·ä†‹Ø’ÍþøôüÚLëP†ˆ›§ÝŠÕöLêh†LëBþLêz„üLë"„þò„þò„þò„þò„þò„þè÷؆ˆþö؆ˆþöò†ƒùö†üLↈ›Lé˜Lâø†‹šøLé þŽþþLã2Lé Lã.þŸLèüƒùLè@†ˆ¦õ§ì†ÊþøL熈¦õ§ì†ÊþøLæà†ˆ¦õ§ì†ÊþøLæ0†ˆ¦õ§ì†ÊþøL倆ˆ¦õ§ì†ÊþøLäІˆ¦õ§ì†ëßþøLãt„L䈦õ§‹á†ÊþL〈¦õ™‹LãŒþøôüLâ¨öLÖ(†ˆ›Lâ€LÖ†‹šøLâþŽþþLÖÊLáôLÖÆþŸLáäƒùLá(†ˆ¦õ§ì†ÊþøLàx†ˆ¦õ§ì†ÊþøL߸†ˆ¦õ§‹á†ÊþøLÞ솈¦õµì†ì†ÊþøLÞ †ˆ¦õµì†ì†ÊþøLÝp†ˆ¦õ§ì†ÊþøLÜÀ†ˆ¦õ§ì†ÊþøL܆ˆ¦õ§ì†ÊþøLÛ`†ˆ¦õ§ì†ÊþøLÚ°†ˆ¦õ§ì†ÊþøLÙȆˆ¦õ¯ò†ì†ÊþøLÙ†ˆ¦õ§ì†ÊþøLØh†ˆ¦õ§ì†ëßþøL× „L×´ˆ¦õ§‹á†ÊþL׈¦õ™‹L×$þøôüLÖ@öLÕP†ˆ›»ì†ì†ì†ÒöLÑXˆ›‘‹úþŸLÕDƒùꆄ„þöꆄ„þöꆄ„þöLÓ†ˆ‰úþŸLÔ´ƒùꆄ„þöꆈþöLÓˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöLÒ0†ˆ¦õ·ä†‹Ø’ÍþøôüLÑdöLÐL†LÑ>þò„þò„þò„þò„þò„þ΄ü”„þò„þè÷Lφˆ›­ì†ì†ÒöLθ†ˆ›»ìò†ì†Òöò†ƒùLÌØ†ƒŽúþŸLΔƒùꆄ„þöꆄ‚öꆈþöLÍ@†ˆ¦õ·ä†‹Ø’ÍþøôüÜLÁÄ„LÌ̃LÁЃšøLÌ\þŽþþLÁîLÌHLÁêþŸLÌ8ƒùLË`†ˆ¦õµì†ì†ÊþøLÊ”†ˆ¦õµì†ì†ÊþøLÉȆˆ¦õµì†ì†ÊþøLÈà†ˆ¦õLɸì†ì†ì†ÊþøLȆˆ¦õµì†ì†ÊþøLÇ,†ˆ¦õLÈì†ìò†ÊþøLÆD†ˆ¦õLÇì†ìò†ÊþøLÅ@†ˆ¦õLÆ4ì†ì†ì†ì†ÊþøLÄ<†ˆ¦õLÅ0ì†ì†ì†ì†ÊþøLÃŒ†ˆ¦õ§ì†ëßþøLÂ0„LÂØˆ¦õ§‹á†ÊþLÂ<ˆ¦õ™‹LÂHþøôüÚLÀL†LÁ¶þò„þò„þò„þò„þò„þò„þLÀ^„üLÁ„þò„þò„þò„þò„þò„þè÷L¿†ˆ›LÀ<ìò†ì†ì†ìò†ìØöÞ“õþþøè†ƒˆñL½ì†ˆ›‹Øö憃ùL¼ð†ˆ›­‹á†ìØöò†ƒùL»`†ƒˆˆ™†‹ˆ‹†‹ŠþŸŒƒùôüL»¨†ØLºÜ†ˆ›‘ÒöLº†ˆ›»ì†ì†ì†ÒöL¹,†ˆ›»ì†ì†ì†ÒöL´h†ˆ›L¹ì†L´Ð†‹úþŸL¸èƒùL¶†ˆ‰úþŸL¸ÐƒùL¸†„„‰ˆ™†ì†ÜöL·t†ˆ‰ˆ™†ì†ÜöL¶¤†ˆ¦õ·ä†‹Ø’ÍþøôüÖöLµL†ˆ¦õ·ä†‹Ø’ÍþøôüL´€öˆ›ãöL±x†ƒúþŸL³Øƒùꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆈþöL±ä†ˆ¦õ·ä†‹Ø’ÍþøôüÚL¯x†ˆŸŠúþŸL±lƒùꆄ„þöꆈþöL°@†ˆ¦õ·ä†‹Ø’ÍþøôüL¯öL­`†ƒŽúþŸL¯lƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöL­È†ˆ¦õ·ä†‹Ø’ÍþøôüÜL¬¤†ˆ›™ò†ÒöL¬ †ˆ›‘ÒöL¦Œ†ƒŽúþŸL¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öL§Ä†ˆ‘úþŸL«\ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöL¨<†ˆ¦õ·ä†‹Ø’ÍþøôüÞöL¦ô†ˆ¦õ·ä†‹Ø’ÍþøôüÜL¥ˆ†ˆ›L¦|Ȇ‹ˆ‘ȆÒöLŸ<†ƒˆúþŸL¥|ƒùꆄ‚öꆄ‚öL¡(†„„‰úþŸL¥ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöL¢€†ˆ‰úþŸL¤4ƒùꆄ„þöꆈþöL£†ˆ¦õ·ä†‹Ø’ÍþøôüÖöL¡°†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚öꆄ‚öꆈþöLŸ¸†ˆ¦õ·ä†‹Ø’ÍþøôüÒL˜¼†ƒˆúþŸLŸ „‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öL›€†„„‰ˆ»ì†ì†ìâöL𨆄„‰ˆ­ìòâöLš0†„„‰ˆ­ìòâöꆆöL™8†ˆ¦õ·ä†‹Ø’ÍþøôüÒL—0†ƒˆúþŸL˜°ƒùꆈþöL—¬†ˆ¦õ·ä†‹Ø’ÍþøôüÒL–X†ˆ›»ìò†ì†ÒöL”h†ƒˆúþŸL–Lƒùꆄ‚öꆄ‚öà†ˆþöL”䆈¦õ·ä†‹Ø’ÍþøôüÒL“†ˆ›»ì†ì†ì†ÒöL~@†ˆ›L@‹šøL“$þŽþþLnL“LjþŸL“ƒùL‹†ˆ¦õµ‹šøL’ˆþŽþþL‹êL’tL‹æþŸL’dƒùL‘Ćˆ¦õ™ÊþøL‘0†ˆ¦õ™ÊþøLœ†ˆ¦õ™ÊþøL솈¦õ“†ÊþøL<†ˆ¦õ§ì†ÊþøLŽ8†ˆ¦õL,ì†ì†ì†ì†ÊþøLˆ†ˆ¦õ§ì†ëßþøLŒ,„LŒÔˆ¦õ§‹á†ÊþLŒ8ˆ¦õ™‹LŒDþøôüÂò†ÊþøLŠP†ˆ¦õ§ì†ÊþøL‰ †ˆ¦õ“†ÊþøLˆœ†ˆ¦õL‰ìòòò†ÊþøL‡Ð†ˆ¦õµìò†ÊþøLƒŒ†ˆ¦õµ‹úþŸL‡Äƒùꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆆöL„¸†ˆ¦õ·ä†‹Ø’Íþøôü†ì†ÊþøL‚ˆ†ˆ¦õLƒ|ì†ìòò†ÊþøL¼†ˆ¦õµì†ì†ÊþøL †ˆ¦õ§ì†ëßþøL°„L€Xˆ¦õ§‹á†ÊþL¼ˆ¦õ™‹LÈþøôüÂòò†ì†ì†ÒöLvƒˆúþŸL~4ƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöL{ †„„‰úþŸL}Tƒùꆄ„þöꆈþöL|(†ˆ¦õ·ä†‹Ø’ÍþøôüÖöLyà†„„‰úþŸL{”ƒùꆄ„þöꆈþöLzh†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöLx †„„‰úþŸLy¬ƒùꆈþöLx¨†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆈþöLw†ˆ¦õ·ä†‹Ø’ÍþøôüÒLr€†ƒˆúþŸLvxƒùLt”†„„‘úþŸLv`ƒùꆄ‚öꆄ‚öꆆöLu †ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöLrü†ˆ¦õ·ä†‹Ø’ÍþøôüÒLnH†ƒúþŸLrtƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöLn´†ˆ¦õ·ä†‹Ø’ÍþøôüÚLm†ˆ›Ln8ì†ì†ì†ì†ì†ì†ìØöLk4†ƒúþŸLlôƒùꆄ‚öꆄ‚öꆆöLk †ˆ¦õ·ä†‹Ø’ÍþøôüÚLhȆƒúþŸLk(ƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆈþöLi4†ˆ¦õ·ä†‹Ø’ÍþøôüÚØ†ˆþöö†üLg”†ˆ›»ì†ì†ì†ÒöLf¼†ˆ›»ì†ì†ì†ÒöLe䆈›»ì†ì†ì†Òö؆ˆþöLdÀ†ˆ›»ìòò†ÒöLc膈›»ìòò†ÒöLbƒˆúþŸLc܃ùꆄ‚öꆄ‚öꆆöLbˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒLaˆ†ˆ›‘ÒöL`膈›‹†ÒöL_H†ƒŽúþŸL`܃ùꆄ‚öꆆöL_°†ˆ¦õ·ä†‹Ø’ÍþøôüÜL^Ćˆ›‘ÒöLP†ƒŽúþŸL^¸ƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ„þöLQx†„„‰ˆL]¬LQ̆‹úþŸL]”ƒùꆄ‚öꆄ„þöꆄ‚öLS@†„„‰úþŸL]ƒùꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöLX¨†„„‘úþŸL[ÔƒùLZ†„„‘úþŸL[¼ƒùꆄ„þöꆈþöLZ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆈþöLY †ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöLV¨†„„‘úþŸLXtƒùꆄ‚öꆄ„þöꆆöLW †ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öLT˜†ˆ‰úþŸLVtƒùꆄ„þöꆄ‚öꆈþöLU †ˆ¦õ·ä†‹Ø’ÍþøôüÖöLSȆˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöLRH†ˆ¦õ·ä†‹Ø’ÍþøôüLQöꆈþöLP€†ˆ¦õ·ä†‹Ø’ÍþøôüÜð†ƒùö†üKÅ´†ˆ›LOÜKƆ‹šøLOdþŽþþKÆVLOPKÆRþŸLO@ƒùLN„†ˆ¦õ§ì†ÊþøLMÔ†ˆ¦õ§ì†ÊþøLM$†ˆ¦õ§ì†ÊþøLK†ˆ¦õ§‹ŽüLMþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þ͆ÊþøLJd†ˆ¦õ§ì†ÊþøLI´†ˆ¦õ§ì†ÊþøLI†ˆ¦õ§ì†ÊþøLHT†ˆ¦õ§ì†ÊþøLG¤†ˆ¦õ§ì†ÊþøLFô†ˆ¦õ§ì†ÊþøLFD†ˆ¦õ§ì†ÊþøLE\†ˆ¦õLF4ì†ì†ì†ÊþøLDt†ˆ¦õLELì†ì†ì†ÊþøLC¨†ˆ¦õµì†ì†ÊþøLB܆ˆ¦õµì†ì†ÊþøLB,†ˆ¦õ§ì†ÊþøKÜØ†ˆ¦õ§‹ˆšøLAÀþŽþþKݶLA¬KݲþŸLAœƒùL0ü†ˆ¦õ§‹ˆšøLA$þŽþþL1ÚLAL1ÖþŸLAƒùL@D†ˆ¦õ§ì†ÊþøL?”†ˆ¦õ§ì†ÊþøL4(†ˆ¦õ§‹ˆšøL?(þŽþþL5L?L5þŸL?ƒùL>,†ˆ¦õµì†ì†ÊþøL=`†ˆ¦õµì†ì†ÊþøL<”†ˆ¦õµì†ì†ÊþøL;Ȇˆ¦õµìò†ÊþøL;†ˆ¦õ§ì†ÊþøL:0†ˆ¦õL;ì†ì†ì†ÊþøL9H†ˆ¦õL: ì†ì†ì†ÊþøL8˜†ˆ¦õ§ì†ÊþøL8†ˆ¦õ™ÊþøL7T†ˆ¦õ§ì†ÊþøL6¤†ˆ¦õ§ì†ëßþøL5H„L5ðˆ¦õ§‹á†ÊþL5Tˆ¦õ™‹L5`þøôüL4 †ÊþøL3x†ˆ¦õ§ì†ëßþøL2„L2Ĉ¦õ§‹á†ÊþL2(ˆ¦õ™‹L24þøôüL1t†ÊþøL,L†ˆ¦õ§‹ˆšøL0þŽþþL-*L0|L-&þŸL0lƒùL/x†ˆ¦õL0Pì†ì†ì†ÊþøL.Ȇˆ¦õ§ì†ëßþøL-l„L.ˆ¦õ§‹á†ÊþL-xˆ¦õ™‹L-„þøôüL,ĆÊþøL+œ†ˆ¦õ§ì†ÊþøL*솈¦õ§ì†ÊþøL L†ˆ¦õµ‹ˆšøL*€þŽþþL!FL*lL!BþŸL*\ƒùL) †ˆ¦õ§ì†ÊþøL(Ô†ˆ¦õµì†ì†ÊþøL(†ˆ¦õµì†ì†ÊþøL'X†ˆ¦õ§ì†ÊþøL&Œ†ˆ¦õµì†ì†ÊþøL%À†ˆ¦õµì†ì†ÊþøL$ô†ˆ¦õµì†ì†ÊþøL$(†ˆ¦õµì†ì†ÊþøL#”†ˆ¦õ™ÊþøL"䆈¦õ§ì†ëßþøL!ˆ„L"0ˆ¦õ§‹á†ÊþL!”ˆ¦õ™‹L! þøôüL à†ì†ÊþøL„†ˆ¦õ§‹ˆšøLàþŽþþLbLÌL^þŸL¼ƒùL†ˆ¦õ§ì†ëßþøL¤„LLˆ¦õ§‹á†ÊþL°ˆ¦õ™‹L¼þøôüLü†ÊþøL¸†ˆ¦õµì†ì†ÊþøLÔ†ˆ¦õµ‹ˆšøLLþŽþþLÎL8LÊþŸL(ƒùLl†ˆ¦õ§ì†ëßþøL„L¸ˆ¦õ§‹á†ÊþLˆ¦õ™‹L(þøôüLh†ì†ÊþøL솈¦õµ‹ˆšøLhþŽþþLæL PøLøþŽþþL nL ÄøLˆþŽþþL âLtL ÞþŸLdƒùL¨†ˆ¦õ§ì†ÊþøLø†ˆ¦õ§ì†ÊþøLH†ˆ¦õ§ì†ÊþøL`†ˆ¦õL8ìòò†ÊþøL°†ˆ¦õ§ì†ÊþøL䆈¦õµìò†ÊþøL†ˆ¦õ¡ò†ÊþøL0†ˆ¦õLìòò†ÊþøL€†ˆ¦õ§ì†ëßþøL$„L̈¦õ§‹á†ÊþL0ˆ¦õ™‹L<þøôüL jþŸL ´ƒùL ¼†ˆ¦õµ‹ˆÙò†ÊþøL †ˆ¦õ§ì†ëßþøL °„L Xˆ¦õ§‹á†ÊþL ¼ˆ¦õ™‹L ÈþøôüLâþŸL @ƒùL „†ˆ¦õ§ì†ëßþøL(„LЈ¦õ§‹á†ÊþL4ˆ¦õ™‹L@þøôüL€†ì†ÊþøL܆ˆ¦õL´‹ˆšøL€þŽþþLòLlLîþŸL\ƒùL †ˆ¦õ§ì†ÊþøLð†ˆ¦õ§ì†ÊþøL@†ˆ¦õ§ì†ÊþøL†ˆ¦õ§ì†ëßþøL4„L܈¦õ§‹á†ÊþL@ˆ¦õ™‹LLþøôüLŒ†ì†ì†ÊþøKú膈¦õµ‹ˆšøLpþŽþþKûâL\KûÞþŸLLƒùKÿ†ˆ¦õ§ì†ÊþøKþà†ˆ¦õ§ì†ÊþøKþ0†ˆ¦õ§ì†ÊþøKý€†ˆ¦õ§ì†ëßþøKü$„Kü̈¦õ§‹á†ÊþKü0ˆ¦õ™‹Kü<þøôüKû|†ì†ÊþøK÷†ˆ¦õµ‹ˆšøKú|þŽþþK÷þKúhK÷úþŸKúXƒùKùœ†ˆ¦õ§ì†ëßþøKø@„Køèˆ¦õ§‹á†ÊþKøLˆ¦õ™‹KøXþøôüK÷˜†ì†ÊþøKö8†ˆ¦õµì†ì†ÊþøKõ4†ˆ¦õKö(ì†ì†ì†ì†ÊþøKôh†ˆ¦õµì†ì†ÊþøK󜆈¦õµì†ì†ÊþøKò솈¦õ§ì†ÊþøKêT†ˆ¦õ§‹ˆšøKò€þŽþþKë2KòlKë.þŸKò\ƒùKñ †ˆ¦õ§ì†ÊþøKðð†ˆ¦õ§ì†ÊþøKð@†ˆ¦õ§ì†ÊþøK¦õ§ì†ÊþøKîà†ˆ¦õ§ì†ÊþøKî0†ˆ¦õ§ì†ÊþøK퀆ˆ¦õ§ì†ÊþøKìІˆ¦õ§ì†ëßþøKët„K숦õ§‹á†ÊþK뀈¦õ™‹KëŒþøôüKê̆ÊþøK餆ˆ¦õ§ì†ÊþøKèô†ˆ¦õ§ì†ÊþøKèD†ˆ¦õ“†ÊþøKç°†ˆ¦õ™ÊþøKæä†ˆ¦õµì†ì†ÊþøKæ4†ˆ¦õ§ì†ÊþøK儆ˆ¦õ§ì†ÊþøKäÔ†ˆ¦õ“†ÊþøKä$†ˆ¦õ§ì†ÊþøKãt†ˆ¦õ“†ÊþøKâĆˆ¦õ§ì†ÊþøKↈ¦õ“†ÊþøKád†ˆ¦õ§ì†ÊþøKà´†ˆ¦õ§ì†ÊþøKà†ˆ¦õ§ì†ÊþøKßT†ˆ¦õ§ì†ëßþøKÝø„KÞ ˆ¦õ§‹á†ÊþKÞˆ¦õ™‹KÞþøôüKÝP†ÊþøKÜ †ˆ¦õµìò†ÊþøKÛ\†ˆ¦õ§ì†ÊþøKÚ¬†ˆ¦õ§ì†ÊþøKÙü†ˆ¦õ§ì†ÊþøKÙL†ˆ¦õ§ì†ÊþøKØœ†ˆ¦õ§ì†ÊþøK×솈¦õ§ì†ÊþøK×<†ˆ¦õ§ì†ÊþøKÖŒ†ˆ¦õ§ì†ÊþøKÕ܆ˆ¦õ§ì†ÊþøKÕ,†ˆ¦õ§ì†ÊþøKÔ`†ˆ¦õµì†ì†ÊþøKÍ †ˆ¦õµ‹ˆšøKÓôþŽþþKÎKÓàKÎþŸKÓЃùKÒø†ˆ¦õµìò†ÊþøKÒH†ˆ¦õ§ì†ÊþøKј†ˆ¦õ§ì†ÊþøKцˆ¦õ™ÊþøKÐT†ˆ¦õ§ì†ÊþøKϤ†ˆ¦õ§ì†ëßþøKÎH„KÎðˆ¦õ§‹á†ÊþKÎTˆ¦õ™‹KÎ`þøôüKÍ †ì†ÊþøKÌ0†ˆ¦õµ‹á†ì†ÊþøKË€†ˆ¦õ§ì†ÊþøKÊІˆ¦õ§ì†ÊþøKÊ †ˆ¦õ§ì†ÊþøKÉp†ˆ¦õ§ì†ÊþøKȤ†ˆ¦õµì†ì†ÊþøKÇô†ˆ¦õ§ì†ëßþøKƘ„KÇ@ˆ¦õ§‹á†ÊþKƤˆ¦õ™‹KưþøôüKÅÌö؆ˆþöKĆˆ›»ì†ì†ì†ÒöK¼X†ˆ›‘‹šøKÄ$þŽþþK¼úKÄK¼öþŸKăùKÁL†ˆ¦õKÃäKÁü†‹úþŸKÃ̃ùꆄ„þöꆄ‚öꆆöKÂx†ˆ¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøKÀœ†ˆ¦õ“†ÊþøKÀ†ˆ¦õ™ÊþøK¿H†ˆ¦õ§‹á†ÊþøK¾˜†ˆ¦õ§ì†ëßþøK½<„K½äˆ¦õ§‹á†ÊþK½Hˆ¦õ™‹K½TþøôüK¼pöK»œ†ˆ›­ìò†ÒöK¹ †ƒˆúþŸK»ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöK¹ˆ†ˆ¦õ·ä†‹Ø’ÍþøôüÒK´$ƒˆúþŸK¹ƒùK¶,†„„‘úþŸK¸èƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöK¶¤†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆöK´”†ˆ¦õ·ä†‹Ø’ÍþøôüÒK­¸†ƒˆúþŸK´ ƒùꆄ‚öꆄ‚öK±P†„„‰úþŸK³¤ƒùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆆöK±Ø†ˆ¦õ·ä†‹Ø’ÍþøôüÖöK¯†„„‘úþŸK±Dƒùꆄ„þöↈ‰õöK°†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öà†ˆþöK®4†ˆ¦õ·ä†‹Ø’ÍþøôüÒK§\†ƒúþŸK­¬ƒùꆄ‚öꆄ‚ö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöK§È†ˆ¦õ·ä†‹Ø’ÍþøôüÚK¥h†ˆ›‘‹úþŸK§PƒùꆆöK¦L†ˆ¦õ·ä†‹Ø’ÍþøôüK¥€öK£`†ƒúþŸK¥\ƒùꆄ„þöꆄ„þöꆄ‚öà†ˆ‰õöK£Ì†ˆ¦õ·ä†‹Ø’ÍþøôüÚK ¬†ˆ›K£PìK¡L†‹úþŸK£ƒùꆄ‚öꆄ„þöꆆöK¡È†ˆ¦õ·ä†‹Ø’ÍþøôüÂòùßöK—t†ˆ›Ÿ‹úþŸK  ƒùꆄ‚öK™D†ˆ‰ˆúþŸK `ƒùꆄ‚öKœ”†„„‰úþŸK  ƒùꆄ‚öꆄ‚öKž(†„„‘úþŸKŸ¸ƒùà†ˆþöKž †ˆ¦õ·ä†‹Ø’ÍþøôüÞöà†ˆþöK†ˆ¦õ·ä†‹Ø’ÍþøôüÖöKš¬†ˆ‰úþŸKœˆƒùꆄ‚öꆄ‚öꆈþöK›4†ˆ¦õ·ä†‹Ø’ÍþøôüÖöK™Ü†ˆ¦õ·ä†‹Ø’ÍþøôüÎöK˜t†ˆ¦õ·ä†‹Ø’Íþøôü†Òöð†üK–€†ˆ›»ì†ì†ìØöK3¬†ˆ›K–pK4†‹šøK•øþŽþþK4NK•äK4JþŸK•ÔƒùK”ü†ˆ¦õµì†ì†ÊþøK”0†ˆ¦õµì†ì†ÊþøK“€†ˆ¦õ§ì†ÊþøK’´†ˆ¦õµì†ì†ÊþøK‘̆ˆ¦õ¯†ì†ì†ÊþøK‹ †ˆ¦õµ‹ˆšøK‘`þŽþþKŒK‘LKŒþŸK‘<ƒùKH†ˆ¦õK‘ ì†ìò†ÊþøK˜†ˆ¦õ“†ÊþøK†ˆ¦õ™ÊþøKŽT†ˆ¦õ§ì†ÊþøK¤†ˆ¦õ§ì†ëßþøKŒH„KŒðˆ¦õ§‹á†ÊþKŒTˆ¦õ™‹KŒ`þøôüK‹ ò†ÊþøKІˆ¦õKŠüì†ìò†ì†ÊþøK‰X†ˆ¦õ“†ÊþøK6œ†ˆ¦õ§‹ˆšøKˆìþŽþþK7zKˆØK7vþŸKˆÈƒùK;¼†ˆ¦õKˆ¬K&K‡¸K>"þŸK‡¨ƒùK|䆈¦õKü‹úþŸK‡ƒùꆄ‚öK…Ć„„‰úþŸK‡PƒùꆆöK†L†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöK„†„„‰úþŸK…ƒùꆆöK„Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöK‚l†ˆ¦õ·ä†‹Ø’ÍþøôüK}x†‹úþŸKäƒùꆄ‚öK<†„„‰úþŸK¤ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöKĆˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚öꆆöK}ô†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøK|†ˆ¦õ¡ò†ÊþøKAœ†ˆ¦õ§‹šøK{¬þŽþþKBjKr8øK{<þŽþþKrVKw€øKzÌþŽþþKwžKz¸KwšþŸKz¨ƒùKy솈¦õ§ì†ÊþøKy<†ˆ¦õ§ì†ëßþøKwà„Kxˆˆ¦õ§‹á†ÊþKw숦õ™‹KwøþøôüKrRþŸKwpƒùKvІˆ¦õ™ÊþøKv †ˆ¦õ§ì†ÊþøKuT†ˆ¦õ¡†ì†ÊþøKt¤†ˆ¦õ§ì†ÊþøKsô†ˆ¦õ§ì†ëßþøKr˜„Ks@ˆ¦õ§‹á†ÊþKr¤ˆ¦õ™‹Kr°þøôüKBfþŸKr(ƒùKq†ˆ¦õKr ì†ì†ì†ì†ÊþøKp†ˆ¦õKqì†ì†ì†ì†ÊþøKo†ˆ¦õKpì†ìò†ì†ÊþøKn(†ˆ¦õKoìò†ì†ÊþøKm\†ˆ¦õµìò†ÊþøKl¬†ˆ¦õ§ì†ÊþøKkü†ˆ¦õ§ì†ÊþøKk†ˆ¦õKkìì†ì†ì†ÊþøKj,†ˆ¦õKkì†ì†ì†ÊþøKi|†ˆ¦õ§ì†ÊþøKh°†ˆ¦õµì†ì†ÊþøKg䆈¦õµì†ì†ÊþøKfü†ˆ¦õKgÔì†ì†ì†ÊþøKEh†ˆ¦õKfìì†ì†ì†KEü†‹šøKf þŽþþKF6Kf KF2þŸKeüƒùKe@†ˆ¦õ§ì†ÊþøKd†ˆ¦õ§ì†ÊþøKcü†ˆ¦õ™ÊþøKcL†ˆ¦õ§ì†ÊþøK`´†ˆ¦õ§‹úþŸKc@ƒùꆄ‚öꆄ‚öꆄ‚öꆆöKaĆˆ¦õ·ä†‹Ø’Íþøôü†ÊþøKQp†ˆ¦õ§‹ˆšøK`HþŽþþKRNK`4KRJþŸK`$ƒùK_†ˆ¦õK`ì†ì†ìò†ÊþøK^d†ˆ¦õ“†ÊþøK]´†ˆ¦õ§ì†ÊþøK\膈¦õµì†ì†ÊþøK\†ˆ¦õµìò†ÊþøK[P†ˆ¦õµì†ì†ÊþøKTœ†ˆ¦õ§‹ˆšøKZäþŽþþKUzKZÐKUvþŸKZÀƒùKY¼†ˆ¦õKZ¤ä†‹áò†ÊþøKY †ˆ¦õ“†ÊþøKXx†ˆ¦õ™ÊþøKWȆˆ¦õ§ì†ÊþøKW†ˆ¦õ§ì†ëßþøKU¼„KVdˆ¦õ§‹á†ÊþKUȈ¦õ™‹KUÔþøôüKU†ÊþøKS솈¦õ§ì†ëßþøKR„KS8ˆ¦õ§‹á†ÊþKRœˆ¦õ™‹KR¨þøôüKQè†ÊþøKP¤†ˆ¦õµì†ì†ÊþøKO؆ˆ¦õµì†ì†ÊþøKI4†ˆ¦õ§‹ˆšøKOlþŽþþKJKOXKJþŸKOHƒùKNT†ˆ¦õKO,ì†ìò†ÊþøKM¤†ˆ¦õ“†ÊþøKM†ˆ¦õ™ÊþøKL`†ˆ¦õ§ì†ÊþøKK°†ˆ¦õ§ì†ëßþøKJT„KJüˆ¦õ§‹á†ÊþKJ`ˆ¦õ™‹KJlþøôüKI¬†ÊþøKH„†ˆ¦õ§ì†ÊþøKGÔ†ˆ¦õ§ì†ëßþøKFx„KG ˆ¦õ§‹á†ÊþKF„ˆ¦õ™‹KFþøôü†ÊþøKD¸†ˆ¦õ§ì†ÊþøKD†ˆ¦õ§ì†ëßþøKB¬„KCTˆ¦õ§‹á†ÊþKB¸ˆ¦õ™‹KBÄþøôü†ÊþøKA†ˆ¦õ™ÊþøK@t†ˆ¦õ™ÊþøK?Ćˆ¦õ§ì†ëßþøK>h„K?ˆ¦õ§‹á†ÊþK>tˆ¦õ™‹K>€þøôüÖöꆆöK<膈¦õ·ä†‹Ø’ÍþøôüÂò†ÊþøK; †ˆ¦õ“†ÊþøK:x†ˆ¦õ™ÊþøK9Ȇˆ¦õ§ì†ÊþøK9†ˆ¦õ§ì†ëßþøK7¼„K8dˆ¦õ§‹á†ÊþK7Ȉ¦õ™‹K7ÔþøôüK7†ÊþøK5솈¦õ§ì†ëßþøK4„K58ˆ¦õ§‹á†ÊþK4œˆ¦õ™‹K4¨þøôüK3ÄöK2Ô†ˆ›»ì†ì†ì†Òö؆ˆþöK0˜†K2zþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þK0ª„üK1j„þò„þò„þò„þò„þò„þò„þè÷K*dƒŽúþŸK0ŒƒùK-à†„„‘úþŸK0tƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆆöK.X†ˆ¦õ·ä†‹Ø’ÍþøôüÞöK+†ˆ‘úþŸK-Ôƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöK,†ˆ¦õ·ä†‹Ø’ÍþøôüÞöK*À†ˆ¦õ·ä†‹Ø’ÍþøôüÜK(|†ƒˆúþŸK*Lƒùꆄ‚öꆄ‚öꆆöK(ø†ˆ¦õ·ä†‹Ø’ÍþøôüÒK'܆ˆ›‹†ÒöK&°†ˆ›K'¤†ìò†ìò†ì†ÒöK"솈›K&xK$Ć‹úþŸK&lƒùꆄ‚öꆆöK%@†ˆ¦õ·ä†‹Ø’ÍþøôüK#FŠúþŸK$¸ƒùꆆöK#´†ˆ¦õ·ä†‹Ø’ÍþøôüK#öK"h†ˆ›ãöK!¬†ˆ›­ì†ì†ÒöK䆃úþŸK! ƒùꆄ‚öꆄ‚öꆄ‚öK„†„„‰úþŸK!ƒùꆆöK †ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöà†ˆþöKP†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†üK¼†ˆ›§†‹úþŸK„„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öà†ˆþöK؆ˆ¦õ·ä†‹Ø’Íþøôü†ìØöK”†ˆ›‹†‹šøK4þŽþþK6K K2þŸKƒùK†ˆ¦õKôì†ì†ì†ÊþøKl†ˆ¦õ“†ÊþøK„†ˆ¦õK\ì†ìò†ÊþøKÔ†ˆ¦õ§ì†ëßþøKx„K ˆ¦õ§‹á†ÊþK„ˆ¦õ™‹KþøôüK¬öK¼†ˆ›»ì†ì†ì†ÒöKàˆ›K¬ä†‹á†ìØöKÔ†ˆŸŠúþŸKȃùꆄ„þöꆈþöKœ†ˆ¦õ·ä†‹Ø’ÍþøôüKìöKH†ƒˆúþŸKȃùꆆöKĆˆ¦õ·ä†‹Ø’ÍþøôüÒK l†ƒˆúþŸK<ƒùꆄ„þöꆄ„þöꆄ‚öK ô†„„‰’úþŸK¬ƒùꆄ‚öꆆöK €†ˆ¦õ·ä†‹Ø’ÍþøôüÔöà†ˆþöK 膈¦õ·ä†‹Ø’ÍþøôüÒK x†ˆ›µ†ì†ìò†ÒöK܆ƒúþŸK lƒùꆄ‚öKx†„„‰úþŸK ,ƒùꆄ‚öꆈþöK †ˆ¦õ·ä†‹Ø’ÍþøôüÖöK†ˆ‘úþŸKlƒùꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öKˆ†„„‰úþŸKŒƒùꆄ‚öꆄ„þöꆄ‚öꆆöK†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöK†ˆ¦õ·ä†‹Ø’ÍþøôüÞöKH†ˆ¦õ·ä†‹Ø’ÍþøôüÚK †ˆ›­ì†ì†ÒöKH†ˆ›»ì†ì†ì†ÒöJú†ˆ›K8ìò†Jú„†‹šøKˆþŽþþJú¾KtJúºþŸKdƒùJÿp†ˆ¦õKHìò†ì†ÊþøJþl†ˆ¦õJÿ`ìò†ì†ì†ÊþøJý¼†ˆ¦õ§ì†ÊþøJý †ˆ¦õ“†ÊþøJü\†ˆ¦õ§ì†ëßþøJû„Jû¨ˆ¦õ§‹á†ÊþJû ˆ¦õ™‹JûþøôüJú4öJØ´†ˆ›Jú JÙ†‹šøJù”þŽþþJÙVJù€JÙRþŸJùpƒùJø´†ˆ¦õ§ì†ÊþøJø†ˆ¦õ§ì†ÊþøJ÷T†ˆ¦õ§ì†ÊþøJö¤†ˆ¦õ§ì†ÊþøJõô†ˆ¦õ§ì†ÊþøJõD†ˆ¦õ§ì†ÊþøJô”†ˆ¦õ§ì†ÊþøJó䆈¦õ§ì†ÊþøJó4†ˆ¦õ§ì†ÊþøJò„†ˆ¦õ§ì†ÊþøJñÔ†ˆ¦õ§ì†ÊþøJñ$†ˆ¦õ§ì†ÊþøJðt†ˆ¦õ§ì†ÊþøJ݆ˆ¦õJÝÜ‹ˆšøJðþŽþþJÞJïôJÞþŸJïäƒùJï(†ˆ¦õ§ì†ÊþøJîx†ˆ¦õ§ì†ÊþøJíȆˆ¦õ§ì†ÊþøJìü†ˆ¦õµì†ì†ÊþøJì0†ˆ¦õµì†ì†ÊþøJ뀆ˆ¦õ§ì†ÊþøJêІˆ¦õ§ì†ÊþøJê †ˆ¦õ§ì†ÊþøJép†ˆ¦õ§ì†ÊþøJèÀ†ˆ¦õ§ì†ÊþøJçØ†ˆ¦õ¯ò†ì†ÊþøJç(†ˆ¦õ§ì†ÊþøJàh†ˆ¦õ§‹ˆšøJæ¼þŽþþJáFJæ¨JáBþŸJ昃ùJå܆ˆ¦õ“†ÊþøJå,†ˆ¦õ§ì†ÊþøJä|†ˆ¦õ§ì†ÊþøJ㔆ˆ¦õJälì†ì†ì†ÊþøJâ䆈¦õ§ì†ëßþøJሄJâ0ˆ¦õ§‹á†ÊþJᔈ¦õ™‹Já þøôüJàà†ÊþøJ߸†ˆ¦õ§ì†ëßþøJÞ\„J߈¦õ§‹á†ÊþJÞhˆ¦õ™‹JÞtþøôüJÝ´†ì†ì†ÊþøJÜT†ˆ¦õ§ì†ÊþøJÛ¤†ˆ¦õ“†ÊþøJÚô†ˆ¦õ§ì†ëßþøJÙ˜„JÚ@ˆ¦õ§‹á†ÊþJÙ¤ˆ¦õ™‹JÙ°þøôüJØÌöJ×܆ˆ›»ì†ì†ì†ÒöJ×<†‡ü¬„þò„þò„þò„þè÷JÕ|†J×.þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þJÕŽ„ü¸„þò„þò„þò„þò„þè÷JÌ膈›JÕlì†ì†JÍP†‹šøJÔ¼þŽþþJÍŠJÔ¨J͆þŸJÔ˜ƒùJÓ܆ˆ¦õ§ì†ÊþøJÓH†ˆ¦õ™ÊþøJÒ|†ˆ¦õµì†ì†ÊþøJÑ̆ˆ¦õ§ì†ëßþøJÑ8†ˆ¦õ™ÊþøJЈ†ˆ¦õ§ì†ÊþøJÏØ†ˆ¦õ§ì†ÊþøJÏ(†ˆ¦õ§ì†ëßþøJÍÌ„JÎtˆ¦õ§‹á†ÊþJÍØˆ¦õ™‹JÍäþøôüJÍöJËh†ˆ›J̰òò†ìò†ìò†ìò†ÒöJÉüƒŽúþŸJË\ƒùꆆöJÊX†ˆ¦õ·ä†‹Ø’ÍþøôüÜJÉ4†ˆ›­ìò†ÒöʆˆŸßöJ¿†ƒˆúþŸJÈÀƒùJdž„„‘úþŸJȨƒùꆄ‚öꆆöJÇ|†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJņ„„‘úþŸJÆøƒùꆄ‚öꆄ‚öꆄ‚öꆆöJÅ|†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öJÁœ†„„‘úþŸJÃàƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöJ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöJ¿Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÒJ¾Œ†ˆ›‘óßöJ¹†ƒúþŸJ¾€ƒùꆄ„þöꆄ„þöꆄ‚öJ»ü†„„‘úþŸJ½ðƒùꆄ‚öꆄ‚öꆄ‚öꆆöJ¼t†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJºL†ˆ‘úþŸJ»ðƒùꆄ‚öꆆöJºÄ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJ¹|†ˆ¦õ·ä†‹Ø’ÍþøôüÚJ²t†ƒˆúþŸJ¹ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöJµ”†„„‘úþŸJ·œ„‚öꆄ‚öꆄ‚öꆄ‚öà†ˆþöJ¶ †ˆ¦õ·ä†‹Ø’ÍþøôüþàöJ³À†ˆ‘úþŸJµx„‚öꆄ‚öà†ˆþöJ´8†ˆ¦õ·ä†‹Ø’ÍþøôüþàöJ²ð†ˆ¦õ·ä†‹Ø’ÍþøôüÒJ°H†ƒˆúþŸJ²hƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆈþöJ°Ä†ˆ¦õ·ä†‹Ø’ÍþøôüÒJ¯Œ†ˆ›­ì†ì†ÒöJª$†J¯~þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þJª6„üJ¬î„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þè÷J@(†ƒŽúþŸJªƒùJA؆„„‰úþŸJªƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöJ£Ô†„„‰úþŸJ¥°ƒùꆄ‚öꆄ‚öꆆöJ¤\†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöJ›ð†„„‰ˆšøJ¢ðþŽþþJœFJ¢ÜJœBþŸJ¢ÌƒùJ¢†ˆ¦õ§ì†ÊþøJ¡(†ˆ¦õJ¢ìòò†ÊþøJ †ˆ¦õJ¡ìòò†ì†ì†ÊþøJž”†ˆ¦õJŸøì†ì†ì†ìòò†ìò†ÊþøJ䆈¦õ§ì†ëßþøJœˆ„J0ˆ¦õ§‹á†ÊþJœ”ˆ¦õ™‹Jœ þøôüÎöↄ„‰õöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öↄ„‰õöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöJEІ„„‰šøJ˜äþŽþþJFJ˜ÐJFþŸJ˜ÀƒùJ˜†ˆ¦õ§ì†ÊþøJ—T†ˆ¦õ§ì†ÊþøJ–ˆ†ˆ¦õµì†ì†ÊþøJ•؆ˆ¦õ§ì†ÊþøJ•(†ˆ¦õ§ì†ÊþøJ”x†ˆ¦õ§ì†ÊþøJO䆈¦õ§‹ˆšøJ” þŽþþJPÂJ“øJP¾þŸJ“èƒùJ“†ˆ¦õ§‹á†ÊþøJ’l†ˆ¦õ§ì†ÊþøJ‘†ˆ¦õµ‹áò†ÊþøJ´†ˆ¦õµ‹áò†ÊþøJ°†ˆ¦õJ¤ìò†ìò†ÊþøJŽä†ˆ¦õµìò†ÊþøJކˆ¦õµìò†ÊþøJ0†ˆ¦õJŽìò†ì†ÊþøJˆÐ†ˆ¦õJ JІ‹úþŸJƒùꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ„þöƆ„„‰ˆ‘ÜöꆆöJŠ|†ˆ¦õ·ä†‹Ø’Íþøôü†䆋áòò†ì†ÊþøJ‡°†ˆ¦õJˆÀì†ì†ì†ìò†ÊþøJ††ˆ¦õJ‡ ì†ì†ì†ìò†ÊþøJ…Ćˆ¦õµìò†ÊþøJ„܆ˆ¦õJ…´ì†ìò†ÊþøJƒô†ˆ¦õJ„Ìì†ì†ì†ÊþøJƒ(†ˆ¦õµìò†ÊþøJlt†ˆ¦õJƒJm†‹ˆšøJ‚ þŽþþJmRJ‚ŒJmNþŸJ‚|ƒùJ܆ˆ¦õ™ÊþøJ†ˆ¦õµìò†ÊþøJ€4†ˆ¦õµ‹áò†ÊþøJh†ˆ¦õµì†ì†ÊþøJ~¨†ˆ¦õ§‹á†ÊþøJv(†ˆ¦õ§‹ˆšøJ~<þŽþþJwJ~(JwþŸJ~ƒùJzX†ˆ¦õJ|<‹úþŸJ~ƒùꆄ„þöꆄ„þöꆈþöJ|¬†ˆ¦õ·ä†‹Ø’ÍþøôüJ{\†‹ŽüJ|"þò„þò„þò„þò„þò„þ͆ìòò†ì†ÊþøJyT†ˆ¦õJzHì†ìò†ì†ÊþøJx¤†ˆ¦õ§ì†ëßþøJwH„Jwðˆ¦õ§‹á†ÊþJwTˆ¦õ™‹Jw`þøôüJv †ÊþøJu†ˆ¦õJvì†ì†ì†ìò†ÊþøJt †ˆ¦õJtøìò†ì†ÊþøJs†ˆ¦õJtì†ì†ìò†ì†ÊþøJo †ˆ¦õ§‹úþŸJrôƒùꆄ„þöꆄ‚öJqø†„„ü°þò„þò„þò„þéöꆄ‚öꆄ‚öꆆöJp°†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJnð†ˆ¦õ§ì†ëßþøJm”„Jn<ˆ¦õ§‹á†ÊþJm ˆ¦õ™‹Jm¬þøôüJlì†ÊþøJf¼†ˆ¦õ§‹úþŸJlhƒùꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öJj,†„„üJk6þò„þò„þò„þò„þò„þò„þò„þò„þéöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆈþöJğˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJ`¬†ˆ¦õ§‹úþŸJf°ƒùꆄ‚öꆄ„þöↄ„‰õöJed†„„ü¼þò„þò„þò„þò„þéöJdĆ„„ü°þò„þò„þò„þéöJc|†„„üJd¶þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þéöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆆöJa¼†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJS†ˆ¦õ§‹úþŸJ` ƒùꆄ‚öꆄ„þöꆄ‚öꆄ„þöJU¸†„„‘úþŸJ_èƒùJ[ø†„„‘úþŸJ_Ѓùↄ„‰õöJ]†„„‰úþŸJ_€ƒùꆄ„þöꆄ‚öà†ˆ‰õöJ^†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆆöJ\p†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJZH†„„‘úþŸJ[ìƒùꆄ‚öꆆöJZÀ†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJW†ˆ‘úþŸJZ<ƒùJXp†„„‰úþŸJZ$ƒùꆄ‚öꆈþöJXø†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆆöJWx†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJV0†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öJTð†ˆü°þò„þò„þò„þéöJT †ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøJR`†ˆ¦õ§ì†ëßþøJQ„JQ¬ˆ¦õ§‹á†ÊþJQˆ¦õ™‹JQþøôüJP\†ÊþøJNü†ˆ¦õJOÔì†ì†ì†ÊþøJMø†ˆ¦õJNìì†ì†ì†ì†ÊþøJLô†ˆ¦õJMèì†ì†ìò†ÊþøJKð†ˆ¦õJLäì†ì†ìò†ÊþøJK$†ˆ¦õµì†ì†ÊþøJJt†ˆ¦õ§ì†ÊþøJIà†ˆ¦õ™ëßþøJI†ˆ¦õµì†ì†ÊþøJHd†ˆ¦õ§ì†ÊþøJG´†ˆ¦õ§ì†ëßþøJFX„JGˆ¦õ§‹á†ÊþJFdˆ¦õ™‹JFpþøôüÖöJC0†ˆ‘úþŸJEăùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆöJC¨†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJB`†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ‚öꆆöJ@†ˆ¦õ·ä†‹Ø’ÍþøôüÜJ> †ƒúþŸJ@ƒùꆄ„þöJ?\†ˆ‰ˆŸìâöJ>Œ†ˆ¦õ·ä†‹Ø’ÍþøôüÚJ+ ƒúþŸJ>ƒùJ;X†„„üJ=úþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þéöꆄ„þöꆄ‚öJ9H†„„‰úþŸJ:üƒùꆄ„þöꆈþöJ9Іˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöJ0†„„‰úþŸJ9ƒùꆄ„þöꆄ„þöJ1h†ˆ‰úþŸJ8¬ƒùꆄ„þöꆄ„þöJ2膄„‰úþŸJ8DƒùJ4@†ˆ‰úþŸJ8,ƒùꆄ„þöꆄ„þöꆄ„þöJ6†„„‰úþŸJ7œƒùꆈþöJ6˜†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆆöJ4Ȇˆ¦õ·ä†‹Ø’ÍþøôüÖöJ3p†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆈþöJ1ð†ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ0˜†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöJ,Іˆ‰úþŸJ/܃ùJ/†„„ü¼þò„þò„þò„þò„þéöJ.x†„„ü°þò„þò„þò„þéöꆄ‚öꆈþöJ-X†ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ,†ˆ¦õ·ä†‹Ø’ÍþøôüÚð†ƒùJ)L†ƒˆúþŸJ+lƒùꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆆöJ)Ȇˆ¦õ·ä†‹Ø’ÍþøôüÒIì°†ˆ›J)†ä†‹I톋úþŸJ(܃ùJ"ˆ†„„‰úþŸJ(ăùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öJ$¨†„„‰úþŸJ'äƒùꆄ„þöJ&†ˆ‘úþŸJ'¤ƒùꆄ‚öꆆöJ&x†ˆ¦õ·ä†‹Ø’ÍþøôüÞöJ%0†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆆöJ#†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öƆ„„‰ˆ„éöƆ„„‰ˆ‘Üöꆄ„þöꆄ„þöꆄ„þöꆄ„þöJ¬†„„‰úþŸJ,ƒùꆄ„þöƆ„„‰ˆ„éöƆ„„‰ˆ‘ÜöJp†„„‘úþŸJü„„þöꆄ„þöJ¸†ˆ‰úþŸJ¼ƒùꆄ„þöꆄ‚öꆄ„þöꆈþöJ@†ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ膈¦õ·ä†‹Ø’ÍþøôüþàöJð†„„‰ˆˆ‘ÔöJ„†„„‰úþŸJäƒùƆ„„‰ˆ‘óéöJ܆ˆ‰ˆŸì†ÜöJ †ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ†„„‰ˆˆ‘ÔöJ¬†„„‰úþŸJøƒùꆄ„þöꆄ„þöꆄ„þöƆˆ‰ˆ‘ÜöJ4†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ‚öꆄ‚öJ䆄„‰úþŸJ(ƒùƆ„„‰ˆ„éöƆˆ‰ˆ‘ÜöJl†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öJü†„„‰úþŸJ°ƒùꆄ‚öꆆöJ„†ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ †„„‰úþŸJðƒùJ<†„„‰ˆ­ìò†ÜöJ ”†„„‰ˆ­ì†ì†óéöJ 솄„‰ˆ­ì†ì†óéöJ `†ˆ‰ˆŸì†ÜöJ †ˆ¦õ·ä†‹Ø’ÍþøôüÖö̆„„‰ˆíöꆄ‚öꆄ‚öꆄ‚öꆆöJ 4†ˆ¦õ·ä†‹Ø’ÍþøôüÖöJ,†„„‰úþŸJ ƒùJÔ†„„‘úþŸJx„„þöꆄ„þöꆆöJL†ˆ¦õ·ä†‹Ø’ÍþøôüþàöJ†„„‘úþŸJÀ„„‰ˆúþŸJȃùꆄ„þöꆄ„þöꆄ‚öꆆöJL†ˆ¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öꆆöJ”†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öƆˆü˜þò„þéöJ´†ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ‚öꆄ‚ö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þö䆄„þöꆄ‚öꆄ„þöIýT†„„‰ˆúþŸIþð„„‰õöꆈþöIý솈¦õ·ä†‹Ø’ÍþøôüÎöꆄ‚öIóà†„„‰šøIüÀþŽþþIô&Iü¬Iô"þŸIüœƒùIûĆˆ¦õµì†ì†ÊþøIúø†ˆ¦õµì†ì†ÊþøI÷Ô†ˆ¦õ§‹úþŸIúìƒùꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öà†„„‰õöꆆöIøä†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøI÷†ˆ¦õµì†ì†ÊþøIöt†ˆ¦õ™ÊþøIõĆˆ¦õ§ì†ëßþøIôh„Iõˆ¦õ§‹á†ÊþIôtˆ¦õ™‹Iô€þøôüÖöIñ˜†„„‰úþŸIóÄ„‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþöIò †ˆ¦õ·ä†‹Ø’ÍþøôüÖöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öIð0†„„‰ŠþŸŒƒùôüÖöI„‰ŠþŸŒƒùôüÖöIîð†„„‰ŠþŸŒƒùôüÖöꆄ„þöꆄ„þöà†ˆþöI픆ˆ¦õ·ä†‹Ø’ÍþøôüÉßöIç4†ˆ›Iì‹á†I眆‹šøIëüþŽþþIçÖIëèIçÒþŸIëØƒùIêÔ†ˆ¦õIë¼ì†ä†‹á†ÊþøIê$†ˆ¦õ“†ÊþøIét†ˆ¦õ§ì†ëßþøIè„IèÀˆ¦õ§‹á†ÊþIè$ˆ¦õ™‹Iè0þøôüIçLöIø†ˆ›JЋˆšøIæÈþŽþþKIæ´K þŸI椃ùIåx†ˆ¦õIæˆìòòò†ì†ÊþøIÑô†ˆ¦õIÓ‹ˆšøIå þŽþþIÓBIà0øIäœþŽþþIàNIäˆIàJþŸIäxƒùIㄆˆ¦õIä\ìò†ì†ÊþøI✆ˆ¦õIãtìò†ì†ÊþøIá솈¦õ§ì†ëßþøIà„Iá8ˆ¦õ§‹á†ÊþIàœˆ¦õ™‹Ià¨þøôüIÓ>þŸIà ƒùIÛ䆈¦õIàìIÜx†“úþŸIßЃùꆄ‚öꆄ‚öIÝ܆„„‘úþŸIßX„‚öꆆöIÞT†ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöIÜ䆈¦õ·ä†‹Ø’ÍþøôüʆÊþøIÛ4†ˆ¦õ§ì†ÊþøIÚ †ˆ¦õIÛ$䆋á†ì†ì†ÊþøIÙp†ˆ¦õ“†ÊþøIØÜ†ˆ¦õ™ÊþøI×ô†ˆ¦õ¯†ì†ì†ÊþøI× †ˆ¦õ¯†ì†ì†ÊþøIÖ@†ˆ¦õ¡†ì†ÊþøIÕ†ˆ¦õ§ì†ÊþøIÔà†ˆ¦õ§ì†ëßþøIÓ„„IÔ,ˆ¦õ§‹á†ÊþIÓˆ¦õ™‹IÓœþøôüIÒÜòò†ì†ì†ÊþøIÐÔ†ˆ¦õIÑäìòòò†ì†ÊþøIϘ†ˆ¦õIÐÄìò†ìò†ì†ì†ÊþøI΄†ˆ¦õIψì†ä†‹áò†ÊþøIÍ€†ˆ¦õ½†ì†ì†ì†ÊþøIÌІˆ¦õ“†ÊþøIÌ<†ˆ¦õ™Êþø[ð†ˆ¦õ\䋈šøIËÐþŽþþ]"bxøIË`þŽþþb’þŸIËPƒùf „fì—üj–kºüõIÊFIÊì‹‹ò„øèIÊ\†‹‹˜ê„øèk˜þ{èHõ0IÇ´“¼IÈôŒIɸˆ–’IÉT‚ˆ’Âü–üàIÈLIÈÐöIÇÄ›‹ØþIÅ ‚“¼IÆdŒIÇTˆ’IÆÄ‚ˆ–’IÆ€ü–üàIżIÆ@öIÅ4›‹ØþI‚“¼IÃÔŒIÄĈ’IÄ4‚ˆ–’IÃðü–üàIÃ,IðöI¤›‹ØþIÀ‚“¼IÁDŒIÂ4ˆ’IÁ¤‚ˆ–’IÁ`ü–üàIÀœIÁ öIÀ›‹ØþI½p‚“¼I¾´ŒI¿¤ˆ’I¿‚ˆ–’I¾Ðü–üàI¾ I¾öI½„›‹ØþIºà‚“¼I¼$ŒI½ˆ’I¼„‚ˆ–’I¼@ü–üàI»|I¼öIºô›‹ØþI¸P‚“¼I¹”ŒIº„ˆ’I¹ô‚ˆ–’I¹°ü–üàI¸ìI¹pöI¸d›‹ØþIµÀ‚“¼I·ŒI·ôˆ’I·d‚ˆ–’I· ü–üàI¶\I¶àöIµÔ›‹ØþI³0‚“¼I´tŒIµdˆ’I´Ô‚ˆ–’I´ü–üàI³ÌI´PöI³D›‹ØþI° ‚“¼I±äŒI²Ôˆ’I²D‚ˆ–’I²ü–üàI±<I±ÀöI°´›‹ØþI®‚“¼I¯TŒI°Dˆ’I¯´‚ˆ–’I¯pü–üàI®¬I¯0öI®$›‹ØþI«€‚“¼I¬ÄŒI­´ˆ’I­$‚ˆ–’I¬àü–üàI¬I¬ öI«”›‹ØþI¨ð‚“¼Iª4ŒI«$ˆ’Iª”‚ˆ–’IªPü–üàI©ŒIªöI©›‹ØþI¦`‚“¼I§¤ŒI¨”ˆ’I¨‚ˆ–’I§Àü–üàI¦üI§€öI¦t›‹ØþI£Ð‚“¼I¥ŒI¦ˆ’I¥t‚ˆ–’I¥0ü–üàI¤lI¤ðöI£ä›‹ØþI¡@‚“¼I¢„ŒI£tˆ’I¢ä‚ˆ–’I¢ ü–üàI¡ÜI¢`öI¡T›‹ØþIž°‚“¼IŸôŒI ¸ˆ–’I T‚ˆ’Âü–üàIŸLIŸÐöIžÄ›‹ØþI›ô‚“¼I8ŒIž(ˆ–’I˜‚ˆ–’ITü–üàIœIöIœ›‹ØþI™8‚“¼Iš|ŒI›lˆ–’IšÜ‚ˆ–’Iš˜ü–üàI™ÔIšXöI™L›‹ØþI–|‚“¼I—ÀŒI˜°ˆ–’I˜ ‚ˆ–’I—Üü–üàI—I—œöI–›‹ØþI“À‚“¼I•ŒI•ôˆ–’I•d‚ˆ–’I• ü–üàI”\I”àöI“Ô›‹ØþI‘‚“¼I’HŒI“8ˆ–’I’¨‚ˆ–’I’dü–üàI‘ I’$öI‘›‹ØþIŽH‚“¼IŒŒI|ˆ–’I삈–’I¨ü–üàIŽäIhöIŽ\›‹ØþI‹¸‚“¼IŒüŒIÀˆ–’I\‚ˆ’Âü–üàIŒTIŒØöI‹Ì›‹ØþI‰(‚“¼IŠlŒI‹0ˆ–’IŠÌ‚ˆ’Âü–üàI‰ÄIŠHöI‰<›‹ØþI†l‚“¼I‡°ŒIˆ ˆ–’Iˆ‚ˆ–’I‡Ìü–üàI‡I‡ŒöI†€›‹ØþIƒ°‚“¼I„ôŒI…䈖’I…T‚ˆ–’I…ü–üàI„LI„ÐöIƒÄ›‹ØþI€ô‚“¼I‚8ŒIƒ(ˆ–’I‚˜‚ˆ–’I‚Tü–üàII‚öI›‹ØþI~8‚“¼I|ŒI€lˆ–’IÜ‚ˆ–’I˜ü–üàI~ÔIXöI~L›‹ØþI{|‚“¼I|ÀŒI}°ˆ–’I} ‚ˆ–’I|Üü–üàI|I|œöI{›‹ØþIxÀ‚“¼IzŒIzôˆ–’Izd‚ˆ–’Iz ü–üàIy\IyàöIxÔ›‹ØþIv‚“¼IwHŒIx8ˆ–’Iw¨‚ˆ–’Iwdü–üàIv Iw$öIv›‹ØþIst‚“¼It¸ŒIu|ˆ–’Iu‚ˆ’Âü–üàItIt”öIsˆ›‹ØþIpä‚“¼Ir(ŒIr숖’Irˆ‚ˆ’Âü–üàIq€IröIpø›‹ØþIn(‚“¼IolŒIp\ˆ–’IoÌ‚ˆ–’Ioˆü–üàInÄIoHöIn<›‹ØþIkl‚“¼Il°ŒIm ˆ–’Im‚ˆ–’IlÌü–üàIlIlŒöIk€›‹ØþIh°‚“¼IiôŒIj䈖’IjT‚ˆ–’Ijü–üàIiLIiÐöIhÄ›‹ØþIeô‚“¼Ig8ŒIh(ˆ–’Ig˜‚ˆ–’IgTü–üàIfIgöIf›‹ØþIc8‚“¼Id|ŒIelˆ–’IdÜ‚ˆ–’Id˜ü–üàIcÔIdXöIcL›‹ØþI`|‚“¼IaÀŒIb°ˆ–’Ib ‚ˆ–’IaÜü–üàIaIaœöI`›‹ØþI]À‚“¼I_ŒI_ôˆ–’I_d‚ˆ–’I_ ü–üàI^\I^àöI]Ô›‹ØþI[0‚“¼I\tŒI]8ˆ–’I\Ô‚ˆ’Âü–üàI[ÌI\PöI[D›‹ØþIX ‚“¼IYäŒIZ¨ˆ–’IZD‚ˆ’Âü–üàIY<IYÀöIX´›‹ØþIUä‚“¼IW(ŒIXˆ–’IWˆ‚ˆ–’IWDü–üàIV€IWöIUø›‹ØþIS(‚“¼ITlŒIU\ˆ–’ITÌ‚ˆ–’ITˆü–üàISÄITHöIS<›‹ØþIPl‚“¼IQ°ŒIR ˆ–’IR‚ˆ–’IQÌü–üàIQIQŒöIP€›‹ØþIM°‚“¼INôŒIO䈖’IOT‚ˆ–’IOü–üàINLINÐöIMÄ›‹ØþIJô‚“¼IL8ŒIM(ˆ–’IL˜‚ˆ–’ILTü–üàIKILöIK›‹ØþIH8‚“¼II|ŒIJlˆ–’IIÜ‚ˆ–’II˜ü–üàIHÔIIXöIHL›‹ØþIE|‚“¼IFÀŒIG°ˆ–’IG ‚ˆ–’IFÜü–üàIFIFœöIE›‹ØþIBì‚“¼ID0ŒIDôˆ–’ID‚ˆ’Âü–üàICˆID öIC›‹ØþI@\‚“¼IA ŒIBdˆ–’IB‚ˆ’Âü–üàI@øIA|öI@p›‹ØþI= ‚“¼I>äŒI?Ôˆ–’I?D‚ˆ–’I?ü–üàI><I>ÀöI=´›‹ØþI:ä‚“¼I<(ŒI=ˆ–’I<ˆ‚ˆ–’I‚“¼H?ÔŒH@Ĉ–’H@4‚ˆ–’H?ðü–üàH?,H?°öH>¤›‹ØþH;Ô‚“¼H=ŒH>ˆ–’H=x‚ˆ–’H=4ü–üàH–H"üõ›Hà‹‹ò„øèHP†‹‹˜ê„øèÖþHJH`èÐèÐèÐèèèHBû²ò‚Hæ–ðHàèHêû²ò‚Føô›H€‹‹ò„øèFù@†‹‹HXê„Fùt›‘GÿØŒþŠò„øGÿLŽŒþŠò„øGþÜŽŒþŠò„øÌŽGþDŽŒþŠò„øGýÔŽŒþŠò„øGýdŽŒþŠò„øÌŽÞŽÞŽÞŽGüTŽŒþŠò„øGû䎌þŠò„øGûtŽŒþŠò„øGûŽŒþŠò„øGú”ŽŒþŠò„øGú$ŽŒþŠò„øÌŽÞŽGùdŽŒþŠò„øGøôŽŒþŠò„øGø„ŽŒþŠò„øGøŽŒþŠò„øG÷¤ŽŒþŠò„øG÷4ŽŒþŠò„øÌŽÞŽÞŽÞŽGö$ŽŒþŠò„øGõ´ŽŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÂŽŒò„øFùÈG?<Gò(ò„G?8¬GòÞŽÞŽÞŽÞŽÞŽG𬎌þŠò„øGð<ŽŒþŠò„øÌŽÞŽÞŽÞŽGï,ŽŒþŠò„øÌŽÞŽGîlŽŒþŠò„øGíüŽŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽGëüŽŒþŠò„øG댎ŒþŠò„øG뎌þŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽGåàŽŒŒþŠ–èŠþØ„øG?ˆþGåšõGä ·èÖGãÄ·èÖGâ¸GãtèèÖGá|GâhèèèÖGà@Gá,èèèÖGß4GߨèÊGÞ(GÞÌèÊGÝGÝÀèÊGÜGÜ´èÊGÛGÛ¨èÊGÙ°GÚ„èèÊGØ\GÙ0èèÊG×G×ÜèèÊGÕ´GÖˆèèÊGÔ¨GÕdèèÖGÓlGÔXèèèÖGÒGÒìèèÊGÐÄGјèèÊGÏpGÐDèèÊGÎGÎðèèÊGÌÈGÍÌèèèÊGË\GÌxèèèèÖGÊPGË èèÖGÉDGÊèèÖGÈ GÈôèèÊGÆÌGÇÐèèèÊGÅÀGÆ|èèÖGÄ„GÅpèèèÖGÃGÄ4èèèèÖGÁ|GÂÈèèèèèÖGÀpGÁ,èèÖG¿|·èÖG½øG¾äèèèÖG½·èÖG?zG¼ðò‚G?Jþ³G³G·$—üG¸Ò–ðG¼„ÜÐèèèÐÐèèèÜèèÁû¦ÖG·4¦õG¸ŽªÔŠþŠò„øàð†üè†üð†üð†üÎþG³—üG´¶–ðG¶ÐèÐÜÐèèÁû¦ÖG³¦õG´ŽªÔŠþŠò„øàð†üè†üð†üð†üÎþøG©Ô„G­°—üG¯B–ðG²¬ÜÐèèèÐÐèèèèèÁû¦ÖG­À¦õG®ŒŽªÔŠþŠò„øàð†üè†üð†üÎþG©à—üG«r–ðG­\èÐÜÐèÁû¦ÖG©ð¦õGª¼ŽªÔŠþŠò„øàð†üè†üð†üÎþøG Ü„G¤¸—üG¦J–ðG©lÐèèèÐÐèèèèèÁû¦ÖG¤È¦õG¥”ŽªÔŠþŠò„øàð†üè†üð†üÎþG è—üG¢z–ðG¤dèÐÜÐèÁû¦ÖG ø¦õG¡ÄŽªÔŠþŠò„øàð†üè†üð†üÎþøGÀ„GžX—üGŸ–ðG tÜèèèÁû¦ÖGžh¦õ§üð†üÎþG̈¦õ™üÎþøGš<„Gšð—üG›Î–ðGXÜèèèèÁû¦ÖG›¦õµüð†üð†üÎþGšHˆ¦õ§üð†üÎþøG— „G—¸—üG˜z–ðG™ÔÜèèèÁû¦ÖG—Ȧõ§üð†üÎþG—,ˆ¦õ™üÎþøG”†—üG•^–ðG–¸ÜèèèÁû¦ÖG”¬¦õ§üð†üÎþøG“à†ˆ¦õ§üð†üÎþøGŽ$†ƒš‘G“ÔÞŽÞŽGŽ€G’ª·èÖG¨G’<ÜÜÜÜÊGŽvG”GŽnòúþ³GtˆþöGœ†ˆ¦õµüð†üð†üÎþøGŽÌ†ˆ¦õ¯ü膋ñÎþøò†ƒùôüþÊG‰†ƒš‘GŽÞŽÞŽG‰pGŒî·èÖG‹|GŒ€ÜÜÊG‰fG‹hG‰^òúþ³G‹HˆþöGŠŒ†ˆ¦õ§üð†üÎþøG‰¼†ˆ¦õ¯ü膋ñÎþøò†ƒùôüþÊGˆ€†ˆžþŠò„øÚöG‡ì†ˆžþŠò„øÚöG…D„G†ôˆ¦õG‡Üüð†üð†üð†üð†üÎþG†‚ˆ¦õG†àüð†üð†üð†üÎþG…Pˆ¦õµüð†üð†üÎþøG„„†ˆ¦õ§‹ñð†üÎþøGƒð†ˆžþŠò„øÚöG‚|„Gƒ0ˆ¦õµüð†üð†üïßþG‚ˆˆ¦õ§üð†üïßþøG膈žþŠò„øÚöGT†ˆžþŠò„øÚöG€¤†ˆ¦õ§üð†üÎþøGô†ˆ¦õ§üð†üÎþøGzP„G|—üG|ú–ðG\ÜèèèèÜèèèÁû¦ÖG|¦õG|Üüè†üð†üð†üÎþG{‚ˆ¦õG{ìüð†üð†üð†üÎþGz\ˆ¦õµüð†üð†üïßþøGy0„GyȈ¦õ™üïßþGy<ˆ¦õ™üïßþøGx„Gx¨ˆ¦õ™üïßþGxˆ¦õ™üïßþøGvœ„GwPˆ¦õµüð†üð†üÎþGv¨ˆ¦õ§üð†üÎþøGv†ˆžþŠò„øÚöGut†ˆžþŠò„øÚöGtà†ˆžþŠò„øÚöGsÀ„GtXˆ¦õ™üïßþGs̈¦õ™üïßþøGr „Gs8ˆ¦õ™üïßþGr¬ˆ¦õ™üïßþøGq€„Grˆ¦õ™üïßþGqŒˆ¦õ™üïßþøGp`„Gpøˆ¦õ™üïßþGplˆ¦õ™üïßþøGŏˆ¦õ™üïßþøGkT„Gl$—üGm–ðGo4ÜèèèèÜèèÁû¦ÖGl4¦õ½üè†üð†üÎþGk`ˆ¦õµüð†üð†üÎþøG_ˆ„Gg—üGgú–ðGj¼ÜèèèèÜèèÐèÁû¦ÖGg¦õGgÜüð†üè†üð†üÎþGcP‚—üGd2–ðGfdÜèèèèÜèèÁû¦ÖGcd¦õ½üè†üð†üÎþGbp‚ˆ¦õGc@üð†üð†üð†üïßþGaŒ‚ˆ¦õµ‹ˆéð†üð†üïßþG`䂈¦õ§üð†üïßþG`,‚ˆ¦õ§‹ñð†üïßþG_”ˆ¦õ™‹ñïßþøÞ†ƒ‹†øðÞ†ƒ‹†øðȆƒ‹†øðȆƒ‹†øðGB8†ƒš‘G^$ÞŽÞŽÆŽ†G\¸Ž†ž†øG\ŽGZÜŽœG\XèèèG[ú›Ÿüð†üGY(ŽœGZ¤èèèGY\ú›Ÿüð†üGYŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽGB”GWõGUØGV”èèÖGTÌGUˆÜÊGS`GTèÊGRT«ÊGP¸GRÜGQ,ôÖGO¬«ÊGNGOtÜGN„ôÖGM4·èÖGLˆ«ÊGBŠGLtGB‚òúþ³GK舦õ™üïßþøê†ˆþöð†ƒùGJ\„GJôˆ¦õ£ð†üïßþGJhˆ¦õ™üïßþøGI„GI¸ˆ¦õ£ð†üïßþGIˆ¦õ¡üç’ÍþøGH|†ˆ¦õ™üïßþøGG膈¦õ™üïßþøGD|„GF,ˆ¦õ§ŽþŠGG”ŒþŠò„øGG0„ŒþŠò„øÊ„øèð†üÎþGE ‚ˆ¦õ§‹‹†øèð†üÎþGDˆˆ¦õ™‹ñÎþøð†ƒùGC¼†ƒ‹þаò„Ü„øèGC†ƒ‹þаò„Ü„øèð†ƒùð†ƒùò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒˆñà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðð†ƒùG?Іƒ‹ŒþŠ–èŠþØ„øðò†ƒùôüþFùÀG>îõG=ô·èÖG=·èÖG< G<ÈèèÖG:ÐG;¼èèèÖG9”G:€èèèÖG8ˆG9,èÊG74G8èèÊG5àG6´èèÊG4ŒG5`èèÊG38G4 èèÊG1äG2èèèèÊG0xG1”èèèèÖG/lG0(èèÖG.0G/èèèÖG,ÄG-àèèèèÖG+(G,tèèèèèÖG)tG*èèèèÖFù¶G)DŒ†øòò‚Fù†þ³G(˜ˆžþŠò„øÚöG'ø†ˆžþŠò„øÚöG'd†ˆžþŠò„øÚöG$„G$Ä—üG%¢–ðG'èÜèÜÁû¦ÖG$Ô¦õµüð†üð†üÎþG$ˆ¦õ§üð†üÎþøG#|†ˆžþŠò„øÚöG"膈žþŠò„øÚöG"T†ˆžþŠò„øÚöG¬„G!\ˆ¦õG"Düð†üð†üð†üð†üÎþG x‚ˆ¦õG!Hüð†üð†üð†üÎþG¸ˆ¦õµüð†üð†üÎþøG솈¦õ§‹ñð†üÎþøGX†ˆžþŠò„øÚöGĆˆžþŠò„øÚöG0†ˆžþŠò„øÚöGœ†ˆžþŠò„øÚöG†ˆžþŠò„øÚöGt†ˆžþŠò„øÚöG „GP—üGJ–ðGÜÜèèèèÜèèèèÁû¦ÖG`¦õG,üè†üð†üð†üÎþGl‚ˆ¦õG<üð†üð†üð†üÎþG¬ˆ¦õµüð†üð†üïßþøG †ˆžþŠò„øÚöGx†ˆžþŠò„øÚöG䆈žþŠò„øÚöGP†ˆžþŠò„øÚöG¼†ˆžþŠò„øÚöG(†ˆžþŠò„øÚöG„G ˆ¦õ™üïßþGˆ¦õ™üïßþøGè„G€ˆ¦õ™üïßþGôˆ¦õ™üïßþøGT†ˆžþŠò„øÚöGÀ†ˆžþŠò„øÚöG,†ˆ¦õ™üïßþøG „„G T—üG 2–ðG ”ÜèèèèÜèèèÁû¦ÖG d¦õ½üè†üð†üÎþG ˆ¦õµüð†üð†üÎþøFýh„G—üGú–ðGìÜèèèèÜèèèÐèÁû¦ÖG¦õGÜüð†üè†üð†üÎþG ‚—üG–ðGdÜèèèèÜèèèÁû¦ÖG4¦õ½üè†üð†üÎþG@‚ˆ¦õGüð†üð†üð†üÎþFÿl‚ˆ¦õµ‹ñð†üð†üÎþFþÄ‚ˆ¦õ§üð†üÎþFþ ‚ˆ¦õ§‹ñð†üÎþFýtˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øðà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þð̆ƒ‹þŠò„øè̆ƒ‹þŠò„øèà†ƒ‹þðà†ƒ‹þðĆƒ‹˜ê„øðò†ƒùôüþFùDÖþö‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüò„†üüz˜Fø\üÚ„žú‚ú‚ú‚ú‚ú‚ú‚üüzŒF÷üƒùzˆF÷àƒùz€FèFõØ“®Fö茦ˆ–’F÷ü–üàFöT¸Fõè›ãþFóÔ‚“®Fô茦ˆ–’Fõü–üàFôT¸Fóè›ãþFñÔ‚“®Fò茦ˆ–’Fóü–üàFòT¸Fñè›ãþFïÔ‚“®Fð茦ˆ–’Fñü–üàFðT¸Fïè›ãþFíÔ‚“®Fî茦ˆ–’Fïü–üàFîT¸Fíè›ãþFëÔ‚“®Fì茦ˆ–’Fíü–üàFìT¸Fëè›ãþFéð‚“®F댮ˆ’Fë ü–ü—ÉFêp¸Fê›ãþFè ‚“®Fé Œ®ˆ’Fé<ü–ü—ÉF茸Fè ›ãþøüò†ƒùz|FçØƒùꄎú‚ú‚üüzxFç,ˆ›‘ÒþøztFçüzpFç üò„†üüzlFæpˆ›‘óßþøzhFæT†üüzdFæ@ƒùò„†üüò†ƒùz`FåTˆ›™†ì†ÒþøzPFÕxFãL“®Fä\Œ¦ˆ–’Fäxü–üàFãȸFã\›ãþFáH‚“®Fâ\Œ¦ˆ–’Fâxü–üàFáȸFá\›ãþFßH‚“®Fà\Œ¦ˆ–’Fàxü–üàFßȸFß\›ãþFÝH‚“®FÞ\Œ¦ˆ–’FÞxü–üàFÝȸFÝ\›ãþFÛH‚“®FÜ\Œ¦ˆ–’FÜxü–üàFÛȸFÛ\›ãþFÙH‚“®FÚ\Œ¦ˆ–’FÚxü–üàFÙȸFÙ\›ãþF×d‚“®FØxŒ®ˆ’FØ”ü–ü—ÉF×ä¸F×x›ãþFÕ€‚“®FÖ”Œ®ˆ’FÖ°ü–ü—ÉFÖ¸FÕ”›ãþøüò†ƒùz0FÔ¨ˆ›­ì†ì†ÒþøzFÔ˜üFÑœ†“¼FÒ芘FÔˆ–’FÓt‚ˆ–’FÓ0ü–üÊFÒ@FÒÄöFѸ›‹Øþøê„Žú‚ú‚üüò„†üüzFÑLüò„†üüzFцüüzFÑ üò†ƒùz FÁFÎì“®FÏüŒ¦ˆ–’FÐü–üàFÏh¸FÎü›ãþFÌè‚“®FÍüŒ¦ˆ–’FÎü–üàFÍh¸FÌü›ãþFÊè‚“®FËüŒ¦ˆ–’FÌü–üàFËh¸FÊü›ãþFÈè‚“®FÉüŒ¦ˆ–’FÊü–üàFÉh¸FÈü›ãþFÆè‚“®FÇüŒ¦ˆ–’FÈü–üàFÇh¸FÆü›ãþFÄè‚“®FÅüŒ¦ˆ–’FÆü–üàFÅh¸FÄü›ãþF“®FÄŒ®ˆ’FÄ4ü–ü—ÉFĸFÛãþFÁ ‚“®FÂ4Œ®ˆ’FÂPü–ü—ÉFÁ ¸FÁ4›ãþøüò†ƒùò„†üüzFÀÜüF¶¤†“¼F·ðŠ˜FÀHˆ–’F¿¸‚ˆ–’F¸8ü–F¹’FºÌF¿l’FºÄøüôøüøüøüøüøüøüøüøüF¹ F¹¸ööF¸ìþþF¸T—ˆ‹F·èF·HF·ÌöF¶À›‹ØþøyüF¶ üyðF¶8ˆþþøyäF¶(üyÜF¶ƒùyØFµøƒùyÔF³Ä“®F´ÔŠ˜¦ˆ–’Fµü–üÊF´@¸F³Ô›ãþøyÄF£èF±¼“®F²ÌŒ¦ˆ–’F²èü–üàF²8¸F±Ì›ãþF¯¸‚“®F°ÌŒ¦ˆ–’F°èü–üàF°8¸F¯Ì›ãþF­¸‚“®F®ÌŒ¦ˆ–’F®èü–üàF®8¸F­Ì›ãþF«¸‚“®F¬ÌŒ¦ˆ–’F¬èü–üàF¬8¸F«Ì›ãþF©¸‚“®FªÌŒ¦ˆ–’Fªèü–üàFª8¸F©Ì›ãþF§¸‚“®F¨ÌŒ¦ˆ–’F¨èü–üàF¨8¸F§Ì›ãþF¥Ô‚“®F¦èŒ®ˆ’F§ü–ü—ÉF¦T¸F¥è›ãþF£ð‚“®F¥Œ®ˆ’F¥ ü–ü—ÉF¤p¸F¤›ãþøüy¼F£ÜüF£@†ˆþ‘óßþøö†üy¬F “®Fž°Š˜F¢¨ˆ–’Fžøü–FŸ¦’F  F¢X’F ˜øüøüøüFŸÄ¸FŸþþÆ—ˆFž¨Fž¸F°›ãþøy¨Füy¤F€üy˜F—X“®F˜hŽFšdþ––˜Fœ¨þ–’Fšä–˜þ–˜þ˜¦Üü–üêêêêêêF˜€þ˜F™ˆþ–’F˜¨˜þ–’F˜`F—Ô¸F—h›ãþøyF—<ƒùyˆF”$F”À“¼F–ŒF–Ôˆ’F–p‚ˆ’êÐü–ü—ÓöF•XF•ÜøþF”Л‹†óßþF”(ˆ›‹†óßþøy€F”üò„†üüy|F“ðüyxF“¤†þøytF“ŒƒùypF“|üylFƒ F‘t“®F’„Œ¦ˆ–’F’ ü–üàF‘ð¸F‘„›ãþFp‚“®F„Œ¦ˆ–’F ü–üàFð¸F„›ãþFp‚“®FŽ„Œ¦ˆ–’FŽ ü–üàFð¸F„›ãþF‹p‚“®FŒ„Œ¦ˆ–’FŒ ü–üàF‹ð¸F‹„›ãþF‰p‚“®FŠ„Œ¦ˆ–’FŠ ü–üàF‰ð¸F‰„›ãþF‡p‚“®Fˆ„Œ¦ˆ–’Fˆ ü–üàF‡ð¸F‡„›ãþF…Œ‚“®F† Œ®ˆ’F†¼ü–ü—ÉF† ¸F… ›ãþFƒ¨‚“®F„¼Œ®ˆ’F„Øü–ü—ÉF„(¸Fƒ¼›ãþøüö†üò†ƒùyXFƒlüö†üò†ƒùyTF‚Àˆ›‘ÒþøFø†ˆ›­ì†ì†óßþøyPFjôFl“¼F€¬ŒFœˆ’F ‚ˆ–’F€Èü–üàF€F€ˆöF|›‹ØþF|Ø‚“¼F~ŒF ˆ’F~|‚ˆ–’F~8ü–üàF}tF}øöF|웋ØþFzH‚“¼F{ŒŒF||ˆ’F{삈–’F{¨ü–üàFzäF{höFz\›‹ØþFw¸‚“¼FxüŒFy숒Fy\‚ˆ–’Fyü–üàFxTFxØöFwÌ›‹ØþFu(‚“¼FvlŒFw\ˆ’FvÌ‚ˆ–’Fvˆü–üàFuÄFvHöFu<›‹ØþFr˜‚“¼FsÜŒFẗ’Ft<‚ˆ–’Fsøü–üàFs4Fs¸öFr¬›‹ØþFp$‚“¼FqhŒFr<ˆ’FqØ‚ˆ’Fq„ü–ü—ÉFpÀFqDöFp8›‹ØþFjü‚“¼Fl@ŒFoȈ’Fod‚ˆ’Fl\ü–Fm&’Fm슘Foˆ’Fnx‚ˆ–’Fn4ü–üÊFmDFmÈöFmþþFlx—ˆ‹Fl8Fk˜FlöFk›‹ØþøüFXð„Fhð“®FjŒ¦ˆ–’Fjü–üàFil¸Fi›ãþFfì‚“®FhŒ¦ˆ–’Fhü–üàFgl¸Fg›ãþFdì‚“®FfŒ¦ˆ–’Ffü–üàFel¸Fe›ãþFbì‚“®FdŒ¦ˆ–’Fdü–üàFcl¸Fc›ãþF`ì‚“®FbŒ¦ˆ–’Fbü–üàFal¸Fa›ãþF^ì‚“®F`Œ¦ˆ–’F`ü–üàF_l¸F_›ãþF]‚“®F^Œ®ˆ’F^8ü–ü—ÉF]ˆ¸F]›ãþFY‚“®FZŒF\¬ˆ’FZ0ü–FZÞ’F[Š˜¦ˆ–’F[Øü–üÊFZü¸FZÈþþÆ—ˆÁFY€¸FY›ãþøüö†üyLFXhˆ›ãþøyHFXPƒùyDFX@üFW°†ˆ›ãþøy8FW¬üy0FT蓼FV(Š˜FWDˆ’FV´‚ˆ–’FVpü–üÊFU€FVöFTø›‹ØþøFIˆ†“®FJ¤Š˜FTTˆ–’FJìü–FKš’FMTFT’FMLøüøüøüøüøüøüøüôøFO€–––üêFLtøFNþ–˜þ˜¦Üü–üêêFL\øFMlþ–’FLDFK¸¸FK„þþÆ—ˆFJœFJ¸FI¤›ãþøF9°„FGŒ“®FHœŒ¦ˆ–’FH¸ü–üàFH¸FGœ›ãþFEˆ‚“®FFœŒ¦ˆ–’FF¸ü–üàFF¸FEœ›ãþFCˆ‚“®FDœŒ¦ˆ–’FD¸ü–üàFD¸FCœ›ãþFAˆ‚“®FBœŒ¦ˆ–’FB¸ü–üàFB¸FAœ›ãþF?ˆ‚“®F@œŒ¦ˆ–’F@¸ü–üàF@¸F?œ›ãþF=ˆ‚“®F>œŒ¦ˆ–’F>¸ü–üàF>¸F=œ›ãþF;¤‚“®F<¸Œ®ˆ’F<Ôü–ü—ÉF<$¸F;¸›ãþF9À‚“®F:ÔŒ®ˆ’F:ðü–ü—ÉF:@¸F9Ô›ãþøüy,F9¬üò†ƒùy F)¸F7Œ“®F8œŒ¦ˆ–’F8¸ü–üàF8¸F7œ›ãþF5ˆ‚“®F6œŒ¦ˆ–’F6¸ü–üàF6¸F5œ›ãþF3ˆ‚“®F4œŒ¦ˆ–’F4¸ü–üàF4¸F3œ›ãþF1ˆ‚“®F2œŒ¦ˆ–’F2¸ü–üàF2¸F1œ›ãþF/ˆ‚“®F0œŒ¦ˆ–’F0¸ü–üàF0¸F/œ›ãþF-ˆ‚“®F.œŒ¦ˆ–’F.¸ü–üàF.¸F-œ›ãþF+¤‚“®F,¸Œ®ˆ’F,Ôü–ü—ÉF,$¸F+¸›ãþF)À‚“®F*ÔŒ®ˆ’F*ðü–ü—ÉF*@¸F)Ô›ãþøüyF)¬üy F)(ˆ›‘ÒþøxüF)ƒùxøF)üꄎú‚ú‚üüxôF$üF&ì“®F'üŒ®ˆ’F(ü–ü—ÉF'h¸F&ü›ãþF%‚“®F&Œ®ˆ’F&4ü–ü—ÉF%„¸F%›ãþøüxØF$èƒùxÔF$ØüxÈF$ÀƒùxÀF$ ˆ›Ÿì†ÒþøF#†ˆ›‘ÒþøF"Ô†ˆ›™†ì†Òþøx°F"Ćüüx¬F"¸üò†ƒùx¨F"„ƒùö†üx¤F!¸ˆ›™†ì†óßþøò„†üüx F!„ƒùð†ƒùò†ƒùxœF!@üx˜F!$ƒùxŒF  ˆ›‘ÒþøxˆF䈛™ò†Òþøx„FȃùxtF°ƒùxpFôˆ›™†ì†óßþøF,†ˆ›­ìò†ÒþøxhFƒùxdFƒùxTFDˆ›­ìò†Òþøö†üxPEù˜F,“®F<Œ¦ˆ–’FXü–üàF¨¸F<›ãþF(‚“®F<Œ¦ˆ–’FXü–üàF¨¸F<›ãþF(‚“®F<Œ¦ˆ–’FXü–üàF¨¸F<›ãþF(‚“®F<Œ¦ˆ–’FXü–üàF¨¸F<›ãþF(‚“®F<Œ¦ˆ–’FXü–üàF¨¸F<›ãþF(‚“®F<Œ¦ˆ–’FXü–üàF¨¸F<›ãþF ‚“®F4ŒF̈’FPü–Fþ’F°Š˜¦ˆ–’Føü–üÊF¸FèþþÆ—ˆÁF  ¸F 4›ãþF ‚“®F ŒF Ĉ’F 8ü–F æ’F ˜Š˜®ˆ–’F àü–ü—F F ¸F ÐþþÆ—ˆÁF ˆ¸F ›ãþEùœ“®EýF¼’EüøøüøüøüøüôøüøüôøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüEúEúœöEù¬›ãþøö†üxLEùtƒùx@EøÔˆ›Ÿì†ÒþøEø(†ˆ›Ÿì†Òþøx4Eò“®Eó ŽEõÄ–˜E÷Ü’Eö–˜þ–˜þ˜¦Üü–üêêêêêêEó¸Eõl’Eó´˜EôÀþ–’Eóà˜þ–’Eó˜Eó ¸Eò ›ãþøx0Eñðˆ›Ÿì†Òþøx,EñPˆ›Ÿì†Òþøx$Eñ@üx Eñ0üxE賈úþŸEñ„„þöꆆöEð†ˆ¦õ·ä†‹Ø’ÍþøôüþÜxEï”üxEïxƒùxE›™ò†ÒþøwüEî ƒùEìh†“®E턊–˜þ–’êêÊEìðºþEì„›‘Òþøö†üwôEÞ¤ƒEìLþEÞ¾Eì8EÞºþŸEì(ƒùEáÄ„Eëxˆ¦õ§ì†ÊþEæÐ‚“Eç‚EèTEë(’EèPEëEèLøEéÔEê„þ–EéЖ–’êêêEè8Eé¨Eè4ø¢˜EéDˆ’êÊ‚ˆ’Âü–üêêÞEç|EèþøþEæä¦õ§üð†üÎþEáГEâ~EãPEæ„’EãLEæ\EãHøEäàEåþ––þþEäÜ––’êêêEã4Eä´Eã0ø¢˜EäPˆ’ꂈ’—Eã˜ü–üêêÞEâxEãþøþEáà¦õ§üð†üÎþøEá0†ˆ¦õ™ÊþøEàp†ˆ¦õ¯ì†ã’ÍþøEßÀ†—ñ¦õ“†ÊþøE߆—ñ¦õ“†‹EßþøôüþÞwðEÞ€Šú‚üüwèEÝ䈛Ÿì†ÒþøwØEÝȆüüwÐEÝ´ƒùwÌE݈›Ÿì†óßþøò†ƒùwÈEÜ´ƒˆñwÄEÜœƒùwÀEÜŒüEÛĆˆ›™†ì†ÒþøEÛ$†ˆ›Ÿì†Òþøò†ƒùw°EÚ”ˆ›‘Òþøw¤EʸEØŒ“®EÙœŒ¦ˆ–’EÙ¸ü–üàEÙ¸EØœ›ãþEÖˆ‚“®EלŒ¦ˆ–’E׸ü–üàE׸EÖœ›ãþEÔˆ‚“®EÕœŒ¦ˆ–’EÕ¸ü–üàEÕ¸EÔœ›ãþEÒˆ‚“®EÓœŒ¦ˆ–’EÓ¸ü–üàEÓ¸EÒœ›ãþEЈ‚“®EÑœŒ¦ˆ–’EѸü–üàEѸEМ›ãþEΈ‚“®EÏœŒ¦ˆ–’Eϸü–üàEϸEΜ›ãþE̤‚“®E͸Œ®ˆ’EÍÔü–ü—ÉEÍ$¸E̸›ãþEÊÀ‚“®EËÔŒ®ˆ’EËðü–ü—ÉEË@¸EÊÔ›ãþøüwœEʤƒùw”E¼äƒEÊŒþE¼þEÊxE¼úþŸEÊhƒùEÀ„Eɸˆ¦õ§ì†ÊþEÅ‚“EÅÂEÆ”EÉh’EÆEÉ@EÆŒøEÈEÈÄþ–EÈ––’êêêEÆxEÇèEÆtø¢˜EÇ„ˆ’êÊ‚ˆ’Âü–üêêÞEżEÆDþøþEÅ$¦õ§üð†üÎþEÀ“EÀ¾EÁEÄÄ’EÁŒEÄœEÁˆøEà EÃÐþ––þþEÖ–’êêêEÁtEÂôEÁpø¢˜Eˆ’ꂈ’—EÁØü–üêêÞEÀ¸EÁ@þøþEÀ ¦õ§üð†üÎþøE¿p†ˆ¦õ™ÊþøE¾°†ˆ¦õ¯ì†ã’ÍþøE¾†—ñ¦õ“†ÊþøE½@†—ñ¦õ“†‹E½XþøôüþÞö†üwˆE¼ÄüE¼(†ˆþ‘óßþøw„E»°ˆ›‘Òþøw€E¨$ƒE»˜þE¨>E»„E¨:þŸE»tƒùE³H„E·H“E¸E¸ÔE»’E¸ÐEºôE¸ÌøE¹ÈEºxþ–E¹Ä––’êêêE¸¸E¹œE¸´ø¤¦ˆ’Âü–üêÞE·üE¸„þøþE·X¦÷þ§üð†üÎþE³T“¼E´°E¶ø’E´¬E¶ÐE´¨øEµ¤E¶Tþ–Eµ ––’êêêE´”EµxE´ø¤¦ˆ’Âü–üêÞE³ìºþE³d¦÷þ™üÎþøE±P†“E²&E²ÈŠš—Ë—ßE² E²¨þøþE±l¦÷þ¯üð†üç’ÍþøE«¬†“¼E­€ôøE°Ô¦„Øü’E­TþôøE°T’E­$E°,E­ øE¯|¦ˆ’Âü–üE­ E¯PE­øE­ÄE®„þ––þþE­À––’—ÓêêE¬ôE­˜E¬ðE¬PE¬ÔøþE«È¦÷þ™üÎþøE©ð†“¼E«(Š¥ñþèöEª”ºþEª ¦÷þ™üïßþøE©@†—ñ¦õ“†ÊþøE¨€†—ñ¦õ“†‹E¨˜þøôüþÞò†ƒùwpE§Pˆ›­ìò†óßþøwlE¥œƒúþŸE§(„„þöꆄ‚öꆆöE¥ü†ˆ¦õ·ä†‹Ø’ÍþøôüþÜwhE¥€ƒùw\E¥d†üüwTE¥ˆþþøò†ƒùwPE¤ØüwHE¤Àƒùw<E¤°üE¡„E¢4“¼E£tŒE¤Hˆ’êÊ‚ˆ’êÐü–ü—ÓöE¢ÌE£TþøþE¢D›Ÿì†óßþE¡œˆ›Ÿì†óßþøw$E¡ŒüwE¡hŠú‚üüw E¡\üwE¡DƒùwE‘hEŸ<“®E LŒ¦ˆ–’E hü–üàEŸ¸¸EŸL›ãþE8‚“®EžLŒ¦ˆ–’Ežhü–üàE¸¸EL›ãþE›8‚“®EœLŒ¦ˆ–’Eœhü–üàE›¸¸E›L›ãþE™8‚“®EšLŒ¦ˆ–’Ešhü–üàE™¸¸E™L›ãþE—8‚“®E˜LŒ¦ˆ–’E˜hü–üàE—¸¸E—L›ãþE•8‚“®E–LŒ¦ˆ–’E–hü–üàE•¸¸E•L›ãþE“T‚“®E”hŒ®ˆ’E”„ü–ü—ÉE“Ô¸E“h›ãþE‘p‚“®E’„Œ®ˆ’E’ ü–ü—ÉE‘ð¸E‘„›ãþøüvôE‘\üvØE‘DƒùvÔE“®E Š˜¦ˆ–’Ehü–üÊEŒ¸E ›ãþøvÌEŽôüvÈEŽØüv¸EŽÈüv´EެüEˆx†“®E‰”ŽE‹þ––˜EÔþ–’EŒ–˜þ–˜þ˜¦Üü–üêêêêêêE‰¬þ˜EŠ´þ–’E‰Ô˜þ–’E‰ŒE‰¸Eˆ”›ãþøv¬E‡Èˆ›­ìò†óßþøE…ˆ†“®E†¤Š˜¦ˆ–’E†ìü–üÊE†¸E…¤›ãþøv¨ErƒE…|þEr"E…hErþŸE…XƒùE},„E,“EæE‚¸E…’E‚´E„ØE‚°øEƒ¬E„\þ–Eƒ¨––’êêêE‚œEƒ€E‚˜ø¤¦ˆ’Âü–üêÞEàE‚hþøþE<¦÷þ§üð†üÎþE}8“¼E~”E€Ü’E~E€´E~ŒøEˆE€8þ–E„––’êêêE~xE\E~tø¤¦ˆ’Âü–üêÞE}кþE}H¦÷þ™üÎþøE{4†“E| E|¬Šš—Ë—ßE|E|ŒþøþE{P¦÷þ¯üð†üç’ÍþøEu†“¼EwdôøEz¸¦„Øü’Ew8þôøEz8’EwEzEwøEy`¦ˆ’Âü–üEvðEy4EvìøEw¨Exhþ––þþEw¤––’—ÓêêEvØEw|EvÔEv4Ev¸øþEu¬¦÷þ™üÎþøEsÔ†“¼Eu Š¥ñþèöEtxºþEsð¦÷þ™üïßþøEs$†—ñ¦õ“†ÊþøErd†—ñ¦õ“†‹Er|þøôüþÞv”EqøüEot†“®EpŒEqdŠþ–üêÊ‚ˆ’Ep¬ü–ü—ÉEoü¸Eo›ãþøò†ƒùvˆEnˆ›»ìòò†Òþøv€EmÔˆ›™†ì†ÒþøvlEmPˆ›‘ÒþøvhEj8EjÔ“¼ElŒEl舒êÊ‚ˆ’êÐü–ü—ÓöEklEkôþøþEj䛟ì†óßþEj<ˆ›Ÿì†óßþøE[0†ƒŽúþŸEj$ƒùꆄ„þöꆈþöEfD†“EfþEg Œþ˜Eh舖–’êêêEh,‚ˆ––’êêêØü–üÊEføEg€þøþEf`¦õ§üð†üÎþøEbÀ†“EczEdŒþ˜Eedˆ––’êêêEd¨‚ˆ––’êêêØü–üÊEctEcüþøþEbܦõ§üð†üÎþøE_†“E_ÖE`xŒþ˜EaЈ––’—ÓêêEa‚ˆ––’êêêÐü–ü—E`pE_ÐE`XþøþE_8¦õ§üð†üÎþøE]†“¶E^DŠ––š—Ë—ÓêöE]°ºþE]4¦õ™üïßþøE\h†ˆ¦õ§ì†ÊþøE[˜†ˆ¦õ·ä†‹Ø’ÍþøôüþÞvDEZdˆ›»ìòò†Òþøv,EYàˆ›‘Òþøò†ƒùv$EYDˆ›‘Òþøv EXlˆ›»ì†ìò†ÒþøvEXP†üüvEX<ƒùvEX,üv EXüò„†üüvEWèƒùuüEWØüuøEDLƒEWÀþEDfEW¬EDbþŸEWœƒùEOp„ESp“ET*ETüEWD’ETøEWETôøEUðEV þ–EUì––’êêêETàEUÄETÜø¤¦ˆ’Âü–üêÞET$ET¬þøþES€¦÷þ§üð†üÎþEO|“¼EPØES ’EPÔERøEPÐøEQÌER|þ–EQÈ––’êêêEP¼EQ EP¸ø¤¦ˆ’Âü–üêÞEPºþEOŒ¦÷þ™üÎþøEMx†“ENNENðŠš—Ë—ßENHENÐþøþEM”¦÷þ¯üð†üç’ÍþøEGÔ†“¼EI¨ôøELü¦„Øü’EI|þôøEL|’EILELTEIHøEK¤¦ˆ’Âü–üEI4EKxEI0øEIìEJ¬þ––þþEIè––’—ÓêêEIEIÀEIEHxEHüøþEGð¦÷þ™üÎþøEF†“¼EGPŠ¥ñþèöEF¼ºþEF4¦÷þ™üïßþøEEh†—ñ¦õ“†ÊþøED¨†—ñ¦õ“†‹EDÀþøôüþÞuôED<üò†ƒùuèEC0ˆ›EDìòò†ì†óßþøuäEC üuàECƒùuÐEBøüuÀEBXˆ›Ÿì†Òþøu¼EA¸ˆ›ŸìùßþøE@ð†ˆ›­ì†ì†Òþøu¸E@ìüu´E@hˆ›‘óßþøð†ƒùâ„–ú‚ú‚ú‚ú‚üüu°E?Xˆ›­ì†ì†Òþøö†üu¬E'¼E=@“®E>PŒ¦ˆ–’E>lü–üàE=¼¸E=P›ãþE;<‚“®E’E1ðŒ¦ˆ–’E2 ü–üàE1\¸E1(þþÆ—ˆÁE/à¸E/t›ãþE+t‚“®E,ˆŒE/ˆ’E,¤ü–E-R’E.Œ®ˆ–’E. ü–ü—ÉE-p¸E-<þþÆ—ˆÁE+ô¸E+ˆ›ãþE'À“®E)DE+(’E)<øüøüøüøüE(<E(ÀöE'Лãþøu¤E'¨ƒùö†üò†ƒùuœE!X“®E"hŽE$dþ––˜E&¨þ–’E$ä–˜þ–˜þ˜¦Üü–üêêêêêêE"€þ˜E#ˆþ–’E"¨˜þ–’E"`E!Ô¸E!h›ãþøu˜E!Hüu”E “®E0ŽE,þ––˜E pþ–’E¬–˜þ–˜þ˜¦Üü–üêêêêêêEHþ˜EPþ–’Ep˜þ–’E(Eœ¸E0›ãþøuEƒùu„Eìƒùu|EÔƒùò†ƒùuxE¤E@“¼E€ŒETˆ’êÊ‚ˆ’êÐü–ü—ÓöEØE`þøþEP›Ÿì†óßþE¨ˆ›Ÿì†óßþøò†ƒùutE€üupE8ƒˆñö†üulEÌE“¼EÐŒEÀˆ’E0‚ˆ–’Eìü–üàE(E¬öE ›‹ØþEü‚“¼E@ŒE0ˆ’E ‚ˆ–’E\ü–üàE˜EöE›‹ØþEl‚“¼E°ŒE ˆ’E‚ˆ–’EÌü–üàEEŒöE€›‹ØþE Ü‚“¼E ŒEˆ’E€‚ˆ–’E<ü–üàE xE üöE ð›‹ØþE L‚“¼E ŒE €ˆ’E ð‚ˆ–’E ¬ü–üàE èE löE `›‹ØþE¼‚“¼E ŒE ðˆ’E `‚ˆ–’E ü–üàEXEÜöEЛ‹ØþEH‚“¼EŒŒE`ˆ’Eü‚ˆ’E¨ü–ü—ÉEäEhöE\›‹ØþEÔ‚“¼EŒE숒Eˆ‚ˆ’E4ü–ü—ÉEpEôöE蛋ØþøüuhE¸ƒùudEœ†üüò„†üüu`Ë›­ìò†ÒþøuXEˆ›­ìò†ÒþøDþü†“®EŒ¦ˆ–’E4ü–üàDÿ„¸Dÿ›ãþøuTDþøüuDDþtˆ›‘Òþøö†üu@DþH†üüu0Dþ0üDø\†“®DùxŒDýœˆ–’Dù”ü–DúB’DûhDýL’Dû`øüøüøüøüDú`DúäöDú,þþÆ—ˆÁDøä¸Døx›ãþøu,D÷؈þ‘óßþøu(D÷Àƒùö†üu$D÷ üuD÷T†þøuDö´ˆ›Ÿì†ÒþøuDöœƒùuDöŒüu Dõ숛Ÿì†ÒþøuDõÔƒùuDõ¼ƒùtüDõ¬ütøDõ”ƒùÚ„žú‚ú‚ú‚ú‚ú‚ú‚üüò†ƒùtôDôxˆ›™ò†Òþøö†ütðDôPƒùtìD󰈛Ÿì†Òþøò†ƒùtèD𨓼Dñ芘Dóˆ–’Dòt‚ˆ–’Dò0ü–üÊDñ@DñÄöD𸛋ØþøtÄDð˜ütÀDêp“®D뀎Dí|þ––˜DïÀþ–’Díü–˜þ–˜þ˜¦Üü–üêêêêêêDë˜þ˜Dì þ–’DëÀ˜þ–’DëxDêì¸DꀛãþøDæÔ†“¼Dè Š˜Dé܈–’DéL‚ˆ–’Dèhü–DéþþDè„—ˆ‹DèDçxDçüöDæð›‹Øþøt¸DæÄ†üüò„†üüt´DæHˆþþøt¬Dæ0ƒùò†ƒùt”Dæüt€Dåøüt|DåàƒùDÕü„DãØ“®Dä茦ˆ–’Dåü–üàDäT¸Dãè›ãþDáÔ‚“®Dâ茦ˆ–’Dãü–üàDâT¸Dáè›ãþDßÔ‚“®Dà茦ˆ–’Dáü–üàDàT¸Dßè›ãþDÝÔ‚“®DÞ茦ˆ–’Dßü–üàDÞT¸DÝè›ãþDÛÔ‚“®DÜ茦ˆ–’DÝü–üàDÜT¸DÛè›ãþDÙÔ‚“®DÚ茦ˆ–’DÛü–üàDÚT¸DÙè›ãþD×ð‚“®DÙŒ®ˆ’DÙ ü–ü—ÉDØp¸DØ›ãþDÖ ‚“®D× Œ®ˆ’D×<ü–ü—ÉDÖŒ¸DÖ ›ãþøütlDÕhˆ›Ÿì†ÒþøDÔ †ˆ›™ò†óßþøthDÔ”ƒùt\DÔ|ƒùtTDÔ`ƒùtPDÔHƒùò†ƒùt<DÔ üt,DÔƒùt(DÓèüt DÓØüö†ütCþ¬DÑ0“¼DÒpŒDÓ4ˆ–’DÒЂˆ’Âü–üàDÑÈDÒLöDÑ@›‹ØþDΜ‚“¼DÏàŒDÐЈ’DÐ@‚ˆ–’DÏüü–üàDÏ8DϼöDΰ›‹ØþDÌ ‚“¼DÍPŒDÎ@ˆ’DͰ‚ˆ–’DÍlü–üàD̨DÍ,öDÌ ›‹ØþDÉ|‚“¼DÊÀŒD˰ˆ’DË ‚ˆ–’DÊÜü–üàDÊDÊœöDÉ›‹ØþDÆì‚“¼DÈ0ŒDÉ ˆ’DÈ‚ˆ–’DÈLü–üàDLjDÈ öDÇ›‹ØþDÄ\‚“¼DÅ ŒDƈ’DÆ‚ˆ–’Dżü–üàDÄøDÅ|öDÄp›‹ØþDÁÌ‚“¼DÃŒDĈ’DÃp‚ˆ–’DÃ,ü–üàDÂhDÂìöDÁà›‹ØþD¿<‚“¼DÀ€ŒDÁpˆ’DÀà‚ˆ–’DÀœü–üàD¿ØDÀ\öD¿P›‹ØþD¼¬‚“¼D½ðŒD¾àˆ’D¾P‚ˆ–’D¾ ü–üàD½HD½ÌöD¼À›‹ØþDº‚“¼D»`ŒD¼Pˆ’D»À‚ˆ–’D»|ü–üàDº¸D»<öDº0›‹ØþD·Œ‚“¼D¸ÐŒD¹Àˆ’D¹0‚ˆ–’D¸ìü–üàD¸(D¸¬öD· ›‹ØþD´ü‚“¼D¶@ŒD·0ˆ’D¶ ‚ˆ–’D¶\ü–üàDµ˜D¶öDµ›‹ØþD²l‚“¼D³°ŒD´ ˆ’D´‚ˆ–’D³Ìü–üàD³D³ŒöD²€›‹ØþD¯Ü‚“¼D± ŒD²ˆ’D±€‚ˆ–’D±<ü–üàD°xD°üöD¯ð›‹ØþD­L‚“¼D®ŒD¯€ˆ’D®ð‚ˆ–’D®¬ü–üàD­èD®löD­`›‹ØþDª¼‚“¼D¬ŒD¬ðˆ’D¬`‚ˆ–’D¬ü–üàD«XD«ÜöDªÐ›‹ØþD¨,‚“¼D©pŒDª4ˆ–’D©Ð‚ˆ’Âü–üàD¨ÈD©LöD¨@›‹ØþD¥p‚“¼D¦´ŒD§¤ˆ–’D§‚ˆ–’D¦Ðü–üàD¦ D¦öD¥„›‹ØþD¢´‚“¼D£øŒD¤èˆ–’D¤X‚ˆ–’D¤ü–üàD£PD£ÔöD¢È›‹ØþDŸø‚“¼D¡<ŒD¢,ˆ–’D¡œ‚ˆ–’D¡Xü–üàD ”D¡öD  ›‹ØþD<‚“¼Dž€ŒDŸpˆ–’Džà‚ˆ–’Džœü–üàDØDž\öDP›‹ØþDš€‚“¼D›ÄŒDœ´ˆ–’Dœ$‚ˆ–’D›àü–üàD›D› öDš”›‹ØþD—Ä‚“¼D™ŒD™øˆ–’D™h‚ˆ–’D™$ü–üàD˜`D˜äöD—Ø›‹ØþD•4‚“¼D–xŒD—<ˆ–’D–Ø‚ˆ’Âü–üàD•ÐD–TöD•H›‹ØþD’¤‚“¼D“èŒD”¬ˆ–’D”H‚ˆ’Âü–üàD“@D“ÄöD’¸›‹ØþDè‚“¼D‘,ŒD’ˆ–’D‘Œ‚ˆ–’D‘Hü–üàD„D‘öDü›‹ØþD,‚“¼DŽpŒD`ˆ–’DŽÐ‚ˆ–’DŽŒü–üàDÈDŽLöD@›‹ØþDŠp‚“¼D‹´ŒDŒ¤ˆ–’DŒ‚ˆ–’D‹Ðü–üàD‹ D‹öDŠ„›‹ØþD‡´‚“¼DˆøŒD‰èˆ–’D‰X‚ˆ–’D‰ü–üàDˆPDˆÔöD‡È›‹ØþD„ø‚“¼D†<ŒD‡,ˆ–’D†œ‚ˆ–’D†Xü–üàD…”D†öD… ›‹ØþD‚<‚“¼Dƒ€ŒD„pˆ–’Dƒà‚ˆ–’Dƒœü–üàD‚ØDƒ\öD‚P›‹ØþD€‚“¼D€ÄŒD´ˆ–’D$‚ˆ–’D€àü–üàD€D€ öD”›‹ØþD|ð‚“¼D~4ŒD~øˆ–’D~”‚ˆ’Âü–üàD}ŒD~öD}›‹ØþDz`‚“¼D{¤ŒD|hˆ–’D|‚ˆ’Âü–üàDzüD{€öDzt›‹ØþDw¤‚“¼DxèŒDy؈–’DyH‚ˆ–’Dyü–üàDx@DxÄöDw¸›‹ØþDtè‚“¼Dv,ŒDwˆ–’DvŒ‚ˆ–’DvHü–üàDu„DvöDtü›‹ØþDr,‚“¼DspŒDt`ˆ–’DsЂˆ–’DsŒü–üàDrÈDsLöDr@›‹ØþDop‚“¼Dp´ŒDq¤ˆ–’Dq‚ˆ–’DpÐü–üàDp DpöDo„›‹ØþDl´‚“¼DmøŒDn舖’DnX‚ˆ–’Dnü–üàDmPDmÔöDlÈ›‹ØþDiø‚“¼Dk<ŒDl,ˆ–’Dkœ‚ˆ–’DkXü–üàDj”DköDj ›‹ØþDg<‚“¼Dh€ŒDipˆ–’Dhà‚ˆ–’Dhœü–üàDgØDh\öDgP›‹ØþDd¬‚“¼DeðŒDf´ˆ–’DfP‚ˆ’Âü–üàDeHDeÌöDdÀ›‹ØþDb‚“¼Dc`ŒDd$ˆ–’DcÀ‚ˆ’Âü–üàDb¸Dc<öDb0›‹ØþD_`‚“¼D`¤ŒDa”ˆ–’Da‚ˆ–’D`Àü–üàD_üD`€öD_t›‹ØþD\¤‚“¼D]èŒD^؈–’D^H‚ˆ–’D^ü–üàD]@D]ÄöD\¸›‹ØþDYè‚“¼D[,ŒD\ˆ–’D[Œ‚ˆ–’D[Hü–üàDZ„D[öDYü›‹ØþDW,‚“¼DXpŒDY`ˆ–’DXЂˆ–’DXŒü–üàDWÈDXLöDW@›‹ØþDTp‚“¼DU´ŒDV¤ˆ–’DV‚ˆ–’DUÐü–üàDU DUöDT„›‹ØþDQ´‚“¼DRøŒDS舖’DSX‚ˆ–’DSü–üàDRPDRÔöDQÈ›‹ØþDNø‚“¼DP<ŒDQ,ˆ–’DPœ‚ˆ–’DPXü–üàDO”DPöDO ›‹ØþDLh‚“¼DM¬ŒDNpˆ–’DN ‚ˆ’Âü–üàDMDMˆöDL|›‹ØþDIØ‚“¼DKŒDKàˆ–’DK|‚ˆ’Âü–üàDJtDJøöDI웋ØþDG‚“¼DH`ŒDIPˆ–’DHÀ‚ˆ–’DH|ü–üàDG¸DH<öDG0›‹ØþDD`‚“¼DE¤ŒDF”ˆ–’DF‚ˆ–’DEÀü–üàDDüDE€öDDt›‹ØþDA¤‚“¼DBèŒDC؈–’DCH‚ˆ–’DCü–üàDB@DBÄöDA¸›‹ØþD>è‚“¼D@,ŒDAˆ–’D@Œ‚ˆ–’D@Hü–üàD?„D@öD>ü›‹ØþD<,‚“¼D=pŒD>`ˆ–’D=Ђˆ–’D=Œü–üàD<ÈD=LöD<@›‹ØþD9p‚“¼D:´ŒD;¤ˆ–’D;‚ˆ–’D:Ðü–üàD: D:öD9„›‹ØþD6´‚“¼D7øŒD8舖’D8X‚ˆ–’D8ü–üàD7PD7ÔöD6È›‹ØþD4$‚“¼D5hŒD6,ˆ–’D5È‚ˆ’Âü–üàD4ÀD5DöD48›‹ØþD1”‚“¼D2ØŒD3œˆ–’D38‚ˆ’Âü–üàD20D2´öD1¨›‹ØþD.Ø‚“¼D0ŒD1 ˆ–’D0|‚ˆ–’D08ü–üàD/tD/øöD.웋ØþD,‚“¼D-`ŒD.Pˆ–’D-À‚ˆ–’D-|ü–üàD,¸D-<öD,0›‹ØþD)`‚“¼D*¤ŒD+”ˆ–’D+‚ˆ–’D*Àü–üàD)üD*€öD)t›‹ØþD&¤‚“¼D'èŒD(؈–’D(H‚ˆ–’D(ü–üàD'@D'ÄöD&¸›‹ØþD#è‚“¼D%,ŒD&ˆ–’D%Œ‚ˆ–’D%Hü–üàD$„D%öD#ü›‹ØþD!,‚“¼D"pŒD#`ˆ–’D"Ђˆ–’D"Œü–üàD!ÈD"LöD!@›‹ØþDp‚“¼D´ŒD ¤ˆ–’D ‚ˆ–’DÐü–üàD DöD„›‹ØþDà‚“¼D$ŒD舖’D„‚ˆ’Âü–üàD|DöDô›‹ØþDP‚“¼D”ŒDXˆ–’Dô‚ˆ’Âü–üàDìDpöDd›‹ØþD”‚“¼DØŒDȈ–’D8‚ˆ–’Dôü–üàD0D´öD¨›‹ØþDØ‚“¼DŒD ˆ–’D|‚ˆ–’D8ü–üàDtDøöD웋ØþD‚“¼D`ŒDPˆ–’DÀ‚ˆ–’D|ü–üàD¸D<öD0›‹ØþD`‚“¼D¤ŒD”ˆ–’D‚ˆ–’DÀü–üàDüD€öDt›‹ØþD ¤‚“¼D èŒD ؈–’D H‚ˆ–’D ü–üàD @D ÄöD ¸›‹ØþDè‚“¼D ,ŒD ˆ–’D Œ‚ˆ–’D Hü–üàD „D öDü›‹ØþD,‚“¼DpŒD`ˆ–’DЂˆ–’DŒü–üàDÈDLöD@›‹ØþDœ‚“¼DàŒD¤ˆ–’D@‚ˆ’Âü–üàD8D¼öD°›‹ØþD(‚“¼DlŒD@ˆ’DÜ‚ˆ’Dˆü–ü—ÉDÄDHöD<›‹ØþCþ´‚“¼CÿøŒD̈’Dh‚ˆ’Dü–ü—ÉCÿPCÿÔöCþÈ›‹Øþøüò†ƒùt Cý܈›™ò†ÒþøtCýÀƒùö†üö†ütCýtŽú‚ú‚üüsøCü¼ˆ›™†ì†óßþøCìØ„Cú´“®CûÄŒ¦ˆ–’Cûàü–üàCû0¸CúÄ›ãþCø°‚“®CùÄŒ¦ˆ–’Cùàü–üàCù0¸CøÄ›ãþCö°‚“®C÷ÄŒ¦ˆ–’C÷àü–üàC÷0¸CöÄ›ãþCô°‚“®CõÄŒ¦ˆ–’Cõàü–üàCõ0¸CôÄ›ãþCò°‚“®CóÄŒ¦ˆ–’Cóàü–üàCó0¸CòÄ›ãþCð°‚“®CñÄŒ¦ˆ–’Cñàü–üàCñ0¸CðÄ›ãþCîÌ‚“®CïàŒ®ˆ’Cïüü–ü—ÉCïL¸Cîà›ãþCìè‚“®CíüŒ®ˆ’Cîü–ü—ÉCíh¸Cìü›ãþøüsôCì`ˆ›„ßþøsèCëÀˆ›Ÿì†ÒþøCë0†ˆ›‘Òþøö†üsäCꌈ›Ÿì†ÒþøsÜCèX“®CéhŠ˜¦ˆ–’Cé°ü–üÊCèÔ¸Cèh›ãþøsØC縈›Ÿì†ÒþøC伆“¼C折Cç$ˆ–’C攂ˆ–’CæPü–üÊCå`CåäöC䨛‹ØþøsÄCÞÔ“®Cß䊘Cä4ˆ–’Cà,ü–CàÚ’Cጌ¬¬¬Cã|Šª’ÂCâ°ü–ºþþÆ—ˆCâPÔÔòCàø¸CàÄþþÆ—ˆCßÜCßP¸CÞä›ãþøsÀCÝ ƒúþŸCÞ¬„„þöꆄ‚öꆆöCÝ€†ˆ¦õ·ä†‹Ø’ÍþøôüþÜs¸CÚCÚ¤“¼CÛäŒCܸˆ’CÜT‚ˆ’êÐü–ü—ÓöCÛ<CÛÀøþCÚ´›‹†óßþCÚ ˆ›‹†óßþøö†üö†üs°CÊ`“¼CË Š˜CÙXˆ–’CØÈ‚ˆ–’CËèü–C̲’CÏPCØ|’CÏHøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüCÌÐCÍ|öööCÌœþþCÌ—ˆ‹C˘CÊøCË|öCÊp›‹Øþøö†üs¨CÉxˆ›»ìò†ì†Òþøö†üCÃÔ†“¼CŨCÉ’CÅ øCÇàCÈŒ–’CÇÜ––’êCňøCÆCƘ˜CÇ „CÇ‚ˆ–’CÆÌü–üCÆ–’CÅpøüøüCÄxCÅ$öøþöCÃð›ŸìØþøs CÃÐüCÃ$†ˆ›ŸìùßþøBî „CÀ˜“¼CÁØŒCœˆ–’CÂ8‚ˆ’Âü–üàCÁ0CÁ´öCÀ¨›‹ØþC¾‚“¼C¿HŒCÀ8ˆ’C¿¨‚ˆ–’C¿dü–üàC¾ C¿$öC¾›‹ØþC»t‚“¼C¼¸ŒC½¨ˆ’C½‚ˆ–’C¼Ôü–üàC¼C¼”öC»ˆ›‹ØþC¸ä‚“¼Cº(ŒC»ˆ’Cºˆ‚ˆ–’CºDü–üàC¹€CºöC¸ø›‹ØþC¶T‚“¼C·˜ŒC¸ˆˆ’C·ø‚ˆ–’C·´ü–üàC¶ðC·töC¶h›‹ØþC³Ä‚“¼CµŒCµøˆ’Cµh‚ˆ–’Cµ$ü–üàC´`C´äöC³Ø›‹ØþC±4‚“¼C²xŒC³hˆ’C²Ø‚ˆ–’C²”ü–üàC±ÐC²TöC±H›‹ØþC®¤‚“¼C¯èŒC°Øˆ’C°H‚ˆ–’C°ü–üàC¯@C¯ÄöC®¸›‹ØþC¬‚“¼C­XŒC®Hˆ’C­¸‚ˆ–’C­tü–üàC¬°C­4öC¬(›‹ØþC©„‚“¼CªÈŒC«¸ˆ’C«(‚ˆ–’Cªäü–üàCª Cª¤öC©˜›‹ØþC¦ô‚“¼C¨8ŒC©(ˆ’C¨˜‚ˆ–’C¨Tü–üàC§C¨öC§›‹ØþC¤d‚“¼C¥¨ŒC¦˜ˆ’C¦‚ˆ–’C¥Äü–üàC¥C¥„öC¤x›‹ØþC¡Ô‚“¼C£ŒC¤ˆ’C£x‚ˆ–’C£4ü–üàC¢pC¢ôöC¡è›‹ØþCŸD‚“¼C ˆŒC¡xˆ’C è‚ˆ–’C ¤ü–üàCŸàC döCŸX›‹ØþCœ´‚“¼CøŒCžèˆ’CžX‚ˆ–’Cžü–üàCPCÔöCœÈ›‹ØþCš$‚“¼C›hŒCœXˆ’C›È‚ˆ–’C›„ü–üàCšÀC›DöCš8›‹ØþC—”‚“¼C˜ØŒC™œˆ–’C™8‚ˆ’Âü–üàC˜0C˜´öC—¨›‹ØþC”Ø‚“¼C–ŒC— ˆ–’C–|‚ˆ–’C–8ü–üàC•tC•øöC”웋ØþC’‚“¼C“`ŒC”Pˆ–’C“À‚ˆ–’C“|ü–üàC’¸C“<öC’0›‹ØþC`‚“¼C¤ŒC‘”ˆ–’C‘‚ˆ–’CÀü–üàCüC€öCt›‹ØþCŒ¤‚“¼CèŒCŽØˆ–’CŽH‚ˆ–’CŽü–üàC@CÄöCŒ¸›‹ØþC‰è‚“¼C‹,ŒCŒˆ–’C‹Œ‚ˆ–’C‹Hü–üàCŠ„C‹öC‰ü›‹ØþC‡,‚“¼CˆpŒC‰`ˆ–’CˆÐ‚ˆ–’CˆŒü–üàC‡ÈCˆLöC‡@›‹ØþC„œ‚“¼C…àŒC†¤ˆ–’C†@‚ˆ’Âü–üàC…8C…¼öC„°›‹ØþC‚ ‚“¼CƒPŒC„ˆ–’Cƒ°‚ˆ’Âü–üàC‚¨Cƒ,öC‚ ›‹ØþCP‚“¼C€”ŒC„ˆ–’C€ô‚ˆ–’C€°ü–üàCìC€pöCd›‹ØþC|”‚“¼C}ØŒC~Ȉ–’C~8‚ˆ–’C}ôü–üàC}0C}´öC|¨›‹ØþCyØ‚“¼C{ŒC| ˆ–’C{|‚ˆ–’C{8ü–üàCztCzøöCy웋ØþCw‚“¼Cx`ŒCyPˆ–’CxÀ‚ˆ–’Cx|ü–üàCw¸Cx<öCw0›‹ØþCt`‚“¼Cu¤ŒCv”ˆ–’Cv‚ˆ–’CuÀü–üàCtüCu€öCtt›‹ØþCq¤‚“¼CrèŒCs؈–’CsH‚ˆ–’Csü–üàCr@CrÄöCq¸›‹ØþCnè‚“¼Cp,ŒCqˆ–’CpŒ‚ˆ–’CpHü–üàCo„CpöCnü›‹ØþClX‚“¼CmœŒCn`ˆ–’Cmü‚ˆ’Âü–üàClôCmxöCll›‹ØþCiÈ‚“¼Ck ŒCkЈ–’Ckl‚ˆ’Âü–üàCjdCjèöCiÜ›‹ØþCg ‚“¼ChPŒCi@ˆ–’Ch°‚ˆ–’Chlü–üàCg¨Ch,öCg ›‹ØþCdP‚“¼Ce”ŒCf„ˆ–’Ceô‚ˆ–’Ce°ü–üàCdìCepöCdd›‹ØþCa”‚“¼CbØŒCcȈ–’Cc8‚ˆ–’Cbôü–üàCb0Cb´öCa¨›‹ØþC^Ø‚“¼C`ŒCa ˆ–’C`|‚ˆ–’C`8ü–üàC_tC_øöC^웋ØþC\‚“¼C]`ŒC^Pˆ–’C]À‚ˆ–’C]|ü–üàC\¸C]<öC\0›‹ØþCY`‚“¼CZ¤ŒC[”ˆ–’C[‚ˆ–’CZÀü–üàCYüCZ€öCYt›‹ØþCV¤‚“¼CWèŒCX؈–’CXH‚ˆ–’CXü–üàCW@CWÄöCV¸›‹ØþCT‚“¼CUXŒCVˆ–’CU¸‚ˆ’Âü–üàCT°CU4öCT(›‹ØþCQ„‚“¼CRÈŒCSŒˆ–’CS(‚ˆ’Âü–üàCR CR¤öCQ˜›‹ØþCNÈ‚“¼CP ŒCPüˆ–’CPl‚ˆ–’CP(ü–üàCOdCOèöCNÜ›‹ØþCL ‚“¼CMPŒCN@ˆ–’CM°‚ˆ–’CMlü–üàCL¨CM,öCL ›‹ØþCIP‚“¼CJ”ŒCK„ˆ–’CJô‚ˆ–’CJ°ü–üàCIìCJpöCId›‹ØþCF”‚“¼CGØŒCHȈ–’CH8‚ˆ–’CGôü–üàCG0CG´öCF¨›‹ØþCCØ‚“¼CEŒCF ˆ–’CE|‚ˆ–’CE8ü–üàCDtCDøöCC웋ØþCA‚“¼CB`ŒCCPˆ–’CBÀ‚ˆ–’CB|ü–üàCA¸CB<öCA0›‹ØþC>`‚“¼C?¤ŒC@”ˆ–’C@‚ˆ–’C?Àü–üàC>üC?€öC>t›‹ØþC;Ђ“¼C=ŒC=؈–’C=t‚ˆ’Âü–üàC¸ŒB?¨ˆ–’B?‚ˆ–’B>Ôü–üàB>B>”öB=ˆ›‹ØþB:¸‚“¼B;üŒB<숖’B<\‚ˆ–’B<ü–üàB;TB;ØöB:Ì›‹ØþB7ü‚“¼B9@ŒB:0ˆ–’B9 ‚ˆ–’B9\ü–üàB8˜B9öB8›‹ØþB5@‚“¼B6„ŒB7tˆ–’B6䂈–’B6 ü–üàB5ÜB6`öB5T›‹ØþB2°‚“¼B3ôŒB4¸ˆ–’B4T‚ˆ’Âü–üàB3LB3ÐöB2Ä›‹ØþB0 ‚“¼B1dŒB2(ˆ–’B1Ä‚ˆ’Âü–üàB0¼B1@öB04›‹ØþB-d‚“¼B.¨ŒB/˜ˆ–’B/‚ˆ–’B.Äü–üàB.B.„öB-x›‹ØþB*¨‚“¼B+ìŒB,܈–’B,L‚ˆ–’B,ü–üàB+DB+ÈöB*¼›‹ØþB'ì‚“¼B)0ŒB* ˆ–’B)‚ˆ–’B)Lü–üàB(ˆB) öB(›‹ØþB%0‚“¼B&tŒB'dˆ–’B&Ô‚ˆ–’B&ü–üàB%ÌB&PöB%D›‹ØþB"t‚“¼B#¸ŒB$¨ˆ–’B$‚ˆ–’B#Ôü–üàB#B#”öB"ˆ›‹ØþB¸‚“¼B üŒB!숖’B!\‚ˆ–’B!ü–üàB TB ØöBÌ›‹ØþBü‚“¼B@ŒB0ˆ–’B ‚ˆ–’B\ü–üàB˜BöB›‹ØþBl‚“¼B°ŒBtˆ–’B‚ˆ’Âü–üàBBŒöB€›‹ØþBø‚“¼B<ŒBˆ’B¬‚ˆ’BXü–ü—ÉB”BöB ›‹ØþB„‚“¼BÈŒBœˆ’B8‚ˆ’Bäü–ü—ÉB B¤öB˜›‹Øþøüs„Bàˆ›Ÿì†Òþøö†üs€BÀüB,†“¼BBh’BøøB8Bä–’B4––’êBàøBpBð˜Bø„Bh‚ˆ–’B$ü–üBl–’BÈøüøüBÐB|öøþöBH›ŸìØþøsxBD“¼B„Š˜B¤ˆ–’B‚ˆ–’BÌü–B–’BxB È’BpøüôøüøüøüøüøüøüøüøB¼þ–’B€øüB´BLööB€þþBè—ˆ‹B|BÜB`öBT›‹ØþøstB,ƒùslAå°B$“®B4Œ¦ˆ–’BPü–üàB ¸B4›ãþB ‚“®B4Œ¦ˆ–’BPü–üàB ¸B4›ãþAþ ‚“®Aÿ4Œ¦ˆ–’AÿPü–üàAþ ¸Aþ4›ãþAü ‚“®Aý4Œ¦ˆ–’AýPü–üàAü ¸Aü4›ãþAú ‚“®Aû4Œ¦ˆ–’AûPü–üàAú ¸Aú4›ãþAø ‚“®Aù4Œ¦ˆ–’AùPü–üàAø ¸Aø4›ãþAôD‚“®AõXŒA÷Ĉ’Aõtü–Aö"’AöÔŒ¦ˆ–’Aöðü–üàAö@¸Aö þþÆ—ˆÁAôĸAôX›ãþAðX‚“®AñlŒAó舒Añˆü–Aò6’Aò茮ˆ–’Aóü–ü—ÉAòT¸Aò þþÆ—ˆÁAðظAðl›ãþAå´“®Aè„Að ’Aè|øüøüøüøüøüôøüôøüøüøüøüøüøüøüøüøüAæ0AæÈööAåÄ›ãþøshAå¤üs`A创Ÿì†Òþøò†ƒùs\Aähˆ›‘ÒþøsXAã䈛‘ÒþøsPAã`ˆ›‘ÒþøA⤆ˆ›‘‹ÇþøsHAâ üsDA∛‘Òþøö†üs@AáPˆ›™†ì†ÒþøAआˆ›Ÿì†Òþøs<AÌAÞ¨“®A߸Œ¦ˆ–’AßÔü–üàAß$¸AÞ¸›ãþAܤ‚“®AݸŒ¦ˆ–’AÝÔü–üàAÝ$¸Aܸ›ãþAÚ¤‚“®AÛ¸Œ¦ˆ–’AÛÔü–üàAÛ$¸AÚ¸›ãþAؤ‚“®AÙ¸Œ¦ˆ–’AÙÔü–üàAÙ$¸Aظ›ãþAÖ¤‚“®A׸Œ¦ˆ–’A×Ôü–üàA×$¸AÖ¸›ãþAÔ¤‚“®AÕ¸Œ¦ˆ–’AÕÔü–üàAÕ$¸AÔ¸›ãþAМ‚“®AѰŒAÔHˆ’AÑÌü–AÒz’AÓ,Š˜¦ˆ–’AÓtü–üÊAÒ˜¸AÒdþþÆ—ˆÁAѸAа›ãþAÌ„‚“®A͘ŒAÐ@ˆ’AÍ´ü–AÎb’AÏŠ˜®ˆ–’AÏ\ü–ü—AÏ A΀¸AÎLþþÆ—ˆÁA͸A̘›ãþAÌ ˆ›ãþøs8AËlˆ›ŸìØþøs0AËTƒùs(Aʘˆ›™†ì†Òþøs$AÊ|üsAÊdƒùsAɨˆ›™†ì†Òþøs AÈЈ›»ìòò†ÒþørüAÈLˆ›‘ÒþørôA¸pAÆD“®AÇTŒ¦ˆ–’AÇpü–üàAÆÀ¸AÆT›ãþAÄ@‚“®AÅTŒ¦ˆ–’AÅpü–üàAÄÀ¸AÄT›ãþAÂ@‚“®AÃTŒ¦ˆ–’AÃpü–üàAÂÀ¸AÂT›ãþAÀ@‚“®AÁTŒ¦ˆ–’AÁpü–üàAÀÀ¸AÀT›ãþA¾@‚“®A¿TŒ¦ˆ–’A¿pü–üàA¾À¸A¾T›ãþA¼@‚“®A½TŒ¦ˆ–’A½pü–üàA¼À¸A¼T›ãþAº\‚“®A»pŒ®ˆ’A»Œü–ü—ÉAºÜ¸Aºp›ãþA¸x‚“®A¹ŒŒ®ˆ’A¹¨ü–ü—ÉA¸ø¸A¸Œ›ãþøürðA·¸ˆ›™†ì†óßþørìA£ÔƒA· þA£îA·ŒA£êþŸA·|ƒùA¯P„A³P“A´ A´ÜA·$’A´ØA¶üA´ÔøAµÐA¶€þ–AµÌ––’êêêA´ÀAµ¤A´¼ø¤¦ˆ’Âü–üêÞA´A´ŒþøþA³`¦÷þ§üð†üÎþA¯\“¼A°¸A³’A°´A²ØA°°øA±¬A²\þ–A±¨––’êêêA°œA±€A°˜ø¤¦ˆ’Âü–üêÞA¯ôºþA¯l¦÷þ™üÎþøA­X†“A®.A®ÐŠš—Ë—ßA®(A®°þøþA­t¦÷þ¯üð†üç’ÍþøA§\†“¼A©0ôøA¬„A­„A¬ˆü’—ˆA©þôøA¬’A¨ÔA«ÜA¨ÐøA«,¦ˆ’Âü–üA¨¼A«A¨¸øA©tAª4þ––þþA©p––’—ÓêêA¨¤A©HA¨ A¨A¨„øþA§x¦÷þ™üÎþøA¥ †“¼A¦ØŠ¥ñþèöA¦DºþA¥¼¦÷þ™üïßþøA¤ð†—ñ¦õ“†ÊþøA¤0†—ñ¦õ“†‹A¤HþøôüþÞrèA£¸ƒùrÜA“ÜA¡°“®A¢ÀŒ¦ˆ–’A¢Üü–üàA¢,¸A¡À›ãþAŸ¬‚“®A ÀŒ¦ˆ–’A Üü–üàA ,¸AŸÀ›ãþA¬‚“®AžÀŒ¦ˆ–’AžÜü–üàAž,¸AÀ›ãþA›¬‚“®AœÀŒ¦ˆ–’AœÜü–üàAœ,¸A›À›ãþA™¬‚“®AšÀŒ¦ˆ–’AšÜü–üàAš,¸A™À›ãþA—¬‚“®A˜ÀŒ¦ˆ–’A˜Üü–üàA˜,¸A—À›ãþA•È‚“®A–ÜŒ®ˆ’A–øü–ü—ÉA–H¸A•Ü›ãþA“ä‚“®A”øŒ®ˆ’A•ü–ü—ÉA”d¸A“ø›ãþøüò†ƒùrÔA“¬†üürÐAˆ“®AŽ˜ŽA”þ––˜A’Øþ–’A‘–˜þ–˜þ˜¦Üü–üêêêêêêAްþ˜A¸þ–’AŽØ˜þ–’AŽAޏA˜›ãþørÌAlƒùò†ƒùrÄA8†üürÀA$ƒùr¸A ƒùr¨AŒˆˆ›„ßþøA‹À†ˆ›™†ì†ÒþøA‹ †ˆ›‹†ÒþøA„ø†“®A†ŽAˆþ––˜AŠTþ–’Aˆ–˜þ–˜þ˜¦Üü–üêêêêêêA†,þ˜A‡4þ–’A†T˜þ–’A† A…€¸A…›ãþør A„Hˆ›™†ì†Òþør”Aƒ¨ˆ›Ÿì†óßþørˆAƒ˜üꄎú‚ú‚üür€A‚Ј›Ÿì†ÒþørpA‚ÀürhA‚P«þò„þæ„üþô÷ò†ƒùrXA€“®AŠ˜¦ˆ–’A\ü–üÊA€€¸A€›ãþøð†ƒùö†ürPA¼ƒùrLAˆ›Ÿì†óßþøð†ƒùr8AjXA|ø“®A~Œ¦ˆ–’A~$ü–üàA}t¸A}›ãþAzô‚“®A|Œ¦ˆ–’A|$ü–üàA{t¸A{›ãþAxô‚“®AzŒ¦ˆ–’Az$ü–üàAyt¸Ay›ãþAvô‚“®AxŒ¦ˆ–’Ax$ü–üàAwt¸Aw›ãþAtô‚“®AvŒ¦ˆ–’Av$ü–üàAut¸Au›ãþArô‚“®AtŒ¦ˆ–’At$ü–üàAst¸As›ãþAnì‚“®ApŒAr˜ˆ’Apü–ApÊ’Aq|Š˜¦ˆ–’AqÄü–üÊApè¸Ap´þþÆ—ˆÁAol¸Ao›ãþAjÔ‚“®AkèŒAnˆ’Alü–Al²’AmdŠ˜®ˆ–’Am¬ü–ü—Am\AlиAlœþþÆ—ˆÁAkT¸Ajè›ãþAj\ˆ›ãþøACЄAgÄ“¼AiŒAiôˆ’êAid‚ˆ–’Ai ü–üàAh\AhäþöAgÔ›ŸìØþAe0‚“¼AftŒAgdˆ’êAfÔ‚ˆ–’Afü–üàAeÌAfTþöAeD›ŸìØþAb ‚“¼AcäŒAdÔˆ’êAdD‚ˆ–’Adü–üàAc<AcÄþöAb´›ŸìØþA`‚“¼AaTŒAbDˆ’êAa´‚ˆ–’Aapü–üàA`¬Aa4þöA`$›ŸìØþA]€‚“¼A^ÄŒA_´ˆ’êA_$‚ˆ–’A^àü–üàA^A^¤þöA]”›ŸìØþAZð‚“¼A\4ŒA]$ˆ’êA\”‚ˆ–’A\Pü–üàA[ŒA\þöA[›ŸìØþAUÈ‚“¼AW ŒAZ”ˆ’êÊ‚ˆ’AW(ü–AWò’AX¸Š˜AYÔˆ’êAYD‚ˆ–’AYü–üÊAXAX˜þöAWÜþþAWD—ˆŸìAWAVdAVìþöAUÜ›ŸìØþAP‚“¼AQÔŒAUlˆ’êÊ‚ˆ’AQðü–ARº’AS€Š˜AT¬ˆ’êAT‚ˆ–’ASÈü–ü—ASxARØAS`þöAR¤þþAR —ˆŸìAQÌAQ,AQ´þöAP¤›ŸìØþACÜ“¼AFäAPD’AFÜøüôøüøüøüøüøüøüøüøüôøüøüøüøüøüøüøüøüADtADüþöAC웟ìØþør0A6Ü“®A7슘ACHˆ–’A84ü–A8â’A;ABø’A;øüøüøüøüøüøüøüøüøüøüøüøüøüøüøüA9A9„öA8ÌþþÆ—ˆA7äA7X¸A6ì›ãþør(A)ƒA6ÄþA)6A6°A)2þŸA6 ƒùA,<„A5ðˆ¦õ§ì†ÊþA1H‚“A1úA2ÌA5 ’A2ÈA5xA2ÄøA4LA4üþ–A4H––’êêêA2°A4 A2¬ø¢˜A3¼ˆ’êÊ‚ˆ’Âü–üêêÞA1ôA2|þøþA1\¦õ§üð†üÎþA,H“A,öA-ÈA0ü’A-ÄA0ÔA-ÀøA/XA0þ––þþA/T––’êêêA-¬A/,A-¨ø¢˜A.Ȉ’ꂈ’—A.ü–üêêÞA,ðA-xþøþA,X¦õ§üð†üÎþøA+¨†ˆ¦õ™ÊþøA*膈¦õ¯ì†ã’ÍþøA*8†—ñ¦õ“†ÊþøA)x†—ñ¦õ“†‹A)þøôüþÞr$A(´ˆþþøò„†üür A(ŒürA(tƒùr A'ðˆ›ãþøA „A%è“®A&øŒ¦ˆ–’A'ü–üàA&d¸A%ø›ãþA#ä‚“®A$øŒ¦ˆ–’A%ü–üàA$d¸A#ø›ãþA!ä‚“®A"øŒ¦ˆ–’A#ü–üàA"d¸A!ø›ãþAä‚“®A øŒ¦ˆ–’A!ü–üàA d¸Aø›ãþAä‚“®AøŒ¦ˆ–’Aü–üàAd¸Aø›ãþAä‚“®AøŒ¦ˆ–’Aü–üàAd¸Aø›ãþA‚“®AŒ®ˆ’A0ü–ü—ÉA€¸A›ãþA‚“®A0Œ®ˆ’ALü–ü—ÉAœ¸A0›ãþøürAAœ“¼AÜŒA°ˆ’AL‚ˆ’êÐü–ü—ÓöA4A¸øþA¬›‹†óßþAˆ›‹†óßþøqü@@Al“¼A¬ŒApˆ–’A ‚ˆ’Âü–üàAAˆöA|›‹ØþAØ‚“¼AŒAàˆ–’A|‚ˆ’Âü–üàAtAøöA웋ØþA H‚“¼AŒŒAPˆ–’A삈’Âü–üàA äAhöA \›‹ØþA ¸‚“¼A üŒA Àˆ–’A \‚ˆ’Âü–üàA TA ØöA Ì›‹ØþA(‚“¼A lŒA \ˆ’A Ì‚ˆ–’A ˆü–üàAÄA HöA<›‹ØþA˜‚“¼A܌ĒA<‚ˆ–’Aøü–üàA4A¸öA¬›‹ØþA‚“¼ALŒA<ˆ’A¬‚ˆ–’Ahü–üàA¤A(öA›‹ØþAx‚“¼A¼ŒA¬ˆ’A‚ˆ–’AØü–üàAA˜öAŒ›‹Øþ@ýè‚“¼@ÿ,ŒAˆ’@ÿŒ‚ˆ–’@ÿHü–üà@þ„@ÿö@ýü›‹Øþ@ûX‚“¼@üœŒ@ýŒˆ’@üü‚ˆ–’@ü¸ü–üà@ûô@üxö@ûl›‹Øþ@øÈ‚“¼@ú Œ@úüˆ’@úl‚ˆ–’@ú(ü–üà@ùd@ùèö@øÜ›‹Øþ@ö8‚“¼@÷|Œ@ølˆ’@÷Ü‚ˆ–’@÷˜ü–üà@öÔ@÷Xö@öL›‹Øþ@󨂓¼@ôìŒ@õ܈’@õL‚ˆ–’@õü–üà@ôD@ôÈö@󼛋Øþ@ñ‚“¼@ò\Œ@óLˆ’@ò¼‚ˆ–’@òxü–üà@ñ´@ò8ö@ñ,›‹Øþ@“¼@ïÌŒ@𼈒@ð,‚ˆ–’@ïèü–üà@ï$@ï¨ö@‹Øþ@ëø‚“¼@í<Œ@î,ˆ’@휂ˆ–’@íXü–üà@ì”@íö@ì ›‹Øþ@éh‚“¼@ꬌ@뜈’@ë ‚ˆ–’@êÈü–üà@ê@êˆö@é|›‹Øþ@æØ‚“¼@èŒ@é ˆ’@è|‚ˆ–’@è8ü–üà@çt@çøö@æì›‹Øþ@äH‚“¼@匌@æ|ˆ’@å삈–’@å¨ü–üà@ää@åhö@ä\›‹Øþ@Ḃ“¼@âüŒ@ãÀˆ–’@ã\‚ˆ’Âü–üà@âT@âØö@áÌ›‹Øþ@Þü‚“¼@à@Œ@á0ˆ–’@à ‚ˆ–’@à\ü–üà@ߘ@àö@ß›‹Øþ@Ü@‚“¼@Ý„Œ@Þtˆ–’@Ý䂈–’@Ý ü–üà@ÜÜ@Ý`ö@ÜT›‹Øþ@Ù„‚“¼@ÚÈŒ@Û¸ˆ–’@Û(‚ˆ–’@Úäü–üà@Ú @Ú¤ö@Ù˜›‹Øþ@ÖÈ‚“¼@Ø Œ@Øüˆ–’@Øl‚ˆ–’@Ø(ü–üà@×d@×èö@ÖÜ›‹Øþ@Ô ‚“¼@ÕPŒ@Ö@ˆ–’@Õ°‚ˆ–’@Õlü–üà@Ô¨@Õ,ö@Ô ›‹Øþ@ÑP‚“¼@Ò”Œ@Ó„ˆ–’@Òô‚ˆ–’@Ò°ü–üà@Ñì@Òpö@Ñd›‹Øþ@ÎÀ‚“¼@ÐŒ@ÐȈ–’@Ðd‚ˆ’Âü–üà@Ï\@Ïàö@ÎÔ›‹Øþ@Ì0‚“¼@ÍtŒ@Î8ˆ–’@ÍÔ‚ˆ’Âü–üà@ÌÌ@ÍPö@ÌD›‹Øþ@Ét‚“¼@ʸŒ@˨ˆ–’@Ë‚ˆ–’@ÊÔü–üà@Ê@Ê”ö@Ɉ›‹Øþ@Ƹ‚“¼@ÇüŒ@È숖’@È\‚ˆ–’@Èü–üà@ÇT@ÇØö@ÆÌ›‹Øþ@Ãü‚“¼@Å@Œ@Æ0ˆ–’@Å ‚ˆ–’@Å\ü–üà@Ę@Åö@Ä›‹Øþ@Á@‚“¼@„Œ@Ãtˆ–’@Â䂈–’@ ü–üà@ÁÜ@Â`ö@ÁT›‹Øþ@¾„‚“¼@¿ÈŒ@À¸ˆ–’@À(‚ˆ–’@¿äü–üà@¿ @¿¤ö@¾˜›‹Øþ@»È‚“¼@½ Œ@½üˆ–’@½l‚ˆ–’@½(ü–üà@¼d@¼èö@»Ü›‹Øþ@¹ ‚“¼@ºPŒ@»@ˆ–’@º°‚ˆ–’@ºlü–üà@¹¨@º,ö@¹ ›‹Øþ@¶|‚“¼@·ÀŒ@¸„ˆ–’@¸ ‚ˆ’Âü–üà@·@·œö@¶›‹Øþ@³ì‚“¼@µ0Œ@µôˆ–’@µ‚ˆ’Âü–üà@´ˆ@µ ö@´›‹Øþ@±0‚“¼@²tŒ@³dˆ–’@²Ô‚ˆ–’@²ü–üà@±Ì@²Pö@±D›‹Øþ@®t‚“¼@¯¸Œ@°¨ˆ–’@°‚ˆ–’@¯Ôü–üà@¯@¯”ö@®ˆ›‹Øþ@«¸‚“¼@¬üŒ@­ìˆ–’@­\‚ˆ–’@­ü–üà@¬T@¬Øö@«Ì›‹Øþ@¨ü‚“¼@ª@Œ@«0ˆ–’@ª ‚ˆ–’@ª\ü–üà@©˜@ªö@©›‹Øþ@¦@‚“¼@§„Œ@¨tˆ–’@§ä‚ˆ–’@§ ü–üà@¦Ü@§`ö@¦T›‹Øþ@£„‚“¼@¤ÈŒ@¥¸ˆ–’@¥(‚ˆ–’@¤äü–üà@¤ @¤¤ö@£˜›‹Øþ@ È‚“¼@¢ Œ@¢üˆ–’@¢l‚ˆ–’@¢(ü–üà@¡d@¡èö@ Ü›‹Øþ@ž8‚“¼@Ÿ|Œ@ @ˆ–’@ŸÜ‚ˆ’Âü–üà@žÔ@ŸXö@žL›‹Øþ@›¨‚“¼@œìŒ@°ˆ–’@L‚ˆ’Âü–üà@œD@œÈö@›¼›‹Øþ@˜ì‚“¼@š0Œ@› ˆ–’@š‚ˆ–’@šLü–üà@™ˆ@š ö@™›‹Øþ@–0‚“¼@—tŒ@˜dˆ–’@—Ô‚ˆ–’@—ü–üà@–Ì@—Pö@–D›‹Øþ@“t‚“¼@”¸Œ@•¨ˆ–’@•‚ˆ–’@”Ôü–üà@”@””ö@“ˆ›‹Øþ@¸‚“¼@‘üŒ@’숖’@’\‚ˆ–’@’ü–üà@‘T@‘Øö@Ì›‹Øþ@ü‚“¼@@Œ@0ˆ–’@ ‚ˆ–’@\ü–üà@Ž˜@ö@Ž›‹Øþ@‹@‚“¼@Œ„Œ@tˆ–’@Œä‚ˆ–’@Œ ü–üà@‹Ü@Œ`ö@‹T›‹Øþ@ˆ„‚“¼@‰ÈŒ@Џˆ–’@Š(‚ˆ–’@‰äü–üà@‰ @‰¤ö@ˆ˜›‹Øþ@…ô‚“¼@‡8Œ@‡üˆ–’@‡˜‚ˆ’Âü–üà@†@‡ö@†›‹Øþ@ƒd‚“¼@„¨Œ@…lˆ–’@…‚ˆ’Âü–üà@„@„„ö@ƒx›‹Øþ@€¨‚“¼@ìŒ@‚܈–’@‚L‚ˆ–’@‚ü–üà@D@Èö@€¼›‹Øþ@}ì‚“¼@0Œ@€ ˆ–’@‚ˆ–’@Lü–üà@~ˆ@ ö@~›‹Øþ@{0‚“¼@|tŒ@}dˆ–’@|Ô‚ˆ–’@|ü–üà@{Ì@|Pö@{D›‹Øþ@xt‚“¼@y¸Œ@z¨ˆ–’@z‚ˆ–’@yÔü–üà@y@y”ö@xˆ›‹Øþ@u¸‚“¼@vüŒ@w숖’@w\‚ˆ–’@wü–üà@vT@vØö@uÌ›‹Øþ@rü‚“¼@t@Œ@u0ˆ–’@t ‚ˆ–’@t\ü–üà@s˜@tö@s›‹Øþ@p@‚“¼@q„Œ@rtˆ–’@q䂈–’@q ü–üà@pÜ@q`ö@pT›‹Øþ@m°‚“¼@nôŒ@o¸ˆ–’@oT‚ˆ’Âü–üà@nL@nÐö@mÄ›‹Øþ@k ‚“¼@ldŒ@m(ˆ–’@lÄ‚ˆ’Âü–üà@k¼@l@ö@k4›‹Øþ@hd‚“¼@i¨Œ@j˜ˆ–’@j‚ˆ–’@iÄü–üà@i@i„ö@hx›‹Øþ@e¨‚“¼@fìŒ@g܈–’@gL‚ˆ–’@gü–üà@fD@fÈö@e¼›‹Øþ@bì‚“¼@d0Œ@e ˆ–’@d‚ˆ–’@dLü–üà@cˆ@d ö@c›‹Øþ@`0‚“¼@atŒ@bdˆ–’@aÔ‚ˆ–’@aü–üà@`Ì@aPö@`D›‹Øþ@]t‚“¼@^¸Œ@_¨ˆ–’@_‚ˆ–’@^Ôü–üà@^@^”ö@]ˆ›‹Øþ@Z¸‚“¼@[üŒ@\숖’@\\‚ˆ–’@\ü–üà@[T@[Øö@ZÌ›‹Øþ@Wü‚“¼@Y@Œ@Z0ˆ–’@Y ‚ˆ–’@Y\ü–üà@X˜@Yö@X›‹Øþ@Ul‚“¼@V°Œ@Wtˆ–’@W‚ˆ’Âü–üà@V@VŒö@U€›‹Øþ@R°‚“¼@SôŒ@T䈖’@TT‚ˆ–’@Tü–üà@SL@SÐö@RÄ›‹Øþ@Oô‚“¼@Q8Œ@R(ˆ–’@Q˜‚ˆ–’@QTü–üà@P@Qö@P›‹Øþ@M8‚“¼@N|Œ@Olˆ–’@NÜ‚ˆ–’@N˜ü–üà@MÔ@NXö@ML›‹Øþ@J|‚“¼@KÀŒ@L°ˆ–’@L ‚ˆ–’@KÜü–üà@K@Kœö@J›‹Øþ@GÀ‚“¼@IŒ@Iôˆ–’@Id‚ˆ–’@I ü–üà@H\@Hàö@GÔ›‹Øþ@E‚“¼@FHŒ@G8ˆ–’@F¨‚ˆ–’@Fdü–üà@E @F$ö@E›‹Øþ@B‚“¼@CÔŒ@D¨ˆ’@DD‚ˆ’@Cðü–ü—É@C,@C°ö@B¤›‹Øþ@@‚“¼@A`Œ@B4ˆ’@AЂˆ’@A|ü–ü—É@@¸@A<ö@@0›‹Øþøüqø@@ƒùqô@?ðüqè@?€‡ü”„þò„þôô÷qà@>Ĉ›™†ì†Òþø@<„†“®@= Š˜¦ˆ–’@=èü–üÊ@= ¸@< ›ãþøqÜ@<‡ü „þò„þò„þôô÷qÐ@;¼†þøqÈ@%`“®@&pŠ˜@;(ˆ–’@&¸ü–@'f’@*¸@:Ø’@*°øüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøüôø@/’@(ˆø@-øþ˜¦ˆ’Âü–ü@(pôø@-D–––üê@(@ø@+àþ–˜þ˜¦Üü–üêê@((ø@*Ðþ˜¦ˆ’Âü–ü@(@'„¸@'PþþÆ—ˆ@&h@%ܸ@%p›ãþøqÀ@%Hƒù@"8„†“@#@#¼Œ@$àˆ’@$|‚ˆ’@$‚ˆ’êØü–üêö@#@#˜öøþ@"\›™ò†óßþøüq¼@!Àˆ›‘Òþøq¸@!¨ƒùq @!˜ü@X†“®@ tŠ˜¦ˆ–’@ ¼ü–üÊ@à¸@t›ãþøq@ d@\“®@lŒ¦ˆ–’@ˆü–üà@ظ@l›ãþ@X‚“®@lŒ¦ˆ–’@ˆü–üà@ظ@l›ãþ@X‚“®@lŒ¦ˆ–’@ˆü–üà@ظ@l›ãþ@X‚“®@lŒ¦ˆ–’@ˆü–üà@ظ@l›ãþ@X‚“®@lŒ¦ˆ–’@ˆü–üà@ظ@l›ãþ@X‚“®@lŒ¦ˆ–’@ˆü–üà@ظ@l›ãþ@t‚“®@ˆŒ®ˆ’@¤ü–ü—É@ô¸@ˆ›ãþ@ l‚“®@€Œ@ˆ’@œü–@J’@üŠ˜¦ˆ–’@Dü–üÊ@h¸@4þþÆ—ˆÁ@ ì¸@ €›ãþøüò†ƒùqˆ@l“®@|Š˜@ ¼ˆ–’@Äü–@r’@ œ@ l’@ ”øüøüøüøüøü@¸@\þþÆ—ˆ@t@è¸@|›ãþø?û †“®?ü(Š˜@؈–’?üpü–?ý’?þØ@ˆ’?þÐøüøüøüøüøüøüøüôø@–––üê?ýøø?ÿ þ–˜þ˜¦Üü–üêê?ýàø?þðþ–’?ýÈ?ý<¸?ýþþÆ—ˆ?ü ?û”¸?û(›ãþøö†üö†üq„?úèüq|?úØüqd?æ0?øÐ“®?ùàŒ¦ˆ–’?ùüü–üà?ùL¸?øà›ãþ?öÌ‚“®?÷àŒ¦ˆ–’?÷üü–üà?÷L¸?öà›ãþ?ôÌ‚“®?õàŒ¦ˆ–’?õüü–üà?õL¸?ôà›ãþ?òÌ‚“®?óàŒ¦ˆ–’?óüü–üà?óL¸?òà›ãþ?ðÌ‚“®?ñàŒ¦ˆ–’?ñüü–üà?ñL¸?ðà›ãþ?îÌ‚“®?ïàŒ¦ˆ–’?ïüü–üà?ïL¸?îà›ãþ?êÄ‚“®?ëØŒ?îpˆ’?ëôü–?좒?íTŠ˜¦ˆ–’?íœü–üÊ?ìÀ¸?ìŒþþÆ—ˆÁ?ëD¸?êØ›ãþ?欂“®?çÀŒ?êhˆ’?çÜü–?芒?é<Š˜®ˆ–’?é„ü–ü—?é4?訸?ètþþÆ—ˆÁ?ç,¸?æÀ›ãþ?æ4ˆ›ãþøqX?æ†üüq4?䘈þŸ?æƒù?å(†ˆ¦õ·ä†‹Ø’ÍþøôüþÎþøq0?䀃ù?ܼ„?áD“¼?⨊˜?䈒?ã´‚ˆ’?ãD‚ˆ’—ÓÐü–ü—Óêö?áÜ?âtöøŸß?áT›‹ùßþ?ÞÌ‚“¼?àŒ?à䈒?à€‚ˆ’?à,ü–ü—Óö?ßh?ßìö?Þà›‹ùßþ?ÜȈ›?Þ”?Ý’úþŸ?Þx„‚öꆆö?Ýt†ˆ¦õ·ä†‹Ø’ÍþøôüþÀþø?܆ˆ›Ÿì†Òþø?Ù„†“?Ùæ?ÚœŒ?ÛÀˆ’?Û\‚ˆ’?Úü‚ˆ’êØü–üêö?Ùà?Úxöøþ?Ù<›™ò†óßþøüq$?Ø”?Ùˆ›‘Òþøò†ƒùq ?¾°?Öx“®?׈Œ¦ˆ–’?פü–üà?Öô¸?Öˆ›ãþ?Ôt‚“®?ÕˆŒ¦ˆ–’?Õ¤ü–üà?Ôô¸?Ôˆ›ãþ?Òt‚“®?ÓˆŒ¦ˆ–’?Ó¤ü–üà?Òô¸?Òˆ›ãþ?Ðt‚“®?шŒ¦ˆ–’?Ѥü–üà?Ðô¸?Ј›ãþ?Ît‚“®?ψŒ¦ˆ–’?Ϥü–üà?Îô¸?Έ›ãþ?Ìt‚“®?͈Œ¦ˆ–’?ͤü–üà?Ìô¸?̈›ãþ?Èl‚“®?É€Œ?̈’?Éœü–?ÊJ’?ÊüŠ˜¦ˆ–’?ËDü–üÊ?Êh¸?Ê4þþÆ—ˆÁ?Èì¸?È€›ãþ?ÄT‚“®?ÅhŒ?Ȉ’?Å„ü–?Æ2’?ÆäŠ˜®ˆ–’?Ç,ü–ü—?ÆÜ?ÆP¸?ÆþþÆ—ˆÁ?ÄÔ¸?Äh›ãþ?¾´“®?À€?Ä’?Àxøüøüøüøüøüøüøü?¿0?¿´ö?¾Ä›ãþøq?¾ˆŽú‚ú‚üüq?¾p†üüq?½¸ˆ›™ò†Òþøq ?½œƒùö†üq?¼ìˆ›Ÿì†Òþøpü?¹Ô?ºp“¼?»°Œ?¼„ˆ’?¼ ‚ˆ’êÐü–ü—Óö?»?»Œøþ?º€›‹†óßþ?¹Øˆ›‹†óßþøpð?¶ü“®?¸ Ž?¹T–’?¸$þ˜þ––’?¸?·x¸?· ›ãþøö†üpì?¶Ðüò„†üüpä?¶ ƒùpà?‘dƒ?¶ˆþ?‘~?¶t?‘zþŸ?¶dƒù?”„„?µ´ˆ¦õ§ì†Êþ?°ü‚“?±®?²€?µd’?²|?µ<?²xø?´?´Àþ–?´ ––’êêê?²d?³ä?²`ø¢˜?³€ˆ’êÊ‚ˆ’?²Èü–ü—ÓêÞ?±¨?²0þøþ?±¦õ§üð†üÎþ?”“?•>?–?°°’?– ?°ˆ?–ø?¯ ?¯¼þ––þþ?¯––’êêê?•ô?®à?•ðø¢?­°?®|ˆ’ꂈ’—?­´ü–ü—Ó?–¡?­”þ?–Zü?­€?–NþŸ?­pƒù? Œ„?¬Àˆ¦õ§ì†Êþ?¦¨‚“?§Z?¨D?¬p’?¨@?¬Hê„?¨<ø?ªŒ˜?«Àˆ’ê?«‚Šþ–’êêØü–üêê?¨(?ªd?¨$ø?©8?©èþ–?©4––’êêê?¨?© ?¨ ø°¦ˆ’Âü–üêÒ?§T?§Üþøþ?¦¼¦õ§üð†üÎþ? ˜“?¡F?¢0?¦\’?¢,?¦4ê„?¢(ø?¤x˜?¥¬ˆ’ê?¤ð‚Šþ–’êêØü–üêê?¢?¤P?¢ø?£$?£Ôþ–?£ ––’êêê?¡ü?¢ø?¡øø°¦ˆ’Âü–üêÒ?¡@?¡Èþøþ? ¨¦õ§üð†üÎþø?ž†“¼?ŸTŒ¦Šþž’—Óâ—Áü–üêö?žÀºþ?ž8¦÷þ™üïßþøê†ˆþö?˜Ä†“¶?š8?¨’?š ?œô¦ˆ’Âü–ü?š?›ä¦Šþ–’êêØü–ü?™ð°?›þ––þþ?šL––’—Óêê?™\ºþ?˜à¦õ™Êþø?˜†ˆ¦õ¯ì†ã’Íþø?—T†—ñ¦õ“†Êþø?–”†—ñ¦õ“†‹?–¬þøôüþ?•Ø?•8?•Àþøþ?” ¦õ§üð†üÎþø?“ð†ˆ¦õ™Êþø?“0†ˆ¦õ¯ì†ã’Íþø?’€†—ñ¦õ“†Êþø?‘À†—ñ¦õ“†‹?‘ØþøôüþÞpØ?‘LƒùpÔ>xx?Ž$“?ŽÞ?”Œ?䈒ê?T‚ˆ–’?ô‚ˆ’Âü–üà?ŽØ?tþöö?Ž4›­ìòØþ?‹‚“?‹¾?ŒtŒ?Ĉ’êÊ‚ˆ’?ŒÔ‚ˆ–’?Œü–üà?‹¸?ŒTþöö?‹›­ìòØþ?‡à‚“?ˆž?‰TŒ?Фˆ’êÊ‚ˆ’?‰´‚ˆ–’?‰pü–üà?ˆ˜?‰4þöö?‡ô›­ìòØþ?„À‚“?…~?†4Œ?‡„ˆ’êÊ‚ˆ’?†”‚ˆ–’?†Pü–üà?…x?†þöö?„Ô›­ìòØþ? ‚“?‚^?ƒŒ?„dˆ’êÊ‚ˆ’?ƒt‚ˆ–’?ƒ0ü–üà?‚X?‚ôþöö?´›­ìòØþ?~€‚“?>?ôŒ?Dˆ’êÊ‚ˆ’?€T‚ˆ–’?€ü–üà?8?Ôþöö?~”›­ìòØþ?{`‚“?|?|ÔŒ?~$ˆ’êÊ‚ˆ’?}4‚ˆ–’?|ðü–üà?|?|´þöö?{t›­ìòØþ?x@‚“?xþ?y´Œ?{ˆ’êÊ‚ˆ’?z‚ˆ–’?yÐü–üà?xø?y”þöö?xT›­ìòØþ?u ‚“?uÞ?v”Œ?w䈒êÊ‚ˆ’?vô‚ˆ–’?v°ü–üà?uØ?vtþöö?u4›­ìòØþ?r‚“?r¾?stŒ?tĈ’êÊ‚ˆ’?sÔ‚ˆ–’?sü–üà?r¸?sTþöö?r›­ìòØþ?nà‚“?ož?pTŒ?q¤ˆ’êÊ‚ˆ’?p´‚ˆ–’?ppü–üà?o˜?p4þöö?nô›­ìòØþ?kÀ‚“?l~?m4Œ?n„ˆ’êÊ‚ˆ’?m”‚ˆ–’?mPü–üà?lx?mþöö?kÔ›­ìòØþ?h ‚“?i^?jŒ?kdˆ’êÊ‚ˆ’?jt‚ˆ–’?j0ü–üà?iX?iôþöö?h´›­ìòØþ?e€‚“?f>?fôŒ?hDˆ’êÊ‚ˆ’?gT‚ˆ–’?gü–üà?f8?fÔþöö?e”›­ìòØþ?b`‚“?c?cÔŒ?e$ˆ’êÊ‚ˆ’?d4‚ˆ–’?cðü–üà?c?c´þöö?bt›­ìòØþ?_@‚“?_þ?`´Œ?bˆ’êÊ‚ˆ’?a‚ˆ–’?`Ðü–üà?_ø?`”þöö?_T›­ìòØþ?\ ‚“?\Þ?]”Œ?^䈒ê?^T‚ˆ–’?]ô‚ˆ’Âü–üà?\Ø?]tþöö?\4›­ìòØþ?XÔ‚“?Y’?ZHŒ?[Ĉ’ê?[4‚ˆ–’?Z¨‚ˆ–’?Zdü–üà?YŒ?Z(þöö?Xè›­ìòØþ?Uˆ‚“?VF?VüŒ?Xxˆ’ê?W肈–’?W\‚ˆ–’?Wü–üà?V@?VÜþöö?Uœ›­ìòØþ?R<‚“?Rú?S°Œ?U,ˆ’ê?Tœ‚ˆ–’?T‚ˆ–’?SÌü–üà?Rô?Sþöö?RP›­ìòØþ?Nð‚“?O®?PdŒ?Qàˆ’ê?QP‚ˆ–’?PÄ‚ˆ–’?P€ü–üà?O¨?PDþöö?O›­ìòØþ?K¤‚“?Lb?MŒ?N”ˆ’ê?N‚ˆ–’?Mx‚ˆ–’?M4ü–üà?L\?Løþöö?K¸›­ìòØþ?HX‚“?I?IÌŒ?KHˆ’ê?J¸‚ˆ–’?J,‚ˆ–’?Ièü–üà?I?I¬þöö?Hl›­ìòØþ?E8‚“?Eö?F¬Œ?Güˆ’ê?Gl‚ˆ–’?G ‚ˆ’Âü–üà?Eð?FŒþöö?EL›­ìòØþ?B‚“?BÖ?CŒŒ?D܈’ê?DL‚ˆ–’?C삈’Âü–üà?BÐ?Clþöö?B,›­ìòØþ?>Ì‚“??Š?@@Œ?A¼ˆ’ê?A,‚ˆ–’?@ ‚ˆ–’?@\ü–üà??„?@ þöö?>à›­ìòØþ?;€‚“?<>?<ôŒ?>pˆ’ê?=à‚ˆ–’?=T‚ˆ–’?=ü–üà?<8?<Ôþöö?;”›­ìòØþ?84‚“?8ò?9¨Œ?;$ˆ’ê?:”‚ˆ–’?:‚ˆ–’?9Äü–üà?8ì?9ˆþöö?8H›­ìòØþ?4è‚“?5¦?6\Œ?7؈’ê?7H‚ˆ–’?6¼‚ˆ–’?6xü–üà?5 ?6<þöö?4ü›­ìòØþ?1œ‚“?2Z?3Œ?4Œˆ’ê?3ü‚ˆ–’?3p‚ˆ–’?3,ü–üà?2T?2ðþöö?1°›­ìòØþ?.P‚“?/?/ÄŒ?1@ˆ’ê?0°‚ˆ–’?0$‚ˆ–’?/àü–üà?/?/¤þöö?.d›­ìòØþ?+‚“?+Â?,xŒ?-ôˆ’ê?-d‚ˆ–’?,Ø‚ˆ–’?,”ü–üà?+¼?,Xþöö?+›­ìòØþ?'ä‚“?(¢?)XŒ?*¨ˆ’ê?*‚ˆ–’?)¸‚ˆ’Âü–üà?(œ?)8þöö?'ø›­ìòØþ?$Ä‚“?%‚?&8Œ?'ˆˆ’ê?&ø‚ˆ–’?&˜‚ˆ’Âü–üà?%|?&þöö?$Ø›­ìòØþ?!x‚“?"6?"ìŒ?$hˆ’ê?#Ø‚ˆ–’?#L‚ˆ–’?#ü–üà?"0?"Ìþöö?!Œ›­ìòØþ?,‚“?ê? Œ?!ˆ’ê? Œ‚ˆ–’? ‚ˆ–’?¼ü–üà?ä?€þöö?@›­ìòØþ?à‚“?ž?TŒ?Ј’ê?@‚ˆ–’?´‚ˆ–’?pü–üà?˜?4þöö?ô›­ìòØþ?”‚“?R?Œ?„ˆ’ê?ô‚ˆ–’?h‚ˆ–’?$ü–üà?L?èþöö?¨›­ìòØþ?H‚“??¼Œ?8ˆ’ê?¨‚ˆ–’?‚ˆ–’?Øü–üà??œþöö?\›­ìòØþ?ü‚“?º?pŒ?숒ê?\‚ˆ–’?Ђˆ–’?Œü–üà?´?Pþöö?›­ìòØþ? °‚“?n?$Œ? ˆ’ê?‚ˆ–’?„‚ˆ–’?@ü–üà?h?þöö? Ä›­ìòØþ? ‚“? N? Œ? Tˆ’ê? Ä‚ˆ–’? d‚ˆ’Âü–üà? H? äþöö? ¤›­ìòØþ?p‚“?.?äŒ? 4ˆ’ê? ¤‚ˆ–’? D‚ˆ’Âü–üà?(?Äþöö?„›­ìòØþ?$‚“?â?˜Œ?ˆ’ê?„‚ˆ–’?ø‚ˆ–’?´ü–üà?Ü?xþöö?8›­ìòØþ?Ø‚“?–?LŒ?Ȉ’ê?8‚ˆ–’?¬‚ˆ–’?hü–üà??,þöö?ì›­ìòØþ>ýŒ‚“>þJ>ÿŒ?|ˆ’ê>ÿ삈–’>ÿ`‚ˆ–’>ÿü–üà>þD>þàþöö>ý ›­ìòØþ>ú@‚“>úþ>û´Œ>ý0ˆ’ê>ü ‚ˆ–’>ü‚ˆ–’>ûÐü–üà>úø>û”þöö>úT›­ìòØþ>öô‚“>÷²>øhŒ>ù䈒ê>ùT‚ˆ–’>øÈ‚ˆ–’>ø„ü–üà>÷¬>øHþöö>÷›­ìòØþ>󨂓>ôf>õŒ>ö˜ˆ’ê>ö‚ˆ–’>õ|‚ˆ–’>õ8ü–üà>ô`>ôüþöö>ó¼›­ìòØþ>ð\‚“>ñ>ñÐŒ>óLˆ’ê>ò¼‚ˆ–’>ò0‚ˆ–’>ñìü–üà>ñ>ñ°þöö>ðp›­ìòØþ>í<‚“>íú>î°Œ>ðˆ’ê>ïp‚ˆ–’>’Âü–üà>íô>îþöö>íP›­ìòØþ>ê‚“>êÚ>ëŒ>ìàˆ’ê>ìP‚ˆ–’>ëð‚ˆ’Âü–üà>êÔ>ëpþöö>ê0›­ìòØþ>æÐ‚“>çŽ>èDŒ>éÀˆ’ê>é0‚ˆ–’>褂ˆ–’>è`ü–üà>çˆ>è$þöö>æä›­ìòØþ>ã„‚“>äB>äøŒ>ætˆ’ê>å䂈–’>åX‚ˆ–’>åü–üà>ä<>äØþöö>㘛­ìòØþ>à8‚“>àö>ᬌ>ã(ˆ’ê>☂ˆ–’>â ‚ˆ–’>áÈü–üà>àð>áŒþöö>àL›­ìòØþ>Üì‚“>ݪ>Þ`Œ>ß܈’ê>ßL‚ˆ–’>ÞÀ‚ˆ–’>Þ|ü–üà>ݤ>Þ@þöö>Ý›­ìòØþ>Ù ‚“>Ú^>ÛŒ>܈’ê>Ü‚ˆ–’>Ût‚ˆ–’>Û0ü–üà>ÚX>Úôþöö>Ù´›­ìòØþ>ÖT‚“>×>×ÈŒ>ÙDˆ’ê>Ø´‚ˆ–’>Ø(‚ˆ–’>×äü–üà>× >רþöö>Öh›­ìòØþ>Ó‚“>ÓÆ>Ô|Œ>Õøˆ’ê>Õh‚ˆ–’>ÔÜ‚ˆ–’>Ô˜ü–üà>ÓÀ>Ô\þöö>Ó›­ìòØþ>Ïè‚“>Ц>Ñ\Œ>Ò¬ˆ’ê>Ò‚ˆ–’>Ѽ‚ˆ’Âü–üà>Р>Ñ<þöö>Ïü›­ìòØþ>ÌÈ‚“>͆>Î<Œ>ÏŒˆ’ê>Îü‚ˆ–’>Μ‚ˆ’Âü–üà>Í€>Îþöö>ÌÜ›­ìòØþ>É|‚“>Ê:>ÊðŒ>Ìlˆ’ê>ËÜ‚ˆ–’>ËP‚ˆ–’>Ë ü–üà>Ê4>ÊÐþöö>É›­ìòØþ>Æ0‚“>Æî>ǤŒ>É ˆ’ê>È‚ˆ–’>È‚ˆ–’>ÇÀü–üà>Æè>Ç„þöö>ÆD›­ìòØþ>Âä‚“>â>ÄXŒ>ÅÔˆ’ê>ÅD‚ˆ–’>ĸ‚ˆ–’>Ätü–üà>Ü>Ä8þöö>Âø›­ìòØþ>¿˜‚“>ÀV>Á Œ>ˆˆ’ê>Áø‚ˆ–’>Ál‚ˆ–’>Á(ü–üà>ÀP>Àìþöö>¿¬›­ìòØþ>¼L‚“>½ >½ÀŒ>¿<ˆ’ê>¾¬‚ˆ–’>¾ ‚ˆ–’>½Üü–üà>½>½ þöö>¼`›­ìòØþ>¹‚“>¹¾>ºtŒ>»ðˆ’ê>»`‚ˆ–’>ºÔ‚ˆ–’>ºü–üà>¹¸>ºTþöö>¹›­ìòØþ>µ´‚“>¶r>·(Œ>¸¤ˆ’ê>¸‚ˆ–’>·ˆ‚ˆ–’>·Dü–üà>¶l>·þöö>µÈ›­ìòØþ>²”‚“>³R>´Œ>µXˆ’ê>´È‚ˆ–’>´h‚ˆ’Âü–üà>³L>³èþöö>²¨›­ìòØþ>¯t‚“>°2>°èŒ>²8ˆ’ê>±¨‚ˆ–’>±H‚ˆ’Âü–üà>°,>°Èþöö>¯ˆ›­ìòØþ>¬(‚“>¬æ>­œŒ>¯ˆ’ê>®ˆ‚ˆ–’>­ü‚ˆ–’>­¸ü–üà>¬à>­|þöö>¬<›­ìòØþ>¨Ü‚“>©š>ªPŒ>«Ìˆ’ê>«<‚ˆ–’>ª°‚ˆ–’>ªlü–üà>©”>ª0þöö>¨ð›­ìòØþ>¥‚“>¦N>§Œ>¨€ˆ’ê>§ð‚ˆ–’>§d‚ˆ–’>§ ü–üà>¦H>¦äþöö>¥¤›­ìòØþ>¢D‚“>£>£¸Œ>¥4ˆ’ê>¤¤‚ˆ–’>¤‚ˆ–’>£Ôü–üà>¢ü>£˜þöö>¢X›­ìòØþ>žø‚“>Ÿ¶> lŒ>¡èˆ’ê>¡X‚ˆ–’> Ì‚ˆ–’> ˆü–üà>Ÿ°> Lþöö>Ÿ ›­ìòØþ>›¬‚“>œj> Œ>žœˆ’ê>ž ‚ˆ–’>€‚ˆ–’><ü–üà>œd>þöö>›À›­ìòØþ>˜`‚“>™>™ÔŒ>›Pˆ’ê>šÀ‚ˆ–’>š4‚ˆ–’>™ðü–üà>™>™´þöö>˜t›­ìòØþ>•@‚“>•þ>–´Œ>˜ˆ’ê>—t‚ˆ–’>—‚ˆ’Âü–üà>•ø>–”þöö>•T›­ìòØþ>ŽÌ‚“>Š>@Œ>”䈒êÊ‚ˆ’>” ‚ˆ’>\ü–>‘B’>’Š˜>“Ĉ’ê>“4‚ˆ–’>’¨‚ˆ–’>’dü–üÊ>‘`>‘üþöö>‘,þþ>x—ˆ­ìò>8>„> þöö>Žà›­ìòØþ>ˆH‚“>‰>‰¼Œ>Žpˆ’êÊ‚ˆ’>¬‚ˆ’>‰Øü–>о’>‹˜Š˜>Pˆ’ê>ŒÀ‚ˆ–’>Œ4‚ˆ–’>‹àü–ü—>‹>ŠÜ>‹xþöö>Ѝþþ>‰ô—ˆ­ìò>‰´>‰>‰œþöö>ˆ\›­ìòØþ>x|“>y6>|>‡ü’>|ø>„Ø>…”˜>†Ìþ–˜þ–’>…À–˜þ–’>„Ô––’—Ó>{èøüøüøüøüøüøüøüøüøüøüøüøüøüôøüøüøüøüøü>y0>zööøþöö>xŒ›­ìòØþøpÐ>`L>vt“®>w„Œ¦ˆ–’>w ü–üà>vð¸>v„›ãþ>tp‚“®>u„Œ¦ˆ–’>u ü–üà>tð¸>t„›ãþ>rp‚“®>s„Œ¦ˆ–’>s ü–üà>rð¸>r„›ãþ>pp‚“®>q„Œ¦ˆ–’>q ü–üà>pð¸>p„›ãþ>np‚“®>o„Œ¦ˆ–’>o ü–üà>nð¸>n„›ãþ>lp‚“®>m„Œ¦ˆ–’>m ü–üà>lð¸>l„›ãþ>hh‚“®>i|Œ>lˆ’>i˜ü–>jF’>jøŠ˜¦ˆ–’>k@ü–üÊ>jd¸>j0þþÆ—ˆÁ>hè¸>h|›ãþ>dP‚“®>edŒ>h ˆ’>e€ü–>f.’>fàŠ˜®ˆ–’>g(ü–ü—>fØ>fL¸>fþþÆ—ˆÁ>dи>dd›ãþ>`P“®>aÀ>d’>a¸øüøüøüøü>`̸>``›ãþøpÌ>`4†üüp´>_´ˆ›ãþøp°>^øˆ›­ì†ì†Òþøp =|”>\`“¼>] Œ>^dˆ–’>^‚ˆ’Âü–üà>\ø>]|ö>\p›‹Øþ>YÌ‚“¼>[Œ>\ˆ’>[p‚ˆ–’>[,ü–üà>Zh>Zìö>Yà›‹Øþ>W<‚“¼>X€Œ>Ypˆ’>Xà‚ˆ–’>Xœü–üà>WØ>X\ö>WP›‹Øþ>T¬‚“¼>UðŒ>Vàˆ’>VP‚ˆ–’>V ü–üà>UH>UÌö>TÀ›‹Øþ>R‚“¼>S`Œ>TPˆ’>SÀ‚ˆ–’>S|ü–üà>R¸>S<ö>R0›‹Øþ>OŒ‚“¼>PÐŒ>QÀˆ’>Q0‚ˆ–’>Pìü–üà>P(>P¬ö>O ›‹Øþ>Lü‚“¼>N@Œ>O0ˆ’>N ‚ˆ–’>N\ü–üà>M˜>Nö>M›‹Øþ>Jl‚“¼>K°Œ>L ˆ’>L‚ˆ–’>KÌü–üà>K>KŒö>J€›‹Øþ>GÜ‚“¼>I Œ>Jˆ’>I€‚ˆ–’>I<ü–üà>Hx>Hüö>Gð›‹Øþ>EL‚“¼>FŒ>G€ˆ’>Fð‚ˆ–’>F¬ü–üà>Eè>Flö>E`›‹Øþ>B¼‚“¼>DŒ>Dðˆ’>D`‚ˆ–’>Dü–üà>CX>CÜö>BЛ‹Øþ>@,‚“¼>ApŒ>B`ˆ’>AЂˆ–’>AŒü–üà>@È>ALö>@@›‹Øþ>=œ‚“¼>>àŒ>?Ј’>?@‚ˆ–’>>üü–üà>>8>>¼ö>=°›‹Øþ>; ‚“¼>=@ˆ’><°‚ˆ–’>;¨><,ö>; ›‹Øþ>8|‚“¼>9ÀŒ>:°ˆ’>: ‚ˆ–’>9Üü–üà>9>9œö>8›‹Øþ>5ì‚“¼>70Œ>8 ˆ’>7‚ˆ–’>7Lü–üà>6ˆ>7 ö>6›‹Øþ>3\‚“¼>4 Œ>5dˆ–’>5‚ˆ’Âü–üà>3ø>4|ö>3p›‹Øþ>0 ‚“¼>1äŒ>2Ôˆ–’>2D‚ˆ–’>2ü–üà>1<>1Àö>0´›‹Øþ>-ä‚“¼>/(Œ>0ˆ–’>/ˆ‚ˆ–’>/Dü–üà>.€>/ö>-ø›‹Øþ>+(‚“¼>,lŒ>-\ˆ–’>,Ì‚ˆ–’>,ˆü–üà>+Ä>,Hö>+<›‹Øþ>(l‚“¼>)°Œ>* ˆ–’>*‚ˆ–’>)Ìü–üà>)>)Œö>(€›‹Øþ>%°‚“¼>&ôŒ>'䈖’>'T‚ˆ–’>'ü–üà>&L>&Ðö>%Ä›‹Øþ>"ô‚“¼>$8Œ>%(ˆ–’>$˜‚ˆ–’>$Tü–üà>#>$ö>#›‹Øþ> d‚“¼>!¨Œ>"lˆ–’>"‚ˆ’Âü–üà>!>!„ö> x›‹Øþ>Ô‚“¼>Œ>܈–’>x‚ˆ’Âü–üà>p>ôö>蛋Øþ>‚“¼>\Œ>Lˆ–’>¼‚ˆ–’>xü–üà>´>8ö>,›‹Øþ>\‚“¼> Œ>ˆ–’>‚ˆ–’>¼ü–üà>ø>|ö>p›‹Øþ> ‚“¼>äŒ>Ôˆ–’>D‚ˆ–’>ü–üà><>Àö>´›‹Øþ>ä‚“¼>(Œ>ˆ–’>ˆ‚ˆ–’>Dü–üà>€>ö>ø›‹Øþ>(‚“¼>lŒ>\ˆ–’>Ì‚ˆ–’>ˆü–üà>Ä>Hö><›‹Øþ> l‚“¼>°Œ> ˆ–’>‚ˆ–’>Ìü–üà>>Œö> €›‹Øþ> °‚“¼> ôŒ> 䈖’> T‚ˆ–’> ü–üà> L> Ðö> Ä›‹Øþ> ‚“¼> dŒ> (ˆ–’> Ä‚ˆ’Âü–üà>¼> @ö>4›‹Øþ>‚“¼>ÔŒ>˜ˆ–’>4‚ˆ’Âü–üà>,>°ö>¤›‹Øþ>Ô‚“¼>Œ>ˆ–’>x‚ˆ–’>4ü–üà>p>ôö>蛋Øþ>‚“¼>\Œ>Lˆ–’>¼‚ˆ–’>xü–üà>´>8ö>,›‹Øþ=ý\‚“¼=þ Œ=ÿˆ–’=ÿ‚ˆ–’=þ¼ü–üà=ýø=þ|ö=ýp›‹Øþ=ú ‚“¼=ûäŒ=üÔˆ–’=üD‚ˆ–’=üü–üà=û<=ûÀö=ú´›‹Øþ=÷ä‚“¼=ù(Œ=úˆ–’=ùˆ‚ˆ–’=ùDü–üà=ø€=ùö=÷ø›‹Øþ=õ(‚“¼=ölŒ=÷\ˆ–’=öÌ‚ˆ–’=öˆü–üà=õÄ=öHö=õ<›‹Øþ=òl‚“¼=ó°Œ=ô ˆ–’=ô‚ˆ–’=óÌü–üà=ó=óŒö=ò€›‹Øþ=ïÜ‚“¼=ñ Œ=ñ䈖’=ñ€‚ˆ’Âü–üà=ðx=ðüö=ïð›‹Øþ=íL‚“¼=îŒ=ïTˆ–’=îð‚ˆ’Âü–üà=íè=îlö=í`›‹Øþ=ê‚“¼=ëÔŒ=ìĈ–’=ì4‚ˆ–’=ëðü–üà=ë,=ë°ö=ꤛ‹Øþ=çÔ‚“¼=éŒ=ꈖ’=éx‚ˆ–’=é4ü–üà=èp=èôö=ç蛋Øþ=å‚“¼=æ\Œ=çLˆ–’=漂ˆ–’=æxü–üà=å´=æ8ö=å,›‹Øþ=â\‚“¼=ã Œ=䈖’=䂈–’=ã¼ü–üà=âø=ã|ö=âp›‹Øþ=ß ‚“¼=àäŒ=áÔˆ–’=áD‚ˆ–’=áü–üà=à<=àÀö=ß´›‹Øþ=Üä‚“¼=Þ(Œ=߈–’=Þˆ‚ˆ–’=ÞDü–üà=Ý€=Þö=Üø›‹Øþ=Ú(‚“¼=ÛlŒ=Ü\ˆ–’=ÛÌ‚ˆ–’=Ûˆü–üà=ÚÄ=ÛHö=Ú<›‹Øþ=ט‚“¼=ØÜŒ=Ù ˆ–’=Ù<‚ˆ’Âü–üà=Ø4=ظö=׬›‹Øþ=Õ‚“¼=ÖLŒ=׈–’=Ö¬‚ˆ’Âü–üà=Õ¤=Ö(ö=Õ›‹Øþ=ÒL‚“¼=ÓŒ=Ô€ˆ–’=Óð‚ˆ–’=Ó¬ü–üà=Òè=Ólö=Ò`›‹Øþ=Ï‚“¼=ÐÔŒ=ÑĈ–’=Ñ4‚ˆ–’=Ððü–üà=Ð,=аö=Ϥ›‹Øþ=ÌÔ‚“¼=ÎŒ=ψ–’=Îx‚ˆ–’=Î4ü–üà=Íp=Íôö=Ì蛋Øþ=Ê‚“¼=Ë\Œ=ÌLˆ–’=˼‚ˆ–’=Ëxü–üà=Ê´=Ë8ö=Ê,›‹Øþ=Ç\‚“¼=È Œ=Ɉ–’=É‚ˆ–’=ȼü–üà=Çø=È|ö=Çp›‹Øþ=Ä ‚“¼=ÅäŒ=ÆÔˆ–’=ÆD‚ˆ–’=Æü–üà=Å<=ÅÀö=Ä´›‹Øþ=Áä‚“¼=Ã(Œ=Ĉ–’=È‚ˆ–’=ÃDü–üà=€=Ãö=Áø›‹Øþ=¿T‚“¼=À˜Œ=Á\ˆ–’=Àø‚ˆ’Âü–üà=¿ð=Àtö=¿h›‹Øþ=¼Ä‚“¼=¾Œ=¾Ìˆ–’=¾h‚ˆ’Âü–üà=½`=½äö=¼Ø›‹Øþ=º‚“¼=»LŒ=¼<ˆ–’=»¬‚ˆ–’=»hü–üà=º¤=»(ö=º›‹Øþ=·L‚“¼=¸Œ=¹€ˆ–’=¸ð‚ˆ–’=¸¬ü–üà=·è=¸lö=·`›‹Øþ=´‚“¼=µÔŒ=¶Äˆ–’=¶4‚ˆ–’=µðü–üà=µ,=µ°ö=´¤›‹Øþ=±Ô‚“¼=³Œ=´ˆ–’=³x‚ˆ–’=³4ü–üà=²p=²ôö=±è›‹Øþ=¯‚“¼=°\Œ=±Lˆ–’=°¼‚ˆ–’=°xü–üà=¯´=°8ö=¯,›‹Øþ=¬\‚“¼=­ Œ=®ˆ–’=®‚ˆ–’=­¼ü–üà=¬ø=­|ö=¬p›‹Øþ=© ‚“¼=ªäŒ=«Ôˆ–’=«D‚ˆ–’=«ü–üà=ª<=ªÀö=©´›‹Øþ=§‚“¼=¨TŒ=©ˆ–’=¨´‚ˆ’Âü–üà=§¬=¨0ö=§$›‹Øþ=¤€‚“¼=¥ÄŒ=¦ˆˆ–’=¦$‚ˆ’Âü–üà=¥=¥ ö=¤”›‹Øþ=¡Ä‚“¼=£Œ=£øˆ–’=£h‚ˆ–’=£$ü–üà=¢`=¢äö=¡Ø›‹Øþ=Ÿ‚“¼= LŒ=¡<ˆ–’= ¬‚ˆ–’= hü–üà=Ÿ¤= (ö=Ÿ›‹Øþ=œL‚“¼=Œ=ž€ˆ–’=ð‚ˆ–’=¬ü–üà=œè=lö=œ`›‹Øþ=™‚“¼=šÔŒ=›Äˆ–’=›4‚ˆ–’=šðü–üà=š,=š°ö=™¤›‹Øþ=–Ô‚“¼=˜Œ=™ˆ–’=˜x‚ˆ–’=˜4ü–üà=—p=—ôö=–蛋Øþ=”‚“¼=•\Œ=–Lˆ–’=•¼‚ˆ–’=•xü–üà=”´=•8ö=”,›‹Øþ=‘\‚“¼=’ Œ=“ˆ–’=“‚ˆ–’=’¼ü–üà=‘ø=’|ö=‘p›‹Øþ=ŽÌ‚“¼=Œ=Ôˆ–’=p‚ˆ’Âü–üà=h=ìö=Žà›‹Øþ=‰x‚“¼=мŒ=Žpˆ’=Ž ‚ˆ’=ŠØü–=‹¢’=ŒhŠ˜=„ˆ–’=Œô‚ˆ–’=Œ°ü–üÊ=‹À=ŒDö=‹Œþþ=Šô—ˆ‹=Š´=Š=Š˜ö=‰Œ›‹Øþ=„‚“¼=…XŒ=‰ˆ’=ˆ¸‚ˆ’=…tü–=†>’=‡Š˜=ˆ0ˆ–’=‡ ‚ˆ–’=‡Lü–ü—=†ü=†\=†àö=†(þþ=…—ˆ‹=…P=„°=…4ö=„(›‹Øþ=|˜“¼=~È=ƒÈ’=~Àøüøüøüøüøüøüôøüøüøü=}0=}´ö=|¨›‹Øþø=XÜ„=z“¼={@Œ=|0ˆ’ê={ ‚ˆ–’={\ü–üà=z˜={ þö=z›ŸìØþ=wl‚“¼=x°Œ=y ˆ’ê=y‚ˆ–’=xÌü–üà=x=xþö=w€›ŸìØþ=tÜ‚“¼=v Œ=wˆ’ê=v€‚ˆ–’=v<ü–üà=ux=vþö=tð›ŸìØþ=rL‚“¼=sŒ=t€ˆ’ê=sð‚ˆ–’=s¬ü–üà=rè=spþö=r`›ŸìØþ=o¼‚“¼=qŒ=qðˆ’ê=q`‚ˆ–’=qü–üà=pX=pàþö=oЛŸìØþ=m‚“¼=n`Œ=oPˆ’—Ó=nÀ‚ˆ–’=n|ü–üà=m¸=n@þö=m0›ŸìØþ=gŒ‚“¼=iX=lÐ’=iPø=k=lL–’=kŒ––’—Ó=i8ø=iÈ=jH˜=kP„=jÀ‚ˆ–’=j|ü–ü=iÄ–’=i øüøü=h(=hÔöøþö=g ›ŸìØþ=aì‚“¼=c¸=g@’=c°ø=f=f¼–’=eü––’—Ó=c˜ø=d(=d¨˜=eÀ„=e0‚ˆ–’=dÜü–ü—=d$–’=c€øüøü=bˆ=c4öøþö=b›ŸìØþ=X蓼=[\=a ’=[Tøüøüøüøüøüøüøüøüøüøüøüøü=Y€=Zøþö=Xø›ŸìØþøpˆ=V¼“®=WÌŠ–˜þ–’êêÊ=W8ºþ=VÌ›‘ÒþøÊ†ˆþþøò†ƒùú‚üüp„=V üp€=U¤ˆŸßþøò†ƒùö†üpx=Ulüpp=UP†üüpl=U8†üüpd=U,üp`=Tpˆ›­ì†ì†óßþøpT=S´ˆ›™†ì†Òþøò†ƒùpP=>ô=Q”“®=R¤Œ¦ˆ–’=RÀü–üà=R¸=Q¤›ãþ=O‚“®=P¤Œ¦ˆ–’=PÀü–üà=P¸=O¤›ãþ=M‚“®=N¤Œ¦ˆ–’=NÀü–üà=N¸=M¤›ãþ=K‚“®=L¤Œ¦ˆ–’=LÀü–üà=L¸=K¤›ãþ=I‚“®=J¤Œ¦ˆ–’=JÀü–üà=J¸=I¤›ãþ=G‚“®=H¤Œ¦ˆ–’=HÀü–üà=H¸=G¤›ãþ=Cˆ‚“®=DœŒ=G4ˆ’=D¸ü–=Ef’=FŠ˜¦ˆ–’=F`ü–üÊ=E„¸=EPþþÆ—ˆÁ=D¸=Cœ›ãþ=?p‚“®=@„Œ=C,ˆ’=@ ü–=AN’=BŠ˜®ˆ–’=BHü–ü—=Aø=Al¸=A8þþÆ—ˆÁ=?ð¸=?„›ãþ=>øˆ›ãþøpH=>àƒùp@=>@ˆ›Ÿì†Òþøò†ƒùp4==ˆˆ›Ÿì†Òþøp0==l†üüp,==`üö†üp(=<”ˆ›­ì†ìùßþø=<†ˆ›‘óßþøp=;Tˆ›™†ì†óßþøp=:Ј›‘Òþøö†üp=:¤ƒùp=:ˆƒùp=:ˆ›‘Òþøoô=9€ˆ›ãþøî„Šú‚üüoì=38“®=4HŽ=6Dþ––˜=8ˆþ–’=6Ä–˜þ–˜þ˜¦Üü–üêêêêêê=4`þ˜=5hþ–’=4ˆ˜þ–’=4@=3´¸=3H›ãþøoØ=1“®=2Š˜¦ˆ–’=2\ü–üÊ=1€¸=1›ãþøoÔ=.Г®=/àŠ˜¦ˆ–’=0(ü–üÊ=/L¸=.à›ãþøoÌ=.´ƒùoÈ=.¤üoÄ=.ˆ›Ÿì†Òþøö†üo¸=-Œˆþþøò„†üüo°ð–’ê<;ø<=Àþ–˜þ–’êê<:èôø<@„;R,—ü;S&–ð;Z€èÄèèèèèÜè;W°ÄèèèèèÜ;UpèèèèôÄè;S*û¦Ö;R<¦õ;Süð†üè†üð†üÎþ;Lø‚—ü;Mö–ð;QÀÜèÄèèèÜèèÜôÜè;Múû¦Ö;M ¦õ;MØüð†üè†üð†üÎþ;G€‚—ü;H~–ð;LèèèÜÐÜèÐÐèôÄèô;H‚û¦Ö;G”¦õ;H`üð†üè†üð†üÎþ;>L—ü;?F–ð;Gèèè;E€èèèèÜèÄÜÐÜÜèèè;AHèèôÄèèô;?Jû¦Ö;>\¦õ;?(üð†üè†üð†üÎþø;=t†ˆ¦õµüð†üð†üÎþø;6t„;: —ü;;j–ð;<ôÜèèèèÁû¦Ö;:0¦õ;:üކøðð†üè†üð†üÎþ;6€—ü;7Ê–ð;9´ÜÄÜÐÁû¦Ö;6¦õ;7\ކøðð†üè†üð†üÎþø;5Ćˆ¦õ§üð†üïßþø;/œ„;3H—ü;4’–ð;5tèèÁû¦Ö;3X¦õ;4$ކøðð†üè†üð†üÎþ;/¨—ü;0ò–ð;2ÜÜÄÜÐÁû¦Ö;/¸¦õ;0„ކøðð†üè†üð†üÎþø;'„;.舦õ§‹ñð†üÎþ;*¼‚—ü;+º–ð;.LÜèèèÜèèÐèÁû¦Ö;*Цõ;+œüð†üè†üð†üÎþ;)Ü‚ˆ¦õ;*¬üð†üð†üð†üÎþ;)‚ˆ¦õµ‹ñð†üð†üÎþ;(`‚ˆ¦õ§üð†üÎþ;'¨‚ˆ¦õ§‹ñð†üÎþ;'ˆ¦õ™‹ñÎþøà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þð̆ƒ‹þŠò„øè̆ƒ‹þŠò„øèà†ƒ‹þðà†ƒ‹þð;#܆ƒš†­Ïìþ³ŒƒùôüþÊ9dx†ƒ‹;#Àê„9dœ›‘;#ˆÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ9dè;;œèÊ;;¨èÊ;˜;„ÐèÖ;D;HÐèÊ;ð;ôÐèÊ;´;pÜÊ;x;4ÜÊ;<;@èÐÊ;;èÐÊ;Ä;ÈèÐÊ; ˆ;ŒèÐÊ; ; ÐèÖ; ˜; ´ÐèèÖ; ; 0ÐèèÖ;À;|èèÖ;´;XèÊ;¨;LèÊ;œ;@èÊ;;4èÊ;„;(èÊ;x;èÊ;l;èÊ:ÿ`;èÊ:ü¤:ÿèèèèÜèèèè:ü¬þ¦ò‚:ø :üTèÜèÜèÜèÜèèèÜèÜèè:ø(þ¦ò‚:é:öàèÄÐÜè:ô èôÄèôÄô:òÐèè:ð€Üèè:ïÜèè:ìðèèè:ëˆ:êàèè:éðèô:é þ¦ò‚:äP:è´ÜÜèèèÄèè:åüè:å è:äXþ¦ò‚:ß´:äÜÜèèèÄèè:áHè:àpè:ß¼þ¦ò‚:×Ð:ßLè:ÞŒÄèÜèèÄèèôÐèèÜÐ:ÚTÄÐèÜèèè:רþ¦ò‚:Ñœ:×€:Öð:ÖHèÐÐèÜÐÐèèÐ:ÒÐèèô:Ѥþ¦ò‚:ÈÈ:ÑL:ÐŒ:ÏäèÐÐ:ÎdèèôÐÐÐÄè:Ë”ÜèÜèèÜÐè:ÈÐþ¦ò‚:½X:Ǽè:ÆüèÐÐèÜèèÜÜÜèèèÜèèôÜèèôÄèèèÄè:¿ôèÐ:¾\è:½`þ¦ò‚:²ð:¼ÄèèèÐèè:ºäèèèè:¹”èèôÐèèô:·„:¶ôè:¶4è:µ\èÐ:´$:²øþ¦ò‚:¦¨:²\èÜèèÐèèÜÜèèèôÐèèôÄÐÜÐèÄèèèÜÜô:ªÄè:©ìèÐ:¨´:§¬è:¦°þ¦ò‚:˜d:¦ÜÜèèèÄÜÜèèèèè:¢Pè:¡xèèèÜÜÜèèèÄÜÜèèèèè:œà:œ8èèÐèèèÐèèèÄ:˜lþ¦ò‚:8:—üÐèÐèèÄèèèèèÐèèèèèÐèô:’ŒÜèô:‘ :@þ¦ò‚9dÞ:$ò‚9dºúþ³:Hˆ¦õµüð†üð†üÎþø:ŽŒ†ˆ¦õ§üð†üÎþø:܆ˆ¦õ§ì†ëßþøö†ü:†°Œò„øôÖ„Œò„øôö:Œˆ†ˆ¦õ™üÎþø:‹X„:Œˆ¦õ™üïßþ:‹dˆ¦õ¡üç’Íþø:Š(„:ŠÐˆ¦õ™üïßþ:Š4ˆ¦õ¡üç’Íþø:ˆø„:‰ ˆ¦õ™üïßþ:‰ˆ¦õ¡üç’Íþø:‡Ø„:ˆpˆ¦õ™üïßþ:‡äˆ¦õ™üïßþø:‡D†ˆ¦õ™üÎþø:lX„:lð—ü:m²–ð:†4èÜèÐÜèÜÐÜèÜÐÜÐÐèÐèÐèÜÐèèÜÐèôÐèèôÐôÐèèè:{œèôÄèô:yÐèÐèèÄÜèèÜèèèÄÜèèÜèèè:s,ÜÜÄÐèôÄèô:n|:m¶û¦Ö:m¦õ§üð†üÎþ:ldˆ¦õ™üÎþø9š¨†—ü:fv–:jÒüõ›:kØ‹‹¤ò„ò„ò„øè:k†‹‹¼ê„ê„ê„øèÖþ:f‚:jèÐèÐèèÐèÐè:fzû:gò‚ò‚ò‚:a–:dâüõ›:eè‹‹¤ò„ò„ò„øè:e†‹‹¼ê„ê„ê„øèÖþ:a":d èÐèÐèÐèè:aû:a¤ò‚ò‚ò‚:]––:_‚üõ›:`ˆ‹‹¤ò„ò„ò„øè:_°†‹‹¼ê„ê„ê„øèÖþ:]¢:^ðè:]šû:^$ò‚ò‚ò‚:Z^–:\üõ›:]‹‹¤ò„ò„ò„øè:\0†‹‹¼ê„ê„ê„øèÖþ:Zj:[ˆè:Zbû:Zìò‚ò‚ò‚:VÞ–:XÊüõ›:YЋ‹¤ò„ò„ò„øè:Xø†‹‹¼ê„ê„ê„øèÖþ:Vê:X8è:Vâû:Wlò‚ò‚ò‚:S^–:UJüõ›:VP‹‹¤ò„ò„ò„øè:Ux†‹‹¼ê„ê„ê„øèÖþ:Sj:T¸è:Sbû:Sìò‚ò‚ò‚9±†–9³Züõ›:RЋ‹¤ò„ò„ò„øè9³ˆ†‹‹:R¨ê„ê„ê„9³¼›‘:R(ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ9´:H:I<Ðè:Gøþ¾ò‚ò‚ò‚:EÜ:G@Üèè:Eäþ¾ò‚ò‚ò‚:Cø:E\Üèè:Dþ¾ò‚ò‚ò‚:B\:Cxè:Bdþ¾ò‚ò‚ò‚:@À:AÜè:@Èþ¾ò‚ò‚ò‚:?$:@@è:?,þ¾ò‚ò‚ò‚:=ˆ:>¤è:=þ¾ò‚ò‚ò‚:;ì:=è:;ôþ¾ò‚ò‚ò‚::8:;Tè::@þ¾ò‚ò‚ò‚:8„:9 è:8Œþ¾ò‚ò‚ò‚:6Ð:7ìè:6Øþ¾ò‚ò‚ò‚:5:68è:5$þ¾ò‚ò‚ò‚:3€:4œè:3ˆþ¾ò‚ò‚ò‚:1ä:3è:1ìþ¾ò‚ò‚ò‚:0H:1dè:0Pþ¾ò‚ò‚ò‚:.”:/àèè:.œþ¾ò‚ò‚ò‚:,°:.,èèè:,¸þ¾ò‚ò‚ò‚:+:,Hèè:+þ¾ò‚ò‚ò‚:)0:*”èè:)8þ¾ò‚ò‚ò‚:'d:(Èèèè:'lþ¾ò‚ò‚ò‚:%˜:&üèèè:% þ¾ò‚ò‚ò‚:$:%è:$þ¾ò‚ò‚ò‚:"H:#ÄÐè:"Pþ¾ò‚ò‚ò‚: ¬:!Èè: ´þ¾ò‚ò‚ò‚:È: ,èè:Ðþ¾ò‚ò‚ò‚:ä:Hèè:ìþ¾ò‚ò‚ò‚::dèè:þ¾ò‚ò‚ò‚::€èè:$þ¾ò‚ò‚ò‚:8:œèè:@þ¾ò‚ò‚ò‚:T:¸èè:\þ¾ò‚ò‚ò‚:p:Ôèè:xþ¾ò‚ò‚ò‚:Œ:ðèè:”þ¾ò‚ò‚ò‚:¨: èè:°þ¾ò‚ò‚ò‚:4:(è: ÀÜÜ: ˆÜÄèè: ¨èôÜèôÄèô:8:<þ¾ò‚ò‚ò‚9³þ:ÌŒ†Œò„øîòà†Œ†øòò‚ò‚9³Úúþ³:8ˆþö:˜†ˆ¦õ™üÎþø:Є:¼ˆ¦õ:ˆüð†üÓ•ò„øÌþ:܈¦õ:¨üð†üÓ•ò„øÌþø:x„:,ˆ¦õ§üð†üïßþ:„ˆ¦õ§üð†üïßþø: „:Ôˆ¦õ§üð†üïßþ:,ˆ¦õ§üð†üïßþø:p†ˆ¦õ§üð†üïßþø9ÿ„9ÿ̈¦õ§üð†üïßþ9ÿ$ˆ¦õ§üð†üïßþø9þ„†ˆ¦õ™üïßþø9ýð†ˆ¦õ™üïßþø9ý\†ˆ¦õ™üÎþø9üœ†ˆ¦õ§‹ñð†üÎþø9ú€„9û܈¦õµüð†üð†üÎþ9û0‚ˆ¦õ§üð†üïßþ9úŒˆ¦õ§üð†üÎþø9ö˜„9ø—ü9øî–ð9úèèè9øòû¦Ö9ø ¦õ½üè†üð†üÎþ9÷H‚ˆ¦õµüð†üð†üïßþ9ö¤ˆ¦õ§üð†üïßþø9ö†ˆ¦õ™üïßþø9õp†ˆ¦õ™üïßþø9ô܆ˆ¦õ™üÎþø9ó¼„9ôTˆ¦õ™üïßþ9óȈ¦õ™üïßþø9òœ„9ó4ˆ¦õ™üïßþ9ò¨ˆ¦õ™üïßþø9ñ|„9òˆ¦õ™üïßþ9ñˆˆ¦õ™üïßþø9ð\„9ðôˆ¦õ™üïßþ9ðhˆ¦õ™üïßþø9ïȆˆ¦õ™üïßþø9ÆØ„9ìh—ü9펖ð9ïHÜèÐèèÁû¦Ö9ìx¦õ9í`‹ñð†üð†üè†üð†üÎþ9èì‚—ü9éú–ð9ë´ÜèÐèèÁû¦Ö9é¦õ9éÌ‹ñð†üè†üð†üÎþ9ÉH‚—ü9ã –9çfüõ›9èl‹‹¤ò„ò„ò„øè9甆‹‹¼ê„ê„ê„øèÖþ9ã9æ¤èÐèÐèèÐèÐè9ãû9ã˜ò‚ò‚ò‚9ݪ–9ávüõ›9â|‹‹¤ò„ò„ò„øè9ᤆ‹‹¼ê„ê„ê„øèÖþ9ݶ9à´èÐèÐèÐèè9Ý®û9Þ8ò‚ò‚ò‚9Ú*–9Üüõ›9Ý‹‹¤ò„ò„ò„øè9ÜD†‹‹¼ê„ê„ê„øèÖþ9Ú69Û„è9Ú.û9Ú¸ò‚ò‚ò‚9Öò–9Ø–üõ›9Ùœ‹‹¤ò„ò„ò„øè9ØÄ†‹‹¼ê„ê„ê„øèÖþ9Öþ9Øè9Ööû9×€ò‚ò‚ò‚9Ór–9Õ^üõ›9Öd‹‹¤ò„ò„ò„øè9ÕŒ†‹‹¼ê„ê„ê„øèÖþ9Ó~9ÔÌè9Óvû9Ôò‚ò‚ò‚9Ïò–9ÑÞüõ›9Òä‹‹¤ò„ò„ò„øè9Ò †‹‹¼ê„ê„ê„øèÖþ9Ïþ9ÑLè9Ïöû9Ѐò‚ò‚ò‚9ÌŠ–9Î^üõ›9Ïd‹‹¤ò„ò„ò„øè9ÎŒ†‹‹¼ê„ê„ê„øèÖþ9Ì–9ÍÌèè9ÌŽû9Íò‚ò‚ò‚9Ê*–ð9ËÌÐÐèèÁû¦Ö9É\¦õ½üè†üð†üÎþ9ÈD‚ˆ¦õ9É‹ñà†‹ñð†üÎþ9Ç|‚ˆ¦õ§‹ñð†üÎþ9Æäˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð†ƒ‹þŠšò„ò„øè†ƒ‹þŠšò„ò„øèʆƒ‹šò„ò„øð9¸¸†ƒš‘9ÄĆ؎ގގގގގ9ÃDŽŒŒ„ò„ø9¹9Á®9ÂÜèèèè9Á˜9À 9Á(èèè9À9¾ˆ9¿¤èèè9¾Êõ9½H·èÖ9¹òúþ³9¼9¼¤ˆ¦õ§üð†üÎþ9¼ˆ¦õ™üÎþøê†ˆþö9¹`„9»$ˆ¦õµüð†üð†üÎþ9ºL‚ˆ¦õ½ü膋ñð†üÎþ9¹lˆ¦õ9º<ü膋ñ膋ñÎþøò†ƒùôüþÊ9¶À†ƒš‘9¸¬ÞŽÞŽÞŽ9· òúþ³9¸üö†üö†ü9·h†´þò„þò„þꄉõöò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ùÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþ9³ŒÖþ9±’9²Èèè9±Šû9²ò‚ò‚ò‚9›’–ð9°äèèÜè9¯4èÜÐÜÐèÐÜèÜèèÐÜèèÜÜèèèô9©ÜÜ9§äÜÜèè9¦4ôÜèô9¤üÜÜ9£ÄÜèèè9¢,èèôÄèèôÄèôÄèôÄè9ôèÐ9œ¤9›–û¦Ö9šÄ¦õµüð†üð†üÎþø9™ø†ˆ¦õ§üð†üÎþø9—P„9™ˆ¦õ9™èüð†üð†üð†üð†üÎþ9˜‚ˆ¦õ9˜ìüð†üð†üð†üÎþ9—\ˆ¦õµüð†üð†üÎþø9–¼†ˆ¦õ™üÎþø9–(†ˆ¦õ™üÎþø9•”†ˆ¦õ™üÎþø9” „9”Ôˆ¦õµüð†üð†üïßþ9”,ˆ¦õ§üð†üïßþø9“D†ˆ¦õµ‹ñð†üð†üïßþø9’$„9’¼ˆ¦õ™üïßþ9’0ˆ¦õ™üïßþø9‘„9‘œˆ¦õ™üïßþ9‘ˆ¦õ™üïßþø9ä„9|ˆ¦õ™üïßþ9ðˆ¦õ™üïßþø9ŽÄ„9\ˆ¦õ™üïßþ9ŽÐˆ¦õ™üïßþø9Ž0†ˆ¦õ™üÎþø9Œ„9|ˆ¦õ§‹á†Êþ9ŒÀ‚ˆ¦õ§‹ñð†üÎþ9Œ(ˆ¦õ™‹ñÎþø9‹ˆ†ˆ¦õ™üïßþø9Šä†ˆ¦õ™‹ñïßþøÈ†ƒ‹†øðȆƒ‹†øð9jx†ƒš‘9ŠÞŽÞޯކ9ˆ”ކž†ø9ˆlŽÞŽÞŽ9†hŽœ9‡äèèè9†œú›Ÿüð†ü9„´Žœ9†0èèè9„èú›Ÿüð†ü9„ŒŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ9jÔ9‚Žõ9d9‚ èèÖ9€ˆ9,èÊ9”9€Pè9œ9~@9~üèèÖ9|\9~Üèè9|ÐôÖ9{9{ÄèèÖ9y$9zÐÜèè9y˜ôÖ9xH·èÖ9w$9wøèÜÖ9jÊ9w9jÂòúþ³9vðˆþöð†ƒùð†ƒùð†ƒù9uT„9u숦õ£ð†üïßþ9u`ˆ¦õ™üïßþø9t„9t°ˆ¦õ£ð†üïßþ9tˆ¦õ¡üç’Íþø9st†ˆ¦õ™üïßþø9rà†ˆ¦õ™üïßþø9l¼„9pdˆ¦õ§ŽþŠ9r,ŒþŠþŠ¸ÆŠþŠþŠ–èŠþ9qh„ŒþŠþŠ¸ÆŠþŠþŠ–èŠþ9q(„øèð†üÎþ9nh‚ˆ¦õ§ŽþŠ9oðŒþŠþŠ–èŠþ9op„ŒþŠþŠ–èŠþ9o0„øèð†üÎþ9m`‚ˆ¦õ§‹‹†øèð†üÎþ9lȈ¦õ™‹ñÎþøð†ƒù9kü†ƒ‹þаò„Ü„øè9kX†ƒ‹þаò„Ü„øèð†ƒùð†ƒùò†ƒùôüþÊ9iø†ƒ‹þŠþŠ–èŠþØò†ƒùð†ƒùð†ƒù9fô†ƒš‘9iœ9gÄŽ‘9itÞŽ9hòúþ³9i,ü9h|†9iþÀ„ŒþŠþŠ–èŠþÜöò†ƒùôüþ9g>òúþ³˜ˆþöò†ƒùôüþÊà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ùò†ƒùôüþÀò†ƒùôüþÊoH9cÀ†üüoD9c´üo@9cˆ›Ÿì†óßþøo89bø†üüo(9bxˆ›‘óßþøo$9a¼ˆ›™†ì†óßþøo 9a †üüo9aŒƒùö†üo9adƒùú‚üüo9a,ƒùnø9aünð9`˜ˆ›‘Òþønà9^d“®9_tŠ˜¦ˆ–’9_¼ü–üÊ9^à¸9^t›ãþøò†ƒùö†ünÜ9^$ƒùnØ9DT9\“®9],Œ¦ˆ–’9]Hü–üà9\˜¸9\,›ãþ9Z‚“®9[,Œ¦ˆ–’9[Hü–üà9Z˜¸9Z,›ãþ9X‚“®9Y,Œ¦ˆ–’9YHü–üà9X˜¸9X,›ãþ9V‚“®9W,Œ¦ˆ–’9WHü–üà9V˜¸9V,›ãþ9T‚“®9U,Œ¦ˆ–’9UHü–üà9T˜¸9T,›ãþ9R‚“®9S,Œ¦ˆ–’9SHü–üà9R˜¸9R,›ãþ9N‚“®9O$Œ9Q¼ˆ’9O@ü–9Oî’9P Š˜¦ˆ–’9Pèü–üÊ9P ¸9OØþþÆ—ˆÁ9N¸9N$›ãþ9Iø‚“®9K Œ9M´ˆ’9K(ü–9KÖ’9LˆŠ˜®ˆ–’9LÐü–ü—9L€9Kô¸9KÀþþÆ—ˆÁ9Jx¸9J ›ãþ9DX“®9F$9I¬’9Føüøüøüøüøüøüøü9DÔ9EXö9Dh›ãþøò†ƒùnÔ9D$†üünÐ9CÀˆŸßþøò†ƒùò„†üünÌ9CtünÈ92€“®93Š˜9Bàˆ–’93Øü–94†’979B8–––üê97ø9@Ôþ–˜þ˜¦Üü–üêê96øøüôø9?ì’96°øüøüøüøüøüøüøüøüøüøüøüøüøüøüøüøü94¤¸94pþþÆ—ˆ93ˆ92ü¸92›ãþøò†ƒùnÄ90Xˆ›92$90¦’úþŸ92„‚öꆆö91†ˆ¦õ·ä†‹Ø’ÍþøôüþÀþø9/¬†ˆ›‹Øþøn¼9/œ†üün´9/ˆ›‹Øþøn¨9& “ ½Œ9.tˆ–›ãþê9'œü–9(J’9(üŽ9*´9-D9.ˆ’ê9-Hü–ºþþÆ—ˆ‘9*°9+à–––˜þ–’êêêê9*¬––˜þ–’êê9)þ˜þ˜9*΂ˆ’êØü–ü9(ô9(hºþ9(4þþÆ—ˆ‘9'x9&°þþøn¤9#Ä“®9$ÔŽ9&–’9$ìþ˜þ––’9$Ì9$@¸9#Ô›ãþønœ9#¨†üün˜9#ü9"䆈›Ÿì†Òþøn9"Ôüð†ü9" †ˆ›ŸìØþø9†“¼9 hŠ˜9!„ˆ–’9 ô‚ˆ–’9 °ü–üÊ9À9 Dö98›‹Øþøò†ƒùnx9ð“¼90Š˜9|ˆ–’9삈–’9xü–9B’9p9 ’9høüôøüôøüøüøüøüøüøüøüøüøüøüøü9`9äö9,þþ9”—ˆ‹9(9ˆ9 ö9›‹Øþønt94ˆ›­ì†ì†Òþønp9†üünh9`ˆ›­ì†ì†Òþøn`9Püò„†üünX9È«þÚ„üˆ„þôô÷ò†ƒùnT9ôˆ›­ì†ì†Òþøò„†üünL9ÀƒùnD9°ü8þì„9 ¨“®9 ¸Œ¦ˆ–’9 Ôü–üà9 $¸9 ¸›ãþ9 ¤‚“®9 ¸Œ¦ˆ–’9 Ôü–üà9 $¸9 ¸›ãþ9¤‚“®9 ¸Œ¦ˆ–’9 Ôü–üà9 $¸9¸›ãþ9¤‚“®9¸Œ¦ˆ–’9Ôü–üà9$¸9¸›ãþ9¤‚“®9¸Œ¦ˆ–’9Ôü–üà9$¸9¸›ãþ9¤‚“®9¸Œ¦ˆ–’9Ôü–üà9$¸9¸›ãþ9Ђ“®9䌦ˆ’Âü–üà9P¸9ä›ãþ8þü‚“®9Œ¦ˆ’Âü–üà8ÿ|¸8ÿ›ãþøüö†ün@8øÀ“®8ùÐŽ8ûÌþ––˜8þþ–’8üL–˜þ–˜þ˜¦Üü–üêêêêêê8ùèþ˜8úðþ–’8ú˜þ–’8ùÈ8ù<¸8øÐ›ãþøn<8÷舛§ò†ì†Òþøn48ïL“¼8ðŒŽ8òô8ö48÷€ˆ’êÊ‚ˆ’8ö8ü–8öìþþ8öT—ˆŸì8òð8ô ˜8õ¬–’8ôL–––˜þ–’êêêê8òì––˜þ–’êê8ð¤þ˜þ˜8òXÆ‚ˆ’—Ó8ñü–8ñ´þþ8ñ—ˆ‹†8ð„8ïä8ðlþö8ï\›ŸìØþøn$8îȈ›‘Òþøò„†üün8î ün8‹†óßþøn8í`ˆ›ŸìØþømô8ì܈›‘Òþømì8ìT‡ü „þò„þò„þôô÷8먆ˆ›Ÿì†Òþø8ë$†ˆ›ãþømè8è8è´“¼8éôŒ8êȈ’êÊ‚ˆ’êÐü–ü—Óö8éL8éÔþøþ8èÄ›Ÿì†óßþ8舛Ÿì†óßþømä8æ ˆ›8çØ8æZ’úþŸ8缄‚öꆆö8渆ˆ¦õ·ä†‹Ø’ÍþøôüþÀþøò†ƒùmà8创»ìò†ì†ÒþømÜ8å üò†ƒùmÔ8䈛»ìòò†Òþøð†ƒù8áÀ†“®8âÜŠ˜¦ˆ–’8ã$ü–üÊ8âH¸8áÜ›ãþømÌ8á°ƒùö†ümÄ8áü8Ý脆“¼8ßdŠ˜8àÔŠ¶„Èüžü—Ë—8àp‚ˆ’ꂈ’—ÓÐü–ü—Óêö8Þ”8ßDþöøþøþ8Þ ›‹†óßþøüm¸8Ýpˆ›‘Òþøò†ƒùm´8Ý<ƒùm¬8Ð,“®8Ñ<Š˜8ܨˆ–’8Ñ„ü–8Ò2’8ÔL8ÜX’8ÔDøüøüøüøüøüøüøüøüøüøüøüøüôø8Õp’8Òôø8Ôdþ˜¦ˆ’Âü–ü8ÒÜ8ÒP¸8ÒþþÆ—ˆ8Ñ48Ш¸8Ð<›ãþøm¨8ÏŒˆ›‹ùßþøm 8Ï|üm˜8̸“¼8ÍøŠ˜8ψ’8΄‚ˆ–’8Î@ü–üÊ8ÍP8ÍÔö8ÌÈ›‹Øþøm”8̈›Ÿìùßþøð†ƒùmŒ8Ëäƒùmˆ8Ë(ˆ›™†ì†óßþøö†ümt8Êxˆ›Ÿì†óßþømp8ÅH“¼8ÆˆŠ˜8ʈ’8É€‚ˆ–’8ÆÐü–8Çš’8È`Œ8É$ˆ’8ÈÀ‚ˆ’Âü–üà8Ǹ8È<ö8Ç„þþ8Æì—ˆ‹8Æ€8Åà8Ædö8ÅX›‹Øþømh8Å,ƒùmd8Ńù/€†ƒš‘8ÄøÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ/Ü8º¶8»äÐè8º þ¾ò‚ò‚ò‚8¸„8¹èÜèè8¸Œþ¾ò‚ò‚ò‚8¶ 8¸Üèè8¶¨þ¾ò‚ò‚ò‚8µ8¶ è8µ þ¾ò‚ò‚ò‚8³h8´„è8³pþ¾ò‚ò‚ò‚8±Ì8²èè8±Ôþ¾ò‚ò‚ò‚8°08±Lè8°8þ¾ò‚ò‚ò‚8®”8¯°è8®œþ¾ò‚ò‚ò‚8¬à8­üè8¬èþ¾ò‚ò‚ò‚8«,8¬Hè8«4þ¾ò‚ò‚ò‚8©x8ª”è8©€þ¾ò‚ò‚ò‚8§Ä8¨àè8§Ìþ¾ò‚ò‚ò‚8¦(8§Dè8¦0þ¾ò‚ò‚ò‚8¤Œ8¥¨è8¤”þ¾ò‚ò‚ò‚8¢ð8¤ è8¢øþ¾ò‚ò‚ò‚8 L8¢ˆÜÜèèÜ8 Tþ¾ò‚ò‚ò‚8ž˜8Ÿäèè8ž þ¾ò‚ò‚ò‚8œ´8ž0èèè8œ¼þ¾ò‚ò‚ò‚8›8œLèè8› þ¾ò‚ò‚ò‚8™48š˜èè8™<þ¾ò‚ò‚ò‚8—h8˜Ìèèè8—pþ¾ò‚ò‚ò‚8•œ8—èèè8•¤þ¾ò‚ò‚ò‚8”8•è8” þ¾ò‚ò‚ò‚8’L8“ÈÐè8’Tþ¾ò‚ò‚ò‚8°8‘Ìè8¸þ¾ò‚ò‚ò‚8ŽÌ80èè8ŽÔþ¾ò‚ò‚ò‚8Œè8ŽLèè8Œðþ¾ò‚ò‚ò‚8‹8Œhèè8‹ þ¾ò‚ò‚ò‚8‰ 8Š„èè8‰(þ¾ò‚ò‚ò‚8‡<8ˆ èè8‡Dþ¾ò‚ò‚ò‚8…X8†¼èè8…`þ¾ò‚ò‚ò‚8ƒt8„Øèè8ƒ|þ¾ò‚ò‚ò‚88‚ôèè8˜þ¾ò‚ò‚ò‚8¬8èè8´þ¾ò‚ò‚ò‚8w 8,è8}ÄÜÜ8|tÜÄèè8z”èôÜèôÄèô8x$8w(þ¾ò‚ò‚ò‚/Ò8v¸Œ†Œò„øîòà†Œ†øòò‚ò‚/®úþ³8v$ˆþö8u„†ˆ¦õ™üÎþø8s¼„8t¨ˆ¦õ8utüð†üÓ•ò„øÌþ8sȈ¦õ8t”üð†üÓ•ò„øÌþø8rd„8sˆ¦õ§üð†üïßþ8rpˆ¦õ§üð†üïßþø8q „8qÀˆ¦õ§üð†üïßþ8qˆ¦õ§üð†üïßþø8p\†ˆ¦õ§üð†üïßþø8o„8o¸ˆ¦õ§üð†üïßþ8oˆ¦õ§üð†üïßþø8np†ˆ¦õ™üïßþø8m܆ˆ¦õ™üïßþø8mH†ˆ¦õ™üÎþø8lˆ†ˆ¦õ§‹ñð†üÎþø8jl„8kȈ¦õµüð†üð†üÎþ8k‚ˆ¦õ§üð†üïßþ8jxˆ¦õ§üð†üÎþø8fL„8gü—ü8hÚ–ð8jèèè8hÞû¦Ö8h ¦õ½üè†üð†üÎþ8g4‚ˆ¦õµüð†üð†üïßþ8fXˆ¦õ8g$üð†üÓ•‚„øÌþø8eŒ†ˆ¦õ¯üð†üç’Íþø8dø†ˆ¦õ™üïßþø8dd†ˆ¦õ™üïßþø8cІˆ¦õ™üÎþø8b°„8cHˆ¦õ™üïßþ8b¼ˆ¦õ™üïßþø8a„8b(ˆ¦õ™üïßþ8aœˆ¦õ™üïßþø8`p„8aˆ¦õ™üïßþ8`|ˆ¦õ™üïßþø8_P„8_舦õ™üïßþ8_\ˆ¦õ™üïßþø8^¼†ˆ¦õ™üïßþø8R<„8[\—ü8\‚–ð8^<ÜèÐèèÁû¦Ö8[l¦õ8\T‹ñð†üð†üè†üð†üÎþ8Wà‚—ü8Xî–ð8Z¨ÜèÐèèÁû¦Ö8Wô¦õ8XÀ‹ñð†üè†üð†üÎþ8T¬‚—ü8UŽ–ð8W0ÐÐèèÁû¦Ö8TÀ¦õ½üè†üð†üÎþ8S¨‚ˆ¦õ8T|‹ñà†‹ñð†üÎþ8Rà‚ˆ¦õ§‹ñð†üÎþ8RHˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð†ƒ‹þŠšò„ò„øè†ƒ‹þŠšò„ò„øè/Ô†ƒ‹8PÀò„ò„/ø›‘8P„ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ8FˆŽ†ž†ø8EàŽ†ž†ø8E¸ŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ/D8BÊ8CPèÊ8AÐ8BtèÊ8@Ü8A€èÊ8?è8@ŒèÊ8=¤8?˜ÄèÜÐèÊ8;`8=TÄèÜÐèÊ89d8:ÈèÜÐèÖ8688ÌèÜÐ87dèÜÐèÖ84ô85˜èÊ83è84ŒèÊ82Ü83€èÊ81Ð82tèÊ80Ä81hèÊ8/¸80\èÊ8.¬8/PèÊ8- 8.DèÊ8,”8-8èÊ8+ˆ8,,èÊ8*|8+ èÊ8)p8*èÊ8ä8'¸è8&hèÜÄ8$pÐÐÐ8"xÐÐ8 €8èÐ8ø8À8¸8hÜ8ÐÐèÐ8ÀÐèÐ8ìþ²ò‚ò‚8@8dÐÄ8ä8Hþ²ò‚ò‚8 ì8ÀÐÄÄè8°è8Àè8 ôþ²ò‚ò‚8°8 lÐÄ8 ¤èÜÄÄÐÜÐ8¤èèÐ8 è84èèÐèèÐèè8¸þ²ò‚ò‚8T8è8@8\þ²ò‚ò‚7ôH8\ÐÄ7þÄèÜÄ7ý,7ü„èÐÄèÐ7úDÐÜÐ7ø¬èèÐ7÷è7ö<7õ|7ôPþ²ò‚ò‚7òô7óÈ7òüþ²ò‚ò‚7ñX7ò\è7ñ`þ²ò‚ò‚7ï¼7ðÀè7ïÄþ²ò‚ò‚7í¨7ï$ÐÜ7í°þ²ò‚ò‚7ë|7íÐÐ7ë„þ²ò‚ò‚7éà7êäè7éèþ²ò‚ò‚7èD7éHè7èLþ²ò‚ò‚7æ¨7ç¬è7æ°þ²ò‚ò‚7å 7æè7åþ²ò‚ò‚7ãˆ7ä\7ãþ²ò‚ò‚7â47ã7â<þ²ò‚ò‚7àh7á´Üè7àpþ²ò‚ò‚7Ít7߸èÄè7ÝðèÄèÄèèèèè7Û èèÐÐ7ØøÄÜèÜÜÜè7ÕøÜèÜÜ7Ô`èèÐÄè7ÒP7Ѩ7Ñ7ЈèèÄÐÜèÄè7Í|þ²ò‚ò‚7À°7Ìôèèèèè7ËÄÜèÜÜ7ÈŒÜèÜÜ7ÆôèèÐÄè7Ää7Ä<7ì7ÃèèÄÐÜè7À¸þ²ò‚ò‚7¨ô7À`ÜèÐ7¾h7½Øèè7¼è7¼Xèè7»hè7º¨èèèÐèèè7¸˜ÜÐÐèÄÐèô7µ°èÄ7³è7³Xèè7²hÐèÐèè7°ˆè7¯ÈèèèÐèèè7­¸è7¬øÐèÄèô7«ÜÐÐè7¨üþ²ò‚ò‚7’Ð7¨t7§äèè7¦ôèÐèè7¥tè7¤„èèÐèèÄÄèèè7¡TèÄÐèÄÐèô7ôèèÐèèÐèèÄ7› è7šLèèè7™,ÐÐÐèÄèô7–ŒèÄÄè7””ÐèÜè7’Øþ²ò‚ò‚7ƒP7’dÐÐÜ7œèèÄÐèèÄèèÜÄèèÄèèè7ŠäèÐ7‰èèÜÐ7†ÜÐèèÄè7„œÐ7ƒXþ²ò‚ò‚7{ä7‚Ð7‚(èÐÐèÜÐ7ÐèèÐÜÐÄè7}0èèè7{ìþ²ò‚ò‚7yÐ7{dèÜè7yØþ²ò‚ò‚7kÔ7yèÐÄè7w(èÐÜÐè7uè7t@ÐÄ7rÀÐÜÐ7q7p€èèèèÐèèèèÐèèèèÄ7kÜþ²ò‚ò‚7fx7k$ÐÄ7i¤7hü7hlè7gd7f€þ²ò‚ò‚7e$7eø7e,þ²ò‚ò‚7] 7dŒèÐÐèÜÐ7b4èÐÜÄè7` èÐÜÄè7]¨þ²ò‚ò‚7Hl7]P7\èÐÄèÐÜÄè7XèèÐÜÄè7U¸èèèÐèèèÜÐÄèèèÄèÐÜèè7P0è7OXèèèÄèÐÜèè7Lpè7Kèèè7IèÐèè7Htþ²ò‚ò‚7Fp7HÐÐ7Fxþ²ò‚ò‚7DŒ7F ÐÜ7D”þ²ò‚ò‚7;7D<ÐÐÐè7Aüè7@¬7@èè7?,èè7=Ä7=4èè7û¦Ö7$x¦õ§‹ñð†üïßþ7°—ü7‚–ð7#üè7#<èÜÜ7!ÔèÜÜÜè7 èèÐ7t7ÌÐÜèÄèè7†û¦Ö7À¦õ§‹ñð†üïßþø7 ¼„7˜—ü7j–ð7<è7L7nû¦Ö7¨¦õ§‹ñð†üïßþ7 È—ü7š–ð7,è7lèÜÜ7èÜÜÜè7<èèÐ7Œ7äÐÜèÄèè7žû¦Ö7 ئõ§‹ñð†üïßþø7 $†—ü7 –ð7 TèèèèèÜ7 Œèèèèè7 û¦Ö7 @¦õ§‹ñð†üïßþø7 †—ü7ê–ð7tÜèÐ7îû¦Ö7(¦õ§‹ñð†üïßþø6ö<„7—ü7Ò–ð7¤è7´7Öû¦Ö7¦õ§‹ñð†üïßþ6öH—ü6÷–ð7”è7ÔÄèèÐÐÐÜ6þìèÜÜ6ý„èÜÜÜè6û¼èèÐ6ú 6ùdÐÜèÄèè6÷û¦Ö6öX¦õ§‹ñð†üïßþø6õ¨†ˆ¦õ™üïßþø6õ†ˆ¦õ™üÎþø6ôd†ˆ¦õ§üð†üÎþø6ü6îú–ð6ôÄèèèèÐèèèèèÜÜôÐèèèèè6îþû¦Ö6î8¦õ§‹ñð†üïßþø6霆—ü6êz–ð6íTè6ìLè6ëŒèèô6ê~û¦Ö6鸦õ§‹ñð†üïßþø6漄6è܈¦õµüð†üð†üÎþ6肈¦õµüð†üð†üÎþ6çl‚ˆ¦õ§üð†üÎþ6æÈˆ¦õ§üð†üÎþø6àð„6ã,—ü6ä –ð6æTÄèÜÜè6äû¦Ö6ã<¦õ½üè†üð†üÎþ6âd‚ˆ¦õµüð†üð†üïßþ6á ‚ˆ¦õµüð†üð†üïßþ6àüˆ¦õ§üð†üïßþø6Úì„6Ý`—ü6Þ>–ð6àˆÄèÜÜè6ÞBû¦Ö6Ýp¦õ½üè†üð†üÎþ6ܘ‚ˆ¦õµüð†üð†üïßþ6ÛÔ‚ˆ¦õµüð†üð†üïßþ6Úøˆ¦õ6ÛÄüð†üÓ•‚„øÌþø6ÉT†—ü6ÊB–ð6ÚœèÐ6Ù|èèèèèèÄèèÐÐ6Õ¼ÄÜèÜÜÜè6Ò¼ÜèÜÜ6Ñ$èèÐÄè6Ï6Îl6ÍÜ6ÍLèèÄÐÜèÄè6ÊFû²ò‚Ö6Ép¦õ¯‹ñð†üç’Íþø6ÈÀ†ˆ¦õ™üïßþø6È,†ˆ¦õ™üïßþø6ǘ†ˆ¦õ™üÎþø6Æx„6Lj¦õ™üïßþ6Æ„ˆ¦õ™üïßþø6ÅX„6Åðˆ¦õ™üïßþ6Ådˆ¦õ™üïßþø6Ä8„6ÄЈ¦õ™üïßþ6ÄDˆ¦õ™üïßþø6Ä6ðˆ¦õ™üïßþ6Ã$ˆ¦õ™üïßþø6„†ˆ¦õ™üïßþø6ÁÔ†ˆ¦õ§üð†üïßþø6Á@†ˆ¦õ™üÎþø6šØ„6ÀŒˆ¦õ§‹ñð†üÎþ6œ€‚—ü6·–6¿‚üõ›6À0‹‹òüèĆ‹‹òüèÖþ6·6¾ðèÜèèÜÐèèèèèè6»¨èÄè6¹Èè6¸èÐè6· û¦6²n–6µòüõ›6¶ ‹‹òüèĆ‹‹òüèÖþ6²z6µ0èÐèÐèÐèè6²rû¦6¯¶–6±Züõ›6²‹‹òüèĆ‹‹òüèÖþ6¯Â6°Èè6¯ºû¦6­F–6®¢üõ›6¯P‹‹òüèĆ‹‹òüèÖþ6­R6®(è6­Jû¦6ªŽ–6¬2üõ›6¬à‹‹òüèĆ‹‹òüèÖþ6ªš6« è6ª’û¦6§Ö–6©züõ›6ª(‹‹òüèĆ‹‹òüèÖþ6§â6¨èè6§Úû¦6ö–ð6¦ è6¥È6¤Hèè6£XèèÜ6¡xÐÄÄèÄè6ž¨èÁû¦Ö6œ”¦õ6¸‹ñà†‹ñð‚ð†üè†üð†üÎþ6›|‚ˆ¦õ6œP‹ñà†‹ñð†üÎþ6šäˆ¦õ™‹ñÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð6™8„6™Ðˆ¦õ™üïßþ6™Dˆ¦õ™üïßþø6—ø„6˜ ˆ¦õ™‹ñïßþ6˜ˆ¦õ™‹ñïßþøÈ†ƒ‹†øðȆƒ‹†øð6zð†ƒš‘6–ä†6– ކž†ø6•øŽÞŽÞŽ6“ôŽœ6•pèèè6”(ú›Ÿüð†ü6’@Žœ6“¼èèè6’tú›Ÿüð†ü6’ŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ6{L6õ6Žð6¬èèÖ6Ž6ޏèÊ6 6Üè6(6‹T6ŒpÐÐÖ6‰p6‹6‰äôÖ6‡¤6ˆÀÐÐÖ6…À6‡l6†4ôÖ6„ä·èÖ6{B6„Ð6{:òúþ³6„°ˆþöð†ƒù6ƒL„6ƒäˆ¦õ£ð†üïßþ6ƒXˆ¦õ™üïßþø6‚„6‚¨ˆ¦õ£ð†üïßþ6‚ ˆ¦õ¡üç’Íþø6l†ˆ¦õ™üïßþø6€Ø†ˆ¦õ™üïßþø6}4„6~䈦õ§ŽþŠ6€hŒþŠþŠ–èŠþ6脌þŠþŠ–èŠþ6¨„øèð†üÎþ6}Ø‚ˆ¦õ§‹‹†øèð†üÎþ6}@ˆ¦õ™‹ñÎþøð†ƒù6|t†ƒ‹þаò„Ü„øè6{Іƒ‹þаò„Ü„øèð†ƒùð†ƒùò†ƒùôüþÊ6xÔ†ƒš‘6zäÞŽÞŽÞŽ6yòúþ³6zLüö†üö†ü6y|†6zþà„Œ†øôò„þꄉõöò†ƒùôüþÊ6xT†ƒ‹þŠþŠ–èŠþØ6wÔ†ƒ‹þŠþŠ–èŠþØÆ†ƒ‹þŠ–èŠþà6uŒ†ƒš‘6wXÞŽ6uÖòü6w6u®þ³¬ˆ¦õ™‹6vtþøê†ˆþöò†ƒùôüþÊð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð膃ù膃ù膃ù/†ƒ¢6s0/Þìþ«6rdˆ¦õ·ä†‹Ø’Íþø6q †ˆªõ§üð†üÊþ›Ý6p膈ªõ§üð†üÊþ›Ý6p0†ˆªõ§üð†üÊþ›Ý6ox†ˆªõ§üð†üÊþ›Ý6n܆ˆªõ™üÊþ›Ý6n0†ˆªõ™‹ñÊþ›Ý6m”†ˆªõ™üïÛþ›Ý6lø†ˆªõ™üïÛþ›Ýò†ƒù/¬†ƒžþòü6lÐ/Îþ«6l(ˆ¦õ§ì†ëßþø6kd†ˆªõ§üð†üÊþ›Ý6jȆˆªõ™üïÛþ›Ý5¾ð„6jˆ¦õ§‹á†Êþ5¾üˆ6hüõ6iÔþþÚ†þþÚ†þþ膋ñï5¿þ›‹6gÜõ6h¤þþÚ†þþÚ†þþð†ü5¿Lþ¦6g¼üö†üö†üö†üö†üò†ƒù5¿Œüþš6gTüö†üö†üö†üö†üö†üö†üö†üò†ƒùò†ƒùö†üö†üò†ƒùò†ƒù5¿¬¡‘6fLÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ5À6aÆ6dPÐèèÄè6a°¨¦õ™üïßþÚš6^°6aXÐèèÄè6^¸¨¦õ™üïßþÚš6Xè6^0èèÜèèÜèèè6[`èèèÄè6Xð¨¦õ™üÎþÚš6S 6XhèèÜèèÜèèè6U˜èèèÄè6S(¨¦õ™üÎþÚš62l6R¸èè6QhèèèèÐèèèèÐèèè6NèèÜèèÄèèè6JØèèÜèèèÐèèÐèèèÄÐèÐÄèèèèè6DèèèèÐèèèèÐèèè6@ èèÜèèÄèèè6=pèèÜèèèÐèèÐèèèÄÐèÐÄèèèèèÄèèèèè65¨Ðèèèè63øèè62t¨¦õ§üð†üÎþÚš5ã861ÔèèÄ6/ôèÐèèÐèèèÐèè6,ÄèèèÄèèÐèèÐèèÐèèèÄÐèèÐè6&èèèÜèèÜèÐèè6#ÐèèÐèÄÐèèÐè6DèèÐèèÐèèÐèèÄÐèÄèèè6ŒèÐèèÐèèèÐèè6\èèèÄèèÐèèÐèèÐèèèÄÐèèÐè6´èèèÜèèÜèÐèè6 ´ÐèèÐèÄÐèèÐè6ÜèèÐèèÐèèÐèèÄÐèÄèèèÄ6ôÐèÐÜè6ä6<ÜèÐ5þ¤èÜè5ý<èèèÜèÄèèèÄèÄèèèÜèÄèèèÄèÄèèèÜèèèÄèèèÜèèèÄèèèÄèÄÐèè5ïìÜèèè5î ÜèèèÄèèèÄÐèèÄÄèèèÜèèèÐèèèÐÐÐÄèÐèÄèè5ã@¨¦õ§üð†üÎþÚš5Øt5âèèèÜèèÜèèèÄèèèÜèèèÄèèèÜèèèÄèÄèèèÜèÜèÄèèè5Ø|¨¦õ§üð†üÎþÚš5À05Ø$èèÜèèÜèèèÄèèèÜèèèÄèèèÜèèèÄèÄèèèÜèÜèÄèèè5À8¨¦õ5Î|‹ñ5À䆋œ‘5ÎdÞŽÞŽÞŽÞŽ5Ç¬Ž‘5͜ގ5È5Ìš·èÖ5È5É®þòúþ«5ËØˆ¦õ§ì†ëßþø5Ê „5ˈ¦õ§‹á†Êþ5Ê,ˆªõ¯þþ膋ñïÛþ›Ýꆈþöò†ƒùôüþ5Èòúþ³¬ˆ¦õ¯þþ膋ñÎþøê†ˆþöò†ƒùôüþ5ÁT5Åþ5Ç\èÜèÜèÖ5Ä5Å`èè5Äœ¦õ™üïßþ5Á¼5àÐè5ÁÄœ¦õ¯‘ü˜þò„þôñ膋ñÎþ5ÁPùò³Œ†øôò„þÕþéÎþÚšÌý‘×þïþ5¾ôö†ü/D†œ£5¾Ô/Æòúþ«5¾<ˆªõ™üïÛþ›Ý5½”†ˆªõ™üïÛþ›Ý5¼H„5¼èˆªõ£ð†üÊþ›5¼Tˆªõ™üÊþ›Ý5ºà„5»œˆªõ§üð†üïÛþ›5ºìˆªõ§üð†üïÛþ›Ý/<„5º$ˆªõ§‹á†ëÛþ›/Hˆ5¹œõ¯þþ膋ñï/Tþ›‹5¸ìõ§¡Ýþð†ü/˜þ¦5¸Ìüö†üò„†üüö†üò„†üüò„†üüò†ƒù/Ø/4Ú‘5¸†ØŽÞŽÞŽ5µÔŽœ5·8Üè5¶ú›Ÿüð†ü÷5´ Žœ5µœèèè5´Tú›Ÿüð†ü5²lŽœ5³èèèè5² ú›Ÿüð†ü5°¸Žœ5²4èèè5°ìú›Ÿüð†ü5¯Žœ5°€èèè5¯8ú›Ÿüð†ü5­PŽœ5®Ìèèè5­„ú›Ÿüð†ü5«œŽœ5­èèè5«Ðú›Ÿüð†ü5«tŽ5©xŽœ5«$èèèè5©¬ú›Ÿüð†ü÷5©PŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ5§$ŽŒ „ò„òö„ø/4ð5¦Þõ5¥ 5¦pèèÜèèÖ5£@5¤¼èÜÐèÊ5¢4«Ê5 ˜5¡üÜ5¡ ôÖ5ŸŒ«Ê5ð5ŸTÜ5ždôÖ5œ„5XèÜÖ5›H5œL5›¼Ê5™Ü5š°èÜÖ5˜ 5™¤5™Ê5–¤5˜PèèÜÐèÊ5• 5–<èÐèÖ/4Þòúþ³5•üÞ†”þò„þö5” †ˆ¦õ§üð†üÎþø5“p†ˆ¦õ§üð†üïßþø5’À†ˆ¦õ§üð†üïßþø5’†ˆ¦õ§üð†üïßþø5‘`†ˆ¦õ§üð†üïßþø5$„5¼ˆ¦õ£ð†üïßþ50ˆ¦õ™üïßþø5ŽØ„5€ˆ¦õ£ð†üïßþ5Žäˆ¦õ¡üç’Íþø5ŽD†ˆ¦õ™üÎþø5Œ4„5„ˆ¦õµüð†üð†üÎþ5ŒØ‚ˆ¦õ§üð†üÎþ5Œ@ˆ¦õ™‹ñÎþøò†ƒù/5üþš5Œüö†üö†üö†üö†üö†üò„†üüö†üö†ü5l„5‹€ú‚5r\‚—ü5sv–ð5ŠðèèèèÐèÐèèÄ5‡ØÐèèôÄèè5…˜èèèÐèèèèèÄèèèô5ð5HèèèèÜèôÜè5~ØÄèÄè5|àÄÄèèôÜèèô5zèè5xðèÄèèèè5vàèô5uØ5uHèèèÜÜô5szû¦Ö5rp¦õ5sXüð†üè†üð†üð†üÎþ5lœ—ü5m²–ð5qÄÐèÐèèèÜèè5nôèèèô5m¶û¦Ö5l¬¦õ5m”üð†üè†üð†üð†üÎþø5d˜„5hÀ—ü5j&–ð5køÜèèèèè5j*û¦Ö5hЦõ5i¸Ž†øðð†üè†üð†üð†üÎþ5d¤—ü5f –ð5h<ÜÄÜÐè5fû¦Ö5d´¦õ5eœŽ†øðð†üè†üð†üð†üÎþø5Lœ„5d”ú‚5R‚—ü5S–ð5cÔÜÜÜÜèÐôÄèèÄÄèèèèèÄ5^LèèèÐèèôÐèèôÜèô5ZŒÜÜÜÜèÐô5X5Wtè5Vœè5UÄè5UèèèÜÜô5Sû¦Ö5R0¦õ5Rüüð†üè†üð†üÎþ5L¨—ü5M¢–ð5Q„ÐèÐèèÜèè5Näèèèô5M¦û¦Ö5L¸¦õ5M„üð†üè†üð†üÎþø5E<„5I—ü5Jb–ð5LÜèèèè5Jfû¦Ö5I(¦õ5Iôކøðð†üè†üð†üÎþ5EH—ü5F’–ð5H”ÜÄÜÐ5F–û¦Ö5EX¦õ5F$ކøðð†üè†üð†üÎþø5?D„5E8ú‚ú‚5?P—ü5@J–ð5D5BÄÜÜÜè5@Nû¦Ö5?`¦õ5@,üð†üè†üð†üÎþø57ä„5;À—ü5= –ð5>¬Üèèèè5=û¦Ö5;Цõ5<œŽ†øðð†üè†üð†üÎþ57ð—ü59:–ð5;<ÜÄÜÐ59>û¦Ö58¦õ58ÌŽ†øðð†üè†üð†üÎþøö†üö†üö†üö†üö†üö†üò„†üüò„†üüò„†üü53t„Š—ü54Š–ð56ŒÜèèèèèè54Žû¦Ö53 ¦õ54lüè†üð†üð†üÎþö‚üüö†üö†üò„†üüò„†üüò„†üüò„†üüö†üö†üö†üö†üö†üö†üò„†üüò„†üüò„†üüò„†üüö†ü5.°„52 5.¼—ü5/š–ð51lÜèèèèè5/žû¦Ö5.̦õ½üè†üð†üÎþøö†üö†ü5 œ„5.Œ5(è‚—ü5)ö–ð5-ØÜèèèèè5+ø5+h5*ØèèÁû¦Ö5(ü¦õ5)È‹ñð†üè†üð†üÎþ5 Ä‚—ü5#^–5'Òüõ›5(‹‹ò„øè5(†‹‹˜ê„øèÖþ5#j5'èÐèÐèèèÄèÐè5#bû²ò‚5 ~–5":üõ›5"ø‹‹ò„øè5"h†‹‹˜ê„øèÖþ5 Š5!¨è5 ‚û²ò‚5v–5Züõ›5 ‹‹ò„øè5ˆ†‹‹˜ê„øèÖþ5‚5˜èÐèÐèÐèèè5zû²ò‚5Þ–5Rüõ›5‹‹ò„øè5€†‹‹˜ê„øèÖþ5ê5Øè5âû²ò‚5þ–5ºüõ›5x‹‹ò„øè5膋‹˜ê„øèÖþ5 5(è5û²ò‚5–5Úüõ›5˜‹‹ò„øè5†‹‹˜ê„øèÖþ5*5Hè5"û²ò‚5V–5úüõ›5¸‹‹ò„øè5(†‹‹˜ê„øèÖþ5b5hèè5Zû²ò‚5 ¦–ð5˜Üèèèèè5 ¸5 (Áû¦Ö5 ئõ½üè†üð†üÎþö‚ú‚ú‚üüö†üö†üö†üö†üö†üö†üö†üð†üö†üö†üð†üò†ƒùò†ƒùò†ƒùö†üö†üò†ƒùò†ƒù/50²5 ˜Ž¾Àú›Ÿì†5 TŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ5ÔŒ5Œ5––üÌÀŽŒþþÖŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽØŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡4ü<ކÀކÀŽ†ØŽÞŽÞŽ4ú|އ‹þŠþŠþŠþ4úHŽ‡×Ž/5Œþ4ô.4ùèèè4÷xÐè4õàÐè4ô¨¦õ™üÎþÚš4ñØ4ó`4òÐ4ñਦõ™üïßþÚš4ît4ñ(4ð˜4ðèè4î|¨¦õ§‹ñð†üïßþÚš4ë4î èè4í4ìt4ë ¨¦õ³þð†üð†üïßþÚš4æ¼4ê°èè4é¨4é4èˆèè4æÄ¨¦õ4çЋñð‚ð†üð†üïßþÚš4Ü 4æ$èèèèèèèÄèèèÐèèèôÐèèèè4àüè4ßôÐèèÄèÜèèè4ܨ¨¦õ§üð†üïßþÚš4ÑT4ÛüÜèÜÜèÐô4ÙŒ4ØüèèôÐèèèÐèèèôÐèèèÜè4Ô|4ÓÔè4Òüè4Ñ\¨¦õµüð†üð†üÎþÚš4Î84мÜèÜèè4Î@¨¦õ4ÏLüð†üð†üð†üÎþÚš4Ä4Í”è4̼èèèèèèè4ÊÜèèèèèÐèèè4ÈT4Ǭè4ÆÔè4Æèèèô4Ĩ¦õ4Åüð†üð†üð†üÎþÚš4Â`4È4Âh¨¦õ™üÎþÚš4¿84ÁàèèèèèÄ4¿@¨¦õ™üÎþÚš4®\4½øèèÜèÜÜèÐô4»(èèèô4¹¨è4¸ÐèèÄèèÄèèèèèÄ4µ(èèèÐèèô4³0èèèôÜèô4±PèÐ4°4®d¨¦õ§üð†üïßþÚš4ž4­ÀÜèÜÜèÐô4«P4ªÀèèôÐèè4¨àÄèÄèèÄèèèèèÄ4¤ðèèèÐèèôÐèèôÜèô4¡xè4 ˆè4Ÿ°è4ž¨¦õµüð†üð†üÎþÚš4šì4pÜèÜèè4šô¨¦õ4œüð†üð†üð†üÎþÚš4Œ4š èèèèèèè4˜@ÄèÄèèÄèèèèèÄ4”PèèèÐèèôÐèèôÜèô4Øè4è4(è4ŽhèÜÜô4Œ¨¦õ4(üð†üð†üð†üÎþÚš4Š$4‹”è4Š,¨¦õ™üïßþÚš4ˆ4‰D4ˆ ¨¦õ™üïßþÚš4…ä4‡$4…쨦õ™üïßþÚš4ƒÄ4…dÐ4ƒÌ¨¦õ™üïßþÚš4¤4ƒDÐ4¬¨¦õ™üïßþÚš4´4 è4¼¨¦õ™üïßþÚš4}Ä4è4}̨¦õ™üïßþÚš4{°4},è4{¸¨¦õ«üÝ•†øÌþÚš4yœ4{è4y¤¨¦õ«üÝ•†øÌþÚš4x$4yL4x,¨¦õ™üïßþÚš4s4wÔèÐÐèè4uÜÜèèôÄèèô4s$¨¦õ™üïßþÚš4lÀ4r„ÜèÐèÄè4p,ÐèÐèÄè4lȨ¦õ³þð†üð†üÎþÚš4k4lpè4k ¨¦õ™üïßþÚš4ip4j˜4ix¨¦õ™üÎþÚš4[t4hÐèè4gÈèèèèèÐèÜèÜÜèÐô4dèèè4bÐ4b@èèèÐèèôÐèèôÜèô4^Èè4]Øè4]è4[|¨¦õ§üð†üÎþÚš4Y 4ZôÄ4Y(¨¦õ§üð†üïßþÚš4Vl4X ÄÐ4Vt¨¦õ§üð†üÎþÚš4RH4UäÄÐ4T|èÄè4RP¨¦õ§üð†üÎþÚš4N„4QÀÄ4P¸èÄè4NŒ¨¦õ§üð†üïßþÚš4L|4M¤4L„¨¦õ™üïßþÚš4J4KœÐ4J¨¦õ™üÎþÚš4GÜ4I|Ä4G䨦õ™üïßþÚš4ED4GDÄÐ4EL¨¦õ™üÎþÚš4C 4DÜÐè4C(¨¦õ§üð†üÎþÚš4A4BXè4A ¨¦õ™üÎþÚš4=(4@ÈÐÄÐèÄèèô4=0¨¦õµüð†üð†üïßþÚš4 4<ŒèèÜèÄèèèèèÄ49DèèèèèÜè47Lèèè46,ÐèÄ44”èèèÐèèôÜè42 ÄèÄè4/üèÄ4.”èèèôÜèèôÜèèôÜèô4+èÐèÄèèèÐèèÄ4'tÐèèô4%ôèè4$ÔèÄèèèè4"Äèô4!¼4 ¨¦õ4!,üð†üð†üð†üÎþÚš4°4€ÜèÜèèè4¸¨¦õ4àüð†üð†üð†üð†üÎþÚš3ü”4èèÜèÄèèèèèÄ4ÌèèèèèÜè4¼èèèèèèèèè4dÐèÄ4ÌèèèÐèèôÜè4DÄèÄè44èÄ4 ÌèèèôÜèèôÜèèôÜèô4 <èÄèèèèèèèèèÄèèÄ4Ðèèô4„èè4dèÄèèèè4Tèô3ÿL3þ¼èèèô3üœ¨¦õ3ýÄüð†üð†üð†üð†üÎþÚš3÷X3ü,Ä3úÜèÄ3ùtÐèèô3÷`¨¦õ§üð†üïßþÚš3ð83öðÄèÐèèÄ3ô€èèèôÐÐèèôÐÐè3ð@¨¦õµüð†üð†üïßþÚš3ê$3ïˆèèèèÄèèèèÄèèèè3ëÈ3ê,¨¦õ§üð†üÎþÚš3Ü03étèÜÜ3çÜÜÜèÄ3åüè3å<èÐÄèèèèèèèÜèèÄèôÐèÐÄèèèèèèèÜèèÄèô3Ü8¨¦õ§üð†üÎþÚš3׸3ÛÈèÐèÜÜèÐô3Ù@èèô3×À¨¦õ™üÎþÚš3Ö3×83Ö¨¦õ™üÎþÚš3ÑÄ3Õ¨Üè3Ô èÐÜôÜèèô3Ñ̨¦õ§üð†üÎþÚš3Ì<3ÑtÐèÄÜèÜÄèÐÜôÜèèô3ÌD¨¦õ±ð†üð†üÎþÚš3µÐ3ËŒÐè3ÊlÜèÜÜèÐèôÄÐè3ƬÜè3ÅŒÜèÜÜèÐèôÄÜèÄ3Á<ÐèÄÜèÜÄèÄèÄèÜèÄÜèÜèô3ºÜèôÜè3¹ŒèôÜÄèÜôÜèèô3µØ¨¦õ¿ð†üð†üð†üÎþÚš3¯Ô3µ€èÄÜÜè3³ˆèèèÜèÐÜôÜèèô3¯Ü¨¦õ§üð†üÎþÚš3—È3¯TèÜèÜèÜÜÐèèèè3«ôèÜÐèÜÄè3©$èÜÐèÜÄèÄÜèèèôÜèèôÜèÜè3£„ÜèÜÜ3¡ÔèôÜ3 ´èôÜèÜèÄèèÜèÜèÄèèôÜèèôÜèèôÜèèôÄè3—Ш¦õ3™\üð†üð†ü3˜˜†ŽþŠþŠþŠþØð†üÎþÚš33—HèÐèÜÜèÜÜèÐèèô3“ˆÜè3’hèÐ3‘0ÄèÜèÜÜèÄÜèÐèôÄèèôÜèèèô3‹HèèÜèÜÜèÐèô3ˆ0ÄèèôÐèèèôÜèèôÐèè3„(èôÜèèèô3˜¨¦õµüð†üð†üÎþÚš/@À3€àè3€ èÜÄèÜÄè3}€èèô3|`Äè3{è3zè3y0ÄèÜèÜÜèÄÄèÐèô3tàèÐèÜÜèÜÄèÜèÄèÄÜèÐèèô3n°ÄèÜèÄèÄÜè3k èÄèèèôÜèèô3h€èèÜèÜÜèÐèô3e˜èÐèÜÜèÐèèÜèÐèèô3aHèèÜè3_Èè3^ÀÄèèôÐèèôÜèèôÐÜèè3ZˆèôÜÜèèÜô/@Ȩ¦õ3Xˆü/A†Ÿ‘3X@†ÀŽ†ØŽÞŽÞŽ3U¸Žœ3WÜè3Uìú›Ÿüð†ü÷3TŽœ3U€èèè3T8ú›Ÿüð†ü3RPŽœ3SÌèèè3R„ú›Ÿüð†ü3PœŽœ3Rèèè3PÐú›Ÿüð†ü3N莜3Pdèèè3Oú›Ÿüð†ü3M4Žœ3N°èèè3Mhú›Ÿüð†ü3K€Žœ3Lüèèè3K´ú›Ÿüð†ü3KXŽ3I\Žœ3Kèèèè3Iú›Ÿüð†ü÷3I4ŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ3G ŽŒ¶ê„ò„òö„ø/Að3FÚõ3E83FlèÜè3E@3D,«Ê3B3CôÜ3CôÖ3A„«Ê3?è3ALÜ3@\ôÖ3>|3?PèÜÖ3=@3>D3=´Ê3;Ô3<¨èÜÖ3:˜3;œ3; Ê38ü3:HèèÜèÊ37x38”èÐèÖ/AÞòúþ³37tüÞ†”þò„þö36x†ˆ¦õ§üð†üïßþø35Ȇˆ¦õ§üð†üïßþø35†ˆ¦õ§üð†üïßþø34h†ˆ¦õ§üð†üïßþø33T†ˆ¦õ§ŽþŠþŠþŠþØð†üïßþø32„32°ˆ¦õ£ð†üïßþ32$ˆ¦õ™üïßþø30Ì„31tˆ¦õ£ð†üïßþ30؈¦õ¡üç’Íþø/C´†ˆ¦õ30¼ü/D/R®†30œ/R²ìþ³30Œƒù/Räüþš30@ˆþöò„†üüò„†üüò„†üüò„†üüú‚üüò„†üüö†üö†üò„†üüò„†üüö†üö†üò„†üüò„†üüò„†üüò„†üüö†üö†üö†üò„†üüö†üö†üò„†üüò„†üüö†üö†üö†üâ„–ú‚ú‚ú‚ú‚üüö†üö†üö†üö†üö†üö†üö†üö†üö†üö†üò†ƒùö†üò†ƒù/S²3,˜ŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÈއ‹þ3& އ‹þÈŽ‡ÑއÁއ‹þÈŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡×Ž3#¸Ž‡‹ò„ø3#XŽŒò„ø/S`0)0*<3# ò„ò„0*8¬3"œŒþŠò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ3䎌ªŒþŠ–ŒþІøÖŠþ3„ŒþІøæ3¬ŽŒ†Œ’Šª–þІø38–3Ü0*ˆþ3fõ3l·èÖ3·èÖ3Ä3@ÜèÄèÖ3È3tèÜèÄèÖ3Ì3xÜèÄèèÖ3À3dèÊ3l3@èèÊ3 3 ìèèÊ3 Ä3 ˜èèÊ3 p3 DèèÊ3 d3 èÊ3X3üèÊ3L3èèÖ3P3üÜèÄèèÖ3D3èèÊ383ÜèÊ3,3èèèÖ33Ä34èÊ2þô3(2ÿ˜èÊ2ýˆ2þŒèèèÊ2ü2ý èèèÊ2úÈ2ûœèèÊ2ùt2úHèèÊ2ø 2øôèèÊ2öÌ2÷ èèÊ2õ2ö|ÜèÄèÖ2ô ·èÖ2ñ 2ó¤Üè2òœèèÜèèÊ2îd2ðÐÜèÄÜèèÜèÖ2ìh2íäèèÜèèÊ2é¬2ëèèèÐèèÜèèÊ2è@2é\ÜÜèÖ2çL·èÖ2åP2æüÜèÄèèÖ0*z2å<ò‚0*Jþ³2䘈žþŠò„øÚöâ„–ú‚ú‚ú‚ú‚üüâ„–ú‚ú‚ú‚ú‚üüâ„–ú‚ú‚ú‚ú‚üü2ㆈ¦õµüð†üð†üÎþø2℆ˆ¦õ™üÎþø2áĆˆ¦õ§‹ñð†üÎþø2àP„2ሦõµüð†üð†üïßþ2à\ˆ¦õ§üð†üïßþø2Þ¤„2ßtˆ¦õ2à@üð†üð†üð†üÎþ2Þ°ˆ¦õµüð†üð†üïßþø2Þ†ˆ¦õ™üÎþø2Ý`†ˆ¦õ§üð†üÎþø2Ü@„2ÜØˆ¦õ™üïßþ2ÜLˆ¦õ™üïßþø2Û „2Û¸ˆ¦õ™üïßþ2Û,ˆ¦õ™üïßþø2ÙÈ„2Ú|ˆ¦õ§üð†üïßþ2ÙÔˆ¦õ§üð†üïßþø2Øp„2Ù$ˆ¦õ§üð†üïßþ2Ø|ˆ¦õ§üð†üïßþø2×À†ˆ¦õ§üð†üÎþø2×,†ˆ¦õ™üÎþø2Ö˜†ˆ¦õ™üïßþø2Õ$„2ÕØˆ¦õµüð†üð†üÎþ2Õ0ˆ¦õ§üð†üÎþø2Ô†ˆ¦õ™üïßþø2Óü†ˆ¦õ™üïßþø2ÒÜ„2Ótˆ¦õ™üïßþ2Ò舦õ™üïßþø2Ѽ„2ÒTˆ¦õ™üïßþ2ÑȈ¦õ™üïßþø2Ñ(†ˆ¦õ™üïßþø2Ð\†ˆ¦õµüð†üð†üÎþø2Ì´„2Ï€ˆ¦õ2ÐLüð†üð†üð†üïßþ2Ψ‚ˆ¦õµ‹ñð†üð†üïßþ2΂ˆ¦õ§üð†üïßþ2ÍH‚ˆ¦õ§‹ñð†üïßþ2ÌÀˆ¦õ™üïßþøà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðð†ƒùà†ƒ‹þðà†ƒ‹þðò†ƒù̆ƒ‹þŠò„øè0*Іƒ‹2ɬŒþŠ–ŒþІøÖŠþ2ÉL„ŒþІø0*ô18¾‘2ȸŒþŠšŒ‚ä„ò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ2¿ŽŒšŒ–†øîä„ò„ø18Ü2¾Üòü18Ô2½æ2¾lèÊ2¼¼2½`èÊ2»È2¼lèÊ2ºÔ2»xèÊÊõ2¹”·èÖ2¸¸·èÖ2·¬2¸hèèÖ2¶p2·\èèèÖ2´ì2¶èèè2´ô2³à2´„èÊ2²Œ2³`èèÊ2±82² èèÊ2¯ä2°¸èèÊ2®2¯dèèÊ2­l2®èÊ2¬H2¬ìèÊ2«$2«ÈèÊ2ª2ª¤èÊ2¨ô2©˜èÊ2§è2¨ŒèÊ2¦”2§€èè2¦œ2¥2¦,èèè2¥2¤2¤¨èÊ2¢ø2£œèÊ2¡¤2¢èè2¡¬2 €2¡TèèÊ2Ÿ\2 0èèÊ2ž2Ÿ 2ž|Ê2œ´2¸2(Ê2›¨2œLèÊ2šœ2›@èÊ2™2š4èÊ2˜„2™(èÊ2—02˜èè2—82•ô2–˜èÊ2“°2•\Üèèèè2“¸2‘´2“HèÜèèè2‘¼2 2‘èèèè2¨22ŽðèÜèèèè22‹`2Œ”ÜÜèÊ2Š$2Šàè2Š,18Ê2‰ôŒ†øòò‚18šþ³2‰ˆžþŠšŒ‚ä„ò„øÚö2ˆh†ˆ¦õ™üÎþø2‡¨†ˆ¦õ§‹ñð†üÎþø2†4„2†èˆ¦õµüð†üð†üïßþ2†@ˆ¦õ§üð†üïßþø2€„2°—ü2‚ª–ð2…„ÜèèèèÜèÜèè2‚®û¦Ö2À¦õ2‚Œüè†üð†üð†üÎþ2€Ì‚ˆ¦õ2œüð†üð†üð†üÎþ2€ ˆ¦õµüð†üð†üïßþø2l†ˆ¦õ™üÎþø2~¼†ˆ¦õ§üð†üÎþø2}œ„2~4ˆ¦õ™üïßþ2}¨ˆ¦õ™üïßþø2||„2}ˆ¦õ™üïßþ2|ˆˆ¦õ™üïßþø2{$„2{؈¦õ§üð†üïßþ2{0ˆ¦õ§üð†üïßþø2yÌ„2z€ˆ¦õ§üð†üïßþ2y؈¦õ§üð†üïßþø2y†ˆ¦õ§üð†üÎþø2xˆ†ˆ¦õ™üÎþø2wô†ˆ¦õ™üïßþø2v€„2w4ˆ¦õµüð†üð†üÎþ2vŒˆ¦õ§üð†üÎþø2u솈¦õ™üïßþø2uX†ˆ¦õ™üïßþø2t8„2tЈ¦õ™üïßþ2tDˆ¦õ™üïßþø2s„2s°ˆ¦õ™üïßþ2s$ˆ¦õ™üïßþø2qø„2rˆ¦õ™üïßþ2rˆ¦õ™üïßþø2pØ„2qpˆ¦õ™üïßþ2p䈦õ™üïßþø2pD†ˆ¦õ™üïßþø2kT„2o„ˆ¦õµüð†üð†üÎþ2k`—ü2l>–ð2nÐÜèèèèÜèèè2lBû¦Ö2kp¦õ½üè†üð†üÎþø1@,„2fЗü2gÊ–ð2j¼ÜèèèèÜèèèÐèÁû¦Ö2fà¦õ2g¬üð†üè†üð†üÎþ1CÔ‚—ü2cŠ–2e¾üõ¦õ2flކøðð†üè†üð†üÎþ2c–2eDèÐÜÐÁû¦Ö2\–2bnüõ¦õ2cކøðð†üè†üð†üÎþ2\Î2a¬Üèèèèè2_äÜèèèèÜèèÜôÜè2\Æû¦Ö2XÖ–2[:üõ¦õ2\TކøðÈ†Ž†øðð†üè†üð†üÎþ2Xâ2ZÜèèèèèÁû¦Ö2S –2WNüõ¦õ2XhކøðÈ†Ž†øðð†üè†üð†üÎþ2S2V¤ÜèÐèÜèèèÜÜèèè2Sû¦Ö2M–2Q‚üõ¦õ2RœŽ†øðÈ†Ž†øðð†üè†üð†üÎþ2M2PØÜèÐèÜèèèÜÜèèèè2Mû¦Ö2E2–2K†üõ¦õ2L Ž†øðÈ†Ž†øðð†üè†üð†üÎþ2E>2JÜÜèÄèèÄèèèèÜÜèèèèÐÜèèè2E6û¦Ö2Aâ–2Düõ¦õ2DÄŽ†øðð†üè†üð†üÎþ2Aî2CœèÐÜÐÁû¦Ö2;–2@Æüõ¦õ2Atކøðð†üè†üð†üÎþ2;&2@Üèèèèè2><ÜèèèèÜèèÜôÜè2;û¦Ö27.–29’üõ¦õ2:¬Ž†øðÈ†Ž†øðð†üè†üð†üÎþ27:28èÜèèèèèÁû¦Ö21b–25¦üõ¦õ26ÀކøðÈ†Ž†øðð†üè†üð†üÎþ21n24üÜèÐèÜèèèÜÜèèè21fû¦Ö2+f–2/Úüõ¦õ20ôކøðÈ†Ž†øðð†üè†üð†üÎþ2+r2/0ÜèÐèÜèèèÜÜèèèè2+jû¦Ö2#Š–2)Þüõ¦õ2*øŽ†øðÈ†Ž†øðð†üè†üð†üÎþ2#–2)4ÜèÄèèÄèèèèÜÜèèèèÐÜèèè2#Žû¦Ö2î–2"Rüõ¦õ2#ކøðð†üè†üð†üð†üÎþ2ú2!ØèÐÜÐèÁû¦Ö2Ú–2¶üõ¦õ2€Ž†øðð†üè†üð†üð†üÎþ2æ2ôÜèèèèè2,ÜèèèèÜèèèÜôÜè2Þû¦Ö2ú–26üõ¦õ2lކøðÈ†Ž†øðð†üè†üð†üð†üÎþ22ŒÜèèèÐèèÜèÁû¦Ö2 :–2Vüõ¦õ2ŒŽ†øðÈ†Ž†øðð†üè†üð†üð†üÎþ2 F2¬ÜèÐèÜèÐèèÜèÜÜèèè2 >û¦Ö2J–2 –üõ¦õ2 ÌŽ†øðÈ†Ž†øðð†üè†üð†üð†üÎþ2V2 ìÜèÐèÜèÐèèÜèÜÜèèèè2Nû¦Ö1ýJ–2vüõ¦õ2ÜŽ†øðÈ†Ž†øðð†üè†üà†Žþð膋ñÎþ1ýV2ÌÜèÄèèÄèèÐèèÜèÜÜèèèèÐÜèèè1ýNû¦Ö1ÍR–1ÒÎüõ›1üä‹‹ò„øè1Òü†‹‹1ü¼ê„1Ó01ü†­Ïìþ³Œƒùôüþ1Óf‘1ûÜÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ1Ó|1ö1÷0ÄÄÖ1óè1õdÄÄèÖ1ó<«Ê1ò«Ê1ñ„1ò(èÊ1ðx1ñèÊ1ïl1ðèÊ1î`1ïèÊ1èì1íPÐ1ëè1ëX1êP1éÀ1èôþ¦ò‚1å 1èTÐèÐÄ1æD1å¨þ¦ò‚1áL1å ÐÜÐÜèÄèèôÄèô1áTþ¦ò‚1߀1àäÄè1߈þ¦ò‚1Ór1ßlò‚1ÓNúþ³1Þ¬ˆ¦õ§ì†ëßþø1Þ †ˆ¦õ™üÎþøö†üö†ü1Ý\†¼þò„þÖ„Œò„øôö1Ü,„1ÜÔˆ¦õ™üïßþ1Ü8ˆ¦õ¡üç’Íþø1Û „1Û¤ˆ¦õ™üïßþ1Ûˆ¦õ™üïßþø1ÙÜ„1Ú„ˆ¦õ™üïßþ1Ù舦õ¡üç’Íþø1Ù,†ˆ¦õ§üð†üÎþø1ؘ†ˆ¦õ™üÎþø1؆ˆ¦õ™üÎþø1Õð„1×Pˆ¦õ§‹á†Êþ1Ö”‚ˆ¦õ§‹ñð†üÎþ1Õüˆ¦õ™‹ñÎþøà†ƒ‹þðà†ƒ‹þðð†ƒù膃ùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðò†ƒùôüþ1ÓÖþ1Í^1Ò èèèèÐèèèèÐèèèèÄÜ1ÍVû²ò‚1ɺ–1Ì6üõ¦õ1Ì䎆øðð†üè†üð†üÎþ1ÉÆ1ˤÜÄÜÐÁû¦Ö1Æj–1Èžüõ¦õ1ÉLކøðð†üè†üð†üÎþ1Æv1ÇôÜèèèèÁû¦Ö1Ã"–1Åžüõ¦õ1ÆLüð†üè†üð†üÎþ1Ã.1Å ÜÜÜè1Ã&û¦Ö1¶®–1ÂVüõ¦õ1Ãüð†üè†üð†üÎþ1¶º1Á€ÜèÐèÜÜèÜÜèÐèôÄÐèÐèÐèÐè1ºð1ºHè1¹pèè1¸€èèèÜÜô1¶²û¦Ö1³–1µ’üõ¦õ1¶@ކøðð†üè†üð†üÎþ1³"1µÜÄÜÐÁû¦Ö1¯Æ–1±úüõ¦õ1²¨Ž†øðð†üè†üð†üÎþ1¯Ò1±PÜèèèèÁû¦Ö1¬–1®úüõ¦õ1¯¨üð†üè†üð†üÎþ1¬1®hÜÜÜè1¬ 1¬ û¦Ö1‹ª–1«:üõ¦õ1«èüð†üè†üð†üÎþ1‹¶1ª\ÜèÐèÜèÜÜÜèÐèôÄÐèÐèÐèÐè1£œè1¢Äè1¢èÐèèÐè1ŸÜè1ŸÄè1´è1œ4ÜèÐèÜèÜÜÜè1˜ìèè1—ÌèèÐèÐèÜÜè1”ÌèÄèèÄÜÐÜÜè1‘TèèôÄèôÐèèèèô1Ž<è1|èèèÜÜô1‹®û¦Ö1‡Æ–1Šrüõ¦õ1‹<ކøðð†üè†üð†üð†üÎþ1‡Ò1‰àÜÄÜÐèÁû¦Ö1„*–1†Žüõ¦õ1‡Xކøðð†üè†üð†üð†üÎþ1„61…äÜèèèèèÁû¦Ö1}~–1ƒBüõ¦õ1„ üð†üè†üð†üð†üÎþ1}Š1‚€ÐèÐèèèÜèÜèè18èèèèèè1}‚û¦Ö1G¾–1|–üõ¦õ1}`üð†üè†üð†üð†üÎþ1GÊ1{pèÐÜèÐèÜèÜÜÜè1w°ÜèÐèÜèÜÜÜè1t€ÜèÐèÜèÜÜÜè1q8èôÄèôÄèèôÜÐèÐèÐèÐèÜè1k˜ÄèÄè1ipè1h°èèôÜèèèô1f¸èèèèè1dØèèèè1cpÜèÜèèèÄÜèÐèÜèÜÜÜèèèôÄèèô1\àèÐÜèÐèÜèÜÜÜèèèô1XÀÜèÐèÜèÜÜÜèèèôÄèôÄÜÐèèÐèôÄè1Qˆèô1P°èÜÐèèô1N¸èèè1M€èÄèèèèè1K@èô1J 1IèèèÜÜô1GÂû¦Ö1D¶–ð1GÜèèèèÜèèèÁû¦Ö1Cè¦õ½üè†üð†üÎþ1Bô‚ˆ¦õ1CÄüð†üð†üð†üÎþ1B ‚ˆ¦õµ‹ñð†üð†üÎþ1Ax‚ˆ¦õ§üð†üÎþ1@À‚ˆ¦õ§‹ñð†üÎþ1@8ˆ¦õ™üÎþøÞ†ƒ‹†øðÞ†ƒ‹†øð1>$„1>øˆ¦õ§‹ñð†üïßþ1>0ˆ¦õ¯‹ñ膋ñïßþø1<ä„1=Œˆ¦õ™‹ñïßþ1<ðˆ¦õ™‹ñïßþøÔ†ƒ‹ò„øðÔ†ƒ‹ò„øðà†ƒ‹þðà†ƒ‹þðð†ƒùð†ƒùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þð19ø†ƒ‹þŠšŒ‚ä„ò„øè19 †ƒ‹ªŒ–†øîÜ„ê„øðò†ƒùôüþ0+*‘18„ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ0+@1.ò«Ê1.(«Ê1-1-ÀèÊ1,1,´èÊ1+1+¨èÊ1)ø1*œèÊ1$„1(èÐ1'€1&ð1%è1%X1$Œþ¦ò‚1"(1#Ô1#D1"´1"0þ¦ò‚1œ1!x1 è1 Xè1¤þ¦ò‚1P1èè1ü1l1Ü1Xþ¦ò‚141èèè1à1P1À1<þ¦ò‚1è1Ìèè1Ä141¤è1ðþ¦ò‚11PÐèÐèè1X1È1èè1$þ¦ò‚1 1pèÐèèÐèÐÐèÐÐÄè1 ðè1 è1 þ¦ò‚1@1 |ÐèÐÄ1Hþ¦ò‚1|10ÐèÐèèÜ1„þ¦ò‚0÷¤1èÐèÐèè1ÐÐèÐÐ0þx0ýÐ0ý@ÐèÐ0û¨0ûÄè0ù°è0ø¨è0÷¬þ¦ò‚0öh0÷$0öpþ¦ò‚0õ,0õè0õ4þ¦ò‚0óð0ô¬0óøþ¦ò‚0ò„0ó Ð0òŒþ¦ò‚0ñ0ò4Ð0ñ þ¦ò‚0ð 0ðÈ0ðþ¦ò‚0îp0ïŒÐ0îxþ¦ò‚0ìÔ0íØèè0ìÜþ¦ò‚0ç0ì<èÐèÄè0ê,ÐèÐèÄè0ç˜þ¦ò‚0æT0ç0æ\þ¦ò‚0å0åÔ0å þ¦ò‚0Ú¼0äxÐ0ãXèèÐ0âèèèèè0àX0ßÈèÐÐÄèôÄè0ÜÈè0ÛÀè0ÚÄþ¦ò‚0Ù0ÚTÐ0Ùþ¦ò‚0×T0Ø Ð0×\þ¦ò‚0Ô0ÖÌÐ0Õ¬èÄè0Ôþ¦ò‚0Ь0ÓxÐ0ÒXèÄè0дþ¦ò‚0ÏX0Ð,0Ï`þ¦ò‚0Î0ÎØ0Î þ¦ò‚0Ì 0ÍlÐ0Ì(þ¦ò‚0Ê<0ˈÐ0ÊDþ¦ò‚0Èp0ÉÔ0ÉDè0Èxþ¦ò‚0Çd0È 0Çlþ¦ò‚0ÃÐ0ÇÐÄÐè0Åèèèô0ÃØþ¦ò‚0£¸0Ã4ÐÜè0ÁœèèÐÐèÐèèèèèè0¾$èèèèè0¼t0»äèèÐèèÄèÐÐÜè0¸<ÄèÄè0¶0µ„èôÜèèôÄèô0³,èèèô0±¬èÐÜèèèÄèèèèè0®LÄèÜèèÜèÜÄÜèÄèèèôÄèô0¨Äèè0§¼èÄèèèè0¥¬èô0¤Œ0£Àþ¦ò‚0žD0£hÐÄèÐèè0¡0 PèèèôÄèô0žLþ¦ò‚0—˜0ôÄèèèÐèèèè0›<0š¬èèèôÄèôÜÐè0— þ¦ò‚0’<0—èèèèÄèèèèÄèèèèÄ0’Dþ¦ò‚0‘0‘¼0‘ þ¦ò‚0+60‘ò‚0+úþ³0`ˆ¦õ™üÎþø0iØ„0p˜—ü0q®–ð0¸ÐÜèÐÐèèèè0ŒˆèèÐÐèÐèèèèèè0‰èèèèè0‡`0†ÐèÐÐÜè0„ÀÄèÄè0‚˜0‚èôÜèèôÄèô0°èèèô0~0èÐèèèèÄèèèèè0zè0zXèèèôÄèô0xHèè0w@èÄèèèè0u0èô0t0s€èèèÜÜô0q²û¦Ö0p¨¦õ0qüð†üè†üð†üð†üÎþ0iä—ü0jú–ð0oüÐèÐèèèÜèÜèè0l´èèèèèè0jþû¦Ö0iô¦õ0jÜüð†üè†üð†üð†üÎþø0W¤„0[x—ü0\r–ð0ilè0h¬èèèè0g\ÐÐèÐÐ0dÔ0d,0cœÐèÐ0b0a\Äè0` è0_è0^DèèèÜÜô0\vû¦Ö0[ˆ¦õ0\Tüð†üè†üð†üÎþ0W°—ü0Xª–ð0[ ÜÜÜè0YD0X®û¦Ö0WÀ¦õ0XŒüð†üè†üð†üÎþø0J„„0V䈦õµüð†üð†üÎþ0MÜ‚—ü0NÚ–ð0VèèèèÄèÐÐ0S40RŒè0Q´è0PôèèèÜÄè0NÞû¦Ö0Mð¦õ0N¼üð†üè†üð†üÎþ0J—ü0KŠ–ð0MtÜÜÜè0KŽû¦Ö0J ¦õ0Klüð†üè†üð†üÎþø0IT„0Iüˆ¦õ™üïßþ0I`ˆ¦õ¡üç’Íþø0H$„0Ḧ¦õ™üïßþ0H0ˆ¦õ¡üç’Íþø0Fô„0Gœˆ¦õ™üïßþ0Gˆ¦õ¡üç’Íþøö†üö†ü0FD†¼þò„þÖ„Œò„øôö0E°†ˆ¦õ™üÎþø0E†ˆ¦õ§üð†üÎþø0CŒ„0D@ˆ¦õµüð†üð†üïßþ0C˜ˆ¦õ§üð†üïßþø0Aà„0B°ˆ¦õ0C|üð†üð†üð†üÎþ0A숦õµüð†üð†üïßþø0AL†ˆ¦õ™üÎþø0@œ†ˆ¦õ§üð†üÎþø0?|„0@ˆ¦õ™üïßþ0?ˆˆ¦õ™üïßþø0>\„0>ôˆ¦õ™üïßþ0>hˆ¦õ™üïßþø0=„0=¸ˆ¦õ§üð†üïßþ0=ˆ¦õ§üð†üïßþø0;¬„0<`ˆ¦õ§üð†üïßþ0;¸ˆ¦õ§üð†üïßþø0:ü†ˆ¦õ§üð†üÎþø0:h†ˆ¦õ™üÎþø09Ô†ˆ¦õ™üïßþø08`„09ˆ¦õµüð†üð†üÎþ08lˆ¦õ§üð†üÎþø07̆ˆ¦õ™üïßþø078†ˆ¦õ™üïßþø06„06°ˆ¦õ™üïßþ06$ˆ¦õ™üïßþø04ø„05ˆ¦õ™üïßþ05ˆ¦õ™üïßþø04d†ˆ¦õ™üïßþø03˜†ˆ¦õµüð†üð†üÎþø02膈¦õ§üð†üïßþø02T†ˆ¦õ™üÎþø0-´„01 ˆ¦õ§‹ñð†üÎþ00œ‚ˆ¦õ01l‹ñð†üð†üð†üÎþ0/È‚ˆ¦õµ‹ñð†üð†üÎþ0/ ‚ˆ¦õ§üð†üÎþ0.X‚ˆ¦õ§‹ñð†üÎþ0-Àˆ¦õ™‹ñÎþøà†ƒ‹þðà†ƒ‹þðð†ƒù膃ùà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðò†ƒùôüþÀò†ƒùôüþ0)À„šò„ò„ø0)"0)¬ò‚ò‚0(òþ³Œƒùôüþ/S\0'Öõ´¦õ™üïßþΦò‚0%¼0'8è0%Ä´¦õ§‹ñð†üïßþΦò‚0#€0%$èè0#ˆ´¦õ§üð†üïßþΦò‚0!X0#èè0!`´¦õµüð†üð†üïßþΦò‚0d0 ðèèÄè0l´¦õ0‹ñð†üð†üð†üïßþΦò‚0H0ÌÐèÐèè0Ôèè0P´¦õ§üð†üïßþΦò‚0 0œèèÐèÜèÜÜèÐèôÄÐèèôÜÐèÐèÐèÐèÄè0¤è0œ0´¦õµüð†üð†üÎþΦò‚0 ¨0 üÐèÐèèÜ0 °´¦õ§üð†üïßþΦò‚/ì0 ôèèÐèÜèÜÜÄÐèôÄÐèÐèÐèÐè0Lè0tè0´èÐèèÐè/ÿŒè/þ´/þ$è/ýLè/ûÌèèÐèÜèÜÜÄèèè/ø$èè/÷èèÐèÐèÜÜè/ôèÄèèÄèÐÜè/ðìèèôÄèôÐèèèèô/íÔè/ì´¦õµüð†üð†üÎþΦò‚/ê$/ë”è/ê,´¦õ™üïßþΦò‚/è4/é¤è/è<´¦õ™üïßþΦò‚/æD/ç´è/æL´¦õ™üïßþΦò‚/ãô/åôèÐè/ãü´¦õ™üïßþΦò‚/á„/ã¤èÐè/ጴ¦õ©üß•þÌþΦò‚/ßÄ/á4è/ßÌ´¦õ™üïßþΦò‚/Ýt/ßDÐè/Ý|´¦õ™üïßþΦò‚/×`/ÜÜèÐèÄè/ÚœÐèÐèÄè/×h´¦õ§üð†üÎþΦò‚/Ñ`/ÖÈèÐèÄè/Ô¸ÐèÐèÄè/Ñh´¦õµüð†üð†üÎþΦò‚/Ïp/Ðàè/Ïx´¦õ™üïßþΦò‚/Í€/Îðè/͈´¦õ™üÎþΦò‚/¾¬/Ì€èÐÜèÐèÜèÜÜÜè/ȨèôÄèôÄèèôÜÐèÐèÐèÐè/ØèèèèèÄè/ÁXè/ÀPè/¾´´¦õ§üð†üÎþΦò‚/¼(/¾DÐè/¼0´¦õ§üð†üïßþΦò‚/¹¤/»ÀÐè/¹¬´¦õ§üð†üïßþΦò‚/µP/¹Ðè/·ÌèÄèè/µX´¦õ§üð†üïßþΦò‚/°ü/´ÈÐè/³xèÄèè/±´¦õ§üð†üïßþΦò‚/®ô/°|è/®ü´¦õ™üïßþΦò‚/¬ì/®tè/¬ô´¦õ™üïßþΦò‚/ª/¬TèÐè/ª ´¦õ©üß•þÌþΦò‚/§/©lèÐè/§$´¦õ©üß•þÌþΦò‚/¤°/¦´/¦$è/¤¸´¦õ§üð†üÎþΦò‚/¡ˆ/¤HèÄèèÐè/¡´¦õ™üÎþΦò‚//¡8ÐèÄÐè/Ÿèèèô/´¦õµüð†üð†üïßþΦò‚/iÀ/œ èÐÜèÐèÜèÜÜÜè/˜LèèÐèÜèÜÜÄ/•4ÜèÐèÜèÜÜÜè/‘ìèôÄèôÄèèôÜÐèÐèÐèÐèÜè/ŒLÄèÄè/Š$è/‰dèèôÜèèèô/‡lèèèèè/…ŒÜèèè/„ ÜèÜèèèÐèÜèèÜèÜ/€4ÜèÐèÜèÜÜÜèèèôÄèèô/{TÜèÐèÜèÜÜÜèèèô/wÄèèÐèÜèÜÜÜèèèÄôÄèÄÜèÄèèèôÄèô/pDèèè/o èÄèèèèè/lÌèô/k¬/iÈ´¦õ/k ‹ñà†Žþðð†üð†üÎþΦò‚/b/ipÄèÄèèÐèÐèÐèè/e€/dÀèèèôÄèô/b´¦õ§üð†üïßþΦò‚/W¤/aÄÄèèèèÐèÐèÜÜèèèèô/]tèèèè/\$/[”èèèôÄèôÜÐè/W¬´¦õ/XÔüð†üð†üß•þÌþΦò‚/Uˆ/W<èè/U´¦õ§‹ñð†üÎþΦò‚/S /Uè/S¨´¦õ™‹ñÎþΦò‚/SRò‚×þïþ/R†­Ïìþ³Œƒùôüþ/DZ‘/Qœ†ÀކÀŽ†ØŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ/Dp/NŠ/O@èèÊ/LÐ/M¼èèèÖ/K4/L èèèÖ/J(/JäèèÖ/H¤/IÀèÐèÖ/D^òúþ³/G䈦õµüð†üð†üÎþøö†üÖ†œþꄉõö/F䆈¦õ™üÎþø/E|„/F@ˆ¦õ§üð†üïßþ/Eˆˆ¦õ«ð†üç’Íþø/D؆ˆ¦õ™‹ñÎþøð†ƒùò†ƒùôüþ/CÌþø/B<„/B䈦õ½ü膋ñð†üÎþ/BHˆ¦õ™‹ñÎþøò†ƒùôüþÈð†üÎþÚš/Äèèèô/À‚“¼.@Œ.@ôˆ–’.@d‚ˆ–’.@ ü–üà.?\.?àö.>Ô›‹Øþ.<‚“¼.=HŒ.>8ˆ–’.=¨‚ˆ–’.=dü–üà.< .=$ö.<›‹Øþ.9t‚“¼.:¸Œ.;|ˆ–’.;‚ˆ’Âü–üà.:.:”ö.9ˆ›‹Øþ.6ä‚“¼.8(Œ.8숖’.8ˆ‚ˆ’Âü–üà.7€.8ö.6ø›‹Øþ.4(‚“¼.5lŒ.6\ˆ–’.5Ì‚ˆ–’.5ˆü–üà.4Ä.5Hö.4<›‹Øþ.1l‚“¼.2°Œ.3 ˆ–’.3‚ˆ–’.2Ìü–üà.2.2Œö.1€›‹Øþ..°‚“¼./ôŒ.0䈖’.0T‚ˆ–’.0ü–üà./L./Ðö..Ä›‹Øþ.+ô‚“¼.-8Œ..(ˆ–’.-˜‚ˆ–’.-Tü–üà.,.-ö.,›‹Øþ.)8‚“¼.*|Œ.+lˆ–’.*Ü‚ˆ–’.*˜ü–üà.)Ô.*Xö.)L›‹Øþ.&|‚“¼.'ÀŒ.(°ˆ–’.( ‚ˆ–’.'Üü–üà.'.'œö.&›‹Øþ.#À‚“¼.%Œ.%ôˆ–’.%d‚ˆ–’.% ü–üà.$\.$àö.#Ô›‹Øþ.!0‚“¼."tŒ.#8ˆ–’."Ô‚ˆ’Âü–üà.!Ì."Pö.!D›‹Øþ.Ü‚“¼. Œ. Ôˆ’. p‚ˆ’.<ü–.’.ÌŠ˜.舖’.X‚ˆ–’.ü–üÊ.$.¨ö.ðþþ.X—ˆ‹..x.üö.ð›‹Øþ.x‚“¼.¼Œ.€ˆ’.‚ˆ’.Øü–.¢’.hŠ˜.”ˆ–’.‚ˆ–’.°ü–ü—.`.À.Dö.Œþþ.ô—ˆ‹.´..˜ö.Œ›‹Øþ.H“¼.Œ.,’.„øüøüøüøüøüøüôøüøüøü.à.xöö.X›‹ØþømH.,ümD.†üüò„†üüm@.Ô“®. äŽ. àþ––˜.$þ–’. `–˜þ–˜þ˜¦Üü–üêêêêêê. üþ˜. þ–’. $˜þ–’. Ü. P¸.ä›ãþøm8.@ˆ›™ëŠÕþø-út†ƒ.(þ-úš.-ú–þŸ.ƒù-ý „.Tˆ¦õ§ì†Êþ.¬‚“.^.0.’.,.Ü.(ø.°.`þ–.¬––’êêê..„.ø¢˜. ˆ’êÊ‚ˆ’Âü–üêêÞ.X.àþøþ.À¦õ§üð†üÎþ-ý¬“-þZ-ÿ,.`’-ÿ(.8-ÿ$ø.¼.lþ––þþ.¸––’êêê-ÿ.-ÿ ø¢˜.,ˆ’ꂈ’—-ÿtü–üêêÞ-þT-þÜþøþ-ý¼¦õ§üð†üÎþø-ý †ˆ¦õ™Êþø-üL†ˆ¦õ¯ì†ã’Íþø-ûœ†—ñ¦õ“†Êþø-ú܆—ñ¦õ“†‹-úôþøôüþÞm4-úhƒùm,-ùȈ›ŸìØþøm(-ù¬†üüm -ù”ƒùm-øØˆ›™†ì†Òþølø-øÈülì-ílˆ›Ÿ‹úþŸ-ø°ƒùꆄ‚ö-õü†„„‘úþŸ-øT„„þö䆄„þö䆄„þö䆄„þö䆄„þö䆈þö-öt†ˆ¦õ·ä†‹Ø’Íþøôüþàö-óü†„„‘úþŸ-õÔ„„þö䆄„þöꆄ‚öꆆö-ôt†ˆ¦õ·ä†‹Ø’Íþøôüþàöꆄ‚öꆄ‚öꆄ‚öà†„„þöà†„„þöꆄ‚öꆄ„þöꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚ö-ñ†„„‰ˆ»ìò†ìâöꆄ„þö-ð†„„‰ˆ»ì†ì†ìâöƆ„„‰ˆíöÔ†„„‰õöꆈþö-î`†ˆ¦õ·ä†‹Ø’ÍþøôüþĆÒþøö†ülè-í@†üülÜ-ë“®-ì Š˜¦ˆ–’-ìhü–üÊ-댸-ë ›ãþøò†ƒùlØ-èÄ“®-éÔŠ˜¦ˆ–’-êü–üÊ-é@¸-èÔ›ãþølÄ-æ “®-犘-è0ˆ–’-çdü–ºþþÆ—ˆ-ç-戸-æ›ãþøl¼-å„·þ΄ü”„þò„þôô÷l´-äȈ›™ò†Òþøð†ül°-Õ -àœ“®-ᬌ-äDˆ’-áÈü–-âv’-ã(Š˜¦ˆ–’-ãpü–üÊ-┸-â`þþÆ—ˆÁ-á¸-ଛãþ-ÞÄ‚“®-ߨŒ¦ˆ’Âü–üà-ßD¸-ÞØ›ãþ-Ú8‚“®-ÛLŒ-Þhˆ’-Ûhü–-Ü’-ÜÈŠ˜-Ý܈–’-Ýü–ºþþÆ—ˆ-ÜÀ-Ü4¸-ÜþþÆ—ˆÁ-Ú¸¸-ÚL›ãþ-×à‚“®-ØôŒ-Ù܈’-Ùü–ºþþÆ—ˆÁ-Ø`¸-×ô›ãþ-Õˆ‚“®-ÖœŒ-ׄˆ’-Ö¸ü–ºþþÆ—ˆÁ-Ö¸-Õœ›ãþ-Õˆ›ãþø-Í$†“®-Î@Š˜-Ô|ˆ–’-Έü–-Ï6’-Ф-Ô,’-Мøüøüøüøüøüøüøü-ÏT-ÏØö-Ï þþÆ—ˆ-Î8-ͬ¸-Í@›ãþøl¨-̈›‹†Òþøò†ƒùl¤-Êp“®-Ë€Œ¦ˆ–’-Ëœü–üà-Êì¸-Ê€›ãþøl-©4-ÇØ“¼-ÉŒ-ʈ’-Éx‚ˆ–’-É4ü–üà-Èp-Èôö-Ç蛋Øþ-ÅD‚“¼-ƈŒ-Çxˆ’-Æè‚ˆ–’-Ƥü–üà-Åà-Ædö-ÅX›‹Øþ-´‚“¼-ÃøŒ-Ä舒-ÄX‚ˆ–’-Äü–üà-ÃP-ÃÔö-ÂÈ›‹Øþ-À$‚“¼-ÁhŒ-ÂXˆ’-ÁÈ‚ˆ–’-Á„ü–üà-ÀÀ-ÁDö-À8›‹Øþ-½”‚“¼-¾ØŒ-¿Èˆ’-¿8‚ˆ–’-¾ôü–üà-¾0-¾´ö-½¨›‹Øþ-»‚“¼-¼HŒ-½8ˆ’-¼¨‚ˆ–’-¼dü–üà-» -¼$ö-»›‹Øþ-µÜ‚“¼-· Œ-º¨ˆ’-ºD‚ˆ’-·<ü–-¸’-¸ÌŠ˜-¹èˆ’-¹X‚ˆ–’-¹ü–üÊ-¸$-¸¨ö-·ðþþ-·X—ˆ‹-·-¶x-¶üö-µð›‹Øþ-°¤‚“¼-±èŒ-µ€ˆ’-µ‚ˆ’-²ü–-²Î’-³”Š˜-´Àˆ’-´0‚ˆ–’-³Üü–ü—-³Œ-²ì-³pö-²¸þþ-² —ˆ‹-±à-±@-±Äö-°¸›‹Øþ-©8“¼-ªxŒ-°ˆ–’-¯¸‚ˆ’-ª”ü–-«^’-¬œ-¯l’-¬”øüøüøüøüøü-«|-¬ö-«Hþþ-ª°—ˆ‹-ªp-©Ð-ªTö-©H›‹ØþølŒ-© ƒùlˆ-©ƒùl|-œP“®-`Œ-¨tˆ–’-|ü–-ž*’- œ-¨$’- ”øüøüøüøüøüôøüôøüøüøüøüøüøüøüøüøü-žH-žàöö-žþþÆ—ˆÁ-œÌ¸-œ`›ãþølp-–(“®-—8Ž-™4þ––˜-›xþ–’-™´–˜þ–˜þ˜¦Üü–üêêêêêê-—Pþ˜-˜Xþ–’-—x˜þ–’-—0-–¤¸-–8›ãþø-^8„-” “®-•0Œ¦ˆ–’-•Lü–üà-”œ¸-”0›ãþ-’‚“®-“0Œ¦ˆ–’-“Lü–üà-’œ¸-’0›ãþ-‚“®-‘0Œ¦ˆ–’-‘Lü–üà-œ¸-0›ãþ-Ž‚“®-0Œ¦ˆ–’-Lü–üà-Žœ¸-Ž0›ãþ-Œ‚“®-0Œ¦ˆ–’-Lü–üà-Œœ¸-Œ0›ãþ-Š‚“®-‹0Œ¦ˆ–’-‹Lü–üà-Šœ¸-Š0›ãþ-†‚“®-‡(Œ-‰Àˆ’-‡Dü–-‡ò’-ˆ¤Š˜¦ˆ–’-ˆìü–üÊ-ˆ¸-‡ÜþþÆ—ˆÁ-†”¸-†(›ãþ-ü‚“®-ƒŒ-…¸ˆ’-ƒ,ü–-ƒÚ’-„ŒŠ˜®ˆ–’-„Ôü–ü—-„„-ƒø¸-ƒÄþþÆ—ˆÁ-‚|¸-‚›ãþ-^D“®-_ü-°’-_ôøüøüøüôø-\–––üê-_|ø-`Äþ–˜þ-}ø-~È-}üü–ºþÄ—ˆ„Ç-a—úþŸ-}܃ùꆄ„þöꆄ‚öꆄ‚öꆄ„þöꆄ„þöꆄ„þöꆄ„þö-yð†„„‘úþŸ-|¬ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö-zh†ˆ¦õ·ä†‹Ø’Íþøôüþàöà†„„þöà†„„þö-tH†„„‰úþŸ-ylƒùꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö-tІˆ¦õ·ä†‹Ø’ÍþøôüþØöꆄ„þö-b¼†„„‘úþŸ-tƒùↄ„‰õöà†„„þö-q˜†„„‰úþŸ-sˆƒùà†„„þöꆄ„þöꆈþö-r †ˆ¦õ·ä†‹Ø’ÍþøôüÖö-m¸†„„‰úþŸ-qŒƒùà†„„þöꆄ„þöꆄ„þöꆄ„þöↄ„þöꆄ„þöꆄ„þö-oœ†„„‰ˆ™†ì†Üö-o†ˆ‰ˆ‹†Üö-n@†ˆ¦õ·ä†‹Ø’ÍþøôüÖö-hĆ„„‰úþŸ-m¬ƒùà†„„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆆö-iL†ˆ¦õ·ä†‹Ø’ÍþøôüÖö-f †„„‰úþŸ-h¸ƒùà†„„þöꆄ„þöꆄ„þöꆈþö-g(†ˆ¦õ·ä†‹Ø’ÍþøôüÖö-d†ˆ‰úþŸ-f”ƒùà†„„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆄ„þöꆈþö-dŒ†ˆ¦õ·ä†‹Ø’ÍþøôüÖö-c4†ˆ¦õ·ä†‹Ø’ÍþøôüÞöÔ†ˆ‰õö-a˜†ˆ¦õ·ä†‹Ø’Íþøôü-_dø-`þ–’-_L-^À¸-^T›ãþøld-Il-\,“®-]<Œ¦ˆ–’-]Xü–üà-\¨¸-\<›ãþ-Z‚“®-[,Œ¦ˆ–’-[Hü–üà-Z˜¸-Z,›ãþ-X‚“®-Y,Œ¦ˆ–’-YHü–üà-X˜¸-X,›ãþ-V‚“®-WŒ¦ˆ–’-W8ü–üà-Vˆ¸-V›ãþ-T‚“®-UŒ¦ˆ–’-U8ü–üà-Tˆ¸-T›ãþ-R‚“®-SŒ¦ˆ–’-S8ü–üà-Rˆ¸-R›ãþ-N‚“®-OŒ-Q¬ˆ’-O0ü–-OÞ’-PŠ˜¦ˆ–’-PØü–üÊ-Oü¸-OÈþþÆ—ˆÁ-N€¸-N›ãþ-Iè‚“®-JüŒ-M¤ˆ’-Kü–-KÆ’-LxŠ˜®ˆ–’-LÀü–ü—-Lp-Kä¸-K°þþÆ—ˆÁ-Jh¸-Iü›ãþ-Ipˆ›ãþøl@-H´ˆ›™†ì†Òþøl-G܈›»ì†ìò†Òþø-Eœ†“®-F¸Š˜¦ˆ–’-Gü–üÊ-F$¸-E¸›ãþøl-DЈ›»ì†ìò†Òþøê„Žú‚ú‚üül-B “®-C°Š˜¦ˆ’êØü–üÊ-Cºþ-B°›‘Òþøl -A䈛™†ì†Òþøl-AÔü-5<†“®-6XŠ˜-A@ˆ–’-6 ü–-7N’-9”-@ð’-9Œøüøüøüøüøüôøüôøüøüøüøüøüøüøüøü-7l-7ðö-78þþÆ—ˆ-6P-5ĸ-5X›ãþø,ð†ƒ-50þ,ðB-5,ð>þŸ-5 ƒù,óH„-4\ˆ¦õ§ì†Êþ-/¤‚“-0V-1(-4 ’-1$-3ä-1 ø-2¸-3hþ–-2´––’êêê-1 -2Œ-1ø¢˜-2(ˆ’êÊ‚ˆ’-1pü–ü—ÓêÞ-0P-0Øþøþ-/¸¦õ§üð†üÎþ,óT“,ô,ôÔ-/X’,ôÐ-/0,ôÌø--´-.dþ––þþ--°––’êêê,ô¸--ˆ,ô´ø¢-,X--$ˆ’ꂈ’—-,\ü–ü—Ó,ôà¡-,<þ,õü-,(,õþŸ-,ƒù-ä„-+hˆ¦õ§ì†Êþ-% ‚“-%Ò-&¼-+’-&¸-*ðê„-&´ø-)˜-*Hˆš—Ë—-)Œ‚Šþ–’êêÐü–ü—Óê-& -(Ü-&œø-'°-(`þ–-'¬––’êêê-&ˆ-'„-&„ø°¦ˆ’Âü–üêÒ-%Ì-&Tþøþ-%4¦õ§üð†üÎþ-ð“-ž- ˆ-$Ô’- „-$¬ê„- €ø-"à˜-$$ˆ’ê-#h‚Šþ–’êêÐü–ü—Óê- l-"¸- hø-!Œ-"<þ–-!ˆ––’êêê- T-!`- Pø°®ˆ’- ¤ü–ü—ÓÒ-˜- þøþ-¦õ§üð†üÎþø-d†“¼-œŒ®Šþž’—Óâ—-¸ü–ü—Óö-ºþ-€¦÷þ™üïßþøê†ˆþö,÷ˆ†“¶,øü-ð’,øä- \-ˆˆ’- `ü–ü—“÷þ™‹’-lþ- þŸ-\ƒù-`„-H“--¼-’-´ø˜-„þ–-Ж–’êêêê-ü-„þøþ-X¦÷þ§üð†üÎþ-l“¼-°-ø’-¨ø˜-xþ–-Ä––’êêêê-ºþ-|¦÷þ™üÎþø-h†“->-àŠš—Ë—ß-8-Àþøþ-„¦÷þ¯üð†üç’Íþø-x†“’-t-’-lø˜-Lþ––þþ-ˆ––’—Óêêê-Ⱥþ-”þþø-¼†“¼-ôŠ¥ñþèö-`ºþ-ئ÷þ™üïßþø- †—ñ¦õ“†Êþø- \†—ñ¦õ“†ÊþøôüþÔ,øÌ,ú¨- ˜Šþ–’êê,ú¬ü–ü—“õ™‹úþŸ- ˆƒù-@„- ؈¦õ§ì†Êþ- ,‚ˆ¦õ§ì†Êþ-L“-ú-Ì- à’-È- ¸-Äø-|- Tˆ’ê-d‚ˆ˜¦ˆ’êØü–üêê-€ü–-4þþ-œ—ˆŸì†óÇ-°-P-¬ø¢˜-ÌŠ-°Šþ–˜þ˜¦ˆ’êØü–ü-äü–ºþÄ—ˆËÊ‚ˆ’êÐü–ü—ÓêÞ-ô-|þøþ-\¦õ§ì†Êþø-$†“¶-PŒ®ˆ’—ˆËÐü–ü—Óö-¼ºþ-@¦õ™ëßþøê†ˆþö,ýȆ“’,þÄ,ÿ°’,þ¬˜®ˆ’—ÓÐü–ü—,þºþ,ýäþþø,ý†ˆ¦õ¯ì†ã’Íþø,üX†ˆ¦õ“†Êþø,û¨†ˆ¦õ“†Êþøôüþ,ø´°,ùÔþ––þþ,ù––’—Óêê,ø ºþ,÷¤¦õ™Êþø,öȆˆ¦õ¯ì†ã’Íþø,ö†—ñ¦õ“†Êþø,õX†—ñ¦õ“†‹,õpþøôüþ,ôœ,óü,ô„þøþ,ód¦õ§üð†üÎþø,ò´†ˆ¦õ™Êþø,ñô†ˆ¦õ¯ì†ã’Íþø,ñD†—ñ¦õ“†Êþø,ð„†—ñ¦õ“†‹,ðœþøôüþÞl,ðükø,稓®,踊˜,ï°ˆ’ê,éü–,é®’,ëL,ï`’,ëDøüøüôøüøüøüøüøüøü,éÌ,êPøþ,é˜þþÆ—ˆ‘,è°,è$ºþ,縛‘Òþøkð{ø—ü,åR–,çüõ›«‹ñ݆øÔþ,å^,æ|Üè,åVû¦,âú–,ä¶üõ›«‹ñ݆øÔþ,ã,ä$Üè,âþû¦,ß6–,áÊüõ›,⼋ñ膋ñ,áꘌþŠþІøÐ„øÔþ,ßB,á èèÜÜè,ß:û²ò‚,Ûr–,Þüõ›,Þø‹ñ膋ñ,Þ&˜ŒþŠþІøÐ„øÔþ,Û~,Ý\èèÜÜè,Ûvû²ò‚,Øv–,Úzüõ›½‹ˆ‘óåË˜ê„øÔþ,Ø‚,ÙèÜèè,Øzû²ò‚,Ôò–,×>üõ›,×ô‹ˆŸì†óå,×^ªê„ê„øÔþ,Ôþ,Ö¬Üèèè,Ôöû¾ò‚ò‚,ÑÖ–,ÓÚüõ›½þŠŸì†óãË˜ê„øÔþ,Ñâ,ÓHÜèè,ÑÚû²ò‚,Î2–,Ð~üõ›,Ñ4þŠ­ì†ì†óã,Оªê„ê„øÔþ,Î>,ÏìÜèèè,Î6û¾ò‚ò‚,Ë–,Íüõ›½þŠŸì†óãË˜ê„øÔþ,Ë",̈Üèè,Ëû²ò‚,Çr–,ɾüõ›,ÊtþŠ­ì†ì†óã,ÉÞªê„ê„øÔþ,Ç~,É,Üèèè,Çvû¾ò‚ò‚,ÄV–,ÆZüõ›½þŠŸì†óãË˜ê„øÔþ,Äb,ÅÈÜèè,ÄZû²ò‚,À²–,Âþüõ›,ôþŠ­ì†ì†óã,êê„ê„øÔþ,À¾,ÂlÜèèè,À¶û¾ò‚ò‚,½––,¿šüõ›½þŠŸì†óãË˜ê„øÔþ,½¢,¿Üèè,½šû²ò‚,¹ò–,¼>üõ›,¼ôþŠ­ì†ì†óã,¼^ªê„ê„øÔþ,¹þ,»¬Üèèè,¹öû¾ò‚ò‚,¶N–,¹Büõ›½üð†üè†üïßþ,¶Z,¸ÈÄÜÜÜè,¶Rû²ò‚,²‚–,µŽüõ›µ‹ñð†üð†üïßþ,²Ž,µÐÄèÄè,²†û²ò‚,®Þ–,±Òüõ›µüð†üð†üïßþ,®ê,±XÐÄÜÜè,®âû²ò‚,ª–,®.üõ›µüð†üè†üÖþ,ª&,¬ÜÜ,«ÔÜÜè,ªû²ò‚,¤ú–,©>üõ›,©ìüè†üð†üè†üÖþ,¥,§ìÜÜ,¦ÌÜÜè,¤þû¾ò‚ò‚,˜"–,¤.üõ›,¤Üüè†üð†üð†üïßþ,˜.,£´ÐÄèÜèè,¡tÜÜè,ŸÜèèèÐèôÜÐè,<èèèÜôÜèÐ,šä,šTèèèÜôÜè,˜&û²ò‚,‰&–,—*üõ›,—ôüð†üè†üð†üð†üïßþ,‰2,–°ÐÄèèÜÐÜèèÐèÜè,’ÜÜè,øèèèÐèôÜÐè,ŽXèèèÜôÜèÐ,Œ,‹pèèèÜôÜè,‰*û¾ò‚ò‚,~¢–,ˆ>üõ›,‰üð†üè†üð†üð†üïßþ,~®,‡Ä,‡è,†Dè,…„èèèÜèèèÜÜ,‚TèÄèôÐèèèÜèèèÜ,~¦û²ò‚,q6–,}ºüõ›,~„üð†üè†üð†üð†üïßþ,qB,}@ÐÄèèèè,{Äèèèè,yPÜèÜÜèè,wXèôÜ,v8èè,uHèèèÜôÜèÄèèèÜôÜè,q:û²ò‚,læ–,pjüõ›,qüè†üð†üð†üïßþ,lò,o¨èèèèèÐôÜè,lêû²ò‚,_~–,kÒüõ›,lÈüè†üð†üè†üð†üð†üïßþ,_Š,kX,j˜è,iØè,ièèèèÐÜèèÐèèèÜÜ,d˜èÄèôÐèèèèÐÜèèÐèèèÜ,_‚û¾ò‚ò‚,NV–,^jüõ›,_`üè†üð†üè†üð†üð†üïßþ,Nb,]ðÐÄèèèÜÜèèÐèèè,ZÄèèèÐÜèèÐèèè,VˆÜèÜÜèè,TèôÜ,Spèè,R€èèèÜôÜèÄèèèÜôÜè,NZû¾ò‚ò‚,HÒ–,M^üõ›,N(üð†üè†üð†üð†üïßþ,HÞ,LœèèèèèÐèèèÐôÜè,HÖû¾ò‚ò‚,Bº–,Hüõ›,H´üè†üð†üð†üïßþ,BÆ,GŒ,FüÐÜ,EÄÜèèèô,D,Üè,B¾û²ò‚,<–,AÂüõ›,BŒüð†üè†üð†üð†üïßþ,<",AH,@¸ÄÜÜÄÜèèèô,= Üè,<û¾ò‚ò‚,5†–,;’üõ›§üð†üïßþ,5’,;,:XèÜÐÜ,8xÜèè,7@èôÄè,5Šû¦,.j–,4Öüõ›µüð†üð†üïßþ,.v,4\,3œèÜÄÜÜ,1tÜèè,0<èôÄè,.nû²ò‚,(ê–,-vüõ›,.,‹ñð†üð†üÕþІøÌþ,(ö,,üÐÐè,+|Üè,*DôÜè,(îû²ò‚,#b–,(üõ›,(¼üð†üð†üÕþІøÌþ,#n,'ŒÐÄÜÄÜè,$¼ôÜè,#fû²ò‚,Ž–,"züõ›,#Düð†üð†üË˜ê„øÔþ,š,!èèÜèè, PÜ,HÜÜè,’û²ò‚,^–,züõ›,`üð†üð†üð†üË˜ê„øÔþ,j,èèÜèè,PÜÜ,0ÜÜè,bû¾ò‚ò‚, f–,rüõ›, ‹ñè†üð†üð†üïßþ, r,ø,hèÜÜÐÄè,àÜÜÜèÐôÄèôÄÜÜè,ØÐè,  èèèÐÐôÜ, `, jû¾ò‚ò‚+ý–, Nüõ›, 8üà†‹ñè†üð†üð†üïßþ+ý,Ô,DèÜÜÐÄèÜ,¤ÜÜÜèÐôÄèôÄÜÜè,œÐè,dèèèÐÐôÜ+þ$+ýû+ý ò‚ò‚ò‚+ú–+ü~üõ›¯üð†üçŠÕþ+úÎ+üèèè+úÆû¦+÷æ–+úüõ›½üð†üð†üçŠÕþ+÷ò+ùˆèÜèè+÷êû²ò‚+õ––+÷Rüõ›¯üð†üçŠÕþ+õ¢+öØèèè+õšû¦+òº–+ôÖüõ›½üð†üð†üçŠÕþ+òÆ+ô\èÜèè+ò¾û²ò‚+íJ–+ò6üõ›§üð†üïßþ+íV+ñ¼ÐèÜÜ+ð Üèè+îÔèÄèô+íNû¦+çN–+ìšüõ›µüð†üð†üïßþ+çZ+ì ÐèÐÜÜÄÜèè+èðèÄèô+çRû²ò‚+áÞ–+æÊüõ›§üð†üïßþ+áê+æPÐèÜÜ+ä Üèè+ãhèÄèô+áâû¦+Ûâ–+á.üõ›µüð†üð†üïßþ+Ûî+à´ÐèÐÜÜÄÜèè+Ý„èÄèô+Ûæû²ò‚+Ô’–+Ûüõ›+ÛÄüè†üð†üè†üÖþ+Ôž+Ú„è+ØìÜ+×´Ü+Ö¬ÜÜèèè+Ô–û²ò‚+Ìn–+Óšüõ›+Ôdüð†üè†üð†üè†üÖþ+Ìz+Óè+ÑXÜÜ+ÏØÜÜ+ΠÜÜèèè+Ìrû¾ò‚ò‚+È‚–+˾üõ›½üð†üè†üïßþ+ÈŽ+ËDÐÜÐÜÜè+Ȇû²ò‚+ņ–+ÇÒüõ›½üð†üð†üçŠÕþ+Å’+Ç@èèèÜè+ÅŠû¦+Á:–+ÄÖüõ›½üð†üð†üçŠÕþ+ÁF+ÄDÜÐÄÐÐÜè+Á>û¦+»¶–+¿šüõ›+ÀäŽò„øðÔ†Žò„øð̆Žò„øðË˜ê„øÔþ+»Â+¾ÀèÐèÐèèÜèè+»ºû¾ò‚ò‚+·²–+ºvüõ›+»˜üÔ†Žò„øðÄ†Ž˜ê„øðçŠÕþ+·¾+¹äÐèÐèè+·¶û¾ò‚ò‚+³N–+¶rüõ›+·\Žò„øðð†üà†‹ñË˜ê„øÔþ+³Z+µ˜èèèèÜèè+³Rû¾ò‚ò‚+¯Ú–+²žüõ›½üð†üè†üïßþ+¯æ+²$ÐÐÄè+¯Þû²ò‚+¬Þ–+¯*üõ›½üð†üð†üçŠÕþ+¬ê+®˜èèèÜè+¬âû¦+¨’–+¬.üõ›½üð†üð†üçŠÕþ+¨ž+«œÜÐÄÐÐÜè+¨–û¦+¦"–+¨üõ›§üè†üÖþ+¦.+§|èèèè+¦&û¦+£º–+¥Žüõ›§üè†üÖþ+£Æ+¤üÜÜ+£¾û²ò‚+Ÿn–+£ üõ›½üð†üè†üïßþ+Ÿz+¢ÄèèèÐÜÜè+Ÿrû²ò‚+šö–+ž’üõ›+Ÿ@üð†üð†üè†üïßþ+›+žÄÜèÐÜÜè+šúû¾ò‚ò‚+•ª–+™îüõ›+šÈüð†üè†üð†üè†üïßþ+•¶+™tÄÜÜèÐÜÜÜè+•®û+–8ò‚ò‚ò‚+‘’–+”Îüõ›+•Œüà†‹ñð†üè†üÖþ+‘ž+”TèÐè+“Üè+‘–û²ò‚+:–+¦üõ›+‘T‹ñè†üð†üè†üÖþ+F+,èÄÜÄÜè+>û¾ò‚ò‚+ˆ6–+Œ2üõ›+üà†‹ñð†üð†üè†üïßþ+ˆB+‹¸ÐÜèèÜÐÜÜè+ˆ:û¾ò‚ò‚+‚ò–+‡üõ›+‡ø‹ñè†üð†üð†üè†üïßþ+‚þ+†¤ÐÜÜÜèÐÜÜè+‚öû+ƒ€ò‚ò‚ò‚+F–+‚"üõ›½‹ñè†üè†üÖþ+R+¨èÐÜÄ+Jû¾ò‚ò‚+{Ò–+~füõ›+‹ñè†üà†‹ñÖþ+{Þ+}ÔèèèÜèè+{Öû¾ò‚ò‚’Ê–•.üõ›+{”‹ñè†ü•\†Ž+{@ê„•€›‘+z؆؎ގގގގގގގގގގގގގގގގގގގގ•Ì+w.õ+vL·+vT+u «Ê+t”«Ê+rÈ+t\+s<ôÖ+q¼«Ê+oð+q„+pdôÖ+nÌ·èÖ+m+n”+nÊ+lT+m@+l\+k0+l+k8+iô+jø+jhÊ+iH«Ê+hl·èÖ+g·èÖ•Èý+g|ò‚•žúþ³+gDˆþö+f¤†ˆ¦õ™üïßþø+eô†ˆ¦õ§üð†üïßþø+eD†ˆ¦õ§üð†üïßþø+d”†ˆ¦õ§üð†üïßþø+c䆈¦õ§üð†üïßþø+c4†ˆ¦õ§üð†üïßþø+aø„+bˆ¦õ£ð†üïßþ+bˆ¦õ™üïßþø+`¬„+aTˆ¦õ£ð†üïßþ+`¸ˆ¦õ¡üç’Íþø+`†ˆ¦õ™üïßþø+_„†ˆ¦õ™üïßþø+]\„+^´ˆ¦õ½ü膋ñð†üÎþ+]ø‚ˆ¦õ§‹ñð†üÎþö‚+]hˆ¦õ™üÎþøÖ†ƒ‹þІøèÖ†ƒ‹þІøèÖ†ƒ‹þІøèÖ†ƒ‹þІøè–†ƒ‹þŠ+\–LŸ"‘+[ìÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽŸ8+Wâ+ZèèèÄÜèÜèÖ+VX+Wtèèè+V`+U”ŸÖŸ.+U€Ÿ úþ³+T؈¦õ§ì†ëßþøö†üö†üÒ†žò„þò„þö+S´†ˆ¦÷þ™üÎþø+S †ˆ¦õ™üÎþø+QP„+Rlˆ¦õ§‹á†Êþ+Q\ˆ¦õ+RH‹ñð†ü膋ñ膋ñÎþøà†ƒ‹þðà†ƒ‹þð膃ùò†ƒùŸXüþ¯t+Pˆƒù¯`+Ppƒù®p+PXƒù­ì+P@ƒù­€+P(ƒù­<+Pƒù¬ü+Oøƒù¬È+Oàƒù¬À+Oȃù¬¤+O°ƒù¬t+O˜ƒù¬P+O€ƒù¬H+Ohƒù¬,+OPƒù¬(+O8ƒù¬+O ƒù«ô+OƒùªÜ+NðƒùªÀ+N؃ùª¸+NÀƒùª|+N¨ƒùªp+NƒùªX+Nxƒù©¤+N`ƒù©D+NHƒù¨ø+N0ƒù¨˜+N†üü¨P+Nƒù§”+Mèƒù§d+MЃù§0+M¸ƒù§ +M ƒù¦ô+Mˆƒù¦ð+Mpƒù¥ˆ+MXƒù¥p+M@ƒù¤È+M(ƒù¤´+Mƒù¤°+Løƒù¤œ+Làƒù£+Lȃù¢ +L°ƒù¢Œ+L˜ƒù¢ˆ+L€ƒù¢@+Lhƒù¢ +LPƒù¢+L8ƒù¢+L ƒù¡¸+Lƒù¡\+Kðƒù¡$+K؃ù¡+KÀƒù €+K¨ƒù 0+Kƒù +Kxƒù +K`ƒùŸì¯˜ƒš‘+KH¯Þ+K¯®þ³˜ƒ‹þŠ+JÄŒþІø°hß~‘+J°ÞŽÞŽÞŽÞŽÞŽÞŽÞŽß”+H¾«Ê+GÄ«Ê+Fè«Ê+F «Ê+E0«Ê+DT«Ê+Cx«Ê+Bœ«Êß+1 üìþ«+AĈ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þø+>´†“®½ü+>Ц÷áþø+=x†“®½ü+=”¦÷áþø+<<†“®½ü+êŠ*Aàò*>öüìþ«*@숦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ*;ŽŠ*>„ò*;šüìþ«*=ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ*82Š*;(ò*8>üìþ«*:4ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ*4ÖŠ*7Ìò*4âüìþ«*6؈¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ýò†ƒùôüþ-²Š*4pò-¾üìþ«*3|ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›ÝÔ††þ›ÝÔ††þ›ÝÔ††þ›Ý.††þ›‰þ¦*2üö†üö†üö†üö†üò†ƒù. ²*1PŒþ’âÀŽŒþþ*0DŒþ’âÀŽŒþþ*.˜ªþ˜þ–’òþ*.´Šþ*-„ªª–ü–ÀŠþ.ü«*-˜ê„ø0à„*,Üò„0ä¬*+ÄŒþ’Š*,˜’òþ*, ˜þ’*+ÀÞŽ**`Œþ’Š*+T’òþ**Șþ’**|ÞŽ*),Œþ˜þ–’òþÆ3 Œþ˜ª–”þ›‰þ¦*(üüò†ƒù4°[Š‘*(ÌÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ[ *%z*&Hèè*%dþ¦ò‚*$ *$Üè*$(þ¦ò‚* ,*#(*"˜èÜèèèèÐ* 4þ¦ò‚*õþ¦ò‚*äõþ¦ò‚*Àõþ¦ò‚*ô*(*üþ¦ò‚[–*´Œ†øòò‚[rü*€[fþ³*`ˆþö*´†ˆ¦÷þ™üÎþø*x„*ˆ¦õ£ð†üïßþ*„ˆ¦õ™üïßþø*䆈¦õ™üïßþø*†ˆ¦õ¯üð†üç’Íþø*t„*Tˆ¦÷þ§‹ñð†üÎþ*€ˆ¦÷þ¯‹ñ膋ñÎþøÔ†ƒ‹ò„øð\D†ƒ‹*ò„\hôª‘*ìÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽôÀ*Rõþš*(*ä*0þš**Ø*$þš* x*lÐ*d* €þš* ¬* * ´þš* ˜* D* ´Üè*  þš*œ* 0èè*¤þš*H*Ü*Pþšô¼ý*4ô†þ³*,üö†üö†üö†üö†üò„†üüò„†üüö†ƒ)Ì~‘*¤ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ)Ì”)þ**èè*ðÄ)ÿ(Ðè)þþ¦ò‚)ú)ý¤)üä)ü<èèÐèè)ú˜þ¦ò‚)öü)úÄèè)øx)÷Ð)÷þ¦ò‚)ï)õì)õ,ÄèèÜèèÄÄèè)ñœ)ðô)ðLèè)ï þ¦ò‚)î )îÈ)îþ¦ò‚)í)í¼)íþ¦ò‚)ëÜ)ì°)ëäþ¦ò‚)ê¸)ëŒ)êÀþ¦ò‚)é¬)êh)é´þ¦ò‚)çP)é,)è$)çXþ¦ò‚)Ì)Øf)âô£ü¾‘)ç0ÞŽ)ãÄ)æ.)æ´)æ)ãÀý)åü)ãŠþ³)ä܃š‘)åì)å")å¼)åìþ³˜ƒ‹†øðò†ƒùôüþÊ)䆈¦÷þ™‹ñÎþøò†ƒùôüþ)ã þ«ŒƒùôüþÈ)Ø^òúþ«)â4ˆ¦õ“†Êþø)áx†ˆ¦õ“†Êþø)ß`†“)à)à Š––š—Ë—Óêö)à ºþ)ß|ª÷þ™üïÛþ›Ý)Þ¸†ˆª÷þ™üÊþ›Ý)Ýp„)Þˆª÷þ™üïÛþ›)Ý|ˆª÷þ™üïÛþ›Ý)Ü(„)ÜÔˆª÷þ™üïÛþ›)Ü4ˆª÷þ™üïÛþ›Ý)Ûd†ˆª÷þ§üð†üïÛþ›Ý)Ú¼†ˆª÷þ™üïÛþ›Ý)Øü„)Ùôˆª÷þ§‹ñð†üïÛþ›)Ùˆªõ¯þþ膋ñïÛþ›Ýö†üÞ†”þò„þöò†ƒùôüþ)ÌŠ)Ô`Œ)Ø )Ôt›‘)Ø ÞŽ)ÔÀ)×:«Ê)Ô¶)×)Ô†þ³)ÕØƒš‘)Öø)Ö)ÖÈ)Öìþ³˜ƒ‹†øðò†ƒùôüþÊ)Õ †ˆ¦÷þ™‹ñÎþøò†ƒùôüþÂò‚)Ìfúþ³)Ô8üÞ†”þò„þö)ÓL†ˆ¦÷þ™üÎþø)Ò¬†ˆ¦÷þ™üïßþø)Ñd„)Òˆ¦÷þ™üïßþ)Ñpˆ¦÷þ¡üç’Íþø)Ð „)ÐЈ¦÷þ™üïßþ)Ј¦÷þ©üß’Íþø)ÏP†ˆ¦÷þ§üð†üïßþø)ΰ†ˆ¦÷þ™üÎþø)Ìà„)Íðˆ¦÷þ§‹ñð†üÎþ)Ì숦õ¯¡Ýþ膋ñÎþøò†ƒùôüþ÷f‘)ÌD÷r)Ì÷Bþ³)Ë̃‹†øðò†ƒù÷œüþš)Ê䈦õ·ä†‹Ø’Íþøò†ƒùð†üð†ƒùð†ƒùð†üð†üò†ƒù÷¼øúüìþ«)Édˆ¦õ§ì†ëßþø)Ȇˆ)Éõ§üð†ü)Èþ›‹¦õ§üð†üÎþÖ)ÆP†ˆ)Çœõµüð†üð†ü)Æhþ›‹¦õµ‹ñð†üð†üÎþÖ)ņˆ)Æ÷þ™ü)Å0þ›‹¦÷þ™üÎþÖ)Ȇˆ)Ä´õ±ð†üð†ü)àþ›‹¦õ±ð†üð†üÎþÖ)ÁH†ˆ)ÂÌõµþüòð‚ð†üï)Á`þ›‹¦õµþüòð‚ð†üïßþÖ)¾ „)¿üˆ)Áõ§üð†üï)Àþ›‹¦õ§üð†üïßþ)¾¬ˆ)¿°õ§üð†üï)¾¸þ›‹¦õ§üð†üïßþÖút„)½üˆ¦õ§ì†ÊþûÌ‚—üüÒ–ðüû)½œüÈþ)º–)¼ºüõ›)½T‹‹†øèΆ‹‹†øèÖþ)º)»øèÐè)ºû¦)¶v–)¹"üõ›)¹¼‹‹†øèΆ‹‹†øèÖþ)¶‚)¸`èÐè)¶zû¦)²Þ–)µŠüõ›)¶$‹‹†øèΆ‹‹†øèÖþ)²ê)´ÈèÐè)²âû¦)¯F–)±òüõ›)²Œ‹‹†øèΆ‹‹†øèÖþ)¯R)±0èÐè)¯Jû¦)«®–)®Züõ›)®ô‹‹†øèΆ‹‹†øèÖþ)«º)­˜èÐè)«²û¦)¨–)ªÂüõ›)«\‹‹†øèΆ‹‹†øèÖþ)¨")ªèÐè)¨û¦)¤Ú–)¦öüõ›)§Ä‹‹†øèÖ†‹‹†øèÕþІøÌþ)¤æ)¦LèÐè)¤Þû¦)¡~–)£Êüõ›)¤ˆ‹‹†øèÖ†ŽþІøè݆øÔþ)¡Š)£8ÐèÜè)¡‚û¦)Ÿ&–) âüõ›«‹ñ݆øÔþ)Ÿ2) PÜè)Ÿ*û¦)œÎ–)žŠüõ›«‹ñ݆øÔþ)œÚ)øÜè)œÒû¦)™r–)œüõ›)œ ü膋ñ݆øÔþ)™~)›\èèÜÜè)™vû²ò‚)•J–)—Þüõ›)˜ä‹‹¤ò„ò„ò„øè)˜ †‹‹¼ê„ê„ê„øèÖþ)•V)—Lèèè)•Nû)•Øò‚ò‚ò‚)‘"–)“¶üõ›)”¼‹‹¤ò„ò„ò„øè)“䆋‹¼ê„ê„ê„øèÖþ)‘.)“$èèè)‘&û)‘°ò‚ò‚ò‚)ŽB–)þüõ›)¼‹‹ò„øè),†‹‹˜ê„øèÖþ)ŽN)lèè)ŽFû²ò‚)Šº–)üõ›)Ü‹‹ò„øè)L†‹‹˜ê„øèÖþ)ŠÆ)Œtèè)оû²ò‚)ˆN–)‰ªüõ›)Šh‹‹†øèÖ†ŽþІøè݆øÔþ)ˆZ)‰0è)ˆRû¦)…r–)‡.üõ›)‡ü‹‹†øèÖ†‹‹†øèÕþІøÌþ)…~)†´èèè)…vû¦)‚Ê–)„†üõ›)… ‹‹†øèΆ‹‹†øèÖþ)‚Ö)„ èèè)‚Îû¦)€:–)Þüõ›)‚x‹‹†øèΆ‹‹†øèÖþ)€F)Lè)€>û¦)}’–)Nüõ›)è‹‹†øèΆ‹‹†øèÖþ)}ž)~Ôèèè)}–û¦){–)|¦üõ›)}@‹‹†øèΆ‹‹†øèÖþ){)|è){û¦)xº–)züõ›)z°‹‹†øèΆ‹‹†øèÖþ)xÆ)yœè)x¾û¦8æ–:Šüõ›)xh‹‹†øè:¸†‹‹)x@:ìW‚†)x$W†ìþ³)xƒùW¸üþš)wø†üüö†üö†üö†üö†üò†ƒùö†üö†üò†ƒùWØn‘)wTÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ)rÈŽŒ)t(ŒþІøÆ„ŒþІøÆ„ŒþІøÆ„ŒþІøÆ„ŒþІøæ„)rRõþš)q)q´èÊþš)p)pÀ)p$þš)nh)oÌ)o<èô)npþš)läõþš)kx)l)k€þš)i|)k(Ð)j ô)i„þš)h)h´)hþš)f)gÀÐ)f¸ô)fþš)d¨)e¬èè)d°þš)c<)d@èè)cDþš)a¸)btè)aÀþš)`4)`ðè)`<þš)^°)_œÜ)^¸þš€¶â†§†)^¤·È„£)^ò„ò¸òúþ«)]¼ˆ¦õ“†Êþø)]†ˆ¦õ“†Êþø)\†ˆªõ³þð‚ð†üÊþ›Ý)14„)Z䈪õ)[ðüð†üð†üð‚ð‚ð†üïÛþ›)YÀ‚ˆªõ)ZÐüð†üð†üð‚ð‚ð†üïÛþ›)7l‚—ü)8’–ð)X4è)WtÜèÐèÐèèèèè)TŒèÄÜèèèèèèè)Q¤)PlèÐèèèÜè)NDèèèèÄ)LLÜèÐèÄèÄÜèèèèèèèÄ)G„èèèèèÄèèèèÄ)D èèèèô)B\è)AœèÐèôÄèÄÐèÐÐè)=”èèèÜÜôÐÐèèèô):dè)9Œè)8–û¦Øþ)7€¦õ)8tüð†üð†üð‚ð‚ð†üïßþ)1@—ü)2b–ð)6ÔÄèÐèèèèÐèè)3¤èèèô)2fû¦Øþ)1P¦õ)2Düð†üð†üð‚ð‚ð†üïßþø))„)-0—ü).R–ð)0œÜèÐèèèè).Vû¦Øþ)-@¦õ).4üð†üð†üð‚ð‚ð†üïßþ))—ü)*2–ð),¬ÜÄÜÐèè)*6û¦Øþ)) ¦õ)*üð†üð†üð‚ð‚ð†üïßþø)Ì„)( ˆªõ)(ôüð†üð†üð†üïÛþ›)'4‚ˆªõ)( üð†üð†üð†üïÛþ›)!T‚—ü)"B–ð)&$èèèè)$¼èÐèèèÜÜô)"Fû¦Øþ)!h¦õ)"$üð†üð†üð†üïßþ)Ø—ü)–ð) ¼ÐèÐèèÐèè)èèèô)Æû¦Øþ)è¦õ)¤üð†üð†üð†üïßþø)ä„)x—ü)b–ð)4ÜèÜèè)fû¦Øþ)ˆ¦õ)Düð†üð†üð†üïßþ)ð—ü)Ú–ð)ôÜÄÜÐ)Þû¦Øþ)¦õ)¼üð†üð†üð†üïßþø)Ô„)ˆªõ)Ôüð†üð†üð†üïÛþ›)‚ˆªõ)ìüð†üð†üð†üïÛþ›) \‚—ü) J–ð)4ÐèèèèÄèèÄèôÐèèèÜÜô) Nû¦Øþ) p¦õ) ,üð†üð†üð†üïßþ)à—ü)Ê–ð) ÄÐèÐèèÐèè) èèèô)Îû¦Øþ)ð¦õ)¬üð†üð†üð†üïßþø(ÿì„)€—ü)j–ð)<ÜèÜèè)nû¦Øþ)¦õ)Lüð†üð†üð†üïßþ(ÿø—ü)â–ð)üÜÄÜÐ)æû¦Øþ)¦õ)Äüð†üð†üð†üïßþø(ç<„(ÿˆªõ(ÿÜüð‚ð‚ð†üÊþ›(þ‚ˆªõ(þôüð†üð†üð†üð†üÊþ›(üü‚ˆªõ(ýðüð†üð†üð†üð†üÊþ›(ñH‚—ü(òR–ð(ü|èè(ûŒÜèÐèÐèèèè(ø¼èèèÐèèÜè(öL(õ¼èèèÜÜôÄÄèÄ(òVû¦Øþ(ñ\¦õ(ò4üð†üð†üð†üð†üÎþ(çH—ü(èN–ð(ïðèèèèÄ(íP(ì¨Üè(êàè(êÄèÄ(èRû¦Øþ(çX¦õ(è0üð†üð†üð†üð†üÎþø(ßì„(ã´—ü(亖ð(æ¤ÜèÜèèè(ä¾û¦Øþ(ãĦõ(äœüð†üð†üð†üð†üÎþ(ßø—ü(àþ–ð(ãHÜÜÄÜÐ(áû¦Øþ(à¦õ(ààüð†üð†üð†üð†üÎþø(ßP†ˆªõ•Êþ›Ý(Þ „(ÞÀˆªõ™üïÛþ›(Þ,ˆªõ™üïÛþ›Ý(ØÄ„(Ý ˆªõ(Þð†üð‚ð‚ð†üÊþ›(Ü4‚ˆªõ(Ý üð‚ð‚ð†üÊþ›(Û„‚ˆªõ§üð†üÊþ›(Úd‚ˆªõ(Ûlð‚ð†üð‚ð‚ð†üÊþ›(Ù|‚ˆªõ(ÚTüð‚ð‚ð†üÊþ›(ØÐˆªõ§üð†üÊþ›Ý(ט†ˆªõ(Ø„„þìÚ„þð†üïÛþ›Ý(ÓÀ„(Ö¤ˆªõ³„þìð‚ð†üÊþ›(Õ¨‚ˆªõ³„þìð†üð†üÊþ›(ÔÀ‚ˆªõ¿ð‚ð†üð†üÊþ›(Ó̈ªõ³„þìð†üð†üÊþ›Ý(Ïè„(Ò̈ªõ³þð‚ð†üÊþ›(ÑЂˆªõ³þð†üð†üÊþ›(Ð肈ªõ¿ð‚ð†üð†üÊþ›(Ïôˆªõ³þð†üð†üÊþ›Ý(Ì„(Îôˆªõ³„þìð‚ð†üÊþ›(Íø‚ˆªõ³„þìð†üð†üÊþ›(Í‚ˆªõ¿ð‚ð†üð†üÊþ›(̈ªõ³„þìð†üð†üÊþ›Ý(È8„(ˈªõ³þð‚ð†üÊþ›(Ê ‚ˆªõ³þð†üð†üÊþ›(É8‚ˆªõ¿ð‚ð†üð†üÊþ›(ÈDˆªõ³þð†üð†üÊþ›Ý(Ä`„(ÇDˆªõ³„þìð‚ð†üÊþ›(ÆH‚ˆªõ³„þìð†üð†üÊþ›(Å`‚ˆªõ¿ð‚ð†üð†üÊþ›(Älˆªõ³„þìð†üð†üÊþ›Ý(Àˆ„(Ãlˆªõ³þð‚ð†üÊþ›(Âp‚ˆªõ³þð†üð†üÊþ›(Áˆ‚ˆªõ¿ð‚ð†üð†üÊþ›(À”ˆªõ³þð†üð†üÊþ›Ý(¿ì†ˆªõ™üïÛþ›Ý(¿P†ˆªõ™üïÛþ›Ý(¾´†ˆªõ™üïÛþ›Ý(½ü†ˆªõ§üð†üÊþ›Ý(¼à†ˆªõ(½¼þð‚ð†üð†üÊþ›Ý(®Ì„(·¨—ü(¸®–ð(¼0ÜèèÜèÜèèÄèèè(¸²û¦Øþ(·¸¦õ(¸üð†üð†üð†üð†üïßþ(¶ ‚ˆªõ(·Œð‚ð†üð†üð†üïÛþ›(µ¸‚ˆªõ(¶üð†üð†üð†üïÛþ›(´´‚ˆªõ(µ ð†üð†üð†üð†üïÛþ›(³Ì‚ˆªõ(´¤üð†üð†üð†üïÛþ›(²È‚ˆªõ(³´ð‚ð‚ð‚ð†üïÛþ›(±à‚ˆªõ(²¸üð‚ð‚ð†üïÛþ›(°Ü‚ˆªõ(±Èð†üð‚ð‚ð†üïÛþ›(¯¼‚ˆªõ(°Äð‚ð†üð‚ð‚ð†üïÛþ›(®Øˆªõ(¯¬üð‚ð‚ð†üïÛþ›Ý(¬$„(®ˆªõµüð†üð†üïÛþ›(­P‚ˆªõ§üð†üïÛþ›(¬0ˆªõ(­„þìÚ„þð†üïÛþ›Ý(£L„(©x—ü(ªb–ð(«¼èèèè(ªfû¦Øþ(©ˆ¦õ(ªDüð†üð†üð†üÎþ(¨Œ‚ˆªõ¿ð‚ð†üð†üÊþ›(§À‚ˆªõ±ð†üð†üïÛþ›(¦Ø‚ˆªõ¿ð‚ð‚ð†üïÛþ›(¦ ‚ˆªõµüð‚ð†üïÛþ›(¥$‚ˆªõ¿ð†üð‚ð†üïÛþ›(¤ ‚ˆªõ(¥ ð‚ð†üð‚ð†üïÛþ›(£Xˆªõµüð‚ð†üïÛþ›Ý(›ø„(Ÿä—ü( ²–ð(¢œÜèèèèè( ¶û¦Øþ(Ÿô¦õµüð†üð†üïßþ(Ÿ‚ˆªõ±ð‚ð†üïÛþ›(žd‚ˆªõ§üð†üïÛþ›(˜‚ˆªõ±ð†üð†üïÛþ›(œ°‚ˆªõ¿ð‚ð†üð†üïÛþ›(œˆªõ§üð†üïÛþ›Ý(›\†ˆªõ™üÊþ›Ý(š¤†ˆªõ£ð†üÊþ›Ý(“P„(—<—ü(˜ –ð(™ôÜèèèèè(˜û¦Øþ(—L¦õµüð†üð†üïßþ(–l‚ˆªõ±ð‚ð†üïÛþ›(•¼‚ˆªõ§üð†üïÛþ›(”ð‚ˆªõ±ð†üð†üïÛþ›(”‚ˆªõ¿ð‚ð†üð†üïÛþ›(“\ˆªõ§üð†üïÛþ›Ý(‘8„(’¤ˆªõ£ð†üïÛþ›(‘ð‚ˆªõ§üð†üïÛþ›(‘Dˆªõ§üð†üïÛþ›Ý(Є(Œˆªõ£ð†üïÛþ›(܈ªõ£ð†üïÛþ›Ý(Žh„($ˆªõ£ð†üïÛþ›(Žtˆªõ£ð†üïÛþ›Ý(̆ˆªõ™üÊþ›Ý(0†ˆªõ™üÊþ›Ý(ŒL†ˆªõ¥þð†üÊþ›Ý(‹°†ˆªõ™üÊþ›Ý(Š,„(‹ˆªõ£ð†üÊþ›(Š8ˆªõ±ð‚ð†üÊþ›Ý(‰†ˆªõ™üÊþ›Ý(ˆô†ˆªõ™üÊþ›Ý(ˆX†ˆªõ™üÊþ›Ý(‡(„(‡Èˆªõ™üïÛþ›(‡4ˆªõ™üïÛþ›Ý(…ø„(†˜ˆªõ™üïÛþ›(†ˆªõ™üïÛþ›Ý(„È„(…hˆªõ™üïÛþ›(„Ôˆªõ™üïÛþ›Ý(ƒ˜„(„8ˆªõ™üïÛþ›(ƒ¤ˆªõ™üïÛþ›Ý(€„(‚숪õ£ð†üïÛþ›(‚8‚ˆªõ§üð†üïÛþ›(Œˆªõ§üð†üïÛþ›Ý(€ä†ˆªõ™üïÛþ›Ý(\„(€—ü(|V–(üõ›(€x‹‹šò„ò„øè(Ć‹‹ªê„ê„øè(:ªê„ê„øÔþ(|b(~ˆèÜÜèèè(|Zû¾ò‚ò‚(x–(zÊüõ›({¼‹‹¢ê„ò„øèà†‹ñ(zêªê„ê„øÔþ(x(z8èÜÜèèè(x û¾ò‚ò‚(s––(vŠüõ›(wl‹‹¢ê„ò„øèè†ü(vªªê„ê„øÔþ(s¢(uøèÜÄèèè(sšû¾ò‚ò‚(oF–(r üõ›(sh‹ñ(r´†‹‹ªê„ê„øè(r*ªê„ê„øÔþ(oR(qxèÜÜèèè(oJû¾ò‚ò‚(jÖ–(mÊüõ›(o(ü(nt†‹‹ªê„ê„øè(mêªê„ê„øÔþ(jâ(m8ÐÜÜèèè(jÚû¾ò‚ò‚(fV–(izüõ›(j\‹‹šò„ò„øè(i¨†‹‹ªê„ê„øèÖþ(fb(h¸èèÐèÐè(fZû¾ò‚ò‚(cB–(eFüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(cN(d„èè(cFû¾ò‚ò‚(`.–(b2üõ›(c‹ñ(b`†‹‹ªê„ê„øèÖþ(`:(apèè(`2û¾ò‚ò‚([®–(^Òüõ›(_´‹‹šò„ò„øè(_†‹‹ªê„ê„øèÖþ([º(^èèÐèÐè([²û¾ò‚ò‚(Xš–(Zžüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(X¦(YÜèè(Xžû¾ò‚ò‚(U†–(WŠüõ›(Xl‹ñ(W¸†‹‹ªê„ê„øèÖþ(U’(VÈèè(UŠû¾ò‚ò‚(R&–(T*üõ›(U ‹‹šò„ò„øè(TX†‹‹ªê„ê„øèÖþ(R2(Shèè(R*û¾ò‚ò‚(O–(Qüõ›(Qø‹ñ(QD†‹‹ªê„ê„øèÖþ(O(PTèè(Oû¾ò‚ò‚(Kþ–(Nüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(L (M@èè(Lû¾ò‚ò‚(Hž–(J¢üõ›(K„‹‹šò„ò„øè(JІ‹‹ªê„ê„øèÖþ(Hª(Iàèè(H¢û¾ò‚ò‚(EŠ–(GŽüõ›(Hp‹ñ(G¼†‹‹ªê„ê„øèÖþ(E–(FÌèè(EŽû¾ò‚ò‚(Bv–(Dzüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(B‚(C¸èè(Bzû¾ò‚ò‚(?–(Aüõ›(Aü‹‹šò„ò„øè(AH†‹‹ªê„ê„øèÖþ(?"(@Xèè(?û¾ò‚ò‚(<–(>üõ›(>è‹ñ(>4†‹‹ªê„ê„øèÖþ(<(=Dèè(<û¾ò‚ò‚(8î–(:òüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(8ú(:0èè(8òû¾ò‚ò‚(5Ž–(7’üõ›(8t‹‹šò„ò„øè(7À†‹‹ªê„ê„øèÖþ(5š(6Ðèè(5’û¾ò‚ò‚(2z–(4~üõ›(5`‹ñ(4¬†‹‹ªê„ê„øèÖþ(2†(3¼èè(2~û¾ò‚ò‚(/f–(1jüõ›¯‹‹¢ê„ò„øèà†‹ñÖþ(/r(0¨èè(/jû¾ò‚ò‚(,N–(. üõ›(.ì‹‹šò„ò„øè(.8†‹‹ªê„ê„øèÖþ(,Z(-xèè(,Rû¾ò‚ò‚()ê–(*žüõ›(+Ä‹‹šò„ò„øè(+4†‹‹˜ê„øèÊ‹˜ê„øÌþ()îû¾ò‚ò‚('†–((:üõ›()`‹‹šò„ò„øè((І‹‹˜ê„øèÊ‹˜ê„øÌþ('Šû¾ò‚ò‚(%&–(%Úüõ›('hü(&Ô†‹‹šò„ò„øè̆‹‹ò„øèÊ‹˜ê„øÌþ(%*û¾ò‚ò‚("â–(#–üõ›($œ‹‹šò„ò„øè̆‹‹ò„øèÊ‹˜ê„øÌþ("æû¾ò‚ò‚(þ–(!Êüõ›("Äüð†ü(!ê´Œ†øÖ„Œ†øà„øÔþ( (!P( ¨ÜèèÄ(øèè(û¦(––ð(@Üèèèèèè(HèÁû¦Øþ(¦õ(Lþ’ìð†üð†üð†üïßþ(h‚ˆªõ(@þ’ìð‚ð‚ð†üïÛþ›(p‚ˆªõµþ’ìð†üð†üïÛþ›(\‚ˆªõ(4þ’ìð‚ð†üð†üïÛþ›(‚ˆªõ( þ’ìÚ„„þìð‚ð†üð†üïÛþ›(@‚ˆªõ§‹ñð†üïÛþ›(hˆªõ§þ’ìð†üïÛþ›ÝÔ††þ›Ýð†ƒù(<†ƒ¢§Õìþ«ŒƒùôüþÐ(¤„(ˆªõ§üð†üïÛþ›(°ˆªõ¯‹ñ膋ñïÛþ›Ý(T„(ˆªõ™‹ñïÛþ›(`ˆªõ™‹ñïÛþ›Ýð†ƒù(t†ƒ¢±ò„Õìþ«ŒƒùôüþÐð†ƒùð†ƒùð†ƒùð†ƒùð†üð†üð†ƒùð†üð†ƒùö†üö†üÒ† þò„þò‚ö¸\†ƒžþ( ‘( ô( dŽŒšò„ò„ø( (( ¦( ,èÊ( ( t( îþ³˜ˆ¦õ( `ü膋ñ膋ñçßþøò†ƒùôüþ(ö‘( Ø( HŽŒšò„ò„ø( (Š( èÊ((X(Òþ³˜ˆ¦õ(Dü膋ñ膋ñçßþøò†ƒùôüþ(Ú‘(¼(,ŽŒšò„ò„ø(ð(n(ôèÊ(æ(<(¶þ³˜ˆ¦õ((ü膋ñ膋ñçßþøò†ƒùôüþ(¾‘( (ŽŒšò„ò„ø(Ô(R(ØèÊ(Ê( (šþ³˜ˆ¦õ( ü膋ñ膋ñçßþøò†ƒùôüþ'ý¢‘(„'ÿôŽŒšò„ò„ø'ý¸'ÿ6'ÿ¼èÊ'ý®'ÿ'ý~þ³˜ˆ¦õ'þðü膋ñ膋ñçßþøò†ƒùôüþ'úΑ'ýhÂŽŒò„ø'úä'üF·'ü0'úÚ'ü'úªþ³˜ˆ¦õ·‹ñ膋ñçßþøò†ƒùôüþ'÷"‘'ú”'úŽŒŒ„ò„ø'÷8'ø¶'ù´è'ø '÷.'ø„'öþþ³˜ˆ¦õ'øpüà†‹ñ膋ñÎþøò†ƒùôüþ'ó.‘'öè'öXŽŒŒ„ò„ø'óD'ôÂ'õðè'ô¬'ó:'ô'ó þ³˜ˆ¦õ'ô|üà†‹ñ膋ñÎþøò†ƒùôüþ'ï‚‘'òô'òdŽŒŒ„ò„ø'ï˜'ñ'òè'ñ'ïŽ'ðä'ï^þ³˜ˆ¦õ'ðÐüà†‹ñ膋ñÎþøò†ƒùôüþ'ëÖ‘'ïH'ŒŒ„ò„ø'ëì'íj'îhè'íT'ëâ'í8'ë²þ³˜ˆ¦õ'í$üà†‹ñ膋ñÎþøò†ƒùôüþ'çâ‘'ëœ'ë ŽŒŒ„ò„ø'çø'év'ê¤è'é`'çî'éD'ç¾þ³˜ˆ¦õ'é0üà†‹ñ膋ñÎþøò†ƒùôüþ'ãî‘'ç¨'玌Œ„ò„ø'ä'å‚'æ°è'ål'ãú'åP'ãÊþ³˜ˆ¦õ'å<üà†‹ñ膋ñÎþøò†ƒùôüþ'àB‘'ã´'ã$ŽŒŒ„ò„ø'àX'áÖ'âÔè'áÀ'àN'á¤'àþ³˜ˆ¦õ'áüà†‹ñ膋ñÎþøò†ƒùôüþ'Ü–‘'à'ßxŽŒŒ„ò„ø'ܬ'Þ*'ß(è'Þ'Ü¢'Ýø'Ürþ³˜ˆ¦õ'Ýäüà†‹ñ膋ñÎþøò†ƒùôüþ'Ù2‘'Ü\ÂŽŒ‚„ø'ÙH'Úª'Û'Ú”'Ù>'Úx'Ùþ³˜ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'Ó2‘'ØøÞŽÞŽ'Ø ŽŒ‚„Œþî'ÓH'×N·èÖ'Õ”'ÖÈè'Õœ'Ó>'Õ€'Óúþ³'Õ`ˆþö'Ôt†ˆ¦õ§‹‹þèð†üÎþø'Ó”†ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'Ì‚‘'ÒøÞŽÞŽ'ÑØŽŒœ„ŒþØ„Œþî'̘'Ñ·èÖ'Ï0'Дèè'Ï8'ÌŽ'Ï'Ìjúþ³'Îüˆþö'ÍĆˆ¦õ'ΰ‹‹þèØ†‹‹þèð†üÎþø'Ì䆈¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'ÉÆ‘'ÌHÂŽŒ‚„ø'ÉÜ'Ë>õ'ÉÒ'Ë 'É¢þ³˜ˆ¦õ¯‹ñ膋ñÎþøò†ƒùôüþ'¯Î‘'Ɍގގގގގގގގގ'Ç ŽŒ²ŒþŠþІø'ÇX„ŒþŠþІøÞ'¯ä'Åê'ÆÐèÜèÖ'Ĩ'Å|èèÊ'Ä'ÄXèèÊ'¯Ú'Ã4ŒþŠþІøâò‚'¯¶úþ³'à üÞ†”þò„þö'º8„'¾„ˆ¦õ§ŽþŠŒ–'ÂdŒ–†øî'Áø„Œ–†øî'¿À„Ž'Á´–†øî'¿à˜'Á8––†øî'À ˜¾þ–'À8––†øî'¿¬„øî䄸èð†üïßþ'ºDˆ¦õ§ŽþŠŒ–'¾$Œ–†øî'½¸„Œ–†øî'»€„Ž'½t–†øî'» ˜'¼ø––†øî'»Ì˜¾þ–'»ø––†øî'»l„øî䄸èð†üïßþø'²,†ˆ¦õ'¶ŽþŠŒ–'¹ÜŒ–†øî'¹p„Œ–†øî'·8„Ž'¹,–†øî'·X˜'¸°––†øî'·„˜¾þ–'·°––†øî'·$„øî䄸è'²Ð†ŽþŠŒ–'¶(Œ–†øî'µ¼„Œ–†øî'³„„Ž'µx–†øî'³¤˜'´ü––†øî'³Ð˜¾þ–'³ü––†øî'³p„øî䄸è膋ñÎþøÌ†ƒ‹þŠò„øè̆ƒ‹þŠò„øè膃ùð†ƒù'°0†ƒ‹ºŒþŠþІø'°\„ŒþŠþІøÞðò†ƒùôüþ'§ê‘'¯”ÞŽÞŽÞŽ'®`ŽŒ ŒþØ„Œþî'¨'¬²'­àÜÐèÊþš'«'¬,èÜ'«þš'§ö'ªü'§Òúþ³'ªôüƆ”‰‹þìò„þö'©x†ˆ¦õ·‹‹þèð†üß•þÌþø'¨L†ˆ¦õ'©8‹‹þèà†‹ñ膋ñÎþøò†ƒùôüþ'ò‘'§°ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ'¥DŽŒ²ŒþŠþІø'¥|„ŒþŠþІøÞ'Ž'¤'¤ôèÜèÖ'¢Ì'£ èèÊ'¡¨'¢|èèÊ'þ'¡XŒþŠþІøâò‚'Úúþ³'¡0üÞ†”þò„þö'˜\„'œ¨ˆ¦õ§ŽþŠŒ–' ˆŒ–†øî' „Œ–†øî'䄎'ŸØ–†øî'ž˜'Ÿ\––†øî'ž0˜¾þ–'ž\––†øî'Єøî䄸èð†üïßþ'˜hˆ¦õ§ŽþŠŒ–'œHŒ–†øî'›Ü„Œ–†øî'™¤„Ž'›˜–†øî'™Ä˜'›––†øî'™ð˜¾þ–'š––†øî'™„øî䄸èð†üïßþø'P†ˆ¦õ'”´ŽþŠŒ–'˜Œ–†øî'—”„Œ–†øî'•\„Ž'—P–†øî'•|˜'–Ô––†øî'•¨˜¾þ–'•Ô––†øî'•H„øî䄸è'ô†ŽþŠŒ–'”LŒ–†øî'“à„Œ–†øî'‘¨„Ž'“œ–†øî'‘Ș'“ ––†øî'‘ô˜¾þ–'’ ––†øî'‘”„øî䄸è膋ñÎþøÌ†ƒ‹þŠò„øè̆ƒ‹þŠò„øè膃ùð†ƒù'ŽT†ƒ‹ºŒþŠþІø'Ž€„ŒþŠþІøÞðò†ƒùôüþ'†‘'¸ÞŽÞŽÞŽ'Œ„ŽŒ ŒþØ„Œþî'†$'ŠÖ'ŒÜÐèÊþš'‰4'ŠPÜè'‰<þš'†'‰ '…öúþ³'‰üƆ”‰‹þìò„þö'‡œ†ˆ¦õ·‹‹þèð†üß•þÌþø'†p†ˆ¦õ'‡\‹‹þèà†‹ñ膋ñÎþøò†ƒùôüþ'€^‘'…ÔÞŽÞŽÂŽŒò„ø'€t'„J·èÖ'ƒ8'ƒÜèÊ'€j'ƒ$ò‚'€Fúþ³'‚¤ˆ‰ˆ‘óéö'膈¦õ§üð†üïßþø'€À†ˆ¦õ¯‹ˆ™ëå膋ñÎþøò†ƒùôüþ'yî‘'€$ÞŽÞŽ'DŽŒšò„ò„ø'z'~†·èÖ'}D'~èèÊ'yú'}0ò‚ò‚'yÖúþ³'||ˆ‰ˆŸì†óéö'{¤†ˆ¦õµüð†üð†üïßþø'zP†ˆ¦õ¯‹ˆ¯ä†ëå膋ñÎþøò†ƒùôüþ's¦‘'y´ÞŽÞŽÂŽŒò„ø's¼'x*·èÖ'vÐ'wŒè'vØ's²'v¼ò‚'sŽúþ³'vˆ‹þŠŸì†óçö'uP†ˆ¦õ§‹ñð†üïßþø't†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ'l¶‘'slÞŽÞŽ'rŒŽŒšò„ò„ø'lÌ'qηèÖ'p\'q`Üè'pd'lÂ'pHò‚ò‚'lžúþ³'otˆ‹þŠ­ì†ì†óçö'nŒ†ˆ¦õ½ü膋ñð†üïßþø'm†ˆ¦õ¯þеì†ì†ëã膋ñÎþøò†ƒùôüþ'fn‘'l|ÞŽÞŽÂŽŒò„ø'f„'jò·èÖ'i˜'jTè'i 'fz'i„ò‚'fVúþ³'h䈋þŠŸì†óçö'h†ˆ¦õ§‹ñð†üïßþø'fІˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ'_~‘'f4ÞŽÞŽ'eTŽŒšò„ò„ø'_”'d–·èÖ'c$'d(Üè'c,'_Š'cò‚ò‚'_fúþ³'b<ˆ‹þŠ­ì†ì†óçö'aT†ˆ¦õ½ü膋ñð†üïßþø'_à†ˆ¦õ¯þеì†ì†ëã膋ñÎþøò†ƒùôüþ'Y6‘'_DÞŽÞŽÂŽŒò„ø'YL']º·èÖ'\`']è'\h'YB'\Lò‚'Yúþ³'[¬ˆ‹þŠŸì†óçö'Zà†ˆ¦õ§‹ñð†üïßþø'Y˜†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ'RF‘'XüÞŽÞŽ'XŽŒšò„ò„ø'R\'W^·èÖ'Uì'VðÜè'Uô'RR'UØò‚ò‚'R.úþ³'Uˆ‹þŠ­ì†ì†óçö'T†ˆ¦õ½ü膋ñð†üïßþø'R¨†ˆ¦õ¯þеì†ì†ëã膋ñÎþøò†ƒùôüþ'Kþ‘'R ÞŽÞŽÂŽŒò„ø'L'P‚·èÖ'O('Oäè'O0'L 'Oò‚'Kæúþ³'Ntˆ‹þŠŸì†óçö'M¨†ˆ¦õ§‹ñð†üïßþø'L`†ˆ¦õ¯þЧì†ëã膋ñÎþøò†ƒùôüþ'A‘'KÄÞŽÞŽ'G¨ŽŒ'KLò„ò„'GØ'Iâ‘'KÞŽ'Iî'J¸ò‚'I¾þ³®ƒù膃ùò†ƒùôüþ'H‘'I¨ÞŽÞŽ'H'I(ò‚ò‚'Gêþ³'HÔƒù膃ù膃ùò†ƒùôüþ'AØ'Fê·èÖ'Ex'F|Üè'E€'AÎ'Edò‚ò‚'Aªúþ³'Dˆ‹þŠ­ì†ì†óçö'C¨†ˆ¦õ½ü膋ñð†üïßþø'B$†ˆ¦õ¯þнì†ä†ëã膋ñÎþøò†ƒùôüþ'6‘'Aˆ'6,';T'A4Ü„ò„';P¬'@Ì'; þ'= '@`è'? ÐèèèÐèÜÐôÊ';’'<Ø';bþ³˜ˆ¦õ'<Äüð†üð†üß’Íþøò†ƒùôüþ'6$'8–':üÐÜÐÜÜè'8€'6'7ðŠþ–ÚÊŠˆ–†øîîò‚'5êþ³˜ˆ¦õ'7Lüð†üð†üß’Íþøò†ƒùôüþ'*Š‘'5Ô'*¨'/X'5€Ü„ò„'/T¬'5'/¤þ'1'4¬'4ÐèèèÜèÐèÜÐôÊ'/–'0Ü'/fþ³˜ˆ¦õ'0Èüð†üð†üß’Íþøò†ƒùôüþ'* '-'/ÐÐÄè',ü'*–',lŠþ–ÚÊŠˆ–†øîîò‚'*fþ³˜ˆ¦õ'+Èüð†üð†üß’Íþøò†ƒùôüþ' ¦‘'*P' Ä'%À')üò„ò„'%¼¬')À'& þ''®')<èÜ'(4èÊ'%þ''|ò‚'%Îþ³˜ˆ¦õ''@‹ñè†üà†‹ñÎþøò†ƒùôüþ' ¼'#z'%hèÐÜÄ'#d' ²'"Xоþ–'"h––†øîØò‚ò‚' ‚þ³˜ˆ¦õ'!ô‹ñè†üà†‹ñÎþøò†ƒùôüþ'&‘'DŒª–†ŽþìîÒô'8'‚'ì'zìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ'’†''–ìþ«'Dˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'®†','²ìþ«'`ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'ʆ'H'Îìþ«'|ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'æ†'d'êìþ«'˜ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'†'€'ìþ«'´ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'†'œ'"ìþ«'Ј¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ':†'¸'>ìþ«'숦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'V†'Ô'Zìþ«'ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ' r†' ð' vìþ«' $ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ' ކ' ' ’ìþ«' @ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'ª†' ('®ìþ«' \ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'Ɔ'D'Êìþ«'xˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'â†'`'æìþ«'”ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'þ†'|'ìþ«'°ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'†'˜'ìþ«'̈¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ'2'Ø'þ³˜†þøò†ƒùôüþ&ö–‘&ÿì&ö´&úÔ&ÿ˜Ü„&úЬ&ÿD&û þ&üB&þ¨èèÐè&ý(&ü,&û&ü&úâþ³˜ˆ¦õ™‹ñÎþøò†ƒùôüþ&ö¬&øÖ&ú|è&ù¼&øÀ&ö¢&÷ÈŠª–”þêÂðò‚&örþ³˜ˆ¦õ™‹ñÎþøò†ƒùôüþ&ߊ&íÜ&ö0Ü„&íØ¬&õÜ&î(þ&ï’&õXÜèÄÜèÄÄ&ñPè&ð0&ï|þš&î&ï`&íêþ³˜ˆ¦õ­þ膋ñÎþøò†ƒùôüþ&àH„&íœÜ„&àL¬&íH&àœþ&â&ìÄÜè&ë¤ÜÐÐ&éôÜèÐ&èŒ&çüèèèèÐÄèèÄè&ãÄè&â¤&áðþš&àŽ&áÔ&à^þ³˜ˆ¦õ­þ膋ñÎþøò†ƒùôüþ&ß–&àøò‚&ßfþ³Œƒùôüþ¸ú‰&ÞÖ§×þìþ«Œƒùôüþ&Þ †§×þìþ«Œƒùôüþ¹&Ýȸþìþ³&ݸƒù¹0üþš&ݨü&´à„&ݘú‚&»(‚—ü&¼^–ð&Üè&Û@ÜèÐèÐèèèèè&ØXèÄÜèèèèèèè&Õp&Ô8èÐèèèÜè&ÒèèèèÄ&ÐÜèÐèÄèÄÜèèèèèèèÄ&ËPèèèèèÄèèèèÄ&ÇØèèèèô&Æ(è&ÅhèÐèôÄèÄÐèÐÐè&Á`èèèÜÜôÐÐèèèô&¾0è&½Xè&¼bû¦Ö&»<¦õ&¼@üð†üè†üð†üð†üð†üïßþ&´ì—ü&¶–ð&ºÄèÐèèèèÐèè&·`èèèô&¶"û¦Ö&´ü¦õ&¶üð†üè†üð†üð†üð†üïßþø&«ð„&°|—ü&±þ–ð&´HÜèÐèèèè&²û¦Ö&°Œ¦õ&±Ž†øðð†üè†üð†üð†üð†üïßþ&«ü—ü&­~–ð&¯øÜÄÜÐèè&­‚û¦Ö&¬ ¦õ&­ކøðð†üè†üð†üð†üð†üïßþø& X„&«ìú‚&¥ð‚—ü&¦î–ð&ªÐèèèè&©hèÐèèèÜÜô&¦òû¦Ö&¦¦õ&¦Ðüð†üè†üð†üïßþ& d—ü&¡^–ð&¥XÐèÐèèÐèè&¢ èèèô&¡bû¦Ö& t¦õ&¡@üð†üè†üð†üïßþø&˜°„&œ¤—ü&î–ð&ŸÀÜèÜèè&òû¦Ö&œ´¦õ&€Ž†øðð†üè†üð†üïßþ&˜¼—ü&š–ð&œ ÜÄÜÐ&š û¦Ö&˜Ì¦õ&™˜Ž†øðð†üè†üð†üïßþø&Œ@„&˜¬ú‚&‘Ø‚—ü&’Ö–ð&—ÀÐèèèèÄèèÄèôÐèèèÜÜô&’Úû¦Ö&‘ì¦õ&’¸üð†üè†üð†üïßþ&ŒL—ü&F–ð&‘@ÐèÐèèÐèè&Žˆèèèô&Jû¦Ö&Œ\¦õ&(üð†üè†üð†üïßþø&„˜„&ˆŒ—ü&‰Ö–ð&‹¨ÜèÜèè&‰Úû¦Ö&ˆœ¦õ&‰hކøðð†üè†üð†üïßþ&„¤—ü&…î–ð&ˆÜÄÜÐ&…òû¦Ö&„´¦õ&…€Ž†øðð†üè†üð†üïßþø&n`„&„”ú‚ú‚&xœ‚—ü&yÖ–ð&„èè&ƒÜèÐèÐèèèè&€@èèèÐèèÜè&}Ð&}@èèèÜÜôÄÄèÄ&yÚû¦Ö&x°¦õ&y¸üà†‹ñð†üè†üð†üÎþ&nl—ü&o¢–ð&wDèèèèÄ&t¤&süÜè&r4è&q\ÄèÄ&o¦û¦Ö&n|¦õ&o„üà†‹ñð†üè†üð†üÎþø&f„&jX—ü&kÞ–ð&mÈÜèÜèèè&kâû¦Ö&jh¦õ&kpކøðà†‹ñð†üè†üð†üÎþ&f—ü&g¢–ð&iìÜÜÄÜÐ&g¦û¦Ö&f,¦õ&g4ކøðà†‹ñð†üè†üð†üÎþøö†üò„†üüö†üö†üö†üâ„–ú‚ú‚ú‚ú‚üüö†üꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüꄎú‚ú‚üüö†üö†üö†üö†üö†ü&^”„¦—ü&_þ–ð&c€ÜèèÜèÜèèÄèèè&`û¦Ö&^ø¦õ&_àüè†üð†üð†üð†üïßþö‚ú‚ú‚ú‚ú‚ú‚ú‚ú‚üüú‚üü&[t„ž—ü&\²–ð&^ èèèè&\¶û¦Ö&[Ȧõ&\”üè†üð†üð†üÎþö‚ú‚ú‚ú‚ú‚ú‚üü&WÈ„–—ü&XÚ–ð&ZÄÜèèèèè&XÞû¦Ö&X ¦õ½üè†üð†üïßþö‚ú‚ú‚ú‚üüö†üö†ü&Sü„–—ü&U–ð&VøÜèèèèè&Uû¦Ö&T@¦õ½üè†üð†üïßþö‚ú‚ú‚ú‚üüú‚üüò„†üüò„†üüö†üö†üö†üö†üò„†üüö†üö†üö†üò„†üüò„†üüò„†üüò„†üüú‚üüö†ü!R˜„š—ü&L‚–&Q¶üõ›&Rd‹ñð†üð†üè†üïßþ&LŽ&Q<&P|ÐÜ&O,è&N Üè&L†û¾ò‚ò‚&FŠ–&K¦üõ›<üð†üð†üè†üïßþ&F–&K,&JlÐÜ&IÜ&HÜè&FŽû¾ò‚ò‚&A–&EÊüõ›µ‹ñð†üð†üïßþ&A&E8èèèÜèÜèèÄèèèèÜèô&Aû²ò‚&9’–&@^üõ›µüð†üð†üïßþ&9ž&?ÌèèèÐèèèèÐèèÄèèÜÜèèÜÜèÜèô&9–û²ò‚&0–&8Æüõ›&9tüð†üð†üè†üïßþ&0&8L&7¼&6üèÄÜ&5|Ü&4\Üèè&3$èÄÜôÜè&1è&0û²ò‚&'–&/6üõ›&/äüð†üð†üè†üïßþ&'&.¼&.,&-lÜÄè&+ìÜ&*´Üèè&)|ÜÐèôÄè&'û²ò‚&"j–&&6üõ›&&äüð†üð†üè†üïßþ&"v&%tèèèÜèèÐôÜè&"nû²ò‚&2–&!žüõ›&"Lüð†üð†üè†üïßþ&>&!$& ”ÐÜ&\Ü&TÜèè&Ü&Dè&6û²ò‚&.–&‚üõ›½üð†üè†üïßþ&:&ÀèèèèÐôÜè&2û²ò‚& B–&6üõ›&üè†üð†üð†üè†üïßþ& N&¼&,&lèÄÜ&ìÜè&´Üèè&|èÄÜôÜè&lè& Fû¾ò‚ò‚&æ–& Jüõ›& $üè†üð†üð†üè†üïßþ&ò& Ð& @& €ÜÄè& ÜÜ&°Üèè&xÜÐèôÄè&êû¾ò‚ò‚%þª–&îüõ›&Èüè†üð†üð†üè†üïßþ%þ¶&,èèèèÜèèèÐôÜè%þ®û¾ò‚ò‚%÷–%ý²üõ›%þŒüè†üð†üð†üè†üïßþ%÷"%ý8%ü¨ÐÜ%ûpÜÜ%úPÜèè%ùÜ%ø@è%÷û¾ò‚ò‚%ñö–%ö:üõ›%öèüð†üð†üè†üïßþ%ò%õxèèèèÜèèèÐôÜè%ñúû¾ò‚ò‚%準%ñFüõ›µüð†üð†üïßþ%æÆ%ð´èÜèÜèèèèÄÄÜÜèèÄÐÐèôÐÐè%ê$èèÜèèèÜÜôÜèè%æ¾û²ò‚%âš–%æ6üõ›§üð†üïßþ%â¦%å\èèèèèÄôÜè%âžû¦%Ýn–%áúüõ›µüð†üè†üÖþ%Ýz%áPÄèèè%ß èÄ%Þhè%Ýrû¦%Ù2–%ÜÎüõ›µüð†üè†üÖþ%Ù>%Ü<èèèÐÜÜ%Ú,è%Ù6û¦%Õº–%Ø®üõ›§üè†üÖþ%ÕÆ%×ìèèèÜôÜè%Õ¾û¦%Ñþ–%Õ üõ›½üð†üè†üïßþ%Ò %ÔÐÐÐÜè%Òû²ò‚%Ê–%ÑBüõ›%Ñàüð†üð†üè†üÖþ%Ê"%ИèÜè%Ïè%ÎXè%Íhè%Ìèèè%Êøèô%Êû¦%¹’–%Èæüõ›%Éøüè†üð†üè†üð†üð†üð†üïßþ%¹ž%ÈlÄèèè%Ƽèèèè%Ålèèèè%ÄèèèèÄèèèèÜÄè%Àtèèèè%¿$èèèèÄèèèèÜÄèèè%»LèÜÐô%¹–û¾ò‚ò‚%¯:–%¸Öüõ›%¹tüð†üð†üè†üÖþ%¯F%¸èÐèèèèèèèÄèèèÜèèÐèèèÜôÐèèèÜôÜôÜèÄôÜè%¯>û¦%ª&–%®šüõ›µüð†üè†üÖþ%ª2%­ØèèèèÜôÜè%«€èèè%ª*û¦%¦6–%©Züõ›%ªüð†üð†üè†üïßþ%¦B%¨°èèèèÜèèè%¦:û²ò‚% ˜%¢ ¹ú®%£¸%¥0¬þ–’%¥,%£°ôø%¤€ª’Â%£€ø°þ–’%£h%¢Ü¸%¢p›ÖþÔŽî% .%¡¾üõ›Öþ% %¡DÜ% û¦%™æ–%Ÿªüõ›Öþ%™ò%Ÿ0èÄè%˜èèÄÄèè%›XÜèè%™êû¦%þ–%™büõ›§üè†üÖþ%‘ %˜X%— ÜÄèèèÐÜÜèè%“ÄèèôÜôÜè%‘û¦%‰Š–%>üõ›µ‹ñð†üè†üÖþ%‰–%dèèèèèÐÜÜèè%Œ4ÄèèôÜôÜè%‰Žû²ò‚%€¢–%ˆ¾üõ›%‰lüè†üð†üð†üïßþ%€®%ˆD%‡´ÄÜèè%…ìÜ%„ÌÐ%ƒ”èÄÄÜ%€¦û²ò‚%xÚ–%Öüõ›%€„üè†üð†üð†üïßþ%xæ%\%~ÌÄèèè%}è%|Ð%{$ÄÜ%xÞû²ò‚%mΖ%x*üõ›µüð†üð†üïßþ%mÚ%w€Äèèè%uè%u(ÜÄÐè%r¸%r(%qhÜ%pÐè%mÒû²ò‚%Xb–%müõ›µ‹ñð†üð†üïßþ%Xn%lLèèèÄÜèÄèèè%iÐÐèÄÄÜèèÄÐ%e%dTÐè%bìÜÜÜÄÐè%`L%_ŒèèèÄÜèÄè%\ÔÐÜÄÜèÐÐèÄôÜè%Xfû²ò‚%(Ê–%W>üõ›%XDüè†üè†üè†üð†üð†üïßþ%(Ö%VÄÄèèè%UèèèèèèèèÄ%RŒèèèÜÜ%PÜ%PLèèèÜÐèèèèèèÜèÜÜèèÐèÜôÐèèèèèÜèÜÜèèÐèÜôÐèèè%FtèôÜèô%E Äèèèè%BüÐÜ%AdÐÜ%@Ü%?$ÜèèÜ%=¤ÜÄèèèèÜôÐÐè%:DèèÄÜèèÜèèÜÐèôÐÐèÄÄÜèè%3äèè%2Ä%24Äèèè%0„Ð%/|ÐÄÐ%-„Ü%,dèÜÜ%*ä%)ô%(Îû%)Xò‚ò‚ò‚%––%(üõ›µüð†üð†üïßþ%¢%'XèÐèèèèèÐÜèÜèèèÄèèèÄ%"Äèèè% hÐ%`ÐÄÐ%hÜ%HèÜÜ%È%Ø%HèèèÜôÜôÜèÄôÜè%šû²ò‚% Ú–%Öüõ›µ‹ñð†üð†üïßþ% æ%\%Ìè%ÄèÜÜÄè%´èèè%”èôÜèô%% „èèèÜôÜôÜè% Þû²ò‚$ÿ’–% îüõ›% ¬üà†‹ñð†üð†üïßþ$ÿž% t%äè%ÜèÜÜ%ŒèÜ%„èèè%dèôÜèô%ä%TèèèÜôÜôÜè$ÿ–û¾ò‚ò‚$ôŽ–$þÒüõ›µ‹ñð†üð†üïßþ$ôš$þX$ýÈè$üÀèÜÜ$ûpÜ$úhèèè$ùHèôÜèô$÷È$÷8èèèÜôÜôÜè$ô’û²ò‚$é.–$ó¢üõ›$ô`üà†‹ñð†üð†üïßþ$é:$ó($ò˜è$ñèÜÜ$ð@Üè$ï èèè$îèôÜèô$ì€$ëðèèèÜôÜôÜè$é2û¾ò‚ò‚$×b–$è6üõ›$èð‹ñð†üð†üÓ˜ê„øÔþ$×n$ç¤èè$æTèèÜèÐèèèèÜÐèô$â”èÜèÄÜ$à<èÜÜÄè$Þ,èèè$Ý èôÜèô$ÛŒ$ÚüèèèÜôÜôÜèÄèèè$×fû²ò‚$ÄJ–$Ö>üõ›$×4üà†‹ñð†üð†üÓ˜ê„øÔþ$ÄV$Õ¬èè$Ô\èèèÜèÄèèèèèÜÐèô$Ð$èÜè$ÎìÜè$Í„èÜÜ$Ì4èÜ$Ë,èèè$Ê èôÜèô$ÈŒ$ÇüèèèÜôÜôÜèÄèèè$ÄNû¾ò‚ò‚$¿F–$Êüõ›µ‹ñð†üè†üÖþ$¿R$ÂàÜÐè$ÁèèèèÜô$¿Jû²ò‚$¹¶–$¾Züõ›$¿üà†‹ñð†üè†üÖþ$¹Â$½°ÜèÜè$»ÐèèèèèÜô$¹ºû¾ò‚ò‚$¬²–$¸¾üõ›$¹˜üð†üè†üð†üè†üïßþ$¬¾$¸,èèèè$¶ÜèèèèÄè$´œÐÜ$³ÐÜ$±´ÐÄÐ$¯¤Üèèè$®<ôÜè$¬¶û¾ò‚ò‚$¡J–$«Žüõ›$¬„üð†üð†üè†üð†üè†üïßþ$¡V$ªüèèèè$©¬èèèèÄè$§lÐÜ$¥ÔÐÜ$¤„ÜÜ$£LÜèèè$¡Nû$¡Øò‚ò‚ò‚$––$ Rüõ›$¡,üð†üè†üð†üè†üïßþ$¢$ŸxÄèÜèèÄèÄÜ$›ÐÄèÜèèÄèÄÜ$˜XÐÄÐ$•ÐÐÄèèèèÄè$“èèèèÄèÄôÜè$šû¾ò‚ò‚$~–$Žrüõ›$hüð†üð†üè†üð†üè†üïßþ$Š$˜ÄèÜèèÄèÄÜ$‰ðÄèÜèèÄèÄÜ$†xÜÜ$„ÈÐÄèèèèÄè$øèèèèÄè$‚û$€ ò‚ò‚ò‚$]ê–$~Nüõ›$`üè†üð†üè†üð†üð†üè†üÖþ$]ö$}ŒèèèèèèèèèÐèèèèèèèÐèèèèèèèèè$wŒèèèÜÐÜèèèÜÐèèèÐèÄè$rèèèÜÐÜèèèÜÐèèèÐèÄèÄèÄèôÜèô$jäÜèèèèÜèèèÜè$gäèèÜèèèèÜèèÐèèè$dTèÜÐô$bŒèèèÐÜ$`dè$_tèèè$]îû¾ò‚ò‚$QΖ$]Jüõ›µüð†üè†üÖþ$QÚ$\ˆèÐèèèèèèèÄèèèÜèè$X8$W¨èèèÜô$Uø$UhèèèÜôÜôÜèÄôÜè$QÒû¦$.Ž–$Prüõ›$Q°üè†üð†üè†üè†üð†üð†üè†üÖþ$.š$O°èèèèèèèèèèÐèèèèèèèèÐèèèèèèèèè$IPèèèÜÐèÜèèèÜÐèèèÐèÄè$C°èèèÜÐèÜèèèÜÐèèèÐèÄèÄèÄèôÜèô$û²ò‚#ö–$Nüõ›$ü‹ñð†üè†üè†üÖþ#ö&$Ôè#ÿäÜÐèÜÜ#ý¼Ü#üœÐ#ûdÐÜèÄèèôÄè#øÜôÜèèô#öû¾ò‚ò‚#éV–#õüõ›#õìüà†‹ñð†üè†üè†üÖþ#éb#ôˆè#ó˜ÜÐèÜÜ#ñpÜè#ð8Ð#îèÐÜèèÄèèôÄè#ëXÜôÜèèô#éZû#éäò‚ò‚ò‚#Þ^–#èÒüõ›§üè†üÖþ#Þj#è@ÄèèèÜÜÄÜôÜ#ä˜èèè#ãHÄ#áøÄèèôÜôÜèÄôÜè#Þbû¦#Òò–#Ý®üõ›µüð†üè†üÖþ#Òþ#ÝèÄèèèÜÜÄÜôÜ#ÙDèèè#×ôÄ#Ö¤ÄèèôÜôÜèÄôÜè#Òöû²ò‚#»j–#Ònüõ›§üè†üÖþ#»v#Ñ”èÜ#ÐŒÜ#Ï´èÜèÄÄÄÜ#Ìl#ˬèèèèÜÜÄÜôÄÜ#Ç\èÜ#ÆTÜÜèÄèôÜèôÄèôÜèèô#ÂÜôÜèèô#À$Üô#¿ÄèèôÜôÜèÄôÜè#»nû¦#¢––#ººüõ›µüð†üè†üÖþ#¢¢#¹àèÜ#¸ÀÜÜÄèÜèÄÄÄÜ#´p#³°èèèèèÜÜÄÜô#°ÈÜÜ#®èèÜ#­ÈÜÜèèÄèôÜèôÄèôÜèèô#©HÜôÜèèô#§hÜô#¦HÄèèôÜôÜèÄôÜè#¢šû²ò‚#Ÿ6–#¢üõ›§üè†üÖþ#ŸB#¡€èèèÐÜè#Ÿ:û¦#›b–#ž†üõ›µüð†üè†üÖþ#›n#ôèèèèÐÜè#›fû²ò‚#Œ.–#šÂüõ›µüð†üè†üÖþ#Œ:#šèèèÐ#˜hèèè#–ÐèèèÐ#•8èèè#”#“ˆÜÄ#‘Øèèè#¸Ü#˜è#ŽØÜÄÄÜÄ#Œ2û¦#|n–#‹büõ›#Œüð†üð†üè†üÖþ#|z#Š èèèÐ#‰èèè#‡pèèèÐ#…Øèèè#„¸#„(ÜÜÜ#‚`èèè#@Ü#€ è#`ÜÜÜÄÜÜÜ#|rû²ò‚#p‚–#{Îüõ›µüð†üè†üÖþ#pŽ#{<èèè#zèèèÐ#x„èèèÐÜ#v,èèè#u Ü#sìè#s,ÜÄÄÜÄ#p†û¦#cÚ–#o¶üõ›#pTüð†üð†üè†üÖþ#cæ#o$èèè#mìèèèÐ#llèèèÄÜÜ#iÌèèè#h¬Ü#gŒè#fÌÜÜÜÄÜÜÜ#cÞû²ò‚#\Z–#cVüõ›§üè†üÖþ#\f#bdèèèÐè#`´èèèÜôÄÜè#^èôÄè#\^û¦#Tf–#[ªüõ›µüð†üè†üÖþ#Tr#Z¸èèèÐè#YèèèèÜôÄÜè#V8èôÄè#Tjû²ò‚#Iæ–#Sâüõ›§üè†üÖþ#Iò#Sè#RHÐÜ#QÐèèÄèôÜèôÜÜôÄÜèè#L¨èôÄèÄôÜè#Iêû¦#>Ú–#I6üõ›µüð†üè†üÖþ#>æ#H\è#GœÐÜ#FLÐèèèÄèôÜèôÜÜôÄÜèè#A´èôÄèÄôÜè#>Þû²ò‚#²–#>Vüõ›§üè†üÖþ#¾#=LèÄèèè#;$èÄèèè#9\èèè#7Äè#6ì#6\èÐèèèèèèèÜÄèèè#2œè#1Ä#14èÐèèèèèèÐèèèÄèôÄÜÜè#+ôèÐÄèôÄÜÜè#(ÄèÐÜèôÄÜ#&<è#$ìèèÄè#"ôÄèèô#!ôÜèÄôÜè#¶û¦"éÖ–#üõ›µüð†üè†üÖþ"éâ#øèÄèèèè# èÄèèèè#¨èèè#è# Äèèè#pè#hÐÜÄÄÜÜ#Øè#èèèèÐèÄÄÜÜÜè# ÐÜ# ØèÐÄèèè#°è#¨Äèèè#øè#ðÜÐ#¸ÄÜÜ#Äèèè"þøè"ýðÜÜÜÜÄÄÜÜÄèÜèÄèèèèÄèôÄÜÜè"öXèÐÄèôÄÜÜè"ó(èÐÜèôÄÜ"ð è"ïPèèèÄè"í(Äèèô"ëHôÜè"éÚû²ò‚"Ôz–"é&üõ›µüð†üè†üÖþ"Ô†"è”èèèèèèèèèÄèèèèèèÐèèèèèÜèèôÄèèô"átèèèèÄèèÄè"Þ,èèèè"ÜÄèèèèÐ"Û"Ú "ÙÜ"Ø"×$ÄèèôÜôÜè"Ô~û²ò‚"½Ò–"Óžüõ›"ÔLüè†üð†üè†üÖþ"½Þ"Ó èèèèèèèèèèÄèèèèèèèÐèèèèèèÜèèôÄèèô"Ë\èèèèÄèèèÄè"Çäèèèè"Æ|èèèèÄ"Ä´Ð"Ã|"ÂŒÜ"Á„"À”ÄèèôÜôÜè"½Öû¾ò‚ò‚"¨–"½üõ›"½´üè†üð†üè†üÖþ"¨"¼tèèèèèèèèèÐèèèèÐèèèè"·¬èèèèèèèèèÄèèèèÐèèèÄèèÄèèôÄèèô"°DèèÄè"®4èèèÐÜ"¬l"«¬"ª¼ÄèèôÜôÜè"¨û²ò‚"^–"§üõ›"§äüð†üè†üð†üè†üÖþ"j"¦ˆÜèèèèèèèèèÐèèèèèÐèèèèè"¡èèèèèèèèèèÄèèèèèÐèèèèÄèèÄèèôÄèèô"™ èèèÄè"–àèèèÄÜÜÄ"”"“ ÄèèôÜôÜè"bû¾ò‚ò‚"‚Þ–"Úüõ›§üè†üÖþ"‚ê"èÐèèèèÐèèèÜôÜè"ŠøèèÄè"ˆèèèèÐÜ"‡ "†`"…pÄèèôÜôÜè"‚âû¦"tr–"‚.üõ›µüð†üè†üÖþ"t~"œÐèÐèèèèÐèèèÜôÜè"}èèèÄè"zÜèèèÄÜÜÄ"x "wÄèèôÜôÜè"tvû²ò‚"df–"sÒüõ›µüð†üè†üÖþ"dr"s@èèè"qØÄèèèÜÜÄÜôÄÜ"mèÜèèèô"lhèèè"jÐèèèÜèè"hÄèèôÜôÜèÄôÜè"djû¦"S–"cšüõ›"d8üð†üð†üè†üÖþ"S"cèèèè"apèÄèèèÜÜÄÜô"^@ÜÜ"]Üèèèô"[ˆèèèè"YÀèèèèÜèè"VÀÄèèôÜôÜèÄôÜè"Sû²ò‚"EÖ–"RBüõ›"Rðüð†üð†üè†üïßþ"Eâ"QÈÄèèèÄ"O¸èèèÜÜ"NÜè"LèèèèÐ"KhÄèèôÜÜÐÜÜèèè"GØèôÜôÜè"EÚû²ò‚"7‚–"DÞüõ›"E¨üð†üð†üð†üè†üïßþ"7Ž"DdÄèèèèÄè"AôèèèÐÜÜÄÜè">ÜèèèèÐ"=,ÄèèôÜÜÐÜÜèèè"9œèôÜôÜè"7†û¾ò‚ò‚""––"6âüõ›µüð†üè†üÖþ""¢"6PèèÄèèÜèÄèÜè"2Ø"2HèèèÜÐèèÜÐÜôÐèèèÄèèô",ØèèèÜèè"+è"*8èô")èèèÜèè"'8è"&0ÄèèôÜôÜèÄôÜè""šû¦!ÿæ–"!Êüõ›""hüð†üð†üè†üÖþ!ÿò" ÀÐÐèè"hèèèÄÜÜÄÐèô"¨"èè"èèèÐè"HèÜè"øÐÄèèè"èèÄÄÜÜÜèÄÄÜÜ"˜èÄÐèÄèôÐèèèèÄèèô"  èèèèÜèè"¨è"Ðèô"˜èèèèÜèè" è"˜ÄèèôÜôÜèÄôÜè!ÿêû²ò‚!ø~–!ÿüõ›!ÿÈüè†üð†üè†üÖþ!øŠ!þˆè!ýPÄÜ!ûXÜ!úPÜèèè!ø‚û²ò‚!ðr–!÷†üõ›!øPüð†üè†üð†üè†üÖþ!ð~!öôè!õ¼ÄÜÜ!ó”ÜÜ!ò\Üèèè!ðvû¾ò‚ò‚!âÞ–!ïzüõ›!ðTüð†üè†üð†üè†üïßþ!âê!îèèèèè!í˜èèèèÄè!ëXÐÐÜ!é`ÐÜ!è(Ü!çÐÜ!åÐÜ!äÈÜèèè!ââû¾ò‚ò‚!Ôv–!áºüõ›!â°üð†üð†üè†üð†üè†üïßþ!Ô‚!á(èèèè!ߨèèèèÄè!ݘÐÐÜ!Û ÐÜ!ÚPÜÜ!ÙÐÜ!×°ÜÜ!ÖxÜèèè!Ôzû!Õò‚ò‚ò‚!ËÚ–!Ó~üõ›!ÔXüð†üè†üð†üè†üïßþ!Ëæ!Ó!ÒDÐÐÐÜ!ÐÐÜ!ÎÌÐÜ!Ídèèè!ËÞû¾ò‚ò‚!Âj–!ʶüõ›!ˬüð†üð†üè†üð†üè†üïßþ!Âv!Ê<!É|ÐÐÐÜ!ÇTÄÜÜ!żÄÜÜ!Ä èèè!Ânû!Âøò‚ò‚ò‚!¸~–!Árüõ›!ÂLüð†üè†üð†üè†üïßþ!¸Š!Ààèèèè!¿HÐ!¾(ÐÜ!¼¨ÐÐÜ!»Ü!ºèèè!¸‚û¾ò‚ò‚!­¾–!·Züõ›!¸Püð†üð†üè†üð†üè†üïßþ!­Ê!¶Èèèèè!µ0Ð!´ÄÜÜ!²HÐÐÜ!°˜ÜÜ!¯`èèè!­Âû!®Lò‚ò‚ò‚! r–!¬Æüõ›!­ üð†üè†üð†üè†üïßþ! ~!¬4èèèè!ªäèèèèÄè!¨¤Ð!§TÐÐÜ!¥¼Ü!¤œÐÐÜ!£Ü!¡üèèè! vû¾ò‚ò‚!’R–!ŸNüõ›! Düð†üð†üè†üð†üè†üïßþ!’^!ž¼èèèè!lèèèèÄè!›,Ð!™ÜÐÐÜ!˜,ÜÜ!–ÜÐÐÜ!•,ÜÜ!“ôèèè!’Vû!’àò‚ò‚ò‚!„¢–!‘Îüõ›§üè†üÖþ!„®!|èèè!\è!Ž èèèÄèèèÐÄÜ!Š”ÐèôÄÜ!ˆœÐèô!†¤ÜèèÄèô!„¦û¦!vN–!ƒòüõ›µüð†üè†üÖþ!vZ!‚ èèè!€è!€0èèèÄèèèÐÄÜÜ!| Ðèô!{hÜÜÄÐèô!xhÜèèÄèô!vRû²ò‚!hž–!uÊüõ›§üè†üÖþ!hª!txèèè!sXè!rèèèÄèèèÐÄÜ!nÐèôÄÜ!l˜Ðèô!j ÜèèÄèô!h¢û¦!ZJ–!gîüõ›µüð†üè†üÖþ!ZV!fœèèè!e|è!d,èèèÄèèèÐÄÜÜ!`œÐèô!_dÜÜÄÐèô!\dÜèèÄèô!ZNû²ò‚!Wr–!Y^üõ›!Yø‹‹†øèΆ‹‹†øèÖþ!W~!XÌèÜè!Wvû¦!T –ð!V´Üèèèèèè!T¼èÁû¦Ö!Rä¦õ!S°¡Ý’ìð†üè†üð†üÎþö‚ú‚ú‚ú‚ú‚üüö†üö†üö†üò„†üüò„†üüö†üö†üö†üö†üö†üö†üö†üö†üö†üö†üö†üò†ƒùò†ƒù¹P¡‘!QLÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ!>ˆŒþ’âÞŽØŽ‡ÑŽ‡×ŽÞŽÞŽÞŽØŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑŽ‡ÑއÁއ‹þÈŽ‡ÑއÁއ‹þÀŽ‡×Ž¹¨!9"!:<è!9 œ¦õ™‹ñïßþ!7d!8œè!7lœ¦õ™‹ñïßþ!5À!7è!5Èœ¦õ§‹ñð†üïßþ!4!5pè!4$œ¦õ§‹ñð†üïßþ!2ì!3ä!2ôœ¦õ™üïßþ!1¼!2´!1Äœ¦õ™üïßþ!/Ì!1<Ð!/Ôœ¦õ™üïßþ!+”!/Lè!.tÄè!-$!+œ!,¦õ§¡Ý’ìð†üÎþ²ò‚ò‚!&¸!*äÐÐèèèèèè!(\èè!&À!'@¦õ§üð†üÎþ²ò‚ò‚!Ø!%àèèèèèèèèèÐèÜèÄèèôÄèÄè! @èèô! è!à!`¦õ!l¡Ý’ìÖ†þ’òþìð†üð†üð†üÎþ²ò‚ò‚!\!èèèèèÄè!¬èè!tè!d!ä¦õ!À¡Ý’ìð†üà†‹ñð†üÎþ²ò‚ò‚!ô! èèèèèÄè!0èè!@èèèô!ðè!ü!|¦õ!<¡Ý’ìà†‹ñð†üÎþ²ò‚ò‚! L!Œèèè! Tè! T! Ô¦õ!  ¡Ý’ìè†üð†üð†üÎþ²ò‚ò‚!ì! ´ÜÜÜÄÜÐ!ô!t¦õ!lüà†‹ñð†üð†üð†üÎþ²ò‚ò‚ ûü!$ÜèÐèÜèÐèèèè!ôèèèèÐèèèÐèèèôÄè þìèÄÄ ü ü„¦õ ý|üà†‹ñð†üð†üð†üÎþ²ò‚ò‚ ðL ûÜèÐèÜèÐèèèè ÷àèèèèÐèèèÄè ôàè óØ ó0èÄÄ ðT ðÔ¦õ ñ ‹ñè†üð†üð†üÎþ²ò‚ò‚ ìô ï´èèèèÄ ìü í|¦õ™üÎþ²ò‚ò‚ êè ìŒè êð ëp¦õ§üð†üïßþ²ò‚ò‚ è¼ ê€è èÄ éD¦õ§‹ñð†üïßþ²ò‚ò‚ æp èTÐ æx æø¦õ§üð†üïßþ²ò‚ò‚ ä8 åØè ä@ äÀ¦õ™üïßþ²ò‚ò‚ â ã è â â ¦õ™üïßþ²ò‚ò‚ ߀ á€Ðè ߈ à¦õ™üïßþ²ò‚ò‚ Ý ÞèÐè Ý ݈¦õ™üïßþ²ò‚ò‚ Úà Ühè Úè Ûh¦õ™üïßþ²ò‚ò‚ ØÀ ÚHè ØÈ ÙH¦õ™üïßþ²ò‚ò‚ Ö| Ø(è Ö„ צõ«üÝ•†øÌþ²ò‚ò‚ Ô Õäè Ô Ôˆ¦õ ÕLüÁ•†Œò„øîÌþ²ò‚ò‚ Ò( Ó˜ Ò0 Ò°¦õ™üïßþ²ò‚ò‚ ÐP ÑÀ ÐX ÐØ¦õ™üïßþ²ò‚ò‚ ͸ ψРÍÀ Î@¦õ™üïßþ²ò‚ò‚ Èh ÍPèèèÐèèÜè ÊøèÄèô Èp Èð¦õµüð†üð†üÎþ²ò‚ò‚ Æ ÇÐèè Æ Æœ¦õ§üð†üÎþ²ò‚ò‚ µ Åè ÄÐÜèÐèÜ ÂÀèèÜè Á(èèèèÐèèèèèÐ ½à ½ èèèô »èèèÜè º8èèèèôÄèè ·àè ·è µ µŒ¦õ³þð†üð†üÎþ²ò‚ò‚ ²ü ´œè ³ ³„¦õ™üïßþ²ò‚ò‚ ¤° ²PèèÜè °èèÜè ¯PèèèèÐÐèèèè ¬P «èèèôÄèè ©€èèÜèÜè §pè ¦˜è ¤¸ ¥8¦õ§þþð†üÎþ²ò‚ò‚ ¢ £è ¢˜ £¦õ™üÎþ²ò‚ò‚  ˆ ¡à   ¡¦õ™üÎþ²ò‚ò‚ ž   Ð ž žŒ¦õ§üð†üïßþ²ò‚ò‚ ›P „Ð ›X ›Ø¦õ§üð†üïßþ²ò‚ò‚ –ð šÄÐ ™¤è ˜Ìè –ø —x¦õ·üð†üß•þÌþ²ò‚ò‚ ’x –dÐ •,è ”Tè ’€ “¦õ·üð†üß•þÌþ²ò‚ò‚ l ’è t ô¦õ§üð†üïßþ²ò‚ò‚ Ž@ è ŽH ŽÈ¦õ§‹ñð†üïßþ²ò‚ò‚ ‹ô ØÐ ‹ü Œ|¦õ§üð†üïßþ²ò‚ò‚ ‰ˆ ‹ŒÐè ‰ Цõ§üð†üïßþ²ò‚ò‚ < ˆPèÐèèÐèèÐèèÄèô „x ƒèÐèèèèôÄè `èè D Ħõ €€üð†üð†üð†üïßþ²ò‚ò‚ u, }üèèÐèèÐèè {DèèèÄèèèÐèèÐ wäèô vô u4 u´¦õ vtüà†‹ñð†üïßþ²ò‚ò‚ rX t¬èèèè r` rà¦õ§‹ñð†üïßþ²ò‚ò‚ it qèèÐèèÐèèÄèôÄèÄÐÐÐè k, i| iü¦õµüð†üð†üïßþ²ò‚ò‚ _8 hdèèÐèèÐèè e¬èèèÄèèèÐèèÐ bLèôÐèÜÜô _@ _À¦õ `|üð†üð†üð†üïßþ²ò‚ò‚ [, ^ ÐÜÄÜÐ [4 [´¦õ \püð†üð†üð†üïßþ²ò‚ò‚ Xø ZÄÐ Y Y€¦õ§üð†üÎþ²ò‚ò‚ VŒ XÐè V” W¦õ§üð†üïßþ²ò‚ò‚ Jð U<èÐèÐèè S,è R èÐÐÄ O´Ðèèèèô Mìè Mèè Jø Kx¦õ L4üð†üð†üð†üïßþ²ò‚ò‚ F° JèÐèè Hè F¸ G8¦õ Gøüà†‹ñð†üïßþ²ò‚ò‚ CÜ F0èèèè Cä Dd¦õ§‹ñð†üïßþ²ò‚ò‚ ?¬ BüèÐèè A|è ?´ @4¦õµüð†üð†üïßþ²ò‚ò‚ 5X >œèÐèè =è ;ÌèÐèÐèè 9ŒÐèèÐ 7ÜèÜÜô 5` 5à¦õ 6œüð†üð†üð†üïßþ²ò‚ò‚ 1L 4ÀÐÜÄÜÐ 1T 1Ô¦õ 2üð†üð†üð†üïßþ²ò‚ò‚ .” 0äÐèè .œ /¦õµüð†üð†üïßþ²ò‚ò‚ +t .,èèÐè +| +ü¦õ ,Ôüð†üð†üð†üð†üïßþ²ò‚ò‚ (€ + èÐè (ˆ )¦õ )äüà†‹ñð†üð†üïßþ²ò‚ò‚ %` (èèèèè %h %è¦õµ‹ñð†üð†üïßþ²ò‚ò‚ "| $øèÐè "„ #¦õ #Àüð†üð†üð†üïßþ²ò‚ò‚ Œ "èÐÄ |è ¼èèèô ” ¦õµüð†üð†üïßþ²ò‚ò‚ À $èèèè È H¦õ üð†üð†üð†üÎþ²ò‚ò‚ x (Ðèè € ¦õ Ìþ’òþìÚ†þþð†üïßþ²ò‚ò‚ „ èÐ Ø Hè ˆèèèô Œ  ¦õ§üð†üïßþ²ò‚ò‚ Œ ì üè ” ¦õ™üÎþ²ò‚ò‚ ì $èÐ ìÄèèèè $èèèô ô t¦õµüð†üð†üïßþ²ò‚ò‚ è „Ðèèè ð p¦õ ,üð†üð†üð†üïßþ²ò‚ò‚÷„ (ÜèèÄèÜèÐèèèè hÜèèÐèÐèÐèèèèþØèèÐèôý@ühÐèèèèôÄèùàèè÷Œø ¦õùüð†üð†üð†üð†üð†üïßþ²ò‚ò‚óäöìèèèèèèóìôl¦õõdüà†‹ñð†üð†üð†üïßþ²ò‚ò‚ðxódèèèèèèð€ñ¦õñ¼‹ñð†üð†üð†üïßþ²ò‚ò‚Μîìèî,ÜèÐèÐèèèèèÄê´èÄèèèèèèèèçäæ|èÐèèèÜèäTèèèèÄâ\ÜèÐèÄèÄèèèèèèèèÄݬèèèèèÄÛ´èèèèÄÙ¤èèèèô×ôè×4èÐèôÕÌèÄÐèÐÐèÓÐèèèôÄèмèΤÏ$¦õÏüüð†üð†üð†üð†üïßþ²ò‚ò‚ÊÀÎ4ÜèèÄèèèÊÈËH¦õÌüð†üð†üð†üïßþ²ò‚ò‚ÆxÊXèÜèèÄèèèÆ€ǦõÇøüà†‹ñð†üð†üð†üïßþ²ò‚ò‚Â|ÆÜèèÄèèè„æõÃÀ‹ñð†üð†üð†üïßþ²ò‚ò‚¾ ÂèÜèèÄèèè¾¾”¦õ¿¤üð†üð†üÔ†Žò„øðð†üïßþ²ò‚ò‚™|¼€è»ÀÜèÐèÐèèèèèĸHèÄèèèèèèèèµx´èÐèèèÜè±èèèèèįðÜèÐèÄèÄèèèèèèèèÄ«@èèèèèÄ©Hèèèèħ8èèèèô¥ˆÐèÐèÐè£0èÐèôÄèÄÐèÐÐèŸ(èèèôÐÐèèèôÄè›È虄š¦õ›üð†üà†Žþðð†üð†üð†üïßþ²ò‚ò‚”ð˜äÜÜÄÜÐèè”ø•x¦õ–lüð†üð†üð†üð†üð†üïßþ²ò‚ò‚ì”|ÄèÐèèèÐÐèèèôÄè,èôŽt¦õPþþð†üà†‹ñð†üïßþ²ò‚ò‚‡x$èèèèÄèèèèÄèèèè‰L‡€ˆ¦õ§üð†üÎþ²ò‚ò‚… †ø…¨†(¦õ™üïßþ²ò‚ò‚H…8„¨„èô‚àPЦõ¡üç’Íþ²ò‚ò‚p€àxø¦õ™üïßþ²ò‚ò‚{„~ØèèÄèèèè{Œ| ¦õµþþð†üð†üïßþ²ò‚ò‚m°{4zŒyüèÜxôÄÜÜèw,ÜÜèèèèuLèôÄÜÜèÜèÐèôÄèèèÐÐèôÜoÄèm¸n8¦õoüð†üà†‹ñð†üïßþ²ò‚ò‚jdm0èèèèèjljì¦õk¬þþà†‹ñð†üïßþ²ò‚ò‚bHjilèÜhLÜèèÄÄèÜèÐèôÄd\èbPbЦõ½þþè†üð†üïßþ²ò‚ò‚^Ta°èèÄèèèè^\^ܦõµþ’òþìð†üð†üïßþ²ò‚ò‚O^]D\´è[Ü[LèÜZDÄÜÜèX|ÜÜèèèèVœèôU”èÐèôÜèèèÐÐèÜÐèÄÐÐOOˆ¦õPdüð†üà†‹ñð†üïßþ²ò‚ò‚K¬N€èèèèèK´L4¦õLôþ’òþìà†‹ñð†üïßþ²ò‚ò‚@ K\JœJ èIèÜGäÜèèFLèÐèôDÌèCôèÄBŒ@¨A(¦õ½þ’òþìè†üð†üïßþ²ò‚ò‚<´@èèÄèèèè<¼=<¦õµþþð†üð†üïßþ²ò‚ò‚1˜\@>ÐôÖ=8·èÖ;ü=üû¦¦– ‚üõ›¹Ë‚„‰ïÔþ²  H Xèè PèxÜ ÐèØèèÜèªû¦*–.üõ›‘‹ñÖþ6œ.û¦ø¦–züõ›½üð†üè†üïßþø²þøèèýHÜÜèÜû€ÜÜèù èôøªû²ò‚ö –÷öüõ›½üð†üè†üïßþö÷dèèèöû²ò‚ó–õZüõ›½üð†üð†üçŠÕþóôÈèèèÜèóû¦î–ò^üõ›½üð†üð†üçŠÕþîÎñÌÜÐÄÐÐÜèîÆû¦ÝʘêP­úë2ëøø˜í¨ˆ˜îh’ê–’êì삈––’êì`‚ˆ–’êêØü–üêêë,ëÈþøþøþꈛ­üð†üð†üÖþàŠ„îå „­úæŠçPø˜èÔˆ˜þ˜éÀ’ê–’ê肈––’ê縂ˆ’êØü–üêêæ„ç þøþøþåà›­üð†üð†üÖþàŠ„îÝöäÞüõ›µ‹ñð†üè†üÖþÝÖã¼èèâ èÜèÜà\ÜèÞÄèôÝÎû²ò‚Î"˜Ùô·úÚêÛ°ø˜Ý`ˆ’ܤ‚ˆ––’êÜ‚ˆ–’êêØü–üêêÚäÛ€þöøþÚ@›­üð‚ð†üÖþÖ”ö„îÖ8„·ú×6×üø˜Ù€ˆ’ØÄ‚ˆ––’êØd‚ˆ’êØü–üêê×0×ÌþöøþÖŒ›­üð‚ð†üÖþÖ”ö„îÎNÕfüõ›½‹ñè†üè†üÖþÎ.ÔDèèÒ”èÜèÐдÐÏ4èôÎ&û¾ò‚ò‚Ì‚–ðÍdèèÁû¦Ö˦÷þ§‹‹†øèð†üÎþʸ‚ˆ¦÷þ§‹ñð†üÎþɬˆ¦÷þ¯¡Ýþ膋ñÎþøè†ƒùò†ƒùôüþºJ‘ÈØÞŽÞŽÞŽÖŽº`ÅþÇ\èÆœèÅèþ¦ò‚ÃäÅ0èÐèÃìþ¦ò‚ÂÃdèÐè þ¦ò‚º\½¾Áð„½¶òüÁཎþ«Á8ˆ¦õ§ì†ëßþø¾,„Àxˆ¦õ§‹á†Êþ¿˜‚ˆªõµüð†üð†üïÛþ›¾Ø‚ˆªõ§‹ñð†üïÛþ›¾8ˆªõ™‹ñïÛþ›Ýꆆöò†ƒùôüþºV½pò‚º2úþ³½(ˆþöº¬„¼ˆ¦õ¼ì‹ñà†‹ñð†üÎþ»P‚ˆ¦õ§‹ñð†üÎþº¸ˆ¦õ™‹ñÎþøò†ƒùôüþÄℌþôÕþïþ¸`ò†ƒùôüþ·zìþ«Œƒùôüþ¶æìþ«Œƒùôüþz¶ Vúþ³µøˆ¦õ§üð†üïßþøµ<†ˆ¦õ§üð†üïßþø´Œ†ˆ¦õ§üð†üïßþø³Ü†ˆ¦õ§üð†üïßþø³,†ˆ¦õ§üð†üïßþø±ð„²ˆˆ¦õ£ð†üïßþ±üˆ¦õ™üïßþø°¤„±Lˆ¦õ£ð†üïßþ°°ˆ¦õ¡üç’Íþø°†ˆ¦õ™üïßþø¯|†ˆ¦õ™üïßþø®è†ˆ¦õ™üïßþø„ t—ü#º–%vüõ›®|‹‹šò„ò„øè%¤†‹‹®Tê„ê„%ب⑭ø¨î­È¨æìþ³­ƒ‹†øðò†ƒù©üþš­hüò†ƒùö†üö†üö†üö†üð†üð†üò†ƒù©8¡‘¬¨ÞŽØŽ‡ÉŽ‡ˆÉŽ‡ÑŽ‡©¥«L©Äœ¦õªÄà†‹ñ膋ñÎþÉ‘×þïþ&‘¨¨ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ&$¡Æ£$ÐèÐèÖ $¡@èèèèÖžˆŸ¼èÜèèÖ›üžÐèМˆœ™Ð›èÐèèܷ֘˜ä˜«Ê–¬—°Ð–´•X–\Е`“ì”ðÐèÊ‘x“´“ ÐèÐèôÖŒdøÐÐèxÐèÐÄhÐŒl†‹äÐÐèÜÐÐè‰,ÐèÐćІ ƒt…€èÐèèÐèèÖH‚”èÐèèÖ€<€àèÊ0ÔèÊ}Ä~ÈÐèÊ{È}DÐèÜ{ÐzŒ{xèèèÖ&vdŒzTv€„ŒþŠþŠ˜Œ–yðŒ–†øîy„„Œ–†øîwL„Žy@–†øîwl˜xÄ––†øîw˜˜¾þ–wÄ––†øîw8„øîÜ„øÞò؆Œ†øòò‚%öúþ³uhˆŒŒò„øè„øôöt¬†ˆ¦õ§üð†üÎþøt†ˆ¦õ™üïßþøst†ˆ¦õ¡üç’ÍþørT„r숦õ™üïßþr`ˆ¦õ™üïßþøgÄ„m —ünÊ–ðqÔÐÄÜèÜèèÜènÎû¦Öm0¦õn¬ümn•n”mÀ„ŒþŠn€mìŠþŠþŠŒ‚䄸À„øÌþgЗüiz–ðlœÄÄÜèÜèèÜèi~û¦Ögà¦õi\üh•iDhp„ŒþŠi0hœŠþŠþŠŒ‚䄸À„øÌþøf$„gˆ¦õµüð†üð†üÎþf0ˆ¦õ§þþð†üÎþøe†ˆ¦õ™üïßþødü†ˆ¦õ™üïßþøc¤„dXˆ¦õ§üð†üïßþc°ˆ¦õ§üð†üïßþøc†ˆ¦õ™üïßþøb|†ˆ¦õ™üïßþø\¬„aŒˆ¦õ§Žšò„ò„øðð†üïßþ]\‚—ü_6–ð`¨èÐèèÁû¦Ö]p¦õ§‹‹_^H„ŒþŠ_^tŠþŠþŠŒ‚䄸À„øèð†üïßþ\¸ˆ¦õ§üð†üïßþø\†ˆ¦õ™üÎþø'„„<ˆ¦õ§Ž\ ò„ò„<´›‘[ÐÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ=WöXôèèèèÖVlWpÐèÊU`VèÊSôTøÐèÊ<öSàò‚ò‚<Òúþ³S ˆŒŒò„øè„øôöRp†ˆ¦õ¡üç’ÍþøQ܆ˆ¦õ™üïßþøQH†ˆ¦õ™üïßþøPP†ˆ¦õQ8üð†üð†ü膋ñÎþøÌ†ƒ‹˜ê„øðOL†ƒ‹þŠþŠŒ‚䄸àN¬†ƒ‹þŠþŠŒ‚䄸àN †ƒ‹þŠþŠŒ‚䄸àMl†ƒ‹þŠþŠŒ‚䄸àL̆ƒ‹þŠþŠŒ‚䄸àL,†ƒ‹þŠþŠŒ‚䄸àHx†ƒ‹þŠŒ–KÐŒ–†øîKd„Œ–†øîI,„ŽK –†øîIL˜J¤––†øîIx˜¾þ–I¤––†øîI„øî䄸èDĆƒ‹þŠŒ–HŒ–†øîG°„Œ–†øîEx„ŽGl–†øîE˜˜Fð––†øîEƾþ–Eð––†øîEd„øî䄸èA†ƒ‹þŠŒ–DhŒ–†øîCü„Œ–†øîAÄ„ŽC¸–†øîAä˜C<––†øîB˜¾þ–B<––†øîA°„øî䄸è=L†ƒ‹þŠ˜Œ–@´Œ–†øî@H„Œ–†øî>„Ž@–†øî>0˜?ˆ––†øî>\˜¾þ–>ˆ––†øî=ü„øîÜ„øèò†ƒùôüþÀð†üÎþ*4‚—ü9J–:îüõ›;¬‹‹ò„øè;†‹‹˜ê„øèÖþ9V:\èè9Nû²ò‚/.–ðüû8ø/ 6Ú‘8è6ð8>«Ê6æ8üò‚6¶þ³˜ˆ¦õ¡‹ñçßþøò†ƒùôüþ/ž‘6 ÞŽÞŽÞŽÞŽÞŽÞŽ/´5Nõ4„«Ê/ª4p/zþ³3¬ˆ¦õ±ð†üð†üÎþø2„2¸—üõ¦õ§‹‹†øèð†üÎþ2ˆ¦õ™‹ñÎþø0؆ƒš‘21*1Ô1"ìþ³˜ƒ‹†øðò†ƒùôüþÊð†ƒù膃ˆñð†ƒùà†ƒˆñð†üð†üò†ƒùôüþ,–ð.ˆèÐèèÄèèèÁû¦Ö*H¦õ§‹‹+ô+ „ŒþŠ+à+LŠþŠþŠŒ‚䄸À„øèð†üÎþ)|‚ˆ¦õ§‹ñð†üÎþ(p‚ˆ¦õ)@þ’ìð†üð†üð†üÎþ'ˆ¦õ¯þþ膋ñÎþøÞ†ƒ‹'xê„Þ4›‘'@&tŽŒþŠšŒ‚ä„ò„ø%ÄŽŒþŠšŒ‚ä„ò„øÌŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ!<ŽŒšŒ–#`Œ–†øî"ô„Œ–†øî"„Œ–ªŒþІøÆ„ŒþІøæîä„ò„øîä„ò„øÞ€ öõÌ ˆèèÖð·èÖ·èÖÄèèÖÞvôò‚ÞFþ³$ˆ¦õ§‹ñð†üÎþøD†ˆžþŠšŒ‚ä„ò„øÚöp†ˆžþŠšŒ‚ä„ò„øÚö÷ЄúŒ—ü6–Züõ›‹‹ò„øèˆ†‹‹˜ê„øèÖþBÈèèèèèèè:û²ò‚ž–üõ›Ћ‹ò„øè@†‹‹˜ê„øèÖþªhèèèÜèèèpèèè¢û²ò‚ .–züõ›8‹‹ò„øè¨†‹‹˜ê„øèÖþ :Ðè 2û²ò‚ –– üõ› È‹‹ò„øè 8†‹‹˜ê„øèÖþ ¢ è šû²ò‚&– rüõ› 0‹‹ò„øè  †‹‹˜ê„øèÖþ2Èè*û²ò‚¶–üõ›À‹‹ò„øè0†‹‹˜ê„øèÖþÂXèºû²ò‚¶–êüõ›˜üð†üË˜ê„øÔþÂXèÜèèºû²ò‚ý¾–"üõ›¯üà†‹ñÖþýÊÿ¨èÜèÐèôýÂû¦û¦–ðý0èÐèèûªû²ò‚Öúœ¦õ§‹‹˜ê„øèð†üÎþùà‚ˆ¦õ§üð†üÎþù8‚ˆ¦õ§üð†üÎþøt‚ˆ¦õµüð†üð†üÎþ÷܈¦õ™‹ñÎþøô†ƒ‹þŠŒ–÷tŒ–†øî÷„Œ–†øîôЄŽöÄ–†øîôð˜öH––†øîõ˜¾þ–õH––†øîô¼„øî䄸èðh†ƒ‹þŠŒ–óÀŒ–†øîóT„Œ–†øîñ„Žó–†øîñ<˜ò”––†øîñh˜¾þ–ñ”––†øîñ„øî䄸èì´†ƒ‹þŠŒ–𠌖†øîï „Œ–†øîíh„Žï\–†øî툘îà––†øîí´˜¾þ–íà––†øîíT„øî䄸è醃‹þŠŒ–ìXŒ–†øîë섌–†øîé´„Ž먖†øîéÔ˜ë,––†øî꘾þ–ê,––†øîé „øî䄸èåL†ƒ‹þŠŒ–褌–†øîè8„Œ–†øî愎çô–†øîæ ˜çx––†øîæL˜¾þ–æx––†øîåì„øî䄸èᘆƒ‹þŠŒ–äðŒ–†øîä„„Œ–†øîâL„Žä@–†øîâl˜ãÄ––†øî☘¾þ–âÄ––†øîâ8„øî䄸èð†ƒùð†ƒùÞ̆ƒ‹ªŒ–጖†øîà˜„Œ–†øî߸„Œ–ªŒþІøÆ„ŒþІøæîä„ò„øîÜ„ê„øðò†ƒùôüþÀÝp†ƒ‹þŠþŠŒ‚䄸àÜІƒ‹þŠþŠŒ‚䄸àÜ0†ƒ‹þŠþŠŒ‚䄸àÛ†ƒ‹þŠþŠŒ‚䄸àÚð†ƒ‹þŠþŠŒ‚䄸àÚP†ƒ‹þŠþŠŒ‚䄸àÖœ†ƒ‹þŠŒ–ÙôŒ–†øîÙˆ„Œ–†øî×P„ŽÙD–†øî×p˜ØÈ––†øîל˜¾þ–×È––†øî×<„øî䄸èÒ膃‹þŠŒ–Ö@Œ–†øîÕÔ„Œ–†øîÓœ„ŽÕ–†øîÓ¼˜Õ––†øîÓ蘾þ–Ô––†øîÓˆ„øî䄸èÏ4†ƒ‹þŠŒ–ÒŒŒ–†øîÒ „Œ–†øîÏ脎ÑÜ–†øîИÑ`––†øîÐ4˜¾þ–Ð`––†øîÏÔ„øî䄸è&œ†ƒ‹þŠËØŒ–ÎØŒ–†øîÎl„Œ–†øîÌ4„ŽÎ(–†øîÌT˜ͬ––†øîÌ€˜¾þ–̬––†øîÌ „øîÜ„&Л‘Ë ÞŽÞŽÞŽ'$ÈÜÊÔò„ÈØ¬ʬގގގÉ(ùÊÈêþ³Éðƒùð†ƒù膃ˆñ膃ùò†ƒùôüþÆx„Èœò„Æ|¬ÈtÞŽÞŽÞŽÆÌùÇÌÆŽþ³Ǹƒùð†ƒùð†ƒùΆƒ‹þІøèò†ƒùôüþÃì„Æ@ò„Ãð¬ÆÞŽÞŽÞŽÄ@ùÅpÄþ³ÅLƒˆñð†ƒù膃ˆñƆƒˆ‹þІøàò†ƒùôüþÀ$„ô̄Œšò„ò„øÀ(¬Ã@ÞŽÞŽÞŽÀxù˜ò‚ò‚À:þ³ÂTƒù†ƒˆ‹šò„ò„øè†ƒˆ‹šò„ò„øèÀÀ†ƒ‹ªê„ê„øðò†ƒùôüþ'($ˆ–¿ÈŒ–†øî¿\„Œ–†øî½$„Ž¿–†øî½D˜¾œ––†øî½p˜¾þ–½œ––†øî½„(\²Ò‘³¸Œ¸è–½¹›‘º´Œ¼@¼–†øîÀ––†øîºÈ˜»ì–†øîºô˜¼–†øîÀ––†øîº°Þ޹RºX¹"þ³º†þøÎ†ƒ‹þІøèò†ƒùôüþ¸ì³Ì˜µ–¸Ðµ(›‘¶DŒ·¸ ¼–†øîÀ––†øî·˜¼–†øîÀ––†øî¶X–––†øîƵj¶µ:þ³˜†þøò†ƒùôüþµ³ø˜´°–†øî´$––†øî³´²Þ³„²®þ³˜†þøò†ƒùôüþ°^²²LŒþ°Ü¬²þ±,ù±Üò‚°îþ³˜†þøò†ƒùôüþ°j­°:þ³Œƒùôüþ(’®T¯øÜ„܄ꄮP¨ù¯8®bþ³˜†þøò†ƒùôüþ¬h„®܄܄ꄬl¨ù­T¬~þ³˜†þøò†ƒùôüþª„„¬0܄܄ꄪˆ¨ù«pªšþ³˜†þøò†ƒùôüþ(žª0ˆ–†øîîÊŠˆ–†øîî§hŠŠ©p–†øî§Œ˜¨ô––†øî§¸˜¨tþ–§ä––†øî§lò‚(nþ³§†þøò†ƒù(Èüþ8¦àƒù7D¦Èƒù6Ô¥PƒŽúþŸ¦°ƒùꆆö¥¬†ˆ¦õ·ä†‹Ø’ÍþøôüþÞ6Ð¥8ƒù6À¥ ƒù6€¥ƒù5T¤ðƒù50¤Øƒù4túPƒšz줔ò„ò„z謤XÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ{8þ¡&õŸ´ ¸èÜè֞طèÖü·èÖP«Êœ¤«Ê›ø«Ê›L«Ê˜HšäèèèÐèèèÜè˜P{*˜4ò‚{úþ³˜üÞ†”þò„þö—†ˆ¦õ§‹ñð†üÎþø•è„–€ˆ¦õ™üïßþ•ôˆ¦õ™üïßþø”È„•`ˆ¦õ™üïßþ”Ôˆ¦õ™üïßþø’„”$ˆ¦õ§üð†üïßþ“x‚ˆ¦õ§üð†üïßþ’´‚ˆ¦õµüð†üð†üïßþ’ˆ¦õ™‹ñïßþøŽ\†ƒ‹þŠŒ–‘´Œ–†øî‘H„Œ–†øî„Ž‘–†øî0˜ˆ––†øî\˜¾þ–ˆ––†øîŽü„øî䄸èЍ†ƒ‹þŠŒ–ŽŒ–†øî”„Œ–†øî‹\„ŽP–†øî‹|˜ŒÔ––†øî‹¨˜¾þ–‹Ô––†øî‹H„øî䄸è†ô†ƒ‹þŠŒ–ŠLŒ–†øî‰à„Œ–†øî‡¨„މœ–†øî‡È˜‰ ––†øî‡ô˜¾þ–ˆ ––†øî‡”„øî䄸èƒ@†ƒ‹þŠŒ–†˜Œ–†øî†,„Œ–†øîƒô„Ž…è–†øî„˜…l––†øî„@˜¾þ–„l––†øîƒà„øî䄸茆ƒ‹þŠŒ–‚䌖†øî‚x„Œ–†øî€@„Ž‚4–†øî€`˜¸––†øî€Œ˜¾þ–€¸––†øî€,„øî䄸è{؆ƒ‹þŠŒ–0Œ–†øî~Ä„Œ–†øî|Œ„Ž~€–†øî|¬˜~––†øî|ؘ¾þ–}––†øî|x„øî䄸è膃ù膃ùò†ƒùôüþQä„z¬ò„ò„Qè¬zpÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽR8þw>õuÌvÐèÜèÖtð·èÖt·èÖsPõrŒõqà«Êq4«Êo pÌèèèÜèo(R*o ò‚Rúþ³nÔˆþön†ˆ¦õ§‹ñð†üÎþølè„m€ˆ¦õ™üïßþlôˆ¦õ™üïßþøkÈ„l`ˆ¦õ™üïßþkÔˆ¦õ™üïßþøi„k$ˆ¦õ§üð†üïßþjx‚ˆ¦õ§üð†üïßþi´‚ˆ¦õµüð†üð†üïßþiˆ¦õ™‹ñïßþøe\†ƒ‹þŠŒ–h´Œ–†øîhH„Œ–†øîf„Žh–†øîf0˜gˆ––†øîf\˜¾þ–fˆ––†øîeü„øî䄸èa¨†ƒ‹þŠŒ–eŒ–†øîd”„Œ–†øîb\„ŽdP–†øîb|˜cÔ––†øîb¨˜¾þ–bÔ––†øîbH„øî䄸è]ô†ƒ‹þŠŒ–aLŒ–†øî`à„Œ–†øî^¨„Ž`œ–†øî^Ș` ––†øî^ô˜¾þ–_ ––†øî^”„øî䄸èZ@†ƒ‹þŠŒ–]˜Œ–†øî],„Œ–†øîZô„Ž\è–†øî[˜\l––†øî[@˜¾þ–[l––†øîZà„øî䄸èVŒ†ƒ‹þŠŒ–Y䌖†øîYx„Œ–†øîW@„ŽY4–†øîW`˜X¸––†øîWŒ˜¾þ–W¸––†øîW,„øî䄸èR؆ƒ‹þŠŒ–V0Œ–†øîUÄ„Œ–†øîSŒ„ŽU€–†øîS¬˜U––†øîSؘ¾þ–T––†øîSx„øî䄸è膃ù膃ùò†ƒùôüþ(ä„Q¬ò„ò„(è¬QpÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ)8þN>õLÌMÐèÜèÖKð·èÖK·èÖJh«ÊI¼«ÊHøõH4õF GÌèèèÜèF()*F ò‚)úþ³EÔˆþöE†ˆ¦õ§‹ñð†üÎþøCè„D€ˆ¦õ™üïßþCôˆ¦õ™üïßþøBÈ„C`ˆ¦õ™üïßþBÔˆ¦õ™üïßþø@„B$ˆ¦õ§üð†üïßþAx‚ˆ¦õ§üð†üïßþ@´‚ˆ¦õµüð†üð†üïßþ@ˆ¦õ™‹ñïßþø<\†ƒ‹þŠŒ–?´Œ–†øî?H„Œ–†øî=„Ž?–†øî=0˜>ˆ––†øî=\˜¾þ–=ˆ––†øî<ü„øî䄸è8¨†ƒ‹þŠŒ–<Œ–†øî;”„Œ–†øî9\„Ž;P–†øî9|˜:Ô––†øî9¨˜¾þ–9Ô––†øî9H„øî䄸è4ô†ƒ‹þŠŒ–8LŒ–†øî7à„Œ–†øî5¨„Ž7œ–†øî5Ș7 ––†øî5ô˜¾þ–6 ––†øî5”„øî䄸è1@†ƒ‹þŠŒ–4˜Œ–†øî4,„Œ–†øî1ô„Ž3è–†øî2˜3l––†øî2@˜¾þ–2l––†øî1à„øî䄸è-Œ†ƒ‹þŠŒ–0䌖†øî0x„Œ–†øî.@„Ž04–†øî.`˜/¸––†øî.Œ˜¾þ–.¸––†øî.,„øî䄸è)؆ƒ‹þŠŒ–-0Œ–†øî,Ä„Œ–†øî*Œ„Ž,€–†øî*¬˜,––†øî*ؘ¾þ–+––†øî*x„øî䄸è膃ù膃ùò†ƒùôüþû4„(¬ò„ò„û8¬(pÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽûˆþ%>õ#Ì$ÐèÜèÖ"ð·èÖ"·èÖ!Põ ŒõÈõõÊõûzŒò‚ûJþ³¼ˆ¦õ§‹ñð†üÎþø„(ˆ¦õ™üïßþœˆ¦õ™üïßþøp„ˆ¦õ™üïßþ|ˆ¦õ™üïßþø¸„̈¦õ§üð†üïßþ ‚ˆ¦õ§üð†üïßþ\‚ˆ¦õµüð†üð†üïßþĈ¦õ™‹ñïßþø†ƒ‹þŠŒ–\Œ–†øîð„Œ–†øî¸„ެ–†øîؘ0––†øî˜¾þ–0––†øî¤„øî䄸èP†ƒ‹þŠŒ–¨Œ–†øî<„Œ–†øî„Žø–†øî$˜|––†øîP˜¾þ–|––†øîð„øî䄸è œ†ƒ‹þŠŒ–ôŒ–†øîˆ„Œ–†øîP„ŽD–†øîp˜È––†øîœ˜¾þ–È––†øî<„øî䄸è 膃‹þŠŒ– @Œ–†øî Ô„Œ–†øî œ„Ž –†øî ¼˜ ––†øî 蘾þ– ––†øî ˆ„øî䄸è4†ƒ‹þŠŒ– ŒŒ–†øî „Œ–†øî脎Ü–†øî˜`––†øî4˜¾þ–`––†øîÔ„øî䄸èü(†ƒ‹þŠŒ–ØŒ–†øîl„Œ–†øîüÜ„Ž(–†øîüü˜¬––†øîý(˜,þ–ýT––ý¨Α<ŒL¼–†øîÀ––†øîP˜¼–†øîÀ––†øîÆÞŽÚàªþ³œ†þøÎ†ƒ‹þІøèò†ƒùôüþýÞ‘þÄŒÿä¼–†øîÀ––†øîþؘÿ–†øîÿ––†øîÆýêþýºþ³˜†þøò†ƒùôüþý„üÈ„øî䄸è膃ù膃ùò†ƒùôüþú–û ò‚ò‚úfþ³ŒƒùôüþÊ4dú8ƒù3ú ƒù2ôúƒù2¨ùðƒù1àù؃ù1ØøÌƒš†ù¸øâþ³˜†þøò†ƒùôüþÊ.äø´ƒù.(øœƒù-Ìø„ƒù-8ølƒù,„⌃šöHø(܄܄ê„ê„öD¨ù÷Dò‚öVþ³˜†þøò†ƒùôüþô „ö܄܄ê„ê„ô$¨ùõ$ò‚ô6þ³˜†þøò†ƒùôüþñè„óè܄܄ê„ê„ñì¨ùóò‚ò‚ñþþ³˜†þøò†ƒùôüþï°„ñ°Ü„Ü„ê„ê„ï´¨ùðÌò‚ò‚ïÆþ³˜†þøò†ƒùôüþíx„ïx܄܄ê„ê„í|¨ùî”ò‚ò‚íŽþ³˜†þøò†ƒùôüþâÒí$ˆ–†øîîä\Šˆ–í䨛‘åÄŒþ––ìtŒ–†øîÜ„æ,êú‘ëàŠ–†øîòëë¬êÖþ³˜†þøò†ƒùôüþæb‘êÀÞŽæ€è(êDò„è$¬êÞŽètùéÄèBúþ³é(ˆ¦õ™‹àßþøö†üÖ†šê„þöò†ƒùôüþæn缈–†øîîò‚æJúþ³¬ˆ¦õ™‹çþøê††öò†ƒùôüþåÀäêåäºþ³˜†þøò†ƒùôüþä„îãXŠˆ–²ŒþІø㬄ŒþІøæîîò‚ò‚â¢þ³ŒƒùôüþÊ,|âtƒù+Ðâ\ƒù+P9ƒߎ‘àtŒâ –†øîàˆ˜á¼–†øîà´˜ál–†øîàà––†øîàpßšà@ßjþ³˜†þøò†ƒùôüþØF‘Ù,Š––ßDÙ”›‘Ú°ŒÞø–†øîÚÄ––ÞÐÛÝF‘Þ,Š–†ŒþІøæîòÝRÝøÝ"þ³˜†þøò†ƒùôüþÛN‘Ü4ŒÜÔ–†øîÜH––†øîÜÛZÜÛ*þ³˜†þøò†ƒùôüþÚôÜÙÖÚ|Ù¦þ³˜†þøò†ƒùôüþÙpÜØRØøØ"þ³˜†þøò†ƒùôüþÅb‘ÆHŠ˜Ϙ–Ø ÏÀÖ‚‘×hŠ–†ŒþІøæîòÖŽ×4Ö^þ³˜†þøò†ƒùôüþÕ‘Õ슖†øîòÕÕ¸Ôâþ³˜†þøò†ƒùôüþÓV‘Ô<Š–†ŒþІøæîòÓbÔÓ2þ³˜†þøò†ƒùôüþѦ‘ÒŒŠ–†ŒþІøæîòѲÒXÑ‚þ³˜†þøò†ƒùôüþÏö‘ÐÜŠ–†ŒþІøæîòÐШÏÒþ³˜†þøò†ƒùôüþÏœƈ˜ÌP–Ï€ÌxÎ*‘ÏŠ–†øîòÎ6ÎÜÎþ³˜†þøò†ƒùôüþÌ®‘Í”Š–†øîò̺Í`ÌŠþ³˜†þøò†ƒùôüþÌTÆ´––Ì(ÇÊž‘Ë„Š–†ŒþІøæîòʪËPÊzþ³˜†þøò†ƒùôüþÈî‘ÉÔŠ–†ŒþІøæîòÈúÉ ÈÊþ³˜†þøò†ƒùôüþÇ>‘È$Š–†ŒþІøæîòÇJÇðÇþ³˜†þøò†ƒùôüþÆäÆDÅnÆÅ>þ³˜†þøò†ƒùôüþò‘Ä˜Š–†ŒþІøæîòþÄdÃŽþ³˜†þøò†ƒùôüþRª‘SŠ–Ã4ŒþІøSÌXV‘Y<Š˜Á8–à Á`›‘Â|Œþ–ÞÁ¢ÂHÁrþ³˜†þøò†ƒùôüþÁ<Y|˜¿8–Á ¿`›‘À|Œþ–Þ¿¢ÀH¿rþ³˜†þøò†ƒùôüþ¿<Y¨˜¼à–¿ ½›‘¾$Œþ˜þ–ȽJ½ð½þ³˜†þøò†ƒùôüþ¼äYÔ˜¼–†øîZ˜·ü–¼x¸$º®‘»”Š––˜ŒþІøØ„øîܺº»`ºŠþ³˜†þøò†ƒùôüþ¸Z¹(º@‹þ¹$¨ùº$ò‚¹6þ³˜†þøò†ƒùôüþ¸f¹ ¸6þ³˜†þøò†ƒùôüþ¸Z,˜µ¼–·äµä›‘·Š––˜ŒþІøØ„øîܶ&¶Ìµöþ³˜†þøò†ƒùôüþµÀZX˜³|–µ¤³¤›‘´ÀŠ––˜ŒþІøØ„øîܳ洌³¶þ³˜†þøò†ƒùôüþ³€Z„˜°ˆ–³d°°›‰±æüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ°ò±˜°Âþ³˜†þøò†ƒùôüþ°ŒZ°˜ª4–°pª\›‰®òüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ­6†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ«††üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþªž«Dªnþ³˜†þøò†ƒùôüþª8ZÜ––ª [0†B‘‡(Š––©è‡¨‘©Š––˜ŒþІøØ„øîܨ*¨Ð§úþ³˜†þøò†ƒùôüþ‰Þ‘ŠÄŠ––¥˜ŒþЧ䥼›‘§Ð¦¦ §¨¦œ¬§”¦ìù§d¦®þ³˜ƒùò†ƒùôüþ¥þ¦„¥Îþ³˜ƒùò†ƒùôüþ¥l„‹,¦‘¥`²¥0‚þ³˜ƒ‹þФìŒþІøØ„Ž<›‘¤´Ž£p¤Œò„£l¬¤d£¼ù¤4£~þ³˜ƒùò†ƒùôüþŽ~£Tò‚ŽNþ³˜ƒ‹þŠ¢èŒþІø„ŒþŠ¢Ä<žæ‘¢°Ÿ ø¢LŒþ ô¬¢8¡Dù¢ò‚¡þ³˜ƒ‹þІøèò†ƒùôüþŸŒ„ Ð‰Ÿ¬ ¼Ÿàù ŒŸ¢þ³˜ƒ‹þІøèò†ƒùôüþžòŸxžÂþ³˜ƒùò†ƒùôüþr‘ž¬~ž|Nþ³˜ƒ‹þІŒþŠ•øŒþŠ˜TŒþŠž\˜xœJ‘žHœhž ¬ž TùÜþ³˜ƒˆñò†ƒùôüþœVœìœ&þ³˜ƒˆñò†ƒùôüþ˜®‘œ˜ÌšŒ›¬Œþšˆ¬›˜šØù›hò‚ššþ³˜ƒùò†ƒùôüþ™T„šd‰™X¬šP™¨ùš ™jþ³˜ƒùò†ƒùôüþ˜º™@˜Šþ³˜ƒùò†ƒùôüþ–›‘˜@–p—˜‰–ü¬—ô—Lù—Ä—þ³˜ƒùò†ƒùôüþ–^–ä–.þ³˜ƒùò†ƒùôüþ<›‘•䔤•¬‰” ¬•˜”ðù•h”²þ³˜ƒùò†ƒùôüþ“p„”€‰“t¬”l“Äù”<“†þ³˜ƒùò†ƒùôüþ’D„“T‰’H¬“@’˜ù“’Zþ³˜ƒùò†ƒùôüþ‘„’(‰‘¬’‘lù‘ä‘.þ³˜ƒùò†ƒùôüþ~‘Nþ³˜ƒùò†ƒùôüþèò†ƒùôüþèò†ƒùôüþŽ ò†ƒùôüþ‹bŒHlꄌD¨ù,ŒVþ³˜†þøò†ƒùôüþ‹nŒ,ò‚‹>þ³˜†þøò†ƒùôüþ‹Ü‰êЉºþ³˜†þøò†ƒùôüþ‡Æ‘ˆ¬Œ‰`þ’ˆÀ˜þ’̇҈x‡¢þ³˜†þøò†ƒùôüþ‡l܆N†ô†þ³˜†þøò†ƒùôüþ|F‘†|X„¦üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþƒ†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþš†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ€†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ~š†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ}†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ|R|Ø|"þ³˜ƒùò†ƒùôüþrJ‘| r\zªüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþy†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþwž†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþv†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþtž†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþs†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþrVrÜr&þ³˜ƒùò†ƒùôüþ‰p¦üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþnê†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþm:†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþkІüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþiÚ†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþh*†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþfz†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþdʆüìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþc†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþaj†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ_º†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ^ †üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ\Z†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþ\þ³˜†þøò†ƒùôüþ[ Y8XbYX2þ³˜†þøò†ƒùôüþT‰V²üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþTö†üìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþTT´SÞþ³˜†þøò†ƒùôüþS¨òR¶S\R†þ³˜†þøò†ƒùôüþOæ‘RpPPÄRHê„Ü„PÀ¬QÐQùQ ò‚PÒþ³˜ƒùò†ƒùôüþOòP¨ò‚ò‚OÂþ³˜ƒùò†ƒùôüþNž‘O„þNªOPNzþ³˜†þøò†ƒùôüþ<‘Nd<<MLN‰MH¨ù»MZþ³˜üò†ƒùôüþ<0Kþüìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþJr†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþHò†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþGr†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþEò†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþDr†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþBò†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþAr†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ?ò†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ>r†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ<ò†üìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ<*<°;úþ³˜ƒùò†ƒùôüþ;*†;Ü;þ³˜†þøò†ƒùôüþ:6†:è:þ³˜†þøò†ƒùôüþ9B†9ô9þ³˜†þøò†ƒùôüþÊ(ðøþ(8îò‚&âþ³'èƒùð†ƒù膃ˆñ膃ùò†ƒùôüþ& è†ƒùò†ƒùôüþ%¨Öþ#Æ$äèè#¾û¾ò‚ò‚ ®–"úüõ›#œüè†üà†‹ñÖþ º"€ÐÄ ²û²ò‚b–îüõ› üè†üà†‹ñÖþntÐÄÜÐÄDfû²ò‚F–¢üõ›Düè†üà†‹ñÖþR(èJû²ò‚–¢üõ›¯üà†‹ñÖþàÜèÜèèû²ò‚†–:üõ›ðüð†üð†üÕþІøÌþ’ÀÐÐÜèÈôÜèŠû¦V–²üõ›hüð†üð†üÕþІøÌþb8èZû¦ –žüõ›8üð†üÕþІøÌþ  ÜÜèÜèè û¦ j–ð LèèÁû¦Ö „¦õ§‹‹†øèð†üÎþ¸‚ˆ¦õ§üð†üÎþ ˆ¦õ™‹ñÎþøÖ†ƒ‹þІøèÖ†ƒ‹þІøèÖ†ƒ‹þІøèð†ƒùↈþöò†ƒùôüþúz‘4ÞŽÞŽÞŽÞŽÞŽÞŽú ¨ÜÊþš  èè(þšõþšõþšþüõþšú†þèúbüþÔúVþ³ýœþ,ˆ¦õ£ð†üïßþý ˆ¦õ™üïßþøý†ˆ¦õ™üïßþøü †ˆ¦õ¯Žþðð†üç’Íþøû@†ˆ¦õ¯‹ñ膋ñÎþøð†ƒùÚ†ˆ‰õöò†ƒùôüþú@ÞŽÞŽÞŽÞŽÞŽÞŽîœøø´ÜÊþšö,÷èèö4þšõ õþšôõþšóõþšî’òôînüòàîbþ³ñ¨ò8ˆ¦õ£ð†üïßþñ¬ˆ¦õ™üïßþøñ †ˆ¦õ™üïßþøð,†ˆ¦õ¯Žþðð†üç’ÍþøïL†ˆ¦õ¯‹ñ膋ñÎþøð†ƒùÚ†ˆ‰õöò†ƒùôüþà–‘îLÞŽÞŽÞŽÞŽÞŽÞŽÞŽà¬ëjì˜èÐÜÊþšèÀê„ÄèèèèèÈþšç´õþšæ¨õþšåœõþšà¢åˆà~üåtàrþ³ä<ä̈¦õ£ð†üïßþä@ˆ¦õ™üïßþøã †ˆ¦õ™üïßþøâÀ†ˆ¦õ¯Žþðð†üç’Íþøᤆˆ¦õâŽþðà†‹ñ膋ñÎþøð†ƒùö†üàø†¤Œþô℉õöò†ƒùôüþÉ‚‘߈Žà\ò„ò„ò„Àú›Ÿì†ÞpŽŽß`ò„ò„ò„Àú›Ÿì†ÞHŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÜ ŽŒ¶ò„ê„ò„ò„øɘÚ¾Û\Ú¨þ¾ò‚ò‚ò‚לÚ ÐèØ Üפþ¾ò‚ò‚ò‚Ö`×LÖhþ¾ò‚ò‚ò‚Õ ÖÕþ¾ò‚ò‚ò‚Ò8ÔÐèÒ@þ¾ò‚ò‚ò‚ϬÑèИôÏ´þ¾ò‚ò‚ò‚ÉŽÏ˜à†Œ†øòò‚ò‚Éjúþ³Ï$üΆ¸þ΄‰‹ò„øìöÍD„Í숦õ£ð†üïßþÍPˆ¦õ¡üç’ÍþøÌ †ˆ¦õ¡üç’ÍþøË솈¦õ©üß’ÍþøÊ„Ë8ˆ¦õ§‹ñð†üÎþÊœˆ¦õ™‹ñÎþøÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþ¶R‘ÉHÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ¶hžÆìÐÜŨþ²ò‚ò‚äÅ èÐÜìþ²ò‚ò‚À ÂÜèÂÄèÀ¨þ²ò‚ò‚¿dõþ²ò‚ò‚¾(õþ²ò‚ò‚¼ìõþ²ò‚ò‚¶^¼¼Œ†øòò‚ò‚¶:ü¼p¶.þ³¼hü»Ä†¸‰õ΄‰‹ò„øìöºˆ„» ˆ¦õ£ð†üïßþº”ˆ¦õ™üïßþø¹ô†ˆ¦õ™üïßþø¹†ˆ¦õ¯‹ñð†üç’Íþø·`„¸4ˆ¦õµ‹ñð†üð†üÎþ·lˆ¦õ¯‹ñ膋ñÎþøÔ†ƒ‹ò„øð膃ù膃ùò†ƒùôüþgŠ‘µè†ØŽÞŽÞŽÞŽg ´n·´X²´³ÐèÐèÖgŽòúþ³±¬ˆ¦õµ‹‹ò„øèð†üð†üÎþøö†ü±†”‰‹ò„øìò„þö°d†ˆ¦õ™‹ñïßþøò†ƒùgÀüþš°Hüö†üò„†üüö†üꄎú‚ú‚üüò†ƒùö†üö†üö†üö†üö†üò†ƒùgà­F‰®î±òÙìþ«Œƒùôüþ®:†±òÙìþ«Œƒùôüþ­R½Œ†øòò‚­"þ³Œƒùôüþ«‰¬ª±òÙìþ«Œƒùôüþ«ö†±òÙìþ«Œƒùôüþ«½Œ†øòò‚ªÞþ³Œƒùôüþ¨Z‰ªR»ò„òÙìþ«Œƒùôüþ©Š†»ò„òÙìþ«Œƒùôüþ¨f©,Œ†øò؆Œ†øòò‚¨6þ³Œƒùôüþ¥²‰§ª»ò„òÙìþ«Œƒùôüþ¦â†»ò„òÙìþ«Œƒùôüþ¥¾¦„Œ†øò؆Œ†øòò‚¥Žþ³Œƒùôüþ£ ‰¥»ò„òÙìþ«Œƒùôüþ¤:†»ò„òÙìþ«Œƒùôüþ££ÜŒ†øò؆Œ†øòò‚¢æþ³Œƒùôüþ b‰¢Z»ò„òÙìþ«Œƒùôüþ¡’†»ò„òÙìþ«Œƒùôüþ n¡4Œ†øò؆Œ†øòò‚ >þ³Œƒùôüþž‰ŸÆ±òÙìþ«ŒƒùôüþŸ†±òÙìþ«Œƒùôüþž*½Œ†øòò‚úþ³Œƒùôüþ›Ú‰‚±òÙìþ«ŒƒùôüþœÎ†±òÙìþ«Œƒùôüþ›æ½Œ†øòò‚›¶þ³Œƒùôüþ™–‰›>±òÙìþ«ŒƒùôüþšŠ†±òÙìþ«Œƒùôüþ™¢½Œ†øòò‚™rþ³Œƒùôüþ—R‰˜ú±òÙìþ«Œƒùôüþ˜F†±òÙìþ«Œƒùôüþ—^½Œ†øòò‚—.þ³Œƒùôüþh"‘—ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽØŽ‡ÑއÁއ‹þÈŽ‡ÑއPŽŒ”T‰á„‰Ù„Œþè„ò„€›‘“ÀÞŽÞŽÞŽÞŽÈÆ’Üööö„¾ìþ«‘܈¦õ·ä†‹Ø’Íþø|†ƒŠþŸ‘ăù膈¦õ·ä†‹Ø’ÍþøôüþÜð†üð†üð†üð†üò†ƒùôüþÂp‰óꆉóò‚ò‚ò‚’þ³ŽÔƒù膃ù膃ù膃ù膃ùò†ƒùôüþh8‹¢Œ ‹Œ´¦÷þ™üÎþΦò‚ƒø‹ŠtèÐèèèЈèè„´¦÷þ§‹‹‡|ò„…›‰†ò±òÙìþ«Œƒùôüþ†>†±òÙìþ«Œƒùôüþ…V½Œ†øòò‚…&þ³Œƒùôüþ„äð†üÎþΦò‚Xƒx‚èèÐèèèЀÀè`´¦÷þ§üð†üÎþΦò‚zx~Ø~HèÐèèèÐ| èèz€´¦÷þ§‹ñð†üÎþΦò‚xyàèèèx´¦õ™üïßþΦò‚shwvˆèÐèèètÀèsp´¦õ™üïßþΦò‚m´srˆqøèÐèèèpHÄèèèèôm¼´¦õ£ð†üïßþΦò‚i0lìèkÌi8´¦õ¯‹ñ膋ñÎþΦò‚h.hðŒ†øòò‚h §‰‹˜ê„øìÕþïþcî‘gPÞŽÞŽÞŽdf·fcúeäò‚cÊþ³eˆ¦õ¯‹ñ膋ñïßþøÖ†ƒ‹þІøè膃ù膃ùò†ƒùôüþX‘c´ÞŽÞިއb¬Ž‡‹þІøbDއ‹þІøÆŽØŽ‡ÑއX0^ŽaÐÄèèèè^xœ¦õ§üð†üïßþ[à^ ][蜦õµŽ†øðð†üð†üïßþXt[ÄÄÜôX|œ¦õY¸Ž†øðè†ü膋ñÍ•þІøÄþX&ò‚×þïþ;"‘WHÞŽVDŽŽ¾Àú›Ÿì†U„ŽŽ¾Àú›Ÿì†U\ŽTœŽŽ¾Àú›Ÿì†óTtŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ;8Q^·èÖPLPðèÊO@«ÊMtOMèôÖLh«ÊJœL0KôÖIx·èÖH<I@H°ÊG·èÖEÜFàFPÊDèEŒèÊ;.DÔ; úþ³DÌüÞ†”þò„þöCІˆ¦õ§üð†üïßþøC †ˆ¦õ§üð†üïßþøBp†ˆ¦õ§üð†üïßþøAÀ†ˆ¦õ§üð†üïßþøA†ˆ¦õ§üð†üïßþø?Ô„@lˆ¦õ£ð†üïßþ?àˆ¦õ™üïßþø>ˆ„?0ˆ¦õ£ð†üïßþ>”ˆ¦õ¡üç’Íþø=ô†ˆ¦õ™üïßþø=$†ˆ¦õ¯‹ñ膋ñÎþøð†ƒùð†üÖ†ƒ‹þІøèÖ†ƒ‹þІøèÖ†ƒ‹þІøèà†ƒ‹þðà†ƒ‹þðò†ƒùôüþ:¼Öþ8ò9øè8êû¦6Ž–7êüõ¦õ¯‹‹˜ê„øè膋ñÎþ6š7pèèÁû¦Ö2þ–52üõ›6(‹‹ò„øè̆ŽþŠò„øèË˜ê„øÔþ3 4¸ÜÜèè3û²ò‚.Þ–1ºüõ›2ˆ‹‹ò„øèĆ‹‹ò„øèçþÔþ.ê0øèÐèèè.âû¾ò‚ò‚+^–-ªüõ›.h‹‹ò„øè-؆‹‹˜ê„øèÖþ+j-èÐè+bû¾ò‚ò‚(–*:üõ›*ø‹‹ò„øè*h†‹‹˜ê„øèÖþ()èÐè( û²ò‚$þ–&Òüõ›'‹‹ò„øè'†‹‹˜ê„øèÖþ% &@è%û¾ò‚ò‚"–#Úüõ›$˜‹‹ò„øè$†‹‹˜ê„øèÖþ"*#Hè""û²ò‚ž– êüõ›!¨‹‹ò„øè!†‹‹˜ê„øèÖþª @èÐè¢û¾ò‚ò‚F–züõ›8‹‹ò„øè¨†‹‹˜ê„øèÖþRÐèÐèJû²ò‚>–üõ›Ћ‹ò„øè@†‹‹˜ê„øèÖþJ€èBû¾ò‚ò‚^–üõ›Ø‹‹ò„øèH†‹‹˜ê„øèÖþjˆèbû²ò‚ž–*üõ›è‹‹ò„øèX†‹‹˜ê„øèÖþª°è¢û¾ò‚ò‚–züõ›8‹‹ò„øè¨†‹‹˜ê„øèÖþè û²ò‚ þ–Òüõ›‹‹ò„øè†‹‹˜ê„øèÖþ @è û¾ò‚ò‚ – Úüõ› ˜‹‹ò„øè †‹‹˜ê„øèÖþ * Hè "û²ò‚– ¦üõ›‘‹ñÖþ&üÜû¦æ–züõ›µüð†üè†üÖþòèÐÜÜèêû¦²–Füõ›µüð†üè†üÖþ¾´ÐÜÜè¶û¦þ²–.üõ›§üè†üÖþþ¾lÜèÜèèþ¶û¦ý"–ýîüõ¦÷þ§‹‹†øèð†üÎþý.üû¦Öûà¦÷þ§‹‹†øèð†üïßþú€ˆû„÷þ™‹ñïúŒþ›‹¦÷þ™‹ñÎþÖð†üð†ƒùð†ƒùð†ƒùð†ƒùð†üð†üƆƒžþÝò†ƒùôüþøZ†üìþ«ŒƒùôüþņüìþïþöF‘÷,öRöüöJìþ³˜ƒ‹†øðò†ƒùôüþÊð†ƒùð†ƒù膃ˆñð†ƒùà†ƒˆñð†üð†üò†ƒùôüþòf‰ô±òÙìþ«ŒƒùôüþóZ†±òÙìþ«Œƒùôüþòr½Œ†øòò‚òBþ³Œƒùôüþ\ž‰ñʱòÙìþ«Œƒùôüþñ†±òÙìþ«Œƒùôüþ\ª½ŒðÌ]8¬ð¸ÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽ]„íöî”èíàþšì´íˆèì¼þšëìdèë˜þšå,ê8ÜÜè ÜÜçhÜÜÜèÐôå4þšá8äÜäLÐãèÜáÜôá@þšÚ¤àèàXߘèÄÞHèÜÝôÜèèÛ`Ú¬þšÑ@ÚTÙ¬ÐÐÜÄלèÜèÄèÕ\ÐÜÜÜèÐôÒÔèÄèèÑHþšÍÐðÐ`ÐÜÜÜèÐôÄèèÍ$þšÉ(ÌÌÄÜÜÜÜèÐôÄèèÉ0þšÆäÈØÐÇèèèÆìþšŨÆ|èŰþšÄlÅ@èÄtþšÃHÄèÃPþšÂ<õþš]€“âüìþ«Ádˆ¦õ·ä†‹Ø’Íþøö†ü¾X†“¿¿´Š–˜ÀЖ’êÀ ––’꿬¿ ¿”þøþ¾t¦õ§üð†üÎþøö†ü¼d†“¶½Š––’êʼüºþ¼€¦õ™üÎþø·´†“¶¸àŽ»ì–’ê¸ø»hšü–ü¸ô˜¹èü–¿’½üºtþþÌ—“¹ ––’—ӸظLºþ·Ð¦õ™üÎþø³h†“´>´ôŠ˜·Xˆ’¶È‚ˆ–’êê¶<‚ˆ–’êêµ<ü–¶ þþµX—ˆ™†ì†óÇêö´8´Ðøþøþ³„¦õ±ð†üð†üïßþø¯†“¯ò°¨Š˜³ ˆ’²|‚ˆ–’êê±ð‚ˆ–’êê°ðü–±Àþþ± —ˆ™†ì†óÇêö¯ì°„øþøþ¯8¦õ±ð†üð†üïßþøªœ†“«r¬(Š˜®Àˆ’­ü‚Цˆ’êØü–ü­p‚ˆ–’êê¬pü–­@þþ¬Œ—ˆ™ò†óÇêö«l¬þöøþª¸¦õµüð‚ð†üïßþø¨,†“¶©XŒª@ˆ’ê©tü–ºþþÆ—ˆ‘©P¨Äºþ¨H¦õ™üÎþø¤ †“¤â¥˜Œ§Ðˆ’§@‚ˆ–’êꦴ‚ˆ–’êꥴü–¦„þþ¥Ð—ˆ™†ì†¥¤Ü¥tøþøþ¤(¦õ±ð†üð†üÎþø¡†“¡Ö¢xŠ–˜£”–’ê¢ä––’ê¢p¡Ð¢Xþøþ¡8¦õ§üð†üÎþøž,†“žæŸˆŠ–˜ ¤–’êŸô––’ꟀžàŸhþøþžH¦õ§üð†üÎþø”´„—´“˜Ž™DŠ˜Ј’›(‚Šœ„›Dü–œ’œ´Š–––’Ꜭœ ºþ›ìþþ›`—“õ™üšŒ‚ˆ–’—ÓꙌü–š\þþ™¨—ˆ™ò†óÇêö˜ˆ™ öøþ—Ħõ¹ð‚ð†üçßþ”À“•~–0ø˜— ––’ê–L––’—Ó–•x–þøþ”Цõ¯üè†üÎþøð†üð†ƒùð†üð†üð†üò†ƒùôüþh^†üìþ«’Ј¦õ·ä†‹Ø’Íþøö†ü†“Ö‘xŒ’<–’ꑌ––’êÊБXþøþ8¦õ§üð†üÎþøŽ8†“¶dŠ––’êʎкþŽT¦õ™üÎþøŒT†“¶€Š––’êÊŒìºþŒp¦õ™üÎþø‡0†“¶ˆ\Šš‹°––’ꈠ‹–šü–üˆœ˜‰€ü–¿’½üŠ þþÌ—“ˆÈ––’êˆT‡Èºþ‡L¦õ™üÎþøƒh†“„>„ôŒ†Ôˆ’†p‚ˆ’êÊ‚ˆ’ê…ü–…àþþ…,—ˆ™†ì†óÇö„8„Ðøþøþƒ„¦õ±ð†üð†üïßþø †“€v,Œƒ ˆ’‚¨‚ˆ’êÊ‚ˆ’êHü–‚þþd—ˆ™†ì†óÇö€pøþøþ¼¦õ±ð†üð†üïßþø{€†“|V} ŒDˆ’~ˆ‚ˆ––’ê~(‚ˆ’ê}(ü–}øþþ}D—ˆ™ò†óÇö|P|ìþöøþ{œ¦õµüð‚ð†üïßþøy†“¶z<Œ{$ˆ’êzXü–ºþþÆ—ˆ‘z4y¨ºþy,¦õ™üÎþøuH†“vvÔŒx´ˆ’xP‚ˆ’êÊ‚ˆ’êvðü–wÀþþw —ˆ™†ì†vÌvv°øþøþud¦õ±ð†üð†üÎþør°†“sjt ŒtЖ’êt ––’êÊsdsìþøþr̦õ§üð†üÎþøp†“pÒqtŒr8–’êqˆ––’êÊpÌqTþøþp4¦õ§üð†üÎþøi<„l<“mm¼Œo¬ˆ’oH‚ˆ’nØ‚ˆ’—ÓmØü–n¨þþmô—ˆ™ò†óÇömm˜öøþlL¦õ±ð‚ð†üïßþiH“jj¸ø˜k”––’êjÔ––’—Ój jjˆþøþiX¦õ¯üè†üÎþøð†üð†ƒùð†üð†üð†üò†ƒùôüþ]zh]Jþ³g¬ˆ¦Øþøfð†ˆ¦õ§üð†üÎþøf\†ˆ¦õ™üÎþøeȆˆ¦õ™üïßþøe$†ˆ¦õ™üÎþødX†ˆ¦õ±ð†üð†üïßþøcŒ†ˆ¦õ±ð†üð†üïßþøbÀ†ˆ¦õµüð‚ð†üïßþøb,†ˆ¦õ™üÎþøa`†ˆ¦õ±ð†üð†üÎþø`°†ˆ¦õ§üð†üÎþø`†ˆ¦õ§üð†üÎþø^l„_0ˆ¦õ½üð‚ð†üç’Íþ^xˆ¦õ¯ü膋ñÎþøð†üð†ƒùð†üð†ü膃ùò†ƒùôüþÂò‚\zþ³ŒƒùôüþÀ膃ù膃ùò†ƒùôüþGΑ[PÞŽÞŽÞŽÞŽÞŽÞŽÞŽÞŽGäX.YDèÐèÊþšWWÀW$þšU˜VTèU þšTTÐèTþšR`S¬èÜèRhþšP¬QøèÜèP´þšO¸P\OÀþšN¬OhèN´þšGàNRüìþ«ŒƒùôüþGÚNG¶úþ³MüüÞ†”þò‚öLT„Lüˆ¦õ§üð†üÎþL`ˆ¦õ¡üçßþøK¤†ˆ¦õ£ð†üïßþøJô†ˆ¦õ£ð†üïßþøJD†ˆ¦õ£ð†üïßþøI„†ˆ¦õ«ð†üç’ÍþøHð†ˆ¦õ™üÎþøH0†ˆ¦õ«è†‹ñÎþøò†ƒùôüþ4ò‘F8Œª–†Œ’ŠþÒîÒô5DvEàDnìþ«¾ˆ¦õ·ä†‹Ø’ÍþøØ††þøò†ƒùôüþBʆDBÎìþ« ˆ¦õ·ä†‹Ø’Íþøö†üò†ƒùôüþ@æ†Bd@êìþ«A˜ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ?†@€?ìþ«?´ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ=†>œ="ìþ«=Ј¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ;:†<¸;>ìþ«;숦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ9V†:Ô9Zìþ«:ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ7r†8ð7vìþ«8$ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ5ކ7 5’ìþ«6@ˆ¦õ·ä†‹Ø’ÍþøÔ††þ›Ýò†ƒùôüþ4þ™ø×þïþ3ü–È14ù3 0öþ³2ȈþþøÐ†ˆþþøØ††þøØ††þøØ††þøò†ƒùôüþ/dý/àŠ0þ’/ð˜þ’Èò‚/.þ³Œƒùôüþ.î‘×þïþ.ò†ƒùôüþÐò†ƒùôüþ¾†üìþ«,ˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þø(Ć“®½Žü–ü—É(à¦÷áþø'0†“®½Š––üêà'L¦÷áþø%œ†“®½Š––üêà%¸¦÷áþø#¸†“®½Š–––þèêà#Ô¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøІ“®½üì¦÷áþø솓®½Š–––þèêà¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø@†“®½Š–––þèêà\¦÷áþø\†“®½Š–––þèêàx¦÷áþøØ††þøò†ƒùôüþþ†üìþ«¸ˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøl†“®½Žü–ü—Ɉ¦÷áþø¬†“®½Š–––üêÊȦ÷áþø솓®½Š–––üêʦ÷áþø†“®½Š–––þèêà$¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø †“®½ü <¦÷áþø<†“®½Š–––þèêàX¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þø†“®½Š–––þèêଦ÷áþøœ†“®½Š–ž–þèâฦ÷áþøØ††þøò†ƒùôüþëΆüìþ«øˆ¦õ·ä†‹Ø’ÍþøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøý¬†“®½Žü–ü—ÉýȦ÷áþøû솓®½Š–––üêÊü¦÷áþøù̆“®½Š––ž–þèâÊùè¦÷áþø÷膓®½Š–––þèêàø¦÷áþøØ††þøØ†ˆþþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøô†“®½üô¦÷áþøò†“®½Š–––þèêàò8¦÷áþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøîp†“®½Š–––þèêà÷áþøìl†“®½Š–žžþàâà숦÷áþøØ††þøò†ƒùôüþߊëŒßZþ³금¡ü¼þò„þò„þò„þò„þôãþøØ††þøØ††þøØ††þøØ††þøØ††þø謆ˆ¦÷‚ßþøè(†ˆ¦÷‚ßþø礆ˆ¦÷‚ßþøç †ˆ¦÷‚ßþøØ††þøæ(†ˆ¡ü¤þò„þò„þôãþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøㆈ¦÷‚ßþøã †ˆ¦÷‚ßþøØ††þøØ††þøØ††þøØ††þøØ††þøØ††þøàÀ†ˆ¦÷‚ßþøà,†ˆ¦÷‚ßþøØ††þøò†ƒùôüþ¹†‘ßDÞŽÞŽÞŽÞŽÞŽ¹œÜâÝÈÄÜÌþ¦ò‚ÚøÜDèÐèÛþ¦ò‚¹’Úäò‚¹núþ³º˜¼<—ü¿ž–ÁÒüõÚZ¯üà†‹ñÁ°þÑlÚPüÐÐÚ@üи×h—üØ*–ðÙ´èØ.û¦×x›¯üà†‹ñÖþøдÒ—üÔÎÖÖüõ›¯üà†‹ñÖþÔ®Ö,èÔ¦û¦ÒÒ–ðÔ,èÒÖû¦Ò ›¯üà†‹ñÖþøÁøøþ¿ªÁ(è¿¢û¦½V–ð¿èèÐèè½Zû²ò‚Ö¼L¦õ§‹‹˜ê„øèð†üÎþ»4‚ˆ¦õ¼‹ñà†‹ñð†üÎþºœˆ¦õ™‹ñÎþøö†üÞ†”þò„þö膃ù膃ùò†ƒùôüþ·2‰·æ¹ ·Þìþ«¦ˆ¦õ·ä†‹Ø’Íþøð†üò†ƒùôüþ·>­·þ³Œƒùôüþ²¶‰³j¶Ì³bìþ«¶ ˆ¦õ§ì†ëßþø³°„µ`ˆ¦õ§‹á†Êþ³¼“¾´ìŠ’—É´Xºþ³Ì¦õ™‹ñÎþøò†ƒùôüþ²Â­²’þ³Œƒùôüþ°ž‘²|°¼±L²T±H¬²@±˜ù²±Zþ³˜ƒùò†ƒùôüþ°ª±0°zþ³˜ƒùò†ƒùôüþ°8ò†ƒùôüþÊŸ€ø–‚‘žèÞŽÞŽÞŽÞŽ– œ8ž œ4¬ž ÞŽÞŽœ„ùŒœFþ³xƒù膃ˆñ膃ˆñ膃ùð†üò†ƒùôüþš4„œ$š8¬œÞŽÞŽšˆù›šJþ³›|ƒù膃ˆñ膃ˆñ膃ùð†üò†ƒùôüþ˜(„š(˜,¬šÞŽÞŽ˜|ù™”˜>þ³™€ƒù膃ˆñ膃ˆñà†ƒˆñð†üò†ƒùôüþ–Ž˜–^þ³—àƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðà†ƒ‹þðò†ƒùôüþ–ò†ƒùôüþÀÖþ’Ö”œèÐèè’Îû“Xò‚ò‚ò‚r–‘îüõ›’¬üà†‹ñð†üè†üÖþ~‘tèÐÜèvû²ò‚‡.–‰züõ›Š8‹„ŒÐŽþŸXƒùŽ|†ˆ¦õ·ä†‹Ø’ÍþøôüþŒêþŸŽ ƒù0†ˆ¦õ·ä†‹Ø’Íþøôüþ‹žþŸŒÀƒù‹ä†ˆ¦õ·ä†‹Ø’ÍþøôüþŠRþŸ‹tƒùŠ˜†ˆ¦õ·ä†‹Ø’ÍþøôüþÜà†‹ñð†üè†üÖþ‡:ˆèèèèèè‡2û²ò‚ƒ2–†nüõ›µ‹ñð†üè†üÖþƒ>…¬èèèèÜôÜèƒ6û²ò‚Ö–‚‚üõ›µüð†üè†üÖþâØèÐÜèÚû²ò‚|æ–ðHèÐÜÄ|êû¾ò‚ò‚|›½üè†üè†üÖþøkàøj"k(èèjû²ò‚gΖði hàÐgÒû¦fü¦õ§‹ˆéð†üÎþfˆ¦õµ‹á†ì†Êþøex†ˆ¦õ™Êþød䆈¦õ™Êþød4†ˆ¦õ§ì†ëßþøbØ„c€ˆ¦õ§‹á†Êþb䈦õ™‹bðþøôü]þŸbhƒùad†ˆ¦õb<ì†ìò†Êþø`´†ˆ¦õ“†Êþø` †ˆ¦õ™Êþø_p†ˆ¦õ§ì†Êþø^À†ˆ¦õ§ì†ëßþø]d„^ ˆ¦õ§‹á†Êþ]pˆ¦õ™‹]|þøôü\¼ò†ìò†Êþø[@†ˆ¦õ§ì†ÊþøZt†ˆ¦õµì†ì†ÊþøY`†ˆ¦õZdì†ä†‹á†ì†ÊþøX°†ˆ¦õ§ì†ÊþøW䆈¦õ¡ò†ÊþøM\†ˆ¦õ¡†‹úþŸW¼ƒùꆄ„þöꆄ‚öSð†„„‘úþŸWTƒùꆄ‚öꆄ‚öU`†„„‘úþŸVÜ„‚öꆆöU؆ˆ¦õ·ä†‹Ø’ÍþøôüþàöꆆöTh†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ„þöꆄ„þöQð†„„‘úþŸS”ƒùꆄ‚öꆆöRh†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆄ‚öOŒ†„„‘úþŸQ”ƒùꆄ‚öꆄ‚öꆄ‚öà†ˆþöP†ˆ¦õ·ä†‹Ø’ÍþøôüÞöꆄ‚öꆆöNl†ˆ¦õ·ä†‹Ø’Íþøôü†ÊþøL¬†ˆ¦õ§ì†ëßþøKP„Køˆ¦õ§‹á†ÊþK\ˆ¦õ™‹KhþøôüJ¨òê†Òö؆ˆþöE†ˆ›IœìòòEZŠúþŸI0ƒùꆄ‚öꆄ‚öꆄ‚öꆄ‚öꆄ„þöF˜†ˆ‰’úþŸHPƒùꆄ‚öꆆöG$†ˆ¦õ·ä†‹Ø’ÍþøôüÔöEȆˆ¦õ·ä†‹Ø’ÍþøôüEöB†ˆ›D¸†ìò†ìê†B¬†‹úþŸD,ƒùꆆöC(†ˆ¦õ·ä†‹Ø’ÍþøôüB€†Òöúþö„þúþö„þö„þúþúþö„þúþö„þúþøö„þüþüþö„þö„þö„þúþö„þö„þôˆüþö„þúþúþøö„þúþúþö„þö„þö„þö„þúþúþö„þúþö„þúþúþúþö„þúþö„þö„þúþúþö„þúþö„þúþö„þúþö„þúþúþö„þö„þúþö„þúþòŠþüþö„þúþö„þúþüüþö„þö„þö„þòŠþüþúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþúþôˆüþö„þö„þö„þôˆüþúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þö„þö„þøö„þúþö„þúþúþüüþö„þøúþö„þúþö„þö„þúþúþö„þòŠþüþö‚úþö„þö„þö„þúþö„þúþö„þö„þö‚úþö„þö„þúþö„þö‚úþö„þö„þúþúþúþö„þö„þö‚úþö„þúþö‚úþö„þö„þö„þö„þúþúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þøúþúþúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþúþðŒþþüþúþôˆüþúþö„þö„þúþö„þúþö„þö„þøö„þö„þúþö„þö„þúþö„þúþúþö„þúþôˆüþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þøúþúþö„þüþþüþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þøö„þö„þúþö„þö„þúþö„þøúþö„þö„þö„þö„þúþö„þúþö„þö„þúþúþö„þö„þö„þúþúþúþö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þúþö„þö„þö„þö„þö„þö„þúþúþòŠþüþö„þúþúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþúþúþúþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þüüþö„þö„þúþö„þúþúþúþö„þö„þúþúþö„þúþúþúþö„þúþö„þö„þö„þö„þúþö„þüþüþö„þö„þö„þúþö‚ö„þúþúþö„þúþö„þúþö„þö„þúþúþúþúþö„þö„þúþúþúþö„þúþö„þúþúþúþö„þúþö‚úþôˆúö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þö„þö„þö„þúþö„þö„þö„þö‚úþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþôˆüþö„þö„þúþö„þúþö„þö‚ö„þúþúþö„þúþúþúþö„þö‚úþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö‚ö„þö„þúþö„þö„þúþö„þö„þö„þö‚úþö„þö„þö„þüüþúþö„þö‚ö„þö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþúþôˆüþúþòŠþüþúþö„þö„þúþö„þö„þðŒþþüþúþö„þö„þúþö„þö„þúþö„þøúþúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þøö„þö„þüüþö„þö„þúþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þøúþö„þúþö„þö„þúþúþúþö„þúþö‚úþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þôˆüþúþö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þö‚úþö„þúþö‚úþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþúþö„þö„þúþøö„þúþö„þö„þúþö„þö„þö‚úþö„þö„þúþö„þúþúþö„þö„þúþö„þö‚úþö„þö„þö„þúþö„þö‚ö„þúþö„þö„þö„þúþúþö„þúþö„þúþüþþüþö„þúþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þúþúþúþö„þö„þøúþúþö„þö„þúþö„þüüþüþþüþúþúþö„þö„þúþúþö„þö„þö„þøö„þö„þö„þö„þúþö„þö‚úþö„þúþö„þö„þö‚øö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþúþúþúþö„þúþö„þö„þüúö„þö„þúþö„þö„þúþö„þö„þüüþö„þúþö„þúþúþúþö„þúþúþö„þúþö„þúþö„þö„þö‚úþö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þüüþúþúþúþøö‚úþö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþúþö‚ö„þúþúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþúþö„þøúþö„þúþúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþúþúþö„þúþúþö„þö„þúþö„þúþúþö„þúþúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþúþö‚ö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þøö„þö„þö„þúþö„þüþüþö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þö‚úþö„þö„þúþö„þúþö„þúþúþö„þúþö„þúþúþö„þö„þö„þö„þö„þúþôˆüþúþö„þö„þúþö„þö„þúþö‚úþö„þö„þúþö„þö„þö„þö„þøúþö„þö„þö„þøüüþö„þúþö„þúþúþúþö„þö„þúþôˆüþúþö„þö„þúþúþö„þö„þúþúþö„þúþö„þúþúþö„þúþö„þö„þúþö‚úþö„þö„þúþö„þö„þúþö„þö‚úþúþö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþòŠþüþúþö„þúþúþö„þö„þüüþúþúþö„þö„þúþö„þúþö„þøúþö„þö„þúþúþö„þö„þö„þö„þúþö„þö„þúþúþøö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö‚úþö„þö„þö„þúþúþö„þúþö„þö‚ö„þúþúþúþúþö„þö„þö„þö„þúþúþö‚úþö„þö„þúþö„þðŒþþüþøö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þúþúþö„þúþúþö„þö„þúþúþö„þö„þö„þúþúþö„þúþö„þö„þúþúþúþüüþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþúþö„þúþúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþúþúþúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþúþö„þö„þö„þö„þúþö‚úþúþö„þö„þúþö„þö„þö„þö„þúþðŒþþüþúþö„þøö„þö„þòŠþüþö„þúþúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþö„þúþö„þúþúþúþúþö‚úþö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þøö„þúþúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþúþøö„þö„þö„þúþö„þúþö„þúþö„þúþòŠþüþúþúþúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þøö„þö‚úþö„þúþö„þúþö„þúþö„þö„þö„þö„þö‚úþö„þúþö„þö„þö„þö„þúþö„þîŽþþþüþúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þö„þúþôˆüþö„þúþö„þúþö„þúþö„þö„þö„þúþúþö„þö„þúþúþúþö„þö„þö„þö„þö„þúþö‚úþö„þúþúþö„þúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þúþö‚úþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþúþö„þö„þö„þüüþúþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þøö„þö„þúþö„þö„þúþö„þúþö„þúþö„þøö„þö„þö„þö„þúþö„þúþö„þö„þö‚úþö„þúþö„þö„þúþøö‚ö„þúþö„þüüþö„þö„þö„þúþö„þö‚úþúþö„þúþúþúþö„þö„þö„þúþö„þö„þúþúþö„þúþúþö„þö„þøö„þö„þö„þö„þüþüþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö‚úþúþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö‚úþö„þö„þüþüþö„þúþö„þö‚úþö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö‚úþö„þö„þúþö„þö„þö‚øö„þö„þö‚úþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþúþúþúþúþö„þö‚ö‚úþö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þúþö„þö„þðŒþþüþúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þôˆüþøö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþúþö„þúþö„þö„þö„þøö„þö„þö„þòŠþüþøö„þö„þö„þúþö„þö„þö„þúþö„þúþúþúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þúþúþúþúþúþúþúþúþö„þö‚ö„þúþö„þüþþüþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þúþôˆüþúþö„þúþúþö„þúþö„þúþö„þúþö„þúþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþôˆüþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþö„þö„þòŠþüþúþö„þúþö„þòŠþüþö„þúþòŠþüþúþòŠþüþúþôˆüþúþö„þúþö„þúþúþúþö„þö„þúþúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þúþúþúþö„þúþö„þúþö‚úþö„þö„þö„þö„þö„þúþö„þúþö„þö„þüüþö„þö„þúþö„þúþö„þö„þòŠþüþúþúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþö„þö‚úþö„þøúþúþúþö„þúþòŠþüþúþúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö‚úþúþúþö„þö„þúþúþö„þúþö„þö„þö„þøö„þö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþúþúþúþö„þö„þúþö„þúþö„þö„þúþúþö„þúþúþö„þö„þö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þö„þö„þúþúþúþö„þúþö„þö„þúþö„þö‚úþö„þö„þö„þüüþö„þö„þö„þö„þúþö„þö‚úþö„þúþö„þö„þö„þúþö„þôˆüþúþö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþö‚ö„þúþö„þö„þö„þö„þö‚úþö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þøö„þö„þúþö„þö„þö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þøö„þö„þúþö„þö„þö‚úþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþö„þúþúþö„þö„þö„þúþúþö„þö„þö„þö„þö„þö„þúþö„þö„þúþúþö„þøö‚ö„þúþö„þúþö„þö„þö‚ö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þö„þö„þúþö„þúþúþö„þö„þúþö„þúþúþö„þö„þúþúþö„þúþúþö„þúþúþö„þö„þúþúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþúþö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þúþúþö„þö„þúþö„þö‚ö‚ö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþúþö„þúþúþúþö„þúþúþö„þúþúþúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þôˆüþö„þúþúþö„þö„þö„þúþúþúþúþö„þö„þúþúþö„þö‚ö„þúþôˆüþúþö„þúþôˆüþö„þúþö„þö„þúþúþö„þö„þúþö„þúþö„þö„þö‚úþö‚úþúþö„þö„þö„þúþö„þúþö„þö„þúþö„þøúþö„þö„þö„þö„þúþö„þö„þôˆüþúþö„þúþö„þúþö„þö„þö„þîŽþþþüþúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþúþö‚ö„þúþö„þúþö‚ö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þøúþúþö„þúþö„þúþö„þúþö„þö„þúþúþúþö„þö„þúþö„þúþúþö„þúþö„þö„þö„þúþúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þúþö„þö„þö„þö„þúþö„þüüþúþúþúþö„þüüþö„þúþö„þö„þö„þúþö‚ö„þúþö„þúþö„þúþö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þøö„þö„þüþþþþþþþüþúþúþö„þúþö„þö‚úþö„þö„þö„þö„þö„þúþö„þúþúþö„þö„þö‚ö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþúþúþö‚ö„þüþüþö„þúþúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö‚ö„þúþö„þüüþö„þö„þö„þúþúþö„þö„þúþúþö„þúþö„þúþúþö„þúþö„þúþö„þö‚úþúþúþö„þö„þö„þøúþö„þúþúþúþúþö„þö„þö„þúþö„þö‚úþö„þúþö„þö„þö„þøúþö„þúþö„þúþúþö„þö„þö‚úþö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þö„þúþö‚úþúþö„þö„þúþö„þö„þö„þö„þúþö„þúþúþö„þö„þúþúþö„þö„þö„þö„þúþúþúþö„þúþö„þúþö„þö„þúþúþö„þúþö‚ö„þúþúþö„þúþö„þö„þúþö„þúþúþö„þö„þúþúþúþö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþö‚úþö„þö„þúþö„þúþö„þúþö„þúþúþúþö„þðŒþþüþö„þøö„þö„þúþúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö‚úþúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþúþö„þö‚ö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþúþúþúþö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþüüþö„þö„þö„þö„þúþúþúþö„þúþö„þö„þúþúþö„þö„þúþúþö‚úþö„þö„þö„þö„þö„þö„þö„þúþúþö„þö„þö„þòŠþüþúþö„þö„þúþö„þö„þúþö„þúþö‚úþö„þúþúþö„þúþö„þö„þúþö„þúþúþúþö„þúþö„þúþúþö„þúþúþúþö„þúþö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þúþøö„þö„þö„þö„þö„þö„þö„þúþö‚ö„þúþö„þö„þö‚ö„þúþúþúþúþö„þúþö‚úþö„þö„þúþö„þö„þö„þö„þúþúþôˆüþö„þúþö„þö„þúþúþö„þúþö„þøö„þö„þøúþö„þúþö„þúþö„þúþö„þúþö„þòŠþüþúþö„þö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þö„þö‚úþö„þö‚ö„þúþúþö„þö„þö„þö‚ö„þúþúþö„þö„þö„þúþö„þúþö„þúþö„þúþö„þüüþö„þúþö„þö„þö„þúþúþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþúþö„þö„þö‚úþúþö„þö„þö„þúþö„þö„þúþö„þúþúþö„þúþúþö„þö„þúþúþö„þúþö„þúþúþö„þúþö„þúþö„þúþö„þúþÞžþþþþþþþþþþþüþö„þúþúþö„þö„þö„þö„þúþúþö„þúþö„þúþúþö„þúþúþö‚úþôˆüþö„þôˆüþúþúþö„þö„þö„þúþúþö„þö„þúþúþö„þö„þúþúþö„þö„þö„þúþúþö„þö„þøö„þúþúþúþö„þúþö„þö„þö„þúþö„þúþúþö„þøö„þúþö„þö„þúþö„þö„þøö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö‚úþúþúþö„þúþö„þö‚úþö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þö‚úþö„þö„þö„þö„þö„þúþúþòŠþüþúþúþúþö„þö„þúþö„þö„þôˆüþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þòŠþüþúþö‚úþúþúþö„þúþö„þúþö„þúþúþö„þö„þúþö„þúþö„þúþö„þúþúþúþúþö„þö„þúþö„þúþö„þö„þö„þúþúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þðŒþþüþö„þö‚úþö„þôˆüþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþúþúþö„þö„þúþúþö„þö„þö„þúþúþö„þôˆüþúþö„þö„þö„þúþúþö„þøö„þö„þö„þö„þö„þúþúþö„þúþúþö„þö„þúþö„þö„þö„þö„þúþúþö„þúþö„þö„þö‚úþö„þö„þö„þö„þúþö„þö„þö„þö‚úþö„þö‚úþúþúþö„þö„þö„þúþö„þúþö„þö„þö„þö„þö„þúþúþö‚ö„þö„þøö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þôˆüþö„þúþúþúþúþúþö„þö‚ö„þúþö„þö„þúþö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþúþøúþúþö„þö„þúþúþúþúþö„þö„þúþúþúþö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþúþö„þö„þúþúþö„þúþúþúþúþúþö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þüüþö„þö„þö„þòŠþüþúþøö„þö„þúþö„þö„þúþúþö„þúþö„þúþúþö„þúþúþö„þúþúþö„þö„þö„þúþö„þúþö‚úþö„þö„þö„þúþúþúþö‚úþö„þúþúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þôˆüþúþö„þö„þö„þö„þö„þö„þúþúþúþö„þö„þö‚úþö„þúþö„þö„þúþúþúþö„þúþö„þö„þúþúþö„þö„þúþö„þúþúþúþúþö„þö„þúþúþúþôˆüþö„þúþö„þö„þúþúþö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þö„þö„þö„þúþúþö„þö„þúþúþö„þúþôˆüþö„þö„þúþö„þö„þúþúþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þö‚øúþö„þö„þö„þö„þúþúþúþö„þúþúþúþüüþúþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþôˆüþö„þö„þúþö„þö„þö‚úþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þøö„þö„þö„þúþúþö„þö„þúþøö„þö„þö„þúþúþúþðŒþþüþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þúþö„þö„þö‚ö„þøö„þö„þö„þúþö‚úþøö„þúþúþúþö„þúþúþö„þö„þö„þúþö„þúþö„þö„þúþúþúþôˆüþúþøö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þüüþúþö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þúþúþúþö„þúþö„þö„þúþúþúþö„þúþúþúþúþö„þö„þúþö„þö„þúþö„þúþö„þúþúþö„þôˆüþö„þúþö„þö„þö‚úþúþö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþúþúþö„þö„þö„þúþúþö„þö‚úþö„þôˆüþö„þö‚ö„þúþúþö„þö„þö„þö„þúþúþúþúþö„þúþö„þúþúþúþö„þúþúþö„þö„þö„þúþúþúþö„þö„þøö„þö„þö„þúþö„þö‚ö„þúþö„þö„þö„þö‚øúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þúþúþö„þö„þö„þö„þö„þúþôˆüþö‚úþúþö„þúþö„þö„þö„þö„þö„þúþö„þôˆüþøøøúþö‚úþö„þüþþüþúþö„þö„þúþö„þúþúþö„þúþö„þö„þúþúþö„þö„þúþúþö„þö„þö„þö„þúþö‚úþö„þúþòŠþüþúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þôˆüþúþö„þö„þö„þúþö‚ö„þö„þö„þúþö„þö„þúþúþö„þúþö„þúþúþúþö„þö„þúþö„þúþö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þøö„þøúþúþö„þúþö„þúþö„þøúþøúþö„þøúþö„þúþö„þö„þúþøúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþøúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþúþö„þúþö„þúþúþúþö„þö„þö„þö„þö„þüüþö„þö„þúþö‚úþúþö„þö„þúþö„þúþúþö„þö‚úþö„þö„þö„þö„þúþö„þö„þúþö„þøö„þúþúþö„þö„þö„þúþö‚ö„þüüþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þúþúþòŠþüþö„þúþö„þö„þúþö„þö„þúþö„þö‚ö‚ö„þúþö„þö„þö„þúþö„þö„þö„þøö„þö„þö‚üüþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö‚øö„þôˆüþö„þúþúþö„þö‚úþö„þö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þúþö‚ö„þúþö„þö„þö„þö„þö‚úþö‚ö„þúþúþö„þö„þúþö„þö„þúþúþúþö„þö„þúþö„þö„þúþö„þö„þüþþþüþö„þö„þúþö„þúþúþö„þúþö„þö„þö„þúþúþö„þúþö„þúþö„þúþúþúþúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþúþúþö„þö„þøö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þö„þúþúþö„þúþö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þúþúþúþúþøúþúþö„þö„þö„þö„þö„þúþúþö„þö‚ö‚úþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þö„þö‚øúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþúþúþúþö„þö„þøö„þúþö„þúþö„þö„þúþö„þúþúþúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þòŠþüþúþúþúþö„þòŠþüþö„þö„þö„þúþö„þüþüþö„þúþúþö„þö„þúþö„þòŠþüþúþòŠþüþúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþúþúþö„þö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþúþúþúþö„þö„þö„þúþúþö„þøö„þôˆüþö„þøö„þö„þúþö„þö„þúþö„þö„þúþúþö‚úþö„þö„þúþö„þö„þö„þö„þö„þúþúþö„þö„þö„þö„þö„þö„þö„þö„þö„þúþúþúþö‚ö„þúþö‚úþö„þö„þúþö„þúþö„þö„þö„þøö„þö„þö„þúþúþúþö„þøö„þö„þúþö„þö„þúþúþö„þö„þúþúþö„þúþúþúþö„þö„þö„þúþö„þüþüþö„þö„þúþö„þúþö„þúþúþúþö„þúþúþúþúþö„þö„þö„þö„þüüþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þúþôˆüþö„þö„þö„þúþúþö„þúþö„þö„þúþö„þôˆüþúþúþúþö„þö„þö„þúþö„þúþö„þúþö‚úþö„þøö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþúþö„þúþúþúþðŒþþüþö„þö„þö„þúþúþúþö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þúþúþö„þúþö„þö„þúþúþøúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þøö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþö„þúþøö„þúþö„þúþúþö„þö„þö„þö„þüüþö„þúþö„þö‚ö„þúþö„þö„þüþþþþþþþþþþüþúþö„þúþúþö„þö„þüüþö„þúþö„þö„þö„þö„þö„þö„þúþö„þö„þö„þúþúþúþúþúþúþö„þúþö„þö„þö„þö„þö„þôˆüþúþö„þúþö„þö„þúþúþö‚úþúþö„þö„þö„þúþö„þàœþþþþþþþþþþüþö„þö„þøö„þö‚úþö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþúþúþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö‚ôˆüþúþúþö„þøö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þúþúþö„þüüþö„þö„þúþö„þúþö„þö„þúþúþúþö„þúþö„þúþö„þúþö‚úþö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þö‚ö„þúþúþúþúþö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþúþôˆüþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö‚ö„þúþúþö„þúþö„þö‚úþúþö„þö„þö„þúþö‚ö„þúþö„þö„þúþôˆüþö„þö„þö„þúþö„þúþúþö„þúþúþúþö„þúþö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þüüþö„þúþúþúþö„þúþúþö„þúþúþö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þòŠþüþúþö„þö„þúþö„þö„þö„þö„þúþúþúþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þö„þúþúþúþö„þö„þúþúþúþö„þúþö„þö„þö„þúþö„þúþðŒþþüþúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þðŒþþüþúþö„þúþúþö„þúþúþúþúþö„þúþúþúþö‚ö„þö„þö„þúþúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö‚ö„þúþö„þö„þúþö„þúþúþúþö„þúþö‚ö„þö„þúþö„þðŒþþüþúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þúþö„þúþúþö„þö„þö„þúþòŠþüþúþö„þö„þúþö‚ö„þúþö„þö‚úþö„þúþö„þö„þö„þúþúþúþö„þö„þúþö„þö„þö„þö„þøö„þúþö„þö„þö„þúþúþö„þúþúþö„þúþúþúþö„þúþøúþö„þö„þúþö„þúþö„þö„þö„þúþúþúþö„þúþúþúþúþúþö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þö„þúþúþúþö„þúþúþö„þö„þúþö„þúþö„þúþúþúþúþúþúþö„þö„þúþö„þúþúþö„þúþúþö„þúþúþö„þö„þö„þúþúþúþúþúþúþö„þúþúþúþøúþúþö„þö„þôˆüþúþúþúþö„þö‚úþúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þüüþö„þúþúþôˆüþö„þúþö„þúþö„þúþúþö„þö„þö„þö„þúþö„þúþúþö„þüüþö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þøúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þîŽþþþüþö‚ö„þö„þúþö„þúþö„þö„þö„þö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þúþúþúþö„þö„þö„þúþö„þúþö„þúþö„þúþúþö„þö„þö„þö„þúþúþúþúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö‚ö„þúþö„þö„þö„þö„þö„þúþúþö„þúþúþö„þúþö„þúþö„þúþúþö„þúþúþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þö„þö„þö„þúþö„þòŠþüþúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þö‚úþòŠþüþúþúþö„þúþúþö„þúþö„þö„þö„þúþüüþö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö‚úþö„þúþö„þúþüþüþö„þúþö„þúþö„þö„þö„þúþúþö‚ö„þö„þö„þö„þúþúþö„þö„þö„þòŠþüþúþúþö„þö„þøö„þö„þö„þúþö„þúþö„þúþúþö„þö„þúþúþö„þö„þúþúþö„þö„þö‚úþö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þøúþö„þö„þúþúþö„þðŒþþüþö„þúþö„þö„þúþö„þúþö„þúþúþö„þö„þúþö„þúþö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþøö„þö„þö„þúþúþö„þö„þüüþö„þö„þúþö„þúþö„þòŠþüþúþö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þòŠþüþúþö„þôˆüþúþö„þö„þö„þøúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þôˆüþö„þúþö„þúþö„þúþúþö„þúþúþö„þö„þö„þúþúþö„þúþúþúþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þøúþö„þúþúþúþö„þúþúþúþúþö„þúþö„þúþö„þúþö„þøúþúþôˆüþúþúþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þôˆüþö„þö„þúþúþúþúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþúþö„þö„þúþúþúþö„þö„þúþö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þúþúþö„þö„þúþúþö„þúþúþúþúþö„þúþö„þúþö„þúþö„þö„þö‚ö„þúþö„þö„þúþö„þö„þôˆüþö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þúþôˆüþúþö„þö„þö„þúþö„þúþö„þúþö„þúþúþö„þö„þö„þúþúþö„þö„þúþúþúþö„þö„þö„þö„þúþúþö„þúþúþö„þö„þö„þúþúþö„þúþö„þúþúþö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þôˆüþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þòŠþüþúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþüþþüþö„þö„þö„þúþö„þö„þúþö„þúþøö„þúþö„þúþö„þö„þúþö„þö„þúþúþøüüþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þøö„þö„þö„þúþúþö„þúþúþö„þúþö„þúþö„þö„þö„þúþúþúþö„þúþö„þúþôˆüþúþö„þö„þúþö„þö„þö„þøøö„þúþúþúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þøúþö„þö„þúþö„þúþúþö„þúþö„þúþúþúþúþö„þö„þúþúþö„þö„þøúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þúþúþúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþúþö„þúþö„þö„þúþúþúþö„þö„þö„þö„þøö„þö„þúþö„þúþö„þö„þúþö‚úþö„þö„þúþö„þö„þö„þúþúþúþö„þö„þòŠþüþúþðŒþþüþúþúþúþö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö‚úþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþúþö„þö„þúþö„þúþøö„þúþö„þúþö„þúþö„þúþúþúþö„þö„þúþö‚ö„þúþö„þúþúþúþúþúþö„þö„þúþö„þö‚úþö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþúþö„þúþúþö‚úþúþö„þö„þö„þö„þúþúþúþö„þúþúþúþúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö„þòŠþüþö„þúþö„þúþúþúþö‚ö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þøö„þúþúþúþö„þúþúþúþö„þö„þö„þøö„þö„þö‚úþö„þö„þö„þö„þö„þö„þøøö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þøö„þö„þúþúþö„þö„þúþúþúþúþö„þö„þúþúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþúþö„þö„þö„þúþö‚úþö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþúþö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþúþúþö„þúþö„þúþôˆüþúþúþö„þúþúþúþö„þö„þúþüþüþö„þúþö„þö„þúþö„þøúþö„þö„þúþúþö„þö„þúþúþøö„þö„þö„þö„þö„þúþúþö„þúþúþúþö„þúþö„þúþö„þúþö„þúþúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þôˆüþúþö„þúþúþö‚ö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþúþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þö„þúþúþúþö„þö„þúþö„þôˆüþö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþúþúþö„þö„þúþúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þö‚úþö„þúþö„þúþúþö„þö„þö„þö„þúþö„þúþúþúþúþö„þö„þúþúþö„þúþö„þúþö„þúþö„þúþüüþö„þö„þúþúþö„þö„þôˆüþúþúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þúþúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþøö„þö„þúþö„þö„þøúþö„þö„þö„þö„þúþúþö„þö„þúþúþúþúþúþö„þúþúþö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þúþö„þúþúþúþö„þúþúþúþö„þúþö„þö‚úþö„þúþö„þö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþúþúþö„þö„þö„þúþúþúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þúþúþúþö„þúþö„þúþúþúþö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþúþö„þö„þúþúþö‚úþö„þúþúþö„þö„þö„þúþúþúþúþö„þö‚úþúþúþö„þö„þúþö„þö‚úþö„þö„þúþúþö„þúþúþö„þö„þúþúþúþö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö‚úþö„þúþúþö„þö„þö„þúþúþö„þö‚úþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þüþüþö„þö„þö„þúþúþö„þö„þö‚úþö„þö‚úþúþö„þúþúþö„þö„þúþö„þúþúþøúþúþö„þúþúþö„þö„þö„þö„þúþúþö„þúþö„þúþúþúþúþö„þö„þö„þö„þúþö„þúþúþö„þö„þö„þúþúþö„þúþö„þúþö„þö„þúþúþö„þúþúþö„þúþúþôˆüþö„þö„þúþúþúþúþö„þö„þö„þúþö„þö„þúþö„þö„þøúþö„þö„þúþö‚úþúþö‚úþúþö„þúþúþúþö„þúþö„þúþúþúþö„þö„þúþö„þö‚úþö„þö„þúþö„þö„þúþö„þö‚úþö„þö„þúþúþúþúþøö„þö„þö„þúþö„þúþúþö„þö„þúþúþö„þúþö„þö„þøö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö‚ö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö‚ö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþúþúþö„þö„þúþö„þúþö„þúþö„þúþúþö„þúþúþö„þúþö„þúþö„þúþúþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þúþúþòŠþüþö„þøö„þö‚úþö„þúþúþö„þúþö„þúþö„þúþö„þøö„þö„þö„þö„þö„þö„þúþö„þö‚ö„þúþö„þúþö„þúþúþúþö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþúþúþö„þö„þö„þúþúþúþö‚úþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþüþüþúþúþö„þö„þö„þö„þúþúþúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þüüþö„þö‚úþö„þúþö„þö„þö‚úþö„þö„þö„þö„þúþúþúþúþúþö„þúþö„þúþö„þúþö‚úþö„þö„þúþúþö„þö‚úþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþôˆüþö„þúþö„þøö„þö„þö„þúþö„þö‚ö„þúþö„þö„þö„þö„þúþüüþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþúþúþúþö„þö„þö„þúþö„þúþðŒþþüþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þøö„þö„þö„þúþö‚úþúþö„þö„þúþö„þö‚úþö„þö„þö‚úþö„þö„þøö„þö„þúþúþö„þö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þúþôˆüþö„þúþö„þúþö„þö„þö„þö„þö„þúþúþö„þö„þö„þúþúþö„þúþö„þö‚úþö„þö„þö„þúþö„þúþö„þö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þúþúþö„þúþúþúþö„þö„þö„þö„þö„þúþúþö„þö„þö„þúþö„þüüþîŽþþþüþúþúþö„þúþúþö„þúþö„þúþö„þúþúþúþö„þö„þúþö„þúþö„þøúþö„þúþö„þö„þö„þúþö„þö„þøö„þúþö„þö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþôˆüþö„þö„þö„þúþö„þö„þö„þö„þö„þúþúþö„þúþö„þö„þúþúþúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþôˆüþúþúþôˆüþúþôˆüþúþö„þúþö„þö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþúþö„þö„þüüþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö‚ö„þö„þúþö„þúþö„þúþö„þö„þüüþö„þúþúþúþúþö„þö„þúþö„þö„þö„þúþö„þúþö„þúþòŠþüþö„þö„þúþö„þö„þö„þúþö„þøö„þúþö„þö„þúþúþúþö„þö„þö„þúþúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö‚úþö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þö‚úþúþúþö„þúþö„þö‚úþúþö„þøö„þúþö„þúþö‚øö„þøúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö‚úþøö„þö„þøö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þøö„þö„þúþúþö„þö„þúþúþö„þö„þö„þö„þúþúþúþúþö„þö„þúþö„þúþö„þúþö„þúþúþúþö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þúþö„þúþòŠþüþúþö„þúþö„þö„þúþúþúþö„þö„þö„þúþúþö„þúþö‚ö„þúþúþö„þúþúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þúþúþö„þö„þö„þö‚úþö„þö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþúþö„þúþö„þúþö„þö„þúþøö„þö„þö„þøö„þö„þö„þúþö„þúþö„þö„þúþö„þö‚ö„þúþö„þö„þúþúþö„þö„þö„þøúþö„þúþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þøúþö„þö„þö„þúþö„þö„þúþúþúþö„þúþö„þö‚ö‚úþö„þúþúþö„þö„þö„þö„þüüþö„þö„þúþúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþö„þøö„þúþúþö„þö„þö„þö„þúþö„þö„þúþö„þö‚úþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þüüþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþúþö„þúþö„þö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þúþö„þö„þúþúþúþö„þúþö„þö„þö„þúþúþö„þúþö„þö„þö„þúþö„þôˆüþö„þúþö„þö‚üüþö‚ö„þúþö„þö„þúþö„þö„þøúþøö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þúþüþüþúþúþö„þúþö„þúþö„þúþö„þö„þö„þö‚ö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþúþö„þö‚úþö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þúþö„þúþúþúþö„þö„þúþö„þúþö„þö„þö„þö„þö„þôˆüþúþúþö„þö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö‚ö„þö„þö„þö„þö„þö„þúþôˆüþö„þúþö„þö„þúþö„þö„þøö„þö„þö„þúþüüþö„þö„þö„þúþö„þúþøö„þúþö„þúþö„þúþúþö„þö„þö„þö„þúþôˆüþúþúþúþö„þö„þúþö„þö‚úþúþö„þö„þö„þúþúþö‚ö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þúþúþö‚ö„þúþö„þüþþüþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þúþö‚ö„þôˆüþúþö„þúþö„þö„þúþúþö„þö„þö„þúþö„þüþüþúþúþö„þö‚úþúþö„þö„þö„þúþö„þö„þö„þö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþúþúþúþö„þúþö„þúþö„þö„þøö„þúþúþö„þúþúþö‚úþøúþö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþö„þö„þüþüþúþúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö‚ö‚úþö„þö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþøö„þö„þö„þúþúþúþö‚úþøö„þö„þö„þúþôˆüþúþúþö„þúþúþúþúþö„þôˆüþúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þúþúþúþö„þúþö„þúþúþö„þö„þúþúþö„þúþòŠþüþúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþðŒþþüþö„þúþö„þòŠþüþúþö„þö„þö„þúþö„þö„þøúþö„þö„þúþö„þúþö‚ôˆüþüüþòŠþüþö„þö„þö„þúþúþö„þúþö„þøö„þö„þö„þö„þôˆüþö‚úþôˆüþúþúþö„þúþö„þúþö„þö„þúþö„þüüþö„þúþö„þòŠþüþúþö„þö„þö„þúþö„þö„þúþúþö„þúþøúþö„þö„þö„þúþö‚úþö‚ö„þúþøúþúþö„þö„þúþö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þøüþüþö„þôˆüþúþö„þö„þö„þúþúþö„þö‚ö„þúþö„þúþúþúþö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þøö„þö„þúþö„þö„þúþö„þúþúþúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö‚ö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþúþúþö„þúþö„þö„þüþüþúþö„þúþö„þö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþúþúþúþö‚ö„þúþúþö„þúþüþüþö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö‚úþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þö‚ö„þö„þúþö„þúþö„þúþúþúþúþúþö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þö„þüþüþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þö„þö„þö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþúþúþúþö„þö„þúþúþö„þúþö„þúþúþúþúþö„þúþö„þö„þüþüþö„þö‚úþö„þö‚ö„þúþö„þö„þòŠþüþö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþôˆüþö„þüüþö„þö„þö„þüüþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþúþö„þö‚úþúþúþö„þö„þö„þö„þö„þúþö„þúþøö‚ö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþôˆüþúþö„þö„þö„þøö„þö„þö„þö„þúþö„þö„þúþö„þôˆüþúþúþö„þö„þö‚úþúþö„þö„þö„þö„þúþö‚úþö„þö„þö„þúþö‚úþúþôˆüþúþö„þö„þúþö‚øúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþúþö„þö„þö„þúþúþö„þúþö„þö‚ö‚ôˆüþö„þúþö‚ö„þúþö„þúþúþö„þö„þúþö„þö„þúþúþö„þúþúþö„þö„þúþö„þö„þö„þúþúþúþö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö‚úþúþúþö„þüüþúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þúþúþö„þö„þúþö‚úþúþö„þúþö„þö„þö„þúþö„þö„þö„þö‚ö‚ö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þúþö„þö„þúþúþö„þúþö„þö„þúþö„þö„þúþö„þö„þôˆüþúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þúþö„þúþôˆüþúþúþö„þö„þúþúþö„þüüþö„þüüþúþö„þö„þúþøö„þúþúþö„þúþúþö„þúþö„þúþúþö„þúþúþö„þúþúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö„þøúþö„þö„þôˆüþúþö„þö„þúþö„þö„þö„þôˆüþö„þúþö„þö„þúþúþö„þö„þúþúþôˆüþö„þúþö„þö„þö„þö„þôˆüþúþúþö„þö„þúþúþö„þö„þö„þö‚úþúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþòŠþüþö„þúþö„þúþö„þö„þúþúþúþö„þøúþö„þüþüþö„þøö„þö„þö„þö„þö‚úþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö‚úþúþúþö‚úþúþö„þúþö„þö„þö„þö„þö„þúþö„þúþúþö„þö‚úþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þúþö„þúþúþúþúþúþö„þúþö„þö‚ö„þúþö„þö„þö„þúþúþö„þúþúþúþúþö„þúþö„þúþö„þúþúþö„þúþö„þúþö„þö„þúþúþúþö„þúþö„þö„þö„þúþö„þúþúþö„þúþúþö„þö„þö„þö„þúþö„þüþüþúþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þúþúþúþö‚úþö„þúþúþö„þúþö„þö„þö„þúþö„þö‚ö„þúþö„þö„þö„þúþúþö„þüüþúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþúþö„þúþö„þö„þúþö„þö‚úþö„þö„þøö„þö„þúþö„þö„þúþúþúþúþö„þö„þö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþúþö„þúþúþúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþúþúþö„þúþö„þúþúþúþö„þúþúþö„þúþøúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþúþúþö„þö„þúþö„þö„þúþö„þúþö„þúþúþö„þôˆüþúþö„þö„þö„þúþö„þö‚úþúþö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þüþüþúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþôˆüþö‚úþö„þúþö„þúþö„þö„þúþö„þúþö‚úþö„þúþö„þö„þö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þö„þúþüüþö„þö„þúþúþúþö„þö‚úþö„þö„þö„þúþúþúþö„þö‚úþö„þö„þö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþúþôˆüþö„þúþö„þö„þö„þúþö„þö„þö‚úþö„þö„þúþö„þòŠþüþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö‚ö„þúþö„þö„þö„þö„þúþúþö„þúþö„þúþúþö„þúþö„þö‚úþö„þö„þúþòŠþüþúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þôˆüþö„þúþö„þö„þö„þúþúþö„þö„þøúþö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þòŠþüþúþúþúþúþö„þúþúþö„þúþö„þö„þüþüþö„þö„þúþö„þö„þö„þö„þö„þö„þúþö„þøúþö„þúþúþúþö„þö„þúþúþö„þúþö„þö„þö„þúþúþö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö‚úþö„þúþúþö„þúþö„þúþúþö„þúþúþö„þö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þúþúþö„þúþúþúþö‚ö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þö„þö„þö„þúþúþö„þúþúþö„þö‚úþö„þö„þö„þúþö‚ö„þúþúþö„þúþúþúþö„þö„þúþö„þö„þüüþúþö„þúþö„þúþüüþö„þö„þúþúþúþúþö„þö„þö„þúþôˆüþö„þúþö„þö„þö„þúþö„þüþüþö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþúþö‚úþö„þö„þúþúþúþö„þö„þö‚úþö„þôˆüþúþö„þö„þö„þö„þúþö„þö„þö„þúþúþúþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þüüþö„þö„þúþúþö„þö„þö„þö‚úþúþö„þö„þúþö„þö„þúþö„þúþúþö„þö„þö„þúþö„þúþö‚úþúþö„þúþö„þúþö„þøö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþúþö„þúþö„þúþúþúþö„þúþö„þúþö„þö„þö„þúþö„þúþö„þúþúþúþö‚úþôˆüþúþúþö„þö„þö„þö„þüþþþüþúþö„þö„þö„þö„þúþö„þö„þúþøö„þö„þúþö„þö„þúþúþö„þö‚ö„þúþö„þö„þúþúþö„þö„þö„þúþúþö„þö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö‚úþö„þö„þö„þö„þúþúþúþö„þö„þúþúþö„þúþö„þúþúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þúþøö„þö„þö„þôˆüþúþö„þö„þö„þúþö„þúþúþö„þö„þö„þö„þúþö„þüþüþö„þøö„þö„þúþúþúþö„þö„þúþö„þøôˆüþúþúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þôˆüþúþö„þüüþö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþúþúþö„þö„þö„þö‚úþúþö„þö„þúþö„þö„þúþö„þö„þúþö‚úþö„þö„þö„þö„þúþúþö„þúþö„þö„þúþö„þö„þö‚úþúþö„þúþúþúþö„þúþö„þúþö„þö„þö„þö„þö‚úþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þøö„þúþúþö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þúþö„þúþö„þúþúþö‚ö‚ö„þúþúþôˆüþúþö„þúþö„þö„þøö„þúþö„þö„þúþúþö„þøö„þö„þö„þúþúþö„þö„þö„þúþúþö„þúþö„þö„þúþö„þôˆüþö„þúþö„þö„þúþö„þö„þúþö„þôˆüþúþúþö„þö„þö‚ö„þúþö„þúþö„þøö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þúþøúþö„þö„þúþúþö„þúþö„þö„þøúþö„þúþö„þúþôˆüþúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þö„þö„þúþôˆüþö„þüþüþúþö„þö„þö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þúþö„þôˆüþúþúþúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþúþö„þúþúþö„þö„þúþúþúþúþö„þö„þö„þúþôˆüþúþúþö„þö„þúþö„þøö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þøö„þö„þö‚úþö„þúþö„þö„þúþö„þúþúþö„þö„þúþøúþö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþúþö„þö„þö„þúþúþúþö„þúþö„þö„þö„þúþúþúþö„þúþö„þö„þö„þö‚ö‚úþö„þö„þúþö„þö„þúþö„þúþö„þüüþö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþúþúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþøö„þö„þö„þúþö„þö„þúþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þúþúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þòŠþüþúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö‚úþö„þö„þö„þö„þö„þúþö„þö‚ö„þúþö„þö‚úþö„þúþúþö„þôˆüþúþö„þö‚úþúþúþö„þúþö„þúþö„þúþúþö„þö„þúþö„þö„þúþúþúþö„þö„þúþö„þö„þúþúþö„þö‚ö‚úþö„þúþúþúþö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö‚úþö„þúþö„þúþö„þúþúþö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þö„þúþúþúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþúþúþö„þö„þö„þö„þøö„þøö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþüþüþö„þúþúþúþö„þúþö„þö„þö„þö„þúþúþö„þö‚úþö„þúþö„þö„þúþúþö„þøö„þö‚úþö‚úþúþúþúþúþö„þö‚ö„þö„þúþúþúþúþö„þúþúþö„þö„þúþö„þúþö„þúþö„þúþö‚ö„þúþö„þúþö„þö„þö„þö„þö„þö„þúþö„þö„þúþö„þøôˆüþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö‚úþö‚úþúþö„þö„þúþúþö„þö„þö„þúþö‚úþö„þö„þúþòŠþüþö„þö„þúþúþö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþúþö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þÞžþþþþþþþþþþþüþüüþö„þúþö„þúþö„þúþö„þö„þö„þúþúþö„þö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þö‚ö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö‚ö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þúþúþö„þúþö„þúþö„þúþö„þö„þö„þúþúþúþö‚ö‚úþö„þö„þúþö„þúþö„þúþúþúþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þúþúþö„þúþö„þúþúþö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö‚úþúþúþúþúþúþö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþúþúþö„þôˆüþôˆüþúþúþö„þúþúþö„þúþö„þö„þúþö„þúþö„þúþúþö„þö„þö„þö‚úþö„þúþö„þö„þúþôˆüþúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö‚ö„þúþö„þö„þö„þúþôˆüþö„þö„þúþúþö„þö„þúþúþö„þúþö„þö„þö„þúþúþúþúþúþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþúþòŠþüþúþúþö„þö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þøö„þúþö„þüüþö„þö„þúþö„þúþúþö‚úþö„þôˆüþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þö„þúþö„þö„þúþòŠþüþúþúþö„þúþúþúþúþö„þö„þö„þúþö„þö„þúþòŠþüþö„þö„þúþö„þøúþö„þúþö„þö„þö„þö„þúþö„þòŠþüþúþúþúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þúþúþúþö„þúþö„þö„þúþúþö„þö‚úþö„þúþúþö„þúþúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö‚úþö„þö„þö„þö„þúþúþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþúþúþö„þøúþúþö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þö„þúþúþö„þö‚úþö„þö„þøö„þö„þúþö„þö„þúþö„þö„þúþúþúþö„þö„þúþö„þúþö‚ö‚úþüüþö„þö„þúþö„þúþúþúþö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þüüþüþüþúþö„þö„þö„þúþö„þö‚úþö„þúþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þúþúþö„þôˆüþúþúþö„þö„þúþúþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþúþúþúþö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþúþö„þúþö„þö„þö„þúþúþüüþö„þö„þúþúþö„þúþö„þö‚úþö„þúþö„þö„þö„þö„þö„þúþúþôˆüþúþúþö„þôˆüþúþö„þö„þúþö„þö„þö„þö„þúþö„þôˆüþúþö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þúþúþúþúþö„þö„þúþö„þúþö„þö„þö„þö‚ö„þö„þúþúþö„þúþö„þö„þúþúþö„þö„þö„þúþúþö„þúþúþö„þö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þúþö„þúþö„þúþö„þö„þúþúþúþúþö„þúþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þúþúþö„þö„þúþö„þøö„þö„þö„þö„þö„þúþö„þö„þúþúþúþö„þúþö„þö„þúþúþö„þö„þúþö„þøúþö„þö„þö„þö‚úþö„þúþö„þúþö„þö„þøö„þö„þúþúþö„þüüþúþö‚ö‚úþúþö„þö„þö„þúþö‚úþö„þúþö„þúþö„þøö„þúþö„þúþö„þôˆüþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þøúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þôˆüþúþö„þúþö„þö„þúþö‚úþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þö„þøö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þö„þúþö‚ö„þúþö„þúþúþö„þö‚ö„þö„þúþö„þúþö„þúþúþö„þúþúþö„þúþö„þúþö„þúþö„þö„þøö„þö„þö‚ö„þúþö„þö„þö„þøö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þúþö„þúþö„þúþúþö„þö„þö„þøö„þö„þúþúþö„þúþö‚ö„þúþúþö„þúþö„þúþúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þúþúþö„þúþúþö„þúþö„þúþö„þö„þö„þúþúþúþö„þö„þö„þúþúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þö„þúþúþúþö„þúþö„þö„þö„þö„þúþúþö„þúþúþö„þö„þúþö„þúþö„þúþö„þúþúþö„þúþö„þö‚úþö„þö„þúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þðŒþþüþúþö„þö„þö„þö„þúþö„þö„þö„þúþúþúþôˆüþúþö„þúþúþö„þö„þö„þøúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þøúþòŠþüþö„þö„þúþö„þö„þúþúþúþúþúþö„þøö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þö‚ö„þúþö„þö„þö„þúþúþúþö„þúþö„þö„þö„þúþúþúþö„þö„þö„þúþö„þüüþö„þúþúþö„þúþö„þúþö„þúþúþúþö„þúþö„þö„þúþúþö„þö„þö„þö„þö„þúþúþôˆüþúþúþúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþîŽþþþüþö„þö„þö„þúþøö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þôˆüþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þüüþö„þö„þö„þôˆüþö„þúþö„þö„þúþö„þö„þö„þö„þüþþþüþö„þö„þúþö„þö„þö„þúþö„þö„þúþúþúþö‚úþö„þúþö„þö„þúþúþö„þö„þö„þúþö„þðŒþþüþúþö„þö‚úþö„þúþüüþúþö„þúþö„þö„þö„þö„þúþö„þö„þúþðŒþþüþö„þúþúþúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þúþúþö„þúþö„þúþö„þö‚úþö„þúþúþö„þúþö„þúþúþö„þö„þö„þúþúþúþúþö„þö„þúþö„þö„þúþúþúþö„þúþö„þúþö„þúþúþúþúþö„þúþúþúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþúþö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö‚úþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þö‚úþúþö„þö„þö„þö‚úþúþö„þö„þö„þö‚úþúþúþö„þúþö„þúþúþö„þúþö„þúþúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þøö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö‚úþö„þö„þúþö„þøö„þö„þö„þúþö„þúþö„þúþö„þúþö„þúþúþúþö„þö„þö‚úþö„þúþúþö„þö„þö„þúþö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþúþö„þúþö„þúþúþö„þö„þúþúþö„þúþö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þôˆüþö„þúþö‚ö„þôˆüþö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þøúþö„þö„þúþö„þúþö„þö„þúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþúþö„þö„þøö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþö„þúþö„þö„þö„þö„þö„þö„þö„þö„þö„þøö„þö„þúþúþö„þúþö„þö‚ö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þö„þö„þúþúþö„þúþúþö„þúþö„þö„þö„þúþøö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþøö„þö„þúþö„þîŽþþþüþúþúþøòŠþüþúþö„þúþö„þö„þúþö„þö„þúþö„þö„þøö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þôˆüþúþúþúþö„þö„þøö„þúþö„þö„þö„þòŠþüþúþö„þøö‚úþö„þúþö„þøüþüþüüþö„þö„þö‚ö„þüüþö„þüüþúþúþö„þúþúþö„þö„þö„þúþúþúþö‚ö‚üþþüþö„þúþö„þö„þúþö„þúþö„þö„þö„þö‚úþúþö„þö„þúþö„þúþúþö„þúþúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþö‚ö„þúþúþö„þúþúþö„þúþö„þúþö„þö„þòŠþüþúþúþö„þö‚üüþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö‚úþö„þúþúþö„þúþö„þö„þúþøö„þö„þö„þö‚úþúþúþö„þøö„þö„þúþúþúþö„þúþúþö„þúþúþúþúþö„þö„þúþö„þúþúþö„þúþö„þúþö„þúþúþö„þúþôˆüþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þøö„þúþö„þö„þúþö„þö„þúþö„þøúþö„þö„þúþö„þúþö„þö„þö„þúþúþö„þúþúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þúþö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þö‚ö„þøúþúþúþúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þúþö„þúþö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþüþþþüþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þøö„þúþö„þøö„þúþö„þúþö„þúþúþö„þúþö„þúþúþúþö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þö„þö„þúþö„þúþúþúþúþúþúþö„þö‚úþö„þö„þúþö„þúþúþúþö„þö„þúþö„þö„þö‚ö„þúþö„þúþö„þúþö„þö„þúþúþúþúþüüþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþúþúþúþö„þúþúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þúþúþúþúþö„þö„þúþö„þö„þøö„þö„þúþúþö„þúþö„þúþúþúþö„þö„þö„þö„þúþôˆüþö„þö„þö‚úþúþúþúþüþüþö„þö„þúþúþúþúþö„þö„þúþö„þö„þúþö„þö‚úþö„þö„þúþö„þúþúþö„þö„þúþö„þö„þúþö‚úþúþúþøö„þúþö„þö„þúþö„þúþúþö„þúþøö„þøö„þö„þüüþö„þúþö„þøúþúþö„þúþøúþúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þüüþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þøö„þö„þúþüþþüþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö‚úþö„þúþúþúþúþúþúþúþúþúþúþúþö„þö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþúþúþúþúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö‚úþö‚ö„þö„þúþúþö„þúþúþúþôˆüþúþö„þö„þö„þö‚ö„þúþö„þö„þúþúþö„þö„þúþö„þúþö„þö„þúþö„þúþö‚úþö„þúþö„þúþøúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþúþö„þúþö„þö‚úþö„þö„þúþö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þúþúþúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþôˆüþúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö‚ö„þøúþö„þö„þúþö„þö„þúþúþúþúþôˆüþúþö‚úþúþö„þúþúþö„þúþö„þîŽþþþüþúþúþö„þúþö„þö„þòŠþüþúþúþö„þö„þö‚úþö‚ö„þö„þúþö‚úþö„þö„þö„þö„þúþö„þúþö„þúþö„þö‚úþö‚üüþúþö„þö„þúþö„þúþúþîŽþþþüþúþö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þòŠþüþúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþôˆüþúþö„þúþúþö„þö„þúþö„þüþüþö„þúþö„þö„þö„þö„þúþö„þîŽþþþüþö„þö„þö„þö„þúþúþö„þö„þúþúþö„þüþüþö„þö„þö„þôˆüþö„þúþö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþúþö„þúþúþúþö„þö„þö„þúþö„þö„þö„þö„þúþö„þö„þøö„þúþúþúþö„þö„þö„þúþö„þö„þúþúþúþúþúþúþö„þö„þö„þö„þøúþö‚úþö„þö„þúþö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þúþö„þüüþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþüüþö„þøö„þö„þö„þö„þúþúþö„þö„þúþúþö„þúþøö‚ö„þúþö„þúþúþö„þúþö„þö„þö„þðŒþþüþö‚úþö„þúþôˆüþö„þúþö„þö„þôˆüþúþúþúþö„þö„þö„þúþúþúþö„þúþö„þö„þúþö„þö„þö„þö„þö„þúþúþö„þö„þúþö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþúþúþö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þúþúþö„þúþö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþîŽþþþüþö„þö„þúþüþþþüþúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþö„þö„þúþö„þôˆüþúþúþîŽþþþüþö„þö„þúþö„þö„þúþîŽþþþüþö„þúþö„þö„þúþúþúþö„þúþúþö„þúþö„þúþúþö„þö„þúþö„þúþö„þüüþö„þúþö„þúþôˆüþö„þúþúþö„þö„þúþö„þö„þö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þúþúþö„þö„þúþö„þúþö‚ö„þö„þúþö„þö„þö„þüüþö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þúþö„þö„þö‚úþö„þö„þúþö„þö„þúþö„þö„þúþö„þúþúþö„þúþö‚ö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þö„þúþúþúþö„þö„þö„þúþö‚ö„þøúþö„þö„þö„þúþö„þö„þúþúþúþö„þúþö„þö„þúþúþúþúþö„þö„þö„þúþö„þúþúþö„þö„þôˆüþúþö„þúþö„þúþúþúþö„þüüþö„þö„þö„þö„þö‚úþö„þö„þúþö„þðŒþþüþö„þö„þö„þúþö„þúþö„þøö„þúþö„þö„þö„þúþö„þö„þö„þö„þúþúþö„þö„þúþúþö„þúþúþö„þö„þúþö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþúþúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þúþúþö„þúþúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþúþúþö„þö„þúþúþö„þúþö„þö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þö‚úþö„þúþö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö„þúþö„þøúþúþö„þö„þö„þö„þúþö„þö„þüþþüþö„þö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þö‚úþö„þúþö„þö„þîŽþþþüþúþúþúþúþö„þúþúþö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þúþúþö„þúþúþîŽþþþüþúþö„þôˆüþö„þö„þö„þúþúþö„þúþö„þúþúþúþö„þö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þøúþö„þúþö„þö„þúþö„þö„þúþüþþþüþúþúþö„þö„þúþúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þö„þøö„þö„þúþö„þøúþö„þö„þúþö„þúþôˆüþúþö„þö„þö„þúþúþö„þö„þö„þúþö„þö‚úþö„þüüþö„þö„þúþö„þö„þö‚øúþö„þúþö„þö„þúþö„þðŒþþüþúþúþúþúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þúþúþúþúþö„þö„þúþö„þúþúþö„þúþúþö„þúþúþúþö„þö„þö„þö„þúþö„þúþúþö„þúþö„þúþúþö„þö„þüüþö„þúþüþüþö„þúþúþúþö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþúþö„þö„þúþúþö„þúþúþúþö„þö„þúþúþúþúþö„þö„þúþúþö„þö„þúþö‚ö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö‚ö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þúþúþúþö„þö„þö„þúþö„þö„þö„þö„þö„þö„þúþö„þö„þøúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þö„þúþúþúþúþö„þö„þúþúþö‚úþö„þúþö„þúþö„þúþö„þúþúþúþúþúþúþúþúþö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþúþôˆüþúþúþö„þö„þøúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþúþúþö„þö„þðŒþþüþúþö„þö„þúþö„þúþö„þúþö‚úþøúþö„þúþö„þö„þúþö„þö„þøö„þö„þðŒþþüþö„þúþúþö„þúþö„þúþòŠþüþö„þúþúþúþö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþúþúþö„þüüþö„þö„þúþúþúþö„þö„þö„þö„þúþö„þúþö„þúþö„þö„þö‚øúþö„þúþö„þö‚úþøö‚úþúþüüþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þôˆüþö„þö„þúþúþúþúþúþö„þúþö„þö„þö„þö„þúþö„þøúþö„þö„þúþö„þúþúþö‚úþö„þö„þö„þúþö„þö‚úþö„þö„þö„þö„þúþö„þúþúþö„þö„þö„þö„þö„þúþö„þúþö„þúþúþö„þúþö„þö„þö„þö„þö„þúþö‚ö„þúþúþö„þúþö„þúþúþúþúþö„þøúþö„þö„þøüþþüþúþö„þúþö„þúþö‚ö„þúþúþö„þúþö„þúþúþúþúþö„þúþö„þö„þö„þö„þúþö„þö„þüþþüþúþö„þøö„þö„þö„þúþö„þö‚úþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þúþúþúþúþö„þúþö„þö„þö„þö„þúþö„þö„þúþö‚ö„þö‚ö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþúþúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þôˆüþö„þúþö„þúþö‚ö„þö„þúþö„þúþö„þö„þúþö„þö„þúþö„þøö‚úþúþúþö„þö„þúþö„þüüþö„þúþúþö„þö„þö„þö„þúþúþôˆüþö„þö„þúþö„þúþö„þö„þö‚úþö„þúþö„þúþö„þúþö„þö„þö„þö„þøúþúþúþúþö„þúþúþúþö„þúþö„þúþö„þö„þö„þúþö‚ö„þúþö„þö„þúþúþö„þö„þö„þö„þøö„þúþö„þúþö„þö„þö„þøö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþúþúþúþö„þö„þö„þüüþúþøö„þö„þö„þúþö„þúþö„þö„þö„þúþüüþö„þúþö„þúþúþö„þö„þö„þúþúþö„þúþúþúþö„þö„þö„þúþúþúþö„þúþö„þö„þúþúþö„þö‚ö„þúþúþúþö„þö„þúþúþúþö„þö„þúþö„þö„þúþúþö„þö„þúþúþö„þúþö„þúþö„þúþö‚ö„þúþö„þö„þúþúþúþö„þö„þö„þøö„þö„þö„þúþö„þö„þö‚ö„þüþþüþö„þö„þúþö„þö„þö„þúþö„þö„þö„þôˆüþö„þúþö„þúþúþö„þîŽþþþüþö„þúþúþúþúþö„þö‚ö„þúþö„þúþö„þö„þö„þúþö„þö„þúþøúþö„þøö„þö„þúþö„þúþö„þúþö„þö„þüüþúþö‚úþö„þúþúþö„þö„þúþö‚ö„þúþúþö„þö„þö„þö„þúþö„þúþúþúþö„þúþö„þö„þö„þö„þúþö„þúþøúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþúþö„þö„þö„þö„þö„þúþö„þö„þúþúþúþúþúþö„þö„þüþüþúþö„þö„þúþö„þúþúþúþúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö‚úþúþö„þúþúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö‚ö„þúþö„þö„þö„þö„þúþúþö„þö„þúþö„þúþö„þøúþö„þúþúþúþö„þö„þúþúþúþö„þúþö„þúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þúþö‚úþö„þö‚úþö„þö„þúþö„þúþøøö„þö‚úþüþüþúþö„þúþö„þúþö„þö„þö„þúþö„þúþôˆüþö„þö‚ö„þúþö„þö„þüüþúþö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þúþö„þúþö„þúþö„þö„þúþúþö„þúþúþúþö„þúþö„þö„þö„þö„þúþúþö„þö„þö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþúþúþúþúþúþö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þüüþôˆüþö‚úþúþö„þúþúþôˆüþúþö„þö„þúþúþúþö„þö„þúþö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þö„þö„þö„þúþôˆüþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þúþö„þö„þö„þö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þúþúþúþö„þö„þö„þúþö„þö„þøúþúþúþö„þúþúþö„þö„þö„þúþúþö„þö„þúþúþö„þö„þúþö‚úþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þö„þúþúþøö„þúþö„þö„þö„þö„þúþö‚úþö„þðŒþþüþúþúþö„þúþö„þúþö„þúþúþúþö„þö„þö„þö‚ö„þúþö„þúþö„þö„þúþö„þö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þúþúþúþö„þúþúþö„þö„þúþö„þö„þúþúþö„þö„þúþö„þúþö„þö„þúþö„þö‚úþúþúþö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þúþúþúþö„þö„þö„þö„þúþúþúþö„þö„þúþúþúþö„þö„þö„þúþúþúþúþúþúþö„þúþö‚øö„þúþö„þúþúþö„þúþö„þö„þö„þúþö„þö„þö„þúþúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö„þúþúþö„þö„þúþö„þðŒþþüþö„þúþúþúþúþö„þö„þúþö‚úþö„þúþôˆüþúþö„þüüþö„þö„þö„þö„þö„þö„þö„þö„þúþúþö„þö„þúþö„þö„þö„þö„þö„þüüþôˆüþö„þö„þúþúþö„þúþö„þúþö„þúþúþö„þö„þö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þúþö‚ö„þúþö„þúþúþúþúþö„þö„þúþúþö„þúþúþúþö„þúþö„þúþö„þúþúþö„þøö„þö„þö‚úþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþøö„þö„þö„þö„þö„þúþö„þúþúþúþö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þúþö„þö„þòŠþüþúþúþö„þôˆüþúþúþö„þúþö„þúþö„þøúþö„þúþúþö„þö„þö„þö„þúþö„þö„þúþö„þúþúþö„þö„þøö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þðŒþþüþúþö„þö„þúþúþö„þö„þúþö„þö„þúþö„þúþúþö„þö„þö„þúþö„þúþøö„þö„þö„þúþö„þôˆüþö„þö„þúþö„þúþö„þúþö„þúþüúö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö‚úþö„þúþúþö„þö„þö„þö‚ö„þúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þö„þö„þúþö„þúþö„þúþö„þúþö„þúþúþö„þö„þúþö„þö„þúþö„þòŠþüþúþö„þúþö„þúþö„þúþö„þüüþúþúþö„þö„þúþö„þøö„þúþö‚úþúþö„þö„þúþúþö„þúþö„þøö„þüüþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þôˆüþúþö„þúþúþúþö„þúþö„þúþö„þö‚üþþþüþúþúþúþö„þö„þúþö„þö„þúþúþö„þö„þö„þúþúþö„þúþö„þö„þúþö„þúþö„þö„þö„þøö„þö„þö„þúþö„þúþøö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þúþö„þúþøúþúþúþö„þö„þúþö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þúþö‚úþúþö„þö„þö„þúþö„þö„þö„þøúþö„þúþúþúþö„þö„þö„þúþö„þö„þö„þúþö„þö„þö„þö„þö„þö„þøö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþö„þúþö„þö‚úþö„þúþö„þúþúþúþö„þö„þö„þö„þö‚ö„þúþö„þúþúþö„þö„þö„þúþö„þö„þúþúþö„þøö„þüüþúþö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þúþö‚úþö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þö„þö„þö„þö‚úþö„þúþö„þö„þúþö„þúþö„þúþö„þúþö„þö„þøö„þö„þö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þúþúþö„þúþö„þúþøö„þö„þúþö„þúþö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þúþúþö„þúþö„þö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þøúþö„þö„þúþúþö„þúþö„þúþúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þúþúþö„þö„þö„þö„þúþúþö„þö‚ö„þúþö‚úþö„þö„þö„þúþö„þúþö„þúþôˆüþúþö„þö„þö„þúþö„þúþö„þö„þüüþö„þúþúþö„þúþö„þúþö„þö„þúþö„þö‚úþúþúþúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þö‚úþö„þúþö„þúþö„þúþúþö„þúþúþúþö„þøúþúþúþö„þúþö‚úþö„þö‚ö„þúþö„þö„þö„þö„þúþö„þúþö„þúþö‚úþö„þúþö„þö‚úþö„þúþö„þúþö„þö„þö„þö„þüüþö„þö„þüüþö„þúþúþö„þúþúþúþúþúþö„þö„þö„þö„þö„þúþö„þüüþö„þòŠþüþúþúþö„þö„þö„þö‚úþúþðŒþþüþö‚úþö„þúþö„þúþúþö„þö„þö„þúþö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþúþö„þúþö„þö„þúþúþúþúþö„þö„þö„þö‚ö„þúþö„þúþö„þö„þö„þö„þö‚ö„þö„þúþö„þúþö„þö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþúþúþö„þúþö„þö„þúþö„þúþö„þúþö„þö„þúþö„þö„þö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþúþö„þö„þúþö„þö„þúþö„þúþøö„þúþö„þö„þö„þúþö„þö‚ö„þúþö„þúþúþúþö„þúþö„þö„þúþúþö„þö„þúþö„þö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þúþúþö„þúþö„þúþö„þö„þö„þúþö„þúþö„þö„þúþúþúþúþö„þúþö„þúþö„þö„þúþúþúþö„þúþö„þö„þúþö„þúþö„þøö„þö„þö„þö‚úþúþö„þúþö„þúþö„þúþö„þö„þúþö„þúþö„þôˆüþúþö„þö„þö„þö„þúþúþö„þúþö„þö„þúþôˆüþö„þúþö„þúþúþö„þö„þúþúþö„þúþö„þö„þúþúþö‚úþö„þö„þúþö„þö„þö„þúþö„þúþö„þö„þúþö„þö„þö„þúþö„þö„þö„þúþö„þúþüüþøúþö‚úþö„þúþö„þö„þö„þúþö„þúþúþúþö„þúþö„þúþö„þúþö„þö„þö„þúþúþúþö„þúþö„þö„þö„þö„þö„þö„þö„þúþúþö„þúþö„þúþúþö„þúþö„þö„þö„þö„þö„þ¾xêèìâòêîòæÚòîðòôàòÐÜöîîöÜôòðööÚððöìäîîðÜîèòòôØîòîäîòôòÞäêðôäöðîôöôÔòòâôàÊîÜÞòäòöòöÊôðôöâòîöâòôòöôöôÖòòÖôôØöôæôìÜôðöæððàòìöîìðæôôöèîöòôìòØìòðìîòðÚØðèòðòôôôèæîàôæêðôîôêöäêêöôôðððäîìîîðÔèöôôôîöÜðôôæØìôÐöÐêôäòôìöîàðôîöêôôÜììöôîòòöîàêðöðîàðöÞòôòâîîôîæòðððêÔîôæöôØðöÔðòòàîÒòöâðöðîòôîðÞàööðîöìâîÞòòðòÜôìôòîðîÖôöîÖìÞòìðæöööÜîîðôôèêîöôðòîäòðöâîòêîöäôòæÜðøÖôðÊìðèòôðäîòöðâöðòâòôâìòîÞîìèðæôöîÜôÚìäêôöàøîìòÚöôìôìôêöôöæÞèìèôðÜîÚöäèöîòöìîøðôòöîôîæôòàöðôÜððôòÚðôöÐôêöÚôøÚöðìÚòðôðâîÜòôìðèäòôòâòÚîòàöôæèôòôäôôäìðôòôêøÜôîîöÞôêöÎôôòòìöàöÒøðêòìàôÚêðôôðäôôðÒôðÜîôàôîäîôêöæôðöàîôòêôôôôèòæÞòòìäøâììðìðàòöðøòîÖìòÜììäîäòàòØòôâòæôðÖîööòöÞòöÜèìöøêòÚòîòôàòòðæìöæòÐðæðøðöØîøøòôàðøøîòðöîêàôöàòôôòôðôäîæôìÞòàðôîÐòøøìèòæøööøöêøòîàîøøôöâöøøðôðòôìðòèæòæîôðÞâôîÞôÈÜôððèäèôôâðòâêòîøøÞôôìôäöòÖôôêòâæòòöÔôöôìôäÞäöìòôòäôîôôððÜòðØòæòàðÜîòðøôðôØòöæêîîäöòêäìîòöðàâììòîôòîöÞöôðôøöàôòÖèòòòàðîôîòòîîâôòôòæðîîÜòäôöÚôìîäòòìÚÚðòðôÐòðôâàîÞôàöôÞòôàòìòöàöÜöòìðôäðòôÐðôðîæòØôòäôàöðäòîôÚôôòòäôðôêòôîøâôôÞìòÜðòêîöèôôôÜÜòîàòêìäòôôæäâøØììöèîæøôðèôòôêäîôöîæðîòìÒôÔâôÜêÖôÒðôððôäôôôòôäòîðäöìöÒôâØèêîöôèîòøöÞÞîâòìàôöæèðòöðòÞøôæðîðÖòòîòæôøæðÎêòøâØôæôøàèîôôòæòêâòæêòðìðæòôôÞòòÞòôòèæöòÜöðòðØðôðàòÜòìôðÐôøìöðöâêøøöððâîðöòÎðöìììðêòòÎôòâòöòðæêöôøòîôØôðæîðîòàØôòöðôØöôîâôððÜôöîÞôììÚôööôDòòîòÜÞöàäîæðìâöøðÜôàôöìöøÚäðòîôâøôöâîèîôòèâæîìøôòøöæôöðîöìôòöôÖôöîæööæôôÐðæâöôðæôÞìðòìðÜîøöììðÔîÚôèôôôâæôöÜððàòìôâìàôðæÞîòöèîôàìØöàèîøÔèèæðìðîòòÞÞîâòöòôäòòòÔöÜìÖîòðööäòòììðöêèêàîðôðööòöÜøôäòðîöèðöæØôÜòôòÞòòòðôöäòììäôöÜîòÞòøæðîöÖîôðîôôæöæòòøêîîôÜôôðìÔôôòèôôöæðîêôæòöðöäêòôôôêöÔòòôêäøÚòîòâðêôâöðâàðÚîòöðöØöôøìööèòäöôìêðòîøÞîøäêîôòîîòøìôôîîøöÖîôîòØìôìäøâòøòÊôèöòòòöâðÞòðøâòôæäìôòòÜòööòòÜÔèðîòäìäôØìöðàâîòôÜâòìææööÒðôêðòÜàîöîÞöôööÞôôäðöòìôæðîîÞôòÒàöðîêøèöÜèîöæòêäòîäöðöøàêðøÜôÚòøìöàððìÒöðìÔìôöòèôôöÚìðøðÖîððôÞâÞööðÜðôîÚôðÔäôðøîæôðÞîðÔöòîäæòòäðôðôâîòäôäôàòðìôâòÞòôìàìîâöìöÒòòÖôôôâôööäòðÜèðìððôøðöæôøìäöâèôòäôôìòææòôîöæðØöìòÖöðööàòîöòìàîòîâòðòòîôæöâðôòÞäøêôÞâêòöàæðèôöäêöòäðòôôæððäøîöÜòøäðÚôÜøòôìàêðÚæîòøÚêðøÚöòòÔäòòÚôîòîðÖöðîðàðÒîôòìÞöÚôòöðîîîöÜîòîèîöàøæììðôòöòÚêðöäðòòîÜðöÞôðôöôäÞìôîæðîæòôöâÒòðîàðôøäöðÒàôðæêÚîôîêâæäòôÔæîÔòêÎêðèÞðàðîøôÖööîôâòôøÜäòÚøäÚðöêèðöôðòÜðòÜòðöØîðÞôòäêòòòôôÔòêàøÐðôðôöÞÞòöðöÞîðæôðôîâôîîðÔìòîðòîöèêäôêöâöäðôâìöööæðàöøðôâîöèîöøôÞôòôâöäêôòôîòøäöôâØîìöèðòèîôÖæðöðæðæîôôôØððððæôàøÞâìÜôÎöÞòøÜöèâîîòäâÒòøöÞèäöêêäÖôòæöîøòâîððøöÒøôÒøòøòÚÒôððôîòØòôôäÚìðôâÞôôìîôØòâòðÔòòòìàîðòêòæøôððôðòâêòàòöîöäðôòâöðòîôôöîØòôöÌòöêàÜîìÞòîöììîöòØàêðöôêÜìîììîæðöøòòæôøÎöâòöôöøìòøèòÜòæèöðôöìòôòìèâîôâôÜîôðöøØöäèðÜððÞôðôæôîðððàîîòðÞêðöâððòðîÖðôðôÚìêöîæîôöìÞôöôðòîòôøàðôòäöâìòòôàðîàòèöòæðôØôîôôôìôöæôòöôðæìòôðäðîöÚöäîôòöàôöîÜðòòØôêÖîöØðäöÜÒðìòðöäðîèòæôîîâðôòòòâôðôÜôòàôòìðÜòÞìòðöæòòòðÞêöôìâôôàðòðâôâòòòðÞðòèâöîîòÜòÜöôêìðæâðäôÜòöìðôæöÔèðôôÞôØòöòàòòÜìîàðòöâòòîäîîîðôÒôðìôöøàêæôöøêøÞäôÞðòöàôðôôöôØööòðÜìÚâöôòøäììöâöðöÜöÞòòöäìøäâðèöðîòîæòèðôêððìääôöðâîìÞæìèôöèèðêÐôðìöôøÎìøöâîòæòÎêðäöâòîöøöÚôööàìôöôòòäîòððôðÔôäìôòöàîäîöîôòæòîöØòôòìÞôòðòæòîÒêèòÜæòôôàöîæðòÎèâôôââÞÔôäîîðòêðìäöâððäîðøÄôìäðöðôÖîôôôâîôòìäöððìæôööäöðÔôæØðöØîôäöðööæäêìöèàîððôðØöðæòêìôøÜîîìöôìöööàìòöôîôìôàòðøäòòôòàìòîäêîòòðîÒîðêîôðôâööðôöøÜðêøøøæôðÜòìòôòðòöÖðòôðìðâòôäöòôâðôòèôìòøäôØêðôðÚèðòîâøøîöôæøòìöðôàøøöôôÞððæìòììöâôâòôðÖòòòöððöàôâôôööòÖòòêòôððöìâòîìÐôôøÎôøøÔðøîààöôòöÜòòôÚÒðøòôìàìàîòðððöôöäÚìôØöâîæôîòäöðòÐöøðìôîæôèöòÞøôòêèöøòôòîööàòôøðòîòîöÜðîðÜòâðòøÞîôîâöðÐðôîæòèòòôôæððòîòöâôîøôòäôêæðêôàôðÊöôèöàêìêðîöðØðìöðÞòðîììâôòòøÒîòæôðøäòöðàÞôÜôæòöÖêòôöîÜöðìÜòìðôðôòâòììèôÚðÜôøòðòöàöìæèäôìøÆôÞôöòÜöàòìôðÞàòöòÜìòöÎôôæðòôîòèæäòòòÜäðôòôòÞôöæôðôäôöÞòêðòòâìöôÜòìòæòîàðäøðäìæìöðôôòìîÜððôðäòòöôðæôòìâòòèÜäðàôàîâèöØôöÜòòòæêîàèöäêôîâîôØøÒöæôÞìöÞÖòèôôòäðôîðìîðâæêðòöÞôÜìòæòòöøðäòôðæòäöôîòöÞÞêøìæèôîòòâôìôìÞÜêÜòðÔêððîâòøîêøò¤lðÞöæìôâöæôöôòîæôÜäôêöîôæöôöòöÚööØôîÜòòìòôðîâôîêÞêòòøâöÜÒðÖôöìîôâðòöòÜÚèòØðôîöæìòòìîöôæøðøâöòàòâÖòöôôîÖöàîêìðæöìæôâöîòòöôîòðÞòòôöôôöäòäòòîòÔìòêðöÜòìôèèâôîäèîêôöÖðòðâòðäìôâêêîôÚììöàôäôîâôðìÜôôöòàðàÖòöîòÚìððêîòÞöôÖòðòÔòôðòôÔòòâîêðöÞôÞìîöðøÖÞêðòòìèàöðôâîìöðôòôîðôàðöÞöîðôàêôâîòèîàððôòöîìðôäôðøÒòîöìôäôîèððÒîøìâêðêôØèöòðêìÚðÜìòìðòòÜôæØÚäôäôòðöÊòìöôÞòôôôàææîôØîöîðôöòâìòôòôäØêØöôöÔîÐìôæøÞöôÞÞðâôìðôÌöòðøöäôðÒîêÚòîôäøîêòòòòôØîâöìööâòàôôòàòòîàäÞððæîìôöòØðôôÒôòòòÚôôìøèôîèöôêöôàèòæöôòøàêêòôöîàòÞðôôöðäôîìäâêôôêôöàìöøööâôøÖòôöæôòðæôæøäòâòÚæìôîòÔöððâøðöîìöôîÔôöîîÖöäöâÔòæôäðôòìðôêØðòøàðôèðöØîîöäìòööâòðòôðîÞôöðÚæöìêÚîâìòàôöòääìèöØöôòòòðâðòôÎôÎìâðîööòæôöîèöîîêöèöòöìàöööàòîìöäöôèäØôöÜððöäàôæòîîæôâìôêôòôôÖäêîòÞêäòôööäòîøèôôàðòÈÞöðòÔöððôÞàòôôðÞìôôØîìÞòðÚöæêæôæèâððòðÖÞîôàöâîðòîðòàöâôôìæòòæîäòìöòòîôòèòìööâðøàæòöòìêôèòðøîôÞòÞðÞððØòöôÞÞìòöôòââòîòôòîöæôîòêðêòîîöêòôàðìøÐîððæôððÈîôîôòìÜðòôòöîØöêîðæòðôîàêêôôäöðôöÖððôìèðòðöôÞÜâÐôÞöìôäôÜæöðäöòðæòôòôîìÒìòòàððððôôàôöèêôØèÜîôôôàöôäððäðøøÞôÔöòöîèôêôÜòòöôðæèöðôøâöòÞòæîôòàöððÌôàöòÚîððÞôæÖðôöæðòôàîìòòìðôðÚðôÚöêîöÞöòÞøÐèìòòöôîøÜòöØðêòìøæôöìäðàôîôèøèîÚðâðæôðàìôìðôèöÚöàôòìòÌèôôðØàöâøàòîðöàòôèØðÐöòìðäØðôöâêøòööâìæÜðòêôÞöäøòòöÜøòîìàöðøôìôàðòàøøòðôØîððôöèèòøÌöèððâôöààððàòòêôòöôäðôàöôîîôôèîÈöòòÞôôêîðæðöàìòôòîàêöôòðòæêòòöäôØìòòôôööÞðôêðìâòÈöôðàôâòòôâêðöîòÞöðîäîöÞðòìîæòððÞòðôäöÞäôîðòèöðöàèîòèôêîòööèêðØôòôôØôðæìòöÞèöðøôòöæòðöôÞìèôæèôðôìôìòðäòâÌðàôîòîØäðØàðôôêäìôöðôôôêöÜôìôôäÖðèêôôöÞòèôöìæìðòòîöæðôÜðöÞòðòöàìòöòôîÒìðæòìðîäÜàìöôôîôìôòæàôðòÞôöðøÌêôîôòìàôðôöÞôòöôÖôæòôðäðäôØòôöÚôôìöÌèâòôòÜòòôòÚèôæòôæàôâðôäôðîàôÖìîòðôòêòæðòöôððÒðôÌòâîôôðèøôâìðøòîÞöðôêðäôöÖìÞòðöØðìøâöîâöôöôêôìôôØÜòìøÚêìîòöäêÚîêîöØìôÚÜìîöèòöâôòàâôöèìîòôðÎòòîòæôØöðöÞøôôîòÒîòèðÚòôöðØðôîðòôÞîæîîðìÞòòäìêèôîàÞêîòêôðöôäÞæòôäòôîèÖôâîðêöÚôÞôòêòòöÒìðôæöêÖòöÔôòðÜäòÆðôÞêòòøæôèÜôøÞöôèîîìêäôøôòôÞôêòòäôèðôðÜðôîòæøòöäöôòìðèîòðæòôôòöèðôÒâôÚæöøäôìÜæòàøöêÔòòðòòèôöôöôâôöîæðäîôÐöôôìööÐäôöôâöìÔêòøøâðôÜÚðôìàðôòòìøÚøöàðÖðöäòðððÚôôäîòòàöðìÖìèèøÞêòðæòöÖôöììðâòðöÖöØöêòìöÖööîìÖîðøòôàòôôôìðÞôÖèôôâäèöôØîôòØòìàôöìöøâêööÒöòöîâôôêêòøÞòöôÐîòòàìðâîîîÖôÚôÒòòòòèôêðàôÜòöôôîäêøàòäòòôòØôîöôÞÜÞÔöôòðôæôöôàôòðöêìôøààöìæÞôòöìÚèàòöøæððôäòÞîöðîîôÔöòîæðòèöêôôÜôîööàòðøÌìàôâôððêöæîìòöäøòòîÐòðòôòøàæððôðòôÊðôöàðêêìâðÚôòðøðôâÚðôâÞîôöðøàôòîìêòäôöòòøöÜððôÞêôæøôæòäêîðÚðôôòèðöÜêòøêöööòæôòìðòÞòòÞðöôØòôæôòòðæòìàîòòäòòðòâêöÔêìäòðìòôöððôôôÚîôôòòâôòêôæðìôÞîîôöôÜôôðôîöØÞèêèîôàòòôöêìèìôôîîàòîîðêàôìâöòòÞîôÖÔòôððöæòîðìÖêôòöØôôðæòòôìâòöööÐèìððòøØØöòèæòÞôäôìàîîôöìæööÔîðôðôæäîôîìîðôðöìøæèðäôäêÜôðøàðìôðôÎîöììÐôôðÞÔôòìâðêêêîîðèööØôêôàæðæòööòÞðöæìîæâêîöööòòèòäîìæòòòööæöîøöêòØøôîèòîìîìøÖðìôòòöìöìêöðäöôêðòÜôðÞìÞàîöÚðððÞöòôöèâîÞðäöìòêôèôÞöîöèîìòêòöêôðöäÚòèöðîàðôæèðöðæðèîöôòôêäòðöèôîòââôìêêîòööîôÜôâôöòòöÎðòððìðòàòôìöâððòîôöèððèöòôòôÚÚöðîìäòøØôðôðööäôôÞîòöØìòâöôôòÔîðÚòððØöòöäîôÞôòöÚìôêâÔðòööææôðæðøäôæðööÚðæêòòôäôòðôêîööÜäèòîøØðòôöôðÖìòòôöÞîîòòøÎæÞöøîêöôôêðàòðâðöôòêö þœðèîôæîìöÞöàîòîäîøôòôðøÚêÞôöàøâöèìöâôôôæôôìöèôêòÜôðòòÖðîìîöèôòìðÞîôðèòîîòîÞöòòôìðòòÜòöðöìîøöäðêôöêöôøêôòôâîøôàöÜðôìäööòÔîððøôâôòöðäòîäòâôðöÜôôòôòÚäîôòöèêòöðòêöôòìöèöôöÜîðòôÌöàæööäöèðæòòæöìòîàèØäòòòîöØîòØðäêðöÜòòððÔìØðôàôîôöÚðîîØîîîìæîöæÔòöôðöèòæöðìâôêòîÐöìöâæîðÜîöæîôÖèðôôÒòðððøäòâðòîòÞòòðôÜêðôâÚòôÚøðÒöÚôðäôòàôôÚÜôòöÚîòöôòâÔøÔôðôîòàêøÞôòàðöîòîôòäôðæêìîôÖðöÜðôäòðòôâîâòöæòôøÜöîÜôòØàêðòòìæôâêðôôöØôöÞòôðòäÞòòêîøêîòîäøìäîâôèîøöêîèöìÞòøæôðöèòðôôøÜìðîòÜòöôööèôôøîòîìâîøöÜîÞðâôðòèîîøàÈðöäöòòèîäöîôðöÚîôâôòØôòðôîòäòòøèöÞÒôòäæôðìÖðâððôÜøæôøäâìøöèîôòôÒööôôøöâðèèîðôòìòÞôìòäðòâòìêôæØèðîôäÞøâôÞððÖîðòòöìæÞððòèèôôðòäîòððîÜôðôîôöÞîðøìÖöîöðæôäôêðîöâèòòÌðÜêîôîÖöðöôâöìîàöðàòðîÚòðÜôêôøØîìòòðìâôöæòØôðôæàâøêØîòèôöäòÖòâêâôòâððâðÚòðôÞØöøâðØðêöàòìèòäôòöäîòöØîøÜðÚðêâàîìæôôâòìòÞÚòêâîòîôòîøêòôôôòøöêôôôôôøâòòòôàôÞòðêîÖîôôèòòòöêÜìôäîøöÜôöìèòòöìôÞöøÖðøöÚòêôøæìòôôääðöðøæêööîØêôìöÚæêîÚôôôîòÖîòêòÜðòöööÜòôôäôðäðâòôØêòôàìðòòöâòöòøàöôòôÞÜöòööèðòðæôððâôöðäòôòÞðìôðòâèðÖòøÖèôöîäìðîîäöðöæðìòððêìôðÞöîîôòòÜöÖìòðòìòÞôîöìôöØôôèèôîÔòèôððøðèöÜðìðøêðöÞòîöÊôòöìÔðôôàîôòôîêòòàððòÚêôôàðææöìòÜììôòøòÜôîØôôòâîÜôðòæäðèÖøìàòêöôèôøöèðöäîîæôøêàâôôìèàôöðèöøÜðööäòððêîôôðöäàôòèôòÜðêöøâòôðàôôòðÚôðôôæôàôòôôîôöòìÜòôðôÜôðôöôêôôôôæôöàöæîâôòôòôôôÜÞòèôîØìðòàìôìÜðöâðÞîðððòîìÞôàôðîêàîôÖèòòÞôôôâòÐðôÚðîêîøøèàðæòôäôòììôôîæòöðààðôôèòðöðàè ?ØòâôäòòàêðîàòòâòôòØôØôØÞôîðàîîÚîôêôöÚöôòöæôÔîêöìîîîäôööèòðöÞäöìæòîðÚòàêîòðäôòÚêôäööÚôôòðîæòîðôÚöôîòöîäòòèöòêöøâÜôðìòÞîÐìôöÚôâèæòîÔôîìæòÞîòöòôìèêÌôðôòôòôÜæðÒôðÚðÒòìöæâðêòôøæôòäòðìöêòôèòôöÚòööôäìôðòðøààôò „êòâîììÞêððòòòÌòêêêôòòìôèôø ôÚòêæòððîâÞòöòôðöÔîîôòòÞöîöæêÚððÖîòôàðööòöæòîäöêòîôöâòöâôöÜîêîöàêòôòðÚööäôòôôæòìâòÜòòòàôðàæðàööäðöäîøÜôðôîòìÜôòòôäòàôêìòîøìæôìîîêòîôäôìÐôÐîôòôÖæèôôòÐäÚöòôôØôôòöÞòôÚðòâôôØôèôîøØðîÜîÎòöìôòòÐîôâèîôÚøöðÔäîìòêòîâðæèððøôÞòèîîÒäòêîâöôöîðöòèðêêîøàìäîìÞöàòòòìàøæðøôøôÞôôîôÜöîôôðôöäàòðîÌðîðôðöìòöîòöäððàêîöððÚòèöðôöðêêðôôäòêöÞöðòÖîöøôðôðìâöàèîöòòäðôØòôâøðâòæÄôîÞöàèôòòôðÜøôâðìðòîâôòîÈòöäôèöæÚòòîàööðòðîôèôèîÞÜôøèêÔîæôìôòèôêòòôÖôòôôîàîîöòæèèêöâêôðàôôðâèòööòøÞôðàððäôðàòîæèòèøòìòÞîøÚòâòðæðìòòîòîôòêòøôîòâöôàîøðôîôèðøàöøðâøòèöèêòîôäîðöäìðîðìøæôòæàôêòòôðôÞêîòôäôòòðÒòÜêÞòôîöêðÜÞòîöôôôìâòôØæôðêîðôèôôôðððîÜÞöÖððìîòÚîôàòôÜîÜôôÚîìàðîöòèòòäöÎòîòÜöòîöâòðÜîìîÜîòîÞôôîìÜðøôðäðòîöòîîæÔöæîòðÚòöòôìöÜôìôèèîôòìÞôöâôîöôîððäÖìêÌêöêøèôòÞôòÈîöôæòîîòôìôâöðòÞîðîòîæîðôòöàîòÜðööÜìôòôðæðöôôòöâîôôðöòàôàèöôòîäôØÌðòÜððîôèèòôðÞôòðâðôÞêôôôÔôôöäôòæòèðîîðîâôèððÜîîàöôìæðòöòöæöðôäêôØâöÞðòôôäôöôðìâÚòôìôôäððôöæôæôôäðîêôôêðøäðôøòîìäøöØôöðèøØîîöäòôöøäâöôâðîðèöòòîööøêìÜòàòôâôîÜòôòîèÞøðòôäîìäâòàðôÒðîÚîðôîÔøæôôîöôöææôöæòòðÜôòîøÞìôôîðæôäöîìöîèæêòòôôîôØìêðêöÜôäøøäðîêöÚøîòòôôÖðìêòòìöäòðôôôöôÈòööÎîòðòÜêòêäòôøæðöäêìðôÚâöðÞôêðîöêòôòöðÜôòôðòôöäöâòìîôæôôìæäòöîêäôòèôöôôôòôàòðÞêòìòèèêêòòööôÚôòìòæîöðôÒâôìÒöòôöðîðÜòöîÒîòôìðöðÈøôäòööêðÐôðòöÚàööæðÔðôòàòøäìôöÚðôôîôÐòîððöìôôîàøäòæèÞÜôèöòîîêæÖöòâðìàòèòöøäÞöØîòâôèöðîêàôêöâìôôâîöôÜÞêìÚìööæÜàðöôòöàøêìððÎðäôîðÞìÞèöôòìöâÜæôôÒÖìøòæòìæöôôèöôöâððÞÂôðöÞìêäöÜîôêðòâðôÞôÞðòðîÜìôðôæÞîæòöäîôôîîàòòöÜôðôÜðöäàðâøÎðìòôìöæÚðòìäèøôöööøÞîôìöôöæòîÈîòôðòìØòÎòöæîìðòêòÖòèìôøðèÞöÞêèôôöøöâìòöèòöòðîðôòàöîððôðâôòòôâöÔìôæâòôîòØôòîòàòìðøôôìäÎîöìòÔâàòðæîàììàðôôæìôöôîîÞðôðÞêêôÜèäöêðòÖôÜôÞòöæìêîòðîðööâìÞîðÞèöîôòâîòèàöôÜìîòôòôðìâøòðôöôêøôîîìòöôÜðôôÜöòòòöòèêöðØèêðâòðøêÞÔôôôöðöøøæâòöòîðêöôâôàöòööâðöìðòâôäôòìôìÚòîøêöòîêòÚððöðââððâôôðôðèöôöäÜîòöìôòìòèôðöôðöäìæòôÞôòôîôæðìôÐîäðòöâêîòòâîìæòêÚòøÌôöÞÞèêôøøêìøâðòäòöôîðÚðøôôôÞöòòîðæôðÞâÚîöÞèîøÚöììâðîôâÚôòôôòàôäôðäìôæôîôäòøæôàôÞìöØÞìôêÜîîôòðòàîðæðøæäîòôÞòìðòòæÚòøôöèòöôÚôðÞöðøöôÜòððêàðæàôòööàîðìöØðôðôöâððîðôèêîäðêðäôòììôòöøØèæöòôðöØôôäðìêöèèòòòòöàêîòððâìæöÞîöîøêîäâôôìêôâôôÐòðæôôòööâöâêòôèððöîØîøôôôÜôèððøöæòòøäîîøôàòòòôÐæôîöàòøæìðöâöòöôäöÚðÞæòðôèòöòøÚôöòàîèôÜòðøðàððôòÜðÔìêÜöÚöðöÚîòòôôìîöÚòêæòòöôøÜðòðîâòòîàòðîöÜòôîÒööòøøôæøøÞøÜöôöòøØôòôìøàôðøæôòøäôìòøöäöððêôäòÚöäÞæêððòìòØòôööèôæâòæôÖòòìòöòðæòôÜîìâèîðòòðèøÊìðøèòøøÞôöòøàòîòøòöêèòÜðöäöâìôÞêòøøØøøÔêòôòêòøâðøàôîòìôòôðøæððôøêôòøîøøàòòòðâöìöæàöÒìàìòîöÔðàøâøøàøääðìöÜôæôö ¤îðôôîâøòôðæîøØððøâôòìðôàòöâòöÚÞøèèìøøøÜòøÞòøâøØòøàöîøÞðêøæðòöðäôôðêêÚîòòàîðôâððÜòôôîîâôðöðæôööÞòìðæôôæÎâðôòôäöòàðØððøØîÒðòôôøÞØôòøôöôøäòîâôöâööøàôððøìäøäêìøôäîðöòøæèöøøìäôàðæôîîèôôîôæöòòàðèôöðøØÞîâðøøöàòøäìðöôâàîòòòØöððÞøææôèðôòÞôôæÚøäìæôÞôòôôðâîöøÔôôêøöâæøøÜôòòöôòøÖôøòøâøøæîøøâòøòøâîøàôôîæîôôæìöôâòðòðöäôÒòâöàäöîâìòððèôôôäôðÚööäðÚàîøæøÞôôìøàîöðäðäèîòôöîòôôæôðøÒöðêøøäðòøÔôðôðøôäìîòòìøÜòôøÖòððøøèôôðøäöôÐèîòòðìòöâôôöðöðôîâôÔðòòòäôääôæÐòðîøâääòôÚôØêòìòøôôàôôêøöîÚòòèøäôôôÜîøàìööâôîôðîøôäøæÖòôðòîøäòòðøøÞôøäøäòèîööøÚòîîîôöÊìôàìÖöòÚðîìôàîôöðàôòòîðâòæÚöØòöòÚöìôòäöðâôôððæðÞøòòîàîôðèÚîàìðêîöØæÔòðòîìîòöÔöôÐîêîôØìôæôðÊìôðöâîîðôòàòìðÚìöððàîîÒìêòöâîÜöôòôêîÞæöæöððÞôðôðÞòðîäæêðîÞêòÞôððâðÜöôöôîøøðØöââôòÚêØôÐìöðòäôêæôöæöèèÞòòèôêìÔðîèøôðîòôøæööÞòÒØîìöÞøÚòðàòöðÜòòôîØääðòöÞôðæöêäòèðöðöØôàðöòøÞðöêðèøôøøøæäôöîøæÔîðòØòîôôÜììÞðòêòôìöôàôêðîôòÜòæðêîöêòìÚîðððâòöðâìØöðöàêÞìÞôòôòØîäöÖôðêòÚðððÒØøôÜðöÜòðæôôèðòøîððÚôðèâôâøîîôîäêðøèìöêæâðîøââòðàêðîôæòæòôæðôööøàôðöäôôìàòÞòöîòìÜÖäôðèäôøÞððÚìôÞôæòÜèîìØîòîòÐôæôðôðäìðìÞòäìòôòÜèòðìðòöÚæØèòòðîôØôôðèöôöàðØðâððôàòòìàôðôêòàòæêòôòôäÚìôäòòòòðäôôìêêâððîÌöôàòØòôäöôòòòÚôòÚêðìôèòØòòæöøòêöòêøðæòôøòòðæìðôêôòâøÞøàèîøòæòøöòôöÞðöìòÖðèöêðìèòðÞôôôöîôèòòêàôøôòÔêäôîîÞôèîèøìèøôòôäòîöôòòØòðÆîðòÞôøôôöØôðìîòÜôôòòôÖêêðêàÐòòôÖÚèîöôöðèðôòðàðÎðîôÜîâöØÞðöôòìæê ÄòîÞìòîâæîèðöôðîèøêôàòâòâôôðòÞìôæâìôööèìòêôâöðòàòòòòòòòðöäòèèöäðòðäîèöêòîôðàøÒöòòðôæòÞôòîæððîôÞôöòêöòîöðôòôòêâîÌôöøâàîôîîîìðäâððôèòòðêòòÖôöìöèðàðòâøÚöîÔðòôöàòôäôîøôèðöøôæìðø ì”ìòòöòèðòäöøôÚòîîðàôèôäòòâêöòêÔôöäöîðÎòôòòæôôôôÎôìôðöòêöàðêðæðòäðîôôâîøÖìàôâòâôâðèðêæâöôâðÞÖðôìàôðèîðâòôÞðøâöäôøôöæîÞôèîôÖôÔòîÞòôôòôàììðÜðîîøÐøôìâðôòäôâöôàôòîôâðâÞòöîìøòÔèîÚòöæôÖöèôðâðìèèôôâôØðìÖêâòòÖôöÚòôìæöèÚîèêäøôôöôÜòÞöäöäÞôôîðôðèøòôêîðäòøööÜòöäîâðìôôÜöøÚøðòöìòÜòøøòîðôøòôäììôìÞôøøøöÜøôàôêöØöôàÖÐîÞððàîìØòòèîÞÖòÞÞðøììôæöÚòôôôöàôöôâöÚîêôòöàÞîìòÒìàøöôàôôîôæÞòØèæòòôööðäôöÞðòòòîÜðàæòìðâöôöðæôòÜöòìôîæðöôîôðàòôòôàòÔØöòôàððØÞêòâÜòðÞòôÚèðêàèòìöêöâÞôðêÜðîôæôöìòöôìöæöðÔêôòòöòÊðöøÞôöîÞâäôðèôäôòòôòèòìôîìäðòôÞòòæìâôòôîêìôôôÞòîôÚðòòòäîæôðîÞæèîìòÞìÞööööêòîâêèìðîðôôÜôðððöêèôøòöÜæäèòðöäòèðòèöööòæòöðîèìøæôêôÞòööðôÞòØðöööèðæâððÚèðòòàòâððôöÚîööâêöôöîàöìÞâìòèôôâðôìøÜôôöôàðÒðòæôôòæöâôôðöìàîöîðøøðàêôìÞæøêðôÞêòàîêÖðöîôøæôîÜîòööÚôììöæðôðæôòôêòøæòðöòèôäöÔâäèôàîîÊæîôôàòâîîìÚöäôôìöîòÜöôôööÚôòÜôòîðôôöæòìöæâîøÞðöæêôèìöðèìäôöðêöÖîöööàðôòìÔîòôÞôîàðêðöêàîòôàðòôîôàöàòêôÎøîòôæôòàððòòôööÜðèòôôäîòööìÒôðèîðäèòîòâôàÞìèæêðòÜòòèöòòÜðôÞäðîÐììÞòèôöìàîðòøÖôôòìððöòööìæöôÚòôÜòîäòöîòðöâöòäðîìöÞêðîððöøðÒæìôÜôôìÒêôòôêðöôôôêÜöäìððöòäìàêöðìäðòööÜÂÖðòôîàêîâôôöäôæîòàìöæòööðèìæðöðîÖìòìôöàöêðòöÞòôîîðöðäðîòêðÔêðìöâìðÞðöÞîððâòòêðÖòæðöæööèîôòîàîäÚôòàìôôîàöÜðòòòðòîäöÚöðööðìÜêÖôôøæöîøàøÜîææöìòâøôòðäàîÒìòîÜôôòòÌôèôðöðÜðÞööÞòìôØööêøòðôððÚâêêðîðìîîèîìâîôìøðððîÎòæäððôîÎðöòôàôôòêöìðÚôîôðôÖæðäæìêàòööâîîèæàÜîôöôêòôÞêòöÞòôîòÞöäôæôðòèæðìôôêòøÜôøòøäôôìôæðÞôâôôôâòôâäîÚôòôðæðôòîôîÖòîòôöîðöÌäììêôðâòòðìðôæøÐôôòöèðöòöÞôæîöòöôÜêðêôòôôÖìööòôèÐòèöðèøÜÜîðôàôèìÚðÞöööàððôòðÚöÞòèîööäöôòæäðîàöôöîôÚîàòôÚôôìòÜôâêôìøÜîìööøØöæâìäøæøôöÞöðøøøÖøìðêìîîøâðòöøäøòÚòðôøâîöòøòöæôôøèôòÐàêôÖìôèÐðòöÖêäðìäôäðòðöØôòôÚöìòÒðöàöâòàäîîêöîøæèîðòðìîöìøÞàðäîöÞîôêâøäøâðöôøÚöîôøøÞøÆòòòøØêòðøôÎöøÞðòðÞòðâðòðàîìÞôèöðÚðöòòìôâððÔìòðòðêôâôòòêîâîîìòòàöäðôööôæðòòøâîôøøÜôàîÞôìôìôøèöâöòøâôøàøêôîøâîøÜèöøðäøøÞôêøæêöôðâêêîòîîâìôðîìêÒîööòîðôìîØìöæòöèðøöÞôòöâèØöôðèôîðôîôæìòðîìòâöæôôôôòÞìîôîøâöèòððâôôøäâòìøöèôôôôÚöìðôøàòöÔÜîîôöôøöâôòòøôèÚòðøòèòòòöîîøÚêðøøöàìîîìøâöôæòôôòâðöäòôìôäìîôòìâòôîôèôòâòôöèêòòêèòØôòèòôðÚöòööêîîàððêôòæööÜôôøöäôìðîøäøøæôòÞîôôöòððöÞòæöîîøæööôîòôøÔôèîøèðôèòøäøØðøÜèêîøðøàîôøâðòòâêìôÖôôôÒîöîêèôòðøêôîàöôðäöîòöîöôÒêìðîôäòìôàôÜôöòîæööìæêòêððØøîèìôøÖðôæòöÜøööÚôööæêìôîîôøøäòøÚððòìðøÜòîòêòðøàðøèöîîìøÐèðôôøèôôìøôöèðòôöðøòôäìôôòôêðöäöôÔîôòâêöööâðâàòæöòêðäîôöôàòÞððêÞðòòÜäèðòîôöæöàôòäèöøôàæòôìîìðøäòôöôÔìöâîèìæòöÜòøðôàòöøÞøàøîøÞòôìøæÜîööðìøøæêðòðøäòôêôèöøÚôòæôòöÖöôîàöôâìèòòøÚîðâøðÔòêìîêêðÜðììòæöÎÖæðôÞæðøäòîøâæêðòôöðÜòîðîÜòòðøöÜðìäîòøàìîøâôòøêììôðøâòöøæòòîøøàòöøèøøæôòòæôòîÞîôÒòêâøìôàêöÔôòöìòðàðàöêôôîôæòöòòêÞôöîððîäòðÞöîìöàîòâôîîêäôöôôîððòøàêæôôôèðäôìöðâæôîöâøÞêòðàôîøâððêôøæêðøêÚöðòôöôöæôòøäêöÞôööÜÚöîôêôöâòöôÌôòòøêöòäöòêöððâòòöæÜôöîèêôàîôôôðøöÞòôòîôêòîöàôôøÖôøäæîòöÚìîôîôðøöôòâöòôæêòðÞøøîäîøàòôøÚøðøÜòôìòøÜîöðøôàäøÌöôðîîööæöÞòöêîìäðèòêìæôâîôòöàôòäòðöÆîôòÞððêîôöàìôæòôöêìððîøöÔöôÞôàôêâèòòâèôîÚòöîðôôèöòîôòòâìôâêôðÜìøòèôêððòøâääöîôìØêèòìòòØöèèäôâòøØèöøæìêöÒðòðÖêôôìðøÖîêøàøÖìôîðØîòøôøÜòøèàððøàöôøèðîâôöìêìÔðöâîèðòäòäôìâîðìÜòðöîôÞîôôìÜîðîòìðÚôøðöðìÞìÖöðôøÞæôððøèðøæÈöòòêäôòøòðøÒäòòôèÐìòôîäøðôöôæðèöØøÔöêèøÜöòööðøöèöøÚðòöòøâîêôööìðøâöðèôøèèôâðîòöÜòìöôÚòèöøâôøöèòøäòôææøôìàøÜìôðÖðêàôòàöêâìîöèòÐôîôðîöÚôöòîòìðÜðîÎòòîôòÞöðôöâêðôòèòòöðøèèöòðèîðôäöæøîæðèôðøöôîôÜòôôäÞêîðâöìêôðìôôðôèòöôàðöìðàöòÜîÞòðîøäêæððÖòôâôôêöööêàîöôØöâðòöÜôÎôðòìêðàîòÚìöÜöàðÔîÚîâðîôèòîæîöàîîòøâöîòöðÚöìöÜòîðòàòÔîðàîòòæôôààôäðèìðèðôöÚöìðìÚäàèðööäòîÞôöòìòÞêôòòäÐîðòôòâòôòøäòöìîîòôöòöîîôÜööäîîðòæôöÎàôðîðêôìøæôòìêäèØôòöæàìôäööæôîàèìêôòòèÜèôîðððòæìæôôðèööìæÞòòôôæîêôÞèöôòäôòàæöôìðêòôðÌôððäðòôðððäðæôððäðòôðØðøôðôðöèòôðÚòìÞêòôðâòðÚôîðöðæôôöäôöàòôöââîîôðøäìØòìôîÚòôîôôîôÜöòòöäðîêòâêìöðÚæòòîðòôðîôÒäìÞîÜôðØôðöôòâôäöÚàìêöòìÐìòôôøâîìøäôöððòøÖêðøöòöèòøîôöàøôôôêîêîööÒîðøôæêöôöÚøòøæîôâðäòôäììîäòöòâèðèèêÜîìÌôêîôæöòêæôâììôôôÐðøðöÚòôâòðöÒòôôòòÚìôôòèøôöôîîæôÞôêöòîöôäôîìèèæðîðìÚôðèêöðîôØöððøæöööðôâòôôøèöôìÜôôêöäöôòöâôðâôêôøØæôÒðîôôîøäðôîôôîîðäööàðÚöÜðîôîàôàðèîîöøäôòøôäêôÚôòôöôèôòðêòäôôâîðîòðÐîîôöÚòÜòòöæöÔîîøòöîèôööäêôðôìäæôîðöðöÎôÜòòöâìðäöÜôæÞàðìôØôòôÜðæòöôäìðÚöìÜòöôðÚòèêöìèòöêìîððÞôöâöòôðòöìÞòôòôâèòæèôòöÚèððÚîâòööàôöÎøôòìôàðòòôèÜðôòðöàðöäòðîæòøÜòäèôììÞööòòöæôôÚððÜîööâôÔööòðêðøæòôôöôâØòöèðôöäôöÜôòøØôöæôæôøâöôîÞèìðôòÐìòøòîÜîôòöøôèìöâôîêêÞêîððîðòøÚêòòôðòÎðòøæôâöòôôôêøôêæòðìôôâôôÐðèøðòÜòôøÞðòðìòæððôòâôæôðððòîòäððòöÜðêòöîðØÖðìòäððèôðæôòòäðêöòöòÞîòðöôàôôìöàêðøÜèôðäîèôîÈìèäâòöøäèöôìÞòôòôêòÎòîôðîòäôôàòöÚæòôäðööÞòìðìðêâðîèòòèîèôæèôøôÚøìòðÜôöìêöØðòòòÌìòèòìîôÐèðôôæòîöôðòÖòêîôöôÖðôðàôòôôäîâôðîôîòìòìîêòîôàôîâøððêôêØôîòìæöæðèöäôøòêôÞêðâðöðôöÞôôôôîôÚôîÚèôæøîðêøèêööèöâîàööÚðôÖööòøØööîðöêôôðÞàîàòòæöÞòêðèöàðîòòÖðÞêòêâôòðòòôäîèîêòôôàòîòôîÞêâöðìæÜòîòäðîêèðîòèôôðêöòêêîÜêôôòôêîîòøøòêöôÜøöäøôöÖìöèöÜäîöîôòÐîôòèîðîöæâøöôäòäðöòôèööìêòôÜÖîöôòîøâöòôöôàòöäæòðöøêÐöððôØÖðøäöòðöøøâòöòðöôðôêôðöäèðêêìôæÚîôîôîæðòôÚðôôòæôôÚðìîôÜèèâìôöôÜôÜîööÞöôôòäôàäîôÐìîðÖòîÂöôðèÔøðôôäêððòôàöðôÞîäôôôìöòöÞàðôôäÜòòòèìêìâêööôðàòîêöèâðæøØôöæðêòØîîòôìòæòøÜöôöòîðîÞòôÒðøôöê8ÜôöìÜìâöÞôîòîîööêìòôòöØòòöÞâöàðàÖòòòðöôòòæîèöìæòîðöÚèöîöôÖîèôöìøðèôøÒîÜòðæÖôòðäðÞöâðèÐòìðâðîðÒòôôÔôîæîôððîîôÞöîööèööÞôäðöìðèôøîäòôÐèòöàôöôîøöÔòðÀèÒöòâôòîæìòîàòòôðÜôððâôìîÜèîôðÚîôèôæðòîàîôôöàöîðàäÔôöðàîòèøØöîâîöèöòòàôöôÚðòôôêöôÒðâîððöæàòððîðôèäîäìðöòðôìÊòîðøâêðòòìÞôàòìôðôêøÞôòÚðäÚêôððäôðîâÞèòÜâøöðîöâôòøððöäòøÜÈöðöÞðôôðØìôÐòîðîìÒêðòìÞòôôøøàêêôôâöðôîðøîÀôöòøøÞôôîæôÞòÜðæöÜôòòöôÜòòòÜîèêòàäððòôæòäöôðÞôôöîòòðòèððôäôöäòôäàöôèæôöâöìÜîöêìÚðöÚòòôðÜòèöææôîèòâøðôðìøÔììòøöÒîôðâÚòîôööÚôòööØôèööòòÚðòöööÜòòÞôöÒøìÐîôööäðÜôôôæöìØèôòôèòìîðîôÞØòøèòìôìòâôìâðòæðÞöôäêôðôîöÞôöøÞìôäòìöøèøöàôììòêâîîøÞôòîøøèôøêÜôòøÞööîöîøêôæêðøæøâîöøàðòîøäîäðöôÒìòôÜæâòòðòîÞòòêòðôäðèòôôêöèöðæâðîôôàöòôðàòîÞòîöôøæòôôêðÖðòòðòðöîòìììäøàâðèøàòôôòøöÎîòôòòêôêøøÜòðôîôøàòîøæòøòàôöøâøèôââôîôìôàôîîÜòäòðôèîøìîàôôâÖòêöôöäøðøêðòöôêòäöðìôøðäøØðòööÚøôøøÚêîøððòøÖøôðæðøøÐîìøîøøèêøâìòøÖòðêôîðøÞðôôðøÚôôôìøöâðòòøÖôôôøÖàòðàìôÜôðòôäìÜòðîîÚàøîøòâððìêöòâòòâÚööìööèòòæðòðÜÚôîðôÜæêìæôòîÜðøöàøÔðîôôòòäèêôìôøÚøöìöôôøØøÚòöîâêðòîôÞðìôøîîêööøäìòðôâöööðàòìâôìÜòôöÞêôæöìêøÞîîðäøæäòÞöòôòôòòÖòìâôîâöôôððòôìäöôòêðîðöøøàîôööðèôôèÔôØìðæòððâøæêôöìÒêòôêöâôøèôðòðèÖòôöìîðàîäòèèöôòööèÖôòøàòôâöôòôôÞâðîøäððôèòôàìöÒîòìòôæôòöÖòðôöôÞèìâòöäÜðöòòàîòôôöðìèðòðòøÖôðôæöäööðæôòîðòæòòðîæôøàòðöÖðìððôàöÞôôæôòòèòøâæîðÞæööæîÚôìððôèôøîììôîöðäöôîìøæòÜäèòòîòðôàìøòðêöêôòÔððæôöòÚôôìêâöâîðàöðòòòôèôêööÞêòöèìðòÞðøöðäìèôðòôÜîîøÞôöàôðòìÚöòöôôðÖðÖòôöîÜòôôêööæöôòôðìööêöÔðôÚàîðo8òàðòòòêððôôîöîøÚîôôôôööæÞìîøôÞôÞðöððìâôôÚøæòøàöòìøöòàîäðôèôøææèôäîòðöìêòðäâîÚèîòîöÎðôÖôööôøÚøÞòòÖôôòôÚäöòôøÚêìèäìøâîôääôêôôôðØòöÚòôÔòÚêèððöÚîôîòÜôÚêèôööÜòÎðîäøôàòîôðôØðôöøèìôööèîôÜÜòòòæðìøÖôÚìðôÜòòðÄîøòòêòðàöÂôäìîòòêöäÎòôðèòÜòðØêæòÞôìöÞòìÚöäêØðòèôòøöÖîØäêòöìÜôðÞìâôôòðêæäòðôÞôðîÜêøîöâöôöèöêòîôâôèðððæôìòôòæöèîàîôÚðêòòôôðÞøîÖðòðòîæèööðôÜðòøèðàòðêðìòòîäðÔìæîôäîøÚøêòðìðèööâîôÞêòòìôîêîðìØîôôòöîÜðæâôôðöîìàòö1$ðòèîòîðäôòöðØðôôòÖîîôðôîôòòòæâòöòòòæìðêöÐðìöæòÌðòÔîòììÚòðöàòîîööæôìâôìîÞôàôøöìòîàôØòöææðøØððôòìÜø"ððÜôÒîðööòöðâêêòîäòìæìôàööðôÜðèîØèðöôöôâòðöæêêðÞòðîðêêìÞðöòæàòðòðôðâììòððèôêòôòöÚêÞêòòæôðöÖôôÚôðôòòôàîòæèìòîîÖôðÞôðòÒîöäÚÞìÞòôäôööÞòôöàöìðôîôæôôôôðôìâöôØöìÚòòòÔèêòìîöÜîôôàêôôâðôìæòÖòððæôîöàòðòêäæòððàöðøäìôØäììøÞôððöæîôôìöàôÞêöôòÞöîÞòêÚêôòòìÞòôðöÚôØêðöÜôæâòöæòôðàöàòèôöÞæàôÜìææôððÐðôìÞöâÜîöàîðòìäôòöÞöòæâôòÞöêôôôÜìôöðöòÚðæìðâðððìèèôìðÞèöôàôööîÔðêÚêðôòôðÞêìøÔôôöòæìâôêôööàìððÞðòêðìÚòîêìòðîøäòèòèâðôÜÞòòòòöÚöêìäòðîðòêâöðàòðàòæòèèÜôöôîìöèðôÜôòÜôîÖîòàôðæôöôÞêìðôøÞðòÔêòððòÜôäàòàòòÌôðôôòöâöîôÖòÞôèîðâôôäêàòöâðÞòðâöÜÞòðìäèðòôâôìÚîòìðîîøèìôöÜöâìæôîòöâæòÒòìðöîôôÜòðôöôöÖöêðìæöôîòäàòöðÖðòöêðòàôäôøæöôäòôôôæÔöôòÞòðôèööàðàôööòîðîèôöìàòîäÞôôèòðöÜêððØôòÜêâìôöÞðôðöÜîÜâöîìèòîèðÖìòæðäèðöðòÞöôòðîôÎôöòÚðìðÜòÞòòöÖòêêîôöîôôÚðôèæòîôôâÞôðÞôêòìèòôòöòòôööèäðâòôðØôôòôììòòèâøðÞìâôäôôàììöòæòòöÚðöììèÔðÐìâêèòöðöìîôôôðÞâîèàØàôöîêîìÌôòêêâêöîòîôôäöàôøøâæêôöäÞôôâöîÚôæòîìàôîôòôèððôÖòððìØðööîöÚÜôôÜìâöòêÒòôðìðèêôôôðòÜöðòÜîòöÞðòêòòòàÚÞðìöäôäìàöÒîðêêöòôÆôòÞòôòðäîâðöæÒêìòöòøâòöäöòâòèööôôîöÞöÞîìàøòôÞòöèòÞòðòöêàöôôâðÜÞØìîòîØøææöøÊðìâîèêôòòÜêðôîðôôäðôäêöôêêàöÖäìØòðÐôòòööØòÒöòØôôòôæòòòÞîìîØòöòèòôòîÚöòôôæööôÚîîøèòôÌðöÞòîðôôêöæöêòôôôðêîðøèôöööîàðòæòöôîèòìðöôòÚìðòöèöêôøÚòòðôöòôàöØðôöâòðÞôàöÞöòöêòìÞòôîâìôòðòêêööòôðÚêæìðòðòòäìîòöàòòööÞìöôæðôæôòìöêòðòäèôôôôÜôôâîôÜêðîêîðöÚÒðÐøàîôäðìöØàòöâôôêâìòÈàðôîìæîòôòòâîàööâìðôöðèäðöâðÜòôòðòàöôîöäðòòèîîäôæööôÚöðÜîðÀòâèîöàôöØòòöâôðòâôðæôîØîîòìòöðøæðöôîôðàôðîèòðøæÜôÎìòîäöìÜöèðæðøðâòòöâæôôòòäòîÞààôòèðòòæòööòòîàôòäØìäôèôÞôöôÜöôôÞôêìôòìîòòäðòôâêòòêøôòÖôòîìöèðâðîèæäòôìøÞôöâîîòàðàîðÞìôìòöèôðäêòâôîâôôôØìöèòøìöîèðêòêìðìÐðöäøäôòîäòòðÚòøâðÞððöôøâìòôàøöÜêôööäðôöÚìôòöôììäðòøÜèàöòØèêØêðöîîòôâôôöøîôôäìôìòÖÞîðàîòððÔôôöäÚôôæîøøÞðòàòöÌèòòøðäðîòööðìÜôöêðøæôìîâðîèööððÎøöôäòÚòôòìîöØöôòîòæòîÂöâîèðôôòôæòðòìäôÜðòòÚðîôèôîôôæàîôèöìàöòöÒôìæîööàòøòâèÞìðìæòðæôðòîäòòâðîìòòêèðòððòöàòòôöòòöòàðòâêðîôöÞêôöòöèôòòîôæìôôòâòôâôööàÖîîìòâòøöâîÞêØÖòðÚôêðêìâòðâøîöÜðìðÜòôôôÞðàôÒêðÖôêöâôøäîòòìôÞôòêôðÔÚèÜôôäòîìèôêôôôÞòöäìôôòöôÞêðòîôìäöîòîøÐòòÚìäöàòòØâÞìîòîöæööàîêòöàööôòÎêôôàòòôäîøòðàôòèîòöÚÒîöøÜäôòôâôêòòðäòäðèØôèððøòàöØöîàòðöîäôìôôèöôììîâìôÆòðöâðòôÚôðàìòòòöäìâðòôøêðìîÜöòÞÞæêîðêìîêÞøððäòâìôäòÞôÚìöîÞööêööÜâðòôîêîòôìöäððôòðæìêðäêîöìäîâêèîìðæìâìîæòÒòôêèôêÜäàðöììôîøäâàîðÞôîðÚìôàòöÚîðöööôìîöøÜèðòôôèòòèôæðâÞôòàöôæòôÚòðîâöàÞðôôðÞòÞöôðîÚøèðìàôâôôæöèîôæðÔìôòäððòêØèðèêôòàòàòòôöæòøèôðøâòÌôÞòàêôêàîöèöâðòàèòöôÜôöÞðêâòôôîæðâôèêæððôÚöàðîöêôæäîØîâæêðäìîôàìòôôòòôöâôôâðôêÔôððôàòìðôÊðîðÜìöÐôîòôðàôöÞôöðòðöÌîôÐìÔòòðèôîàîöðèððøöðÜìôâôðòèòîèðâØôôööðÜöøòðöÞôîôîÚìäàôâôöîÚöøôòØòðîòðÞøàðÚôäôÊøÚðîòÖôâòôÞôöÖîòìèôôøäêððÚöðêâôðÞèêòæòÚòîìîöæøðäòôðÒöôÜôôÜäîêôîðìòÜòðôæôèîøäððäèôîðìòöôðàâðìöðîôðâîìâöðêööòÐìêðèøòðôøòøöàòøøàøðôòîèøôæòôøøòàøøöôøîèøôòÚìòÔððòôöòîîöäðæöðîðÖìôâòööÜðêöôäêðôàððøôÜòôìÚîØöðÒòôöòöÔöêêôôöôøÚôðøöôööæìÜìôòÞööÜêÔôðìöàòîêòàððöôôÔÞìðôòììôÂòôöäòôâôðôìÞìîôîîôÔòæìðàÖöòöäêàÖêôææòöøîèêòðîØêÚÜîöôØöôöôÜèòìòöØòêôÜðððôèÔòîÞâÚòôîäööèððîâôôðâôäôôôÜôðòÖðôôîêîôðöäêòòôÜòòØöôâòòòäøôæöòÖòöôÜöôÜððÜîðôîôÞêôàðèðôôîðÞðöøöôâòòìäööòðäêðôòðÞØìîäôèòòîöäöîàìòòîèðâòððÞîôîäîâöìäîîðîöØôàôôæèöððôÜôøòøàòÞìöôøâîòòøèöòÜøêðìôøöòôìêîôèäöìæòêÒîàæôôèðöîèôôòæèðòîòæòÞðôðòìÎðêôòîèôìöìðÐðîìöðôìòäðôòøðøÒøÚøöòÔøòÞöàîÐòøòàøäøææêöøîìæîøöøäøêêøìèøöæêòðôæöìðøöäôæôîèöôäöðØîðâòîÔöìôôØòÔöðÖÚôôêöôøÖîôðèôøööÞôâðôòöôàðìøööôøÞöòøøØØôøööøìòìøîôøÚòøôðìøòæòêöøøöìèîøøèèøîðøàìøðøØîøòòòöøæôöòäðöôôðøÚòäîöØòôèäàòðäêöÔòìòòðòöèöôàôæòøÔâðîôôÚôôîôâöîîæÄðôôòöîàôöàîðìèììððòôÔöòöðòøâøäôòôîÜôôìâìöøâêèøôøöÚôôøØøèìøÐöìøâðìððøâôøØôðøâðÚôØòöìöÞöèðòðîÜôôîöèòòèðòìòöàèäòòòôìôöÖðòîòðÚìôøäôòðìêöèöäòäîøðôäôæôðòôæôôàöðòòÎÜðæîðöôÜööæâöðôôàòÆöòöðöÞêòöâàæôæòòâöîöàììöìðÞòêòèøÚèîòòæööÞøôäôìðôôöÎòðòöÜèæðòæìâôäîÞâêôðîòâôèôÒæòôÜôôäôîìøàöÚèîôîôÞêèìòèìôòæöÜôòîðØòÚððâØæòôîîÜîèìììèìòòôàòòööâêêôöÔøäîêôòèôöÞðôæøòàîîäòàîøôôêöÚøèøîòæèôöÒòððøðòôèîàîòòÜòÜòÚòðôöòòêêàêìæððöäîìöðòòôÚööîòæðÔòðîØðêîòÐêîòðìäôêòîÖöøøöðàÞîôôðæðòÐòàððôèòÞøôäÞòðòêöÜàîèâôòÜÔðæîòøâôòôöÌôððêèðôÞÐæâðòìæòôîòÞöðòòêæòôæôèòòîöòâîöìæôæòêôøäöôäêðÜòðòøðøòæèòðìðàôøÜôôêèöääöÖòÜôâôöêòÞöììöâîôöäîòöÞêìôÎæîòðêððìîèÞòæöòêäðôìòôøäøòòøðÐäìÜòôøøÐâøÞðèêàèêêîîââîöòäæîÞðôÜöøìòäòðöòìöòèÞôòòòðêîðâòöìöèèôôîàðòðöòððÞîðÖòðöðòâòðøèôðøâððîÜôîêèòìöäðòøööôðòîÌôèðêðôöØøêôòòÜôôöðØòîöæöðöòòöÞðôàôäòìôìøöââîâôôöòòêæòêøòæôöðòôÞöôäððêòòæìöÞÜððöÔöÒòôðîäêäðôôöäòîôêøÒîìòòèêèìöðòîîÖôòöôðÚìòìÜêøÐöòîôìðòæöòîÞìèöêöôöèîöèðÜðÜôîêöòîØôôòðÒôòòööòîÞööøæðôîôäðòèîÄìðèèòøÒêôàêòðôÚìîîðæòèðôðôòôàêîîôðæòöðèôêöÖòòâöòòæîæôòâøèîöäìöØøÞôôôööôöØìîòöìÌòöøöæôÐôàÚøìôøÖòèðòàôØôöÖòòîÒöðììæðìðôîâðÎøôôôäöööàèôæðøâðøöÞöÞèòôðÚðôòâÐìîðêðäòðÒðøæôôÜôöøæôöàìòòøàøàðòòäòòððäèôôðøöäðêôðöæôŽtòòøÞìòôøâôöòôäøòôâîèòôöàöøÞôîäòîôâðäòðÞÚôêîöìîÞðâôöàÎìîøÞöôÖòöÒöìöäöâöÜøÞìôÜöèöøÞôâôôÌöäÖòôôÞäôööêðääôôôöððòÜöæôìôâäöÊðêØôÔìîôôôðøôôÞîîòôâäèðÞÔèððòòîÖîìêèîÚðêÞöòöÎîèîîòòòððøääîðöæôÜæôÚöòòìðÜòôòòðÔöøöòæìîôèòìðèòòòâòòòÜðôêðöÚìâÚÜðöæêÖðòöØôôðöÜÚêìäðîòÒðøòêæîäôööìêâöòðòøÜèøèîòîòðàôæöôîäàîêôöìÜððöðöôàôðððîøôÚöÚæòðäöÒòòòòðôèòöäêøàðöðòòîîÐøöôøÞòòÞðòìöæðôôööòÚôôôÞòòðòÞôöôæôîðòòêòðòöîôêôôôôàèèôìîòôäîôôôðòäàöÞðöøÜîððäîÜêîìòøÞÜîôÞòìâäÚîôòòôòÞÐèèìîØôöðÖêìôðöäòðîôìêöâòðîìâòðÎôîêÜôÌöðöäòèòôæòæîäôôöðØôöôôÜîøâêôðäøðöôîàîööàòöøöööÐôòôöòîòäòòòöøèòðöôèòöòØìöðøÞöòÞòôòîôôôìøöÜðìîðÚöòòòôòêöàîôööêöÒòîöÞðèôôØòôôòòðêîôìæêöôîÜöøàòôâìæôðòäöîàìèæèìôøêÈæòòðÐôîðîôôîðôêîòäòÞêøæôòàðôööèðîÜôôæèöàøòøèòòðøøäðäôÜâèîòòðòàòØòâøÞîôäòðìàîðððäøàðòÒòøìòøîæîæÔôòöøäòöôöôÔöòòðäôìâîöðôôðêöôêôöòòÞòòèòîäÒöðøøøôöàôðöæîöìðøÞøôîøøÎàèðööôäôòòòöôäôðâôôòØøððôîòòîÜòòòøàèôôìäôêòøøâôîäòöøÜâòöôòôÚòôòöÞîäôöòâôðòîòöôêàôìðîòäôÜòøÜêÊôôôööîðèøøôæôäòÜîòøæîðøæøòòøìÞæôöôìøàôîîòòÈîôôòòêööôâôöôôòÞîæìîèêÞðøööîàøÞôðîèôîöèöòÞððôòêððòîðèæäâìòöæôðàòôôòØôìîâôôòòØðôðììÜòäìòòîôêðèøàìððàôöîêöòøÚàðôðâîÞôôðêîêôàîöæîðîôâÞööæöîîêîêôÜðîäØêôöÞððìøîðÞôîêøöÞöæôðäìîôòÊôâôÜèòôðàîôöôæôêòôòÜðìæôØòðÚðêêðîàöøæöèööàðòöøæîìðòèøÞððîôòìîôÐôòôìòÖòôøòôòöòàôòôäôðôÚàîòììÞðòôðæðÚôìöÚêôâöîôðÞòðøöØôîîêîöôæöðôðÜìôäôøàòòîÒöêôðâôôòòôìôäöôôôîäòÒððððèðöòöøÜòöæòøøðÞðöòÜòôðîäîøèàîòìæôôÜôôîäòèòìèÜðöôæöòðäöÜöðèòîæôôøÔööàôîöîâôøØðòðôððìÞÜêäìôäÖöòøâîîÖÞôØòòòÚðæèðêìîÜöîøøøôæöàêðøâòöøØòòðîîÜòöÎôðòôòìøöæòîìôàÞæîòìääôòâîêöôðøêæôôôôòôòöÈôòäòôòèîøòòðäôôôøîâøæöòäøôîàøòòäîêÞôöðôðèììôôøÞöâòäèööäØòôòøôòäøðîàðâôììòòòôòðØøÞôðôìîàòòôòäðòêòêôêðøâìøÞøòòôôòðøøööâðòðôøêòøôôÜôôøØööøêÚêöôîìîøöàèäôðìîÔìöðÜòèîôÐÞêêöØôðôîäöôàôìòðàÞðîôàòèèðæÜêòäòââðôøâôÞôæèìôòòòôòðôöêöêðöÞììôòìðôÐôøÚøìîîøÐîèèôôøìøàøòæððøìâøÖîøîèÖôôòìòÞîìâðòòöööòäêòöâîôøîìðâÞðôäôòøøàöôôôøÚðöÜìøöìîòøäðîôæôðöìîæÞðòðøÖìèÜöôÈðòäôôòöôîâòòôØòèòòîøÚîìôòôøøØòòøØøÞêòòøôÞôòòøìòððøäøÞòøÖðøöââòøÖòðôöÜìêòøæòÞðôôðâìöÚððàöøÚôòöòöäöööøöøææòðîæðäòððÞôððîøâôæôöòôÜøÚðîêðÚäôøèîòøàøôîòøôàöøöàòøøæìîæôôøàòøäòîòìòøæÜêîòòàòììôööìèàææðòòôÞôòôØôðöôÞöòèøôêæììðøêÞðÖøÖøôðÞèòîìôòöøöôøÚòòÚôìöØîôÞôîøôÜøâôîøâôôöøÚöøîøàîôøäøÞôøæöàôööôÚøæôöæøäòðòÜðæîîâöîîÚðòèôØôîòàîÞòôòÚôòÜîîôìêôàæøöÚòîÎðôôàÚôòàöîèÜîôäêèðÞêòÌøòÚøèîîøæòðøØîòððøøâòîìøÖìòîøÞììðôøôöööÜðøðìøøæîøìâîòøôööìòòêöèôøÞòøÞÚòìøôðòðøîèòôöøôÚøÜøàôøðöêøôôøèøèòîøðâøÚòôìðæìêôðöàòìôðöâøàôöðøöÚìôøøÚòøæøØôðôøÚøÜòøæðøøôàòôøøöæööÒöòðôöèøøèæòàØìøôÚôìèèæèôøöðôôøôìäôôðîøäøöâèøòöøÞöôöôøÖðòêòèôôäðîôÜòòèôôòòàôôôîððøêôôìøöäìòòôöøÞöööøÖèöîøöØôòðøîîððôòîøØêìôðøèöòøèöÒôòîøæôìòôðòòðäöòÞîÞôìøÎöîîîîðøÒöäòöÜòøÞöðäìôÞìöôðððâôôöîÚôøØöôðöòôäøöòàððÞòàôòôòôÚøøäøèäâîøÞîêôòôøÖèøöâøôøâöðøöèòðøäìäöðôèøöâàÜöìôäöæøòÞîøââîîöðôøìôòöèìòàðöòôøøÚøøàîðòÚèòðøøôâöÜÒæèôøðìôðôòøöâøàòèøÖòøìÜìøâòöêîøæÞêæîôöôøàøêâøæìøøÜøèàäôîäðôòöôàôòôîêäôìÚöäöäæôàèôøòìÞöìôöÞòêöêâððððìðôÞìøðÖôôôòôäôöØöàòððÖÞôîäöôððäôòìöäðêèîìðàðæÜöðôôôìêîÊîðòêØÞèêòâöäôÞìêôôìäöÜðôìðâðæòìæîøÄðöæòôôîôìæîðÌòðÚêöîöÔôôòðôÚØòôôèòîôâæôòöÔôöîîöØôôðÖôôððÞôòÞêêàêÖîêôîòòèòìàðøôðÎôòôòìøæðöîÖöìöàôìòòôòÞððòðêôâØðöôðîîàÌðîèøæðàòôööæîôìîòöÜîäöîêðöàôðôôôîøâìôôööÞèêòðôðòØèÖôòðäôòôðòæèôÒîòìîÒøôòÜôòòäìòôèöêìÚöäâêôðôðÞîæìöøððööðäøöòêòòôøòöìÔòöðâèöÜôäôììöøäðâôæôòÞôôòöìøÜìèèøàæôòööÚôìäîöìæôêòøâòöìòìÜðêîöæðöøæôôøÔôðöôòöØæôìÜòÖàôìôæòðäììöÞòðöÚòöööôêðôèòîäôìÒòÞÖêòîôööôøÞöâìôÈòòôîðàöäðòàòöæöòôøêîêðöäîøâôðêöøôØôòîôÚêêîøâòðèÒòôööîÜôêÐâÞîæîôöôàôèìäòîôòæòòøòèæòöàôðöôîÖðÖðìèðòêöÖòâÜðæòôØðòôööÖòæîöööæðôòöôâðîôÜðêòòòêôÜòôòäôèðöðèòêôòöìðÜîôôàðôÚôðöðöòàîðâÜòèâàîòàèìòðîèòîàôðôêòòòÞÚöôÚòòòöòôàôêôðôöàöÔôôæîôòìèôôâöæôöâÔäôöÚôðâôÜòîòîîÖðôÐâôððôöàîòôòîòæòòøØöìòäôìäöêôôÚêÞøòöôäîòîöôØèîòäîôàôâðòòòööÞôððÞòÞÞöâððÜôòìêîòðöÜðàîôöæðæÚðôöîòÒêîìôÚòööäðØðòðæîöÚðöØððöööôöäòèèôìöøÜôòòôäôøâîððÞöêòâöôìîòðäîöæòððøÐðÞòèòòöôöòêÎðòòìòäòôðððîìøòÔÞæöîðÜäòðøàèòöôâÜìÞìòàôøÚÞðìÜæòòððäêæðôîòöäöèòððøÎôôòôöøÜøööôôðÔîÞôèøöæîôôÖîôàêâìôÚæîøøôÜöÜööàððìîôäôðäðîðîÐîðØôôòàÜðîäöâòððäôîöàêôôðìèäòôðàðâôîììðìòîÞðîêîòöâðøâøØöÚòôðàòòôîôððàðöðæôôôððâÞôòðäîðÞòäâðôöîôàêôÔðìöðÌÜôðàôðæðäôîööâðôöÚôòîâöâòôòòîÜìöôàêòòàöðÚàöðöäöêöæøêêöèèòôÔîòðîöðøääôðððÜôòòðæöòàôòâðôôöòøôâöôÔìîòôôàêôøàòòöæöîöàèðâØôöÞòòîòØìîèööôÞèôÞôôîðæòöøØìøðàøöâèòøèøöòðêæðìêêÜøðôèèðòøæôäòöøäöêàðòàòöôàîîæöîÖöðàöÜàðèàìôÜæòòöÚìòäÌòìôîÒôðòöÜêôîìöÞòôðôÚìîðØèðòÜìôòÒöðîÚöòîàØòôöôäìîîîôöôäöðöàòôÜàööôæîöàððÎôæðöÒôòðòöâððøôÜøòèîøðæòòöØîøðòÞøôôôèðòðöèàèøìôðèòòòôôèôèääðÞôæìâÞööööÜÚôöìöôîÜööÜøîðôôøàðôðìæîîèìäâîèôööÜðìôôöòæðìâêððöàòâòðÜäâäôòöæòìÚôöèöðàêðòôöàäÎôòìæîêèöâôÆòöÜìæöÒìðôêðæìöôÜðøêìòöèòôòîìäòîâìâöòôôìøÞôôôöìðÚôôîäîòòâÞìôòðàôèôèðÞøÜöäòôðöÖôîôööàÞðäôöâðöðôâìîðèôôÞòøÞôèÜôìòèôäöàäîöîðöòêðòôÞðêöìðäðôøìôòôöèòòôôôàöòøæôôæðôÖöòôÒöòðìòâôòâäðòôðöæôòìôöèôÜöôðòêòêôàèøäôøÜôäâòââôøìôòÞôøòèòäøÖðìîîöîäôøìðÖöêöìöôðÜòðòòôôôàðöÞîôâîôÒöðôöôðîöðöôàììðîöôäðòööôàôðòøÈôöðððööæöèðâöðäðæòîðæòòöâòôðöæðàðôèöòöòôæÖòèððÞôòîæðâöøòîäêàìòèôÞðÜâôæäðòöòðòòòöêÖêèðöâììôöæôôöâêðöæòòÚôàîèøôòôöÞôäâòòòòðÖòôôîàòôòøØôôìôÜòôèèØîìòöÚîìäÞôðôäðòôöøðäìøðøâîìÜììæôòòòäðôêîÖìòôöàòìÚîòêìäöâØôèôôöìèàôöîèòèòôàìøÎìöðàìîâîîðøâôòîððÜôðæôôìöèìâôîòøîèäìòöÞäîôöäöòðîäîôôöèîÐòâôööðäððøÒðÖöòîÊðôìàîôòôøâäàôÚðôðÚøêÚìðôôôìöööêôèòøôäîôööæîöäÚäìòîàîôðÜðîôöòöÒôôøèìðâôàôÞÞðìîòèèööÚöäôöðôöðÚÜòæîðööôæöÔöôôÜòâìøÞòööæòìòôôòÒòôêòðÒôìòøÖøöèöðøèøèØÞèöôðððÞôàìòòðêìâôòööæòèÌôôâðôîäòòðèòöÚòòîòèôèöôòÖîøôîäæòôøèÖøðôðôâðôêøöÖòøäöööòöøØîøäîøæêòöøðâöèôøøäòòöòòòðôøøäðòøðâøÞöòðøöæøðîøÔôøôöøÞôòøèôîøøäøøàØîöôòôôöòôâæðôØôðòòÜìôòðððîæÞöÞðèäôøÒôòðøàöêöäêôôøöÒðèøèöðøöòÖôöøÚöðòèøÚîäðòöîîðøìîôòððøøöÜðøøäøâòøèöîòøêðêòòøôÜöôðöðöôøòÖðôôòøâöîôðøøàöìîöøøäâðòäðêÜððôøäöìôÔôöàôîöØôäòôöêæôööæìäöÞÜòøòÚðôôðøôöìòôðøøâôöòôøöæòôøöÒòøöÞðøÚøàôðøøÞôøøÞððøèøØôðøæððöðòøØêòòìøØøöèøøôèðððøøÞòâöòöôäòâîÔðìÖðôàìôìÞðîòôäööôðÔôäòêðîîèöàöòòÜøøøÞìîôÜôöøäêøâðøèòøÚðôòøèøÖøðæøøÞîêöðøøâøøâôìøäòîøøÞøøâöòøöäêòööòøøâêðîòðøøäôöòöÜôôÎîöèîòøàîòôàôðôôàêèìæööøàâðìøÜæèôôàâìøÖîîòöøÚèìòðøøÜîöòêöøöäðøÜîôøøÞøøÚìêøøÞìøîòøäôêðöòøöàòðôòìöøøðâôøøèîøøøàôøøâòæòäôðöäÖôòðÞôîôòöððöàòìâôòöÞìòàòöðêòàôôêðòàöøöðÚôîòàøîòæøêðøäòôîôøâðôîöôðòøæòîðôòîìøäôòìòøâöòøøÚôøøôàøàðÔàöØììöôòøàôðøððØæîòðøðìöòäöîòøÜòðôîîòâðòÈöäôìöúäøòðððìúæòðòòîäôúÞäøúÜòòòôòôúèîôîúîîøØöúòâòöðððøæðîìúèôîÞêîìòøäðôöðøöØòîøæúøÜòòôôøÜîìöìäððòÖæàôöðäêòìúøæÞÜòÜôôöàòàîììòèÞîúèæôôúäîòðôúÞêòöðúâôúöÜðøúêìöòððúäöîúêúîôòèôòøúâèôðúòøâîöòìðøúêîòøúîîðúøâöôôúøèöòôúøöæìôúøÚøêÞòúøêöäúöâôòöúØúôìôúÞòôöúâòôøúäòòøèòèòìôòæôôòèòøÞòêòÒðððôôòðäöòÚÜöøêòôòäèòôêôîðäîôöôðöÖôÜôðèèìôöêîäððöäöìôîôòêêôôàòòòòðäôòÚìôæææìêöôôàôòøàîöÖîôêòøôöÚöîôæòÜêêêðâêîôôîàòöðøÖôêôàèôôôðæàôÜðøâðêìòîòèôâðöôÖÒôôÎôôæèòøìäöêîöðôøäøööîððâèðàøðòêòôôôøôîèòÞðôîòööàðææòàòðöäôòòîøâððôììøôêlÜo,ÛopÚo˜Ùo|Øoˆ×oèÖoØÕoÕo€ÔoÄÓoèÒoÈÑo|ÑolÐo„ÏoÏodÎo Ío0Ëo¤ÉoØÈoÈo(ÇoPÆo”ÅoäÄo Äo4Ão|Àoˆ¿oè¾o„½oȼo¼ox»o4ºo0¹oX¸o€·o¨¶o\¶o¼µoX´o¸³o´²oܱo ±oœ°oä¯oð®oP®o@­o„¬o «o¤©o¼¨oè¦o,¦o@¥o0¤o£o¼¢o¸¡otŸo Ÿožo`oˆœo°›oôšoÔ™o™o˜oø–ot–o(–ol•o””oô“oT“o(’oÀ‘oÌooTo¤Žoäo oˆŒo Œod‹oÄŠo0‰oˆo¸‡ol‡oè†o†oH…op„opƒo$ƒo„‚o(‚oœ€oloˆ~o$}oÈ|oð{o{oäyo(yo4xo wo4vohuouo`to¤so\roqoÈpo pooo@no„mo lo¸koüjoxjo¬io¼hohoÌfoÜeoxdocotboìaohaot`oð_ol_o\^oh]o\\o„[o[oDZo¤YoÐWo0WotVo$TohSoÔRoPRo QoPPo\Oo¸NoìMo4LoKoèJodJoàIoðHo\Ho GoðEo4Eo$Do„CoHBoŒAo´@o,?oŒ>o¸=o=oxn=nðm(>m4=mxk(=kPjÄ=j´i°>i0=i¬hÀ=h<=h¸g>gH=gÌ;g,;gt:gœ9gÄ8gì7gL7g6g5g˜4gÀ3gô2g82g`1gÀ0g 0g /gl.g„-g,g´+g+gÜ)g)gT(g|'g¤&gÌ%gü$gÐ#g0#gÌ!g,!gŒ g´ggèggpg˜gàg\g„gXgŒg´g¸gg”g¼gpgðgPghg¬gœg gÜ g” gô g”g¼ggDgXgØgŒgg`gÀgggpg´ÿfÿf@þfLýftüftûfÔúfˆúfxùfØøføf4÷f\öföfõf¬óf˜òfÜñf,ñfðfdïf,îfTífðìf4ìf\ëf„êftéf¬çfdæfpåfÐäf\ãf âf¬áf@áf(àflßf°ÞfäÝfÝf¤ÜfèÛfàÚfÚf\Ùf¤Øf ×fÈÖfDÖflÕfXÔf€Óf4ÓfxÒfXÑf¸Ðf¨Ïf$ÏfØÎfÎf`ÍfˆÌf°ËfËfpÊfÊfPÉfèÈfÜÇfÇfœÆfTÅflÄf°Âf¼ÁfÁf`Àfœ¼f|»f»f<ºf¹f ¸f ·fðµf\µfµf8´f4³f\²f¬±fL°ft¯fœ®f®fD­f$¬fh«fȪf¸©fŒ¨f˜§fÀ¦ft¦fÔ¥f4¥fì£fè¢f¢f¡fP f”Ÿfhžfžf`f¤œfœf0›f¸šfà™f¸˜f˜f—f¤•fÌ”fô“f8“f`’f°‘f¤f´ffèf¤Œfè‹fôŠf¨ŠfŠfh‰f€ˆfćf|†f\…f„„fäƒf|ƒf ‚fHfü€f\€f„fÈ~f(~f¤}fÌ|f,|fT{f`zf@yfôxf¨xfxfLwfluf”tfsfxrf„qfTpf`ofÀnfØmfŒmf@mf”kf¼jf¬ifðhfàgf`ffhefðdfücf@cf bfbf`af°`f,`f¨_fì^fü]fì\f\f<[fœZfäYfàXfÐWfVf\Uf¼TfäSfDSfÌRf,Rf`QfPf(OfxNf MfMfDLf¤KfìJfhJfXIfdHføBfHBfä@f`@fÌ>f0>fX=f¸e@>e =e=eDd¼=dp=dœc>ch=cHb„=b”a¤;aD:a¤9aX9aŒ8aD7a04a°2aH2ap1a˜0a¤/aL.a”*a„)a8)a`(aÜ'a'ad&aì%a%a”#a<"aœ!aüaLa¬a a8a|a°aÔa4a”a¼aäa(a¤aÌaHaÄa´a aHaD a¤ aÌ aô aD a| a\aaÀaèaaÄaÜaèa aÀþ`þ`,ý`´ü`Øû`û`|ú`Àù`”ø`0÷`ö`üõ`°õ`Èô`(ô`Pó` ò`¸ñ`4ñ`ð` ð`lï`|î`ˆí` ë`Dæ`”å`¬ä`œã`Äâ`0â`tá`¸à`Èß`ðÞ`Þ`xÝ` Ü`Ü`HÛ`DÚ`ˆÙ`\Ø`°Õ` Ô`TÔ`¨Ò`èÏ`,Î`,Í`èË`$Ê`„É`œÈ`ŒÇ`ÐÆ`LÆ`dÅ`|Ä`¨Ã`´Â`|Á`À`Ô¿`4¿`°¾`¾`|¼`(º`l¹`¹`,¸`tµ`´`p±`ì°`P°`¤®`\­` ¬`¬`D«`\ª`h©`¤§`ئ`¦`´¥`ܤ`¤`Ø¢`p¢`D¡`¤ ` `HŸ`ð—`ü–`$–`L•`t”`Ø’`È‘`(‘`P`”`H`ŒŽ`Ð`°‹`€Š`°ˆ`‡`H†``…`À„` „`Hƒ`ü‚`Ä`@`Ü`d{`Tz`´y`øx`°w`w`Tu`œs`àq`Üp`èn`n` m`„l`äk`4k`\j`¤i`œh`0h`Xg`€f`üe` e`Pd`¨b`(a`l``”_`¼^`Ô]`4]`\`Z`@Y`ðV`$V`U`T`ŒS`ˆR`ÐP`P`tO`¸N`˜M`°L`ØK`€J`àI`I`ìG`hG`¬F`¼E`äD`DD`ˆC`xB`0@`Œ>`P=`h<`ä;`P:`|9`8`6`˜3`2`41`”0`/` ,`p+`´*`4(`”'` &`H%`¨$`¤#`P"`Ì`È`Ô`à`¤``8` `¨`Ø`ä`ð``@` `È ` `P ` `  `X`L`d`¨`À` `d`Ä`Ð`0`ÿ_¸þ_àý_$ý_Ôù_ù_ø÷_<÷_Hö_(õ_Üô_èó_,ó_Äò_$ð_¼î_í_pë_Ðê_ê_€é_Äè_$è_hç_¸æ_Èå_(å_lä_Øâ_ðá_á_ß_˜Ü_ÈÛ_(Û_PÚ_”Ù_´Ö_°Õ_ØÔ_@Ó_lÒ_°Ñ_ØÐ_Ð_PÏ_4Î_°Í_ÜÌ_0Ë_ŒÉ_¤È_XÈ_ È_4Ç_°Æ_€Â_ÄÁ_ÔÀ_4À_<¾_x¼_¬¹_¹_@¸_ðµ_$µ_0´_t³_T±_˜°_ ®_L¬_`«_ˆª_¼©_ä¨_ ¨_(§_l¦_Ì¥_¬¤_ ¤_P£_”¢_¢_Ô™_P™_ì–_Ô”_4”_¤_ôŽ_8Ž_`_ÀŒ_ Œ_H‹_d‰_(ˆ_‡_ô…_ „_ȃ_Dƒ_ˆ‚_Ì_8€_„~_¬}_|_dz_Ty_´x_Üw__h=_¬;_à:_Ð9_L9_8_ð7_¬6_Ä5_4_03_|1_0_°/_Ø._(._4,_Þ+_ˆ+_°*_Ø)_ô'_Ô&_Ø$_#_¤!_|_Ü_<_¸_Œ__t_¸_ü_x_Ü_H_¨_ì_ì_L_ __´_0_ð _” _ _¨_Ð_Ü__ _h_œ_Ä_~_Äÿ^øþ^ þ^dý^pü^@û^Lú^¬ù^àø^Ð÷^ó^†ò^”ñ^Hð^¨ï^Tî^˜í^ì^ê^´è^è^<ç^¨å^lä^”ã^Øâ^â^´á^Üß^ÈÚ^¸Ô^ÄÓ^ìÒ^0Ò^¬Ñ^ðÐ^Ð^XÏ^œÎ^ÄÍ^èÌ^ØË^ðÊ^¤Ê^Ê^dÉ^àÈ^\È^ Ç^ÜÃ^œÂ^àÁ^$Á^„À^¬¿^T¾^€º^˜¹^4¸^$·^„¶^äµ^Ä´^̯^¼®^®^P­^¼«^ðª^Pª^”©^t§^¦^,¥^T¤^´£^£^ ¢^Ô¡^4¡^” ^Ÿ^tš^Ä™^x™^ؘ^D—^œ”^ü“^ø’^<’^Ô‘^¨^ìŽ^Ä^ð‰^X†^¸^œ^ø~^X~^¸}^ì{^{^pz^øw^Nw^Xu^ t^ls^èr^ q^äp^(p^Po^$n^¼m^äl^ l^4k^”j^ôi^xh^$f^Àd^td^œc^Äb^ìa^a^l_^”^^ô]^`\^x[^¼Z^Z^,Y^X^^>^\=^¬<^;^x9^8^6^^5^\4^„3^¬2^`2^ˆ1^¬/^¬.^Ô-^4-^X+^X*^ð)^ü(^Ð#^x"^ !^ ^8^´^˜^À^^`^ì^Ü^Ð^^è^^´^@^„^@ ^„ ^¬ ^( ^4 ^° ^L^¬^¨^Ð^ ^€^à^0^^(^4ÿ]\þ]àü]û]`ú]$ù]„ø]ä÷]„ö]œõ]àô]¬ò]üñ]´ð]øï]@ï]„î]ì]pë]´ê]Üé]<é]<ç]dæ]¨å]lä]”ã]Øâ]Œâ]â] á]Hà]Œß]HÞ]´Ý]ÀÜ] Ü]€Ù]Ø]h×]€Ö]pÕ]´Ô]ÀÓ] Ó]Ò]|Ð] Î]\Í]Í]8Ì]`Ë]ÀÊ] Ê]€É]ÄÈ]ìÇ]ˆÅ]ØÄ]ÀÂ]ä´]x³]¼±]¸°]´¯]ø®] ®]p¬]´«]Àª]Ì©]p§]\¦] ¥]¥]`¤]P£] Ÿ]Hž]p]М]œ] ›]Hš]p™]˜˜]ø—]<—]–](•]ü“]$“]„’]ä‘]Ô]T]PŒ]p‡]4†]Ђ]4~]„}]|]¸{]{]„z]z]Äx]ìw]u]ôs]s]|r]¨q]@q]hp]äo]n]ðl]l]k]\ä=\Ž=\œ<\´;\;\p:\Ô9\@8\ü6\$6\t5\¸4\L2\œ1\Ì0\H0\¨/\$/\L.\X-\ð+\0+\t*\¨)\ø(\,(\¼$\ #\€"\à!\p\¼\\Ø\\D\À\ \´\Œ\´\h\\¸\\x\È\T \Ð \0 \ \¸ \0 \ \H\Œ\Ð\\H\$\\ÿ[ þ[Hý[`ü[Tû[Ðú[Àù[Tø[P÷[ôö[äõ[lõ[”ô[ô[8ó[|ò[¤ñ[¤ð[Ìï[ï[(î[”í[í[ ì[ðç[(æ[ðä[ ã[Èá[¼ß[dÞ[°Ü[ØÕ[(Õ[PÔ[xÓ[,Ó[pÒ[XÏ[Î[ŒÍ[Í[Ì[Ê[É[¨È[€Æ[`Å[ˆÄ[°Ã[¼Â[Â[üÀ[ô¿[Œ¿[À½[œ»[»[ðµ[ì´[´[³[Ô²[P²[x±[¼°[ø­[,­[<¬[¸«[Ī[@ª[Ô¦[(¥[0¤[Ø¢[€¡[Р[ [,Ÿ[¨ž[ž[H[pœ[$œ[<›[œš[D˜[—[–[œ•[Ä”[ì“[$“[’[Ð[Ž[[hŒ[È‹[D‹[¤Š[è‰[L‰[Xˆ[€‡[Ć[ì…[…[tƒ[Ò‚[4‚[x[Ø€[T€[H~[ô|[<|[({[Pz[|y[°x[„w[¬v[Ôu[üt[Ðs[Ür[Xr[Hq[Äp[@p[¼o[¼n[äm[˜m[âl[(l[Xk[ðj[4j[°i[di[Äh[ìg[0g[œf[Èd[Äc[c[hb[äa[Da[À^[t][ì[[@[[[°=[¼<[È;[D;[¼9[”7[Ü6[ 6[d5[Œ4[4[¼2[p2[´1[À0[è/[/[p.[Ð-[è,[,[8+[¸)[$)[ˆ'[¤&[”%[À#[h"[H![T [D[4[8[ø[Ø[Œ[´[Ü[<[ˆ[†[Ø[[([X[0 [h [8 [[à[x[ [[P[¨üZøûZXûZdùZ,øZŒ÷ZXõZxóZ`òZˆñZ@ðZ(ïZàìZ ìZLêZHéZ8èZœâZŒáZÀàZ<àZdßZ¨ÞZ$ÞZ„ÝZtÜZœÛZüÚZüØZ¬ÕZ¨ÔZ´ÓZ¤ÒZlÐZ|ÏZ$ËZ ÉZÈZÈÆZôÅZŒÅZìÄZÄZ<ÃZ€ÂZüÁZ@ÁZhÀZÈ¿Zà¾Z$¾Zø¼Z,¼ZغZ8ºZ`¹Zˆ¸Z°·Z·Zh¶ZäµZ µZزZ¨°Zˆ¯Z¯Z,®ZT­Z”¬Z¬Zp«ZШZ̧Zô¦Zx¥ZȤZ\£Z¡Z Z¸ŸZlŸZ°žZ,žZÈ™ZŒ˜Zl—Z —ZH–ZÄ•Z$•Z„”Z€“Z¼‘ZìZZüŠZ@‡Zh†ZÈ…ZD…Zˆ„ZƒZàZZœZŒ~Zì}Z }Z¬|ZÔ{ZøxZvZ tZÄrZ@rZlqZ°pZôoZToZ¤nZZT;Z¤:ZÌ9ZF9Zl8Z”7Z6Z@5Z„4ZÈ3ZD3Zl2ZÌ1Zä-Zü,Z\,Z<+Zœ*Z@)ZX(Zh'Z'ZP&ZÌ#Z"ZH!ZdZ¬ZðZpZÐZLZðZpZˆZôZTZˆZZØZ€ ZÐ Z Z€ ZÄZ|Z`Z0ZZ2ZìZ<Z¸ÿYÿY°þY¤üY„ûYÌúYÄöYöY<õYœôY´íYàìYàêYÜéY°èYPæY(åYPäY°ãYôâYèÜYHÜYüÛYxÛYÀÙY ÙYØYT×YÕY@ÓY<ÒY¸ÑYÈÐY ÐYžÏY¼ÎYpÎY$ÎY0ÍYXÌYØÊYÀÉYPÇYhÆY<ÅYdÄYÄY@ÃY ÂYÌ¿YȾY\½YX¼Y¸»Y\ºY<¹Yð¸YP¸Y°·Y·Y ¶Y4µY°´Y ³YȲY¸±Yô¯Y¬Y«YܦYô£YÈ¡Yà Y” Y¼ŸYŸY|žY¤YYdœY¨›YКY™YF˜Y—Y YŽYèŒY8ŒY`‹Y¤ŠY˜ˆY‡YL†Yt…Yœ„Y€ƒY´‚Y‚YY€€Y(Yˆ~YÌ}YH}Yt{YzYøxYtxYðwYPwY”vYØuYuY`tYÌsYsYprY$qYˆmY˜lYLlYYÔ=YØ;Yh:YP8Y¤6YÌ5YÈ4YD2Y -Y¬,YP*YL)Y¬(Yà'Y$'Y &Yœ%Y$Y"Y„ Y@YhY€YÐY0Y°Y YäY YÀYtY¸YY@Y4YhYY¸Y¨Y`YYŒ Y$ YX YôYœYYìYüYY`üX°ûXØúXúXÂùXì÷X÷X€õXìôX0ôXÈóXÔòX ñX4ðX°ïXïX„íXÄéXèXdæXŒäXÜâXLàXHßXpÞXÜÜXÐÛX¤ÚX\ÙX4ØX€ÑX|ÐXøÏX,ÏX$ÎX„ÍXÍX`ÌXÌX¬ËX(ËXÜÊX<ÊXôÈXÈXDÇXÜÆXÆXHÅXÈÃXÃX ÂXtÀXT¿X|¾X¤½X°¼XÈ»X(»X|¹X³Xd²XıX„°Xt¯XÔ®Xˆ®XÌ­Xô¬X¬X§XP¦X€™XИXÜ—X<—X”•XÜ”XX”X„“X’X¸‘XàX$XLXxXôŒXŒX|‹XXˆXd‡X´†Xh†XÈ…XÄ„X$„X<ƒX`€XXD~X0|X{X¤yXôxXxX¦vXvXhuXÔsX”qXpXðoX¬nX,nXpmXÀkX¤iXxgX¼fXfX eXldX”bXØaXTaX˜`Xl_Xˆ[XxZX¼YXYX˜XXÀWXVXLUXtTX0SXhQX¨PXàNX°MXØLXLX`KXlJXxIXÌFXÀEXÌDXøCX CXHBX@=XW¤=Wì•U”UГU¤’U°‘U‘UºUàU$UUL‹UdŠUŠỦUȈUÔ‡UT†U „U€ƒU¨‚UU €UHU8~UØzU¼yU xU$vUXuUœtUtU@sUÜnULmU¬lU&lUÀkUèjUjUÔhU4hU°gU,gUŒfUeUZdULcUbU$aUØ^U8^U|]U¤\UÌ[UôZUäYUXUU =U=U`TÒ=T|9TÌ8Tô7Tp7T|6Tø5T$3T2T|0T@/Tô.Tp.T4-T(+T (T€'Tà&Tl#Tì TàT”TLTèT,TèTÈT\T¼TdTÄTtTpT,T¬TÔ T4 T<TTHTpTTTTøT4T”ÿSÿS˜þSÀýSýS8ûS4úS øS˜÷SÜöSöSôS4óSñSðS îS|íSlìSTëSˆêSòèSdèS”åSÈäSDäS¤ãSèâSÐßS0ÝS@ÜShÛSÈÚSðÙSlÙS°ØSÜ×SX×SØÕSÕS(ÔS|ÑSlÐSLÏSXÎSTÍS¸ÉS˜ÈSLÈSÐÃS(ÂS¬ÀSl¿S|¼S”»SxºS¸S¬¶SܳS°±S„¯S~®S®SÌ­S8¬S4«S”ªSô©Sð¨Sl¨S°§SÀ¦SÌ¥SУSˆ¢S„¡SÈ S8—S|–S¤•SøŽSHŽSŒSŒSŒˆSø†Sd†SÔ„S4„SüS@€S SSL}Sp{SÜxSèvSHuSÌsSôrSTrS|qSÐoSìjSDiSÄgSleS¸`S`St^S„[S|YSÄXSXSlWS`US¤TS¬RSÄQSØOSMS8LSKSLJS ISDHSFS(ESlDS,BSd?S(>SP=S„RØ=R;RŒ:R8RØ6R,4RŒ0R”.R`+R¸)Rì(R€'RÐ&RœRìRøR,RpR$RRÔRäRØRR RØ R R8RDRÎR¤RŠRøR˜ÿQ þQ\ýQüQdûQœ÷QŒöQHõQxóQòQÈñQXîQpãQÀâQ âQ€áQ àQŒßQHÞQ`ÝQ¤ÜQ°ÛQ¤ÙQØØQ×QÖQ˜ÔQpÓQ˜ÒQ¤ÍQ”ÌQHÌQüËQœËQôÈQpÇQxÅQ¬ÄQ€ÃQ„ÁQÀQè¾Q¾Q¼Q»Q`¸Q¶Q µQ4´Q°³Qd³QIJQL¯Qx®QȬQ¨«Q«QP¥Q ¤Q¤Q´£Qø¢QX¢QL Q€ŸQìœQè›QÈšQ\™Q€—Q²–Q°•Qd•Q”Q~“Qì’Q®’QØQ(Q‰Q°‡Ql†Qˆ…Qx„Q¼ƒQÈ‚Q ‚Q(€Q ~Qœ|Q@{QäwQ,wQàvQ”vQuQFtQ|rQ`pQHnQ¨mQmQXlQlQôjQjQ|iQÌgQŒeQcQbQ(bQ¸`Q^QØXQ(XQxRQÈQQðPQ4PQ”OQöNQHNQ¨MQ(LQXJQ¬GQ`AQ@Q`?QP>Q\=Q 9Qp8Q@/Q.Qr,Qd+Qx*Q„)QÈ'Qü&Q@&Q%Qd$Q¤#Q#Q°!QÈ Q\Q|Q8QHQXQTQ¤QQ,Q¬QQŒ Q¬ Qà Q QQ¨QQÌÿPàûPàùP„øPìöPöPXõPôP˜òPèñP,ðPÔîPðìPìPdéPÂèP,çP<æPÐäPÜãP”áPÐßP ßP°ÜP¤ÛP”ÚP°ØPtÏP<ÌPðÊP ÅP\ÄPÃPÄÂPÌÀP(¾P0»Pˆ¹P¼¸PL³P”±Pœ¯P´®Pø¬P0«P„©P¬¨Pð§P¦Pd¡P  P$ŸPHžPpP˜œPœPèšPœšPà˜P˜—PD•PÜ’P:’PN4J†;J°9Jx6J¨4JP3JÐ1Jx0JF/J¦.J8-Jà+J¨)JX&J%Jð"J JìJJLJdJp J J,J²J”JÌýIÄøIHôIòI˜ðIøïIXïItíIÄìIøçIHçIpàIÄÜIdÓI`«EDuEˆGE§Að9<Œ~-r- n-,i-g-ld-c-xa-,-t-P%„Øô Ô (D û€ù´óð$îlŸÌk¸bD]HTHRäOLN0K JÀIG¨EEC,B@PýnÌAmÈhögÐ~c$ébèæb¬äb ãbôâbÈâbœâb­b|PY¬VU`RêHjHºH" HBHœ¸G€´G ¯G<«G¦GD¢GöGæŠGà^Gt^G8]GB[GŽYG|LGFG2ùF|™F̘F ˜F`MF´ôEôEØóE¨ŠEø‰ẺE¬gEžfE(dEcE„`Ev_E|#EÌ"E "EDE”EhE”ìDäëD¸ëD¬AüŽAÐŽA(‡Ax†AL†Aì-@Ä*@äþ?\5=¬4=€4=$9<Ø<(<ü<´<<Ø<ˆj;œf;.];4;;”7;\4;¼0;$;âŒ:òj:e:¢_:"\:êX:jU:ò:6õ9†ç9–á96Ü9¶Ø9~Õ9þÑ9¬Ã9r»9žº9º¹9¼Š9PŠ9‰9Ά9…9w9@n94)9äú84ú8ú8Äð8XÔ8Þu8ðf8*d8G8`F8ˆ:7l:7.7Û6òÇ6hÀ6ô¿6¢¿6ض6d¶6¶6@²6̱6z±6ˆ¯6¯6®6­6¤¬6R¬6`ª6ì©6š©6`6З6d—6 –6Z”6¦’6Ø„6¸~6@s6èa6ð^6(Y6`S6¬26xã5´Ø5pÀ5$À5„½5ª¼5†´5Ò²5±5j¯5¶­5¬5´§5x§5z”5žŽ5ði5Ôe5,J5\F5Ô<595ò'5Z"5z5r5Ú5ú5" 5æ 5â 5¦ô4ì4$ì4´ç4¸m4Ìm4j4W4ÞR4ªJ4ÚE4B!4ZÒ34Í3ä¶3jT3¶R3Q3NO3šM3æK3®G3tG3¤030#33†×2è¾2âx2¤f2Tc2Œ\2 \2 X24X2ÔR2hR2ØL2lL2üD2¬A2ä:2x:2ø62Œ62,12À020+2Ä*2T#2¸2¤282Ä2X2 2˜ 22¨2„ü1fÞ1Í1„É1x¶1à²1t‹1‡1®0Â:0 *0´)0.Î/tR/,F/2E/Æ$/ /€/F/r /Ž /ø .H . .L˜-œ—-p—-`-N®,^©,6Û+ºÓ+ T+B++Ò=+P=+–<+<+Z;+Ð:+8:+ì9+ 9+,8+r7+ð6+66+`5+5+È4+ì3+23+°2+ö1+l1+\/+/+Ä.+x.+,.+ð(+X(+ (+À'+€#+4#+è"+Œ+`++È+|+0+ô+\++Ä+„+8+ì+ +d + +Ì +€ +4 +ø+`++È+ˆÿ*<ÿ*ðþ*”û*hù*ù*Ðø*„ø*8ø*üò*dò*ò*Ìñ*Œí*@í*ôì*˜é*lç* ç*Ôæ*ˆæ*<æ*á*hà*à*Ðß*Û*DÛ*øÚ*œ×*pÕ*$Õ*ØÔ*ŒÔ*@Ô*Ï*lÎ* Î*ÔÍ*”É*HÉ*üÈ* Å*tÃ*(Ã*ÜÂ*Â*DÂ*½*p¼*$¼*Ø»*˜·*L·*·*¤³*x±*,±*à°*”°*H°* «*tª*(ª*Ü©*œ¥*P¥*¥*¨¡*|Ÿ*0Ÿ*äž*˜ž*Lž*™*x˜*,˜*à—* “*T“*“*¬*€*4*èŒ*œŒ*PŒ*‡*|†*0†*ä…*¤*X* *°}*„{*8{*ìz* z*Tz*u*€t*4t*ès*¨o*\o*o*´k*ˆi**ü;*8;* 8*Ü7*D5*€4* .d.\-*ì,**ß)¦Ó)Ú¼)B¹)ªµ)²)z®)âª)þ—)Ö“))>)¦„)þ)n)Æ|)6z),x)Ä\)Ø\).Ž(ši(fe(Rb(ò^(¾Z(ªW(JT(6Q("N(ÂJ(®G(šD(:A(&>(;(²7(ž4(Š1(lú'Þ÷'Àö'êó'Ìò'>ð' ï'’ì'të'žè'€ç'ªä'Œã'þà'àß'RÝ'4Ü'îÙ'€Ø'ÎÔ'€Ò'Î' Ì'‚Ê'DA'A'è7'€7'5'P5'd,'ü+' *'P"'¨ÿ&À÷&´ï&hï&(â&Üá&øß&4ß&tÞ&ÐÝ&ȱ&H­&¸&Й& ‰&¸…&¨k&lg&ªÃ$z¾$:ÿ!¦÷!î‘!„!êu!h!,¶ @¶ N¡ RZP¦NòL>KŠIô$´$Ô”¸Pº~z2š* ’ "$ºܵP³°ȯˆ¯$®ä­¤­@¬¬À«(ªÀ©t§¬\þ„ù8øø÷¸÷öØõ˜õøó¸ó óÀñ€ñÔðˆïHïœîíxëTê´ç\åhädã àÄÝÌÛHÚĨׄÕÔÓ$ÒtШÎ,ÍËlɼÇàÅ0ÄÂÀ¼½,»عظ˜¶X´H²d±T¯¤­ô««œ¨øŒà‹\ŠDˆÀ†rqXo¨møkHj˜hèf8eˆcØa(`x^È\ä[ÔXWdU€T(SôQ€P8>¨;´:À9ÒßÖÞÞiø\ðYªVêUª:Ê-Z*ò&ú# !š2:Jšòú Àì¿À¿²¾¹Ü¢°¢„¢v¡ìŸÀŸ”Ÿ†ž„‘vÀˆt s€qrpJg aZ`˜1Ø/ˆ+<+ð*¤*X*ˆ#ð"¤"X"p$Ø,0ä˜LØ @ ô ¨ Àt(lp$ØÿŒÿ@ÿ¸÷ ÷Ôöˆö ñTññ<ì|ê0êäé˜éLéðæøå¬å`åâDâøáüßbÚ¶×öÖ^Ò0¹ ·ܶ$³íp†o?oÐËm„mXÐkôËkTËkpfk<Õj,ëiZdÀ‡cðncðÜba‚»`F»`NA`Pâ_r²_”OÚ“Ož“OZoO&iOÞUO†´N¶±Nz±NeNÂkM†kMê,M¶'Mz'MþòL:©L|©KT©K,©K©KܨK\›Jž«E‚uEÆGEd÷DN§AV<@&9d%9´$9,$9~ë80ß8€Þ8ây-¦y-ìw-Äw-œw-tw-Lw-$w-üv-¬v-„v-\v-4v- v-äu-¼u-Âs-ns-rq-’m-hl-@l-l-ðk-Èk- k-xk-(k-k-Øj-°j-ˆj-`j-8j-žh-zf-j-Ä0+è-+.-+¬,+ò++p++¶*+4*+z)+L&+’%+%+V$+ "+R!+Ð + +PY*V=LϤ¼<¯ø¬ ªø§P¥¨¢ ÐŒ›H™@‡jú\ôò0œ½¾¼Œ££œ  $™t˜&˜0——p–D–N•:”"n[j’]Ú XLýRJRj{PÈ+ì+2+°+ö+t+º+8+~+P+–++Z++V+Ô++ôU*àU*ÐT*|T*`„{‚y°n8Aë‚æb¶o$…o¬9oRÍn|§n0˜n`_nÞâm¸®m€€mX€m€m6,m8÷kà‹k(köûjœðj€ðj®VjhRj@Rj®jƪi8™i™i„Ni|Gi&9i‚3iNiøßh”2hŽhHïgà·g$šg¢‰g€gg,g|g&g° f6f|fTfÔùe|ÓeTÓe,ÓeÓeÜÒeü”e€YeÖ#e&ØdÂ×d~ÕdîÄd\dNùcXºc cHcìðbF°bà bBšb¼}b”}bòRb¶RbøDbÈ bæbJñañaèðaìåaÄåa¸ßaßa2ºa’°a €a>ga$anÒ`2Ò`öÑ`ºÑ`~Ñ`BÑ`Ñ`Ή`4i`$ì_˜á_^Ô_vÆ_Ö½_g_æ+_\$_4$_ $_Ðü^Žò^í^Ý^ìÜ^ÄÜ^œÜ^tÜ^¤×^|×^T×^,×^×^ÜÖ^´Ö^ŒÖ^dÖ^<Ö^Ö^Ð^à¥^Vw^ºi^M^f5^L(^$(^ü'^Ô'^¬'^„'^\'^4'^ '^ä&^¼&^”&^l&^D&^&^ô%^Ì%^¤%^|%^T%^.ô]òó]¸é]Hè]€Ê]‚¹]8·]N%]š!]èò\Àò\ˆê\`ê\ê\Òé\2á\hÊ\@Ê\Â\0\\àœ\¸œ\†s\¸o\o\&i\p?\–=\Æî[ð¬[ö£[4ˆ[&…[Ú‚[Ž[èúZÀúZ˜úZpúZfÊZ*ÊZ¸ ZÚ’Z¶`ZN9Z:ZôYìóYìëYLèY$èY¼âY”âYlâYDâY¦ÏY´«YN˜YŠYò‰Y¶‰YÐhY¨hY€hYXhY¤]YÎYÊùXþÇX²–X”XlX°jXJcX44X:(XjXªXXìXÂX†XLX$XÂûW¶×WؾWvšW<šWšWì™WÄ™W‘W†WD‚WìXW -WäW¼W”WlWfWåVìäVÄäVœäVtäVLäV$äVüãVÔãV¬ãV„ãV\ãV4ãV ãVäâV¼âV”âVlâVDâVâVزVÀ®VJhVúUV IVÂVÞVRûUZÝUÝUBÜUzÉU*ÆUÜ™U´™UF•UÂUr‡U.lUbdUrIU 3UÊ!UŠU´UŒUdU<UUìUÂUÀU¸øTøT”îTlîTZ¥T ›TÚ‰TrˆT¦TÚST^DT"@TÚ=TÀ5T˜5Tp5TH5T "T8T TèT°òSˆòS`òS8òSúèS€ãSîàS ÑS†®Sj~SJCS~(S¶%StýR$ýRúüR~øRðöRBÞRöÙRèËRœRì›Rè‹RÀ‹R˜‹Rp‹RZSRfQRv=R:=R Rö R’R¶ÕQÚËQ:·Qº–Q†“Q¶’QNtQ lQþNQGQàFQØQÌQ¤Q¾QæþPdûP<ûPûPìúP^ëP"ëPæêPªêPpêPÊèPzãP>ãPÎÕPšÒPbÂP&ÂPêÁP—Pð–PÈ–P –Pú“PB’P^ŽPâdP$[P–îO–æO²ÒO$ŠOü‰OÔ‰O¬‰OòORO .Ox.O.O8OOèOÀO˜O(OÄÒNœÒNtÒNJÒNÒNÒÑNâÍN"ÈN2¿Nn¸NÎwNjwNætN2nN&hNÖXNÈ<ä:9785(5QZDÝt:oDrm [m~ÛjÞƒj¬wjÊBjh\i hÊ hxìdBìdøŠdÊàbŽàbRàb$„bÎb:›aZ|a|a¤Ó`nÓ`¨`dr_Þb_ª__n__Î_´Ý^ŒÝ^dÝ^<Ý^È^–:^ˆ ^Ê8]Ê\Ž\î8[²8[¦([þíZnÈY KX ÝV~ÜVXAVþ}UÄ2U¢UfUvìTž¬TzçSòSS€ûR=R®`>H <. <<09 0909&9è%9à$9$9–#9Ú"9¾"9Èí8®í82.:ó-Lå-å-Œo-Ðú*ô÷*:÷*¸ö*þõ*|õ*Âô*@ô*†ó*Xð*žï*ï*bî*ì*^ë*Üê*"ê*n¾>nR:n~nÞnJâm$ÑmæÏmËmÞÊm:°m §m¸¦mJ¦m”môŠmÌ‚mÔzm zmÊrmCmøAmÔ3m€3m3m`,m>ôlBålJ­lΙldVlHVlVlÄlVlØ÷k¦õk¶ïkäk|ÊkDÊk(Êk ÊkºÉk\Äk¼Ãk8¿kš½k¤žknžk ”kL”kÞ“k"“k‚’k„|kh|kä{k¬{kt{k"{k `k˜^k`^k(^kÖ]kÖLk9k´/k|/kD/kò.k. k¬ktk<kêk"âj"Õj>Èjnj’wjBjj‚j ÷iÎöi¢ëiãiþÝiŽÖiüÅirÅibÄià´iðªiЦi~¦iô‡iê†iZ]iÀPiˆPiPPiPiàOi¨OiVOi i‚iT i ixiÒiãh¢âh*ÁhH¼hö»hÀ¶hˆ¶hl¶h6¶h«hv4hŽh hôhDÿg ùgÔøg‚øgD÷g,ög®Úg&–g…gÜ„gŠ„gæKg>Cg¸g.gžgVgZÿfºéf.ÜfŠÖfâÆfz¥f8Ÿf®žfâzf’wfHlflfÚkfö`fêKf$BfìAf´Af|Af*Af`f(fòffîfÜeàÛe¨ÛepÛeÛed˜eØÜd ÜdhÜdÜdÂÑdÈ‘d‘dX‘d ‘dÎdzdü_dÄ_dŒ_d:_d>Od0 dœñcÄcƳc\²cüšc ‡cTc0pcoczecÞ:c>1cdc,côc¼cjc†×b.ºbÈ·b·bX·b ·bζbb‚b wbèvb°vb^vbîJbJ(bŒ b bÀžaRžaž€alaðkaÈka kaUa08aø7aÜ7aŠ7ad'aœ$a€$aH$a,$a$aÚ#a*a.aRð`²ï`ÂÁ`„ý_ò¡_"x_Fs_ð_º__þ_h_@_ñ^àð^Žð^îï^”¡^¸~^²s^bZ^^L^ò<^H^ô^†^¼ñ]úð]‚é]$Ö]¶Õ]tÃ]<Ã]Ã]`·]¸®]f®]8¦]æ¥]x{]Ür]îq]4V]ÆU]0P]nO]ÌJ]ø]¦]ªÛ\îŠ\p\X3\`$\($\ð#\¸#\f#\Æ"\¯[†ª[¡[âš[âf[¼I[HñZ†ðZ\ÛZļZŒ¼Zr¼Zv™ZœbZœéYdéYHéYéYöèYüËYÄËYŒËYËYÎ~Y|jYDjY jYžiY,QYüJYÄJY¨JYpJYVJYj'YôY¼Y„Y2Y …X®uX0uXuXàtXž XªžWÚ‡Wæ†W&rWb-Wº,W,Wv+WÎ*W6)WŽ(Wæ'WZ'WÎ&W%W çVnæV*ÌV˜µVF±V>|VàuV¦eV’[VNV àU,ÌUôËU¼ËU„ËU2ËUvÊU£U¬“Ut“U<“Uê’UØVUàAU¨AUpAUAUX#U #Uè"U°"U^"UØ U° UÀßT¦ßT,ÕT€‰TH‰T,‰TÚˆTvqTZnT.HT.TðTœT.TTtT>THSô€S†€SðISfISÀËRHËR.RÔyR¸yR‚yRrRrRÊqR8gR fRØaR¶`RD`Rˆ@R`@R8@R@RàÕQËQ>£Q•Qà”Q¨”QV”Qö‡Q^iQ*ÿP ÚPäÙPÌÔP¤ÔP|ÔPTÔPÔPÜÓP´ÓPŒÓPdÓP<ÓPÓPìÒPÄÒPüZPlYPÐßO`ßO(ßOßO¬ÏO„ÏO\ÏO4ÏOäÎO¼ÎO”ÎOlÎODÎOÎOôÍOÌÍO¤ÍOä•O¬•Ot•O"•Of€O¤kO|kOTkO,kO¼HOLHOHOúGOÀ2OþÓNLvNvN¦uN¼qN”qNÜ&N ÀL°¿Lx¿L^¿LäèKtåKäK´âK¬ÜKDÜJ ÌJhÌJ0ÌJÂËJؽJ°½Jˆ½J`½JØ»J°»J¨¨J0¨JpcJHcJ cJøbJ˜JpJ úElÍC¸æAˆ9A¸¿?ôy>Z=@%<\E9ÜÏ-О-ô7-Ôè*øå*>å*¼ä*ä*€ã*Æâ*Dâ*Šá*\Þ*¢Ý* Ý*fÜ*Ú*bÙ*àØ*&Ø*àK*ÌK*¼J*hJ*à‚x i8DÚD¨DpDrBTTÖoä¤oˆo+o4'op!oà¶n–—n`nˆ~nP~n Sn„SnÎLnÌ8nn’åm¨°mT°m€¦mL”m0vmvmH3m/m-mÎ,mš,mmtôl°ål\ålÍlšl|”läŽlð‡l¸‡lMløLl†?l(!l°l–lŒlÐþkÜõkìïkðÉk¾¨kt•kX•k”k€„kX„kÐ^k´^k¼&k &käkÈkøÛjÐÛjDÛjÛjL¤jʘj<j 6jø5jÐ5j¨5j84j4jè3jp3jH3j 3jø2jˆ1j`1j81jÐ/j¨/j€/jX/j0/j/jø,jÐ,j¨,j€,jX,j0,j,jðj¸jüjÄÅi¨Åi˜ÄiÂiÊÁi¬¿i¿iú«iÆ«i’«i^«i*«iewT]Tð\T°-Tà%T¸%T%Th%Tð$TÈ$T $Tx$TTdTÐ TX T0 Tà T¸ T Th Tð TÈ T  Tx TP T( T TØ Tˆ T` T8 TÀT˜TpTHTôçSÌçS@çSçSðæSÈæSháS@áS¤ÅS|ÅSˆ©SŒ‹Sd‹S<‹S‹S¼€SlTSDTS¸ISœISr;SxïRPïRTéR,éR èRxèRPèR(èR°ÌRˆÌR`ÌR8ÌRÈRÆRÜÅR8ÃR<œR„šR\šR4šR šRä™R¼™Rô˜R̘RD‘R‘RRhR¶uRÒrR¬oR„oRDnRnRè?RT:R,:Rx9RP9RàRpRHRÖRСQ¨¡Q€¡QX¡Q(iQiQØhQ$_Q¨IQ€IQàHQ¸HQ0GQPEQ(EQEQØDQ°DQˆDQÀCQ˜CQ%Q¼"Q°QˆQ|QQ´QþPÜýPèÞPÀÞP ÞPäÝP”ÕPlÕPDÕPÕP`ÒP,¶P¶PаP¨°PÚªP¢nPì[PÄ[Pœ[Pt[PÔZPtÐOLÐO$ÐOüÏO@ÍO`ÈO8ÈOÈOèÇOÀÇO˜ÇOpÇOHÇOÄ—Oœ—Ot—OL—OŒŠOdŠOÌkO iOxiOVO/Oð.OÈ.O¼âNœàNtàNµNØ´N$´Nü³NÌN¤N|N,NÜ~N„vN„cN\cNäbN¼bN”bNGNL/N0/N$õMüôMÔôMžîMjîM6îMîMŒØMÜŸMÀŸMà›MlMìkMLkM$kMü^MÔ^MŒ>M°,Mˆ,M`,MlMÌM¤M°úLˆúLÞ½LøuL\rL4rL¤pL|pLdÃKô³K̳KlªKDªKªK´¨KÌKdKÝn†ÙnÊØn~ËnÄnöÃn(¸n ¸nð·nÔ·nž·n’´nX³nB¯n†®nÖ­n:¬nr¨nÜ¥n¦¥nL¢n¦šn"šn>—nâ•n@“nönŒn¤ˆnˆˆnlˆnPˆn–‡nÒ…nâ}nÄynªynxxn xn®qn¶lnlnîjnØgn:gnbfnÎdn"an‚`nâ_n]nÀZnnZnDVnVn RnRn²Qn LnÔKnºKn"EnBnŒAnÖ=nR9n²8n¢7nê6n¶4n®3nD3nÖ2n2nä1nÈ1nv1nj0nô.nZ-nÎ)nê%n‚%nLnXn¾ n nÆ nrnbn–ndn"ÿmLûmûm¦úm^øm<÷m ÷m‚ömªõmˆðmlðmPðm4ðmâïmxïm\ïm&ïmäémÈémvémzämâmôámØám¼ám ám„ámhámLámámàmtàmXàm<àmàmèßmÌßm°ßmzßmôÞm¢Þm2×m’ÖmôÕmØÕm¢ÕmÕm†ÐmÜÎmÀÎmnÎm¦ÈmÅm»mšºmn¹m¸m‚µmÒ²m ²m²m.±m‚®mŒ­mæ¬m¾«m«mΤm¼£m £mj£mä¢mÈ¢m¬¢m¢mê¡mJžmŽm m°–m>’mjm–Žm6múˆmz…m‚mFm~xmøwmÜwmŠwm¦pm"pmomêmm€imÒ`mÎ]mòZmˆZmlZm6ZmFWmŠVmªTmºQmžMmþLm”LmxLm\Lm@Lm LmGmtFmXFmmz=mÈ;m";mö9m:9m"7mž6mâ.m\.m@.m¶-m%m$mr#mö m¾mmÜm¦mm‚mmÈm mðmžm¾m6 mÎ m mZmºm@mhm2ýlùlÚølTølÜölŠölúôl–ðlÚïlTïl¢êl6æl|ãl`ãlHàl,àlþÝl Ûl.Ùlz×lÚÖlÕlÓlêÒlvÐlÊÌlÂÄlêÃlº¾l¾lè½l–½l´»l˜»lb»lRºl>·lb´l³lüªl‚¦l¶¥l‚¡l ŸlNŸl¾˜lT˜l˜lb—l´”lÞ“lX“lJŒlJŠl~‰lJ‡l†lb}lÂ|l|lyl&ul†tlªrl¾olTkl8klÆel>cl€blfbl"`lÞZl>Zl6Ul^TlôSl¾SlrNlÞLlHKlºHlðDlÖDl¢ClJBl*Al¦@l¢>lº9lÒ8lþ3lD3l(3l 3lÖ2lB1l60l<.l€-l-lÎ)lX&l<&l€%ld%lH%l,%lô$lØ$l¼$l $lj$l6 lÀlŠl–lúlÊltýkXýk<ýk ýkŽûk6ôkBókzîkîkÚíkdêkšçkBæk²âkJÖkBÕk"Ôk‚ÓkTÎk4ÉkÉkÀÀkÖ¹kü±kà±k|°kT°k,°k°kºªk‚¥kì¤k0¤kÞ£k®œkÖ›kR›kÌškzšk™k>•kL‡k0‡kø†k܆kÀ†k¤†k6†kz…kyk"rkœqkfqkVpkÔek6ekckZckzZkšPk0PkÂOk$Lk0KkKkÄHkŽHkžGkjDkÒBkÞAkö?kèñjdðjHðjÚíj¢ëjëjëjÈêj¬êjêjtêj>êj¸éjféjâèjVàjfßjêÜjJÔjÆÓjfÎjÐÌj´Ìj"ÊjüÇjFÇjÀÆj¤ÆjRÆjjÄjzÀjò½j²¼jÄ»j¨»jr»jƹjN¸jP¶j4¶j¶jüµj&µjp´jê±jd±j¾°j¶¯jL¯j¯j§jb¦jŠ¥j–¤j΢j¢jÆ j\ j& j¼Ÿj Ÿj2Ÿj`˜jº—jn•jN”jZ“j^Žjj¦‹j̆j°†j^†jöj ~j ~jp}jè|j|jØ{j({jòzj„xjhxjLxjxjsjpjvpjÖojÞlj*ij¤hjRhj¸`j`jr_j¦ZjWjNUjOjMj¦Ljjiei~ditci"ciêaiN\izIi¢HibDiRCi^Bi"Aiòi„iNiÆiâi"i~ iÔi¸iœi:iNûhHòhòhbðhºíhþìh–ìhnéhÖæhÆÝhÜhÚÚhÐ×húÖhÖhtÖhXÖh<ÖhÖhfÎh¢Ìh6ÉhŠÆhŠÀhŒ»hp»hV»h²¹hö¸hb·h̵h¢´hʰhî­hú«hJªhà©hŽ©h6¦hl¥h6¥hê¢hŒ¡hfœhhˆh€‡hd‡hÚ†hJ…hª„h˜€hˆ}hl}h6}hZxh~rhtqh"qh¸ph¦ahì`hÐ`hš`h0`h`hÂ_hJXhjOh®NhMh€eeì~eš~eÂ}eöxe~wenreÎqeúpefoeBneme jeæieZbeNae¦_e²^e.^eêYe.YeŒXeXe®VeÒSeÞRefQezPeÖKe6He²EeØDe¼De†DeDeäCe®Ce‚Be†>eæ=eF=eÀø_Ô÷_‚÷_Žö_ró_Jï_ï_nì_äã_Ù_Õ_ÌÎ_zÎ_Î_ Â_¦¿_¾¼_X»_<»_ »_»_èº_¸º_¸_ì·_Ä·_jµ_ ´_Þ°_¤§_n§_£_V¢__à‹_Ä‹_¶ˆ_nˆ_´‡_˜‡_b‡_D_‚w_„t_æs_:o_ÀW_ÎV_,P_P_ÜO_´O_ŒO_ÿ^¸þ^fþ^ü^ôû^Øû^¼û^†û^’ú^ö^šî^úá^ Ô^ˆÑ^žÏ^âÎ^xÎ^@Î^.Í^Ì^¼È^¢È^âÂ^¸^ô·^j·^ʶ^–­^6«^Ú©^§^Ц^´¦^b¦^ÖŸ^B”^¸’^’^î^Ìs^Ðg^ô^^:^^ÄY^¨Y^ŒY^rY^êK^úB^tB^>B^ÔA^œA^â@^@^þ>^ô=^¼=^¼;^N;^Z8^6*^”)^B)^,#^#^ô"^Ø"^¾"^8"^"^æ!^N^2^Ê^n ^è ^z ^ö ^8 ^ ^ä^È^’^^€^f^à^@õ]&õ]>ð]†ï]é]ã]$à]Ý]Ý]fÜ]JØ]úÔ]Ô]fÓ]VÒ]¢Í]Å]"´]¾³]³]ú«]<«]l©]‚—]n•]–Œ]`‚]D‚]T]8]`}]ny] y]„x]2x]:t]äp]®p]bl]œj]‚j]f]2d]rb]€Y]ðW]ÈW]BU]¾T]:T]²N]¾H]<]r9]€)]T'],']ö]p]]*]~]ø]J]]t ]X ]ª]d]J]h]öú\þù\0ù\ù\¸ø\ø\fö\õ\Zõ\"ð\¾ï\:ï\œÞ\‚Ú\âÙ\×\àÖ\¸Ö\Ö\RÒ\ž¿\:¿\6½\€¼\J¼\à»\Ž»\bº\й\ ¹\€¬\Æ«\†ª\À¨\¤¨\Ѝ\²¤\Ú£\•\t•\º“\º\Z‡\ \z\øy\Üy\Ày\¤y\y\4w\Fu\æl\|l\Dl\òk\Fj\dg\’d\ö`\®`\ÎX\ôW\¾W\8W\ÊV\òU\T\’R\‚Q\úK\Ú?\V;\œ9\t9\º5\þ4\Ž0\î/\’.\@"\&"\d\J\\f\¾\þ \š \ \¬ \v \ \ð \Ö \Z\ð\Ž\œþ[šû[û[ú[Úô[Vô[Âò[nî[Ví[Rì[œé[té[~å[6å[ Ú[ÒÍ[NÍ[ÈÌ[ZÌ[îÈ[ÎÄ[öÃ[ŒÃ[TÃ[Ã[Ò¿[¨¼[h¦[L¦[0¦[¦[ø¥[n¥[rŸ[N—[Z–[Š‹[êŠ[€Š[\‡[Ây[t[žr[nl[žk[*b[Ša[Ì_[ ^[ð][º][ÂP[ D[ü5[3[ì.[.[€-[d-[.-[þ)[ê&[,&[Ú%[š [‚[ž[žûZÒ÷ZÀïZðîZÈîZ îZxîZPîZ(îZRìZ~èZ‚àZîÞZjÞZø×ZÐ×ZîÔZúÓZÂÏZBÂZJ·ZίZ­Z¶«ZÜ©Z„¦ZržZÊ”Z8ZZ€ZJZ>‰ZjˆZ”‚Zx‚Z&‚ZäwZ¼wZ”wZlwZhuZ:pZšoZ$hZŠgZ–^ZÒYZ2YZ*QZ¦PZêMZ&KZêBZ†5ZÊ4Z`4Z4Z¢,ZÔ+Z‚+ZŽ!Z6ZZìZÄZœZØZJZ”ÿY^ÿYûYZöY&íY–äYVØYš×YÊY®ÆYæÂY`¿Y¿Yþ»Y,¸Yö´Yp´Y8´Y³Yþ±Y±Y\®Y&¡YêYJYàœY„›Y°ŽY”ŽY^ŽY.YȆYZ‚Y¶Yd~Y,~Y>yYºxY6xY°wYÔoYÞlYì`YÄ`YL_Y_Y‚YYWY(SY SYpRYDRYQYÔPY¨PYPPYROYøMYÂMY,AYô@Y¾@Y4>Y¬9Yê6YÔ&Yf&Yâ%YæY|Y*Y†YîYhY¦Y^YBY”÷X^÷XØöX¼öXŒöXvôXôXóXÛX<ÛX¢ÙXŒÏXrÏXjÎXÀÇXŠÇX"ÇXJÆXn»XzºX¶X$²X ²Xº¯X"˜X"•X´ŒX˜ŒXbŒX‹Xü‡Xú†Xj„X‚ƒXt‚XV{XgXbfXÜeXÀeXReXÚbXšaXÞ`X²_X€WXdWX,WXWXØVX¼VX VX„VXNVXÈUX’UXºTXHWê=W2=WÂ9WŠ6Wj4W`3WÚW>W.WÄWÖW W’ýV¦üVžøVØöVôóVjóV^ðVÈíVZíVÆçV æV|àV`àVDàVàV¦ÚV®ÌVÂVª»VάVh¨V¢¦V&£Vú Vœ–VªVȉV’‰VäˆV$ˆV˜‡Vp‡Vè†V°†V؃V¢ƒVúrV"rV`fV–dV†cV†\VòZVÚWVpWV:WV0TVTVøSVÜSVÀSV¤SVˆSVlSV6SVÌRV°RV”RV^RVÚOVìNV:FVøAVf6VB.Vè,V~*Vn)VÒ(V^VjVæV^ VØ V( V¨ïUÞUTÚUÆÕUÒUºÐU–ÌUâÈULÈUúÇU ÄUÃU¬ÂUBÁU’¹U°¨U¦¦Už£U¾¡U( U:œU„—U2—UÖ”U”Uö‘UŒ‘UV‘U&UªŠU`‰UüUŽU~~UzUžuUâtUnU’mUòlUiUzhUÖbU(bUhaUaUØ`U `Uø_Up_U8_U~^U\UªXU€VU‚UU´QU˜QU|QU`QUDQU(QUnPUÐLUÖJUœDUJDUº@UÜ;UŠ;UÂ:UŽ4Uô1U .Uä-U¼-U”-Ul-UD-Ud+U"&Už%UÂ#UhUU*UBUN U²UÜUâUÖUlUôúTÚúTÚïT\ïT4ïT ïTäîT¼îTçT"ßT‚ÞTfÚTŽÙTÖT‚ÑTBÇT”¾T ¾TøµT§T¬¦TNŸT:žT"šTª—TTTbŽTLT‚TìT¶TLyT0yTyTøxTÚmTÖ^TFUTnTT>RTˆDTˆ1T2*TÆ'TÄT¨TrTðTTªT¶TTJýSzóS|ðSFðS¬ïSªèS†ÜSHÙS¸×Sž×SàÖSÄÖS¨ÖSŒÖS’ÏSÚ»SV»S¾ºSB¶S:µS4³S̨Sö§S¦S¢SÊ¡SˆSÒ…S…SæSšrS¦]S YSNXS²WSêTS¼GS”GSlGSDGS²DSö:SD'S('S 'Sð&S:#SÐ"S´"S"S˜S|S`SDS>SÂS>SÆúR@úR úR–ìRîéRþáRÜÞRêÝRêÕR.ÕRèÂR R" R&’R‘R4‡RLqR"jRì_Rî^R†BRBRäARÈAR¬AR>RŠ5R2)R¬&Rx$R¬#Rü"Rø!R,!R` R”RÈR¬RJRRÐR*RpRTRRFR¤RÿQTöQ:ìQ,áQTßQ¦ÝQêÜQöÛQ^ÖQòÄQlÄQPÄQÄQÊÁQØ®Q¾®Qî«QN«Qt£QÔ¢Qž¢QÆŸQ\ŸQ.œQV›Q›Q2“QÎ…QH…Q…Qô„Q¾„QT„Q8„Q„QR‚QZcQnLQ¦?Qè>Q–>Q¾*QÊ)QbQ,øPøPô÷PØ÷P¼÷P ÷P„÷Ph÷P2÷PžõP¤óP^ìPÔæP¸æP‚æP"äPÜàPÖ×P(ÄPðÃP ÃPªPp¢PðžPœ”PL”P$”Pî‰Pj‰P{P¦yPˆxPÔvP¬vP„vP¬tPZtPžsPühP\ZPJPP`PPîO€íO®êOˆÞOlÞO6ÞOÜÛO®ØOÖ×OŽ×OÞ‘OX‘O’O„O|OÐmO€mOêfOfOreOÎ_OH_Or^O´LP­LÔ«L¬«L„«L›L²–LxdLâaLBaL4VL¾QL8§K´¢K¤’K8‡Kx…KvKänKümK6(K 'K &K„&K $KÜ"KÂ"K`!Kø KHK.K°K\ KÒ K¬ýJäšJ¨uJÎJJd!JFô=F4/F|.Fô-Fv)Fn$Fê#F€#F„ Fh F2 FÔFF”F"ùE‚øEÔ÷EP÷E¼õEdõE8õEàôEˆôE0ôE¬óE€óEøòEÞòE>òEžñEððE\ïEíEÂìEpÜE~ÛE4ÐE|ÏEôÎEÔ§Eä–E,–E¤•ExŽELŽEôEÈEDE°‹E„‹EX‹E,‹EÔŠE|ŠE$ŠE ‰Et‰EìˆEÒˆELˆEÄqE qEœpEppEèoEÎoE"nEžmE iEØgEfETdE˜bE°`E¦BEJAE¦?Eè4E04E¨3EL'E 'EÈ&Eœ&E&E„$EX$E,$E$E¨#EP#Eø"Et"EH"EÀ!E¦!E!Eè E Ed EàELE EôEÈEpEEÀE<EEˆEnEÈE°EE8E E„E¨EEôEEEd Eˆ Ep EÔ Eø E˜ EàEÌEDE(EhElEÐEôEøE\EE^EõDüôDÆôDþóDdðD8ðDàïD´ïD0ïDœíDpíDDíDíDÀìDhìDìDŒëD`ëDØêD¾êD€ÛDÈÚD@ÚD0ÕDÁDLÀD¨¿D(¯D\®D¸­D ™DÔ˜D0˜D\D€DìDiDLhD¨gDÔPDPDdOD8DÄ7D 7DL D€DÜDŒDtDØDüD¸DD@DüD`D„D@D¤DÈD„DèD DÈ D, DP D Dp D”DDPD<D´D˜DØDÀD$D|þC*þC\òC¤ñCñCÈìCìCŠëCÚêCèC˜ÃC€°C´¯C¯CžCÄC C‰C<ˆC˜‡CÄpCøoCToC€XC´WCWC<@Cp?CÌ>Cø'C,'Cˆ&C´CèCDCô CÜ C@ CdC C„C¨CdCÈCìC¨C C0CìþBPþBtýB0üB”ûB¸úBtùBØøBü÷Bp÷B¸öB¤öBöBöB@õB(ôBŒóBè×B×BxÖBøÅB,ÅBˆÄBp°B¤¯B¯B,˜B`—B¼–BèBBx~B¤gBØfB4fB`OB”NBðMB7BP6B¬5B\2BD1B¨0BÌ/Bˆ.Bì-B-BÌ+B0+BT*B)Bt(B˜'BT&B¸%BÜ$B˜#Bü"B "BÜ B@ BdBØB B B„BhB¨BBôB.BÌùAùAŒøA2äA®ãAþâAðáAþàAPÖA˜ÕAÕA8ËA‚ÊAHÊAì½A4½A¬¼AX™A ˜A˜A|“AP“Aø’AÌ’AH’A´AˆA\A0AØA€A(A¤ŽAxŽAðAÖAŒAz‹AøŠAÌŠAtŠAHŠAĉA0ˆAˆA؇A¬‡AT‡Aü†A¤†A †Aô…Al…AR…Aè„A tAèsA`sAÌ\A\A\[AX(AAØAPA¸A¼A AˆA¤AŒAðAAüA`A„AlAÐ A¤ú@Øù@4ù@´è@èç@Dç@,Ó@`Ò@¼Ñ@èº@º@x¹@¤¢@Ø¡@4¡@`Š@”‰@ðˆ@r@Pq@¬p@ØY@ Y@hX@U@ÔS@8S@\R@Q@|P@ O@\N@ÀM@äL@ K@K@(J@äH@HH@lG@àF@(F@F@ŒE@pE@Ì;@-@¸,@,@Ô+@ˆ$@ˆ#@Ð"@"@@L@Ä@Ð@x@Àÿ?”ÿ?xð?Àï?8ï?¼Þ? Þ?ˆÞ?`Þ?vÜ?æØ? Î?hÍ?àÌ?X¾?¾?:½?Œ¼?»?ôº?\º?L¹? ¹?ô¸?p¸?D¸?¸?J·?Lz?ly?¬x?ld?Œc?Ìb?dJ?„I?ÄH?-?0,?p+?¼?Ü??hò>ˆñ>Èð>Õ>4Ô>tÓ>À·>à¶> ¶>à±>´°>ü¯>À®>h­>°¬>t«>ª>d©>(¨>Ц>¦>ܤ>„£>Ì¢>¡>8 >€Ÿ>Dž>ìœ>4œ>øš>lš> ™>Œ™>è˜>̘>¬—>€–>È•>œ‡>Œ…>ø„>Ì„>n>dm>Ül>F_>HL>|K>ØJ>X:>Œ9>è8>Ð$>$>`#>Œ >À > >Hô=|ó=Øò=Ü=8Û=”Ú=ÀÃ=ôÂ=PÂ=|«=°ª= ª=¼¦=¤¥=¥=,¤=è¢=L¢=p¡=, =Ÿ=´ž=p=Ôœ=ø›=´š=š=<™=ø—=\—=€–=<•= ”=Ä“=8“=€’=l’=ä‘=È‘=‘=ð=T=øn=,n=ˆm=ØW= W=TT==,9=9=¨8=|8=ø7=d6=86= 6=à5=ˆ5=05=Ø4=T4=(4= 3=†3=R.=Ä=ø=T=Ô==d=Ló<€ò<Üñ<Û<<Ú<˜Ù<ÄÂ<øÁ<TÁ<€ª<´©<©<<’<p‘<Ì<øy<,y<ˆx<8u< t<„s<¨r<dq<Èp<ìo<¨n< n<0m<ìk<Pk<tj<0i<”h<¸g<tf<Øe<üd<¸c<c<@b<´a<ü`<è`<``<D`<„_<l^<Ð]<ìC<<¼><><à=<´=<L<<ˆ=<\=<¬<<€<<Â9<P9<@)<h*<<*<Œ)<`)<ø<t<à<ˆ<\<<¬<T<Ð<¤<<<@<¢<„<X<<Ô<P<¼<<d<8<à<ˆ<0<¬<€<ø<Þ<4÷;|ö;ôõ;€v9Du9æ`9ÄS9 S9„R9B9¬A9ô@9È@9ª-98-9Ø+9¤*9x*9L*9 *9`)9)9þ'9Œ'9î&9¼%98%9 %9€"9f"9‚9®9B9P9˜99´þ8ˆþ80þ8þ8€ý8ìû8Àû8”û8hû8û8¸ú8`ú8Üù8°ù8(ù8ù8ˆø86ø8(÷8´ö8šö8(ö8Ðõ8ô8äò8¸ò8Œò8`ò8˜ñ8bñ8ðð8˜ð8Xð8´ï8šï8*í8Ï8ØÍ8<Í8€Ì8Ê8,É8@È8hÇ8hÆ8ÌÅ8Ú67x„6<ƒ6èi6 i6Xi6¸h6ph6(h6ìÊ5PÉ5ø¹58¹5P‘55,5D3323 û.èú.`ú.¬Þ.àÝ.<Ý.¼Ì.ðË.LË.4·.h¶.ĵ.ðž.$ž.€.¬†.à….<….hn.œm.øl.$V.XU.´T.à=.=.p<. 9.8.l7.6.L5.°4.Ô3.2.ô1.1.Ô/.8/.\..-.|,. +.\*.À).ä(. '.'.(&.œ%.ä$.Ð$.H$.,$.l#.T".¸!.È.œ.D..” . .Ô .¨ .| .$ .Ì .t .ð .Ä .< ." .0ú-ú-&ù- ñ-Nñ-bð-òï-ºí-hå-xÕ-^Õ-ÞÌ-à¼-¼-p»-$°-¬-,«-œ-ð›-˜›-l›-èš-T™-(™-ü˜-И-x˜- ˜-È—-D—-—-–-v–-È‹-‹-ˆŠ-(-Ð~-x~-œ}-”|-l|-D|-|-ô{-Ì{-¤{-|{-T{-âo-Vo-ä`-¸`-´S-üR-tR-TI-*H-E-$c+èa+T9+9+¼8+p8+¬5+|4+04+t'+('+Ü&+&+Ì#+œ"+P"+x+,+à+”+Ð+ +T+|+0+ä+˜+Ôÿ*¤þ*Xþ*€ñ*4ñ*èð*œð*Øí*¨ì*\ì*„ß*8ß*ìÞ* Þ*ÜÛ*¬Ú*`Ú*ˆÍ*<Í*ðÌ*¤Ì*àÉ*°È*dÈ*ÜÄ*Â*FÁ*ÄÀ* À*ˆ¿*ξ*L¾*’½*Œ»*@»*ôº*¨º*dº*ª¹*(¹*n¸*ä·*´¶*h¶*$¶*jµ*è´*.´*©*D©*ø¨*¬¨*è¥*¸¤*l¤*”—*H—*ü–*°–*ì“*¼’*p’*˜…*L…*…*´„*ð*À€*t€*œs*Ps*s*¸r*ôo*Än*xn* a*Ta*a*¼`*ø]*È\*|\*„W*0W*(T*ÔS*ÌP*xP*pM*M*J*ÀI*¸F*dF*(E*E*D*°C*\C*C*@*¬?*¤<*P<*H9*ô8*ì5*˜5*2*<2*1*¤0*¸/*Œ/*Ì.*D.*¸-*d,* +***ä)*)*04t4¤*ÈÙ)¤Í)`Ã)ˆÂ)vÝ(ŽÜ(ÞÛ(¾Ú(ÖÙ(&Ù(TØ(˜Ó( Ò(ÀÐ(èË(ðÊ(É(8Ä(@Ã(`Á(Ô½(à¬((4#'P '|'ä'''8'T'p'Œ'¨'Ä'à 'ü ' '4'P'l'ˆ'¤'ü&ˆø&(ø&¨÷&@ö&¬í&¦%<¢%P %4š%è>!Ð¥ ˜ dÀ|Àk”cð=¨/Ä'H€ô„ìÌÅnÁb½:¶Ö²j¯F£ô‡Ðh40ø.øì°Üdʳà±dzØfH(äʬÈPÆÄï ­<« §¤¤¼z¼Q¼((ûøöØô òhð0îðÂðÀð¾ľˆ‰‰`‚v@fXOO¸E(ÀþÌò`å€Î´»¨nAÄ?ÈÀDÀȽ仌»`»4»JºعD¹ì¸¸®­¦¤¥f¤Àœ¦›4›$šª”V”¨‹$‹øŠ”ˆRwàv¢u2iúg¶f¾e~eºab^^ NxGpFØDTAp?Œ=¨;Ä9à7ü5Ð302ä1¸0H0Ž% "À!t!(!¼Œ@2Þ\  Ä x   Üf‚Þû¾ù<öðõ¤õXõòóìñ¼ðpðFðbîîåÈä|ä0äÜâ¬á`á>¸Dû ¨Ûo8©o ¥olšoPšo”™ox™o^™oèŒo$‹o ‹o4ˆoˆpoˆQoDMo”LoðKolIo@or?oP>o´7o˜7oÜ6oÀ6o¦6o¤1oP1o41oð'oo8o,ooÌînBîn€ænÕn¼Ðn†ÐndÆn´ÅnÅn”Än¼µnjµn¬³n"³nØ®n¦nø¥nð n”n¸–n‚–n(}nò|n¬inÂenXenìbn6=nÒ¤m£mt¢m.¡md‘m°Žmlmxmwm¶vm`rm„gmT`m,`m`m°YmðQm4MmLGmFmFmVDmˆ>m|8mF8m(mHmøm’m(m~mîm÷l ölèõlÎõlLõlNël,ëlëlôêlØäl¾äl×l,ÒlôÑl¾ÑlôÍl¾ÍlîÅl<Äl ÄlÈ¿l ¿lð¾lܺlÀºl¤ºlгl¨±lޱlt¤lZ¤lØŸlÈžlžlvžl,™lb”l€’là‹l‹lœŠl€Šld†lH†lˆlRl¼tl:l`3lj)l)lÈ(l®(lœ%lLlìl|lPl<l´l˜l~l8llälÈlÖlðúkžúk¤ãkˆãknãk¦ÇkV¹kÀ¸kˆ¸kn¸k”šk®‘k ‘k@k„€kN€kjzkntkÂnkDnktck°Zk¨Hk0BkBk¾;kX3k"3kp-kš(kLkÔk¸k¬kPk&újüèjÐåj˜åj~åj¨Ûj¸ÔjÔÒjŽÒjÍjìÌjÌjøËjÂËj<Ëj ËjÌÀjÜ¥jÀ¥jd¢j8™j™jð’jž’j€„jX„j0„jXjtjÈsj®sjJgji„ûhÀéh¤éh¬çh åhÄØhÍh´ÇhÇhÀÆh¤Æhȳh’³h”²hì¨hd¢hH¢hü›hHŠhŠhê‡h$„hÒƒhÄihah._hø]h ]hd\hB[hðUhºUhOhPLhxÆg„ÃgT³gÔ§g¡g4“gp‘gŽg´gø~g´pg`]g0PgÜOgÀOgH?gÔ»eººeÈe”eX“e°ˆe‡eÚ†ep‚ere´~e˜weþrepeXpe>peieäheÈhegeþfe_eè^elKe6Ke”Ge’4e(4eò3e,.e.eh eL e˜e`e°ødxød^ød(ödÔèd¬èd„èd\èd4èdÔâdÌÌd”ÄdxÄdl¹d³dü²d$²d¼£dœdäšd¬šd’šd¶ŽdtŠd ŠdŒdpdÄfdÐSd¶SdhDdÈCdCdvCd€?dd?dT>d|d`dhdH dÿcÌcÐÁc´ÁcÌ¿c$¹cô°c8£c\šc šcücàc@mcêTªÕT\ÊT«TتT°ªTˆªT`ªT¨Th§TL§T¦TT”TXT¾TTâTT†Tt„T@zT€QT°1T4(Tü'Tà'T0&T&T T˜T|TFTÚÿSâïSÂíS$èS¤çS(åSåStØS"ØS´ÕSbÕSÀS²¿S¿Sð¾SȾS ¾Sx¾Sˆ½SغS°«Sl©SH¨S,¥S¢Sˆ…SP…S4…S¨ƒS°zS XSTS$RS RSGSÌDS¸6Sà0S ,S Sh S>ùR¸îRœîRfîR„éRéRˆæRnæR ÖRÀÂRTŸRôR®ŽR|lR kR¤]Rˆ]RR]Rl\RlYR’VRBR =RØM >MÔ%M@%M$MüMàMM(M M$M<M MÔM¸MìMð MpñLHñL ñLøðLÏL‚ÀLp³Lz¬Lü«LèjLÄ`LÂ¥Kˆ!K Kr×J(²JÈ¡Jà J¼šJ0’JT‘JˆJ„J¸ŽJìJ6‚J°JÔ€J¤AJ|AJ$;J´5J´*J4(J (J¨JèJ|J J,ºI`¹I¼¸I<¨Ip§I̦Ià’I’Ip‘IœzIÐyI,yIXbIŒaIè`IJIHII¤HIÐ1I1I`0IT*I<)I (IÄ'I€&Iä%I%IÄ#I(#IL"I!Il IILI°IÔIIôIIŒIÔIÀI8II\II|I IˆIìIHI|IØÿHôH`òHòHPÞH„ÝHàÜH`ÌH”ËHðÊH·H8¶H”µHÀžHôHPH|†H°…H …H8nHlmHÈlHôUH(UH„THxNH`MHÄLHèKH¤JHJH,IHèGHLGHpFH,EHDH´CHpBHÔAHø@H´?H?H<>H°=HøBü=B =BÜ;B@;Bd:BØ9B 9B 9B„8Bh8B¨7Bd6BÈ5Bì4BÔ3B83B”!BÈ B$ BÌûAûAŒúAPØA˜×A×ApÉATÉAÉAì¿A4¿A¬¾AX¸A¥Aà¤AX›A šAšAðŒAlŒA vAèuA`uA\_A^Aì]AØ*A(*AAØAPA4ý@hü@Äû@Dë@xê@Ôé@èÕ@Õ@xÔ@¤½@ؼ@4¼@`¥@”¤@ð£@@PŒ@¬‹@Øt@ t@hs@\m@Dl@¨k@Ìj@ˆi@ìh@h@Ìf@0f@Te@d@tc@˜b@Ta@¸`@Ü_@˜^@ü]@ ]@”\@Ü[@È[@@[@$[@dZ@ Y@„X@¨W@V@ôU@œI@ÐH@,H@d?@?@è$@œ#@ì"@@L@Ä@xò?Àñ?8ñ?ÈÛ?|Ú?ÌÙ? Ð?hÏ?àÎ?ô—?D—? “?p’?l}?Œ|?Ì{?Œg?¬f?ìe?°M?ÐL?L?\0?|/?¼.??(?h?´õ>Ôô>ô>`Ø>€×>ÀÖ>4Ï>Î>PÍ>Ì>¼Ê>Ê>ÈÈ>pÇ>¸Æ>|Å>$Ä>lÃ>0Â>ØÀ> À>ä¾>Œ½>Ô¼>˜»> »>@º>,º>ˆ¹>l¹>L¸>ô¶><¶>µ>Ô³>³>¸>Øœ>œ>ȇ>ì†>À†>ä…>¸…>p>do>Ün>ØN> N>hM>è<><>x;>Œ'>À&>&>H>|>Ø >÷=8ö=”õ=ÀÞ=ôÝ=PÝ=|Æ=°Å= Å=¿=è½=L½=p¼=,»=º=´¹=p¸=Ô·=ø¶=´µ=µ=<´=ø²=\²=€±=<°= ¯=Ä®=8®=€­=l­=ä¬=Ȭ=¬=Ī=(ª=L©=4¨=˜§=ô•=(•=„”=˜q=Ìp=(p=#9P9˜99¤ø8„î8˜ë8¼å8jå8¼ä8 ä8jä8Ð8ôÏ8ÈË8û4 ™3\43,7/˜6/ 6/ ý.èü.`ü.<á.pà.Ìß.LÏ.€Î.ÜÍ.ð¹.$¹.€¸.¬¡.à .< .h‰.œˆ.ø‡.$q.Xp.´o.àX.X.pW.dQ.LP.°O.ÔN.M.ôL.L.ÔJ.8J.\I.H.|G. F.\E.ÀD.äC. B.B.(A.œ@.ä?.Ð?.H?.,?.l>.(=.Œ<.°;.˜:.ü9.X(.Œ'.è&.<ü-Œû-xù-vø-Bø-ø-Ú÷-¦÷-r÷-öõ-Âõ-Í-p¿-¤¾-¾-È--ˆŒ-4p-´U-üT-tT-`H-TE-„B-2B-¬-ü - -ô-<--ä-¸-`-øü,Hü,¸ö,ö,äñ,4ñ,à²*°*J¯*È®*®*Œ­*Ò¬*P¬*–«*h¨*®§*,§*r¦*(¤*n£*ì¢*2¢*ÌA*¸A*¨@*T@*Èâ)â)FÊ) Æ)¶Å)Å)ˆÄ)Ã),Â)P^) ])¨\)œ[)€[)|Z)`Z) 8)8)ð1)Ô1)à-)Ä-)À))¤))¤ÿ(Üß(²ß(Þ(ØÝ(¼Ý(ðÜ(ÔÜ(tÛ(XÛ( Û(Û(8Ú(Ú(ˆØ(@Ø(\×(úÖ(dÖ(Ö(˜Õ(|Õ(Õ(„Ô("Ô(„Ó("Ó(ŒÒ(*Ò(ÀÑ(¤Ñ(BÑ(¬Ð(JÐ(¬Ï(JÏ(´Î(RÎ(èÍ(ÌÍ(jÍ(ÔÌ(rÌ(ÔË(rË(ÜÊ(zÊ(Ê(ôÉ(’É(üÈ(šÈ(üÇ(šÇ(Ç(¢Æ(8Æ(Æ(ºÅ($Å(ÂÄ($Ä(ÂÃ(,Ã(ÊÂ(`Â(DÂ(âÁ(LÁ(êÀ(À½(¤½(B½(x·(¨µ( ³(„³(h³(œ²(€²(б(˜±(|±(̰(°°(x°(\°(¯(t¯(­(̬(H©(”§(x§(¬¦(ü¥(Ä¥(¥(ø¤(À¤(ô£(´Ÿ(Tž(ˆ(l( —(¬•(à”(Ä”((‘(x(À((ôŒ(Œ( ‹(ÔŠ(ò‰(V‰(ºˆ(((Ø(¼($(Þ ( (Á'ļ'|¸'È´'(Ÿ'èš' –'ì’'P8'Ì,'ü' '<'X't''¬'È'ä'' '8 'T'p'Œ'¨'à' sL4 °íÜèhÝlÛ´ÚÚˆÙ¸××`Ö ÂjÀ ¾Þ¬̪xpJ¼FCT?\40ö`ò¬îøêDçã”ØàÔ,ÑxÍh¾ä±±À¨T Œìˆ8…„Ð}Tg cì_8\„XÐTT> :ì683„/Ð+üH”à ,xÔì¢p›~€dwd8GÂùõ`·ðµÔ´$´³¤±ˆ°دÈ®$­ô«<«Ö©d©†¨اh¦x¥ȤØ@š™X˜܆Ä…Ô„$„ƒü \€LÜ}Ø| |ºzHzjy¼x¤w´vvp´oŒnˆmÐleHd`c†bbÔ_’ rÛoÎ×o.×o¨Öo.Óo<ÑoÉoÚÅozÃoʽo½o^¼ozºož¸oÆ·o¶of±oâ°o*°o6¯o–®o©o.§oþ¡oH¡oˆ oºŸo¦oˆšoÚ”o‘oVoêŽo*Žoþ‡oÊ‚o6|o®uoRpo†nofloBkoòioiogo¢\oF[oŠZoêYojTo®SoSoRQo2No6IoæGozEojDoÊCoŽBoÐ7oÎ3ob/oÂ.o.-oV,ob$oÎ"oV!oÎo¦ooö o: o\ o oÚofobönÂõnºñnZënänÆânÞnêÛnJÛnÆÚnØnâÔnvÑn’ÏnîÍnÎÊn.Ên¤Çn¼nÄ»nŽ»nšºn"¹nʰn°nŠªnΩn.©nZ¡nŸnlžnžn^nØœn¢œn›n‚™n¶˜n˜n “n¾nænFnrŒnöŠnF‰nˆnJƒnª‚nÊ€n*€nnêzn‚vnâun¬sn¦mntin>in‚hn¶bnÎ]nÚ\nÊ[n^YnÊVn6UnrPnÆNnÒMn2MnKnŠInVAn–?nhcmv\mzYmöXm²Um.UmNSm’RmªPmîOm HmèEm¾LlKl¾Fl’El´Al<@lê?lh;lú:lN7lP2l62l†/l.l",lþ*l(l 'l¾"læ!lº lVlBlŠl†lJlnlÐlšll’lºlÎl¢ÿk¶þkþkêükâùk†øk¾÷k÷kbökÌókºñk‚ðk¾ìk¦ëköék¢åk®äkãk¢ÚkÚk®ÙkÙkŠ×kêÖkâÒkþÐk>ÐkÏkÎk*ÍkÚËk:Ëk´ÊkÚÆkêÅk.ÅkBÄk¢ÃkºÂkvÁkŠÀk¾¿k¿k~¾kZ¶kL³k2³k¬²k’²k´¯k\©kB©kp¨kV¨kJ¦k¶¤kÚ™k—kt“k¸’kÖk–k¾ŽkŽk¶Šk>‰k:ˆk‚kâk kÊkÊykwkÎvkJvkukskJokêjkÆikÒhkgkVfk`kr_k@]kYk*Wk^VknSk¦Qk Nk†Nk.IkºEkz@k°>k^>k:;k~:kÞ9kd9k67k¾5kÞ3k:0k:-k^*kj&k¢!k!k€ kk.k"kk&k:kê kªkk ÿjÚüj¼ùjöjòôjój*ïj¶çj¦âj€ájRÝjbÖjžÏj^ÅjºÂjÎÁj’¾j.¼jB¹jƵjƲjZ°j0¯jú®jî­jŽ«jîªj¤jnjêœj2›jxšjþ–jΑj.‘jVj,‹j€ˆjN…jl~jœ}jÎ|jô{j¾{jâyjvjnujlojFmjrjjàfjÆfjžej´bj~bj¦ajZ\j2Yj’TjvPjHjÊGjZCjŒBjTBj@jî>j%jN#j®"j²jj¶j2jÔjfj*jÊjR jž j¼jðjºjŠúiæøiÊói~òišðiîi:íi’éi>æiŽßi Øi†ÓiÖÏi&ÏijËi>Éi‚ÈiªÇiÒÆiZ¿iò»iºi.¹i~·i¶i"¶iª´iv¨iº¤i¤ir¡iÔŸiò™i*•iŠ”iΓi.“iÚ‡iX‡i ‡ih†i2†ijijzi^vijui¶riúmiJfi.`iî^iÚYi:XiRViŠTiÚSiÊRibQinJinFiÌBif@iŽ?i8>i>iÈ=iv=ib;iŠ9iˆ8i`8i88i8iè7iÀ7i¨6i€6iž4iþ3iD3iò2iB1i ,i:+i2i¸i‚iri‚ii4 iâ i¾ iâ iªi@ii‚ÿhÆþhNýhöùhú÷h"÷h~õhPôh(ôhôhØóh°óhVñh’îh¢ëhÜéhRèhvçhÖäh’ÞhŽØhFÔhÚÑhÏhæÍhbÊhÊÄhÚÃhâÁhJ½h^²h¾±hò¯ht«h<«h$©h©h¶¨h,§hö¦h*¤h€¢hö¡hÆžhš˜hÀ—hn—h’”hVŽhÂŒhH‹h‹h¸…höh:hv~hâyhîuhJthÐshŠsh shŽoh"nh–jh‚hhnehÒdhdhÂ]hê\h¢ZhöVhÖSh^Rh¦Qh–PhˆMhLhÞJh>JhÚDhîCh>ChžBhàAhŽAh†@hÞ>h”hÄhrhÒhnh ýg†ügæñg¶ðgðgÎïg*êg2ægžÝgäÚg¾ÏgbÍgÇg&ÄgjÃg ÁgÀg6¿gî»gb¸g–¶gžµgŒ³gp³g³gb²gV¬g2©gV¦gN¥gr¤gJ gªŸgRžgÞg†˜gf—gÆ–gö‘g:‘g~g"gÖ‹g–‡g¾†g†g~g|gv{gþxgZwgºvgªqghg²bgbg¦\g\g~XgBSg^Ng®HgöEgDg²CgÎ?g?gJ>gl6g~2gf0gR/g².gú+g$gv#g"gr!gÒ gZg&gÒgg6g–g g" gÚ g: ggbgŠg¦ggJgÄgŒgºüfºûfûfòófÞòf"òfrñfšífzìf¬äföÞfFÝfæ×fžÔf¾ÒfîÏf¦ÍfÎÌf–ÉfPÇfÇf¦Àf"¿fœºff¸f6¶f¢µf¢²fò±f¼¬f§f¦f2¤f€£fF¡f– fÚŸfNœfö‘f:‹fNŠf®‰f ˆf*„ff‚f¢€ffn~fr|f†yfNxfäwf²ufÚtf^sfôrf¾rf¦ofofnf®ef†cfæbfFbfZ\f‚[fâZf*Zf¢UfbPf¾NfæMfFMffFf~EfŽBfž=fþôeâòeÞðe~ëeþée^éeåe^ße¢Þe‚ÜeÑeŽÏeÂÎeöÍebÍerÊeÆebÅe<ºev¶e¶e*´e²°e²®eÖ«eR«eŒ©e"§eÚ¦er¤eú¢eZ¢eZ e‚Ÿe¶žeªœe’še‚™eÊ•eâ”e*‘ehŒeVŠeR‰ezˆeÞ„eö‚e8‚e‚ebe€e6{ezevleZheºge&feder]e:\eðQeŠOeŽIe^Ge„FeNFe*AeB?e:e~7e"6e1e^0eÚ/eB+eŽ'eî&eÚ$e:$e´#eºeþeeJee*e6e– eeúefeäûdódïd>îd2ädŠÚdâÕd~ÒdÏdÖÍd~ÊdjÈd®ÇdRÅdÂdvÁdò¹d6¹dÒ±dZ§dº¦d†£dæ¢dò¡d:Ÿdbžd2˜d—dv“dª’d˜‹db‹drˆdÞ†dJ…dÆ„dJƒd€d8~dîydrvd*udodâmd ldjkdj[d:Td¬OdtOdnKdŽIdšHd¸Gd‚Gd>dâÌclÇc6Çc ÆcjÅc®Äc.ÃcÄÂc–¿c’¾cÞºc>ºcúµcÊ®c®c¥cê¤cb¢c¨ c€ cÒcúœcZœcÔ›cº›câšc^–c’•cz’cn‘ccªcB‹cFˆc¦‡c‡cf†c‚c2c2zcÂvcÄucrucPtcŽqcpcvocÖnclnckcJjcÆicgc¾bc€_c._c¦McÒGc–Cc ?c®=c¶;cò5c65c–4cÚ3c~2cÞ1cJ"cª!c&cècÀcÒcfc¶cncöúb:úbšùb®òb®ÛbÚbfÙbî×bFÎb²ÍbÂÊb¶ÃbèÂb°ÂbxÂb&ÂbúÀb–Àbêºb®¹bf¹bÒ¸b2¸bv³bZ¥bŽ¢bºšb–“bv’bLbbJ‡bà†bĆbr†bƒbÀ€b¤€bn€b‚zbîxbqb:nb:_b6]bæZbRNbrKbúGb^GbôFbº@bÊ=bF;bª6bz2b¶0b’/b.b¶*b>)bN&b^bžbÆb"böb€ bnb*ýavûaBøa ía²ìaëaêaréaêâapâaŠØaúÑaÎÐaJÌa¢ÈazÅa¬ÃavÃaºÂaÂajÁaR¿aJ¾aª½aжa~´aƨa¨a*™aj”a&“aÒ„aƃaN‚a aÔ€a<aþwajwaÖvaæsagaeadaŠaaÆ[a–YaøXajWaZValUaÆQa†Pa-a¦(a"(aJ'aª&aZ%ad$a2 a‚a’aRaaÂazaÚaa˜a`anaŠ aê a.a<a"aœadaÿ`rý`nô` î`8ê`,é`Êè`Úå`âã` ã`þà`à`¾Ý`¢Ø`8Ï`âÈ`0Â`øÁ`²¹`r¸`N´`–°`¢­`F¬`t¥`X¥`"¥`J¤`B—`n‘`,`Ú`ÒŽ`Ž`…`f„`Æ~`ê}`úy`>y`na`²``^`z]`ÎR`Q`L`üJ`ÆJ`&J`F`¾B`–=`¦.`¶+`ú*`p'`*` `æ `€`v`Öÿ_jý_Hû_ú_Jù_œï_€ï_Zê_þæ_nå_²ä_6â_là_àß_üÞ_àÞ_ªÞ_8Þ_nÛ_pÙ_²Ò_öÑ_–Ï_êÈ_öÆ_zÀ_v´_º³_¦«_ª_R¨_R¤_–£_Ú¢_•_z”_Ú’_*’_:_~Ž_èŠ_ÀŠ_˜Š_pŠ_‰_ìˆ_„_šy_øm_Üm_nm_Îh_g_f_°Z_zZ_Y_FX_ŠW_†S_®R_(R_òQ_zJ_¾I_I_ŠG_êF_úE_N>_ä=_®=_¸7_v3_n._ö*_8!_Ò_2_’_"_J_R_ _¶ü^òù^&ù^ø^úè^²ä^ã^bâ^`á^8á^á^lß^Dß^ß^ôÞ^ÌÞ^¤Þ^|Þ^TÞ^,Þ^Þ^ÜÝ^vÒ^òÑ^6Ë^JÊ^ªÉ^&É^&Â^ò¿^š¾^½^º^Þ¹^J³^R²^b®^ú£^Z£^f¢^z¡^Ú ^ª^úœ^ š^‚’^ÄŒ^lŒ^€^â^ž~^þ}^V{^np^Új^Tj^:j^âc^2b^¾[^NO^vN^J^NH^®G^Ø=^¢=^ž*^d#^"^î^&^Øþ]¢þ]¦ú]jù]÷]Êö]âõ]úê]"ê]èè]Àè]˜è]pè]ªæ]îå]å]²ä]Nâ]ÆÖ] Ë]Ë]fÊ]àÉ]ÆÉ] É]t´]X´]«]«]ª]¢¦]–£]:¢]¦¡]Žž]]Äš]Žš]>˜]F–]Ê’]*’]œ‹]t‹]L‹]$‹]ÔŠ]¬Š]l‰]D‰]|„]T„]º€]Ê}]Ö|]þ{]^{]Ày]¤y]Âr]6m]Ò\]žZ]Y]¶P]‚G]æB]|B]`B]*B]z@]3]Ö/]î.]>.]Ž-]ž*])]Ü(]"]b ]²]ö]0]˜]V]>]H]Þ ]" ]f ]ª ]€]>þ\‚ý\êû\‚ô\tð\Xð\–á\rß\ðÞ\fÞ\ŽÝ\hÖ\&Ñ\8Ï\òÎ\BÎ\Ë\žÇ\ØÁ\°Á\ À\ð¿\~¾\δ\Þ±\j°\®¯\Ö®\þ­\N­\^«\æ©\*©\°—\¬•\>’\Ž‘\Nˆ\ª„\ „\f‚\*~\h}\ˆy\Št\Êj\v[\bZ\¾T\Q\^P\"O\ŽM\6I\ÖD\àC\ªC\¢B\®A\²@\:\j6\„/\j/\v+\î)\>)\¨(\´&\ˆ&\\"\\b\Ò\^\l\P\þ \< \Ž\Ò\\fþ[¦ü[*ö[êñ[Vï[VÛ[ŠÚ[¾Ù[Ù[^Ø[nÕ[–Ô[¶Ò[bÂ[BÁ[2µ[Ö³[–²[±[Ü¥[v¤[Æ¡[Nž[Ž[ —[j“[¸’[J’[N[®Œ[Œ[’‰[2†[z‚[¾[[:}[¬s["s[Žq[†p[o[ i[vg[ d[Nc[®b[‚Z[2X[W[ªU[&U[†T[æS[S[M[ö=[=[à5[ª5[Ò4[N4[ú1[¶.[V,[j)[ [Š[z[”[[~ [&[F[–[Ú[[B[.ÿZ>üZàøZrøZ¦òZ^æZ"åZáZÊÝZBÛZ@ÕZêÒZ0ÌZÆÇZÇZ:ÆZ2ÅZÆÂZ®ÀZj¾Zt½Z>½Z~ºZö·Z:§ZöžZ²—Z –Zj•ZøZŠZ†Z …ZNZ2~Zò|ZwZ sZ†rZ²qZöpZ‚nZŽhZ‚bZWZTZ6SZžLZAZÚ=Zê:Z:Z²8ZŠ3Z2Zž(Z–&ZÖ"ZZtZÎZJZ¶ZZ ZZ ZÊûY"êY‚èY:ãY¾ÛY<ÚYÚYfÙYþÑYRÐYvÍY‚ÅY†ÃY–¸YR¶YzµY YbŸYî›YF—Y~ŒYJ‡Y’†YƃYú‚YÖYÆ€YÚvYFuY¦tYtYVsY¶rY‚kY"^YÔYY.VYæSYòRYbNY¼FYBCY†BYª5Y5Y 3Y|1YT1YŒ0Yd0Yò,Yò(Y&(YüYÆYYvYRY”Y®YæþXöûXFïXÆîX„ÜXÜXÂÐX>ÐX¦ÌXòËXnËX‚ÊX:ÉXÖÈXŽÅXNÃXö¼XZ¸Xª·Xú¶XJ¶XšµXª²X®XnªX†©X–¦X.¥X~¤XΣX£Xn¢X¾¡X¡X^ X®ŸXþžXNžXžXîœXœX™XjX¾X†X\…XŠ~XbxXNvXäuX6pX¶mX^XZXFYXîPXFLX¦KXFX>DXfCX&AXv@XÆ?XÖ®W" W$žWžW‚”W”Wz“W¢’WЉWT‡W‡W4W¶tWºsWârWænW–dWdWncW¾bWbW\W®YW.TWvRWòOWŠNWÚMWêJWþIW‚GW†EWÊ3Wò2W2WŽWîWâWjW€WdWVW"ÿVþ÷V¢öVõVzôVVêV‚èV4ÝV¨ÜVÜVöØV°ÓVzÓVÐVØÏV2ÉVªÆV¼ÀVÖ¶V:¢Vš¡V V¶ŸVŸV4V¾šV‘VXVrVú|VÐzV¤zV xVðwVªmVmV‚lVÞhV¾gV*fVÎ]V\VÈ[VŽUVbQVVOVþIVrHVŠGVø4VÊ/Vf-V*Vø)V2$Vþ VN VºVúV VjV* V– V’ VªVÞV.VòVÒÿUzþU’ýUÒúUâ÷UºíU4íUíUâìUzáU¢àU&ÕUÍUì¼Uª¶UÞµUö´U*´UÞ²UÚ±UÖ°Uæ­U¬UÔ«U«UƤU Uš›U¦šUlˆUì~UÔ|U^tUÒfUê\U*ZUúSUÚHU®CUF=U¦ŠTT2}T’|Tf{TxT²wTRdT¢cTúRTÎ>T9T¶7T>6T¶.Tè-TÌ-Tz-TäT’Tz T T@ T T° TŽTÈTVÿSzúS"÷SÎêS âSHâSâSàáS¸áSáSÛS²ÙS4×SnÔS(ÓSšÍS>ÌS,ÅSôºSà°S¸°Sz«SÚªS:ªS6©S²¨S¡S~žSBSœS›SnšS¾™S–S¾“Sž’S~‘SŽŽSÒSÖrS>cSN`S’JSnESèDS4DSÜCSn>SÊFRNCRÒ:R7R`R~RŠRªûQ°úQˆúQ`úQ8úQèùQÀùQ@÷QÒöQZòQÞðQDíQ8ëQÖêQìéQŠéQèèQ†èQÖçQîæQöåQãQfâQÆáQ.ÑQ*ÐQ ³Q ²Q\±Q4±QªQ6©Qj¨QÖ§Qæ¤QF¤Q ¢Qø¡Q|’Q‘Q^QnQ"ŒQŽ‹Q€ˆQHˆQrwQtQÂiQþ`Q²VQæUQþTQRQzPQÚOQŽNQîMQ¢=Q:¿OV¾O¦½O¾¼OÖ»O »OºO¾¹Oò¸OB¸O µO²O^°O’¯O¢¬O¬OªO~¦O^¥O>¤O£Oþ¡OÞ OÚŸOòžO žOZOrœO‚™Oâ˜OB˜Ot‘O$‹OÌŠObƒOvOð€O¸€OÖ{O&{OxO¬sO„sOÜrO´rOŒrOR`Oh]O@]O]Oð\O°[Oˆ[OâPOPOJOO¶NOÆKOEOÎ@O@OŠ?Ob>OÞ:O>9OV8OÂ7O¾6O^3OH2Oª*O&&O’$O*#Oz"OÊ!O!Oj OzOªOöOOhO@OOðOÈO OxOPO(OO2OfOFO–O~ÿNüNûN>÷NröNŠõNèôN¢ôNjñNÒîNLîNîNVíNÂìN.ìN¾èNÖçN&çN’æN¢ãN<áN>ÕN*ÐNÒÏN2ÏN¬ÎNvÎN@±N±N†¨NÚ£Nò¢Nâ NÖœN&œN’›NâšNš—Nê–N¾“N*“Nz’Næ‘NöŽNŽNÞŒNŒNb‹N²ŠNŠN6‰N¢ˆNò‡N^‡N®†N¾ƒNƒNîvNWNªTNlMN®KN¢HN¢FNôBNÌBN¤BN|BNTBN,BNBNÜAN´ANŒANdANÂ;NV7NÂ5Nf0N¶/Nê.N:.NŠ-NÚ,N*,Nz+NÊ*N6*NF'N¦&N"%N¬ N„ N\ N4 N NN²NNNÂNNbN²ÿMÿMŠþMšûMúMÎùMØòM¬ëMVèMçMÎäMäMŠãMÊâMÚßM:ßM*ÔM–ÓMÓMÐM ÏMÊMÄÈMŒÈMTÈMòÇM4ÇMüÆMÄÆMbÆM²ÅMNÂM^¿Mp¶MH¶M ¶MøµMеM¨µM€µMXµM0µMµMà´MV¢M¦¡Mö MF MzŸM®žMâMMJœMš›MêšMšM6™Mj˜Mº—MÒ–M–M:•Mn”M¢“MÖ’M’M‚‘MJŽMÄM~MÎŒMdŒMŒMn‹M¢ŠMº‰M¶ˆM·Mæ†M6†Mj…Mž„M „MZƒMj€M’Mî}MfzM|yMnM’lMNgMJfM¶eMeMdM6cMjbMz_Mn\MÚ[MF[MŠUMÚTM*TMBRM’QMZNMªMMúLMLMRKM6HM.EM^CMvBMV@M¦?Mö>Mä=Mò;MÆ8MH8M 8MŽ6MÞ5MJ5M¶4M"4Mb3Mð%Mž%MâM2MMJMÄM~M²MÊMÆMÞMöMMÖM&MZMrM¦Mª Mº MÊM@ïLïLðîLÈîLšèLêçL:çLŠæLÚåLêâL‚áLÒàLàLFßLzÞLÊÝLÝLjÜLºÛL ÛL ÚL„ÚL"ÚLrÙL‚ÖLºËLîÊL"ÊL:ÉLnÈLÌÇL†ÇLžÆLšÅL–ÄLF¾LJ½LȼL¬¼L´LD«L«LôªL̪L¤ªLâ¥L’LŠ‘LöLŒLFL–L’ŽLZ‹LªŠLú‰LöˆLpˆL*ˆLæƒLâ‚L‚Lš~LeLBdL_LÞNL.NL~MLnKL¾JLJL^IL®HLþGLNGLžFL¶ELÎDLDL6CL†BLž@Lî?L†>Lº=LîLÔL¸LrLìLÐLŠL\ L LFLúLJLšL6LêÿK:ÿKŠþKBûK^÷K’öKŽõKÂôKöóKFóKúñKJñKšðKêïK:ïKŠîKÚíK®êKþéKNéKžèK èK>çKŽæKÞåK.åK~äKÎãKãKnâK¾áKáK^àK2ÝKfÜK¶ÛKÛKVÚK¦ÙKöØKFØK–×KæÖK6ÖK†ÕKºÔK˜ÓKRÓK¢ÒKòÑK^ÑK®ÐKfÍKŠÌKÚËK*ËKzÊKÊÉKþÈKÆK¦ÁKöÀKbÀK¢¿K²¼Kd³K<³KÚ–KV•KŠ”KÚ“K“K&’K¢KòK^K®ŽKf‹KbŠK²‰KKÔ|KFzK*wKzvK®uKþtKrqKnpKjoK‚nK¶mKmKVlKnkK†jKÖiK iK>hKVgKšeKêdKVdK¦cKaKn_K¾^K^KB]Kv\Kª[KZKfYKÒXK"XKöTKÊQKþPK2PK®NKþMKjMKºLKŽIKÞHKÂEKEKôJŽóJÞòJ.òJ~ñJÎðJ‚ïJÒîJ"îJVíJŠìJÚëJ*ëJzêJÊéJéJ°èJ”èJ2èJ‚çJ|æJ6æJ†åJÖäJîãJÂàJ^ÝJ®ÜJþÛJÙJ6ÔJÖÒJâÐJàÆJ¸ÆJÆJhÆJøÄJÐÄJ¨ÄJ€ÄJ0ÄJÄJ ÀJxÀJ¬·J„·Jø¨J¨Jp¥Jj¢J‚¡Jb J4ŸJîžJ^˜J®—Jâ–J2–J‚•JÒ”Jv“JÆ’Jê‘J‘JPJ J>JrŽJŠJº‹Jh‹JŒ‰J*‰JPˆJ ˆJ0‡Jê†J†J|…J6…JN„JȃJ‚ƒJjJŽ€JÂJJ²zJ®yJ‚vJbuJztJZsJÎlJØkJ°kJ˜fJˆ`J>PJVOJRNJNMJJLJ~KJnIJ¾HJl.JØJHýIüIRûI.øIb÷IÎöIÔóI.ëI~êIŽçIÒåIÞãIöâIßI@ßI>ÜIŽÛIzÚIÊÙI6ÙINØIf×IšÖIêÕINÒI.ÑIòÏIÞÎIÚÍI*ÍI–ÌI¼¼Ið»IL»I̪IªI\©Iœ•IДI,”IX}IŒ|Iè{IeIHdI¤cIÐLILI`KI˜BI€AIä@I@IÄ>I(>IL=IH((H\'H¸&H"H€ñFÈðF@ðFôÞF<ÞF´ÝF”ÊFÜÉFTÉFd­F¬¬F$¬FFdŒFÜ‹F”yFÈxF$xF˜dFàcFXcF¨HFÚGF¨FFÚEF¨DFÚCF4CF¨BF|BFôAFÚAF¨@FÚ?F¨>FÚ=FÄD>DP=D<=D´ ø>`÷>ˆì>\ë>¤ê>hé>è>Xç>æ>Ää> ä>Ðâ>xá>Àà>„ß>,Þ>tÝ>8Ü>¬Û>àÚ>ÌÚ>(Ú> Ú>ìØ>”×>ÜÖ> Õ>HÔ>Ó>TÒ>(Ñ>pÐ>X¾>x½>¸¼>¡>$ >dŸ>r>dq>Üp>hQ>œP>øO>x?>¬>>>>H*>|)>Ø(>>8>”>Àù=ôø=Pø=|á=°à= à=D×=,Ö=Õ=´Ô=pÓ=ÔÒ=øÑ=´Ð=Ð=<Ï=øÍ=\Í=€Ì=<Ë= Ê=ÄÉ=8É=€È=lÈ=äÇ=ÈÇ=Ç=ÄÅ=(Å=LÄ=Ã=lÂ=Á=xÀ=Ü¿=ô°=(°=„¯=°˜=ä—=@—=(t=\s=¸r=¢V=T=*\>*L=*ø<*bÊ)ú (~Y!&s]ÜSØFV3ô2D2”1ä0Ò(J'X&@& ü Üíê4ééú¬.0àuàb¸H Ï0Þù:õr”úh*^ÌMDL”KäJ4JJIàHÞœâšÖ˜:gff¾aaz`Ê_J\š[ÎZºY Y>X¶MRJdIHô 0ÚoÚoÞÙoXØoH×oÐoÊÏo¸Ío€Ío Êo8Éo,ÆoÀop¾oT¾o¾o¸oü·o²oü°o¤¯ol¯o­o€«of«oXªo ªoÔ§o¸§oœ§oŒ¦o¥o£o`¢op›o4šoè•o²•oø’oÜ’oÀ’o¤’o€‘oìoÎŒofŒoä‰oȉo‰o4o¤|oèxoäuo@mÌ?m°?mx?m\?mä;mp9mÐ8m´8m˜8m 1mð/m.m *m„*mä)m&m˜$mŒ#mP mmŒmTmTm<m0mmÔmÌm–mmP md m¬mîýlhýl¼ûlpøl8øl´÷l~÷lôl¼ñl,ðlðlpïlêlDél élÔèlºèl¤ælˆællæläl€àlÚßllÞl¤ÜlˆÜl<Úl€ÙlÈÔlvÔlÑlÈÐlÍlŒÈl@ÆlÆlÁl2Àl½l°¹lô¸l¼¸l„¸lj¸l·lt·lдl´´l˜´lJ²l8°l°l°lЬl¨¬l«l¸¦lú¤l¤l£lÔ¡l¸¡l¡lâ lx lB lnl šlH’l l@…l$…l…l²€lülø|lÜ|l |lˆ{l`{l8{l{lhylLylvxlHplpl€ll,llŒklæjlÄiløclXclX`l<`l0[ltZl4YlàNl¨Nl€KldKlJlüIlàIlôFläEl€Bl?lô>lØ>lX:l@9l9l48l”1l¤0ll0lP0l¼/lH-l,-l4+lX*l !llÌllìlül`lðl8llDl,llôÿkýküûkxùk^ùkøõk¼òk¸ðk°ækxækåkääkÌâkLÜk°ÛkÚk×kdÖktÔkXÔk`ÊkD¼k`ºkô¶k ¶kܯkø£kDŸkŸkôk¢k8kkkäœkl›kD™kèkk”ŒkìŠk¬‰k‰kĈkpˆk.„kP‚k zk`yk¤tk˜sk`sk(skŒpkômk¤mkXkk kkkkikgktgkJkÔIkœIk€Ik¸Gk Fkk”>k=kÌi¬=i|;i˜7ip7iH7i 7iø6iÐ6iÔ4i44i(3ix1i/iô.iÌ.i¤.i¢)i˜(i|(iD(i^#iÜ"iÀ"i "i,!iô ii¬iti iÖiüiÔiàiÔi¸i^iôiØi¼i†iiXiˆ iP i iô i¨ipi4iiüiLiiüþhúhøhÐõhŒñh˜ðhàïh¬îhlèhøáhÐáhHÛh,Ûh€ÙhJÙh,ÍhØÌh¼ÌhÌhÎËh:ÈhÆhÌÅhÀÂhˆÂhPÂhH¿h¿h€½h°µh”µhxµh\µh&µh´h´hä³h°²h8±h±hÀ®hx®h@®h$®hø§hD›hðšhÔšhžšh$™hì˜h˜hÜ—h¤—hÔ•hœ•hH•h,•hhÂhøŒhd‹h,‡h,‚hÖ€hÈ~h¬~hú{h2wh”vh\vhÐrhœphHph.ph¨ohèjhÌjhŽihöhhLfhfhÜehLdh´bhFbhÀahäYhtYhhð:hT8ht6h 6h6hÎ5hì/hÐ'hb'hh&hL&hp$h#h"hX"h""hœ!hðhh\h@hh´hühàhüh4hÄh¨hŒhºh8 hä hÊ hXhÌúg°úgôgTíg˜êgLèg0ègègúçgçgâgüágÜàgÒÞgÔgdÓgVÒgÎgøÆg0ÂgTÀg8Àg°¶gx±g\±g@±g¨¬güªgĪgü¦gĦg £gn¡g€ gˆžgˆœgRœg˜›g|›g`›gF›gÜšg<”g ”g,’gÐg0g°ˆg”ˆg‡gT†gƒggv}gŠ|g0|gätgÈtg¬tgtg´rgig¨fgpfg¤dgndg”cgxcg|ag`agÀ`gBWg°NgxNg®Mg`KgèIgHgHFgd>gì5gb5gX4g"*gtgìg¶g(gðgøg¤gˆgdg<ggt g¸ g€ gH gTgüfPûf,úfúfŒñfÐíf,äf¢ãfàfxÛf8Òf@ÐfÐf°Éf¬Ãf¸¸fl¶fô²f ²f±fä°f@©fL¨f0¨f<§fd£f¬›fl™fP™f4™fú—fØ—f„—fh—f´“f~“ft‘fX‘f<‘f ‘ff.Œf¨‹f@ˆfê}f€}f}f|fÐ{f´{fvfufÌsf°sfrfäqfpf8kf(jf jføffäefÈef¼cf2_fx^f\^fh]f¸[f„Xf°Vf”VfxVfØUf$QfìPf`MfÜLfÔIf¸IfüHf€GfdGfàEfÄEf€?fd?f,?fv>f >f4=f6:f$7f7f°4f\4fj3fä.f-fÈ,f¬,f,fh+fp&fT&fD%f %f²#f<"fF füfŽfÔf¸fŒfžff¸fføfD f fŒ fd f< f fì f, f fÜ f´ fŒ fôfÌf ÿeŒýe¨úeöeHõeõeôôeXôe„ñe°ïe\ïe(îe°íePêe¸åežåe@äeãeøâe<âeÌße¸ÜeÕeÔÏeXÎeØÆe ÄeüÂeìÁeÐÁeèÀeÌÀezÀe$½e¼e¬»e»eä¹e`´eú±eX±e ±ḛe0°eܯe¯e ¯eÌ®eèªe̪e,ªe:©e¶¨e£e¼¡eÈ et eìže@œeNeîŽelŽePŽe4ŽeLŒeø‹e”‹eÄŠe¨ŠepŠe<„e„eŒe~el{e@xeìweÐwe¸oeÌnexne mehmeÔgebeÌ`eÜ_e´[e˜[eÜZe¦Ze ZeTXe8XeWeäVeøReÔQe€QeèPeøOeÜOe¤Oe(LeÀHeˆHe(CeðBe¸Beè?ex?e>eâ:eÈ4e<3eš,eè+e°+e\+e„*eh*eÈ)et)eZ)eü'e¨'eb#el!e´e|e eˆeÐe\e0eeeXepeTe8eÀeÎ e, eô e° e„eÈe¸÷d õdèôdîd ëdìédÄédãdZãd8àdàdèßdÀßd˜ßd°ÝdxÝd\ÝdBÝdtÔd€ÐddÐdHÐd,ÐdÐdôÏd ÎdÈdÈÇd0ÄdúÃd„ÂdhÂdLÂd¿dh½dL½dd¼d<¼dˆ¹d¸¸dh¸d@¸dð·dÈ·d ·dx·dضdð³dÔ³d̰d°°d§dš¥dø¤dܤd`¢dt¡dÔ d´žd˜ždX—dd–d@•d•ddd.dŽdød¤d‡dt†d|‚d(dò€d¢~dœ}d€}d¨|dð{d xdðwdÔwd¸wdœwd€wd`ud¤tdntdtd°sdØrd rd„rdhrd€od8od4ndnd@ld„kdœjd€jdddÔ`dœ`d€`df`d„]dh]d|Yd@Wd SdäRd¼Rd”RdlRdrLdIdÜBdè:dÎ:d9dd7d°3d°1d 0d,/dD-dô,d|,dT,d,,dP(d4(d(d$%dü$dÔ$d¬$d„$d\$d4$d $dä#d¼#d”#dl#dD#d@død dðd¸dœdÄdTdÜd¨ dŒ d>d\d¬dÔdôýcÈùc ùcÄ÷cìöcäõcÈõc¬õc ïcïcÌîcØëcèc¨åcŒåcÔãc4ãc ác0ÛcøÚcÀÚc”Ùcì×c´×cÈÕc¬ÕcÔcôÐc:ÐcˆÏcPÏc¤ËcÉc¤Çc°ÆcxÆcÀÀc »ch»c0»cp¸c °cè¯c0¬c¬cø«cÜ«cð©cÈ©c ©cl§cP§c §cø¡cÜ¡c4›c›cȘcÀ–cô•cFc¼Žc”ŽclŽcDŽc¤‹cŒ‚cp‚c<}côzcðxcLwcøvc”mcLlcÌec°cc”cc”aclacœ_cd_c¨^cŽ^cè]c˜]c€\cX\c\cÞ[c´ScÀQcˆQcèPcPcØOc¼Oc†OcÈEc¬Ec°Cc@?c„>cN>c˜_ ˜_ø•_¤•_4•_ô“_ “_fŒ_Ž‹_¨†_Œ†_p†_`„_D„_Šƒ_ ƒ_΂__@z_z_üv_Äv_¨v_|n_ˆm_l_k_èj_Àj_Tg_8g_|f_e_he_ \_¨Y_pY_TY_|X_ V_tL_ÔK_LF_0F_F_ÈD_D_ B_$@_0=_=_ :_„:_h:_p5_H5_¼3_Ø2_ú/_H+_,+_p*_ )_x)_P)_()_)_l'_'_„&_ì _x_@__ì_T_ð_¸_œ_ø_”_T_,__Ü_´_Œ_Ä _œ _t _L _$ _ü _( _ _€_l_œ_t_ªý^,ü^äú^@ù^ ø^0ø^äö^Èö^‚ö^üõ^àõ^šõ^˜ë^pë^Hë^hé^ å^˜â^LÜ^$Ú^Ø^ô×^Ì×^ÖÕ^@Ô^4Ï^ÄÌ^ŒÌ^pÌ^8Ì^ÄÉ^PÆ^°Å^ˆÅ^`Å^8Å^Å^èÄ^Ã^@Â^ Á^Á^ÊÀ^`À^¿^ì¾^о^ ¹^è¸^̸^”¸^z¸^¼·^ ·^”µ^ µ^̪^°ª^,ª^ª^¨¨^€¨^ð¢^(ž^ ž^x˜^P˜^p–^H–^ –^ø•^Е^¨•^x‘^@‘^$‘^p^ø^\^d‰^l€^P€^ }^z^¤t^Rt^¨r^r^ôn^Øn^¼n^„i^¨g^€g^hb^È`^x`^p^^¼]^”]^l]^Ø[^8[^ìX^´X^˜X^`X^FX^°W^W^ÀV^˜V^pV^HV^tT^4T^ T^äS^¼S^LR^$R^üQ^xP^îO^ L^pJ^F^ìC^ÐC^¤?^l?^P?^?^”>^^>^H7^ 7^1^à0^l.^P.^z-^d,^t(^,%^%^Ü$^”^l^D^„^¬^<^\^$^h^\^Œ^Lü]$ü]Àú] ù]„ù]÷]4ö]ï]Êî]ìí]Äí]œí]ê]Xê]<ê]$æ]„å]ÜÚ] Ù]ÔØ]œØ]€Ø]dØ]¨Ò]ØÑ]üÏ]Î]ØÍ]XÇ] Ç]äÆ]¼Æ]ˆÂ]ÈÀ]X¿]0¿]¸]ˆ·]Ȳ]Ì­]¤­]|­]D©]À¤]¦¤]€¢]Äž]œ]Zœ]Ú—]—]À•]ˆ•]D’]D‘]‘]ò]ØŽ]°Ž]ˆŽ]`Ž]èŒ]üŠ]\Š]4Š] Š]ä‰]¼‰]”‰]‰]ôˆ]̈]¤ˆ]|ˆ]è†]̆]z†]ä…]¼…]”…]l…]…]Ì„]¤„],„](‚] ‚]]]P|] x]hx]œw]*p]¬o] o]lm]`f]8f]tc]b]Da]Ì`]@_]ð^]È^] ^] Z]XY]0Y]HN]öM]èL]ôH]TH]H]G]ÜF]è@]°@]”@]®?]4?]¼>]l>]l<]p;]H;]ô8]@7]˜1]|1]p0]T0]P/] *]X)]0)] ]Ì]Ð]t]Ô]4] ]ä]¼]”]j] ]è ]– ] ]Ü]d]à]Œ]ì]8]]@]&]]dû\,û\Ôö\¸ö\¬õ\í\ôì\hë\Øê\°ê\ˆæ\`æ\6æ\üå\ðÕ\ÀÒ\ˆÒ\°Ñ\xÑ\\Ñ\Æ\ìÅ\ÄÅ\œÅ\\Å\4Å\»\к\˜º\|º\ܹ\˜¶\p¶\±\è°\̰\ ¯\l®\P®\4®\¼ª\ ¨\ä§\¼§\,¤\\£\ô¢\Ì¢\¤¢\|¢\\ \4 \®\ðš\ð˜\x˜\D”\(”\ð“\<\ÄŒ\HŠ\t‡\°†\œx\tx\ w\Àt\Ls\$s\²q\0p\ôm\¾m\ l\¨f\Œf\e\äd\Èd\Lc\üb\¬b\Ha\,a\D`\(`\,X\W\äV\DV\TT\ÔQ\œQ\tO\XO\K\ˆI\PI\¸H\ÈG\ G\xG\üC\B\äA\H@\,@\¶:\L9\ð5\P5\ 4\,1\ä.\ž-\8-\ð*\Ä(\ô'\|'\à"\¼!\j!\ !\l \D \ \ô\À\Ø\°\8\\\\\è\À\˜\p\H\ \ø\Ð\¨\€\X\0\¸\h\ü[Ðû[Xú[ ú[ˆù[ìó[Ðó[<ò[ò[¨ï[Àì[¤ì[ˆì[èë[Tê[ê[$é[4ç[Ðå[´å[Ìä[°ä[”ä[xä[Ôâ[0á[TÜ[ìÚ[xÑ[PÑ[àÎ[ŒÎ[Ì[tÌ[ŒË[dË[TÈ[,È[È[ÜÇ[´Ç[ÜÅ[¦Å[Ã[̾[H½[,½[Lµ[ ©[x©[P©[(©[l¢[ü¡[¬ [Z [x™[P™[¬–[¤‘[ ‹[ðˆ[Ôˆ[‚|[z[8o[6k[ f[e[@d[„c[ a[ ][XW[€V[fV[@U[|S[@R[R[¶Q[øP[DP[œL[tL[LL[ÔK[TI[,I[I[ÜH[´H[¬C[\C[ C[äB[XA[œ>[€>[H>[p=[ð:[È:[Œ3[83[3[2[L.[0.[Ä,[Œ,[ø*[À*[¤*[l*[4*[*[H&[&[ô%[\%[ä[¼[”[l[D[Ä [t [´ [¬ÿZ,÷ZˆìZlìZìèZ´èZ˜èZøæZÜæZÀæZ¼åZ åZ„åZüßZªßZfÝZLÔZ@ÒZÈÑZ ÑZxÑZTÆZüÂZØÁZÁZäÀZÀZ¼¾Z½Z¨»Zp»Z»ZH¸Z¬´Z\´Z ´Zä³Z ²ZܱZ®Zì­Zš­Z«Zp§Z¤ZÀ¢Z˜¢Z ¢Zì˜ZÒ˜Zè—Z •Z“ZàŒZ0ŒZ؈Z¼ˆZhZЀZ`}Zœ{Zt{ZDwZuZnZliZ4iZühZTgZ,gZgZ0eZeZà`Z_ZÌ^Z^ZØ]Zà[Z$ZZZZhYZlSZ RZjRZ NZNZ MZÔLZ\KZ¤JZ|JZ,JZŒIZ X¸XX¬XDXX¤XÈýW¼øWðîW4îWàíW¤ìWtìWLìW$ìWÄëWœëW¬èW„èW\èW4èW èWäçW¼çW”çWlçWdãWHãWrâW|àWFàWlßWÐÞW`ÝWÝW€×WLÖW$ÖWüÕW¬ÕW4ÔWÔW@ÒWÒWðÑWÈÑW ÑWxÑWÄÏWœÏW˜ÍWpÍW$ËW ÊWèÉWäÈWÈÈWJÄW¿Wè¹W`¸W8¸W¸Wè·W\¶W ¶W´Wä³WȳW¬³Wt®W,ªW”¥WÄ¢Wœ¢W$¢WhWÞœWDœWÔ˜W¬˜Wä—W°“W“WØ’W˜W|WüWÔW„W\W4W WèˆWˆWX†W0†W؃W¢ƒWœ€Wt€WˆzWlzWPzW4zW$yWXxWlwWDwW€uW4sWsWÚV,ÙVxØVÄÖVäÑVÑVÈÌVËVêÊVÄÆV,ÆV<ÅVÅVìÄV,»V(·V ·V`°Vè®VX­V<­V ­V­V2ªV”£V\£Vp¢V0¡V¡VìŸVœžVüVôšV šVÖ™Vh˜VÄ–Vø”VДV¨”V€”V\’V4’V‹VôŠVØŠV¼ŠV„V$ƒVü‚VÔ‚V\V4VÀ{VH{VøzVPwVÆvVœqV€qVÌpVðmV„iVhiV0iVôcV¼cV„bVØ\VtZVLZV$ZVüYVÔYV¬YV„YV\YV TV MVLVHVxEVPEV(EVEVØDV°DVˆDV`DV8DVèCVhBVÀ?V>Vè=VÀ=V˜5Vh4V>4V¸-V´*V8(V°%VL$VD!V” VXV0VVàV4VôV¼V VPV(VVVÜVnVè V° V, V°VÀVˆVPVhÿU0ÿUøþUþU(ýUðüU¸üU€óUXóUàòU¸òUòUhòU@òUòUðñU|êUFêU”éUléUôèUÌèU¤èU|èUTèU,èUèUÜçU´çUŒçUçUêæULåU$åU¬äU„äU\äU4äUÌáUôàUäÜU¼ÜU”ÜUlÜUÜU`ØU8ØUÀ×UÖU@ÕUXÔU¨ÒUpÒUTÒU8ÒU`ÑU(ÑUÉU\ÇUTÆU”ÄU\ÄU ÃU„ÃU¤ÁU8»U»U|·UD·UÀ³Ut²UX²U ²Up±U±Uh­UȬUø¦U4¥U¥UD¤U ¤UÔ£U¸£U4£U°¢U”¢Ux¢U8¡U¡UPŸUüžUÌžU¤žU|žUžUÜUøšUd™U<™U™Uì˜U°–U”–Ux–U\–UH’UˆUìŽUœŽULŽUXŒUœ‡U¬…U$UÄ}Uœ}Ut}UL}U$}Uü|U |Uä{UhyU@yUyU4uUrUðqUÈqU qUxqUPqU(qUqUØpU8nUˆiU8fUfUðbU ]U´ZUPYUàXU¶TU0TUTSU,SU¬OU„OU4OU8MUMUIUlFU0@U@U;U :UÈ6U¬6U45Uü4UÄ4U¨4UT1UŒ+U`)Ux(UÈ&U&Ut&UX&U U,UUÜU´UPUTU,UUÜU@U€U´U`UDUÌU”UØ U¼ U¸ UUøU”UzUTUDU UðUPUU0UhøT@øTøTð÷TÈ÷T ÷Tx÷TP÷T&÷TìöTØóT°óTÄñT<ìTÄÝT(ÝT¸ÚTÙT´ÖTDÖT<ÔT6ÒTØÐT°ÐTÏTèÎT˜ÎT´ÊT4ÈTÈTüÇT\ÇT¼ÄT”ÄTÃThÂT@ÂTÂTðÁTÈÁT ÁTxÁTPÁT°¾TX»T<»T¸·Tš´Td´T<´T´T„³T\³T4³T@­T­TȬTÀ©TX¨T ¨T„¥T¬žT¤T|TTTTÜœTšT<šTX™TpŒTd‰T$‚T¸{TÜxTˆxTTtT,tTtTÜsT´sTŒsTdsTSÔ&S€&SdS(SüSdSüSÔSÈSSÔSœSJS8S0S°SˆS`S8SSbS ùR¨øR¨ñRàðR¸ðRhðRðR ïRªëRèRðåRàãR¸ãRlÝRDÝRÝRÌÜR¤ÜR@ÙRpØRHØRÔRÀÒRPÒR ÐRðÎR@ÍRÍRØÌR`ÈR8ÈR´ÅRŒÅRÃR¸¾Rx¾RP¾R»R8¹Rˆ·RصR(´Rð¯R@¥R¨¤R€¤RX¤R0¤R¤Rà£R¸£Rø R¤œRÄ›Rœ›Rt›RL›R$›RÔšR¬šR”™Rl™RD™R™R˜RÜ—R@RðŒRÈŒR8ŒRŒRˆRP‡R„†RL†R$„R<ƒR8‚R‚R‚RÈRRÄ€R¨€RlR4R„~RL~R¬zRvzR°wRàuR’rRÔoR\oRänR¼nR”nRlnR*lRxkRtjR€iR¬\RD\R\RYRìXRÄXRœXRtXR$XRøURXTRàSR"QRØ@R°@R 9R(9R 6Rx6R˜3Rh3R@3R3R°2Rˆ2R2RÀ1R0RÈ/R.Rü,R”,Rì*RL)R´(RØ%R’%RÄ"Rb"RD RþRXR0RRŒRÈR RxRPR(RRØR°RˆR`RÀR˜RL RøR¤R´RŒRdR<RìRúQpùQHùQ ùQøøQÐøQ¨øQ¬ôQóQÈòQ¬òQ´íQ˜íQ`íQ(íQpìQTìQëQÐéQÌèQèQPçQ4çQ(ÛQÛQ°ÚQ ØQxÖQ¬ÑQpÐQ ÊQxÊQPÊQ(ÊQÇQÒÆQ–ÆQ4ÄQüÃQDÃQ(ÃQ ÃQ8ÂQÂQÂQäÁQLÁQؽQ„ºQ\ºQ4ºQ ºQä¹Q¼¹Q”¹Ql¹Q ·QÔ±Q¬±Q„±Qä°Q¼°Q”°Q$®Q@¬QHªQ̨QdœQHœQÄ›Q¨›QŒ›QšQܘQ`’Qp‘Q¤Q˜ƒQ|ƒQ`ƒQDƒQ(ƒQÔQ¬Q„Q˜Q¨}QÐzQ¸yQyQhyQ@yQyQˆsQ rQ¼qQ”qQ¸oQoQZmQÔlQžlQ¤aQlaQx`Q@`Q¬]Qt]Q.]QÄ\Q¨\QF\QÜ[QÀ[Q^[QnXQMQÜLQÀLQðKQÈKQ KQèIQXIQ0IQIQ¸FQFQhFQ@FQFQðEQÈEQ EQxEQ`DQ8DQDQèCQpCQHCQ CQøBQÐBQ¨BQô=Q46Qü+QL)Q¼&Q†&QD!QDQÜQ´QÄQ¨QôQˆQ`Q8QQèQÀQ˜Q QèQ|þP´ýPŒýPýPìüP°ñPˆñP`ñP8ñPÀïPˆïPlïPœîP`èP8èPÜåP4ÞP¼ÝPXÜP<ÜP(ØP ØPx×PôÔP8ÒPÒPèÑPÀÑP˜ÑPpÑPHÑP ÑPøÐPÐÐP¨ÐP€ÐP°ÎPˆÎP`ÎP8ÎPÎPèÍPÀÍPpÍPHÍPÌÊPÜÉP,ÉPLÀP¬¿P¼½PT½P,½P½PܼP¼ºP”ºP„¸P\¸P4¸P ¸Pä·P¼·P”·Pl·PD·P·P|¶PT¶PܲP(±P¯PT®P®Px¬PN¬PªPl¨P6¨PÀ¥P¥Ph¥P£PØ¢P°¢Pð›P¸›P€›Pì™Px–PP–Pè‘P¨PxŠP@ŠPìˆP„ˆPR‡Px„PüPì{P´{P˜{P(yPyP„mPÈlPØkP kP¼]PÌ\P\P„ZPìWPdSP´QPPPTNP¤LPôJPDIP„GPÔEP$DPtBPÄ@Pì>P<=PŒ;PÜ9Pœ9Pl6P¼4P|4Pt1PÄ/P.PÈ'P'PÜ&P<%PT$PL#P€"PÐ!PàP@PðP¸P€PŒPpPÀP¨P€PXP0PP˜P°PPP4PÔ PàPPHP,P|PhPØP P0ÿO´ýO8üOpöOTöO,õODôO(ôO ôOÔóOœóOìòOÐòOØäO äO¸ÝOäØOÈØODØO(ØO ØO×O\ÕO^ÓOXÒOÔÏOÍOðÌOÈÌO ÌOxÌOPÌO(ÌOÌOØËO°ËOˆËO`ËOÉOhÉO@ÉOÉOðÈOÈÈO ÈOØÅO°ÅO¸¾O°±OÀ°Oô¯O|«OD«O(«OTªO©O´¨OŒ¨Od¨O<¨OĦO¤¥OؤO„¤O¸£O€£Od£O˜¢O`¢OD¢O”¡O$¡Ot O  OpŸOlžOPžO OðœOÔœO¸œO¤”O”O(‘O‘OÖO4O´ƒO˜ƒOœOtOLO$Oü~Oð|O8|Ol{OhwOFwOwOÞvOªvOôtOØtO¼tO$tOüsOÔsOÔoO¬oO„oOlOôkOìhOXgOdfO \Ox\OP\O(\O\OØ[O`[O8[O[OèZOÀZOdXOàQO(QO¬OO EOˆDO`DO8DODOö>OÎ=O 9Oœ8O 7O°3O”3O0Oô/OÌ/O¤/O|/Oä,OÈ,O,O ,OÔ+O¸+Oœ+O*O\&O($O° OHOxO O„ONO$ OüOÔO¬OHO¨OþNLýN0ýNûNXûN¸öNöNìõNÐõNõNìðNÄðNtðNhîNœíN éN8èNlçNÝN´ÜN¢ÚNPÚN¬ØN×NàÖN¸ÖNÐÊN¨ÊN0ÊNÊNˆÇN`ÇN˜ÆN0¼N¼Nà»N¸»N»Nh»N@»NðºNȺN ºNxºNPºN(ºNºNعN°¹Nˆ¹N`¹N8¹N¹Nè¸NÀ¸N˜¸N¼¶N†¶NL´N€²NX²N0²N²Nà±Nð°NȰNž°N¯Nô®NÊ®Nä«N̨NT£N8£NNlœNà—NÔN|‰N8ƒN<‚NTNNÄzNœzNtzNLzNüyNÔyNªyN¬tNttNC >CôBà=B 'B@&Bœ%BÌÿAÿAŒþAPÜA˜ÛAÛAìÃA4ÃA¬ÂA̶A¨²AЪAXŸA žAžA ’At’AŠAð‰A zAèyA`yA|dA°cA cAH5A¤0A#AØ"AP"ATAˆAäAdð@˜ï@ôî@`Û@”Ú@ðÙ@Ã@PÂ@¬Á@ت@ ª@h©@ä@Ìœ@0œ@T›@š@t™@˜˜@T—@¸–@Ü•@˜”@ü“@ “@”’@Ü‘@È‘@@‘@$‘@d@ @„Ž@¨@dŒ@È‹@ìŠ@¨‰@ ‰@0ˆ@‡@|†@Pz@„y@àx@ b@@a@œ`@O@HN@¤M@ä,@@L@Ä@¤@xö?Àõ?8õ? Ô?hÓ?àÒ?<¾? µ?X°?”«?4ª?€¥? ¤?d ?¼œ?¬›?¬ƒ?Ì‚? ‚?Ìm?ìl?,l?HT?hS?¨R?ô6?6?T5? ?À??Ü ?°?ø?¼?d?¬?p??`?$?Ìþ>þ>Øü>Lü>€û>lû>Èú>¬ú>Œù>4ø>|÷>@ö>èô>0ô>ôò>œñ>äð>¨ï>|î>Äí>øÞ>Þ>XÝ>¤Á>ÄÀ>À>P¤>p£>°¢>t>ds>Ür>øS>,S>ˆR>B>˜@>->8,>”+>À>ô>P>|ü=°û= û=ˆï=pî=Ôí=øì=´ë=ë=<ê=øè=\è=€ç=<æ= å=Ää=8ä=€ã=lã=äâ=Èâ=â=Äà=(à=Lß=Þ=lÝ=Ü=LÛ=°Ú=ÔÙ=¼Ø= Ø=ôË=(Ë=„Ê=°³=ä²=@²=l›= š=ü™=¸v=ìu=Hu=´X=á& à&à&¨¥%|¥%P¥%$¥%̤% ¤%t¤%H¤%ð£%Ä£%P£%È¢%®¢%ø¡%Þ¡%äŸ%ÊŸ%þ~äu0aòMVIÖGVFÖDÒe>eRbbTaÈ\\ X„XÔW|WEŽ=Eè¸þ>øý>Dâ>dá>¤à>ðÄ>Ä>PÃ>œ§>¼¦>ü¥>D‡>‡>”†><†>†>z>v>du>Üt>ˆV>¼U>U>˜D>ÌC>(C>À/>ô.>P.>|>°> >Ì>´>><>ø>\>€><> >Äÿ=8ÿ=€þ=lþ=äý=Èý=ý=Äû=(û=Lú=ù=lø=÷=Lö=°õ=Ôô=ó=ôò=ò=ñ=dð=ôæ=(æ=„å=°Î=äÍ=@Í=l¶= µ=ü´=(ž=\=¸œ=Hy=|x=Øw=l*¸7*¤7*”6*@6*`~‚s€_X8Mê Àono¸ l lèlDl*lák`Ük8Ük”ÛkzÛk–ciÎôh&¾g6gàèf¸èfÂëdZÝ`\`4` `äŒ`¼Œ``á_Fá_Üv^´v^Œv^dv^Ôi]¬i]„i]\i]`5]ˆ\`\æ\š[ð™[È™[ ™[D0Z,/ZÞYL¹VlñTüšR¤˜R|˜RT˜R,˜RT$N,$N$NÜ#N´#NŒ#Nd#N¼-K”-Kl-KD-K-Kô,KH©J”DJlÄI ÃIüÂI|²I°±I ±IÐII`œId‹ILŠI°‰IÔˆI‡Iô†I†IŒ…IÔ„IÀ„I8„I„I\ƒI‚I|I €I\IÀ~Iä}I |I|I({IäyIHyIlxI(wIŒvI°uI˜tIüsIHmI|lIØkIUI8TI”SIÀE0>E¨=EhEœEøE€åDÈäD@äDèÍDÍDxÌDø»D,»DˆºDL§D€¦DÜ¥Dà”DÈ“D,“DP’D ‘DpD”DDPŽD<ŽD´D˜DØŒD”‹DøŠDŠD؈D<ˆD`‡D†D€…D¤„D`ƒDÄ‚DèD¤€D€D,D~Dx}DÄvDøuDTuD€^D´]D]D?Œ=?À°ä>ðã><È>\Ç>œÆ>èª>ª>H©>x>dw>Üv>Y>LX>¨W>(G>\F>¸E>|2>°1> 1> >ø>\>€><> >Ä>8>€>l>ä>È>>Ä>(>L>>l>>L>°>Ô>>ô > >Ô >8 >\ >D >¨>ô>(>„>°é=äè=@è=lÑ= Ð=üÏ=(¹=\¸=¸·=ä = =tŸ=Ø{= {=hz=I >I8'Il&IÈ%IôI(I„ IX÷HøöHˆöH\öHHöHÀõH¤õHŠõH ëHTêH°éH0ÙHdØHÀ×HÅHøÃH\ÃH€ÂH<ÁH ÀHÄ¿H€¾Hä½H½HÄ»H(»HLºH¹Hl¸H·HL¶H°µHÔ´H³Hô²H²H±Hd°Hl¬H «HüªH(”H\“H¸’Hä{H{HtzH cHÔbH0bH\KHJHìIH3HL2H¨1H|HH¬H€HlHäHÈH®HœéF,éFéFxèF^èF×F ÖFtÖFìÕFÒÕF°ÂF@ÂFÂFŒÁFrÁF|ÀFð¿Fü·FзF¼·F4·F·Fþ¶F˜µFà´F´´F,´F´F€¥F¥Fä¤F\¤FB¤F8…FÈ„Fœ„F„FúƒFpoF°nFømF¸mFØlF¾lFLlF lFhkFNkF´\FT\Fœ[Fp[F¬ZF’ZF ZFôYFlYFRYF¤OFP;F´:F,:FP+Fà*F´*F,*F*F”&F$&Fø%Fp%FV%FÌ Fl F¤ Fx F´ Fš F( Fü Ft FZ FPÌEàËE´ËE,ËEËE“E’Ed’EÜ‘E‘EäE,EExE^E /E¬.Eä-E -Eh,Eà+E”E$EäE@E&E°EøÿDpÿD8óD¬òDôñDÈñD´ñD,ñDñDöðDœ×D,×D×DxÖD^ÖDxÐD¬ÏDÏDˆ¾D¼½D½DhªDP©D´¨DاD”¦Dø¥D¥DØ£D<£D`¢D¡D€ D¤ŸD`žDÄDèœD¤›D›D,šDè˜DL˜Dp—DX–D¼•DÄ‘DøDTD€yD´xDxD@¬=@€=@ø<@Þ<@h-@8!@€ @T @Ì@²@ @À@@Ü@@þ@Œ@`@Ø @¾ @(@pê?ê?Hé?é?Xè?>è?Ìç? ç?ç?þæ?È?¸Ç?ðÆ?ÄÆ?Æ?æÅ?tÅ?HÅ?ÀÄ?¦Ä? ?,Œ?l‹?,w?Lv?Œu?Œ^?`]?¨\?l[?Z?\Y? X?ÈV?V?ÔT?|S?ÄR?ˆQ?0P?xO?üç><ç>ˆË>¨Ê>èÉ>4®>T­>”¬>Ž>¸>øŒ>lŒ>¤‹>d‹>P‹>pŠ>TŠ>:Š>ȉ>ˆ‰>t‰>Ј>´ˆ>šˆ>h>´g>ìf>Àf>üe>âe>pe>De>¼d>¢d>¨[>ÜZ>8Z>¸I>ìH>HH>˜5>€4>ä3>3>Ä1>(1>L0>/>l.>->L,>°+>Ô*>)>ô(>(>Ô&>8&>\%>$>|#> ">ˆ!>ì >ô>(>„>°>ä>@>lì= ë=üê=(Ô=\Ó=¸Ò=ä»=»=tº= £=Ô¢=0¢=$‰=Ĉ=dˆ=؇=‡=ä†=І= †=ð…=Ö…=d…=8…=$…=œ„=€„=f„=Èl=Dl=°k=„k=øj=@j=èi=¼i=Øh=œh=øg=Þg=4C=ÔB= B=àA=A=A=@=d@=Ü?=Â?=Ø2= 2=ô1=l1=R1=$*=X)=´(=4=h=Ä==ü=`=„=@=¤ÿ<Èþ<„ý<èü< ü<Èú<,ú<Pù< ø<p÷<”ö<Põ<´ô<Øó<”ò<øñ<ñ<ð<hï<pë<¤ê<ê<,Ó<`Ò<¼Ñ<èº<º<x¹<¤¢<Ø¡<4¡<`Š<”‰<ðˆ<r<Pq<¬p< W<@W<àV<TV<ŒU<`U<LU<ˆT<lT<RT<àS<´S< S<S<üR<âR<TE<œD<°#<„#<ü"<â"<4"<|!<P!<È <® < <t<¼<<|<ô<Ø<¾<Pó;àò;´ò;,ò;ò;¼M9\M9”L9hL9¤K9ŠK9K9ìJ9dJ9JJ9C9\B9œ39p39è29Î29¸!9,!9t 9H 94 9¬99v9|99ðÿ8hÿ8Nÿ8 ã8èâ8¼â84â8â8¸É8”Æ8TÆ8°Å8–Å8˜õ.8õ.pô.Dô.€ó.fó.ôò.Èò.@ò.&ò. î.@í.œì.Ü.PÛ.¬Ú.üÇ.äÆ.HÆ.lÅ.(Ä.ŒÃ.°Â.lÁ.ÐÀ.ô¿.°¾.¾.8½.ô».X».|º.8¹.œ¸.À·.|¶.àµ.µ.ì³.P³.X¯.Œ®.è­.—.H–.¤•.Ð~.~.`}.Œf.Àe.e.HN.|M.ØL.6.85.”4.ˆ.(.È.<.t.H.4.p.T.:.È.œ.ˆ..ä.Ê.˜ê-àé-´é-,é-é-dè-(ç-üæ-tæ-Zæ-pÞ-Þ-ÔÜ-¨Ü-äÛ-ÊÛ-XÛ-,Û-¤Ú-ŠÚ-(µ-h´- ³-`³-€²-f²-ô±-´±-±-ö°-¨¨-@-¸œ-À…-`…-˜„-l„-¨ƒ-Žƒ-ƒ-ð‚-h‚-N‚-€-¬M-LM-„L-XL-”K-zK-K-ÜJ-TJ-:J-tA-d6-86-°5-–5-Äè,öç,\°8JÜ,Ø))D(Š'°&ö%Ì$$ä * FTšp¶ì,,ýfû ûŽ>OoÎsnBmn¸BmXBmtAm`AmØ@m¼@m0þk´¾k¸ j"ÓiŒ¡i(šipXi´×hP¦h´hThph\hÔh¸hìögŒög¨õg”õg õgðôg \gLDg0Dg(fˆ~fhxf¬*fÜf„jePdežLeeÁd’6d€†c€c´cx~cd~cÜ}cÀ}c„Áaô ^œ’^ áZÜÏZ|ŸYìQYŒQY$PYPYˆOYlOY4õV˜WU8WUTVU@VU¸UUœUUL}TpËRÐÊRÔgRàfR€fRÄaR°aRì`RÐ`RÀ_R¬_R$_R_RÜiQ¨NQ$Qd#Q(!QdQ”YPôXPäÆLX¨J¸§JìÉIÔÈI8ÈI\ÇIÐÆIpÆIDÆI¨ÅIrÅIÌÄI@ÄIàÃI´ÃIÃIâÂI<ÂI°ÁIPÁI$ÁIˆÀIRÀI¬¿I ¿IÀ¾I”¾Iø½I½I½I¼I0¼I¼Ih»I2»IŒºIºI ¹It¹IظI¢¸Iü·Ip·I·Iä¶IH¶I¶I£IP¢I¬¡I0žI¤IDIFœIt›IèšIˆšIŠ™I¸˜I,˜IÌ—IΖIü•Ip•I•I”I@“I´’IT’IV‘I„IøI˜IšŽIÈIhIIÈŒI$ŒI ŒI¨ˆIˆI¼‡I¾†Iì…I`…I…I„I0ƒI¤‚ID‚IFIt€IèIˆIŠ~I¸}I,}IÌ|IÎ{IüzIpzIzIyI@xI´wITwIVvI„uI$uIÄtI„tIàsIÆsIdpIØoIxoIznI¨mImI¼lI¾kIìjI`jIjIiI0hI¤gIDgIFfIteIèdIˆdIŠcI¸bI,bIÌaIÎ`Iü_Ip_I_I^I@]Ià\I€\I@\Iœ[I‚[I XI”WI4WI6VIdUIØTIxTIzSI¨RIRI¼QI¾PIìOI`OIOINI0MI¤LIDLIFKItJIèIIˆIIŠHI¸GI,GIÌFIÎEIüDIœDICIÜ?IP?Ið>Iò=I =I”H>H„=H$=H&iFlhF hF>gFlfF fF>eFldF dF>cFlbF bF>aFl`F `F>_F(\FÈ[FÀVF`VF\TFüSFxOFäMFŒMF,LFhKFNKFÜJFIFGFEFCFAF?F9F¨8FÚ7F7F¨6FÚ5F5F¨4FÚ3F3F¨2FÚ1F1F¨0FÚ/F/F¨.FÚ-F¨FHFzF¨FHFzF¨FHFzF¨FHFzF¨FHFzF¨FHFzFHFèF@ FÐ F´FŒúEúEêùEÚE¨ÙEÚØEØE¨×EÚÖEÖE¨ÕEÚÔEÔE¨ÓEÚÒEÒE¨ÑEÚÐEÐE¨ÏEÚÎE¸ EX EŠŸE¸žEXžEŠE¸œEXœEŠ›E¸šEXšEŠ™E¸˜EX˜EŠ—E¸–EX–EŠ•E¸EXE<‡E܆E¼>E¼ÇD˜ÆD ÆD¬ÅD€ÅDäÄD®ÄDÄD|ÃDÃDðÂDTÂDÂDxÁDìÀDŒÀD`ÀDÄ¿DŽ¿D˜¬DÌ«D(«D¬§D §DÀ¦DÂ¥Dð¤Dd¤D¤D£D4¢D¨¡DH¡DJ DxŸDìžDŒžDŽD¼œD0œDЛDÒšDšDt™D™D˜DD—Dä–D„–DD–D •D†•D$’D˜‘D8‘D:DhDÜŽD|ŽD~D¬ŒD ŒDÀ‹DŠDð‰Dd‰D‰DˆD4‡D¨†DH†DJ…Dx„DìƒDŒƒDŽ‚D¼D0DЀDÒDD ~D@~D~D\}DB}DàyDTyDôxDöwD$wD˜vD8vD:uDhtDÜsD|sD~rD¬qD qDÀpDÂoDðnDdnDnDmD4lD¨kDHkDJjDxiDìhDŒhDŽgD¼fD\fDüeD¼eDeDþdDœaDaD°`D²_Dà^DT^Dô]Dö\D$\D˜[D8[D:ZDhYDÜXD|XD~WD¬VD VDÀUDÂTDðSDdSDSDRD4QD¨PDHPDJODxNDND¸MDxMDÔLDºLDXIDÌHDlHDnGDœFDFD°ED²DDàCDTCDôBDöAD$AD˜@D8@D:?Dh>DÜ=D|=D~Cà=C€=C =Cà^Bl]Bà\B€\B‚[B°ZB$ZBÄYBÆXBôWBhWBWB VB8UB¬TBLTBNSB|RBðQBQB’PBÀOB4OBÔNBÖMBMB¤LBDLBLB`KBFKBäGBXGBøFBúEB(EBœDBCBlBBàAB€AB‚@B°?B$?BÄ>BÆ=Bô(Bl'Bà&B€&B‚%B°$B$$BÄ#BÆ"Bô!Bh!B!B B8B¬BLBNB|BB¼B|BØB¾BBtBBlB¬B BÀ B4 BÜB°BPB<B(BdBHB.B¼B B B ÿA ýA ûA ùA@÷AdóA¤æAæAjâA$àAÄßAöÞA$ÞAÄÝAöÜA$ÜAÄÛAöÚA$ÚAÄÙAöØA$ØAÄ×AöÖA$ÖAÄÕAöÔAÄÓAdÓA¼ÏALÏAtÌAZÌAÀÇAÀÅAÀÃAÀÁAÀ¿AÀ½A,£AÌ¢Aþ¡A,¡AÌ AþŸA,ŸAÌžAþA,AÌœAþ›A,›AÌšAþ™A,™A̘Aþ—AƒA¬ALAt~A~AF}At|A|AF{AtzAzAFyAtxAxAFwAtvAvAFuAttAtAFsArA´qA nAœmAÄjAªjApiAiAhAàfA€fA‚eAPdAðcAòbAÀaA`aAb`A0_AÐ^AÒ]A \A@\AB[APYAðXA(TA¸SA™@l˜@à—@€—@‚–@°•@$•@Ä”@Æ“@ô’@h’@’@ ‘@8@¬@L@NŽ@|@ðŒ@Œ@’‹@ÀŠ@4Š@Ô‰@Öˆ@ˆ@¤‡@D‡@‡@`†@F†@ä‚@X‚@ø@ú€@(€@œ@<@>~@l}@à|@€|@‚{@°z@$z@Äy@Æx@ôw@hw@w@ v@8u@¬t@Lt@Ns@|r@ðq@q@’p@Ào@`o@o@Àn@n@n@ j@j@´i@¶h@äg@Xg@øf@úe@(e@œd@c@lb@àa@€a@‚`@°_@$_@Ä^@Æ]@ô\@h\@\@ [@8Z@¬Y@LY@NX@|W@W@¼V@|V@ØU@¾U@ìT@`T@T@S@0R@¤Q@DQ@FP@tO@èN@ˆN@ŠM@¸L@,L@ÌK@ÎJ@üI@pI@I@H@@G@´F@TF@VE@8>@Ø=@0;@Ð:@ü.@Ð.@x.@.@<-@¨+@P+@ð*@ø'@4'@'@¨&@ !@¬ @Ø@x@ª@Ø@x@ª@Ø@x@ª@Ø@x@ª@Ø@x@ª@Ø@x@ª@”@4@Ä @d @ @@@&@´@à@€@ü@hÿ?ÿ?°ý?ìü?Òü?`ü?Lú?ìù?ù?Lø?ì÷?÷?Lö?ìõ?õ?Lô?ìó?ó?Lò?ìñ?ñ?Lð?ìï?ï?ìí?Œí?äé?té?œæ?‚æ?ô×?”×?ÆÖ?ôÕ?”Õ?ÆÔ?ôÓ?”Ó?ÆÒ?ôÑ?”Ñ?ÆÐ?ôÏ?”Ï?ÆÎ?ôÍ?”Í?ÆÌ?”Ë?4Ë?ŒÇ?Ç?Ä?¤¿?¿?¿?Œ?`?¨Ž?l?àŒ?€Œ?@Œ?ˆ‹?R‹?LŠ?À‰?`‰? ‰?hˆ?2ˆ?,‡? †?@†?†?H…?…? „?€ƒ? ƒ?à‚?(‚?ò?ì€?`€?€?À??Ò~?Ì}?@}?à|? |?è{?²{?¬z? z?Ày?€y?Èx?’x?La?l`?¬_?@[?´Z?TZ?&Y?ôW?hW?W?ÚU?¨T?T?¼S?ŽR?\Q?ÐP?pP?BO?N?„M?$M?öK?ÄJ?8J?ØI?ªH?xG?G?¸F?dF?¤E?ŠE?8A?¬@?L@???ì=?`=?=?Ò;? :?:?´9?†8?T7?È6?h6?:5?4?|3?3?î1?¼0?00?Ð/?¢.?p-?ä,?„,?V+?$*?Ä)?d)?)?P(?6(?ä#?X#?ø"?Ê!?˜ ? ?¬?~?L?À?`?2??t??æ?´?(?È?š?h?Ü?|?N???0??Ð ?p ? ?¼ ?ü ?â ???¤?v?D?¸?X?*?øÿ>lÿ> ÿ>Þý>¬ü> ü>Àû>’ú>`ù>Ôø>tø>F÷>ö>ˆõ>(õ>úó>Èò><ò>Üñ>®ð>|ï>ï>¼î>hî>¨í>Ží><é>°è>Pè>"ç>ðå>då>å>Öã>¤â>â>¸á>Šà>Xß>ÌÞ>lÞ>>Ý> Ü>€Û> Û>òÙ>ÀØ>4Ø>Ô×>¦Ö>tÕ>èÔ>ˆÔ>ZÓ>(Ò>ÈÑ>hÑ>Ñ>TÐ>:Ð>èË>\Ë>üÊ>ÎÉ>œÈ>È>°Ç>‚Æ>PÅ>ÄÄ>dÄ>6Ã>Â>xÁ>Á>ê¿>¸¾>,¾>̽>ž¼>l»>àº>€º>R¹> ¸>”·>4·>¶>Ô´>t´>´>À³>³>æ²>”®>®>¨­>z¬>H«>¼ª>\ª>.©>ü§>p§>§>â¥>°¤>$¤>Ä£>–¢>d¡>Ø >x >JŸ>ž>Œ>,>þ›>Ìš>@š>à™>²˜>€—> —>À–>l–>¬•>’•>@“>´’>T’>ÌŒ>@Œ>Ћ>ô‡>ày>¸y>¤y>y>äx>Êx>ðw>w>Âv>ðu>u>Ât>ðs>s>Âr>ðq>q>Âp>ðo>o>Ân>ðm>m>Âl>k>0k>ˆg>g>üc>@a>¸`>ž`>˜^>€]>ä\>\>|[>[>ðZ>TZ>Z>xY>ìX>ŒX>`X>ÄW>ŽW>èV>\V>üU>ÐU>4U>þT>XT>ÌS>lS>@S>¤R>nR>ÈQ>ÜP>°P>P>ÞO>8O>¬N>LN> N>„M>NM>¨L>L>¼K>K>ôJ>¾J>È7>ü6>X6>Ü2>P2>ð1>ò0> 0>”/>4/>6.>d->Ø,>x,>z+>¨*>*>¼)>¾(>ì'>`'>'>&>0%>¤$>D$>F#>t">">´!>t!>Ð >¶ >T>È>h>j>˜> >¬>®>Ü>P>ð>ò> >”>4>6>d>Ø>x>z>¨>>¼>¾ >ì >` > > >0 >Ð >p >0 >Œ>r>>„>$>&>T>È>h>j>˜ÿ= ÿ=¬þ=®ý=Üü=Pü=ðû=òú= ú=”ù=4ù=6ø=d÷=Øö=xö=zõ=¨ô=ô=¼ó=¾ò=ìñ=Œñ=,ñ=ìð=Hð=.ð=Ìì=@ì=àë=âê=ê=„é=$é=&è=Tç=Èæ=hæ=jå=˜ä= ä=¬ã=®â=Üá=Pá=ðà=òß= ß=”Þ=4Þ=6Ý=dÜ=ØÛ=xÛ=zÚ=¨Ù=HÙ=èØ=¨Ø=Ø=ê×=ˆÔ=üÓ=œÓ=žÒ=ÌÑ=@Ñ=àÐ=âÏ=Ï=„Î=$Î=&Í=TÌ=ÈË=hË=jÊ=˜É= É=¬È=®Ç=ÜÆ=PÆ=ðÅ=òÄ= Ä=”Ã=4Ã=6Â=dÁ=Á=¤À=dÀ=À¿=¦¿=D¼=¸»=X»=Zº=ˆ¹=ü¸=œ¸=ž·=̶=@¶=àµ=â´=´=„³=$³=&²=T±=Ȱ=h°=j¯=˜®= ®=¬­=®¬=Ü«=P«=ðª=ò©= ©=À¨=`¨= ¨=|§=b§=¤=t£=£=¢=D¡=¸ =X =ZŸ=ˆž=ü=œ=žœ=Ì›=@›=àš=â™=™=„˜=$˜=&—=T–=È•=h•=j”=˜“= “=¬’=®‘=Ü=|==Ü=8==Œ== Œ=8ˆ=¬‡=<‡=Àƒ=¸}=¤}=}=}=æ|=¬{=L{=Nz=y=¼x=¾w=Œv=,v=.u=üs=œs=žr=lq= q=p=Ìn=ln=nm=pl=Ìj=lj=Äh=àf=.´=.T=.V<.„;.$;.Ä:.„:.à9.Æ9.d6.Ø5.x5.z4.¨3.3.¼2.¾1.ì0.`0.0./.0..¤-.D-.F,.t+.è*.ˆ*.Š).¸(.,(.Ì'.Î&.ü%.p%.%.$.@#.à".€".@".œ!.‚!.ð.d..œ.. .$.|.h.T.Ì.°.–.¸ì-Xì-lê- ê-8è-àç-Æç-Tç-Àã-`ã-Dà-äß-¸ß-0ß-ß-äÝ-ŒÝ-rÝ-Ý-„Ô-$Ô-ÈÏ-Ï-êÎ-xÎ-ìË-„É-$É-&È-ôÆ-”Æ-–Å-dÄ-Ä-Ã-ÔÁ-tÁ-vÀ-D¿-ä¾-æ½-´¼-T¼-V»-d¹-¹-<´-̳-į-d¯-ð«-«-öª-„ª-Dª- ©-†©-|¨-¼ž-ø-œ•-<•-n”-œ“-<“-n’-œ‘-<‘-n-œ-<-nŽ-œ-<-nŒ-œ‹-<‹-nŠ-<‰-܈-4…-Ä„-¨-T-Œ`-4`-4_-¬^-’^-¨]-H]-z\-˜[-8[-jZ-˜Y-8Y-jX-ˆW-(W-ZV-ˆU-(U-ZT-ˆS-(S-ZR-(Q-ÈP- M-°L-ØI-¾I-PG-ðF-èC-HA-è@-à7-7-7-6-Xï,Tê,bé,ðè,˜¦éàæ¬®ÖJ„€ÆÀFb4 z P –¤ê °öðf hX´LÀÉI`ÉIÉIÀÈIÈIÈIlµIà´I€´IT´I¸³I‚³IܲIP²Ið±IıI(±Iò°IL°IÀ¯I`¯I4¯I˜®Ib®I¼­I0­IЬI¤¬I¬IÒ«I,«I ªI@ªIªIx©IB©Iœ¨I¨I°§I„§Iè¦I²¦I ¦I€¥I ¥Iô¤IX¤I"¤I|£Ið¢I¢Id¢IÈ¡I’¡IÀ I` I IÀŸIŸIŸI8‹IØŠIxŠI8ŠI”‰Iz‰IôrI”rI4rIôqIPqI6qI°ZIPZIðYI°YI YIòXIlBI BI¬AIlAIÈ@I®@I(*IÈ)Ih)I()I„(Ij(IäI„I$IäI@I&IÌùHlùHüøHÐøH¼øH4øHøHþ÷HäíH„íH$íHäìH@ìH&ìHÙHÙH¤ØHxØHÜ×H¦×H×HtÖHÖHèÕHLÕHÕHpÔHäÓH„ÓHXÓH¼ÒH†ÒHàÑHTÑHôÐHÈÐH,ÐHöÏHPÏHÄÎHdÎH8ÎHœÍHfÍHÀÌH4ÌHÔËH¨ËH ËHÖÊH0ÊH¤ÉHDÉHÉH|ÈHFÈH ÇHÇH´ÆHˆÆHìÅH¶ÅHäÄH„ÄH$ÄHäÃH@ÃH&ÃH\¯Hü®Hœ®H\®H¸­Hž­H—H¸–HX–H–Ht•HZ•HÔ~Ht~H~HÔ}H0}H}HfH0fHÐeHeHìdHÒdHLNHìMHŒMHLMH¨LHŽLH6H¨5HH5H5Hd4HJ4HðHH HôHàHXH<H"H€ëFëFäêF\êFBêFôØF„ØFXØFÐ×F¶×F8ÔF¬ÓFôÒFÈÒF´ÒF,ÒFÒFöÑFRÑF”ÄF$ÄFøÃFpÃFVÃFd§Fô¦FȦF@¦F&¦FÜ¢F¼žFžFžFîF‡F¬†F€†Fø…FÞ…FäqFtqF4qFpFvpF˜^F(^Fü]Ft]FZ]FìVF4VFôUFPUF6UFˆTF°JF„JFüIFâIF4=F˜ÑB˜ÐB ÐB¬ÏB€ÏBäÎB®ÎBÎB|ÍBÍBðÌBTÌBÌBxËBìÊBŒÊB`ÊBÄÉBŽÉBèÈB\ÈBüÇBÐÇB4ÇBþÆBXÆBÌÅBlÅB@ÅB¤ÄBnÄBÈÃB<ÃBÜÂB°ÂBÂBÞÁB ÁB¬ÀBLÀB ÀBh¿BN¿B„«B$«BĪB„ªBà©BÆ©B@“Bà’B€’B@’Bœ‘B‚‘BüzBœzByB¸bBXbBøaB¸aBaBú`BtJBJB´IBtIBÐHB¶HB02BÐ1Bp1B01BŒ0Br0BB¸BHBBB€BdBJB`BÜBXB,B BèBBdB€BDB B†BØBLBBdBPBÈB¬B’BÌ÷Al÷A´öAðõA8õA°ôARåAPÔAðÓA8ÓA ÓAHÒA.ÒA¼ÑAÑAÑAîÐAì»AP»AȺAX—Aè–A¼–A4–A–AØA Aô€Al€AR€A rA@rAˆqA\qA˜pA~pA pAàoAXoA>oA´@¸@X@øœ@¸œ@œ@ú›@t…@…@´„@t„@Ѓ@¶ƒ@0m@Ðl@pl@0l@Œk@rk@°D@PD@àC@´C@ C@C@üB@âB@\;@|&@P&@È%@®%@@”@h@à@Æ@ð @ˆ@\@Ô@º@ @4ü?ü?€û?fû?xî?î?`í?4í?pì?Vì?äë?¸ë?0ë?ë? Ì?ÀË?Ë?ÜÊ?Ê?þÉ?ŒÉ?`É?ØÈ?¾È?`?? ?L?ŒŽ?rŽ?Œw?w? v?`v?¨u?ru?lt?às?€s?@s?ˆr?Rr?Lq?Àp?`p? p?ho?2o?,n? m?@m?m?Hl?l? k?€j? j?ài?(i?òh?ìg?`g?g?Àf?f?Òe?Ìd?@d?àc? c?èb?²b?¬a? a?À`?€`?È_?’_?`^?^? ]?L]?Œ\?r\?XD?øC?˜C?DC?„B?jB?'?¤&?D&?ð%?0%?%?° ?P ?ð?œ?Ü?Â?\ì>üë>œë>Hë>ˆê>nê>Ï>¨Î>HÎ>ôÍ>4Í>Í>´±>T±>ô°> °>à¯>Ư>Œ”>,”>l“>à’>(’>è‘>Ô‘>ô>Ø>¾>L> >ø>T>8>>l>¼k>k>Øj>j>úi>ˆi>\i>Ôh>ºh>l^> ^>¬]>l]>È\>®\>J>ŒI>,I>I>dH>.H>ˆG>üF>œF>pF>ÔE>žE>øD>lD> D>àC>DC>C>hB>ÜA>|A>PA>´@>~@>Ø?>L?>ì>>À>>$>>î=>H=>¼<>\<>0<>”;>^;>¸:>,:>Ì9> 9>9>Î8>(8>œ7><7>7>t6>>6>l5> 5>¬4>l4>È3>®3>ä>„>$>ä>@>&> >@>à> >ü>â>\ï=üî=œî=\î=¸í=ží=×=¸Ö=XÖ=Ö=tÕ=ZÕ=Ô¾=t¾=¾=Ô½=0½=½=¦=0¦=Ð¥=¥=ì¤=Ò¤=xŽ=Ž=¸=,=tŒ=HŒ=4Œ=p‹=T‹=:‹=ÈŠ=œŠ=ˆŠ=Š=ä‰=ʉ=8g=´f= f=ôe=he= d=Hd=d=8c=üb=Xb=>b=9P9ð9Ä9<9"9ÜÜ8HÑ8Ñ8”Ð8zÐ8¼Î8Î8ÄÍ8 Í8Í8 ù.@ù.ˆø.\ø.˜÷.~÷. ÷.àö.Xö.>ö.Ðð.pð.ð.Ðï.,ï.ï.|Ü.ðÛ.Û.dÛ.ÈÚ.’Ú.ìÙ.`Ù.Ù.ÔØ.8Ø.Ø.\×.ÐÖ.pÖ.DÖ.¨Õ.rÕ.ÌÔ.@Ô.àÓ.´Ó.Ó.âÒ.<Ò.°Ñ.PÑ.$Ñ.ˆÐ.RÐ.¬Ï. Ï.ÀÎ.”Î.øÍ.ÂÍ.Í.Ì.0Ì.Ì.hË.2Ë.ŒÊ.Ê. É.tÉ.ØÈ.¢È.ÐÇ.pÇ.Ç.ÐÆ.,Æ.Æ.H².è±.ˆ±.H±.¤°.а.š.¤™.D™.™.`˜.F˜.À.`..À€.€.€.|i.i.¼h.|h.Øg.¾g.8Q.ØP.xP.8P.”O.zO.ô8.”8.48.ô7.P7.67.Ü .| . ..Ø.¬.˜.Ô.¸.ž.,..ì.d.H...äì-,ì-ì-xë-^ë-Lä-ìã-4ã-ã-Dâ-*â-¸á-Œá-á-êà-°Ô-LÎ- Î-˜Í-~Í-Ì-`Ë-ØÊ-Pº-¹-ظ-˜¸-¸·-ž·-,·-ì¶-H¶-.¶-ȉ-h‰-°ˆ-„ˆ-À‡-¦‡-4‡-‡-€†-f†-´Q-TQ-œP-pP-¬O-’O- O-ôN-lN-RN-|G-ÄF-˜F-F-öE-¼C-îB-ü¬¸KÄÀþþýFüàú&úüøBøõZô0óvò„ïÊîÚí€íÆì&(´o\{otho Wo´o®nÔynlømDÉk¸"et4d¨cÔ…clÓbìb jbPõ]ä]¬j]PU]ì\[X·ZÜ_OÜËNœHø#F¬øEÈñE¨ÛE`E¤E˜ëCëC0èC@äA"@¸>=YGGDGlCG@q9Ho9Pl9¬k9À6È|6$|6„55ˆ3\303ü3$É2¿2¨‰2t:1¬91\1*p0*X/*,/*/*.*ì-*,*0,*,*Ð+*L+*ì**À**Œ**°)*„)*X)*œØ(p×(xÖ(˜Ô(ÀÏ(ÈÎ(èÌ(È(Ç(8Å((­(`(T(@(H(4(ì((tÂ'Â'¬Á'\Á'0Á'ØÀ'¬À'\À'0À'À'Ø¿'t¿'4¾'н'l½'½'ð¼'˜¼'l¼'¼'ð»'Ä»'˜»'4»'ì¹'ˆ¹'$¹'Ô¸'¨¸'P¸'$¸'Ô·'¨·'|·'P·'ì¶'8¶'Ôµ'pµ' µ'ô´'œ´'p´' ´'ô³'ȳ'œ³'8³'˜ '4 'П'€Ÿ'TŸ'üž'О'€ž'Tž'(ž'ü'˜'Xœ'ô›'›'@›'›'¼š'š'@š'š'è™'¼™'X™'˜'¬—'H—'ø–'Ì–'t–'H–'ø•'Ì•' •'t•'•'\”'ø“'”“'D“'“'À’'”’'D’'’'ì‘'À‘'\‘'$8'ø7'7' ,'t,' ,'#'Ü"'Œ"'`"'$ 'ø'¨'P'hÿ&ü÷&Ð÷&ö&lí&ÄS!´>!´,!€!0!Ô!P!´ !à _MìAÀ#ÐD€è×tÌÆôÈ`zœy8yèx¼xdx8xèw¼wwdwwPniØ^ÄO$O„NäMDM¤LàK|KKÈJœJDJJÈIœIpIDIàH,HÈGdGGèFFdFFèE¼EE,ExDD°C`C4CÜB°B`B4BBÜAxAÄ@`@ü?¬?€?(?ü>¬>€>T>(>Ä=°+T)ü&L&p# #,"´!ð„÷ ÷¼ölö@öèõ¼õlõ@õõèô„ôÐólóó¸òŒò4òò¸ñŒñ`ñ4ñÐðð¸ïTïïØî€îTîîØí¬í€ííhìì ëPë$ëÌê êPê$êøéÌéhé´èPèìçœçpççìæœæpæDææ´ååœä8äèã¼ãdã8ãèâ¼ââdââá°àÐßXßèÝHݨÜÜhÛÈÚÚ Ù<ÙìØÀØhØ<Øì×À×”×h××PÖìÕˆÕ8Õ Õ´ÔˆÔ8Ô ÔàÓ´ÓPÓœÒ8ÒÔÑ„ÑXÑÑÔЄÐXÐ,ÐМÏè΄ΠÎÐͤÍLÍ ÍÐ̤ÌxÌLÌèËØ¿t¿¿À¾”¾<¾¾À½”½h½<½°¼`¼4¼ä»”»D»»ìºÀºà¸|¸,¸¸°·`·4··¨¶|¶P¶ø´¨´H´´ð³ij|²²8ªЩh©©ì¨”¨h¨¨ܧ°§„§Ä‘`‘ü¬€(ü¬€T(ÄŽŽ¬HøŒÌŒtŒHŒø‹Ì‹ ‹t‹‹\Šø‰”‰D‰‰Àˆ”ˆDˆˆì‡À‡\‡¨†D†à……d… …à„„d„8„ „¨ƒô‚‚,‚ܰX,Ü€°€„€X€ô@Ü~x~(~ü}¤}x}(}ü|Ð|¤|@|Äh`hüg¬g€g(güf¬f€fTf(fÄee¬dHdøcÌctcHcøbÌb btbb\aø`”`D``À_”_D__ì^À^\^¨]D]à\\d\ \à[[d[8[ [¨ZôYY,YÜX°XXX,XÜW°W„WXWôV@VÜUxU(UüT¤TxT(TüSÐS¤S@SÄ?`?ü>¬>€>(>ü=¬=€=T=(=Ä<<¬;H;ø:Ì:t:H:ø9Ì9 9t99\8ø7”7D77À6”6D66ì5À5\5¨4D4à33d3 3à22d282 2¨1ô00,0Ü/°/X/,/Ü.°.„.X.ô-@-Ü,x,(,ü+¤+x+(+ü*Ð*¤*@*l¤T(ФT(üÐl¸Tð tð tH¸ <ìÀh<ìÀ”hP ì ˆ 8  ´ ˆ 8  à ´ P œ 8 Ô„XÔ„X,œè„ ФL ¼l@ð tHTØÿˆÿ(ÿüþÐþxýLý ýôüüxó@ñï,í„ììëÄçüåÐåxätãâ´ádááØà¬à€àðÞ8ÞÌÜlÜ@ÜèÚ¼ÚdÙ8Ùt×øÕHÔ˜ÒèÐÏÏ ÍHÌËàÉ0ÈØÆ¬Æ€ÆTƤĴˆÂ0Á´ÀˆÀ0¿ˆ¾\¾0¾ؼˆ¼Ì» »ô·8· ·´µø´Ì´t³€°,ª<©©l¢Ì›üŠЊT‰äˆ¸ˆ`‡4‡[ÔZ¨Z|ZPZ$ZøYÌY YtYHYœSO,(LG GìFœFDF¤3x3L3„00è/µÂØoJÕoÒoFÈonÇo–ÆoRÄoî¶o†¥obžoΜo:›o>—oº–o:”ošo.‡o²oj}oRwozvo^oo¾jo^coºbo2bo®aoÊ[o–Ro¢Oo.KoöFoú@oB2o~+oÖ'on#oö!o¶ ono¶oº o‚ùnªønÒ÷n ínúën‚ênnän²ãnÞánêànBÚn¦Ön‚Õn¾ÓnæÒnVÉn¶Ánº¿n¿n޾nV½nº¼n¦¹nÚ±nF«n¶¤n£n®ŸnÊ›n’n²ŽnŠnÞ„n„nn|n un2tnšonšnnBXnjWnFTnŽGnšFnÂEn~@nV5n¾.nb'nJ!nr n‚nºnnn.þmÂômêómþñm&ñm.ìmöåmÜm‚ÔmºÆm.¾mV½m¦¼mÞ·mj¨m’§mr mÆ›mîšmšm‚˜m—mj•mv“m^ˆmv‡mrƒm‚tmNsmZlm†fmú\mXmOm’Nm6Im5m 2mž(mfmŽmmmæm mºÿlâþlBül–ùl6òlîlÞëlÒçl"álÝlØlÎÕl‚ÏlªÎlFÉl2Çl:Âlž¶l©lʨlЧlžlZœl‚›lâšl&–lJ‘lžl„lvwlžvlÆulænlml¶hl‚flr^l‚]lª\lÒ[l Xl2WlæRlšMlšGlöÐj:Éjò¶j­j.¬jÖj&–jê”júj–tj"qjJnjjkjfdjŽcjÞ\j–WjÞMjúIj IjGj6Fj^Ej&$jZjŽjÊjRjN jv jÒjjÒjúÿi"ÿiJþiBýi2öiïi¶çiÞæiÆÞijÚi‚ÙiªØiÕiBÔiæÐi*ÊišÀiîºiV¸iJµiƱij®i’­i.¢iòiiBœij›i’ši™i –i‚‰i’ˆif€iîziyiÞqiîni‚iišhiÂgiêfibUi–EiV:i2iŽ,i'iB&ij%iz$i‚i’ibiîýhrùhšøh:öhþãhŠßhîÜhÚhæÔhnÓh–Òh¶ÐhÞÏhöÊh²Èhê½h¸h~¬h2¨h¦§hV¡h hîhhª™h‘hê‹hîˆh΂h^hj{h‚zhByhuhJmhnkhŽgh¶fhþRhžIhÆHhîGhGh Ah-hŠ+hâ)hr(h:$hr hrhzh¢hÎùgjògJìgrëgZåg‚ägNÛgbØgŠ×gÚÕg6Ñg^ÐgzÌgFÉgnÈg–ÇgâÄgÞºg ±g’¯g†®gž­g‚§gòžg¦grŽgÞŒg‚ŠgæggžzgÖyg~ngêlg2lggg6egöYgYgRgºLgGgVEgÒDgBgr;gâ9g 9g28g¦1g1gJ)gš(gÂ'gê&g&gúgÊgúgz÷f¢öfrîf¢ëfÊêfòáf&Ûf×fÆÓfFÎf"ÈfÂfFÁfZ¹f~´fz³fº¯fâ®fF®fÞ§f.£fV¢f¦f&šfê•f•f:”f¦’f.Žfƈf†f¢…fÊ„fŽfÊfšpfBdfUf*TfnOf6$f^fÂfêfŽfšfþejüe*øe òeîçeÊÝe*ÖeÕeŠÄeæ¾eö½e:µe¾­eæ¬eê¥eš£e2›e®–eîeVe}e:|eŽveue:tebsežke>eez`eb[eÖUeþTe²NeÚMeMeR@ej8e/eº(e–%e!ee&eNeJe¦ e¾ód¦ñdŠðd²ïd†êdþädÛd²ÙdÔdÓdRÍdÚËdËdŠÆd Ãd²«d©d¦¤dÎdJd”d²ŒdB„dBdŽzdÖldid*hdFcdBbdjad \d²UdBPd¶Kd.JdªEd rc¶pcîhc6fcºVc–Lc¾KcªHcúFcjBc’Acº@câ?cŽbJbšb&üa*ôaºëaÂãa^Îa¢Äaεa~®aÞ­až¦a¦aú¤a‚¢aª¡aÒ aúŸa^a¦˜aº–aâ•a •a²‘a®a.‹aVŠaî‚ava:cabbaROaR=a¶1aÊ)aâ!aòaaa a¢aaVaõ`–ó`zñ`òä`6ß`^Þ`ÎÙ`æÔ`ÊÉ`úÂ`¶±`«`F¦`ŽŸ`jœ`vš`j–`–`¦…`šz`Vn`fm`Êl`žg`Æf`Ú_`_`^U`ZT`öL`NI`*E`ÎC`®<`Ö/`–"`&`6`^`†`ª`î```þþ_&þ_nõ_.ô_ ó_¶ë_ë_æ_–Ú_Ñ_FÐ_zÇ_Ϊ_*©_¦_ò¤_œ_–™_¦_æ„_ªz_úx_‚u_šl_ög_Q_FH_Ê@_/_Þ,_*_þ_b__ _Úñ^Þí^Úã^2Ó^*¶^¯^–ª^š¤^™^>“^ Ž^>^¶z^–o^*m^Rl^zk^e^ c^Fa^K^FI^6<^¢4^Ê3^ò2^Î1^.^Þ^^.^F^V^n^zÿ]¶ë]Žà]®×]~Ì]¦Ë]þ°]ú¯]F¥]¶]f›]¶™]Þ˜]B”]j“]Êz]bs]^k]ú[]rQ]ŠD]†C]RA]2]æ ]6]^]Æ]nü\šó\fà\JÜ\NÐ\n¥\‚š\n™\Z•\>Ž\2ƒ\Îi\z\\RY\šS\JN\¶L\¦E\*>\â<\ú;\B7\â1\Š\ú\Ö\þ\f\Žý[êð[ð[Úí[zë[†ç[¾Ó[VÉ[:À[Z´[¾±[r­[þ«[ «[¶œ[‚›[ •[2”[žˆ[ºƒ[š€[Ö}[n{[Êw[òv[v[Bu[*n[zj[öi[2h[ªY[ÒX[ÖM["?[<[1[.0[V/[[ú["[æ[F[n[ [¾[æ[ÎñZÒáZºÜZâÛZZÄZ‚ÃZ&¿Z¦¹ZθZ®¶Zr®ZV¬ZŽ–ZÆ“Z†‡Z®†ZÒ~Z|Z†kZ®jZÖiZÚ7Z²2Zâ*Z®'Z²ZšZZ"ZvZ‚õYÑYÏYžÌYÆYªÄY‚¹YF«YT‘Y¦‹Yº…Yâ„YŽ}Y†TY6DY®AY>Y6Y’)Y®YzYÖYþYâYNYûXFúX&òXzðXöïXš¿X¾Xê½X¹X:­Xb¬XÊ“XÖ’Xþ‘X&‘X’X¾ZXöMXMXŽBXî;X4XæXúX"XžüW*éW¢äWÞÝW:ÛW®ÄW–¬W¾«WΪWJŸWž‘WâW:ŠWŠ„W¶{W¢qWnW6mW¾^Wæ]W]WšXW¦WWBFWðBWÞAW$WW‚W WÊWJþVÊõV"éVÆßVÃVvÂVÁVþµV6¤Vš}VJqVæfVcVF_Vn^V UVGV–0V.&VZ#V‚"VæVRV† VÞVV ìU2ëUbâUÆÏUîÎU>ÎUº¸UƃUî‚U†sU.kUVjU’cU:[UþIUºBUæ=UÖ8U^7Uª$URUv Už UÚáTbàTrÝT²ÌTÚËT½T"»T~¯TΧTZ¦T^£T^¡T: TÒ–T•Tl‘T@‘TÞŠTTÒ}TÆzT®vTZgTÊbTŠIT²HT–BTn?T–ÓRþ¥RŽRZhR¬bRj^Rf#R¶R"R>RJüQ¶ÓQÞÒQÚÌQºÂQ.¿QV¾QRµQz´Qö³Qö•QƒQîmQ:kQbjQ6QQ¦;QN7Qº6Qî5QZ5Qª4Q4Q‚3Qî2QZ2QÆ1QÖ.QB'QQ¾ëP6ËPò¨P¶PÞœP·PîmPÚöOâåOîŒO¢tOšdOÂcOêbObO:aOšSOÂROvGON%O¢O"O–ÂN&¥N"‚N.UN&2NÚNN*NþNÂúMn×MÎM.¤M¶oM iM0MªÕL¦ÑL^ºL†¹LF¦LvšLê“LîgLgL>fLêÄK>}Kr|KöAKbAKÎ@K.3KKzK¢K6ØJ¢ÓJ2ÐJBÍJæ¯JúoJgJaJjSJ¢?JJ^JFJ"JZJJJ‚J¦ Jú JNÊI®ïHr·GV³Gþ­G.ªG¥G6¡G¦žGžG>›G–šG˜Gz—Gê”G:”GB‡Gb†Gž…GÞ„Gþ€GN€GN|Gn{GžwGövGrlG®kG%Gj$Gª!GÊ G GFGžG¾G¢ GÞ GغF¶XF XF ýEâÜEȰEp¯EN¥E¬zETyEðLE˜KEP)EfEtûD–æD¶ÕDˆÏC\ÏCàÅC´ÅCæíB8B B„B¼èAèAFãAšÈAê¬Ax¬A «A;A>(AŒÀ?èœ?Ø›?l|>@|>|>i=di=ðc=Äc=h[=;=Î9=Ú-=)<<¶ <(<ÎŒ; Œ;6ˆ;n~;â};s;br;^q;~p;ºo; o;¦i;ºe;Òd;Êb;†a;’_;ê^;zR;JM;ÒG;š>;Î=;n:;Î6;–3;ö/;–:æŽ:ž‡:>m:²l:¶ý9öü9*ü9Úú9^ø9~Î9z³9›9Rš9N™9n˜9ª—9—9‚–9î•90F9ì8¾Ý8¢m8âl8l8Æj8Jh8ª87nõ6¾ô6*é6fè6¾ç6ç6zã6®Ý6r6Jq6’p6Úo6>o6’n6Æk6~Y6¶S636Îã5 Ù5:Â5ÆÀ5>½5®r5êl5i5òd5nR5öL5fI5–E5ž?5<5>85Þ35 /55êÑ4ÎÎ4žÄ4ο4žž4‚›4ªŒ4Vm4 \4¶C4®A4® 4F4*ý3ºê3ÆÜ3NØ3¦Ö3ÒÌ3f¶3j°3^˜3&‚3rã2Þâ2â2Âß2jÞ2ºÝ2Ø2&Ö2~Õ2¶Ð2ˆ2ˆ2þ22Æ22vy2‚w2Úv2Òo2®k2Þe2Žb2Z[2nW2¢Q2¦K26D2æ@2²92Æ52ú/2þ)2r"2Ö2V2v2¶ 2–2†Ù1òØ1îÒ1VÌ1¾È1¾Å1vÂ1²µ1²1¯1Z«1’Š1®†1bƒ1¶|1æp02j0Æ[0þW02W0.N0ÞJ0 F0ZE0þB0¦A0ö@0V;0b90º80ò30º0Âì/Ø/Ò/Z¿/^¥/6¢/nj/6V/NT/>G/VA/æ#"#Fé"¾Ó"&½":§"ú"N‚"òs"ºc"7"ê!"²!Âü ñ .É ÚÆ ʵ v¥ V£ ¾Y † R >ˆš‡NÆêæþä~ÚÊÖ†Õ:ªuRg~f;ú3rBb—bnbE P³–%# ÂÂø’ä’Ð’¼’rV:þ<Æ šfN ø•–iÆ^JMN•’š‰ކ¢‚F|¢BzÄnê´kN´kîTkRTk"“h†’h²½f½fDfrCfòËeVËe¢eeú­d^­dšÝcþÜc"”c†“cÒ‰c6‰cBÌb¦ËbºWbWbJ?b®>bÚÊa>Êa2Ça–ÆafuaÊtaª+a+aavaZç`¾æ`™`j˜`z|`Þ{`6-`š,`º__*ô^Žó^–»^úº^â°^F°^Š›^îš^6 ]šŸ]J]®~],]‚+]ÒÌ\6Ì\^³\²\\‚\îÖ[RÖ[[r[¦[ [¾ýZ"ýZ²ãZãZžUZUZ¢?Z?ZjXº=X:*Xž)XFÆWªÅW2°W–¯Wž`W`WjLWÎKWkVvjVŠVîV¾V"VbùUÆøUf¯UÊ®UÊýT.ýTúãT^ãT’:Tö9TÎÊS2ÊSN˜S²—SSrSÎaS2aSN S²Sv¬RÚ«RV¨Rº§R–|Rú{RÎDR2DR²RRnïQÒîQ†äQêãQºÎQÎQf¦QÊ¥QîŽQRŽQŠQ‚‰QîYQRYQŽSQòRQ6:Qš9QV0Qº/Q"ÆP†ÅP~Pâ€PF~Pª}PgPrfPr`PÖ_P.P’Pb PÆ PÒùO6ùOªðOðOÖáO:áO"ÁO†ÀOÒ¶O6¶Oš³Oþ²O"®O†­O›OfšO¶yOyOFMOªLO^…N¢„N>JN¢INR4N¶3NÆ(N*(N’NöNýM~üMZáM¾àM’ÑMöÐMBÄM¦ÃMÞÀMBÀMMvMêMNMú`M^`M"PM†OMâIMFIMÆFM*FM‚:Mæ9Mò1MV1M: Mž MjäLÎãLØLf×L&ÃLŠÂL"L†ŒL¦€L €L>6L¢5L3Lv2Lb.LÆ-L~"Lâ!LšLþLLjLL~L¦ L L L‚L*LŽLýK~üK6ùKšøKjìKÎëKîÞKRÞK>ÏK¢ÎKŽÇKòÆK2¾K–½K>K¢ŒKÖxK:xKŽsKòrK²VKVK†SKêRKJKK®JKnGKÒFK¢CKCK^?KÂ>K²8K8K†5Kê4KnKÒKöûJZûJ~âJâáJRßJ¶ÞJŽÚJòÙJÂÎJ&ÎJ~JâœJ>xJ¢wJŠnJîmJúQJ^QJNGJ²FJ^õIÂôIéIrèI†áIêàIzÔIÞÓI&GŠGNgG¢cGzFGrEGÖDGNGrG’G¾ÿFÿF^þFÂýFÆëE ëE¤êExêEìèE"çE|æE°åE„åEèãEâEŠáEàEZßEÊE`ÉEäÈE¸ÈE,ÇEbÅE¼ÄEðÃEÄÃE(ÂE^ÀEÊ¿EZ¾Eš½E»E˜ºElºE@¹E–·Eð¶Et¶EH¶EµE¢³EL°EЯE¤®Ex®E¬Eš©EÚ¨Eø„E|„EP„E$ƒEzEÔ€EX€E,€EE†}E0zE´yEˆxE\xEêuE~sE¾rEÂ\E6A˜5A5Að4Ad3Aš1Aô0A(0Aü/A`.A–,A,A’*AÒ)A¶?\µ?à´?´´?(³?N±?¨°?ܯ?°¯?®?­?h¬?ª?Ü©?°¨?ú¦?T¦?ô£?È£?œ¢?æ ? ?H?0›?›?™?®—?î–?Þ”?J”?Ú’?’? ð;dï;èî;¼î;0í;fë;Àê;ôé;Èé;,è;bæ;Îå;^ä;žã;6/;+;.*;Z);²(;ú';^';¶ì9>é9šÉ9–È9ÎÇ92Ç9ò¼9f¼9ŠŽ9Ê99vŒ9²p9ºn9²m9m9ª[82X8þT8úS82S8–R8šÁ6ÚÀ6Òœ6Λ62›626*~6Ž}6¶v6bj6Îg6fË5æÈ5Þ¸5Ò5*5ŽŒ5:)5 5öÂ4g2^Ø1ž×1æÖ1JÖ1&D1FC1rB1ÊA1A1†@1®20î10î0000r/0ª.0.02H/2C/–B/V4/Æ/:/¢.ü.€.T.È.þ.X.Œ.`.Äÿ-úý-fý-öû-6û-ª4-4-ˆ3-\3-Ð1-ö/-P/-„.-X.-¼,-¶+-+-€(-T(-('-r%-Ì$-\"-0"-!->-è--ü-¤-x-–-ð-˜-l-º--l-@-f-¶ - -& -~ -Ø -F-š-¨ÿ,²ü,ü,û,ôù,Èù,â÷,rö,²õ,¢ó,ó,žñ,Þð,_+J^+¶]+zS+ºR+ªQ+¢*Î*‚â)Òá) Ï)>Î):Í)J¾) ^)Z])îÓ'>Í'†²'¦¨'ª'ʆ''ªz'bt'rm'*g':`'òY'S'ºL'~B'"S!Z,!~'!ž!"!º! !ºí Z„Zvºe¢c¾\ÞYî+R+2ÎË ËúÉÆÀj¼¢»»r\ªPV<3j2†*Î)Â(Þ'Úú2úŠùÆø*øFç  nšû¦ïþá†ËêÊ‚¸º·ú±2Œ¦„€&{~= 8þûŠHм†»êº®µø´ ´Îc2cZ^¾]FLªKجE¼vEIEN­Aˆ¨A6ü°EàzE$ME¬¬A”-X€H àH ˜ H)¸H °H#XH °åGÔäGøãGìâG °áG tàG hßG \ÞG PÝG DÜG 8ÛG äÙG ØG <×G èÕG ÜÔG  ÓG LÒG øÐG ¤ÏG PÎG üÌG ËG „ÊG xÉG TÈG ÇG ôÅG ¸ÄG LÃG °ÁG¤ÀG °¿G,¾G8½G,¹G'µGœ¯G$Ì«G¤¦G"Ô¢GtŸG(œGÔ˜G¸•GÀ’GÜGG°‹G T}G\mGThG ŒdGˆ[G ÔYG WG VG UG ”SG ˆRG ìPGàOG DNGhMG¼LG?G(>GL=G@,É:Z¼½:tT³:i §:}Ș:”œ:S n: g:&¸a: 8^: [: €W: T: „H:pF:ŒD:ðB: TA: ¸?: >: €<: Ì:: 9: d7: °5: 4: x2: Ü0: (/: D-:¨+: Ä):ø': ,&: ¨$: Ü": @!: \:x:”:°:Ì:è:: :<:È:THù9 èí9Tê9¬ã9&LÞ9 ÌÚ9 ”×9 Ô9 ”Ð9 ,Í9 „Ê9ÄÁ9@À9¼¾9X¾9|½9(²9 ì›9ä‡9 `…9 ¤‚9˜9 ¼€9È9t~9 |9<{9 Xy9|x9Xw9 ,»8¹84·8˜µ8 ü³8 `²8 İ8 (¯8 t­8 À«8 ª8 X¨8 ¼¦8 ¥8 „£8 à 8,Ÿ8 H8¬›8 È™8ü—8 0–8 ¬”8 à’8 D‘8 `8|8˜‹8´‰8Ї8ì…8„8$‚8@€8´w8U4i8 Ü\8HY8èU8àB8B8A8@8Ø=8”;8˜98468"(58 48 38 28 ø08 ì/8 à.8 Ô-8 È,8 ¼+8 °*8 ¤)8 `8Ö¼8h8),8hÐ8Äô7†pó7 Ôñ7 8ð7 $î7øë7\ê7 Àè7 $ç7 ˆå7 ä7 °â7 äà7ðÍ7Å,Á7ƒp©7øL“7ç̃7Ÿ`|7JLz7Pl7ôf74 e7 ^7KèH7ÝìF7E7Œ;7`ü+7ä(7”%7Ü7[Ä7ô7\\ 7$D7,7t÷6{Tï66Ôê6#dä6˜Þ6´Ê6­`·6UȲ6 °6  ­6 èª6 0¨6 Pž6e ”6 ì’6 06$6 HŽ6T6ˆ‹6¤‰6؇6ô…6…6xb6€_6¸Y65ðS65X36S$ä5C`Ù5iœÎ5i°Ì5Æ5ÀÄ5 èÂ5 €¶5 Ì´5 ³5 d±5 °¯5 ü­5 H¬5 $ª5ô¦5@¥5t£5h¢5 Ì 5ÀŸ5 $ž5¸œ5 |›5 š5 Ô˜5 Ø–5T•5Ðs5û n5.€j5df5tS5µüM5,¼J5ìF5¤@50d=5”95ä45ô/5P*5-Ð#5)ð 5 è5#P5 p5 5 È5 5#àô48¨ò4€ï4Lì4è4!ŒÝ4b\Ò4l\Ï4,Å4_0Ã4 À4H¯4ªŸ4¢œ484‘ôŠ4 Ôˆ4´†4”„4t‚4„€4 ”~4 ¤|4 z4 ôx4ìs4-ôm47èk4 @j4 `\4Š Z4XW44S4!pO4LM4 äJ4¬H4F4 D4 èA4 0>4L!4(ð4Ôý3HDø3.@ñ3Aë37Ý3‹ˆØ3'àÖ3 °Ò3$DÍ30ô¶3ãÀ°36l™33â˜X3µdV3 °T3 üR3 HQ3 ”O3 àM3 ,L3 J3ðF3lE3`D3 ÄB3¸A3 @3°>3 t=3 <3 Ì:3 093¬73|3 3Ä3ø3ü33ô3  3 L 3 ø 3 ¤ 3 ˜ 3 Œ3 €3 „3x3 l3 `3 Ä3(ÿ2¼ý2 Pü2 üú2 ¨ù2 Tø2 ÷2 4õ2@ô2Tñ2˜î2œì2àé2tè2 €ç2„å2ü½2 ð¼2 ü»2»2¤º2ȹ2ì¸2à·2 ¤¶2 µ2´2 À²2 l±2 °2 Ä®2  ­2 |¬2 X«2 4ª2 (©2 ¨2 Ȧ2 D¥28¤2 ,£2 Ø¡2 ´ 2 Ÿ2 <ž2 èœ2 Ü›2 К2 Ä™2 ¸˜2 d—2 (–2 ä“2è‘2Ô2H2”‹2XŠ2 ƒ2"˜l2$h2"äc2]270Y2dS2(hM2*ŒE2>H 2429T2” 21¤23¤ý1Gö1ô1pó1Äò1¸ñ1 ¬ð1  ï1 ”î1 Pé16æ1°á1*äß1ÄÍ14Ê1ÄÆ1|Ã1·1vp³1 °1`¬1Œ1J ˆ1„„1Ø}18H1-E1/1\.1P-1 D,1 8+1 ,*1 è$16Œ"1 1´1˜1L1€1/x 1F¤1à1$ø0yÌö0 õ0 Tô0 èò0 |ñ0 pð0Ôî0 8í0 ôç04¸æ0 |å0 Û0ilÙ0¸×0dÔ0Ñ0¼Ï0 hÎ0 „Ì0 Ê0ÔÈ0ÈÇ04Ä0"¤0Q¨ž06ü—0C ’05|‘0r0BTk08Ì\0ŠY04O0QäK0 (0à&0 „$0 x"0 À0L0!,0k¬ 0$4í/9 ë/ é/ ,ç/ Üä/Œâ/¬à/ \Þ/dØ/6€Ò/4XÐ/ hÎ/ °¿/’,½/¨º/T¶/"²/"ܯ/ Ô­/ «/$¨/´¥/p¢/(ž/$\),*Ô#,+,.è,/ð ,y´ý+zû+ Xø+ðõ+ ,ó+¤í+/Àç+28â+/TÜ+2Õ+?øÌ+EôÈ+àÅ+”Á+!@¼+"<¸+س+L°+8­+ì¨+!|¦+,¤+ àŸ+ €›+L–+%’+Ä+Àˆ+#”ƒ+$Ð+\|+Dw+€v+Ôu+Èt+ ür+ðq+ $p+o+ Äm+ ˆl+ dk+ (j+ |i+ h+Äg+øW+ŒV+ ÈU+ÔH+øG+G+@F+dE+ˆD+¬C+ÐB+À%* „$* *&l*H*$*X*€*t*h*Ä *ø *ä *è*”* pþ);ôú)!`÷)"|ï)Ppî)dí)@ì)ë)ê)´ç)Dæ)P×)°½)hº)ж)8³) ¯)¬)p¨)4¥)Ø¡)€Ÿ) () ä™)ì•)Ä‘)´Ž) ,‹)¨ˆ) Ì…) $ƒ) ”€) ì}) \{) y) €r)\q) hp)´n)0m) Äk) Èi)\h) `f)ôd) ˆc) b) €`) ü^) ì8)[¼2)2¬.)Œ*)œ")1)-¼)4)¤ ):$)-Ä)<)¬ò(n¨è(\å(Xá(¹()¼ª( ¡(d˜(à|(x( t(Ðo(`k(àf(Ìc(¸`(8\($Y(V(°R(œO(ˆL((I(F(C( ?(Œ<(x9(6(3(ð/(Ø,( X(#ð( ¼ ( („(h(Lÿ'\ü'Ìø' Øô',ñ' €í' Œé'˜å'ìá' @Þ' ÀÚ' d×'ÈÕ'0Ñ'dÏ'TË'Æ' ÜÄ' ¸Ã' à¬'\«' $¤' £' Ü¡' ‹'€‰' `„'lƒ'œ~'x}' @x'w' äq'p' k'Ìi' ¬d'Xc' Ð]'”\' tW' V' ˜P'\O' G'¬E' ='&¬8'$1')(-'Ä''#'Xü&ìø&Àï&@4â&u¸¼&[x¶&2X²&Ø­&H§&1¸¡&-Hž&`š&0“&: &-0Š&H†&0z&nüo&\8l&üg&X`&) ]&4Y&hU& M&0G&/€A&,:&Bt0&Wt'&QÜ"&"¤&> &Ì &Xp&R4ÿ%& ÷%?€ò%&,ç%jôâ%!ÈÝ%+ŒÙ%!Ö%pÒ%pÊ%Gº%œ”¯%a€ª%*¨¦%\ % @š%8X‘%Tü‰%A%PLy%D@n%hÔX%Öl)%ç%¿L %d%gõ$g¸é$hÔ×$­ÔÄ$¸¸¿$'@º$*<­$yì¡$e $« €$—t^$R(R$u0/$ap"$wà$š¬$ ¤ö#pøé#t¸Þ#jdÓ#lÄ»#ð£#ûŸ#Ô›#ˆŒ#–à|#™Üp#sLd#x´\#EØT#G@J#eL?#h #LHê"&ìÔ"Ö\¾"ᄨ"Ùè"ë8ƒ"…ät"ŒÀd"Ÿ€S"ªHF"~ 8"‡ð""ÓX"cðø!@üð!Dhã!Õ!…dÌ!J Ã!P¹!X`®!^ü !|ô’!‚ü„!‡Àv!‹øh!‡¼Z!‹ÌW!dT! Ì9! ,8! ¤6!5!¤3!t2!„0! ü,!Ô'!(È!S!1˜!<ü !|!Œý dÐñ kôí ì øé œç 8å ã €à Þ àÛ ÀÙ  × \Õ (Ó PÑ ¸Î °É +0Ç h¶ ¥ü³ ø¥ ‰£ ˆ¡ Ÿ lœ ,˜ ´“ !ˆ‘ | ¤Š € ^„v ]”s ¼j OŒ` _€\ $Z ¨W DL lH E ô@ ¬6 ` 2 Ì/ ä, ô) ¸& à# Ô '$    )Œ $ /< ù’tõìñÐVÌÈðÃÄ¿(›q|– Œ8”ˆ9 † X‚#p€ è|$o„èk¼cGÀ_tP”8MBf> 3gÐ/ì'Dð#<ƒt`pä÷w¨ô¬ìE°è„ÚˆHפÌa€Æ0ÄÁð½·:L³° ¤oôœ€š\™ Ø— Ü•è”Ü“è’ô‘  ÔŽàŒ„‰hLy2ˆx4w ðp Ìopmìk Ài](Z(X VT TR  P ìN 8M „K ÐI @FE pDdC €At@ >l= 0< ; Ð9 |8 h65 )”'Ð & |ÈŒ Y„ùM|öhóï!<ÞE¬ÎFÜÌ DÆHÄ|ÂܪÜ¡X ¼ž0œš™4˜à– Œ• ” ¬‘˜Œ4L†A¨ƒ|p€ d ø} ü{Àz $o"Ôi#_ X V ”U (T ¼9 9T8d5¸4h, !  $H< ¨)    ˜((þü<¡èŸ Ÿ0ž„Øœ,œ€›|˜Twv $uHt„sÀrrhqToTNM $LHKœJðI,IhHTFT%$ $#H"„!À ü8ÔD$ !Ô*¸€à"° d Ä  8 l`THÿDø xölõ`ôTó˜ë éèôæèå4Û 0ØôÖ ÕÌÒ@ÐÆ ÄÁ࿤¾h½„´è²xŒ ”‡*h€&˜{(øxPt(¸n2Tj$,fD_ ]ZtQ€PtO ¨MœL ÐJ¬I pH LG F E@9 è6 p3h/è+x(ˆ% " (¸È Ð ( x ˆ   t @  ÿ|ý$îí Üë xåA„á'ðÚCŒÑahÍ)tÉ'0ÇôÅ ¸Ä ”à ˆÂ\XhWäU `T ¬RøPPøN(Ý \Û„ØüÔ,Óø¿Ƚl“ä ‡¤ƒH€p}ˆj (hsyncevolution-1.5/src/synthesis/src/Targets/sysytool/sysytool_x86.mch0000644000373300037200000045046412424517753027753 0ustar00nightlyallusers00000000000000Îúï¾#Ë$ðSïÆÂ6#µDð8Éf0Pd|”¬Äà0<HTh|œ¼ÐÜèô$<Pl|˜¨Ä0HXl ¼Ôäø$DXl€œ°ÈØô(<Pp„˜¼ø,Hh|¨ÀØô(@Th|˜°Ðàô 4DTd€œ¼Ôè$ @ T l € ¨ ¼ Ð ø  , P p ˆ œ ¸ Ì ä ü $ D \ p ˆ   ¸ Ü ü  0 P x ¤ À Ô ì ( H \ t ¨ À Ð ü ,Llˆ¤¸Ð(Pl€ ´Ðäô(<Lh|¤ÀØì4\tŒ¨ÄÜð(8L`€¤´ÈÜø 4D`„ °ÈÜô,@P`|”¬ÄØì 8Pˆœ°ÀÔäø(Pt¤ÄØð  4H€ Àì <Tpˆ¨Àô$8Tlˆœ´ÈüPxˆœ°ÀÔð $@Xl€œ°ÀÔìü,LdtˆœÀÜìü(@PdtˆœÐ (@Xlˆ¤Èàô0L\x ¸Ðèü( D d | Œ ¤ Ä ì !8!L!d!x!˜!¬!Ô!ì!"","D"X"h"€"˜"¬"À"Ü"ð"# #4#P#h#€#”#¨#¼#à#ø#$$$D$d$€$¤$¸$à$%%(%<%X%t%œ%Ð%è%ü%&$&@&d&x&&´&Ä&Ø&ü& 'D'\'t'Œ' 'À'Ô'ì'((4(H(\(”(´(È(à()()\)|))°)È)Ø)ü)*8**¨*¼*Ô*+$+<+T+p+€+¤+¼+Ð+à+ü+,,,T,p,ˆ,¨,¼,Ô,è,- -4-H-`-t-¨-¸-Ô-..4.L.\.|..¤.à./0/L/„/˜/À/Ô/ì/040D0p0„0˜0°0Ä0ì011X1h1ˆ1¼1Ô1è1ü12<2P2h2€2œ2¬2À2Ð2ø2343d3t3”3¬3¼3Ô3ð3 4@4d4|4”4´4È4Ø4ô45 585H5p5œ5Ä5Ü566,6@6\6p6„6¤6¸6Ô6ø6 7L7\7p77¬7À7Ô7ì78 848D8X8x88´8È8Ü8ô8949H9d9x9Œ9¤9Ä9Ø9ø9::0:D:d:x:ˆ:œ:´:Ð:ð:; ;T;t;ˆ;œ;¬;¼;Ð;à;ô;< <4<H<`<ˆ< <¸<Ô<ì<=@=T=h==¬=À=Ð=ä= >(><>L>d>x>Œ>¤>¸>Ì>è>?,?D?`?p?€?¬?è?@ @@@X@h@x@ˆ@°@À@Ü@ð@AA0ALA`AŒA¸AÔAèA$B`BxB˜B¨B¼BØBðBCC0CHC\CtCˆCœC°CÄCôC D D4DTDtDD¬DÀDØDôDEDEXElEE°EÄEÜEøEF,FDFdF|F´FÄFàFøF(G8GTGlG€G˜G¬GÀGÐGHH,HTHpH”H´HÄHÔHôHI$IXI|I¤I¼IÔIìIJJDJ`J|JœJ°JÌJìJ K$K`?„@$A4AB„BCD¸EäEFXG0H´HTIpIJÌJ\KüKMÐMìMN¨NdO¨QdRSSlSí mon_cmpt_ptré spawnvpeé MAX_SYNCML_VERSIONë vsnprintfènegative_signè _MSL_POSIXëstartSyncFuncè SML_PE_ALERTé)AUTH_BUFFER_SIZEé*SML_PE_ATOMIC_STARTê.tm_minë8smlResultsCmdFuncèAaèBbèCcèFwcsrevëGtm_mdayê JstrncolléMmèOmaxWorkspaceAvailMeméUisspaceêXxèYyèZzè$[SML_ERR_A_UTI_UNKNOWN_PROTO_ELEMENTê ]smlStatusCmdék_wcssetêpSmlDevInfNOfM_fêqltoaé|smlLockReadBufferè~lldivèOBJECT_FILTERINGáäå€SYSYNC_VERSION_MAJORé€__unavailable_fileë ˆCharsWrittené¥wcsicmpê ¦__ppc_eabië¶ldivéÂstderrëÄXptCommunicationInfo_tëÇitowéÌSmlFilterPtr_të ÐstrncasecmpêÑitoaé ÓRAND_MAXé á__msl_graphê âmbstowcséåsmlStartMessageFuncêìtolowerêí_execlëîtm_monëñ_MSL_WCHAR_MAXë÷_execvë û_MSL_CCTYPEêü_MWMTèþSmlCallbacks_të_MSL_FILE_STRUC_Hè RELEASE_YEARé _putenvêasctimeê_MSL_CCTYPE_WIN32_Hê _fullpathè%chsizeë3SML_ERR_NOT_ENOUGH_SPACEáàå8SYSYNC_VERSION_MAJOR_TXTé8smlLibStrncpyè9smlEndMessageè=sml_source_list_sèFsmlSetUserDataëI_STDCALL_SUPPORTEDëQwcsnsetê UsmlPutCmdè [USE_ODBCMAPSéfthread_handleè k_P_NOWAIT0ëvint_frac_digitsêySYSYNC_VERSION_MINOR_TXTéitemé  _splitpathë ¡__io_EOFé¦msgRefë ¨cbLengthé«_MSL_NEEDS_EXTRASè ¸__pos_procë¿smlTransmitChunkFuncéÄcmdêÅlocNameêÇdocNameê ÈDate_Formatsé ÊstrtoulléÖatoféÙatoiéÜatoléç_MSL_WCHAR_MINëösmlPcdata2Stringéú_MSL_IMP_EXP_RUNTIMEé ûfilelengthë ü_doserrno å_MSL_IMP_EXP_SIOUXë__msl_ctype_mapê XptProtocolInfoê__MSL__ê_MSL_STDDEF_Hè _getdriveèSML_ERR_XLT_INVAL_PUB_IDENTê !__dest_osè *wCharStré+SML_ERR_A_XPT_NO_TRANSPORTSê1SML_ERR_XLT_XML_UKN_TAGê3srcê5SML_ERR_A_XPT_SERVER_AUTHè;EXPIRY_DATE_STRINGë I__get_charëRstruprëVsmlGetEncodingë ^shortNameè e__msl_punctê fSML_PE_MAPëtSML_ERR_XLT_INVAL_INPUT_DATAéwEXPIRES_AFTER_DATEë €SmlCopyPtr_té…_strlwrê ‰__disk_fileê Š__file_kindsé‘smlLibStrncmpè—EMAIL_ATTACHMENT_SUPPORTé˜smlUnlockWriteBufferéŸstrpbrkê©smlTerminateInstanceé¬ARRAYDBTABLES_SUPPORTd åÇtm_ydayêÇ_Alignë É_MSL_EOF_HëÏ_strdupêæ_MSL_CALLINGCONVé ðWCHAR_MAXè õ__put_charëlldiv_tâ åtm_wdayêva_argë SmlMapItemListPtr_tê FOPEN_MAXè p_sign_posnêsml_sync_hdr_sësmlLibStrncatè SYSYNC_TOOLêwtoiáä å_getuidê filtertypeë '__StringReadé .__wFileWriteé=smlUnlockReadBufferê>_DisposeThreadDataëRSML_PE_GENERICëYSmlSourceList_tê {gmtime_tmè |SmlExecPtr_táøåsml_unknown_proto_element_sêtransmitChunkFuncè„memmoveêˆSML_ERR_ALREADY_INITIALIZEDê‰__TestForErrorë Ž_fastcallèSmlPcdataListPtr_të ’_P_NOWAITè“WAIT_GRANDCHILDê ¥smlGetCmdè ¬execlå³_MSL_MATH_CDECLê ³XPT_SECTIONê ´_strspnpé¶execvèÀ_MSL_THREADSAFEê Ê_DEFINE_Hè Öinternalé æWCHAR_MINèçSmlDevInfUTC_fëî_STATIC_FILESè ó__io_procáå ú_MSL_C9X_èúwNullCharDetectedè ýwrite_procëSYSYNC_MAIN_VERSION_STRINGë _strnicollësml_results_sèsmlGetFreeBufferéxptSelectProtocolè SmlChalPtr_té !isxdigité,SYSER_VARIANT_CODEë.__SML_WBXML__è/mblenèEwcssetëH__int8ëISML_PE_SEQUENCE_ENDêQapë U__n64_osé]NULLéh_wcsrevê jsetlocaleèsSML_PCDATA_STRINGè z_ttynameá å open_modeè Day_Namesè‚putséSmlProcessMode_tátå’statusë’putcé•smlSetCallbacksê ultoaè ©_wcsnicollë«strcspnê ·buffer_lenëÀSmlDeletePtr_tëÁresultsCmdFuncë Æio_stateé×refêÜremêäsml_pcdata_list_sèå__no_io_errorè èSmlMapItem_té ê__wInStrCtrlé÷strlenë _chsizeê strncpyê_GetThreadLocalDataêsmlReplaceCmdè %localeconvãdå 'SEEK_SETáxå'putenvë'feofé7execvpeêC_lseekëEidë MLC_CTYPEéQ_dupé T_wcsspnpé Ufrac_digitsêbSmlItemList_t<ådgeteuidê dsmlAddCmdèq_DisposeThreadDataIndexâårSCRIPT_SUPPORTë rMGR_FUNCés__file_orientationë‡strrchrê ŒCONSOLEINFOêxptBeginExchangeé £_makepathè¥strtodëªstrtokã\å­strtolë­SmlUnknownProtoElement_té½XPT_REQUEST_SENDERëÂSML_ERR_XLT_ENC_UNKâØå ÌMonthNamesë ÌSmlCopy_tåÍSML_PCDATA_CDATAé ÍSmlCredPtr_téÔnext_file_structéÕSYSYNC_ENGINEèéwlower_map_ptrë í__strerrorëðsml_source_ref_list_sè ýsml_item_sãäåSYSYNC_BUILDNUMBER_TXTëlseekè _strdateé_MSL_VA_LIST_Hë,va_copyê.SmlSourcePtr_të 2__win32_osë4_MSL_LOCALE_NONEé5isdigitê:p_cs_precedesèEstricmpâèåGHTTP_KEEP_CONNECTIONé GWSM_FUNCé Ylocaltime_tmá(å `_getpgrpé`SML_ERR_XLT_INVAL_SYNCML_DOCá`åbgetcé bLC_MONETARYêereadé g_strnicmpèjisblankêrgetsé|_struprê~_MSL_OS_ENUM_Hë„__console_fileë _MSL_FALSEë’SmlReplacePtr_têlower_map_ptrè ¢_MSL_TLSé¥strncmpê¦failingFunctionê«strlwrë¹authé »L_tmpnaméÁdecimal_pointèÃdup2éÍtm_yearêÎSmlAtomicPtr_tëÒ@enum$101sysytool_pchè ÔSML_API_DEFêÕnexté à__sh_bareèástrdupëåSML_ERR_XLT_INVAL_XML_DOCèêSML_NEXT_COMMANDéìtmëõdestêusernameé SmlMovePtr_té __wFileReadê tellé _wcsicollè metaé!strncatê)MSGDUMPâ´å ,__read_writeé,int_p_sign_posnâäå 1SEEK_CURé1SmlRecordOrFieldFilterPtr_tê2_WAIT_GRANDCHILDé 3mapItemListê 4__msl_cntrlê5getuidë8_MSL_WCHAR_T_HëLsml_callbacks_sêOsml_source_or_target_së b__open_modesé dSML_WBXMLèecuseridêkislowerê lSmlCred_tèq_MSL_ANSI_PARMS_HètNOWSMè{smlStartSyncFuncé}SML_ERR_XLT_INVALID_CODEPAGEé __msl_alnumê _MSL_STDIO_Hé°smlLibMemmoveè±strnsetâ å ´_getegidé ´__io_resultsé½char_coll_seq_ptrè¾ARRAYFIELD_SUPPORTë Ã__mips_bareêÅquotéÈSML_PE_SEARCHèÒ@enum$100sysytool_pchØ å ×__neutralè×getenvëÙXPTAPIã$!åÜ__SML_WBXML_TEXTTOKENS__éÜLong_tëá_ultoaë í_MSL_CTIMEë ï_execlpeéó_MSL_UNISTD_WIN32_Hê÷_ultowëüsml_source_or_target_parent_sè þSmlSource_tê SmlGet_té _MSL_CSTDLIBé spawnlpeé,smlGetCmdFuncè.stdoutë1absê2__wStringReadè;n_cs_precedesè ?extras.hé@bufferëO_MSL_C_VERSION_HéW_cwaitë dsml_status_séeupper_map_ptrè hsml_map_sè€__set_idle_procê —__m56300_osê ¦SmlFilter_tê©ungetcë·io_modeê¹tmpfileê»SML_ERR_XLT_INVAL_PCDATAé ¾_vsnprintfë ÀsmlStartSyncé Â__emb_68kèÄ_MSL_MATH_ERRHANDLINGèÅ_LOCALE_CMPT_COUNTëÈmon_thousands_sepèÌ__LINK_TOOLKIT_STATIC__êÏtmpnamëÒSML_ERR_XLT_INVAL_PCDATA_TYPEèÕUSE_SML_EVALUATIONë×stateè ÙWAIT_CHILDëâShort_têîMIMEDIR_SUPPORTêöSML_EXT_UNDEFINEDèûSML_ERR_XLT_MISSING_END_TAGâ¼%å _MSL_STDIO_POSIX_Hë  _snprintfè  __rereadingê  splitpathè  XLT_FUNCé % TARGETIDé\ currency_symbolê` SmlDevInfHierarchical_fê e ADD_SENDé k mon_groupingéo XptCommunicationInfoPtr_tèt scanfèv strspnpê| SYSER_PRODUCT_CODE_ALT1ê~ SYSER_PRODUCT_CODE_ALT3ê SYSER_PRODUCT_CODE_ALT2êœ smlAddCmdFuncè ž _MSL_CSTDDEFé Ÿ __GetAwCharê¨ CharStrê­ SML_ERR_WRONG_PARAMê Á encode_wcè Ç __lower_mapêÈ __freadê Ð SmlVersion_téÔ SYSYNC_SUBVERSIONè Ù P_NOWAIT0èß __readã|(åæ SmlInstanceOptions_té æ SmlNoResp_fêé EMAIL_FORMAT_SUPPORTéê execlpëö sourceRefListø(å ÷ __m56800_osê÷ SML_DO_NOTHINGëÿ execleã@)å  _strcasecmpê replaceCmdFuncë CUST_SYNC_FIRMWAREë  wNextCharè smlLockWriteBufferë & _searchenvë8 _dup2è> SML_ERR_XLT_WBXML_UKN_TOKèH _MSL_INTEGRAL_MATHëO __ReadProcActionsL*å b _wcsnicmpl*åb sml_map_item_list_sêb SML_ERR_INVALID_HANDLEëe time_cmpt_ptrè g _wcsicmpé i SmlResults_táð*å} _loc_coll_cmptë} smlStartMessageExtë ‚ sessionIDè † __close_procé‡ _MSL_SIZE_T_Hè‰ file_orientationéž _readè£ _InitializeMainThreadDataè ¨ __mac_os_xëª execvpë¯ FALSEè³ SmlNoResults_fë½ SUPERDATASTORESê¿ execveëË SML_ERR_A_XPT_INVALID_PARMëä SML_PE_RESULTSë è SML_PE_GETëï __ungetc_buffer_sizeé ñ _MAX_PATHè ô MemHandle_tê ÷ positionéú _MSL_LITTLE_ENDIANëü SmlAlertPtr_tè  Boolean_tè _getgidê __InStrCtrlê  _stricoll-å wupper_map_ptrë SmlMoreData_fè cwaitè SmlItemListPtr_táè-å& ldiv_të& SmlSequence_tè 1 mapCmdFuncë4 XML2GO_SUPPORTë ? SML_PE_EXECêV srandèY SML_ERR_A_XPT_IN_USEéZ fflushë \ XPTDEF_HáÄ.å` SYSER_REGISTRATIONë` RELEASETOOLKITëd SML_FIRST_DATA_ITEMâ/å j EXPIRY_DAYë j sml_filter_sék defaultPrintFuncá`/åp versionêp XPT_CLIENT_ADDRESS_SIZEê Flag_tëƒ _InitializeThreadDataIndexë “ _wcsnseté ¨ SmlStatus_tê¯ LC_ALLã0å ² SmlReplace_té² XPT_DOC_TYPE_SIZEè È WIN32\0å Í __dolphin_osé Í strncmpiéÓ locURIë Ø decode_mbè Þ sml_sync_së ä _P_DETACHèå __MSL_CALLINGCONV_WIN32_H_ëí SMLTK_PRECOMP_Hê ï ctime<1åô is_dynamically_allocatedéô xptGetProtocolëö _tellèû _MSL_DO_NOT_INLINEã¤1æ FILLER_SUPPORTì __mcore_bareé  FILENAME_MAXé  wcstombsé recordë SYNCML_TAF_SUPPORTë __USE_ALLOCFUNCS__ë  wcsnicollè coll_cmpt_ptrè# _MSL_EXTRAS_Hè& _MSL_FILENAME_MAXè* _itoaè 2 ptrdiff_tè < _itowà2å@ fputsè @ smlLibStrdupéM thread_localeèN _MSL_ANSI_PREFIX_WIN32_HáP3åO _get_osfhandleë O wcsncolléP fputcè\ SmlTargetParentPtr_té] smlMapCmdFuncèg fieldè h SML_PE_ERRORéj SmlBufPtrPos_tën protocolErrorCode(4åu SML_PE_SYNC_STARTè u SmlFinal_fë~ _MSL_THREADLOCALDATA_Hë  sml_exec_së € __wince_osëƒ SML_PE_SEQUENCE_STARTè ‡ _stricmpéŠ _ltoaèŒ _WCHAR_T_DEFINEDéŽ _ftellë ˜ __idle_procê › __io_errorë œ _ltow\5å¢ getpgrpê ¢ strnicollè!¨ SML_ERR_XLT_NO_MATCHING_CODEPAGEé© SML_ERR_A_XPT_ACCESS_DENIEDê¿ sml_generic_sèà STOP_PROGRAM_BEFORE_EXITé Ë _MSL_TRUEè Î __FileWriteêÒ strdateê× SmlTargetPtr_të ì va_starté  getloginé SmlMetInfFieldLevel_fè fscanfë _current_localeê sml_instance_options_së- execlpeâ(7å. TOOLKITLOCK_FREEá87å. modeé. cbSizeë0 F_OKé1 vfscanfê3 smlHandleErrorFuncë9 XptProtocolId_têI _fseekëN removeë^ RELEASE_MONTHèe xptReceiveDataë q SmlAtomic_tê s _strnsetéu lconvèv getegidêx SML_FIRST_FREE_ITEMê › __msl_xdigité¡ SML_ERR_A_XPT_INVALID_IDé § _cuseridé¯ isprintê ± protocolIdë´ SML_ERR_A_XPT_MEMORYéº xptDeselectProtocolêÄ _execlpêÉ CUST_SYNC_MODELê Ð targetRefèÑ _execleê è SML_EXT_LASTéð SYSYNC_TARGET_OPTIONSè ö TimeZoneéuser_se_translatorëdiv_tèfseekè __msl_upperê __memrchrè'SML_ERR_A_MGR_ERRORê6__filesê=__minè Jread_procè VsmlLibStrlené]_loc_ctype_cmptê`SmlGenericCmdPtr_tëgtm_hourêo_MSL_LOCALE_API_H8;å p_strncasecmpépsmlStartMessageêCUST_SYNC_HARDWAREë„_execvpê‘_execveê fgetcè§freadè«lengthë°fgetsè±_tznameê²isalphaê µSmlAlert_të·fpos_të¸ttynameê ½sml_atomic_sé¾SML_ERR_XLT_TOKENIZER_ERRORê ÆsmlLibFreeë Énext_localeêËSmlMapItemPtr_tê Þchar_bufferê ßSmlItemPtr_tá(=åã__MSL_LONGLONG_SUPPORT__é ã_MSL_DIV_T_Hé äMemPtr_téæmktimeãx=åðX_OKé ðaddCmdFuncëûsmlReplaceCmdFuncèÿcontentêW_OKévscanfë"SML_ERR_XLT_INVAL_PROTO_ELEMé&SML_PE_CMD_GROUPé'getgidë+__maxè @getCmdFuncë UGET_SENDé yLIB_FUNCé Š_SML_ERR_Hë‘vsscanfê–wcsspnpêSmlCallbacksPtr_tè¢__UngetAwChar?å ¦_geteuidé¦targetRefListè ¨__lower_mapCé©maxOutgoingSizeê¯msgIDè°R_OKá˜?å µ_MSL_NULL_HêµsscanfãÐ?å¶LINK_TRANSPORT_STATICALLYè ¶free_bufferê»RESULT_RECEIVEë¾cctype.win32.hëÄ_COMPONENT_NAME_LENê ÆsourceParentéÏftellèÐ?3ëÑ?2ëàSYSER_NEEDED_PRODUCT_FLAGSëâ_wtoièèXptServiceID_tëêwchar_tê íbuffer_modeê õ_execvpeé þSmlChal_tè IsDaylightSavingé CmptNameápAåexecé_MSL_STDIO_API_Há Aå tm_isdsté sml_chal_së'SmlMapItemList_té(SML_APIâüAå 1SmlAdd_té!1SML_ERR_XLT_INCOMP_WBXML_VERSDBå2_loc_num_cmpt_valsë2SML_FIRST_COMMANDè 5_MAX_FNAMEë7XPT_DEFAULT_MIME_TYPEè@chalé Hwcsicollé]__wide_orientedê ___upper_mapCé fitemListég__StringWriteèh_closeë kerrorMessageéocallocë usmlLibStrstré}memicmpê€va_endë ˆVoidPtr_tè ‰SmlMap_táØCåŠreallocêŠp_sep_by_spaceë–__closed_fileè©Wint_të¯getcharê±smlSetMaxOutgoingSizeè³__USE_EXTENSIONS__ë¶n_sep_by_spaceë·SmlGenericCmd_tê¸time_të ºCLIENT_NAMEê¾ungetwc_bufferëÁsystemã$EåÃDATAOBJ_SUPPORTêÃSmlCallbacksCPtr_tëÌ_filenoêÙsourceëÝSML_ERR_XLT_MISSING_CONTéâ_loc_mon_cmpt_valsëèispunctêëctype_map_ptrèíSmlOptionsPtr_tê îsmlLibStrcpyéð__X86_PREFIX_Hë ôtargetParentéösmlSetOutgoingBeginê÷_MSL_STDARG_H˜Fåø_MSL_NO_FLOAT_HEXèø_compare_functionèXPT_Hè__handle_reopenê xptCleanUpã Gå!handleë!SmlResultsPtr_tê'clockè0XptServiceIDPtr_tè 3EXIT_FAILUREé :strnicmpé DalertCmdFuncéGfsetposê Pfile_kindè[_X86_è&fSYNCFEST_ALLOW_ALERT_WITHOUT_ITEMLISTè gidle_procè kclose_procëzSmlUnknownProtoElementPtr_tê€_MSL_LOCALE_CUTF8èxptInternalTransportInfoé„SYSYNC_VERSION_MINORéˆexité‰_asméxptGetDocumentInfoëŽfilterëž__ANSI_OVERLOAD__DIåŸSYSYNC_VERSION_UINT32èŸfildesëªCONFIGURABLE_TYPE_SUPPORTIå¯mallocë¯mbtowcë µMB_CUR_MAXë ¸_MSL_BUFSIZê¿_MSL_STRING_Hè ÀsmlLibPrintêÕ_fdopenê"ÜSML_ERR_MGR_INVALID_INSTANCE_INFOèí__char_orientedêûsml_map_item_sëýSYSYNC_SUBVERSION_TXTèþsprintfê__wStringWriteë_MSL_CLOCK_T_DEFINEDé_MSL_USE_DEFAULT_LIBSè XPTDECLEXP1êposition_procè _wstrrevé_MSL_WCHAR_T_TYPEèNullCharDetectedé1__USE_METINF__ë2NEW_TIMEZONESè9__USE_DEVINF__ëA_MSL_DEFAULT_LOCALEê C__ctype_mapCé GP_OVERLAYèOSML_ERR_XLT_INVAL_LIST_TYPEêQ_MSL_BEGIN_EXTERN_Cê `_MAX_EXTé asmlMapCmdè f__file_modeséhCLOCKS_PER_SECëlisgraphê €__mac_osé ‚offsetofé “SmlDelete_tê –__fwriteé  XPT_SERVERë²__file_handleè¸size_të ÃsmlLibStrcatéÈ_gcvtè ÉSML_PE_FINALé Ø__msl_spaceê ÞSML_PE_ADDëà__wOutStrCtrlè æ__localeéñXPT_DATA_SECTIONé úhmacInfoé þmakepathé __va_startë"smlStatusCmdFuncé)closeè .ODBC_SUPPORTé0getpidë3SML_ERR_WRONG_USAGEê8LC_TIMEê<SML_PE_REPLACEë GsmlLibStrcmpéNsml_target_ref_list_sèZfreopenê ]_SML_DTD_Hë abinary_ioèc__encode_mbyteëwTEST_NEW_LOGGERêSML_PE_PUT_GETë›SML_ERR_A_XPT_ERRORêstrxfrmêžXptHmacInfoPtr_téŸwctype_map_ptrë ¡SmlExec_tè £_MSL_CLOCALEéªXptCommunicationID_té ¯__globalé°startMessageFuncéÁgetppidêÄsmlString2PcdataéÇfgetposêÉsaved_buffer_lenéÍSML_PCDATA_UNDEFINEDéÏint_n_sep_by_spaceë×smlFreeProtoElementêÛSmlSearchPtr_tëáLC_LASTê åsmlLibStrchréð_MSL_CALLINGCONV_SSECALLéñwchar_coll_seq_ptrëòXptErrorInformation_tèóint_p_sep_by_spaceì SmlSync_tè SmlProtoElement_tè endSyncFuncêxptGetLastErrorê (_MSL_CDECLë5xptOpenCommunicationé?_MSL_BEGIN_NAMESPACE_STDéAsmlAlertCmdFuncêBlangéCstatusCmdFuncè G_MAX_DIRéHparméISmlSourceRefList_të NSML_PE_MOVEêZxptEndExchangeë [__max_errstrélsml_get_put_sèŒxptSetDocumentInfoëŽsmlReadOutgoingAgainé˜typeéŸSmlMetInfSharedMem_fé§SML_VERS_UNDEFë©wint_të ¬_spawnveé ³contentTypeê´SmlTargetRefList_të ¶_filelengthâUå ¸__msl_digitê ¸SML_ERR_OKë ¹_spawnvpé½@enum$95sysytool_pchá„Uå¾ctype_cmpt_ptrë¾smlLibReallocè ÏP_NOWAITé ÐSmlMove_tè ÑMemSize_tè ßsmlLibMemcpyéâfilenoãVå ç__UngetACharé ç__msl_blankêðSML_ERR_INVALID_OPTIONSâpVå ÿSML_PE_PUTëÿxptCloseCommunicationéisalnumê _heapminéSmlDevInfFieldLevel_fè rewindë _MSL_STRING_API_Hèllabsè"_MSL_CLOCKS_PER_SECê.sml_record_or_field_filter_sé 3__SML_XML__â”Wå8TEXTTYPE_SUPPORTé 8XPT_API_DEFêCsmlGetUserDataë DNextCharé FdescriptionâXåHFILEáXåHfileéHByte_të Q__io_statesê RSML_PE_COPYêVSML_NEXT_MESSAGEé f_MSL_INLINEêsXPT_DOC_NAME_SIZEè~_InitializeThreadDataè__create_or_truncateé…SML_ERR_XLT_INVAL_TAG_TYPEë‰__stdèŽnocêš_MSL_USES_EXIT_PROCESSë¤XptCommunicationIDPtr_tê¯wctombë¹iscntrlê½XptHmacInfo_tèÃchar_buffer_overflowé ÅextensionèÉ_MTêÕstrtollâ ZåÖlabséÖ_MSL_CTYPE_API_HéÙatexitëÛprintfëÝstrtoldêáINCLUDE_HTTP_STATICALLYâ´Zå æ__msl_lowerêæSML_ERR_UNSPECIFICë ñsmlAlertCmdêôSmlSourceListPtr_të öbuffer_posã8[åûfdopenëûfprintfêÿvprintfê_IOLBFëdataéSML_ERR_A_XPT_INVALID_PROTOCOLë SmlPut_té%DONT_STRIP_PATHPREFIX_FROM_REMOTEIDSé (mimeTypeá \å 0InstanceID_té 0SmlArchive_fé@renameëNsml_item_list_sêQclock_têSsmlSetEncodingëYmon_decimal_pointè_SmlDevInfSharedMem_fé bsmlLibMemseté d__io_modesã]å p_strcmpié pencodingéq_MSL_IMP_EXP_Cë ~LOCKTOOLKITêŒsmlProcessDataëŽ__msizeê _MSL_IMP_EXPé ”sml_alert_sâÜ]å—_MSL_SIZE_T_TYPEé —buffer_ptrësmlMoveCmdFuncë¡SML_ERR_INVALID_SIZEé ºSML_PE_UNDEFé½@enum$97sysytool_pchéÅxptSendCompleteê ÌsourceListë åLC_NUMERICëíSML_PCDATA_OPAQUEèï_MSL_CALLINGCONV_3DCALLêóxptGetProtocolsêõstrtoulê ÿxptSendDataê SmlOptions_té _strncollè_MSLGLOBALS_Hè_getpidâ°_å GLOBAL_OPTIONS_HáÌ_å int_n_cs_precedesè _MSL_LOCALE_Cè !MemByte_tè(timeé 2smlDeleteCmdé3SMLTK_PRECOMP_XPT_Hê 4MAP_RECEIVEê5strcollê Brandom_nextêC_ThreadLocalDataéHfcloseë __spawnvpeè vsmlLibMemcmpéw_MSL_TIME_T_DEFINEDêrandé”SML_XMLê—_MSL_EXTRAS_WIN32_Hê gmtimeë ªSERVER_NAMEê«SYSYNC_FULL_VERSION_STRINGë°_MSL_USING_MW_C_HEADERSêµSmlTargetParent_tè½@enum$96sysytool_pchéÁ_MSL_SIZE_T_DEFINEDêÂ_LOCALE_NAME_LENéÌSML_ERR_A_XPT_HTTP_ERRORéÎmaské ×clearerré Ü_MSL_CSTDIOêçSmlInstanceOptionsPtr_têè?_UâØbåë?_Vê ëbuffer_sizeê ì_spawnleé ù_spawnlpéþ_loc_mon_cmptDcå__int16êSmlStatusPtr_tëcmdRefëwriteè*SML_ERR_A_XPT_INVALID_STATEê3TRUEé 4__readingèB__int32êDrmdirèISML_ALL_COMMANDSéMmacêPthousands_sepèRSML_ERR_XLT_END_OF_BUFFERè SlocaltimeèWSmlPcdataPtr_tã dåbstrcatëbcmdIDèh_loc_time_cmptëi__decode_mbyteësfreeé_MSL_END_EXTERN_CèworkspaceSizeHeåsmlDeleteCmdFuncésmlPutCmdFuncè”setvbufê˜SmlRecordOrFieldFilter_té£_DisposeAllThreadDataèªrespURIê°XPTEXP2ê ²sml_cred_së³XPTEXP1ê·tmpnam_temp_nameé ¼_MSL_CTYPE_Hé½@enum$99sysytool_pchéÃXptErrorInformationPtr_téÍ_getcwdêÒcredéÔmemberëÕwstrrevâäfåß_strrevê ß_MAX_DRIVEëä__int64êêqsortèòstrsetë þsml_pcdata_sé _getppidéSML_PE_STATUSèungetc_bufferè SmlPutPtr_tê!int_p_cs_precedesè+int_n_sign_posnêDstrchrëJsmlEndSyncFuncë LGetHandleè `elementTypeê i__m56800E_osé qSmlSearch_tê sSmlSyncPtr_té xSmlMapPtr_tê~sml_options_sè _SML_DEF_Hë€eofê †__set_errnoê‹P_WAITë˜fopenè smlEndMessageFuncè ©SmlGetPtr_tê ¬unistd.hé³_FILEè ·__undef_osãœiå½tm_secë½@enum$98sysytool_pchéÄperrorëÉSML_PE_ATOMIC_ENDè Îmbstate_tè Ø_MSL_CLOCK_TéÝSmlDevInfLargeObject_fëáCHINESE_SUPPORTâhjåæsleepèæstrcmpëìXPT_REQUEST_RECEIVERé ðSML_NUM_VERSé õ__OutStrCtrléýBUFSIZëpositive_signè strerroréSML_ERR_MISSING_LIST_ELEMè num_cmpt_ptréRELEASE_YEAR_TXTébuffer_alignmentéSML_ERR_XLT_INVAL_EXTèwcslwrë setbufë #SmlItem_tè 3keepConné5PCDATA_OPAQUE_AS_CDATAë B__FileReadëHstrspnë MSML_VERS_1_2é NSML_VERS_1_1á„låOstrcpyë OSML_VERS_1_0éVwcsdupë [_getloginè^SYSER_FORBIDDEN_PRODUCT_FLAGSèrSML_PE_DELETEmåt__handle_openè tvsprintféz_accessê|CLK_TCKêbsearchêˆSmlSourceRefListPtr_t måunlinkë strftimeé”_MSL_TIME_WIN32_Hè œString_té ¡Length_té§_sleepëºSML_PE_SYNC_ENDê ¼XPT_CLIENTë ½sml_search_sé¾SYSYNC_BUILDNUMBERëÇSmlSyncHdrPtr_têË_wcsuprâÀnå ÔUSE_TEXTMAPSéÔstrstrë×handleErrorFuncêØMAPITEM_RECEIVEêÙ__nec_eabi_bareêÚabortè ÞsmlPrintFuncéâSmlSourceParentPtr_té õ_P_OVERLAYëferrorë_rmdirëint_curr_symbolê smlLibMallocésmlFreePcdatapå _wcsncollètoupperêSmlPcdataType_tê _daylightlpå 2LC_COLLATEë 2SmlPcdata_tê CsmlMoveCmdëG__get_MSL_init_countéSam_pmèZ_writeëa__TestForwcsErrorqåk_cdeclë kSmlSyncHdr_té ‚algorithmè’_MSL_USE_INLINEê“_MSL_CALLINGCONV_CDECLë «locale_nameê ÍmoveCmdFuncêÛCUST_SYNC_MANèèasctime_resultëêspawnlëðspawnvëÿisattyë__msl_cmap_sizeê SML_ERR_WSM_BUF_TABLE_FULLëprotoètargetã råSML_EXT_DEVINFë smlPcdataDupé 8__upper_mapê ?__msl_alphaê ASEEK_ENDé Mstricollé OLIBLOCK_HèdSML_PE_HEADERèf_TIME_T_DEFINEDê g_CPPRTTIél_MSL_CALLINGCONV_SSE2CALLèr_tzsetëwSmlPcdataList_têzfwriteëˆSML_ERR_A_XPT_COMMUNICATIONê _strncmpiè•isupperê¢_MSL_STDARG_WIN32_Hê ¥__dup_coreë «wctype_tá„tå²strcmpiê ²difftimeé ¹P_DETACHé»SML_ERR_XLT_INVAL_WBXML_DOCê¼_MSL_OFFSETOFè ½_CPPUNWINDëÃmemsetëÐ_SIZE_T_DEFINEDêÜ_strsetê Ý__writingèãgetcwdëä_execèñstrrevëõchdirè n_sign_posnê SYSYNC_VERSION_STRINGèSmlPcdataExtension_té tls_lconvèSYSYNC_PLATFORM_NAMEé-_inlineê.spawnleê/SML_ERR_XLT_BUF_ERRê;spawnlpê ?wcsnicmpéCTOOLKITLOCK_INITéDSmlTargetRefListPtr_tèMSYDEBUGêQdivêYendMessageFuncëq_MSL_VA_LIST_TYPEès_open_osfhandleêumemchrëvSML_EXT_METINFëxSML_PCDATA_EXTENSIONé |__appendé }groupingéEOFêƒ__nec_eabi_osè‡SmlEncoding_tè ”_WAIT_CHILDê ›__palm_osè Ÿ_CRTAPI1é¥_P_WAITê ©EXPIRY_YEARê°_MSL_UNISTD_Hè²SmlSourceParent_tè´flagsè×memcmpëëmapItemâøxå ï_stdcallé ïsmlEndSyncã$yåö_SML_HëösmlLibMemsizeé_IONBFãdyå_IOFBFëTMP_MAXêSTANDALONE_APPë &sourceRefè(SML_ERR_COMMAND_NOT_HANDLEDâäyå2_wcslwrê 2_MSL_CSTRINGé3gcvtéC__WReadProcActionsëFSmlSequencePtr_téTaccessë [snprintfé`shortProtocolNameènspawnveâ´zå qvfprintféqsmlResultsCmdèx_wcsdupê zEXIT_SUCCESSé{spawnvpê~memcpyë†RELEASE_MONTH_TXTè ’LC_FIRSTé£_unlinkât{åªfwideèªputcharê·SmlDevInfNoTruncate_fèÔ__create_if_necessaryè×dupê ÚMaxCharCountéåwcsuprë ç__must_existé _chdriveé __unorientedésmlInitInstanceê "__msl_printê +__file_stateé.SYSER_PRODUCT_CODE_MAINê 1SmlSftDel_fê3tzsetè E_spawnlpeèN_MSL_MALLOC_IS_ALTIVEC_ALIGNEDë Ostrcasecmpë V__GetACharëXerrnoèeerrorèt__writeêystdinè z_MSL_CSTDARGé€_loc_num_cmptè‹_MSL_END_NAMESPACE_STDë’XPT_APIê”smlEndEvaluationé ™SmlAddPtr_tê§va_listâX~å ª_timezoneè ªstrtok_sé¯VERSION_COMMENTSé³Ret_tè´_chdirë ·strtok_néÀheapminêÄ_spawnlêÑ_isattyêÚSTREAMFIELD_SUPPORTâ0åÞ_spawnvêÞsmlStartEvaluationãhå áEXPIRY_MONTHé áSmlTarget_tê ðSML_UNDEFèñdeleteCmdFuncè üputCmdFuncãßsyncml_vers_1_212560x70010x0002136(&__std(__files[2]))327670x00100xffffU_MSL_THREADSAFE20070x11"3"11"0"10_MSL_IMP_EXP_MSL_IMP_EXP0x000080030x2015__win32_osSML_ERR_A_XPT_ERROR + 0x170x2014SML_ERR_Aß_XPT_ERROR + 0x02"2008-01-31"0x00800x2018111(sizeof() + () & ~())_MSL_CALLINGCONV_CDECL_MSL_WCHAR_MAX(* ( *) ((() += _Align(, 3)) - _Align(, 3)))350x1004__fastcall1_WAIT_GRANDCHILD_MSL_CDECL1_ßMSL_WCHAR_MIN0x00014SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXTSYSER_VARIANT_PROchar110L((fwide(, -1) >= 0) ? EOF : ()->buffer_len-- ? (int) (*()->buffer_ptr++ = (unsigned char)()) : __std(__put_chaßr)(, ))(()->state.eof)00x02110x10x20071"8" = 30_stricmp10x200B0x04((fwide(, -1) >= 0) ? EOF : ()->buffer_len-- ? (int) *()->buffer_ptr++ : __std(__get_char)())0__declspec(thread)_MSL_FILßENAME_MAX150x20131110x000410x2011(__msl_alpha | __msl_digit)19(&__std(__files[1]))140x200C__std(vsnprintf)13(MATH_ERRNO|MATH_ERREXCEPT)510x20031_WAIT_CHILD10x2010snprintf"sysytool"0x0040SYSER_PRODßCODE_SERVER_STDSYSER_PRODCODE_SERVER_XML2GOSYSER_PRODCODE_SERVER_DEMO0x200_P_NOWAIT00x0100110NULL0x200F0x221700x02001SML_ERR_A_XPT_ERROR + 0x122102410x04001SML_ERR_A_XPT_ERROR + 0x15131800x1F63100àß183__declspec(weak)121_MSL_FILENAME_MAX12560x000150x2017SML_ERR_A_XPT_ERROR + 0x0301 = __va_start()0x0004010x0400SML_ERR_A_XPT_ERROR + 0x13SML_ERR_A_XPT_ERROR + 0x14"SySync SyncML Diagnostic Tool"1ß0x02000x1001((() < ()) ? () : ())NULL0x200D120x2008((() > ()) ? () : ())41800x200A256"application/vnd.syncml+xml"_memicmp((void) 0)__std(getc)(stdin)"Synthesis SyncML Client/" SYSYNC_FULL_VßERSION_STRING " [en] (" SYSYNC_PLATFORM_NAME "; I)"10x20011120asm(((uInt32)SYSYNC_VERSION_MAJOR<<24)+((uInt32)SYSYNC_VERSION_MINOR<<16)+((uInt32)SYSYNC_SUBVERSION<<8)+(uInt32)SYSYNC_BUILDNUMBER)1340960x1002"0"0àßunsigned short1_MSL_LOCALE_C_P_OVERLAY0x2004256_MSL_CLOCKS_PER_SEC1_MSL_OFFSETOF(, )0x20x0100(__std(va_list)) ((long) (&) + ((((long) (& + 1) - (long) (&))+3)/4*4))10x130x1010x5001LC_ALL2__cdeclß256400x00020x000x0008_P_NOWAIT0x00020x230x001010001__inline2550x2005010x100x00201SML_ERR_A_XPT_ERROR + 0x1110x80000x0004_MSL_IMP_EXP__typeof__(sizeof(0))0x210x0811"Synthesis SyncML Server/" SYßSYNC_FULL_VERSION_STRINGSYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT "." SYSYNC_BUILDNUMBER_TXT148SML_ERR_A_XPT_ERROR + 0x04shortSML_ERR_A_XPT_ERROR + 0x161long0x20123long long1ß6_P_WAIT0long0x000810x2_MSL_BUFSIZ0x2009"2007"0x201610_MSL_CLOCKS_PER_SEC0x18170(()->state.error)0x01__cdecl10SYSYNC_OEM2560x30010x000123tzsetSML_ERR_A_XPT_ERROR + 0x10_P_DETACH0x200E((__sßtd(size_t)) &((( *) 0)->))SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT"Win32"inline0x20022char *-1L8019__cdecl22008__stdcall032767210x10030"1"0__std(putc)(, stdwout)0x00200x0040SYSER_PRODCODE_SERVER_PRO0x40000(&__std(__files[0]))"Limited to 1 simultaneous sync sessions"11å0âÄé|âÔéÄâÖéôáÚéPááé¨áèéÄáêé0áìéXáîéäá€éøá €é€á€é°íÈá€éôíá(€éPí˜á-€é¼á2€éHíá6€éÀá8€éôá:€é|á>€édá@€éœáB€éèáO€é@ á\€éT í€ ág€é¨ án€éÐ áy€éø ᔀé, ᛀéP á¶€éÌ áÀéü áÊ€é$ áÑ€é¸ áÓ€é0 áÕ€éd á×€áâ@TáXbåx í¤ áó€éÀ á é ááâ€á@TåH áNé¨ í(áQéláXé ácé´áeåÐáíôávéLáéhíáƒé¤á’éÀá™éìí4á›éðáÑéíLáãéáèé¤áëétáîáâHáXáÌáxáp‚áâXåPá‚‚éÀá„‚åüáítቂéØá‹‚é€á‚é á‘‚é<ᘂéÀáš‚éí$áž‚áâìá åTᦂélᨂé´áª‚åÄ‘áèíÈ᳂é(ᵂåô‘á`ἂéPáÁ‚áâXåÔí á'ƒéXá)ƒéÀá<ƒéLítáNƒéœáQƒéˆáXƒéÐáZƒé á\ƒé@á^ƒélí0íLáeƒéxágƒé ánƒé¸íD ኃéd ጃéì î!íL!íx!î"íD"ᎃéÀ"íP#ᣃé¼#ᦃéà#á­ƒé$ᾃé$$áÁƒéD$á݃é€$á߃é¸$ááƒéà$áèƒé%áêƒé<%áöƒét%áøƒåx”á¼%áÿƒéœ%íü%í&á„é@&á„éd&íØ&á„éü&á4„é 'áQ„é\'í 'ál„é(áq„é4(ás„é|(á~„é”(á…„éà(ᇄé\)ኄéØ)á„éü)íl*á–„é<+í¤+ᛄéÐ+áž„éà+á „éü+á§„é,,á©„éˆ,áÄ„é¨,áÆ„éè,áË„é-áÍ„é.áÔ„é\.áÖ„é.錖áÄ.åâå¤.áñ„ê/áó„é`/áö„éì/áù„é0áþ„é40á…éD0á…é°0á…éÄ0íì0íh1á …åL—á¤1á…éˆ1á…é¼1á …éü1á2…é2íh2í€2á4…é3í(4á8…é@4í|4á?…éØ4íp5áA…éœ5áH…éÜ5ác…ê6áe…é\6ág…áâ€álSå„6á{…é 7åâåL7á‚…éÔ7á„…éx8ᆅé8á…éô8ᨅéH9áÃ…é¤9áã…é:áå…éD:áì…éx:áó…áâ0á<å;íT;á†é`<á†å`™á(=í=íh=á†éÀ=á†éä=á!†é<>á(†áâ0á<åd>íx>íŒ>íp?áF†é€?í¬?áH†éè?í @áJ†éˆ@áL†épAíÔAíüAáN†é`BáU†éxBáY†étCáv†éˆCá†áâ€å DáІáæTDíÀDá†éEáù†élEáû†éFídFí|Fí´FíTGá‡éÀGíÐGá‡éTHá‡é”Há‡éÄHá ‡éIí$Iá‡éXIá‡é¤Iá’‡é¼IᔇéÔIíJᙇé|Já ‡éÌJíìJᤇé KíPKᦇéˆKí¤Kᵇé¼KíØKá·‡éLáŇé$LáЇéLLílLáׇé¬LáÛ‡éÜLáï‡éðLáñ‡áâ@Tá¨få0Máˆé´Má ˆéNíTNáˆáâlSå˜Ná`ˆéÄNábˆéäNágˆé`Oí¨OálˆéàOánˆé`Pí˜P忤QáuˆéÐQá|ˆé¸Rá~ˆéðRíXSᆈéÐSኈéPTáˆåhžáUᔈéUᙈéœUá ˆéV᪈é4V᱈é¸VᶈéìVíWὈé`Wéøžá”WíxWáˆétXáĈéŒXá͈éèXáшéYá؈áâ@å0YáÛˆéìYá݈é ZíxZ霟á´Zá߈éœZáäˆé`[áëˆé„[áíˆéÄ[á‰é \á ‰é´\á‰é,]á‰éH]åâå]íÀ]á%‰é^á;‰éœ^á@‰éÐ^áE‰éh_é áÌ_áG‰é”_í `í@`íà`í$aíXaáI‰épaá‰é˜aáê‰éøaíbáì‰é4báï‰é|bí0cá Šé„cáŠé¬cá+ŠéÐcá-Šé8dá2ŠéødíÌeíøeí(fíäfá9Šéüfá;Šéሧáêà©álሧáêø©áœMሧáîœSሧáè°«á$ªá dáæ â4ªç â4gáHªãâìªá\ªá´Téætªå¤ 匪á(Qá\ªí¤ªáÜá\ªá꼪á´^á\ªáêÔªá„wá\ªáîìá\ªáèx«â«áØYáææ«å,å0«áX%â«íH«áhwâ«áê`«á„râ«áîŒ9â«á茫å¼;áê «á¬=áæ ìÄ«å¬xáæ$¬áØ«á˜fá æ âè«çâàeáü«ãâ¬á$ªádí$ªát[áæ,®á8¬ápráæ âH¬ç â¤á\¬ãâp¬á$ªáp0鄬á$ªáàá꘬áôHáæ â¨¬çâ/ἬãâЬá$ªádé®áä¬á¬3áæ âô¬çâ8Wá­ãæ­áé â,­çâ¨á@­ãâT­á8¬ápréh­á8¬áXEáæ´­á|­á,Fáæ âŒ­çâ¬!á ­ãæ$ªáp0éÈ­á|­á@@á æÜ­á$ªádáæð­á$ªát[áî¬xáæ®áä¬áè1áê$ªáä á æ@®á8¬áXEáæT®á$ªádáê$ªá Yáêæx®áäâ´®ÿíäЮðáì®ù¯é¯áê ìT¯é4¯áê âD¯ç æð4¯áîDc倯ጯç ✯ç,âð"á°¯ãâįሧá$héدá$ªá dáæì¯á$ªáTáç°á$ªá`cá æ°á$ªáÐáæt°á(°á?áæ â8°çâ,OáL°ãâ`°á$ªád9í(°ádáæÔ°áˆ°áÈ(áæ â˜°çâˆá¬°ãâÀ°á$ªá”y툰ádáæè°áØ«á˜fáæ4±áü°á˜Bá æ â ±çâ Aá ±ãæ$ªádéH±á$ªát[á$ê\±áðBá(æ âl±çâL\ေãâ”±á­áí\±ádáêì!帱áıçâèSáرãâì±áˆ§á$hê²á$ªá dáæ²å¬xáæ(²á$ªá0Sá æ<²áØ«á˜fáæP²á$ªádáê\±áðBáêÔ1åt²áäÔ1á°²ÿíä̲ðáè²é¯í³é³áê ÿìPæ@³áäPâ|³ÿí䘳ðá´³é¯íгùì³é¯áö¯ñhRå´áˆ§ë\å4´áä\áp´ÿí䌴ðᨴé¯áêÄ´é¯áÿêtåð´áø´ã âtá µã⠵ሧá$hé4µá$ªá dáæHµá$ªáTáæ\µá$ªá`cá æpµá$ªádáæ„µá$ªád9áæ˜µá$ªá”yáê\±áðBáêŒå¼µáäŒáøµÿíä¶ÿ «í´¶á rå@¶áä rá|¶ÿí䘶å$ª÷$ªñ„råH«å"åÔ¶áä"á·ÿíä,·ðáH·ÿå¯áî¨åt·áä¨á°·ÿíäÌ·óè·ù¸é¯áê ¸ÿå<¸í â «ç¹á<2å\¸áä<2ᘸÿíä´¸ðáиé³áêì¸é³áÿêtcå¹áätcáT¹ÿíäp¹ðጹù¨¹é «áÿêÄåÔ¹áü°çäºáœRåð¹áäœRá,ºÿíìHºáè âXºçælºã›åÜ8锺å`áæ¨ºá¯ápzáâ⼺á¯á€á ââкåð3áê¯á0Cáâæ¬æè§å`Aå»áä`Aá@»ÿíä\»ðí¯áî Aåˆ»á ±çÜå »áäÜáÜ»áð¼÷äø»íáýˆ¼áœ¼áåçäçæááxýâHéSâ@Aâ@å´¼å7éà¼á|¾á¨¾õé ½á̽ùé8½á ½ùéd½ý:á½åSþ ì4ÿêéø½áP¾ùé$¾ý:á½åSþ4ëý4ÿêéÔ¾áÐÌù2ê¿ýé,¿ýá³åX¿á Ìùá³å„¿ýá°¿åÁáôËù âÀ¿ç(â´:áÔ¿ãâü¿áè¿áLAé êäÀá³áÄEáæ4Àá$Àá#á æ ìHÀá$Àá@áæ\Àá³á0PáæpÀá³át-áæ„Àá³áTáæÁá˜Àá„0á æ â¨ÀçäÄÀóàÀé³íüÀé¯áÿê,ÁáÀ'á$æ â<ÁçäXÁótÁé¯ÿéá°¿å¼ÁýáèÁå¸ÊáÈËù âøÁçÐá„`á Âãâ ÂáèÁádé4ÂåP}áæHÂål`áæ\Âá$Àá¬~á æpÂá$ÀáX~áæ„Âá «á¨áæ`Ãá˜Âá¤áæ$âÜá¬ÂãâÀÂåˆiéÔÂæáæèÂåð:áæüÂåhá æÃåláæ$Ãåüáæ8Ãæ áæLÃåP áîŒAá ætÃá˜Âáüá<æœÃáˆÃáÄqá`æ êäÄÃá°Ãá fázæ áêãÜÅáØÃáüuá|å âèÃç8â48áüÃãâÄá¯áÔé$Äá¯á dáæ8Äá¯á¸wáæLÄá¯á˜\á æ`Äá¯ád$áætÄá¯áx&áæˆÄá¯áàjáæœÄá¯ádâæ°Äá¯á$&á æÄÄåøá$æØÄåœá%æìÄå€"á&çÅåØCá'æÅåtDá(æ(Åå\ á)æ<Åå¤uá*æPÅá¯á°oá,ædÅåØá0æxÅå¨gá1æŒÅå°_á2æ Åå4Rá3æ´ÅåHQá4æÈÅå´á5îÄgá6æðÅá¯á|qá€åxÊáÆáø2á„åHâüMáÆãâ<Æá,Æá <é âÆçdÆáPÆá|qáæ 0ê0äìÆáxÆáP2á4æ âˆÆçâÔ*áœÆãâÄÆá°ÆáLAé ê䨯á$Àá( áê³áôQá çÇá°¿áhUá8æÉáÇáâ<æ â$Çç4âcá8Çãâ`ÇáLÇáLAé êätÇá¯á˜\áæˆÇá¯ád$á æœÇá¯áx&áæ°Çá¯áàjáæÄÇá¯ádâæØÇá¯á$&áæìÇåøá çÈåœá!æÈå€"á"æ(ÈåØCá#æ<ÈåtDá$æPÈå\ á%ædÈå¤uá&æxÈá¯á°oá(æŒÈåØá,æ Èå¨gá-æ´Èå°_á.æÈÈå4Rá/æÜÈåHQá0æðÈå´á1îÄgá2æ ÉáÉá0ká@æ â(Éçâ¬}á<ÉãâdÉáPÉáLAé êäxÉá¯áÔáæŒÉá¯á dá ê¯á¸wáê´Éá*áDæ âÄÉç â°dáØÉããÊáìÉáLAé êäÊá¯á¼páæ(Êá¯áá æ<Êá¯á áæPÊá¯á0AáædÊá¯áÀáê¯áÄ9áêŒÊáØ9áÌå âœÊçú8áèÁåäÊá”Ëá Ëõ:âËåXËý â Ëçä<ËåèÁèýåá ËçÿèœËá4êþ4ê¼ý4êþ éLÌá¤ÌùéxÌý:á½åSþ4êþ4ëÿá¸Aå ÍáÍçâL*á,ÍãâŒÍá@ÍáÐxé âPÍçâ`JádÍãâxÍá8¬áprí8¬áXEáê Íádáæ âÍçÀÍáàç¨åœ2åÐÍáäœ2á Îÿíä(Îå¯èáDÎù`Îé¯ÿí,"åŒÎá˜Îç â¨ÎçäÄÎóàÎé «íüÎé «ùÏí âıë(å8Ïáä(átÏÿíäÏðá¬Ïé¯áÿæpÐáèAåØÏáäÏçâÄ5áøÏãâ Ðሧá$hé Ðá$ªá dáæ4Ðå¬xáæHÐáØ«á˜fá æ\Ðá$ªádáê\±áðBáæãX"å€ÐáäX"á¼ÐÿíäØÐðýÑá¬2åÑáê°ÑáDBå ÑãhÑáDBá8ÑáèæPÑåH^å Ñáø(á8Ñí€ÑáÀá8Ñáê˜ÑáXXá8Ñáîôcá8ÑáèÒá$BåÀÑáÈÑã â$BáÜÑãâðÑá¯áÔéÒá¯á dáê¯á¸wáêh"å(Òáäh"ádÒÿíä€ÒóœÒé «í¸Òÿù¼cåäÒãDÓá¼cáüÒáèæÓå(Xå,ÓáÄ áüÒíäÒáHuáüÒáîÐ%áüÒáìÐRålÓáäÐRá¨ÓÿíäÄÓóàÓé «íüÓÿå<¸íÄÔáå(Ôá4Ôç âDÔçä`Ôó|Ôé «í˜Ôé «ù´Ôí âø´ë¸råÔÔáæ¸ráÕåÿå áêçÀ2å4ÕáäÀ2ápÕÿíäŒÕå³èá¨ÕùÄÕé³ÿédÖáà2åðÕáäà2á,ÖÿíäHÖå¯÷¯áîÐ2åtÖáäÐ2á°ÖÿíäÌÖðáèÖé¯áö×í â×çTâ`iá(×ãâ<×åøFé$ØáP×á(7áææd×ãâ„×áx×á éç¤×á˜×á”#éæÄ×á¸×áð@éæä×áØ×á¬G鿨áø×áT+éæ ãØáxOéæ ´Øá8Øâ%áææLØãâlØá`Øá,éçŒØá€ØáÐ?éæ ØåÌháî`}áæÈØå1áæÜØåÔ<áæðØå¸YáæÙáÙáxgáæ êä@Ùá,ÙáØDáæ êäTÙåÔ,áæhÙá$Àá¬"á æ|ÙåØbá$æÙá$ÀáÜ]á(æ¤ÙåÜá,æ¸Ùådká0æÌÙå Qá4æàÙå [á8æÌÚáôÙá$Ká<æ âÚçä Úó<ÚùhÚéXÚí ì„Úÿå Úí â°ÚçúŒÛáàÚáˆ:á@æ âðÚçä Ûó(ÛùDÛé$ÀípÛé`Ûí ø Úí ÛáàÚááDæüÛá´ÛáHáHæ âÄÛçäàÛÿïÜá ÚâHáLê×á áPêSå4Üá@Üç âPÜçälÜóˆÜé «í¤Üé «ùÀÜí âÐÜçâ¨]áäÜãâøÜሧá$hé Ýá$ªá dáæ Ýå¬xáæ4ÝáØ«á˜fá æHÝá$ªát[áê\±áðBáêäcålÝáääcá¨ÝÿíäÄÝðí¯áî8åðÝáä8á,ÞÿíäHÞå³èádÞé³ÿíTåÞáäTáÌÞÿíäèÞå³èí³ñ¨Båßáä¨BáPßÿíälßðáˆßé³áö³áêÀßá|Så´ßᘰçÐßá`å©åôcå˜Ñå|åðßáä|á,àÿíäHàðádàé¯áê€àé¯áÿêürå¬àáäüráèàÿíäáðá áé¯áö¯áîœSåø©áâáP3å\ááäP3á˜áÿíä´áðáÐáé³áêìáé³áÿê43åâáä43áTâÿíäpâðÿád3åœâáäd3áØâÿíäôâðáãÿå×ñ\då<ãáä\dáxãÿíä¤ãå”ãèá â˜ÂóÀãáê ð¼åàãáä¼áäáðTä÷ä8äíáýÈäáÜäáåçäçæááxýâHéKâ@=â@åôäå7é åá¬æáØæõéLåáüåùéxåáÐåùé¤åý:á½åKþ4ÿêé(æá€æùéTæý:á½åKþ4ëý4ÿêéçáÌéù2é0çýé\çýá³åˆçáéùá³å´çýá°¿åàçáðèùá°¿å èýáèÁå8èáÄèù8áèÁådèáèá Ëõ:âËåXËÿá˜èá4êþ4ê¼ý4êþ éHéá éùétéý:á½åKþ4êþ4ëýêápdåêá$ªëÜ"å$êáäÜ"á`êÿíä|êðá˜êé½í´êÿù´Såàêáä´Sáëÿíä8ëÿ «ñt3ådëá|­ç¼ìá”3å€ëáŒëç âœëçä¸ëóÔëé «íðëé «ù ìí âìçâ #á0ìãâDìሧá$héXìá$ªá dáælìá8¬ápráæ€ìá8¬áXEá æ”ìáØ«á˜fáæ¨ìá$ªádáê Íá(áæ\íá$åÌìáä$áíÿíä$íó@íé «ùŒ¯ñ¼Bålíç¼Bá„íáèæœíå¤å´íá0|á„íílíáDJá„íáìØBåÜíáæØBáîåÿå áêçŒdå<îáäŒdáxîÿíä”îå¯èá°îé¯ù¯áêäîáð"åÜîᜯç$s倩åCåïáäCá@ïÿíä\ïå «èáxïé «í”ïé¯áÿæÈïá #åÀïáìãØïá¼3帧áðïá°dåèïáÄÉãtðá´æðáä´á<ðÿíäXðå³èí³ñCå„ðáäCáÀðÿíäÜððÿáÌdåñá˜ÀçxñáÔ3å$ñá0ñçæHñåœiå`ñáà.á0ññX8á0ñáìÈåˆñáäÈáÄñÿíäàñå¯èáüñÿå¯áî<å(òáä<ádòÿíä€òå³èáœòé³ÿíèSåÈòáıçHCåàòáäHCáóÿíä8óå «èáTóÿùlå€óáälá¼óáð,ô÷äØóå¯åááôóùôé¯ÿé ôáÜôáåçäçæááxýâÐéâ@Üá¯åâ@èéâ@Jâ˜"åôôå8á¯å õáöá\õõ:âLõåÌõý â\õçäxõå¯èá”õù°õé¯ÿéäÔá\õçÿähöáöáé<öý:á½åþØöápöáá¯åœöý:áÈöåþ â¯ëàöáé ÷ý:á½åþH÷áÜ匪åèdåX÷áäèdá”÷ÿíä°÷ðí «íløá\CåÜ÷áä\Cáøÿíä4øå¯ëPøé¯áö¯áêã 4å8©å¤såŒøá˜øçâ`á¬øãâÀøá$ªát[íÔøádáæ â˜øç¼ùáÀsåôøáäÀsá0ùÿíäLùðáhùé «áê„ùù ùÿå×ñøåÌùáäøáúÿíä$úå¯èÿá|åPúáä|áŒúÿíä¨úóÄúé «íðúéàúí â$ÀóÀãñ˜åûáä˜áXûÿíä°ûåtûèáæˆûãâœûå| ñPáæÌûÿùd4åøûááüãâd4áüãâ(üሧá$hé<üá$ªá dáæPüå¬xáædüáØ«á˜fá æxüá$ªádáê­ááæ,ýá4#åœüáä4#áØüÿíäôüðáýé×ù Úñäå<ýçäáTýáèælýåˆ å„ýáôCáTýíœýáp áTýáê<ýáðáTýáì4åÄýáä4âþÿíäþðí¯áî”4åð¨å´4åXþáä´4á”þÿíä°þðáÌþé¯áö¯áîœCåøþá «ë°CåÿáìçÀÿáÄCå0ÿáäÄCálÿÿíäˆÿå «èá¤ÿé «ÿíÈ4åÐÿáäÈ4á ð|öä(ä¯åááDø`è¯ÿéð,åçäçæááxýâÐéâ@Üá¯åâ@èéâ@Mâ˜"åDä8á¯å pœ\õõ:âLõåÌõý ü¤éÐü:á½åþ \á¯å0ü:áÈöåÿâdéü:á½åÿãTåÌåTáÿìä$ò@è «ù\ê âlæTå€ââ”ä87é¨äháæ Ð¼ô[áæ @ê@ä øäôáHæ áêã l ,NáHå âæ æ0ââD¯á(qåâX¯áüáâæ¯ádá↫á°áLíÜkáPéDå¤8Ñç4 TåÀä Táüÿìäþ «ñô4åDäô4á€ÿìäœïí×íTHeåÈÔæ âäæåòè «í8è «ùÏî,eådpæ â€æäœò¸è «íÔè «ùðì âäÏëüsåäüsáLÿìähïá„è¯áê è¯áÿêtåÌätáÿìä$ïá@ÿä×ñ`eålä`eá¨ÿìäÄïáàè×íüè¯í ÿôô„åD ä„ဠÿìäœ ò¸ è «ùÔ ê âä æ@âˆáø ââ Œ  ¬Pé â æä8 òT è «íp è «ùŒ ì ✠æ,ât á° ââÄ ˆ§á$héØ $ªáL/áæì $ªá`ráç $ªá+á æ $ªá`?áæ( ä¬xáæ< 8¬ápráæP 8¬áXEáæd $ªá¸eá æx Ø«á˜fá$ê$ªádá(æ   áwáæ â° æäÌ òè è «í è «ÿéÄ 4 ”âæ âD æä` ò| è «í˜ è «ù´ ì â`§ç < Ø „Rá æ âè æä ò è «ù «í Ð P x=áæ â` æä| ò˜ è «í´ è «ùðìä @Üá€Gáæ ø p”áæ ˜ÎáL>áæ Ô¬á æ4Œëâ.á$æH4Ôáá(æ Ü\@Sá,æ âlæäˆò¤è «íÀè «ùŒ¯í pð@)á0æ ãæäò8è «íTè «ùðì „”qá4æ â”æä°òÌè «íèè «ùðì |Ôná8æ â(æäDò`è «ù «ñøá<æ â æä¼òØè «ù «ñtåätá@ðxöä\ìáýìáåçäçæááxýâHéOâ@?â@åä7é DÐüôép øéœôøéÈü:á½åOþ4ÿêéL¤øéxü:á½åOþ4ëý4ÿêé(ðø2éTüé€üá³å¬@øá³åØüá°¿åøá°¿å0üáèÁå\èø8áèÁå ˆ´ Ëõ:âËåXËÿá¼4êþ4ê¼ý4êþ élÄøé˜ü:á½åOþ4êþ4ëÿáôCålýáHteå<ô¬ë5åX Úë 5åtâ¼ 5áŒèæ¤ä åt|áŒð@áŒì85åää85á ÿìä<ä³èáXøtè³ÿí å ä áÜÿìäøä¯èáø0è¯ÿé\5å\ä\5á˜ÿìä´ïáÐè¯áêìè¯áÿêH5åäH5áTðpöôéäåçäçæááxýâ6âLiåüä4ê(#ÿá˜eå8ä˜eátÿì÷á0å äáÜÿìäøïáè³áö³áîDtå@äDtá|ÿìä˜ïá´è «ù<¸ñh#åਬëpTåüâ,pTáêæüäØaåD„láê\Xláêt@láîœjáè,€#åœä€#áØÿìäôïáÿä×íè°å<ä°áxÿìä”ïá°è³áêÌè³áÿæ DåøîŒTåêÀÈå0äÈálÿìäˆïá¤è¯áö¯áêã\tåÐî Tåìä Tá( ÿìäD ïá` ø| è¯áê˜ è4¯áö4¯áî DåÄ ä Dâ!ÿì÷å4Då,!ä4Dáh!ÿìä„!ò !è «ÿéÔ!àeåÌ!è«ãt"„tåä!ä„tá "ÿìä<"ïáX"ÿøptå„"äptáÀ"ÿìäÜ"ïáø"è¯áö¯áîÌTå$#8°ç $Hå@#äHá|#ÿìäÔ#ä˜#çáæ¬#ââÀ#ä| ñPáæð#ÿøìTå$äìTáX$ÿìät$ïÿáDå $äÏë¬Då¼$ê0%¨#åØ$ä¨#á%ÿìì×èå4Uå@%ä4Uá|%ÿìä˜%ïá´%øÐ%è¯áö4¯áî„Uåü%ä„Uá8&ÿìäT&ä «ëp&è «ÿíÄ5åœ&äÏãD'ø#å´&äø#áð&ÿìä 'ò('è «ù´ ðôåT'ðêôDåp'äôDá¬'ÿìäÈ'ïí¯áë(`fåô'Hºç($Eå (Ô èuå,(äuáh(ÿìä„(ä «èá (è «í¼(ÿølåè(lêå)äá@)ÿìä\)ä³èáx)ø”)è³ÿéÌ) åÀ)˜¬ëDEåÜ)äDEá*ÿìä4*ïí×ñ„få`*ä„fáœ*ÿìä¸*ä¯èáÔ*è¯ÿí6æ+ä6á<+ÿìäX+ä «èát+è «í+è¯áÿê¤$å¼+ä¤$áø+ÿìä,ä¯èí¯íL,°Uå@,äÏë¼å\,ä¼á˜,ÿìä´,ïáÐ,è¯áêì,è¯áÿæ$-ÄUå-îÔåÌõå,6åD-ä,6á€-ÿìäœ-ä¯èí¯ñ¼fåÈ-ä¼fá.ÿìä .ä³èí³ñ@6åL.8¬ë4uåh.ä4uá¤.ÿìäÀ.ä¯èáÜ.è¯ÿíHuå,ÓáÄ/ØUå/äØUáT/ÿìäp/ä «ëŒ/è «í¨/è «áÿêÐfåÔ/äÐfá0ÿìä,0ä¯èí¯íd0(%åX0ê42Eåt0|0â,âEá0ââ¤0¯á˜\é¸0¯ád$áæÌ0¯áx&áæà0¯áàjá æô0¯ádâæ1¯á$&áæ1äøáæ01äœáæD1ä€"áæX1äØCáæl1ätDáæ€1ä\ áæ”1ä¤uáæ¨1¯á°oá æ¼1äØá$æÐ1ä¨gá%æä1ä°_á&æø1ä4Rá'æ 2äHQá(æ 2ä´á)îÄgá*æð2åD2äá€2ÿìäœ2ïá¸2è³íÔ2è¯áÿêðUæ3äðUá<3ÿìäX3ïí×ñ\uå„3ä\uáÀ3ÿìäÜ3ä¯èáø3è¯ÿé,4`å$4˜øçpuå<4äpuáx4ÿìä”4ïí¯áêÌ4$åÀ4 ê|å¤äVåì4â45Vá5èæ5ä*åì48}á5ðPá5èh5”å\5PÍë°Eåx5ä°Eá´5ðì5öäÐ5ìáý`6t6åçäçæááxýâHéGâ@;â@åŒ6ä7é ¸6D8p8ôéä6”7øé7h7øé<7ü:á½åGþ4ÿêéÀ78øéì7ü:á½åGþ4ëý4ÿêéœ8d;ø2éÈ8üéô8üá³å 9´:øá³åL9üá°¿åx9ˆ:øá°¿å¤9üáèÁåÐ9\:ø8áèÁå ü9(: Ëõ:âËåXËÿá0:4êþ4ê¼ý4êþ éà:8;øé ;ü:á½åGþ4êþ4ê€þÌ<gå ;ägáÜ;ÿìäø;ïá<è «í0<øL<ÿäh<ì âx<æä”<ò°<è «áö «áî¬åÜ<è<ææü<ââ=³á|)òáêDå4=äDáp=ð¨=öäŒ=ìáý>0>åçäçæááxýâHéWâ@Câ@åH>ä7ét>á@X@ôé >P?øéÌ>$?øéø>ü:á½åWþ4ÿêé|?Ô?øé¨?ü:á½åWþ4ëýé,@ü:á½åWþ2é„@üé°@üá$ÀåÜ@pBøá$ÀåAüá°¿å4ADBøá°¿å`AüáèÁåŒABø8áèÁå ¸AäA Ëõ:âËåXËÿáìA4êþ4ê¼ý4êþéœBü:á½åWþxCÜEåØBäBæ âôBæâœháCââ dCC0/é â,CæäHCþ¯õœáêXåˆCäXáÄCÿìäàCïí¯áîøEå DäøEáHDÿìädDä¯ë€Dè¯áö¯áî€uå¬Dä€uáèDÿìäEä¯èí¯ñ gå0Eä gálEÿìäˆEä¯èá¤Eè¯ÿí”uåÐEä”uá Fÿìä(Fïí¯áêÈFDFåTFäDFáFÿìä¬Fþ «ñX%å«á\GÄåèFäÄá$Gÿìä@Gïí¯áêãœålGäœá¨GÿìäÄGïáàGè¯áö4¯áî˜Få Hh<æ4HØå(Hä ê4gåDH4ªãÐHpVå\HäpVá˜Hÿìä´Hþ «ñXV娨åVåðHäVá,IðdIöäHIìáýØIìIåçäçæááxýâHé'â@+â@åJä7é 0J¼KèKôé\J KøéˆJàJøé´Jü:á½å'þ4ÿêé8KKøédKü:á½å'þ4ëý4ÿêéLÜNø2é@LüélLüá³å˜L,Nøá³åÄLüá°¿åðLáNøá°¿åMüáèÁåHMÔMø8áèÁå tM M Ëõ:âËåXËÿá¨M4êþ4ê¼ý4êþ éXN°Nøé„Nü:á½å'þ4êþ4ê ÿâ¤VåOä¤VáTOÿì÷åLgå€OäLgá¼Oÿì÷å`gå ©åp6åøOäp6á4Pÿìì¯èáÔPØVå`PäØVáœPÿìä¸Pïí×ñ(åäPä(á Qÿìäá{îàpá{èl{iå`{  ê(å|{ä(á¸{ÿìäÔ{ïáð{è¯áê |è¯í(|è¯íD|è¯ù¯ñ@å¼ä å€|ä á¼|ÿìäØ|ïáô|è¯í}è¯áê,}è¯áêH}è¯áö¯áîTYåt}<¸ë å}ä áÌ}ÿìäè}ïá~è¯áöÈöñ´8å0~ä´8ál~ÿìäˆ~ä¯èí¯ñ4iå´~Ïë4åÐ~ä4á ÿìä(ä¯èáDè¯ù¯áê|\åpTuêHåŒäHáÈÿìääïâ€è¯áê€èÈöÿé`†È8åH€äÈ8á„€ð¼€öä €ìáý0DåçäçæááxýâHéCâ@9â@å\ä7é ˆƒ@ƒôé´d‚øéà8‚øé ‚ü:á½åCþ4ÿêé‚è‚øé¼‚ü:á½åCþ4ëý4ÿêélƒ4†ø2阃üéăüá³åðƒ„…øá³å„üá°¿åH„X…øá°¿åt„üáèÁå „,…ø8áèÁå Ì„ø„ Ëõ:âËåXËÿâ…4êþ4ê¼ý4êþ é°…†øéÜ…ü:á½åCþ4êþ4ê@ÿ‡xYåp†äxYᬆÿìäȆïáä†è¯ÿ鼇Iå‡äIáL‡ÿìäh‡ïᄇè³í ‡è¯áÿê|Iå̇ä|Iáˆÿìä$ˆä «èÿáxåPˆŒ­ë`iålˆ×ç˜å„ˆôÙëŒYå ˆäŒYá܈ð‰öäøˆìáýˆ‰œ‰åçäçæááxýâHé3â@1â@å´‰ä7é à‰l‹˜‹ôé Š¼Šøé8ŠŠøédŠü:á½å3þ4ÿêéèŠ@‹øé‹ü:á½å3þ4ëý4ÿêéÄ‹ŒŽø2éð‹üéŒüá³åHŒÜøá³åtŒüá°¿å Œ°øá°¿åÌŒüáèÁåøŒ„ø8áèÁå $P Ëõ:âËåXËÿáX4êþ4ê¼ý4êþ éŽ`Žøé4Žü:á½å3þ4êþ4êÿâ9åÈŽä9áÿìä þ «ñ YåLê°åhêìIå„äìIáÀÿìäÜþ¯áê|¼iåä¼iáDÿìä`ïí¯áî49åŒä49áÈÿìääïí¯áîÔ'呿Ô'áL‘äÿå áêçì'åp‘äì'ᬑÿìäÈ‘ïáä‘è «î’ø’ÿä×ñÐiå¨å åX’ä á”’ÿìä°’ïáÌ’è¯áêè’èÈöÿíØå“äÏç<“å0“Ø«ëìåÔªåìiå\“ï(åx“êx9唓äx9áГÿìäì“ïí¯áêÄ”üYå”äüYáT”ÿìäp”ïጔè¯áꨔèÈöÿíJåÔ”äJá•ÿìä,•ä×èáH•ÿä¯áêè•Zåt•äZá°•ÿìäÌ•ïÿá4åø•ä4á4–ÿìäP–ïí¯áî¼xå|–ä¼xḖÿìäÔ–ïáð–è «áê —è «áÿæØ—å°©åÔ-å°˜#æxü åÌäü áÿìä$ïá@è «í\ÿø(>åˆä(>áÄðàöôéTåçäçæááxýâ4âLiålä4êdÿâø_å¨äø_áäÿìåïíÀãñˆNå,äˆNáhÿìä„ïÿá||å°8ØëœåìuäåÜäáÿìä4ä «èáPè «ílè³áÿê°Nå˜ä°NáÔÿì÷åäæä¬ç¬`åä`áXÿìätòè «ùððlpå¼4ªëÐ|åØäÐ|áÿì÷áÐX`å@äX`á|ÿìä˜ïá´è¯áö¯áîXåàäXáð8öôé¬åçäçæááxýâ2âLiåÄä4êÈÿâøNåh©å,åä,áLÿìähò„è «ÿíLå°äLáìÿì÷å4.å`¨á¸ „på( ä„pád ÿìä€ òœ è «ùðð„`á Ô È øÁëÜ øÁçà|åô äà|á0!ÿìäL!ïáh!ÿä¯áê$"Oå”!äOáÐ!ÿìäì!ò"è¯áö¯áîœpå4"äœpáp"ÿìì½èå `åœ"ä `áØ"ÿìäô"ïí×ñˆå #ä æ,Oå8#8°ãX#¤åP#H¬ç }åh#ä }á¤#ÿìäÀ#ïáÜ#è¯áö¯áîlåÈ©áŒ$L.å$äL.áT$ÿìäp$ïÿá8}å5äˆå¬$¨aæt%LOåÈ$äLOá%ÿìä %ä×èá<%è¯áêX%è¯áö×íø%|.å„%ä|.áÀ%ÿìäÜ%ïí×ñÌpå&äÌpáD&ÿìä`&ïá|&ø˜&è «áÿê´`åÄ&ä´`â'ÿìä'ïá8'øT'è¯áêp'è4¯áö4¯áîàpå8{äÈå¬'ÈvæŒOåÄ',Áçà'à.åHñåàåäXäôæ(äôá<(ÿìäX(ä¯èí¯ñ/å„(¨¬ã¨(qåœ(œ êå¸(äáô(ð,)öä)ìáý )´)åçäçæááxýâHé?â@7â@åÌ)ä7é ø)„+°+ôé$*Ô*øéP*¨*øé|*ü:á½å?þ4ÿêê+X+øé,+ü:á½å?þ4ëý4ÿêéÜ+¤.ø2é,üé4,üá³å`,ô-øá³åŒ,üá°¿å¸,È-øá°¿åä,üáèÁå-œ-ø8áèÁå <-h- Ëõ:âËåXËÿáp-4êþ4ê¼ý4êþ é .x.øéL.ü:á½å?þ4êþ4ê ÿâåà.è«ëp}åÔuäÈ`å /äÈ`áH/ÿìäd/ò€/è «áêœ/è «áÿê\åÈ/4 ê¸åä/ð/æ ãüç0Ðå0Tuæ„/å(0î¬}åD0(Éèaå\0åaá˜0ÿì÷å˜/åÄ0ä˜/â1ÿì÷åå,1äáh1ÿìä„1ä «èá 1è «í¼1è «áÿêPå45äÄO嘩å€å2Ôøë¤>å$2ä¤>á`2ÿìä|2ïá˜2è¯áê´2è¯áö¯ñÀ/åà2äÀ/á3ÿìä83ä³èáT3è³íp3ÿô,4ü}åœ3äü}áØ3ÿìäô3ò4è «ùÀãñaåüXä¸>åL4ä¸>áˆ4ÿìä¤4ä³èáÀ4è³áö³áî~åì4ðæ5Ì>å5Ô ëPå$5åPá`5ÿìä|5ïá˜5è¯í´5è¯áÿêPåà5 êDaåü5äDaá86ÿìäT6ä”ãèíÀãáîLPå€6áüëè>å {äÐå¬6äÐáè6ÿìä7ò 7è «ùÏò?åL7å?áˆ7ÿì÷å0~å´7¯çÜ7Ô/åÐ7œ¯çã,?åì7æ,?á(8äÿå áêãX8xPåL8 «ëD~åh8æD~éÿéäå´8ääáð8ÿìä 9ïí¯áîÐå89äÐát9ÿìä9ä «ë¬9è «íÈ9è «áÿêèåô9äèá0:ÿìäL:ä¯èáh:è¯í„:ÿù0å°:äÏëˆ~åÌ:êx;(åè:ä(á$;ÿìä@;ä¯èá\;è¯ù¯áê; åˆ;Œâø;üå ;äüáÜ;ÿì÷å˜~å<ä˜~áD<ÿìä`<ïí¯áê˜<¼aåŒ<Œ­ë˜?å¨<ä˜?áä<ÿìå=ïá=è¯áö¯áî<åH=ä<á„=ÿìä =ïá¼=è¯áö4¯áîÀ~åè=äÀ~á$>ÿì÷åÈPåP>äÈPáŒ>ð¨>öôé?åçäçæááxýâ1âLiå4?ä4ê@ýä?ÜPåp?äÜPá¬?ÿìäÈ?ä$ª÷¯ñÔ~åô?äÔ~á0@ÿìäL@ïáh@ÿä¯áîøPå”@äøPáÐ@ÿìäì@ïáAè×ùXÚñŒ åبáDA(Qåtªå\0åTAä\0áAÿìä¬AïáÈAè¯áêäAè¯áÿêX@åBäX@áLBÿìähBïí×ñh@å”Bäh@áÐBâÿèäìBCëÿé˜Cè~å$Cäè~á`Cÿìä|Cïÿáx@å¨Cäx@áäCâÿèåDïý DhQå,DähQáhDÿìä„Dþ «í$Ehbå°DähbáìDÿìäEïí×í¨EØ å4EäØ ápEÿìäŒEä¯èí¯áîÄ åÓåˆQåÈEÔEæ â„nê$!åôEê„F0åFä0áLFÿìähFþ «íœF˜0å”F`§çå¬FäáèFÿìäGïá GøL“ ½ü>\þöЈþö=Dˆ›Ÿì†Òö<¤ˆ›Ÿì†Òöð†ƒùˆ›‘Òöʆˆþöò†ƒù:؆ˆ›Ÿì†óßööüöƒù9ðˆ›™ò†óßö94ˆ›™†ì†óßöˆ›‘ÒöÞ†öð†ƒùÔˆþöð†ƒùöƒùЈþö6¨ˆ›Ÿì†Òöüüöƒùˆ›‘óßööƒù5 ˆ›™†ì†Òöð†ƒùöƒù4Hˆ›Ÿì†óßöüü3Œ†ˆ›Ÿì†Òö2܈›™ò†óßö2 ˆ›­ì†ì†Òööƒùüüüü1(ˆ›™†ì†óßöЈþöЈþöøƒùöüò†ƒùñöƒù/ˆ›™†ì†Òöüüöƒù(´“®)ÄŽ+Àþ––˜.þ–’,@–˜þ–˜þ˜¦Üü–üêêêêêê)Üþ˜*äþ–’*˜þ–’)¼)0¸(Ä›ãöð†ƒùøƒùˆ›‘óßöüüö†üöƒùøƒùüü&Àˆ›»ì†ì†ìØö&ˆ›™†ìØö%t†ˆ›‘Òö$¸†ˆ›­ì†ì†óßööƒùüü$†ˆ›ãöüü#dˆ›Ÿì†Òöò†ƒùøƒùøƒùˆ›‘ÒöЈŸßö!„†ˆ›Ÿì†Òö ðˆ›ŸìØö쌃óƒù †ˆ›Ÿì†ÒöüüЈþö ˆ›‹†ÒöüüÜ“ ½üìþö0†ˆ›Ÿì†ÒöЈþööƒù †ˆ›Ÿì†ÒööƒùЈþö؈›™†ì†óßöüüöƒùˆ›ãöˆ›‘Òö„“ ½ü”þö¼†ˆ›™ò†Òööƒùö†üð†ƒùöƒù¨ˆ›™†ì†óßöð†üЈþööƒùЈþöˆ›‘ÒöÞ†öˆ›™†ì†ÒöXˆ›™ò†Òöð†ƒùœˆ›Ÿì†Òöð†ˆ›Ÿì†Òö4†ˆ›™†ì†óßö„ˆ›™†ì†Òö Ô†“® ðŽ–˜,’l–˜þ–˜þ˜¦Üü–üêêêêêê  ¼’ ˜ þ–’ 0˜þ–’ è \¸ ð›ãöøƒù (ˆ›Ÿì†Òö ˜†ˆ›‘Òö¼ˆ› ˆì†ä†‹á†Òöˆ›„ßöüüȆ“®äŒìä‚΂ˆ’ü–ü—ÉP¸ä›ãöð†ƒù؃ò„þùïІˆ›ãöЈþöˆ›‘Òö(†ˆ›™ò†Òöð†üöƒùl†ˆ›‘Òöð†ƒùöƒùhˆ›»ìò†ì†Òötˆ›Lì†ì†ì†ì†Òööƒùöƒùÿœˆ›ŸìØöþÔ†ˆ›™†ì†Òööüþˆ›¯Ü†‹ˆþöüüøƒùüüüüüüˆ›‘Òöò†ƒùˆ›‘óßööƒùö†üöƒùˆ›‘óßö΃§ò„ò„þùïöƒùöƒùö†üЈþöˆ›ãöüüùd†ˆ›Ÿì†óßöˆ›‘óßööƒùˆ›‘óßöð†ƒùüü÷dˆ›­ìòùßööƒùˆ›‘Òöˆ›‘Òöõ ˆ›‹Øöôô†ˆ›Ÿì†óßöôDˆ›­ì†ì†Òöøƒùò†ƒùüüö†üöüóH†ˆ›„ßööüöƒùöüì̆“®íèŽïäþ––˜ò(þ–’ðd–˜þ–˜þ˜¦Üü–üêêêêêêîþ˜ïþ–’î(˜þ–’íàíT¸ìè›ãöÔˆ›ãö뼈›­ìò†óßöˆ›‘óßöꘈ›Ÿì†Òöé솈›‹†Òöéh†ˆ›ãöˆ›‘Òöˆ›ãö爆ˆ›»ìòò†ÒöæØˆ›™†ì†Òöˆ›‘Òöʆˆþööüˆ›‘Òö䬈›Ÿì†óßöãðˆ›™†ìØööƒùöƒù㈛‹†Òöâ@ˆ›»ìòò†Òöøƒùöƒùöƒùá4ˆ›­ì†ì†Òöàl†ˆ›™†ì†Òöˆ›‘Òöˆ›‘ÒöÞŒ†ˆ›»ì†ìò†ÒöÝøˆ›Ÿì†Òöøƒùüüöƒùöƒùˆ›‘óßöÜtˆ›Ÿì†Òöö†üöƒùÛTˆ›Ü,ìòò†ì†óßöÚ˜ˆ›™†ì†óßöøƒùÙ¸†ˆ›­ì†ì†Òöˆ›‘óßöØ„ˆ›­ì†ìØö×䈛‹†Òöˆ›‘óßöÖÀˆ›ŸìùßöÕø†ˆ›­ì†ì†Òöˆ›‘óßöö†üÔ´ˆ›­ì†ì†ÒöÔ†ˆ›Ÿì†ÒöÓtˆ›Ÿì†ÒöÒ¬†ˆ›™†ì†ÒöÒ †ˆ›Ÿì†ÒöÑ@ˆ›»ì†ì†ìØöË“®Ì(ŽÎ$þ––˜Ðhþ–’Τ–˜þ–˜þ˜¦Üü–üêêêêêêÌ@þ˜ÍHþ–’Ìh˜þ–’Ì Ë”¸Ë(›ãöÄð“®ÆŽÇüþ––˜Ê@þ–’È|–˜þ–˜þ˜¦Üü–üêêêêêêÆþ˜Ç þ–’Æ@˜þ–’ÅøÅl¸Å›ãööƒùĈ›™†ì†ÒöÃl†ˆ›Ÿì†Òööƒùö†üˆ›™†ìØöøƒùÁ¼ˆ›™†ì†ÒöÁ,†ˆ›‘Òöò†ƒùÀX†ˆ›™ò†óßö¿Äˆ›Ÿì†ÒöЈþöð†ƒùøƒùЈŸßö½ø†ˆ›­ìò†Òöˆ›‘óßö¼Ä†ˆ›Ÿ‹á†Òö¼@†ˆ›‘Òö»¬ˆ›‹†Òö» ˆ›Ÿì†Òöˆ›‘óßööüøƒù¹¨†ˆ›Ÿì†óßöö†üüüò†ƒùüüˆ›‘Òö¸Hˆ›Ÿì†Òöñ·|ˆ›Ÿì†ÒöøƒùΆˆþö¶Hˆ›™ò†Òöµ¨ˆ›Ÿì†Òöµˆ›‹ØöÔˆ›ãö®€“®¯Ž±Œþ––˜³Ðþ–’² –˜þ–˜þ˜¦Üü–üêêêêêꯨþ˜°°þ–’¯Ð˜þ–’¯ˆ®ü¸®›ãö­Äˆ›­ìòùßöˆ›‘óßööƒùöƒù¬Lˆ›­ì†ì†Òööƒù«ˆ›Ÿì†ÒöªÈ†ˆ›™ò†óßöˆ›‘óßö©”ˆ›­ì†ì†Òöˆ›‘óßöЈþöˆ›‘óßöð†ƒù§hƒ¹þ‹é„ò„ò„þô„þùþ󦬈›™ò†ÒööƒùΆˆþö¥tˆ›™†ì†óßö¤¸ˆ›™òØö¤ †ˆ›Ÿì†Òö£ˆ†ˆ›„ßöˆ›‘Òö¢d†ˆ›Ÿì†Òö¡Ðˆ›Ÿì†ÒöøƒùÞ†ö Ìˆ›Ÿìùßö <†ˆ›ãöŸœ†ˆ›Ÿì†Òöò†ƒùüüˆ›‘óßöžl†ˆ›‘Òö΃§ò„ò„þùïöƒùPˆ›Ÿì†Òöüüò†ƒùˆ›‘Òöüü›è†ˆ›Ÿìùßöˆ›‘Òöüüˆ›ãöš0†ˆ›Ÿì†Òöð†ƒùüü™pˆ›Ÿì†Òöˆ›‘Òöˆ›‘Òöˆ›‘Òö—(†ˆ›‘‹Çö–xˆ›™†ì†Òöˆ›‘Òö•d†ˆ›ãö”Ј›Ÿìùßö”†ˆ›™†ì†Òöˆ›‘Òööƒùöüüüð†ƒùöƒù’Tˆ›™†ì†Òöüü‘lˆ›»ìòò†ÒöÔˆþöˆ›‘Òöø†ˆ›‘Òöˆ›‘Òööƒùöƒùˆ›‘Òöˆœ“®‰¬Ž‹¨þ––˜ìþ–’Œ(–˜þ–˜þ˜¦Üü–üêêêêêê‰Äþ˜ŠÌþ–’‰ì˜þ–’‰¤‰¸ˆ¬›ãööƒùøƒùöƒùˆ›„ßö‡†ˆ›™†ì†Òö†`†ˆ›‹†Òö€8†“®TŽƒPþ––˜…”þ–’ƒÐ–˜þ–˜þ˜¦Üü–üêêêêêêlþ˜‚tþ–’”˜þ–’L€À¸€T›ãöˆˆ›™†ì†Òöð†ƒù~̈›Ÿì†óßööƒùˆ›‘óßö}Œˆ›Ÿì†Òööƒù||ˆ›}Tì†ì†ì†ì†Òöüü{xˆ›|Pì†ì†ì†ì†Òöð†ƒùÌ«þò„þæ„üò÷öƒùz0ˆ›Ÿì†óßöˆ›‘Òöy†ˆ›Ÿì†Òöˆ›ãöw舛‹†óßöð†ƒùˆ›ãöó̇ü”„þò„þè÷ˆ›‘Òöò†ƒùÀ‡ü „þò„þò„þè÷Úƒˆ“þùþéüüö†üð†ƒùsØ“ ½üsèþös,†ˆ›Ÿì†óßöö†üøƒùrH†ˆ›™ò†óßöˆ›‘Òöøƒùq †ˆ›‹ØöpP†ˆ›™ò†óßöð†ƒùЈþöoL†ƒ±þô„ò„þô„þùþñnh†ƒo@þô„þô„þô„þô„þô„þô„ò„þô„þùþñöƒùm€ˆ›»ìò†ì†Òöl`“ ½ülpþök´†ˆ›Ÿì†Òööƒùüüjôˆ›Ÿì†ÒöjTˆ›Ÿì†óßöüüˆ›ãöò†ƒùhà†ˆ›™ò†óßöh†ˆ›©ÛŸò„÷Óöˆ›‘ÒöЈþööƒùfLˆ›™ò†Òööƒùð†üetˆ›Ÿì†ÒödÔˆ›Ÿì†Òöd4ˆ›‹†óßöð†ƒùc\ˆ›™òØöb°†ˆ›Ÿì†Òöbˆ›™†ì†ÒöÒƒ›þ‹é„þùþó`üˆ›ŸìØö`@ˆ›™†ì†Òö_ ˆ›‹†Òöð†ü^Ȉ›™†ì†óßö^ ˆ›­ì†ì†Òööƒù]4ˆ›­ì†ì†Òööƒù\xˆ›ŸìØöò†ƒùˆ›‘Òöˆ›‘ÒöZȆˆ›‘ÒöʆˆþöŸ›‹ØöʆˆŸßööƒùX€ƒY0ò„„þ‘ü¤þò„þò„þâþóˆ›ãöÞˆþöWˆ›Ÿì†ÒöVTˆ›™†ì†óßöU´ˆ›Ÿì†Òöð†ƒùð†ƒùüüʆˆþöTˆ›Tèì†ì†ì†ì†ÒöüüSDˆ›­ì†ìùßöR´†ˆ›‘óßöRˆ›™†ì†óßöQdˆ›‹Øöˆ›‘ÒöPP†ˆ›‘ÒöЈŸßöüüЈþöЈþöHì“®IüŽKøþ––˜N<þ–’Lx–˜þ–˜þ˜¦Üü–üêêêêêêJþ˜Kþ–’J<˜þ–’IôIh¸Hü›ãöüüHL†ˆ›‘Òöøƒùð†ƒùöƒùGhˆ›Ÿì†ÒöF؆ˆ›‘ÒöüüFD†ˆ›‘Òöˆ›‘ÒöE,ˆ›‹†óßöˆ›‘óßöDˆ›Ÿì†óßöˆ›‘ÒöBȆƒˆCl΄þ‹ˆ‘Õþé=0“®>@Ž@d–˜B|’@¼–˜þ–˜þ˜¦Üü–üêêêêêê>X@ ’>T˜?`þ–’>€˜þ–’>8=¬¸=@›ãö؃ò„þùï;†ˆ›»‹ˆŸì†Èòò†Òö5t“®6„Ž8€þ––˜:Äþ–’9–˜þ–˜þ˜¦Üü–üêêêêêê6œþ˜7¤þ–’6Ęþ–’6|5ð¸5„›ãöð†ƒùÌ«þÚ„üˆ„þè÷üüð†ƒùˆ›‘Òöò†ƒù3€ˆ›‹†óßöˆ›‘Òö24†ˆ›™†ì†Òö0d†ƒ2(ò„ò„ò„ò„ò„ò„ò„þô„ò„ò„ò„ò„ò„ò„ò„þô„þô„þô„þô„þô„þùþóð†üˆ›‘óßö/†ˆ›™†ì†óßöüü.dˆ›‹†óßööƒùˆ›‘óßöˆ›‘óßöüüð†ü,Xˆ›™†ì†Òöð†ƒùˆ›‘óßö*üˆ›™†ì†óßö*\ˆ›‹†óßöˆ›‘Òöð†ƒù)ˆ›™†ìùßööƒù((ˆ›™ò†óßöð†ƒùð†ƒùˆ›‘Òööƒù&¤†ˆ›Ÿì†Òöøƒù%øˆ›‹†óßö%<ˆ›­ì†ìØöʆˆŸßööüöƒùˆ›ãö#0†ˆ›©ÛŸò„÷Óööƒù"€ˆ›Ÿì†Òö!Ô†ˆ›‹Øöò†ƒù!(ˆ›‹†ÒöЈþö舛»ì†ì†ìØööü †ˆ›Ÿì†Òööüð†ü,†ˆ›™†ì†ÒöŒ†ˆ›ŸìØöø~þò„þò„þò„þæ„üò÷öƒù<ˆ›Ÿì†Òö†ˆ›Ÿì†ÒöЈþö“ ½ü$þöL†ˆ›™†ì†Òöœˆ›™†ìùßöàˆ›™†ìùßöÌ«þÚ„üˆ„þè÷öƒùð†ƒùüü“®Ž þ––˜Pþ–’Œ–˜þ–˜þ˜¦Üü–üêêêêêê(þ˜0þ–’P˜þ–’|¸›ãö 4†ˆ›Ÿ‹„þ‹ˆŸì†„þ‹ˆŸì†p„þ‹ˆ­ì†ì†Ü„þ‹ˆ­ì†ì†H„þ‹ˆ­ì†ì†Ð„þô„þô„þô„þô„þô„þ <„þ‹ˆ­ì†ì† Ä„þ‹ˆŸì† „þ‹ˆ­‹á†ì† Œ„þ‹ˆ™†ì† ø„þ‹ˆ­‹ €þô„þô„þô„þô„þô„ò„þô„þô„þô„þô„þùþÙ†ì†ÕþÙ†Òöhˆ›§ò†ì†ÒöȈ›ŸìØö ˆ›™†ì†ÒöT†ƒˆˆ­‹á†ì†Ø¸†ƒˆˆ­ì†ì†ØÂˆ›‘Òö°†ˆ›‘ÒööƒùȈ›Ÿ‹ˆò„þÄ„þ‹§þô„þô„þùÕ„þê„þô„ò„÷׆ÒöÿÌ“†<Œ`ˆ’ü‚ˆ’êÊ‚ˆ’Âü–üêö€øþöÿÜ›™†ìùßöÿ †ˆ›‹†óßööƒùöƒùþTˆ›Ÿì†Òöüüˆ›‘ÒöÀ‡ü „þò„þò„þè÷üŒ†ˆ›Ÿì†Òöûôƒü€þô„þô„þô„ò„þô„þùþóûˆ›©ÛŸò„÷ÓöúLˆ›µä†‹á†Òöˆ›„ßöøä†ˆ›»ìòò†ÒöЃþ‹é„þùþñüü÷̆ˆ›Ÿì†óßöˆ›‘Òöö†üó|“ô6ôìŒö܈’öh‚ˆ’—ÓÊ‚ˆ’õü–õØþõ$—ˆ™†ìùÇöô0ôÈøþö󌛙†ìùßöò܈›‹ùßöøƒùò$ˆ›‹†óßöñ„ˆ›Ÿìùßö̆ƒŽü˜þò„þåöƒùˆ›ãöïð†ˆ›‘óßöò†ƒùö†üò†ƒù™†ì†óßöüüò†ƒùî8ˆ›Ÿì†óßöÔˆþö̇ü”„þò„þè÷켆ˆ›Ÿì†Òöëp†ƒˆˆ­‹ì°þô„þô„þô„þô„þô„þô„þùþÙ†ì†Øöƒùˆ›‘Òöê ˆ›™ò†Òöð†ƒùãÜ“®äìŽæèþ––˜é,þ–’çh–˜þ–˜þ˜¦Üü–üêêêêêêåþ˜æ þ–’å,˜þ–’äääX¸ãì›ãöã8ˆ›™ëŠÕö☈›ŸìØöˆ›ãöáL†ˆ›™†ì†Òöüüਈ›Ÿì†Òöß숛™†ì†Òöüüö†üð†ƒù߈›Ÿì†Òöˆ›‘óßöÝ숛‹†óßöˆ›‘ÒöÜ0ƒˆˆ­‹ÝPþô„þô„þô„ò„þô„þùþÙ†ì†ØÖpˆ›Ÿ‹Üþô„þЄþ‹ˆá„þÚÌ„þ‹ˆÛ|ä†ì†ìÙà„þ‹ˆÚ‹áê†ìÖ„ò„ò„ò„ò„þô„ò„þô„è„þê„þô„ò„ò„Ø$„þبò„ì„þî„þù×<„þØ þî„þî„þî„þî„þî„þùç„÷þÙ†ÒöÕà†ˆ›‘óßöÕ0ˆ›™†ìùßöÔˆþöÔ†ƒˆˆ­‹á†ì†ØÓhˆ›­ìò†ÒöÀ·þ΄ü”„þò„þè÷Ò$ˆ›™ò†Òöʆƒ¥þô„þô„þùþóцѢþò„þò„þÚ„üˆ„þè÷ð†üˆ›ãöÏȆƒÐdþô„þô„þô„ò„þô„þùþñÏ4ˆ›‹†ÒöΈƒˆˆ­‹á†ì†ØÍ̈›™†ìùßöö†ü͔̓þ‹Ã„þ‹þô„þùþæþñ»œ“®¼¬Ž¾¸þ––˜Ì0þ–’¿8–˜þÁœ˜þÊÈ˘ÊÌü–ºþÄ—ˆ„ÇÁÀ—Ê€þ‹Åð„þɨþ‹Êlþô„þô„þô„þô„þô„þê„þùþÉ„þ‹»þô„þô„þê„þùþÇ„þ‹Èøò„ò„ò„ò„ò„ò„ò„þô„ò„ò„ò„ò„ò„ò„ò„þô„þô„þô„þô„þô„þê„þùþá„þÆd„þ‹±þô„þê„þùþׄþì„þ‹îþé„þÃÄ„þ‹ÅÐò„ò„ò„ò„ò„ò„ò„þô„ò„ò„ò„ò„ò„ò„ò„þô„þô„þô„þô„þô„þô„þô„þô„þùþׄþê„þô„þ„„þÃTò„ò„ò„ò„ò„ò„ò„ò„÷þé„þô„þô„þô„ò„ò„þùþË¿ˆ—Á þ‹ˆ‹†À„„þ‹ˆ™†ì†Ð„þô„þô„þô„þì„þô„þê„þùþËê¼Äþ˜½Üþ–’¼ì˜þ–’¼¤¼¸»¬›ãöøƒùˆ›‘Òöüü¹à†ˆŸŠºØþô„ò„þô„þô„ò„÷Ëööƒù¹ˆ›™†ìØö¸L†ˆ›™†ì†Òö·pˆ›»‹áò†ìØö¶Ðˆ›ŸìØöüü¶0†ˆ›‘óßöˆ›‘Òö´ìƒµ þô„þô„þô„þô„þô„þô„þô„þùþó´0ˆ›™†ì†Òööƒù³<ˆ›»ì†ìò†Òö²pˆ›™†ì†Òö±´ƒ²Xþô„þô„þô„þô„ò„þô„þùþñ¯|ƒˆ±Pþ‹þô„þùþá„þØ„þ‹“þùþá„þ΄þ‹þô„þùþ°„þ‹þô„þùþá„þô„þô„þô„þô„þùþé®tˆ›¯`܆‹Ù†ìØö§Pƒ®\þô„þô„þ¬$„þ‹§þ‹® þô„þ¬Ð„þ‹“þ‹­øò„þô„þô„þØ„þ‹“þùþá„þô„þùþæþá„þùþá„þô„þùþ«Ä„þ‹þô„þùþᄪ„þ‹«”þô„ªì„þ‘ü°þò„þò„þò„þªH„þ‘ü¼þò„þò„þò„þò„þâþ§t„þ‘üªþò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þò„þâþñúþúþúþøøøúþúþúþúþúþúþüüþúþúþúþøúþúþúþö„þúþøúþøúþúþúþúþúþúþúþúþúþüúúþúþúþúþøøüþüþúþúþøúþúþúþøøøúþúþúþúþúþúþúþúþúþüüþúþúþøúþúþúþøúþúþúþúþúþúþúþúþúþúþúþúþúþøúþúþúþøøøøúþúþúþúþúþøúþúþøúþúþúþøøøøøö„þøúþúþúþúþøüúúþúþúþúþúþúþúþö„þøøúþúþüüþúþúþúþúþö‚øúþøúþúþúþúþúþö„þúþúþúþøúþúþúþøøúþúþøúþúþúþüüþøúþúþüþüþúþúþúþøúþúþúþøúþøúþøúþøúþúþøúþúþúþúþøúþúþúþúþøúþøøøøúþúþúþøúþüüþúþúþúþúþøøúþúþøúþøúþøøøüþüþúþúþúþøö‚úþúþøüþüþúþúþúþúþúþúþúþúþúþüúúþüþüþúþúþúþúþøúþøúþøúþøøúþúþúþö„þúþøøúþúþúþúþúþúþúþúþôˆúøúþúþúþúþúþúþúþúþúþúþúþøúþøúþúþúþúþúþúþúþúþøúþúþúþøúþúþøøö„þúþúþúþúþúþúþúþúþúþúþúþúþøúþøøøøøúþúþøúþúþúþøøúþúþúþúþúþúþøúþúþúþøüüþö„þúþúþö‚úþúþúþüþüþøúþúþúþúþúþúþö‚úþúþôˆüþüþüþúþúþúþøúþúþøúþúþúþøúþúþö‚úþúþúþúþøúþüþüþúþúþøüþüþúþúþúþúþúþúþúþúþúþúþúþøúþúþúþúþúþúþúþúþøúþúþøúþøúþøúþúþúþúþúþúþúþúþúþúþúþúþPæ~D{dz yÐÀàêtpr„püpTÔn¨mŒmlpjXiˆfÐe,dŒc0Ì_°ò]À]\[$ZœZXøÂVXÖUhÎI|ÔFøÂECÄB$âÒê?¬êÀ=hÎ; 7(ò5H4 34Î1ˆÈ0DÞ/LÚÒ-ÔÐ*Ô*Lö)(Ü(\%œ!âüÐæPâÚÀìêÄtÚdö`ÖìôÐ Ð Pè¼ĺ€SxR¼QxO¼NN(M”LLpKàJ$J IÈHDHˆG°FF8E´D0D¬C(C˜BBXA˜@ø?t?T>ì=L=¬< <¤;ì:ø9<9¸8l8ð7P7°66(5P4 3ä2(201È0`0/¼((È& &ˆ%Ì$$l# "8"˜!ø , ´äDÜ œà0¬ŒÐ°,¨$Ø`¤HŒè 0 ¬ Ä@Üä|ø<€p|¤ÿèþ þ0ý”üÈû¬ú(úxùôøTøl÷ÌöHö¨õõLô\óàì€ìÄë@ë êê|éøètèœçàæ\æôåTå´äøã ãHâ<á€àüßxß ÞÞÝ|Ü\Û ÚÌÙHÙŒØì×h×ÈÖ ÖˆÕ¼ÔÔ|ÓÀÒ ÒHÑ ËøÄ Ä€Ã˜ÂÄÁ@ÁlÀÌ¿d¿Ⱦ ¾ˆ½ؼT¼´»»º¼¹ð¸P¸„· ·P¶°µµ°´ˆ®Ì­H­T¬˜«ܪXªœ©©°¨,¨´¦8¦|¥À¤ ¤œ££x¢Ø¡t¡Ô P °ŸŸ€žX¬œü›x›äšDšx™ô˜p˜ì—<—€–ü•x•Ø””˜“\’t‘‘ ˆÌޤˆЇ‡t†L€Ô~4~”}„|€{{8z´yyxðwPwÎv0vªuàs@s\rØq qdpàoˆmhlÈküj\jÈiôhh”g,gTf|eÜdÑ„Ð<ÏÔÍ\ˤ»»ô¹¹`¸x·Ø¶D¶Àµ8´D³x²|®«bªŽ§7DI$22ü1è1Ô1À1¬1„1p1\1H141 1 1êÂòÉVÉôÈàÈÌȸȤÈÈ|ÈTÈ@È,ÈÈÈðÇÜÇRǶÆVÆÌŸŤÅÅ|ÅhÅTÅ,ÅÅÅðÄÜÄÈĴĶÎÃî¿J¯¯".8’8R‘{Öv²uf$`ÂXˆ@5"š „bý>ñî’í ÙàØÌØ¸Ø¤ØØÕ ÓFÑ*À«jª–§CbNZFvDÎ:ö6æ3r Zf ¶ÊþRþŽö>éfãFÞÚbÔfÒÀ½Z»â©žòœúyZyÎmlBk"e cî_^W¦HžFZ0þ&v!®6¢zn ö R ¾ * Ž Žò „šúíªë*ë^ÜRԶӶ΄º¾·ÂJ`3 ,¸‚0ðpÎHÈJ·رv¦ô‹ð†œƒpiDLÌ8ÒúX¨ò4çpÞ2Ù¨ÒrÒ€Á¿ ³S àSÆSØR¾RTR€QìP`PØOOˆMnMÚLÐK¶K„JjJŠH HGöFˆCnCžAÞ@X@>@8?š>2>’=ò<R<ê;t:þ8–7n21¦0V/¨.|.$.ø-t-à+´+ˆ+\++Ø*¬*T*(*ü)Ð)¤)))(''l&R&Î%²#æ"Þ!X!>!È*ŠâvpÒhLrîjàbøÜ¦êJàÒ$  ´ ˆ 0  Ø € T ( ü Ð H . v ô`Ä<œD*Â>ÔÆêÿ€ÿˆúnúè÷$ööîõ’ô¼óÌò òHòò˜ñðØï¬ï€ï(ïüîÐîxîLî îôíÈí@í&í@ìæê|êFêÜéÂé&ç¢æ:æšåXä>ä‚ááÆà¾ßÂÜìØÒØhØ2ØRÖÕÂÓÓ¨ÑŽÑ ÑàЈÐ\ÐØÏDÎÎìÍÀÍhÍ<Í͸̌Ì`Ì4ÌÌ€ËfËäʸÊ`Ê4ʰÉÈðÇÄǘÇ@ÇÇèÆÆdÆ8Æ ÆàÅXÅ>ÅfÄÆÃøÂÞ †ÁèÀª¿R¾š¼0¼ú»6¹Ê·è¶̶–¶öµŒµpµVµt´H´ð³ij@³¬±€±T±(±а¤°x° °ô¯ȯœ¯p¯è®ήH®X«ö¨ȧL§ú¦X¥ ¥f¤ü£^£¾¢¢|¡4¡° – öŸ\œ¾›Šš¶˜2˜‚—Æ–8•´”Þ“^“ô’ÖŽdŽ Žà\È‹œ‹p‹D‹ìŠÀŠ”Š<ŠŠä‰¸‰Œ‰‰êˆZ‡º†8† †´…ˆ……pƒDƒƒì‚”‚h‚<‚丌`4¬€’€(€ðxlx–wvvÄt&tØrrœqfqàpLm®l(jjÐh´h˜h„hÚgrgìfšfÂe¸dücÄcNbdaJaŽ`Š_h_Z^‚]à\Æ\*\¦["[4ZZVÌQ²Q.QÊObOàN´N\N0N¬MLìKÀK”K¤>x>L> >˜=~==†<h;<;ä:¸:4: 8t8H88Ä7˜7l77è6¼66d6Ü5Â5†44J3è.¦,à*&* )h)¬(º'¤%Š%€$f$Î"!P 6 †æêb¦<€ôÈpDÀ,Ô¨P$ø tHðhN ¶0Zh¨ôl4¢þþ0úäöö¼õ„õÌô¤ôôäóìñèðÎðÀê¤ênêÐé¤éLé éœèçÜæ°æ„æ,ææÔå|åPå$åøäÌäDä*äãæâ|â¦áöà:à^ß¶ÝÒÛþÚtÚÚ¾ÖÐÕ˜ÕìÓÄÒäÐÊЂÏlÎ4ÎǪ̂ÌPÌ$Ì ËHËPÃ<Ã(ÃÃÃìÂØÂİÂ$ÂJÁ¶Àؾ¬¾€¾T¾ü½Ð½¤½–½<½½ä¼¸¼Œ¼¼ê»N»pº|¹b¹¦¸Ø·8··~´Š³Ü®Â®p J DðA:À5n5|3È1*0¤&|$xH´$¤ûûÞóÔèºè4èèâçxçäàâÄâŽâBàßæÞÜôÛ8ÛXÓ¸Ä0Ã\ˆ¾–¸t«´§¦\žHžD›*›— ’𑺑0ˆ¬‡ôrüp¨oÄn nŒi bà`ôV¤R2G<< <à2Ž2ø,œ+È(zØø $ ¬˜°ÿ@üùtù>ù`óDó ïøáŒàÝfÛ†ØfØØþ×Þ׾מ×~×$иÏÁ´¹ø¸¸Ð´À³ ³¾²²ô­´«5 LQŒP¾OöEZBÔ9t8¨/ò Àð"výÖåœãÁrº0§<¥¥Æž:™Ø•¾•Ö€qàcªcºZPZ,YYèQhC´/-|&¾$ü#à#Ä#°#d"H"¬!ÆãbâÑÀº¶|«5 RèGÌ- -øÌ.ÿ>óóðñÄñ(×0ÐÐÊÜɘ³l³´ˆ\…0…°wÐf¬SNØMHBBŒ:`:ŠHìŽôèÈèìÛÛ^Ú,ÚÐټ٨ٔÙlÙDÙ,×øËÌË8 b”dXJXØû¼û ûŒû¢’Ì÷,®B–Ú}."¾™èRèLàK”Jh@= 9h!˜¾l£H¢  Ì›Ęì“äÜ,rtað\8\,VàC”4\»H·î¨jg¢Ê&KúDÞBb$ú"ò Âòú÷š¬Þ«Ê—RÎÊ|Æ{Öx&pRU^TªP:Cê;‚æü¢÷¾ÚªÊ¦«@KæIòCøBsyncevolution-1.5/src/synthesis/src/Targets/sysytool/sysytool_x86_prefix.h0000755000373300037200000000022112424517753030771 0ustar00nightlyallusers00000000000000// prefix file #ifdef __cplusplus #include "sysytool_x86++.mch" #else #include "sysytool_x86.mch" #endif #include "target_options.h" /* eof */ syncevolution-1.5/src/synthesis/src/Targets/sysytool/target_options.h0000755000373300037200000001133412424517753030052 0ustar00nightlyallusers00000000000000/* Target options * ============== * * */ // Most hyperglobal definitions, might even influence global_options.h: // - THIS IS THE DIAGNOSTIC TOOL #define SYSYNC_TOOL // - find out target platform #ifdef __MWERKS__ #define _WIN32 #else #define LINUX #endif // now include global switches #include "global_options.h" // - is a standalone APP #define STANDALONE_APP 1 // Identification strings #define CUST_SYNC_MAN SYSYNC_OEM // manufactured by ourselves #define CUST_SYNC_MODEL "SySync SyncML Diagnostic Tool" #define CUST_SYNC_FIRMWARE NULL // no firmware #define CUST_SYNC_HARDWARE NULL // no hardware // String used to construct logfile names #define TARGETID "sysytool" // general comments #define VERSION_COMMENTS "Internal Synthesis AG Version" // Eval limit options // ================== // - if defined, server will have a restriction on concurrent sessions // from different devices. #define VERSION_COMMENTS "Limited to 1 simultaneous sync sessions" // - if defined, software will stop working as demo after defined date #define EXPIRES_AFTER_DATE 1 // - if defined, software will stop specified number of days after // first use #undef EXPIRES_AFTER_DAYS // - variant #define SYSER_VARIANT_CODE SYSER_VARIANT_PRO // - if defined, software can be registered #define SYSER_REGISTRATION 1 // - define allowed product codes (any server) #define SYSER_PRODUCT_CODE_MAIN SYSER_PRODCODE_SERVER_PRO #define SYSER_PRODUCT_CODE_ALT1 SYSER_PRODCODE_SERVER_STD #define SYSER_PRODUCT_CODE_ALT2 SYSER_PRODCODE_SERVER_DEMO #define SYSER_PRODUCT_CODE_ALT3 SYSER_PRODCODE_SERVER_XML2GO #undef SYSER_PRODUCT_CODE_ALT4 // - define needed product flags #define SYSER_NEEDED_PRODUCT_FLAGS 0 // no ISAPI/APACHE flag needed for XPT #define SYSER_FORBIDDEN_PRODUCT_FLAGS 0 // Database support options // ======================== // - if defined, SQL support is included #define SQL_SUPPORT 1 #define ODBCAPI_SUPPORT 1 #define SQLITE_SUPPORT 1 // - if defined, ODBC DB mapping of arrays to aux tables is supported #define ARRAYDBTABLES_SUPPORT 1 // - if defined, SDK support is included // #define SDK_SUPPORT 1 // #define PLUGIN_DLL 1 // - define what SDK modules are linked in //#define DBAPI_DEMO 1 #define DBAPI_TEXT 1 //#define FILEOBJ_SUPPORT 1 #define ADAPTITEM_SUPPORT 1 #define JNI_SUPPORT 1 // SySync options // ============== // - if defined, debug code is included (not necessarily enabled, depending on debug mask) // if 1, only "public" debugging is enabled, if >1, all debugging is enabled #ifdef RELEASE_VERSION #define SYDEBUG 1 #else #define SYDEBUG 2 #endif #define CONSOLEINFO 1 // %%% include all profiling //#define TIME_PROFILING 1 //#define MEMORY_PROFILING 1 // - if defined, support for configurable types will be included #define CONFIGURABLE_TYPE_SUPPORT 1 // - if defined, object filtering will be included #define OBJECT_FILTERING 1 // - if defined, procedure interpreter features will be included #define SCRIPT_SUPPORT 1 // - if defined, superdatastores will be included #define SUPERDATASTORES 1 // - if defined, array field support will be included #define ARRAYFIELD_SUPPORT 1 // do not modify remote IDs in any way while processing them #define DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS 1 // ODBC options // ============ // No SEH around ODBC calls #define NO_AV_GUARDING 1 // SyncML Toolkit options // ====================== // if defined, the entire complicated and thread-unsafe workspace manager // is completely bypassed #define NOWSM 1 /* correct tagging of payload with 1sec for lock, 2=log all lock enter/leave ops */ //#define __DEBUG_LOCKS 1 // we want the toolkit linked static #define __LINK_TOOLKIT_STATIC__ 1 // we want the XPT linked static #define LINK_TRANSPORT_STATICALLY 1 // - select transports #define INCLUDE_HTTP_STATICALLY //#define INCLUDE_OBEX_STATICALLY //#define INCLUDE_WSP_STATICALLY // Verbose XPT debug only if high debug level #if SYDEBUG>2 // switch on tracing for XPT #define TRACE 1 #define TRACE_TO_STDOUT 1 // use global localOutput() function // Debug options for OBEX (smlobex) // - define one or several of these //#define DEBUGALL // also hex-dumps all!! IrDA traffic #define DEBUGFLOW #define DEBUGINFO #define DEBUGERROR #endif syncevolution-1.5/src/synthesis/src/Targets/sysytool/version.rc0000755000373300037200000000241012424517753026646 0ustar00nightlyallusers00000000000000/////////////////////////////////////////////////////////////////////// // // Version // #include #include "target_options.h" 1 VERSIONINFO FILEVERSION SYSYNC_VERSION_MAJOR,SYSYNC_VERSION_MINOR,SYSYNC_SUBVERSION,SYSYNC_BUILDNUMBER PRODUCTVERSION SYSYNC_VERSION_MAJOR,SYSYNC_VERSION_MINOR,SYSYNC_SUBVERSION,SYSYNC_BUILDNUMBER FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #if SYDEBUG>1 FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_DLL FILESUBTYPE VFT2_UNKNOWN BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", VERSION_COMMENTS "\0" VALUE "CompanyName", "Synthesis AG - www.synthesis.ch\0" VALUE "FileDescription", "Synthesis SyncML Diagnostic Tool\0" VALUE "FileVersion", SYSYNC_VERSION_STRING "\0" VALUE "InternalName", "sysytool\0" VALUE "LegalCopyright", "Copyright (C) 2004-" RELEASE_YEAR_TXT " by Synthesis AG\0" VALUE "OriginalFilename", "sysytool.exe\0" VALUE "ProductName", "Synthesis SyncML Diagnostic Tool\0" VALUE "ProductVersion", SYSYNC_VERSION_STRING "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END syncevolution-1.5/src/synthesis/src/Transport_interfaces/0000755000373300037200000000000012424517753025514 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/0000755000373300037200000000000012424517753026761 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/engine_client.h0000755000373300037200000000077612424517753031752 0ustar00nightlyallusers00000000000000/* client engine (w/o internal transport) generic header file * */ #ifndef ENGINE_CLIENT_H #define ENGINE_CLIENT_H /* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #include "engine_client_precomp.h" /* headers not suitable for / entirely included in precompilation */ // sysync core #include "sysync.h" // platform utilities //#include "platform_utils.h" // classes #include "engineclientbase.h" /* globals */ #endif // ENGINE_CLIENT_H /* eof */ syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/engine_client_precomp.h0000755000373300037200000000133212424517753033464 0ustar00nightlyallusers00000000000000/* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) * */ #ifndef ENGINE_CLIENT_PRECOMP_H #define ENGINE_CLIENT_PRECOMP_H /* precompiled portion for SySync Core */ #include "sysync_precomp.h" #ifdef __EPOC_OS__ // Symbian/EPOC: #elif __INTEL__ // Windows32: nothing special #elif defined(__MC68K__) // PalmOS: nothing special #elif defined(LINUX) // Linux: nothing special #elif defined(MACOSX) // MacOSX: nothing special #elif defined(WINCE) // WinCE/PocketPC: nothing special #elif defined(_MSC_VER) // Visual C++: nothing special #else #error "Engine Client is Win32/PalmOS/PocketPC/Linux only at this time" #endif #endif // ENGINE_CLIENT_PRECOMP_H // eof syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/engine_server.h0000644000373300037200000000077712424517753032000 0ustar00nightlyallusers00000000000000/* server engine (w/o internal transport) generic header file */ #ifndef ENGINE_SERVER_H #define ENGINE_SERVER_H /* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #include "engine_server_precomp.h" /* headers not suitable for / entirely included in precompilation */ // sysync core #include "sysync.h" // platform utilities //#include "platform_utils.h" // classes #include "enginesessiondispatch.h" /* globals */ #endif // ENGINE_SERVER_H /* eof */ syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/engine_server_precomp.h0000644000373300037200000000133612424517753033515 0ustar00nightlyallusers00000000000000/* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #ifndef ENGINE_SERVER_PRECOMP_H #define ENGINE_SERVER_PRECOMP_H /* precompiled portion for SySync Core */ #include "sysync_precomp.h" #ifdef __EPOC_OS__ // Symbian/EPOC: #elif __INTEL__ // Windows32: nothing special #elif defined(__MC68K__) // PalmOS: nothing special #elif defined(LINUX) // Linux: nothing special #elif defined(MACOSX) // MacOSX: nothing special #elif defined(WINCE) // WinCE/PocketPC: nothing special #elif defined(_MSC_VER) // Visual C++: nothing special #else #error "Engine Client is Win32/PalmOS/MacOS/PocketPC/Linux only at this time" #endif #endif // ENGINE_SERVER_PRECOMP_H // eof syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/engineclientbase.cpp0000755000373300037200000000573312424517753032777 0ustar00nightlyallusers00000000000000/* * TEngineClientBase * Engine library specific descendant of TSyncClientBase * Global object, manages starting of client sessions. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2007-09-04 : luz : Created * */ #include "prefix_file.h" #include "engine_client.h" #include "engineclientbase.h" namespace sysync { #ifndef SYSYNC_SERVER // if there is also a server in the system, it will define AppConsolePuts so we don't need it here // write to platform's "console", whatever that is void AppConsolePuts(const char *aText) { // Just print to platform's console PlatformConsolePuts(aText); } // AppConsolePuts #endif // no SYSYNC_SERVER included // TEngineClientCommConfig // ======================= // (dummy at this time) // config constructor TEngineClientCommConfig::TEngineClientCommConfig(TConfigElement *aParentElementP) : TCommConfig("engineclient",aParentElementP) { // do not call clear(), because this is virtual! } // TEngineClientCommConfig::TEngineClientCommConfig // config destructor TEngineClientCommConfig::~TEngineClientCommConfig() { // nop by now } // TEngineClientCommConfig::~TEngineClientCommConfig // init defaults void TEngineClientCommConfig::clear(void) { // init defaults // %%% none for now // clear inherited inherited::clear(); } // TEngineClientCommConfig::clear #ifndef HARDCODED_CONFIG // XPT transport config element parsing bool TEngineClientCommConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements /* if (strucmp(aElementName,"xxx")==0) expectBool(fXXX); else */ return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TEngineClientCommConfig::localStartElement #endif // resolve void TEngineClientCommConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings // %%% tbd } // resolve inherited inherited::localResolve(aLastPass); } // TEngineClientCommConfig::localResolve // TEngineClientBase // ================= // constructor TEngineClientBase::TEngineClientBase() : TSyncClientBase() { // init } // TEngineClientBase::TEngineClientBase // destructor TEngineClientBase::~TEngineClientBase() { fDeleting=true; // flag deletion to block calling critical (virtual) methods // clean up // %%% } // TEngineClientBase::~TEngineClientBase // factory methods of Rootconfig // ============================= // create default transport config void TEngineClientRootConfig::installCommConfig(void) { // engine API needs no config at this time, commconfig is a NOP dummy for now fCommConfigP=new TEngineClientCommConfig(this); } // TEngineClientRootConfig::installCommConfig #ifndef HARDCODED_CONFIG bool TEngineClientRootConfig::parseCommConfig(const char **aAttributes, sInt32 aLine) { // engine API needs no config at this time return false; } // TEngineClientRootConfig::parseCommConfig #endif } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/engineclientbase.h0000755000373300037200000000335512424517753032442 0ustar00nightlyallusers00000000000000/* * TEngineClientBase * client library specific descendant of TSyncClientBase * Global object, manages starting of client sessions. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-05-03 : luz : Created * */ #ifndef ENGINECLIENTBASE_H #define ENGINECLIENTBASE_H // required headers #include "syncappbase.h" #include "syncclientbase.h" #include "syncagent.h" namespace sysync { // engine client root config class TEngineClientRootConfig : public TRootConfig { typedef TRootConfig inherited; public: TEngineClientRootConfig(TSyncAppBase *aSyncAppBaseP) : inherited(aSyncAppBaseP) {}; // factory methods virtual void installCommConfig(void); // Config parsing #ifndef HARDCODED_CONFIG virtual bool parseCommConfig(const char **aAttributes, sInt32 aLine); #endif }; // TEngineClientRootConfig // engine client transport config class TEngineClientCommConfig: public TCommConfig { typedef TCommConfig inherited; public: TEngineClientCommConfig(TConfigElement *aParentElementP); virtual ~TEngineClientCommConfig(); protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); virtual void localResolve(bool aLastPass); }; // TXPTCommConfig // forward declarations class TSyncSession; class TEngineClientBase; // AppBase class for all client engines (libararies with API to build custom clients) class TEngineClientBase : public TSyncClientBase { typedef TSyncClientBase inherited; public: // constructors/destructors TEngineClientBase(); virtual ~TEngineClientBase(); private: }; // TEngineClientBase } // namespace sysync #endif // ENGINECLIENTBASE_H // eof syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/enginesessiondispatch.cpp0000644000373300037200000004037212424517753034064 0ustar00nightlyallusers00000000000000/* * TEngineSessionDispatch * Server library specific descendant of TSyncSessionDispatch * * Copyright (c) 2009-2011 by Synthesis AG + plan44.ch * * 2009-02-06 : luz : Created * */ #include "prefix_file.h" #include "engine_server.h" #include "enginesessiondispatch.h" namespace sysync { // write to platform's "console", whatever that is void AppConsolePuts(const char *aText) { // Just print to platform's console PlatformConsolePuts(aText); } // AppConsolePuts // TEngineServerCommConfig // ======================= // config constructor TEngineServerCommConfig::TEngineServerCommConfig(TConfigElement *aParentElementP) : TCommConfig("engineserver",aParentElementP) { // do not call clear(), because this is virtual! } // TEngineServerCommConfig::TEngineServerCommConfig // config destructor TEngineServerCommConfig::~TEngineServerCommConfig() { // nop by now } // TEngineServerCommConfig::~TEngineServerCommConfig // init defaults void TEngineServerCommConfig::clear(void) { // init defaults fSessionIDCGIPrefix = "sessionid="; fSessionIDCGI = true; fBuffersRetryAnswer = false; // we don't know if the app driving the engine implements this, so default is off // clear inherited inherited::clear(); } // TEngineServerCommConfig::clear #ifndef HARDCODED_CONFIG // XPT transport config element parsing bool TEngineServerCommConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"buffersretryanswer")==0) expectBool(fBuffersRetryAnswer); if (strucmp(aElementName,"sessionidcgiprefix")==0) expectString(fSessionIDCGIPrefix); if (strucmp(aElementName,"sessionidcgi")==0) expectBool(fSessionIDCGI); else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TEngineServerCommConfig::localStartElement #endif // resolve void TEngineServerCommConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings // NOP for now } // resolve inherited inherited::localResolve(aLastPass); } // TEngineServerCommConfig::localResolve // TEngineSessionDispatch // ====================== // constructor TEngineSessionDispatch::TEngineSessionDispatch() : TSyncAppBase() { // this is a server engine fIsServer = true; } // TEngineSessionDispatch::TEngineSessionDispatch // destructor TEngineSessionDispatch::~TEngineSessionDispatch() { fDeleting=true; // flag deletion to block calling critical (virtual) methods // clean up // %%% } // TEngineSessionDispatch::~TEngineSessionDispatch // Called from SyncML toolkit when a new SyncML message arrives // - dispatches to session's StartMessage Ret_t TEngineSessionDispatch::StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // pointer to a TSyncAgent descendant SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ) { TSyncSession *sessionP = static_cast(aUserData); // the server session SYSYNC_TRY { // let session handle details of StartMessage callback return sessionP->StartMessage(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException(sessionP,"StartMessage",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException(sessionP,"StartMessage",NULL); SYSYNC_ENDCATCH } // TEngineSessionDispatch::StartMessage // Test if message buffering is available bool TEngineSessionDispatch::canBufferRetryAnswer(void) { // basically, we can buffer, we do it if configured return dynamic_cast(getRootConfig()->fCommConfigP)->fBuffersRetryAnswer; } // TEngineSessionDispatch::canBufferRetryAnswer // Combine URI and session ID to make a RespURI according to transport void TEngineSessionDispatch::generateRespURI( string &aRespURI, cAppCharP aLocalURI, cAppCharP aSessionID ) { TEngineServerCommConfig *commCfgP = static_cast(getRootConfig()->fCommConfigP); if (aLocalURI && aSessionID && commCfgP && commCfgP->fSessionIDCGI) { // include session ID as CGI into RespURI aRespURI=aLocalURI; // see if there is already a sessionid in this localURI string::size_type n=aRespURI.find(commCfgP->fSessionIDCGIPrefix); if (n!=string::npos) { n+=commCfgP->fSessionIDCGIPrefix.size(); // char after prefix // is already there, replace value with new value string::size_type m=aRespURI.find_first_of("&?\n\r",n); if (m==string::npos) aRespURI.replace(n,999,aSessionID); else aRespURI.replace(n,m-n,aSessionID); } else { // no sessionID yet if (strchr(aLocalURI,'?')) { // already has CGI param aRespURI+="&"; } else { // is first CGI param aRespURI+='?'; } // append session ID as CGI parameter aRespURI+=commCfgP->fSessionIDCGIPrefix; aRespURI+=aSessionID; } } } // TEngineSessionDispatch::generateRespURI // Handle exception happening while decoding commands for a session Ret_t TEngineSessionDispatch::HandleDecodingException(TSyncSession *aSessionP, const char *aRoutine, exception *aExceptionP) { #ifdef SYDEBUG // determine session name const char *sname = ""; SYSYNC_TRY { if (aSessionP) { sname = aSessionP->getLocalSessionID(); } } SYSYNC_CATCH (...) sname = ""; aSessionP=NULL; // prevent attempt to write to session's log SYSYNC_ENDCATCH // determine routine name if (!aRoutine) aRoutine=""; // show details if (aExceptionP) { // known exception // - show it in global log PDEBUGPRINTFX(DBG_ERROR,( "******** Exception in %s, sessionID=%s: %s", aRoutine, sname, aExceptionP->what() )); // - and also in session log #ifdef SYDEBUG if (aSessionP) { POBJDEBUGPRINTFX(aSessionP,DBG_ERROR,( "******** Warning: Exception in %s: %s", aRoutine, aExceptionP->what() )); } #endif } else { // unknown exception // - show it in global log PDEBUGPRINTFX(DBG_ERROR,( "******** Unknown Exception in %s, sessionID=%s", aRoutine, sname )); // - and also in session log #ifdef SYDEBUG if (aSessionP) { POBJDEBUGPRINTFX(aSessionP,DBG_ERROR,( "******** Warning: Unknown Exception in %s", aRoutine )); } #endif } #endif // try to kill session DEBUGPRINTFX(DBG_SESSION,("******** Exception aborts session")); if (aSessionP) aSessionP->AbortSession(412,true); // incomplete command // return error DEBUGPRINTFX(DBG_SESSION,("******** Exception: returning SML_ERR_UNSPECIFIC to abort smlProcessData")); return SML_ERR_UNSPECIFIC; } // TEngineSessionDispatch::HandleDecodingException // factory methods of Rootconfig // ============================= // create default transport config void TEngineServerRootConfig::installCommConfig(void) { // engine API needs no config at this time, commconfig is a NOP dummy for now fCommConfigP=new TEngineServerCommConfig(this); } // TEngineServerRootConfig::installCommConfig #ifndef HARDCODED_CONFIG bool TEngineServerRootConfig::parseCommConfig(const char **aAttributes, sInt32 aLine) { // engine API needs no config at this time return false; } // TEngineServerRootConfig::parseCommConfig #endif // TEngineServerSessionHandle // ========================== // Note: this is not a relative of TSyncSessionHandle, but only a container for TSyncAgent also // holding some engine-related status. TSyncAgent is run with a NULL TSyncSessionHandle // when called via engine, as all session dispatching is outside the engine. TEngineServerSessionHandle::TEngineServerSessionHandle(TServerEngineInterface *aServerEngineInterface) { fServerSessionP = NULL; fSmlInstanceID = 0; fServerSessionStatus = LOCERR_WRONGUSAGE; fServerEngineInterface = aServerEngineInterface; } TEngineServerSessionHandle::~TEngineServerSessionHandle() { // remove the session if still existing if (fServerSessionP) delete fServerSessionP; fServerSessionP = NULL; // also release the toolkit instance fServerEngineInterface->getSyncAppBase()->freeSmlInstance(fSmlInstanceID); fSmlInstanceID=NULL; } // TServerEngineInterface // ====================== /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. /// @param aSessionName[in] a text name/id to identify the session. If NULL, session gets a standard ID based on time and memory location /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TServerEngineInterface::OpenSessionInternal(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName) { TEngineSessionDispatch *sessionDispatchP = static_cast(getSyncAppBase()); // check type of session if (aSelector == SESSIONSEL_DBAPI_TUNNEL) { // initiate a DBAPI tunnel session. /* #ifdef DBAPI_TUNNEL_SUPPORT #error "%%% tbi" // Create a new session, sessionName selects datastore sessionHandleP->fServerSessionStatus = sessionDispatchP->CreateTunnelSession(aSessionName); if (sessionHandleP->fServerSessionStatus==LOCERR_OK) { // return the session pointer as handle %%%aNewSessionH=clientBaseP->fClientSessionP; } #else return LOCERR_NOTIMP; // tunnel not implemented #endif */ // %%% for now: not implemented return LOCERR_NOTIMP; // tunnel not implemented } else { // create a new server session TEngineServerSessionHandle *sessionHandleP = NULL; TSyncAgent *sessionP=NULL; SYSYNC_TRY { // - create a handle sessionHandleP = new TEngineServerSessionHandle(this); // - create session ID if none passed string SessionIDString; if (aSessionName && *aSessionName) { SessionIDString = aSessionName; } else { // - create unique server-side session ID // format = aaaabbbbccccdddd // - aaaa = low word of time(NULL) >> 1 (to make sure MSB is cleared) // - dddd = high word of time(NULL) // - bbbbcccc = memory address of session handle uInt64 sid = time(NULL); sid = ((sid >> 16) & 0xFFFF) + ((sid << 47) & 0x7FFF000000000000LL) + // aaaa00000000dddd ((((uIntPtr)sessionHandleP)&0xFFFFFFFF) << 16); // 0000bbbbcccc0000 // - make a string of it StringObjPrintf(SessionIDString,"%llu",(long long unsigned)sid); } // - create session object sessionP = static_cast(sessionDispatchP->getRootConfig()->fAgentConfigP) ->CreateServerSession(NULL,SessionIDString.c_str()); if (sessionP) { // assign to handle sessionHandleP->fServerSessionP = sessionP; sessionHandleP->fServerSessionStatus = LOCERR_OK; // also create a toolkit instance for the session (so we can start receiving data) if (!getSyncAppBase()->newSmlInstance( SML_XML, sessionDispatchP->getRootConfig()->fLocalMaxMsgSize * 2, // twice the message size sessionHandleP->fSmlInstanceID )) { // failed creating instance (must be memory problem) delete sessionP; return LOCERR_OUTOFMEM; } // link session with toolkit instance back and forth getSyncAppBase()->setSmlInstanceUserData(sessionHandleP->fSmlInstanceID,sessionP); // toolkit must know session (as userData) sessionP->setSmlWorkspaceID(sessionHandleP->fSmlInstanceID); // session must know toolkit workspace // created session ok aNewSessionH = (SessionH)sessionHandleP; return LOCERR_OK; } } SYSYNC_CATCH (...) // error creating session if (sessionHandleP) delete sessionHandleP; return LOCERR_EXCEPTION; SYSYNC_ENDCATCH } return LOCERR_WRONGUSAGE; } /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TServerEngineInterface::OpenSessionKey(SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode) { if (!aSessionH) return LOCERR_WRONGUSAGE; TEngineServerSessionHandle *sessionHandleP = reinterpret_cast(aSessionH); // create settings key for the session aNewKeyH = (KeyH)sessionHandleP->fServerSessionP->newSessionKey(this); // done return LOCERR_OK; } /// @brief Close a session /// @note terminates and destroys the session (if not already terminated) /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TServerEngineInterface::CloseSession(SessionH aSessionH) { if (!aSessionH) return LOCERR_WRONGUSAGE; TSyError sta = LOCERR_OK; TEngineServerSessionHandle *sessionHandleP = reinterpret_cast(aSessionH); TSyncAgent *serverSessionP = sessionHandleP->fServerSessionP; if (serverSessionP) { // session still exists if (!serverSessionP->isAborted()) { // if not already aborted otherwise (e.g. by writing "abortstatus" in session key), let it be "timeout" serverSessionP->AbortSession(408, true); } SYSYNC_TRY { // - terminate (might hang a while until subthreads properly terminate) serverSessionP->TerminateSession(); // - delete sessionHandleP->fServerSessionP = NULL; // consider deleted, whatever happens delete serverSessionP; // might hang until subthreads have terminated } SYSYNC_CATCH(...) sessionHandleP->fServerSessionP = NULL; // consider deleted, even if failed sta = LOCERR_EXCEPTION; SYSYNC_ENDCATCH } // forget session handle (and toolkit instance) delete sessionHandleP; // done return LOCERR_OK; } /// @brief Executes sync session or other sync related activity step by step /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TServerEngineInterface::SessionStep(SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { if (!aSessionH) return LOCERR_WRONGUSAGE; TEngineServerSessionHandle *sessionHandleP = reinterpret_cast(aSessionH); TSyncAgent *serverSessionP = sessionHandleP->fServerSessionP; // preprocess general step codes switch (aStepCmd) { case STEPCMD_TRANSPFAIL : // directly abort serverSessionP->AbortSession(LOCERR_TRANSPFAIL,true); goto abort; case STEPCMD_TIMEOUT : // directly abort serverSessionP->AbortSession(408,true); abort: aStepCmd = STEPCMD_STEP; // convert to normal step break; } // let server session handle it sessionHandleP->fServerSessionStatus = serverSessionP->SessionStep(aStepCmd, aInfoP); // return step status return sessionHandleP->fServerSessionStatus; } // TServerEngineInterface::SessionStep /// @brief returns the SML instance for a given session handle /// (internal helper to allow TEngineInterface to provide the access to the SyncML buffer) InstanceID_t TServerEngineInterface::getSmlInstanceOfSession(SessionH aSessionH) { if (!aSessionH) return 0; // something wrong with session handle -> no SML instance TEngineServerSessionHandle *sessionHandleP = reinterpret_cast(aSessionH); TSyncAgent *serverSessionP = sessionHandleP->fServerSessionP; if (!serverSessionP) return 0; // something wrong with session handle -> no SML instance // return SML instance associated with that session return serverSessionP->getSmlWorkspaceID(); } // TServerEngineInterface::getSmlInstanceOfSession } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/Transport_interfaces/engine/enginesessiondispatch.h0000644000373300037200000001374112424517753033531 0ustar00nightlyallusers00000000000000/* * TEngineSessionDispatch * Server library specific descendant of TSyncSessionDispatch * * Copyright (c) 2009-2011 by Synthesis AG + plan44.ch * * 2009-02-06 : luz : Created * */ #ifndef ENGINESESSIONDISPATCH_H #define ENGINESESSIONDISPATCH_H // required headers #include "syncappbase.h" #include "syncagent.h" namespace sysync { // Engine module class class TServerEngineInterface : public TEngineInterface { typedef TEngineInterface inherited; public: // constructor TServerEngineInterface() {}; // no appbase factory at this level (must be implemented in non-virtual descendants) virtual TSyncAppBase *newSyncAppBase(void) = 0; // Running a Server Sync Session // ----------------------------- /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. /// @param aSessionName[in] a text name/id to identify a session, useage depending on session type. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSessionInternal(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName); /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSessionKey(SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode); /// @brief Close a session /// @note It depends on session type if this also destroys the session or if it may persist and can be re-opened. /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError CloseSession(SessionH aSessionH); /// @brief Executes sync session or other sync related activity step by step /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SessionStep(SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP = NULL); protected: /// @brief returns the SML instance for a given session handle virtual InstanceID_t getSmlInstanceOfSession(SessionH aSessionH); }; // TServerEngineInterface // engine client root config class TEngineServerRootConfig : public TRootConfig { typedef TRootConfig inherited; public: TEngineServerRootConfig(TSyncAppBase *aSyncAppBaseP) : inherited(aSyncAppBaseP) {}; // factory methods virtual void installCommConfig(void); // Config parsing #ifndef HARDCODED_CONFIG virtual bool parseCommConfig(const char **aAttributes, sInt32 aLine); #endif }; // TEngineClientRootConfig // engine server transport config class TEngineServerCommConfig: public TCommConfig { typedef TCommConfig inherited; public: TEngineServerCommConfig(TConfigElement *aParentElementP); virtual ~TEngineServerCommConfig(); // config vars // - session ID CGI config bool fSessionIDCGI; string fSessionIDCGIPrefix; // - indicates transport can buffer answer to client until next client response, so it can be resent in case we detect a client resend. bool fBuffersRetryAnswer; protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); virtual void localResolve(bool aLastPass); }; // TXPTCommConfig // forward declarations class TSyncAgent; class TSyncSession; // session handle for engine sessions // containing engine-specific session status class TEngineServerSessionHandle : noncopyable { public: TEngineServerSessionHandle(TServerEngineInterface *aServerEngineInterface); virtual ~TEngineServerSessionHandle(); // the server engine interface TServerEngineInterface *fServerEngineInterface; // the session itself TSyncAgent *fServerSessionP; // the toolkit instance used by the session InstanceID_t fSmlInstanceID; // status of the session localstatus fServerSessionStatus; }; // AppBase class for all server engines (libararies with API to build custom servers) // Note: unlike non-engine servers, the server library bypasses TSyncSessionDispatch // completely. All actual session dispatch, thread locking, session timeout // stuff must be implemented outside the library for engine-based servers. class TEngineSessionDispatch : public TSyncAppBase { typedef TSyncAppBase inherited; public: // constructors/destructors TEngineSessionDispatch(); virtual ~TEngineSessionDispatch(); // handlers for SyncML toolkit callbacks // - Start/End Message: identifies Session, and creates new or assigns existing session Ret_t StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // pointer to a TSyncAgent descendant SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ); // - Handle exception happening while decoding commands for a session virtual Ret_t HandleDecodingException(TSyncSession *aSessionP, const char *aRoutine, exception *aExceptionP); // test if message buffering is available virtual bool canBufferRetryAnswer(void); // combine URI and session ID to make a RespURI according to transport virtual void generateRespURI( string &aRespURI, cAppCharP aLocalURI, cAppCharP aSessionID ); }; // TEngineSessionDispatch } // namespace sysync #endif // ENGINESESSIONDISPATCH_H // eof syncevolution-1.5/src/synthesis/src/client_engine_linux.mk0000644000373300037200000001363612424517753025701 0ustar00nightlyallusers00000000000000# Makefile generated by Metrowerks CodeWarrior IDE # adapted for standalone use 09/02/05 by bfo@synthesis.ch all: clientEngine clean: clean_clientEngine ####### common definitions WD=$(shell echo `pwd`) WD_OBJS=$(WD)/../OBJS CC="gcc" LD="gcc" AR="ar -crs" SIZE="size" CFLAGS= -m32 -Wall -O2 -c -MMD LDFLAGS= -m32 MAKEFILE= "client_engine_linux.mk" SYNCML_TK_SML=\ syncml_tk/src/sml/lib/all/liblock.c\ syncml_tk/src/sml/lib/all/libmem.c\ syncml_tk/src/sml/lib/all/libstr.c\ syncml_tk/src/sml/lib/all/libutil.c\ syncml_tk/src/sml/mgr/all/mgr.c\ syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c\ syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c\ syncml_tk/src/sml/mgr/all/mgrinstancelist.c\ syncml_tk/src/sml/mgr/all/mgrinstancemgr.c\ syncml_tk/src/sml/mgr/all/mgrutil.c\ syncml_tk/src/sml/xlt/all/xltdec.c\ syncml_tk/src/sml/xlt/all/xltdecwbxml.c\ syncml_tk/src/sml/xlt/all/xltdecxml.c\ syncml_tk/src/sml/xlt/all/xltdevinf.c\ syncml_tk/src/sml/xlt/all/xltenc.c\ syncml_tk/src/sml/xlt/all/xltenccom.c\ syncml_tk/src/sml/xlt/all/xltencwbxml.c\ syncml_tk/src/sml/xlt/all/xltencxml.c\ syncml_tk/src/sml/xlt/all/xltmetinf.c\ syncml_tk/src/sml/xlt/all/xlttags.c\ syncml_tk/src/sml/xlt/all/xltutilstack.c EXPAT=\ expat/xmltok/xmltok.c\ expat/xmltok/xmlrole.c\ expat/xmlparse/xmlparse.c ZLIB=\ zlib/adler32.c\ zlib/compress.c\ zlib/crc32.c\ zlib/deflate.c\ zlib/gzio.c\ zlib/infback.c\ zlib/inffast.c\ zlib/inflate.c\ zlib/inftrees.c\ zlib/trees.c\ zlib/uncompr.c\ zlib/zutil.c C_BASICS=\ $(SYNCML_TK_SML)\ $(EXPAT)\ platform_adapters/linux/platform_exec.c\ sysync_SDK/Sources/SDK_util.c\ SQLite/sqlite3.c PLATFORM=\ platform_adapters/linux/configfiles.cpp\ platform_adapters/linux/profiling.cpp\ platform_adapters/linux/platform_time.cpp\ platform_adapters/unix_common/platform_mutex.cpp\ platform_adapters/sysyncinit.cpp PLATFORM_EXT=\ $(PLATFORM)\ platform_adapters/linux/platform_DLL.cpp\ platform_adapters/unix_common/platform_thread.cpp\ platform_adapters/unix_common/platform_file.cpp BINFILES=\ platform_adapters/binfile.cpp\ sysync/binfileimplds.cpp\ sysync/binfileimplclient.cpp\ sysync/binfilebase.cpp SYSYNC=\ sysync/sysync_utils.cpp\ sysync/sysync_b64.cpp\ sysync/sysync_md5.cpp\ sysync/syncsession.cpp\ sysync/syncappbase.cpp\ sysync/lineartime.cpp\ sysync/iso8601.cpp\ sysync/stringutils.cpp\ sysync/superdatastore.cpp\ sysync/scriptcontext.cpp\ sysync/itemfield.cpp\ sysync/mimediritemtype.cpp\ sysync/mimedirprofile.cpp\ sysync/multifielditem.cpp\ sysync/multifielditemtype.cpp\ sysync/remotedatastore.cpp\ sysync/syncitem.cpp\ sysync/syncitemtype.cpp\ sysync/simpleitem.cpp\ sysync/synccommand.cpp\ sysync/syncdatastore.cpp\ sysync/textitemtype.cpp\ sysync/vcalendaritemtype.cpp\ sysync/vcarditemtype.cpp\ sysync/syncexception.cpp\ sysync/configelement.cpp\ sysync/sysync_crc16.cpp\ sysync/timezones.cpp\ sysync/rrules.cpp\ sysync/localengineds.cpp\ sysync/debuglogger.cpp\ sysync/textprofile.cpp\ sysync/dataobjtype.cpp\ sysync/stdlogicds.cpp\ sysync/stdlogicagent.cpp\ sysync/customimplagent.cpp\ sysync/customimplds.cpp\ sysync/vtimezone.cpp CLIENTENGINE=\ $(SYSYNC)\ syncapps/clientEngine_custom/clientengine_custom_Base.cpp\ Transport_interfaces/engine/engineclientbase.cpp\ sysync_SDK/Sources/enginemodulebase.cpp\ sysync/engineentry.cpp\ sysync/engineinterface.cpp\ sysync/syncagent.cpp\ sysync/syncclientbase.cpp ODBC_DB=\ DB_interfaces/odbc_db/odbcapiagent.cpp\ DB_interfaces/odbc_db/odbcapids.cpp API_DB=\ DB_interfaces/api_db/pluginapiagent.cpp\ DB_interfaces/api_db/pluginapids.cpp\ DB_interfaces/api_db/dbapi.cpp\ DB_interfaces/api_db/DLL_interface.cpp\ DB_interfaces/api_db/sync_dbapiconnect.cpp\ sysync_SDK/Sources/SDK_support.cpp # -------------------------------------------------------- INCLUDE_PLATFORM=\ -I platform_adapters/linux/\ -I platform_adapters/unix_common/\ -I platform_adapters/ INCLUDE_SYNCML_TK_SML=\ -I syncml_tk/src/sml/inc/\ -I syncml_tk/src/sml/lib/inc/\ -I syncml_tk/src/sml/lib/\ -I syncml_tk/src/sml/mgr/inc/\ -I syncml_tk/src/sml/mgr/\ -I syncml_tk/src/sml/wsm/inc/\ -I syncml_tk/src/sml/xlt/inc/\ -I syncml_tk/src/sml/xlt/all/ INCLUDE_EXPAT=\ -I expat/xmltok/\ -I expat/xmlparse/ INCLUDE_CLIENTENGINE=\ -I syncapps/clientEngine_custom/\ -I Transport_interfaces/engine/\ -I sysync_SDK/Sources\ -I sysync/\ -I ./ ############################# ####### TARGET: clientEngine ############################# WD_OBJS_clientEngine=$(WD_OBJS)/clientEngine c_SRC_clientEngine=\ $(C_BASICS) $(ZLIB) cpp_SRC_clientEngine=\ $(PLATFORM_EXT)\ $(CLIENTENGINE)\ $(BINFILES)\ $(ODBC_DB)\ $(API_DB) OBJS_clientEngine+= $(c_SRC_clientEngine:.c=.c.o) OBJS_clientEngine+=$(cpp_SRC_clientEngine:.cpp=.cpp.o) INCLUDE_clientEngine=\ -include Targets/ReleasedProducts/clientEngine_opensource_linux/clientengine_demo_x86_linux_prefix.h\ -I Targets/ReleasedProducts/clientEngine_opensource_linux/\ $(INCLUDE_PLATFORM)\ $(INCLUDE_SYNCML_TK_SML)\ $(INCLUDE_EXPAT)\ $(INCLUDE_CLIENTENGINE)\ -I DB_interfaces/odbc_db/\ -I DB_interfaces/api_db/\ -I SQLite/\ -I zlib/\ -I /usr/include/ clientEngine: $(MAKE) -f $(MAKEFILE) sysync_client_engine.so TARGET=sysync_client_engine.so\ WDOP="$(WD_OBJS_clientEngine)"\ OBJS="$(addprefix $(WD_OBJS_clientEngine)/,$(OBJS_clientEngine))"\ LIBS="-L/usr/lib32 -L/usr/lib -lstdc++ -lpthread -lltdl -lpcre"\ INCL="$(INCLUDE_clientEngine)" sysync_client_engine.so: $(OBJS) $(LD) -shared -Xlinker -soname=sysync_client_engine $(LDFLAGS) $(OBJS) $(LIBS)\ -o sysync_SDK/bin/Linux/sysync_client_engine.so ifeq ($(TARGET), sysync_client_engine.so) $(WDOP)/%.c.o: $(WD)/%.c mkdir -p $(dir $@) $(CC) -fPIC $(CFLAGS) $(INCL) $< -o $@ $(WDOP)/%.cpp.o: $(WD)/%.cpp mkdir -p $(dir $@) $(CC) -fPIC $(CFLAGS) $(INCL) $< -o $@ endif clean_clientEngine: rm -f -r $(WD_OBJS_clientEngine) syncevolution-1.5/src/synthesis/src/combi_engine_linux.mk0000644000373300037200000001431012424517753025502 0ustar00nightlyallusers00000000000000# Makefile generated by Metrowerks CodeWarrior IDE # adapted for standalone client library use 2009/02/05 by bfo@synthesis.ch # adapted for standalone server library use 2009/09/22 by luz@synthesis.ch # adapted for standalone combi (client+server) library use 2009/10/03 by luz@synthesis.ch all: combiEngine clean: clean_combiEngine ####### common definitions WD=$(shell echo `pwd`) WD_OBJS=$(WD)/../OBJS CC="gcc" LD="gcc" AR="ar -crs" SIZE="size" CFLAGS= -m32 -Wall -O2 -c -MMD LDFLAGS= -m32 MAKEFILE= "combi_engine_linux.mk" SYNCML_TK_SML=\ syncml_tk/src/sml/lib/all/liblock.c\ syncml_tk/src/sml/lib/all/libmem.c\ syncml_tk/src/sml/lib/all/libstr.c\ syncml_tk/src/sml/lib/all/libutil.c\ syncml_tk/src/sml/mgr/all/mgr.c\ syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c\ syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c\ syncml_tk/src/sml/mgr/all/mgrinstancelist.c\ syncml_tk/src/sml/mgr/all/mgrinstancemgr.c\ syncml_tk/src/sml/mgr/all/mgrutil.c\ syncml_tk/src/sml/xlt/all/xltdec.c\ syncml_tk/src/sml/xlt/all/xltdecwbxml.c\ syncml_tk/src/sml/xlt/all/xltdecxml.c\ syncml_tk/src/sml/xlt/all/xltdevinf.c\ syncml_tk/src/sml/xlt/all/xltenc.c\ syncml_tk/src/sml/xlt/all/xltenccom.c\ syncml_tk/src/sml/xlt/all/xltencwbxml.c\ syncml_tk/src/sml/xlt/all/xltencxml.c\ syncml_tk/src/sml/xlt/all/xltmetinf.c\ syncml_tk/src/sml/xlt/all/xlttags.c\ syncml_tk/src/sml/xlt/all/xltutilstack.c EXPAT=\ expat/xmltok/xmltok.c\ expat/xmltok/xmlrole.c\ expat/xmlparse/xmlparse.c ZLIB=\ zlib/adler32.c\ zlib/compress.c\ zlib/crc32.c\ zlib/deflate.c\ zlib/gzio.c\ zlib/infback.c\ zlib/inffast.c\ zlib/inflate.c\ zlib/inftrees.c\ zlib/trees.c\ zlib/uncompr.c\ zlib/zutil.c C_BASICS=\ $(SYNCML_TK_SML)\ $(EXPAT)\ platform_adapters/linux/platform_exec.c\ sysync_SDK/Sources/SDK_util.c PLATFORM=\ platform_adapters/linux/configfiles.cpp\ platform_adapters/linux/profiling.cpp\ platform_adapters/linux/platform_time.cpp\ platform_adapters/unix_common/platform_mutex.cpp\ platform_adapters/sysyncinit.cpp PLATFORM_EXT=\ $(PLATFORM)\ platform_adapters/linux/platform_DLL.cpp\ platform_adapters/unix_common/platform_thread.cpp\ platform_adapters/unix_common/platform_file.cpp SYSYNC=\ sysync/sysync_utils.cpp\ sysync/sysync_b64.cpp\ sysync/sysync_md5.cpp\ sysync/syncsession.cpp\ sysync/syncappbase.cpp\ sysync/lineartime.cpp\ sysync/iso8601.cpp\ sysync/stringutils.cpp\ sysync/superdatastore.cpp\ sysync/scriptcontext.cpp\ sysync/itemfield.cpp\ sysync/mimediritemtype.cpp\ sysync/mimedirprofile.cpp\ sysync/multifielditem.cpp\ sysync/multifielditemtype.cpp\ sysync/remotedatastore.cpp\ sysync/syncitem.cpp\ sysync/syncitemtype.cpp\ sysync/simpleitem.cpp\ sysync/synccommand.cpp\ sysync/syncdatastore.cpp\ sysync/textitemtype.cpp\ sysync/vcalendaritemtype.cpp\ sysync/vcarditemtype.cpp\ sysync/syncexception.cpp\ sysync/configelement.cpp\ sysync/sysync_crc16.cpp\ sysync/timezones.cpp\ sysync/rrules.cpp\ sysync/localengineds.cpp\ sysync/debuglogger.cpp\ sysync/textprofile.cpp\ sysync/dataobjtype.cpp\ sysync/stdlogicds.cpp\ sysync/stdlogicagent.cpp\ sysync/customimplagent.cpp\ sysync/customimplds.cpp\ sysync/vtimezone.cpp COMBIENGINE=\ $(SYSYNC)\ syncapps/serverEngine_custom/serverengine_custom_Base.cpp\ syncapps/clientEngine_custom/clientengine_custom_Base.cpp\ Transport_interfaces/engine/enginesessiondispatch.cpp\ Transport_interfaces/engine/engineclientbase.cpp\ sysync_SDK/Sources/enginemodulebase.cpp\ sysync/engineentry.cpp\ sysync/engineinterface.cpp\ sysync/syncclientbase.cpp\ sysync/syncagent.cpp ODBC_DB=\ DB_interfaces/odbc_db/odbcapiagent.cpp\ DB_interfaces/odbc_db/odbcapids.cpp API_DB=\ DB_interfaces/api_db/pluginapiagent.cpp\ DB_interfaces/api_db/pluginapids.cpp\ DB_interfaces/api_db/dbapi.cpp\ DB_interfaces/api_db/DLL_interface.cpp\ DB_interfaces/api_db/sync_dbapiconnect.cpp\ sysync_SDK/Sources/SDK_support.cpp\ sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp\ sysync_SDK/Sources/admindata.cpp\ sysync_SDK/Sources/dbitem.cpp\ sysync_SDK/Sources/blobs.cpp # -------------------------------------------------------- INCLUDE_PLATFORM=\ -I platform_adapters/linux/\ -I platform_adapters/unix_common/\ -I platform_adapters/ INCLUDE_SYNCML_TK_SML=\ -I syncml_tk/src/sml/inc/\ -I syncml_tk/src/sml/lib/inc/\ -I syncml_tk/src/sml/lib/\ -I syncml_tk/src/sml/mgr/inc/\ -I syncml_tk/src/sml/mgr/\ -I syncml_tk/src/sml/wsm/inc/\ -I syncml_tk/src/sml/xlt/inc/\ -I syncml_tk/src/sml/xlt/all/ INCLUDE_EXPAT=\ -I expat/xmltok/\ -I expat/xmlparse/ INCLUDE_COMBIENGINE=\ -I syncapps/serverEngine_custom/\ -I syncapps/clientEngine_custom/\ -I Transport_interfaces/engine/\ -I sysync_SDK/Sources\ -I sysync/\ -I ./ ############################ ####### TARGET: combiEngine ############################ WD_OBJS_combiEngine=$(WD_OBJS)/combiEngine c_SRC_combiEngine=\ $(C_BASICS) $(ZLIB) cpp_SRC_combiEngine=\ $(PLATFORM_EXT)\ $(COMBIENGINE)\ $(ODBC_DB)\ $(API_DB) OBJS_combiEngine+= $(c_SRC_combiEngine:.c=.c.o) OBJS_combiEngine+=$(cpp_SRC_combiEngine:.cpp=.cpp.o) INCLUDE_combiEngine=\ -include Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h\ -I Targets/ReleasedProducts/combiEngine_opensource_linux/\ $(INCLUDE_PLATFORM)\ $(INCLUDE_SYNCML_TK_SML)\ $(INCLUDE_EXPAT)\ $(INCLUDE_COMBIENGINE)\ -I DB_interfaces/odbc_db/\ -I DB_interfaces/api_db/\ -I SQLite/\ -I zlib/\ -I /usr/include/ combiEngine: $(MAKE) -f $(MAKEFILE) sysync_combi_engine.so TARGET=sysync_combi_engine.so \ WDOP="$(WD_OBJS_combiEngine)"\ OBJS="$(addprefix $(WD_OBJS_combiEngine)/,$(OBJS_combiEngine))"\ LIBS="-L/usr/lib32 -L/usr/lib -lstdc++ -lpthread -lltdl -lpcre"\ INCL="$(INCLUDE_combiEngine)" sysync_combi_engine.so: $(OBJS) $(LD) -shared -Xlinker -soname=sysync_combi_engine $(LDFLAGS) $(OBJS) $(LIBS) \ -o sysync_SDK/bin/Linux/sysync_combi_engine.so ifeq ($(TARGET), sysync_combi_engine.so) $(WDOP)/%.c.o: $(WD)/%.c mkdir -p $(dir $@) $(CC) -fPIC $(CFLAGS) $(INCL) $< -o $@ $(WDOP)/%.cpp.o: $(WD)/%.cpp mkdir -p $(dir $@) $(CC) -fPIC $(CFLAGS) $(INCL) $< -o $@ endif clean_combiEngine: rm -f -r $(WD_OBJS_combiEngine) syncevolution-1.5/src/synthesis/src/expat/0000755000373300037200000000000012424517753022436 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/expat/copying.txt0000755000373300037200000000210612424517753024651 0ustar00nightlyallusers00000000000000Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. syncevolution-1.5/src/synthesis/src/expat/xmlparse/0000755000373300037200000000000012424517753024271 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/expat/xmlparse/xmlparse.c0000755000373300037200000032224712424517753026305 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #include "xmldef.h" #include "xmlparse.h" #include #ifdef XML_UNICODE #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX #define XmlConvert XmlUtf16Convert #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS #define XmlEncode XmlUtf16Encode #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) typedef unsigned short ICHAR; #else #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX #define XmlConvert XmlUtf8Convert #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS #define XmlEncode XmlUtf8Encode #define MUST_CONVERT(enc, s) (!(enc)->isUtf8) typedef char ICHAR; #endif #ifndef XML_NS #define XmlInitEncodingNS XmlInitEncoding #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding #undef XmlGetInternalEncodingNS #define XmlGetInternalEncodingNS XmlGetInternalEncoding #define XmlParseXmlDeclNS XmlParseXmlDecl #endif #ifdef XML_UNICODE_WCHAR_T #define XML_T(x) L ## x #else #define XML_T(x) x #endif /* Round up n to be a multiple of sz, where sz is a power of 2. */ #define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) #include "xmltok.h" #include "xmlrole.h" typedef const XML_Char *KEY; typedef struct { KEY name; } NAMED; typedef struct { NAMED **v; size_t size; size_t used; size_t usedLim; } HASH_TABLE; typedef struct { NAMED **p; NAMED **end; } HASH_TABLE_ITER; #define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ #define INIT_DATA_BUF_SIZE 1024 #define INIT_ATTS_SIZE 16 #define INIT_BLOCK_SIZE 1024 #define INIT_BUFFER_SIZE 1024 #define EXPAND_SPARE 24 typedef struct binding { struct prefix *prefix; struct binding *nextTagBinding; struct binding *prevPrefixBinding; const struct attribute_id *attId; XML_Char *uri; int uriLen; int uriAlloc; } BINDING; typedef struct prefix { const XML_Char *name; BINDING *binding; } PREFIX; typedef struct { const XML_Char *str; const XML_Char *localPart; int uriLen; } TAG_NAME; typedef struct tag { struct tag *parent; const char *rawName; int rawNameLength; TAG_NAME name; char *buf; char *bufEnd; BINDING *bindings; } TAG; typedef struct { const XML_Char *name; const XML_Char *textPtr; int textLen; const XML_Char *systemId; const XML_Char *base; const XML_Char *publicId; const XML_Char *notation; char open; } ENTITY; typedef struct block { struct block *next; int size; XML_Char s[1]; } BLOCK; typedef struct { BLOCK *blocks; BLOCK *freeBlocks; const XML_Char *end; XML_Char *ptr; XML_Char *start; } STRING_POOL; /* The XML_Char before the name is used to determine whether an attribute has been specified. */ typedef struct attribute_id { XML_Char *name; PREFIX *prefix; char maybeTokenized; char xmlns; } ATTRIBUTE_ID; typedef struct { const ATTRIBUTE_ID *id; char isCdata; const XML_Char *value; } DEFAULT_ATTRIBUTE; typedef struct { const XML_Char *name; PREFIX *prefix; const ATTRIBUTE_ID *idAtt; int nDefaultAtts; int allocDefaultAtts; DEFAULT_ATTRIBUTE *defaultAtts; } ELEMENT_TYPE; typedef struct { HASH_TABLE generalEntities; HASH_TABLE elementTypes; HASH_TABLE attributeIds; HASH_TABLE prefixes; STRING_POOL pool; int complete; int standalone; #ifdef XML_DTD HASH_TABLE paramEntities; #endif /* XML_DTD */ PREFIX defaultPrefix; } DTD; typedef struct open_internal_entity { const char *internalEventPtr; const char *internalEventEndPtr; struct open_internal_entity *next; ENTITY *entity; } OPEN_INTERNAL_ENTITY; typedef enum XML_Error Processor(XML_Parser parser, const char *start, const char *end, const char **endPtr); static Processor prologProcessor; static Processor prologInitProcessor; static Processor contentProcessor; static Processor cdataSectionProcessor; #ifdef XML_DTD static Processor ignoreSectionProcessor; #endif /* XML_DTD */ static Processor epilogProcessor; static Processor errorProcessor; static Processor externalEntityInitProcessor; static Processor externalEntityInitProcessor2; static Processor externalEntityInitProcessor3; static Processor externalEntityContentProcessor; static enum XML_Error handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *); static enum XML_Error initializeEncoding(XML_Parser parser); static enum XML_Error doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, int tok, const char *next, const char **nextPtr); #ifdef XML_DTD static enum XML_Error processInternalParamEntity(XML_Parser parser, ENTITY *entity); #endif static enum XML_Error doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *start, const char *end, const char **endPtr); static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr); #ifdef XML_DTD static enum XML_Error doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr); #endif /* XML_DTD */ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *, const char *s, TAG_NAME *tagNamePtr, BINDING **bindingsPtr); static int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr); static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, int isCdata, int isId, const XML_Char *dfltValue); static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, STRING_POOL *); static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); static enum XML_Error storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static int reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, const char *end); static const XML_Char *getContext(XML_Parser parser); static int setContext(XML_Parser parser, const XML_Char *context); static void normalizePublicId(XML_Char *s); static int dtdInit(DTD *); static void dtdDestroy(DTD *); static int dtdCopy(DTD *newDtd, const DTD *oldDtd); static int copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); #ifdef XML_DTD static void dtdSwap(DTD *, DTD *); #endif /* XML_DTD */ static NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize); static void hashTableInit(HASH_TABLE *); static void hashTableDestroy(HASH_TABLE *); static void hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); static NAMED *hashTableIterNext(HASH_TABLE_ITER *); static void poolInit(STRING_POOL *); static void poolClear(STRING_POOL *); static void poolDestroy(STRING_POOL *); static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end); static int poolGrow(STRING_POOL *pool); static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s); static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); #define poolStart(pool) ((pool)->start) #define poolEnd(pool) ((pool)->ptr) #define poolLength(pool) ((pool)->ptr - (pool)->start) #define poolChop(pool) ((void)--(pool->ptr)) #define poolLastChar(pool) (((pool)->ptr)[-1]) #define poolDiscard(pool) ((pool)->ptr = (pool)->start) #define poolFinish(pool) ((pool)->start = (pool)->ptr) #define poolAppendChar(pool, c) \ (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ ? 0 \ : ((*((pool)->ptr)++ = c), 1)) typedef struct { /* The first member must be userData so that the XML_GetUserData macro works. */ void *m_userData; void *m_handlerArg; char *m_buffer; /* first character to be parsed */ const char *m_bufferPtr; /* past last character to be parsed */ char *m_bufferEnd; /* allocated end of buffer */ const char *m_bufferLim; long m_parseEndByteIndex; const char *m_parseEndPtr; XML_Char *m_dataBuf; XML_Char *m_dataBufEnd; XML_StartElementHandler m_startElementHandler; XML_EndElementHandler m_endElementHandler; XML_CharacterDataHandler m_characterDataHandler; XML_ProcessingInstructionHandler m_processingInstructionHandler; XML_CommentHandler m_commentHandler; XML_StartCdataSectionHandler m_startCdataSectionHandler; XML_EndCdataSectionHandler m_endCdataSectionHandler; XML_DefaultHandler m_defaultHandler; XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; XML_NotationDeclHandler m_notationDeclHandler; XML_ExternalParsedEntityDeclHandler m_externalParsedEntityDeclHandler; XML_InternalParsedEntityDeclHandler m_internalParsedEntityDeclHandler; XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; XML_NotStandaloneHandler m_notStandaloneHandler; XML_ExternalEntityRefHandler m_externalEntityRefHandler; void *m_externalEntityRefHandlerArg; XML_UnknownEncodingHandler m_unknownEncodingHandler; const ENCODING *m_encoding; INIT_ENCODING m_initEncoding; const ENCODING *m_internalEncoding; const XML_Char *m_protocolEncodingName; int m_ns; void *m_unknownEncodingMem; void *m_unknownEncodingData; void *m_unknownEncodingHandlerData; void (*m_unknownEncodingRelease)(void *); PROLOG_STATE m_prologState; Processor *m_processor; enum XML_Error m_errorCode; const char *m_eventPtr; const char *m_eventEndPtr; const char *m_positionPtr; OPEN_INTERNAL_ENTITY *m_openInternalEntities; int m_defaultExpandInternalEntities; int m_tagLevel; ENTITY *m_declEntity; const XML_Char *m_declNotationName; const XML_Char *m_declNotationPublicId; ELEMENT_TYPE *m_declElementType; ATTRIBUTE_ID *m_declAttributeId; char m_declAttributeIsCdata; char m_declAttributeIsId; DTD m_dtd; const XML_Char *m_curBase; TAG *m_tagStack; TAG *m_freeTagList; BINDING *m_inheritedBindings; BINDING *m_freeBindingList; int m_attsSize; int m_nSpecifiedAtts; int m_idAttIndex; ATTRIBUTE *m_atts; POSITION m_position; STRING_POOL m_tempPool; STRING_POOL m_temp2Pool; char *m_groupConnector; unsigned m_groupSize; int m_hadExternalDoctype; XML_Char m_namespaceSeparator; #ifdef XML_DTD enum XML_ParamEntityParsing m_paramEntityParsing; XML_Parser m_parentParser; #endif } Parser; #define userData (((Parser *)parser)->m_userData) #define handlerArg (((Parser *)parser)->m_handlerArg) #define startElementHandler (((Parser *)parser)->m_startElementHandler) #define endElementHandler (((Parser *)parser)->m_endElementHandler) #define characterDataHandler (((Parser *)parser)->m_characterDataHandler) #define processingInstructionHandler (((Parser *)parser)->m_processingInstructionHandler) #define commentHandler (((Parser *)parser)->m_commentHandler) #define startCdataSectionHandler (((Parser *)parser)->m_startCdataSectionHandler) #define endCdataSectionHandler (((Parser *)parser)->m_endCdataSectionHandler) #define defaultHandler (((Parser *)parser)->m_defaultHandler) #define startDoctypeDeclHandler (((Parser *)parser)->m_startDoctypeDeclHandler) #define endDoctypeDeclHandler (((Parser *)parser)->m_endDoctypeDeclHandler) #define unparsedEntityDeclHandler (((Parser *)parser)->m_unparsedEntityDeclHandler) #define notationDeclHandler (((Parser *)parser)->m_notationDeclHandler) #define externalParsedEntityDeclHandler (((Parser *)parser)->m_externalParsedEntityDeclHandler) #define internalParsedEntityDeclHandler (((Parser *)parser)->m_internalParsedEntityDeclHandler) #define startNamespaceDeclHandler (((Parser *)parser)->m_startNamespaceDeclHandler) #define endNamespaceDeclHandler (((Parser *)parser)->m_endNamespaceDeclHandler) #define notStandaloneHandler (((Parser *)parser)->m_notStandaloneHandler) #define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler) #define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg) #define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler) #define encoding (((Parser *)parser)->m_encoding) #define initEncoding (((Parser *)parser)->m_initEncoding) #define internalEncoding (((Parser *)parser)->m_internalEncoding) #define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem) #define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData) #define unknownEncodingHandlerData \ (((Parser *)parser)->m_unknownEncodingHandlerData) #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease) #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName) #define ns (((Parser *)parser)->m_ns) #define prologState (((Parser *)parser)->m_prologState) #define processor (((Parser *)parser)->m_processor) #define errorCode (((Parser *)parser)->m_errorCode) #define eventPtr (((Parser *)parser)->m_eventPtr) #define eventEndPtr (((Parser *)parser)->m_eventEndPtr) #define positionPtr (((Parser *)parser)->m_positionPtr) #define position (((Parser *)parser)->m_position) #define openInternalEntities (((Parser *)parser)->m_openInternalEntities) #define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities) #define tagLevel (((Parser *)parser)->m_tagLevel) #define buffer (((Parser *)parser)->m_buffer) #define bufferPtr (((Parser *)parser)->m_bufferPtr) #define bufferEnd (((Parser *)parser)->m_bufferEnd) #define parseEndByteIndex (((Parser *)parser)->m_parseEndByteIndex) #define parseEndPtr (((Parser *)parser)->m_parseEndPtr) #define bufferLim (((Parser *)parser)->m_bufferLim) #define dataBuf (((Parser *)parser)->m_dataBuf) #define dataBufEnd (((Parser *)parser)->m_dataBufEnd) #define dtd (((Parser *)parser)->m_dtd) #define curBase (((Parser *)parser)->m_curBase) #define declEntity (((Parser *)parser)->m_declEntity) #define declNotationName (((Parser *)parser)->m_declNotationName) #define declNotationPublicId (((Parser *)parser)->m_declNotationPublicId) #define declElementType (((Parser *)parser)->m_declElementType) #define declAttributeId (((Parser *)parser)->m_declAttributeId) #define declAttributeIsCdata (((Parser *)parser)->m_declAttributeIsCdata) #define declAttributeIsId (((Parser *)parser)->m_declAttributeIsId) #define freeTagList (((Parser *)parser)->m_freeTagList) #define freeBindingList (((Parser *)parser)->m_freeBindingList) #define inheritedBindings (((Parser *)parser)->m_inheritedBindings) #define tagStack (((Parser *)parser)->m_tagStack) #define atts (((Parser *)parser)->m_atts) #define attsSize (((Parser *)parser)->m_attsSize) #define nSpecifiedAtts (((Parser *)parser)->m_nSpecifiedAtts) #define idAttIndex (((Parser *)parser)->m_idAttIndex) #define tempPool (((Parser *)parser)->m_tempPool) #define temp2Pool (((Parser *)parser)->m_temp2Pool) #define groupConnector (((Parser *)parser)->m_groupConnector) #define groupSize (((Parser *)parser)->m_groupSize) #define hadExternalDoctype (((Parser *)parser)->m_hadExternalDoctype) #define namespaceSeparator (((Parser *)parser)->m_namespaceSeparator) #ifdef XML_DTD #define parentParser (((Parser *)parser)->m_parentParser) #define paramEntityParsing (((Parser *)parser)->m_paramEntityParsing) #endif /* XML_DTD */ #ifdef _MSC_VER #ifdef _DEBUG Parser *asParser(XML_Parser parser) { return parser; } #endif #endif XML_Parser XML_ParserCreate(const XML_Char *encodingName) { XML_Parser parser = malloc(sizeof(Parser)); if (!parser) return parser; processor = prologInitProcessor; XmlPrologStateInit(&prologState); userData = 0; handlerArg = 0; startElementHandler = 0; endElementHandler = 0; characterDataHandler = 0; processingInstructionHandler = 0; commentHandler = 0; startCdataSectionHandler = 0; endCdataSectionHandler = 0; defaultHandler = 0; startDoctypeDeclHandler = 0; endDoctypeDeclHandler = 0; unparsedEntityDeclHandler = 0; notationDeclHandler = 0; externalParsedEntityDeclHandler = 0; internalParsedEntityDeclHandler = 0; startNamespaceDeclHandler = 0; endNamespaceDeclHandler = 0; notStandaloneHandler = 0; externalEntityRefHandler = 0; externalEntityRefHandlerArg = parser; unknownEncodingHandler = 0; buffer = 0; bufferPtr = 0; bufferEnd = 0; parseEndByteIndex = 0; parseEndPtr = 0; bufferLim = 0; declElementType = 0; declAttributeId = 0; declEntity = 0; declNotationName = 0; declNotationPublicId = 0; memset(&position, 0, sizeof(POSITION)); errorCode = XML_ERROR_NONE; eventPtr = 0; eventEndPtr = 0; positionPtr = 0; openInternalEntities = 0; tagLevel = 0; tagStack = 0; freeTagList = 0; freeBindingList = 0; inheritedBindings = 0; attsSize = INIT_ATTS_SIZE; atts = malloc(attsSize * sizeof(ATTRIBUTE)); nSpecifiedAtts = 0; dataBuf = malloc(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); groupSize = 0; groupConnector = 0; hadExternalDoctype = 0; unknownEncodingMem = 0; unknownEncodingRelease = 0; unknownEncodingData = 0; unknownEncodingHandlerData = 0; namespaceSeparator = '!'; #ifdef XML_DTD parentParser = 0; paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; #endif ns = 0; poolInit(&tempPool); poolInit(&temp2Pool); protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0; curBase = 0; if (!dtdInit(&dtd) || !atts || !dataBuf || (encodingName && !protocolEncodingName)) { XML_ParserFree(parser); return 0; } dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; XmlInitEncoding(&initEncoding, &encoding, 0); internalEncoding = XmlGetInternalEncoding(); return parser; } XML_Parser XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) { static const XML_Char implicitContext[] = { XML_T('x'), XML_T('m'), XML_T('l'), XML_T('='), XML_T('h'), XML_T('t'), XML_T('t'), XML_T('p'), XML_T(':'), XML_T('/'), XML_T('/'), XML_T('w'), XML_T('w'), XML_T('w'), XML_T('.'), XML_T('w'), XML_T('3'), XML_T('.'), XML_T('o'), XML_T('r'), XML_T('g'), XML_T('/'), XML_T('X'), XML_T('M'), XML_T('L'), XML_T('/'), XML_T('1'), XML_T('9'), XML_T('9'), XML_T('8'), XML_T('/'), XML_T('n'), XML_T('a'), XML_T('m'), XML_T('e'), XML_T('s'), XML_T('p'), XML_T('a'), XML_T('c'), XML_T('e'), XML_T('\0') }; XML_Parser parser = XML_ParserCreate(encodingName); if (parser) { XmlInitEncodingNS(&initEncoding, &encoding, 0); ns = 1; internalEncoding = XmlGetInternalEncodingNS(); namespaceSeparator = nsSep; } if (!setContext(parser, implicitContext)) { XML_ParserFree(parser); return 0; } return parser; } int XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) { if (!encodingName) protocolEncodingName = 0; else { protocolEncodingName = poolCopyString(&tempPool, encodingName); if (!protocolEncodingName) return 0; } return 1; } XML_Parser XML_ExternalEntityParserCreate(XML_Parser oldParser, const XML_Char *context, const XML_Char *encodingName) { XML_Parser parser = oldParser; DTD *oldDtd = &dtd; XML_StartElementHandler oldStartElementHandler = startElementHandler; XML_EndElementHandler oldEndElementHandler = endElementHandler; XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; XML_ProcessingInstructionHandler oldProcessingInstructionHandler = processingInstructionHandler; XML_CommentHandler oldCommentHandler = commentHandler; XML_StartCdataSectionHandler oldStartCdataSectionHandler = startCdataSectionHandler; XML_EndCdataSectionHandler oldEndCdataSectionHandler = endCdataSectionHandler; XML_DefaultHandler oldDefaultHandler = defaultHandler; XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler = unparsedEntityDeclHandler; XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; XML_ExternalParsedEntityDeclHandler oldExternalParsedEntityDeclHandler = externalParsedEntityDeclHandler; XML_InternalParsedEntityDeclHandler oldInternalParsedEntityDeclHandler = internalParsedEntityDeclHandler; XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler = startNamespaceDeclHandler; XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler = endNamespaceDeclHandler; XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; XML_ExternalEntityRefHandler oldExternalEntityRefHandler = externalEntityRefHandler; XML_UnknownEncodingHandler oldUnknownEncodingHandler = unknownEncodingHandler; void *oldUserData = userData; void *oldHandlerArg = handlerArg; int oldDefaultExpandInternalEntities = defaultExpandInternalEntities; void *oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; #ifdef XML_DTD int oldParamEntityParsing = paramEntityParsing; #endif parser = (ns ? XML_ParserCreateNS(encodingName, namespaceSeparator) : XML_ParserCreate(encodingName)); if (!parser) return 0; startElementHandler = oldStartElementHandler; endElementHandler = oldEndElementHandler; characterDataHandler = oldCharacterDataHandler; processingInstructionHandler = oldProcessingInstructionHandler; commentHandler = oldCommentHandler; startCdataSectionHandler = oldStartCdataSectionHandler; endCdataSectionHandler = oldEndCdataSectionHandler; defaultHandler = oldDefaultHandler; unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; notationDeclHandler = oldNotationDeclHandler; externalParsedEntityDeclHandler = oldExternalParsedEntityDeclHandler; internalParsedEntityDeclHandler = oldInternalParsedEntityDeclHandler; startNamespaceDeclHandler = oldStartNamespaceDeclHandler; endNamespaceDeclHandler = oldEndNamespaceDeclHandler; notStandaloneHandler = oldNotStandaloneHandler; externalEntityRefHandler = oldExternalEntityRefHandler; unknownEncodingHandler = oldUnknownEncodingHandler; userData = oldUserData; if (oldUserData == oldHandlerArg) handlerArg = userData; else handlerArg = parser; if (oldExternalEntityRefHandlerArg != oldParser) externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; defaultExpandInternalEntities = oldDefaultExpandInternalEntities; #ifdef XML_DTD paramEntityParsing = oldParamEntityParsing; if (context) { #endif /* XML_DTD */ if (!dtdCopy(&dtd, oldDtd) || !setContext(parser, context)) { XML_ParserFree(parser); return 0; } processor = externalEntityInitProcessor; #ifdef XML_DTD } else { dtdSwap(&dtd, oldDtd); parentParser = oldParser; XmlPrologStateInitExternalEntity(&prologState); dtd.complete = 1; hadExternalDoctype = 1; } #endif /* XML_DTD */ return parser; } static void destroyBindings(BINDING *bindings) { for (;;) { BINDING *b = bindings; if (!b) break; bindings = b->nextTagBinding; free(b->uri); free(b); } } void XML_ParserFree(XML_Parser parser) { for (;;) { TAG *p; if (tagStack == 0) { if (freeTagList == 0) break; tagStack = freeTagList; freeTagList = 0; } p = tagStack; tagStack = tagStack->parent; free(p->buf); destroyBindings(p->bindings); free(p); } destroyBindings(freeBindingList); destroyBindings(inheritedBindings); poolDestroy(&tempPool); poolDestroy(&temp2Pool); #ifdef XML_DTD if (parentParser) { if (hadExternalDoctype) dtd.complete = 0; dtdSwap(&dtd, &((Parser *)parentParser)->m_dtd); } #endif /* XML_DTD */ dtdDestroy(&dtd); free((void *)atts); free(groupConnector); free(buffer); free(dataBuf); free(unknownEncodingMem); if (unknownEncodingRelease) unknownEncodingRelease(unknownEncodingData); free(parser); } void XML_UseParserAsHandlerArg(XML_Parser parser) { handlerArg = parser; } void XML_SetUserData(XML_Parser parser, void *p) { if (handlerArg == userData) handlerArg = userData = p; else userData = p; } int XML_SetBase(XML_Parser parser, const XML_Char *p) { if (p) { p = poolCopyString(&dtd.pool, p); if (!p) return 0; curBase = p; } else curBase = 0; return 1; } const XML_Char *XML_GetBase(XML_Parser parser) { return curBase; } int XML_GetSpecifiedAttributeCount(XML_Parser parser) { return nSpecifiedAtts; } int XML_GetIdAttributeIndex(XML_Parser parser) { return idAttIndex; } void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end) { startElementHandler = start; endElementHandler = end; } void XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler) { characterDataHandler = handler; } void XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler) { processingInstructionHandler = handler; } void XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler) { commentHandler = handler; } void XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end) { startCdataSectionHandler = start; endCdataSectionHandler = end; } void XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler) { defaultHandler = handler; defaultExpandInternalEntities = 0; } void XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler) { defaultHandler = handler; defaultExpandInternalEntities = 1; } void XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end) { startDoctypeDeclHandler = start; endDoctypeDeclHandler = end; } void XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler) { unparsedEntityDeclHandler = handler; } void XML_SetExternalParsedEntityDeclHandler(XML_Parser parser, XML_ExternalParsedEntityDeclHandler handler) { externalParsedEntityDeclHandler = handler; } void XML_SetInternalParsedEntityDeclHandler(XML_Parser parser, XML_InternalParsedEntityDeclHandler handler) { internalParsedEntityDeclHandler = handler; } void XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler) { notationDeclHandler = handler; } void XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end) { startNamespaceDeclHandler = start; endNamespaceDeclHandler = end; } void XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler) { notStandaloneHandler = handler; } void XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler) { externalEntityRefHandler = handler; } void XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) { if (arg) externalEntityRefHandlerArg = arg; else externalEntityRefHandlerArg = parser; } void XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *data) { unknownEncodingHandler = handler; unknownEncodingHandlerData = data; } int XML_SetParamEntityParsing(XML_Parser parser, enum XML_ParamEntityParsing parsing) { #ifdef XML_DTD paramEntityParsing = parsing; return 1; #else return parsing == XML_PARAM_ENTITY_PARSING_NEVER; #endif } int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) { if (len == 0) { if (!isFinal) return 1; positionPtr = bufferPtr; errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); if (errorCode == XML_ERROR_NONE) return 1; eventEndPtr = eventPtr; processor = errorProcessor; return 0; } else if (bufferPtr == bufferEnd) { const char *end; int nLeftOver; parseEndByteIndex += len; positionPtr = s; if (isFinal) { errorCode = processor(parser, s, parseEndPtr = s + len, 0); if (errorCode == XML_ERROR_NONE) return 1; eventEndPtr = eventPtr; processor = errorProcessor; return 0; } errorCode = processor(parser, s, parseEndPtr = s + len, &end); if (errorCode != XML_ERROR_NONE) { eventEndPtr = eventPtr; processor = errorProcessor; return 0; } XmlUpdatePosition(encoding, positionPtr, end, &position); nLeftOver = s + len - end; if (nLeftOver) { if (buffer == 0 || nLeftOver > bufferLim - buffer) { /* FIXME avoid integer overflow */ buffer = buffer == 0 ? malloc(len * 2) : realloc(buffer, len * 2); /* FIXME storage leak if realloc fails */ if (!buffer) { errorCode = XML_ERROR_NO_MEMORY; eventPtr = eventEndPtr = 0; processor = errorProcessor; return 0; } bufferLim = buffer + len * 2; } memcpy(buffer, end, nLeftOver); bufferPtr = buffer; bufferEnd = buffer + nLeftOver; } return 1; } else { memcpy(XML_GetBuffer(parser, len), s, len); return XML_ParseBuffer(parser, len, isFinal); } } int XML_ParseBuffer(XML_Parser parser, int len, int isFinal) { const char *start = bufferPtr; positionPtr = start; bufferEnd += len; parseEndByteIndex += len; errorCode = processor(parser, start, parseEndPtr = bufferEnd, isFinal ? (const char **)0 : &bufferPtr); if (errorCode == XML_ERROR_NONE) { if (!isFinal) XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); return 1; } else { eventEndPtr = eventPtr; processor = errorProcessor; return 0; } } void *XML_GetBuffer(XML_Parser parser, int len) { if (len > bufferLim - bufferEnd) { /* FIXME avoid integer overflow */ int neededSize = len + (bufferEnd - bufferPtr); if (neededSize <= bufferLim - buffer) { memmove(buffer, bufferPtr, bufferEnd - bufferPtr); bufferEnd = buffer + (bufferEnd - bufferPtr); bufferPtr = buffer; } else { char *newBuf; int bufferSize = bufferLim - bufferPtr; if (bufferSize == 0) bufferSize = INIT_BUFFER_SIZE; do { bufferSize *= 2; } while (bufferSize < neededSize); newBuf = malloc(bufferSize); if (newBuf == 0) { errorCode = XML_ERROR_NO_MEMORY; return 0; } bufferLim = newBuf + bufferSize; if (bufferPtr) { memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); free(buffer); } bufferEnd = newBuf + (bufferEnd - bufferPtr); bufferPtr = buffer = newBuf; } } return bufferEnd; } enum XML_Error XML_GetErrorCode(XML_Parser parser) { return errorCode; } long XML_GetCurrentByteIndex(XML_Parser parser) { if (eventPtr) return parseEndByteIndex - (parseEndPtr - eventPtr); return -1; } int XML_GetCurrentByteCount(XML_Parser parser) { if (eventEndPtr && eventPtr) return eventEndPtr - eventPtr; return 0; } int XML_GetCurrentLineNumber(XML_Parser parser) { if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.lineNumber + 1; } int XML_GetCurrentColumnNumber(XML_Parser parser) { if (eventPtr) { XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); positionPtr = eventPtr; } return position.columnNumber; } void XML_DefaultCurrent(XML_Parser parser) { if (defaultHandler) { if (openInternalEntities) reportDefault(parser, internalEncoding, openInternalEntities->internalEventPtr, openInternalEntities->internalEventEndPtr); else reportDefault(parser, encoding, eventPtr, eventEndPtr); } } const XML_LChar *XML_ErrorString(int code) { static const XML_LChar *message[] = { 0, XML_T("out of memory"), XML_T("syntax error"), XML_T("no element found"), XML_T("not well-formed"), XML_T("unclosed token"), XML_T("unclosed token"), XML_T("mismatched tag"), XML_T("duplicate attribute"), XML_T("junk after document element"), XML_T("illegal parameter entity reference"), XML_T("undefined entity"), XML_T("recursive entity reference"), XML_T("asynchronous entity"), XML_T("reference to invalid character number"), XML_T("reference to binary entity"), XML_T("reference to external entity in attribute"), XML_T("xml processing instruction not at start of external entity"), XML_T("unknown encoding"), XML_T("encoding specified in XML declaration is incorrect"), XML_T("unclosed CDATA section"), XML_T("error in processing external entity reference"), XML_T("document is not standalone") }; if (code > 0 && code < sizeof(message)/sizeof(message[0])) return message[code]; return 0; } static enum XML_Error contentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { return doContent(parser, 0, encoding, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; processor = externalEntityInitProcessor2; return externalEntityInitProcessor2(parser, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor2(XML_Parser parser, const char *start, const char *end, const char **endPtr) { const char *next; int tok = XmlContentTok(encoding, start, end, &next); switch (tok) { case XML_TOK_BOM: start = next; break; case XML_TOK_PARTIAL: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_PARTIAL_CHAR; } processor = externalEntityInitProcessor3; return externalEntityInitProcessor3(parser, start, end, endPtr); } static enum XML_Error externalEntityInitProcessor3(XML_Parser parser, const char *start, const char *end, const char **endPtr) { const char *next; int tok = XmlContentTok(encoding, start, end, &next); switch (tok) { case XML_TOK_XML_DECL: { enum XML_Error result = processXmlDecl(parser, 1, start, next); if (result != XML_ERROR_NONE) return result; start = next; } break; case XML_TOK_PARTIAL: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (endPtr) { *endPtr = start; return XML_ERROR_NONE; } eventPtr = start; return XML_ERROR_PARTIAL_CHAR; } processor = externalEntityContentProcessor; tagLevel = 1; return doContent(parser, 1, encoding, start, end, endPtr); } static enum XML_Error externalEntityContentProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { return doContent(parser, 1, encoding, start, end, endPtr); } static enum XML_Error doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, const char *s, const char *end, const char **nextPtr) { const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } *eventPP = s; for (;;) { const char *next = s; /* XmlContentTok doesn't always set the last arg */ int tok = XmlContentTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_TRAILING_CR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } *eventEndPP = end; if (characterDataHandler) { XML_Char c = 0xA; characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, end); if (startTagLevel == 0) return XML_ERROR_NO_ELEMENTS; if (tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; return XML_ERROR_NONE; case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } if (startTagLevel > 0) { if (tagLevel != startTagLevel) return XML_ERROR_ASYNC_ENTITY; return XML_ERROR_NONE; } return XML_ERROR_NO_ELEMENTS; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_ENTITY_REF: { const XML_Char *name; ENTITY *entity; XML_Char ch = XmlPredefinedEntityName(enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (ch) { if (characterDataHandler) characterDataHandler(handlerArg, &ch, 1); else if (defaultHandler) reportDefault(parser, enc, s, next); break; } name = poolStoreString(&dtd.pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0); poolDiscard(&dtd.pool); if (!entity) { if (dtd.complete || dtd.standalone) return XML_ERROR_UNDEFINED_ENTITY; if (defaultHandler) reportDefault(parser, enc, s, next); break; } if (entity->open) return XML_ERROR_RECURSIVE_ENTITY_REF; if (entity->notation) return XML_ERROR_BINARY_ENTITY_REF; if (entity) { if (entity->textPtr) { enum XML_Error result; OPEN_INTERNAL_ENTITY openEntity; if (defaultHandler && !defaultExpandInternalEntities) { reportDefault(parser, enc, s, next); break; } entity->open = 1; openEntity.next = openInternalEntities; openInternalEntities = &openEntity; openEntity.entity = entity; openEntity.internalEventPtr = 0; openEntity.internalEventEndPtr = 0; result = doContent(parser, tagLevel, internalEncoding, (char *)entity->textPtr, (char *)(entity->textPtr + entity->textLen), 0); entity->open = 0; openInternalEntities = openEntity.next; if (result) return result; } else if (externalEntityRefHandler) { const XML_Char *context; entity->open = 1; context = getContext(parser); entity->open = 0; if (!context) return XML_ERROR_NO_MEMORY; if (!externalEntityRefHandler(externalEntityRefHandlerArg, context, entity->base, entity->systemId, entity->publicId)) return XML_ERROR_EXTERNAL_ENTITY_HANDLING; poolDiscard(&tempPool); } else if (defaultHandler) reportDefault(parser, enc, s, next); } break; } case XML_TOK_START_TAG_WITH_ATTS: if (!startElementHandler) { enum XML_Error result = storeAtts(parser, enc, s, 0, 0); if (result) return result; } /* fall through */ case XML_TOK_START_TAG_NO_ATTS: { TAG *tag; if (freeTagList) { tag = freeTagList; freeTagList = freeTagList->parent; } else { tag = malloc(sizeof(TAG)); if (!tag) return XML_ERROR_NO_MEMORY; tag->buf = malloc(INIT_TAG_BUF_SIZE); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; } tag->bindings = 0; tag->parent = tagStack; tagStack = tag; tag->name.localPart = 0; tag->rawName = s + enc->minBytesPerChar; tag->rawNameLength = XmlNameLength(enc, tag->rawName); if (nextPtr) { /* Need to guarantee that: tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)) <= tag->bufEnd - sizeof(XML_Char) */ if (tag->rawNameLength + (int)(sizeof(XML_Char) - 1) + (int)sizeof(XML_Char) > tag->bufEnd - tag->buf) { int bufSize = tag->rawNameLength * 4; bufSize = ROUND_UP(bufSize, sizeof(XML_Char)); tag->buf = realloc(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; } memcpy(tag->buf, tag->rawName, tag->rawNameLength); tag->rawName = tag->buf; } ++tagLevel; if (startElementHandler) { enum XML_Error result; XML_Char *toPtr; for (;;) { const char *rawNameEnd = tag->rawName + tag->rawNameLength; const char *fromPtr = tag->rawName; int bufSize; if (nextPtr) toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char))); else toPtr = (XML_Char *)tag->buf; tag->name.str = toPtr; XmlConvert(enc, &fromPtr, rawNameEnd, (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); if (fromPtr == rawNameEnd) break; bufSize = (tag->bufEnd - tag->buf) << 1; tag->buf = realloc(tag->buf, bufSize); if (!tag->buf) return XML_ERROR_NO_MEMORY; tag->bufEnd = tag->buf + bufSize; if (nextPtr) tag->rawName = tag->buf; } *toPtr = XML_T('\0'); result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); if (result) return result; startElementHandler(handlerArg, tag->name.str, (const XML_Char **)atts); poolClear(&tempPool); } else { tag->name.str = 0; if (defaultHandler) reportDefault(parser, enc, s, next); } break; } case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: if (!startElementHandler) { enum XML_Error result = storeAtts(parser, enc, s, 0, 0); if (result) return result; } /* fall through */ case XML_TOK_EMPTY_ELEMENT_NO_ATTS: if (startElementHandler || endElementHandler) { const char *rawName = s + enc->minBytesPerChar; enum XML_Error result; BINDING *bindings = 0; TAG_NAME name; name.str = poolStoreString(&tempPool, enc, rawName, rawName + XmlNameLength(enc, rawName)); if (!name.str) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); result = storeAtts(parser, enc, s, &name, &bindings); if (result) return result; poolFinish(&tempPool); if (startElementHandler) startElementHandler(handlerArg, name.str, (const XML_Char **)atts); if (endElementHandler) { if (startElementHandler) *eventPP = *eventEndPP; endElementHandler(handlerArg, name.str); } poolClear(&tempPool); while (bindings) { BINDING *b = bindings; if (endNamespaceDeclHandler) endNamespaceDeclHandler(handlerArg, b->prefix->name); bindings = bindings->nextTagBinding; b->nextTagBinding = freeBindingList; freeBindingList = b; b->prefix->binding = b->prevPrefixBinding; } } else if (defaultHandler) reportDefault(parser, enc, s, next); if (tagLevel == 0) return epilogProcessor(parser, next, end, nextPtr); break; case XML_TOK_END_TAG: if (tagLevel == startTagLevel) return XML_ERROR_ASYNC_ENTITY; else { int len; const char *rawName; TAG *tag = tagStack; tagStack = tag->parent; tag->parent = freeTagList; freeTagList = tag; rawName = s + enc->minBytesPerChar*2; len = XmlNameLength(enc, rawName); if (len != tag->rawNameLength || memcmp(tag->rawName, rawName, len) != 0) { *eventPP = rawName; return XML_ERROR_TAG_MISMATCH; } --tagLevel; if (endElementHandler && tag->name.str) { if (tag->name.localPart) { XML_Char *to = (XML_Char *)tag->name.str + tag->name.uriLen; const XML_Char *from = tag->name.localPart; while ((*to++ = *from++) != 0) ; } endElementHandler(handlerArg, tag->name.str); } else if (defaultHandler) reportDefault(parser, enc, s, next); while (tag->bindings) { BINDING *b = tag->bindings; if (endNamespaceDeclHandler) endNamespaceDeclHandler(handlerArg, b->prefix->name); tag->bindings = tag->bindings->nextTagBinding; b->nextTagBinding = freeBindingList; freeBindingList = b; b->prefix->binding = b->prevPrefixBinding; } if (tagLevel == 0) return epilogProcessor(parser, next, end, nextPtr); } break; case XML_TOK_CHAR_REF: { int n = XmlCharRefNumber(enc, s); if (n < 0) return XML_ERROR_BAD_CHAR_REF; if (characterDataHandler) { XML_Char buf[XML_ENCODE_MAX]; characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); } else if (defaultHandler) reportDefault(parser, enc, s, next); } break; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; case XML_TOK_DATA_NEWLINE: if (characterDataHandler) { XML_Char c = 0xA; characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_CDATA_SECT_OPEN: { enum XML_Error result; if (startCdataSectionHandler) startCdataSectionHandler(handlerArg); #if 0 /* Suppose you doing a transformation on a document that involves changing only the character data. You set up a defaultHandler and a characterDataHandler. The defaultHandler simply copies characters through. The characterDataHandler does the transformation and writes the characters out escaping them as necessary. This case will fail to work if we leave out the following two lines (because & and < inside CDATA sections will be incorrectly escaped). However, now we have a start/endCdataSectionHandler, so it seems easier to let the user deal with this. */ else if (characterDataHandler) characterDataHandler(handlerArg, dataBuf, 0); #endif else if (defaultHandler) reportDefault(parser, enc, s, next); result = doCdataSection(parser, enc, &next, end, nextPtr); if (!next) { processor = cdataSectionProcessor; return result; } } break; case XML_TOK_TRAILING_RSQB: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); } else characterDataHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); } else if (defaultHandler) reportDefault(parser, enc, s, end); if (startTagLevel == 0) { *eventPP = end; return XML_ERROR_NO_ELEMENTS; } if (tagLevel != startTagLevel) { *eventPP = end; return XML_ERROR_ASYNC_ENTITY; } return XML_ERROR_NONE; case XML_TOK_DATA_CHARS: if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = s; characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); if (s == next) break; *eventPP = s; } } else characterDataHandler(handlerArg, (XML_Char *)s, (XML_Char *)next - (XML_Char *)s); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_PI: if (!reportProcessingInstruction(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: if (!reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; default: if (defaultHandler) reportDefault(parser, enc, s, next); break; } *eventPP = s = next; } /* not reached */ } /* If tagNamePtr is non-null, build a real list of attributes, otherwise just check the attributes for well-formedness. */ static enum XML_Error storeAtts(XML_Parser parser, const ENCODING *enc, const char *attStr, TAG_NAME *tagNamePtr, BINDING **bindingsPtr) { ELEMENT_TYPE *elementType = 0; int nDefaultAtts = 0; const XML_Char **appAtts; /* the attribute list to pass to the application */ int attIndex = 0; int i; int n; int nPrefixes = 0; BINDING *binding; const XML_Char *localPart; /* lookup the element type name */ if (tagNamePtr) { elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, 0); if (!elementType) { tagNamePtr->str = poolCopyString(&dtd.pool, tagNamePtr->str); if (!tagNamePtr->str) return XML_ERROR_NO_MEMORY; elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, sizeof(ELEMENT_TYPE)); if (!elementType) return XML_ERROR_NO_MEMORY; if (ns && !setElementTypePrefix(parser, elementType)) return XML_ERROR_NO_MEMORY; } nDefaultAtts = elementType->nDefaultAtts; } /* get the attributes from the tokenizer */ n = XmlGetAttributes(enc, attStr, attsSize, atts); if (n + nDefaultAtts > attsSize) { int oldAttsSize = attsSize; attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; atts = realloc((void *)atts, attsSize * sizeof(ATTRIBUTE)); if (!atts) return XML_ERROR_NO_MEMORY; if (n > oldAttsSize) XmlGetAttributes(enc, attStr, n, atts); } appAtts = (const XML_Char **)atts; for (i = 0; i < n; i++) { /* add the name and value to the attribute list */ ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, atts[i].name + XmlNameLength(enc, atts[i].name)); if (!attId) return XML_ERROR_NO_MEMORY; /* detect duplicate attributes */ if ((attId->name)[-1]) { if (enc == encoding) eventPtr = atts[i].name; return XML_ERROR_DUPLICATE_ATTRIBUTE; } (attId->name)[-1] = 1; appAtts[attIndex++] = attId->name; if (!atts[i].normalized) { enum XML_Error result; int isCdata = 1; /* figure out whether declared as other than CDATA */ if (attId->maybeTokenized) { int j; for (j = 0; j < nDefaultAtts; j++) { if (attId == elementType->defaultAtts[j].id) { isCdata = elementType->defaultAtts[j].isCdata; break; } } } /* normalize the attribute value */ result = storeAttributeValue(parser, enc, isCdata, atts[i].valuePtr, atts[i].valueEnd, &tempPool); if (result) return result; if (tagNamePtr) { appAtts[attIndex] = poolStart(&tempPool); poolFinish(&tempPool); } else poolDiscard(&tempPool); } else if (tagNamePtr) { /* the value did not need normalizing */ appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, atts[i].valueEnd); if (appAtts[attIndex] == 0) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); } /* handle prefixed attribute names */ if (attId->prefix && tagNamePtr) { if (attId->xmlns) { /* deal with namespace declarations here */ if (!addBinding(parser, attId->prefix, attId, appAtts[attIndex], bindingsPtr)) return XML_ERROR_NO_MEMORY; --attIndex; } else { /* deal with other prefixed names later */ attIndex++; nPrefixes++; (attId->name)[-1] = 2; } } else attIndex++; } if (tagNamePtr) { int j; nSpecifiedAtts = attIndex; if (elementType->idAtt && (elementType->idAtt->name)[-1]) { for (i = 0; i < attIndex; i += 2) if (appAtts[i] == elementType->idAtt->name) { idAttIndex = i; break; } } else idAttIndex = -1; /* do attribute defaulting */ for (j = 0; j < nDefaultAtts; j++) { const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + j; if (!(da->id->name)[-1] && da->value) { if (da->id->prefix) { if (da->id->xmlns) { if (!addBinding(parser, da->id->prefix, da->id, da->value, bindingsPtr)) return XML_ERROR_NO_MEMORY; } else { (da->id->name)[-1] = 2; nPrefixes++; appAtts[attIndex++] = da->id->name; appAtts[attIndex++] = da->value; } } else { (da->id->name)[-1] = 1; appAtts[attIndex++] = da->id->name; appAtts[attIndex++] = da->value; } } } appAtts[attIndex] = 0; } i = 0; if (nPrefixes) { /* expand prefixed attribute names */ for (; i < attIndex; i += 2) { if (appAtts[i][-1] == 2) { ATTRIBUTE_ID *id; ((XML_Char *)(appAtts[i]))[-1] = 0; id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, appAtts[i], 0); if (id->prefix->binding) { int j; const BINDING *b = id->prefix->binding; const XML_Char *s = appAtts[i]; for (j = 0; j < b->uriLen; j++) { if (!poolAppendChar(&tempPool, b->uri[j])) return XML_ERROR_NO_MEMORY; } while (*s++ != ':') ; do { if (!poolAppendChar(&tempPool, *s)) return XML_ERROR_NO_MEMORY; } while (*s++); appAtts[i] = poolStart(&tempPool); poolFinish(&tempPool); } if (!--nPrefixes) break; } else ((XML_Char *)(appAtts[i]))[-1] = 0; } } /* clear the flags that say whether attributes were specified */ for (; i < attIndex; i += 2) ((XML_Char *)(appAtts[i]))[-1] = 0; if (!tagNamePtr) return XML_ERROR_NONE; for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) binding->attId->name[-1] = 0; /* expand the element type name */ if (elementType->prefix) { binding = elementType->prefix->binding; if (!binding) return XML_ERROR_NONE; localPart = tagNamePtr->str; while (*localPart++ != XML_T(':')) ; } else if (dtd.defaultPrefix.binding) { binding = dtd.defaultPrefix.binding; localPart = tagNamePtr->str; } else return XML_ERROR_NONE; tagNamePtr->localPart = localPart; tagNamePtr->uriLen = binding->uriLen; for (i = 0; localPart[i++];) ; n = i + binding->uriLen; if (n > binding->uriAlloc) { TAG *p; XML_Char *uri = malloc((n + EXPAND_SPARE) * sizeof(XML_Char)); if (!uri) return XML_ERROR_NO_MEMORY; binding->uriAlloc = n + EXPAND_SPARE; memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); for (p = tagStack; p; p = p->parent) if (p->name.str == binding->uri) p->name.str = uri; free(binding->uri); binding->uri = uri; } memcpy(binding->uri + binding->uriLen, localPart, i * sizeof(XML_Char)); tagNamePtr->str = binding->uri; return XML_ERROR_NONE; } static int addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, const XML_Char *uri, BINDING **bindingsPtr) { BINDING *b; int len; for (len = 0; uri[len]; len++) ; if (namespaceSeparator) len++; if (freeBindingList) { b = freeBindingList; if (len > b->uriAlloc) { b->uri = realloc(b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE)); if (!b->uri) return 0; b->uriAlloc = len + EXPAND_SPARE; } freeBindingList = b->nextTagBinding; } else { b = malloc(sizeof(BINDING)); if (!b) return 0; b->uri = malloc(sizeof(XML_Char) * (len + EXPAND_SPARE)); if (!b->uri) { free(b); return 0; } b->uriAlloc = len + EXPAND_SPARE; } b->uriLen = len; memcpy(b->uri, uri, len * sizeof(XML_Char)); if (namespaceSeparator) b->uri[len - 1] = namespaceSeparator; b->prefix = prefix; b->attId = attId; b->prevPrefixBinding = prefix->binding; if (*uri == XML_T('\0') && prefix == &dtd.defaultPrefix) prefix->binding = 0; else prefix->binding = b; b->nextTagBinding = *bindingsPtr; *bindingsPtr = b; if (startNamespaceDeclHandler) startNamespaceDeclHandler(handlerArg, prefix->name, prefix->binding ? uri : 0); return 1; } /* The idea here is to avoid using stack for each CDATA section when the whole file is parsed with one call. */ static enum XML_Error cdataSectionProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = doCdataSection(parser, encoding, &start, end, endPtr); if (start) { processor = contentProcessor; return contentProcessor(parser, start, end, endPtr); } return result; } /* startPtr gets set to non-null is the section is closed, and to null if the section is not yet closed. */ static enum XML_Error doCdataSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, const char *end, const char **nextPtr) { const char *s = *startPtr; const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; *eventPP = s; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } *eventPP = s; *startPtr = 0; for (;;) { const char *next; int tok = XmlCdataSectionTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_CDATA_SECT_CLOSE: if (endCdataSectionHandler) endCdataSectionHandler(handlerArg); #if 0 /* see comment under XML_TOK_CDATA_SECT_OPEN */ else if (characterDataHandler) characterDataHandler(handlerArg, dataBuf, 0); #endif else if (defaultHandler) reportDefault(parser, enc, s, next); *startPtr = next; return XML_ERROR_NONE; case XML_TOK_DATA_NEWLINE: if (characterDataHandler) { XML_Char c = 0xA; characterDataHandler(handlerArg, &c, 1); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_DATA_CHARS: if (characterDataHandler) { if (MUST_CONVERT(enc, s)) { for (;;) { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = next; characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); if (s == next) break; *eventPP = s; } } else characterDataHandler(handlerArg, (XML_Char *)s, (XML_Char *)next - (XML_Char *)s); } else if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_PARTIAL: case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_CDATA_SECTION; default: abort(); } *eventPP = s = next; } /* not reached */ } #ifdef XML_DTD /* The idea here is to avoid using stack for each IGNORE section when the whole file is parsed with one call. */ static enum XML_Error ignoreSectionProcessor(XML_Parser parser, const char *start, const char *end, const char **endPtr) { enum XML_Error result = doIgnoreSection(parser, encoding, &start, end, endPtr); if (start) { processor = prologProcessor; return prologProcessor(parser, start, end, endPtr); } return result; } /* startPtr gets set to non-null is the section is closed, and to null if the section is not yet closed. */ static enum XML_Error doIgnoreSection(XML_Parser parser, const ENCODING *enc, const char **startPtr, const char *end, const char **nextPtr) { const char *next; int tok; const char *s = *startPtr; const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; *eventPP = s; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } *eventPP = s; *startPtr = 0; tok = XmlIgnoreSectionTok(enc, s, end, &next); *eventEndPP = next; switch (tok) { case XML_TOK_IGNORE_SECT: if (defaultHandler) reportDefault(parser, enc, s, next); *startPtr = next; return XML_ERROR_NONE; case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; case XML_TOK_PARTIAL: case XML_TOK_NONE: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ default: abort(); } /* not reached */ } #endif /* XML_DTD */ static enum XML_Error initializeEncoding(XML_Parser parser) { const char *s; #ifdef XML_UNICODE char encodingBuf[128]; if (!protocolEncodingName) s = 0; else { int i; for (i = 0; protocolEncodingName[i]; i++) { if (i == sizeof(encodingBuf) - 1 || (protocolEncodingName[i] & ~0x7f) != 0) { encodingBuf[0] = '\0'; break; } encodingBuf[i] = (char)protocolEncodingName[i]; } encodingBuf[i] = '\0'; s = encodingBuf; } #else s = protocolEncodingName; #endif if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) return XML_ERROR_NONE; return handleUnknownEncoding(parser, protocolEncodingName); } static enum XML_Error processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *s, const char *next) { const char *encodingName = 0; const ENCODING *newEncoding = 0; const char *version; int standalone = -1; if (!(ns ? XmlParseXmlDeclNS : XmlParseXmlDecl)(isGeneralTextEntity, encoding, s, next, &eventPtr, &version, &encodingName, &newEncoding, &standalone)) return XML_ERROR_SYNTAX; if (!isGeneralTextEntity && standalone == 1) { dtd.standalone = 1; #ifdef XML_DTD if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; #endif /* XML_DTD */ } if (defaultHandler) reportDefault(parser, encoding, s, next); if (!protocolEncodingName) { if (newEncoding) { if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { eventPtr = encodingName; return XML_ERROR_INCORRECT_ENCODING; } encoding = newEncoding; } else if (encodingName) { enum XML_Error result; const XML_Char *s = poolStoreString(&tempPool, encoding, encodingName, encodingName + XmlNameLength(encoding, encodingName)); if (!s) return XML_ERROR_NO_MEMORY; result = handleUnknownEncoding(parser, s); poolDiscard(&tempPool); if (result == XML_ERROR_UNKNOWN_ENCODING) eventPtr = encodingName; return result; } } return XML_ERROR_NONE; } static enum XML_Error handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) { if (unknownEncodingHandler) { XML_Encoding info; int i; for (i = 0; i < 256; i++) info.map[i] = -1; info.convert = 0; info.data = 0; info.release = 0; if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) { ENCODING *enc; unknownEncodingMem = malloc(XmlSizeOfUnknownEncoding()); if (!unknownEncodingMem) { if (info.release) info.release(info.data); return XML_ERROR_NO_MEMORY; } enc = (ns ? XmlInitUnknownEncodingNS : XmlInitUnknownEncoding)(unknownEncodingMem, info.map, info.convert, info.data); if (enc) { unknownEncodingData = info.data; unknownEncodingRelease = info.release; encoding = enc; return XML_ERROR_NONE; } } if (info.release) info.release(info.data); } return XML_ERROR_UNKNOWN_ENCODING; } static enum XML_Error prologInitProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { enum XML_Error result = initializeEncoding(parser); if (result != XML_ERROR_NONE) return result; processor = prologProcessor; return prologProcessor(parser, s, end, nextPtr); } static enum XML_Error prologProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { const char *next; int tok = XmlPrologTok(encoding, s, end, &next); return doProlog(parser, encoding, s, end, tok, next, nextPtr); } static enum XML_Error doProlog(XML_Parser parser, const ENCODING *enc, const char *s, const char *end, int tok, const char *next, const char **nextPtr) { #ifdef XML_DTD static const XML_Char externalSubsetName[] = { '#' , '\0' }; #endif /* XML_DTD */ const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } for (;;) { int role; *eventPP = s; *eventEndPP = next; if (tok <= 0) { if (nextPtr != 0 && tok != XML_TOK_INVALID) { *nextPtr = s; return XML_ERROR_NONE; } switch (tok) { case XML_TOK_INVALID: *eventPP = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: return XML_ERROR_PARTIAL_CHAR; case XML_TOK_NONE: #ifdef XML_DTD if (enc != encoding) return XML_ERROR_NONE; if (parentParser) { if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) == XML_ROLE_ERROR) return XML_ERROR_SYNTAX; hadExternalDoctype = 0; return XML_ERROR_NONE; } #endif /* XML_DTD */ return XML_ERROR_NO_ELEMENTS; default: tok = -tok; next = end; break; } } role = XmlTokenRole(&prologState, tok, s, next, enc); switch (role) { case XML_ROLE_XML_DECL: { enum XML_Error result = processXmlDecl(parser, 0, s, next); if (result != XML_ERROR_NONE) return result; enc = encoding; } break; case XML_ROLE_DOCTYPE_NAME: if (startDoctypeDeclHandler) { const XML_Char *name = poolStoreString(&tempPool, enc, s, next); if (!name) return XML_ERROR_NO_MEMORY; startDoctypeDeclHandler(handlerArg, name); poolClear(&tempPool); } break; #ifdef XML_DTD case XML_ROLE_TEXT_DECL: { enum XML_Error result = processXmlDecl(parser, 1, s, next); if (result != XML_ERROR_NONE) return result; enc = encoding; } break; #endif /* XML_DTD */ case XML_ROLE_DOCTYPE_PUBLIC_ID: #ifdef XML_DTD declEntity = (ENTITY *)lookup(&dtd.paramEntities, externalSubsetName, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; #endif /* XML_DTD */ /* fall through */ case XML_ROLE_ENTITY_PUBLIC_ID: if (!XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_SYNTAX; if (declEntity) { XML_Char *tem = poolStoreString(&dtd.pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); declEntity->publicId = tem; poolFinish(&dtd.pool); } break; case XML_ROLE_DOCTYPE_CLOSE: if (dtd.complete && hadExternalDoctype) { dtd.complete = 0; #ifdef XML_DTD if (paramEntityParsing && externalEntityRefHandler) { ENTITY *entity = (ENTITY *)lookup(&dtd.paramEntities, externalSubsetName, 0); if (!externalEntityRefHandler(externalEntityRefHandlerArg, 0, entity->base, entity->systemId, entity->publicId)) return XML_ERROR_EXTERNAL_ENTITY_HANDLING; } #endif /* XML_DTD */ if (!dtd.complete && !dtd.standalone && notStandaloneHandler && !notStandaloneHandler(handlerArg)) return XML_ERROR_NOT_STANDALONE; } if (endDoctypeDeclHandler) endDoctypeDeclHandler(handlerArg); break; case XML_ROLE_INSTANCE_START: processor = contentProcessor; return contentProcessor(parser, s, end, nextPtr); case XML_ROLE_ATTLIST_ELEMENT_NAME: { const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next); if (!name) return XML_ERROR_NO_MEMORY; declElementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE)); if (!declElementType) return XML_ERROR_NO_MEMORY; if (declElementType->name != name) poolDiscard(&dtd.pool); else { poolFinish(&dtd.pool); if (!setElementTypePrefix(parser, declElementType)) return XML_ERROR_NO_MEMORY; } break; } case XML_ROLE_ATTRIBUTE_NAME: declAttributeId = getAttributeId(parser, enc, s, next); if (!declAttributeId) return XML_ERROR_NO_MEMORY; declAttributeIsCdata = 0; declAttributeIsId = 0; break; case XML_ROLE_ATTRIBUTE_TYPE_CDATA: declAttributeIsCdata = 1; break; case XML_ROLE_ATTRIBUTE_TYPE_ID: declAttributeIsId = 1; break; case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: if (dtd.complete && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, declAttributeIsId, 0)) return XML_ERROR_NO_MEMORY; break; case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: case XML_ROLE_FIXED_ATTRIBUTE_VALUE: { const XML_Char *attVal; enum XML_Error result = storeAttributeValue(parser, enc, declAttributeIsCdata, s + enc->minBytesPerChar, next - enc->minBytesPerChar, &dtd.pool); if (result) return result; attVal = poolStart(&dtd.pool); poolFinish(&dtd.pool); if (dtd.complete // ID attributes aren't allowed to have a default && !defineAttribute(declElementType, declAttributeId, declAttributeIsCdata, 0, attVal)) return XML_ERROR_NO_MEMORY; break; } case XML_ROLE_ENTITY_VALUE: { enum XML_Error result = storeEntityValue(parser, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (declEntity) { declEntity->textPtr = poolStart(&dtd.pool); declEntity->textLen = poolLength(&dtd.pool); poolFinish(&dtd.pool); if (internalParsedEntityDeclHandler // Check it's not a parameter entity && ((ENTITY *)lookup(&dtd.generalEntities, declEntity->name, 0) == declEntity)) { *eventEndPP = s; internalParsedEntityDeclHandler(handlerArg, declEntity->name, declEntity->textPtr, declEntity->textLen); } } else poolDiscard(&dtd.pool); if (result != XML_ERROR_NONE) return result; } break; case XML_ROLE_DOCTYPE_SYSTEM_ID: if (!dtd.standalone #ifdef XML_DTD && !paramEntityParsing #endif /* XML_DTD */ && notStandaloneHandler && !notStandaloneHandler(handlerArg)) return XML_ERROR_NOT_STANDALONE; hadExternalDoctype = 1; #ifndef XML_DTD break; #else /* XML_DTD */ if (!declEntity) { declEntity = (ENTITY *)lookup(&dtd.paramEntities, externalSubsetName, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; } /* fall through */ #endif /* XML_DTD */ case XML_ROLE_ENTITY_SYSTEM_ID: if (declEntity) { declEntity->systemId = poolStoreString(&dtd.pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!declEntity->systemId) return XML_ERROR_NO_MEMORY; declEntity->base = curBase; poolFinish(&dtd.pool); } break; case XML_ROLE_ENTITY_NOTATION_NAME: if (declEntity) { declEntity->notation = poolStoreString(&dtd.pool, enc, s, next); if (!declEntity->notation) return XML_ERROR_NO_MEMORY; poolFinish(&dtd.pool); if (unparsedEntityDeclHandler) { *eventEndPP = s; unparsedEntityDeclHandler(handlerArg, declEntity->name, declEntity->base, declEntity->systemId, declEntity->publicId, declEntity->notation); } } break; case XML_ROLE_EXTERNAL_GENERAL_ENTITY_NO_NOTATION: if (declEntity && externalParsedEntityDeclHandler) { *eventEndPP = s; externalParsedEntityDeclHandler(handlerArg, declEntity->name, declEntity->base, declEntity->systemId, declEntity->publicId); } break; case XML_ROLE_GENERAL_ENTITY_NAME: { const XML_Char *name; if (XmlPredefinedEntityName(enc, s, next)) { declEntity = 0; break; } name = poolStoreString(&dtd.pool, enc, s, next); if (!name) return XML_ERROR_NO_MEMORY; if (dtd.complete) { declEntity = (ENTITY *)lookup(&dtd.generalEntities, name, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; if (declEntity->name != name) { poolDiscard(&dtd.pool); declEntity = 0; } else poolFinish(&dtd.pool); } else { poolDiscard(&dtd.pool); declEntity = 0; } } break; case XML_ROLE_PARAM_ENTITY_NAME: #ifdef XML_DTD if (dtd.complete) { const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next); if (!name) return XML_ERROR_NO_MEMORY; declEntity = (ENTITY *)lookup(&dtd.paramEntities, name, sizeof(ENTITY)); if (!declEntity) return XML_ERROR_NO_MEMORY; if (declEntity->name != name) { poolDiscard(&dtd.pool); declEntity = 0; } else poolFinish(&dtd.pool); } #else /* not XML_DTD */ declEntity = 0; #endif /* not XML_DTD */ break; case XML_ROLE_NOTATION_NAME: declNotationPublicId = 0; declNotationName = 0; if (notationDeclHandler) { declNotationName = poolStoreString(&tempPool, enc, s, next); if (!declNotationName) return XML_ERROR_NO_MEMORY; poolFinish(&tempPool); } break; case XML_ROLE_NOTATION_PUBLIC_ID: if (!XmlIsPublicId(enc, s, next, eventPP)) return XML_ERROR_SYNTAX; if (declNotationName) { XML_Char *tem = poolStoreString(&tempPool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!tem) return XML_ERROR_NO_MEMORY; normalizePublicId(tem); declNotationPublicId = tem; poolFinish(&tempPool); } break; case XML_ROLE_NOTATION_SYSTEM_ID: if (declNotationName && notationDeclHandler) { const XML_Char *systemId = poolStoreString(&tempPool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!systemId) return XML_ERROR_NO_MEMORY; *eventEndPP = s; notationDeclHandler(handlerArg, declNotationName, curBase, systemId, declNotationPublicId); } poolClear(&tempPool); break; case XML_ROLE_NOTATION_NO_SYSTEM_ID: if (declNotationPublicId && notationDeclHandler) { *eventEndPP = s; notationDeclHandler(handlerArg, declNotationName, curBase, 0, declNotationPublicId); } poolClear(&tempPool); break; case XML_ROLE_ERROR: switch (tok) { case XML_TOK_PARAM_ENTITY_REF: return XML_ERROR_PARAM_ENTITY_REF; case XML_TOK_XML_DECL: return XML_ERROR_MISPLACED_XML_PI; default: return XML_ERROR_SYNTAX; } #ifdef XML_DTD case XML_ROLE_IGNORE_SECT: { enum XML_Error result; if (defaultHandler) reportDefault(parser, enc, s, next); result = doIgnoreSection(parser, enc, &next, end, nextPtr); if (!next) { processor = ignoreSectionProcessor; return result; } } break; #endif /* XML_DTD */ case XML_ROLE_GROUP_OPEN: if (prologState.level >= groupSize) { if (groupSize) groupConnector = realloc(groupConnector, groupSize *= 2); else groupConnector = malloc(groupSize = 32); if (!groupConnector) return XML_ERROR_NO_MEMORY; } groupConnector[prologState.level] = 0; break; case XML_ROLE_GROUP_SEQUENCE: if (groupConnector[prologState.level] == '|') return XML_ERROR_SYNTAX; groupConnector[prologState.level] = ','; break; case XML_ROLE_GROUP_CHOICE: if (groupConnector[prologState.level] == ',') return XML_ERROR_SYNTAX; groupConnector[prologState.level] = '|'; break; case XML_ROLE_PARAM_ENTITY_REF: #ifdef XML_DTD case XML_ROLE_INNER_PARAM_ENTITY_REF: if (paramEntityParsing && (dtd.complete || role == XML_ROLE_INNER_PARAM_ENTITY_REF)) { const XML_Char *name; ENTITY *entity; name = poolStoreString(&dtd.pool, enc, s + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0); poolDiscard(&dtd.pool); if (!entity) { /* FIXME what to do if !dtd.complete? */ return XML_ERROR_UNDEFINED_ENTITY; } if (entity->open) return XML_ERROR_RECURSIVE_ENTITY_REF; if (entity->textPtr) { enum XML_Error result; result = processInternalParamEntity(parser, entity); if (result != XML_ERROR_NONE) return result; break; } if (role == XML_ROLE_INNER_PARAM_ENTITY_REF) return XML_ERROR_PARAM_ENTITY_REF; if (externalEntityRefHandler) { dtd.complete = 0; entity->open = 1; if (!externalEntityRefHandler(externalEntityRefHandlerArg, 0, entity->base, entity->systemId, entity->publicId)) { entity->open = 0; return XML_ERROR_EXTERNAL_ENTITY_HANDLING; } entity->open = 0; if (dtd.complete) break; } } #endif /* XML_DTD */ if (!dtd.standalone && notStandaloneHandler && !notStandaloneHandler(handlerArg)) return XML_ERROR_NOT_STANDALONE; dtd.complete = 0; if (defaultHandler) reportDefault(parser, enc, s, next); break; case XML_ROLE_NONE: switch (tok) { case XML_TOK_PI: if (!reportProcessingInstruction(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: if (!reportComment(parser, enc, s, next)) return XML_ERROR_NO_MEMORY; break; } break; } if (defaultHandler) { switch (tok) { case XML_TOK_PI: case XML_TOK_COMMENT: case XML_TOK_BOM: case XML_TOK_XML_DECL: #ifdef XML_DTD case XML_TOK_IGNORE_SECT: #endif /* XML_DTD */ case XML_TOK_PARAM_ENTITY_REF: break; default: #ifdef XML_DTD if (role != XML_ROLE_IGNORE_SECT) #endif /* XML_DTD */ reportDefault(parser, enc, s, next); } } s = next; tok = XmlPrologTok(enc, s, end, &next); } /* not reached */ } static enum XML_Error epilogProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { processor = epilogProcessor; eventPtr = s; for (;;) { const char *next; int tok = XmlPrologTok(encoding, s, end, &next); eventEndPtr = next; switch (tok) { case -XML_TOK_PROLOG_S: if (defaultHandler) { eventEndPtr = end; reportDefault(parser, encoding, s, end); } /* fall through */ case XML_TOK_NONE: if (nextPtr) *nextPtr = end; return XML_ERROR_NONE; case XML_TOK_PROLOG_S: if (defaultHandler) reportDefault(parser, encoding, s, next); break; case XML_TOK_PI: if (!reportProcessingInstruction(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_COMMENT: if (!reportComment(parser, encoding, s, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_INVALID: eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_UNCLOSED_TOKEN; case XML_TOK_PARTIAL_CHAR: if (nextPtr) { *nextPtr = s; return XML_ERROR_NONE; } return XML_ERROR_PARTIAL_CHAR; default: return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; } eventPtr = s = next; } } #ifdef XML_DTD static enum XML_Error processInternalParamEntity(XML_Parser parser, ENTITY *entity) { const char *s, *end, *next; int tok; enum XML_Error result; OPEN_INTERNAL_ENTITY openEntity; entity->open = 1; openEntity.next = openInternalEntities; openInternalEntities = &openEntity; openEntity.entity = entity; openEntity.internalEventPtr = 0; openEntity.internalEventEndPtr = 0; s = (char *)entity->textPtr; end = (char *)(entity->textPtr + entity->textLen); tok = XmlPrologTok(internalEncoding, s, end, &next); result = doProlog(parser, internalEncoding, s, end, tok, next, 0); entity->open = 0; openInternalEntities = openEntity.next; return result; } #endif /* XML_DTD */ static enum XML_Error errorProcessor(XML_Parser parser, const char *s, const char *end, const char **nextPtr) { return errorCode; } static enum XML_Error storeAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata, const char *ptr, const char *end, STRING_POOL *pool) { enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, end, pool); if (result) return result; if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) poolChop(pool); if (!poolAppendChar(pool, XML_T('\0'))) return XML_ERROR_NO_MEMORY; return XML_ERROR_NONE; } static enum XML_Error appendAttributeValue(XML_Parser parser, const ENCODING *enc, int isCdata, const char *ptr, const char *end, STRING_POOL *pool) { for (;;) { const char *next; int tok = XmlAttributeValueTok(enc, ptr, end, &next); switch (tok) { case XML_TOK_NONE: return XML_ERROR_NONE; case XML_TOK_INVALID: if (enc == encoding) eventPtr = next; return XML_ERROR_INVALID_TOKEN; case XML_TOK_PARTIAL: if (enc == encoding) eventPtr = ptr; return XML_ERROR_INVALID_TOKEN; case XML_TOK_CHAR_REF: { XML_Char buf[XML_ENCODE_MAX]; int i; int n = XmlCharRefNumber(enc, ptr); if (n < 0) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BAD_CHAR_REF; } if (!isCdata && n == 0x20 /* space */ && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) break; n = XmlEncode(n, (ICHAR *)buf); if (!n) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BAD_CHAR_REF; } for (i = 0; i < n; i++) { if (!poolAppendChar(pool, buf[i])) return XML_ERROR_NO_MEMORY; } } break; case XML_TOK_DATA_CHARS: if (!poolAppend(pool, enc, ptr, next)) return XML_ERROR_NO_MEMORY; break; // break; // BCPPB found this one case XML_TOK_TRAILING_CR: next = ptr + enc->minBytesPerChar; /* fall through */ case XML_TOK_ATTRIBUTE_VALUE_S: case XML_TOK_DATA_NEWLINE: if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) break; if (!poolAppendChar(pool, 0x20)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_ENTITY_REF: { const XML_Char *name; ENTITY *entity; XML_Char ch = XmlPredefinedEntityName(enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (ch) { if (!poolAppendChar(pool, ch)) return XML_ERROR_NO_MEMORY; break; } name = poolStoreString(&temp2Pool, enc, ptr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.generalEntities, name, 0); poolDiscard(&temp2Pool); if (!entity) { if (dtd.complete) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_UNDEFINED_ENTITY; } } else if (entity->open) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_RECURSIVE_ENTITY_REF; } else if (entity->notation) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_BINARY_ENTITY_REF; } else if (!entity->textPtr) { if (enc == encoding) eventPtr = ptr; return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; } else { enum XML_Error result; const XML_Char *textEnd = entity->textPtr + entity->textLen; entity->open = 1; result = appendAttributeValue(parser, internalEncoding, isCdata, (char *)entity->textPtr, (char *)textEnd, pool); entity->open = 0; if (result) return result; } } break; default: abort(); } ptr = next; } /* not reached */ } static enum XML_Error storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *entityTextPtr, const char *entityTextEnd) { STRING_POOL *pool = &(dtd.pool); for (;;) { const char *next; int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); switch (tok) { case XML_TOK_PARAM_ENTITY_REF: #ifdef XML_DTD if (parentParser || enc != encoding) { enum XML_Error result; const XML_Char *name; ENTITY *entity; name = poolStoreString(&tempPool, enc, entityTextPtr + enc->minBytesPerChar, next - enc->minBytesPerChar); if (!name) return XML_ERROR_NO_MEMORY; entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0); poolDiscard(&tempPool); if (!entity) { if (enc == encoding) eventPtr = entityTextPtr; return XML_ERROR_UNDEFINED_ENTITY; } if (entity->open) { if (enc == encoding) eventPtr = entityTextPtr; return XML_ERROR_RECURSIVE_ENTITY_REF; } if (entity->systemId) { if (enc == encoding) eventPtr = entityTextPtr; return XML_ERROR_PARAM_ENTITY_REF; } entity->open = 1; result = storeEntityValue(parser, internalEncoding, (char *)entity->textPtr, (char *)(entity->textPtr + entity->textLen)); entity->open = 0; if (result) return result; break; } #endif /* XML_DTD */ eventPtr = entityTextPtr; return XML_ERROR_SYNTAX; case XML_TOK_NONE: return XML_ERROR_NONE; case XML_TOK_ENTITY_REF: case XML_TOK_DATA_CHARS: if (!poolAppend(pool, enc, entityTextPtr, next)) return XML_ERROR_NO_MEMORY; break; case XML_TOK_TRAILING_CR: next = entityTextPtr + enc->minBytesPerChar; /* fall through */ case XML_TOK_DATA_NEWLINE: if (pool->end == pool->ptr && !poolGrow(pool)) return XML_ERROR_NO_MEMORY; *(pool->ptr)++ = 0xA; break; case XML_TOK_CHAR_REF: { XML_Char buf[XML_ENCODE_MAX]; int i; int n = XmlCharRefNumber(enc, entityTextPtr); if (n < 0) { if (enc == encoding) eventPtr = entityTextPtr; return XML_ERROR_BAD_CHAR_REF; } n = XmlEncode(n, (ICHAR *)buf); if (!n) { if (enc == encoding) eventPtr = entityTextPtr; return XML_ERROR_BAD_CHAR_REF; } for (i = 0; i < n; i++) { if (pool->end == pool->ptr && !poolGrow(pool)) return XML_ERROR_NO_MEMORY; *(pool->ptr)++ = buf[i]; } } break; case XML_TOK_PARTIAL: if (enc == encoding) eventPtr = entityTextPtr; return XML_ERROR_INVALID_TOKEN; case XML_TOK_INVALID: if (enc == encoding) eventPtr = next; return XML_ERROR_INVALID_TOKEN; default: abort(); } entityTextPtr = next; } /* not reached */ } static void normalizeLines(XML_Char *s) { XML_Char *p; for (;; s++) { if (*s == XML_T('\0')) return; if (*s == 0xD) break; } p = s; do { if (*s == 0xD) { *p++ = 0xA; if (*++s == 0xA) s++; } else *p++ = *s++; } while (*s); *p = XML_T('\0'); } static int reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { const XML_Char *target; XML_Char *data; const char *tem; if (!processingInstructionHandler) { if (defaultHandler) reportDefault(parser, enc, start, end); return 1; } start += enc->minBytesPerChar * 2; tem = start + XmlNameLength(enc, start); target = poolStoreString(&tempPool, enc, start, tem); if (!target) return 0; poolFinish(&tempPool); data = poolStoreString(&tempPool, enc, XmlSkipS(enc, tem), end - enc->minBytesPerChar*2); if (!data) return 0; normalizeLines(data); processingInstructionHandler(handlerArg, target, data); poolClear(&tempPool); return 1; } static int reportComment(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { XML_Char *data; if (!commentHandler) { if (defaultHandler) reportDefault(parser, enc, start, end); return 1; } data = poolStoreString(&tempPool, enc, start + enc->minBytesPerChar * 4, end - enc->minBytesPerChar * 3); if (!data) return 0; normalizeLines(data); commentHandler(handlerArg, data); poolClear(&tempPool); return 1; } static void reportDefault(XML_Parser parser, const ENCODING *enc, const char *s, const char *end) { if (MUST_CONVERT(enc, s)) { const char **eventPP; const char **eventEndPP; if (enc == encoding) { eventPP = &eventPtr; eventEndPP = &eventEndPtr; } else { eventPP = &(openInternalEntities->internalEventPtr); eventEndPP = &(openInternalEntities->internalEventEndPtr); } do { ICHAR *dataPtr = (ICHAR *)dataBuf; XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); *eventEndPP = s; defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); *eventPP = s; } while (s != end); } else defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); } static int defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, int isCdata, int isId, const XML_Char *value) { DEFAULT_ATTRIBUTE *att; if (value || isId) { /* The handling of default attributes gets messed up if we have a default which duplicates a non-default. */ int i; for (i = 0; i < type->nDefaultAtts; i++) if (attId == type->defaultAtts[i].id) return 1; if (isId && !type->idAtt && !attId->xmlns) type->idAtt = attId; } if (type->nDefaultAtts == type->allocDefaultAtts) { if (type->allocDefaultAtts == 0) { type->allocDefaultAtts = 8; type->defaultAtts = malloc(type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } else { type->allocDefaultAtts *= 2; type->defaultAtts = realloc(type->defaultAtts, type->allocDefaultAtts*sizeof(DEFAULT_ATTRIBUTE)); } if (!type->defaultAtts) return 0; } att = type->defaultAtts + type->nDefaultAtts; att->id = attId; att->value = value; att->isCdata = isCdata; if (!isCdata) attId->maybeTokenized = 1; type->nDefaultAtts += 1; return 1; } static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) { const XML_Char *name; for (name = elementType->name; *name; name++) { if (*name == XML_T(':')) { PREFIX *prefix; const XML_Char *s; for (s = elementType->name; s != name; s++) { if (!poolAppendChar(&dtd.pool, *s)) return 0; } if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX)); if (!prefix) return 0; if (prefix->name == poolStart(&dtd.pool)) poolFinish(&dtd.pool); else poolDiscard(&dtd.pool); elementType->prefix = prefix; } } return 1; } static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, const char *end) { ATTRIBUTE_ID *id; const XML_Char *name; if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; name = poolStoreString(&dtd.pool, enc, start, end); if (!name) return 0; ++name; id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, name, sizeof(ATTRIBUTE_ID)); if (!id) return 0; if (id->name != name) poolDiscard(&dtd.pool); else { poolFinish(&dtd.pool); if (!ns) ; else if (name[0] == 'x' && name[1] == 'm' && name[2] == 'l' && name[3] == 'n' && name[4] == 's' && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { if (name[5] == '\0') id->prefix = &dtd.defaultPrefix; else id->prefix = (PREFIX *)lookup(&dtd.prefixes, name + 6, sizeof(PREFIX)); id->xmlns = 1; } else { int i; for (i = 0; name[i]; i++) { if (name[i] == XML_T(':')) { int j; for (j = 0; j < i; j++) { if (!poolAppendChar(&dtd.pool, name[j])) return 0; } if (!poolAppendChar(&dtd.pool, XML_T('\0'))) return 0; id->prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX)); if (id->prefix->name == poolStart(&dtd.pool)) poolFinish(&dtd.pool); else poolDiscard(&dtd.pool); break; } } } } return id; } #define CONTEXT_SEP XML_T('\f') static const XML_Char *getContext(XML_Parser parser) { HASH_TABLE_ITER iter; int needSep = 0; if (dtd.defaultPrefix.binding) { int i; int len; if (!poolAppendChar(&tempPool, XML_T('='))) return 0; len = dtd.defaultPrefix.binding->uriLen; if (namespaceSeparator != XML_T('\0')) len--; for (i = 0; i < len; i++) if (!poolAppendChar(&tempPool, dtd.defaultPrefix.binding->uri[i])) return 0; needSep = 1; } hashTableIterInit(&iter, &(dtd.prefixes)); for (;;) { int i; int len; const XML_Char *s; PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); if (!prefix) break; if (!prefix->binding) continue; if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) return 0; for (s = prefix->name; *s; s++) if (!poolAppendChar(&tempPool, *s)) return 0; if (!poolAppendChar(&tempPool, XML_T('='))) return 0; len = prefix->binding->uriLen; if (namespaceSeparator != XML_T('\0')) len--; for (i = 0; i < len; i++) if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) return 0; needSep = 1; } hashTableIterInit(&iter, &(dtd.generalEntities)); for (;;) { const XML_Char *s; ENTITY *e = (ENTITY *)hashTableIterNext(&iter); if (!e) break; if (!e->open) continue; if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) return 0; for (s = e->name; *s; s++) if (!poolAppendChar(&tempPool, *s)) return 0; needSep = 1; } if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; return tempPool.start; } static int setContext(XML_Parser parser, const XML_Char *context) { const XML_Char *s = context; while (*context != XML_T('\0')) { if (*s == CONTEXT_SEP || *s == XML_T('\0')) { ENTITY *e; if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; e = (ENTITY *)lookup(&dtd.generalEntities, poolStart(&tempPool), 0); if (e) e->open = 1; if (*s != XML_T('\0')) s++; context = s; poolDiscard(&tempPool); } else if (*s == '=') { PREFIX *prefix; if (poolLength(&tempPool) == 0) prefix = &dtd.defaultPrefix; else { if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&tempPool), sizeof(PREFIX)); if (!prefix) return 0; if (prefix->name == poolStart(&tempPool)) { prefix->name = poolCopyString(&dtd.pool, prefix->name); if (!prefix->name) return 0; } poolDiscard(&tempPool); } for (context = s + 1; *context != CONTEXT_SEP && *context != XML_T('\0'); context++) if (!poolAppendChar(&tempPool, *context)) return 0; if (!poolAppendChar(&tempPool, XML_T('\0'))) return 0; if (!addBinding(parser, prefix, 0, poolStart(&tempPool), &inheritedBindings)) return 0; poolDiscard(&tempPool); if (*context != XML_T('\0')) ++context; s = context; } else { if (!poolAppendChar(&tempPool, *s)) return 0; s++; } } return 1; } static void normalizePublicId(XML_Char *publicId) { XML_Char *p = publicId; XML_Char *s; for (s = publicId; *s; s++) { switch (*s) { case 0x20: case 0xD: case 0xA: if (p != publicId && p[-1] != 0x20) *p++ = 0x20; break; default: *p++ = *s; } } if (p != publicId && p[-1] == 0x20) --p; *p = XML_T('\0'); } static int dtdInit(DTD *p) { poolInit(&(p->pool)); hashTableInit(&(p->generalEntities)); hashTableInit(&(p->elementTypes)); hashTableInit(&(p->attributeIds)); hashTableInit(&(p->prefixes)); p->complete = 1; p->standalone = 0; #ifdef XML_DTD hashTableInit(&(p->paramEntities)); #endif /* XML_DTD */ p->defaultPrefix.name = 0; p->defaultPrefix.binding = 0; return 1; } #ifdef XML_DTD static void dtdSwap(DTD *p1, DTD *p2) { DTD tem; memcpy(&tem, p1, sizeof(DTD)); memcpy(p1, p2, sizeof(DTD)); memcpy(p2, &tem, sizeof(DTD)); } #endif /* XML_DTD */ static void dtdDestroy(DTD *p) { HASH_TABLE_ITER iter; hashTableIterInit(&iter, &(p->elementTypes)); for (;;) { ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); if (!e) break; if (e->allocDefaultAtts != 0) free(e->defaultAtts); } hashTableDestroy(&(p->generalEntities)); #ifdef XML_DTD hashTableDestroy(&(p->paramEntities)); #endif /* XML_DTD */ hashTableDestroy(&(p->elementTypes)); hashTableDestroy(&(p->attributeIds)); hashTableDestroy(&(p->prefixes)); poolDestroy(&(p->pool)); } /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise. The new DTD has already been initialized. */ static int dtdCopy(DTD *newDtd, const DTD *oldDtd) { HASH_TABLE_ITER iter; /* Copy the prefix table. */ hashTableIterInit(&iter, &(oldDtd->prefixes)); for (;;) { const XML_Char *name; const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); if (!oldP) break; name = poolCopyString(&(newDtd->pool), oldP->name); if (!name) return 0; if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) return 0; } hashTableIterInit(&iter, &(oldDtd->attributeIds)); /* Copy the attribute id table. */ for (;;) { ATTRIBUTE_ID *newA; const XML_Char *name; const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); if (!oldA) break; /* Remember to allocate the scratch byte before the name. */ if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) return 0; name = poolCopyString(&(newDtd->pool), oldA->name); if (!name) return 0; ++name; newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID)); if (!newA) return 0; newA->maybeTokenized = oldA->maybeTokenized; if (oldA->prefix) { newA->xmlns = oldA->xmlns; if (oldA->prefix == &oldDtd->defaultPrefix) newA->prefix = &newDtd->defaultPrefix; else newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldA->prefix->name, 0); } } /* Copy the element type table. */ hashTableIterInit(&iter, &(oldDtd->elementTypes)); for (;;) { int i; ELEMENT_TYPE *newE; const XML_Char *name; const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); if (!oldE) break; name = poolCopyString(&(newDtd->pool), oldE->name); if (!name) return 0; newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE)); if (!newE) return 0; if (oldE->nDefaultAtts) { newE->defaultAtts = (DEFAULT_ATTRIBUTE *)malloc(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); if (!newE->defaultAtts) return 0; } if (oldE->idAtt) newE->idAtt = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; if (oldE->prefix) newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldE->prefix->name, 0); for (i = 0; i < newE->nDefaultAtts; i++) { newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; if (oldE->defaultAtts[i].value) { newE->defaultAtts[i].value = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); if (!newE->defaultAtts[i].value) return 0; } else newE->defaultAtts[i].value = 0; } } /* Copy the entity tables. */ if (!copyEntityTable(&(newDtd->generalEntities), &(newDtd->pool), &(oldDtd->generalEntities))) return 0; #ifdef XML_DTD if (!copyEntityTable(&(newDtd->paramEntities), &(newDtd->pool), &(oldDtd->paramEntities))) return 0; #endif /* XML_DTD */ newDtd->complete = oldDtd->complete; newDtd->standalone = oldDtd->standalone; return 1; } static int copyEntityTable(HASH_TABLE *newTable, STRING_POOL *newPool, const HASH_TABLE *oldTable) { HASH_TABLE_ITER iter; const XML_Char *cachedOldBase = 0; const XML_Char *cachedNewBase = 0; hashTableIterInit(&iter, oldTable); for (;;) { ENTITY *newE; const XML_Char *name; const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); if (!oldE) break; name = poolCopyString(newPool, oldE->name); if (!name) return 0; newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); if (!newE) return 0; if (oldE->systemId) { const XML_Char *tem = poolCopyString(newPool, oldE->systemId); if (!tem) return 0; newE->systemId = tem; if (oldE->base) { if (oldE->base == cachedOldBase) newE->base = cachedNewBase; else { cachedOldBase = oldE->base; tem = poolCopyString(newPool, cachedOldBase); if (!tem) return 0; cachedNewBase = newE->base = tem; } } } else { const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, oldE->textLen); if (!tem) return 0; newE->textPtr = tem; newE->textLen = oldE->textLen; } if (oldE->notation) { const XML_Char *tem = poolCopyString(newPool, oldE->notation); if (!tem) return 0; newE->notation = tem; } } return 1; } #define INIT_SIZE 64 static int keyeq(KEY s1, KEY s2) { for (; *s1 == *s2; s1++, s2++) if (*s1 == 0) return 1; return 0; } static unsigned long hash(KEY s) { unsigned long h = 0; while (*s) h = (h << 5) + h + (unsigned char)*s++; return h; } static NAMED *lookup(HASH_TABLE *table, KEY name, size_t createSize) { size_t i; if (table->size == 0) { if (!createSize) return 0; table->v = calloc(INIT_SIZE, sizeof(NAMED *)); if (!table->v) return 0; table->size = INIT_SIZE; table->usedLim = INIT_SIZE / 2; i = hash(name) & (table->size - 1); } else { unsigned long h = hash(name); for (i = h & (table->size - 1); table->v[i]; i == 0 ? i = table->size - 1 : --i) { if (keyeq(name, table->v[i]->name)) return table->v[i]; } if (!createSize) return 0; if (table->used == table->usedLim) { /* check for overflow */ size_t newSize = table->size * 2; NAMED **newV = calloc(newSize, sizeof(NAMED *)); if (!newV) return 0; for (i = 0; i < table->size; i++) if (table->v[i]) { size_t j; for (j = hash(table->v[i]->name) & (newSize - 1); newV[j]; j == 0 ? j = newSize - 1 : --j) ; newV[j] = table->v[i]; } free(table->v); table->v = newV; table->size = newSize; table->usedLim = newSize/2; for (i = h & (table->size - 1); table->v[i]; i == 0 ? i = table->size - 1 : --i) ; } } table->v[i] = calloc(1, createSize); if (!table->v[i]) return 0; table->v[i]->name = name; (table->used)++; return table->v[i]; } static void hashTableDestroy(HASH_TABLE *table) { size_t i; for (i = 0; i < table->size; i++) { NAMED *p = table->v[i]; if (p) free(p); } if (table->v) free(table->v); } static void hashTableInit(HASH_TABLE *p) { p->size = 0; p->usedLim = 0; p->used = 0; p->v = 0; } static void hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) { iter->p = table->v; iter->end = iter->p + table->size; } static NAMED *hashTableIterNext(HASH_TABLE_ITER *iter) { while (iter->p != iter->end) { NAMED *tem = *(iter->p)++; if (tem) return tem; } return 0; } static void poolInit(STRING_POOL *pool) { pool->blocks = 0; pool->freeBlocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; } static void poolClear(STRING_POOL *pool) { if (!pool->freeBlocks) pool->freeBlocks = pool->blocks; else { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; p->next = pool->freeBlocks; pool->freeBlocks = p; p = tem; } } pool->blocks = 0; pool->start = 0; pool->ptr = 0; pool->end = 0; } static void poolDestroy(STRING_POOL *pool) { BLOCK *p = pool->blocks; while (p) { BLOCK *tem = p->next; free(p); p = tem; } pool->blocks = 0; p = pool->freeBlocks; while (p) { BLOCK *tem = p->next; free(p); p = tem; } pool->freeBlocks = 0; pool->ptr = 0; pool->start = 0; pool->end = 0; } static XML_Char *poolAppend(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end) { if (!pool->ptr && !poolGrow(pool)) return 0; for (;;) { XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); if (ptr == end) break; if (!poolGrow(pool)) return 0; } return pool->start; } static const XML_Char *poolCopyString(STRING_POOL *pool, const XML_Char *s) { do { if (!poolAppendChar(pool, *s)) return 0; } while (*s++); s = pool->start; poolFinish(pool); return s; } static const XML_Char *poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) { if (!pool->ptr && !poolGrow(pool)) return 0; for (; n > 0; --n, s++) { if (!poolAppendChar(pool, *s)) return 0; } s = pool->start; poolFinish(pool); return s; } static XML_Char *poolStoreString(STRING_POOL *pool, const ENCODING *enc, const char *ptr, const char *end) { if (!poolAppend(pool, enc, ptr, end)) return 0; if (pool->ptr == pool->end && !poolGrow(pool)) return 0; *(pool->ptr)++ = 0; return pool->start; } static int poolGrow(STRING_POOL *pool) { if (pool->freeBlocks) { if (pool->start == 0) { pool->blocks = pool->freeBlocks; pool->freeBlocks = pool->freeBlocks->next; pool->blocks->next = 0; pool->start = pool->blocks->s; pool->end = pool->start + pool->blocks->size; pool->ptr = pool->start; return 1; } if (pool->end - pool->start < pool->freeBlocks->size) { BLOCK *tem = pool->freeBlocks->next; pool->freeBlocks->next = pool->blocks; pool->blocks = pool->freeBlocks; pool->freeBlocks = tem; memcpy(pool->blocks->s, pool->start, (pool->end - pool->start) * sizeof(XML_Char)); pool->ptr = pool->blocks->s + (pool->ptr - pool->start); pool->start = pool->blocks->s; pool->end = pool->start + pool->blocks->size; return 1; } } if (pool->blocks && pool->start == pool->blocks->s) { int blockSize = (pool->end - pool->start)*2; pool->blocks = realloc(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!pool->blocks) return 0; pool->blocks->size = blockSize; pool->ptr = pool->blocks->s + (pool->ptr - pool->start); pool->start = pool->blocks->s; pool->end = pool->start + blockSize; } else { BLOCK *tem; int blockSize = pool->end - pool->start; if (blockSize < INIT_BLOCK_SIZE) blockSize = INIT_BLOCK_SIZE; else blockSize *= 2; tem = malloc(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); if (!tem) return 0; tem->size = blockSize; tem->next = pool->blocks; pool->blocks = tem; if (pool->ptr != pool->start) memcpy(tem->s, pool->start, (pool->ptr - pool->start) * sizeof(XML_Char)); pool->ptr = tem->s + (pool->ptr - pool->start); pool->start = tem->s; pool->end = tem->s + blockSize; } return 1; } syncevolution-1.5/src/synthesis/src/expat/xmlparse/xmlparse.h0000755000373300037200000004704412424517753026311 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #ifndef XmlParse_INCLUDED #define XmlParse_INCLUDED 1 #ifdef __cplusplus extern "C" { #endif #ifndef XMLPARSEAPI #define XMLPARSEAPI /* as nothing */ #endif typedef void *XML_Parser; #ifdef XML_UNICODE_WCHAR_T /* XML_UNICODE_WCHAR_T will work only if sizeof(wchar_t) == 2 and wchar_t uses Unicode. */ /* Information is UTF-16 encoded as wchar_ts */ #ifndef XML_UNICODE #define XML_UNICODE #endif #include typedef wchar_t XML_Char; typedef wchar_t XML_LChar; #else /* not XML_UNICODE_WCHAR_T */ #ifdef XML_UNICODE /* Information is UTF-16 encoded as unsigned shorts */ typedef unsigned short XML_Char; typedef char XML_LChar; #else /* not XML_UNICODE */ /* Information is UTF-8 encoded. */ typedef char XML_Char; typedef char XML_LChar; #endif /* not XML_UNICODE */ #endif /* not XML_UNICODE_WCHAR_T */ /* Constructs a new parser; encoding is the encoding specified by the external protocol or null if there is none specified. */ XML_Parser XMLPARSEAPI XML_ParserCreate(const XML_Char *encoding); /* Constructs a new parser and namespace processor. Element type names and attribute names that belong to a namespace will be expanded; unprefixed attribute names are never expanded; unprefixed element type names are expanded only if there is a default namespace. The expanded name is the concatenation of the namespace URI, the namespace separator character, and the local part of the name. If the namespace separator is '\0' then the namespace URI and the local part will be concatenated without any separator. When a namespace is not declared, the name and prefix will be passed through without expansion. */ XML_Parser XMLPARSEAPI XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); /* atts is array of name/value pairs, terminated by 0; names and values are 0 terminated. */ typedef void (*XML_StartElementHandler)(void *userData, const XML_Char *name, const XML_Char **atts); typedef void (*XML_EndElementHandler)(void *userData, const XML_Char *name); /* s is not 0 terminated. */ typedef void (*XML_CharacterDataHandler)(void *userData, const XML_Char *s, int len); /* target and data are 0 terminated */ typedef void (*XML_ProcessingInstructionHandler)(void *userData, const XML_Char *target, const XML_Char *data); /* data is 0 terminated */ typedef void (*XML_CommentHandler)(void *userData, const XML_Char *data); typedef void (*XML_StartCdataSectionHandler)(void *userData); typedef void (*XML_EndCdataSectionHandler)(void *userData); /* This is called for any characters in the XML document for which there is no applicable handler. This includes both characters that are part of markup which is of a kind that is not reported (comments, markup declarations), or characters that are part of a construct which could be reported but for which no handler has been supplied. The characters are passed exactly as they were in the XML document except that they will be encoded in UTF-8. Line boundaries are not normalized. Note that a byte order mark character is not passed to the default handler. There are no guarantees about how characters are divided between calls to the default handler: for example, a comment might be split between multiple calls. */ typedef void (*XML_DefaultHandler)(void *userData, const XML_Char *s, int len); /* This is called for the start of the DOCTYPE declaration when the name of the DOCTYPE is encountered. */ typedef void (*XML_StartDoctypeDeclHandler)(void *userData, const XML_Char *doctypeName); /* This is called for the start of the DOCTYPE declaration when the closing > is encountered, but after processing any external subset. */ typedef void (*XML_EndDoctypeDeclHandler)(void *userData); /* This is called for a declaration of an unparsed (NDATA) entity. The base argument is whatever was set by XML_SetBase. The entityName, systemId and notationName arguments will never be null. The other arguments may be. */ typedef void (*XML_UnparsedEntityDeclHandler)(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName); /* This is called for a declaration of notation. The base argument is whatever was set by XML_SetBase. The notationName will never be null. The other arguments can be. */ typedef void (*XML_NotationDeclHandler)(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); typedef void (*XML_ExternalParsedEntityDeclHandler)(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); typedef void (*XML_InternalParsedEntityDeclHandler)(void *userData, const XML_Char *entityName, const XML_Char *replacementText, int replacementTextLength); /* When namespace processing is enabled, these are called once for each namespace declaration. The call to the start and end element handlers occur between the calls to the start and end namespace declaration handlers. For an xmlns attribute, prefix will be null. For an xmlns="" attribute, uri will be null. */ typedef void (*XML_StartNamespaceDeclHandler)(void *userData, const XML_Char *prefix, const XML_Char *uri); typedef void (*XML_EndNamespaceDeclHandler)(void *userData, const XML_Char *prefix); /* This is called if the document is not standalone (it has an external subset or a reference to a parameter entity, but does not have standalone="yes"). If this handler returns 0, then processing will not continue, and the parser will return a XML_ERROR_NOT_STANDALONE error. */ typedef int (*XML_NotStandaloneHandler)(void *userData); /* This is called for a reference to an external parsed general entity. The referenced entity is not automatically parsed. The application can parse it immediately or later using XML_ExternalEntityParserCreate. The parser argument is the parser parsing the entity containing the reference; it can be passed as the parser argument to XML_ExternalEntityParserCreate. The systemId argument is the system identifier as specified in the entity declaration; it will not be null. The base argument is the system identifier that should be used as the base for resolving systemId if systemId was relative; this is set by XML_SetBase; it may be null. The publicId argument is the public identifier as specified in the entity declaration, or null if none was specified; the whitespace in the public identifier will have been normalized as required by the XML spec. The context argument specifies the parsing context in the format expected by the context argument to XML_ExternalEntityParserCreate; context is valid only until the handler returns, so if the referenced entity is to be parsed later, it must be copied. The handler should return 0 if processing should not continue because of a fatal error in the handling of the external entity. In this case the calling parser will return an XML_ERROR_EXTERNAL_ENTITY_HANDLING error. Note that unlike other handlers the first argument is the parser, not userData. */ typedef int (*XML_ExternalEntityRefHandler)(XML_Parser parser, const XML_Char *context, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId); /* This structure is filled in by the XML_UnknownEncodingHandler to provide information to the parser about encodings that are unknown to the parser. The map[b] member gives information about byte sequences whose first byte is b. If map[b] is c where c is >= 0, then b by itself encodes the Unicode scalar value c. If map[b] is -1, then the byte sequence is malformed. If map[b] is -n, where n >= 2, then b is the first byte of an n-byte sequence that encodes a single Unicode scalar value. The data member will be passed as the first argument to the convert function. The convert function is used to convert multibyte sequences; s will point to a n-byte sequence where map[(unsigned char)*s] == -n. The convert function must return the Unicode scalar value represented by this byte sequence or -1 if the byte sequence is malformed. The convert function may be null if the encoding is a single-byte encoding, that is if map[b] >= -1 for all bytes b. When the parser is finished with the encoding, then if release is not null, it will call release passing it the data member; once release has been called, the convert function will not be called again. Expat places certain restrictions on the encodings that are supported using this mechanism. 1. Every ASCII character that can appear in a well-formed XML document, other than the characters $@\^`{}~ must be represented by a single byte, and that byte must be the same byte that represents that character in ASCII. 2. No character may require more than 4 bytes to encode. 3. All characters encoded must have Unicode scalar values <= 0xFFFF, (ie characters that would be encoded by surrogates in UTF-16 are not allowed). Note that this restriction doesn't apply to the built-in support for UTF-8 and UTF-16. 4. No Unicode character may be encoded by more than one distinct sequence of bytes. */ typedef struct { int map[256]; void *data; int (*convert)(void *data, const char *s); void (*release)(void *data); } XML_Encoding; /* This is called for an encoding that is unknown to the parser. The encodingHandlerData argument is that which was passed as the second argument to XML_SetUnknownEncodingHandler. The name argument gives the name of the encoding as specified in the encoding declaration. If the callback can provide information about the encoding, it must fill in the XML_Encoding structure, and return 1. Otherwise it must return 0. If info does not describe a suitable encoding, then the parser will return an XML_UNKNOWN_ENCODING error. */ typedef int (*XML_UnknownEncodingHandler)(void *encodingHandlerData, const XML_Char *name, XML_Encoding *info); void XMLPARSEAPI XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end); void XMLPARSEAPI XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler); void XMLPARSEAPI XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler); void XMLPARSEAPI XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler); void XMLPARSEAPI XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end); /* This sets the default handler and also inhibits expansion of internal entities. The entity reference will be passed to the default handler. */ void XMLPARSEAPI XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler); /* This sets the default handler but does not inhibit expansion of internal entities. The entity reference will not be passed to the default handler. */ void XMLPARSEAPI XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler); void XMLPARSEAPI XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end); void XMLPARSEAPI XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler); void XMLPARSEAPI XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler); void XMLPARSEAPI XML_SetExternalParsedEntityDeclHandler(XML_Parser parser, XML_ExternalParsedEntityDeclHandler handler); void XMLPARSEAPI XML_SetInternalParsedEntityDeclHandler(XML_Parser parser, XML_InternalParsedEntityDeclHandler handler); void XMLPARSEAPI XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end); void XMLPARSEAPI XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler); void XMLPARSEAPI XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler); /* If a non-null value for arg is specified here, then it will be passed as the first argument to the external entity ref handler instead of the parser object. */ void XMLPARSEAPI XML_SetExternalEntityRefHandlerArg(XML_Parser, void *arg); void XMLPARSEAPI XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData); /* This can be called within a handler for a start element, end element, processing instruction or character data. It causes the corresponding markup to be passed to the default handler. */ void XMLPARSEAPI XML_DefaultCurrent(XML_Parser parser); /* This value is passed as the userData argument to callbacks. */ void XMLPARSEAPI XML_SetUserData(XML_Parser parser, void *userData); /* Returns the last value set by XML_SetUserData or null. */ #define XML_GetUserData(parser) (*(void **)(parser)) /* This is equivalent to supplying an encoding argument to XML_ParserCreate. It must not be called after XML_Parse or XML_ParseBuffer. */ int XMLPARSEAPI XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); /* If this function is called, then the parser will be passed as the first argument to callbacks instead of userData. The userData will still be accessible using XML_GetUserData. */ void XMLPARSEAPI XML_UseParserAsHandlerArg(XML_Parser parser); /* Sets the base to be used for resolving relative URIs in system identifiers in declarations. Resolving relative identifiers is left to the application: this value will be passed through as the base argument to the XML_ExternalEntityRefHandler, XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base argument will be copied. Returns zero if out of memory, non-zero otherwise. */ int XMLPARSEAPI XML_SetBase(XML_Parser parser, const XML_Char *base); const XML_Char XMLPARSEAPI * XML_GetBase(XML_Parser parser); /* Returns the number of the attribute/value pairs passed in last call to the XML_StartElementHandler that were specified in the start-tag rather than defaulted. Each attribute/value pair counts as 2; thus this correspondds to an index into the atts array passed to the XML_StartElementHandler. */ int XMLPARSEAPI XML_GetSpecifiedAttributeCount(XML_Parser parser); /* Returns the index of the ID attribute passed in the last call to XML_StartElementHandler, or -1 if there is no ID attribute. Each attribute/value pair counts as 2; thus this correspondds to an index into the atts array passed to the XML_StartElementHandler. */ int XMLPARSEAPI XML_GetIdAttributeIndex(XML_Parser parser); /* Parses some input. Returns 0 if a fatal error is detected. The last call to XML_Parse must have isFinal true; len may be zero for this call (or any other). */ int XMLPARSEAPI XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); void XMLPARSEAPI * XML_GetBuffer(XML_Parser parser, int len); int XMLPARSEAPI XML_ParseBuffer(XML_Parser parser, int len, int isFinal); /* Creates an XML_Parser object that can parse an external general entity; context is a '\0'-terminated string specifying the parse context; encoding is a '\0'-terminated string giving the name of the externally specified encoding, or null if there is no externally specified encoding. The context string consists of a sequence of tokens separated by formfeeds (\f); a token consisting of a name specifies that the general entity of the name is open; a token of the form prefix=uri specifies the namespace for a particular prefix; a token of the form =uri specifies the default namespace. This can be called at any point after the first call to an ExternalEntityRefHandler so longer as the parser has not yet been freed. The new parser is completely independent and may safely be used in a separate thread. The handlers and userData are initialized from the parser argument. Returns 0 if out of memory. Otherwise returns a new XML_Parser object. */ XML_Parser XMLPARSEAPI XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *context, const XML_Char *encoding); enum XML_ParamEntityParsing { XML_PARAM_ENTITY_PARSING_NEVER, XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, XML_PARAM_ENTITY_PARSING_ALWAYS }; /* Controls parsing of parameter entities (including the external DTD subset). If parsing of parameter entities is enabled, then references to external parameter entities (including the external DTD subset) will be passed to the handler set with XML_SetExternalEntityRefHandler. The context passed will be 0. Unlike external general entities, external parameter entities can only be parsed synchronously. If the external parameter entity is to be parsed, it must be parsed during the call to the external entity ref handler: the complete sequence of XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and XML_ParserFree calls must be made during this call. After XML_ExternalEntityParserCreate has been called to create the parser for the external parameter entity (context must be 0 for this call), it is illegal to make any calls on the old parser until XML_ParserFree has been called on the newly created parser. If the library has been compiled without support for parameter entity parsing (ie without XML_DTD being defined), then XML_SetParamEntityParsing will return 0 if parsing of parameter entities is requested; otherwise it will return non-zero. */ int XMLPARSEAPI XML_SetParamEntityParsing(XML_Parser parser, enum XML_ParamEntityParsing parsing); enum XML_Error { XML_ERROR_NONE, XML_ERROR_NO_MEMORY, XML_ERROR_SYNTAX, XML_ERROR_NO_ELEMENTS, XML_ERROR_INVALID_TOKEN, XML_ERROR_UNCLOSED_TOKEN, XML_ERROR_PARTIAL_CHAR, XML_ERROR_TAG_MISMATCH, XML_ERROR_DUPLICATE_ATTRIBUTE, XML_ERROR_JUNK_AFTER_DOC_ELEMENT, XML_ERROR_PARAM_ENTITY_REF, XML_ERROR_UNDEFINED_ENTITY, XML_ERROR_RECURSIVE_ENTITY_REF, XML_ERROR_ASYNC_ENTITY, XML_ERROR_BAD_CHAR_REF, XML_ERROR_BINARY_ENTITY_REF, XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, XML_ERROR_MISPLACED_XML_PI, XML_ERROR_UNKNOWN_ENCODING, XML_ERROR_INCORRECT_ENCODING, XML_ERROR_UNCLOSED_CDATA_SECTION, XML_ERROR_EXTERNAL_ENTITY_HANDLING, XML_ERROR_NOT_STANDALONE }; /* If XML_Parse or XML_ParseBuffer have returned 0, then XML_GetErrorCode returns information about the error. */ enum XML_Error XMLPARSEAPI XML_GetErrorCode(XML_Parser parser); /* These functions return information about the current parse location. They may be called when XML_Parse or XML_ParseBuffer return 0; in this case the location is the location of the character at which the error was detected. They may also be called from any other callback called to report some parse event; in this the location is the location of the first of the sequence of characters that generated the event. */ int XMLPARSEAPI XML_GetCurrentLineNumber(XML_Parser parser); int XMLPARSEAPI XML_GetCurrentColumnNumber(XML_Parser parser); long XMLPARSEAPI XML_GetCurrentByteIndex(XML_Parser parser); /* Return the number of bytes in the current event. Returns 0 if the event is in an internal entity. */ int XMLPARSEAPI XML_GetCurrentByteCount(XML_Parser parser); /* For backwards compatibility with previous versions. */ #define XML_GetErrorLineNumber XML_GetCurrentLineNumber #define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber #define XML_GetErrorByteIndex XML_GetCurrentByteIndex /* Frees memory used by the parser. */ void XMLPARSEAPI XML_ParserFree(XML_Parser parser); /* Returns a string describing the error. */ const XML_LChar XMLPARSEAPI *XML_ErrorString(int code); #ifdef __cplusplus } #endif #endif /* not XmlParse_INCLUDED */ syncevolution-1.5/src/synthesis/src/expat/xmltok/0000755000373300037200000000000012424517753023754 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/expat/xmltok/ascii.h0000755000373300037200000000342612424517753025225 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #define ASCII_A 0x41 #define ASCII_B 0x42 #define ASCII_C 0x43 #define ASCII_D 0x44 #define ASCII_E 0x45 #define ASCII_F 0x46 #define ASCII_G 0x47 #define ASCII_H 0x48 #define ASCII_I 0x49 #define ASCII_J 0x4A #define ASCII_K 0x4B #define ASCII_L 0x4C #define ASCII_M 0x4D #define ASCII_N 0x4E #define ASCII_O 0x4F #define ASCII_P 0x50 #define ASCII_Q 0x51 #define ASCII_R 0x52 #define ASCII_S 0x53 #define ASCII_T 0x54 #define ASCII_U 0x55 #define ASCII_V 0x56 #define ASCII_W 0x57 #define ASCII_X 0x58 #define ASCII_Y 0x59 #define ASCII_Z 0x5A #define ASCII_a 0x61 #define ASCII_b 0x62 #define ASCII_c 0x63 #define ASCII_d 0x64 #define ASCII_e 0x65 #define ASCII_f 0x66 #define ASCII_g 0x67 #define ASCII_h 0x68 #define ASCII_i 0x69 #define ASCII_j 0x6A #define ASCII_k 0x6B #define ASCII_l 0x6C #define ASCII_m 0x6D #define ASCII_n 0x6E #define ASCII_o 0x6F #define ASCII_p 0x70 #define ASCII_q 0x71 #define ASCII_r 0x72 #define ASCII_s 0x73 #define ASCII_t 0x74 #define ASCII_u 0x75 #define ASCII_v 0x76 #define ASCII_w 0x77 #define ASCII_x 0x78 #define ASCII_y 0x79 #define ASCII_z 0x7A #define ASCII_0 0x30 #define ASCII_1 0x31 #define ASCII_2 0x32 #define ASCII_3 0x33 #define ASCII_4 0x34 #define ASCII_5 0x35 #define ASCII_6 0x36 #define ASCII_7 0x37 #define ASCII_8 0x38 #define ASCII_9 0x39 #define ASCII_TAB 0x09 #define ASCII_SPACE 0x20 #define ASCII_EXCL 0x21 #define ASCII_QUOT 0x22 #define ASCII_AMP 0x26 #define ASCII_APOS 0x27 #define ASCII_MINUS 0x2D #define ASCII_PERIOD 0x2E #define ASCII_COLON 0x3A #define ASCII_SEMI 0x3B #define ASCII_LT 0x3C #define ASCII_EQUALS 0x3D #define ASCII_GT 0x3E #define ASCII_LSQB 0x5B #define ASCII_RSQB 0x5D #define ASCII_UNDERSCORE 0x5F syncevolution-1.5/src/synthesis/src/expat/xmltok/asciitab.h0000755000373300037200000000334112424517753025710 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, syncevolution-1.5/src/synthesis/src/expat/xmltok/iasciitab.h0000755000373300037200000000344712424517753026070 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ /* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ /* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, /* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, /* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, /* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, /* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, /* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, /* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, /* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, /* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, /* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, /* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, /* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, /* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, /* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, syncevolution-1.5/src/synthesis/src/expat/xmltok/latin1tab.h0000755000373300037200000000342612424517753026014 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ /* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, /* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, /* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, /* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, /* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, /* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, /* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, syncevolution-1.5/src/synthesis/src/expat/xmltok/nametab.h0000755000373300037200000001561212424517753025544 0ustar00nightlyallusers00000000000000static const unsigned namingBitmap[] = { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, 0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, 0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, 0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, 0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, 0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, 0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, 0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, 0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, 0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, 0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, 0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, 0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, 0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, 0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, 0x40000000, 0xF580C900, 0x00000007, 0x02010800, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, 0x00000000, 0x00004C40, 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, 0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, 0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, 0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, 0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, 0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, 0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, 0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, 0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, 0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, 0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, 0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, 0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, 0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, 0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, 0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, 0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, 0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, 0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, 0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, 0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, 0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, 0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, 0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, }; static const unsigned char nmstrtPages[] = { 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const unsigned char namePages[] = { 0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, 0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; syncevolution-1.5/src/synthesis/src/expat/xmltok/utf8tab.h0000755000373300037200000000334412424517753025511 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ /* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, /* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, /* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, /* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, /* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, /* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, syncevolution-1.5/src/synthesis/src/expat/xmltok/xmldef.h0000755000373300037200000000222012424517753025403 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #include #ifdef XML_WINLIB #define WIN32_LEAN_AND_MEAN #define STRICT #include #define malloc(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define calloc(x, y) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (x)*(y)) #define free(x) HeapFree(GetProcessHeap(), 0, (x)) #define realloc(x, y) HeapReAlloc(GetProcessHeap(), 0, x, y) #define abort() /* as nothing */ #else /* not XML_WINLIB */ #include #endif /* not XML_WINLIB */ /* This file can be used for any definitions needed in particular environments. */ /* Mozilla specific defines */ #ifdef MOZILLA_CLIENT #include "nspr.h" #define malloc(x) PR_Malloc((size_t)(x)) #define realloc(x, y) PR_Realloc((x), (size_t)(y)) #define calloc(x, y) PR_Calloc((x),(y)) #define free(x) PR_Free(x) #if PR_BYTES_PER_INT != 4 #define int int32 #endif /* Enable Unicode string processing in expat. */ #ifndef XML_UNICODE #define XML_UNICODE #endif /* Enable external parameter entity parsing in expat */ #ifndef XML_DTD #define XML_DTD 1 #endif #endif /* MOZILLA_CLIENT */ syncevolution-1.5/src/synthesis/src/expat/xmltok/xmlrole.c0000755000373300037200000006752312424517753025622 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #include "xmldef.h" #include "xmlrole.h" #include "ascii.h" /* Doesn't check: that ,| are not mixed in a model group content of literals */ static const char KW_ANY[] = { ASCII_A, ASCII_N, ASCII_Y, '\0' }; static const char KW_ATTLIST[] = { ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; static const char KW_CDATA[] = { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; static const char KW_DOCTYPE[] = { ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; static const char KW_ELEMENT[] = { ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; static const char KW_EMPTY[] = { ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; static const char KW_ENTITIES[] = { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; static const char KW_ENTITY[] = { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; static const char KW_FIXED[] = { ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; static const char KW_ID[] = { ASCII_I, ASCII_D, '\0' }; static const char KW_IDREF[] = { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; static const char KW_IDREFS[] = { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; static const char KW_IGNORE[] = { ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; static const char KW_IMPLIED[] = { ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; static const char KW_INCLUDE[] = { ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; static const char KW_NDATA[] = { ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; static const char KW_NMTOKEN[] = { ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; static const char KW_NMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; static const char KW_NOTATION[] = { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, '\0' }; static const char KW_PCDATA[] = { ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; static const char KW_PUBLIC[] = { ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; static const char KW_REQUIRED[] = { ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, '\0' }; static const char KW_SYSTEM[] = { ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; #ifndef MIN_BYTES_PER_CHAR #define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) #endif #ifdef XML_DTD #define setTopLevel(state) \ ((state)->handler = ((state)->documentEntity \ ? internalSubset \ : externalSubset1)) #else /* not XML_DTD */ #define setTopLevel(state) ((state)->handler = internalSubset) #endif /* not XML_DTD */ typedef int PROLOG_HANDLER(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc); static PROLOG_HANDLER prolog0, prolog1, prolog2, doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, internalSubset, entity0, entity1, entity2, entity3, entity4, entity5, entity6, entity7, entity8, entity9, notation0, notation1, notation2, notation3, notation4, attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, attlist7, attlist8, attlist9, element0, element1, element2, element3, element4, element5, element6, element7, #ifdef XML_DTD externalSubset0, externalSubset1, condSect0, condSect1, condSect2, #endif /* XML_DTD */ declClose, error; static int common(PROLOG_STATE *state, int tok); static int prolog0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: state->handler = prolog1; return XML_ROLE_NONE; case XML_TOK_XML_DECL: state->handler = prolog1; return XML_ROLE_XML_DECL; case XML_TOK_PI: state->handler = prolog1; return XML_ROLE_NONE; case XML_TOK_COMMENT: state->handler = prolog1; case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (!XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_DOCTYPE)) break; state->handler = doctype0; return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return common(state, tok); } static int prolog1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PI: case XML_TOK_COMMENT: case XML_TOK_BOM: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (!XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_DOCTYPE)) break; state->handler = doctype0; return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return common(state, tok); } static int prolog2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PI: case XML_TOK_COMMENT: return XML_ROLE_NONE; case XML_TOK_INSTANCE_START: state->handler = error; return XML_ROLE_INSTANCE_START; } return common(state, tok); } static int doctype0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = doctype1; return XML_ROLE_DOCTYPE_NAME; } return common(state, tok); } static int doctype1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { state->handler = doctype3; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { state->handler = doctype2; return XML_ROLE_NONE; } break; } return common(state, tok); } static int doctype2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = doctype3; return XML_ROLE_DOCTYPE_PUBLIC_ID; } return common(state, tok); } static int doctype3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = doctype4; return XML_ROLE_DOCTYPE_SYSTEM_ID; } return common(state, tok); } static int doctype4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = internalSubset; return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; } return common(state, tok); } static int doctype5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: state->handler = prolog2; return XML_ROLE_DOCTYPE_CLOSE; } return common(state, tok); } static int internalSubset(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_OPEN: if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_ENTITY)) { state->handler = entity0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_ATTLIST)) { state->handler = attlist0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_ELEMENT)) { state->handler = element0; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr + 2 * MIN_BYTES_PER_CHAR(enc), end, KW_NOTATION)) { state->handler = notation0; return XML_ROLE_NONE; } break; case XML_TOK_PI: case XML_TOK_COMMENT: return XML_ROLE_NONE; case XML_TOK_PARAM_ENTITY_REF: return XML_ROLE_PARAM_ENTITY_REF; case XML_TOK_CLOSE_BRACKET: state->handler = doctype5; return XML_ROLE_NONE; } return common(state, tok); } #ifdef XML_DTD static int externalSubset0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { state->handler = externalSubset1; if (tok == XML_TOK_XML_DECL) return XML_ROLE_TEXT_DECL; return externalSubset1(state, tok, ptr, end, enc); } static int externalSubset1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_COND_SECT_OPEN: state->handler = condSect0; return XML_ROLE_NONE; case XML_TOK_COND_SECT_CLOSE: if (state->includeLevel == 0) break; state->includeLevel -= 1; return XML_ROLE_NONE; case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_BRACKET: break; case XML_TOK_NONE: if (state->includeLevel) break; return XML_ROLE_NONE; default: return internalSubset(state, tok, ptr, end, enc); } return common(state, tok); } #endif /* XML_DTD */ static int entity0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_PERCENT: state->handler = entity1; return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = entity2; return XML_ROLE_GENERAL_ENTITY_NAME; } return common(state, tok); } static int entity1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = entity7; return XML_ROLE_PARAM_ENTITY_NAME; } return common(state, tok); } static int entity2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { state->handler = entity4; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { state->handler = entity3; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_VALUE; } return common(state, tok); } static int entity3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity4; return XML_ROLE_ENTITY_PUBLIC_ID; } return common(state, tok); } static int entity4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity5; return XML_ROLE_ENTITY_SYSTEM_ID; } return common(state, tok); } static int entity5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: setTopLevel(state); return XML_ROLE_EXTERNAL_GENERAL_ENTITY_NO_NOTATION; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { state->handler = entity6; return XML_ROLE_NONE; } break; } return common(state, tok); } static int entity6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = declClose; return XML_ROLE_ENTITY_NOTATION_NAME; } return common(state, tok); } static int entity7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { state->handler = entity9; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { state->handler = entity8; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_VALUE; } return common(state, tok); } static int entity8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = entity9; return XML_ROLE_ENTITY_PUBLIC_ID; } return common(state, tok); } static int entity9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_ENTITY_SYSTEM_ID; } return common(state, tok); } static int notation0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = notation1; return XML_ROLE_NOTATION_NAME; } return common(state, tok); } static int notation1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { state->handler = notation3; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { state->handler = notation2; return XML_ROLE_NONE; } break; } return common(state, tok); } static int notation2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = notation4; return XML_ROLE_NOTATION_PUBLIC_ID; } return common(state, tok); } static int notation3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_NOTATION_SYSTEM_ID; } return common(state, tok); } static int notation4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = declClose; return XML_ROLE_NOTATION_SYSTEM_ID; case XML_TOK_DECL_CLOSE: setTopLevel(state); return XML_ROLE_NOTATION_NO_SYSTEM_ID; } return common(state, tok); } static int attlist0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = attlist1; return XML_ROLE_ATTLIST_ELEMENT_NAME; } return common(state, tok); } static int attlist1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: setTopLevel(state); return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = attlist2; return XML_ROLE_ATTRIBUTE_NAME; } return common(state, tok); } static int attlist2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: { static const char *types[] = { KW_CDATA, KW_ID, KW_IDREF, KW_IDREFS, KW_ENTITY, KW_ENTITIES, KW_NMTOKEN, KW_NMTOKENS, }; int i; for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { state->handler = attlist8; return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; } } if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { state->handler = attlist5; return XML_ROLE_NONE; } break; case XML_TOK_OPEN_PAREN: state->handler = attlist3; return XML_ROLE_NONE; } return common(state, tok); } static int attlist3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NMTOKEN: case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = attlist4; return XML_ROLE_ATTRIBUTE_ENUM_VALUE; } return common(state, tok); } static int attlist4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->handler = attlist8; return XML_ROLE_NONE; case XML_TOK_OR: state->handler = attlist3; return XML_ROLE_NONE; } return common(state, tok); } static int attlist5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_PAREN: state->handler = attlist6; return XML_ROLE_NONE; } return common(state, tok); } static int attlist6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: state->handler = attlist7; return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; } return common(state, tok); } static int attlist7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->handler = attlist8; return XML_ROLE_NONE; case XML_TOK_OR: state->handler = attlist6; return XML_ROLE_NONE; } return common(state, tok); } /* default value */ static int attlist8(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_POUND_NAME: if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_IMPLIED)) { state->handler = attlist1; return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; } if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_REQUIRED)) { state->handler = attlist1; return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; } if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_FIXED)) { state->handler = attlist9; return XML_ROLE_NONE; } break; case XML_TOK_LITERAL: state->handler = attlist1; return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; } return common(state, tok); } static int attlist9(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_LITERAL: state->handler = attlist1; return XML_ROLE_FIXED_ATTRIBUTE_VALUE; } return common(state, tok); } static int element0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element1; return XML_ROLE_ELEMENT_NAME; } return common(state, tok); } static int element1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { state->handler = declClose; return XML_ROLE_CONTENT_EMPTY; } if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { state->handler = declClose; return XML_ROLE_CONTENT_ANY; } break; case XML_TOK_OPEN_PAREN: state->handler = element2; state->level = 1; return XML_ROLE_GROUP_OPEN; } return common(state, tok); } static int element2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_POUND_NAME: if (XmlNameMatchesAscii(enc, ptr + MIN_BYTES_PER_CHAR(enc), end, KW_PCDATA)) { state->handler = element3; return XML_ROLE_CONTENT_PCDATA; } break; case XML_TOK_OPEN_PAREN: state->level = 2; state->handler = element6; return XML_ROLE_GROUP_OPEN; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT; case XML_TOK_NAME_QUESTION: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_OPT; case XML_TOK_NAME_ASTERISK: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_REP; case XML_TOK_NAME_PLUS: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_PLUS; } return common(state, tok); } static int element3(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: case XML_TOK_CLOSE_PAREN_ASTERISK: state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_OR: state->handler = element4; return XML_ROLE_NONE; } return common(state, tok); } static int element4(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element5; return XML_ROLE_CONTENT_ELEMENT; } return common(state, tok); } static int element5(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN_ASTERISK: state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_OR: state->handler = element4; return XML_ROLE_NONE; } return common(state, tok); } static int element6(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_PAREN: state->level += 1; return XML_ROLE_GROUP_OPEN; case XML_TOK_NAME: case XML_TOK_PREFIXED_NAME: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT; case XML_TOK_NAME_QUESTION: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_OPT; case XML_TOK_NAME_ASTERISK: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_REP; case XML_TOK_NAME_PLUS: state->handler = element7; return XML_ROLE_CONTENT_ELEMENT_PLUS; } return common(state, tok); } static int element7(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_CLOSE_PAREN: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE; case XML_TOK_CLOSE_PAREN_ASTERISK: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_REP; case XML_TOK_CLOSE_PAREN_QUESTION: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_OPT; case XML_TOK_CLOSE_PAREN_PLUS: state->level -= 1; if (state->level == 0) state->handler = declClose; return XML_ROLE_GROUP_CLOSE_PLUS; case XML_TOK_COMMA: state->handler = element6; return XML_ROLE_GROUP_SEQUENCE; case XML_TOK_OR: state->handler = element6; return XML_ROLE_GROUP_CHOICE; } return common(state, tok); } #ifdef XML_DTD static int condSect0(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_NAME: if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { state->handler = condSect1; return XML_ROLE_NONE; } if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { state->handler = condSect2; return XML_ROLE_NONE; } break; } return common(state, tok); } static int condSect1(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = externalSubset1; state->includeLevel += 1; return XML_ROLE_NONE; } return common(state, tok); } static int condSect2(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_OPEN_BRACKET: state->handler = externalSubset1; return XML_ROLE_IGNORE_SECT; } return common(state, tok); } #endif /* XML_DTD */ static int declClose(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_PROLOG_S: return XML_ROLE_NONE; case XML_TOK_DECL_CLOSE: setTopLevel(state); return XML_ROLE_NONE; } return common(state, tok); } #if 0 static int ignore(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { switch (tok) { case XML_TOK_DECL_CLOSE: state->handler = internalSubset; return 0; default: return XML_ROLE_NONE; } return common(state, tok); } #endif static int error(PROLOG_STATE *state, int tok, const char *ptr, const char *end, const ENCODING *enc) { return XML_ROLE_NONE; } static int common(PROLOG_STATE *state, int tok) { #ifdef XML_DTD if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) return XML_ROLE_INNER_PARAM_ENTITY_REF; #endif state->handler = error; return XML_ROLE_ERROR; } void XmlPrologStateInit(PROLOG_STATE *state) { state->handler = prolog0; #ifdef XML_DTD state->documentEntity = 1; state->includeLevel = 0; #endif /* XML_DTD */ } #ifdef XML_DTD void XmlPrologStateInitExternalEntity(PROLOG_STATE *state) { state->handler = externalSubset0; state->documentEntity = 0; state->includeLevel = 0; } #endif /* XML_DTD */ syncevolution-1.5/src/synthesis/src/expat/xmltok/xmlrole.h0000755000373300037200000000466712424517753025627 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #ifndef XmlRole_INCLUDED #define XmlRole_INCLUDED 1 #include "xmltok.h" #ifdef __cplusplus extern "C" { #endif enum { XML_ROLE_ERROR = -1, XML_ROLE_NONE = 0, XML_ROLE_XML_DECL, XML_ROLE_INSTANCE_START, XML_ROLE_DOCTYPE_NAME, XML_ROLE_DOCTYPE_SYSTEM_ID, XML_ROLE_DOCTYPE_PUBLIC_ID, XML_ROLE_DOCTYPE_CLOSE, XML_ROLE_GENERAL_ENTITY_NAME, XML_ROLE_PARAM_ENTITY_NAME, XML_ROLE_ENTITY_VALUE, XML_ROLE_ENTITY_SYSTEM_ID, XML_ROLE_ENTITY_PUBLIC_ID, XML_ROLE_ENTITY_NOTATION_NAME, XML_ROLE_NOTATION_NAME, XML_ROLE_NOTATION_SYSTEM_ID, XML_ROLE_NOTATION_NO_SYSTEM_ID, XML_ROLE_NOTATION_PUBLIC_ID, XML_ROLE_ATTRIBUTE_NAME, XML_ROLE_ATTRIBUTE_TYPE_CDATA, XML_ROLE_ATTRIBUTE_TYPE_ID, XML_ROLE_ATTRIBUTE_TYPE_IDREF, XML_ROLE_ATTRIBUTE_TYPE_IDREFS, XML_ROLE_ATTRIBUTE_TYPE_ENTITY, XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, XML_ROLE_ATTRIBUTE_ENUM_VALUE, XML_ROLE_ATTRIBUTE_NOTATION_VALUE, XML_ROLE_ATTLIST_ELEMENT_NAME, XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, XML_ROLE_FIXED_ATTRIBUTE_VALUE, XML_ROLE_ELEMENT_NAME, XML_ROLE_CONTENT_ANY, XML_ROLE_CONTENT_EMPTY, XML_ROLE_CONTENT_PCDATA, XML_ROLE_GROUP_OPEN, XML_ROLE_GROUP_CLOSE, XML_ROLE_GROUP_CLOSE_REP, XML_ROLE_GROUP_CLOSE_OPT, XML_ROLE_GROUP_CLOSE_PLUS, XML_ROLE_GROUP_CHOICE, XML_ROLE_GROUP_SEQUENCE, XML_ROLE_CONTENT_ELEMENT, XML_ROLE_CONTENT_ELEMENT_REP, XML_ROLE_CONTENT_ELEMENT_OPT, XML_ROLE_CONTENT_ELEMENT_PLUS, #ifdef XML_DTD XML_ROLE_TEXT_DECL, XML_ROLE_IGNORE_SECT, XML_ROLE_INNER_PARAM_ENTITY_REF, #endif /* XML_DTD */ XML_ROLE_PARAM_ENTITY_REF, XML_ROLE_EXTERNAL_GENERAL_ENTITY_NO_NOTATION }; typedef struct prolog_state { int (*handler)(struct prolog_state *state, int tok, const char *ptr, const char *end, const ENCODING *enc); unsigned level; #ifdef XML_DTD unsigned includeLevel; int documentEntity; #endif /* XML_DTD */ } PROLOG_STATE; void XMLTOKAPI XmlPrologStateInit(PROLOG_STATE *); #ifdef XML_DTD void XMLTOKAPI XmlPrologStateInitExternalEntity(PROLOG_STATE *); #endif /* XML_DTD */ #define XmlTokenRole(state, tok, ptr, end, enc) \ (((state)->handler)(state, tok, ptr, end, enc)) #ifdef __cplusplus } #endif #endif /* not XmlRole_INCLUDED */ syncevolution-1.5/src/synthesis/src/expat/xmltok/xmltok.c0000755000373300037200000011176712424517753025456 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #include "xmldef.h" #include "xmltok.h" #include "nametab.h" #ifdef XML_DTD #define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) #else #define IGNORE_SECTION_TOK_VTABLE /* as nothing */ #endif #define VTABLE1 \ { PREFIX(prologTok), PREFIX(contentTok), \ PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ PREFIX(sameName), \ PREFIX(nameMatchesAscii), \ PREFIX(nameLength), \ PREFIX(skipS), \ PREFIX(getAtts), \ PREFIX(charRefNumber), \ PREFIX(predefinedEntityName), \ PREFIX(updatePosition), \ PREFIX(isPublicId) #define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) #define UCS2_GET_NAMING(pages, hi, lo) \ (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) /* A 2 byte UTF-8 representation splits the characters 11 bits between the bottom 5 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ #define UTF8_GET_NAMING2(pages, byte) \ (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + ((((byte)[0]) & 3) << 1) \ + ((((byte)[1]) >> 5) & 1)] \ & (1 << (((byte)[1]) & 0x1F))) /* A 3 byte UTF-8 representation splits the characters 16 bits between the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index into pages, 3 bits to add to that index and 5 bits to generate the mask. */ #define UTF8_GET_NAMING3(pages, byte) \ (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + ((((byte)[1]) >> 2) & 0xF)] \ << 3) \ + ((((byte)[1]) & 3) << 1) \ + ((((byte)[2]) >> 5) & 1)] \ & (1 << (((byte)[2]) & 0x1F))) #define UTF8_GET_NAMING(pages, p, n) \ ((n) == 2 \ ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ : ((n) == 3 \ ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ : 0)) #define UTF8_INVALID3(p) \ ((*p) == 0xED \ ? (((p)[1] & 0x20) != 0) \ : ((*p) == 0xEF \ ? ((p)[1] == 0xBF && ((p)[2] == 0xBF || (p)[2] == 0xBE)) \ : 0)) #define UTF8_INVALID4(p) ((*p) == 0xF4 && ((p)[1] & 0x30) != 0) static int isNever(const ENCODING *enc, const char *p) { return 0; } static int utf8_isName2(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); } static int utf8_isName3(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); } #define utf8_isName4 isNever static int utf8_isNmstrt2(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); } static int utf8_isNmstrt3(const ENCODING *enc, const char *p) { return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); } #define utf8_isNmstrt4 isNever #define utf8_isInvalid2 isNever static int utf8_isInvalid3(const ENCODING *enc, const char *p) { return UTF8_INVALID3((const unsigned char *)p); } static int utf8_isInvalid4(const ENCODING *enc, const char *p) { return UTF8_INVALID4((const unsigned char *)p); } struct normal_encoding { ENCODING enc; unsigned char type[256]; #ifdef XML_MIN_SIZE int (*byteType)(const ENCODING *, const char *); int (*isNameMin)(const ENCODING *, const char *); int (*isNmstrtMin)(const ENCODING *, const char *); int (*byteToAscii)(const ENCODING *, const char *); int (*charMatches)(const ENCODING *, const char *, int); #endif /* XML_MIN_SIZE */ int (*isName2)(const ENCODING *, const char *); int (*isName3)(const ENCODING *, const char *); int (*isName4)(const ENCODING *, const char *); int (*isNmstrt2)(const ENCODING *, const char *); int (*isNmstrt3)(const ENCODING *, const char *); int (*isNmstrt4)(const ENCODING *, const char *); int (*isInvalid2)(const ENCODING *, const char *); int (*isInvalid3)(const ENCODING *, const char *); int (*isInvalid4)(const ENCODING *, const char *); }; #ifdef XML_MIN_SIZE #define STANDARD_VTABLE(E) \ E ## byteType, \ E ## isNameMin, \ E ## isNmstrtMin, \ E ## byteToAscii, \ E ## charMatches, #else #define STANDARD_VTABLE(E) /* as nothing */ #endif #define NORMAL_VTABLE(E) \ E ## isName2, \ E ## isName3, \ E ## isName4, \ E ## isNmstrt2, \ E ## isNmstrt3, \ E ## isNmstrt4, \ E ## isInvalid2, \ E ## isInvalid3, \ E ## isInvalid4 static int checkCharRefNumber(int); #include "xmltok_impl.h" #include "ascii.h" #ifdef XML_MIN_SIZE #define sb_isNameMin isNever #define sb_isNmstrtMin isNever #endif #ifdef XML_MIN_SIZE #define MINBPC(enc) ((enc)->minBytesPerChar) #else /* minimum bytes per character */ #define MINBPC(enc) 1 #endif #define SB_BYTE_TYPE(enc, p) \ (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) #ifdef XML_MIN_SIZE static int sb_byteType(const ENCODING *enc, const char *p) { return SB_BYTE_TYPE(enc, p); } #define BYTE_TYPE(enc, p) \ (((const struct normal_encoding *)(enc))->byteType(enc, p)) #else #define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) #endif #ifdef XML_MIN_SIZE #define BYTE_TO_ASCII(enc, p) \ (((const struct normal_encoding *)(enc))->byteToAscii(enc, p)) static int sb_byteToAscii(const ENCODING *enc, const char *p) { return *p; } #else #define BYTE_TO_ASCII(enc, p) (*(p)) #endif #define IS_NAME_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isName ## n(enc, p)) #define IS_NMSTRT_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isNmstrt ## n(enc, p)) #define IS_INVALID_CHAR(enc, p, n) \ (((const struct normal_encoding *)(enc))->isInvalid ## n(enc, p)) #ifdef XML_MIN_SIZE #define IS_NAME_CHAR_MINBPC(enc, p) \ (((const struct normal_encoding *)(enc))->isNameMin(enc, p)) #define IS_NMSTRT_CHAR_MINBPC(enc, p) \ (((const struct normal_encoding *)(enc))->isNmstrtMin(enc, p)) #else #define IS_NAME_CHAR_MINBPC(enc, p) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) #endif #ifdef XML_MIN_SIZE #define CHAR_MATCHES(enc, p, c) \ (((const struct normal_encoding *)(enc))->charMatches(enc, p, c)) static int sb_charMatches(const ENCODING *enc, const char *p, int c) { return *p == c; } #else /* c is an ASCII character */ #define CHAR_MATCHES(enc, p, c) (*(p) == c) #endif #define PREFIX(ident) normal_ ## ident #include "xmltok_impl.c" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ UTF8_cval1 = 0x00, UTF8_cval2 = 0xc0, UTF8_cval3 = 0xe0, UTF8_cval4 = 0xf0 }; static void utf8_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { char *to; const char *from; if (fromLim - *fromP > toLim - *toP) { /* Avoid copying partial characters. */ for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) break; } for (to = *toP, from = *fromP; from != fromLim; from++, to++) *to = *from; *fromP = from; *toP = to; } static void utf8_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { unsigned short *to = *toP; const char *from = *fromP; while (from != fromLim && to != toLim) { switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { case BT_LEAD2: *to++ = ((from[0] & 0x1f) << 6) | (from[1] & 0x3f); from += 2; break; case BT_LEAD3: *to++ = ((from[0] & 0xf) << 12) | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f); from += 3; break; case BT_LEAD4: { unsigned long n; if (to + 1 == toLim) break; n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); n -= 0x10000; to[0] = (unsigned short)((n >> 10) | 0xD800); to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); to += 2; from += 4; } break; default: *to++ = *from++; break; } } *fromP = from; *toP = to; } #ifdef XML_NS static const struct normal_encoding utf8_encoding_ns = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #include "asciitab.h" #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; #endif static const struct normal_encoding utf8_encoding = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; #ifdef XML_NS static const struct normal_encoding internal_utf8_encoding_ns = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #include "iasciitab.h" #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; #endif static const struct normal_encoding internal_utf8_encoding = { { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "utf8tab.h" }, STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) }; static void latin1_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { for (;;) { unsigned char c; if (*fromP == fromLim) break; c = (unsigned char)**fromP; if (c & 0x80) { if (toLim - *toP < 2) break; *(*toP)++ = ((c >> 6) | UTF8_cval2); *(*toP)++ = ((c & 0x3f) | 0x80); (*fromP)++; } else { if (*toP == toLim) break; *(*toP)++ = *(*fromP)++; } } } static void latin1_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { while (*fromP != fromLim && *toP != toLim) *(*toP)++ = (unsigned char)*(*fromP)++; } #ifdef XML_NS static const struct normal_encoding latin1_encoding_ns = { { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, { #include "asciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(sb_) }; #endif static const struct normal_encoding latin1_encoding = { { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(sb_) }; static void ascii_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { while (*fromP != fromLim && *toP != toLim) *(*toP)++ = *(*fromP)++; } #ifdef XML_NS static const struct normal_encoding ascii_encoding_ns = { { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, { #include "asciitab.h" /* BT_NONXML == 0 */ }, STANDARD_VTABLE(sb_) }; #endif static const struct normal_encoding ascii_encoding = { { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON /* BT_NONXML == 0 */ }, STANDARD_VTABLE(sb_) }; static int unicode_byte_type(char hi, char lo) { switch ((unsigned char)hi) { case 0xD8: case 0xD9: case 0xDA: case 0xDB: return BT_LEAD4; case 0xDC: case 0xDD: case 0xDE: case 0xDF: return BT_TRAIL; case 0xFF: switch ((unsigned char)lo) { case 0xFF: case 0xFE: return BT_NONXML; } break; } return BT_NONASCII; } #define DEFINE_UTF16_TO_UTF8(E) \ static \ void E ## toUtf8(const ENCODING *enc, \ const char **fromP, const char *fromLim, \ char **toP, const char *toLim) \ { \ const char *from; \ for (from = *fromP; from != fromLim; from += 2) { \ int plane; \ unsigned char lo2; \ unsigned char lo = GET_LO(from); \ unsigned char hi = GET_HI(from); \ switch (hi) { \ case 0: \ if (lo < 0x80) { \ if (*toP == toLim) { \ *fromP = from; \ return; \ } \ *(*toP)++ = lo; \ break; \ } \ /* fall through */ \ case 0x1: case 0x2: case 0x3: \ case 0x4: case 0x5: case 0x6: case 0x7: \ if (toLim - *toP < 2) { \ *fromP = from; \ return; \ } \ *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ *(*toP)++ = ((lo & 0x3f) | 0x80); \ break; \ default: \ if (toLim - *toP < 3) { \ *fromP = from; \ return; \ } \ /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ *(*toP)++ = ((lo & 0x3f) | 0x80); \ break; \ case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ if (toLim - *toP < 4) { \ *fromP = from; \ return; \ } \ plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ from += 2; \ lo2 = GET_LO(from); \ *(*toP)++ = (((lo & 0x3) << 4) \ | ((GET_HI(from) & 0x3) << 2) \ | (lo2 >> 6) \ | 0x80); \ *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ break; \ } \ } \ *fromP = from; \ } #define DEFINE_UTF16_TO_UTF16(E) \ static \ void E ## toUtf16(const ENCODING *enc, \ const char **fromP, const char *fromLim, \ unsigned short **toP, const unsigned short *toLim) \ { \ /* Avoid copying first half only of surrogate */ \ if (fromLim - *fromP > ((toLim - *toP) << 1) \ && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ fromLim -= 2; \ for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ } #define SET2(ptr, ch) \ (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) #define GET_LO(ptr) ((unsigned char)(ptr)[0]) #define GET_HI(ptr) ((unsigned char)(ptr)[1]) DEFINE_UTF16_TO_UTF8(little2_) DEFINE_UTF16_TO_UTF16(little2_) #undef SET2 #undef GET_LO #undef GET_HI #define SET2(ptr, ch) \ (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) #define GET_LO(ptr) ((unsigned char)(ptr)[1]) #define GET_HI(ptr) ((unsigned char)(ptr)[0]) DEFINE_UTF16_TO_UTF8(big2_) DEFINE_UTF16_TO_UTF16(big2_) #undef SET2 #undef GET_LO #undef GET_HI #define LITTLE2_BYTE_TYPE(enc, p) \ ((p)[1] == 0 \ ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ : unicode_byte_type((p)[1], (p)[0])) #define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) #define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) #define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) #define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) #ifdef XML_MIN_SIZE static int little2_byteType(const ENCODING *enc, const char *p) { return LITTLE2_BYTE_TYPE(enc, p); } static int little2_byteToAscii(const ENCODING *enc, const char *p) { return LITTLE2_BYTE_TO_ASCII(enc, p); } static int little2_charMatches(const ENCODING *enc, const char *p, int c) { return LITTLE2_CHAR_MATCHES(enc, p, c); } static int little2_isNameMin(const ENCODING *enc, const char *p) { return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); } static int little2_isNmstrtMin(const ENCODING *enc, const char *p) { return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); } #undef VTABLE #define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 #else /* not XML_MIN_SIZE */ #undef PREFIX #define PREFIX(ident) little2_ ## ident #define MINBPC(enc) 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ #define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) #define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) #define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) #define IS_NAME_CHAR(enc, p, n) 0 #define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) #define IS_NMSTRT_CHAR(enc, p, n) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) #include "xmltok_impl.c" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR #endif /* not XML_MIN_SIZE */ #ifdef XML_NS static const struct normal_encoding little2_encoding_ns = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 12 1 #else 0 #endif }, { #include "asciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #endif static const struct normal_encoding little2_encoding = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 12 1 #else 0 #endif }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #if XML_BYTE_ORDER != 21 #ifdef XML_NS static const struct normal_encoding internal_little2_encoding_ns = { { VTABLE, 2, 0, 1 }, { #include "iasciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #endif static const struct normal_encoding internal_little2_encoding = { { VTABLE, 2, 0, 1 }, { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(little2_) }; #endif #define BIG2_BYTE_TYPE(enc, p) \ ((p)[0] == 0 \ ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ : unicode_byte_type((p)[0], (p)[1])) #define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) #define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) #define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) #define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) #ifdef XML_MIN_SIZE static int big2_byteType(const ENCODING *enc, const char *p) { return BIG2_BYTE_TYPE(enc, p); } static int big2_byteToAscii(const ENCODING *enc, const char *p) { return BIG2_BYTE_TO_ASCII(enc, p); } static int big2_charMatches(const ENCODING *enc, const char *p, int c) { return BIG2_CHAR_MATCHES(enc, p, c); } static int big2_isNameMin(const ENCODING *enc, const char *p) { return BIG2_IS_NAME_CHAR_MINBPC(enc, p); } static int big2_isNmstrtMin(const ENCODING *enc, const char *p) { return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); } #undef VTABLE #define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 #else /* not XML_MIN_SIZE */ #undef PREFIX #define PREFIX(ident) big2_ ## ident #define MINBPC(enc) 2 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ #define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) #define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) #define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) #define IS_NAME_CHAR(enc, p, n) 0 #define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) #define IS_NMSTRT_CHAR(enc, p, n) (0) #define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) #include "xmltok_impl.c" #undef MINBPC #undef BYTE_TYPE #undef BYTE_TO_ASCII #undef CHAR_MATCHES #undef IS_NAME_CHAR #undef IS_NAME_CHAR_MINBPC #undef IS_NMSTRT_CHAR #undef IS_NMSTRT_CHAR_MINBPC #undef IS_INVALID_CHAR #endif /* not XML_MIN_SIZE */ #ifdef XML_NS static const struct normal_encoding big2_encoding_ns = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 21 1 #else 0 #endif }, { #include "asciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #endif static const struct normal_encoding big2_encoding = { { VTABLE, 2, 0, #if XML_BYTE_ORDER == 21 1 #else 0 #endif }, { #define BT_COLON BT_NMSTRT #include "asciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #if XML_BYTE_ORDER != 12 #ifdef XML_NS static const struct normal_encoding internal_big2_encoding_ns = { { VTABLE, 2, 0, 1 }, { #include "iasciitab.h" #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #endif static const struct normal_encoding internal_big2_encoding = { { VTABLE, 2, 0, 1 }, { #define BT_COLON BT_NMSTRT #include "iasciitab.h" #undef BT_COLON #include "latin1tab.h" }, STANDARD_VTABLE(big2_) }; #endif #undef PREFIX static int streqci(const char *s1, const char *s2) { for (;;) { char c1 = *s1++; char c2 = *s2++; if (ASCII_a <= c1 && c1 <= ASCII_z) c1 += ASCII_A - ASCII_a; if (ASCII_a <= c2 && c2 <= ASCII_z) c2 += ASCII_A - ASCII_a; if (c1 != c2) return 0; if (!c1) break; } return 1; } static void initUpdatePosition(const ENCODING *enc, const char *ptr, const char *end, POSITION *pos) { normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); } static int toAscii(const ENCODING *enc, const char *ptr, const char *end) { char buf[1]; char *p = buf; XmlUtf8Convert(enc, &ptr, end, &p, p + 1); if (p == buf) return -1; else return buf[0]; } static int isSpace(int c) { switch (c) { case 0x20: case 0xD: case 0xA: case 0x9: return 1; } return 0; } /* Return 1 if there's just optional white space or there's an S followed by name=val. */ static int parsePseudoAttribute(const ENCODING *enc, const char *ptr, const char *end, const char **namePtr, const char **nameEndPtr, const char **valPtr, const char **nextTokPtr) { int c; char open; if (ptr == end) { *namePtr = 0; return 1; } if (!isSpace(toAscii(enc, ptr, end))) { *nextTokPtr = ptr; return 0; } do { ptr += enc->minBytesPerChar; } while (isSpace(toAscii(enc, ptr, end))); if (ptr == end) { *namePtr = 0; return 1; } *namePtr = ptr; for (;;) { c = toAscii(enc, ptr, end); if (c == -1) { *nextTokPtr = ptr; return 0; } if (c == ASCII_EQUALS) { *nameEndPtr = ptr; break; } if (isSpace(c)) { *nameEndPtr = ptr; do { ptr += enc->minBytesPerChar; } while (isSpace(c = toAscii(enc, ptr, end))); if (c != ASCII_EQUALS) { *nextTokPtr = ptr; return 0; } break; } ptr += enc->minBytesPerChar; } if (ptr == *namePtr) { *nextTokPtr = ptr; return 0; } ptr += enc->minBytesPerChar; c = toAscii(enc, ptr, end); while (isSpace(c)) { ptr += enc->minBytesPerChar; c = toAscii(enc, ptr, end); } if (c != ASCII_QUOT && c != ASCII_APOS) { *nextTokPtr = ptr; return 0; } open = c; ptr += enc->minBytesPerChar; *valPtr = ptr; for (;; ptr += enc->minBytesPerChar) { c = toAscii(enc, ptr, end); if (c == open) break; if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z) && !(ASCII_0 <= c && c <= ASCII_9) && c != ASCII_PERIOD && c != ASCII_MINUS && c != ASCII_UNDERSCORE) { *nextTokPtr = ptr; return 0; } } *nextTokPtr = ptr + enc->minBytesPerChar; return 1; } static const char KW_version[] = { ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' }; static const char KW_encoding[] = { ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' }; static const char KW_standalone[] = { ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, ASCII_n, ASCII_e, '\0' }; static const char KW_yes[] = { ASCII_y, ASCII_e, ASCII_s, '\0' }; static const char KW_no[] = { ASCII_n, ASCII_o, '\0' }; static int doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, const char *, const char *), int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingName, const ENCODING **encoding, int *standalone) { const char *val = 0; const char *name = 0; const char *nameEnd = 0; ptr += 5 * enc->minBytesPerChar; end -= 2 * enc->minBytesPerChar; if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) || !name) { *badPtr = ptr; return 0; } if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { if (!isGeneralTextEntity) { *badPtr = name; return 0; } } else { if (versionPtr) *versionPtr = val; if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { *badPtr = ptr; return 0; } if (!name) { if (isGeneralTextEntity) { /* a TextDecl must have an EncodingDecl */ *badPtr = ptr; return 0; } return 1; } } if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { int c = toAscii(enc, val, end); if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { *badPtr = val; return 0; } if (encodingName) *encodingName = val; if (encoding) *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { *badPtr = ptr; return 0; } if (!name) return 1; } if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) || isGeneralTextEntity) { *badPtr = name; return 0; } if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { if (standalone) *standalone = 1; } else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { if (standalone) *standalone = 0; } else { *badPtr = val; return 0; } while (isSpace(toAscii(enc, ptr, end))) ptr += enc->minBytesPerChar; if (ptr != end) { *badPtr = ptr; return 0; } return 1; } static int checkCharRefNumber(int result) { switch (result >> 8) { case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF: return -1; case 0: if (latin1_encoding.type[result] == BT_NONXML) return -1; break; case 0xFF: if (result == 0xFFFE || result == 0xFFFF) return -1; break; } return result; } int XmlUtf8Encode(int c, char *buf) { enum { /* minN is minimum legal resulting value for N byte sequence */ min2 = 0x80, min3 = 0x800, min4 = 0x10000 }; if (c < 0) return 0; if (c < min2) { buf[0] = (c | UTF8_cval1); return 1; } if (c < min3) { buf[0] = ((c >> 6) | UTF8_cval2); buf[1] = ((c & 0x3f) | 0x80); return 2; } if (c < min4) { buf[0] = ((c >> 12) | UTF8_cval3); buf[1] = (((c >> 6) & 0x3f) | 0x80); buf[2] = ((c & 0x3f) | 0x80); return 3; } if (c < 0x110000) { buf[0] = ((c >> 18) | UTF8_cval4); buf[1] = (((c >> 12) & 0x3f) | 0x80); buf[2] = (((c >> 6) & 0x3f) | 0x80); buf[3] = ((c & 0x3f) | 0x80); return 4; } return 0; } int XmlUtf16Encode(int charNum, unsigned short *buf) { if (charNum < 0) return 0; if (charNum < 0x10000) { buf[0] = charNum; return 1; } if (charNum < 0x110000) { charNum -= 0x10000; buf[0] = (charNum >> 10) + 0xD800; buf[1] = (charNum & 0x3FF) + 0xDC00; return 2; } return 0; } struct unknown_encoding { struct normal_encoding normal; int (*convert)(void *userData, const char *p); void *userData; unsigned short utf16[256]; char utf8[256][4]; }; int XmlSizeOfUnknownEncoding(void) { return sizeof(struct unknown_encoding); } static int unknown_isName(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); if (c & ~0xFFFF) return 0; return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); } static int unknown_isNmstrt(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); if (c & ~0xFFFF) return 0; return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); } static int unknown_isInvalid(const ENCODING *enc, const char *p) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, p); return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; } static void unknown_toUtf8(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim) { char buf[XML_UTF8_ENCODE_MAX]; for (;;) { const char *utf8; int n; if (*fromP == fromLim) break; utf8 = ((const struct unknown_encoding *)enc)->utf8[(unsigned char)**fromP]; n = *utf8++; if (n == 0) { int c = ((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, *fromP); n = XmlUtf8Encode(c, buf); if (n > toLim - *toP) break; utf8 = buf; *fromP += ((const struct normal_encoding *)enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2); } else { if (n > toLim - *toP) break; (*fromP)++; } do { *(*toP)++ = *utf8++; } while (--n != 0); } } static void unknown_toUtf16(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim) { while (*fromP != fromLim && *toP != toLim) { unsigned short c = ((const struct unknown_encoding *)enc)->utf16[(unsigned char)**fromP]; if (c == 0) { c = (unsigned short)((const struct unknown_encoding *)enc) ->convert(((const struct unknown_encoding *)enc)->userData, *fromP); *fromP += ((const struct normal_encoding *)enc)->type[(unsigned char)**fromP] - (BT_LEAD2 - 2); } else (*fromP)++; *(*toP)++ = c; } } ENCODING * XmlInitUnknownEncoding(void *mem, int *table, int (*convert)(void *userData, const char *p), void *userData) { int i; struct unknown_encoding *e = mem; for (i = 0; i < (int)sizeof(struct normal_encoding); i++) ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; for (i = 0; i < 128; i++) if (latin1_encoding.type[i] != BT_OTHER && latin1_encoding.type[i] != BT_NONXML && table[i] != i) return 0; for (i = 0; i < 256; i++) { int c = table[i]; if (c == -1) { e->normal.type[i] = BT_MALFORM; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; } else if (c < 0) { if (c < -4) return 0; e->normal.type[i] = BT_LEAD2 - (c + 2); e->utf8[i][0] = 0; e->utf16[i] = 0; } else if (c < 0x80) { if (latin1_encoding.type[c] != BT_OTHER && latin1_encoding.type[c] != BT_NONXML && c != i) return 0; e->normal.type[i] = latin1_encoding.type[c]; e->utf8[i][0] = 1; e->utf8[i][1] = (char)c; e->utf16[i] = c == 0 ? 0xFFFF : c; } else if (checkCharRefNumber(c) < 0) { e->normal.type[i] = BT_NONXML; /* This shouldn't really get used. */ e->utf16[i] = 0xFFFF; e->utf8[i][0] = 1; e->utf8[i][1] = 0; } else { if (c > 0xFFFF) return 0; if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) e->normal.type[i] = BT_NMSTRT; else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) e->normal.type[i] = BT_NAME; else e->normal.type[i] = BT_OTHER; e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); e->utf16[i] = c; } } e->userData = userData; e->convert = convert; if (convert) { e->normal.isName2 = unknown_isName; e->normal.isName3 = unknown_isName; e->normal.isName4 = unknown_isName; e->normal.isNmstrt2 = unknown_isNmstrt; e->normal.isNmstrt3 = unknown_isNmstrt; e->normal.isNmstrt4 = unknown_isNmstrt; e->normal.isInvalid2 = unknown_isInvalid; e->normal.isInvalid3 = unknown_isInvalid; e->normal.isInvalid4 = unknown_isInvalid; } e->normal.enc.utf8Convert = unknown_toUtf8; e->normal.enc.utf16Convert = unknown_toUtf16; return &(e->normal.enc); } /* If this enumeration is changed, getEncodingIndex and encodings must also be changed. */ enum { UNKNOWN_ENC = -1, ISO_8859_1_ENC = 0, US_ASCII_ENC, UTF_8_ENC, UTF_16_ENC, UTF_16BE_ENC, UTF_16LE_ENC, /* must match encodingNames up to here */ NO_ENC }; static const char KW_ISO_8859_1[] = { ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, ASCII_MINUS, ASCII_1, '\0' }; static const char KW_US_ASCII[] = { ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, '\0' }; static const char KW_UTF_8[] = { ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' }; static const char KW_UTF_16[] = { ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' }; static const char KW_UTF_16BE[] = { ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, '\0' }; static const char KW_UTF_16LE[] = { ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, '\0' }; static int getEncodingIndex(const char *name) { static const char *encodingNames[] = { KW_ISO_8859_1, KW_US_ASCII, KW_UTF_8, KW_UTF_16, KW_UTF_16BE, KW_UTF_16LE, }; int i; if (name == 0) return NO_ENC; for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) if (streqci(name, encodingNames[i])) return i; return UNKNOWN_ENC; } /* For binary compatibility, we store the index of the encoding specified at initialization in the isUtf16 member. */ #define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) #define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) /* This is what detects the encoding. encodingTable maps from encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of the external (protocol) specified encoding; state is XML_CONTENT_STATE if we're parsing an external text entity, and XML_PROLOG_STATE otherwise. */ static int initScan(const ENCODING **encodingTable, const INIT_ENCODING *enc, int state, const char *ptr, const char *end, const char **nextTokPtr) { const ENCODING **encPtr; if (ptr == end) return XML_TOK_NONE; encPtr = enc->encPtr; if (ptr + 1 == end) { /* only a single byte available for auto-detection */ #ifndef XML_DTD /* FIXME */ /* a well-formed document entity must have more than one byte */ if (state != XML_CONTENT_STATE) return XML_TOK_PARTIAL; #endif /* so we're parsing an external text entity... */ /* if UTF-16 was externally specified, then we need at least 2 bytes */ switch (INIT_ENC_INDEX(enc)) { case UTF_16_ENC: case UTF_16LE_ENC: case UTF_16BE_ENC: return XML_TOK_PARTIAL; } switch ((unsigned char)*ptr) { case 0xFE: case 0xFF: case 0xEF: /* possibly first byte of UTF-8 BOM */ if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; /* fall through */ case 0x00: case 0x3C: return XML_TOK_PARTIAL; } } else { switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { case 0xFEFF: if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; *nextTokPtr = ptr + 2; *encPtr = encodingTable[UTF_16BE_ENC]; return XML_TOK_BOM; /* 00 3C is handled in the default case */ case 0x3C00: if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC || INIT_ENC_INDEX(enc) == UTF_16_ENC) && state == XML_CONTENT_STATE) break; *encPtr = encodingTable[UTF_16LE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); case 0xFFFE: if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC && state == XML_CONTENT_STATE) break; *nextTokPtr = ptr + 2; *encPtr = encodingTable[UTF_16LE_ENC]; return XML_TOK_BOM; case 0xEFBB: /* Maybe a UTF-8 BOM (EF BB BF) */ /* If there's an explicitly specified (external) encoding of ISO-8859-1 or some flavour of UTF-16 and this is an external text entity, don't look for the BOM, because it might be a legal data. */ if (state == XML_CONTENT_STATE) { int e = INIT_ENC_INDEX(enc); if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC || e == UTF_16LE_ENC || e == UTF_16_ENC) break; } if (ptr + 2 == end) return XML_TOK_PARTIAL; if ((unsigned char)ptr[2] == 0xBF) { *encPtr = encodingTable[UTF_8_ENC]; *nextTokPtr = ptr + 3; // %%% luz 2002-11-11 added this, was missing and caused crash with UTF-8 BOM return XML_TOK_BOM; } break; default: if (ptr[0] == '\0') { /* 0 isn't a legal data character. Furthermore a document entity can only start with ASCII characters. So the only way this can fail to be big-endian UTF-16 if it it's an external parsed general entity that's labelled as UTF-16LE. */ if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) break; *encPtr = encodingTable[UTF_16BE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } else if (ptr[1] == '\0') { /* We could recover here in the case: - parsing an external entity - second byte is 0 - no externally specified encoding - no encoding declaration by assuming UTF-16LE. But we don't, because this would mean when presented just with a single byte, we couldn't reliably determine whether we needed further bytes. */ if (state == XML_CONTENT_STATE) break; *encPtr = encodingTable[UTF_16LE_ENC]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } break; } } *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; return XmlTok(*encPtr, state, ptr, end, nextTokPtr); } #define NS(x) x #define ns(x) x #include "xmltok_ns.c" #undef NS #undef ns #ifdef XML_NS #define NS(x) x ## NS #define ns(x) x ## _ns #include "xmltok_ns.c" #undef NS #undef ns ENCODING * XmlInitUnknownEncodingNS(void *mem, int *table, int (*convert)(void *userData, const char *p), void *userData) { ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); if (enc) ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; return enc; } #endif /* XML_NS */ syncevolution-1.5/src/synthesis/src/expat/xmltok/xmltok.h0000755000373300037200000002347012424517753025454 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #ifndef XmlTok_INCLUDED #define XmlTok_INCLUDED 1 #ifdef __cplusplus extern "C" { #endif #ifndef XMLTOKAPI #define XMLTOKAPI /* as nothing */ #endif /* The following token may be returned by XmlContentTok */ #define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be start of illegal ]]> sequence */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok */ #define XML_TOK_NONE -4 /* The string to be scanned is empty */ #define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; might be part of CRLF sequence */ #define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ #define XML_TOK_PARTIAL -1 /* only part of a token */ #define XML_TOK_INVALID 0 /* The following tokens are returned by XmlContentTok; some are also returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok */ #define XML_TOK_START_TAG_WITH_ATTS 1 #define XML_TOK_START_TAG_NO_ATTS 2 #define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ #define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 #define XML_TOK_END_TAG 5 #define XML_TOK_DATA_CHARS 6 #define XML_TOK_DATA_NEWLINE 7 #define XML_TOK_CDATA_SECT_OPEN 8 #define XML_TOK_ENTITY_REF 9 #define XML_TOK_CHAR_REF 10 /* numeric character reference */ /* The following tokens may be returned by both XmlPrologTok and XmlContentTok */ #define XML_TOK_PI 11 /* processing instruction */ #define XML_TOK_XML_DECL 12 /* XML decl or text decl */ #define XML_TOK_COMMENT 13 #define XML_TOK_BOM 14 /* Byte order mark */ /* The following tokens are returned only by XmlPrologTok */ #define XML_TOK_PROLOG_S 15 #define XML_TOK_DECL_OPEN 16 /* */ #define XML_TOK_NAME 18 #define XML_TOK_NMTOKEN 19 #define XML_TOK_POUND_NAME 20 /* #name */ #define XML_TOK_OR 21 /* | */ #define XML_TOK_PERCENT 22 #define XML_TOK_OPEN_PAREN 23 #define XML_TOK_CLOSE_PAREN 24 #define XML_TOK_OPEN_BRACKET 25 #define XML_TOK_CLOSE_BRACKET 26 #define XML_TOK_LITERAL 27 #define XML_TOK_PARAM_ENTITY_REF 28 #define XML_TOK_INSTANCE_START 29 /* The following occur only in element type declarations */ #define XML_TOK_NAME_QUESTION 30 /* name? */ #define XML_TOK_NAME_ASTERISK 31 /* name* */ #define XML_TOK_NAME_PLUS 32 /* name+ */ #define XML_TOK_COND_SECT_OPEN 33 /* */ #define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ #define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ #define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ #define XML_TOK_COMMA 38 /* The following token is returned only by XmlAttributeValueTok */ #define XML_TOK_ATTRIBUTE_VALUE_S 39 /* The following token is returned only by XmlCdataSectionTok */ #define XML_TOK_CDATA_SECT_CLOSE 40 /* With namespace processing this is returned by XmlPrologTok for a name with a colon. */ #define XML_TOK_PREFIXED_NAME 41 #ifdef XML_DTD #define XML_TOK_IGNORE_SECT 42 #endif /* XML_DTD */ #ifdef XML_DTD #define XML_N_STATES 4 #else /* not XML_DTD */ #define XML_N_STATES 3 #endif /* not XML_DTD */ #define XML_PROLOG_STATE 0 #define XML_CONTENT_STATE 1 #define XML_CDATA_SECTION_STATE 2 #ifdef XML_DTD #define XML_IGNORE_SECTION_STATE 3 #endif /* XML_DTD */ #define XML_N_LITERAL_TYPES 2 #define XML_ATTRIBUTE_VALUE_LITERAL 0 #define XML_ENTITY_VALUE_LITERAL 1 /* The size of the buffer passed to XmlUtf8Encode must be at least this. */ #define XML_UTF8_ENCODE_MAX 4 /* The size of the buffer passed to XmlUtf16Encode must be at least this. */ #define XML_UTF16_ENCODE_MAX 2 typedef struct position { /* first line and first column are 0 not 1 */ unsigned long lineNumber; unsigned long columnNumber; } POSITION; typedef struct { const char *name; const char *valuePtr; const char *valueEnd; char normalized; } ATTRIBUTE; struct encoding; typedef struct encoding ENCODING; struct encoding { int (*scanners[XML_N_STATES])(const ENCODING *, const char *, const char *, const char **); int (*literalScanners[XML_N_LITERAL_TYPES])(const ENCODING *, const char *, const char *, const char **); int (*sameName)(const ENCODING *, const char *, const char *); int (*nameMatchesAscii)(const ENCODING *, const char *, const char *, const char *); int (*nameLength)(const ENCODING *, const char *); const char *(*skipS)(const ENCODING *, const char *); int (*getAtts)(const ENCODING *enc, const char *ptr, int attsMax, ATTRIBUTE *atts); int (*charRefNumber)(const ENCODING *enc, const char *ptr); int (*predefinedEntityName)(const ENCODING *, const char *, const char *); void (*updatePosition)(const ENCODING *, const char *ptr, const char *end, POSITION *); int (*isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr); void (*utf8Convert)(const ENCODING *enc, const char **fromP, const char *fromLim, char **toP, const char *toLim); void (*utf16Convert)(const ENCODING *enc, const char **fromP, const char *fromLim, unsigned short **toP, const unsigned short *toLim); int minBytesPerChar; char isUtf8; char isUtf16; }; /* Scan the string starting at ptr until the end of the next complete token, but do not scan past eptr. Return an integer giving the type of token. Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. Return XML_TOK_PARTIAL when the string does not contain a complete token; nextTokPtr will not be set. Return XML_TOK_INVALID when the string does not start a valid token; nextTokPtr will be set to point to the character which made the token invalid. Otherwise the string starts with a valid token; nextTokPtr will be set to point to the character following the end of that token. Each data character counts as a single token, but adjacent data characters may be returned together. Similarly for characters in the prolog outside literals, comments and processing instructions. */ #define XmlTok(enc, state, ptr, end, nextTokPtr) \ (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) #define XmlPrologTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) #define XmlContentTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) #define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) #ifdef XML_DTD #define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) #endif /* XML_DTD */ /* This is used for performing a 2nd-level tokenization on the content of a literal that has already been returned by XmlTok. */ #define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) #define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) #define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) #define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) #define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) #define XmlNameLength(enc, ptr) \ (((enc)->nameLength)(enc, ptr)) #define XmlSkipS(enc, ptr) \ (((enc)->skipS)(enc, ptr)) #define XmlGetAttributes(enc, ptr, attsMax, atts) \ (((enc)->getAtts)(enc, ptr, attsMax, atts)) #define XmlCharRefNumber(enc, ptr) \ (((enc)->charRefNumber)(enc, ptr)) #define XmlPredefinedEntityName(enc, ptr, end) \ (((enc)->predefinedEntityName)(enc, ptr, end)) #define XmlUpdatePosition(enc, ptr, end, pos) \ (((enc)->updatePosition)(enc, ptr, end, pos)) #define XmlIsPublicId(enc, ptr, end, badPtr) \ (((enc)->isPublicId)(enc, ptr, end, badPtr)) #define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) #define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) typedef struct { ENCODING initEnc; const ENCODING **encPtr; } INIT_ENCODING; int XMLTOKAPI XmlParseXmlDecl(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingNamePtr, const ENCODING **namedEncodingPtr, int *standalonePtr); int XMLTOKAPI XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING XMLTOKAPI *XmlGetUtf8InternalEncoding(void); const ENCODING XMLTOKAPI *XmlGetUtf16InternalEncoding(void); int XMLTOKAPI XmlUtf8Encode(int charNumber, char *buf); int XMLTOKAPI XmlUtf16Encode(int charNumber, unsigned short *buf); int XMLTOKAPI XmlSizeOfUnknownEncoding(void); ENCODING XMLTOKAPI * XmlInitUnknownEncoding(void *mem, int *table, int (*conv)(void *userData, const char *p), void *userData); int XMLTOKAPI XmlParseXmlDeclNS(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingNamePtr, const ENCODING **namedEncodingPtr, int *standalonePtr); int XMLTOKAPI XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); const ENCODING XMLTOKAPI *XmlGetUtf8InternalEncodingNS(void); const ENCODING XMLTOKAPI *XmlGetUtf16InternalEncodingNS(void); ENCODING XMLTOKAPI * XmlInitUnknownEncodingNS(void *mem, int *table, int (*conv)(void *userData, const char *p), void *userData); #ifdef __cplusplus } #endif #endif /* not XmlTok_INCLUDED */ syncevolution-1.5/src/synthesis/src/expat/xmltok/xmltok_impl.c0000755000373300037200000011765012424517753026474 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ #ifndef IS_INVALID_CHAR #define IS_INVALID_CHAR(enc, ptr, n) (0) #endif #define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (IS_INVALID_CHAR(enc, ptr, n)) { \ *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define INVALID_CASES(ptr, nextTokPtr) \ INVALID_LEAD_CASE(2, ptr, nextTokPtr) \ INVALID_LEAD_CASE(3, ptr, nextTokPtr) \ INVALID_LEAD_CASE(4, ptr, nextTokPtr) \ case BT_NONXML: \ case BT_MALFORM: \ case BT_TRAIL: \ *(nextTokPtr) = (ptr); \ return XML_TOK_INVALID; #define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (!IS_NAME_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \ case BT_NONASCII: \ if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ case BT_NMSTRT: \ case BT_HEX: \ case BT_DIGIT: \ case BT_NAME: \ case BT_MINUS: \ ptr += MINBPC(enc); \ break; \ CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \ CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \ CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr) #define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ ptr += n; \ break; #define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \ case BT_NONASCII: \ if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; \ } \ case BT_NMSTRT: \ case BT_HEX: \ ptr += MINBPC(enc); \ break; \ CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \ CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \ CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr) #ifndef PREFIX #define PREFIX(ident) ident #endif /* ptr points to character following " */ switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_INVALID; } /* fall through */ case BT_S: case BT_CR: case BT_LF: *nextTokPtr = ptr; return XML_TOK_DECL_OPEN; case BT_NMSTRT: case BT_HEX: ptr += MINBPC(enc); break; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr) { int upper = 0; *tokPtr = XML_TOK_PI; if (end - ptr != MINBPC(enc)*3) return 1; switch (BYTE_TO_ASCII(enc, ptr)) { case ASCII_x: break; case ASCII_X: upper = 1; break; default: return 1; } ptr += MINBPC(enc); switch (BYTE_TO_ASCII(enc, ptr)) { case ASCII_m: break; case ASCII_M: upper = 1; break; default: return 1; } ptr += MINBPC(enc); switch (BYTE_TO_ASCII(enc, ptr)) { case ASCII_l: break; case ASCII_L: upper = 1; break; default: return 1; } if (upper) return 0; *tokPtr = XML_TOK_XML_DECL; return 1; } /* ptr points to character following " 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } switch (BYTE_TYPE(enc, ptr)) { case BT_RSQB: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) break; ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { ptr -= MINBPC(enc); break; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CDATA_SECT_CLOSE; case BT_CR: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; case BT_LF: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC(enc); break; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_DATA_CHARS; \ } \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONXML: case BT_MALFORM: case BT_TRAIL: case BT_CR: case BT_LF: case BT_RSQB: *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } /* ptr points to character following " 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } switch (BYTE_TYPE(enc, ptr)) { case BT_LT: return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_AMP: return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_CR: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; case BT_LF: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; case BT_RSQB: ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_RSQB; if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) break; ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_RSQB; if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { ptr -= MINBPC(enc); break; } *nextTokPtr = ptr; return XML_TOK_INVALID; INVALID_CASES(ptr, nextTokPtr) default: ptr += MINBPC(enc); break; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ *nextTokPtr = ptr; \ return XML_TOK_DATA_CHARS; \ } \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_RSQB: if (ptr + MINBPC(enc) != end) { if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { ptr += MINBPC(enc); break; } if (ptr + 2*MINBPC(enc) != end) { if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { ptr += MINBPC(enc); break; } *nextTokPtr = ptr + 2*MINBPC(enc); return XML_TOK_INVALID; } } /* fall through */ case BT_AMP: case BT_LT: case BT_NONXML: case BT_MALFORM: case BT_TRAIL: case BT_CR: case BT_LF: *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } /* ptr points to character following "%" */ static int PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: *nextTokPtr = ptr; return XML_TOK_PERCENT; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_SEMI: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_PARAM_ENTITY_REF; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return XML_TOK_PARTIAL; } static int PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_CR: case BT_LF: case BT_S: case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: *nextTokPtr = ptr; return XML_TOK_POUND_NAME; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return -XML_TOK_POUND_NAME; } static int PREFIX(scanLit)(int open, const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { while (ptr != end) { int t = BYTE_TYPE(enc, ptr); switch (t) { INVALID_CASES(ptr, nextTokPtr) case BT_QUOT: case BT_APOS: ptr += MINBPC(enc); if (t != open) break; if (ptr == end) return -XML_TOK_LITERAL; *nextTokPtr = ptr; switch (BYTE_TYPE(enc, ptr)) { case BT_S: case BT_CR: case BT_LF: case BT_GT: case BT_PERCNT: case BT_LSQB: return XML_TOK_LITERAL; default: return XML_TOK_INVALID; } default: ptr += MINBPC(enc); break; } } return XML_TOK_PARTIAL; } static int PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { int tok; if (ptr == end) return XML_TOK_NONE; if (MINBPC(enc) > 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); if (n == 0) return XML_TOK_PARTIAL; end = ptr + n; } } switch (BYTE_TYPE(enc, ptr)) { case BT_QUOT: return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_APOS: return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_LT: { ptr += MINBPC(enc); if (ptr == end) return XML_TOK_PARTIAL; switch (BYTE_TYPE(enc, ptr)) { case BT_EXCL: return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_QUEST: return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_NMSTRT: case BT_HEX: case BT_NONASCII: case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: *nextTokPtr = ptr - MINBPC(enc); return XML_TOK_INSTANCE_START; } *nextTokPtr = ptr; return XML_TOK_INVALID; } case BT_CR: if (ptr + MINBPC(enc) == end) return -XML_TOK_PROLOG_S; /* fall through */ case BT_S: case BT_LF: for (;;) { ptr += MINBPC(enc); if (ptr == end) break; switch (BYTE_TYPE(enc, ptr)) { case BT_S: case BT_LF: break; case BT_CR: /* don't split CR/LF pair */ if (ptr + MINBPC(enc) != end) break; /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_PROLOG_S; } } *nextTokPtr = ptr; return XML_TOK_PROLOG_S; case BT_PERCNT: return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); case BT_COMMA: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_COMMA; case BT_LSQB: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_OPEN_BRACKET; case BT_RSQB: ptr += MINBPC(enc); if (ptr == end) return -XML_TOK_CLOSE_BRACKET; if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { if (ptr + MINBPC(enc) == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { *nextTokPtr = ptr + 2*MINBPC(enc); return XML_TOK_COND_SECT_CLOSE; } } *nextTokPtr = ptr; return XML_TOK_CLOSE_BRACKET; case BT_LPAR: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_OPEN_PAREN; case BT_RPAR: ptr += MINBPC(enc); if (ptr == end) return -XML_TOK_CLOSE_PAREN; switch (BYTE_TYPE(enc, ptr)) { case BT_AST: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_ASTERISK; case BT_QUEST: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_QUESTION; case BT_PLUS: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_CLOSE_PAREN_PLUS; case BT_CR: case BT_LF: case BT_S: case BT_GT: case BT_COMMA: case BT_VERBAR: case BT_RPAR: *nextTokPtr = ptr; return XML_TOK_CLOSE_PAREN; } *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_VERBAR: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_OR; case BT_GT: *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DECL_CLOSE; case BT_NUM: return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (end - ptr < n) \ return XML_TOK_PARTIAL_CHAR; \ if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ ptr += n; \ tok = XML_TOK_NAME; \ break; \ } \ if (IS_NAME_CHAR(enc, ptr, n)) { \ ptr += n; \ tok = XML_TOK_NMTOKEN; \ break; \ } \ *nextTokPtr = ptr; \ return XML_TOK_INVALID; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NMSTRT: case BT_HEX: tok = XML_TOK_NAME; ptr += MINBPC(enc); break; case BT_DIGIT: case BT_NAME: case BT_MINUS: #ifdef XML_NS case BT_COLON: #endif tok = XML_TOK_NMTOKEN; ptr += MINBPC(enc); break; case BT_NONASCII: if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { ptr += MINBPC(enc); tok = XML_TOK_NAME; break; } if (IS_NAME_CHAR_MINBPC(enc, ptr)) { ptr += MINBPC(enc); tok = XML_TOK_NMTOKEN; break; } /* fall through */ default: *nextTokPtr = ptr; return XML_TOK_INVALID; } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) case BT_GT: case BT_RPAR: case BT_COMMA: case BT_VERBAR: case BT_LSQB: case BT_PERCNT: case BT_S: case BT_CR: case BT_LF: *nextTokPtr = ptr; return tok; #ifdef XML_NS case BT_COLON: ptr += MINBPC(enc); switch (tok) { case XML_TOK_NAME: if (ptr == end) return XML_TOK_PARTIAL; tok = XML_TOK_PREFIXED_NAME; switch (BYTE_TYPE(enc, ptr)) { CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) default: tok = XML_TOK_NMTOKEN; break; } break; case XML_TOK_PREFIXED_NAME: tok = XML_TOK_NMTOKEN; break; } break; #endif case BT_PLUS: if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_PLUS; case BT_AST: if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_ASTERISK; case BT_QUEST: if (tok == XML_TOK_NMTOKEN) { *nextTokPtr = ptr; return XML_TOK_INVALID; } *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_NAME_QUESTION; default: *nextTokPtr = ptr; return XML_TOK_INVALID; } } return -tok; } static int PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { const char *start; if (ptr == end) return XML_TOK_NONE; start = ptr; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_LT: /* this is for inside entity references */ *nextTokPtr = ptr; return XML_TOK_INVALID; case BT_LF: if (ptr == start) { *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_CR: if (ptr == start) { ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_S: if (ptr == start) { *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_ATTRIBUTE_VALUE_S; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } static int PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { const char *start; if (ptr == end) return XML_TOK_NONE; start = ptr; while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_AMP: if (ptr == start) return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_PERCNT: if (ptr == start) return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_LF: if (ptr == start) { *nextTokPtr = ptr + MINBPC(enc); return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; case BT_CR: if (ptr == start) { ptr += MINBPC(enc); if (ptr == end) return XML_TOK_TRAILING_CR; if (BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); *nextTokPtr = ptr; return XML_TOK_DATA_NEWLINE; } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; default: ptr += MINBPC(enc); break; } } *nextTokPtr = ptr; return XML_TOK_DATA_CHARS; } #ifdef XML_DTD static int PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { int level = 0; if (MINBPC(enc) > 1) { size_t n = end - ptr; if (n & (MINBPC(enc) - 1)) { n &= ~(MINBPC(enc) - 1); end = ptr + n; } } while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { INVALID_CASES(ptr, nextTokPtr) case BT_LT: if ((ptr += MINBPC(enc)) == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { if ((ptr += MINBPC(enc)) == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { ++level; ptr += MINBPC(enc); } } break; case BT_RSQB: if ((ptr += MINBPC(enc)) == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { if ((ptr += MINBPC(enc)) == end) return XML_TOK_PARTIAL; if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { ptr += MINBPC(enc); if (level == 0) { *nextTokPtr = ptr; return XML_TOK_IGNORE_SECT; } --level; } } break; default: ptr += MINBPC(enc); break; } } return XML_TOK_PARTIAL; } #endif /* XML_DTD */ static int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr) { ptr += MINBPC(enc); end -= MINBPC(enc); for (; ptr != end; ptr += MINBPC(enc)) { switch (BYTE_TYPE(enc, ptr)) { case BT_DIGIT: case BT_HEX: case BT_MINUS: case BT_APOS: case BT_LPAR: case BT_RPAR: case BT_PLUS: case BT_COMMA: case BT_SOL: case BT_EQUALS: case BT_QUEST: case BT_CR: case BT_LF: case BT_SEMI: case BT_EXCL: case BT_AST: case BT_PERCNT: case BT_NUM: #ifdef XML_NS case BT_COLON: #endif break; case BT_S: if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { *badPtr = ptr; return 0; } break; case BT_NAME: case BT_NMSTRT: if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) break; default: switch (BYTE_TO_ASCII(enc, ptr)) { case 0x24: /* $ */ case 0x40: /* @ */ break; default: *badPtr = ptr; return 0; } break; } } return 1; } /* This must only be called for a well-formed start-tag or empty element tag. Returns the number of attributes. Pointers to the first attsMax attributes are stored in atts. */ static int PREFIX(getAtts)(const ENCODING *enc, const char *ptr, int attsMax, ATTRIBUTE *atts) { enum { other, inName, inValue } state = inName; int nAtts = 0; int open = 0; /* defined when state == inValue; initialization just to shut up compilers */ for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { switch (BYTE_TYPE(enc, ptr)) { #define START_NAME \ if (state == other) { \ if (nAtts < attsMax) { \ atts[nAtts].name = ptr; \ atts[nAtts].normalized = 1; \ } \ state = inName; \ } #define LEAD_CASE(n) \ case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: case BT_HEX: START_NAME break; #undef START_NAME case BT_QUOT: if (state != inValue) { if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC(enc); state = inValue; open = BT_QUOT; } else if (open == BT_QUOT) { state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; nAtts++; } break; case BT_APOS: if (state != inValue) { if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC(enc); state = inValue; open = BT_APOS; } else if (open == BT_APOS) { state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; nAtts++; } break; case BT_AMP: if (nAtts < attsMax) atts[nAtts].normalized = 0; break; case BT_S: if (state == inName) state = other; else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized && (ptr == atts[nAtts].valuePtr || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) atts[nAtts].normalized = 0; break; case BT_CR: case BT_LF: /* This case ensures that the first attribute name is counted Apart from that we could just change state on the quote. */ if (state == inName) state = other; else if (state == inValue && nAtts < attsMax) atts[nAtts].normalized = 0; break; case BT_GT: case BT_SOL: if (state != inValue) return nAtts; break; default: break; } } /* not reached */ } static int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) { int result = 0; /* skip &# */ ptr += 2*MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_x)) { for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { int c = BYTE_TO_ASCII(enc, ptr); switch (c) { case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: result <<= 4; result |= (c - ASCII_0); break; case ASCII_A: case ASCII_B: case ASCII_C: case ASCII_D: case ASCII_E: case ASCII_F: result <<= 4; result += 10 + (c - ASCII_A); break; case ASCII_a: case ASCII_b: case ASCII_c: case ASCII_d: case ASCII_e: case ASCII_f: result <<= 4; result += 10 + (c - ASCII_a); break; } if (result >= 0x110000) return -1; } } else { for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - ASCII_0); if (result >= 0x110000) return -1; } } return checkCharRefNumber(result); } static int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end) { switch ((end - ptr)/MINBPC(enc)) { case 2: if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { switch (BYTE_TO_ASCII(enc, ptr)) { case ASCII_l: return ASCII_LT; case ASCII_g: return ASCII_GT; } } break; case 3: if (CHAR_MATCHES(enc, ptr, ASCII_a)) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_m)) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_p)) return ASCII_AMP; } } break; case 4: switch (BYTE_TO_ASCII(enc, ptr)) { case ASCII_q: ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_u)) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_o)) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_t)) return ASCII_QUOT; } } break; case ASCII_a: ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_p)) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_o)) { ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_s)) return ASCII_APOS; } } break; } } return 0; } static int PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) { for (;;) { switch (BYTE_TYPE(enc, ptr1)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ if (*ptr1++ != *ptr2++) \ return 0; LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) #undef LEAD_CASE /* fall through */ if (*ptr1++ != *ptr2++) return 0; break; case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: if (*ptr2++ != *ptr1++) return 0; if (MINBPC(enc) > 1) { if (*ptr2++ != *ptr1++) return 0; if (MINBPC(enc) > 2) { if (*ptr2++ != *ptr1++) return 0; if (MINBPC(enc) > 3) { if (*ptr2++ != *ptr1++) return 0; } } } break; default: if (MINBPC(enc) == 1 && *ptr1 == *ptr2) return 1; switch (BYTE_TYPE(enc, ptr2)) { case BT_LEAD2: case BT_LEAD3: case BT_LEAD4: case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: return 0; default: return 1; } } } /* not reached */ } static int PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, const char *end1, const char *ptr2) { for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { if (ptr1 == end1) return 0; if (!CHAR_MATCHES(enc, ptr1, *ptr2)) return 0; } return ptr1 == end1; } static int PREFIX(nameLength)(const ENCODING *enc, const char *ptr) { const char *start = ptr; for (;;) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: ptr += n; break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: #ifdef XML_NS case BT_COLON: #endif case BT_HEX: case BT_DIGIT: case BT_NAME: case BT_MINUS: ptr += MINBPC(enc); break; default: return ptr - start; } } } static const char *PREFIX(skipS)(const ENCODING *enc, const char *ptr) { for (;;) { switch (BYTE_TYPE(enc, ptr)) { case BT_LF: case BT_CR: case BT_S: ptr += MINBPC(enc); break; default: return ptr; } } } static void PREFIX(updatePosition)(const ENCODING *enc, const char *ptr, const char *end, POSITION *pos) { while (ptr != end) { switch (BYTE_TYPE(enc, ptr)) { #define LEAD_CASE(n) \ case BT_LEAD ## n: \ ptr += n; \ break; LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) #undef LEAD_CASE case BT_LF: pos->columnNumber = (unsigned)-1; pos->lineNumber++; ptr += MINBPC(enc); break; case BT_CR: pos->lineNumber++; ptr += MINBPC(enc); if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) ptr += MINBPC(enc); pos->columnNumber = (unsigned)-1; break; default: ptr += MINBPC(enc); break; } pos->columnNumber++; } } #undef DO_LEAD_CASE #undef MULTIBYTE_CASES #undef INVALID_CASES #undef CHECK_NAME_CASE #undef CHECK_NAME_CASES #undef CHECK_NMSTRT_CASE #undef CHECK_NMSTRT_CASES syncevolution-1.5/src/synthesis/src/expat/xmltok/xmltok_impl.h0000755000373300037200000000123112424517753026464 0ustar00nightlyallusers00000000000000/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd See the file copying.txt for copying permission. */ enum { BT_NONXML, BT_MALFORM, BT_LT, BT_AMP, BT_RSQB, BT_LEAD2, BT_LEAD3, BT_LEAD4, BT_TRAIL, BT_CR, BT_LF, BT_GT, BT_QUOT, BT_APOS, BT_EQUALS, BT_QUEST, BT_EXCL, BT_SOL, BT_SEMI, BT_NUM, BT_LSQB, BT_S, BT_NMSTRT, BT_COLON, BT_HEX, BT_DIGIT, BT_NAME, BT_MINUS, BT_OTHER, /* known not to be a name or name start character */ BT_NONASCII, /* might be a name or name start character */ BT_PERCNT, BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, BT_COMMA, BT_VERBAR }; #include syncevolution-1.5/src/synthesis/src/expat/xmltok/xmltok_ns.c0000755000373300037200000000456312424517753026151 0ustar00nightlyallusers00000000000000const ENCODING *NS(XmlGetUtf8InternalEncoding)(void) { return &ns(internal_utf8_encoding).enc; } const ENCODING *NS(XmlGetUtf16InternalEncoding)(void) { #if XML_BYTE_ORDER == 12 return &ns(internal_little2_encoding).enc; #elif XML_BYTE_ORDER == 21 return &ns(internal_big2_encoding).enc; #else const short n = 1; return *(const char *)&n ? &ns(internal_little2_encoding).enc : &ns(internal_big2_encoding).enc; #endif } static const ENCODING *NS(encodings)[] = { &ns(latin1_encoding).enc, &ns(ascii_encoding).enc, &ns(utf8_encoding).enc, &ns(big2_encoding).enc, &ns(big2_encoding).enc, &ns(little2_encoding).enc, &ns(utf8_encoding).enc /* NO_ENC */ }; static int NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_PROLOG_STATE, ptr, end, nextTokPtr); } static int NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, const char **nextTokPtr) { return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_CONTENT_STATE, ptr, end, nextTokPtr); } int NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, const char *name) { int i = getEncodingIndex(name); if (i == UNKNOWN_ENC) return 0; SET_INIT_ENC_INDEX(p, i); p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); p->initEnc.updatePosition = initUpdatePosition; p->encPtr = encPtr; *encPtr = &(p->initEnc); return 1; } static const ENCODING *NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) { #define ENCODING_MAX 128 char buf[ENCODING_MAX]; char *p = buf; int i; XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); if (ptr != end) return 0; *p = 0; if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) return enc; i = getEncodingIndex(buf); if (i == UNKNOWN_ENC) return 0; return NS(encodings)[i]; } int NS(XmlParseXmlDecl)(int isGeneralTextEntity, const ENCODING *enc, const char *ptr, const char *end, const char **badPtr, const char **versionPtr, const char **encodingName, const ENCODING **encoding, int *standalone) { return doParseXmlDecl(NS(findEncoding), isGeneralTextEntity, enc, ptr, end, badPtr, versionPtr, encodingName, encoding, standalone); } syncevolution-1.5/src/synthesis/src/gen-makefile-am.sh0000755000373300037200000000712712424517753024602 0ustar00nightlyallusers00000000000000#! /bin/sh # # Turns Makefile.am.in into a Makefile.am which can be processed by # automake. This is necessary because automake cannot build a list # of source files dynamically. # directories which contain sources for the sync engine ENGINE_SOURCES="sysync DB_interfaces sysync_SDK/Sources Transport_interfaces/engine platform_adapters" # files needed exclusively for libsynthesissdk.a cat > SDK_FILES < SDK_EXCLUDE_FILES <CLIENT_FILES < SERVER_FILES < EXTRA_FILES < EXCLUDE_FILES LIBSYNTHESIS_SOURCES=`find ${ENGINE_SOURCES} \ syncapps/clientEngine_custom \ syncapps/serverEngine_custom \ sysync_SDK/DB_Interfaces/text_db \ \( -name '*.cpp' -o -name '*.[ch]' \) | grep -v -E -f EXCLUDE_FILES | sort` LIBSYNTHESIS_SOURCES=`echo $LIBSYNTHESIS_SOURCES` # files to be included in both libsynthesis and libsynthesissdk; # necessary when building as shared libraries with these files not # being exposed by libsynthesis cat SERVER_FILES CLIENT_FILES EXTRA_FILES > EXCLUDE_FILES LIBSYNTHESISSDK_SOURCES_BOTH=`find sysync_SDK/Sources \ \( -name '*.cpp' -o -name '*.c' \) | grep -v -E -f EXCLUDE_FILES | sort` LIBSYNTHESISSDK_SOURCES_BOTH=`echo $LIBSYNTHESISSDK_SOURCES_BOTH` # files only needed in libsynthesissdk cat SERVER_FILES CLIENT_FILES EXTRA_FILES > EXCLUDE_FILES LIBSYNTHESISSDK_SOURCES_ONLY=`find sysync_SDK/Sources \ \( -name '*.cpp' -o -name '*.c' \) | grep -E -f SDK_FILES | grep -v -E -f EXCLUDE_FILES | sort` LIBSYNTHESISSDK_SOURCES_ONLY=`echo $LIBSYNTHESISSDK_SOURCES_ONLY` # files needed in libsmltk LIBSMLTK_SOURCES=`find syncml_tk \ \( -name '*.cpp' -o -name '*.[ch]' \) \ \! \( -path syncml_tk/src/sml/\*/palm/\* -o \ -path syncml_tk/src/sml/\*/win/\* \) | sort` LIBSMLTK_SOURCES=`echo $LIBSMLTK_SOURCES` # header files required for using libsynthesissdk, # with "synthesis/" prefix LIBSYNTHESISSDK_HEADERS=`find sysync_SDK/Sources -name '*.h' | sed -e 's;.*/;synthesis/;' | sort` LIBSYNTHESISSDK_HEADERS=`echo $LIBSYNTHESISSDK_HEADERS` sed -e "s;@LIBSYNTHESIS_SOURCES@;$LIBSYNTHESIS_SOURCES;" \ -e "s;@LIBSYNTHESISSDK_SOURCES_BOTH@;$LIBSYNTHESISSDK_SOURCES_BOTH;" \ -e "s;@LIBSYNTHESISSDK_SOURCES_SDK_ONLY@;$LIBSYNTHESISSDK_SOURCES_ONLY;" \ -e "s;@LIBSMLTK_SOURCES@;$LIBSMLTK_SOURCES;" \ -e "s;@LIBSYNTHESISSDK_HEADERS@;$LIBSYNTHESISSDK_HEADERS;" \ Makefile.am.in >Makefile.am syncevolution-1.5/src/synthesis/src/global_options.h0000644000373300037200000002301212424517753024477 0ustar00nightlyallusers00000000000000/* SySync entirely global options (affects all targets) * ==================================================== * * (c) 2001-2012 by Synthesis AG + plan44.ch * */ #ifndef GLOBAL_OPTIONS_H #define GLOBAL_OPTIONS_H // the following should be defined BEFORE including this file // - SYSYNC_CLIENT : defined if client functionality should be included // - SYSYNC_SERVER : defined if server functionality should be included // If not defined, and SYSYNC_CLIENT is also not defined, build // defaults to SYSYNC_SERVER // - platform defines, like MACOSX, MOBOSX, LINUX, WINCE, _WIN32 // __PALM_OS__, __EPOC_OS__ etc. // - RELEASE_VERSION : define in targets that are real product releases // not internal debug/test/experimental releases // - RELEASE_SYDEBUG : define the debug level for RELEASE_VERSION // (0=no debug code at all, 1=basic debug, 2=extended, 3=developer only) // Non-release versions (RELEASE_VERSION undefined) usually have // a debug level of 2 or 3 (defined in target or product options). // signal that we are compiling with the SYSYNC engine #define SYSYNC_ENGINE 1 // Expiry date for products (those that have use EXPIRES_AFTER_DATE at all) #if defined(EXPIRY_YEAR) && defined(SYSER_REGISTRATION) #error "it seems that this target still defines it's own private expiry date - please update target_options.h" #endif #if defined(EXPIRY_YEAR) && EXPIRY_YEAR<2014 #warning "Target has a dangerously early expiry year - please check if it is correct" #endif // global expiry date (usually applies for unregistered demos or regular products in trial mode) #ifndef EXPIRY_YEAR #define EXPIRY_DATE_STRING "2016-03-31" #define EXPIRY_YEAR 2016 #define EXPIRY_MONTH 3 #define EXPIRY_DAY 31 #endif // Release date (date relevant for licenses that are valid only up to a certain release date) #if !defined(RELEASE_YEAR) || !defined(RELEASE_MONTH) // define one globally in case target or product does not specify it's own date #define RELEASE_YEAR 2010 #define RELEASE_YEAR_TXT "2010" #define RELEASE_MONTH 1 #define RELEASE_MONTH_TXT "1" #endif // Real Release date (shown in some texts) #if !defined(REAL_RELEASE_YEAR) #define REAL_RELEASE_YEAR 2012 #define REAL_RELEASE_YEAR_TXT "2012" #endif // For old targets that do not have product_options.h yet // - Set common Version information #ifndef SYSYNC_VERSION_MAJOR #define SYSYNC_VERSION_MAJOR 3 #define SYSYNC_VERSION_MAJOR_TXT "3" #endif #ifndef SYSYNC_VERSION_MINOR #define SYSYNC_VERSION_MINOR 4 #define SYSYNC_VERSION_MINOR_TXT "4" #endif #ifndef SYSYNC_SUBVERSION #define SYSYNC_SUBVERSION 0 #define SYSYNC_SUBVERSION_TXT "0" #endif #ifndef SYSYNC_BUILDNUMBER #define SYSYNC_BUILDNUMBER 47 #define SYSYNC_BUILDNUMBER_TXT "47" #endif // Platform name #ifndef SYSYNC_PLATFORM_NAME #if defined(__EPOC_OS__) #define SYSYNC_PLATFORM_NAME "SymbianOS" #elif defined(MOBOSX) #define SYSYNC_PLATFORM_NAME "iOS" #elif defined(MACOSX) #define SYSYNC_PLATFORM_NAME "MacOSX" #elif defined(ANDROID) #define SYSYNC_PLATFORM_NAME "Android" #elif defined(LINUX) #define SYSYNC_PLATFORM_NAME "Linux" #elif defined(__PALM_OS__) #define SYSYNC_PLATFORM_NAME "PalmOS" #elif defined(WINCE) #define SYSYNC_PLATFORM_NAME "WinCE" #elif defined(_WIN32) #define SYSYNC_PLATFORM_NAME "Win32" #endif #endif // product version string #define SYSYNC_VERSION_STRING SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT // full version string #define SYSYNC_FULL_VERSION_STRING SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT "." SYSYNC_SUBVERSION_TXT "." SYSYNC_BUILDNUMBER_TXT // full version string #define SYSYNC_MAIN_VERSION_STRING SYSYNC_VERSION_MAJOR_TXT "." SYSYNC_VERSION_MINOR_TXT // uInt32 format of version (8 bits per dotted group) #define SYSYNC_VERSION_UINT32 (((uInt32)SYSYNC_VERSION_MAJOR<<24)+((uInt32)SYSYNC_VERSION_MINOR<<16)+((uInt32)SYSYNC_SUBVERSION<<8)+(uInt32)SYSYNC_BUILDNUMBER) // client and server strings for XPT-based apps #define SERVER_NAME "Synthesis SyncML Server/" SYSYNC_FULL_VERSION_STRING #define CLIENT_NAME "Synthesis SyncML Client/" SYSYNC_FULL_VERSION_STRING " [en] (" SYSYNC_PLATFORM_NAME "; I)" // FPI product identifier #define SYSYNC_FPI "-//Synthesis AG//NONSGML SyncML Engine V" SYSYNC_FULL_VERSION_STRING "//EN" // Global feature switches (might be overridden in individual targets) // ################################################################### // server or client macros // - make sure we have either SYSYNC_CLIENT, SYSYNC_SERVER or both // - if combined build, define SERVER_CLIENT_BUILD as well #if defined(SYSYNC_CLIENT) && defined(SYSYNC_SERVER) #define SERVER_CLIENT_BUILD 1 #elif !defined(SYSYNC_CLIENT) #define SYSYNC_SERVER 1 #endif // build differentiation macros #ifdef SERVER_CLIENT_BUILD // dynamically switching between server and client #define IS_CLIENT (!getSyncAppBase()->isServer()) #define IS_SERVER (getSyncAppBase()->isServer()) #else // static, built as either server or client #ifdef SYSYNC_CLIENT // client #define IS_CLIENT 1 #define IS_SERVER 0 #else // server #define IS_CLIENT 0 #define IS_SERVER 1 #endif #endif // build type #ifdef ENGINE_LIBRARY // SySync engine with API // - may not have any globals #undef DIRECT_APPBASE_GLOBALACCESS // - has Engine Interface #define ENGINEINTERFACE_SUPPORT 1 // - should support constant XML config #define CONSTANTXML_CONFIG 1 #else // Classic SySync build // - needs direct accessors to syncAppBase and maybe other global vars #define DIRECT_APPBASE_GLOBALACCESS 1 #endif // binfile layer specifics #if defined(BASED_ON_BINFILE_CLIENT) && !defined(SYSYNC_SERVER) // client-only build with binfiles included -> binfile must be always active // (and customimpl does not need a lot of stuff it would otherwise include) #define BINFILE_ALWAYS_ACTIVE 1 #endif // default datatype support #define MIMEDIR_SUPPORT 1 #define TEXTTYPE_SUPPORT 1 #define DATAOBJ_SUPPORT 1 #define RAWTYPE_SUPPORT 1 // intermediate stuff for v3.x development /// @todo /// the following defines are for v3.x development only and must be cleared out or moved to a permanent location for a final version! // default to ODBC support (if and only if SQL_SUPPORT is selected in the target) #define ODBCAPI_SUPPORT 1 // default to both text and AsKey variants of item passing in Api datastores #define DBAPI_TEXTITEMS 1 #define DBAPI_ASKEYITEMS 1 // SyncML version support #define MAX_SYNCML_VERSION syncml_vers_1_2 #ifdef SYSYNC_CLIENT // these are normally client options, servers don't have them by default // client provides GUI suport for CGI server options such as TAF and/or /li(x) /dr(x,y)... #define CGI_SERVER_OPTIONS 1 #undef CHINESE_SUPPORT #else // these are normally server options, clients don't have them by default // include large-footprint conversions between chinese and UTF-8 #define CHINESE_SUPPORT 1 // if defined, TAF option chars will be used like syncset filter /fi(...) // (that's how it always was before 1.0.8.9 server) // Was globally defined 1 until and including server 2.0.5.12 // Starting with 2.0.5.13 server, real TAF is now (partially) available, so we // switch this off #undef TAF_AS_SYNCSETFILTER // real SyncML-like TAF #define SYNCML_TAF_SUPPORT 1 // if defined, we support Synthesis style target options (/opt(args) style) #define SYSYNC_TARGET_OPTIONS 1 // object is enabled by default for now (standard version turns it off) #define OBJECT_FILTERING 1 // array field support is enabled by default for now (standard version turns it off) #define ARRAYFIELD_SUPPORT 1 // array field support is enabled by default for now (standard version turns it off) #define STREAMFIELD_SUPPORT 1 // full support for email in textitem #define EMAIL_FORMAT_SUPPORT 1 #define EMAIL_ATTACHMENT_SUPPORT 1 // script support is enabled by default for now (standard version turns it off) #define SCRIPT_SUPPORT 1 #define REGEX_SUPPORT 1 // superdatastore support is enabled by default #define SUPERDATASTORES 1 #endif // ODBC not compatible with 1.0.5.x type config any more #undef OLD_1_0_5_CONFIG_COMPATIBLE // Settings that have proven globally correct by now // ################################################# // SySync options // ============== // s2g does not need these extras any more, everything is solved with scripts // #define SPACE2GO_EXTRAS 1 // use new space evaluation method #define USE_SML_EVALUATION 1 // do not modify remote IDs in any way while processing them #define DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS 1 // Time options // - if defined, querying current lineartime will return millisecond // accuray value. #define NOW_WITH_MILLISECONDS 1 // activate the new timezone system #define NEW_TIMEZONES 1 // - if defined, code for incoming and outgoing SyncML dumping into (WB)XML logfiles is included #define MSGDUMP 1 // - if defined, code for incoming message simulation from "i_" prefixed incoming message dump file is included #undef SIMMSGREAD // - allow keep connection #define HTTP_KEEP_CONNECTION 1 // SyncML Toolkit options // ====================== // if defined, the entire complicated and thread-unsafe workspace manager // is completely bypassed #define NOWSM 1 /* correct tagging of XML payload with $s =~ s/>/>/g; $s =~ s"\\fI(.*?)\\f[RP]"$1"g; $s =~ s"\\fB(.*?)\\f[RP]"$1"g; $s =~ s"\\e"\\"g; $s =~ s/(?<=Copyright )\(c\)/©/g; $s; } # Subroutine to ensure not in a paragraph sub end_para { if ($inpara) { print TEMP "\n" if ($inpre); print TEMP "

\n"; } $inpara = $inpre = 0; $wrotetext = 0; } # Subroutine to start a new paragraph sub new_para { &end_para(); print TEMP "

\n"; $inpara = 1; } # Main program $innf = 0; $inpara = 0; $inpre = 0; $wrotetext = 0; $toc = 0; $ref = 1; while ($#ARGV >= 0 && $ARGV[0] =~ /^-/) { $toc = 1 if $ARGV[0] eq "-toc"; shift; } # Initial output to STDOUT print < $ARGV[0] specification

$ARGV[0] man page

Return to the PCRE index page.

This page is part of the PCRE HTML documentation. It was generated automatically from the original man page. If there is any nonsense in it, please consult the man page, in case the conversion went wrong.
End print "

    \n" if ($toc); open(TEMP, ">/tmp/$$") || die "Can't open /tmp/$$ for output\n"; while () { # Handle lines beginning with a dot if (/^\./) { # Some of the PCRE man pages used to contain instances of .br. However, # they should have all been removed because they cause trouble in some # (other) automated systems that translate man pages to HTML. Complain if # we find .br or .in (another macro that is deprecated). if (/^\.br/ || /^\.in/) { print STDERR "\n*** Deprecated macro encountered - rewrite needed\n"; print STDERR "*** $_\n"; die "*** Processing abandoned\n"; } # Instead of .br, relevent "literal" sections are enclosed in .nf/.fi. elsif (/^\.nf/) { $innf = 1; } elsif (/^\.fi/) { $innf = 0; } # Handling .sp is subtle. If it is inside a literal section, do nothing if # the next line is a non literal text line; similarly, if not inside a # literal section, do nothing if a literal follows. The point being that # the
     and 
    that delimit literal sections will do the spacing. # Always skip if no previous output. elsif (/^\.sp/) { if ($wrotetext) { $_ = ; if ($inpre) { print TEMP "\n" if (/^[\s.]/); } else { print TEMP "
    \n
    \n" if (!/^[\s.]/); } redo; # Now process the lookahead line we just read } } elsif (/^\.TP/ || /^\.PP/ || /^\.P/) { &new_para(); } elsif (/^\.SH\s*("?)(.*)\1/) { # Ignore the NAME section if ($2 =~ /^NAME\b/) { ; next; } &end_para(); my($title) = &do_line($2); if ($toc) { printf("
  • $title\n", $ref, $ref); printf TEMP ("
    $title
    \n", $ref, $ref); $ref++; } else { print TEMP "
    \n$title\n
    \n"; } } elsif (/^\.SS\s*("?)(.*)\1/) { &end_para(); my($title) = &do_line($2); print TEMP "
    \n$title\n
    \n"; } elsif (/^\.B\s*(.*)/) { &new_para() if (!$inpara); $_ = &do_line($1); s/"(.*?)"/$1/g; print TEMP "$_\n"; $wrotetext = 1; } elsif (/^\.I\s*(.*)/) { &new_para() if (!$inpara); $_ = &do_line($1); s/"(.*?)"/$1/g; print TEMP "$_\n"; $wrotetext = 1; } # A comment that starts "HREF" takes the next line as a name that # is turned into a hyperlink, using the text given, which might be # in a special font. If it ends in () or (digits) or punctuation, they # aren't part of the link. elsif (/^\.\\"\s*HREF/) { $_=; chomp; $_ = &do_line($_); $_ =~ s/\s+$//; $_ =~ /^(?:<.>)?([^<(]+)(?:\(\))?(?:<\/.>)?(?:\(\d+\))?[.,;:]?$/; print TEMP "$_\n"; } # A comment that starts "HTML" inserts literal HTML elsif (/^\.\\"\s*HTML\s*(.*)/) { print TEMP $1; } # A comment that starts < inserts that HTML at the end of the # *next* input line - so as not to get a newline between them. elsif (/^\.\\"\s*(<.*>)/) { my($markup) = $1; $_=; chomp; $_ = &do_line($_); $_ =~ s/\s+$//; print TEMP "$_$markup\n"; } # A comment that starts JOIN joins the next two lines together, with one # space between them. Then that line is processed. This is used in some # displays where two lines are needed for the "man" version. JOINSH works # the same, except that it assumes this is a shell command, so removes # continuation backslashes. elsif (/^\.\\"\s*JOIN(SH)?/) { my($one,$two); $one = ; $two = ; $one =~ s/\s*\\e\s*$// if (defined($1)); chomp($one); $two =~ s/^\s+//; $_ = "$one $two"; redo; # Process the joined lines } # Ignore anything not recognized next; } # Line does not begin with a dot. Replace blank lines with new paragraphs if (/^\s*$/) { &end_para() if ($wrotetext); next; } # Convert fonts changes and output an ordinary line. Ensure that indented # lines are marked as literal. $_ = &do_line($_); &new_para() if (!$inpara); if (/^\s/) { if (!$inpre) { print TEMP "
    \n";
          $inpre = 1;
          }
        }
      elsif ($inpre)
        {
        print TEMP "
    \n"; $inpre = 0; } # Add
    to the end of a non-literal line if we are within .nf/.fi $_ .= "
    \n" if (!$inpre && $innf); print TEMP; $wrotetext = 1; } # The TOC, if present, will have been written - terminate it print "
\n" if ($toc); # Copy the remainder to the standard output close(TEMP); open(TEMP, "/tmp/$$") || die "Can't open /tmp/$$ for input\n"; print while (); print < Return to the PCRE index page.

End close(TEMP); unlink("/tmp/$$"); # End syncevolution-1.5/src/synthesis/src/pcre/AUTHORS0000644000373300037200000000061612424517753023321 0ustar00nightlyallusers00000000000000THE MAIN PCRE LIBRARY --------------------- Written by: Philip Hazel Email local part: ph10 Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. Copyright (c) 1997-2007 University of Cambridge All rights reserved THE C++ WRAPPER LIBRARY ----------------------- Written by: Google Inc. Copyright (c) 2007 Google Inc All rights reserved #### syncevolution-1.5/src/synthesis/src/pcre/CMakeLists.txt0000644000373300037200000002134712424517753025015 0ustar00nightlyallusers00000000000000# CMakeLists.txt # # This file allows building PCRE with the CMake configuration and build # tool. Download CMake in source or binary form from http://www.cmake.org/ # # Original listfile by Christian Ehrlicher # Refined and expanded by Daniel Richard G. # PROJECT(PCRE C CXX) CMAKE_MINIMUM_REQUIRED(VERSION 2.4.6) # Configuration checks INCLUDE(CheckIncludeFile) INCLUDE(CheckIncludeFileCXX) INCLUDE(CheckFunctionExists) INCLUDE(CheckTypeSize) CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H) CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILE_CXX(type_traits.h HAVE_TYPE_TRAITS_H) CHECK_INCLUDE_FILE_CXX(bits/type_traits.h HAVE_BITS_TYPE_TRAITS_H) CHECK_FUNCTION_EXISTS(bcopy HAVE_BCOPY) CHECK_FUNCTION_EXISTS(memmove HAVE_MEMMOVE) CHECK_FUNCTION_EXISTS(strerror HAVE_STRERROR) CHECK_TYPE_SIZE("long long" LONG_LONG) CHECK_TYPE_SIZE("unsigned long long" UNSIGNED_LONG_LONG) # User-configurable options # # (Note: CMakeSetup displays these in alphabetical order, regardless of # the order we use here) SET(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries instead of static ones.") OPTION(PCRE_BUILD_PCRECPP "Build the PCRE C++ library (pcrecpp)." ON) SET(PCRE_EBCDIC OFF CACHE BOOL "Use EBCDIC coding instead of ASCII. (This is rarely used outside of mainframe systems)") SET(PCRE_LINK_SIZE "2" CACHE STRING "Internal link size (2, 3 or 4 allowed). See LINK_SIZE in config.h.in for details.") SET(PCRE_MATCH_LIMIT "10000000" CACHE STRING "Default limit on internal looping. See MATCH_LIMIT in config.h.in for details.") SET(PCRE_MATCH_LIMIT_RECURSION "MATCH_LIMIT" CACHE STRING "Default limit on internal recursion. See MATCH_LIMIT_RECURSION in config.h.in for details.") SET(PCRE_NEWLINE "LF" CACHE STRING "What to recognize as a newline (one of CR, LF, CRLF, ANY).") SET(PCRE_NO_RECURSE OFF CACHE BOOL "If ON, then don't use stack recursion when matching. See NO_RECURSE in config.h.in for details.") SET(PCRE_POSIX_MALLOC_THRESHOLD "10" CACHE STRING "Threshold for malloc() usage. See POSIX_MALLOC_THRESHOLD in config.h.in for details.") SET(PCRE_SUPPORT_UNICODE_PROPERTIES OFF CACHE BOOL "Enable support for Unicode properties. (If set, UTF-8 support will be enabled as well)") SET(PCRE_SUPPORT_UTF8 OFF CACHE BOOL "Enable support for the Unicode UTF-8 encoding.") # Prepare build configuration SET(pcre_have_type_traits 0) SET(pcre_have_bits_type_traits 0) IF(HAVE_TYPE_TRAITS_H) SET(pcre_have_type_traits 1) ENDIF(HAVE_TYPE_TRAITS_H) IF(HAVE_BITS_TYPE_TRAITS_H) SET(pcre_have_bits_type_traits 1) ENDIF(HAVE_BITS_TYPE_TRAITS_H) SET(pcre_have_long_long 0) SET(pcre_have_ulong_long 0) IF(HAVE_LONG_LONG) SET(pcre_have_long_long 1) ENDIF(HAVE_LONG_LONG) IF(HAVE_UNSIGNED_LONG_LONG) SET(pcre_have_ulong_long 1) ENDIF(HAVE_UNSIGNED_LONG_LONG) IF(NOT BUILD_SHARED_LIBS) SET(PCRE_STATIC 1) ENDIF(NOT BUILD_SHARED_LIBS) IF(PCRE_SUPPORT_UTF8 OR PCRE_SUPPORT_UNICODE_PROPERTIES) SET(SUPPORT_UTF8 1) ENDIF(PCRE_SUPPORT_UTF8 OR PCRE_SUPPORT_UNICODE_PROPERTIES) IF(PCRE_SUPPORT_UNICODE_PROPERTIES) SET(SUPPORT_UCP 1) ENDIF(PCRE_SUPPORT_UNICODE_PROPERTIES) SET(NEWLINE "") IF(PCRE_NEWLINE STREQUAL "LF") SET(NEWLINE "10") ENDIF(PCRE_NEWLINE STREQUAL "LF") IF(PCRE_NEWLINE STREQUAL "CR") SET(NEWLINE "13") ENDIF(PCRE_NEWLINE STREQUAL "CR") IF(PCRE_NEWLINE STREQUAL "CRLF") SET(NEWLINE "3338") ENDIF(PCRE_NEWLINE STREQUAL "CRLF") IF(PCRE_NEWLINE STREQUAL "ANY") SET(NEWLINE "-1") ENDIF(PCRE_NEWLINE STREQUAL "ANY") IF(NEWLINE STREQUAL "") MESSAGE(FATAL_ERROR "The PCRE_NEWLINE variable must be set to one of the following values: \"LF\", \"CR\", \"CRLF\", \"ANY\".") ENDIF(NEWLINE STREQUAL "") IF(PCRE_EBCDIC) SET(EBCDIC 1) ENDIF(PCRE_EBCDIC) IF(PCRE_NO_RECURSE) SET(NO_RECURSE 1) ENDIF(PCRE_NO_RECURSE) # Output files CONFIGURE_FILE(config-cmake.h.in ${CMAKE_BINARY_DIR}/config.h @ONLY) CONFIGURE_FILE(pcre.h.generic ${CMAKE_BINARY_DIR}/pcre.h COPYONLY) # What about pcre-config and libpcre.pc? IF(PCRE_BUILD_PCRECPP) CONFIGURE_FILE(pcre_stringpiece.h.in ${CMAKE_BINARY_DIR}/pcre_stringpiece.h @ONLY) CONFIGURE_FILE(pcrecpparg.h.in ${CMAKE_BINARY_DIR}/pcrecpparg.h @ONLY) ENDIF(PCRE_BUILD_PCRECPP) # Character table generation ADD_EXECUTABLE(dftables dftables.c) GET_TARGET_PROPERTY(DFTABLES_EXE dftables LOCATION) ADD_CUSTOM_COMMAND( COMMENT "Generating character tables (pcre_chartables.c) for current locale" DEPENDS dftables COMMAND ${DFTABLES_EXE} ARGS ${CMAKE_BINARY_DIR}/pcre_chartables.c OUTPUT ${CMAKE_BINARY_DIR}/pcre_chartables.c ) # Source code SET(PCRE_HEADERS ${CMAKE_BINARY_DIR}/pcre.h) SET(PCRE_SOURCES ${CMAKE_BINARY_DIR}/pcre_chartables.c pcre_compile.c pcre_config.c pcre_dfa_exec.c pcre_exec.c pcre_fullinfo.c pcre_get.c pcre_globals.c pcre_info.c pcre_newline.c pcre_maketables.c pcre_ord2utf8.c pcre_refcount.c pcre_study.c pcre_tables.c pcre_try_flipped.c pcre_ucp_searchfuncs.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c ) SET(PCREPOSIX_HEADERS pcreposix.h) SET(PCREPOSIX_SOURCES pcreposix.c) SET(PCRECPP_HEADERS pcrecpp.h pcre_scanner.h ${CMAKE_BINARY_DIR}/pcrecpparg.h ${CMAKE_BINARY_DIR}/pcre_stringpiece.h ) SET(PCRECPP_SOURCES pcrecpp.cc pcre_scanner.cc pcre_stringpiece.cc ) # Build setup ADD_DEFINITIONS(-DHAVE_CONFIG_H) IF(WIN32) ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE) ENDIF(WIN32) SET(CMAKE_INCLUDE_CURRENT_DIR 1) #SET(CMAKE_DEBUG_POSTFIX "d") # Libraries ADD_LIBRARY(pcre ${PCRE_HEADERS} ${PCRE_SOURCES}) ADD_LIBRARY(pcreposix ${PCREPOSIX_HEADERS} ${PCREPOSIX_SOURCES}) TARGET_LINK_LIBRARIES(pcreposix pcre) IF(PCRE_BUILD_PCRECPP) ADD_LIBRARY(pcrecpp ${PCRECPP_HEADERS} ${PCRECPP_SOURCES}) TARGET_LINK_LIBRARIES(pcrecpp pcre) IF(MINGW) SET_TARGET_PROPERTIES(pcrecpp PROPERTIES PREFIX "mingw-") ENDIF(MINGW) ENDIF(PCRE_BUILD_PCRECPP) # Executables ADD_EXECUTABLE(pcretest pcretest.c) TARGET_LINK_LIBRARIES(pcretest pcreposix) ADD_EXECUTABLE(pcregrep pcregrep.c) TARGET_LINK_LIBRARIES(pcregrep pcreposix) IF(PCRE_BUILD_PCRECPP) ADD_EXECUTABLE(pcrecpp_unittest pcrecpp_unittest.cc) TARGET_LINK_LIBRARIES(pcrecpp_unittest pcrecpp) ADD_EXECUTABLE(pcre_scanner_unittest pcre_scanner_unittest.cc) TARGET_LINK_LIBRARIES(pcre_scanner_unittest pcrecpp) ADD_EXECUTABLE(pcre_stringpiece_unittest pcre_stringpiece_unittest.cc) TARGET_LINK_LIBRARIES(pcre_stringpiece_unittest pcrecpp) ENDIF(PCRE_BUILD_PCRECPP) # Testing ENABLE_TESTING() GET_TARGET_PROPERTY(PCREGREP_EXE pcregrep DEBUG_LOCATION) GET_TARGET_PROPERTY(PCRETEST_EXE pcretest DEBUG_LOCATION) # Write out a CTest configuration file that sets some needed environment # variables for the test scripts. # FILE(WRITE ${CMAKE_BINARY_DIR}/CTestCustom.ctest "# This is a generated file. SET(ENV{srcdir} ${CMAKE_SOURCE_DIR}) SET(ENV{pcregrep} ${PCREGREP_EXE}) SET(ENV{pcretest} ${PCRETEST_EXE}) ") IF(UNIX) ADD_TEST(pcre_test ${CMAKE_SOURCE_DIR}/RunTest) ADD_TEST(pcre_grep_test ${CMAKE_SOURCE_DIR}/RunGrepTest) ENDIF(UNIX) IF(WIN32) ADD_TEST(pcre_test cmd /C ${CMAKE_SOURCE_DIR}/RunTest.bat) ENDIF(WIN32) GET_TARGET_PROPERTY(PCRECPP_UNITTEST_EXE pcrecpp_unittest DEBUG_LOCATION) GET_TARGET_PROPERTY(PCRE_SCANNER_UNITTEST_EXE pcre_scanner_unittest DEBUG_LOCATION) GET_TARGET_PROPERTY(PCRE_STRINGPIECE_UNITTEST_EXE pcre_stringpiece_unittest DEBUG_LOCATION) ADD_TEST(pcrecpp_test ${PCRECPP_UNITTEST_EXE}) ADD_TEST(pcre_scanner_test ${PCRE_SCANNER_UNITTEST_EXE}) ADD_TEST(pcre_stringpiece_test ${PCRE_STRINGPIECE_UNITTEST_EXE}) # Installation SET(CMAKE_INSTALL_ALWAYS 1) INSTALL(TARGETS pcre pcreposix pcregrep pcretest RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) INSTALL(FILES ${PCRE_HEADERS} ${PCREPOSIX_HEADERS} DESTINATION include) FILE(GLOB html ${CMAKE_SOURCE_DIR}/doc/html/*.html) FILE(GLOB man1 ${CMAKE_SOURCE_DIR}/doc/*.1) FILE(GLOB man3 ${CMAKE_SOURCE_DIR}/doc/*.3) IF(PCRE_BUILD_PCRECPP) INSTALL(TARGETS pcrecpp RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) INSTALL(FILES ${PCRECPP_HEADERS} DESTINATION include) ELSE(PCRE_BUILD_PCRECPP) # Remove pcrecpp.3 FOREACH(man ${man3}) GET_FILENAME_COMPONENT(man_tmp ${man} NAME) IF(NOT man_tmp STREQUAL "pcrecpp.3") SET(man3_new ${man3} ${man}) ENDIF(NOT man_tmp STREQUAL "pcrecpp.3") ENDFOREACH(man ${man3}) SET(man3 ${man3_new}) ENDIF(PCRE_BUILD_PCRECPP) INSTALL(FILES ${man1} DESTINATION man/man1) INSTALL(FILES ${man3} DESTINATION man/man3) INSTALL(FILES ${html} DESTINATION share/doc/pcre/html) # end CMakeLists.txt syncevolution-1.5/src/synthesis/src/pcre/COPYING0000644000373300037200000000013712424517753023302 0ustar00nightlyallusers00000000000000PCRE LICENCE Please see the file LICENCE in the PCRE distribution for licensing details. End syncevolution-1.5/src/synthesis/src/pcre/ChangeLog0000644000373300037200000041647712424517753024043 0ustar00nightlyallusers00000000000000ChangeLog for PCRE ------------------ Version 7.3 28-Aug-07 --------------------- 1. In the rejigging of the build system that eventually resulted in 7.1, the line "#include " was included in pcre_internal.h. The use of angle brackets there is not right, since it causes compilers to look for an installed pcre.h, not the version that is in the source that is being compiled (which of course may be different). I have changed it back to: #include "pcre.h" I have a vague recollection that the change was concerned with compiling in different directories, but in the new build system, that is taken care of by the VPATH setting the Makefile. 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed when the subject happened to end in the byte 0x85 (e.g. if the last character was \x{1ec5}). *Character* 0x85 is one of the "any" newline characters but of course it shouldn't be taken as a newline when it is part of another character. The bug was that, for an unlimited repeat of . in not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by characters when looking for a newline. 3. A small performance improvement in the DOTALL UTF-8 mode .* case. 4. Debugging: adjusted the names of opcodes for different kinds of parentheses in debug output. 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for long printing in the pcrecpp unittest when running under MinGW. 6. ESC_K was left out of the EBCDIC table. 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing parentheses; I made it 1000, which seemed large enough. Unfortunately, the limit also applies to "virtual nesting" when a pattern is recursive, and in this case 1000 isn't so big. I have been able to remove this limit at the expense of backing off one optimization in certain circumstances. Normally, when pcre_exec() would call its internal match() function recursively and immediately return the result unconditionally, it uses a "tail recursion" feature to save stack. However, when a subpattern that can match an empty string has an unlimited repetition quantifier, it no longer makes this optimization. That gives it a stack frame in which to save the data for checking that an empty string has been matched. Previously this was taken from the 1000-entry workspace that had been reserved. So now there is no explicit limit, but more stack is used. 8. Applied Daniel's patches to solve problems with the import/export magic syntax that is required for Windows, and which was going wrong for the pcreposix and pcrecpp parts of the library. These were overlooked when this problem was solved for the main library. 9. There were some crude static tests to avoid integer overflow when computing the size of patterns that contain repeated groups with explicit upper limits. As the maximum quantifier is 65535, the maximum group length was set at 30,000 so that the product of these two numbers did not overflow a 32-bit integer. However, it turns out that people want to use groups that are longer than 30,000 bytes (though not repeat them that many times). Change 7.0/17 (the refactoring of the way the pattern size is computed) has made it possible to implement the integer overflow checks in a much more dynamic way, which I have now done. The artificial limitation on group length has been removed - we now have only the limit on the total length of the compiled pattern, which depends on the LINK_SIZE setting. 10. Fixed a bug in the documentation for get/copy named substring when duplicate names are permitted. If none of the named substrings are set, the functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an empty string. 11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error, because the ] is interpreted as the first data character and the terminating ] is not found. PCRE has been made compatible with Perl in this regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could cause memory overwriting. 10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty string has been matched (to stop an infinite loop). It was not recognizing a conditional subpattern that could match an empty string if that subpattern was within another subpattern. For example, it looped when trying to match (((?(1)X|))*) but it was OK with ((?(1)X|)*) where the condition was not nested. This bug has been fixed. 12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack past the start of the subject in the presence of bytes with the top bit set, for example "\x8aBCD". 13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE), (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT). 14. Optimized (?!) to (*FAIL). 15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629. This restricts code points to be within the range 0 to 0x10FFFF, excluding the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still does: it's just the validity check that is more restrictive. 16. Inserted checks for integer overflows during escape sequence (backslash) processing, and also fixed erroneous offset values for syntax errors during backslash processing. 17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above) for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80". 18. An unterminated class in a pattern like (?1)\c[ with a "forward reference" caused an overrun. 19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with something other than just ASCII characters) inside a group that had an unlimited repeat caused a loop at compile time (while checking to see whether the group could match an empty string). 20. Debugging a pattern containing \p or \P could cause a crash. For example, [\P{Any}] did so. (Error in the code for printing property names.) 21. An orphan \E inside a character class could cause a crash. 22. A repeated capturing bracket such as (A)? could cause a wild memory reference during compilation. 23. There are several functions in pcre_compile() that scan along a compiled expression for various reasons (e.g. to see if it's fixed length for look behind). There were bugs in these functions when a repeated \p or \P was present in the pattern. These operators have additional parameters compared with \d, etc, and these were not being taken into account when moving along the compiled data. Specifically: (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed length. (b) An item such as \pL+ within a repeated group could cause crashes or loops. (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect "reference to non-existent subpattern" error. (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time. 24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte characters were involved (for example /\S{2}/8g with "A\x{a3}BC"). 25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop. 26. Patterns such as [\P{Yi}A] which include \p or \P and just one other character were causing crashes (broken optimization). 27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing \p or \P) caused a compile-time loop. 28. More problems have arisen in unanchored patterns when CRLF is a valid line break. For example, the unstudied pattern [\r\n]A does not match the string "\r\nA" because change 7.0/46 below moves the current point on by two characters after failing to match at the start. However, the pattern \nA *does* match, because it doesn't start till \n, and if [\r\n]A is studied, the same is true. There doesn't seem any very clean way out of this, but what I have chosen to do makes the common cases work: PCRE now takes note of whether there can be an explicit match for \r or \n anywhere in the pattern, and if so, 7.0/46 no longer applies. As part of this change, there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled pattern has explicit CR or LF references. 29. Added (*CR) etc for changing newline setting at start of pattern. Version 7.2 19-Jun-07 --------------------- 1. If the fr_FR locale cannot be found for test 3, try the "french" locale, which is apparently normally available under Windows. 2. Re-jig the pcregrep tests with different newline settings in an attempt to make them independent of the local environment's newline setting. 3. Add code to configure.ac to remove -g from the CFLAGS default settings. 4. Some of the "internals" tests were previously cut out when the link size was not 2, because the output contained actual offsets. The recent new "Z" feature of pcretest means that these can be cut out, making the tests usable with all link sizes. 5. Implemented Stan Switzer's goto replacement for longjmp() when not using stack recursion. This gives a massive performance boost under BSD, but just a small improvement under Linux. However, it saves one field in the frame in all cases. 6. Added more features from the forthcoming Perl 5.10: (a) (?-n) (where n is a string of digits) is a relative subroutine or recursion call. It refers to the nth most recently opened parentheses. (b) (?+n) is also a relative subroutine call; it refers to the nth next to be opened parentheses. (c) Conditions that refer to capturing parentheses can be specified relatively, for example, (?(-2)... or (?(+3)... (d) \K resets the start of the current match so that everything before is not part of it. (e) \k{name} is synonymous with \k and \k'name' (.NET compatible). (f) \g{name} is another synonym - part of Perl 5.10's unification of reference syntax. (g) (?| introduces a group in which the numbering of parentheses in each alternative starts with the same number. (h) \h, \H, \v, and \V match horizontal and vertical whitespace. 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and PCRE_INFO_JCHANGED. 8. A pattern such as (.*(.)?)* caused pcre_exec() to fail by either not terminating or by crashing. Diagnosed by Viktor Griph; it was in the code for detecting groups that can match an empty string. 9. A pattern with a very large number of alternatives (more than several hundred) was running out of internal workspace during the pre-compile phase, where pcre_compile() figures out how much memory will be needed. A bit of new cunning has reduced the workspace needed for groups with alternatives. The 1000-alternative test pattern now uses 12 bytes of workspace instead of running out of the 4096 that are available. 10. Inserted some missing (unsigned int) casts to get rid of compiler warnings. 11. Applied patch from Google to remove an optimization that didn't quite work. The report of the bug said: pcrecpp::RE("a*").FullMatch("aaa") matches, while pcrecpp::RE("a*?").FullMatch("aaa") does not, and pcrecpp::RE("a*?\\z").FullMatch("aaa") does again. 12. If \p or \P was used in non-UTF-8 mode on a character greater than 127 it matched the wrong number of bytes. Version 7.1 24-Apr-07 --------------------- 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one that is more "standard", making use of automake and other Autotools. There is some re-arrangement of the files and adjustment of comments consequent on this. 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r for recursive directory scanning broke on some systems because the files are not scanned in any specific order and on different systems the order was different. A call to "sort" has been inserted into RunGrepTest for the approprate test as a short-term fix. In the longer term there may be an alternative. 3. I had an email from Eric Raymond about problems translating some of PCRE's man pages to HTML (despite the fact that I distribute HTML pages, some people do their own conversions for various reasons). The problems concerned the use of low-level troff macros .br and .in. I have therefore removed all such uses from the man pages (some were redundant, some could be replaced by .nf/.fi pairs). The 132html script that I use to generate HTML has been updated to handle .nf/.fi and to complain if it encounters .br or .in. 4. Updated comments in configure.ac that get placed in config.h.in and also arranged for config.h to be included in the distribution, with the name config.h.generic, for the benefit of those who have to compile without Autotools (compare pcre.h, which is now distributed as pcre.h.generic). 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan Weber: (1) pcre_internal.h was missing some function renames; (2) updated makevp.bat for the current PCRE, using the additional files makevp_c.txt, makevp_l.txt, and pcregexp.pas. 6. A Windows user reported a minor discrepancy with test 2, which turned out to be caused by a trailing space on an input line that had got lost in his copy. The trailing space was an accident, so I've just removed it. 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told that is needed. 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c) as "const" (a) because they are and (b) because it helps the PHP maintainers who have recently made a script to detect big data structures in the php code that should be moved to the .rodata section. I remembered to update Builducptable as well, so it won't revert if ucptable.h is ever re-created. 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c, pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in order to be able to cut out the UTF-8 tables in the latter when UTF-8 support is not required. This saves 1.5-2K of code, which is important in some applications. Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c so as not to refer to the tables, even though these functions will never be called when UTF-8 support is disabled. Otherwise there are problems with a shared library. 10. Fixed two bugs in the emulated memmove() function in pcre_internal.h: (a) It was defining its arguments as char * instead of void *. (b) It was assuming that all moves were upwards in memory; this was true a long time ago when I wrote it, but is no longer the case. The emulated memove() is provided for those environments that have neither memmove() nor bcopy(). I didn't think anyone used it these days, but that is clearly not the case, as these two bugs were recently reported. 11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt, and Detrail to create the HTML documentation, the .txt form of the man pages, and it removes trailing spaces from listed files. It also creates pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter case, it wraps all the #defines with #ifndefs. This script should be run before "make dist". 12. Fixed two fairly obscure bugs concerned with quantified caseless matching with Unicode property support. (a) For a maximizing quantifier, if the two different cases of the character were of different lengths in their UTF-8 codings (there are some cases like this - I found 11), and the matching function had to back up over a mixture of the two cases, it incorrectly assumed they were both the same length. (b) When PCRE was configured to use the heap rather than the stack for recursion during matching, it was not correctly preserving the data for the other case of a UTF-8 character when checking ahead for a match while processing a minimizing repeat. If the check also involved matching a wide character, but failed, corruption could cause an erroneous result when trying to check for a repeat of the original character. 13. Some tidying changes to the testing mechanism: (a) The RunTest script now detects the internal link size and whether there is UTF-8 and UCP support by running ./pcretest -C instead of relying on values substituted by "configure". (The RunGrepTest script already did this for UTF-8.) The configure.ac script no longer substitutes the relevant variables. (b) The debugging options /B and /D in pcretest show the compiled bytecode with length and offset values. This means that the output is different for different internal link sizes. Test 2 is skipped for link sizes other than 2 because of this, bypassing the problem. Unfortunately, there was also a test in test 3 (the locale tests) that used /B and failed for link sizes other than 2. Rather than cut the whole test out, I have added a new /Z option to pcretest that replaces the length and offset values with spaces. This is now used to make test 3 independent of link size. (Test 2 will be tidied up later.) 14. If erroroffset was passed as NULL to pcre_compile, it provoked a segmentation fault instead of returning the appropriate error message. 15. In multiline mode when the newline sequence was set to "any", the pattern ^$ would give a match between the \r and \n of a subject such as "A\r\nB". This doesn't seem right; it now treats the CRLF combination as the line ending, and so does not match in that case. It's only a pattern such as ^$ that would hit this one: something like ^ABC$ would have failed after \r and then tried again after \r\n. 16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub" in an attempt to make files that differ only in their line terminators compare equal. This works on Linux. 17. Under certain error circumstances pcregrep might try to free random memory as it exited. This is now fixed, thanks to valgrind. 19. In pcretest, if the pattern /(?m)^$/g was matched against the string "abc\r\n\r\n", it found an unwanted second match after the second \r. This was because its rules for how to advance for /g after matching an empty string at the end of a line did not allow for this case. They now check for it specially. 20. pcretest is supposed to handle patterns and data of any length, by extending its buffers when necessary. It was getting this wrong when the buffer for a data line had to be extended. 21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or CRLF as a newline sequence. 22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but I have nevertheless tidied it up. 23. Added some casts to kill warnings from HP-UX ia64 compiler. 24. Added a man page for pcre-config. Version 7.0 19-Dec-06 --------------------- 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by moving to gcc 4.1.1. 2. The -S option for pcretest uses setrlimit(); I had omitted to #include sys/time.h, which is documented as needed for this function. It doesn't seem to matter on Linux, but it showed up on some releases of OS X. 3. It seems that there are systems where bytes whose values are greater than 127 match isprint() in the "C" locale. The "C" locale should be the default when a C program starts up. In most systems, only ASCII printing characters match isprint(). This difference caused the output from pcretest to vary, making some of the tests fail. I have changed pcretest so that: (a) When it is outputting text in the compiled version of a pattern, bytes other than 32-126 are always shown as hex escapes. (b) When it is outputting text that is a matched part of a subject string, it does the same, unless a different locale has been set for the match (using the /L modifier). In this case, it uses isprint() to decide. 4. Fixed a major bug that caused incorrect computation of the amount of memory required for a compiled pattern when options that changed within the pattern affected the logic of the preliminary scan that determines the length. The relevant options are -x, and -i in UTF-8 mode. The result was that the computed length was too small. The symptoms of this bug were either the PCRE error "internal error: code overflow" from pcre_compile(), or a glibc crash with a message such as "pcretest: free(): invalid next size (fast)". Examples of patterns that provoked this bug (shown in pcretest format) are: /(?-x: )/x /(?x)(?-x: \s*#\s*)/ /((?i)[\x{c0}])/8 /(?i:[\x{c0}])/8 HOWEVER: Change 17 below makes this fix obsolete as the memory computation is now done differently. 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++ wrapper classes; (b) implement a new function in the C++ scanner that is more efficient than the old way of doing things because it avoids levels of recursion in the regex matching; (c) add a paragraph to the documentation for the FullMatch() function. 6. The escape sequence \n was being treated as whatever was defined as "newline". Not only was this contrary to the documentation, which states that \n is character 10 (hex 0A), but it also went horribly wrong when "newline" was defined as CRLF. This has been fixed. 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c) was being set to -1 for the "end of line" case (supposedly a value that no character can have). Though this value is never used (the check for end of line is "zero bytes in current character"), it caused compiler complaints. I've changed it to 0xffffffff. 8. In pcre_version.c, the version string was being built by a sequence of C macros that, in the event of PCRE_PRERELEASE being defined as an empty string (as it is for production releases) called a macro with an empty argument. The C standard says the result of this is undefined. The gcc compiler treats it as an empty string (which was what was wanted) but it is reported that Visual C gives an error. The source has been hacked around to avoid this problem. 9. On the advice of a Windows user, included and in Windows builds of pcretest, and changed the call to _setmode() to use _O_BINARY instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all of them did). 10. Originally, pcretest opened its input and output without "b"; then I was told that "b" was needed in some environments, so it was added for release 5.0 to both the input and output. (It makes no difference on Unix-like systems.) Later I was told that it is wrong for the input on Windows. I've now abstracted the modes into two macros, to make it easier to fiddle with them, and removed "b" from the input mode under Windows. 11. Added pkgconfig support for the C++ wrapper library, libpcrecpp. 12. Added -help and --help to pcretest as an official way of being reminded of the options. 13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in and pcrecpp.cc because they annoy compilers at high warning levels. 14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop. 15. Fixed an occurrence of == in configure.ac that should have been = (shell scripts are not C programs :-) and which was not noticed because it works on Linux. 16. pcretest is supposed to handle any length of pattern and data line (as one line or as a continued sequence of lines) by extending its input buffer if necessary. This feature was broken for very long pattern lines, leading to a string of junk being passed to pcre_compile() if the pattern was longer than about 50K. 17. I have done a major re-factoring of the way pcre_compile() computes the amount of memory needed for a compiled pattern. Previously, there was code that made a preliminary scan of the pattern in order to do this. That was OK when PCRE was new, but as the facilities have expanded, it has become harder and harder to keep it in step with the real compile phase, and there have been a number of bugs (see for example, 4 above). I have now found a cunning way of running the real compile function in a "fake" mode that enables it to compute how much memory it would need, while actually only ever using a few hundred bytes of working memory and without too many tests of the mode. This should make future maintenance and development easier. A side effect of this work is that the limit of 200 on the nesting depth of parentheses has been removed (though this was never a serious limitation, I suspect). However, there is a downside: pcre_compile() now runs more slowly than before (30% or more, depending on the pattern). I hope this isn't a big issue. There is no effect on runtime performance. 18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a newline (only possible for the last line of a file) and it was a pattern that set a locale (followed by /Lsomething), pcretest crashed. 19. Added additional timing features to pcretest. (1) The -tm option now times matching only, not compiling. (2) Both -t and -tm can be followed, as a separate command line item, by a number that specifies the number of repeats to use when timing. The default is 50000; this gives better precision, but takes uncomfortably long for very large patterns. 20. Extended pcre_study() to be more clever in cases where a branch of a subpattern has no definite first character. For example, (a*|b*)[cd] would previously give no result from pcre_study(). Now it recognizes that the first character must be a, b, c, or d. 21. There was an incorrect error "recursive call could loop indefinitely" if a subpattern (or the entire pattern) that was being tested for matching an empty string contained only one non-empty item after a nested subpattern. For example, the pattern (?>\x{100}*)\d(?R) provoked this error incorrectly, because the \d was being skipped in the check. 22. The pcretest program now has a new pattern option /B and a command line option -b, which is equivalent to adding /B to every pattern. This causes it to show the compiled bytecode, without the additional information that -d shows. The effect of -d is now the same as -b with -i (and similarly, /D is the same as /B/I). 23. A new optimization is now able automatically to treat some sequences such as a*b as a*+b. More specifically, if something simple (such as a character or a simple class like \d) has an unlimited quantifier, and is followed by something that cannot possibly match the quantified thing, the quantifier is automatically "possessified". 24. A recursive reference to a subpattern whose number was greater than 39 went wrong under certain circumstances in UTF-8 mode. This bug could also have affected the operation of pcre_study(). 25. Realized that a little bit of performance could be had by replacing (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters. 26. Timing data from pcretest is now shown to 4 decimal places instead of 3. 27. Possessive quantifiers such as a++ were previously implemented by turning them into atomic groups such as ($>a+). Now they have their own opcodes, which improves performance. This includes the automatically created ones from 23 above. 28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a lookahead was broken if it was not anchored. PCRE was mistakenly expecting the first matched character to be a colon. This applied both to named and numbered groups. 29. The ucpinternal.h header file was missing its idempotency #ifdef. 30. I was sent a "project" file called libpcre.a.dev which I understand makes building PCRE on Windows easier, so I have included it in the distribution. 31. There is now a check in pcretest against a ridiculously large number being returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G loop, the loop is abandoned. 32. Forward references to subpatterns in conditions such as (?(2)...) where subpattern 2 is defined later cause pcre_compile() to search forwards in the pattern for the relevant set of parentheses. This search went wrong when there were unescaped parentheses in a character class, parentheses escaped with \Q...\E, or parentheses in a #-comment in /x mode. 33. "Subroutine" calls and backreferences were previously restricted to referencing subpatterns earlier in the regex. This restriction has now been removed. 34. Added a number of extra features that are going to be in Perl 5.10. On the whole, these are just syntactic alternatives for features that PCRE had previously implemented using the Python syntax or my own invention. The other formats are all retained for compatibility. (a) Named groups can now be defined as (?...) or (?'name'...) as well as (?P...). The new forms, as well as being in Perl 5.10, are also .NET compatible. (b) A recursion or subroutine call to a named group can now be defined as (?&name) as well as (?P>name). (c) A backreference to a named group can now be defined as \k or \k'name' as well as (?P=name). The new forms, as well as being in Perl 5.10, are also .NET compatible. (d) A conditional reference to a named group can now use the syntax (?() or (?('name') as well as (?(name). (e) A "conditional group" of the form (?(DEFINE)...) can be used to define groups (named and numbered) that are never evaluated inline, but can be called as "subroutines" from elsewhere. In effect, the DEFINE condition is always false. There may be only one alternative in such a group. (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well as the simple (?(R). The condition is true only if the most recent recursion is that of the given number or name. It does not search out through the entire recursion stack. (g) The escape \gN or \g{N} has been added, where N is a positive or negative number, specifying an absolute or relative reference. 35. Tidied to get rid of some further signed/unsigned compiler warnings and some "unreachable code" warnings. 36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other things, this adds five new scripts. 37. Perl ignores orphaned \E escapes completely. PCRE now does the same. There were also incompatibilities regarding the handling of \Q..\E inside character classes, for example with patterns like [\Qa\E-\Qz\E] where the hyphen was adjacent to \Q or \E. I hope I've cleared all this up now. 38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group matches an empty string, and forcibly breaks the loop. There were bugs in this code in non-simple cases. For a pattern such as ^(a()*)* matched against aaaa the result was just "a" rather than "aaaa", for example. Two separate and independent bugs (that affected different cases) have been fixed. 39. Refactored the code to abolish the use of different opcodes for small capturing bracket numbers. This is a tidy that I avoided doing when I removed the limit on the number of capturing brackets for 3.5 back in 2001. The new approach is not only tidier, it makes it possible to reduce the memory needed to fix the previous bug (38). 40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when processing dot, circumflex, or dollar metacharacters, or #-comments in /x mode. 41. Add \R to match any Unicode newline sequence, as suggested in the Unicode report. 42. Applied patch, originally from Ari Pollak, modified by Google, to allow copy construction and assignment in the C++ wrapper. 43. Updated pcregrep to support "--newline=any". In the process, I fixed a couple of bugs that could have given wrong results in the "--newline=crlf" case. 44. Added a number of casts and did some reorganization of signed/unsigned int variables following suggestions from Dair Grant. Also renamed the variable "this" as "item" because it is a C++ keyword. 45. Arranged for dftables to add #include "pcre_internal.h" to pcre_chartables.c because without it, gcc 4.x may remove the array definition from the final binary if PCRE is built into a static library and dead code stripping is activated. 46. For an unanchored pattern, if a match attempt fails at the start of a newline sequence, and the newline setting is CRLF or ANY, and the next two characters are CRLF, advance by two characters instead of one. Version 6.7 04-Jul-06 --------------------- 1. In order to handle tests when input lines are enormously long, pcretest has been re-factored so that it automatically extends its buffers when necessary. The code is crude, but this _is_ just a test program. The default size has been increased from 32K to 50K. 2. The code in pcre_study() was using the value of the re argument before testing it for NULL. (Of course, in any sensible call of the function, it won't be NULL.) 3. The memmove() emulation function in pcre_internal.h, which is used on systems that lack both memmove() and bcopy() - that is, hardly ever - was missing a "static" storage class specifier. 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns containing an extended class (one that cannot be represented by a bitmap because it contains high-valued characters or Unicode property items, e.g. [\pZ]). Almost always one would set UTF-8 mode when processing such a pattern, but PCRE should not loop if you do not (it no longer does). [Detail: two cases were found: (a) a repeated subpattern containing an extended class; (b) a recursive reference to a subpattern that followed a previous extended class. It wasn't skipping over the extended class correctly when UTF-8 mode was not set.] 5. A negated single-character class was not being recognized as fixed-length in lookbehind assertions such as (?<=[^f]), leading to an incorrect compile error "lookbehind assertion is not fixed length". 6. The RunPerlTest auxiliary script was showing an unexpected difference between PCRE and Perl for UTF-8 tests. It turns out that it is hard to write a Perl script that can interpret lines of an input file either as byte characters or as UTF-8, which is what "perltest" was being required to do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you can't do is switch easily at run time between having the "use utf8;" pragma or not. In the end, I fudged it by using the RunPerlTest script to insert "use utf8;" explicitly for the UTF-8 tests. 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at the end of the subject string, contrary to the documentation and to what Perl does. This was true of both matching functions. Now it matches only at the start of the subject and immediately after *internal* newlines. 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing a pointer to an int instead of a pointer to an unsigned long int. This caused problems on 64-bit systems. 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another instance of the 'standard' template library not being so standard". 10. There was no check on the number of named subpatterns nor the maximum length of a subpattern name. The product of these values is used to compute the size of the memory block for a compiled pattern. By supplying a very long subpattern name and a large number of named subpatterns, the size computation could be caused to overflow. This is now prevented by limiting the length of names to 32 characters, and the number of named subpatterns to 10,000. 11. Subpatterns that are repeated with specific counts have to be replicated in the compiled pattern. The size of memory for this was computed from the length of the subpattern and the repeat count. The latter is limited to 65535, but there was no limit on the former, meaning that integer overflow could in principle occur. The compiled length of a repeated subpattern is now limited to 30,000 bytes in order to prevent this. 12. Added the optional facility to have named substrings with the same name. 13. Added the ability to use a named substring as a condition, using the Python syntax: (?(name)yes|no). This overloads (?(R)... and names that are numbers (not recommended). Forward references are permitted. 14. Added forward references in named backreferences (if you see what I mean). 15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the pattern could run off the end of the subject. For example, the pattern "(?s)(.{1,5})"8 did this with the subject "ab". 16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if PCRE_CASELESS was set when matching characters that were quantified with ? or *. 17. A character class other than a single negated character that had a minimum but no maximum quantifier - for example [ab]{6,} - was not handled correctly by pce_dfa_exec(). It would match only one character. 18. A valid (though odd) pattern that looked like a POSIX character class but used an invalid character after [ (for example [[,abc,]]) caused pcre_compile() to give the error "Failed: internal error: code overflow" or in some cases to crash with a glibc free() error. This could even happen if the pattern terminated after [[ but there just happened to be a sequence of letters, a binary zero, and a closing ] in the memory that followed. 19. Perl's treatment of octal escapes in the range \400 to \777 has changed over the years. Originally (before any Unicode support), just the bottom 8 bits were taken. Thus, for example, \500 really meant \100. Nowadays the output from "man perlunicode" includes this: The regular expression compiler produces polymorphic opcodes. That is, the pattern adapts to the data and automatically switches to the Unicode character scheme when presented with Unicode data--or instead uses a traditional byte scheme when presented with byte data. Sadly, a wide octal escape does not cause a switch, and in a string with no other multibyte characters, these octal escapes are treated as before. Thus, in Perl, the pattern /\500/ actually matches \100 but the pattern /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a Unicode string. I have not perpetrated such confusion in PCRE. Up till now, it took just the bottom 8 bits, as in old Perl. I have now made octal escapes with values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they translate to the appropriate multibyte character. 29. Applied some refactoring to reduce the number of warnings from Microsoft and Borland compilers. This has included removing the fudge introduced seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused a warning about an unused variable. 21. PCRE has not included VT (character 0x0b) in the set of whitespace characters since release 4.0, because Perl (from release 5.004) does not. [Or at least, is documented not to: some releases seem to be in conflict with the documentation.] However, when a pattern was studied with pcre_study() and all its branches started with \s, PCRE still included VT as a possible starting character. Of course, this did no harm; it just caused an unnecessary match attempt. 22. Removed a now-redundant internal flag bit that recorded the fact that case dependency changed within the pattern. This was once needed for "required byte" processing, but is no longer used. This recovers a now-scarce options bit. Also moved the least significant internal flag bit to the most- significant bit of the word, which was not previously used (hangover from the days when it was an int rather than a uint) to free up another bit for the future. 23. Added support for CRLF line endings as well as CR and LF. As well as the default being selectable at build time, it can now be changed at runtime via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to specify that it is scanning data with non-default line endings. 24. Changed the definition of CXXLINK to make it agree with the definition of LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS. 25. Applied Ian Taylor's patches to avoid using another stack frame for tail recursions. This makes a big different to stack usage for some patterns. 26. If a subpattern containing a named recursion or subroutine reference such as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of the space required for the compiled pattern went wrong and gave too small a value. Depending on the environment, this could lead to "Failed: internal error: code overflow at offset 49" or "glibc detected double free or corruption" errors. 27. Applied patches from Google (a) to support the new newline modes and (b) to advance over multibyte UTF-8 characters in GlobalReplace. 28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a difference for some implementation of PCRE in some Windows version. 29. Added some extra testing facilities to pcretest: \q in a data line sets the "match limit" value \Q in a data line sets the "match recursion limt" value -S sets the stack size, where is in megabytes The -S option isn't available for Windows. Version 6.6 06-Feb-06 --------------------- 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined in pcreposix.h. I have copied the definition from pcre.h. 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree because pcre.h is no longer a built file. 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are not normally included in the compiled code. Version 6.5 01-Feb-06 --------------------- 1. When using the partial match feature with pcre_dfa_exec(), it was not anchoring the second and subsequent partial matches at the new starting point. This could lead to incorrect results. For example, with the pattern /1234/, partially matching against "123" and then "a4" gave a match. 2. Changes to pcregrep: (a) All non-match returns from pcre_exec() were being treated as failures to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an error message is output. Some extra information is given for the PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are probably the only errors that are likely to be caused by users (by specifying a regex that has nested indefinite repeats, for instance). If there are more than 20 of these errors, pcregrep is abandoned. (b) A binary zero was treated as data while matching, but terminated the output line if it was written out. This has been fixed: binary zeroes are now no different to any other data bytes. (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is used to set a locale for matching. The --locale=xxxx long option has been added (no short equivalent) to specify a locale explicitly on the pcregrep command, overriding the environment variables. (d) When -B was used with -n, some line numbers in the output were one less than they should have been. (e) Added the -o (--only-matching) option. (f) If -A or -C was used with -c (count only), some lines of context were accidentally printed for the final match. (g) Added the -H (--with-filename) option. (h) The combination of options -rh failed to suppress file names for files that were found from directory arguments. (i) Added the -D (--devices) and -d (--directories) options. (j) Added the -F (--fixed-strings) option. (k) Allow "-" to be used as a file name for -f as well as for a data file. (l) Added the --colo(u)r option. (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it is not present by default. 3. A nasty bug was discovered in the handling of recursive patterns, that is, items such as (?R) or (?1), when the recursion could match a number of alternatives. If it matched one of the alternatives, but subsequently, outside the recursion, there was a failure, the code tried to back up into the recursion. However, because of the way PCRE is implemented, this is not possible, and the result was an incorrect result from the match. In order to prevent this happening, the specification of recursion has been changed so that all such subpatterns are automatically treated as atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). 4. I had overlooked the fact that, in some locales, there are characters for which isalpha() is true but neither isupper() nor islower() are true. In the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine and ordfeminine) are like this. This affected the treatment of \w and \W when they appeared in character classes, but not when they appeared outside a character class. The bit map for "word" characters is now created separately from the results of isalnum() instead of just taking it from the upper, lower, and digit maps. (Plus the underscore character, of course.) 5. The above bug also affected the handling of POSIX character classes such as [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's permanent tables. Instead, the bit maps for such a class were previously created as the appropriate unions of the upper, lower, and digit bitmaps. Now they are created by subtraction from the [[:word:]] class, which has its own bitmap. 6. The [[:blank:]] character class matches horizontal, but not vertical space. It is created by subtracting the vertical space characters (\x09, \x0a, \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the subtraction was done in the overall bitmap for a character class, meaning that a class such as [\x0c[:blank:]] was incorrect because \x0c would not be recognized. This bug has been fixed. 7. Patches from the folks at Google: (a) pcrecpp.cc: "to handle a corner case that may or may not happen in real life, but is still worth protecting against". (b) pcrecpp.cc: "corrects a bug when negative radixes are used with regular expressions". (c) pcre_scanner.cc: avoid use of std::count() because not all systems have it. (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by "configure" and the latter not, in order to fix a problem somebody had with compiling the Arg class on HP-UX. (e) Improve the error-handling of the C++ wrapper a little bit. (f) New tests for checking recursion limiting. 8. The pcre_memmove() function, which is used only if the environment does not have a standard memmove() function (and is therefore rarely compiled), contained two bugs: (a) use of int instead of size_t, and (b) it was not returning a result (though PCRE never actually uses the result). 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is returned instead of calling malloc() with an overflowing number that would most likely cause subsequent chaos. 10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag. 11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled with this option is matched, the nmatch and pmatch options of regexec() are ignored. 12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is provided in case anyone wants to the the POSIX interface with UTF-8 strings. 13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the C++ linking (needed for some HP-UX environments). 14. Avoid compiler warnings in get_ucpname() when compiled without UCP support (unused parameter) and in the pcre_printint() function (omitted "default" switch label when the default is to do nothing). 15. Added some code to make it possible, when PCRE is compiled as a C++ library, to replace subject pointers for pcre_exec() with a smart pointer class, thus making it possible to process discontinuous strings. 16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform much the same function. They were added by different people who were trying to make PCRE easy to compile on non-Unix systems. It has been suggested that PCRE_EXPORT be abolished now that there is more automatic apparatus for compiling on Windows systems. I have therefore replaced it with PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it defaults to "extern" for C or "extern C" for C++, which works fine on Unix-like systems. It is now possible to override the value of PCRE_DATA_ SCOPE with something explicit in config.h. In addition: (a) pcreposix.h still had just "extern" instead of either of these macros; I have replaced it with PCRE_DATA_SCOPE. (b) Functions such as _pcre_xclass(), which are internal to the library, but external in the C sense, all had PCRE_EXPORT in their definitions. This is apparently wrong for the Windows case, so I have removed it. (It makes no difference on Unix-like systems.) 17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting of recursive calls to match(). This is different to MATCH_LIMIT because that limits the total number of calls to match(), not all of which increase the depth of recursion. Limiting the recursion depth limits the amount of stack (or heap if NO_RECURSE is set) that is used. The default can be set when PCRE is compiled, and changed at run time. A patch from Google adds this functionality to the C++ interface. 18. Changes to the handling of Unicode character properties: (a) Updated the table to Unicode 4.1.0. (b) Recognize characters that are not in the table as "Cn" (undefined). (c) I revised the way the table is implemented to a much improved format which includes recognition of ranges. It now supports the ranges that are defined in UnicodeData.txt, and it also amalgamates other characters into ranges. This has reduced the number of entries in the table from around 16,000 to around 3,000, thus reducing its size considerably. I realized I did not need to use a tree structure after all - a binary chop search is just as efficient. Having reduced the number of entries, I extended their size from 6 bytes to 8 bytes to allow for more data. (d) Added support for Unicode script names via properties such as \p{Han}. 19. In UTF-8 mode, a backslash followed by a non-Ascii character was not matching that character. 20. When matching a repeated Unicode property with a minimum greater than zero, (for example \pL{2,}), PCRE could look past the end of the subject if it reached it while seeking the minimum number of characters. This could happen only if some of the characters were more than one byte long, because there is a check for at least the minimum number of bytes. 21. Refactored the implementation of \p and \P so as to be more general, to allow for more different types of property in future. This has changed the compiled form incompatibly. Anybody with saved compiled patterns that use \p or \P will have to recompile them. 22. Added "Any" and "L&" to the supported property types. 23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode, but give a compile time error if the value is greater than 0xff. 24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were accidentally not being installed or uninstalled. 25. The pcre.h file was built from pcre.h.in, but the only changes that were made were to insert the current release number. This seemed silly, because it made things harder for people building PCRE on systems that don't run "configure". I have turned pcre.h into a distributed file, no longer built by "configure", with the version identification directly included. There is no longer a pcre.h.in file. However, this change necessitated a change to the pcre-config script as well. It is built from pcre-config.in, and one of the substitutions was the release number. I have updated configure.ac so that ./configure now finds the release number by grepping pcre.h. 26. Added the ability to run the tests under valgrind. Version 6.4 05-Sep-05 --------------------- 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines "--" to be printed when multiple files were scanned, even when none of the -A, -B, or -C options were used. This is not compatible with Gnu grep, so I consider it to be a bug, and have restored the previous behaviour. 2. A couple of code tidies to get rid of compiler warnings. 3. The pcretest program used to cheat by referring to symbols in the library whose names begin with _pcre_. These are internal symbols that are not really supposed to be visible externally, and in some environments it is possible to suppress them. The cheating is now confined to including certain files from the library's source, which is a bit cleaner. 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the file's purpose clearer. 5. Reorganized pcre_ucp_findchar(). Version 6.3 15-Aug-05 --------------------- 1. The file libpcre.pc.in did not have general read permission in the tarball. 2. There were some problems when building without C++ support: (a) If C++ support was not built, "make install" and "make test" still tried to test it. (b) There were problems when the value of CXX was explicitly set. Some changes have been made to try to fix these, and ... (c) --disable-cpp can now be used to explicitly disable C++ support. (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a backslash in a target when C++ was disabled. This confuses some versions of "make", apparently. Using an intermediate variable solves this. (Same for CPP_LOBJ.) 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK) (non-Windows) now includes $(CFLAGS) because these flags are sometimes necessary on certain architectures. 4. Added a setting of -export-symbols-regex to the link command to remove those symbols that are exported in the C sense, but actually are local within the library, and not documented. Their names all begin with "_pcre_". This is not a perfect job, because (a) we have to except some symbols that pcretest ("illegally") uses, and (b) the facility isn't always available (and never for static libraries). I have made a note to try to find a way round (a) in the future. Version 6.2 01-Aug-05 --------------------- 1. There was no test for integer overflow of quantifier values. A construction such as {1111111111111111} would give undefined results. What is worse, if a minimum quantifier for a parenthesized subpattern overflowed and became negative, the calculation of the memory size went wrong. This could have led to memory overwriting. 2. Building PCRE using VPATH was broken. Hopefully it is now fixed. 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like operating environments where this matters. 4. Applied Giuseppe Maxia's patch to add additional features for controlling PCRE options from within the C++ wrapper. 5. Named capturing subpatterns were not being correctly counted when a pattern was compiled. This caused two problems: (a) If there were more than 100 such subpatterns, the calculation of the memory needed for the whole compiled pattern went wrong, leading to an overflow error. (b) Numerical back references of the form \12, where the number was greater than 9, were not recognized as back references, even though there were sufficient previous subpatterns. 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older versions of gcc, e.g. 2.95.4. Version 6.1 21-Jun-05 --------------------- 1. There was one reference to the variable "posix" in pcretest.c that was not surrounded by "#if !defined NOPOSIX". 2. Make it possible to compile pcretest without DFA support, UTF8 support, or the cross-check on the old pcre_info() function, for the benefit of the cut-down version of PCRE that is currently imported into Exim. 3. A (silly) pattern starting with (?i)(?-i) caused an internal space allocation error. I've done the easy fix, which wastes 2 bytes for sensible patterns that start (?i) but I don't think that matters. The use of (?i) is just an example; this all applies to the other options as well. 4. Since libtool seems to echo the compile commands it is issuing, the output from "make" can be reduced a bit by putting "@" in front of each libtool compile command. 5. Patch from the folks at Google for configure.in to be a bit more thorough in checking for a suitable C++ installation before trying to compile the C++ stuff. This should fix a reported problem when a compiler was present, but no suitable headers. 6. The man pages all had just "PCRE" as their title. I have changed them to be the relevant file name. I have also arranged that these names are retained in the file doc/pcre.txt, which is a concatenation in text format of all the man pages except the little individual ones for each function. 7. The NON-UNIX-USE file had not been updated for the different set of source files that come with release 6. I also added a few comments about the C++ wrapper. Version 6.0 07-Jun-05 --------------------- 1. Some minor internal re-organization to help with my DFA experiments. 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that didn't matter for the library itself when fully configured, but did matter when compiling without UCP support, or within Exim, where the ucp files are not imported. 3. Refactoring of the library code to split up the various functions into different source modules. The addition of the new DFA matching code (see below) to a single monolithic source would have made it really too unwieldy, quite apart from causing all the code to be include in a statically linked application, when only some functions are used. This is relevant even without the DFA addition now that patterns can be compiled in one application and matched in another. The downside of splitting up is that there have to be some external functions and data tables that are used internally in different modules of the library but which are not part of the API. These have all had their names changed to start with "_pcre_" so that they are unlikely to clash with other external names. 4. Added an alternate matching function, pcre_dfa_exec(), which matches using a different (DFA) algorithm. Although it is slower than the original function, it does have some advantages for certain types of matching problem. 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(), including restarting after a partial match. 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not defined when compiling for Windows was sent to me. I have put it into the code, though I have no means of testing or verifying it. 7. Added the pcre_refcount() auxiliary function. 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to match before or at the first newline in the subject string. In pcretest, the /f option on a pattern can be used to set this. 9. A repeated \w when used in UTF-8 mode with characters greater than 256 would behave wrongly. This has been present in PCRE since release 4.0. 10. A number of changes to the pcregrep command: (a) Refactored how -x works; insert ^(...)$ instead of setting PCRE_ANCHORED and checking the length, in preparation for adding something similar for -w. (b) Added the -w (match as a word) option. (c) Refactored the way lines are read and buffered so as to have more than one at a time available. (d) Implemented a pcregrep test script. (e) Added the -M (multiline match) option. This allows patterns to match over several lines of the subject. The buffering ensures that at least 8K, or the rest of the document (whichever is the shorter) is available for matching (and similarly the previous 8K for lookbehind assertions). (f) Changed the --help output so that it now says -w, --word-regex(p) instead of two lines, one with "regex" and the other with "regexp" because that confused at least one person since the short forms are the same. (This required a bit of code, as the output is generated automatically from a table. It wasn't just a text change.) (g) -- can be used to terminate pcregrep options if the next thing isn't an option but starts with a hyphen. Could be a pattern or a path name starting with a hyphen, for instance. (h) "-" can be given as a file name to represent stdin. (i) When file names are being printed, "(standard input)" is used for the standard input, for compatibility with GNU grep. Previously "" was used. (j) The option --label=xxx can be used to supply a name to be used for stdin when file names are being printed. There is no short form. (k) Re-factored the options decoding logic because we are going to add two more options that take data. Such options can now be given in four different ways, e.g. "-fname", "-f name", "--file=name", "--file name". (l) Added the -A, -B, and -C options for requesting that lines of context around matches be printed. (m) Added the -L option to print the names of files that do not contain any matching lines, that is, the complement of -l. (n) The return code is 2 if any file cannot be opened, but pcregrep does continue to scan other files. (o) The -s option was incorrectly implemented. For compatibility with other greps, it now suppresses the error message for a non-existent or non- accessible file (but not the return code). There is a new option called -q that suppresses the output of matching lines, which was what -s was previously doing. (p) Added --include and --exclude options to specify files for inclusion and exclusion when recursing. 11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly. Hopefully, it now does. 12. Missing cast in pcre_study(). 13. Added an "uninstall" target to the makefile. 14. Replaced "extern" in the function prototypes in Makefile.in with "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix world, but is set differently for Windows. 15. Added a second compiling function called pcre_compile2(). The only difference is that it has an extra argument, which is a pointer to an integer error code. When there is a compile-time failure, this is set non-zero, in addition to the error test pointer being set to point to an error message. The new argument may be NULL if no error number is required (but then you may as well call pcre_compile(), which is now just a wrapper). This facility is provided because some applications need a numeric error indication, but it has also enabled me to tidy up the way compile-time errors are handled in the POSIX wrapper. 16. Added VPATH=.libs to the makefile; this should help when building with one prefix path and installing with another. (Or so I'm told by someone who knows more about this stuff than I do.) 17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This passes PCRE_DOTALL to the pcre_compile() function, making the "." character match everything, including newlines. This is not POSIX-compatible, but somebody wanted the feature. From pcretest it can be activated by using both the P and the s flags. 18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one. 19. libpcre.pc was being incorrectly installed as executable. 20. A couple of places in pcretest check for end-of-line by looking for '\n'; it now also looks for '\r' so that it will work unmodified on Windows. 21. Added Google's contributed C++ wrapper to the distribution. 22. Added some untidy missing memory free() calls in pcretest, to keep Electric Fence happy when testing. Version 5.0 13-Sep-04 --------------------- 1. Internal change: literal characters are no longer packed up into items containing multiple characters in a single byte-string. Each character is now matched using a separate opcode. However, there may be more than one byte in the character in UTF-8 mode. 2. The pcre_callout_block structure has two new fields: pattern_position and next_item_length. These contain the offset in the pattern to the next match item, and its length, respectively. 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic insertion of callouts before each pattern item. Added the /C option to pcretest to make use of this. 4. On the advice of a Windows user, the lines #if defined(_WIN32) || defined(WIN32) _setmode( _fileno( stdout ), 0x8000 ); #endif /* defined(_WIN32) || defined(WIN32) */ have been added to the source of pcretest. This apparently does useful magic in relation to line terminators. 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" for the benefit of those environments where the "b" makes a difference. 6. The icc compiler has the same options as gcc, but "configure" doesn't seem to know about it. I have put a hack into configure.in that adds in code to set GCC=yes if CC=icc. This seems to end up at a point in the generated configure script that is early enough to affect the setting of compiler options, which is what is needed, but I have no means of testing whether it really works. (The user who reported this had patched the generated configure script, which of course I cannot do.) LATER: After change 22 below (new libtool files), the configure script seems to know about icc (and also ecc). Therefore, I have commented out this hack in configure.in. 7. Added support for pkg-config (2 patches were sent in). 8. Negated POSIX character classes that used a combination of internal tables were completely broken. These were [[:^alpha:]], [[:^alnum:]], and [[:^ascii]]. Typically, they would match almost any characters. The other POSIX classes were not broken in this way. 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed to find the match, as PCRE was deluded into thinking that the match had to start at the start point or following a newline. The same bug applied to patterns with negative forward assertions or any backward assertions preceding ".*" at the start, unless the pattern required a fixed first character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. 10. In UTF-8 mode, when moving forwards in the subject after a failed match starting at the last subject character, bytes beyond the end of the subject string were read. 11. Renamed the variable "class" as "classbits" to make life easier for C++ users. (Previously there was a macro definition, but it apparently wasn't enough.) 12. Added the new field "tables" to the extra data so that tables can be passed in at exec time, or the internal tables can be re-selected. This allows a compiled regex to be saved and re-used at a later time by a different program that might have everything at different addresses. 13. Modified the pcre-config script so that, when run on Solaris, it shows a -R library as well as a -L library. 14. The debugging options of pcretest (-d on the command line or D on a pattern) showed incorrect output for anything following an extended class that contained multibyte characters and which was followed by a quantifier. 15. Added optional support for general category Unicode character properties via the \p, \P, and \X escapes. Unicode property support implies UTF-8 support. It adds about 90K to the size of the library. The meanings of the inbuilt class escapes such as \d and \s have NOT been changed. 16. Updated pcredemo.c to include calls to free() to release the memory for the compiled pattern. 17. The generated file chartables.c was being created in the source directory instead of in the building directory. This caused the build to fail if the source directory was different from the building directory, and was read-only. 18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE file. No doubt somebody will tell me if they don't make sense... Also added Dan Mooney's comments about building on OpenVMS. 19. Added support for partial matching via the PCRE_PARTIAL option for pcre_exec() and the \P data escape in pcretest. 20. Extended pcretest with 3 new pattern features: (i) A pattern option of the form ">rest-of-line" causes pcretest to write the compiled pattern to the file whose name is "rest-of-line". This is a straight binary dump of the data, with the saved pointer to the character tables forced to be NULL. The study data, if any, is written too. After writing, pcretest reads a new pattern. (ii) If, instead of a pattern, ": new target : new target : use native compiler : use native linker : handle Windows platform correctly : ditto : ditto copy DLL to top builddir before testing As part of these changes, -no-undefined was removed again. This was reported to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea in any case. 3. Some tidies to get rid of compiler warnings: . In the match_data structure, match_limit was an unsigned long int, whereas match_call_count was an int. I've made them both unsigned long ints. . In pcretest the fact that a const uschar * doesn't automatically cast to a void * provoked a warning. . Turning on some more compiler warnings threw up some "shadow" variables and a few more missing casts. 4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 option, a class that contained a single character with a value between 128 and 255 (e.g. /[\xFF]/) caused PCRE to crash. 5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 option, a class that contained several characters, but with at least one whose value was between 128 and 255 caused PCRE to crash. Version 4.1 12-Mar-03 --------------------- 1. Compiling with gcc -pedantic found a couple of places where casts were needed, and a string in dftables.c that was longer than standard compilers are required to support. 2. Compiling with Sun's compiler found a few more places where the code could be tidied up in order to avoid warnings. 3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the first of these names is deprecated in the latest Autoconf in favour of the name CC_FOR_BUILD, because "host" is typically used to mean the system on which the compiled code will be run. I can't find a reference for HOST_CFLAGS, but by analogy I have changed it to CFLAGS_FOR_BUILD. 4. Added -no-undefined to the linking command in the Makefile, because this is apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the linking step for the pcreposix library. 5. PCRE was failing to diagnose the case of two named groups with the same name. 6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a literal character that is needed in the subject for a match, and scans along to ensure that it is present before embarking on the full matching process. This saves time in cases of nested unlimited repeats that are never going to match. Problem: the scan can take a lot of time if the subject is very long (e.g. megabytes), thus penalizing straightforward matches. It is now done only if the amount of subject to be scanned is less than 1000 bytes. 7. A lesser problem with the same optimization is that it was recording the first character of an anchored pattern as "needed", thus provoking a search right along the subject, even when the first match of the pattern was going to fail. The "needed" character is now not set for anchored patterns, unless it follows something in the pattern that is of non-fixed length. Thus, it still fulfils its original purpose of finding quick non-matches in cases of nested unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. Version 4.0 17-Feb-03 --------------------- 1. If a comment in an extended regex that started immediately after a meta-item extended to the end of string, PCRE compiled incorrect data. This could lead to all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. 2. Moved to autoconf 2.53 and libtool 1.4.2. 3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, the special perltest8 script is no longer needed - all the tests can be run from a single perltest script. 4. From 5.004, Perl has not included the VT character (0x0b) in the set defined by \s. It has now been removed in PCRE. This means it isn't recognized as whitespace in /x regexes too, which is the same as Perl. Note that the POSIX class [:space:] *does* include VT, thereby creating a mess. 5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only space and tab. 6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use its new features into the main test script, reducing the number of scripts. 7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions were backward compatible, and made the (?i) apply to the whole pattern, as if /i were given. Now it behaves more logically, and applies the option setting only to what follows. PCRE has been changed to follow suit. However, if it finds options settings right at the start of the pattern, it extracts them into the global options, as before. Thus, they show up in the info data. 8. Added support for the \Q...\E escape sequence. Characters in between are treated as literals. This is slightly different from Perl in that $ and @ are also handled as literals inside the quotes. In Perl, they will cause variable interpolation. Note the following examples: Pattern PCRE matches Perl matches \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz \Qabc\$xyz\E abc\$xyz abc\$xyz \Qabc\E\$\Qxyz\E abc$xyz abc$xyz For compatibility with Perl, \Q...\E sequences are recognized inside character classes as well as outside them. 9. Re-organized 3 code statements in pcretest to avoid "overflow in floating-point constant arithmetic" warnings from a Microsoft compiler. Added a (size_t) cast to one statement in pcretest and one in pcreposix to avoid signed/unsigned warnings. 10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o option for pcretest, so I've replaced it by a simple function that does just that job. 11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or "pcregrep -". 12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java package. This provides some syntactic sugar for simple cases of what my documentation calls "once-only subpatterns". A pattern such as x*+ is the same as (?>x*). In other words, if what is inside (?>...) is just a single repeated item, you can use this simplified notation. Note that only makes sense with greedy quantifiers. Consequently, the use of the possessive quantifier forces greediness, whatever the setting of the PCRE_UNGREEDY option. 13. A change of greediness default within a pattern was not taking effect at the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option was abstracted outside. 14. PCRE now supports the \G assertion. It is true when the current matching position is at the start point of the match. This differs from \A when the starting offset is non-zero. Used with the /g option of pcretest (or similar code), it works in the same way as it does for Perl's /g option. If all alternatives of a regex begin with \G, the expression is anchored to the start match position, and the "anchored" flag is set in the compiled expression. 15. Some bugs concerning the handling of certain option changes within patterns have been fixed. These applied to options other than (?ims). For example, "a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have been the other way round. Some of this was related to change 7 above. 16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports POSIX classes only within a class (e.g. /[[:alpha:]]/). 17. Added support for Perl's \C escape. This matches one byte, even in UTF8 mode. Unlike ".", it always matches newline, whatever the setting of PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind assertions. Perl allows it, but it doesn't (in general) work because it can't calculate the length of the lookbehind. At least, that's the case for Perl 5.8.0 - I've been told they are going to document that it doesn't work in future. 18. Added an error diagnosis for escapes that PCRE does not support: these are \L, \l, \N, \P, \p, \U, \u, and \X. 19. Although correctly diagnosing a missing ']' in a character class, PCRE was reading past the end of the pattern in cases such as /[abcd/. 20. PCRE was getting more memory than necessary for patterns with classes that contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. 21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for compiling PCRE for use with Virtual Pascal. 22. Small fix to the Makefile to make it work properly if the build is done outside the source tree. 23. Added a new extension: a condition to go with recursion. If a conditional subpattern starts with (?(R) the "true" branch is used if recursion has happened, whereas the "false" branch is used only at the top level. 24. When there was a very long string of literal characters (over 255 bytes without UTF support, over 250 bytes with UTF support), the computation of how much memory was required could be incorrect, leading to segfaults or other strange effects. 25. PCRE was incorrectly assuming anchoring (either to start of subject or to start of line for a non-DOTALL pattern) when a pattern started with (.*) and there was a subsequent back reference to those brackets. This meant that, for example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't possible to check for precisely this case. All we can do is abandon the optimization if .* occurs inside capturing brackets when there are any back references whatsoever. (See below for a better fix that came later.) 26. The handling of the optimization for finding the first character of a non-anchored pattern, and for finding a character that is required later in the match were failing in some cases. This didn't break the matching; it just failed to optimize when it could. The way this is done has been re-implemented. 27. Fixed typo in error message for invalid (?R item (it said "(?p"). 28. Added a new feature that provides some of the functionality that Perl provides with (?{...}). The facility is termed a "callout". The way it is done in PCRE is for the caller to provide an optional function, by setting pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a global variable. By default it is unset, which disables all calling out. To get the function called, the regex must include (?C) at appropriate points. This is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). This provides a means of identifying different callout points. When PCRE reaches such a point in the regex, if pcre_callout has been set, the external function is called. It is provided with data in a structure called pcre_callout_block, which is defined in pcre.h. If the function returns 0, matching continues; if it returns a non-zero value, the match at the current point fails. However, backtracking will occur if possible. [This was changed later and other features added - see item 49 below.] 29. pcretest is upgraded to test the callout functionality. It provides a callout function that displays information. By default, it shows the start of the match and the current position in the text. There are some new data escapes to vary what happens: \C+ in addition, show current contents of captured substrings \C- do not supply a callout function \C!n return 1 when callout number n is reached \C!n!m return 1 when callout number n is reached for the mth time 30. If pcregrep was called with the -l option and just a single file name, it output "" if a match was found, instead of the file name. 31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to pcre_exec(). This saves a malloc/free per call. The default value of POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold when configuring. 32. The default maximum size of a compiled pattern is 64K. There have been a few cases of people hitting this limit. The code now uses macros to handle the storing of links as offsets within the compiled pattern. It defaults to 2-byte links, but this can be changed to 3 or 4 bytes by --with-link-size when configuring. Tests 2 and 5 work only with 2-byte links because they output debugging information about compiled patterns. 33. Internal code re-arrangements: (a) Moved the debugging function for printing out a compiled regex into its own source file (printint.c) and used #include to pull it into pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two separate copies. (b) Defined the list of op-code names for debugging as a macro in internal.h so that it is next to the definition of the opcodes. (c) Defined a table of op-code lengths for simpler skipping along compiled code. This is again a macro in internal.h so that it is next to the definition of the opcodes. 34. Added support for recursive calls to individual subpatterns, along the lines of Robin Houston's patch (but implemented somewhat differently). 35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to allow it to read and process whole directories in Win32. This code was contributed by Lionel Fourquaux; it has not been tested by me. 36. Added support for named subpatterns. The Python syntax (?P...) is used to name a group. Names consist of alphanumerics and underscores, and must be unique. Back references use the syntax (?P=name) and recursive calls use (?P>name) which is a PCRE extension to the Python extension. Groups still have numbers. The function pcre_fullinfo() can be used after compilation to extract a name/number map. There are three relevant calls: PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map PCRE_INFO_NAMECOUNT yields the number of entries PCRE_INFO_NAMETABLE yields a pointer to the map. The map is a vector of fixed-size entries. The size of each entry depends on the length of the longest name used. The first two bytes of each entry are the group number, most significant byte first. There follows the corresponding name, zero terminated. The names are in alphabetical order. 37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 case instead of 255. Making it the same both with and without UTF-8 support means that the same test output works with both. 38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid calling malloc() with a zero argument. 39. Change 25 above had to resort to a heavy-handed test for the .* anchoring optimization. I've improved things by keeping a bitmap of backreferences with numbers 1-31 so that if .* occurs inside capturing brackets that are not in fact referenced, the optimization can be applied. It is unlikely that a relevant occurrence of .* (i.e. one which might indicate anchoring or forcing the match to follow \n) will appear inside brackets with a number greater than 31, but if it does, any back reference > 31 suppresses the optimization. 40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect of disabling numbered capturing parentheses. Any opening parenthesis that is not followed by ? behaves as if it were followed by ?: but named parentheses can still be used for capturing (and they will acquire numbers in the usual way). 41. Redesigned the return codes from the match() function into yes/no/error so that errors can be passed back from deep inside the nested calls. A malloc failure while inside a recursive subpattern call now causes the PCRE_ERROR_NOMEMORY return instead of quietly going wrong. 42. It is now possible to set a limit on the number of times the match() function is called in a call to pcre_exec(). This facility makes it possible to limit the amount of recursion and backtracking, though not in a directly obvious way, because the match() function is used in a number of different circumstances. The count starts from zero for each position in the subject string (for non-anchored patterns). The default limit is, for compatibility, a large number, namely 10 000 000. You can change this in two ways: (a) When configuring PCRE before making, you can use --with-match-limit=n to set a default value for the compiled library. (b) For each call to pcre_exec(), you can pass a pcre_extra block in which a different value is set. See 45 below. If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. 43. Added a new function pcre_config(int, void *) to enable run-time extraction of things that can be changed at compile time. The first argument specifies what is wanted and the second points to where the information is to be placed. The current list of available information is: PCRE_CONFIG_UTF8 The output is an integer that is set to one if UTF-8 support is available; otherwise it is set to zero. PCRE_CONFIG_NEWLINE The output is an integer that it set to the value of the code that is used for newline. It is either LF (10) or CR (13). PCRE_CONFIG_LINK_SIZE The output is an integer that contains the number of bytes used for internal linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. PCRE_CONFIG_POSIX_MALLOC_THRESHOLD The output is an integer that contains the threshold above which the POSIX interface uses malloc() for output vectors. See item 31 above. PCRE_CONFIG_MATCH_LIMIT The output is an unsigned integer that contains the default limit of the number of match() calls in a pcre_exec() execution. See 42 above. 44. pcretest has been upgraded by the addition of the -C option. This causes it to extract all the available output from the new pcre_config() function, and to output it. The program then exits immediately. 45. A need has arisen to pass over additional data with calls to pcre_exec() in order to support additional features. One way would have been to define pcre_exec2() (for example) with extra arguments, but this would not have been extensible, and would also have required all calls to the original function to be mapped to the new one. Instead, I have chosen to extend the mechanism that is used for passing in "extra" data from pcre_study(). The pcre_extra structure is now exposed and defined in pcre.h. It currently contains the following fields: flags a bitmap indicating which of the following fields are set study_data opaque data from pcre_study() match_limit a way of specifying a limit on match() calls for a specific call to pcre_exec() callout_data data for callouts (see 49 below) The flag bits are also defined in pcre.h, and are PCRE_EXTRA_STUDY_DATA PCRE_EXTRA_MATCH_LIMIT PCRE_EXTRA_CALLOUT_DATA The pcre_study() function now returns one of these new pcre_extra blocks, with the actual study data pointed to by the study_data field, and the PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as before. That is, this change is entirely upwards-compatible and requires no change to existing code. If you want to pass in additional data to pcre_exec(), you can either place it in a pcre_extra block provided by pcre_study(), or create your own pcre_extra block. 46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a data string contains the escape sequence \M, pcretest calls pcre_exec() several times with different match limits, until it finds the minimum value needed for pcre_exec() to complete. The value is then output. This can be instructive; for most simple matches the number is quite small, but for pathological cases it gets very large very quickly. 47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It returns the size of the data block pointed to by the study_data field in a pcre_extra block, that is, the value that was passed as the argument to pcre_malloc() when PCRE was getting memory in which to place the information created by pcre_study(). The fourth argument should point to a size_t variable. pcretest has been extended so that this information is shown after a successful pcre_study() call when information about the compiled regex is being displayed. 48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) because what follows is always an absolute path. (Later: it turns out that this is more than cosmetic for MinGW, because it doesn't like empty path components.) 49. Some changes have been made to the callout feature (see 28 above): (i) A callout function now has three choices for what it returns: 0 => success, carry on matching > 0 => failure at this point, but backtrack if possible < 0 => serious error, return this value from pcre_exec() Negative values should normally be chosen from the set of PCRE_ERROR_xxx values. In particular, returning PCRE_ERROR_NOMATCH forces a standard "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions. It will never be used by PCRE itself. (ii) The pcre_extra structure (see 45 above) has a void * field called callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The pcre_callout_block structure has a field of the same name. The contents of the field passed in the pcre_extra structure are passed to the callout function in the corresponding field in the callout block. This makes it easier to use the same callout-containing regex from multiple threads. For testing, the pcretest program has a new data escape \C*n pass the number n (may be negative) as callout_data If the callout function in pcretest receives a non-zero value as callout_data, it returns that value. 50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, there were some redundant $(CFLAGS) in commands that are now specified as $(LINK), which already includes $(CFLAGS). 51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE has been compiled with UTF-8 support *and* pcre_compile() has been compiled with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume one-byte characters throughout. Note that case-insensitive matching applies only to characters whose values are less than 256. PCRE doesn't support the notion of cases for higher-valued characters. (i) A character class whose characters are all within 0-255 is handled as a bit map, and the map is inverted for negative classes. Previously, a character > 255 always failed to match such a class; however it should match if the class was a negative one (e.g. [^ab]). This has been fixed. (ii) A negated character class with a single character < 255 is coded as "not this character" (OP_NOT). This wasn't working properly when the test character was multibyte, either singly or repeated. (iii) Repeats of multibyte characters are now handled correctly in UTF-8 mode, for example: \x{100}{2,3}. (iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either singly or repeated) now correctly test multibyte characters. However, PCRE doesn't recognize any characters with values greater than 255 as digits, spaces, or word characters. Such characters always match \D, \S, and \W, and never match \d, \s, or \w. (v) Classes may now contain characters and character ranges with values greater than 255. For example: [ab\x{100}-\x{400}]. (vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call PCRE in UTF-8 mode. 52. The info request value PCRE_INFO_FIRSTCHAR has been renamed PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is retained for backwards compatibility. (Note that LASTLITERAL is also a byte value.) 53. The single man page has become too large. I have therefore split it up into a number of separate man pages. These also give rise to individual HTML pages; these are now put in a separate directory, and there is an index.html page that lists them all. Some hyperlinking between the pages has been installed. 54. Added convenience functions for handling named capturing parentheses. 55. Unknown escapes inside character classes (e.g. [\M]) and escapes that aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also true in PCRE, except when the PCRE_EXTENDED option is set, in which case they are faulted. 56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when calling configure. These values are used when compiling the dftables.c program which is run to generate the source of the default character tables. They default to the values of CC and CFLAGS. If you are cross-compiling PCRE, you will need to set these values. 57. Updated the building process for Windows DLL, as provided by Fred Cox. Version 3.9 02-Jan-02 --------------------- 1. A bit of extraneous text had somehow crept into the pcregrep documentation. 2. If --disable-static was given, the building process failed when trying to build pcretest and pcregrep. (For some reason it was using libtool to compile them, which is not right, as they aren't part of the library.) Version 3.8 18-Dec-01 --------------------- 1. The experimental UTF-8 code was completely screwed up. It was packing the bytes in the wrong order. How dumb can you get? Version 3.7 29-Oct-01 --------------------- 1. In updating pcretest to check change 1 of version 3.6, I screwed up. This caused pcretest, when used on the test data, to segfault. Unfortunately, this didn't happen under Solaris 8, where I normally test things. 2. The Makefile had to be changed to make it work on BSD systems, where 'make' doesn't seem to recognize that ./xxx and xxx are the same file. (This entry isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made this fix an hour or so after the initial 3.7 release.) Version 3.6 23-Oct-01 --------------------- 1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if offsets passed as NULL with zero offset count. 2. The config.guess and config.sub files had not been updated when I moved to the latest autoconf. Version 3.5 15-Aug-01 --------------------- 1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that had been forgotten. 2. By using declared but undefined structures, we can avoid using "void" definitions in pcre.h while keeping the internal definitions of the structures private. 3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a user point of view, this means that both static and shared libraries are built by default, but this can be individually controlled. More of the work of handling this static/shared cases is now inside libtool instead of PCRE's make file. 4. The pcretest utility is now installed along with pcregrep because it is useful for users (to test regexs) and by doing this, it automatically gets relinked by libtool. The documentation has been turned into a man page, so there are now .1, .txt, and .html versions in /doc. 5. Upgrades to pcregrep: (i) Added long-form option names like gnu grep. (ii) Added --help to list all options with an explanatory phrase. (iii) Added -r, --recursive to recurse into sub-directories. (iv) Added -f, --file to read patterns from a file. 6. pcre_exec() was referring to its "code" argument before testing that argument for NULL (and giving an error if it was NULL). 7. Upgraded Makefile.in to allow for compiling in a different directory from the source directory. 8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the options bits, the pointer it was passed was to an int instead of to an unsigned long int. This mattered only on 64-bit systems. 9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is generated) instead of pcre.in, which it its source. Also made the same change in several of the .c files. 10. A new release of gcc defines printf() as a macro, which broke pcretest because it had an ifdef in the middle of a string argument for printf(). Fixed by using separate calls to printf(). 11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure script, to force use of CR or LF instead of \n in the source. On non-Unix systems, the value can be set in config.h. 12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an absolute limit. Changed the text of the error message to make this clear, and likewise updated the man page. 13. The limit of 99 on the number of capturing subpatterns has been removed. The new limit is 65535, which I hope will not be a "real" limit. Version 3.4 22-Aug-00 --------------------- 1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. 2. Diagnose condition (?(0) as an error instead of crashing on matching. Version 3.3 01-Aug-00 --------------------- 1. If an octal character was given, but the value was greater than \377, it was not getting masked to the least significant bits, as documented. This could lead to crashes in some systems. 2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. 3. Added the functions pcre_free_substring() and pcre_free_substring_list(). These just pass their arguments on to (pcre_free)(), but they are provided because some uses of PCRE bind it to non-C systems that can call its functions, but cannot call free() or pcre_free() directly. 4. Add "make test" as a synonym for "make check". Corrected some comments in the Makefile. 5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the Makefile. 6. Changed the name of pgrep to pcregrep, because Solaris has introduced a command called pgrep for grepping around the active processes. 7. Added the beginnings of support for UTF-8 character strings. 8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and RANLIB to ./ltconfig so that they are used by libtool. I think these are all the relevant ones. (AR is not passed because ./ltconfig does its own figuring out for the ar command.) Version 3.2 12-May-00 --------------------- This is purely a bug fixing release. 1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead of ZA. This was just one example of several cases that could provoke this bug, which was introduced by change 9 of version 2.00. The code for breaking infinite loops after an iteration that matches an empty string was't working correctly. 2. The pcretest program was not imitating Perl correctly for the pattern /a*/g when matched against abbab (for example). After matching an empty string, it wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this caused it to match further down the string than it should. 3. The code contained an inclusion of sys/types.h. It isn't clear why this was there because it doesn't seem to be needed, and it causes trouble on some systems, as it is not a Standard C header. It has been removed. 4. Made 4 silly changes to the source to avoid stupid compiler warnings that were reported on the Macintosh. The changes were from while ((c = *(++ptr)) != 0 && c != '\n'); to while ((c = *(++ptr)) != 0 && c != '\n') ; Totally extraordinary, but if that's what it takes... 5. PCRE is being used in one environment where neither memmove() nor bcopy() is available. Added HAVE_BCOPY and an autoconf test for it; if neither HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which assumes the way PCRE uses memmove() (always moving upwards). 6. PCRE is being used in one environment where strchr() is not available. There was only one use in pcre.c, and writing it out to avoid strchr() probably gives faster code anyway. Version 3.1 09-Feb-00 --------------------- The only change in this release is the fixing of some bugs in Makefile.in for the "install" target: (1) It was failing to install pcreposix.h. (2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. Version 3.0 01-Feb-00 --------------------- 1. Add support for the /+ modifier to perltest (to output $` like it does in pcretest). 2. Add support for the /g modifier to perltest. 3. Fix pcretest so that it behaves even more like Perl for /g when the pattern matches null strings. 4. Fix perltest so that it doesn't do unwanted things when fed an empty pattern. Perl treats empty patterns specially - it reuses the most recent pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this effect. 5. The POSIX interface was broken in that it was just handing over the POSIX captured string vector to pcre_exec(), but (since release 2.00) PCRE has required a bigger vector, with some working space on the end. This means that the POSIX wrapper now has to get and free some memory, and copy the results. 6. Added some simple autoconf support, placing the test data and the documentation in separate directories, re-organizing some of the information files, and making it build pcre-config (a GNU standard). Also added libtool support for building PCRE as a shared library, which is now the default. 7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and 09 are not valid octal constants. Single digits will be used for minor values less than 10. 8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that existing programs that set these in the POSIX interface can use PCRE without modification. 9. Added a new function, pcre_fullinfo() with an extensible interface. It can return all that pcre_info() returns, plus additional data. The pcre_info() function is retained for compatibility, but is considered to be obsolete. 10. Added experimental recursion feature (?R) to handle one common case that Perl 5.6 will be able to do with (?p{...}). 11. Added support for POSIX character classes like [:alpha:], which Perl is adopting. Version 2.08 31-Aug-99 ---------------------- 1. When startoffset was not zero and the pattern began with ".*", PCRE was not trying to match at the startoffset position, but instead was moving forward to the next newline as if a previous match had failed. 2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, and could get into a loop if a null string was matched other than at the start of the subject. 3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can be distinguished at compile time, and for completeness also added PCRE_DATE. 5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL in GnuWin32 environments. Version 2.07 29-Jul-99 ---------------------- 1. The documentation is now supplied in plain text form and HTML as well as in the form of man page sources. 2. C++ compilers don't like assigning (void *) values to other pointer types. In particular this affects malloc(). Although there is no problem in Standard C, I've put in casts to keep C++ compilers happy. 3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call should be (const char *). 4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may be useful for non-Unix systems who don't want to bother with the POSIX stuff. However, I haven't made this a standard facility. The documentation doesn't mention it, and the Makefile doesn't support it. 5. The Makefile now contains an "install" target, with editable destinations at the top of the file. The pcretest program is not installed. 6. pgrep -V now gives the PCRE version number and date. 7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was causing the entire string to be ignored, instead of just the last character. 8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a non-matching string, it can take a very, very long time, even for strings of quite modest length, because of the nested recursion. PCRE now does better in some of these cases. It does this by remembering the last required literal character in the pattern, and pre-searching the subject to ensure it is present before running the real match. In other words, it applies a heuristic to detect some types of certain failure quickly, and in the above example, if presented with a string that has no trailing " it gives "no match" very quickly. 9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; other alternatives are tried instead. Version 2.06 09-Jun-99 ---------------------- 1. Change pcretest's output for amount of store used to show just the code space, because the remainder (the data block) varies in size between 32-bit and 64-bit systems. 2. Added an extra argument to pcre_exec() to supply an offset in the subject to start matching at. This allows lookbehinds to work when searching for multiple occurrences in a string. 3. Added additional options to pcretest for testing multiple occurrences: /+ outputs the rest of the string that follows a match /g loops for multiple occurrences, using the new startoffset argument /G loops for multiple occurrences by passing an incremented pointer 4. PCRE wasn't doing the "first character" optimization for patterns starting with \b or \B, though it was doing it for other lookbehind assertions. That is, it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with the letter 'x'. On long subject strings, this gives a significant speed-up. Version 2.05 21-Apr-99 ---------------------- 1. Changed the type of magic_number from int to long int so that it works properly on 16-bit systems. 2. Fixed a bug which caused patterns starting with .* not to work correctly when the subject string contained newline characters. PCRE was assuming anchoring for such patterns in all cases, which is not correct because .* will not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if DOTALL is set at top level; otherwise it knows that patterns starting with .* must be retried after every newline in the subject. Version 2.04 18-Feb-99 ---------------------- 1. For parenthesized subpatterns with repeats whose minimum was zero, the computation of the store needed to hold the pattern was incorrect (too large). If such patterns were nested a few deep, this could multiply and become a real problem. 2. Added /M option to pcretest to show the memory requirement of a specific pattern. Made -m a synonym of -s (which does this globally) for compatibility. 3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being compiled in such a way that the backtracking after subsequent failure was pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of ((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. Version 2.03 02-Feb-99 ---------------------- 1. Fixed typo and small mistake in man page. 2. Added 4th condition (GPL supersedes if conflict) and created separate LICENCE file containing the conditions. 3. Updated pcretest so that patterns such as /abc\/def/ work like they do in Perl, that is the internal \ allows the delimiter to be included in the pattern. Locked out the use of \ as a delimiter. If \ immediately follows the final delimiter, add \ to the end of the pattern (to test the error). 4. Added the convenience functions for extracting substrings after a successful match. Updated pcretest to make it able to test these functions. Version 2.02 14-Jan-99 ---------------------- 1. Initialized the working variables associated with each extraction so that their saving and restoring doesn't refer to uninitialized store. 2. Put dummy code into study.c in order to trick the optimizer of the IBM C compiler for OS/2 into generating correct code. Apparently IBM isn't going to fix the problem. 3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution calls, and wasn't printing the correct value for compiling calls. Increased the default value of LOOPREPEAT, and the number of significant figures in the times. 4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. 5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid a building problem on Windows NT with a FAT file system. Version 2.01 21-Oct-98 ---------------------- 1. Changed the API for pcre_compile() to allow for the provision of a pointer to character tables built by pcre_maketables() in the current locale. If NULL is passed, the default tables are used. Version 2.00 24-Sep-98 ---------------------- 1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable it any more. 2. Allow quantification of (?>) groups, and make it work correctly. 3. The first character computation wasn't working for (?>) groups. 4. Correct the implementation of \Z (it is permitted to match on the \n at the end of the subject) and add 5.005's \z, which really does match only at the very end of the subject. 5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. 6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 localized options. All options to pcre_study() were also removed. 7. Add other new features from 5.005: $(?<= positive lookbehind $(?a*))*/ (a PCRE_EXTRA facility). Version 1.00 18-Nov-97 ---------------------- 1. Added compile-time macros to support systems such as SunOS4 which don't have memmove() or strerror() but have other things that can be used instead. 2. Arranged that "make clean" removes the executables. Version 0.99 27-Oct-97 ---------------------- 1. Fixed bug in code for optimizing classes with only one character. It was initializing a 32-byte map regardless, which could cause it to run off the end of the memory it had got. 2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. Version 0.98 22-Oct-97 ---------------------- 1. Fixed bug in code for handling temporary memory usage when there are more back references than supplied space in the ovector. This could cause segfaults. Version 0.97 21-Oct-97 ---------------------- 1. Added the \X "cut" facility, conditional on PCRE_EXTRA. 2. Optimized negated single characters not to use a bit map. 3. Brought error texts together as macro definitions; clarified some of them; fixed one that was wrong - it said "range out of order" when it meant "invalid escape sequence". 4. Changed some char * arguments to const char *. 5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). 6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in pcretest. Version 0.96 16-Oct-97 ---------------------- 1. Added a simple "pgrep" utility to the distribution. 2. Fixed an incompatibility with Perl: "{" is now treated as a normal character unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" where "ddd" means "one or more decimal digits". 3. Fixed serious bug. If a pattern had a back reference, but the call to pcre_exec() didn't supply a large enough ovector to record the related identifying subpattern, the match always failed. PCRE now remembers the number of the largest back reference, and gets some temporary memory in which to save the offsets during matching if necessary, in order to ensure that backreferences always work. 4. Increased the compatibility with Perl in a number of ways: (a) . no longer matches \n by default; an option PCRE_DOTALL is provided to request this handling. The option can be set at compile or exec time. (b) $ matches before a terminating newline by default; an option PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline mode). The option can be set at compile or exec time. (c) The handling of \ followed by a digit other than 0 is now supposed to be the same as Perl's. If the decimal number it represents is less than 10 or there aren't that many previous left capturing parentheses, an octal escape is read. Inside a character class, it's always an octal escape, even if it is a single digit. (d) An escaped but undefined alphabetic character is taken as a literal, unless PCRE_EXTRA is set. Currently this just reserves the remaining escapes. (e) {0} is now permitted. (The previous item is removed from the compiled pattern). 5. Changed all the names of code files so that the basic parts are no longer than 10 characters, and abolished the teeny "globals.c" file. 6. Changed the handling of character classes; they are now done with a 32-byte bit map always. 7. Added the -d and /D options to pcretest to make it possible to look at the internals of compilation without having to recompile pcre. Version 0.95 23-Sep-97 ---------------------- 1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or \x20 at the start of a run of normal characters. These were being treated as real characters, instead of the source characters being re-checked. Version 0.94 18-Sep-97 ---------------------- 1. The functions are now thread-safe, with the caveat that the global variables containing pointers to malloc() and free() or alternative functions are the same for all threads. 2. Get pcre_study() to generate a bitmap of initial characters for non- anchored patterns when this is possible, and use it if passed to pcre_exec(). Version 0.93 15-Sep-97 ---------------------- 1. /(b)|(:+)/ was computing an incorrect first character. 2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), but not actually doing anything yet. 3. Treat "-" characters in classes that cannot be part of ranges as literals, as Perl does (e.g. [-az] or [az-]). 4. Set the anchored flag if a branch starts with .* or .*? because that tests all possible positions. 5. Split up into different modules to avoid including unneeded functions in a compiled binary. However, compile and exec are still in one module. The "study" function is split off. 6. The character tables are now in a separate module whose source is generated by an auxiliary program - but can then be edited by hand if required. There are now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or toupper() in the code. 7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and make them global. Abolish the function for setting them, as the caller can now set them directly. Version 0.92 11-Sep-97 ---------------------- 1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character (e.g. /a{1,3}/) was broken (I mis-optimized it). 2. Caseless matching was not working in character classes if the characters in the pattern were in upper case. 3. Make ranges like [W-c] work in the same way as Perl for caseless matching. 4. Make PCRE_ANCHORED public and accept as a compile option. 5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to pass them. 6. Give an error if bad option bits passed at compile or run time. 7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to pcretest to cause it to pass that flag. 8. Add pcre_info(), to get the number of identifying subpatterns, the stored options, and the first character, if set. 9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. Version 0.91 10-Sep-97 ---------------------- 1. PCRE was failing to diagnose unlimited repeats of subpatterns that could match the empty string as in /(a*)*/. It was looping and ultimately crashing. 2. PCRE was looping on encountering an indefinitely repeated back reference to a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what Perl does - treats the match as successful. **** syncevolution-1.5/src/synthesis/src/pcre/CleanTxt0000644000373300037200000000557512424517753023727 0ustar00nightlyallusers00000000000000#! /usr/bin/perl -w # Script to take the output of nroff -man and remove all the backspacing and # the page footers and the screen commands etc so that it is more usefully # readable online. In fact, in the latest nroff, intermediate footers don't # seem to be generated any more. $blankcount = 0; $lastwascut = 0; $firstheader = 1; # Input on STDIN; output to STDOUT. while () { s/\x1b\[\d+m//g; # Remove screen controls "ESC [ number m" s/.\x8//g; # Remove "char, backspace" # Handle header lines. Retain only the first one we encounter, but remove # the blank line that follows. Any others (e.g. at end of document) and the # following blank line are dropped. if (/^PCRE(\w*)\(([13])\)\s+PCRE\1\(\2\)$/) { if ($firstheader) { $firstheader = 0; print; $lastprinted = $_; $lastwascut = 0; } $_=; # Remove a blank that follows next; } # Count runs of empty lines if (/^\s*$/) { $blankcount++; $lastwascut = 0; next; } # If a chunk of lines has been cut out (page footer) and the next line # has a different indentation, put back one blank line. if ($lastwascut && $blankcount < 1 && defined($lastprinted)) { ($a) = $lastprinted =~ /^(\s*)/; ($b) = $_ =~ /^(\s*)/; $blankcount++ if ($a ne $b); } # We get here only when we have a non-blank line in hand. If it was preceded # by 3 or more blank lines, read the next 3 lines and see if they are blank. # If so, remove all 7 lines, and remember that we have just done a cut. if ($blankcount >= 3) { for ($i = 0; $i < 3; $i++) { $next[$i] = ; $next[$i] = "" if !defined $next[$i]; $next[$i] =~ s/\x1b\[\d+m//g; # Remove screen controls "ESC [ number m" $next[$i] =~ s/.\x8//g; # Remove "char, backspace" } # Cut out chunks of the form <3 blanks><3 blanks> if ($next[0] =~ /^\s*$/ && $next[1] =~ /^\s*$/ && $next[2] =~ /^\s*$/) { $blankcount -= 3; $lastwascut = 1; } # Otherwise output the saved blanks, the current, and the next three # lines. Remember the last printed line. else { for ($i = 0; $i < $blankcount; $i++) { print "\n"; } print; for ($i = 0; $i < 3; $i++) { $next[$i] =~ s/.\x8//g; print $next[$i]; $lastprinted = $_; } $lastwascut = 0; $blankcount = 0; } } # This non-blank line is not preceded by 3 or more blank lines. Output # any blanks there are, and the line. Remember it. Force two blank lines # before headings. else { $blankcount = 2 if /^\S/ && !/^Last updated/ && !/^Copyright/ && defined($lastprinted); for ($i = 0; $i < $blankcount; $i++) { print "\n"; } print; $lastprinted = $_; $lastwascut = 0; $blankcount = 0; } } # End syncevolution-1.5/src/synthesis/src/pcre/Detrail0000644000373300037200000000120312424517753023551 0ustar00nightlyallusers00000000000000#!/usr/bin/perl # This is a script for removing trailing whitespace from lines in files that # are listed on the command line. # This subroutine does the work for one file. sub detrail { my($file) = $_[0]; my($changed) = 0; open(IN, "$file") || die "Can't open $file for input"; @lines = ; close(IN); foreach (@lines) { if (/\s+\n$/) { s/\s+\n$/\n/; $changed = 1; } } if ($changed) { open(OUT, ">$file") || die "Can't open $file for output"; print OUT @lines; close(OUT); } } # This is the main program $, = ""; # Output field separator for ($i = 0; $i < @ARGV; $i++) { &detrail($ARGV[$i]); } # End syncevolution-1.5/src/synthesis/src/pcre/HACKING0000644000373300037200000004217112424517753023242 0ustar00nightlyallusers00000000000000Technical Notes about PCRE -------------------------- These are very rough technical notes that record potentially useful information about PCRE internals. Historical note 1 ----------------- Many years ago I implemented some regular expression functions to an algorithm suggested by Martin Richards. These were not Unix-like in form, and were quite restricted in what they could do by comparison with Perl. The interesting part about the algorithm was that the amount of space required to hold the compiled form of an expression was known in advance. The code to apply an expression did not operate by backtracking, as the original Henry Spencer code and current Perl code does, but instead checked all possibilities simultaneously by keeping a list of current states and checking all of them as it advanced through the subject string. In the terminology of Jeffrey Friedl's book, it was a "DFA algorithm", though it was not a traditional Finite State Machine (FSM). When the pattern was all used up, all remaining states were possible matches, and the one matching the longest subset of the subject string was chosen. This did not necessarily maximize the individual wild portions of the pattern, as is expected in Unix and Perl-style regular expressions. Historical note 2 ----------------- By contrast, the code originally written by Henry Spencer (which was subsequently heavily modified for Perl) compiles the expression twice: once in a dummy mode in order to find out how much store will be needed, and then for real. (The Perl version probably doesn't do this any more; I'm talking about the original library.) The execution function operates by backtracking and maximizing (or, optionally, minimizing in Perl) the amount of the subject that matches individual wild portions of the pattern. This is an "NFA algorithm" in Friedl's terminology. OK, here's the real stuff ------------------------- For the set of functions that form the "basic" PCRE library (which are unrelated to those mentioned above), I tried at first to invent an algorithm that used an amount of store bounded by a multiple of the number of characters in the pattern, to save on compiling time. However, because of the greater complexity in Perl regular expressions, I couldn't do this. In any case, a first pass through the pattern is helpful for other reasons. Computing the memory requirement: how it was -------------------------------------------- Up to and including release 6.7, PCRE worked by running a very degenerate first pass to calculate a maximum store size, and then a second pass to do the real compile - which might use a bit less than the predicted amount of memory. The idea was that this would turn out faster than the Henry Spencer code because the first pass is degenerate and the second pass can just store stuff straight into the vector, which it knows is big enough. Computing the memory requirement: how it is ------------------------------------------- By the time I was working on a potential 6.8 release, the degenerate first pass had become very complicated and hard to maintain. Indeed one of the early things I did for 6.8 was to fix Yet Another Bug in the memory computation. Then I had a flash of inspiration as to how I could run the real compile function in a "fake" mode that enables it to compute how much memory it would need, while actually only ever using a few hundred bytes of working memory, and without too many tests of the mode that might slow it down. So I re-factored the compiling functions to work this way. This got rid of about 600 lines of source. It should make future maintenance and development easier. As this was such a major change, I never released 6.8, instead upping the number to 7.0 (other quite major changes are also present in the 7.0 release). A side effect of this work is that the previous limit of 200 on the nesting depth of parentheses was removed. However, there is a downside: pcre_compile() runs more slowly than before (30% or more, depending on the pattern) because it is doing a full analysis of the pattern. My hope is that this is not a big issue. Traditional matching function ----------------------------- The "traditional", and original, matching function is called pcre_exec(), and it implements an NFA algorithm, similar to the original Henry Spencer algorithm and the way that Perl works. Not surprising, since it is intended to be as compatible with Perl as possible. This is the function most users of PCRE will use most of the time. Supplementary matching function ------------------------------- From PCRE 6.0, there is also a supplementary matching function called pcre_dfa_exec(). This implements a DFA matching algorithm that searches simultaneously for all possible matches that start at one point in the subject string. (Going back to my roots: see Historical Note 1 above.) This function intreprets the same compiled pattern data as pcre_exec(); however, not all the facilities are available, and those that are do not always work in quite the same way. See the user documentation for details. The algorithm that is used for pcre_dfa_exec() is not a traditional FSM, because it may have a number of states active at one time. More work would be needed at compile time to produce a traditional FSM where only one state is ever active at once. I believe some other regex matchers work this way. Format of compiled patterns --------------------------- The compiled form of a pattern is a vector of bytes, containing items of variable length. The first byte in an item is an opcode, and the length of the item is either implicit in the opcode or contained in the data bytes that follow it. In many cases below LINK_SIZE data values are specified for offsets within the compiled pattern. The default value for LINK_SIZE is 2, but PCRE can be compiled to use 3-byte or 4-byte values for these offsets (impairing the performance). This is necessary only when patterns whose compiled length is greater than 64K are going to be processed. In this description, we assume the "normal" compilation options. Data values that are counts (e.g. for quantifiers) are always just two bytes long. A list of the opcodes follows: Opcodes with no following data ------------------------------ These items are all just one byte long OP_END end of pattern OP_ANY match any character OP_ANYBYTE match any single byte, even in UTF-8 mode OP_SOD match start of data: \A OP_SOM, start of match (subject + offset): \G OP_SET_SOM, set start of match (\K) OP_CIRC ^ (start of data, or after \n in multiline) OP_NOT_WORD_BOUNDARY \W OP_WORD_BOUNDARY \w OP_NOT_DIGIT \D OP_DIGIT \d OP_NOT_HSPACE \H OP_HSPACE \h OP_NOT_WHITESPACE \S OP_WHITESPACE \s OP_NOT_VSPACE \V OP_VSPACE \v OP_NOT_WORDCHAR \W OP_WORDCHAR \w OP_EODN match end of data or \n at end: \Z OP_EOD match end of data: \z OP_DOLL $ (end of data, or before \n in multiline) OP_EXTUNI match an extended Unicode character OP_ANYNL match any Unicode newline sequence OP_ACCEPT ) OP_COMMIT ) OP_FAIL ) These are Perl 5.10's "backtracking OP_PRUNE ) control verbs". OP_SKIP ) OP_THEN ) Repeating single characters --------------------------- The common repeats (*, +, ?) when applied to a single character use the following opcodes: OP_STAR OP_MINSTAR OP_POSSTAR OP_PLUS OP_MINPLUS OP_POSPLUS OP_QUERY OP_MINQUERY OP_POSQUERY In ASCII mode, these are two-byte items; in UTF-8 mode, the length is variable. Those with "MIN" in their name are the minimizing versions. Those with "POS" in their names are possessive versions. Each is followed by the character that is to be repeated. Other repeats make use of OP_UPTO OP_MINUPTO OP_POSUPTO OP_EXACT which are followed by a two-byte count (most significant first) and the repeated character. OP_UPTO matches from 0 to the given number. A repeat with a non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an OP_UPTO (or OP_MINUPTO or OPT_POSUPTO). Repeating character types ------------------------- Repeats of things like \d are done exactly as for single characters, except that instead of a character, the opcode for the type is stored in the data byte. The opcodes are: OP_TYPESTAR OP_TYPEMINSTAR OP_TYPEPOSSTAR OP_TYPEPLUS OP_TYPEMINPLUS OP_TYPEPOSPLUS OP_TYPEQUERY OP_TYPEMINQUERY OP_TYPEPOSQUERY OP_TYPEUPTO OP_TYPEMINUPTO OP_TYPEPOSUPTO OP_TYPEEXACT Match by Unicode property ------------------------- OP_PROP and OP_NOTPROP are used for positive and negative matches of a character by testing its Unicode property (the \p and \P escape sequences). Each is followed by two bytes that encode the desired property as a type and a value. Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by three bytes: OP_PROP or OP_NOTPROP and then the desired property type and value. Matching literal characters --------------------------- The OP_CHAR opcode is followed by a single character that is to be matched casefully. For caseless matching, OP_CHARNC is used. In UTF-8 mode, the character may be more than one byte long. (Earlier versions of PCRE used multi-character strings, but this was changed to allow some new features to be added.) Character classes ----------------- If there is only one character, OP_CHAR or OP_CHARNC is used for a positive class, and OP_NOT for a negative one (that is, for something like [^a]). However, in UTF-8 mode, the use of OP_NOT applies only to characters with values < 128, because OP_NOT is confined to single bytes. Another set of repeating opcodes (OP_NOTSTAR etc.) are used for a repeated, negated, single-character class. The normal ones (OP_STAR etc.) are used for a repeated positive single-character class. When there's more than one character in a class and all the characters are less than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a negative one. In either case, the opcode is followed by a 32-byte bit map containing a 1 bit for every character that is acceptable. The bits are counted from the least significant end of each byte. The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8 mode, subject characters with values greater than 256 can be handled correctly. For OP_CLASS they don't match, whereas for OP_NCLASS they do. For classes containing characters with values > 255, OP_XCLASS is used. It optionally uses a bit map (if any characters lie within it), followed by a list of pairs and single characters. There is a flag character than indicates whether it's a positive or a negative class. Back references --------------- OP_REF is followed by two bytes containing the reference number. Repeating character classes and back references ----------------------------------------------- Single-character classes are handled specially (see above). This section applies to OP_CLASS and OP_REF. In both cases, the repeat information follows the base item. The matching code looks at the following opcode to see if it is one of OP_CRSTAR OP_CRMINSTAR OP_CRPLUS OP_CRMINPLUS OP_CRQUERY OP_CRMINQUERY OP_CRRANGE OP_CRMINRANGE All but the last two are just single-byte items. The others are followed by four bytes of data, comprising the minimum and maximum repeat counts. There are no special possessive opcodes for these repeats; a possessive repeat is compiled into an atomic group. Brackets and alternation ------------------------ A pair of non-capturing (round) brackets is wrapped round each expression at compile time, so alternation always happens in the context of brackets. [Note for North Americans: "bracket" to some English speakers, including myself, can be round, square, curly, or pointy. Hence this usage.] Non-capturing brackets use the opcode OP_BRA. Originally PCRE was limited to 99 capturing brackets and it used a different opcode for each one. From release 3.5, the limit was removed by putting the bracket number into the data for higher-numbered brackets. From release 7.0 all capturing brackets are handled this way, using the single opcode OP_CBRA. A bracket opcode is followed by LINK_SIZE bytes which give the offset to the next alternative OP_ALT or, if there aren't any branches, to the matching OP_KET opcode. Each OP_ALT is followed by LINK_SIZE bytes giving the offset to the next one, or to the OP_KET opcode. For capturing brackets, the bracket number immediately follows the offset, always as a 2-byte item. OP_KET is used for subpatterns that do not repeat indefinitely, while OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or maximally respectively. All three are followed by LINK_SIZE bytes giving (as a positive number) the offset back to the matching bracket opcode. If a subpattern is quantified such that it is permitted to match zero times, it is preceded by one of OP_BRAZERO or OP_BRAMINZERO. These are single-byte opcodes which tell the matcher that skipping this subpattern entirely is a valid branch. A subpattern with an indefinite maximum repetition is replicated in the compiled data its minimum number of times (or once with OP_BRAZERO if the minimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX as appropriate. A subpattern with a bounded maximum repetition is replicated in a nested fashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO before each replication after the minimum, so that, for example, (abc){2,5} is compiled as (abc)(abc)((abc)((abc)(abc)?)?)?, except that each bracketed group has the same number. When a repeated subpattern has an unbounded upper limit, it is checked to see whether it could match an empty string. If this is the case, the opcode in the final replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher that it needs to check for matching an empty string when it hits OP_KETRMIN or OP_KETRMAX, and if so, to break the loop. Assertions ---------- Forward assertions are just like other subpatterns, but starting with one of the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion is OP_REVERSE, followed by a two byte count of the number of characters to move back the pointer in the subject string. When operating in UTF-8 mode, the count is a character count rather than a byte count. A separate count is present in each alternative of a lookbehind assertion, allowing them to have different fixed lengths. Once-only (atomic) subpatterns ------------------------------ These are also just like other subpatterns, but they start with the opcode OP_ONCE. The check for matching an empty string in an unbounded repeat is handled entirely at runtime, so there is just this one opcode. Conditional subpatterns ----------------------- These are like other subpatterns, but they start with the opcode OP_COND, or OP_SCOND for one that might match an empty string in an unbounded repeat. If the condition is a back reference, this is stored at the start of the subpattern using the opcode OP_CREF followed by two bytes containing the reference number. If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of group x" (coded as "(?(Rx)"), the group number is stored at the start of the subpattern using the opcode OP_RREF, and a value of zero for "the whole pattern". For a DEFINE condition, just the single byte OP_DEF is used (it has no associated data). Otherwise, a conditional subpattern always starts with one of the assertions. Recursion --------- Recursion either matches the current regex, or some subexpression. The opcode OP_RECURSE is followed by an value which is the offset to the starting bracket from the start of the whole pattern. From release 6.5, OP_RECURSE is automatically wrapped inside OP_ONCE brackets (because otherwise some patterns broke it). OP_RECURSE is also used for "subroutine" calls, even though they are not strictly a recursion. Callout ------- OP_CALLOUT is followed by one byte of data that holds a callout number in the range 0 to 254 for manual callouts, or 255 for an automatic callout. In both cases there follows a two-byte value giving the offset in the pattern to the start of the following item, and another two-byte item giving the length of the next item. Changing options ---------------- If any of the /i, /m, or /s options are changed within a pattern, an OP_OPT opcode is compiled, followed by one byte containing the new settings of these flags. If there are several alternatives, there is an occurrence of OP_OPT at the start of all those following the first options change, to set appropriate options for the start of the alternative. Immediately after the end of the group there is another such item to reset the flags to their previous values. A change of flag right at the very start of the pattern can be handled entirely at compile time, and so does not cause anything to be put into the compiled data. Philip Hazel August 2007 syncevolution-1.5/src/synthesis/src/pcre/INSTALL0000644000373300037200000002231012424517753023275 0ustar00nightlyallusers00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. syncevolution-1.5/src/synthesis/src/pcre/LICENCE0000644000373300037200000000467312424517753023245 0ustar00nightlyallusers00000000000000PCRE LICENCE ------------ PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Release 7 of PCRE is distributed under the terms of the "BSD" licence, as specified below. The documentation for PCRE, supplied in the "doc" directory, is distributed under the same terms as the software itself. The basic library functions are written in C and are freestanding. Also included in the distribution is a set of C++ wrapper functions. THE BASIC LIBRARY FUNCTIONS --------------------------- Written by: Philip Hazel Email local part: ph10 Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. Copyright (c) 1997-2007 University of Cambridge All rights reserved. THE C++ WRAPPER FUNCTIONS ------------------------- Contributed by: Google Inc. Copyright (c) 2007, Google Inc. All rights reserved. THE "BSD" LICENCE ----------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the name of Google Inc. nor the names of their contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. End syncevolution-1.5/src/synthesis/src/pcre/Makefile.am0000644000373300037200000002155112424517753024306 0ustar00nightlyallusers00000000000000## Process this file with automake to produce Makefile.in. dist_doc_DATA = \ doc/pcre.txt \ doc/pcre-config.txt \ doc/pcregrep.txt \ doc/pcretest.txt \ AUTHORS \ COPYING \ ChangeLog \ LICENCE \ NEWS \ README dist_html_DATA = \ doc/html/index.html \ doc/html/pcre.html \ doc/html/pcre-config.html \ doc/html/pcre_compile.html \ doc/html/pcre_compile2.html \ doc/html/pcre_config.html \ doc/html/pcre_copy_named_substring.html \ doc/html/pcre_copy_substring.html \ doc/html/pcre_dfa_exec.html \ doc/html/pcre_exec.html \ doc/html/pcre_free_substring.html \ doc/html/pcre_free_substring_list.html \ doc/html/pcre_fullinfo.html \ doc/html/pcre_get_named_substring.html \ doc/html/pcre_get_stringnumber.html \ doc/html/pcre_get_stringtable_entries.html \ doc/html/pcre_get_substring.html \ doc/html/pcre_get_substring_list.html \ doc/html/pcre_info.html \ doc/html/pcre_maketables.html \ doc/html/pcre_refcount.html \ doc/html/pcre_study.html \ doc/html/pcre_version.html \ doc/html/pcreapi.html \ doc/html/pcrebuild.html \ doc/html/pcrecallout.html \ doc/html/pcrecompat.html \ doc/html/pcregrep.html \ doc/html/pcrematching.html \ doc/html/pcrepartial.html \ doc/html/pcrepattern.html \ doc/html/pcreperform.html \ doc/html/pcreposix.html \ doc/html/pcreprecompile.html \ doc/html/pcresample.html \ doc/html/pcrestack.html \ doc/html/pcretest.html pcrecpp_html = doc/html/pcrecpp.html dist_noinst_DATA = $(pcrecpp_html) if WITH_PCRE_CPP html_DATA = $(pcrecpp_html) endif # The Libtool libraries to install. We'll add to this later. lib_LTLIBRARIES = # Unit tests you want to run when people type 'make check'. # TESTS is for binary unit tests, check_SCRIPTS for script-based tests TESTS = check_SCRIPTS = dist_noinst_SCRIPTS = # Some of the binaries we make are to be installed, and others are # (non-user-visible) helper programs needed to build libpcre. bin_PROGRAMS = noinst_PROGRAMS = # Additional files to delete on 'make clean' and 'make maintainer-clean'. CLEANFILES = MAINTAINERCLEANFILES = # Additional files to bundle with the distribution, over and above what # the Autotools include by default. EXTRA_DIST = # These files contain maintenance information EXTRA_DIST += \ doc/perltest.txt \ NON-UNIX-USE \ HACKING # These files are used in the preparation of a release EXTRA_DIST += \ PrepareRelease \ CleanTxt \ Detrail \ 132html \ doc/index.html.src # These files are to do with building for Virtual Pascal EXTRA_DIST += \ makevp.bat \ makevp_c.txt \ makevp_l.txt \ pcregexp.pas # These files are usable versions of pcre.h and config.h that are distributed # for the benefit of people who are building PCRE manually, without the # Autotools support. EXTRA_DIST += \ pcre.h.generic \ config.h.generic pcre.h.generic: configure.ac rm -f $@ cp -p pcre.h $@ MAINTAINERCLEANFILES += pcre.h.generic # These are the header files we'll install. We do not distribute pcre.h because # it is generated from pcre.h.in. nodist_include_HEADERS = \ pcre.h include_HEADERS = \ pcreposix.h # These additional headers will be be installed if C++ support is enabled. We # do not distribute pcrecpparg.h or pcre_stringpiece.h, as these are generated # from corresponding .h.in files (which we do distribute). if WITH_PCRE_CPP nodist_include_HEADERS += \ pcrecpparg.h \ pcre_stringpiece.h include_HEADERS += \ pcrecpp.h \ pcre_scanner.h endif # WITH_PCRE_CPP bin_SCRIPTS = pcre-config ## --------------------------------------------------------------- ## The dftables program is used to rebuild character tables before compiling ## PCRE, if --enable-rebuild-chartables is specified. It is not a user-visible ## program. The default (when --enable-rebuild-chartables is not specified) is ## to copy a distributed set of tables that are defined for ASCII code. In this ## case, dftables is not needed. if WITH_REBUILD_CHARTABLES noinst_PROGRAMS += dftables dftables_SOURCES = dftables.c pcre_chartables.c: dftables$(EXEEXT) ./dftables$(EXEEXT) $@ else pcre_chartables.c: $(srcdir)/pcre_chartables.c.dist rm -f $@ $(LN_S) $(srcdir)/pcre_chartables.c.dist $@ endif # WITH_REBUILD_CHARTABLES ## The main pcre library lib_LTLIBRARIES += libpcre.la libpcre_la_SOURCES = \ pcre_compile.c \ pcre_config.c \ pcre_dfa_exec.c \ pcre_exec.c \ pcre_fullinfo.c \ pcre_get.c \ pcre_globals.c \ pcre_info.c \ pcre_internal.h \ pcre_maketables.c \ pcre_newline.c \ pcre_ord2utf8.c \ pcre_refcount.c \ pcre_study.c \ pcre_tables.c \ pcre_try_flipped.c \ pcre_ucp_searchfuncs.c \ pcre_valid_utf8.c \ pcre_version.c \ pcre_xclass.c \ ucp.h \ ucpinternal.h \ ucptable.h ## This file is generated as part of the building process, so don't distribute. nodist_libpcre_la_SOURCES = \ pcre_chartables.c # The pcre_printint.src file is #included by some source files, so it must be # distributed. The pcre_chartables.c.dist file is the default version of # pcre_chartables.c, used unless --enable-rebuild-chartables is specified. EXTRA_DIST += pcre_printint.src pcre_chartables.c.dist libpcre_la_LDFLAGS = $(EXTRA_LIBPCRE_LDFLAGS) CLEANFILES += pcre_chartables.c ## A version of the main pcre library that has a posix re API. lib_LTLIBRARIES += libpcreposix.la libpcreposix_la_SOURCES = \ pcreposix.c libpcreposix_la_LDFLAGS = $(EXTRA_LIBPCREPOSIX_LDFLAGS) libpcreposix_la_LIBADD = libpcre.la ## There's a C++ library as well. if WITH_PCRE_CPP lib_LTLIBRARIES += libpcrecpp.la libpcrecpp_la_SOURCES = \ pcrecpp_internal.h \ pcrecpp.cc \ pcre_scanner.cc \ pcre_stringpiece.cc libpcrecpp_la_LDFLAGS = $(EXTRA_LIBPCRECPP_LDFLAGS) libpcrecpp_la_LIBADD = libpcre.la TESTS += pcrecpp_unittest noinst_PROGRAMS += pcrecpp_unittest pcrecpp_unittest_SOURCES = pcrecpp_unittest.cc pcrecpp_unittest_LDADD = libpcrecpp.la TESTS += pcre_scanner_unittest noinst_PROGRAMS += pcre_scanner_unittest pcre_scanner_unittest_SOURCES = pcre_scanner_unittest.cc pcre_scanner_unittest_LDADD = libpcrecpp.la TESTS += pcre_stringpiece_unittest noinst_PROGRAMS += pcre_stringpiece_unittest pcre_stringpiece_unittest_SOURCES = pcre_stringpiece_unittest.cc pcre_stringpiece_unittest_LDADD = libpcrecpp.la endif # WITH_PCRE_CPP ## The main unit tests # Each unit test is a binary plus a script that runs that binary in various # ways. We install these test binaries in case folks find it helpful. TESTS += RunTest dist_noinst_SCRIPTS += RunTest EXTRA_DIST += RunTest.bat bin_PROGRAMS += pcretest pcretest_SOURCES = pcretest.c pcretest_LDADD = libpcreposix.la TESTS += RunGrepTest dist_noinst_SCRIPTS += RunGrepTest bin_PROGRAMS += pcregrep pcregrep_SOURCES = pcregrep.c pcregrep_LDADD = libpcreposix.la EXTRA_DIST += \ testdata/grepinput \ testdata/grepinput8 \ testdata/grepinputv \ testdata/grepinputx \ testdata/greplist \ testdata/grepoutput \ testdata/grepoutput8 \ testdata/grepoutputN \ testdata/testinput1 \ testdata/testinput2 \ testdata/testinput3 \ testdata/testinput4 \ testdata/testinput5 \ testdata/testinput6 \ testdata/testinput7 \ testdata/testinput8 \ testdata/testinput9 \ testdata/testinput10 \ testdata/testoutput1 \ testdata/testoutput2 \ testdata/testoutput3 \ testdata/testoutput4 \ testdata/testoutput5 \ testdata/testoutput6 \ testdata/testoutput7 \ testdata/testoutput8 \ testdata/testoutput9 \ testdata/testoutput10 \ perltest.pl CLEANFILES += \ testsavedregex \ teststderr \ testtry \ testNinput # PCRE demonstration program noinst_PROGRAMS += pcredemo pcredemo_SOURCES = pcredemo.c pcredemo_LDADD = libpcre.la ## Utility rules, documentation, etc. # A compatibility line, the old build system worked with 'make test' test: check ; # We have .pc files for pkg-config users. pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libpcre.pc if WITH_PCRE_CPP pkgconfig_DATA += libpcrecpp.pc endif dist_man_MANS = \ doc/pcre.3 \ doc/pcre-config.1 \ doc/pcre_compile.3 \ doc/pcre_compile2.3 \ doc/pcre_config.3 \ doc/pcre_copy_named_substring.3 \ doc/pcre_copy_substring.3 \ doc/pcre_dfa_exec.3 \ doc/pcre_exec.3 \ doc/pcre_free_substring.3 \ doc/pcre_free_substring_list.3 \ doc/pcre_fullinfo.3 \ doc/pcre_get_named_substring.3 \ doc/pcre_get_stringnumber.3 \ doc/pcre_get_stringtable_entries.3 \ doc/pcre_get_substring.3 \ doc/pcre_get_substring_list.3 \ doc/pcre_info.3 \ doc/pcre_maketables.3 \ doc/pcre_refcount.3 \ doc/pcre_study.3 \ doc/pcre_version.3 \ doc/pcreapi.3 \ doc/pcrebuild.3 \ doc/pcrecallout.3 \ doc/pcrecompat.3 \ doc/pcregrep.1 \ doc/pcrematching.3 \ doc/pcrepartial.3 \ doc/pcrepattern.3 \ doc/pcreperform.3 \ doc/pcreposix.3 \ doc/pcreprecompile.3 \ doc/pcresample.3 \ doc/pcrestack.3 \ doc/pcretest.1 pcrecpp_man = doc/pcrecpp.3 EXTRA_DIST += $(pcrecpp_man) if WITH_PCRE_CPP man_MANS = $(pcrecpp_man) endif ## CMake support EXTRA_DIST += \ CMakeLists.txt \ config-cmake.h.in ## end Makefile.am syncevolution-1.5/src/synthesis/src/pcre/NEWS0000644000373300037200000003706012424517753022753 0ustar00nightlyallusers00000000000000News about PCRE releases ------------------------ Release 7.3 28-Aug-07 --------------------- Most changes are bug fixes. Some that are not: 1. There is some support for Perl 5.10's experimental "backtracking control verbs" such as (*PRUNE). 2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more restrictive in the strings it accepts. 3. Checking for potential integer overflow has been made more dynamic, and as a consequence there is no longer a hard limit on the size of a subpattern that has a limited repeat count. 4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec() no longer advance by two characters instead of one when an unanchored match fails at CRLF if there are explicit CR or LF matches within the pattern. This gets rid of some anomalous effects that previously occurred. 5. Some PCRE-specific settings for varying the newline options at the start of a pattern have been added. Release 7.2 19-Jun-07 --------------------- WARNING: saved patterns that were compiled by earlier versions of PCRE must be recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v, and \V). Correction to the notes for 7.1: the note about shared libraries for Windows is wrong. Previously, three libraries were built, but each could function independently. For example, the pcreposix library also included all the functions from the basic pcre library. The change is that the three libraries are no longer independent. They are like the Unix libraries. To use the pcreposix functions, for example, you need to link with both the pcreposix and the basic pcre library. Some more features from Perl 5.10 have been added: (?-n) and (?+n) relative references for recursion and subroutines. (?(-n) and (?(+n) relative references as conditions. \k{name} and \g{name} are synonyms for \k. \K to reset the start of the matched string; for example, (foo)\Kbar matches bar preceded by foo, but only sets bar as the matched string. (?| introduces a group where the capturing parentheses in each alternative start from the same number; for example, (?|(abc)|(xyz)) sets capturing parentheses number 1 in both cases. \h, \H, \v, \V match horizontal and vertical whitespace, respectively. Release 7.1 24-Apr-07 --------------------- There is only one new feature in this release: a linebreak setting of PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which recognizes only CRLF, CR, and LF as linebreaks. A few bugs are fixed (see ChangeLog for details), but the major change is a complete re-implementation of the build system. This now has full Autotools support and so is now "standard" in some sense. It should help with compiling PCRE in a wide variety of environments. NOTE: when building shared libraries for Windows, three dlls are now built, called libpcre, libpcreposix, and libpcrecpp. Previously, everything was included in a single dll. Another important change is that the dftables auxiliary program is no longer compiled and run at "make" time by default. Instead, a default set of character tables (assuming ASCII coding) is used. If you want to use dftables to generate the character tables as previously, add --enable-rebuild-chartables to the "configure" command. You must do this if you are compiling PCRE to run on a system that uses EBCDIC code. There is a discussion about character tables in the README file. The default is not to use dftables so that that there is no problem when cross-compiling. Release 7.0 19-Dec-06 --------------------- This release has a new major number because there have been some internal upheavals to facilitate the addition of new optimizations and other facilities, and to make subsequent maintenance and extension easier. Compilation is likely to be a bit slower, but there should be no major effect on runtime performance. Previously compiled patterns are NOT upwards compatible with this release. If you have saved compiled patterns from a previous release, you will have to re-compile them. Important changes that are visible to users are: 1. The Unicode property tables have been updated to Unicode 5.0.0, which adds some more scripts. 2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline sequence as a newline. 3. The \R escape matches a single Unicode newline sequence as a single unit. 4. New features that will appear in Perl 5.10 are now in PCRE. These include alternative Perl syntax for named parentheses, and Perl syntax for recursion. 5. The C++ wrapper interface has been extended by the addition of a QuoteMeta function and the ability to allow copy construction and assignment. For a complete list of changes, see the ChangeLog file. Release 6.7 04-Jul-06 --------------------- The main additions to this release are the ability to use the same name for multiple sets of parentheses, and support for CRLF line endings in both the library and pcregrep (and in pcretest for testing). Thanks to Ian Taylor, the stack usage for many kinds of pattern has been significantly reduced for certain subject strings. Release 6.5 01-Feb-06 --------------------- Important changes in this release: 1. A number of new features have been added to pcregrep. 2. The Unicode property tables have been updated to Unicode 4.1.0, and the supported properties have been extended with script names such as "Arabic", and the derived properties "Any" and "L&". This has necessitated a change to the interal format of compiled patterns. Any saved compiled patterns that use \p or \P must be recompiled. 3. The specification of recursion in patterns has been changed so that all recursive subpatterns are automatically treated as atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). This is necessary because otherwise there are situations where recursion does not work. See the ChangeLog for a complete list of changes, which include a number of bug fixes and tidies. Release 6.0 07-Jun-05 --------------------- The release number has been increased to 6.0 because of the addition of several major new pieces of functionality. A new function, pcre_dfa_exec(), which implements pattern matching using a DFA algorithm, has been added. This has a number of advantages for certain cases, though it does run more slowly, and lacks the ability to capture substrings. On the other hand, it does find all matches, not just the first, and it works better for partial matching. The pcrematching man page discusses the differences. The pcretest program has been enhanced so that it can make use of the new pcre_dfa_exec() matching function and the extra features it provides. The distribution now includes a C++ wrapper library. This is built automatically if a C++ compiler is found. The pcrecpp man page discusses this interface. The code itself has been re-organized into many more files, one for each function, so it no longer requires everything to be linked in when static linkage is used. As a consequence, some internal functions have had to have their names exposed. These functions all have names starting with _pcre_. They are undocumented, and are not intended for use by outside callers. The pcregrep program has been enhanced with new functionality such as multiline-matching and options for output more matching context. See the ChangeLog for a complete list of changes to the library and the utility programs. Release 5.0 13-Sep-04 --------------------- The licence under which PCRE is released has been changed to the more conventional "BSD" licence. In the code, some bugs have been fixed, and there are also some major changes in this release (which is why I've increased the number to 5.0). Some changes are internal rearrangements, and some provide a number of new facilities. The new features are: 1. There's an "automatic callout" feature that inserts callouts before every item in the regex, and there's a new callout field that gives the position in the pattern - useful for debugging and tracing. 2. The extra_data structure can now be used to pass in a set of character tables at exec time. This is useful if compiled regex are saved and re-used at a later time when the tables may not be at the same address. If the default internal tables are used, the pointer saved with the compiled pattern is now set to NULL, which means that you don't need to do anything special unless you are using custom tables. 3. It is possible, with some restrictions on the content of the regex, to request "partial" matching. A special return code is given if all of the subject string matched part of the regex. This could be useful for testing an input field as it is being typed. 4. There is now some optional support for Unicode character properties, which means that the patterns items such as \p{Lu} and \X can now be used. Only the general category properties are supported. If PCRE is compiled with this support, an additional 90K data structure is include, which increases the size of the library dramatically. 5. There is support for saving compiled patterns and re-using them later. 6. There is support for running regular expressions that were compiled on a different host with the opposite endianness. 7. The pcretest program has been extended to accommodate the new features. The main internal rearrangement is that sequences of literal characters are no longer handled as strings. Instead, each character is handled on its own. This makes some UTF-8 handling easier, and makes the support of partial matching possible. Compiled patterns containing long literal strings will be larger as a result of this change; I hope that performance will not be much affected. Release 4.5 01-Dec-03 --------------------- Again mainly a bug-fix and tidying release, with only a couple of new features: 1. It's possible now to compile PCRE so that it does not use recursive function calls when matching. Instead it gets memory from the heap. This slows things down, but may be necessary on systems with limited stacks. 2. UTF-8 string checking has been tightened to reject overlong sequences and to check that a starting offset points to the start of a character. Failure of the latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET. 3. PCRE can now be compiled for systems that use EBCDIC code. Release 4.4 21-Aug-03 --------------------- This is mainly a bug-fix and tidying release. The only new feature is that PCRE checks UTF-8 strings for validity by default. There is an option to suppress this, just in case anybody wants that teeny extra bit of performance. Releases 4.1 - 4.3 ------------------ Sorry, I forgot about updating the NEWS file for these releases. Please take a look at ChangeLog. Release 4.0 17-Feb-03 --------------------- There have been a lot of changes for the 4.0 release, adding additional functionality and mending bugs. Below is a list of the highlights of the new functionality. For full details of these features, please consult the documentation. For a complete list of changes, see the ChangeLog file. 1. Support for Perl's \Q...\E escapes. 2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java package. They provide some syntactic sugar for simple cases of "atomic grouping". 3. Support for the \G assertion. It is true when the current matching position is at the start point of the match. 4. A new feature that provides some of the functionality that Perl provides with (?{...}). The facility is termed a "callout". The way it is done in PCRE is for the caller to provide an optional function, by setting pcre_callout to its entry point. To get the function called, the regex must include (?C) at appropriate points. 5. Support for recursive calls to individual subpatterns. This makes it really easy to get totally confused. 6. Support for named subpatterns. The Python syntax (?P...) is used to name a group. 7. Several extensions to UTF-8 support; it is now fairly complete. There is an option for pcregrep to make it operate in UTF-8 mode. 8. The single man page has been split into a number of separate man pages. These also give rise to individual HTML pages which are put in a separate directory. There is an index.html page that lists them all. Some hyperlinking between the pages has been installed. Release 3.5 15-Aug-01 --------------------- 1. The configuring system has been upgraded to use later versions of autoconf and libtool. By default it builds both a shared and a static library if the OS supports it. You can use --disable-shared or --disable-static on the configure command if you want only one of them. 2. The pcretest utility is now installed along with pcregrep because it is useful for users (to test regexs) and by doing this, it automatically gets relinked by libtool. The documentation has been turned into a man page, so there are now .1, .txt, and .html versions in /doc. 3. Upgrades to pcregrep: (i) Added long-form option names like gnu grep. (ii) Added --help to list all options with an explanatory phrase. (iii) Added -r, --recursive to recurse into sub-directories. (iv) Added -f, --file to read patterns from a file. 4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure script, to force use of CR or LF instead of \n in the source. On non-Unix systems, the value can be set in config.h. 5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an absolute limit. Changed the text of the error message to make this clear, and likewise updated the man page. 6. The limit of 99 on the number of capturing subpatterns has been removed. The new limit is 65535, which I hope will not be a "real" limit. Release 3.3 01-Aug-00 --------------------- There is some support for UTF-8 character strings. This is incomplete and experimental. The documentation describes what is and what is not implemented. Otherwise, this is just a bug-fixing release. Release 3.0 01-Feb-00 --------------------- 1. A "configure" script is now used to configure PCRE for Unix systems. It builds a Makefile, a config.h file, and the pcre-config script. 2. PCRE is built as a shared library by default. 3. There is support for POSIX classes such as [:alpha:]. 5. There is an experimental recursion feature. ---------------------------------------------------------------------------- IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 Please note that there has been a change in the API such that a larger ovector is required at matching time, to provide some additional workspace. The new man page has details. This change was necessary in order to support some of the new functionality in Perl 5.005. IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 Another (I hope this is the last!) change has been made to the API for the pcre_compile() function. An additional argument has been added to make it possible to pass over a pointer to character tables built in the current locale by pcre_maketables(). To use the default tables, this new arguement should be passed as NULL. IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 Yet another (and again I hope this really is the last) change has been made to the API for the pcre_exec() function. An additional argument has been added to make it possible to start the match other than at the start of the subject string. This is important if there are lookbehinds. The new man page has the details, but you just want to convert existing programs, all you need to do is to stick in a new fifth argument to pcre_exec(), with a value of zero. For example, change pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) to pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) **** syncevolution-1.5/src/synthesis/src/pcre/NON-UNIX-USE0000644000373300037200000003137412424517753024046 0ustar00nightlyallusers00000000000000Compiling PCRE on non-Unix systems ---------------------------------- This document contains the following sections: General Generic instructions for the PCRE C library The C++ wrapper functions Building for virtual Pascal Stack size in Windows environments Comments about Win32 builds Building under Windows with BCC5.5 Building PCRE on OpenVMS GENERAL I (Philip Hazel) have no experience of Windows or VMS sytems and how their libraries work. The items in the PCRE distribution and Makefile that relate to anything other than Unix-like systems are untested by me. There are some other comments and files in the Contrib directory on the ftp site that you may find useful. See ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib If you want to compile PCRE for a non-Unix system (especially for a system that does not support "configure" and "make" files), note that the basic PCRE library consists entirely of code written in Standard C, and so should compile successfully on any system that has a Standard C compiler and library. The C++ wrapper functions are a separate issue (see below). The PCRE distribution contains some experimental support for "cmake", but this is incomplete and not documented. However if you are a "cmake" user you might like to try building with "cmake". GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY The following are generic comments about building the PCRE C library "by hand". (1) Copy or rename the file config.h.generic as config.h, and edit the macro settings that it contains to whatever is appropriate for your environment. In particular, if you want to force a specific value for newline, you can define the NEWLINE macro. An alternative approach is not to edit config.h, but to use -D on the compiler command line to make any changes that you need. NOTE: There have been occasions when the way in which certain parameters in config.h are used has changed between releases. (In the configure/make world, this is handled automatically.) When upgrading to a new release, you are strongly advised to review config.h.generic before re-using what you had previously. (2) Copy or rename the file pcre.h.generic as pcre.h. (3) EITHER: Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. OR: Compile dftables.c as a stand-alone program, and then run it with the single argument "pcre_chartables.c". This generates a set of standard character tables and writes them to that file. The tables are generated using the default C locale for your system. If you want to use a locale that is specified by LC_xxx environment variables, add the -L option to the dftables command. You must use this method if you are building on a system that uses EBCDIC code. The tables in pcre_chartables.c are defaults. The caller of PCRE can specify alternative tables at run time. (4) Ensure that you have the following header files: pcre_internal.h ucp.h ucpinternal.h ucptable.h (5) Also ensure that you have the following file, which is #included as source when building a debugging version of PCRE and is also used by pcretest. pcre_printint.src (6) Compile the following source files: pcre_chartables.c pcre_compile.c pcre_config.c pcre_dfa_exec.c pcre_exec.c pcre_fullinfo.c pcre_get.c pcre_globals.c pcre_info.c pcre_maketables.c pcre_newline.c pcre_ord2utf8.c pcre_refcount.c pcre_study.c pcre_tables.c pcre_try_flipped.c pcre_ucp_searchfuncs.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c Make sure that you include -I. in the compiler command (or equivalent for an unusual compiler) so that all included PCRE header files are first sought in the current directory. Otherwise you run the risk of picking up a previously-installed file from somewhere else. (7) Now link all the compiled code into an object library in whichever form your system keeps such libraries. This is the basic PCRE C library. If your system has static and shared libraries, you may have to do this once for each type. (8) Similarly, compile pcreposix.c and link the result (on its own) as the pcreposix library. (9) Compile the test program pcretest.c. This needs the functions in the pcre and pcreposix libraries when linking. It also needs the pcre_printint.src source file, which it #includes. (10) Run pcretest on the testinput files in the testdata directory, and check that the output matches the corresponding testoutput files. Note that the supplied files are in Unix format, with just LF characters as line terminators. You may need to edit them to change this if your system uses a different convention. (11) If you want to use the pcregrep command, compile and link pcregrep.c; it uses only the basic PCRE library (it does not need the pcreposix library). THE C++ WRAPPER FUNCTIONS The PCRE distribution also contains some C++ wrapper functions and tests, contributed by Google Inc. On a system that can use "configure" and "make", the functions are automatically built into a library called pcrecpp. It should be straightforward to compile the .cc files manually on other systems. The files called xxx_unittest.cc are test programs for each of the corresponding xxx.cc files. BUILDING FOR VIRTUAL PASCAL A script for building PCRE using Borland's C++ compiler for use with VPASCAL was contributed by Alexander Tokarev. Stefan Weber updated the script and added additional files. The following files in the distribution are for building PCRE for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. STACK SIZE IN WINDOWS ENVIRONMENTS The default processor stack size of 1Mb in some Windows environments is too small for matching patterns that need much recursion. In particular, test 2 may fail because of this. Normally, running out of stack causes a crash, but there have been cases where the test program has just died silently. See your linker documentation for how to increase stack size if you experience problems. The Linux default of 8Mb is a reasonable choice for the stack, though even that can be too small for some pattern/subject combinations. There is more about stack usage in the "pcrestack" documentation. COMMENTS ABOUT WIN32 BUILDS There are two ways of building PCRE using the "configure, make, make install" paradigm on Windows systems: using MinGW or using Cygwin. These are not at all the same thing; they are completely different from each other. There is also some experimental, undocumented support for building using "cmake", which you might like to try if you are familiar with "cmake". However, at the present time, the "cmake" process builds only a static library (not a dll), and the tests are not automatically run. The MinGW home page (http://www.mingw.org/) says this: MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs. The Cygwin home page (http://www.cygwin.com/) says this: Cygwin is a Linux-like environment for Windows. It consists of two parts: . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing substantial Linux API functionality . A collection of tools which provide Linux look and feel. The Cygwin DLL currently works with all recent, commercially released x86 32 bit and 64 bit versions of Windows, with the exception of Windows CE. On both MinGW and Cygwin, PCRE should build correctly using: ./configure && make && make install This should create two libraries called libpcre and libpcreposix, and, if you have enabled building the C++ wrapper, a third one called libpcrecpp. These are independent libraries: when you like with libpcreposix or libpcrecpp you must also link with libpcre, which contains the basic functions. (Some earlier releases of PCRE included the basic libpcre functions in libpcreposix. This no longer happens.) If you want to statically link your program against a non-dll .a file, you must define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and pcre_free() exported functions will be declared __declspec(dllimport), with unwanted results. Using Cygwin's compiler generates libraries and executables that depend on cygwin1.dll. If a library that is generated this way is distributed, cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL licence, this forces not only PCRE to be under the GPL, but also the entire application. A distributor who wants to keep their own code proprietary must purchase an appropriate Cygwin licence. MinGW has no such restrictions. The MinGW compiler generates a library or executable that can run standalone on Windows without any third party dll or licensing issues. But there is more complication: If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's gcc and MinGW's gcc). So, a user can: . Build native binaries by using MinGW or by getting Cygwin and using -mno-cygwin. . Build binaries that depend on cygwin1.dll by using Cygwin with the normal compiler flags. The test files that are supplied with PCRE are in Unix format, with LF characters as line terminators. It may be necessary to change the line terminators in order to get some of the tests to work. We hope to improve things in this area in future. BUILDING UNDER WINDOWS WITH BCC5.5 Michael Roy sent these comments about building PCRE under Windows with BCC5.5: Some of the core BCC libraries have a version of PCRE from 1998 built in, which can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a version mismatch. I'm including an easy workaround below, if you'd like to include it in the non-unix instructions: When linking a project with BCC5.5, pcre.lib must be included before any of the libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command line. BUILDING PCRE ON OPENVMS Dan Mooney sent the following comments about building PCRE on OpenVMS. They relate to an older version of PCRE that used fewer source files, so the exact commands will need changing. See the current list of source files above. "It was quite easy to compile and link the library. I don't have a formal make file but the attached file [reproduced below] contains the OpenVMS DCL commands I used to build the library. I had to add #define POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. The library was built on: O/S: HP OpenVMS v7.3-1 Compiler: Compaq C v6.5-001-48BCD Linker: vA13-01 The test results did not match 100% due to the issues you mention in your documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I modified some of the character tables temporarily and was able to get the results to match. Tests using the fr locale did not match since I don't have that locale loaded. The study size was always reported to be 3 less than the value in the standard test output files." ========================= $! This DCL procedure builds PCRE on OpenVMS $! $! I followed the instructions in the non-unix-use file in the distribution. $! $ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES $ COMPILE DFTABLES.C $ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ $ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C $ COMPILE MAKETABLES.C $ COMPILE GET.C $ COMPILE STUDY.C $! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol $! did not seem to be defined anywhere. $! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. $ COMPILE PCRE.C $ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ $! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol $! did not seem to be defined anywhere. $ COMPILE PCREPOSIX.C $ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ $ COMPILE PCRETEST.C $ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB $! C programs that want access to command line arguments must be $! defined as a symbol $ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" $! Arguments must be enclosed in quotes. $ PCRETEST "-C" $! Test results: $! $! The test results did not match 100%. The functions isprint(), iscntrl(), $! isgraph() and ispunct() on OpenVMS must not produce the same results $! as the system that built the test output files provided with the $! distribution. $! $! The study size did not match and was always 3 less on OpenVMS. $! $! Locale could not be set to fr $! ========================= Last Updated: 01 August 2007 **** syncevolution-1.5/src/synthesis/src/pcre/PrepareRelease0000644000373300037200000001270512424517753025075 0ustar00nightlyallusers00000000000000#/bin/sh # Script to prepare the files for building a PCRE release. It does some # processing of the documentation, detrails files, and creates pcre.h.generic # and config.h.generic (for use by builders who can't run ./configure). # You must run this script before runnning "make dist". It makes use of the # following files: # 132html A Perl script that converts a .1 or .3 man page into HTML. It # is called from MakeRelease. It "knows" the relevant troff # constructs that are used in the PCRE man pages. # CleanTxt A Perl script that cleans up the output of "nroff -man" by # removing backspaces and other redundant text so as to produce # a readable .txt file. # Detrail A Perl script that removes trailing spaces from files. # doc/index.html.src # A file that is copied as index.html into the doc/html directory # when the HTML documentation is built. It works like this so that # doc/html can be deleted and re-created from scratch. # First, sort out the documentation cd doc echo Processing documentation # Make Text form of the documentation. It needs some mangling to make it # tidy for online reading. Concatenate all the .3 stuff, but omit the # individual function pages. cat <pcre.txt ----------------------------------------------------------------------------- This file contains a concatenation of the PCRE man pages, converted to plain text format for ease of searching with a text editor, or for use on systems that do not have a man page processor. The small individual files that give synopses of each function in the library have not been included. There are separate text files for the pcregrep and pcretest commands. ----------------------------------------------------------------------------- End echo "Making pcre.txt" for file in pcre pcrebuild pcrematching pcreapi pcrecallout pcrecompat \ pcrepattern pcresyntax pcrepartial pcreprecompile \ pcreperform pcreposix pcrecpp pcresample pcrestack ; do echo " Processing $file.3" nroff -c -man $file.3 >$file.rawtxt ../CleanTxt <$file.rawtxt >>pcre.txt /bin/rm $file.rawtxt echo "------------------------------------------------------------------------------" >>pcre.txt if [ "$file" != "pcresample" ] ; then echo " " >>pcre.txt echo " " >>pcre.txt fi done # The three commands for file in pcretest pcregrep pcre-config ; do echo Making $file.txt nroff -c -man $file.1 >$file.rawtxt ../CleanTxt <$file.rawtxt >$file.txt /bin/rm $file.rawtxt done # Make HTML form of the documentation. echo "Making HTML documentation" /bin/rm html/* cp index.html.src html/index.html for file in *.1 ; do base=`basename $file .1` echo " Making $base.html" ../132html -toc $base <$file >html/$base.html done # Exclude table of contents for function summaries. It seems that expr # forces an anchored regex. Also exclude them for small pages that have # only one section. for file in *.3 ; do base=`basename $file .3` toc=-toc if [ `expr $base : '.*_'` -ne 0 ] ; then toc="" ; fi if [ "$base" = "pcresample" ] || \ [ "$base" = "pcrestack" ] || \ [ "$base" = "pcrecompat" ] || \ [ "$base" = "pcreperform" ] ; then toc="" fi echo " Making $base.html" ../132html $toc $base <$file >html/$base.html if [ $? != 0 ] ; then exit 1; fi done # End of documentation processing cd .. echo Documentation done # These files are detrailed; do not detrail the test data because there may be # significant trailing spaces. The configure files are also omitted from the # detrailing. files="\ Makefile.am \ Makefile.in \ configure.ac \ README \ LICENCE \ COPYING \ AUTHORS \ NEWS \ NON-UNIX-USE \ INSTALL \ 132html \ CleanTxt \ Detrail \ ChangeLog \ CMakeLists.txt \ RunGrepTest \ RunTest \ RunTest.bat \ pcre-config.in \ libpcre.pc.in \ libpcrecpp.pc.in \ config.h \ config.h.in \ pcre_printint.src \ pcre_chartables.c.dist \ pcredemo.c \ pcregrep.c \ pcretest.c \ dftables.c \ pcreposix.c \ pcreposix.h \ pcre.h.in \ pcre_internal.h pcre_compile.c \ pcre_config.c \ pcre_dfa_exec.c \ pcre_exec.c \ pcre_fullinfo.c \ pcre_get.c \ pcre_globals.c \ pcre_info.c \ pcre_maketables.c \ pcre_newline.c \ pcre_ord2utf8.c \ pcre_refcount.c \ pcre_study.c \ pcre_tables.c \ pcre_try_flipped.c \ pcre_ucp_searchfuncs.c \ pcre_valid_utf8.c \ pcre_version.c \ pcre_xclass.c \ pcre_scanner.cc \ pcre_scanner.h \ pcre_scanner_unittest.cc \ pcrecpp.cc \ pcrecpp.h \ pcrecpparg.h.in \ pcrecpp_unittest.cc \ pcre_stringpiece.cc \ pcre_stringpiece.h.in \ pcre_stringpiece_unittest.cc \ perltest.pl \ ucp.h \ ucpinternal.h \ ucptable.h \ makevp.bat \ pcre.def \ libpcre.def \ libpcreposix.def" echo Detrailing ./Detrail $files doc/p* doc/html/* echo Doing basic configure to get default pcre.h and config.h # This is in case the caller has set aliases (as I do - PH) unset cp ls mv rm ./configure >/dev/null echo Converting pcre.h and config.h to generic forms cp -f pcre.h pcre.h.generic perl <<'END' open(IN, "config.h.generic") || die "Can't open config.h.generic: $!\n"; while () { if (/^#define\s(?!PACKAGE)(\w+)/) { print OUT "#ifndef $1\n"; print OUT; print OUT "#endif\n"; } else { print OUT; } } close IN; close OUT; END echo Done #End syncevolution-1.5/src/synthesis/src/pcre/README0000644000373300037200000007717212424517753023144 0ustar00nightlyallusers00000000000000README file for PCRE (Perl-compatible regular expression library) ----------------------------------------------------------------- The latest release of PCRE is always available from ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz There is a mailing list for discussion about the development of PCRE at pcre-dev@exim.org Please read the NEWS file if you are upgrading from a previous release. The contents of this README file are: The PCRE APIs Documentation for PCRE Contributions by users of PCRE Building PCRE on non-Unix systems Building PCRE on Unix-like systems Retrieving configuration information on Unix-like systems Shared libraries on Unix-like systems Cross-compiling on Unix-like systems Using HP's ANSI C++ compiler (aCC) Making new tarballs Testing PCRE Character tables File manifest The PCRE APIs ------------- PCRE is written in C, and it has its own API. The distribution also includes a set of C++ wrapper functions (see the pcrecpp man page for details), courtesy of Google Inc. In addition, there is a set of C wrapper functions that are based on the POSIX regular expression API (see the pcreposix man page). These end up in the library called libpcreposix. Note that this just provides a POSIX calling interface to PCRE; the regular expressions themselves still follow Perl syntax and semantics. The POSIX API is restricted, and does not give full access to all of PCRE's facilities. The header file for the POSIX-style functions is called pcreposix.h. The official POSIX name is regex.h, but I did not want to risk possible problems with existing files of that name by distributing it that way. To use PCRE with an existing program that uses the POSIX API, pcreposix.h will have to be renamed or pointed at by a link. If you are using the POSIX interface to PCRE and there is already a POSIX regex library installed on your system, as well as worrying about the regex.h header file (as mentioned above), you must also take care when linking programs to ensure that they link with PCRE's libpcreposix library. Otherwise they may pick up the POSIX functions of the same name from the other library. One way of avoiding this confusion is to compile PCRE with the addition of -Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the compiler flags (CFLAGS if you are using "configure" -- see below). This has the effect of renaming the functions so that the names no longer clash. Of course, you have to do the same thing for your applications, or write them using the new names. Documentation for PCRE ---------------------- If you install PCRE in the normal way on a Unix-like system, you will end up with a set of man pages whose names all start with "pcre". The one that is just called "pcre" lists all the others. In addition to these man pages, the PCRE documentation is supplied in two other forms: 1. There are files called doc/pcre.txt, doc/pcregrep.txt, and doc/pcretest.txt in the source distribution. The first of these is a concatenation of the text forms of all the section 3 man pages except those that summarize individual functions. The other two are the text forms of the section 1 man pages for the pcregrep and pcretest commands. These text forms are provided for ease of scanning with text editors or similar tools. They are installed in /share/doc/pcre, where is the installation prefix (defaulting to /usr/local). 2. A set of files containing all the documentation in HTML form, hyperlinked in various ways, and rooted in a file called index.html, is distributed in doc/html and installed in /share/doc/pcre/html. Contributions by users of PCRE ------------------------------ You can find contributions from PCRE users in the directory ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib There is a README file giving brief descriptions of what they are. Some are complete in themselves; others are pointers to URLs containing relevant files. Some of this material is likely to be well out-of-date. Several of the earlier contributions provided support for compiling PCRE on various flavours of Windows (I myself do not use Windows). Nowadays there is more Windows support in the standard distribution, so these contibutions have been archived. Building PCRE on non-Unix systems --------------------------------- For a non-Unix system, please read the comments in the file NON-UNIX-USE, though if your system supports the use of "configure" and "make" you may be able to build PCRE in the same way as for Unix-like systems. PCRE has been compiled on many different operating systems. It should be straightforward to build PCRE on any system that has a Standard C compiler and library, because it uses only Standard C functions. Building PCRE on Unix-like systems ---------------------------------- If you are using HP's ANSI C++ compiler (aCC), please see the special note in the section entitled "Using HP's ANSI C++ compiler (aCC)" below. The following instructions assume the use of the widely used "configure, make, make install" process. There is also some experimental support for "cmake" in the PCRE distribution, but it is incomplete and not documented. However, if you are a "cmake" user, you might want to try it. To build PCRE on a Unix-like system, first run the "configure" command from the PCRE distribution directory, with your current directory set to the directory where you want the files to be created. This command is a standard GNU "autoconf" configuration script, for which generic instructions are supplied in the file INSTALL. Most commonly, people build PCRE within its own distribution directory, and in this case, on many systems, just running "./configure" is sufficient. However, the usual methods of changing standard defaults are available. For example: CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local specifies that the C compiler should be run with the flags '-O2 -Wall' instead of the default, and that "make install" should install PCRE under /opt/local instead of the default /usr/local. If you want to build in a different directory, just run "configure" with that directory as current. For example, suppose you have unpacked the PCRE source into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: cd /build/pcre/pcre-xxx /source/pcre/pcre-xxx/configure PCRE is written in C and is normally compiled as a C library. However, it is possible to build it as a C++ library, though the provided building apparatus does not have any features to support this. There are some optional features that can be included or omitted from the PCRE library. You can read more about them in the pcrebuild man page. . If you want to suppress the building of the C++ wrapper library, you can add --disable-cpp to the "configure" command. Otherwise, when "configure" is run, it will try to find a C++ compiler and C++ header files, and if it succeeds, it will try to build the C++ wrapper. . If you want to make use of the support for UTF-8 character strings in PCRE, you must add --enable-utf8 to the "configure" command. Without it, the code for handling UTF-8 is not included in the library. (Even when included, it still has to be enabled by an option at run time.) . If, in addition to support for UTF-8 character strings, you want to include support for the \P, \p, and \X sequences that recognize Unicode character properties, you must add --enable-unicode-properties to the "configure" command. This adds about 30K to the size of the library (in the form of a property table); only the basic two-letter properties such as Lu are supported. . You can build PCRE to recognize either CR or LF or the sequence CRLF or any of the preceding, or any of the Unicode newline sequences as indicating the end of a line. Whatever you specify at build time is the default; the caller of PCRE can change the selection at run time. The default newline indicator is a single LF character (the Unix standard). You can specify the default newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf or --enable-newline-is-crlf or --enable-newline-is-anycrlf or --enable-newline-is-any to the "configure" command, respectively. If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of the standard tests will fail, because the lines in the test files end with LF. Even if the files are edited to change the line endings, there are likely to be some failures. With --enable-newline-is-anycrlf or --enable-newline-is-any, many tests should succeed, but there may be some failures. . When called via the POSIX interface, PCRE uses malloc() to get additional storage for processing capturing parentheses if there are more than 10 of them in a pattern. You can increase this threshold by setting, for example, --with-posix-malloc-threshold=20 on the "configure" command. . PCRE has a counter that can be set to limit the amount of resources it uses. If the limit is exceeded during a match, the match fails. The default is ten million. You can change the default by setting, for example, --with-match-limit=500000 on the "configure" command. This is just the default; individual calls to pcre_exec() can supply their own value. There is more discussion on the pcreapi man page. . There is a separate counter that limits the depth of recursive function calls during a matching process. This also has a default of ten million, which is essentially "unlimited". You can change the default by setting, for example, --with-match-limit-recursion=500000 Recursive function calls use up the runtime stack; running out of stack can cause programs to crash in strange ways. There is a discussion about stack sizes in the pcrestack man page. . The default maximum compiled pattern size is around 64K. You can increase this by adding --with-link-size=3 to the "configure" command. You can increase it even more by setting --with-link-size=4, but this is unlikely ever to be necessary. Increasing the internal link size will reduce performance. . You can build PCRE so that its internal match() function that is called from pcre_exec() does not call itself recursively. Instead, it uses memory blocks obtained from the heap via the special functions pcre_stack_malloc() and pcre_stack_free() to save data that would otherwise be saved on the stack. To build PCRE like this, use --disable-stack-for-recursion on the "configure" command. PCRE runs more slowly in this mode, but it may be necessary in environments with limited stack sizes. This applies only to the pcre_exec() function; it does not apply to pcre_dfa_exec(), which does not use deeply nested recursion. There is a discussion about stack sizes in the pcrestack man page. . For speed, PCRE uses four tables for manipulating and identifying characters whose code point values are less than 256. By default, it uses a set of tables for ASCII encoding that is part of the distribution. If you specify --enable-rebuild-chartables a program called dftables is compiled and run in the default C locale when you obey "make". It builds a source file called pcre_chartables.c. If you do not specify this option, pcre_chartables.c is created as a copy of pcre_chartables.c.dist. See "Character tables" below for further information. . It is possible to compile PCRE for use on systems that use EBCDIC as their default character code (as opposed to ASCII) by specifying --enable-ebcdic This automatically implies --enable-rebuild-chartables (see above). The "configure" script builds the following files for the basic C library: . Makefile is the makefile that builds the library . config.h contains build-time configuration options for the library . pcre.h is the public PCRE header file . pcre-config is a script that shows the settings of "configure" options . libpcre.pc is data for the pkg-config command . libtool is a script that builds shared and/or static libraries . RunTest is a script for running tests on the basic C library . RunGrepTest is a script for running tests on the pcregrep command Versions of config.h and pcre.h are distributed in the PCRE tarballs under the names config.h.generic and pcre.h.generic. These are provided for the benefit of those who have to built PCRE without the benefit of "configure". If you use "configure", the .generic versions are not used. If a C++ compiler is found, the following files are also built: . libpcrecpp.pc is data for the pkg-config command . pcrecpparg.h is a header file for programs that call PCRE via the C++ wrapper . pcre_stringpiece.h is the header for the C++ "stringpiece" functions The "configure" script also creates config.status, which is an executable script that can be run to recreate the configuration, and config.log, which contains compiler output from tests that "configure" runs. Once "configure" has run, you can run "make". It builds two libraries, called libpcre and libpcreposix, a test program called pcretest, a demonstration program called pcredemo, and the pcregrep command. If a C++ compiler was found on your system, "make" also builds the C++ wrapper library, which is called libpcrecpp, and some test programs called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest. Building the C++ wrapper can be disabled by adding --disable-cpp to the "configure" command. The command "make check" runs all the appropriate tests. Details of the PCRE tests are given below in a separate section of this document. You can use "make install" to install PCRE into live directories on your system. The following are installed (file names are all relative to the that is set when "configure" is run): Commands (bin): pcretest pcregrep pcre-config Libraries (lib): libpcre libpcreposix libpcrecpp (if C++ support is enabled) Configuration information (lib/pkgconfig): libpcre.pc libpcrecpp.pc (if C++ support is enabled) Header files (include): pcre.h pcreposix.h pcre_scanner.h ) pcre_stringpiece.h ) if C++ support is enabled pcrecpp.h ) pcrecpparg.h ) Man pages (share/man/man{1,3}): pcregrep.1 pcretest.1 pcre.3 pcre*.3 (lots more pages, all starting "pcre") HTML documentation (share/doc/pcre/html): index.html *.html (lots more pages, hyperlinked from index.html) Text file documentation (share/doc/pcre): AUTHORS COPYING ChangeLog LICENCE NEWS README pcre.txt (a concatenation of the man(3) pages) pcretest.txt the pcretest man page pcregrep.txt the pcregrep man page Note that the pcredemo program that is built by "configure" is *not* installed anywhere. It is a demonstration for programmers wanting to use PCRE. If you want to remove PCRE from your system, you can run "make uninstall". This removes all the files that "make install" installed. However, it does not remove any directories, because these are often shared with other programs. Retrieving configuration information on Unix-like systems --------------------------------------------------------- Running "make install" installs the command pcre-config, which can be used to recall information about the PCRE configuration and installation. For example: pcre-config --version prints the version number, and pcre-config --libs outputs information about where the library is installed. This command can be included in makefiles for programs that use PCRE, saving the programmer from having to remember too many details. The pkg-config command is another system for saving and retrieving information about installed libraries. Instead of separate commands for each library, a single command is used. For example: pkg-config --cflags pcre The data is held in *.pc files that are installed in a directory called /lib/pkgconfig. Shared libraries on Unix-like systems ------------------------------------- The default distribution builds PCRE as shared libraries and static libraries, as long as the operating system supports shared libraries. Shared library support relies on the "libtool" script which is built as part of the "configure" process. The libtool script is used to compile and link both shared and static libraries. They are placed in a subdirectory called .libs when they are newly built. The programs pcretest and pcregrep are built to use these uninstalled libraries (by means of wrapper scripts in the case of shared libraries). When you use "make install" to install shared libraries, pcregrep and pcretest are automatically re-built to use the newly installed shared libraries before being installed themselves. However, the versions left in the build directory still use the uninstalled libraries. To build PCRE using static libraries only you must use --disable-shared when configuring it. For example: ./configure --prefix=/usr/gnu --disable-shared Then run "make" in the usual way. Similarly, you can use --disable-static to build only shared libraries. Cross-compiling on Unix-like systems ------------------------------------ You can specify CC and CFLAGS in the normal way to the "configure" command, in order to cross-compile PCRE for some other host. However, you should NOT specify --enable-rebuild-chartables, because if you do, the dftables.c source file is compiled and run on the local host, in order to generate the inbuilt character tables (the pcre_chartables.c file). This will probably not work, because dftables.c needs to be compiled with the local compiler, not the cross compiler. When --enable-rebuild-chartables is not specified, pcre_chartables.c is created by making a copy of pcre_chartables.c.dist, which is a default set of tables that assumes ASCII code. Cross-compiling with the default tables should not be a problem. If you need to modify the character tables when cross-compiling, you should move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and run it on the local host to make a new version of pcre_chartables.c.dist. Then when you cross-compile PCRE this new version of the tables will be used. Using HP's ANSI C++ compiler (aCC) ---------------------------------- Unless C++ support is disabled by specifying the "--disable-cpp" option of the "configure" script, you must include the "-AA" option in the CXXFLAGS environment variable in order for the C++ components to compile correctly. Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby needed libraries fail to get included when specifying the "-AA" compiler option. If you experience unresolved symbols when linking the C++ programs, use the workaround of specifying the following environment variable prior to running the "configure" script: CXXLDFLAGS="-lstd_v2 -lCsup_v2" Making new tarballs ------------------- The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and zip formats. The command "make distcheck" does the same, but then does a trial build of the new distribution to ensure that it works. If you have modified any of the man page sources in the doc directory, you should first run the PrepareRelease script before making a distribution. This script creates the .txt and HTML forms of the documentation from the man pages. Testing PCRE ------------ To test the basic PCRE library on a Unix system, run the RunTest script that is created by the configuring process. There is also a script called RunGrepTest that tests the options of the pcregrep command. If the C++ wrapper library is built, three test programs called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest are also built. Both the scripts and all the program tests are run if you obey "make check" or "make test". For other systems, see the instructions in NON-UNIX-USE. The RunTest script runs the pcretest test program (which is documented in its own man page) on each of the testinput files in the testdata directory in turn, and compares the output with the contents of the corresponding testoutput files. A file called testtry is used to hold the main output from pcretest (testsavedregex is also used as a working file). To run pcretest on just one of the test files, give its number as an argument to RunTest, for example: RunTest 2 The first test file can also be fed directly into the perltest.pl script to check that Perl gives the same results. The only difference you should see is in the first few lines, where the Perl version is given instead of the PCRE version. The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(), pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error detection, and run-time flags that are specific to PCRE, as well as the POSIX wrapper API. It also uses the debugging flags to check some of the internals of pcre_compile(). If you build PCRE with a locale setting that is not the standard C locale, the character tables may be different (see next paragraph). In some cases, this may cause failures in the second set of tests. For example, in a locale where the isprint() function yields TRUE for characters in the range 128-255, the use of [:isascii:] inside a character class defines a different set of characters, and this shows up in this test as a difference in the compiled code, which is being listed for checking. Where the comparison test output contains [\x00-\x7f] the test will contain [\x00-\xff], and similarly in some other cases. This is not a bug in PCRE. The third set of tests checks pcre_maketables(), the facility for building a set of character tables for a specific locale and using them instead of the default tables. The tests make use of the "fr_FR" (French) locale. Before running the test, the script checks for the presence of this locale by running the "locale" command. If that command fails, or if it doesn't include "fr_FR" in the list of available locales, the third test cannot be run, and a comment is output to say why. If running this test produces instances of the error ** Failed to set locale "fr_FR" in the comparison output, it means that locale is not available on your system, despite being listed by "locale". This does not mean that PCRE is broken. [If you are trying to run this test on Windows, you may be able to get it to work by changing "fr_FR" to "french" everywhere it occurs.] The fourth test checks the UTF-8 support. It is not run automatically unless PCRE is built with UTF-8 support. To do this you must set --enable-utf8 when running "configure". This file can be also fed directly to the perltest script, provided you are running Perl 5.8 or higher. (For Perl 5.6, a small patch, commented in the script, can be be used.) The fifth test checks error handling with UTF-8 encoding, and internal UTF-8 features of PCRE that are not relevant to Perl. The sixth test checks the support for Unicode character properties. It it not run automatically unless PCRE is built with Unicode property support. To to this you must set --enable-unicode-properties when running "configure". The seventh, eighth, and ninth tests check the pcre_dfa_exec() alternative matching function, in non-UTF-8 mode, UTF-8 mode, and UTF-8 mode with Unicode property support, respectively. The eighth and ninth tests are not run automatically unless PCRE is build with the relevant support. Character tables ---------------- For speed, PCRE uses four tables for manipulating and identifying characters whose code point values are less than 256. The final argument of the pcre_compile() function is a pointer to a block of memory containing the concatenated tables. A call to pcre_maketables() can be used to generate a set of tables in the current locale. If the final argument for pcre_compile() is passed as NULL, a set of default tables that is built into the binary is used. The source file called pcre_chartables.c contains the default set of tables. By default, this is created as a copy of pcre_chartables.c.dist, which contains tables for ASCII coding. However, if --enable-rebuild-chartables is specified for ./configure, a different version of pcre_chartables.c is built by the program dftables (compiled from dftables.c), which uses the ANSI C character handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table sources. This means that the default C locale which is set for your system will control the contents of these default tables. You can change the default tables by editing pcre_chartables.c and then re-building PCRE. If you do this, you should take care to ensure that the file does not get automatically re-generated. The best way to do this is to move pcre_chartables.c.dist out of the way and replace it with your customized tables. When the dftables program is run as a result of --enable-rebuild-chartables, it uses the default C locale that is set on your system. It does not pay attention to the LC_xxx environment variables. In other words, it uses the system's default locale rather than whatever the compiling user happens to have set. If you really do want to build a source set of character tables in a locale that is specified by the LC_xxx variables, you can run the dftables program by hand with the -L option. For example: ./dftables -L pcre_chartables.c.special The first two 256-byte tables provide lower casing and case flipping functions, respectively. The next table consists of three 32-byte bit maps which identify digits, "word" characters, and white space, respectively. These are used when building 32-byte bit maps that represent character classes for code points less than 256. The final 256-byte table has bits indicating various character types, as follows: 1 white space character 2 letter 4 decimal digit 8 hexadecimal digit 16 alphanumeric or '_' 128 regular expression metacharacter or binary zero You should not alter the set of characters that contain the 128 bit, as that will cause PCRE to malfunction. File manifest ------------- The distribution should contain the following files: (A) Source files of the PCRE library functions and their headers: dftables.c auxiliary program for building pcre_chartables.c when --enable-rebuild-chartables is specified pcre_chartables.c.dist a default set of character tables that assume ASCII coding; used, unless --enable-rebuild-chartables is specified, by copying to pcre_chartables.c pcreposix.c ) pcre_compile.c ) pcre_config.c ) pcre_dfa_exec.c ) pcre_exec.c ) pcre_fullinfo.c ) pcre_get.c ) sources for the functions in the library, pcre_globals.c ) and some internal functions that they use pcre_info.c ) pcre_maketables.c ) pcre_newline.c ) pcre_ord2utf8.c ) pcre_refcount.c ) pcre_study.c ) pcre_tables.c ) pcre_try_flipped.c ) pcre_ucp_searchfuncs.c ) pcre_valid_utf8.c ) pcre_version.c ) pcre_xclass.c ) pcre_printint.src ) debugging function that is #included in pcretest, ) and can also be #included in pcre_compile() pcre.h.in template for pcre.h when built by "configure" pcreposix.h header for the external POSIX wrapper API pcre_internal.h header for internal use ucp.h ) headers concerned with ucpinternal.h ) Unicode property handling ucptable.h ) (this one is the data table) config.h.in template for config.h, which is built by "configure" pcrecpp.h public header file for the C++ wrapper pcrecpparg.h.in template for another C++ header file pcre_scanner.h public header file for C++ scanner functions pcrecpp.cc ) pcre_scanner.cc ) source for the C++ wrapper library pcre_stringpiece.h.in template for pcre_stringpiece.h, the header for the C++ stringpiece functions pcre_stringpiece.cc source for the C++ stringpiece functions (B) Source files for programs that use PCRE: pcredemo.c simple demonstration of coding calls to PCRE pcregrep.c source of a grep utility that uses PCRE pcretest.c comprehensive test program (C) Auxiliary files: 132html script to turn "man" pages into HTML AUTHORS information about the author of PCRE ChangeLog log of changes to the code CleanTxt script to clean nroff output for txt man pages Detrail script to remove trailing spaces HACKING some notes about the internals of PCRE INSTALL generic installation instructions LICENCE conditions for the use of PCRE COPYING the same, using GNU's standard name Makefile.in ) template for Unix Makefile, which is built by ) "configure" Makefile.am ) the automake input that was used to create ) Makefile.in NEWS important changes in this release NON-UNIX-USE notes on building PCRE on non-Unix systems PrepareRelease script to make preparations for "make dist" README this file RunTest a Unix shell script for running tests RunGrepTest a Unix shell script for pcregrep tests aclocal.m4 m4 macros (generated by "aclocal") config.guess ) files used by libtool, config.sub ) used only when building a shared library configure a configuring shell script (built by autoconf) configure.ac ) the autoconf input that was used to build ) "configure" and config.h depcomp ) script to find program dependencies, generated by ) automake doc/*.3 man page sources for the PCRE functions doc/*.1 man page sources for pcregrep and pcretest doc/index.html.src the base HTML page doc/html/* HTML documentation doc/pcre.txt plain text version of the man pages doc/pcretest.txt plain text documentation of test program doc/perltest.txt plain text documentation of Perl test program install-sh a shell script for installing files libpcre.pc.in template for libpcre.pc for pkg-config libpcrecpp.pc.in template for libpcrecpp.pc for pkg-config ltmain.sh file used to build a libtool script missing ) common stub for a few missing GNU programs while ) installing, generated by automake mkinstalldirs script for making install directories perltest.pl Perl test program pcre-config.in source of script which retains PCRE information pcrecpp_unittest.cc ) pcre_scanner_unittest.cc ) test programs for the C++ wrapper pcre_stringpiece_unittest.cc ) testdata/testinput* test data for main library tests testdata/testoutput* expected test results testdata/grep* input and output for pcregrep tests (D) Auxiliary files for cmake support CMakeLists.txt config-cmake.h.in (E) Auxiliary files for VPASCAL makevp.bat makevp_c.txt makevp_l.txt pcregexp.pas (F) Auxiliary files for building PCRE "by hand" pcre.h.generic ) a version of the public PCRE header file ) for use in non-"configure" environments config.h.generic ) a version of config.h for use in non-"configure" ) environments (F) Miscellaneous RunTest.bat a script for running tests under Windows Philip Hazel Email local part: ph10 Email domain: cam.ac.uk Last updated: 24 April 2007 syncevolution-1.5/src/synthesis/src/pcre/RunGrepTest0000644000373300037200000003041712424517753024420 0ustar00nightlyallusers00000000000000#! /bin/sh # Run pcregrep tests. The assumption is that the PCRE tests check the library # itself. What we are checking here is the file handling and options that are # supported by pcregrep. # Set the C locale, so that sort(1) behaves predictably. LC_ALL=C export LC_ALL pcregrep=`pwd`/pcregrep echo " " echo "Testing pcregrep" $pcregrep -V cf="diff -ub" valgrind= while [ $# -gt 0 ] ; do case $1 in valgrind) valgrind="valgrind -q --leak-check=no";; *) echo "Unknown argument $1"; exit 1;; esac shift done # If PCRE has been built in a directory other than the source directory, and # this test is being run from "make check" as usual, then $(srcdir) will be # set. If not, set it to the current directory. We then arrange to run the # pcregrep command in the source directory so that the file names that appear # in the output are always the same. if [ -z "$srcdir" -o ! -d "$srcdir/testdata" ] ; then srcdir=. fi # Check for the availability of UTF-8 support ./pcretest -C | ./pcregrep "No UTF-8 support" >/dev/null utf8=$? echo "---------------------------- Test 1 ------------------------------" >testtry (cd $srcdir; $valgrind $pcregrep PATTERN ./testdata/grepinput) >>testtry echo "---------------------------- Test 2 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep '^PATTERN' ./testdata/grepinput) >>testtry echo "---------------------------- Test 3 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput) >>testtry echo "---------------------------- Test 4 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -ic PATTERN ./testdata/grepinput) >>testtry echo "---------------------------- Test 5 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -in PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 6 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -inh PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 7 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -il PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 8 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -l PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 9 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -q PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "RC=$?" >>testtry echo "---------------------------- Test 10 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -q NEVER-PATTERN ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "RC=$?" >>testtry echo "---------------------------- Test 11 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -vn pattern ./testdata/grepinputx) >>testtry echo "---------------------------- Test 12 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -ix pattern ./testdata/grepinputx) >>testtry echo "---------------------------- Test 13 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -f./testdata/greplist ./testdata/grepinputx) >>testtry echo "---------------------------- Test 14 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -w pat ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 15 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep 'abc^*' ./testdata/grepinput) 2>>testtry >>testtry echo "---------------------------- Test 16 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep abc ./testdata/grepinput ./testdata/nonexistfile) 2>>testtry >>testtry echo "---------------------------- Test 17 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -M 'the\noutput' ./testdata/grepinput) >>testtry echo "---------------------------- Test 18 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -Mn '(the\noutput|dog\.\n--)' ./testdata/grepinput) >>testtry echo "---------------------------- Test 19 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -Mix 'Pattern' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 20 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -Mixn 'complete pair\nof lines' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 21 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -nA3 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 22 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -nB3 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 23 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -C3 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 24 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -A9 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 25 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -nB9 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 26 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -A9 -B9 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 27 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -A10 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 28 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -nB10 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 29 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -C12 -B10 'four' ./testdata/grepinputx) >>testtry echo "---------------------------- Test 30 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -inB3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 31 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -inA3 'pattern' ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 32 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -L 'fox' ./testdata/grepinput ./testdata/grepinputx) >>testtry echo "---------------------------- Test 33 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep 'fox' ./testdata/grepnonexist) >>testtry 2>&1 echo "RC=$?" >>testtry echo "---------------------------- Test 34 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -s 'fox' ./testdata/grepnonexist) >>testtry 2>&1 echo "RC=$?" >>testtry echo "---------------------------- Test 35 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -L -r --include=grepinputx 'fox' ./testdata) >>testtry echo "RC=$?" >>testtry echo "---------------------------- Test 36 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -L -r --include=grepinput --exclude 'grepinput$' 'fox' ./testdata | sort) >>testtry echo "RC=$?" >>testtry echo "---------------------------- Test 37 -----------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep '^(a+)*\d' ./testdata/grepinput) >>testtry 2>teststderr echo "RC=$?" >>testtry echo "======== STDERR ========" >>testtry cat teststderr >>testtry echo "---------------------------- Test 38 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep '>\x00<' ./testdata/grepinput) >>testtry echo "---------------------------- Test 39 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -A1 'before the binary zero' ./testdata/grepinput) >>testtry echo "---------------------------- Test 40 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -B1 'after the binary zero' ./testdata/grepinput) >>testtry echo "---------------------------- Test 41 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -B1 -o '\w+ the binary zero' ./testdata/grepinput) >>testtry echo "---------------------------- Test 41 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -B1 -onH '\w+ the binary zero' ./testdata/grepinput) >>testtry echo "---------------------------- Test 42 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -on 'before|zero|after' ./testdata/grepinput) >>testtry echo "---------------------------- Test 43 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -on -e before -e zero -e after ./testdata/grepinput) >>testtry echo "---------------------------- Test 44 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -on -f ./testdata/greplist -e binary ./testdata/grepinput) >>testtry echo "---------------------------- Test 45 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -e abc -e '(unclosed' ./testdata/grepinput) 2>>testtry >>testtry echo "---------------------------- Test 46 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -Fx "AB.VE elephant" ./testdata/grepinput) >>testtry echo "---------------------------- Test 47 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -F "AB.VE elephant" ./testdata/grepinput) >>testtry echo "---------------------------- Test 48 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -F -e DATA -e "AB.VE elephant" ./testdata/grepinput) >>testtry echo "---------------------------- Test 49 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep "^(abc|def|ghi|jkl)" ./testdata/grepinputx) >>testtry echo "---------------------------- Test 50 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -Mv "brown\sfox" ./testdata/grepinputv) >>testtry # Now compare the results. $cf $srcdir/testdata/grepoutput testtry if [ $? != 0 ] ; then exit 1; fi # These tests require UTF-8 support if [ $utf8 -ne 0 ] ; then echo "Testing pcregrep UTF-8 features" echo "---------------------------- Test U1 ------------------------------" >testtry (cd $srcdir; $valgrind $pcregrep -n -u --newline=any "^X" ./testdata/grepinput8) >>testtry echo "---------------------------- Test U2 ------------------------------" >>testtry (cd $srcdir; $valgrind $pcregrep -n -u -C 3 --newline=any "Match" ./testdata/grepinput8) >>testtry $cf $srcdir/testdata/grepoutput8 testtry if [ $? != 0 ] ; then exit 1; fi else echo "Skipping pcregrep UTF-8 tests: no UTF-8 support in PCRE library" fi # We go to some contortions to try to ensure that the tests for the various # newline settings will work in environments where the normal newline sequence # is not \n. Do not use exported files, whose line endings might be changed. # Instead, create an input file using printf so that its contents are exactly # what we want. Note the messy fudge to get printf to write a string that # starts with a hyphen. echo "Testing pcregrep newline settings" printf "abc\rdef\r\nghi\njkl" >testNinput printf "%c--------------------------- Test N1 ------------------------------\r\n" - >testtry $valgrind $pcregrep -n -N CR "^(abc|def|ghi|jkl)" testNinput >>testtry printf "%c--------------------------- Test N2 ------------------------------\r\n" - >>testtry $valgrind $pcregrep -n --newline=crlf "^(abc|def|ghi|jkl)" testNinput >>testtry printf "%c--------------------------- Test N3 ------------------------------\r\n" - >>testtry pattern=`printf 'def\rjkl'` $valgrind $pcregrep -n --newline=cr -F "$pattern" testNinput >>testtry printf "%c--------------------------- Test N4 ------------------------------\r\n" - >>testtry pattern=`printf 'xxx\r\njkl'` $valgrind $pcregrep -n --newline=crlf -F "$pattern" testNinput >>testtry printf "%c--------------------------- Test N5 ------------------------------\r\n" - >>testtry $valgrind $pcregrep -n --newline=any "^(abc|def|ghi|jkl)" testNinput >>testtry printf "%c--------------------------- Test N6 ------------------------------\r\n" - >>testtry $valgrind $pcregrep -n --newline=anycrlf "^(abc|def|ghi|jkl)" testNinput >>testtry $cf $srcdir/testdata/grepoutputN testtry if [ $? != 0 ] ; then exit 1; fi exit 0 # End syncevolution-1.5/src/synthesis/src/pcre/RunTest0000644000373300037200000001534312424517753023603 0ustar00nightlyallusers00000000000000#! /bin/sh # Run PCRE tests cf="diff -u" valgrind= testdata=testdata if [ -n "$srcdir" -a -d "$srcdir" ] ; then testdata="$srcdir/testdata" fi # Find which optional facilities are available case `./pcretest -C | ./pcregrep 'Internal link size'` in *2) link_size=2;; *3) link_size=3;; *4) link_size=4;; *) echo "Failed to find internal link size"; exit 1;; esac ./pcretest -C | ./pcregrep 'No UTF-8 support' >/dev/null utf8=$? ./pcretest -C | ./pcregrep 'No Unicode properties support' >/dev/null ucp=$? # Select which tests to run; for those that are explicitly requested, check # that the necessary optional facilities are available. do1=no do2=no do3=no do4=no do5=no do6=no do7=no do8=no do9=no do10=no while [ $# -gt 0 ] ; do case $1 in 1) do1=yes;; 2) do2=yes;; 3) do3=yes;; 4) do4=yes;; 5) do5=yes;; 6) do6=yes;; 7) do7=yes;; 8) do8=yes;; 9) do9=yes;; 10) do10=yes;; valgrind) valgrind="valgrind -q";; *) echo "Unknown test number $1"; exit 1;; esac shift done if [ $utf8 -eq 0 ] ; then if [ $do4 = yes ] ; then echo "Can't run test 4 because UTF-8 support is not configured" exit 1 fi if [ $do5 = yes ] ; then echo "Can't run test 5 because UTF-8 support is not configured" exit 1 fi if [ $do8 = yes ] ; then echo "Can't run test 8 because UTF-8 support is not configured" exit 1 fi fi if [ $ucp -eq 0 ] ; then if [ $do6 = yes ] ; then echo "Can't run test 6 because Unicode property support is not configured" exit 1 fi if [ $do9 = yes ] ; then echo "Can't run test 9 because Unicode property support is not configured" exit 1 fi if [ $do10 = yes ] ; then echo "Can't run test 10 because Unicode property support is not configured" exit 1 fi fi if [ $link_size -ne 2 ] ; then if [ $do10 = yes ] ; then echo "Can't run test 10 because the link size ($link_size) is not 2" exit 1 fi fi # If no specific tests were requested, select all that are relevant. if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \ $do5 = no -a $do6 = no -a $do7 = no -a $do8 = no -a \ $do9 = no -a $do10 = no ] ; then do1=yes do2=yes do3=yes if [ $utf8 -ne 0 ] ; then do4=yes; fi if [ $utf8 -ne 0 ] ; then do5=yes; fi if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do6=yes; fi do7=yes if [ $utf8 -ne 0 ] ; then do8=yes; fi if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do9=yes; fi if [ $link_size -eq 2 -a $ucp -ne 0 ] ; then do10=yes; fi fi # Show which release echo "" echo PCRE C library tests ./pcretest /dev/null # Primary test, Perl-compatible if [ $do1 = yes ] ; then echo "Test 1: main functionality (Perl compatible)" $valgrind ./pcretest -q $testdata/testinput1 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput1 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi # PCRE tests that are not Perl-compatible - API & error tests, mostly if [ $do2 = yes ] ; then echo "Test 2: API and error handling (not Perl compatible)" $valgrind ./pcretest -q $testdata/testinput2 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput2 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi # Locale-specific tests, provided that either the "fr_FR" or the "french" # locale is available. The former is the Unix-like standard; the latter is # for Windows. if [ $do3 = yes ] ; then locale -a | grep '^fr_FR$' >/dev/null if [ $? -eq 0 ] ; then locale=fr_FR infile=$testdata/testinput3 outfile=$testdata/testoutput3 else locale -a | grep '^french$' >/dev/null if [ $? -eq 0 ] ; then locale=french sed 's/fr_FR/french/' $testdata/testinput3 >test3input sed 's/fr_FR/french/' $testdata/testoutput3 >test3output infile=test3input outfile=test3output else locale= fi fi if [ "$locale" != "" ] ; then echo "Test 3: locale-specific features (using '$locale' locale)" $valgrind ./pcretest -q $infile testtry if [ $? = 0 ] ; then $cf $outfile testtry if [ $? != 0 ] ; then echo " " echo "Locale test did not run entirely successfully." echo "This usually means that there is a problem with the locale" echo "settings rather than a bug in PCRE." else echo "OK" fi else exit 1 fi else echo "Cannot test locale-specific features - neither the 'fr_FR' nor the" echo "'french' locale exists, or the \"locale\" command is not available" echo "to check for them." echo " " fi fi # Additional tests for UTF8 support if [ $do4 = yes ] ; then echo "Test 4: UTF-8 support (Perl compatible)" $valgrind ./pcretest -q $testdata/testinput4 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput4 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi if [ $do5 = yes ] ; then echo "Test 5: API and internals for UTF-8 support (not Perl compatible)" $valgrind ./pcretest -q $testdata/testinput5 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput5 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi if [ $do6 = yes ] ; then echo "Test 6: Unicode property support" $valgrind ./pcretest -q $testdata/testinput6 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput6 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi # Tests for DFA matching support if [ $do7 = yes ] ; then echo "Test 7: DFA matching" $valgrind ./pcretest -q -dfa $testdata/testinput7 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput7 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi if [ $do8 = yes ] ; then echo "Test 8: DFA matching with UTF-8" $valgrind ./pcretest -q -dfa $testdata/testinput8 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput8 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi if [ $do9 = yes ] ; then echo "Test 9: DFA matching with Unicode properties" $valgrind ./pcretest -q -dfa $testdata/testinput9 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput9 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi # Test of internal offsets and code sizes. This test is run only when there # is Unicode property support and the link size is 2. The actual tests are # mostly the same as in some of the above, but in this test we inspect some # offsets and sizes that require a known link size. This is a doublecheck for # the maintainer, just in case something changes unexpectely. if [ $do10 = yes ] ; then echo "Test 10: Internal offsets and code size tests" $valgrind ./pcretest -q $testdata/testinput10 testtry if [ $? = 0 ] ; then $cf $testdata/testoutput10 testtry if [ $? != 0 ] ; then exit 1; fi else exit 1 fi echo "OK" fi # End syncevolution-1.5/src/synthesis/src/pcre/RunTest.bat0000644000373300037200000000321412424517753024342 0ustar00nightlyallusers00000000000000@rem This file was contributed by Ralf Junker, and touched up by @rem Daniel Richard G. Test 10 added by Philip H. @rem @rem MS Windows batch file to run pcretest on testfiles with the correct @rem options. @rem @rem Output is written to a newly created subfolder named "testdata". setlocal if [%srcdir%]==[] set srcdir=. if [%pcretest%]==[] set pcretest=pcretest if not exist testout md testout %pcretest% -q %srcdir%\testdata\testinput1 > testout\testoutput1 %pcretest% -q %srcdir%\testdata\testinput2 > testout\testoutput2 %pcretest% -q %srcdir%\testdata\testinput3 > testout\testoutput3 %pcretest% -q %srcdir%\testdata\testinput4 > testout\testoutput4 %pcretest% -q %srcdir%\testdata\testinput5 > testout\testoutput5 %pcretest% -q %srcdir%\testdata\testinput6 > testout\testoutput6 %pcretest% -q -dfa %srcdir%\testdata\testinput7 > testout\testoutput7 %pcretest% -q -dfa %srcdir%\testdata\testinput8 > testout\testoutput8 %pcretest% -q -dfa %srcdir%\testdata\testinput9 > testout\testoutput9 %pcretest% -q %srcdir%\testdata\testinput10 > testout\testoutput10 fc /n %srcdir%\testdata\testoutput1 testout\testoutput1 fc /n %srcdir%\testdata\testoutput2 testout\testoutput2 rem fc /n %srcdir%\testdata\testoutput3 testout\testoutput3 fc /n %srcdir%\testdata\testoutput4 testout\testoutput4 fc /n %srcdir%\testdata\testoutput5 testout\testoutput5 fc /n %srcdir%\testdata\testoutput6 testout\testoutput6 fc /n %srcdir%\testdata\testoutput7 testout\testoutput7 fc /n %srcdir%\testdata\testoutput8 testout\testoutput8 fc /n %srcdir%\testdata\testoutput9 testout\testoutput9 fc /n %srcdir%\testdata\testoutput10 testout\testoutput10 syncevolution-1.5/src/synthesis/src/pcre/config-cmake.h.in0000644000373300037200000000133412424517753025350 0ustar00nightlyallusers00000000000000/* config.h for CMake builds */ #cmakedefine HAVE_DIRENT_H #cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_SYS_STAT_H #cmakedefine HAVE_SYS_TYPES_H #cmakedefine HAVE_TYPE_TRAITS_H #cmakedefine HAVE_BITS_TYPE_TRAITS_H #cmakedefine HAVE_BCOPY #cmakedefine HAVE_MEMMOVE #cmakedefine HAVE_STRERROR #cmakedefine PCRE_STATIC #cmakedefine SUPPORT_UTF8 #cmakedefine SUPPORT_UCP #cmakedefine EBCDIC #cmakedefine NO_RECURSE #define NEWLINE @NEWLINE@ #define POSIX_MALLOC_THRESHOLD @PCRE_POSIX_MALLOC_THRESHOLD@ #define LINK_SIZE @PCRE_LINK_SIZE@ #define MATCH_LIMIT @PCRE_MATCH_LIMIT@ #define MATCH_LIMIT_RECURSION @PCRE_MATCH_LIMIT_RECURSION@ #define MAX_NAME_SIZE 32 #define MAX_NAME_COUNT 10000 /* end config.h for CMake builds */ syncevolution-1.5/src/synthesis/src/pcre/config.h0000644000373300037200000002214612424517753023671 0ustar00nightlyallusers00000000000000/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* On Unix-like systems config.h.in is converted by "configure" into config.h. Some other environments also support the use of "configure". PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. If you are going to build PCRE "by hand" on a system without "configure" you should copy the distributed config.h.generic to config.h, and then set up the macros the way you need them. Alternatively, you can avoid editing by using -D on the compiler command line to set the macro values. PCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if HAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set them both to 0; an emulation function will be used. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic. */ /* #undef EBCDIC */ /* Define to 1 if you have the `bcopy' function. */ #ifndef HAVE_BCOPY #define HAVE_BCOPY 0 // MWerks CW 9 Win MSL does not seem to have it #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_BITS_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_DIRENT_H #define HAVE_DIRENT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_DLFCN_H #define HAVE_DLFCN_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_INTTYPES_H #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_LIMITS_H #define HAVE_LIMITS_H 1 #endif /* Define to 1 if the system has the type `long long'. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif /* Define to 1 if you have the `memmove' function. */ #ifndef HAVE_MEMMOVE #define HAVE_MEMMOVE 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_MEMORY_H #define HAVE_MEMORY_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDINT_H #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strerror' function. */ #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING #define HAVE_STRING 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRINGS_H #define HAVE_STRINGS_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING_H #define HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strtoll' function. */ #ifndef HAVE_STRTOLL #define HAVE_STRTOLL 0 #endif /* Define to 1 if you have the `strtoq' function. */ #ifndef HAVE_STRTOQ #define HAVE_STRTOQ 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_STAT_H #define HAVE_SYS_STAT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 0 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_UNISTD_H #define HAVE_UNISTD_H 0 #endif /* Define to 1 if the system has the type `unsigned long long'. */ #ifndef HAVE_UNSIGNED_LONG_LONG #define HAVE_UNSIGNED_LONG_LONG 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_WINDOWS_H */ /* The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On systems that support it, "configure" can be used to override this default. */ #ifndef LINK_SIZE #define LINK_SIZE 2 #endif /* The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On systems that support it, "configure" can be used to override this default default. */ #ifndef MATCH_LIMIT #define MATCH_LIMIT 10000000 #endif /* The above limit applies to all calls of match(), whether or not they increase the recursion depth. In some environments it is desirable to limit the depth of recursive calls of match() more strictly, in order to restrict the maximum amount of stack (or heap, if NO_RECURSE is defined) that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To have any useful effect, it must be less than the value of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is a runtime method for setting a different limit. On systems that support it, "configure" can be used to override the default. */ #ifndef MATCH_LIMIT_RECURSION #define MATCH_LIMIT_RECURSION MATCH_LIMIT #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_COUNT #define MAX_NAME_COUNT 10000 #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_SIZE #define MAX_NAME_SIZE 32 #endif /* The value of NEWLINE determines the newline character sequence. On Unix-like systems, "configure" can be used to override the default, which is 10. The possible values are 10 (LF), 13 (CR), 3338 (CRLF), -1 (ANY), or -2 (ANYCRLF). */ #ifndef NEWLINE #define NEWLINE 10 #endif /* PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc() to obtain memory from the heap. For more detail, see the comments and other stuff just above the match() function. On systems that support it, "configure" can be used to set this in the Makefile (use --disable-stack-for-recursion). */ /* #undef NO_RECURSE */ /* Name of package */ #define PACKAGE "pcre" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PCRE 7.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" /* Define to the version of this package. */ #define PACKAGE_VERSION "7.3" /* If you are compiling for a system other than a Unix-like system or Win32, and it needs some magic to be inserted before the definition of a function that is exported by the library, define this macro to contain the relevant magic. If you do not define this macro, it defaults to "extern" for a C compiler and "extern C" for a C++ compiler on non-Win32 systems. This macro apears at the start of every exported function that is part of the external API. It does not appear on functions that are "external" in the C sense, but which are internal to the library. */ /* #undef PCRE_EXP_DEFN */ /* Define if linking statically (TODO: make nice with Libtool) */ /* #undef PCRE_STATIC */ /* When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD. On systems that support it, "configure" can be used to override this default. */ #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD 10 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef STDC_HEADERS #define STDC_HEADERS 1 #endif /* Define to enable support for Unicode properties */ /* #undef SUPPORT_UCP */ /* Define to enable support for the UTF-8 Unicode encoding. */ #define SUPPORT_UTF8 1 /* Version number of package */ #ifndef VERSION #define VERSION "7.3" #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ syncevolution-1.5/src/synthesis/src/pcre/config.h.generic0000644000373300037200000002207112424517753025301 0ustar00nightlyallusers00000000000000/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* On Unix-like systems config.h.in is converted by "configure" into config.h. Some other environments also support the use of "configure". PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. If you are going to build PCRE "by hand" on a system without "configure" you should copy the distributed config.h.generic to config.h, and then set up the macros the way you need them. Alternatively, you can avoid editing by using -D on the compiler command line to set the macro values. PCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if HAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set them both to 0; an emulation function will be used. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic. */ /* #undef EBCDIC */ /* Define to 1 if you have the `bcopy' function. */ #ifndef HAVE_BCOPY #define HAVE_BCOPY 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_BITS_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_DIRENT_H #define HAVE_DIRENT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_DLFCN_H #define HAVE_DLFCN_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_INTTYPES_H #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_LIMITS_H #define HAVE_LIMITS_H 1 #endif /* Define to 1 if the system has the type `long long'. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif /* Define to 1 if you have the `memmove' function. */ #ifndef HAVE_MEMMOVE #define HAVE_MEMMOVE 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_MEMORY_H #define HAVE_MEMORY_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDINT_H #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strerror' function. */ #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING #define HAVE_STRING 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRINGS_H #define HAVE_STRINGS_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING_H #define HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strtoll' function. */ #ifndef HAVE_STRTOLL #define HAVE_STRTOLL 1 #endif /* Define to 1 if you have the `strtoq' function. */ #ifndef HAVE_STRTOQ #define HAVE_STRTOQ 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_STAT_H #define HAVE_SYS_STAT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_UNISTD_H #define HAVE_UNISTD_H 1 #endif /* Define to 1 if the system has the type `unsigned long long'. */ #ifndef HAVE_UNSIGNED_LONG_LONG #define HAVE_UNSIGNED_LONG_LONG 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_WINDOWS_H */ /* The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On systems that support it, "configure" can be used to override this default. */ #ifndef LINK_SIZE #define LINK_SIZE 2 #endif /* The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On systems that support it, "configure" can be used to override this default default. */ #ifndef MATCH_LIMIT #define MATCH_LIMIT 10000000 #endif /* The above limit applies to all calls of match(), whether or not they increase the recursion depth. In some environments it is desirable to limit the depth of recursive calls of match() more strictly, in order to restrict the maximum amount of stack (or heap, if NO_RECURSE is defined) that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To have any useful effect, it must be less than the value of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is a runtime method for setting a different limit. On systems that support it, "configure" can be used to override the default. */ #ifndef MATCH_LIMIT_RECURSION #define MATCH_LIMIT_RECURSION MATCH_LIMIT #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_COUNT #define MAX_NAME_COUNT 10000 #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_SIZE #define MAX_NAME_SIZE 32 #endif /* The value of NEWLINE determines the newline character sequence. On Unix-like systems, "configure" can be used to override the default, which is 10. The possible values are 10 (LF), 13 (CR), 3338 (CRLF), -1 (ANY), or -2 (ANYCRLF). */ #ifndef NEWLINE #define NEWLINE 10 #endif /* PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc() to obtain memory from the heap. For more detail, see the comments and other stuff just above the match() function. On systems that support it, "configure" can be used to set this in the Makefile (use --disable-stack-for-recursion). */ /* #undef NO_RECURSE */ /* Name of package */ #define PACKAGE "pcre" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PCRE 7.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" /* Define to the version of this package. */ #define PACKAGE_VERSION "7.3" /* If you are compiling for a system other than a Unix-like system or Win32, and it needs some magic to be inserted before the definition of a function that is exported by the library, define this macro to contain the relevant magic. If you do not define this macro, it defaults to "extern" for a C compiler and "extern C" for a C++ compiler on non-Win32 systems. This macro apears at the start of every exported function that is part of the external API. It does not appear on functions that are "external" in the C sense, but which are internal to the library. */ /* #undef PCRE_EXP_DEFN */ /* Define if linking statically (TODO: make nice with Libtool) */ /* #undef PCRE_STATIC */ /* When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD. On systems that support it, "configure" can be used to override this default. */ #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD 10 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef STDC_HEADERS #define STDC_HEADERS 1 #endif /* Define to enable support for Unicode properties */ /* #undef SUPPORT_UCP */ /* Define to enable support for the UTF-8 Unicode encoding. */ /* #undef SUPPORT_UTF8 */ /* Version number of package */ #ifndef VERSION #define VERSION "7.3" #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ syncevolution-1.5/src/synthesis/src/pcre/configure.ac0000644000373300037200000004304012424517753024535 0ustar00nightlyallusers00000000000000dnl Process this file with autoconf to produce a configure script. dnl NOTE FOR MAINTAINERS: Do not use major or minor version numbers with dnl leading zeros, because they may be treated as octal constants. The dnl PCRE_PRERELEASE feature is for identifying release candidates. It might dnl be defined as -RC2, for example. For real releases, it should be defined dnl empty. m4_define(pcre_major, [7]) m4_define(pcre_minor, [3]) m4_define(pcre_prerelease, []) m4_define(pcre_date, [2007-08-28]) # Libtool shared library interface versions (current:revision:age) m4_define(libpcre_version, [0:1:0]) m4_define(libpcreposix_version, [0:0:0]) m4_define(libpcrecpp_version, [0:0:0]) AC_PREREQ(2.57) AC_INIT(PCRE, pcre_major.pcre_minor[]pcre_prerelease, , pcre) AC_CONFIG_SRCDIR([pcre.h.in]) AM_INIT_AUTOMAKE([dist-bzip2 dist-zip]) AC_CONFIG_HEADERS(config.h) # The default CFLAGS and CXXFLAGS in Autoconf are "-g -O2" for gcc and just # "-g" for any other compiler. There doesn't seem to be a standard way of # getting rid of the -g (which I don't think is needed for a production # library). This fudge seems to achieve the necessary. First, we remember the # externally set values of CFLAGS and CXXFLAGS. Then call the AC_PROG_CC and # AC_PROG_CXX macros to find the compilers - if CFLAGS and CXXFLAGS are not # set, they will be set to Autoconf's defaults. Afterwards, if the original # values were not set, remove the -g from the Autoconf defaults. # (PH 02-May-07) remember_set_CFLAGS="$CFLAGS" remember_set_CXXFLAGS="$CXXFLAGS" AC_PROG_CC AC_PROG_CXX if test "x$remember_set_CFLAGS" = "x" then if test "$CFLAGS" = "-g -O2" then CFLAGS="-O2" elif test "$CFLAGS" = "-g" then CFLAGS="" fi fi if test "x$remember_set_CXXFLAGS" = "x" then if test "$CXXFLAGS" = "-g -O2" then CXXFLAGS="-O2" elif test "$CXXFLAGS" = "-g" then CXXFLAGS="" fi fi AC_PROG_INSTALL AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL AC_PROG_LN_S PCRE_MAJOR="pcre_major" PCRE_MINOR="pcre_minor" PCRE_PRERELEASE="pcre_prerelease" PCRE_DATE="pcre_date" AC_SUBST(PCRE_MAJOR) AC_SUBST(PCRE_MINOR) AC_SUBST(PCRE_PRERELEASE) AC_SUBST(PCRE_DATE) # Set a more sensible default value for $(htmldir). if test "x$htmldir" = 'x${docdir}' then htmldir='${docdir}/html' fi # Handle --disable-cpp AC_ARG_ENABLE(cpp, AS_HELP_STRING([--disable-cpp], [disable C++ support]), , enable_cpp=yes) # Handle --enable-rebuild-chartables AC_ARG_ENABLE(rebuild-chartables, AS_HELP_STRING([--enable-rebuild-chartables], [rebuild character tables in current locale]), , enable_rebuild_chartables=no) # Handle --enable-utf8 (disabled by default) AC_ARG_ENABLE(utf8, AS_HELP_STRING([--enable-utf8], [enable UTF-8 support]), , enable_utf8=unset) # Handle --enable-unicode-properties AC_ARG_ENABLE(unicode-properties, AS_HELP_STRING([--enable-unicode-properties], [enable Unicode properties support (implies --enable-utf8)]), , enable_unicode_properties=no) # Handle --enable-newline=NL dnl AC_ARG_ENABLE(newline, dnl AS_HELP_STRING([--enable-newline=NL], dnl [use NL as newline (lf, cr, crlf, anycrlf, any; default=lf)]), dnl , enable_newline=lf) # Separate newline options ac_pcre_newline=lf AC_ARG_ENABLE(newline-is-cr, AS_HELP_STRING([--enable-newline-is-cr], [use CR as newline character]), ac_pcre_newline=cr) AC_ARG_ENABLE(newline-is-lf, AS_HELP_STRING([--enable-newline-is-lf], [use LF as newline character (default)]), ac_pcre_newline=lf) AC_ARG_ENABLE(newline-is-crlf, AS_HELP_STRING([--enable-newline-is-crlf], [use CRLF as newline sequence]), ac_pcre_newline=crlf) AC_ARG_ENABLE(newline-is-anycrlf, AS_HELP_STRING([--enable-newline-is-anycrlf], [use CR, LF, or CRLF as newline sequence]), ac_pcre_newline=anycrlf) AC_ARG_ENABLE(newline-is-any, AS_HELP_STRING([--enable-newline-is-any], [use any valid Unicode newline sequence]), ac_pcre_newline=any) enable_newline="$ac_pcre_newline" # Handle --enable-ebcdic AC_ARG_ENABLE(ebcdic, AS_HELP_STRING([--enable-ebcdic], [assume EBCDIC coding rather than ASCII; use this only in (uncommon) EBCDIC environments; it implies --enable-rebuild-chartables]), , enable_ebcdic=no) # Handle --disable-stack-for-recursion AC_ARG_ENABLE(stack-for-recursion, AS_HELP_STRING([--disable-stack-for-recursion], [don't use stack recursion when matching]), , enable_stack_for_recursion=yes) # Handle --with-posix-malloc-threshold=NBYTES AC_ARG_WITH(posix-malloc-threshold, AS_HELP_STRING([--with-posix-malloc-threshold=NBYTES], [threshold for POSIX malloc usage (default=10)]), , with_posix_malloc_threshold=10) # Handle --with-link-size=N AC_ARG_WITH(link-size, AS_HELP_STRING([--with-link-size=N], [internal link size (2, 3, or 4 allowed; default=2)]), , with_link_size=2) # Handle --with-match-limit=N AC_ARG_WITH(match-limit, AS_HELP_STRING([--with-match-limit=N], [default limit on internal looping (default=10000000)]), , with_match_limit=10000000) # Handle --with-match-limit_recursion=N # # Note: In config.h, the default is to define MATCH_LIMIT_RECURSION # symbolically as MATCH_LIMIT, which in turn is defined to be some numeric # value (e.g. 10000000). MATCH_LIMIT_RECURSION can otherwise be set to some # different numeric value (or even the same numeric value as MATCH_LIMIT, # though no longer defined in terms of the latter). # AC_ARG_WITH(match-limit-recursion, AS_HELP_STRING([--with-match-limit-recursion=N], [default limit on internal recursion (default=MATCH_LIMIT)]), , with_match_limit_recursion=MATCH_LIMIT) # Make sure that if enable_unicode_properties was set, that UTF-8 support # is enabled. # if test "x$enable_unicode_properties" = "xyes" then if test "x$enable_utf8" = "xno" then AC_MSG_ERROR([support for Unicode properties requires UTF-8 support]) fi enable_utf8=yes fi if test "x$enable_utf8" = "xunset" then enable_utf8=no fi # Make sure that if enable_ebcdic is set, rebuild_chartables is also enabled. # if test "x$enable_ebcdic" = "xyes" then enable_rebuild_chartables=yes fi # Convert the newline identifier into the appropriate integer value. case "$enable_newline" in lf) ac_pcre_newline_value=10 ;; cr) ac_pcre_newline_value=13 ;; crlf) ac_pcre_newline_value=3338 ;; anycrlf) ac_pcre_newline_value=-2 ;; any) ac_pcre_newline_value=-1 ;; *) AC_MSG_ERROR([invalid argument \"$enable_newline\" to --enable-newline option]) ;; esac # Check argument to --with-link-size case "$with_link_size" in 2|3|4) ;; *) AC_MSG_ERROR([invalid argument \"$with_link_size\" to --with-link-size option]) ;; esac AH_TOP([ /* On Unix-like systems config.h.in is converted by "configure" into config.h. Some other environments also support the use of "configure". PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. If you are going to build PCRE "by hand" on a system without "configure" you should copy the distributed config.h.generic to config.h, and then set up the macros the way you need them. Alternatively, you can avoid editing by using -D on the compiler command line to set the macro values. PCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if HAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set them both to 0; an emulation function will be used. */]) # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(limits.h sys/types.h sys/stat.h dirent.h windows.h) # The files below are C++ header files. pcre_have_type_traits="0" pcre_have_bits_type_traits="0" if test "x$enable_cpp" = "xyes" -a -n "$CXX" then AC_LANG_PUSH(C++) # We could be more clever here, given we're doing AC_SUBST with this # (eg set a var to be the name of the include file we want). But we're not # so it's easy to change back to 'regular' autoconf vars if we needed to. AC_CHECK_HEADERS(string, [pcre_have_cpp_headers="1"], [pcre_have_cpp_headers="0"]) AC_CHECK_HEADERS(bits/type_traits.h, [pcre_have_bits_type_traits="1"], [pcre_have_bits_type_traits="0"]) AC_CHECK_HEADERS(type_traits.h, [pcre_have_type_traits="1"], [pcre_have_type_traits="0"]) AC_LANG_POP fi # Using AC_SUBST eliminates the need to include config.h in a public .h file AC_SUBST(pcre_have_type_traits) AC_SUBST(pcre_have_bits_type_traits) # Conditional compilation AM_CONDITIONAL(WITH_PCRE_CPP, test "x$enable_cpp" = "xyes") AM_CONDITIONAL(WITH_REBUILD_CHARTABLES, test "x$enable_rebuild_chartables" = "xyes") # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T AC_CHECK_TYPES([long long], [pcre_have_long_long="1"], [pcre_have_long_long="0"]) AC_CHECK_TYPES([unsigned long long], [pcre_have_ulong_long="1"], [pcre_have_ulong_long="0"]) AC_SUBST(pcre_have_long_long) AC_SUBST(pcre_have_ulong_long) # Checks for library functions. AC_CHECK_FUNCS(bcopy memmove strerror strtoq strtoll) # This facilitates -ansi builds under Linux dnl AC_DEFINE([_GNU_SOURCE], [], [Enable GNU extensions in glibc]) if test "x$enable_shared" = "xno" ; then AC_DEFINE([PCRE_STATIC], [1], [ Define if linking statically (TODO: make nice with Libtool)]) fi # Here is where pcre specific defines are handled if test "$enable_utf8" = "yes"; then AC_DEFINE([SUPPORT_UTF8], [], [ Define to enable support for the UTF-8 Unicode encoding.]) fi if test "$enable_unicode_properties" = "yes"; then AC_DEFINE([SUPPORT_UCP], [], [ Define to enable support for Unicode properties]) fi if test "$enable_stack_for_recursion" = "no"; then AC_DEFINE([NO_RECURSE], [], [ PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc() to obtain memory from the heap. For more detail, see the comments and other stuff just above the match() function. On systems that support it, "configure" can be used to set this in the Makefile (use --disable-stack-for-recursion).]) fi AC_DEFINE_UNQUOTED([NEWLINE], [$ac_pcre_newline_value], [ The value of NEWLINE determines the newline character sequence. On Unix-like systems, "configure" can be used to override the default, which is 10. The possible values are 10 (LF), 13 (CR), 3338 (CRLF), -1 (ANY), or -2 (ANYCRLF).]) AC_DEFINE_UNQUOTED([LINK_SIZE], [$with_link_size], [ The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On systems that support it, "configure" can be used to override this default.]) AC_DEFINE_UNQUOTED([POSIX_MALLOC_THRESHOLD], [$with_posix_malloc_threshold], [ When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD. On systems that support it, "configure" can be used to override this default.]) AC_DEFINE_UNQUOTED([MATCH_LIMIT], [$with_match_limit], [ The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On systems that support it, "configure" can be used to override this default default.]) AC_DEFINE_UNQUOTED([MATCH_LIMIT_RECURSION], [$with_match_limit_recursion], [ The above limit applies to all calls of match(), whether or not they increase the recursion depth. In some environments it is desirable to limit the depth of recursive calls of match() more strictly, in order to restrict the maximum amount of stack (or heap, if NO_RECURSE is defined) that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To have any useful effect, it must be less than the value of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is a runtime method for setting a different limit. On systems that support it, "configure" can be used to override the default.]) AC_DEFINE([MAX_NAME_SIZE], [32], [ This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns.]) AC_DEFINE([MAX_NAME_COUNT], [10000], [ This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns.]) AH_VERBATIM([PCRE_EXP_DEFN], [ /* If you are compiling for a system other than a Unix-like system or Win32, and it needs some magic to be inserted before the definition of a function that is exported by the library, define this macro to contain the relevant magic. If you do not define this macro, it defaults to "extern" for a C compiler and "extern C" for a C++ compiler on non-Win32 systems. This macro apears at the start of every exported function that is part of the external API. It does not appear on functions that are "external" in the C sense, but which are internal to the library. */ #undef PCRE_EXP_DEFN]) if test "$enable_ebcdic" = "yes"; then AC_DEFINE_UNQUOTED([EBCDIC], [], [ If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic.]) fi # Platform specific issues NO_UNDEFINED= EXPORT_ALL_SYMBOLS= case $host_os in cygwin* | mingw* ) if test X"$enable_shared" = Xyes; then NO_UNDEFINED="-no-undefined" EXPORT_ALL_SYMBOLS="-Wl,--export-all-symbols" fi ;; esac # The extra LDFLAGS for each particular library # (Note: The libpcre*_version bits are m4 variables, assigned above) EXTRA_LIBPCRE_LDFLAGS="$NO_UNDEFINED -version-info libpcre_version" EXTRA_LIBPCREPOSIX_LDFLAGS="$NO_UNDEFINED -version-info libpcreposix_version" EXTRA_LIBPCRECPP_LDFLAGS="$NO_UNDEFINED $EXPORT_ALL_SYMBOLS -version-info libpcrecpp_version" AC_SUBST(EXTRA_LIBPCRE_LDFLAGS) AC_SUBST(EXTRA_LIBPCREPOSIX_LDFLAGS) AC_SUBST(EXTRA_LIBPCRECPP_LDFLAGS) # When we run 'make distcheck', use these arguments. DISTCHECK_CONFIGURE_FLAGS="--enable-cpp --enable-unicode-properties" AC_SUBST(DISTCHECK_CONFIGURE_FLAGS) # Produce these files, in addition to config.h. AC_CONFIG_FILES( Makefile libpcre.pc libpcrecpp.pc pcre-config pcre.h pcre_stringpiece.h pcrecpparg.h ) # Make the generated script files executable. AC_CONFIG_COMMANDS([script-chmod], [chmod a+x pcre-config]) # Make sure that pcre_chartables.c is removed in case the method for # creating it was changed by reconfiguration. AC_CONFIG_COMMANDS([delete-old-chartables], [rm -f pcre_chartables.c]) AC_OUTPUT # Print out a nice little message after configure is run displaying your # chosen options. # cat < #endif #include #include #include #include #include "pcre_internal.h" #define DFTABLES /* pcre_maketables.c notices this */ #include "pcre_maketables.c" int main(int argc, char **argv) { FILE *f; int i = 1; const unsigned char *tables; const unsigned char *base_of_tables; /* By default, the default C locale is used rather than what the building user happens to have set. However, if the -L option is given, set the locale from the LC_xxx environment variables. */ if (argc > 1 && strcmp(argv[1], "-L") == 0) { setlocale(LC_ALL, ""); /* Set from environment variables */ i++; } if (argc < i + 1) { fprintf(stderr, "dftables: one filename argument is required\n"); return 1; } tables = pcre_maketables(); base_of_tables = tables; f = fopen(argv[i], "wb"); if (f == NULL) { fprintf(stderr, "dftables: failed to open %s for writing\n", argv[1]); return 1; } /* There are several fprintf() calls here, because gcc in pedantic mode complains about the very long string otherwise. */ fprintf(f, "/*************************************************\n" "* Perl-Compatible Regular Expressions *\n" "*************************************************/\n\n" "/* This file was automatically written by the dftables auxiliary\n" "program. It contains character tables that are used when no external\n" "tables are passed to PCRE by the application that calls it. The tables\n" "are used only for characters whose code values are less than 256.\n\n"); fprintf(f, "The following #includes are present because without them gcc 4.x may remove\n" "the array definition from the final binary if PCRE is built into a static\n" "library and dead code stripping is activated. This leads to link errors.\n" "Pulling in the header ensures that the array gets flagged as \"someone\n" "outside this compilation unit might reference this\" and so it will always\n" "be supplied to the linker. */\n\n" "#ifdef HAVE_CONFIG_H\n" "#include \n" "#endif\n\n" "#include \"pcre_internal.h\"\n\n"); fprintf(f, "const unsigned char _pcre_default_tables[] = {\n\n" "/* This table is a lower casing table. */\n\n"); fprintf(f, " "); for (i = 0; i < 256; i++) { if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); fprintf(f, "%3d", *tables++); if (i != 255) fprintf(f, ","); } fprintf(f, ",\n\n"); fprintf(f, "/* This table is a case flipping table. */\n\n"); fprintf(f, " "); for (i = 0; i < 256; i++) { if ((i & 7) == 0 && i != 0) fprintf(f, "\n "); fprintf(f, "%3d", *tables++); if (i != 255) fprintf(f, ","); } fprintf(f, ",\n\n"); fprintf(f, "/* This table contains bit maps for various character classes.\n" "Each map is 32 bytes long and the bits run from the least\n" "significant end of each byte. The classes that have their own\n" "maps are: space, xdigit, digit, upper, lower, word, graph\n" "print, punct, and cntrl. Other classes are built from combinations. */\n\n"); fprintf(f, " "); for (i = 0; i < cbit_length; i++) { if ((i & 7) == 0 && i != 0) { if ((i & 31) == 0) fprintf(f, "\n"); fprintf(f, "\n "); } fprintf(f, "0x%02x", *tables++); if (i != cbit_length - 1) fprintf(f, ","); } fprintf(f, ",\n\n"); fprintf(f, "/* This table identifies various classes of character by individual bits:\n" " 0x%02x white space character\n" " 0x%02x letter\n" " 0x%02x decimal digit\n" " 0x%02x hexadecimal digit\n" " 0x%02x alphanumeric or '_'\n" " 0x%02x regular expression metacharacter or binary zero\n*/\n\n", ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, ctype_meta); fprintf(f, " "); for (i = 0; i < 256; i++) { if ((i & 7) == 0 && i != 0) { fprintf(f, " /* "); if (isprint(i-8)) fprintf(f, " %c -", i-8); else fprintf(f, "%3d-", i-8); if (isprint(i-1)) fprintf(f, " %c ", i-1); else fprintf(f, "%3d", i-1); fprintf(f, " */\n "); } fprintf(f, "0x%02x", *tables++); if (i != 255) fprintf(f, ","); } fprintf(f, "};/* "); if (isprint(i-8)) fprintf(f, " %c -", i-8); else fprintf(f, "%3d-", i-8); if (isprint(i-1)) fprintf(f, " %c ", i-1); else fprintf(f, "%3d", i-1); fprintf(f, " */\n\n/* End of pcre_chartables.c */\n"); fclose(f); free((void *)base_of_tables); return 0; } /* End of dftables.c */ syncevolution-1.5/src/synthesis/src/pcre/libpcre.pc.in0000644000373300037200000000042512424517753024620 0ustar00nightlyallusers00000000000000# Package Information for pkg-config prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libpcre Description: PCRE - Perl compatible regular expressions C library Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lpcre Cflags: -I${includedir} syncevolution-1.5/src/synthesis/src/pcre/libpcrecpp.pc.in0000644000373300037200000000041412424517753025321 0ustar00nightlyallusers00000000000000# Package Information for pkg-config prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libpcrecpp Description: PCRECPP - C++ wrapper for PCRE Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lpcre -lpcrecpp Cflags: -I${includedir} syncevolution-1.5/src/synthesis/src/pcre/makevp.bat0000644000373300037200000000360212424517753024222 0ustar00nightlyallusers00000000000000@echo off :: AH 20-12-06 modified for new PCRE-7.0 and VP/BCC :: PH 19-03-07 renamed !compile.txt and !linklib.txt as makevp-compile.txt and :: makevp-linklib.txt :: PH 26-03-07 re-renamed !compile.txt and !linklib.txt as makevp-c.txt and :: makevp-l.txt :: PH 29-03-07 hopefully the final rename to makevp_c and makevp_l REM This file was contributed by Alexander Tokarev for building PCRE for use REM with Virtual Pascal. It has not been tested with the latest PCRE release. REM CHANGE THIS FOR YOUR BORLAND C++ COMPILER PATH SET BORLAND=F:\bcc SET PATH=%PATH%;%BORLAND%\bin;f:\tasm\bin SET PCRE_VER=70 :: sh configure bcc32 -DDFTABLES -DSTATIC -I%BORLAND%\include -L%BORLAND%\lib dftables.c :: bcc32 -DDFTABLES -DSTATIC -DVPCOMPAT -I%BORLAND%\include -L%BORLAND%\lib dftables.c IF ERRORLEVEL 1 EXIT :: dftables > chartables.c dftables pcre_chartables.c REM compile and link the PCRE library into lib: option -B for ASM compile works too bcc32 -a4 -c -RT- -y- -v- -u- -R- -Q- -X -d -fp -ff -P- -O2 -Oc -Ov -3 -w-8004 -w-8064 -w-8065 -w-8012 -DSTATIC -DVPCOMPAT -UDFTABLES -I%BORLAND%\include @makevp_c.txt :: bcc32 -c -RT- -y- -v- -u- -P- -O2 -5 -DSTATIC -DVPCOMPAT -UDFTABLES -I%BORLAND%\include get.c maketables.c pcre.c study.c IF ERRORLEVEL 1 EXIT tlib %BORLAND%\lib\cw32.lib *calloc *del *strncmp *memcpy *memmove *memset *memcmp *strlen :: tlib %BORLAND%\lib\cw32.lib *calloc *del *strncmp *memcpy *memmove *memset IF ERRORLEVEL 1 EXIT tlib pcre%PCRE_VER%.lib @makevp_l.txt +calloc.obj +del.obj +strncmp.obj +memcpy.obj +memmove.obj +memset.obj +memcmp.obj +strlen.obj :: tlib pcre.lib +get.obj +maketables.obj +pcre.obj +study.obj +calloc.obj +del.obj +strncmp.obj +memcpy.obj +memmove.obj +memset.obj IF ERRORLEVEL 1 EXIT del *.obj *.tds *.bak >nul 2>nul echo --- echo Now the library should be complete. Please check all messages above. echo Don't care for warnings, it's OK. syncevolution-1.5/src/synthesis/src/pcre/makevp_c.txt0000644000373300037200000000046612424517753024602 0ustar00nightlyallusers00000000000000pcre_chartables.c pcre_compile.c pcre_config.c pcre_dfa_exec.c pcre_exec.c pcre_fullinfo.c pcre_get.c pcre_globals.c pcre_info.c pcre_maketables.c pcre_newline.c pcre_ord2utf8.c pcre_refcount.c pcre_study.c pcre_tables.c pcre_try_flipped.c pcre_ucp_searchfuncs.c pcre_valid_utf8.c pcre_version.c pcre_xclass.c syncevolution-1.5/src/synthesis/src/pcre/makevp_l.txt0000644000373300037200000000104112424517753024601 0ustar00nightlyallusers00000000000000+pcre_chartables.obj & +pcre_compile.obj & +pcre_config.obj & +pcre_dfa_exec.obj & +pcre_exec.obj & +pcre_fullinfo.obj & +pcre_get.obj & +pcre_globals.obj & +pcre_info.obj & +pcre_maketables.obj & +pcre_newline.obj & +pcre_ord2utf8.obj & +pcre_refcount.obj & +pcre_study.obj & +pcre_tables.obj & +pcre_try_flipped.obj & +pcre_ucp_searchfuncs.obj & +pcre_valid_utf8.obj & +pcre_version.obj & +pcre_xclass.obj syncevolution-1.5/src/synthesis/src/pcre/pcre-config.in0000644000373300037200000000227512424517753025000 0ustar00nightlyallusers00000000000000#!/bin/sh prefix=@prefix@ exec_prefix=@exec_prefix@ exec_prefix_set=no usage="\ Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]" if test $# -eq 0; then echo "${usage}" 1>&2 exit 1 fi libR= case `uname -s` in *SunOS*) libR=" -R@libdir@" ;; *BSD*) libR=" -Wl,-R@libdir@" ;; esac while test $# -gt 0; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac case $1 in --prefix=*) prefix=$optarg if test $exec_prefix_set = no ; then exec_prefix=$optarg fi ;; --prefix) echo $prefix ;; --exec-prefix=*) exec_prefix=$optarg exec_prefix_set=yes ;; --exec-prefix) echo $exec_prefix ;; --version) echo @PACKAGE_VERSION@ ;; --cflags | --cflags-posix) if test @includedir@ != /usr/include ; then includes=-I@includedir@ fi echo $includes ;; --libs-posix) echo -L@libdir@$libR -lpcreposix -lpcre ;; --libs) echo -L@libdir@$libR -lpcre ;; *) echo "${usage}" 1>&2 exit 1 ;; esac shift done syncevolution-1.5/src/synthesis/src/pcre/pcre.h0000644000373300037200000002776312424517753023367 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is the public header file for the PCRE library, to be #included by applications that call the PCRE functions. Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ #ifndef _PCRE_H #define _PCRE_H /* The current PCRE version information. */ #define PCRE_MAJOR 7 #define PCRE_MINOR 3 #define PCRE_PRERELEASE #define PCRE_DATE 2007-08-28 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate export setting is defined in pcre_internal.h, which includes this file. So we don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ #if defined(_WIN32) && !defined(PCRE_STATIC) # ifndef PCRE_EXP_DECL # define PCRE_EXP_DECL extern __declspec(dllimport) # endif # ifdef __cplusplus # ifndef PCRECPP_EXP_DECL # define PCRECPP_EXP_DECL extern __declspec(dllimport) # endif # ifndef PCRECPP_EXP_DEFN # define PCRECPP_EXP_DEFN __declspec(dllimport) # endif # endif #endif /* By default, we use the standard "extern" declarations. */ #ifndef PCRE_EXP_DECL # ifdef __cplusplus # define PCRE_EXP_DECL extern "C" # else # define PCRE_EXP_DECL extern # endif #endif #ifdef __cplusplus # ifndef PCRECPP_EXP_DECL # define PCRECPP_EXP_DECL extern # endif # ifndef PCRECPP_EXP_DEFN # define PCRECPP_EXP_DEFN # endif #endif /* Have to include stdlib.h in order to ensure that size_t is defined; it is needed here for malloc. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif /* Options */ #define PCRE_CASELESS 0x00000001 #define PCRE_MULTILINE 0x00000002 #define PCRE_DOTALL 0x00000004 #define PCRE_EXTENDED 0x00000008 #define PCRE_ANCHORED 0x00000010 #define PCRE_DOLLAR_ENDONLY 0x00000020 #define PCRE_EXTRA 0x00000040 #define PCRE_NOTBOL 0x00000080 #define PCRE_NOTEOL 0x00000100 #define PCRE_UNGREEDY 0x00000200 #define PCRE_NOTEMPTY 0x00000400 #define PCRE_UTF8 0x00000800 #define PCRE_NO_AUTO_CAPTURE 0x00001000 #define PCRE_NO_UTF8_CHECK 0x00002000 #define PCRE_AUTO_CALLOUT 0x00004000 #define PCRE_PARTIAL 0x00008000 #define PCRE_DFA_SHORTEST 0x00010000 #define PCRE_DFA_RESTART 0x00020000 #define PCRE_FIRSTLINE 0x00040000 #define PCRE_DUPNAMES 0x00080000 #define PCRE_NEWLINE_CR 0x00100000 #define PCRE_NEWLINE_LF 0x00200000 #define PCRE_NEWLINE_CRLF 0x00300000 #define PCRE_NEWLINE_ANY 0x00400000 #define PCRE_NEWLINE_ANYCRLF 0x00500000 /* Exec-time and get/set-time error codes */ #define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_UNKNOWN_OPCODE (-5) #define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ #define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOSUBSTRING (-7) #define PCRE_ERROR_MATCHLIMIT (-8) #define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ #define PCRE_ERROR_BADUTF8 (-10) #define PCRE_ERROR_BADUTF8_OFFSET (-11) #define PCRE_ERROR_PARTIAL (-12) #define PCRE_ERROR_BADPARTIAL (-13) #define PCRE_ERROR_INTERNAL (-14) #define PCRE_ERROR_BADCOUNT (-15) #define PCRE_ERROR_DFA_UITEM (-16) #define PCRE_ERROR_DFA_UCOND (-17) #define PCRE_ERROR_DFA_UMLIMIT (-18) #define PCRE_ERROR_DFA_WSSIZE (-19) #define PCRE_ERROR_DFA_RECURSE (-20) #define PCRE_ERROR_RECURSIONLIMIT (-21) #define PCRE_ERROR_NOTUSED (-22) #define PCRE_ERROR_BADNEWLINE (-23) /* Request types for pcre_fullinfo() */ #define PCRE_INFO_OPTIONS 0 #define PCRE_INFO_SIZE 1 #define PCRE_INFO_CAPTURECOUNT 2 #define PCRE_INFO_BACKREFMAX 3 #define PCRE_INFO_FIRSTBYTE 4 #define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ #define PCRE_INFO_FIRSTTABLE 5 #define PCRE_INFO_LASTLITERAL 6 #define PCRE_INFO_NAMEENTRYSIZE 7 #define PCRE_INFO_NAMECOUNT 8 #define PCRE_INFO_NAMETABLE 9 #define PCRE_INFO_STUDYSIZE 10 #define PCRE_INFO_DEFAULT_TABLES 11 #define PCRE_INFO_OKPARTIAL 12 #define PCRE_INFO_JCHANGED 13 #define PCRE_INFO_HASCRORLF 14 /* Request types for pcre_config(). Do not re-arrange, in order to remain compatible. */ #define PCRE_CONFIG_UTF8 0 #define PCRE_CONFIG_NEWLINE 1 #define PCRE_CONFIG_LINK_SIZE 2 #define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 #define PCRE_CONFIG_MATCH_LIMIT 4 #define PCRE_CONFIG_STACKRECURSE 5 #define PCRE_CONFIG_UNICODE_PROPERTIES 6 #define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 /* Bit flags for the pcre_extra structure. Do not re-arrange or redefine these bits, just add new ones on the end, in order to remain compatible. */ #define PCRE_EXTRA_STUDY_DATA 0x0001 #define PCRE_EXTRA_MATCH_LIMIT 0x0002 #define PCRE_EXTRA_CALLOUT_DATA 0x0004 #define PCRE_EXTRA_TABLES 0x0008 #define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 /* Types */ struct real_pcre; /* declaration; the definition is private */ typedef struct real_pcre pcre; /* When PCRE is compiled as a C++ library, the subject pointer type can be replaced with a custom type. For conventional use, the public interface is a const char *. */ #ifndef PCRE_SPTR #define PCRE_SPTR const char * #endif /* The structure for passing additional data to pcre_exec(). This is defined in such as way as to be extensible. Always add new fields at the end, in order to remain compatible. */ typedef struct pcre_extra { unsigned long int flags; /* Bits for which fields are set */ void *study_data; /* Opaque data from pcre_study() */ unsigned long int match_limit; /* Maximum number of calls to match() */ void *callout_data; /* Data passed back in callouts */ const unsigned char *tables; /* Pointer to character tables */ unsigned long int match_limit_recursion; /* Max recursive calls to match() */ } pcre_extra; /* The structure for passing out data via the pcre_callout_function. We use a structure so that new fields can be added on the end in future versions, without changing the API of the function, thereby allowing old clients to work without modification. */ typedef struct pcre_callout_block { int version; /* Identifies version of block */ /* ------------------------ Version 0 ------------------------------- */ int callout_number; /* Number compiled into pattern */ int *offset_vector; /* The offset vector */ PCRE_SPTR subject; /* The subject being matched */ int subject_length; /* The length of the subject */ int start_match; /* Offset to start of this match attempt */ int current_position; /* Where we currently are in the subject */ int capture_top; /* Max current capture */ int capture_last; /* Most recently closed capture */ void *callout_data; /* Data passed in with the call */ /* ------------------- Added for Version 1 -------------------------- */ int pattern_position; /* Offset to next item in the pattern */ int next_item_length; /* Length of next item in the pattern */ /* ------------------------------------------------------------------ */ } pcre_callout_block; /* Indirection for store get and free functions. These can be set to alternative malloc/free functions if required. Special ones are used in the non-recursive case for "frames". There is also an optional callout function that is triggered by the (?) regex item. For Virtual Pascal, these definitions have to take another form. */ #ifndef VPCOMPAT PCRE_EXP_DECL void *(*pcre_malloc)(size_t); PCRE_EXP_DECL void (*pcre_free)(void *); PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); PCRE_EXP_DECL void (*pcre_stack_free)(void *); PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); #else /* VPCOMPAT */ PCRE_EXP_DECL void *pcre_malloc(size_t); PCRE_EXP_DECL void pcre_free(void *); PCRE_EXP_DECL void *pcre_stack_malloc(size_t); PCRE_EXP_DECL void pcre_stack_free(void *); PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); #endif /* VPCOMPAT */ /* Exported PCRE functions */ PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, const unsigned char *); PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, int *, const unsigned char *); PCRE_EXP_DECL int pcre_config(int, void *); PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, int *, int, const char *, char *, int); PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, char *, int); PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, const char *, int, int, int, int *, int , int *, int); PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, int, int, int, int *, int); PCRE_EXP_DECL void pcre_free_substring(const char *); PCRE_EXP_DECL void pcre_free_substring_list(const char **); PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, int *, int, const char *, const char **); PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, char **, char **); PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, const char **); PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, const char ***); PCRE_EXP_DECL int pcre_info(const pcre *, int *, int *); PCRE_EXP_DECL const unsigned char *pcre_maketables(void); PCRE_EXP_DECL int pcre_refcount(pcre *, int); PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); PCRE_EXP_DECL const char *pcre_version(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* End of pcre.h */ syncevolution-1.5/src/synthesis/src/pcre/pcre.h.generic0000644000373300037200000002776312424517753025002 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is the public header file for the PCRE library, to be #included by applications that call the PCRE functions. Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ #ifndef _PCRE_H #define _PCRE_H /* The current PCRE version information. */ #define PCRE_MAJOR 7 #define PCRE_MINOR 3 #define PCRE_PRERELEASE #define PCRE_DATE 2007-08-28 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate export setting is defined in pcre_internal.h, which includes this file. So we don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ #if defined(_WIN32) && !defined(PCRE_STATIC) # ifndef PCRE_EXP_DECL # define PCRE_EXP_DECL extern __declspec(dllimport) # endif # ifdef __cplusplus # ifndef PCRECPP_EXP_DECL # define PCRECPP_EXP_DECL extern __declspec(dllimport) # endif # ifndef PCRECPP_EXP_DEFN # define PCRECPP_EXP_DEFN __declspec(dllimport) # endif # endif #endif /* By default, we use the standard "extern" declarations. */ #ifndef PCRE_EXP_DECL # ifdef __cplusplus # define PCRE_EXP_DECL extern "C" # else # define PCRE_EXP_DECL extern # endif #endif #ifdef __cplusplus # ifndef PCRECPP_EXP_DECL # define PCRECPP_EXP_DECL extern # endif # ifndef PCRECPP_EXP_DEFN # define PCRECPP_EXP_DEFN # endif #endif /* Have to include stdlib.h in order to ensure that size_t is defined; it is needed here for malloc. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif /* Options */ #define PCRE_CASELESS 0x00000001 #define PCRE_MULTILINE 0x00000002 #define PCRE_DOTALL 0x00000004 #define PCRE_EXTENDED 0x00000008 #define PCRE_ANCHORED 0x00000010 #define PCRE_DOLLAR_ENDONLY 0x00000020 #define PCRE_EXTRA 0x00000040 #define PCRE_NOTBOL 0x00000080 #define PCRE_NOTEOL 0x00000100 #define PCRE_UNGREEDY 0x00000200 #define PCRE_NOTEMPTY 0x00000400 #define PCRE_UTF8 0x00000800 #define PCRE_NO_AUTO_CAPTURE 0x00001000 #define PCRE_NO_UTF8_CHECK 0x00002000 #define PCRE_AUTO_CALLOUT 0x00004000 #define PCRE_PARTIAL 0x00008000 #define PCRE_DFA_SHORTEST 0x00010000 #define PCRE_DFA_RESTART 0x00020000 #define PCRE_FIRSTLINE 0x00040000 #define PCRE_DUPNAMES 0x00080000 #define PCRE_NEWLINE_CR 0x00100000 #define PCRE_NEWLINE_LF 0x00200000 #define PCRE_NEWLINE_CRLF 0x00300000 #define PCRE_NEWLINE_ANY 0x00400000 #define PCRE_NEWLINE_ANYCRLF 0x00500000 /* Exec-time and get/set-time error codes */ #define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_UNKNOWN_OPCODE (-5) #define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ #define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOSUBSTRING (-7) #define PCRE_ERROR_MATCHLIMIT (-8) #define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ #define PCRE_ERROR_BADUTF8 (-10) #define PCRE_ERROR_BADUTF8_OFFSET (-11) #define PCRE_ERROR_PARTIAL (-12) #define PCRE_ERROR_BADPARTIAL (-13) #define PCRE_ERROR_INTERNAL (-14) #define PCRE_ERROR_BADCOUNT (-15) #define PCRE_ERROR_DFA_UITEM (-16) #define PCRE_ERROR_DFA_UCOND (-17) #define PCRE_ERROR_DFA_UMLIMIT (-18) #define PCRE_ERROR_DFA_WSSIZE (-19) #define PCRE_ERROR_DFA_RECURSE (-20) #define PCRE_ERROR_RECURSIONLIMIT (-21) #define PCRE_ERROR_NOTUSED (-22) #define PCRE_ERROR_BADNEWLINE (-23) /* Request types for pcre_fullinfo() */ #define PCRE_INFO_OPTIONS 0 #define PCRE_INFO_SIZE 1 #define PCRE_INFO_CAPTURECOUNT 2 #define PCRE_INFO_BACKREFMAX 3 #define PCRE_INFO_FIRSTBYTE 4 #define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ #define PCRE_INFO_FIRSTTABLE 5 #define PCRE_INFO_LASTLITERAL 6 #define PCRE_INFO_NAMEENTRYSIZE 7 #define PCRE_INFO_NAMECOUNT 8 #define PCRE_INFO_NAMETABLE 9 #define PCRE_INFO_STUDYSIZE 10 #define PCRE_INFO_DEFAULT_TABLES 11 #define PCRE_INFO_OKPARTIAL 12 #define PCRE_INFO_JCHANGED 13 #define PCRE_INFO_HASCRORLF 14 /* Request types for pcre_config(). Do not re-arrange, in order to remain compatible. */ #define PCRE_CONFIG_UTF8 0 #define PCRE_CONFIG_NEWLINE 1 #define PCRE_CONFIG_LINK_SIZE 2 #define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 #define PCRE_CONFIG_MATCH_LIMIT 4 #define PCRE_CONFIG_STACKRECURSE 5 #define PCRE_CONFIG_UNICODE_PROPERTIES 6 #define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 /* Bit flags for the pcre_extra structure. Do not re-arrange or redefine these bits, just add new ones on the end, in order to remain compatible. */ #define PCRE_EXTRA_STUDY_DATA 0x0001 #define PCRE_EXTRA_MATCH_LIMIT 0x0002 #define PCRE_EXTRA_CALLOUT_DATA 0x0004 #define PCRE_EXTRA_TABLES 0x0008 #define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 /* Types */ struct real_pcre; /* declaration; the definition is private */ typedef struct real_pcre pcre; /* When PCRE is compiled as a C++ library, the subject pointer type can be replaced with a custom type. For conventional use, the public interface is a const char *. */ #ifndef PCRE_SPTR #define PCRE_SPTR const char * #endif /* The structure for passing additional data to pcre_exec(). This is defined in such as way as to be extensible. Always add new fields at the end, in order to remain compatible. */ typedef struct pcre_extra { unsigned long int flags; /* Bits for which fields are set */ void *study_data; /* Opaque data from pcre_study() */ unsigned long int match_limit; /* Maximum number of calls to match() */ void *callout_data; /* Data passed back in callouts */ const unsigned char *tables; /* Pointer to character tables */ unsigned long int match_limit_recursion; /* Max recursive calls to match() */ } pcre_extra; /* The structure for passing out data via the pcre_callout_function. We use a structure so that new fields can be added on the end in future versions, without changing the API of the function, thereby allowing old clients to work without modification. */ typedef struct pcre_callout_block { int version; /* Identifies version of block */ /* ------------------------ Version 0 ------------------------------- */ int callout_number; /* Number compiled into pattern */ int *offset_vector; /* The offset vector */ PCRE_SPTR subject; /* The subject being matched */ int subject_length; /* The length of the subject */ int start_match; /* Offset to start of this match attempt */ int current_position; /* Where we currently are in the subject */ int capture_top; /* Max current capture */ int capture_last; /* Most recently closed capture */ void *callout_data; /* Data passed in with the call */ /* ------------------- Added for Version 1 -------------------------- */ int pattern_position; /* Offset to next item in the pattern */ int next_item_length; /* Length of next item in the pattern */ /* ------------------------------------------------------------------ */ } pcre_callout_block; /* Indirection for store get and free functions. These can be set to alternative malloc/free functions if required. Special ones are used in the non-recursive case for "frames". There is also an optional callout function that is triggered by the (?) regex item. For Virtual Pascal, these definitions have to take another form. */ #ifndef VPCOMPAT PCRE_EXP_DECL void *(*pcre_malloc)(size_t); PCRE_EXP_DECL void (*pcre_free)(void *); PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); PCRE_EXP_DECL void (*pcre_stack_free)(void *); PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); #else /* VPCOMPAT */ PCRE_EXP_DECL void *pcre_malloc(size_t); PCRE_EXP_DECL void pcre_free(void *); PCRE_EXP_DECL void *pcre_stack_malloc(size_t); PCRE_EXP_DECL void pcre_stack_free(void *); PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); #endif /* VPCOMPAT */ /* Exported PCRE functions */ PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, const unsigned char *); PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, int *, const unsigned char *); PCRE_EXP_DECL int pcre_config(int, void *); PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, int *, int, const char *, char *, int); PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, char *, int); PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, const char *, int, int, int, int *, int , int *, int); PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, int, int, int, int *, int); PCRE_EXP_DECL void pcre_free_substring(const char *); PCRE_EXP_DECL void pcre_free_substring_list(const char **); PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, int *, int, const char *, const char **); PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, char **, char **); PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, const char **); PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, const char ***); PCRE_EXP_DECL int pcre_info(const pcre *, int *, int *); PCRE_EXP_DECL const unsigned char *pcre_maketables(void); PCRE_EXP_DECL int pcre_refcount(pcre *, int); PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); PCRE_EXP_DECL const char *pcre_version(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* End of pcre.h */ syncevolution-1.5/src/synthesis/src/pcre/pcre.h.in0000644000373300037200000003003312424517753023754 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This is the public header file for the PCRE library, to be #included by applications that call the PCRE functions. Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ #ifndef _PCRE_H #define _PCRE_H /* The current PCRE version information. */ #define PCRE_MAJOR @PCRE_MAJOR@ #define PCRE_MINOR @PCRE_MINOR@ #define PCRE_PRERELEASE @PCRE_PRERELEASE@ #define PCRE_DATE @PCRE_DATE@ /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate export setting is defined in pcre_internal.h, which includes this file. So we don't change existing definitions of PCRE_EXP_DECL and PCRECPP_EXP_DECL. */ #if defined(_WIN32) && !defined(PCRE_STATIC) # ifndef PCRE_EXP_DECL # define PCRE_EXP_DECL extern __declspec(dllimport) # endif # ifdef __cplusplus # ifndef PCRECPP_EXP_DECL # define PCRECPP_EXP_DECL extern __declspec(dllimport) # endif # ifndef PCRECPP_EXP_DEFN # define PCRECPP_EXP_DEFN __declspec(dllimport) # endif # endif #endif /* By default, we use the standard "extern" declarations. */ #ifndef PCRE_EXP_DECL # ifdef __cplusplus # define PCRE_EXP_DECL extern "C" # else # define PCRE_EXP_DECL extern # endif #endif #ifdef __cplusplus # ifndef PCRECPP_EXP_DECL # define PCRECPP_EXP_DECL extern # endif # ifndef PCRECPP_EXP_DEFN # define PCRECPP_EXP_DEFN # endif #endif /* Have to include stdlib.h in order to ensure that size_t is defined; it is needed here for malloc. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif /* Options */ #define PCRE_CASELESS 0x00000001 #define PCRE_MULTILINE 0x00000002 #define PCRE_DOTALL 0x00000004 #define PCRE_EXTENDED 0x00000008 #define PCRE_ANCHORED 0x00000010 #define PCRE_DOLLAR_ENDONLY 0x00000020 #define PCRE_EXTRA 0x00000040 #define PCRE_NOTBOL 0x00000080 #define PCRE_NOTEOL 0x00000100 #define PCRE_UNGREEDY 0x00000200 #define PCRE_NOTEMPTY 0x00000400 #define PCRE_UTF8 0x00000800 #define PCRE_NO_AUTO_CAPTURE 0x00001000 #define PCRE_NO_UTF8_CHECK 0x00002000 #define PCRE_AUTO_CALLOUT 0x00004000 #define PCRE_PARTIAL 0x00008000 #define PCRE_DFA_SHORTEST 0x00010000 #define PCRE_DFA_RESTART 0x00020000 #define PCRE_FIRSTLINE 0x00040000 #define PCRE_DUPNAMES 0x00080000 #define PCRE_NEWLINE_CR 0x00100000 #define PCRE_NEWLINE_LF 0x00200000 #define PCRE_NEWLINE_CRLF 0x00300000 #define PCRE_NEWLINE_ANY 0x00400000 #define PCRE_NEWLINE_ANYCRLF 0x00500000 /* Exec-time and get/set-time error codes */ #define PCRE_ERROR_NOMATCH (-1) #define PCRE_ERROR_NULL (-2) #define PCRE_ERROR_BADOPTION (-3) #define PCRE_ERROR_BADMAGIC (-4) #define PCRE_ERROR_UNKNOWN_OPCODE (-5) #define PCRE_ERROR_UNKNOWN_NODE (-5) /* For backward compatibility */ #define PCRE_ERROR_NOMEMORY (-6) #define PCRE_ERROR_NOSUBSTRING (-7) #define PCRE_ERROR_MATCHLIMIT (-8) #define PCRE_ERROR_CALLOUT (-9) /* Never used by PCRE itself */ #define PCRE_ERROR_BADUTF8 (-10) #define PCRE_ERROR_BADUTF8_OFFSET (-11) #define PCRE_ERROR_PARTIAL (-12) #define PCRE_ERROR_BADPARTIAL (-13) #define PCRE_ERROR_INTERNAL (-14) #define PCRE_ERROR_BADCOUNT (-15) #define PCRE_ERROR_DFA_UITEM (-16) #define PCRE_ERROR_DFA_UCOND (-17) #define PCRE_ERROR_DFA_UMLIMIT (-18) #define PCRE_ERROR_DFA_WSSIZE (-19) #define PCRE_ERROR_DFA_RECURSE (-20) #define PCRE_ERROR_RECURSIONLIMIT (-21) #define PCRE_ERROR_NOTUSED (-22) #define PCRE_ERROR_BADNEWLINE (-23) /* Request types for pcre_fullinfo() */ #define PCRE_INFO_OPTIONS 0 #define PCRE_INFO_SIZE 1 #define PCRE_INFO_CAPTURECOUNT 2 #define PCRE_INFO_BACKREFMAX 3 #define PCRE_INFO_FIRSTBYTE 4 #define PCRE_INFO_FIRSTCHAR 4 /* For backwards compatibility */ #define PCRE_INFO_FIRSTTABLE 5 #define PCRE_INFO_LASTLITERAL 6 #define PCRE_INFO_NAMEENTRYSIZE 7 #define PCRE_INFO_NAMECOUNT 8 #define PCRE_INFO_NAMETABLE 9 #define PCRE_INFO_STUDYSIZE 10 #define PCRE_INFO_DEFAULT_TABLES 11 #define PCRE_INFO_OKPARTIAL 12 #define PCRE_INFO_JCHANGED 13 #define PCRE_INFO_HASCRORLF 14 /* Request types for pcre_config(). Do not re-arrange, in order to remain compatible. */ #define PCRE_CONFIG_UTF8 0 #define PCRE_CONFIG_NEWLINE 1 #define PCRE_CONFIG_LINK_SIZE 2 #define PCRE_CONFIG_POSIX_MALLOC_THRESHOLD 3 #define PCRE_CONFIG_MATCH_LIMIT 4 #define PCRE_CONFIG_STACKRECURSE 5 #define PCRE_CONFIG_UNICODE_PROPERTIES 6 #define PCRE_CONFIG_MATCH_LIMIT_RECURSION 7 /* Bit flags for the pcre_extra structure. Do not re-arrange or redefine these bits, just add new ones on the end, in order to remain compatible. */ #define PCRE_EXTRA_STUDY_DATA 0x0001 #define PCRE_EXTRA_MATCH_LIMIT 0x0002 #define PCRE_EXTRA_CALLOUT_DATA 0x0004 #define PCRE_EXTRA_TABLES 0x0008 #define PCRE_EXTRA_MATCH_LIMIT_RECURSION 0x0010 /* Types */ struct real_pcre; /* declaration; the definition is private */ typedef struct real_pcre pcre; /* When PCRE is compiled as a C++ library, the subject pointer type can be replaced with a custom type. For conventional use, the public interface is a const char *. */ #ifndef PCRE_SPTR #define PCRE_SPTR const char * #endif /* The structure for passing additional data to pcre_exec(). This is defined in such as way as to be extensible. Always add new fields at the end, in order to remain compatible. */ typedef struct pcre_extra { unsigned long int flags; /* Bits for which fields are set */ void *study_data; /* Opaque data from pcre_study() */ unsigned long int match_limit; /* Maximum number of calls to match() */ void *callout_data; /* Data passed back in callouts */ const unsigned char *tables; /* Pointer to character tables */ unsigned long int match_limit_recursion; /* Max recursive calls to match() */ } pcre_extra; /* The structure for passing out data via the pcre_callout_function. We use a structure so that new fields can be added on the end in future versions, without changing the API of the function, thereby allowing old clients to work without modification. */ typedef struct pcre_callout_block { int version; /* Identifies version of block */ /* ------------------------ Version 0 ------------------------------- */ int callout_number; /* Number compiled into pattern */ int *offset_vector; /* The offset vector */ PCRE_SPTR subject; /* The subject being matched */ int subject_length; /* The length of the subject */ int start_match; /* Offset to start of this match attempt */ int current_position; /* Where we currently are in the subject */ int capture_top; /* Max current capture */ int capture_last; /* Most recently closed capture */ void *callout_data; /* Data passed in with the call */ /* ------------------- Added for Version 1 -------------------------- */ int pattern_position; /* Offset to next item in the pattern */ int next_item_length; /* Length of next item in the pattern */ /* ------------------------------------------------------------------ */ } pcre_callout_block; /* Indirection for store get and free functions. These can be set to alternative malloc/free functions if required. Special ones are used in the non-recursive case for "frames". There is also an optional callout function that is triggered by the (?) regex item. For Virtual Pascal, these definitions have to take another form. */ #ifndef VPCOMPAT PCRE_EXP_DECL void *(*pcre_malloc)(size_t); PCRE_EXP_DECL void (*pcre_free)(void *); PCRE_EXP_DECL void *(*pcre_stack_malloc)(size_t); PCRE_EXP_DECL void (*pcre_stack_free)(void *); PCRE_EXP_DECL int (*pcre_callout)(pcre_callout_block *); #else /* VPCOMPAT */ PCRE_EXP_DECL void *pcre_malloc(size_t); PCRE_EXP_DECL void pcre_free(void *); PCRE_EXP_DECL void *pcre_stack_malloc(size_t); PCRE_EXP_DECL void pcre_stack_free(void *); PCRE_EXP_DECL int pcre_callout(pcre_callout_block *); #endif /* VPCOMPAT */ /* Exported PCRE functions */ PCRE_EXP_DECL pcre *pcre_compile(const char *, int, const char **, int *, const unsigned char *); PCRE_EXP_DECL pcre *pcre_compile2(const char *, int, int *, const char **, int *, const unsigned char *); PCRE_EXP_DECL int pcre_config(int, void *); PCRE_EXP_DECL int pcre_copy_named_substring(const pcre *, const char *, int *, int, const char *, char *, int); PCRE_EXP_DECL int pcre_copy_substring(const char *, int *, int, int, char *, int); PCRE_EXP_DECL int pcre_dfa_exec(const pcre *, const pcre_extra *, const char *, int, int, int, int *, int , int *, int); PCRE_EXP_DECL int pcre_exec(const pcre *, const pcre_extra *, PCRE_SPTR, int, int, int, int *, int); PCRE_EXP_DECL void pcre_free_substring(const char *); PCRE_EXP_DECL void pcre_free_substring_list(const char **); PCRE_EXP_DECL int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); PCRE_EXP_DECL int pcre_get_named_substring(const pcre *, const char *, int *, int, const char *, const char **); PCRE_EXP_DECL int pcre_get_stringnumber(const pcre *, const char *); PCRE_EXP_DECL int pcre_get_stringtable_entries(const pcre *, const char *, char **, char **); PCRE_EXP_DECL int pcre_get_substring(const char *, int *, int, int, const char **); PCRE_EXP_DECL int pcre_get_substring_list(const char *, int *, int, const char ***); PCRE_EXP_DECL int pcre_info(const pcre *, int *, int *); PCRE_EXP_DECL const unsigned char *pcre_maketables(void); PCRE_EXP_DECL int pcre_refcount(pcre *, int); PCRE_EXP_DECL pcre_extra *pcre_study(const pcre *, int, const char **); PCRE_EXP_DECL const char *pcre_version(void); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* End of pcre.h */ syncevolution-1.5/src/synthesis/src/pcre/pcre_chartables.c0000644000373300037200000001722212424517753025537 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file contains character tables that are used when no external tables are passed to PCRE by the application that calls it. The tables are used only for characters whose code values are less than 256. This is a default version of the tables that assumes ASCII encoding. A program called dftables (which is distributed with PCRE) can be used to build alternative versions of this file. This is necessary if you are running in an EBCDIC environment, or if you want to default to a different encoding, for example ISO-8859-1. When dftables is run, it creates these tables in the current locale. If PCRE is configured with --enable-rebuild-chartables, this happens automatically. The following #includes are present because without the gcc 4.x may remove the array definition from the final binary if PCRE is built into a static library and dead code stripping is activated. This leads to link errors. Pulling in the header ensures that the array gets flagged as "someone outside this compilation unit might reference this" and so it will always be supplied to the linker. */ #include "pcre_setup.h" #include "pcre_internal.h" const unsigned char _pcre_default_tables[] = { /* This table is a lower casing table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table is a case flipping table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table contains bit maps for various character classes. Each map is 32 bytes long and the bits run from the least significant end of each byte. The classes that have their own maps are: space, xdigit, digit, upper, lower, word, graph, print, punct, and cntrl. Other classes are built from combinations. */ 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* This table identifies various classes of character by individual bits: 0x01 white space character 0x02 letter 0x04 decimal digit 0x08 hexadecimal digit 0x10 alphanumeric or '_' 0x80 regular expression metacharacter or binary zero */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ /* End of pcre_chartables.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_chartables.c.dist0000644000373300037200000001725212424517753026504 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* This file contains character tables that are used when no external tables are passed to PCRE by the application that calls it. The tables are used only for characters whose code values are less than 256. This is a default version of the tables that assumes ASCII encoding. A program called dftables (which is distributed with PCRE) can be used to build alternative versions of this file. This is necessary if you are running in an EBCDIC environment, or if you want to default to a different encoding, for example ISO-8859-1. When dftables is run, it creates these tables in the current locale. If PCRE is configured with --enable-rebuild-chartables, this happens automatically. The following #includes are present because without the gcc 4.x may remove the array definition from the final binary if PCRE is built into a static library and dead code stripping is activated. This leads to link errors. Pulling in the header ensures that the array gets flagged as "someone outside this compilation unit might reference this" and so it will always be supplied to the linker. */ #ifdef HAVE_CONFIG_H #include #endif #include "pcre_internal.h" const unsigned char _pcre_default_tables[] = { /* This table is a lower casing table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table is a case flipping table. */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103, 104,105,106,107,108,109,110,111, 112,113,114,115,116,117,118,119, 120,121,122, 91, 92, 93, 94, 95, 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127, 128,129,130,131,132,133,134,135, 136,137,138,139,140,141,142,143, 144,145,146,147,148,149,150,151, 152,153,154,155,156,157,158,159, 160,161,162,163,164,165,166,167, 168,169,170,171,172,173,174,175, 176,177,178,179,180,181,182,183, 184,185,186,187,188,189,190,191, 192,193,194,195,196,197,198,199, 200,201,202,203,204,205,206,207, 208,209,210,211,212,213,214,215, 216,217,218,219,220,221,222,223, 224,225,226,227,228,229,230,231, 232,233,234,235,236,237,238,239, 240,241,242,243,244,245,246,247, 248,249,250,251,252,253,254,255, /* This table contains bit maps for various character classes. Each map is 32 bytes long and the bits run from the least significant end of each byte. The classes that have their own maps are: space, xdigit, digit, upper, lower, word, graph, print, punct, and cntrl. Other classes are built from combinations. */ 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* This table identifies various classes of character by individual bits: 0x01 white space character 0x02 letter 0x04 decimal digit 0x08 hexadecimal digit 0x10 alphanumeric or '_' 0x80 regular expression metacharacter or binary zero */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ 0x12,0x12,0x12,0x80,0x80,0x00,0x80,0x10, /* X - _ */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ /* End of pcre_chartables.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_compile.c0000644000373300037200000056437112424517753025073 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_compile(), along with supporting internal functions that are not used by other modules. */ #include "pcre_setup.h" #define NLBLOCK cd /* Block containing newline information */ #define PSSTART start_pattern /* Field containing processed string start */ #define PSEND end_pattern /* Field containing processed string end */ #include "pcre_internal.h" /* When DEBUG is defined, we need the pcre_printint() function, which is also used by pcretest. DEBUG is not defined when building a production library. */ #ifdef DEBUG #include "pcre_printint.src" #endif /* Macro for setting individual bits in class bitmaps. */ #define SETBIT(a,b) a[b/8] |= (1 << (b%8)) /* Maximum length value to check against when making sure that the integer that holds the compiled pattern length does not overflow. We make it a bit less than INT_MAX to allow for adding in group terminating bytes, so that we don't have to check them every time. */ #define OFLOW_MAX (INT_MAX - 20) /************************************************* * Code parameters and static tables * *************************************************/ /* This value specifies the size of stack workspace that is used during the first pre-compile phase that determines how much memory is required. The regex is partly compiled into this space, but the compiled parts are discarded as soon as they can be, so that hopefully there will never be an overrun. The code does, however, check for an overrun. The largest amount I've seen used is 218, so this number is very generous. The same workspace is used during the second, actual compile phase for remembering forward references to groups so that they can be filled in at the end. Each entry in this list occupies LINK_SIZE bytes, so even when LINK_SIZE is 4 there is plenty of room. */ #define COMPILE_WORK_SIZE (4096) /* Table for handling escaped characters in the range '0'-'z'. Positive returns are simple data values; negative values are for special things like \d and so on. Zero means further processing is needed (for things like \x), or the escape is invalid. */ #ifndef EBCDIC /* This is the "normal" table for ASCII systems */ static const short int escapes[] = { 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ '@', -ESC_A, -ESC_B, -ESC_C, -ESC_D, -ESC_E, 0, -ESC_G, /* @ - G */ -ESC_H, 0, 0, -ESC_K, 0, 0, 0, 0, /* H - O */ -ESC_P, -ESC_Q, -ESC_R, -ESC_S, 0, 0, -ESC_V, -ESC_W, /* P - W */ -ESC_X, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */ '`', 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* ` - g */ -ESC_h, 0, 0, -ESC_k, 0, 0, ESC_n, 0, /* h - o */ -ESC_p, 0, ESC_r, -ESC_s, ESC_tee, 0, -ESC_v, -ESC_w, /* p - w */ 0, 0, -ESC_z /* x - z */ }; #else /* This is the "abnormal" table for EBCDIC systems */ static const short int escapes[] = { /* 48 */ 0, 0, 0, '.', '<', '(', '+', '|', /* 50 */ '&', 0, 0, 0, 0, 0, 0, 0, /* 58 */ 0, 0, '!', '$', '*', ')', ';', '~', /* 60 */ '-', '/', 0, 0, 0, 0, 0, 0, /* 68 */ 0, 0, '|', ',', '%', '_', '>', '?', /* 70 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 78 */ 0, '`', ':', '#', '@', '\'', '=', '"', /* 80 */ 0, 7, -ESC_b, 0, -ESC_d, ESC_e, ESC_f, 0, /* 88 */-ESC_h, 0, 0, '{', 0, 0, 0, 0, /* 90 */ 0, 0, -ESC_k, 'l', 0, ESC_n, 0, -ESC_p, /* 98 */ 0, ESC_r, 0, '}', 0, 0, 0, 0, /* A0 */ 0, '~', -ESC_s, ESC_tee, 0,-ESC_v, -ESC_w, 0, /* A8 */ 0,-ESC_z, 0, 0, 0, '[', 0, 0, /* B0 */ 0, 0, 0, 0, 0, 0, 0, 0, /* B8 */ 0, 0, 0, 0, 0, ']', '=', '-', /* C0 */ '{',-ESC_A, -ESC_B, -ESC_C, -ESC_D,-ESC_E, 0, -ESC_G, /* C8 */-ESC_H, 0, 0, 0, 0, 0, 0, 0, /* D0 */ '}', 0, -ESC_K, 0, 0, 0, 0, -ESC_P, /* D8 */-ESC_Q,-ESC_R, 0, 0, 0, 0, 0, 0, /* E0 */ '\\', 0, -ESC_S, 0, 0,-ESC_V, -ESC_W, -ESC_X, /* E8 */ 0,-ESC_Z, 0, 0, 0, 0, 0, 0, /* F0 */ 0, 0, 0, 0, 0, 0, 0, 0, /* F8 */ 0, 0, 0, 0, 0, 0, 0, 0 }; #endif /* Table of special "verbs" like (*PRUNE) */ typedef struct verbitem { const char *name; int len; int op; } verbitem; static verbitem verbs[] = { { "ACCEPT", 6, OP_ACCEPT }, { "COMMIT", 6, OP_COMMIT }, { "F", 1, OP_FAIL }, { "FAIL", 4, OP_FAIL }, { "PRUNE", 5, OP_PRUNE }, { "SKIP", 4, OP_SKIP }, { "THEN", 4, OP_THEN } }; static int verbcount = sizeof(verbs)/sizeof(verbitem); /* Tables of names of POSIX character classes and their lengths. The list is terminated by a zero length entry. The first three must be alpha, lower, upper, as this is assumed for handling case independence. */ static const char *const posix_names[] = { "alpha", "lower", "upper", "alnum", "ascii", "blank", "cntrl", "digit", "graph", "print", "punct", "space", "word", "xdigit" }; static const uschar posix_name_lengths[] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; /* Table of class bit maps for each POSIX class. Each class is formed from a base map, with an optional addition or removal of another map. Then, for some classes, there is some additional tweaking: for [:blank:] the vertical space characters are removed, and for [:alpha:] and [:alnum:] the underscore character is removed. The triples in the table consist of the base map offset, second map offset or -1 if no second map, and a non-negative value for map addition or a negative value for map subtraction (if there are two maps). The absolute value of the third field has these meanings: 0 => no tweaking, 1 => remove vertical space characters, 2 => remove underscore. */ static const int posix_class_maps[] = { cbit_word, cbit_digit, -2, /* alpha */ cbit_lower, -1, 0, /* lower */ cbit_upper, -1, 0, /* upper */ cbit_word, -1, 2, /* alnum - word without underscore */ cbit_print, cbit_cntrl, 0, /* ascii */ cbit_space, -1, 1, /* blank - a GNU extension */ cbit_cntrl, -1, 0, /* cntrl */ cbit_digit, -1, 0, /* digit */ cbit_graph, -1, 0, /* graph */ cbit_print, -1, 0, /* print */ cbit_punct, -1, 0, /* punct */ cbit_space, -1, 0, /* space */ cbit_word, -1, 0, /* word - a Perl extension */ cbit_xdigit,-1, 0 /* xdigit */ }; #define STRING(a) # a #define XSTRING(s) STRING(s) /* The texts of compile-time error messages. These are "char *" because they are passed to the outside world. Do not ever re-use any error number, because they are documented. Always add a new error instead. Messages marked DEAD below are no longer used. */ static const char *error_texts[] = { "no error", "\\ at end of pattern", "\\c at end of pattern", "unrecognized character follows \\", "numbers out of order in {} quantifier", /* 5 */ "number too big in {} quantifier", "missing terminating ] for character class", "invalid escape sequence in character class", "range out of order in character class", "nothing to repeat", /* 10 */ "operand of unlimited repeat could match the empty string", /** DEAD **/ "internal error: unexpected repeat", "unrecognized character after (?", "POSIX named classes are supported only within a class", "missing )", /* 15 */ "reference to non-existent subpattern", "erroffset passed as NULL", "unknown option bit(s) set", "missing ) after comment", "parentheses nested too deeply", /** DEAD **/ /* 20 */ "regular expression is too large", "failed to get memory", "unmatched parentheses", "internal error: code overflow", "unrecognized character after (?<", /* 25 */ "lookbehind assertion is not fixed length", "malformed number or name after (?(", "conditional group contains more than two branches", "assertion expected after (?(", "(?R or (?[+-]digits must be followed by )", /* 30 */ "unknown POSIX class name", "POSIX collating elements are not supported", "this version of PCRE is not compiled with PCRE_UTF8 support", "spare error", /** DEAD **/ "character value in \\x{...} sequence is too large", /* 35 */ "invalid condition (?(0)", "\\C not allowed in lookbehind assertion", "PCRE does not support \\L, \\l, \\N, \\U, or \\u", "number after (?C is > 255", "closing ) for (?C expected", /* 40 */ "recursive call could loop indefinitely", "unrecognized character after (?P", "syntax error in subpattern name (missing terminator)", "two named subpatterns have the same name", "invalid UTF-8 string", /* 45 */ "support for \\P, \\p, and \\X has not been compiled", "malformed \\P or \\p sequence", "unknown property name after \\P or \\p", "subpattern name is too long (maximum " XSTRING(MAX_NAME_SIZE) " characters)", "too many named subpatterns (maximum " XSTRING(MAX_NAME_COUNT) ")", /* 50 */ "repeated subpattern is too long", /** DEAD **/ "octal value is greater than \\377 (not in UTF-8 mode)", "internal error: overran compiling workspace", "internal error: previously-checked referenced subpattern not found", "DEFINE group contains more than one branch", /* 55 */ "repeating a DEFINE group is not allowed", "inconsistent NEWLINE options", "\\g is not followed by a braced name or an optionally braced non-zero number", "(?+ or (?- or (?(+ or (?(- must be followed by a non-zero number", "(*VERB) with an argument is not supported", /* 60 */ "(*VERB) not recognized", "number is too big" }; /* Table to identify digits and hex digits. This is used when compiling patterns. Note that the tables in chartables are dependent on the locale, and may mark arbitrary characters as digits - but the PCRE compiling code expects to handle only 0-9, a-z, and A-Z as digits when compiling. That is why we have a private table here. It costs 256 bytes, but it is a lot faster than doing character value tests (at least in some simple cases I timed), and in some applications one wants PCRE to compile efficiently as well as match efficiently. For convenience, we use the same bit definitions as in chartables: 0x04 decimal digit 0x08 hexadecimal digit Then we can use ctype_digit and ctype_xdigit in the code. */ #ifndef EBCDIC /* This is the "normal" case, for ASCII systems */ static const unsigned char digitab[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - ' */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ( - / */ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 */ 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, /* 8 - ? */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* @ - G */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H - O */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* P - W */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* X - _ */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* ` - g */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h - o */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p - w */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* x -127 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ #else /* This is the "abnormal" case, for EBCDIC systems */ static const unsigned char digitab[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 10 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32- 39 20 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 30 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 40 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 72- | */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 50 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 88- 95 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 60 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 104- ? */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 70 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* 128- g 80 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144- p 90 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160- x A0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 B0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00, /* { - G C0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* } - P D0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* \ - X E0 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, /* 0 - 7 F0 */ 0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ static const unsigned char ebcdic_chartab[] = { /* chartable partial dup */ 0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 0- 7 */ 0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00, /* 8- 15 */ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 16- 23 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, /* 32- 39 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 40- 47 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 48- 55 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 56- 63 */ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - 71 */ 0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80, /* 72- | */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* & - 87 */ 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00, /* 88- 95 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* - -103 */ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x80, /* 104- ? */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 112-119 */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 120- " */ 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* 128- g */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* h -143 */ 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* 144- p */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* q -159 */ 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* 160- x */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* y -175 */ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* ^ -183 */ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ 0x80,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* { - G */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* H -207 */ 0x00,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* } - P */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Q -223 */ 0x00,0x00,0x12,0x12,0x12,0x12,0x12,0x12, /* \ - X */ 0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00, /* Y -239 */ 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00};/* 8 -255 */ #endif /* Definition to allow mutual recursion */ static BOOL compile_regex(int, int, uschar **, const uschar **, int *, BOOL, BOOL, int, int *, int *, branch_chain *, compile_data *, int *); /************************************************* * Handle escapes * *************************************************/ /* This function is called when a \ has been encountered. It either returns a positive value for a simple escape such as \n, or a negative value which encodes one of the more complicated things such as \d. A backreference to group n is returned as -(ESC_REF + n); ESC_REF is the highest ESC_xxx macro. When UTF-8 is enabled, a positive value greater than 255 may be returned. On entry, ptr is pointing at the \. On exit, it is on the final character of the escape sequence. Arguments: ptrptr points to the pattern position pointer errorcodeptr points to the errorcode variable bracount number of previous extracting brackets options the options bits isclass TRUE if inside a character class Returns: zero or positive => a data character negative => a special escape sequence on error, errorcodeptr is set */ static int check_escape(const uschar **ptrptr, int *errorcodeptr, int bracount, int options, BOOL isclass) { BOOL utf8 = (options & PCRE_UTF8) != 0; const uschar *ptr = *ptrptr + 1; int c, i; GETCHARINCTEST(c, ptr); /* Get character value, increment pointer */ ptr--; /* Set pointer back to the last byte */ /* If backslash is at the end of the pattern, it's an error. */ if (c == 0) *errorcodeptr = ERR1; /* Non-alphamerics are literals. For digits or letters, do an initial lookup in a table. A non-zero result is something that can be returned immediately. Otherwise further processing may be required. */ #ifndef EBCDIC /* ASCII coding */ else if (c < '0' || c > 'z') {} /* Not alphameric */ else if ((i = escapes[c - '0']) != 0) c = i; #else /* EBCDIC coding */ else if (c < 'a' || (ebcdic_chartab[c] & 0x0E) == 0) {} /* Not alphameric */ else if ((i = escapes[c - 0x48]) != 0) c = i; #endif /* Escapes that need further processing, or are illegal. */ else { const uschar *oldptr; BOOL braced, negated; switch (c) { /* A number of Perl escapes are not handled by PCRE. We give an explicit error. */ case 'l': case 'L': case 'N': case 'u': case 'U': *errorcodeptr = ERR37; break; /* \g must be followed by a number, either plain or braced. If positive, it is an absolute backreference. If negative, it is a relative backreference. This is a Perl 5.10 feature. Perl 5.10 also supports \g{name} as a reference to a named group. This is part of Perl's movement towards a unified syntax for back references. As this is synonymous with \k{name}, we fudge it up by pretending it really was \k. */ case 'g': if (ptr[1] == '{') { const uschar *p; for (p = ptr+2; *p != 0 && *p != '}'; p++) if (*p != '-' && (digitab[*p] & ctype_digit) == 0) break; if (*p != 0 && *p != '}') { c = -ESC_k; break; } braced = TRUE; ptr++; } else braced = FALSE; if (ptr[1] == '-') { negated = TRUE; ptr++; } else negated = FALSE; c = 0; while ((digitab[ptr[1]] & ctype_digit) != 0) c = c * 10 + *(++ptr) - '0'; if (c < 0) { *errorcodeptr = ERR61; break; } if (c == 0 || (braced && *(++ptr) != '}')) { *errorcodeptr = ERR57; break; } if (negated) { if (c > bracount) { *errorcodeptr = ERR15; break; } c = bracount - (c - 1); } c = -(ESC_REF + c); break; /* The handling of escape sequences consisting of a string of digits starting with one that is not zero is not straightforward. By experiment, the way Perl works seems to be as follows: Outside a character class, the digits are read as a decimal number. If the number is less than 10, or if there are that many previous extracting left brackets, then it is a back reference. Otherwise, up to three octal digits are read to form an escaped byte. Thus \123 is likely to be octal 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal value is greater than 377, the least significant 8 bits are taken. Inside a character class, \ followed by a digit is always an octal number. */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (!isclass) { oldptr = ptr; c -= '0'; while ((digitab[ptr[1]] & ctype_digit) != 0) c = c * 10 + *(++ptr) - '0'; if (c < 0) { *errorcodeptr = ERR61; break; } if (c < 10 || c <= bracount) { c = -(ESC_REF + c); break; } ptr = oldptr; /* Put the pointer back and fall through */ } /* Handle an octal number following \. If the first digit is 8 or 9, Perl generates a binary zero byte and treats the digit as a following literal. Thus we have to pull back the pointer by one. */ if ((c = *ptr) >= '8') { ptr--; c = 0; break; } /* \0 always starts an octal number, but we may drop through to here with a larger first octal digit. The original code used just to take the least significant 8 bits of octal numbers (I think this is what early Perls used to do). Nowadays we allow for larger numbers in UTF-8 mode, but no more than 3 octal digits. */ case '0': c -= '0'; while(i++ < 2 && ptr[1] >= '0' && ptr[1] <= '7') c = c * 8 + *(++ptr) - '0'; if (!utf8 && c > 255) *errorcodeptr = ERR51; break; /* \x is complicated. \x{ddd} is a character number which can be greater than 0xff in utf8 mode, but only if the ddd are hex digits. If not, { is treated as a data character. */ case 'x': if (ptr[1] == '{') { const uschar *pt = ptr + 2; int count = 0; c = 0; while ((digitab[*pt] & ctype_xdigit) != 0) { register int cc = *pt++; if (c == 0 && cc == '0') continue; /* Leading zeroes */ count++; #ifndef EBCDIC /* ASCII coding */ if (cc >= 'a') cc -= 32; /* Convert to upper case */ c = (c << 4) + cc - ((cc < 'A')? '0' : ('A' - 10)); #else /* EBCDIC coding */ if (cc >= 'a' && cc <= 'z') cc += 64; /* Convert to upper case */ c = (c << 4) + cc - ((cc >= '0')? '0' : ('A' - 10)); #endif } if (*pt == '}') { if (c < 0 || count > (utf8? 8 : 2)) *errorcodeptr = ERR34; ptr = pt; break; } /* If the sequence of hex digits does not end with '}', then we don't recognize this construct; fall through to the normal \x handling. */ } /* Read just a single-byte hex-defined char */ c = 0; while (i++ < 2 && (digitab[ptr[1]] & ctype_xdigit) != 0) { int cc; /* Some compilers don't like ++ */ cc = *(++ptr); /* in initializers */ #ifndef EBCDIC /* ASCII coding */ if (cc >= 'a') cc -= 32; /* Convert to upper case */ c = c * 16 + cc - ((cc < 'A')? '0' : ('A' - 10)); #else /* EBCDIC coding */ if (cc <= 'z') cc += 64; /* Convert to upper case */ c = c * 16 + cc - ((cc >= '0')? '0' : ('A' - 10)); #endif } break; /* For \c, a following letter is upper-cased; then the 0x40 bit is flipped. This coding is ASCII-specific, but then the whole concept of \cx is ASCII-specific. (However, an EBCDIC equivalent has now been added.) */ case 'c': c = *(++ptr); if (c == 0) { *errorcodeptr = ERR2; break; } #ifndef EBCDIC /* ASCII coding */ if (c >= 'a' && c <= 'z') c -= 32; c ^= 0x40; #else /* EBCDIC coding */ if (c >= 'a' && c <= 'z') c += 64; c ^= 0xC0; #endif break; /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any other alphameric following \ is an error if PCRE_EXTRA was set; otherwise, for Perl compatibility, it is a literal. This code looks a bit odd, but there used to be some cases other than the default, and there may be again in future, so I haven't "optimized" it. */ default: if ((options & PCRE_EXTRA) != 0) switch(c) { default: *errorcodeptr = ERR3; break; } break; } } *ptrptr = ptr; return c; } #ifdef SUPPORT_UCP /************************************************* * Handle \P and \p * *************************************************/ /* This function is called after \P or \p has been encountered, provided that PCRE is compiled with support for Unicode properties. On entry, ptrptr is pointing at the P or p. On exit, it is pointing at the final character of the escape sequence. Argument: ptrptr points to the pattern position pointer negptr points to a boolean that is set TRUE for negation else FALSE dptr points to an int that is set to the detailed property value errorcodeptr points to the error code variable Returns: type value from ucp_type_table, or -1 for an invalid type */ static int get_ucp(const uschar **ptrptr, BOOL *negptr, int *dptr, int *errorcodeptr) { int c, i, bot, top; const uschar *ptr = *ptrptr; char name[32]; c = *(++ptr); if (c == 0) goto ERROR_RETURN; *negptr = FALSE; /* \P or \p can be followed by a name in {}, optionally preceded by ^ for negation. */ if (c == '{') { if (ptr[1] == '^') { *negptr = TRUE; ptr++; } for (i = 0; i < (int)sizeof(name) - 1; i++) { c = *(++ptr); if (c == 0) goto ERROR_RETURN; if (c == '}') break; name[i] = c; } if (c !='}') goto ERROR_RETURN; name[i] = 0; } /* Otherwise there is just one following character */ else { name[0] = c; name[1] = 0; } *ptrptr = ptr; /* Search for a recognized property name using binary chop */ bot = 0; top = _pcre_utt_size; while (bot < top) { i = (bot + top) >> 1; c = strcmp(name, _pcre_utt[i].name); if (c == 0) { *dptr = _pcre_utt[i].value; return _pcre_utt[i].type; } if (c > 0) bot = i + 1; else top = i; } *errorcodeptr = ERR47; *ptrptr = ptr; return -1; ERROR_RETURN: *errorcodeptr = ERR46; *ptrptr = ptr; return -1; } #endif /************************************************* * Check for counted repeat * *************************************************/ /* This function is called when a '{' is encountered in a place where it might start a quantifier. It looks ahead to see if it really is a quantifier or not. It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} where the ddds are digits. Arguments: p pointer to the first char after '{' Returns: TRUE or FALSE */ static BOOL is_counted_repeat(const uschar *p) { if ((digitab[*p++] & ctype_digit) == 0) return FALSE; while ((digitab[*p] & ctype_digit) != 0) p++; if (*p == '}') return TRUE; if (*p++ != ',') return FALSE; if (*p == '}') return TRUE; if ((digitab[*p++] & ctype_digit) == 0) return FALSE; while ((digitab[*p] & ctype_digit) != 0) p++; return (*p == '}'); } /************************************************* * Read repeat counts * *************************************************/ /* Read an item of the form {n,m} and return the values. This is called only after is_counted_repeat() has confirmed that a repeat-count quantifier exists, so the syntax is guaranteed to be correct, but we need to check the values. Arguments: p pointer to first char after '{' minp pointer to int for min maxp pointer to int for max returned as -1 if no max errorcodeptr points to error code variable Returns: pointer to '}' on success; current ptr on error, with errorcodeptr set non-zero */ static const uschar * read_repeat_counts(const uschar *p, int *minp, int *maxp, int *errorcodeptr) { int min = 0; int max = -1; /* Read the minimum value and do a paranoid check: a negative value indicates an integer overflow. */ while ((digitab[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; if (min < 0 || min > 65535) { *errorcodeptr = ERR5; return p; } /* Read the maximum value if there is one, and again do a paranoid on its size. Also, max must not be less than min. */ if (*p == '}') max = min; else { if (*(++p) != '}') { max = 0; while((digitab[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; if (max < 0 || max > 65535) { *errorcodeptr = ERR5; return p; } if (max < min) { *errorcodeptr = ERR4; return p; } } } /* Fill in the required variables, and pass back the pointer to the terminating '}'. */ *minp = min; *maxp = max; return p; } /************************************************* * Find forward referenced subpattern * *************************************************/ /* This function scans along a pattern's text looking for capturing subpatterns, and counting them. If it finds a named pattern that matches the name it is given, it returns its number. Alternatively, if the name is NULL, it returns when it reaches a given numbered subpattern. This is used for forward references to subpatterns. We know that if (?P< is encountered, the name will be terminated by '>' because that is checked in the first pass. Arguments: ptr current position in the pattern count current count of capturing parens so far encountered name name to seek, or NULL if seeking a numbered subpattern lorn name length, or subpattern number if name is NULL xmode TRUE if we are in /x mode Returns: the number of the named subpattern, or -1 if not found */ static int find_parens(const uschar *ptr, int count, const uschar *name, int lorn, BOOL xmode) { const uschar *thisname; for (; *ptr != 0; ptr++) { int term; /* Skip over backslashed characters and also entire \Q...\E */ if (*ptr == '\\') { if (*(++ptr) == 0) return -1; if (*ptr == 'Q') for (;;) { while (*(++ptr) != 0 && *ptr != '\\'); if (*ptr == 0) return -1; if (*(++ptr) == 'E') break; } continue; } /* Skip over character classes */ if (*ptr == '[') { while (*(++ptr) != ']') { if (*ptr == 0) return -1; if (*ptr == '\\') { if (*(++ptr) == 0) return -1; if (*ptr == 'Q') for (;;) { while (*(++ptr) != 0 && *ptr != '\\'); if (*ptr == 0) return -1; if (*(++ptr) == 'E') break; } continue; } } continue; } /* Skip comments in /x mode */ if (xmode && *ptr == '#') { while (*(++ptr) != 0 && *ptr != '\n'); if (*ptr == 0) return -1; continue; } /* An opening parens must now be a real metacharacter */ if (*ptr != '(') continue; if (ptr[1] != '?' && ptr[1] != '*') { count++; if (name == NULL && count == lorn) return count; continue; } ptr += 2; if (*ptr == 'P') ptr++; /* Allow optional P */ /* We have to disambiguate (? */ if ((*ptr != '<' || ptr[1] == '!' || ptr[1] == '=') && *ptr != '\'') continue; count++; if (name == NULL && count == lorn) return count; term = *ptr++; if (term == '<') term = '>'; thisname = ptr; while (*ptr != term) ptr++; if (name != NULL && lorn == ptr - thisname && strncmp((const char *)name, (const char *)thisname, lorn) == 0) return count; } return -1; } /************************************************* * Find first significant op code * *************************************************/ /* This is called by several functions that scan a compiled expression looking for a fixed first character, or an anchoring op code etc. It skips over things that do not influence this. For some calls, a change of option is important. For some calls, it makes sense to skip negative forward and all backward assertions, and also the \b assertion; for others it does not. Arguments: code pointer to the start of the group options pointer to external options optbit the option bit whose changing is significant, or zero if none are skipassert TRUE if certain assertions are to be skipped Returns: pointer to the first significant opcode */ static const uschar* first_significant_code(const uschar *code, int *options, int optbit, BOOL skipassert) { for (;;) { switch ((int)*code) { case OP_OPT: if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) *options = (int)code[1]; code += 2; break; case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: if (!skipassert) return code; do code += GET(code, 1); while (*code == OP_ALT); code += _pcre_OP_lengths[*code]; break; case OP_WORD_BOUNDARY: case OP_NOT_WORD_BOUNDARY: if (!skipassert) return code; /* Fall through */ case OP_CALLOUT: case OP_CREF: case OP_RREF: case OP_DEF: code += _pcre_OP_lengths[*code]; break; default: return code; } } /* Control never reaches here */ } /************************************************* * Find the fixed length of a pattern * *************************************************/ /* Scan a pattern and compute the fixed length of subject that will match it, if the length is fixed. This is needed for dealing with backward assertions. In UTF8 mode, the result is in characters rather than bytes. Arguments: code points to the start of the pattern (the bracket) options the compiling options Returns: the fixed length, or -1 if there is no fixed length, or -2 if \C was encountered */ static int find_fixedlength(uschar *code, int options) { int length = -1; register int branchlength = 0; register uschar *cc = code + 1 + LINK_SIZE; /* Scan along the opcodes for this branch. If we get to the end of the branch, check the length against that of the other branches. */ for (;;) { int d; register int op = *cc; switch (op) { case OP_CBRA: case OP_BRA: case OP_ONCE: case OP_COND: d = find_fixedlength(cc + ((op == OP_CBRA)? 2:0), options); if (d < 0) return d; branchlength += d; do cc += GET(cc, 1); while (*cc == OP_ALT); cc += 1 + LINK_SIZE; break; /* Reached end of a branch; if it's a ket it is the end of a nested call. If it's ALT it is an alternation in a nested call. If it is END it's the end of the outer call. All can be handled by the same code. */ case OP_ALT: case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_END: if (length < 0) length = branchlength; else if (length != branchlength) return -1; if (*cc != OP_ALT) return length; cc += 1 + LINK_SIZE; branchlength = 0; break; /* Skip over assertive subpatterns */ case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do cc += GET(cc, 1); while (*cc == OP_ALT); /* Fall through */ /* Skip over things that don't match chars */ case OP_REVERSE: case OP_CREF: case OP_RREF: case OP_DEF: case OP_OPT: case OP_CALLOUT: case OP_SOD: case OP_SOM: case OP_EOD: case OP_EODN: case OP_CIRC: case OP_DOLL: case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: cc += _pcre_OP_lengths[*cc]; break; /* Handle literal characters */ case OP_CHAR: case OP_CHARNC: case OP_NOT: branchlength++; cc += 2; #ifdef SUPPORT_UTF8 if ((options & PCRE_UTF8) != 0) { while ((*cc & 0xc0) == 0x80) cc++; } #endif break; /* Handle exact repetitions. The count is already in characters, but we need to skip over a multibyte character in UTF8 mode. */ case OP_EXACT: branchlength += GET2(cc,1); cc += 4; #ifdef SUPPORT_UTF8 if ((options & PCRE_UTF8) != 0) { while((*cc & 0x80) == 0x80) cc++; } #endif break; case OP_TYPEEXACT: branchlength += GET2(cc,1); if (cc[3] == OP_PROP || cc[3] == OP_NOTPROP) cc += 2; cc += 4; break; /* Handle single-char matchers */ case OP_PROP: case OP_NOTPROP: cc += 2; /* Fall through */ case OP_NOT_DIGIT: case OP_DIGIT: case OP_NOT_WHITESPACE: case OP_WHITESPACE: case OP_NOT_WORDCHAR: case OP_WORDCHAR: case OP_ANY: branchlength++; cc++; break; /* The single-byte matcher isn't allowed */ case OP_ANYBYTE: return -2; /* Check a class for variable quantification */ #ifdef SUPPORT_UTF8 case OP_XCLASS: cc += GET(cc, 1) - 33; /* Fall through */ #endif case OP_CLASS: case OP_NCLASS: cc += 33; switch (*cc) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: return -1; case OP_CRRANGE: case OP_CRMINRANGE: if (GET2(cc,1) != GET2(cc,3)) return -1; branchlength += GET2(cc,1); cc += 5; break; default: branchlength++; } break; /* Anything else is variable length */ default: return -1; } } /* Control never gets here */ } /************************************************* * Scan compiled regex for numbered bracket * *************************************************/ /* This little function scans through a compiled pattern until it finds a capturing bracket with the given number. Arguments: code points to start of expression utf8 TRUE in UTF-8 mode number the required bracket number Returns: pointer to the opcode for the bracket, or NULL if not found */ static const uschar * find_bracket(const uschar *code, BOOL utf8, int number) { for (;;) { register int c = *code; if (c == OP_END) return NULL; /* XCLASS is used for classes that cannot be represented just by a bit map. This includes negated single high-valued characters. The length in the table is zero; the actual length is stored in the compiled code. */ if (c == OP_XCLASS) code += GET(code, 1); /* Handle capturing bracket */ else if (c == OP_CBRA) { int n = GET2(code, 1+LINK_SIZE); if (n == number) return (uschar *)code; code += _pcre_OP_lengths[c]; } /* Otherwise, we can get the item's length from the table, except that for repeated character types, we have to test for \p and \P, which have an extra two bytes of parameters. */ else { switch(c) { case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: case OP_TYPEPOSSTAR: case OP_TYPEPOSPLUS: case OP_TYPEPOSQUERY: if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; break; case OP_TYPEUPTO: case OP_TYPEMINUPTO: case OP_TYPEEXACT: case OP_TYPEPOSUPTO: if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2; break; } /* Add in the fixed length from the table */ code += _pcre_OP_lengths[c]; /* In UTF-8 mode, opcodes that are followed by a character may be followed by a multi-byte character. The length in the table is a minimum, so we have to arrange to skip the extra bytes. */ #ifdef SUPPORT_UTF8 if (utf8) switch(c) { case OP_CHAR: case OP_CHARNC: case OP_EXACT: case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: case OP_STAR: case OP_MINSTAR: case OP_POSSTAR: case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f]; break; } #endif } } } /************************************************* * Scan compiled regex for recursion reference * *************************************************/ /* This little function scans through a compiled pattern until it finds an instance of OP_RECURSE. Arguments: code points to start of expression utf8 TRUE in UTF-8 mode Returns: pointer to the opcode for OP_RECURSE, or NULL if not found */ static const uschar * find_recurse(const uschar *code, BOOL utf8) { for (;;) { register int c = *code; if (c == OP_END) return NULL; if (c == OP_RECURSE) return code; /* XCLASS is used for classes that cannot be represented just by a bit map. This includes negated single high-valued characters. The length in the table is zero; the actual length is stored in the compiled code. */ if (c == OP_XCLASS) code += GET(code, 1); /* Otherwise, we can get the item's length from the table, except that for repeated character types, we have to test for \p and \P, which have an extra two bytes of parameters. */ else { switch(c) { case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: case OP_TYPEPOSSTAR: case OP_TYPEPOSPLUS: case OP_TYPEPOSQUERY: if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; break; case OP_TYPEPOSUPTO: case OP_TYPEUPTO: case OP_TYPEMINUPTO: case OP_TYPEEXACT: if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2; break; } /* Add in the fixed length from the table */ code += _pcre_OP_lengths[c]; /* In UTF-8 mode, opcodes that are followed by a character may be followed by a multi-byte character. The length in the table is a minimum, so we have to arrange to skip the extra bytes. */ #ifdef SUPPORT_UTF8 if (utf8) switch(c) { case OP_CHAR: case OP_CHARNC: case OP_EXACT: case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: case OP_STAR: case OP_MINSTAR: case OP_POSSTAR: case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: if (code[-1] >= 0xc0) code += _pcre_utf8_table4[code[-1] & 0x3f]; break; } #endif } } } /************************************************* * Scan compiled branch for non-emptiness * *************************************************/ /* This function scans through a branch of a compiled pattern to see whether it can match the empty string or not. It is called from could_be_empty() below and from compile_branch() when checking for an unlimited repeat of a group that can match nothing. Note that first_significant_code() skips over assertions. If we hit an unclosed bracket, we return "empty" - this means we've struck an inner bracket whose current branch will already have been scanned. Arguments: code points to start of search endcode points to where to stop utf8 TRUE if in UTF8 mode Returns: TRUE if what is matched could be empty */ static BOOL could_be_empty_branch(const uschar *code, const uschar *endcode, BOOL utf8) { register int c; for (code = first_significant_code(code + _pcre_OP_lengths[*code], NULL, 0, TRUE); code < endcode; code = first_significant_code(code + _pcre_OP_lengths[c], NULL, 0, TRUE)) { const uschar *ccode; c = *code; /* Groups with zero repeats can of course be empty; skip them. */ if (c == OP_BRAZERO || c == OP_BRAMINZERO) { code += _pcre_OP_lengths[c]; do code += GET(code, 1); while (*code == OP_ALT); c = *code; continue; } /* For other groups, scan the branches. */ if (c == OP_BRA || c == OP_CBRA || c == OP_ONCE || c == OP_COND) { BOOL empty_branch; if (GET(code, 1) == 0) return TRUE; /* Hit unclosed bracket */ /* Scan a closed bracket */ empty_branch = FALSE; do { if (!empty_branch && could_be_empty_branch(code, endcode, utf8)) empty_branch = TRUE; code += GET(code, 1); } while (*code == OP_ALT); if (!empty_branch) return FALSE; /* All branches are non-empty */ c = *code; continue; } /* Handle the other opcodes */ switch (c) { /* Check for quantifiers after a class. XCLASS is used for classes that cannot be represented just by a bit map. This includes negated single high-valued characters. The length in _pcre_OP_lengths[] is zero; the actual length is stored in the compiled code, so we must update "code" here. */ #ifdef SUPPORT_UTF8 case OP_XCLASS: ccode = code += GET(code, 1); goto CHECK_CLASS_REPEAT; #endif case OP_CLASS: case OP_NCLASS: ccode = code + 33; #ifdef SUPPORT_UTF8 CHECK_CLASS_REPEAT: #endif switch (*ccode) { case OP_CRSTAR: /* These could be empty; continue */ case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: break; default: /* Non-repeat => class must match */ case OP_CRPLUS: /* These repeats aren't empty */ case OP_CRMINPLUS: return FALSE; case OP_CRRANGE: case OP_CRMINRANGE: if (GET2(ccode, 1) > 0) return FALSE; /* Minimum > 0 */ break; } break; /* Opcodes that must match a character */ case OP_PROP: case OP_NOTPROP: case OP_EXTUNI: case OP_NOT_DIGIT: case OP_DIGIT: case OP_NOT_WHITESPACE: case OP_WHITESPACE: case OP_NOT_WORDCHAR: case OP_WORDCHAR: case OP_ANY: case OP_ANYBYTE: case OP_CHAR: case OP_CHARNC: case OP_NOT: case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: case OP_EXACT: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTPOSPLUS: case OP_NOTEXACT: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEPOSPLUS: case OP_TYPEEXACT: return FALSE; /* These are going to continue, as they may be empty, but we have to fudge the length for the \p and \P cases. */ case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPOSSTAR: case OP_TYPEQUERY: case OP_TYPEMINQUERY: case OP_TYPEPOSQUERY: if (code[1] == OP_PROP || code[1] == OP_NOTPROP) code += 2; break; /* Same for these */ case OP_TYPEUPTO: case OP_TYPEMINUPTO: case OP_TYPEPOSUPTO: if (code[3] == OP_PROP || code[3] == OP_NOTPROP) code += 2; break; /* End of branch */ case OP_KET: case OP_KETRMAX: case OP_KETRMIN: case OP_ALT: return TRUE; /* In UTF-8 mode, STAR, MINSTAR, POSSTAR, QUERY, MINQUERY, POSQUERY, UPTO, MINUPTO, and POSUPTO may be followed by a multibyte character */ #ifdef SUPPORT_UTF8 case OP_STAR: case OP_MINSTAR: case OP_POSSTAR: case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: if (utf8) while ((code[2] & 0xc0) == 0x80) code++; break; #endif } } return TRUE; } /************************************************* * Scan compiled regex for non-emptiness * *************************************************/ /* This function is called to check for left recursive calls. We want to check the current branch of the current pattern to see if it could match the empty string. If it could, we must look outwards for branches at other levels, stopping when we pass beyond the bracket which is the subject of the recursion. Arguments: code points to start of the recursion endcode points to where to stop (current RECURSE item) bcptr points to the chain of current (unclosed) branch starts utf8 TRUE if in UTF-8 mode Returns: TRUE if what is matched could be empty */ static BOOL could_be_empty(const uschar *code, const uschar *endcode, branch_chain *bcptr, BOOL utf8) { while (bcptr != NULL && bcptr->current >= code) { if (!could_be_empty_branch(bcptr->current, endcode, utf8)) return FALSE; bcptr = bcptr->outer; } return TRUE; } /************************************************* * Check for POSIX class syntax * *************************************************/ /* This function is called when the sequence "[:" or "[." or "[=" is encountered in a character class. It checks whether this is followed by an optional ^ and then a sequence of letters, terminated by a matching ":]" or ".]" or "=]". Argument: ptr pointer to the initial [ endptr where to return the end pointer cd pointer to compile data Returns: TRUE or FALSE */ static BOOL check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd) { int terminator; /* Don't combine these lines; the Solaris cc */ terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ if (*(++ptr) == '^') ptr++; while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; if (*ptr == terminator && ptr[1] == ']') { *endptr = ptr; return TRUE; } return FALSE; } /************************************************* * Check POSIX class name * *************************************************/ /* This function is called to check the name given in a POSIX-style class entry such as [:alnum:]. Arguments: ptr points to the first letter len the length of the name Returns: a value representing the name, or -1 if unknown */ static int check_posix_name(const uschar *ptr, int len) { register int yield = 0; while (posix_name_lengths[yield] != 0) { if (len == posix_name_lengths[yield] && strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; yield++; } return -1; } /************************************************* * Adjust OP_RECURSE items in repeated group * *************************************************/ /* OP_RECURSE items contain an offset from the start of the regex to the group that is referenced. This means that groups can be replicated for fixed repetition simply by copying (because the recursion is allowed to refer to earlier groups that are outside the current group). However, when a group is optional (i.e. the minimum quantifier is zero), OP_BRAZERO is inserted before it, after it has been compiled. This means that any OP_RECURSE items within it that refer to the group itself or any contained groups have to have their offsets adjusted. That one of the jobs of this function. Before it is called, the partially compiled regex must be temporarily terminated with OP_END. This function has been extended with the possibility of forward references for recursions and subroutine calls. It must also check the list of such references for the group we are dealing with. If it finds that one of the recursions in the current group is on this list, it adjusts the offset in the list, not the value in the reference (which is a group number). Arguments: group points to the start of the group adjust the amount by which the group is to be moved utf8 TRUE in UTF-8 mode cd contains pointers to tables etc. save_hwm the hwm forward reference pointer at the start of the group Returns: nothing */ static void adjust_recurse(uschar *group, int adjust, BOOL utf8, compile_data *cd, uschar *save_hwm) { uschar *ptr = group; while ((ptr = (uschar *)find_recurse(ptr, utf8)) != NULL) { int offset; uschar *hc; /* See if this recursion is on the forward reference list. If so, adjust the reference. */ for (hc = save_hwm; hc < cd->hwm; hc += LINK_SIZE) { offset = GET(hc, 0); if (cd->start_code + offset == ptr + 1) { PUT(hc, 0, offset + adjust); break; } } /* Otherwise, adjust the recursion offset if it's after the start of this group. */ if (hc >= cd->hwm) { offset = GET(ptr, 1); if (cd->start_code + offset >= group) PUT(ptr, 1, offset + adjust); } ptr += 1 + LINK_SIZE; } } /************************************************* * Insert an automatic callout point * *************************************************/ /* This function is called when the PCRE_AUTO_CALLOUT option is set, to insert callout points before each pattern item. Arguments: code current code pointer ptr current pattern pointer cd pointers to tables etc Returns: new code pointer */ static uschar * auto_callout(uschar *code, const uschar *ptr, compile_data *cd) { *code++ = OP_CALLOUT; *code++ = 255; PUT(code, 0, ptr - cd->start_pattern); /* Pattern offset */ PUT(code, LINK_SIZE, 0); /* Default length */ return code + 2*LINK_SIZE; } /************************************************* * Complete a callout item * *************************************************/ /* A callout item contains the length of the next item in the pattern, which we can't fill in till after we have reached the relevant point. This is used for both automatic and manual callouts. Arguments: previous_callout points to previous callout item ptr current pattern pointer cd pointers to tables etc Returns: nothing */ static void complete_callout(uschar *previous_callout, const uschar *ptr, compile_data *cd) { int length = ptr - cd->start_pattern - GET(previous_callout, 2); PUT(previous_callout, 2 + LINK_SIZE, length); } #ifdef SUPPORT_UCP /************************************************* * Get othercase range * *************************************************/ /* This function is passed the start and end of a class range, in UTF-8 mode with UCP support. It searches up the characters, looking for internal ranges of characters in the "other" case. Each call returns the next one, updating the start address. Arguments: cptr points to starting character value; updated d end value ocptr where to put start of othercase range odptr where to put end of othercase range Yield: TRUE when range returned; FALSE when no more */ static BOOL get_othercase_range(unsigned int *cptr, unsigned int d, unsigned int *ocptr, unsigned int *odptr) { unsigned int c, othercase, next; for (c = *cptr; c <= d; c++) { if ((othercase = _pcre_ucp_othercase(c)) != NOTACHAR) break; } if (c > d) return FALSE; *ocptr = othercase; next = othercase + 1; for (++c; c <= d; c++) { if (_pcre_ucp_othercase(c) != next) break; next++; } *odptr = next - 1; *cptr = c; return TRUE; } #endif /* SUPPORT_UCP */ /************************************************* * Check if auto-possessifying is possible * *************************************************/ /* This function is called for unlimited repeats of certain items, to see whether the next thing could possibly match the repeated item. If not, it makes sense to automatically possessify the repeated item. Arguments: op_code the repeated op code this data for this item, depends on the opcode utf8 TRUE in UTF-8 mode utf8_char used for utf8 character bytes, NULL if not relevant ptr next character in pattern options options bits cd contains pointers to tables etc. Returns: TRUE if possessifying is wanted */ static BOOL check_auto_possessive(int op_code, int item, BOOL utf8, uschar *utf8_char, const uschar *ptr, int options, compile_data *cd) { int next; /* Skip whitespace and comments in extended mode */ if ((options & PCRE_EXTENDED) != 0) { for (;;) { while ((cd->ctypes[*ptr] & ctype_space) != 0) ptr++; if (*ptr == '#') { while (*(++ptr) != 0) if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } } else break; } } /* If the next item is one that we can handle, get its value. A non-negative value is a character, a negative value is an escape value. */ if (*ptr == '\\') { int temperrorcode = 0; next = check_escape(&ptr, &temperrorcode, cd->bracount, options, FALSE); if (temperrorcode != 0) return FALSE; ptr++; /* Point after the escape sequence */ } else if ((cd->ctypes[*ptr] & ctype_meta) == 0) { #ifdef SUPPORT_UTF8 if (utf8) { GETCHARINC(next, ptr); } else #endif next = *ptr++; } else return FALSE; /* Skip whitespace and comments in extended mode */ if ((options & PCRE_EXTENDED) != 0) { for (;;) { while ((cd->ctypes[*ptr] & ctype_space) != 0) ptr++; if (*ptr == '#') { while (*(++ptr) != 0) if (IS_NEWLINE(ptr)) { ptr += cd->nllen; break; } } else break; } } /* If the next thing is itself optional, we have to give up. */ if (*ptr == '*' || *ptr == '?' || strncmp((char *)ptr, "{0,", 3) == 0) return FALSE; /* Now compare the next item with the previous opcode. If the previous is a positive single character match, "item" either contains the character or, if "item" is greater than 127 in utf8 mode, the character's bytes are in utf8_char. */ /* Handle cases when the next item is a character. */ if (next >= 0) switch(op_code) { case OP_CHAR: #ifdef SUPPORT_UTF8 if (utf8 && item > 127) { GETCHAR(item, utf8_char); } #endif return item != next; /* For CHARNC (caseless character) we must check the other case. If we have Unicode property support, we can use it to test the other case of high-valued characters. */ case OP_CHARNC: #ifdef SUPPORT_UTF8 if (utf8 && item > 127) { GETCHAR(item, utf8_char); } #endif if (item == next) return FALSE; #ifdef SUPPORT_UTF8 if (utf8) { unsigned int othercase; if (next < 128) othercase = cd->fcc[next]; else #ifdef SUPPORT_UCP othercase = _pcre_ucp_othercase((unsigned int)next); #else othercase = NOTACHAR; #endif return (unsigned int)item != othercase; } else #endif /* SUPPORT_UTF8 */ return (item != cd->fcc[next]); /* Non-UTF-8 mode */ /* For OP_NOT, "item" must be a single-byte character. */ case OP_NOT: if (next < 0) return FALSE; /* Not a character */ if (item == next) return TRUE; if ((options & PCRE_CASELESS) == 0) return FALSE; #ifdef SUPPORT_UTF8 if (utf8) { unsigned int othercase; if (next < 128) othercase = cd->fcc[next]; else #ifdef SUPPORT_UCP othercase = _pcre_ucp_othercase(next); #else othercase = NOTACHAR; #endif return (unsigned int)item == othercase; } else #endif /* SUPPORT_UTF8 */ return (item == cd->fcc[next]); /* Non-UTF-8 mode */ case OP_DIGIT: return next > 127 || (cd->ctypes[next] & ctype_digit) == 0; case OP_NOT_DIGIT: return next <= 127 && (cd->ctypes[next] & ctype_digit) != 0; case OP_WHITESPACE: return next > 127 || (cd->ctypes[next] & ctype_space) == 0; case OP_NOT_WHITESPACE: return next <= 127 && (cd->ctypes[next] & ctype_space) != 0; case OP_WORDCHAR: return next > 127 || (cd->ctypes[next] & ctype_word) == 0; case OP_NOT_WORDCHAR: return next <= 127 && (cd->ctypes[next] & ctype_word) != 0; case OP_HSPACE: case OP_NOT_HSPACE: switch(next) { case 0x09: case 0x20: case 0xa0: case 0x1680: case 0x180e: case 0x2000: case 0x2001: case 0x2002: case 0x2003: case 0x2004: case 0x2005: case 0x2006: case 0x2007: case 0x2008: case 0x2009: case 0x200A: case 0x202f: case 0x205f: case 0x3000: return op_code != OP_HSPACE; default: return op_code == OP_HSPACE; } case OP_VSPACE: case OP_NOT_VSPACE: switch(next) { case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x85: case 0x2028: case 0x2029: return op_code != OP_VSPACE; default: return op_code == OP_VSPACE; } default: return FALSE; } /* Handle the case when the next item is \d, \s, etc. */ switch(op_code) { case OP_CHAR: case OP_CHARNC: #ifdef SUPPORT_UTF8 if (utf8 && item > 127) { GETCHAR(item, utf8_char); } #endif switch(-next) { case ESC_d: return item > 127 || (cd->ctypes[item] & ctype_digit) == 0; case ESC_D: return item <= 127 && (cd->ctypes[item] & ctype_digit) != 0; case ESC_s: return item > 127 || (cd->ctypes[item] & ctype_space) == 0; case ESC_S: return item <= 127 && (cd->ctypes[item] & ctype_space) != 0; case ESC_w: return item > 127 || (cd->ctypes[item] & ctype_word) == 0; case ESC_W: return item <= 127 && (cd->ctypes[item] & ctype_word) != 0; case ESC_h: case ESC_H: switch(item) { case 0x09: case 0x20: case 0xa0: case 0x1680: case 0x180e: case 0x2000: case 0x2001: case 0x2002: case 0x2003: case 0x2004: case 0x2005: case 0x2006: case 0x2007: case 0x2008: case 0x2009: case 0x200A: case 0x202f: case 0x205f: case 0x3000: return -next != ESC_h; default: return -next == ESC_h; } case ESC_v: case ESC_V: switch(item) { case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x85: case 0x2028: case 0x2029: return -next != ESC_v; default: return -next == ESC_v; } default: return FALSE; } case OP_DIGIT: return next == -ESC_D || next == -ESC_s || next == -ESC_W || next == -ESC_h || next == -ESC_v; case OP_NOT_DIGIT: return next == -ESC_d; case OP_WHITESPACE: return next == -ESC_S || next == -ESC_d || next == -ESC_w; case OP_NOT_WHITESPACE: return next == -ESC_s || next == -ESC_h || next == -ESC_v; case OP_HSPACE: return next == -ESC_S || next == -ESC_H || next == -ESC_d || next == -ESC_w; case OP_NOT_HSPACE: return next == -ESC_h; /* Can't have \S in here because VT matches \S (Perl anomaly) */ case OP_VSPACE: return next == -ESC_V || next == -ESC_d || next == -ESC_w; case OP_NOT_VSPACE: return next == -ESC_v; case OP_WORDCHAR: return next == -ESC_W || next == -ESC_s || next == -ESC_h || next == -ESC_v; case OP_NOT_WORDCHAR: return next == -ESC_w || next == -ESC_d; default: return FALSE; } /* Control does not reach here */ } /************************************************* * Compile one branch * *************************************************/ /* Scan the pattern, compiling it into the a vector. If the options are changed during the branch, the pointer is used to change the external options bits. This function is used during the pre-compile phase when we are trying to find out the amount of memory needed, as well as during the real compile phase. The value of lengthptr distinguishes the two phases. Arguments: optionsptr pointer to the option bits codeptr points to the pointer to the current code point ptrptr points to the current pattern pointer errorcodeptr points to error code variable firstbyteptr set to initial literal character, or < 0 (REQ_UNSET, REQ_NONE) reqbyteptr set to the last literal character required, else < 0 bcptr points to current branch chain cd contains pointers to tables etc. lengthptr NULL during the real compile phase points to length accumulator during pre-compile phase Returns: TRUE on success FALSE, with *errorcodeptr set non-zero on error */ static BOOL compile_branch(int *optionsptr, uschar **codeptr, const uschar **ptrptr, int *errorcodeptr, int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd, int *lengthptr) { int repeat_type, op_type; int repeat_min = 0, repeat_max = 0; /* To please picky compilers */ int bravalue = 0; int greedy_default, greedy_non_default; int firstbyte, reqbyte; int zeroreqbyte, zerofirstbyte; int req_caseopt, reqvary, tempreqvary; int options = *optionsptr; int after_manual_callout = 0; int length_prevgroup = 0; register int c; register uschar *code = *codeptr; uschar *last_code = code; uschar *orig_code = code; uschar *tempcode; BOOL inescq = FALSE; BOOL groupsetfirstbyte = FALSE; const uschar *ptr = *ptrptr; const uschar *tempptr; uschar *previous = NULL; uschar *previous_callout = NULL; uschar *save_hwm = NULL; uschar classbits[32]; #ifdef SUPPORT_UTF8 BOOL class_utf8; BOOL utf8 = (options & PCRE_UTF8) != 0; uschar *class_utf8data; uschar utf8_char[6]; #else BOOL utf8 = FALSE; uschar *utf8_char = NULL; #endif #ifdef DEBUG if (lengthptr != NULL) DPRINTF((">> start branch\n")); #endif /* Set up the default and non-default settings for greediness */ greedy_default = ((options & PCRE_UNGREEDY) != 0); greedy_non_default = greedy_default ^ 1; /* Initialize no first byte, no required byte. REQ_UNSET means "no char matching encountered yet". It gets changed to REQ_NONE if we hit something that matches a non-fixed char first char; reqbyte just remains unset if we never find one. When we hit a repeat whose minimum is zero, we may have to adjust these values to take the zero repeat into account. This is implemented by setting them to zerofirstbyte and zeroreqbyte when such a repeat is encountered. The individual item types that can be repeated set these backoff variables appropriately. */ firstbyte = reqbyte = zerofirstbyte = zeroreqbyte = REQ_UNSET; /* The variable req_caseopt contains either the REQ_CASELESS value or zero, according to the current setting of the caseless flag. REQ_CASELESS is a bit value > 255. It is added into the firstbyte or reqbyte variables to record the case status of the value. This is used only for ASCII characters. */ req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; /* Switch on next character until the end of the branch */ for (;; ptr++) { BOOL negate_class; BOOL possessive_quantifier; BOOL is_quantifier; BOOL is_recurse; BOOL reset_bracount; int class_charcount; int class_lastchar; int newoptions; int recno; int refsign; int skipbytes; int subreqbyte; int subfirstbyte; int terminator; int mclength; uschar mcbuffer[8]; /* Get next byte in the pattern */ c = *ptr; /* If we are in the pre-compile phase, accumulate the length used for the previous cycle of this loop. */ if (lengthptr != NULL) { #ifdef DEBUG if (code > cd->hwm) cd->hwm = code; /* High water info */ #endif if (code > cd->start_workspace + COMPILE_WORK_SIZE) /* Check for overrun */ { *errorcodeptr = ERR52; goto FAILED; } /* There is at least one situation where code goes backwards: this is the case of a zero quantifier after a class (e.g. [ab]{0}). At compile time, the class is simply eliminated. However, it is created first, so we have to allow memory for it. Therefore, don't ever reduce the length at this point. */ if (code < last_code) code = last_code; /* Paranoid check for integer overflow */ if (OFLOW_MAX - *lengthptr < code - last_code) { *errorcodeptr = ERR20; goto FAILED; } *lengthptr += code - last_code; DPRINTF(("length=%d added %d c=%c\n", *lengthptr, code - last_code, c)); /* If "previous" is set and it is not at the start of the work space, move it back to there, in order to avoid filling up the work space. Otherwise, if "previous" is NULL, reset the current code pointer to the start. */ if (previous != NULL) { if (previous > orig_code) { memmove(orig_code, previous, code - previous); code -= previous - orig_code; previous = orig_code; } } else code = orig_code; /* Remember where this code item starts so we can pick up the length next time round. */ last_code = code; } /* In the real compile phase, just check the workspace used by the forward reference list. */ else if (cd->hwm > cd->start_workspace + COMPILE_WORK_SIZE) { *errorcodeptr = ERR52; goto FAILED; } /* If in \Q...\E, check for the end; if not, we have a literal */ if (inescq && c != 0) { if (c == '\\' && ptr[1] == 'E') { inescq = FALSE; ptr++; continue; } else { if (previous_callout != NULL) { if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ complete_callout(previous_callout, ptr, cd); previous_callout = NULL; } if ((options & PCRE_AUTO_CALLOUT) != 0) { previous_callout = code; code = auto_callout(code, ptr, cd); } goto NORMAL_CHAR; } } /* Fill in length of a previous callout, except when the next thing is a quantifier. */ is_quantifier = c == '*' || c == '+' || c == '?' || (c == '{' && is_counted_repeat(ptr+1)); if (!is_quantifier && previous_callout != NULL && after_manual_callout-- <= 0) { if (lengthptr == NULL) /* Don't attempt in pre-compile phase */ complete_callout(previous_callout, ptr, cd); previous_callout = NULL; } /* In extended mode, skip white space and comments */ if ((options & PCRE_EXTENDED) != 0) { if ((cd->ctypes[c] & ctype_space) != 0) continue; if (c == '#') { while (*(++ptr) != 0) { if (IS_NEWLINE(ptr)) { ptr += cd->nllen - 1; break; } } if (*ptr != 0) continue; /* Else fall through to handle end of string */ c = 0; } } /* No auto callout for quantifiers. */ if ((options & PCRE_AUTO_CALLOUT) != 0 && !is_quantifier) { previous_callout = code; code = auto_callout(code, ptr, cd); } switch(c) { /* ===================================================================*/ case 0: /* The branch terminates at string end */ case '|': /* or | or ) */ case ')': *firstbyteptr = firstbyte; *reqbyteptr = reqbyte; *codeptr = code; *ptrptr = ptr; if (lengthptr != NULL) { if (OFLOW_MAX - *lengthptr < code - last_code) { *errorcodeptr = ERR20; goto FAILED; } *lengthptr += code - last_code; /* To include callout length */ DPRINTF((">> end branch\n")); } return TRUE; /* ===================================================================*/ /* Handle single-character metacharacters. In multiline mode, ^ disables the setting of any following char as a first character. */ case '^': if ((options & PCRE_MULTILINE) != 0) { if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; } previous = NULL; *code++ = OP_CIRC; break; case '$': previous = NULL; *code++ = OP_DOLL; break; /* There can never be a first char if '.' is first, whatever happens about repeats. The value of reqbyte doesn't change either. */ case '.': if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; previous = code; *code++ = OP_ANY; break; /* ===================================================================*/ /* Character classes. If the included characters are all < 256, we build a 32-byte bitmap of the permitted characters, except in the special case where there is only one such character. For negated classes, we build the map as usual, then invert it at the end. However, we use a different opcode so that data characters > 255 can be handled correctly. If the class contains characters outside the 0-255 range, a different opcode is compiled. It may optionally have a bit map for characters < 256, but those above are are explicitly listed afterwards. A flag byte tells whether the bitmap is present, and whether this is a negated class or not. */ case '[': previous = code; /* PCRE supports POSIX class stuff inside a class. Perl gives an error if they are encountered at the top level, so we'll do that too. */ if ((ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax(ptr, &tempptr, cd)) { *errorcodeptr = (ptr[1] == ':')? ERR13 : ERR31; goto FAILED; } /* If the first character is '^', set the negation flag and skip it. Also, if the first few characters (either before or after ^) are \Q\E or \E we skip them too. This makes for compatibility with Perl. */ negate_class = FALSE; for (;;) { c = *(++ptr); if (c == '\\') { if (ptr[1] == 'E') ptr++; else if (strncmp((const char *)ptr+1, "Q\\E", 3) == 0) ptr += 3; else break; } else if (!negate_class && c == '^') negate_class = TRUE; else break; } /* Keep a count of chars with values < 256 so that we can optimize the case of just a single character (as long as it's < 256). However, For higher valued UTF-8 characters, we don't yet do any optimization. */ class_charcount = 0; class_lastchar = -1; /* Initialize the 32-char bit map to all zeros. We build the map in a temporary bit of memory, in case the class contains only 1 character (less than 256), because in that case the compiled code doesn't use the bit map. */ memset(classbits, 0, 32 * sizeof(uschar)); #ifdef SUPPORT_UTF8 class_utf8 = FALSE; /* No chars >= 256 */ class_utf8data = code + LINK_SIZE + 2; /* For UTF-8 items */ #endif /* Process characters until ] is reached. By writing this as a "do" it means that an initial ] is taken as a data character. At the start of the loop, c contains the first byte of the character. */ if (c != 0) do { const uschar *oldptr; #ifdef SUPPORT_UTF8 if (utf8 && c > 127) { /* Braces are required because the */ GETCHARLEN(c, ptr, ptr); /* macro generates multiple statements */ } #endif /* Inside \Q...\E everything is literal except \E */ if (inescq) { if (c == '\\' && ptr[1] == 'E') /* If we are at \E */ { inescq = FALSE; /* Reset literal state */ ptr++; /* Skip the 'E' */ continue; /* Carry on with next */ } goto CHECK_RANGE; /* Could be range if \E follows */ } /* Handle POSIX class names. Perl allows a negation extension of the form [:^name:]. A square bracket that doesn't match the syntax is treated as a literal. We also recognize the POSIX constructions [.ch.] and [=ch=] ("collating elements") and fault them, as Perl 5.6 and 5.8 do. */ if (c == '[' && (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && check_posix_syntax(ptr, &tempptr, cd)) { BOOL local_negate = FALSE; int posix_class, taboffset, tabopt; register const uschar *cbits = cd->cbits; uschar pbits[32]; if (ptr[1] != ':') { *errorcodeptr = ERR31; goto FAILED; } ptr += 2; if (*ptr == '^') { local_negate = TRUE; ptr++; } posix_class = check_posix_name(ptr, tempptr - ptr); if (posix_class < 0) { *errorcodeptr = ERR30; goto FAILED; } /* If matching is caseless, upper and lower are converted to alpha. This relies on the fact that the class table starts with alpha, lower, upper as the first 3 entries. */ if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) posix_class = 0; /* We build the bit map for the POSIX class in a chunk of local store because we may be adding and subtracting from it, and we don't want to subtract bits that may be in the main map already. At the end we or the result into the bit map that is being built. */ posix_class *= 3; /* Copy in the first table (always present) */ memcpy(pbits, cbits + posix_class_maps[posix_class], 32 * sizeof(uschar)); /* If there is a second table, add or remove it as required. */ taboffset = posix_class_maps[posix_class + 1]; tabopt = posix_class_maps[posix_class + 2]; if (taboffset >= 0) { if (tabopt >= 0) for (c = 0; c < 32; c++) pbits[c] |= cbits[c + taboffset]; else for (c = 0; c < 32; c++) pbits[c] &= ~cbits[c + taboffset]; } /* Not see if we need to remove any special characters. An option value of 1 removes vertical space and 2 removes underscore. */ if (tabopt < 0) tabopt = -tabopt; if (tabopt == 1) pbits[1] &= ~0x3c; else if (tabopt == 2) pbits[11] &= 0x7f; /* Add the POSIX table or its complement into the main table that is being built and we are done. */ if (local_negate) for (c = 0; c < 32; c++) classbits[c] |= ~pbits[c]; else for (c = 0; c < 32; c++) classbits[c] |= pbits[c]; ptr = tempptr + 1; class_charcount = 10; /* Set > 1; assumes more than 1 per class */ continue; /* End of POSIX syntax handling */ } /* Backslash may introduce a single character, or it may introduce one of the specials, which just set a flag. The sequence \b is a special case. Inside a class (and only there) it is treated as backspace. Elsewhere it marks a word boundary. Other escapes have preset maps ready to 'or' into the one we are building. We assume they have more than one character in them, so set class_charcount bigger than one. */ if (c == '\\') { c = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE); if (*errorcodeptr != 0) goto FAILED; if (-c == ESC_b) c = '\b'; /* \b is backslash in a class */ else if (-c == ESC_X) c = 'X'; /* \X is literal X in a class */ else if (-c == ESC_R) c = 'R'; /* \R is literal R in a class */ else if (-c == ESC_Q) /* Handle start of quoted string */ { if (ptr[1] == '\\' && ptr[2] == 'E') { ptr += 2; /* avoid empty string */ } else inescq = TRUE; continue; } else if (-c == ESC_E) continue; /* Ignore orphan \E */ if (c < 0) { register const uschar *cbits = cd->cbits; class_charcount += 2; /* Greater than 1 is what matters */ /* Save time by not doing this in the pre-compile phase. */ if (lengthptr == NULL) switch (-c) { case ESC_d: for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_digit]; continue; case ESC_D: for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_digit]; continue; case ESC_w: for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_word]; continue; case ESC_W: for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_word]; continue; case ESC_s: for (c = 0; c < 32; c++) classbits[c] |= cbits[c+cbit_space]; classbits[1] &= ~0x08; /* Perl 5.004 onwards omits VT from \s */ continue; case ESC_S: for (c = 0; c < 32; c++) classbits[c] |= ~cbits[c+cbit_space]; classbits[1] |= 0x08; /* Perl 5.004 onwards omits VT from \s */ continue; case ESC_E: /* Perl ignores an orphan \E */ continue; default: /* Not recognized; fall through */ break; /* Need "default" setting to stop compiler warning. */ } /* In the pre-compile phase, just do the recognition. */ else if (c == -ESC_d || c == -ESC_D || c == -ESC_w || c == -ESC_W || c == -ESC_s || c == -ESC_S) continue; /* We need to deal with \H, \h, \V, and \v in both phases because they use extra memory. */ if (-c == ESC_h) { SETBIT(classbits, 0x09); /* VT */ SETBIT(classbits, 0x20); /* SPACE */ SETBIT(classbits, 0xa0); /* NSBP */ #ifdef SUPPORT_UTF8 if (utf8) { class_utf8 = TRUE; *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(0x1680, class_utf8data); *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(0x180e, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x2000, class_utf8data); class_utf8data += _pcre_ord2utf8(0x200A, class_utf8data); *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(0x202f, class_utf8data); *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(0x205f, class_utf8data); *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(0x3000, class_utf8data); } #endif continue; } if (-c == ESC_H) { for (c = 0; c < 32; c++) { int x = 0xff; switch (c) { case 0x09/8: x ^= 1 << (0x09%8); break; case 0x20/8: x ^= 1 << (0x20%8); break; case 0xa0/8: x ^= 1 << (0xa0%8); break; default: break; } classbits[c] |= x; } #ifdef SUPPORT_UTF8 if (utf8) { class_utf8 = TRUE; *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x0100, class_utf8data); class_utf8data += _pcre_ord2utf8(0x167f, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x1681, class_utf8data); class_utf8data += _pcre_ord2utf8(0x180d, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x180f, class_utf8data); class_utf8data += _pcre_ord2utf8(0x1fff, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x200B, class_utf8data); class_utf8data += _pcre_ord2utf8(0x202e, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x2030, class_utf8data); class_utf8data += _pcre_ord2utf8(0x205e, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x2060, class_utf8data); class_utf8data += _pcre_ord2utf8(0x2fff, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x3001, class_utf8data); class_utf8data += _pcre_ord2utf8(0x7fffffff, class_utf8data); } #endif continue; } if (-c == ESC_v) { SETBIT(classbits, 0x0a); /* LF */ SETBIT(classbits, 0x0b); /* VT */ SETBIT(classbits, 0x0c); /* FF */ SETBIT(classbits, 0x0d); /* CR */ SETBIT(classbits, 0x85); /* NEL */ #ifdef SUPPORT_UTF8 if (utf8) { class_utf8 = TRUE; *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x2028, class_utf8data); class_utf8data += _pcre_ord2utf8(0x2029, class_utf8data); } #endif continue; } if (-c == ESC_V) { for (c = 0; c < 32; c++) { int x = 0xff; switch (c) { case 0x0a/8: x ^= 1 << (0x0a%8); x ^= 1 << (0x0b%8); x ^= 1 << (0x0c%8); x ^= 1 << (0x0d%8); break; case 0x85/8: x ^= 1 << (0x85%8); break; default: break; } classbits[c] |= x; } #ifdef SUPPORT_UTF8 if (utf8) { class_utf8 = TRUE; *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x0100, class_utf8data); class_utf8data += _pcre_ord2utf8(0x2027, class_utf8data); *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(0x2029, class_utf8data); class_utf8data += _pcre_ord2utf8(0x7fffffff, class_utf8data); } #endif continue; } /* We need to deal with \P and \p in both phases. */ #ifdef SUPPORT_UCP if (-c == ESC_p || -c == ESC_P) { BOOL negated; int pdata; int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr); if (ptype < 0) goto FAILED; class_utf8 = TRUE; *class_utf8data++ = ((-c == ESC_p) != negated)? XCL_PROP : XCL_NOTPROP; *class_utf8data++ = ptype; *class_utf8data++ = pdata; class_charcount -= 2; /* Not a < 256 character */ continue; } #endif /* Unrecognized escapes are faulted if PCRE is running in its strict mode. By default, for compatibility with Perl, they are treated as literals. */ if ((options & PCRE_EXTRA) != 0) { *errorcodeptr = ERR7; goto FAILED; } class_charcount -= 2; /* Undo the default count from above */ c = *ptr; /* Get the final character and fall through */ } /* Fall through if we have a single character (c >= 0). This may be greater than 256 in UTF-8 mode. */ } /* End of backslash handling */ /* A single character may be followed by '-' to form a range. However, Perl does not permit ']' to be the end of the range. A '-' character at the end is treated as a literal. Perl ignores orphaned \E sequences entirely. The code for handling \Q and \E is messy. */ CHECK_RANGE: while (ptr[1] == '\\' && ptr[2] == 'E') { inescq = FALSE; ptr += 2; } oldptr = ptr; if (!inescq && ptr[1] == '-') { int d; ptr += 2; while (*ptr == '\\' && ptr[1] == 'E') ptr += 2; /* If we hit \Q (not followed by \E) at this point, go into escaped mode. */ while (*ptr == '\\' && ptr[1] == 'Q') { ptr += 2; if (*ptr == '\\' && ptr[1] == 'E') { ptr += 2; continue; } inescq = TRUE; break; } if (*ptr == 0 || (!inescq && *ptr == ']')) { ptr = oldptr; goto LONE_SINGLE_CHARACTER; } #ifdef SUPPORT_UTF8 if (utf8) { /* Braces are required because the */ GETCHARLEN(d, ptr, ptr); /* macro generates multiple statements */ } else #endif d = *ptr; /* Not UTF-8 mode */ /* The second part of a range can be a single-character escape, but not any of the other escapes. Perl 5.6 treats a hyphen as a literal in such circumstances. */ if (!inescq && d == '\\') { d = check_escape(&ptr, errorcodeptr, cd->bracount, options, TRUE); if (*errorcodeptr != 0) goto FAILED; /* \b is backslash; \X is literal X; \R is literal R; any other special means the '-' was literal */ if (d < 0) { if (d == -ESC_b) d = '\b'; else if (d == -ESC_X) d = 'X'; else if (d == -ESC_R) d = 'R'; else { ptr = oldptr; goto LONE_SINGLE_CHARACTER; /* A few lines below */ } } } /* Check that the two values are in the correct order. Optimize one-character ranges */ if (d < c) { *errorcodeptr = ERR8; goto FAILED; } if (d == c) goto LONE_SINGLE_CHARACTER; /* A few lines below */ /* In UTF-8 mode, if the upper limit is > 255, or > 127 for caseless matching, we have to use an XCLASS with extra data items. Caseless matching for characters > 127 is available only if UCP support is available. */ #ifdef SUPPORT_UTF8 if (utf8 && (d > 255 || ((options & PCRE_CASELESS) != 0 && d > 127))) { class_utf8 = TRUE; /* With UCP support, we can find the other case equivalents of the relevant characters. There may be several ranges. Optimize how they fit with the basic range. */ #ifdef SUPPORT_UCP if ((options & PCRE_CASELESS) != 0) { unsigned int occ, ocd; unsigned int cc = c; unsigned int origd = d; while (get_othercase_range(&cc, origd, &occ, &ocd)) { if (occ >= (unsigned int)c && ocd <= (unsigned int)d) continue; /* Skip embedded ranges */ if (occ < (unsigned int)c && ocd >= (unsigned int)c - 1) /* Extend the basic range */ { /* if there is overlap, */ c = occ; /* noting that if occ < c */ continue; /* we can't have ocd > d */ } /* because a subrange is */ if (ocd > (unsigned int)d && occ <= (unsigned int)d + 1) /* always shorter than */ { /* the basic range. */ d = ocd; continue; } if (occ == ocd) { *class_utf8data++ = XCL_SINGLE; } else { *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(occ, class_utf8data); } class_utf8data += _pcre_ord2utf8(ocd, class_utf8data); } } #endif /* SUPPORT_UCP */ /* Now record the original range, possibly modified for UCP caseless overlapping ranges. */ *class_utf8data++ = XCL_RANGE; class_utf8data += _pcre_ord2utf8(c, class_utf8data); class_utf8data += _pcre_ord2utf8(d, class_utf8data); /* With UCP support, we are done. Without UCP support, there is no caseless matching for UTF-8 characters > 127; we can use the bit map for the smaller ones. */ #ifdef SUPPORT_UCP continue; /* With next character in the class */ #else if ((options & PCRE_CASELESS) == 0 || c > 127) continue; /* Adjust upper limit and fall through to set up the map */ d = 127; #endif /* SUPPORT_UCP */ } #endif /* SUPPORT_UTF8 */ /* We use the bit map for all cases when not in UTF-8 mode; else ranges that lie entirely within 0-127 when there is UCP support; else for partial ranges without UCP support. */ class_charcount += d - c + 1; class_lastchar = d; /* We can save a bit of time by skipping this in the pre-compile. */ if (lengthptr == NULL) for (; c <= d; c++) { classbits[c/8] |= (1 << (c&7)); if ((options & PCRE_CASELESS) != 0) { int uc = cd->fcc[c]; /* flip case */ classbits[uc/8] |= (1 << (uc&7)); } } continue; /* Go get the next char in the class */ } /* Handle a lone single character - we can get here for a normal non-escape char, or after \ that introduces a single character or for an apparent range that isn't. */ LONE_SINGLE_CHARACTER: /* Handle a character that cannot go in the bit map */ #ifdef SUPPORT_UTF8 if (utf8 && (c > 255 || ((options & PCRE_CASELESS) != 0 && c > 127))) { class_utf8 = TRUE; *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(c, class_utf8data); #ifdef SUPPORT_UCP if ((options & PCRE_CASELESS) != 0) { unsigned int othercase; if ((othercase = _pcre_ucp_othercase(c)) != NOTACHAR) { *class_utf8data++ = XCL_SINGLE; class_utf8data += _pcre_ord2utf8(othercase, class_utf8data); } } #endif /* SUPPORT_UCP */ } else #endif /* SUPPORT_UTF8 */ /* Handle a single-byte character */ { classbits[c/8] |= (1 << (c&7)); if ((options & PCRE_CASELESS) != 0) { c = cd->fcc[c]; /* flip case */ classbits[c/8] |= (1 << (c&7)); } class_charcount++; class_lastchar = c; } } /* Loop until ']' reached. This "while" is the end of the "do" above. */ while ((c = *(++ptr)) != 0 && (c != ']' || inescq)); if (c == 0) /* Missing terminating ']' */ { *errorcodeptr = ERR6; goto FAILED; } /* Remember whether \r or \n are in this class */ if (negate_class) { if ((classbits[1] & 0x24) != 0x24) cd->external_options |= PCRE_HASCRORLF; } else { if ((classbits[1] & 0x24) != 0) cd->external_options |= PCRE_HASCRORLF; } /* If class_charcount is 1, we saw precisely one character whose value is less than 256. As long as there were no characters >= 128 and there was no use of \p or \P, in other words, no use of any XCLASS features, we can optimize. In UTF-8 mode, we can optimize the negative case only if there were no characters >= 128 because OP_NOT and the related opcodes like OP_NOTSTAR operate on single-bytes only. This is an historical hangover. Maybe one day we can tidy these opcodes to handle multi-byte characters. The optimization throws away the bit map. We turn the item into a 1-character OP_CHAR[NC] if it's positive, or OP_NOT if it's negative. Note that OP_NOT does not support multibyte characters. In the positive case, it can cause firstbyte to be set. Otherwise, there can be no first char if this item is first, whatever repeat count may follow. In the case of reqbyte, save the previous value for reinstating. */ #ifdef SUPPORT_UTF8 if (class_charcount == 1 && !class_utf8 && (!utf8 || !negate_class || class_lastchar < 128)) #else if (class_charcount == 1) #endif { zeroreqbyte = reqbyte; /* The OP_NOT opcode works on one-byte characters only. */ if (negate_class) { if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; zerofirstbyte = firstbyte; *code++ = OP_NOT; *code++ = class_lastchar; break; } /* For a single, positive character, get the value into mcbuffer, and then we can handle this with the normal one-character code. */ #ifdef SUPPORT_UTF8 if (utf8 && class_lastchar > 127) mclength = _pcre_ord2utf8(class_lastchar, mcbuffer); else #endif { mcbuffer[0] = class_lastchar; mclength = 1; } goto ONE_CHAR; } /* End of 1-char optimization */ /* The general case - not the one-char optimization. If this is the first thing in the branch, there can be no first char setting, whatever the repeat count. Any reqbyte setting must remain unchanged after any kind of repeat. */ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; /* If there are characters with values > 255, we have to compile an extended class, with its own opcode. If there are no characters < 256, we can omit the bitmap in the actual compiled code. */ #ifdef SUPPORT_UTF8 if (class_utf8) { *class_utf8data++ = XCL_END; /* Marks the end of extra data */ *code++ = OP_XCLASS; code += LINK_SIZE; *code = negate_class? XCL_NOT : 0; /* If the map is required, move up the extra data to make room for it; otherwise just move the code pointer to the end of the extra data. */ if (class_charcount > 0) { *code++ |= XCL_MAP; memmove(code + 32, code, class_utf8data - code); memcpy(code, classbits, 32); code = class_utf8data + 32; } else code = class_utf8data; /* Now fill in the complete length of the item */ PUT(previous, 1, code - previous); break; /* End of class handling */ } #endif /* If there are no characters > 255, negate the 32-byte map if necessary, and copy it into the code vector. If this is the first thing in the branch, there can be no first char setting, whatever the repeat count. Any reqbyte setting must remain unchanged after any kind of repeat. */ if (negate_class) { *code++ = OP_NCLASS; if (lengthptr == NULL) /* Save time in the pre-compile phase */ for (c = 0; c < 32; c++) code[c] = ~classbits[c]; } else { *code++ = OP_CLASS; memcpy(code, classbits, 32); } code += 32; break; /* ===================================================================*/ /* Various kinds of repeat; '{' is not necessarily a quantifier, but this has been tested above. */ case '{': if (!is_quantifier) goto NORMAL_CHAR; ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorcodeptr); if (*errorcodeptr != 0) goto FAILED; goto REPEAT; case '*': repeat_min = 0; repeat_max = -1; goto REPEAT; case '+': repeat_min = 1; repeat_max = -1; goto REPEAT; case '?': repeat_min = 0; repeat_max = 1; REPEAT: if (previous == NULL) { *errorcodeptr = ERR9; goto FAILED; } if (repeat_min == 0) { firstbyte = zerofirstbyte; /* Adjust for zero repeat */ reqbyte = zeroreqbyte; /* Ditto */ } /* Remember whether this is a variable length repeat */ reqvary = (repeat_min == repeat_max)? 0 : REQ_VARY; op_type = 0; /* Default single-char op codes */ possessive_quantifier = FALSE; /* Default not possessive quantifier */ /* Save start of previous item, in case we have to move it up to make space for an inserted OP_ONCE for the additional '+' extension. */ tempcode = previous; /* If the next character is '+', we have a possessive quantifier. This implies greediness, whatever the setting of the PCRE_UNGREEDY option. If the next character is '?' this is a minimizing repeat, by default, but if PCRE_UNGREEDY is set, it works the other way round. We change the repeat type to the non-default. */ if (ptr[1] == '+') { repeat_type = 0; /* Force greedy */ possessive_quantifier = TRUE; ptr++; } else if (ptr[1] == '?') { repeat_type = greedy_non_default; ptr++; } else repeat_type = greedy_default; /* If previous was a character match, abolish the item and generate a repeat item instead. If a char item has a minumum of more than one, ensure that it is set in reqbyte - it might not be if a sequence such as x{3} is the first thing in a branch because the x will have gone into firstbyte instead. */ if (*previous == OP_CHAR || *previous == OP_CHARNC) { /* Deal with UTF-8 characters that take up more than one byte. It's easier to write this out separately than try to macrify it. Use c to hold the length of the character in bytes, plus 0x80 to flag that it's a length rather than a small character. */ #ifdef SUPPORT_UTF8 if (utf8 && (code[-1] & 0x80) != 0) { uschar *lastchar = code - 1; while((*lastchar & 0xc0) == 0x80) lastchar--; c = code - lastchar; /* Length of UTF-8 character */ memcpy(utf8_char, lastchar, c); /* Save the char */ c |= 0x80; /* Flag c as a length */ } else #endif /* Handle the case of a single byte - either with no UTF8 support, or with UTF-8 disabled, or for a UTF-8 character < 128. */ { c = code[-1]; if (repeat_min > 1) reqbyte = c | req_caseopt | cd->req_varyopt; } /* If the repetition is unlimited, it pays to see if the next thing on the line is something that cannot possibly match this character. If so, automatically possessifying this item gains some performance in the case where the match fails. */ if (!possessive_quantifier && repeat_max < 0 && check_auto_possessive(*previous, c, utf8, utf8_char, ptr + 1, options, cd)) { repeat_type = 0; /* Force greedy */ possessive_quantifier = TRUE; } goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ } /* If previous was a single negated character ([^a] or similar), we use one of the special opcodes, replacing it. The code is shared with single- character repeats by setting opt_type to add a suitable offset into repeat_type. We can also test for auto-possessification. OP_NOT is currently used only for single-byte chars. */ else if (*previous == OP_NOT) { op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */ c = previous[1]; if (!possessive_quantifier && repeat_max < 0 && check_auto_possessive(OP_NOT, c, utf8, NULL, ptr + 1, options, cd)) { repeat_type = 0; /* Force greedy */ possessive_quantifier = TRUE; } goto OUTPUT_SINGLE_REPEAT; } /* If previous was a character type match (\d or similar), abolish it and create a suitable repeat item. The code is shared with single-character repeats by setting op_type to add a suitable offset into repeat_type. Note the the Unicode property types will be present only when SUPPORT_UCP is defined, but we don't wrap the little bits of code here because it just makes it horribly messy. */ else if (*previous < OP_EODN) { uschar *oldcode; int prop_type, prop_value; op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ c = *previous; if (!possessive_quantifier && repeat_max < 0 && check_auto_possessive(c, 0, utf8, NULL, ptr + 1, options, cd)) { repeat_type = 0; /* Force greedy */ possessive_quantifier = TRUE; } OUTPUT_SINGLE_REPEAT: if (*previous == OP_PROP || *previous == OP_NOTPROP) { prop_type = previous[1]; prop_value = previous[2]; } else prop_type = prop_value = -1; oldcode = code; code = previous; /* Usually overwrite previous item */ /* If the maximum is zero then the minimum must also be zero; Perl allows this case, so we do too - by simply omitting the item altogether. */ if (repeat_max == 0) goto END_REPEAT; /* All real repeats make it impossible to handle partial matching (maybe one day we will be able to remove this restriction). */ if (repeat_max != 1) cd->nopartial = TRUE; /* Combine the op_type with the repeat_type */ repeat_type += op_type; /* A minimum of zero is handled either as the special case * or ?, or as an UPTO, with the maximum given. */ if (repeat_min == 0) { if (repeat_max == -1) *code++ = OP_STAR + repeat_type; else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; else { *code++ = OP_UPTO + repeat_type; PUT2INC(code, 0, repeat_max); } } /* A repeat minimum of 1 is optimized into some special cases. If the maximum is unlimited, we use OP_PLUS. Otherwise, the original item is left in place and, if the maximum is greater than 1, we use OP_UPTO with one less than the maximum. */ else if (repeat_min == 1) { if (repeat_max == -1) *code++ = OP_PLUS + repeat_type; else { code = oldcode; /* leave previous item in place */ if (repeat_max == 1) goto END_REPEAT; *code++ = OP_UPTO + repeat_type; PUT2INC(code, 0, repeat_max - 1); } } /* The case {n,n} is just an EXACT, while the general case {n,m} is handled as an EXACT followed by an UPTO. */ else { *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ PUT2INC(code, 0, repeat_min); /* If the maximum is unlimited, insert an OP_STAR. Before doing so, we have to insert the character for the previous code. For a repeated Unicode property match, there are two extra bytes that define the required property. In UTF-8 mode, long characters have their length in c, with the 0x80 bit as a flag. */ if (repeat_max < 0) { #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) { memcpy(code, utf8_char, c & 7); code += c & 7; } else #endif { *code++ = c; if (prop_type >= 0) { *code++ = prop_type; *code++ = prop_value; } } *code++ = OP_STAR + repeat_type; } /* Else insert an UPTO if the max is greater than the min, again preceded by the character, for the previously inserted code. If the UPTO is just for 1 instance, we can use QUERY instead. */ else if (repeat_max != repeat_min) { #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) { memcpy(code, utf8_char, c & 7); code += c & 7; } else #endif *code++ = c; if (prop_type >= 0) { *code++ = prop_type; *code++ = prop_value; } repeat_max -= repeat_min; if (repeat_max == 1) { *code++ = OP_QUERY + repeat_type; } else { *code++ = OP_UPTO + repeat_type; PUT2INC(code, 0, repeat_max); } } } /* The character or character type itself comes last in all cases. */ #ifdef SUPPORT_UTF8 if (utf8 && c >= 128) { memcpy(code, utf8_char, c & 7); code += c & 7; } else #endif *code++ = c; /* For a repeated Unicode property match, there are two extra bytes that define the required property. */ #ifdef SUPPORT_UCP if (prop_type >= 0) { *code++ = prop_type; *code++ = prop_value; } #endif } /* If previous was a character class or a back reference, we put the repeat stuff after it, but just skip the item if the repeat was {0,0}. */ else if (*previous == OP_CLASS || *previous == OP_NCLASS || #ifdef SUPPORT_UTF8 *previous == OP_XCLASS || #endif *previous == OP_REF) { if (repeat_max == 0) { code = previous; goto END_REPEAT; } /* All real repeats make it impossible to handle partial matching (maybe one day we will be able to remove this restriction). */ if (repeat_max != 1) cd->nopartial = TRUE; if (repeat_min == 0 && repeat_max == -1) *code++ = OP_CRSTAR + repeat_type; else if (repeat_min == 1 && repeat_max == -1) *code++ = OP_CRPLUS + repeat_type; else if (repeat_min == 0 && repeat_max == 1) *code++ = OP_CRQUERY + repeat_type; else { *code++ = OP_CRRANGE + repeat_type; PUT2INC(code, 0, repeat_min); if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ PUT2INC(code, 0, repeat_max); } } /* If previous was a bracket group, we may have to replicate it in certain cases. */ else if (*previous == OP_BRA || *previous == OP_CBRA || *previous == OP_ONCE || *previous == OP_COND) { register int i; int ketoffset = 0; int len = code - previous; uschar *bralink = NULL; /* Repeating a DEFINE group is pointless */ if (*previous == OP_COND && previous[LINK_SIZE+1] == OP_DEF) { *errorcodeptr = ERR55; goto FAILED; } /* If the maximum repeat count is unlimited, find the end of the bracket by scanning through from the start, and compute the offset back to it from the current code pointer. There may be an OP_OPT setting following the final KET, so we can't find the end just by going back from the code pointer. */ if (repeat_max == -1) { register uschar *ket = previous; do ket += GET(ket, 1); while (*ket != OP_KET); ketoffset = code - ket; } /* The case of a zero minimum is special because of the need to stick OP_BRAZERO in front of it, and because the group appears once in the data, whereas in other cases it appears the minimum number of times. For this reason, it is simplest to treat this case separately, as otherwise the code gets far too messy. There are several special subcases when the minimum is zero. */ if (repeat_min == 0) { /* If the maximum is also zero, we just omit the group from the output altogether. */ if (repeat_max == 0) { code = previous; goto END_REPEAT; } /* If the maximum is 1 or unlimited, we just have to stick in the BRAZERO and do no more at this point. However, we do need to adjust any OP_RECURSE calls inside the group that refer to the group itself or any internal or forward referenced group, because the offset is from the start of the whole regex. Temporarily terminate the pattern while doing this. */ if (repeat_max <= 1) { *code = OP_END; adjust_recurse(previous, 1, utf8, cd, save_hwm); memmove(previous+1, previous, len); code++; *previous++ = OP_BRAZERO + repeat_type; } /* If the maximum is greater than 1 and limited, we have to replicate in a nested fashion, sticking OP_BRAZERO before each set of brackets. The first one has to be handled carefully because it's the original copy, which has to be moved up. The remainder can be handled by code that is common with the non-zero minimum case below. We have to adjust the value or repeat_max, since one less copy is required. Once again, we may have to adjust any OP_RECURSE calls inside the group. */ else { int offset; *code = OP_END; adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd, save_hwm); memmove(previous + 2 + LINK_SIZE, previous, len); code += 2 + LINK_SIZE; *previous++ = OP_BRAZERO + repeat_type; *previous++ = OP_BRA; /* We chain together the bracket offset fields that have to be filled in later when the ends of the brackets are reached. */ offset = (bralink == NULL)? 0 : previous - bralink; bralink = previous; PUTINC(previous, 0, offset); } repeat_max--; } /* If the minimum is greater than zero, replicate the group as many times as necessary, and adjust the maximum to the number of subsequent copies that we need. If we set a first char from the group, and didn't set a required char, copy the latter from the former. If there are any forward reference subroutine calls in the group, there will be entries on the workspace list; replicate these with an appropriate increment. */ else { if (repeat_min > 1) { /* In the pre-compile phase, we don't actually do the replication. We just adjust the length as if we had. Do some paranoid checks for potential integer overflow. */ if (lengthptr != NULL) { int delta = (repeat_min - 1)*length_prevgroup; if ((double)(repeat_min - 1)*(double)length_prevgroup > (double)INT_MAX || OFLOW_MAX - *lengthptr < delta) { *errorcodeptr = ERR20; goto FAILED; } *lengthptr += delta; } /* This is compiling for real */ else { if (groupsetfirstbyte && reqbyte < 0) reqbyte = firstbyte; for (i = 1; i < repeat_min; i++) { uschar *hc; uschar *this_hwm = cd->hwm; memcpy(code, previous, len); for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE) { PUT(cd->hwm, 0, GET(hc, 0) + len); cd->hwm += LINK_SIZE; } save_hwm = this_hwm; code += len; } } } if (repeat_max > 0) repeat_max -= repeat_min; } /* This code is common to both the zero and non-zero minimum cases. If the maximum is limited, it replicates the group in a nested fashion, remembering the bracket starts on a stack. In the case of a zero minimum, the first one was set up above. In all cases the repeat_max now specifies the number of additional copies needed. Again, we must remember to replicate entries on the forward reference list. */ if (repeat_max >= 0) { /* In the pre-compile phase, we don't actually do the replication. We just adjust the length as if we had. For each repetition we must add 1 to the length for BRAZERO and for all but the last repetition we must add 2 + 2*LINKSIZE to allow for the nesting that occurs. Do some paranoid checks to avoid integer overflow. */ if (lengthptr != NULL && repeat_max > 0) { int delta = repeat_max * (length_prevgroup + 1 + 2 + 2*LINK_SIZE) - 2 - 2*LINK_SIZE; /* Last one doesn't nest */ if ((double)repeat_max * (double)(length_prevgroup + 1 + 2 + 2*LINK_SIZE) > (double)INT_MAX || OFLOW_MAX - *lengthptr < delta) { *errorcodeptr = ERR20; goto FAILED; } *lengthptr += delta; } /* This is compiling for real */ else for (i = repeat_max - 1; i >= 0; i--) { uschar *hc; uschar *this_hwm = cd->hwm; *code++ = OP_BRAZERO + repeat_type; /* All but the final copy start a new nesting, maintaining the chain of brackets outstanding. */ if (i != 0) { int offset; *code++ = OP_BRA; offset = (bralink == NULL)? 0 : code - bralink; bralink = code; PUTINC(code, 0, offset); } memcpy(code, previous, len); for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE) { PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1)); cd->hwm += LINK_SIZE; } save_hwm = this_hwm; code += len; } /* Now chain through the pending brackets, and fill in their length fields (which are holding the chain links pro tem). */ while (bralink != NULL) { int oldlinkoffset; int offset = code - bralink + 1; uschar *bra = code - offset; oldlinkoffset = GET(bra, 1); bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; *code++ = OP_KET; PUTINC(code, 0, offset); PUT(bra, 1, offset); } } /* If the maximum is unlimited, set a repeater in the final copy. We can't just offset backwards from the current code point, because we don't know if there's been an options resetting after the ket. The correct offset was computed above. Then, when we are doing the actual compile phase, check to see whether this group is a non-atomic one that could match an empty string. If so, convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so that runtime checking can be done. [This check is also applied to atomic groups at runtime, but in a different way.] */ else { uschar *ketcode = code - ketoffset; uschar *bracode = ketcode - GET(ketcode, 1); *ketcode = OP_KETRMAX + repeat_type; if (lengthptr == NULL && *bracode != OP_ONCE) { uschar *scode = bracode; do { if (could_be_empty_branch(scode, ketcode, utf8)) { *bracode += OP_SBRA - OP_BRA; break; } scode += GET(scode, 1); } while (*scode == OP_ALT); } } } /* Else there's some kind of shambles */ else { *errorcodeptr = ERR11; goto FAILED; } /* If the character following a repeat is '+', or if certain optimization tests above succeeded, possessive_quantifier is TRUE. For some of the simpler opcodes, there is an special alternative opcode for this. For anything else, we wrap the entire repeated item inside OP_ONCE brackets. The '+' notation is just syntactic sugar, taken from Sun's Java package, but the special opcodes can optimize it a bit. The repeated item starts at tempcode, not at previous, which might be the first part of a string whose (former) last char we repeated. Possessifying an 'exact' quantifier has no effect, so we can ignore it. But an 'upto' may follow. We skip over an 'exact' item, and then test the length of what remains before proceeding. */ if (possessive_quantifier) { int len; if (*tempcode == OP_EXACT || *tempcode == OP_TYPEEXACT || *tempcode == OP_NOTEXACT) tempcode += _pcre_OP_lengths[*tempcode]; len = code - tempcode; if (len > 0) switch (*tempcode) { case OP_STAR: *tempcode = OP_POSSTAR; break; case OP_PLUS: *tempcode = OP_POSPLUS; break; case OP_QUERY: *tempcode = OP_POSQUERY; break; case OP_UPTO: *tempcode = OP_POSUPTO; break; case OP_TYPESTAR: *tempcode = OP_TYPEPOSSTAR; break; case OP_TYPEPLUS: *tempcode = OP_TYPEPOSPLUS; break; case OP_TYPEQUERY: *tempcode = OP_TYPEPOSQUERY; break; case OP_TYPEUPTO: *tempcode = OP_TYPEPOSUPTO; break; case OP_NOTSTAR: *tempcode = OP_NOTPOSSTAR; break; case OP_NOTPLUS: *tempcode = OP_NOTPOSPLUS; break; case OP_NOTQUERY: *tempcode = OP_NOTPOSQUERY; break; case OP_NOTUPTO: *tempcode = OP_NOTPOSUPTO; break; default: memmove(tempcode + 1+LINK_SIZE, tempcode, len); code += 1 + LINK_SIZE; len += 1 + LINK_SIZE; tempcode[0] = OP_ONCE; *code++ = OP_KET; PUTINC(code, 0, len); PUT(tempcode, 1, len); break; } } /* In all case we no longer have a previous item. We also set the "follows varying string" flag for subsequently encountered reqbytes if it isn't already set and we have just passed a varying length item. */ END_REPEAT: previous = NULL; cd->req_varyopt |= reqvary; break; /* ===================================================================*/ /* Start of nested parenthesized sub-expression, or comment or lookahead or lookbehind or option setting or condition or all the other extended parenthesis forms. */ case '(': newoptions = options; skipbytes = 0; bravalue = OP_CBRA; save_hwm = cd->hwm; reset_bracount = FALSE; /* First deal with various "verbs" that can be introduced by '*'. */ if (*(++ptr) == '*' && (cd->ctypes[ptr[1]] & ctype_letter) != 0) { int i, namelen; const uschar *name = ++ptr; previous = NULL; while ((cd->ctypes[*++ptr] & ctype_letter) != 0); if (*ptr == ':') { *errorcodeptr = ERR59; /* Not supported */ goto FAILED; } if (*ptr != ')') { *errorcodeptr = ERR60; goto FAILED; } namelen = ptr - name; for (i = 0; i < verbcount; i++) { if (namelen == verbs[i].len && strncmp((char *)name, verbs[i].name, namelen) == 0) { *code = verbs[i].op; if (*code++ == OP_ACCEPT) cd->had_accept = TRUE; break; } } if (i < verbcount) continue; *errorcodeptr = ERR60; goto FAILED; } /* Deal with the extended parentheses; all are introduced by '?', and the appearance of any of them means that this is not a capturing group. */ else if (*ptr == '?') { int i, set, unset, namelen; int *optset; const uschar *name; uschar *slot; switch (*(++ptr)) { case '#': /* Comment; skip to ket */ ptr++; while (*ptr != 0 && *ptr != ')') ptr++; if (*ptr == 0) { *errorcodeptr = ERR18; goto FAILED; } continue; /* ------------------------------------------------------------ */ case '|': /* Reset capture count for each branch */ reset_bracount = TRUE; /* Fall through */ /* ------------------------------------------------------------ */ case ':': /* Non-capturing bracket */ bravalue = OP_BRA; ptr++; break; /* ------------------------------------------------------------ */ case '(': bravalue = OP_COND; /* Conditional group */ /* A condition can be an assertion, a number (referring to a numbered group), a name (referring to a named group), or 'R', referring to recursion. R and R&name are also permitted for recursion tests. There are several syntaxes for testing a named group: (?(name)) is used by Python; Perl 5.10 onwards uses (?() or (?('name')). There are two unfortunate ambiguities, caused by history. (a) 'R' can be the recursive thing or the name 'R' (and similarly for 'R' followed by digits), and (b) a number could be a name that consists of digits. In both cases, we look for a name first; if not found, we try the other cases. */ /* For conditions that are assertions, check the syntax, and then exit the switch. This will take control down to where bracketed groups, including assertions, are processed. */ if (ptr[1] == '?' && (ptr[2] == '=' || ptr[2] == '!' || ptr[2] == '<')) break; /* Most other conditions use OP_CREF (a couple change to OP_RREF below), and all need to skip 3 bytes at the start of the group. */ code[1+LINK_SIZE] = OP_CREF; skipbytes = 3; refsign = -1; /* Check for a test for recursion in a named group. */ if (ptr[1] == 'R' && ptr[2] == '&') { terminator = -1; ptr += 2; code[1+LINK_SIZE] = OP_RREF; /* Change the type of test */ } /* Check for a test for a named group's having been set, using the Perl syntax (?() or (?('name') */ else if (ptr[1] == '<') { terminator = '>'; ptr++; } else if (ptr[1] == '\'') { terminator = '\''; ptr++; } else { terminator = 0; if (ptr[1] == '-' || ptr[1] == '+') refsign = *(++ptr); } /* We now expect to read a name; any thing else is an error */ if ((cd->ctypes[ptr[1]] & ctype_word) == 0) { ptr += 1; /* To get the right offset */ *errorcodeptr = ERR28; goto FAILED; } /* Read the name, but also get it as a number if it's all digits */ recno = 0; name = ++ptr; while ((cd->ctypes[*ptr] & ctype_word) != 0) { if (recno >= 0) recno = ((digitab[*ptr] & ctype_digit) != 0)? recno * 10 + *ptr - '0' : -1; ptr++; } namelen = ptr - name; if ((terminator > 0 && *ptr++ != terminator) || *ptr++ != ')') { ptr--; /* Error offset */ *errorcodeptr = ERR26; goto FAILED; } /* Do no further checking in the pre-compile phase. */ if (lengthptr != NULL) break; /* In the real compile we do the work of looking for the actual reference. If the string started with "+" or "-" we require the rest to be digits, in which case recno will be set. */ if (refsign > 0) { if (recno <= 0) { *errorcodeptr = ERR58; goto FAILED; } if (refsign == '-') { recno = cd->bracount - recno + 1; if (recno <= 0) { *errorcodeptr = ERR15; goto FAILED; } } else recno += cd->bracount; PUT2(code, 2+LINK_SIZE, recno); break; } /* Otherwise (did not start with "+" or "-"), start by looking for the name. */ slot = cd->name_table; for (i = 0; i < cd->names_found; i++) { if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break; slot += cd->name_entry_size; } /* Found a previous named subpattern */ if (i < cd->names_found) { recno = GET2(slot, 0); PUT2(code, 2+LINK_SIZE, recno); } /* Search the pattern for a forward reference */ else if ((i = find_parens(ptr, cd->bracount, name, namelen, (options & PCRE_EXTENDED) != 0)) > 0) { PUT2(code, 2+LINK_SIZE, i); } /* If terminator == 0 it means that the name followed directly after the opening parenthesis [e.g. (?(abc)...] and in this case there are some further alternatives to try. For the cases where terminator != 0 [things like (?(... or (?('name')... or (?(R&name)... ] we have now checked all the possibilities, so give an error. */ else if (terminator != 0) { *errorcodeptr = ERR15; goto FAILED; } /* Check for (?(R) for recursion. Allow digits after R to specify a specific group number. */ else if (*name == 'R') { recno = 0; for (i = 1; i < namelen; i++) { if ((digitab[name[i]] & ctype_digit) == 0) { *errorcodeptr = ERR15; goto FAILED; } recno = recno * 10 + name[i] - '0'; } if (recno == 0) recno = RREF_ANY; code[1+LINK_SIZE] = OP_RREF; /* Change test type */ PUT2(code, 2+LINK_SIZE, recno); } /* Similarly, check for the (?(DEFINE) "condition", which is always false. */ else if (namelen == 6 && strncmp((char *)name, "DEFINE", 6) == 0) { code[1+LINK_SIZE] = OP_DEF; skipbytes = 1; } /* Check for the "name" actually being a subpattern number. */ else if (recno > 0) { PUT2(code, 2+LINK_SIZE, recno); } /* Either an unidentified subpattern, or a reference to (?(0) */ else { *errorcodeptr = (recno == 0)? ERR35: ERR15; goto FAILED; } break; /* ------------------------------------------------------------ */ case '=': /* Positive lookahead */ bravalue = OP_ASSERT; ptr++; break; /* ------------------------------------------------------------ */ case '!': /* Negative lookahead */ ptr++; if (*ptr == ')') /* Optimize (?!) */ { *code++ = OP_FAIL; previous = NULL; continue; } bravalue = OP_ASSERT_NOT; break; /* ------------------------------------------------------------ */ case '<': /* Lookbehind or named define */ switch (ptr[1]) { case '=': /* Positive lookbehind */ bravalue = OP_ASSERTBACK; ptr += 2; break; case '!': /* Negative lookbehind */ bravalue = OP_ASSERTBACK_NOT; ptr += 2; break; default: /* Could be name define, else bad */ if ((cd->ctypes[ptr[1]] & ctype_word) != 0) goto DEFINE_NAME; ptr++; /* Correct offset for error */ *errorcodeptr = ERR24; goto FAILED; } break; /* ------------------------------------------------------------ */ case '>': /* One-time brackets */ bravalue = OP_ONCE; ptr++; break; /* ------------------------------------------------------------ */ case 'C': /* Callout - may be followed by digits; */ previous_callout = code; /* Save for later completion */ after_manual_callout = 1; /* Skip one item before completing */ *code++ = OP_CALLOUT; { int n = 0; while ((digitab[*(++ptr)] & ctype_digit) != 0) n = n * 10 + *ptr - '0'; if (*ptr != ')') { *errorcodeptr = ERR39; goto FAILED; } if (n > 255) { *errorcodeptr = ERR38; goto FAILED; } *code++ = n; PUT(code, 0, ptr - cd->start_pattern + 1); /* Pattern offset */ PUT(code, LINK_SIZE, 0); /* Default length */ code += 2 * LINK_SIZE; } previous = NULL; continue; /* ------------------------------------------------------------ */ case 'P': /* Python-style named subpattern handling */ if (*(++ptr) == '=' || *ptr == '>') /* Reference or recursion */ { is_recurse = *ptr == '>'; terminator = ')'; goto NAMED_REF_OR_RECURSE; } else if (*ptr != '<') /* Test for Python-style definition */ { *errorcodeptr = ERR41; goto FAILED; } /* Fall through to handle (?P< as (?< is handled */ /* ------------------------------------------------------------ */ DEFINE_NAME: /* Come here from (?< handling */ case '\'': { terminator = (*ptr == '<')? '>' : '\''; name = ++ptr; while ((cd->ctypes[*ptr] & ctype_word) != 0) ptr++; namelen = ptr - name; /* In the pre-compile phase, just do a syntax check. */ if (lengthptr != NULL) { if (*ptr != terminator) { *errorcodeptr = ERR42; goto FAILED; } if (cd->names_found >= MAX_NAME_COUNT) { *errorcodeptr = ERR49; goto FAILED; } if (namelen + 3 > cd->name_entry_size) { cd->name_entry_size = namelen + 3; if (namelen > MAX_NAME_SIZE) { *errorcodeptr = ERR48; goto FAILED; } } } /* In the real compile, create the entry in the table */ else { slot = cd->name_table; for (i = 0; i < cd->names_found; i++) { int crc = memcmp(name, slot+2, namelen); if (crc == 0) { if (slot[2+namelen] == 0) { if ((options & PCRE_DUPNAMES) == 0) { *errorcodeptr = ERR43; goto FAILED; } } else crc = -1; /* Current name is substring */ } if (crc < 0) { memmove(slot + cd->name_entry_size, slot, (cd->names_found - i) * cd->name_entry_size); break; } slot += cd->name_entry_size; } PUT2(slot, 0, cd->bracount + 1); memcpy(slot + 2, name, namelen); slot[2+namelen] = 0; } } /* In both cases, count the number of names we've encountered. */ ptr++; /* Move past > or ' */ cd->names_found++; goto NUMBERED_GROUP; /* ------------------------------------------------------------ */ case '&': /* Perl recursion/subroutine syntax */ terminator = ')'; is_recurse = TRUE; /* Fall through */ /* We come here from the Python syntax above that handles both references (?P=name) and recursion (?P>name), as well as falling through from the Perl recursion syntax (?&name). */ NAMED_REF_OR_RECURSE: name = ++ptr; while ((cd->ctypes[*ptr] & ctype_word) != 0) ptr++; namelen = ptr - name; /* In the pre-compile phase, do a syntax check and set a dummy reference number. */ if (lengthptr != NULL) { if (*ptr != terminator) { *errorcodeptr = ERR42; goto FAILED; } if (namelen > MAX_NAME_SIZE) { *errorcodeptr = ERR48; goto FAILED; } recno = 0; } /* In the real compile, seek the name in the table */ else { slot = cd->name_table; for (i = 0; i < cd->names_found; i++) { if (strncmp((char *)name, (char *)slot+2, namelen) == 0) break; slot += cd->name_entry_size; } if (i < cd->names_found) /* Back reference */ { recno = GET2(slot, 0); } else if ((recno = /* Forward back reference */ find_parens(ptr, cd->bracount, name, namelen, (options & PCRE_EXTENDED) != 0)) <= 0) { *errorcodeptr = ERR15; goto FAILED; } } /* In both phases, we can now go to the code than handles numerical recursion or backreferences. */ if (is_recurse) goto HANDLE_RECURSION; else goto HANDLE_REFERENCE; /* ------------------------------------------------------------ */ case 'R': /* Recursion */ ptr++; /* Same as (?0) */ /* Fall through */ /* ------------------------------------------------------------ */ case '-': case '+': case '0': case '1': case '2': case '3': case '4': /* Recursion or */ case '5': case '6': case '7': case '8': case '9': /* subroutine */ { const uschar *called; if ((refsign = *ptr) == '+') ptr++; else if (refsign == '-') { if ((digitab[ptr[1]] & ctype_digit) == 0) goto OTHER_CHAR_AFTER_QUERY; ptr++; } recno = 0; while((digitab[*ptr] & ctype_digit) != 0) recno = recno * 10 + *ptr++ - '0'; if (*ptr != ')') { *errorcodeptr = ERR29; goto FAILED; } if (refsign == '-') { if (recno == 0) { *errorcodeptr = ERR58; goto FAILED; } recno = cd->bracount - recno + 1; if (recno <= 0) { *errorcodeptr = ERR15; goto FAILED; } } else if (refsign == '+') { if (recno == 0) { *errorcodeptr = ERR58; goto FAILED; } recno += cd->bracount; } /* Come here from code above that handles a named recursion */ HANDLE_RECURSION: previous = code; called = cd->start_code; /* When we are actually compiling, find the bracket that is being referenced. Temporarily end the regex in case it doesn't exist before this point. If we end up with a forward reference, first check that the bracket does occur later so we can give the error (and position) now. Then remember this forward reference in the workspace so it can be filled in at the end. */ if (lengthptr == NULL) { *code = OP_END; if (recno != 0) called = find_bracket(cd->start_code, utf8, recno); /* Forward reference */ if (called == NULL) { if (find_parens(ptr, cd->bracount, NULL, recno, (options & PCRE_EXTENDED) != 0) < 0) { *errorcodeptr = ERR15; goto FAILED; } called = cd->start_code + recno; PUTINC(cd->hwm, 0, code + 2 + LINK_SIZE - cd->start_code); } /* If not a forward reference, and the subpattern is still open, this is a recursive call. We check to see if this is a left recursion that could loop for ever, and diagnose that case. */ else if (GET(called, 1) == 0 && could_be_empty(called, code, bcptr, utf8)) { *errorcodeptr = ERR40; goto FAILED; } } /* Insert the recursion/subroutine item, automatically wrapped inside "once" brackets. Set up a "previous group" length so that a subsequent quantifier will work. */ *code = OP_ONCE; PUT(code, 1, 2 + 2*LINK_SIZE); code += 1 + LINK_SIZE; *code = OP_RECURSE; PUT(code, 1, called - cd->start_code); code += 1 + LINK_SIZE; *code = OP_KET; PUT(code, 1, 2 + 2*LINK_SIZE); code += 1 + LINK_SIZE; length_prevgroup = 3 + 3*LINK_SIZE; } /* Can't determine a first byte now */ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; continue; /* ------------------------------------------------------------ */ default: /* Other characters: check option setting */ OTHER_CHAR_AFTER_QUERY: set = unset = 0; optset = &set; while (*ptr != ')' && *ptr != ':') { switch (*ptr++) { case '-': optset = &unset; break; case 'J': /* Record that it changed in the external options */ *optset |= PCRE_DUPNAMES; cd->external_options |= PCRE_JCHANGED; break; case 'i': *optset |= PCRE_CASELESS; break; case 'm': *optset |= PCRE_MULTILINE; break; case 's': *optset |= PCRE_DOTALL; break; case 'x': *optset |= PCRE_EXTENDED; break; case 'U': *optset |= PCRE_UNGREEDY; break; case 'X': *optset |= PCRE_EXTRA; break; default: *errorcodeptr = ERR12; ptr--; /* Correct the offset */ goto FAILED; } } /* Set up the changed option bits, but don't change anything yet. */ newoptions = (options | set) & (~unset); /* If the options ended with ')' this is not the start of a nested group with option changes, so the options change at this level. If this item is right at the start of the pattern, the options can be abstracted and made external in the pre-compile phase, and ignored in the compile phase. This can be helpful when matching -- for instance in caseless checking of required bytes. If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are definitely *not* at the start of the pattern because something has been compiled. In the pre-compile phase, however, the code pointer can have that value after the start, because it gets reset as code is discarded during the pre-compile. However, this can happen only at top level - if we are within parentheses, the starting BRA will still be present. At any parenthesis level, the length value can be used to test if anything has been compiled at that level. Thus, a test for both these conditions is necessary to ensure we correctly detect the start of the pattern in both phases. If we are not at the pattern start, compile code to change the ims options if this setting actually changes any of them. We also pass the new setting back so that it can be put at the start of any following branches, and when this group ends (if we are in a group), a resetting item can be compiled. */ if (*ptr == ')') { if (code == cd->start_code + 1 + LINK_SIZE && (lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE)) { cd->external_options = newoptions; options = newoptions; } else { if ((options & PCRE_IMS) != (newoptions & PCRE_IMS)) { *code++ = OP_OPT; *code++ = newoptions & PCRE_IMS; } /* Change options at this level, and pass them back for use in subsequent branches. Reset the greedy defaults and the case value for firstbyte and reqbyte. */ *optionsptr = options = newoptions; greedy_default = ((newoptions & PCRE_UNGREEDY) != 0); greedy_non_default = greedy_default ^ 1; req_caseopt = ((options & PCRE_CASELESS) != 0)? REQ_CASELESS : 0; } previous = NULL; /* This item can't be repeated */ continue; /* It is complete */ } /* If the options ended with ':' we are heading into a nested group with possible change of options. Such groups are non-capturing and are not assertions of any kind. All we need to do is skip over the ':'; the newoptions value is handled below. */ bravalue = OP_BRA; ptr++; } /* End of switch for character following (? */ } /* End of (? handling */ /* Opening parenthesis not followed by '?'. If PCRE_NO_AUTO_CAPTURE is set, all unadorned brackets become non-capturing and behave like (?:...) brackets. */ else if ((options & PCRE_NO_AUTO_CAPTURE) != 0) { bravalue = OP_BRA; } /* Else we have a capturing group. */ else { NUMBERED_GROUP: cd->bracount += 1; PUT2(code, 1+LINK_SIZE, cd->bracount); skipbytes = 2; } /* Process nested bracketed regex. Assertions may not be repeated, but other kinds can be. All their opcodes are >= OP_ONCE. We copy code into a non-register variable in order to be able to pass its address because some compilers complain otherwise. Pass in a new setting for the ims options if they have changed. */ previous = (bravalue >= OP_ONCE)? code : NULL; *code = bravalue; tempcode = code; tempreqvary = cd->req_varyopt; /* Save value before bracket */ length_prevgroup = 0; /* Initialize for pre-compile phase */ if (!compile_regex( newoptions, /* The complete new option state */ options & PCRE_IMS, /* The previous ims option state */ &tempcode, /* Where to put code (updated) */ &ptr, /* Input pointer (updated) */ errorcodeptr, /* Where to put an error message */ (bravalue == OP_ASSERTBACK || bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ reset_bracount, /* True if (?| group */ skipbytes, /* Skip over bracket number */ &subfirstbyte, /* For possible first char */ &subreqbyte, /* For possible last char */ bcptr, /* Current branch chain */ cd, /* Tables block */ (lengthptr == NULL)? NULL : /* Actual compile phase */ &length_prevgroup /* Pre-compile phase */ )) goto FAILED; /* At the end of compiling, code is still pointing to the start of the group, while tempcode has been updated to point past the end of the group and any option resetting that may follow it. The pattern pointer (ptr) is on the bracket. */ /* If this is a conditional bracket, check that there are no more than two branches in the group, or just one if it's a DEFINE group. We do this in the real compile phase, not in the pre-pass, where the whole group may not be available. */ if (bravalue == OP_COND && lengthptr == NULL) { uschar *tc = code; int condcount = 0; do { condcount++; tc += GET(tc,1); } while (*tc != OP_KET); /* A DEFINE group is never obeyed inline (the "condition" is always false). It must have only one branch. */ if (code[LINK_SIZE+1] == OP_DEF) { if (condcount > 1) { *errorcodeptr = ERR54; goto FAILED; } bravalue = OP_DEF; /* Just a flag to suppress char handling below */ } /* A "normal" conditional group. If there is just one branch, we must not make use of its firstbyte or reqbyte, because this is equivalent to an empty second branch. */ else { if (condcount > 2) { *errorcodeptr = ERR27; goto FAILED; } if (condcount == 1) subfirstbyte = subreqbyte = REQ_NONE; } } /* Error if hit end of pattern */ if (*ptr != ')') { *errorcodeptr = ERR14; goto FAILED; } /* In the pre-compile phase, update the length by the length of the group, less the brackets at either end. Then reduce the compiled code to just a set of non-capturing brackets so that it doesn't use much memory if it is duplicated by a quantifier.*/ if (lengthptr != NULL) { if (OFLOW_MAX - *lengthptr < length_prevgroup - 2 - 2*LINK_SIZE) { *errorcodeptr = ERR20; goto FAILED; } *lengthptr += length_prevgroup - 2 - 2*LINK_SIZE; *code++ = OP_BRA; PUTINC(code, 0, 1 + LINK_SIZE); *code++ = OP_KET; PUTINC(code, 0, 1 + LINK_SIZE); break; /* No need to waste time with special character handling */ } /* Otherwise update the main code pointer to the end of the group. */ code = tempcode; /* For a DEFINE group, required and first character settings are not relevant. */ if (bravalue == OP_DEF) break; /* Handle updating of the required and first characters for other types of group. Update for normal brackets of all kinds, and conditions with two branches (see code above). If the bracket is followed by a quantifier with zero repeat, we have to back off. Hence the definition of zeroreqbyte and zerofirstbyte outside the main loop so that they can be accessed for the back off. */ zeroreqbyte = reqbyte; zerofirstbyte = firstbyte; groupsetfirstbyte = FALSE; if (bravalue >= OP_ONCE) { /* If we have not yet set a firstbyte in this branch, take it from the subpattern, remembering that it was set here so that a repeat of more than one can replicate it as reqbyte if necessary. If the subpattern has no firstbyte, set "none" for the whole branch. In both cases, a zero repeat forces firstbyte to "none". */ if (firstbyte == REQ_UNSET) { if (subfirstbyte >= 0) { firstbyte = subfirstbyte; groupsetfirstbyte = TRUE; } else firstbyte = REQ_NONE; zerofirstbyte = REQ_NONE; } /* If firstbyte was previously set, convert the subpattern's firstbyte into reqbyte if there wasn't one, using the vary flag that was in existence beforehand. */ else if (subfirstbyte >= 0 && subreqbyte < 0) subreqbyte = subfirstbyte | tempreqvary; /* If the subpattern set a required byte (or set a first byte that isn't really the first byte - see above), set it. */ if (subreqbyte >= 0) reqbyte = subreqbyte; } /* For a forward assertion, we take the reqbyte, if set. This can be helpful if the pattern that follows the assertion doesn't set a different char. For example, it's useful for /(?=abcde).+/. We can't set firstbyte for an assertion, however because it leads to incorrect effect for patterns such as /(?=a)a.+/ when the "real" "a" would then become a reqbyte instead of a firstbyte. This is overcome by a scan at the end if there's no firstbyte, looking for an asserted first char. */ else if (bravalue == OP_ASSERT && subreqbyte >= 0) reqbyte = subreqbyte; break; /* End of processing '(' */ /* ===================================================================*/ /* Handle metasequences introduced by \. For ones like \d, the ESC_ values are arranged to be the negation of the corresponding OP_values. For the back references, the values are ESC_REF plus the reference number. Only back references and those types that consume a character may be repeated. We can test for values between ESC_b and ESC_Z for the latter; this may have to change if any new ones are ever created. */ case '\\': tempptr = ptr; c = check_escape(&ptr, errorcodeptr, cd->bracount, options, FALSE); if (*errorcodeptr != 0) goto FAILED; if (c < 0) { if (-c == ESC_Q) /* Handle start of quoted string */ { if (ptr[1] == '\\' && ptr[2] == 'E') ptr += 2; /* avoid empty string */ else inescq = TRUE; continue; } if (-c == ESC_E) continue; /* Perl ignores an orphan \E */ /* For metasequences that actually match a character, we disable the setting of a first character if it hasn't already been set. */ if (firstbyte == REQ_UNSET && -c > ESC_b && -c < ESC_Z) firstbyte = REQ_NONE; /* Set values to reset to if this is followed by a zero repeat. */ zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; /* \k or \k'name' is a back reference by name (Perl syntax). We also support \k{name} (.NET syntax) */ if (-c == ESC_k && (ptr[1] == '<' || ptr[1] == '\'' || ptr[1] == '{')) { is_recurse = FALSE; terminator = (*(++ptr) == '<')? '>' : (*ptr == '\'')? '\'' : '}'; goto NAMED_REF_OR_RECURSE; } /* Back references are handled specially; must disable firstbyte if not set to cope with cases like (?=(\w+))\1: which would otherwise set ':' later. */ if (-c >= ESC_REF) { recno = -c - ESC_REF; HANDLE_REFERENCE: /* Come here from named backref handling */ if (firstbyte == REQ_UNSET) firstbyte = REQ_NONE; previous = code; *code++ = OP_REF; PUT2INC(code, 0, recno); cd->backref_map |= (recno < 32)? (1 << recno) : 1; if (recno > cd->top_backref) cd->top_backref = recno; } /* So are Unicode property matches, if supported. */ #ifdef SUPPORT_UCP else if (-c == ESC_P || -c == ESC_p) { BOOL negated; int pdata; int ptype = get_ucp(&ptr, &negated, &pdata, errorcodeptr); if (ptype < 0) goto FAILED; previous = code; *code++ = ((-c == ESC_p) != negated)? OP_PROP : OP_NOTPROP; *code++ = ptype; *code++ = pdata; } #else /* If Unicode properties are not supported, \X, \P, and \p are not allowed. */ else if (-c == ESC_X || -c == ESC_P || -c == ESC_p) { *errorcodeptr = ERR45; goto FAILED; } #endif /* For the rest (including \X when Unicode properties are supported), we can obtain the OP value by negating the escape value. */ else { previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; *code++ = -c; } continue; } /* We have a data character whose value is in c. In UTF-8 mode it may have a value > 127. We set its representation in the length/buffer, and then handle it as a data character. */ #ifdef SUPPORT_UTF8 if (utf8 && c > 127) mclength = _pcre_ord2utf8(c, mcbuffer); else #endif { mcbuffer[0] = c; mclength = 1; } goto ONE_CHAR; /* ===================================================================*/ /* Handle a literal character. It is guaranteed not to be whitespace or # when the extended flag is set. If we are in UTF-8 mode, it may be a multi-byte literal character. */ default: NORMAL_CHAR: mclength = 1; mcbuffer[0] = c; #ifdef SUPPORT_UTF8 if (utf8 && c >= 0xc0) { while ((ptr[1] & 0xc0) == 0x80) mcbuffer[mclength++] = *(++ptr); } #endif /* At this point we have the character's bytes in mcbuffer, and the length in mclength. When not in UTF-8 mode, the length is always 1. */ ONE_CHAR: previous = code; *code++ = ((options & PCRE_CASELESS) != 0)? OP_CHARNC : OP_CHAR; for (c = 0; c < mclength; c++) *code++ = mcbuffer[c]; /* Remember if \r or \n were seen */ if (mcbuffer[0] == '\r' || mcbuffer[0] == '\n') cd->external_options |= PCRE_HASCRORLF; /* Set the first and required bytes appropriately. If no previous first byte, set it from this character, but revert to none on a zero repeat. Otherwise, leave the firstbyte value alone, and don't change it on a zero repeat. */ if (firstbyte == REQ_UNSET) { zerofirstbyte = REQ_NONE; zeroreqbyte = reqbyte; /* If the character is more than one byte long, we can set firstbyte only if it is not to be matched caselessly. */ if (mclength == 1 || req_caseopt == 0) { firstbyte = mcbuffer[0] | req_caseopt; if (mclength != 1) reqbyte = code[-1] | cd->req_varyopt; } else firstbyte = reqbyte = REQ_NONE; } /* firstbyte was previously set; we can set reqbyte only the length is 1 or the matching is caseful. */ else { zerofirstbyte = firstbyte; zeroreqbyte = reqbyte; if (mclength == 1 || req_caseopt == 0) reqbyte = code[-1] | req_caseopt | cd->req_varyopt; } break; /* End of literal character handling */ } } /* end of big loop */ /* Control never reaches here by falling through, only by a goto for all the error states. Pass back the position in the pattern so that it can be displayed to the user for diagnosing the error. */ FAILED: *ptrptr = ptr; return FALSE; } /************************************************* * Compile sequence of alternatives * *************************************************/ /* On entry, ptr is pointing past the bracket character, but on return it points to the closing bracket, or vertical bar, or end of string. The code variable is pointing at the byte into which the BRA operator has been stored. If the ims options are changed at the start (for a (?ims: group) or during any branch, we need to insert an OP_OPT item at the start of every following branch to ensure they get set correctly at run time, and also pass the new options into every subsequent branch compile. This function is used during the pre-compile phase when we are trying to find out the amount of memory needed, as well as during the real compile phase. The value of lengthptr distinguishes the two phases. Arguments: options option bits, including any changes for this subpattern oldims previous settings of ims option bits codeptr -> the address of the current code pointer ptrptr -> the address of the current pattern pointer errorcodeptr -> pointer to error code variable lookbehind TRUE if this is a lookbehind assertion reset_bracount TRUE to reset the count for each branch skipbytes skip this many bytes at start (for brackets and OP_COND) firstbyteptr place to put the first required character, or a negative number reqbyteptr place to put the last required character, or a negative number bcptr pointer to the chain of currently open branches cd points to the data block with tables pointers etc. lengthptr NULL during the real compile phase points to length accumulator during pre-compile phase Returns: TRUE on success */ static BOOL compile_regex(int options, int oldims, uschar **codeptr, const uschar **ptrptr, int *errorcodeptr, BOOL lookbehind, BOOL reset_bracount, int skipbytes, int *firstbyteptr, int *reqbyteptr, branch_chain *bcptr, compile_data *cd, int *lengthptr) { const uschar *ptr = *ptrptr; uschar *code = *codeptr; uschar *last_branch = code; uschar *start_bracket = code; uschar *reverse_count = NULL; int firstbyte, reqbyte; int branchfirstbyte, branchreqbyte; int length; int orig_bracount; int max_bracount; branch_chain bc; bc.outer = bcptr; bc.current = code; firstbyte = reqbyte = REQ_UNSET; /* Accumulate the length for use in the pre-compile phase. Start with the length of the BRA and KET and any extra bytes that are required at the beginning. We accumulate in a local variable to save frequent testing of lenthptr for NULL. We cannot do this by looking at the value of code at the start and end of each alternative, because compiled items are discarded during the pre-compile phase so that the work space is not exceeded. */ length = 2 + 2*LINK_SIZE + skipbytes; /* WARNING: If the above line is changed for any reason, you must also change the code that abstracts option settings at the start of the pattern and makes them global. It tests the value of length for (2 + 2*LINK_SIZE) in the pre-compile phase to find out whether anything has yet been compiled or not. */ /* Offset is set zero to mark that this bracket is still open */ PUT(code, 1, 0); code += 1 + LINK_SIZE + skipbytes; /* Loop for each alternative branch */ orig_bracount = max_bracount = cd->bracount; for (;;) { /* For a (?| group, reset the capturing bracket count so that each branch uses the same numbers. */ if (reset_bracount) cd->bracount = orig_bracount; /* Handle a change of ims options at the start of the branch */ if ((options & PCRE_IMS) != oldims) { *code++ = OP_OPT; *code++ = options & PCRE_IMS; length += 2; } /* Set up dummy OP_REVERSE if lookbehind assertion */ if (lookbehind) { *code++ = OP_REVERSE; reverse_count = code; PUTINC(code, 0, 0); length += 1 + LINK_SIZE; } /* Now compile the branch; in the pre-compile phase its length gets added into the length. */ if (!compile_branch(&options, &code, &ptr, errorcodeptr, &branchfirstbyte, &branchreqbyte, &bc, cd, (lengthptr == NULL)? NULL : &length)) { *ptrptr = ptr; return FALSE; } /* Keep the highest bracket count in case (?| was used and some branch has fewer than the rest. */ if (cd->bracount > max_bracount) max_bracount = cd->bracount; /* In the real compile phase, there is some post-processing to be done. */ if (lengthptr == NULL) { /* If this is the first branch, the firstbyte and reqbyte values for the branch become the values for the regex. */ if (*last_branch != OP_ALT) { firstbyte = branchfirstbyte; reqbyte = branchreqbyte; } /* If this is not the first branch, the first char and reqbyte have to match the values from all the previous branches, except that if the previous value for reqbyte didn't have REQ_VARY set, it can still match, and we set REQ_VARY for the regex. */ else { /* If we previously had a firstbyte, but it doesn't match the new branch, we have to abandon the firstbyte for the regex, but if there was previously no reqbyte, it takes on the value of the old firstbyte. */ if (firstbyte >= 0 && firstbyte != branchfirstbyte) { if (reqbyte < 0) reqbyte = firstbyte; firstbyte = REQ_NONE; } /* If we (now or from before) have no firstbyte, a firstbyte from the branch becomes a reqbyte if there isn't a branch reqbyte. */ if (firstbyte < 0 && branchfirstbyte >= 0 && branchreqbyte < 0) branchreqbyte = branchfirstbyte; /* Now ensure that the reqbytes match */ if ((reqbyte & ~REQ_VARY) != (branchreqbyte & ~REQ_VARY)) reqbyte = REQ_NONE; else reqbyte |= branchreqbyte; /* To "or" REQ_VARY */ } /* If lookbehind, check that this branch matches a fixed-length string, and put the length into the OP_REVERSE item. Temporarily mark the end of the branch with OP_END. */ if (lookbehind) { int fixed_length; *code = OP_END; fixed_length = find_fixedlength(last_branch, options); DPRINTF(("fixed length = %d\n", fixed_length)); if (fixed_length < 0) { *errorcodeptr = (fixed_length == -2)? ERR36 : ERR25; *ptrptr = ptr; return FALSE; } PUT(reverse_count, 0, fixed_length); } } /* Reached end of expression, either ')' or end of pattern. In the real compile phase, go back through the alternative branches and reverse the chain of offsets, with the field in the BRA item now becoming an offset to the first alternative. If there are no alternatives, it points to the end of the group. The length in the terminating ket is always the length of the whole bracketed item. If any of the ims options were changed inside the group, compile a resetting op-code following, except at the very end of the pattern. Return leaving the pointer at the terminating char. */ if (*ptr != '|') { if (lengthptr == NULL) { int branch_length = code - last_branch; do { int prev_length = GET(last_branch, 1); PUT(last_branch, 1, branch_length); branch_length = prev_length; last_branch -= branch_length; } while (branch_length > 0); } /* Fill in the ket */ *code = OP_KET; PUT(code, 1, code - start_bracket); code += 1 + LINK_SIZE; /* Resetting option if needed */ if ((options & PCRE_IMS) != oldims && *ptr == ')') { *code++ = OP_OPT; *code++ = oldims; length += 2; } /* Retain the highest bracket number, in case resetting was used. */ cd->bracount = max_bracount; /* Set values to pass back */ *codeptr = code; *ptrptr = ptr; *firstbyteptr = firstbyte; *reqbyteptr = reqbyte; if (lengthptr != NULL) { if (OFLOW_MAX - *lengthptr < length) { *errorcodeptr = ERR20; return FALSE; } *lengthptr += length; } return TRUE; } /* Another branch follows. In the pre-compile phase, we can move the code pointer back to where it was for the start of the first branch. (That is, pretend that each branch is the only one.) In the real compile phase, insert an ALT node. Its length field points back to the previous branch while the bracket remains open. At the end the chain is reversed. It's done like this so that the start of the bracket has a zero offset until it is closed, making it possible to detect recursion. */ if (lengthptr != NULL) { code = *codeptr + 1 + LINK_SIZE + skipbytes; length += 1 + LINK_SIZE; } else { *code = OP_ALT; PUT(code, 1, code - last_branch); bc.current = last_branch = code; code += 1 + LINK_SIZE; } ptr++; } /* Control never reaches here */ } /************************************************* * Check for anchored expression * *************************************************/ /* Try to find out if this is an anchored regular expression. Consider each alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then it's anchored. However, if this is a multiline pattern, then only OP_SOD counts, since OP_CIRC can match in the middle. We can also consider a regex to be anchored if OP_SOM starts all its branches. This is the code for \G, which means "match at start of match position, taking into account the match offset". A branch is also implicitly anchored if it starts with .* and DOTALL is set, because that will try the rest of the pattern at all possible matching points, so there is no point trying again.... er .... .... except when the .* appears inside capturing parentheses, and there is a subsequent back reference to those parentheses. We haven't enough information to catch that case precisely. At first, the best we could do was to detect when .* was in capturing brackets and the highest back reference was greater than or equal to that level. However, by keeping a bitmap of the first 31 back references, we can catch some of the more common cases more precisely. Arguments: code points to start of expression (the bracket) options points to the options setting bracket_map a bitmap of which brackets we are inside while testing; this handles up to substring 31; after that we just have to take the less precise approach backref_map the back reference bitmap Returns: TRUE or FALSE */ static BOOL is_anchored(register const uschar *code, int *options, unsigned int bracket_map, unsigned int backref_map) { do { const uschar *scode = first_significant_code(code + _pcre_OP_lengths[*code], options, PCRE_MULTILINE, FALSE); register int op = *scode; /* Non-capturing brackets */ if (op == OP_BRA) { if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE; } /* Capturing brackets */ else if (op == OP_CBRA) { int n = GET2(scode, 1+LINK_SIZE); int new_map = bracket_map | ((n < 32)? (1 << n) : 1); if (!is_anchored(scode, options, new_map, backref_map)) return FALSE; } /* Other brackets */ else if (op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_anchored(scode, options, bracket_map, backref_map)) return FALSE; } /* .* is not anchored unless DOTALL is set and it isn't in brackets that are or may be referenced. */ else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR) && (*options & PCRE_DOTALL) != 0) { if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; } /* Check for explicit anchoring */ else if (op != OP_SOD && op != OP_SOM && ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) return FALSE; code += GET(code, 1); } while (*code == OP_ALT); /* Loop for each alternative */ return TRUE; } /************************************************* * Check for starting with ^ or .* * *************************************************/ /* This is called to find out if every branch starts with ^ or .* so that "first char" processing can be done to speed things up in multiline matching and for non-DOTALL patterns that start with .* (which must start at the beginning or after \n). As in the case of is_anchored() (see above), we have to take account of back references to capturing brackets that contain .* because in that case we can't make the assumption. Arguments: code points to start of expression (the bracket) bracket_map a bitmap of which brackets we are inside while testing; this handles up to substring 31; after that we just have to take the less precise approach backref_map the back reference bitmap Returns: TRUE or FALSE */ static BOOL is_startline(const uschar *code, unsigned int bracket_map, unsigned int backref_map) { do { const uschar *scode = first_significant_code(code + _pcre_OP_lengths[*code], NULL, 0, FALSE); register int op = *scode; /* Non-capturing brackets */ if (op == OP_BRA) { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; } /* Capturing brackets */ else if (op == OP_CBRA) { int n = GET2(scode, 1+LINK_SIZE); int new_map = bracket_map | ((n < 32)? (1 << n) : 1); if (!is_startline(scode, new_map, backref_map)) return FALSE; } /* Other brackets */ else if (op == OP_ASSERT || op == OP_ONCE || op == OP_COND) { if (!is_startline(scode, bracket_map, backref_map)) return FALSE; } /* .* means "start at start or after \n" if it isn't in brackets that may be referenced. */ else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR || op == OP_TYPEPOSSTAR) { if (scode[1] != OP_ANY || (bracket_map & backref_map) != 0) return FALSE; } /* Check for explicit circumflex */ else if (op != OP_CIRC) return FALSE; /* Move on to the next alternative */ code += GET(code, 1); } while (*code == OP_ALT); /* Loop for each alternative */ return TRUE; } /************************************************* * Check for asserted fixed first char * *************************************************/ /* During compilation, the "first char" settings from forward assertions are discarded, because they can cause conflicts with actual literals that follow. However, if we end up without a first char setting for an unanchored pattern, it is worth scanning the regex to see if there is an initial asserted first char. If all branches start with the same asserted char, or with a bracket all of whose alternatives start with the same asserted char (recurse ad lib), then we return that char, otherwise -1. Arguments: code points to start of expression (the bracket) options pointer to the options (used to check casing changes) inassert TRUE if in an assertion Returns: -1 or the fixed first char */ static int find_firstassertedchar(const uschar *code, int *options, BOOL inassert) { register int c = -1; do { int d; const uschar *scode = first_significant_code(code + 1+LINK_SIZE, options, PCRE_CASELESS, TRUE); register int op = *scode; switch(op) { default: return -1; case OP_BRA: case OP_CBRA: case OP_ASSERT: case OP_ONCE: case OP_COND: if ((d = find_firstassertedchar(scode, options, op == OP_ASSERT)) < 0) return -1; if (c < 0) c = d; else if (c != d) return -1; break; case OP_EXACT: /* Fall through */ scode += 2; case OP_CHAR: case OP_CHARNC: case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: if (!inassert) return -1; if (c < 0) { c = scode[1]; if ((*options & PCRE_CASELESS) != 0) c |= REQ_CASELESS; } else if (c != scode[1]) return -1; break; } code += GET(code, 1); } while (*code == OP_ALT); return c; } /************************************************* * Compile a Regular Expression * *************************************************/ /* This function takes a string and returns a pointer to a block of store holding a compiled version of the expression. The original API for this function had no error code return variable; it is retained for backwards compatibility. The new function is given a new name. Arguments: pattern the regular expression options various option bits errorcodeptr pointer to error code variable (pcre_compile2() only) can be NULL if you don't want a code value errorptr pointer to pointer to error text erroroffset ptr offset in pattern where error was detected tables pointer to character tables or NULL Returns: pointer to compiled data block, or NULL on error, with errorptr and erroroffset set */ PCRE_EXP_DEFN pcre * pcre_compile(const char *pattern, int options, const char **errorptr, int *erroroffset, const unsigned char *tables) { return pcre_compile2(pattern, options, NULL, errorptr, erroroffset, tables); } PCRE_EXP_DEFN pcre * pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errorptr, int *erroroffset, const unsigned char *tables) { real_pcre *re; int length = 1; /* For final END opcode */ int firstbyte, reqbyte, newline; int errorcode = 0; int skipatstart = 0; #ifdef SUPPORT_UTF8 BOOL utf8; #endif size_t size; uschar *code; const uschar *codestart; const uschar *ptr; compile_data compile_block; compile_data *cd = &compile_block; /* This space is used for "compiling" into during the first phase, when we are computing the amount of memory that is needed. Compiled items are thrown away as soon as possible, so that a fairly large buffer should be sufficient for this purpose. The same space is used in the second phase for remembering where to fill in forward references to subpatterns. */ uschar cworkspace[COMPILE_WORK_SIZE]; /* Set this early so that early errors get offset 0. */ ptr = (const uschar *)pattern; /* We can't pass back an error message if errorptr is NULL; I guess the best we can do is just return NULL, but we can set a code value if there is a code pointer. */ if (errorptr == NULL) { if (errorcodeptr != NULL) *errorcodeptr = 99; return NULL; } *errorptr = NULL; if (errorcodeptr != NULL) *errorcodeptr = ERR0; /* However, we can give a message for this error */ if (erroroffset == NULL) { errorcode = ERR16; goto PCRE_EARLY_ERROR_RETURN2; } *erroroffset = 0; /* Can't support UTF8 unless PCRE has been compiled to include the code. */ #ifdef SUPPORT_UTF8 utf8 = (options & PCRE_UTF8) != 0; if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0 && (*erroroffset = _pcre_valid_utf8((uschar *)pattern, -1)) >= 0) { errorcode = ERR44; goto PCRE_EARLY_ERROR_RETURN2; } #else if ((options & PCRE_UTF8) != 0) { errorcode = ERR32; goto PCRE_EARLY_ERROR_RETURN; } #endif if ((options & ~PUBLIC_OPTIONS) != 0) { errorcode = ERR17; goto PCRE_EARLY_ERROR_RETURN; } /* Set up pointers to the individual character tables */ if (tables == NULL) tables = _pcre_default_tables; cd->lcc = tables + lcc_offset; cd->fcc = tables + fcc_offset; cd->cbits = tables + cbits_offset; cd->ctypes = tables + ctypes_offset; /* Check for newline settings at the start of the pattern, and remember the offset for later. */ if (ptr[0] == '(' && ptr[1] == '*') { int newnl = 0; if (strncmp((char *)(ptr+2), "CR)", 3) == 0) { skipatstart = 5; newnl = PCRE_NEWLINE_CR; } else if (strncmp((char *)(ptr+2), "LF)", 3) == 0) { skipatstart = 5; newnl = PCRE_NEWLINE_LF; } else if (strncmp((char *)(ptr+2), "CRLF)", 5) == 0) { skipatstart = 7; newnl = PCRE_NEWLINE_CR + PCRE_NEWLINE_LF; } else if (strncmp((char *)(ptr+2), "ANY)", 4) == 0) { skipatstart = 6; newnl = PCRE_NEWLINE_ANY; } else if (strncmp((char *)(ptr+2), "ANYCRLF)", 8) == 0) { skipatstart = 10; newnl = PCRE_NEWLINE_ANYCRLF; } if (skipatstart > 0) options = (options & ~PCRE_NEWLINE_BITS) | newnl; } /* Handle different types of newline. The three bits give seven cases. The current code allows for fixed one- or two-byte sequences, plus "any" and "anycrlf". */ switch (options & PCRE_NEWLINE_BITS) { case 0: newline = NEWLINE; break; /* Build-time default */ case PCRE_NEWLINE_CR: newline = '\r'; break; case PCRE_NEWLINE_LF: newline = '\n'; break; case PCRE_NEWLINE_CR+ PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break; case PCRE_NEWLINE_ANY: newline = -1; break; case PCRE_NEWLINE_ANYCRLF: newline = -2; break; default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN; } if (newline == -2) { cd->nltype = NLTYPE_ANYCRLF; } else if (newline < 0) { cd->nltype = NLTYPE_ANY; } else { cd->nltype = NLTYPE_FIXED; if (newline > 255) { cd->nllen = 2; cd->nl[0] = (newline >> 8) & 255; cd->nl[1] = newline & 255; } else { cd->nllen = 1; cd->nl[0] = newline; } } /* Maximum back reference and backref bitmap. The bitmap records up to 31 back references to help in deciding whether (.*) can be treated as anchored or not. */ cd->top_backref = 0; cd->backref_map = 0; /* Reflect pattern for debugging output */ DPRINTF(("------------------------------------------------------------------\n")); DPRINTF(("%s\n", pattern)); /* Pretend to compile the pattern while actually just accumulating the length of memory required. This behaviour is triggered by passing a non-NULL final argument to compile_regex(). We pass a block of workspace (cworkspace) for it to compile parts of the pattern into; the compiled code is discarded when it is no longer needed, so hopefully this workspace will never overflow, though there is a test for its doing so. */ cd->bracount = 0; cd->names_found = 0; cd->name_entry_size = 0; cd->name_table = NULL; cd->start_workspace = cworkspace; cd->start_code = cworkspace; cd->hwm = cworkspace; cd->start_pattern = (const uschar *)pattern; cd->end_pattern = (const uschar *)(pattern + strlen(pattern)); cd->req_varyopt = 0; cd->nopartial = FALSE; cd->external_options = options; /* Now do the pre-compile. On error, errorcode will be set non-zero, so we don't need to look at the result of the function here. The initial options have been put into the cd block so that they can be changed if an option setting is found within the regex right at the beginning. Bringing initial option settings outside can help speed up starting point checks. */ ptr += skipatstart; code = cworkspace; *code = OP_BRA; (void)compile_regex(cd->external_options, cd->external_options & PCRE_IMS, &code, &ptr, &errorcode, FALSE, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, &length); if (errorcode != 0) goto PCRE_EARLY_ERROR_RETURN; DPRINTF(("end pre-compile: length=%d workspace=%d\n", length, cd->hwm - cworkspace)); if (length > MAX_PATTERN_SIZE) { errorcode = ERR20; goto PCRE_EARLY_ERROR_RETURN; } /* Compute the size of data block needed and get it, either from malloc or externally provided function. Integer overflow should no longer be possible because nowadays we limit the maximum value of cd->names_found and cd->name_entry_size. */ size = length + sizeof(real_pcre) + cd->names_found * (cd->name_entry_size + 3); re = (real_pcre *)(pcre_malloc)(size); if (re == NULL) { errorcode = ERR21; goto PCRE_EARLY_ERROR_RETURN; } /* Put in the magic number, and save the sizes, initial options, and character table pointer. NULL is used for the default character tables. The nullpad field is at the end; it's there to help in the case when a regex compiled on a system with 4-byte pointers is run on another with 8-byte pointers. */ re->magic_number = MAGIC_NUMBER; re->size = size; re->options = cd->external_options; re->dummy1 = 0; re->first_byte = 0; re->req_byte = 0; re->name_table_offset = sizeof(real_pcre); re->name_entry_size = cd->name_entry_size; re->name_count = cd->names_found; re->ref_count = 0; re->tables = (tables == _pcre_default_tables)? NULL : tables; re->nullpad = NULL; /* The starting points of the name/number translation table and of the code are passed around in the compile data block. The start/end pattern and initial options are already set from the pre-compile phase, as is the name_entry_size field. Reset the bracket count and the names_found field. Also reset the hwm field; this time it's used for remembering forward references to subpatterns. */ cd->bracount = 0; cd->names_found = 0; cd->name_table = (uschar *)re + re->name_table_offset; codestart = cd->name_table + re->name_entry_size * re->name_count; cd->start_code = codestart; cd->hwm = cworkspace; cd->req_varyopt = 0; cd->nopartial = FALSE; cd->had_accept = FALSE; /* Set up a starting, non-extracting bracket, then compile the expression. On error, errorcode will be set non-zero, so we don't need to look at the result of the function here. */ ptr = (const uschar *)pattern + skipatstart; code = (uschar *)codestart; *code = OP_BRA; (void)compile_regex(re->options, re->options & PCRE_IMS, &code, &ptr, &errorcode, FALSE, FALSE, 0, &firstbyte, &reqbyte, NULL, cd, NULL); re->top_bracket = cd->bracount; re->top_backref = cd->top_backref; if (cd->nopartial) re->options |= PCRE_NOPARTIAL; if (cd->had_accept) reqbyte = -1; /* Must disable after (*ACCEPT) */ /* If not reached end of pattern on success, there's an excess bracket. */ if (errorcode == 0 && *ptr != 0) errorcode = ERR22; /* Fill in the terminating state and check for disastrous overflow, but if debugging, leave the test till after things are printed out. */ *code++ = OP_END; #ifndef DEBUG if (code - codestart > length) errorcode = ERR23; #endif /* Fill in any forward references that are required. */ while (errorcode == 0 && cd->hwm > cworkspace) { int offset, recno; const uschar *groupptr; cd->hwm -= LINK_SIZE; offset = GET(cd->hwm, 0); recno = GET(codestart, offset); groupptr = find_bracket(codestart, (re->options & PCRE_UTF8) != 0, recno); if (groupptr == NULL) errorcode = ERR53; else PUT(((uschar *)codestart), offset, groupptr - codestart); } /* Give an error if there's back reference to a non-existent capturing subpattern. */ if (errorcode == 0 && re->top_backref > re->top_bracket) errorcode = ERR15; /* Failed to compile, or error while post-processing */ if (errorcode != 0) { (pcre_free)(re); PCRE_EARLY_ERROR_RETURN: *erroroffset = ptr - (const uschar *)pattern; PCRE_EARLY_ERROR_RETURN2: *errorptr = error_texts[errorcode]; if (errorcodeptr != NULL) *errorcodeptr = errorcode; return NULL; } /* If the anchored option was not passed, set the flag if we can determine that the pattern is anchored by virtue of ^ characters or \A or anything else (such as starting with .* when DOTALL is set). Otherwise, if we know what the first byte has to be, save it, because that speeds up unanchored matches no end. If not, see if we can set the PCRE_STARTLINE flag. This is helpful for multiline matches when all branches start with ^. and also when all branches start with .* for non-DOTALL matches. */ if ((re->options & PCRE_ANCHORED) == 0) { int temp_options = re->options; /* May get changed during these scans */ if (is_anchored(codestart, &temp_options, 0, cd->backref_map)) re->options |= PCRE_ANCHORED; else { if (firstbyte < 0) firstbyte = find_firstassertedchar(codestart, &temp_options, FALSE); if (firstbyte >= 0) /* Remove caseless flag for non-caseable chars */ { int ch = firstbyte & 255; re->first_byte = ((firstbyte & REQ_CASELESS) != 0 && cd->fcc[ch] == ch)? ch : firstbyte; re->options |= PCRE_FIRSTSET; } else if (is_startline(codestart, 0, cd->backref_map)) re->options |= PCRE_STARTLINE; } } /* For an anchored pattern, we use the "required byte" only if it follows a variable length item in the regex. Remove the caseless flag for non-caseable bytes. */ if (reqbyte >= 0 && ((re->options & PCRE_ANCHORED) == 0 || (reqbyte & REQ_VARY) != 0)) { int ch = reqbyte & 255; re->req_byte = ((reqbyte & REQ_CASELESS) != 0 && cd->fcc[ch] == ch)? (reqbyte & ~REQ_CASELESS) : reqbyte; re->options |= PCRE_REQCHSET; } /* Print out the compiled data if debugging is enabled. This is never the case when building a production library. */ #ifdef DEBUG printf("Length = %d top_bracket = %d top_backref = %d\n", length, re->top_bracket, re->top_backref); printf("Options=%08x\n", re->options); if ((re->options & PCRE_FIRSTSET) != 0) { int ch = re->first_byte & 255; const char *caseless = ((re->first_byte & REQ_CASELESS) == 0)? "" : " (caseless)"; if (isprint(ch)) printf("First char = %c%s\n", ch, caseless); else printf("First char = \\x%02x%s\n", ch, caseless); } if ((re->options & PCRE_REQCHSET) != 0) { int ch = re->req_byte & 255; const char *caseless = ((re->req_byte & REQ_CASELESS) == 0)? "" : " (caseless)"; if (isprint(ch)) printf("Req char = %c%s\n", ch, caseless); else printf("Req char = \\x%02x%s\n", ch, caseless); } pcre_printint(re, stdout, TRUE); /* This check is done here in the debugging case so that the code that was compiled can be seen. */ if (code - codestart > length) { (pcre_free)(re); *errorptr = error_texts[ERR23]; *erroroffset = ptr - (uschar *)pattern; if (errorcodeptr != NULL) *errorcodeptr = ERR23; return NULL; } #endif /* DEBUG */ return (pcre *)re; } /* End of pcre_compile.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_config.c0000644000373300037200000000670712424517753024702 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_config(). */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Return info about what features are configured * *************************************************/ /* This function has an extensible interface so that additional items can be added compatibly. Arguments: what what information is required where where to put the information Returns: 0 if data returned, negative on error */ PCRE_EXP_DEFN int pcre_config(int what, void *where) { switch (what) { case PCRE_CONFIG_UTF8: #ifdef SUPPORT_UTF8 *((int *)where) = 1; #else *((int *)where) = 0; #endif break; case PCRE_CONFIG_UNICODE_PROPERTIES: #ifdef SUPPORT_UCP *((int *)where) = 1; #else *((int *)where) = 0; #endif break; case PCRE_CONFIG_NEWLINE: *((int *)where) = NEWLINE; break; case PCRE_CONFIG_LINK_SIZE: *((int *)where) = LINK_SIZE; break; case PCRE_CONFIG_POSIX_MALLOC_THRESHOLD: *((int *)where) = POSIX_MALLOC_THRESHOLD; break; case PCRE_CONFIG_MATCH_LIMIT: *((unsigned int *)where) = MATCH_LIMIT; break; case PCRE_CONFIG_MATCH_LIMIT_RECURSION: *((unsigned int *)where) = MATCH_LIMIT_RECURSION; break; case PCRE_CONFIG_STACKRECURSE: #ifdef NO_RECURSE *((int *)where) = 0; #else *((int *)where) = 1; #endif break; default: return PCRE_ERROR_BADOPTION; } return 0; } /* End of pcre_config.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_config_android.h0000644000373300037200000002205212424517753026376 0ustar00nightlyallusers00000000000000/* config-win32.h. Manually adapted for Android compiling */ /* On Unix-like systems config.h.in is converted by "configure" into config.h. Some other environments also support the use of "configure". PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. If you are going to build PCRE "by hand" on a system without "configure" you should copy the distributed config.h.generic to config.h, and then set up the macros the way you need them. Alternatively, you can avoid editing by using -D on the compiler command line to set the macro values. PCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if HAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set them both to 0; an emulation function will be used. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic. */ /* #undef EBCDIC */ /* Define to 1 if you have the `bcopy' function. */ #ifndef HAVE_BCOPY #define HAVE_BCOPY 0 // MWerks CW 9 Win MSL does not seem to have it #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_BITS_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_DIRENT_H #define HAVE_DIRENT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_DLFCN_H #define HAVE_DLFCN_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_INTTYPES_H #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_LIMITS_H #define HAVE_LIMITS_H 1 #endif /* Define to 1 if the system has the type `long long'. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif /* Define to 1 if you have the `memmove' function. */ #ifndef HAVE_MEMMOVE #define HAVE_MEMMOVE 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_MEMORY_H #define HAVE_MEMORY_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDINT_H #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strerror' function. */ #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING #define HAVE_STRING 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRINGS_H #define HAVE_STRINGS_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING_H #define HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strtoll' function. */ #ifndef HAVE_STRTOLL #define HAVE_STRTOLL 0 #endif /* Define to 1 if you have the `strtoq' function. */ #ifndef HAVE_STRTOQ #define HAVE_STRTOQ 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_STAT_H #define HAVE_SYS_STAT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 0 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_UNISTD_H #define HAVE_UNISTD_H 0 #endif /* Define to 1 if the system has the type `unsigned long long'. */ #ifndef HAVE_UNSIGNED_LONG_LONG #define HAVE_UNSIGNED_LONG_LONG 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_WINDOWS_H */ /* The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On systems that support it, "configure" can be used to override this default. */ #ifndef LINK_SIZE #define LINK_SIZE 2 #endif /* The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On systems that support it, "configure" can be used to override this default default. */ #ifndef MATCH_LIMIT #define MATCH_LIMIT 10000000 #endif /* The above limit applies to all calls of match(), whether or not they increase the recursion depth. In some environments it is desirable to limit the depth of recursive calls of match() more strictly, in order to restrict the maximum amount of stack (or heap, if NO_RECURSE is defined) that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To have any useful effect, it must be less than the value of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is a runtime method for setting a different limit. On systems that support it, "configure" can be used to override the default. */ #ifndef MATCH_LIMIT_RECURSION #define MATCH_LIMIT_RECURSION MATCH_LIMIT #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_COUNT #define MAX_NAME_COUNT 10000 #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_SIZE #define MAX_NAME_SIZE 32 #endif /* The value of NEWLINE determines the newline character sequence. On Unix-like systems, "configure" can be used to override the default, which is 10. The possible values are 10 (LF), 13 (CR), 3338 (CRLF), -1 (ANY), or -2 (ANYCRLF). */ #ifndef NEWLINE #define NEWLINE 10 #endif /* PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc() to obtain memory from the heap. For more detail, see the comments and other stuff just above the match() function. On systems that support it, "configure" can be used to set this in the Makefile (use --disable-stack-for-recursion). */ /* #undef NO_RECURSE */ /* Name of package */ #define PACKAGE "pcre" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PCRE 7.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" /* Define to the version of this package. */ #define PACKAGE_VERSION "7.3" /* If you are compiling for a system other than a Unix-like system or Win32, and it needs some magic to be inserted before the definition of a function that is exported by the library, define this macro to contain the relevant magic. If you do not define this macro, it defaults to "extern" for a C compiler and "extern C" for a C++ compiler on non-Win32 systems. This macro apears at the start of every exported function that is part of the external API. It does not appear on functions that are "external" in the C sense, but which are internal to the library. */ /* #undef PCRE_EXP_DEFN */ /* Define if linking statically (TODO: make nice with Libtool) */ /* #undef PCRE_STATIC */ /* When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD. On systems that support it, "configure" can be used to override this default. */ #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD 10 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef STDC_HEADERS #define STDC_HEADERS 1 #endif /* Define to enable support for Unicode properties */ /* #undef SUPPORT_UCP */ /* Define to enable support for the UTF-8 Unicode encoding. */ #define SUPPORT_UTF8 1 /* Version number of package */ #ifndef VERSION #define VERSION "7.3" #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ syncevolution-1.5/src/synthesis/src/pcre/pcre_config_macosx.h0000644000373300037200000002206512424517753026254 0ustar00nightlyallusers00000000000000/* config-win32.h. Manually adapted for Win32 MWerks CW9.3 compiling */ /* On Unix-like systems config.h.in is converted by "configure" into config.h. Some other environments also support the use of "configure". PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. If you are going to build PCRE "by hand" on a system without "configure" you should copy the distributed config.h.generic to config.h, and then set up the macros the way you need them. Alternatively, you can avoid editing by using -D on the compiler command line to set the macro values. PCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if HAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set them both to 0; an emulation function will be used. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic. */ /* #undef EBCDIC */ /* Define to 1 if you have the `bcopy' function. */ #ifndef HAVE_BCOPY #define HAVE_BCOPY 0 // MWerks CW 9 Win MSL does not seem to have it #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_BITS_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_DIRENT_H #define HAVE_DIRENT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_DLFCN_H #define HAVE_DLFCN_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_INTTYPES_H #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_LIMITS_H #define HAVE_LIMITS_H 1 #endif /* Define to 1 if the system has the type `long long'. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif /* Define to 1 if you have the `memmove' function. */ #ifndef HAVE_MEMMOVE #define HAVE_MEMMOVE 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_MEMORY_H #define HAVE_MEMORY_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDINT_H #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strerror' function. */ #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING #define HAVE_STRING 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRINGS_H #define HAVE_STRINGS_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING_H #define HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strtoll' function. */ #ifndef HAVE_STRTOLL #define HAVE_STRTOLL 0 #endif /* Define to 1 if you have the `strtoq' function. */ #ifndef HAVE_STRTOQ #define HAVE_STRTOQ 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_STAT_H #define HAVE_SYS_STAT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 0 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_UNISTD_H #define HAVE_UNISTD_H 0 #endif /* Define to 1 if the system has the type `unsigned long long'. */ #ifndef HAVE_UNSIGNED_LONG_LONG #define HAVE_UNSIGNED_LONG_LONG 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_WINDOWS_H */ /* The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On systems that support it, "configure" can be used to override this default. */ #ifndef LINK_SIZE #define LINK_SIZE 2 #endif /* The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On systems that support it, "configure" can be used to override this default default. */ #ifndef MATCH_LIMIT #define MATCH_LIMIT 10000000 #endif /* The above limit applies to all calls of match(), whether or not they increase the recursion depth. In some environments it is desirable to limit the depth of recursive calls of match() more strictly, in order to restrict the maximum amount of stack (or heap, if NO_RECURSE is defined) that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To have any useful effect, it must be less than the value of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is a runtime method for setting a different limit. On systems that support it, "configure" can be used to override the default. */ #ifndef MATCH_LIMIT_RECURSION #define MATCH_LIMIT_RECURSION MATCH_LIMIT #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_COUNT #define MAX_NAME_COUNT 10000 #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_SIZE #define MAX_NAME_SIZE 32 #endif /* The value of NEWLINE determines the newline character sequence. On Unix-like systems, "configure" can be used to override the default, which is 10. The possible values are 10 (LF), 13 (CR), 3338 (CRLF), -1 (ANY), or -2 (ANYCRLF). */ #ifndef NEWLINE #define NEWLINE 10 #endif /* PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc() to obtain memory from the heap. For more detail, see the comments and other stuff just above the match() function. On systems that support it, "configure" can be used to set this in the Makefile (use --disable-stack-for-recursion). */ /* #undef NO_RECURSE */ /* Name of package */ #define PACKAGE "pcre" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PCRE 7.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" /* Define to the version of this package. */ #define PACKAGE_VERSION "7.3" /* If you are compiling for a system other than a Unix-like system or Win32, and it needs some magic to be inserted before the definition of a function that is exported by the library, define this macro to contain the relevant magic. If you do not define this macro, it defaults to "extern" for a C compiler and "extern C" for a C++ compiler on non-Win32 systems. This macro apears at the start of every exported function that is part of the external API. It does not appear on functions that are "external" in the C sense, but which are internal to the library. */ /* #undef PCRE_EXP_DEFN */ /* Define if linking statically (TODO: make nice with Libtool) */ /* #undef PCRE_STATIC */ /* When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD. On systems that support it, "configure" can be used to override this default. */ #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD 10 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef STDC_HEADERS #define STDC_HEADERS 1 #endif /* Define to enable support for Unicode properties */ /* #undef SUPPORT_UCP */ /* Define to enable support for the UTF-8 Unicode encoding. */ #define SUPPORT_UTF8 1 /* Version number of package */ #ifndef VERSION #define VERSION "7.3" #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ syncevolution-1.5/src/synthesis/src/pcre/pcre_config_win32.h0000644000373300037200000002206512424517753025724 0ustar00nightlyallusers00000000000000/* config-win32.h. Manually adapted for Win32 MWerks CW9.3 compiling */ /* On Unix-like systems config.h.in is converted by "configure" into config.h. Some other environments also support the use of "configure". PCRE is written in Standard C, but there are a few non-standard things it can cope with, allowing it to run on SunOS4 and other "close to standard" systems. If you are going to build PCRE "by hand" on a system without "configure" you should copy the distributed config.h.generic to config.h, and then set up the macros the way you need them. Alternatively, you can avoid editing by using -D on the compiler command line to set the macro values. PCRE uses memmove() if HAVE_MEMMOVE is set to 1; otherwise it uses bcopy() if HAVE_BCOPY is set to 1. If your system has neither bcopy() nor memmove(), set them both to 0; an emulation function will be used. */ /* If you are compiling for a system that uses EBCDIC instead of ASCII character codes, define this macro as 1. On systems that can use "configure", this can be done via --enable-ebcdic. */ /* #undef EBCDIC */ /* Define to 1 if you have the `bcopy' function. */ #ifndef HAVE_BCOPY #define HAVE_BCOPY 0 // MWerks CW 9 Win MSL does not seem to have it #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_BITS_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_DIRENT_H #define HAVE_DIRENT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_DLFCN_H #define HAVE_DLFCN_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_INTTYPES_H #define HAVE_INTTYPES_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_LIMITS_H #define HAVE_LIMITS_H 1 #endif /* Define to 1 if the system has the type `long long'. */ #ifndef HAVE_LONG_LONG #define HAVE_LONG_LONG 1 #endif /* Define to 1 if you have the `memmove' function. */ #ifndef HAVE_MEMMOVE #define HAVE_MEMMOVE 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_MEMORY_H #define HAVE_MEMORY_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDINT_H #define HAVE_STDINT_H 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STDLIB_H #define HAVE_STDLIB_H 1 #endif /* Define to 1 if you have the `strerror' function. */ #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING #define HAVE_STRING 1 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRINGS_H #define HAVE_STRINGS_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_STRING_H #define HAVE_STRING_H 1 #endif /* Define to 1 if you have the `strtoll' function. */ #ifndef HAVE_STRTOLL #define HAVE_STRTOLL 0 #endif /* Define to 1 if you have the `strtoq' function. */ #ifndef HAVE_STRTOQ #define HAVE_STRTOQ 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_STAT_H #define HAVE_SYS_STAT_H 0 #endif /* Define to 1 if you have the header file. */ #ifndef HAVE_SYS_TYPES_H #define HAVE_SYS_TYPES_H 0 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_TYPE_TRAITS_H */ /* Define to 1 if you have the header file. */ #ifndef HAVE_UNISTD_H #define HAVE_UNISTD_H 0 #endif /* Define to 1 if the system has the type `unsigned long long'. */ #ifndef HAVE_UNSIGNED_LONG_LONG #define HAVE_UNSIGNED_LONG_LONG 1 #endif /* Define to 1 if you have the header file. */ /* #undef HAVE_WINDOWS_H */ /* The value of LINK_SIZE determines the number of bytes used to store links as offsets within the compiled regex. The default is 2, which allows for compiled patterns up to 64K long. This covers the vast majority of cases. However, PCRE can also be compiled to use 3 or 4 bytes instead. This allows for longer patterns in extreme cases. On systems that support it, "configure" can be used to override this default. */ #ifndef LINK_SIZE #define LINK_SIZE 2 #endif /* The value of MATCH_LIMIT determines the default number of times the internal match() function can be called during a single execution of pcre_exec(). There is a runtime interface for setting a different limit. The limit exists in order to catch runaway regular expressions that take for ever to determine that they do not match. The default is set very large so that it does not accidentally catch legitimate cases. On systems that support it, "configure" can be used to override this default default. */ #ifndef MATCH_LIMIT #define MATCH_LIMIT 10000000 #endif /* The above limit applies to all calls of match(), whether or not they increase the recursion depth. In some environments it is desirable to limit the depth of recursive calls of match() more strictly, in order to restrict the maximum amount of stack (or heap, if NO_RECURSE is defined) that is used. The value of MATCH_LIMIT_RECURSION applies only to recursive calls of match(). To have any useful effect, it must be less than the value of MATCH_LIMIT. The default is to use the same value as MATCH_LIMIT. There is a runtime method for setting a different limit. On systems that support it, "configure" can be used to override the default. */ #ifndef MATCH_LIMIT_RECURSION #define MATCH_LIMIT_RECURSION MATCH_LIMIT #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_COUNT #define MAX_NAME_COUNT 10000 #endif /* This limit is parameterized just in case anybody ever wants to change it. Care must be taken if it is increased, because it guards against integer overflow caused by enormously large patterns. */ #ifndef MAX_NAME_SIZE #define MAX_NAME_SIZE 32 #endif /* The value of NEWLINE determines the newline character sequence. On Unix-like systems, "configure" can be used to override the default, which is 10. The possible values are 10 (LF), 13 (CR), 3338 (CRLF), -1 (ANY), or -2 (ANYCRLF). */ #ifndef NEWLINE #define NEWLINE 10 #endif /* PCRE uses recursive function calls to handle backtracking while matching. This can sometimes be a problem on systems that have stacks of limited size. Define NO_RECURSE to get a version that doesn't use recursion in the match() function; instead it creates its own stack by steam using pcre_recurse_malloc() to obtain memory from the heap. For more detail, see the comments and other stuff just above the match() function. On systems that support it, "configure" can be used to set this in the Makefile (use --disable-stack-for-recursion). */ /* #undef NO_RECURSE */ /* Name of package */ #define PACKAGE "pcre" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define PACKAGE_NAME "PCRE" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "PCRE 7.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre" /* Define to the version of this package. */ #define PACKAGE_VERSION "7.3" /* If you are compiling for a system other than a Unix-like system or Win32, and it needs some magic to be inserted before the definition of a function that is exported by the library, define this macro to contain the relevant magic. If you do not define this macro, it defaults to "extern" for a C compiler and "extern C" for a C++ compiler on non-Win32 systems. This macro apears at the start of every exported function that is part of the external API. It does not appear on functions that are "external" in the C sense, but which are internal to the library. */ /* #undef PCRE_EXP_DEFN */ /* Define if linking statically (TODO: make nice with Libtool) */ /* #undef PCRE_STATIC */ /* When calling PCRE via the POSIX interface, additional working storage is required for holding the pointers to capturing substrings because PCRE requires three integers per substring, whereas the POSIX interface provides only two. If the number of expected substrings is small, the wrapper function uses space on the stack, because this is faster than using malloc() for each call. The threshold above which the stack is no longer used is defined by POSIX_MALLOC_THRESHOLD. On systems that support it, "configure" can be used to override this default. */ #ifndef POSIX_MALLOC_THRESHOLD #define POSIX_MALLOC_THRESHOLD 10 #endif /* Define to 1 if you have the ANSI C header files. */ #ifndef STDC_HEADERS #define STDC_HEADERS 1 #endif /* Define to enable support for Unicode properties */ /* #undef SUPPORT_UCP */ /* Define to enable support for the UTF-8 Unicode encoding. */ #define SUPPORT_UTF8 1 /* Version number of package */ #ifndef VERSION #define VERSION "7.3" #endif /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ syncevolution-1.5/src/synthesis/src/pcre/pcre_dfa_exec.c0000644000373300037200000027030012424517753025163 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_dfa_exec(), which is an alternative matching function that uses a sort of DFA algorithm (not a true FSM). This is NOT Perl- compatible, but it has advantages in certain applications. */ #include "pcre_setup.h" #define NLBLOCK md /* Block containing newline information */ #define PSSTART start_subject /* Field containing processed string start */ #define PSEND end_subject /* Field containing processed string end */ #include "pcre_internal.h" /* For use to indent debugging output */ #define SP " " /************************************************* * Code parameters and static tables * *************************************************/ /* These are offsets that are used to turn the OP_TYPESTAR and friends opcodes into others, under special conditions. A gap of 20 between the blocks should be enough. The resulting opcodes don't have to be less than 256 because they are never stored, so we push them well clear of the normal opcodes. */ #define OP_PROP_EXTRA 300 #define OP_EXTUNI_EXTRA 320 #define OP_ANYNL_EXTRA 340 #define OP_HSPACE_EXTRA 360 #define OP_VSPACE_EXTRA 380 /* This table identifies those opcodes that are followed immediately by a character that is to be tested in some way. This makes is possible to centralize the loading of these characters. In the case of Type * etc, the "character" is the opcode for \D, \d, \S, \s, \W, or \w, which will always be a small value. ***NOTE*** If the start of this table is modified, the two tables that follow must also be modified. */ static uschar coptable[] = { 0, /* End */ 0, 0, 0, 0, 0, /* \A, \G, \K, \B, \b */ 0, 0, 0, 0, 0, 0, /* \D, \d, \S, \s, \W, \w */ 0, 0, /* Any, Anybyte */ 0, 0, 0, /* NOTPROP, PROP, EXTUNI */ 0, 0, 0, 0, 0, /* \R, \H, \h, \V, \v */ 0, 0, 0, 0, 0, /* \Z, \z, Opt, ^, $ */ 1, /* Char */ 1, /* Charnc */ 1, /* not */ /* Positive single-char repeats */ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ 3, 3, 3, /* upto, minupto, exact */ 1, 1, 1, 3, /* *+, ++, ?+, upto+ */ /* Negative single-char repeats - only for chars < 256 */ 1, 1, 1, 1, 1, 1, /* NOT *, *?, +, +?, ?, ?? */ 3, 3, 3, /* NOT upto, minupto, exact */ 1, 1, 1, 3, /* NOT *+, ++, ?+, updo+ */ /* Positive type repeats */ 1, 1, 1, 1, 1, 1, /* Type *, *?, +, +?, ?, ?? */ 3, 3, 3, /* Type upto, minupto, exact */ 1, 1, 1, 3, /* Type *+, ++, ?+, upto+ */ /* Character class & ref repeats */ 0, 0, 0, 0, 0, 0, /* *, *?, +, +?, ?, ?? */ 0, 0, /* CRRANGE, CRMINRANGE */ 0, /* CLASS */ 0, /* NCLASS */ 0, /* XCLASS - variable length */ 0, /* REF */ 0, /* RECURSE */ 0, /* CALLOUT */ 0, /* Alt */ 0, /* Ket */ 0, /* KetRmax */ 0, /* KetRmin */ 0, /* Assert */ 0, /* Assert not */ 0, /* Assert behind */ 0, /* Assert behind not */ 0, /* Reverse */ 0, 0, 0, 0, /* ONCE, BRA, CBRA, COND */ 0, 0, 0, /* SBRA, SCBRA, SCOND */ 0, /* CREF */ 0, /* RREF */ 0, /* DEF */ 0, 0, /* BRAZERO, BRAMINZERO */ 0, 0, 0, 0, /* PRUNE, SKIP, THEN, COMMIT */ 0, 0 /* FAIL, ACCEPT */ }; /* These 2 tables allow for compact code for testing for \D, \d, \S, \s, \W, and \w */ static uschar toptable1[] = { 0, 0, 0, 0, 0, 0, ctype_digit, ctype_digit, ctype_space, ctype_space, ctype_word, ctype_word, 0 /* OP_ANY */ }; static uschar toptable2[] = { 0, 0, 0, 0, 0, 0, ctype_digit, 0, ctype_space, 0, ctype_word, 0, 1 /* OP_ANY */ }; /* Structure for holding data about a particular state, which is in effect the current data for an active path through the match tree. It must consist entirely of ints because the working vector we are passed, and which we put these structures in, is a vector of ints. */ typedef struct stateblock { int offset; /* Offset to opcode */ int count; /* Count for repeats */ int ims; /* ims flag bits */ int data; /* Some use extra data */ } stateblock; #define INTS_PER_STATEBLOCK (sizeof(stateblock)/sizeof(int)) #ifdef DEBUG /************************************************* * Print character string * *************************************************/ /* Character string printing function for debugging. Arguments: p points to string length number of bytes f where to print Returns: nothing */ static void pchars(unsigned char *p, int length, FILE *f) { int c; while (length-- > 0) { if (isprint(c = *(p++))) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c); } } #endif /************************************************* * Execute a Regular Expression - DFA engine * *************************************************/ /* This internal function applies a compiled pattern to a subject string, starting at a given point, using a DFA engine. This function is called from the external one, possibly multiple times if the pattern is not anchored. The function calls itself recursively for some kinds of subpattern. Arguments: md the match_data block with fixed information this_start_code the opening bracket of this subexpression's code current_subject where we currently are in the subject string start_offset start offset in the subject string offsets vector to contain the matching string offsets offsetcount size of same workspace vector of workspace wscount size of same ims the current ims flags rlevel function call recursion level recursing regex recursive call level Returns: > 0 => = 0 => -1 => failed to match < -1 => some kind of unexpected problem The following macros are used for adding states to the two state vectors (one for the current character, one for the following character). */ #define ADD_ACTIVE(x,y) \ if (active_count++ < wscount) \ { \ next_active_state->offset = (x); \ next_active_state->count = (y); \ next_active_state->ims = ims; \ next_active_state++; \ DPRINTF(("%.*sADD_ACTIVE(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \ } \ else return PCRE_ERROR_DFA_WSSIZE #define ADD_ACTIVE_DATA(x,y,z) \ if (active_count++ < wscount) \ { \ next_active_state->offset = (x); \ next_active_state->count = (y); \ next_active_state->ims = ims; \ next_active_state->data = (z); \ next_active_state++; \ DPRINTF(("%.*sADD_ACTIVE_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \ } \ else return PCRE_ERROR_DFA_WSSIZE #define ADD_NEW(x,y) \ if (new_count++ < wscount) \ { \ next_new_state->offset = (x); \ next_new_state->count = (y); \ next_new_state->ims = ims; \ next_new_state++; \ DPRINTF(("%.*sADD_NEW(%d,%d)\n", rlevel*2-2, SP, (x), (y))); \ } \ else return PCRE_ERROR_DFA_WSSIZE #define ADD_NEW_DATA(x,y,z) \ if (new_count++ < wscount) \ { \ next_new_state->offset = (x); \ next_new_state->count = (y); \ next_new_state->ims = ims; \ next_new_state->data = (z); \ next_new_state++; \ DPRINTF(("%.*sADD_NEW_DATA(%d,%d,%d)\n", rlevel*2-2, SP, (x), (y), (z))); \ } \ else return PCRE_ERROR_DFA_WSSIZE /* And now, here is the code */ static int internal_dfa_exec( dfa_match_data *md, const uschar *this_start_code, const uschar *current_subject, int start_offset, int *offsets, int offsetcount, int *workspace, int wscount, int ims, int rlevel, int recursing) { stateblock *active_states, *new_states, *temp_states; stateblock *next_active_state, *next_new_state; const uschar *ctypes, *lcc, *fcc; const uschar *ptr; const uschar *end_code, *first_op; int active_count, new_count, match_count; /* Some fields in the md block are frequently referenced, so we load them into independent variables in the hope that this will perform better. */ const uschar *start_subject = md->start_subject; const uschar *end_subject = md->end_subject; const uschar *start_code = md->start_code; #ifdef SUPPORT_UTF8 BOOL utf8 = (md->poptions & PCRE_UTF8) != 0; #else BOOL utf8 = FALSE; #endif rlevel++; offsetcount &= (-2); wscount -= 2; wscount = (wscount - (wscount % (INTS_PER_STATEBLOCK * 2))) / (2 * INTS_PER_STATEBLOCK); DPRINTF(("\n%.*s---------------------\n" "%.*sCall to internal_dfa_exec f=%d r=%d\n", rlevel*2-2, SP, rlevel*2-2, SP, rlevel, recursing)); ctypes = md->tables + ctypes_offset; lcc = md->tables + lcc_offset; fcc = md->tables + fcc_offset; match_count = PCRE_ERROR_NOMATCH; /* A negative number */ active_states = (stateblock *)(workspace + 2); next_new_state = new_states = active_states + wscount; new_count = 0; first_op = this_start_code + 1 + LINK_SIZE + ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0); /* The first thing in any (sub) pattern is a bracket of some sort. Push all the alternative states onto the list, and find out where the end is. This makes is possible to use this function recursively, when we want to stop at a matching internal ket rather than at the end. If the first opcode in the first alternative is OP_REVERSE, we are dealing with a backward assertion. In that case, we have to find out the maximum amount to move back, and set up each alternative appropriately. */ if (*first_op == OP_REVERSE) { int max_back = 0; int gone_back; end_code = this_start_code; do { int back = GET(end_code, 2+LINK_SIZE); if (back > max_back) max_back = back; end_code += GET(end_code, 1); } while (*end_code == OP_ALT); /* If we can't go back the amount required for the longest lookbehind pattern, go back as far as we can; some alternatives may still be viable. */ #ifdef SUPPORT_UTF8 /* In character mode we have to step back character by character */ if (utf8) { for (gone_back = 0; gone_back < max_back; gone_back++) { if (current_subject <= start_subject) break; current_subject--; while (current_subject > start_subject && (*current_subject & 0xc0) == 0x80) current_subject--; } } else #endif /* In byte-mode we can do this quickly. */ { gone_back = (current_subject - max_back < start_subject)? current_subject - start_subject : max_back; current_subject -= gone_back; } /* Now we can process the individual branches. */ end_code = this_start_code; do { int back = GET(end_code, 2+LINK_SIZE); if (back <= gone_back) { int bstate = end_code - start_code + 2 + 2*LINK_SIZE; ADD_NEW_DATA(-bstate, 0, gone_back - back); } end_code += GET(end_code, 1); } while (*end_code == OP_ALT); } /* This is the code for a "normal" subpattern (not a backward assertion). The start of a whole pattern is always one of these. If we are at the top level, we may be asked to restart matching from the same point that we reached for a previous partial match. We still have to scan through the top-level branches to find the end state. */ else { end_code = this_start_code; /* Restarting */ if (rlevel == 1 && (md->moptions & PCRE_DFA_RESTART) != 0) { do { end_code += GET(end_code, 1); } while (*end_code == OP_ALT); new_count = workspace[1]; if (!workspace[0]) memcpy(new_states, active_states, new_count * sizeof(stateblock)); } /* Not restarting */ else { int length = 1 + LINK_SIZE + ((*this_start_code == OP_CBRA || *this_start_code == OP_SCBRA)? 2:0); do { ADD_NEW(end_code - start_code + length, 0); end_code += GET(end_code, 1); length = 1 + LINK_SIZE; } while (*end_code == OP_ALT); } } workspace[0] = 0; /* Bit indicating which vector is current */ DPRINTF(("%.*sEnd state = %d\n", rlevel*2-2, SP, end_code - start_code)); /* Loop for scanning the subject */ ptr = current_subject; for (;;) { int i, j; int clen, dlen; unsigned int c, d; /* Make the new state list into the active state list and empty the new state list. */ temp_states = active_states; active_states = new_states; new_states = temp_states; active_count = new_count; new_count = 0; workspace[0] ^= 1; /* Remember for the restarting feature */ workspace[1] = active_count; #ifdef DEBUG printf("%.*sNext character: rest of subject = \"", rlevel*2-2, SP); pchars((uschar *)ptr, strlen((char *)ptr), stdout); printf("\"\n"); printf("%.*sActive states: ", rlevel*2-2, SP); for (i = 0; i < active_count; i++) printf("%d/%d ", active_states[i].offset, active_states[i].count); printf("\n"); #endif /* Set the pointers for adding new states */ next_active_state = active_states + active_count; next_new_state = new_states; /* Load the current character from the subject outside the loop, as many different states may want to look at it, and we assume that at least one will. */ if (ptr < end_subject) { clen = 1; /* Number of bytes in the character */ #ifdef SUPPORT_UTF8 if (utf8) { GETCHARLEN(c, ptr, clen); } else #endif /* SUPPORT_UTF8 */ c = *ptr; } else { clen = 0; /* This indicates the end of the subject */ c = NOTACHAR; /* This value should never actually be used */ } /* Scan up the active states and act on each one. The result of an action may be to add more states to the currently active list (e.g. on hitting a parenthesis) or it may be to put states on the new list, for considering when we move the character pointer on. */ for (i = 0; i < active_count; i++) { stateblock *current_state = active_states + i; const uschar *code; int state_offset = current_state->offset; int count, codevalue; #ifdef SUPPORT_UCP int chartype, script; #endif #ifdef DEBUG printf ("%.*sProcessing state %d c=", rlevel*2-2, SP, state_offset); if (clen == 0) printf("EOL\n"); else if (c > 32 && c < 127) printf("'%c'\n", c); else printf("0x%02x\n", c); #endif /* This variable is referred to implicity in the ADD_xxx macros. */ ims = current_state->ims; /* A negative offset is a special case meaning "hold off going to this (negated) state until the number of characters in the data field have been skipped". */ if (state_offset < 0) { if (current_state->data > 0) { DPRINTF(("%.*sSkipping this character\n", rlevel*2-2, SP)); ADD_NEW_DATA(state_offset, current_state->count, current_state->data - 1); continue; } else { current_state->offset = state_offset = -state_offset; } } /* Check for a duplicate state with the same count, and skip if found. */ for (j = 0; j < i; j++) { if (active_states[j].offset == state_offset && active_states[j].count == current_state->count) { DPRINTF(("%.*sDuplicate state: skipped\n", rlevel*2-2, SP)); goto NEXT_ACTIVE_STATE; } } /* The state offset is the offset to the opcode */ code = start_code + state_offset; codevalue = *code; /* If this opcode is followed by an inline character, load it. It is tempting to test for the presence of a subject character here, but that is wrong, because sometimes zero repetitions of the subject are permitted. We also use this mechanism for opcodes such as OP_TYPEPLUS that take an argument that is not a data character - but is always one byte long. We have to take special action to deal with \P, \p, \H, \h, \V, \v and \X in this case. To keep the other cases fast, convert these ones to new opcodes. */ if (coptable[codevalue] > 0) { dlen = 1; #ifdef SUPPORT_UTF8 if (utf8) { GETCHARLEN(d, (code + coptable[codevalue]), dlen); } else #endif /* SUPPORT_UTF8 */ d = code[coptable[codevalue]]; if (codevalue >= OP_TYPESTAR) { switch(d) { case OP_ANYBYTE: return PCRE_ERROR_DFA_UITEM; case OP_NOTPROP: case OP_PROP: codevalue += OP_PROP_EXTRA; break; case OP_ANYNL: codevalue += OP_ANYNL_EXTRA; break; case OP_EXTUNI: codevalue += OP_EXTUNI_EXTRA; break; case OP_NOT_HSPACE: case OP_HSPACE: codevalue += OP_HSPACE_EXTRA; break; case OP_NOT_VSPACE: case OP_VSPACE: codevalue += OP_VSPACE_EXTRA; break; default: break; } } } else { dlen = 0; /* Not strictly necessary, but compilers moan */ d = NOTACHAR; /* if these variables are not set. */ } /* Now process the individual opcodes */ switch (codevalue) { /* ========================================================================== */ /* Reached a closing bracket. If not at the end of the pattern, carry on with the next opcode. Otherwise, unless we have an empty string and PCRE_NOTEMPTY is set, save the match data, shifting up all previous matches so we always have the longest first. */ case OP_KET: case OP_KETRMIN: case OP_KETRMAX: if (code != end_code) { ADD_ACTIVE(state_offset + 1 + LINK_SIZE, 0); if (codevalue != OP_KET) { ADD_ACTIVE(state_offset - GET(code, 1), 0); } } else if (ptr > current_subject || (md->moptions & PCRE_NOTEMPTY) == 0) { if (match_count < 0) match_count = (offsetcount >= 2)? 1 : 0; else if (match_count > 0 && ++match_count * 2 >= offsetcount) match_count = 0; count = ((match_count == 0)? offsetcount : match_count * 2) - 2; if (count > 0) memmove(offsets + 2, offsets, count * sizeof(int)); if (offsetcount >= 2) { offsets[0] = current_subject - start_subject; offsets[1] = ptr - start_subject; DPRINTF(("%.*sSet matched string = \"%.*s\"\n", rlevel*2-2, SP, offsets[1] - offsets[0], current_subject)); } if ((md->moptions & PCRE_DFA_SHORTEST) != 0) { DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n" "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count, rlevel*2-2, SP)); return match_count; } } break; /* ========================================================================== */ /* These opcodes add to the current list of states without looking at the current character. */ /*-----------------------------------------------------------------*/ case OP_ALT: do { code += GET(code, 1); } while (*code == OP_ALT); ADD_ACTIVE(code - start_code, 0); break; /*-----------------------------------------------------------------*/ case OP_BRA: case OP_SBRA: do { ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); code += GET(code, 1); } while (*code == OP_ALT); break; /*-----------------------------------------------------------------*/ case OP_CBRA: case OP_SCBRA: ADD_ACTIVE(code - start_code + 3 + LINK_SIZE, 0); code += GET(code, 1); while (*code == OP_ALT) { ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); code += GET(code, 1); } break; /*-----------------------------------------------------------------*/ case OP_BRAZERO: case OP_BRAMINZERO: ADD_ACTIVE(state_offset + 1, 0); code += 1 + GET(code, 2); while (*code == OP_ALT) code += GET(code, 1); ADD_ACTIVE(code - start_code + 1 + LINK_SIZE, 0); break; /*-----------------------------------------------------------------*/ case OP_CIRC: if ((ptr == start_subject && (md->moptions & PCRE_NOTBOL) == 0) || ((ims & PCRE_MULTILINE) != 0 && ptr != end_subject && WAS_NEWLINE(ptr))) { ADD_ACTIVE(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_EOD: if (ptr >= end_subject) { ADD_ACTIVE(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_OPT: ims = code[1]; ADD_ACTIVE(state_offset + 2, 0); break; /*-----------------------------------------------------------------*/ case OP_SOD: if (ptr == start_subject) { ADD_ACTIVE(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_SOM: if (ptr == start_subject + start_offset) { ADD_ACTIVE(state_offset + 1, 0); } break; /* ========================================================================== */ /* These opcodes inspect the next subject character, and sometimes the previous one as well, but do not have an argument. The variable clen contains the length of the current character and is zero if we are at the end of the subject. */ /*-----------------------------------------------------------------*/ case OP_ANY: if (clen > 0 && ((ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr))) { ADD_NEW(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_EODN: if (clen == 0 || (IS_NEWLINE(ptr) && ptr == end_subject - md->nllen)) { ADD_ACTIVE(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_DOLL: if ((md->moptions & PCRE_NOTEOL) == 0) { if (clen == 0 || (IS_NEWLINE(ptr) && ((ims & PCRE_MULTILINE) != 0 || ptr == end_subject - md->nllen) )) { ADD_ACTIVE(state_offset + 1, 0); } } else if ((ims & PCRE_MULTILINE) != 0 && IS_NEWLINE(ptr)) { ADD_ACTIVE(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_DIGIT: case OP_WHITESPACE: case OP_WORDCHAR: if (clen > 0 && c < 256 && ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0) { ADD_NEW(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_NOT_DIGIT: case OP_NOT_WHITESPACE: case OP_NOT_WORDCHAR: if (clen > 0 && (c >= 256 || ((ctypes[c] & toptable1[codevalue]) ^ toptable2[codevalue]) != 0)) { ADD_NEW(state_offset + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_WORD_BOUNDARY: case OP_NOT_WORD_BOUNDARY: { int left_word, right_word; if (ptr > start_subject) { const uschar *temp = ptr - 1; #ifdef SUPPORT_UTF8 if (utf8) BACKCHAR(temp); #endif GETCHARTEST(d, temp); left_word = d < 256 && (ctypes[d] & ctype_word) != 0; } else left_word = 0; if (clen > 0) right_word = c < 256 && (ctypes[c] & ctype_word) != 0; else right_word = 0; if ((left_word == right_word) == (codevalue == OP_NOT_WORD_BOUNDARY)) { ADD_ACTIVE(state_offset + 1, 0); } } break; /*-----------------------------------------------------------------*/ /* Check the next character by Unicode property. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ #ifdef SUPPORT_UCP case OP_PROP: case OP_NOTPROP: if (clen > 0) { BOOL OK; int category = _pcre_ucp_findprop(c, &chartype, &script); switch(code[1]) { case PT_ANY: OK = TRUE; break; case PT_LAMP: OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; break; case PT_GC: OK = category == code[2]; break; case PT_PC: OK = chartype == code[2]; break; case PT_SC: OK = script == code[2]; break; /* Should never occur, but keep compilers from grumbling. */ default: OK = codevalue != OP_PROP; break; } if (OK == (codevalue == OP_PROP)) { ADD_NEW(state_offset + 3, 0); } } break; #endif /* ========================================================================== */ /* These opcodes likewise inspect the subject character, but have an argument that is not a data character. It is one of these opcodes: OP_ANY, OP_DIGIT, OP_NOT_DIGIT, OP_WHITESPACE, OP_NOT_SPACE, OP_WORDCHAR, OP_NOT_WORDCHAR. The value is loaded into d. */ case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } if (clen > 0) { if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || (c < 256 && (d != OP_ANY || (ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr) ) && ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) { if (count > 0 && codevalue == OP_TYPEPOSPLUS) { active_count--; /* Remove non-match possibility */ next_active_state--; } count++; ADD_NEW(state_offset, count); } } break; /*-----------------------------------------------------------------*/ case OP_TYPEQUERY: case OP_TYPEMINQUERY: case OP_TYPEPOSQUERY: ADD_ACTIVE(state_offset + 2, 0); if (clen > 0) { if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || (c < 256 && (d != OP_ANY || (ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr) ) && ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) { if (codevalue == OP_TYPEPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW(state_offset + 2, 0); } } break; /*-----------------------------------------------------------------*/ case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPOSSTAR: ADD_ACTIVE(state_offset + 2, 0); if (clen > 0) { if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || (c < 256 && (d != OP_ANY || (ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr) ) && ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) { if (codevalue == OP_TYPEPOSSTAR) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW(state_offset, 0); } } break; /*-----------------------------------------------------------------*/ case OP_TYPEEXACT: count = current_state->count; /* Number already matched */ if (clen > 0) { if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || (c < 256 && (d != OP_ANY || (ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr) ) && ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) { if (++count >= GET2(code, 1)) { ADD_NEW(state_offset + 4, 0); } else { ADD_NEW(state_offset, count); } } } break; /*-----------------------------------------------------------------*/ case OP_TYPEUPTO: case OP_TYPEMINUPTO: case OP_TYPEPOSUPTO: ADD_ACTIVE(state_offset + 4, 0); count = current_state->count; /* Number already matched */ if (clen > 0) { if ((c >= 256 && d != OP_DIGIT && d != OP_WHITESPACE && d != OP_WORDCHAR) || (c < 256 && (d != OP_ANY || (ims & PCRE_DOTALL) != 0 || !IS_NEWLINE(ptr) ) && ((ctypes[c] & toptable1[d]) ^ toptable2[d]) != 0)) { if (codevalue == OP_TYPEPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } if (++count >= GET2(code, 1)) { ADD_NEW(state_offset + 4, 0); } else { ADD_NEW(state_offset, count); } } } break; /* ========================================================================== */ /* These are virtual opcodes that are used when something like OP_TYPEPLUS has OP_PROP, OP_NOTPROP, OP_ANYNL, or OP_EXTUNI as its argument. It keeps the code above fast for the other cases. The argument is in the d variable. */ #ifdef SUPPORT_UCP case OP_PROP_EXTRA + OP_TYPEPLUS: case OP_PROP_EXTRA + OP_TYPEMINPLUS: case OP_PROP_EXTRA + OP_TYPEPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + 4, 0); } if (clen > 0) { BOOL OK; int category = _pcre_ucp_findprop(c, &chartype, &script); switch(code[2]) { case PT_ANY: OK = TRUE; break; case PT_LAMP: OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; break; case PT_GC: OK = category == code[3]; break; case PT_PC: OK = chartype == code[3]; break; case PT_SC: OK = script == code[3]; break; /* Should never occur, but keep compilers from grumbling. */ default: OK = codevalue != OP_PROP; break; } if (OK == (d == OP_PROP)) { if (count > 0 && codevalue == OP_PROP_EXTRA + OP_TYPEPOSPLUS) { active_count--; /* Remove non-match possibility */ next_active_state--; } count++; ADD_NEW(state_offset, count); } } break; /*-----------------------------------------------------------------*/ case OP_EXTUNI_EXTRA + OP_TYPEPLUS: case OP_EXTUNI_EXTRA + OP_TYPEMINPLUS: case OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M) { const uschar *nptr = ptr + clen; int ncount = 0; if (count > 0 && codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSPLUS) { active_count--; /* Remove non-match possibility */ next_active_state--; } while (nptr < end_subject) { int nd; int ndlen = 1; GETCHARLEN(nd, nptr, ndlen); if (_pcre_ucp_findprop(nd, &chartype, &script) != ucp_M) break; ncount++; nptr += ndlen; } count++; ADD_NEW_DATA(-state_offset, count, ncount); } break; #endif /*-----------------------------------------------------------------*/ case OP_ANYNL_EXTRA + OP_TYPEPLUS: case OP_ANYNL_EXTRA + OP_TYPEMINPLUS: case OP_ANYNL_EXTRA + OP_TYPEPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } if (clen > 0) { int ncount = 0; switch (c) { case 0x000d: if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1; /* Fall through */ case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: if (count > 0 && codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSPLUS) { active_count--; /* Remove non-match possibility */ next_active_state--; } count++; ADD_NEW_DATA(-state_offset, count, ncount); break; default: break; } } break; /*-----------------------------------------------------------------*/ case OP_VSPACE_EXTRA + OP_TYPEPLUS: case OP_VSPACE_EXTRA + OP_TYPEMINPLUS: case OP_VSPACE_EXTRA + OP_TYPEPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } if (clen > 0) { BOOL OK; switch (c) { case 0x000a: case 0x000b: case 0x000c: case 0x000d: case 0x0085: case 0x2028: case 0x2029: OK = TRUE; break; default: OK = FALSE; break; } if (OK == (d == OP_VSPACE)) { if (count > 0 && codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSPLUS) { active_count--; /* Remove non-match possibility */ next_active_state--; } count++; ADD_NEW_DATA(-state_offset, count, 0); } } break; /*-----------------------------------------------------------------*/ case OP_HSPACE_EXTRA + OP_TYPEPLUS: case OP_HSPACE_EXTRA + OP_TYPEMINPLUS: case OP_HSPACE_EXTRA + OP_TYPEPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + 2, 0); } if (clen > 0) { BOOL OK; switch (c) { case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ OK = TRUE; break; default: OK = FALSE; break; } if (OK == (d == OP_HSPACE)) { if (count > 0 && codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSPLUS) { active_count--; /* Remove non-match possibility */ next_active_state--; } count++; ADD_NEW_DATA(-state_offset, count, 0); } } break; /*-----------------------------------------------------------------*/ #ifdef SUPPORT_UCP case OP_PROP_EXTRA + OP_TYPEQUERY: case OP_PROP_EXTRA + OP_TYPEMINQUERY: case OP_PROP_EXTRA + OP_TYPEPOSQUERY: count = 4; goto QS1; case OP_PROP_EXTRA + OP_TYPESTAR: case OP_PROP_EXTRA + OP_TYPEMINSTAR: case OP_PROP_EXTRA + OP_TYPEPOSSTAR: count = 0; QS1: ADD_ACTIVE(state_offset + 4, 0); if (clen > 0) { BOOL OK; int category = _pcre_ucp_findprop(c, &chartype, &script); switch(code[2]) { case PT_ANY: OK = TRUE; break; case PT_LAMP: OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; break; case PT_GC: OK = category == code[3]; break; case PT_PC: OK = chartype == code[3]; break; case PT_SC: OK = script == code[3]; break; /* Should never occur, but keep compilers from grumbling. */ default: OK = codevalue != OP_PROP; break; } if (OK == (d == OP_PROP)) { if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSSTAR || codevalue == OP_PROP_EXTRA + OP_TYPEPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW(state_offset + count, 0); } } break; /*-----------------------------------------------------------------*/ case OP_EXTUNI_EXTRA + OP_TYPEQUERY: case OP_EXTUNI_EXTRA + OP_TYPEMINQUERY: case OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY: count = 2; goto QS2; case OP_EXTUNI_EXTRA + OP_TYPESTAR: case OP_EXTUNI_EXTRA + OP_TYPEMINSTAR: case OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR: count = 0; QS2: ADD_ACTIVE(state_offset + 2, 0); if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M) { const uschar *nptr = ptr + clen; int ncount = 0; if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSSTAR || codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } while (nptr < end_subject) { int nd; int ndlen = 1; GETCHARLEN(nd, nptr, ndlen); if (_pcre_ucp_findprop(nd, &chartype, &script) != ucp_M) break; ncount++; nptr += ndlen; } ADD_NEW_DATA(-(state_offset + count), 0, ncount); } break; #endif /*-----------------------------------------------------------------*/ case OP_ANYNL_EXTRA + OP_TYPEQUERY: case OP_ANYNL_EXTRA + OP_TYPEMINQUERY: case OP_ANYNL_EXTRA + OP_TYPEPOSQUERY: count = 2; goto QS3; case OP_ANYNL_EXTRA + OP_TYPESTAR: case OP_ANYNL_EXTRA + OP_TYPEMINSTAR: case OP_ANYNL_EXTRA + OP_TYPEPOSSTAR: count = 0; QS3: ADD_ACTIVE(state_offset + 2, 0); if (clen > 0) { int ncount = 0; switch (c) { case 0x000d: if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1; /* Fall through */ case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSSTAR || codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW_DATA(-(state_offset + count), 0, ncount); break; default: break; } } break; /*-----------------------------------------------------------------*/ case OP_VSPACE_EXTRA + OP_TYPEQUERY: case OP_VSPACE_EXTRA + OP_TYPEMINQUERY: case OP_VSPACE_EXTRA + OP_TYPEPOSQUERY: count = 2; goto QS4; case OP_VSPACE_EXTRA + OP_TYPESTAR: case OP_VSPACE_EXTRA + OP_TYPEMINSTAR: case OP_VSPACE_EXTRA + OP_TYPEPOSSTAR: count = 0; QS4: ADD_ACTIVE(state_offset + 2, 0); if (clen > 0) { BOOL OK; switch (c) { case 0x000a: case 0x000b: case 0x000c: case 0x000d: case 0x0085: case 0x2028: case 0x2029: OK = TRUE; break; default: OK = FALSE; break; } if (OK == (d == OP_VSPACE)) { if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSSTAR || codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW_DATA(-(state_offset + count), 0, 0); } } break; /*-----------------------------------------------------------------*/ case OP_HSPACE_EXTRA + OP_TYPEQUERY: case OP_HSPACE_EXTRA + OP_TYPEMINQUERY: case OP_HSPACE_EXTRA + OP_TYPEPOSQUERY: count = 2; goto QS5; case OP_HSPACE_EXTRA + OP_TYPESTAR: case OP_HSPACE_EXTRA + OP_TYPEMINSTAR: case OP_HSPACE_EXTRA + OP_TYPEPOSSTAR: count = 0; QS5: ADD_ACTIVE(state_offset + 2, 0); if (clen > 0) { BOOL OK; switch (c) { case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ OK = TRUE; break; default: OK = FALSE; break; } if (OK == (d == OP_HSPACE)) { if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSSTAR || codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW_DATA(-(state_offset + count), 0, 0); } } break; /*-----------------------------------------------------------------*/ #ifdef SUPPORT_UCP case OP_PROP_EXTRA + OP_TYPEEXACT: case OP_PROP_EXTRA + OP_TYPEUPTO: case OP_PROP_EXTRA + OP_TYPEMINUPTO: case OP_PROP_EXTRA + OP_TYPEPOSUPTO: if (codevalue != OP_PROP_EXTRA + OP_TYPEEXACT) { ADD_ACTIVE(state_offset + 6, 0); } count = current_state->count; /* Number already matched */ if (clen > 0) { BOOL OK; int category = _pcre_ucp_findprop(c, &chartype, &script); switch(code[4]) { case PT_ANY: OK = TRUE; break; case PT_LAMP: OK = chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt; break; case PT_GC: OK = category == code[5]; break; case PT_PC: OK = chartype == code[5]; break; case PT_SC: OK = script == code[5]; break; /* Should never occur, but keep compilers from grumbling. */ default: OK = codevalue != OP_PROP; break; } if (OK == (d == OP_PROP)) { if (codevalue == OP_PROP_EXTRA + OP_TYPEPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } if (++count >= GET2(code, 1)) { ADD_NEW(state_offset + 6, 0); } else { ADD_NEW(state_offset, count); } } } break; /*-----------------------------------------------------------------*/ case OP_EXTUNI_EXTRA + OP_TYPEEXACT: case OP_EXTUNI_EXTRA + OP_TYPEUPTO: case OP_EXTUNI_EXTRA + OP_TYPEMINUPTO: case OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO: if (codevalue != OP_EXTUNI_EXTRA + OP_TYPEEXACT) { ADD_ACTIVE(state_offset + 4, 0); } count = current_state->count; /* Number already matched */ if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M) { const uschar *nptr = ptr + clen; int ncount = 0; if (codevalue == OP_EXTUNI_EXTRA + OP_TYPEPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } while (nptr < end_subject) { int nd; int ndlen = 1; GETCHARLEN(nd, nptr, ndlen); if (_pcre_ucp_findprop(nd, &chartype, &script) != ucp_M) break; ncount++; nptr += ndlen; } if (++count >= GET2(code, 1)) { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); } else { ADD_NEW_DATA(-state_offset, count, ncount); } } break; #endif /*-----------------------------------------------------------------*/ case OP_ANYNL_EXTRA + OP_TYPEEXACT: case OP_ANYNL_EXTRA + OP_TYPEUPTO: case OP_ANYNL_EXTRA + OP_TYPEMINUPTO: case OP_ANYNL_EXTRA + OP_TYPEPOSUPTO: if (codevalue != OP_ANYNL_EXTRA + OP_TYPEEXACT) { ADD_ACTIVE(state_offset + 4, 0); } count = current_state->count; /* Number already matched */ if (clen > 0) { int ncount = 0; switch (c) { case 0x000d: if (ptr + 1 < end_subject && ptr[1] == 0x0a) ncount = 1; /* Fall through */ case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: if (codevalue == OP_ANYNL_EXTRA + OP_TYPEPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } if (++count >= GET2(code, 1)) { ADD_NEW_DATA(-(state_offset + 4), 0, ncount); } else { ADD_NEW_DATA(-state_offset, count, ncount); } break; default: break; } } break; /*-----------------------------------------------------------------*/ case OP_VSPACE_EXTRA + OP_TYPEEXACT: case OP_VSPACE_EXTRA + OP_TYPEUPTO: case OP_VSPACE_EXTRA + OP_TYPEMINUPTO: case OP_VSPACE_EXTRA + OP_TYPEPOSUPTO: if (codevalue != OP_VSPACE_EXTRA + OP_TYPEEXACT) { ADD_ACTIVE(state_offset + 4, 0); } count = current_state->count; /* Number already matched */ if (clen > 0) { BOOL OK; switch (c) { case 0x000a: case 0x000b: case 0x000c: case 0x000d: case 0x0085: case 0x2028: case 0x2029: OK = TRUE; break; default: OK = FALSE; } if (OK == (d == OP_VSPACE)) { if (codevalue == OP_VSPACE_EXTRA + OP_TYPEPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } if (++count >= GET2(code, 1)) { ADD_NEW_DATA(-(state_offset + 4), 0, 0); } else { ADD_NEW_DATA(-state_offset, count, 0); } } } break; /*-----------------------------------------------------------------*/ case OP_HSPACE_EXTRA + OP_TYPEEXACT: case OP_HSPACE_EXTRA + OP_TYPEUPTO: case OP_HSPACE_EXTRA + OP_TYPEMINUPTO: case OP_HSPACE_EXTRA + OP_TYPEPOSUPTO: if (codevalue != OP_HSPACE_EXTRA + OP_TYPEEXACT) { ADD_ACTIVE(state_offset + 4, 0); } count = current_state->count; /* Number already matched */ if (clen > 0) { BOOL OK; switch (c) { case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ OK = TRUE; break; default: OK = FALSE; break; } if (OK == (d == OP_HSPACE)) { if (codevalue == OP_HSPACE_EXTRA + OP_TYPEPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } if (++count >= GET2(code, 1)) { ADD_NEW_DATA(-(state_offset + 4), 0, 0); } else { ADD_NEW_DATA(-state_offset, count, 0); } } } break; /* ========================================================================== */ /* These opcodes are followed by a character that is usually compared to the current subject character; it is loaded into d. We still get here even if there is no subject character, because in some cases zero repetitions are permitted. */ /*-----------------------------------------------------------------*/ case OP_CHAR: if (clen > 0 && c == d) { ADD_NEW(state_offset + dlen + 1, 0); } break; /*-----------------------------------------------------------------*/ case OP_CHARNC: if (clen == 0) break; #ifdef SUPPORT_UTF8 if (utf8) { if (c == d) { ADD_NEW(state_offset + dlen + 1, 0); } else { unsigned int othercase; if (c < 128) othercase = fcc[c]; else /* If we have Unicode property support, we can use it to test the other case of the character. */ #ifdef SUPPORT_UCP othercase = _pcre_ucp_othercase(c); #else othercase = NOTACHAR; #endif if (d == othercase) { ADD_NEW(state_offset + dlen + 1, 0); } } } else #endif /* SUPPORT_UTF8 */ /* Non-UTF-8 mode */ { if (lcc[c] == lcc[d]) { ADD_NEW(state_offset + 2, 0); } } break; #ifdef SUPPORT_UCP /*-----------------------------------------------------------------*/ /* This is a tricky one because it can match more than one character. Find out how many characters to skip, and then set up a negative state to wait for them to pass before continuing. */ case OP_EXTUNI: if (clen > 0 && _pcre_ucp_findprop(c, &chartype, &script) != ucp_M) { const uschar *nptr = ptr + clen; int ncount = 0; while (nptr < end_subject) { int nclen = 1; GETCHARLEN(c, nptr, nclen); if (_pcre_ucp_findprop(c, &chartype, &script) != ucp_M) break; ncount++; nptr += nclen; } ADD_NEW_DATA(-(state_offset + 1), 0, ncount); } break; #endif /*-----------------------------------------------------------------*/ /* This is a tricky like EXTUNI because it too can match more than one character (when CR is followed by LF). In this case, set up a negative state to wait for one character to pass before continuing. */ case OP_ANYNL: if (clen > 0) switch(c) { case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: ADD_NEW(state_offset + 1, 0); break; case 0x000d: if (ptr + 1 < end_subject && ptr[1] == 0x0a) { ADD_NEW_DATA(-(state_offset + 1), 0, 1); } else { ADD_NEW(state_offset + 1, 0); } break; } break; /*-----------------------------------------------------------------*/ case OP_NOT_VSPACE: if (clen > 0) switch(c) { case 0x000a: case 0x000b: case 0x000c: case 0x000d: case 0x0085: case 0x2028: case 0x2029: break; default: ADD_NEW(state_offset + 1, 0); break; } break; /*-----------------------------------------------------------------*/ case OP_VSPACE: if (clen > 0) switch(c) { case 0x000a: case 0x000b: case 0x000c: case 0x000d: case 0x0085: case 0x2028: case 0x2029: ADD_NEW(state_offset + 1, 0); break; default: break; } break; /*-----------------------------------------------------------------*/ case OP_NOT_HSPACE: if (clen > 0) switch(c) { case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ break; default: ADD_NEW(state_offset + 1, 0); break; } break; /*-----------------------------------------------------------------*/ case OP_HSPACE: if (clen > 0) switch(c) { case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ ADD_NEW(state_offset + 1, 0); break; } break; /*-----------------------------------------------------------------*/ /* Match a negated single character. This is only used for one-byte characters, that is, we know that d < 256. The character we are checking (c) can be multibyte. */ case OP_NOT: if (clen > 0) { unsigned int otherd = ((ims & PCRE_CASELESS) != 0)? fcc[d] : d; if (c != d && c != otherd) { ADD_NEW(state_offset + dlen + 1, 0); } } break; /*-----------------------------------------------------------------*/ case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTPOSPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(state_offset + dlen + 1, 0); } if (clen > 0) { unsigned int otherd = NOTACHAR; if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (utf8 && d >= 128) { #ifdef SUPPORT_UCP otherd = _pcre_ucp_othercase(d); #endif /* SUPPORT_UCP */ } else #endif /* SUPPORT_UTF8 */ otherd = fcc[d]; } if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) { if (count > 0 && (codevalue == OP_POSPLUS || codevalue == OP_NOTPOSPLUS)) { active_count--; /* Remove non-match possibility */ next_active_state--; } count++; ADD_NEW(state_offset, count); } } break; /*-----------------------------------------------------------------*/ case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: case OP_NOTQUERY: case OP_NOTMINQUERY: case OP_NOTPOSQUERY: ADD_ACTIVE(state_offset + dlen + 1, 0); if (clen > 0) { unsigned int otherd = NOTACHAR; if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (utf8 && d >= 128) { #ifdef SUPPORT_UCP otherd = _pcre_ucp_othercase(d); #endif /* SUPPORT_UCP */ } else #endif /* SUPPORT_UTF8 */ otherd = fcc[d]; } if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) { if (codevalue == OP_POSQUERY || codevalue == OP_NOTPOSQUERY) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW(state_offset + dlen + 1, 0); } } break; /*-----------------------------------------------------------------*/ case OP_STAR: case OP_MINSTAR: case OP_POSSTAR: case OP_NOTSTAR: case OP_NOTMINSTAR: case OP_NOTPOSSTAR: ADD_ACTIVE(state_offset + dlen + 1, 0); if (clen > 0) { unsigned int otherd = NOTACHAR; if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (utf8 && d >= 128) { #ifdef SUPPORT_UCP otherd = _pcre_ucp_othercase(d); #endif /* SUPPORT_UCP */ } else #endif /* SUPPORT_UTF8 */ otherd = fcc[d]; } if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) { if (codevalue == OP_POSSTAR || codevalue == OP_NOTPOSSTAR) { active_count--; /* Remove non-match possibility */ next_active_state--; } ADD_NEW(state_offset, 0); } } break; /*-----------------------------------------------------------------*/ case OP_EXACT: case OP_NOTEXACT: count = current_state->count; /* Number already matched */ if (clen > 0) { unsigned int otherd = NOTACHAR; if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (utf8 && d >= 128) { #ifdef SUPPORT_UCP otherd = _pcre_ucp_othercase(d); #endif /* SUPPORT_UCP */ } else #endif /* SUPPORT_UTF8 */ otherd = fcc[d]; } if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) { if (++count >= GET2(code, 1)) { ADD_NEW(state_offset + dlen + 3, 0); } else { ADD_NEW(state_offset, count); } } } break; /*-----------------------------------------------------------------*/ case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: case OP_NOTUPTO: case OP_NOTMINUPTO: case OP_NOTPOSUPTO: ADD_ACTIVE(state_offset + dlen + 3, 0); count = current_state->count; /* Number already matched */ if (clen > 0) { unsigned int otherd = NOTACHAR; if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (utf8 && d >= 128) { #ifdef SUPPORT_UCP otherd = _pcre_ucp_othercase(d); #endif /* SUPPORT_UCP */ } else #endif /* SUPPORT_UTF8 */ otherd = fcc[d]; } if ((c == d || c == otherd) == (codevalue < OP_NOTSTAR)) { if (codevalue == OP_POSUPTO || codevalue == OP_NOTPOSUPTO) { active_count--; /* Remove non-match possibility */ next_active_state--; } if (++count >= GET2(code, 1)) { ADD_NEW(state_offset + dlen + 3, 0); } else { ADD_NEW(state_offset, count); } } } break; /* ========================================================================== */ /* These are the class-handling opcodes */ case OP_CLASS: case OP_NCLASS: case OP_XCLASS: { BOOL isinclass = FALSE; int next_state_offset; const uschar *ecode; /* For a simple class, there is always just a 32-byte table, and we can set isinclass from it. */ if (codevalue != OP_XCLASS) { ecode = code + 33; if (clen > 0) { isinclass = (c > 255)? (codevalue == OP_NCLASS) : ((code[1 + c/8] & (1 << (c&7))) != 0); } } /* An extended class may have a table or a list of single characters, ranges, or both, and it may be positive or negative. There's a function that sorts all this out. */ else { ecode = code + GET(code, 1); if (clen > 0) isinclass = _pcre_xclass(c, code + 1 + LINK_SIZE); } /* At this point, isinclass is set for all kinds of class, and ecode points to the byte after the end of the class. If there is a quantifier, this is where it will be. */ next_state_offset = ecode - start_code; switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: ADD_ACTIVE(next_state_offset + 1, 0); if (isinclass) { ADD_NEW(state_offset, 0); } break; case OP_CRPLUS: case OP_CRMINPLUS: count = current_state->count; /* Already matched */ if (count > 0) { ADD_ACTIVE(next_state_offset + 1, 0); } if (isinclass) { count++; ADD_NEW(state_offset, count); } break; case OP_CRQUERY: case OP_CRMINQUERY: ADD_ACTIVE(next_state_offset + 1, 0); if (isinclass) { ADD_NEW(next_state_offset + 1, 0); } break; case OP_CRRANGE: case OP_CRMINRANGE: count = current_state->count; /* Already matched */ if (count >= GET2(ecode, 1)) { ADD_ACTIVE(next_state_offset + 5, 0); } if (isinclass) { int max = GET2(ecode, 3); if (++count >= max && max != 0) /* Max 0 => no limit */ { ADD_NEW(next_state_offset + 5, 0); } else { ADD_NEW(state_offset, count); } } break; default: if (isinclass) { ADD_NEW(next_state_offset, 0); } break; } } break; /* ========================================================================== */ /* These are the opcodes for fancy brackets of various kinds. We have to use recursion in order to handle them. */ case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: { int rc; int local_offsets[2]; int local_workspace[1000]; const uschar *endasscode = code + GET(code, 1); while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1); rc = internal_dfa_exec( md, /* static match data */ code, /* this subexpression's code */ ptr, /* where we currently are */ ptr - start_subject, /* start offset */ local_offsets, /* offset vector */ sizeof(local_offsets)/sizeof(int), /* size of same */ local_workspace, /* workspace vector */ sizeof(local_workspace)/sizeof(int), /* size of same */ ims, /* the current ims flags */ rlevel, /* function recursion level */ recursing); /* pass on regex recursion */ if ((rc >= 0) == (codevalue == OP_ASSERT || codevalue == OP_ASSERTBACK)) { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); } } break; /*-----------------------------------------------------------------*/ case OP_COND: case OP_SCOND: { int local_offsets[1000]; int local_workspace[1000]; int condcode = code[LINK_SIZE+1]; /* Back reference conditions are not supported */ if (condcode == OP_CREF) return PCRE_ERROR_DFA_UCOND; /* The DEFINE condition is always false */ if (condcode == OP_DEF) { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); } /* The only supported version of OP_RREF is for the value RREF_ANY, which means "test if in any recursion". We can't test for specifically recursed groups. */ else if (condcode == OP_RREF) { int value = GET2(code, LINK_SIZE+2); if (value != RREF_ANY) return PCRE_ERROR_DFA_UCOND; if (recursing > 0) { ADD_ACTIVE(state_offset + LINK_SIZE + 4, 0); } else { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); } } /* Otherwise, the condition is an assertion */ else { int rc; const uschar *asscode = code + LINK_SIZE + 1; const uschar *endasscode = asscode + GET(asscode, 1); while (*endasscode == OP_ALT) endasscode += GET(endasscode, 1); rc = internal_dfa_exec( md, /* fixed match data */ asscode, /* this subexpression's code */ ptr, /* where we currently are */ ptr - start_subject, /* start offset */ local_offsets, /* offset vector */ sizeof(local_offsets)/sizeof(int), /* size of same */ local_workspace, /* workspace vector */ sizeof(local_workspace)/sizeof(int), /* size of same */ ims, /* the current ims flags */ rlevel, /* function recursion level */ recursing); /* pass on regex recursion */ if ((rc >= 0) == (condcode == OP_ASSERT || condcode == OP_ASSERTBACK)) { ADD_ACTIVE(endasscode + LINK_SIZE + 1 - start_code, 0); } else { ADD_ACTIVE(state_offset + GET(code, 1) + LINK_SIZE + 1, 0); } } } break; /*-----------------------------------------------------------------*/ case OP_RECURSE: { int local_offsets[1000]; int local_workspace[1000]; int rc; DPRINTF(("%.*sStarting regex recursion %d\n", rlevel*2-2, SP, recursing + 1)); rc = internal_dfa_exec( md, /* fixed match data */ start_code + GET(code, 1), /* this subexpression's code */ ptr, /* where we currently are */ ptr - start_subject, /* start offset */ local_offsets, /* offset vector */ sizeof(local_offsets)/sizeof(int), /* size of same */ local_workspace, /* workspace vector */ sizeof(local_workspace)/sizeof(int), /* size of same */ ims, /* the current ims flags */ rlevel, /* function recursion level */ recursing + 1); /* regex recurse level */ DPRINTF(("%.*sReturn from regex recursion %d: rc=%d\n", rlevel*2-2, SP, recursing + 1, rc)); /* Ran out of internal offsets */ if (rc == 0) return PCRE_ERROR_DFA_RECURSE; /* For each successful matched substring, set up the next state with a count of characters to skip before trying it. Note that the count is in characters, not bytes. */ if (rc > 0) { for (rc = rc*2 - 2; rc >= 0; rc -= 2) { const uschar *p = start_subject + local_offsets[rc]; const uschar *pp = start_subject + local_offsets[rc+1]; int charcount = local_offsets[rc+1] - local_offsets[rc]; while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--; if (charcount > 0) { ADD_NEW_DATA(-(state_offset + LINK_SIZE + 1), 0, (charcount - 1)); } else { ADD_ACTIVE(state_offset + LINK_SIZE + 1, 0); } } } else if (rc != PCRE_ERROR_NOMATCH) return rc; } break; /*-----------------------------------------------------------------*/ case OP_ONCE: { int local_offsets[2]; int local_workspace[1000]; int rc = internal_dfa_exec( md, /* fixed match data */ code, /* this subexpression's code */ ptr, /* where we currently are */ ptr - start_subject, /* start offset */ local_offsets, /* offset vector */ sizeof(local_offsets)/sizeof(int), /* size of same */ local_workspace, /* workspace vector */ sizeof(local_workspace)/sizeof(int), /* size of same */ ims, /* the current ims flags */ rlevel, /* function recursion level */ recursing); /* pass on regex recursion */ if (rc >= 0) { const uschar *end_subpattern = code; int charcount = local_offsets[1] - local_offsets[0]; int next_state_offset, repeat_state_offset; do { end_subpattern += GET(end_subpattern, 1); } while (*end_subpattern == OP_ALT); next_state_offset = end_subpattern - start_code + LINK_SIZE + 1; /* If the end of this subpattern is KETRMAX or KETRMIN, we must arrange for the repeat state also to be added to the relevant list. Calculate the offset, or set -1 for no repeat. */ repeat_state_offset = (*end_subpattern == OP_KETRMAX || *end_subpattern == OP_KETRMIN)? end_subpattern - start_code - GET(end_subpattern, 1) : -1; /* If we have matched an empty string, add the next state at the current character pointer. This is important so that the duplicate checking kicks in, which is what breaks infinite loops that match an empty string. */ if (charcount == 0) { ADD_ACTIVE(next_state_offset, 0); } /* Optimization: if there are no more active states, and there are no new states yet set up, then skip over the subject string right here, to save looping. Otherwise, set up the new state to swing into action when the end of the substring is reached. */ else if (i + 1 >= active_count && new_count == 0) { ptr += charcount; clen = 0; ADD_NEW(next_state_offset, 0); /* If we are adding a repeat state at the new character position, we must fudge things so that it is the only current state. Otherwise, it might be a duplicate of one we processed before, and that would cause it to be skipped. */ if (repeat_state_offset >= 0) { next_active_state = active_states; active_count = 0; i = -1; ADD_ACTIVE(repeat_state_offset, 0); } } else { const uschar *p = start_subject + local_offsets[0]; const uschar *pp = start_subject + local_offsets[1]; while (p < pp) if ((*p++ & 0xc0) == 0x80) charcount--; ADD_NEW_DATA(-next_state_offset, 0, (charcount - 1)); if (repeat_state_offset >= 0) { ADD_NEW_DATA(-repeat_state_offset, 0, (charcount - 1)); } } } else if (rc != PCRE_ERROR_NOMATCH) return rc; } break; /* ========================================================================== */ /* Handle callouts */ case OP_CALLOUT: if (pcre_callout != NULL) { int rrc; pcre_callout_block cb; cb.version = 1; /* Version 1 of the callout block */ cb.callout_number = code[1]; cb.offset_vector = offsets; cb.subject = (PCRE_SPTR)start_subject; cb.subject_length = end_subject - start_subject; cb.start_match = current_subject - start_subject; cb.current_position = ptr - start_subject; cb.pattern_position = GET(code, 2); cb.next_item_length = GET(code, 2 + LINK_SIZE); cb.capture_top = 1; cb.capture_last = -1; cb.callout_data = md->callout_data; if ((rrc = (*pcre_callout)(&cb)) < 0) return rrc; /* Abandon */ if (rrc == 0) { ADD_ACTIVE(state_offset + 2 + 2*LINK_SIZE, 0); } } break; /* ========================================================================== */ default: /* Unsupported opcode */ return PCRE_ERROR_DFA_UITEM; } NEXT_ACTIVE_STATE: continue; } /* End of loop scanning active states */ /* We have finished the processing at the current subject character. If no new states have been set for the next character, we have found all the matches that we are going to find. If we are at the top level and partial matching has been requested, check for appropriate conditions. */ if (new_count <= 0) { if (match_count < 0 && /* No matches found */ rlevel == 1 && /* Top level match function */ (md->moptions & PCRE_PARTIAL) != 0 && /* Want partial matching */ ptr >= end_subject && /* Reached end of subject */ ptr > current_subject) /* Matched non-empty string */ { if (offsetcount >= 2) { offsets[0] = current_subject - start_subject; offsets[1] = end_subject - start_subject; } match_count = PCRE_ERROR_PARTIAL; } DPRINTF(("%.*sEnd of internal_dfa_exec %d: returning %d\n" "%.*s---------------------\n\n", rlevel*2-2, SP, rlevel, match_count, rlevel*2-2, SP)); break; /* In effect, "return", but see the comment below */ } /* One or more states are active for the next character. */ ptr += clen; /* Advance to next subject character */ } /* Loop to move along the subject string */ /* Control gets here from "break" a few lines above. We do it this way because if we use "return" above, we have compiler trouble. Some compilers warn if there's nothing here because they think the function doesn't return a value. On the other hand, if we put a dummy statement here, some more clever compilers complain that it can't be reached. Sigh. */ return match_count; } /************************************************* * Execute a Regular Expression - DFA engine * *************************************************/ /* This external function applies a compiled re to a subject string using a DFA engine. This function calls the internal function multiple times if the pattern is not anchored. Arguments: argument_re points to the compiled expression extra_data points to extra data or is NULL subject points to the subject string length length of subject string (may contain binary zeros) start_offset where to start in the subject string options option bits offsets vector of match offsets offsetcount size of same workspace workspace vector wscount size of same Returns: > 0 => number of match offset pairs placed in offsets = 0 => offsets overflowed; longest matches are present -1 => failed to match < -1 => some kind of unexpected problem */ PCRE_EXP_DEFN int pcre_dfa_exec(const pcre *argument_re, const pcre_extra *extra_data, const char *subject, int length, int start_offset, int options, int *offsets, int offsetcount, int *workspace, int wscount) { real_pcre *re = (real_pcre *)argument_re; dfa_match_data match_block; dfa_match_data *md = &match_block; BOOL utf8, anchored, startline, firstline; const uschar *current_subject, *end_subject, *lcc; pcre_study_data internal_study; const pcre_study_data *study = NULL; real_pcre internal_re; const uschar *req_byte_ptr; const uschar *start_bits = NULL; BOOL first_byte_caseless = FALSE; BOOL req_byte_caseless = FALSE; int first_byte = -1; int req_byte = -1; int req_byte2 = -1; int newline; /* Plausibility checks */ if ((options & ~PUBLIC_DFA_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; if (re == NULL || subject == NULL || workspace == NULL || (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; if (wscount < 20) return PCRE_ERROR_DFA_WSSIZE; /* We need to find the pointer to any study data before we test for byte flipping, so we scan the extra_data block first. This may set two fields in the match block, so we must initialize them beforehand. However, the other fields in the match block must not be set until after the byte flipping. */ md->tables = re->tables; md->callout_data = NULL; if (extra_data != NULL) { unsigned int flags = extra_data->flags; if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) study = (const pcre_study_data *)extra_data->study_data; if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) return PCRE_ERROR_DFA_UMLIMIT; if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0) return PCRE_ERROR_DFA_UMLIMIT; if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) md->callout_data = extra_data->callout_data; if ((flags & PCRE_EXTRA_TABLES) != 0) md->tables = extra_data->tables; } /* Check that the first field in the block is the magic number. If it is not, test for a regex that was compiled on a host of opposite endianness. If this is the case, flipped values are put in internal_re and internal_study if there was study data too. */ if (re->magic_number != MAGIC_NUMBER) { re = _pcre_try_flipped(re, &internal_re, study, &internal_study); if (re == NULL) return PCRE_ERROR_BADMAGIC; if (study != NULL) study = &internal_study; } /* Set some local values */ current_subject = (const unsigned char *)subject + start_offset; end_subject = (const unsigned char *)subject + length; req_byte_ptr = current_subject - 1; #ifdef SUPPORT_UTF8 utf8 = (re->options & PCRE_UTF8) != 0; #else utf8 = FALSE; #endif anchored = (options & (PCRE_ANCHORED|PCRE_DFA_RESTART)) != 0 || (re->options & PCRE_ANCHORED) != 0; /* The remaining fixed data for passing around. */ md->start_code = (const uschar *)argument_re + re->name_table_offset + re->name_count * re->name_entry_size; md->start_subject = (const unsigned char *)subject; md->end_subject = end_subject; md->moptions = options; md->poptions = re->options; /* Handle different types of newline. The three bits give eight cases. If nothing is set at run time, whatever was used at compile time applies. */ switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) & PCRE_NEWLINE_BITS) { case 0: newline = NEWLINE; break; /* Compile-time default */ case PCRE_NEWLINE_CR: newline = '\r'; break; case PCRE_NEWLINE_LF: newline = '\n'; break; case PCRE_NEWLINE_CR+ PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break; case PCRE_NEWLINE_ANY: newline = -1; break; case PCRE_NEWLINE_ANYCRLF: newline = -2; break; default: return PCRE_ERROR_BADNEWLINE; } if (newline == -2) { md->nltype = NLTYPE_ANYCRLF; } else if (newline < 0) { md->nltype = NLTYPE_ANY; } else { md->nltype = NLTYPE_FIXED; if (newline > 255) { md->nllen = 2; md->nl[0] = (newline >> 8) & 255; md->nl[1] = newline & 255; } else { md->nllen = 1; md->nl[0] = newline; } } /* Check a UTF-8 string if required. Unfortunately there's no way of passing back the character offset. */ #ifdef SUPPORT_UTF8 if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0) { if (_pcre_valid_utf8((uschar *)subject, length) >= 0) return PCRE_ERROR_BADUTF8; if (start_offset > 0 && start_offset < length) { int tb = ((uschar *)subject)[start_offset]; if (tb > 127) { tb &= 0xc0; if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET; } } } #endif /* If the exec call supplied NULL for tables, use the inbuilt ones. This is a feature that makes it possible to save compiled regex and re-use them in other programs later. */ if (md->tables == NULL) md->tables = _pcre_default_tables; /* The lower casing table and the "must be at the start of a line" flag are used in a loop when finding where to start. */ lcc = md->tables + lcc_offset; startline = (re->options & PCRE_STARTLINE) != 0; firstline = (re->options & PCRE_FIRSTLINE) != 0; /* Set up the first character to match, if available. The first_byte value is never set for an anchored regular expression, but the anchoring may be forced at run time, so we have to test for anchoring. The first char may be unset for an unanchored pattern, of course. If there's no first char and the pattern was studied, there may be a bitmap of possible first characters. */ if (!anchored) { if ((re->options & PCRE_FIRSTSET) != 0) { first_byte = re->first_byte & 255; if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE) first_byte = lcc[first_byte]; } else { if (startline && study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0) start_bits = study->start_bits; } } /* For anchored or unanchored matches, there may be a "last known required character" set. */ if ((re->options & PCRE_REQCHSET) != 0) { req_byte = re->req_byte & 255; req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0; req_byte2 = (md->tables + fcc_offset)[req_byte]; /* case flipped */ } /* Call the main matching function, looping for a non-anchored regex after a failed match. Unless restarting, optimize by moving to the first match character if possible, when not anchored. Then unless wanting a partial match, check for a required later character. */ for (;;) { int rc; if ((options & PCRE_DFA_RESTART) == 0) { const uschar *save_end_subject = end_subject; /* Advance to a unique first char if possible. If firstline is TRUE, the start of the match is constrained to the first line of a multiline string. Implement this by temporarily adjusting end_subject so that we stop scanning at a newline. If the match fails at the newline, later code breaks this loop. */ if (firstline) { const uschar *t = current_subject; while (t < md->end_subject && !IS_NEWLINE(t)) t++; end_subject = t; } if (first_byte >= 0) { if (first_byte_caseless) while (current_subject < end_subject && lcc[*current_subject] != first_byte) current_subject++; else while (current_subject < end_subject && *current_subject != first_byte) current_subject++; } /* Or to just after a linebreak for a multiline match if possible */ else if (startline) { if (current_subject > md->start_subject + start_offset) { while (current_subject <= end_subject && !WAS_NEWLINE(current_subject)) current_subject++; /* If we have just passed a CR and the newline option is ANY or ANYCRLF, and we are now at a LF, advance the match position by one more character. */ if (current_subject[-1] == '\r' && (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && current_subject < end_subject && *current_subject == '\n') current_subject++; } } /* Or to a non-unique first char after study */ else if (start_bits != NULL) { while (current_subject < end_subject) { register unsigned int c = *current_subject; if ((start_bits[c/8] & (1 << (c&7))) == 0) current_subject++; else break; } } /* Restore fudged end_subject */ end_subject = save_end_subject; } /* If req_byte is set, we know that that character must appear in the subject for the match to succeed. If the first character is set, req_byte must be later in the subject; otherwise the test starts at the match point. This optimization can save a huge amount of work in patterns with nested unlimited repeats that aren't going to match. Writing separate code for cased/caseless versions makes it go faster, as does using an autoincrement and backing off on a match. HOWEVER: when the subject string is very, very long, searching to its end can take a long time, and give bad performance on quite ordinary patterns. This showed up when somebody was matching /^C/ on a 32-megabyte string... so we don't do this when the string is sufficiently long. ALSO: this processing is disabled when partial matching is requested. */ if (req_byte >= 0 && end_subject - current_subject < REQ_BYTE_MAX && (options & PCRE_PARTIAL) == 0) { register const uschar *p = current_subject + ((first_byte >= 0)? 1 : 0); /* We don't need to repeat the search if we haven't yet reached the place we found it at last time. */ if (p > req_byte_ptr) { if (req_byte_caseless) { while (p < end_subject) { register int pp = *p++; if (pp == req_byte || pp == req_byte2) { p--; break; } } } else { while (p < end_subject) { if (*p++ == req_byte) { p--; break; } } } /* If we can't find the required character, break the matching loop, which will cause a return or PCRE_ERROR_NOMATCH. */ if (p >= end_subject) break; /* If we have found the required character, save the point where we found it, so that we don't search again next time round the loop if the start hasn't passed this character yet. */ req_byte_ptr = p; } } /* OK, now we can do the business */ rc = internal_dfa_exec( md, /* fixed match data */ md->start_code, /* this subexpression's code */ current_subject, /* where we currently are */ start_offset, /* start offset in subject */ offsets, /* offset vector */ offsetcount, /* size of same */ workspace, /* workspace vector */ wscount, /* size of same */ re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL), /* ims flags */ 0, /* function recurse level */ 0); /* regex recurse level */ /* Anything other than "no match" means we are done, always; otherwise, carry on only if not anchored. */ if (rc != PCRE_ERROR_NOMATCH || anchored) return rc; /* Advance to the next subject character unless we are at the end of a line and firstline is set. */ if (firstline && IS_NEWLINE(current_subject)) break; current_subject++; if (utf8) { while (current_subject < end_subject && (*current_subject & 0xc0) == 0x80) current_subject++; } if (current_subject > end_subject) break; /* If we have just passed a CR and we are now at a LF, and the pattern does not contain any explicit matches for \r or \n, and the newline option is CRLF or ANY or ANYCRLF, advance the match position by one more character. */ if (current_subject[-1] == '\r' && current_subject < end_subject && *current_subject == '\n' && (re->options & PCRE_HASCRORLF) == 0 && (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF || md->nllen == 2)) current_subject++; } /* "Bumpalong" loop */ return PCRE_ERROR_NOMATCH; } /* End of pcre_dfa_exec.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_exec.c0000644000373300037200000044322412424517753024360 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains pcre_exec(), the externally visible function that does pattern matching using an NFA algorithm, trying to mimic Perl as closely as possible. There are also some static supporting functions. */ #include "pcre_setup.h" #define NLBLOCK md /* Block containing newline information */ #define PSSTART start_subject /* Field containing processed string start */ #define PSEND end_subject /* Field containing processed string end */ #include "pcre_internal.h" /* Undefine some potentially clashing cpp symbols */ #undef min #undef max /* Flag bits for the match() function */ #define match_condassert 0x01 /* Called to check a condition assertion */ #define match_cbegroup 0x02 /* Could-be-empty unlimited repeat group */ /* Non-error returns from the match() function. Error returns are externally defined PCRE_ERROR_xxx codes, which are all negative. */ #define MATCH_MATCH 1 #define MATCH_NOMATCH 0 /* Special internal returns from the match() function. Make them sufficiently negative to avoid the external error codes. */ #define MATCH_COMMIT (-999) #define MATCH_PRUNE (-998) #define MATCH_SKIP (-997) #define MATCH_THEN (-996) /* Maximum number of ints of offset to save on the stack for recursive calls. If the offset vector is bigger, malloc is used. This should be a multiple of 3, because the offset vector is always a multiple of 3 long. */ #define REC_STACK_SAVE_MAX 30 /* Min and max values for the common repeats; for the maxima, 0 => infinity */ static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; #ifdef DEBUG /************************************************* * Debugging function to print chars * *************************************************/ /* Print a sequence of chars in printable format, stopping at the end of the subject if the requested. Arguments: p points to characters length number to print is_subject TRUE if printing from within md->start_subject md pointer to matching data block, if is_subject is TRUE Returns: nothing */ static void pchars(const uschar *p, int length, BOOL is_subject, match_data *md) { unsigned int c; if (is_subject && length > md->end_subject - p) length = md->end_subject - p; while (length-- > 0) if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c); } #endif /************************************************* * Match a back-reference * *************************************************/ /* If a back reference hasn't been set, the length that is passed is greater than the number of characters left in the string, so the match fails. Arguments: offset index into the offset vector eptr points into the subject length length to be matched md points to match data block ims the ims flags Returns: TRUE if matched */ static BOOL match_ref(int offset, register USPTR eptr, int length, match_data *md, unsigned long int ims) { USPTR p = md->start_subject + md->offset_vector[offset]; #ifdef DEBUG if (eptr >= md->end_subject) printf("matching subject "); else { printf("matching subject "); pchars(eptr, length, TRUE, md); } printf(" against backref "); pchars(p, length, FALSE, md); printf("\n"); #endif /* Always fail if not enough characters left */ if (length > md->end_subject - eptr) return FALSE; /* Separate the caselesss case for speed */ if ((ims & PCRE_CASELESS) != 0) { while (length-- > 0) if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; } else { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } return TRUE; } /*************************************************************************** **************************************************************************** RECURSION IN THE match() FUNCTION The match() function is highly recursive, though not every recursive call increases the recursive depth. Nevertheless, some regular expressions can cause it to recurse to a great depth. I was writing for Unix, so I just let it call itself recursively. This uses the stack for saving everything that has to be saved for a recursive call. On Unix, the stack can be large, and this works fine. It turns out that on some non-Unix-like systems there are problems with programs that use a lot of stack. (This despite the fact that every last chip has oodles of memory these days, and techniques for extending the stack have been known for decades.) So.... There is a fudge, triggered by defining NO_RECURSE, which avoids recursive calls by keeping local variables that need to be preserved in blocks of memory obtained from malloc() instead instead of on the stack. Macros are used to achieve this so that the actual code doesn't look very different to what it always used to. The original heap-recursive code used longjmp(). However, it seems that this can be very slow on some operating systems. Following a suggestion from Stan Switzer, the use of longjmp() has been abolished, at the cost of having to provide a unique number for each call to RMATCH. There is no way of generating a sequence of numbers at compile time in C. I have given them names, to make them stand out more clearly. Crude tests on x86 Linux show a small speedup of around 5-8%. However, on FreeBSD, avoiding longjmp() more than halves the time taken to run the standard tests. Furthermore, not using longjmp() means that local dynamic variables don't have indeterminate values; this has meant that the frame size can be reduced because the result can be "passed back" by straight setting of the variable instead of being passed in the frame. **************************************************************************** ***************************************************************************/ /* Numbers for RMATCH calls. When this list is changed, the code at HEAP_RETURN below must be updated in sync. */ enum { RM1=1, RM2, RM3, RM4, RM5, RM6, RM7, RM8, RM9, RM10, RM11, RM12, RM13, RM14, RM15, RM16, RM17, RM18, RM19, RM20, RM21, RM22, RM23, RM24, RM25, RM26, RM27, RM28, RM29, RM30, RM31, RM32, RM33, RM34, RM35, RM36, RM37, RM38, RM39, RM40, RM41, RM42, RM43, RM44, RM45, RM46, RM47, RM48, RM49, RM50, RM51, RM52, RM53, RM54 }; /* These versions of the macros use the stack, as normal. There are debugging versions and production versions. Note that the "rw" argument of RMATCH isn't actuall used in this definition. */ #ifndef NO_RECURSE #define REGISTER register #ifdef DEBUG #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ { \ printf("match() called in line %d\n", __LINE__); \ rrc = match(ra,rb,mstart,rc,rd,re,rf,rg,rdepth+1); \ printf("to line %d\n", __LINE__); \ } #define RRETURN(ra) \ { \ printf("match() returned %d from line %d ", ra, __LINE__); \ return ra; \ } #else #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw) \ rrc = match(ra,rb,mstart,rc,rd,re,rf,rg,rdepth+1) #define RRETURN(ra) return ra #endif #else /* These versions of the macros manage a private stack on the heap. Note that the "rd" argument of RMATCH isn't actually used in this definition. It's the md argument of match(), which never changes. */ #define REGISTER #define RMATCH(ra,rb,rc,rd,re,rf,rg,rw)\ {\ heapframe *newframe = (pcre_stack_malloc)(sizeof(heapframe));\ frame->Xwhere = rw; \ newframe->Xeptr = ra;\ newframe->Xecode = rb;\ newframe->Xmstart = mstart;\ newframe->Xoffset_top = rc;\ newframe->Xims = re;\ newframe->Xeptrb = rf;\ newframe->Xflags = rg;\ newframe->Xrdepth = frame->Xrdepth + 1;\ newframe->Xprevframe = frame;\ frame = newframe;\ DPRINTF(("restarting from line %d\n", __LINE__));\ goto HEAP_RECURSE;\ L_##rw:\ DPRINTF(("jumped back to line %d\n", __LINE__));\ } #define RRETURN(ra)\ {\ heapframe *newframe = frame;\ frame = newframe->Xprevframe;\ (pcre_stack_free)(newframe);\ if (frame != NULL)\ {\ rrc = ra;\ goto HEAP_RETURN;\ }\ return ra;\ } /* Structure for remembering the local variables in a private frame */ typedef struct heapframe { struct heapframe *Xprevframe; /* Function arguments that may change */ const uschar *Xeptr; const uschar *Xecode; const uschar *Xmstart; int Xoffset_top; long int Xims; eptrblock *Xeptrb; int Xflags; unsigned int Xrdepth; /* Function local variables */ const uschar *Xcallpat; const uschar *Xcharptr; const uschar *Xdata; const uschar *Xnext; const uschar *Xpp; const uschar *Xprev; const uschar *Xsaved_eptr; recursion_info Xnew_recursive; BOOL Xcur_is_word; BOOL Xcondition; BOOL Xprev_is_word; unsigned long int Xoriginal_ims; #ifdef SUPPORT_UCP int Xprop_type; int Xprop_value; int Xprop_fail_result; int Xprop_category; int Xprop_chartype; int Xprop_script; int Xoclength; uschar Xocchars[8]; #endif int Xctype; unsigned int Xfc; int Xfi; int Xlength; int Xmax; int Xmin; int Xnumber; int Xoffset; int Xop; int Xsave_capture_last; int Xsave_offset1, Xsave_offset2, Xsave_offset3; int Xstacksave[REC_STACK_SAVE_MAX]; eptrblock Xnewptrb; /* Where to jump back to */ int Xwhere; } heapframe; #endif /*************************************************************************** ***************************************************************************/ /************************************************* * Match from current position * *************************************************/ /* This function is called recursively in many circumstances. Whenever it returns a negative (error) response, the outer incarnation must also return the same response. Performance note: It might be tempting to extract commonly used fields from the md structure (e.g. utf8, end_subject) into individual variables to improve performance. Tests using gcc on a SPARC disproved this; in the first case, it made performance worse. Arguments: eptr pointer to current character in subject ecode pointer to current position in compiled code mstart pointer to the current match start position (can be modified by encountering \K) offset_top current top pointer md pointer to "static" info for the match ims current /i, /m, and /s options eptrb pointer to chain of blocks containing eptr at start of brackets - for testing for empty matches flags can contain match_condassert - this is an assertion condition match_cbegroup - this is the start of an unlimited repeat group that can match an empty string rdepth the recursion depth Returns: MATCH_MATCH if matched ) these values are >= 0 MATCH_NOMATCH if failed to match ) a negative PCRE_ERROR_xxx value if aborted by an error condition (e.g. stopped by repeated call or recursion limit) */ static int match(REGISTER USPTR eptr, REGISTER const uschar *ecode, const uschar *mstart, int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, int flags, unsigned int rdepth) { /* These variables do not need to be preserved over recursion in this function, so they can be ordinary variables in all cases. Mark some of them with "register" because they are used a lot in loops. */ register int rrc; /* Returns from recursive calls */ register int i; /* Used for loops not involving calls to RMATCH() */ register unsigned int c; /* Character values not kept over RMATCH() calls */ register BOOL utf8; /* Local copy of UTF-8 flag for speed */ BOOL minimize, possessive; /* Quantifier options */ /* When recursion is not being used, all "local" variables that have to be preserved over calls to RMATCH() are part of a "frame" which is obtained from heap storage. Set up the top-level frame here; others are obtained from the heap whenever RMATCH() does a "recursion". See the macro definitions above. */ #ifdef NO_RECURSE heapframe *frame = (pcre_stack_malloc)(sizeof(heapframe)); frame->Xprevframe = NULL; /* Marks the top level */ /* Copy in the original argument variables */ frame->Xeptr = eptr; frame->Xecode = ecode; frame->Xmstart = mstart; frame->Xoffset_top = offset_top; frame->Xims = ims; frame->Xeptrb = eptrb; frame->Xflags = flags; frame->Xrdepth = rdepth; /* This is where control jumps back to to effect "recursion" */ HEAP_RECURSE: /* Macros make the argument variables come from the current frame */ #define eptr frame->Xeptr #define ecode frame->Xecode #define mstart frame->Xmstart #define offset_top frame->Xoffset_top #define ims frame->Xims #define eptrb frame->Xeptrb #define flags frame->Xflags #define rdepth frame->Xrdepth /* Ditto for the local variables */ #ifdef SUPPORT_UTF8 #define charptr frame->Xcharptr #endif #define callpat frame->Xcallpat #define data frame->Xdata #define next frame->Xnext #define pp frame->Xpp #define prev frame->Xprev #define saved_eptr frame->Xsaved_eptr #define new_recursive frame->Xnew_recursive #define cur_is_word frame->Xcur_is_word #define condition frame->Xcondition #define prev_is_word frame->Xprev_is_word #define original_ims frame->Xoriginal_ims #ifdef SUPPORT_UCP #define prop_type frame->Xprop_type #define prop_value frame->Xprop_value #define prop_fail_result frame->Xprop_fail_result #define prop_category frame->Xprop_category #define prop_chartype frame->Xprop_chartype #define prop_script frame->Xprop_script #define oclength frame->Xoclength #define occhars frame->Xocchars #endif #define ctype frame->Xctype #define fc frame->Xfc #define fi frame->Xfi #define length frame->Xlength #define max frame->Xmax #define min frame->Xmin #define number frame->Xnumber #define offset frame->Xoffset #define op frame->Xop #define save_capture_last frame->Xsave_capture_last #define save_offset1 frame->Xsave_offset1 #define save_offset2 frame->Xsave_offset2 #define save_offset3 frame->Xsave_offset3 #define stacksave frame->Xstacksave #define newptrb frame->Xnewptrb /* When recursion is being used, local variables are allocated on the stack and get preserved during recursion in the normal way. In this environment, fi and i, and fc and c, can be the same variables. */ #else /* NO_RECURSE not defined */ #define fi i #define fc c #ifdef SUPPORT_UTF8 /* Many of these variables are used only */ const uschar *charptr; /* in small blocks of the code. My normal */ #endif /* style of coding would have declared */ const uschar *callpat; /* them within each of those blocks. */ const uschar *data; /* However, in order to accommodate the */ const uschar *next; /* version of this code that uses an */ USPTR pp; /* external "stack" implemented on the */ const uschar *prev; /* heap, it is easier to declare them all */ USPTR saved_eptr; /* here, so the declarations can be cut */ /* out in a block. The only declarations */ recursion_info new_recursive; /* within blocks below are for variables */ /* that do not have to be preserved over */ BOOL cur_is_word; /* a recursive call to RMATCH(). */ BOOL condition; BOOL prev_is_word; unsigned long int original_ims; #ifdef SUPPORT_UCP int prop_type; int prop_value; int prop_fail_result; int prop_category; int prop_chartype; int prop_script; int oclength; uschar occhars[8]; #endif int ctype; int length; int max; int min; int number; int offset; int op; int save_capture_last; int save_offset1, save_offset2, save_offset3; int stacksave[REC_STACK_SAVE_MAX]; eptrblock newptrb; #endif /* NO_RECURSE */ /* These statements are here to stop the compiler complaining about unitialized variables. */ #ifdef SUPPORT_UCP prop_value = 0; prop_fail_result = 0; #endif /* This label is used for tail recursion, which is used in a few cases even when NO_RECURSE is not defined, in order to reduce the amount of stack that is used. Thanks to Ian Taylor for noticing this possibility and sending the original patch. */ TAIL_RECURSE: /* OK, now we can get on with the real code of the function. Recursive calls are specified by the macro RMATCH and RRETURN is used to return. When NO_RECURSE is *not* defined, these just turn into a recursive call to match() and a "return", respectively (possibly with some debugging if DEBUG is defined). However, RMATCH isn't like a function call because it's quite a complicated macro. It has to be used in one particular way. This shouldn't, however, impact performance when true recursion is being used. */ #ifdef SUPPORT_UTF8 utf8 = md->utf8; /* Local copy of the flag */ #else utf8 = FALSE; #endif /* First check that we haven't called match() too many times, or that we haven't exceeded the recursive call limit. */ if (md->match_call_count++ >= md->match_limit) RRETURN(PCRE_ERROR_MATCHLIMIT); if (rdepth >= md->match_limit_recursion) RRETURN(PCRE_ERROR_RECURSIONLIMIT); original_ims = ims; /* Save for resetting on ')' */ /* At the start of a group with an unlimited repeat that may match an empty string, the match_cbegroup flag is set. When this is the case, add the current subject pointer to the chain of such remembered pointers, to be checked when we hit the closing ket, in order to break infinite loops that match no characters. When match() is called in other circumstances, don't add to the chain. The match_cbegroup flag must NOT be used with tail recursion, because the memory block that is used is on the stack, so a new one may be required for each match(). */ if ((flags & match_cbegroup) != 0) { newptrb.epb_saved_eptr = eptr; newptrb.epb_prev = eptrb; eptrb = &newptrb; } /* Now start processing the opcodes. */ for (;;) { minimize = possessive = FALSE; op = *ecode; /* For partial matching, remember if we ever hit the end of the subject after matching at least one subject character. */ if (md->partial && eptr >= md->end_subject && eptr > mstart) md->hitend = TRUE; switch(op) { case OP_FAIL: RRETURN(MATCH_NOMATCH); case OP_PRUNE: RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM51); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RRETURN(MATCH_PRUNE); case OP_COMMIT: RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM52); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RRETURN(MATCH_COMMIT); case OP_SKIP: RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM53); if (rrc != MATCH_NOMATCH) RRETURN(rrc); md->start_match_ptr = eptr; /* Pass back current position */ RRETURN(MATCH_SKIP); case OP_THEN: RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM54); if (rrc != MATCH_NOMATCH) RRETURN(rrc); RRETURN(MATCH_THEN); /* Handle a capturing bracket. If there is space in the offset vector, save the current subject position in the working slot at the top of the vector. We mustn't change the current values of the data slot, because they may be set from a previous iteration of this group, and be referred to by a reference inside the group. If the bracket fails to match, we need to restore this value and also the values of the final offsets, in case they were set by a previous iteration of the same bracket. If there isn't enough space in the offset vector, treat this as if it were a non-capturing bracket. Don't worry about setting the flag for the error case here; that is handled in the code for KET. */ case OP_CBRA: case OP_SCBRA: number = GET2(ecode, 1+LINK_SIZE); offset = number << 1; #ifdef DEBUG printf("start bracket %d\n", number); printf("subject="); pchars(eptr, 16, TRUE, md); printf("\n"); #endif if (offset < md->offset_max) { save_offset1 = md->offset_vector[offset]; save_offset2 = md->offset_vector[offset+1]; save_offset3 = md->offset_vector[md->offset_end - number]; save_capture_last = md->capture_last; DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); md->offset_vector[md->offset_end - number] = eptr - md->start_subject; flags = (op == OP_SCBRA)? match_cbegroup : 0; do { RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM1); if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); md->capture_last = save_capture_last; ecode += GET(ecode, 1); } while (*ecode == OP_ALT); DPRINTF(("bracket %d failed\n", number)); md->offset_vector[offset] = save_offset1; md->offset_vector[offset+1] = save_offset2; md->offset_vector[md->offset_end - number] = save_offset3; RRETURN(MATCH_NOMATCH); } /* FALL THROUGH ... Insufficient room for saving captured contents. Treat as a non-capturing bracket. */ /* VVVVVVVVVVVVVVVVVVVVVVVVV */ /* VVVVVVVVVVVVVVVVVVVVVVVVV */ DPRINTF(("insufficient capture room: treat as non-capturing\n")); /* VVVVVVVVVVVVVVVVVVVVVVVVV */ /* VVVVVVVVVVVVVVVVVVVVVVVVV */ /* Non-capturing bracket. Loop for all the alternatives. When we get to the final alternative within the brackets, we would return the result of a recursive call to match() whatever happened. We can reduce stack usage by turning this into a tail recursion, except in the case when match_cbegroup is set.*/ case OP_BRA: case OP_SBRA: DPRINTF(("start non-capturing bracket\n")); flags = (op >= OP_SBRA)? match_cbegroup : 0; for (;;) { if (ecode[GET(ecode, 1)] != OP_ALT) /* Final alternative */ { if (flags == 0) /* Not a possibly empty group */ { ecode += _pcre_OP_lengths[*ecode]; DPRINTF(("bracket 0 tail recursion\n")); goto TAIL_RECURSE; } /* Possibly empty group; can't use tail recursion. */ RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM48); RRETURN(rrc); } /* For non-final alternatives, continue the loop for a NOMATCH result; otherwise return. */ RMATCH(eptr, ecode + _pcre_OP_lengths[*ecode], offset_top, md, ims, eptrb, flags, RM2); if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); ecode += GET(ecode, 1); } /* Control never reaches here. */ /* Conditional group: compilation checked that there are no more than two branches. If the condition is false, skipping the first branch takes us past the end if there is only one branch, but that's OK because that is exactly what going to the ket would do. As there is only one branch to be obeyed, we can use tail recursion to avoid using another stack frame. */ case OP_COND: case OP_SCOND: if (ecode[LINK_SIZE+1] == OP_RREF) /* Recursion test */ { offset = GET2(ecode, LINK_SIZE + 2); /* Recursion group number*/ condition = md->recursive != NULL && (offset == RREF_ANY || offset == md->recursive->group_num); ecode += condition? 3 : GET(ecode, 1); } else if (ecode[LINK_SIZE+1] == OP_CREF) /* Group used test */ { offset = GET2(ecode, LINK_SIZE+2) << 1; /* Doubled ref number */ condition = offset < offset_top && md->offset_vector[offset] >= 0; ecode += condition? 3 : GET(ecode, 1); } else if (ecode[LINK_SIZE+1] == OP_DEF) /* DEFINE - always false */ { condition = FALSE; ecode += GET(ecode, 1); } /* The condition is an assertion. Call match() to evaluate it - setting the final argument match_condassert causes it to stop at the end of an assertion. */ else { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, match_condassert, RM3); if (rrc == MATCH_MATCH) { condition = TRUE; ecode += 1 + LINK_SIZE + GET(ecode, LINK_SIZE + 2); while (*ecode == OP_ALT) ecode += GET(ecode, 1); } else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) { RRETURN(rrc); /* Need braces because of following else */ } else { condition = FALSE; ecode += GET(ecode, 1); } } /* We are now at the branch that is to be obeyed. As there is only one, we can use tail recursion to avoid using another stack frame, except when match_cbegroup is required for an unlimited repeat of a possibly empty group. If the second alternative doesn't exist, we can just plough on. */ if (condition || *ecode == OP_ALT) { ecode += 1 + LINK_SIZE; if (op == OP_SCOND) /* Possibly empty group */ { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, match_cbegroup, RM49); RRETURN(rrc); } else /* Group must match something */ { flags = 0; goto TAIL_RECURSE; } } else /* Condition false & no 2nd alternative */ { ecode += 1 + LINK_SIZE; } break; /* End of the pattern, either real or forced. If we are in a top-level recursion, we should restore the offsets appropriately and continue from after the call. */ case OP_ACCEPT: case OP_END: if (md->recursive != NULL && md->recursive->group_num == 0) { recursion_info *rec = md->recursive; DPRINTF(("End of pattern in a (?0) recursion\n")); md->recursive = rec->prevrec; memmove(md->offset_vector, rec->offset_save, rec->saved_max * sizeof(int)); mstart = rec->save_start; ims = original_ims; ecode = rec->after_call; break; } /* Otherwise, if PCRE_NOTEMPTY is set, fail if we have matched an empty string - backtracking will then try other alternatives, if any. */ if (md->notempty && eptr == mstart) RRETURN(MATCH_NOMATCH); md->end_match_ptr = eptr; /* Record where we ended */ md->end_offset_top = offset_top; /* and how many extracts were taken */ md->start_match_ptr = mstart; /* and the start (\K can modify) */ RRETURN(MATCH_MATCH); /* Change option settings */ case OP_OPT: ims = ecode[1]; ecode += 2; DPRINTF(("ims set to %02lx\n", ims)); break; /* Assertion brackets. Check the alternative branches in turn - the matching won't pass the KET for an assertion. If any one branch matches, the assertion is true. Lookbehind assertions have an OP_REVERSE item at the start of each branch to move the current point backwards, so the code at this level is identical to the lookahead case. */ case OP_ASSERT: case OP_ASSERTBACK: do { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0, RM4); if (rrc == MATCH_MATCH) break; if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); ecode += GET(ecode, 1); } while (*ecode == OP_ALT); if (*ecode == OP_KET) RRETURN(MATCH_NOMATCH); /* If checking an assertion for a condition, return MATCH_MATCH. */ if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); /* Continue from after the assertion, updating the offsets high water mark, since extracts may have been taken during the assertion. */ do ecode += GET(ecode,1); while (*ecode == OP_ALT); ecode += 1 + LINK_SIZE; offset_top = md->end_offset_top; continue; /* Negative assertion: all branches must fail to match */ case OP_ASSERT_NOT: case OP_ASSERTBACK_NOT: do { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, NULL, 0, RM5); if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH); if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); ecode += GET(ecode,1); } while (*ecode == OP_ALT); if ((flags & match_condassert) != 0) RRETURN(MATCH_MATCH); ecode += 1 + LINK_SIZE; continue; /* Move the subject pointer back. This occurs only at the start of each branch of a lookbehind assertion. If we are too close to the start to move back, this match function fails. When working with UTF-8 we move back a number of characters, not bytes. */ case OP_REVERSE: #ifdef SUPPORT_UTF8 if (utf8) { i = GET(ecode, 1); while (i-- > 0) { eptr--; if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); BACKCHAR(eptr); } } else #endif /* No UTF-8 support, or not in UTF-8 mode: count is byte count */ { eptr -= GET(ecode, 1); if (eptr < md->start_subject) RRETURN(MATCH_NOMATCH); } /* Skip to next op code */ ecode += 1 + LINK_SIZE; break; /* The callout item calls an external function, if one is provided, passing details of the match so far. This is mainly for debugging, though the function is able to force a failure. */ case OP_CALLOUT: if (pcre_callout != NULL) { pcre_callout_block cb; cb.version = 1; /* Version 1 of the callout block */ cb.callout_number = ecode[1]; cb.offset_vector = md->offset_vector; cb.subject = (PCRE_SPTR)md->start_subject; cb.subject_length = md->end_subject - md->start_subject; cb.start_match = mstart - md->start_subject; cb.current_position = eptr - md->start_subject; cb.pattern_position = GET(ecode, 2); cb.next_item_length = GET(ecode, 2 + LINK_SIZE); cb.capture_top = offset_top/2; cb.capture_last = md->capture_last; cb.callout_data = md->callout_data; if ((rrc = (*pcre_callout)(&cb)) > 0) RRETURN(MATCH_NOMATCH); if (rrc < 0) RRETURN(rrc); } ecode += 2 + 2*LINK_SIZE; break; /* Recursion either matches the current regex, or some subexpression. The offset data is the offset to the starting bracket from the start of the whole pattern. (This is so that it works from duplicated subpatterns.) If there are any capturing brackets started but not finished, we have to save their starting points and reinstate them after the recursion. However, we don't know how many such there are (offset_top records the completed total) so we just have to save all the potential data. There may be up to 65535 such values, which is too large to put on the stack, but using malloc for small numbers seems expensive. As a compromise, the stack is used when there are no more than REC_STACK_SAVE_MAX values to store; otherwise malloc is used. A problem is what to do if the malloc fails ... there is no way of returning to the top level with an error. Save the top REC_STACK_SAVE_MAX values on the stack, and accept that the rest may be wrong. There are also other values that have to be saved. We use a chained sequence of blocks that actually live on the stack. Thanks to Robin Houston for the original version of this logic. */ case OP_RECURSE: { callpat = md->start_code + GET(ecode, 1); new_recursive.group_num = (callpat == md->start_code)? 0 : GET2(callpat, 1 + LINK_SIZE); /* Add to "recursing stack" */ new_recursive.prevrec = md->recursive; md->recursive = &new_recursive; /* Find where to continue from afterwards */ ecode += 1 + LINK_SIZE; new_recursive.after_call = ecode; /* Now save the offset data. */ new_recursive.saved_max = md->offset_end; if (new_recursive.saved_max <= REC_STACK_SAVE_MAX) new_recursive.offset_save = stacksave; else { new_recursive.offset_save = (int *)(pcre_malloc)(new_recursive.saved_max * sizeof(int)); if (new_recursive.offset_save == NULL) RRETURN(PCRE_ERROR_NOMEMORY); } memcpy(new_recursive.offset_save, md->offset_vector, new_recursive.saved_max * sizeof(int)); new_recursive.save_start = mstart; mstart = eptr; /* OK, now we can do the recursion. For each top-level alternative we restore the offset and recursion data. */ DPRINTF(("Recursing into group %d\n", new_recursive.group_num)); flags = (*callpat >= OP_SBRA)? match_cbegroup : 0; do { RMATCH(eptr, callpat + _pcre_OP_lengths[*callpat], offset_top, md, ims, eptrb, flags, RM6); if (rrc == MATCH_MATCH) { DPRINTF(("Recursion matched\n")); md->recursive = new_recursive.prevrec; if (new_recursive.offset_save != stacksave) (pcre_free)(new_recursive.offset_save); RRETURN(MATCH_MATCH); } else if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) { DPRINTF(("Recursion gave error %d\n", rrc)); RRETURN(rrc); } md->recursive = &new_recursive; memcpy(md->offset_vector, new_recursive.offset_save, new_recursive.saved_max * sizeof(int)); callpat += GET(callpat, 1); } while (*callpat == OP_ALT); DPRINTF(("Recursion didn't match\n")); md->recursive = new_recursive.prevrec; if (new_recursive.offset_save != stacksave) (pcre_free)(new_recursive.offset_save); RRETURN(MATCH_NOMATCH); } /* Control never reaches here */ /* "Once" brackets are like assertion brackets except that after a match, the point in the subject string is not moved back. Thus there can never be a move back into the brackets. Friedl calls these "atomic" subpatterns. Check the alternative branches in turn - the matching won't pass the KET for this kind of subpattern. If any one branch matches, we carry on as at the end of a normal bracket, leaving the subject pointer. */ case OP_ONCE: prev = ecode; saved_eptr = eptr; do { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM7); if (rrc == MATCH_MATCH) break; if (rrc != MATCH_NOMATCH && rrc != MATCH_THEN) RRETURN(rrc); ecode += GET(ecode,1); } while (*ecode == OP_ALT); /* If hit the end of the group (which could be repeated), fail */ if (*ecode != OP_ONCE && *ecode != OP_ALT) RRETURN(MATCH_NOMATCH); /* Continue as from after the assertion, updating the offsets high water mark, since extracts may have been taken. */ do ecode += GET(ecode, 1); while (*ecode == OP_ALT); offset_top = md->end_offset_top; eptr = md->end_match_ptr; /* For a non-repeating ket, just continue at this level. This also happens for a repeating ket if no characters were matched in the group. This is the forcible breaking of infinite loops as implemented in Perl 5.005. If there is an options reset, it will get obeyed in the normal course of events. */ if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 1+LINK_SIZE; break; } /* The repeating kets try the rest of the pattern or restart from the preceding bracket, in the appropriate order. The second "call" of match() uses tail recursion, to avoid using another stack frame. We need to reset any options that changed within the bracket before re-running it, so check the next opcode. */ if (ecode[1+LINK_SIZE] == OP_OPT) { ims = (ims & ~PCRE_IMS) | ecode[4]; DPRINTF(("ims set to %02lx at group repeat\n", ims)); } if (*ecode == OP_KETRMIN) { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM8); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode = prev; flags = 0; goto TAIL_RECURSE; } else /* OP_KETRMAX */ { RMATCH(eptr, prev, offset_top, md, ims, eptrb, match_cbegroup, RM9); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += 1 + LINK_SIZE; flags = 0; goto TAIL_RECURSE; } /* Control never gets here */ /* An alternation is the end of a branch; scan along to find the end of the bracketed group and go to there. */ case OP_ALT: do ecode += GET(ecode,1); while (*ecode == OP_ALT); break; /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating that it may occur zero times. It may repeat infinitely, or not at all - i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper repeat limits are compiled as a number of copies, with the optional ones preceded by BRAZERO or BRAMINZERO. */ case OP_BRAZERO: { next = ecode+1; RMATCH(eptr, next, offset_top, md, ims, eptrb, 0, RM10); if (rrc != MATCH_NOMATCH) RRETURN(rrc); do next += GET(next,1); while (*next == OP_ALT); ecode = next + 1 + LINK_SIZE; } break; case OP_BRAMINZERO: { next = ecode+1; do next += GET(next, 1); while (*next == OP_ALT); RMATCH(eptr, next + 1+LINK_SIZE, offset_top, md, ims, eptrb, 0, RM11); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode++; } break; /* End of a group, repeated or non-repeating. */ case OP_KET: case OP_KETRMIN: case OP_KETRMAX: prev = ecode - GET(ecode, 1); /* If this was a group that remembered the subject start, in order to break infinite repeats of empty string matches, retrieve the subject start from the chain. Otherwise, set it NULL. */ if (*prev >= OP_SBRA) { saved_eptr = eptrb->epb_saved_eptr; /* Value at start of group */ eptrb = eptrb->epb_prev; /* Backup to previous group */ } else saved_eptr = NULL; /* If we are at the end of an assertion group, stop matching and return MATCH_MATCH, but record the current high water mark for use by positive assertions. Do this also for the "once" (atomic) groups. */ if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || *prev == OP_ONCE) { md->end_match_ptr = eptr; /* For ONCE */ md->end_offset_top = offset_top; RRETURN(MATCH_MATCH); } /* For capturing groups we have to check the group number back at the start and if necessary complete handling an extraction by setting the offsets and bumping the high water mark. Note that whole-pattern recursion is coded as a recurse into group 0, so it won't be picked up here. Instead, we catch it when the OP_END is reached. Other recursion is handled here. */ if (*prev == OP_CBRA || *prev == OP_SCBRA) { number = GET2(prev, 1+LINK_SIZE); offset = number << 1; #ifdef DEBUG printf("end bracket %d", number); printf("\n"); #endif md->capture_last = number; if (offset >= md->offset_max) md->offset_overflow = TRUE; else { md->offset_vector[offset] = md->offset_vector[md->offset_end - number]; md->offset_vector[offset+1] = eptr - md->start_subject; if (offset_top <= offset) offset_top = offset + 2; } /* Handle a recursively called group. Restore the offsets appropriately and continue from after the call. */ if (md->recursive != NULL && md->recursive->group_num == number) { recursion_info *rec = md->recursive; DPRINTF(("Recursion (%d) succeeded - continuing\n", number)); md->recursive = rec->prevrec; mstart = rec->save_start; memcpy(md->offset_vector, rec->offset_save, rec->saved_max * sizeof(int)); ecode = rec->after_call; ims = original_ims; break; } } /* For both capturing and non-capturing groups, reset the value of the ims flags, in case they got changed during the group. */ ims = original_ims; DPRINTF(("ims reset to %02lx\n", ims)); /* For a non-repeating ket, just continue at this level. This also happens for a repeating ket if no characters were matched in the group. This is the forcible breaking of infinite loops as implemented in Perl 5.005. If there is an options reset, it will get obeyed in the normal course of events. */ if (*ecode == OP_KET || eptr == saved_eptr) { ecode += 1 + LINK_SIZE; break; } /* The repeating kets try the rest of the pattern or restart from the preceding bracket, in the appropriate order. In the second case, we can use tail recursion to avoid using another stack frame, unless we have an unlimited repeat of a group that can match an empty string. */ flags = (*prev >= OP_SBRA)? match_cbegroup : 0; if (*ecode == OP_KETRMIN) { RMATCH(eptr, ecode + 1 + LINK_SIZE, offset_top, md, ims, eptrb, 0, RM12); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (flags != 0) /* Could match an empty string */ { RMATCH(eptr, prev, offset_top, md, ims, eptrb, flags, RM50); RRETURN(rrc); } ecode = prev; goto TAIL_RECURSE; } else /* OP_KETRMAX */ { RMATCH(eptr, prev, offset_top, md, ims, eptrb, flags, RM13); if (rrc != MATCH_NOMATCH) RRETURN(rrc); ecode += 1 + LINK_SIZE; flags = 0; goto TAIL_RECURSE; } /* Control never gets here */ /* Start of subject unless notbol, or after internal newline if multiline */ case OP_CIRC: if (md->notbol && eptr == md->start_subject) RRETURN(MATCH_NOMATCH); if ((ims & PCRE_MULTILINE) != 0) { if (eptr != md->start_subject && (eptr == md->end_subject || !WAS_NEWLINE(eptr))) RRETURN(MATCH_NOMATCH); ecode++; break; } /* ... else fall through */ /* Start of subject assertion */ case OP_SOD: if (eptr != md->start_subject) RRETURN(MATCH_NOMATCH); ecode++; break; /* Start of match assertion */ case OP_SOM: if (eptr != md->start_subject + md->start_offset) RRETURN(MATCH_NOMATCH); ecode++; break; /* Reset the start of match point */ case OP_SET_SOM: mstart = eptr; ecode++; break; /* Assert before internal newline if multiline, or before a terminating newline unless endonly is set, else end of subject unless noteol is set. */ case OP_DOLL: if ((ims & PCRE_MULTILINE) != 0) { if (eptr < md->end_subject) { if (!IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); } else { if (md->noteol) RRETURN(MATCH_NOMATCH); } ecode++; break; } else { if (md->noteol) RRETURN(MATCH_NOMATCH); if (!md->endonly) { if (eptr != md->end_subject && (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen)) RRETURN(MATCH_NOMATCH); ecode++; break; } } /* ... else fall through for endonly */ /* End of subject assertion (\z) */ case OP_EOD: if (eptr < md->end_subject) RRETURN(MATCH_NOMATCH); ecode++; break; /* End of subject or ending \n assertion (\Z) */ case OP_EODN: if (eptr != md->end_subject && (!IS_NEWLINE(eptr) || eptr != md->end_subject - md->nllen)) RRETURN(MATCH_NOMATCH); ecode++; break; /* Word boundary assertions */ case OP_NOT_WORD_BOUNDARY: case OP_WORD_BOUNDARY: { /* Find out if the previous and current characters are "word" characters. It takes a bit more work in UTF-8 mode. Characters > 255 are assumed to be "non-word" characters. */ #ifdef SUPPORT_UTF8 if (utf8) { if (eptr == md->start_subject) prev_is_word = FALSE; else { const uschar *lastptr = eptr - 1; while((*lastptr & 0xc0) == 0x80) lastptr--; GETCHAR(c, lastptr); prev_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; } if (eptr >= md->end_subject) cur_is_word = FALSE; else { GETCHAR(c, eptr); cur_is_word = c < 256 && (md->ctypes[c] & ctype_word) != 0; } } else #endif /* More streamlined when not in UTF-8 mode */ { prev_is_word = (eptr != md->start_subject) && ((md->ctypes[eptr[-1]] & ctype_word) != 0); cur_is_word = (eptr < md->end_subject) && ((md->ctypes[*eptr] & ctype_word) != 0); } /* Now see if the situation is what we want */ if ((*ecode++ == OP_WORD_BOUNDARY)? cur_is_word == prev_is_word : cur_is_word != prev_is_word) RRETURN(MATCH_NOMATCH); } break; /* Match a single character type; inline for speed */ case OP_ANY: if ((ims & PCRE_DOTALL) == 0) { if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); } if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); if (utf8) while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; ecode++; break; /* Match a single byte, even in UTF-8 mode. This opcode really does match any byte, even newline, independent of the setting of PCRE_DOTALL. */ case OP_ANYBYTE: if (eptr++ >= md->end_subject) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_NOT_DIGIT: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c < 256 && #endif (md->ctypes[c] & ctype_digit) != 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_DIGIT: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c >= 256 || #endif (md->ctypes[c] & ctype_digit) == 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_NOT_WHITESPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c < 256 && #endif (md->ctypes[c] & ctype_space) != 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_WHITESPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c >= 256 || #endif (md->ctypes[c] & ctype_space) == 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_NOT_WORDCHAR: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c < 256 && #endif (md->ctypes[c] & ctype_word) != 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_WORDCHAR: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); if ( #ifdef SUPPORT_UTF8 c >= 256 || #endif (md->ctypes[c] & ctype_word) == 0 ) RRETURN(MATCH_NOMATCH); ecode++; break; case OP_ANYNL: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x000d: if (eptr < md->end_subject && *eptr == 0x0a) eptr++; break; case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: break; } ecode++; break; case OP_NOT_HSPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); switch(c) { default: break; case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ RRETURN(MATCH_NOMATCH); } ecode++; break; case OP_HSPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ break; } ecode++; break; case OP_NOT_VSPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); switch(c) { default: break; case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ RRETURN(MATCH_NOMATCH); } ecode++; break; case OP_VSPACE: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ break; } ecode++; break; #ifdef SUPPORT_UCP /* Check the next character by Unicode property. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ case OP_PROP: case OP_NOTPROP: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); { int chartype, script; int category = _pcre_ucp_findprop(c, &chartype, &script); switch(ecode[1]) { case PT_ANY: if (op == OP_NOTPROP) RRETURN(MATCH_NOMATCH); break; case PT_LAMP: if ((chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt) == (op == OP_NOTPROP)) RRETURN(MATCH_NOMATCH); break; case PT_GC: if ((ecode[2] != category) == (op == OP_PROP)) RRETURN(MATCH_NOMATCH); break; case PT_PC: if ((ecode[2] != chartype) == (op == OP_PROP)) RRETURN(MATCH_NOMATCH); break; case PT_SC: if ((ecode[2] != script) == (op == OP_PROP)) RRETURN(MATCH_NOMATCH); break; default: RRETURN(PCRE_ERROR_INTERNAL); } ecode += 3; } break; /* Match an extended Unicode sequence. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ case OP_EXTUNI: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); { int chartype, script; int category = _pcre_ucp_findprop(c, &chartype, &script); if (category == ucp_M) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject) { int len = 1; if (!utf8) c = *eptr; else { GETCHARLEN(c, eptr, len); } category = _pcre_ucp_findprop(c, &chartype, &script); if (category != ucp_M) break; eptr += len; } } ecode++; break; #endif /* Match a back reference, possibly repeatedly. Look past the end of the item to see if there is repeat information following. The code is similar to that for character classes, but repeated for efficiency. Then obey similar code to character type repeats - written out again for speed. However, if the referenced string is the empty string, always treat it as matched, any number of times (otherwise there could be infinite loops). */ case OP_REF: { offset = GET2(ecode, 1) << 1; /* Doubled ref number */ ecode += 3; /* Advance past item */ /* If the reference is unset, set the length to be longer than the amount of subject left; this ensures that every attempt at a match fails. We can't just fail here, because of the possibility of quantifiers with zero minima. */ length = (offset >= offset_top || md->offset_vector[offset] < 0)? md->end_subject - eptr + 1 : md->offset_vector[offset+1] - md->offset_vector[offset]; /* Set up for repetition, or handle the non-repeated case */ switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = GET2(ecode, 1); max = GET2(ecode, 3); if (max == 0) max = INT_MAX; ecode += 5; break; default: /* No repeat follows */ if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); eptr += length; continue; /* With the main loop */ } /* If the length of the reference is zero, just continue with the main loop. */ if (length == 0) continue; /* First, ensure the minimum number of matches are present. We get back the length of the reference string explicitly rather than passing the address of eptr, so that eptr can be a register variable. */ for (i = 1; i <= min; i++) { if (!match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); eptr += length; } /* If min = max, continue at the same level without recursion. They are not both allowed to be zero. */ if (min == max) continue; /* If minimizing, keep trying and advancing the pointer */ if (minimize) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM14); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || !match_ref(offset, eptr, length, md, ims)) RRETURN(MATCH_NOMATCH); eptr += length; } /* Control never gets here */ } /* If maximizing, find the longest string and work backwards */ else { pp = eptr; for (i = min; i < max; i++) { if (!match_ref(offset, eptr, length, md, ims)) break; eptr += length; } while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM15); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr -= length; } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match a bit-mapped character class, possibly repeatedly. This op code is used when all the characters in the class have values in the range 0-255, and either the matching is caseful, or the characters are in the range 0-127 when UTF-8 processing is enabled. The only difference between OP_CLASS and OP_NCLASS occurs when a data character outside the range is encountered. First, look past the end of the item to see if there is repeat information following. Then obey similar code to character type repeats - written out again for speed. */ case OP_NCLASS: case OP_CLASS: { data = ecode + 1; /* Save for matching */ ecode += 33; /* Advance past the item */ switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = GET2(ecode, 1); max = GET2(ecode, 3); if (max == 0) max = INT_MAX; ecode += 5; break; default: /* No repeat follows */ min = max = 1; break; } /* First, ensure the minimum number of matches are present. */ #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (c > 255) { if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); } else { if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } } else #endif /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); c = *eptr++; if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } /* If max == min we can continue with the main loop without the need to recurse. */ if (min == max) continue; /* If minimizing, keep testing the rest of the expression and advancing the pointer while it matches the class. */ if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM16); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (c > 255) { if (op == OP_CLASS) RRETURN(MATCH_NOMATCH); } else { if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM17); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); c = *eptr++; if ((data[c/8] & (1 << (c&7))) == 0) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ } /* If maximizing, find the longest possible run, then work backwards. */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c > 255) { if (op == OP_CLASS) break; } else { if ((data[c/8] & (1 << (c&7))) == 0) break; } eptr += len; } for (;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM18); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if ((data[c/8] & (1 << (c&7))) == 0) break; eptr++; } while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM19); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match an extended character class. This opcode is encountered only in UTF-8 mode, because that's the only time it is compiled. */ #ifdef SUPPORT_UTF8 case OP_XCLASS: { data = ecode + 1 + LINK_SIZE; /* Save for matching */ ecode += GET(ecode, 1); /* Advance past the item */ switch (*ecode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: c = *ecode++ - OP_CRSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; break; case OP_CRRANGE: case OP_CRMINRANGE: minimize = (*ecode == OP_CRMINRANGE); min = GET2(ecode, 1); max = GET2(ecode, 3); if (max == 0) max = INT_MAX; ecode += 5; break; default: /* No repeat follows */ min = max = 1; break; } /* First, ensure the minimum number of matches are present. */ for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); } /* If max == min we can continue with the main loop without the need to recurse. */ if (min == max) continue; /* If minimizing, keep testing the rest of the expression and advancing the pointer while it matches the class. */ if (minimize) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM20); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (!_pcre_xclass(c, data)) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* If maximizing, find the longest possible run, then work backwards. */ else { pp = eptr; for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (!_pcre_xclass(c, data)) break; eptr += len; } for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM21); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ if (utf8) BACKCHAR(eptr); } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } #endif /* End of XCLASS */ /* Match a single character, casefully */ case OP_CHAR: #ifdef SUPPORT_UTF8 if (utf8) { length = 1; ecode++; GETCHARLEN(fc, ecode, length); if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); while (length-- > 0) if (*ecode++ != *eptr++) RRETURN(MATCH_NOMATCH); } else #endif /* Non-UTF-8 mode */ { if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); if (ecode[1] != *eptr++) RRETURN(MATCH_NOMATCH); ecode += 2; } break; /* Match a single character, caselessly */ case OP_CHARNC: #ifdef SUPPORT_UTF8 if (utf8) { length = 1; ecode++; GETCHARLEN(fc, ecode, length); if (length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); /* If the pattern character's value is < 128, we have only one byte, and can use the fast lookup table. */ if (fc < 128) { if (md->lcc[*ecode++] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } /* Otherwise we must pick up the subject character */ else { unsigned int dc; GETCHARINC(dc, eptr); ecode += length; /* If we have Unicode property support, we can use it to test the other case of the character, if there is one. */ if (fc != dc) { #ifdef SUPPORT_UCP if (dc != _pcre_ucp_othercase(fc)) #endif RRETURN(MATCH_NOMATCH); } } } else #endif /* SUPPORT_UTF8 */ /* Non-UTF-8 mode */ { if (md->end_subject - eptr < 1) RRETURN(MATCH_NOMATCH); if (md->lcc[ecode[1]] != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); ecode += 2; } break; /* Match a single character repeatedly. */ case OP_EXACT: min = max = GET2(ecode, 1); ecode += 3; goto REPEATCHAR; case OP_POSUPTO: possessive = TRUE; /* Fall through */ case OP_UPTO: case OP_MINUPTO: min = 0; max = GET2(ecode, 1); minimize = *ecode == OP_MINUPTO; ecode += 3; goto REPEATCHAR; case OP_POSSTAR: possessive = TRUE; min = 0; max = INT_MAX; ecode++; goto REPEATCHAR; case OP_POSPLUS: possessive = TRUE; min = 1; max = INT_MAX; ecode++; goto REPEATCHAR; case OP_POSQUERY: possessive = TRUE; min = 0; max = 1; ecode++; goto REPEATCHAR; case OP_STAR: case OP_MINSTAR: case OP_PLUS: case OP_MINPLUS: case OP_QUERY: case OP_MINQUERY: c = *ecode++ - OP_STAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; /* Common code for all repeated single-character matches. We can give up quickly if there are fewer than the minimum number of characters left in the subject. */ REPEATCHAR: #ifdef SUPPORT_UTF8 if (utf8) { length = 1; charptr = ecode; GETCHARLEN(fc, ecode, length); if (min * length > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); ecode += length; /* Handle multibyte character matching specially here. There is support for caseless matching if UCP support is present. */ if (length > 1) { #ifdef SUPPORT_UCP unsigned int othercase; if ((ims & PCRE_CASELESS) != 0 && (othercase = _pcre_ucp_othercase(fc)) != NOTACHAR) oclength = _pcre_ord2utf8(othercase, occhars); else oclength = 0; #endif /* SUPPORT_UCP */ for (i = 1; i <= min; i++) { if (memcmp(eptr, charptr, length) == 0) eptr += length; #ifdef SUPPORT_UCP /* Need braces because of following else */ else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } else { if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); eptr += oclength; } #else /* without SUPPORT_UCP */ else { RRETURN(MATCH_NOMATCH); } #endif /* SUPPORT_UCP */ } if (min == max) continue; if (minimize) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM22); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); if (memcmp(eptr, charptr, length) == 0) eptr += length; #ifdef SUPPORT_UCP /* Need braces because of following else */ else if (oclength == 0) { RRETURN(MATCH_NOMATCH); } else { if (memcmp(eptr, occhars, oclength) != 0) RRETURN(MATCH_NOMATCH); eptr += oclength; } #else /* without SUPPORT_UCP */ else { RRETURN (MATCH_NOMATCH); } #endif /* SUPPORT_UCP */ } /* Control never gets here */ } else /* Maximize */ { pp = eptr; for (i = min; i < max; i++) { if (eptr > md->end_subject - length) break; if (memcmp(eptr, charptr, length) == 0) eptr += length; #ifdef SUPPORT_UCP else if (oclength == 0) break; else { if (memcmp(eptr, occhars, oclength) != 0) break; eptr += oclength; } #else /* without SUPPORT_UCP */ else break; #endif /* SUPPORT_UCP */ } if (possessive) continue; for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM23); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr == pp) RRETURN(MATCH_NOMATCH); #ifdef SUPPORT_UCP eptr--; BACKCHAR(eptr); #else /* without SUPPORT_UCP */ eptr -= length; #endif /* SUPPORT_UCP */ } } /* Control never gets here */ } /* If the length of a UTF-8 character is 1, we fall through here, and obey the code as for non-UTF-8 characters below, though in this case the value of fc will always be < 128. */ } else #endif /* SUPPORT_UTF8 */ /* When not in UTF-8 mode, load a single-byte character. */ { if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); fc = *ecode++; } /* The value of fc at this point is always less than 256, though we may or may not be in UTF-8 mode. The code is duplicated for the caseless and caseful cases, for speed, since matching characters is likely to be quite common. First, ensure the minimum number of matches are present. If min = max, continue at the same level without recursing. Otherwise, if minimizing, keep trying the rest of the expression and advancing one matching character if failing, up to the maximum. Alternatively, if maximizing, find the maximum number of characters and work backwards. */ DPRINTF(("matching %c{%d,%d} against subject %.*s\n", fc, min, max, max, eptr)); if ((ims & PCRE_CASELESS) != 0) { fc = md->lcc[fc]; for (i = 1; i <= min; i++) if (fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); if (min == max) continue; if (minimize) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM24); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc != md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } else /* Maximize */ { pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc != md->lcc[*eptr]) break; eptr++; } if (possessive) continue; while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM25); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* Caseful comparisons (includes all multi-byte characters) */ else { for (i = 1; i <= min; i++) if (fc != *eptr++) RRETURN(MATCH_NOMATCH); if (min == max) continue; if (minimize) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM26); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc != *eptr++) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } else /* Maximize */ { pp = eptr; for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc != *eptr) break; eptr++; } if (possessive) continue; while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM27); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match a negated single one-byte character. The character we are checking can be multibyte. */ case OP_NOT: if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); ecode++; GETCHARINCTEST(c, eptr); if ((ims & PCRE_CASELESS) != 0) { #ifdef SUPPORT_UTF8 if (c < 256) #endif c = md->lcc[c]; if (md->lcc[*ecode++] == c) RRETURN(MATCH_NOMATCH); } else { if (*ecode++ == c) RRETURN(MATCH_NOMATCH); } break; /* Match a negated single one-byte character repeatedly. This is almost a repeat of the code for a repeated single character, but I haven't found a nice way of commoning these up that doesn't require a test of the positive/negative option for each character match. Maybe that wouldn't add very much to the time taken, but character matching *is* what this is all about... */ case OP_NOTEXACT: min = max = GET2(ecode, 1); ecode += 3; goto REPEATNOTCHAR; case OP_NOTUPTO: case OP_NOTMINUPTO: min = 0; max = GET2(ecode, 1); minimize = *ecode == OP_NOTMINUPTO; ecode += 3; goto REPEATNOTCHAR; case OP_NOTPOSSTAR: possessive = TRUE; min = 0; max = INT_MAX; ecode++; goto REPEATNOTCHAR; case OP_NOTPOSPLUS: possessive = TRUE; min = 1; max = INT_MAX; ecode++; goto REPEATNOTCHAR; case OP_NOTPOSQUERY: possessive = TRUE; min = 0; max = 1; ecode++; goto REPEATNOTCHAR; case OP_NOTPOSUPTO: possessive = TRUE; min = 0; max = GET2(ecode, 1); ecode += 3; goto REPEATNOTCHAR; case OP_NOTSTAR: case OP_NOTMINSTAR: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTQUERY: case OP_NOTMINQUERY: c = *ecode++ - OP_NOTSTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; /* Common code for all repeated single-byte matches. We can give up quickly if there are fewer than the minimum number of bytes left in the subject. */ REPEATNOTCHAR: if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); fc = *ecode++; /* The code is duplicated for the caseless and caseful cases, for speed, since matching characters is likely to be quite common. First, ensure the minimum number of matches are present. If min = max, continue at the same level without recursing. Otherwise, if minimizing, keep trying the rest of the expression and advancing one matching character if failing, up to the maximum. Alternatively, if maximizing, find the maximum number of characters and work backwards. */ DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", fc, min, max, max, eptr)); if ((ims & PCRE_CASELESS) != 0) { fc = md->lcc[fc]; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { register unsigned int d; for (i = 1; i <= min; i++) { GETCHARINC(d, eptr); if (d < 256) d = md->lcc[d]; if (fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) if (fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } if (min == max) continue; if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { register unsigned int d; for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM28); if (rrc != MATCH_NOMATCH) RRETURN(rrc); GETCHARINC(d, eptr); if (d < 256) d = md->lcc[d]; if (fi >= max || eptr >= md->end_subject || fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM29); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc == md->lcc[*eptr++]) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ } /* Maximize case */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { register unsigned int d; for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(d, eptr, len); if (d < 256) d = md->lcc[d]; if (fc == d) break; eptr += len; } if (possessive) continue; for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM30); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc == md->lcc[*eptr]) break; eptr++; } if (possessive) continue; while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM31); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } RRETURN(MATCH_NOMATCH); } /* Control never gets here */ } /* Caseful comparisons */ else { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { register unsigned int d; for (i = 1; i <= min; i++) { GETCHARINC(d, eptr); if (fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (i = 1; i <= min; i++) if (fc == *eptr++) RRETURN(MATCH_NOMATCH); } if (min == max) continue; if (minimize) { #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { register unsigned int d; for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM32); if (rrc != MATCH_NOMATCH) RRETURN(rrc); GETCHARINC(d, eptr); if (fi >= max || eptr >= md->end_subject || fc == d) RRETURN(MATCH_NOMATCH); } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM33); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || fc == *eptr++) RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ } /* Maximize case */ else { pp = eptr; #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { register unsigned int d; for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(d, eptr, len); if (fc == d) break; eptr += len; } if (possessive) continue; for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM34); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* Not UTF-8 mode */ { for (i = min; i < max; i++) { if (eptr >= md->end_subject || fc == *eptr) break; eptr++; } if (possessive) continue; while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM35); if (rrc != MATCH_NOMATCH) RRETURN(rrc); eptr--; } } RRETURN(MATCH_NOMATCH); } } /* Control never gets here */ /* Match a single character type repeatedly; several different opcodes share code. This is very similar to the code for single characters, but we repeat it in the interests of efficiency. */ case OP_TYPEEXACT: min = max = GET2(ecode, 1); minimize = TRUE; ecode += 3; goto REPEATTYPE; case OP_TYPEUPTO: case OP_TYPEMINUPTO: min = 0; max = GET2(ecode, 1); minimize = *ecode == OP_TYPEMINUPTO; ecode += 3; goto REPEATTYPE; case OP_TYPEPOSSTAR: possessive = TRUE; min = 0; max = INT_MAX; ecode++; goto REPEATTYPE; case OP_TYPEPOSPLUS: possessive = TRUE; min = 1; max = INT_MAX; ecode++; goto REPEATTYPE; case OP_TYPEPOSQUERY: possessive = TRUE; min = 0; max = 1; ecode++; goto REPEATTYPE; case OP_TYPEPOSUPTO: possessive = TRUE; min = 0; max = GET2(ecode, 1); ecode += 3; goto REPEATTYPE; case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: c = *ecode++ - OP_TYPESTAR; minimize = (c & 1) != 0; min = rep_min[c]; /* Pick up values from tables; */ max = rep_max[c]; /* zero for max => infinity */ if (max == 0) max = INT_MAX; /* Common code for all repeated single character type matches. Note that in UTF-8 mode, '.' matches a character of any length, but for the other character types, the valid characters are all one-byte long. */ REPEATTYPE: ctype = *ecode++; /* Code for the character type */ #ifdef SUPPORT_UCP if (ctype == OP_PROP || ctype == OP_NOTPROP) { prop_fail_result = ctype == OP_NOTPROP; prop_type = *ecode++; prop_value = *ecode++; } else prop_type = -1; #endif /* First, ensure the minimum number of matches are present. Use inline code for maximizing the speed, and do the type test once at the start (i.e. keep it out of the loop). Also we can test that there are at least the minimum number of bytes before we start. This isn't as effective in UTF-8 mode, but it does no harm. Separate the UTF-8 code completely as that is tidier. Also separate the UCP code, which can be the same for both UTF-8 and single-bytes. */ if (min > md->end_subject - eptr) RRETURN(MATCH_NOMATCH); if (min > 0) { #ifdef SUPPORT_UCP if (prop_type >= 0) { switch(prop_type) { case PT_ANY: if (prop_fail_result) RRETURN(MATCH_NOMATCH); for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); } break; case PT_LAMP: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_chartype == ucp_Lu || prop_chartype == ucp_Ll || prop_chartype == ucp_Lt) == prop_fail_result) RRETURN(MATCH_NOMATCH); } break; case PT_GC: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_category == prop_value) == prop_fail_result) RRETURN(MATCH_NOMATCH); } break; case PT_PC: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_chartype == prop_value) == prop_fail_result) RRETURN(MATCH_NOMATCH); } break; case PT_SC: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_script == prop_value) == prop_fail_result) RRETURN(MATCH_NOMATCH); } break; default: RRETURN(PCRE_ERROR_INTERNAL); } } /* Match extended Unicode sequences. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ else if (ctype == OP_EXTUNI) { for (i = 1; i <= min; i++) { GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject) { int len = 1; if (!utf8) c = *eptr; else { GETCHARLEN(c, eptr, len); } prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category != ucp_M) break; eptr += len; } } } else #endif /* SUPPORT_UCP */ /* Handle all other cases when the coding is UTF-8 */ #ifdef SUPPORT_UTF8 if (utf8) switch(ctype) { case OP_ANY: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || ((ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr))) RRETURN(MATCH_NOMATCH); eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } break; case OP_ANYBYTE: eptr += min; break; case OP_ANYNL: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x000d: if (eptr < md->end_subject && *eptr == 0x0a) eptr++; break; case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: break; } } break; case OP_NOT_HSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(c) { default: break; case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ RRETURN(MATCH_NOMATCH); } } break; case OP_HSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ break; } } break; case OP_NOT_VSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(c) { default: break; case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ RRETURN(MATCH_NOMATCH); } } break; case OP_VSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ break; } } break; case OP_NOT_DIGIT: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (c < 128 && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); } break; case OP_DIGIT: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || *eptr >= 128 || (md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); /* No need to skip more bytes - we know it's a 1-byte character */ } break; case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || (*eptr < 128 && (md->ctypes[*eptr] & ctype_space) != 0)) RRETURN(MATCH_NOMATCH); while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); } break; case OP_WHITESPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || *eptr >= 128 || (md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); /* No need to skip more bytes - we know it's a 1-byte character */ } break; case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || (*eptr < 128 && (md->ctypes[*eptr] & ctype_word) != 0)) RRETURN(MATCH_NOMATCH); while (++eptr < md->end_subject && (*eptr & 0xc0) == 0x80); } break; case OP_WORDCHAR: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject || *eptr >= 128 || (md->ctypes[*eptr++] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); /* No need to skip more bytes - we know it's a 1-byte character */ } break; default: RRETURN(PCRE_ERROR_INTERNAL); } /* End switch(ctype) */ else #endif /* SUPPORT_UTF8 */ /* Code for the non-UTF-8 case for minimum matching of operators other than OP_PROP and OP_NOTPROP. We can assume that there are the minimum number of bytes present, as this was tested above. */ switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0) { for (i = 1; i <= min; i++) { if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); eptr++; } } else eptr += min; break; case OP_ANYBYTE: eptr += min; break; /* Because of the CRLF case, we can't assume the minimum number of bytes are present in this case. */ case OP_ANYNL: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); switch(*eptr++) { default: RRETURN(MATCH_NOMATCH); case 0x000d: if (eptr < md->end_subject && *eptr == 0x0a) eptr++; break; case 0x000a: case 0x000b: case 0x000c: case 0x0085: break; } } break; case OP_NOT_HSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); switch(*eptr++) { default: break; case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ RRETURN(MATCH_NOMATCH); } } break; case OP_HSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); switch(*eptr++) { default: RRETURN(MATCH_NOMATCH); case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ break; } } break; case OP_NOT_VSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); switch(*eptr++) { default: break; case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ RRETURN(MATCH_NOMATCH); } } break; case OP_VSPACE: for (i = 1; i <= min; i++) { if (eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); switch(*eptr++) { default: RRETURN(MATCH_NOMATCH); case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ break; } } break; case OP_NOT_DIGIT: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); break; case OP_DIGIT: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WHITESPACE: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WHITESPACE: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WORDCHAR: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WORDCHAR: for (i = 1; i <= min; i++) if ((md->ctypes[*eptr++] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); break; default: RRETURN(PCRE_ERROR_INTERNAL); } } /* If min = max, continue at the same level without recursing */ if (min == max) continue; /* If minimizing, we have to test the rest of the pattern before each subsequent match. Again, separate the UTF-8 case for speed, and also separate the UCP cases. */ if (minimize) { #ifdef SUPPORT_UCP if (prop_type >= 0) { switch(prop_type) { case PT_ANY: for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM36); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); if (prop_fail_result) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ case PT_LAMP: for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM37); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_chartype == ucp_Lu || prop_chartype == ucp_Ll || prop_chartype == ucp_Lt) == prop_fail_result) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ case PT_GC: for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM38); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_category == prop_value) == prop_fail_result) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ case PT_PC: for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM39); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_chartype == prop_value) == prop_fail_result) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ case PT_SC: for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM40); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_script == prop_value) == prop_fail_result) RRETURN(MATCH_NOMATCH); } /* Control never gets here */ default: RRETURN(PCRE_ERROR_INTERNAL); } } /* Match extended Unicode sequences. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ else if (ctype == OP_EXTUNI) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM41); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category == ucp_M) RRETURN(MATCH_NOMATCH); while (eptr < md->end_subject) { int len = 1; if (!utf8) c = *eptr; else { GETCHARLEN(c, eptr, len); } prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category != ucp_M) break; eptr += len; } } } else #endif /* SUPPORT_UCP */ #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM42); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || (ctype == OP_ANY && (ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr))) RRETURN(MATCH_NOMATCH); GETCHARINC(c, eptr); switch(ctype) { case OP_ANY: /* This is the DOTALL case */ break; case OP_ANYBYTE: break; case OP_ANYNL: switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x000d: if (eptr < md->end_subject && *eptr == 0x0a) eptr++; break; case 0x000a: case 0x000b: case 0x000c: case 0x0085: case 0x2028: case 0x2029: break; } break; case OP_NOT_HSPACE: switch(c) { default: break; case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ RRETURN(MATCH_NOMATCH); } break; case OP_HSPACE: switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ break; } break; case OP_NOT_VSPACE: switch(c) { default: break; case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ RRETURN(MATCH_NOMATCH); } break; case OP_VSPACE: switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ break; } break; case OP_NOT_DIGIT: if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); break; case OP_DIGIT: if (c >= 256 || (md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WHITESPACE: if (c < 256 && (md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WHITESPACE: if (c >= 256 || (md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WORDCHAR: if (c < 256 && (md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WORDCHAR: if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); break; default: RRETURN(PCRE_ERROR_INTERNAL); } } } else #endif /* Not UTF-8 mode */ { for (fi = min;; fi++) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM43); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (fi >= max || eptr >= md->end_subject || ((ims & PCRE_DOTALL) == 0 && IS_NEWLINE(eptr))) RRETURN(MATCH_NOMATCH); c = *eptr++; switch(ctype) { case OP_ANY: /* This is the DOTALL case */ break; case OP_ANYBYTE: break; case OP_ANYNL: switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x000d: if (eptr < md->end_subject && *eptr == 0x0a) eptr++; break; case 0x000a: case 0x000b: case 0x000c: case 0x0085: break; } break; case OP_NOT_HSPACE: switch(c) { default: break; case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ RRETURN(MATCH_NOMATCH); } break; case OP_HSPACE: switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ break; } break; case OP_NOT_VSPACE: switch(c) { default: break; case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ RRETURN(MATCH_NOMATCH); } break; case OP_VSPACE: switch(c) { default: RRETURN(MATCH_NOMATCH); case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ break; } break; case OP_NOT_DIGIT: if ((md->ctypes[c] & ctype_digit) != 0) RRETURN(MATCH_NOMATCH); break; case OP_DIGIT: if ((md->ctypes[c] & ctype_digit) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WHITESPACE: if ((md->ctypes[c] & ctype_space) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WHITESPACE: if ((md->ctypes[c] & ctype_space) == 0) RRETURN(MATCH_NOMATCH); break; case OP_NOT_WORDCHAR: if ((md->ctypes[c] & ctype_word) != 0) RRETURN(MATCH_NOMATCH); break; case OP_WORDCHAR: if ((md->ctypes[c] & ctype_word) == 0) RRETURN(MATCH_NOMATCH); break; default: RRETURN(PCRE_ERROR_INTERNAL); } } } /* Control never gets here */ } /* If maximizing, it is worth using inline code for speed, doing the type test once at the start (i.e. keep it out of the loop). Again, keep the UTF-8 and UCP stuff separate. */ else { pp = eptr; /* Remember where we started */ #ifdef SUPPORT_UCP if (prop_type >= 0) { switch(prop_type) { case PT_ANY: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (prop_fail_result) break; eptr+= len; } break; case PT_LAMP: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_chartype == ucp_Lu || prop_chartype == ucp_Ll || prop_chartype == ucp_Lt) == prop_fail_result) break; eptr+= len; } break; case PT_GC: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_category == prop_value) == prop_fail_result) break; eptr+= len; } break; case PT_PC: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_chartype == prop_value) == prop_fail_result) break; eptr+= len; } break; case PT_SC: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if ((prop_script == prop_value) == prop_fail_result) break; eptr+= len; } break; } /* eptr is now past the end of the maximum run */ if (possessive) continue; for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM44); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ if (utf8) BACKCHAR(eptr); } } /* Match extended Unicode sequences. We will get here only if the support is in the binary; otherwise a compile-time error occurs. */ else if (ctype == OP_EXTUNI) { for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; GETCHARINCTEST(c, eptr); prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category == ucp_M) break; while (eptr < md->end_subject) { int len = 1; if (!utf8) c = *eptr; else { GETCHARLEN(c, eptr, len); } prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category != ucp_M) break; eptr += len; } } /* eptr is now past the end of the maximum run */ if (possessive) continue; for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM45); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ for (;;) /* Move back over one extended */ { int len = 1; if (!utf8) c = *eptr; else { BACKCHAR(eptr); GETCHARLEN(c, eptr, len); } prop_category = _pcre_ucp_findprop(c, &prop_chartype, &prop_script); if (prop_category != ucp_M) break; eptr--; } } } else #endif /* SUPPORT_UCP */ #ifdef SUPPORT_UTF8 /* UTF-8 mode */ if (utf8) { switch(ctype) { case OP_ANY: if (max < INT_MAX) { if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } else { for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } } /* Handle unlimited UTF-8 repeat */ else { if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; eptr++; while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; } } else { eptr = md->end_subject; } } break; /* The byte case is the same as non-UTF8 */ case OP_ANYBYTE: c = max - min; if (c > (unsigned int)(md->end_subject - eptr)) c = md->end_subject - eptr; eptr += c; break; case OP_ANYNL: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c == 0x000d) { if (++eptr >= md->end_subject) break; if (*eptr == 0x000a) eptr++; } else { if (c != 0x000a && c != 0x000b && c != 0x000c && c != 0x0085 && c != 0x2028 && c != 0x2029) break; eptr += len; } } break; case OP_NOT_HSPACE: case OP_HSPACE: for (i = min; i < max; i++) { BOOL gotspace; int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); switch(c) { default: gotspace = FALSE; break; case 0x09: /* HT */ case 0x20: /* SPACE */ case 0xa0: /* NBSP */ case 0x1680: /* OGHAM SPACE MARK */ case 0x180e: /* MONGOLIAN VOWEL SEPARATOR */ case 0x2000: /* EN QUAD */ case 0x2001: /* EM QUAD */ case 0x2002: /* EN SPACE */ case 0x2003: /* EM SPACE */ case 0x2004: /* THREE-PER-EM SPACE */ case 0x2005: /* FOUR-PER-EM SPACE */ case 0x2006: /* SIX-PER-EM SPACE */ case 0x2007: /* FIGURE SPACE */ case 0x2008: /* PUNCTUATION SPACE */ case 0x2009: /* THIN SPACE */ case 0x200A: /* HAIR SPACE */ case 0x202f: /* NARROW NO-BREAK SPACE */ case 0x205f: /* MEDIUM MATHEMATICAL SPACE */ case 0x3000: /* IDEOGRAPHIC SPACE */ gotspace = TRUE; break; } if (gotspace == (ctype == OP_NOT_HSPACE)) break; eptr += len; } break; case OP_NOT_VSPACE: case OP_VSPACE: for (i = min; i < max; i++) { BOOL gotspace; int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); switch(c) { default: gotspace = FALSE; break; case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LINE SEPARATOR */ case 0x2029: /* PARAGRAPH SEPARATOR */ gotspace = TRUE; break; } if (gotspace == (ctype == OP_NOT_VSPACE)) break; eptr += len; } break; case OP_NOT_DIGIT: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_digit) != 0) break; eptr+= len; } break; case OP_DIGIT: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c >= 256 ||(md->ctypes[c] & ctype_digit) == 0) break; eptr+= len; } break; case OP_NOT_WHITESPACE: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_space) != 0) break; eptr+= len; } break; case OP_WHITESPACE: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c >= 256 ||(md->ctypes[c] & ctype_space) == 0) break; eptr+= len; } break; case OP_NOT_WORDCHAR: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c < 256 && (md->ctypes[c] & ctype_word) != 0) break; eptr+= len; } break; case OP_WORDCHAR: for (i = min; i < max; i++) { int len = 1; if (eptr >= md->end_subject) break; GETCHARLEN(c, eptr, len); if (c >= 256 || (md->ctypes[c] & ctype_word) == 0) break; eptr+= len; } break; default: RRETURN(PCRE_ERROR_INTERNAL); } /* eptr is now past the end of the maximum run */ if (possessive) continue; for(;;) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM46); if (rrc != MATCH_NOMATCH) RRETURN(rrc); if (eptr-- == pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } else #endif /* SUPPORT_UTF8 */ /* Not UTF-8 mode */ { switch(ctype) { case OP_ANY: if ((ims & PCRE_DOTALL) == 0) { for (i = min; i < max; i++) { if (eptr >= md->end_subject || IS_NEWLINE(eptr)) break; eptr++; } break; } /* For DOTALL case, fall through and treat as \C */ case OP_ANYBYTE: c = max - min; if (c > (unsigned int)(md->end_subject - eptr)) c = md->end_subject - eptr; eptr += c; break; case OP_ANYNL: for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if (c == 0x000d) { if (++eptr >= md->end_subject) break; if (*eptr == 0x000a) eptr++; } else { if (c != 0x000a && c != 0x000b && c != 0x000c && c != 0x0085) break; eptr++; } } break; case OP_NOT_HSPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if (c == 0x09 || c == 0x20 || c == 0xa0) break; eptr++; } break; case OP_HSPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if (c != 0x09 && c != 0x20 && c != 0xa0) break; eptr++; } break; case OP_NOT_VSPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if (c == 0x0a || c == 0x0b || c == 0x0c || c == 0x0d || c == 0x85) break; eptr++; } break; case OP_VSPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject) break; c = *eptr; if (c != 0x0a && c != 0x0b && c != 0x0c && c != 0x0d && c != 0x85) break; eptr++; } break; case OP_NOT_DIGIT: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) break; eptr++; } break; case OP_DIGIT: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) break; eptr++; } break; case OP_NOT_WHITESPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) break; eptr++; } break; case OP_WHITESPACE: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) break; eptr++; } break; case OP_NOT_WORDCHAR: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) break; eptr++; } break; case OP_WORDCHAR: for (i = min; i < max; i++) { if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) break; eptr++; } break; default: RRETURN(PCRE_ERROR_INTERNAL); } /* eptr is now past the end of the maximum run */ if (possessive) continue; while (eptr >= pp) { RMATCH(eptr, ecode, offset_top, md, ims, eptrb, 0, RM47); eptr--; if (rrc != MATCH_NOMATCH) RRETURN(rrc); } } /* Get here if we can't make it match with any permitted repetitions */ RRETURN(MATCH_NOMATCH); } /* Control never gets here */ /* There's been some horrible disaster. Arrival here can only mean there is something seriously wrong in the code above or the OP_xxx definitions. */ default: DPRINTF(("Unknown opcode %d\n", *ecode)); RRETURN(PCRE_ERROR_UNKNOWN_OPCODE); } /* Do not stick any code in here without much thought; it is assumed that "continue" in the code above comes out to here to repeat the main loop. */ } /* End of main loop */ /* Control never reaches here */ /* When compiling to use the heap rather than the stack for recursive calls to match(), the RRETURN() macro jumps here. The number that is saved in frame->Xwhere indicates which label we actually want to return to. */ #ifdef NO_RECURSE #define LBL(val) case val: goto L_RM##val; HEAP_RETURN: switch (frame->Xwhere) { LBL( 1) LBL( 2) LBL( 3) LBL( 4) LBL( 5) LBL( 6) LBL( 7) LBL( 8) LBL( 9) LBL(10) LBL(11) LBL(12) LBL(13) LBL(14) LBL(15) LBL(16) LBL(17) LBL(18) LBL(19) LBL(20) LBL(21) LBL(22) LBL(23) LBL(24) LBL(25) LBL(26) LBL(27) LBL(28) LBL(29) LBL(30) LBL(31) LBL(32) LBL(33) LBL(34) LBL(35) LBL(36) LBL(37) LBL(38) LBL(39) LBL(40) LBL(41) LBL(42) LBL(43) LBL(44) LBL(45) LBL(46) LBL(47) LBL(48) LBL(49) LBL(50) LBL(51) LBL(52) LBL(53) LBL(54) default: DPRINTF(("jump error in pcre match: label %d non-existent\n", frame->Xwhere)); return PCRE_ERROR_INTERNAL; } #undef LBL #endif /* NO_RECURSE */ } /*************************************************************************** **************************************************************************** RECURSION IN THE match() FUNCTION Undefine all the macros that were defined above to handle this. */ #ifdef NO_RECURSE #undef eptr #undef ecode #undef mstart #undef offset_top #undef ims #undef eptrb #undef flags #undef callpat #undef charptr #undef data #undef next #undef pp #undef prev #undef saved_eptr #undef new_recursive #undef cur_is_word #undef condition #undef prev_is_word #undef original_ims #undef ctype #undef length #undef max #undef min #undef number #undef offset #undef op #undef save_capture_last #undef save_offset1 #undef save_offset2 #undef save_offset3 #undef stacksave #undef newptrb #endif /* These two are defined as macros in both cases */ #undef fc #undef fi /*************************************************************************** ***************************************************************************/ /************************************************* * Execute a Regular Expression * *************************************************/ /* This function applies a compiled re to a subject string and picks out portions of the string if it matches. Two elements in the vector are set for each substring: the offsets to the start and end of the substring. Arguments: argument_re points to the compiled expression extra_data points to extra data or is NULL subject points to the subject string length length of subject string (may contain binary zeros) start_offset where to start in the subject string options option bits offsets points to a vector of ints to be filled in with offsets offsetcount the number of elements in the vector Returns: > 0 => success; value is the number of elements filled in = 0 => success, but offsets is not big enough -1 => failed to match < -1 => some kind of unexpected problem */ PCRE_EXP_DEFN int pcre_exec(const pcre *argument_re, const pcre_extra *extra_data, PCRE_SPTR subject, int length, int start_offset, int options, int *offsets, int offsetcount) { int rc, resetcount, ocount; int first_byte = -1; int req_byte = -1; int req_byte2 = -1; int newline; unsigned long int ims; BOOL using_temporary_offsets = FALSE; BOOL anchored; BOOL startline; BOOL firstline; BOOL first_byte_caseless = FALSE; BOOL req_byte_caseless = FALSE; BOOL utf8; match_data match_block; match_data *md = &match_block; const uschar *tables; const uschar *start_bits = NULL; USPTR start_match = (USPTR)subject + start_offset; USPTR end_subject; USPTR req_byte_ptr = start_match - 1; pcre_study_data internal_study; const pcre_study_data *study; real_pcre internal_re; const real_pcre *external_re = (const real_pcre *)argument_re; const real_pcre *re = external_re; /* Plausibility checks */ if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; if (re == NULL || subject == NULL || (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; if (offsetcount < 0) return PCRE_ERROR_BADCOUNT; /* Fish out the optional data from the extra_data structure, first setting the default values. */ study = NULL; md->match_limit = MATCH_LIMIT; md->match_limit_recursion = MATCH_LIMIT_RECURSION; md->callout_data = NULL; /* The table pointer is always in native byte order. */ tables = external_re->tables; if (extra_data != NULL) { register unsigned int flags = extra_data->flags; if ((flags & PCRE_EXTRA_STUDY_DATA) != 0) study = (const pcre_study_data *)extra_data->study_data; if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0) md->match_limit = extra_data->match_limit; if ((flags & PCRE_EXTRA_MATCH_LIMIT_RECURSION) != 0) md->match_limit_recursion = extra_data->match_limit_recursion; if ((flags & PCRE_EXTRA_CALLOUT_DATA) != 0) md->callout_data = extra_data->callout_data; if ((flags & PCRE_EXTRA_TABLES) != 0) tables = extra_data->tables; } /* If the exec call supplied NULL for tables, use the inbuilt ones. This is a feature that makes it possible to save compiled regex and re-use them in other programs later. */ if (tables == NULL) tables = _pcre_default_tables; /* Check that the first field in the block is the magic number. If it is not, test for a regex that was compiled on a host of opposite endianness. If this is the case, flipped values are put in internal_re and internal_study if there was study data too. */ if (re->magic_number != MAGIC_NUMBER) { re = _pcre_try_flipped(re, &internal_re, study, &internal_study); if (re == NULL) return PCRE_ERROR_BADMAGIC; if (study != NULL) study = &internal_study; } /* Set up other data */ anchored = ((re->options | options) & PCRE_ANCHORED) != 0; startline = (re->options & PCRE_STARTLINE) != 0; firstline = (re->options & PCRE_FIRSTLINE) != 0; /* The code starts after the real_pcre block and the capture name table. */ md->start_code = (const uschar *)external_re + re->name_table_offset + re->name_count * re->name_entry_size; md->start_subject = (USPTR)subject; md->start_offset = start_offset; md->end_subject = md->start_subject + length; end_subject = md->end_subject; md->endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; utf8 = md->utf8 = (re->options & PCRE_UTF8) != 0; md->notbol = (options & PCRE_NOTBOL) != 0; md->noteol = (options & PCRE_NOTEOL) != 0; md->notempty = (options & PCRE_NOTEMPTY) != 0; md->partial = (options & PCRE_PARTIAL) != 0; md->hitend = FALSE; md->recursive = NULL; /* No recursion at top level */ md->lcc = tables + lcc_offset; md->ctypes = tables + ctypes_offset; /* Handle different types of newline. The three bits give eight cases. If nothing is set at run time, whatever was used at compile time applies. */ switch ((((options & PCRE_NEWLINE_BITS) == 0)? re->options : (pcre_uint32)options) & PCRE_NEWLINE_BITS) { case 0: newline = NEWLINE; break; /* Compile-time default */ case PCRE_NEWLINE_CR: newline = '\r'; break; case PCRE_NEWLINE_LF: newline = '\n'; break; case PCRE_NEWLINE_CR+ PCRE_NEWLINE_LF: newline = ('\r' << 8) | '\n'; break; case PCRE_NEWLINE_ANY: newline = -1; break; case PCRE_NEWLINE_ANYCRLF: newline = -2; break; default: return PCRE_ERROR_BADNEWLINE; } if (newline == -2) { md->nltype = NLTYPE_ANYCRLF; } else if (newline < 0) { md->nltype = NLTYPE_ANY; } else { md->nltype = NLTYPE_FIXED; if (newline > 255) { md->nllen = 2; md->nl[0] = (newline >> 8) & 255; md->nl[1] = newline & 255; } else { md->nllen = 1; md->nl[0] = newline; } } /* Partial matching is supported only for a restricted set of regexes at the moment. */ if (md->partial && (re->options & PCRE_NOPARTIAL) != 0) return PCRE_ERROR_BADPARTIAL; /* Check a UTF-8 string if required. Unfortunately there's no way of passing back the character offset. */ #ifdef SUPPORT_UTF8 if (utf8 && (options & PCRE_NO_UTF8_CHECK) == 0) { if (_pcre_valid_utf8((uschar *)subject, length) >= 0) return PCRE_ERROR_BADUTF8; if (start_offset > 0 && start_offset < length) { int tb = ((uschar *)subject)[start_offset]; if (tb > 127) { tb &= 0xc0; if (tb != 0 && tb != 0xc0) return PCRE_ERROR_BADUTF8_OFFSET; } } } #endif /* The ims options can vary during the matching as a result of the presence of (?ims) items in the pattern. They are kept in a local variable so that restoring at the exit of a group is easy. */ ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); /* If the expression has got more back references than the offsets supplied can hold, we get a temporary chunk of working store to use during the matching. Otherwise, we can use the vector supplied, rounding down its size to a multiple of 3. */ ocount = offsetcount - (offsetcount % 3); if (re->top_backref > 0 && re->top_backref >= ocount/3) { ocount = re->top_backref * 3 + 3; md->offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); if (md->offset_vector == NULL) return PCRE_ERROR_NOMEMORY; using_temporary_offsets = TRUE; DPRINTF(("Got memory to hold back references\n")); } else md->offset_vector = offsets; md->offset_end = ocount; md->offset_max = (2*ocount)/3; md->offset_overflow = FALSE; md->capture_last = -1; /* Compute the minimum number of offsets that we need to reset each time. Doing this makes a huge difference to execution time when there aren't many brackets in the pattern. */ resetcount = 2 + re->top_bracket * 2; if (resetcount > offsetcount) resetcount = ocount; /* Reset the working variable associated with each extraction. These should never be used unless previously set, but they get saved and restored, and so we initialize them to avoid reading uninitialized locations. */ if (md->offset_vector != NULL) { register int *iptr = md->offset_vector + ocount; register int *iend = iptr - resetcount/2 + 1; while (--iptr >= iend) *iptr = -1; } /* Set up the first character to match, if available. The first_byte value is never set for an anchored regular expression, but the anchoring may be forced at run time, so we have to test for anchoring. The first char may be unset for an unanchored pattern, of course. If there's no first char and the pattern was studied, there may be a bitmap of possible first characters. */ if (!anchored) { if ((re->options & PCRE_FIRSTSET) != 0) { first_byte = re->first_byte & 255; if ((first_byte_caseless = ((re->first_byte & REQ_CASELESS) != 0)) == TRUE) first_byte = md->lcc[first_byte]; } else if (!startline && study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0) start_bits = study->start_bits; } /* For anchored or unanchored matches, there may be a "last known required character" set. */ if ((re->options & PCRE_REQCHSET) != 0) { req_byte = re->req_byte & 255; req_byte_caseless = (re->req_byte & REQ_CASELESS) != 0; req_byte2 = (tables + fcc_offset)[req_byte]; /* case flipped */ } /* ==========================================================================*/ /* Loop for handling unanchored repeated matching attempts; for anchored regexs the loop runs just once. */ for(;;) { USPTR save_end_subject = end_subject; USPTR new_start_match; /* Reset the maximum number of extractions we might see. */ if (md->offset_vector != NULL) { register int *iptr = md->offset_vector; register int *iend = iptr + resetcount; while (iptr < iend) *iptr++ = -1; } /* Advance to a unique first char if possible. If firstline is TRUE, the start of the match is constrained to the first line of a multiline string. That is, the match must be before or at the first newline. Implement this by temporarily adjusting end_subject so that we stop scanning at a newline. If the match fails at the newline, later code breaks this loop. */ if (firstline) { USPTR t = start_match; while (t < md->end_subject && !IS_NEWLINE(t)) t++; end_subject = t; } /* Now test for a unique first byte */ if (first_byte >= 0) { if (first_byte_caseless) while (start_match < end_subject && md->lcc[*start_match] != first_byte) start_match++; else while (start_match < end_subject && *start_match != first_byte) start_match++; } /* Or to just after a linebreak for a multiline match if possible */ else if (startline) { if (start_match > md->start_subject + start_offset) { while (start_match <= end_subject && !WAS_NEWLINE(start_match)) start_match++; /* If we have just passed a CR and the newline option is ANY or ANYCRLF, and we are now at a LF, advance the match position by one more character. */ if (start_match[-1] == '\r' && (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF) && start_match < end_subject && *start_match == '\n') start_match++; } } /* Or to a non-unique first char after study */ else if (start_bits != NULL) { while (start_match < end_subject) { register unsigned int c = *start_match; if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break; } } /* Restore fudged end_subject */ end_subject = save_end_subject; #ifdef DEBUG /* Sigh. Some compilers never learn. */ printf(">>>> Match against: "); pchars(start_match, end_subject - start_match, TRUE, md); printf("\n"); #endif /* If req_byte is set, we know that that character must appear in the subject for the match to succeed. If the first character is set, req_byte must be later in the subject; otherwise the test starts at the match point. This optimization can save a huge amount of backtracking in patterns with nested unlimited repeats that aren't going to match. Writing separate code for cased/caseless versions makes it go faster, as does using an autoincrement and backing off on a match. HOWEVER: when the subject string is very, very long, searching to its end can take a long time, and give bad performance on quite ordinary patterns. This showed up when somebody was matching something like /^\d+C/ on a 32-megabyte string... so we don't do this when the string is sufficiently long. ALSO: this processing is disabled when partial matching is requested. */ if (req_byte >= 0 && end_subject - start_match < REQ_BYTE_MAX && !md->partial) { register USPTR p = start_match + ((first_byte >= 0)? 1 : 0); /* We don't need to repeat the search if we haven't yet reached the place we found it at last time. */ if (p > req_byte_ptr) { if (req_byte_caseless) { while (p < end_subject) { register int pp = *p++; if (pp == req_byte || pp == req_byte2) { p--; break; } } } else { while (p < end_subject) { if (*p++ == req_byte) { p--; break; } } } /* If we can't find the required character, break the matching loop, forcing a match failure. */ if (p >= end_subject) { rc = MATCH_NOMATCH; break; } /* If we have found the required character, save the point where we found it, so that we don't search again next time round the loop if the start hasn't passed this character yet. */ req_byte_ptr = p; } } /* OK, we can now run the match. */ md->start_match_ptr = start_match; md->match_call_count = 0; rc = match(start_match, md->start_code, start_match, 2, md, ims, NULL, 0, 0); switch(rc) { /* NOMATCH and PRUNE advance by one character. THEN at this level acts exactly like PRUNE. */ case MATCH_NOMATCH: case MATCH_PRUNE: case MATCH_THEN: new_start_match = start_match + 1; #ifdef SUPPORT_UTF8 if (utf8) while(new_start_match < end_subject && (*new_start_match & 0xc0) == 0x80) new_start_match++; #endif break; /* SKIP passes back the next starting point explicitly. */ case MATCH_SKIP: new_start_match = md->start_match_ptr; break; /* COMMIT disables the bumpalong, but otherwise behaves as NOMATCH. */ case MATCH_COMMIT: rc = MATCH_NOMATCH; goto ENDLOOP; /* Any other return is some kind of error. */ default: goto ENDLOOP; } /* Control reaches here for the various types of "no match at this point" result. Reset the code to MATCH_NOMATCH for subsequent checking. */ rc = MATCH_NOMATCH; /* If PCRE_FIRSTLINE is set, the match must happen before or at the first newline in the subject (though it may continue over the newline). Therefore, if we have just failed to match, starting at a newline, do not continue. */ if (firstline && IS_NEWLINE(start_match)) break; /* Advance to new matching position */ start_match = new_start_match; /* Break the loop if the pattern is anchored or if we have passed the end of the subject. */ if (anchored || start_match > end_subject) break; /* If we have just passed a CR and we are now at a LF, and the pattern does not contain any explicit matches for \r or \n, and the newline option is CRLF or ANY or ANYCRLF, advance the match position by one more character. */ if (start_match[-1] == '\r' && start_match < end_subject && *start_match == '\n' && (re->options & PCRE_HASCRORLF) == 0 && (md->nltype == NLTYPE_ANY || md->nltype == NLTYPE_ANYCRLF || md->nllen == 2)) start_match++; } /* End of for(;;) "bumpalong" loop */ /* ==========================================================================*/ /* We reach here when rc is not MATCH_NOMATCH, or if one of the stopping conditions is true: (1) The pattern is anchored or the match was failed by (*COMMIT); (2) We are past the end of the subject; (3) PCRE_FIRSTLINE is set and we have failed to match at a newline, because this option requests that a match occur at or before the first newline in the subject. When we have a match and the offset vector is big enough to deal with any backreferences, captured substring offsets will already be set up. In the case where we had to get some local store to hold offsets for backreference processing, copy those that we can. In this case there need not be overflow if certain parts of the pattern were not used, even though there are more capturing parentheses than vector slots. */ ENDLOOP: if (rc == MATCH_MATCH) { if (using_temporary_offsets) { if (offsetcount >= 4) { memcpy(offsets + 2, md->offset_vector + 2, (offsetcount - 2) * sizeof(int)); DPRINTF(("Copied offsets from temporary memory\n")); } if (md->end_offset_top > offsetcount) md->offset_overflow = TRUE; DPRINTF(("Freeing temporary memory\n")); (pcre_free)(md->offset_vector); } /* Set the return code to the number of captured strings, or 0 if there are too many to fit into the vector. */ rc = md->offset_overflow? 0 : md->end_offset_top/2; /* If there is space, set up the whole thing as substring 0. The value of md->start_match_ptr might be modified if \K was encountered on the success matching path. */ if (offsetcount < 2) rc = 0; else { offsets[0] = md->start_match_ptr - md->start_subject; offsets[1] = md->end_match_ptr - md->start_subject; } DPRINTF((">>>> returning %d\n", rc)); return rc; } /* Control gets here if there has been an error, or if the overall match attempt has failed at all permitted starting positions. */ if (using_temporary_offsets) { DPRINTF(("Freeing temporary memory\n")); (pcre_free)(md->offset_vector); } if (rc != MATCH_NOMATCH) { DPRINTF((">>>> error: returning %d\n", rc)); return rc; } else if (md->partial && md->hitend) { DPRINTF((">>>> returning PCRE_ERROR_PARTIAL\n")); return PCRE_ERROR_PARTIAL; } else { DPRINTF((">>>> returning PCRE_ERROR_NOMATCH\n")); return PCRE_ERROR_NOMATCH; } } /* End of pcre_exec.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_fullinfo.c0000644000373300037200000001216712424517753025250 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /*PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_fullinfo(), which returns information about a compiled pattern. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Return info about compiled pattern * *************************************************/ /* This is a newer "info" function which has an extensible interface so that additional items can be added compatibly. Arguments: argument_re points to compiled code extra_data points extra data, or NULL what what information is required where where to put the information Returns: 0 if data returned, negative on error */ PCRE_EXP_DEFN int pcre_fullinfo(const pcre *argument_re, const pcre_extra *extra_data, int what, void *where) { real_pcre internal_re; pcre_study_data internal_study; const real_pcre *re = (const real_pcre *)argument_re; const pcre_study_data *study = NULL; if (re == NULL || where == NULL) return PCRE_ERROR_NULL; if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0) study = (const pcre_study_data *)extra_data->study_data; if (re->magic_number != MAGIC_NUMBER) { re = _pcre_try_flipped(re, &internal_re, study, &internal_study); if (re == NULL) return PCRE_ERROR_BADMAGIC; if (study != NULL) study = &internal_study; } switch (what) { case PCRE_INFO_OPTIONS: *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; break; case PCRE_INFO_SIZE: *((size_t *)where) = re->size; break; case PCRE_INFO_STUDYSIZE: *((size_t *)where) = (study == NULL)? 0 : study->size; break; case PCRE_INFO_CAPTURECOUNT: *((int *)where) = re->top_bracket; break; case PCRE_INFO_BACKREFMAX: *((int *)where) = re->top_backref; break; case PCRE_INFO_FIRSTBYTE: *((int *)where) = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte : ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; break; /* Make sure we pass back the pointer to the bit vector in the external block, not the internal copy (with flipped integer fields). */ case PCRE_INFO_FIRSTTABLE: *((const uschar **)where) = (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL; break; case PCRE_INFO_LASTLITERAL: *((int *)where) = ((re->options & PCRE_REQCHSET) != 0)? re->req_byte : -1; break; case PCRE_INFO_NAMEENTRYSIZE: *((int *)where) = re->name_entry_size; break; case PCRE_INFO_NAMECOUNT: *((int *)where) = re->name_count; break; case PCRE_INFO_NAMETABLE: *((const uschar **)where) = (const uschar *)re + re->name_table_offset; break; case PCRE_INFO_DEFAULT_TABLES: *((const uschar **)where) = (const uschar *)(_pcre_default_tables); break; case PCRE_INFO_OKPARTIAL: *((int *)where) = (re->options & PCRE_NOPARTIAL) == 0; break; case PCRE_INFO_JCHANGED: *((int *)where) = (re->options & PCRE_JCHANGED) != 0; break; case PCRE_INFO_HASCRORLF: *((int *)where) = (re->options & PCRE_HASCRORLF) != 0; break; default: return PCRE_ERROR_BADOPTION; } return 0; } /* End of pcre_fullinfo.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_get.c0000644000373300037200000003554312424517753024214 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains some convenience functions for extracting substrings from the subject string after a regex match has succeeded. The original idea for these functions came from Scott Wimer. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Find number for named string * *************************************************/ /* This function is used by the get_first_set() function below, as well as being generally available. It assumes that names are unique. Arguments: code the compiled regex stringname the name whose number is required Returns: the number of the named parentheses, or a negative number (PCRE_ERROR_NOSUBSTRING) if not found */ int pcre_get_stringnumber(const pcre *code, const char *stringname) { int rc; int entrysize; int top, bot; uschar *nametable; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) return rc; if (top <= 0) return PCRE_ERROR_NOSUBSTRING; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) return rc; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) return rc; bot = 0; while (top > bot) { int mid = (top + bot) / 2; uschar *entry = nametable + entrysize*mid; int c = strcmp(stringname, (char *)(entry + 2)); if (c == 0) return (entry[0] << 8) + entry[1]; if (c > 0) bot = mid + 1; else top = mid; } return PCRE_ERROR_NOSUBSTRING; } /************************************************* * Find (multiple) entries for named string * *************************************************/ /* This is used by the get_first_set() function below, as well as being generally available. It is used when duplicated names are permitted. Arguments: code the compiled regex stringname the name whose entries required firstptr where to put the pointer to the first entry lastptr where to put the pointer to the last entry Returns: the length of each entry, or a negative number (PCRE_ERROR_NOSUBSTRING) if not found */ int pcre_get_stringtable_entries(const pcre *code, const char *stringname, char **firstptr, char **lastptr) { int rc; int entrysize; int top, bot; uschar *nametable, *lastentry; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMECOUNT, &top)) != 0) return rc; if (top <= 0) return PCRE_ERROR_NOSUBSTRING; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMEENTRYSIZE, &entrysize)) != 0) return rc; if ((rc = pcre_fullinfo(code, NULL, PCRE_INFO_NAMETABLE, &nametable)) != 0) return rc; lastentry = nametable + entrysize * (top - 1); bot = 0; while (top > bot) { int mid = (top + bot) / 2; uschar *entry = nametable + entrysize*mid; int c = strcmp(stringname, (char *)(entry + 2)); if (c == 0) { uschar *first = entry; uschar *last = entry; while (first > nametable) { if (strcmp(stringname, (char *)(first - entrysize + 2)) != 0) break; first -= entrysize; } while (last < lastentry) { if (strcmp(stringname, (char *)(last + entrysize + 2)) != 0) break; last += entrysize; } *firstptr = (char *)first; *lastptr = (char *)last; return entrysize; } if (c > 0) bot = mid + 1; else top = mid; } return PCRE_ERROR_NOSUBSTRING; } /************************************************* * Find first set of multiple named strings * *************************************************/ /* This function allows for duplicate names in the table of named substrings. It returns the number of the first one that was set in a pattern match. Arguments: code the compiled regex stringname the name of the capturing substring ovector the vector of matched substrings Returns: the number of the first that is set, or the number of the last one if none are set, or a negative number on error */ static int get_first_set(const pcre *code, const char *stringname, int *ovector) { const real_pcre *re = (const real_pcre *)code; int entrysize; char *first, *last; uschar *entry; if ((re->options & (PCRE_DUPNAMES | PCRE_JCHANGED)) == 0) return pcre_get_stringnumber(code, stringname); entrysize = pcre_get_stringtable_entries(code, stringname, &first, &last); if (entrysize <= 0) return entrysize; for (entry = (uschar *)first; entry <= (uschar *)last; entry += entrysize) { int n = (entry[0] << 8) + entry[1]; if (ovector[n*2] >= 0) return n; } return (first[0] << 8) + first[1]; } /************************************************* * Copy captured string to given buffer * *************************************************/ /* This function copies a single captured substring into a given buffer. Note that we use memcpy() rather than strncpy() in case there are binary zeros in the string. Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringnumber the number of the required substring buffer where to put the substring size the size of the buffer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) buffer too small PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int size) { int yield; if (stringnumber < 0 || stringnumber >= stringcount) return PCRE_ERROR_NOSUBSTRING; stringnumber *= 2; yield = ovector[stringnumber+1] - ovector[stringnumber]; if (size < yield + 1) return PCRE_ERROR_NOMEMORY; memcpy(buffer, subject + ovector[stringnumber], yield); buffer[yield] = 0; return yield; } /************************************************* * Copy named captured string to given buffer * *************************************************/ /* This function copies a single captured substring into a given buffer, identifying it by name. If the regex permits duplicate names, the first substring that is set is chosen. Arguments: code the compiled regex subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringname the name of the required substring buffer where to put the substring size the size of the buffer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) buffer too small PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, char *buffer, int size) { int n = get_first_set(code, stringname, ovector); if (n <= 0) return n; return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); } /************************************************* * Copy all captured strings to new store * *************************************************/ /* This function gets one chunk of store and builds a list of pointers and all of the captured substrings in it. A NULL pointer is put on the end of the list. Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) listptr set to point to the list of pointers Returns: if successful: 0 if not successful: PCRE_ERROR_NOMEMORY (-6) failed to get store */ int pcre_get_substring_list(const char *subject, int *ovector, int stringcount, const char ***listptr) { int i; int size = sizeof(char *); int double_count = stringcount * 2; char **stringlist; char *p; for (i = 0; i < double_count; i += 2) size += sizeof(char *) + ovector[i+1] - ovector[i] + 1; stringlist = (char **)(pcre_malloc)(size); if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; *listptr = (const char **)stringlist; p = (char *)(stringlist + stringcount + 1); for (i = 0; i < double_count; i += 2) { int len = ovector[i+1] - ovector[i]; memcpy(p, subject + ovector[i], len); *stringlist++ = p; p += len; *p++ = 0; } *stringlist = NULL; return 0; } /************************************************* * Free store obtained by get_substring_list * *************************************************/ /* This function exists for the benefit of people calling PCRE from non-C programs that can call its functions, but not free() or (pcre_free)() directly. Argument: the result of a previous pcre_get_substring_list() Returns: nothing */ void pcre_free_substring_list(const char **pointer) { (pcre_free)((void *)pointer); } /************************************************* * Copy captured string to new store * *************************************************/ /* This function copies a single captured substring into a piece of new store Arguments: subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringnumber the number of the required substring stringptr where to put a pointer to the substring Returns: if successful: the length of the string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) failed to get store PCRE_ERROR_NOSUBSTRING (-7) substring not present */ int pcre_get_substring(const char *subject, int *ovector, int stringcount, int stringnumber, const char **stringptr) { int yield; char *substring; if (stringnumber < 0 || stringnumber >= stringcount) return PCRE_ERROR_NOSUBSTRING; stringnumber *= 2; yield = ovector[stringnumber+1] - ovector[stringnumber]; substring = (char *)(pcre_malloc)(yield + 1); if (substring == NULL) return PCRE_ERROR_NOMEMORY; memcpy(substring, subject + ovector[stringnumber], yield); substring[yield] = 0; *stringptr = substring; return yield; } /************************************************* * Copy named captured string to new store * *************************************************/ /* This function copies a single captured substring, identified by name, into new store. If the regex permits duplicate names, the first substring that is set is chosen. Arguments: code the compiled regex subject the subject string that was matched ovector pointer to the offsets table stringcount the number of substrings that were captured (i.e. the yield of the pcre_exec call, unless that was zero, in which case it should be 1/3 of the offset table size) stringname the name of the required substring stringptr where to put the pointer Returns: if successful: the length of the copied string, not including the zero that is put on the end; can be zero if not successful: PCRE_ERROR_NOMEMORY (-6) couldn't get memory PCRE_ERROR_NOSUBSTRING (-7) no such captured substring */ int pcre_get_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, const char **stringptr) { int n = get_first_set(code, stringname, ovector); if (n <= 0) return n; return pcre_get_substring(subject, ovector, stringcount, n, stringptr); } /************************************************* * Free store obtained by get_substring * *************************************************/ /* This function exists for the benefit of people calling PCRE from non-C programs that can call its functions, but not free() or (pcre_free)() directly. Argument: the result of a previous pcre_get_substring() Returns: nothing */ void pcre_free_substring(const char *pointer) { (pcre_free)((void *)pointer); } /* End of pcre_get.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_globals.c0000644000373300037200000000564212424517753025055 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains global variables that are exported by the PCRE library. PCRE is thread-clean and doesn't use any global variables in the normal sense. However, it calls memory allocation and freeing functions via the four indirections below, and it can optionally do callouts, using the fifth indirection. These values can be changed by the caller, but are shared between all threads. However, when compiling for Virtual Pascal, things are done differently, and global variables are not used (see pcre.in). */ #include "pcre_setup.h" #include "pcre_internal.h" #ifndef VPCOMPAT PCRE_EXP_DATA_DEFN void *(*pcre_malloc)(size_t) = malloc; PCRE_EXP_DATA_DEFN void (*pcre_free)(void *) = free; PCRE_EXP_DATA_DEFN void *(*pcre_stack_malloc)(size_t) = malloc; PCRE_EXP_DATA_DEFN void (*pcre_stack_free)(void *) = free; PCRE_EXP_DATA_DEFN int (*pcre_callout)(pcre_callout_block *) = NULL; #endif /* End of pcre_globals.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_info.c0000644000373300037200000000743412424517753024366 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_info(), which gives some information about a compiled pattern. However, use of this function is now deprecated, as it has been superseded by pcre_fullinfo(). */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * (Obsolete) Return info about compiled pattern * *************************************************/ /* This is the original "info" function. It picks potentially useful data out of the private structure, but its interface was too rigid. It remains for backwards compatibility. The public options are passed back in an int - though the re->options field has been expanded to a long int, all the public options at the low end of it, and so even on 16-bit systems this will still be OK. Therefore, I haven't changed the API for pcre_info(). Arguments: argument_re points to compiled code optptr where to pass back the options first_byte where to pass back the first character, or -1 if multiline and all branches start ^, or -2 otherwise Returns: number of capturing subpatterns or negative values on error */ PCRE_EXP_DEFN int pcre_info(const pcre *argument_re, int *optptr, int *first_byte) { real_pcre internal_re; const real_pcre *re = (const real_pcre *)argument_re; if (re == NULL) return PCRE_ERROR_NULL; if (re->magic_number != MAGIC_NUMBER) { re = _pcre_try_flipped(re, &internal_re, NULL, NULL); if (re == NULL) return PCRE_ERROR_BADMAGIC; } if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS); if (first_byte != NULL) *first_byte = ((re->options & PCRE_FIRSTSET) != 0)? re->first_byte : ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; return re->top_bracket; } /* End of pcre_info.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_internal.h0000644000373300037200000013107712424517753025255 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This header contains definitions that are shared between the different modules, but which are not relevant to the exported API. This includes some functions whose names all begin with "_pcre_". */ #ifndef PCRE_INTERNAL_H #define PCRE_INTERNAL_H /* Define DEBUG to get debugging output on stdout. */ #if 0 #define DEBUG #endif /* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef inline, and there are *still* stupid compilers about that don't like indented pre-processor statements, or at least there were when I first wrote this. After all, it had only been about 10 years then... It turns out that the Mac Debugging.h header also defines the macro DPRINTF, so be absolutely sure we get our version. */ #undef DPRINTF #ifdef DEBUG #define DPRINTF(p) printf p #else #define DPRINTF(p) /* Nothing */ #endif /* Standard C headers plus the external interface definition. The only time setjmp and stdarg are used is when NO_RECURSE is set. */ #include #include #include #include #include #include #include #include /* When compiling a DLL for Windows, the exported symbols have to be declared using some MS magic. I found some useful information on this web page: http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the information there, using __declspec(dllexport) without "extern" we have a definition; with "extern" we have a declaration. The settings here override the setting in pcre.h (which is included below); it defines only PCRE_EXP_DECL, which is all that is needed for applications (they just import the symbols). We use: PCRE_EXP_DECL for declarations PCRE_EXP_DEFN for definitions of exported functions PCRE_EXP_DATA_DEFN for definitions of exported variables The reason for the two DEFN macros is that in non-Windows environments, one does not want to have "extern" before variable definitions because it leads to compiler warnings. So we distinguish between functions and variables. In Windows, the two should always be the same. The reason for wrapping this in #ifndef PCRE_EXP_DECL is so that pcretest, which is an application, but needs to import this file in order to "peek" at internals, can #include pcre.h first to get an application's-eye view. In principle, people compiling for non-Windows, non-Unix-like (i.e. uncommon, special-purpose environments) might want to stick other stuff in front of exported symbols. That's why, in the non-Windows case, we set PCRE_EXP_DEFN and PCRE_EXP_DATA_DEFN only if they are not already set. */ #ifndef PCRE_EXP_DECL # ifdef _WIN32 # ifndef PCRE_STATIC # define PCRE_EXP_DECL extern __declspec(dllexport) # define PCRE_EXP_DEFN __declspec(dllexport) # define PCRE_EXP_DATA_DEFN __declspec(dllexport) # else # define PCRE_EXP_DECL extern # define PCRE_EXP_DEFN # define PCRE_EXP_DATA_DEFN # endif # else # ifdef __cplusplus # define PCRE_EXP_DECL extern "C" # else # define PCRE_EXP_DECL extern # endif # ifndef PCRE_EXP_DEFN # define PCRE_EXP_DEFN PCRE_EXP_DECL # endif # ifndef PCRE_EXP_DATA_DEFN # define PCRE_EXP_DATA_DEFN # endif # endif #endif /* We need to have types that specify unsigned 16-bit and 32-bit integers. We cannot determine these outside the compilation (e.g. by running a program as part of "configure") because PCRE is often cross-compiled for use on other systems. Instead we make use of the maximum sizes that are available at preprocessor time in standard C environments. */ #if USHRT_MAX == 65535 typedef unsigned short pcre_uint16; #elif UINT_MAX == 65535 typedef unsigned int pcre_uint16; #else #error Cannot determine a type for 16-bit unsigned integers #endif #if UINT_MAX == 4294967295 typedef unsigned int pcre_uint32; #elif ULONG_MAX == 4294967295 typedef unsigned long int pcre_uint32; #else #error Cannot determine a type for 32-bit unsigned integers #endif /* All character handling must be done as unsigned characters. Otherwise there are problems with top-bit-set characters and functions such as isspace(). However, we leave the interface to the outside world as char *, because that should make things easier for callers. We define a short type for unsigned char to save lots of typing. I tried "uchar", but it causes problems on Digital Unix, where it is defined in sys/types, so use "uschar" instead. */ typedef unsigned char uschar; /* This is an unsigned int value that no character can ever have. UTF-8 characters only go up to 0x7fffffff (though Unicode doesn't go beyond 0x0010ffff). */ #define NOTACHAR 0xffffffff /* PCRE is able to support several different kinds of newline (CR, LF, CRLF, "any" and "anycrlf" at present). The following macros are used to package up testing for newlines. NLBLOCK, PSSTART, and PSEND are defined in the various modules to indicate in which datablock the parameters exist, and what the start/end of string field names are. */ #define NLTYPE_FIXED 0 /* Newline is a fixed length string */ #define NLTYPE_ANY 1 /* Newline is any Unicode line ending */ #define NLTYPE_ANYCRLF 2 /* Newline is CR, LF, or CRLF */ /* This macro checks for a newline at the given position */ #define IS_NEWLINE(p) \ ((NLBLOCK->nltype != NLTYPE_FIXED)? \ ((p) < NLBLOCK->PSEND && \ _pcre_is_newline((p), NLBLOCK->nltype, NLBLOCK->PSEND, &(NLBLOCK->nllen),\ utf8)) \ : \ ((p) <= NLBLOCK->PSEND - NLBLOCK->nllen && \ (p)[0] == NLBLOCK->nl[0] && \ (NLBLOCK->nllen == 1 || (p)[1] == NLBLOCK->nl[1]) \ ) \ ) /* This macro checks for a newline immediately preceding the given position */ #define WAS_NEWLINE(p) \ ((NLBLOCK->nltype != NLTYPE_FIXED)? \ ((p) > NLBLOCK->PSSTART && \ _pcre_was_newline((p), NLBLOCK->nltype, NLBLOCK->PSSTART, \ &(NLBLOCK->nllen), utf8)) \ : \ ((p) >= NLBLOCK->PSSTART + NLBLOCK->nllen && \ (p)[-NLBLOCK->nllen] == NLBLOCK->nl[0] && \ (NLBLOCK->nllen == 1 || (p)[-NLBLOCK->nllen+1] == NLBLOCK->nl[1]) \ ) \ ) /* When PCRE is compiled as a C++ library, the subject pointer can be replaced with a custom type. This makes it possible, for example, to allow pcre_exec() to process subject strings that are discontinuous by using a smart pointer class. It must always be possible to inspect all of the subject string in pcre_exec() because of the way it backtracks. Two macros are required in the normal case, for sign-unspecified and unsigned char pointers. The former is used for the external interface and appears in pcre.h, which is why its name must begin with PCRE_. */ #ifdef CUSTOM_SUBJECT_PTR #define PCRE_SPTR CUSTOM_SUBJECT_PTR #define USPTR CUSTOM_SUBJECT_PTR #else #define PCRE_SPTR const char * #define USPTR const unsigned char * #endif /* Include the public PCRE header and the definitions of UCP character property values. */ #include "pcre.h" #include "ucp.h" /* When compiling for use with the Virtual Pascal compiler, these functions need to have their names changed. PCRE must be compiled with the -DVPCOMPAT option on the command line. */ #ifdef VPCOMPAT #define strlen(s) _strlen(s) #define strncmp(s1,s2,m) _strncmp(s1,s2,m) #define memcmp(s,c,n) _memcmp(s,c,n) #define memcpy(d,s,n) _memcpy(d,s,n) #define memmove(d,s,n) _memmove(d,s,n) #define memset(s,c,n) _memset(s,c,n) #else /* VPCOMPAT */ /* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY is set. Otherwise, include an emulating function for those systems that have neither (there some non-Unix environments where this is the case). */ #ifndef HAVE_MEMMOVE #undef memmove /* some systems may have a macro */ #ifdef HAVE_BCOPY #define memmove(a, b, c) bcopy(b, a, c) #else /* HAVE_BCOPY */ static void * pcre_memmove(void *d, const void *s, size_t n) { size_t i; unsigned char *dest = (unsigned char *)d; const unsigned char *src = (const unsigned char *)s; if (dest > src) { dest += n; src += n; for (i = 0; i < n; ++i) *(--dest) = *(--src); return (void *)dest; } else { for (i = 0; i < n; ++i) *dest++ = *src++; return (void *)(dest - n); } } #define memmove(a, b, c) pcre_memmove(a, b, c) #endif /* not HAVE_BCOPY */ #endif /* not HAVE_MEMMOVE */ #endif /* not VPCOMPAT */ /* PCRE keeps offsets in its compiled code as 2-byte quantities (always stored in big-endian order) by default. These are used, for example, to link from the start of a subpattern to its alternatives and its end. The use of 2 bytes per offset limits the size of the compiled regex to around 64K, which is big enough for almost everybody. However, I received a request for an even bigger limit. For this reason, and also to make the code easier to maintain, the storing and loading of offsets from the byte string is now handled by the macros that are defined here. The macros are controlled by the value of LINK_SIZE. This defaults to 2 in the config.h file, but can be overridden by using -D on the command line. This is automated on Unix systems via the "configure" command. */ #if LINK_SIZE == 2 #define PUT(a,n,d) \ (a[n] = (d) >> 8), \ (a[(n)+1] = (d) & 255) #define GET(a,n) \ (((a)[n] << 8) | (a)[(n)+1]) #define MAX_PATTERN_SIZE (1 << 16) #elif LINK_SIZE == 3 #define PUT(a,n,d) \ (a[n] = (d) >> 16), \ (a[(n)+1] = (d) >> 8), \ (a[(n)+2] = (d) & 255) #define GET(a,n) \ (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2]) #define MAX_PATTERN_SIZE (1 << 24) #elif LINK_SIZE == 4 #define PUT(a,n,d) \ (a[n] = (d) >> 24), \ (a[(n)+1] = (d) >> 16), \ (a[(n)+2] = (d) >> 8), \ (a[(n)+3] = (d) & 255) #define GET(a,n) \ (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3]) #define MAX_PATTERN_SIZE (1 << 30) /* Keep it positive */ #else #error LINK_SIZE must be either 2, 3, or 4 #endif /* Convenience macro defined in terms of the others */ #define PUTINC(a,n,d) PUT(a,n,d), a += LINK_SIZE /* PCRE uses some other 2-byte quantities that do not change when the size of offsets changes. There are used for repeat counts and for other things such as capturing parenthesis numbers in back references. */ #define PUT2(a,n,d) \ a[n] = (d) >> 8; \ a[(n)+1] = (d) & 255 #define GET2(a,n) \ (((a)[n] << 8) | (a)[(n)+1]) #define PUT2INC(a,n,d) PUT2(a,n,d), a += 2 /* When UTF-8 encoding is being used, a character is no longer just a single byte. The macros for character handling generate simple sequences when used in byte-mode, and more complicated ones for UTF-8 characters. BACKCHAR should never be called in byte mode. To make sure it can never even appear when UTF-8 support is omitted, we don't even define it. */ #ifndef SUPPORT_UTF8 #define GETCHAR(c, eptr) c = *eptr; #define GETCHARTEST(c, eptr) c = *eptr; #define GETCHARINC(c, eptr) c = *eptr++; #define GETCHARINCTEST(c, eptr) c = *eptr++; #define GETCHARLEN(c, eptr, len) c = *eptr; /* #define BACKCHAR(eptr) */ #else /* SUPPORT_UTF8 */ /* Get the next UTF-8 character, not advancing the pointer. This is called when we know we are in UTF-8 mode. */ #define GETCHAR(c, eptr) \ c = *eptr; \ if (c >= 0xc0) \ { \ int gcii; \ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ for (gcii = 1; gcii <= gcaa; gcii++) \ { \ gcss -= 6; \ c |= (eptr[gcii] & 0x3f) << gcss; \ } \ } /* Get the next UTF-8 character, testing for UTF-8 mode, and not advancing the pointer. */ #define GETCHARTEST(c, eptr) \ c = *eptr; \ if (utf8 && c >= 0xc0) \ { \ int gcii; \ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ for (gcii = 1; gcii <= gcaa; gcii++) \ { \ gcss -= 6; \ c |= (eptr[gcii] & 0x3f) << gcss; \ } \ } /* Get the next UTF-8 character, advancing the pointer. This is called when we know we are in UTF-8 mode. */ #define GETCHARINC(c, eptr) \ c = *eptr++; \ if (c >= 0xc0) \ { \ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ while (gcaa-- > 0) \ { \ gcss -= 6; \ c |= (*eptr++ & 0x3f) << gcss; \ } \ } /* Get the next character, testing for UTF-8 mode, and advancing the pointer */ #define GETCHARINCTEST(c, eptr) \ c = *eptr++; \ if (utf8 && c >= 0xc0) \ { \ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ while (gcaa-- > 0) \ { \ gcss -= 6; \ c |= (*eptr++ & 0x3f) << gcss; \ } \ } /* Get the next UTF-8 character, not advancing the pointer, incrementing length if there are extra bytes. This is called when we know we are in UTF-8 mode. */ #define GETCHARLEN(c, eptr, len) \ c = *eptr; \ if (c >= 0xc0) \ { \ int gcii; \ int gcaa = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ int gcss = 6*gcaa; \ c = (c & _pcre_utf8_table3[gcaa]) << gcss; \ for (gcii = 1; gcii <= gcaa; gcii++) \ { \ gcss -= 6; \ c |= (eptr[gcii] & 0x3f) << gcss; \ } \ len += gcaa; \ } /* If the pointer is not at the start of a character, move it back until it is. This is called only in UTF-8 mode - we don't put a test within the macro because almost all calls are already within a block of UTF-8 only code. */ #define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr-- #endif /* In case there is no definition of offsetof() provided - though any proper Standard C system should have one. */ #ifndef offsetof #define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) #endif /* These are the public options that can change during matching. */ #define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) /* Private options flags start at the most significant end of the four bytes. The public options defined in pcre.h start at the least significant end. Make sure they don't overlap! The bits are getting a bit scarce now -- when we run out, there is a dummy word in the structure that could be used for the private bits. */ #define PCRE_NOPARTIAL 0x80000000 /* can't use partial with this regex */ #define PCRE_FIRSTSET 0x40000000 /* first_byte is set */ #define PCRE_REQCHSET 0x20000000 /* req_byte is set */ #define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ #define PCRE_JCHANGED 0x08000000 /* j option changes within regex */ #define PCRE_HASCRORLF 0x04000000 /* explicit \r or \n in pattern */ /* Options for the "extra" block produced by pcre_study(). */ #define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ /* Masks for identifying the public options that are permitted at compile time, run time, or study time, respectively. */ #define PCRE_NEWLINE_BITS (PCRE_NEWLINE_CR|PCRE_NEWLINE_LF|PCRE_NEWLINE_ANY| \ PCRE_NEWLINE_ANYCRLF) #define PUBLIC_OPTIONS \ (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8| \ PCRE_NO_AUTO_CAPTURE|PCRE_NO_UTF8_CHECK|PCRE_AUTO_CALLOUT|PCRE_FIRSTLINE| \ PCRE_DUPNAMES|PCRE_NEWLINE_BITS) #define PUBLIC_EXEC_OPTIONS \ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ PCRE_PARTIAL|PCRE_NEWLINE_BITS) #define PUBLIC_DFA_EXEC_OPTIONS \ (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY|PCRE_NO_UTF8_CHECK| \ PCRE_PARTIAL|PCRE_DFA_SHORTEST|PCRE_DFA_RESTART|PCRE_NEWLINE_BITS) #define PUBLIC_STUDY_OPTIONS 0 /* None defined */ /* Magic number to provide a small check against being handed junk. Also used to detect whether a pattern was compiled on a host of different endianness. */ #define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ /* Negative values for the firstchar and reqchar variables */ #define REQ_UNSET (-2) #define REQ_NONE (-1) /* The maximum remaining length of subject we are prepared to search for a req_byte match. */ #define REQ_BYTE_MAX 1000 /* Flags added to firstbyte or reqbyte; a "non-literal" item is either a variable-length repeat, or a anything other than literal characters. */ #define REQ_CASELESS 0x0100 /* indicates caselessness */ #define REQ_VARY 0x0200 /* reqbyte followed non-literal item */ /* Miscellaneous definitions */ typedef int BOOL; #define FALSE 0 #define TRUE 1 /* Escape items that are just an encoding of a particular data value. */ #ifndef ESC_e #define ESC_e 27 #endif #ifndef ESC_f #define ESC_f '\f' #endif #ifndef ESC_n #define ESC_n '\n' #endif #ifndef ESC_r #define ESC_r '\r' #endif /* We can't officially use ESC_t because it is a POSIX reserved identifier (presumably because of all the others like size_t). */ #ifndef ESC_tee #define ESC_tee '\t' #endif /* Codes for different types of Unicode property */ #define PT_ANY 0 /* Any property - matches all chars */ #define PT_LAMP 1 /* L& - the union of Lu, Ll, Lt */ #define PT_GC 2 /* General characteristic (e.g. L) */ #define PT_PC 3 /* Particular characteristic (e.g. Lu) */ #define PT_SC 4 /* Script (e.g. Han) */ /* Flag bits and data types for the extended class (OP_XCLASS) for classes that contain UTF-8 characters with values greater than 255. */ #define XCL_NOT 0x01 /* Flag: this is a negative class */ #define XCL_MAP 0x02 /* Flag: a 32-byte map is present */ #define XCL_END 0 /* Marks end of individual items */ #define XCL_SINGLE 1 /* Single item (one multibyte char) follows */ #define XCL_RANGE 2 /* A range (two multibyte chars) follows */ #define XCL_PROP 3 /* Unicode property (2-byte property code follows) */ #define XCL_NOTPROP 4 /* Unicode inverted property (ditto) */ /* These are escaped items that aren't just an encoding of a particular data value such as \n. They must have non-zero values, as check_escape() returns their negation. Also, they must appear in the same order as in the opcode definitions below, up to ESC_z. There's a dummy for OP_ANY because it corresponds to "." rather than an escape sequence. The final one must be ESC_REF as subsequent values are used for backreferences (\1, \2, \3, etc). There are two tests in the code for an escape greater than ESC_b and less than ESC_Z to detect the types that may be repeated. These are the types that consume characters. If any new escapes are put in between that don't consume a character, that code will have to change. */ enum { ESC_A = 1, ESC_G, ESC_K, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w, ESC_dum1, ESC_C, ESC_P, ESC_p, ESC_R, ESC_H, ESC_h, ESC_V, ESC_v, ESC_X, ESC_Z, ESC_z, ESC_E, ESC_Q, ESC_k, ESC_REF }; /* Opcode table: Starting from 1 (i.e. after OP_END), the values up to OP_EOD must correspond in order to the list of escapes immediately above. *** NOTE NOTE NOTE *** Whenever this list is updated, the two macro definitions that follow must also be updated to match. There is also a table called "coptable" in pcre_dfa_exec.c that must be updated. */ enum { OP_END, /* 0 End of pattern */ /* Values corresponding to backslashed metacharacters */ OP_SOD, /* 1 Start of data: \A */ OP_SOM, /* 2 Start of match (subject + offset): \G */ OP_SET_SOM, /* 3 Set start of match (\K) */ OP_NOT_WORD_BOUNDARY, /* 4 \B */ OP_WORD_BOUNDARY, /* 5 \b */ OP_NOT_DIGIT, /* 6 \D */ OP_DIGIT, /* 7 \d */ OP_NOT_WHITESPACE, /* 8 \S */ OP_WHITESPACE, /* 9 \s */ OP_NOT_WORDCHAR, /* 10 \W */ OP_WORDCHAR, /* 11 \w */ OP_ANY, /* 12 Match any character */ OP_ANYBYTE, /* 13 Match any byte (\C); different to OP_ANY for UTF-8 */ OP_NOTPROP, /* 14 \P (not Unicode property) */ OP_PROP, /* 15 \p (Unicode property) */ OP_ANYNL, /* 16 \R (any newline sequence) */ OP_NOT_HSPACE, /* 17 \H (not horizontal whitespace) */ OP_HSPACE, /* 18 \h (horizontal whitespace) */ OP_NOT_VSPACE, /* 19 \V (not vertical whitespace) */ OP_VSPACE, /* 20 \v (vertical whitespace) */ OP_EXTUNI, /* 21 \X (extended Unicode sequence */ OP_EODN, /* 22 End of data or \n at end of data: \Z. */ OP_EOD, /* 23 End of data: \z */ OP_OPT, /* 24 Set runtime options */ OP_CIRC, /* 25 Start of line - varies with multiline switch */ OP_DOLL, /* 26 End of line - varies with multiline switch */ OP_CHAR, /* 27 Match one character, casefully */ OP_CHARNC, /* 28 Match one character, caselessly */ OP_NOT, /* 29 Match one character, not the following one */ OP_STAR, /* 30 The maximizing and minimizing versions of */ OP_MINSTAR, /* 31 these six opcodes must come in pairs, with */ OP_PLUS, /* 32 the minimizing one second. */ OP_MINPLUS, /* 33 This first set applies to single characters.*/ OP_QUERY, /* 34 */ OP_MINQUERY, /* 35 */ OP_UPTO, /* 36 From 0 to n matches */ OP_MINUPTO, /* 37 */ OP_EXACT, /* 38 Exactly n matches */ OP_POSSTAR, /* 39 Possessified star */ OP_POSPLUS, /* 40 Possessified plus */ OP_POSQUERY, /* 41 Posesssified query */ OP_POSUPTO, /* 42 Possessified upto */ OP_NOTSTAR, /* 43 The maximizing and minimizing versions of */ OP_NOTMINSTAR, /* 44 these six opcodes must come in pairs, with */ OP_NOTPLUS, /* 45 the minimizing one second. They must be in */ OP_NOTMINPLUS, /* 46 exactly the same order as those above. */ OP_NOTQUERY, /* 47 This set applies to "not" single characters. */ OP_NOTMINQUERY, /* 48 */ OP_NOTUPTO, /* 49 From 0 to n matches */ OP_NOTMINUPTO, /* 50 */ OP_NOTEXACT, /* 51 Exactly n matches */ OP_NOTPOSSTAR, /* 52 Possessified versions */ OP_NOTPOSPLUS, /* 53 */ OP_NOTPOSQUERY, /* 54 */ OP_NOTPOSUPTO, /* 55 */ OP_TYPESTAR, /* 56 The maximizing and minimizing versions of */ OP_TYPEMINSTAR, /* 57 these six opcodes must come in pairs, with */ OP_TYPEPLUS, /* 58 the minimizing one second. These codes must */ OP_TYPEMINPLUS, /* 59 be in exactly the same order as those above. */ OP_TYPEQUERY, /* 60 This set applies to character types such as \d */ OP_TYPEMINQUERY, /* 61 */ OP_TYPEUPTO, /* 62 From 0 to n matches */ OP_TYPEMINUPTO, /* 63 */ OP_TYPEEXACT, /* 64 Exactly n matches */ OP_TYPEPOSSTAR, /* 65 Possessified versions */ OP_TYPEPOSPLUS, /* 66 */ OP_TYPEPOSQUERY, /* 67 */ OP_TYPEPOSUPTO, /* 68 */ OP_CRSTAR, /* 69 The maximizing and minimizing versions of */ OP_CRMINSTAR, /* 70 all these opcodes must come in pairs, with */ OP_CRPLUS, /* 71 the minimizing one second. These codes must */ OP_CRMINPLUS, /* 72 be in exactly the same order as those above. */ OP_CRQUERY, /* 73 These are for character classes and back refs */ OP_CRMINQUERY, /* 74 */ OP_CRRANGE, /* 75 These are different to the three sets above. */ OP_CRMINRANGE, /* 76 */ OP_CLASS, /* 77 Match a character class, chars < 256 only */ OP_NCLASS, /* 78 Same, but the bitmap was created from a negative class - the difference is relevant only when a UTF-8 character > 255 is encountered. */ OP_XCLASS, /* 79 Extended class for handling UTF-8 chars within the class. This does both positive and negative. */ OP_REF, /* 80 Match a back reference */ OP_RECURSE, /* 81 Match a numbered subpattern (possibly recursive) */ OP_CALLOUT, /* 82 Call out to external function if provided */ OP_ALT, /* 83 Start of alternation */ OP_KET, /* 84 End of group that doesn't have an unbounded repeat */ OP_KETRMAX, /* 85 These two must remain together and in this */ OP_KETRMIN, /* 86 order. They are for groups the repeat for ever. */ /* The assertions must come before BRA, CBRA, ONCE, and COND.*/ OP_ASSERT, /* 87 Positive lookahead */ OP_ASSERT_NOT, /* 88 Negative lookahead */ OP_ASSERTBACK, /* 89 Positive lookbehind */ OP_ASSERTBACK_NOT, /* 90 Negative lookbehind */ OP_REVERSE, /* 91 Move pointer back - used in lookbehind assertions */ /* ONCE, BRA, CBRA, and COND must come after the assertions, with ONCE first, as there's a test for >= ONCE for a subpattern that isn't an assertion. */ OP_ONCE, /* 92 Atomic group */ OP_BRA, /* 93 Start of non-capturing bracket */ OP_CBRA, /* 94 Start of capturing bracket */ OP_COND, /* 95 Conditional group */ /* These three must follow the previous three, in the same order. There's a check for >= SBRA to distinguish the two sets. */ OP_SBRA, /* 96 Start of non-capturing bracket, check empty */ OP_SCBRA, /* 97 Start of capturing bracket, check empty */ OP_SCOND, /* 98 Conditional group, check empty */ OP_CREF, /* 99 Used to hold a capture number as condition */ OP_RREF, /* 100 Used to hold a recursion number as condition */ OP_DEF, /* 101 The DEFINE condition */ OP_BRAZERO, /* 102 These two must remain together and in this */ OP_BRAMINZERO, /* 103 order. */ /* These are backtracking control verbs */ OP_PRUNE, /* 104 */ OP_SKIP, /* 105 */ OP_THEN, /* 106 */ OP_COMMIT, /* 107 */ /* These are forced failure and success verbs */ OP_FAIL, /* 108 */ OP_ACCEPT /* 109 */ }; /* This macro defines textual names for all the opcodes. These are used only for debugging. The macro is referenced only in pcre_printint.c. */ #define OP_NAME_LIST \ "End", "\\A", "\\G", "\\K", "\\B", "\\b", "\\D", "\\d", \ "\\S", "\\s", "\\W", "\\w", "Any", "Anybyte", \ "notprop", "prop", "\\R", "\\H", "\\h", "\\V", "\\v", \ "extuni", "\\Z", "\\z", \ "Opt", "^", "$", "char", "charnc", "not", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*+","++", "?+", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*+","++", "?+", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", "{", \ "*+","++", "?+", "{", \ "*", "*?", "+", "+?", "?", "??", "{", "{", \ "class", "nclass", "xclass", "Ref", "Recurse", "Callout", \ "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", \ "AssertB", "AssertB not", "Reverse", \ "Once", "Bra", "CBra", "Cond", "SBra", "SCBra", "SCond", \ "Cond ref", "Cond rec", "Cond def", "Brazero", "Braminzero", \ "*PRUNE", "*SKIP", "*THEN", "*COMMIT", "*FAIL", "*ACCEPT" /* This macro defines the length of fixed length operations in the compiled regex. The lengths are used when searching for specific things, and also in the debugging printing of a compiled regex. We use a macro so that it can be defined close to the definitions of the opcodes themselves. As things have been extended, some of these are no longer fixed lenths, but are minima instead. For example, the length of a single-character repeat may vary in UTF-8 mode. The code that uses this table must know about such things. */ #define OP_LENGTHS \ 1, /* End */ \ 1, 1, 1, 1, 1, /* \A, \G, \K, \B, \b */ \ 1, 1, 1, 1, 1, 1, /* \D, \d, \S, \s, \W, \w */ \ 1, 1, /* Any, Anybyte */ \ 3, 3, 1, /* NOTPROP, PROP, EXTUNI */ \ 1, 1, 1, 1, 1, /* \R, \H, \h, \V, \v */ \ 1, 1, 2, 1, 1, /* \Z, \z, Opt, ^, $ */ \ 2, /* Char - the minimum length */ \ 2, /* Charnc - the minimum length */ \ 2, /* not */ \ /* Positive single-char repeats ** These are */ \ 2, 2, 2, 2, 2, 2, /* *, *?, +, +?, ?, ?? ** minima in */ \ 4, 4, 4, /* upto, minupto, exact ** UTF-8 mode */ \ 2, 2, 2, 4, /* *+, ++, ?+, upto+ */ \ /* Negative single-char repeats - only for chars < 256 */ \ 2, 2, 2, 2, 2, 2, /* NOT *, *?, +, +?, ?, ?? */ \ 4, 4, 4, /* NOT upto, minupto, exact */ \ 2, 2, 2, 4, /* Possessive *, +, ?, upto */ \ /* Positive type repeats */ \ 2, 2, 2, 2, 2, 2, /* Type *, *?, +, +?, ?, ?? */ \ 4, 4, 4, /* Type upto, minupto, exact */ \ 2, 2, 2, 4, /* Possessive *+, ++, ?+, upto+ */ \ /* Character class & ref repeats */ \ 1, 1, 1, 1, 1, 1, /* *, *?, +, +?, ?, ?? */ \ 5, 5, /* CRRANGE, CRMINRANGE */ \ 33, /* CLASS */ \ 33, /* NCLASS */ \ 0, /* XCLASS - variable length */ \ 3, /* REF */ \ 1+LINK_SIZE, /* RECURSE */ \ 2+2*LINK_SIZE, /* CALLOUT */ \ 1+LINK_SIZE, /* Alt */ \ 1+LINK_SIZE, /* Ket */ \ 1+LINK_SIZE, /* KetRmax */ \ 1+LINK_SIZE, /* KetRmin */ \ 1+LINK_SIZE, /* Assert */ \ 1+LINK_SIZE, /* Assert not */ \ 1+LINK_SIZE, /* Assert behind */ \ 1+LINK_SIZE, /* Assert behind not */ \ 1+LINK_SIZE, /* Reverse */ \ 1+LINK_SIZE, /* ONCE */ \ 1+LINK_SIZE, /* BRA */ \ 3+LINK_SIZE, /* CBRA */ \ 1+LINK_SIZE, /* COND */ \ 1+LINK_SIZE, /* SBRA */ \ 3+LINK_SIZE, /* SCBRA */ \ 1+LINK_SIZE, /* SCOND */ \ 3, /* CREF */ \ 3, /* RREF */ \ 1, /* DEF */ \ 1, 1, /* BRAZERO, BRAMINZERO */ \ 1, 1, 1, 1, /* PRUNE, SKIP, THEN, COMMIT, */ \ 1, 1 /* FAIL, ACCEPT */ /* A magic value for OP_RREF to indicate the "any recursion" condition. */ #define RREF_ANY 0xffff /* Error code numbers. They are given names so that they can more easily be tracked. */ enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20, ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR28, ERR29, ERR30, ERR31, ERR32, ERR33, ERR34, ERR35, ERR36, ERR37, ERR38, ERR39, ERR40, ERR41, ERR42, ERR43, ERR44, ERR45, ERR46, ERR47, ERR48, ERR49, ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, ERR60, ERR61 }; /* The real format of the start of the pcre block; the index of names and the code vector run on as long as necessary after the end. We store an explicit offset to the name table so that if a regex is compiled on one host, saved, and then run on another where the size of pointers is different, all might still be well. For the case of compiled-on-4 and run-on-8, we include an extra pointer that is always NULL. For future-proofing, a few dummy fields were originally included - even though you can never get this planning right - but there is only one left now. NOTE NOTE NOTE: Because people can now save and re-use compiled patterns, any additions to this structure should be made at the end, and something earlier (e.g. a new flag in the options or one of the dummy fields) should indicate that the new fields are present. Currently PCRE always sets the dummy fields to zero. NOTE NOTE NOTE: */ typedef struct real_pcre { pcre_uint32 magic_number; pcre_uint32 size; /* Total that was malloced */ pcre_uint32 options; pcre_uint32 dummy1; /* For future use, maybe */ pcre_uint16 top_bracket; pcre_uint16 top_backref; pcre_uint16 first_byte; pcre_uint16 req_byte; pcre_uint16 name_table_offset; /* Offset to name table that follows */ pcre_uint16 name_entry_size; /* Size of any name items */ pcre_uint16 name_count; /* Number of name items */ pcre_uint16 ref_count; /* Reference count */ const unsigned char *tables; /* Pointer to tables or NULL for std */ const unsigned char *nullpad; /* NULL padding */ } real_pcre; /* The format of the block used to store data from pcre_study(). The same remark (see NOTE above) about extending this structure applies. */ typedef struct pcre_study_data { pcre_uint32 size; /* Total that was malloced */ pcre_uint32 options; uschar start_bits[32]; } pcre_study_data; /* Structure for passing "static" information around between the functions doing the compiling, so that they are thread-safe. */ typedef struct compile_data { const uschar *lcc; /* Points to lower casing table */ const uschar *fcc; /* Points to case-flipping table */ const uschar *cbits; /* Points to character type table */ const uschar *ctypes; /* Points to table of type maps */ const uschar *start_workspace;/* The start of working space */ const uschar *start_code; /* The start of the compiled code */ const uschar *start_pattern; /* The start of the pattern */ const uschar *end_pattern; /* The end of the pattern */ uschar *hwm; /* High watermark of workspace */ uschar *name_table; /* The name/number table */ int names_found; /* Number of entries so far */ int name_entry_size; /* Size of each entry */ int bracount; /* Count of capturing parens */ int top_backref; /* Maximum back reference */ unsigned int backref_map; /* Bitmap of low back refs */ int external_options; /* External (initial) options */ int req_varyopt; /* "After variable item" flag for reqbyte */ BOOL nopartial; /* Set TRUE if partial won't work */ BOOL had_accept; /* (*ACCEPT) encountered */ int nltype; /* Newline type */ int nllen; /* Newline string length */ uschar nl[4]; /* Newline string when fixed length */ } compile_data; /* Structure for maintaining a chain of pointers to the currently incomplete branches, for testing for left recursion. */ typedef struct branch_chain { struct branch_chain *outer; uschar *current; } branch_chain; /* Structure for items in a linked list that represents an explicit recursive call within the pattern. */ typedef struct recursion_info { struct recursion_info *prevrec; /* Previous recursion record (or NULL) */ int group_num; /* Number of group that was called */ const uschar *after_call; /* "Return value": points after the call in the expr */ USPTR save_start; /* Old value of mstart */ int *offset_save; /* Pointer to start of saved offsets */ int saved_max; /* Number of saved offsets */ } recursion_info; /* Structure for building a chain of data for holding the values of the subject pointer at the start of each subpattern, so as to detect when an empty string has been matched by a subpattern - to break infinite loops. */ typedef struct eptrblock { struct eptrblock *epb_prev; USPTR epb_saved_eptr; } eptrblock; /* Structure for passing "static" information around between the functions doing traditional NFA matching, so that they are thread-safe. */ typedef struct match_data { unsigned long int match_call_count; /* As it says */ unsigned long int match_limit; /* As it says */ unsigned long int match_limit_recursion; /* As it says */ int *offset_vector; /* Offset vector */ int offset_end; /* One past the end */ int offset_max; /* The maximum usable for return data */ int nltype; /* Newline type */ int nllen; /* Newline string length */ uschar nl[4]; /* Newline string when fixed */ const uschar *lcc; /* Points to lower casing table */ const uschar *ctypes; /* Points to table of type maps */ BOOL offset_overflow; /* Set if too many extractions */ BOOL notbol; /* NOTBOL flag */ BOOL noteol; /* NOTEOL flag */ BOOL utf8; /* UTF8 flag */ BOOL endonly; /* Dollar not before final \n */ BOOL notempty; /* Empty string match not wanted */ BOOL partial; /* PARTIAL flag */ BOOL hitend; /* Hit the end of the subject at some point */ const uschar *start_code; /* For use when recursing */ USPTR start_subject; /* Start of the subject string */ USPTR end_subject; /* End of the subject string */ USPTR start_match_ptr; /* Start of matched string */ USPTR end_match_ptr; /* Subject position at end match */ int end_offset_top; /* Highwater mark at end of match */ int capture_last; /* Most recent capture number */ int start_offset; /* The start offset value */ eptrblock *eptrchain; /* Chain of eptrblocks for tail recursions */ int eptrn; /* Next free eptrblock */ recursion_info *recursive; /* Linked list of recursion data */ void *callout_data; /* To pass back to callouts */ } match_data; /* A similar structure is used for the same purpose by the DFA matching functions. */ typedef struct dfa_match_data { const uschar *start_code; /* Start of the compiled pattern */ const uschar *start_subject; /* Start of the subject string */ const uschar *end_subject; /* End of subject string */ const uschar *tables; /* Character tables */ int moptions; /* Match options */ int poptions; /* Pattern options */ int nltype; /* Newline type */ int nllen; /* Newline string length */ uschar nl[4]; /* Newline string when fixed */ void *callout_data; /* To pass back to callouts */ } dfa_match_data; /* Bit definitions for entries in the pcre_ctypes table. */ #define ctype_space 0x01 #define ctype_letter 0x02 #define ctype_digit 0x04 #define ctype_xdigit 0x08 #define ctype_word 0x10 /* alphameric or '_' */ #define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ /* Offsets for the bitmap tables in pcre_cbits. Each table contains a set of bits for a class map. Some classes are built by combining these tables. */ #define cbit_space 0 /* [:space:] or \s */ #define cbit_xdigit 32 /* [:xdigit:] */ #define cbit_digit 64 /* [:digit:] or \d */ #define cbit_upper 96 /* [:upper:] */ #define cbit_lower 128 /* [:lower:] */ #define cbit_word 160 /* [:word:] or \w */ #define cbit_graph 192 /* [:graph:] */ #define cbit_print 224 /* [:print:] */ #define cbit_punct 256 /* [:punct:] */ #define cbit_cntrl 288 /* [:cntrl:] */ #define cbit_length 320 /* Length of the cbits table */ /* Offsets of the various tables from the base tables pointer, and total length. */ #define lcc_offset 0 #define fcc_offset 256 #define cbits_offset 512 #define ctypes_offset (cbits_offset + cbit_length) #define tables_length (ctypes_offset + 256) /* Layout of the UCP type table that translates property names into types and codes. */ typedef struct { const char *name; pcre_uint16 type; pcre_uint16 value; } ucp_type_table; /* Internal shared data tables. These are tables that are used by more than one of the exported public functions. They have to be "external" in the C sense, but are not part of the PCRE public API. The data for these tables is in the pcre_tables.c module. */ extern const int _pcre_utf8_table1[]; extern const int _pcre_utf8_table2[]; extern const int _pcre_utf8_table3[]; extern const uschar _pcre_utf8_table4[]; extern const int _pcre_utf8_table1_size; extern const ucp_type_table _pcre_utt[]; extern const int _pcre_utt_size; extern const uschar _pcre_default_tables[]; extern const uschar _pcre_OP_lengths[]; /* Internal shared functions. These are functions that are used by more than one of the exported public functions. They have to be "external" in the C sense, but are not part of the PCRE public API. */ extern BOOL _pcre_is_newline(const uschar *, int, const uschar *, int *, BOOL); extern int _pcre_ord2utf8(int, uschar *); extern real_pcre *_pcre_try_flipped(const real_pcre *, real_pcre *, const pcre_study_data *, pcre_study_data *); extern int _pcre_ucp_findprop(const unsigned int, int *, int *); extern unsigned int _pcre_ucp_othercase(const unsigned int); extern int _pcre_valid_utf8(const uschar *, int); extern BOOL _pcre_was_newline(const uschar *, int, const uschar *, int *, BOOL); extern BOOL _pcre_xclass(int, const uschar *); #endif /* End of pcre_internal.h */ syncevolution-1.5/src/synthesis/src/pcre/pcre_maketables.c0000644000373300037200000001256212424517753025541 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_maketables(), which builds character tables for PCRE in the current locale. The file is compiled on its own as part of the PCRE library. However, it is also included in the compilation of dftables.c, in which case the macro DFTABLES is defined. */ #ifndef DFTABLES # include "pcre_setup.h" # include "pcre_internal.h" #endif /************************************************* * Create PCRE character tables * *************************************************/ /* This function builds a set of character tables for use by PCRE and returns a pointer to them. They are build using the ctype functions, and consequently their contents will depend upon the current locale setting. When compiled as part of the library, the store is obtained via pcre_malloc(), but when compiled inside dftables, use malloc(). Arguments: none Returns: pointer to the contiguous block of data */ const unsigned char * pcre_maketables(void) { unsigned char *yield, *p; int i; #ifndef DFTABLES yield = (unsigned char*)(pcre_malloc)(tables_length); #else yield = (unsigned char*)malloc(tables_length); #endif if (yield == NULL) return NULL; p = yield; /* First comes the lower casing table */ for (i = 0; i < 256; i++) *p++ = tolower(i); /* Next the case-flipping table */ for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); /* Then the character class tables. Don't try to be clever and save effort on exclusive ones - in some locales things may be different. Note that the table for "space" includes everything "isspace" gives, including VT in the default locale. This makes it work for the POSIX class [:space:]. Note also that it is possible for a character to be alnum or alpha without being lower or upper, such as "male and female ordinals" (\xAA and \xBA) in the fr_FR locale (at least under Debian Linux's locales as of 12/2005). So we must test for alnum specially. */ memset(p, 0, cbit_length); for (i = 0; i < 256; i++) { if (isdigit(i)) p[cbit_digit + i/8] |= 1 << (i&7); if (isupper(i)) p[cbit_upper + i/8] |= 1 << (i&7); if (islower(i)) p[cbit_lower + i/8] |= 1 << (i&7); if (isalnum(i)) p[cbit_word + i/8] |= 1 << (i&7); if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); } p += cbit_length; /* Finally, the character type table. In this, we exclude VT from the white space chars, because Perl doesn't recognize it as such for \s and for comments within regexes. */ for (i = 0; i < 256; i++) { int x = 0; if (i != 0x0b && isspace(i)) x += ctype_space; if (isalpha(i)) x += ctype_letter; if (isdigit(i)) x += ctype_digit; if (isxdigit(i)) x += ctype_xdigit; if (isalnum(i) || i == '_') x += ctype_word; /* Note: strchr includes the terminating zero in the characters it considers. In this instance, that is ok because we want binary zero to be flagged as a meta-character, which in this sense is any character that terminates a run of data characters. */ if (strchr("\\*+?{^.$|()[", i) != 0) x += ctype_meta; *p++ = x; } return yield; } /* End of pcre_maketables.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_newline.c0000644000373300037200000001317012424517753025066 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains internal functions for testing newlines when more than one kind of newline is to be recognized. When a newline is found, its length is returned. In principle, we could implement several newline "types", each referring to a different set of newline characters. At present, PCRE supports only NLTYPE_FIXED, which gets handled without these functions, NLTYPE_ANYCRLF, and NLTYPE_ANY. The full list of Unicode newline characters is taken from http://unicode.org/unicode/reports/tr18/. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Check for newline at given position * *************************************************/ /* It is guaranteed that the initial value of ptr is less than the end of the string that is being processed. Arguments: ptr pointer to possible newline type the newline type endptr pointer to the end of the string lenptr where to return the length utf8 TRUE if in utf8 mode Returns: TRUE or FALSE */ BOOL _pcre_is_newline(const uschar *ptr, int type, const uschar *endptr, int *lenptr, BOOL utf8) { int c; if (utf8) { GETCHAR(c, ptr); } else c = *ptr; if (type == NLTYPE_ANYCRLF) switch(c) { case 0x000a: *lenptr = 1; return TRUE; /* LF */ case 0x000d: *lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a)? 2 : 1; return TRUE; /* CR */ default: return FALSE; } /* NLTYPE_ANY */ else switch(c) { case 0x000a: /* LF */ case 0x000b: /* VT */ case 0x000c: *lenptr = 1; return TRUE; /* FF */ case 0x000d: *lenptr = (ptr < endptr - 1 && ptr[1] == 0x0a)? 2 : 1; return TRUE; /* CR */ case 0x0085: *lenptr = utf8? 2 : 1; return TRUE; /* NEL */ case 0x2028: /* LS */ case 0x2029: *lenptr = 3; return TRUE; /* PS */ default: return FALSE; } } /************************************************* * Check for newline at previous position * *************************************************/ /* It is guaranteed that the initial value of ptr is greater than the start of the string that is being processed. Arguments: ptr pointer to possible newline type the newline type startptr pointer to the start of the string lenptr where to return the length utf8 TRUE if in utf8 mode Returns: TRUE or FALSE */ BOOL _pcre_was_newline(const uschar *ptr, int type, const uschar *startptr, int *lenptr, BOOL utf8) { int c; ptr--; #ifdef SUPPORT_UTF8 if (utf8) { BACKCHAR(ptr); GETCHAR(c, ptr); } else c = *ptr; #else /* no UTF-8 support */ c = *ptr; #endif /* SUPPORT_UTF8 */ if (type == NLTYPE_ANYCRLF) switch(c) { case 0x000a: *lenptr = (ptr > startptr && ptr[-1] == 0x0d)? 2 : 1; return TRUE; /* LF */ case 0x000d: *lenptr = 1; return TRUE; /* CR */ default: return FALSE; } else switch(c) { case 0x000a: *lenptr = (ptr > startptr && ptr[-1] == 0x0d)? 2 : 1; return TRUE; /* LF */ case 0x000b: /* VT */ case 0x000c: /* FF */ case 0x000d: *lenptr = 1; return TRUE; /* CR */ case 0x0085: *lenptr = utf8? 2 : 1; return TRUE; /* NEL */ case 0x2028: /* LS */ case 0x2029: *lenptr = 3; return TRUE; /* PS */ default: return FALSE; } } /* End of pcre_newline.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_ord2utf8.c0000644000373300037200000000611512424517753025103 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This file contains a private PCRE function that converts an ordinal character value into a UTF8 string. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Convert character value to UTF-8 * *************************************************/ /* This function takes an integer value in the range 0 - 0x7fffffff and encodes it as a UTF-8 character in 0 to 6 bytes. Arguments: cvalue the character value buffer pointer to buffer for result - at least 6 bytes long Returns: number of characters placed in the buffer */ int _pcre_ord2utf8(int cvalue, uschar *buffer) { #ifdef SUPPORT_UTF8 register int i, j; for (i = 0; i < _pcre_utf8_table1_size; i++) if (cvalue <= _pcre_utf8_table1[i]) break; buffer += i; for (j = i; j > 0; j--) { *buffer-- = 0x80 | (cvalue & 0x3f); cvalue >>= 6; } *buffer = _pcre_utf8_table2[i] | cvalue; return i + 1; #else return 0; /* Keep compiler happy; this function won't ever be */ #endif /* called when SUPPORT_UTF8 is not defined. */ } /* End of pcre_ord2utf8.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_printint.src0000644000373300037200000003403612424517753025645 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains a PCRE private debugging function for printing out the internal form of a compiled regular expression, along with some supporting local functions. This source file is used in two places: (1) It is #included by pcre_compile.c when it is compiled in debugging mode (DEBUG defined in pcre_internal.h). It is not included in production compiles. (2) It is always #included by pcretest.c, which can be asked to print out a compiled regex for debugging purposes. */ /* Macro that decides whether a character should be output as a literal or in hexadecimal. We don't use isprint() because that can vary from system to system (even without the use of locales) and we want the output always to be the same, for testing purposes. This macro is used in pcretest as well as in this file. */ #define PRINTABLE(c) ((c) >= 32 && (c) < 127) /* The table of operator names. */ static const char *OP_names[] = { OP_NAME_LIST }; /************************************************* * Print single- or multi-byte character * *************************************************/ static int print_char(FILE *f, uschar *ptr, BOOL utf8) { int c = *ptr; #ifndef SUPPORT_UTF8 utf8 = utf8; /* Avoid compiler warning */ if (PRINTABLE(c)) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c); return 0; #else if (!utf8 || (c & 0xc0) != 0xc0) { if (PRINTABLE(c)) fprintf(f, "%c", c); else fprintf(f, "\\x%02x", c); return 0; } else { int i; int a = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ int s = 6*a; c = (c & _pcre_utf8_table3[a]) << s; for (i = 1; i <= a; i++) { /* This is a check for malformed UTF-8; it should only occur if the sanity check has been turned off. Rather than swallow random bytes, just stop if we hit a bad one. Print it with \X instead of \x as an indication. */ if ((ptr[i] & 0xc0) != 0x80) { fprintf(f, "\\X{%x}", c); return i - 1; } /* The byte is OK */ s -= 6; c |= (ptr[i] & 0x3f) << s; } if (c < 128) fprintf(f, "\\x%02x", c); else fprintf(f, "\\x{%x}", c); return a; } #endif } /************************************************* * Find Unicode property name * *************************************************/ static const char * get_ucpname(int ptype, int pvalue) { #ifdef SUPPORT_UCP int i; for (i = _pcre_utt_size - 1; i >= 0; i--) { if (ptype == _pcre_utt[i].type && pvalue == _pcre_utt[i].value) break; } return (i >= 0)? _pcre_utt[i].name : "??"; #else /* It gets harder and harder to shut off unwanted compiler warnings. */ ptype = ptype * pvalue; return (ptype == pvalue)? "??" : "??"; #endif } /************************************************* * Print compiled regex * *************************************************/ /* Make this function work for a regex with integers either byte order. However, we assume that what we are passed is a compiled regex. The print_lengths flag controls whether offsets and lengths of items are printed. They can be turned off from pcretest so that automatic tests on bytecode can be written that do not depend on the value of LINK_SIZE. */ static void pcre_printint(pcre *external_re, FILE *f, BOOL print_lengths) { real_pcre *re = (real_pcre *)external_re; uschar *codestart, *code; BOOL utf8; unsigned int options = re->options; int offset = re->name_table_offset; int count = re->name_count; int size = re->name_entry_size; if (re->magic_number != MAGIC_NUMBER) { offset = ((offset << 8) & 0xff00) | ((offset >> 8) & 0xff); count = ((count << 8) & 0xff00) | ((count >> 8) & 0xff); size = ((size << 8) & 0xff00) | ((size >> 8) & 0xff); options = ((options << 24) & 0xff000000) | ((options << 8) & 0x00ff0000) | ((options >> 8) & 0x0000ff00) | ((options >> 24) & 0x000000ff); } code = codestart = (uschar *)re + offset + count * size; utf8 = (options & PCRE_UTF8) != 0; for(;;) { uschar *ccode; int c; int extra = 0; if (print_lengths) fprintf(f, "%3d ", (int)(code - codestart)); else fprintf(f, " "); switch(*code) { case OP_END: fprintf(f, " %s\n", OP_names[*code]); fprintf(f, "------------------------------------------------------------------\n"); return; case OP_OPT: fprintf(f, " %.2x %s", code[1], OP_names[*code]); break; case OP_CHAR: fprintf(f, " "); do { code++; code += 1 + print_char(f, code, utf8); } while (*code == OP_CHAR); fprintf(f, "\n"); continue; case OP_CHARNC: fprintf(f, " NC "); do { code++; code += 1 + print_char(f, code, utf8); } while (*code == OP_CHARNC); fprintf(f, "\n"); continue; case OP_CBRA: case OP_SCBRA: if (print_lengths) fprintf(f, "%3d ", GET(code, 1)); else fprintf(f, " "); fprintf(f, "%s %d", OP_names[*code], GET2(code, 1+LINK_SIZE)); break; case OP_BRA: case OP_SBRA: case OP_KETRMAX: case OP_KETRMIN: case OP_ALT: case OP_KET: case OP_ASSERT: case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: case OP_ONCE: case OP_COND: case OP_SCOND: case OP_REVERSE: if (print_lengths) fprintf(f, "%3d ", GET(code, 1)); else fprintf(f, " "); fprintf(f, "%s", OP_names[*code]); break; case OP_CREF: fprintf(f, "%3d %s", GET2(code,1), OP_names[*code]); break; case OP_RREF: c = GET2(code, 1); if (c == RREF_ANY) fprintf(f, " Cond recurse any"); else fprintf(f, " Cond recurse %d", c); break; case OP_DEF: fprintf(f, " Cond def"); break; case OP_STAR: case OP_MINSTAR: case OP_POSSTAR: case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPOSSTAR: case OP_TYPEPLUS: case OP_TYPEMINPLUS: case OP_TYPEPOSPLUS: case OP_TYPEQUERY: case OP_TYPEMINQUERY: case OP_TYPEPOSQUERY: fprintf(f, " "); if (*code >= OP_TYPESTAR) { fprintf(f, "%s", OP_names[code[1]]); if (code[1] == OP_PROP || code[1] == OP_NOTPROP) { fprintf(f, " %s ", get_ucpname(code[2], code[3])); extra = 2; } } else extra = print_char(f, code+1, utf8); fprintf(f, "%s", OP_names[*code]); break; case OP_EXACT: case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: fprintf(f, " "); extra = print_char(f, code+3, utf8); fprintf(f, "{"); if (*code != OP_EXACT) fprintf(f, "0,"); fprintf(f, "%d}", GET2(code,1)); if (*code == OP_MINUPTO) fprintf(f, "?"); else if (*code == OP_POSUPTO) fprintf(f, "+"); break; case OP_TYPEEXACT: case OP_TYPEUPTO: case OP_TYPEMINUPTO: case OP_TYPEPOSUPTO: fprintf(f, " %s", OP_names[code[3]]); if (code[3] == OP_PROP || code[3] == OP_NOTPROP) { fprintf(f, " %s ", get_ucpname(code[4], code[5])); extra = 2; } fprintf(f, "{"); if (*code != OP_TYPEEXACT) fprintf(f, "0,"); fprintf(f, "%d}", GET2(code,1)); if (*code == OP_TYPEMINUPTO) fprintf(f, "?"); else if (*code == OP_TYPEPOSUPTO) fprintf(f, "+"); break; case OP_NOT: c = code[1]; if (PRINTABLE(c)) fprintf(f, " [^%c]", c); else fprintf(f, " [^\\x%02x]", c); break; case OP_NOTSTAR: case OP_NOTMINSTAR: case OP_NOTPOSSTAR: case OP_NOTPLUS: case OP_NOTMINPLUS: case OP_NOTPOSPLUS: case OP_NOTQUERY: case OP_NOTMINQUERY: case OP_NOTPOSQUERY: c = code[1]; if (PRINTABLE(c)) fprintf(f, " [^%c]", c); else fprintf(f, " [^\\x%02x]", c); fprintf(f, "%s", OP_names[*code]); break; case OP_NOTEXACT: case OP_NOTUPTO: case OP_NOTMINUPTO: case OP_NOTPOSUPTO: c = code[3]; if (PRINTABLE(c)) fprintf(f, " [^%c]{", c); else fprintf(f, " [^\\x%02x]{", c); if (*code != OP_NOTEXACT) fprintf(f, "0,"); fprintf(f, "%d}", GET2(code,1)); if (*code == OP_NOTMINUPTO) fprintf(f, "?"); else if (*code == OP_NOTPOSUPTO) fprintf(f, "+"); break; case OP_RECURSE: if (print_lengths) fprintf(f, "%3d ", GET(code, 1)); else fprintf(f, " "); fprintf(f, "%s", OP_names[*code]); break; case OP_REF: fprintf(f, " \\%d", GET2(code,1)); ccode = code + _pcre_OP_lengths[*code]; goto CLASS_REF_REPEAT; case OP_CALLOUT: fprintf(f, " %s %d %d %d", OP_names[*code], code[1], GET(code,2), GET(code, 2 + LINK_SIZE)); break; case OP_PROP: case OP_NOTPROP: fprintf(f, " %s %s", OP_names[*code], get_ucpname(code[1], code[2])); break; /* OP_XCLASS can only occur in UTF-8 mode. However, there's no harm in having this code always here, and it makes it less messy without all those #ifdefs. */ case OP_CLASS: case OP_NCLASS: case OP_XCLASS: { int i, min, max; BOOL printmap; fprintf(f, " ["); if (*code == OP_XCLASS) { extra = GET(code, 1); ccode = code + LINK_SIZE + 1; printmap = (*ccode & XCL_MAP) != 0; if ((*ccode++ & XCL_NOT) != 0) fprintf(f, "^"); } else { printmap = TRUE; ccode = code + 1; } /* Print a bit map */ if (printmap) { for (i = 0; i < 256; i++) { if ((ccode[i/8] & (1 << (i&7))) != 0) { int j; for (j = i+1; j < 256; j++) if ((ccode[j/8] & (1 << (j&7))) == 0) break; if (i == '-' || i == ']') fprintf(f, "\\"); if (PRINTABLE(i)) fprintf(f, "%c", i); else fprintf(f, "\\x%02x", i); if (--j > i) { if (j != i + 1) fprintf(f, "-"); if (j == '-' || j == ']') fprintf(f, "\\"); if (PRINTABLE(j)) fprintf(f, "%c", j); else fprintf(f, "\\x%02x", j); } i = j; } } ccode += 32; } /* For an XCLASS there is always some additional data */ if (*code == OP_XCLASS) { int ch; while ((ch = *ccode++) != XCL_END) { if (ch == XCL_PROP) { int ptype = *ccode++; int pvalue = *ccode++; fprintf(f, "\\p{%s}", get_ucpname(ptype, pvalue)); } else if (ch == XCL_NOTPROP) { int ptype = *ccode++; int pvalue = *ccode++; fprintf(f, "\\P{%s}", get_ucpname(ptype, pvalue)); } else { ccode += 1 + print_char(f, ccode, TRUE); if (ch == XCL_RANGE) { fprintf(f, "-"); ccode += 1 + print_char(f, ccode, TRUE); } } } } /* Indicate a non-UTF8 class which was created by negation */ fprintf(f, "]%s", (*code == OP_NCLASS)? " (neg)" : ""); /* Handle repeats after a class or a back reference */ CLASS_REF_REPEAT: switch(*ccode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRPLUS: case OP_CRMINPLUS: case OP_CRQUERY: case OP_CRMINQUERY: fprintf(f, "%s", OP_names[*ccode]); extra += _pcre_OP_lengths[*ccode]; break; case OP_CRRANGE: case OP_CRMINRANGE: min = GET2(ccode,1); max = GET2(ccode,3); if (max == 0) fprintf(f, "{%d,}", min); else fprintf(f, "{%d,%d}", min, max); if (*ccode == OP_CRMINRANGE) fprintf(f, "?"); extra += _pcre_OP_lengths[*ccode]; break; /* Do nothing if it's not a repeat; this code stops picky compilers warning about the lack of a default code path. */ default: break; } } break; /* Anything else is just an item with no data*/ default: fprintf(f, " %s", OP_names[*code]); break; } code += _pcre_OP_lengths[*code] + extra; fprintf(f, "\n"); } } /* End of pcre_printint.src */ syncevolution-1.5/src/synthesis/src/pcre/pcre_refcount.c0000644000373300037200000000641312424517753025254 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_refcount(), which is an auxiliary function that can be used to maintain a reference count in a compiled pattern data block. This might be helpful in applications where the block is shared by different users. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Maintain reference count * *************************************************/ /* The reference count is a 16-bit field, initialized to zero. It is not possible to transfer a non-zero count from one host to a different host that has a different byte order - though I can't see why anyone in their right mind would ever want to do that! Arguments: argument_re points to compiled code adjust value to add to the count Returns: the (possibly updated) count value (a non-negative number), or a negative error number */ PCRE_EXP_DEFN int pcre_refcount(pcre *argument_re, int adjust) { real_pcre *re = (real_pcre *)argument_re; if (re == NULL) return PCRE_ERROR_NULL; re->ref_count = (-adjust > re->ref_count)? 0 : (adjust + re->ref_count > 65535)? 65535 : re->ref_count + adjust; return re->ref_count; } /* End of pcre_refcount.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_scanner.cc0000644000373300037200000001263412424517753025225 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat #ifdef HAVE_CONFIG_H #include #endif #include #include #include "pcrecpp_internal.h" #include "pcre_scanner.h" using std::vector; namespace pcrecpp { Scanner::Scanner() : data_(), input_(data_), skip_(NULL), should_skip_(false), skip_repeat_(false), save_comments_(false), comments_(NULL), comments_offset_(0) { } Scanner::Scanner(const string& in) : data_(in), input_(data_), skip_(NULL), should_skip_(false), skip_repeat_(false), save_comments_(false), comments_(NULL), comments_offset_(0) { } Scanner::~Scanner() { delete skip_; delete comments_; } void Scanner::SetSkipExpression(const char* re) { delete skip_; if (re != NULL) { skip_ = new RE(re); should_skip_ = true; skip_repeat_ = true; ConsumeSkip(); } else { skip_ = NULL; should_skip_ = false; skip_repeat_ = false; } } void Scanner::Skip(const char* re) { delete skip_; if (re != NULL) { skip_ = new RE(re); should_skip_ = true; skip_repeat_ = false; ConsumeSkip(); } else { skip_ = NULL; should_skip_ = false; skip_repeat_ = false; } } void Scanner::DisableSkip() { assert(skip_ != NULL); should_skip_ = false; } void Scanner::EnableSkip() { assert(skip_ != NULL); should_skip_ = true; ConsumeSkip(); } int Scanner::LineNumber() const { // TODO: Make it more efficient by keeping track of the last point // where we computed line numbers and counting newlines since then. // We could use std:count, but not all systems have it. :-( int count = 1; for (const char* p = data_.data(); p < input_.data(); ++p) if (*p == '\n') ++count; return count; } int Scanner::Offset() const { return input_.data() - data_.c_str(); } bool Scanner::LookingAt(const RE& re) const { int consumed; return re.DoMatch(input_, RE::ANCHOR_START, &consumed, 0, 0); } bool Scanner::Consume(const RE& re, const Arg& arg0, const Arg& arg1, const Arg& arg2) { const bool result = re.Consume(&input_, arg0, arg1, arg2); if (result && should_skip_) ConsumeSkip(); return result; } // helper function to consume *skip_ and honour save_comments_ void Scanner::ConsumeSkip() { const char* start_data = input_.data(); while (skip_->Consume(&input_)) { if (!skip_repeat_) { // Only one skip allowed. break; } } if (save_comments_) { if (comments_ == NULL) { comments_ = new vector; } // already pointing one past end, so no need to +1 int length = input_.data() - start_data; if (length > 0) { comments_->push_back(StringPiece(start_data, length)); } } } void Scanner::GetComments(int start, int end, vector *ranges) { // short circuit out if we've not yet initialized comments_ // (e.g., when save_comments is false) if (!comments_) { return; } // TODO: if we guarantee that comments_ will contain StringPieces // that are ordered by their start, then we can do a binary search // for the first StringPiece at or past start and then scan for the // ones contained in the range, quit early (use equal_range or // lower_bound) for (vector::const_iterator it = comments_->begin(); it != comments_->end(); ++it) { if ((it->data() >= data_.c_str() + start && it->data() + it->size() <= data_.c_str() + end)) { ranges->push_back(*it); } } } void Scanner::GetNextComments(vector *ranges) { // short circuit out if we've not yet initialized comments_ // (e.g., when save_comments is false) if (!comments_) { return; } for (vector::const_iterator it = comments_->begin() + comments_offset_; it != comments_->end(); ++it) { ranges->push_back(*it); ++comments_offset_; } } } // namespace pcrecpp syncevolution-1.5/src/synthesis/src/pcre/pcre_scanner.h0000644000373300037200000001467412424517753025075 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat // // Regular-expression based scanner for parsing an input stream. // // Example 1: parse a sequence of "var = number" entries from input: // // Scanner scanner(input); // string var; // int number; // scanner.SetSkipExpression("\\s+"); // Skip any white space we encounter // while (scanner.Consume("(\\w+) = (\\d+)", &var, &number)) { // ...; // } #ifndef _PCRE_SCANNER_H #define _PCRE_SCANNER_H #include #include #include #include #include namespace pcrecpp { class PCRECPP_EXP_DEFN Scanner { public: Scanner(); explicit Scanner(const std::string& input); ~Scanner(); // Return current line number. The returned line-number is // one-based. I.e. it returns 1 + the number of consumed newlines. // // Note: this method may be slow. It may take time proportional to // the size of the input. int LineNumber() const; // Return the byte-offset that the scanner is looking in the // input data; int Offset() const; // Return true iff the start of the remaining input matches "re" bool LookingAt(const RE& re) const; // Return true iff all of the following are true // a. the start of the remaining input matches "re", // b. if any arguments are supplied, matched sub-patterns can be // parsed and stored into the arguments. // If it returns true, it skips over the matched input and any // following input that matches the "skip" regular expression. bool Consume(const RE& re, const Arg& arg0 = no_arg, const Arg& arg1 = no_arg, const Arg& arg2 = no_arg // TODO: Allow more arguments? ); // Set the "skip" regular expression. If after consuming some data, // a prefix of the input matches this RE, it is automatically // skipped. For example, a programming language scanner would use // a skip RE that matches white space and comments. // // scanner.SetSkipExpression("\\s+|//.*|/[*](.|\n)*?[*]/"); // // Skipping repeats as long as it succeeds. We used to let people do // this by writing "(...)*" in the regular expression, but that added // up to lots of recursive calls within the pcre library, so now we // control repetition explicitly via the function call API. // // You can pass NULL for "re" if you do not want any data to be skipped. void Skip(const char* re); // DEPRECATED; does *not* repeat void SetSkipExpression(const char* re); // Temporarily pause "skip"ing. This // Skip("Foo"); code ; DisableSkip(); code; EnableSkip() // is similar to // Skip("Foo"); code ; Skip(NULL); code ; Skip("Foo"); // but avoids creating/deleting new RE objects. void DisableSkip(); // Reenable previously paused skipping. Any prefix of the input // that matches the skip pattern is immediately dropped. void EnableSkip(); /***** Special wrappers around SetSkip() for some common idioms *****/ // Arranges to skip whitespace, C comments, C++ comments. // The overall RE is a disjunction of the following REs: // \\s whitespace // //.*\n C++ comment // /[*](.|\n)*?[*]/ C comment (x*? means minimal repetitions of x) // We get repetition via the semantics of SetSkipExpression, not by using * void SkipCXXComments() { SetSkipExpression("\\s|//.*\n|/[*](?:\n|.)*?[*]/"); } void set_save_comments(bool comments) { save_comments_ = comments; } bool save_comments() { return save_comments_; } // Append to vector ranges the comments found in the // byte range [start,end] (inclusive) of the input data. // Only comments that were extracted entirely within that // range are returned: no range splitting of atomically-extracted // comments is performed. void GetComments(int start, int end, std::vector *ranges); // Append to vector ranges the comments added // since the last time this was called. This // functionality is provided for efficiency when // interleaving scanning with parsing. void GetNextComments(std::vector *ranges); private: std::string data_; // All the input data StringPiece input_; // Unprocessed input RE* skip_; // If non-NULL, RE for skipping input bool should_skip_; // If true, use skip_ bool skip_repeat_; // If true, repeat skip_ as long as it works bool save_comments_; // If true, aggregate the skip expression // the skipped comments // TODO: later consider requiring that the StringPieces be added // in order by their start position std::vector *comments_; // the offset into comments_ that has been returned by GetNextComments int comments_offset_; // helper function to consume *skip_ and honour // save_comments_ void ConsumeSkip(); }; } // namespace pcrecpp #endif /* _PCRE_SCANNER_H */ syncevolution-1.5/src/synthesis/src/pcre/pcre_scanner_unittest.cc0000644000373300037200000001216312424517753027161 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Greg J. Badros // // Unittest for scanner, especially GetNextComments and GetComments() // functionality. #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #ifdef _WIN32 # define snprintf _snprintf #endif #define FLAGS_unittest_stack_size 49152 // Dies with a fatal error if the two values are not equal. #define CHECK_EQ(a, b) do { \ if ( (a) != (b) ) { \ fprintf(stderr, "%s:%d: Check failed because %s != %s\n", \ __FILE__, __LINE__, #a, #b); \ exit(1); \ } \ } while (0) using std::vector; using pcrecpp::StringPiece; using pcrecpp::Scanner; static void TestScanner() { const char input[] = "\n" "alpha = 1; // this sets alpha\n" "bravo = 2; // bravo is set here\n" "gamma = 33; /* and here is gamma */\n"; const char *re = "(\\w+) = (\\d+);"; Scanner s(input); string var; int number; s.SkipCXXComments(); s.set_save_comments(true); vector comments; s.Consume(re, &var, &number); CHECK_EQ(var, "alpha"); CHECK_EQ(number, 1); CHECK_EQ(s.LineNumber(), 3); s.GetNextComments(&comments); CHECK_EQ(comments.size(), 1); CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); comments.resize(0); s.Consume(re, &var, &number); CHECK_EQ(var, "bravo"); CHECK_EQ(number, 2); s.GetNextComments(&comments); CHECK_EQ(comments.size(), 1); CHECK_EQ(comments[0].as_string(), " // bravo is set here\n"); comments.resize(0); s.Consume(re, &var, &number); CHECK_EQ(var, "gamma"); CHECK_EQ(number, 33); s.GetNextComments(&comments); CHECK_EQ(comments.size(), 1); CHECK_EQ(comments[0].as_string(), " /* and here is gamma */\n"); comments.resize(0); s.GetComments(0, sizeof(input), &comments); CHECK_EQ(comments.size(), 3); CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); CHECK_EQ(comments[1].as_string(), " // bravo is set here\n"); CHECK_EQ(comments[2].as_string(), " /* and here is gamma */\n"); comments.resize(0); s.GetComments(0, strchr(input, '/') - input, &comments); CHECK_EQ(comments.size(), 0); comments.resize(0); s.GetComments(strchr(input, '/') - input - 1, sizeof(input), &comments); CHECK_EQ(comments.size(), 3); CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); CHECK_EQ(comments[1].as_string(), " // bravo is set here\n"); CHECK_EQ(comments[2].as_string(), " /* and here is gamma */\n"); comments.resize(0); s.GetComments(strchr(input, '/') - input - 1, strchr(input + 1, '\n') - input + 1, &comments); CHECK_EQ(comments.size(), 1); CHECK_EQ(comments[0].as_string(), " // this sets alpha\n"); comments.resize(0); } static void TestBigComment() { string input; for (int i = 0; i < 1024; ++i) { char buf[1024]; snprintf(buf, sizeof(buf), " # Comment %d\n", i); input += buf; } input += "name = value;\n"; Scanner s(input.c_str()); s.SetSkipExpression("\\s+|#.*\n"); string name; string value; s.Consume("(\\w+) = (\\w+);", &name, &value); CHECK_EQ(name, "name"); CHECK_EQ(value, "value"); } // TODO: also test scanner and big-comment in a thread with a // small stack size int main(int argc, char** argv) { TestScanner(); TestBigComment(); // Done printf("OK\n"); return 0; } syncevolution-1.5/src/synthesis/src/pcre/pcre_setup.h0000644000373300037200000000154212424517753024572 0ustar00nightlyallusers00000000000000/* common include file for all PCRE sources * Added by luz 2007-09-03 to allow more flexibility for * multi-platform static linking with platforms w/o config.h * mechanisms */ /* Note: target_options may define PCRE_HAS_CONFIG_H if environment * has generic config.h that works for PCRE and does not conflict * with other components. */ #include "target_options.h" // to get platform defines #ifdef PCRE_HAS_CONFIG_H #include #else #if defined(WIN32) /* hand-modified win32 config.h! */ #include "pcre_config_win32.h" #elif defined(MACOSX) /* hand-modified MacOS config.h! */ #include "pcre_config_macosx.h" #elif defined(ANDROID) /* hand-modified MacOS config.h! */ #include "pcre_config_android.h" #else #error "PCRE not yet prepared for this platform" #endif #endif /* not PCRE_HAS_CONFIG_H */ syncevolution-1.5/src/synthesis/src/pcre/pcre_stringpiece.cc0000644000373300037200000000350212424517753026102 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: wilsonh@google.com (Wilson Hsieh) // #ifdef HAVE_CONFIG_H #include #endif #include #include "pcrecpp_internal.h" #include "pcre_stringpiece.h" std::ostream& operator<<(std::ostream& o, const pcrecpp::StringPiece& piece) { return (o << piece.as_string()); } syncevolution-1.5/src/synthesis/src/pcre/pcre_stringpiece.h.in0000644000373300037200000001375612424517753026365 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat // // A string like object that points into another piece of memory. // Useful for providing an interface that allows clients to easily // pass in either a "const char*" or a "string". // // Arghh! I wish C++ literals were automatically of type "string". #ifndef _PCRE_STRINGPIECE_H #define _PCRE_STRINGPIECE_H #include #include #include // for ostream forward-declaration #if @pcre_have_type_traits@ #define HAVE_TYPE_TRAITS #include #elif @pcre_have_bits_type_traits@ #define HAVE_TYPE_TRAITS #include #endif #include using std::string; namespace pcrecpp { class PCRECPP_EXP_DEFN StringPiece { private: const char* ptr_; int length_; public: // We provide non-explicit singleton constructors so users can pass // in a "const char*" or a "string" wherever a "StringPiece" is // expected. StringPiece() : ptr_(NULL), length_(0) { } StringPiece(const char* str) : ptr_(str), length_(static_cast(strlen(str))) { } StringPiece(const string& str) : ptr_(str.data()), length_(static_cast(str.size())) { } StringPiece(const char* offset, int len) : ptr_(offset), length_(len) { } // data() may return a pointer to a buffer with embedded NULs, and the // returned buffer may or may not be null terminated. Therefore it is // typically a mistake to pass data() to a routine that expects a NUL // terminated string. Use "as_string().c_str()" if you really need to do // this. Or better yet, change your routine so it does not rely on NUL // termination. const char* data() const { return ptr_; } int size() const { return length_; } bool empty() const { return length_ == 0; } void clear() { ptr_ = NULL; length_ = 0; } void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; } void set(const char* str) { ptr_ = str; length_ = static_cast(strlen(str)); } void set(const void* buffer, int len) { ptr_ = reinterpret_cast(buffer); length_ = len; } char operator[](int i) const { return ptr_[i]; } void remove_prefix(int n) { ptr_ += n; length_ -= n; } void remove_suffix(int n) { length_ -= n; } bool operator==(const StringPiece& x) const { return ((length_ == x.length_) && (memcmp(ptr_, x.ptr_, length_) == 0)); } bool operator!=(const StringPiece& x) const { return !(*this == x); } #define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp) \ bool operator cmp (const StringPiece& x) const { \ int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \ return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_))); \ } STRINGPIECE_BINARY_PREDICATE(<, <); STRINGPIECE_BINARY_PREDICATE(<=, <); STRINGPIECE_BINARY_PREDICATE(>=, >); STRINGPIECE_BINARY_PREDICATE(>, >); #undef STRINGPIECE_BINARY_PREDICATE int compare(const StringPiece& x) const { int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); if (r == 0) { if (length_ < x.length_) r = -1; else if (length_ > x.length_) r = +1; } return r; } string as_string() const { return string(data(), size()); } void CopyToString(string* target) const { target->assign(ptr_, length_); } // Does "this" start with "x" bool starts_with(const StringPiece& x) const { return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0)); } }; } // namespace pcrecpp // ------------------------------------------------------------------ // Functions used to create STL containers that use StringPiece // Remember that a StringPiece's lifetime had better be less than // that of the underlying string or char*. If it is not, then you // cannot safely store a StringPiece into an STL container // ------------------------------------------------------------------ #ifdef HAVE_TYPE_TRAITS // This makes vector really fast for some STL implementations template<> struct __type_traits { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type; }; #endif // allow StringPiece to be logged std::ostream& operator<<(std::ostream& o, const pcrecpp::StringPiece& piece); #endif /* _PCRE_STRINGPIECE_H */ syncevolution-1.5/src/synthesis/src/pcre/pcre_stringpiece_unittest.cc0000644000373300037200000000701212424517753030041 0ustar00nightlyallusers00000000000000// Copyright 2003 and onwards Google Inc. // Author: Sanjay Ghemawat #ifdef HAVE_CONFIG_H #include #endif #include #include #include // for make_pair #include #include // CHECK dies with a fatal error if condition is not true. It is *not* // controlled by NDEBUG, so the check will be executed regardless of // compilation mode. Therefore, it is safe to do things like: // CHECK(fp->Write(x) == 4) #define CHECK(condition) do { \ if (!(condition)) { \ fprintf(stderr, "%s:%d: Check failed: %s\n", \ __FILE__, __LINE__, #condition); \ exit(1); \ } \ } while (0) using std::map; using std::make_pair; using pcrecpp::StringPiece; static void CheckSTLComparator() { string s1("foo"); string s2("bar"); string s3("baz"); StringPiece p1(s1); StringPiece p2(s2); StringPiece p3(s3); typedef map TestMap; TestMap map; map.insert(make_pair(p1, 0)); map.insert(make_pair(p2, 1)); map.insert(make_pair(p3, 2)); CHECK(map.size() == 3); TestMap::const_iterator iter = map.begin(); CHECK(iter->second == 1); ++iter; CHECK(iter->second == 2); ++iter; CHECK(iter->second == 0); ++iter; CHECK(iter == map.end()); TestMap::iterator new_iter = map.find("zot"); CHECK(new_iter == map.end()); new_iter = map.find("bar"); CHECK(new_iter != map.end()); map.erase(new_iter); CHECK(map.size() == 2); iter = map.begin(); CHECK(iter->second == 2); ++iter; CHECK(iter->second == 0); ++iter; CHECK(iter == map.end()); } static void CheckComparisonOperators() { #define CMP_Y(op, x, y) \ CHECK( (StringPiece((x)) op StringPiece((y)))); \ CHECK( (StringPiece((x)).compare(StringPiece((y))) op 0)) #define CMP_N(op, x, y) \ CHECK(!(StringPiece((x)) op StringPiece((y)))); \ CHECK(!(StringPiece((x)).compare(StringPiece((y))) op 0)) CMP_Y(==, "", ""); CMP_Y(==, "a", "a"); CMP_Y(==, "aa", "aa"); CMP_N(==, "a", ""); CMP_N(==, "", "a"); CMP_N(==, "a", "b"); CMP_N(==, "a", "aa"); CMP_N(==, "aa", "a"); CMP_N(!=, "", ""); CMP_N(!=, "a", "a"); CMP_N(!=, "aa", "aa"); CMP_Y(!=, "a", ""); CMP_Y(!=, "", "a"); CMP_Y(!=, "a", "b"); CMP_Y(!=, "a", "aa"); CMP_Y(!=, "aa", "a"); CMP_Y(<, "a", "b"); CMP_Y(<, "a", "aa"); CMP_Y(<, "aa", "b"); CMP_Y(<, "aa", "bb"); CMP_N(<, "a", "a"); CMP_N(<, "b", "a"); CMP_N(<, "aa", "a"); CMP_N(<, "b", "aa"); CMP_N(<, "bb", "aa"); CMP_Y(<=, "a", "a"); CMP_Y(<=, "a", "b"); CMP_Y(<=, "a", "aa"); CMP_Y(<=, "aa", "b"); CMP_Y(<=, "aa", "bb"); CMP_N(<=, "b", "a"); CMP_N(<=, "aa", "a"); CMP_N(<=, "b", "aa"); CMP_N(<=, "bb", "aa"); CMP_N(>=, "a", "b"); CMP_N(>=, "a", "aa"); CMP_N(>=, "aa", "b"); CMP_N(>=, "aa", "bb"); CMP_Y(>=, "a", "a"); CMP_Y(>=, "b", "a"); CMP_Y(>=, "aa", "a"); CMP_Y(>=, "b", "aa"); CMP_Y(>=, "bb", "aa"); CMP_N(>, "a", "a"); CMP_N(>, "a", "b"); CMP_N(>, "a", "aa"); CMP_N(>, "aa", "b"); CMP_N(>, "aa", "bb"); CMP_Y(>, "b", "a"); CMP_Y(>, "aa", "a"); CMP_Y(>, "b", "aa"); CMP_Y(>, "bb", "aa"); #undef CMP_Y #undef CMP_N } int main(int argc, char** argv) { CheckComparisonOperators(); CheckSTLComparator(); printf("OK\n"); return 0; } syncevolution-1.5/src/synthesis/src/pcre/pcre_study.c0000644000373300037200000004243512424517753024603 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_study(), along with local supporting functions. */ #include "pcre_setup.h" #include "pcre_internal.h" /* Returns from set_start_bits() */ enum { SSB_FAIL, SSB_DONE, SSB_CONTINUE }; /************************************************* * Set a bit and maybe its alternate case * *************************************************/ /* Given a character, set its bit in the table, and also the bit for the other version of a letter if we are caseless. Arguments: start_bits points to the bit map c is the character caseless the caseless flag cd the block with char table pointers Returns: nothing */ static void set_bit(uschar *start_bits, unsigned int c, BOOL caseless, compile_data *cd) { start_bits[c/8] |= (1 << (c&7)); if (caseless && (cd->ctypes[c] & ctype_letter) != 0) start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7)); } /************************************************* * Create bitmap of starting bytes * *************************************************/ /* This function scans a compiled unanchored expression recursively and attempts to build a bitmap of the set of possible starting bytes. As time goes by, we may be able to get more clever at doing this. The SSB_CONTINUE return is useful for parenthesized groups in patterns such as (a*)b where the group provides some optional starting bytes but scanning must continue at the outer level to find at least one mandatory byte. At the outermost level, this function fails unless the result is SSB_DONE. Arguments: code points to an expression start_bits points to a 32-byte table, initialized to 0 caseless the current state of the caseless flag utf8 TRUE if in UTF-8 mode cd the block with char table pointers Returns: SSB_FAIL => Failed to find any starting bytes SSB_DONE => Found mandatory starting bytes SSB_CONTINUE => Found optional starting bytes */ static int set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless, BOOL utf8, compile_data *cd) { register int c; int yield = SSB_DONE; #if 0 /* ========================================================================= */ /* The following comment and code was inserted in January 1999. In May 2006, when it was observed to cause compiler warnings about unused values, I took it out again. If anybody is still using OS/2, they will have to put it back manually. */ /* This next statement and the later reference to dummy are here in order to trick the optimizer of the IBM C compiler for OS/2 into generating correct code. Apparently IBM isn't going to fix the problem, and we would rather not disable optimization (in this module it actually makes a big difference, and the pcre module can use all the optimization it can get). */ volatile int dummy; /* ========================================================================= */ #endif do { const uschar *tcode = code + (((int)*code == OP_CBRA)? 3:1) + LINK_SIZE; BOOL try_next = TRUE; while (try_next) /* Loop for items in this branch */ { int rc; switch(*tcode) { /* Fail if we reach something we don't understand */ default: return SSB_FAIL; /* If we hit a bracket or a positive lookahead assertion, recurse to set bits from within the subpattern. If it can't find anything, we have to give up. If it finds some mandatory character(s), we are done for this branch. Otherwise, carry on scanning after the subpattern. */ case OP_BRA: case OP_SBRA: case OP_CBRA: case OP_SCBRA: case OP_ONCE: case OP_ASSERT: rc = set_start_bits(tcode, start_bits, caseless, utf8, cd); if (rc == SSB_FAIL) return SSB_FAIL; if (rc == SSB_DONE) try_next = FALSE; else { do tcode += GET(tcode, 1); while (*tcode == OP_ALT); tcode += 1 + LINK_SIZE; } break; /* If we hit ALT or KET, it means we haven't found anything mandatory in this branch, though we might have found something optional. For ALT, we continue with the next alternative, but we have to arrange that the final result from subpattern is SSB_CONTINUE rather than SSB_DONE. For KET, return SSB_CONTINUE: if this is the top level, that indicates failure, but after a nested subpattern, it causes scanning to continue. */ case OP_ALT: yield = SSB_CONTINUE; try_next = FALSE; break; case OP_KET: case OP_KETRMAX: case OP_KETRMIN: return SSB_CONTINUE; /* Skip over callout */ case OP_CALLOUT: tcode += 2 + 2*LINK_SIZE; break; /* Skip over lookbehind and negative lookahead assertions */ case OP_ASSERT_NOT: case OP_ASSERTBACK: case OP_ASSERTBACK_NOT: do tcode += GET(tcode, 1); while (*tcode == OP_ALT); tcode += 1 + LINK_SIZE; break; /* Skip over an option setting, changing the caseless flag */ case OP_OPT: caseless = (tcode[1] & PCRE_CASELESS) != 0; tcode += 2; break; /* BRAZERO does the bracket, but carries on. */ case OP_BRAZERO: case OP_BRAMINZERO: if (set_start_bits(++tcode, start_bits, caseless, utf8, cd) == SSB_FAIL) return SSB_FAIL; /* ========================================================================= See the comment at the head of this function concerning the next line, which was an old fudge for the benefit of OS/2. dummy = 1; ========================================================================= */ do tcode += GET(tcode,1); while (*tcode == OP_ALT); tcode += 1 + LINK_SIZE; break; /* Single-char * or ? sets the bit and tries the next item */ case OP_STAR: case OP_MINSTAR: case OP_POSSTAR: case OP_QUERY: case OP_MINQUERY: case OP_POSQUERY: set_bit(start_bits, tcode[1], caseless, cd); tcode += 2; #ifdef SUPPORT_UTF8 if (utf8 && tcode[-1] >= 0xc0) tcode += _pcre_utf8_table4[tcode[-1] & 0x3f]; #endif break; /* Single-char upto sets the bit and tries the next */ case OP_UPTO: case OP_MINUPTO: case OP_POSUPTO: set_bit(start_bits, tcode[3], caseless, cd); tcode += 4; #ifdef SUPPORT_UTF8 if (utf8 && tcode[-1] >= 0xc0) tcode += _pcre_utf8_table4[tcode[-1] & 0x3f]; #endif break; /* At least one single char sets the bit and stops */ case OP_EXACT: /* Fall through */ tcode += 2; case OP_CHAR: case OP_CHARNC: case OP_PLUS: case OP_MINPLUS: case OP_POSPLUS: set_bit(start_bits, tcode[1], caseless, cd); try_next = FALSE; break; /* Single character type sets the bits and stops */ case OP_NOT_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_digit]; try_next = FALSE; break; case OP_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_digit]; try_next = FALSE; break; /* The cbit_space table has vertical tab as whitespace; we have to discard it. */ case OP_NOT_WHITESPACE: for (c = 0; c < 32; c++) { int d = cd->cbits[c+cbit_space]; if (c == 1) d &= ~0x08; start_bits[c] |= ~d; } try_next = FALSE; break; /* The cbit_space table has vertical tab as whitespace; we have to discard it. */ case OP_WHITESPACE: for (c = 0; c < 32; c++) { int d = cd->cbits[c+cbit_space]; if (c == 1) d &= ~0x08; start_bits[c] |= d; } try_next = FALSE; break; case OP_NOT_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_word]; try_next = FALSE; break; case OP_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_word]; try_next = FALSE; break; /* One or more character type fudges the pointer and restarts, knowing it will hit a single character type and stop there. */ case OP_TYPEPLUS: case OP_TYPEMINPLUS: tcode++; break; case OP_TYPEEXACT: tcode += 3; break; /* Zero or more repeats of character types set the bits and then try again. */ case OP_TYPEUPTO: case OP_TYPEMINUPTO: case OP_TYPEPOSUPTO: tcode += 2; /* Fall through */ case OP_TYPESTAR: case OP_TYPEMINSTAR: case OP_TYPEPOSSTAR: case OP_TYPEQUERY: case OP_TYPEMINQUERY: case OP_TYPEPOSQUERY: switch(tcode[1]) { case OP_ANY: return SSB_FAIL; case OP_NOT_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_digit]; break; case OP_DIGIT: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_digit]; break; /* The cbit_space table has vertical tab as whitespace; we have to discard it. */ case OP_NOT_WHITESPACE: for (c = 0; c < 32; c++) { int d = cd->cbits[c+cbit_space]; if (c == 1) d &= ~0x08; start_bits[c] |= ~d; } break; /* The cbit_space table has vertical tab as whitespace; we have to discard it. */ case OP_WHITESPACE: for (c = 0; c < 32; c++) { int d = cd->cbits[c+cbit_space]; if (c == 1) d &= ~0x08; start_bits[c] |= d; } break; case OP_NOT_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= ~cd->cbits[c+cbit_word]; break; case OP_WORDCHAR: for (c = 0; c < 32; c++) start_bits[c] |= cd->cbits[c+cbit_word]; break; } tcode += 2; break; /* Character class where all the information is in a bit map: set the bits and either carry on or not, according to the repeat count. If it was a negative class, and we are operating with UTF-8 characters, any byte with a value >= 0xc4 is a potentially valid starter because it starts a character with a value > 255. */ case OP_NCLASS: #ifdef SUPPORT_UTF8 if (utf8) { start_bits[24] |= 0xf0; /* Bits for 0xc4 - 0xc8 */ memset(start_bits+25, 0xff, 7); /* Bits for 0xc9 - 0xff */ } #endif /* Fall through */ case OP_CLASS: { tcode++; /* In UTF-8 mode, the bits in a bit map correspond to character values, not to byte values. However, the bit map we are constructing is for byte values. So we have to do a conversion for characters whose value is > 127. In fact, there are only two possible starting bytes for characters in the range 128 - 255. */ #ifdef SUPPORT_UTF8 if (utf8) { for (c = 0; c < 16; c++) start_bits[c] |= tcode[c]; for (c = 128; c < 256; c++) { if ((tcode[c/8] && (1 << (c&7))) != 0) { int d = (c >> 6) | 0xc0; /* Set bit for this starter */ start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */ c = (c & 0xc0) + 0x40 - 1; /* next relevant character. */ } } } /* In non-UTF-8 mode, the two bit maps are completely compatible. */ else #endif { for (c = 0; c < 32; c++) start_bits[c] |= tcode[c]; } /* Advance past the bit map, and act on what follows */ tcode += 32; switch (*tcode) { case OP_CRSTAR: case OP_CRMINSTAR: case OP_CRQUERY: case OP_CRMINQUERY: tcode++; break; case OP_CRRANGE: case OP_CRMINRANGE: if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5; else try_next = FALSE; break; default: try_next = FALSE; break; } } break; /* End of bitmap class handling */ } /* End of switch */ } /* End of try_next loop */ code += GET(code, 1); /* Advance to next branch */ } while (*code == OP_ALT); return yield; } /************************************************* * Study a compiled expression * *************************************************/ /* This function is handed a compiled expression that it must study to produce information that will speed up the matching. It returns a pcre_extra block which then gets handed back to pcre_exec(). Arguments: re points to the compiled expression options contains option bits errorptr points to where to place error messages; set NULL unless error Returns: pointer to a pcre_extra block, with study_data filled in and the appropriate flag set; NULL on error or if no optimization possible */ PCRE_EXP_DEFN pcre_extra * pcre_study(const pcre *external_re, int options, const char **errorptr) { uschar start_bits[32]; pcre_extra *extra; pcre_study_data *study; const uschar *tables; uschar *code; compile_data compile_block; const real_pcre *re = (const real_pcre *)external_re; *errorptr = NULL; if (re == NULL || re->magic_number != MAGIC_NUMBER) { *errorptr = "argument is not a compiled regular expression"; return NULL; } if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) { *errorptr = "unknown or incorrect option bit(s) set"; return NULL; } code = (uschar *)re + re->name_table_offset + (re->name_count * re->name_entry_size); /* For an anchored pattern, or an unanchored pattern that has a first char, or a multiline pattern that matches only at "line starts", no further processing at present. */ if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) return NULL; /* Set the character tables in the block that is passed around */ tables = re->tables; if (tables == NULL) (void)pcre_fullinfo(external_re, NULL, PCRE_INFO_DEFAULT_TABLES, (void *)(&tables)); compile_block.lcc = tables + lcc_offset; compile_block.fcc = tables + fcc_offset; compile_block.cbits = tables + cbits_offset; compile_block.ctypes = tables + ctypes_offset; /* See if we can find a fixed set of initial characters for the pattern. */ memset(start_bits, 0, 32 * sizeof(uschar)); if (set_start_bits(code, start_bits, (re->options & PCRE_CASELESS) != 0, (re->options & PCRE_UTF8) != 0, &compile_block) != SSB_DONE) return NULL; /* Get a pcre_extra block and a pcre_study_data block. The study data is put in the latter, which is pointed to by the former, which may also get additional data set later by the calling program. At the moment, the size of pcre_study_data is fixed. We nevertheless save it in a field for returning via the pcre_fullinfo() function so that if it becomes variable in the future, we don't have to change that code. */ extra = (pcre_extra *)(pcre_malloc) (sizeof(pcre_extra) + sizeof(pcre_study_data)); if (extra == NULL) { *errorptr = "failed to get memory"; return NULL; } study = (pcre_study_data *)((char *)extra + sizeof(pcre_extra)); extra->flags = PCRE_EXTRA_STUDY_DATA; extra->study_data = study; study->size = sizeof(pcre_study_data); study->options = PCRE_STUDY_MAPPED; memcpy(study->start_bits, start_bits, sizeof(start_bits)); return extra; } /* End of pcre_study.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_tables.c0000644000373300037200000002163312424517753024702 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains some fixed tables that are used by more than one of the PCRE code modules. The tables are also #included by the pcretest program, which uses macros to change their names from _pcre_xxx to xxxx, thereby avoiding name clashes with the library. */ #include "pcre_setup.h" #include "pcre_internal.h" /* Table of sizes for the fixed-length opcodes. It's defined in a macro so that the definition is next to the definition of the opcodes in pcre_internal.h. */ const uschar _pcre_OP_lengths[] = { OP_LENGTHS }; /************************************************* * Tables for UTF-8 support * *************************************************/ /* These are the breakpoints for different numbers of bytes in a UTF-8 character. */ #ifdef SUPPORT_UTF8 const int _pcre_utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; const int _pcre_utf8_table1_size = sizeof(_pcre_utf8_table1)/sizeof(int); /* These are the indicator bits and the mask for the data bits to set in the first byte of a character, indexed by the number of additional bytes. */ const int _pcre_utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; const int _pcre_utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; /* Table of the number of extra bytes, indexed by the first byte masked with 0x3f. The highest number for a valid UTF-8 first byte is in fact 0x3d. */ const uschar _pcre_utf8_table4[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /* This table translates Unicode property names into type and code values. It is searched by binary chop, so must be in collating sequence of name. */ const ucp_type_table _pcre_utt[] = { { "Any", PT_ANY, 0 }, { "Arabic", PT_SC, ucp_Arabic }, { "Armenian", PT_SC, ucp_Armenian }, { "Balinese", PT_SC, ucp_Balinese }, { "Bengali", PT_SC, ucp_Bengali }, { "Bopomofo", PT_SC, ucp_Bopomofo }, { "Braille", PT_SC, ucp_Braille }, { "Buginese", PT_SC, ucp_Buginese }, { "Buhid", PT_SC, ucp_Buhid }, { "C", PT_GC, ucp_C }, { "Canadian_Aboriginal", PT_SC, ucp_Canadian_Aboriginal }, { "Cc", PT_PC, ucp_Cc }, { "Cf", PT_PC, ucp_Cf }, { "Cherokee", PT_SC, ucp_Cherokee }, { "Cn", PT_PC, ucp_Cn }, { "Co", PT_PC, ucp_Co }, { "Common", PT_SC, ucp_Common }, { "Coptic", PT_SC, ucp_Coptic }, { "Cs", PT_PC, ucp_Cs }, { "Cuneiform", PT_SC, ucp_Cuneiform }, { "Cypriot", PT_SC, ucp_Cypriot }, { "Cyrillic", PT_SC, ucp_Cyrillic }, { "Deseret", PT_SC, ucp_Deseret }, { "Devanagari", PT_SC, ucp_Devanagari }, { "Ethiopic", PT_SC, ucp_Ethiopic }, { "Georgian", PT_SC, ucp_Georgian }, { "Glagolitic", PT_SC, ucp_Glagolitic }, { "Gothic", PT_SC, ucp_Gothic }, { "Greek", PT_SC, ucp_Greek }, { "Gujarati", PT_SC, ucp_Gujarati }, { "Gurmukhi", PT_SC, ucp_Gurmukhi }, { "Han", PT_SC, ucp_Han }, { "Hangul", PT_SC, ucp_Hangul }, { "Hanunoo", PT_SC, ucp_Hanunoo }, { "Hebrew", PT_SC, ucp_Hebrew }, { "Hiragana", PT_SC, ucp_Hiragana }, { "Inherited", PT_SC, ucp_Inherited }, { "Kannada", PT_SC, ucp_Kannada }, { "Katakana", PT_SC, ucp_Katakana }, { "Kharoshthi", PT_SC, ucp_Kharoshthi }, { "Khmer", PT_SC, ucp_Khmer }, { "L", PT_GC, ucp_L }, { "L&", PT_LAMP, 0 }, { "Lao", PT_SC, ucp_Lao }, { "Latin", PT_SC, ucp_Latin }, { "Limbu", PT_SC, ucp_Limbu }, { "Linear_B", PT_SC, ucp_Linear_B }, { "Ll", PT_PC, ucp_Ll }, { "Lm", PT_PC, ucp_Lm }, { "Lo", PT_PC, ucp_Lo }, { "Lt", PT_PC, ucp_Lt }, { "Lu", PT_PC, ucp_Lu }, { "M", PT_GC, ucp_M }, { "Malayalam", PT_SC, ucp_Malayalam }, { "Mc", PT_PC, ucp_Mc }, { "Me", PT_PC, ucp_Me }, { "Mn", PT_PC, ucp_Mn }, { "Mongolian", PT_SC, ucp_Mongolian }, { "Myanmar", PT_SC, ucp_Myanmar }, { "N", PT_GC, ucp_N }, { "Nd", PT_PC, ucp_Nd }, { "New_Tai_Lue", PT_SC, ucp_New_Tai_Lue }, { "Nko", PT_SC, ucp_Nko }, { "Nl", PT_PC, ucp_Nl }, { "No", PT_PC, ucp_No }, { "Ogham", PT_SC, ucp_Ogham }, { "Old_Italic", PT_SC, ucp_Old_Italic }, { "Old_Persian", PT_SC, ucp_Old_Persian }, { "Oriya", PT_SC, ucp_Oriya }, { "Osmanya", PT_SC, ucp_Osmanya }, { "P", PT_GC, ucp_P }, { "Pc", PT_PC, ucp_Pc }, { "Pd", PT_PC, ucp_Pd }, { "Pe", PT_PC, ucp_Pe }, { "Pf", PT_PC, ucp_Pf }, { "Phags_Pa", PT_SC, ucp_Phags_Pa }, { "Phoenician", PT_SC, ucp_Phoenician }, { "Pi", PT_PC, ucp_Pi }, { "Po", PT_PC, ucp_Po }, { "Ps", PT_PC, ucp_Ps }, { "Runic", PT_SC, ucp_Runic }, { "S", PT_GC, ucp_S }, { "Sc", PT_PC, ucp_Sc }, { "Shavian", PT_SC, ucp_Shavian }, { "Sinhala", PT_SC, ucp_Sinhala }, { "Sk", PT_PC, ucp_Sk }, { "Sm", PT_PC, ucp_Sm }, { "So", PT_PC, ucp_So }, { "Syloti_Nagri", PT_SC, ucp_Syloti_Nagri }, { "Syriac", PT_SC, ucp_Syriac }, { "Tagalog", PT_SC, ucp_Tagalog }, { "Tagbanwa", PT_SC, ucp_Tagbanwa }, { "Tai_Le", PT_SC, ucp_Tai_Le }, { "Tamil", PT_SC, ucp_Tamil }, { "Telugu", PT_SC, ucp_Telugu }, { "Thaana", PT_SC, ucp_Thaana }, { "Thai", PT_SC, ucp_Thai }, { "Tibetan", PT_SC, ucp_Tibetan }, { "Tifinagh", PT_SC, ucp_Tifinagh }, { "Ugaritic", PT_SC, ucp_Ugaritic }, { "Yi", PT_SC, ucp_Yi }, { "Z", PT_GC, ucp_Z }, { "Zl", PT_PC, ucp_Zl }, { "Zp", PT_PC, ucp_Zp }, { "Zs", PT_PC, ucp_Zs } }; const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table); #endif /* SUPPORT_UTF8 */ /* End of pcre_tables.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_try_flipped.c0000644000373300037200000001240312424517753025744 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains an internal function that tests a compiled pattern to see if it was compiled with the opposite endianness. If so, it uses an auxiliary local function to flip the appropriate bytes. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Flip bytes in an integer * *************************************************/ /* This function is called when the magic number in a regex doesn't match, in order to flip its bytes to see if we are dealing with a pattern that was compiled on a host of different endianness. If so, this function is used to flip other byte values. Arguments: value the number to flip n the number of bytes to flip (assumed to be 2 or 4) Returns: the flipped value */ static unsigned long int byteflip(unsigned long int value, int n) { if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8); return ((value & 0x000000ff) << 24) | ((value & 0x0000ff00) << 8) | ((value & 0x00ff0000) >> 8) | ((value & 0xff000000) >> 24); } /************************************************* * Test for a byte-flipped compiled regex * *************************************************/ /* This function is called from pcre_exec(), pcre_dfa_exec(), and also from pcre_fullinfo(). Its job is to test whether the regex is byte-flipped - that is, it was compiled on a system of opposite endianness. The function is called only when the native MAGIC_NUMBER test fails. If the regex is indeed flipped, we flip all the relevant values into a different data block, and return it. Arguments: re points to the regex study points to study data, or NULL internal_re points to a new regex block internal_study points to a new study block Returns: the new block if is is indeed a byte-flipped regex NULL if it is not */ real_pcre * _pcre_try_flipped(const real_pcre *re, real_pcre *internal_re, const pcre_study_data *study, pcre_study_data *internal_study) { if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER) return NULL; *internal_re = *re; /* To copy other fields */ internal_re->size = byteflip(re->size, sizeof(re->size)); internal_re->options = byteflip(re->options, sizeof(re->options)); internal_re->top_bracket = (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket)); internal_re->top_backref = (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref)); internal_re->first_byte = (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte)); internal_re->req_byte = (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte)); internal_re->name_table_offset = (pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset)); internal_re->name_entry_size = (pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size)); internal_re->name_count = (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count)); if (study != NULL) { *internal_study = *study; /* To copy other fields */ internal_study->size = byteflip(study->size, sizeof(study->size)); internal_study->options = byteflip(study->options, sizeof(study->options)); } return internal_re; } /* End of pcre_tryflipped.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_ucp_searchfuncs.c0000644000373300037200000001370512424517753026604 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains code for searching the table of Unicode character properties. */ #include "pcre_setup.h" #include "pcre_internal.h" #include "ucp.h" /* Category definitions */ #include "ucpinternal.h" /* Internal table details */ #include "ucptable.h" /* The table itself */ /* Table to translate from particular type value to the general value. */ static const int ucp_gentype[] = { ucp_C, ucp_C, ucp_C, ucp_C, ucp_C, /* Cc, Cf, Cn, Co, Cs */ ucp_L, ucp_L, ucp_L, ucp_L, ucp_L, /* Ll, Lu, Lm, Lo, Lt */ ucp_M, ucp_M, ucp_M, /* Mc, Me, Mn */ ucp_N, ucp_N, ucp_N, /* Nd, Nl, No */ ucp_P, ucp_P, ucp_P, ucp_P, ucp_P, /* Pc, Pd, Pe, Pf, Pi */ ucp_P, ucp_P, /* Ps, Po */ ucp_S, ucp_S, ucp_S, ucp_S, /* Sc, Sk, Sm, So */ ucp_Z, ucp_Z, ucp_Z /* Zl, Zp, Zs */ }; /************************************************* * Search table and return type * *************************************************/ /* Three values are returned: the category is ucp_C, ucp_L, etc. The detailed character type is ucp_Lu, ucp_Nd, etc. The script is ucp_Latin, etc. Arguments: c the character value type_ptr the detailed character type is returned here script_ptr the script is returned here Returns: the character type category */ int _pcre_ucp_findprop(const unsigned int c, int *type_ptr, int *script_ptr) { int bot = 0; int top = sizeof(ucp_table)/sizeof(cnode); int mid; /* The table is searched using a binary chop. You might think that using intermediate variables to hold some of the common expressions would speed things up, but tests with gcc 3.4.4 on Linux showed that, on the contrary, it makes things a lot slower. */ for (;;) { if (top <= bot) { *type_ptr = ucp_Cn; *script_ptr = ucp_Common; return ucp_C; } mid = (bot + top) >> 1; if (c == (ucp_table[mid].f0 & f0_charmask)) break; if (c < (ucp_table[mid].f0 & f0_charmask)) top = mid; else { if ((ucp_table[mid].f0 & f0_rangeflag) != 0 && c <= (ucp_table[mid].f0 & f0_charmask) + (ucp_table[mid].f1 & f1_rangemask)) break; bot = mid + 1; } } /* Found an entry in the table. Set the script and detailed type values, and return the general type. */ *script_ptr = (ucp_table[mid].f0 & f0_scriptmask) >> f0_scriptshift; *type_ptr = (ucp_table[mid].f1 & f1_typemask) >> f1_typeshift; return ucp_gentype[*type_ptr]; } /************************************************* * Search table and return other case * *************************************************/ /* If the given character is a letter, and there is another case for the letter, return the other case. Otherwise, return -1. Arguments: c the character value Returns: the other case or NOTACHAR if none */ unsigned int _pcre_ucp_othercase(const unsigned int c) { int bot = 0; int top = sizeof(ucp_table)/sizeof(cnode); int mid, offset; /* The table is searched using a binary chop. You might think that using intermediate variables to hold some of the common expressions would speed things up, but tests with gcc 3.4.4 on Linux showed that, on the contrary, it makes things a lot slower. */ for (;;) { if (top <= bot) return -1; mid = (bot + top) >> 1; if (c == (ucp_table[mid].f0 & f0_charmask)) break; if (c < (ucp_table[mid].f0 & f0_charmask)) top = mid; else { if ((ucp_table[mid].f0 & f0_rangeflag) != 0 && c <= (ucp_table[mid].f0 & f0_charmask) + (ucp_table[mid].f1 & f1_rangemask)) break; bot = mid + 1; } } /* Found an entry in the table. Return NOTACHAR for a range entry. Otherwise return the other case if there is one, else NOTACHAR. */ if ((ucp_table[mid].f0 & f0_rangeflag) != 0) return NOTACHAR; offset = ucp_table[mid].f1 & f1_casemask; if ((offset & f1_caseneg) != 0) offset |= f1_caseneg; return (offset == 0)? NOTACHAR : c + offset; } /* End of pcre_ucp_searchfuncs.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_valid_utf8.c0000644000373300037200000001254112424517753025473 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains an internal function for validating UTF-8 character strings. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Validate a UTF-8 string * *************************************************/ /* This function is called (optionally) at the start of compile or match, to validate that a supposed UTF-8 string is actually valid. The early check means that subsequent code can assume it is dealing with a valid string. The check can be turned off for maximum performance, but the consequences of supplying an invalid string are then undefined. Originally, this function checked according to RFC 2279, allowing for values in the range 0 to 0x7fffffff, up to 6 bytes long, but ensuring that they were in the canonical format. Once somebody had pointed out RFC 3629 to me (it obsoletes 2279), additional restrictions were applies. The values are now limited to be between 0 and 0x0010ffff, no more than 4 bytes long, and the subrange 0xd000 to 0xdfff is excluded. Arguments: string points to the string length length of string, or -1 if the string is zero-terminated Returns: < 0 if the string is a valid UTF-8 string >= 0 otherwise; the value is the offset of the bad byte */ int _pcre_valid_utf8(const uschar *string, int length) { #ifdef SUPPORT_UTF8 register const uschar *p; if (length < 0) { for (p = string; *p != 0; p++); length = p - string; } for (p = string; length-- > 0; p++) { register int ab; register int c = *p; if (c < 128) continue; if (c < 0xc0) return p - string; ab = _pcre_utf8_table4[c & 0x3f]; /* Number of additional bytes */ if (length < ab || ab > 3) return p - string; length -= ab; /* Check top bits in the second byte */ if ((*(++p) & 0xc0) != 0x80) return p - string; /* Check for overlong sequences for each different length, and for the excluded range 0xd000 to 0xdfff. */ switch (ab) { /* Check for xx00 000x (overlong sequence) */ case 1: if ((c & 0x3e) == 0) return p - string; continue; /* We know there aren't any more bytes to check */ /* Check for 1110 0000, xx0x xxxx (overlong sequence) or 1110 1101, 1010 xxxx (0xd000 - 0xdfff) */ case 2: if ((c == 0xe0 && (*p & 0x20) == 0) || (c == 0xed && *p >= 0xa0)) return p - string; break; /* Check for 1111 0000, xx00 xxxx (overlong sequence) or greater than 0x0010ffff (f4 8f bf bf) */ case 3: if ((c == 0xf0 && (*p & 0x30) == 0) || (c > 0xf4 ) || (c == 0xf4 && *p > 0x8f)) return p - string; break; #if 0 /* These cases can no longer occur, as we restrict to a maximum of four bytes nowadays. Leave the code here in case we ever want to add an option for longer sequences. */ /* Check for 1111 1000, xx00 0xxx */ case 4: if (c == 0xf8 && (*p & 0x38) == 0) return p - string; break; /* Check for leading 0xfe or 0xff, and then for 1111 1100, xx00 00xx */ case 5: if (c == 0xfe || c == 0xff || (c == 0xfc && (*p & 0x3c) == 0)) return p - string; break; #endif } /* Check for valid bytes after the 2nd, if any; all must start 10 */ while (--ab > 0) { if ((*(++p) & 0xc0) != 0x80) return p - string; } } #endif return -1; } /* End of pcre_valid_utf8.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_version.c0000644000373300037200000000753012424517753025115 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains the external function pcre_version(), which returns a string that identifies the PCRE version that is in use. */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Return version string * *************************************************/ /* These macros are the standard way of turning unquoted text into C strings. They allow macros like PCRE_MAJOR to be defined without quotes, which is convenient for user programs that want to test its value. */ #define STRING(a) # a #define XSTRING(s) STRING(s) /* A problem turned up with PCRE_PRERELEASE, which is defined empty for production releases. Originally, it was used naively in this code: return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) XSTRING(PCRE_PRERELEASE) " " XSTRING(PCRE_DATE); However, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of STRING(). The C standard states: "If (before argument substitution) any argument consists of no preprocessing tokens, the behavior is undefined." It turns out the gcc treats this case as a single empty string - which is what we really want - but Visual C grumbles about the lack of an argument for the macro. Unfortunately, both are within their rights. To cope with both ways of handling this, I had resort to some messy hackery that does a test at run time. I could find no way of detecting that a macro is defined as an empty string at pre-processor time. This hack uses a standard trick for avoiding calling the STRING macro with an empty argument when doing the test. */ PCRE_EXP_DEFN const char * pcre_version(void) { return (XSTRING(Z PCRE_PRERELEASE)[1] == 0)? XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) : XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE); } /* End of pcre_version.c */ syncevolution-1.5/src/synthesis/src/pcre/pcre_xclass.c0000644000373300037200000001103012424517753024713 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module contains an internal function that is used to match an extended class (one that contains characters whose values are > 255). It is used by both pcre_exec() and pcre_def_exec(). */ #include "pcre_setup.h" #include "pcre_internal.h" /************************************************* * Match character against an XCLASS * *************************************************/ /* This function is called to match a character against an extended class that might contain values > 255. Arguments: c the character data points to the flag byte of the XCLASS data Returns: TRUE if character matches, else FALSE */ BOOL _pcre_xclass(int c, const uschar *data) { int t; BOOL negated = (*data & XCL_NOT) != 0; /* Character values < 256 are matched against a bitmap, if one is present. If not, we still carry on, because there may be ranges that start below 256 in the additional data. */ if (c < 256) { if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0) return !negated; /* char found */ } /* First skip the bit map if present. Then match against the list of Unicode properties or large chars or ranges that end with a large char. We won't ever encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */ if ((*data++ & XCL_MAP) != 0) data += 32; while ((t = *data++) != XCL_END) { int x, y; if (t == XCL_SINGLE) { GETCHARINC(x, data); if (c == x) return !negated; } else if (t == XCL_RANGE) { GETCHARINC(x, data); GETCHARINC(y, data); if (c >= x && c <= y) return !negated; } #ifdef SUPPORT_UCP else /* XCL_PROP & XCL_NOTPROP */ { int chartype, script; int category = _pcre_ucp_findprop(c, &chartype, &script); switch(*data) { case PT_ANY: if (t == XCL_PROP) return !negated; break; case PT_LAMP: if ((chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt) == (t == XCL_PROP)) return !negated; break; case PT_GC: if ((data[1] == category) == (t == XCL_PROP)) return !negated; break; case PT_PC: if ((data[1] == chartype) == (t == XCL_PROP)) return !negated; break; case PT_SC: if ((data[1] == script) == (t == XCL_PROP)) return !negated; break; /* This should never occur, but compilers may mutter if there is no default. */ default: return FALSE; } data += 2; } #endif /* SUPPORT_UCP */ } return negated; /* char did not match */ } /* End of pcre_xclass.c */ syncevolution-1.5/src/synthesis/src/pcre/pcrecpp.cc0000644000373300037200000007062512424517753024223 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include /* for SHRT_MIN, USHRT_MAX, etc */ #include #include #include #include #include "pcrecpp_internal.h" #include #include "pcrecpp.h" #include "pcre_stringpiece.h" namespace pcrecpp { // Maximum number of args we can set static const int kMaxArgs = 16; static const int kVecSize = (1 + kMaxArgs) * 3; // results + PCRE workspace // Special object that stands-in for no argument PCRECPP_EXP_DEFN Arg no_arg((void*)NULL); // If a regular expression has no error, its error_ field points here static const string empty_string; // If the user doesn't ask for any options, we just use this one static RE_Options default_options; void RE::Init(const string& pat, const RE_Options* options) { pattern_ = pat; if (options == NULL) { options_ = default_options; } else { options_ = *options; } error_ = &empty_string; re_full_ = NULL; re_partial_ = NULL; re_partial_ = Compile(UNANCHORED); if (re_partial_ != NULL) { re_full_ = Compile(ANCHOR_BOTH); } } void RE::Cleanup() { if (re_full_ != NULL) (*pcre_free)(re_full_); if (re_partial_ != NULL) (*pcre_free)(re_partial_); if (error_ != &empty_string) delete error_; } RE::~RE() { Cleanup(); } pcre* RE::Compile(Anchor anchor) { // First, convert RE_Options into pcre options int pcre_options = 0; pcre_options = options_.all_options(); // Special treatment for anchoring. This is needed because at // runtime pcre only provides an option for anchoring at the // beginning of a string (unless you use offset). // // There are three types of anchoring we want: // UNANCHORED Compile the original pattern, and use // a pcre unanchored match. // ANCHOR_START Compile the original pattern, and use // a pcre anchored match. // ANCHOR_BOTH Tack a "\z" to the end of the original pattern // and use a pcre anchored match. const char* compile_error; int eoffset; pcre* re; if (anchor != ANCHOR_BOTH) { re = pcre_compile(pattern_.c_str(), pcre_options, &compile_error, &eoffset, NULL); } else { // Tack a '\z' at the end of RE. Parenthesize it first so that // the '\z' applies to all top-level alternatives in the regexp. string wrapped = "(?:"; // A non-counting grouping operator wrapped += pattern_; wrapped += ")\\z"; re = pcre_compile(wrapped.c_str(), pcre_options, &compile_error, &eoffset, NULL); } if (re == NULL) { if (error_ == &empty_string) error_ = new string(compile_error); } return re; } /***** Matching interfaces *****/ bool RE::FullMatch(const StringPiece& text, const Arg& ptr1, const Arg& ptr2, const Arg& ptr3, const Arg& ptr4, const Arg& ptr5, const Arg& ptr6, const Arg& ptr7, const Arg& ptr8, const Arg& ptr9, const Arg& ptr10, const Arg& ptr11, const Arg& ptr12, const Arg& ptr13, const Arg& ptr14, const Arg& ptr15, const Arg& ptr16) const { const Arg* args[kMaxArgs]; int n = 0; if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; done: int consumed; int vec[kVecSize]; return DoMatchImpl(text, ANCHOR_BOTH, &consumed, args, n, vec, kVecSize); } bool RE::PartialMatch(const StringPiece& text, const Arg& ptr1, const Arg& ptr2, const Arg& ptr3, const Arg& ptr4, const Arg& ptr5, const Arg& ptr6, const Arg& ptr7, const Arg& ptr8, const Arg& ptr9, const Arg& ptr10, const Arg& ptr11, const Arg& ptr12, const Arg& ptr13, const Arg& ptr14, const Arg& ptr15, const Arg& ptr16) const { const Arg* args[kMaxArgs]; int n = 0; if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; done: int consumed; int vec[kVecSize]; return DoMatchImpl(text, UNANCHORED, &consumed, args, n, vec, kVecSize); } bool RE::Consume(StringPiece* input, const Arg& ptr1, const Arg& ptr2, const Arg& ptr3, const Arg& ptr4, const Arg& ptr5, const Arg& ptr6, const Arg& ptr7, const Arg& ptr8, const Arg& ptr9, const Arg& ptr10, const Arg& ptr11, const Arg& ptr12, const Arg& ptr13, const Arg& ptr14, const Arg& ptr15, const Arg& ptr16) const { const Arg* args[kMaxArgs]; int n = 0; if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; done: int consumed; int vec[kVecSize]; if (DoMatchImpl(*input, ANCHOR_START, &consumed, args, n, vec, kVecSize)) { input->remove_prefix(consumed); return true; } else { return false; } } bool RE::FindAndConsume(StringPiece* input, const Arg& ptr1, const Arg& ptr2, const Arg& ptr3, const Arg& ptr4, const Arg& ptr5, const Arg& ptr6, const Arg& ptr7, const Arg& ptr8, const Arg& ptr9, const Arg& ptr10, const Arg& ptr11, const Arg& ptr12, const Arg& ptr13, const Arg& ptr14, const Arg& ptr15, const Arg& ptr16) const { const Arg* args[kMaxArgs]; int n = 0; if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; done: int consumed; int vec[kVecSize]; if (DoMatchImpl(*input, UNANCHORED, &consumed, args, n, vec, kVecSize)) { input->remove_prefix(consumed); return true; } else { return false; } } bool RE::Replace(const StringPiece& rewrite, string *str) const { int vec[kVecSize]; int matches = TryMatch(*str, 0, UNANCHORED, vec, kVecSize); if (matches == 0) return false; string s; if (!Rewrite(&s, rewrite, *str, vec, matches)) return false; assert(vec[0] >= 0); assert(vec[1] >= 0); str->replace(vec[0], vec[1] - vec[0], s); return true; } // Returns PCRE_NEWLINE_CRLF, PCRE_NEWLINE_CR, or PCRE_NEWLINE_LF. // Note that PCRE_NEWLINE_CRLF is defined to be P_N_CR | P_N_LF. static int NewlineMode(int pcre_options) { // TODO: if we can make it threadsafe, cache this var int newline_mode = 0; /* if (newline_mode) return newline_mode; */ // do this once it's cached if (pcre_options & (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF)) { newline_mode = (pcre_options & (PCRE_NEWLINE_CRLF|PCRE_NEWLINE_CR|PCRE_NEWLINE_LF)); } else { int newline; pcre_config(PCRE_CONFIG_NEWLINE, &newline); if (newline == 10) newline_mode = PCRE_NEWLINE_LF; else if (newline == 13) newline_mode = PCRE_NEWLINE_CR; else if (newline == 3338) newline_mode = PCRE_NEWLINE_CRLF; else assert("" == "Unexpected return value from pcre_config(NEWLINE)"); } return newline_mode; } int RE::GlobalReplace(const StringPiece& rewrite, string *str) const { int count = 0; int vec[kVecSize]; string out; int start = 0; int lastend = -1; for (; start <= static_cast(str->length()); count++) { int matches = TryMatch(*str, start, UNANCHORED, vec, kVecSize); if (matches <= 0) break; int matchstart = vec[0], matchend = vec[1]; assert(matchstart >= start); assert(matchend >= matchstart); if (matchstart == matchend && matchstart == lastend) { // advance one character if we matched an empty string at the same // place as the last match occurred matchend = start + 1; // If the current char is CR and we're in CRLF mode, skip LF too. // Note it's better to call pcre_fullinfo() than to examine // all_options(), since options_ could have changed bewteen // compile-time and now, but this is simpler and safe enough. if (start+1 < static_cast(str->length()) && (*str)[start] == '\r' && (*str)[start+1] == '\n' && NewlineMode(options_.all_options()) == PCRE_NEWLINE_CRLF) { matchend++; } // We also need to advance more than one char if we're in utf8 mode. #ifdef SUPPORT_UTF8 if (options_.utf8()) { while (matchend < static_cast(str->length()) && ((*str)[matchend] & 0xc0) == 0x80) matchend++; } #endif if (matchend <= static_cast(str->length())) out.append(*str, start, matchend - start); start = matchend; } else { out.append(*str, start, matchstart - start); Rewrite(&out, rewrite, *str, vec, matches); start = matchend; lastend = matchend; count++; } } if (count == 0) return 0; if (start < static_cast(str->length())) out.append(*str, start, str->length() - start); swap(out, *str); return count; } bool RE::Extract(const StringPiece& rewrite, const StringPiece& text, string *out) const { int vec[kVecSize]; int matches = TryMatch(text, 0, UNANCHORED, vec, kVecSize); if (matches == 0) return false; out->erase(); return Rewrite(out, rewrite, text, vec, matches); } /*static*/ string RE::QuoteMeta(const StringPiece& unquoted) { string result; // Escape any ascii character not in [A-Za-z_0-9]. // // Note that it's legal to escape a character even if it has no // special meaning in a regular expression -- so this function does // that. (This also makes it identical to the perl function of the // same name; see `perldoc -f quotemeta`.) for (int ii = 0; ii < unquoted.size(); ++ii) { // Note that using 'isalnum' here raises the benchmark time from // 32ns to 58ns: if ((unquoted[ii] < 'a' || unquoted[ii] > 'z') && (unquoted[ii] < 'A' || unquoted[ii] > 'Z') && (unquoted[ii] < '0' || unquoted[ii] > '9') && unquoted[ii] != '_' && // If this is the part of a UTF8 or Latin1 character, we need // to copy this byte without escaping. Experimentally this is // what works correctly with the regexp library. !(unquoted[ii] & 128)) { result += '\\'; } result += unquoted[ii]; } return result; } /***** Actual matching and rewriting code *****/ int RE::TryMatch(const StringPiece& text, int startpos, Anchor anchor, int *vec, int vecsize) const { pcre* re = (anchor == ANCHOR_BOTH) ? re_full_ : re_partial_; if (re == NULL) { //fprintf(stderr, "Matching against invalid re: %s\n", error_->c_str()); return 0; } pcre_extra extra = { 0, 0, 0, 0, 0, 0 }; if (options_.match_limit() > 0) { extra.flags |= PCRE_EXTRA_MATCH_LIMIT; extra.match_limit = options_.match_limit(); } if (options_.match_limit_recursion() > 0) { extra.flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION; extra.match_limit_recursion = options_.match_limit_recursion(); } int rc = pcre_exec(re, // The regular expression object &extra, (text.data() == NULL) ? "" : text.data(), text.size(), startpos, (anchor == UNANCHORED) ? 0 : PCRE_ANCHORED, vec, vecsize); // Handle errors if (rc == PCRE_ERROR_NOMATCH) { return 0; } else if (rc < 0) { //fprintf(stderr, "Unexpected return code: %d when matching '%s'\n", // re, pattern_.c_str()); return 0; } else if (rc == 0) { // pcre_exec() returns 0 as a special case when the number of // capturing subpatterns exceeds the size of the vector. // When this happens, there is a match and the output vector // is filled, but we miss out on the positions of the extra subpatterns. rc = vecsize / 2; } return rc; } bool RE::DoMatchImpl(const StringPiece& text, Anchor anchor, int* consumed, const Arg* const* args, int n, int* vec, int vecsize) const { assert((1 + n) * 3 <= vecsize); // results + PCRE workspace int matches = TryMatch(text, 0, anchor, vec, vecsize); assert(matches >= 0); // TryMatch never returns negatives if (matches == 0) return false; *consumed = vec[1]; if (n == 0 || args == NULL) { // We are not interested in results return true; } if (NumberOfCapturingGroups() < n) { // RE has fewer capturing groups than number of arg pointers passed in return false; } // If we got here, we must have matched the whole pattern. // We do not need (can not do) any more checks on the value of 'matches' here // -- see the comment for TryMatch. for (int i = 0; i < n; i++) { const int start = vec[2*(i+1)]; const int limit = vec[2*(i+1)+1]; if (!args[i]->Parse(text.data() + start, limit-start)) { // TODO: Should we indicate what the error was? return false; } } return true; } bool RE::DoMatch(const StringPiece& text, Anchor anchor, int* consumed, const Arg* const args[], int n) const { assert(n >= 0); size_t const vecsize = (1 + n) * 3; // results + PCRE workspace // (as for kVecSize) int space[21]; // use stack allocation for small vecsize (common case) int* vec = vecsize <= 21 ? space : new int[vecsize]; bool retval = DoMatchImpl(text, anchor, consumed, args, n, vec, vecsize); if (vec != space) delete [] vec; return retval; } bool RE::Rewrite(string *out, const StringPiece &rewrite, const StringPiece &text, int *vec, int veclen) const { for (const char *s = rewrite.data(), *end = s + rewrite.size(); s < end; s++) { int c = *s; if (c == '\\') { c = *++s; if (isdigit(c)) { int n = (c - '0'); if (n >= veclen) { //fprintf(stderr, requested group %d in regexp %.*s\n", // n, rewrite.size(), rewrite.data()); return false; } int start = vec[2 * n]; if (start >= 0) out->append(text.data() + start, vec[2 * n + 1] - start); } else if (c == '\\') { out->push_back('\\'); } else { //fprintf(stderr, "invalid rewrite pattern: %.*s\n", // rewrite.size(), rewrite.data()); return false; } } else { out->push_back(c); } } return true; } // Return the number of capturing subpatterns, or -1 if the // regexp wasn't valid on construction. int RE::NumberOfCapturingGroups() const { if (re_partial_ == NULL) return -1; int result; int pcre_retval = pcre_fullinfo(re_partial_, // The regular expression object NULL, // We did not study the pattern PCRE_INFO_CAPTURECOUNT, &result); assert(pcre_retval == 0); return result; } /***** Parsers for various types *****/ bool Arg::parse_null(const char* str, int n, void* dest) { // We fail if somebody asked us to store into a non-NULL void* pointer return (dest == NULL); } bool Arg::parse_string(const char* str, int n, void* dest) { reinterpret_cast(dest)->assign(str, n); return true; } bool Arg::parse_stringpiece(const char* str, int n, void* dest) { reinterpret_cast(dest)->set(str, n); return true; } bool Arg::parse_char(const char* str, int n, void* dest) { if (n != 1) return false; *(reinterpret_cast(dest)) = str[0]; return true; } bool Arg::parse_uchar(const char* str, int n, void* dest) { if (n != 1) return false; *(reinterpret_cast(dest)) = str[0]; return true; } // Largest number spec that we are willing to parse static const int kMaxNumberLength = 32; // REQUIRES "buf" must have length at least kMaxNumberLength+1 // REQUIRES "n > 0" // Copies "str" into "buf" and null-terminates if necessary. // Returns one of: // a. "str" if no termination is needed // b. "buf" if the string was copied and null-terminated // c. "" if the input was invalid and has no hope of being parsed static const char* TerminateNumber(char* buf, const char* str, int n) { if ((n > 0) && isspace(*str)) { // We are less forgiving than the strtoxxx() routines and do not // allow leading spaces. return ""; } // See if the character right after the input text may potentially // look like a digit. if (isdigit(str[n]) || ((str[n] >= 'a') && (str[n] <= 'f')) || ((str[n] >= 'A') && (str[n] <= 'F'))) { if (n > kMaxNumberLength) return ""; // Input too big to be a valid number memcpy(buf, str, n); buf[n] = '\0'; return buf; } else { // We can parse right out of the supplied string, so return it. return str; } } bool Arg::parse_long_radix(const char* str, int n, void* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, str, n); char* end; errno = 0; long r = strtol(str, &end, radix); if (end != str + n) return false; // Leftover junk if (errno) return false; *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_ulong_radix(const char* str, int n, void* dest, int radix) { if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, str, n); if (str[0] == '-') return false; // strtoul() on a negative number?! char* end; errno = 0; unsigned long r = strtoul(str, &end, radix); if (end != str + n) return false; // Leftover junk if (errno) return false; *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_short_radix(const char* str, int n, void* dest, int radix) { long r; if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse if (r < SHRT_MIN || r > SHRT_MAX) return false; // Out of range *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_ushort_radix(const char* str, int n, void* dest, int radix) { unsigned long r; if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse if (r > USHRT_MAX) return false; // Out of range *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_int_radix(const char* str, int n, void* dest, int radix) { long r; if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse if (r < INT_MIN || r > INT_MAX) return false; // Out of range *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_uint_radix(const char* str, int n, void* dest, int radix) { unsigned long r; if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse if (r > UINT_MAX) return false; // Out of range *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_longlong_radix(const char* str, int n, void* dest, int radix) { #ifndef HAVE_LONG_LONG return false; #else if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, str, n); char* end; errno = 0; #if defined HAVE_STRTOQ long long r = strtoq(str, &end, radix); #elif defined HAVE_STRTOLL long long r = strtoll(str, &end, radix); #else #error parse_longlong_radix: cannot convert input to a long-long #endif if (end != str + n) return false; // Leftover junk if (errno) return false; *(reinterpret_cast(dest)) = r; return true; #endif /* HAVE_LONG_LONG */ } bool Arg::parse_ulonglong_radix(const char* str, int n, void* dest, int radix) { #ifndef HAVE_UNSIGNED_LONG_LONG return false; #else if (n == 0) return false; char buf[kMaxNumberLength+1]; str = TerminateNumber(buf, str, n); if (str[0] == '-') return false; // strtoull() on a negative number?! char* end; errno = 0; #if defined HAVE_STRTOQ unsigned long long r = strtouq(str, &end, radix); #elif defined HAVE_STRTOLL unsigned long long r = strtoull(str, &end, radix); #else #error parse_ulonglong_radix: cannot convert input to a long-long #endif if (end != str + n) return false; // Leftover junk if (errno) return false; *(reinterpret_cast(dest)) = r; return true; #endif /* HAVE_UNSIGNED_LONG_LONG */ } bool Arg::parse_double(const char* str, int n, void* dest) { if (n == 0) return false; static const int kMaxLength = 200; char buf[kMaxLength]; if (n >= kMaxLength) return false; memcpy(buf, str, n); buf[n] = '\0'; errno = 0; char* end; double r = strtod(buf, &end); if (end != buf + n) return false; // Leftover junk if (errno) return false; *(reinterpret_cast(dest)) = r; return true; } bool Arg::parse_float(const char* str, int n, void* dest) { double r; if (!parse_double(str, n, &r)) return false; *(reinterpret_cast(dest)) = static_cast(r); return true; } #define DEFINE_INTEGER_PARSERS(name) \ bool Arg::parse_##name(const char* str, int n, void* dest) { \ return parse_##name##_radix(str, n, dest, 10); \ } \ bool Arg::parse_##name##_hex(const char* str, int n, void* dest) { \ return parse_##name##_radix(str, n, dest, 16); \ } \ bool Arg::parse_##name##_octal(const char* str, int n, void* dest) { \ return parse_##name##_radix(str, n, dest, 8); \ } \ bool Arg::parse_##name##_cradix(const char* str, int n, void* dest) { \ return parse_##name##_radix(str, n, dest, 0); \ } DEFINE_INTEGER_PARSERS(short) /* */ DEFINE_INTEGER_PARSERS(ushort) /* */ DEFINE_INTEGER_PARSERS(int) /* Don't use semicolons after these */ DEFINE_INTEGER_PARSERS(uint) /* statements because they can cause */ DEFINE_INTEGER_PARSERS(long) /* compiler warnings if the checking */ DEFINE_INTEGER_PARSERS(ulong) /* level is turned up high enough. */ DEFINE_INTEGER_PARSERS(longlong) /* */ DEFINE_INTEGER_PARSERS(ulonglong) /* */ #undef DEFINE_INTEGER_PARSERS } // namespace pcrecpp syncevolution-1.5/src/synthesis/src/pcre/pcrecpp.h0000644000373300037200000006241312424517753024061 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat // Support for PCRE_XXX modifiers added by Giuseppe Maxia, July 2005 #ifndef _PCRECPP_H #define _PCRECPP_H // C++ interface to the pcre regular-expression library. RE supports // Perl-style regular expressions (with extensions like \d, \w, \s, // ...). // // ----------------------------------------------------------------------- // REGEXP SYNTAX: // // This module is part of the pcre library and hence supports its syntax // for regular expressions. // // The syntax is pretty similar to Perl's. For those not familiar // with Perl's regular expressions, here are some examples of the most // commonly used extensions: // // "hello (\\w+) world" -- \w matches a "word" character // "version (\\d+)" -- \d matches a digit // "hello\\s+world" -- \s matches any whitespace character // "\\b(\\w+)\\b" -- \b matches empty string at a word boundary // "(?i)hello" -- (?i) turns on case-insensitive matching // "/\\*(.*?)\\*/" -- .*? matches . minimum no. of times possible // // ----------------------------------------------------------------------- // MATCHING INTERFACE: // // The "FullMatch" operation checks that supplied text matches a // supplied pattern exactly. // // Example: successful match // pcrecpp::RE re("h.*o"); // re.FullMatch("hello"); // // Example: unsuccessful match (requires full match): // pcrecpp::RE re("e"); // !re.FullMatch("hello"); // // Example: creating a temporary RE object: // pcrecpp::RE("h.*o").FullMatch("hello"); // // You can pass in a "const char*" or a "string" for "text". The // examples below tend to use a const char*. // // You can, as in the different examples above, store the RE object // explicitly in a variable or use a temporary RE object. The // examples below use one mode or the other arbitrarily. Either // could correctly be used for any of these examples. // // ----------------------------------------------------------------------- // MATCHING WITH SUB-STRING EXTRACTION: // // You can supply extra pointer arguments to extract matched subpieces. // // Example: extracts "ruby" into "s" and 1234 into "i" // int i; // string s; // pcrecpp::RE re("(\\w+):(\\d+)"); // re.FullMatch("ruby:1234", &s, &i); // // Example: does not try to extract any extra sub-patterns // re.FullMatch("ruby:1234", &s); // // Example: does not try to extract into NULL // re.FullMatch("ruby:1234", NULL, &i); // // Example: integer overflow causes failure // !re.FullMatch("ruby:1234567891234", NULL, &i); // // Example: fails because there aren't enough sub-patterns: // !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s); // // Example: fails because string cannot be stored in integer // !pcrecpp::RE("(.*)").FullMatch("ruby", &i); // // The provided pointer arguments can be pointers to any scalar numeric // type, or one of // string (matched piece is copied to string) // StringPiece (StringPiece is mutated to point to matched piece) // T (where "bool T::ParseFrom(const char*, int)" exists) // NULL (the corresponding matched sub-pattern is not copied) // // CAVEAT: An optional sub-pattern that does not exist in the matched // string is assigned the empty string. Therefore, the following will // return false (because the empty string is not a valid number): // int number; // pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number); // // ----------------------------------------------------------------------- // DO_MATCH // // The matching interface supports at most 16 arguments per call. // If you need more, consider using the more general interface // pcrecpp::RE::DoMatch(). See pcrecpp.h for the signature for DoMatch. // // ----------------------------------------------------------------------- // PARTIAL MATCHES // // You can use the "PartialMatch" operation when you want the pattern // to match any substring of the text. // // Example: simple search for a string: // pcrecpp::RE("ell").PartialMatch("hello"); // // Example: find first number in a string: // int number; // pcrecpp::RE re("(\\d+)"); // re.PartialMatch("x*100 + 20", &number); // assert(number == 100); // // ----------------------------------------------------------------------- // UTF-8 AND THE MATCHING INTERFACE: // // By default, pattern and text are plain text, one byte per character. // The UTF8 flag, passed to the constructor, causes both pattern // and string to be treated as UTF-8 text, still a byte stream but // potentially multiple bytes per character. In practice, the text // is likelier to be UTF-8 than the pattern, but the match returned // may depend on the UTF8 flag, so always use it when matching // UTF8 text. E.g., "." will match one byte normally but with UTF8 // set may match up to three bytes of a multi-byte character. // // Example: // pcrecpp::RE_Options options; // options.set_utf8(); // pcrecpp::RE re(utf8_pattern, options); // re.FullMatch(utf8_string); // // Example: using the convenience function UTF8(): // pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8()); // re.FullMatch(utf8_string); // // NOTE: The UTF8 option is ignored if pcre was not configured with the // --enable-utf8 flag. // // ----------------------------------------------------------------------- // PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE // // PCRE defines some modifiers to change the behavior of the regular // expression engine. // The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle // to pass such modifiers to a RE class. // // Currently, the following modifiers are supported // // modifier description Perl corresponding // // PCRE_CASELESS case insensitive match /i // PCRE_MULTILINE multiple lines match /m // PCRE_DOTALL dot matches newlines /s // PCRE_DOLLAR_ENDONLY $ matches only at end N/A // PCRE_EXTRA strict escape parsing N/A // PCRE_EXTENDED ignore whitespaces /x // PCRE_UTF8 handles UTF8 chars built-in // PCRE_UNGREEDY reverses * and *? N/A // PCRE_NO_AUTO_CAPTURE disables matching parens N/A (*) // // (For a full account on how each modifier works, please check the // PCRE API reference manual). // // (*) Both Perl and PCRE allow non matching parentheses by means of the // "?:" modifier within the pattern itself. e.g. (?:ab|cd) does not // capture, while (ab|cd) does. // // For each modifier, there are two member functions whose name is made // out of the modifier in lowercase, without the "PCRE_" prefix. For // instance, PCRE_CASELESS is handled by // bool caseless(), // which returns true if the modifier is set, and // RE_Options & set_caseless(bool), // which sets or unsets the modifier. // // Moreover, PCRE_EXTRA_MATCH_LIMIT can be accessed through the // set_match_limit() and match_limit() member functions. // Setting match_limit to a non-zero value will limit the executation of // pcre to keep it from doing bad things like blowing the stack or taking // an eternity to return a result. A value of 5000 is good enough to stop // stack blowup in a 2MB thread stack. Setting match_limit to zero will // disable match limiting. Alternately, you can set match_limit_recursion() // which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much pcre // recurses. match_limit() caps the number of matches pcre does; // match_limit_recrusion() caps the depth of recursion. // // Normally, to pass one or more modifiers to a RE class, you declare // a RE_Options object, set the appropriate options, and pass this // object to a RE constructor. Example: // // RE_options opt; // opt.set_caseless(true); // // if (RE("HELLO", opt).PartialMatch("hello world")) ... // // RE_options has two constructors. The default constructor takes no // arguments and creates a set of flags that are off by default. // // The optional parameter 'option_flags' is to facilitate transfer // of legacy code from C programs. This lets you do // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); // // But new code is better off doing // RE(pattern, // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); // (See below) // // If you are going to pass one of the most used modifiers, there are some // convenience functions that return a RE_Options class with the // appropriate modifier already set: // CASELESS(), UTF8(), MULTILINE(), DOTALL(), EXTENDED() // // If you need to set several options at once, and you don't want to go // through the pains of declaring a RE_Options object and setting several // options, there is a parallel method that give you such ability on the // fly. You can concatenate several set_xxxxx member functions, since each // of them returns a reference to its class object. e.g.: to pass // PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one // statement, you may write // // RE(" ^ xyz \\s+ .* blah$", RE_Options() // .set_caseless(true) // .set_extended(true) // .set_multiline(true)).PartialMatch(sometext); // // ----------------------------------------------------------------------- // SCANNING TEXT INCREMENTALLY // // The "Consume" operation may be useful if you want to repeatedly // match regular expressions at the front of a string and skip over // them as they match. This requires use of the "StringPiece" type, // which represents a sub-range of a real string. Like RE, StringPiece // is defined in the pcrecpp namespace. // // Example: read lines of the form "var = value" from a string. // string contents = ...; // Fill string somehow // pcrecpp::StringPiece input(contents); // Wrap in a StringPiece // // string var; // int value; // pcrecpp::RE re("(\\w+) = (\\d+)\n"); // while (re.Consume(&input, &var, &value)) { // ...; // } // // Each successful call to "Consume" will set "var/value", and also // advance "input" so it points past the matched text. // // The "FindAndConsume" operation is similar to "Consume" but does not // anchor your match at the beginning of the string. For example, you // could extract all words from a string by repeatedly calling // pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word) // // ----------------------------------------------------------------------- // PARSING HEX/OCTAL/C-RADIX NUMBERS // // By default, if you pass a pointer to a numeric value, the // corresponding text is interpreted as a base-10 number. You can // instead wrap the pointer with a call to one of the operators Hex(), // Octal(), or CRadix() to interpret the text in another base. The // CRadix operator interprets C-style "0" (base-8) and "0x" (base-16) // prefixes, but defaults to base-10. // // Example: // int a, b, c, d; // pcrecpp::RE re("(.*) (.*) (.*) (.*)"); // re.FullMatch("100 40 0100 0x40", // pcrecpp::Octal(&a), pcrecpp::Hex(&b), // pcrecpp::CRadix(&c), pcrecpp::CRadix(&d)); // will leave 64 in a, b, c, and d. // // ----------------------------------------------------------------------- // REPLACING PARTS OF STRINGS // // You can replace the first match of "pattern" in "str" with // "rewrite". Within "rewrite", backslash-escaped digits (\1 to \9) // can be used to insert text matching corresponding parenthesized // group from the pattern. \0 in "rewrite" refers to the entire // matching text. E.g., // // string s = "yabba dabba doo"; // pcrecpp::RE("b+").Replace("d", &s); // // will leave "s" containing "yada dabba doo". The result is true if // the pattern matches and a replacement occurs, or false otherwise. // // GlobalReplace() is like Replace(), except that it replaces all // occurrences of the pattern in the string with the rewrite. // Replacements are not subject to re-matching. E.g., // // string s = "yabba dabba doo"; // pcrecpp::RE("b+").GlobalReplace("d", &s); // // will leave "s" containing "yada dada doo". It returns the number // of replacements made. // // Extract() is like Replace(), except that if the pattern matches, // "rewrite" is copied into "out" (an additional argument) with // substitutions. The non-matching portions of "text" are ignored. // Returns true iff a match occurred and the extraction happened // successfully. If no match occurs, the string is left unaffected. #include #include #include // defines the Arg class // This isn't technically needed here, but we include it // anyway so folks who include pcrecpp.h don't have to. #include namespace pcrecpp { #define PCRE_SET_OR_CLEAR(b, o) \ if (b) all_options_ |= (o); else all_options_ &= ~(o); \ return *this #define PCRE_IS_SET(o) \ (all_options_ & o) == o // We convert user-passed pointers into special Arg objects PCRECPP_EXP_DECL Arg no_arg; /***** Compiling regular expressions: the RE class *****/ // RE_Options allow you to set options to be passed along to pcre, // along with other options we put on top of pcre. // Only 9 modifiers, plus match_limit and match_limit_recursion, // are supported now. class PCRECPP_EXP_DEFN RE_Options { public: // constructor RE_Options() : match_limit_(0), match_limit_recursion_(0), all_options_(0) {} // alternative constructor. // To facilitate transfer of legacy code from C programs // // This lets you do // RE(pattern, RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str); // But new code is better off doing // RE(pattern, // RE_Options().set_caseless(true).set_multiline(true)).PartialMatch(str); RE_Options(int option_flags) : match_limit_(0), match_limit_recursion_(0), all_options_(option_flags) {} // we're fine with the default destructor, copy constructor, etc. // accessors and mutators int match_limit() const { return match_limit_; }; RE_Options &set_match_limit(int limit) { match_limit_ = limit; return *this; } int match_limit_recursion() const { return match_limit_recursion_; }; RE_Options &set_match_limit_recursion(int limit) { match_limit_recursion_ = limit; return *this; } bool caseless() const { return PCRE_IS_SET(PCRE_CASELESS); } RE_Options &set_caseless(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_CASELESS); } bool multiline() const { return PCRE_IS_SET(PCRE_MULTILINE); } RE_Options &set_multiline(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_MULTILINE); } bool dotall() const { return PCRE_IS_SET(PCRE_DOTALL); } RE_Options &set_dotall(bool x) { PCRE_SET_OR_CLEAR(x,PCRE_DOTALL); } bool extended() const { return PCRE_IS_SET(PCRE_EXTENDED); } RE_Options &set_extended(bool x) { PCRE_SET_OR_CLEAR(x,PCRE_EXTENDED); } bool dollar_endonly() const { return PCRE_IS_SET(PCRE_DOLLAR_ENDONLY); } RE_Options &set_dollar_endonly(bool x) { PCRE_SET_OR_CLEAR(x,PCRE_DOLLAR_ENDONLY); } bool extra() const { return PCRE_IS_SET( PCRE_EXTRA); } RE_Options &set_extra(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_EXTRA); } bool ungreedy() const { return PCRE_IS_SET(PCRE_UNGREEDY); } RE_Options &set_ungreedy(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_UNGREEDY); } bool utf8() const { return PCRE_IS_SET(PCRE_UTF8); } RE_Options &set_utf8(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_UTF8); } bool no_auto_capture() const { return PCRE_IS_SET(PCRE_NO_AUTO_CAPTURE); } RE_Options &set_no_auto_capture(bool x) { PCRE_SET_OR_CLEAR(x, PCRE_NO_AUTO_CAPTURE); } RE_Options &set_all_options(int opt) { all_options_ = opt; return *this; } int all_options() const { return all_options_ ; } // TODO: add other pcre flags private: int match_limit_; int match_limit_recursion_; int all_options_; }; // These functions return some common RE_Options static inline RE_Options UTF8() { return RE_Options().set_utf8(true); } static inline RE_Options CASELESS() { return RE_Options().set_caseless(true); } static inline RE_Options MULTILINE() { return RE_Options().set_multiline(true); } static inline RE_Options DOTALL() { return RE_Options().set_dotall(true); } static inline RE_Options EXTENDED() { return RE_Options().set_extended(true); } // Interface for regular expression matching. Also corresponds to a // pre-compiled regular expression. An "RE" object is safe for // concurrent use by multiple threads. class PCRECPP_EXP_DEFN RE { public: // We provide implicit conversions from strings so that users can // pass in a string or a "const char*" wherever an "RE" is expected. RE(const char* pat) { Init(pat, NULL); } RE(const char *pat, const RE_Options& option) { Init(pat, &option); } RE(const string& pat) { Init(pat, NULL); } RE(const string& pat, const RE_Options& option) { Init(pat, &option); } // Copy constructor & assignment - note that these are expensive // because they recompile the expression. RE(const RE& re) { Init(re.pattern_, &re.options_); } const RE& operator=(const RE& re) { if (this != &re) { Cleanup(); // This is the code that originally came from Google // Init(re.pattern_.c_str(), &re.options_); // This is the replacement from Ari Pollak Init(re.pattern_, &re.options_); } return *this; } ~RE(); // The string specification for this RE. E.g. // RE re("ab*c?d+"); // re.pattern(); // "ab*c?d+" const string& pattern() const { return pattern_; } // If RE could not be created properly, returns an error string. // Else returns the empty string. const string& error() const { return *error_; } /***** The useful part: the matching interface *****/ // This is provided so one can do pattern.ReplaceAll() just as // easily as ReplaceAll(pattern-text, ....) bool FullMatch(const StringPiece& text, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool PartialMatch(const StringPiece& text, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool Consume(StringPiece* input, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool FindAndConsume(StringPiece* input, const Arg& ptr1 = no_arg, const Arg& ptr2 = no_arg, const Arg& ptr3 = no_arg, const Arg& ptr4 = no_arg, const Arg& ptr5 = no_arg, const Arg& ptr6 = no_arg, const Arg& ptr7 = no_arg, const Arg& ptr8 = no_arg, const Arg& ptr9 = no_arg, const Arg& ptr10 = no_arg, const Arg& ptr11 = no_arg, const Arg& ptr12 = no_arg, const Arg& ptr13 = no_arg, const Arg& ptr14 = no_arg, const Arg& ptr15 = no_arg, const Arg& ptr16 = no_arg) const; bool Replace(const StringPiece& rewrite, string *str) const; int GlobalReplace(const StringPiece& rewrite, string *str) const; bool Extract(const StringPiece &rewrite, const StringPiece &text, string *out) const; // Escapes all potentially meaningful regexp characters in // 'unquoted'. The returned string, used as a regular expression, // will exactly match the original string. For example, // 1.5-2.0? // may become: // 1\.5\-2\.0\? static string QuoteMeta(const StringPiece& unquoted); /***** Generic matching interface *****/ // Type of match (TODO: Should be restructured as part of RE_Options) enum Anchor { UNANCHORED, // No anchoring ANCHOR_START, // Anchor at start only ANCHOR_BOTH // Anchor at start and end }; // General matching routine. Stores the length of the match in // "*consumed" if successful. bool DoMatch(const StringPiece& text, Anchor anchor, int* consumed, const Arg* const* args, int n) const; // Return the number of capturing subpatterns, or -1 if the // regexp wasn't valid on construction. int NumberOfCapturingGroups() const; private: void Init(const string& pattern, const RE_Options* options); void Cleanup(); // Match against "text", filling in "vec" (up to "vecsize" * 2/3) with // pairs of integers for the beginning and end positions of matched // text. The first pair corresponds to the entire matched text; // subsequent pairs correspond, in order, to parentheses-captured // matches. Returns the number of pairs (one more than the number of // the last subpattern with a match) if matching was successful // and zero if the match failed. // I.e. for RE("(foo)|(bar)|(baz)") it will return 2, 3, and 4 when matching // against "foo", "bar", and "baz" respectively. // When matching RE("(foo)|hello") against "hello", it will return 1. // But the values for all subpattern are filled in into "vec". int TryMatch(const StringPiece& text, int startpos, Anchor anchor, int *vec, int vecsize) const; // Append the "rewrite" string, with backslash subsitutions from "text" // and "vec", to string "out". bool Rewrite(string *out, const StringPiece& rewrite, const StringPiece& text, int *vec, int veclen) const; // internal implementation for DoMatch bool DoMatchImpl(const StringPiece& text, Anchor anchor, int* consumed, const Arg* const args[], int n, int* vec, int vecsize) const; // Compile the regexp for the specified anchoring mode pcre* Compile(Anchor anchor); string pattern_; RE_Options options_; pcre* re_full_; // For full matches pcre* re_partial_; // For partial matches const string* error_; // Error indicator (or points to empty string) }; } // namespace pcrecpp #endif /* _PCRECPP_H */ syncevolution-1.5/src/synthesis/src/pcre/pcrecpp_internal.h0000644000373300037200000000540412424517753025752 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ #ifndef PCRECPP_INTERNAL_H #define PCRECPP_INTERNAL_H /* When compiling a DLL for Windows, the exported symbols have to be declared using some MS magic. I found some useful information on this web page: http://msdn2.microsoft.com/en-us/library/y4h7bcy6(VS.80).aspx. According to the information there, using __declspec(dllexport) without "extern" we have a definition; with "extern" we have a declaration. The settings here override the setting in pcre.h. We use: PCRECPP_EXP_DECL for declarations PCRECPP_EXP_DEFN for definitions of exported functions */ #ifndef PCRECPP_EXP_DECL # ifdef _WIN32 # ifndef PCRECPP_STATIC # define PCRECPP_EXP_DECL extern __declspec(dllexport) # define PCRECPP_EXP_DEFN __declspec(dllexport) # else # define PCRECPP_EXP_DECL extern # define PCRECPP_EXP_DEFN # endif # else # define PCRECPP_EXP_DECL extern # define PCRECPP_EXP_DEFN # endif #endif #endif /* PCRECPP_INTERNAL_H */ /* End of pcrecpp_internal.h */ syncevolution-1.5/src/synthesis/src/pcre/pcrecpp_unittest.cc0000644000373300037200000011146512424517753026160 0ustar00nightlyallusers00000000000000// -*- coding: utf-8 -*- // // Copyright (c) 2005 - 2006, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat // // TODO: Test extractions for PartialMatch/Consume #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "pcrecpp.h" using pcrecpp::StringPiece; using pcrecpp::RE; using pcrecpp::RE_Options; using pcrecpp::Hex; using pcrecpp::Octal; using pcrecpp::CRadix; static bool VERBOSE_TEST = false; // CHECK dies with a fatal error if condition is not true. It is *not* // controlled by NDEBUG, so the check will be executed regardless of // compilation mode. Therefore, it is safe to do things like: // CHECK_EQ(fp->Write(x), 4) #define CHECK(condition) do { \ if (!(condition)) { \ fprintf(stderr, "%s:%d: Check failed: %s\n", \ __FILE__, __LINE__, #condition); \ exit(1); \ } \ } while (0) #define CHECK_EQ(a, b) CHECK(a == b) static void Timing1(int num_iters) { // Same pattern lots of times RE pattern("ruby:\\d+"); StringPiece p("ruby:1234"); for (int j = num_iters; j > 0; j--) { CHECK(pattern.FullMatch(p)); } } static void Timing2(int num_iters) { // Same pattern lots of times RE pattern("ruby:(\\d+)"); int i; for (int j = num_iters; j > 0; j--) { CHECK(pattern.FullMatch("ruby:1234", &i)); CHECK_EQ(i, 1234); } } static void Timing3(int num_iters) { string text_string; for (int j = num_iters; j > 0; j--) { text_string += "this is another line\n"; } RE line_matcher(".*\n"); string line; StringPiece text(text_string); int counter = 0; while (line_matcher.Consume(&text)) { counter++; } printf("Matched %d lines\n", counter); } #if 0 // uncomment this if you have a way of defining VirtualProcessSize() static void LeakTest() { // Check for memory leaks unsigned long long initial_size = 0; for (int i = 0; i < 100000; i++) { if (i == 50000) { initial_size = VirtualProcessSize(); printf("Size after 50000: %llu\n", initial_size); } char buf[100]; snprintf(buf, sizeof(buf), "pat%09d", i); RE newre(buf); } uint64 final_size = VirtualProcessSize(); printf("Size after 100000: %llu\n", final_size); const double growth = double(final_size - initial_size) / final_size; printf("Growth: %0.2f%%", growth * 100); CHECK(growth < 0.02); // Allow < 2% growth } #endif static void RadixTests() { printf("Testing hex\n"); #define CHECK_HEX(type, value) \ do { \ type v; \ CHECK(RE("([0-9a-fA-F]+)[uUlL]*").FullMatch(#value, Hex(&v))); \ CHECK_EQ(v, 0x ## value); \ CHECK(RE("([0-9a-fA-FxX]+)[uUlL]*").FullMatch("0x" #value, CRadix(&v))); \ CHECK_EQ(v, 0x ## value); \ } while(0) CHECK_HEX(short, 2bad); CHECK_HEX(unsigned short, 2badU); CHECK_HEX(int, dead); CHECK_HEX(unsigned int, deadU); CHECK_HEX(long, 7eadbeefL); CHECK_HEX(unsigned long, deadbeefUL); #ifdef HAVE_LONG_LONG CHECK_HEX(long long, 12345678deadbeefLL); #endif #ifdef HAVE_UNSIGNED_LONG_LONG CHECK_HEX(unsigned long long, cafebabedeadbeefULL); #endif #undef CHECK_HEX printf("Testing octal\n"); #define CHECK_OCTAL(type, value) \ do { \ type v; \ CHECK(RE("([0-7]+)[uUlL]*").FullMatch(#value, Octal(&v))); \ CHECK_EQ(v, 0 ## value); \ CHECK(RE("([0-9a-fA-FxX]+)[uUlL]*").FullMatch("0" #value, CRadix(&v))); \ CHECK_EQ(v, 0 ## value); \ } while(0) CHECK_OCTAL(short, 77777); CHECK_OCTAL(unsigned short, 177777U); CHECK_OCTAL(int, 17777777777); CHECK_OCTAL(unsigned int, 37777777777U); CHECK_OCTAL(long, 17777777777L); CHECK_OCTAL(unsigned long, 37777777777UL); #ifdef HAVE_LONG_LONG CHECK_OCTAL(long long, 777777777777777777777LL); #endif #ifdef HAVE_UNSIGNED_LONG_LONG CHECK_OCTAL(unsigned long long, 1777777777777777777777ULL); #endif #undef CHECK_OCTAL printf("Testing decimal\n"); #define CHECK_DECIMAL(type, value) \ do { \ type v; \ CHECK(RE("(-?[0-9]+)[uUlL]*").FullMatch(#value, &v)); \ CHECK_EQ(v, value); \ CHECK(RE("(-?[0-9a-fA-FxX]+)[uUlL]*").FullMatch(#value, CRadix(&v))); \ CHECK_EQ(v, value); \ } while(0) CHECK_DECIMAL(short, -1); CHECK_DECIMAL(unsigned short, 9999); CHECK_DECIMAL(int, -1000); CHECK_DECIMAL(unsigned int, 12345U); CHECK_DECIMAL(long, -10000000L); CHECK_DECIMAL(unsigned long, 3083324652U); #ifdef HAVE_LONG_LONG CHECK_DECIMAL(long long, -100000000000000LL); #endif #ifdef HAVE_UNSIGNED_LONG_LONG CHECK_DECIMAL(unsigned long long, 1234567890987654321ULL); #endif #undef CHECK_DECIMAL } static void TestReplace() { printf("Testing Replace\n"); struct ReplaceTest { const char *regexp; const char *rewrite; const char *original; const char *single; const char *global; }; static const ReplaceTest tests[] = { { "(qu|[b-df-hj-np-tv-z]*)([a-z]+)", "\\2\\1ay", "the quick brown fox jumps over the lazy dogs.", "ethay quick brown fox jumps over the lazy dogs.", "ethay ickquay ownbray oxfay umpsjay overay ethay azylay ogsday." }, { "\\w+", "\\0-NOSPAM", "paul.haahr@google.com", "paul-NOSPAM.haahr@google.com", "paul-NOSPAM.haahr-NOSPAM@google-NOSPAM.com-NOSPAM" }, { "^", "(START)", "foo", "(START)foo", "(START)foo" }, { "^", "(START)", "", "(START)", "(START)" }, { "$", "(END)", "", "(END)", "(END)" }, { "b", "bb", "ababababab", "abbabababab", "abbabbabbabbabb" }, { "b", "bb", "bbbbbb", "bbbbbbb", "bbbbbbbbbbbb" }, { "b+", "bb", "bbbbbb", "bb", "bb" }, { "b*", "bb", "bbbbbb", "bb", "bb" }, { "b*", "bb", "aaaaa", "bbaaaaa", "bbabbabbabbabbabb" }, { "b*", "bb", "aa\naa\n", "bbaa\naa\n", "bbabbabb\nbbabbabb\nbb" }, { "b*", "bb", "aa\raa\r", "bbaa\raa\r", "bbabbabb\rbbabbabb\rbb" }, { "b*", "bb", "aa\r\naa\r\n", "bbaa\r\naa\r\n", "bbabbabb\r\nbbabbabb\r\nbb" }, #ifdef SUPPORT_UTF8 { "b*", "bb", "\xE3\x83\x9B\xE3\x83\xBC\xE3\x83\xA0\xE3\x81\xB8", // utf8 "bb\xE3\x83\x9B\xE3\x83\xBC\xE3\x83\xA0\xE3\x81\xB8", "bb\xE3\x83\x9B""bb""\xE3\x83\xBC""bb""\xE3\x83\xA0""bb""\xE3\x81\xB8""bb" }, { "b*", "bb", "\xE3\x83\x9B\r\n\xE3\x83\xBC\r\xE3\x83\xA0\n\xE3\x81\xB8\r\n", // utf8 "bb\xE3\x83\x9B\r\n\xE3\x83\xBC\r\xE3\x83\xA0\n\xE3\x81\xB8\r\n", ("bb\xE3\x83\x9B""bb\r\nbb""\xE3\x83\xBC""bb\rbb""\xE3\x83\xA0" "bb\nbb""\xE3\x81\xB8""bb\r\nbb") }, #endif { "", NULL, NULL, NULL, NULL } }; #ifdef SUPPORT_UTF8 const bool support_utf8 = true; #else const bool support_utf8 = false; #endif for (const ReplaceTest *t = tests; t->original != NULL; ++t) { RE re(t->regexp, RE_Options(PCRE_NEWLINE_CRLF).set_utf8(support_utf8)); assert(re.error().empty()); string one(t->original); CHECK(re.Replace(t->rewrite, &one)); CHECK_EQ(one, t->single); string all(t->original); CHECK(re.GlobalReplace(t->rewrite, &all) > 0); CHECK_EQ(all, t->global); } // One final test: test \r\n replacement when we're not in CRLF mode { RE re("b*", RE_Options(PCRE_NEWLINE_CR).set_utf8(support_utf8)); assert(re.error().empty()); string all("aa\r\naa\r\n"); CHECK(re.GlobalReplace("bb", &all) > 0); CHECK_EQ(all, string("bbabbabb\rbb\nbbabbabb\rbb\nbb")); } { RE re("b*", RE_Options(PCRE_NEWLINE_LF).set_utf8(support_utf8)); assert(re.error().empty()); string all("aa\r\naa\r\n"); CHECK(re.GlobalReplace("bb", &all) > 0); CHECK_EQ(all, string("bbabbabb\rbb\nbbabbabb\rbb\nbb")); } // TODO: test what happens when no PCRE_NEWLINE_* flag is set. // Alas, the answer depends on how pcre was compiled. } static void TestExtract() { printf("Testing Extract\n"); string s; CHECK(RE("(.*)@([^.]*)").Extract("\\2!\\1", "boris@kremvax.ru", &s)); CHECK_EQ(s, "kremvax!boris"); // check the RE interface as well CHECK(RE(".*").Extract("'\\0'", "foo", &s)); CHECK_EQ(s, "'foo'"); CHECK(!RE("bar").Extract("'\\0'", "baz", &s)); CHECK_EQ(s, "'foo'"); } static void TestConsume() { printf("Testing Consume\n"); string word; string s(" aaa b!@#$@#$cccc"); StringPiece input(s); RE r("\\s*(\\w+)"); // matches a word, possibly proceeded by whitespace CHECK(r.Consume(&input, &word)); CHECK_EQ(word, "aaa"); CHECK(r.Consume(&input, &word)); CHECK_EQ(word, "b"); CHECK(! r.Consume(&input, &word)); } static void TestFindAndConsume() { printf("Testing FindAndConsume\n"); string word; string s(" aaa b!@#$@#$cccc"); StringPiece input(s); RE r("(\\w+)"); // matches a word CHECK(r.FindAndConsume(&input, &word)); CHECK_EQ(word, "aaa"); CHECK(r.FindAndConsume(&input, &word)); CHECK_EQ(word, "b"); CHECK(r.FindAndConsume(&input, &word)); CHECK_EQ(word, "cccc"); CHECK(! r.FindAndConsume(&input, &word)); } static void TestMatchNumberPeculiarity() { printf("Testing match-number peculiaraity\n"); string word1; string word2; string word3; RE r("(foo)|(bar)|(baz)"); CHECK(r.PartialMatch("foo", &word1, &word2, &word3)); CHECK_EQ(word1, "foo"); CHECK_EQ(word2, ""); CHECK_EQ(word3, ""); CHECK(r.PartialMatch("bar", &word1, &word2, &word3)); CHECK_EQ(word1, ""); CHECK_EQ(word2, "bar"); CHECK_EQ(word3, ""); CHECK(r.PartialMatch("baz", &word1, &word2, &word3)); CHECK_EQ(word1, ""); CHECK_EQ(word2, ""); CHECK_EQ(word3, "baz"); CHECK(!r.PartialMatch("f", &word1, &word2, &word3)); string a; CHECK(RE("(foo)|hello").FullMatch("hello", &a)); CHECK_EQ(a, ""); } static void TestRecursion() { printf("Testing recursion\n"); // Get one string that passes (sometimes), one that never does. string text_good("abcdefghijk"); string text_bad("acdefghijkl"); // According to pcretest, matching text_good against (\w+)*b // requires match_limit of at least 8192, and match_recursion_limit // of at least 37. RE_Options options_ml; options_ml.set_match_limit(8192); RE re("(\\w+)*b", options_ml); CHECK(re.PartialMatch(text_good) == true); CHECK(re.PartialMatch(text_bad) == false); CHECK(re.FullMatch(text_good) == false); CHECK(re.FullMatch(text_bad) == false); options_ml.set_match_limit(1024); RE re2("(\\w+)*b", options_ml); CHECK(re2.PartialMatch(text_good) == false); // because of match_limit CHECK(re2.PartialMatch(text_bad) == false); CHECK(re2.FullMatch(text_good) == false); CHECK(re2.FullMatch(text_bad) == false); RE_Options options_mlr; options_mlr.set_match_limit_recursion(50); RE re3("(\\w+)*b", options_mlr); CHECK(re3.PartialMatch(text_good) == true); CHECK(re3.PartialMatch(text_bad) == false); CHECK(re3.FullMatch(text_good) == false); CHECK(re3.FullMatch(text_bad) == false); options_mlr.set_match_limit_recursion(10); RE re4("(\\w+)*b", options_mlr); CHECK(re4.PartialMatch(text_good) == false); CHECK(re4.PartialMatch(text_bad) == false); CHECK(re4.FullMatch(text_good) == false); CHECK(re4.FullMatch(text_bad) == false); } // A meta-quoted string, interpreted as a pattern, should always match // the original unquoted string. static void TestQuoteMeta(string unquoted, RE_Options options = RE_Options()) { string quoted = RE::QuoteMeta(unquoted); RE re(quoted, options); CHECK(re.FullMatch(unquoted)); } // A string containing meaningful regexp characters, which is then meta- // quoted, should not generally match a string the unquoted string does. static void NegativeTestQuoteMeta(string unquoted, string should_not_match, RE_Options options = RE_Options()) { string quoted = RE::QuoteMeta(unquoted); RE re(quoted, options); CHECK(!re.FullMatch(should_not_match)); } // Tests that quoted meta characters match their original strings, // and that a few things that shouldn't match indeed do not. static void TestQuotaMetaSimple() { TestQuoteMeta("foo"); TestQuoteMeta("foo.bar"); TestQuoteMeta("foo\\.bar"); TestQuoteMeta("[1-9]"); TestQuoteMeta("1.5-2.0?"); TestQuoteMeta("\\d"); TestQuoteMeta("Who doesn't like ice cream?"); TestQuoteMeta("((a|b)c?d*e+[f-h]i)"); TestQuoteMeta("((?!)xxx).*yyy"); TestQuoteMeta("(["); } static void TestQuoteMetaSimpleNegative() { NegativeTestQuoteMeta("foo", "bar"); NegativeTestQuoteMeta("...", "bar"); NegativeTestQuoteMeta("\\.", "."); NegativeTestQuoteMeta("\\.", ".."); NegativeTestQuoteMeta("(a)", "a"); NegativeTestQuoteMeta("(a|b)", "a"); NegativeTestQuoteMeta("(a|b)", "(a)"); NegativeTestQuoteMeta("(a|b)", "a|b"); NegativeTestQuoteMeta("[0-9]", "0"); NegativeTestQuoteMeta("[0-9]", "0-9"); NegativeTestQuoteMeta("[0-9]", "[9]"); NegativeTestQuoteMeta("((?!)xxx)", "xxx"); } static void TestQuoteMetaLatin1() { TestQuoteMeta("3\xb2 = 9"); } static void TestQuoteMetaUtf8() { #ifdef SUPPORT_UTF8 TestQuoteMeta("Pl\xc3\xa1\x63ido Domingo", pcrecpp::UTF8()); TestQuoteMeta("xyz", pcrecpp::UTF8()); // No fancy utf8 TestQuoteMeta("\xc2\xb0", pcrecpp::UTF8()); // 2-byte utf8 (degree symbol) TestQuoteMeta("27\xc2\xb0 degrees", pcrecpp::UTF8()); // As a middle character TestQuoteMeta("\xe2\x80\xb3", pcrecpp::UTF8()); // 3-byte utf8 (double prime) TestQuoteMeta("\xf0\x9d\x85\x9f", pcrecpp::UTF8()); // 4-byte utf8 (music note) TestQuoteMeta("27\xc2\xb0"); // Interpreted as Latin-1, but should still work NegativeTestQuoteMeta("27\xc2\xb0", // 2-byte utf (degree symbol) "27\\\xc2\\\xb0", pcrecpp::UTF8()); #endif } static void TestQuoteMetaAll() { printf("Testing QuoteMeta\n"); TestQuotaMetaSimple(); TestQuoteMetaSimpleNegative(); TestQuoteMetaLatin1(); TestQuoteMetaUtf8(); } // // Options tests contributed by // Giuseppe Maxia, CTO, Stardata s.r.l. // July 2005 // static void GetOneOptionResult( const char *option_name, const char *regex, const char *str, RE_Options options, bool full, string expected) { printf("Testing Option <%s>\n", option_name); if(VERBOSE_TEST) printf("/%s/ finds \"%s\" within \"%s\" \n", regex, expected.c_str(), str); string captured(""); if (full) RE(regex,options).FullMatch(str, &captured); else RE(regex,options).PartialMatch(str, &captured); CHECK_EQ(captured, expected); } static void TestOneOption( const char *option_name, const char *regex, const char *str, RE_Options options, bool full, bool assertive = true) { printf("Testing Option <%s>\n", option_name); if (VERBOSE_TEST) printf("'%s' %s /%s/ \n", str, (assertive? "matches" : "doesn't match"), regex); if (assertive) { if (full) CHECK(RE(regex,options).FullMatch(str)); else CHECK(RE(regex,options).PartialMatch(str)); } else { if (full) CHECK(!RE(regex,options).FullMatch(str)); else CHECK(!RE(regex,options).PartialMatch(str)); } } static void Test_CASELESS() { RE_Options options; RE_Options options2; options.set_caseless(true); TestOneOption("CASELESS (class)", "HELLO", "hello", options, false); TestOneOption("CASELESS (class2)", "HELLO", "hello", options2.set_caseless(true), false); TestOneOption("CASELESS (class)", "^[A-Z]+$", "Hello", options, false); TestOneOption("CASELESS (function)", "HELLO", "hello", pcrecpp::CASELESS(), false); TestOneOption("CASELESS (function)", "^[A-Z]+$", "Hello", pcrecpp::CASELESS(), false); options.set_caseless(false); TestOneOption("no CASELESS", "HELLO", "hello", options, false, false); } static void Test_MULTILINE() { RE_Options options; RE_Options options2; const char *str = "HELLO\n" "cruel\n" "world\n"; options.set_multiline(true); TestOneOption("MULTILINE (class)", "^cruel$", str, options, false); TestOneOption("MULTILINE (class2)", "^cruel$", str, options2.set_multiline(true), false); TestOneOption("MULTILINE (function)", "^cruel$", str, pcrecpp::MULTILINE(), false); options.set_multiline(false); TestOneOption("no MULTILINE", "^cruel$", str, options, false, false); } static void Test_DOTALL() { RE_Options options; RE_Options options2; const char *str = "HELLO\n" "cruel\n" "world"; options.set_dotall(true); TestOneOption("DOTALL (class)", "HELLO.*world", str, options, true); TestOneOption("DOTALL (class2)", "HELLO.*world", str, options2.set_dotall(true), true); TestOneOption("DOTALL (function)", "HELLO.*world", str, pcrecpp::DOTALL(), true); options.set_dotall(false); TestOneOption("no DOTALL", "HELLO.*world", str, options, true, false); } static void Test_DOLLAR_ENDONLY() { RE_Options options; RE_Options options2; const char *str = "HELLO world\n"; TestOneOption("no DOLLAR_ENDONLY", "world$", str, options, false); options.set_dollar_endonly(true); TestOneOption("DOLLAR_ENDONLY 1", "world$", str, options, false, false); TestOneOption("DOLLAR_ENDONLY 2", "world$", str, options2.set_dollar_endonly(true), false, false); } static void Test_EXTRA() { RE_Options options; const char *str = "HELLO"; options.set_extra(true); TestOneOption("EXTRA 1", "\\HELL\\O", str, options, true, false ); TestOneOption("EXTRA 2", "\\HELL\\O", str, RE_Options().set_extra(true), true, false ); options.set_extra(false); TestOneOption("no EXTRA", "\\HELL\\O", str, options, true ); } static void Test_EXTENDED() { RE_Options options; RE_Options options2; const char *str = "HELLO world"; options.set_extended(true); TestOneOption("EXTENDED (class)", "HELLO world", str, options, false, false); TestOneOption("EXTENDED (class2)", "HELLO world", str, options2.set_extended(true), false, false); TestOneOption("EXTENDED (class)", "^ HE L{2} O " "\\s+ " "\\w+ $ ", str, options, false); TestOneOption("EXTENDED (function)", "HELLO world", str, pcrecpp::EXTENDED(), false, false); TestOneOption("EXTENDED (function)", "^ HE L{2} O " "\\s+ " "\\w+ $ ", str, pcrecpp::EXTENDED(), false); options.set_extended(false); TestOneOption("no EXTENDED", "HELLO world", str, options, false); } static void Test_NO_AUTO_CAPTURE() { RE_Options options; const char *str = "HELLO world"; string captured; printf("Testing Option \n"); if (VERBOSE_TEST) printf("parentheses capture text\n"); RE re("(world|universe)$", options); CHECK(re.Extract("\\1", str , &captured)); CHECK_EQ(captured, "world"); options.set_no_auto_capture(true); printf("testing Option \n"); if (VERBOSE_TEST) printf("parentheses do not capture text\n"); re.Extract("\\1",str, &captured ); CHECK_EQ(captured, "world"); } static void Test_UNGREEDY() { RE_Options options; const char *str = "HELLO, 'this' is the 'world'"; options.set_ungreedy(true); GetOneOptionResult("UNGREEDY 1", "('.*')", str, options, false, "'this'" ); GetOneOptionResult("UNGREEDY 2", "('.*')", str, RE_Options().set_ungreedy(true), false, "'this'" ); GetOneOptionResult("UNGREEDY", "('.*?')", str, options, false, "'this' is the 'world'" ); options.set_ungreedy(false); GetOneOptionResult("no UNGREEDY", "('.*')", str, options, false, "'this' is the 'world'" ); GetOneOptionResult("no UNGREEDY", "('.*?')", str, options, false, "'this'" ); } static void Test_all_options() { const char *str = "HELLO\n" "cruel\n" "world"; RE_Options options; options.set_all_options(PCRE_CASELESS | PCRE_DOTALL); TestOneOption("all_options (CASELESS|DOTALL)", "^hello.*WORLD", str , options, false); options.set_all_options(0); TestOneOption("all_options (0)", "^hello.*WORLD", str , options, false, false); options.set_all_options(PCRE_MULTILINE | PCRE_EXTENDED); TestOneOption("all_options (MULTILINE|EXTENDED)", " ^ c r u e l $ ", str, options, false); TestOneOption("all_options (MULTILINE|EXTENDED) with constructor", " ^ c r u e l $ ", str, RE_Options(PCRE_MULTILINE | PCRE_EXTENDED), false); TestOneOption("all_options (MULTILINE|EXTENDED) with concatenation", " ^ c r u e l $ ", str, RE_Options() .set_multiline(true) .set_extended(true), false); options.set_all_options(0); TestOneOption("all_options (0)", "^ c r u e l $", str, options, false, false); } static void TestOptions() { printf("Testing Options\n"); Test_CASELESS(); Test_MULTILINE(); Test_DOTALL(); Test_DOLLAR_ENDONLY(); Test_EXTENDED(); Test_NO_AUTO_CAPTURE(); Test_UNGREEDY(); Test_EXTRA(); Test_all_options(); } static void TestConstructors() { printf("Testing constructors\n"); RE_Options options; options.set_dotall(true); const char *str = "HELLO\n" "cruel\n" "world"; RE orig("HELLO.*world", options); CHECK(orig.FullMatch(str)); RE copy1(orig); CHECK(copy1.FullMatch(str)); RE copy2("not a match"); CHECK(!copy2.FullMatch(str)); copy2 = copy1; CHECK(copy2.FullMatch(str)); copy2 = orig; CHECK(copy2.FullMatch(str)); // Make sure when we assign to ourselves, nothing bad happens orig = orig; copy1 = copy1; copy2 = copy2; CHECK(orig.FullMatch(str)); CHECK(copy1.FullMatch(str)); CHECK(copy2.FullMatch(str)); } int main(int argc, char** argv) { // Treat any flag as --help if (argc > 1 && argv[1][0] == '-') { printf("Usage: %s [timing1|timing2|timing3 num-iters]\n" " If 'timingX ###' is specified, run the given timing test\n" " with the given number of iterations, rather than running\n" " the default corectness test.\n", argv[0]); return 0; } if (argc > 1) { if ( argc == 2 || atoi(argv[2]) == 0) { printf("timing mode needs a num-iters argument\n"); return 1; } if (!strcmp(argv[1], "timing1")) Timing1(atoi(argv[2])); else if (!strcmp(argv[1], "timing2")) Timing2(atoi(argv[2])); else if (!strcmp(argv[1], "timing3")) Timing3(atoi(argv[2])); else printf("Unknown argument '%s'\n", argv[1]); return 0; } printf("Testing FullMatch\n"); int i; string s; /***** FullMatch with no args *****/ CHECK(RE("h.*o").FullMatch("hello")); CHECK(!RE("h.*o").FullMatch("othello")); // Must be anchored at front CHECK(!RE("h.*o").FullMatch("hello!")); // Must be anchored at end CHECK(RE("a*").FullMatch("aaaa")); // Fullmatch with normal op CHECK(RE("a*?").FullMatch("aaaa")); // Fullmatch with nongreedy op CHECK(RE("a*?\\z").FullMatch("aaaa")); // Two unusual ops /***** FullMatch with args *****/ // Zero-arg CHECK(RE("\\d+").FullMatch("1001")); // Single-arg CHECK(RE("(\\d+)").FullMatch("1001", &i)); CHECK_EQ(i, 1001); CHECK(RE("(-?\\d+)").FullMatch("-123", &i)); CHECK_EQ(i, -123); CHECK(!RE("()\\d+").FullMatch("10", &i)); CHECK(!RE("(\\d+)").FullMatch("1234567890123456789012345678901234567890", &i)); // Digits surrounding integer-arg CHECK(RE("1(\\d*)4").FullMatch("1234", &i)); CHECK_EQ(i, 23); CHECK(RE("(\\d)\\d+").FullMatch("1234", &i)); CHECK_EQ(i, 1); CHECK(RE("(-\\d)\\d+").FullMatch("-1234", &i)); CHECK_EQ(i, -1); CHECK(RE("(\\d)").PartialMatch("1234", &i)); CHECK_EQ(i, 1); CHECK(RE("(-\\d)").PartialMatch("-1234", &i)); CHECK_EQ(i, -1); // String-arg CHECK(RE("h(.*)o").FullMatch("hello", &s)); CHECK_EQ(s, string("ell")); // StringPiece-arg StringPiece sp; CHECK(RE("(\\w+):(\\d+)").FullMatch("ruby:1234", &sp, &i)); CHECK_EQ(sp.size(), 4); CHECK(memcmp(sp.data(), "ruby", 4) == 0); CHECK_EQ(i, 1234); // Multi-arg CHECK(RE("(\\w+):(\\d+)").FullMatch("ruby:1234", &s, &i)); CHECK_EQ(s, string("ruby")); CHECK_EQ(i, 1234); // Ignored arg CHECK(RE("(\\w+)(:)(\\d+)").FullMatch("ruby:1234", &s, (void*)NULL, &i)); CHECK_EQ(s, string("ruby")); CHECK_EQ(i, 1234); // Type tests { char c; CHECK(RE("(H)ello").FullMatch("Hello", &c)); CHECK_EQ(c, 'H'); } { unsigned char c; CHECK(RE("(H)ello").FullMatch("Hello", &c)); CHECK_EQ(c, static_cast('H')); } { short v; CHECK(RE("(-?\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); CHECK(RE("(-?\\d+)").FullMatch("-100", &v)); CHECK_EQ(v, -100); CHECK(RE("(-?\\d+)").FullMatch("32767", &v)); CHECK_EQ(v, 32767); CHECK(RE("(-?\\d+)").FullMatch("-32768", &v)); CHECK_EQ(v, -32768); CHECK(!RE("(-?\\d+)").FullMatch("-32769", &v)); CHECK(!RE("(-?\\d+)").FullMatch("32768", &v)); } { unsigned short v; CHECK(RE("(\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); CHECK(RE("(\\d+)").FullMatch("32767", &v)); CHECK_EQ(v, 32767); CHECK(RE("(\\d+)").FullMatch("65535", &v)); CHECK_EQ(v, 65535); CHECK(!RE("(\\d+)").FullMatch("65536", &v)); } { int v; static const int max_value = 0x7fffffff; static const int min_value = -max_value - 1; CHECK(RE("(-?\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); CHECK(RE("(-?\\d+)").FullMatch("-100", &v)); CHECK_EQ(v, -100); CHECK(RE("(-?\\d+)").FullMatch("2147483647", &v)); CHECK_EQ(v, max_value); CHECK(RE("(-?\\d+)").FullMatch("-2147483648", &v)); CHECK_EQ(v, min_value); CHECK(!RE("(-?\\d+)").FullMatch("-2147483649", &v)); CHECK(!RE("(-?\\d+)").FullMatch("2147483648", &v)); } { unsigned int v; static const unsigned int max_value = 0xfffffffful; CHECK(RE("(\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); CHECK(RE("(\\d+)").FullMatch("4294967295", &v)); CHECK_EQ(v, max_value); CHECK(!RE("(\\d+)").FullMatch("4294967296", &v)); } #ifdef HAVE_LONG_LONG # if defined(__MINGW__) || defined(__MINGW32__) # define LLD "%I64d" # define LLU "%I64u" # else # define LLD "%lld" # define LLU "%llu" # endif { long long v; static const long long max_value = 0x7fffffffffffffffLL; static const long long min_value = -max_value - 1; char buf[32]; CHECK(RE("(-?\\d+)").FullMatch("100", &v)); CHECK_EQ(v, 100); CHECK(RE("(-?\\d+)").FullMatch("-100",&v)); CHECK_EQ(v, -100); snprintf(buf, sizeof(buf), LLD, max_value); CHECK(RE("(-?\\d+)").FullMatch(buf,&v)); CHECK_EQ(v, max_value); snprintf(buf, sizeof(buf), LLD, min_value); CHECK(RE("(-?\\d+)").FullMatch(buf,&v)); CHECK_EQ(v, min_value); snprintf(buf, sizeof(buf), LLD, max_value); assert(buf[strlen(buf)-1] != '9'); buf[strlen(buf)-1]++; CHECK(!RE("(-?\\d+)").FullMatch(buf, &v)); snprintf(buf, sizeof(buf), LLD, min_value); assert(buf[strlen(buf)-1] != '9'); buf[strlen(buf)-1]++; CHECK(!RE("(-?\\d+)").FullMatch(buf, &v)); } #endif #if defined HAVE_UNSIGNED_LONG_LONG && defined HAVE_LONG_LONG { unsigned long long v; long long v2; static const unsigned long long max_value = 0xffffffffffffffffULL; char buf[32]; CHECK(RE("(-?\\d+)").FullMatch("100",&v)); CHECK_EQ(v, 100); CHECK(RE("(-?\\d+)").FullMatch("-100",&v2)); CHECK_EQ(v2, -100); snprintf(buf, sizeof(buf), LLU, max_value); CHECK(RE("(-?\\d+)").FullMatch(buf,&v)); CHECK_EQ(v, max_value); assert(buf[strlen(buf)-1] != '9'); buf[strlen(buf)-1]++; CHECK(!RE("(-?\\d+)").FullMatch(buf, &v)); } #endif { float v; CHECK(RE("(.*)").FullMatch("100", &v)); CHECK(RE("(.*)").FullMatch("-100.", &v)); CHECK(RE("(.*)").FullMatch("1e23", &v)); } { double v; CHECK(RE("(.*)").FullMatch("100", &v)); CHECK(RE("(.*)").FullMatch("-100.", &v)); CHECK(RE("(.*)").FullMatch("1e23", &v)); } // Check that matching is fully anchored CHECK(!RE("(\\d+)").FullMatch("x1001", &i)); CHECK(!RE("(\\d+)").FullMatch("1001x", &i)); CHECK(RE("x(\\d+)").FullMatch("x1001", &i)); CHECK_EQ(i, 1001); CHECK(RE("(\\d+)x").FullMatch("1001x", &i)); CHECK_EQ(i, 1001); // Braces CHECK(RE("[0-9a-f+.-]{5,}").FullMatch("0abcd")); CHECK(RE("[0-9a-f+.-]{5,}").FullMatch("0abcde")); CHECK(!RE("[0-9a-f+.-]{5,}").FullMatch("0abc")); // Complicated RE CHECK(RE("foo|bar|[A-Z]").FullMatch("foo")); CHECK(RE("foo|bar|[A-Z]").FullMatch("bar")); CHECK(RE("foo|bar|[A-Z]").FullMatch("X")); CHECK(!RE("foo|bar|[A-Z]").FullMatch("XY")); // Check full-match handling (needs '$' tacked on internally) CHECK(RE("fo|foo").FullMatch("fo")); CHECK(RE("fo|foo").FullMatch("foo")); CHECK(RE("fo|foo$").FullMatch("fo")); CHECK(RE("fo|foo$").FullMatch("foo")); CHECK(RE("foo$").FullMatch("foo")); CHECK(!RE("foo\\$").FullMatch("foo$bar")); CHECK(!RE("fo|bar").FullMatch("fox")); // Uncomment the following if we change the handling of '$' to // prevent it from matching a trailing newline if (false) { // Check that we don't get bitten by pcre's special handling of a // '\n' at the end of the string matching '$' CHECK(!RE("foo$").PartialMatch("foo\n")); } // Number of args int a[16]; CHECK(RE("").FullMatch("")); memset(a, 0, sizeof(0)); CHECK(RE("(\\d){1}").FullMatch("1", &a[0])); CHECK_EQ(a[0], 1); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)").FullMatch("12", &a[0], &a[1])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)(\\d)").FullMatch("123", &a[0], &a[1], &a[2])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); CHECK_EQ(a[2], 3); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)(\\d)(\\d)").FullMatch("1234", &a[0], &a[1], &a[2], &a[3])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); CHECK_EQ(a[2], 3); CHECK_EQ(a[3], 4); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch("12345", &a[0], &a[1], &a[2], &a[3], &a[4])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); CHECK_EQ(a[2], 3); CHECK_EQ(a[3], 4); CHECK_EQ(a[4], 5); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch("123456", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); CHECK_EQ(a[2], 3); CHECK_EQ(a[3], 4); CHECK_EQ(a[4], 5); CHECK_EQ(a[5], 6); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch("1234567", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); CHECK_EQ(a[2], 3); CHECK_EQ(a[3], 4); CHECK_EQ(a[4], 5); CHECK_EQ(a[5], 6); CHECK_EQ(a[6], 7); memset(a, 0, sizeof(0)); CHECK(RE("(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)" "(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)(\\d)").FullMatch( "1234567890123456", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &a[10], &a[11], &a[12], &a[13], &a[14], &a[15])); CHECK_EQ(a[0], 1); CHECK_EQ(a[1], 2); CHECK_EQ(a[2], 3); CHECK_EQ(a[3], 4); CHECK_EQ(a[4], 5); CHECK_EQ(a[5], 6); CHECK_EQ(a[6], 7); CHECK_EQ(a[7], 8); CHECK_EQ(a[8], 9); CHECK_EQ(a[9], 0); CHECK_EQ(a[10], 1); CHECK_EQ(a[11], 2); CHECK_EQ(a[12], 3); CHECK_EQ(a[13], 4); CHECK_EQ(a[14], 5); CHECK_EQ(a[15], 6); /***** PartialMatch *****/ printf("Testing PartialMatch\n"); CHECK(RE("h.*o").PartialMatch("hello")); CHECK(RE("h.*o").PartialMatch("othello")); CHECK(RE("h.*o").PartialMatch("hello!")); CHECK(RE("((((((((((((((((((((x))))))))))))))))))))").PartialMatch("x")); /***** other tests *****/ RadixTests(); TestReplace(); TestExtract(); TestConsume(); TestFindAndConsume(); TestQuoteMetaAll(); TestMatchNumberPeculiarity(); // Check the pattern() accessor { const string kPattern = "http://([^/]+)/.*"; const RE re(kPattern); CHECK_EQ(kPattern, re.pattern()); } // Check RE error field. { RE re("foo"); CHECK(re.error().empty()); // Must have no error } #ifdef SUPPORT_UTF8 // Check UTF-8 handling { printf("Testing UTF-8 handling\n"); // Three Japanese characters (nihongo) const char utf8_string[] = { 0xe6, 0x97, 0xa5, // 65e5 0xe6, 0x9c, 0xac, // 627c 0xe8, 0xaa, 0x9e, // 8a9e 0 }; const char utf8_pattern[] = { '.', 0xe6, 0x9c, 0xac, // 627c '.', 0 }; // Both should match in either mode, bytes or UTF-8 RE re_test1("........."); CHECK(re_test1.FullMatch(utf8_string)); RE re_test2("...", pcrecpp::UTF8()); CHECK(re_test2.FullMatch(utf8_string)); // Check that '.' matches one byte or UTF-8 character // according to the mode. string ss; RE re_test3("(.)"); CHECK(re_test3.PartialMatch(utf8_string, &ss)); CHECK_EQ(ss, string("\xe6")); RE re_test4("(.)", pcrecpp::UTF8()); CHECK(re_test4.PartialMatch(utf8_string, &ss)); CHECK_EQ(ss, string("\xe6\x97\xa5")); // Check that string matches itself in either mode RE re_test5(utf8_string); CHECK(re_test5.FullMatch(utf8_string)); RE re_test6(utf8_string, pcrecpp::UTF8()); CHECK(re_test6.FullMatch(utf8_string)); // Check that pattern matches string only in UTF8 mode RE re_test7(utf8_pattern); CHECK(!re_test7.FullMatch(utf8_string)); RE re_test8(utf8_pattern, pcrecpp::UTF8()); CHECK(re_test8.FullMatch(utf8_string)); } // Check that ungreedy, UTF8 regular expressions don't match when they // oughtn't -- see bug 82246. { // This code always worked. const char* pattern = "\\w+X"; const string target = "a aX"; RE match_sentence(pattern); RE match_sentence_re(pattern, pcrecpp::UTF8()); CHECK(!match_sentence.FullMatch(target)); CHECK(!match_sentence_re.FullMatch(target)); } { const char* pattern = "(?U)\\w+X"; const string target = "a aX"; RE match_sentence(pattern); RE match_sentence_re(pattern, pcrecpp::UTF8()); CHECK(!match_sentence.FullMatch(target)); CHECK(!match_sentence_re.FullMatch(target)); } #endif /* def SUPPORT_UTF8 */ printf("Testing error reporting\n"); { RE re("a\\1"); CHECK(!re.error().empty()); } { RE re("a[x"); CHECK(!re.error().empty()); } { RE re("a[z-a]"); CHECK(!re.error().empty()); } { RE re("a[[:foobar:]]"); CHECK(!re.error().empty()); } { RE re("a(b"); CHECK(!re.error().empty()); } { RE re("a\\"); CHECK(!re.error().empty()); } // Test that recursion is stopped TestRecursion(); // Test Options if (getenv("VERBOSE_TEST") != NULL) VERBOSE_TEST = true; TestOptions(); // Test the constructors TestConstructors(); // Done printf("OK\n"); return 0; } syncevolution-1.5/src/synthesis/src/pcre/pcrecpparg.h.in0000644000373300037200000001525612424517753025163 0ustar00nightlyallusers00000000000000// Copyright (c) 2005, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Author: Sanjay Ghemawat #ifndef _PCRECPPARG_H #define _PCRECPPARG_H #include // for NULL #include #include namespace pcrecpp { class StringPiece; // Hex/Octal/Binary? // Special class for parsing into objects that define a ParseFrom() method template class _RE_MatchObject { public: static inline bool Parse(const char* str, int n, void* dest) { T* object = reinterpret_cast(dest); return object->ParseFrom(str, n); } }; class PCRECPP_EXP_DEFN Arg { public: // Empty constructor so we can declare arrays of Arg Arg(); // Constructor specially designed for NULL arguments Arg(void*); typedef bool (*Parser)(const char* str, int n, void* dest); // Type-specific parsers #define PCRE_MAKE_PARSER(type,name) \ Arg(type* p) : arg_(p), parser_(name) { } \ Arg(type* p, Parser parser) : arg_(p), parser_(parser) { } PCRE_MAKE_PARSER(char, parse_char); PCRE_MAKE_PARSER(unsigned char, parse_uchar); PCRE_MAKE_PARSER(short, parse_short); PCRE_MAKE_PARSER(unsigned short, parse_ushort); PCRE_MAKE_PARSER(int, parse_int); PCRE_MAKE_PARSER(unsigned int, parse_uint); PCRE_MAKE_PARSER(long, parse_long); PCRE_MAKE_PARSER(unsigned long, parse_ulong); #if @pcre_have_long_long@ PCRE_MAKE_PARSER(long long, parse_longlong); #endif #if @pcre_have_ulong_long@ PCRE_MAKE_PARSER(unsigned long long, parse_ulonglong); #endif PCRE_MAKE_PARSER(float, parse_float); PCRE_MAKE_PARSER(double, parse_double); PCRE_MAKE_PARSER(std::string, parse_string); PCRE_MAKE_PARSER(StringPiece, parse_stringpiece); #undef PCRE_MAKE_PARSER // Generic constructor template Arg(T*, Parser parser); // Generic constructor template template Arg(T* p) : arg_(p), parser_(_RE_MatchObject::Parse) { } // Parse the data bool Parse(const char* str, int n) const; private: void* arg_; Parser parser_; static bool parse_null (const char* str, int n, void* dest); static bool parse_char (const char* str, int n, void* dest); static bool parse_uchar (const char* str, int n, void* dest); static bool parse_float (const char* str, int n, void* dest); static bool parse_double (const char* str, int n, void* dest); static bool parse_string (const char* str, int n, void* dest); static bool parse_stringpiece (const char* str, int n, void* dest); #define PCRE_DECLARE_INTEGER_PARSER(name) \ private: \ static bool parse_ ## name(const char* str, int n, void* dest); \ static bool parse_ ## name ## _radix( \ const char* str, int n, void* dest, int radix); \ public: \ static bool parse_ ## name ## _hex(const char* str, int n, void* dest); \ static bool parse_ ## name ## _octal(const char* str, int n, void* dest); \ static bool parse_ ## name ## _cradix(const char* str, int n, void* dest) PCRE_DECLARE_INTEGER_PARSER(short); PCRE_DECLARE_INTEGER_PARSER(ushort); PCRE_DECLARE_INTEGER_PARSER(int); PCRE_DECLARE_INTEGER_PARSER(uint); PCRE_DECLARE_INTEGER_PARSER(long); PCRE_DECLARE_INTEGER_PARSER(ulong); PCRE_DECLARE_INTEGER_PARSER(longlong); PCRE_DECLARE_INTEGER_PARSER(ulonglong); #undef PCRE_DECLARE_INTEGER_PARSER }; inline Arg::Arg() : arg_(NULL), parser_(parse_null) { } inline Arg::Arg(void* p) : arg_(p), parser_(parse_null) { } inline bool Arg::Parse(const char* str, int n) const { return (*parser_)(str, n, arg_); } // This part of the parser, appropriate only for ints, deals with bases #define MAKE_INTEGER_PARSER(type, name) \ inline Arg Hex(type* ptr) { \ return Arg(ptr, Arg::parse_ ## name ## _hex); } \ inline Arg Octal(type* ptr) { \ return Arg(ptr, Arg::parse_ ## name ## _octal); } \ inline Arg CRadix(type* ptr) { \ return Arg(ptr, Arg::parse_ ## name ## _cradix); } MAKE_INTEGER_PARSER(short, short) /* */ MAKE_INTEGER_PARSER(unsigned short, ushort) /* */ MAKE_INTEGER_PARSER(int, int) /* Don't use semicolons */ MAKE_INTEGER_PARSER(unsigned int, uint) /* after these statement */ MAKE_INTEGER_PARSER(long, long) /* because they can cause */ MAKE_INTEGER_PARSER(unsigned long, ulong) /* compiler warnings if */ #if @pcre_have_long_long@ /* the checking level is */ MAKE_INTEGER_PARSER(long long, longlong) /* turned up high enough. */ #endif /* */ #if @pcre_have_ulong_long@ /* */ MAKE_INTEGER_PARSER(unsigned long long, ulonglong) /* */ #endif #undef PCRE_IS_SET #undef PCRE_SET_OR_CLEAR #undef MAKE_INTEGER_PARSER } // namespace pcrecpp #endif /* _PCRECPPARG_H */ syncevolution-1.5/src/synthesis/src/pcre/pcredemo.c0000644000373300037200000002704412424517753024217 0ustar00nightlyallusers00000000000000/************************************************* * PCRE DEMONSTRATION PROGRAM * *************************************************/ /* This is a demonstration program to illustrate the most straightforward ways of calling the PCRE regular expression library from a C program. See the pcresample documentation for a short discussion. Compile thuswise: gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \ -R/usr/local/lib -lpcre Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and library files for PCRE are installed on your system. You don't need -I and -L if PCRE is installed in the standard system libraries. Only some operating systems (e.g. Solaris) use the -R option. */ #include #include #include #define OVECCOUNT 30 /* should be a multiple of 3 */ int main(int argc, char **argv) { pcre *re; const char *error; char *pattern; char *subject; unsigned char *name_table; int erroffset; int find_all; int namecount; int name_entry_size; int ovector[OVECCOUNT]; int subject_length; int rc, i; /************************************************************************** * First, sort out the command line. There is only one possible option at * * the moment, "-g" to request repeated matching to find all occurrences, * * like Perl's /g option. We set the variable find_all to a non-zero value * * if the -g option is present. Apart from that, there must be exactly two * * arguments. * **************************************************************************/ find_all = 0; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-g") == 0) find_all = 1; else break; } /* After the options, we require exactly two arguments, which are the pattern, and the subject string. */ if (argc - i != 2) { printf("Two arguments required: a regex and a subject string\n"); return 1; } pattern = argv[i]; subject = argv[i+1]; subject_length = (int)strlen(subject); /************************************************************************* * Now we are going to compile the regular expression pattern, and handle * * and errors that are detected. * *************************************************************************/ re = pcre_compile( pattern, /* the pattern */ 0, /* default options */ &error, /* for error message */ &erroffset, /* for error offset */ NULL); /* use default character tables */ /* Compilation failed: print the error message and exit */ if (re == NULL) { printf("PCRE compilation failed at offset %d: %s\n", erroffset, error); return 1; } /************************************************************************* * If the compilation succeeded, we call PCRE again, in order to do a * * pattern match against the subject string. This does just ONE match. If * * further matching is needed, it will be done below. * *************************************************************************/ rc = pcre_exec( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ subject, /* the subject string */ subject_length, /* the length of the subject */ 0, /* start at offset 0 in the subject */ 0, /* default options */ ovector, /* output vector for substring information */ OVECCOUNT); /* number of elements in the output vector */ /* Matching failed: handle error cases */ if (rc < 0) { switch(rc) { case PCRE_ERROR_NOMATCH: printf("No match\n"); break; /* Handle other special cases if you like */ default: printf("Matching error %d\n", rc); break; } pcre_free(re); /* Release memory used for the compiled pattern */ return 1; } /* Match succeded */ printf("\nMatch succeeded at offset %d\n", ovector[0]); /************************************************************************* * We have found the first match within the subject string. If the output * * vector wasn't big enough, set its size to the maximum. Then output any * * substrings that were captured. * *************************************************************************/ /* The output vector wasn't big enough */ if (rc == 0) { rc = OVECCOUNT/3; printf("ovector only has room for %d captured substrings\n", rc - 1); } /* Show substrings stored in the output vector by number. Obviously, in a real application you might want to do things other than print them. */ for (i = 0; i < rc; i++) { char *substring_start = subject + ovector[2*i]; int substring_length = ovector[2*i+1] - ovector[2*i]; printf("%2d: %.*s\n", i, substring_length, substring_start); } /************************************************************************** * That concludes the basic part of this demonstration program. We have * * compiled a pattern, and performed a single match. The code that follows * * first shows how to access named substrings, and then how to code for * * repeated matches on the same subject. * **************************************************************************/ /* See if there are any named substrings, and if so, show them by name. First we have to extract the count of named parentheses from the pattern. */ (void)pcre_fullinfo( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ PCRE_INFO_NAMECOUNT, /* number of named substrings */ &namecount); /* where to put the answer */ if (namecount <= 0) printf("No named substrings\n"); else { unsigned char *tabptr; printf("Named substrings\n"); /* Before we can access the substrings, we must extract the table for translating names to numbers, and the size of each entry in the table. */ (void)pcre_fullinfo( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ PCRE_INFO_NAMETABLE, /* address of the table */ &name_table); /* where to put the answer */ (void)pcre_fullinfo( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ PCRE_INFO_NAMEENTRYSIZE, /* size of each entry in the table */ &name_entry_size); /* where to put the answer */ /* Now we can scan the table and, for each entry, print the number, the name, and the substring itself. */ tabptr = name_table; for (i = 0; i < namecount; i++) { int n = (tabptr[0] << 8) | tabptr[1]; printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2, ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); tabptr += name_entry_size; } } /************************************************************************* * If the "-g" option was given on the command line, we want to continue * * to search for additional matches in the subject string, in a similar * * way to the /g option in Perl. This turns out to be trickier than you * * might think because of the possibility of matching an empty string. * * What happens is as follows: * * * * If the previous match was NOT for an empty string, we can just start * * the next match at the end of the previous one. * * * * If the previous match WAS for an empty string, we can't do that, as it * * would lead to an infinite loop. Instead, a special call of pcre_exec() * * is made with the PCRE_NOTEMPTY and PCRE_ANCHORED flags set. The first * * of these tells PCRE that an empty string is not a valid match; other * * possibilities must be tried. The second flag restricts PCRE to one * * match attempt at the initial string position. If this match succeeds, * * an alternative to the empty string match has been found, and we can * * proceed round the loop. * *************************************************************************/ if (!find_all) { pcre_free(re); /* Release the memory used for the compiled pattern */ return 0; /* Finish unless -g was given */ } /* Loop for second and subsequent matches */ for (;;) { int options = 0; /* Normally no options */ int start_offset = ovector[1]; /* Start at end of previous match */ /* If the previous match was for an empty string, we are finished if we are at the end of the subject. Otherwise, arrange to run another match at the same point to see if a non-empty match can be found. */ if (ovector[0] == ovector[1]) { if (ovector[0] == subject_length) break; options = PCRE_NOTEMPTY | PCRE_ANCHORED; } /* Run the next matching operation */ rc = pcre_exec( re, /* the compiled pattern */ NULL, /* no extra data - we didn't study the pattern */ subject, /* the subject string */ subject_length, /* the length of the subject */ start_offset, /* starting offset in the subject */ options, /* options */ ovector, /* output vector for substring information */ OVECCOUNT); /* number of elements in the output vector */ /* This time, a result of NOMATCH isn't an error. If the value in "options" is zero, it just means we have found all possible matches, so the loop ends. Otherwise, it means we have failed to find a non-empty-string match at a point where there was a previous empty-string match. In this case, we do what Perl does: advance the matching position by one, and continue. We do this by setting the "end of previous match" offset, because that is picked up at the top of the loop as the point at which to start again. */ if (rc == PCRE_ERROR_NOMATCH) { if (options == 0) break; ovector[1] = start_offset + 1; continue; /* Go round the loop again */ } /* Other matching errors are not recoverable. */ if (rc < 0) { printf("Matching error %d\n", rc); pcre_free(re); /* Release memory used for the compiled pattern */ return 1; } /* Match succeded */ printf("\nMatch succeeded again at offset %d\n", ovector[0]); /* The match succeeded, but the output vector wasn't big enough. */ if (rc == 0) { rc = OVECCOUNT/3; printf("ovector only has room for %d captured substrings\n", rc - 1); } /* As before, show substrings stored in the output vector by number, and then also any named substrings. */ for (i = 0; i < rc; i++) { char *substring_start = subject + ovector[2*i]; int substring_length = ovector[2*i+1] - ovector[2*i]; printf("%2d: %.*s\n", i, substring_length, substring_start); } if (namecount <= 0) printf("No named substrings\n"); else { unsigned char *tabptr = name_table; printf("Named substrings\n"); for (i = 0; i < namecount; i++) { int n = (tabptr[0] << 8) | tabptr[1]; printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2, ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]); tabptr += name_entry_size; } } } /* End of loop to find second and subsequent matches */ printf("\n"); pcre_free(re); /* Release memory used for the compiled pattern */ return 0; } /* End of pcredemo.c */ syncevolution-1.5/src/synthesis/src/pcre/pcregexp.pas0000644000373300037200000005506512424517753024603 0ustar00nightlyallusers00000000000000{ pcRegExp - Perl compatible regular expressions for Virtual Pascal (c) 2001 Peter S. Voronov aka Chem O'Dun Based on PCRE library interface unit for Virtual Pascal. (c) 2001 Alexander Tokarev The current PCRE version is: 3.7 This software must be distributed as Freeware. The PCRE library is written by: Philip Hazel Copyright (c) 1997-2004 University of Cambridge AngelsHolocaust 4-11-04 updated to use version v5.0 (INFO: this is regex-directed, NFA) AH: 9-11-04 - pcre_free: removed var, pcre already gives the ptr, now everything works as it should (no more crashes) -> removed CheckRegExp because pcre handles errors perfectly 10-11-04 - added pcError (errorhandling), pcInit 13-11-04 - removed the ErrorPos = 0 check -> always print erroroffset 17-10-05 - support for \1-\9 backreferences in TpcRegExp.GetReplStr 17-02-06 - added RunTimeOptions: caller can set options while searching 19-02-06 - added SearchOfs(): let PCRE use the complete string and offset into the string itself 20-12-06 - support for version 7.0 } {$H+} {$DEFINE PCRE_3_7} {$DEFINE PCRE_5_0} {$DEFINE PCRE_7_0} Unit pcregexp; Interface uses objects; Type PpcRegExp = ^TpcRegExp; // TpcRegExp = object TpcRegExp = object(TObject) MatchesCount: integer; RegExpC, RegExpExt : Pointer; Matches:Pointer; RegExp: shortstring; SourceLen: integer; PartialMatch : boolean; Error : boolean; ErrorMsg : Pchar; ErrorPos : integer; RunTimeOptions: Integer; // options which can be set by the caller constructor Init(const ARegExp : shortstring; AOptions : integer; ALocale : Pointer); function Search(AStr: Pchar; ALen : longint) : boolean; virtual; function SearchNext( AStr: Pchar; ALen : longint) : boolean; virtual; function SearchOfs ( AStr: Pchar; ALen, AOfs : longint) : boolean; virtual; function MatchSub(ANom: integer; var Pos, Len : longint) : boolean; virtual; function MatchFull(var Pos, Len : longint) : boolean; virtual; function GetSubStr(ANom: integer; AStr: Pchar) : string; virtual; function GetFullStr(AStr: Pchar) : string; virtual; function GetReplStr(AStr: Pchar; const ARepl: string) : string; virtual; function GetPreSubStr(AStr: Pchar) : string; virtual; function GetPostSubStr(AStr: Pchar) : string; virtual; function ErrorStr : string; virtual; destructor Done; virtual; end; function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean; function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string; function pcFastGrepMatch(WildCard, aStr: string): Boolean; function pcFastGrepSub(WildCard, aStr, aRepl: string): string; {$IFDEF PCRE_5_0} function pcGetVersion : pchar; {$ENDIF} function pcError (var pRegExp : Pointer) : Boolean; function pcInit (const Pattern: Shortstring; CaseSens: Boolean) : Pointer; Const { Options } PCRE_CASELESS = $0001; PCRE_MULTILINE = $0002; PCRE_DOTALL = $0004; PCRE_EXTENDED = $0008; PCRE_ANCHORED = $0010; PCRE_DOLLAR_ENDONLY = $0020; PCRE_EXTRA = $0040; PCRE_NOTBOL = $0080; PCRE_NOTEOL = $0100; PCRE_UNGREEDY = $0200; PCRE_NOTEMPTY = $0400; {$IFDEF PCRE_5_0} PCRE_UTF8 = $0800; PCRE_NO_AUTO_CAPTURE = $1000; PCRE_NO_UTF8_CHECK = $2000; PCRE_AUTO_CALLOUT = $4000; PCRE_PARTIAL = $8000; {$ENDIF} {$IFDEF PCRE_7_0} PCRE_DFA_SHORTEST = $00010000; PCRE_DFA_RESTART = $00020000; PCRE_FIRSTLINE = $00040000; PCRE_DUPNAMES = $00080000; PCRE_NEWLINE_CR = $00100000; PCRE_NEWLINE_LF = $00200000; PCRE_NEWLINE_CRLF = $00300000; PCRE_NEWLINE_ANY = $00400000; PCRE_NEWLINE_ANYCRLF = $00500000; {$ENDIF} PCRE_COMPILE_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_AUTO_CALLOUT + PCRE_CASELESS + PCRE_DOLLAR_ENDONLY + PCRE_DOTALL + PCRE_EXTENDED + PCRE_EXTRA + PCRE_MULTILINE + PCRE_NO_AUTO_CAPTURE + PCRE_UNGREEDY + PCRE_UTF8 + PCRE_NO_UTF8_CHECK {$IFDEF PCRE_7_0} + PCRE_DUPNAMES + PCRE_FIRSTLINE + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANY + PCRE_NEWLINE_CRLF {$ENDIF} ; PCRE_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL + PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL {$IFDEF PCRE_7_0} + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANY +PCRE_NEWLINE_ANYCRLF {$ENDIF} ; {$IFDEF PCRE_7_0} PCRE_DFA_EXEC_ALLOWED_OPTIONS = PCRE_ANCHORED + PCRE_NOTBOL + PCRE_NOTEOL + PCRE_NOTEMPTY + PCRE_NO_UTF8_CHECK + PCRE_PARTIAL + PCRE_DFA_SHORTEST + PCRE_DFA_RESTART + PCRE_NEWLINE_CR + PCRE_NEWLINE_LF + PCRE_NEWLINE_CRLF + PCRE_NEWLINE_ANY + PCRE_NEWLINE_ANYCRLF {$ENDIF} { Exec-time and get/set-time error codes } PCRE_ERROR_NOMATCH = -1; PCRE_ERROR_NULL = -2; PCRE_ERROR_BADOPTION = -3; PCRE_ERROR_BADMAGIC = -4; PCRE_ERROR_UNKNOWN_MODE = -5; PCRE_ERROR_NOMEMORY = -6; PCRE_ERROR_NOSUBSTRING = -7; {$IFDEF PCRE_5_0} PCRE_ERROR_MATCHLIMIT = -8; PCRE_ERROR_CALLOUT = -9; { Never used by PCRE itself } PCRE_ERROR_BADUTF8 = -10; PCRE_ERROR_BADUTF8_OFFSET = -11; PCRE_ERROR_PARTIAL = -12; PCRE_ERROR_BADPARTIAL = -13; PCRE_ERROR_INTERNAL = -14; PCRE_ERROR_BADCOUNT = -15; {$ENDIF} {$IFDEF PCRE_7_0} PCRE_ERROR_DFA_UITEM = -16; PCRE_ERROR_DFA_UCOND = -17; PCRE_ERROR_DFA_UMLIMIT = -18; PCRE_ERROR_DFA_WSSIZE = -19; PCRE_ERROR_DFA_RECURSE = -20; PCRE_ERROR_RECURSIONLIMIT = -21; PCRE_ERROR_NULLWSLIMIT = -22; PCRE_ERROR_BADNEWLINE = -23; {$ENDIF} { Request types for pcre_fullinfo() } PCRE_INFO_OPTIONS = 0; PCRE_INFO_SIZE = 1; PCRE_INFO_CAPTURECOUNT = 2; PCRE_INFO_BACKREFMAX = 3; PCRE_INFO_FIRSTBYTE = 4; PCRE_INFO_FIRSTCHAR = 4; { For backwards compatibility } PCRE_INFO_FIRSTTABLE = 5; {$IFDEF PCRE_5_0} PCRE_INFO_LASTLITERAL = 6; PCRE_INFO_NAMEENTRYSIZE = 7; PCRE_INFO_NAMECOUNT = 8; PCRE_INFO_NAMETABLE = 9; PCRE_INFO_STUDYSIZE = 10; PCRE_INFO_DEFAULT_TABLES = 11; {$ENDIF PCRE_5_0} { Request types for pcre_config() } {$IFDEF PCRE_5_0} PCRE_CONFIG_UTF8 = 0; PCRE_CONFIG_NEWLINE = 1; PCRE_CONFIG_LINK_SIZE = 2; PCRE_CONFIG_POSIX_MALLOC_THRESHOLD = 3; PCRE_CONFIG_MATCH_LIMIT = 4; PCRE_CONFIG_STACKRECURSE = 5; PCRE_CONFIG_UNICODE_PROPERTIES = 6; {$ENDIF PCRE_5_0} {$IFDEF PCRE_7_0} PCRE_CONFIG_MATCH_LIMIT_RECURSION = 7; {$ENDIF} { Bit flags for the pcre_extra structure } {$IFDEF PCRE_5_0} PCRE_EXTRA_STUDY_DATA = $0001; PCRE_EXTRA_MATCH_LIMIT = $0002; PCRE_EXTRA_CALLOUT_DATA = $0004; PCRE_EXTRA_TABLES = $0008; {$ENDIF PCRE_5_0} {$IFDEF PCRE_7_0} PCRE_EXTRA_MATCH_LIMIT_RECURSION = $0010; {$ENDIF} Const // DefaultOptions : integer = 0; DefaultLocaleTable : pointer = nil; {$IFDEF PCRE_5_0} { The structure for passing additional data to pcre_exec(). This is defined in such as way as to be extensible. Always add new fields at the end, in order to remain compatible. } type ppcre_extra = ^tpcre_extra; tpcre_extra = record flags : longint; { Bits for which fields are set } study_data : pointer; { Opaque data from pcre_study() } match_limit : longint; { Maximum number of calls to match() } callout_data : pointer; { Data passed back in callouts } tables : pointer; { Pointer to character tables } match_limit_recursion: longint; { Max recursive calls to match() } end; type ppcre_callout_block = ^pcre_callout_block; pcre_callout_block = record version, (* ------------------------ Version 0 ------------------------------- *) callout_number : integer; offset_vector : pointer; subject : pchar; subject_length, start_match, current_position, capture_top, capture_last : integer; callout_data : pointer; (* ------------------- Added for Version 1 -------------------------- *) pattern_position, next_item_length : integer; end; {$ENDIF PCRE_5_0} {$OrgName+} {$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL} { local replacement of external pcre memory management functions } function pcre_malloc( size : integer ) : pointer; procedure pcre_free( {var} p : pointer ); {$IFDEF PCRE_5_0} const pcre_stack_malloc: function ( size : integer ): pointer = pcre_malloc; pcre_stack_free: procedure ( {var} p : pointer ) = pcre_free; function pcre_callout(var p : ppcre_callout_block) : integer; {$ENDIF PCRE_5_0} {$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL} Implementation Uses strings, collect, messages, dnapp, commands, advance0, stringsx {$IFDEF VIRTUALPASCAL} ,vpsyslow {$ENDIF VIRTUALPASCAL}; Const MAGIC_NUMBER = $50435245; { 'PCRE' } MAX_MATCHES = 90; { changed in 3.5 version; should be divisible by 3, was 64} Type PMatchArray = ^TMatchArray; TMatchArray = array[0..( MAX_MATCHES * 3 )] of integer; PRegExpCollection = ^TRegExpCollection; TRegExpCollection = object(TSortedCollection) MaxRegExp : integer; SearchRegExp : shortstring; CompareModeInsert : boolean; constructor Init(AMaxRegExp:integer); procedure FreeItem(P: Pointer); virtual; function Compare(P1, P2: Pointer): Integer; virtual; function Find(ARegExp:shortstring;var P: PpcRegExp):boolean; virtual; function CheckNew(ARegExp:shortstring):PpcRegExp;virtual; end; Var PRegExpCache : PRegExpCollection; {$IFDEF VIRTUALPASCAL} {&Cdecl+} {$ENDIF VIRTUALPASCAL} { imported original pcre functions } function pcre_compile( const pattern : PChar; options : integer; var errorptr : PChar; var erroroffset : integer; const tables : PChar ) : pointer {pcre}; external; {$IFDEF PCRE_7_0} function pcre_compile2( const pattern : PChar; options : integer; var errorcodeptr : Integer; var errorptr : PChar; var erroroffset : integer; const tables : PChar ) : pointer {pcre}; external; {$ENDIF} {$IFDEF PCRE_5_0} function pcre_config( what : integer; where : pointer) : integer; external; function pcre_copy_named_substring( const code : pointer {pcre}; const subject : pchar; var ovector : integer; stringcount : integer; const stringname : pchar; var buffer : pchar; size : integer) : integer; external; function pcre_copy_substring( const subject : pchar; var ovector : integer; stringcount, stringnumber : integer; var buffer : pchar; size : integer ) : integer; external; function pcre_exec( const argument_re : pointer {pcre}; const extra_data : pointer {pcre_extra}; {$ELSE} function pcre_exec( const external_re : pointer; const external_extra : pointer; {$ENDIF} const subject : PChar; length, start_offset, options : integer; offsets : pointer; offsetcount : integer ) : integer; external; {$IFDEF PCRE_7_0} function pcre_dfa_exec( const argument_re : pointer {pcre}; const extra_data : pointer {pcre_extra}; const subject : pchar; length, start_offset, options : integer; offsets : pointer; offsetcount : integer; workspace : pointer; wscount : integer ) : integer; external; {$ENDIF} {$IFDEF PCRE_5_0} procedure pcre_free_substring( const p : pchar ); external; procedure pcre_free_substring_list( var p : pchar ); external; function pcre_fullinfo( const argument_re : pointer {pcre}; const extra_data : pointer {pcre_extra}; what : integer; where : pointer ) : integer; external; function pcre_get_named_substring( const code : pointer {pcre}; const subject : pchar; var ovector : integer; stringcount : integer; const stringname : pchar; var stringptr : pchar ) : integer; external; function pcre_get_stringnumber( const code : pointer {pcre}; const stringname : pchar ) : integer; external; function pcre_get_stringtable_entries( const code : pointer {pcre}; const stringname : pchar; var firstptr, lastptr : pchar ) : integer; external; function pcre_get_substring( const subject : pchar; var ovector : integer; stringcount, stringnumber : integer; var stringptr : pchar ) : integer; external; function pcre_get_substring_list( const subject : pchar; var ovector : integer; stringcount : integer; listptr : pointer {const char ***listptr}) : integer; external; function pcre_info( const argument_re : pointer {pcre}; var optptr : integer; var first_byte : integer ) : integer; external; function pcre_maketables : pchar; external; {$ENDIF} {$IFDEF PCRE_7_0} function pcre_refcount( const argument_re : pointer {pcre}; adjust : integer ) : pchar; external; {$ENDIF} function pcre_study( const external_re : pointer {pcre}; options : integer; var errorptr : PChar ) : pointer {pcre_extra}; external; {$IFDEF PCRE_5_0} function pcre_version : pchar; external; {$ENDIF} function pcre_malloc( size : integer ) : pointer; begin GetMem( result, size ); end; procedure pcre_free( {var} p : pointer ); begin if (p <> nil) then FreeMem( p, 0 ); {@p := nil;} end; {$IFDEF PCRE_5_0} (* Called from PCRE as a result of the (?C) item. We print out where we are in the match. Yield zero unless more callouts than the fail count, or the callout data is not zero. *) function pcre_callout; begin end; {$ENDIF} {$IFDEF VIRTUALPASCAL} {&Cdecl-} {$ENDIF VIRTUALPASCAL} // Always include the newest version of the library {$IFDEF PCRE_3_7} {$IFNDEF PCRE_5_0} {$IFNDEF PCRE_7_0} {$L pcre37.lib} {$ENDIF PCRE_7_0} {$ENDIF PCRE_5_0} {$ENDIF PCRE_3_7} {$IFDEF PCRE_5_0} {$IFNDEF PCRE_7_0} {$L pcre50.lib} {$ENDIF PCRE_7_0} {$ENDIF PCRE_5_0} {$IFDEF PCRE_7_0} {$L pcre70.lib} {$ENDIF PCRE_7_0} {TpcRegExp} constructor TpcRegExp.Init(const ARegExp:shortstring; AOptions:integer; ALocale : Pointer); var pRegExp : PChar; begin RegExp:=ARegExp; RegExpC:=nil; RegExpExt:=nil; Matches:=nil; MatchesCount:=0; Error:=true; ErrorMsg:=nil; ErrorPos:=0; RunTimeOptions := 0; if length(RegExp) < 255 then begin RegExp[length(RegExp)+1]:=#0; pRegExp:=@RegExp[1]; end else begin GetMem(pRegExp,length(RegExp)+1); pRegExp:=strpcopy(pRegExp,RegExp); end; RegExpC := pcre_compile( pRegExp, AOptions and PCRE_COMPILE_ALLOWED_OPTIONS, ErrorMsg, ErrorPos, ALocale); if length(RegExp) = 255 then StrDispose(pRegExp); if RegExpC = nil then exit; ErrorMsg:=nil; RegExpExt := pcre_study( RegExpC, 0, ErrorMsg ); if (RegExpExt = nil) and (ErrorMsg <> nil) then begin pcre_free(RegExpC); exit; end; GetMem(Matches,SizeOf(TMatchArray)); Error:=false; end; destructor TpcRegExp.Done; begin if RegExpC <> nil then pcre_free(RegExpC); if RegExpExt <> nil then pcre_free(RegExpExt); if Matches <> nil then FreeMem(Matches,SizeOf(TMatchArray)); end; function TpcRegExp.SearchNext( AStr: Pchar; ALen : longint ) : boolean; var Options: Integer; begin // must handle PCRE_ERROR_PARTIAL here Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and PCRE_EXEC_ALLOWED_OPTIONS; if MatchesCount > 0 then MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, PMatchArray(Matches)^[1], Options, Matches, MAX_MATCHES ) else MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, 0, Options, Matches, MAX_MATCHES ); { if MatchesCount = 0 then MatchesCount := MatchesCount div 3;} PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL; SearchNext := MatchesCount > 0; end; function TpcRegExp.Search( AStr: Pchar; ALen : longint):boolean; begin MatchesCount:=0; Search:=SearchNext(AStr,ALen); SourceLen:=ALen; end; function TpcRegExp.SearchOfs( AStr: Pchar; ALen, AOfs: longint ) : boolean; var Options: Integer; begin MatchesCount:=0; Options := (RunTimeOptions or startup.MiscMultiData.cfgRegEx.DefaultOptions) and PCRE_EXEC_ALLOWED_OPTIONS; MatchesCount:=pcre_exec( RegExpC, RegExpExt, AStr, ALen, AOfs, Options, Matches, MAX_MATCHES ); PartialMatch := MatchesCount = PCRE_ERROR_PARTIAL; SearchOfs := MatchesCount > 0; SourceLen := ALen-AOfs; end; function TpcRegExp.MatchSub(ANom:integer; var Pos,Len:longint):boolean; begin if (MatchesCount > 0) and (ANom <= (MatchesCount-1)) then begin ANom:=ANom*2; Pos:=PMatchArray(Matches)^[ANom]; Len:=PMatchArray(Matches)^[ANom+1]-Pos; MatchSub:=true; end else MatchSub:=false; end; function TpcRegExp.MatchFull(var Pos,Len:longint):boolean; begin MatchFull:=MatchSub(0,Pos,Len); end; function TpcRegExp.GetSubStr(ANom: integer; AStr: Pchar):string; var s: ansistring; pos,len: longint; begin s:=''; if MatchSub(ANom, pos, len) then begin setlength(s, len); Move(AStr[pos], s[1], len); end; GetSubStr:=s; end; function TpcRegExp.GetPreSubStr(AStr: Pchar):string; var s: ansistring; l: longint; begin s:=''; if (MatchesCount > 0) then begin l:=PMatchArray(Matches)^[0]-1; if l > 0 then begin setlength(s,l); Move(AStr[1],s[1],l); end; end; GetPreSubStr:=s; end; function TpcRegExp.GetPostSubStr(AStr: Pchar):string; var s: ansistring; l: longint; ANom: integer; begin s:=''; if (MatchesCount > 0) then begin ANom:=(MatchesCount-1){*2} shl 1; l:=SourceLen-PMatchArray(Matches)^[ANom+1]+1; if l > 0 then begin setlength(s,l); Move(AStr[PMatchArray(Matches)^[ANom+1]],s[1],l); end; end; GetPostSubStr:=s; end; function TpcRegExp.GetFullStr(AStr: Pchar):string; var s: ansistring; l: longint; begin GetFullStr:=GetSubStr(0,AStr); end; function TpcRegExp.GetReplStr(AStr: Pchar; const ARepl: string):string; var s: ansistring; l,i,lasti: longint; begin l:=length(ARepl); i:=1; lasti:=1; s:=''; while i <= l do begin case ARepl[i] of '\' : begin if i < l then begin s:=s+copy(ARepl,lasti,i-lasti){+ARepl[i+1]}; {AH 17-10-05 support for POSIX \1-\9 backreferences} case ARepl[i+1] of '0' : s:=s+GetFullStr(AStr); '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr); else s:=s+ARepl[i+1]; // copy the escaped character end; end; inc(i); lasti:=i+1; end; '$' : begin if i < l then begin s:=s+copy(ARepl,lasti,i-lasti); case ARepl[i+1] of '&' : s:=s+GetFullStr(AStr); '1'..'9' : s:=s+GetSubStr(ord(ARepl[i+1])-ord('0'),AStr); '`' : s:=s+GetPreSubStr(AStr); #39 : s:=s+GetPostSubStr(AStr); end; end; inc(i); lasti:=i+1; end; end; inc(i); end; if lasti <= {AH 25-10-2004 added =, else l==1 won't work} l then s:=s+copy(ARepl,lasti,l-lasti+1); GetReplStr:=s; end; function TpcRegExp.ErrorStr:string; begin ErrorStr:=StrPas(ErrorMsg); end; {TRegExpCollection} constructor TRegExpCollection.Init(AMaxRegExp: integer); begin Inherited Init(1,1); MaxRegExp:=AMaxRegExp; CompareModeInsert:=true; end; procedure TRegExpCollection.FreeItem(P: Pointer); begin if P <> nil then begin Dispose(PpcRegExp(P),Done); end; end; function TRegExpCollection.Compare(P1, P2: Pointer): Integer; //var // l,l1,l2,i : byte; //// wPos: pchar; begin if CompareModeInsert then begin // l1:=length(PpcRegExp(P1)^.RegExp); // l2:=length(PpcRegExp(P2)^.RegExp); // if l1 > l2 then l:=l2 else // l:=l1; // for i:=1 to l do // if PpcRegExp(P1).RegExp[i] <> PpcRegExp(P2).RegExp[i] then break; // if i <=l then // Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(PpcRegExp(P2).RegExp[i]) else // Compare:=l1-l2; Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, PpcRegExp(P2).RegExp, False); end else begin // l1:=length(PpcRegExp(P1)^.RegExp); // l2:=length(SearchRegExp); // if l1 > l2 then l:=l2 else // l:=l1; // for i:=1 to l do // if PpcRegExp(P1).RegExp[i] <> SearchRegExp[i] then // begin // Compare:=ord(PpcRegExp(P1).RegExp[i])-ord(SearchRegExp[i]); // break; // end; // if i > l then Compare:=l1-l2; Compare := stringsx.PasStrCmp(PpcRegExp(P1).RegExp, SearchRegExp, False); end; end; function TRegExpCollection.Find(ARegExp:shortstring;var P: PpcRegExp):boolean; var I : integer; begin CompareModeInsert:=false; SearchRegExp:=ARegExp; if Search(nil,I) then begin P:=PpcRegExp(At(I)); Find:=true; end else begin P:=nil; Find:=false; end; CompareModeInsert:=true; end; function TRegExpCollection.CheckNew(ARegExp:shortstring):PpcRegExp; var P : PpcRegExp; begin if not Find(ARegExp,P) then begin if Count = MaxRegExp then AtFree(0); P:=New(ppcRegExp,Init(ARegExp,PCRE_CASELESS,nil)); Insert(P); end; CheckNew:=P; end; function pcGrepMatch(WildCard, aStr: string; AOptions:integer; ALocale : Pointer): Boolean; var PpcRE:PpcRegExp; begin PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale)); pcGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr)); Dispose(PpcRE,Done); end; function pcGrepSub(WildCard, aStr, aRepl: string; AOptions:integer; ALocale : Pointer): string; var PpcRE:PpcRegExp; begin PpcRE:=New(ppcRegExp,Init(WildCard,AOptions,Alocale)); if PpcRE^.Search(pchar(AStr),Length(AStr)) then pcGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl) else pcGrepSub:=''; Dispose(PpcRE,Done); end; function pcFastGrepMatch(WildCard, aStr: string): Boolean; var PpcRE:PpcRegExp; begin PpcRE:=PRegExpCache^.CheckNew(WildCard); pcFastGrepMatch:=PpcRE^.Search(pchar(AStr),Length(AStr)); end; function pcFastGrepSub(WildCard, aStr, aRepl: string): string; var PpcRE:PpcRegExp; begin PpcRE:=PRegExpCache^.CheckNew(WildCard); if PpcRE^.Search(pchar(AStr),Length(AStr)) then pcFastGrepSub:=PpcRE^.GetReplStr(pchar(AStr),ARepl) else pcFastGrepSub:=''; end; {$IFDEF PCRE_5_0} function pcGetVersion : pchar; assembler; {$FRAME-}{$USES none} asm call pcre_version end; {$ENDIF PCRE_5_0} function pcError; var P: ppcRegExp absolute pRegExp; begin Result := (P = nil) or P^.Error; If Result and (P <> nil) then begin { if P^.ErrorPos = 0 then MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"', nil,mfConfirmation+mfOkButton) else} MessageBox(GetString(erRegExpCompile)+'"'+P^.ErrorStr+'"'+GetString(erRegExpCompPos), @P^.ErrorPos,mfConfirmation+mfOkButton); Dispose(P, Done); P:=nil; end; end; function pcInit; var Options : Integer; begin If CaseSens then Options := 0 else Options := PCRE_CASELESS; Result := New( PpcRegExp, Init( Pattern, {DefaultOptions} startup.MiscMultiData.cfgRegEx.DefaultOptions or Options, DefaultLocaleTable) ); end; Initialization PRegExpCache:=New(PRegExpCollection,Init(64)); Finalization Dispose(PRegExpCache,Done); End. syncevolution-1.5/src/synthesis/src/pcre/pcregrep.c0000644000373300037200000016411212424517753024226 0ustar00nightlyallusers00000000000000/************************************************* * pcregrep program * *************************************************/ /* This is a grep program that uses the PCRE regular expression library to do its pattern matching. On a Unix or Win32 system it can recurse into directories. Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #define FALSE 0 #define TRUE 1 typedef int BOOL; #define MAX_PATTERN_COUNT 100 #if BUFSIZ > 8192 #define MBUFTHIRD BUFSIZ #else #define MBUFTHIRD 8192 #endif /* Values for the "filenames" variable, which specifies options for file name output. The order is important; it is assumed that a file name is wanted for all values greater than FN_DEFAULT. */ enum { FN_NONE, FN_DEFAULT, FN_ONLY, FN_NOMATCH_ONLY, FN_FORCE }; /* Actions for the -d and -D options */ enum { dee_READ, dee_SKIP, dee_RECURSE }; enum { DEE_READ, DEE_SKIP }; /* Actions for special processing options (flag bits) */ #define PO_WORD_MATCH 0x0001 #define PO_LINE_MATCH 0x0002 #define PO_FIXED_STRINGS 0x0004 /* Line ending types */ enum { EL_LF, EL_CR, EL_CRLF, EL_ANY, EL_ANYCRLF }; /************************************************* * Global variables * *************************************************/ /* Jeffrey Friedl has some debugging requirements that are not part of the regular code. */ #ifdef JFRIEDL_DEBUG static int S_arg = -1; static unsigned int jfriedl_XR = 0; /* repeat regex attempt this many times */ static unsigned int jfriedl_XT = 0; /* replicate text this many times */ static const char *jfriedl_prefix = ""; static const char *jfriedl_postfix = ""; #endif static int endlinetype; static char *colour_string = (char *)"1;31"; static char *colour_option = NULL; static char *dee_option = NULL; static char *DEE_option = NULL; static char *newline = NULL; static char *pattern_filename = NULL; static char *stdin_name = (char *)"(standard input)"; static char *locale = NULL; static const unsigned char *pcretables = NULL; static int pattern_count = 0; static pcre **pattern_list = NULL; static pcre_extra **hints_list = NULL; static char *include_pattern = NULL; static char *exclude_pattern = NULL; static pcre *include_compiled = NULL; static pcre *exclude_compiled = NULL; static int after_context = 0; static int before_context = 0; static int both_context = 0; static int dee_action = dee_READ; static int DEE_action = DEE_READ; static int error_count = 0; static int filenames = FN_DEFAULT; static int process_options = 0; static BOOL count_only = FALSE; static BOOL do_colour = FALSE; static BOOL hyphenpending = FALSE; static BOOL invert = FALSE; static BOOL multiline = FALSE; static BOOL number = FALSE; static BOOL only_matching = FALSE; static BOOL quiet = FALSE; static BOOL silent = FALSE; static BOOL utf8 = FALSE; /* Structure for options and list of them */ enum { OP_NODATA, OP_STRING, OP_OP_STRING, OP_NUMBER, OP_OP_NUMBER, OP_PATLIST }; typedef struct option_item { int type; int one_char; void *dataptr; const char *long_name; const char *help_text; } option_item; /* Options without a single-letter equivalent get a negative value. This can be used to identify them. */ #define N_COLOUR (-1) #define N_EXCLUDE (-2) #define N_HELP (-3) #define N_INCLUDE (-4) #define N_LABEL (-5) #define N_LOCALE (-6) #define N_NULL (-7) static option_item optionlist[] = { { OP_NODATA, N_NULL, NULL, "", " terminate options" }, { OP_NODATA, N_HELP, NULL, "help", "display this help and exit" }, { OP_NUMBER, 'A', &after_context, "after-context=number", "set number of following context lines" }, { OP_NUMBER, 'B', &before_context, "before-context=number", "set number of prior context lines" }, { OP_OP_STRING, N_COLOUR, &colour_option, "color=option", "matched text color option" }, { OP_NUMBER, 'C', &both_context, "context=number", "set number of context lines, before & after" }, { OP_NODATA, 'c', NULL, "count", "print only a count of matching lines per FILE" }, { OP_OP_STRING, N_COLOUR, &colour_option, "colour=option", "matched text colour option" }, { OP_STRING, 'D', &DEE_option, "devices=action","how to handle devices, FIFOs, and sockets" }, { OP_STRING, 'd', &dee_option, "directories=action", "how to handle directories" }, { OP_PATLIST, 'e', NULL, "regex(p)", "specify pattern (may be used more than once)" }, { OP_NODATA, 'F', NULL, "fixed_strings", "patterns are sets of newline-separated strings" }, { OP_STRING, 'f', &pattern_filename, "file=path", "read patterns from file" }, { OP_NODATA, 'H', NULL, "with-filename", "force the prefixing filename on output" }, { OP_NODATA, 'h', NULL, "no-filename", "suppress the prefixing filename on output" }, { OP_NODATA, 'i', NULL, "ignore-case", "ignore case distinctions" }, { OP_NODATA, 'l', NULL, "files-with-matches", "print only FILE names containing matches" }, { OP_NODATA, 'L', NULL, "files-without-match","print only FILE names not containing matches" }, { OP_STRING, N_LABEL, &stdin_name, "label=name", "set name for standard input" }, { OP_STRING, N_LOCALE, &locale, "locale=locale", "use the named locale" }, { OP_NODATA, 'M', NULL, "multiline", "run in multiline mode" }, { OP_STRING, 'N', &newline, "newline=type", "specify newline type (CR, LF, CRLF, ANYCRLF or ANY)" }, { OP_NODATA, 'n', NULL, "line-number", "print line number with output lines" }, { OP_NODATA, 'o', NULL, "only-matching", "show only the part of the line that matched" }, { OP_NODATA, 'q', NULL, "quiet", "suppress output, just set return code" }, { OP_NODATA, 'r', NULL, "recursive", "recursively scan sub-directories" }, { OP_STRING, N_EXCLUDE,&exclude_pattern, "exclude=pattern","exclude matching files when recursing" }, { OP_STRING, N_INCLUDE,&include_pattern, "include=pattern","include matching files when recursing" }, #ifdef JFRIEDL_DEBUG { OP_OP_NUMBER, 'S', &S_arg, "jeffS", "replace matched (sub)string with X" }, #endif { OP_NODATA, 's', NULL, "no-messages", "suppress error messages" }, { OP_NODATA, 'u', NULL, "utf-8", "use UTF-8 mode" }, { OP_NODATA, 'V', NULL, "version", "print version information and exit" }, { OP_NODATA, 'v', NULL, "invert-match", "select non-matching lines" }, { OP_NODATA, 'w', NULL, "word-regex(p)", "force patterns to match only as words" }, { OP_NODATA, 'x', NULL, "line-regex(p)", "force patterns to match only whole lines" }, { OP_NODATA, 0, NULL, NULL, NULL } }; /* Tables for prefixing and suffixing patterns, according to the -w, -x, and -F options. These set the 1, 2, and 4 bits in process_options, respectively. Note that the combination of -w and -x has the same effect as -x on its own, so we can treat them as the same. */ static const char *prefix[] = { "", "\\b", "^(?:", "^(?:", "\\Q", "\\b\\Q", "^(?:\\Q", "^(?:\\Q" }; static const char *suffix[] = { "", "\\b", ")$", ")$", "\\E", "\\E\\b", "\\E)$", "\\E)$" }; /* UTF-8 tables - used only when the newline setting is "any". */ const int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; const char utf8_table4[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; /************************************************* * OS-specific functions * *************************************************/ /* These functions are defined so that they can be made system specific, although at present the only ones are for Unix, Win32, and for "no support". */ /************* Directory scanning in Unix ***********/ #if defined HAVE_SYS_STAT_H && defined HAVE_DIRENT_H && defined HAVE_SYS_TYPES_H #include #include #include typedef DIR directory_type; static int isdirectory(char *filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return 0; /* In the expectation that opening as a file will fail */ return ((statbuf.st_mode & S_IFMT) == S_IFDIR)? '/' : 0; } static directory_type * opendirectory(char *filename) { return opendir(filename); } static char * readdirectory(directory_type *dir) { for (;;) { struct dirent *dent = readdir(dir); if (dent == NULL) return NULL; if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0) return dent->d_name; } /* Control never reaches here */ } static void closedirectory(directory_type *dir) { closedir(dir); } /************* Test for regular file in Unix **********/ static int isregfile(char *filename) { struct stat statbuf; if (stat(filename, &statbuf) < 0) return 1; /* In the expectation that opening as a file will fail */ return (statbuf.st_mode & S_IFMT) == S_IFREG; } /************* Test stdout for being a terminal in Unix **********/ static BOOL is_stdout_tty(void) { return isatty(fileno(stdout)); } /************* Directory scanning in Win32 ***********/ /* I (Philip Hazel) have no means of testing this code. It was contributed by Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES when it did not exist. */ #elif HAVE_WINDOWS_H #ifndef STRICT # define STRICT #endif #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #ifndef INVALID_FILE_ATTRIBUTES #define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF #endif #include typedef struct directory_type { HANDLE handle; BOOL first; WIN32_FIND_DATA data; } directory_type; int isdirectory(char *filename) { DWORD attr = GetFileAttributes(filename); if (attr == INVALID_FILE_ATTRIBUTES) return 0; return ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) ? '/' : 0; } directory_type * opendirectory(char *filename) { size_t len; char *pattern; directory_type *dir; DWORD err; len = strlen(filename); pattern = (char *) malloc(len + 3); dir = (directory_type *) malloc(sizeof(*dir)); if ((pattern == NULL) || (dir == NULL)) { fprintf(stderr, "pcregrep: malloc failed\n"); exit(2); } memcpy(pattern, filename, len); memcpy(&(pattern[len]), "\\*", 3); dir->handle = FindFirstFile(pattern, &(dir->data)); if (dir->handle != INVALID_HANDLE_VALUE) { free(pattern); dir->first = TRUE; return dir; } err = GetLastError(); free(pattern); free(dir); errno = (err == ERROR_ACCESS_DENIED) ? EACCES : ENOENT; return NULL; } char * readdirectory(directory_type *dir) { for (;;) { if (!dir->first) { if (!FindNextFile(dir->handle, &(dir->data))) return NULL; } else { dir->first = FALSE; } if (strcmp(dir->data.cFileName, ".") != 0 && strcmp(dir->data.cFileName, "..") != 0) return dir->data.cFileName; } #ifndef _MSC_VER return NULL; /* Keep compiler happy; never executed */ #endif } void closedirectory(directory_type *dir) { FindClose(dir->handle); free(dir); } /************* Test for regular file in Win32 **********/ /* I don't know how to do this, or if it can be done; assume all paths are regular if they are not directories. */ int isregfile(char *filename) { return !isdirectory(filename) } /************* Test stdout for being a terminal in Win32 **********/ /* I don't know how to do this; assume never */ static BOOL is_stdout_tty(void) { FALSE; } /************* Directory scanning when we can't do it ***********/ /* The type is void, and apart from isdirectory(), the functions do nothing. */ #else typedef void directory_type; int isdirectory(char *filename) { return 0; } directory_type * opendirectory(char *filename) { return (directory_type*)0;} char *readdirectory(directory_type *dir) { return (char*)0;} void closedirectory(directory_type *dir) {} /************* Test for regular when we can't do it **********/ /* Assume all files are regular. */ int isregfile(char *filename) { return 1; } /************* Test stdout for being a terminal when we can't do it **********/ static BOOL is_stdout_tty(void) { return FALSE; } #endif #ifndef HAVE_STRERROR /************************************************* * Provide strerror() for non-ANSI libraries * *************************************************/ /* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() in their libraries, but can provide the same facility by this simple alternative function. */ extern int sys_nerr; extern char *sys_errlist[]; char * strerror(int n) { if (n < 0 || n >= sys_nerr) return "unknown error number"; return sys_errlist[n]; } #endif /* HAVE_STRERROR */ /************************************************* * Find end of line * *************************************************/ /* The length of the endline sequence that is found is set via lenptr. This may be zero at the very end of the file if there is no line-ending sequence there. Arguments: p current position in line endptr end of available data lenptr where to put the length of the eol sequence Returns: pointer to the last byte of the line */ static char * end_of_line(char *p, char *endptr, int *lenptr) { switch(endlinetype) { default: /* Just in case */ case EL_LF: while (p < endptr && *p != '\n') p++; if (p < endptr) { *lenptr = 1; return p + 1; } *lenptr = 0; return endptr; case EL_CR: while (p < endptr && *p != '\r') p++; if (p < endptr) { *lenptr = 1; return p + 1; } *lenptr = 0; return endptr; case EL_CRLF: for (;;) { while (p < endptr && *p != '\r') p++; if (++p >= endptr) { *lenptr = 0; return endptr; } if (*p == '\n') { *lenptr = 2; return p + 1; } } break; case EL_ANYCRLF: while (p < endptr) { int extra = 0; register int c = *((unsigned char *)p); if (utf8 && c >= 0xc0) { int gcii, gcss; extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ gcss = 6*extra; c = (c & utf8_table3[extra]) << gcss; for (gcii = 1; gcii <= extra; gcii++) { gcss -= 6; c |= (p[gcii] & 0x3f) << gcss; } } p += 1 + extra; switch (c) { case 0x0a: /* LF */ *lenptr = 1; return p; case 0x0d: /* CR */ if (p < endptr && *p == 0x0a) { *lenptr = 2; p++; } else *lenptr = 1; return p; default: break; } } /* End of loop for ANYCRLF case */ *lenptr = 0; /* Must have hit the end */ return endptr; case EL_ANY: while (p < endptr) { int extra = 0; register int c = *((unsigned char *)p); if (utf8 && c >= 0xc0) { int gcii, gcss; extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ gcss = 6*extra; c = (c & utf8_table3[extra]) << gcss; for (gcii = 1; gcii <= extra; gcii++) { gcss -= 6; c |= (p[gcii] & 0x3f) << gcss; } } p += 1 + extra; switch (c) { case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ *lenptr = 1; return p; case 0x0d: /* CR */ if (p < endptr && *p == 0x0a) { *lenptr = 2; p++; } else *lenptr = 1; return p; case 0x85: /* NEL */ *lenptr = utf8? 2 : 1; return p; case 0x2028: /* LS */ case 0x2029: /* PS */ *lenptr = 3; return p; default: break; } } /* End of loop for ANY case */ *lenptr = 0; /* Must have hit the end */ return endptr; } /* End of overall switch */ } /************************************************* * Find start of previous line * *************************************************/ /* This is called when looking back for before lines to print. Arguments: p start of the subsequent line startptr start of available data Returns: pointer to the start of the previous line */ static char * previous_line(char *p, char *startptr) { switch(endlinetype) { default: /* Just in case */ case EL_LF: p--; while (p > startptr && p[-1] != '\n') p--; return p; case EL_CR: p--; while (p > startptr && p[-1] != '\n') p--; return p; case EL_CRLF: for (;;) { p -= 2; while (p > startptr && p[-1] != '\n') p--; if (p <= startptr + 1 || p[-2] == '\r') return p; } return p; /* But control should never get here */ case EL_ANY: case EL_ANYCRLF: if (*(--p) == '\n' && p > startptr && p[-1] == '\r') p--; if (utf8) while ((*p & 0xc0) == 0x80) p--; while (p > startptr) { register int c; char *pp = p - 1; if (utf8) { int extra = 0; while ((*pp & 0xc0) == 0x80) pp--; c = *((unsigned char *)pp); if (c >= 0xc0) { int gcii, gcss; extra = utf8_table4[c & 0x3f]; /* Number of additional bytes */ gcss = 6*extra; c = (c & utf8_table3[extra]) << gcss; for (gcii = 1; gcii <= extra; gcii++) { gcss -= 6; c |= (pp[gcii] & 0x3f) << gcss; } } } else c = *((unsigned char *)pp); if (endlinetype == EL_ANYCRLF) switch (c) { case 0x0a: /* LF */ case 0x0d: /* CR */ return p; default: break; } else switch (c) { case 0x0a: /* LF */ case 0x0b: /* VT */ case 0x0c: /* FF */ case 0x0d: /* CR */ case 0x85: /* NEL */ case 0x2028: /* LS */ case 0x2029: /* PS */ return p; default: break; } p = pp; /* Back one character */ } /* End of loop for ANY case */ return startptr; /* Hit start of data */ } /* End of overall switch */ } /************************************************* * Print the previous "after" lines * *************************************************/ /* This is called if we are about to lose said lines because of buffer filling, and at the end of the file. The data in the line is written using fwrite() so that a binary zero does not terminate it. Arguments: lastmatchnumber the number of the last matching line, plus one lastmatchrestart where we restarted after the last match endptr end of available data printname filename for printing Returns: nothing */ static void do_after_lines(int lastmatchnumber, char *lastmatchrestart, char *endptr, char *printname) { if (after_context > 0 && lastmatchnumber > 0) { int count = 0; while (lastmatchrestart < endptr && count++ < after_context) { int ellength; char *pp = lastmatchrestart; if (printname != NULL) fprintf(stdout, "%s-", printname); if (number) fprintf(stdout, "%d-", lastmatchnumber++); pp = end_of_line(pp, endptr, &ellength); fwrite(lastmatchrestart, 1, pp - lastmatchrestart, stdout); lastmatchrestart = pp; } hyphenpending = TRUE; } } /************************************************* * Grep an individual file * *************************************************/ /* This is called from grep_or_recurse() below. It uses a buffer that is three times the value of MBUFTHIRD. The matching point is never allowed to stray into the top third of the buffer, thus keeping more of the file available for context printing or for multiline scanning. For large files, the pointer will be in the middle third most of the time, so the bottom third is available for "before" context printing. Arguments: in the fopened FILE stream printname the file name if it is to be printed for each match or NULL if the file name is not to be printed it cannot be NULL if filenames[_nomatch]_only is set Returns: 0 if there was at least one match 1 otherwise (no matches) */ static int pcregrep(FILE *in, char *printname) { int rc = 1; int linenumber = 1; int lastmatchnumber = 0; int count = 0; int offsets[99]; char *lastmatchrestart = NULL; char buffer[3*MBUFTHIRD]; char *ptr = buffer; char *endptr; size_t bufflength; BOOL endhyphenpending = FALSE; /* Do the first read into the start of the buffer and set up the pointer to end of what we have. */ bufflength = fread(buffer, 1, 3*MBUFTHIRD, in); endptr = buffer + bufflength; /* Loop while the current pointer is not at the end of the file. For large files, endptr will be at the end of the buffer when we are in the middle of the file, but ptr will never get there, because as soon as it gets over 2/3 of the way, the buffer is shifted left and re-filled. */ while (ptr < endptr) { int i, endlinelength; int mrc = 0; BOOL match = FALSE; char *t = ptr; size_t length, linelength; /* At this point, ptr is at the start of a line. We need to find the length of the subject string to pass to pcre_exec(). In multiline mode, it is the length remainder of the data in the buffer. Otherwise, it is the length of the next line. After matching, we always advance by the length of the next line. In multiline mode the PCRE_FIRSTLINE option is used for compiling, so that any match is constrained to be in the first line. */ t = end_of_line(t, endptr, &endlinelength); linelength = t - ptr - endlinelength; length = multiline? (size_t)(endptr - ptr) : linelength; /* Extra processing for Jeffrey Friedl's debugging. */ #ifdef JFRIEDL_DEBUG if (jfriedl_XT || jfriedl_XR) { #include #include struct timeval start_time, end_time; struct timezone dummy; if (jfriedl_XT) { unsigned long newlen = length * jfriedl_XT + strlen(jfriedl_prefix) + strlen(jfriedl_postfix); const char *orig = ptr; ptr = malloc(newlen + 1); if (!ptr) { printf("out of memory"); exit(2); } endptr = ptr; strcpy(endptr, jfriedl_prefix); endptr += strlen(jfriedl_prefix); for (i = 0; i < jfriedl_XT; i++) { strncpy(endptr, orig, length); endptr += length; } strcpy(endptr, jfriedl_postfix); endptr += strlen(jfriedl_postfix); length = newlen; } if (gettimeofday(&start_time, &dummy) != 0) perror("bad gettimeofday"); for (i = 0; i < jfriedl_XR; i++) match = (pcre_exec(pattern_list[0], hints_list[0], ptr, length, 0, 0, offsets, 99) >= 0); if (gettimeofday(&end_time, &dummy) != 0) perror("bad gettimeofday"); double delta = ((end_time.tv_sec + (end_time.tv_usec / 1000000.0)) - (start_time.tv_sec + (start_time.tv_usec / 1000000.0))); printf("%s TIMER[%.4f]\n", match ? "MATCH" : "FAIL", delta); return 0; } #endif /* Run through all the patterns until one matches. Note that we don't include the final newline in the subject string. */ for (i = 0; i < pattern_count; i++) { mrc = pcre_exec(pattern_list[i], hints_list[i], ptr, length, 0, 0, offsets, 99); if (mrc >= 0) { match = TRUE; break; } if (mrc != PCRE_ERROR_NOMATCH) { fprintf(stderr, "pcregrep: pcre_exec() error %d while matching ", mrc); if (pattern_count > 1) fprintf(stderr, "pattern number %d to ", i+1); fprintf(stderr, "this line:\n"); fwrite(ptr, 1, linelength, stderr); /* In case binary zero included */ fprintf(stderr, "\n"); if (error_count == 0 && (mrc == PCRE_ERROR_MATCHLIMIT || mrc == PCRE_ERROR_RECURSIONLIMIT)) { fprintf(stderr, "pcregrep: error %d means that a resource limit " "was exceeded\n", mrc); fprintf(stderr, "pcregrep: check your regex for nested unlimited loops\n"); } if (error_count++ > 20) { fprintf(stderr, "pcregrep: too many errors - abandoned\n"); exit(2); } match = invert; /* No more matching; don't show the line again */ break; } } /* If it's a match or a not-match (as required), do what's wanted. */ if (match != invert) { BOOL hyphenprinted = FALSE; /* We've failed if we want a file that doesn't have any matches. */ if (filenames == FN_NOMATCH_ONLY) return 1; /* Just count if just counting is wanted. */ if (count_only) count++; /* If all we want is a file name, there is no need to scan any more lines in the file. */ else if (filenames == FN_ONLY) { fprintf(stdout, "%s\n", printname); return 0; } /* Likewise, if all we want is a yes/no answer. */ else if (quiet) return 0; /* The --only-matching option prints just the substring that matched, and does not pring any context. */ else if (only_matching) { if (printname != NULL) fprintf(stdout, "%s:", printname); if (number) fprintf(stdout, "%d:", linenumber); fwrite(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout); fprintf(stdout, "\n"); } /* This is the default case when none of the above options is set. We print the matching lines(s), possibly preceded and/or followed by other lines of context. */ else { /* See if there is a requirement to print some "after" lines from a previous match. We never print any overlaps. */ if (after_context > 0 && lastmatchnumber > 0) { int ellength; int linecount = 0; char *p = lastmatchrestart; while (p < ptr && linecount < after_context) { p = end_of_line(p, ptr, &ellength); linecount++; } /* It is important to advance lastmatchrestart during this printing so that it interacts correctly with any "before" printing below. Print each line's data using fwrite() in case there are binary zeroes. */ while (lastmatchrestart < p) { char *pp = lastmatchrestart; if (printname != NULL) fprintf(stdout, "%s-", printname); if (number) fprintf(stdout, "%d-", lastmatchnumber++); pp = end_of_line(pp, endptr, &ellength); fwrite(lastmatchrestart, 1, pp - lastmatchrestart, stdout); lastmatchrestart = pp; } if (lastmatchrestart != ptr) hyphenpending = TRUE; } /* If there were non-contiguous lines printed above, insert hyphens. */ if (hyphenpending) { fprintf(stdout, "--\n"); hyphenpending = FALSE; hyphenprinted = TRUE; } /* See if there is a requirement to print some "before" lines for this match. Again, don't print overlaps. */ if (before_context > 0) { int linecount = 0; char *p = ptr; while (p > buffer && (lastmatchnumber == 0 || p > lastmatchrestart) && linecount < before_context) { linecount++; p = previous_line(p, buffer); } if (lastmatchnumber > 0 && p > lastmatchrestart && !hyphenprinted) fprintf(stdout, "--\n"); while (p < ptr) { int ellength; char *pp = p; if (printname != NULL) fprintf(stdout, "%s-", printname); if (number) fprintf(stdout, "%d-", linenumber - linecount--); pp = end_of_line(pp, endptr, &ellength); fwrite(p, 1, pp - p, stdout); p = pp; } } /* Now print the matching line(s); ensure we set hyphenpending at the end of the file if any context lines are being output. */ if (after_context > 0 || before_context > 0) endhyphenpending = TRUE; if (printname != NULL) fprintf(stdout, "%s:", printname); if (number) fprintf(stdout, "%d:", linenumber); /* In multiline mode, we want to print to the end of the line in which the end of the matched string is found, so we adjust linelength and the line number appropriately, but only when there actually was a match (invert not set). Because the PCRE_FIRSTLINE option is set, the start of the match will always be before the first newline sequence. */ if (multiline) { int ellength; char *endmatch = ptr; if (!invert) { endmatch += offsets[1]; t = ptr; while (t < endmatch) { t = end_of_line(t, endptr, &ellength); if (t <= endmatch) linenumber++; else break; } } endmatch = end_of_line(endmatch, endptr, &ellength); linelength = endmatch - ptr - ellength; } /*** NOTE: Use only fwrite() to output the data line, so that binary zeroes are treated as just another data character. */ /* This extra option, for Jeffrey Friedl's debugging requirements, replaces the matched string, or a specific captured string if it exists, with X. When this happens, colouring is ignored. */ #ifdef JFRIEDL_DEBUG if (S_arg >= 0 && S_arg < mrc) { int first = S_arg * 2; int last = first + 1; fwrite(ptr, 1, offsets[first], stdout); fprintf(stdout, "X"); fwrite(ptr + offsets[last], 1, linelength - offsets[last], stdout); } else #endif /* We have to split the line(s) up if colouring. */ if (do_colour) { fwrite(ptr, 1, offsets[0], stdout); fprintf(stdout, "%c[%sm", 0x1b, colour_string); fwrite(ptr + offsets[0], 1, offsets[1] - offsets[0], stdout); fprintf(stdout, "%c[00m", 0x1b); fwrite(ptr + offsets[1], 1, linelength - offsets[1], stdout); } else fwrite(ptr, 1, linelength + endlinelength, stdout); } /* End of doing what has to be done for a match */ rc = 0; /* Had some success */ /* Remember where the last match happened for after_context. We remember where we are about to restart, and that line's number. */ lastmatchrestart = ptr + linelength + endlinelength; lastmatchnumber = linenumber + 1; } /* For a match in multiline inverted mode (which of course did not cause anything to be printed), we have to move on to the end of the match before proceeding. */ if (multiline && invert && match) { int ellength; char *endmatch = ptr + offsets[1]; t = ptr; while (t < endmatch) { t = end_of_line(t, endptr, &ellength); if (t <= endmatch) linenumber++; else break; } endmatch = end_of_line(endmatch, endptr, &ellength); linelength = endmatch - ptr - ellength; } /* Advance to after the newline and increment the line number. */ ptr += linelength + endlinelength; linenumber++; /* If we haven't yet reached the end of the file (the buffer is full), and the current point is in the top 1/3 of the buffer, slide the buffer down by 1/3 and refill it. Before we do this, if some unprinted "after" lines are about to be lost, print them. */ if (bufflength >= sizeof(buffer) && ptr > buffer + 2*MBUFTHIRD) { if (after_context > 0 && lastmatchnumber > 0 && lastmatchrestart < buffer + MBUFTHIRD) { do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname); lastmatchnumber = 0; } /* Now do the shuffle */ memmove(buffer, buffer + MBUFTHIRD, 2*MBUFTHIRD); ptr -= MBUFTHIRD; bufflength = 2*MBUFTHIRD + fread(buffer + 2*MBUFTHIRD, 1, MBUFTHIRD, in); endptr = buffer + bufflength; /* Adjust any last match point */ if (lastmatchnumber > 0) lastmatchrestart -= MBUFTHIRD; } } /* Loop through the whole file */ /* End of file; print final "after" lines if wanted; do_after_lines sets hyphenpending if it prints something. */ if (!only_matching && !count_only) { do_after_lines(lastmatchnumber, lastmatchrestart, endptr, printname); hyphenpending |= endhyphenpending; } /* Print the file name if we are looking for those without matches and there were none. If we found a match, we won't have got this far. */ if (filenames == FN_NOMATCH_ONLY) { fprintf(stdout, "%s\n", printname); return 0; } /* Print the match count if wanted */ if (count_only) { if (printname != NULL) fprintf(stdout, "%s:", printname); fprintf(stdout, "%d\n", count); } return rc; } /************************************************* * Grep a file or recurse into a directory * *************************************************/ /* Given a path name, if it's a directory, scan all the files if we are recursing; if it's a file, grep it. Arguments: pathname the path to investigate dir_recurse TRUE if recursing is wanted (-r or -drecurse) only_one_at_top TRUE if the path is the only one at toplevel Returns: 0 if there was at least one match 1 if there were no matches 2 there was some kind of error However, file opening failures are suppressed if "silent" is set. */ static int grep_or_recurse(char *pathname, BOOL dir_recurse, BOOL only_one_at_top) { int rc = 1; int sep; FILE *in; /* If the file name is "-" we scan stdin */ if (strcmp(pathname, "-") == 0) { return pcregrep(stdin, (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))? stdin_name : NULL); } /* If the file is a directory, skip if skipping or if we are recursing, scan each file within it, subject to any include or exclude patterns that were set. The scanning code is localized so it can be made system-specific. */ if ((sep = isdirectory(pathname)) != 0) { if (dee_action == dee_SKIP) return 1; if (dee_action == dee_RECURSE) { char buffer[1024]; char *nextfile; directory_type *dir = opendirectory(pathname); if (dir == NULL) { if (!silent) fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", pathname, strerror(errno)); return 2; } while ((nextfile = readdirectory(dir)) != NULL) { int frc, blen; sprintf(buffer, "%.512s%c%.128s", pathname, sep, nextfile); blen = strlen(buffer); if (exclude_compiled != NULL && pcre_exec(exclude_compiled, NULL, buffer, blen, 0, 0, NULL, 0) >= 0) continue; if (include_compiled != NULL && pcre_exec(include_compiled, NULL, buffer, blen, 0, 0, NULL, 0) < 0) continue; frc = grep_or_recurse(buffer, dir_recurse, FALSE); if (frc > 1) rc = frc; else if (frc == 0 && rc == 1) rc = 0; } closedirectory(dir); return rc; } } /* If the file is not a directory and not a regular file, skip it if that's been requested. */ else if (!isregfile(pathname) && DEE_action == DEE_SKIP) return 1; /* Control reaches here if we have a regular file, or if we have a directory and recursion or skipping was not requested, or if we have anything else and skipping was not requested. The scan proceeds. If this is the first and only argument at top level, we don't show the file name, unless we are only showing the file name, or the filename was forced (-H). */ in = fopen(pathname, "r"); if (in == NULL) { if (!silent) fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pathname, strerror(errno)); return 2; } rc = pcregrep(in, (filenames > FN_DEFAULT || (filenames == FN_DEFAULT && !only_one_at_top))? pathname : NULL); fclose(in); return rc; } /************************************************* * Usage function * *************************************************/ static int usage(int rc) { option_item *op; fprintf(stderr, "Usage: pcregrep [-"); for (op = optionlist; op->one_char != 0; op++) { if (op->one_char > 0) fprintf(stderr, "%c", op->one_char); } fprintf(stderr, "] [long options] [pattern] [files]\n"); fprintf(stderr, "Type `pcregrep --help' for more information.\n"); return rc; } /************************************************* * Help function * *************************************************/ static void help(void) { option_item *op; printf("Usage: pcregrep [OPTION]... [PATTERN] [FILE1 FILE2 ...]\n"); printf("Search for PATTERN in each FILE or standard input.\n"); printf("PATTERN must be present if neither -e nor -f is used.\n"); printf("\"-\" can be used as a file name to mean STDIN.\n\n"); printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n"); printf("Options:\n"); for (op = optionlist; op->one_char != 0; op++) { int n; char s[4]; if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, " "); printf(" %s --%s%n", s, op->long_name, &n); n = 30 - n; if (n < 1) n = 1; printf("%.*s%s\n", n, " ", op->help_text); } printf("\nWhen reading patterns from a file instead of using a command line option,\n"); printf("trailing white space is removed and blank lines are ignored.\n"); printf("There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT); printf("\nWith no FILEs, read standard input. If fewer than two FILEs given, assume -h.\n"); printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n"); } /************************************************* * Handle a single-letter, no data option * *************************************************/ static int handle_option(int letter, int options) { switch(letter) { case N_HELP: help(); exit(0); case 'c': count_only = TRUE; break; case 'F': process_options |= PO_FIXED_STRINGS; break; case 'H': filenames = FN_FORCE; break; case 'h': filenames = FN_NONE; break; case 'i': options |= PCRE_CASELESS; break; case 'l': filenames = FN_ONLY; break; case 'L': filenames = FN_NOMATCH_ONLY; break; case 'M': multiline = TRUE; options |= PCRE_MULTILINE|PCRE_FIRSTLINE; break; case 'n': number = TRUE; break; case 'o': only_matching = TRUE; break; case 'q': quiet = TRUE; break; case 'r': dee_action = dee_RECURSE; break; case 's': silent = TRUE; break; case 'u': options |= PCRE_UTF8; utf8 = TRUE; break; case 'v': invert = TRUE; break; case 'w': process_options |= PO_WORD_MATCH; break; case 'x': process_options |= PO_LINE_MATCH; break; case 'V': fprintf(stderr, "pcregrep version %s\n", pcre_version()); exit(0); break; default: fprintf(stderr, "pcregrep: Unknown option -%c\n", letter); exit(usage(2)); } return options; } /************************************************* * Construct printed ordinal * *************************************************/ /* This turns a number into "1st", "3rd", etc. */ static char * ordin(int n) { static char buffer[8]; char *p = buffer; sprintf(p, "%d", n); while (*p != 0) p++; switch (n%10) { case 1: strcpy(p, "st"); break; case 2: strcpy(p, "nd"); break; case 3: strcpy(p, "rd"); break; default: strcpy(p, "th"); break; } return buffer; } /************************************************* * Compile a single pattern * *************************************************/ /* When the -F option has been used, this is called for each substring. Otherwise it's called for each supplied pattern. Arguments: pattern the pattern string options the PCRE options filename the file name, or NULL for a command-line pattern count 0 if this is the only command line pattern, or number of the command line pattern, or linenumber for a pattern from a file Returns: TRUE on success, FALSE after an error */ static BOOL compile_single_pattern(char *pattern, int options, char *filename, int count) { char buffer[MBUFTHIRD + 16]; const char *error; int errptr; if (pattern_count >= MAX_PATTERN_COUNT) { fprintf(stderr, "pcregrep: Too many %spatterns (max %d)\n", (filename == NULL)? "command-line " : "", MAX_PATTERN_COUNT); return FALSE; } sprintf(buffer, "%s%.*s%s", prefix[process_options], MBUFTHIRD, pattern, suffix[process_options]); pattern_list[pattern_count] = pcre_compile(buffer, options, &error, &errptr, pcretables); if (pattern_list[pattern_count] != NULL) { pattern_count++; return TRUE; } /* Handle compile errors */ errptr -= (int)strlen(prefix[process_options]); if (errptr > (int)strlen(pattern)) errptr = (int)strlen(pattern); if (filename == NULL) { if (count == 0) fprintf(stderr, "pcregrep: Error in command-line regex " "at offset %d: %s\n", errptr, error); else fprintf(stderr, "pcregrep: Error in %s command-line regex " "at offset %d: %s\n", ordin(count), errptr, error); } else { fprintf(stderr, "pcregrep: Error in regex in line %d of %s " "at offset %d: %s\n", count, filename, errptr, error); } return FALSE; } /************************************************* * Compile one supplied pattern * *************************************************/ /* When the -F option has been used, each string may be a list of strings, separated by line breaks. They will be matched literally. Arguments: pattern the pattern string options the PCRE options filename the file name, or NULL for a command-line pattern count 0 if this is the only command line pattern, or number of the command line pattern, or linenumber for a pattern from a file Returns: TRUE on success, FALSE after an error */ static BOOL compile_pattern(char *pattern, int options, char *filename, int count) { if ((process_options & PO_FIXED_STRINGS) != 0) { char *eop = pattern + strlen(pattern); char buffer[MBUFTHIRD]; for(;;) { int ellength; char *p = end_of_line(pattern, eop, &ellength); if (ellength == 0) return compile_single_pattern(pattern, options, filename, count); sprintf(buffer, "%.*s", (int)(p - pattern - ellength), pattern); pattern = p; if (!compile_single_pattern(buffer, options, filename, count)) return FALSE; } } else return compile_single_pattern(pattern, options, filename, count); } /************************************************* * Main program * *************************************************/ /* Returns 0 if something matched, 1 if nothing matched, 2 after an error. */ int main(int argc, char **argv) { int i, j; int rc = 1; int pcre_options = 0; int cmd_pattern_count = 0; int hint_count = 0; int errptr; BOOL only_one_at_top; char *patterns[MAX_PATTERN_COUNT]; const char *locale_from = "--locale"; const char *error; /* Set the default line ending value from the default in the PCRE library; "lf", "cr", "crlf", and "any" are supported. Anything else is treated as "lf". */ (void)pcre_config(PCRE_CONFIG_NEWLINE, &i); switch(i) { default: newline = (char *)"lf"; break; case '\r': newline = (char *)"cr"; break; case ('\r' << 8) | '\n': newline = (char *)"crlf"; break; case -1: newline = (char *)"any"; break; case -2: newline = (char *)"anycrlf"; break; } /* Process the options */ for (i = 1; i < argc; i++) { option_item *op = NULL; char *option_data = (char *)""; /* default to keep compiler happy */ BOOL longop; BOOL longopwasequals = FALSE; if (argv[i][0] != '-') break; /* If we hit an argument that is just "-", it may be a reference to STDIN, but only if we have previously had -e or -f to define the patterns. */ if (argv[i][1] == 0) { if (pattern_filename != NULL || pattern_count > 0) break; else exit(usage(2)); } /* Handle a long name option, or -- to terminate the options */ if (argv[i][1] == '-') { char *arg = argv[i] + 2; char *argequals = strchr(arg, '='); if (*arg == 0) /* -- terminates options */ { i++; break; /* out of the options-handling loop */ } longop = TRUE; /* Some long options have data that follows after =, for example file=name. Some options have variations in the long name spelling: specifically, we allow "regexp" because GNU grep allows it, though I personally go along with Jeffrey Friedl and Larry Wall in preferring "regex" without the "p". These options are entered in the table as "regex(p)". No option is in both these categories, fortunately. */ for (op = optionlist; op->one_char != 0; op++) { char *opbra = strchr(op->long_name, '('); char *equals = strchr(op->long_name, '='); if (opbra == NULL) /* Not a (p) case */ { if (equals == NULL) /* Not thing=data case */ { if (strcmp(arg, op->long_name) == 0) break; } else /* Special case xxx=data */ { int oplen = equals - op->long_name; int arglen = (argequals == NULL)? (int)strlen(arg) : argequals - arg; if (oplen == arglen && strncmp(arg, op->long_name, oplen) == 0) { option_data = arg + arglen; if (*option_data == '=') { option_data++; longopwasequals = TRUE; } break; } } } else /* Special case xxxx(p) */ { char buff1[24]; char buff2[24]; int baselen = opbra - op->long_name; sprintf(buff1, "%.*s", baselen, op->long_name); sprintf(buff2, "%s%.*s", buff1, (int)strlen(op->long_name) - baselen - 2, opbra + 1); if (strcmp(arg, buff1) == 0 || strcmp(arg, buff2) == 0) break; } } if (op->one_char == 0) { fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]); exit(usage(2)); } } /* Jeffrey Friedl's debugging harness uses these additional options which are not in the right form for putting in the option table because they use only one hyphen, yet are more than one character long. By putting them separately here, they will not get displayed as part of the help() output, but I don't think Jeffrey will care about that. */ #ifdef JFRIEDL_DEBUG else if (strcmp(argv[i], "-pre") == 0) { jfriedl_prefix = argv[++i]; continue; } else if (strcmp(argv[i], "-post") == 0) { jfriedl_postfix = argv[++i]; continue; } else if (strcmp(argv[i], "-XT") == 0) { sscanf(argv[++i], "%d", &jfriedl_XT); continue; } else if (strcmp(argv[i], "-XR") == 0) { sscanf(argv[++i], "%d", &jfriedl_XR); continue; } #endif /* One-char options; many that have no data may be in a single argument; we continue till we hit the last one or one that needs data. */ else { char *s = argv[i] + 1; longop = FALSE; while (*s != 0) { for (op = optionlist; op->one_char != 0; op++) { if (*s == op->one_char) break; } if (op->one_char == 0) { fprintf(stderr, "pcregrep: Unknown option letter '%c' in \"%s\"\n", *s, argv[i]); exit(usage(2)); } if (op->type != OP_NODATA || s[1] == 0) { option_data = s+1; break; } pcre_options = handle_option(*s++, pcre_options); } } /* At this point we should have op pointing to a matched option. If the type is NO_DATA, it means that there is no data, and the option might set something in the PCRE options. */ if (op->type == OP_NODATA) { pcre_options = handle_option(op->one_char, pcre_options); continue; } /* If the option type is OP_OP_STRING or OP_OP_NUMBER, it's an option that either has a value or defaults to something. It cannot have data in a separate item. At the moment, the only such options are "colo(u)r" and Jeffrey Friedl's special -S debugging option. */ if (*option_data == 0 && (op->type == OP_OP_STRING || op->type == OP_OP_NUMBER)) { switch (op->one_char) { case N_COLOUR: colour_option = (char *)"auto"; break; #ifdef JFRIEDL_DEBUG case 'S': S_arg = 0; break; #endif } continue; } /* Otherwise, find the data string for the option. */ if (*option_data == 0) { if (i >= argc - 1 || longopwasequals) { fprintf(stderr, "pcregrep: Data missing after %s\n", argv[i]); exit(usage(2)); } option_data = argv[++i]; } /* If the option type is OP_PATLIST, it's the -e option, which can be called multiple times to create a list of patterns. */ if (op->type == OP_PATLIST) { if (cmd_pattern_count >= MAX_PATTERN_COUNT) { fprintf(stderr, "pcregrep: Too many command-line patterns (max %d)\n", MAX_PATTERN_COUNT); return 2; } patterns[cmd_pattern_count++] = option_data; } /* Otherwise, deal with single string or numeric data values. */ else if (op->type != OP_NUMBER && op->type != OP_OP_NUMBER) { *((char **)op->dataptr) = option_data; } else { char *endptr; int n = strtoul(option_data, &endptr, 10); if (*endptr != 0) { if (longop) { char *equals = strchr(op->long_name, '='); int nlen = (equals == NULL)? (int)strlen(op->long_name) : equals - op->long_name; fprintf(stderr, "pcregrep: Malformed number \"%s\" after --%.*s\n", option_data, nlen, op->long_name); } else fprintf(stderr, "pcregrep: Malformed number \"%s\" after -%c\n", option_data, op->one_char); exit(usage(2)); } *((int *)op->dataptr) = n; } } /* Options have been decoded. If -C was used, its value is used as a default for -A and -B. */ if (both_context > 0) { if (after_context == 0) after_context = both_context; if (before_context == 0) before_context = both_context; } /* If a locale has not been provided as an option, see if the LC_CTYPE or LC_ALL environment variable is set, and if so, use it. */ if (locale == NULL) { locale = getenv("LC_ALL"); locale_from = "LCC_ALL"; } if (locale == NULL) { locale = getenv("LC_CTYPE"); locale_from = "LC_CTYPE"; } /* If a locale has been provided, set it, and generate the tables the PCRE needs. Otherwise, pcretables==NULL, which causes the use of default tables. */ if (locale != NULL) { if (setlocale(LC_CTYPE, locale) == NULL) { fprintf(stderr, "pcregrep: Failed to set locale %s (obtained from %s)\n", locale, locale_from); return 2; } pcretables = pcre_maketables(); } /* Sort out colouring */ if (colour_option != NULL && strcmp(colour_option, "never") != 0) { if (strcmp(colour_option, "always") == 0) do_colour = TRUE; else if (strcmp(colour_option, "auto") == 0) do_colour = is_stdout_tty(); else { fprintf(stderr, "pcregrep: Unknown colour setting \"%s\"\n", colour_option); return 2; } if (do_colour) { char *cs = getenv("PCREGREP_COLOUR"); if (cs == NULL) cs = getenv("PCREGREP_COLOR"); if (cs != NULL) colour_string = cs; } } /* Interpret the newline type; the default settings are Unix-like. */ if (strcmp(newline, "cr") == 0 || strcmp(newline, "CR") == 0) { pcre_options |= PCRE_NEWLINE_CR; endlinetype = EL_CR; } else if (strcmp(newline, "lf") == 0 || strcmp(newline, "LF") == 0) { pcre_options |= PCRE_NEWLINE_LF; endlinetype = EL_LF; } else if (strcmp(newline, "crlf") == 0 || strcmp(newline, "CRLF") == 0) { pcre_options |= PCRE_NEWLINE_CRLF; endlinetype = EL_CRLF; } else if (strcmp(newline, "any") == 0 || strcmp(newline, "ANY") == 0) { pcre_options |= PCRE_NEWLINE_ANY; endlinetype = EL_ANY; } else if (strcmp(newline, "anycrlf") == 0 || strcmp(newline, "ANYCRLF") == 0) { pcre_options |= PCRE_NEWLINE_ANYCRLF; endlinetype = EL_ANYCRLF; } else { fprintf(stderr, "pcregrep: Invalid newline specifier \"%s\"\n", newline); return 2; } /* Interpret the text values for -d and -D */ if (dee_option != NULL) { if (strcmp(dee_option, "read") == 0) dee_action = dee_READ; else if (strcmp(dee_option, "recurse") == 0) dee_action = dee_RECURSE; else if (strcmp(dee_option, "skip") == 0) dee_action = dee_SKIP; else { fprintf(stderr, "pcregrep: Invalid value \"%s\" for -d\n", dee_option); return 2; } } if (DEE_option != NULL) { if (strcmp(DEE_option, "read") == 0) DEE_action = DEE_READ; else if (strcmp(DEE_option, "skip") == 0) DEE_action = DEE_SKIP; else { fprintf(stderr, "pcregrep: Invalid value \"%s\" for -D\n", DEE_option); return 2; } } /* Check the values for Jeffrey Friedl's debugging options. */ #ifdef JFRIEDL_DEBUG if (S_arg > 9) { fprintf(stderr, "pcregrep: bad value for -S option\n"); return 2; } if (jfriedl_XT != 0 || jfriedl_XR != 0) { if (jfriedl_XT == 0) jfriedl_XT = 1; if (jfriedl_XR == 0) jfriedl_XR = 1; } #endif /* Get memory to store the pattern and hints lists. */ pattern_list = (pcre **)malloc(MAX_PATTERN_COUNT * sizeof(pcre *)); hints_list = (pcre_extra **)malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *)); if (pattern_list == NULL || hints_list == NULL) { fprintf(stderr, "pcregrep: malloc failed\n"); goto EXIT2; } /* If no patterns were provided by -e, and there is no file provided by -f, the first argument is the one and only pattern, and it must exist. */ if (cmd_pattern_count == 0 && pattern_filename == NULL) { if (i >= argc) return usage(2); patterns[cmd_pattern_count++] = argv[i++]; } /* Compile the patterns that were provided on the command line, either by multiple uses of -e or as a single unkeyed pattern. */ for (j = 0; j < cmd_pattern_count; j++) { if (!compile_pattern(patterns[j], pcre_options, NULL, (j == 0 && cmd_pattern_count == 1)? 0 : j + 1)) goto EXIT2; } /* Compile the regular expressions that are provided in a file. */ if (pattern_filename != NULL) { int linenumber = 0; FILE *f; char *filename; char buffer[MBUFTHIRD]; if (strcmp(pattern_filename, "-") == 0) { f = stdin; filename = stdin_name; } else { f = fopen(pattern_filename, "r"); if (f == NULL) { fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pattern_filename, strerror(errno)); goto EXIT2; } filename = pattern_filename; } while (fgets(buffer, MBUFTHIRD, f) != NULL) { char *s = buffer + (int)strlen(buffer); while (s > buffer && isspace((unsigned char)(s[-1]))) s--; *s = 0; linenumber++; if (buffer[0] == 0) continue; /* Skip blank lines */ if (!compile_pattern(buffer, pcre_options, filename, linenumber)) goto EXIT2; } if (f != stdin) fclose(f); } /* Study the regular expressions, as we will be running them many times */ for (j = 0; j < pattern_count; j++) { hints_list[j] = pcre_study(pattern_list[j], 0, &error); if (error != NULL) { char s[16]; if (pattern_count == 1) s[0] = 0; else sprintf(s, " number %d", j); fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error); goto EXIT2; } hint_count++; } /* If there are include or exclude patterns, compile them. */ if (exclude_pattern != NULL) { exclude_compiled = pcre_compile(exclude_pattern, 0, &error, &errptr, pcretables); if (exclude_compiled == NULL) { fprintf(stderr, "pcregrep: Error in 'exclude' regex at offset %d: %s\n", errptr, error); goto EXIT2; } } if (include_pattern != NULL) { include_compiled = pcre_compile(include_pattern, 0, &error, &errptr, pcretables); if (include_compiled == NULL) { fprintf(stderr, "pcregrep: Error in 'include' regex at offset %d: %s\n", errptr, error); goto EXIT2; } } /* If there are no further arguments, do the business on stdin and exit. */ if (i >= argc) { rc = pcregrep(stdin, (filenames > FN_DEFAULT)? stdin_name : NULL); goto EXIT; } /* Otherwise, work through the remaining arguments as files or directories. Pass in the fact that there is only one argument at top level - this suppresses the file name if the argument is not a directory and filenames are not otherwise forced. */ only_one_at_top = i == argc - 1; /* Catch initial value of i */ for (; i < argc; i++) { int frc = grep_or_recurse(argv[i], dee_action == dee_RECURSE, only_one_at_top); if (frc > 1) rc = frc; else if (frc == 0 && rc == 1) rc = 0; } EXIT: if (pattern_list != NULL) { for (i = 0; i < pattern_count; i++) free(pattern_list[i]); free(pattern_list); } if (hints_list != NULL) { for (i = 0; i < hint_count; i++) free(hints_list[i]); free(hints_list); } return rc; EXIT2: rc = 2; goto EXIT; } /* End of pcregrep */ syncevolution-1.5/src/synthesis/src/pcre/pcreposix.c0000644000373300037200000003013612424517753024431 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ /* PCRE is a library of functions to support regular expressions whose syntax and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* This module is a wrapper that provides a POSIX API to the underlying PCRE functions. */ #ifdef HAVE_CONFIG_H #include #endif /* Ensure that the PCREPOSIX_EXP_xxx macros are set appropriately for compiling these functions. This must come before including pcreposix.h, where they are set for an application (using these functions) if they have not previously been set. */ #if defined(_WIN32) && !defined(PCRE_STATIC) # define PCREPOSIX_EXP_DECL extern __declspec(dllexport) # define PCREPOSIX_EXP_DEFN __declspec(dllexport) #endif #include #include "pcre_internal.h" #include "pcreposix.h" /* Table to translate PCRE compile time error codes into POSIX error codes. */ static const int eint[] = { 0, /* no error */ REG_EESCAPE, /* \ at end of pattern */ REG_EESCAPE, /* \c at end of pattern */ REG_EESCAPE, /* unrecognized character follows \ */ REG_BADBR, /* numbers out of order in {} quantifier */ REG_BADBR, /* number too big in {} quantifier */ REG_EBRACK, /* missing terminating ] for character class */ REG_ECTYPE, /* invalid escape sequence in character class */ REG_ERANGE, /* range out of order in character class */ REG_BADRPT, /* nothing to repeat */ REG_BADRPT, /* operand of unlimited repeat could match the empty string */ REG_ASSERT, /* internal error: unexpected repeat */ REG_BADPAT, /* unrecognized character after (? */ REG_BADPAT, /* POSIX named classes are supported only within a class */ REG_EPAREN, /* missing ) */ REG_ESUBREG, /* reference to non-existent subpattern */ REG_INVARG, /* erroffset passed as NULL */ REG_INVARG, /* unknown option bit(s) set */ REG_EPAREN, /* missing ) after comment */ REG_ESIZE, /* parentheses nested too deeply */ REG_ESIZE, /* regular expression too large */ REG_ESPACE, /* failed to get memory */ REG_EPAREN, /* unmatched brackets */ REG_ASSERT, /* internal error: code overflow */ REG_BADPAT, /* unrecognized character after (?< */ REG_BADPAT, /* lookbehind assertion is not fixed length */ REG_BADPAT, /* malformed number or name after (?( */ REG_BADPAT, /* conditional group contains more than two branches */ REG_BADPAT, /* assertion expected after (?( */ REG_BADPAT, /* (?R or (?[+-]digits must be followed by ) */ REG_ECTYPE, /* unknown POSIX class name */ REG_BADPAT, /* POSIX collating elements are not supported */ REG_INVARG, /* this version of PCRE is not compiled with PCRE_UTF8 support */ REG_BADPAT, /* spare error */ REG_BADPAT, /* character value in \x{...} sequence is too large */ REG_BADPAT, /* invalid condition (?(0) */ REG_BADPAT, /* \C not allowed in lookbehind assertion */ REG_EESCAPE, /* PCRE does not support \L, \l, \N, \U, or \u */ REG_BADPAT, /* number after (?C is > 255 */ REG_BADPAT, /* closing ) for (?C expected */ REG_BADPAT, /* recursive call could loop indefinitely */ REG_BADPAT, /* unrecognized character after (?P */ REG_BADPAT, /* syntax error in subpattern name (missing terminator) */ REG_BADPAT, /* two named subpatterns have the same name */ REG_BADPAT, /* invalid UTF-8 string */ REG_BADPAT, /* support for \P, \p, and \X has not been compiled */ REG_BADPAT, /* malformed \P or \p sequence */ REG_BADPAT, /* unknown property name after \P or \p */ REG_BADPAT, /* subpattern name is too long (maximum 32 characters) */ REG_BADPAT, /* too many named subpatterns (maximum 10,000) */ REG_BADPAT, /* repeated subpattern is too long */ REG_BADPAT, /* octal value is greater than \377 (not in UTF-8 mode) */ REG_BADPAT, /* internal error: overran compiling workspace */ REG_BADPAT, /* internal error: previously-checked referenced subpattern not found */ REG_BADPAT, /* DEFINE group contains more than one branch */ REG_BADPAT, /* repeating a DEFINE group is not allowed */ REG_INVARG, /* inconsistent NEWLINE options */ REG_BADPAT, /* \g is not followed followed by an (optionally braced) non-zero number */ REG_BADPAT, /* (?+ or (?- must be followed by a non-zero number */ REG_BADPAT /* number is too big */ }; /* Table of texts corresponding to POSIX error codes */ static const char *const pstring[] = { "", /* Dummy for value 0 */ "internal error", /* REG_ASSERT */ "invalid repeat counts in {}", /* BADBR */ "pattern error", /* BADPAT */ "? * + invalid", /* BADRPT */ "unbalanced {}", /* EBRACE */ "unbalanced []", /* EBRACK */ "collation error - not relevant", /* ECOLLATE */ "bad class", /* ECTYPE */ "bad escape sequence", /* EESCAPE */ "empty expression", /* EMPTY */ "unbalanced ()", /* EPAREN */ "bad range inside []", /* ERANGE */ "expression too big", /* ESIZE */ "failed to get memory", /* ESPACE */ "bad back reference", /* ESUBREG */ "bad argument", /* INVARG */ "match failed" /* NOMATCH */ }; /************************************************* * Translate error code to string * *************************************************/ PCREPOSIX_EXP_DEFN size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) { const char *message, *addmessage; size_t length, addlength; message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))? "unknown error code" : pstring[errcode]; length = strlen(message) + 1; addmessage = " at offset "; addlength = (preg != NULL && (int)preg->re_erroffset != -1)? strlen(addmessage) + 6 : 0; if (errbuf_size > 0) { if (addlength > 0 && errbuf_size >= length + addlength) sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset); else { strncpy(errbuf, message, errbuf_size - 1); errbuf[errbuf_size-1] = 0; } } return length + addlength; } /************************************************* * Free store held by a regex * *************************************************/ PCREPOSIX_EXP_DEFN void regfree(regex_t *preg) { (pcre_free)(preg->re_pcre); } /************************************************* * Compile a regular expression * *************************************************/ /* Arguments: preg points to a structure for recording the compiled expression pattern the pattern to compile cflags compilation flags Returns: 0 on success various non-zero codes on failure */ PCREPOSIX_EXP_DEFN int regcomp(regex_t *preg, const char *pattern, int cflags) { const char *errorptr; int erroffset; int errorcode; int options = 0; if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; if ((cflags & REG_DOTALL) != 0) options |= PCRE_DOTALL; if ((cflags & REG_NOSUB) != 0) options |= PCRE_NO_AUTO_CAPTURE; if ((cflags & REG_UTF8) != 0) options |= PCRE_UTF8; preg->re_pcre = pcre_compile2(pattern, options, &errorcode, &errorptr, &erroffset, NULL); preg->re_erroffset = erroffset; if (preg->re_pcre == NULL) return eint[errorcode]; preg->re_nsub = pcre_info((const pcre *)preg->re_pcre, NULL, NULL); return 0; } /************************************************* * Match a regular expression * *************************************************/ /* Unfortunately, PCRE requires 3 ints of working space for each captured substring, so we have to get and release working store instead of just using the POSIX structures as was done in earlier releases when PCRE needed only 2 ints. However, if the number of possible capturing brackets is small, use a block of store on the stack, to reduce the use of malloc/free. The threshold is in a macro that can be changed at configure time. If REG_NOSUB was specified at compile time, the PCRE_NO_AUTO_CAPTURE flag will be set. When this is the case, the nmatch and pmatch arguments are ignored, and the only result is yes/no/error. */ PCREPOSIX_EXP_DEFN int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) { int rc; int options = 0; int *ovector = NULL; int small_ovector[POSIX_MALLOC_THRESHOLD * 3]; BOOL allocated_ovector = FALSE; BOOL nosub = (((const pcre *)preg->re_pcre)->options & PCRE_NO_AUTO_CAPTURE) != 0; if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL; if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL; ((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */ /* When no string data is being returned, ensure that nmatch is zero. Otherwise, ensure the vector for holding the return data is large enough. */ if (nosub) nmatch = 0; else if (nmatch > 0) { if (nmatch <= POSIX_MALLOC_THRESHOLD) { ovector = &(small_ovector[0]); } else { if (nmatch > INT_MAX/(sizeof(int) * 3)) return REG_ESPACE; ovector = (int *)malloc(sizeof(int) * nmatch * 3); if (ovector == NULL) return REG_ESPACE; allocated_ovector = TRUE; } } rc = pcre_exec((const pcre *)preg->re_pcre, NULL, string, (int)strlen(string), 0, options, ovector, nmatch * 3); if (rc == 0) rc = nmatch; /* All captured slots were filled in */ if (rc >= 0) { size_t i; if (!nosub) { for (i = 0; i < (size_t)rc; i++) { pmatch[i].rm_so = ovector[i*2]; pmatch[i].rm_eo = ovector[i*2+1]; } if (allocated_ovector) free(ovector); for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; } return 0; } else { if (allocated_ovector) free(ovector); switch(rc) { case PCRE_ERROR_NOMATCH: return REG_NOMATCH; case PCRE_ERROR_NULL: return REG_INVARG; case PCRE_ERROR_BADOPTION: return REG_INVARG; case PCRE_ERROR_BADMAGIC: return REG_INVARG; case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; case PCRE_ERROR_NOMEMORY: return REG_ESPACE; case PCRE_ERROR_MATCHLIMIT: return REG_ESPACE; case PCRE_ERROR_BADUTF8: return REG_INVARG; case PCRE_ERROR_BADUTF8_OFFSET: return REG_INVARG; default: return REG_ASSERT; } } } /* End of pcreposix.c */ syncevolution-1.5/src/synthesis/src/pcre/pcreposix.h0000644000373300037200000001152612424517753024440 0ustar00nightlyallusers00000000000000/************************************************* * Perl-Compatible Regular Expressions * *************************************************/ #ifndef _PCREPOSIX_H #define _PCREPOSIX_H /* This is the header for the POSIX wrapper interface to the PCRE Perl- Compatible Regular Expression library. It defines the things POSIX says should be there. I hope. Copyright (c) 1997-2007 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ /* Have to include stdlib.h in order to ensure that size_t is defined. */ #include /* Allow for C++ users */ #ifdef __cplusplus extern "C" { #endif /* Options, mostly defined by POSIX, but with a couple of extras. */ #define REG_ICASE 0x0001 #define REG_NEWLINE 0x0002 #define REG_NOTBOL 0x0004 #define REG_NOTEOL 0x0008 #define REG_DOTALL 0x0010 /* NOT defined by POSIX. */ #define REG_NOSUB 0x0020 #define REG_UTF8 0x0040 /* NOT defined by POSIX. */ /* This is not used by PCRE, but by defining it we make it easier to slot PCRE into existing programs that make POSIX calls. */ #define REG_EXTENDED 0 /* Error values. Not all these are relevant or used by the wrapper. */ enum { REG_ASSERT = 1, /* internal error ? */ REG_BADBR, /* invalid repeat counts in {} */ REG_BADPAT, /* pattern error */ REG_BADRPT, /* ? * + invalid */ REG_EBRACE, /* unbalanced {} */ REG_EBRACK, /* unbalanced [] */ REG_ECOLLATE, /* collation error - not relevant */ REG_ECTYPE, /* bad class */ REG_EESCAPE, /* bad escape sequence */ REG_EMPTY, /* empty expression */ REG_EPAREN, /* unbalanced () */ REG_ERANGE, /* bad range inside [] */ REG_ESIZE, /* expression too big */ REG_ESPACE, /* failed to get memory */ REG_ESUBREG, /* bad back reference */ REG_INVARG, /* bad argument */ REG_NOMATCH /* match failed */ }; /* The structure representing a compiled regular expression. */ typedef struct { void *re_pcre; size_t re_nsub; size_t re_erroffset; } regex_t; /* The structure in which a captured offset is returned. */ typedef int regoff_t; typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t; /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE, the appropriate export settings are needed, and are set in pcreposix.c before including this file. */ #if defined(_WIN32) && !defined(PCRE_STATIC) && !defined(PCREPOSIX_EXP_DECL) # define PCREPOSIX_EXP_DECL extern __declspec(dllimport) # define PCREPOSIX_EXP_DEFN __declspec(dllimport) #endif /* By default, we use the standard "extern" declarations. */ #ifndef PCREPOSIX_EXP_DECL # ifdef __cplusplus # define PCREPOSIX_EXP_DECL extern "C" # define PCREPOSIX_EXP_DEFN extern "C" # else # define PCREPOSIX_EXP_DECL extern # define PCREPOSIX_EXP_DEFN extern # endif #endif /* The functions */ PCREPOSIX_EXP_DECL int regcomp(regex_t *, const char *, int); PCREPOSIX_EXP_DECL int regexec(const regex_t *, const char *, size_t, regmatch_t *, int); PCREPOSIX_EXP_DECL size_t regerror(int, const regex_t *, char *, size_t); PCREPOSIX_EXP_DECL void regfree(regex_t *); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* End of pcreposix.h */ syncevolution-1.5/src/synthesis/src/pcre/pcretest.c0000644000373300037200000020733312424517753024253 0ustar00nightlyallusers00000000000000/************************************************* * PCRE testing program * *************************************************/ /* This program was hacked up as a tester for PCRE. I really should have written it more tidily in the first place. Will I ever learn? It has grown and been extended and consequently is now rather, er, *very* untidy in places. ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the University of Cambridge nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ----------------------------------------------------------------------------- */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include /* A number of things vary for Windows builds. Originally, pcretest opened its input and output without "b"; then I was told that "b" was needed in some environments, so it was added for release 5.0 to both the input and output. (It makes no difference on Unix-like systems.) Later I was told that it is wrong for the input on Windows. I've now abstracted the modes into two macros that are set here, to make it easier to fiddle with them, and removed "b" from the input mode under Windows. */ #if defined(_WIN32) || defined(WIN32) #include /* For _setmode() */ #include /* For _O_BINARY */ #define INPUT_MODE "r" #define OUTPUT_MODE "wb" #else #include /* These two includes are needed */ #include /* for setrlimit(). */ #define INPUT_MODE "rb" #define OUTPUT_MODE "wb" #endif /* We have to include pcre_internal.h because we need the internal info for displaying the results of pcre_study() and we also need to know about the internal macros, structures, and other internal data values; pcretest has "inside information" compared to a program that strictly follows the PCRE API. Although pcre_internal.h does itself include pcre.h, we explicitly include it here before pcre_internal.h so that the PCRE_EXP_xxx macros get set appropriately for an application, not for building PCRE. */ #include "pcre.h" #include "pcre_internal.h" /* We need access to the data tables that PCRE uses. So as not to have to keep two copies, we include the source file here, changing the names of the external symbols to prevent clashes. */ #define _pcre_utf8_table1 utf8_table1 #define _pcre_utf8_table1_size utf8_table1_size #define _pcre_utf8_table2 utf8_table2 #define _pcre_utf8_table3 utf8_table3 #define _pcre_utf8_table4 utf8_table4 #define _pcre_utt utt #define _pcre_utt_size utt_size #define _pcre_OP_lengths OP_lengths #include "pcre_tables.c" /* We also need the pcre_printint() function for printing out compiled patterns. This function is in a separate file so that it can be included in pcre_compile.c when that module is compiled with debugging enabled. The definition of the macro PRINTABLE, which determines whether to print an output character as-is or as a hex value when showing compiled patterns, is contained in this file. We uses it here also, in cases when the locale has not been explicitly changed, so as to get consistent output from systems that differ in their output from isprint() even in the "C" locale. */ #include "pcre_printint.src" #define PRINTHEX(c) (locale_set? isprint(c) : PRINTABLE(c)) /* It is possible to compile this test program without including support for testing the POSIX interface, though this is not available via the standard Makefile. */ #if !defined NOPOSIX #include "pcreposix.h" #endif /* It is also possible, for the benefit of the version currently imported into Exim, to build pcretest without support for UTF8 (define NOUTF8), without the interface to the DFA matcher (NODFA), and without the doublecheck of the old "info" function (define NOINFOCHECK). In fact, we automatically cut out the UTF8 support if PCRE is built without it. */ #ifndef SUPPORT_UTF8 #ifndef NOUTF8 #define NOUTF8 #endif #endif /* Other parameters */ #ifndef CLOCKS_PER_SEC #ifdef CLK_TCK #define CLOCKS_PER_SEC CLK_TCK #else #define CLOCKS_PER_SEC 100 #endif #endif /* This is the default loop count for timing. */ #define LOOPREPEAT 500000 /* Static variables */ static FILE *outfile; static int log_store = 0; static int callout_count; static int callout_extra; static int callout_fail_count; static int callout_fail_id; static int debug_lengths; static int first_callout; static int locale_set = 0; static int show_malloc; static int use_utf8; static size_t gotten_store; /* The buffers grow automatically if very long input lines are encountered. */ static int buffer_size = 50000; static uschar *buffer = NULL; static uschar *dbuffer = NULL; static uschar *pbuffer = NULL; /************************************************* * Read or extend an input line * *************************************************/ /* Input lines are read into buffer, but both patterns and data lines can be continued over multiple input lines. In addition, if the buffer fills up, we want to automatically expand it so as to be able to handle extremely large lines that are needed for certain stress tests. When the input buffer is expanded, the other two buffers must also be expanded likewise, and the contents of pbuffer, which are a copy of the input for callouts, must be preserved (for when expansion happens for a data line). This is not the most optimal way of handling this, but hey, this is just a test program! Arguments: f the file to read start where in buffer to start (this *must* be within buffer) Returns: pointer to the start of new data could be a copy of start, or could be moved NULL if no data read and EOF reached */ static uschar * extend_inputline(FILE *f, uschar *start) { uschar *here = start; for (;;) { int rlen = buffer_size - (here - buffer); if (rlen > 1000) { int dlen; if (fgets((char *)here, rlen, f) == NULL) return (here == start)? NULL : start; dlen = (int)strlen((char *)here); if (dlen > 0 && here[dlen - 1] == '\n') return start; here += dlen; } else { int new_buffer_size = 2*buffer_size; uschar *new_buffer = (unsigned char *)malloc(new_buffer_size); uschar *new_dbuffer = (unsigned char *)malloc(new_buffer_size); uschar *new_pbuffer = (unsigned char *)malloc(new_buffer_size); if (new_buffer == NULL || new_dbuffer == NULL || new_pbuffer == NULL) { fprintf(stderr, "pcretest: malloc(%d) failed\n", new_buffer_size); exit(1); } memcpy(new_buffer, buffer, buffer_size); memcpy(new_pbuffer, pbuffer, buffer_size); buffer_size = new_buffer_size; start = new_buffer + (start - buffer); here = new_buffer + (here - buffer); free(buffer); free(dbuffer); free(pbuffer); buffer = new_buffer; dbuffer = new_dbuffer; pbuffer = new_pbuffer; } } return NULL; /* Control never gets here */ } /************************************************* * Read number from string * *************************************************/ /* We don't use strtoul() because SunOS4 doesn't have it. Rather than mess around with conditional compilation, just do the job by hand. It is only used for unpicking arguments, so just keep it simple. Arguments: str string to be converted endptr where to put the end pointer Returns: the unsigned long */ static int get_value(unsigned char *str, unsigned char **endptr) { int result = 0; while(*str != 0 && isspace(*str)) str++; while (isdigit(*str)) result = result * 10 + (int)(*str++ - '0'); *endptr = str; return(result); } /************************************************* * Convert UTF-8 string to value * *************************************************/ /* This function takes one or more bytes that represents a UTF-8 character, and returns the value of the character. Argument: utf8bytes a pointer to the byte vector vptr a pointer to an int to receive the value Returns: > 0 => the number of bytes consumed -6 to 0 => malformed UTF-8 character at offset = (-return) */ #if !defined NOUTF8 static int utf82ord(unsigned char *utf8bytes, int *vptr) { int c = *utf8bytes++; int d = c; int i, j, s; for (i = -1; i < 6; i++) /* i is number of additional bytes */ { if ((d & 0x80) == 0) break; d <<= 1; } if (i == -1) { *vptr = c; return 1; } /* ascii character */ if (i == 0 || i == 6) return 0; /* invalid UTF-8 */ /* i now has a value in the range 1-5 */ s = 6*i; d = (c & utf8_table3[i]) << s; for (j = 0; j < i; j++) { c = *utf8bytes++; if ((c & 0xc0) != 0x80) return -(j+1); s -= 6; d |= (c & 0x3f) << s; } /* Check that encoding was the correct unique one */ for (j = 0; j < utf8_table1_size; j++) if (d <= utf8_table1[j]) break; if (j != i) return -(i+1); /* Valid value */ *vptr = d; return i+1; } #endif /************************************************* * Convert character value to UTF-8 * *************************************************/ /* This function takes an integer value in the range 0 - 0x7fffffff and encodes it as a UTF-8 character in 0 to 6 bytes. Arguments: cvalue the character value utf8bytes pointer to buffer for result - at least 6 bytes long Returns: number of characters placed in the buffer */ #if !defined NOUTF8 static int ord2utf8(int cvalue, uschar *utf8bytes) { register int i, j; for (i = 0; i < utf8_table1_size; i++) if (cvalue <= utf8_table1[i]) break; utf8bytes += i; for (j = i; j > 0; j--) { *utf8bytes-- = 0x80 | (cvalue & 0x3f); cvalue >>= 6; } *utf8bytes = utf8_table2[i] | cvalue; return i + 1; } #endif /************************************************* * Print character string * *************************************************/ /* Character string printing function. Must handle UTF-8 strings in utf8 mode. Yields number of characters printed. If handed a NULL file, just counts chars without printing. */ static int pchars(unsigned char *p, int length, FILE *f) { int c = 0; int yield = 0; while (length-- > 0) { #if !defined NOUTF8 if (use_utf8) { int rc = utf82ord(p, &c); if (rc > 0 && rc <= length + 1) /* Mustn't run over the end */ { length -= rc - 1; p += rc; if (PRINTHEX(c)) { if (f != NULL) fprintf(f, "%c", c); yield++; } else { int n = 4; if (f != NULL) fprintf(f, "\\x{%02x}", c); yield += (n <= 0x000000ff)? 2 : (n <= 0x00000fff)? 3 : (n <= 0x0000ffff)? 4 : (n <= 0x000fffff)? 5 : 6; } continue; } } #endif /* Not UTF-8, or malformed UTF-8 */ c = *p++; if (PRINTHEX(c)) { if (f != NULL) fprintf(f, "%c", c); yield++; } else { if (f != NULL) fprintf(f, "\\x%02x", c); yield += 4; } } return yield; } /************************************************* * Callout function * *************************************************/ /* Called from PCRE as a result of the (?C) item. We print out where we are in the match. Yield zero unless more callouts than the fail count, or the callout data is not zero. */ static int callout(pcre_callout_block *cb) { FILE *f = (first_callout | callout_extra)? outfile : NULL; int i, pre_start, post_start, subject_length; if (callout_extra) { fprintf(f, "Callout %d: last capture = %d\n", cb->callout_number, cb->capture_last); for (i = 0; i < cb->capture_top * 2; i += 2) { if (cb->offset_vector[i] < 0) fprintf(f, "%2d: \n", i/2); else { fprintf(f, "%2d: ", i/2); (void)pchars((unsigned char *)cb->subject + cb->offset_vector[i], cb->offset_vector[i+1] - cb->offset_vector[i], f); fprintf(f, "\n"); } } } /* Re-print the subject in canonical form, the first time or if giving full datails. On subsequent calls in the same match, we use pchars just to find the printed lengths of the substrings. */ if (f != NULL) fprintf(f, "--->"); pre_start = pchars((unsigned char *)cb->subject, cb->start_match, f); post_start = pchars((unsigned char *)(cb->subject + cb->start_match), cb->current_position - cb->start_match, f); subject_length = pchars((unsigned char *)cb->subject, cb->subject_length, NULL); (void)pchars((unsigned char *)(cb->subject + cb->current_position), cb->subject_length - cb->current_position, f); if (f != NULL) fprintf(f, "\n"); /* Always print appropriate indicators, with callout number if not already shown. For automatic callouts, show the pattern offset. */ if (cb->callout_number == 255) { fprintf(outfile, "%+3d ", cb->pattern_position); if (cb->pattern_position > 99) fprintf(outfile, "\n "); } else { if (callout_extra) fprintf(outfile, " "); else fprintf(outfile, "%3d ", cb->callout_number); } for (i = 0; i < pre_start; i++) fprintf(outfile, " "); fprintf(outfile, "^"); if (post_start > 0) { for (i = 0; i < post_start - 1; i++) fprintf(outfile, " "); fprintf(outfile, "^"); } for (i = 0; i < subject_length - pre_start - post_start + 4; i++) fprintf(outfile, " "); fprintf(outfile, "%.*s", (cb->next_item_length == 0)? 1 : cb->next_item_length, pbuffer + cb->pattern_position); fprintf(outfile, "\n"); first_callout = 0; if (cb->callout_data != NULL) { int callout_data = *((int *)(cb->callout_data)); if (callout_data != 0) { fprintf(outfile, "Callout data = %d\n", callout_data); return callout_data; } } return (cb->callout_number != callout_fail_id)? 0 : (++callout_count >= callout_fail_count)? 1 : 0; } /************************************************* * Local malloc functions * *************************************************/ /* Alternative malloc function, to test functionality and show the size of the compiled re. */ static void *new_malloc(size_t size) { void *block = malloc(size); gotten_store = size; if (show_malloc) fprintf(outfile, "malloc %3d %p\n", (int)size, block); return block; } static void new_free(void *block) { if (show_malloc) fprintf(outfile, "free %p\n", block); free(block); } /* For recursion malloc/free, to test stacking calls */ static void *stack_malloc(size_t size) { void *block = malloc(size); if (show_malloc) fprintf(outfile, "stack_malloc %3d %p\n", (int)size, block); return block; } static void stack_free(void *block) { if (show_malloc) fprintf(outfile, "stack_free %p\n", block); free(block); } /************************************************* * Call pcre_fullinfo() * *************************************************/ /* Get one piece of information from the pcre_fullinfo() function */ static void new_info(pcre *re, pcre_extra *study, int option, void *ptr) { int rc; if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0) fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option); } /************************************************* * Byte flipping function * *************************************************/ static unsigned long int byteflip(unsigned long int value, int n) { if (n == 2) return ((value & 0x00ff) << 8) | ((value & 0xff00) >> 8); return ((value & 0x000000ff) << 24) | ((value & 0x0000ff00) << 8) | ((value & 0x00ff0000) >> 8) | ((value & 0xff000000) >> 24); } /************************************************* * Check match or recursion limit * *************************************************/ static int check_match_limit(pcre *re, pcre_extra *extra, uschar *bptr, int len, int start_offset, int options, int *use_offsets, int use_size_offsets, int flag, unsigned long int *limit, int errnumber, const char *msg) { int count; int min = 0; int mid = 64; int max = -1; extra->flags |= flag; for (;;) { *limit = mid; count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options, use_offsets, use_size_offsets); if (count == errnumber) { /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */ min = mid; mid = (mid == max - 1)? max : (max > 0)? (min + max)/2 : mid*2; } else if (count >= 0 || count == PCRE_ERROR_NOMATCH || count == PCRE_ERROR_PARTIAL) { if (mid == min + 1) { fprintf(outfile, "Minimum %s limit = %d\n", msg, mid); break; } /* fprintf(outfile, "Testing %s limit = %d\n", msg, mid); */ max = mid; mid = (min + mid)/2; } else break; /* Some other error */ } extra->flags &= ~flag; return count; } /************************************************* * Case-independent strncmp() function * *************************************************/ /* Arguments: s first string t second string n number of characters to compare Returns: < 0, = 0, or > 0, according to the comparison */ static int strncmpic(uschar *s, uschar *t, int n) { while (n--) { int c = tolower(*s++) - tolower(*t++); if (c) return c; } return 0; } /************************************************* * Check newline indicator * *************************************************/ /* This is used both at compile and run-time to check for escapes, where xxx is LF, CR, CRLF, ANYCRLF, or ANY. Print a message and return 0 if there is no match. Arguments: p points after the leading '<' f file for error message Returns: appropriate PCRE_NEWLINE_xxx flags, or 0 */ static int check_newline(uschar *p, FILE *f) { if (strncmpic(p, (uschar *)"cr>", 3) == 0) return PCRE_NEWLINE_CR; if (strncmpic(p, (uschar *)"lf>", 3) == 0) return PCRE_NEWLINE_LF; if (strncmpic(p, (uschar *)"crlf>", 5) == 0) return PCRE_NEWLINE_CRLF; if (strncmpic(p, (uschar *)"anycrlf>", 8) == 0) return PCRE_NEWLINE_ANYCRLF; if (strncmpic(p, (uschar *)"any>", 4) == 0) return PCRE_NEWLINE_ANY; fprintf(f, "Unknown newline type at: <%s\n", p); return 0; } /************************************************* * Usage function * *************************************************/ static void usage(void) { printf("Usage: pcretest [options] [ []]\n"); printf(" -b show compiled code (bytecode)\n"); printf(" -C show PCRE compile-time options and exit\n"); printf(" -d debug: show compiled code and information (-b and -i)\n"); #if !defined NODFA printf(" -dfa force DFA matching for all subjects\n"); #endif printf(" -help show usage information\n"); printf(" -i show information about compiled patterns\n" " -m output memory used information\n" " -o set size of offsets vector to \n"); #if !defined NOPOSIX printf(" -p use POSIX interface\n"); #endif printf(" -q quiet: do not output PCRE version number at start\n"); printf(" -S set stack size to megabytes\n"); printf(" -s output store (memory) used information\n" " -t time compilation and execution\n"); printf(" -t time compilation and execution, repeating times\n"); printf(" -tm time execution (matching) only\n"); printf(" -tm time execution (matching) only, repeating times\n"); } /************************************************* * Main Program * *************************************************/ /* Read lines from named file or stdin and write to named file or stdout; lines consist of a regular expression, in delimiters and optionally followed by options, followed by a set of test data, terminated by an empty line. */ int main(int argc, char **argv) { FILE *infile = stdin; int options = 0; int study_options = 0; int op = 1; int timeit = 0; int timeitm = 0; int showinfo = 0; int showstore = 0; int quiet = 0; int size_offsets = 45; int size_offsets_max; int *offsets = NULL; #if !defined NOPOSIX int posix = 0; #endif int debug = 0; int done = 0; int all_use_dfa = 0; int yield = 0; int stack_size; /* These vectors store, end-to-end, a list of captured substring names. Assume that 1024 is plenty long enough for the few names we'll be testing. */ uschar copynames[1024]; uschar getnames[1024]; uschar *copynamesptr; uschar *getnamesptr; /* Get buffers from malloc() so that Electric Fence will check their misuse when I am debugging. They grow automatically when very long lines are read. */ buffer = (unsigned char *)malloc(buffer_size); dbuffer = (unsigned char *)malloc(buffer_size); pbuffer = (unsigned char *)malloc(buffer_size); /* The outfile variable is static so that new_malloc can use it. */ outfile = stdout; /* The following _setmode() stuff is some Windows magic that tells its runtime library to translate CRLF into a single LF character. At least, that's what I've been told: never having used Windows I take this all on trust. Originally it set 0x8000, but then I was advised that _O_BINARY was better. */ #if defined(_WIN32) || defined(WIN32) _setmode( _fileno( stdout ), _O_BINARY ); #endif /* Scan options */ while (argc > 1 && argv[op][0] == '-') { unsigned char *endptr; if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0) showstore = 1; else if (strcmp(argv[op], "-q") == 0) quiet = 1; else if (strcmp(argv[op], "-b") == 0) debug = 1; else if (strcmp(argv[op], "-i") == 0) showinfo = 1; else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1; #if !defined NODFA else if (strcmp(argv[op], "-dfa") == 0) all_use_dfa = 1; #endif else if (strcmp(argv[op], "-o") == 0 && argc > 2 && ((size_offsets = get_value((unsigned char *)argv[op+1], &endptr)), *endptr == 0)) { op++; argc--; } else if (strcmp(argv[op], "-t") == 0 || strcmp(argv[op], "-tm") == 0) { int both = argv[op][2] == 0; int temp; if (argc > 2 && (temp = get_value((unsigned char *)argv[op+1], &endptr), *endptr == 0)) { timeitm = temp; op++; argc--; } else timeitm = LOOPREPEAT; if (both) timeit = timeitm; } else if (strcmp(argv[op], "-S") == 0 && argc > 2 && ((stack_size = get_value((unsigned char *)argv[op+1], &endptr)), *endptr == 0)) { #if defined(_WIN32) || defined(WIN32) printf("PCRE: -S not supported on this OS\n"); exit(1); #else int rc; struct rlimit rlim; getrlimit(RLIMIT_STACK, &rlim); rlim.rlim_cur = stack_size * 1024 * 1024; rc = setrlimit(RLIMIT_STACK, &rlim); if (rc != 0) { printf("PCRE: setrlimit() failed with error %d\n", rc); exit(1); } op++; argc--; #endif } #if !defined NOPOSIX else if (strcmp(argv[op], "-p") == 0) posix = 1; #endif else if (strcmp(argv[op], "-C") == 0) { int rc; printf("PCRE version %s\n", pcre_version()); printf("Compiled with\n"); (void)pcre_config(PCRE_CONFIG_UTF8, &rc); printf(" %sUTF-8 support\n", rc? "" : "No "); (void)pcre_config(PCRE_CONFIG_UNICODE_PROPERTIES, &rc); printf(" %sUnicode properties support\n", rc? "" : "No "); (void)pcre_config(PCRE_CONFIG_NEWLINE, &rc); printf(" Newline sequence is %s\n", (rc == '\r')? "CR" : (rc == '\n')? "LF" : (rc == ('\r'<<8 | '\n'))? "CRLF" : (rc == -2)? "ANYCRLF" : (rc == -1)? "ANY" : "???"); (void)pcre_config(PCRE_CONFIG_LINK_SIZE, &rc); printf(" Internal link size = %d\n", rc); (void)pcre_config(PCRE_CONFIG_POSIX_MALLOC_THRESHOLD, &rc); printf(" POSIX malloc threshold = %d\n", rc); (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT, &rc); printf(" Default match limit = %d\n", rc); (void)pcre_config(PCRE_CONFIG_MATCH_LIMIT_RECURSION, &rc); printf(" Default recursion depth limit = %d\n", rc); (void)pcre_config(PCRE_CONFIG_STACKRECURSE, &rc); printf(" Match recursion uses %s\n", rc? "stack" : "heap"); goto EXIT; } else if (strcmp(argv[op], "-help") == 0 || strcmp(argv[op], "--help") == 0) { usage(); goto EXIT; } else { printf("** Unknown or malformed option %s\n", argv[op]); usage(); yield = 1; goto EXIT; } op++; argc--; } /* Get the store for the offsets vector, and remember what it was */ size_offsets_max = size_offsets; offsets = (int *)malloc(size_offsets_max * sizeof(int)); if (offsets == NULL) { printf("** Failed to get %d bytes of memory for offsets vector\n", (int)(size_offsets_max * sizeof(int))); yield = 1; goto EXIT; } /* Sort out the input and output files */ if (argc > 1) { infile = fopen(argv[op], INPUT_MODE); if (infile == NULL) { printf("** Failed to open %s\n", argv[op]); yield = 1; goto EXIT; } } if (argc > 2) { outfile = fopen(argv[op+1], OUTPUT_MODE); if (outfile == NULL) { printf("** Failed to open %s\n", argv[op+1]); yield = 1; goto EXIT; } } /* Set alternative malloc function */ pcre_malloc = new_malloc; pcre_free = new_free; pcre_stack_malloc = stack_malloc; pcre_stack_free = stack_free; /* Heading line unless quiet, then prompt for first regex if stdin */ if (!quiet) fprintf(outfile, "PCRE version %s\n\n", pcre_version()); /* Main loop */ while (!done) { pcre *re = NULL; pcre_extra *extra = NULL; #if !defined NOPOSIX /* There are still compilers that require no indent */ regex_t preg; int do_posix = 0; #endif const char *error; unsigned char *p, *pp, *ppp; unsigned char *to_file = NULL; const unsigned char *tables = NULL; unsigned long int true_size, true_study_size = 0; size_t size, regex_gotten_store; int do_study = 0; int do_debug = debug; int do_G = 0; int do_g = 0; int do_showinfo = showinfo; int do_showrest = 0; int do_flip = 0; int erroroffset, len, delimiter, poffset; use_utf8 = 0; debug_lengths = 1; if (infile == stdin) printf(" re> "); if (extend_inputline(infile, buffer) == NULL) break; if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); fflush(outfile); p = buffer; while (isspace(*p)) p++; if (*p == 0) continue; /* See if the pattern is to be loaded pre-compiled from a file. */ if (*p == '<' && strchr((char *)(p+1), '<') == NULL) { unsigned long int magic, get_options; uschar sbuf[8]; FILE *f; p++; pp = p + (int)strlen((char *)p); while (isspace(pp[-1])) pp--; *pp = 0; f = fopen((char *)p, "rb"); if (f == NULL) { fprintf(outfile, "Failed to open %s: %s\n", p, strerror(errno)); continue; } if (fread(sbuf, 1, 8, f) != 8) goto FAIL_READ; true_size = (sbuf[0] << 24) | (sbuf[1] << 16) | (sbuf[2] << 8) | sbuf[3]; true_study_size = (sbuf[4] << 24) | (sbuf[5] << 16) | (sbuf[6] << 8) | sbuf[7]; re = (real_pcre *)new_malloc(true_size); regex_gotten_store = gotten_store; if (fread(re, 1, true_size, f) != true_size) goto FAIL_READ; magic = ((real_pcre *)re)->magic_number; if (magic != MAGIC_NUMBER) { if (byteflip(magic, sizeof(magic)) == MAGIC_NUMBER) { do_flip = 1; } else { fprintf(outfile, "Data in %s is not a compiled PCRE regex\n", p); fclose(f); continue; } } fprintf(outfile, "Compiled regex%s loaded from %s\n", do_flip? " (byte-inverted)" : "", p); /* Need to know if UTF-8 for printing data strings */ new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options); use_utf8 = (get_options & PCRE_UTF8) != 0; /* Now see if there is any following study data */ if (true_study_size != 0) { pcre_study_data *psd; extra = (pcre_extra *)new_malloc(sizeof(pcre_extra) + true_study_size); extra->flags = PCRE_EXTRA_STUDY_DATA; psd = (pcre_study_data *)(((char *)extra) + sizeof(pcre_extra)); extra->study_data = psd; if (fread(psd, 1, true_study_size, f) != true_study_size) { FAIL_READ: fprintf(outfile, "Failed to read data from %s\n", p); if (extra != NULL) new_free(extra); if (re != NULL) new_free(re); fclose(f); continue; } fprintf(outfile, "Study data loaded from %s\n", p); do_study = 1; /* To get the data output if requested */ } else fprintf(outfile, "No study data\n"); fclose(f); goto SHOW_INFO; } /* In-line pattern (the usual case). Get the delimiter and seek the end of the pattern; if is isn't complete, read more. */ delimiter = *p++; if (isalnum(delimiter) || delimiter == '\\') { fprintf(outfile, "** Delimiter must not be alphameric or \\\n"); goto SKIP_DATA; } pp = p; poffset = p - buffer; for(;;) { while (*pp != 0) { if (*pp == '\\' && pp[1] != 0) pp++; else if (*pp == delimiter) break; pp++; } if (*pp != 0) break; if (infile == stdin) printf(" > "); if ((pp = extend_inputline(infile, pp)) == NULL) { fprintf(outfile, "** Unexpected EOF\n"); done = 1; goto CONTINUE; } if (infile != stdin) fprintf(outfile, "%s", (char *)pp); } /* The buffer may have moved while being extended; reset the start of data pointer to the correct relative point in the buffer. */ p = buffer + poffset; /* If the first character after the delimiter is backslash, make the pattern end with backslash. This is purely to provide a way of testing for the error message when a pattern ends with backslash. */ if (pp[1] == '\\') *pp++ = '\\'; /* Terminate the pattern at the delimiter, and save a copy of the pattern for callouts. */ *pp++ = 0; strcpy((char *)pbuffer, (char *)p); /* Look for options after final delimiter */ options = 0; study_options = 0; log_store = showstore; /* default from command line */ while (*pp != 0) { switch (*pp++) { case 'f': options |= PCRE_FIRSTLINE; break; case 'g': do_g = 1; break; case 'i': options |= PCRE_CASELESS; break; case 'm': options |= PCRE_MULTILINE; break; case 's': options |= PCRE_DOTALL; break; case 'x': options |= PCRE_EXTENDED; break; case '+': do_showrest = 1; break; case 'A': options |= PCRE_ANCHORED; break; case 'B': do_debug = 1; break; case 'C': options |= PCRE_AUTO_CALLOUT; break; case 'D': do_debug = do_showinfo = 1; break; case 'E': options |= PCRE_DOLLAR_ENDONLY; break; case 'F': do_flip = 1; break; case 'G': do_G = 1; break; case 'I': do_showinfo = 1; break; case 'J': options |= PCRE_DUPNAMES; break; case 'M': log_store = 1; break; case 'N': options |= PCRE_NO_AUTO_CAPTURE; break; #if !defined NOPOSIX case 'P': do_posix = 1; break; #endif case 'S': do_study = 1; break; case 'U': options |= PCRE_UNGREEDY; break; case 'X': options |= PCRE_EXTRA; break; case 'Z': debug_lengths = 0; break; case '8': options |= PCRE_UTF8; use_utf8 = 1; break; case '?': options |= PCRE_NO_UTF8_CHECK; break; case 'L': ppp = pp; /* The '\r' test here is so that it works on Windows. */ /* The '0' test is just in case this is an unterminated line. */ while (*ppp != 0 && *ppp != '\n' && *ppp != '\r' && *ppp != ' ') ppp++; *ppp = 0; if (setlocale(LC_CTYPE, (const char *)pp) == NULL) { fprintf(outfile, "** Failed to set locale \"%s\"\n", pp); goto SKIP_DATA; } locale_set = 1; tables = pcre_maketables(); pp = ppp; break; case '>': to_file = pp; while (*pp != 0) pp++; while (isspace(pp[-1])) pp--; *pp = 0; break; case '<': { int x = check_newline(pp, outfile); if (x == 0) goto SKIP_DATA; options |= x; while (*pp++ != '>'); } break; case '\r': /* So that it works in Windows */ case '\n': case ' ': break; default: fprintf(outfile, "** Unknown option '%c'\n", pp[-1]); goto SKIP_DATA; } } /* Handle compiling via the POSIX interface, which doesn't support the timing, showing, or debugging options, nor the ability to pass over local character tables. */ #if !defined NOPOSIX if (posix || do_posix) { int rc; int cflags = 0; if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; if ((options & PCRE_DOTALL) != 0) cflags |= REG_DOTALL; if ((options & PCRE_NO_AUTO_CAPTURE) != 0) cflags |= REG_NOSUB; if ((options & PCRE_UTF8) != 0) cflags |= REG_UTF8; rc = regcomp(&preg, (char *)p, cflags); /* Compilation failed; go back for another re, skipping to blank line if non-interactive. */ if (rc != 0) { (void)regerror(rc, &preg, (char *)buffer, buffer_size); fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer); goto SKIP_DATA; } } /* Handle compiling via the native interface */ else #endif /* !defined NOPOSIX */ { if (timeit > 0) { register int i; clock_t time_taken; clock_t start_time = clock(); for (i = 0; i < timeit; i++) { re = pcre_compile((char *)p, options, &error, &erroroffset, tables); if (re != NULL) free(re); } time_taken = clock() - start_time; fprintf(outfile, "Compile time %.4f milliseconds\n", (((double)time_taken * 1000.0) / (double)timeit) / (double)CLOCKS_PER_SEC); } re = pcre_compile((char *)p, options, &error, &erroroffset, tables); /* Compilation failed; go back for another re, skipping to blank line if non-interactive. */ if (re == NULL) { fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset); SKIP_DATA: if (infile != stdin) { for (;;) { if (extend_inputline(infile, buffer) == NULL) { done = 1; goto CONTINUE; } len = (int)strlen((char *)buffer); while (len > 0 && isspace(buffer[len-1])) len--; if (len == 0) break; } fprintf(outfile, "\n"); } goto CONTINUE; } /* Compilation succeeded; print data if required. There are now two info-returning functions. The old one has a limited interface and returns only limited data. Check that it agrees with the newer one. */ if (log_store) fprintf(outfile, "Memory allocation (code space): %d\n", (int)(gotten_store - sizeof(real_pcre) - ((real_pcre *)re)->name_count * ((real_pcre *)re)->name_entry_size)); /* Extract the size for possible writing before possibly flipping it, and remember the store that was got. */ true_size = ((real_pcre *)re)->size; regex_gotten_store = gotten_store; /* If /S was present, study the regexp to generate additional info to help with the matching. */ if (do_study) { if (timeit > 0) { register int i; clock_t time_taken; clock_t start_time = clock(); for (i = 0; i < timeit; i++) extra = pcre_study(re, study_options, &error); time_taken = clock() - start_time; if (extra != NULL) free(extra); fprintf(outfile, " Study time %.4f milliseconds\n", (((double)time_taken * 1000.0) / (double)timeit) / (double)CLOCKS_PER_SEC); } extra = pcre_study(re, study_options, &error); if (error != NULL) fprintf(outfile, "Failed to study: %s\n", error); else if (extra != NULL) true_study_size = ((pcre_study_data *)(extra->study_data))->size; } /* If the 'F' option was present, we flip the bytes of all the integer fields in the regex data block and the study block. This is to make it possible to test PCRE's handling of byte-flipped patterns, e.g. those compiled on a different architecture. */ if (do_flip) { real_pcre *rre = (real_pcre *)re; rre->magic_number = byteflip(rre->magic_number, sizeof(rre->magic_number)); rre->size = byteflip(rre->size, sizeof(rre->size)); rre->options = byteflip(rre->options, sizeof(rre->options)); rre->top_bracket = byteflip(rre->top_bracket, sizeof(rre->top_bracket)); rre->top_backref = byteflip(rre->top_backref, sizeof(rre->top_backref)); rre->first_byte = byteflip(rre->first_byte, sizeof(rre->first_byte)); rre->req_byte = byteflip(rre->req_byte, sizeof(rre->req_byte)); rre->name_table_offset = byteflip(rre->name_table_offset, sizeof(rre->name_table_offset)); rre->name_entry_size = byteflip(rre->name_entry_size, sizeof(rre->name_entry_size)); rre->name_count = byteflip(rre->name_count, sizeof(rre->name_count)); if (extra != NULL) { pcre_study_data *rsd = (pcre_study_data *)(extra->study_data); rsd->size = byteflip(rsd->size, sizeof(rsd->size)); rsd->options = byteflip(rsd->options, sizeof(rsd->options)); } } /* Extract information from the compiled data if required */ SHOW_INFO: if (do_debug) { fprintf(outfile, "------------------------------------------------------------------\n"); pcre_printint(re, outfile, debug_lengths); } if (do_showinfo) { unsigned long int get_options, all_options; #if !defined NOINFOCHECK int old_first_char, old_options, old_count; #endif int count, backrefmax, first_char, need_char, okpartial, jchanged, hascrorlf; int nameentrysize, namecount; const uschar *nametable; new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options); new_info(re, NULL, PCRE_INFO_SIZE, &size); new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count); new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax); new_info(re, NULL, PCRE_INFO_FIRSTBYTE, &first_char); new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char); new_info(re, NULL, PCRE_INFO_NAMEENTRYSIZE, &nameentrysize); new_info(re, NULL, PCRE_INFO_NAMECOUNT, &namecount); new_info(re, NULL, PCRE_INFO_NAMETABLE, (void *)&nametable); new_info(re, NULL, PCRE_INFO_OKPARTIAL, &okpartial); new_info(re, NULL, PCRE_INFO_JCHANGED, &jchanged); new_info(re, NULL, PCRE_INFO_HASCRORLF, &hascrorlf); #if !defined NOINFOCHECK old_count = pcre_info(re, &old_options, &old_first_char); if (count < 0) fprintf(outfile, "Error %d from pcre_info()\n", count); else { if (old_count != count) fprintf(outfile, "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count, old_count); if (old_first_char != first_char) fprintf(outfile, "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n", first_char, old_first_char); if (old_options != (int)get_options) fprintf(outfile, "Options disagreement: pcre_fullinfo=%ld pcre_info=%d\n", get_options, old_options); } #endif if (size != regex_gotten_store) fprintf(outfile, "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n", (int)size, (int)regex_gotten_store); fprintf(outfile, "Capturing subpattern count = %d\n", count); if (backrefmax > 0) fprintf(outfile, "Max back reference = %d\n", backrefmax); if (namecount > 0) { fprintf(outfile, "Named capturing subpatterns:\n"); while (namecount-- > 0) { fprintf(outfile, " %s %*s%3d\n", nametable + 2, nameentrysize - 3 - (int)strlen((char *)nametable + 2), "", GET2(nametable, 0)); nametable += nameentrysize; } } if (!okpartial) fprintf(outfile, "Partial matching not supported\n"); if (hascrorlf) fprintf(outfile, "Contains explicit CR or LF match\n"); all_options = ((real_pcre *)re)->options; if (do_flip) all_options = byteflip(all_options, sizeof(all_options)); if (get_options == 0) fprintf(outfile, "No options\n"); else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s%s%s%s%s\n", ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "", ((get_options & PCRE_CASELESS) != 0)? " caseless" : "", ((get_options & PCRE_EXTENDED) != 0)? " extended" : "", ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "", ((get_options & PCRE_FIRSTLINE) != 0)? " firstline" : "", ((get_options & PCRE_DOTALL) != 0)? " dotall" : "", ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "", ((get_options & PCRE_EXTRA) != 0)? " extra" : "", ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "", ((get_options & PCRE_NO_AUTO_CAPTURE) != 0)? " no_auto_capture" : "", ((get_options & PCRE_UTF8) != 0)? " utf8" : "", ((get_options & PCRE_NO_UTF8_CHECK) != 0)? " no_utf8_check" : "", ((get_options & PCRE_DUPNAMES) != 0)? " dupnames" : ""); if (jchanged) fprintf(outfile, "Duplicate name status changes\n"); switch (get_options & PCRE_NEWLINE_BITS) { case PCRE_NEWLINE_CR: fprintf(outfile, "Forced newline sequence: CR\n"); break; case PCRE_NEWLINE_LF: fprintf(outfile, "Forced newline sequence: LF\n"); break; case PCRE_NEWLINE_CRLF: fprintf(outfile, "Forced newline sequence: CRLF\n"); break; case PCRE_NEWLINE_ANYCRLF: fprintf(outfile, "Forced newline sequence: ANYCRLF\n"); break; case PCRE_NEWLINE_ANY: fprintf(outfile, "Forced newline sequence: ANY\n"); break; default: break; } if (first_char == -1) { fprintf(outfile, "First char at start or follows newline\n"); } else if (first_char < 0) { fprintf(outfile, "No first char\n"); } else { int ch = first_char & 255; const char *caseless = ((first_char & REQ_CASELESS) == 0)? "" : " (caseless)"; if (PRINTHEX(ch)) fprintf(outfile, "First char = \'%c\'%s\n", ch, caseless); else fprintf(outfile, "First char = %d%s\n", ch, caseless); } if (need_char < 0) { fprintf(outfile, "No need char\n"); } else { int ch = need_char & 255; const char *caseless = ((need_char & REQ_CASELESS) == 0)? "" : " (caseless)"; if (PRINTHEX(ch)) fprintf(outfile, "Need char = \'%c\'%s\n", ch, caseless); else fprintf(outfile, "Need char = %d%s\n", ch, caseless); } /* Don't output study size; at present it is in any case a fixed value, but it varies, depending on the computer architecture, and so messes up the test suite. (And with the /F option, it might be flipped.) */ if (do_study) { if (extra == NULL) fprintf(outfile, "Study returned NULL\n"); else { uschar *start_bits = NULL; new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); if (start_bits == NULL) fprintf(outfile, "No starting byte set\n"); else { int i; int c = 24; fprintf(outfile, "Starting byte set: "); for (i = 0; i < 256; i++) { if ((start_bits[i/8] & (1<<(i&7))) != 0) { if (c > 75) { fprintf(outfile, "\n "); c = 2; } if (PRINTHEX(i) && i != ' ') { fprintf(outfile, "%c ", i); c += 2; } else { fprintf(outfile, "\\x%02x ", i); c += 5; } } } fprintf(outfile, "\n"); } } } } /* If the '>' option was present, we write out the regex to a file, and that is all. The first 8 bytes of the file are the regex length and then the study length, in big-endian order. */ if (to_file != NULL) { FILE *f = fopen((char *)to_file, "wb"); if (f == NULL) { fprintf(outfile, "Unable to open %s: %s\n", to_file, strerror(errno)); } else { uschar sbuf[8]; sbuf[0] = (true_size >> 24) & 255; sbuf[1] = (true_size >> 16) & 255; sbuf[2] = (true_size >> 8) & 255; sbuf[3] = (true_size) & 255; sbuf[4] = (true_study_size >> 24) & 255; sbuf[5] = (true_study_size >> 16) & 255; sbuf[6] = (true_study_size >> 8) & 255; sbuf[7] = (true_study_size) & 255; if (fwrite(sbuf, 1, 8, f) < 8 || fwrite(re, 1, true_size, f) < true_size) { fprintf(outfile, "Write error on %s: %s\n", to_file, strerror(errno)); } else { fprintf(outfile, "Compiled regex written to %s\n", to_file); if (extra != NULL) { if (fwrite(extra->study_data, 1, true_study_size, f) < true_study_size) { fprintf(outfile, "Write error on %s: %s\n", to_file, strerror(errno)); } else fprintf(outfile, "Study data written to %s\n", to_file); } } fclose(f); } new_free(re); if (extra != NULL) new_free(extra); if (tables != NULL) new_free((void *)tables); continue; /* With next regex */ } } /* End of non-POSIX compile */ /* Read data lines and test them */ for (;;) { uschar *q; uschar *bptr; int *use_offsets = offsets; int use_size_offsets = size_offsets; int callout_data = 0; int callout_data_set = 0; int count, c; int copystrings = 0; int find_match_limit = 0; int getstrings = 0; int getlist = 0; int gmatched = 0; int start_offset = 0; int g_notempty = 0; int use_dfa = 0; options = 0; *copynames = 0; *getnames = 0; copynamesptr = copynames; getnamesptr = getnames; pcre_callout = callout; first_callout = 1; callout_extra = 0; callout_count = 0; callout_fail_count = 999999; callout_fail_id = -1; show_malloc = 0; if (extra != NULL) extra->flags &= ~(PCRE_EXTRA_MATCH_LIMIT|PCRE_EXTRA_MATCH_LIMIT_RECURSION); len = 0; for (;;) { if (infile == stdin) printf("data> "); if (extend_inputline(infile, buffer + len) == NULL) { if (len > 0) break; done = 1; goto CONTINUE; } if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); len = (int)strlen((char *)buffer); if (buffer[len-1] == '\n') break; } while (len > 0 && isspace(buffer[len-1])) len--; buffer[len] = 0; if (len == 0) break; p = buffer; while (isspace(*p)) p++; bptr = q = dbuffer; while ((c = *p++) != 0) { int i = 0; int n = 0; if (c == '\\') switch ((c = *p++)) { case 'a': c = 7; break; case 'b': c = '\b'; break; case 'e': c = 27; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': c -= '0'; while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9') c = c * 8 + *p++ - '0'; #if !defined NOUTF8 if (use_utf8 && c > 255) { unsigned char buff8[8]; int ii, utn; utn = ord2utf8(c, buff8); for (ii = 0; ii < utn - 1; ii++) *q++ = buff8[ii]; c = buff8[ii]; /* Last byte */ } #endif break; case 'x': /* Handle \x{..} specially - new Perl thing for utf8 */ #if !defined NOUTF8 if (*p == '{') { unsigned char *pt = p; c = 0; while (isxdigit(*(++pt))) c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W'); if (*pt == '}') { unsigned char buff8[8]; int ii, utn; utn = ord2utf8(c, buff8); for (ii = 0; ii < utn - 1; ii++) *q++ = buff8[ii]; c = buff8[ii]; /* Last byte */ p = pt + 1; break; } /* Not correct form; fall through */ } #endif /* Ordinary \x */ c = 0; while (i++ < 2 && isxdigit(*p)) { c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W'); p++; } break; case 0: /* \ followed by EOF allows for an empty line */ p--; continue; case '>': while(isdigit(*p)) start_offset = start_offset * 10 + *p++ - '0'; continue; case 'A': /* Option setting */ options |= PCRE_ANCHORED; continue; case 'B': options |= PCRE_NOTBOL; continue; case 'C': if (isdigit(*p)) /* Set copy string */ { while(isdigit(*p)) n = n * 10 + *p++ - '0'; copystrings |= 1 << n; } else if (isalnum(*p)) { uschar *npp = copynamesptr; while (isalnum(*p)) *npp++ = *p++; *npp++ = 0; *npp = 0; n = pcre_get_stringnumber(re, (char *)copynamesptr); if (n < 0) fprintf(outfile, "no parentheses with name \"%s\"\n", copynamesptr); copynamesptr = npp; } else if (*p == '+') { callout_extra = 1; p++; } else if (*p == '-') { pcre_callout = NULL; p++; } else if (*p == '!') { callout_fail_id = 0; p++; while(isdigit(*p)) callout_fail_id = callout_fail_id * 10 + *p++ - '0'; callout_fail_count = 0; if (*p == '!') { p++; while(isdigit(*p)) callout_fail_count = callout_fail_count * 10 + *p++ - '0'; } } else if (*p == '*') { int sign = 1; callout_data = 0; if (*(++p) == '-') { sign = -1; p++; } while(isdigit(*p)) callout_data = callout_data * 10 + *p++ - '0'; callout_data *= sign; callout_data_set = 1; } continue; #if !defined NODFA case 'D': #if !defined NOPOSIX if (posix || do_posix) printf("** Can't use dfa matching in POSIX mode: \\D ignored\n"); else #endif use_dfa = 1; continue; case 'F': options |= PCRE_DFA_SHORTEST; continue; #endif case 'G': if (isdigit(*p)) { while(isdigit(*p)) n = n * 10 + *p++ - '0'; getstrings |= 1 << n; } else if (isalnum(*p)) { uschar *npp = getnamesptr; while (isalnum(*p)) *npp++ = *p++; *npp++ = 0; *npp = 0; n = pcre_get_stringnumber(re, (char *)getnamesptr); if (n < 0) fprintf(outfile, "no parentheses with name \"%s\"\n", getnamesptr); getnamesptr = npp; } continue; case 'L': getlist = 1; continue; case 'M': find_match_limit = 1; continue; case 'N': options |= PCRE_NOTEMPTY; continue; case 'O': while(isdigit(*p)) n = n * 10 + *p++ - '0'; if (n > size_offsets_max) { size_offsets_max = n; free(offsets); use_offsets = offsets = (int *)malloc(size_offsets_max * sizeof(int)); if (offsets == NULL) { printf("** Failed to get %d bytes of memory for offsets vector\n", (int)(size_offsets_max * sizeof(int))); yield = 1; goto EXIT; } } use_size_offsets = n; if (n == 0) use_offsets = NULL; /* Ensures it can't write to it */ continue; case 'P': options |= PCRE_PARTIAL; continue; case 'Q': while(isdigit(*p)) n = n * 10 + *p++ - '0'; if (extra == NULL) { extra = (pcre_extra *)malloc(sizeof(pcre_extra)); extra->flags = 0; } extra->flags |= PCRE_EXTRA_MATCH_LIMIT_RECURSION; extra->match_limit_recursion = n; continue; case 'q': while(isdigit(*p)) n = n * 10 + *p++ - '0'; if (extra == NULL) { extra = (pcre_extra *)malloc(sizeof(pcre_extra)); extra->flags = 0; } extra->flags |= PCRE_EXTRA_MATCH_LIMIT; extra->match_limit = n; continue; #if !defined NODFA case 'R': options |= PCRE_DFA_RESTART; continue; #endif case 'S': show_malloc = 1; continue; case 'Z': options |= PCRE_NOTEOL; continue; case '?': options |= PCRE_NO_UTF8_CHECK; continue; case '<': { int x = check_newline(p, outfile); if (x == 0) goto NEXT_DATA; options |= x; while (*p++ != '>'); } continue; } *q++ = c; } *q = 0; len = q - dbuffer; if ((all_use_dfa || use_dfa) && find_match_limit) { printf("**Match limit not relevant for DFA matching: ignored\n"); find_match_limit = 0; } /* Handle matching via the POSIX interface, which does not support timing or playing with the match limit or callout data. */ #if !defined NOPOSIX if (posix || do_posix) { int rc; int eflags = 0; regmatch_t *pmatch = NULL; if (use_size_offsets > 0) pmatch = (regmatch_t *)malloc(sizeof(regmatch_t) * use_size_offsets); if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags); if (rc != 0) { (void)regerror(rc, &preg, (char *)buffer, buffer_size); fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer); } else if ((((const pcre *)preg.re_pcre)->options & PCRE_NO_AUTO_CAPTURE) != 0) { fprintf(outfile, "Matched with REG_NOSUB\n"); } else { size_t i; for (i = 0; i < (size_t)use_size_offsets; i++) { if (pmatch[i].rm_so >= 0) { fprintf(outfile, "%2d: ", (int)i); (void)pchars(dbuffer + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so, outfile); fprintf(outfile, "\n"); if (i == 0 && do_showrest) { fprintf(outfile, " 0+ "); (void)pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, outfile); fprintf(outfile, "\n"); } } } } free(pmatch); } /* Handle matching via the native interface - repeats for /g and /G */ else #endif /* !defined NOPOSIX */ for (;; gmatched++) /* Loop for /g or /G */ { if (timeitm > 0) { register int i; clock_t time_taken; clock_t start_time = clock(); #if !defined NODFA if (all_use_dfa || use_dfa) { int workspace[1000]; for (i = 0; i < timeitm; i++) count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets, workspace, sizeof(workspace)/sizeof(int)); } else #endif for (i = 0; i < timeitm; i++) count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); time_taken = clock() - start_time; fprintf(outfile, "Execute time %.4f milliseconds\n", (((double)time_taken * 1000.0) / (double)timeitm) / (double)CLOCKS_PER_SEC); } /* If find_match_limit is set, we want to do repeated matches with varying limits in order to find the minimum value for the match limit and for the recursion limit. */ if (find_match_limit) { if (extra == NULL) { extra = (pcre_extra *)malloc(sizeof(pcre_extra)); extra->flags = 0; } (void)check_match_limit(re, extra, bptr, len, start_offset, options|g_notempty, use_offsets, use_size_offsets, PCRE_EXTRA_MATCH_LIMIT, &(extra->match_limit), PCRE_ERROR_MATCHLIMIT, "match()"); count = check_match_limit(re, extra, bptr, len, start_offset, options|g_notempty, use_offsets, use_size_offsets, PCRE_EXTRA_MATCH_LIMIT_RECURSION, &(extra->match_limit_recursion), PCRE_ERROR_RECURSIONLIMIT, "match() recursion"); } /* If callout_data is set, use the interface with additional data */ else if (callout_data_set) { if (extra == NULL) { extra = (pcre_extra *)malloc(sizeof(pcre_extra)); extra->flags = 0; } extra->flags |= PCRE_EXTRA_CALLOUT_DATA; extra->callout_data = &callout_data; count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); extra->flags &= ~PCRE_EXTRA_CALLOUT_DATA; } /* The normal case is just to do the match once, with the default value of match_limit. */ #if !defined NODFA else if (all_use_dfa || use_dfa) { int workspace[1000]; count = pcre_dfa_exec(re, NULL, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets, workspace, sizeof(workspace)/sizeof(int)); if (count == 0) { fprintf(outfile, "Matched, but too many subsidiary matches\n"); count = use_size_offsets/2; } } #endif else { count = pcre_exec(re, extra, (char *)bptr, len, start_offset, options | g_notempty, use_offsets, use_size_offsets); if (count == 0) { fprintf(outfile, "Matched, but too many substrings\n"); count = use_size_offsets/3; } } /* Matched */ if (count >= 0) { int i, maxcount; #if !defined NODFA if (all_use_dfa || use_dfa) maxcount = use_size_offsets/2; else #endif maxcount = use_size_offsets/3; /* This is a check against a lunatic return value. */ if (count > maxcount) { fprintf(outfile, "** PCRE error: returned count %d is too big for offset size %d\n", count, use_size_offsets); count = use_size_offsets/3; if (do_g || do_G) { fprintf(outfile, "** /%c loop abandoned\n", do_g? 'g' : 'G'); do_g = do_G = FALSE; /* Break g/G loop */ } } for (i = 0; i < count * 2; i += 2) { if (use_offsets[i] < 0) fprintf(outfile, "%2d: \n", i/2); else { fprintf(outfile, "%2d: ", i/2); (void)pchars(bptr + use_offsets[i], use_offsets[i+1] - use_offsets[i], outfile); fprintf(outfile, "\n"); if (i == 0) { if (do_showrest) { fprintf(outfile, " 0+ "); (void)pchars(bptr + use_offsets[i+1], len - use_offsets[i+1], outfile); fprintf(outfile, "\n"); } } } } for (i = 0; i < 32; i++) { if ((copystrings & (1 << i)) != 0) { char copybuffer[256]; int rc = pcre_copy_substring((char *)bptr, use_offsets, count, i, copybuffer, sizeof(copybuffer)); if (rc < 0) fprintf(outfile, "copy substring %d failed %d\n", i, rc); else fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc); } } for (copynamesptr = copynames; *copynamesptr != 0; copynamesptr += (int)strlen((char*)copynamesptr) + 1) { char copybuffer[256]; int rc = pcre_copy_named_substring(re, (char *)bptr, use_offsets, count, (char *)copynamesptr, copybuffer, sizeof(copybuffer)); if (rc < 0) fprintf(outfile, "copy substring %s failed %d\n", copynamesptr, rc); else fprintf(outfile, " C %s (%d) %s\n", copybuffer, rc, copynamesptr); } for (i = 0; i < 32; i++) { if ((getstrings & (1 << i)) != 0) { const char *substring; int rc = pcre_get_substring((char *)bptr, use_offsets, count, i, &substring); if (rc < 0) fprintf(outfile, "get substring %d failed %d\n", i, rc); else { fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc); pcre_free_substring(substring); } } } for (getnamesptr = getnames; *getnamesptr != 0; getnamesptr += (int)strlen((char*)getnamesptr) + 1) { const char *substring; int rc = pcre_get_named_substring(re, (char *)bptr, use_offsets, count, (char *)getnamesptr, &substring); if (rc < 0) fprintf(outfile, "copy substring %s failed %d\n", getnamesptr, rc); else { fprintf(outfile, " G %s (%d) %s\n", substring, rc, getnamesptr); pcre_free_substring(substring); } } if (getlist) { const char **stringlist; int rc = pcre_get_substring_list((char *)bptr, use_offsets, count, &stringlist); if (rc < 0) fprintf(outfile, "get substring list failed %d\n", rc); else { for (i = 0; i < count; i++) fprintf(outfile, "%2dL %s\n", i, stringlist[i]); if (stringlist[i] != NULL) fprintf(outfile, "string list not terminated by NULL\n"); /* free((void *)stringlist); */ pcre_free_substring_list(stringlist); } } } /* There was a partial match */ else if (count == PCRE_ERROR_PARTIAL) { fprintf(outfile, "Partial match"); #if !defined NODFA if ((all_use_dfa || use_dfa) && use_size_offsets > 2) fprintf(outfile, ": %.*s", use_offsets[1] - use_offsets[0], bptr + use_offsets[0]); #endif fprintf(outfile, "\n"); break; /* Out of the /g loop */ } /* Failed to match. If this is a /g or /G loop and we previously set g_notempty after a null match, this is not necessarily the end. We want to advance the start offset, and continue. We won't be at the end of the string - that was checked before setting g_notempty. Complication arises in the case when the newline option is "any" or "anycrlf". If the previous match was at the end of a line terminated by CRLF, an advance of one character just passes the \r, whereas we should prefer the longer newline sequence, as does the code in pcre_exec(). Fudge the offset value to achieve this. Otherwise, in the case of UTF-8 matching, the advance must be one character, not one byte. */ else { if (g_notempty != 0) { int onechar = 1; unsigned int obits = ((real_pcre *)re)->options; use_offsets[0] = start_offset; if ((obits & PCRE_NEWLINE_BITS) == 0) { int d; (void)pcre_config(PCRE_CONFIG_NEWLINE, &d); obits = (d == '\r')? PCRE_NEWLINE_CR : (d == '\n')? PCRE_NEWLINE_LF : (d == ('\r'<<8 | '\n'))? PCRE_NEWLINE_CRLF : (d == -2)? PCRE_NEWLINE_ANYCRLF : (d == -1)? PCRE_NEWLINE_ANY : 0; } if (((obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANY || (obits & PCRE_NEWLINE_BITS) == PCRE_NEWLINE_ANYCRLF) && start_offset < len - 1 && bptr[start_offset] == '\r' && bptr[start_offset+1] == '\n') onechar++; else if (use_utf8) { while (start_offset + onechar < len) { int tb = bptr[start_offset+onechar]; if (tb <= 127) break; tb &= 0xc0; if (tb != 0 && tb != 0xc0) onechar++; } } use_offsets[1] = start_offset + onechar; } else { if (count == PCRE_ERROR_NOMATCH) { if (gmatched == 0) fprintf(outfile, "No match\n"); } else fprintf(outfile, "Error %d\n", count); break; /* Out of the /g loop */ } } /* If not /g or /G we are done */ if (!do_g && !do_G) break; /* If we have matched an empty string, first check to see if we are at the end of the subject. If so, the /g loop is over. Otherwise, mimic what Perl's /g options does. This turns out to be rather cunning. First we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the same point. If this fails (picked up above) we advance to the next character. */ g_notempty = 0; if (use_offsets[0] == use_offsets[1]) { if (use_offsets[0] == len) break; g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED; } /* For /g, update the start offset, leaving the rest alone */ if (do_g) start_offset = use_offsets[1]; /* For /G, update the pointer and length */ else { bptr += use_offsets[1]; len -= use_offsets[1]; } } /* End of loop for /g and /G */ NEXT_DATA: continue; } /* End of loop for data lines */ CONTINUE: #if !defined NOPOSIX if (posix || do_posix) regfree(&preg); #endif if (re != NULL) new_free(re); if (extra != NULL) new_free(extra); if (tables != NULL) { new_free((void *)tables); setlocale(LC_CTYPE, "C"); locale_set = 0; } } if (infile == stdin) fprintf(outfile, "\n"); EXIT: if (infile != NULL && infile != stdin) fclose(infile); if (outfile != NULL && outfile != stdout) fclose(outfile); free(buffer); free(dbuffer); free(pbuffer); free(offsets); return yield; } /* End of pcretest.c */ syncevolution-1.5/src/synthesis/src/pcre/perltest.pl0000644000373300037200000001132012424517753024442 0ustar00nightlyallusers00000000000000#! /usr/bin/env perl # Program for testing regular expressions with perl to check that PCRE handles # them the same. This is the version that supports /8 for UTF-8 testing. As it # stands, it requires at least Perl 5.8 for UTF-8 support. However, it needs to # have "use utf8" at the start for running the UTF-8 tests, but *not* for the # other tests. The only way I've found for doing this is to cat this line in # explicitly in the RunPerlTest script. # use locale; # With this included, \x0b matches \s! # Function for turning a string into a string of printing chars. There are # currently problems with UTF-8 strings; this fudges round them. sub pchars { my($t) = ""; if ($utf8) { @p = unpack('U*', $_[0]); foreach $c (@p) { if ($c >= 32 && $c < 127) { $t .= chr $c; } else { $t .= sprintf("\\x{%02x}", $c); } } } else { foreach $c (split(//, $_[0])) { if (ord $c >= 32 && ord $c < 127) { $t .= $c; } else { $t .= sprintf("\\x%02x", ord $c); } } } $t; } # Read lines from named file or stdin and write to named file or stdout; lines # consist of a regular expression, in delimiters and optionally followed by # options, followed by a set of test data, terminated by an empty line. # Sort out the input and output files if (@ARGV > 0) { open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n"; $infile = "INFILE"; } else { $infile = "STDIN"; } if (@ARGV > 1) { open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n"; $outfile = "OUTFILE"; } else { $outfile = "STDOUT"; } printf($outfile "Perl $] Regular Expressions\n\n"); # Main loop NEXT_RE: for (;;) { printf " re> " if $infile eq "STDIN"; last if ! ($_ = <$infile>); printf $outfile "$_" if $infile ne "STDIN"; next if ($_ eq ""); $pattern = $_; while ($pattern !~ /^\s*(.).*\1/s) { printf " > " if $infile eq "STDIN"; last if ! ($_ = <$infile>); printf $outfile "$_" if $infile ne "STDIN"; $pattern .= $_; } chomp($pattern); $pattern =~ s/\s+$//; # The private /+ modifier means "print $' afterwards". $showrest = ($pattern =~ s/\+(?=[a-z]*$)//); # Remove /8 from a UTF-8 pattern. $utf8 = $pattern =~ s/8(?=[a-z]*$)//; # Check that the pattern is valid eval "\$_ =~ ${pattern}"; if ($@) { printf $outfile "Error: $@"; next NEXT_RE; } # If the /g modifier is present, we want to put a loop round the matching; # otherwise just a single "if". $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if"; # If the pattern is actually the null string, Perl uses the most recently # executed (and successfully compiled) regex is used instead. This is a # nasty trap for the unwary! The PCRE test suite does contain null strings # in places - if they are allowed through here all sorts of weird and # unexpected effects happen. To avoid this, we replace such patterns with # a non-null pattern that has the same effect. $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/); # Read data lines and test them for (;;) { printf "data> " if $infile eq "STDIN"; last NEXT_RE if ! ($_ = <$infile>); chomp; printf $outfile "$_\n" if $infile ne "STDIN"; s/\s+$//; s/^\s+//; last if ($_ eq ""); $x = eval "\"$_\""; # To get escapes processed # Empty array for holding results, then do the matching. @subs = (); $pushes = "push \@subs,\$&;" . "push \@subs,\$1;" . "push \@subs,\$2;" . "push \@subs,\$3;" . "push \@subs,\$4;" . "push \@subs,\$5;" . "push \@subs,\$6;" . "push \@subs,\$7;" . "push \@subs,\$8;" . "push \@subs,\$9;" . "push \@subs,\$10;" . "push \@subs,\$11;" . "push \@subs,\$12;" . "push \@subs,\$13;" . "push \@subs,\$14;" . "push \@subs,\$15;" . "push \@subs,\$16;" . "push \@subs,\$'; }"; eval "${cmd} (\$x =~ ${pattern}) {" . $pushes; if ($@) { printf $outfile "Error: $@\n"; next NEXT_RE; } elsif (scalar(@subs) == 0) { printf $outfile "No match\n"; } else { while (scalar(@subs) != 0) { printf $outfile (" 0: %s\n", &pchars($subs[0])); printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest; $last_printed = 0; for ($i = 1; $i <= 16; $i++) { if (defined $subs[$i]) { while ($last_printed++ < $i-1) { printf $outfile ("%2d: \n", $last_printed); } printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i])); $last_printed = $i; } } splice(@subs, 0, 18); } } } } # printf $outfile "\n"; # End syncevolution-1.5/src/synthesis/src/pcre/ucp.h0000644000373300037200000000572312424517753023215 0ustar00nightlyallusers00000000000000/************************************************* * Unicode Property Table handler * *************************************************/ #ifndef _UCP_H #define _UCP_H /* This file contains definitions of the property values that are returned by the function _pcre_ucp_findprop(). New values that are added for new releases of Unicode should always be at the end of each enum, for backwards compatibility. */ /* These are the general character categories. */ enum { ucp_C, /* Other */ ucp_L, /* Letter */ ucp_M, /* Mark */ ucp_N, /* Number */ ucp_P, /* Punctuation */ ucp_S, /* Symbol */ ucp_Z /* Separator */ }; /* These are the particular character types. */ enum { ucp_Cc, /* Control */ ucp_Cf, /* Format */ ucp_Cn, /* Unassigned */ ucp_Co, /* Private use */ ucp_Cs, /* Surrogate */ ucp_Ll, /* Lower case letter */ ucp_Lm, /* Modifier letter */ ucp_Lo, /* Other letter */ ucp_Lt, /* Title case letter */ ucp_Lu, /* Upper case letter */ ucp_Mc, /* Spacing mark */ ucp_Me, /* Enclosing mark */ ucp_Mn, /* Non-spacing mark */ ucp_Nd, /* Decimal number */ ucp_Nl, /* Letter number */ ucp_No, /* Other number */ ucp_Pc, /* Connector punctuation */ ucp_Pd, /* Dash punctuation */ ucp_Pe, /* Close punctuation */ ucp_Pf, /* Final punctuation */ ucp_Pi, /* Initial punctuation */ ucp_Po, /* Other punctuation */ ucp_Ps, /* Open punctuation */ ucp_Sc, /* Currency symbol */ ucp_Sk, /* Modifier symbol */ ucp_Sm, /* Mathematical symbol */ ucp_So, /* Other symbol */ ucp_Zl, /* Line separator */ ucp_Zp, /* Paragraph separator */ ucp_Zs /* Space separator */ }; /* These are the script identifications. */ enum { ucp_Arabic, ucp_Armenian, ucp_Bengali, ucp_Bopomofo, ucp_Braille, ucp_Buginese, ucp_Buhid, ucp_Canadian_Aboriginal, ucp_Cherokee, ucp_Common, ucp_Coptic, ucp_Cypriot, ucp_Cyrillic, ucp_Deseret, ucp_Devanagari, ucp_Ethiopic, ucp_Georgian, ucp_Glagolitic, ucp_Gothic, ucp_Greek, ucp_Gujarati, ucp_Gurmukhi, ucp_Han, ucp_Hangul, ucp_Hanunoo, ucp_Hebrew, ucp_Hiragana, ucp_Inherited, ucp_Kannada, ucp_Katakana, ucp_Kharoshthi, ucp_Khmer, ucp_Lao, ucp_Latin, ucp_Limbu, ucp_Linear_B, ucp_Malayalam, ucp_Mongolian, ucp_Myanmar, ucp_New_Tai_Lue, ucp_Ogham, ucp_Old_Italic, ucp_Old_Persian, ucp_Oriya, ucp_Osmanya, ucp_Runic, ucp_Shavian, ucp_Sinhala, ucp_Syloti_Nagri, ucp_Syriac, ucp_Tagalog, ucp_Tagbanwa, ucp_Tai_Le, ucp_Tamil, ucp_Telugu, ucp_Thaana, ucp_Thai, ucp_Tibetan, ucp_Tifinagh, ucp_Ugaritic, ucp_Yi, ucp_Balinese, /* New for Unicode 5.0.0 */ ucp_Cuneiform, /* New for Unicode 5.0.0 */ ucp_Nko, /* New for Unicode 5.0.0 */ ucp_Phags_Pa, /* New for Unicode 5.0.0 */ ucp_Phoenician /* New for Unicode 5.0.0 */ }; #endif /* End of ucp.h */ syncevolution-1.5/src/synthesis/src/pcre/ucpinternal.h0000644000373300037200000000657412424517753024757 0ustar00nightlyallusers00000000000000/************************************************* * Unicode Property Table handler * *************************************************/ #ifndef _UCPINTERNAL_H #define _UCPINTERNAL_H /* Internal header file defining the layout of the bits in each pair of 32-bit words that form a data item in the table. */ typedef struct cnode { pcre_uint32 f0; pcre_uint32 f1; } cnode; /* Things for the f0 field */ #define f0_scriptmask 0xff000000 /* Mask for script field */ #define f0_scriptshift 24 /* Shift for script value */ #define f0_rangeflag 0x00f00000 /* Flag for a range item */ #define f0_charmask 0x001fffff /* Mask for code point value */ /* Things for the f1 field */ #define f1_typemask 0xfc000000 /* Mask for char type field */ #define f1_typeshift 26 /* Shift for the type field */ #define f1_rangemask 0x0000ffff /* Mask for a range offset */ #define f1_casemask 0x0000ffff /* Mask for a case offset */ #define f1_caseneg 0xffff8000 /* Bits for negation */ /* The data consists of a vector of structures of type cnode. The two unsigned 32-bit integers are used as follows: (f0) (1) The most significant byte holds the script number. The numbers are defined by the enum in ucp.h. (2) The 0x00800000 bit is set if this entry defines a range of characters. It is not set if this entry defines a single character (3) The 0x00600000 bits are spare. (4) The 0x001fffff bits contain the code point. No Unicode code point will ever be greater than 0x0010ffff, so this should be OK for ever. (f1) (1) The 0xfc000000 bits contain the character type number. The numbers are defined by an enum in ucp.h. (2) The 0x03ff0000 bits are spare. (3) The 0x0000ffff bits contain EITHER the unsigned offset to the top of range if this entry defines a range, OR the *signed* offset to the character's "other case" partner if this entry defines a single character. There is no partner if the value is zero. ------------------------------------------------------------------------------- | script (8) |.|.|.| codepoint (21) || type (6) |.|.| spare (8) | offset (16) | ------------------------------------------------------------------------------- | | | | | | | |-> spare | |-> spare | | | | |-> spare |-> spare | |-> range flag The upper/lower casing information is set only for characters that come in pairs. The non-one-to-one mappings in the Unicode data are ignored. When searching the data, proceed as follows: (1) Set up for a binary chop search. (2) If the top is not greater than the bottom, the character is not in the table. Its type must therefore be "Cn" ("Undefined"). (3) Find the middle vector element. (4) Extract the code point and compare. If equal, we are done. (5) If the test character is smaller, set the top to the current point, and goto (2). (6) If the current entry defines a range, compute the last character by adding the offset, and see if the test character is within the range. If it is, we are done. (7) Otherwise, set the bottom to one element past the current point and goto (2). */ #endif /* _UCPINTERNAL_H */ /* End of ucpinternal.h */ syncevolution-1.5/src/synthesis/src/pcre/ucptable.h0000644000373300037200000026367012424517753024234 0ustar00nightlyallusers00000000000000/* This source module is automatically generated from the Unicode property table. See ucpinternal.h for a description of the layout. This version was made from the Unicode 5.0.0 tables. */ static const cnode ucp_table[] = { { 0x09800000, 0x0000001f }, { 0x09000020, 0x74000000 }, { 0x09800021, 0x54000002 }, { 0x09000024, 0x5c000000 }, { 0x09800025, 0x54000002 }, { 0x09000028, 0x58000000 }, { 0x09000029, 0x48000000 }, { 0x0900002a, 0x54000000 }, { 0x0900002b, 0x64000000 }, { 0x0900002c, 0x54000000 }, { 0x0900002d, 0x44000000 }, { 0x0980002e, 0x54000001 }, { 0x09800030, 0x34000009 }, { 0x0980003a, 0x54000001 }, { 0x0980003c, 0x64000002 }, { 0x0980003f, 0x54000001 }, { 0x21000041, 0x24000020 }, { 0x21000042, 0x24000020 }, { 0x21000043, 0x24000020 }, { 0x21000044, 0x24000020 }, { 0x21000045, 0x24000020 }, { 0x21000046, 0x24000020 }, { 0x21000047, 0x24000020 }, { 0x21000048, 0x24000020 }, { 0x21000049, 0x24000020 }, { 0x2100004a, 0x24000020 }, { 0x2100004b, 0x24000020 }, { 0x2100004c, 0x24000020 }, { 0x2100004d, 0x24000020 }, { 0x2100004e, 0x24000020 }, { 0x2100004f, 0x24000020 }, { 0x21000050, 0x24000020 }, { 0x21000051, 0x24000020 }, { 0x21000052, 0x24000020 }, { 0x21000053, 0x24000020 }, { 0x21000054, 0x24000020 }, { 0x21000055, 0x24000020 }, { 0x21000056, 0x24000020 }, { 0x21000057, 0x24000020 }, { 0x21000058, 0x24000020 }, { 0x21000059, 0x24000020 }, { 0x2100005a, 0x24000020 }, { 0x0900005b, 0x58000000 }, { 0x0900005c, 0x54000000 }, { 0x0900005d, 0x48000000 }, { 0x0900005e, 0x60000000 }, { 0x0900005f, 0x40000000 }, { 0x09000060, 0x60000000 }, { 0x21000061, 0x1400ffe0 }, { 0x21000062, 0x1400ffe0 }, { 0x21000063, 0x1400ffe0 }, { 0x21000064, 0x1400ffe0 }, { 0x21000065, 0x1400ffe0 }, { 0x21000066, 0x1400ffe0 }, { 0x21000067, 0x1400ffe0 }, { 0x21000068, 0x1400ffe0 }, { 0x21000069, 0x1400ffe0 }, { 0x2100006a, 0x1400ffe0 }, { 0x2100006b, 0x1400ffe0 }, { 0x2100006c, 0x1400ffe0 }, { 0x2100006d, 0x1400ffe0 }, { 0x2100006e, 0x1400ffe0 }, { 0x2100006f, 0x1400ffe0 }, { 0x21000070, 0x1400ffe0 }, { 0x21000071, 0x1400ffe0 }, { 0x21000072, 0x1400ffe0 }, { 0x21000073, 0x1400ffe0 }, { 0x21000074, 0x1400ffe0 }, { 0x21000075, 0x1400ffe0 }, { 0x21000076, 0x1400ffe0 }, { 0x21000077, 0x1400ffe0 }, { 0x21000078, 0x1400ffe0 }, { 0x21000079, 0x1400ffe0 }, { 0x2100007a, 0x1400ffe0 }, { 0x0900007b, 0x58000000 }, { 0x0900007c, 0x64000000 }, { 0x0900007d, 0x48000000 }, { 0x0900007e, 0x64000000 }, { 0x0980007f, 0x00000020 }, { 0x090000a0, 0x74000000 }, { 0x090000a1, 0x54000000 }, { 0x098000a2, 0x5c000003 }, { 0x098000a6, 0x68000001 }, { 0x090000a8, 0x60000000 }, { 0x090000a9, 0x68000000 }, { 0x210000aa, 0x14000000 }, { 0x090000ab, 0x50000000 }, { 0x090000ac, 0x64000000 }, { 0x090000ad, 0x04000000 }, { 0x090000ae, 0x68000000 }, { 0x090000af, 0x60000000 }, { 0x090000b0, 0x68000000 }, { 0x090000b1, 0x64000000 }, { 0x098000b2, 0x3c000001 }, { 0x090000b4, 0x60000000 }, { 0x090000b5, 0x140002e7 }, { 0x090000b6, 0x68000000 }, { 0x090000b7, 0x54000000 }, { 0x090000b8, 0x60000000 }, { 0x090000b9, 0x3c000000 }, { 0x210000ba, 0x14000000 }, { 0x090000bb, 0x4c000000 }, { 0x098000bc, 0x3c000002 }, { 0x090000bf, 0x54000000 }, { 0x210000c0, 0x24000020 }, { 0x210000c1, 0x24000020 }, { 0x210000c2, 0x24000020 }, { 0x210000c3, 0x24000020 }, { 0x210000c4, 0x24000020 }, { 0x210000c5, 0x24000020 }, { 0x210000c6, 0x24000020 }, { 0x210000c7, 0x24000020 }, { 0x210000c8, 0x24000020 }, { 0x210000c9, 0x24000020 }, { 0x210000ca, 0x24000020 }, { 0x210000cb, 0x24000020 }, { 0x210000cc, 0x24000020 }, { 0x210000cd, 0x24000020 }, { 0x210000ce, 0x24000020 }, { 0x210000cf, 0x24000020 }, { 0x210000d0, 0x24000020 }, { 0x210000d1, 0x24000020 }, { 0x210000d2, 0x24000020 }, { 0x210000d3, 0x24000020 }, { 0x210000d4, 0x24000020 }, { 0x210000d5, 0x24000020 }, { 0x210000d6, 0x24000020 }, { 0x090000d7, 0x64000000 }, { 0x210000d8, 0x24000020 }, { 0x210000d9, 0x24000020 }, { 0x210000da, 0x24000020 }, { 0x210000db, 0x24000020 }, { 0x210000dc, 0x24000020 }, { 0x210000dd, 0x24000020 }, { 0x210000de, 0x24000020 }, { 0x210000df, 0x14000000 }, { 0x210000e0, 0x1400ffe0 }, { 0x210000e1, 0x1400ffe0 }, { 0x210000e2, 0x1400ffe0 }, { 0x210000e3, 0x1400ffe0 }, { 0x210000e4, 0x1400ffe0 }, { 0x210000e5, 0x1400ffe0 }, { 0x210000e6, 0x1400ffe0 }, { 0x210000e7, 0x1400ffe0 }, { 0x210000e8, 0x1400ffe0 }, { 0x210000e9, 0x1400ffe0 }, { 0x210000ea, 0x1400ffe0 }, { 0x210000eb, 0x1400ffe0 }, { 0x210000ec, 0x1400ffe0 }, { 0x210000ed, 0x1400ffe0 }, { 0x210000ee, 0x1400ffe0 }, { 0x210000ef, 0x1400ffe0 }, { 0x210000f0, 0x1400ffe0 }, { 0x210000f1, 0x1400ffe0 }, { 0x210000f2, 0x1400ffe0 }, { 0x210000f3, 0x1400ffe0 }, { 0x210000f4, 0x1400ffe0 }, { 0x210000f5, 0x1400ffe0 }, { 0x210000f6, 0x1400ffe0 }, { 0x090000f7, 0x64000000 }, { 0x210000f8, 0x1400ffe0 }, { 0x210000f9, 0x1400ffe0 }, { 0x210000fa, 0x1400ffe0 }, { 0x210000fb, 0x1400ffe0 }, { 0x210000fc, 0x1400ffe0 }, { 0x210000fd, 0x1400ffe0 }, { 0x210000fe, 0x1400ffe0 }, { 0x210000ff, 0x14000079 }, { 0x21000100, 0x24000001 }, { 0x21000101, 0x1400ffff }, { 0x21000102, 0x24000001 }, { 0x21000103, 0x1400ffff }, { 0x21000104, 0x24000001 }, { 0x21000105, 0x1400ffff }, { 0x21000106, 0x24000001 }, { 0x21000107, 0x1400ffff }, { 0x21000108, 0x24000001 }, { 0x21000109, 0x1400ffff }, { 0x2100010a, 0x24000001 }, { 0x2100010b, 0x1400ffff }, { 0x2100010c, 0x24000001 }, { 0x2100010d, 0x1400ffff }, { 0x2100010e, 0x24000001 }, { 0x2100010f, 0x1400ffff }, { 0x21000110, 0x24000001 }, { 0x21000111, 0x1400ffff }, { 0x21000112, 0x24000001 }, { 0x21000113, 0x1400ffff }, { 0x21000114, 0x24000001 }, { 0x21000115, 0x1400ffff }, { 0x21000116, 0x24000001 }, { 0x21000117, 0x1400ffff }, { 0x21000118, 0x24000001 }, { 0x21000119, 0x1400ffff }, { 0x2100011a, 0x24000001 }, { 0x2100011b, 0x1400ffff }, { 0x2100011c, 0x24000001 }, { 0x2100011d, 0x1400ffff }, { 0x2100011e, 0x24000001 }, { 0x2100011f, 0x1400ffff }, { 0x21000120, 0x24000001 }, { 0x21000121, 0x1400ffff }, { 0x21000122, 0x24000001 }, { 0x21000123, 0x1400ffff }, { 0x21000124, 0x24000001 }, { 0x21000125, 0x1400ffff }, { 0x21000126, 0x24000001 }, { 0x21000127, 0x1400ffff }, { 0x21000128, 0x24000001 }, { 0x21000129, 0x1400ffff }, { 0x2100012a, 0x24000001 }, { 0x2100012b, 0x1400ffff }, { 0x2100012c, 0x24000001 }, { 0x2100012d, 0x1400ffff }, { 0x2100012e, 0x24000001 }, { 0x2100012f, 0x1400ffff }, { 0x21000130, 0x2400ff39 }, { 0x21000131, 0x1400ff18 }, { 0x21000132, 0x24000001 }, { 0x21000133, 0x1400ffff }, { 0x21000134, 0x24000001 }, { 0x21000135, 0x1400ffff }, { 0x21000136, 0x24000001 }, { 0x21000137, 0x1400ffff }, { 0x21000138, 0x14000000 }, { 0x21000139, 0x24000001 }, { 0x2100013a, 0x1400ffff }, { 0x2100013b, 0x24000001 }, { 0x2100013c, 0x1400ffff }, { 0x2100013d, 0x24000001 }, { 0x2100013e, 0x1400ffff }, { 0x2100013f, 0x24000001 }, { 0x21000140, 0x1400ffff }, { 0x21000141, 0x24000001 }, { 0x21000142, 0x1400ffff }, { 0x21000143, 0x24000001 }, { 0x21000144, 0x1400ffff }, { 0x21000145, 0x24000001 }, { 0x21000146, 0x1400ffff }, { 0x21000147, 0x24000001 }, { 0x21000148, 0x1400ffff }, { 0x21000149, 0x14000000 }, { 0x2100014a, 0x24000001 }, { 0x2100014b, 0x1400ffff }, { 0x2100014c, 0x24000001 }, { 0x2100014d, 0x1400ffff }, { 0x2100014e, 0x24000001 }, { 0x2100014f, 0x1400ffff }, { 0x21000150, 0x24000001 }, { 0x21000151, 0x1400ffff }, { 0x21000152, 0x24000001 }, { 0x21000153, 0x1400ffff }, { 0x21000154, 0x24000001 }, { 0x21000155, 0x1400ffff }, { 0x21000156, 0x24000001 }, { 0x21000157, 0x1400ffff }, { 0x21000158, 0x24000001 }, { 0x21000159, 0x1400ffff }, { 0x2100015a, 0x24000001 }, { 0x2100015b, 0x1400ffff }, { 0x2100015c, 0x24000001 }, { 0x2100015d, 0x1400ffff }, { 0x2100015e, 0x24000001 }, { 0x2100015f, 0x1400ffff }, { 0x21000160, 0x24000001 }, { 0x21000161, 0x1400ffff }, { 0x21000162, 0x24000001 }, { 0x21000163, 0x1400ffff }, { 0x21000164, 0x24000001 }, { 0x21000165, 0x1400ffff }, { 0x21000166, 0x24000001 }, { 0x21000167, 0x1400ffff }, { 0x21000168, 0x24000001 }, { 0x21000169, 0x1400ffff }, { 0x2100016a, 0x24000001 }, { 0x2100016b, 0x1400ffff }, { 0x2100016c, 0x24000001 }, { 0x2100016d, 0x1400ffff }, { 0x2100016e, 0x24000001 }, { 0x2100016f, 0x1400ffff }, { 0x21000170, 0x24000001 }, { 0x21000171, 0x1400ffff }, { 0x21000172, 0x24000001 }, { 0x21000173, 0x1400ffff }, { 0x21000174, 0x24000001 }, { 0x21000175, 0x1400ffff }, { 0x21000176, 0x24000001 }, { 0x21000177, 0x1400ffff }, { 0x21000178, 0x2400ff87 }, { 0x21000179, 0x24000001 }, { 0x2100017a, 0x1400ffff }, { 0x2100017b, 0x24000001 }, { 0x2100017c, 0x1400ffff }, { 0x2100017d, 0x24000001 }, { 0x2100017e, 0x1400ffff }, { 0x2100017f, 0x1400fed4 }, { 0x21000180, 0x140000c3 }, { 0x21000181, 0x240000d2 }, { 0x21000182, 0x24000001 }, { 0x21000183, 0x1400ffff }, { 0x21000184, 0x24000001 }, { 0x21000185, 0x1400ffff }, { 0x21000186, 0x240000ce }, { 0x21000187, 0x24000001 }, { 0x21000188, 0x1400ffff }, { 0x21000189, 0x240000cd }, { 0x2100018a, 0x240000cd }, { 0x2100018b, 0x24000001 }, { 0x2100018c, 0x1400ffff }, { 0x2100018d, 0x14000000 }, { 0x2100018e, 0x2400004f }, { 0x2100018f, 0x240000ca }, { 0x21000190, 0x240000cb }, { 0x21000191, 0x24000001 }, { 0x21000192, 0x1400ffff }, { 0x21000193, 0x240000cd }, { 0x21000194, 0x240000cf }, { 0x21000195, 0x14000061 }, { 0x21000196, 0x240000d3 }, { 0x21000197, 0x240000d1 }, { 0x21000198, 0x24000001 }, { 0x21000199, 0x1400ffff }, { 0x2100019a, 0x140000a3 }, { 0x2100019b, 0x14000000 }, { 0x2100019c, 0x240000d3 }, { 0x2100019d, 0x240000d5 }, { 0x2100019e, 0x14000082 }, { 0x2100019f, 0x240000d6 }, { 0x210001a0, 0x24000001 }, { 0x210001a1, 0x1400ffff }, { 0x210001a2, 0x24000001 }, { 0x210001a3, 0x1400ffff }, { 0x210001a4, 0x24000001 }, { 0x210001a5, 0x1400ffff }, { 0x210001a6, 0x240000da }, { 0x210001a7, 0x24000001 }, { 0x210001a8, 0x1400ffff }, { 0x210001a9, 0x240000da }, { 0x218001aa, 0x14000001 }, { 0x210001ac, 0x24000001 }, { 0x210001ad, 0x1400ffff }, { 0x210001ae, 0x240000da }, { 0x210001af, 0x24000001 }, { 0x210001b0, 0x1400ffff }, { 0x210001b1, 0x240000d9 }, { 0x210001b2, 0x240000d9 }, { 0x210001b3, 0x24000001 }, { 0x210001b4, 0x1400ffff }, { 0x210001b5, 0x24000001 }, { 0x210001b6, 0x1400ffff }, { 0x210001b7, 0x240000db }, { 0x210001b8, 0x24000001 }, { 0x210001b9, 0x1400ffff }, { 0x210001ba, 0x14000000 }, { 0x210001bb, 0x1c000000 }, { 0x210001bc, 0x24000001 }, { 0x210001bd, 0x1400ffff }, { 0x210001be, 0x14000000 }, { 0x210001bf, 0x14000038 }, { 0x218001c0, 0x1c000003 }, { 0x210001c4, 0x24000002 }, { 0x210001c5, 0x2000ffff }, { 0x210001c6, 0x1400fffe }, { 0x210001c7, 0x24000002 }, { 0x210001c8, 0x2000ffff }, { 0x210001c9, 0x1400fffe }, { 0x210001ca, 0x24000002 }, { 0x210001cb, 0x2000ffff }, { 0x210001cc, 0x1400fffe }, { 0x210001cd, 0x24000001 }, { 0x210001ce, 0x1400ffff }, { 0x210001cf, 0x24000001 }, { 0x210001d0, 0x1400ffff }, { 0x210001d1, 0x24000001 }, { 0x210001d2, 0x1400ffff }, { 0x210001d3, 0x24000001 }, { 0x210001d4, 0x1400ffff }, { 0x210001d5, 0x24000001 }, { 0x210001d6, 0x1400ffff }, { 0x210001d7, 0x24000001 }, { 0x210001d8, 0x1400ffff }, { 0x210001d9, 0x24000001 }, { 0x210001da, 0x1400ffff }, { 0x210001db, 0x24000001 }, { 0x210001dc, 0x1400ffff }, { 0x210001dd, 0x1400ffb1 }, { 0x210001de, 0x24000001 }, { 0x210001df, 0x1400ffff }, { 0x210001e0, 0x24000001 }, { 0x210001e1, 0x1400ffff }, { 0x210001e2, 0x24000001 }, { 0x210001e3, 0x1400ffff }, { 0x210001e4, 0x24000001 }, { 0x210001e5, 0x1400ffff }, { 0x210001e6, 0x24000001 }, { 0x210001e7, 0x1400ffff }, { 0x210001e8, 0x24000001 }, { 0x210001e9, 0x1400ffff }, { 0x210001ea, 0x24000001 }, { 0x210001eb, 0x1400ffff }, { 0x210001ec, 0x24000001 }, { 0x210001ed, 0x1400ffff }, { 0x210001ee, 0x24000001 }, { 0x210001ef, 0x1400ffff }, { 0x210001f0, 0x14000000 }, { 0x210001f1, 0x24000002 }, { 0x210001f2, 0x2000ffff }, { 0x210001f3, 0x1400fffe }, { 0x210001f4, 0x24000001 }, { 0x210001f5, 0x1400ffff }, { 0x210001f6, 0x2400ff9f }, { 0x210001f7, 0x2400ffc8 }, { 0x210001f8, 0x24000001 }, { 0x210001f9, 0x1400ffff }, { 0x210001fa, 0x24000001 }, { 0x210001fb, 0x1400ffff }, { 0x210001fc, 0x24000001 }, { 0x210001fd, 0x1400ffff }, { 0x210001fe, 0x24000001 }, { 0x210001ff, 0x1400ffff }, { 0x21000200, 0x24000001 }, { 0x21000201, 0x1400ffff }, { 0x21000202, 0x24000001 }, { 0x21000203, 0x1400ffff }, { 0x21000204, 0x24000001 }, { 0x21000205, 0x1400ffff }, { 0x21000206, 0x24000001 }, { 0x21000207, 0x1400ffff }, { 0x21000208, 0x24000001 }, { 0x21000209, 0x1400ffff }, { 0x2100020a, 0x24000001 }, { 0x2100020b, 0x1400ffff }, { 0x2100020c, 0x24000001 }, { 0x2100020d, 0x1400ffff }, { 0x2100020e, 0x24000001 }, { 0x2100020f, 0x1400ffff }, { 0x21000210, 0x24000001 }, { 0x21000211, 0x1400ffff }, { 0x21000212, 0x24000001 }, { 0x21000213, 0x1400ffff }, { 0x21000214, 0x24000001 }, { 0x21000215, 0x1400ffff }, { 0x21000216, 0x24000001 }, { 0x21000217, 0x1400ffff }, { 0x21000218, 0x24000001 }, { 0x21000219, 0x1400ffff }, { 0x2100021a, 0x24000001 }, { 0x2100021b, 0x1400ffff }, { 0x2100021c, 0x24000001 }, { 0x2100021d, 0x1400ffff }, { 0x2100021e, 0x24000001 }, { 0x2100021f, 0x1400ffff }, { 0x21000220, 0x2400ff7e }, { 0x21000221, 0x14000000 }, { 0x21000222, 0x24000001 }, { 0x21000223, 0x1400ffff }, { 0x21000224, 0x24000001 }, { 0x21000225, 0x1400ffff }, { 0x21000226, 0x24000001 }, { 0x21000227, 0x1400ffff }, { 0x21000228, 0x24000001 }, { 0x21000229, 0x1400ffff }, { 0x2100022a, 0x24000001 }, { 0x2100022b, 0x1400ffff }, { 0x2100022c, 0x24000001 }, { 0x2100022d, 0x1400ffff }, { 0x2100022e, 0x24000001 }, { 0x2100022f, 0x1400ffff }, { 0x21000230, 0x24000001 }, { 0x21000231, 0x1400ffff }, { 0x21000232, 0x24000001 }, { 0x21000233, 0x1400ffff }, { 0x21800234, 0x14000005 }, { 0x2100023a, 0x24002a2b }, { 0x2100023b, 0x24000001 }, { 0x2100023c, 0x1400ffff }, { 0x2100023d, 0x2400ff5d }, { 0x2100023e, 0x24002a28 }, { 0x2180023f, 0x14000001 }, { 0x21000241, 0x24000001 }, { 0x21000242, 0x1400ffff }, { 0x21000243, 0x2400ff3d }, { 0x21000244, 0x24000045 }, { 0x21000245, 0x24000047 }, { 0x21000246, 0x24000001 }, { 0x21000247, 0x1400ffff }, { 0x21000248, 0x24000001 }, { 0x21000249, 0x1400ffff }, { 0x2100024a, 0x24000001 }, { 0x2100024b, 0x1400ffff }, { 0x2100024c, 0x24000001 }, { 0x2100024d, 0x1400ffff }, { 0x2100024e, 0x24000001 }, { 0x2100024f, 0x1400ffff }, { 0x21800250, 0x14000002 }, { 0x21000253, 0x1400ff2e }, { 0x21000254, 0x1400ff32 }, { 0x21000255, 0x14000000 }, { 0x21000256, 0x1400ff33 }, { 0x21000257, 0x1400ff33 }, { 0x21000258, 0x14000000 }, { 0x21000259, 0x1400ff36 }, { 0x2100025a, 0x14000000 }, { 0x2100025b, 0x1400ff35 }, { 0x2180025c, 0x14000003 }, { 0x21000260, 0x1400ff33 }, { 0x21800261, 0x14000001 }, { 0x21000263, 0x1400ff31 }, { 0x21800264, 0x14000003 }, { 0x21000268, 0x1400ff2f }, { 0x21000269, 0x1400ff2d }, { 0x2100026a, 0x14000000 }, { 0x2100026b, 0x140029f7 }, { 0x2180026c, 0x14000002 }, { 0x2100026f, 0x1400ff2d }, { 0x21800270, 0x14000001 }, { 0x21000272, 0x1400ff2b }, { 0x21800273, 0x14000001 }, { 0x21000275, 0x1400ff2a }, { 0x21800276, 0x14000006 }, { 0x2100027d, 0x140029e7 }, { 0x2180027e, 0x14000001 }, { 0x21000280, 0x1400ff26 }, { 0x21800281, 0x14000001 }, { 0x21000283, 0x1400ff26 }, { 0x21800284, 0x14000003 }, { 0x21000288, 0x1400ff26 }, { 0x21000289, 0x1400ffbb }, { 0x2100028a, 0x1400ff27 }, { 0x2100028b, 0x1400ff27 }, { 0x2100028c, 0x1400ffb9 }, { 0x2180028d, 0x14000004 }, { 0x21000292, 0x1400ff25 }, { 0x21000293, 0x14000000 }, { 0x21000294, 0x1c000000 }, { 0x21800295, 0x1400001a }, { 0x218002b0, 0x18000011 }, { 0x098002c2, 0x60000003 }, { 0x098002c6, 0x1800000b }, { 0x098002d2, 0x6000000d }, { 0x218002e0, 0x18000004 }, { 0x098002e5, 0x60000008 }, { 0x090002ee, 0x18000000 }, { 0x098002ef, 0x60000010 }, { 0x1b800300, 0x30000044 }, { 0x1b000345, 0x30000054 }, { 0x1b800346, 0x30000029 }, { 0x13800374, 0x60000001 }, { 0x1300037a, 0x18000000 }, { 0x1300037b, 0x14000082 }, { 0x1300037c, 0x14000082 }, { 0x1300037d, 0x14000082 }, { 0x0900037e, 0x54000000 }, { 0x13800384, 0x60000001 }, { 0x13000386, 0x24000026 }, { 0x09000387, 0x54000000 }, { 0x13000388, 0x24000025 }, { 0x13000389, 0x24000025 }, { 0x1300038a, 0x24000025 }, { 0x1300038c, 0x24000040 }, { 0x1300038e, 0x2400003f }, { 0x1300038f, 0x2400003f }, { 0x13000390, 0x14000000 }, { 0x13000391, 0x24000020 }, { 0x13000392, 0x24000020 }, { 0x13000393, 0x24000020 }, { 0x13000394, 0x24000020 }, { 0x13000395, 0x24000020 }, { 0x13000396, 0x24000020 }, { 0x13000397, 0x24000020 }, { 0x13000398, 0x24000020 }, { 0x13000399, 0x24000020 }, { 0x1300039a, 0x24000020 }, { 0x1300039b, 0x24000020 }, { 0x1300039c, 0x24000020 }, { 0x1300039d, 0x24000020 }, { 0x1300039e, 0x24000020 }, { 0x1300039f, 0x24000020 }, { 0x130003a0, 0x24000020 }, { 0x130003a1, 0x24000020 }, { 0x130003a3, 0x24000020 }, { 0x130003a4, 0x24000020 }, { 0x130003a5, 0x24000020 }, { 0x130003a6, 0x24000020 }, { 0x130003a7, 0x24000020 }, { 0x130003a8, 0x24000020 }, { 0x130003a9, 0x24000020 }, { 0x130003aa, 0x24000020 }, { 0x130003ab, 0x24000020 }, { 0x130003ac, 0x1400ffda }, { 0x130003ad, 0x1400ffdb }, { 0x130003ae, 0x1400ffdb }, { 0x130003af, 0x1400ffdb }, { 0x130003b0, 0x14000000 }, { 0x130003b1, 0x1400ffe0 }, { 0x130003b2, 0x1400ffe0 }, { 0x130003b3, 0x1400ffe0 }, { 0x130003b4, 0x1400ffe0 }, { 0x130003b5, 0x1400ffe0 }, { 0x130003b6, 0x1400ffe0 }, { 0x130003b7, 0x1400ffe0 }, { 0x130003b8, 0x1400ffe0 }, { 0x130003b9, 0x1400ffe0 }, { 0x130003ba, 0x1400ffe0 }, { 0x130003bb, 0x1400ffe0 }, { 0x130003bc, 0x1400ffe0 }, { 0x130003bd, 0x1400ffe0 }, { 0x130003be, 0x1400ffe0 }, { 0x130003bf, 0x1400ffe0 }, { 0x130003c0, 0x1400ffe0 }, { 0x130003c1, 0x1400ffe0 }, { 0x130003c2, 0x1400ffe1 }, { 0x130003c3, 0x1400ffe0 }, { 0x130003c4, 0x1400ffe0 }, { 0x130003c5, 0x1400ffe0 }, { 0x130003c6, 0x1400ffe0 }, { 0x130003c7, 0x1400ffe0 }, { 0x130003c8, 0x1400ffe0 }, { 0x130003c9, 0x1400ffe0 }, { 0x130003ca, 0x1400ffe0 }, { 0x130003cb, 0x1400ffe0 }, { 0x130003cc, 0x1400ffc0 }, { 0x130003cd, 0x1400ffc1 }, { 0x130003ce, 0x1400ffc1 }, { 0x130003d0, 0x1400ffc2 }, { 0x130003d1, 0x1400ffc7 }, { 0x138003d2, 0x24000002 }, { 0x130003d5, 0x1400ffd1 }, { 0x130003d6, 0x1400ffca }, { 0x130003d7, 0x14000000 }, { 0x130003d8, 0x24000001 }, { 0x130003d9, 0x1400ffff }, { 0x130003da, 0x24000001 }, { 0x130003db, 0x1400ffff }, { 0x130003dc, 0x24000001 }, { 0x130003dd, 0x1400ffff }, { 0x130003de, 0x24000001 }, { 0x130003df, 0x1400ffff }, { 0x130003e0, 0x24000001 }, { 0x130003e1, 0x1400ffff }, { 0x0a0003e2, 0x24000001 }, { 0x0a0003e3, 0x1400ffff }, { 0x0a0003e4, 0x24000001 }, { 0x0a0003e5, 0x1400ffff }, { 0x0a0003e6, 0x24000001 }, { 0x0a0003e7, 0x1400ffff }, { 0x0a0003e8, 0x24000001 }, { 0x0a0003e9, 0x1400ffff }, { 0x0a0003ea, 0x24000001 }, { 0x0a0003eb, 0x1400ffff }, { 0x0a0003ec, 0x24000001 }, { 0x0a0003ed, 0x1400ffff }, { 0x0a0003ee, 0x24000001 }, { 0x0a0003ef, 0x1400ffff }, { 0x130003f0, 0x1400ffaa }, { 0x130003f1, 0x1400ffb0 }, { 0x130003f2, 0x14000007 }, { 0x130003f3, 0x14000000 }, { 0x130003f4, 0x2400ffc4 }, { 0x130003f5, 0x1400ffa0 }, { 0x130003f6, 0x64000000 }, { 0x130003f7, 0x24000001 }, { 0x130003f8, 0x1400ffff }, { 0x130003f9, 0x2400fff9 }, { 0x130003fa, 0x24000001 }, { 0x130003fb, 0x1400ffff }, { 0x130003fc, 0x14000000 }, { 0x130003fd, 0x2400ff7e }, { 0x130003fe, 0x2400ff7e }, { 0x130003ff, 0x2400ff7e }, { 0x0c000400, 0x24000050 }, { 0x0c000401, 0x24000050 }, { 0x0c000402, 0x24000050 }, { 0x0c000403, 0x24000050 }, { 0x0c000404, 0x24000050 }, { 0x0c000405, 0x24000050 }, { 0x0c000406, 0x24000050 }, { 0x0c000407, 0x24000050 }, { 0x0c000408, 0x24000050 }, { 0x0c000409, 0x24000050 }, { 0x0c00040a, 0x24000050 }, { 0x0c00040b, 0x24000050 }, { 0x0c00040c, 0x24000050 }, { 0x0c00040d, 0x24000050 }, { 0x0c00040e, 0x24000050 }, { 0x0c00040f, 0x24000050 }, { 0x0c000410, 0x24000020 }, { 0x0c000411, 0x24000020 }, { 0x0c000412, 0x24000020 }, { 0x0c000413, 0x24000020 }, { 0x0c000414, 0x24000020 }, { 0x0c000415, 0x24000020 }, { 0x0c000416, 0x24000020 }, { 0x0c000417, 0x24000020 }, { 0x0c000418, 0x24000020 }, { 0x0c000419, 0x24000020 }, { 0x0c00041a, 0x24000020 }, { 0x0c00041b, 0x24000020 }, { 0x0c00041c, 0x24000020 }, { 0x0c00041d, 0x24000020 }, { 0x0c00041e, 0x24000020 }, { 0x0c00041f, 0x24000020 }, { 0x0c000420, 0x24000020 }, { 0x0c000421, 0x24000020 }, { 0x0c000422, 0x24000020 }, { 0x0c000423, 0x24000020 }, { 0x0c000424, 0x24000020 }, { 0x0c000425, 0x24000020 }, { 0x0c000426, 0x24000020 }, { 0x0c000427, 0x24000020 }, { 0x0c000428, 0x24000020 }, { 0x0c000429, 0x24000020 }, { 0x0c00042a, 0x24000020 }, { 0x0c00042b, 0x24000020 }, { 0x0c00042c, 0x24000020 }, { 0x0c00042d, 0x24000020 }, { 0x0c00042e, 0x24000020 }, { 0x0c00042f, 0x24000020 }, { 0x0c000430, 0x1400ffe0 }, { 0x0c000431, 0x1400ffe0 }, { 0x0c000432, 0x1400ffe0 }, { 0x0c000433, 0x1400ffe0 }, { 0x0c000434, 0x1400ffe0 }, { 0x0c000435, 0x1400ffe0 }, { 0x0c000436, 0x1400ffe0 }, { 0x0c000437, 0x1400ffe0 }, { 0x0c000438, 0x1400ffe0 }, { 0x0c000439, 0x1400ffe0 }, { 0x0c00043a, 0x1400ffe0 }, { 0x0c00043b, 0x1400ffe0 }, { 0x0c00043c, 0x1400ffe0 }, { 0x0c00043d, 0x1400ffe0 }, { 0x0c00043e, 0x1400ffe0 }, { 0x0c00043f, 0x1400ffe0 }, { 0x0c000440, 0x1400ffe0 }, { 0x0c000441, 0x1400ffe0 }, { 0x0c000442, 0x1400ffe0 }, { 0x0c000443, 0x1400ffe0 }, { 0x0c000444, 0x1400ffe0 }, { 0x0c000445, 0x1400ffe0 }, { 0x0c000446, 0x1400ffe0 }, { 0x0c000447, 0x1400ffe0 }, { 0x0c000448, 0x1400ffe0 }, { 0x0c000449, 0x1400ffe0 }, { 0x0c00044a, 0x1400ffe0 }, { 0x0c00044b, 0x1400ffe0 }, { 0x0c00044c, 0x1400ffe0 }, { 0x0c00044d, 0x1400ffe0 }, { 0x0c00044e, 0x1400ffe0 }, { 0x0c00044f, 0x1400ffe0 }, { 0x0c000450, 0x1400ffb0 }, { 0x0c000451, 0x1400ffb0 }, { 0x0c000452, 0x1400ffb0 }, { 0x0c000453, 0x1400ffb0 }, { 0x0c000454, 0x1400ffb0 }, { 0x0c000455, 0x1400ffb0 }, { 0x0c000456, 0x1400ffb0 }, { 0x0c000457, 0x1400ffb0 }, { 0x0c000458, 0x1400ffb0 }, { 0x0c000459, 0x1400ffb0 }, { 0x0c00045a, 0x1400ffb0 }, { 0x0c00045b, 0x1400ffb0 }, { 0x0c00045c, 0x1400ffb0 }, { 0x0c00045d, 0x1400ffb0 }, { 0x0c00045e, 0x1400ffb0 }, { 0x0c00045f, 0x1400ffb0 }, { 0x0c000460, 0x24000001 }, { 0x0c000461, 0x1400ffff }, { 0x0c000462, 0x24000001 }, { 0x0c000463, 0x1400ffff }, { 0x0c000464, 0x24000001 }, { 0x0c000465, 0x1400ffff }, { 0x0c000466, 0x24000001 }, { 0x0c000467, 0x1400ffff }, { 0x0c000468, 0x24000001 }, { 0x0c000469, 0x1400ffff }, { 0x0c00046a, 0x24000001 }, { 0x0c00046b, 0x1400ffff }, { 0x0c00046c, 0x24000001 }, { 0x0c00046d, 0x1400ffff }, { 0x0c00046e, 0x24000001 }, { 0x0c00046f, 0x1400ffff }, { 0x0c000470, 0x24000001 }, { 0x0c000471, 0x1400ffff }, { 0x0c000472, 0x24000001 }, { 0x0c000473, 0x1400ffff }, { 0x0c000474, 0x24000001 }, { 0x0c000475, 0x1400ffff }, { 0x0c000476, 0x24000001 }, { 0x0c000477, 0x1400ffff }, { 0x0c000478, 0x24000001 }, { 0x0c000479, 0x1400ffff }, { 0x0c00047a, 0x24000001 }, { 0x0c00047b, 0x1400ffff }, { 0x0c00047c, 0x24000001 }, { 0x0c00047d, 0x1400ffff }, { 0x0c00047e, 0x24000001 }, { 0x0c00047f, 0x1400ffff }, { 0x0c000480, 0x24000001 }, { 0x0c000481, 0x1400ffff }, { 0x0c000482, 0x68000000 }, { 0x0c800483, 0x30000003 }, { 0x0c800488, 0x2c000001 }, { 0x0c00048a, 0x24000001 }, { 0x0c00048b, 0x1400ffff }, { 0x0c00048c, 0x24000001 }, { 0x0c00048d, 0x1400ffff }, { 0x0c00048e, 0x24000001 }, { 0x0c00048f, 0x1400ffff }, { 0x0c000490, 0x24000001 }, { 0x0c000491, 0x1400ffff }, { 0x0c000492, 0x24000001 }, { 0x0c000493, 0x1400ffff }, { 0x0c000494, 0x24000001 }, { 0x0c000495, 0x1400ffff }, { 0x0c000496, 0x24000001 }, { 0x0c000497, 0x1400ffff }, { 0x0c000498, 0x24000001 }, { 0x0c000499, 0x1400ffff }, { 0x0c00049a, 0x24000001 }, { 0x0c00049b, 0x1400ffff }, { 0x0c00049c, 0x24000001 }, { 0x0c00049d, 0x1400ffff }, { 0x0c00049e, 0x24000001 }, { 0x0c00049f, 0x1400ffff }, { 0x0c0004a0, 0x24000001 }, { 0x0c0004a1, 0x1400ffff }, { 0x0c0004a2, 0x24000001 }, { 0x0c0004a3, 0x1400ffff }, { 0x0c0004a4, 0x24000001 }, { 0x0c0004a5, 0x1400ffff }, { 0x0c0004a6, 0x24000001 }, { 0x0c0004a7, 0x1400ffff }, { 0x0c0004a8, 0x24000001 }, { 0x0c0004a9, 0x1400ffff }, { 0x0c0004aa, 0x24000001 }, { 0x0c0004ab, 0x1400ffff }, { 0x0c0004ac, 0x24000001 }, { 0x0c0004ad, 0x1400ffff }, { 0x0c0004ae, 0x24000001 }, { 0x0c0004af, 0x1400ffff }, { 0x0c0004b0, 0x24000001 }, { 0x0c0004b1, 0x1400ffff }, { 0x0c0004b2, 0x24000001 }, { 0x0c0004b3, 0x1400ffff }, { 0x0c0004b4, 0x24000001 }, { 0x0c0004b5, 0x1400ffff }, { 0x0c0004b6, 0x24000001 }, { 0x0c0004b7, 0x1400ffff }, { 0x0c0004b8, 0x24000001 }, { 0x0c0004b9, 0x1400ffff }, { 0x0c0004ba, 0x24000001 }, { 0x0c0004bb, 0x1400ffff }, { 0x0c0004bc, 0x24000001 }, { 0x0c0004bd, 0x1400ffff }, { 0x0c0004be, 0x24000001 }, { 0x0c0004bf, 0x1400ffff }, { 0x0c0004c0, 0x2400000f }, { 0x0c0004c1, 0x24000001 }, { 0x0c0004c2, 0x1400ffff }, { 0x0c0004c3, 0x24000001 }, { 0x0c0004c4, 0x1400ffff }, { 0x0c0004c5, 0x24000001 }, { 0x0c0004c6, 0x1400ffff }, { 0x0c0004c7, 0x24000001 }, { 0x0c0004c8, 0x1400ffff }, { 0x0c0004c9, 0x24000001 }, { 0x0c0004ca, 0x1400ffff }, { 0x0c0004cb, 0x24000001 }, { 0x0c0004cc, 0x1400ffff }, { 0x0c0004cd, 0x24000001 }, { 0x0c0004ce, 0x1400ffff }, { 0x0c0004cf, 0x1400fff1 }, { 0x0c0004d0, 0x24000001 }, { 0x0c0004d1, 0x1400ffff }, { 0x0c0004d2, 0x24000001 }, { 0x0c0004d3, 0x1400ffff }, { 0x0c0004d4, 0x24000001 }, { 0x0c0004d5, 0x1400ffff }, { 0x0c0004d6, 0x24000001 }, { 0x0c0004d7, 0x1400ffff }, { 0x0c0004d8, 0x24000001 }, { 0x0c0004d9, 0x1400ffff }, { 0x0c0004da, 0x24000001 }, { 0x0c0004db, 0x1400ffff }, { 0x0c0004dc, 0x24000001 }, { 0x0c0004dd, 0x1400ffff }, { 0x0c0004de, 0x24000001 }, { 0x0c0004df, 0x1400ffff }, { 0x0c0004e0, 0x24000001 }, { 0x0c0004e1, 0x1400ffff }, { 0x0c0004e2, 0x24000001 }, { 0x0c0004e3, 0x1400ffff }, { 0x0c0004e4, 0x24000001 }, { 0x0c0004e5, 0x1400ffff }, { 0x0c0004e6, 0x24000001 }, { 0x0c0004e7, 0x1400ffff }, { 0x0c0004e8, 0x24000001 }, { 0x0c0004e9, 0x1400ffff }, { 0x0c0004ea, 0x24000001 }, { 0x0c0004eb, 0x1400ffff }, { 0x0c0004ec, 0x24000001 }, { 0x0c0004ed, 0x1400ffff }, { 0x0c0004ee, 0x24000001 }, { 0x0c0004ef, 0x1400ffff }, { 0x0c0004f0, 0x24000001 }, { 0x0c0004f1, 0x1400ffff }, { 0x0c0004f2, 0x24000001 }, { 0x0c0004f3, 0x1400ffff }, { 0x0c0004f4, 0x24000001 }, { 0x0c0004f5, 0x1400ffff }, { 0x0c0004f6, 0x24000001 }, { 0x0c0004f7, 0x1400ffff }, { 0x0c0004f8, 0x24000001 }, { 0x0c0004f9, 0x1400ffff }, { 0x0c0004fa, 0x24000001 }, { 0x0c0004fb, 0x1400ffff }, { 0x0c0004fc, 0x24000001 }, { 0x0c0004fd, 0x1400ffff }, { 0x0c0004fe, 0x24000001 }, { 0x0c0004ff, 0x1400ffff }, { 0x0c000500, 0x24000001 }, { 0x0c000501, 0x1400ffff }, { 0x0c000502, 0x24000001 }, { 0x0c000503, 0x1400ffff }, { 0x0c000504, 0x24000001 }, { 0x0c000505, 0x1400ffff }, { 0x0c000506, 0x24000001 }, { 0x0c000507, 0x1400ffff }, { 0x0c000508, 0x24000001 }, { 0x0c000509, 0x1400ffff }, { 0x0c00050a, 0x24000001 }, { 0x0c00050b, 0x1400ffff }, { 0x0c00050c, 0x24000001 }, { 0x0c00050d, 0x1400ffff }, { 0x0c00050e, 0x24000001 }, { 0x0c00050f, 0x1400ffff }, { 0x0c000510, 0x24000001 }, { 0x0c000511, 0x1400ffff }, { 0x0c000512, 0x24000001 }, { 0x0c000513, 0x1400ffff }, { 0x01000531, 0x24000030 }, { 0x01000532, 0x24000030 }, { 0x01000533, 0x24000030 }, { 0x01000534, 0x24000030 }, { 0x01000535, 0x24000030 }, { 0x01000536, 0x24000030 }, { 0x01000537, 0x24000030 }, { 0x01000538, 0x24000030 }, { 0x01000539, 0x24000030 }, { 0x0100053a, 0x24000030 }, { 0x0100053b, 0x24000030 }, { 0x0100053c, 0x24000030 }, { 0x0100053d, 0x24000030 }, { 0x0100053e, 0x24000030 }, { 0x0100053f, 0x24000030 }, { 0x01000540, 0x24000030 }, { 0x01000541, 0x24000030 }, { 0x01000542, 0x24000030 }, { 0x01000543, 0x24000030 }, { 0x01000544, 0x24000030 }, { 0x01000545, 0x24000030 }, { 0x01000546, 0x24000030 }, { 0x01000547, 0x24000030 }, { 0x01000548, 0x24000030 }, { 0x01000549, 0x24000030 }, { 0x0100054a, 0x24000030 }, { 0x0100054b, 0x24000030 }, { 0x0100054c, 0x24000030 }, { 0x0100054d, 0x24000030 }, { 0x0100054e, 0x24000030 }, { 0x0100054f, 0x24000030 }, { 0x01000550, 0x24000030 }, { 0x01000551, 0x24000030 }, { 0x01000552, 0x24000030 }, { 0x01000553, 0x24000030 }, { 0x01000554, 0x24000030 }, { 0x01000555, 0x24000030 }, { 0x01000556, 0x24000030 }, { 0x01000559, 0x18000000 }, { 0x0180055a, 0x54000005 }, { 0x01000561, 0x1400ffd0 }, { 0x01000562, 0x1400ffd0 }, { 0x01000563, 0x1400ffd0 }, { 0x01000564, 0x1400ffd0 }, { 0x01000565, 0x1400ffd0 }, { 0x01000566, 0x1400ffd0 }, { 0x01000567, 0x1400ffd0 }, { 0x01000568, 0x1400ffd0 }, { 0x01000569, 0x1400ffd0 }, { 0x0100056a, 0x1400ffd0 }, { 0x0100056b, 0x1400ffd0 }, { 0x0100056c, 0x1400ffd0 }, { 0x0100056d, 0x1400ffd0 }, { 0x0100056e, 0x1400ffd0 }, { 0x0100056f, 0x1400ffd0 }, { 0x01000570, 0x1400ffd0 }, { 0x01000571, 0x1400ffd0 }, { 0x01000572, 0x1400ffd0 }, { 0x01000573, 0x1400ffd0 }, { 0x01000574, 0x1400ffd0 }, { 0x01000575, 0x1400ffd0 }, { 0x01000576, 0x1400ffd0 }, { 0x01000577, 0x1400ffd0 }, { 0x01000578, 0x1400ffd0 }, { 0x01000579, 0x1400ffd0 }, { 0x0100057a, 0x1400ffd0 }, { 0x0100057b, 0x1400ffd0 }, { 0x0100057c, 0x1400ffd0 }, { 0x0100057d, 0x1400ffd0 }, { 0x0100057e, 0x1400ffd0 }, { 0x0100057f, 0x1400ffd0 }, { 0x01000580, 0x1400ffd0 }, { 0x01000581, 0x1400ffd0 }, { 0x01000582, 0x1400ffd0 }, { 0x01000583, 0x1400ffd0 }, { 0x01000584, 0x1400ffd0 }, { 0x01000585, 0x1400ffd0 }, { 0x01000586, 0x1400ffd0 }, { 0x01000587, 0x14000000 }, { 0x09000589, 0x54000000 }, { 0x0100058a, 0x44000000 }, { 0x19800591, 0x3000002c }, { 0x190005be, 0x54000000 }, { 0x190005bf, 0x30000000 }, { 0x190005c0, 0x54000000 }, { 0x198005c1, 0x30000001 }, { 0x190005c3, 0x54000000 }, { 0x198005c4, 0x30000001 }, { 0x190005c6, 0x54000000 }, { 0x190005c7, 0x30000000 }, { 0x198005d0, 0x1c00001a }, { 0x198005f0, 0x1c000002 }, { 0x198005f3, 0x54000001 }, { 0x09800600, 0x04000003 }, { 0x0000060b, 0x5c000000 }, { 0x0980060c, 0x54000001 }, { 0x0080060e, 0x68000001 }, { 0x00800610, 0x30000005 }, { 0x0900061b, 0x54000000 }, { 0x0080061e, 0x54000001 }, { 0x00800621, 0x1c000019 }, { 0x09000640, 0x18000000 }, { 0x00800641, 0x1c000009 }, { 0x1b80064b, 0x30000013 }, { 0x09800660, 0x34000009 }, { 0x0080066a, 0x54000003 }, { 0x0080066e, 0x1c000001 }, { 0x1b000670, 0x30000000 }, { 0x00800671, 0x1c000062 }, { 0x000006d4, 0x54000000 }, { 0x000006d5, 0x1c000000 }, { 0x008006d6, 0x30000006 }, { 0x090006dd, 0x04000000 }, { 0x000006de, 0x2c000000 }, { 0x008006df, 0x30000005 }, { 0x008006e5, 0x18000001 }, { 0x008006e7, 0x30000001 }, { 0x000006e9, 0x68000000 }, { 0x008006ea, 0x30000003 }, { 0x008006ee, 0x1c000001 }, { 0x008006f0, 0x34000009 }, { 0x008006fa, 0x1c000002 }, { 0x008006fd, 0x68000001 }, { 0x000006ff, 0x1c000000 }, { 0x31800700, 0x5400000d }, { 0x3100070f, 0x04000000 }, { 0x31000710, 0x1c000000 }, { 0x31000711, 0x30000000 }, { 0x31800712, 0x1c00001d }, { 0x31800730, 0x3000001a }, { 0x3180074d, 0x1c000020 }, { 0x37800780, 0x1c000025 }, { 0x378007a6, 0x3000000a }, { 0x370007b1, 0x1c000000 }, { 0x3f8007c0, 0x34000009 }, { 0x3f8007ca, 0x1c000020 }, { 0x3f8007eb, 0x30000008 }, { 0x3f8007f4, 0x18000001 }, { 0x3f0007f6, 0x68000000 }, { 0x3f8007f7, 0x54000002 }, { 0x3f0007fa, 0x18000000 }, { 0x0e800901, 0x30000001 }, { 0x0e000903, 0x28000000 }, { 0x0e800904, 0x1c000035 }, { 0x0e00093c, 0x30000000 }, { 0x0e00093d, 0x1c000000 }, { 0x0e80093e, 0x28000002 }, { 0x0e800941, 0x30000007 }, { 0x0e800949, 0x28000003 }, { 0x0e00094d, 0x30000000 }, { 0x0e000950, 0x1c000000 }, { 0x0e800951, 0x30000003 }, { 0x0e800958, 0x1c000009 }, { 0x0e800962, 0x30000001 }, { 0x09800964, 0x54000001 }, { 0x0e800966, 0x34000009 }, { 0x09000970, 0x54000000 }, { 0x0e80097b, 0x1c000004 }, { 0x02000981, 0x30000000 }, { 0x02800982, 0x28000001 }, { 0x02800985, 0x1c000007 }, { 0x0280098f, 0x1c000001 }, { 0x02800993, 0x1c000015 }, { 0x028009aa, 0x1c000006 }, { 0x020009b2, 0x1c000000 }, { 0x028009b6, 0x1c000003 }, { 0x020009bc, 0x30000000 }, { 0x020009bd, 0x1c000000 }, { 0x028009be, 0x28000002 }, { 0x028009c1, 0x30000003 }, { 0x028009c7, 0x28000001 }, { 0x028009cb, 0x28000001 }, { 0x020009cd, 0x30000000 }, { 0x020009ce, 0x1c000000 }, { 0x020009d7, 0x28000000 }, { 0x028009dc, 0x1c000001 }, { 0x028009df, 0x1c000002 }, { 0x028009e2, 0x30000001 }, { 0x028009e6, 0x34000009 }, { 0x028009f0, 0x1c000001 }, { 0x028009f2, 0x5c000001 }, { 0x028009f4, 0x3c000005 }, { 0x020009fa, 0x68000000 }, { 0x15800a01, 0x30000001 }, { 0x15000a03, 0x28000000 }, { 0x15800a05, 0x1c000005 }, { 0x15800a0f, 0x1c000001 }, { 0x15800a13, 0x1c000015 }, { 0x15800a2a, 0x1c000006 }, { 0x15800a32, 0x1c000001 }, { 0x15800a35, 0x1c000001 }, { 0x15800a38, 0x1c000001 }, { 0x15000a3c, 0x30000000 }, { 0x15800a3e, 0x28000002 }, { 0x15800a41, 0x30000001 }, { 0x15800a47, 0x30000001 }, { 0x15800a4b, 0x30000002 }, { 0x15800a59, 0x1c000003 }, { 0x15000a5e, 0x1c000000 }, { 0x15800a66, 0x34000009 }, { 0x15800a70, 0x30000001 }, { 0x15800a72, 0x1c000002 }, { 0x14800a81, 0x30000001 }, { 0x14000a83, 0x28000000 }, { 0x14800a85, 0x1c000008 }, { 0x14800a8f, 0x1c000002 }, { 0x14800a93, 0x1c000015 }, { 0x14800aaa, 0x1c000006 }, { 0x14800ab2, 0x1c000001 }, { 0x14800ab5, 0x1c000004 }, { 0x14000abc, 0x30000000 }, { 0x14000abd, 0x1c000000 }, { 0x14800abe, 0x28000002 }, { 0x14800ac1, 0x30000004 }, { 0x14800ac7, 0x30000001 }, { 0x14000ac9, 0x28000000 }, { 0x14800acb, 0x28000001 }, { 0x14000acd, 0x30000000 }, { 0x14000ad0, 0x1c000000 }, { 0x14800ae0, 0x1c000001 }, { 0x14800ae2, 0x30000001 }, { 0x14800ae6, 0x34000009 }, { 0x14000af1, 0x5c000000 }, { 0x2b000b01, 0x30000000 }, { 0x2b800b02, 0x28000001 }, { 0x2b800b05, 0x1c000007 }, { 0x2b800b0f, 0x1c000001 }, { 0x2b800b13, 0x1c000015 }, { 0x2b800b2a, 0x1c000006 }, { 0x2b800b32, 0x1c000001 }, { 0x2b800b35, 0x1c000004 }, { 0x2b000b3c, 0x30000000 }, { 0x2b000b3d, 0x1c000000 }, { 0x2b000b3e, 0x28000000 }, { 0x2b000b3f, 0x30000000 }, { 0x2b000b40, 0x28000000 }, { 0x2b800b41, 0x30000002 }, { 0x2b800b47, 0x28000001 }, { 0x2b800b4b, 0x28000001 }, { 0x2b000b4d, 0x30000000 }, { 0x2b000b56, 0x30000000 }, { 0x2b000b57, 0x28000000 }, { 0x2b800b5c, 0x1c000001 }, { 0x2b800b5f, 0x1c000002 }, { 0x2b800b66, 0x34000009 }, { 0x2b000b70, 0x68000000 }, { 0x2b000b71, 0x1c000000 }, { 0x35000b82, 0x30000000 }, { 0x35000b83, 0x1c000000 }, { 0x35800b85, 0x1c000005 }, { 0x35800b8e, 0x1c000002 }, { 0x35800b92, 0x1c000003 }, { 0x35800b99, 0x1c000001 }, { 0x35000b9c, 0x1c000000 }, { 0x35800b9e, 0x1c000001 }, { 0x35800ba3, 0x1c000001 }, { 0x35800ba8, 0x1c000002 }, { 0x35800bae, 0x1c00000b }, { 0x35800bbe, 0x28000001 }, { 0x35000bc0, 0x30000000 }, { 0x35800bc1, 0x28000001 }, { 0x35800bc6, 0x28000002 }, { 0x35800bca, 0x28000002 }, { 0x35000bcd, 0x30000000 }, { 0x35000bd7, 0x28000000 }, { 0x35800be6, 0x34000009 }, { 0x35800bf0, 0x3c000002 }, { 0x35800bf3, 0x68000005 }, { 0x35000bf9, 0x5c000000 }, { 0x35000bfa, 0x68000000 }, { 0x36800c01, 0x28000002 }, { 0x36800c05, 0x1c000007 }, { 0x36800c0e, 0x1c000002 }, { 0x36800c12, 0x1c000016 }, { 0x36800c2a, 0x1c000009 }, { 0x36800c35, 0x1c000004 }, { 0x36800c3e, 0x30000002 }, { 0x36800c41, 0x28000003 }, { 0x36800c46, 0x30000002 }, { 0x36800c4a, 0x30000003 }, { 0x36800c55, 0x30000001 }, { 0x36800c60, 0x1c000001 }, { 0x36800c66, 0x34000009 }, { 0x1c800c82, 0x28000001 }, { 0x1c800c85, 0x1c000007 }, { 0x1c800c8e, 0x1c000002 }, { 0x1c800c92, 0x1c000016 }, { 0x1c800caa, 0x1c000009 }, { 0x1c800cb5, 0x1c000004 }, { 0x1c000cbc, 0x30000000 }, { 0x1c000cbd, 0x1c000000 }, { 0x1c000cbe, 0x28000000 }, { 0x1c000cbf, 0x30000000 }, { 0x1c800cc0, 0x28000004 }, { 0x1c000cc6, 0x30000000 }, { 0x1c800cc7, 0x28000001 }, { 0x1c800cca, 0x28000001 }, { 0x1c800ccc, 0x30000001 }, { 0x1c800cd5, 0x28000001 }, { 0x1c000cde, 0x1c000000 }, { 0x1c800ce0, 0x1c000001 }, { 0x1c800ce2, 0x30000001 }, { 0x1c800ce6, 0x34000009 }, { 0x1c800cf1, 0x68000001 }, { 0x24800d02, 0x28000001 }, { 0x24800d05, 0x1c000007 }, { 0x24800d0e, 0x1c000002 }, { 0x24800d12, 0x1c000016 }, { 0x24800d2a, 0x1c00000f }, { 0x24800d3e, 0x28000002 }, { 0x24800d41, 0x30000002 }, { 0x24800d46, 0x28000002 }, { 0x24800d4a, 0x28000002 }, { 0x24000d4d, 0x30000000 }, { 0x24000d57, 0x28000000 }, { 0x24800d60, 0x1c000001 }, { 0x24800d66, 0x34000009 }, { 0x2f800d82, 0x28000001 }, { 0x2f800d85, 0x1c000011 }, { 0x2f800d9a, 0x1c000017 }, { 0x2f800db3, 0x1c000008 }, { 0x2f000dbd, 0x1c000000 }, { 0x2f800dc0, 0x1c000006 }, { 0x2f000dca, 0x30000000 }, { 0x2f800dcf, 0x28000002 }, { 0x2f800dd2, 0x30000002 }, { 0x2f000dd6, 0x30000000 }, { 0x2f800dd8, 0x28000007 }, { 0x2f800df2, 0x28000001 }, { 0x2f000df4, 0x54000000 }, { 0x38800e01, 0x1c00002f }, { 0x38000e31, 0x30000000 }, { 0x38800e32, 0x1c000001 }, { 0x38800e34, 0x30000006 }, { 0x09000e3f, 0x5c000000 }, { 0x38800e40, 0x1c000005 }, { 0x38000e46, 0x18000000 }, { 0x38800e47, 0x30000007 }, { 0x38000e4f, 0x54000000 }, { 0x38800e50, 0x34000009 }, { 0x38800e5a, 0x54000001 }, { 0x20800e81, 0x1c000001 }, { 0x20000e84, 0x1c000000 }, { 0x20800e87, 0x1c000001 }, { 0x20000e8a, 0x1c000000 }, { 0x20000e8d, 0x1c000000 }, { 0x20800e94, 0x1c000003 }, { 0x20800e99, 0x1c000006 }, { 0x20800ea1, 0x1c000002 }, { 0x20000ea5, 0x1c000000 }, { 0x20000ea7, 0x1c000000 }, { 0x20800eaa, 0x1c000001 }, { 0x20800ead, 0x1c000003 }, { 0x20000eb1, 0x30000000 }, { 0x20800eb2, 0x1c000001 }, { 0x20800eb4, 0x30000005 }, { 0x20800ebb, 0x30000001 }, { 0x20000ebd, 0x1c000000 }, { 0x20800ec0, 0x1c000004 }, { 0x20000ec6, 0x18000000 }, { 0x20800ec8, 0x30000005 }, { 0x20800ed0, 0x34000009 }, { 0x20800edc, 0x1c000001 }, { 0x39000f00, 0x1c000000 }, { 0x39800f01, 0x68000002 }, { 0x39800f04, 0x5400000e }, { 0x39800f13, 0x68000004 }, { 0x39800f18, 0x30000001 }, { 0x39800f1a, 0x68000005 }, { 0x39800f20, 0x34000009 }, { 0x39800f2a, 0x3c000009 }, { 0x39000f34, 0x68000000 }, { 0x39000f35, 0x30000000 }, { 0x39000f36, 0x68000000 }, { 0x39000f37, 0x30000000 }, { 0x39000f38, 0x68000000 }, { 0x39000f39, 0x30000000 }, { 0x39000f3a, 0x58000000 }, { 0x39000f3b, 0x48000000 }, { 0x39000f3c, 0x58000000 }, { 0x39000f3d, 0x48000000 }, { 0x39800f3e, 0x28000001 }, { 0x39800f40, 0x1c000007 }, { 0x39800f49, 0x1c000021 }, { 0x39800f71, 0x3000000d }, { 0x39000f7f, 0x28000000 }, { 0x39800f80, 0x30000004 }, { 0x39000f85, 0x54000000 }, { 0x39800f86, 0x30000001 }, { 0x39800f88, 0x1c000003 }, { 0x39800f90, 0x30000007 }, { 0x39800f99, 0x30000023 }, { 0x39800fbe, 0x68000007 }, { 0x39000fc6, 0x30000000 }, { 0x39800fc7, 0x68000005 }, { 0x39000fcf, 0x68000000 }, { 0x39800fd0, 0x54000001 }, { 0x26801000, 0x1c000021 }, { 0x26801023, 0x1c000004 }, { 0x26801029, 0x1c000001 }, { 0x2600102c, 0x28000000 }, { 0x2680102d, 0x30000003 }, { 0x26001031, 0x28000000 }, { 0x26001032, 0x30000000 }, { 0x26801036, 0x30000001 }, { 0x26001038, 0x28000000 }, { 0x26001039, 0x30000000 }, { 0x26801040, 0x34000009 }, { 0x2680104a, 0x54000005 }, { 0x26801050, 0x1c000005 }, { 0x26801056, 0x28000001 }, { 0x26801058, 0x30000001 }, { 0x100010a0, 0x24001c60 }, { 0x100010a1, 0x24001c60 }, { 0x100010a2, 0x24001c60 }, { 0x100010a3, 0x24001c60 }, { 0x100010a4, 0x24001c60 }, { 0x100010a5, 0x24001c60 }, { 0x100010a6, 0x24001c60 }, { 0x100010a7, 0x24001c60 }, { 0x100010a8, 0x24001c60 }, { 0x100010a9, 0x24001c60 }, { 0x100010aa, 0x24001c60 }, { 0x100010ab, 0x24001c60 }, { 0x100010ac, 0x24001c60 }, { 0x100010ad, 0x24001c60 }, { 0x100010ae, 0x24001c60 }, { 0x100010af, 0x24001c60 }, { 0x100010b0, 0x24001c60 }, { 0x100010b1, 0x24001c60 }, { 0x100010b2, 0x24001c60 }, { 0x100010b3, 0x24001c60 }, { 0x100010b4, 0x24001c60 }, { 0x100010b5, 0x24001c60 }, { 0x100010b6, 0x24001c60 }, { 0x100010b7, 0x24001c60 }, { 0x100010b8, 0x24001c60 }, { 0x100010b9, 0x24001c60 }, { 0x100010ba, 0x24001c60 }, { 0x100010bb, 0x24001c60 }, { 0x100010bc, 0x24001c60 }, { 0x100010bd, 0x24001c60 }, { 0x100010be, 0x24001c60 }, { 0x100010bf, 0x24001c60 }, { 0x100010c0, 0x24001c60 }, { 0x100010c1, 0x24001c60 }, { 0x100010c2, 0x24001c60 }, { 0x100010c3, 0x24001c60 }, { 0x100010c4, 0x24001c60 }, { 0x100010c5, 0x24001c60 }, { 0x108010d0, 0x1c00002a }, { 0x090010fb, 0x54000000 }, { 0x100010fc, 0x18000000 }, { 0x17801100, 0x1c000059 }, { 0x1780115f, 0x1c000043 }, { 0x178011a8, 0x1c000051 }, { 0x0f801200, 0x1c000048 }, { 0x0f80124a, 0x1c000003 }, { 0x0f801250, 0x1c000006 }, { 0x0f001258, 0x1c000000 }, { 0x0f80125a, 0x1c000003 }, { 0x0f801260, 0x1c000028 }, { 0x0f80128a, 0x1c000003 }, { 0x0f801290, 0x1c000020 }, { 0x0f8012b2, 0x1c000003 }, { 0x0f8012b8, 0x1c000006 }, { 0x0f0012c0, 0x1c000000 }, { 0x0f8012c2, 0x1c000003 }, { 0x0f8012c8, 0x1c00000e }, { 0x0f8012d8, 0x1c000038 }, { 0x0f801312, 0x1c000003 }, { 0x0f801318, 0x1c000042 }, { 0x0f00135f, 0x30000000 }, { 0x0f001360, 0x68000000 }, { 0x0f801361, 0x54000007 }, { 0x0f801369, 0x3c000013 }, { 0x0f801380, 0x1c00000f }, { 0x0f801390, 0x68000009 }, { 0x088013a0, 0x1c000054 }, { 0x07801401, 0x1c00026b }, { 0x0780166d, 0x54000001 }, { 0x0780166f, 0x1c000007 }, { 0x28001680, 0x74000000 }, { 0x28801681, 0x1c000019 }, { 0x2800169b, 0x58000000 }, { 0x2800169c, 0x48000000 }, { 0x2d8016a0, 0x1c00004a }, { 0x098016eb, 0x54000002 }, { 0x2d8016ee, 0x38000002 }, { 0x32801700, 0x1c00000c }, { 0x3280170e, 0x1c000003 }, { 0x32801712, 0x30000002 }, { 0x18801720, 0x1c000011 }, { 0x18801732, 0x30000002 }, { 0x09801735, 0x54000001 }, { 0x06801740, 0x1c000011 }, { 0x06801752, 0x30000001 }, { 0x33801760, 0x1c00000c }, { 0x3380176e, 0x1c000002 }, { 0x33801772, 0x30000001 }, { 0x1f801780, 0x1c000033 }, { 0x1f8017b4, 0x04000001 }, { 0x1f0017b6, 0x28000000 }, { 0x1f8017b7, 0x30000006 }, { 0x1f8017be, 0x28000007 }, { 0x1f0017c6, 0x30000000 }, { 0x1f8017c7, 0x28000001 }, { 0x1f8017c9, 0x3000000a }, { 0x1f8017d4, 0x54000002 }, { 0x1f0017d7, 0x18000000 }, { 0x1f8017d8, 0x54000002 }, { 0x1f0017db, 0x5c000000 }, { 0x1f0017dc, 0x1c000000 }, { 0x1f0017dd, 0x30000000 }, { 0x1f8017e0, 0x34000009 }, { 0x1f8017f0, 0x3c000009 }, { 0x25801800, 0x54000005 }, { 0x25001806, 0x44000000 }, { 0x25801807, 0x54000003 }, { 0x2580180b, 0x30000002 }, { 0x2500180e, 0x74000000 }, { 0x25801810, 0x34000009 }, { 0x25801820, 0x1c000022 }, { 0x25001843, 0x18000000 }, { 0x25801844, 0x1c000033 }, { 0x25801880, 0x1c000028 }, { 0x250018a9, 0x30000000 }, { 0x22801900, 0x1c00001c }, { 0x22801920, 0x30000002 }, { 0x22801923, 0x28000003 }, { 0x22801927, 0x30000001 }, { 0x22801929, 0x28000002 }, { 0x22801930, 0x28000001 }, { 0x22001932, 0x30000000 }, { 0x22801933, 0x28000005 }, { 0x22801939, 0x30000002 }, { 0x22001940, 0x68000000 }, { 0x22801944, 0x54000001 }, { 0x22801946, 0x34000009 }, { 0x34801950, 0x1c00001d }, { 0x34801970, 0x1c000004 }, { 0x27801980, 0x1c000029 }, { 0x278019b0, 0x28000010 }, { 0x278019c1, 0x1c000006 }, { 0x278019c8, 0x28000001 }, { 0x278019d0, 0x34000009 }, { 0x278019de, 0x54000001 }, { 0x1f8019e0, 0x6800001f }, { 0x05801a00, 0x1c000016 }, { 0x05801a17, 0x30000001 }, { 0x05801a19, 0x28000002 }, { 0x05801a1e, 0x54000001 }, { 0x3d801b00, 0x30000003 }, { 0x3d001b04, 0x28000000 }, { 0x3d801b05, 0x1c00002e }, { 0x3d001b34, 0x30000000 }, { 0x3d001b35, 0x28000000 }, { 0x3d801b36, 0x30000004 }, { 0x3d001b3b, 0x28000000 }, { 0x3d001b3c, 0x30000000 }, { 0x3d801b3d, 0x28000004 }, { 0x3d001b42, 0x30000000 }, { 0x3d801b43, 0x28000001 }, { 0x3d801b45, 0x1c000006 }, { 0x3d801b50, 0x34000009 }, { 0x3d801b5a, 0x54000006 }, { 0x3d801b61, 0x68000009 }, { 0x3d801b6b, 0x30000008 }, { 0x3d801b74, 0x68000008 }, { 0x21801d00, 0x1400002b }, { 0x21801d2c, 0x18000035 }, { 0x21801d62, 0x14000015 }, { 0x0c001d78, 0x18000000 }, { 0x21801d79, 0x14000003 }, { 0x21001d7d, 0x14000ee6 }, { 0x21801d7e, 0x1400001c }, { 0x21801d9b, 0x18000024 }, { 0x1b801dc0, 0x3000000a }, { 0x1b801dfe, 0x30000001 }, { 0x21001e00, 0x24000001 }, { 0x21001e01, 0x1400ffff }, { 0x21001e02, 0x24000001 }, { 0x21001e03, 0x1400ffff }, { 0x21001e04, 0x24000001 }, { 0x21001e05, 0x1400ffff }, { 0x21001e06, 0x24000001 }, { 0x21001e07, 0x1400ffff }, { 0x21001e08, 0x24000001 }, { 0x21001e09, 0x1400ffff }, { 0x21001e0a, 0x24000001 }, { 0x21001e0b, 0x1400ffff }, { 0x21001e0c, 0x24000001 }, { 0x21001e0d, 0x1400ffff }, { 0x21001e0e, 0x24000001 }, { 0x21001e0f, 0x1400ffff }, { 0x21001e10, 0x24000001 }, { 0x21001e11, 0x1400ffff }, { 0x21001e12, 0x24000001 }, { 0x21001e13, 0x1400ffff }, { 0x21001e14, 0x24000001 }, { 0x21001e15, 0x1400ffff }, { 0x21001e16, 0x24000001 }, { 0x21001e17, 0x1400ffff }, { 0x21001e18, 0x24000001 }, { 0x21001e19, 0x1400ffff }, { 0x21001e1a, 0x24000001 }, { 0x21001e1b, 0x1400ffff }, { 0x21001e1c, 0x24000001 }, { 0x21001e1d, 0x1400ffff }, { 0x21001e1e, 0x24000001 }, { 0x21001e1f, 0x1400ffff }, { 0x21001e20, 0x24000001 }, { 0x21001e21, 0x1400ffff }, { 0x21001e22, 0x24000001 }, { 0x21001e23, 0x1400ffff }, { 0x21001e24, 0x24000001 }, { 0x21001e25, 0x1400ffff }, { 0x21001e26, 0x24000001 }, { 0x21001e27, 0x1400ffff }, { 0x21001e28, 0x24000001 }, { 0x21001e29, 0x1400ffff }, { 0x21001e2a, 0x24000001 }, { 0x21001e2b, 0x1400ffff }, { 0x21001e2c, 0x24000001 }, { 0x21001e2d, 0x1400ffff }, { 0x21001e2e, 0x24000001 }, { 0x21001e2f, 0x1400ffff }, { 0x21001e30, 0x24000001 }, { 0x21001e31, 0x1400ffff }, { 0x21001e32, 0x24000001 }, { 0x21001e33, 0x1400ffff }, { 0x21001e34, 0x24000001 }, { 0x21001e35, 0x1400ffff }, { 0x21001e36, 0x24000001 }, { 0x21001e37, 0x1400ffff }, { 0x21001e38, 0x24000001 }, { 0x21001e39, 0x1400ffff }, { 0x21001e3a, 0x24000001 }, { 0x21001e3b, 0x1400ffff }, { 0x21001e3c, 0x24000001 }, { 0x21001e3d, 0x1400ffff }, { 0x21001e3e, 0x24000001 }, { 0x21001e3f, 0x1400ffff }, { 0x21001e40, 0x24000001 }, { 0x21001e41, 0x1400ffff }, { 0x21001e42, 0x24000001 }, { 0x21001e43, 0x1400ffff }, { 0x21001e44, 0x24000001 }, { 0x21001e45, 0x1400ffff }, { 0x21001e46, 0x24000001 }, { 0x21001e47, 0x1400ffff }, { 0x21001e48, 0x24000001 }, { 0x21001e49, 0x1400ffff }, { 0x21001e4a, 0x24000001 }, { 0x21001e4b, 0x1400ffff }, { 0x21001e4c, 0x24000001 }, { 0x21001e4d, 0x1400ffff }, { 0x21001e4e, 0x24000001 }, { 0x21001e4f, 0x1400ffff }, { 0x21001e50, 0x24000001 }, { 0x21001e51, 0x1400ffff }, { 0x21001e52, 0x24000001 }, { 0x21001e53, 0x1400ffff }, { 0x21001e54, 0x24000001 }, { 0x21001e55, 0x1400ffff }, { 0x21001e56, 0x24000001 }, { 0x21001e57, 0x1400ffff }, { 0x21001e58, 0x24000001 }, { 0x21001e59, 0x1400ffff }, { 0x21001e5a, 0x24000001 }, { 0x21001e5b, 0x1400ffff }, { 0x21001e5c, 0x24000001 }, { 0x21001e5d, 0x1400ffff }, { 0x21001e5e, 0x24000001 }, { 0x21001e5f, 0x1400ffff }, { 0x21001e60, 0x24000001 }, { 0x21001e61, 0x1400ffff }, { 0x21001e62, 0x24000001 }, { 0x21001e63, 0x1400ffff }, { 0x21001e64, 0x24000001 }, { 0x21001e65, 0x1400ffff }, { 0x21001e66, 0x24000001 }, { 0x21001e67, 0x1400ffff }, { 0x21001e68, 0x24000001 }, { 0x21001e69, 0x1400ffff }, { 0x21001e6a, 0x24000001 }, { 0x21001e6b, 0x1400ffff }, { 0x21001e6c, 0x24000001 }, { 0x21001e6d, 0x1400ffff }, { 0x21001e6e, 0x24000001 }, { 0x21001e6f, 0x1400ffff }, { 0x21001e70, 0x24000001 }, { 0x21001e71, 0x1400ffff }, { 0x21001e72, 0x24000001 }, { 0x21001e73, 0x1400ffff }, { 0x21001e74, 0x24000001 }, { 0x21001e75, 0x1400ffff }, { 0x21001e76, 0x24000001 }, { 0x21001e77, 0x1400ffff }, { 0x21001e78, 0x24000001 }, { 0x21001e79, 0x1400ffff }, { 0x21001e7a, 0x24000001 }, { 0x21001e7b, 0x1400ffff }, { 0x21001e7c, 0x24000001 }, { 0x21001e7d, 0x1400ffff }, { 0x21001e7e, 0x24000001 }, { 0x21001e7f, 0x1400ffff }, { 0x21001e80, 0x24000001 }, { 0x21001e81, 0x1400ffff }, { 0x21001e82, 0x24000001 }, { 0x21001e83, 0x1400ffff }, { 0x21001e84, 0x24000001 }, { 0x21001e85, 0x1400ffff }, { 0x21001e86, 0x24000001 }, { 0x21001e87, 0x1400ffff }, { 0x21001e88, 0x24000001 }, { 0x21001e89, 0x1400ffff }, { 0x21001e8a, 0x24000001 }, { 0x21001e8b, 0x1400ffff }, { 0x21001e8c, 0x24000001 }, { 0x21001e8d, 0x1400ffff }, { 0x21001e8e, 0x24000001 }, { 0x21001e8f, 0x1400ffff }, { 0x21001e90, 0x24000001 }, { 0x21001e91, 0x1400ffff }, { 0x21001e92, 0x24000001 }, { 0x21001e93, 0x1400ffff }, { 0x21001e94, 0x24000001 }, { 0x21001e95, 0x1400ffff }, { 0x21801e96, 0x14000004 }, { 0x21001e9b, 0x1400ffc5 }, { 0x21001ea0, 0x24000001 }, { 0x21001ea1, 0x1400ffff }, { 0x21001ea2, 0x24000001 }, { 0x21001ea3, 0x1400ffff }, { 0x21001ea4, 0x24000001 }, { 0x21001ea5, 0x1400ffff }, { 0x21001ea6, 0x24000001 }, { 0x21001ea7, 0x1400ffff }, { 0x21001ea8, 0x24000001 }, { 0x21001ea9, 0x1400ffff }, { 0x21001eaa, 0x24000001 }, { 0x21001eab, 0x1400ffff }, { 0x21001eac, 0x24000001 }, { 0x21001ead, 0x1400ffff }, { 0x21001eae, 0x24000001 }, { 0x21001eaf, 0x1400ffff }, { 0x21001eb0, 0x24000001 }, { 0x21001eb1, 0x1400ffff }, { 0x21001eb2, 0x24000001 }, { 0x21001eb3, 0x1400ffff }, { 0x21001eb4, 0x24000001 }, { 0x21001eb5, 0x1400ffff }, { 0x21001eb6, 0x24000001 }, { 0x21001eb7, 0x1400ffff }, { 0x21001eb8, 0x24000001 }, { 0x21001eb9, 0x1400ffff }, { 0x21001eba, 0x24000001 }, { 0x21001ebb, 0x1400ffff }, { 0x21001ebc, 0x24000001 }, { 0x21001ebd, 0x1400ffff }, { 0x21001ebe, 0x24000001 }, { 0x21001ebf, 0x1400ffff }, { 0x21001ec0, 0x24000001 }, { 0x21001ec1, 0x1400ffff }, { 0x21001ec2, 0x24000001 }, { 0x21001ec3, 0x1400ffff }, { 0x21001ec4, 0x24000001 }, { 0x21001ec5, 0x1400ffff }, { 0x21001ec6, 0x24000001 }, { 0x21001ec7, 0x1400ffff }, { 0x21001ec8, 0x24000001 }, { 0x21001ec9, 0x1400ffff }, { 0x21001eca, 0x24000001 }, { 0x21001ecb, 0x1400ffff }, { 0x21001ecc, 0x24000001 }, { 0x21001ecd, 0x1400ffff }, { 0x21001ece, 0x24000001 }, { 0x21001ecf, 0x1400ffff }, { 0x21001ed0, 0x24000001 }, { 0x21001ed1, 0x1400ffff }, { 0x21001ed2, 0x24000001 }, { 0x21001ed3, 0x1400ffff }, { 0x21001ed4, 0x24000001 }, { 0x21001ed5, 0x1400ffff }, { 0x21001ed6, 0x24000001 }, { 0x21001ed7, 0x1400ffff }, { 0x21001ed8, 0x24000001 }, { 0x21001ed9, 0x1400ffff }, { 0x21001eda, 0x24000001 }, { 0x21001edb, 0x1400ffff }, { 0x21001edc, 0x24000001 }, { 0x21001edd, 0x1400ffff }, { 0x21001ede, 0x24000001 }, { 0x21001edf, 0x1400ffff }, { 0x21001ee0, 0x24000001 }, { 0x21001ee1, 0x1400ffff }, { 0x21001ee2, 0x24000001 }, { 0x21001ee3, 0x1400ffff }, { 0x21001ee4, 0x24000001 }, { 0x21001ee5, 0x1400ffff }, { 0x21001ee6, 0x24000001 }, { 0x21001ee7, 0x1400ffff }, { 0x21001ee8, 0x24000001 }, { 0x21001ee9, 0x1400ffff }, { 0x21001eea, 0x24000001 }, { 0x21001eeb, 0x1400ffff }, { 0x21001eec, 0x24000001 }, { 0x21001eed, 0x1400ffff }, { 0x21001eee, 0x24000001 }, { 0x21001eef, 0x1400ffff }, { 0x21001ef0, 0x24000001 }, { 0x21001ef1, 0x1400ffff }, { 0x21001ef2, 0x24000001 }, { 0x21001ef3, 0x1400ffff }, { 0x21001ef4, 0x24000001 }, { 0x21001ef5, 0x1400ffff }, { 0x21001ef6, 0x24000001 }, { 0x21001ef7, 0x1400ffff }, { 0x21001ef8, 0x24000001 }, { 0x21001ef9, 0x1400ffff }, { 0x13001f00, 0x14000008 }, { 0x13001f01, 0x14000008 }, { 0x13001f02, 0x14000008 }, { 0x13001f03, 0x14000008 }, { 0x13001f04, 0x14000008 }, { 0x13001f05, 0x14000008 }, { 0x13001f06, 0x14000008 }, { 0x13001f07, 0x14000008 }, { 0x13001f08, 0x2400fff8 }, { 0x13001f09, 0x2400fff8 }, { 0x13001f0a, 0x2400fff8 }, { 0x13001f0b, 0x2400fff8 }, { 0x13001f0c, 0x2400fff8 }, { 0x13001f0d, 0x2400fff8 }, { 0x13001f0e, 0x2400fff8 }, { 0x13001f0f, 0x2400fff8 }, { 0x13001f10, 0x14000008 }, { 0x13001f11, 0x14000008 }, { 0x13001f12, 0x14000008 }, { 0x13001f13, 0x14000008 }, { 0x13001f14, 0x14000008 }, { 0x13001f15, 0x14000008 }, { 0x13001f18, 0x2400fff8 }, { 0x13001f19, 0x2400fff8 }, { 0x13001f1a, 0x2400fff8 }, { 0x13001f1b, 0x2400fff8 }, { 0x13001f1c, 0x2400fff8 }, { 0x13001f1d, 0x2400fff8 }, { 0x13001f20, 0x14000008 }, { 0x13001f21, 0x14000008 }, { 0x13001f22, 0x14000008 }, { 0x13001f23, 0x14000008 }, { 0x13001f24, 0x14000008 }, { 0x13001f25, 0x14000008 }, { 0x13001f26, 0x14000008 }, { 0x13001f27, 0x14000008 }, { 0x13001f28, 0x2400fff8 }, { 0x13001f29, 0x2400fff8 }, { 0x13001f2a, 0x2400fff8 }, { 0x13001f2b, 0x2400fff8 }, { 0x13001f2c, 0x2400fff8 }, { 0x13001f2d, 0x2400fff8 }, { 0x13001f2e, 0x2400fff8 }, { 0x13001f2f, 0x2400fff8 }, { 0x13001f30, 0x14000008 }, { 0x13001f31, 0x14000008 }, { 0x13001f32, 0x14000008 }, { 0x13001f33, 0x14000008 }, { 0x13001f34, 0x14000008 }, { 0x13001f35, 0x14000008 }, { 0x13001f36, 0x14000008 }, { 0x13001f37, 0x14000008 }, { 0x13001f38, 0x2400fff8 }, { 0x13001f39, 0x2400fff8 }, { 0x13001f3a, 0x2400fff8 }, { 0x13001f3b, 0x2400fff8 }, { 0x13001f3c, 0x2400fff8 }, { 0x13001f3d, 0x2400fff8 }, { 0x13001f3e, 0x2400fff8 }, { 0x13001f3f, 0x2400fff8 }, { 0x13001f40, 0x14000008 }, { 0x13001f41, 0x14000008 }, { 0x13001f42, 0x14000008 }, { 0x13001f43, 0x14000008 }, { 0x13001f44, 0x14000008 }, { 0x13001f45, 0x14000008 }, { 0x13001f48, 0x2400fff8 }, { 0x13001f49, 0x2400fff8 }, { 0x13001f4a, 0x2400fff8 }, { 0x13001f4b, 0x2400fff8 }, { 0x13001f4c, 0x2400fff8 }, { 0x13001f4d, 0x2400fff8 }, { 0x13001f50, 0x14000000 }, { 0x13001f51, 0x14000008 }, { 0x13001f52, 0x14000000 }, { 0x13001f53, 0x14000008 }, { 0x13001f54, 0x14000000 }, { 0x13001f55, 0x14000008 }, { 0x13001f56, 0x14000000 }, { 0x13001f57, 0x14000008 }, { 0x13001f59, 0x2400fff8 }, { 0x13001f5b, 0x2400fff8 }, { 0x13001f5d, 0x2400fff8 }, { 0x13001f5f, 0x2400fff8 }, { 0x13001f60, 0x14000008 }, { 0x13001f61, 0x14000008 }, { 0x13001f62, 0x14000008 }, { 0x13001f63, 0x14000008 }, { 0x13001f64, 0x14000008 }, { 0x13001f65, 0x14000008 }, { 0x13001f66, 0x14000008 }, { 0x13001f67, 0x14000008 }, { 0x13001f68, 0x2400fff8 }, { 0x13001f69, 0x2400fff8 }, { 0x13001f6a, 0x2400fff8 }, { 0x13001f6b, 0x2400fff8 }, { 0x13001f6c, 0x2400fff8 }, { 0x13001f6d, 0x2400fff8 }, { 0x13001f6e, 0x2400fff8 }, { 0x13001f6f, 0x2400fff8 }, { 0x13001f70, 0x1400004a }, { 0x13001f71, 0x1400004a }, { 0x13001f72, 0x14000056 }, { 0x13001f73, 0x14000056 }, { 0x13001f74, 0x14000056 }, { 0x13001f75, 0x14000056 }, { 0x13001f76, 0x14000064 }, { 0x13001f77, 0x14000064 }, { 0x13001f78, 0x14000080 }, { 0x13001f79, 0x14000080 }, { 0x13001f7a, 0x14000070 }, { 0x13001f7b, 0x14000070 }, { 0x13001f7c, 0x1400007e }, { 0x13001f7d, 0x1400007e }, { 0x13001f80, 0x14000008 }, { 0x13001f81, 0x14000008 }, { 0x13001f82, 0x14000008 }, { 0x13001f83, 0x14000008 }, { 0x13001f84, 0x14000008 }, { 0x13001f85, 0x14000008 }, { 0x13001f86, 0x14000008 }, { 0x13001f87, 0x14000008 }, { 0x13001f88, 0x2000fff8 }, { 0x13001f89, 0x2000fff8 }, { 0x13001f8a, 0x2000fff8 }, { 0x13001f8b, 0x2000fff8 }, { 0x13001f8c, 0x2000fff8 }, { 0x13001f8d, 0x2000fff8 }, { 0x13001f8e, 0x2000fff8 }, { 0x13001f8f, 0x2000fff8 }, { 0x13001f90, 0x14000008 }, { 0x13001f91, 0x14000008 }, { 0x13001f92, 0x14000008 }, { 0x13001f93, 0x14000008 }, { 0x13001f94, 0x14000008 }, { 0x13001f95, 0x14000008 }, { 0x13001f96, 0x14000008 }, { 0x13001f97, 0x14000008 }, { 0x13001f98, 0x2000fff8 }, { 0x13001f99, 0x2000fff8 }, { 0x13001f9a, 0x2000fff8 }, { 0x13001f9b, 0x2000fff8 }, { 0x13001f9c, 0x2000fff8 }, { 0x13001f9d, 0x2000fff8 }, { 0x13001f9e, 0x2000fff8 }, { 0x13001f9f, 0x2000fff8 }, { 0x13001fa0, 0x14000008 }, { 0x13001fa1, 0x14000008 }, { 0x13001fa2, 0x14000008 }, { 0x13001fa3, 0x14000008 }, { 0x13001fa4, 0x14000008 }, { 0x13001fa5, 0x14000008 }, { 0x13001fa6, 0x14000008 }, { 0x13001fa7, 0x14000008 }, { 0x13001fa8, 0x2000fff8 }, { 0x13001fa9, 0x2000fff8 }, { 0x13001faa, 0x2000fff8 }, { 0x13001fab, 0x2000fff8 }, { 0x13001fac, 0x2000fff8 }, { 0x13001fad, 0x2000fff8 }, { 0x13001fae, 0x2000fff8 }, { 0x13001faf, 0x2000fff8 }, { 0x13001fb0, 0x14000008 }, { 0x13001fb1, 0x14000008 }, { 0x13001fb2, 0x14000000 }, { 0x13001fb3, 0x14000009 }, { 0x13001fb4, 0x14000000 }, { 0x13801fb6, 0x14000001 }, { 0x13001fb8, 0x2400fff8 }, { 0x13001fb9, 0x2400fff8 }, { 0x13001fba, 0x2400ffb6 }, { 0x13001fbb, 0x2400ffb6 }, { 0x13001fbc, 0x2000fff7 }, { 0x13001fbd, 0x60000000 }, { 0x13001fbe, 0x1400e3db }, { 0x13801fbf, 0x60000002 }, { 0x13001fc2, 0x14000000 }, { 0x13001fc3, 0x14000009 }, { 0x13001fc4, 0x14000000 }, { 0x13801fc6, 0x14000001 }, { 0x13001fc8, 0x2400ffaa }, { 0x13001fc9, 0x2400ffaa }, { 0x13001fca, 0x2400ffaa }, { 0x13001fcb, 0x2400ffaa }, { 0x13001fcc, 0x2000fff7 }, { 0x13801fcd, 0x60000002 }, { 0x13001fd0, 0x14000008 }, { 0x13001fd1, 0x14000008 }, { 0x13801fd2, 0x14000001 }, { 0x13801fd6, 0x14000001 }, { 0x13001fd8, 0x2400fff8 }, { 0x13001fd9, 0x2400fff8 }, { 0x13001fda, 0x2400ff9c }, { 0x13001fdb, 0x2400ff9c }, { 0x13801fdd, 0x60000002 }, { 0x13001fe0, 0x14000008 }, { 0x13001fe1, 0x14000008 }, { 0x13801fe2, 0x14000002 }, { 0x13001fe5, 0x14000007 }, { 0x13801fe6, 0x14000001 }, { 0x13001fe8, 0x2400fff8 }, { 0x13001fe9, 0x2400fff8 }, { 0x13001fea, 0x2400ff90 }, { 0x13001feb, 0x2400ff90 }, { 0x13001fec, 0x2400fff9 }, { 0x13801fed, 0x60000002 }, { 0x13001ff2, 0x14000000 }, { 0x13001ff3, 0x14000009 }, { 0x13001ff4, 0x14000000 }, { 0x13801ff6, 0x14000001 }, { 0x13001ff8, 0x2400ff80 }, { 0x13001ff9, 0x2400ff80 }, { 0x13001ffa, 0x2400ff82 }, { 0x13001ffb, 0x2400ff82 }, { 0x13001ffc, 0x2000fff7 }, { 0x13801ffd, 0x60000001 }, { 0x09802000, 0x7400000a }, { 0x0980200b, 0x04000004 }, { 0x09802010, 0x44000005 }, { 0x09802016, 0x54000001 }, { 0x09002018, 0x50000000 }, { 0x09002019, 0x4c000000 }, { 0x0900201a, 0x58000000 }, { 0x0980201b, 0x50000001 }, { 0x0900201d, 0x4c000000 }, { 0x0900201e, 0x58000000 }, { 0x0900201f, 0x50000000 }, { 0x09802020, 0x54000007 }, { 0x09002028, 0x6c000000 }, { 0x09002029, 0x70000000 }, { 0x0980202a, 0x04000004 }, { 0x0900202f, 0x74000000 }, { 0x09802030, 0x54000008 }, { 0x09002039, 0x50000000 }, { 0x0900203a, 0x4c000000 }, { 0x0980203b, 0x54000003 }, { 0x0980203f, 0x40000001 }, { 0x09802041, 0x54000002 }, { 0x09002044, 0x64000000 }, { 0x09002045, 0x58000000 }, { 0x09002046, 0x48000000 }, { 0x09802047, 0x5400000a }, { 0x09002052, 0x64000000 }, { 0x09002053, 0x54000000 }, { 0x09002054, 0x40000000 }, { 0x09802055, 0x54000009 }, { 0x0900205f, 0x74000000 }, { 0x09802060, 0x04000003 }, { 0x0980206a, 0x04000005 }, { 0x09002070, 0x3c000000 }, { 0x21002071, 0x14000000 }, { 0x09802074, 0x3c000005 }, { 0x0980207a, 0x64000002 }, { 0x0900207d, 0x58000000 }, { 0x0900207e, 0x48000000 }, { 0x2100207f, 0x14000000 }, { 0x09802080, 0x3c000009 }, { 0x0980208a, 0x64000002 }, { 0x0900208d, 0x58000000 }, { 0x0900208e, 0x48000000 }, { 0x21802090, 0x18000004 }, { 0x098020a0, 0x5c000015 }, { 0x1b8020d0, 0x3000000c }, { 0x1b8020dd, 0x2c000003 }, { 0x1b0020e1, 0x30000000 }, { 0x1b8020e2, 0x2c000002 }, { 0x1b8020e5, 0x3000000a }, { 0x09802100, 0x68000001 }, { 0x09002102, 0x24000000 }, { 0x09802103, 0x68000003 }, { 0x09002107, 0x24000000 }, { 0x09802108, 0x68000001 }, { 0x0900210a, 0x14000000 }, { 0x0980210b, 0x24000002 }, { 0x0980210e, 0x14000001 }, { 0x09802110, 0x24000002 }, { 0x09002113, 0x14000000 }, { 0x09002114, 0x68000000 }, { 0x09002115, 0x24000000 }, { 0x09802116, 0x68000002 }, { 0x09802119, 0x24000004 }, { 0x0980211e, 0x68000005 }, { 0x09002124, 0x24000000 }, { 0x09002125, 0x68000000 }, { 0x13002126, 0x2400e2a3 }, { 0x09002127, 0x68000000 }, { 0x09002128, 0x24000000 }, { 0x09002129, 0x68000000 }, { 0x2100212a, 0x2400df41 }, { 0x2100212b, 0x2400dfba }, { 0x0980212c, 0x24000001 }, { 0x0900212e, 0x68000000 }, { 0x0900212f, 0x14000000 }, { 0x09802130, 0x24000001 }, { 0x21002132, 0x2400001c }, { 0x09002133, 0x24000000 }, { 0x09002134, 0x14000000 }, { 0x09802135, 0x1c000003 }, { 0x09002139, 0x14000000 }, { 0x0980213a, 0x68000001 }, { 0x0980213c, 0x14000001 }, { 0x0980213e, 0x24000001 }, { 0x09802140, 0x64000004 }, { 0x09002145, 0x24000000 }, { 0x09802146, 0x14000003 }, { 0x0900214a, 0x68000000 }, { 0x0900214b, 0x64000000 }, { 0x0980214c, 0x68000001 }, { 0x2100214e, 0x1400ffe4 }, { 0x09802153, 0x3c00000c }, { 0x09002160, 0x38000010 }, { 0x09002161, 0x38000010 }, { 0x09002162, 0x38000010 }, { 0x09002163, 0x38000010 }, { 0x09002164, 0x38000010 }, { 0x09002165, 0x38000010 }, { 0x09002166, 0x38000010 }, { 0x09002167, 0x38000010 }, { 0x09002168, 0x38000010 }, { 0x09002169, 0x38000010 }, { 0x0900216a, 0x38000010 }, { 0x0900216b, 0x38000010 }, { 0x0900216c, 0x38000010 }, { 0x0900216d, 0x38000010 }, { 0x0900216e, 0x38000010 }, { 0x0900216f, 0x38000010 }, { 0x09002170, 0x3800fff0 }, { 0x09002171, 0x3800fff0 }, { 0x09002172, 0x3800fff0 }, { 0x09002173, 0x3800fff0 }, { 0x09002174, 0x3800fff0 }, { 0x09002175, 0x3800fff0 }, { 0x09002176, 0x3800fff0 }, { 0x09002177, 0x3800fff0 }, { 0x09002178, 0x3800fff0 }, { 0x09002179, 0x3800fff0 }, { 0x0900217a, 0x3800fff0 }, { 0x0900217b, 0x3800fff0 }, { 0x0900217c, 0x3800fff0 }, { 0x0900217d, 0x3800fff0 }, { 0x0900217e, 0x3800fff0 }, { 0x0900217f, 0x3800fff0 }, { 0x09802180, 0x38000002 }, { 0x09002183, 0x24000001 }, { 0x21002184, 0x1400ffff }, { 0x09802190, 0x64000004 }, { 0x09802195, 0x68000004 }, { 0x0980219a, 0x64000001 }, { 0x0980219c, 0x68000003 }, { 0x090021a0, 0x64000000 }, { 0x098021a1, 0x68000001 }, { 0x090021a3, 0x64000000 }, { 0x098021a4, 0x68000001 }, { 0x090021a6, 0x64000000 }, { 0x098021a7, 0x68000006 }, { 0x090021ae, 0x64000000 }, { 0x098021af, 0x6800001e }, { 0x098021ce, 0x64000001 }, { 0x098021d0, 0x68000001 }, { 0x090021d2, 0x64000000 }, { 0x090021d3, 0x68000000 }, { 0x090021d4, 0x64000000 }, { 0x098021d5, 0x6800001e }, { 0x098021f4, 0x6400010b }, { 0x09802300, 0x68000007 }, { 0x09802308, 0x64000003 }, { 0x0980230c, 0x68000013 }, { 0x09802320, 0x64000001 }, { 0x09802322, 0x68000006 }, { 0x09002329, 0x58000000 }, { 0x0900232a, 0x48000000 }, { 0x0980232b, 0x68000050 }, { 0x0900237c, 0x64000000 }, { 0x0980237d, 0x6800001d }, { 0x0980239b, 0x64000018 }, { 0x098023b4, 0x68000027 }, { 0x098023dc, 0x64000005 }, { 0x098023e2, 0x68000005 }, { 0x09802400, 0x68000026 }, { 0x09802440, 0x6800000a }, { 0x09802460, 0x3c00003b }, { 0x0980249c, 0x68000019 }, { 0x090024b6, 0x6800001a }, { 0x090024b7, 0x6800001a }, { 0x090024b8, 0x6800001a }, { 0x090024b9, 0x6800001a }, { 0x090024ba, 0x6800001a }, { 0x090024bb, 0x6800001a }, { 0x090024bc, 0x6800001a }, { 0x090024bd, 0x6800001a }, { 0x090024be, 0x6800001a }, { 0x090024bf, 0x6800001a }, { 0x090024c0, 0x6800001a }, { 0x090024c1, 0x6800001a }, { 0x090024c2, 0x6800001a }, { 0x090024c3, 0x6800001a }, { 0x090024c4, 0x6800001a }, { 0x090024c5, 0x6800001a }, { 0x090024c6, 0x6800001a }, { 0x090024c7, 0x6800001a }, { 0x090024c8, 0x6800001a }, { 0x090024c9, 0x6800001a }, { 0x090024ca, 0x6800001a }, { 0x090024cb, 0x6800001a }, { 0x090024cc, 0x6800001a }, { 0x090024cd, 0x6800001a }, { 0x090024ce, 0x6800001a }, { 0x090024cf, 0x6800001a }, { 0x090024d0, 0x6800ffe6 }, { 0x090024d1, 0x6800ffe6 }, { 0x090024d2, 0x6800ffe6 }, { 0x090024d3, 0x6800ffe6 }, { 0x090024d4, 0x6800ffe6 }, { 0x090024d5, 0x6800ffe6 }, { 0x090024d6, 0x6800ffe6 }, { 0x090024d7, 0x6800ffe6 }, { 0x090024d8, 0x6800ffe6 }, { 0x090024d9, 0x6800ffe6 }, { 0x090024da, 0x6800ffe6 }, { 0x090024db, 0x6800ffe6 }, { 0x090024dc, 0x6800ffe6 }, { 0x090024dd, 0x6800ffe6 }, { 0x090024de, 0x6800ffe6 }, { 0x090024df, 0x6800ffe6 }, { 0x090024e0, 0x6800ffe6 }, { 0x090024e1, 0x6800ffe6 }, { 0x090024e2, 0x6800ffe6 }, { 0x090024e3, 0x6800ffe6 }, { 0x090024e4, 0x6800ffe6 }, { 0x090024e5, 0x6800ffe6 }, { 0x090024e6, 0x6800ffe6 }, { 0x090024e7, 0x6800ffe6 }, { 0x090024e8, 0x6800ffe6 }, { 0x090024e9, 0x6800ffe6 }, { 0x098024ea, 0x3c000015 }, { 0x09802500, 0x680000b6 }, { 0x090025b7, 0x64000000 }, { 0x098025b8, 0x68000008 }, { 0x090025c1, 0x64000000 }, { 0x098025c2, 0x68000035 }, { 0x098025f8, 0x64000007 }, { 0x09802600, 0x6800006e }, { 0x0900266f, 0x64000000 }, { 0x09802670, 0x6800002c }, { 0x098026a0, 0x68000012 }, { 0x09802701, 0x68000003 }, { 0x09802706, 0x68000003 }, { 0x0980270c, 0x6800001b }, { 0x09802729, 0x68000022 }, { 0x0900274d, 0x68000000 }, { 0x0980274f, 0x68000003 }, { 0x09002756, 0x68000000 }, { 0x09802758, 0x68000006 }, { 0x09802761, 0x68000006 }, { 0x09002768, 0x58000000 }, { 0x09002769, 0x48000000 }, { 0x0900276a, 0x58000000 }, { 0x0900276b, 0x48000000 }, { 0x0900276c, 0x58000000 }, { 0x0900276d, 0x48000000 }, { 0x0900276e, 0x58000000 }, { 0x0900276f, 0x48000000 }, { 0x09002770, 0x58000000 }, { 0x09002771, 0x48000000 }, { 0x09002772, 0x58000000 }, { 0x09002773, 0x48000000 }, { 0x09002774, 0x58000000 }, { 0x09002775, 0x48000000 }, { 0x09802776, 0x3c00001d }, { 0x09002794, 0x68000000 }, { 0x09802798, 0x68000017 }, { 0x098027b1, 0x6800000d }, { 0x098027c0, 0x64000004 }, { 0x090027c5, 0x58000000 }, { 0x090027c6, 0x48000000 }, { 0x098027c7, 0x64000003 }, { 0x098027d0, 0x64000015 }, { 0x090027e6, 0x58000000 }, { 0x090027e7, 0x48000000 }, { 0x090027e8, 0x58000000 }, { 0x090027e9, 0x48000000 }, { 0x090027ea, 0x58000000 }, { 0x090027eb, 0x48000000 }, { 0x098027f0, 0x6400000f }, { 0x04802800, 0x680000ff }, { 0x09802900, 0x64000082 }, { 0x09002983, 0x58000000 }, { 0x09002984, 0x48000000 }, { 0x09002985, 0x58000000 }, { 0x09002986, 0x48000000 }, { 0x09002987, 0x58000000 }, { 0x09002988, 0x48000000 }, { 0x09002989, 0x58000000 }, { 0x0900298a, 0x48000000 }, { 0x0900298b, 0x58000000 }, { 0x0900298c, 0x48000000 }, { 0x0900298d, 0x58000000 }, { 0x0900298e, 0x48000000 }, { 0x0900298f, 0x58000000 }, { 0x09002990, 0x48000000 }, { 0x09002991, 0x58000000 }, { 0x09002992, 0x48000000 }, { 0x09002993, 0x58000000 }, { 0x09002994, 0x48000000 }, { 0x09002995, 0x58000000 }, { 0x09002996, 0x48000000 }, { 0x09002997, 0x58000000 }, { 0x09002998, 0x48000000 }, { 0x09802999, 0x6400003e }, { 0x090029d8, 0x58000000 }, { 0x090029d9, 0x48000000 }, { 0x090029da, 0x58000000 }, { 0x090029db, 0x48000000 }, { 0x098029dc, 0x6400001f }, { 0x090029fc, 0x58000000 }, { 0x090029fd, 0x48000000 }, { 0x098029fe, 0x64000101 }, { 0x09802b00, 0x6800001a }, { 0x09802b20, 0x68000003 }, { 0x11002c00, 0x24000030 }, { 0x11002c01, 0x24000030 }, { 0x11002c02, 0x24000030 }, { 0x11002c03, 0x24000030 }, { 0x11002c04, 0x24000030 }, { 0x11002c05, 0x24000030 }, { 0x11002c06, 0x24000030 }, { 0x11002c07, 0x24000030 }, { 0x11002c08, 0x24000030 }, { 0x11002c09, 0x24000030 }, { 0x11002c0a, 0x24000030 }, { 0x11002c0b, 0x24000030 }, { 0x11002c0c, 0x24000030 }, { 0x11002c0d, 0x24000030 }, { 0x11002c0e, 0x24000030 }, { 0x11002c0f, 0x24000030 }, { 0x11002c10, 0x24000030 }, { 0x11002c11, 0x24000030 }, { 0x11002c12, 0x24000030 }, { 0x11002c13, 0x24000030 }, { 0x11002c14, 0x24000030 }, { 0x11002c15, 0x24000030 }, { 0x11002c16, 0x24000030 }, { 0x11002c17, 0x24000030 }, { 0x11002c18, 0x24000030 }, { 0x11002c19, 0x24000030 }, { 0x11002c1a, 0x24000030 }, { 0x11002c1b, 0x24000030 }, { 0x11002c1c, 0x24000030 }, { 0x11002c1d, 0x24000030 }, { 0x11002c1e, 0x24000030 }, { 0x11002c1f, 0x24000030 }, { 0x11002c20, 0x24000030 }, { 0x11002c21, 0x24000030 }, { 0x11002c22, 0x24000030 }, { 0x11002c23, 0x24000030 }, { 0x11002c24, 0x24000030 }, { 0x11002c25, 0x24000030 }, { 0x11002c26, 0x24000030 }, { 0x11002c27, 0x24000030 }, { 0x11002c28, 0x24000030 }, { 0x11002c29, 0x24000030 }, { 0x11002c2a, 0x24000030 }, { 0x11002c2b, 0x24000030 }, { 0x11002c2c, 0x24000030 }, { 0x11002c2d, 0x24000030 }, { 0x11002c2e, 0x24000030 }, { 0x11002c30, 0x1400ffd0 }, { 0x11002c31, 0x1400ffd0 }, { 0x11002c32, 0x1400ffd0 }, { 0x11002c33, 0x1400ffd0 }, { 0x11002c34, 0x1400ffd0 }, { 0x11002c35, 0x1400ffd0 }, { 0x11002c36, 0x1400ffd0 }, { 0x11002c37, 0x1400ffd0 }, { 0x11002c38, 0x1400ffd0 }, { 0x11002c39, 0x1400ffd0 }, { 0x11002c3a, 0x1400ffd0 }, { 0x11002c3b, 0x1400ffd0 }, { 0x11002c3c, 0x1400ffd0 }, { 0x11002c3d, 0x1400ffd0 }, { 0x11002c3e, 0x1400ffd0 }, { 0x11002c3f, 0x1400ffd0 }, { 0x11002c40, 0x1400ffd0 }, { 0x11002c41, 0x1400ffd0 }, { 0x11002c42, 0x1400ffd0 }, { 0x11002c43, 0x1400ffd0 }, { 0x11002c44, 0x1400ffd0 }, { 0x11002c45, 0x1400ffd0 }, { 0x11002c46, 0x1400ffd0 }, { 0x11002c47, 0x1400ffd0 }, { 0x11002c48, 0x1400ffd0 }, { 0x11002c49, 0x1400ffd0 }, { 0x11002c4a, 0x1400ffd0 }, { 0x11002c4b, 0x1400ffd0 }, { 0x11002c4c, 0x1400ffd0 }, { 0x11002c4d, 0x1400ffd0 }, { 0x11002c4e, 0x1400ffd0 }, { 0x11002c4f, 0x1400ffd0 }, { 0x11002c50, 0x1400ffd0 }, { 0x11002c51, 0x1400ffd0 }, { 0x11002c52, 0x1400ffd0 }, { 0x11002c53, 0x1400ffd0 }, { 0x11002c54, 0x1400ffd0 }, { 0x11002c55, 0x1400ffd0 }, { 0x11002c56, 0x1400ffd0 }, { 0x11002c57, 0x1400ffd0 }, { 0x11002c58, 0x1400ffd0 }, { 0x11002c59, 0x1400ffd0 }, { 0x11002c5a, 0x1400ffd0 }, { 0x11002c5b, 0x1400ffd0 }, { 0x11002c5c, 0x1400ffd0 }, { 0x11002c5d, 0x1400ffd0 }, { 0x11002c5e, 0x1400ffd0 }, { 0x21002c60, 0x24000001 }, { 0x21002c61, 0x1400ffff }, { 0x21002c62, 0x2400d609 }, { 0x21002c63, 0x2400f11a }, { 0x21002c64, 0x2400d619 }, { 0x21002c65, 0x1400d5d5 }, { 0x21002c66, 0x1400d5d8 }, { 0x21002c67, 0x24000001 }, { 0x21002c68, 0x1400ffff }, { 0x21002c69, 0x24000001 }, { 0x21002c6a, 0x1400ffff }, { 0x21002c6b, 0x24000001 }, { 0x21002c6c, 0x1400ffff }, { 0x21002c74, 0x14000000 }, { 0x21002c75, 0x24000001 }, { 0x21002c76, 0x1400ffff }, { 0x21002c77, 0x14000000 }, { 0x0a002c80, 0x24000001 }, { 0x0a002c81, 0x1400ffff }, { 0x0a002c82, 0x24000001 }, { 0x0a002c83, 0x1400ffff }, { 0x0a002c84, 0x24000001 }, { 0x0a002c85, 0x1400ffff }, { 0x0a002c86, 0x24000001 }, { 0x0a002c87, 0x1400ffff }, { 0x0a002c88, 0x24000001 }, { 0x0a002c89, 0x1400ffff }, { 0x0a002c8a, 0x24000001 }, { 0x0a002c8b, 0x1400ffff }, { 0x0a002c8c, 0x24000001 }, { 0x0a002c8d, 0x1400ffff }, { 0x0a002c8e, 0x24000001 }, { 0x0a002c8f, 0x1400ffff }, { 0x0a002c90, 0x24000001 }, { 0x0a002c91, 0x1400ffff }, { 0x0a002c92, 0x24000001 }, { 0x0a002c93, 0x1400ffff }, { 0x0a002c94, 0x24000001 }, { 0x0a002c95, 0x1400ffff }, { 0x0a002c96, 0x24000001 }, { 0x0a002c97, 0x1400ffff }, { 0x0a002c98, 0x24000001 }, { 0x0a002c99, 0x1400ffff }, { 0x0a002c9a, 0x24000001 }, { 0x0a002c9b, 0x1400ffff }, { 0x0a002c9c, 0x24000001 }, { 0x0a002c9d, 0x1400ffff }, { 0x0a002c9e, 0x24000001 }, { 0x0a002c9f, 0x1400ffff }, { 0x0a002ca0, 0x24000001 }, { 0x0a002ca1, 0x1400ffff }, { 0x0a002ca2, 0x24000001 }, { 0x0a002ca3, 0x1400ffff }, { 0x0a002ca4, 0x24000001 }, { 0x0a002ca5, 0x1400ffff }, { 0x0a002ca6, 0x24000001 }, { 0x0a002ca7, 0x1400ffff }, { 0x0a002ca8, 0x24000001 }, { 0x0a002ca9, 0x1400ffff }, { 0x0a002caa, 0x24000001 }, { 0x0a002cab, 0x1400ffff }, { 0x0a002cac, 0x24000001 }, { 0x0a002cad, 0x1400ffff }, { 0x0a002cae, 0x24000001 }, { 0x0a002caf, 0x1400ffff }, { 0x0a002cb0, 0x24000001 }, { 0x0a002cb1, 0x1400ffff }, { 0x0a002cb2, 0x24000001 }, { 0x0a002cb3, 0x1400ffff }, { 0x0a002cb4, 0x24000001 }, { 0x0a002cb5, 0x1400ffff }, { 0x0a002cb6, 0x24000001 }, { 0x0a002cb7, 0x1400ffff }, { 0x0a002cb8, 0x24000001 }, { 0x0a002cb9, 0x1400ffff }, { 0x0a002cba, 0x24000001 }, { 0x0a002cbb, 0x1400ffff }, { 0x0a002cbc, 0x24000001 }, { 0x0a002cbd, 0x1400ffff }, { 0x0a002cbe, 0x24000001 }, { 0x0a002cbf, 0x1400ffff }, { 0x0a002cc0, 0x24000001 }, { 0x0a002cc1, 0x1400ffff }, { 0x0a002cc2, 0x24000001 }, { 0x0a002cc3, 0x1400ffff }, { 0x0a002cc4, 0x24000001 }, { 0x0a002cc5, 0x1400ffff }, { 0x0a002cc6, 0x24000001 }, { 0x0a002cc7, 0x1400ffff }, { 0x0a002cc8, 0x24000001 }, { 0x0a002cc9, 0x1400ffff }, { 0x0a002cca, 0x24000001 }, { 0x0a002ccb, 0x1400ffff }, { 0x0a002ccc, 0x24000001 }, { 0x0a002ccd, 0x1400ffff }, { 0x0a002cce, 0x24000001 }, { 0x0a002ccf, 0x1400ffff }, { 0x0a002cd0, 0x24000001 }, { 0x0a002cd1, 0x1400ffff }, { 0x0a002cd2, 0x24000001 }, { 0x0a002cd3, 0x1400ffff }, { 0x0a002cd4, 0x24000001 }, { 0x0a002cd5, 0x1400ffff }, { 0x0a002cd6, 0x24000001 }, { 0x0a002cd7, 0x1400ffff }, { 0x0a002cd8, 0x24000001 }, { 0x0a002cd9, 0x1400ffff }, { 0x0a002cda, 0x24000001 }, { 0x0a002cdb, 0x1400ffff }, { 0x0a002cdc, 0x24000001 }, { 0x0a002cdd, 0x1400ffff }, { 0x0a002cde, 0x24000001 }, { 0x0a002cdf, 0x1400ffff }, { 0x0a002ce0, 0x24000001 }, { 0x0a002ce1, 0x1400ffff }, { 0x0a002ce2, 0x24000001 }, { 0x0a002ce3, 0x1400ffff }, { 0x0a002ce4, 0x14000000 }, { 0x0a802ce5, 0x68000005 }, { 0x0a802cf9, 0x54000003 }, { 0x0a002cfd, 0x3c000000 }, { 0x0a802cfe, 0x54000001 }, { 0x10002d00, 0x1400e3a0 }, { 0x10002d01, 0x1400e3a0 }, { 0x10002d02, 0x1400e3a0 }, { 0x10002d03, 0x1400e3a0 }, { 0x10002d04, 0x1400e3a0 }, { 0x10002d05, 0x1400e3a0 }, { 0x10002d06, 0x1400e3a0 }, { 0x10002d07, 0x1400e3a0 }, { 0x10002d08, 0x1400e3a0 }, { 0x10002d09, 0x1400e3a0 }, { 0x10002d0a, 0x1400e3a0 }, { 0x10002d0b, 0x1400e3a0 }, { 0x10002d0c, 0x1400e3a0 }, { 0x10002d0d, 0x1400e3a0 }, { 0x10002d0e, 0x1400e3a0 }, { 0x10002d0f, 0x1400e3a0 }, { 0x10002d10, 0x1400e3a0 }, { 0x10002d11, 0x1400e3a0 }, { 0x10002d12, 0x1400e3a0 }, { 0x10002d13, 0x1400e3a0 }, { 0x10002d14, 0x1400e3a0 }, { 0x10002d15, 0x1400e3a0 }, { 0x10002d16, 0x1400e3a0 }, { 0x10002d17, 0x1400e3a0 }, { 0x10002d18, 0x1400e3a0 }, { 0x10002d19, 0x1400e3a0 }, { 0x10002d1a, 0x1400e3a0 }, { 0x10002d1b, 0x1400e3a0 }, { 0x10002d1c, 0x1400e3a0 }, { 0x10002d1d, 0x1400e3a0 }, { 0x10002d1e, 0x1400e3a0 }, { 0x10002d1f, 0x1400e3a0 }, { 0x10002d20, 0x1400e3a0 }, { 0x10002d21, 0x1400e3a0 }, { 0x10002d22, 0x1400e3a0 }, { 0x10002d23, 0x1400e3a0 }, { 0x10002d24, 0x1400e3a0 }, { 0x10002d25, 0x1400e3a0 }, { 0x3a802d30, 0x1c000035 }, { 0x3a002d6f, 0x18000000 }, { 0x0f802d80, 0x1c000016 }, { 0x0f802da0, 0x1c000006 }, { 0x0f802da8, 0x1c000006 }, { 0x0f802db0, 0x1c000006 }, { 0x0f802db8, 0x1c000006 }, { 0x0f802dc0, 0x1c000006 }, { 0x0f802dc8, 0x1c000006 }, { 0x0f802dd0, 0x1c000006 }, { 0x0f802dd8, 0x1c000006 }, { 0x09802e00, 0x54000001 }, { 0x09002e02, 0x50000000 }, { 0x09002e03, 0x4c000000 }, { 0x09002e04, 0x50000000 }, { 0x09002e05, 0x4c000000 }, { 0x09802e06, 0x54000002 }, { 0x09002e09, 0x50000000 }, { 0x09002e0a, 0x4c000000 }, { 0x09002e0b, 0x54000000 }, { 0x09002e0c, 0x50000000 }, { 0x09002e0d, 0x4c000000 }, { 0x09802e0e, 0x54000008 }, { 0x09002e17, 0x44000000 }, { 0x09002e1c, 0x50000000 }, { 0x09002e1d, 0x4c000000 }, { 0x16802e80, 0x68000019 }, { 0x16802e9b, 0x68000058 }, { 0x16802f00, 0x680000d5 }, { 0x09802ff0, 0x6800000b }, { 0x09003000, 0x74000000 }, { 0x09803001, 0x54000002 }, { 0x09003004, 0x68000000 }, { 0x16003005, 0x18000000 }, { 0x09003006, 0x1c000000 }, { 0x16003007, 0x38000000 }, { 0x09003008, 0x58000000 }, { 0x09003009, 0x48000000 }, { 0x0900300a, 0x58000000 }, { 0x0900300b, 0x48000000 }, { 0x0900300c, 0x58000000 }, { 0x0900300d, 0x48000000 }, { 0x0900300e, 0x58000000 }, { 0x0900300f, 0x48000000 }, { 0x09003010, 0x58000000 }, { 0x09003011, 0x48000000 }, { 0x09803012, 0x68000001 }, { 0x09003014, 0x58000000 }, { 0x09003015, 0x48000000 }, { 0x09003016, 0x58000000 }, { 0x09003017, 0x48000000 }, { 0x09003018, 0x58000000 }, { 0x09003019, 0x48000000 }, { 0x0900301a, 0x58000000 }, { 0x0900301b, 0x48000000 }, { 0x0900301c, 0x44000000 }, { 0x0900301d, 0x58000000 }, { 0x0980301e, 0x48000001 }, { 0x09003020, 0x68000000 }, { 0x16803021, 0x38000008 }, { 0x1b80302a, 0x30000005 }, { 0x09003030, 0x44000000 }, { 0x09803031, 0x18000004 }, { 0x09803036, 0x68000001 }, { 0x16803038, 0x38000002 }, { 0x1600303b, 0x18000000 }, { 0x0900303c, 0x1c000000 }, { 0x0900303d, 0x54000000 }, { 0x0980303e, 0x68000001 }, { 0x1a803041, 0x1c000055 }, { 0x1b803099, 0x30000001 }, { 0x0980309b, 0x60000001 }, { 0x1a80309d, 0x18000001 }, { 0x1a00309f, 0x1c000000 }, { 0x090030a0, 0x44000000 }, { 0x1d8030a1, 0x1c000059 }, { 0x090030fb, 0x54000000 }, { 0x098030fc, 0x18000002 }, { 0x1d0030ff, 0x1c000000 }, { 0x03803105, 0x1c000027 }, { 0x17803131, 0x1c00005d }, { 0x09803190, 0x68000001 }, { 0x09803192, 0x3c000003 }, { 0x09803196, 0x68000009 }, { 0x038031a0, 0x1c000017 }, { 0x098031c0, 0x6800000f }, { 0x1d8031f0, 0x1c00000f }, { 0x17803200, 0x6800001e }, { 0x09803220, 0x3c000009 }, { 0x0980322a, 0x68000019 }, { 0x09003250, 0x68000000 }, { 0x09803251, 0x3c00000e }, { 0x17803260, 0x6800001f }, { 0x09803280, 0x3c000009 }, { 0x0980328a, 0x68000026 }, { 0x098032b1, 0x3c00000e }, { 0x098032c0, 0x6800003e }, { 0x09803300, 0x680000ff }, { 0x16803400, 0x1c0019b5 }, { 0x09804dc0, 0x6800003f }, { 0x16804e00, 0x1c0051bb }, { 0x3c80a000, 0x1c000014 }, { 0x3c00a015, 0x18000000 }, { 0x3c80a016, 0x1c000476 }, { 0x3c80a490, 0x68000036 }, { 0x0980a700, 0x60000016 }, { 0x0980a717, 0x18000003 }, { 0x0980a720, 0x60000001 }, { 0x3080a800, 0x1c000001 }, { 0x3000a802, 0x28000000 }, { 0x3080a803, 0x1c000002 }, { 0x3000a806, 0x30000000 }, { 0x3080a807, 0x1c000003 }, { 0x3000a80b, 0x30000000 }, { 0x3080a80c, 0x1c000016 }, { 0x3080a823, 0x28000001 }, { 0x3080a825, 0x30000001 }, { 0x3000a827, 0x28000000 }, { 0x3080a828, 0x68000003 }, { 0x4080a840, 0x1c000033 }, { 0x4080a874, 0x54000003 }, { 0x1780ac00, 0x1c002ba3 }, { 0x0980d800, 0x1000037f }, { 0x0980db80, 0x1000007f }, { 0x0980dc00, 0x100003ff }, { 0x0980e000, 0x0c0018ff }, { 0x1680f900, 0x1c00012d }, { 0x1680fa30, 0x1c00003a }, { 0x1680fa70, 0x1c000069 }, { 0x2180fb00, 0x14000006 }, { 0x0180fb13, 0x14000004 }, { 0x1900fb1d, 0x1c000000 }, { 0x1900fb1e, 0x30000000 }, { 0x1980fb1f, 0x1c000009 }, { 0x1900fb29, 0x64000000 }, { 0x1980fb2a, 0x1c00000c }, { 0x1980fb38, 0x1c000004 }, { 0x1900fb3e, 0x1c000000 }, { 0x1980fb40, 0x1c000001 }, { 0x1980fb43, 0x1c000001 }, { 0x1980fb46, 0x1c00006b }, { 0x0080fbd3, 0x1c00016a }, { 0x0900fd3e, 0x58000000 }, { 0x0900fd3f, 0x48000000 }, { 0x0080fd50, 0x1c00003f }, { 0x0080fd92, 0x1c000035 }, { 0x0080fdf0, 0x1c00000b }, { 0x0000fdfc, 0x5c000000 }, { 0x0900fdfd, 0x68000000 }, { 0x1b80fe00, 0x3000000f }, { 0x0980fe10, 0x54000006 }, { 0x0900fe17, 0x58000000 }, { 0x0900fe18, 0x48000000 }, { 0x0900fe19, 0x54000000 }, { 0x1b80fe20, 0x30000003 }, { 0x0900fe30, 0x54000000 }, { 0x0980fe31, 0x44000001 }, { 0x0980fe33, 0x40000001 }, { 0x0900fe35, 0x58000000 }, { 0x0900fe36, 0x48000000 }, { 0x0900fe37, 0x58000000 }, { 0x0900fe38, 0x48000000 }, { 0x0900fe39, 0x58000000 }, { 0x0900fe3a, 0x48000000 }, { 0x0900fe3b, 0x58000000 }, { 0x0900fe3c, 0x48000000 }, { 0x0900fe3d, 0x58000000 }, { 0x0900fe3e, 0x48000000 }, { 0x0900fe3f, 0x58000000 }, { 0x0900fe40, 0x48000000 }, { 0x0900fe41, 0x58000000 }, { 0x0900fe42, 0x48000000 }, { 0x0900fe43, 0x58000000 }, { 0x0900fe44, 0x48000000 }, { 0x0980fe45, 0x54000001 }, { 0x0900fe47, 0x58000000 }, { 0x0900fe48, 0x48000000 }, { 0x0980fe49, 0x54000003 }, { 0x0980fe4d, 0x40000002 }, { 0x0980fe50, 0x54000002 }, { 0x0980fe54, 0x54000003 }, { 0x0900fe58, 0x44000000 }, { 0x0900fe59, 0x58000000 }, { 0x0900fe5a, 0x48000000 }, { 0x0900fe5b, 0x58000000 }, { 0x0900fe5c, 0x48000000 }, { 0x0900fe5d, 0x58000000 }, { 0x0900fe5e, 0x48000000 }, { 0x0980fe5f, 0x54000002 }, { 0x0900fe62, 0x64000000 }, { 0x0900fe63, 0x44000000 }, { 0x0980fe64, 0x64000002 }, { 0x0900fe68, 0x54000000 }, { 0x0900fe69, 0x5c000000 }, { 0x0980fe6a, 0x54000001 }, { 0x0080fe70, 0x1c000004 }, { 0x0080fe76, 0x1c000086 }, { 0x0900feff, 0x04000000 }, { 0x0980ff01, 0x54000002 }, { 0x0900ff04, 0x5c000000 }, { 0x0980ff05, 0x54000002 }, { 0x0900ff08, 0x58000000 }, { 0x0900ff09, 0x48000000 }, { 0x0900ff0a, 0x54000000 }, { 0x0900ff0b, 0x64000000 }, { 0x0900ff0c, 0x54000000 }, { 0x0900ff0d, 0x44000000 }, { 0x0980ff0e, 0x54000001 }, { 0x0980ff10, 0x34000009 }, { 0x0980ff1a, 0x54000001 }, { 0x0980ff1c, 0x64000002 }, { 0x0980ff1f, 0x54000001 }, { 0x2100ff21, 0x24000020 }, { 0x2100ff22, 0x24000020 }, { 0x2100ff23, 0x24000020 }, { 0x2100ff24, 0x24000020 }, { 0x2100ff25, 0x24000020 }, { 0x2100ff26, 0x24000020 }, { 0x2100ff27, 0x24000020 }, { 0x2100ff28, 0x24000020 }, { 0x2100ff29, 0x24000020 }, { 0x2100ff2a, 0x24000020 }, { 0x2100ff2b, 0x24000020 }, { 0x2100ff2c, 0x24000020 }, { 0x2100ff2d, 0x24000020 }, { 0x2100ff2e, 0x24000020 }, { 0x2100ff2f, 0x24000020 }, { 0x2100ff30, 0x24000020 }, { 0x2100ff31, 0x24000020 }, { 0x2100ff32, 0x24000020 }, { 0x2100ff33, 0x24000020 }, { 0x2100ff34, 0x24000020 }, { 0x2100ff35, 0x24000020 }, { 0x2100ff36, 0x24000020 }, { 0x2100ff37, 0x24000020 }, { 0x2100ff38, 0x24000020 }, { 0x2100ff39, 0x24000020 }, { 0x2100ff3a, 0x24000020 }, { 0x0900ff3b, 0x58000000 }, { 0x0900ff3c, 0x54000000 }, { 0x0900ff3d, 0x48000000 }, { 0x0900ff3e, 0x60000000 }, { 0x0900ff3f, 0x40000000 }, { 0x0900ff40, 0x60000000 }, { 0x2100ff41, 0x1400ffe0 }, { 0x2100ff42, 0x1400ffe0 }, { 0x2100ff43, 0x1400ffe0 }, { 0x2100ff44, 0x1400ffe0 }, { 0x2100ff45, 0x1400ffe0 }, { 0x2100ff46, 0x1400ffe0 }, { 0x2100ff47, 0x1400ffe0 }, { 0x2100ff48, 0x1400ffe0 }, { 0x2100ff49, 0x1400ffe0 }, { 0x2100ff4a, 0x1400ffe0 }, { 0x2100ff4b, 0x1400ffe0 }, { 0x2100ff4c, 0x1400ffe0 }, { 0x2100ff4d, 0x1400ffe0 }, { 0x2100ff4e, 0x1400ffe0 }, { 0x2100ff4f, 0x1400ffe0 }, { 0x2100ff50, 0x1400ffe0 }, { 0x2100ff51, 0x1400ffe0 }, { 0x2100ff52, 0x1400ffe0 }, { 0x2100ff53, 0x1400ffe0 }, { 0x2100ff54, 0x1400ffe0 }, { 0x2100ff55, 0x1400ffe0 }, { 0x2100ff56, 0x1400ffe0 }, { 0x2100ff57, 0x1400ffe0 }, { 0x2100ff58, 0x1400ffe0 }, { 0x2100ff59, 0x1400ffe0 }, { 0x2100ff5a, 0x1400ffe0 }, { 0x0900ff5b, 0x58000000 }, { 0x0900ff5c, 0x64000000 }, { 0x0900ff5d, 0x48000000 }, { 0x0900ff5e, 0x64000000 }, { 0x0900ff5f, 0x58000000 }, { 0x0900ff60, 0x48000000 }, { 0x0900ff61, 0x54000000 }, { 0x0900ff62, 0x58000000 }, { 0x0900ff63, 0x48000000 }, { 0x0980ff64, 0x54000001 }, { 0x1d80ff66, 0x1c000009 }, { 0x0900ff70, 0x18000000 }, { 0x1d80ff71, 0x1c00002c }, { 0x0980ff9e, 0x18000001 }, { 0x1780ffa0, 0x1c00001e }, { 0x1780ffc2, 0x1c000005 }, { 0x1780ffca, 0x1c000005 }, { 0x1780ffd2, 0x1c000005 }, { 0x1780ffda, 0x1c000002 }, { 0x0980ffe0, 0x5c000001 }, { 0x0900ffe2, 0x64000000 }, { 0x0900ffe3, 0x60000000 }, { 0x0900ffe4, 0x68000000 }, { 0x0980ffe5, 0x5c000001 }, { 0x0900ffe8, 0x68000000 }, { 0x0980ffe9, 0x64000003 }, { 0x0980ffed, 0x68000001 }, { 0x0980fff9, 0x04000002 }, { 0x0980fffc, 0x68000001 }, { 0x23810000, 0x1c00000b }, { 0x2381000d, 0x1c000019 }, { 0x23810028, 0x1c000012 }, { 0x2381003c, 0x1c000001 }, { 0x2381003f, 0x1c00000e }, { 0x23810050, 0x1c00000d }, { 0x23810080, 0x1c00007a }, { 0x09810100, 0x54000001 }, { 0x09010102, 0x68000000 }, { 0x09810107, 0x3c00002c }, { 0x09810137, 0x68000008 }, { 0x13810140, 0x38000034 }, { 0x13810175, 0x3c000003 }, { 0x13810179, 0x68000010 }, { 0x1301018a, 0x3c000000 }, { 0x29810300, 0x1c00001e }, { 0x29810320, 0x3c000003 }, { 0x12810330, 0x1c000010 }, { 0x12010341, 0x38000000 }, { 0x12810342, 0x1c000007 }, { 0x1201034a, 0x38000000 }, { 0x3b810380, 0x1c00001d }, { 0x3b01039f, 0x54000000 }, { 0x2a8103a0, 0x1c000023 }, { 0x2a8103c8, 0x1c000007 }, { 0x2a0103d0, 0x54000000 }, { 0x2a8103d1, 0x38000004 }, { 0x0d010400, 0x24000028 }, { 0x0d010401, 0x24000028 }, { 0x0d010402, 0x24000028 }, { 0x0d010403, 0x24000028 }, { 0x0d010404, 0x24000028 }, { 0x0d010405, 0x24000028 }, { 0x0d010406, 0x24000028 }, { 0x0d010407, 0x24000028 }, { 0x0d010408, 0x24000028 }, { 0x0d010409, 0x24000028 }, { 0x0d01040a, 0x24000028 }, { 0x0d01040b, 0x24000028 }, { 0x0d01040c, 0x24000028 }, { 0x0d01040d, 0x24000028 }, { 0x0d01040e, 0x24000028 }, { 0x0d01040f, 0x24000028 }, { 0x0d010410, 0x24000028 }, { 0x0d010411, 0x24000028 }, { 0x0d010412, 0x24000028 }, { 0x0d010413, 0x24000028 }, { 0x0d010414, 0x24000028 }, { 0x0d010415, 0x24000028 }, { 0x0d010416, 0x24000028 }, { 0x0d010417, 0x24000028 }, { 0x0d010418, 0x24000028 }, { 0x0d010419, 0x24000028 }, { 0x0d01041a, 0x24000028 }, { 0x0d01041b, 0x24000028 }, { 0x0d01041c, 0x24000028 }, { 0x0d01041d, 0x24000028 }, { 0x0d01041e, 0x24000028 }, { 0x0d01041f, 0x24000028 }, { 0x0d010420, 0x24000028 }, { 0x0d010421, 0x24000028 }, { 0x0d010422, 0x24000028 }, { 0x0d010423, 0x24000028 }, { 0x0d010424, 0x24000028 }, { 0x0d010425, 0x24000028 }, { 0x0d010426, 0x24000028 }, { 0x0d010427, 0x24000028 }, { 0x0d010428, 0x1400ffd8 }, { 0x0d010429, 0x1400ffd8 }, { 0x0d01042a, 0x1400ffd8 }, { 0x0d01042b, 0x1400ffd8 }, { 0x0d01042c, 0x1400ffd8 }, { 0x0d01042d, 0x1400ffd8 }, { 0x0d01042e, 0x1400ffd8 }, { 0x0d01042f, 0x1400ffd8 }, { 0x0d010430, 0x1400ffd8 }, { 0x0d010431, 0x1400ffd8 }, { 0x0d010432, 0x1400ffd8 }, { 0x0d010433, 0x1400ffd8 }, { 0x0d010434, 0x1400ffd8 }, { 0x0d010435, 0x1400ffd8 }, { 0x0d010436, 0x1400ffd8 }, { 0x0d010437, 0x1400ffd8 }, { 0x0d010438, 0x1400ffd8 }, { 0x0d010439, 0x1400ffd8 }, { 0x0d01043a, 0x1400ffd8 }, { 0x0d01043b, 0x1400ffd8 }, { 0x0d01043c, 0x1400ffd8 }, { 0x0d01043d, 0x1400ffd8 }, { 0x0d01043e, 0x1400ffd8 }, { 0x0d01043f, 0x1400ffd8 }, { 0x0d010440, 0x1400ffd8 }, { 0x0d010441, 0x1400ffd8 }, { 0x0d010442, 0x1400ffd8 }, { 0x0d010443, 0x1400ffd8 }, { 0x0d010444, 0x1400ffd8 }, { 0x0d010445, 0x1400ffd8 }, { 0x0d010446, 0x1400ffd8 }, { 0x0d010447, 0x1400ffd8 }, { 0x0d010448, 0x1400ffd8 }, { 0x0d010449, 0x1400ffd8 }, { 0x0d01044a, 0x1400ffd8 }, { 0x0d01044b, 0x1400ffd8 }, { 0x0d01044c, 0x1400ffd8 }, { 0x0d01044d, 0x1400ffd8 }, { 0x0d01044e, 0x1400ffd8 }, { 0x0d01044f, 0x1400ffd8 }, { 0x2e810450, 0x1c00004d }, { 0x2c8104a0, 0x34000009 }, { 0x0b810800, 0x1c000005 }, { 0x0b010808, 0x1c000000 }, { 0x0b81080a, 0x1c00002b }, { 0x0b810837, 0x1c000001 }, { 0x0b01083c, 0x1c000000 }, { 0x0b01083f, 0x1c000000 }, { 0x41810900, 0x1c000015 }, { 0x41810916, 0x3c000003 }, { 0x4101091f, 0x54000000 }, { 0x1e010a00, 0x1c000000 }, { 0x1e810a01, 0x30000002 }, { 0x1e810a05, 0x30000001 }, { 0x1e810a0c, 0x30000003 }, { 0x1e810a10, 0x1c000003 }, { 0x1e810a15, 0x1c000002 }, { 0x1e810a19, 0x1c00001a }, { 0x1e810a38, 0x30000002 }, { 0x1e010a3f, 0x30000000 }, { 0x1e810a40, 0x3c000007 }, { 0x1e810a50, 0x54000008 }, { 0x3e812000, 0x1c00036e }, { 0x3e812400, 0x38000062 }, { 0x3e812470, 0x54000003 }, { 0x0981d000, 0x680000f5 }, { 0x0981d100, 0x68000026 }, { 0x0981d12a, 0x6800003a }, { 0x0981d165, 0x28000001 }, { 0x1b81d167, 0x30000002 }, { 0x0981d16a, 0x68000002 }, { 0x0981d16d, 0x28000005 }, { 0x0981d173, 0x04000007 }, { 0x1b81d17b, 0x30000007 }, { 0x0981d183, 0x68000001 }, { 0x1b81d185, 0x30000006 }, { 0x0981d18c, 0x6800001d }, { 0x1b81d1aa, 0x30000003 }, { 0x0981d1ae, 0x6800002f }, { 0x1381d200, 0x68000041 }, { 0x1381d242, 0x30000002 }, { 0x1301d245, 0x68000000 }, { 0x0981d300, 0x68000056 }, { 0x0981d360, 0x3c000011 }, { 0x0981d400, 0x24000019 }, { 0x0981d41a, 0x14000019 }, { 0x0981d434, 0x24000019 }, { 0x0981d44e, 0x14000006 }, { 0x0981d456, 0x14000011 }, { 0x0981d468, 0x24000019 }, { 0x0981d482, 0x14000019 }, { 0x0901d49c, 0x24000000 }, { 0x0981d49e, 0x24000001 }, { 0x0901d4a2, 0x24000000 }, { 0x0981d4a5, 0x24000001 }, { 0x0981d4a9, 0x24000003 }, { 0x0981d4ae, 0x24000007 }, { 0x0981d4b6, 0x14000003 }, { 0x0901d4bb, 0x14000000 }, { 0x0981d4bd, 0x14000006 }, { 0x0981d4c5, 0x1400000a }, { 0x0981d4d0, 0x24000019 }, { 0x0981d4ea, 0x14000019 }, { 0x0981d504, 0x24000001 }, { 0x0981d507, 0x24000003 }, { 0x0981d50d, 0x24000007 }, { 0x0981d516, 0x24000006 }, { 0x0981d51e, 0x14000019 }, { 0x0981d538, 0x24000001 }, { 0x0981d53b, 0x24000003 }, { 0x0981d540, 0x24000004 }, { 0x0901d546, 0x24000000 }, { 0x0981d54a, 0x24000006 }, { 0x0981d552, 0x14000019 }, { 0x0981d56c, 0x24000019 }, { 0x0981d586, 0x14000019 }, { 0x0981d5a0, 0x24000019 }, { 0x0981d5ba, 0x14000019 }, { 0x0981d5d4, 0x24000019 }, { 0x0981d5ee, 0x14000019 }, { 0x0981d608, 0x24000019 }, { 0x0981d622, 0x14000019 }, { 0x0981d63c, 0x24000019 }, { 0x0981d656, 0x14000019 }, { 0x0981d670, 0x24000019 }, { 0x0981d68a, 0x1400001b }, { 0x0981d6a8, 0x24000018 }, { 0x0901d6c1, 0x64000000 }, { 0x0981d6c2, 0x14000018 }, { 0x0901d6db, 0x64000000 }, { 0x0981d6dc, 0x14000005 }, { 0x0981d6e2, 0x24000018 }, { 0x0901d6fb, 0x64000000 }, { 0x0981d6fc, 0x14000018 }, { 0x0901d715, 0x64000000 }, { 0x0981d716, 0x14000005 }, { 0x0981d71c, 0x24000018 }, { 0x0901d735, 0x64000000 }, { 0x0981d736, 0x14000018 }, { 0x0901d74f, 0x64000000 }, { 0x0981d750, 0x14000005 }, { 0x0981d756, 0x24000018 }, { 0x0901d76f, 0x64000000 }, { 0x0981d770, 0x14000018 }, { 0x0901d789, 0x64000000 }, { 0x0981d78a, 0x14000005 }, { 0x0981d790, 0x24000018 }, { 0x0901d7a9, 0x64000000 }, { 0x0981d7aa, 0x14000018 }, { 0x0901d7c3, 0x64000000 }, { 0x0981d7c4, 0x14000005 }, { 0x0901d7ca, 0x24000000 }, { 0x0901d7cb, 0x14000000 }, { 0x0981d7ce, 0x34000031 }, { 0x16820000, 0x1c00a6d6 }, { 0x1682f800, 0x1c00021d }, { 0x090e0001, 0x04000000 }, { 0x098e0020, 0x0400005f }, { 0x1b8e0100, 0x300000ef }, { 0x098f0000, 0x0c00fffd }, { 0x09900000, 0x0c00fffd }, }; syncevolution-1.5/src/synthesis/src/platform_adapters/0000755000373300037200000000000012424517753025024 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/platform_adapters/binfile.cpp0000755000373300037200000001235312424517753027147 0ustar00nightlyallusers00000000000000/** * @File binfile.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinFile * Standard C file implementation of TBinFile * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2006-03-28 : luz : created */ /* */ #include "prefix_file.h" #include "binfile.h" #ifdef WINCE #include "win32_utils.h" #endif #include #include namespace sysync { // @brief constructor TBinFile::TBinFile() : fCBinFile(NULL), fPos(0) { } // TBinFile // @brief destructor TBinFile::~TBinFile() { destruct(); } // TBinFile::~TBinFile // @brief test if platform file open bool TBinFile::platformFileIsOpen(void) { return fCBinFile!=NULL; } // TBinFile::platformFileIsOpen // A special FILE * pointer never returned by fopen(). #define TBINFILE_MEM_FILE stdin #define TBINFILE_MEM_FILE_PERFIX "/dev/null/" static bool IsNullFile(cAppCharP aFilePath) { return !strncmp(aFilePath, TBINFILE_MEM_FILE_PERFIX, strlen(TBINFILE_MEM_FILE_PERFIX)); } /// @brief Open a platform file bool TBinFile::platformOpenFile(cAppCharP aFilePath, TFileOpenModes aMode) { if (IsNullFile(aFilePath)) { fCBinFile = TBINFILE_MEM_FILE; fPos = 0; return true; } switch (aMode) { case fopm_update : fCBinFile = fopen(aFilePath,"r+b"); break; case fopm_create : fCBinFile = fopen(aFilePath,"w+b"); break; } return fCBinFile!=NULL; } // TBinFile::platformOpenFile /// @brief close file bool TBinFile::platformCloseFile(void) { if (fCBinFile && fCBinFile != TBINFILE_MEM_FILE) fclose(fCBinFile); fCBinFile=NULL; return true; } // TBinFile::platformCloseFile /// @brief seek in file bool TBinFile::platformSeekFile(uInt32 aPos, bool aFromEnd) { if (fCBinFile == TBINFILE_MEM_FILE) { if (aFromEnd) { if (aPos > fContent.size()) { return false; } fPos = fContent.size() - aPos; } else { fPos = aPos; } return true; } return fseek(fCBinFile,aPos,aFromEnd ? SEEK_END : SEEK_SET) == 0; } // TBinFile::platformSeekFile /// @brief read from file bool TBinFile::platformReadFile(void *aBuffer, uInt32 aMaxRead) { if (fCBinFile == TBINFILE_MEM_FILE) { if (fPos + aMaxRead <= fContent.size()) { memcpy(aBuffer, fContent.c_str() + fPos, aMaxRead); return true; } else { return false; } } return fread(aBuffer,aMaxRead,1,fCBinFile) == 1; } // TBinFile::platformReadFile /// @brief write to file bool TBinFile::platformWriteFile(const void *aBuffer, uInt32 aBytes) { if (fCBinFile == TBINFILE_MEM_FILE) { if (fPos < fContent.size()) { size_t partial = fContent.size() - fPos; if (partial > aBytes) { partial = aBytes; } fContent.replace(fPos, partial, (const char *)aBuffer, partial); fContent.append((const char *)aBuffer + partial, aBytes - partial); } else { fContent.resize(fPos); fContent.append((const char *)aBuffer, aBytes); } fPos += aBytes; return true; } // Don't overwrite content which is already exactly what we want it // to be. std::vector buffer(aBytes); char *addr = &buffer.front(); long offset = ftell(fCBinFile); if (offset == -1) return false; if (fread(addr,aBytes,1,fCBinFile) != 1 || memcmp(addr,aBuffer,aBytes)) { return fseek(fCBinFile,offset,SEEK_SET) == 0 && fwrite(aBuffer,aBytes,1,fCBinFile) == 1; } else { return true; } } // TBinFile::platformWriteFile /// @brief flush all buffers bool TBinFile::platformFlushFile(void) { if (fCBinFile == TBINFILE_MEM_FILE) { return true; } return fflush(fCBinFile)==0; } // TBinFile::platformFlushFile /// @brief truncate file to a specific length bool TBinFile::platformTruncateFile(uInt32 aNewSize) { if (fCBinFile == TBINFILE_MEM_FILE) { fContent.resize(aNewSize); return true; } #if defined(LINUX) || defined(MACOSX) fflush(fCBinFile); // unbuffer everything int fd = fileno(fCBinFile); // get file descriptor struct stat buffer; if (fstat(fd, &buffer) || buffer.st_size == (off_t)aNewSize || // avoid modifying file if it already has the right size ftruncate(fd,aNewSize)) { ; // error ignored } #elif defined(WIN32) fflush(fCBinFile); // unbuffer everything HANDLE h = (HANDLE)fileno(fCBinFile); // get file descriptor SetFilePointer(h,aNewSize,NULL,FILE_BEGIN); SetEndOfFile(h); #elif defined(__EPOC_OS__) #ifdef RELEASE_VERSION #warning "%%% we need file truncation for symbian here" #endif return false; #else #error "file truncation not implemented for this platform" #endif // successfully truncated return true; } // TBinFile::platformTruncateFile /// @delete file entirely bool TBinFile::platformDeleteFile(cAppCharP aFilePath) { if (IsNullFile(aFilePath)) { fPos = 0; fContent.clear(); return true; } #if defined(LINUX) || defined(MACOSX) unlink(aFilePath); #elif defined(WINCE) TCHAR filename[MAX_PATH]; UTF8toWCharBuf(aFilePath,filename,MAX_PATH); DeleteFileW(filename); #elif defined(WIN32) unlink(aFilePath); #else #error "file delete not implemented for this platform" #endif // successfully deleted return true; } // TBinFile::platformDeleteFile } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/platform_adapters/binfile.h0000755000373300037200000000311112424517753026604 0ustar00nightlyallusers00000000000000/** * @File binfile.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinFile * Standard C file implementation of TBinFile * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2006-03-28 : luz : created */ /* */ #ifndef BINFILE_H #define BINFILE_H #include "binfilebase.h" #ifdef ANDROID #include #include #endif namespace sysync { class TBinFile : public TBinFileBase { typedef TBinFileBase inherited; public: TBinFile(); virtual ~TBinFile(); protected: // Platform file implementation abstraction // - test if platform file open virtual bool platformFileIsOpen(void); // - open file virtual bool platformOpenFile(cAppCharP aFilePath, TFileOpenModes aMode); // - close file virtual bool platformCloseFile(void); // - seek in file virtual bool platformSeekFile(uInt32 aPos, bool aFromEnd=false); // - read from file virtual bool platformReadFile(void *aBuffer, uInt32 aMaxRead); // - write to file virtual bool platformWriteFile(const void *aBuffer, uInt32 aBytes); // - flush all buffers virtual bool platformFlushFile(void); // - truncate file to a specific length virtual bool platformTruncateFile(uInt32 aNewSize); // - delete file entirely virtual bool platformDeleteFile(cAppCharP aFilePath); private: FILE *fCBinFile; // When using aFilePath == "/dev/null/...", the content is never actually // written to disk. Instead it is kept in memory as part of the TBinFile // instance. std::string fContent; size_t fPos; }; // TBinFile } // namespace sysync #endif // BINFILE_H syncevolution-1.5/src/synthesis/src/platform_adapters/configfiles.h0000755000373300037200000000654612424517753027503 0ustar00nightlyallusers00000000000000/* * File: configfiles.h * * Author: Lukas Zeller (luz@plan44.ch) * * Platform adaptors for accessing config files * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-11-18 : luz : created * * */ // conditional field length specs for Xprintf #ifdef __PALM_OS__ // PalmOS do not support all formatting #define FMT_LENGTH(n) #define FMT_LENGTH_LIMITED(n,p) ((string(p,strlen(p)>n ? n : strlen(p))).c_str()) #define PRINTF_LLD "%ld" #define PRINTF_LLD_ARG(x) ((long)x) #ifdef NO64BITINT #define LONGLONGTOSTR(s,ll) %%%%%%% // cause compiling error #else #define LONGLONGTOSTR(s,ll) LongLongToStr(s,ll) // need a function to do that void LongLongToStr(string &s, sInt64 ll); #endif #else #define PRINTF_LLD "%lld" #define PRINTF_LLD_ARG(x) static_cast(x) #define FMT_LENGTH(n) n #define FMT_LENGTH_LIMITED(n,p) p #define LONGLONGTOSTR(s,ll) StringObjPrintf(s,"%lld",ll) #endif /* %%% replaced by getPlatformString() // get default paths // - for writing logs (when we have no configured log dir) bool getDefaultWritePath(string &aString); // - for reading local config (first try) bool getDefaultLocalConfigPath(string &aString); // - for reading global config (second try) bool getDefaultGlobalConfigPath(string &aString); */ // IDs to request platform-specific strings (mostly paths) // Note: paths do NOT have a trailing separator! typedef enum { pfs_platformvers, // version string of the current platform (as from getFirmwareVersion()) pfs_globcfg_path, // global system-wide config path (such as C:\Windows or /etc) pfs_loccfg_path, // local config path (such as exedir or user's dir) pfs_defout_path, // default path to writable directory to write default logs pfs_temp_path, // path where we can write temp files pfs_exedir_path, // path to directory where executable resides pfs_userdir_path, // path to the user's home directory for user-visible documents and files pfs_appdata_path, // path to the user's preference directory for this application pfs_prefs_path, // path to directory where all application prefs reside (not just mine) pfs_device_uri, // URI of the device (as from former getDeviceInfo) pfs_device_name, // Name of the device (as from former getHardwareVersion()) pfs_user_name, // Name of the current user numPlatformStrings } TPlatformStringID; /// @brief get platform specific string by ID /// @return false if string is not available for this platform /// @param aStringID string selector ID /// @param aString will receive the requested string bool getPlatformString(TPlatformStringID aStringID, string &aString); /// @brief update string such that it can be used as target OS directory path /// (filename can be appended without any separator) /// @param aPath path to be updated /// @param aMakeDirs if set, directories along path are created if not existing /// @return false if directory does not exist or could not be created (when aMakeDirs is set) bool makeOSDirPath(string &aPath, bool aMakeDirs=false); // returns timestamp (UTC) of last file modification or 0 if none known lineartime_t getFileModificationDate(const char *aFileName); // get local device URI (returns false if ID cannot be guaranteed unique) bool getLocalDeviceID(string &aURI); // write to platform's "console", whatever that is void PlatformConsolePuts(const char *aText); /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/0000755000373300037200000000000012424517753026163 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/platform_adapters/linux/configfiles.cpp0000755000373300037200000001704012424517753031164 0ustar00nightlyallusers00000000000000/* * File: configfiles.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Linux Platform adaptor for accessing config files * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-11-18 : luz : created * * */ #include "sysync.h" #ifdef ANDROID #include #endif #include #include // determine OS version static bool getOSVersion(string &aOSVersion) { // Obtain OS Version //%%%% for now aOSVersion="unknown"; return false; } // getOSVersion // determine hardware name static bool getHardwareName(string &aHardwareName) { // Obtain Device name #ifdef ANDROID aHardwareName="Android Device"; #else aHardwareName="Linux PC"; #endif return true; } // getHardwareName /// @brief get platform specific string by ID /// @return false if string is not available for this platform /// @param aStringID string selector ID /// @param aString will receive the requested string bool getPlatformString(TPlatformStringID aStringID, string &aString) { const sInt16 bufsiz=1024; char buffer[bufsiz]; buffer[0]=0; // terminate for safety string str; string aSub; struct passwd *userInfoP=NULL; switch (aStringID) { case pfs_platformvers: // Platform OS version string getOSVersion(aString); break; case pfs_device_uri: getLocalDeviceID(aString); break; case pfs_device_name: getHardwareName(aString); break; case pfs_loccfg_path: #ifdef STANDALONE_APP // default path for local config for XPT standalones is the current dir aString = "."; break; #endif // for server modules, it is same as the global config path #ifndef STANDALONE_APP case pfs_globcfg_path: // global config directory path aString = "/etc"; break; #endif case pfs_defout_path: // default output path (formerly: default write path) #ifdef STANDALONE_APP // default path for local config for XPT standalones is the current dir aString = "."; #else // for server modules, default log path is /var/log aString = "/var/log"; #endif break; case pfs_temp_path: // temp path aString = "/temp"; break; case pfs_userdir_path: // user's home dir for user-visible documents and files userInfoP = getpwuid(getuid()); aString = userInfoP->pw_dir; // home dir break; #ifdef APPDATA_SUBDIR case pfs_appdata_path: // My specific subdirectory for storing my app data/prefs userInfoP = getpwuid(getuid()); aString = userInfoP->pw_dir; // user home dir aSub = APPDATA_SUBDIR; #ifdef ANDROID aString += "/data/com.sysync"; // application specific subdir for android if (!aSub.empty()) aString+= "/"; // slash only if subdir is really there #else aString += "/.sysync/"; // application specific subdir // don't adapt it here to avoid potential problems on other platforms #endif aString += aSub; break; #endif /* case pfs_prefs_path: // general directory where all applications store data & prefs (for current user) aString = %%% break; */ /* case pfs_exedir_path: exedir: // path where module file resides aString = %%% break; */ default: // unknown ID return false; } // ok return true; } // getPlatformString extern "C" { #ifndef ANDROID #include #endif #include } /// @brief update string such that it can be used as target OS directory path /// (filename can be appended without any separator) /// @param aPath path to be updated /// @param aMakeDirs if set, directories along path are created if not existing /// @return false if directory does not exist or could not be created (when aMakeDirs is set) bool makeOSDirPath(string &aPath, bool aMakeDirs) { // make sure path ends with backslash string::size_type n=aPath.size(); if (n>=1 && aPath[n-1]!='/') aPath+='/'; // now make sure path exists if requested if (aMakeDirs) { // no slash at the end string tmppath; tmppath.assign(aPath,0,aPath.size()-1); // optimization check if entire path exists struct stat statinfo; int rc=stat(aPath.c_str(),&statinfo); if(rc!=0 || !S_ISDIR(statinfo.st_mode)) { #ifdef ANDROID rc = 0; // BFO_INCOMPLETE #else rc = errno; #endif // path does not exist yet - start from beginning to create it n=0; bool knownmissing=false; // skip first slash for absolute paths if (aPath[0]=='/') n+=1; // skip do { // find first directory in path n=aPath.find("/",n); // if no more separators to find, all dirs exist now if (n==string::npos) break; tmppath.assign(aPath,0,n); n+=1; // skip separator if (!knownmissing) { // test if this dir exists rc=stat(tmppath.c_str(),&statinfo); if(rc!=0 || !S_ISDIR(statinfo.st_mode)) { #ifdef ANDROID rc = 0; // BFO_INCOMPLETE #else rc = errno; #endif knownmissing=true; } } if (knownmissing) { // create the subdir (might fail if part of path already exists) if (mkdir(tmppath.c_str(),S_IRWXU)!=0) return false; // failure to create directory } } while(true); } // path does not exist yet entirely } // make path existing return true; } // makeOSDirPath // returns timestamp (UTC) of last file modification or 0 if none known lineartime_t getFileModificationDate(const char *aFileName) { struct stat st; lineartime_t res; if (stat(aFileName,&st)!=0) res=0; else { // stat ok, get modification date res= ((lineartime_t)st.st_mtime * secondToLinearTimeFactor) + UnixToLineartimeOffset; } // return timestamp return res; } // getFileModificationDate #include #include // get local device URI/name info bool getLocalDeviceID(string &aURI) { char szHostname[100]; string hostName; // get name of own machine if (gethostname(szHostname, sizeof(szHostname))!=0) { hostName="_unknown_"; } else { // A network lookup of the domain name is not likely // to yield any good result on most Linux consumer // devices. It just causes a slowdown, in particular // when the device is not currently connected (which // does not necessarily prevent syncing, for example // when using Bluetooth); 10 second delays have // been observed while the network stack waits for // a timeout (FDO #70771). // // To avoid that timeout, disable this code unconditionally. #if 0 struct hostent *pHostEnt=NULL; // get host entry pHostEnt = gethostbyname(szHostname); // return fully qualified name of machine as ID if (pHostEnt) hostName=pHostEnt->h_name; // DNS name of machine else #endif hostName=szHostname; // just name of machine } // generate URI from name #ifdef ANDROID aURI="android:"; #else aURI="linux:"; // %%% SCTS does not like http:// here, so we take os:xxxx #endif // add name of this machine (fully qualified if possible) aURI+=hostName; // this is more or less unique return true; } // getLocalDeviceID // write to platform's "console", whatever that is void PlatformConsolePuts(const char *aText) { // generic output #ifdef ANDROID //__android_log_write( ANDROID_LOG_DEBUG, "ConsolePuts", aText ); #else puts(aText); // appends newline itself #endif } // PlatformConsolePuts /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/ctype0000755000373300037200000000012012424517753027226 0ustar00nightlyallusers00000000000000// platform has no new C++ type header for this include file #include syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_DLL.cpp0000755000373300037200000001207712424517753031220 0ustar00nightlyallusers00000000000000/* * File: platform_DLL.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * General interface to access the routines * of a DLL (LINUX platform) * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * */ #define DLOPEN_NO_WARN 1 #define GNU_SOURCE 1 #include // the Linux DLL functionality #include "platform_DLL.h" #include #include #include #include using namespace std; /** * Instances of this class are returned * as DLL handles to the caller of ConnectDLL. * * Loadable modules are opened dlopen() and * functions are found via dlsym(). If the * platform supports RTLD_DEFAULT and finds * a _Module_Version, then dlopen() * isn't used and all functions are searched * via RTLD_DEFAULT. */ class DLWrapper { /** * name of shared object, including suffix, * or function prefix (when functions were * linked in) * * As a special case, "//static/=
/..." is supported, * with being the name of a symbol at an address * specified as decimal value in
. */ string aDLLName; /** dlopen() result, NULL if not opened */ void *aDLL; /** result of parsing aDLLName when it contains the "static:" format. */ map fSymbols; public: DLWrapper(const char *name) : aDLLName(name), aDLL(NULL) {} /** check for linked function or open shared object, return true for success */ bool connect() { string prefix = "//static/"; if (aDLLName.substr(0, prefix.size()) == prefix) { const char *token = aDLLName.c_str() + prefix.size(); string sym; uintptr_t adr = 0; bool done = false; while (!done) { // scan name switch (*token) { case 0: // premature end done = true; break; default: sym += *token; token++; break; case '/': // symbol without address?! sym = ""; token++; break; case '=': token++; // scan decimal address while (!done && sym.size()) { switch (*token) { case 0: done = true; // fall through case '/': if (sym.size() && adr) fSymbols[sym] = (void *)adr; sym = ""; adr = 0; token++; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': adr = adr * 10 + *token - '0'; token++; break; default: // ??? token++; break; } } break; } } return true; } #ifdef RTLD_NEXT string fullname = aDLLName + "_Module_Version"; if (dlsym(RTLD_DEFAULT, fullname.c_str())) return true; #endif const char* DSuff= ".so"; string lName; string aName= aDLLName; do { aDLL = dlopen(aName.c_str(), RTLD_LAZY); if (!dlerror()) break; aName+= DSuff; aDLL = dlopen(aName.c_str(), RTLD_LAZY); if (!dlerror()) break; lName= "./"; lName+= aName; // try Linux current path as well aDLL = dlopen( lName.c_str(), RTLD_LAZY ); if (!dlerror()) break; aDLL = dlopen( aDLLName.c_str(), RTLD_LAZY ); if (!dlerror()) break; lName= "./"; lName+= aDLLName; // try Linux current path as well aDLL = dlopen( lName.c_str(), RTLD_LAZY ); } while (false); return !dlerror(); } bool destroy() { bool ok = true; if (this) { if (aDLL) { int err = dlclose(aDLL); ok = !err; } delete this; } return ok; } bool function(const char *aFuncName, void *&aFunc) { map::const_iterator it = fSymbols.find(aFuncName); if ((it) != fSymbols.end()) { aFunc = it->second; return true; } #ifdef RTLD_DEFAULT if (!aDLL) { string fullname = aDLLName + '_' + aFuncName; aFunc = dlsym(RTLD_DEFAULT, fullname.c_str()); } else #endif aFunc = dlsym(aDLL, aFuncName); return aFunc!=NULL && dlerror()==NULL; } }; bool ConnectDLL( void* &aDLL, const char* aDLLname, ErrReport aReport, void* ref ) /* Connect to , result is reference */ /* Returns true, if successful */ { DLWrapper *wrapper = new DLWrapper(aDLLname); bool ok = false; if (wrapper) { ok = wrapper->connect(); if (ok) aDLL = (void *)wrapper; else delete wrapper; } if (!ok && aReport) aReport( ref, aDLLname ); return ok; } // ConnectDLL bool DisconnectDLL( void* aDLL ) /* Disconnect */ { return ((DLWrapper *)aDLL)->destroy(); } // DisonnectDLL bool DLL_Function( void* aDLL, const char* aFuncName, void* &aFunc ) /* Get of */ /* Returns true, if available */ { return ((DLWrapper *)aDLL)->function(aFuncName, aFunc); } // DLL_Function /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_exec.c0000755000373300037200000000423512424517753031166 0ustar00nightlyallusers00000000000000/* * File: platform_exec.c * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific implementation for executing external commands * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-07-21 : luz : created * */ #include "platform_exec.h" #include #include #include // returns -1 if command could not be started, exit code of the command otherwise. // if used with aBackground==true, the return code is always 0 in case sInt32 shellExecCommand(cAppCharP aCommandName, cAppCharP aCommandParams, int aBackground) { int status; uInt32 cmdlen; char *cmd; if (!aCommandName || *aCommandName==0) return 0; // no command -> exec "successful" // simply use system() // - prepare command line cmdlen= strlen(aCommandName) + (aCommandParams ? strlen(aCommandParams) : 0) + 2; // for separator and terminator cmd=malloc(cmdlen); strcpy(cmd,aCommandName); if (aCommandParams) { strcat(cmd," "); strcat(cmd,aCommandParams); } // - execute status=system(cmd); free(cmd); return status; /* does not work ok // fork pid = fork(); alarm(0); // make sure we have no alarm running if (pid == -1) return -1; // fork failed if (pid == 0) { // forked process // prepare command line cmdlen= strlen(aCommandName) + (aCommandParams ? strlen(aCommandParams) : 0) + 2; // for separator and terminator cmd=malloc(cmdlen); strcpy(cmd,aCommandName); if (aCommandParams) { strcat(cmd," "); strcat(cmd,aCommandParams); } // prepare for execve argv[0] = "sh"; argv[1] = "-c"; argv[2] = cmd; argv[3] = 0; envp[1] = 0; // no environment execve("/bin/sh", argv, envp); // replace process, will exit with command's exit code exit(-1); // problem executing } else { // process that called fork() do { if (waitpid(pid, &status, 0) == -1) { // keep waiting if it's EINTR if (errno != EINTR) return -1; } else { // return exit status of executed process return status; } } while(1); } */ } // shellExecCommand /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_exec.h0000755000373300037200000000114512424517753031170 0ustar00nightlyallusers00000000000000/* * File: platform_exec.h * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific implementation for executing external commands * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-07-21 : luz : created * */ #include #ifdef __cplusplus extern "C" { #endif // returns -1 if command could not be started, exit code of the command otherwise. // if used with aBackground==true, the return code is always 0 in case sInt32 shellExecCommand(cAppCharP aCommandName, cAppCharP aCommandParams, int aBackground); #ifdef __cplusplus } #endif /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_headers.h0000755000373300037200000000114212424517753031654 0ustar00nightlyallusers00000000000000/* * File: platform_headers.h * * Author: Lukas Zeller (luz@plan44.ch) * * Common include files for all platform-related standard headers * (suitable for precompiled headers and/or prefix file) * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * NOTE: this file is part of the mod_sysync source files. * */ #ifndef __PLATFORM_HEADERS_H #define __PLATFORM_HEADERS_H // ANSI C #include #include #include #include #include #include // C++ #ifdef __cplusplus #endif // __cplusplus #endif // eof syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_time.cpp0000755000373300037200000000545312424517753031543 0ustar00nightlyallusers00000000000000/* * File: platform_time.cpp * * Platform specific time implementations * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2004-11-15 : luz : extracted from lineartime.h */ // For tm_gmtoff on Linux. #ifndef _BSD_SOURCE # define _BSD_SOURCE 1 #endif #include #include "prefix_file.h" #include "lineartime.h" #include "timezones.h" // Linux uses standard c time stuff //#warning "probably better use here" #ifndef ANDROID #include #include #include #endif #include #include // - Linux specific time stuff #include // - we need some library extras #define __USE_MISC 1 #ifndef ANDROID #include #endif namespace sysync { /// @brief get system real time /// @return system's real time in lineartime_t scale, in specified time zone context /// @param[in] aTimeContext desired output time zone lineartime_t getSystemNowAs(timecontext_t aTimeContext,GZones *aGZones, bool noOffset) { #ifdef NOW_WITH_MILLISECONDS // high precision time, UTC based struct timeval tv; // gettimeofday return seconds and milliseconds since start of the UNIX epoch gettimeofday(&tv,NULL); lineartime_t systime = (tv.tv_sec*secondToLinearTimeFactor+UnixToLineartimeOffset) + (tv.tv_usec*secondToLinearTimeFactor/1000000); #else // standard precision time (unix time), base is UTC time_t t = time(NULL); lineartime_t systime = t*secondToLinearTimeFactor+UnixToLineartimeOffset; #endif // - return as-is if requested time zone is UTC if (noOffset || TCTX_IS_UTC(aTimeContext)) return systime; // return as-is #ifndef ANDROID // - shortcut: conversion to system time is faster when done using // glibc. tm_gmtoff is a glibc extension, so don't try to use it on // Android. if (TCTX_IS_SYSTEM(aTimeContext)) { struct tm tm; if (localtime_r( #ifdef NOW_WITH_MILLISECONDS &tv.tv_sec #else &t #endif , &tm)) { return systime + (tm.tm_gmtoff * secondToLinearTimeFactor); } } #endif // - convert to requested zone sInt32 aOffsSeconds; if (!TzOffsetSeconds(systime,TCTX_UTC,aTimeContext,aOffsSeconds,aGZones)) return noLinearTime; // no time // return time with offset return systime + (aOffsSeconds * secondToLinearTimeFactor); } // getSystemNowAs /// @brief fine resolution sleep support /// @param[in] aHowLong desired time to wait in lineartime_t units void sleepLineartime(lineartime_t aHowLong) { // Linux has nanosleep in nanoseconds timespec sleeptime; sleeptime.tv_sec=aHowLong/secondToLinearTimeFactor; sleeptime.tv_nsec=(aHowLong % secondToLinearTimeFactor)*1000000L; nanosleep(&sleeptime,NULL); } // sleepLineartime } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_time.h0000755000373300037200000000267612424517753031214 0ustar00nightlyallusers00000000000000/* * File: platform_time.h * * Platform specific time implementations * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2004-11-15 : luz : extracted from lineartime.h */ #ifndef PLATFORM_TIME_H #define PLATFORM_TIME_H //#include #include "math.h" // for floor() needed in lineartime.cpp /* obsolete using namespace std; namespace sysync { // define a type for it typedef struct std::tm struct_tm; // Windows and Linux/MacOSX have UNIX-time compatible origin // which is 1970-01-01 00:00:00 // but as we have 64bit ints, we use our own linear time // in milliseconds (=24*60*60*1000*lineardate) typedef sInt32 lineardate_t; // standard Linux/Win32/MacOSX typedef sInt64 lineartime_t; const lineartime_t noLinearTime = 0x0; // undefined lineartime value const lineartime_t maxLinearTime = 0x7FFFFFFFFFFFFFFFLL; // signed 64 bit // date origin definition relative to algorithm's origin -4712-01-01 00:00:00 const lineardate_t linearDateOriginOffset=0; // no offset const sInt16 linearDateOriginWeekday=1; // Monday // scaling of lineartime relative to seconds const lineartime_t secondToLinearTimeFactor = 1000; // unit is milliseconds // On Linux, we always need the new timezones implementation #define NEW_TIMEZONES 1 // fine resolution sleep support void sleepLineartime(lineartime_t aHowLong); } // namespace sysync */ #endif // PLATFORM_TIME_H /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/platform_timezones.cpp0000644000373300037200000002440612424517753032616 0ustar00nightlyallusers00000000000000/* * File: platform_timezones.cpp * * Authors: Lukas Zeller / Patrick Ohly * Beat Forster * * Time zone dependent routines for Linux * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2009-04-02 : Created by Lukas Zeller from timezones.cpp work by Patrick Ohly * */ // must be first in file, everything above is ignored by MVC compilers #include "prefix_file.h" #ifdef HAVE_CONFIG_H # include #endif #if defined(HAVE_LIBICAL) && defined(EVOLUTION_COMPATIBILITY) # ifndef _GNU_SOURCE # define _GNU_SOURCE 1 # endif # include #endif #include "timezones.h" #include "vtimezone.h" #include "sysync_debug.h" #ifdef HAVE_LIBICAL # ifndef HANDLE_LIBICAL_MEMORY # define HANDLE_LIBICAL_MEMORY 1 # endif # include #endif #ifdef LINUX extern char *tzname[ 2 ]; #ifndef BSD extern long timezone; #endif extern int daylight; #endif #ifdef EVOLUTION_COMPATIBILITY // Avoid calling libical directly. This way libsynthesis does not // depend on a specific version of libecal (which changed its soname // frequently, without affecting libical much!) or libical. The user // of libsynthesis has to make sure that the necessary ical functions // can be found via dlsym(RTLD_DEFAULT) when // loadSystemZoneDefinitions() is invoked during the initialization of // a Synthesis engine. static struct { icalarray *(* icaltimezone_get_builtin_timezones_p)(); void *(* icalarray_element_at_p)(icalarray *array, unsigned index); icalcomponent *(* icaltimezone_get_component_p)(icaltimezone *zone); char *(* icalcomponent_as_ical_string_p)(icalcomponent *comp); bool must_free_strings; } icalcontext; static icalarray *ICALTIMEZONE_GET_BUILTIN_TIMEZONES() { // Called once by loadSystemZoneDefinitions(), so initialize context // now. Redoing this on each invocation allows unloading libical // because we won't reuse stale pointers. memset(&icalcontext, 0, sizeof(icalcontext)); icalcontext.icaltimezone_get_builtin_timezones_p = (typeof(icalcontext.icaltimezone_get_builtin_timezones_p))dlsym(RTLD_DEFAULT, "icaltimezone_get_builtin_timezones"); icalcontext.icalarray_element_at_p = (typeof(icalcontext.icalarray_element_at_p))dlsym(RTLD_DEFAULT, "icalarray_element_at"); icalcontext.icaltimezone_get_component_p = (typeof(icalcontext.icaltimezone_get_component_p))dlsym(RTLD_DEFAULT, "icaltimezone_get_component"); icalcontext.icalcomponent_as_ical_string_p = (typeof(icalcontext.icalcomponent_as_ical_string_p))dlsym(RTLD_DEFAULT, "icalcomponent_as_ical_string_r"); if (icalcontext.icalcomponent_as_ical_string_p) { // found icalcomponent_as_ical_string_r() which always requires freeing icalcontext.must_free_strings = TRUE; } else { // fall back to older icalcomponent_as_ical_string() which may or may not // require freeing the returned string; this can be determined by checking // for "ical_memfixes" (EDS libical) icalcontext.icalcomponent_as_ical_string_p = (typeof(icalcontext.icalcomponent_as_ical_string_p))dlsym(RTLD_DEFAULT, "icalcomponent_as_ical_string"); icalcontext.must_free_strings = dlsym(RTLD_DEFAULT, "ical_memfixes") != NULL; } return icalcontext.icaltimezone_get_builtin_timezones_p ? icalcontext.icaltimezone_get_builtin_timezones_p() : NULL; } static void *ICALARRAY_ELEMENT_AT(icalarray *array, unsigned index) { return icalcontext.icalarray_element_at_p ? icalcontext.icalarray_element_at_p(array, index) : NULL; } static icalcomponent *ICALTIMEZONE_GET_COMPONENT(icaltimezone *zone) { return icalcontext.icaltimezone_get_component_p ? icalcontext.icaltimezone_get_component_p(zone) : NULL; } static char *ICALCOMPONENT_AS_ICAL_STRING(icalcomponent *comp) { return icalcontext.icalcomponent_as_ical_string_p ? icalcontext.icalcomponent_as_ical_string_p(comp) : NULL; } static void ICAL_FREE(char *str) { if (icalcontext.must_free_strings && str) free(str); } #else // call functions directly # define ICALTIMEZONE_GET_BUILTIN_TIMEZONES icaltimezone_get_builtin_timezones # define ICALARRAY_ELEMENT_AT icalarray_element_at # define ICALTIMEZONE_GET_COMPONENT icaltimezone_get_component # if defined(HAVE_LIBICAL) && !defined(HAVE_LIBECAL) # // new-style libical _r version which requires freeing the string # define ICALCOMPONENT_AS_ICAL_STRING icalcomponent_as_ical_string_r # define ICAL_FREE(_x) free(_x) # else # define ICALCOMPONENT_AS_ICAL_STRING icalcomponent_as_ical_string # ifdef LIBICAL_MEMFIXES // new-style Evolution libical: memory must be freed by caller # define ICAL_FREE(_x) free(_x) # else // old-style libical: memory is stored in buffers owned by libical # define ICAL_FREE(_x) # endif # endif #endif namespace sysync { /*! @brief platform specific loading of time zone definitions * @return true if this list is considered complete (i.e. no built-in zones should be used additionally) * @param[in/out] aGZones : the GZones object where system zones should be loaded into */ bool loadSystemZoneDefinitions(GZones* aGZones) { // always add the builtin time zones return false; } // loadSystemZoneDefinitions /*! @brief we use this callback to add and log libical time zone handling * * The advantage is that this handling can be logged. The disadvantage * is that these time zones cannot be used in the configuration. Builtin * time zones (if any) have to be used there. */ void finalizeSystemZoneDefinitions(GZones* aGZones) { // load zones from system here #ifdef HAVE_LIBICAL PLOGDEBUGBLOCKDESCCOLL(aGZones->getDbgLogger, "loadSystemZoneDefinitions", "Linux system time zones"); icalarray *builtin = ICALTIMEZONE_GET_BUILTIN_TIMEZONES(); #ifdef EVOLUTION_COMPATIBILITY PLOGDEBUGPRINTFX(aGZones->getDbgLogger, DBG_PARSE+DBG_EXOTIC, ("runtime check: libical %s", icalcontext.icaltimezone_get_builtin_timezones_p ? "available" : "unavailable")) #endif if (!builtin) { PLOGDEBUGPUTSX(aGZones->getDbgLogger, DBG_PARSE+DBG_ERROR, "could not read timezone information from libical"); return; } PLOGDEBUGPRINTFX(aGZones->getDbgLogger, DBG_PARSE+DBG_EXOTIC, ("%d time zones from libical", builtin->num_elements)); for (unsigned i = 0; builtin && i < builtin->num_elements; i++) { icaltimezone *zone = (icaltimezone *)ICALARRAY_ELEMENT_AT(builtin, i); if (!zone) continue; icalcomponent *comp = ICALTIMEZONE_GET_COMPONENT(zone); if (!comp) continue; char *vtimezone = ICALCOMPONENT_AS_ICAL_STRING(comp); if (!vtimezone) continue; PLOGDEBUGPUTSX(aGZones->getDbgLogger, DBG_PARSE+DBG_EXOTIC, vtimezone); tz_entry t; if (VTIMEZONEtoTZEntry( vtimezone, t, #ifdef SYDEBUG aGZones->getDbgLogger #endif )) { t.ident = ""; t.dynYear = ""; // expect Olson /// TZIDs and // extract the trailing location (which might contain // several slashes, so a backwards search doesn't work) std::string::size_type off; if (t.name.size() > 2 && t.name[0] == '/' && (off = t.name.find('/', 1)) != t.name.npos && (off = t.name.find('/', off + 1)) != t.name.npos) { t.location = t.name.substr(off + 1); // also use that simplified location as TZID (shorter, // some (broken) storages like the N900 calendar can only // handle such shortened TZIDs while correct storages // should be able to handle both) t.name = t.location; } aGZones->tzP.push_back(t); } ICAL_FREE(vtimezone); } PLOGDEBUGENDBLOCK(aGZones->getDbgLogger, "loadSystemZoneDefinitions"); #else PLOGDEBUGPUTSX(aGZones->getDbgLogger, DBG_PARSE+DBG_EXOTIC, "support for libical not compiled"); #endif // HAVE_LIBICAL } // finalizeSystemZoneDefinitions /*! @brief get current system time zone * @return true if successful * @param[out] aContext : the time zone context representing the current system time zone. * @param[in] aGZones : the GZones object. */ bool getSystemTimeZoneContext(timecontext_t &aContext, GZones* aGZones) { tz_entry t; bool ok = true; #ifdef ANDROID time_t rawtime; time( &rawtime ); struct tm* timeinfo= localtime( &rawtime ); //struct tm* utc_info= gmtime( &rawtime ); //if (timeinfo) t.name= timeinfo->tm_zone; //__android_log_write( ANDROID_LOG_DEBUG, "tzname[ 0 ]", tzname[ 0 ] ); //__android_log_write( ANDROID_LOG_DEBUG, "tzname[ 1 ]", tzname[ 1 ] ); #else tzset(); #endif if (t.name=="") { t.name = tzname[ 0 ]; if (strcmp( t.name.c_str(), tzname[ 1 ] )!=0) { t.name+= "/"; t.name+= tzname[ 1 ]; } // if } // if //if (isDbg) PNCDEBUGPRINTFX( DBG_SESSION, ( "Timezone: %s", sName.c_str() )); // search based on name before potentially using offset search if (TimeZoneNameToContext( t.name.c_str(),aContext, aGZones )) { //#ifdef ANDROID // __android_log_print( ANDROID_LOG_DEBUG, "tz ok", "'%s' %d\n", t.name.c_str(), aContext ); //#endif return true; // found, done } #if defined USE_TM_GMTOFF else { // We can use tm_gmtoff as fallback when the name computed above doesn't // match: identify offsets, then search based on offsets. time_t now = time(NULL); bool have_dst = false, have_std = false; // start searching for offsets today, moving ahead one week at a time int week = 0; do { struct tm tm; time_t day = now + 60 * 60 * 24 * 7 * week; localtime_r(&day, &tm); if (tm.tm_isdst) { if (!have_dst) { t.biasDST = tm.tm_gmtoff / 60; have_dst = true; } } else { if (!have_std) { t.bias = tm.tm_gmtoff / 60; have_std = true; } } week++; } while ((!have_std || !have_dst) && week <= 54); if (have_dst) { if (have_std) { // make biasDST relative to bias t.biasDST -= t.bias; } else { // daylight saving without standard?! } } // search for name based on offsets t.ident="o"; if (FoundTZ(t, t.name, aContext, aGZones)) goto done; } #endif // USE_TM_GMTOFF // not enough information to create a new time zone below, give up ok = false; done: return ok; } // getSystemTimeZoneContext } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/linux/profiling.cpp0000755000373300037200000000100512424517753030657 0ustar00nightlyallusers00000000000000/* * File: profiling.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Platform-dependent profiling implementation * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-10-01 : luz : created * */ #include "profiling.h" #include "sysync_globs.h" #ifdef TIME_PROFILING #error "No time profiling for linux yet" #endif // TIME_PROFILING #ifdef MEMORY_PROFILING #error "No memory profiling for linux yet" #error "Seems to be dangerous" #endif // MEMORY_PROFILING /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/0000755000373300037200000000000012424517753026316 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/configfiles.mm0000644000373300037200000002457012424517753031151 0ustar00nightlyallusers00000000000000/* * File: configfiles.mm * * Author: Lukas Zeller (luz@plan44.ch) * * iPhoneOS Platform adaptor * * Copyright (c) 2008-2012 by plan44.ch + Synthesis AG * * 2008-06-12 : luz : created * */ #import #import #import #include "sysync.h" #ifdef MOBOSX #import #else #include #include extern "C" { #include #include #include } #endif #ifdef MOBOSX // iPhone // determine OS version static bool getOSVersion(string &aOSVersion) { UIDevice *theDevice = [UIDevice currentDevice]; // Obtain OS Version // - Name aOSVersion = [theDevice.systemName UTF8String]; aOSVersion += "/"; // - Version aOSVersion += [theDevice.systemVersion UTF8String]; return true; } // getOSVersion // determine hardware name static bool getHardwareName(string &aHardwareName) { UIDevice *theDevice = [UIDevice currentDevice]; // device name aHardwareName = [theDevice.model UTF8String]; return true; } // getHardwareName static void getMacDir(string &aString, bool aIsTemp) { // get home or temp directory NSString *dir; if (aIsTemp) dir = NSTemporaryDirectory(); else dir = NSHomeDirectory(); aString = [dir UTF8String]; } // getMacDir #else // Mac OS X // determine OS version static bool getOSVersion(string &aOSVersion) { // Obtain OS Version int mib[2]; size_t len; char *p; mib[0] = CTL_KERN; // - %%% we can't easily get the 10.x.x string, so what we show here is the Darwin version mib[1] = KERN_OSTYPE; sysctl(mib, 2, NULL, &len, NULL, 0); p = (char *)malloc(len); sysctl(mib, 2, p, &len, NULL, 0); aOSVersion = p; free(p); aOSVersion += "/"; mib[1] = KERN_OSRELEASE; sysctl(mib, 2, NULL, &len, NULL, 0); p = (char *)malloc(len); sysctl(mib, 2, p, &len, NULL, 0); aOSVersion += p; free(p); return true; } // getOSVersion // determine hardware name static bool getHardwareName(string &aHardwareName) { // device name // - use sysctl to get machine/model name int mib[2]; size_t len; char *p; mib[0] = CTL_HW; // - the machine (is the name on MOBOSX "iPod1,1", but the CPU Architecture for MacOSX "i386") mib[1] = HW_MACHINE; sysctl(mib, 2, NULL, &len, NULL, 0); p = (char *)malloc(len); sysctl(mib, 2, p, &len, NULL, 0); aHardwareName = p; free(p); aHardwareName += "/"; // - the model (is the model number on MOBOSX "N45AP", "M68xx", but the model of MacOSX "MacBookPro1,2" mib[1] = HW_MODEL; sysctl(mib, 2, NULL, &len, NULL, 0); p = (char *)malloc(len); sysctl(mib, 2, p, &len, NULL, 0); aHardwareName += p; free(p); return true; } // getHardwareName static void getMacDir(string &aString, bool aIsTemp) { #ifdef xxxxxyyyyGUGUS // %%% probably use getEnv(HOME) and TEMP resp. CFStringRef cfstr; if (aIsTemp) cfstr = (CFStringRef)NSTemporaryDirectory(); else cfstr = (CFStringRef)NSHomeDirectory(); // convert to UTF8 application string CFStringGetCString(cfstr,buffer,bufsiz,kCFStringEncodingUTF8); CFRelease(cfstr); aString = buffer; #else #ifdef MOBOSX #warning "must get real HOME and TMP env vars or leave these undefined" // %%% hoping for app starting in its HOME dir anyway if (aIsTemp) aString = "./tmp"; else aString = "."; #else // Mac OS X is unix style if (aIsTemp) { aString = "/tmp"; } else { struct passwd *userInfoP=NULL; userInfoP = getpwuid(getuid()); aString = userInfoP->pw_dir; // home dir } #endif // mac os x #endif // q&d methods } // getMacDir #endif /// @brief get platform specific string by ID /// @return false if string is not available for this platform /// @param aStringID string selector ID /// @param aString will receive the requested string bool getPlatformString(TPlatformStringID aStringID, string &aString) { const sInt16 bufsiz=1024; char buffer[bufsiz]; buffer[0]=0; // terminate for safety string str; switch (aStringID) { case pfs_platformvers: // Platform OS version string getOSVersion(aString); break; case pfs_device_uri: getLocalDeviceID(aString); break; case pfs_device_name: getHardwareName(aString); break; case pfs_loccfg_path: #ifdef STANDALONE_APP // default path for local config for XPT standalones is the current dir aString = "."; break; #endif // for server modules, it is same as the global config path #ifndef STANDALONE_APP case pfs_globcfg_path: // global config directory path aString = "/etc"; break; #endif case pfs_defout_path: // default output path (formerly: default write path) #ifdef STANDALONE_APP // default path for local config for XPT standalones is the current dir aString = "."; #else // for server modules, default log path is /var/log aString = "/var/log"; #endif break; case pfs_temp_path: // temp path, common for Mac OS X and iPhoneOS getMacDir(aString,true); break; case pfs_userdir_path: getMacDir(aString,false); break; // iPhone OS, with sandboxed apps case pfs_prefs_path: // "application support" is also in sandbox Documents case pfs_appdata_path: // appdata for iPhone is just Documents in the app Sandbox getMacDir(aString,false); aString += "/Documents"; break; case pfs_exedir_path: exedir: // path where module file resides (bundle path) aString = [[[NSBundle mainBundle] bundlePath] UTF8String]; break; default: // unknown ID return false; } // ok return true; } // getPlatformString extern "C" { #include #include } /// @brief update string such that it can be used as target OS directory path /// (filename can be appended without any separator) /// @param aPath path to be updated /// @param aMakeDirs if set, directories along path are created if not existing /// @return false if directory does not exist or could not be created (when aMakeDirs is set) bool makeOSDirPath(string &aPath, bool aMakeDirs) { // make sure path ends with backslash uInt32 n=aPath.size(); if (n>2 && aPath[n-1]!='/') aPath+='/'; // now make sure path exists if requested if (aMakeDirs) { // no slash at the end string tmppath; tmppath.assign(aPath,0,aPath.size()-1); // optimization check if entire path exists struct stat statinfo; int rc=stat(aPath.c_str(),&statinfo); if(rc!=0 || !S_ISDIR(statinfo.st_mode)) { // path does not exist yet - start from beginning to create it n=0; bool knownmissing=false; // skip first slash for absolute paths if (aPath[0]=='/') n+=1; // skip do { // find first directory in path n=aPath.find("/",n); // if no more separators to find, all dirs exist now if (n==string::npos) break; tmppath.assign(aPath,0,n); n+=1; // skip separator if (!knownmissing) { // test if this dir exists rc=stat(tmppath.c_str(),&statinfo); if(rc!=0 || !S_ISDIR(statinfo.st_mode)) { knownmissing=true; } } if (knownmissing) { // create the subdir (might fail if part of path already exists) if (mkdir(tmppath.c_str(),S_IRWXU)!=0) return false; // failure to create directory } } while(true); } // path does not exist yet entirely } // make path existing return true; } // makeOSDirPath // returns timestamp (UTC) of last file modification or 0 if none known lineartime_t getFileModificationDate(const char *aFileName) { struct stat st; lineartime_t res; if (stat(aFileName,&st)!=0) res=0; else { // stat ok, get modification date res= ((lineartime_t)st.st_mtime * secondToLinearTimeFactor) + UnixToLineartimeOffset; } // return timestamp return res; } // getFileModificationDate #ifdef MOBOSX // iOS // get local device URI/ID bool getLocalDeviceID(string &aURI) { UIDevice *theDevice = [UIDevice currentDevice]; NSString *deviceID = nil; #ifdef __IPHONE_6_0 if ([theDevice respondsToSelector:@selector(identifierForVendor)]) { // iOS 6 style identifier NSUUID *ifv = [theDevice identifierForVendor]; if (ifv) { deviceID = [ifv UUIDString]; if (deviceID && [deviceID isEqualToString:@"00000000-0000-0000-0000-000000000000"]) { deviceID = nil; // not valid, forget it! } } } #endif if (deviceID==nil) { // Obtain old-style unique ID, in disguise because we should not use it any more // "uniqueIdentifier" SEL uiSEL = NSSelectorFromString([NSString stringWithFormat:@"un%c%cu%1xI%2xnti%1xier",'i','q',0x0E,0xDE,0x0F]); deviceID = [theDevice performSelector:uiSEL]; } // now return if ok if (deviceID) { aURI = [deviceID UTF8String]; return true; } else { aURI = "iOSDev-without-unique-ID"; return false; // no unique device ID } } // getLocalDeviceID #else // Mac OS X // get local device URI/ID bool getLocalDeviceID(string &aURI) { // Get serial number from IOKit CFStringRef serialNumber = NULL; io_service_t platformExpert = IOServiceGetMatchingService( kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice") ); if (platformExpert) { CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty( platformExpert, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0 ); if (serialNumberAsCFString) { serialNumber = (CFStringRef)serialNumberAsCFString; } IOObjectRelease(platformExpert); } if (serialNumber) { // found serial number // - get as C string const size_t bufSiz=100; char serialBuf[bufSiz]; if (CFStringGetCString( serialNumber, serialBuf, bufSiz, kCFStringEncodingUTF8 )) { // now put into STL string aURI = "OSX:"; aURI += serialBuf; } // release the CFString CFRelease(serialNumber); // unique number found return true; } // no serial aURI = "OSX_without_serial"; return false; } // getLocalDeviceID #endif // write to platform's "console", whatever that is void PlatformConsolePuts(const char *aText) { // generic standard output puts(aText); // appends newline itself } // PlatformConsolePuts /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/platform_exec.c0000644000373300037200000000217612424517753031320 0ustar00nightlyallusers00000000000000/* * File: platform_exec.c * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific implementation for executing external commands * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-07-21 : luz : created * */ #include "platform_exec.h" #include #include #include // returns -1 if command could not be started, exit code of the command otherwise. // if used with aBackground==true, the return code is always 0 in case sInt32 shellExecCommand(cAppCharP aCommandName, cAppCharP aCommandParams, int aBackground) { int status; uInt32 cmdlen; char *cmd; if (!aCommandName || *aCommandName==0) return 0; // no command -> exec "successful" // simply use system() // - prepare command line cmdlen= strlen(aCommandName) + (aCommandParams ? strlen(aCommandParams) : 0) + 2; // for separator and terminator cmd= (char*)malloc(cmdlen); strcpy(cmd,aCommandName); if (aCommandParams) { strcat(cmd," "); strcat(cmd,aCommandParams); } // - execute status=system(cmd); free(cmd); return status; } // shellExecCommand /* eof */syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/platform_exec.h0000644000373300037200000000114612424517753031321 0ustar00nightlyallusers00000000000000/* * File: platform_exec.h * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific implementation for executing external commands * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-07-21 : luz : created * */ #include #ifdef __cplusplus extern "C" { #endif // returns -1 if command could not be started, exit code of the command otherwise. // if used with aBackground==true, the return code is always 0 in case sInt32 shellExecCommand(cAppCharP aCommandName, cAppCharP aCommandParams, int aBackground); #ifdef __cplusplus } #endif /* eof */syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/platform_headers.h0000755000373300037200000000117512424517753032015 0ustar00nightlyallusers00000000000000/* * File: platform_headers.h * * Author: Lukas Zeller (luz@plan44.ch) * * Common include files for all platform-related standard headers * (suitable for precompiled headers and/or prefix file) * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * 2003-08-12 : luz : created * */ #ifndef __PLATFORM_HEADERS_H #define __PLATFORM_HEADERS_H // ANSI C #ifndef __GNUC__ #include "MacHeadersMach-O.c" #endif // for the pipes #include #include // C++ #ifdef __cplusplus // These are the C++ MSL headers #ifndef __GNUC__ #include "MSLHeaders++.cp" #endif #endif #endifsyncevolution-1.5/src/synthesis/src/platform_adapters/macosx/platform_time.cpp0000644000373300037200000000416212424517753031667 0ustar00nightlyallusers00000000000000/* * File: platform_time.cpp * * Platform specific time implementations * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2004-11-15 : luz : extracted from lineartime.h */ #include "prefix_file.h" #include "lineartime.h" #include "timezones.h" // MacOS X uses standard c time stuff // - now include #include "math.h" #include "limits.h" #include "stdarg.h" #include "stdlib.h" #include "stdio.h" #include "string.h" #include namespace sysync { /// @brief get system real time /// @return system's real time in lineartime_t scale, in specified time zone context /// @param[in] aTimeContext desired output time zone lineartime_t getSystemNowAs(timecontext_t aTimeContext,GZones *aGZones, bool noOffset) { #ifdef NOW_WITH_MILLISECONDS // high precision time, UTC based struct timeval tv; struct timezone tz; // gettimeofday return seconds and milliseconds since start of the UNIX epoch gettimeofday(&tv,&tz); lineartime_t systime = (tv.tv_sec*secondToLinearTimeFactor+UnixToLineartimeOffset) + (tv.tv_usec*secondToLinearTimeFactor/1000000); #else // standard precision time (unix time), base is UTC lineartime_t systime = time(NULL)*secondToLinearTimeFactor+UnixToLineartimeOffset; #endif // - return as-is if requested time zone is UTC if (noOffset || TCTX_IS_UTC(aTimeContext)) return systime; // return as-is // - convert to requested zone sInt32 aOffsSeconds; if (!TzOffsetSeconds(systime,TCTX_UTC,aTimeContext,aOffsSeconds,aGZones)) return noLinearTime; // no time // return time with offset return systime + (aOffsSeconds * secondToLinearTimeFactor); } // getSystemNowAs /// @brief fine resolution sleep support /// @param[in] aHowLong desired time to wait in lineartime_t units void sleepLineartime(lineartime_t aHowLong) { // Linux has nanosleep in nanoseconds timespec sleeptime; sleeptime.tv_sec=aHowLong/secondToLinearTimeFactor; sleeptime.tv_nsec=(aHowLong % secondToLinearTimeFactor)*1000000L; nanosleep(&sleeptime,NULL); } // sleepLineartime } // namespace sysync /* eof */syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/platform_time.h0000644000373300037200000000250112424517753031327 0ustar00nightlyallusers00000000000000/* * File: platform_time.h * * Platform specific time implementations * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2004-11-15 : luz : extracted from lineartime.h */ #ifndef PLATFORM_TIME_H #define PLATFORM_TIME_H #include /* obsolete using namespace std; namespace sysync { // define a type for it typedef struct tm struct_tm; // Windows and Linux/MacOSX have UNIX-time compatible origin // which is 1970-01-01 00:00:00 // but as we have 64bit ints, we use our own linear time // in milliseconds (=24*60*60*1000*lineardate) typedef sInt32 lineardate_t; // standard Linux/Win32/MacOSX typedef sInt64 lineartime_t; const lineartime_t noLinearTime = 0x0; // undefined lineartime value const lineartime_t maxLinearTime = 0x7FFFFFFFFFFFFFFFLL; // signed 64 bit, defined as long long // date origin definition relative to algorithm's origin -4712-01-01 00:00:00 const lineardate_t linearDateOriginOffset=0; // no offset const sInt16 linearDateOriginWeekday=1; // Monday // scaling of lineartime relative to seconds const lineartime_t secondToLinearTimeFactor = 1000; // unit is milliseconds // fine resolution sleep support void sleepLineartime(lineartime_t aHowLong); } // namespace sysync */ #endif // PLATFORM_TIME_H /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/platform_timezones.mm0000644000373300037200000001055312424517753032576 0ustar00nightlyallusers00000000000000/* * File: platform_timezones.mm * * Author: Lukas Zeller * * Time zone dependent routines for Mac OS X * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2009-04-02 : Created by Lukas Zeller * */ #include "prefix_file.h" #include "timezones.h" #import namespace sysync { /* Note: this is ugly poor man's implementation and only uses plain Unix facilities to hopefully * find the time zone (by name). * The plan is to enhance this using Foundation APIs later */ /*! @brief platform specific loading of time zone definitions * @return true if this list is considered complete (i.e. no built-in zones should be used additionally) * @param[in/out] aGZones : the GZones object where system zones should be loaded into */ bool loadSystemZoneDefinitions(GZones* aGZones) { // load zones from system here // ... // return true if this list is considered complete (i.e. no built-in zones should be used additionally) return false; // we need the built-in zones } // loadSystemZoneDefinitions /*! @brief we use this callback to add and log libical time zone handling * * The advantage is that this handling can be logged. The disadvantage * is that these time zones cannot be used in the configuration. Builtin * time zones (if any) have to be used there. */ void finalizeSystemZoneDefinitions(GZones* aGZones) { /* nop for now */ } // finalizeSystemZoneDefinitions // Get system time zone information via NSTimeZone static bool getSystemTimeZone(string &aZoneName, sInt16 &aStdBias, sInt16 &aDstBias, lineartime_t &aStdStart, lineartime_t &aDstStart) { NSTimeZone *sysZone = [NSTimeZone systemTimeZone]; // get name // Note: we use the oldfashioned tzset() way to make sure we don't break what already works // Probably we could construct the same string using abbreviationForDate: tzset(); aZoneName = tzname[0]; if (strcmp(aZoneName.c_str(),tzname[1])!=0) { aZoneName += "/"; aZoneName += tzname[1]; } // get info per now bool isDaylightNow = [sysZone isDaylightSavingTime]; sInt32 utcOffsetNow = [sysZone secondsFromGMT]; // next transition (away from current state) NSDate *nextTransition = [sysZone nextDaylightSavingTimeTransition]; // the transition after that NSDate *backTransition = [sysZone nextDaylightSavingTimeTransitionAfterDate:[nextTransition dateByAddingTimeInterval:24*60*60]]; // depends on current daylight or not if (isDaylightNow) { // DST active, next transition is start of STD sInt32 daylightOffset = (sInt32)[sysZone daylightSavingTimeOffset]; aDstBias = daylightOffset/60; aStdBias = (utcOffsetNow-daylightOffset)/60; aStdStart = (lineartime_t)([nextTransition timeIntervalSince1970]*1000.0)+UnixToLineartimeOffset + (aStdBias+aDstBias)*60*secondToLinearTimeFactor; aDstStart = (lineartime_t)([backTransition timeIntervalSince1970]*1000.0)+UnixToLineartimeOffset + aStdBias*60*secondToLinearTimeFactor; } else { // STD active, next transition is start of DST // Note: backTransition IS NO LONGER (iOS 4.2.1 at least!) in DST, so use a time one day after to-DST transition which MUST be in DST! sInt32 daylightOffset = (sInt32)[sysZone daylightSavingTimeOffsetForDate:[nextTransition dateByAddingTimeInterval:24*60*60]]; aStdBias = utcOffsetNow/60; aDstBias = daylightOffset/60; aDstStart = (lineartime_t)([nextTransition timeIntervalSince1970]*1000.0)+UnixToLineartimeOffset + aStdBias*60*secondToLinearTimeFactor; aStdStart = (lineartime_t)([backTransition timeIntervalSince1970]*1000.0)+UnixToLineartimeOffset + (aStdBias+aDstBias)*60*secondToLinearTimeFactor; } return true; } // getSystemTimeZone /*! @brief get current system time zone * @return true if successful * @param[out] aContext : the time zone context representing the current system time zone. * @param[in] aGZones : the GZones object. */ bool getSystemTimeZoneContext(timecontext_t &aContext, GZones* aGZones) { tz_entry t; t.name = ""; t.bias = 0; t.biasDST = 0; t.dst.wMonth= 0; sInt16 y; lineartime_t stdTime, dstTime; if (getSystemTimeZone( t.name, t.bias,t.biasDST, stdTime,dstTime )) { Get_tChange( stdTime, t.std, y ); Get_tChange( dstTime, t.dst, y ); } // search entry, first by rule return ContextForEntry(aContext, t, false, aGZones); } // getSystemTimeZoneContext } // namespace sysync /* eof */syncevolution-1.5/src/synthesis/src/platform_adapters/macosx/profiling.cpp0000755000373300037200000000075612424517753031026 0ustar00nightlyallusers00000000000000/* * File: profiling.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Platform-dependent profiling implementation * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-10-01 : luz : created * */ #include "profiling.h" #ifdef TIME_PROFILING #error "No time profiling for macosx yet" #endif // TIME_PROFILING #ifdef MEMORY_PROFILING #error "No memory profiling for macosx yet" #error "Seems to be dangerous" #endif // MEMORY_PROFILING /* eof */syncevolution-1.5/src/synthesis/src/platform_adapters/platform_DLL.h0000755000373300037200000000204612424517753027521 0ustar00nightlyallusers00000000000000/* * File: platform_DLL.h * * Author: Beat Forster (bfo@synthesis.ch) * * * General interface to access the routines * of a DLL. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * */ #ifndef PLATFORM_DLL_H #define PLATFORM_DLL_H #include "target_options.h" #include // NULL #include using namespace std; // ------------------------------------------------------------------ // Error handler procedure type typedef void (*ErrReport)( void* ref, const char* aName ); typedef void (*ErrMReport)( void* ref, const char* aName, const char* aModName ); bool ConnectDLL( void* &aMod, const char* aModName, ErrReport aReport, void* ref= NULL ); /* Connect to , result is reference */ /* Returns 0, if successful */ bool DLL_Function( void* aMod, const char* aFuncName, void* &aFunc ); /* Get of at */ /* Returns 0, if available */ bool DisconnectDLL( void* aMod ); /* Disconnect . Returns 0, if operation successful */ #endif /* PLATFORM_DLL_H */ /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/platform_file.h0000755000373300037200000000163212424517753030025 0ustar00nightlyallusers00000000000000/* * File: platform_file.h * * Author: Beat Forster (bfo@synthesis.ch) * * * General interface to get/set file info * like date/attributes/... * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * */ #ifndef PLATFORM_FILE_H #define PLATFORM_FILE_H #include "sync_dbapidef.h" #include using namespace std; namespace sysync { /*! File attributes */ struct TAttr { bool h,s,a,d,w,r,x; }; // TAttr /*! File dates */ struct TDates { /* ISO8601 format, usually as localtime */ string created, modified, accessed; }; // TDates /* Get/set attributes */ TSyError Get_FileAttr( string pathName, TAttr &aAttr, bool &isFolder ); TSyError Set_FileAttr( string pathName, TAttr aAttr ); /* Get/set file dates */ TSyError Get_FileDate( string pathName, TDates &aDate ); TSyError Set_FileDate( string pathName, TDates aDate ); } // namespace #endif /* PLATFORM_FILE_H */ /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/platform_headers.h0000755000373300037200000000102012424517753030510 0ustar00nightlyallusers00000000000000/* * File: platform_headers.h * * Author: Lukas Zeller (luz@plan44.ch) * * Common include files for all platform-related standard headers * (suitable for precompiled headers and/or prefix file) * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * 2003-08-12 : luz : created * */ #ifndef __PLATFORM_HEADERS_H #define __PLATFORM_HEADERS_H // ANSI C #warning "platform_headers.h should be platform-specific!" // C++ #ifdef __cplusplus // These are the C++ MSL headers #endif #endif syncevolution-1.5/src/synthesis/src/platform_adapters/platform_mutex.h0000755000373300037200000000072412424517753030251 0ustar00nightlyallusers00000000000000/* * File: platform_mutex.h * * Author: Beat Forster (bfo@synthesis.ch) * * * Mutex handling * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * */ #ifndef PLATFORM_MUTEX_H #define PLATFORM_MUTEX_H typedef void* MutexPtr_t; MutexPtr_t newMutex(); bool lockMutex( MutexPtr_t m ); bool tryLockMutex( MutexPtr_t m ); bool unlockMutex( MutexPtr_t m ); void freeMutex( MutexPtr_t m ); #endif /* PLATFORM_MUTEX_H */ /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/platform_thread.h0000755000373300037200000000610112424517753030351 0ustar00nightlyallusers00000000000000/* * File: platform_thread.h * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific thread object implementation * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-04-15 : luz : created * */ #ifndef PLATFORM_THREAD_H #define PLATFORM_THREAD_H #include #ifdef _WIN32 #include #endif #if defined(ANDROID) || defined(LINUX) #include #endif #if defined(LINUX) # include typedef unsigned long uIntArch; // Used for pid_t, pointers and pthread_t. #endif /* #ifndef _MSC_VER using namespace sysync; #endif */ namespace sysync { // get id of the running process uIntArch myProcessID(); // get id of the running thread uIntArch myThreadID(); class TThreadObject; // forward // function executed by thread typedef uInt32 (*TThreadFunc)(TThreadObject *aThreadObject, uIntArch aParam); // wrapper class for thread class TThreadObject { public: // creates thread object. Thread ist not started yet, must use launch() for this TThreadObject(); // destroys the thread object virtual ~TThreadObject(); // starts thread (or re-starts it again after termination) bool launch( TThreadFunc aThreadFunc=NULL, // the function to execute in the thread uIntArch aThreadFuncParam=0, // a parameter to pass to the thread size_t aStackSize=0, // if 0, default stack size is used bool aAutoDispose=false // if true, the thread object will dispose itself when thread has finished running ); // get thread ID uIntArch getid(void); // soft-terminates thread (sets a flag which requests execute() to terminate void terminate(void) { fTerminationRequested=true; }; // hard (emergency) terminate (aborts processing on the OS level) void kill(void); // wait for termination of the thread, returns true if so within specified time // negative wait time means waiting infinitely. bool waitfor(sInt32 aMilliSecondsToWait=0); // get exit code of the thread (valid only if thread has already terminated uInt32 exitcode(void) { return fExitCode; }; // This method is the thread function itself // - can be derived to create special threads // default behaviour is to call the fThreadFunc with this and fThreadFuncParam virtual uInt32 execute(void); // checks for termination request bool terminationRequested(void) { return fTerminationRequested; }; private: // thread options uInt32 fStackSize; // the thread function TThreadFunc fThreadFunc; uIntArch fThreadFuncParam; // the termination request flag bool fTerminationRequested; // the exit code uInt32 fExitCode; public: // auto disposal of the thread object when thread exits bool fAutoDisposeThreadObj; private: #ifdef _WIN32 // the windows thread HANDLE fWinThreadHandle; DWORD fWinThreadId; #endif #if defined LINUX || defined MACOSX // the linux POSIX thread public: pthread_t fPosixThread; pthread_mutex_t fDoneCondMutex; pthread_cond_t fDoneCond; bool fTerminated; // really finished #endif }; } // namespace sysync #endif // PLATFORM_THREAD_H /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/profiling.h0000755000373300037200000001301412424517753027170 0ustar00nightlyallusers00000000000000/* * File: profiling.h * * Author: Lukas Zeller (luz@plan44.ch) * * Platform-dependent profiling implementation * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-10-01 : luz : created * */ #ifndef _PROFILING_H #define _PROFILING_H #ifdef __cplusplus //#include "sysync.h" #include "generic_types.h" #include "lineartime.h" #include "sysync_globs.h" #endif #ifdef TIME_PROFILING #ifdef __cplusplus typedef enum { TP_general, TP_database, TP_configread, TP_scripts, TP_dbgout, TP_none, // does not count } TTP_Types; const sInt16 numTPTypes = TP_none-TP_general; // do not count TP_none extern const char * const TP_TypeNames[numTPTypes]; // a profiling timer typedef struct { long long kerneltime; long long usertime; } TTP_Timer; // profiling info packet typedef struct { TTP_Timer fTP_last; TTP_Timer fTP_total; TTP_Timer fTP_times[numTPTypes]; bool fTP_started; TTP_Types fTP_lastindex; lineartime_t fTP_startrealtime; } TTP_info; // opaque pointer typedef void *TTP_infoP; // initialize time profiling void TP_Init(TTP_infoP aTpinfoP); // start profiling a certain part of the code TTP_Types TP_Start(TTP_infoP aTpinfoP, TTP_Types aTimerIdx); // stop profiling void TP_Stop(TTP_infoP aTpinfoP); // get profiled information uInt32 TP_GetSystemMS(TTP_infoP aTpinfoP,TTP_Types aTimerIdx=TP_none); uInt32 TP_GetUserMS(TTP_infoP aTpinfoP,TTP_Types aTimerIdx=TP_none); uInt32 TP_GetRealtimeMS(TTP_infoP aTpinfoP); #endif // C++ // active macros #define TP_DEFINFO(x) TTP_info x; #define TP_DEFIDX(i) TTP_Types i #define TP_INIT(i) TP_Init(&i) #define TP_START(i,x) { if (PDEBUGMASK & DBG_PROFILE) TP_Start(&i,x); } #define TP_SWITCH(l,i,x) { if (PDEBUGMASK & DBG_PROFILE) l=TP_Start(&i,x); } #define TP_STOP(i) { if (PDEBUGMASK & DBG_PROFILE) TP_Stop(&i); } #define TP_GETSYSTEMMS(i,x) TP_GetSystemMS(&i,x) #define TP_GETUSERMS(i,x) TP_GetUserMS(&i,x) #define TP_GETTOTALSYSTEMMS(i) TP_GetSystemMS(&i) #define TP_GETTOTALUSERMS(i) TP_GetUserMS(&i) #define TP_GETREALTIME(i) TP_GetRealtimeMS(&i) #else // TIME_PROFILING // dummy macros #define TP_DEFINFO(x) #define TP_DEFIDX(x) #define TP_INIT(i) #define TP_START(i,x) #define TP_SWITCH(l,i,x) #define TP_STOP(i) #define TP_GETSYSTEMMS(i,x) 0 #define TP_GETUSERMS(i,x) 0 #define TP_GETTOTALSYSTEMMS(i) 0 #define TP_GETTOTALUSERMS(i) 0 #define TP_GETREALTIME(i) 0 #endif // TIME_PROFILING #ifdef MEMORY_PROFILING #warning "Probably obsolete and dangerous" #ifdef __cplusplus #define SYSYNC_CDECL "C" #else #define SYSYNC_CDECL #endif extern SYSYNC_CDECL size_t gAllocatedMem; extern SYSYNC_CDECL size_t gMaxAllocatedMem; extern SYSYNC_CDECL int gMemProfilingInUse; extern SYSYNC_CDECL void *sysync_malloc(size_t size); extern SYSYNC_CDECL void *sysync_realloc(void *mem, size_t newsize); extern SYSYNC_CDECL void sysync_free(void *mem); #ifdef __cplusplus void* operator new (std::size_t size) throw(std::bad_alloc); void* operator new (std::size_t size, const std::nothrow_t&) throw(); void* operator new[](std::size_t size) throw(std::bad_alloc); void* operator new[](std::size_t size, const std::nothrow_t&) throw(); void operator delete(void* ptr) throw(); void operator delete(void* ptr, const std::nothrow_t&) throw(); void operator delete[](void* ptr) throw(); void operator delete[](void* ptr, const std::nothrow_t&) throw(); #ifdef MP_SHOW_NEW_AND_DELETE #define MP_NEW(p,lvl,msg,x) {\ size_t MP_before=gAllocatedMem;\ if (!gMemProfilingInUse) {\ gMemProfilingInUse=1;\ PDEBUGPRINTFX((lvl|DBG_PROFILE),(\ "+++ %-30s : before calling new: %10ld total, %10ld max",\ msg,\ gAllocatedMem,\ gMaxAllocatedMem\ ));\ gMemProfilingInUse=0;\ }\ p = new x;\ if (!gMemProfilingInUse) {\ gMemProfilingInUse=1;\ PDEBUGPRINTFX((lvl|DBG_PROFILE),(\ "+++ %-30s : %10ld bytes allocated, %10ld total, %10ld max",\ msg,\ gAllocatedMem-MP_before,\ gAllocatedMem,\ gMaxAllocatedMem\ ));\ gMemProfilingInUse=0;\ }\ } #define MP_RETURN_NEW(t,lvl,msg,x) {\ t *obj;\ MP_NEW(obj,lvl,msg,x);\ return obj;\ } #define MP_DELETE(lvl,msg,x) {\ size_t MP_before=gAllocatedMem;\ if (!gMemProfilingInUse) {\ gMemProfilingInUse=1;\ PDEBUGPRINTFX((lvl|DBG_PROFILE),(\ "--- %-30s : before calling delete: %10ld total, %10ld max",\ msg,\ gAllocatedMem,\ gMaxAllocatedMem\ ));\ gMemProfilingInUse=0;\ }\ delete x;\ if (!gMemProfilingInUse) {\ gMemProfilingInUse=1;\ PDEBUGPRINTFX((lvl|DBG_PROFILE),(\ "--- %-30s : %10ld bytes freed, %10ld total, %10ld max",\ msg,\ MP_before-gAllocatedMem,\ gAllocatedMem,\ gMaxAllocatedMem\ ));\ gMemProfilingInUse=0;\ }\ } #else // MP_SHOW_NEW_AND_DELETE // let new and delete only count, but not show #define MP_NEW(p,lvl,msg,x) p = new x #define MP_RETURN_NEW(t,lvl,msg,x) return new x #define MP_DELETE(lvl,msg,x) delete x #endif // MP_SHOW_NEW_AND_DELETE #define MP_SHOWCURRENT(lvl,msg) \ PDEBUGPRINTFX((lvl|DBG_PROFILE),(\ "=== %-30s : Current memory usage: %10ld total, %10ld max",\ msg,\ gAllocatedMem,\ gMaxAllocatedMem\ )) #endif #else // MEMORY_PROFILING #define sysync_malloc(m) malloc(m) #define sysync_realloc(m,n) realloc(m,n) #define sysync_free(m) free(m) #ifdef __cplusplus #define MP_NEW(p,lvl,msg,x) p = new x #define MP_RETURN_NEW(t,lvl,msg,x) return new x #define MP_DELETE(lvl,msg,x) delete x #define MP_SHOWCURRENT(lvl,msg) #endif #endif // MEMORY_PROFILING #endif // _PROFILING_H /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/sysync_glob_vars.h0000755000373300037200000000135212424517753030567 0ustar00nightlyallusers00000000000000/* * File: sysync_glob_vars.h * * Author: Lukas Zeller (luz@plan44.ch) * * Global variables * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2004-08-09 : luz : created * */ #ifndef SYSYNC_GLOB_VARS_H #define SYSYNC_GLOB_VARS_H #include "generic_types.h" namespace sysync { #ifdef DIRECT_APPBASE_GLOBALACCESS // init and deinit global sysync stuff void sysync_glob_init(void); void sysync_glob_deinit(void); void *sysync_glob_anchor(void); void sysync_glob_setanchor(void *aAnchor); #else // DIRECT_APPBASE_GLOBALACCESS // define dummies #define sysync_glob_init() #define sysync_glob_deinit() #endif // not DIRECT_APPBASE_GLOBALACCESS } // namespace sysync #endif // SYSYNC_GLOB_VARS_H // eof syncevolution-1.5/src/synthesis/src/platform_adapters/sysyncinit.cpp0000755000373300037200000000400212424517753027743 0ustar00nightlyallusers00000000000000/* * File: sysyncinit.cpp * * Global variables instantiation * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-08-09 : luz : created * * */ #include "prefix_file.h" #define _IMPLEMENTS_DEBUG_GLOBALS #include "sysync.h" #undef _IMPLEMENTS_DEBUG_GLOBALS // note: this is the generic implementation assuming an environment that supports // static global vars. namespace sysync { #ifdef DIRECT_APPBASE_GLOBALACCESS /* %%% obsolete // globals for debugging purposes // Note: These are duplicates of the values in TSyncAppBase.fRootConfig.fDebugConfig // which are here for convenience #ifdef SYDEBUG uInt16 gDebug; // if <>0 (and #defined SYDEBUG), debug output is generated, value is used as mask bool gGlobalDebugLogs; // if set, global debug output is generated bool gMsgDump; // if set (and #defined MSGDUMP), messages sent and received are logged; bool gXMLtranslate; // if set, communication will be translated to XML and logged bool gSimMsgRead; // if set (and #defined SIMMSGREAD), simulated input with "i_" prefixed incoming messages are supported bool gSeparateSessionLogs; // if set, session-specific logs are generated in separate files string gDebugLogPath; // path to store debug files #endif */ // static global for anchoring singluar syncappbase object void *gSySyncGlobAnchor=NULL; // get the global anchor for the sysync framework void *sysync_glob_anchor(void) { return gSySyncGlobAnchor; } // sysync_glob_anchor // get the global anchor for the sysync framework void sysync_glob_setanchor(void *aAnchor) { gSySyncGlobAnchor=aAnchor; } // sysync_glob_setanchor // global initialisation routine void sysync_glob_init(void) { gSySyncGlobAnchor=NULL; } // sysync_glob_init // global de-initialisation routine void sysync_glob_deinit(void) { // get rid of global stuff outside the SyncAppBase framework /* none here */ } // sysync_glob_deinit #endif // DIRECT_APPBASE_GLOBALACCESS } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/unix_common/0000755000373300037200000000000012424517753027357 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/platform_adapters/unix_common/platform_file.cpp0000755000373300037200000000606212424517753032715 0ustar00nightlyallusers00000000000000/* * File: platform_file.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * General interface to get/set file info * like date/attributes/... * >>>> UNIX Version <<<< * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * */ #include "platform_file.h" #include namespace sysync { TSyError Get_FileAttr( string /* pathName */, TAttr &attr, bool &isFolder ) { /* WIN32_FIND_DATA data; TSyError err= FileData( pathName, data ); if (!err) { DWORD att= data.dwFileAttributes; attr.h= att & FILE_ATTRIBUTE_HIDDEN; attr.s= att & FILE_ATTRIBUTE_SYSTEM; attr.a= att & FILE_ATTRIBUTE_ARCHIVE; attr.d= false; // delete attr.w= true; attr.r= true; attr.x= false; } // if return err; */ attr.h= false; attr.s= false; attr.a= false; attr.d= false; // delete attr.w= true; attr.r= true; attr.x= false; isFolder= false; return LOCERR_OK; } // Get_FileAttr TSyError Set_FileAttr( string /* pathName */, TAttr /* aAttr */ ) { return LOCERR_OK; } // Set_FileAttr static void FTime( time_t u, string &utcStr ) { char f[ 20 ]; struct tm* t= localtime( &u ); sprintf( f, "%04d%02d%02dT%02d%02d%02d", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec ); utcStr= f; } // FTime extern "C" { #include #include #include } static TSyError FSTime( string tStr, time_t &u ) // UTC is currently not supported { string tt= tStr.substr( 8,1 ); if (!(tt=="T")) return DB_Forbidden; tt= tStr.substr( 15,1 ); //bool usUTC= tt=="Z"; time( &u ); // get some defaults struct tm* t= localtime( &u ); t->tm_year = atoi( tStr.substr( 0,4 ).c_str() )-1900; t->tm_mon = atoi( tStr.substr( 4,2 ).c_str() )-1; t->tm_mday = atoi( tStr.substr( 6,2 ).c_str() ); // "T" t->tm_hour = atoi( tStr.substr( 9,2 ).c_str() ); t->tm_min = atoi( tStr.substr( 11,2 ).c_str() ); t->tm_sec = atoi( tStr.substr( 13,2 ).c_str() ); t->tm_wday = 0; // avoid troubles t->tm_yday = 0; //t->tm_isdst = 1; u= mktime( t ); return LOCERR_OK; } // FSTime TSyError Get_FileDate( string pathName, TDates &aDate ) { struct stat info; TSyError err= stat( pathName.c_str(), &info ); if (!err) { FTime( info.st_ctime, aDate.created ); FTime( info.st_mtime, aDate.modified ); FTime( info.st_atime, aDate.accessed ); } // if return err; } // Get_FileDate TSyError Set_FileDate( string pathName, TDates aDate ) { TSyError err; struct utimbuf buf; err= FSTime( aDate.created, buf.modtime ); if (err) return err; err= FSTime( aDate.modified, buf.modtime ); if (err) return err; err= FSTime( aDate.accessed, buf.actime ); if (err) return err; //string uu; //FTime( buf.modtime, uu ); printf( "uum='%s'\n", uu.c_str() ); //FTime( buf.actime, uu ); printf( "uua='%s'\n", uu.c_str() ); return utime( pathName.c_str(), &buf ); return err; } // Set_FileDate } /* namespace */ /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/unix_common/platform_mutex.cpp0000755000373300037200000000164512424517753033142 0ustar00nightlyallusers00000000000000/* * File: platform_mutex.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * Mutex handling * (Unix implementation) * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * */ #include #include "platform_mutex.h" MutexPtr_t newMutex() { pthread_mutex_t* m= new pthread_mutex_t; pthread_mutex_init ( (pthread_mutex_t*)m, NULL ); return m; } bool lockMutex( MutexPtr_t m ) { return pthread_mutex_lock ( (pthread_mutex_t*)m ) == 0; } bool tryLockMutex( MutexPtr_t m ) { return pthread_mutex_trylock( (pthread_mutex_t*)m ) == 0; } bool unlockMutex( MutexPtr_t m ) { return pthread_mutex_unlock ( (pthread_mutex_t*)m ) == 0; } void freeMutex( MutexPtr_t m ) { pthread_mutex_destroy( (pthread_mutex_t*)m ); delete (pthread_mutex_t*)m; } /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/unix_common/platform_pipe.c0000755000373300037200000000372612424517753032377 0ustar00nightlyallusers00000000000000/* * File: platform_pipe.c * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific utility routines * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * NOTE: this file is part of the mod_sysync source files. * */ #include #include "platform_headers.h" #include "platform_pipe.h" // create new pipe. Fails if it already exists int createPipe(const char *aPipePathName) { if (mkfifo(aPipePathName,0620)!=0) { // error return appFalse; } // ok return appTrue; } // createPipe int deletePipe(const char *aPipePathName) { if (unlink(aPipePathName)!=0) { // error return appFalse; } // ok return appTrue; } // deletePipe pipeDescriptor_t openPipeForRead(const char *aPipePathName) { return open(aPipePathName, O_RDONLY); } // openPipeForRead pipeDescriptor_t openPipeForWrite(const char *aPipePathName) { return open(aPipePathName, O_WRONLY); } // openPipeForWrite int closePipe(pipeDescriptor_t aPipeDesc) { return (close(aPipeDesc)!=0); } // closePipe long readPipe(pipeDescriptor_t aPipeDesc,void *aBuffer, long aMaxBytes, int aReadAll) { long gotBytes=0; long bytes; do { bytes=read(aPipeDesc,aBuffer,aMaxBytes); if (bytes<0) return bytes; // error if (bytes==0) return gotBytes; // no error, but end of pipe - abort reading and return number of bytes already read gotBytes+=bytes; // add them up aMaxBytes-=bytes; // reduce max aBuffer = (void *)((char *)aBuffer + bytes); } while(aReadAll && aMaxBytes>0); return gotBytes; // return total } // readPipe long writePipe(pipeDescriptor_t aPipeDesc,void *aBuffer, long aNumBytes) { long sentBytes=0; long bytes; do { bytes=write(aPipeDesc,aBuffer,aNumBytes); if (bytes<0) return bytes; // error sentBytes+=bytes; // add them up aNumBytes-=bytes; // reduce max aBuffer = (void *)((char *)aBuffer + bytes); } while(aNumBytes>0); return sentBytes; // return total } // writePipe /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/unix_common/platform_pipe.h0000755000373300037200000000167612424517753032406 0ustar00nightlyallusers00000000000000/* * File: platform_pipe.h * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific pipe implementation * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * NOTE: this file is part of the mod_sysync source files. */ #include #include "generic_types.h" #ifdef __cplusplus extern "C" { #endif typedef int pipeDescriptor_t; #define PIPEDESCRIPTORVALID(pd) (pd>=0) #define PIPEERRORCODE ((int)errno) #define PIPEINVALIDDESC -1 #define PIPEPATHDELIM '/' int createPipe(const char *aPipePathName); int deletePipe(const char *aPipePathName); pipeDescriptor_t openPipeForRead(const char *aPipePathName); pipeDescriptor_t openPipeForWrite(const char *aPipePathName); int closePipe(pipeDescriptor_t aPipeDesc); long readPipe(pipeDescriptor_t aPipeDesc,void *aBuffer, long aMaxBytes, int aReadAll); long writePipe(pipeDescriptor_t aPipeDesc,void *aBuffer, long aNumBytes); #ifdef __cplusplus } #endif /* eof */ syncevolution-1.5/src/synthesis/src/platform_adapters/unix_common/platform_thread.cpp0000755000373300037200000002005412424517753033242 0ustar00nightlyallusers00000000000000/* * File: platform_thread.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Platform specific thread object implementation * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-05-24 : luz : created from Win version * */ #include "prefix_file.h" #include "platform_thread.h" #include "platform_time.h" #include "lineartime.h" #include "timezones.h" // private includes needed #include #include #ifdef ANDROID #include #endif namespace sysync { // get id of the running process uIntArch myProcessID() { return (uIntArch)getpid(); } // myProcessID // get id of the running thread uIntArch myThreadID() { return (uIntArch)pthread_self(); } // myThreadID // The POSIX thread function, must be passed the Thread Object address as parameter extern "C" void * PosixThreadFunc(void *aParam); void* PosixThreadFunc(void *aParam) { // get Thread Object pointer TThreadObject *threadObjP = static_cast(aParam); PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: starting", threadObjP)); // call thread execution method uInt32 retval = threadObjP->execute(); // signal thread termination condition pthread_mutex_lock (&(threadObjP->fDoneCondMutex)); pthread_cond_signal (&(threadObjP->fDoneCond)); threadObjP->fTerminated= true; // no longer valid pthread_mutex_unlock(&(threadObjP->fDoneCondMutex)); // auto-dispose the thread object if requested if (threadObjP->fAutoDisposeThreadObj) { PNCDEBUGPRINTFX(DBG_HOT,("auto-disposing thread object %p", threadObjP)); delete threadObjP; } // Exit thread now. // Avoid "cast to pointer from integer of different size" warning with // intermediate cast. PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: terminating", threadObjP)); return (void *)(uIntArch)retval; } // PosixThreadFunc // creates thread object. Thread ist not started yet, must use launch() for this TThreadObject::TThreadObject(void) : fStackSize(0), fThreadFunc(NULL), fThreadFuncParam(0), fTerminationRequested(false), fExitCode(0), fAutoDisposeThreadObj(false), fPosixThread(0), fTerminated(false) { // init cond and mutex required to implement WaitFor pthread_mutex_init(&fDoneCondMutex,NULL); pthread_cond_init(&fDoneCond,NULL); } // TThreadObject::TThreadObject // destroys thread object. This will kill the thread if it still active. TThreadObject::~TThreadObject() { // kill thread (only if not auto-disposed at end of thread) if (!fAutoDisposeThreadObj) kill(); // destroy cond/mutex pthread_mutex_destroy(&fDoneCondMutex); pthread_cond_destroy(&fDoneCond); } // TThreadObject::TThreadObject // launches thread. Returns false if thread could not be started. exitcode() will // contain the platform error code for the failure to start the thread bool TThreadObject::launch( TThreadFunc aThreadFunc, // the function to execute in the thread uIntArch aThreadFuncParam, // a parameter to pass to the thread size_t aStackSize, // if 0, default stack size is used bool aAutoDispose // if true, the thread object will dispose itself when thread has finished running ) { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: launching", this)); // save parameters fThreadFunc=aThreadFunc; fThreadFuncParam=aThreadFuncParam; fStackSize=aStackSize; fAutoDisposeThreadObj=aAutoDispose; // assume ok exit errno.h fExitCode=0; fTerminationRequested=false; // thread must not exist yet if (fPosixThread!=0 && !fTerminated) { fExitCode=EEXIST; // we use this to signal thread is already started return false; } // now create a POSIX thread fPosixThread= 0; fTerminated= false; fExitCode = pthread_create( &fPosixThread, // pointer to returned thread identifier NULL, // default attributes = joinable, not realtime PosixThreadFunc, // pointer to thread function this // pass the pointer to the thread object ); if (fExitCode==0) { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: launched okay", this)); // thread created successfully return true; // ok } else { // could not create thread fTerminated= true; return false; // not ok } } // TThreadObject::launch uIntArch TThreadObject::getid(void) { return (uIntArch)fPosixThread; } // TThreadObject::getid // kills the thread void TThreadObject::kill(void) { if (fPosixThread!=0 && !fTerminated) { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: killing", this)); // the thread is actually running fExitCode=EINTR; // nearest match, interrupted // kill it pthread_kill(fPosixThread, SIGKILL); fTerminated= true; } else { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: skipped killing, not running", this)); } } // TThreadObject::kill static int CondTimedWait(pthread_cond_t *cond, pthread_mutex_t *mutex, bool &aTerminated, long aMilliSecondsToWait) { int retval; if (aMilliSecondsToWait<0) { // wait indefinitely retval= pthread_cond_wait(cond, mutex); } else { // wait specified amount of time struct timespec timeout; /* this conversion might be implemented in time module later */ #define milli 1E-3 #define msToLinearTimeFactor (secondToLinearTimeFactor*milli) // is usually 1 again lineartime_t ltm = getSystemNowAs(TCTX_UTC,NULL) - UnixToLineartimeOffset; // starting 1970 ltm = (lineartime_t)(ltm/msToLinearTimeFactor); // as milliSeconds ltm+= aMilliSecondsToWait; // add the offset from now timeout.tv_sec = (unsigned int)(ltm * milli); timeout.tv_nsec= ( ltm % 1000 )*1000000; // ns retval= pthread_cond_timedwait(cond, mutex, &timeout); } /* if */ return retval; } extern "C" { /** * Wait until thread terminates or timeout occurs. * * Can use pthread_cond_[timed]wait with the given condition variable * and mutex to be worken up by the terminating thread. However, aTerminated * must be checked before each such pthread call, because the thread may * already have signaled termination. * * If the implementation does not use pthread_cond_[timed]wait, then it * must unlock the mutex. Otherwise the thread will never be able to lock * it and set aTerminated. * * @param aMilliSecondsToWait < 0 for infinite wait, otherwise maximum time to wait since entering the function in ms */ int (*SySync_CondTimedWait)(pthread_cond_t *cond, pthread_mutex_t *mutex, bool &aTerminated, long aMilliSecondsToWait) = CondTimedWait; } // waits for the thread to stop bool TThreadObject::waitfor(sInt32 aMilliSecondsToWait) { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: waitfor %d", this, aMilliSecondsToWait)); int retval= 0; if (fPosixThread==0) { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: not running", this)); return true; // thread not running } // thread is running // wait for termination condition of the thread pthread_mutex_lock(&fDoneCondMutex); if (!fTerminated) { // catch also, if signalled already retval= SySync_CondTimedWait(&fDoneCond, &fDoneCondMutex, fTerminated, aMilliSecondsToWait); } /* if */ pthread_mutex_unlock(&fDoneCondMutex); if (retval!=0) { PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: still running", this)); return false; // check if thread has completed => no, not yet } // thread has terminated (or is terminating) -> join and get exit code void* threadret; PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: join thread", this)); int ret= pthread_join(fPosixThread,&threadret); if (ret==0) fExitCode= (uInt32)(uIntPtr)threadret; else fExitCode= ret; fTerminated= true; // thread has ended fPosixThread= 0; // don't join thread again (doesn't work reliably) when waitfor() is called again PNCDEBUGPRINTFX(DBG_HOT,("thread object %p: joined thread", this)); return true; } // TThreadObject::waitfor // Thread execution method uInt32 TThreadObject::execute() { // standard implementation simply starts the predefined thread function, if any if (fThreadFunc) { uInt32 err= fThreadFunc(this,fThreadFuncParam); return err; } else { return 0; } } // TThreadObject::execute } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/prefix_file.h0000755000373300037200000000061412424517753023766 0ustar00nightlyallusers00000000000000// dummy prefix file, used for CW based projects which do // not need the prefix file here, but in the target settings #ifdef _MSC_VER #error "this is not the right prefix_file.h -> reorder include paths such that project-specific prefix is used!" #endif #ifdef __PALM_OS__ #error "this is not the right prefix_file.h -> reorder access paths such that project-specific prefix is used!" #endif syncevolution-1.5/src/synthesis/src/server_engine_linux.mk0000644000373300037200000001373212424517753025726 0ustar00nightlyallusers00000000000000# Makefile generated by Metrowerks CodeWarrior IDE # adapted for standalone client library use 09/02/05 by bfo@synthesis.ch # adapted for standalone server library use 09/09/22 by luz@synthesis.ch all: serverEngine clean: clean_serverEngine ####### common definitions WD=$(shell echo `pwd`) WD_OBJS=$(WD)/../OBJS CC="gcc" LD="gcc" AR="ar -crs" SIZE="size" CFLAGS= -m32 -Wall -O2 -c -MMD LDFLAGS= -m32 MAKEFILE= "server_engine_linux.mk" SYNCML_TK_SML=\ syncml_tk/src/sml/lib/all/liblock.c\ syncml_tk/src/sml/lib/all/libmem.c\ syncml_tk/src/sml/lib/all/libstr.c\ syncml_tk/src/sml/lib/all/libutil.c\ syncml_tk/src/sml/mgr/all/mgr.c\ syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c\ syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c\ syncml_tk/src/sml/mgr/all/mgrinstancelist.c\ syncml_tk/src/sml/mgr/all/mgrinstancemgr.c\ syncml_tk/src/sml/mgr/all/mgrutil.c\ syncml_tk/src/sml/xlt/all/xltdec.c\ syncml_tk/src/sml/xlt/all/xltdecwbxml.c\ syncml_tk/src/sml/xlt/all/xltdecxml.c\ syncml_tk/src/sml/xlt/all/xltdevinf.c\ syncml_tk/src/sml/xlt/all/xltenc.c\ syncml_tk/src/sml/xlt/all/xltenccom.c\ syncml_tk/src/sml/xlt/all/xltencwbxml.c\ syncml_tk/src/sml/xlt/all/xltencxml.c\ syncml_tk/src/sml/xlt/all/xltmetinf.c\ syncml_tk/src/sml/xlt/all/xlttags.c\ syncml_tk/src/sml/xlt/all/xltutilstack.c EXPAT=\ expat/xmltok/xmltok.c\ expat/xmltok/xmlrole.c\ expat/xmlparse/xmlparse.c ZLIB=\ zlib/adler32.c\ zlib/compress.c\ zlib/crc32.c\ zlib/deflate.c\ zlib/gzio.c\ zlib/infback.c\ zlib/inffast.c\ zlib/inflate.c\ zlib/inftrees.c\ zlib/trees.c\ zlib/uncompr.c\ zlib/zutil.c C_BASICS=\ $(SYNCML_TK_SML)\ $(EXPAT)\ platform_adapters/linux/platform_exec.c\ sysync_SDK/Sources/SDK_util.c PLATFORM=\ platform_adapters/linux/configfiles.cpp\ platform_adapters/linux/profiling.cpp\ platform_adapters/linux/platform_time.cpp\ platform_adapters/unix_common/platform_mutex.cpp\ platform_adapters/sysyncinit.cpp PLATFORM_EXT=\ $(PLATFORM)\ platform_adapters/linux/platform_DLL.cpp\ platform_adapters/unix_common/platform_thread.cpp\ platform_adapters/unix_common/platform_file.cpp SYSYNC=\ sysync/sysync_utils.cpp\ sysync/sysync_b64.cpp\ sysync/sysync_md5.cpp\ sysync/syncsession.cpp\ sysync/syncappbase.cpp\ sysync/lineartime.cpp\ sysync/iso8601.cpp\ sysync/stringutils.cpp\ sysync/superdatastore.cpp\ sysync/scriptcontext.cpp\ sysync/itemfield.cpp\ sysync/mimediritemtype.cpp\ sysync/mimedirprofile.cpp\ sysync/multifielditem.cpp\ sysync/multifielditemtype.cpp\ sysync/remotedatastore.cpp\ sysync/syncitem.cpp\ sysync/syncitemtype.cpp\ sysync/simpleitem.cpp\ sysync/synccommand.cpp\ sysync/syncdatastore.cpp\ sysync/textitemtype.cpp\ sysync/vcalendaritemtype.cpp\ sysync/vcarditemtype.cpp\ sysync/syncexception.cpp\ sysync/configelement.cpp\ sysync/sysync_crc16.cpp\ sysync/timezones.cpp\ sysync/rrules.cpp\ sysync/localengineds.cpp\ sysync/debuglogger.cpp\ sysync/textprofile.cpp\ sysync/dataobjtype.cpp\ sysync/stdlogicds.cpp\ sysync/stdlogicagent.cpp\ sysync/customimplagent.cpp\ sysync/customimplds.cpp\ sysync/vtimezone.cpp SERVERENGINE=\ $(SYSYNC)\ syncapps/serverEngine_custom/serverengine_custom_Base.cpp\ Transport_interfaces/engine/enginesessiondispatch.cpp\ sysync_SDK/Sources/enginemodulebase.cpp\ sysync/engineentry.cpp\ sysync/engineinterface.cpp\ sysync/syncagent.cpp ODBC_DB=\ DB_interfaces/odbc_db/odbcapiagent.cpp\ DB_interfaces/odbc_db/odbcapids.cpp API_DB=\ DB_interfaces/api_db/pluginapiagent.cpp\ DB_interfaces/api_db/pluginapids.cpp\ DB_interfaces/api_db/dbapi.cpp\ DB_interfaces/api_db/DLL_interface.cpp\ DB_interfaces/api_db/sync_dbapiconnect.cpp\ sysync_SDK/Sources/SDK_support.cpp\ sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp\ sysync_SDK/Sources/admindata.cpp\ sysync_SDK/Sources/dbitem.cpp\ sysync_SDK/Sources/blobs.cpp # -------------------------------------------------------- INCLUDE_PLATFORM=\ -I platform_adapters/linux/\ -I platform_adapters/unix_common/\ -I platform_adapters/ INCLUDE_SYNCML_TK_SML=\ -I syncml_tk/src/sml/inc/\ -I syncml_tk/src/sml/lib/inc/\ -I syncml_tk/src/sml/lib/\ -I syncml_tk/src/sml/mgr/inc/\ -I syncml_tk/src/sml/mgr/\ -I syncml_tk/src/sml/wsm/inc/\ -I syncml_tk/src/sml/xlt/inc/\ -I syncml_tk/src/sml/xlt/all/ INCLUDE_EXPAT=\ -I expat/xmltok/\ -I expat/xmlparse/ INCLUDE_SERVERENGINE=\ -I syncapps/serverEngine_custom/\ -I Transport_interfaces/engine/\ -I sysync_SDK/Sources\ -I sysync/\ -I ./ ############################# ####### TARGET: serverEngine ############################# WD_OBJS_serverEngine=$(WD_OBJS)/serverEngine c_SRC_serverEngine=\ $(C_BASICS) $(ZLIB) cpp_SRC_serverEngine=\ $(PLATFORM_EXT)\ $(SERVERENGINE)\ $(ODBC_DB)\ $(API_DB) OBJS_serverEngine+= $(c_SRC_serverEngine:.c=.c.o) OBJS_serverEngine+=$(cpp_SRC_serverEngine:.cpp=.cpp.o) INCLUDE_serverEngine=\ -include Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource_linux_prefix.h\ -I Targets/ReleasedProducts/serverEngine_opensource_linux/\ $(INCLUDE_PLATFORM)\ $(INCLUDE_SYNCML_TK_SML)\ $(INCLUDE_EXPAT)\ $(INCLUDE_SERVERENGINE)\ -I DB_interfaces/odbc_db/\ -I DB_interfaces/api_db/\ -I SQLite/\ -I zlib/\ -I /usr/include/ serverEngine: $(MAKE) -f $(MAKEFILE) sysync_server_engine.so TARGET=sysync_server_engine.so \ WDOP="$(WD_OBJS_serverEngine)"\ OBJS="$(addprefix $(WD_OBJS_serverEngine)/,$(OBJS_serverEngine))"\ LIBS="-L/usr/lib32 -L/usr/lib -lstdc++ -lpthread -lltdl -lpcre"\ INCL="$(INCLUDE_serverEngine)" sysync_server_engine.so: $(OBJS) $(LD) -shared -Xlinker -soname=sysync_server_engine $(LDFLAGS) $(OBJS) $(LIBS) \ -o sysync_SDK/bin/Linux/sysync_server_engine.so ifeq ($(TARGET), sysync_server_engine.so) $(WDOP)/%.c.o: $(WD)/%.c mkdir -p $(dir $@) $(CC) -fPIC $(CFLAGS) $(INCL) $< -o $@ $(WDOP)/%.cpp.o: $(WD)/%.cpp mkdir -p $(dir $@) $(CC) -fPIC $(CFLAGS) $(INCL) $< -o $@ endif clean_serverEngine: rm -f -r $(WD_OBJS_serverEngine) syncevolution-1.5/src/synthesis/src/smltk-linker.map0000644000373300037200000000017612424517753024434 0ustar00nightlyallusers00000000000000VER_1.0 { global: sml*; xltDecInit; xltDecTerminate; xltDecNext; local: *; }; syncevolution-1.5/src/synthesis/src/syncapps/0000755000373300037200000000000012424517753023155 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncapps/clientEngine_custom/0000755000373300037200000000000012424517753027153 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncapps/clientEngine_custom/clientengine_custom.h0000755000373300037200000000076712424517753033377 0ustar00nightlyallusers00000000000000/* */ #ifndef CLIENTENGINE_CUSTOM_H #define CLIENTENGINE_CUSTOM_H /* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #include "clientengine_custom_precomp.h" /* headers not suitable for / entirely included in precompilation */ // DB interface related includes #ifdef SQL_SUPPORT #include "odbcdb.h" #endif #ifdef SDK_SUPPORT #include "plugindb.h" #endif #ifdef OUTLOOK_SUPPORT #include "outlookdb.h" #endif #endif // CLIENTENGINE_CUSTOM_H syncevolution-1.5/src/synthesis/src/syncapps/clientEngine_custom/clientengine_custom_Base.cpp0000644000373300037200000000236312424517753034653 0ustar00nightlyallusers00000000000000/* * TCustomClientEngineBase, TCustomClientEngineInterface * SyncML client engine for custom clients - base classes * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2007-09-04 : luz : Created * */ // includes #include "clientengine_custom.h" #include "clientengine_custom_Base.h" // common includes #include "engineclientbase.h" namespace sysync { // factory function implementation - declared in TEngineInterface ENGINE_IF_CLASS *newClientEngine(void) { return new TCustomClientEngineInterface; } // newClientEngine /* * Implementation of TCustomClientEngineInterface */ /// @brief returns a new application base. TSyncAppBase *TCustomClientEngineInterface::newSyncAppBase(void) { return new TCustomClientEngineBase; } // TCustomClientEngineInterface::newSyncAppBase /* * Implementation of TCustomClientEngineBase */ TCustomClientEngineBase::TCustomClientEngineBase() { // create config root fConfigP=new TEngineClientRootConfig(this); } // TCustomClientEngineBase::TCustomClientEngineBase TCustomClientEngineBase::~TCustomClientEngineBase() { fDeleting=true; // flag deletion to block calling critical (virtual) methods } // TCustomClientEngineBase::~TCustomClientEngineBase } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/syncapps/clientEngine_custom/clientengine_custom_Base.h0000755000373300037200000000174612424517753034327 0ustar00nightlyallusers00000000000000/* * TCustomClientEngineBase, TCustomClientEngineInterface * SyncML client engine for custom clients - base classes * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2007-09-04 : luz : Created * * */ #ifndef CLIENTENGINE_CUSTOM_BASE_H #define CLIENTENGINE_CUSTOM_BASE_H // directly based on syncclient base #include "engineclientbase.h" // using binfile engine interface #include "binfileimplclient.h" namespace sysync { // Appbase class class TCustomClientEngineBase: public TEngineClientBase { typedef TEngineClientBase inherited; public: TCustomClientEngineBase(); virtual ~TCustomClientEngineBase(); }; // TCustomClientEngineBase // Engine interface class class TCustomClientEngineInterface: public TBinfileEngineInterface { typedef TBinfileEngineInterface inherited; public: /// @brief returns a new application base. virtual TSyncAppBase *newSyncAppBase(void); }; // TCustomClientEngineInterface } #endif // CLIENTENGINE_CUSTOM_BASE_H // eof syncevolution-1.5/src/synthesis/src/syncapps/clientEngine_custom/clientengine_custom_precomp.h0000755000373300037200000000075512424517753035121 0ustar00nightlyallusers00000000000000/* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) * */ #ifndef CLIENTENGINE_CUSTOM_PRECOMP_H #define CLIENTENGINE_CUSTOM_PRECOMP_H // Needed for Engine #include "sysync_precomp.h" // DB interface related includes #ifdef SQL_SUPPORT #include "odbcdb_precomp.h" #endif #ifdef SDK_SUPPORT #include "plugindb_precomp.h" #endif #ifdef OUTLOOK_SUPPORT #include "outlookdb_precomp.h" #endif #endif // CLIENTENGINE_CUSTOM_PRECOMP_H // eof syncevolution-1.5/src/synthesis/src/syncapps/clientEngine_custom/product_options.h0000755000373300037200000000654412424517753032573 0ustar00nightlyallusers00000000000000/* Common Product options * ====================== * */ // Custom Client Library Products // ############################## // Separate Version // ================ // Note: for now, client library has NO SEPARATE VERSION, but shows engine version /* #define SYSYNC_VERSION_MAJOR 1 #define SYSYNC_VERSION_MAJOR_TXT "1" #define SYSYNC_VERSION_MINOR 1 #define SYSYNC_VERSION_MINOR_TXT "1" #define SYSYNC_SUBVERSION 0 #define SYSYNC_SUBVERSION_TXT "0" #define SYSYNC_BUILDNUMBER 0 #define SYSYNC_BUILDNUMBER_TXT "0" */ // new major or minor gives a new demo period #define SYSER_VERSCHECK_MASK 0xFFFF0000 // Most hyperglobal definition, might even influence global_options.h: // - THIS IS A CLIENT #define SYSYNC_CLIENT 1 // - is a engine library #define ENGINE_LIBRARY 1 // - ...which is used in standalone apps #define STANDALONE_APP 1 // global options #include "global_options.h" // Product (but not target) specific options // ######################################### // Hard expiration date, software will stop working after defined date // if not registered #undef VERSION_COMMENTS #define VERSION_COMMENTS "Demo expires after " EXPIRY_DATE_STRING " if not registered" #define EXPIRES_AFTER_DATE 1 // SySync options // ============== // - use precise time when possible #define NOW_WITH_MILLISECONDS 1 // - if defined, debug code is included (not necessarily enabled, see gDebug) // if 1, only "public" debugging is enabled, if >1, all debugging is enabled #ifdef RELEASE_VERSION #if RELEASE_SYDEBUG #define SYDEBUG RELEASE_SYDEBUG #else #undef SYDEBUG // absolutely no debug code for release! #endif #undef CONSOLEINFO #else #define SYDEBUG 2 // 3=including XPT trace, 4=including memory leak detection #undef CONSOLEINFO #endif // local Database options #define DESKTOP_CLIENT 1 // selects different binfile format (actually, will merge with mobile format at version 5) // separate files for outlook - different from old 1.0 client to make sure we don't import old problems #define SETTINGS_BFI_PREFIX "sysynclib_" // - if defined, local DB does not require any login in client mode #define NO_LOCAL_DBLOGIN 1 // - if defined, config file might contain s which will // allow a client to run directly from config w/o additionally // provided parameters. #undef PRECONFIGURED_SYNCREQUESTS // - if defined, XML config parsing is completely disabled, // all config must be set programmatically #undef HARDCODED_CONFIG // - if defined, remoterule mechanism is not included #undef NO_REMOTE_RULES // - if defined, support for hardcoded (predefined) // type definitions will be included #undef HARDCODED_TYPE_SUPPORT // - if defined, support for configurable types will be included #define CONFIGURABLE_TYPE_SUPPORT 1 // do not modify remote IDs in any way while processing them #define DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS 1 // if defined, session continues after 401/407 //#define AUTH_RETRY_USES_SAME_CLIENT_SESSION // SyncML Toolkit options // ====================== // if defined, the entire complicated and thread-unsafe workspace manager // is completely bypassed #define NOWSM 1 /* if defined, avoids using 1, all debugging is enabled #ifdef RELEASE_VERSION #if RELEASE_SYDEBUG #define SYDEBUG RELEASE_SYDEBUG #else #undef SYDEBUG // absolutely no debug code for release! #undef CONSOLEINFO #endif #else #define SYDEBUG 2 // 3=including XPT trace, 4=including memory leak detection #undef CONSOLEINFO #endif // local Database options #define DESKTOP_CLIENT 1 // selects different binfile format (actually, will merge with mobile format at version 5) // separate files for outlook - different from old 1.0 client to make sure we don't import old problems #define SETTINGS_BFI_PREFIX "sysynclib_" // - if defined, local DB does not require any login in client mode #define NO_LOCAL_DBLOGIN 1 // - if defined, config file might contain s which will // allow a client to run directly from config w/o additionally // provided parameters. #undef PRECONFIGURED_SYNCREQUESTS // - if defined, XML config parsing is completely disabled, // all config must be set programmatically #undef HARDCODED_CONFIG // - if defined, remoterule mechanism is not included #undef NO_REMOTE_RULES // - if defined, support for hardcoded (predefined) // type definitions will be included #undef HARDCODED_TYPE_SUPPORT // - if defined, support for configurable types will be included #define CONFIGURABLE_TYPE_SUPPORT 1 // do not modify remote IDs in any way while processing them #define DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS 1 // if defined, session continues after 401/407 //#define AUTH_RETRY_USES_SAME_CLIENT_SESSION // SyncML Toolkit options // ====================== // if defined, the entire complicated and thread-unsafe workspace manager // is completely bypassed #define NOWSM 1 /* if defined, avoids using 1, all debugging is enabled #ifdef RELEASE_VERSION #if RELEASE_SYDEBUG #define SYDEBUG RELEASE_SYDEBUG #else #undef SYDEBUG // absolutely no debug code for release! #endif #undef CONSOLEINFO #else #define SYDEBUG 2 // 3=including XPT trace, 4=including memory leak detection #undef CONSOLEINFO #endif // - if defined, XML config parsing is completely disabled, // all config must be set programmatically #undef HARDCODED_CONFIG // - if defined, remoterule mechanism is not included #undef NO_REMOTE_RULES // - if defined, support for hardcoded (predefined) // type definitions will be included #undef HARDCODED_TYPE_SUPPORT // - if defined, support for configurable types will be included #define CONFIGURABLE_TYPE_SUPPORT 1 // do not modify remote IDs in any way while processing them #define DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS 1 // if defined, session continues after 401/407 //#define AUTH_RETRY_USES_SAME_CLIENT_SESSION // SyncML Toolkit options // ====================== // if defined, the entire complicated and thread-unsafe workspace manager // is completely bypassed #define NOWSM 1 /* if defined, avoids using #include #include "sysytool.h" // include files where commands are implemented #include "odbcapiagent.h" #include "syncagent.h" #include "sysync_utils.h" #include "rrules.h" static void cleanup(void) { NCDEBUGPRINTFX(DBG_ERROR,("Program aborted, atexit handler will now kill syncappbase")); // kill base object if any (will cause all current sessions to die) freeSyncAppBase(); } static void sighandler(int sig) { cleanup(); } // global options const char *gConfigFile = NULL; // -f, not optional const char *gUserName = NULL; // -u const char *gDeviceID = NULL; // -d bool gVerbose = false; // -v bool gSilent = false; // -s static void printTitle(void) { CONSOLEPRINTF(( "Synthesis SyncML Diagnostic Tool %d.%d.%d.%d - (c) 2004-" REAL_RELEASE_YEAR_TXT " by Synthesis AG\n", SYSYNC_VERSION_MAJOR, SYSYNC_VERSION_MINOR, SYSYNC_SUBVERSION, SYSYNC_BUILDNUMBER )); } // printTitle static void printUsage(const char *aCmdName) { printTitle(); CONSOLEPRINTF(("Usage:")); CONSOLEPRINTF((" %s [] [ ...]",aCmdName)); CONSOLEPRINTF(("Options:")); CONSOLEPRINTF((" -f configfile : (required) server's xml configuration file")); CONSOLEPRINTF(("Commands:")); CONSOLEPRINTF((" check")); CONSOLEPRINTF((" check config for syntax errors")); // let them show their own help text #ifdef SQL_SUPPORT execSQL(-1,NULL); #endif convertData(-1,NULL); testLogin(-1,NULL); charConv(-1,NULL); timeConv(-1,NULL); rruleConv(-1,NULL); parse2822AddrSpec(-1,NULL); wbxmlConv(-1,NULL); } int main(int argc, char *argv[]) { Ret_t err; #ifdef MEMORY_PROFILING size_t mematstart = gAllocatedMem; #endif // init hyper global stuff sysync_glob_init(); // set exit handler atexit(cleanup); signal(SIGABRT,sighandler); const int maxcmdargs=5; int cmdargc=-1; // number of non-option command arguments (-1 = command not found) const char *command = NULL; const char *cmdargv[maxcmdargs]; int idx=1; const char *p; while (idxreadXMLConfigStandard(gConfigFile,false,true); // local and global try // test if config is ok if (err!=LOCERR_OK) { CONSOLEPRINTF(("Fatal error in configuration (Error=%hd)\n",err)); exit(EXIT_FAILURE); } // override config's debug options to make it suitable for console output TDebugLogger *loggerP = sessionDispatchP->getDbgLogger(); TDbgOptions *optsP = (TDbgOptions *)(loggerP->getOptions()); optsP->fIndentString.erase(); optsP->fOutputFormat=dbgfmt_text; optsP->fTimestampForAll=false; optsP->fTimestampStructure=true; if (gVerbose) { sessionDispatchP->getDbgLogger()->setMask(DBG_TOOL); sessionDispatchP->getDbgLogger()->setEnabled(true); } else { sessionDispatchP->getDbgLogger()->setMask(0); sessionDispatchP->getDbgLogger()->setEnabled(false); } // now execute command if (strucmp(command,"check")==0) exit(EXIT_SUCCESS); // ok if we get that far #ifdef SQL_SUPPORT else if (strucmp(command,"execsql")==0) exit(sysync::execSQL(cmdargc,cmdargv)); #endif else if (strucmp(command,"convert")==0) exit(sysync::convertData(cmdargc,cmdargv)); else if (strucmp(command,"login")==0) exit(sysync::testLogin(cmdargc,cmdargv)); else if (strucmp(command,"charconv")==0) exit(sysync::charConv(cmdargc,cmdargv)); else if (strucmp(command,"addrparse")==0) exit(sysync::parse2822AddrSpec(cmdargc,cmdargv)); else if (strucmp(command,"time")==0) exit(sysync::timeConv(cmdargc,cmdargv)); else if (strucmp(command,"rrule")==0) exit(sysync::rruleConv(cmdargc,cmdargv)); else if (strucmp(command,"wbxml2xml")==0) exit(sysync::wbxmlConv(cmdargc,cmdargv)); else { CONSOLEPRINTF(("Unknown Command '%s'\n",command)); printUsage(argv[0]); exit(EXIT_FAILURE); } } // eof syncevolution-1.5/src/synthesis/src/syncapps/sysytool/sysytool.h0000755000373300037200000000104112424517753027137 0ustar00nightlyallusers00000000000000/* syncserver xpt generic header file */ #ifndef SYSYTOOL_H #define SYSYTOOL_H /* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #include "sysytool_precomp.h" /* headers not suitable for / entirely included in precompilation */ // transport related includes #include "xpt_server.h" // DB interface related includes #ifdef XML2GO_SUPPORT #include "xml2godb.h" #endif #ifdef SQL_SUPPORT #include "odbcdb.h" #endif #ifdef SDK_SUPPORT #include "plugindb.h" #endif #endif // SYSYTOOL_H syncevolution-1.5/src/synthesis/src/syncapps/sysytool/sysytool_dispatch.cpp0000755000373300037200000000264112424517753031360 0ustar00nightlyallusers00000000000000/** * @File sysytool_dispatch.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TSySyncToolDispatch * Pseudo "Dispatcher" for SySyTool (debugging aid tool operating on a server session) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-12-07 : luz : created from old version */ // includes #include "sysytool.h" #include "sysytool_dispatch.h" // common includes #include "syncappbase.h" #ifdef XML2GO_SUPPORT #include "curl.h" #endif namespace sysync { // dispatcher creation function TXPTSessionDispatch *newXPTSessionDispatch(void) { // create new app-sepcific dispatcher MP_RETURN_NEW(TSySyncToolDispatch,DBG_OBJINST,"TSySyncToolDispatch",TSySyncToolDispatch()); } // newXPTSessionDispatch /* * Implementation of TSySyncToolDispatch */ /* public TSySyncToolDispatch members */ TSySyncToolDispatch::TSySyncToolDispatch() { // create config root fConfigP=new TXPTServerRootConfig(this); #ifdef XML2GO_SUPPORT // xml2go needs cURL curl_global_init(CURL_GLOBAL_ALL); #endif } // TSySyncToolDispatch::TSySyncToolDispatch TSySyncToolDispatch::~TSySyncToolDispatch() { fDeleting=true; // flag deletion to block calling critical (virtual) methods #ifdef XML2GO_SUPPORT // xml2go needs cURL curl_global_cleanup(); #endif } // TSySyncToolDispatch::TSySyncToolDispatch } // namespace sysync /* end of TSySyncToolDispatch implementation */ // eof syncevolution-1.5/src/synthesis/src/syncapps/sysytool/sysytool_dispatch.h0000755000373300037200000000160312424517753031022 0ustar00nightlyallusers00000000000000/** * @File sysytool_dispatch.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TSySyncToolDispatch * Pseudo "Dispatcher" for SySyTool (debugging aid tool operating on a server session) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-12-07 : luz : created from old version */ #ifndef SYSYTOOL_DISPATCH_H #define SYSYTOOL_DISPATCH_H // required headers // - based on XPT transport session dispatcher #include "xptsessiondispatch.h" namespace sysync { class TSySyncToolDispatch: public TXPTSessionDispatch { typedef TXPTSessionDispatch inherited; public: TSySyncToolDispatch(); virtual ~TSySyncToolDispatch(); protected: // return output channel handle for debug virtual TDbgOut *newDbgOutputter(bool aGlobal) { return new TConsoleDbgOut; }; }; // TSySyncToolDispatch } // namespace sysync #endif // SYSYTOOL_DISPATCH_H // eof syncevolution-1.5/src/synthesis/src/syncapps/sysytool/sysytool_precomp.h0000755000373300037200000000072512424517753030674 0ustar00nightlyallusers00000000000000/* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #ifndef SYSYTOOL_PRECOMP_H #define SYSYTOOL_PRECOMP_H // transport related includes #include "xpt_server_precomp.h" // DB interface related includes #ifdef XML2GO_SUPPORT #include "xml2godb_precomp.h" #endif #ifdef SQL_SUPPORT #include "odbcdb_precomp.h" #endif #ifdef SDK_SUPPORT #include "plugindb_precomp.h" #endif #endif // SYSYTOOL_PRECOMP_H // eof syncevolution-1.5/src/synthesis/src/syncml_tk/0000755000373300037200000000000012424517753023320 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/Synthesis_RTK_history.txt0000755000373300037200000002014212424517753030355 0ustar00nightlyallusers00000000000000Synthesis' changes to SyncML RTK - History ------------------------------------------ 2002-09-03 - changed message size calculation from inaccurate estimation to RTK's built-in space_evaluation method. This is accurate, but RTK code had a few nasty bug that took many hours to find and fix. 2002-11-27 - fixed bug in sml which prevented creating CTCap without Properties (but e.g. P800 email sends this). 2003-04-24 - Fixed RTK to generate MaxObjSize - Fixed to send namespace according to SyncML version and accept all namespaces beginning with "SYNCML:SYNCML" as namespace for document. 2003-04-28 - Fixed a zillion bugs in the RTK that made SyncML 1.1 fail (Nokia 7250). Encoder support for new DevInf flags (NOC, UTC, LargeObjSupport) was completely missing (interestingly, the TN_DEVINF_xx were defined but not listed in the tag table). Hopefully corrected all these now. - engine/rtk: RTK was using incorrect FPI's in WBXML when using SyncML 1.1. Introduced "vers" parameter for encoder to handle all these version dependencies neatly - SyncML RTK PPC: xptitcp.c for PocketPC did rely on send() to send the entire buffer, which is not something that can be guaranteed (altough it is normally the case). - SyncML RTK PPC: xptitcp.c tcpSendData() allowed a timeout of only 5 seconds for the socket to get ready for send(). In the HTC SmartPhone2003 this timeout gets exhaused after around 20k of data sent over GPRS, so sending failed. Now added a loop retrying the select() for about 4 minutes (interruptable). Made HTC work! 2003-06-26 - Reorganized xpt-tcp.c/h and xptitcp.c/h to have all platform-specific code in xptitcp.c. Standard (generic) implementation of TCP read and write is still in xpt-tcp.c but can be disabled if xptitcp.h defines PLATFORM_TCPxxxx symbols. A tcpEnableSSL() dummy is now also in xpt-tcp.c, so for a 100% standard xpt the xptitcp.c (which we added to the toolkit) is not a requirement any more. - Moved WINCE-specific timeout extensions for tcp read/write to win/xptitcp.c 2003-09-03 - Palm: Fixed bug in xptitcp.c: when send() did not send all bytes at once (PalmOS seems to send only 16k per call) we got a "Sending Error...". Now implemented a loop that send()s until all data is transmitted. 2003-11-12 - PalmOS client: Fixed problem in xptitcp.c which caused the net connection to be shut down even if it was already open when starting the client. 2004-02-23 - XPT: HTTP send was moving data in the send buffer (copyBlock(), called by encodeData()). Changed to only update the buffer pointer instead - send buffer should REALLY be read-only for sending routines!! 2004-04-28 - xpt-http: implemented CONNECT for proxy with SSL case. - PALM: implemented new stuff in xptitcp.c to allow deferred SSL handshake for SSL/Proxy case. Could not be fully tested because Palm emulator occasionally crashes on SslRead and SslReceive, however we could run one SSL session through the proxy so we assume its ok. Needs testing on real PalmOS >=5.2 device to verify. 2004-10-12 - working gzip (receiving only!) support now in xpt. 2005-01-10 - Added new error codes in xpt to pass through user abort from TCP level down to xptclientbase: TCP_TC_USER_ABORT in TCP, HTTP_RC_USERABORT in HTTP. 2005-01-11 - Made sure USER ABORT condition is also checked when opening connection, not only in message exchange. 2005-03-07 - RTK: Found catastropic bug in xltdec.c in routine concatPCData(), which was called only when (WB)XML contents were encoded not as a single string, but consisting of multiple, adjacent strings. The routine just did it plain wrong by using strcat into a buffer that did not have correct size allocated first. - RTK: Added #ifdef to RTK sml part to include the strings for the XML tags even if only WBXML is included in a client to allow decoding tags that are not represented by their WBXML token but by their XML tag string. 2005-04-29 - xpt http: Added HTTP_KEEP_CONNECTION #define 2005-05-18 - xpt: finished HTTP 1.1 "Connection: keep-alive". Now both XPT servers and XPT clients support this. The #define HTTP_KEEP_CONNECTION now only affects the config default for clients. For XPT servers, keep connection is always supported. 2005-06-07 - PalmOS: fixed error checking in xptitcp.c when sending or receiving data which caused that the app did not notice when the socket closed early (e.g. due to SSL timeout in HTTP 1.1 keepalive case) and then hung in waiting for receive on a closed socket. 2005-08-16 - Updated sml part of RTK from current sourceforce version - mainly change to doxygen style docs, no substantial code changes at all. 2005-08-17 - Many changes to adapt RTK for DS 1.2. 2005-09-29 - RTK: missing VerCT for CTCap, now added it. 2005-11-11 - SyncML RTK: made xml parser understand xml where metInf tags are used w/o namespace attribute (as in sync4j PDA clients). 2006-07-11 - xpt: Made HTTP auth support work in Basic and Digest mode (various little problems in xpt). 2006-09-07 - xltenc(XML): Finally implemented a real safe (= XML nestable) " in input string is escaped by exiting and re-entering CDATA and becomes "]]>]". This breaks the contained ]]> sequence so it is no longer visible to the surrounding CDATA parsing process. - xltenc(XML): Now checking strings passed as SML_PCDATA_STRING for invalid XML chars (&,<,>) and auto-switch to SML_PCDATA_CDATA generation mode if so. This mostly because of filter strings which now often contain pseudo-entities like "&iCON;" or "&NULL;". - xltdec(XML): Made parsing PCDATA sections that contain normal PCDATA and CDATA mixed actually work. The design was prepared for it, but was apparently not properly debugged. - Fixed bugs in xltdevinf, FilterRx parsing was missing, FilterCap parsing did not really work. - Added workaround in xltdevinf.c to allow extra rx-pref and tx-pref (as some clients send these). 2006-11-02 - Added detail parsing error logging for sml toolkit decoder. 2006-11-08 - xpt: gzip receiving did not work correctly when sender did not use chunked transfer, but sent gzipped message in a normal response (where content-length is the size of the compressed data). 2006-12-06 - XPT: fixed httpRead to make sure it always waits until it can return some data except if connection or document ends. This is important for chunked mode, because there are cases where the server sends some data (e.g. a chunk header only) that does not decode to any output of data. In this case, httpRead now repeats reading from the TCP socket until data arrives or connection ends. 2007-06-20 - xpt/http: Enhanced parsing of Connection: header, must be prepared for multiple tokens in http 1.1, of which only one might be the "close" token. 2007-08-14 - Made SML generator accept a with s AND a , when the latter is an empty string. Still, only ValEnums will be generated. This is to correctly translate WBXML back to XML from devices like E90. syncevolution-1.5/src/synthesis/src/syncml_tk/doc/0000755000373300037200000000000012424517753024065 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/doc/ReadmeMaintenance4_1.doc0000644000373300037200000030300012424517753030414 0ustar00nightlyallusers00000000000000ÐÏࡱá>þÿ ¾Àþÿÿÿ¼½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Áq¿Û bjbjt+t+8<AApcÿÿÿÿÿÿ]ÀÀÀÀ444HHHH8€”4H¶¬ìÜÜ(ÀÀÀ{¬}¬}¬}¬}¬}¬}¬$¢¯ô–±Œ¡¬4À€€@ÀÀ¡¬j ÀÀ|Üj j j ÀXÀÀR{¬HHÀÀÀÀÀ{¬j äj N'’’ÊÀ"W¬$È€‹ ´ ßÁHH RYªþSyncML Reference Toolkit Specification READ ME Copyright Notice Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved. Implementation of all or part of any Specification may require licenses under third party intellectual property rights, including without limitation, patent rights (such a third party may or may not be a Supporter). The Sponsors of the Specification are not responsible and shall not be held responsible in any manner for identifying or failing to identify any or all such third party intellectual property rights. THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. The above notice and this paragraph must be included on all copies of this document that are made. File and Directory Structure The SyncML Reference Toolkit file tree is structured as shown in the following figure. Within syncml/src/sml the files of the toolkit itself are found. The transport handlers are stored in the directory syncml/src/xpt. Demos showing syncml at work will be organized within syncml/src/app. syncml ------ docs ----- internal ! !---- bin ------ win Binary files (like dlls) ! !---- src ------ sml ------ inc ------ win Public Headers ! ! ! ! ! !--- palm ! ! ! ! ! !--- mgr ------ inc SyncML Core (Manager) ! ! ! ! ! !--- all ! ! ! ! ! !--- win ! ! ! !--- wsm ------ inc SyncML Workspace ! ! ! ! !--- all ! ! !--- palm ! ! !--- win ! ! !--- linux ! ! !--- epoc ! ! ! !--- xlt ------ inc SyncML En-/Decoder ! ! ! ! ! !--- all ! ! ! ! ! !--- lib ------ inc SyncML Library Funct. ! ! ! !--- all ! !--- palm ! !--- win ! !--- linux ! !--- epoc ! !--- xpt -- !--- bindings Transport Handlers ! !--- manager Supported Platforms The SyncML Reference Toolkit has been implemented to be portable to as many hardware platforms and operating systems as possible. Nevertheless it is not possible to achieve an full platform independent code. The SyncML consortium therefore focusses on the following platforms: Windows 32 The deliverables target Windows 95 and NT 4.0 and comprise: Source Files. Several subdirectories named ../win hold files specific to the Windows target (e.g. syncml/src/sml/wsm/win). When compiling all these Windows-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../palm; ../epoc)! The source code was developed using the following development environments : Microsoft Visual Studio C++ IBM Visual C++ GCC Palm-OS The deliverables target Palm OS 3.5 and comprise: Source Files. Several subdirectories named ../palm hold files specific to the Palm target (e.g. syncml/src/sml/wsm/palm). When compiling all these Palm-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../win; ../epoc)! The source code was developed using the following development environments : Metrowerks GCC The Toolkit for Palm runs on Palm OS 3.1 too. Due to limitations of that version of the operating system, the size of the workspace is restricted to maximim 50kBytes. LINUX To compile and run SyncML under a Linux Platform, the Win32 source code is used. Please follow the instructions in the README.linux file in the “src/bld” directory. Changes in the Maintenance 4 Release Obex transport binding was fixed to work properly with the XPT communication API. Sofar it’s only tested on Win32 systems running Windows 2000 (OBEX / IR and OBEX / TCP/IP) Implementing several DTD changes to support device management Implementing new extension for “Progress Information” usind a new tag “NumberOfChanges” Implementing new extension for “Large Object Handling” using a new flag MoreData for Item-Tags Implementing new extension for “Large Object Handling”, new API to calculate remaining space for data after setting up the tag-structure skeleton Implementing new extension to transport toolkit to support cryptographic security against manipulation during transport, new header field “x-syncml-hmac” (HTTP and OBEX only, not WSP) Bug fix for an Microsoft IIS-Hack in HTTP transport binding Bug fix for a minor bug causing the HTTP transport binding toolkit part to crash if message type string is longer than allowed 4.1: Declarating function ltoa() in linux-special file src/xpt/bindings/http/linux/xptihttp.h 4.1: Adding support for ‘SupportLargeObjs' and 'SupportNumberOfChanges' tags in device information dtd  SyncML Reference Toolkit Read Me  SPEICHERDAT \@ "jjjj-MM-tt" \* FORMATVERBINDEN 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.  SyncML Reference Toolkit Read Me  SPEICHERDAT \@ "jjjj-MM-tt" \* FORMATVERBINDEN 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.   &'/?" # % B   ®  S a b c d w … ® Ç  B 5EÌÞ¶ÊËQc¶Ìáëì(4TZ‹¡<LËûóûéáÜÕéÏÉÏÃÏÉϻճթթթ¡Õ©Õ©Õ©šÕ©Õé’ˆ††OJQJ55B*CJOJQJ5B*OJQJ CJOJQJ6CJOJQJ56CJOJQJ<CJOJQJB*CJOJQJ B*OJQJ B*OJQJ B*OJQJ CJOJQJOJQJCJOJQJh5B*CJOJQJ5CJ$mH nH 5CJ$2'/@~¾úO‰Ê KŠ´µö;z»ü=Á I † ôôéççççççççççççççççççççççç $1$¤hH$7$8$ $1$¤€H$7$8$'/@~¾úO‰Ê KŠ´µö;z»ü=Á I † Ç O “ ¾ ¿  # % B c d † É Ó ] ’ ³ Ô L«ÞÿFr¥Ù Au–ß >_€Ìø+_’Çûe‡´µ¶·Ìáì(OP¹ÈÌÔüöðê              [† Ç O “ ¾ ¿  # % B c d † É Ó ] ’ ³ Ô LýýýýýýýýõâÒõÇÇÇÇÇÇÇÇÇÇÇ 1$d@ÿH$7$8$1$¤x¤xH$7$8$ Æ&$1$„°„Pþ¤ H$7$8$ Æ@1$H$7$8$«ÞÿFr¥Ù Au–ß >_€Ìø+_’Çûe‡´µôôôôôôôôôôôôôôôôôôôôôôôôôôôô 1$d@ÿH$7$8$µ¶·Ìáì(OP¹ÈÌÔ()v…†ôááÙÆÙ³ÙÙ³³³ÆÙ³ÙÙ³³Ù & F 1$„h„˜þH$7$8$ Æh$1$„°„Pþ¤ H$7$8$ ÆÐ1$H$7$8$$1$„°„Pþ¤ H$7$8$ Æ@ 1$d@ÿH$7$8$ËÌÓÔ29g~%v„-23ØÙÚÜ"opq–—ÇÈÒÓዟ ¡¢ÇÈøù   ¼ Ó Ô Ö × Ú Û øîìçççìøîßÕÕÏÃϾ¾¾¾¸¶³¾¾¾¾¸¬¥Ï jp2CJU jCJUCJh hmH nH jUB*OJQJhmHnH B*OJQJ5B*CJOJQJB*CJOJQJOJQJ55B*CJOJQJ5B*OJQJ4()v…†-3ØÙÛܰîF¥7ï+ªpÇÔÕ ¡¼Å  L Ñ Ò Ó Õ Ö Ø Ù Ú Û úôîëåßÙÓÍÇÁ»µ³°®®®®°°°®®®®³³µ                                                   ,†-3ØÙÛܰîF¥7ï+ªp÷ä÷ÔÈ÷¹®           & F 1$dðH$7$8$ 1$dðH$7$8$$1$¤ H$7$8$ Æ@ 1$H$7$8$ Æh1$¤x¤xH$7$8$ Æ&$1$„°„Pþ¤ H$7$8$ ÆÐ1$H$7$8$p‹”ÔÕ ¡¼Å  L Ñ Ò Ó Õ Ö Ø Ù Ú Û ûûûùööùûûûùööùùùùùùùè & F 1$dðH$7$8$$¤ 6 00P P &P °‚. °ÆA!°8"°8#p$R%°°Þ°2p2Dd&&`+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1D6nð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚p2Dd&&`+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1´26nð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚e [D@ñÿDStandardOJQJ_HmHnHsH tH ujòj Überschrift 1$ & F¤ð¤ @& Æ75B*CJ OJQJmH sH uRòR Überschrift 2!$ & F¤ ¤@& Æ7@CJF!òF Überschrift 3 & F@& Æ@ÐCJZ1òZ Überschrift 4. & F ÆÐ`„Є0ý¤ð¤P@&^„Ð`„0ýFF Überschrift 5¤<¤@& Æð5:: Überschrift 6 @& Æ€:: Überschrift 7 @& Æ:: Überschrift 8 @& Æ : : Überschrift 9 @& Æ0BA@òÿ¡B Absatz-StandardschriftartFþòF Body¤x¤x Æ&B*CJOJQJmH sH u:þ: 11 BodyText„¤Ü^„CJ> >Fußzeile$d Æ9r OJQJ<@"< Kopfzeile Æ  ø%OJQJ6þ26 22 BodyText„% ¤Ü^„% 6Q6 Verzeichnis 1OJQJVþRV Heading 1TOC! Æâ‘ „â„ý¤x^„â`„ý 5B*CJ¢þb¢ Bulleted - 1t & Fÿ„w„›þ¤Ü>ÆTÿe-ð^„w`„›þCJ¤þr¤Numbered List 1t & Fÿ„w„›þ¤Ü>ÆT€e.^„w`„›þ>þq‚>Numbered List 2 „Š ^„Š CJ,’, Fußnotentextžþ¢ž Bulleted - 2t & Fÿ„Š „›þ¤Ü>ÆTÿe-ð^„Š `„›þFÁF Verzeichnis 2„‰„Xý^„‰`„XýOJQJTþÂT Heading 2TOC! Æ‹‘ „‹„Wý¤(^„‹`„WýB*CJ>á> Verzeichnis 3„Ý„­ü^„Ý`„­üTþâT Heading 3TOC! ÆÜ‘ „Ü„¯ü¤P^„Ü`„¯üB*CJ<þò<Document Title¤€5CJ$LL Verzeichnis 4 Æ ‘ ‰‡ „  „<ü^„  `„<üPþP Heading 4TOC! Æ¢ ‘ „¢ „:ü^„¢ `„:üB*CJBB Verzeichnis 5 "„ ^„  CJOJQJBB Verzeichnis 6 #„è^„è CJOJQJBB Verzeichnis 7 $„°^„° CJOJQJBB Verzeichnis 8 %„x^„x CJOJQJBB Verzeichnis 9 &„@^„@ CJOJQJ@Yr@Dokumentstruktur'-D OJQJBþ‚B CellBody (¤P¤PB*OJQJmH sH uLþ’L CellHeading )¤x¤x5B*OJQJmH sH uNþòN Heading 02 *$¤h5B*CJOJQJmH sH uLþ²L Nonum Heading +1$¤x¤d5CJ$htH u(U@¢Á( Hyperlink>*B*>V@¢Ñ> GesichteterHyperlink>*B* HþâH Abstract .d,¤ðB*CJOJQJmH sH u´þò´ Bulleted/ & Fÿ Æh„„åþ¤x>ÆTÿ·ð·······^„`„åþB*CJmH sH uJþJ BulletedCont0„¤P^„B*CJmH sH uJþJEquation1d¤È¤x Æ‘  B*OJ QJ :þ": Figure 2¤x¤6B*mH sH uNþ2N Footnote3 Æä„ä„ÿ¤<^„ä`„ÿB*mH sH uZþòZ Heading 014$$¤ð¤@&d5B*CJ OJQJmH sH uN#NAbbildungsverzeichnis5„„pþ^„`„pþJþbJ Numbered6 & F>¤x ÆB*CJmH sH u¨þr¨ Reference|7 & Fÿ Æ7„„åþ¤x>ÆT€[]^„`„åþB*CJJþ‚J SubTitle8$$d@a$5B*CJmH sH uFþòF TableTitle9¤x ÆT6B*mH sH u$X@òÿ¡$ Emphasis66þOòÿ±6 EquationVariables66þOòÿÁ6 ProgramCodeCJOJQJkH'&þOòÿÑ& SubscriptH**þOòÿá* SuperscriptH*,þOòÿñ, SymbolCJOJQJkH*6þOòÿ6 Underline>*CJOJQJkH'8"8 Beschriftung A¤x¤x6$)@¢!$ Seitenzahl:þñ2: DocumentOwnersC$a$CJ8ZB8 Nur TextDOJQJmH sH u\þb\ Definition List E„h1$^„hCJOJQJhmH sH tH uXþRX Definition Term F1$¤d¤dOJQJhmH sH tH u@þñr@ Editors NotesG6B*CJOJQJ:þñ‚: Code SnipetH¤x CJOJQJVþV H1I$ & F1$¤ð¤d@&%5CJ(KH$OJQJhmH sH tH uRþR H2J$ & F1$¤d¤d@&!5CJ$OJQJhmH sH tH u(þOòÿ±( Definition6LþL H3L$1$¤d¤d@&!5CJOJQJhmH sH tH uLþL H4M$1$¤d¤d@&!5CJOJQJhmH sH tH uHþH H5N$1$¤d¤d@&5OJQJhmH sH tH uLþL H6O$1$¤d¤d@&!5CJOJQJhmH sH tH uHþH AddressP1$!6CJOJQJhmH sH tH ubþb BlockquoteQ„h„h¤d¤d1$]„h^„hCJOJQJhmH sH tH uþOòÿ! CITE6$þOòÿ1$ CODE CJOJQJ0þOòÿA0 Keyboard5CJOJQJpþRp Preformatted+U1$ Æ# ¿~= ü»z9ø·!v%OJQJhmH sH tH ufþñÿfz-Bottom of FormV$$d1$a$"<CJOJQJ_HhmH sH tH `þñÿ` z-Top of FormW$&d1$a$"<CJOJQJ_HhmH sH tH $þOòÿ$ SampleOJQJ0þOòÿ‘0 Typewriter CJOJQJ$þOòÿ¡$ Variable6,þOòÿ±, HTML Markup<B*"þOòÿÁ" Comment<TþâT Title1]$¤ð¤d1$a$!5CJ0OJQJhmH sH tH uZþâZ Subtitle1^$¤x¤d1$a$!5CJOJQJhmH sH tH uHþòH RFC-P1_„°¤ð^„°CJOJQJmH sH tH uRþR Param$` & F¦„e„›þ¤P¤(1$^„e`„›þhmH sH tH uLþL CODECompacta1$CJOJQJhmH sH tH u,þ1, Title Textb5.þ2. 00 BodyTextc¤Ü,þB,Bullet 1 d & FÛÿÿÿÿÿÿÿÿ ÿÿÛ<ÿÿÿÿee1–beËÛ † µ†pÛ Û &WbWˆ“e4ÿ•€4ÿ•€ð@ð  @ñÿÿÿ€€€÷ð ððxð( ð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`Tðð ð"ñ¿€𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`Tðð ð"ñ¿€ð’ðð0ð( ð ððB ðS ð¿Ëÿ ?ð1e¸ÿÿÿòÿÿÿSýµ@¸ÿÿÿòÿÿÿSýµ@"19OY_`klopÒÓÜ÷ø‘opÒÓÙÜÿÿ Lothar Merk`E:\SyncMLDelv\syncml_tk_Maintenance1.2_PalmLinuxWin_20010423\syncml\doc\ReadmeMaintenance1.2.doc Lothar Merk`E:\SyncMLDelv\syncml_tk_Maintenance1.2_PalmLinuxWin_20010423\syncml\doc\ReadmeMaintenance1_2.docMerk]C:\Data\SyncMLDelv\syncml_tk_Maint2_PalmLinuxWin_20010611\syncml\doc\ReadmeMaintenance1_2.docMerk[C:\Data\SyncMLDelv\syncml_tk_Maint2_PalmLinuxWin_20010611\syncml\doc\ReadmeMaintenance2.docMerk[C:\Data\SyncMLDelv\syncml_tk_Maint2_PalmLinuxWin_20010611\syncml\doc\ReadmeMaintenance2.docMerk[C:\Data\SyncMLDelv\syncml_tk_Maint3_PalmLinuxWin_20010917\syncml\doc\ReadmeMaintenance3.docMerk[C:\Data\SyncMLDelv\syncml_tk_Maint3_PalmLinuxWin_20010917\syncml\doc\ReadmeMaintenance3.doc Thomas Klein@C:\Documents and Settings\thklein\Desktop\ReadmeMaintenance3.docIBM-User%D:\syncML\Doku\ReadmeMaintenance4.docIBM-User'D:\syncML\Doku\ReadmeMaintenance4_1.docüûÿÿÿÎÜÖ-ÿÿÿÿÿþÿÿÿÿÿÿÿÿÔhXíz@ÿºo:éÈuÿzS0à–ÀÿXlhdmÿÿÿÿÿÿÿÿÿ'5ÄáÚÞÿÿÿÿÿÿÿÿÿ¢M‹ ÿ1Í ÿB-6ïr-ÿµÚj?fÿ4 tj?fÿ$Ù ÿö[' ÿ†ld0à–Àÿ„m"0à–Àÿvj?fÿßhš6ïr-ÿÿÿÿÿÿÿÿÿZk¤V"ÙÿßQ±š…6$ÿt-j?fÿñI% ÿÿÿÿÿÿÿÿÿGB j?fÿ…'”  ÿ¹¨ ÞaÊ–ÿ›}þ šŠƒÿ»@I 0à–Àÿ$0< 0à–Àÿo j?fÿŒ@  ÿ ¾  ÿà:.j?fÿO{Qj?fÿÿÿÿÿÿÿÿÿ¯F‰0à–ÀÿÀdÚ ÿVVU ÿ@I P´ eÿ`ç ò\ÿºY ÿ:ksP´ eÿêN†ÿzh ~`V÷ÿÿÿÿÿÿÿÿÿ¿Al0à–ÀÿtQcÿRùV"ÙÿTrròz ­ÿ?ÎfØFÿÿÿÿÿÿÿÿÿ ˆ ÿü=êj?fÿ‘,WXÊÿOuðj?fÿ3v䆸ŸÿÿÿÿÿÿÿÿÿîXjj?fÿ­IXÊÿ™öÄáÚÞÿÊ• ÿÁi³ ÿOË0à–Àÿ’ý$h"—ÿÿÿÿÿÿÿÿÿ _Ej?fÿàN˜éÈuÿÿÿÿÿÿÿÿÿK» ÿ®T0à–Àÿ/9[0à–ÀÿC_‡ ÿ‰bÞj?fÿL{0à–Àÿ·PÔj?fÿKL8 6ïr-ÿÑÆ j?fÿxcÈ 0à–ÀÿÙï šŠƒÿ±T!0à–Àÿœ¦!šŠƒÿaU¶" ÿêv·"$h"—ÿÿÿÿÿÿÿÿÿ•mØ" ÿ+K#j?fÿ½m$¶k@rÿIÿÿÿÿÿÿÿ_P‰$0à–Àÿ FÜ$اÔÿÿÿÿÿÿÿÿÿ‚l%0à–Àÿ©>@% ÿJVX%x,µÿ n&j?fÿL«' ÿ¾E¤)4-¢ ÿï)0à–Àÿ{k* ÿ r*j?fÿÿÿÿÿÿÿÿÿPCs*j?fÿÓH +ÿ7 ..žŒ6•"o.ÄáÚÞÿPi‘0øˆ-`d<ç0 ÿb;¡1ÄáÚÞÿ^G¨1V"Ùÿþ1Ã10à–Àÿßê10à–ÀÿÙ$2j?fÿd*Ž20à–Àÿ@Ÿ2ÄáÚÞÿrA°2䆸Ÿÿ2.3 ÿ¤FP3P´ eÿ$F50à–ÀÿÙ*7ÄáÚÞÿ”2§7j?fÿÿÿÿÿÿÿÿÿéMA8éÈuÿp(þ8 ÿ@ Ö9täŽýÿ¥}: ÿïcš:ì=.ÿÈFÅ:0à–Àÿ­ ;V"Ùÿ‘q};FîNÿ§-­;j?fÿ‰‰j?fÿŽ3™>éÈuÿÿÿÿÿÿÿÿÿçA7@j?fÿ®?l@j?fÿÊÅ@ E^xÿÿÿÿÿÿÿÿÿZæA ÿãUóAj?fÿ÷ùB0à–ÀÿuqCj?fÿF_C$h"—ÿÏC ÿã)DP´ eÿdKEj?fÿ.E ÿGuXE0à–Àÿ5t€Ej?fÿ{‡E0à–Àÿâ—EÄáÚÞÿÿÿÿÿÿÿÿÿp«EÄáÚÞÿÿÿÿÿÿÿÿÿŽx¸E ÿäE0à–Àÿ:¤F ÿ· ¦FV"ÙÿqJ«F4-¢ ÿtMG0à–Àÿt?Gj?fÿÛqBGj?fÿf»G ÿ–)Hj?fÿTVHØ"Žgÿÿÿÿÿÿÿÿÿ 6pH4-¢ ÿB›HÀDâŒÿÿÿÿÿÿÿÿÿGÁHÿ.PbJ ÿÐ{­KÄáÚÞÿÿÿÿÿÿÿÿÿIN™LÄáÚÞÿÿÿÿÿÿÿÿÿb-³Lÿðk‘Mj?fÿs#ºM ÿ#tÑN0à–Àÿ„$‡OXÊÿ>PšŠƒÿƒt¡PV"Ùÿ§!FQj?fÿ¡0ËQéÈuÿÃLôQ ÿÓT ÿ´g^Tj?fÿ`•Tt(øxÿ^F»TP´ eÿh ØU ÿc{V ÿx-^V0à–ÀÿõeWTñ–ÿr»WšŠƒÿv\YŠ Iÿs˜Y ÿj:šYéÈuÿÿÿÿÿÿÿÿÿÛp¦Y ÿúSC[j?fÿŒ&H[ ÿÕ=j[šŠƒÿ¹Hˆ[ÄáÚÞÿÿÿÿÿÿÿÿÿ}¤[ÄáÚÞÿ+%?\Xíz@d9+]$h"—ÿÿÿÿÿÿÿÿÿT"í] ÿí57^ÄáÚÞÿ·U•^0à–Àÿ0K_0à–Àÿ~`j?fÿ`Gû`؉¨Àÿÿÿÿÿÿÿÿÿ"AaìzÐeÿ_[`bP´ eÿ~c¬é„mÿÿÿÿÿÿÿÿÿ+ ‘cˆnªÚÿÿÿÿÿÿÿÿÿ`&d0à–ÀÿÜh‡d0à–ÀÿVDŠdj?fÿÇm½dØybzÿ³5ÿe0à–ÀÿaJƒgÄáÚÞÿÿÿÿÿÿÿÿÿo 5h0à–ÀÿÎ#Öh ÿÓøiÿVRekÄáÚÞÿÿÿÿÿÿÿÿÿøt5lÄáÚÞÿÿÿÿÿÿÿÿÿv2ÐlÄáÚÞÿÿÿÿÿÿÿÿÿmÄáÚÞÿÿÿÿÿÿÿÿÿ [ynÄáÚÞÿ=xòn ÿ?4®oÿ³oÿ8>Rp ÿ$rÄáÚÞÿŽyLsj?fÿlt6ïr-ÿÿÿÿÿÿÿÿÿ×8¥tüÆ®|ÿÿÿÿÿÿÿÿÿHqªtÿ8+•uP´ eÿà[–uÿ“*©u$h"—ÿÿÿÿÿÿÿÿÿgYÂu ÿÇa)vP´ eÿÇ|$w¾ú ÿA3wj?fÿ,®w0à–Àÿ×:ExÄáÚÞÿÿÿÿÿÿÿÿÿ<=Ûx ÿºgßx6ïr-ÿÿÿÿÿÿÿÿÿö yÿÚd/yj?fÿpioyj?fÿCooyj?fÿÍ|zz´:B7ÿÿÿÿÿÿÿÿÿ†{ ÿ›t´{ÿÿÿÿÿÿÿÿÿÿÿÿÿ 4Ð{6<½ÿSï{j?fÿÝI'|$h"—ÿÿÿÿÿÿÿÿÿ^Š|j?fÿH)õ| ÿ’A}0à–Àÿ+2}ÄáÚÞÿÿÿÿÿÿÿÿÿ`}ÄáÚÞÿhMÆ~j?fÿ%8î~0à–Àÿl^0à–ÀÿÚP›}þ KL8 r»WÙï †ld»@I GuXE$F5ï)$0< ,®w³5ÿe¯F‰zSéMA8ºo:¿Al±T!x-^V%8î~d*Ž2’A}„m"#tÑN‘q};äE‚l%l^þ1Ã1Üh‡dtMGßê1xcÈ ®T_P‰$7 .0K_ÈFÅ:OËo 5h·U•^{‡E`&d÷ùBL{/9[TrrúSC[~`–)H _E§!FQdKE§-­;´g^TîXjÑÆ Cooy‰bÞ8 ÙvPCs*Úd/y5t€E®?l@pioyhMÆ~ŽyLs^Š|‰‰<Sï{ÚOuð n&4 tü=ê·PÔÇm½d¢M‹Óøi¹¨ à[–uHqªt?4®oÓH +ö y³o…'” ÃLôQþÿÿÿ˜ú¢þÿÿÿìú¢þÿÿÿPû¢Ž3™>aJƒgêv·"9+]VRek“*©u’ý'5ÝI'|+2}¹Hˆ[O{Qv2ÐlÐ{­K×:Exøt5l r*â—Ep«EmIN™L”2§7ºgßxßhšltj:šYàN˜Ûp¦Ys#ºM$Ùp(þ8+K#H)õ|Ç|$wþÿÿÿ´û¢ ˆ¥}:™öh ØU†{gYÂu ¾ Ù*7$rPi‘0í57^ºY`} [yn@Ÿ2þÿÿÿü¢•"o.b;¡1}¤[<=Ûx`Gû`B-`ç•mØ"Žx¸EçA7@GB {k*t?Gc{VÎ#ÖhÏCA3wÁi³8+•uVVUVDŠdo Ù$2K»µÚÊ•"AauqCðk‘MÛqBGT"í]L«'8>Rp.PbJF_Cþÿÿÿ|ü¢©>@%ZæAs˜YaU¶"7 .äü¢Œ@ ö['ÀdÚ_[`bðü¢.E‹6¢TuF=`•TJVX%JVX%üü¢v\Yïcš: 4Ð{@I ­I„$‡O‘,W@ Ö9RùqJ«F¾E¤) 6pHRùý¢­ ;Zk¤^G¨1ƒt¡PÚGè· ¦FÇa)v¤FP3^F»Tã)D:ks"Aaý¢t-ÓTõeWõeW ý¢ßQ±ßQ±,ý¢d<ç0b-³LtQcêN†GÁH2.3+ ‘c+%?\3vrA°2Ôhþÿÿÿþÿÿÿ8ý¢ÿþ×8¥tÿÿÿÿÿÿÿÿtù¢` ˆ@e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØù¢`m@h „Є˜þ^„Ð`„˜þOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ<ú¢`l@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤ú¢ Ê@CJ$OJ QJ o(" ÿÿÿÿøú¢ @e „Š „›þ^„Š `„›þOJ QJ o(·ðÿÿÿÿ\û¢`c@e „Š „›þ^„Š `„›þOJ QJ o(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀû¢ @e „w„›þ^„w`„›þOJ QJ o(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$ü¢ @e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆü¢ s@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDý¢ @h„„^„`„OJQJ^Jo(·ðÿÿÿÿÿÿü    ÿ@€oot‚EoUÛ@@ G‡z€ÿTimes New Roman5€Symbol3& ‡z€ÿArial?Courier Neu?5 ‡z€ÿCourier New71Courier="HelvArial;" Helvetica5& ‡z€ÿTahoma3Times;€Wingdings]& Rotis Sans Serif for Nokia"CˆVüe ;H&9Dd&9üG&5ÒÌ ƒ.$Vü¥À´´€0dÄiœ5ÎUÿÿReference Toolkit Specification Hezel, UweIBM-Userþÿà…ŸòùOh«‘+'³Ù0xˆ¸ÄØäø  4 @ LX`hpä Reference Toolkit Specificationefe Hezel, Uweoeze Normal.doto IBM-Userto26-Microsoft Word 8.0p@†8”ÿú¿@nWÀ@†®¢ ßÁÒÌþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®L hp|„Œ” œ¤¬´ ¼ èäIBM. Ä1  Reference Toolkit Specification TitelÀ(T\h_PID_LINKBASE _PID_GUIDäAAN{45F1021A-D569-4C19-9741-64A99523C1DB} þÿÿÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQþÿÿÿSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«þÿÿÿ­®¯°±²³þÿÿÿµ¶·¸¹º»þÿÿÿýÿÿÿýÿÿÿ¿þÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF »Ÿ ßÁàn$´ ßÁÁ€Data ÿÿÿÿÿÿÿÿÿÿÿÿàd1TableÿÿÿÿÿÿÿÿR"²WordDocumentÿÿÿÿ8<SummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿ¬DocumentSummaryInformation8ÿÿÿÿÿÿÿÿ´CompObjÿÿÿÿjObjectPoolÿÿÿÿÿÿÿÿÿÿÿÿàn$´ ßÁàn$´ ßÁþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word-Dokument MSWordDocWord.Document.8ô9²qsyncevolution-1.5/src/synthesis/src/syncml_tk/doc/ReadmeMaintenance4_2.doc0000644000373300037200000032100012424517753030415 0ustar00nightlyallusers00000000000000ÐÏࡱá>þÿ ÌÎþÿÿÿÊËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥ÁE@ ø¿Ø!bjbjƒæƒæ 86áŒáŒ{UÿÿÿÿÿÿˆBBBB¶¶¶Ê===8J=f=4ÊÒÊì¦=¦=(Î=Î=Î=Š@Š@Š@QÊSÊSÊSÊSÊSÊSÊ$¾ÍRИwʶBAJ@J@@BABAwÊBBÎ=Î=|ŒÊBBBBAFBÎ=BRÎ=QÊBBAQÊBÀBÒB’®ÊB”"ÙÉ$Î=š= P„óƒ­‘Ã=ˆA(ÝÅþ%Ê,¢Ê0ÒÊÛÇþ¨Ð°A.¨ÐüýÉÊÊBBBB¨Ð¶ýÉ(Š@ž@B¬@ ¸@ŠŠ@Š@Š@wÊwÊÊÊd./ä ÞA4ÊÊ./SyncML Reference Toolkit Specification Release 4.2 October 13, 2003 READ ME Copyright Notice Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved. Implementation of all or part of any Specification may require licenses under third party intellectual property rights, including without limitation, patent rights (such a third party may or may not be a Supporter). The Sponsors of the Specification are not responsible and shall not be held responsible in any manner for identifying or failing to identify any or all such third party intellectual property rights. THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. The above notice and this paragraph must be included on all copies of this document that are made. File and Directory Structure The SyncML Reference Toolkit file tree is structured as shown in the following figure. Within syncml/src/sml the files of the toolkit itself are found. The transport handlers are stored in the directory syncml/src/xpt. Demos showing syncml at work will be organized within syncml/src/app. syncml ------ docs ----- internal ! !---- bin ------ win Binary files (like dlls) ! !---- src ------ sml ------ inc ------ win Public Headers ! ! ! ! ! !--- palm ! ! ! ! ! !--- mgr ------ inc SyncML Core (Manager) ! ! ! ! ! !--- all ! ! ! ! ! !--- win ! ! ! !--- wsm ------ inc SyncML Workspace ! ! ! ! !--- all ! ! !--- palm ! ! !--- win ! ! !--- linux ! ! !--- epoc ! ! ! !--- xlt ------ inc SyncML En-/Decoder ! ! ! ! ! !--- all ! ! ! ! ! !--- lib ------ inc SyncML Library Funct. ! ! ! !--- all ! !--- palm ! !--- win ! !--- linux ! !--- epoc ! !--- xpt -- !--- bindings Transport Handlers ! !--- manager Supported Platforms The SyncML Reference Toolkit has been implemented to be portable to as many hardware platforms and operating systems as possible. Nevertheless it is not possible to achieve an full platform independent code. The SyncML consortium therefore focusses on the following platforms: Windows 32 The deliverables target Windows 95 and NT 4.0 and comprise: Source Files. Several subdirectories named ../win hold files specific to the Windows target (e.g. syncml/src/sml/wsm/win). When compiling all these Windows-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../palm; ../epoc)! The source code was developed using the following development environments : Microsoft Visual Studio C++ IBM Visual C++ GCC Palm-OS The deliverables target Palm OS 3.5 to OS 5.0 and comprise: Source Files. Several subdirectories named ../palm hold files specific to the Palm target (e.g. syncml/src/sml/wsm/palm). When compiling all these Palm-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../win; ../epoc)! The source code was developed using the following development environments : Metrowerks GCC The Toolkit for Palm runs on Palm OS 3.1 too. Due to limitations of that version of the operating system, the size of the workspace is restricted to maximim 50kBytes. Not really recommended these days. LINUX To compile and run SyncML under a Linux Platform, the Win32 source code is used. Please follow the instructions in the README.linux file in the “src/bld” directory. Changes in the Maintenance 4.2 Release OBEX bugs fixed. Added MacOSX support. Added SSL support for PalmOS 5.0 (alpha) and PocketPC 2002. Updates for Linux. Memory change to allow you to not use the toolkit memory structure. Added support for SyncML 1.1.1. New API function smlStartMessageExt() with parameter to specify SyncML version.  SyncML Reference Toolkit Read Me  SAVEDATE \@ "yyyy-MM-dd" \* MERGEFORMAT 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.  SyncML Reference Toolkit Read Me  SAVEDATE \@ "yyyy-MM-dd" \* MERGEFORMAT 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.   'DEM]@AC`¾Ì+9q€‚•£Ìå&`(<=ScêüÔèøñâøÒÇ¿µÒ©©‘©©ƒµtµgµgµg\µgµgµghu#N6CJOJQJhu#N56CJOJQJhu#N<CJOJQJhu#Nhu#NB*CJOJQJphhu#NB*OJQJphhu#NB*OJQJphhu#NB*OJQJphhu#NCJOJQJhu#NOJQJhu#NCJOJQJhhu#N5B*CJOJQJphh“iè5CJ$mH nH sH u h“iè5CJ$ hu#N5CJ$!'EM^œÜ - m § è + i ¨ Ò Ó  Y ˜ Ù  [ ß % g òòòçåååååååååååååååååååååå $¤h1$7$8$H$ $¤€1$7$8$H$a${Ð!×!ýýýg ¤ å +m±ÜÝ!AC`‚¤®çñ{°Ñò>ýýýýýýýýýõÞÎõÃÃÃÃÃÃÃÃà d@ÿ1$7$8$H$ Æ&¤x¤x1$7$8$H$$ Æ@„°„Pþ¤ 1$7$8$H$^„°`„Pþ1$7$8$H$>jÉüdÃ÷*_“´ý)\}žêI}°å9ƒ¥ôôôôôôôôôôôôôôôôôôôôôôôôôôôô d@ÿ1$7$8$H$èéoÔêÿ  FRrx©¿Zj»éêñò.:Za¦>Mž¬Txy~#$%'CEOPöìßìÏ˽­Ë¨Ë Ë Ë Ë¨Ë½­ËœË¨Ë Ë Ë Ë¨Ë˜Ë½­Ë‘ÏËÏÏuhu#NB*OJQJphh“iè5B*CJOJQJph h“ièhu#Nh§%h‰MGhu#NOJQJ hu#N5hu#N5B*CJOJQJphhu#N5B*OJQJphhu#Nhu#N5B*CJOJQJphhu#N56CJOJQJhu#NCJOJQJhu#NCJOJQJ.¥ÒÓÔÕêÿ Fmn»×æêò.PQžôôôÝÝÕ¾Õ§ÕÕ§§§¾Õ§ÕÕ & F  Æh„h„˜þ1$7$8$H$^„h`„˜þ$ ÆÐ„°„Pþ¤ 1$7$8$H$^„°`„Pþ1$7$8$H$$ Æ@„°„Pþ¤ 1$7$8$H$^„°`„Pþ d@ÿ1$7$8$H$ž©­®y$&'OPaw³Æ èèààɾ²à£˜ŠŠŠŠŠ & F dð1$7$8$H$ dð1$7$8$H$$ Æ@¤ 1$7$8$H$ Æh1$7$8$H$ 1$7$8$H$gd“iè$ ÆÐ„°„Pþ¤ 1$7$8$H$^„°`„Pþ1$7$8$H$ & F  Æh„h„˜þ1$7$8$H$^„h`„˜þP`að  +y{|¡¢ËÌÖ×å £ ¤ ¥ ¦ Ë Ì õ ö !!!¹!Ð!Ñ!Ó!Ô!×!Ø!óçóÛóÛÌÛÄÀÄÀÄÀÄÀ±¬À¦ÀÄÀÄÀÄÀÄÀ±ÀœÀ’ÀÛjp2hu#NCJUjhu#NCJU hu#NCJ hu#Nhhu#NhmH nHsH tHuhu#Njhu#NUh‰MGh‰MGB*OJQJphh‰MGB*OJQJphhu#NB*OJQJphh“ièB*OJQJph$ {–ŸØÙ ¤ ¥ À É !!I!Î!Ï!Ð!Ò!Ó!Õ!Ö!×!Ø!îêêêèããèêêêèããèèèèèèèî$a$¤  & F dð1$7$8$H$gd‰MG6 00P P &P °‚. °ÆA!°8"°8#p$R%°°Þ°2p2Dd&& `+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1Dcnð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚p2Dd&& `+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1´2cnð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚eœH@ñÿHNormalOJQJ_HmHnHsH tH uj@òj Heading 1$ & F¤ð¤ @& Æ75B*CJ OJQJmH sH uR@òR Heading 2!$ & F¤ ¤@& Æ7@CJF@!òF Heading 3 & F@& Æ@ÐCJZ@1òZ Heading 4. & F ÆÐ`„Є0ý¤ð¤P@&^„Ð`„0ýF@F Heading 5¤<¤@& Æð5:@: Heading 6 @& Æ€:@: Heading 7 @& Æ:@: Heading 8 @& Æ : @: Heading 9 @& Æ0DA@òÿ¡D Default Paragraph FontVi@óÿ³V  Table Normal :V ö4Ö4Ö laö (k@ôÿÁ(No List NþOòN Body¤x¤x Æ&B*CJOJQJmH sH uBþOB 11 BodyText„¤Ü^„CJB @BFooter$d Æ9r OJQJ>@">Header Æ  ø%OJQJ>þO2> 22 BodyText„% ¤Ü^„% .@Q.TOC 1OJQJ^þOR^ Heading 1TOC! Æâ‘ „â„ý¤x^„â`„ý 5B*CJªþObª Bulleted - 1t & Fÿ„w„›þ¤Ü>ÆTÿe-ð^„w`„›þCJ¬þOr¬Numbered List 1t & Fÿ„w„›þ¤Ü>ÆT€e.^„w`„›þFþOq‚FNumbered List 2 „Š ^„Š CJ6@’6 Footnote Text¦þO¢¦ Bulleted - 2t & Fÿ„Š „›þ¤Ü>ÆTÿe-ð^„Š `„›þ>Á>TOC 2„‰„Xý^„‰`„XýOJQJ\þOÂ\ Heading 2TOC! Æ‹‘ „‹„Wý¤(^„‹`„WýB*CJ6á6TOC 3„Ý„­ü^„Ý`„­ü\þOâ\ Heading 3TOC! ÆÜ‘ „Ü„¯ü¤P^„Ü`„¯üB*CJDþOòDDocument Title¤€5CJ$DDTOC 4 Æ ‘ ‰‡ „  „<ü^„  `„<üXþOX Heading 4TOC! Æ¢ ‘ „¢ „:ü^„¢ `„:üB*CJ::TOC 5 "„ ^„  CJOJQJ::TOC 6 #„è^„è CJOJQJ::TOC 7 $„°^„° CJOJQJ::TOC 8 %„x^„x CJOJQJ::TOC 9 &„@^„@ CJOJQJ@Yr@ Document Map'-D OJQJJþO‚J CellBody (¤P¤PB*OJQJmH sH uTþO’T CellHeading )¤x¤x5B*OJQJmH sH uVþOòV Heading 02 *$¤h5B*CJOJQJmH sH uTþO²T Nonum Heading +1$¤x¤d5CJ$htH u0U@¢Á0 Hyperlink>*B*@V@¢Ñ@ FollowedHyperlink>*B* PþOâP Abstract .d,¤ðB*CJOJQJmH sH u¼þOò¼ Bulleted/ & Fÿ Æh„„åþ¤x>ÆTÿ·ð·······^„`„åþB*CJmH sH uRþOR BulletedCont0„¤P^„B*CJmH sH uRþOREquation1d¤È¤x Æ‘  B*OJ QJ BþO"B Figure 2¤x¤6B*mH sH uVþO2V Footnote3 Æä„ä„ÿ¤<^„ä`„ÿB*mH sH ubþOòb Heading 014$$¤ð¤@&d5B*CJ OJQJmH sH uL#LTable of Figures5„„pþ^„`„pþRþObR Numbered6 & F>¤x ÆB*CJmH sH u°þOr° Reference|7 & Fÿ Æ7„„åþ¤x>ÆT€[]^„`„åþB*CJRþO‚R SubTitle8$$d@a$5B*CJmH sH uNþOòN TableTitle9¤x ÆT6B*mH sH u,X@òÿ¡, Emphasis6>þOòÿ±> EquationVariables6>þOòÿÁ> ProgramCodeCJOJQJkH'.þOòÿÑ. SubscriptH*2þOòÿá2 SuperscriptH*4þOòÿñ4 SymbolCJOJQJkH*>þOòÿ> Underline>*CJOJQJkH'6"6Caption A¤x¤x6.)@¢!. Page NumberBþOñ2B DocumentOwnersC$a$CJDZ@BD Plain TextDOJQJmH sH udþObd Definition List E„h1$^„hCJOJQJhmH sH tH u`þOR` Definition Term F1$¤d¤dOJQJhmH sH tH uHþOñrH Editors NotesG6B*CJOJQJBþOñ‚B Code SnipetH¤x CJOJQJ^þO^ H1I$ & F1$¤ð¤d@&%5CJ(KH$OJQJhmH sH tH uZþOZ H2J$ & F1$¤d¤d@&!5CJ$OJQJhmH sH tH u0þOòÿ±0 Definition6TþOT H3L$1$¤d¤d@&!5CJOJQJhmH sH tH uTþOT H4M$1$¤d¤d@&!5CJOJQJhmH sH tH uPþOP H5N$1$¤d¤d@&5OJQJhmH sH tH uTþOT H6O$1$¤d¤d@&!5CJOJQJhmH sH tH uPþOP AddressP1$!6CJOJQJhmH sH tH ujþOj BlockquoteQ„h„h¤d¤d1$]„h^„hCJOJQJhmH sH tH u$þOòÿ!$ CITE6,þOòÿ1, CODE CJOJQJ8þOòÿA8 Keyboard5CJOJQJxþORx Preformatted+U1$ Æ# ¿~= ü»z9ø·!v%OJQJhmH sH tH un]@ñÿnz-Bottom of FormV$$d1$a$"<CJOJQJ_HhmH sH tH h\@ñÿh z-Top of FormW$&d1$a$"<CJOJQJ_HhmH sH tH ,þOòÿ, SampleOJQJ8þOòÿ‘8 Typewriter CJOJQJ,þOòÿ¡, Variable64þOòÿ±4 HTML Markup<B**þOòÿÁ* Comment<\þOâ\ Title1]$¤ð¤d1$a$!5CJ0OJQJhmH sH tH ubþOâb Subtitle1^$¤x¤d1$a$!5CJOJQJhmH sH tH uPþOòP RFC-P1_„°¤ð^„°CJOJQJmH sH tH uZþOZ Param$` & F¦„e„›þ¤P¤(1$^„e`„›þhmH sH tH uTþOT CODECompacta1$CJOJQJhmH sH tH u4þO14 Title Textb56þO26 00 BodyTextc¤Ü4þOB4Bullet 1 d & FØÿÿÿÿÿÿÿÿ ÿÿØ6ÿÿÿÿ'EM^œÜ-m§è+i¨ÒÓY˜Ù[ß%g¤å+m±ÜÝ!AC`‚¤®çñ{ ° Ñ ò > j É ü  d à ÷ * _ “ ´ ý ) \ } ž ê I}°å9ƒ¥ÒÓÔÕêÿ Fmn»×æêò.PQž©­®y$&'OPaw³Æ {–ŸØÙ¤¥ÀÉIÎÏÐÒÓÕÖÙ˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜˜0€€˜˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜˜0€€p˜0€€p˜0€€˜˜0€€˜˜0€€˜˜0€€p˜0€€p˜0€€˜˜0€€˜˜0€€ €˜0€€€˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€ €˜0€€p˜0€€p˜0€€p˜ !0€€p˜0€€p˜0€€p˜ !0€€˜ !0€€p˜ !0€€p˜0€€p˜0€€˜ !0€€˜˜0€€p˜0€€p˜ !0€€p˜ !0€€˜˜0€€p˜0€€˜0€€p˜0€€˜0€€˜0€€˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜˜@0€€ø€˜@0€€p˜@0€€p˜@0€€˜@0€€ø€˜@0€€p˜@0€€€˜@0€€ø€˜@0€€p˜@0€€p˜@0€€€˜@0€€ø€˜@0€€p˜@0€€€0`Ø0€€˜0€€˜0€€˜0€€€˜0€€€'EM^œÜ-m§è+i¨ÒÓY˜Ù[ß%g¤å+m±ÜÝ!AC`‚¤®çñ{ ° Ñ ò > j É ü  d à ÷ * _ “ ´ ý ) \ } ž ê I}°å9ƒ¥ÒÓÔÕêÿ Fmn»×æêò.PQž©­®y$&'OPaw³Æ Ùš0€€š0€€š0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€È˜0€€È˜0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€È˜0€€˜0€€˜0€€€˜0€€€˜0€€€˜ !0€€€š0€€š0€€š !0€€š !0€€€š !0€€€š0€€€š0€€€š !0€€€š0€€€š0€€€š !0€€€š !0€€€š0€€€š0€€€š0€€€˜0€€€˜0€€€˜0€€€˜0€€€˜0€€€¬:0i€¬:0i€¬:0i€¬:0i€¬:0i€š !0 €€€^^*ˆTWèPØ!g >¥ž Ø!×!&P[Pz…W4ÿ•€4ÿ•€ð@ð  @ñÿÿÿ€€€÷ð ððxð( ð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`T"ñ¿€ðð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`T"ñ¿€ðð ðð’ðð0ð( ð ððB ðS ð¿Ëÿ ?ð*W¸ÿÿÿòÿÿÿSýµ@¸ÿÿÿòÿÿÿSýµ@ÿÿãÁf¤Ý&4ÙDÙ8*€urn:schemas-microsoft-com:office:smarttags€date€ €10€13€2003€Day€Month€YearTx+z{ÏÐÖÙVy{ÏÐÙTxzzÙswxx{ÏÐÙÿÿ Lothar MerkMerkMerkMerkMerkMerk Thomas KleinIBM-UserIBM-UserPeter ThompsonüûÿÿÿÎÜÖ-ÿÿÿÿÿþÿÿÿÿÿÿÿÿÔhXíz@ÿºo:éÈuÿzS0à–ÀÿXlhdmÿÿÿÿÿÿÿÿÿ'5ÄáÚÞÿÿÿÿÿÿÿÿÿ¢M‹ ÿ1Í ÿB-6ïr-ÿµÚj?fÿ4 tj?fÿ$Ù ÿö[' ÿ†ld0à–Àÿ„m"0à–Àÿvj?fÿßhš6ïr-ÿÿÿÿÿÿÿÿÿZk¤V"ÙÿßQ±š…6$ÿt-j?fÿñI% ÿÿÿÿÿÿÿÿÿGB j?fÿ…'”  ÿ¹¨ ÞaÊ–ÿ›}þ šŠƒÿ»@I 0à–Àÿ$0< 0à–Àÿo j?fÿŒ@  ÿ ¾  ÿà:.j?fÿO{Qj?fÿÿÿÿÿÿÿÿÿ¯F‰0à–ÀÿÀdÚ ÿVVU ÿ@I P´ eÿ`ç ò\ÿºY ÿ:ksP´ eÿêN†ÿzh ~`V÷ÿÿÿÿÿÿÿÿÿ¿Al0à–ÀÿtQcÿRùV"ÙÿTrròz ­ÿ?ÎfØFÿÿÿÿÿÿÿÿÿ ˆ ÿü=êj?fÿ‘,WXÊÿOuðj?fÿ3v䆸ŸÿÿÿÿÿÿÿÿÿîXjj?fÿ­IXÊÿ™öÄáÚÞÿÊ• ÿÁi³ ÿOË0à–Àÿ’ý$h"—ÿÿÿÿÿÿÿÿÿ _Ej?fÿàN˜éÈuÿÿÿÿÿÿÿÿÿK» ÿ®T0à–Àÿ/9[0à–ÀÿC_‡ ÿ‰bÞj?fÿL{0à–Àÿ·PÔj?fÿKL8 6ïr-ÿÑÆ j?fÿxcÈ 0à–ÀÿÙï šŠƒÿ±T!0à–Àÿœ¦!šŠƒÿaU¶" ÿêv·"$h"—ÿÿÿÿÿÿÿÿÿ•mØ" ÿ+K#j?fÿ½m$¶k@rÿIÿÿÿÿÿÿÿ_P‰$0à–Àÿ FÜ$اÔÿÿÿÿÿÿÿÿÿ‚l%0à–Àÿ©>@% ÿJVX%x,µÿ n&j?fÿL«' ÿ¾E¤)4-¢ ÿï)0à–Àÿ{k* ÿ r*j?fÿÿÿÿÿÿÿÿÿPCs*j?fÿÓH +ÿ7 ..žŒ6•"o.ÄáÚÞÿPi‘0øˆ-`d<ç0 ÿb;¡1ÄáÚÞÿ^G¨1V"Ùÿþ1Ã10à–Àÿßê10à–ÀÿÙ$2j?fÿd*Ž20à–Àÿ@Ÿ2ÄáÚÞÿrA°2䆸Ÿÿ2.3 ÿ¤FP3P´ eÿ$F50à–ÀÿÙ*7ÄáÚÞÿ”2§7j?fÿÿÿÿÿÿÿÿÿéMA8éÈuÿp(þ8 ÿ@ Ö9täŽýÿ¥}: ÿïcš:ì=.ÿÈFÅ:0à–Àÿ­ ;V"Ùÿ‘q};FîNÿ§-­;j?fÿ‰‰j?fÿŽ3™>éÈuÿÿÿÿÿÿÿÿÿçA7@j?fÿ®?l@j?fÿÊÅ@ E^xÿÿÿÿÿÿÿÿÿZæA ÿãUóAj?fÿ÷ùB0à–ÀÿuqCj?fÿF_C$h"—ÿÏC ÿã)DP´ eÿdKEj?fÿ.E ÿGuXE0à–Àÿ5t€Ej?fÿ{‡E0à–Àÿâ—EÄáÚÞÿÿÿÿÿÿÿÿÿp«EÄáÚÞÿÿÿÿÿÿÿÿÿŽx¸E ÿäE0à–Àÿ:¤F ÿ· ¦FV"ÙÿqJ«F4-¢ ÿtMG0à–Àÿt?Gj?fÿÛqBGj?fÿf»G ÿ–)Hj?fÿTVHØ"Žgÿÿÿÿÿÿÿÿÿ 6pH4-¢ ÿB›HÀDâŒÿÿÿÿÿÿÿÿÿGÁHÿ.PbJ ÿÐ{­KÄáÚÞÿÿÿÿÿÿÿÿÿIN™LÄáÚÞÿÿÿÿÿÿÿÿÿb-³Lÿðk‘Mj?fÿs#ºM ÿ#tÑN0à–Àÿ„$‡OXÊÿ>PšŠƒÿƒt¡PV"Ùÿ§!FQj?fÿ¡0ËQéÈuÿÃLôQ ÿÓT ÿ´g^Tj?fÿ`•Tt(øxÿ^F»TP´ eÿh ØU ÿc{V ÿx-^V0à–ÀÿõeWTñ–ÿr»WšŠƒÿv\YŠ Iÿs˜Y ÿj:šYéÈuÿÿÿÿÿÿÿÿÿÛp¦Y ÿúSC[j?fÿŒ&H[ ÿÕ=j[šŠƒÿ¹Hˆ[ÄáÚÞÿÿÿÿÿÿÿÿÿ}¤[ÄáÚÞÿ+%?\Xíz@d9+]$h"—ÿÿÿÿÿÿÿÿÿT"í] ÿí57^ÄáÚÞÿ·U•^0à–Àÿ0K_0à–Àÿ~`j?fÿ`Gû`؉¨Àÿÿÿÿÿÿÿÿÿ"AaìzÐeÿ_[`bP´ eÿ~c¬é„mÿÿÿÿÿÿÿÿÿ+ ‘cˆnªÚÿÿÿÿÿÿÿÿÿ`&d0à–ÀÿÜh‡d0à–ÀÿVDŠdj?fÿÇm½dØybzÿ³5ÿe0à–ÀÿaJƒgÄáÚÞÿÿÿÿÿÿÿÿÿo 5h0à–ÀÿÎ#Öh ÿÓøiÿVRekÄáÚÞÿÿÿÿÿÿÿÿÿøt5lÄáÚÞÿÿÿÿÿÿÿÿÿv2ÐlÄáÚÞÿÿÿÿÿÿÿÿÿmÄáÚÞÿÿÿÿÿÿÿÿÿ [ynÄáÚÞÿ=xòn ÿ?4®oÿ³oÿ8>Rp ÿ$rÄáÚÞÿŽyLsj?fÿlt6ïr-ÿÿÿÿÿÿÿÿÿ×8¥tüÆ®|ÿÿÿÿÿÿÿÿÿHqªtÿ8+•uP´ eÿà[–uÿ“*©u$h"—ÿÿÿÿÿÿÿÿÿgYÂu ÿÇa)vP´ eÿÇ|$w¾ú ÿA3wj?fÿ,®w0à–Àÿ×:ExÄáÚÞÿÿÿÿÿÿÿÿÿ<=Ûx ÿºgßx6ïr-ÿÿÿÿÿÿÿÿÿö yÿÚd/yj?fÿpioyj?fÿCooyj?fÿÍ|zz´:B7ÿÿÿÿÿÿÿÿÿ†{ ÿ›t´{ÿÿÿÿÿÿÿÿÿÿÿÿÿ 4Ð{6<½ÿSï{j?fÿÝI'|$h"—ÿÿÿÿÿÿÿÿÿ^Š|j?fÿH)õ| ÿ’A}0à–Àÿ+2}ÄáÚÞÿÿÿÿÿÿÿÿÿ`}ÄáÚÞÿhMÆ~j?fÿ%8î~0à–Àÿl^0à–ÀÿÚP›}þ KL8 r»WÙï †ld»@I GuXE$F5ï)$0< ,®w³5ÿe¯F‰zSéMA8ºo:¿Al±T!x-^V%8î~d*Ž2’A}„m"#tÑN‘q};äE‚l%l^þ1Ã1Üh‡dtMGßê1xcÈ ®T_P‰$7 .0K_ÈFÅ:OËo 5h·U•^{‡E`&d÷ùBL{/9[TrrúSC[~`–)H _E§!FQdKE§-­;´g^TîXjÑÆ Cooy‰bÞ8 ÙvPCs*Úd/y5t€E®?l@pioyhMÆ~ŽyLs^Š|‰‰<Sï{ÚOuð n&4 tü=ê·PÔÇm½d¢M‹Óøi¹¨ à[–uHqªt?4®oÓH +ö y³o…'” ÃLôQþÿÿÿ”šþÿÿÿèšþÿÿÿL›Ž3™>aJƒgêv·"9+]VRek“*©u’ý'5ÝI'|+2}¹Hˆ[O{Qv2ÐlÐ{­K×:Exøt5l r*â—Ep«EmIN™L”2§7ºgßxßhšltj:šYàN˜Ûp¦Ys#ºM$Ùp(þ8+K#H)õ|Ç|$wþÿÿÿ°› ˆ¥}:™öh ØU†{gYÂu ¾ Ù*7$rPi‘0í57^ºY`} [yn@Ÿ2þÿÿÿœ•"o.b;¡1}¤[<=Ûx`Gû`B-`ç•mØ"Žx¸EçA7@GB {k*t?Gc{VÎ#ÖhÏCA3wÁi³8+•uVVUVDŠdo Ù$2K»µÚÊ•"AauqCðk‘MÛqBGT"í]L«'8>Rp.PbJF_Cþÿÿÿxœ©>@%ZæAs˜YaU¶"7 .àœŒ@ ö['ÀdÚ_[`bìœ.E‹6¢TuF=`•TJVX%JVX%øœv\Yïcš: 4Ð{@I ­I„$‡O‘,W@ Ö9RùqJ«F¾E¤) 6pHRù­ ;Zk¤^G¨1ƒt¡PÚGè· ¦FÇa)v¤FP3^F»Tã)D:ks"Aat-ÓTõeWõeWßQ±ßQ±(d<ç0b-³LtQcêN†GÁH2.3+ ‘c+%?\3vrA°2Ôhþÿÿÿþÿÿÿ4ÿþ×8¥tÿÿÿÿÿÿÿÿp™` ˆ@e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔ™`m@h „Є˜þ^„Ð`„˜þOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8š`l@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ š Ê@CJ$OJ QJ o(" ÿÿÿÿôš @e „Š „›þ^„Š `„›þOJ QJ o(·ðÿÿÿÿX›`c@e „Š „›þ^„Š `„›þOJ QJ o(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼› @e „w„›þ^„w`„›þOJ QJ o(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ œ @e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„œ s@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ @h„„^„`„OJQJ^Jo(·ðÿÿÿÿÿÿüÿÿü    å‰MGu#N§%“ièÄ{ÏÐÙÿ@€xx¤oxxØ`@ÿÿUnknownÿÿÿÿÿÿÿÿÿÿÿÿ G‡z €ÿTimes New Roman5€Symbol3& ‡z €ÿArial?Courier Neu?5 ‡z €ÿCourier New71 Courier=" HelvArial;" Helvetica5& ‡za€ÿTahoma3Times;€Wingdings]& Rotis Sans Serif for Nokia"ˆVüe ;H&Žjz&9üG&Dú ƒ*ú *$Vü¥À´´€4dppiœ5Î2ƒQVüßßHðÿ?äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ièÿÿReference Toolkit Specification Hezel, UwePeter Thompsonüü                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û þÿà…ŸòùOh«‘+'³Ù0˜ÀÌàì $ @ L X dpx€ˆä Reference Toolkit Specificationefe Hezel, Uweoeze Normal.dotoPeter Thompsoni28eMicrosoft Word 10.0@˜Þ @. Kû¿@®Uñ¢À@¼žd­‘ÃúþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®L hp|„Œ” œ¤¬´ ¼ èäIBM* p­  Reference Toolkit Specification TitleP :B_PID_LINKBASEäA þÿÿÿ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNþÿÿÿPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹þÿÿÿ»¼½¾¿ÀÁþÿÿÿÃÄÅÆÇÈÉþÿÿÿýÿÿÿýÿÿÿÍþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFû„­‘ÃÏ€Data ÿÿÿÿÿÿÿÿÿÿÿÿàd1TableÿÿÿÿO¤ÔWordDocumentÿÿÿÿ86SummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿºDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÂCompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qsyncevolution-1.5/src/synthesis/src/syncml_tk/doc/ReadmeMaintenance4_3.doc0000644000373300037200000033600012424517753030424 0ustar00nightlyallusers00000000000000ÐÏࡱá>þÿ ÙÛþÿÿÿרÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥ÁE@ ø¿Ð,bjbjƒæƒæ 8HáŒáŒs"UÿÿÿÿÿÿˆBBBB¶¶¶Ê’E’E’E8ÊE$îEDʸÓì>F>F(fFfFfF"I"I"I7Ó9Ó9Ó9Ó9Ó9Ó9Ó$¤ÖRöؘ]Ó¶ÚIâHâH@ÚIÚI]ÓBBfFfF|rÓ¼J¼J¼JÚI^BfFBRfF7Ó¼JÚI7Ó¼JÀ¼J|K’½¶ÊB”"ƒÒ$fF2F PNC¨œÃ’E8J‡ÎþÛÒ\ˆÓ0¸Ó…ÐþŽÙTJLŽÙü§ÒÊÊBBBBŽÙ¶§Ò4"I6I¼JDI PIŠ"I"I"I]Ó]ÓÊÊä®3ä JÊÊ®3SyncML Reference Toolkit Specification Release 4.3 October 27, 2003 READ ME Copyright Notice Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved. Implementation of all or part of any Specification may require licenses under third party intellectual property rights, including without limitation, patent rights (such a third party may or may not be a Supporter). The Sponsors of the Specification are not responsible and shall not be held responsible in any manner for identifying or failing to identify any or all such third party intellectual property rights. THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. The above notice and this paragraph must be included on all copies of this document that are made. File and Directory Structure The SyncML Reference Toolkit file tree is structured as shown in the following figure. Within syncml/src/sml the files of the toolkit itself are found. The transport handlers are stored in the directory syncml/src/xpt. Demos showing syncml at work will be organized within syncml/src/app. syncml ------ docs ----- internal ! !---- bin ------ win Binary files (like dlls) ! !---- src ------ sml ------ inc ------ win Public Headers ! ! ! ! ! !--- palm ! ! ! !--- mgr ------ inc SyncML Core (Manager) ! ! ! ! ! !--- all ! ! !--- win ! ! ! !--- wsm ------ inc SyncML Workspace ! ! ! ! ! !--- all ! ! !--- palm ! ! !--- win ! ! !--- linux ! ! !--- epoc ! ! ! !--- xlt ------ inc SyncML En-/Decoder ! ! ! ! ! !--- all ! ! ! !--- lib ------ inc SyncML Library Funct. ! ! ! !--- all ! !--- win ! !--- xpt -- !--- bindings Transport Handlers ! !--- common ! !--- all ! !--- linux ! !--- macosx ! !--- palm ! !--- tcp ! ! !--- all ! ! !--- linux ! ! !--- macosx ! ! !--- palm ! ! !--- win ! !--- win !--- http ! !--- all ! !--- linux ! !--- macosx ! !--- palm ! !--- win !--- obex ! !--- palm ! !--- smlobex ! !--- win !--- wsp !--- all !--- awsp !--- inc !--- palm !--- win Supported Platforms The SyncML Reference Toolkit has been implemented to be portable to as many hardware platforms and operating systems as possible. Nevertheless it is not possible to achieve an full platform independent code. The SyncML consortium therefore focusses on the following platforms: Windows 32 The deliverables target Windows 95 and NT 4.0 and comprise: Source Files. Several subdirectories named ../win hold files specific to the Windows target (e.g. syncml/src/sml/wsm/win). When compiling all these Windows-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../palm; ../epoc)! The source code was developed using the following development environments : Microsoft Visual Studio C++ IBM Visual C++ GCC Palm-OS The deliverables target Palm OS 3.5 to OS 5.0 and comprise: Source Files. Several subdirectories named ../palm hold files specific to the Palm target (e.g. syncml/src/sml/wsm/palm). When compiling all these Palm-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../win; ../epoc)! The source code was developed using the following development environments : Metrowerks GCC The Toolkit for Palm runs on Palm OS 3.1 too. Due to limitations of that version of the operating system, the size of the workspace is restricted to maximim 50kBytes. Not really recommended these days. LINUX To compile and run SyncML under a Linux Platform, the Win32 source code is used. Please follow the instructions in the README.linux file in the “src/bld” directory. Changes in the Maintenance 4.3 Release Fixed win .def files to work with NOWSM flag. Added extra #ifdefs to work with the NOWSM flag. Removed extra copy of the syncml_tk_prefix.h file. Fixed the problem – should apply to other similar flags. Changes in the Maintenance 4.2 Release OBEX bugs fixed. Added MacOSX support. Added SSL support for PalmOS 5.0 (alpha) and PocketPC 2002. Updates for Linux. Memory change to allow you to not use the toolkit memory structure. Added support for SyncML 1.1.1. New API function smlStartMessageExt() with parameter to specify SyncML version. Changes in the Maintenance 4 Release Obex transport binding was fixed to work properly with the XPT communication API. Sofar it’s only tested on Win32 systems running Windows 2000 (OBEX / IR and OBEX / TCP/IP) Implementing several DTD changes to support device management Implementing new extension for “Progress Information” usind a new tag “NumberOfChanges” Implementing new extension for “Large Object Handling” using a new flag MoreData for Item-Tags Implementing new extension for “Large Object Handling”, new API to calculate remaining space for data after setting up the tag-structure skeleton Implementing new extension to transport toolkit to support cryptographic security against manipulation during transport, new header field “x-syncml-hmac” (HTTP and OBEX only, not WSP) Bug fix for an Microsoft IIS-Hack in HTTP transport binding Bug fix for a minor bug causing the HTTP transport binding toolkit part to crash if message type string is longer than allowed 4.1: Declarating function ltoa() in linux-special file src/xpt/bindings/http/linux/xptihttp.h 4.1: Adding support for ‘SupportLargeObjs' and 'SupportNumberOfChanges' tags in device information dtd  SyncML Reference Toolkit Read Me  SAVEDATE \@ "yyyy-MM-dd" \* MERGEFORMAT 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.  SyncML Reference Toolkit Read Me  SAVEDATE \@ "yyyy-MM-dd" \* MERGEFORMAT 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.   '>DEM]@AB_½Ë*8p~€”¢Ëä%_aøñêÛøËÀ¸®Ë¢–¢Š¢–¢|x®m®`®`®`U®`®hu#N6CJOJQJhu#N56CJOJQJhu#N<CJOJQJhu#Nhu#NB*CJOJQJphhu#NB*OJQJphhu#NB*OJQJphhu#NB*OJQJphhu#NCJOJQJhu#NOJQJhu#NCJOJQJhhu#N5B*CJOJQJphh“iè5CJ$mH nH sH u h“iè5CJ$ hóU°5CJ$ hu#N5CJ$'EM^œÜ - m § è + i ¨ Ò Ó  Y ˜ Ù  [ ß % g òòòçåååååååååååååååååååååå $¤h1$7$8$H$ $¤€1$7$8$H$a$s*È,Ï,ýýýg ¤ å +m±ÜÝ!A_€£­æðz¯ÐH{®ÏýýýýýýýýýòâÚÏÏÏÏÏÏÏÏÏÏÏÏ d@ÿ1$7$8$H$1$7$8$H$ Æ&¤x¤x1$7$8$H$ 1$7$8$H$gd CeÏBu©ÜEf¯Û/{§Ú -w£ÙQËHôôôôôôôôôôôôôôôôôôææææææææ d@ÿ1$7$8$H$gdN7 d@ÿ1$7$8$H$abœ®eyzcuw9:tu°±ëì'(8Mblm©µÕÛ "½Í L M T U x ‚ ‘ ½ Ä ò !¡!°!""·"Û"Ü"öìßìßÕìßìöËöËöËöËöËö»·©™·”·Œ·Œ·Œ·”·©™·ˆ·”·Œ·Œ·Œ·”·„·h§%h‰MGhu#NOJQJ hu#N5hu#N5B*CJOJQJphhu#N5B*OJQJphhu#Nhu#N5B*CJOJQJphh CeCJOJQJhu#NCJOJQJhu#N56CJOJQJhu#NCJOJQJhN7CJOJQJ4HŒÑV‘Å={·ò&b¡ÜJ†Áý8MbñññññññññññññññññññññÚÒ1$7$8$H$$ Æ@„°„Pþ¤ 1$7$8$H$^„°`„Pþ d@ÿ1$7$8$H$gdN7bm©ÐÑ : I M U ‘ ³!´!" """Ü"â"‡#‰#èàÉààÉÉÉèàÉààÉÉààè¾² Æh1$7$8$H$ 1$7$8$H$gd“iè & F  Æh„h„˜þ1$7$8$H$^„h`„˜þ1$7$8$H$$ ÆÐ„°„Pþ¤ 1$7$8$H$^„°`„PþÜ"á"â"†#‡#ˆ#Š#²#Š$¦$¨$²$³$Ã$Ä$S%l%m%Ž%Ü%Þ%&$*q*s*t*™*š*Ã*òâÞ×ÇÞ·«Ç›Çƒƒwƒwhw·«Q«IÞIÞjhu#NU-hóU°B*OJQJhmHnHphsHtHuh‰MGh‰MGB*OJQJphh‰MGB*OJQJphh“ièB*OJQJphhu#NB*OJQJphh“iè5B*CJOJQJphhóU°B*OJQJphhóU°5B*CJOJQJphhu#N5B*CJOJQJph h“ièhu#Nhu#Nhu#N5B*CJOJQJphhu#N5B*OJQJph‰#Š#²#³#á#$E$Š$²$³$Ä$Ú$%)%m%Þ%&÷å×ÆÆÆÆ·¬žžžžžå & F dð1$7$8$H$gd‰MG & F dð1$7$8$H$ dð1$7$8$H$$ Æ@¤ 1$7$8$H$ & F dð1$7$8$H$gdóU° dð1$7$8$H$gdóU°$ Æ@¤ 1$7$8$H$gdóU°1$7$8$H$&&²&ð&H'§'9(ñ(-)¬) *r*s*Ž*—*Ð*Ñ*+œ++¸+Á+ú+û+A,ñààààààààààñÜÜÜÚÕÕÚÜÜÜÚÕ$a$¤  & F dð1$7$8$H$gdóU° dð1$7$8$H$gdóU°Ã*Ä*Î*Ï*Ý*+‡+›+œ++ž+Ã+Ä+í+î+ø+ù+,±,Ç,È,É,Ë,Ì,Ï,Ð,÷ó÷óäßóÙó÷ó÷ó÷ó÷óäóÕËóÁóµhóU°B*OJQJphjp2hu#NCJUjhu#NCJUh Ce hu#NCJ hu#Nhhu#NhmH nHsH tHuhu#Njhu#NUA,Æ,Ç,È,Ê,Ë,Í,Î,Ï,Ð,úøøøøøøøê dð1$7$8$H$gdóU°$a$ 6 00P P &P °‚. °ÆA!°8"°8#p$R%°°Þ°2p2Dd&& `+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1Dcnð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚p2Dd&& `+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1´2cnð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚eœH@ñÿHNormalOJQJ_HmHnHsH tH uj@òj Heading 1$ & F¤ð¤ @& Æ75B*CJ OJQJmH sH uR@òR Heading 2!$ & F¤ ¤@& Æ7@CJF@!òF Heading 3 & F@& Æ@ÐCJZ@1òZ Heading 4. & F ÆÐ`„Є0ý¤ð¤P@&^„Ð`„0ýF@F Heading 5¤<¤@& Æð5:@: Heading 6 @& Æ€:@: Heading 7 @& Æ:@: Heading 8 @& Æ : @: Heading 9 @& Æ0DA@òÿ¡D Default Paragraph FontVi@óÿ³V  Table Normal :V ö4Ö4Ö laö (k@ôÿÁ(No List NþOòN Body¤x¤x Æ&B*CJOJQJmH sH uBþOB 11 BodyText„¤Ü^„CJB @BFooter$d Æ9r OJQJ>@">Header Æ  ø%OJQJ>þO2> 22 BodyText„% ¤Ü^„% .@Q.TOC 1OJQJ^þOR^ Heading 1TOC! Æâ‘ „â„ý¤x^„â`„ý 5B*CJªþObª Bulleted - 1t & Fÿ„w„›þ¤Ü>ÆTÿe-ð^„w`„›þCJ¬þOr¬Numbered List 1t & Fÿ„w„›þ¤Ü>ÆT€e.^„w`„›þFþOq‚FNumbered List 2 „Š ^„Š CJ6@’6 Footnote Text¦þO¢¦ Bulleted - 2t & Fÿ„Š „›þ¤Ü>ÆTÿe-ð^„Š `„›þ>Á>TOC 2„‰„Xý^„‰`„XýOJQJ\þOÂ\ Heading 2TOC! Æ‹‘ „‹„Wý¤(^„‹`„WýB*CJ6á6TOC 3„Ý„­ü^„Ý`„­ü\þOâ\ Heading 3TOC! ÆÜ‘ „Ü„¯ü¤P^„Ü`„¯üB*CJDþOòDDocument Title¤€5CJ$DDTOC 4 Æ ‘ ‰‡ „  „<ü^„  `„<üXþOX Heading 4TOC! Æ¢ ‘ „¢ „:ü^„¢ `„:üB*CJ::TOC 5 "„ ^„  CJOJQJ::TOC 6 #„è^„è CJOJQJ::TOC 7 $„°^„° CJOJQJ::TOC 8 %„x^„x CJOJQJ::TOC 9 &„@^„@ CJOJQJ@Yr@ Document Map'-D OJQJJþO‚J CellBody (¤P¤PB*OJQJmH sH uTþO’T CellHeading )¤x¤x5B*OJQJmH sH uVþOòV Heading 02 *$¤h5B*CJOJQJmH sH uTþO²T Nonum Heading +1$¤x¤d5CJ$htH u0U@¢Á0 Hyperlink>*B*@V@¢Ñ@ FollowedHyperlink>*B* PþOâP Abstract .d,¤ðB*CJOJQJmH sH u¼þOò¼ Bulleted/ & Fÿ Æh„„åþ¤x>ÆTÿ·ð·······^„`„åþB*CJmH sH uRþOR BulletedCont0„¤P^„B*CJmH sH uRþOREquation1d¤È¤x Æ‘  B*OJ QJ BþO"B Figure 2¤x¤6B*mH sH uVþO2V Footnote3 Æä„ä„ÿ¤<^„ä`„ÿB*mH sH ubþOòb Heading 014$$¤ð¤@&d5B*CJ OJQJmH sH uL#LTable of Figures5„„pþ^„`„pþRþObR Numbered6 & F>¤x ÆB*CJmH sH u°þOr° Reference|7 & Fÿ Æ7„„åþ¤x>ÆT€[]^„`„åþB*CJRþO‚R SubTitle8$$d@a$5B*CJmH sH uNþOòN TableTitle9¤x ÆT6B*mH sH u,X@òÿ¡, Emphasis6>þOòÿ±> EquationVariables6>þOòÿÁ> ProgramCodeCJOJQJkH'.þOòÿÑ. SubscriptH*2þOòÿá2 SuperscriptH*4þOòÿñ4 SymbolCJOJQJkH*>þOòÿ> Underline>*CJOJQJkH'6"6Caption A¤x¤x6.)@¢!. Page NumberBþOñ2B DocumentOwnersC$a$CJDZ@BD Plain TextDOJQJmH sH udþObd Definition List E„h1$^„hCJOJQJhmH sH tH u`þOR` Definition Term F1$¤d¤dOJQJhmH sH tH uHþOñrH Editors NotesG6B*CJOJQJBþOñ‚B Code SnipetH¤x CJOJQJ^þO^ H1I$ & F1$¤ð¤d@&%5CJ(KH$OJQJhmH sH tH uZþOZ H2J$ & F1$¤d¤d@&!5CJ$OJQJhmH sH tH u0þOòÿ±0 Definition6TþOT H3L$1$¤d¤d@&!5CJOJQJhmH sH tH uTþOT H4M$1$¤d¤d@&!5CJOJQJhmH sH tH uPþOP H5N$1$¤d¤d@&5OJQJhmH sH tH uTþOT H6O$1$¤d¤d@&!5CJOJQJhmH sH tH uPþOP AddressP1$!6CJOJQJhmH sH tH ujþOj BlockquoteQ„h„h¤d¤d1$]„h^„hCJOJQJhmH sH tH u$þOòÿ!$ CITE6,þOòÿ1, CODE CJOJQJ8þOòÿA8 Keyboard5CJOJQJxþORx Preformatted+U1$ Æ# ¿~= ü»z9ø·!v%OJQJhmH sH tH un]@ñÿnz-Bottom of FormV$$d1$a$"<CJOJQJ_HhmH sH tH h\@ñÿh z-Top of FormW$&d1$a$"<CJOJQJ_HhmH sH tH ,þOòÿ, SampleOJQJ8þOòÿ‘8 Typewriter CJOJQJ,þOòÿ¡, Variable64þOòÿ±4 HTML Markup<B**þOòÿÁ* Comment<\þOâ\ Title1]$¤ð¤d1$a$!5CJ0OJQJhmH sH tH ubþOâb Subtitle1^$¤x¤d1$a$!5CJOJQJhmH sH tH uPþOòP RFC-P1_„°¤ð^„°CJOJQJmH sH tH uZþOZ Param$` & F¦„e„›þ¤P¤(1$^„e`„›þhmH sH tH uTþOT CODECompacta1$CJOJQJhmH sH tH u4þO14 Title Textb56þO26 00 BodyTextc¤Ü4þOB4Bullet 1 d & FÐ$ÿÿÿÿÿÿÿÿ ÿÿÐ$Hÿÿÿÿ'EM^œÜ-m§è+i¨ÒÓY˜Ù[ß%g¤å+m±ÜÝ!A_€£­æðz ¯ Ð  H { ® Ï  B u © Ü  E f ¯ Û  / { § Ú -w£ÙQËHŒÑV‘Å={·ò&b¡ÜJ†Áý8Mbm©ÐÑ:IMU‘³´ Üâ‡‰Š²³áEв³ÄÚ)mÞ²ðH§9 ñ -!¬! "r"s"Ž"—"Ð"Ñ"#œ##¸#Á#ú#û#A$Æ$Ç$È$Ê$Ë$Í$Î$Ñ$˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€˜˜0€€˜0€€p˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€ €˜0€€ €˜0€€ €˜0€€€˜0€€ €˜0€€€˜0€€ €˜0€€ €˜0€€˜0€€€˜0€€ €˜0€€˜˜0€€ €˜0€€€˜0€€(€˜0€€ €˜0€€ €˜0€€˜˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€˜0€€p˜0€€˜0€€p˜0€€˜0€€˜˜0€€˜0€€˜˜0€€˜0€€˜˜0€€˜0€€˜˜0€€˜0€€˜˜0€€˜0€€˜˜0€€˜0€€˜0€€ €˜0€€˜0€€ €˜0€€˜˜0€€˜0€€ €˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜˜0€€˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€ €˜0€€˜˜@0€€˜@0€€˜@0€€˜˜0€€˜˜0€€p˜0€€ €˜0€€Ð˜0€€p˜0€€p˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜ !0€€p˜0€€p˜0€€p˜ !0€€˜ !0€€p˜ !0€€p˜0€€p˜0€€p˜ !0€€p˜0€€˜0€€p˜ !0€€˜ !0€€p˜0€€p˜0€€˜0€€˜0€€˜0€€˜˜0€€p˜0€€p˜0€€p˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜0€€p˜0€€p˜ !0€€˜ !0€€p˜ !0€€p˜ !0€€˜ !0€€p˜ !0€€p˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜˜ !0€€p˜ !0€€˜˜ !0€€p˜ !0€€˜ !0€€˜˜ !0€€p˜0€€p˜@0€€ø€˜@0€€˜@0€€˜@0€€˜@0€€ø€˜@0€€˜@0€€€˜@0€€ø€˜@0€€˜@0€€˜@0€€€˜@0€€ø€˜@0€€˜@0€€€0PÛú˜0€€˜0€€˜0€€˜0€€€˜0€€$'EM^œÜ-m§è+i¨ÒÓY˜Ù[ß%g¤å+m±ÜÝ!A_€£­æðz ¯ Ð  H { ® Ï  B u © Ü  E f ¯ Û  / { § Ú -w£ÙQËHŒÑV‘Å={·ò&b¡ÜJ†Áý8Mbm©ÐÑ:IMU‘³´ Üâ‡‰Š²³Š²³ÄÚ)m²ðH§9 ñ -!¬! "r"Ñ$š0€€š0€€š0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš@0€€Èš0€€š0€€€š0€€€š0€€€š !0€€€š0€€š0€€š !0€€š !0€€€š !0€€€š0€€€š0€€€š !0€€€š0€€€š0€€€š !0€€€š !0€€€š0€€€š0€€€š0€€€š0€€€š0€€€š0€€€š@0€€€š@0€€€®z0i0€š0€€€š0€€€®:0i0€®:0i0€®:0i0€®:0i0€®:0i0€®z00€®z00€®z00€®z00€®z00€®z00€®z00€®z00€®z00€®z00€®z00€®z00€š !0 €€€^^*ˆTWaÜ"Ã*Ð,"g ÏHb‰#&A,Ð, !#Ï,&P[Pz…W4ÿ•€4ÿ•€ð@ð  @ñÿÿÿ€€€÷ð ððxð( ð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`T"ñ¿€ðð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`T"ñ¿€ðð ðð’ðð0ð( ð ððB ðS ð¿Ëÿ ?ð*W¸ÿÿÿòÿÿÿSýµ@¸ÿÿÿòÿÿÿSýµ@ÿÿ+di|d(4Ñ$DÑ$8*€urn:schemas-microsoft-com:office:smarttags€date€ €10€2003€27€Day€Month€YearBB¯ ¯   ™ 8s"Ç$È$Î$Ñ$s"Ç$È$Ñ$BB¯ ¯   ™ 8r"Ñ$s"Ç$È$Ñ$ÿÿ Lothar MerkMerkMerkMerkMerkMerk Thomas KleinIBM-UserIBM-UserPeter ThompsonüûÿÿÿÎÜÖ-ÿÿÿÿÿþÿÿÿÿÿÿÿÿÔhXíz@ÿºo:éÈuÿzS0à–ÀÿXlhdmÿÿÿÿÿÿÿÿÿ'5ÄáÚÞÿÿÿÿÿÿÿÿÿ¢M‹ ÿ1Í ÿB-6ïr-ÿµÚj?fÿ4 tj?fÿ$Ù ÿö[' ÿ†ld0à–Àÿ„m"0à–Àÿvj?fÿßhš6ïr-ÿÿÿÿÿÿÿÿÿZk¤V"ÙÿßQ±š…6$ÿt-j?fÿñI% ÿÿÿÿÿÿÿÿÿGB j?fÿ…'”  ÿ¹¨ ÞaÊ–ÿ›}þ šŠƒÿ»@I 0à–Àÿ$0< 0à–Àÿo j?fÿŒ@  ÿ ¾  ÿà:.j?fÿO{Qj?fÿÿÿÿÿÿÿÿÿ¯F‰0à–ÀÿÀdÚ ÿVVU ÿ@I P´ eÿ`ç ò\ÿºY ÿ:ksP´ eÿêN†ÿzh ~`V÷ÿÿÿÿÿÿÿÿÿ¿Al0à–ÀÿtQcÿRùV"ÙÿTrròz ­ÿ?ÎfØFÿÿÿÿÿÿÿÿÿ ˆ ÿü=êj?fÿ‘,WXÊÿOuðj?fÿ3v䆸ŸÿÿÿÿÿÿÿÿÿîXjj?fÿ­IXÊÿ™öÄáÚÞÿÊ• ÿÁi³ ÿOË0à–Àÿ’ý$h"—ÿÿÿÿÿÿÿÿÿ _Ej?fÿàN˜éÈuÿÿÿÿÿÿÿÿÿK» ÿ®T0à–Àÿ/9[0à–ÀÿC_‡ ÿ‰bÞj?fÿL{0à–Àÿ·PÔj?fÿKL8 6ïr-ÿÑÆ j?fÿxcÈ 0à–ÀÿÙï šŠƒÿ±T!0à–Àÿœ¦!šŠƒÿaU¶" ÿêv·"$h"—ÿÿÿÿÿÿÿÿÿ•mØ" ÿ+K#j?fÿ½m$¶k@rÿIÿÿÿÿÿÿÿ_P‰$0à–Àÿ FÜ$اÔÿÿÿÿÿÿÿÿÿ‚l%0à–Àÿ©>@% ÿJVX%x,µÿ n&j?fÿL«' ÿ¾E¤)4-¢ ÿï)0à–Àÿ{k* ÿ r*j?fÿÿÿÿÿÿÿÿÿPCs*j?fÿÓH +ÿ7 ..žŒ6•"o.ÄáÚÞÿPi‘0øˆ-`d<ç0 ÿb;¡1ÄáÚÞÿ^G¨1V"Ùÿþ1Ã10à–Àÿßê10à–ÀÿÙ$2j?fÿd*Ž20à–Àÿ@Ÿ2ÄáÚÞÿrA°2䆸Ÿÿ2.3 ÿ¤FP3P´ eÿ$F50à–ÀÿÙ*7ÄáÚÞÿ”2§7j?fÿÿÿÿÿÿÿÿÿéMA8éÈuÿp(þ8 ÿ@ Ö9täŽýÿ¥}: ÿïcš:ì=.ÿÈFÅ:0à–Àÿ­ ;V"Ùÿ‘q};FîNÿ§-­;j?fÿ‰‰j?fÿŽ3™>éÈuÿÿÿÿÿÿÿÿÿçA7@j?fÿ®?l@j?fÿÊÅ@ E^xÿÿÿÿÿÿÿÿÿZæA ÿãUóAj?fÿ÷ùB0à–ÀÿuqCj?fÿF_C$h"—ÿÏC ÿã)DP´ eÿdKEj?fÿ.E ÿGuXE0à–Àÿ5t€Ej?fÿ{‡E0à–Àÿâ—EÄáÚÞÿÿÿÿÿÿÿÿÿp«EÄáÚÞÿÿÿÿÿÿÿÿÿŽx¸E ÿäE0à–Àÿ:¤F ÿ· ¦FV"ÙÿqJ«F4-¢ ÿtMG0à–Àÿt?Gj?fÿÛqBGj?fÿf»G ÿ–)Hj?fÿTVHØ"Žgÿÿÿÿÿÿÿÿÿ 6pH4-¢ ÿB›HÀDâŒÿÿÿÿÿÿÿÿÿGÁHÿ.PbJ ÿÐ{­KÄáÚÞÿÿÿÿÿÿÿÿÿIN™LÄáÚÞÿÿÿÿÿÿÿÿÿb-³Lÿðk‘Mj?fÿs#ºM ÿ#tÑN0à–Àÿ„$‡OXÊÿ>PšŠƒÿƒt¡PV"Ùÿ§!FQj?fÿ¡0ËQéÈuÿÃLôQ ÿÓT ÿ´g^Tj?fÿ`•Tt(øxÿ^F»TP´ eÿh ØU ÿc{V ÿx-^V0à–ÀÿõeWTñ–ÿr»WšŠƒÿv\YŠ Iÿs˜Y ÿj:šYéÈuÿÿÿÿÿÿÿÿÿÛp¦Y ÿúSC[j?fÿŒ&H[ ÿÕ=j[šŠƒÿ¹Hˆ[ÄáÚÞÿÿÿÿÿÿÿÿÿ}¤[ÄáÚÞÿ+%?\Xíz@d9+]$h"—ÿÿÿÿÿÿÿÿÿT"í] ÿí57^ÄáÚÞÿ·U•^0à–Àÿ0K_0à–Àÿ~`j?fÿ`Gû`؉¨Àÿÿÿÿÿÿÿÿÿ"AaìzÐeÿ_[`bP´ eÿ~c¬é„mÿÿÿÿÿÿÿÿÿ+ ‘cˆnªÚÿÿÿÿÿÿÿÿÿ`&d0à–ÀÿÜh‡d0à–ÀÿVDŠdj?fÿÇm½dØybzÿ³5ÿe0à–ÀÿaJƒgÄáÚÞÿÿÿÿÿÿÿÿÿo 5h0à–ÀÿÎ#Öh ÿÓøiÿVRekÄáÚÞÿÿÿÿÿÿÿÿÿøt5lÄáÚÞÿÿÿÿÿÿÿÿÿv2ÐlÄáÚÞÿÿÿÿÿÿÿÿÿmÄáÚÞÿÿÿÿÿÿÿÿÿ [ynÄáÚÞÿ=xòn ÿ?4®oÿ³oÿ8>Rp ÿ$rÄáÚÞÿŽyLsj?fÿlt6ïr-ÿÿÿÿÿÿÿÿÿ×8¥tüÆ®|ÿÿÿÿÿÿÿÿÿHqªtÿ8+•uP´ eÿà[–uÿ“*©u$h"—ÿÿÿÿÿÿÿÿÿgYÂu ÿÇa)vP´ eÿÇ|$w¾ú ÿA3wj?fÿ,®w0à–Àÿ×:ExÄáÚÞÿÿÿÿÿÿÿÿÿ<=Ûx ÿºgßx6ïr-ÿÿÿÿÿÿÿÿÿö yÿÚd/yj?fÿpioyj?fÿCooyj?fÿÍ|zz´:B7ÿÿÿÿÿÿÿÿÿ†{ ÿ›t´{ÿÿÿÿÿÿÿÿÿÿÿÿÿ 4Ð{6<½ÿSï{j?fÿÝI'|$h"—ÿÿÿÿÿÿÿÿÿ^Š|j?fÿH)õ| ÿ’A}0à–Àÿ+2}ÄáÚÞÿÿÿÿÿÿÿÿÿ`}ÄáÚÞÿhMÆ~j?fÿ%8î~0à–Àÿl^0à–ÀÿÚP›}þ KL8 r»WÙï †ld»@I GuXE$F5ï)$0< ,®w³5ÿe¯F‰zSéMA8ºo:¿Al±T!x-^V%8î~d*Ž2’A}„m"#tÑN‘q};äE‚l%l^þ1Ã1Üh‡dtMGßê1xcÈ ®T_P‰$7 .0K_ÈFÅ:OËo 5h·U•^{‡E`&d÷ùBL{/9[TrrúSC[~`–)H _E§!FQdKE§-­;´g^TîXjÑÆ Cooy‰bÞ8 ÙvPCs*Úd/y5t€E®?l@pioyhMÆ~ŽyLs^Š|‰‰<Sï{ÚOuð n&4 tü=ê·PÔÇm½d¢M‹Óøi¹¨ à[–uHqªt?4®oÓH +ö y³o…'” ÃLôQþÿÿÿ¼LõþÿÿÿMõþÿÿÿtMõŽ3™>aJƒgêv·"9+]VRek“*©u’ý'5ÝI'|+2}¹Hˆ[O{Qv2ÐlÐ{­K×:Exøt5l r*â—Ep«EmIN™L”2§7ºgßxßhšltj:šYàN˜Ûp¦Ys#ºM$Ùp(þ8+K#H)õ|Ç|$wþÿÿÿØMõ ˆ¥}:™öh ØU†{gYÂu ¾ Ù*7$rPi‘0í57^ºY`} [yn@Ÿ2þÿÿÿRp.PbJF_Cþÿÿÿ Nõ©>@%ZæAs˜YaU¶"7 .OõŒ@ ö['ÀdÚ_[`bOõ.E‹6¢TuF=`•TJVX%JVX% Oõv\Yïcš: 4Ð{@I ­I„$‡O‘,W@ Ö9RùqJ«F¾E¤) 6pHRù,Oõ­ ;Zk¤^G¨1ƒt¡PÚGè· ¦FÇa)v¤FP3^F»Tã)D:ks"Aa8Oõt-ÓTõeWõeWDOõßQ±ßQ±POõd<ç0b-³LtQcêN†GÁH2.3+ ‘c+%?\3vrA°2Ôhþÿÿÿþÿÿÿ\Oõÿþ×8¥tÿÿÿÿÿÿÿÿ˜Kõ` ˆ@e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüKõ`m@h „Є˜þ^„Ð`„˜þOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`Lõ`l@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈLõ Ê@CJ$OJ QJ o(" ÿÿÿÿMõ @e „Š „›þ^„Š `„›þOJ QJ o(·ðÿÿÿÿ€Mõ`c@e „Š „›þ^„Š `„›þOJ QJ o(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäMõ @e „w„›þ^„w`„›þOJ QJ o(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHNõ @e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬Nõ s@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhOõ @h„„^„`„OJQJ^Jo(·ðÿÿÿÿÿÿüÿÿü    åN7‰MGu#N Ce§%óU°“iè¯ Û  Ú -£ "s"Ç$Ñ$ÿ@€´´ o´´Ð$P@ÿÿUnknownÿÿÿÿÿÿÿÿÿÿÿÿ G‡z €ÿTimes New Roman5€Symbol3& ‡z €ÿArial?Courier Neu?5 ‡z €ÿCourier New71 Courier=" HelvArial;" Helvetica5& ‡za€ÿTahoma3Times;€Wingdings]& Rotis Sans Serif for Nokia"ˆVüe ;H&"Úz&9üG&R$Oƒ>$O>$Vü¥À´´€r4db"b"iœ5Î3ƒQVüßßH(ðÿ?äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ“ièÿÿReference Toolkit Specification Hezel, UwePeter Thompsonüü                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û þÿà…ŸòùOh«‘+'³Ù0˜ÀÌàì $ @ L X dpx€ˆä Reference Toolkit Specificationefe Hezel, Uweoeze Normal.dotoPeter Thompsoni30eMicrosoft Word 10.0@lŒt @–äeSû¿@S«À@L䨜Ã$OþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®L hp|„Œ” œ¤¬´ ¼ èäIBM>b"­  Reference Toolkit Specification TitleP :B_PID_LINKBASEäA  !"#$þÿÿÿ&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWþÿÿÿYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆþÿÿÿÈÉÊËÌÍÎþÿÿÿÐÑÒÓÔÕÖþÿÿÿýÿÿÿýÿÿÿÚþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀFÇ{C¨œÃÜ€Data ÿÿÿÿÿÿÿÿÿÿÿÿ%àd1TableÿÿÿÿXŠÝWordDocumentÿÿÿÿ8HSummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿÇDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÏCompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qsyncevolution-1.5/src/synthesis/src/syncml_tk/doc/ReadmeMaintenance4_4.doc0000644000373300037200000034300012424517753030423 0ustar00nightlyallusers00000000000000ÐÏࡱá>þÿ ÞàþÿÿÿÜÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥ÁE@ ø¿X/bjbjƒæƒæ 8NáŒáŒû$UÿÿÿÿÿÿˆÐÐÐÐDDDX I I I8XI,„ILX´ÖÜIÜI(JJJÀLÀLÀL3Ö5Ö5Ö5Ö5Ö5Ö5Ö$¸ÙR ܘYÖDÀL€L€L@ÀLÀLYÖÐÐJJ|nÖrMrMrMÀLFÐJÐRJ3ÖrMÀL3ÖrMÀrM2N’s¹ÊÐ""9Õ$JÐI p_ ûï5Ä IM=ÑþÖ,„Ö0´Ö;Óþ¢Ü"M4¢Üü]ÕXXÐÐÐÐ]Õn¢ÜDËÕ<ÀLÀLrMÀLÀLÀLÀLÀLYÖYÖXX$|5¤VMXX|5SyncML Reference Toolkit Specification Release 4.4 May 9, 2004 READ ME Copyright Notice Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved. Implementation of all or part of any Specification may require licenses under third party intellectual property rights, including without limitation, patent rights (such a third party may or may not be a Supporter). The Sponsors of the Specification are not responsible and shall not be held responsible in any manner for identifying or failing to identify any or all such third party intellectual property rights. THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. The above notice and this paragraph must be included on all copies of this document that are made. File and Directory Structure The SyncML Reference Toolkit file tree is structured as shown in the following figure. Within syncml/src/sml the files of the toolkit itself are found. The transport handlers are stored in the directory syncml/src/xpt. Demos showing syncml at work will be organized within syncml/src/examples. syncml ------ docs ----- internal ! !---- bin ------ win Binary files (like dlls) ! !---- src ------ sml ------ inc ------ win Public Headers ! ! ! ! ! !--- palm ! ! ! !--- mgr ------ inc SyncML Core (Manager) ! ! ! ! ! !--- all ! ! !--- win ! ! ! !--- wsm ------ inc SyncML Workspace ! ! ! ! ! !--- all ! ! !--- palm ! ! !--- win ! ! !--- linux ! ! !--- epoc ! ! ! !--- xlt ------ inc SyncML En-/Decoder ! ! ! ! ! !--- all ! ! ! !--- lib ------ inc SyncML Library Funct. ! ! ! !--- all ! !--- win ! !--- examples Example code ! !--- xpt -- !--- bindings Transport Handlers ! !--- common ! !--- all ! !--- linux ! !--- macosx ! !--- palm ! !--- tcp ! ! !--- all ! ! !--- linux ! ! !--- macosx ! ! !--- palm ! ! !--- win ! !--- win !--- http ! !--- all ! !--- linux ! !--- macosx ! !--- palm ! !--- win !--- obex ! !--- palm ! !--- smlobex ! !--- win !--- wsp !--- all !--- awsp !--- inc !--- palm !--- win Supported Platforms The SyncML Reference Toolkit has been implemented to be portable to as many hardware platforms and operating systems as possible. Nevertheless it is not possible to achieve an full platform independent code. The SyncML consortium therefore focusses on the following platforms: Windows 32 The deliverables target Windows 95 and NT 4.0 and comprise: Source Files. Several subdirectories named ../win hold files specific to the Windows target (e.g. syncml/src/sml/wsm/win). When compiling all these Windows-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../palm; ../epoc)! The source code was developed using the following development environments : Microsoft Visual Studio C++ IBM Visual C++ GCC Palm-OS The deliverables target Palm OS 3.5 to OS 5.0 and comprise: Source Files. Several subdirectories named ../palm hold files specific to the Palm target (e.g. syncml/src/sml/wsm/palm). When compiling all these Palm-directories must be included. All other directories, which hold files specific to other targets must be excluded (e.g. ../win; ../epoc)! The source code was developed using the following development environments : Metrowerks GCC The Toolkit for Palm runs on Palm OS 3.1 too. Due to limitations of that version of the operating system, the size of the workspace is restricted to maximim 50kBytes. Not really recommended these days. LINUX To compile and run SyncML under a Linux Platform, the Win32 source code is used. Please follow the instructions in the README.linux file in the “src/bld” directory. Changes in the Maintenance 4.4 Release Removed binaries from the distribution. Added example directory in src. Mgr.h – Fixed bug declaring a variable with inappropriate type in struct instance_info_s Mgr.c - Fix compilation error if NOWSM macro is defined Smldef.h - Fixed compilation error if NOWSM macro is defined Added -Wall to CFLAGS, Removed unused variables and functions to obexbinding.*, obex.c, settings.c transact.c wsphttp.c, xptihttp.h, xpt-auth.c, xltdevinf.c, xpt-tcp.c, httptrans.c, xpt-http.c, define.h (in sml/inc/win). (General cleanup). Changes in the Maintenance 4.3 Release Fixed win .def files to work with NOWSM flag. Added extra #ifdefs to work with the NOWSM flag. Removed extra copy of the syncml_tk_prefix.h file. Fixed the problem – should apply to other similar flags. Changes in the Maintenance 4.2 Release OBEX bugs fixed. Added MacOSX support. Added SSL support for PalmOS 5.0 (alpha) and PocketPC 2002. Updates for Linux. Memory change to allow you to not use the toolkit memory structure. Added support for SyncML 1.1.1. New API function smlStartMessageExt() with parameter to specify SyncML version. Changes in the Maintenance 4 Release Obex transport binding was fixed to work properly with the XPT communication API. Sofar it’s only tested on Win32 systems running Windows 2000 (OBEX / IR and OBEX / TCP/IP) Implementing several DTD changes to support device management Implementing new extension for “Progress Information” usind a new tag “NumberOfChanges” Implementing new extension for “Large Object Handling” using a new flag MoreData for Item-Tags Implementing new extension for “Large Object Handling”, new API to calculate remaining space for data after setting up the tag-structure skeleton Implementing new extension to transport toolkit to support cryptographic security against manipulation during transport, new header field “x-syncml-hmac” (HTTP and OBEX only, not WSP) Bug fix for an Microsoft IIS-Hack in HTTP transport binding Bug fix for a minor bug causing the HTTP transport binding toolkit part to crash if message type string is longer than allowed 4.1: Declarating function ltoa() in linux-special file src/xpt/bindings/http/linux/xptihttp.h 4.1: Adding support for ‘SupportLargeObjs' and 'SupportNumberOfChanges' tags in device information dtd  SyncML Reference Toolkit Read Me  SAVEDATE \@ "yyyy-MM-dd" \* MERGEFORMAT 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.  SyncML Reference Toolkit Read Me  SAVEDATE \@ "yyyy-MM-dd" \* MERGEFORMAT 2001-09-18 Copyright © Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). All Rights Reserved.   '124789>?@HX;<=Z¸Æ%3kv~€”¢ËäøñêñêñêãêÔøÄ¹±§Ä››ƒ›w›ie§Z§Mhu#N56CJOJQJhu#N<CJOJQJhu#Nhu#NB*CJOJQJphh ZìB*OJQJphhu#NB*OJQJphhu#NB*OJQJphhu#NB*OJQJphhu#NCJOJQJhu#NOJQJhu#NCJOJQJhhu#N5B*CJOJQJphh“iè5CJ$mH nH sH u h“iè5CJ$ h]`%5CJ$ hóU°5CJ$ hu#N5CJ$'@HY—× ( h ¢ ã & d £ Í Î  T “ Ô  V ˜ Ú b òòòçåååååååååååååååååååååå $¤h1$7$8$H$ $¤€1$7$8$H$a$û,P/W/ýýýb Ÿ à &h¬×Ø<Z€£­æðz¯ÐH{®ÏýýýýýýýýýòâÚÏÏÏÏÏÏÏÏÏÏÏÏ d@ÿ1$7$8$H$1$7$8$H$ Æ&¤x¤x1$7$8$H$ 1$7$8$H$gd Ceä%_abœ®eyz Yef¼ÎÐ’“ÍÎ  DE€‘¦»ÅÆ.4öéöéÞöéöÔöéöéÊöÀ°ÀöéöÔ¦Ô¦Ô¦Ô¦Ô¦Ô–’„t’o’ghu#NOJQJ hu#N5hu#N5B*CJOJQJphhu#N5B*OJQJphhu#Nhu#N5B*CJOJQJphh CeCJOJQJh Zìh Zì56CJOJQJh ZìCJOJQJhu#NCJOJQJhN7CJOJQJhu#N6CJOJQJhu#N56CJOJQJhu#NCJOJQJ(ÏBu©ÜEf¯Û/{§Ú #f†Ðü2mªèôôôôôôôôôôôôôôôôææôôØØØØØ d@ÿ1$7$8$H$gdN7 d@ÿ1$7$8$H$gd Zì d@ÿ1$7$8$H$è$_¡å*m¯êY–ÔK»ú5h£ßV‘¦ññññññññññññññññññññññññÚ$ Æ@„°„Pþ¤ 1$7$8$H$^„°`„Pþ d@ÿ1$7$8$H$gdN7¦»Æ) * w “ ¢ ¦ ® ê " "Z"e"i"j"5#;#à#÷à÷É÷÷ÉÉÉà÷É÷÷ÉÉ÷÷ྠ1$7$8$H$gd“iè & F  Æh„h„˜þ1$7$8$H$^„h`„˜þ$ ÆÐ„°„Pþ¤ 1$7$8$H$^„°`„Pþ1$7$8$H$4e{ & w ¥ ¦ ­ ® Ñ Û ê ö !!K!b!ú! "Z"h"#4#5#:#;#ß#à#á#â# $S$«$¬$ã$ä$ï$ %!%ø%&&&üôüôüïüáÑüÍüïüôüôüôüïüÉüáÑü²ü¢–’ƒ’ƒ–’ƒ’ƒüh Zìh]`%h]`%B*OJQJphh]`%h]`%B*OJQJphh]`%5B*CJOJQJphhu#N5B*CJOJQJph h“ièhu#Nh§%h‰MGhu#N5B*CJOJQJphhu#N5B*OJQJph hu#N5hu#NOJQJhu#N+à#â# $ $3$S$¬$ä$!%&&:&;&i&óáÓ±©—‰x & F dð1$7$8$H$gdóU° dð1$7$8$H$gdóU°$ Æ@¤ 1$7$8$H$gdóU°1$7$8$H$ & F dð1$7$8$H$gd Zì & F dð1$7$8$H$gd]`% dð1$7$8$H$gd]`%$ Æ@¤ 1$7$8$H$gd]`% Æh1$7$8$H$ &:&'.'0':';'K'L'Û'ô'õ'(d(f(Œ(¬,ù,û,ü,!-"-K-L-V-W-e-Ÿ-.#.$.%.&.ðäÔÄÔ¸¬¸¬ ¬ ‘ ðäzärnrnrnrn_ZnTnr hu#NCJ hu#Nhhu#NhmH nHsH tHuhu#Njhu#NU-hóU°B*OJQJhmHnHphsHtHuh‰MGh‰MGB*OJQJphh‰MGB*OJQJphh“ièB*OJQJphhu#NB*OJQJphh“iè5B*CJOJQJphhu#N5B*CJOJQJphhóU°B*OJQJphhóU°5B*CJOJQJph i&š&Í&':';'L'b'ž'±'õ'f(Œ((:)x)Ð)/*îîîßÔÆÆÆÆÆµ£•îîîî dð1$7$8$H$gdóU°$ Æ@¤ 1$7$8$H$gdóU° & F dð1$7$8$H$gd‰MG & F dð1$7$8$H$ dð1$7$8$H$$ Æ@¤ 1$7$8$H$ & F dð1$7$8$H$gdóU°/*Á*y+µ+4,’,ú,û,--X-Y-Ÿ-$.%.@.I.‚.ƒ.É.N/O/P/R/S/îîîîîîàÜÜÜÚÕÕÚÜÜÜÚÕÕÚÚÚÚ$a$¤  dð1$7$8$H$gdóU° & F dð1$7$8$H$gdóU°&.K.L.u.v.€...9/O/P/Q/S/T/W/X/üôüôüôüåüá×üÍüÁhóU°B*OJQJphjp2hu#NCJUjhu#NCJUh Zìhu#NhmH nHsH tHujhu#NUhu#NS/U/V/W/X/ýýýï dð1$7$8$H$gdóU°6 00P P &P °‚. °ÆA!°8"°8#p$R%°°Þ°2p2Dd&& `+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1Dcnð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚p2Dd&& `+`+ffð<² ð C ðA¿ÿðÂbðà1„oœÅr<,;ÖFQ[‡¬bÿ¼1´2cnð´1„oœÅr<,;ÖFQ[‡¬bÿ‰PNG  IHDR&&è¬ÖgAMA±ˆ•˜ô¦ pHYs ø øf&<ý IDATxœíÝytU¢Çñºˆö"$ÄƃèÂ.Žì0 ‹¨Œ ›(F‘a—qæ Ûˆ ‚ìˆG}"¢(úØQGD-ÀŒ$  D ô}Ü¡^Ñtª·Û ù~þð`§êÖ­êêúÕ½u«Ê0Üà„¡®ܨÂöZ!Ô(¹±Âv«@Ø’R†!„Pÿ+á9Jxn/sá|²¾‘ãp8âããC] ¸ÁüòË/N§3Ôµ(Y˜FŽ”2>>>+++Ô€LBBBvvvx¶u¡® ¼ rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9Mˆ€&D@"  ‘ЄÈhBäØ"¥tùG™S\9¶!\þ¡¸Œ9Ù.*„º7)¥âÂ… §N:~üøéÓ§333 OŸ>m†ÓéT“ !TÒÔ¬Y³R¥JIII5jÔ¸õÖ[ãããëׯo–€"rJ ¥,,,|áÂãZl¨h1ÿaåÒÐQÓDFF&$$$$$4lذQ£FÉÉÉ­ZµºõÖ[ !„ÊùóçKk‹ !ªU«vCì™RÊüüü¢¢¢ÿêp8ªU«Vâ\çÏŸwù0**ªråʯ"œÚÑëׯ/µ+**Ú²eËàÁƒ+Uª$„B8ŽÀþðÌ2G\\܈#þõ¯é_S”gN§SJ™ Jáp8<êjÚråʕڵk—¶"Íš5S+ëâܹsê—h=zt‰ßpTŸJxž1p-ç¿òòò^|ñŤ¤¤6mÚ¬\¹²°°Ð0 !„ÙiªÅ£†‘““³lÙ²Ž;¶k×nñâÅ—.] ಀҨƒ‘uo´Rýè£B]M[–.]zöìY÷µ0,«YâŒÒ2&Èe‘c†±bÅŠ;ï¼óå—_>qâ„qm_T{¡Ãá  T»µu)ßÿýèÑ£[¶l¹aÆ@- ð¬´[í“~ø¡æúøàÊ•+Ó§O/mET“¥´yÝÿÀ_:JSN#ÇÜ·V¯^Ý´iÓ!C†;vÌ¥M­& l+Ç0 §Ó©ÊtY”ò§Ÿ~êÞ½{‹-V¯^Ø…î<a322–-[f*å‰'fee•ø§2ë,¯u0¡^(U9Ã0Š‹‹Ç׿ÿ„º.ÿ¥ú4222ú÷ï?lØ05Z )åSO=uîÜ9#\»›233ßxãP×Þ)‘#¥¼råJ·nÝæÍ›g„ÓÏIõ­«3¯wß}·mÛ¶G u¥P~åçç¿òÊ+¡®E©V­Ze„q %*‘ãt:‡þå—_šÿë[9%Ž1?÷¡@ë5LÕÏÖºuëÍ›7ûV=À>—}ظ¶7¾þúëÿþ÷¿C[·]¾|yÉ’%êßî•GØ*‘3uêÔ÷ßß°âýdŒýU gÏžíÛ·ïÙ³gý¯$`“õwqùòå7ß|3´õ)ÑìÙ³­YHØÜ(Ê]äüðÃ/½ô’ˆö¸‡Q•þ:0ögÏž4hPÀG1Vê,Çá¸î€ ZÛ|ðAqqq¨*æÂüQL:Õ°üŠé^»Q”£§H)sss|ðAkç•EIMkܸqƒ êÖ­[«V-óÃâââ“'Oæåå?þàÁƒyyyòÚ£ „Çx¨³a›6mJKKãJ)‚Gí–ÉÉÉõë×߸q£aÙÛ³²²fÍš5qâÄVð:?þxAA¼þɃþæ›oÔ}€DО>0iÒ$ßêãp8Ôý4qqq¯¼òŠºõ¬Ä•Í‹ŠŠ80kÖ¬:”xÉÇ>µè-[¶|ƒ qß]+UªtìØ±P×÷¿Ö¯_ïò#BÔ©S''''!!Áå·“’’Rb!j$ž‹Q£Fi^— áéa¡¨¨héÒ¥¾Íët:£££§OŸ~øðáñãÇ׬YÓ(å5?ŒˆˆhÒ¤Éøñã¿ùæ›Ï>û¬^½z†O# ÌVѧŸ~*Ãû& Üè„]ºt‰u¹$YXX¨:²ÂÁßÿþw—‘”rüøñµk׿§þÊQä8pàÌ™3>Ì(¥Œß¾}ûĉcbb ïú={öܳgOÿþýÍOì¼Ö{ Nî$EÐH)£££'L˜`žÜ˜»Ü²eË233C]AcË–-[·nuùV«Ví±Ç3Âõ¼Vå(r¾ýö[¯¦7{bbbÖ¬Y“œœlýÜÛ¥W¯^ýÃ?|æ™g|h©¨‰322víÚåÕ¥ ¸ ÉÖóm¡¡ú¢Ÿx≻îºË¬ƒÂét^½zuøðá!G0oÞðã?ú6ã”)Sî¾ûî€Ôáå—_Þ¸qã?þèà Ã0–/_~×]w…éœÿ­à• -Ã4rss/_¾\§Nˆˆ5½¶­g­žËB =zäÈ‘¬¬¬Ó§OçääK)Ïž=UµjU§ÓÓ¸q㤤¤;î¸Cõå×f àºXK‹ŽŽ~ï½÷Ìs,s¹›7oÞ´iÓý÷ߨ…z+++kåÊ•âÚÓHk[cìØ±†÷ÃA§r9'Nœðê$HíÙÑÑÑ<òˆúÄÿyddäôéÓ{öìéÛ ç~øÁÛY‚ÔçC™Ö“SßJ0J?Ž«ÏwìØ±iÓ¦½{÷feeíß¿_½@ÏL÷F5mÚ´aÆÉÉÉ=zôPWׂǥz?ÿü³:doÛ¶mß¾}fÅÌꙉhÝKÍÿ­Q£Fûöí;wîܱcÇfÍšEDDõðzÇw´mÛöûï¿7+£ª·jÕªPEŽ”rÚ´iW¯^µF‹¢k×®76§ IÝ`_y‰)¥·rÔšZ½zõ¶Ù»uëvß}÷}ñÅ>Ì›žžžŸŸ¿~ýúE‹Ù¬¸6üoÙ²e>,±DRÊM›6͘1ðñ#7-Z´˜>}ºú÷ÁƒÇg“¦¥¥õêÕË()¨öïß¿fÍš7îÚµËý¥[†a8N5×áÇ>l~žœœÜ¼yóÞ½{÷îÝ;/ær:{öìÙ²eËæÍ›7oÞüŸÿüÇe3i¬Í/—mbþonnîš5kÖ¬YcFݺuÛ·oߦM›öíÛ£Õ«ê3vìØï¿ÿÞzùPJ¹bÅŠI“&ÝvÛm]¢_}õ•zÜ€uÕªUkñâÅæÿÒÊ/Ì£¤·C=kÑ¢…W{¤: ôìÙS–2Ú7N§såÊ•¾m‡Ã±sçÎììla·mgc:Ž;vj¤”C‡µÓah»xñbsöôôt¯¾‹… º×aíÚµMš4ñ¹;Å|Q^•*Už{î¹ .øö-«¹\æýç?ÿÙ²eKõùP·2™;@jjê¶mÛÜ+`‡u´*ÓR¬.Þ$%%™_Ÿ¹Ð=zø°•üdVÆ¥ÂóçÏ·NÆ i%œI‡£ð‰‡Ã‘ØjH)8àÛÞ „X·n”rÈ!êXfó ïp8†¨ú™ïa´³ •“'Oš%ø9ÇŽ{衇ì箇º™Û'55õ—_~ñmƒX÷{÷îMMMõ³nv*oÖÜápôîÝ[õ{<"Gµ`Áë&2ªBN§ 6¸ïo±±±—/_¶NFä(DŽwÂ'r”¹sç–x&ë3ŸË1«‘™™©^Mo¿™žžµ˜?¾°÷Šnó˜8iÒ$õ¢ U‚Ï‘sìØ±?ýéO·Ür‹º˜ásǸþ¨­þ[­Zµ—^z)//χMät:<8vìØÊ•+[ÎÁk师5kÖ¯¿þj¿Îž[9ª¡Ó®];÷eµhÑ¢°°ÐÛMä?üáîßõ¤I“\&#r"Ç;AŠuîé[}¾ùæ›ÀVÆÓ§Oˆˆðj-ºtéâÿr ëÕ«g3rTÞÔ©SçâÅ‹ÖB|‹œ#GŽ$&&ÚŸËBˆ;ï¼Óú(ä¿p!DRRRff¦Í:{nå(‡ªP¡‚58Õ¡õêÕ6—â¿ýû÷[—®v¼Š+fgg»LIä(á9åè¾s˜©üõ×_®.ðøã×®]Û«Y¾øâ ?ßG'¥üøã­¯ë.sz)åøñ㣣£ýY®aééé;w.í"„سgÏ´iÓÌÿõ0±¹6nÜøÇ?þ1¨+“J‚cÇŽõë×ïÒ¥K*¶qãÆ;w¶~¢Öú½÷Þ Ô"Ê4~üx— !}ôÑ`9D0”£Èq9§óÊ©S§ÔøÔwß}7??߃á˜UªT?~¼ýõC;w®? BÌŸ?ß«YªT©2jÔ(jÆéÓ§¨óågQž©­ôÆoØR¯6þçŸÞ§OŸüüüОTšµÝ»woïÞ½˜: °þ¯ZÍÿýßÿÕðN )ezzúúõë]>ŠŠšùäÛo¿‘‘árõBt¤µiòäÉöGK«ÉfÍšåóâ&NœèÕ~œ˜˜XTTä¾âÞFŽ~Bˆ‰'JßÚÊ•+ý/ç²ÿX‡ Š’xU¸a·ß~»ûNhe3r¤”+V¬p¯ÃáØ°aC0öjÅét®^½Z¸ ÁhÖ¬™zXƒ;"G!r¼¤È)..6ïRH%Åõ£l]~*THMM}衇^xá…/¾øâÌ™3ªý‰îܹӿ!ɬdçÎ}^ÜwÞéÕ~Ÿ[97~æ™g–/_¾sçÎóçÏËk»¨Yþ¹sçvïÞý?ÿó?ÇWâ}¨Æ UC§Äµ°ßÊ‘R~÷Ýw*Tp?Á Þе]»vEEE¹ìržCŽÈQˆï#rLcÇŽ ê=z>HIIyúé§?ýôSÏÝ ¥9sæL¥J•¼Zø° ó]se–¯&ëׯ_iEù9Âr—¥¢FÆ [´hѦM›vïÞ}üøñôôôo¿ývîܹýúõ«R¥ŠKöÛ_Šâïÿ{‰õߺu«ý¢\ZÀIIIï¾ûî•+Wìoù¼¼¼É“'W¨PÁlÙ_úsÏ=WZ±^EŽ”òÏþ³Ëft8¿ûÝï쯈WRSS]¾!Ä{ï½çáT‰ÈQˆï5r.\¸àÏSR‚Áü9ÅÅÅ;vóæÍ¥uU—f̘1^]¦r8Gõª•³{÷nóÐigu‡‡×˜ú9jî¹çž 6zX‘‚‚õF/ßR§´G6ôèÑër̘¼ÿþû½º[SQ+øÚk¯9¯nÆ2 #..®´qÞFNNNN¥J•\f‰ŠŠ ì CUU]F©©}/&&F½Ü½4DŽBäx'¨‘#¥û¬o—¬ï»ï>ë¶µ³¸F¹—3eÊo[K‡cúôé>ÔÙyg•ýµ¨_¿~‰[ÌÛVŽ”R½$к'¨ÿ.X° k§Œ3ÆeÕÔo¡Ì‰…ÈñN°#G0žËÉÉ‰ŽŽvœo¿ý¶Ìy‰%œ#§=}ÀE:u6lØ0aÂó“°ú†ÔÁQJ©|0{öliyÙ¥ûÄ-[¶LLL,ñ¯¥•¿aÃ;Sæåå}üñÇ6‹U%»Ü¯î?yíUf/¾ø¢Ï…tíÚ566Ö0 ‡ÃauÜíÛ·ÏۼƎëí5˜ !*T¨Ð·o_ÛÝU±k×.ÿ—®üõ¯UÇ5ë‡ÇŽ Ô ™V¯^}ùòe—3§æÍ›·k×. 宂ÚÊq&ô?þøüóÏÿæ7¿ «VŽõž å…^0ûôK\£µk×ÚΤ ŒŠŠ²Ók·hÑ"¯¶LíڵϞ=ë¹LZ9‡cäȑқœNçóÏ?ïUsÖ}'— ®ÃÛù1«Õ¬Y³yóæÂö56û¼*0°G)åèÑ£]Z9RÊŒŒŒ+Vø\æK/½tìØ1—Ï[¶lùä“Oú^W L!låØqúô鯾újΜ9ÇoÙ²¥ûýíÖ6Ëç.õv³(óæÍóP½O>ùĺt;Å–öÈáS§NEEEÙ,Ç0Œ&MšØÜ†>´r ¼þªJbË%í„¿ýíoíÌn~׿ÿýïRí`ð§•ãt:­÷ÚÄf3×]vv¶{óQ±ÿ~û…ÐÊQhåÜTbcc;uê”––¶dÉ’mÛ¶]¸páàÁƒüñ¤I“†ªNiÝû߬©ãymÄÚÆ=LÖ¥K—¸¸8aïȪ>îï#QæÍ›wåÊÃÞ µ¢W¯^eN曺uëÞrË-,ÐΕ(;;Û«&K||¼o sBˆ_|ѽ—òôéÓê”ÈN!ÖÉV­Z%¯o> !Ú´isÇw°Ú9"ÇwæÏ£qãÆ}ûö2eÊ;ï¼³k×®üüü={ö¼ýöÛiii=zôˆ‹‹3®?/¥§§{øIGGG?óÌ3†í£ªbݺuîŸ-]ºÔ«Šýáðjzûj×®ísHÖùóçmN©’ÉŸwц¹V­ZuíÚÕý{ùÇ?þ¡^cX&ë¯àwÞ1ÜvÚ€¶GÈ9¾³þ<Ì4)etttÓ¦M~øáW_}õ³Ï>;yòdVVÖ§Ÿ~:uêÔ:×zù}^îÉ“'wîÜéa‚'žxâÎ;ï´¿ëÖ­;~ü¸Ë‡6lP/œ¶©M›6Öç0Vdddxöx&„P=“7%)åk¯½V¹re—¯æÜ¹sê¥ öËY±b…z ‡õóZµj=òÈ#F¼DäøÎ¥áâáÃzõêõêÕëÙgŸýúë¯úé§.]º¸÷¼Ù!¯ =úúë¯=L=cÆ ûÅ^ºtéå—_6Ø*>?øàƒ2g´®Å’%Kû¼°åÕ·¦z&oJBˆÆ<ØýOóçÏ·¿‰òóóÏ{9IDATÓÒÒÌ}ÛìþÇ?þ¡Fë܈g(M¹8F>(éÜ*99yýúõ P/¾ýœŽ=êy‚®]»¶jÕªÌrÌu|çwÔ­†a!Š‹‹ÿùÏÚŸ½[·nå¤Ï=::ÚÎŽaNSâeꛆ”ràÀî$33³´ „.³†1þüÓ§O›ªßE³fÍÜÇaã&P^"Çð5uœNg`ë ª±páÂFùüä•'NxžQJ9þüÈÈHÏå˜?é‚‚‚©S§šÆ—-[vòäÉ2«¡fŽŽ~õÕWÕŒ7}H£FìLfnØÌÌÌ`V'Ä„;wnÓ¦ûŸÒÒÒìÄíž={¦M›f)eddä›o¾G!ÜTut8}úô}÷ÝçÛÑpàÀþ<×Ë…ùÓªQ£Æ /¼ðÈ#x5üÉTTTäùPѼyóîÝ»¯Y³F}RâRäµg— !fÏž–––˜˜xåÊ•—^zÉ(åynîÆg6qnúÓÒÄÄÄ={ö”9™¹a·mÛV\\Ú£§Ïi;"""–,Y’œœìp8œN§¹;effNž· löíôéÓç³Ï>3»ËJKãÚQiþüùÓ¦M[³fÍ/¿übs)ãÇ÷znXêÙ©†£&ÈÏÏÏÈÈhÑ¢EëpéÒ¥™3gÚœX}ï-[¶ìÞ½{ë`Õ¤I“!C†|ðÁf°©uë­·¦L™R⛜Ôþ–‘‘±uëVÕÖ7·gDDÄäÉ“ƒTU "з‚úp­^MÛm·ðõSVN§SÝÖàÃ&0`€ûó=Ýýúë¯êigÝ…UªT9qâ„:cµ9KiïÍôÌÛ[A[´háÓ6.ý…%í„j”„W•>|x x£ÊÙºu«¸ö@Ï‹V_bioëñçVPk}¤”ÙÙÙ±±±.ûŒ¢Ä·Ã™¢9r¤ûÎ9lØ0¶ŒÂ­  ·‚†XTTTƒ |›÷çŸÞ¶m[`룘/$öaÞøøx;‘3cÆ û}w?þøì×dذaö'¾ øðýåË—Ÿ={6 KWßøæÍ›ÕwZæ×jN’’ ”XÃ0êÕ«7gÎ÷¥/Z´Èýj¨ªüÙ³gß}÷]÷2Ÿzê©`Ta¢\DŽa>Œ§2O^ýõ@UÃzŒØ³g·§!æ)aÆ {_<ð@Ó¦Mí¤ŽZÙÕ«WKËÙ«çj$$$Ü{ï½^­Â®I“&U«VõvhûG}À:¬_¿Þóä^û÷iùlРA¬¬·ÞzË}b!Ä /¼péÒ%s-ÔÕºuëæÍ›»ª¡ò9)))>73W¬XqèС€TÃZu²_+k³æî»ï¶9oDDĤI“¼ZýúŒ;¶B…rq9Ðê·¿ý­·mÓ… jéÇŽó|W–»5jÔ«W/P(MDDD¿~ýÜw³)S¦¸ßœäEjF5n7±ò9}úôñ­ Ë0 !Ę1c.\¸ÀúìØ±Ã|:§ÍỶ+W®|Ï=÷ØŸkàÀ·ß~»-]JJÊ“O>éóV½qÝÿýÞβ{÷îG}TÔû³èììì^½zy5רQ£ô ™=z´õD¥È±cÇþú׿šJ)‹‹‹{ì1—’R<ØÛ—|ðáJݺu}>ÓB4mÚÔ«‡Úz““Ó¸qcáýƒ>UC§sçÎÞ.qöìÙf#Éÿ掺"½nÝ:Ÿ·À;|@J¹{÷nsKzÕHMMM5/àùàäÉ“III6‡u˜Ó!Ž;Vbþpát:ÇŒc\ÿ[UëoG]‹rhP¹reÿ_*Êð…áa¡]»vþ|û÷ïoÞ¼ùÔ©S/]º¤>‘Þßü(¥üòË/[µj•™™éÃìJÇŽ½š^JùÀ¨û|ó©‹ tëÖÍÿrnDÍš5KNN׆JÛÜ©¤”[·n:tèÕ«WÝÿTÚ,æ¿/]º4hР¬¬,ûõT‡õ^½z¹ˆƒD1iÒ$—ÇÊ©ƒ õæ¶>øÀ}•ûöí[«V-µ\©•³fÍß"G\/11ñ‰'žX¾|ù‘#GTÉæ Oëâ¬ÿ{éÒ¥íÛ·Ï;W½ÔÙŸjDFFzÛØRé'Mšä> Õ7Bˆ)S¦øó]ÜЭ)åÚµk£¢¢¼Ý˜jú[o½õé§ŸÞ»w¯‡JZ÷¨#GŽLš4)>>ÞúRZ; BDEEíÚµKá­ LŸ>ݽžBˆï¾ûNJ™­Æ_XGx«¿ú?”œVŽέœrtí·G))){÷îõ³œ¬¬¬yóæ©W®\¹yóæ5jРAll¬õ®·ÜÜÜììì'N9rdÇŽ/^4,1>=}ÇápŒ1ÂÛÑwjÏ›4iÒ’%KÔh]–îbøðá~–pCëÞ½ûèÑ£çÎkxÿmžß ¢veÃ0&Nœø›ßüFóI‘7ŠaÆ=ýôÓ~"ÝRPX&¸ÿÕ!DŸ>},Xª7%%%¥¥¥¹îò¶P!Dbbâ+¯¼¢«^½rt-Ç|Û¶m‹-2?ñí‡TÂò6!ÄСCGŽé±-[¶lÒ¤ÉÁƒ¥—W•TM*Uª4jÔ(ÿ«qsRΘ1#''G½DÙüЫ¨°~Ñæ¼Òò¬UŠjÞ¼ùûï¿ÂÇW !ÆÿÆoäçç[OMÜÏTž}öÙðyqê?üð·¿ý-$‹nܸñƒ>’E#ˆ×rL¿þúk›6mÄõÃfŠuxÒØ±cøhÑÉ“'›½dö[*jÊßÿþ÷©ÃÍѱ¦º‹ŠŠFmݤ¡Ú¯Ô¢“’’Ô¿2{>ƒ×±¦<û쳞»k×®}ùòå.ÑÏŽµêÙ³g·káEJY¥J•¯¾úê­·ÞªW¯^¦Žyº·téÒyóæ°’#FŒ°ùjK÷Zýñ T5nêkŠˆˆX°`Ák¯½mý<$UjÛ¶íÆkÖ¬’¥›ÔêOž<¹~ýú|#FŒ¨X±¢Æz!ôÂîh«:튊Š6lØŽ;zöìê¹’RFFF¦¥¥eff>úè£-¼AƒãÆóaÆÛn»­OŸ>­ÌÎ<žŽ7nß¾}êöØäMåÊ•/^üí·ßÞ~ûíf¬þj(jÑ111=ö˜,ý²ßO<¡·^½ò9VqqqkÖ¬Ùºuë]wÝ¥:FT{ÂÚ!¤Ÿ®{WŒùïîÝ»gff¾úê«111ÁXô„ \n)³’†aüå/ á·Ô¨Ü2¿SF‹%&&®]»væÌ™êÌÝå;õ¡ÀkeÖÍ\u~ݺuúÓŸ|(ÍŒ¤0`€KÉæf9rdP6jç+öÀ¡ÿµoÜ(nø#H@´jÕjÛ¶m_~ùå‹/¾Ø©S§J•*×?'*à„åÍ’æÛ´i3}úôíÛ·þù牉‰ÁX®ZPaa¡ýk¶ªzÍ›7ÔíŸN{ˬF@–n³(RÊ &dee-\¸P= /€ûË)¥¬X±âÀׯ_äÈ^äãR¸uŸ ”F©§®Y©‹ S§N à‚Jäù )¬Žò¡ê‰Õ¯Xó,22²cÇŽ:u2 ãÌ™3ŸþùÆ7lØ››Œ½AZF£uïÞýèÑ£‡z¯¢ÌýO-wêÔ©çγó“3¯*ÍŸ??222 ÇP!D­ZµFm5u€°?âNQ½zuõòVûåK)k×®=räÈ#Fdgg¯X±bÆ _}õ•ý¨+³VÑÑÑ}úôyàºuëf^@òÁƒ>xþüykÉñññþ×ÐJ1sæL—·´ !þD5µg:477×\Š”2>>¾Ä¶bÅŠjt:á=Íš5 u4 ý¶v§ö•úõë{õÃ`¸råÊÞ½{·mÛ¶cÇŽ½{÷îÛ·¯  @^?¤UM)¯96ç5/ÖiÔ¿o»í¶Ö­[·jÕªU«V)))Aê=+Mnnnݺu¯^½jç¨Úºuëï¿ÿ^CÝnV'NœøôÓO·lÙ²yóæ£Gª­{‘´Œ‡–aÓ†e·iß¾}Ë–-;tèpï½÷V©R%D«‚@BBBvvv‡±x@äØbòóóÏ;wêÔ©‹/æäääçç«cwnn®Ë,¥Œ‰‰QÝúÕ«W­^½z\\\\\\DD„õø¢yE^}õÕ &Øœ^±}ûvÞÕèk–äääüüóÏ999yyyN§3//Ïú5‡ÃQ½zu‡ÃQ­Zµ5jÔ©S§nݺµjÕRñ§äsDŽwÂ0r\xõË«ÃÄÅ‹7n|âÄ ›Ó;Žûî»oãÆA­U¹âmOà­pŽv}_x!á“7†aLœ8ñ—_~±?½”²_¿~Á«O9DÞ ftæÌ™Þ>ì rð_j|Aß¾}Ÿ~úéP×À͉k7÷§\+.Àvy¨¨ú°Aƒo¾ù¦ö*(/håÜ$\Þ-èòVë'Ö7Kš³·hÑbΜ9qqqú*  œ¡•sSqiܘOð0e—.]ÆŽÛ»wï`¿ˆœ›Ä°aÃÚ¶m[PP ^Áb>.://ïüùóæ«kÔ¨Q­Zµøøø:uꤦ¦vèÐÁú²/ò@P97‰¡C‡ú_¶T\ËhBä4!rš9Mˆ€&D@"  ‘ЄÈhBä4!rš9MˆÀ¶ÿÖµÁ÷”hèIEND®B`‚fœH@ñÿHNormalOJQJ_HmHnHsH tH uj@òj Heading 1$ & F¤ð¤ @& Æ75B*CJ OJQJmH sH uR@òR Heading 2!$ & F¤ ¤@& Æ7@CJF@!òF Heading 3 & F@& Æ@ÐCJZ@1òZ Heading 4. & F ÆÐ`„Є0ý¤ð¤P@&^„Ð`„0ýF@F Heading 5¤<¤@& Æð5:@: Heading 6 @& Æ€:@: Heading 7 @& Æ:@: Heading 8 @& Æ : @: Heading 9 @& Æ0DA@òÿ¡D Default Paragraph FontVi@óÿ³V  Table Normal :V ö4Ö4Ö laö (k@ôÿÁ(No List NþOòN Body¤x¤x Æ&B*CJOJQJmH sH uBþOB 11 BodyText„¤Ü^„CJB @BFooter$d Æ9r OJQJ>@">Header Æ  ø%OJQJ>þO2> 22 BodyText„% ¤Ü^„% .@Q.TOC 1OJQJ^þOR^ Heading 1TOC! Æâ‘ „â„ý¤x^„â`„ý 5B*CJªþObª Bulleted - 1t & Fÿ„w„›þ¤Ü>ÆTÿe-ð^„w`„›þCJ¬þOr¬Numbered List 1t & Fÿ„w„›þ¤Ü>ÆT€e.^„w`„›þFþOq‚FNumbered List 2 „Š ^„Š CJ6’6 Footnote Text¦þO¢¦ Bulleted - 2t & Fÿ„Š „›þ¤Ü>ÆTÿe-ð^„Š `„›þ>Á>TOC 2„‰„Xý^„‰`„XýOJQJ\þOÂ\ Heading 2TOC! Æ‹‘ „‹„Wý¤(^„‹`„WýB*CJ6á6TOC 3„Ý„­ü^„Ý`„­ü\þOâ\ Heading 3TOC! ÆÜ‘ „Ü„¯ü¤P^„Ü`„¯üB*CJDþOòDDocument Title¤€5CJ$DDTOC 4 Æ ‘ ‰‡ „  „<ü^„  `„<üXþOX Heading 4TOC! Æ¢ ‘ „¢ „:ü^„¢ `„:üB*CJ::TOC 5 "„ ^„  CJOJQJ::TOC 6 #„è^„è CJOJQJ::TOC 7 $„°^„° CJOJQJ::TOC 8 %„x^„x CJOJQJ::TOC 9 &„@^„@ CJOJQJ@Yr@ Document Map'-D OJQJJþO‚J CellBody (¤P¤PB*OJQJmH sH uTþO’T CellHeading )¤x¤x5B*OJQJmH sH uVþOòV Heading 02 *$¤h5B*CJOJQJmH sH uTþO²T Nonum Heading +1$¤x¤d5CJ$htH u0U@¢Á0 Hyperlink>*B*@V@¢Ñ@ FollowedHyperlink>*B* PþOâP Abstract .d,¤ðB*CJOJQJmH sH u¼þOò¼ Bulleted/ & Fÿ Æh„„åþ¤x>ÆTÿ·ð·······^„`„åþB*CJmH sH uRþOR BulletedCont0„¤P^„B*CJmH sH uRþOREquation1d¤È¤x Æ‘  B*OJ QJ BþO"B Figure 2¤x¤6B*mH sH uVþO2V Footnote3 Æä„ä„ÿ¤<^„ä`„ÿB*mH sH ubþOòb Heading 014$$¤ð¤@&d5B*CJ OJQJmH sH uL#LTable of Figures5„„pþ^„`„pþRþObR Numbered6 & F>¤x ÆB*CJmH sH u°þOr° Reference|7 & Fÿ Æ7„„åþ¤x>ÆT€[]^„`„åþB*CJRþO‚R SubTitle8$$d@a$5B*CJmH sH uNþOòN TableTitle9¤x ÆT6B*mH sH u,X@òÿ¡, Emphasis6>þOòÿ±> EquationVariables6>þOòÿÁ> ProgramCodeCJOJQJkH'.þOòÿÑ. SubscriptH*2þOòÿá2 SuperscriptH*4þOòÿñ4 SymbolCJOJQJkH*>þOòÿ> Underline>*CJOJQJkH'6"6Caption A¤x¤x6.)@¢!. Page NumberBþOñ2B DocumentOwnersC$a$CJDZ@BD Plain TextDOJQJmH sH udþObd Definition List E„h1$^„hCJOJQJhmH sH tH u`þOR` Definition Term F1$¤d¤dOJQJhmH sH tH uHþOñrH Editors NotesG6B*CJOJQJBþOñ‚B Code SnipetH¤x CJOJQJ^þO^ H1I$ & F1$¤ð¤d@&%5CJ(KH$OJQJhmH sH tH uZþOZ H2J$ & F1$¤d¤d@&!5CJ$OJQJhmH sH tH u0þOòÿ±0 Definition6TþOT H3L$1$¤d¤d@&!5CJOJQJhmH sH tH uTþOT H4M$1$¤d¤d@&!5CJOJQJhmH sH tH uPþOP H5N$1$¤d¤d@&5OJQJhmH sH tH uTþOT H6O$1$¤d¤d@&!5CJOJQJhmH sH tH uPþOP AddressP1$!6CJOJQJhmH sH tH ujþOj BlockquoteQ„h„h¤d¤d1$]„h^„hCJOJQJhmH sH tH u$þOòÿ!$ CITE6,þOòÿ1, CODE CJOJQJ8þOòÿA8 Keyboard5CJOJQJxþORx Preformatted+U1$ Æ# ¿~= ü»z9ø·!v%OJQJhmH sH tH un]@ñÿnz-Bottom of FormV$$d1$a$"<CJOJQJ_HhmH sH tH h\@ñÿh z-Top of FormW$&d1$a$"<CJOJQJ_HhmH sH tH ,þOòÿ, SampleOJQJ8þOòÿ‘8 Typewriter CJOJQJ,þOòÿ¡, Variable64þOòÿ±4 HTML Markup<B**þOòÿÁ* Comment<\þOâ\ Title1]$¤ð¤d1$a$!5CJ0OJQJhmH sH tH ubþOâb Subtitle1^$¤x¤d1$a$!5CJOJQJhmH sH tH uPþOòP RFC-P1_„°¤ð^„°CJOJQJmH sH tH uZþOZ Param$` & F¦„e„›þ¤P¤(1$^„e`„›þhmH sH tH uTþOT CODECompacta1$CJOJQJhmH sH tH u4þO14 Title Textb56þO26 00 BodyTextc¤Ü4þOB4Bullet 1 d & FŒe@RŒ ]`%HTML Preformatted7e Æ2”(¼ Päx  4 È#\'ð*„.2¬5@9OJQJ^JmH sH uX'ÿÿÿÿÿÿÿÿ ÿÿX'Nÿÿÿÿ'@HY—×(h¢ã&d£ÍÎT“ÔV˜Ú bŸà&h¬×Ø<Z€£­æðz ¯ Ð  H { ® Ï  B u © Ü  E f ¯ Û  / { § Ú #f†Ðü2mªè$_¡å*m¯êY–ÔK»ú5h£ßV‘¦»Æ)*w“¢¦®ê  Zeij5;àâ  3S¬ä!:;išÍ:;Lbž±õf Œ :!x!Ð!/"Á"y#µ#4$’$ú$û$%%X%Y%Ÿ%$&%&@&I&‚&ƒ&É&N'O'P'R'S'U'V'Y'˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€˜0€€˜0€€p˜0€€˜0€€˜0€€˜0€€p˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€p˜0€€p˜0€€˜0€€p˜0€€p˜0€€p˜0€€˜˜0€€˜˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜ !0€€˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜0€€˜0€€˜ !0€€˜0€€˜0€€˜ !0€€˜ !0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜0€€˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜0€€˜0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜ !0€€˜0€€˜@0€€ø€˜@0€€p˜@0€€p˜@0€€˜@0€€ø€˜@0€€p˜@0€€˜@0€€ø€˜@0€€p˜@0€€p˜@0€€˜@0€€ø€˜@0€€p˜@0€€0õîܘ0€€˜0€€˜0€€˜0€€˜0€€'@HY—×(h¢ã&d£ÍÎT“ÔV˜Ú bŸà&h¬×Ø<Z€£­æðz ¯ Ð  H { ® Ï  B u © Ü  E f ¯ Û  / { § Ú #f†Ðü2mªè$_¡å*m¯êY–ÔK»ú5h£ßV‘¦»Æ)*w“¢¦®ê  Zeij5;àâ  3S¬ä!:;išÍ:;Lbž±õf Œ :!x!Ð!/"Á"y#µ#4$’$ú$Y'š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€˜0€€˜0€€š0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€˜0€€š@0€€Èš0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š0€€š !0€€š0€€š0€€š !0€€š !0€€€š !0€€€š0€€€š0€€€š !0€€€š0€€€š0€€€š !0€€€š !0€€€š0€€€š0€€€š0€€€š0€€€š0€€€š0€€€š0€€€š !0€€€š !0€€š !0€€€š !0€€€š !0€€€š !0€€€š0€€€š0€€€š0€€€š !0€€€š !0€€€š !0€€€š !0 €€€š0€€€š0€€€š !0 €€€š !0 €€€š !0 €€€š !0 €€€š !0€€€š !0€€€š0€€€š0€€€š !0€€€š !0€€€š !0€€€š !0€€€š !0€€€š !0€€€š !0€€€š !0€€€š !0€€€š !0€€€š0€€€^^*ˆTWä4&&.X/ "%b Ïè¦à#i&/*S/X/!#$&W/&P[Pz…W4ÿ•€4ÿ•€ð@ð  @ñÿÿÿ€€€÷ð ððxð( ð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`T"ñ¿€ðð ð𜢠ð c ðR€Š¿ÿƒÃ.¿ ``T`T`T`T"ñ¿€ðð ðð’ðð0ð( ð ððB ðS ð¿Ëÿ ?ð*W¸ÿÿÿòÿÿÿSýµ@¸ÿÿÿòÿÿÿSýµ@v~ fÆû$O'P'V'Y'û$O'P'Y'v~ fÆú$Y'û$O'P'Y'ÿÿ Lothar MerkMerkMerkMerkMerkMerk Thomas KleinIBM-UserIBM-UserPeter ThompsonüûÿÿÿÎÜÖ-ÿÿÿÿÿþÿÿÿÿÿÿÿÿÔhXíz@ÿºo:éÈuÿzS0à–ÀÿXlhdmÿÿÿÿÿÿÿÿÿ'5ÄáÚÞÿÿÿÿÿÿÿÿÿ¢M‹ ÿ1Í ÿB-6ïr-ÿµÚj?fÿ4 tj?fÿ$Ù ÿö[' ÿ†ld0à–Àÿ„m"0à–Àÿvj?fÿßhš6ïr-ÿÿÿÿÿÿÿÿÿZk¤V"ÙÿßQ±š…6$ÿt-j?fÿñI% ÿÿÿÿÿÿÿÿÿGB j?fÿ…'”  ÿ¹¨ ÞaÊ–ÿ›}þ šŠƒÿ»@I 0à–Àÿ$0< 0à–Àÿo j?fÿŒ@  ÿ ¾  ÿà:.j?fÿO{Qj?fÿÿÿÿÿÿÿÿÿ¯F‰0à–ÀÿÀdÚ ÿVVU ÿ@I P´ eÿ`ç ò\ÿºY ÿ:ksP´ eÿêN†ÿzh ~`V÷ÿÿÿÿÿÿÿÿÿ¿Al0à–ÀÿtQcÿRùV"ÙÿTrròz ­ÿ?ÎfØFÿÿÿÿÿÿÿÿÿ ˆ ÿü=êj?fÿ‘,WXÊÿOuðj?fÿ3v䆸ŸÿÿÿÿÿÿÿÿÿîXjj?fÿ­IXÊÿ™öÄáÚÞÿÊ• ÿÁi³ ÿOË0à–Àÿ’ý$h"—ÿÿÿÿÿÿÿÿÿ _Ej?fÿàN˜éÈuÿÿÿÿÿÿÿÿÿK» ÿ®T0à–Àÿ/9[0à–ÀÿC_‡ ÿ‰bÞj?fÿL{0à–Àÿ·PÔj?fÿKL8 6ïr-ÿÑÆ j?fÿxcÈ 0à–ÀÿÙï šŠƒÿ±T!0à–Àÿœ¦!šŠƒÿaU¶" ÿêv·"$h"—ÿÿÿÿÿÿÿÿÿ•mØ" ÿ+K#j?fÿ½m$¶k@rÿIÿÿÿÿÿÿÿ_P‰$0à–Àÿ FÜ$اÔÿÿÿÿÿÿÿÿÿ‚l%0à–Àÿ©>@% ÿJVX%x,µÿ n&j?fÿL«' ÿ¾E¤)4-¢ ÿï)0à–Àÿ{k* ÿ r*j?fÿÿÿÿÿÿÿÿÿPCs*j?fÿÓH +ÿ7 ..žŒ6•"o.ÄáÚÞÿPi‘0øˆ-`d<ç0 ÿb;¡1ÄáÚÞÿ^G¨1V"Ùÿþ1Ã10à–Àÿßê10à–ÀÿÙ$2j?fÿd*Ž20à–Àÿ@Ÿ2ÄáÚÞÿrA°2䆸Ÿÿ2.3 ÿ¤FP3P´ eÿ$F50à–ÀÿÙ*7ÄáÚÞÿ”2§7j?fÿÿÿÿÿÿÿÿÿéMA8éÈuÿp(þ8 ÿ@ Ö9täŽýÿ¥}: ÿïcš:ì=.ÿÈFÅ:0à–Àÿ­ ;V"Ùÿ‘q};FîNÿ§-­;j?fÿ‰‰j?fÿŽ3™>éÈuÿÿÿÿÿÿÿÿÿçA7@j?fÿ®?l@j?fÿÊÅ@ E^xÿÿÿÿÿÿÿÿÿZæA ÿãUóAj?fÿ÷ùB0à–ÀÿuqCj?fÿF_C$h"—ÿÏC ÿã)DP´ eÿdKEj?fÿ.E ÿGuXE0à–Àÿ5t€Ej?fÿ{‡E0à–Àÿâ—EÄáÚÞÿÿÿÿÿÿÿÿÿp«EÄáÚÞÿÿÿÿÿÿÿÿÿŽx¸E ÿäE0à–Àÿ:¤F ÿ· ¦FV"ÙÿqJ«F4-¢ ÿtMG0à–Àÿt?Gj?fÿÛqBGj?fÿf»G ÿ–)Hj?fÿTVHØ"Žgÿÿÿÿÿÿÿÿÿ 6pH4-¢ ÿB›HÀDâŒÿÿÿÿÿÿÿÿÿGÁHÿ.PbJ ÿÐ{­KÄáÚÞÿÿÿÿÿÿÿÿÿIN™LÄáÚÞÿÿÿÿÿÿÿÿÿb-³Lÿðk‘Mj?fÿs#ºM ÿ#tÑN0à–Àÿ„$‡OXÊÿ>PšŠƒÿƒt¡PV"Ùÿ§!FQj?fÿ¡0ËQéÈuÿÃLôQ ÿÓT ÿ´g^Tj?fÿ`•Tt(øxÿ^F»TP´ eÿh ØU ÿc{V ÿx-^V0à–ÀÿõeWTñ–ÿr»WšŠƒÿv\YŠ Iÿs˜Y ÿj:šYéÈuÿÿÿÿÿÿÿÿÿÛp¦Y ÿúSC[j?fÿŒ&H[ ÿÕ=j[šŠƒÿ¹Hˆ[ÄáÚÞÿÿÿÿÿÿÿÿÿ}¤[ÄáÚÞÿ+%?\Xíz@d9+]$h"—ÿÿÿÿÿÿÿÿÿT"í] ÿí57^ÄáÚÞÿ·U•^0à–Àÿ0K_0à–Àÿ~`j?fÿ`Gû`؉¨Àÿÿÿÿÿÿÿÿÿ"AaìzÐeÿ_[`bP´ eÿ~c¬é„mÿÿÿÿÿÿÿÿÿ+ ‘cˆnªÚÿÿÿÿÿÿÿÿÿ`&d0à–ÀÿÜh‡d0à–ÀÿVDŠdj?fÿÇm½dØybzÿ³5ÿe0à–ÀÿaJƒgÄáÚÞÿÿÿÿÿÿÿÿÿo 5h0à–ÀÿÎ#Öh ÿÓøiÿVRekÄáÚÞÿÿÿÿÿÿÿÿÿøt5lÄáÚÞÿÿÿÿÿÿÿÿÿv2ÐlÄáÚÞÿÿÿÿÿÿÿÿÿmÄáÚÞÿÿÿÿÿÿÿÿÿ [ynÄáÚÞÿ=xòn ÿ?4®oÿ³oÿ8>Rp ÿ$rÄáÚÞÿŽyLsj?fÿlt6ïr-ÿÿÿÿÿÿÿÿÿ×8¥tüÆ®|ÿÿÿÿÿÿÿÿÿHqªtÿ8+•uP´ eÿà[–uÿ“*©u$h"—ÿÿÿÿÿÿÿÿÿgYÂu ÿÇa)vP´ eÿÇ|$w¾ú ÿA3wj?fÿ,®w0à–Àÿ×:ExÄáÚÞÿÿÿÿÿÿÿÿÿ<=Ûx ÿºgßx6ïr-ÿÿÿÿÿÿÿÿÿö yÿÚd/yj?fÿpioyj?fÿCooyj?fÿÍ|zz´:B7ÿÿÿÿÿÿÿÿÿ†{ ÿ›t´{ÿÿÿÿÿÿÿÿÿÿÿÿÿ 4Ð{6<½ÿSï{j?fÿÝI'|$h"—ÿÿÿÿÿÿÿÿÿ^Š|j?fÿH)õ| ÿ’A}0à–Àÿ+2}ÄáÚÞÿÿÿÿÿÿÿÿÿ`}ÄáÚÞÿhMÆ~j?fÿ%8î~0à–Àÿl^0à–ÀÿÚP›}þ KL8 r»WÙï †ld»@I GuXE$F5ï)$0< ,®w³5ÿe¯F‰zSéMA8ºo:¿Al±T!x-^V%8î~d*Ž2’A}„m"#tÑN‘q};äE‚l%l^þ1Ã1Üh‡dtMGßê1xcÈ ®T_P‰$7 .0K_ÈFÅ:OËo 5h·U•^{‡E`&d÷ùBL{/9[TrrúSC[~`–)H _E§!FQdKE§-­;´g^TîXjÑÆ Cooy‰bÞ8 ÙvPCs*Úd/y5t€E®?l@pioyhMÆ~ŽyLs^Š|‰‰<Sï{ÚOuð n&4 tü=ê·PÔÇm½d¢M‹Óøi¹¨ à[–uHqªt?4®oÓH +ö y³o…'” ÃLôQþÿÿÿ$|Þþÿÿÿx|ÞþÿÿÿÜ|ÞŽ3™>aJƒgêv·"9+]VRek“*©u’ý'5ÝI'|+2}¹Hˆ[O{Qv2ÐlÐ{­K×:Exøt5l r*â—Ep«EmIN™L”2§7ºgßxßhšltj:šYàN˜Ûp¦Ys#ºM$Ùp(þ8+K#H)õ|Ç|$wþÿÿÿ@}Þ ˆ¥}:™öh ØU†{gYÂu ¾ Ù*7$rPi‘0í57^ºY`} [yn@Ÿ2þÿÿÿ¤}Þ•"o.b;¡1}¤[<=Ûx`Gû`B-`ç•mØ"Žx¸EçA7@GB {k*t?Gc{VÎ#ÖhÏCA3wÁi³8+•uVVUVDŠdo Ù$2K»µÚÊ•"AauqCðk‘MÛqBGT"í]L«'8>Rp.PbJF_Cþÿÿÿ~Þ©>@%ZæAs˜YaU¶"7 .p~ÞŒ@ ö['ÀdÚ_[`b|~Þ.E‹6¢TuF=`•TJVX%JVX%ˆ~Þv\Yïcš: 4Ð{@I ­I„$‡O‘,W@ Ö9RùqJ«F¾E¤) 6pHRù”~Þ­ ;Zk¤^G¨1ƒt¡PÚGè· ¦FÇa)v¤FP3^F»Tã)D:ks"Aa ~Þt-ÓTõeWõeW¬~ÞßQ±ßQ±¸~Þd<ç0b-³LtQcêN†GÁH2.3+ ‘c+%?\3vrA°2ÔhþÿÿÿþÿÿÿÄ~Þÿþ×8¥tÿÿÿÿÿÿÿÿ{Þ` ˆ@e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿd{Þ`m@h „Є˜þ^„Ð`„˜þOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈ{Þ`l@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0|Þ Ê@CJ$OJ QJ o(" ÿÿÿÿ„|Þ @e „Š „›þ^„Š `„›þOJ QJ o(·ðÿÿÿÿè|Þ`c@e „Š „›þ^„Š `„›þOJ QJ o(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL}Þ @e „w„›þ^„w`„›þOJ QJ o(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°}Þ @e „w„›þ^„w`„›þOJQJo(-ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ~Þ s@„„åþ^„`„åþCJOJQJo(·ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐ~Þ @h„„^„`„OJQJ^Jo(·ðÿÿÿÿÿÿüÿÿü    ‚¸ :õ++Z\P#Pk ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û þÿà…ŸòùOh«‘+'³Ù0˜ÀÌàì $ @ L X dpx€ˆä Reference Toolkit Specificationefe Hezel, Uweoeze Normal.dotoPeter Thompsoni31eMicrosoft Word 10.0@´³! @. Kû¿@®Uñ¢À@âTÝï5Ä„wþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®L hp|„Œ” œ¤¬´ ¼ èäIBMCé$­  Reference Toolkit Specification TitleP :B_PID_LINKBASEäA  !"#$%&'þÿÿÿ)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZþÿÿÿ\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËþÿÿÿÍÎÏÐÑÒÓþÿÿÿÕÖרÙÚÛþÿÿÿýÿÿÿýÿÿÿßþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF`„*ûï5Äá€Data ÿÿÿÿÿÿÿÿÿÿÿÿ(àd1Tableÿÿÿÿ[žàWordDocumentÿÿÿÿ8NSummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿÌDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÔCompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qsyncevolution-1.5/src/synthesis/src/syncml_tk/opensource_license.txt0000644000373300037200000000426312424517753027752 0ustar00nightlyallusers00000000000000LICENSE The Copyright Holders of this software, including all accompanying documentation ("Software"), hereby grant, royalty free and for any purpose, permission to use, copy, modify and prepare derivative works therefrom, distribute, publish, sublicense and sell copies of the Software and to permit persons to whom the Software is furnished to do the same, all subject to the following conditions: 1. The complete text of the following noticeshall be reproduced on each copy or substantial copy of the Software in a location readily viewable to users of the Software: NOTICE Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001-2002). All Rights Reserved. Implementation of all or part of any Software may require licenses under third party intellectual property rights, including without limitation, patent rights. The Copyright Holders are not responsible and shall not be held responsible in any manner for identifying or failing to identify any or all such third party intellectual property rights. THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, NOKIA, OPENWAVE, PALM INC., PSION, STARFISH SOFTWARE, SYMBIAN AND ALL OTHER SYNCML SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., LTD, MOTOROLA, NOKIA, OPENWAVE, PALM INC., PSION, STARFISH SOFTWARE. SYMBIAN OR ANY OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE.syncevolution-1.5/src/synthesis/src/syncml_tk/src/0000755000373300037200000000000012424517753024107 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/0000755000373300037200000000000012424517753024702 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/SyncML.def0000755000373300037200000000471012424517753026534 0ustar00nightlyallusers00000000000000EXPORTS smlAddCmd smlAlertCmd smlAllocAdd smlAllocAlert smlAllocAtomic smlAllocChal smlAllocCopy smlAllocCred smlAllocDelete smlAllocDevInfCTCap smlAllocDevInfCTData smlAllocDevInfCTDataList smlAllocDevInfCTDataProp smlAllocDevInfCTDataPropList smlAllocDevInfCtcapList smlAllocDevInfDSMem smlAllocDevInfDatastore smlAllocDevInfDatastoreList smlAllocDevInfDevInf smlAllocDevInfExt smlAllocDevInfExtList smlAllocDevInfSyncCap smlAllocDevInfXmit smlAllocDevInfXmitList smlAllocExec smlAllocGeneric smlAllocGet smlAllocItem smlAllocItemList smlAllocMap smlAllocMapItem smlAllocMapItemList smlAllocMetInfAnchor smlAllocMetInfMem smlAllocMetInfMetInf smlAllocPcdata smlAllocPcdataList smlAllocPut smlAllocReplace smlAllocResults smlAllocSearch smlAllocSequence smlAllocSource smlAllocSourceList smlAllocSourceRefList smlAllocStatus smlAllocSync smlAllocSyncHdr smlAllocTarget smlAllocTargetRefList smlAllocUnknownProtoElement smlCopyCmd smlDeleteCmd smlEndAtomic smlEndMessage smlEndSequence smlEndSync smlExecCmd smlFreeAlert smlFreeAtomic smlFreeChalPtr smlFreeCredPtr smlFreeDevInfCTCap smlFreeDevInfCTData smlFreeDevInfCTDataList smlFreeDevInfCTDataProp smlFreeDevInfCTDataPropList smlFreeDevInfCtcapList smlFreeDevInfDSMem smlFreeDevInfDatastore smlFreeDevInfDatastoreList smlFreeDevInfDevInf smlFreeDevInfExt smlFreeDevInfExtList smlFreeDevInfSynccap smlFreeDevInfXmit smlFreeDevInfXmitList smlFreeExec smlFreeGeneric smlFreeGetPut smlFreeItemList smlFreeItemPtr smlFreeMap smlFreeMapItemList smlFreeMapItemPtr smlFreeMetinfAnchor smlFreeMetinfMem smlFreeMetinfMetinf smlFreePcdata smlFreePcdataList smlFreeProtoElement smlFreeResults smlFreeSearch smlFreeSourceList smlFreeSourceRefList smlFreeSourceTargetPtr smlFreeStatus smlFreeSync smlFreeSyncHdr smlFreeTargetRefList smlGetCmd smlGetFreeBuffer smlInit smlInitInstance smlLibFree smlLibMalloc smlLibMemcmp smlLibMemcpy smlLibMemmove smlLibMemset smlLibPrint smlLibRealloc smlLibStrcat smlLibStrchr smlLibStrcmp smlLibStrcpy smlLibStrdup smlLibStrlen smlLibStrncat smlLibStrncmp smlLibStrncpy smlLibStrstr smlLibVprintf smlLockReadBuffer smlLockWriteBuffer smlMapCmd smlPcdata2String smlPcdataDup smlProcessData smlPutCmd smlReplaceCmd smlResultsCmd smlSearchCmd smlSetCallbacks smlSetEncoding smlSetSyncMLOptions smlSetUserData smlStartAtomic smlStartMessage smlStartMessageExt smlStartSequence smlStartSync smlStatusCmd smlString2Pcdata smlTerminate smlTerminateInstance smlUnlockReadBuffer smlUnlockWriteBuffer smlStartEvaluation smlEndEvaluation syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/0000755000373300037200000000000012424517753025453 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/palm/0000755000373300037200000000000012424517753026404 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/palm/define.h0000755000373300037200000000635612424517753030024 0ustar00nightlyallusers00000000000000/** * @file * Compiler Flag Definition File * * @target_system palm * @target_os palm */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Palm OS Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __PALM_OS__ #define PILOT_PRECOMPILED_HEADERS_OFF #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC __attribute__ ((section ("lib"))) #define MGR_FUNC __attribute__ ((section ("mgr"))) #define WSM_FUNC __attribute__ ((section ("wsm"))) #define XLT_FUNC __attribute__ ((section ("xlt"))) // SyncML commands which are not required in a client can be switched off #define ATOMIC_SEND #define ATOMIC_RECEIVE #define COPY_SEND #define COPY_RECEIVE #define EXEC_SEND #define EXEC_RECEIVE #define MAP_RECEIVE #define MAPITEM_RECEIVE #define SEARCH_SEND #define SEARCH_RECEIVE #define SEQUENCE_SEND #define SEQUENCE_RECEIVE #define ADD_SEND #define GET_SEND #define RESULT_RECEIVE /* --- Toolkit a la Carte --- */ /* Compilerflags to include only subsets of the Toolkit functionality */ /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* Compiler Flag to include the XML Parsing Module */ #define __SML_XML__ /* Compiler Flag to include the WBXML Parsing Module */ #define __SML_WBXML__ /* Compiler Flag to include only the Minimum Toolkit functionality */ //#define __SML_LITE__ #define __USE_EXTENSIONS__ #define __USE_METINF__ #define __USE_DEVINF__ #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/sml.h0000755000373300037200000003113512424517753026425 0ustar00nightlyallusers00000000000000/** * @file * External SyncML API * * @target_system all * @target_os all * @description Platform independent definition of the SyncML API functions * This is the external API exposed to applications using SyncML */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _SML_H #define _SML_H /************************************************************************* * Definitions *************************************************************************/ #include #include /************************************************************************* * External Functions *************************************************************************/ #if !defined(NOWSM) || !__LINK_TOOLKIT_STATIC__ /* * ============================ * General SyncML Functions * ============================ */ SML_API_DEF Ret_t smlInit(SmlOptionsPtr_t pOptions); SML_API_DEF Ret_t smlSetSyncMLOptions (SmlOptionsPtr_t pOptions); SML_API_DEF Ret_t smlTerminate(void); #endif /* * ============================ * Workspace Handling Functions * ============================ */ SML_API_DEF Ret_t smlLockReadBuffer(InstanceID_t id, MemPtr_t *pReadPosition, MemSize_t *usedSize); SML_API_DEF Ret_t smlUnlockReadBuffer(InstanceID_t id, MemSize_t processedBytes); #ifdef NOWSM SML_API Ret_t smlSetMaxOutgoingSize(InstanceID_t id, MemSize_t maxOutgoingSize); SML_API Ret_t smlSetOutgoingBegin(InstanceID_t id); SML_API Ret_t smlReadOutgoingAgain(InstanceID_t id); SML_API Ret_t smlPeekMessageBuffer(InstanceID_t id, Boolean_t outgoing, MemPtr_t *message, MemSize_t *msgsize); #endif SML_API_DEF Ret_t smlLockWriteBuffer(InstanceID_t id, MemPtr_t *pWritePosition, MemSize_t *freeSize); SML_API_DEF Ret_t smlUnlockWriteBuffer(InstanceID_t id, MemSize_t writtenBytes); /* * =========================================== * Protocol Element Building Functions (for Originator) * =========================================== */ /* Protocol Management */ SML_API_DEF Ret_t smlStartMessage(InstanceID_t id, SmlSyncHdrPtr_t pContent); SML_API_DEF Ret_t smlStartMessageExt(InstanceID_t id, SmlSyncHdrPtr_t pContent, SmlVersion_t vers); /* %%% added by luz 2003-08-06) */ SML_API_DEF Ret_t smlEndMessage(InstanceID_t id, Boolean_t final); SML_API_DEF Ret_t smlStartSync(InstanceID_t id, SmlSyncPtr_t pContent); SML_API_DEF Ret_t smlEndSync(InstanceID_t id); #ifdef ATOMIC_SEND /* these API calls are NOT included in the Toolkit lite version */ SML_API_DEF Ret_t smlStartAtomic(InstanceID_t id, SmlAtomicPtr_t pContent); SML_API_DEF Ret_t smlEndAtomic(InstanceID_t id); #endif #ifdef SEQUENCE_SEND SML_API_DEF Ret_t smlStartSequence(InstanceID_t id, SmlSequencePtr_t pContent); SML_API_DEF Ret_t smlEndSequence(InstanceID_t id); #endif /* Sync Commands */ #ifdef ADD_SEND SML_API_DEF Ret_t smlAddCmd(InstanceID_t id, SmlAddPtr_t pContent); #endif SML_API_DEF Ret_t smlAlertCmd(InstanceID_t id, SmlAlertPtr_t pContent); SML_API_DEF Ret_t smlDeleteCmd(InstanceID_t id, SmlDeletePtr_t pContent); #ifdef GET_SEND SML_API_DEF Ret_t smlGetCmd(InstanceID_t id, SmlGetPtr_t pContent); #endif SML_API_DEF Ret_t smlPutCmd(InstanceID_t id, SmlPutPtr_t pContent); SML_API_DEF Ret_t smlMapCmd(InstanceID_t id, SmlMapPtr_t pContent); SML_API_DEF Ret_t smlResultsCmd(InstanceID_t id, SmlResultsPtr_t pContent); SML_API_DEF Ret_t smlStatusCmd(InstanceID_t id, SmlStatusPtr_t pContent); SML_API_DEF Ret_t smlReplaceCmd(InstanceID_t id, SmlReplacePtr_t pContent); #ifdef COPY_SEND /* these API calls are NOT included in the Toolkit lite version */ SML_API_DEF Ret_t smlCopyCmd(InstanceID_t id, SmlCopyPtr_t pContent); #endif SML_API_DEF Ret_t smlMoveCmd(InstanceID_t id, SmlMovePtr_t pContent); #ifdef EXEC_SEND SML_API_DEF Ret_t smlExecCmd(InstanceID_t id, SmlExecPtr_t pContent); #endif #ifdef SEARCH_SEND SML_API_DEF Ret_t smlSearchCmd(InstanceID_t id, SmlSearchPtr_t pContent); #endif SML_API_DEF Ret_t smlStartEvaluation(InstanceID_t id); SML_API_DEF Ret_t smlEndEvaluation(InstanceID_t id, MemSize_t *freemem); /* * ============================================ * Command Dispatching Functions (for Receiver) * ============================================ */ SML_API_DEF Ret_t smlProcessData(InstanceID_t id, SmlProcessMode_t mode); /* * ==================================================== * Callback Functions to be implemented by the Receiver * ==================================================== */ /* Protocol Management */ typedef Ret_t (*smlStartMessageFunc) (InstanceID_t id, VoidPtr_t userData, SmlSyncHdrPtr_t pContent); typedef Ret_t (*smlEndMessageFunc) (InstanceID_t id, VoidPtr_t userData, Boolean_t final); typedef Ret_t (*smlStartSyncFunc) (InstanceID_t id, VoidPtr_t userData, SmlSyncPtr_t pContent); typedef Ret_t (*smlEndSyncFunc) (InstanceID_t id, VoidPtr_t userData); #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ typedef Ret_t (*smlStartAtomicFunc) (InstanceID_t id, VoidPtr_t userData, SmlAtomicPtr_t pContent); typedef Ret_t (*smlEndAtomicFunc) (InstanceID_t id, VoidPtr_t userData); #endif #ifdef SEQUENCE_RECEIVE typedef Ret_t (*smlStartSequenceFunc) (InstanceID_t id, VoidPtr_t userData, SmlSequencePtr_t pContent); typedef Ret_t (*smlEndSequenceFunc) (InstanceID_t id, VoidPtr_t userData); #endif /* Sync Commands */ typedef Ret_t (*smlAddCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlAddPtr_t pContent); typedef Ret_t (*smlAlertCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlAlertPtr_t pContent); typedef Ret_t (*smlDeleteCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlDeletePtr_t pContent); typedef Ret_t (*smlGetCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlGetPtr_t pContent); typedef Ret_t (*smlPutCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlPutPtr_t pContent); #ifdef MAP_RECEIVE typedef Ret_t (*smlMapCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlMapPtr_t pContent); #endif #ifdef RESULT_RECEIVE typedef Ret_t (*smlResultsCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlResultsPtr_t pContent); #endif typedef Ret_t (*smlStatusCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlStatusPtr_t pContent); typedef Ret_t (*smlReplaceCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlReplacePtr_t pContent); #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ typedef Ret_t (*smlCopyCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlCopyPtr_t param); #endif #ifdef EXEC_RECEIVE typedef Ret_t (*smlExecCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlExecPtr_t pContent); #endif #ifdef SEARCH_RECEIVE typedef Ret_t (*smlSearchCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlSearchPtr_t pContent); #endif typedef Ret_t (*smlMoveCmdFunc) (InstanceID_t id, VoidPtr_t userData, SmlMovePtr_t param); /* Other Callbacks */ typedef Ret_t (*smlHandleErrorFunc) (InstanceID_t id, VoidPtr_t userData); typedef Ret_t (*smlTransmitChunkFunc) (InstanceID_t id, VoidPtr_t userData); /** * Structure defining references to the applications callback implementations **/ typedef struct sml_callbacks_s { /* Protocol Management Callbacks */ smlStartMessageFunc startMessageFunc; smlEndMessageFunc endMessageFunc; smlStartSyncFunc startSyncFunc; smlEndSyncFunc endSyncFunc; #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ smlStartAtomicFunc startAtomicFunc; smlEndAtomicFunc endAtomicFunc; #endif #ifdef SEQUENCE_RECEIVE smlStartSequenceFunc startSequenceFunc; smlEndSequenceFunc endSequenceFunc; #endif /* Sync Command callbacks */ smlAddCmdFunc addCmdFunc; smlAlertCmdFunc alertCmdFunc; smlDeleteCmdFunc deleteCmdFunc; smlGetCmdFunc getCmdFunc; smlPutCmdFunc putCmdFunc; #ifdef MAP_RECEIVE smlMapCmdFunc mapCmdFunc; #endif #ifdef RESULT_RECEIVE smlResultsCmdFunc resultsCmdFunc; #endif smlStatusCmdFunc statusCmdFunc; smlReplaceCmdFunc replaceCmdFunc; #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ smlCopyCmdFunc copyCmdFunc; #endif #ifdef EXEC_RECEIVE smlExecCmdFunc execCmdFunc; #endif #ifdef SEARCH_RECEIVE smlSearchCmdFunc searchCmdFunc; #endif smlMoveCmdFunc moveCmdFunc; /* Other Callbacks */ smlHandleErrorFunc handleErrorFunc; smlTransmitChunkFunc transmitChunkFunc; //smlPrintFunc printFunc; } *SmlCallbacksPtr_t, SmlCallbacks_t; typedef const SmlCallbacks_t *SmlCallbacksCPtr_t; /* * ============================ * Instance Management Functions * ============================ */ SML_API_DEF Ret_t smlInitInstance(SmlCallbacksCPtr_t pCallbacks, SmlInstanceOptionsPtr_t pOptions, VoidPtr_t pUserData, InstanceID_t *pId); SML_API_DEF Ret_t smlTerminateInstance (InstanceID_t id); SML_API_DEF Ret_t smlSetCallbacks (InstanceID_t id, SmlCallbacksCPtr_t pCallbacks); SML_API_DEF Ret_t smlSetUserData (InstanceID_t id, VoidPtr_t pUserData); // added by luz %%%: SML_API Ret_t smlGetUserData(InstanceID_t id, VoidPtr_t *ppUserData); SML_API Ret_t smlGetEncoding(InstanceID_t id, SmlEncoding_t *pEncoding); #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ SML_API_DEF Ret_t smlSetEncoding (InstanceID_t id, SmlEncoding_t encoding); #endif /* * =================================== * Some Helper Functions and Utilities * =================================== */ SML_API_DEF Ret_t smlFreeProtoElement(VoidPtr_t pProtoElement); SML_API_DEF void smlFreePcdata(SmlPcdataPtr_t pPcdata); #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ SML_API_DEF String_t smlPcdata2String( SmlPcdataPtr_t pcdata ); SML_API_DEF SmlPcdataPtr_t smlString2Pcdata( String_t str ); SML_API_DEF SmlPcdataPtr_t smlPcdataDup(SmlPcdataPtr_t pcdata); SML_API_DEF MemSize_t smlGetFreeBuffer(InstanceID_t id); #endif #ifndef __PALM_OS__ /* these API calls are NOT exported in the Palm OS version */ SML_API_DEF MemSize_t smlLibMemsize(const void *pObject); SML_API_DEF String_t smlLibStrdup (const char *constStringP); SML_API_DEF String_t smlLibStrcpy(const char *pTarget, const char *pSource); SML_API_DEF int smlLibStrcmp(const char *pTarget, const char *pSource); SML_API_DEF int smlLibStrlen(const char *pString); SML_API_DEF String_t smlLibStrncpy(const char *pTarget, const char *pSource, int count); SML_API_DEF int smlLibStrncmp(const char *pTarget, const char *pSource, int count); SML_API_DEF String_t smlLibStrcat(const char *pTarget, const char *pSource); SML_API_DEF String_t smlLibStrchr(const char *pString, char character); #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ SML_API_DEF void smlLibPrint(const char *text, ...); SML_API_DEF String_t smlLibStrncat(const char *pTarget, const char *pSource, int count); SML_API_DEF String_t smlLibStrstr(const char *pString, const char *pSubString); #endif #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/smldef.h0000755000373300037200000001532612424517753027110 0ustar00nightlyallusers00000000000000/** * @file * Type definitions for SyncML * * @target_system all * @target_os all * * @description Platform independent header with syncML types and definitions */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _SML_DEF_H #define _SML_DEF_H /************************************************************************* * Definitions *************************************************************************/ /** * include target/compiler specific defines/options/settings */ #include "define.h" #ifdef HAVE_STDINT_H # include #endif /* * =================================== * Common all-purpose type definitions * =================================== */ /* * ================================== * Basic data types * ================================== */ typedef short Short_t; /**< short integer, 16 Bytes */ typedef long Long_t; /**< long integer, 32 Bytes */ typedef char* String_t; /**< String pointer, */ typedef unsigned char Byte_t; /**< a single byte */ typedef Byte_t Boolean_t; /**< a boolean */ #ifndef NULL /**< a NULL pointer */ #define NULL (void*) 0 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif typedef Short_t Ret_t; /**< Return Type of API Commands */ typedef Short_t MemHandle_t; /**< Memory object Handle */ typedef unsigned char *MemPtr_t; /**< Memory object Pointer */ typedef void *VoidPtr_t; /**< Void Pointer */ #ifdef HAVE_STDINT_H typedef uintptr_t Length_t; /**< System dependent string length */ typedef uintptr_t MemSize_t; /**< System dependent memory object size */ #else typedef Long_t Length_t; /**< System dependent string length */ typedef Long_t MemSize_t; /**< System dependent memory object size */ #endif typedef unsigned char MemByte_t; /**< Memory element */ typedef unsigned int Flag_t; /**< A generic flag type. This type is * used to declare variables in structures * wherever flags are used. */ /* * ================================== * Definitions used in the SyncML API * ================================== */ /** * Application callback function displaying output strings to the user */ typedef void (*smlPrintFunc) (String_t outputString); #ifdef NOWSM /** * structure describing the options and setting of this syncml process */ typedef struct sml_options_s { smlPrintFunc defaultPrintFunc; /**< default application callback for displaying strings, */ MemSize_t maxWorkspaceAvailMem; /**< size which all workspaces in total MUST not exceed */ } *SmlOptionsPtr_t, SmlOptions_t; #endif /** * Reference of an instance */ #ifdef NOWSM typedef void *InstanceID_t; /**< without wsm, instance ID is direct pointer to instance info */ #else typedef MemHandle_t InstanceID_t; /**< Handle, used as a unique ID of * an synchronization instance */ #endif /** * Type of used encoding */ typedef enum { SML_UNDEF = 0, SML_WBXML, SML_XML } SmlEncoding_t; /** * SyncML version */ // %%% added luz 2003-07-31: // %%% added DS 1.2 luz 2005-08-17: typedef enum { SML_VERS_UNDEF = 0, SML_VERS_1_0, SML_VERS_1_1, SML_VERS_1_2, SML_NUM_VERS } SmlVersion_t; /** * structure describing the options of an instance, */ typedef struct sml_instance_options_s { SmlEncoding_t encoding; /**< Used encoding type, */ MemSize_t workspaceSize; /**< size of the workspace to allocate (instance buffer size if NOWSM defined) */ #ifndef NOWSM String_t workspaceName; /**< name of the workspace */ #else MemSize_t maxOutgoingSize; /**< max size of outgoing message, 0 if no restriction */ #endif } *SmlInstanceOptionsPtr_t, SmlInstanceOptions_t; /** * Processing modes */ typedef enum { SML_DO_NOTHING = 0, SML_FIRST_COMMAND, SML_NEXT_COMMAND, SML_NEXT_MESSAGE, SML_ALL_COMMANDS } SmlProcessMode_t; /** * Requested buffer pointer position */ typedef enum { SML_FIRST_DATA_ITEM = 0, SML_FIRST_FREE_ITEM } SmlBufPtrPos_t; /** * SyncML Protocol Management and Command Elements (PE) */ typedef enum { SML_PE_UNDEF = 0, SML_PE_ERROR, SML_PE_ADD, SML_PE_ALERT, SML_PE_ATOMIC_START, SML_PE_ATOMIC_END, SML_PE_COPY, SML_PE_DELETE, SML_PE_EXEC, SML_PE_GET, SML_PE_MAP, SML_PE_PUT, SML_PE_RESULTS, SML_PE_SEARCH, SML_PE_SEQUENCE_START, SML_PE_SEQUENCE_END, SML_PE_STATUS, SML_PE_SYNC_START, SML_PE_SYNC_END, SML_PE_REPLACE, SML_PE_HEADER, SML_PE_PUT_GET, SML_PE_CMD_GROUP, SML_PE_GENERIC, SML_PE_FINAL, /* %%% Added 2005-08-17 by synthesis/luz for DS 1.2 */ SML_PE_MOVE } SmlProtoElement_t; #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/smldevinfdtd.h0000755000373300037200000001617112424517753030320 0ustar00nightlyallusers00000000000000/** * @file * SyncML Device Information DTD specific type definitions * * @target_system all * @target_os all * @description Definition of structures representing DevInf DTD elements * This file reflects DevInf as specified in the document * http://www.openmobilealliance.org/tech/affiliates/syncml/syncml_devinf_v101_20010615.pdf */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _SML_DEVINFDTD_H #define _SML_DEVINFDTD_H /* process only if we really use DevInf DTD */ #ifdef __USE_DEVINF__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include #include typedef struct sml_devinf_ext_s { SmlPcdataPtr_t xnam; SmlPcdataListPtr_t xval; /* optional */ } *SmlDevInfExtPtr_t, SmlDevInfExt_t; typedef struct sml_devinf_extlist_s { SmlDevInfExtPtr_t data; struct sml_devinf_extlist_s *next; } *SmlDevInfExtListPtr_t, SmlDevInfExtList_t; typedef struct sml_devinf_synccap_s { SmlPcdataListPtr_t synctype; } *SmlDevInfSyncCapPtr_t, SmlDevInfSyncCap_t; typedef struct sml_devinf_ctdata_s { SmlPcdataPtr_t name; SmlPcdataPtr_t dname; /* optional, display name */ SmlPcdataListPtr_t valenum; SmlPcdataPtr_t datatype; SmlPcdataPtr_t maxsize; // called size before DS 1.2 (still represents devInf for DS 1.1/1.0) /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ SmlPcdataPtr_t maxoccur; Flag_t flags; // } *SmlDevInfCTDataPtr_t, SmlDevInfCTData_t; typedef struct sml_devinf_ctdatalist_s { SmlDevInfCTDataPtr_t data; struct sml_devinf_ctdatalist_s *next; } *SmlDevInfCTDataListPtr_t, SmlDevInfCTDataList_t; typedef struct sml_devinf_ctdataprop_s { SmlDevInfCTDataPtr_t prop; SmlDevInfCTDataListPtr_t param; } *SmlDevInfCTDataPropPtr_t, SmlDevInfCTDataProp_t; typedef struct sml_devinf_ctdataproplist_s { SmlDevInfCTDataPropPtr_t data; struct sml_devinf_ctdataproplist_s *next; } *SmlDevInfCTDataPropListPtr_t, SmlDevInfCTDataPropList_t; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ typedef struct sml_devinf_filtercap_s { SmlPcdataPtr_t cttype; SmlPcdataPtr_t verct; SmlPcdataListPtr_t filterkeyword; SmlPcdataListPtr_t propname; } *SmlDevInfFilterCapPtr_t, SmlDevInfFilterCap_t; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ typedef struct sml_devinf_filtercaplist_s { SmlDevInfFilterCapPtr_t data; struct sml_devinf_filtercaplist_s *next; } *SmlDevInfFilterCapListPtr_t, SmlDevInfFilterCapList_t; typedef struct sml_devinf_ctcap_s { SmlPcdataPtr_t cttype; SmlPcdataPtr_t verct; // new for DS 1.2 SmlDevInfCTDataPropListPtr_t prop; Flag_t flags; // SmlDevInfFieldLevel_f, opt. } *SmlDevInfCTCapPtr_t, SmlDevInfCTCap_t; typedef struct sml_devinf_ctcaplist_s { SmlDevInfCTCapPtr_t data; struct sml_devinf_ctcaplist_s *next; } *SmlDevInfCtcapListPtr_t, SmlDevInfCtcapList_t; typedef struct sml_devinf_dsmem_s { SmlPcdataPtr_t maxmem; /* optional */ SmlPcdataPtr_t maxid; /* optional */ Flag_t flags; /* %%% luz:2003-04-28, made sharedMem a flag, was PCData (completely wrong) */ } *SmlDevInfDSMemPtr_t, SmlDevInfDSMem_t; typedef struct sml_devinf_xmit_s { SmlPcdataPtr_t cttype; SmlPcdataPtr_t verct; } *SmlDevInfXmitPtr_t, SmlDevInfXmit_t; typedef struct sml_devinf_xmitlist_s { SmlDevInfXmitPtr_t data; struct sml_devinf_xmitlist_s *next; } *SmlDevInfXmitListPtr_t, SmlDevInfXmitList_t; typedef struct sml_devinf_datastore_s { SmlPcdataPtr_t sourceref; SmlPcdataPtr_t displayname; /* optional */ SmlPcdataPtr_t maxguidsize; /* optional */ SmlDevInfXmitPtr_t rxpref; SmlDevInfXmitListPtr_t rx; /* optional */ SmlDevInfXmitPtr_t txpref; SmlDevInfXmitListPtr_t tx; /* optional */ SmlDevInfDSMemPtr_t dsmem; /* optional */ SmlDevInfSyncCapPtr_t synccap; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ SmlDevInfXmitListPtr_t filterrx; /* optional */ SmlDevInfCtcapListPtr_t ctcap; // opt., Datastore-local >=DS1.2 type list SmlDevInfFilterCapListPtr_t filtercap; // opt., filter capabilities list Flag_t flags; // SmlDevInfHierarchical_f, opt. } *SmlDevInfDatastorePtr_t, SmlDevInfDatastore_t; typedef struct sml_devinf_datastorelist_s { SmlDevInfDatastorePtr_t data; struct sml_devinf_datastorelist_s *next; } *SmlDevInfDatastoreListPtr_t, SmlDevInfDatastoreList_t; typedef struct sml_devinf_devinf_s { SmlPcdataPtr_t verdtd; SmlPcdataPtr_t man; /* optional */ SmlPcdataPtr_t mod; /* optional */ SmlPcdataPtr_t oem; /* optional */ SmlPcdataPtr_t fwv; /* optional */ SmlPcdataPtr_t swv; /* optional */ SmlPcdataPtr_t hwv; /* optional */ SmlPcdataPtr_t devid; SmlPcdataPtr_t devtyp; SmlDevInfDatastoreListPtr_t datastore; SmlDevInfCtcapListPtr_t ctcap; // opt., global pre-DS 1.2 type list SmlDevInfExtListPtr_t ext; /* SCTSTK - 18/03/2002, S.H. 2002-04-05 : SyncML 1.1 */ Flag_t flags; } *SmlDevInfDevInfPtr_t, SmlDevInfDevInf_t; #endif // __USE_DEVINF__ #endif //_SML_DEVINFDTD_H_ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/smldtd.h0000755000373300037200000003433612424517753027127 0ustar00nightlyallusers00000000000000/** * @file * SyncML DTD specific type definitions * * @target_system all * @target_os all * @description Definition of structures representing DTD elements */ /********************************************************************/ /* @note */ /* These definitions are based on the DTD dated from July, 7th, 00 */ /********************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _SML_DTD_H #define _SML_DTD_H /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include /** * =========================== * Common used SyncML Elements * =========================== */ /** * PCDATA - types of synchronization data which SyncML supports */ typedef enum { SML_PCDATA_UNDEFINED = 0, SML_PCDATA_STRING, /**< String type */ SML_PCDATA_OPAQUE, /**< Opaque type */ SML_PCDATA_EXTENSION, /**< Extention type - specified by PcdataExtension_t */ SML_PCDATA_CDATA /**< XML CDATA type */ } SmlPcdataType_t; /** * PCDATA - types of extensions for PCData elements */ typedef enum { SML_EXT_UNDEFINED = 0, SML_EXT_METINF, /**< Meta Information */ SML_EXT_DEVINF, /**< Device Information */ SML_EXT_LAST /**< last codepage, needed for loops! */ } SmlPcdataExtension_t; /** * PCDATA - into this structure SyncML wraps the synchronization data itself */ typedef struct sml_pcdata_s { SmlPcdataType_t contentType; /**< The type of data which a PCDATA structure contains */ SmlPcdataExtension_t extension; /**< PCData Extension type */ MemSize_t length; /**< length of the data in this PCDATA structure */ VoidPtr_t content; /**< Pointer to the data itself */ } *SmlPcdataPtr_t, SmlPcdata_t; /** generic list of PCData elements */ typedef struct sml_pcdata_list_s { SmlPcdataPtr_t data; struct sml_pcdata_list_s *next; } *SmlPcdataListPtr_t, SmlPcdataList_t; /* * Various flags which are actually declared and (EMPTY) elements in * SyncML. This assumes at least a 16-bit architecture for the * underlying OS. We need to review this if that is deemed a problem. */ #define SmlArchive_f 0x8000 /**< Delete flags */ #define SmlSftDel_f 0x4000 /**< Delete flags */ #define SmlMoreData_f 0x0400 /**< MoreData flag */ #define SmlNoResults_f 0x0200 /**< No Results flag */ #define SmlNoResp_f 0x0100 /**< No Response flag */ #define SmlFinal_f 0x0001 /**< Header flag */ #ifdef __USE_METINF__ #define SmlMetInfSharedMem_f 0x0002 /**< MetInf Shared Memory Flag */ /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ #define SmlMetInfFieldLevel_f 0x0004 /**< MetInf FieldLevel Flag */ #endif #ifdef __USE_DEVINF__ #define SmlDevInfSharedMem_f 0x0004 /**< DevInf Shared Memory Flag */ /* SCTSTK - 18/03/2002, S.H. 2002-04-05 : SyncML 1.1 */ #define SmlDevInfUTC_f 0x0001 /**< DevInf utc Flag */ #define SmlDevInfNOfM_f 0x0002 /**< DevInf support n of m Flag */ #define SmlDevInfLargeObject_f 0x0008 /**< DevInf support large object Flag */ /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ #define SmlDevInfFieldLevel_f 0x0010 /**< DevInf support field level replaces */ #define SmlDevInfNoTruncate_f 0x0020 /**< DevInf support noTruncate Flag */ #define SmlDevInfHierarchical_f 0x0040 /**< DevInf support SupportHierarchicalSync Flag */ #endif /** * Chal */ typedef struct sml_chal_s { SmlPcdataPtr_t meta; } *SmlChalPtr_t, SmlChal_t; /** * Credentials */ typedef struct sml_cred_s { SmlPcdataPtr_t meta; // opt. SmlPcdataPtr_t data; } *SmlCredPtr_t, SmlCred_t; /* forward declaration as item is used in filter which is used in target which is used in item itself */ //typedef struct sml_item_s; /** * Record or Field level filter * %%% Added 2005-08-17 by synthesis/luz for DS 1.2 */ typedef struct sml_record_or_field_filter_s { struct sml_item_s *item; } *SmlRecordOrFieldFilterPtr_t, SmlRecordOrFieldFilter_t; /** * Filter * %%% Added 2005-08-17 by synthesis/luz for DS 1.2 */ typedef struct sml_filter_s { SmlPcdataPtr_t meta; SmlRecordOrFieldFilterPtr_t field; // opt. SmlRecordOrFieldFilterPtr_t record; // opt. SmlPcdataPtr_t filtertype; // opt. } *SmlFilterPtr_t, SmlFilter_t; /** * Source or target parent location * %%% Added 2005-08-17 by synthesis/luz for DS 1.2 */ typedef struct sml_source_or_target_parent_s { SmlPcdataPtr_t locURI; } *SmlSourceParentPtr_t, SmlSourceParent_t, *SmlTargetParentPtr_t, SmlTargetParent_t; /** * Source or target location */ typedef struct sml_source_or_target_s { SmlPcdataPtr_t locURI; SmlPcdataPtr_t locName; // opt. SmlFilterPtr_t filter; // opt., for target only } *SmlSourcePtr_t, SmlSource_t, *SmlTargetPtr_t, SmlTarget_t; typedef struct sml_source_list_s { SmlSourcePtr_t source; struct sml_source_list_s *next; } *SmlSourceListPtr_t, SmlSourceList_t; /* * ============================== * SyncML Message Header Elements * ============================== */ /** * SyncML header * As the header is needed for each SyncML message, it's also the parameter * of the startMessage call. */ typedef struct sml_sync_hdr_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t version; SmlPcdataPtr_t proto; SmlPcdataPtr_t sessionID; SmlPcdataPtr_t msgID; Flag_t flags; // NoResp SmlTargetPtr_t target; SmlSourcePtr_t source; SmlPcdataPtr_t respURI; // opt. SmlCredPtr_t cred; // opt. SmlPcdataPtr_t meta; // opt. } *SmlSyncHdrPtr_t, SmlSyncHdr_t; // SyncML Body and SyncML container is not needed, as there are function calls // (smlStartMessage(), smlEndMessage()) that let the framework know when to start and end // the SyncML document /* * ========================= * Data description elements * ========================= */ /** * Auxiliary data added by layer above SMLTK. * Actual data will be in derived types that * are not visible to SMLTK. */ typedef struct sml_item_aux_s { void (*freeAux)(struct sml_item_aux_s *ptr); // Frees the aux instance. } *SmlItemAuxPtr_t, SmlItemAux_t; /** * Data in SyncML is encapsulated in an "item" element. */ typedef struct sml_item_s { SmlTargetPtr_t target; // opt. SmlSourcePtr_t source; // opt. SmlTargetParentPtr_t targetParent; // opt. (Added by luz 2005-08-17 for DS 1.2) SmlSourceParentPtr_t sourceParent; // opt. (Added by luz 2005-08-17 for DS 1.2) SmlPcdataPtr_t meta; // opt. SmlPcdataPtr_t data; // opt. Flag_t flags; // opt. for MoreData SmlItemAuxPtr_t aux; // for use by level above SMLTK } *SmlItemPtr_t, SmlItem_t; typedef struct sml_item_list_s { SmlItemPtr_t item; struct sml_item_list_s *next; } *SmlItemListPtr_t, SmlItemList_t; /* * ============================================== * SyncML Commands (Protocol Management Elements) * ============================================== */ /** * Generic commands: * Add, Copy, Replace, Delete, Move (added for DS 1.2, 2005-08-17 by luz) */ typedef struct sml_generic_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp, Archive (Delete), SftDel (Delete) SmlCredPtr_t cred; // opt. SmlPcdataPtr_t meta; // opt. SmlItemListPtr_t itemList; } *SmlAddPtr_t, SmlAdd_t, *SmlCopyPtr_t, SmlCopy_t, *SmlMovePtr_t, SmlMove_t, *SmlReplacePtr_t, SmlReplace_t, *SmlDeletePtr_t, SmlDelete_t, *SmlGenericCmdPtr_t, SmlGenericCmd_t; /** * Alert command: */ typedef struct sml_alert_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp SmlCredPtr_t cred; // opt. SmlPcdataPtr_t data; // opt. SmlItemListPtr_t itemList; } *SmlAlertPtr_t, SmlAlert_t; /** * Atomic/Sequence command: */ typedef struct sml_atomic_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp SmlPcdataPtr_t meta; // opt. } *SmlAtomicPtr_t, SmlAtomic_t, *SmlSequencePtr_t, SmlSequence_t; /** * Sync command: */ typedef struct sml_sync_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp SmlCredPtr_t cred; // opt. SmlTargetPtr_t target; // opt. SmlSourcePtr_t source; // opt. SmlPcdataPtr_t meta; // opt. SmlPcdataPtr_t noc; // opt. (SyncML 1.1) } *SmlSyncPtr_t, SmlSync_t; /** * Exec command: */ typedef struct sml_exec_s { SmlProtoElement_t elementType; SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp SmlCredPtr_t cred; // opt. SmlPcdataPtr_t meta; // opt. SmlItemPtr_t item; } *SmlExecPtr_t, SmlExec_t; /** * Get and Put command: */ typedef struct sml_get_put_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp SmlPcdataPtr_t lang; // opt. SmlCredPtr_t cred; // opt. SmlPcdataPtr_t meta; // opt. SmlItemListPtr_t itemList; } *SmlPutPtr_t, SmlPut_t, *SmlGetPtr_t, SmlGet_t; /** * Map command: */ typedef struct sml_map_item_s { SmlTargetPtr_t target; SmlSourcePtr_t source; } *SmlMapItemPtr_t, SmlMapItem_t; typedef struct sml_map_item_list_s { SmlMapItemPtr_t mapItem; struct sml_map_item_list_s *next; } *SmlMapItemListPtr_t, SmlMapItemList_t; typedef struct sml_map_s { SmlProtoElement_t elementType; // InternalToolkit Field SmlPcdataPtr_t cmdID; SmlTargetPtr_t target; SmlSourcePtr_t source; SmlCredPtr_t cred; // opt. SmlPcdataPtr_t meta; // opt. SmlMapItemListPtr_t mapItemList; } *SmlMapPtr_t, SmlMap_t; /** * Results command: */ typedef struct sml_results_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; SmlPcdataPtr_t msgRef; // opt. SmlPcdataPtr_t cmdRef; SmlPcdataPtr_t meta; // opt. SmlPcdataPtr_t targetRef; // opt. SmlPcdataPtr_t sourceRef; // opt. SmlItemListPtr_t itemList; } *SmlResultsPtr_t, SmlResults_t; /** * Search command: */ typedef struct sml_search_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; Flag_t flags; // NoResp, NoResults SmlCredPtr_t cred; // opt. SmlTargetPtr_t target; // opt. SmlSourceListPtr_t sourceList; SmlPcdataPtr_t lang; // opt. SmlPcdataPtr_t meta; SmlPcdataPtr_t data; } *SmlSearchPtr_t, SmlSearch_t; /** * Status command: */ typedef struct sml_target_ref_list_s { SmlPcdataPtr_t targetRef; struct sml_target_ref_list_s *next; } *SmlTargetRefListPtr_t, SmlTargetRefList_t; typedef struct sml_source_ref_list_s { SmlPcdataPtr_t sourceRef; struct sml_source_ref_list_s *next; } *SmlSourceRefListPtr_t, SmlSourceRefList_t; typedef struct sml_status_s { SmlProtoElement_t elementType; // Internal Toolkit Field SmlPcdataPtr_t cmdID; SmlPcdataPtr_t msgRef; // Opt. SmlPcdataPtr_t cmdRef; SmlPcdataPtr_t cmd; SmlTargetRefListPtr_t targetRefList; // opt. SmlSourceRefListPtr_t sourceRefList; // opt. SmlCredPtr_t cred; // opt. SmlChalPtr_t chal; // opt. SmlPcdataPtr_t data; SmlItemListPtr_t itemList; // opt. } *SmlStatusPtr_t, SmlStatus_t; /** * a little helper for typecasting */ typedef struct sml_unknown_proto_element_s { SmlProtoElement_t elementType; // Internal Toolkit Field } *SmlUnknownProtoElementPtr_t, SmlUnknownProtoElement_t; #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/smlerr.h0000755000373300037200000001354612424517753027144 0ustar00nightlyallusers00000000000000/** * @file * ErrorLibrary * * @target_system all * @target_os all * @description Definition of the used Error Codes */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _SML_ERR_H #define _SML_ERR_H /************************************************************************* * Definitions *************************************************************************/ /* * No error, success code */ #define SML_ERR_OK 0x00 /**< OK */ #define SML_ERR_CONTINUE 0x01 /**< OK, but processing of message not finished yet (smlProcessData(NEXT_COMMAND) case) */ /* * SyncML Common Error Codes */ // general errors #define SML_ERR_UNSPECIFIC 0x10 /**< unspecific error */ #define SML_ERR_NOT_ENOUGH_SPACE 0x11 /**< not enough memory to perform this operation */ #define SML_ERR_WRONG_USAGE 0x13 /**< function was called in wrong context */ // wrong parameters #define SML_ERR_WRONG_PARAM 0x20 /**< wrong parameter */ #define SML_ERR_INVALID_SIZE 0x21 /**< param has an invalid size */ #define SML_ERR_INVALID_HANDLE 0x22 /**< if handle is invalid/unknown */ #define SML_ERR_INVALID_OPTIONS 0x23 /**< unkown or unallowed options */ /* * SyncML Mgr Error Codes */ #define SML_ERR_A_MGR_ERROR 0x1001 /**< a template */ #define SML_ERR_MGR_INVALID_INSTANCE_INFO 0x1002 /**< a invalid Instance Info structure is used */ #define SML_ERR_COMMAND_NOT_HANDLED 0x1003 /**< no callback function is available to handle this command */ #define SML_ERR_ALREADY_INITIALIZED 0x1004 /**< Mgr allready initialized */ /* * SyncML Xlt Error Codes */ #define SML_ERR_XLT_MISSING_CONT 0x2001 /**< required field content missing */ #define SML_ERR_XLT_BUF_ERR 0x2002 /**< Buffer too small */ #define SML_ERR_XLT_INVAL_PCDATA_TYPE 0x2003 /**< Invalid (WBXML) Element Type (STR_I etc.) */ #define SML_ERR_XLT_INVAL_LIST_TYPE 0x2004 /**< Invalid List Type (COL_LIST etc.) */ #define SML_ERR_XLT_INVAL_TAG_TYPE 0x2005 /**< Invalid Tag Type (TT_BEG etc.) */ #define SML_ERR_XLT_ENC_UNK 0x2007 /**< Unknown Encoding (WBXML, XML) */ #define SML_ERR_XLT_INVAL_PROTO_ELEM 0x2008 /**< Invalid Protocol Element (ADD, Delete, ...) */ #define SML_ERR_MISSING_LIST_ELEM 0x2009 /**< Missing Content of List Elements */ #define SML_ERR_XLT_INCOMP_WBXML_VERS 0x200A /**< Incompatible WBXML Content Format Version */ #define SML_ERR_XLT_INVAL_SYNCML_DOC 0x200B /**< Document does not conform to SyncML DTD */ #define SML_ERR_XLT_INVAL_PCDATA 0x200C /**< Invalid PCData elem (e.g. not encoded as OPAQUE data) */ #define SML_ERR_XLT_TOKENIZER_ERROR 0x200D /**< Unspecified tokenizer error */ #define SML_ERR_XLT_INVAL_WBXML_DOC 0x200E /**< Document does not conform to WBXML specification */ #define SML_ERR_XLT_WBXML_UKN_TOK 0x200F /**< Document contains unknown WBXML token */ #define SML_ERR_XLT_MISSING_END_TAG 0x2010 /**< Non-empty start tag without matching end tag */ #define SML_ERR_XLT_INVALID_CODEPAGE 0x2011 /**< WBXML document uses unspecified code page */ #define SML_ERR_XLT_END_OF_BUFFER 0x2012 /**< End of buffer reached */ #define SML_ERR_XLT_INVAL_XML_DOC 0x2013 /**< Document does not conform to XML 1.0 specification */ #define SML_ERR_XLT_XML_UKN_TAG 0x2014 /**< Document contains unknown XML tag */ #define SML_ERR_XLT_INVAL_PUB_IDENT 0x2015 /**< Invalid Public Identifier */ #define SML_ERR_XLT_INVAL_EXT 0x2016 /**< Invalid Codepage Extension */ #define SML_ERR_XLT_NO_MATCHING_CODEPAGE 0x2017 /**< No matching Codepage could be found */ #define SML_ERR_XLT_INVAL_INPUT_DATA 0x2018 /**< Data missing in input structure */ /* * SyncML Wsm Error Codes */ #define SML_ERR_WSM_BUF_TABLE_FULL 0x3001 /**< no more empty entries in buffer table available */ /* * SyncML Util Error Codes */ #define SML_ERR_A_UTI_UNKNOWN_PROTO_ELEMENT 0x7001 #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/smlmetinfdtd.h0000755000373300037200000001000512424517753030315 0ustar00nightlyallusers00000000000000/** * @file * SyncML Meta Information DTD specific type definitions * * @target_system all * @target_os all * @description Definition of structures representing MetInf DTD elements */ /**************************************************************************/ /* @note */ /* These definitions are based on the MetInf DTD dated from Aug, 29th, 00 */ /**************************************************************************/ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _SML_METINFDTD_H #define _SML_METINFDTD_H /* process only if we really use MetInf DTD */ #ifdef __USE_METINF__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include #include typedef struct sml_metinf_anchor_s { SmlPcdataPtr_t last; /* optional */ SmlPcdataPtr_t next; } *SmlMetInfAnchorPtr_t, SmlMetInfAnchor_t; typedef struct sml_metinf_mem_s { /* %%% luz 2005-08-24 :this definition was plain wrong - shared is a flag, not Pcdata! SmlPcdataPtr_t shared; */ SmlPcdataPtr_t free; SmlPcdataPtr_t freeid; /* Added by Synthesis/luz 2005-08-24, was wrong in toolkit up to now! */ Flag_t flags; // SharedMem flag (SmlMetInfSharedMem_f) } *SmlMetInfMemPtr_t, SmlMetInfMem_t; typedef struct sml_metinf_metinf_s { SmlPcdataPtr_t format; /* opt. */ SmlPcdataPtr_t type; /* opt. */ SmlPcdataPtr_t mark; /* opt. */ SmlPcdataPtr_t size; /* opt. */ SmlPcdataPtr_t nextnonce; /* opt. */ SmlPcdataPtr_t version; SmlPcdataPtr_t maxmsgsize; /* optional */ /* SCTSTK - 18/03/2002, S.H. 2002-04-05 : SyncML 1.1 */ SmlPcdataPtr_t maxobjsize; /* optional */ SmlMetInfMemPtr_t mem; /* optional */ SmlPcdataListPtr_t emi; /* optional */ SmlMetInfAnchorPtr_t anchor; /* opt. */ /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ Flag_t flags; // FieldLevel flag (SmlMetInfFieldLevel_f) } *SmlMetInfMetInfPtr_t, SmlMetInfMetInf_t; #endif /* __USE_METINF__ */ #endif /* _SML_METINFDTD_H */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/win/0000755000373300037200000000000012424517753026250 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/inc/win/define.h0000755000373300037200000001247712424517753027671 0ustar00nightlyallusers00000000000000/** * @file * Compiler Flag Definition File * * @target_system win * @target_os win */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /** * File for Windows Specific Compiler Flags */ #ifndef _DEFINE_H #define _DEFINE_H #define __ANSI_C__ /* thread safety (added by luz@synthesis.ch, 2001-10-29) */ /* Note: moved define of this to target_options.h of every target #undef __MAKE_THREADSAFE /* enable Alloc helpers */ #define __USE_ALLOCFUNCS__ /* do we need WBXML (binary XML) processing ? */ #define __SML_WBXML__ /* do we need the capability to decode plain text tokens in WBXML? */ #define __SML_WBXML_TEXTTOKENS__ /* do we need XML processing ? */ #define __SML_XML__ /* are we using a 'light' toolkit ? */ //#define __SML_LITE__ /* do we use Sub DTD extensions ? */ #define __USE_EXTENSIONS__ /* do we need Metainformation DTD parsing ? */ #define __USE_METINF__ /* do we use Device Info DTD ? */ #define __USE_DEVINF__ /* which of the following optional commands should be included ? */ #define ADD_SEND #define ATOMIC_SEND #define ATOMIC_RECEIVE #define COPY_SEND #define COPY_RECEIVE #define EXEC_SEND #define EXEC_RECEIVE #define GET_SEND #define MAP_RECEIVE #define MAPITEM_RECEIVE #define RESULT_RECEIVE #define SEARCH_SEND #define SEARCH_RECEIVE #define SEQUENCE_SEND #define SEQUENCE_RECEIVE /* TK: to improve interoperability and handling we * switched to using .def files instead of compiler * specific per function definitions. As long as we only * use C this is the easiest and cleanes way */ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF /* Multi segment macro for Palm OS */ #define LIB_FUNC #define MGR_FUNC #define WSM_FUNC #define XLT_FUNC /* TK: Old, now obsolete code follows here */ #ifdef USE_OLD_DEFINES /* When building the DLL code with GNU, you should define BUILDING_DLL so that the variables/functions are exported correctly. When using the DLL, do NOT define BUILDING_DLL, and then the variables/functions will be imported correctly. You need to be using egcs-1.1.1 or newer. Building the DLL: - define BUILDING_DLL, which defines SML_API __attribute__((dllexport)) Building the client code: - DO NOT define BUILDING_DLL, which defines SML_API to be one __attribute__((dllimport)) */ #if __GNUC__ || __MSVC__ || __MSVCPP__ || _WIN32_WCE /* define this, if you want to link the toolkit static */ #if __LINK_TOOLKIT_STATIC__ || __linux__ #define SML_API #define SML_API_DEF #define XPT_API #define XPT_API_DEF #else #if BUILDING_DLL #define SML_API __declspec (dllexport) #define SML_API_DEF __declspec (dllexport) #define XPT_API __declspec (dllexport) #define XPT_API_DEF __declspec (dllexport) #else /* Not BUILDING_DLL */ #define SML_API __declspec (dllimport) #define SML_API_DEF __declspec (dllimport) #define XPT_API __declspec (dllimport) #define XPT_API_DEF __declspec (dllimport) #endif /* Not BUILDING_DLL */ #endif #else #if __IBMC__ || __IBMCPP__ #define SML_API_DEF __stdcall #define SML_API __stdcall _Export #define XPT_API_DEF __stdcall #define XPT_API __stdcall _Export #else #if WIN32 #define SML_API __declspec (dllexport) #define SML_API_DEF __declspec (dllexport) #define XPT_API #error #define XPT_API_DEF #error #else #define SML_API_DEF __stdcall #define SML_API __stdcall #define XPT_API_DEF __stdcall #define XPT_API __stdcall #endif #endif #endif #endif // USE_OLD_DEFINES #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/0000755000373300037200000000000012424517753025450 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/all/0000755000373300037200000000000012424517753026220 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/all/liblock.c0000755000373300037200000000312612424517753030010 0ustar00nightlyallusers00000000000000/** * @file * Library for Thread Locking Functions * * @target_system ALL * @target_os ALL * @description thread-locking library, RTK addition by luz@synthesis.ch */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #define _IMPLEMENTS_LOCK_GLOBALS #include "liblock.h" #undef _IMPLEMENTS_LOCK_GLOBALS #ifdef __DEBUG_LOCKS static short gLockNest; void _ToolKitLockInit(const char *msg) { gLockNest=0; InitializeCriticalSection(&gSmlLock); DEBUGPRINTF(("Toolkitlock initialized from '%s'",msg)) } // _ToolKitLockInit void _ToolKitLockFree(const char *msg) { DeleteCriticalSection(&gSmlLock); DEBUGPRINTF(("Toolkitlock freed from '%s'",msg)); } // _ToolKitLockFree void _LockToolKit(const char *msg) { short sec=0; int k; if (!TryEnterCriticalSection(&gSmlLock)) { // could not enter for (k=0; k<10; k++) { Sleep(100); // wait 0.1 sec if (TryEnterCriticalSection(&gSmlLock)) goto entered; } // could not enter after 1 sec DEBUGPRINTF(("Toolkitlock not free after 1 sec trying...")) do { Sleep(30000); // wait 30 secs sec+=30; if (TryEnterCriticalSection(&gSmlLock)) goto entered; DEBUGPRINTF(("Toolkitlock not free after %d sec trying...",sec)) } while (1); } entered: #if __DEBUG_LOCKS>1 DEBUGPRINTF(("Toolkitlock entered from '%s'",msg)) #endif ; } // _LockToolKit void _ReleaseToolKit(const char *msg) { LeaveCriticalSection(&gSmlLock); #if __DEBUG_LOCKS>1 DEBUGPRINTF(("Toolkitlock released from '%s'",msg)) #endif } // _ReleaseToolKit #endif /* eof */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/all/libmem.c0000755000373300037200000001522112424517753027635 0ustar00nightlyallusers00000000000000/** * @file * Library for Memory Functions * * @target_system ALL * @target_os ALL * @description Header for the implementation of common memory handling * functions */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include #include "libmem.h" #ifdef __PALM_OS__ #include "MemoryMgr.h" #endif #ifdef SML_LIB_MEMORY_FUNCTION_POINTERS void *(*smlLibRealloc)(void *pObject, MemSize_t size) = realloc; void (*smlLibFree)(void *pObject) = free; void *(*smlLibMemset)(void *pObject, int value, MemSize_t count) = memset; void *(*smlLibMemcpy)(void *pTarget, const void *pSource, MemSize_t count) = memcpy; void *(*smlLibMemmove)(void *pTarget, const void *pSource, MemSize_t count) = memmove; int (*smlLibMemcmp)(const void *pTarget, const void *pSource, MemSize_t count) = memcmp; void *(*smlLibMalloc)(MemSize_t size) = malloc; #else /* SML_LIB_MEMORY_FUNCTION_POINTERS */ #ifdef MEMORY_PROFILING // %%% luz 2002-10-02 #include "profiling.h" #endif /************************************************************************* * External Functions for all TOOLKIT Versions *************************************************************************/ /** * Deallocates the memory of object "pObject", which has been allocated * previously. * If "pObject" is a NULL pointer nothing happens. * If "pObject" is a pointer to memory which has not been allocated * previouly, the behaviour is undefined. * The contents of the deallocated memory object is destroyed. */ SML_API void smlLibFree(void *pObject) { if (! pObject) return; #ifdef __PALM_OS__ MemPtrFree(pObject); #else // %%% luz 2002-10-02 #ifdef MEMORY_PROFILING sysync_free(pObject); #else free(pObject); #endif #endif } /** * Changes size of preallocated space for memory object "pObject" * to the new size specified by "constSize". * * If the new size is larger than the old size, the old contents * is not changed. Additionally space is added at the the end of * "pObject". The new allocated space is not initialized * to any special value. * If the new size is smaller than the old size, the unused space * is discarded. * * If "pObject" is a NULL pointer, this function behaves just like * smlLibMalloc(). * If "pObject" does not point to a previously allocated memory area, * the behavior is undefined. * If "constSize" is 0, a NULL pointer is returned and the space * which "pObject" points to is freed up. * * Returns a pointer to the first byte of the resized object. * If no new memory could be allocated, a NULL Pointer is returned * without changing the memory object "pObject" (Nothing happens to the content). * * @param pObject (IN/OUT) * memory object, which size should be changed * @param constSize (IN) * new size the memory object shall use * @return void pointer to memory object, which size has been be changed\n * NULL, if not successfull or if constSize==0 */ SML_API void *smlLibRealloc(void *pObject, MemSize_t constSize) { #ifdef __PALM_OS__ VoidPtr_t _new_object; MemSize_t _old_size; // It's a malloc! if (pObject == NULL) return smlLibMalloc(constSize); _old_size = MemPtrSize(pObject); if (constSize <= _old_size) { // make it smaller MemPtrResize(pObject, constSize); _new_object = pObject; } else { // maker it larger (we need to allocate new memory somewhere else) _new_object = smlLibMalloc(constSize); if (_new_object != NULL) { smlLibMemmove(_new_object, pObject, _old_size); smlLibFree(pObject); } } return _new_object; #else // %%% luz 2002-10-02 #ifdef MEMORY_PROFILING return sysync_realloc(pObject, constSize); #else return realloc(pObject, constSize); #endif #endif } #ifndef __PALM_OS__ /* If not Palm OS we use the Standard ANSI C functions */ SML_API void *smlLibMemset(void *pObject, int value, MemSize_t count){ return memset(pObject, value, count); } SML_API void *smlLibMemcpy(void *pTarget, const void *pSource, MemSize_t count){ return memcpy(pTarget, pSource, count); } SML_API void *smlLibMemmove(void *pTarget, const void *pSource, MemSize_t count){ return memmove(pTarget, pSource, count); } SML_API int smlLibMemcmp(const void *pTarget, const void *pSource, MemSize_t count){ return memcmp(pTarget, pSource, count); } #ifndef smlLibMalloc // define only if not already defined as a macro SML_API void *smlLibMalloc(MemSize_t size) { // %%% luz 2002-10-02 #ifdef MEMORY_PROFILING return (void *)sysync_malloc(size); #else return (void *)malloc(size); #endif } #endif #endif #endif /* SML_LIB_MEMORY_FUNCTION_POINTERS */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/all/libstr.c0000755000373300037200000001155612424517753027676 0ustar00nightlyallusers00000000000000/** * @file * Library for String Functions * * @target_system ALL * @target_os ALL * @description implementation of common string-handling functions */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include #include "libstr.h" #include "libmem.h" #ifdef __ANSI_C__ #include #endif #ifdef __PALM_OS__ #include #endif /************************************************************************* * External Functions for all TOOLKIT Versions *************************************************************************/ /** * Duplicates the String "constStringP". * Returns a pointer to the new copy of "constStringP". * * @param constStringP (IN) * string which is duplicated * @return pointer to the new copy,\n * NULL if no copy could be allocated */ SML_API String_t smlLibStrdup (const char *constStringP) { String_t _new_str; // allocate memory for new copy _new_str = (String_t)smlLibMalloc(smlLibStrlen(constStringP) + 1); // Copy the string into the new memory if (_new_str != NULL) smlLibStrcpy(_new_str, constStringP); return _new_str; } #ifndef __PALM_OS__ /* If not Palm OS we use the Standard ANSI C functions */ SML_API String_t smlLibStrcpy(const char *pTarget, const char *pSource) { return strcpy((char *)pTarget, (char *)pSource); } SML_API String_t smlLibStrncpy(const char *pTarget, const char *pSource, int count){ return strncpy((char *)pTarget, (char *)pSource, count); } SML_API String_t smlLibStrcat(const char *pTarget, const char *pSource){ return strcat((char *)pTarget, (char *)pSource); } SML_API int smlLibStrcmp(const char *pTarget, const char *pSource){ return strcmp((char *)pTarget, (char *)pSource); } SML_API int smlLibStrncmp(const char *pTarget, const char *pSource, int count){ return strncmp((char *)pTarget, (char *)pSource, count); } SML_API int smlLibStrnCasecmp(const char *pTarget, const char *pSource, int count){ return strncasecmp((char *)pTarget, (char *)pSource, count); } SML_API String_t smlLibStrchr(const char *pString, char character){ return strchr((char *)pString, character); } SML_API int smlLibStrlen(const char *pString){ return strlen((char *)pString); } #endif /************************************************************************* * Additional External Functions for Full Size TOOLKIT ONLY *************************************************************************/ #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ #ifndef __PALM_OS__ /* we use #define to reduce heap usage */ SML_API String_t smlLibStrncat(const char *pTarget, const char *pSource, int count){ return strncat((char *)pTarget, (char *)pSource, count); } SML_API String_t smlLibStrstr(const char *pString, const char *pSubString){ return strstr((char *)pString, (char *)pSubString); } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/all/libutil.c0000755000373300037200000001167712424517753030047 0ustar00nightlyallusers00000000000000/** * @file * Library for IO Functions * * @target_system ALL * @target_os ALL * @description Utility I/O functions */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #ifndef NOWSM // Note: in NOWSM case, these routines must be implemented in the // calling main code. #include #include #ifdef __ANSI_C__ #include #include #endif #ifdef __PALM_OS__ #include #include #endif #ifdef __EPOC_OS__ #include #include #endif #include "define.h" #include "libmem.h" #include "mgr.h" #include "libutil.h" // size of output buffer #define BUFFERSIZE 128 /* Used external functions */ extern SyncMLInfoPtr_t mgrGetSyncMLAnchor(); /************************************************************************* * External Functions *************************************************************************/ /** * Assembles a formatted textstring out of a list of argument. This string is * passed to a callback function, which is implementated by the application * for output to the user * * @param text (IN) * printf like format text string with multiple * arguments to be formatted as specified\n * Supported are: * \%d, \%i, \%u, \%x, \%s, \%c\n * +, -, \, *, \, h, l, L */ SML_API void smlLibPrint(const char *text, ...) { char pBuffer[BUFFERSIZE]; va_list args; SyncMLInfoPtr_t pSyncMLInfo; if ((pSyncMLInfo = mgrGetSyncMLAnchor()) != NULL) { pBuffer[0] = '\0'; va_start(args, text); // assemble the text string out of the single arguments #ifdef __ANSI_C__ vsprintf(pBuffer, text, args); #endif #ifdef __PALM_OS__ StrVPrintF(pBuffer, text, args); #endif #ifdef __EPOC_OS__ vsprintf(pBuffer, text, args); #endif va_end(args); // use the application callback function, // which implements the output. if (pSyncMLInfo && pSyncMLInfo->syncmlOptions && pSyncMLInfo->syncmlOptions->defaultPrintFunc) ((smlPrintFunc)(pSyncMLInfo->syncmlOptions->defaultPrintFunc))(pBuffer); } } SML_API void smlLibVprintf(const char *format, va_list args) { char pBuffer[BUFFERSIZE]; SyncMLInfoPtr_t pSyncMLInfo; if ((pSyncMLInfo = mgrGetSyncMLAnchor()) != NULL) { pBuffer[0] = '\0'; // assemble the text string out of the single arguments #ifdef __ANSI_C__ vsprintf(pBuffer, format, args); #endif #ifdef __PALM_OS__ StrVPrintF(pBuffer, format, args); #endif #ifdef __EPOC_OS__ vsprintf(pBuffer, format, args); #endif // use the application callback function, // which implements the output. if (pSyncMLInfo && pSyncMLInfo->syncmlOptions && pSyncMLInfo->syncmlOptions->defaultPrintFunc) ((smlPrintFunc)(pSyncMLInfo->syncmlOptions->defaultPrintFunc))(pBuffer); } } #endif // !defined(NOWSM) syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/inc/0000755000373300037200000000000012424517753026221 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/inc/liblock.h0000755000373300037200000000433112424517753030015 0ustar00nightlyallusers00000000000000/** * @file * Library for Thread Locking Functions * * @target_system ALL * @target_os ALL * @description thread-locking library, RTK addition by luz@synthesis.ch */ #ifndef LIBLOCK_H #define LIBLOCK_H #include "define.h" #ifdef __DEBUG_LOCKS // needs debug global and DebugPrintf() extern void ThreadDebugPrintf(const char *text,...); #define DEBUGPRINTF(m) { ThreadDebugPrintf m; } #endif #if defined(__MAKE_THREADSAFE) && !defined(NOWSM) // thread safety measures are required only when working with WSM #ifdef _WIN32 #ifdef __DEBUG_LOCKS // we need TryEnterCriticalSection for debug #define _WIN32_WINNT 0x0400 #endif #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN // remove problematic windows defines (OPAQUE in wingdi.h, OPTIONAL in ????) #undef OPAQUE #undef OPTIONAL #include #ifdef __DEBUG_LOCKS /* - functions that also document lock usage */ void _ToolKitLockInit(const char *msg); void _ToolKitLockFree(const char *msg); void _LockToolKit(const char *msg); void _ReleaseToolKit(const char *msg); #define TOOLKITLOCK_INIT(m) _ToolKitLockInit(m); #define TOOLKITLOCK_FREE(m) _ToolKitLockFree(m); #define LOCKTOOLKIT(m) _LockToolKit(m); #define RELEASETOOLKIT(m) _ReleaseToolKit(m); #else /* - simple macros to use the lock */ #define TOOLKITLOCK_INIT(m) InitializeCriticalSection(&gSmlLock); #define TOOLKITLOCK_FREE(m) DeleteCriticalSection(&gSmlLock); #define LOCKTOOLKIT(m) EnterCriticalSection(&gSmlLock); #define RELEASETOOLKIT(m) LeaveCriticalSection(&gSmlLock); #endif #else #error "liblock.h: unsupported platform" #endif #else /* just NOP */ #define TOOLKITLOCK_INIT(m) #define TOOLKITLOCK_FREE(m) #define LOCKTOOLKIT(m) #define RELEASETOOLKIT(m) #endif #endif // LIBLOCK_H // globals declarations may not be omitted on second include! #ifdef __MAKE_THREADSAFE #ifdef _WIN32 /* define the required things */ #ifndef _IMPLEMENTS_LOCK_GLOBALS /* - the lock itself, as global variable */ extern CRITICAL_SECTION gSmlLock; #else CRITICAL_SECTION gSmlLock; #endif #endif #endif /* eof */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/inc/libmem.h0000755000373300037200000001075012424517753027645 0ustar00nightlyallusers00000000000000/** * @file * Library for Memory Functions * * @target_system ALL * @target_os ALL * @description Header for the implementation of common memory handling functions */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _LIB_MEM_H #define _LIB_MEM_H /************************************************************************* * Definitions *************************************************************************/ #include "define.h" #include #include #ifdef __ANSI_C__ #include #endif #ifdef __PALM_OS__ #include #endif /************************************************************************* * External Functions for all Toolkit versions *************************************************************************/ #ifdef SML_LIB_MEMORY_FUNCTION_POINTERS extern void *(*smlLibRealloc)(void *pObject, MemSize_t size); extern void (*smlLibFree)(void *pObject); extern void *(*smlLibMemset)(void *pObject, int value, MemSize_t count); extern void *(*smlLibMemcpy)(void *pTarget, const void *pSource, MemSize_t count); extern void *(*smlLibMemmove)(void *pTarget, const void *pSource, MemSize_t count); extern int (*smlLibMemcmp)(const void *pTarget, const void *pSource, MemSize_t count); extern void *(*smlLibMalloc)(MemSize_t size); #elif defined __PALM_OS__ /* we use #define to reduce heap usage */ void *smlLibRealloc (VoidPtr_t objectP, MemSize_t constSize) LIB_FUNC; void smlLibFree (void* objectP) LIB_FUNC; #define smlLibMemset(pObject,value,count) ((void)MemSet((VoidPtr_t)pObject,(MemSize_t)count,(int)value)) #define smlLibMemcpy(pTarget,pSource,count) (MemMove(pTarget,(VoidPtr_t)pSource,count) ? pTarget : pTarget) #define smlLibMemmove(pTarget,pSource,count) (MemMove(pTarget,(VoidPtr_t)pSource,(MemSize_t)count) ? pTarget : pTarget) #define smlLibMemcmp(pTarget,pSource,count) (MemCmp((VoidPtr_t)pTarget,(VoidPtr_t)pSource,(MemSize_t)count)) #define smlLibMalloc(size) ((VoidPtr_t)MemPtrNew((MemSize_t)size)) #define smlLibMemsize(pObject) ((MemSize_t)MemPtrSize((VoidPtr_t)pObject)) #else SML_API_DEF void *smlLibRealloc(void *pObject, MemSize_t size) LIB_FUNC; SML_API_DEF void smlLibFree(void *pObject) LIB_FUNC; SML_API_DEF void *smlLibMemset(void *pObject, int value, MemSize_t count) LIB_FUNC; SML_API_DEF void *smlLibMemcpy(void *pTarget, const void *pSource, MemSize_t count) LIB_FUNC; SML_API_DEF void *smlLibMemmove(void *pTarget, const void *pSource, MemSize_t count) LIB_FUNC; SML_API_DEF int smlLibMemcmp(const void *pTarget, const void *pSource, MemSize_t count) LIB_FUNC; // original: SML_API_DEF void *smlLibMalloc(MemSize_t size) LIB_FUNC; #define smlLibMalloc(m) malloc(m) #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/inc/libstr.h0000755000373300037200000001173212424517753027700 0ustar00nightlyallusers00000000000000/** * @file * Library for String Functions * * @target_system ALL * @target_os ALL * @description Header for the implementation of common string-handling functions */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef __LIB_STR_H #define __LIB_STR_H /************************************************************************* * Definitions *************************************************************************/ #include "define.h" #include "smldef.h" #include "libmem.h" #ifdef __ANSI_C__ #include #endif #ifdef __PALM_OS__ #include #endif /************************************************************************* * External Functions for all Toolkit versions *************************************************************************/ #ifdef __PALM_OS__ /* we use #define to reduce heap usage */ String_t smlLibStrdup (const char* constStringP) LIB_FUNC; #define smlLibStrcpy(pTarget,pSource) (char*)StrCopy((char*)pTarget,(char*)pSource) #define smlLibStrncpy(pTarget,pSource,count) (char*)StrNCopy((char*)pTarget,(char*)pSource,count) #define smlLibStrcat(pTarget,pSource) (char*)StrCat((char*)pTarget,(char*)pSource) #define smlLibStrcmp(pTarget,pSource) StrCompare((char*)pTarget,(char*)pSource) #define smlLibStrncmp(pTarget,pSource,count) StrNCompare((char*)pTarget,(char*)pSource,count) #define smlLibStrchr(pString,character) (char*)StrChr((String_t)pString,character) #define smlLibStrlen(pString) StrLen((char*)pString) #else /* we use functions, to make the library exportable */ SML_API_DEF String_t smlLibStrdup (const char *constStringP) LIB_FUNC; SML_API_DEF String_t smlLibStrcpy(const char *pTarget, const char *pSource) LIB_FUNC; SML_API_DEF String_t smlLibStrncpy(const char *pTarget, const char *pSource, int count) LIB_FUNC; SML_API_DEF String_t smlLibStrcat(const char *pTarget, const char *pSource) LIB_FUNC; SML_API_DEF int smlLibStrcmp(const char *pTarget, const char *pSource) LIB_FUNC; SML_API_DEF int smlLibStrncmp(const char *pTarget, const char *pSource, int count) LIB_FUNC; SML_API_DEF int smlLibStrnCasecmp(const char *pTarget, const char *pSource, int count) LIB_FUNC; SML_API_DEF String_t smlLibStrchr(const char *pString, char character) LIB_FUNC; SML_API_DEF int smlLibStrlen(const char *pString) LIB_FUNC; #endif /************************************************************************* * Additional External Functions for Full Sized Toolkit Only *************************************************************************/ #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ #ifdef __PALM_OS__ /* we use define to reduce heap usage */ #define smlLibStrncat(pTarget,pSource,count) (char*)StrNCat((char*)pTarget,(char*)pSource,count) #define smlLibStrstr(pString,pSubstring) (char*)StrStr((char*)pString,(char*)pSubstring) #else /* we use functions, to make the library exportable */ SML_API_DEF String_t smlLibStrncat(const char *pTarget, const char *pSource, int count) LIB_FUNC; SML_API_DEF String_t smlLibStrstr(const char *pString, const char *pSubString) LIB_FUNC; #endif #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/lib/inc/libutil.h0000755000373300037200000000536712424517753030054 0ustar00nightlyallusers00000000000000/** * @file * Library for utility Functions * * @target_system ALL * @target_os ALL * @description Some I/O Utilities */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _LIB_UTIL_H #define _LIB_UTIL_H /************************************************************************* * Definitions *************************************************************************/ #include "define.h" #include "smldef.h" #ifdef __ANSI_C__ #include #endif #ifdef __PALM_OS__ #ifndef _MSL_CSTDARG #include // only if we don't use MSL #endif #endif #ifdef __EPOC_OS__ #include #endif /************************************************************************* * External Functions *************************************************************************/ /* IO functions */ SML_API_DEF void smlLibPrint(const char *text, ...) LIB_FUNC; SML_API_DEF void smlLibVprintf(const char *format, va_list va) LIB_FUNC; #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/0000755000373300037200000000000012424517753025467 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/0000755000373300037200000000000012424517753026237 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/mgr.c0000755000373300037200000002134612424517753027201 0ustar00nightlyallusers00000000000000/** * @file * Managing SyncML * * @target_system all * @target_os all * @description Core Module managing the life-cycle of a syncML Process itself */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ /* Include Headers */ #include #include #include #if defined(NOWSM) && !__LINK_TOOLKIT_STATIC__ // we need dummies of these as they are listed in the SyncML.def file SML_API_DEF Ret_t smlInit(SmlOptionsPtr_t pOptions) { return SML_ERR_OK; } SML_API_DEF Ret_t smlSetSyncMLOptions (SmlOptionsPtr_t pOptions) { return SML_ERR_OK; } SML_API_DEF Ret_t smlTerminate(void) { return SML_ERR_OK; } #endif #ifndef NOWSM #include "libmem.h" #include "liblock.h" #include "wsm.h" #include "mgr.h" #ifdef __EPOC_OS__ #include "core_globals_epoc.h" #endif /* Prototypes of exported SyncML API functions */ SML_API Ret_t smlInit(SmlOptionsPtr_t pOptions); SML_API Ret_t smlSetSyncMLOptions (SmlOptionsPtr_t pOptions); SML_API Ret_t smlTerminate(void); /* SyncML internal function prototypes */ InstanceInfoPtr_t mgrGetInstanceListAnchor(void); void mgrSetInstanceListAnchor(InstanceInfoPtr_t newListAnchor); SyncMLInfoPtr_t mgrGetSyncMLAnchor(void); /** * Anchor of the global syncML info structure */ #ifndef __EPOC_OS__ static SyncMLInfoPtr_t pGlobalAnchor=NULL; // this global pointer is used to access ALL globals within syncml #endif // This is the ONLY global varible of SyncML! #ifdef __EPOC_OS__ #define pGlobalAnchor TheCoreGlobalsEpoc()->pGlobalAnchor #endif /************************************************************************* * Exported SyncML API functions *************************************************************************/ /** * Initializes the SyncML Reference Tookit. This is required, before any * other function can be used. * * @param pCoreOptions (IN) * options to be applied for the toolkit * @return Return Code */ SML_API Ret_t smlInit(SmlOptionsPtr_t pCoreOptions) { /* ---- Definitions --- */ WsmOptions_t* pWorkspaceOptions; Ret_t rc; /* --- check, if SyncML has already been initialized --- */ if (pGlobalAnchor!=NULL) return SML_ERR_ALREADY_INITIALIZED; /* --- Check pOptions, which have been passed by the application --- */ if (!pCoreOptions) return SML_ERR_WRONG_USAGE; /* --- Create a SyncML info memory object to store all globals --- */ TOOLKITLOCK_INIT("smlInit"); pGlobalAnchor = (SyncMLInfoPtr_t)smlLibMalloc((MemSize_t)sizeof(SyncMLInfo_t)); if (pGlobalAnchor==NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pGlobalAnchor,0,(MemSize_t)sizeof(SyncMLInfo_t)); /* --- Set SyncML settings and options --- */ pGlobalAnchor->instanceListAnchor = NULL; // no instance exists at the beginning rc = smlSetSyncMLOptions (pCoreOptions); // store the options in the global structure if (rc!=SML_ERR_OK){ smlLibFree(pGlobalAnchor); pGlobalAnchor = NULL; return rc; } pGlobalAnchor->tokTbl = (TokenInfoPtr_t)smlLibMalloc(sizeof(TokenInfo_t)); if (pGlobalAnchor->tokTbl == NULL) { smlLibFree(pGlobalAnchor); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pGlobalAnchor->tokTbl, 0, sizeof(TokenInfo_t)); /* --- Init all modules ---*/ /* Init Workspace Module */ pWorkspaceOptions=(WsmOptions_t*)smlLibMalloc((MemSize_t)sizeof(WsmOptions_t)); // create workspace options if (pWorkspaceOptions == NULL) { smlLibFree(pGlobalAnchor->syncmlOptions); smlLibFree(pGlobalAnchor->tokTbl); smlLibFree(pGlobalAnchor); pGlobalAnchor = NULL; return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pWorkspaceOptions,0,(MemSize_t)sizeof(WsmOptions_t)); pWorkspaceOptions->maxAvailMem=(MemSize_t)pGlobalAnchor->syncmlOptions->maxWorkspaceAvailMem; rc = wsmInit (pWorkspaceOptions); if (rc!=SML_ERR_OK){ smlLibFree(pGlobalAnchor->syncmlOptions); smlLibFree(pGlobalAnchor->tokTbl); smlLibFree(pGlobalAnchor); pGlobalAnchor = NULL; smlLibFree(pWorkspaceOptions); return rc; } smlLibFree(pWorkspaceOptions); return SML_ERR_OK; } /** * Terminate SyncML. Frees all memory and other ressources used by * SyncML. This function must be called when terminating SyncML * * @pre All instances must have been terminated * @return Return Code */ SML_API Ret_t smlTerminate(void) { // Have all Instances been terminated? if (pGlobalAnchor->instanceListAnchor!=NULL) return SML_ERR_WRONG_USAGE; /* --- Make sure, the workspace is destroyed --*/ LOCKTOOLKIT("smlTerminate"); wsmTerminate(); /* --- Free the global structure --*/ smlLibFree(pGlobalAnchor->tokTbl->SyncML); smlLibFree(pGlobalAnchor->tokTbl->MetInf); smlLibFree(pGlobalAnchor->tokTbl->DevInf); smlLibFree(pGlobalAnchor->tokTbl); smlLibFree(pGlobalAnchor->syncmlOptions); smlLibFree(pGlobalAnchor); pGlobalAnchor=NULL; TOOLKITLOCK_FREE("smlTerminate"); return SML_ERR_OK; } /** * Change the option settings for syncML * * @param pCoreOptions (IN) * options to be applied for the toolkit * @return Return Code */ SML_API Ret_t smlSetSyncMLOptions(SmlOptionsPtr_t pCoreOptions) { /* ---- Definitions --- */ SmlOptionsPtr_t pCoreOptionsCopy; /* --- Check pOptions, which have been passed by the application --- */ if (!pCoreOptions) return SML_ERR_WRONG_USAGE; /* --- free SyncML options --- */ smlLibFree(pGlobalAnchor->syncmlOptions); pGlobalAnchor->syncmlOptions = NULL; /* --- Use a copy of pCoreOptions --- */ pCoreOptionsCopy = (SmlOptionsPtr_t)smlLibMalloc((MemSize_t)sizeof(SmlOptions_t)); if (pCoreOptionsCopy==NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemcpy(pCoreOptionsCopy,pCoreOptions,(MemSize_t)sizeof(SmlOptions_t)); /* --- set new SyncML options --- */ pGlobalAnchor->syncmlOptions = pCoreOptionsCopy; // set the options,passed from the application return SML_ERR_OK; } /************************************************************************* * SyncML internal functions *************************************************************************/ /** * Retrieves a pointer to the structure holding all global informations * within SyncML * * @return Pointer to the pGlobalAnchor */ SyncMLInfoPtr_t mgrGetSyncMLAnchor(void) { return pGlobalAnchor; } /** * Retrieves a pointer to the list holding all instance informations * * @return Pointer to the pInstanceListAnchor */ InstanceInfoPtr_t mgrGetInstanceListAnchor(void) { return pGlobalAnchor->instanceListAnchor; } /** * Set the pointer to the list holding all instance informations * * @param newListAnchor (IN) * pointer to the pInstanceListAnchor */ void mgrSetInstanceListAnchor(InstanceInfoPtr_t newListAnchor) { pGlobalAnchor->instanceListAnchor=newListAnchor; } #endif // !defined(NOWSM) syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c0000755000373300037200000005660512424517753031242 0ustar00nightlyallusers00000000000000/** * @file * SyncML Command Builder * * @target_system all * @target_os all * @description Core Module for assembling SyncML compliant documents */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ /* Include Headers */ #include #include "xltenc.h" #include "xltdec.h" #include "libmem.h" #include "mgr.h" /* Used external functions */ extern Ret_t smlLockWriteBuffer(InstanceID_t id, MemPtr_t *pWritePosition, MemSize_t *freeSize); extern Ret_t smlUnlockWriteBuffer(InstanceID_t id, MemSize_t writtenBytes); #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ extern Ret_t addInfo(InstanceInfoPtr_t pInfo); extern InstanceInfoPtr_t findInfo(InstanceID_t id); extern Ret_t removeInfo(InstanceID_t id); #endif /* Prototypes of exported SyncML API functions */ SML_API Ret_t smlStartMessage(InstanceID_t id, SmlSyncHdrPtr_t pContent); SML_API Ret_t smlStartMessageExt(InstanceID_t id, SmlSyncHdrPtr_t pContent, SmlVersion_t vers); SML_API Ret_t smlEndMessage(InstanceID_t id, Boolean_t final); SML_API Ret_t smlStartSync(InstanceID_t id, SmlSyncPtr_t pContent); SML_API Ret_t smlEndSync(InstanceID_t id); #ifdef ATOMIC_SEND /* these API calls are NOT included in the Toolkit lite version */ SML_API Ret_t smlStartAtomic(InstanceID_t id, SmlAtomicPtr_t pContent); SML_API Ret_t smlEndAtomic(InstanceID_t id); #endif #ifdef SEQUENCE_SEND SML_API Ret_t smlStartSequence(InstanceID_t id, SmlSequencePtr_t pContent); SML_API Ret_t smlEndSequence(InstanceID_t id); #endif #ifdef ADD_SEND SML_API Ret_t smlAddCmd(InstanceID_t id, SmlAddPtr_t pContent); #endif SML_API Ret_t smlAlertCmd(InstanceID_t id, SmlAlertPtr_t pContent); SML_API Ret_t smlDeleteCmd(InstanceID_t id, SmlDeletePtr_t pContent); #ifdef GET_SEND SML_API Ret_t smlGetCmd(InstanceID_t id, SmlGetPtr_t pContent); #endif SML_API Ret_t smlPutCmd(InstanceID_t id, SmlPutPtr_t pContent); SML_API Ret_t smlMapCmd(InstanceID_t id, SmlMapPtr_t pContent); SML_API Ret_t smlResultsCmd(InstanceID_t id, SmlResultsPtr_t pContent); SML_API Ret_t smlStatusCmd(InstanceID_t id, SmlStatusPtr_t pContent); SML_API Ret_t smlReplaceCmd(InstanceID_t id, SmlReplacePtr_t pContent); #ifdef COPY_SEND /* these API calls are NOT included in the Toolkit lite version */ SML_API Ret_t smlCopyCmd(InstanceID_t id, SmlCopyPtr_t pContent); #endif #ifdef EXEC_SEND SML_API Ret_t smlExecCmd(InstanceID_t id, SmlExecPtr_t pContent); #endif #ifdef SEARCH_SEND SML_API Ret_t smlSearchCmd(InstanceID_t id, SmlSearchPtr_t pContent); #endif SML_API Ret_t smlMoveCmd(InstanceID_t id, SmlMovePtr_t pContent); /* Private function prototypes */ static Ret_t mgrCreateNextCommand(InstanceID_t id, SmlProtoElement_t cmdType, VoidPtr_t pContent); Ret_t mgrResetWorkspace (InstanceID_t id); /************************************************************************* * Exported SyncML API functions *************************************************************************/ /** * Start a SyncML Message * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code * @note (%%% luz 2003-08-06) this entry point is for compatibilty * reasons only and works for SyncML 1.0 only\n * please use smlStartMessageExt() instead in new projects. */ SML_API Ret_t smlStartMessage(InstanceID_t id, SmlSyncHdrPtr_t pContent) { /* just call smlStartMessageExt with vers set to SyncML 1.0 */ return smlStartMessageExt(id,pContent,SML_VERS_1_0); } /** * Start a SyncML Message * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @param vers (IN) * SyncML version * @note (%%% added by luz 2003-08-06 to support SyncML versions other than * 1.0 with new vers parameter) * @return Return Code */ SML_API Ret_t smlStartMessageExt(InstanceID_t id, SmlSyncHdrPtr_t pContent, SmlVersion_t vers) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; // pointer the the instance info structure for this id Ret_t rc; MemPtr_t pCurrentWritePosition; // current Position from to which to write MemPtr_t pBeginPosition; // saves the first position which has been written MemSize_t freeSize; // size of free memory for writing #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Retrieve the corresponding instanceInfo structure --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- Get Write Access to the workspace --- */ #ifdef NOWSM // first remember where outgoing message starts in buffer smlSetOutgoingBegin(id); #endif // possibly, this will cause a buffer reset (if nothing is // unread in the buffer), and will auto-readjust the OutgoingBegin. rc = smlLockWriteBuffer(id, &pCurrentWritePosition, &freeSize); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); return rc; } /* Remember the position we have started writing */ pBeginPosition=pCurrentWritePosition; /* --- Call the encoder module --- */ /* (Saves the returned encoder state to the corresponding instanceInfo structure */ rc = xltEncInit (pInstanceInfo->instanceOptions->encoding, pContent, pCurrentWritePosition+freeSize, &pCurrentWritePosition, (XltEncoderPtr_t *)&(pInstanceInfo->encoderState), vers ); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); // Reset the encoder module (free the encoding object) xltEncReset(pInstanceInfo->encoderState); // this encoding job is over! reset instanceInfo pointer pInstanceInfo->encoderState=NULL; return rc; } /* --- End Write Access to the workspace --- */ rc = smlUnlockWriteBuffer(id, (MemSize_t)pCurrentWritePosition-(MemSize_t)pBeginPosition); return rc; } /** * End a SyncML Message * * @param id (IN) * ID of the used instance * @param final (IN) * Final Flag indicates last message within a package * @return Return Code */ SML_API Ret_t smlEndMessage(InstanceID_t id, Boolean_t final) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; // pointer the the instance info structure for this id Ret_t rc; MemPtr_t pCurrentWritePosition; // current Position from to which to write MemPtr_t pBeginPosition; // saves the first position which has been written MemSize_t freeSize; // size of free memory for writing #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Retrieve the corresponding instanceInfo structure --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // %%% luz 2003-08-19: added NULL check as previously failed encoding will delete encoder if (pInstanceInfo->encoderState==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- Get Write Access to the workspace --- */ rc = smlLockWriteBuffer(id, &pCurrentWritePosition, &freeSize); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); return rc; } /* Remember the position we have started writing */ pBeginPosition=pCurrentWritePosition; /* -- set Final Flag --*/ ((XltEncoderPtr_t)(pInstanceInfo->encoderState))->final = final; /* --- Call the encoder module --- */ rc = xltEncTerminate(pInstanceInfo->encoderState, pCurrentWritePosition+freeSize,&pCurrentWritePosition); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); // this encoding job is over! reset instanceInfo pointer pInstanceInfo->encoderState=NULL; return rc; } // this encoding job is over! reset instanceInfo pointer // (the decoding object itself has been freed by the decoder) pInstanceInfo->encoderState=NULL; /* --- End Write Access to the workspace --- */ rc = smlUnlockWriteBuffer(id, (MemSize_t)pCurrentWritePosition-(MemSize_t)pBeginPosition); return rc; } /** * Start synchronizing * * @param id (IN) * ID of the used instance * @param pContent (IN) Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlStartSync(InstanceID_t id, SmlSyncPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_SYNC_START, pContent); } /** * End synchronizing * * @param id (IN) * ID of the used instance * @return Return Code */ SML_API Ret_t smlEndSync(InstanceID_t id) { return mgrCreateNextCommand(id, SML_PE_SYNC_END, NULL); } #ifdef ATOMIC_SEND /* these API calls are NOT included in the Toolkit lite version */ /** * Start an atomic sequence * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlStartAtomic(InstanceID_t id, SmlAtomicPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_ATOMIC_START, pContent); } /** * End an atomic sequence * * @param id (IN) * ID of the used instance * @return Return Code */ SML_API Ret_t smlEndAtomic(InstanceID_t id) { return mgrCreateNextCommand(id, SML_PE_ATOMIC_END, NULL); } #endif #ifdef SEQUENCE_SEND /** * Start a sequence * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlStartSequence(InstanceID_t id, SmlSequencePtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_SEQUENCE_START, pContent); } /** * End a sequence * * @param id (IN) * ID of the used instance * @return Return Code */ SML_API Ret_t smlEndSequence(InstanceID_t id) { return mgrCreateNextCommand(id, SML_PE_SEQUENCE_END, NULL); } #endif #ifdef ADD_SEND /** * Create a Add Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlAddCmd(InstanceID_t id, SmlAddPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_ADD, pContent); } #endif /** * Create a Alert Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlAlertCmd(InstanceID_t id, SmlAlertPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_ALERT, pContent); } /** * Create a Start Message Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlDeleteCmd(InstanceID_t id, SmlDeletePtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_DELETE, pContent); } #ifdef GET_SEND /** * Create a Get Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlGetCmd(InstanceID_t id, SmlGetPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_GET, pContent); } #endif /** * Create a Put Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlPutCmd(InstanceID_t id, SmlPutPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_PUT, pContent); } /** * Create a Map Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlMapCmd(InstanceID_t id, SmlMapPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_MAP, pContent); } /** * Create a Results Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlResultsCmd(InstanceID_t id, SmlResultsPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_RESULTS, pContent); } /** * Create a Status Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlStatusCmd(InstanceID_t id, SmlStatusPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_STATUS, pContent); } /** * Create a Replace Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlReplaceCmd(InstanceID_t id, SmlReplacePtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_REPLACE, pContent); } #ifdef COPY_SEND /* these API calls are NOT included in the Toolkit lite version */ /** * Create a Copy Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlCopyCmd(InstanceID_t id, SmlCopyPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_COPY, pContent); } #endif /** * Create a Move Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlMoveCmd(InstanceID_t id, SmlMovePtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_MOVE, pContent); } #ifdef EXEC_SEND /** * Create a Exec Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlExecCmd(InstanceID_t id, SmlExecPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_EXEC, pContent); } #endif #ifdef SEARCH_SEND /** * Create a Search Command * * @param id (IN) * ID of the used instance * @param pContent (IN) * Data to pass along with that SyncML command * @return Return Code */ SML_API Ret_t smlSearchCmd(InstanceID_t id, SmlSearchPtr_t pContent) { return mgrCreateNextCommand(id, SML_PE_SEARCH, pContent); } #endif /************************************************************************* * Exported SyncML API functions (FULL-SIZE TOOLKIT ONLY) *************************************************************************/ #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ /** * Starts an evaluation run which prevents further API-Calls to write tags - * just the tag-sizes are calculated. Must be sopped via smlEndEvaluation * * @param id (IN) * ID of the used instance * @return Return Code */ SML_API Ret_t smlStartEvaluation(InstanceID_t id) { InstanceInfoPtr_t pInstanceInfo; // pointer the the instance info structure for this id Ret_t rc; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Retrieve the corresponding instanceInfo structure --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- Initialize Encoder for evaluation mode --- */ rc = xltStartEvaluation((XltEncoderPtr_t)(pInstanceInfo->encoderState)); return rc; } /** * Stops an evaluation run which prevents further API-Calls to write tags - * the remaining free buffer size after all Tags are written is returned * * @param id (IN) * ID of the used instance * @param freemem (IN/OUT) * Size of free buffer for data after all tags are written * @return Return Code */ SML_API Ret_t smlEndEvaluation(InstanceID_t id, MemSize_t *freemem) { InstanceInfoPtr_t pInstanceInfo; // pointer the the instance info structure for this id Ret_t rc; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Retrieve the corresponding instanceInfo structure --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // %%% luz 2002-09-03: encoder can be null here if fatal error occurred before if (pInstanceInfo->encoderState==NULL) return SML_ERR_WRONG_USAGE; rc = xltEndEvaluation(id, (XltEncoderPtr_t)(pInstanceInfo->encoderState), freemem); return rc; } #endif /************************************************************************* * Private Functions *************************************************************************/ /** * Calls the encoding routines of the Encoder Module for a given Command Type * and Command Content * * @param id (IN) * ID of the Instance * @param cmdType (IN) * Type of the command (defined by the Proto Element Enumeration) * @param pContent (IN) * Content of the command to encode * @return Return value,\n * SML_ERR_OK if command has been encoded successfully */ static Ret_t mgrCreateNextCommand(InstanceID_t id, SmlProtoElement_t cmdType, VoidPtr_t pContent) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; // pointer the the instance info structure for this id Ret_t rc; MemPtr_t pCurrentWritePosition; // current Position from to which to write MemPtr_t pBeginPosition; // saves the first position which has been written MemSize_t freeSize; // size of free memory for writing #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Retrieve the corresponding instanceInfo structure --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // %%% luz 2002-11-27: added NULL check as previously failed encoding will delete encoder if (pInstanceInfo->encoderState==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- Get Write Access to the workspace --- */ rc = smlLockWriteBuffer(id, &pCurrentWritePosition, &freeSize); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); return rc; } // Remember the position we have started writing pBeginPosition=pCurrentWritePosition; /* --- Call the encoder module --- */ rc = xltEncAppend(pInstanceInfo->encoderState, cmdType, pCurrentWritePosition+freeSize, pContent, &pCurrentWritePosition); if (rc!=SML_ERR_OK) { /* check for full buffer and call TransmitChunk */ if (rc == SML_ERR_XLT_BUF_ERR) { // first check wether callback is defined if (pInstanceInfo->callbacks->transmitChunkFunc!= NULL) { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); // call the callback pInstanceInfo->callbacks->transmitChunkFunc(id,NULL); // lock -> returns the amount of free buffer space smlLockWriteBuffer(id, &pCurrentWritePosition, &freeSize); pBeginPosition = pCurrentWritePosition; // now try again to encode and see wether we now have enough mem available rc = xltEncAppend(pInstanceInfo->encoderState, cmdType, pCurrentWritePosition+freeSize, pContent, &pCurrentWritePosition); // if rc == SML_ERR_OK continue else // return the errorcode if( rc != SML_ERR_OK) { smlUnlockWriteBuffer(id, (MemSize_t)0); // Reset the encoder module (free the encoding object) xltEncReset(pInstanceInfo->encoderState); // this encoding job is over! reset instanceInfo pointer pInstanceInfo->encoderState=NULL; return rc; } } } else { // abort, unlock the buffer again without changing it's current position smlUnlockWriteBuffer(id, (MemSize_t)0); // Reset the encoder module (free the encoding object) xltEncReset(pInstanceInfo->encoderState); // this encoding job is over! reset instanceInfo pointer pInstanceInfo->encoderState=NULL; return rc; } } /* --- End Write Access to the workspace --- */ rc = smlUnlockWriteBuffer(id, (MemSize_t)pCurrentWritePosition-(MemSize_t)pBeginPosition); return rc; } /* eof */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c0000755000373300037200000004564712424517753031746 0ustar00nightlyallusers00000000000000/** * @file * SyncML Command Dispatcher * * @target_system all * @target_os all * @description Core module for dispatching parsed commands and invoking * callback functions of the application */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" /* Include Headers */ #include "smldef.h" #include "smldtd.h" #include "smlerr.h" #include "libmem.h" #include "xltdec.h" #include "mgr.h" /* Used external functions */ #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ extern Ret_t addInfo(InstanceInfoPtr_t pInfo); extern InstanceInfoPtr_t findInfo(InstanceID_t id); extern Ret_t removeInfo(InstanceID_t id); #endif Ret_t smlLockReadBuffer(InstanceID_t id, MemPtr_t *pReadPosition, MemSize_t *usedSize); Ret_t smlUnlockReadBuffer(InstanceID_t id, MemSize_t processedBytes); /* Prototypes of exported SyncML API functions */ extern Ret_t smlProcessData(InstanceID_t id, SmlProcessMode_t mode); /* Private function prototypes */ static Ret_t mgrProcessNextCommand(InstanceID_t id, InstanceInfoPtr_t pInstanceInfo); static Ret_t mgrProcessStartMessage(InstanceID_t id, InstanceInfoPtr_t pInstanceInfo); Ret_t mgrResetWorkspace (InstanceID_t id); /************************************************************************* * Exported SyncML API functions *************************************************************************/ /** * Start the parsing of the XML code in the workspace buffer, * dispatches the interpreted command and calls the corresponding callback * functions provided by the application. * * @param id (IN) * The SyncML instance id is used for referencing the * workspace buffer from the XML content is parsed * @param mode (IN) * Mode of processing, Defines, if only the first or next * XML command is parsed or if all commands are processed * subsequently until the end of the entire workspace buffer * is reached. The NEXT_COMMAND flag defines the blocking mode, * the ALL_COMMANDS tag defines the non-blocking mode. * @return Return Code */ SML_API Ret_t smlProcessData(InstanceID_t id, SmlProcessMode_t mode) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; // state info for the given instanceID Ret_t rc; // Temporary return code saver #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- Are callback functions defined? --- */ if (pInstanceInfo->callbacks==NULL) return SML_ERR_COMMAND_NOT_HANDLED; /* --- Is parsing already in progress? --- */ if (pInstanceInfo->decoderState==NULL) { /* No! Parse the Message header section first */ rc = mgrProcessStartMessage(id, pInstanceInfo); if (rc!=SML_ERR_OK) return rc; } /* --- Parse now the Message body section! --- */ do { rc=mgrProcessNextCommand(id, pInstanceInfo); } while ( // keep processing while no error occurs, // AND the document end was not reached (decoderState has been invalidated), // AND the ALL_COMMAND mode is used (rc==SML_ERR_OK) &&((pInstanceInfo->decoderState)!=NULL) &&(mode==SML_ALL_COMMANDS) ); if (rc != SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); // Reset the decoder module (free the decoding object) xltDecReset(pInstanceInfo->decoderState); // this decoding job is over! reset Instance Info pointer pInstanceInfo->decoderState=NULL; // Reset the Workspace (the remaining unparsed document fragment will be lost) mgrResetWorkspace(id); } else { // %%%luz 2007-09-11: added SML_ERR_CONTINUE to signal processing of message not // yet complete in NEXT_COMMAND mode (is otherwise not very useful) if ((mode==SML_NEXT_COMMAND) && ((pInstanceInfo->decoderState)!=NULL)) { rc = SML_ERR_CONTINUE; // processing not yet complete } } return rc; } /************************************************************************* * Private Functions *************************************************************************/ /** * Parses the header information at the beginning of an SyncML document. * * @param id (IN) * current InstanceID to pass to callback functions * @param pInstanceInfo (IN/OUT) * state information of the given InstanceID * (decoder state will be changed) * @return Return value of the Parser,\n * SML_ERR_OK if next command was handled successfully */ static Ret_t mgrProcessStartMessage(InstanceID_t id, InstanceInfoPtr_t pInstanceInfo) { /* --- Definitions --- */ Ret_t rc; // Temporary return code saver SmlSyncHdrPtr_t pContent=NULL; // data of the command to process MemPtr_t pCurrentReadPosition ; // current Position from which is read MemPtr_t pBeginPosition; // saves the first position which has been reading MemSize_t usedSize ; // size of used memory to be read /* --- Get Read Access to the workspace --- */ rc = smlLockReadBuffer(id, &pCurrentReadPosition, &usedSize); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); return rc; } // Remember the position we have started reading pBeginPosition=pCurrentReadPosition; #ifdef NOWSM // luz 2008-02-08: also remember the position of the first byte of the message to allow dumping it AFTER parsing the header pInstanceInfo->incomingMsgStart = pBeginPosition; #endif /* --- Start new decoding sequence and pass returned decoder status structure to instanceInfo --- */ rc = xltDecInit(pInstanceInfo->instanceOptions->encoding, pCurrentReadPosition+usedSize-1, &pCurrentReadPosition, (XltDecoderPtr_t *)&(pInstanceInfo->decoderState), &pContent); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); // Reset the decoder module (free the decoding object) xltDecReset(pInstanceInfo->decoderState); // this decoding job is over! reset Instance Info pointer pInstanceInfo->decoderState=NULL; // Reset the Workspace (the remaining unparsed document fragment will be lost) mgrResetWorkspace(id); return rc; } /* --- End Read Access to the workspace --- */ rc = smlUnlockReadBuffer(id, (MemSize_t)pCurrentReadPosition-(MemSize_t)pBeginPosition); if (rc!=SML_ERR_OK) return rc; /* --- Perform callback to handle the beginning of a new message --- */ if (pInstanceInfo->callbacks->startMessageFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; rc=pInstanceInfo->callbacks->startMessageFunc(id, pInstanceInfo->userData, pContent); if (rc != SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); // Reset the decoder module (free the decoding object) xltDecReset(pInstanceInfo->decoderState); // this decoding job is over! reset Instance Info pointer pInstanceInfo->decoderState=NULL; // Reset the Workspace (the remaining unparsed document fragment will be lost) mgrResetWorkspace(id); } return rc; } /** * Parses the next Sync Command in the sync document. * * @param id (IN) * current InstanceID to pass to callback functions * @param pInstanceInfo (IN) * state information of the given InstanceID * @return Return value of the Parser of the called application callback,\n * SML_ERR_OK if next command was handled successfully */ static Ret_t mgrProcessNextCommand(InstanceID_t id, InstanceInfoPtr_t pInstanceInfo) { /* --- Definitions --- */ Ret_t rc; // Temporary return code saver SmlProtoElement_t cmdType; // ID of the command to process VoidPtr_t pContent=NULL; // data of the command to process MemPtr_t pCurrentReadPosition; // current Position from which is read MemPtr_t pBeginPosition; // saves the first position which has been reading MemSize_t usedSize; // size of used memory to be read Boolean_t final; // flag indicates last message within a package /* --- Get Read Access to the workspace --- */ rc = smlLockReadBuffer(id, &pCurrentReadPosition, &usedSize); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); return rc; } // Remember the position we have started reading pBeginPosition=pCurrentReadPosition; /* --- Parse next Command --- */ rc = xltDecNext(pInstanceInfo->decoderState, pCurrentReadPosition+usedSize, &pCurrentReadPosition, &cmdType, &pContent); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); // Reset the decoder module (free the decoding object) xltDecReset(pInstanceInfo->decoderState); // this decoding job is over! reset Instance Info pointer pInstanceInfo->decoderState=NULL; // Reset the Workspace (the remaining unparsed document fragment will be lost) mgrResetWorkspace(id); return rc; } /* --- End Read Access to the workspace --- */ rc = smlUnlockReadBuffer(id, (MemSize_t)pCurrentReadPosition-(MemSize_t)pBeginPosition); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); return rc; } /* --- Did we reach end of synchronization document? --- */ if (((XltDecoderPtr_t)(pInstanceInfo->decoderState))->finished!=0) { final = ((XltDecoderPtr_t)(pInstanceInfo->decoderState))->final; // flag is returned to appl. with callback rc=xltDecTerminate(pInstanceInfo->decoderState); if (rc!=SML_ERR_OK) { // abort, unlock the buffer again without changing it's current position smlUnlockReadBuffer(id, (MemSize_t)0); // Reset the decoder module (free the decoding object) xltDecReset(pInstanceInfo->decoderState); // this decoding job is over! reset Instance Info pointer pInstanceInfo->decoderState=NULL; // Reset the Workspace (the remaining unparsed document fragment will be lost) mgrResetWorkspace(id); return rc; } // this decoding job is over! reset Instance Info pointer // (the decoding object itself has been freed by the decoder) pInstanceInfo->decoderState=NULL; // Call the callback for handling an message ending if (pInstanceInfo->callbacks->endMessageFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; rc=pInstanceInfo->callbacks->endMessageFunc(id, pInstanceInfo->userData, final); return rc; } /* --- Dispatch parsed command (and call the applications command handler function)--- */ switch (cmdType) { /* Handle ADD Command */ case SML_PE_ADD: if (pInstanceInfo->callbacks->addCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->addCmdFunc (id, pInstanceInfo->userData, pContent); break; /* Handle ALERT Command */ case SML_PE_ALERT: if (pInstanceInfo->callbacks->alertCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->alertCmdFunc (id, pInstanceInfo->userData, pContent); break; /* Handle DELETE Command */ case SML_PE_DELETE: if (pInstanceInfo->callbacks->deleteCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->deleteCmdFunc (id, pInstanceInfo->userData, pContent); break; /* Handle PUT Command */ case SML_PE_PUT: if (pInstanceInfo->callbacks->putCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->putCmdFunc (id, pInstanceInfo->userData, pContent); break; /* Handle GET Command */ case SML_PE_GET: if (pInstanceInfo->callbacks->getCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->getCmdFunc (id, pInstanceInfo->userData, pContent); break; #ifdef MAP_RECEIVE /* Handle MAP Command */ case SML_PE_MAP: if (pInstanceInfo->callbacks->mapCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->mapCmdFunc (id, pInstanceInfo->userData, pContent); break; #endif #ifdef RESULT_RECEIVE /* Handle RESULTS Command */ case SML_PE_RESULTS: if (pInstanceInfo->callbacks->resultsCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->resultsCmdFunc (id, pInstanceInfo->userData, pContent); break; #endif /* Handle STATUS Command */ case SML_PE_STATUS: if (pInstanceInfo->callbacks->statusCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->statusCmdFunc (id, pInstanceInfo->userData, pContent); break; /* Handle START SYNC Command */ case SML_PE_SYNC_START: if (pInstanceInfo->callbacks->startSyncFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->startSyncFunc (id, pInstanceInfo->userData, pContent); break; /* Handle END SYNC Command */ case SML_PE_SYNC_END: if (pInstanceInfo->callbacks->endSyncFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->endSyncFunc (id, pInstanceInfo->userData); break; /* Handle REPLACE Command */ case SML_PE_REPLACE: if (pInstanceInfo->callbacks->replaceCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->replaceCmdFunc (id, pInstanceInfo->userData, pContent); break; /* Handle Final Flag */ case SML_PE_FINAL: // if a FINAL Flag appears do nothing return SML_ERR_OK; break; #ifdef SEARCH_RECEIVE /* these API calls are NOT included in the Toolkit lite version */ /* Handle SEARCH Command */ case SML_PE_SEARCH: if (pInstanceInfo->callbacks->searchCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->searchCmdFunc (id, pInstanceInfo->userData, pContent); break; #endif #ifdef SEQUENCE_RECEIVE /* Handle START SEQUENCE Command */ case SML_PE_SEQUENCE_START: if (pInstanceInfo->callbacks->startSequenceFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->startSequenceFunc (id, pInstanceInfo->userData, pContent); break; /* Handle END SEQUENCE Command */ case SML_PE_SEQUENCE_END: if (pInstanceInfo->callbacks->endSequenceFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->endSequenceFunc (id, pInstanceInfo->userData); break; #endif #ifdef ATOMIC_RECEIVE /* Handle START ATOMIC Command */ case SML_PE_ATOMIC_START: if (pInstanceInfo->callbacks->startAtomicFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->startAtomicFunc (id, pInstanceInfo->userData, pContent); break; /* Handle END ATOMIC Command */ case SML_PE_ATOMIC_END: if (pInstanceInfo->callbacks->endAtomicFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->endAtomicFunc (id, pInstanceInfo->userData); break; #endif #ifdef COPY_RECEIVE /* Handle COPY Command */ case SML_PE_COPY: if (pInstanceInfo->callbacks->copyCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->copyCmdFunc (id, pInstanceInfo->userData, pContent); break; #endif /* Handle MOVE Command */ case SML_PE_MOVE: if (pInstanceInfo->callbacks->moveCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->moveCmdFunc (id, pInstanceInfo->userData, pContent); break; #ifdef EXEC_RECEIVE /* Handle EXEC Command */ case SML_PE_EXEC: if (pInstanceInfo->callbacks->execCmdFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; return pInstanceInfo->callbacks->execCmdFunc (id, pInstanceInfo->userData, pContent); break; #endif /* Handle ERROR DETECTED */ //case SML_PE_ERROR: // if (pInstanceInfo->callbacks->handleErrorFunc==NULL) return SML_ERR_COMMAND_NOT_HANDLED; // return pInstanceInfo->callbacks->handleErrorFunc (id, pInstanceInfo->userData); // break; /* --- Invalid Command Element --- */ default: return SML_ERR_XLT_INVAL_PROTO_ELEM; break; } // switch } /* eof */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/mgrinstancelist.c0000755000373300037200000001503112424517753031614 0ustar00nightlyallusers00000000000000/** * @file * List of SyncML Instances * * @target_system all * @target_os all * @description This module handles an element list of type InstanceInfo. Each * element is identified by the InstanceID. There are functions provided * to add, find and remove InstanceInfo elements. * This file is private to the core module. The InstanceInfo list is * used by the Modules MGR, MGRCmdDispatcher, MGRCmdBuilder * and MGRInstanceMgr. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ /* Include Headers */ #include #include "libmem.h" #include "liblock.h" #include "mgr.h" #ifndef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ #ifndef NOWSM /* only need if we are using workspace manager */ /* Used external functions */ SyncMLInfoPtr_t mgrGetSyncMLAnchor(void); InstanceInfoPtr_t mgrGetInstanceListAnchor(void); void mgrSetInstanceListAnchor(InstanceInfoPtr_t newListAnchor); /* SyncML internal function prototypes */ Ret_t addInfo(InstanceInfoPtr_t pInfo); InstanceInfoPtr_t findInfo(InstanceID_t id); Ret_t removeInfo(InstanceID_t id); /* Private function prototypes */ /************************************************************************* * SyncML internal functions *************************************************************************/ /** * Adds a new element to the list * * @param pInfo (IN) * pointer to the structure to be be added to list * @return Return value,\n * SML_ERR_OK if element was added successfully */ Ret_t addInfo(InstanceInfoPtr_t pInfo) { if (pInfo!=NULL) { InstanceInfoPtr_t _pTmp; LOCKTOOLKIT("addInfo"); /* Remember old beginning of the list */ _pTmp=mgrGetInstanceListAnchor(); /* insert element immediately after anchor */ mgrSetInstanceListAnchor(pInfo); // anchor of list points now to new info element pInfo->nextInfo=_pTmp; // Next info element is the prior first one. RELEASETOOLKIT("addInfo"); return SML_ERR_OK; } else { // Invalid InstanceInfo pointer was used (NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; } } /** * Searches an element with the given InstanceID in the list * * @param id (IN) * ID of the InstanceInfo structure to be retrieved * @return Pointer to the InstanceInfo structure with the given ID\n * NULL, if no InstanceInfo with the given ID has been found */ InstanceInfoPtr_t findInfo(InstanceID_t id) { InstanceInfoPtr_t _pTmp; // A helper pointer /* go through the list until end */ LOCKTOOLKIT("findInfo"); for (_pTmp=mgrGetInstanceListAnchor(); _pTmp!=NULL; _pTmp=_pTmp->nextInfo) { if (_pTmp->id == id) { RELEASETOOLKIT("findInfo"); return _pTmp; // STOP, we've found the info, return! } } RELEASETOOLKIT("findInfo"); return NULL; // Info was not found, return NULL } /** * Removes an element with the given InstanceID from the list * * @param id (IN) * ID of the InstanceInfo structure to be removed * @return Return value,\n * SML_ERR_OK if element was removed successfully */ Ret_t removeInfo(InstanceID_t id) { InstanceInfoPtr_t _pTmp; // A helper pointer InstanceInfoPtr_t _pRemember; // A helper pointer LOCKTOOLKIT("removeInfo"); /* Remember current anchor */ _pRemember=mgrGetInstanceListAnchor(); /* special check, if list is empty */ if (_pRemember==NULL ) { RELEASETOOLKIT("removeInfo"); return SML_ERR_MGR_INVALID_INSTANCE_INFO; } /* special check, if first element should be removed */ if (_pRemember->id == id) { // It's the first element, update anchor! mgrSetInstanceListAnchor(_pRemember->nextInfo); //freeInfo(_pRemember); // Delete structure, free memory RELEASETOOLKIT("removeInfo"); return SML_ERR_OK; // return } /* go through the list until end */ for (_pTmp=_pRemember->nextInfo; _pTmp!=NULL; _pTmp=_pTmp->nextInfo) { if (_pTmp->id == id) // STOP, we've found the info { _pRemember->nextInfo=_pTmp->nextInfo; //freeInfo(_pTmp); // Delete structure, free memory RELEASETOOLKIT("removeInfo"); return SML_ERR_OK; // return } else { _pRemember=_pTmp; // update helper pointer } } RELEASETOOLKIT("removeInfo"); return SML_ERR_MGR_INVALID_INSTANCE_INFO; // Info wasn't found } #endif // !defined(NOWSM) #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/mgrinstancemgr.c0000755000373300037200000011025212424517753031427 0ustar00nightlyallusers00000000000000/** * @file * Managing SyncML Instances * * @target_system all * @target_os all * @description Core module for managing creation and usage of instances */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ /* Include Headers */ #include #include #include #include "libmem.h" #include "libstr.h" #include "liblock.h" #include "wsm.h" #include "mgr.h" #include /* Used external functions */ #ifndef NOWSM #ifndef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ extern Ret_t addInfo(InstanceInfoPtr_t pInfo); extern InstanceInfoPtr_t findInfo(InstanceID_t id); extern Ret_t removeInfo(InstanceID_t id); #endif SyncMLInfoPtr_t mgrGetSyncMLAnchor(void); #endif /* Prototypes of exported SyncML API functions */ SML_API Ret_t smlInitInstance(SmlCallbacksCPtr_t callbacks, SmlInstanceOptionsPtr_t pOptions, VoidPtr_t pUserData, InstanceID_t *pInstanceID); SML_API Ret_t smlTerminateInstance (InstanceID_t id); SML_API Ret_t smlLockReadBuffer(InstanceID_t id, MemPtr_t *pReadPosition, MemSize_t *usedSize); SML_API Ret_t smlUnlockReadBuffer(InstanceID_t id, MemSize_t processedBytes); #ifdef NOWSM SML_API Ret_t smlSetMaxOutgoingSize(InstanceID_t id, MemSize_t maxOutgoingSize); SML_API Ret_t smlSetOutgoingBegin(InstanceID_t id); #endif SML_API Ret_t smlLockWriteBuffer(InstanceID_t id, MemPtr_t *pWritePosition, MemSize_t *freeSize); SML_API Ret_t smlUnlockWriteBuffer(InstanceID_t id, MemSize_t writtenBytes); SML_API Ret_t smlSetCallbacks (InstanceID_t id, SmlCallbacksCPtr_t pCallbacks); SML_API Ret_t smlSetUserData (InstanceID_t id, VoidPtr_t pUserData); // added by luz %%%: SML_API Ret_t smlGetUserData(InstanceID_t id, VoidPtr_t *ppUserData); SML_API Ret_t smlGetEncoding(InstanceID_t id, SmlEncoding_t *pEncoding); #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ SML_API Ret_t smlSetEncoding (InstanceID_t id, SmlEncoding_t encoding); #endif /* Private function prototypes */ Ret_t freeInstanceOptions (InstanceInfoPtr_t pInstanceInfo); static Ret_t freeInstanceInfo (InstanceInfoPtr_t pInfo); Ret_t mgrResetWorkspace (InstanceID_t id); Ret_t setInstanceOptions (InstanceID_t id, SmlInstanceOptionsPtr_t pOptions); /************************************************************************* * Public SyncML API Functions *************************************************************************/ /** * Creates a SyncML instance and assigns a corresponding workspace buffer in * which XML documents are assembled or parsed. * All callback functions implemented by a particular application are defined. * Instance specific options can be passed. This function has to be called * before the first synchronization tasks can be performed. A reference valid * for a SyncML instance is returned. * An instance is active when processing a synchronization request * otherwise it is idle. An instance is terminated when smlTerminateInstance * is called. * * @param pCallbacks (IN) * A structure holding references to the callback functions * implemented by the application * @param pOptions (IN) * Option settings of a particular SyncML instance * @param pUserData (IN) * UserData is a pointer to a void structure the application * can pass into the SyncML Toolkit instance info. It will * be returned to the application with every called callback * function call!\n * NOTE: This is only a pointer, the memory object itself * remains within the responsibility of the calling application. * The memory object will not be copied, moved or freed by the Toolkit. * @param pInstanceID (OUT) * Instance ID assigned to the initialized instance * @return Error Code */ SML_API Ret_t smlInitInstance(SmlCallbacksCPtr_t pCallbacks, SmlInstanceOptionsPtr_t pOptions, VoidPtr_t pUserData, InstanceID_t *pInstanceID) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; Ret_t rc; #ifndef NOWSM /* --- Check pOptions, which have been passed by the application --- */ if (!pOptions || !pOptions->workspaceName) return SML_ERR_WRONG_USAGE; #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ /* if ONE instance is already initialized */ if (mgrGetInstanceListAnchor()!=NULL) return SML_ERR_WRONG_USAGE; #endif /* --- check wether we already know about this instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(*pInstanceID); #endif /* --- bail outh when we already have a instance with that id --- */ if (pInstanceInfo != NULL) return SML_ERR_WRONG_USAGE; /* --- Create a workspace for this instance --- */ LOCKTOOLKIT("smlInitInstance"); if ((rc = wsmCreate(pOptions->workspaceName, pOptions->workspaceSize, pInstanceID)) != SML_ERR_OK) { RELEASETOOLKIT("smlInitInstance after wsmCreate failure"); return rc; } RELEASETOOLKIT("smlInitInstance"); #else // NOWSM /* --- Check pOptions, which have been passed by the application --- */ if (!pOptions || !pOptions->workspaceSize) return SML_ERR_WRONG_USAGE; // ok so far rc=SML_ERR_OK; #endif /* --- Create an instance info memory object --- */ pInstanceInfo = (InstanceInfoPtr_t)smlLibMalloc((MemSize_t)sizeof(InstanceInfo_t)); if (pInstanceInfo==NULL) { #ifndef NOWSM wsmDestroy(pOptions->workspaceName); return SML_ERR_NOT_ENOUGH_SPACE; #endif } #ifdef NOWSM else { // instance info created, return pointer as instanceID *pInstanceID = (InstanceID_t)pInstanceInfo; } #endif smlLibMemset(pInstanceInfo,0,(MemSize_t)sizeof(InstanceInfo_t)); /* --- Set mandatory instance infos for this instance to defaults --- */ pInstanceInfo->status=MGR_IDLE; pInstanceInfo->encoderState=NULL; // no encoding in progress, currently not used pInstanceInfo->decoderState=NULL; // no decoding in progress, currently not used #ifndef NOWSM pInstanceInfo->id=*pInstanceID; pInstanceInfo->workspaceState=NULL; // to do: some workspace status info pInstanceInfo->nextInfo=NULL; #else // create a instance buffer pInstanceInfo->instanceBufSiz=pOptions->workspaceSize; // get requested size for the buffer pInstanceInfo->maxOutgoingSize=pOptions->maxOutgoingSize; // set max outgoing message size pInstanceInfo->instanceBuffer=smlLibMalloc(pInstanceInfo->instanceBufSiz); if (pInstanceInfo->instanceBuffer==NULL) return SML_ERR_NOT_ENOUGH_SPACE; // init buffer pointers pInstanceInfo->readPointer=pInstanceInfo->instanceBuffer; pInstanceInfo->writePointer=pInstanceInfo->instanceBuffer; pInstanceInfo->readLocked=0; pInstanceInfo->writeLocked=0; pInstanceInfo->outgoingMsgStart=NULL; pInstanceInfo->incomingMsgStart=NULL; #endif #ifndef NOWSM /* --- Add instance infos memory object to the instance info list --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ mgrSetInstanceListAnchor(pInstanceInfo); #else rc = addInfo( pInstanceInfo ); if (rc!=SML_ERR_OK) return rc; #endif #endif /* --- Set the values of instance Infos as defined by the calling application ---*/ /* Set user data pointer */ pInstanceInfo->userData=pUserData; /* Set callback functions implemented by applications */ if (smlSetCallbacks(*pInstanceID, pCallbacks) != SML_ERR_OK) { #ifndef NOWSM wsmDestroy(pOptions->workspaceName); #endif return rc; } // luz: %%% this was called twice, probably this is a bug, so I disabled the second call //smlSetCallbacks(*pInstanceID, pCallbacks); /* Set other application defined options for that instance */ if (setInstanceOptions (*pInstanceID, pOptions) != SML_ERR_OK) { #ifndef NOWSM wsmDestroy(pOptions->workspaceName); #endif return rc; } return SML_ERR_OK; } /** * Terminates a SyncML instance. The instance info is removed from the instances * list. Allmemory allocated for the workspace and the options variables is * freed. * * @param id (IN) * ID of the instance to be terminated * @return Error Code */ SML_API Ret_t smlTerminateInstance (InstanceID_t id) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else Ret_t rc; /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; #ifndef NOWSM /* --- Close the workspace --- */ if (pInstanceInfo->instanceOptions != NULL) { LOCKTOOLKIT("smlTerminateInstance"); rc = wsmDestroy(pInstanceInfo->instanceOptions->workspaceName); RELEASETOOLKIT("smlTerminateInstance"); if (rc!=SML_ERR_OK) { // freeInstanceInfo(pInstanceInfo); return rc; } } /* --- Delete instance info and options --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ mgrSetInstanceListAnchor(NULL); #else removeInfo(id); #endif #endif freeInstanceInfo (pInstanceInfo); return SML_ERR_OK; } /** * Sets new callback functions to an instance * * @param id (IN) * ID of the Instance * @param pCallbacks (IN) * A structure holding references to the callback functions * implemented by the application * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlSetCallbacks(InstanceID_t id, SmlCallbacksCPtr_t pCallbacks) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; SmlCallbacksPtr_t pCallbacksCopy; /* --- Check pCallbacks, which have been passed by the application --- */ if (!pCallbacks) return SML_ERR_WRONG_USAGE; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; #endif /* --- free old callback structure ---*/ smlLibFree(pInstanceInfo->callbacks); /* --- Use a copy of pCallbacksCopy --- */ pCallbacksCopy = (SmlCallbacksPtr_t)smlLibMalloc((MemSize_t)sizeof(SmlCallbacks_t)); if (pCallbacksCopy==NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemcpy(pCallbacksCopy,pCallbacks,(MemSize_t)sizeof(SmlCallbacks_t)); /* --- set new Callbacks --- */ pInstanceInfo->callbacks = pCallbacksCopy; return SML_ERR_OK; } /** * Sets a new Pointer to application specific user data, * which is passed to all invoked callback functions * * @param id (IN) * ID of the Instance * @param pUserData (IN) * UserData is a pointer to a void structure the application * can pass into the SyncML Toolkit instance info. It will * be returned to the application with every called callback * function call!\n * NOTE: This is only a pointer, the memory object itself * remains within the responsibility of the calling application. * The memory object will not be copied, moved or freed by the Toolkit. * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlSetUserData(InstanceID_t id, VoidPtr_t pUserData) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- set new user data pointer ---*/ pInstanceInfo->userData=pUserData; return SML_ERR_OK; } /** * Returns Pointer to application specific user data, * which is passed to all invoked callback functions * * @param id (IN) * ID of the Instance * @param ppUserData (OUT) * Receives current Userdata pointer * @return Return value,\n * SML_ERR_OK if successful * @note (added by luz %%%) */ SML_API Ret_t smlGetUserData(InstanceID_t id, VoidPtr_t *ppUserData) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- get userdata pointer ---*/ *ppUserData = pInstanceInfo->userData; return SML_ERR_OK; } // smlGetUserData /** * Returns Currently set encoding type * * @param id (IN) * ID of the Instance * @param pEncoding (OUT) * Receives current encoding * @return Return value,\n * SML_ERR_OK if successful * @note (added by luz %%%) */ SML_API Ret_t smlGetEncoding(InstanceID_t id, SmlEncoding_t *pEncoding) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- get encoding ---*/ *pEncoding = pInstanceInfo->instanceOptions->encoding; return SML_ERR_OK; } // smlGetEncoding /** * Sets new encoding type for this Instance * * @param id (IN) * ID of the Instance * @param encoding (IN) * Type of Encoding to be used within this Instance * @return Return value,\n * SML_ERR_OK if successful */ #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ SML_API Ret_t smlSetEncoding(InstanceID_t id, SmlEncoding_t encoding) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; /* --- Check pCallbacks, which have been passed by the application --- */ if (encoding==SML_UNDEF) return SML_ERR_WRONG_USAGE; #ifdef NOWSM pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- free old callback structure ---*/ pInstanceInfo->instanceOptions->encoding = encoding; return SML_ERR_OK; } #endif /** * Locks the workspace buffer, which is assigned to the given instance * for reading. After this function is called, the application has * access to the workspace buffer, beginning at the address pReadPosition which * is returned by this function. SyncML will not change the workspace * buffer until smlUnlockReadBuffer is called. * pReadPosition returns a pointer to a valid position in the SyncML workspace * buffer. The pointer can be used by the application for copying outgoing * synchronization data from the buffer into some transport layer. usedSize * retrieves the size of synchronization data currently stored in the * workspace buffer beginning from the address to which pReadPosition points to. * This information is needed by the application when copying XML code out * of the buffer (while sending synchronization data) * * @param id (IN) * ID of the Instance * @param pReadPosition (OUT) * Workspace Pointer from which data can be read * @param usedSize (OUT) * Size of used data in workspace which may be read * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlLockReadBuffer(InstanceID_t id, MemPtr_t *pReadPosition, MemSize_t *usedSize) { #ifdef NOWSM InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // must not be already locked here if (pInstanceInfo->readLocked) return SML_ERR_WRONG_USAGE; // everything that is already written can also be read *pReadPosition = pInstanceInfo->readPointer; // used portion is what is between read and write pointers *usedSize = pInstanceInfo->writePointer-pInstanceInfo->readPointer; // lock pInstanceInfo->readLocked=1; #else Ret_t rc; LOCKTOOLKIT("smlLockReadBuffer"); /* --- Lock Workspace exclusively for reading and get a "Read" pointer --- */ rc = wsmLockH(id, SML_FIRST_DATA_ITEM, pReadPosition); RELEASETOOLKIT("smlLockReadBuffer"); if (rc!=SML_ERR_OK) return rc; /* --- Check, how much data has to be read ---*/ LOCKTOOLKIT("smlLockReadBuffer"); rc = wsmGetUsedSize(id,usedSize); RELEASETOOLKIT("smlLockReadBuffer"); if (rc!=SML_ERR_OK) return rc; #endif return SML_ERR_OK; } /** * End the read access of the application to the workspace buffer. * SyncML is now owner of the buffer again and is able to manipulate its contents. * processedBytes passes the number of bytes, which the application has * successfully read and processed (e.g. when the application has copied * outgoing synchronization data from the workspace into a communication module). * SyncML removes the given number of bytes from the workspace! * * @param id (IN) * ID of the Instance * @param processedBytes (IN) * Actually read and processed bytes * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlUnlockReadBuffer(InstanceID_t id, MemSize_t processedBytes) { #ifdef NOWSM InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // must be already locked here if (!pInstanceInfo->readLocked) return SML_ERR_WRONG_USAGE; // advance read pointer by number of bytes processed if (pInstanceInfo->readPointer+processedBytes>pInstanceInfo->writePointer) return SML_ERR_WRONG_USAGE; // too many bytes processed // update read pointer pInstanceInfo->readPointer+=processedBytes; /* %%% moved from here to smlLockWriteBuffer to leave buffer intact until we actually need to write more data (important for re-sending retries) // auto-reset pointers if we have now read everything if (pInstanceInfo->readPointer == pInstanceInfo->writePointer) { // clear the buffer mgrResetWorkspace(pInstanceInfo); } */ // unlock pInstanceInfo->readLocked=0; #else Ret_t rc; /* --- Pass the number of bytes which have been read --- */ LOCKTOOLKIT("smlUnlockReadBuffer"); rc = wsmProcessedBytes (id,processedBytes); RELEASETOOLKIT("smlUnlockReadBuffer"); if (rc!=SML_ERR_OK) return rc; /* --- Unlock Workspace --- */ LOCKTOOLKIT("smlUnlockReadBuffer"); rc = wsmUnlockH(id); RELEASETOOLKIT("smlUnlockReadBuffer"); if (rc!=SML_ERR_OK) return rc; #endif return SML_ERR_OK; } #ifdef NOWSM /** * Set max outgoing message size * * @param id (IN) * ID of the Instance * @param maxOutgoingSize (IN) * maximum size of outgoing message * (0=no limit except buffer size) * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlSetMaxOutgoingSize(InstanceID_t id, MemSize_t maxOutgoingSize) { InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // set max outgoing message size pInstanceInfo->maxOutgoingSize = maxOutgoingSize; return SML_ERR_OK; } /** * Marks the current write pointer position as beginning of a new outgoing * message. This is used to track outgoing message size while writing it * * @param id (IN) * ID of the Instance * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlSetOutgoingBegin(InstanceID_t id) { InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // remember current write pointer pInstanceInfo->outgoingMsgStart=pInstanceInfo->writePointer; return SML_ERR_OK; } /** * resets the read pointer to the beginning of the outgoing message * (must be set previously using smlSetOutgoingBegin()) * Note: this can also be used to make sure next smlLockReadBuffer() * does not return unprocessed garbage from a message * written previously to the buffer (as it can be the case * when using the same sml instance for both request and * response processing, as in libsynthesis). In this case * calling smlReadOutgoingAgain() ADVANCES the read * pointer past unprocessed garbage to the point in the * buffer where the next outgoing message starts. * * @param id (IN) * ID of the Instance * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlReadOutgoingAgain(InstanceID_t id) { InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // reset read pointer back to beginning of outgoing message (can be used for message retries) if (pInstanceInfo->outgoingMsgStart==NULL) return SML_ERR_WRONG_USAGE; // no outgoing start set pInstanceInfo->readPointer=pInstanceInfo->outgoingMsgStart; return SML_ERR_OK; } /** * gets pointer to message in buffer for dumping purposes * @note This is only valid for incoming messages BEFORE outgoing message writing has started * into the same instance buffer! * * @param id (IN) * ID of the Instance * @param outgoing (IN) * if set, outgoing message is returned, incoming otherwise * @param message (OUT) * pointer to message * @param msgsize (OUT) * message size * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlPeekMessageBuffer(InstanceID_t id, Boolean_t outgoing, MemPtr_t *message, MemSize_t *msgsize) { InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; if (outgoing) { if (pInstanceInfo->outgoingMsgStart==NULL) return SML_ERR_WRONG_USAGE; // no outgoing message yet *message = pInstanceInfo->outgoingMsgStart; } else { if (pInstanceInfo->incomingMsgStart) { // incoming message start already detected, return it *message = pInstanceInfo->incomingMsgStart; } else { // apparently not started analyzing, assume read pointer as beginning of message if (pInstanceInfo->readPointer==0) return SML_ERR_WRONG_USAGE; // no outgoing message yet *message = pInstanceInfo->readPointer; } } if (*message>=pInstanceInfo->writePointer) return SML_ERR_WRONG_USAGE; // invalid pointer positions // size is space between start and write pointer *msgsize = pInstanceInfo->writePointer-*message; return SML_ERR_OK; } #endif /** * Locks the workspace buffer, which is assigned to the given * instance for writing. After this function is called, the * application has access to the workspace buffer, beginning * at the address pWritePosition which is returned by this * function. SyncML will not change the workspace buffer until * smlUnlockWriteBuffer is called. * pWritePosition returns a pointer to a valid position in the * SyncML workspace buffer. The pointer can be used by the application * for copying incoming synchronization data from some transport * layer into the buffer. freeSize retrieves the maximum usable * size of the workspace buffer beginning from the address to * which pWritePosition points to. This information is needed by * the application when copying XML code into the buffer (while * receiving synchronization data) * * @param id (IN) * ID of the Instance * @param pWritePosition (OUT) * Workspace Pointer to which data can be written * @param freeSize (OUT) * Max free Size of available space for data * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlLockWriteBuffer(InstanceID_t id, MemPtr_t *pWritePosition, MemSize_t *freeSize) { #ifdef NOWSM InstanceInfoPtr_t pInstanceInfo; Boolean_t ogs; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // must not be already locked here if (pInstanceInfo->writeLocked) return SML_ERR_WRONG_USAGE; // auto-reset pointers if buffer is empty by now if (pInstanceInfo->readPointer == pInstanceInfo->writePointer) { // remember if we were at outgoing message start point ogs = pInstanceInfo->outgoingMsgStart == pInstanceInfo->writePointer; // clear the buffer mgrResetWorkspace(pInstanceInfo); // restore outgoingMsgStart (to beginning of buffer now!) if it was set before if (ogs) pInstanceInfo->outgoingMsgStart=pInstanceInfo->writePointer; } // return current write pointer *pWritePosition = pInstanceInfo->writePointer; // free portion is either determined by actual room in buffer, or maximum outgoing size if set if ( pInstanceInfo->maxOutgoingSize && pInstanceInfo->outgoingMsgStart && pInstanceInfo->outgoingMsgStartwritePointer ) { // calculate what is allowed according to maxOutgoingSize *freeSize = (pInstanceInfo->maxOutgoingSize) - // maximum outgoing size (pInstanceInfo->writePointer-pInstanceInfo->outgoingMsgStart); // size of outgoing message so far if (pInstanceInfo->writePointer+*freeSize > pInstanceInfo->instanceBuffer+pInstanceInfo->instanceBufSiz) { // actual space in buffer is smaller *freeSize = (pInstanceInfo->instanceBuffer+pInstanceInfo->instanceBufSiz) - // end of buffer pInstanceInfo->writePointer; // current write position } } else { // simply return available size in buffer *freeSize = (pInstanceInfo->instanceBuffer+pInstanceInfo->instanceBufSiz) - // end of buffer pInstanceInfo->writePointer; // current write position } // lock pInstanceInfo->writeLocked=1; #else Ret_t rc; /* --- Lock Workspace exclusively for writing and get a "Write" pointer --- */ LOCKTOOLKIT("smlLockWriteBuffer"); rc = wsmLockH(id, SML_FIRST_FREE_ITEM, pWritePosition); RELEASETOOLKIT("smlLockWriteBuffer"); if (rc!=SML_ERR_OK) return rc; /* --- Check, how much free space is available for writing --- */ LOCKTOOLKIT("smlLockWriteBuffer"); rc = wsmGetFreeSize(id, freeSize); RELEASETOOLKIT("smlLockWriteBuffer"); if (rc!=SML_ERR_OK) return rc; #endif return SML_ERR_OK; } /** * * End the write access of the application to the workspace buffer. * SyncML is now owner of the buffer again and is able to manipulate its * contents. writtenBytes passes the number of bytes which have been * written into the workspace buffer (e.g. when the application has copied * incoming synchronization data from a communication module into the * workspace). This information is needed by SyncML when processing received * synchronization data. * * @param id (IN) * ID of the Instance * @param writtenBytes (IN) * Actually written bytes * @return Return value,\n * SML_ERR_OK if successful */ SML_API Ret_t smlUnlockWriteBuffer(InstanceID_t id, MemSize_t writtenBytes) { #ifdef NOWSM InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; // must be already locked here if (!pInstanceInfo->writeLocked) return SML_ERR_WRONG_USAGE; if (writtenBytes > 0) { // advance write pointer by number of bytes written if (pInstanceInfo->writePointer+writtenBytes>pInstanceInfo->instanceBuffer+pInstanceInfo->instanceBufSiz) return SML_ERR_WRONG_USAGE; // too many bytes written // update write pointer pInstanceInfo->writePointer+=writtenBytes; } // unlock pInstanceInfo->writeLocked=0; #else Ret_t rc; if (writtenBytes > 0) { /* --- Pass the number of bytes which have been written --- */ LOCKTOOLKIT("smlUnlockWriteBuffer"); rc = wsmSetUsedSize(id,writtenBytes); RELEASETOOLKIT("smlUnlockWriteBuffer"); if (rc!=SML_ERR_OK) return rc; } /* --- Unlock Workspace --- */ LOCKTOOLKIT("smlUnlockWriteBuffer"); rc = wsmUnlockH(id); RELEASETOOLKIT("smlUnlockWriteBuffer"); if (rc!=SML_ERR_OK) return rc; #endif return SML_ERR_OK; } /************************************************************************* * SyncML internal functions *************************************************************************/ /** * Reset the Workspace Buffer position to the beginning of the workspace * (clears all data in the buffer) * * @param id (IN) * ID of the Instance * @return Return value,\n * SML_ERR_OK if successful */ Ret_t mgrResetWorkspace (InstanceID_t id) { #ifdef NOWSM InstanceInfoPtr_t pInstanceInfo; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; pInstanceInfo->readPointer=pInstanceInfo->instanceBuffer; pInstanceInfo->writePointer=pInstanceInfo->instanceBuffer; pInstanceInfo->outgoingMsgStart=NULL; // no outgoing message in the buffer pInstanceInfo->incomingMsgStart=NULL; // no incoming message in the buffer return SML_ERR_OK; // ok #else Ret_t rc; LOCKTOOLKIT("mgrResetWorkspace"); rc=wsmReset (id); RELEASETOOLKIT("mgrResetWorkspace"); return rc; #endif } /** * The options settings of an instance are set to a new value * * @param id (IN) * Instance ID assigned to the instance * @param pOptions (IN) * New option settings of that particular SyncML instance\n * NOTE: only the encoding can be changed during life-time of an * instance. The other parameters of the instance options * (workspace size and name cannot be changed) * @return Error Code */ Ret_t setInstanceOptions (InstanceID_t id, SmlInstanceOptionsPtr_t pOptions) { /* --- Definitions --- */ InstanceInfoPtr_t pInstanceInfo; SmlInstanceOptionsPtr_t pOptionsCopy; #ifdef NOWSM /* --- Ckeck pOptions, which have been passed by the application --- */ if (!pOptions || (pOptions->encoding==SML_UNDEF)) return SML_ERR_WRONG_USAGE; pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer #else /* --- Ckeck pOptions, which have been passed by the application --- */ if (!pOptions || !pOptions->workspaceName|| (pOptions->encoding==SML_UNDEF)) return SML_ERR_WRONG_USAGE; /* --- Find that instance --- */ #ifdef __SML_LITE__ /* Only ONE instance is supported in the Toolkit lite version */ pInstanceInfo = mgrGetInstanceListAnchor(); #else pInstanceInfo = (InstanceInfoPtr_t) findInfo(id); #endif #endif if (pInstanceInfo==NULL) return SML_ERR_MGR_INVALID_INSTANCE_INFO; /* --- free old instance options ---*/ freeInstanceOptions(pInstanceInfo); /* --- Use a copy of pOptionsCopy --- */ pOptionsCopy = (SmlInstanceOptionsPtr_t)smlLibMalloc((MemSize_t)sizeof(SmlInstanceOptions_t)); if (pOptionsCopy==NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemcpy(pOptionsCopy,pOptions,(MemSize_t)sizeof(SmlInstanceOptions_t)); #ifndef NOWSM pOptionsCopy->workspaceName=smlLibStrdup(pOptions->workspaceName); if (pOptionsCopy->workspaceName == NULL) { pInstanceInfo->instanceOptions=NULL; smlLibFree(pOptionsCopy); return SML_ERR_NOT_ENOUGH_SPACE; } #endif /* --- Assign the new options --- */ pInstanceInfo->instanceOptions=pOptionsCopy; /* --- Let the new settingds take effect --- */ /* --- Adjust workspace size ---*/ /* --- Change workspace name ---*/ // NOT SUPPORTED FOR YELLOW return SML_ERR_OK; } /** * Free Instances Options * * @param pInfo (IN) * Pointer to the pInstance Info, which options should be freed * @return SML_ERR_OK */ Ret_t freeInstanceOptions (InstanceInfoPtr_t pInfo) { /* --- Delete instance options (if there are any) --- */ if (pInfo->instanceOptions!=NULL) { #ifndef NOWSM if (pInfo->instanceOptions->workspaceName!=NULL) smlLibFree(pInfo->instanceOptions->workspaceName); // don't forget the substructures #endif smlLibFree(pInfo->instanceOptions); } return SML_ERR_OK; } /** * Free the memory of an removed Instance Info * (including referenced sub structures) * * @param id (IN) * ID of the InstanceInfo structure to be freed */ static Ret_t freeInstanceInfo(InstanceInfoPtr_t pInfo) { if (pInfo) { #ifdef NOWSM // return the instance buffer if (pInfo->instanceBuffer) smlLibFree(pInfo->instanceBuffer); #else if (pInfo->workspaceState) smlLibFree(pInfo->workspaceState); #endif if (pInfo->encoderState) xltEncReset((XltEncoderPtr_t)pInfo->encoderState); if (pInfo->decoderState) xltDecReset((XltDecoderPtr_t)pInfo->decoderState); if (pInfo->callbacks) smlLibFree(pInfo->callbacks); freeInstanceOptions(pInfo); smlLibFree(pInfo); } return SML_ERR_OK; } syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/all/mgrutil.c0000755000373300037200000012243212424517753030075 0ustar00nightlyallusers00000000000000/** * @file * some helper functions * * @target_system all * @target_os all * @description */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ /* Include Headers */ #include #include #include #include #include #include #include "libmem.h" #include "libstr.h" #include "liblock.h" #include "mgr.h" #include "mgrutil.h" /************************************************************************* * Exported SyncML API functions *************************************************************************/ /** * Frees all allocated memory of a smlProtoElement * * @param pProtoElement (IN) * Element to free * @return Return Code */ SML_API Ret_t smlFreeProtoElement(VoidPtr_t pProtoElement) { if (! pProtoElement) return(SML_ERR_OK); switch (((SmlUnknownProtoElementPtr_t)pProtoElement)->elementType) { case SML_PE_HEADER: smlFreeSyncHdr((SmlSyncHdrPtr_t)pProtoElement); break; case SML_PE_SYNC_START: smlFreeSync((SmlSyncPtr_t)pProtoElement); break; case SML_PE_ADD: case SML_PE_COPY: case SML_PE_MOVE: case SML_PE_REPLACE: case SML_PE_DELETE: case SML_PE_GENERIC: smlFreeGeneric((SmlGenericCmdPtr_t)pProtoElement); break; case SML_PE_ALERT: smlFreeAlert((SmlAlertPtr_t)pProtoElement); break; case SML_PE_ATOMIC_START: case SML_PE_SEQUENCE_START: case SML_PE_CMD_GROUP: smlFreeAtomic((SmlAtomicPtr_t)pProtoElement); break; #if (defined EXEC_SEND || defined EXEC_RECEIVE) case SML_PE_EXEC: smlFreeExec((SmlExecPtr_t)pProtoElement); break; #endif case SML_PE_PUT: case SML_PE_GET: case SML_PE_PUT_GET: smlFreeGetPut((SmlPutPtr_t)pProtoElement); break; case SML_PE_MAP: smlFreeMap((SmlMapPtr_t)pProtoElement); break; case SML_PE_RESULTS: smlFreeResults((SmlResultsPtr_t)pProtoElement); break; #if (defined SEARCH_SEND || defined SEARCH_RECEIVE) case SML_PE_SEARCH: smlFreeSearch((SmlSearchPtr_t)pProtoElement); break; #endif case SML_PE_STATUS: smlFreeStatus((SmlStatusPtr_t)pProtoElement); break; default: return(SML_ERR_A_UTI_UNKNOWN_PROTO_ELEMENT); } return(SML_ERR_OK); } /** * Frees the Memory of an allocated Pcdata memory object * * @param pPcdata (IN) * A Pointer to a PcData structure, which should be freed */ SML_API void smlFreePcdata(SmlPcdataPtr_t pPcdata) { if (! pPcdata) return; if (pPcdata->contentType == SML_PCDATA_EXTENSION) { switch ((int)pPcdata->extension) { #ifdef __USE_METINF__ case SML_EXT_METINF: smlFreeMetinfMetinf(pPcdata->content); smlLibFree(pPcdata); break; #endif #ifdef __USE_DEVINF__ case SML_EXT_DEVINF: smlFreeDevInfDevInf(pPcdata->content); smlLibFree(pPcdata); break; #endif } return; } if (pPcdata->content) smlLibFree(pPcdata->content); smlLibFree(pPcdata); } SML_API void smlFreePcdataList(SmlPcdataListPtr_t list) { if (!list) return; smlFreePcdataList(list->next); smlFreePcdata(list->data); smlLibFree(list); return; } #ifdef __USE_METINF__ /** Subfunctions to smlFreePcdata, to freeup MetaInf DTD structures */ SML_API void smlFreeMetinfMetinf(SmlMetInfMetInfPtr_t data) { if (!data) return; smlFreePcdata(data->format); smlFreePcdata(data->type); smlFreePcdata(data->mark); smlFreePcdata(data->size); smlFreePcdata(data->version); smlFreePcdata(data->nextnonce); smlFreePcdata(data->maxmsgsize); /* SCTSTK - 18/03/2002, S.H. 2002-04-05 : SyncML 1.1 */ smlFreePcdata(data->maxobjsize); smlFreeMetinfAnchor(data->anchor); smlFreeMetinfMem(data->mem); smlFreePcdataList(data->emi); smlLibFree(data); return; } SML_API void smlFreeMetinfAnchor(SmlMetInfAnchorPtr_t data) { if (!data) return; smlFreePcdata(data->last); smlFreePcdata(data->next); smlLibFree(data); return; } SML_API void smlFreeMetinfMem(SmlMetInfMemPtr_t data) { if (!data) return; /* smlFreePcdata(data->shared); %%% luz 2005-08-24: shared is a flag, not a Pcdata - */ smlFreePcdata(data->free); smlFreePcdata(data->freeid); smlLibFree(data); return; } #endif #ifdef __USE_DEVINF__ /** Subfunctions to smlFreePcdata, to freeup DevInf DTD structures */ SML_API void smlFreeDevInfDevInf(SmlDevInfDevInfPtr_t data) { if (!data) return; smlFreePcdata(data->verdtd); smlFreePcdata(data->man); smlFreePcdata(data->mod); smlFreePcdata(data->oem); smlFreePcdata(data->fwv); smlFreePcdata(data->hwv); smlFreePcdata(data->swv); smlFreePcdata(data->devid); smlFreePcdata(data->devtyp); smlFreeDevInfDatastoreList(data->datastore); smlFreeDevInfExtList(data->ext); smlFreeDevInfCtcapList(data->ctcap); smlLibFree(data); } SML_API void smlFreeDevInfDatastore(SmlDevInfDatastorePtr_t data) { if (!data) return; smlFreePcdata(data->sourceref); smlFreePcdata(data->displayname); smlFreePcdata(data->maxguidsize); smlFreeDevInfXmit(data->rxpref); smlFreeDevInfXmit(data->txpref); smlFreeDevInfXmitList(data->rx); smlFreeDevInfXmitList(data->tx); smlFreeDevInfDSMem(data->dsmem); smlFreeDevInfSynccap(data->synccap); smlFreeDevInfXmitList(data->filterrx); smlFreeDevInfCtcapList(data->ctcap); smlFreeDevInfFilterCapList(data->filtercap); smlLibFree(data); return; } SML_API void smlFreeDevInfDatastoreList(SmlDevInfDatastoreListPtr_t data) { if (!data) return; smlFreeDevInfDatastore(data->data); smlFreeDevInfDatastoreList(data->next); smlLibFree(data); return; } SML_API void smlFreeDevInfXmitList(SmlDevInfXmitListPtr_t data) { if (!data) return; smlFreeDevInfXmit(data->data); smlFreeDevInfXmitList(data->next); smlLibFree(data); } SML_API void smlFreeDevInfXmit(SmlDevInfXmitPtr_t data) { if (!data) return; smlFreePcdata(data->cttype); smlFreePcdata(data->verct); smlLibFree(data); } SML_API void smlFreeDevInfDSMem(SmlDevInfDSMemPtr_t data) { if (!data) return; // %%%luz:2003-04-28: this is now a flag! smlFreePcdata(data->shared); smlFreePcdata(data->maxmem); smlFreePcdata(data->maxid); smlLibFree(data); } SML_API void smlFreeDevInfSynccap(SmlDevInfSyncCapPtr_t data) { if (!data) return; smlFreePcdataList(data->synctype); smlLibFree(data); } SML_API void smlFreeDevInfExt(SmlDevInfExtPtr_t data) { if (!data) return; smlFreePcdata(data->xnam); smlFreePcdataList(data->xval); smlLibFree(data); } SML_API void smlFreeDevInfExtList(SmlDevInfExtListPtr_t data) { if (!data) return; smlFreeDevInfExt(data->data); smlFreeDevInfExtList(data->next); smlLibFree(data); } SML_API void smlFreeDevInfCTData(SmlDevInfCTDataPtr_t data) { if (!data) return; smlFreePcdata(data->name); smlFreePcdata(data->dname); smlFreePcdataList(data->valenum); smlFreePcdata(data->datatype); smlFreePcdata(data->maxsize); smlFreePcdata(data->maxoccur); smlLibFree(data); } SML_API void smlFreeDevInfCTDataProp(SmlDevInfCTDataPropPtr_t data) { if (!data) return; smlFreeDevInfCTData(data->prop); smlFreeDevInfCTDataList(data->param); smlLibFree(data); } SML_API void smlFreeDevInfCTDataList(SmlDevInfCTDataListPtr_t data) { if (!data) return; smlFreeDevInfCTData(data->data); smlFreeDevInfCTDataList(data->next); smlLibFree(data); } SML_API void smlFreeDevInfCTDataPropList(SmlDevInfCTDataPropListPtr_t data) { if (!data) return; smlFreeDevInfCTDataProp(data->data); smlFreeDevInfCTDataPropList(data->next); smlLibFree(data); } SML_API void smlFreeDevInfCTCap(SmlDevInfCTCapPtr_t data) { if (!data) return; smlFreePcdata(data->cttype); smlFreePcdata(data->verct); smlFreeDevInfCTDataPropList(data->prop); smlLibFree(data); } SML_API void smlFreeDevInfCtcapList(SmlDevInfCtcapListPtr_t data) { if (!data) return; smlFreeDevInfCTCap(data->data); smlFreeDevInfCtcapList(data->next); smlLibFree(data); } SML_API void smlFreeDevInfFilterCap(SmlDevInfFilterCapPtr_t data) { if (!data) return; smlFreePcdata(data->cttype); smlFreePcdata(data->verct); smlFreePcdataList(data->filterkeyword); smlFreePcdataList(data->propname); smlLibFree(data); } SML_API void smlFreeDevInfFilterCapList(SmlDevInfFilterCapListPtr_t data) { if (!data) return; smlFreeDevInfFilterCap(data->data); smlFreeDevInfFilterCapList(data->next); smlLibFree(data); } #endif /************************************************************************* * Exported SyncML API functions (FULL-SIZE TOOLKIT ONLY) *************************************************************************/ #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ /** * Return amount of unused Workspace memory * * @param id instance ID * @return Amount of unused Workspace memory */ SML_API MemSize_t smlGetFreeBuffer(InstanceID_t id) { /* Definitions */ MemSize_t freeMem=0; #ifdef NOWSM InstanceInfoPtr_t pInstanceInfo = (InstanceInfoPtr_t)id; // ID is the instance info pointer if (pInstanceInfo==NULL) return 0; // no buffer if no instance there freeMem = (pInstanceInfo->instanceBuffer+pInstanceInfo->instanceBufSiz) - // end of buffer pInstanceInfo->writePointer; // current write pointer #else /* ask the Workspace Buffer */ LOCKTOOLKIT("smlGetFreeBuffer"); wsmGetFreeSize(id, &freeMem); RELEASETOOLKIT("smlGetFreeBuffer"); #endif return (MemSize_t)freeMem; } /** * Copy a string into a Pcdata structure * * @param str (IN) * Input String * @return A Pointer to a PcData structure */ SML_API SmlPcdataPtr_t smlString2Pcdata(String_t str) { /* Definitions */ SmlPcdataPtr_t pcdata; /* Invalid Input */ if (! str) return NULL; /* Allocate the PcData Structure */ pcdata = (SmlPcdataPtr_t)smlLibMalloc((MemSize_t)sizeof(SmlPcdata_t)); if (! pcdata) return NULL; smlLibMemset (pcdata, 0, (MemSize_t)sizeof(SmlPcdata_t)); /* Set the PcData Structure */ pcdata->contentType = SML_PCDATA_STRING; pcdata->length = smlLibStrlen( str ); pcdata->content = (VoidPtr_t)smlLibStrdup(str); return pcdata; } /** * Copy a Pcdata structure into a string * * @param pcdata (IN) * A Pointer to a PcData structure * @return Input String */ SML_API String_t smlPcdata2String(SmlPcdataPtr_t pcdata) { /* Definitions */ String_t str; /* Invalid Input */ if (! pcdata) return NULL; /* Allocate the String */ str = (String_t)smlLibMalloc((MemSize_t)(pcdata->length+1)); if (str == NULL) return NULL; /* Copy the string into the allocated data structure */ smlLibMemcpy((MemPtr_t)str, (MemPtr_t)pcdata->content, pcdata->length); *(str + pcdata->length) = '\0'; return str; } /** * Duplicates a Pcdata memory object * * @param pcdata (IN) * A Pointer to the original PcData structure * @return A Pointer to the copy of the PcData structure */ SML_API SmlPcdataPtr_t smlPcdataDup(SmlPcdataPtr_t pcdata) { /* Definitions */ SmlPcdataPtr_t newPcdata; /* Invalid Input */ if (! pcdata) return NULL; /* Allocate the new pcdata memory object */ newPcdata = (SmlPcdataPtr_t)smlLibMalloc((MemSize_t)sizeof(SmlPcdata_t)); if (! newPcdata) return NULL; smlLibMemset (newPcdata, 0, (MemSize_t)sizeof(SmlPcdata_t)); /* Set the PcData Structure */ newPcdata->contentType = pcdata->contentType; newPcdata->length = pcdata->length; newPcdata->content =(VoidPtr_t)smlLibMalloc((MemSize_t)pcdata->length+1); if (newPcdata->content ==NULL) { smlLibFree(newPcdata->content); smlLibFree(newPcdata); return NULL; } smlLibMemset(newPcdata->content, 0, (MemSize_t)((pcdata->length)+1)); smlLibMemcpy(newPcdata->content, pcdata->content, (MemSize_t)pcdata->length); return newPcdata; } #endif SML_API void smlFreeSyncHdr(SmlSyncHdrPtr_t pSyncHdr) { if (! pSyncHdr) return; smlFreePcdata(pSyncHdr->version); smlFreePcdata(pSyncHdr->proto); smlFreePcdata(pSyncHdr->sessionID); smlFreePcdata(pSyncHdr->msgID); smlFreePcdata(pSyncHdr->respURI); smlFreePcdata(pSyncHdr->meta); smlFreeSourceTargetPtr(pSyncHdr->source); smlFreeSourceTargetPtr(pSyncHdr->target); smlFreeCredPtr(pSyncHdr->cred); smlLibFree(pSyncHdr); } SML_API void smlFreeSync(SmlSyncPtr_t pSync) { if (! pSync) return; smlFreePcdata(pSync->cmdID); smlFreePcdata(pSync->meta); smlFreePcdata(pSync->noc); // %%% luz 2004-09-29 added to fix mem leak smlFreeSourceTargetPtr(pSync->source); smlFreeSourceTargetPtr(pSync->target); smlFreeCredPtr(pSync->cred); smlLibFree(pSync); } SML_API void smlFreeGeneric(SmlGenericCmdPtr_t pGenericCmd) { if (! pGenericCmd) return; smlFreePcdata(pGenericCmd->cmdID); smlFreePcdata(pGenericCmd->meta); smlFreeCredPtr(pGenericCmd->cred); smlFreeItemList(pGenericCmd->itemList); smlLibFree(pGenericCmd); } SML_API void smlFreeAlert(SmlAlertPtr_t pAlert) { if (! pAlert) return; smlFreePcdata(pAlert->cmdID); smlFreePcdata(pAlert->data); smlFreeCredPtr(pAlert->cred); smlFreeItemList(pAlert->itemList); smlLibFree(pAlert); } SML_API void smlFreeAtomic(SmlAtomicPtr_t pAtomic) { if (! pAtomic) return; smlFreePcdata(pAtomic->cmdID); smlFreePcdata(pAtomic->meta); smlLibFree(pAtomic); } #if (defined EXEC_SEND || defined EXEC_RECEIVE) SML_API void smlFreeExec(SmlExecPtr_t pExec) { if (! pExec) return; smlFreePcdata(pExec->cmdID); smlFreeCredPtr(pExec->cred); smlFreeItemPtr(pExec->item); smlLibFree(pExec); } #endif SML_API void smlFreeGetPut(SmlPutPtr_t pGetPut) { if (! pGetPut) return; smlFreePcdata(pGetPut->cmdID); smlFreePcdata(pGetPut->meta); smlFreePcdata(pGetPut->lang); smlFreeCredPtr(pGetPut->cred); smlFreeItemList(pGetPut->itemList); smlLibFree(pGetPut); } SML_API void smlFreeMap(SmlMapPtr_t pMap) { if (! pMap) return; smlFreePcdata(pMap->cmdID); smlFreePcdata(pMap->meta); smlFreeCredPtr(pMap->cred); smlFreeSourceTargetPtr(pMap->source); smlFreeSourceTargetPtr(pMap->target); smlFreeMapItemList(pMap->mapItemList); smlLibFree(pMap); } SML_API void smlFreeResults(SmlResultsPtr_t pResults) { if (! pResults) return; smlFreePcdata(pResults->cmdID); smlFreePcdata(pResults->msgRef); smlFreePcdata(pResults->cmdRef); smlFreePcdata(pResults->meta); smlFreePcdata(pResults->targetRef); smlFreePcdata(pResults->sourceRef); smlFreeItemList(pResults->itemList); smlLibFree(pResults); } #if (defined SEARCH_SEND || defined SEARCH_RECEIVE) SML_API void smlFreeSearch(SmlSearchPtr_t pSearch) { if (! pSearch) return; smlFreePcdata(pSearch->cmdID); smlFreePcdata(pSearch->lang); smlFreePcdata(pSearch->meta); smlFreePcdata(pSearch->data); smlFreeCredPtr(pSearch->cred); smlFreeSourceTargetPtr(pSearch->target); smlFreeSourceList(pSearch->sourceList); smlLibFree(pSearch); } #endif SML_API void smlFreeStatus(SmlStatusPtr_t pStatus) { if (! pStatus) return; smlFreePcdata(pStatus->cmdID); smlFreePcdata(pStatus->msgRef); smlFreePcdata(pStatus->cmdRef); smlFreePcdata(pStatus->cmd); smlFreePcdata(pStatus->data); smlFreeCredPtr(pStatus->cred); smlFreeChalPtr(pStatus->chal); smlFreeTargetRefList(pStatus->targetRefList); smlFreeSourceRefList(pStatus->sourceRefList); smlFreeItemList(pStatus->itemList); smlLibFree(pStatus); } SML_API void smlFreeCredPtr(SmlCredPtr_t pCred) { if (! pCred) return; smlFreePcdata(pCred->meta); smlFreePcdata(pCred->data); smlLibFree(pCred); } SML_API void smlFreeChalPtr(SmlChalPtr_t pChal) { if (! pChal) return; smlFreePcdata(pChal->meta); smlLibFree(pChal); } SML_API void smlFreeRecordFieldFilterPtr(SmlRecordOrFieldFilterPtr_t pRecordFieldFilter) { if (! pRecordFieldFilter) return; smlFreeItemPtr(pRecordFieldFilter->item); smlLibFree(pRecordFieldFilter); } SML_API void smlFreeFilterPtr(SmlFilterPtr_t pFilter) { if (! pFilter) return; smlFreePcdata(pFilter->meta); smlFreeRecordFieldFilterPtr(pFilter->field); smlFreeRecordFieldFilterPtr(pFilter->record); smlFreePcdata(pFilter->filtertype); smlLibFree(pFilter); } SML_API void smlFreeSourceTargetParentPtr(SmlSourceParentPtr_t pSourceTargetParent) { if (! pSourceTargetParent) return; smlFreePcdata(pSourceTargetParent->locURI); smlLibFree(pSourceTargetParent); } SML_API void smlFreeSourceTargetPtr(SmlSourcePtr_t pSourceTarget) { if (! pSourceTarget) return; smlFreePcdata(pSourceTarget->locURI); smlFreePcdata(pSourceTarget->locName); smlFreeFilterPtr(pSourceTarget->filter); smlLibFree(pSourceTarget); } SML_API void smlFreeSourceList(SmlSourceListPtr_t pSourceList) { SmlSourceListPtr_t pTmp; while (pSourceList) { pTmp = pSourceList->next; smlFreeSourceTargetPtr(pSourceList->source); smlLibFree(pSourceList); pSourceList = pTmp; } } SML_API void smlFreeSourceRefList(SmlSourceRefListPtr_t pSourceRefList) { SmlSourceRefListPtr_t pTmp; while (pSourceRefList) { pTmp = pSourceRefList->next; smlFreePcdata(pSourceRefList->sourceRef); smlLibFree(pSourceRefList); pSourceRefList = pTmp; } } SML_API void smlFreeTargetRefList(SmlTargetRefListPtr_t pTargetRefList) { SmlTargetRefListPtr_t pTmp; while (pTargetRefList) { pTmp = pTargetRefList->next; smlFreePcdata(pTargetRefList->targetRef); smlLibFree(pTargetRefList); pTargetRefList = pTmp; } } SML_API void smlFreeItemPtr(SmlItemPtr_t pItem) { if (! pItem) return; if (pItem->aux) pItem->aux->freeAux(pItem->aux); smlFreePcdata(pItem->meta); smlFreePcdata(pItem->data); smlFreeSourceTargetPtr(pItem->source); smlFreeSourceTargetPtr(pItem->target); smlLibFree(pItem); } SML_API void smlFreeItemList(SmlItemListPtr_t pItemList) { SmlItemListPtr_t pTmp; while (pItemList) { pTmp = pItemList->next; smlFreeItemPtr(pItemList->item); smlLibFree(pItemList); pItemList = pTmp; } } SML_API void smlFreeMapItemPtr(SmlMapItemPtr_t pMapItem) { if (! pMapItem) return; smlFreeSourceTargetPtr(pMapItem->source); smlFreeSourceTargetPtr(pMapItem->target); smlLibFree(pMapItem); } SML_API void smlFreeMapItemList(SmlMapItemListPtr_t pMapItemList) { SmlMapItemListPtr_t pTmp; while (pMapItemList) { pTmp = pMapItemList->next; smlFreeMapItemPtr(pMapItemList->mapItem); smlLibFree(pMapItemList); pMapItemList = pTmp; } } #ifdef __USE_ALLOCFUNCS__ /* Helperfunctions, that allocate and preset SyncML C structs */ SML_API SmlPcdataPtr_t smlAllocPcdata() { SmlPcdataPtr_t p = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlPcdata_t)); return p; } SML_API SmlPcdataListPtr_t smlAllocPcdataList() { SmlPcdataListPtr_t p = (SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlPcdataList_t)); p->data = smlAllocPcdata(); if (p->data == NULL) { smlFreePcdataList(p); return NULL; } return p; } SML_API SmlChalPtr_t smlAllocChal() { SmlChalPtr_t p = (SmlChalPtr_t)smlLibMalloc(sizeof(SmlChal_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlChal_t)); p->meta = smlAllocPcdata(); if (p->meta == NULL) { smlFreeChalPtr(p); return NULL; } return p; } SML_API SmlCredPtr_t smlAllocCred() { SmlCredPtr_t p = (SmlCredPtr_t)smlLibMalloc(sizeof(SmlCred_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlCred_t)); p->data = smlAllocPcdata(); if (p->data == NULL) { smlFreeCredPtr(p); return NULL; } return p; } SML_API SmlRecordOrFieldFilterPtr_t smlAllocRecordFieldFilter() { SmlRecordOrFieldFilterPtr_t p = (SmlRecordOrFieldFilterPtr_t)smlLibMalloc(sizeof(SmlRecordOrFieldFilter_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlRecordOrFieldFilterPtr_t)); p->item = smlAllocItem(); if (p->item == NULL) { smlFreeRecordFieldFilterPtr(p); return NULL; } return p; } SML_API SmlFilterPtr_t smlAllocFilter() { SmlFilterPtr_t p = (SmlFilterPtr_t)smlLibMalloc(sizeof(SmlFilter_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlFilterPtr_t)); p->meta = smlAllocPcdata(); if (p->meta == NULL) { smlFreeFilterPtr(p); return NULL; } return p; } SML_API SmlSourceParentPtr_t smlAllocSourceParent() { SmlSourceParentPtr_t p = (SmlSourceParentPtr_t)smlLibMalloc(sizeof(SmlSourceParent_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlSourceParentPtr_t)); p->locURI = smlAllocPcdata(); if (p->locURI == NULL) { smlFreeSourceTargetParentPtr(p); return NULL; } return p; } SML_API SmlTargetParentPtr_t smlAllocTargetParent() { return smlAllocSourceParent(); } SML_API SmlSourcePtr_t smlAllocSource() { SmlSourcePtr_t p = (SmlSourcePtr_t)smlLibMalloc(sizeof(SmlSource_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlSource_t)); p->locURI = smlAllocPcdata(); if (p->locURI == NULL) { smlFreeSourceTargetPtr(p); return NULL; } return p; } SML_API SmlTargetPtr_t smlAllocTarget() { return smlAllocSource(); } SML_API SmlSourceListPtr_t smlAllocSourceList() { SmlSourceListPtr_t p = (SmlSourceListPtr_t)smlLibMalloc(sizeof(SmlSourceList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlSourceList_t)); p->source = smlAllocSource(); if (p->source == NULL) { smlFreeSourceList(p); return NULL; } return p; } SML_API SmlSyncHdrPtr_t smlAllocSyncHdr() { SmlSyncHdrPtr_t p = (SmlSyncHdrPtr_t)smlLibMalloc(sizeof(SmlSyncHdr_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlSyncHdr_t)); p->elementType = SML_PE_HEADER; p->version = smlAllocPcdata(); if (p->version == NULL) { smlFreeSyncHdr(p); return NULL; } p->proto = smlAllocPcdata(); if (p->proto == NULL) { smlFreeSyncHdr(p); return NULL; } p->sessionID = smlAllocPcdata(); if (p->sessionID == NULL) { smlFreeSyncHdr(p); return NULL; } p->msgID = smlAllocPcdata(); if (p->msgID == NULL) { smlFreeSyncHdr(p); return NULL; } p->target = smlAllocTarget(); if (p->target == NULL) { smlFreeSyncHdr(p); return NULL; } p->source = smlAllocSource(); if (p->source == NULL) { smlFreeSyncHdr(p); return NULL; } return p; } SML_API SmlItemPtr_t smlAllocItem() { SmlItemPtr_t p = (SmlItemPtr_t)smlLibMalloc(sizeof(SmlItem_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlItem_t)); return p; } SML_API SmlItemListPtr_t smlAllocItemList() { SmlItemListPtr_t p = (SmlItemListPtr_t)smlLibMalloc(sizeof(SmlItemList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlItemList_t)); p->item = smlAllocItem(); if (p->item == NULL) { smlFreeItemList(p); return NULL; } return p; } SML_API SmlGenericCmdPtr_t smlAllocGeneric() { SmlGenericCmdPtr_t p = (SmlGenericCmdPtr_t)smlLibMalloc(sizeof(SmlGenericCmd_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlGenericCmd_t)); p->elementType = SML_PE_GENERIC; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeGeneric(p); return NULL; } p->itemList = smlAllocItemList(); if (p->itemList == NULL) { smlFreeGeneric(p); return NULL; } return p; } SML_API SmlAddPtr_t smlAllocAdd() { SmlAddPtr_t p = smlAllocGeneric(); if (p == NULL) return p; p->elementType = SML_PE_ADD; return p; } SML_API SmlCopyPtr_t smlAllocCopy() { SmlCopyPtr_t p = smlAllocGeneric(); if (p == NULL) return p; p->elementType = SML_PE_COPY; return p; } SML_API SmlMovePtr_t smlAllocMove() { SmlCopyPtr_t p = smlAllocGeneric(); if (p == NULL) return p; p->elementType = SML_PE_MOVE; return p; } SML_API SmlReplacePtr_t smlAllocReplace() { SmlReplacePtr_t p = smlAllocGeneric(); if (p == NULL) return p; p->elementType = SML_PE_REPLACE; return p; } SML_API SmlDeletePtr_t smlAllocDelete() { SmlDeletePtr_t p = smlAllocGeneric(); if (p == NULL) return p; p->elementType = SML_PE_DELETE; return p; } SML_API SmlAlertPtr_t smlAllocAlert() { SmlAlertPtr_t p = (SmlAlertPtr_t)smlLibMalloc(sizeof(SmlAlert_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlAlert_t)); p->elementType = SML_PE_ALERT; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeAlert(p); return NULL; } p->itemList = smlAllocItemList(); if (p->itemList == NULL) { smlFreeAlert(p); return NULL; } return p; } SML_API SmlAtomicPtr_t smlAllocAtomic() { SmlAtomicPtr_t p = (SmlAtomicPtr_t)smlLibMalloc(sizeof(SmlAtomic_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlAtomic_t)); p->elementType = SML_PE_ATOMIC_START; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeAtomic(p); return NULL; } return p; } SML_API SmlSequencePtr_t smlAllocSequence() { SmlSequencePtr_t p = smlAllocAtomic(); if (p == NULL) return NULL; p->elementType = SML_PE_SEQUENCE_START; return p; } SML_API SmlSyncPtr_t smlAllocSync() { SmlSyncPtr_t p = (SmlSyncPtr_t)smlLibMalloc(sizeof(SmlSync_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlSync_t)); p->elementType = SML_PE_SYNC_START; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeSync(p); return NULL; } return p; } #if defined(EXEC_SEND) || defined(EXEC_RECEIVE) SML_API SmlExecPtr_t smlAllocExec() { SmlExecPtr_t p = (SmlExecPtr_t)smlLibMalloc(sizeof(SmlExec_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlExec_t)); p->elementType = SML_PE_EXEC; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeExec(p); return NULL; } p->item = smlAllocItem(); if (p->item == NULL) { smlFreeExec(p); return NULL; } return p; } #endif SML_API SmlGetPtr_t smlAllocGet() { SmlGetPtr_t p = (SmlGetPtr_t)smlLibMalloc(sizeof(SmlGet_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlGet_t)); p->elementType = SML_PE_GET; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeGetPut(p); return NULL; } p->itemList = smlAllocItemList(); if (p->itemList == NULL) { smlFreeGetPut(p); return NULL; } return p; } SML_API SmlPutPtr_t smlAllocPut() { SmlPutPtr_t p = smlAllocGet(); if (p == NULL) return NULL; p->elementType = SML_PE_PUT; return p; } SML_API SmlMapItemPtr_t smlAllocMapItem() { SmlMapItemPtr_t p = (SmlMapItemPtr_t)smlLibMalloc(sizeof(SmlMapItem_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlMapItem_t)); p->target = smlAllocTarget(); if (p->target == NULL) { smlFreeMapItemPtr(p); return NULL; } p->source = smlAllocSource(); if (p->source == NULL) { smlFreeMapItemPtr(p); return NULL; } return p; } SML_API SmlMapItemListPtr_t smlAllocMapItemList() { SmlMapItemListPtr_t p = (SmlMapItemListPtr_t)smlLibMalloc(sizeof(SmlMapItemList_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlMapItemList_t)); p->mapItem = smlAllocMapItem(); if (p->mapItem == NULL) { smlFreeMapItemList(p); return NULL; } return p; } SML_API SmlMapPtr_t smlAllocMap() { SmlMapPtr_t p = (SmlMapPtr_t)smlLibMalloc(sizeof(SmlMap_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlMap_t)); p->elementType = SML_PE_MAP; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeMap(p); return NULL; } p->target = smlAllocTarget(); if (p->target == NULL) { smlFreeMap(p); return NULL; } p->source = smlAllocSource(); if (p->source == NULL) { smlFreeMap(p); return NULL; } p->mapItemList = smlAllocMapItemList(); if (p->mapItemList == NULL) { smlFreeMap(p); return NULL; } return p; } SML_API SmlResultsPtr_t smlAllocResults() { SmlResultsPtr_t p = (SmlResultsPtr_t)smlLibMalloc(sizeof(SmlResults_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlResults_t)); p->elementType = SML_PE_RESULTS; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeResults(p); return NULL; } p->cmdRef = smlAllocPcdata(); if (p->cmdRef == NULL) { smlFreeResults(p); return NULL; } p->itemList = smlAllocItemList(); if (p->itemList == NULL) { smlFreeResults(p); return NULL; } return p; } #if (defined SEARCH_SEND || defined SEARCH_RECEIVE) SML_API SmlSearchPtr_t smlAllocSearch() { SmlSearchPtr_t p = (SmlSearchPtr_t)smlLibMalloc(sizeof(SmlSearch_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlSearch_t)); p->elementType = SML_PE_SEARCH; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeSearch(p); return NULL; } p->meta = smlAllocPcdata(); if (p->meta == NULL) { smlFreeSearch(p); return NULL; } p->data = smlAllocPcdata(); if (p->data == NULL) { smlFreeSearch(p); return NULL; } p->sourceList = smlAllocSourceList(); if (p->sourceList == NULL) { smlFreeSearch(p); return NULL; } return p; } #endif SML_API SmlTargetRefListPtr_t smlAllocTargetRefList() { SmlTargetRefListPtr_t p = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlTargetRefList_t)); p->targetRef = smlAllocPcdata(); if (p->targetRef == NULL) { smlFreeTargetRefList(p); return NULL; } return p; } SML_API SmlSourceRefListPtr_t smlAllocSourceRefList() { SmlSourceRefListPtr_t p = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlSourceRefList_t)); p->sourceRef = smlAllocPcdata(); if (p->sourceRef == NULL) { smlFreeSourceRefList(p); return NULL; } return p; } SML_API SmlStatusPtr_t smlAllocStatus() { SmlStatusPtr_t p = (SmlStatusPtr_t)smlLibMalloc(sizeof(SmlStatus_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlStatus_t)); p->elementType = SML_PE_STATUS; p->cmdID = smlAllocPcdata(); if (p->cmdID == NULL) { smlFreeStatus(p); return NULL; } p->msgRef = smlAllocPcdata(); if (p->msgRef == NULL) { smlFreeStatus(p); return NULL; } p->cmdRef = smlAllocPcdata(); if (p->cmdRef == NULL) { smlFreeStatus(p); return NULL; } p->cmd = smlAllocPcdata(); if (p->cmd == NULL) { smlFreeStatus(p); return NULL; } p->data = smlAllocPcdata(); if (p->data == NULL) { smlFreeStatus(p); return NULL; } return p; } SML_API SmlUnknownProtoElementPtr_t smlAllocUnknownProtoElement() { SmlUnknownProtoElementPtr_t p = (SmlUnknownProtoElementPtr_t)smlLibMalloc(sizeof(SmlUnknownProtoElement_t)); if (p == 0) return NULL; smlLibMemset(p, 0, sizeof(SmlUnknownProtoElement_t)); p->elementType = SML_PE_UNDEF; return p; } #ifdef __USE_METINF__ SML_API SmlMetInfMetInfPtr_t smlAllocMetInfMetInf() { SmlMetInfMetInfPtr_t p = (SmlMetInfMetInfPtr_t)smlLibMalloc(sizeof(SmlMetInfMetInf_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlMetInfMetInf_t)); return p; } SML_API SmlMetInfAnchorPtr_t smlAllocMetInfAnchor() { SmlMetInfAnchorPtr_t p = (SmlMetInfAnchorPtr_t)smlLibMalloc(sizeof(SmlMetInfAnchor_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlMetInfAnchor_t)); p->next = smlAllocPcdata(); if (p->next == NULL) { smlFreeMetinfAnchor(p); return NULL; } return p; } SML_API SmlMetInfMemPtr_t smlAllocMetInfMem() { SmlMetInfMemPtr_t p = (SmlMetInfMemPtr_t)smlLibMalloc(sizeof(SmlMetInfMem_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlMetInfMem_t)); p->free = smlAllocPcdata(); if (p->free == NULL) { smlFreeMetinfMem(p); return NULL; } p->freeid = smlAllocPcdata(); if (p->freeid == NULL) { smlFreeMetinfMem(p); return NULL; } return p; } #endif #ifdef __USE_DEVINF__ SML_API SmlDevInfExtPtr_t smlAllocDevInfExt() { SmlDevInfExtPtr_t p = (SmlDevInfExtPtr_t)smlLibMalloc(sizeof(SmlDevInfExt_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfExt_t)); p->xnam = smlAllocPcdata(); if (p->xnam == NULL) { smlFreeDevInfExt(p); return NULL; } return p; } SML_API SmlDevInfExtListPtr_t smlAllocDevInfExtList() { SmlDevInfExtListPtr_t p = (SmlDevInfExtListPtr_t)smlLibMalloc(sizeof(SmlDevInfExtList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfExtList_t)); p->data = smlAllocDevInfExt(); if (p->data == NULL) { smlFreeDevInfExtList(p); return NULL; } return p; } SML_API SmlDevInfSyncCapPtr_t smlAllocDevInfSyncCap() { SmlDevInfSyncCapPtr_t p = (SmlDevInfSyncCapPtr_t)smlLibMalloc(sizeof(SmlDevInfSyncCap_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfSyncCap_t)); p->synctype = smlAllocPcdataList(); if (p->synctype == NULL) { smlFreeDevInfSynccap(p); return NULL; } return p; } SML_API SmlDevInfCTDataPtr_t smlAllocDevInfCTData() { SmlDevInfCTDataPtr_t p = (SmlDevInfCTDataPtr_t)smlLibMalloc(sizeof(SmlDevInfCTData_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfCTData_t)); p->name = smlAllocPcdata(); if (p->name == NULL) { smlFreeDevInfCTData(p); return NULL; } return p; } SML_API SmlDevInfCTDataListPtr_t smlAllocDevInfCTDataList() { SmlDevInfCTDataListPtr_t p = (SmlDevInfCTDataListPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfCTDataList_t)); p->data = smlAllocDevInfCTData(); if (p->data == NULL) { smlFreeDevInfCTDataList(p); return NULL; } return p; } SML_API SmlDevInfCTDataPropPtr_t smlAllocDevInfCTDataProp() { SmlDevInfCTDataPropPtr_t p = (SmlDevInfCTDataPropPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataProp_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfCTDataProp_t)); p->prop = smlAllocDevInfCTData(); if (p->prop == NULL) { smlFreeDevInfCTDataProp(p); return NULL; } return p; } SML_API SmlDevInfCTDataPropListPtr_t smlAllocDevInfCTDataPropList() { SmlDevInfCTDataPropListPtr_t p = (SmlDevInfCTDataPropListPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataPropList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfCTDataPropList_t)); p->data = smlAllocDevInfCTDataProp(); if (p->data == NULL) { smlFreeDevInfCTDataPropList(p); return NULL; } return p; } SML_API SmlDevInfCTCapPtr_t smlAllocDevInfCTCap() { SmlDevInfCTCapPtr_t p = (SmlDevInfCTCapPtr_t)smlLibMalloc(sizeof(SmlDevInfCTCap_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfCTCap_t)); p->cttype = smlAllocPcdata(); if (p->cttype == NULL) { smlFreeDevInfCTCap(p); return NULL; } p->prop = smlAllocDevInfCTDataPropList(); if (p->prop == NULL) { smlFreeDevInfCTCap(p); return NULL; } return p; } SML_API SmlDevInfCtcapListPtr_t smlAllocDevInfCtcapList() { SmlDevInfCtcapListPtr_t p = (SmlDevInfCtcapListPtr_t)smlLibMalloc(sizeof(SmlDevInfCtcapList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfCtcapList_t)); p->data = smlAllocDevInfCTCap(); if (p->data == NULL) { smlFreeDevInfCtcapList(p); return NULL; } return p; } SML_API SmlDevInfDSMemPtr_t smlAllocDevInfDSMem() { SmlDevInfDSMemPtr_t p = (SmlDevInfDSMemPtr_t)smlLibMalloc(sizeof(SmlDevInfDSMem_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfDSMem_t)); return p; } SML_API SmlDevInfXmitPtr_t smlAllocDevInfXmit() { SmlDevInfXmitPtr_t p = (SmlDevInfXmitPtr_t)smlLibMalloc(sizeof(SmlDevInfXmit_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfXmit_t)); p->cttype = smlAllocPcdata(); if (p->cttype == NULL) { smlFreeDevInfXmit(p); return NULL; } p->verct = smlAllocPcdata(); if (p->verct == NULL) { smlFreeDevInfXmit(p); return NULL; } return p; } SML_API SmlDevInfXmitListPtr_t smlAllocDevInfXmitList() { SmlDevInfXmitListPtr_t p = (SmlDevInfXmitListPtr_t)smlLibMalloc(sizeof(SmlDevInfXmitList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfXmitList_t)); p->data = smlAllocDevInfXmit(); if (p->data == NULL) { smlFreeDevInfXmitList(p); return NULL; } return p; } SML_API SmlDevInfDatastorePtr_t smlAllocDevInfDatastore() { SmlDevInfDatastorePtr_t p = (SmlDevInfDatastorePtr_t)smlLibMalloc(sizeof(SmlDevInfDatastore_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfDatastore_t)); p->sourceref = smlAllocPcdata(); if (p->sourceref == NULL) { smlFreeDevInfDatastore(p); return NULL; } p->rxpref = smlAllocDevInfXmit(); if (p->rxpref == NULL) { smlFreeDevInfDatastore(p); return NULL; } p->txpref = smlAllocDevInfXmit(); if (p->txpref == NULL) { smlFreeDevInfDatastore(p); return NULL; } p->synccap = smlAllocDevInfSyncCap(); if (p->synccap == NULL) { smlFreeDevInfDatastore(p); return NULL; } return p; } SML_API SmlDevInfDatastoreListPtr_t smlAllocDevInfDatastoreList() { SmlDevInfDatastoreListPtr_t p = (SmlDevInfDatastoreListPtr_t)smlLibMalloc(sizeof(SmlDevInfDatastoreList_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfDatastoreList_t)); p->data = smlAllocDevInfDatastore(); if (p->data == NULL) { smlFreeDevInfDatastoreList(p); return NULL; } return p; } SML_API SmlDevInfDevInfPtr_t smlAllocDevInfDevInf() { SmlDevInfDevInfPtr_t p = (SmlDevInfDevInfPtr_t)smlLibMalloc(sizeof(SmlDevInfDevInf_t)); if (p == NULL) return NULL; smlLibMemset(p, 0, sizeof(SmlDevInfDevInf_t)); p->verdtd = smlAllocPcdata(); if (p->verdtd == NULL) { smlFreeDevInfDevInf(p); return NULL; } p->devid = smlAllocPcdata(); if (p->devid == NULL) { smlFreeDevInfDevInf(p); return NULL; } p->devtyp = smlAllocPcdata(); if (p->devtyp == NULL) { smlFreeDevInfDevInf(p); return NULL; } p->datastore = smlAllocDevInfDatastoreList(); if (p->verdtd == NULL) { smlFreeDevInfDevInf(p); return NULL; } p->ctcap = smlAllocDevInfCtcapList(); if (p->ctcap == NULL) { smlFreeDevInfDevInf(p); return NULL; } p->ext = smlAllocDevInfExtList(); if (p->ext == NULL) { smlFreeDevInfDevInf(p); return NULL; } return p; } #endif // DevInf #endif // AllocFuncs syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/inc/0000755000373300037200000000000012424517753026240 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/inc/mgr.h0000755000373300037200000001526512424517753027212 0ustar00nightlyallusers00000000000000/** * @file * SyncML internal API of the MGR module * * @target_system all * @target_os all * @description Definitions for internal use within the SyncML implementation */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _MGR_H #define _MGR_H /************************************************************************* * Definitions *************************************************************************/ #include #include #include "wsm.h" #include /** * ======================================== * Definitions used for Instance Management * ======================================== **/ /** * Current instance status */ typedef enum { MGR_IDLE, /**< instance is idle (available for usage by applications) */ MGR_USED, /**< instance is in use, but currently inactive */ MGR_RECEIVE, /**< actively used for receiving (locked by application) */ MGR_SEND, /**< actively used for sending (locked by application) */ MGR_ENCODING, /**< actively used for encoding (locked by SyncML) */ MGR_DECODING /**< actively used for decoding (locked by SyncML) */ } InstanceStatus_t; /** * structure describing the current status of an instance, */ typedef struct instance_info_s { #ifndef NOWSM InstanceID_t id; /**< unique ID of the instance */ MemPtr_t workspaceHandle; /**< handle to the first position of the assigned workspace memory */ #else // buffer pointers for NOWSM simplified case MemPtr_t instanceBuffer; /**< pointer to instance work buffer */ MemSize_t instanceBufSiz; /**< size of currently allocated buffer */ Byte_t readLocked; /**< set when buffer is locked for read */ Byte_t writeLocked; /**< set when buffer is locked for read */ MemPtr_t readPointer; /**< read pointer */ MemPtr_t writePointer; /**< write pointer */ MemPtr_t outgoingMsgStart; /**< set whenever a smlStartMessage is issued, NULL when invalid */ MemPtr_t incomingMsgStart; /**< set whenever mgrProcessStartMessage starts reading a message, NULL when invalid */ MemSize_t maxOutgoingSize; /**< if<>0, smlXXXCmd will not modify the buffer when there's not enough room */ #endif InstanceStatus_t status; /**< current internal state of instance */ SmlCallbacksPtr_t callbacks; /**< Defined callback refererences for this Instance */ SmlInstanceOptionsPtr_t instanceOptions; /**< Defined options for this Instance (e.g. encoding type) */ VoidPtr_t userData; /**< Pointer to a structure, which is passed to the invoked callback functions */ #ifndef NOWSM VoidPtr_t workspaceState; /**< Pointer to a structure defining the current workspace status */ #endif VoidPtr_t encoderState; /**< Pointer to a structure defining the current encoder status */ VoidPtr_t decoderState; /**< Pointer to a structure defining the current decoder status */ #ifndef NOWSM struct instance_info_s* nextInfo; /**< Pointer to next Instance Info in a list */ #else smlPrintFunc defaultPrintFunc; /**< default application callback for displaying strings (is a global in original version) */ #endif } *InstanceInfoPtr_t, InstanceInfo_t; /** Pointers to store the global Tag tables */ typedef struct tokeninfo_s { TagPtr_t SyncML; TagPtr_t MetInf; TagPtr_t DevInf; } *TokenInfoPtr_t, TokenInfo_t; #ifndef NOWSM // Note, version without WSM has NO globals at all /** * structure describing the current status of the global syncml module * (holds all global variables within SyncML) */ typedef struct syncml_info_s { InstanceInfoPtr_t instanceListAnchor;/**< Anchor of the global list of known SyncML instances */ SmlOptionsPtr_t syncmlOptions; /**< Options valid for this SyncML Process */ WsmGlobalsPtr_t wsmGlobals; /**< Workspace global variables */ TokenInfoPtr_t tokTbl; } *SyncMLInfoPtr_t, SyncMLInfo_t; /************************************************************************* * External Function Declarations *************************************************************************/ SyncMLInfoPtr_t mgrGetSyncMLAnchor(void) MGR_FUNC; InstanceInfoPtr_t mgrGetInstanceListAnchor(void) MGR_FUNC; void mgrSetInstanceListAnchor(InstanceInfoPtr_t newListAnchor) MGR_FUNC; #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ /* SyncML internal function prototypes */ Ret_t addInfo(InstanceInfoPtr_t pInfo) MGR_FUNC; InstanceInfoPtr_t findInfo(InstanceID_t id) MGR_FUNC; Ret_t removeInfo(InstanceID_t id) MGR_FUNC; #endif #endif // !defined(NOWSM) Ret_t mgrResetWorkspace (InstanceID_t id) MGR_FUNC; #endif // ifndef _MGR_H syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/inc/mgrutil.h0000755000373300037200000002172312424517753030104 0ustar00nightlyallusers00000000000000/** * @file * SyncML API for freeing SyncML C structures * * @target_system all * @target_os all * @description Definitions for internal use within the SyncML implementation */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _MGR_UTIL_H #define _MGR_UTIL_H /* Prototypes of exported SyncML API functions */ SML_API Ret_t smlFreeProtoElement(VoidPtr_t pProtoElement) MGR_FUNC; SML_API void smlFreePcdata(SmlPcdataPtr_t pPcdata) MGR_FUNC; SML_API void smlFreePcdataList(SmlPcdataListPtr_t list) MGR_FUNC; SML_API void smlFreeSyncHdr(SmlSyncHdrPtr_t pSyncHdr) MGR_FUNC; SML_API void smlFreeSync(SmlSyncPtr_t pSync) MGR_FUNC; SML_API void smlFreeGeneric(SmlGenericCmdPtr_t pGenericCmd) MGR_FUNC; SML_API void smlFreeAlert(SmlAlertPtr_t pAlert) MGR_FUNC; SML_API void smlFreeAtomic(SmlAtomicPtr_t pAtomic) MGR_FUNC; #if (defined EXEC_SEND || defined EXEC_RECEIVE) SML_API void smlFreeExec(SmlExecPtr_t pExec) MGR_FUNC; #endif SML_API void smlFreeGetPut(SmlPutPtr_t pGetPut) MGR_FUNC; SML_API void smlFreeMap(SmlMapPtr_t pMap) MGR_FUNC; SML_API void smlFreeResults(SmlResultsPtr_t pResults) MGR_FUNC; #if (defined SEARCH_SEND || defined SEARCH_RECEIVE) SML_API void smlFreeSearch(SmlSearchPtr_t pSearch) MGR_FUNC; #endif SML_API void smlFreeStatus(SmlStatusPtr_t pStatus) MGR_FUNC; SML_API void smlFreeCredPtr(SmlCredPtr_t pCred) MGR_FUNC; SML_API void smlFreeChalPtr(SmlChalPtr_t pChal) MGR_FUNC; SML_API void smlFreeRecordFieldFilterPtr(SmlRecordOrFieldFilterPtr_t pRecordFieldFilter) MGR_FUNC; SML_API void smlFreeFilterPtr(SmlFilterPtr_t pFilter) MGR_FUNC; SML_API void smlFreeSourceTargetParentPtr(SmlSourceParentPtr_t pSourceTargetParent) MGR_FUNC; SML_API void smlFreeSourceTargetPtr(SmlSourcePtr_t pSourceTarget) MGR_FUNC; SML_API void smlFreeSourceList(SmlSourceListPtr_t pSourceList) MGR_FUNC; SML_API void smlFreeSourceRefList(SmlSourceRefListPtr_t pSourceRefList) MGR_FUNC; SML_API void smlFreeTargetRefList(SmlTargetRefListPtr_t pTargetRefList) MGR_FUNC; SML_API void smlFreeItemPtr(SmlItemPtr_t pItem) MGR_FUNC; SML_API void smlFreeItemList(SmlItemListPtr_t pItemList) MGR_FUNC; SML_API void smlFreeMapItemPtr(SmlMapItemPtr_t pMapItem) MGR_FUNC; SML_API void smlFreeMapItemList(SmlMapItemListPtr_t pMapItemList) MGR_FUNC; #ifdef __USE_METINF__ SML_API void smlFreeMetinfAnchor(SmlMetInfAnchorPtr_t data) MGR_FUNC; SML_API void smlFreeMetinfMem(SmlMetInfMemPtr_t data) MGR_FUNC; SML_API void smlFreeMetinfMetinf(SmlMetInfMetInfPtr_t data) MGR_FUNC; #endif #ifdef __USE_DEVINF__ SML_API void smlFreeDevInfDatastore(SmlDevInfDatastorePtr_t data) MGR_FUNC; SML_API void smlFreeDevInfDatastoreList(SmlDevInfDatastoreListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfXmitList(SmlDevInfXmitListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfXmit(SmlDevInfXmitPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfDSMem(SmlDevInfDSMemPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfSynccap(SmlDevInfSyncCapPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfExt(SmlDevInfExtPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfExtList(SmlDevInfExtListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfCTData(SmlDevInfCTDataPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfCTDataList(SmlDevInfCTDataListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfCTDataProp(SmlDevInfCTDataPropPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfCTDataPropList(SmlDevInfCTDataPropListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfCTCap(SmlDevInfCTCapPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfCtcapList(SmlDevInfCtcapListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfFilterCap(SmlDevInfFilterCapPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfFilterCapList(SmlDevInfFilterCapListPtr_t data) MGR_FUNC; SML_API void smlFreeDevInfDevInf(SmlDevInfDevInfPtr_t data) MGR_FUNC; #endif #ifndef __SML_LITE__ /* these API calls are NOT included in the Toolkit lite version */ SML_API String_t smlPcdata2String( SmlPcdataPtr_t pcdata ) MGR_FUNC; SML_API SmlPcdataPtr_t smlString2Pcdata( String_t str ) MGR_FUNC; SML_API SmlPcdataPtr_t smlPcdataDup(SmlPcdataPtr_t pcdata) MGR_FUNC; SML_API MemSize_t smlGetFreeBuffer(InstanceID_t id) MGR_FUNC; #endif #ifdef __USE_ALLOCFUNCS__ SML_API SmlPcdataPtr_t smlAllocPcdata() MGR_FUNC; SML_API SmlPcdataListPtr_t smlAllocPcdataList() MGR_FUNC; SML_API SmlChalPtr_t smlAllocChal() MGR_FUNC; SML_API SmlCredPtr_t smlAllocCred() MGR_FUNC; SML_API SmlRecordOrFieldFilterPtr_t smlAllocRecordFieldFilter() MGR_FUNC; SML_API SmlFilterPtr_t smlAllocFilter() MGR_FUNC; SML_API SmlSourceParentPtr_t smlAllocSourceParent() MGR_FUNC; SML_API SmlTargetParentPtr_t smlAllocTargetParent() MGR_FUNC; SML_API SmlSourcePtr_t smlAllocSource() MGR_FUNC; SML_API SmlTargetPtr_t smlAllocTarget() MGR_FUNC; SML_API SmlSourceListPtr_t smlAllocSourceList() MGR_FUNC; SML_API SmlSyncHdrPtr_t smlAllocSyncHdr() MGR_FUNC; SML_API SmlItemPtr_t smlAllocItem() MGR_FUNC; SML_API SmlItemListPtr_t smlAllocItemList() MGR_FUNC; SML_API SmlGenericCmdPtr_t smlAllocGeneric() MGR_FUNC; SML_API SmlAddPtr_t smlAllocAdd() MGR_FUNC; SML_API SmlCopyPtr_t smlAllocCopy() MGR_FUNC; SML_API SmlMovePtr_t smlAllocMove() MGR_FUNC; SML_API SmlReplacePtr_t smlAllocReplace() MGR_FUNC; SML_API SmlDeletePtr_t smlAllocDelete() MGR_FUNC; SML_API SmlAlertPtr_t smlAllocAlert() MGR_FUNC; SML_API SmlAtomicPtr_t smlAllocAtomic() MGR_FUNC; SML_API SmlSequencePtr_t smlAllocSequence() MGR_FUNC; SML_API SmlSyncPtr_t smlAllocSync() MGR_FUNC; SML_API SmlExecPtr_t smlAllocExec() MGR_FUNC; SML_API SmlGetPtr_t smlAllocGet() MGR_FUNC; SML_API SmlPutPtr_t smlAllocPut() MGR_FUNC; SML_API SmlMapItemPtr_t smlAllocMapItem() MGR_FUNC; SML_API SmlMapItemListPtr_t smlAllocMapItemList() MGR_FUNC; SML_API SmlMapPtr_t smlAllocMap() MGR_FUNC; SML_API SmlResultsPtr_t smlAllocResults() MGR_FUNC; SML_API SmlSearchPtr_t smlAllocSearch() MGR_FUNC; SML_API SmlTargetRefListPtr_t smlAllocTargetRefList() MGR_FUNC; SML_API SmlSourceRefListPtr_t smlAllocSourceRefList() MGR_FUNC; SML_API SmlStatusPtr_t smlAllocStatus() MGR_FUNC; SML_API SmlUnknownProtoElementPtr_t smlAllocUnknownProtoElement() MGR_FUNC; #ifdef __USE_METINF__ SML_API SmlMetInfMetInfPtr_t smlAllocMetInfMetInf() MGR_FUNC; SML_API SmlMetInfAnchorPtr_t smlAllocMetInfAnchor() MGR_FUNC; SML_API SmlMetInfMemPtr_t smlAllocMetInfMem() MGR_FUNC; #endif // MetInf #ifdef __USE_DEVINF__ SML_API SmlDevInfExtPtr_t smlAllocDevInfExt() MGR_FUNC; SML_API SmlDevInfExtListPtr_t smlAllocDevInfExtList() MGR_FUNC; SML_API SmlDevInfSyncCapPtr_t smlAllocDevInfSyncCap() MGR_FUNC; SML_API SmlDevInfCTDataPtr_t smlAllocDevInfCTData() MGR_FUNC; SML_API SmlDevInfCTDataListPtr_t smlAllocDevInfCTDataList() MGR_FUNC; SML_API SmlDevInfCTDataPropPtr_t smlAllocDevInfCTDataProp() MGR_FUNC; SML_API SmlDevInfCTDataPropListPtr_t smlAllocDevInfCTDataPropList() MGR_FUNC; SML_API SmlDevInfCTCapPtr_t smlAllocDevInfCTCap() MGR_FUNC; SML_API SmlDevInfCtcapListPtr_t smlAllocDevInfCtcapList() MGR_FUNC; SML_API SmlDevInfDSMemPtr_t smlAllocDevInfDSMem() MGR_FUNC; SML_API SmlDevInfXmitPtr_t smlAllocDevInfXmit() MGR_FUNC; SML_API SmlDevInfXmitListPtr_t smlAllocDevInfXmitList() MGR_FUNC; SML_API SmlDevInfDatastorePtr_t smlAllocDevInfDatastore() MGR_FUNC; SML_API SmlDevInfDatastoreListPtr_t smlAllocDevInfDatastoreList() MGR_FUNC; SML_API SmlDevInfDevInfPtr_t smlAllocDevInfDevInf() MGR_FUNC; #endif // DevInf #endif // AllocFuncs #endif // MgrUtil.h syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/win/0000755000373300037200000000000012424517753026264 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/mgr/win/libinit.c0000755000373300037200000000623012424517753030066 0ustar00nightlyallusers00000000000000/** * @file * Managing DLL * * @target_system Windows * @target_os Windows 9x/NT * @description Platform dependant DLL-entry-function */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions *************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #define WIN32_LEAN_AND_MEAN #include #undef WIN32_LEAN_AND_MEAN #include /* SyncML internal function prototypes */ BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); /** * This routine is called by the Mingw32, Cygwin32 or VC++ C run * time library init code, or the Borland DllEntryPoint routine. It * is responsible for initializing various dynamically loaded * libraries. * * @param hInst (IN) * Library instance handle. * @param reason (IN) * Reason this function is being called. * @param reserved (IN) * Not used. * @return TRUE on sucess,\n * FALSE on failure. */ BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/0000755000373300037200000000000012424517753025510 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/all/0000755000373300037200000000000012424517753026260 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/all/wsm.c0000755000373300037200000007725112424517753027251 0ustar00nightlyallusers00000000000000/** * @file * SyncML WorkSpace Manager * * @target_system All * @target_os All * @description Workspace Manager API * Manages the SyncML document in memory. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" #ifndef NOWSM // if no WSM, we can leave this one out completely /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "wsm.h" #include "wsm_sm.h" #include "smldef.h" #include "libmem.h" #include "libstr.h" #include "liblock.h" // for THREADDEBUGPRINTF %%% luz #include "mgr.h" // for global anchor /** WSM buffer flags */ #define WSM_VALID_F (Byte_t) 0x01 #define WSM_LOCKED_F (Byte_t) 0x02 #define WSM_MEMH_UNUSED -1 #ifndef __SML_LITE__ /* Global Vars */ /* =========== */ /* defines for convient use of global anchor */ #define wsmRet (mgrGetSyncMLAnchor())->wsmGlobals->wsmRet #define initWasCalled (mgrGetSyncMLAnchor())->wsmGlobals->initWasCalled #define maxWsmAvailMem (mgrGetSyncMLAnchor())->syncmlOptions->maxWorkspaceAvailMem #define wsmBuf (mgrGetSyncMLAnchor())->wsmGlobals->wsmBuf #define wsmIndex (mgrGetSyncMLAnchor())->wsmGlobals->wsmIndex void createDataStructs(void); void createDataStructs() { if ( (mgrGetSyncMLAnchor())->wsmGlobals == NULL ) { if ( ((mgrGetSyncMLAnchor())->wsmGlobals=smlLibMalloc(sizeof(WsmGlobals_t))) == 0 ) { return; } smlLibMemset((mgrGetSyncMLAnchor())->wsmGlobals, 0, sizeof(WsmGlobals_t)); wsmRet = 0; initWasCalled = 0; wsmIndex = 0; #ifdef __ANSI_C__ (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm = NULL; #endif #ifdef __PALM_OS__ (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smMemH = 0; (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smLocked = 0; #endif #ifdef __EPOC_OS__ (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm = NULL; #endif } } #define freeDataStructs() smlLibFree((mgrGetSyncMLAnchor())->wsmGlobals) /* private functions prototypes */ static Short_t getNextFreeEntry(); static Short_t lookup(MemHandle_t memH); static MemHandle_t nameToHandle(String_t name); static Short_t deleteBufferHandle(MemHandle_t memH); static Short_t resetBufferGlobals(MemHandle_t memH); static Byte_t isValidMemH(MemHandle_t memH); static Byte_t isLockedMemH(MemHandle_t memH); static Byte_t isMemAvailable(MemSize_t memToAlloc); /*************************************************************************/ /* Internal Functions */ /*************************************************************************/ /** * Get next free buffer entry. * Returns index of next free entry, or -1 if buffer table is full. */ static Short_t getNextFreeEntry() { Short_t i; for ( i=0; i < MAX_WSM_BUFFERS; ++i ) if ( wsmBuf[i].memH == WSM_MEMH_UNUSED ) return i; return -1; } /** * Get buffer table index for memH. * Returns -1 if memH not found. */ static Short_t lookup(MemHandle_t memH) { Short_t i; // first check cache if ( wsmBuf[wsmIndex].memH == memH ) return wsmIndex; // search through buffer for ( i=0; (i < MAX_WSM_BUFFERS) && (wsmBuf[i].memH != memH); ++i ) ; if ( i < MAX_WSM_BUFFERS ) { wsmIndex = i; return i; } else { return -1; // memH not found } } /** * Find memory handle corresponding to name. * Return WSM_MEMH_UNUSED, if name not found in wsmBuf. */ static MemHandle_t nameToHandle(String_t name) { int i; // first check cache if ( (wsmBuf[wsmIndex].bufName != NULL) && (smlLibStrcmp(wsmBuf[wsmIndex].bufName, name) == 0) ) return wsmBuf[wsmIndex].memH; // search through buffer for ( i=0; ((i < MAX_WSM_BUFFERS) && (wsmBuf[i].bufName == NULL ? 1 : smlLibStrcmp(wsmBuf[i].bufName, name) != 0)); ++i ) ; if ( i < MAX_WSM_BUFFERS ) return wsmBuf[i].memH; else { return WSM_MEMH_UNUSED; // name not found } } /** * Delete memory handle from buffer. * Return -1, if handle not found. */ static Short_t deleteBufferHandle(MemHandle_t memH) { if ( (wsmIndex = lookup(memH)) < 0 ) return -1; // handle not found // reset the values wsmBuf[wsmIndex].memH = WSM_MEMH_UNUSED; wsmBuf[wsmIndex].pFirstFree = NULL; wsmBuf[wsmIndex].pFirstData = NULL; wsmBuf[wsmIndex].size = 0; wsmBuf[wsmIndex].usedBytes = 0; //wsmBuf[wsmIndex].flags = ~WSM_VALID_F; wsmBuf[wsmIndex].flags = ((Byte_t) ~WSM_VALID_F); smlLibFree(wsmBuf[wsmIndex].bufName); // free mem wsmBuf[wsmIndex].bufName = NULL; return 0; } /** * Reset values in buffer table for entry memH. * If memH doesn't exist create an entry. * Return index to memH in buffer table, * or -1 if table is full */ static Short_t resetBufferGlobals(MemHandle_t memH) { if ( (wsmIndex = lookup(memH)) < 0 ) { // create new one if ( (wsmIndex = getNextFreeEntry()) < 0 ) return -1; // buffer table full wsmBuf[wsmIndex].memH = memH; } else // use existing one, which has to be reset prior usage smlLibFree(wsmBuf[wsmIndex].bufName); // free mem // reset the values wsmBuf[wsmIndex].pFirstFree = NULL; wsmBuf[wsmIndex].pFirstData = NULL; wsmBuf[wsmIndex].size = 0; wsmBuf[wsmIndex].usedBytes = 0; wsmBuf[wsmIndex].flags = WSM_VALID_F; wsmBuf[wsmIndex].bufName = NULL; return wsmIndex; } static Byte_t isValidMemH(MemHandle_t memH) { return (Byte_t) (wsmBuf[lookup(memH)].flags & WSM_VALID_F); } static Byte_t isLockedMemH(MemHandle_t memH) { return (Byte_t) (wsmBuf[lookup(memH)].flags & WSM_LOCKED_F); } static Byte_t isMemAvailable(MemSize_t memToAlloc) { int i; MemSize_t actMem = memToAlloc; if ( maxWsmAvailMem == 0 ) return 1; // no memsize restrictions for (i=0; i < MAX_WSM_BUFFERS; ++i) { if ( wsmBuf[i].memH != WSM_MEMH_UNUSED ) actMem += wsmBuf[i].size; } return ((Byte_t)(actMem <= maxWsmAvailMem)); } /*************************************************************************/ /* External Functions */ /*************************************************************************/ /** * Initializes all Workspace Manager related resources. * Should only be called once! * * @pre This is the first function call to WSM * @post All WSM resources are initialized * @param wsmOpts (IN) * WSM options, valid options are: * - maxAvailMem\n * Maximal amount of memory which wsm can use for the buffers.\n * 0 == no limitation * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_OPTIONS, if wsmOpts is not valid * - SML_ERR_NOT_ENOUGH_SPACE, if not enough available memory * - SML_ERR_WRONG_USAGE, if wsmInit was already called */ Ret_t wsmInit (const WsmOptions_t *wsmOpts) { int i; // create global datastructs createDataStructs(); if (NULL == mgrGetSyncMLAnchor()->wsmGlobals) { return SML_ERR_NOT_ENOUGH_SPACE; } // check if init was already called if ( initWasCalled ) return SML_ERR_WRONG_USAGE; // check options if ( wsmOpts != NULL ) { if ( wsmOpts->maxAvailMem > 0 ) { maxWsmAvailMem = wsmOpts->maxAvailMem; } } // init resources for ( i=0; i < MAX_WSM_BUFFERS; ++i ) wsmBuf[i].memH = WSM_MEMH_UNUSED; wsmIndex = 0; initWasCalled = (Byte_t) 1; return wsmRet=SML_ERR_OK; } /** * Creates and opens a new buffer with name bufName and size bufSize. * If a buffer with name bufName already exists, the existing buffer * is resized to bufSize. * * @pre bufSize > 0 * @post * - handle refers to buffer bufName * - BufferSize = size * @param bufName (IN) * Name of buffer to be created * @param bufSize (IN) * Size of buffer to be created * @param wsmH (OUT) * Handle to new buffer * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_SIZE, if bufSize <= 0 * - SML_ERR_NOT_ENOUGH_SPACE, if available memory < bufSize * - SML_ERR_WSM_BUF_TABLE_FULL, if buffer table is full * - SML_ERR_WRONG_USAGE, if wsmInit wasn't called before * @see wsmDestroy */ Ret_t wsmCreate (String_t bufName, MemSize_t bufSize, MemHandle_t *wsmH) { *wsmH = 0; // 0 in case of error if ( ! initWasCalled ) return SML_ERR_WRONG_USAGE; // check buffer space if ( getNextFreeEntry() == -1 ) { return wsmRet=SML_ERR_WSM_BUF_TABLE_FULL; } // check for maxMemAvailable if ( ! isMemAvailable(bufSize) ) { return SML_ERR_NOT_ENOUGH_SPACE; } // create buffer if ( (wsmRet = smCreate(bufName, bufSize, wsmH)) != SML_ERR_OK ) { if ( wsmRet == SML_ERR_WRONG_USAGE ) { // buffer already exists // resize existing buffer // open buffer if ( (wsmRet = smOpen(bufName, wsmH)) != SML_ERR_OK ) { return wsmRet=SML_ERR_NOT_ENOUGH_SPACE; } // resize buffer if ( (wsmRet = smSetSize(*wsmH, bufSize)) != SML_ERR_OK ) { return wsmRet=SML_ERR_NOT_ENOUGH_SPACE; } } else { return wsmRet; } } // reset buffer vars wsmIndex = resetBufferGlobals(*wsmH); // set buffer vars wsmBuf[wsmIndex].size = bufSize; wsmBuf[wsmIndex].bufName = smlLibStrdup(bufName); if (wsmBuf[wsmIndex].bufName == NULL) { smClose(*wsmH); smDestroy(bufName); return wsmRet=SML_ERR_NOT_ENOUGH_SPACE; } return wsmRet=SML_ERR_OK; } /** * Open existing buffer with name bufName. * * @pre WSM knows bufName * @post wsmH refers to buffer bufName * @param bufName (IN) * Name of buffer to be opened * @param wsmH (OUT) * Handle to new buffer (OUT) * @return * - SML_ERR_OK, if O.K. * - SML_WRONG_PARAM, if bufName is unknown * @see wsmClose */ Ret_t wsmOpen (String_t bufName, MemHandle_t *wsmH){ // open buffer if ( (wsmRet = smOpen(bufName, wsmH)) != SML_ERR_OK ) { return wsmRet; } // reset buffer vars wsmIndex = resetBufferGlobals(*wsmH); // set buf vars wsmRet = smGetSize(*wsmH, &wsmBuf[wsmIndex].size); wsmBuf[wsmIndex].bufName = smlLibStrdup(bufName); return wsmRet=SML_ERR_OK; } /** * Close an open buffer. * * @pre * - handle is valid * - handle is unlocked * @post handle is not known to WSM any more * @param wsmH (IN) * Handle to the open buffer * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * - SML_ERR_WRONG_USAGE, if handle was still locked * @see wsmOpen */ Ret_t wsmClose (MemHandle_t wsmH) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // close handle if ( (wsmRet = smClose(wsmH)) != SML_ERR_OK ) { return wsmRet; } wsmRet = deleteBufferHandle(wsmH); return wsmRet=SML_ERR_OK; } /** * Destroy existing buffer with name bufName. * * @pre * - WSM knows bufName * - handle is unlocked * @post * - buffer is not known to WSM any more * - all resources connected to this buffer are freed * @param bufName (IN) * Name of buffer to be opened * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if bufName is unknown to WSM * - SML_ERR_WRONG_USAGE, if handle was still locked * @see wsmCreate */ Ret_t wsmDestroy (String_t bufName) { // free resources if ( (wsmRet = wsmClose(nameToHandle(bufName))) != SML_ERR_OK ) { return wsmRet; } // free buffer if ( (wsmRet = smDestroy(bufName)) != SML_ERR_OK ) { return wsmRet; } return wsmRet=SML_ERR_OK; } /** * Terminate WSM; free all buffers and resources. * * @pre all handles must be unlocked * @post all resources are freed * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_USAGE, if a handle was still locked */ Ret_t wsmTerminate (void) { int i; // free all WSM resources for (i=0; i < MAX_WSM_BUFFERS; ++i) { if ( wsmBuf[i].memH != WSM_MEMH_UNUSED ) if ( wsmDestroy(wsmBuf[i].bufName) == SML_ERR_WRONG_USAGE ) { return SML_ERR_WRONG_USAGE; } } // free global DataStructs freeDataStructs(); return SML_ERR_OK; } /** * Tell Workspace Manager the number of bytes already processed. * * @pre * - handle is locked * - handle is valid * - noBytes <= wsmGetUsedSize * @post * - noBytes starting at wsmGetPtr() position are deleted; * - remaining bytes are copied to wsmGetPtr(SML_FIRST_FREE_ITEM) position * - wsmGetUsedSize -= noBytes * - wsmGetFreeSize += noBytes * @param wsmH (IN) * Handle to the open buffer * @param noBytes (IN) * Number of bytes already processed from buffer. * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * - SML_ERR_WRONG_USAGE, if handle was not locked * - SML_ERR_INVALID_SIZE, if noBytes > wsmGetUsedSize * @see wsmGetFreeSize */ Ret_t wsmProcessedBytes (MemHandle_t wsmH, MemSize_t noBytes) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is unlocked if ( ! isLockedMemH(wsmH) ) { return wsmRet=SML_ERR_WRONG_USAGE; } wsmIndex = lookup(wsmH); if ( noBytes > wsmBuf[wsmIndex].usedBytes ) { return wsmRet=SML_ERR_INVALID_SIZE; } // adapt usedSize wsmBuf[wsmIndex].usedBytes -= noBytes; // move memory // check return ????? smlLibMemmove(wsmBuf[wsmIndex].pFirstData, (wsmBuf[wsmIndex].pFirstData + noBytes), wsmBuf[wsmIndex].usedBytes); // move pFirstFree wsmBuf[wsmIndex].pFirstFree -= noBytes; return wsmRet=SML_ERR_OK; } /** * Locks handle wsmH and get a pointer to the contents of wsmH. * RequestedPos describes the position in the buffer to which the returned * pointer should point. Valid values are: * - SML_FIRST_DATA_ITEM * - SML_FIRST_FREE_ITEM * * @pre * - handle is unlocked * - handle is valid * @post * - handle is locked * - points to first data item, or first free item. * @param wsmH (IN) * Handle to the open buffer * @param requestedPos (IN) * Requested position of the returned pointer * - SML_FIRST_DATA_ITEM : points to first data entry * - SML_FIRST_FREE_ITEM : points to first free entry * @param pMem (OUT) * Pointer to requested memory * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * - SML_ERR_WRONG_USAGE, if handle was still locked * - SML_ERR_UNSPECIFIC, if requested position is unknown, or lock failed * @see wsmUnlockH */ Ret_t wsmLockH (MemHandle_t wsmH, SmlBufPtrPos_t requestedPos, MemPtr_t *pMem) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is locked if ( isLockedMemH(wsmH) ) { return wsmRet=SML_ERR_WRONG_USAGE; } // lock if ( (wsmRet = smLock(wsmH, pMem)) != SML_ERR_OK ) { return wsmRet=SML_ERR_UNSPECIFIC; } // set local pointers wsmIndex = lookup(wsmH); wsmBuf[wsmIndex].pFirstData = *pMem; wsmBuf[wsmIndex].pFirstFree = *pMem + wsmBuf[wsmIndex].usedBytes; wsmBuf[wsmIndex].flags |= WSM_LOCKED_F; switch (requestedPos) { case SML_FIRST_DATA_ITEM: *pMem = wsmBuf[wsmIndex].pFirstData; break; case SML_FIRST_FREE_ITEM: *pMem = wsmBuf[wsmIndex].pFirstFree; break; default: return wsmRet=SML_ERR_UNSPECIFIC; } return wsmRet=SML_ERR_OK; } /** * Returns the remaining unused bytes in the buffer. * * @pre handle is valid * @post wsmGetFreeSize = BufferSize - wsmGetUsedSize * @param wsmH (IN) * Handle to the open buffer * @param freeSize (OUT) * Number of bytes which are unused in this buffer * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * @see wsmGetUsedSize, wsmProcessedBytes */ Ret_t wsmGetFreeSize(MemHandle_t wsmH, MemSize_t *freeSize) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } wsmIndex = lookup(wsmH); *freeSize = wsmBuf[wsmIndex].size - wsmBuf[wsmIndex].usedBytes; return wsmRet=SML_ERR_OK; } /** * Returns the number of bytes used in the buffer. * * @pre handle is valid * @post usedSize = BufferSize - wsmGetFreeSize * @param wsmH (IN) * Handle to the open buffer * @param usedSize (OUT) * Number of bytes which are already used in this buffer * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * @see wsmGetFreeSize, wsmSetUsedSize */ Ret_t wsmGetUsedSize(MemHandle_t wsmH, MemSize_t *usedSize) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } wsmIndex = lookup(wsmH); *usedSize = wsmBuf[wsmIndex].usedBytes; return wsmRet=SML_ERR_OK; } /** * Unlock handle wsmH. * After this call all pointers to this memory handle are invalid * and should no longer be used. * * @pre * - handle is locked * - handle is valid * @post handle is unlocked * @param wsmH Handle to unlock (OUT) * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * - SML_ERR_WRONG_USAGE, if handle was not locked * - SML_ERR_UNSPECIFIC, unlock failed * @see wsmLockH */ Ret_t wsmUnlockH (MemHandle_t wsmH) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is already unlocked if ( ! isLockedMemH(wsmH) ) { return wsmRet=SML_ERR_WRONG_USAGE; } // unlock if ( (wsmRet = smUnlock(wsmH)) != SML_ERR_OK ) { return wsmRet=SML_ERR_UNSPECIFIC; } // set local pointers wsmIndex = lookup(wsmH); wsmBuf[wsmIndex].pFirstData = NULL; wsmBuf[wsmIndex].pFirstFree = NULL; wsmBuf[wsmIndex].flags &= ~WSM_LOCKED_F; return wsmRet=SML_ERR_OK; } /** * Tell Workspace how many data were written into buffer. * * @pre * - handle is valid * - usedSize <= wsmGetFreeSize * - handle is locked * @post * - wsmGetUsedSize += usedSize * - wsmGetFreeSize -= usedSize * - instancePtr += usedSize * @param wsmH (IN) * Handle to the open buffer * @param usedSize (IN) * Number of bytes which were written into buffer * @return * - SML_ERR_OK, if O.K. * - SML_ERR_INVALID_HANDLE, if handle was invalid * - SML_ERR_INVALID_SIZE, if usedSize <= wsmGetFreeSize * @see wsmGetUsedSize */ Ret_t wsmSetUsedSize (MemHandle_t wsmH, MemSize_t usedSize) { // check if handle is invalid if ( ! isValidMemH(wsmH) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is unlocked if ( ! isLockedMemH(wsmH) ) { return wsmRet=SML_ERR_WRONG_USAGE; } wsmIndex = lookup(wsmH); // usedSize > freeSize? if ( usedSize > (wsmBuf[wsmIndex].size - wsmBuf[wsmIndex].usedBytes) ) { return wsmRet=SML_ERR_INVALID_SIZE; } // adapt usedSize wsmBuf[wsmIndex].usedBytes += usedSize; // move pFirstFree wsmBuf[wsmIndex].pFirstFree += usedSize; return wsmRet=SML_ERR_OK; } /** * Reset the Workspace * * @post all data is lost. The FirstFree Position equals * the First Data position * @param wsmH (IN) * Handle to the open buffer * @return * - SML_ERR_OK, if O.K. */ Ret_t wsmReset (MemHandle_t wsmH) { wsmIndex = lookup(wsmH); wsmBuf[wsmIndex].pFirstFree = wsmBuf[wsmIndex].pFirstFree - wsmBuf[wsmIndex].usedBytes ; wsmBuf[wsmIndex].pFirstData = wsmBuf[wsmIndex].pFirstFree; wsmBuf[wsmIndex].usedBytes = 0; return SML_ERR_OK; } /*======================================================================================*/ #else /* WSM_LITE Version - uses only one buffer*/ /*======================================================================================*/ /* Global Vars */ /* =========== */ /* defines for convient use of global anchor */ #define wsmRet (mgrGetSyncMLAnchor())->wsmGlobals->wsmRet #define initWasCalled (mgrGetSyncMLAnchor())->wsmGlobals->initWasCalled #define maxWsmAvailMem (mgrGetSyncMLAnchor())->syncmlOptions->maxWorkspaceAvailMem #define wsmBuf (mgrGetSyncMLAnchor())->wsmGlobals->wsmBuf #define wsmIndex (mgrGetSyncMLAnchor())->wsmGlobals->wsmIndex void createDataStructs(void); void createDataStructs() { if ( (mgrGetSyncMLAnchor())->wsmGlobals == NULL ) { if ( ((mgrGetSyncMLAnchor())->wsmGlobals=smlLibMalloc(sizeof(WsmGlobals_t))) == 0 ) { return; } wsmRet = 0; initWasCalled = 0; wsmIndex = 0; #ifdef __ANSI_C__ (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm = NULL; #endif #ifdef __PALM_OS__ (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smMemH = 0; (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smLocked = 0; #endif #ifdef __EPOC_OS__ (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm = NULL; #endif } } #define freeDataStructs() smlLibFree((mgrGetSyncMLAnchor())->wsmGlobals) /* private functions prototypes */ static Short_t getNextFreeEntry(); static Short_t deleteBufferHandle(MemHandle_t memH); static Short_t resetBufferGlobals(MemHandle_t memH); static Byte_t isMemAvailable(MemSize_t memToAlloc); /*************************************************************************/ /* Internal Functions */ /*************************************************************************/ /** * Delete memory handle from buffer. * Return -1, if handle not found. */ static Short_t deleteBufferHandle(MemHandle_t memH) { // reset the values wsmBuf[0].memH = WSM_MEMH_UNUSED; wsmBuf[0].pFirstFree = NULL; wsmBuf[0].pFirstData = NULL; wsmBuf[0].size = 0; wsmBuf[0].usedBytes = 0; wsmBuf[0].flags = ~WSM_VALID_F; smlLibFree(wsmBuf[0].bufName); // free mem wsmBuf[0].bufName = NULL; return 0; } /** * Reset values in buffer table for entry memH. * If memH doesn't exist create an entry. * Return index to memH in buffer table, * or -1 if table is full */ static Short_t resetBufferGlobals(MemHandle_t memH) { if ( (wsmBuf[0].memH != memH) && (wsmBuf[0].memH == WSM_MEMH_UNUSED)) { // create new one wsmBuf[0].memH = memH; } else { // use existing one, which has to be reset prior usage smlLibFree(wsmBuf[0].bufName); // free mem } // reset the values wsmBuf[0].pFirstFree = NULL; wsmBuf[0].pFirstData = NULL; wsmBuf[0].size = 0; wsmBuf[0].usedBytes = 0; wsmBuf[0].flags = WSM_VALID_F; wsmBuf[0].bufName = NULL; return 0; } static Byte_t isMemAvailable(MemSize_t memToAlloc) { MemSize_t actMem = memToAlloc; if ( maxWsmAvailMem == 0 ) return 1; // no memsize restrictions if ( wsmBuf[0].memH != WSM_MEMH_UNUSED ) actMem += wsmBuf[0].size; return (actMem <= maxWsmAvailMem); } /*************************************************************************/ /* External Functions */ /*************************************************************************/ Ret_t wsmInit (const WsmOptions_t *wsmOpts) { // create global datastructs createDataStructs(); if (NULL == mgrGetSyncMLAnchor()->wsmGlobals) { return SML_ERR_NOT_ENOUGH_SPACE; } // check if init was already called if ( initWasCalled ) return SML_ERR_WRONG_USAGE; // check options if ( wsmOpts != NULL ) { if ( wsmOpts->maxAvailMem > 0 ) { maxWsmAvailMem = wsmOpts->maxAvailMem; } } // init resources wsmBuf[0].memH = WSM_MEMH_UNUSED; wsmIndex = 0; initWasCalled = (Byte_t) 1; return wsmRet=SML_ERR_OK; } Ret_t wsmCreate (String_t bufName, MemSize_t bufSize, MemHandle_t *wsmH) { *wsmH = 0; // 0 in case of error if ( ! initWasCalled ) return SML_ERR_WRONG_USAGE; // check buffer space if ( wsmBuf[0].memH != WSM_MEMH_UNUSED ) { return wsmRet=SML_ERR_WSM_BUF_TABLE_FULL; } // check for maxMemAvailable if ( ! isMemAvailable(bufSize) ) { return SML_ERR_NOT_ENOUGH_SPACE; } // create buffer if ( (wsmRet = smCreate(bufName, bufSize, wsmH)) != SML_ERR_OK ) { if ( wsmRet == SML_ERR_WRONG_USAGE ) { // buffer already exists // resize existing buffer // open buffer if ( (wsmRet = smOpen(bufName, wsmH)) != SML_ERR_OK ) { return wsmRet=SML_ERR_NOT_ENOUGH_SPACE; } // resize buffer if ( (wsmRet = smSetSize(*wsmH, bufSize)) != SML_ERR_OK ) { return wsmRet=SML_ERR_NOT_ENOUGH_SPACE; } } else { return wsmRet; } } // reset buffer vars resetBufferGlobals(*wsmH); // set buffer vars wsmBuf[0].size = bufSize; wsmBuf[0].bufName = smlLibStrdup(bufName); return wsmRet=SML_ERR_OK; } Ret_t wsmOpen (String_t bufName, MemHandle_t *wsmH){ // open buffer if ( (wsmRet = smOpen(bufName, wsmH)) != SML_ERR_OK ) { return wsmRet; } // reset buffer vars resetBufferGlobals(*wsmH); // set buf vars wsmRet = smGetSize(*wsmH, &wsmBuf[0].size); wsmBuf[0].bufName = smlLibStrdup(bufName); return wsmRet=SML_ERR_OK; } Ret_t wsmClose (MemHandle_t wsmH) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // close handle if ( (wsmRet = smClose(wsmH)) != SML_ERR_OK ) { return wsmRet; } wsmRet = deleteBufferHandle(wsmH); return wsmRet=SML_ERR_OK; } Ret_t wsmDestroy (String_t bufName) { // free resources if ( (wsmRet = wsmClose(wsmBuf[0].memH)) != SML_ERR_OK ) { return wsmRet; } // free buffer if ( (wsmRet = smDestroy(bufName)) != SML_ERR_OK ) { return wsmRet; } return wsmRet=SML_ERR_OK; } Ret_t wsmTerminate () { int i; // free all WSM resources for (i=0; i < MAX_WSM_BUFFERS; ++i) { if ( wsmBuf[i].memH != WSM_MEMH_UNUSED ) if ( wsmDestroy(wsmBuf[i].bufName) == SML_ERR_WRONG_USAGE ) { return SML_ERR_WRONG_USAGE; } } // free global DataStructs freeDataStructs(); return SML_ERR_OK; } Ret_t wsmProcessedBytes (MemHandle_t wsmH, MemSize_t noBytes) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is unlocked // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_LOCKED_F)) ) { return wsmRet=SML_ERR_WRONG_USAGE; } if ( noBytes > wsmBuf[0].usedBytes ) { return wsmRet=SML_ERR_INVALID_SIZE; } // adapt usedSize wsmBuf[0].usedBytes -= noBytes; // move memory // check return ????? smlLibMemmove(wsmBuf[0].pFirstData, (wsmBuf[0].pFirstData + noBytes), wsmBuf[0].usedBytes); // move pFirstFree wsmBuf[0].pFirstFree -= noBytes; return wsmRet=SML_ERR_OK; } Ret_t wsmLockH (MemHandle_t wsmH, SmlBufPtrPos_t requestedPos, MemPtr_t *pMem) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is locked // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_LOCKED_F)) ) { return wsmRet=SML_ERR_WRONG_USAGE; } // lock if ( (wsmRet = smLock(wsmH, pMem)) != SML_ERR_OK ) { return wsmRet=SML_ERR_UNSPECIFIC; } // set local pointers wsmBuf[0].pFirstData = *pMem; wsmBuf[0].pFirstFree = *pMem + wsmBuf[0].usedBytes; wsmBuf[0].flags |= WSM_LOCKED_F; switch (requestedPos) { case SML_FIRST_DATA_ITEM: *pMem = wsmBuf[0].pFirstData; break; case SML_FIRST_FREE_ITEM: *pMem = wsmBuf[0].pFirstFree; break; default: return wsmRet=SML_ERR_UNSPECIFIC; } return wsmRet=SML_ERR_OK; } Ret_t wsmGetFreeSize(MemHandle_t wsmH, MemSize_t *freeSize) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } *freeSize = wsmBuf[0].size - wsmBuf[0].usedBytes; return wsmRet=SML_ERR_OK; } Ret_t wsmGetUsedSize(MemHandle_t wsmH, MemSize_t *usedSize) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } *usedSize = wsmBuf[0].usedBytes; return wsmRet=SML_ERR_OK; } Ret_t wsmUnlockH (MemHandle_t wsmH) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is already unlocked // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_LOCKED_F)) ) { return wsmRet=SML_ERR_WRONG_USAGE; } // unlock if ( (wsmRet = smUnlock(wsmH)) != SML_ERR_OK ) { return wsmRet=SML_ERR_UNSPECIFIC; } // set local pointers wsmBuf[0].pFirstData = NULL; wsmBuf[0].pFirstFree = NULL; wsmBuf[0].flags &= ~WSM_LOCKED_F; return wsmRet=SML_ERR_OK; } Ret_t wsmSetUsedSize (MemHandle_t wsmH, MemSize_t usedSize) { // check if handle is invalid // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_VALID_F)) ) { return wsmRet=SML_ERR_INVALID_HANDLE; } // check if handle is unlocked // must be buffer 0, as only this one exists if ( ! ((wsmBuf[0].memH == wsmH) || (wsmBuf[0].flags & WSM_LOCKED_F)) ) { return wsmRet=SML_ERR_WRONG_USAGE; } // usedSize > freeSize? if ( usedSize > (wsmBuf[0].size - wsmBuf[0].usedBytes) ) { return wsmRet=SML_ERR_INVALID_SIZE; } // adapt usedSize wsmBuf[0].usedBytes += usedSize; // move pFirstFree wsmBuf[0].pFirstFree += usedSize; return wsmRet=SML_ERR_OK; } Ret_t wsmReset (MemHandle_t wsmH) { wsmBuf[0].pFirstFree = wsmBuf[0].pFirstFree - wsmBuf[0].usedBytes ; wsmBuf[0].pFirstData = wsmBuf[0].pFirstFree; wsmBuf[0].usedBytes = 0; return SML_ERR_OK; } #endif // #ifndef __SML_LITE__ #endif // #ifndef NOWSM syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/inc/0000755000373300037200000000000012424517753026261 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/inc/wsm.h0000755000373300037200000001043412424517753027245 0ustar00nightlyallusers00000000000000/** * @file * SyncML WorkSpace Manager * * @target_system All * @target_os All * @description Workspace Manager API * Manages the SyncML document in memory. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _WSM_H #define _WSM_H #include "smlerr.h" #include "smldef.h" #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #ifndef NOWSM #include "wsm_sm.h" typedef struct WsmOptions_s { MemSize_t maxAvailMem; /**< maximum amount of memory available for all wsm buffers */ } WsmOptions_t; #ifdef __SML_LITE__ #ifdef MAX_WSM_BUFFERS #error "for __SML_LITE__, MAX_WSM_BUFFERS must not be predefined!" #endif #define MAX_WSM_BUFFERS 1 #else #ifndef MAX_WSM_BUFFERS // use default value of 4 (not much for a multi-connection server) #define MAX_WSM_BUFFERS 4 #endif #endif /** WSM internal buffer structure */ typedef struct WsmBuf_s { String_t bufName; /**< external name of buffer */ MemHandle_t memH; /**< memory handle */ MemPtr_t pFirstFree; /**< pointer to first free element in buffer */ MemPtr_t pFirstData; /**< pointer to first data element in buffer */ MemSize_t size; /**< size of buffer */ MemSize_t usedBytes; /**< used bytes in buffer */ Byte_t flags; } WsmBuf_t; /** WSM globals for use with global Anchor */ typedef struct WsmGlobals_s { Ret_t wsmRet; /**< last WSM return code */ Byte_t initWasCalled; /**< was wsmInit() called? */ WsmBuf_t wsmBuf[MAX_WSM_BUFFERS]; Short_t wsmIndex; /**< Index of actual buffer */ WsmSmGlobals_t wsmSm; /**< WSM_SM global; device dependent! */ } *WsmGlobalsPtr_t, WsmGlobals_t; Ret_t wsmInit (const WsmOptions_t *wsmOpts) WSM_FUNC; Ret_t wsmCreate (String_t bufName, MemSize_t bufSize, MemHandle_t *wsmH) WSM_FUNC; Ret_t wsmOpen (String_t bufName, MemHandle_t *wsmH) WSM_FUNC; Ret_t wsmClose (MemHandle_t wsmH) WSM_FUNC; Ret_t wsmDestroy (String_t bufName) WSM_FUNC; Ret_t wsmTerminate (void) WSM_FUNC; Ret_t wsmProcessedBytes (MemHandle_t wsmH, MemSize_t noBytes) WSM_FUNC; Ret_t wsmLockH (MemHandle_t wsmH, SmlBufPtrPos_t requestedPos, MemPtr_t *pMem) WSM_FUNC; Ret_t wsmGetFreeSize(MemHandle_t wsmH, MemSize_t *freeSize) WSM_FUNC; Ret_t wsmGetUsedSize(MemHandle_t wsmH, MemSize_t *usedSize) WSM_FUNC; Ret_t wsmUnlockH (MemHandle_t wsmH) WSM_FUNC; Ret_t wsmSetUsedSize (MemHandle_t wsmH, MemSize_t usedSize) WSM_FUNC; Ret_t wsmReset (MemHandle_t wsmH) ; #endif // !defined(NOWSM) #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/inc/wsm_sm.h0000755000373300037200000000755712424517753027760 0ustar00nightlyallusers00000000000000/** * @file * SyncML WorkSpace Manager * * @target_system All * @target_os All * @description Storage Management for Workspace Manager API * Encapsulates OS dependent parts of WSM. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _WSM_SM_H #define _WSM_SM_H #include #ifdef __ANSI_C__ /** sbuffer list */ typedef struct smWinList_s { char *memName; /**< name of buffer */ char *winH; /**< reference to memory block */ MemHandle_t memH; /**< handle of memory block */ Byte_t locked; /**< is handle locked? */ MemSize_t memSize; /**< size of memory block */ struct smWinList_s *next; /**< next list item */ } smWinList_t; typedef smWinList_t *WsmSmGlobals_t; #endif #ifdef __PALM_OS__ #include /** dynamic buffer array */ typedef struct smPalm_s { MemHandle smPalmH; /**< reference to only memory block */ MemHandle_t smMemH; /**< handle of only memory block */ Byte_t smLocked; /**< is handle locked? */ } WsmSmGlobals_t; #endif #ifdef __EPOC_OS__ /** sbuffer list */ typedef struct smWinList_s { char *memName; /**< name of buffer */ char *winH; /**< reference to memory block */ MemHandle_t memH; /**< handle of memory block */ Byte_t locked; /**< is handle locked? */ MemSize_t memSize; /**< size of memory block */ struct smWinList_s *next; /**< next list item */ } smWinList_t; typedef smWinList_t *WsmSmGlobals_t; #endif Ret_t smCreate (String_t memName, MemSize_t memSize, MemHandle_t *memH) WSM_FUNC; Ret_t smOpen (String_t memName, MemHandle_t *memH) WSM_FUNC; Ret_t smClose (MemHandle_t memH) WSM_FUNC; Ret_t smDestroy (String_t memName) WSM_FUNC; Ret_t smLock (MemHandle_t memH, MemPtr_t *pMem) WSM_FUNC; Ret_t smUnlock (MemHandle_t memH) WSM_FUNC; Ret_t smSetSize (MemHandle_t memH, MemSize_t newSize) WSM_FUNC; Ret_t smGetSize (MemHandle_t memH, MemSize_t *actSize) WSM_FUNC; #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/palm/0000755000373300037200000000000012424517753026441 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/palm/wsm_sm.c0000755000373300037200000001173712424517753030126 0ustar00nightlyallusers00000000000000/** * @file * SyncML WorkSpace Manager * * @target_system Palm * @target_os PalmOS 3.5 * @description Storage Management for Workspace Manager API. * Palm OS version. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /************************************************************************* * Definitions * *************************************************************************/ #include #include #include #include "wsm_sm.h" /* Global Vars */ /* =========== */ #include "mgr.h" #define smPalmH (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smPalmH #define smMemH (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smMemH #define smLocked (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm.smLocked /************************************************************************* * Internal Functions * *************************************************************************/ /************************************************************************* * External Functions * *************************************************************************/ Ret_t smCreate (String_t memName, MemSize_t memSize, MemHandle_t *memH) { if ( memSize <= 0 ) { return SML_ERR_INVALID_SIZE; } // only one create call does make sense under Palm OS if ( smMemH != 0 ) { return SML_ERR_WRONG_USAGE; } // set new values smLocked = 0; smMemH = 1; *memH = smMemH; // create memory if ( (smPalmH=MemHandleNew(memSize)) == 0 ) { return SML_ERR_NOT_ENOUGH_SPACE; } return SML_ERR_OK; } Ret_t smOpen (String_t memName, MemHandle_t *memH) { if ( smMemH == 0 ) { return SML_ERR_WRONG_PARAM; } *memH = smMemH; return SML_ERR_OK; } Ret_t smClose (MemHandle_t memH) { Err ret; // reset handle if ( (ret=MemHandleFree(smPalmH)) != 0 ) { return SML_ERR_WRONG_USAGE; } smMemH = 0; smLocked = 0; return SML_ERR_OK; } Ret_t smDestroy (String_t memName) { return SML_ERR_OK; } Ret_t smLock (MemHandle_t memH, MemPtr_t *pMem) { if ( memH != smMemH ) { return SML_ERR_WRONG_PARAM; } if ( smLocked ) { return SML_ERR_WRONG_USAGE; } if ( (*pMem = MemHandleLock(smPalmH)) == NULL ) { return SML_ERR_UNSPECIFIC; } smLocked = 1; return SML_ERR_OK; } Ret_t smUnlock (MemHandle_t memH) { if ( memH != smMemH ) { return SML_ERR_WRONG_PARAM; } if ( ! smLocked ) { return SML_ERR_WRONG_USAGE; } if ( MemHandleUnlock(smPalmH) != 0 ) { return SML_ERR_UNSPECIFIC; } smLocked = 0; return SML_ERR_OK; } Ret_t smSetSize (MemHandle_t memH, MemSize_t newSize) { Err ret; if ( memH != smMemH ) { return SML_ERR_WRONG_PARAM; } if ( smLocked ) { return SML_ERR_WRONG_USAGE; } if ( newSize <= 0 ) { return SML_ERR_INVALID_SIZE; } if ( (ret=MemHandleResize(smPalmH, newSize)) != 0 ) { return SML_ERR_NOT_ENOUGH_SPACE; } return SML_ERR_OK; } Ret_t smGetSize (MemHandle_t memH, MemSize_t *actSize) { if ( memH != smMemH ) { return SML_ERR_WRONG_PARAM; } *actSize = MemHandleSize(smPalmH); return SML_ERR_OK; } syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/win/0000755000373300037200000000000012424517753026305 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/wsm/win/wsm_sm.c0000755000373300037200000003122112424517753027760 0ustar00nightlyallusers00000000000000/** * @file * SyncML WorkSpace Manager * * @target_system MS Windows * @target_os Windows 98 / NT * @description Storage Management for Workspace Manager API. * MS Windows version. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" #ifndef NOWSM // if no WSM, we can leave this one out completely /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "wsm_sm.h" #include #include #include "libmem.h" #include "liblock.h" // for THREADDEBUGPRINTF %%% luz #include "smldef.h" #include "smlerr.h" /* Global Vars */ /* =========== */ /** root of buffer list */ #include "mgr.h" #define root (mgrGetSyncMLAnchor())->wsmGlobals->wsmSm /* private functions prototypes */ static Byte_t newListEle(const char *name, smWinList_t **newEle, MemHandle_t *newHandle); static Byte_t locateEle(const char *eleName, smWinList_t **p); static Byte_t locateH(MemHandle_t memH, smWinList_t **p); static void removeEle(const char *eleName); /*************************************************************************/ /* Internal Functions */ /*************************************************************************/ /** create new buffer element and assign name to it * return pointer to new element and handle of new element */ /* SCTSTK - 16/03/2002 S.H. 2002-04-05 : fixed so that it works even if the sequence of buffer termination is not in the reverse order of buffer creation */ // luz %%% NOTE: called only from routines which lock the toolkit already, // no separate lock required here static Byte_t newListEle(const char *name, smWinList_t **newEle, MemHandle_t *newHandle ) { smWinList_t *p; int i; for ( i=0; *newHandle < MAX_WSM_BUFFERS && (mgrGetSyncMLAnchor())->wsmGlobals->wsmBuf[i].memH != -1; ++i ) {}; if (i == MAX_WSM_BUFFERS) return 0; *newHandle=i+1; if ( ((*newEle) = smlLibMalloc(sizeof(smWinList_t))) == 0 ) return 0; // no more memory if ( ((*newEle)->memName = smlLibMalloc(strlen(name)+1)) == 0 ){ smlLibFree(*newEle); return 0; // no more memory } memcpy((*newEle)->memName, name, strlen(name)); (*newEle)->memName[strlen(name)] = '\0'; if ( root == 0 ) root = *newEle; else { p=root; while ( p->next != NULL) p = p->next; p->next = *newEle; } return 1; } /** * search for buffer with name eleName and return pointer to it in p. * * @return * - 0 if not found; * - 1 if found */ // luz %%% NOTE: called only from routines which lock the toolkit already, // no separate lock required here static Byte_t locateEle(const char *eleName, smWinList_t **p) { *p = root; while ( (*p != NULL) && (strcmp((*p)->memName, eleName) != 0) ) { *p = (*p)->next; } if ( *p == NULL ) return 0; else return 1; } /** * search for buffer with memHandle memH and return pointer to it in p. * * @return * - 0 if not found; * - 1 if found */ // luz %%% NOTE: called only from routines which lock the toolkit already, // no separate lock required here static Byte_t locateH(MemHandle_t memH, smWinList_t **p) { *p = root; while ( (*p != NULL) && ((*p)->memH != memH) ) { *p = (*p)->next; } if ( *p == NULL ) return 0; else return 1; } /** * remove buffer with name eleName from smWinList. */ // luz %%% NOTE: called only from routines which lock the toolkit already, // no separate lock required here static void removeEle(const char *eleName) { smWinList_t *act, *old; old = act = root; while ( (act != NULL) && (strcmp(act->memName, eleName) != 0) ) { old = act; act = act->next; } if ( act != NULL ) { if ( old == act ) // delete first list ele root = act->next; else old->next = act->next; smlLibFree(act->memName); smlLibFree(act); } } /*************************************************************************/ /* External Functions */ /*************************************************************************/ /** * Creates a new memory block with name memName and size memSize. * * @pre * - OS does not know memName * - memSize > 0 * @post * - memName exists with size memSize * - memH refers to new memory block. * @param memName (IN) * Name of new memory block * @param memSize (IN) * Size of new memory block * @param memH (OUT) * Handle to new memory block * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_USAGE, if memName is already known to the OS * - SML_ERR_INVALID_SIZE, if memSize <= 0 * - SML_ERR_NOT_ENOUGH_SPACE, if available memory < memSize * @see smDestroy */ Ret_t smCreate (String_t memName, MemSize_t memSize, MemHandle_t *memH) { smWinList_t *pEle; // pointer to new buffer if ( memSize <= 0 ) { return SML_ERR_INVALID_SIZE; } if ( locateEle(memName, &pEle) ) { return SML_ERR_WRONG_USAGE; } // create new element in buffer list if ( ! newListEle(memName, &pEle, memH) ) { return SML_ERR_NOT_ENOUGH_SPACE; } // create memory if ( (pEle->winH=smlLibMalloc(memSize)) == 0 ) { smlLibFree(pEle->memName); smlLibFree(pEle); return SML_ERR_NOT_ENOUGH_SPACE; } // set new values pEle->locked = 0; pEle->memH = *memH; pEle->memSize = memSize; pEle->next = NULL; return SML_ERR_OK; } /** * Open connection to memory block with name memName. * * @pre OS does know memName * @post memH refers to memory block memName * @param memName (IN) * Name of memory block to open\n * Windows version: Name is ignored * @param memH (OUT) * Handle to opened memory block * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if memName is unknown * @see smClose */ Ret_t smOpen (String_t memName, MemHandle_t *memH) { smWinList_t *pEle; // pointer to buffer element if ( ! locateEle(memName, &pEle) ) { return SML_ERR_WRONG_PARAM; } *memH = pEle->memH; return SML_ERR_OK; } /** * Close link to memory block. * * @pre * - memH is a valid memory block handle * - memH is unlocked * - no pointers to records are in use * @post memH is not valid anymore * @param memH (IN) * Handle to close * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_USAGE, if memH is locked or unknown * @see smOpen */ Ret_t smClose (MemHandle_t memH) { smWinList_t *pEle; // pointer to buffer element if ( ! locateH(memH, &pEle) ) { return SML_ERR_WRONG_USAGE; } // reset handle smlLibFree(pEle->winH); pEle->memH = 0; pEle->locked = 0; pEle->memSize = 0; return SML_ERR_OK; } /** * Remove memory block memName within OS. * * @pre * - memName is a valid memory block name * - memory block is not in use (i.e. no handles and * pointers to this memory block are in use) * @post memName is not a valid memory block name anymore * @param memName (IN) * Name of memory block to remove * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if memName is unknown * - SML_ERR_WRONG_USAGE, if memory block is still locked * @see smCreate */ Ret_t smDestroy (String_t memName) { smWinList_t *pEle; // pointer to buffer element if ( ! locateEle(memName, &pEle) ) { return SML_ERR_WRONG_PARAM; } if ( pEle->locked ) { return SML_ERR_WRONG_USAGE; } // remove memory buffer removeEle(memName); return SML_ERR_OK; } /** * Map memory block memH to local address space. * * @pre * - memH is a valid handle * - memory block is not locked * @post * - pMem points to memory block memH * - memory block is locked * @param memH (IN) * Handle to memory block * @param pMem (OUT) * Pointer to memory block memH mapped in local address space * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if memH is unknown * - SML_ERR_WRONG_USAGE, if memH was already locked * - SML_ERR_UNSPECIFIC, if lock failed * @see smUnlock */ Ret_t smLock (MemHandle_t memH, MemPtr_t *pMem) { smWinList_t *pEle; // pointer to buffer element if ( ! locateH(memH, &pEle) ) { return SML_ERR_WRONG_PARAM; } if ( pEle->locked ) { return SML_ERR_WRONG_USAGE; } *pMem = (MemPtr_t)pEle->winH; pEle->locked = 1; return SML_ERR_OK; } /** * Free pointer mapped to memH memory block. * * @pre * - memH is a valid handle * - memory block is locked * @post memory block is unlocked * @param memH (IN) * Handle to memory block * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if memH is unknown * - SML_ERR_WRONG_USAGE, if memH was already unlocked * - SML_ERR_UNSPECIFIC, if unlock failed * @see smLock */ Ret_t smUnlock (MemHandle_t memH) { smWinList_t *pEle; // pointer to buffer element if ( ! locateH(memH, &pEle) ) { return SML_ERR_WRONG_PARAM; } if ( ! pEle->locked ) { return SML_ERR_WRONG_USAGE; } pEle->locked = 0; return SML_ERR_OK; } /** * Set size of memory block memH to newSize. * * @pre * - memH is a valid handle * - newSize > 0 * - memory block is unlocked * @post memory block size = newSize * @param memH (IN) * Handle to memory block * @param newSize (IN) * New size of memory block * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if memH is unknown * - SML_ERR_WRONG_USAGE, if memH is locked * - SML_ERR_INVALID_SIZE, if newSize <= 0 * - SML_ERR_NOT_ENOUGH_SPACE, if available memory < newSize * @see smGetSize */ Ret_t smSetSize (MemHandle_t memH, MemSize_t newSize) { smWinList_t *pEle; // pointer to buffer element if ( ! locateH(memH, &pEle) ) { return SML_ERR_WRONG_PARAM; } if ( pEle->locked ) { return SML_ERR_WRONG_USAGE; } if ( newSize <= 0 ) { return SML_ERR_INVALID_SIZE; } smlLibFree(pEle->winH); if ( (pEle->winH=smlLibMalloc(newSize)) == 0 ) { return SML_ERR_NOT_ENOUGH_SPACE; } pEle->memSize = newSize; return SML_ERR_OK; } /** * Get size of memory block memH. * * @pre memH is a valid handle * @post actSize = memory block size * @param memH (IN) * Handle to memory block * @param actSize (OUT) * Actual size of memory block * @return * - SML_ERR_OK, if O.K. * - SML_ERR_WRONG_PARAM, if memH is unknown * @see smSetSize */ Ret_t smGetSize (MemHandle_t memH, MemSize_t *actSize) { smWinList_t *pEle; // pointer to buffer element if ( ! locateH(memH, &pEle) ) { return SML_ERR_WRONG_PARAM; } *actSize = pEle->memSize; return SML_ERR_OK; } #endif // #ifndef NOWSM syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/0000755000373300037200000000000012424517753025511 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/0000755000373300037200000000000012424517753026261 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdec.c0000755000373300037200000023437212424517753027726 0ustar00nightlyallusers00000000000000/** * @file * SyncmML Decoder * * @target_system all * @target_os all * @description The SyncML parser. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "xltdec.h" #include "xltdeccom.h" #include "xlttags.h" #include "xltutilstack.h" #include "xlttagtbl.h" #include "xltmetinf.h" #include "xltdevinf.h" #include #include #include #include #include #include #include #include #ifdef SYDEBUG #if !defined(DIRECT_APPBASE_GLOBALACCESS) && defined(CONSOLEINFO) void ConsolePrintf(const char *text, ...); #define SMLERRPRINTFX(lvl,m) CONSOLEPRINTF(m) #else #define SMLERRPRINTFX(lvl,m) PNCDEBUGPRINTFX(lvl,m) #endif /** * Better parsing error reporting when used within Synthesis SyncML engine * added 2006-11-02 by luz@synthesis.ch */ // Error texts #define numSmlErrTexts (SML_ERR_XLT_INVAL_INPUT_DATA-SML_ERR_XLT_MISSING_CONT + 1) static const char * const smlErrTexts[numSmlErrTexts] = { "required field content missing", // 0x2001 "Buffer too small", // 0x2002 "Invalid (WBXML) Element Type", // 0x2003 "Invalid List Type", // 0x2004 "Invalid Tag Type", // 0x2005 "???", // 0x2006 "Unknown Encoding", // 0x2007 "Invalid Protocol Element", // 0x2008 "Missing Content of List Elements", // 0x2009 "Incompatible WBXML Content Format Version", // 0x200A "Document does not conform to SyncML DTD", // 0x200B "Invalid PCData elem", // 0x200C "Unspecified tokenizer error", // 0x200D "Document does not conform to WBXML specification", // 0x200E "Document contains unknown WBXML token", // 0x200F "Non-empty start tag without matching end tag", // 0x2010 "WBXML document uses unspecified code page", // 0x2011 "End of buffer reached", // 0x2012 "Document does not conform to XML 1.0 specification", // 0x2012 "Document contains unknown XML tag", // 0x2014 "Invalid Public Identifier", // 0x2015 "Invalid Codepage Extension", // 0x2016 "No matching Codepage could be found", // 0x2017 "Data missing in input structure", // 0x2018 }; // get error text const char *smlErrorText(Ret_t aRc) { if (aRc>=SML_ERR_XLT_MISSING_CONT && aRc<=SML_ERR_XLT_INVAL_INPUT_DATA) { return smlErrTexts[aRc-SML_ERR_XLT_MISSING_CONT]; } // no text found return ""; } // makes hex char out of nibble static char NibbleToHexDigit(uInt8 aNibble) { aNibble &= 0x0F; if (aNibble>9) return 'A'-0x0A+aNibble; else return '0'+aNibble; } // NibbleToHexDigit #define numBytesShow 32 // show token info void show_token(XltDecTokenPtr_t aToken, uInt32 aDebugMask) { int i; SmlPcdataExtension_t ext; TagPtr_t pTags; short tagwbxml; char *tagxml; char *extname; char *toktype; if (aToken==NULL) return; // get token type switch (aToken->type) { case TOK_TAG_START: toktype="start"; break; case TOK_TAG_END: toktype="end"; break; case TOK_TAG_EMPTY: toktype="empty"; break; case TOK_CONT: toktype="content"; break; default: toktype="UNKNOWN"; break; } // get extension name switch (aToken->ext) { case SML_EXT_METINF: extname="metInf"; break; case SML_EXT_DEVINF: extname="devInf"; break; default: extname="undef/SyncML"; break; } // check if this is a tag if (IS_TAG(aToken)) { // get tag information tagwbxml=-1; // undefined tagxml="UNDEFINED"; for (ext=SML_EXT_UNDEFINED; extid) != TN_UNDEF) { if (((pTags+i)->id) == aToken->tagid) { tagwbxml = (pTags+i)->wbxml; #if defined(__SML_XML__) || defined(__SML_WBXML_TEXTTOKENS__) tagxml = (pTags+i)->xml; #endif goto foundtag; } i++; } } } foundtag: #if defined(__SML_XML__) || defined(__SML_WBXML_TEXTTOKENS__) // we have tag names SMLERRPRINTFX(aDebugMask,( "- parsing %s token, ext=%s: <%s> (WBXML 0x%hX, tagid=%hd)", toktype, extname, tagxml, (short)tagwbxml, (short)aToken->tagid )); #else // we only have WBXML tag codes SMLERRPRINTFX(aDebugMask,( "- parsing %s token, ext=%s: tag (WBXML 0x%hX, tagid=%hd)", toktype, extname, (short)tagwbxml, (short)aToken->tagid )); #endif } // if tag else if (IS_CONTENT(aToken)) { // content SMLERRPRINTFX(aDebugMask,("- parsing content (%s token, ext=%s)",toktype,extname)); } else { // unknown SMLERRPRINTFX(aDebugMask,("- parsing %s token, ext=%s",toktype,extname)); } } // show_token Ret_t show_decode_error(Ret_t aRc, XltDecScannerPtr_t aScanner, char *aRoutineName) { char hexshow[numBytesShow*3+1]; char *p; unsigned char *b; int i; if (aRc!=SML_ERR_OK) { // get routine name if (aRoutineName==NULL) aRoutineName="SML"; // generic sml // Show error SMLERRPRINTFX(DBG_ERROR,("%s: smlErr 0x%hX (%s) while parsing",aRoutineName,aRc,smlErrorText(aRc))); // Show details if (aScanner && aScanner->curtok) { Long_t currentBytesShow = numBytesShow; Long_t remaining; // show what token we are parsing show_token(aScanner->curtok,DBG_ERROR); // show hex of at most 32 bytes after scan position b = aScanner->getPos(aScanner, &remaining); if (remaining < currentBytesShow) currentBytesShow = remaining; SMLERRPRINTFX(DBG_ERROR,( "- Tag start at 0x%lX, scanner pos at 0x%lX%s, data:", (unsigned long)aScanner->curtok->start, (unsigned long)b, aScanner->finished ? " (finished)" : "" )); if (b!=NULL) { p=hexshow; for (i=0; i>4); *p++ = NibbleToHexDigit(*b++); *p++ = ' '; } *p=0; b-=currentBytesShow; // rewind SMLERRPRINTFX(DBG_ERROR,("%s", hexshow)); p=hexshow; for (i=0; i=0x20) && (*b<0x7F) ? *b : '_'; b++; } *p=0; SMLERRPRINTFX(DBG_ERROR,("%s", hexshow)); } } else { // no scanner or no current token SMLERRPRINTFX(DBG_ERROR,( "%s: smlErr 0x%hX while parsing no current tag", aRoutineName, aRc )); } } // return error code return aRc; } // show_decode_error #endif // SYDEBUG #ifdef __USE_EXTENSIONS__ /* prototype for function in xltdecwbxml.c */ void subdtdDecodeWbxml(XltDecoderPtr_t pDecoder,SmlPcdataPtr_t *ppPcdata); #endif /** * Tries to concatenate two Pcdata elements. Only works when the two * elements are of the same type (e.g. SML_PCDATA_STRING). Returns a * pointer to the new Pcdata element or NULL if concatenation failed. */ static SmlPcdataPtr_t concatPCData(SmlPcdataPtr_t pDat1, const SmlPcdataPtr_t pDat2); /** * appendXXXList * * These are auxiliary functions for building SyncML elements that contain * lists of certain other data structures (e.g. Items). They take an * existing list (e.g. of type ItemListPtr_t) and append an appropriate * element at the end. If the ListPtr points to NULL a new list is created. * * @pre The scanner's current token is the start tag (may be * empty) of the SyncML element to be appended to the list. * @post The scanner's current token is the end tag (or empty * start tag) of the SyncML element that was added to the list. * @param pDecoder (IN/OUT) * the decoder * @param ppXXXList (IN/OUT) * NULL or an initialized list, to which element will be appended * @return SML_ERR_OK, if an element was successfully appended\n * else error code */ static Ret_t appendItemList(XltDecoderPtr_t pDecoder, SmlItemListPtr_t *ppItemList); #ifdef SEARCH_RECEIVE static Ret_t appendSourceList(XltDecoderPtr_t pDecoder, SmlSourceListPtr_t *ppSourceList); #endif #ifdef MAPITEM_RECEIVE static Ret_t appendMapItemList(XltDecoderPtr_t pDecoder, SmlMapItemListPtr_t *ppMapItemList); #endif static Ret_t appendTargetRefList(XltDecoderPtr_t pDecoder, SmlTargetRefListPtr_t *ppTargetRefList); static Ret_t appendSourceRefList(XltDecoderPtr_t pDecoder, SmlSourceRefListPtr_t *ppSourceRefList); /* if the commands are not defined we let the functions point to NULL */ #ifndef RESULT_RECEIVE #define buildResults NULL #endif #ifndef MAP_RECEIVE #define buildMap NULL #endif #ifndef EXEC_RECEIVE #define buildExec NULL #endif #if !defined(ATOMIC_RECEIVE) && !defined(SEQUENCE_RECEIVE) #define buildAtomOrSeq NULL #endif #ifndef SEARCH_RECEIVE #define buildSearch NULL #endif typedef struct PEBuilder_s { XltTagID_t tagid; SmlProtoElement_t type; Ret_t (*build)(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); } PEBuilder_t, *PEBuilderPtr_t; /* luz 2005-08-17: simplified, removed unnecessary copying of the const static table */ static const PEBuilder_t cPE_Dec[] = { { TN_ADD, SML_PE_ADD, buildGenericCmd }, { TN_ALERT, SML_PE_ALERT, buildAlert }, { TN_ATOMIC, SML_PE_ATOMIC_START, buildAtomOrSeq }, { TN_COPY, SML_PE_COPY, buildGenericCmd }, { TN_DELETE, SML_PE_DELETE, buildGenericCmd }, { TN_EXEC, SML_PE_EXEC, buildExec }, { TN_GET, SML_PE_GET, buildPutOrGet }, { TN_MAP, SML_PE_MAP, buildMap }, { TN_PUT, SML_PE_PUT, buildPutOrGet }, { TN_RESULTS, SML_PE_RESULTS, buildResults }, { TN_SEARCH, SML_PE_SEARCH, buildSearch }, { TN_SEQUENCE, SML_PE_SEQUENCE_START, buildAtomOrSeq }, { TN_STATUS, SML_PE_STATUS, buildStatus }, { TN_SYNC, SML_PE_SYNC_START, buildSync }, { TN_REPLACE, SML_PE_REPLACE, buildGenericCmd }, { TN_MOVE, SML_PE_MOVE, buildGenericCmd }, { TN_UNDEF, SML_PE_UNDEF, 0 } }; /*************************************************************************/ /* External Functions */ /*************************************************************************/ /** * Description see XLTDec.h header file. */ Ret_t xltDecInit(const SmlEncoding_t enc, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltDecoderPtr_t *ppDecoder, SmlSyncHdrPtr_t *ppSyncHdr) { XltDecoderPtr_t pDecoder; Ret_t rc; /* create new decoder object */ if ((pDecoder = (XltDecoderPtr_t)smlLibMalloc(sizeof(XltDecoder_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; pDecoder->finished = 0; pDecoder->final = 0; pDecoder->scanner = NULL; if ((rc = xltUtilCreateStack(&pDecoder->tagstack, 10)) != SML_ERR_OK) { xltDecTerminate(pDecoder); return rc; } #ifdef __SML_WBXML__ if (enc == SML_WBXML) { rc = xltDecWbxmlInit(pBufEnd, ppBufPos, &pDecoder->scanner); if (rc == SML_ERR_OK) { pDecoder->charset = pDecoder->scanner->charset; pDecoder->charsetStr = NULL; } } else #endif #ifdef __SML_XML__ if (enc == SML_XML) { rc = xltDecXmlInit(pBufEnd, ppBufPos, &pDecoder->scanner); if (rc == SML_ERR_OK) { pDecoder->charset = 0; pDecoder->charsetStr = pDecoder->scanner->charsetStr; } } else #endif { rc = SML_ERR_XLT_ENC_UNK; } if (rc != SML_ERR_OK) { xltDecTerminate((XltDecoderPtr_t)pDecoder); return rc; } /* try to find SyncHdr element, first comes the SyncML tag... */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { xltDecTerminate((XltDecoderPtr_t)pDecoder); return rc; } if (!IS_START(pDecoder->scanner->curtok) || (pDecoder->scanner->curtok->tagid != TN_SYNCML)) { smlFreePcdata(pDecoder->scanner->curtok->pcdata); rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pDecoder->scanner,"xltDecInit"); xltDecTerminate((XltDecoderPtr_t)pDecoder); return rc; } /* ... then the SyncHdr */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { xltDecTerminate((XltDecoderPtr_t)pDecoder); return rc; } if ((rc = buildSyncHdr(pDecoder, (VoidPtr_t)ppSyncHdr)) != SML_ERR_OK) { xltDecTerminate((XltDecoderPtr_t)pDecoder); return rc; } *ppBufPos = pDecoder->scanner->getPos(pDecoder->scanner, NULL); *ppDecoder = (XltDecoderPtr_t)pDecoder; return SML_ERR_OK; } /** * Description see XLTDec.h header file. */ Ret_t xltDecNext(XltDecoderPtr_t pDecoder, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, SmlProtoElement_t *pe, VoidPtr_t *ppContent) { XltDecoderPtr_t pDecPriv = (XltDecoderPtr_t)pDecoder; XltDecScannerPtr_t pScanner = pDecPriv->scanner; XltTagID_t tagid; Ret_t rc; int i; pScanner->setBuf(pScanner, *ppBufPos, pBufEnd); /* if we are still outside the SyncBody, look for SyncBody start tag */ if ((rc = pDecPriv->tagstack->top(pDecPriv->tagstack, &tagid)) != SML_ERR_OK) return rc; if (tagid == TN_SYNCML) { if (((rc = nextToken(pDecPriv)) != SML_ERR_OK)) { return rc; } if (!((IS_START(pScanner->curtok)) && (pScanner->curtok->tagid == TN_SYNCBODY))) { return SML_DECODEERROR(SML_ERR_XLT_INVAL_PROTO_ELEM,pScanner,"xltDecNext"); } } if ((rc = nextToken(pDecPriv)) != SML_ERR_OK) return rc; /* if we find a SyncML protocol element build the corresponding data structure */ if ((IS_START_OR_EMPTY(pScanner->curtok)) && (pScanner->curtok->tagid != TN_FINAL)) { i = 0; while ((cPE_Dec[i].tagid) != TN_UNDEF) { if ((cPE_Dec[i].tagid) == pScanner->curtok->tagid) { *pe = (cPE_Dec[i].type); if ((rc = cPE_Dec[i].build(pDecPriv, ppContent)) != SML_ERR_OK) return rc; /* T.K. adjust the SML_PE_ for 'generic' structures if (*pe == SML_PE_GENERIC) { SmlGenericCmdPtr_t g = *ppContent; switch ((int) (cPE_Dec[i].tagid)) { case TN_ADD : g->elementType = SML_PE_ADD; break; case TN_COPY : g->elementType = SML_PE_COPY; break; case TN_DELETE : g->elementType = SML_PE_DELETE; break; case TN_REPLACE: g->elementType = SML_PE_REPLACE; break; } } */ /* %%% luz 2005-08-17: we can do this a lot easier... */ /* if the procduced element has no distinct element type now, but is still SML_PE_GENERIC, we need to set it to the correct distinct value */ if (((SmlGenericCmdPtr_t)(*ppContent))->elementType == SML_PE_GENERIC) { ((SmlGenericCmdPtr_t)(*ppContent))->elementType = cPE_Dec[i].type; } break; } i++; } if ((cPE_Dec[i].tagid) == TN_UNDEF) { *pe = SML_PE_UNDEF; *ppContent = NULL; return SML_DECODEERROR(SML_ERR_XLT_INVAL_PROTO_ELEM,pScanner,"xltDecNext"); } } else { /* found end tag */ switch (pScanner->curtok->tagid) { case TN_ATOMIC: *pe = SML_PE_ATOMIC_END; *ppContent = NULL; break; case TN_SEQUENCE: *pe = SML_PE_SEQUENCE_END; *ppContent = NULL; break; case TN_SYNC: *pe = SML_PE_SYNC_END; *ppContent = NULL; break; case TN_FINAL: *pe = SML_PE_FINAL; *ppContent = NULL; pDecPriv->final = 1; break; case TN_SYNCBODY: /* next comes the SyncML end tag, then we're done */ if ((rc = nextToken(pDecPriv)) != SML_ERR_OK) return rc; if ((pScanner->curtok->type == TOK_TAG_END) && (pScanner->curtok->tagid == TN_SYNCML)) { *pe = SML_PE_UNDEF; *ppContent = NULL; pDecPriv->finished = 1; } else { return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"xltDecNext"); } break; default: return SML_DECODEERROR(SML_ERR_XLT_INVAL_PROTO_ELEM,pScanner,"xltDecNext"); } } *ppBufPos = pScanner->getPos(pScanner, NULL); return SML_ERR_OK; } /** * Description see XLTDec.h header file. */ Ret_t xltDecTerminate(XltDecoderPtr_t pDecoder) { XltDecoderPtr_t pDecPriv; if (pDecoder == NULL) return SML_ERR_OK; pDecPriv = (XltDecoderPtr_t)pDecoder; if (pDecPriv->scanner != NULL) pDecPriv->scanner->destroy(pDecPriv->scanner); if (pDecPriv->tagstack != NULL) pDecPriv->tagstack->destroy(pDecPriv->tagstack); smlLibFree(pDecPriv); return SML_ERR_OK; } Ret_t xltDecReset(XltDecoderPtr_t pDecoder) { return xltDecTerminate(pDecoder); } /** * Gets the next token from the scanner. * Checks if the current tag is an end tag and if so, whether the last * open start tag has the same tag id as the current end tag. An open start * tag is one which matching end tag has not been seen yet. * If the current tag is a start tag its tag ID will be pushed onto the * tag stack. * If the current tag is an empty tag or not a tag at all nothing will be * done. */ Ret_t nextToken(XltDecoderPtr_t pDecoder) { XltUtilStackPtr_t pTagStack; XltDecTokenPtr_t pToken; Ret_t rc; if ((rc = pDecoder->scanner->nextTok(pDecoder->scanner)) != SML_ERR_OK) return rc; pToken = pDecoder->scanner->curtok; pTagStack = pDecoder->tagstack; #if SYDEBUG>2 show_token(pToken,DBG_DETAILS); #endif if (IS_START(pToken)) { if (pTagStack->push(pTagStack, pToken->tagid)) return SML_ERR_UNSPECIFIC; } else if (IS_END(pToken)) { XltTagID_t lastopen; if (pTagStack->pop(pTagStack, &lastopen)) return SML_ERR_UNSPECIFIC; if (pToken->tagid != lastopen) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pDecoder->scanner,"nextToken"); } return SML_ERR_OK; } Ret_t discardToken(XltDecoderPtr_t pDecoder) { Ret_t rc; XltTagID_t tmp; if ((rc = pDecoder->scanner->pushTok(pDecoder->scanner)) != SML_ERR_OK) return rc; if ((rc = pDecoder->tagstack->pop(pDecoder->tagstack, &tmp)) != SML_ERR_OK) return rc; return SML_ERR_OK; } /*************************************************************************/ /* Internal Functions */ /*************************************************************************/ static SmlPcdataPtr_t concatPCData(SmlPcdataPtr_t pDat1, const SmlPcdataPtr_t pDat2) { // luz: 2006-09-07: plain wrong again. We can very well concatenate // STRING, OPAQUE and CDATA, only extensions are not concatenatable // For this, no extra check is needed, as implementation below already does //%%% if (pDat1->contentType != pDat2->contentType) //%%% return NULL; switch (pDat1->contentType) { case SML_PCDATA_STRING: /* luz: 2005-03-07: original RTK code: plain wrong - causes crash as pDat1->content is NOT big enough to have data appended without re-alloc!! - No need to make difference between STRING and OPAQUE anyway! pDat1->content = (VoidPtr_t)smlLibStrcat(pDat1->content, pDat2->content); pDat1->length += pDat2->length; break; */ case SML_PCDATA_CDATA: case SML_PCDATA_OPAQUE: if (pDat2->contentType==SML_PCDATA_EXTENSION) return NULL; // can't concat // luz: 2005-03-07: made sure we ALWAYS have a null byte at the end of an opaque string if ((pDat1->content = smlLibRealloc(pDat1->content, pDat1->length + pDat2->length + 1)) == NULL) return NULL; smlLibMemmove(((Byte_t*)pDat1->content) + pDat1->length, pDat2->content, pDat2->length); pDat1->length += pDat2->length; ((char *)pDat1->content)[pDat1->length]=0; // null byte at the end break; default: return NULL; // can't concat } return pDat1; } Ret_t buildSyncHdr(XltDecoderPtr_t pDecoder, VoidPtr_t *ppSyncHdr) { XltDecScannerPtr_t pScanner; SmlSyncHdrPtr_t pSyncHdr; Ret_t rc; Long_t sessionid = 0, msgid = 0, source = 0, target = 0, version = 0, proto = 0; /* shortcut to the scanner object */ pScanner = pDecoder->scanner; /* if ppSyncHdr is not NULL we've already found a SyncHdr before! */ if (*ppSyncHdr != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSyncHdr"); /* initialize new SmlSyncHdr */ if ((pSyncHdr = (SmlSyncHdrPtr_t)smlLibMalloc(sizeof(SmlSyncHdr_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pSyncHdr, 0, sizeof(SmlSyncHdr_t)); /* initialize the element type field */ pSyncHdr->elementType = SML_PE_HEADER; /* empty SmlSyncHdr is possible */ if (IS_EMPTY(pScanner->curtok)) { *ppSyncHdr = pSyncHdr; return SML_ERR_OK; } /* get next Token */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pSyncHdr); return rc; } /* parse child elements until we find a matching end tag */ while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_VERSION: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->version); version++; break; case TN_PROTO: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->proto); proto++; break; case TN_SESSIONID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->sessionID); sessionid++; break; case TN_MSGID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->msgID); msgid++; break; case TN_RESPURI: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->respURI); break; /* child tags */ case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSyncHdr->target); target++; break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSyncHdr->source); source++; break; case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pSyncHdr->cred); break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pSyncHdr->meta); break; /* flags (empty tags) */ case TN_NORESP: pSyncHdr->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSyncHdr"); } /* decoding of child element went ok? */ if (rc != SML_ERR_OK) { smlFreeSyncHdr(pSyncHdr); return rc; } /* get next token */ if ((rc = nextToken(pDecoder)) != SML_ERR_OK) { smlFreeSyncHdr(pSyncHdr); return rc; } } if ((sessionid == 0) || (msgid == 0) || (target == 0) || (source == 0) || (version == 0) || (proto == 0)) { smlFreeSyncHdr(pSyncHdr); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSyncHdr"); } *ppSyncHdr = pSyncHdr; return SML_ERR_OK; } Ret_t buildSync(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlSyncPtr_t pSync; Ret_t rc; Long_t cmdid = 0; /* stop decoding the Sync when we find a SyncML command */ Byte_t break_sync = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSync"); /* initialize a new Sync */ if ((pSync = (SmlSyncPtr_t)smlLibMalloc(sizeof(SmlSync_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pSync, 0, sizeof(SmlSync_t)); /* initialize the element type field */ pSync->elementType = SML_PE_SYNC_START; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pSync); return SML_ERR_OK; } /* get next token */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pSync); return rc; } /* parse child elements until we find a matching end tag or until we find a TN_ADD, TN_ATOMIC, etc. start tag */ while ((pScanner->curtok->type != TOK_TAG_END) && !break_sync) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSync->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pSync->meta); break; case TN_NUMBEROFCHANGES: rc = buildPCData(pDecoder, (VoidPtr_t)&pSync->noc); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pSync->cred); break; case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSync->target); break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSync->source); break; /* flags */ case TN_NORESP: pSync->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* quit if we find an Add, Atomic, etc. element */ case TN_ADD: case TN_ATOMIC: case TN_COPY: case TN_DELETE: case TN_SEQUENCE: case TN_REPLACE: break_sync = 1; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSync"); } if (rc != SML_ERR_OK) { smlFreeSync(pSync); return rc; } if (!break_sync) { /* get next token and continue as usual */ if ((rc = nextToken(pDecoder)) != SML_ERR_OK) { smlFreeSync(pSync); return rc; } } else { /* we've found a SyncML command - we need to go back one token and correct the tagstack */ if ((rc = discardToken(pDecoder)) != SML_ERR_OK) { smlFreeSync(pSync); return rc; } } } if (!break_sync) { if ((pScanner->curtok->tagid) != TN_SYNC) { smlFreeSync(pSync); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSync"); } else { if (pDecoder->tagstack->push(pDecoder->tagstack, pScanner->curtok->tagid)) { smlFreeSync(pSync); return SML_ERR_UNSPECIFIC; } if ((rc = pDecoder->scanner->pushTok(pDecoder->scanner)) != SML_ERR_OK) { smlFreeSync(pSync); return rc; } } } *ppElem = pSync; return SML_ERR_OK; } #if (defined ATOMIC_RECEIVE || defined SEQUENCE_RECEIVE) Ret_t buildAtomOrSeq(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlAtomicPtr_t pAoS; /* SmlAtomicPtr_t and SequencePtr_t are pointer to the same structure! */ Ret_t rc; Byte_t break_aos = 0; /* stop decoding the Atomic when we find a SyncML command */ Long_t cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAtomOrSeq"); if ((pAoS = (SmlAtomicPtr_t)smlLibMalloc(sizeof(SmlAtomic_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pAoS, 0, sizeof(SmlAtomic_t)); /* initialize the element type field */ pAoS->elementType = SML_PE_CMD_GROUP; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pAoS); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAtomOrSeq"); } /* get next token */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree (pAoS); return rc; } /* parse child elements until we find a matching end tag or until we find a TN_ADD, TN_ATOMIC, etc. start tag */ while ((pScanner->curtok->type != TOK_TAG_END) && !break_aos) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pAoS->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pAoS->meta); break; /* flags */ case TN_NORESP: pAoS->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* quit if we find an Add, Atomic, etc. element */ case TN_ADD: case TN_REPLACE: case TN_DELETE: case TN_COPY: case TN_ATOMIC: case TN_MAP: case TN_SYNC: case TN_GET: case TN_ALERT: case TN_EXEC: break_aos = 1; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAtomOrSeq"); } if (rc != SML_ERR_OK) { smlFreeAtomic(pAoS); return rc; } if (!break_aos) { if ((rc = nextToken(pDecoder)) != SML_ERR_OK) { smlFreeAtomic(pAoS); return rc; } } else { /* we've found a SyncML command - we need to go back one token and correct the tagstack */ if ((rc = discardToken(pDecoder)) != SML_ERR_OK) { smlFreeAtomic(pAoS); return rc; } } } if (!break_aos) { /* Atomic/Sequence must contain at least one SyncML command */ smlFreeAtomic(pAoS); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAtomOrSeq"); } if (cmdid == 0) { smlFreeAtomic(pAoS); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAtomOrSeq"); } *ppElem = pAoS; return SML_ERR_OK; } #endif #ifdef EXEC_RECEIVE Ret_t buildExec(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlExecPtr_t pExec; Ret_t rc; Long_t items = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildExec"); if ((pExec = (SmlExecPtr_t)smlLibMalloc(sizeof(SmlExec_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pExec, 0, sizeof(SmlExec_t)); /* initialize the element type field */ pExec->elementType = SML_PE_EXEC; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pExec); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildExec"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pExec); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCData */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pExec->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pExec->meta); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pExec->cred); break; case TN_ITEM: rc = buildItem(pDecoder, (VoidPtr_t)&pExec->item); items++; break; /* flags */ case TN_NORESP: pExec->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildExec"); } if (rc != SML_ERR_OK) { smlFreeExec(pExec); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeExec(pExec); return rc; } } if ((items == 0) || (cmdid == 0)) { smlFreeExec(pExec); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildExec"); } *ppElem = pExec; return SML_ERR_OK; } #endif Ret_t buildGenericCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlGenericCmdPtr_t pGenCmd; Ret_t rc; Long_t items = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildGenericCmd"); /* initialize a new GenericCmd */ if ((pGenCmd = (SmlGenericCmdPtr_t)smlLibMalloc(sizeof(SmlGenericCmd_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pGenCmd, 0, sizeof(SmlGenericCmd_t)); /* initialize the element type field */ pGenCmd->elementType = SML_PE_GENERIC; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pGenCmd); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildGenericCmd"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pGenCmd); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pGenCmd->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pGenCmd->meta); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pGenCmd->cred); break; /* flags (empty tags) */ case TN_NORESP: pGenCmd->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_ARCHIVE: pGenCmd->flags |= SmlArchive_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_SFTDEL: pGenCmd->flags |= SmlSftDel_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, &pGenCmd->itemList); items++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildGenericCmd"); } if (rc != SML_ERR_OK) { smlFreeGeneric(pGenCmd); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeGeneric(pGenCmd); return rc; } } if ((items == 0) || (cmdid == 0)) { smlFreeGeneric(pGenCmd); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildGenericCmd"); } *ppElem = pGenCmd; return SML_ERR_OK; } Ret_t buildAlert(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlAlertPtr_t pAlert; Ret_t rc; Long_t cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAlert"); if ((pAlert = (SmlAlertPtr_t)smlLibMalloc(sizeof(SmlAlert_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pAlert, 0, sizeof(SmlAlert_t)); /* initialize the element type field */ pAlert->elementType = SML_PE_ALERT; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pAlert); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAlert"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pAlert); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pAlert->cmdID); cmdid++; break; case TN_DATA: rc = buildPCData(pDecoder, (VoidPtr_t)&pAlert->data); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pAlert->cred); break; /* flags (empty tags) */ case TN_NORESP: pAlert->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, &pAlert->itemList); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAlert"); } if (rc != SML_ERR_OK) { smlFreeAlert(pAlert); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeAlert(pAlert); return rc; } } if (cmdid == 0) { smlFreeAlert(pAlert); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildAlert"); } *ppElem = pAlert; return SML_ERR_OK; } #ifdef MAP_RECEIVE Ret_t buildMap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlMapPtr_t pMap; Ret_t rc; Long_t target = 0, source = 0, mapitems = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMap"); if ((pMap = (SmlMapPtr_t)smlLibMalloc(sizeof(SmlMap_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pMap, 0, sizeof(SmlMap_t)); /* initialize the element type field */ pMap->elementType = SML_PE_MAP; /* Source is required */ if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pMap); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMap"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pMap); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pMap->cmdID); cmdid++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pMap->meta); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pMap->cred); break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pMap->source); source++; break; case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pMap->target); target++; break; #ifdef MAPITEM_RECEIVE /* Lists */ case TN_MAPITEM: rc = appendMapItemList(pDecoder, &pMap->mapItemList); mapitems++; break; #endif default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMap"); } if (rc != SML_ERR_OK) { smlFreeMap(pMap); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMap(pMap); return rc; } } if ((source == 0) || (mapitems == 0) || (target == 0) || (cmdid == 0)) { smlFreeMap(pMap); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMap"); } *ppElem = pMap; return SML_ERR_OK; } #endif #ifdef SEARCH_RECEIVE Ret_t buildSearch(XltDecoderPtr_t pDecoder, VoidPtr_t *ppSearch) { XltDecScannerPtr_t pScanner; SmlSearchPtr_t pSearch; Ret_t rc; Long_t source = 0, meta = 0, data = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppSearch != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSearch"); if ((pSearch = (SmlSearchPtr_t)smlLibMalloc(sizeof(SmlSearch_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pSearch, 0, sizeof(SmlSearch_t)); /* initialize the element type field */ pSearch->elementType = SML_PE_SEARCH; /* Meta is required */ if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pSearch); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSearch"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pSearch); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pSearch->cmdID); cmdid++; break; case TN_LANG: rc = buildPCData(pDecoder, (VoidPtr_t)&pSearch->lang); break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pSearch->meta); meta++; break; case TN_DATA: rc = buildPCData(pDecoder, (VoidPtr_t)&pSearch->data); data++; break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pSearch->cred); break; case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pSearch->target); break; /* flags */ case TN_NORESP: pSearch->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_NORESULTS: pSearch->flags |= SmlNoResults_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* Lists */ case TN_SOURCE: rc = appendSourceList(pDecoder, &pSearch->sourceList); source++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSearch"); } if (rc != SML_ERR_OK) { smlFreeSearch(pSearch); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeSearch(pSearch); return rc; } } if ((source == 0) || (meta == 0) || (data == 0) || (cmdid == 0)) { smlFreeSearch(pSearch); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildSearch"); } *ppSearch = pSearch; return SML_ERR_OK; } #endif Ret_t buildPutOrGet(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlGetPtr_t pGet; Ret_t rc; Long_t items = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildPutOrGet"); if ((pGet = (SmlGetPtr_t)smlLibMalloc(sizeof(SmlGet_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pGet, 0, sizeof(SmlGet_t)); /* initialize the element type field */ pGet->elementType = SML_PE_PUT_GET; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pGet); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildPutOrGet"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pGet); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pGet->cmdID); cmdid++; break; case TN_LANG: rc = buildPCData(pDecoder, (VoidPtr_t)&pGet->lang); break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pGet->meta); break; /* child tags */ case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pGet->cred); break; /* flags */ case TN_NORESP: pGet->flags |= SmlNoResp_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, &pGet->itemList); items++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildPutOrGet"); } if (rc != SML_ERR_OK) { smlFreeGetPut(pGet); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeGetPut(pGet); return rc; } } if ((items == 0) || (cmdid == 0)) { smlFreeGetPut(pGet); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildPutOrGet"); } *ppElem = pGet; return SML_ERR_OK; } Ret_t buildRecordFieldFilter(XltDecoderPtr_t pDecoder, VoidPtr_t *ppRecordFieldFilter) { XltDecScannerPtr_t pScanner; SmlRecordOrFieldFilterPtr_t pRecordFieldFilter; Long_t item = 0; Ret_t rc; pScanner = pDecoder->scanner; if (*ppRecordFieldFilter != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildRecordFieldFilter"); if ((pRecordFieldFilter = (SmlRecordOrFieldFilterPtr_t)smlLibMalloc(sizeof(SmlRecordOrFieldFilter_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pRecordFieldFilter, 0, sizeof(SmlRecordOrFieldFilter_t)); if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pRecordFieldFilter); return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pRecordFieldFilter); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* Item */ case TN_ITEM: rc = buildItem(pDecoder, (VoidPtr_t)&pRecordFieldFilter->item); item++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildRecordFieldFilter"); } if (rc != SML_ERR_OK) { smlFreeRecordFieldFilterPtr(pRecordFieldFilter); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeRecordFieldFilterPtr(pRecordFieldFilter); return rc; } } if (item == 0) { smlFreeRecordFieldFilterPtr(pRecordFieldFilter); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildRecordFieldFilter"); } *ppRecordFieldFilter = pRecordFieldFilter; return SML_ERR_OK; } Ret_t buildFilter(XltDecoderPtr_t pDecoder, VoidPtr_t *ppFilter) { XltDecScannerPtr_t pScanner; SmlFilterPtr_t pFilter; Long_t meta = 0; Ret_t rc; pScanner = pDecoder->scanner; if (*ppFilter != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildFilter"); if ((pFilter = (SmlFilterPtr_t)smlLibMalloc(sizeof(SmlFilter_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pFilter, 0, sizeof(SmlFilter_t)); if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pFilter); return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pFilter); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pFilter->meta); meta++; break; /* Record or Field elements */ case TN_FIELD: rc = buildRecordFieldFilter(pDecoder, (VoidPtr_t)&pFilter->field); break; case TN_RECORD: rc = buildRecordFieldFilter(pDecoder, (VoidPtr_t)&pFilter->record); break; /* Flags */ case TN_FILTERTYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pFilter->filtertype); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildFilter"); } if (rc != SML_ERR_OK) { smlFreeFilterPtr(pFilter); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeFilterPtr(pFilter); return rc; } } if (meta == 0) { smlFreeFilterPtr(pFilter); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildFilter"); } *ppFilter = pFilter; return SML_ERR_OK; } Ret_t buildTargetOrSourceParent(XltDecoderPtr_t pDecoder, VoidPtr_t *ppTargetParent) { XltDecScannerPtr_t pScanner; SmlTargetParentPtr_t pTargetParent; Long_t locuri = 0; Ret_t rc; pScanner = pDecoder->scanner; if (*ppTargetParent != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildTargetOrSourceParent"); if ((pTargetParent = (SmlTargetParentPtr_t)smlLibMalloc(sizeof(SmlTargetParent_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pTargetParent, 0, sizeof(SmlTargetParent_t)); if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pTargetParent); return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pTargetParent); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_LOCURI: rc = buildPCData(pDecoder, (VoidPtr_t)&pTargetParent->locURI); locuri++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildTargetOrSourceParent"); } if (rc != SML_ERR_OK) { smlFreeSourceTargetParentPtr(pTargetParent); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeSourceTargetParentPtr(pTargetParent); return rc; } } if (locuri == 0) { smlFreeSourceTargetParentPtr(pTargetParent); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildTargetOrSourceParent"); } *ppTargetParent = pTargetParent; return SML_ERR_OK; } Ret_t buildTargetOrSource(XltDecoderPtr_t pDecoder, VoidPtr_t *ppTarget) { XltDecScannerPtr_t pScanner; SmlTargetPtr_t pTarget; Long_t locuri = 0; Ret_t rc; pScanner = pDecoder->scanner; if (*ppTarget != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildTargetOrSourceParent"); if ((pTarget = (SmlTargetPtr_t)smlLibMalloc(sizeof(SmlTarget_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pTarget, 0, sizeof(SmlTarget_t)); if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pTarget); return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pTarget); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_LOCURI: rc = buildPCData(pDecoder, (VoidPtr_t)&pTarget->locURI); locuri++; break; case TN_LOCNAME: rc = buildPCData(pDecoder, (VoidPtr_t)&pTarget->locName); break; /* SyncML 1.2 Filter element, %%% added 2005-08-17 by synthesis/luz */ case TN_FILTER: rc = buildFilter(pDecoder, (VoidPtr_t)&pTarget->filter); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildTargetOrSourceParent"); } if (rc != SML_ERR_OK) { smlFreeSourceTargetPtr(pTarget); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeSourceTargetPtr(pTarget); return rc; } } if (locuri == 0) { smlFreeSourceTargetPtr(pTarget); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildTargetOrSourceParent"); } *ppTarget = pTarget; return SML_ERR_OK; } Ret_t buildChal(XltDecoderPtr_t pDecoder, VoidPtr_t *ppChal) { XltDecScannerPtr_t pScanner; SmlChalPtr_t pChal; Long_t meta = 0; Ret_t rc; pScanner = pDecoder->scanner; if (*ppChal != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildChal"); if ((pChal = (SmlChalPtr_t)smlLibMalloc(sizeof(SmlChal_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pChal, 0, sizeof(SmlChal_t)); if (IS_EMPTY(pScanner->curtok)) { *ppChal = pChal; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pChal); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pChal->meta); meta++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildChal"); } if (rc != SML_ERR_OK) { smlFreeChalPtr(pChal); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeChalPtr(pChal); return rc; } } if (meta == 0) { smlFreeChalPtr(pChal); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildChal"); } *ppChal = pChal; return SML_ERR_OK; } Ret_t buildCred(XltDecoderPtr_t pDecoder, VoidPtr_t *ppCred) { XltDecScannerPtr_t pScanner; SmlCredPtr_t pCred; Ret_t rc; Long_t data = 0; pScanner = pDecoder->scanner; if (*ppCred != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildCred"); if ((pCred = (SmlCredPtr_t)smlLibMalloc(sizeof(SmlCred_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pCred, 0, sizeof(SmlCred_t)); if (IS_EMPTY(pScanner->curtok)) { *ppCred = pCred; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pCred); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_DATA: rc = buildPCData(pDecoder, (VoidPtr_t)&pCred->data); data++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pCred->meta); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildCred"); } if (rc != SML_ERR_OK) { smlFreeCredPtr(pCred); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeCredPtr(pCred); return rc; } } if (data == 0) { smlFreeCredPtr(pCred); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildCred"); } *ppCred = pCred; return SML_ERR_OK; } Ret_t buildItem(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlItemPtr_t pItem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildItem"); if ((pItem = (SmlItemPtr_t)smlLibMalloc(sizeof(SmlItem_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pItem, 0, sizeof(SmlItem_t)); /* Item might be empty */ if (IS_EMPTY(pScanner->curtok)) { *ppElem = pItem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pItem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pItem->meta); break; case TN_DATA: rc = buildPCData(pDecoder, (VoidPtr_t)&pItem->data); #ifdef __USE_EXTENSIONS__ #ifdef __SML_WBXML__ if (pItem->data && pItem->data->contentType == SML_PCDATA_OPAQUE) subdtdDecodeWbxml(pDecoder, (SmlPcdataPtr_t*)&pItem->data); #endif #endif break; /* child tags */ case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pItem->target); break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pItem->source); break; case TN_TARGETPARENT: rc = buildTargetOrSourceParent(pDecoder, (VoidPtr_t)&pItem->targetParent); break; case TN_SOURCEPARENT: rc = buildTargetOrSourceParent(pDecoder, (VoidPtr_t)&pItem->sourceParent); break; /* flags */ case TN_MOREDATA: pItem->flags |= SmlMoreData_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildItem"); } if (rc != SML_ERR_OK) { smlFreeItemPtr(pItem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeItemPtr(pItem); return rc; } } *ppElem = pItem; return SML_ERR_OK; } #ifdef MAPITEM_RECEIVE Ret_t buildMapItem(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlMapItemPtr_t pMapItem; Long_t target = 0, source = 0; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMapItem"); if ((pMapItem = (SmlMapItemPtr_t)smlLibMalloc(sizeof(SmlMapItem_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pMapItem, 0, sizeof(SmlMapItem_t)); if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pMapItem); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMapItem"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pMapItem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* child tags */ case TN_TARGET: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pMapItem->target); target++; break; case TN_SOURCE: rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pMapItem->source); source++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMapItem"); } if (rc != SML_ERR_OK) { smlFreeMapItemPtr(pMapItem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMapItemPtr(pMapItem); return rc; } } if ((target == 0) || (source == 0)) { smlFreeMapItemPtr(pMapItem); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMapItem"); } *ppElem = pMapItem; return SML_ERR_OK; } #endif Ret_t buildStatus(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlStatusPtr_t pStatus; Ret_t rc; Long_t cmd = 0, data = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildStatus"); if ((pStatus = (SmlStatusPtr_t)smlLibMalloc(sizeof(SmlStatus_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pStatus, 0, sizeof(SmlStatus_t)); /* initialize the element type field */ pStatus->elementType = SML_PE_STATUS; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pStatus); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildStatus"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pStatus); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCData elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->cmdID); cmdid++; break; case TN_MSGREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->msgRef); break; case TN_CMDREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->cmdRef); break; case TN_CMD: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->cmd); cmd++; break; case TN_DATA: rc = buildPCData(pDecoder, (VoidPtr_t)&pStatus->data); data++; break; case TN_CHAL: rc = buildChal(pDecoder, (VoidPtr_t)&pStatus->chal); break; case TN_CRED: rc = buildCred(pDecoder, (VoidPtr_t)&pStatus->cred); break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, (VoidPtr_t)&pStatus->itemList); break; case TN_TARGETREF: rc = appendTargetRefList(pDecoder, (VoidPtr_t)&pStatus->targetRefList); break; case TN_SOURCEREF: rc = appendSourceRefList(pDecoder, (VoidPtr_t)&pStatus->sourceRefList); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildStatus"); } if (rc != SML_ERR_OK) { smlFreeStatus(pStatus); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeStatus(pStatus); return rc; } } if ((cmd == 0) || (data == 0) || (cmdid == 0)) { smlFreeStatus(pStatus); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildStatus"); } *ppElem = pStatus; return SML_ERR_OK; } #ifdef RESULT_RECEIVE Ret_t buildResults(XltDecoderPtr_t pDecoder, VoidPtr_t *ppResults) { XltDecScannerPtr_t pScanner; SmlResultsPtr_t pResults; Ret_t rc; Long_t cmdref = 0, items = 0, cmdid = 0; pScanner = pDecoder->scanner; if (*ppResults != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildResults"); if ((pResults = (SmlResultsPtr_t)smlLibMalloc(sizeof(SmlResults_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pResults, 0, sizeof(SmlResults_t)); /* initialize the element type field */ pResults->elementType = SML_PE_RESULTS; if (IS_EMPTY(pScanner->curtok)) { smlLibFree(pResults); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildResults"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pResults); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_CMDID: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->cmdID); cmdid++; break; case TN_MSGREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->msgRef); break; case TN_CMDREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->cmdRef); cmdref++; break; case TN_META: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->meta); break; case TN_TARGETREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->targetRef); break; case TN_SOURCEREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pResults->sourceRef); break; /* Lists */ case TN_ITEM: rc = appendItemList(pDecoder, &pResults->itemList); items++; break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildResults"); } if (rc != SML_ERR_OK) { smlFreeResults(pResults); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeResults(pResults); return rc; } } if ((cmdref == 0) || (items == 0) || (cmdid == 0)) { smlFreeResults(pResults); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildResults"); } *ppResults = pResults; return SML_ERR_OK; } #endif /// @brief can be called to process both forms of an empty tag ( and Ret_t buildEmptyTag(XltDecoderPtr_t pDecoder) { Ret_t rc; // if current tag is empty (that is, ist a start-and-end like ), that's simply ok if (IS_EMPTY(pDecoder->scanner->curtok)) return SML_ERR_OK; // otherwise, we need a next tag... if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) return rc; // no next tag found // ...and it must be a closing tag if (!IS_END(pDecoder->scanner->curtok)) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pDecoder->scanner,"buildEmptyTag"); // yep, ok return SML_ERR_OK; } Ret_t buildPCData(XltDecoderPtr_t pDecoder, VoidPtr_t *ppPCData) { XltDecScannerPtr_t pScanner; SmlPcdataPtr_t pPCData = 0; SmlPcdataExtension_t ext; Ret_t rc; pScanner = pDecoder->scanner; if (*ppPCData != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildPCData_1"); if (IS_EMPTY(pScanner->curtok)) { if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t)); *ppPCData = pPCData; return SML_ERR_OK; } pPCData = NULL; if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { if (rc == SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildPCData_2")) { /* leaks if dtd failed */ pPCData = pScanner->curtok->pcdata; *ppPCData = pPCData; } return rc; } if (IS_CONTENT(pScanner->curtok)) { /* PCData element has a regular string or opaque content */ while (pScanner->curtok->type == TOK_CONT) { if (pPCData == NULL) pPCData = pScanner->curtok->pcdata; else { pPCData = concatPCData(pPCData, pScanner->curtok->pcdata); smlLibFree(pScanner->curtok->pcdata->content); smlLibFree(pScanner->curtok->pcdata); if (pPCData == NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_PCDATA,pScanner,"buildPCData_3"); } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { *ppPCData = pPCData; return rc; } } } else if (IS_START_OR_EMPTY(pScanner->curtok)) { /* PCData element contains an XML dokument that is handled by an extension mechanism */ ext = pScanner->curtok->ext; if ((rc = discardToken(pDecoder)) != SML_ERR_OK) return rc; if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t)); pPCData->contentType = SML_PCDATA_EXTENSION; pPCData->extension = ext; switch (ext) { #ifdef __USE_METINF__ case SML_EXT_METINF: if ((rc = buildMetInfMetInfCmd(pDecoder, (VoidPtr_t)&pPCData->content)) != SML_ERR_OK) { smlLibFree(pPCData); return rc; } break; #endif #ifdef __USE_DEVINF__ case SML_EXT_DEVINF: if ((rc = buildDevInfDevInfCmd(pDecoder, (VoidPtr_t)&pPCData->content)) != SML_ERR_OK) { smlLibFree(pPCData); return rc; } /* the scanner must point to the closing PCDATA tag */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pPCData); return rc; } break; #endif default: // %%% luz 2005-11-11 : added fallback to MetInf (workaround for ill-formed xml like in sync4j pda clients) // if undefined, try with metinf for ill-formatted xml like from sync4j palm client // - act like we had detected a switch in namespace to METINF pPCData->contentType = SML_PCDATA_EXTENSION; pPCData->extension = SML_EXT_METINF; pScanner->curtok->ext = SML_EXT_METINF; if ((rc = buildMetInfMetInfCmd(pDecoder, (VoidPtr_t)&pPCData->content)) != SML_ERR_OK) { smlLibFree(pPCData); return SML_DECODEERROR(SML_ERR_XLT_INVAL_EXT,pScanner,"buildPCData_4"); // if we fail parsing meta here, this is an invalid extension } break; } // switch } else if (IS_END(pScanner->curtok)) { /* PCData element is empty */ } else { return SML_DECODEERROR(SML_ERR_XLT_INVAL_PCDATA,pScanner,"buildPCData_5"); } if (pScanner->curtok->type != TOK_TAG_END) return SML_DECODEERROR(SML_ERR_XLT_INVAL_PCDATA,pScanner,"buildPCData_6"); if (pPCData == NULL) { if ((pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCData, 0, sizeof(SmlPcdata_t)); } *ppPCData = pPCData; return SML_ERR_OK; } Ret_t buildPCDataList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppPCData) { SmlPcdataListPtr_t pPCDataList = NULL, pPrev = NULL; pPCDataList = (SmlPcdataListPtr_t) *ppPCData; /* advance to the end of the list, and create ther an empty list element */ while (pPCDataList != NULL) { pPrev = pPCDataList; pPCDataList = pPrev->next; } if ((pPCDataList = (SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pPCDataList, 0, sizeof(SmlPcdataList_t)); if (pPrev != NULL) /* we already had some entries in the list */ pPrev->next = pPCDataList; else /* nope we created a new list */ *ppPCData = pPCDataList; pPCDataList->data = NULL; /* at this point pPCDataList should point to an valid list element */ return buildPCData(pDecoder, (VoidPtr_t)&pPCDataList->data); } static Ret_t appendItemList(XltDecoderPtr_t pDecoder, SmlItemListPtr_t *ppItemList) { SmlItemListPtr_t pNewItemList; SmlItemListPtr_t pItemList; Ret_t rc; pItemList = *ppItemList; if (pItemList != NULL) while (pItemList->next != NULL) pItemList = pItemList->next; if ((pNewItemList = (SmlItemListPtr_t)smlLibMalloc(sizeof(SmlItemList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewItemList, 0, sizeof(SmlItemList_t)); if ((rc = buildItem(pDecoder, (VoidPtr_t)&pNewItemList->item)) != SML_ERR_OK) { smlLibFree(pNewItemList); return rc; } if (pItemList == NULL) *ppItemList = pNewItemList; else pItemList->next = pNewItemList; return SML_ERR_OK; } #ifdef SEARCH_RECEIVE static Ret_t appendSourceList(XltDecoderPtr_t pDecoder, SmlSourceListPtr_t *ppSourceList) { SmlSourceListPtr_t pNewSourceList; SmlSourceListPtr_t pSourceList; Ret_t rc; pSourceList = *ppSourceList; if (pSourceList != NULL) while (pSourceList->next != NULL) pSourceList = pSourceList->next; if ((pNewSourceList = (SmlSourceListPtr_t)smlLibMalloc(sizeof(SmlSourceList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewSourceList, 0, sizeof(SmlSourceList_t)); if ((rc = buildTargetOrSource(pDecoder, (VoidPtr_t)&pNewSourceList->source)) != SML_ERR_OK) { smlLibFree(pNewSourceList); return rc; } if (pSourceList == NULL) *ppSourceList = pNewSourceList; else pSourceList->next = pNewSourceList; return SML_ERR_OK; } #endif /* SEARCH_RECEIVE */ #ifdef MAPITEM_RECEIVE static Ret_t appendMapItemList(XltDecoderPtr_t pDecoder, SmlMapItemListPtr_t *ppMapItemList) { SmlMapItemListPtr_t pNewMapItemList; SmlMapItemListPtr_t pMapItemList; Ret_t rc; pMapItemList = *ppMapItemList; if (pMapItemList != NULL) while (pMapItemList->next != NULL) pMapItemList = pMapItemList->next; if ((pNewMapItemList = (SmlMapItemListPtr_t)smlLibMalloc(sizeof(SmlMapItemList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewMapItemList, 0, sizeof(SmlMapItemList_t)); if ((rc = buildMapItem(pDecoder, (VoidPtr_t)&pNewMapItemList->mapItem)) != SML_ERR_OK) { smlLibFree(pNewMapItemList); return rc; } if (pMapItemList == NULL) *ppMapItemList = pNewMapItemList; else pMapItemList->next = pNewMapItemList; return SML_ERR_OK; } #endif static Ret_t appendTargetRefList(XltDecoderPtr_t pDecoder, SmlTargetRefListPtr_t *ppTargetRefList) { SmlTargetRefListPtr_t pNewTargetRefList; SmlTargetRefListPtr_t pTargetRefList; Ret_t rc; pTargetRefList = *ppTargetRefList; if (pTargetRefList != NULL) while (pTargetRefList->next != NULL) pTargetRefList = pTargetRefList->next; if ((pNewTargetRefList = (SmlTargetRefListPtr_t)smlLibMalloc(sizeof(SmlTargetRefList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewTargetRefList, 0, sizeof(SmlTargetRefList_t)); if ((rc = buildPCData(pDecoder, (VoidPtr_t)&pNewTargetRefList->targetRef)) != SML_ERR_OK) { smlFreePcdata(pNewTargetRefList->targetRef); smlLibFree(pNewTargetRefList); return rc; } if (pTargetRefList == NULL) *ppTargetRefList = pNewTargetRefList; else pTargetRefList->next = pNewTargetRefList; return SML_ERR_OK; } static Ret_t appendSourceRefList(XltDecoderPtr_t pDecoder, SmlSourceRefListPtr_t *ppSourceRefList) { SmlSourceRefListPtr_t pNewSourceRefList; SmlSourceRefListPtr_t pSourceRefList; Ret_t rc; pSourceRefList = *ppSourceRefList; if (pSourceRefList != NULL) while (pSourceRefList->next != NULL) pSourceRefList = pSourceRefList->next; if ((pNewSourceRefList = (SmlSourceRefListPtr_t)smlLibMalloc(sizeof(SmlSourceRefList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pNewSourceRefList, 0, sizeof(SmlSourceRefList_t)); if ((rc = buildPCData(pDecoder, (VoidPtr_t)&pNewSourceRefList->sourceRef)) != SML_ERR_OK) { smlFreePcdata(pNewSourceRefList->sourceRef); smlLibFree(pNewSourceRefList); return rc; } if (pSourceRefList == NULL) *ppSourceRefList = pNewSourceRefList; else pSourceRefList->next = pNewSourceRefList; return SML_ERR_OK; } syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdeccom.h0000755000373300037200000001673212424517753030430 0ustar00nightlyallusers00000000000000/** * @file * XML/WBXML scanner * * @target_system all * @target_os all * @description Common header file for the WBXML and the XML scanner. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_DEC_COM_H #define _XLT_DEC_COM_H #include #include #include "xlttags.h" #define DEC_ID XLT_DEC_ID + 0 #define WBXML_ID XLT_DEC_ID + 200 #define XML_ID XLT_DEC_ID + 400 #define STACK_ID XLT_DEC_ID + 600 #ifdef __cplusplus extern "C" { #endif /* Token types returned by the scanner */ typedef enum { TOK_UNDEF = 0, TOK_TAG_START, TOK_TAG_END, TOK_TAG_EMPTY, TOK_CONT } XltTokType_t; /** * Struct containing a token returned by the scanner */ typedef struct { XltTokType_t type; /**< TOK_TAG_START, etc. */ XltTagID_t tagid; /**< TN_SYNCHDR, etc. - valid for token of type * TOK_TAG_xxx */ SmlPcdataExtension_t ext; /**< type of extension this tag belongs to - * valid for token of type TOK_TAG_xxx */ SmlPcdataPtr_t pcdata; /**< valid for token of type TOK_CONT */ MemPtr_t start; /**< pointer to the start of this token within * the document - needed for pushback */ } XltDecToken_t, *XltDecTokenPtr_t; /** @copydoc XltDecScanner_s */ typedef struct XltDecScanner_s XltDecScanner_t, *XltDecScannerPtr_t; /** * Public interface for the XML/WBXML scanner components. * * The struct used for holding the XML and WBXML scanner state information * are the same - function pointers are used to map the "objects" public * methods to the right functions for scanning XML and WBXML documents. * This object-oriented interface enables the parser component to use the * two scanners interchangeably. * The interface contains serveral public methods and attributes: */ struct XltDecScanner_s { /* public methods */ /** * Decodes the next valid token at the current position within the * document. Information about this token is placed into the curtok * attribute of the scanner object. * * @post curtok contains the last valid token. * @param pScanner (IN/OUT) * the scanner * @return SML_ERR_OK or an appropriate error code */ Ret_t (*nextTok)(XltDecScannerPtr_t pScanner); /** * Free the memory allocated by the scanner. * * @param pScanner (IN/OUT) * the scanner * @return SML_ERR_OK or an appropriate error code */ Ret_t (*destroy)(XltDecScannerPtr_t pScanner); /** * Resets the scanner to the beginning position within the document of the * last valid token stored in curtok. Only the last found token can be * pushed back. It is not possible to go back more than one token. * * @pre curtok contains a valid token. * @post the next call of nextTok will find the token that was pushed back. * @param pScanner (IN/OUT) * the scanner * @return SML_ERR_OK or an appropriate error code */ Ret_t (*pushTok)(XltDecScannerPtr_t pScanner); /** * Set the buffer the scanner works on. */ void (*setBuf)(XltDecScannerPtr_t pScanner, const MemPtr_t pBufStart, const MemPtr_t pBufEnd); /** * Get the current position of the scanner within the working buffer. * * @param pScanner (IN/OUT) * the scanner * @param remaining (OUT) * number of valid bytes after current position, optional (NULL acceptable) */ MemPtr_t (*getPos)(XltDecScannerPtr_t pScanner, Long_t *remaining); /* public attributes */ /** Contains the last valid token found by a call to nextTok. */ XltDecTokenPtr_t curtok; /** * The charset information as specified in the XML/WBXML document. * This is the IANA assigned MIBEnum value. */ Long_t charset; /** * String representation of the charset. This attribute is valid only when * charset equals zero. Otherwise charsetStr will be NULL. */ String_t charsetStr; /** * The document public identifier as specified in the XML/WBXML document. * This is the numeric identifier assigned by the WAP Forum. If this value * is zero, the public ID is instead specified as a string contained in the * pubIDStr public attribute. */ Long_t pubID; /** * The string representation of the document public identifier as specified * in the XML/WBXML document (e.g. "-//WAPFORUM//DTD WML 1.0//EN"). This * attribute is valid only when pubID equals zero. Otherwise pubIDStr will * be NULL. */ String_t pubIDStr; /** * This flag is set by the nextTok method when the scanner reaches the end * of the buffer. */ Flag_t finished; }; /** * Initialize a new WBXML scanner. * * @pre ppScanner is NULL * @post ppScanner points to an initialized scanner status object * @param pBufEnd (IN) * buffer containing the WBXML/XML document * @param ppBufPos (IN/OUT) * pointer to the current position within the buffer * @param ppScanner (OUT) * a new WBXML/XML scanner status object * @return SML_ERR_OK or an appropriate error code */ Ret_t xltDecWbxmlInit(const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltDecScannerPtr_t *ppScanner); /** * Initialize a new XML scanner. * * @copydoc xltDecWbxmlInit */ Ret_t xltDecXmlInit(const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltDecScannerPtr_t *ppScanner); #ifdef __cplusplus } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdecwbxml.c0000755000373300037200000010531112424517753030766 0ustar00nightlyallusers00000000000000/** * @file * WBXML decoder * * @target_system all * @target_os all * @description The WBXML scanner/tokenizer. Used by the SyncML parser. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" #ifdef __SML_WBXML__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xltdevinf.h" #include "xltdeccom.h" #include "xlttags.h" #include "xltutilstack.h" #include "xltdec.h" #include "smldtd.h" #include "smldevinfdtd.h" #include "smlmetinfdtd.h" #include "mgrutil.h" #include #include #include #ifdef IS_END /* to avoid redefinition of this macro */ #undef IS_END #endif void subdtdDecodeWbxml(XltDecoderPtr_t pDecoder,SmlPcdataPtr_t *ppPcdata); /* WBXML version that this parser knows */ #define _MAJOR_VERSION 1 #define _MINOR_VERSION 2 #define _MAX_PARSER_MINOR_VERSION 3 // luz: WBXML 1.3 seems to work identically in the SyncML context #define TAG_STATE 0 #define ATTRIBUTE_STATE 1 /* various checks about wbxml token */ #define HAS_ATTRIBUTES(tag) (*tag & 0x80) #define HAS_CONTENT(tag) (*tag & 0x40) #define IDENTITY(tag) (*tag & 0x3F) #define IS_SWITCH(tok) (*(tok) == 0x00) #define IS_END(tok) (*(tok) == 0x01) #define IS_ENTITY(tok) (*(tok) == 0x02) #define IS_STR_I(tok) (*(tok) == 0x03) #define IS_LITERAL(tok) (IDENTITY(tok) == 0x04) // Note: gcc cannot parse multi-line macros when file has DOS line ends #define IS_EXT_I(tok) ((*(tok) == 0x40) || (*(tok) == 0x41) || (*(tok) == 0x42)) #define IS_PI(tok) (*(tok) == 0x43) #define IS_EXT_T(tok) ((*(tok) == 0x80) || (*(tok) == 0x81) || (*(tok) == 0x82)) #define IS_STR_T(tok) (*(tok) == 0x83) #define IS_EXT(tok) ((*(tok) == 0xC0) || (*(tok) == 0xC1) || (*(tok) == 0xC2)) #define IS_OPAQUE(tok) (*(tok) == 0xC3) #define IS_STRING(tok) (IS_STR_I(tok) || IS_STR_T(tok)) #define IS_EXTENSION(tok) (IS_EXT_I(tok) || IS_EXT_T(tok) || IS_EXT(tok)) #define IS_ATTRIBUTE_VALUE(tok) (*(tok) & 0x80) #define IS_ATTRIBUTE_START(tok) (~IS_ATTRIBUTE_VALUE(tok)) /** @copydoc wbxmlScannerPriv_s */ typedef struct wbxmlScannerPriv_s wbxmlScannerPriv_t, *wbxmlScannerPrivPtr_t; /** * Private Interface for the WBXML scanner. * * The private scanner interface contains some additional member attributes * that are not listed in the public interface, e.g. a copy of the string * table and some other items that do not need to be known outside the * scanner module. */ struct wbxmlScannerPriv_s { /* public methods */ Ret_t (*nextTok)(XltDecScannerPtr_t); Ret_t (*destroy)(XltDecScannerPtr_t); Ret_t (*pushTok)(XltDecScannerPtr_t); void (*setBuf)(XltDecScannerPtr_t pScanner, const MemPtr_t pBufStart, const MemPtr_t pBufEnd); MemPtr_t (*getPos)(XltDecScannerPtr_t pScanner, Long_t *remaining); /* public attributes */ XltDecTokenPtr_t curtok; /**< current token */ Long_t charset; /**< character set as specified in the WBXML header */ String_t charsetStr; /**< NULL */ Long_t pubID; /**< document public identifier as specified in the WBXML header */ String_t pubIDStr; /**< pubID as a string - valid only when pubID == 0 */ Flag_t finished; /**< set when end of buffer is reached */ /* private attributes */ MemPtr_t pos; /**< current buffer position */ MemPtr_t bufend; /**< end of buffer */ Long_t pubIDIdx; /**< strtbl index of the string version of the pubID - valid only when pubID == 0 */ XltUtilStackPtr_t tagstack; /**< stack of open start tags */ MemPtr_t strtbl; /**< copy of the string table */ Long_t strtbllen; /**< length of the string table */ Byte_t state; /**< tag state or attribute state */ SmlPcdataExtension_t cptag; /**< current codepage for tags */ Byte_t cpattr; /**< current codepage for attributes */ SmlPcdataExtension_t activeExt; /**< the active Sub DTD */ }; /* typedef for multi-byte unsigned integers as specified in the WAP Binary XML Content Format specification */ typedef Long_t MBINT; /* * Public methods of the scanner interface. * * Description see XLTDecCom.h. */ static Ret_t _destroy(XltDecScannerPtr_t); static Ret_t _nextTok(XltDecScannerPtr_t); static Ret_t _pushTok(XltDecScannerPtr_t); static void _setBuf(XltDecScannerPtr_t, const MemPtr_t, const MemPtr_t); static MemPtr_t _getPos(XltDecScannerPtr_t, Long_t *remaining); /** * Advance the current position pointer after checking whether the end of * the buffer has been reached. If the end of the buffer has been reached * the scanner's finished flag is set. * * @return 0, if end of buffer has been reached * 1 otherwise */ static Boolean_t readBytes(wbxmlScannerPrivPtr_t pScanner, Long_t bytes); /** * Decodes multi-byte integers. * * @pre pScanner->pos points to the first byte of the mb_int. * @post pScanner->pos points to the last byte of the mb_int. */ static Ret_t parseInt(wbxmlScannerPrivPtr_t pScanner, MBINT *mbi); /** * wbxmlHeader, wbxmlVersion, wbxmlPublicID, wbxmlCharset * * These functions are used for decoding the WBXML document header. * wbxmlHeader is a short wrapper that calls the other four functions in * the right order to scan the header. wbxmlStrtbl makes a copy of the * string table. */ static Ret_t wbxmlHeader(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlVersion(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlPublicID(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlCharset(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlStrtbl(wbxmlScannerPrivPtr_t pScanner); /** * Switch WBXML code page */ static Ret_t wbxmlSwitchPage(wbxmlScannerPrivPtr_t pScanner); /** * wbxmlXXXToken * * Scan the document for the next valid XML/WBXML token as defined in the * XLTDecCom header file (e.g. TOK_TAG_START). * * @pre pScanner->pos points to the first byte of a valid WBXML * element (String, Tag, etc.) * @post pScanner->pos points to the last byte of the WBXML element; * pScanner->curtok contains type and tagid or pcdata of the token */ static Ret_t wbxmlStringToken(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlOpaqueToken(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlTagToken(wbxmlScannerPrivPtr_t pScanner); /** * wbxmlSkipXXX * * WBXML extensions, entities, processing instructions and attributes are * not supported by this scanner. If one is found it is skipped and * processing continues afterwards. */ static Ret_t wbxmlSkipExtension(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlSkipEntity(wbxmlScannerPrivPtr_t pScanner); static Ret_t wbxmlSkipPI(wbxmlScannerPrivPtr_t); static Ret_t wbxmlSkipAttribute(wbxmlScannerPrivPtr_t); /*************************************************************************/ /* External Functions */ /*************************************************************************/ /* * Create and initialize a new WBXML scanner. Description see XLTDec.h. */ Ret_t xltDecWbxmlInit(const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltDecScannerPtr_t *ppScanner) { wbxmlScannerPrivPtr_t pScanner; Ret_t rc; /* initialize new WBXML scanner */ if ((pScanner = (wbxmlScannerPrivPtr_t)smlLibMalloc(sizeof(wbxmlScannerPriv_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pScanner, 0, sizeof(wbxmlScannerPriv_t)); pScanner->bufend = pBufEnd; pScanner->pos = *ppBufPos; if ((pScanner->curtok = (XltDecTokenPtr_t)smlLibMalloc(sizeof(XltDecToken_t))) == NULL) { smlLibFree(pScanner); *ppScanner = NULL; return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pScanner->curtok, 0, sizeof(XltDecToken_t)); if ((rc = xltUtilCreateStack(&pScanner->tagstack, 10)) != SML_ERR_OK) { smlLibFree(pScanner->curtok); smlLibFree(pScanner); *ppScanner = NULL; return rc; } pScanner->state = TAG_STATE; /* point public/private methods to the right implementation */ pScanner->nextTok = _nextTok; pScanner->destroy = _destroy; pScanner->pushTok = _pushTok; pScanner->setBuf = _setBuf; pScanner->getPos = _getPos; /* decode WBXML header */ if ((rc = wbxmlHeader(pScanner)) != SML_ERR_OK) { pScanner->destroy((XltDecScannerPtr_t)pScanner); *ppScanner = NULL; return rc; } *ppScanner = (XltDecScannerPtr_t)pScanner; return SML_ERR_OK; } /** * Free memory. Description see XltDecAll.h. */ static Ret_t _destroy(XltDecScannerPtr_t pScanner) { wbxmlScannerPrivPtr_t pScannerPriv; if (pScanner == NULL) return SML_ERR_OK; pScannerPriv = (wbxmlScannerPrivPtr_t)pScanner; if (pScannerPriv->tagstack != NULL) pScannerPriv->tagstack->destroy(pScannerPriv->tagstack); smlLibFree(pScannerPriv->curtok); smlLibFree(pScannerPriv->strtbl); smlLibFree(pScannerPriv); return SML_ERR_OK; } /** * Get next token. */ static Ret_t _nextTok(XltDecScannerPtr_t pScanner) { wbxmlScannerPrivPtr_t pScannerPriv; Ret_t rc; pScannerPriv = (wbxmlScannerPrivPtr_t)pScanner; // T.K.: chanched Ptr_t to _t smlLibMemset(pScanner->curtok, 0, sizeof(XltDecToken_t)); pScannerPriv->curtok->start = pScannerPriv->pos; /* keep going until we find a "supported" element */ rc = SML_ERR_OK; while (rc == SML_ERR_OK) { /* skip PIs, extensions and entities... */ if (IS_PI(pScannerPriv->pos)) { rc = wbxmlSkipPI(pScannerPriv); } else if (IS_EXTENSION(pScannerPriv->pos)) { rc = wbxmlSkipExtension(pScannerPriv); } else if (IS_ENTITY(pScannerPriv->pos)) { rc = wbxmlSkipEntity(pScannerPriv); /* ... decode strings, opaque data and tags */ } else if (IS_STRING(pScannerPriv->pos)) { rc = wbxmlStringToken(pScannerPriv); break; } else if (IS_OPAQUE(pScannerPriv->pos)) { rc = wbxmlOpaqueToken(pScannerPriv); break; } else { rc = wbxmlTagToken(pScannerPriv); break; } } return rc; } /** * Reset the scanner to the starting position of the current token within * the buffer. */ static Ret_t _pushTok(XltDecScannerPtr_t pScanner) { wbxmlScannerPrivPtr_t pScannerPriv; XltUtilStackPtr_t pTagStack; XltTagID_t tagid; Ret_t rc = 0; pScannerPriv = (wbxmlScannerPrivPtr_t)pScanner; pTagStack = pScannerPriv->tagstack; if (pScannerPriv->curtok->start == NULL) return SML_ERR_WRONG_USAGE; /* reset scanner to position where tok begins */ pScannerPriv->pos = pScannerPriv->curtok->start; /* correct the tag stack */ if (pScannerPriv->curtok->type == TOK_TAG_START) { rc = pTagStack->pop(pTagStack, &tagid); } else if (pScannerPriv->curtok->type == TOK_TAG_END) { tagid = pScannerPriv->curtok->tagid; rc = pTagStack->push(pTagStack, tagid); } if (rc) return rc; /* invalidate curtok */ /* T.K. Possible Error. pScannerPriv->curtok is of type XltDecToken_t NOT ...Ptr_t */ // OrigLine: // smlLibMemset(pScannerPriv->curtok, 0, sizeof(XltDecTokenPtr_t)); pScannerPriv->curtok->type = (XltTokType_t)0; return SML_ERR_OK; } static void _setBuf(XltDecScannerPtr_t pScanner, const MemPtr_t pBufStart, const MemPtr_t pBufEnd) { wbxmlScannerPrivPtr_t pScannerPriv = (wbxmlScannerPrivPtr_t)pScanner; pScannerPriv->pos = pBufStart; pScannerPriv->bufend = pBufEnd; } static MemPtr_t _getPos(XltDecScannerPtr_t pScanner, Long_t *remaining) { if (remaining) *remaining = ((wbxmlScannerPrivPtr_t)pScanner)->bufend - ((wbxmlScannerPrivPtr_t)pScanner)->pos; return ((wbxmlScannerPrivPtr_t)pScanner)->pos; } /*************************************************************************/ /* Internal Functions */ /*************************************************************************/ /* * Advance the position pointer. Description see above. */ static Boolean_t readBytes(wbxmlScannerPrivPtr_t pScanner, Long_t bytes) { if (pScanner->pos + bytes > pScanner->bufend) { pScanner->finished = 1; return 0; } pScanner->pos += bytes; return 1; } /* * NOTICE: Entities, Extensions, Processing Instructions and Attributes * are not supported by the WBXML scanner. * * Extensions and Attributes are document-specific and are as such not used * by the SyncML specification. * The scanner will just ignore and skip over them. Neither * this scanner nor the parser use processing instructions so they are * skipped as well. */ /* * Decode the WBXML header containing version number, document public * identifier, character set and a string table. */ static Ret_t wbxmlHeader(wbxmlScannerPrivPtr_t pScanner) { Ret_t rc; /* decode the WBXML header */ if ((rc = wbxmlVersion(pScanner)) != SML_ERR_OK) return rc; if ((rc = wbxmlPublicID(pScanner)) != SML_ERR_OK) return rc; if ((rc = wbxmlCharset(pScanner)) != SML_ERR_OK) return rc; if ((rc = wbxmlStrtbl(pScanner)) != SML_ERR_OK) return rc; return SML_ERR_OK; } /** * Decode WBXML version. The scanner returns an error if the major version * of the document differs from the major version this scanner supports or * if the minor version of the document is larger than the minor version * the scanner supports. */ static Ret_t wbxmlVersion(wbxmlScannerPrivPtr_t pScanner) { Byte_t major, minor; minor = ((Byte_t)(*pScanner->pos & 0x0F)); major = ((Byte_t)((*pScanner->pos >> 4) + 1)); if (major != _MAJOR_VERSION || minor > _MAX_PARSER_MINOR_VERSION) return SML_DECODEERROR(SML_ERR_XLT_INCOMP_WBXML_VERS,pScanner,"wbxmlVersion"); if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlVersion"); return SML_ERR_OK; } /** * Decodes WBXML Document Public Identifier. */ static Ret_t wbxmlPublicID(wbxmlScannerPrivPtr_t pScanner) { MBINT tmp; Ret_t rc; if (*pScanner->pos != 0) { /* pre-defined numeric identifier */ if ((rc = parseInt(pScanner, &tmp)) != SML_ERR_OK) return rc; pScanner->pubID = tmp; pScanner->pubIDIdx = 0; } else { /* public id is given as string table entry (which we haven't read at this point so we'll save the reference for later) */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlPublicID"); if ((rc = parseInt(pScanner, &tmp)) != SML_ERR_OK) return rc; pScanner->pubID = 0; pScanner->pubIDIdx = tmp; } if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlPublicID"); return SML_ERR_OK; } /** * Decode WBXML Charset. */ static Ret_t wbxmlCharset(wbxmlScannerPrivPtr_t pScanner) { /* TODO: if charset iformation has to be processed it can be done here. For the moment only UTF-8 is used by SyncML */ MBINT mibenum; Ret_t rc; /* charset is given as a single IANA assigned MIBEnum value */ if ((rc = parseInt(pScanner, &mibenum)) != SML_ERR_OK) return rc; pScanner->charset = mibenum; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlCharset"); return SML_ERR_OK; } /** * Keep a copy of the string table. */ static Ret_t wbxmlStrtbl(wbxmlScannerPrivPtr_t pScanner) { MBINT len; Ret_t rc; if ((rc = parseInt(pScanner, &len)) != SML_ERR_OK) return rc; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlStrtbl"); pScanner->strtbllen = len; if (len > 0) { if (pScanner->pos + len > pScanner->bufend) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlStrtbl"); if ((pScanner->strtbl = smlLibMalloc(len)) == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemcpy(pScanner->strtbl, pScanner->pos, len); readBytes(pScanner, len); } else { pScanner->strtbl = NULL; } /* if the public ID was given as a string table reference save a reference to the corresponding string for later */ if (pScanner->pubID == 0) { if (pScanner->pubIDIdx > pScanner->strtbllen) return SML_DECODEERROR(SML_ERR_XLT_INVAL_WBXML_DOC,pScanner,"wbxmlStrtbl"); pScanner->pubIDStr = (String_t)(pScanner->strtbl + pScanner->pubIDIdx); } return SML_ERR_OK; } static Ret_t parseInt(wbxmlScannerPrivPtr_t pScanner, MBINT *mbi) { *mbi = 0; /* accumulate byte value until continuation flag (MSB) is zero */ for (;;) { *mbi = *mbi << 7; *mbi += *(pScanner->pos) & 0x7F; if (!(*pScanner->pos & 0x80)) break; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"parseInt"); } return SML_ERR_OK; } static Ret_t wbxmlStringToken(wbxmlScannerPrivPtr_t pScanner) { SmlPcdataPtr_t pPcdata; Ret_t rc; if ((pPcdata = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; /* copy the string into the new PCdata struct */ if (IS_STR_I(pScanner->pos)) { /* inline string */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlStringToken"); pPcdata->extension = SML_EXT_UNDEFINED; pPcdata->contentType = SML_PCDATA_STRING; pPcdata->length = smlLibStrlen((String_t)pScanner->pos); if (pScanner->pos + pPcdata->length + 1 > pScanner->bufend) { smlLibFree(pPcdata); return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlStringToken"); } if ((pPcdata->content = smlLibMalloc(pPcdata->length + 1)) == NULL) { smlLibFree(pPcdata); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibStrncpy(pPcdata->content, (String_t)pScanner->pos, pPcdata->length + 1); readBytes(pScanner, pPcdata->length + 1); } else { /* string table reference */ MBINT offset; /* offset into string table */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlStringToken"); if ((rc = parseInt(pScanner, &offset)) != SML_ERR_OK) { smlLibFree(pPcdata); return rc; } if (offset >= pScanner->strtbllen) { smlLibFree(pPcdata); return SML_DECODEERROR(SML_ERR_XLT_INVAL_WBXML_DOC,pScanner,"wbxmlStringToken"); } pPcdata->contentType = SML_PCDATA_STRING; pPcdata->length = smlLibStrlen((String_t)(pScanner->strtbl + offset)); if ((pPcdata->content = smlLibMalloc(pPcdata->length + 1)) == NULL) { smlLibFree(pPcdata); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibStrncpy(pPcdata->content, (String_t)(pScanner->strtbl + offset), pPcdata->length + 1); readBytes(pScanner, 1); } pScanner->curtok->pcdata = pPcdata; pScanner->curtok->type = TOK_CONT; return SML_ERR_OK; } static Ret_t wbxmlOpaqueToken(wbxmlScannerPrivPtr_t pScanner) { SmlPcdataPtr_t pPcdata = NULL; MBINT len; Ret_t rc; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlOpaqueToken"); /* a mbi indicates the length of the opaque data block that we'll copy into new PCdata struct */ if ((rc = parseInt(pScanner, &len)) != SML_ERR_OK) return rc; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlOpaqueToken"); if (pScanner->pos + len > pScanner->bufend) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlOpaqueToken"); if ((pPcdata = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; pPcdata->extension = SML_EXT_UNDEFINED; pPcdata->contentType = SML_PCDATA_OPAQUE; pPcdata->length = len; /* Modification 2001-07-03 by Luz %%%%%: * made sure that content is one null byte longer * than indicated opaque content, such that strings that are coded as * opaque (happens to be the case with Nokia 9210) can still be read * as C-string without need for an intermediate buffer */ /* original: if ((pPcdata->content = smlLibMalloc(len)) == NULL) { smlLibFree(pPcdata); return SML_ERR_NOT_ENOUGH_SPACE; } */ /* modified: */ if ((pPcdata->content = smlLibMalloc(len+1)) == NULL) { smlLibFree(pPcdata); return SML_ERR_NOT_ENOUGH_SPACE; } ((char *)pPcdata->content)[len]=0; /* make sure there is a c-string terminator */ /* end modification */ smlLibMemcpy(pPcdata->content, pScanner->pos, len); pScanner->curtok->pcdata = pPcdata; readBytes(pScanner, len); pScanner->curtok->type = TOK_CONT; return SML_ERR_OK; } static Ret_t wbxmlTagToken(wbxmlScannerPrivPtr_t pScanner) { XltTagID_t tagid; Boolean_t has_cont, has_attr; Ret_t rc; if (IS_SWITCH(pScanner->pos)) { if ((rc = wbxmlSwitchPage(pScanner)) != SML_ERR_OK) return rc; } /* we have to look at the top of the tagstack to see which start tag an end tag belongs to */ if (IS_END(pScanner->pos)) { if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlTagToken"); pScanner->curtok->type = TOK_TAG_END; rc = pScanner->tagstack->pop(pScanner->tagstack, &tagid); if (rc == SML_ERR_WRONG_USAGE) return SML_DECODEERROR(SML_ERR_XLT_INVAL_WBXML_DOC,pScanner,"wbxmlTagToken"); else if (rc) return rc; pScanner->curtok->tagid = tagid; return SML_ERR_OK; } /* look at the two MSB: does this tag have content or attributes? */ has_cont = ((Boolean_t)(HAS_CONTENT(pScanner->pos))); has_attr = ((Boolean_t)(HAS_ATTRIBUTES(pScanner->pos))); /* look up tag ID either by string or by number */ if (IS_LITERAL(pScanner->pos)) { MBINT offset; /* offset into the string table */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlTagToken"); if ((rc = parseInt(pScanner, &offset)) != SML_ERR_OK) return rc; if (offset > pScanner->strtbllen) return SML_DECODEERROR(SML_ERR_XLT_INVAL_WBXML_DOC,pScanner,"wbxmlTagToken"); rc = (Ret_t)getTagIDByStringAndExt((String_t)(pScanner->strtbl + offset), pScanner->activeExt, &tagid); if ((tagid == TN_UNDEF) || (rc != SML_ERR_OK)) return rc; } else { rc = (Ret_t)getTagIDByByteAndExt((Byte_t)IDENTITY(pScanner->pos), pScanner->activeExt, &tagid); if ((tagid == TN_UNDEF) || (rc != SML_ERR_OK)) return rc; } /* we know everything we need to know */ pScanner->curtok->tagid = tagid; pScanner->curtok->type = has_cont ? TOK_TAG_START : TOK_TAG_EMPTY; #ifdef __USE_METINF__ pScanner->curtok->ext = pScanner->cptag == 0 ? SML_EXT_UNDEFINED : SML_EXT_METINF; #else pScanner->curtok->ext = SML_EXT_UNDEFINED; #endif if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlTagToken"); /* push tag onto tagstack unless this tag is empty */ if (has_cont) { if ((rc = pScanner->tagstack->push(pScanner->tagstack, tagid)) != SML_ERR_OK) return rc; } /* skip attributes */ if (has_attr) { pScanner->state = ATTRIBUTE_STATE; if ((rc = wbxmlSkipAttribute(pScanner)) != SML_ERR_OK) return rc; pScanner->state = TAG_STATE; } return SML_ERR_OK; } /* * Switch WBXML code page. */ /* T.K. 06.02.01 * We need to enhance this as soon as we introduce * Sub DTD's with more than one WBXML codepage. But till then * there is only one case where WBXML codepages can occure, and * this is the MetInf Sub DTD. So in case we find a codepage switch * to something other than codepage zero, we set the active extension * to metinf. * In future versions the pScanner needs to be enhanced, to translate * codepageswitches context sensitive to the active extension. */ static Ret_t wbxmlSwitchPage(wbxmlScannerPrivPtr_t pScanner) { if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSwitchPage"); if (pScanner->state == TAG_STATE) pScanner->cptag = (SmlPcdataExtension_t)*pScanner->pos; else pScanner->cpattr = *pScanner->pos; readBytes(pScanner, 1); /* T.K. this needs to be adjusted as described above */ if (pScanner->cpattr != 0 || pScanner->cptag != 0) pScanner->activeExt = SML_EXT_METINF; else pScanner->activeExt = SML_EXT_UNDEFINED; return SML_ERR_OK; } /******************************/ /* Unsupported WBXML elements */ /******************************/ /** * Skips entities but doesn't do anything useful yet. */ static Ret_t wbxmlSkipEntity(wbxmlScannerPrivPtr_t pScanner) { MBINT tmp; Ret_t rc; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipEntity"); if ((rc = parseInt(pScanner, &tmp)) != SML_ERR_OK) return rc; if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipEntity"); return SML_ERR_OK; } /* * Decode WBXML extensions. Skips the extension but doesn't do anything * useful with it. */ static Ret_t wbxmlSkipExtension(wbxmlScannerPrivPtr_t pScanner) { MBINT tmp; Ret_t rc; if (IS_EXT(pScanner->pos)) { /* single byte extension token */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipExtension"); } else if (IS_EXT_I(pScanner->pos)) { /* inline string extension token */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipExtension"); if (!readBytes(pScanner, smlLibStrlen((String_t)pScanner->pos) + 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipExtension"); } else { /* inline integer extension token */ if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipExtension"); if ((rc = parseInt(pScanner, &tmp)) != SML_ERR_OK) return rc; if (!readBytes(pScanner, tmp + 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipExtension"); } return SML_ERR_OK; } /* * Handle XML processing instructions. PIs are not supported but the * scanner recognizes and skips over them. */ static Ret_t wbxmlSkipPI(wbxmlScannerPrivPtr_t pScanner) { /* PIs are just like tag attributes with a special PI token instead * of the attribute start token */ return wbxmlSkipAttribute(pScanner); } /* * Handle attributes. Attributes are not supported but the * scanner recognizes and skips over them. */ static Ret_t wbxmlSkipAttribute(wbxmlScannerPrivPtr_t pScanner) { XltDecTokenPtr_t oldtok; MBINT tmp; Ret_t rc = 0; /* skipping attributes shouldn't change the current token so we make a copy... */ if ((oldtok = (XltDecTokenPtr_t)smlLibMalloc(sizeof(XltDecToken_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemcpy(oldtok, pScanner->curtok, sizeof(XltDecToken_t)); /* ... skip until attribute end tag... */ while (!IS_END(pScanner->pos)) { if (IS_STRING(pScanner->pos)) { rc = wbxmlStringToken(pScanner); /* avoid memory leak due to this ugly workaround of skipping attributes */ smlLibFree(pScanner->curtok->pcdata); } else if (IS_EXTENSION(pScanner->pos)) { rc = wbxmlSkipExtension(pScanner); } else if (IS_ENTITY(pScanner->pos)) { rc = wbxmlSkipEntity(pScanner); } else if (IS_OPAQUE(pScanner->pos)) { rc = wbxmlOpaqueToken(pScanner); /* avoid memory leak due to this ugly workaround of skipping attributes */ smlLibFree(pScanner->curtok->pcdata); } else if (IS_LITERAL(pScanner->pos)) { if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipAttribute"); rc = parseInt(pScanner, &tmp); if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipAttribute"); } else if (IS_SWITCH(pScanner->pos)) { rc = wbxmlSwitchPage(pScanner); } else { if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"wbxmlSkipAttribute"); } if (rc != SML_ERR_OK) { smlLibFree(oldtok); return rc; } } /* ... then skip the end tag itself... */ readBytes(pScanner, 1); /* ... and finaly restore our copy of curtok */ smlLibMemcpy(pScanner->curtok, oldtok, sizeof(XltDecToken_t)); smlLibFree(oldtok); return SML_ERR_OK; } #ifdef __USE_EXTENSIONS__ /* * This function tries to decode an inlined WBXML document inside * an PCDATA element. * In case of failing to decode it the PCDATA element isn't changed * at all. */ void subdtdDecodeWbxml(XltDecoderPtr_t pDecoder,SmlPcdataPtr_t *ppPcdata) { Ret_t _err = SML_ERR_OK; MemPtr_t pSubBuf = NULL; SmlPcdataPtr_t pSubPcdata = NULL; XltDecoderPtr_t pSubDecoder = NULL; #ifdef __USE_DEVINF__ wbxmlScannerPrivPtr_t pScannerPriv = NULL; #endif /* some sanity checks at first */ if (*ppPcdata == NULL) { if (pDecoder) /* use this rare case to remove warning */ { } return; } if ((*ppPcdata)->contentType != SML_PCDATA_OPAQUE) return; // now create a sub buffer pSubBuf = (MemPtr_t)smlLibMalloc((*ppPcdata)->length); if (pSubBuf == NULL) return; smlLibMemset(pSubBuf, 0x00, (*ppPcdata)->length); smlLibMemmove(pSubBuf, (*ppPcdata)->content, (*ppPcdata)->length); /* ok looks fine sofar - now lets decode the rest */ /* now lets create a decoder, but without parsing the SyncML * start tags (because it's not there) and skip the XML * part as we don't need it. */ pSubDecoder = (XltDecoderPtr_t)smlLibMalloc(sizeof(XltDecoder_t)); if (pSubDecoder == NULL) { smlLibFree(pSubBuf); return; } pSubDecoder->finished = 0; pSubDecoder->final = 0; pSubDecoder->scanner = NULL; if (xltUtilCreateStack(&pSubDecoder->tagstack, 10) != SML_ERR_OK) { smlLibFree(pSubDecoder); smlLibFree(pSubBuf); return; } if (xltDecWbxmlInit(pSubBuf+(*ppPcdata)->length,&pSubBuf, &pSubDecoder->scanner) != SML_ERR_OK) { xltDecTerminate(pSubDecoder); smlLibFree(pSubBuf); return; } pSubDecoder->charset = pSubDecoder->scanner->charset; pSubDecoder->charsetStr = NULL; pSubPcdata = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t)); if (pSubPcdata == NULL) { xltDecTerminate(pSubDecoder); smlLibFree(pSubPcdata); smlLibFree(pSubBuf); return; } /* T.K. * In the future we need to check the WBXML stringtable and * switch into the right Sub DTD. But sofar only DevInf is * supported so we can save time and space */ /* T.K. * To prevent buffer corruption when __USE_DEVINF__ is not used * we initialize _err with any errorcode != OK, and this way * force the function to exit without modifying the ppPcdata */ _err = SML_ERR_UNSPECIFIC; #ifdef __USE_DEVINF__ pSubPcdata->contentType = SML_PCDATA_EXTENSION; pSubPcdata->extension = SML_EXT_DEVINF; pSubPcdata->length = 0; pSubPcdata->content = NULL; pScannerPriv = (wbxmlScannerPrivPtr_t)pSubDecoder->scanner; pScannerPriv->activeExt = SML_EXT_DEVINF; pScannerPriv->cpattr = 0; pScannerPriv->cptag = (SmlPcdataExtension_t)0; smlLibMemset(pScannerPriv->curtok, 0,sizeof(XltDecToken_t)); _err = buildDevInfDevInfCmd(pSubDecoder, (VoidPtr_t)&pSubPcdata->content); #endif if (_err != SML_ERR_OK) { xltDecTerminate(pSubDecoder); smlLibFree(pSubPcdata); smlLibFree(pSubBuf); return; } /* parsing is done, now lets anchor it within the original PCDATA element */ smlFreePcdata(*ppPcdata); *ppPcdata = pSubPcdata; /* we are done */ xltDecTerminate(pSubDecoder); smlLibFree(pSubBuf); return; } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdecwbxml.h0000755000373300037200000000454312424517753031000 0ustar00nightlyallusers00000000000000/** * @file * internal WBXML decoder header file * * @target_system - * @target_os - */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_DEC_WBXML_H #define _XLT_DEC_WBXML_H #include "XLTDecAll.h" xltDecScanner_t* xltDecWbxmlScannerCreate(unsigned char *buf, long buflen); void xltDecWbxmlScannerDestroy(xltDecScanner_t *p); #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdecxml.c0000755000373300037200000011631112424517753030437 0ustar00nightlyallusers00000000000000/** * @file * XML scanner * * @target_system all * @target_os all * @description The XML scanner/tokenizer. Used by the SyncML parser. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" #ifdef __SML_XML__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xltdeccom.h" #include "xlttags.h" #include "xltdec.h" #include #include #include /** @copydoc wbxmlScannerPriv_s */ typedef struct xmlScannerPriv_s xmlScannerPriv_t, *xmlScannerPrivPtr_t; /** * Private Interface for the XML scanner. */ struct xmlScannerPriv_s { /* public */ Ret_t (*nextTok)(XltDecScannerPtr_t); Ret_t (*destroy)(XltDecScannerPtr_t); Ret_t (*pushTok)(XltDecScannerPtr_t); void (*setBuf)(XltDecScannerPtr_t pScanner, const MemPtr_t pBufStart, const MemPtr_t pBufEnd); MemPtr_t (*getPos)(XltDecScannerPtr_t pScanner, Long_t *remaining); XltDecTokenPtr_t curtok; /**< current token */ Long_t charset; /**< 0 */ String_t charsetStr; /**< character set */ Long_t pubID; /**< 0 */ String_t pubIDStr; /**< document public identifier */ SmlPcdataExtension_t ext; /**< which is the actual open namespace ? */ SmlPcdataExtension_t prev_ext; /**< which is the previous open namespace ? */ XltTagID_t ext_tag; /**< which tag started the actual namespace ? */ XltTagID_t prev_ext_tag; /**< which tag started the previous open namespace ? */ String_t nsprefix; /**< prefix used for active namespace (if any) */ Byte_t nsprelen; /**< how long is the prefix ? (to save smlLibStrlen calls) */ Flag_t finished; /* private */ MemPtr_t pos; /**< current position */ MemPtr_t bufend; /**< end of buffer */ }; /* * Public methods of the scanner interface. * * Description see XLTDecCom.h. */ static Ret_t _destroy(XltDecScannerPtr_t); static Ret_t _nextTok(XltDecScannerPtr_t); static Ret_t _pushTok(XltDecScannerPtr_t); static void _setBuf(XltDecScannerPtr_t, const MemPtr_t, const MemPtr_t); static MemPtr_t _getPos(XltDecScannerPtr_t, Long_t *remaining); /** * Advance the current position pointer after checking whether the end of * the buffer has been reached. If the end of the buffer has been reached * the scanner's finished flag is set. * * @param bytes (IN) * read this many bytes * @param pScanner (IN/OUT) * the scanner * @return 1, if end of buffer has not been reached\n * 0 otherwise */ static Boolean_t readBytes(xmlScannerPrivPtr_t pScanner, Long_t bytes); /* * Skip whitespaces. */ static void skipS(xmlScannerPrivPtr_t pScanner); /** * BOM processing. Currently only check BOMs for UTF-8, UTF-16le, UTF-16be, * UTF-32le and UTF-32be. Note that SML_ERR_XLT_ENC_UNK is also returned * when BOMs of UTF-16le, UTF-16be, UTF-32le and UTF-32be are processed for * these encodings are not supported in the current code base. * @param pScanner (IN/OUT) * the scanner * @return SML_ERR_OK if UTF-8 BOM or UTF-8 characters without a BOM * or 8-bit encodings like US-ACII * SML_ERR_XLT_ENC_UNK if other Encodings or Encoding BOMs */ static Ret_t bomDecl(xmlScannerPrivPtr_t pScanner); static Ret_t xmlTag(xmlScannerPrivPtr_t pScanner, Byte_t endtag); static Ret_t xmlName(xmlScannerPrivPtr_t pScanner, String_t *name); static Ret_t xmlCharData(xmlScannerPrivPtr_t pScanner); static Ret_t xmlProlog(xmlScannerPrivPtr_t pScanner); static Ret_t xmlDocTypeDecl(xmlScannerPrivPtr_t pScanner); static Ret_t xmlXMLDecl(xmlScannerPrivPtr_t pScanner); static Ret_t xmlAttribute(xmlScannerPrivPtr_t pScanner, String_t *name, String_t *value); static Ret_t xmlStringConst(xmlScannerPrivPtr_t pScanner, String_t *value); static Ret_t xmlSkipPCDATA(xmlScannerPrivPtr_t pScanner); static Ret_t xmlSkipComment(xmlScannerPrivPtr_t pScanner); static Ret_t xmlSkipAttributes(xmlScannerPrivPtr_t pScanner); static Ret_t xmlSkipPI(xmlScannerPrivPtr_t pScanner); static Ret_t xmlCDATA(xmlScannerPrivPtr_t pScanner); Boolean_t isPcdata(XltTagID_t tagid); /*************************************************************************/ /* External Functions */ /*************************************************************************/ Ret_t xltDecXmlInit(const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltDecScannerPtr_t *ppScanner) { xmlScannerPrivPtr_t pScanner; Ret_t rc; pScanner = (xmlScannerPrivPtr_t)smlLibMalloc(sizeof(xmlScannerPriv_t)); if (pScanner == NULL) { *ppScanner = NULL; return SML_ERR_NOT_ENOUGH_SPACE; } memset(pScanner, 0, sizeof(*pScanner)); pScanner->pos = *ppBufPos; pScanner->bufend = pBufEnd; pScanner->curtok = (XltDecTokenPtr_t)smlLibMalloc(sizeof(XltDecToken_t)); if (pScanner->curtok == NULL) { smlLibFree(pScanner); *ppScanner = NULL; return SML_ERR_NOT_ENOUGH_SPACE; } memset(pScanner->curtok, 0, sizeof(*pScanner->curtok)); pScanner->curtok->tagid = TN_UNDEF; pScanner->ext = SML_EXT_UNDEFINED; pScanner->prev_ext = (SmlPcdataExtension_t)255; pScanner->ext_tag = TN_UNDEF; pScanner->prev_ext_tag = TN_UNDEF; /* point public/private methods to the right implementation */ pScanner->nextTok = _nextTok; pScanner->destroy = _destroy; pScanner->pushTok = _pushTok; pScanner->setBuf = _setBuf; pScanner->getPos = _getPos; if((rc = bomDecl(pScanner)) != SML_ERR_OK) return rc; if ((rc = xmlProlog(pScanner)) != SML_ERR_OK) { smlLibFree(pScanner->curtok); smlLibFree(pScanner); *ppScanner = NULL; return rc; } *ppScanner = (XltDecScannerPtr_t)pScanner; return SML_ERR_OK; } /** * Free memory. Description see XltDecAll.h. */ static Ret_t _destroy(XltDecScannerPtr_t pScanner) { xmlScannerPrivPtr_t pScannerPriv; if (pScanner == NULL) return SML_ERR_OK; pScannerPriv = (xmlScannerPrivPtr_t)pScanner; smlLibFree(pScannerPriv->curtok); smlLibFree(pScannerPriv->charsetStr); smlLibFree(pScannerPriv->pubIDStr); smlLibFree(pScannerPriv); return SML_ERR_OK; } /** * Get next token. Description see XltDecAll.h. */ static Ret_t _nextTok(XltDecScannerPtr_t pScanner) { xmlScannerPrivPtr_t pScannerPriv; Ret_t rc; pScannerPriv = (xmlScannerPrivPtr_t)pScanner; pScannerPriv->curtok->start = pScannerPriv->pos; if (pScannerPriv->curtok->type!=TOK_CONT) skipS(pScannerPriv); /* skip unsupported elements until we find a supported one */ rc = 0; while (!rc) { if (smlLibStrncmp((String_t)pScannerPriv->pos, "", 3) != 0)) if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlSkipComment"); if (pScanner->pos + 3 > pScanner->bufend) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlSkipComment"); if (!readBytes(pScanner, 3)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlSkipComment"); skipS(pScanner); return SML_ERR_OK; } /** * Skip attributes -> they are not supported in SyncML */ static Ret_t xmlSkipAttributes(xmlScannerPrivPtr_t pScanner) { while ((pScanner->pos + 1 <= pScanner->bufend) && (smlLibStrncmp((String_t)pScanner->pos, ">", 1)) && (smlLibStrncmp((String_t)pScanner->pos, "/>", 2))) if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlSkipAttributes"); if (pScanner->pos + 1 > pScanner->bufend) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlSkipAttributes"); return SML_ERR_OK; } /** * Handle a CDATA content */ static Ret_t xmlCDATA(xmlScannerPrivPtr_t pScanner) { SmlPcdataPtr_t pPCData; MemPtr_t begin; int len; readBytes(pScanner, 9); pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t)); if (pPCData == NULL) return SML_ERR_NOT_ENOUGH_SPACE; pPCData->contentType = SML_PCDATA_UNDEFINED; pPCData->length = 0; pPCData->content = NULL; begin = pScanner->pos; while (!((pScanner->pos[0] == ']') && (pScanner->pos[1] == ']') && (pScanner->pos[2] == '>'))) if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlCDATA"); len = pScanner->pos - begin; pPCData->content = smlLibMalloc(len + 1); if (pPCData->content == NULL) { smlLibFree(pPCData); return SML_ERR_NOT_ENOUGH_SPACE; } //%%%waste of CPU: smlLibMemset(pPCData->content, 0, len + 1); ((MemPtr_t)pPCData->content)[len]=0; // set terminator smlLibMemcpy(pPCData->content, begin, len); // copy data pPCData->contentType = SML_PCDATA_CDATA; pPCData->length = len; pScanner->curtok->type = TOK_CONT; pScanner->curtok->pcdata = pPCData; readBytes(pScanner, 3); return SML_ERR_OK; } /** * Read over a Pcdata content */ static Ret_t xmlSkipPCDATA(xmlScannerPrivPtr_t pScanner) { SmlPcdataPtr_t pPCData; MemPtr_t begin; int len; Ret_t rc; String_t _tagString = NULL; String_t _tagString2 = NULL; char entity; /* Check wether this PCData might contain a subdtd. ** We assume a Sub DTD starts with '<' as first char. ** If this char is present start further processing else ** take it as pure String data. If the scanning returns an ** error we reject the file, as '<' is not a valid char inside ** PCData elements. */ if (smlLibStrncmp((String_t)pScanner->pos, "<", 1) == 0) { rc = xmlTag(pScanner, 0); return rc; } _tagString = smlLibMalloc(XML_MAX_TAGLEN); if (_tagString == NULL) return SML_ERR_NOT_ENOUGH_SPACE; if ((rc = getTagString(pScanner->curtok->tagid, _tagString, pScanner->curtok->ext)) != SML_ERR_OK) { smlLibFree(_tagString); return rc; } _tagString2 = smlLibMalloc(smlLibStrlen(_tagString) + 4 + (pScanner->nsprelen +1)); // build a end tag String to compate (e.g. ) // beware of possible namespace prefixes if (_tagString2 == NULL) { smlLibFree(_tagString); return SML_ERR_NOT_ENOUGH_SPACE; } _tagString2 = smlLibStrcpy(_tagString2,"nsprelen > 0) { _tagString2 = smlLibStrcat(_tagString2,pScanner->nsprefix); _tagString2 = smlLibStrcat(_tagString2,":"); } _tagString2 = smlLibStrcat(_tagString2,_tagString); _tagString2 = smlLibStrcat(_tagString2,">"); smlLibFree(_tagString); pPCData = (SmlPcdataPtr_t)smlLibMalloc(sizeof(SmlPcdata_t)); if (pPCData == NULL) { smlLibFree(_tagString2); return SML_ERR_NOT_ENOUGH_SPACE; } pPCData->contentType = SML_PCDATA_UNDEFINED; pPCData->extension = SML_EXT_UNDEFINED; pPCData->length = 0; pPCData->content = NULL; begin = pScanner->pos; if (*pScanner->pos == '&') { Ret_t ret = xmlHTMLEntity(pScanner, &entity); if (ret) { smlLibFree(_tagString2); return ret; } begin = (MemPtr_t)&entity; len = 1; } else { // Read Pcdata content until end tag appears or we run into something which // requires special decoding: CDATA or HTML entity while (smlLibStrncmp((String_t)pScanner->pos, _tagString2, smlLibStrlen(_tagString2)) != 0) { // check if end of buffer if (pScanner->pos >= pScanner->bufend) { smlLibFree(_tagString2); return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"xmlSkipPCDATA"); } // %%% luz 2006-09-07 // check if another pos,"pos == '&') { // stop PCDATA scanning here break; } if (!readBytes(pScanner, 1)) return SML_DECODEERROR(SML_ERR_XLT_END_OF_BUFFER,pScanner,"xmlSkipPCDATA"); } len = pScanner->pos - begin; } smlLibFree(_tagString2); pPCData->content = smlLibMalloc(len + 1); if (pPCData->content == NULL) { smlLibFree(pPCData); return SML_ERR_NOT_ENOUGH_SPACE; } //%%%waste of CPU: smlLibMemset(pPCData->content, 0, len + 1); ((MemPtr_t)pPCData->content)[len]=0; // set terminator smlLibMemcpy(pPCData->content, begin, len); pPCData->contentType = SML_PCDATA_STRING; pPCData->length = len; pScanner->curtok->type = TOK_CONT; pScanner->curtok->pcdata = pPCData; return SML_ERR_OK; } /** * Check if the current tag id represents a Pcdata element */ Boolean_t isPcdata(XltTagID_t tagid) { switch (tagid) { case TN_CMD: case TN_CMDID: case TN_CMDREF: case TN_LANG: case TN_LOCNAME: case TN_LOCURI: case TN_MSGID: case TN_MSGREF: case TN_RESPURI: case TN_SESSIONID: case TN_SOURCEREF: case TN_TARGETREF: case TN_VERSION: case TN_PROTO: case TN_DATA: case TN_META: case TN_NUMBEROFCHANGES: /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ case TN_FILTERTYPE: #ifdef __USE_METINF__ case TN_METINF_EMI: case TN_METINF_FORMAT: case TN_METINF_FREEID: case TN_METINF_FREEMEM: case TN_METINF_LAST: case TN_METINF_MARK: case TN_METINF_MAXMSGSIZE: /* SCTSTK - 18/03/2002 S.H. 2002-04-05 : SyncML 1.1 */ case TN_METINF_MAXOBJSIZE: case TN_METINF_NEXT: case TN_METINF_NEXTNONCE: case TN_METINF_SIZE: case TN_METINF_TYPE: case TN_METINF_VERSION: #endif #ifdef __USE_DEVINF__ case TN_DEVINF_MAN: case TN_DEVINF_MOD: case TN_DEVINF_OEM: case TN_DEVINF_FWV: case TN_DEVINF_SWV: case TN_DEVINF_HWV: case TN_DEVINF_DEVID: case TN_DEVINF_DEVTYP: case TN_DEVINF_MAXGUIDSIZE: case TN_DEVINF_SOURCEREF: case TN_DEVINF_DISPLAYNAME: case TN_DEVINF_CTTYPE: case TN_DEVINF_DATATYPE: case TN_DEVINF_SIZE: case TN_DEVINF_PROPNAME: case TN_DEVINF_VALENUM: case TN_DEVINF_PARAMNAME: case TN_DEVINF_SYNCTYPE: case TN_DEVINF_XNAM: case TN_DEVINF_XVAL: case TN_DEVINF_MAXMEM: case TN_DEVINF_MAXID: case TN_DEVINF_VERCT: case TN_DEVINF_VERDTD: /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ case TN_DEVINF_MAXOCCUR: case TN_DEVINF_FILTERKEYWORD: case TN_DEVINF_MAXSIZE: #endif return 1; default: return 0; } } #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdevinf.c0000755000373300037200000016477712424517753030461 0ustar00nightlyallusers00000000000000/** * @file * DeviceInf DTD related functions for the en-/decoder * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" #ifdef __USE_DEVINF__ #include "smldevinfdtd.h" #include "smlmetinfdtd.h" #include "xlttags.h" #include "xltdevinf.h" #include "xlttagtbl.h" #include "xltenc.h" #include "xltencwbxml.h" #include #include #include #include #include #include /* decoder callbacks */ Ret_t buildDevInfDevInfContent(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, Boolean_t datastoreLocal); Ret_t buildDevInfDevInfCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfDevInfPtr_t pElem = NULL; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDevInfCmd"); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } switch (pScanner->curtok->tagid) { case TN_DEVINF_DEVINF: rc = buildDevInfDevInfContent(pDecoder, (VoidPtr_t)&pElem); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDevInfCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } *ppElem = pElem; return SML_ERR_OK; } Ret_t buildDevInfDevInfContent(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfDevInfPtr_t pElem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDevInfContent"); if ((pElem = (SmlDevInfDevInfPtr_t)smlLibMalloc(sizeof(SmlDevInfDevInf_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfDevInf_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { case TN_DEVINF_VERDTD: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->verdtd); break; case TN_DEVINF_MAN: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->man); break; case TN_DEVINF_MOD: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->mod); break; case TN_DEVINF_OEM: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->oem); break; case TN_DEVINF_FWV: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->fwv); break; case TN_DEVINF_SWV: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->swv); break; case TN_DEVINF_HWV: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->hwv); break; case TN_DEVINF_DEVID: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->devid); break; case TN_DEVINF_DEVTYP: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->devtyp); break; case TN_DEVINF_DATASTORE: rc = buildDevInfDataStoreList(pDecoder, (VoidPtr_t)&pElem->datastore); break; case TN_DEVINF_CTCAP: rc = buildDevInfCtcap(pDecoder, (VoidPtr_t)&pElem->ctcap,FALSE); // CTCap which is global in devInf itself (pre-DS 1.2) break; case TN_DEVINF_EXT: rc = buildDevInfExtList(pDecoder, (VoidPtr_t)&pElem->ext); break; /* SCTSTK - 18/03/2002 S.H. 2002-04-05 : SyncML 1.1 */ case TN_DEVINF_UTC: pElem->flags |= SmlDevInfUTC_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_DEVINF_NOFM: pElem->flags |= SmlDevInfNOfM_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_DEVINF_LARGEOBJECT: pElem->flags |= SmlDevInfLargeObject_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDevInfContent"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } } *ppElem = pElem; return SML_ERR_OK; } static Ret_t buildDevInfFilterCapList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { SmlDevInfFilterCapListPtr_t *ppListElem = NULL; SmlDevInfFilterCapListPtr_t pFiltercap = NULL; SmlPcdataListPtr_t *ppList = NULL; SmlPcdataListPtr_t pList = NULL; XltDecScannerPtr_t pScanner = pDecoder->scanner; Ret_t rc; // if empty, that's ok and treated as NOP: if (IS_EMPTY(pScanner->curtok)) { return SML_ERR_OK; } // get next token if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { return rc; } // get pointer to where we'd insert the next list element ppListElem = (SmlDevInfFilterCapListPtr_t *) ppElem; while (*ppListElem!=NULL) { ppListElem = &((*ppListElem)->next); } // create new list element now pFiltercap = (SmlDevInfFilterCapListPtr_t)smlLibMalloc(sizeof(SmlDevInfFilterCapList_t)); if (pFiltercap == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pFiltercap, 0, sizeof(SmlDevInfFilterCapList_t)); pFiltercap->data = (SmlDevInfFilterCapPtr_t)smlLibMalloc(sizeof(SmlDevInfFilterCap_t)); if (pFiltercap->data == NULL) { smlFreeDevInfFilterCapList(pFiltercap); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pFiltercap->data, 0, sizeof(SmlDevInfFilterCap_t)); // scan until we hit end of enclosure () while (pScanner->curtok->type != TOK_TAG_END) { // process tags switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_DEVINF_CTTYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pFiltercap->data->cttype); break; case TN_DEVINF_VERCT: rc = buildPCData(pDecoder, (VoidPtr_t)&pFiltercap->data->verct); break; case TN_DEVINF_FILTERKEYWORD: ppList = &pFiltercap->data->filterkeyword; goto keywordOrPropname; case TN_DEVINF_PROPNAME: ppList = &pFiltercap->data->propname; goto keywordOrPropname; keywordOrPropname: // find last existing valenum while (*ppList!=NULL) ppList=&((*ppList)->next); // create new list element pList = (SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t)); if (pList == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pList, 0, sizeof(SmlPcdataList_t)); // insert contents rc = buildPCData(pDecoder, (VoidPtr_t)&pList->data); if (rc==SML_ERR_OK) { // ok, add element to list *ppList = pList; ppList = &(pList->next); } else smlFreePcdataList(pList); // invalid, get rid of it break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfFilterCapList"); } if (rc != SML_ERR_OK) { smlFreeDevInfFilterCapList(pFiltercap); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeDevInfFilterCapList(pFiltercap); return rc; } } /* while we do not see an end tag */ // link into list *ppListElem = pFiltercap; // set elem link to where we must link in next element ppListElem = &(pFiltercap->next); // done ok return SML_ERR_OK; } Ret_t buildDevInfDataStoreCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfDatastorePtr_t pElem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDataStoreCmd"); if ((pElem = (SmlDevInfDatastorePtr_t)smlLibMalloc(sizeof(SmlDevInfDatastore_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfDatastore_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_DEVINF_SOURCEREF: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->sourceref); break; case TN_DEVINF_DISPLAYNAME: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->displayname); break; case TN_DEVINF_MAXGUIDSIZE: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->maxguidsize); break; /* other elements */ case TN_DEVINF_RXPREF: if (pElem->rxpref!=NULL) { // we already have a RxPref - simply ignore further ones // (in DS 1.2, some implementations send an other rx-pref for the folder object apart from the main type) SmlDevInfXmitPtr_t dummyP = NULL; rc = buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&dummyP); smlFreeDevInfXmit(dummyP); // simply discard after parsing } else rc = buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&pElem->rxpref); break; case TN_DEVINF_TXPREF: if (pElem->txpref!=NULL) { // we already have a txpref - simply ignore further ones // (in DS 1.2, some implementations send an other tx-pref for the folder object apart from the main type) SmlDevInfXmitPtr_t dummyP = NULL; rc = buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&dummyP); smlFreeDevInfXmit(dummyP); // simply discard after parsing } else rc = buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&pElem->txpref); break; case TN_DEVINF_RX: rc = buildDevInfXmitList(pDecoder, (VoidPtr_t)&pElem->rx); break; case TN_DEVINF_TX: rc = buildDevInfXmitList(pDecoder, (VoidPtr_t)&pElem->tx); break; case TN_DEVINF_CTCAP: rc = buildDevInfCtcap(pDecoder, (VoidPtr_t)&pElem->ctcap,TRUE); // CTCap which is local to datastore (DS 1.2 style) break; case TN_DEVINF_DSMEM: rc = buildDevInfDSMemCmd(pDecoder, (VoidPtr_t)&pElem->dsmem); break; case TN_DEVINF_SYNCCAP: rc = buildDevInfSyncCapCmd(pDecoder, (VoidPtr_t)&pElem->synccap); break; /* SyncML DS 1.2, Synthesis/luz 2005-08-25 */ case TN_DEVINF_FILTERCAP: rc = buildDevInfFilterCapList(pDecoder, (VoidPtr_t)&pElem->filtercap); break; case TN_DEVINF_FILTERRX: rc = buildDevInfXmitList(pDecoder, (VoidPtr_t)&pElem->filterrx); break; case TN_DEVINF_HIERARCHICAL: pElem->flags |= SmlDevInfHierarchical_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_DEVINF_FIELDLEVEL: pElem->flags |= SmlDevInfFieldLevel_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDataStoreCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } } *ppElem = pElem; return SML_ERR_OK; } Ret_t buildDevInfXmitCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfXmitPtr_t pXmit; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfXmitCmd"); if ((pXmit = (SmlDevInfXmitPtr_t)smlLibMalloc(sizeof(SmlDevInfXmit_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pXmit, 0, sizeof(SmlDevInfXmit_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pXmit; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pXmit); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_DEVINF_CTTYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pXmit->cttype); break; case TN_DEVINF_VERCT: rc = buildPCData(pDecoder, (VoidPtr_t)&pXmit->verct); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfXmitCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pXmit); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pXmit); return rc; } } *ppElem = pXmit; return SML_ERR_OK; } Ret_t buildDevInfXmitList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { SmlDevInfXmitListPtr_t pElem = NULL, pPrev = NULL; pElem = (SmlDevInfXmitListPtr_t) *ppElem; /* advance to the end of the list, and create ther an empty list element */ while (pElem != NULL) { pPrev = pElem; pElem = pPrev->next; } if ((pElem = (SmlDevInfXmitListPtr_t)smlLibMalloc(sizeof(SmlDevInfXmitList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfXmitList_t)); if (pPrev != NULL) /* we already had some entries in the list */ pPrev->next = pElem; else /* nope we created a new list */ *ppElem = pElem; pElem->data = NULL; /* at this point pElem should point to an valid list element */ return buildDevInfXmitCmd(pDecoder, (VoidPtr_t)&pElem->data); } Ret_t buildDevInfDataStoreList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { SmlDevInfDatastoreListPtr_t pElem = NULL, pPrev = NULL; pElem = (SmlDevInfDatastoreListPtr_t) *ppElem; /* advance to the end of the list, and create ther an empty list element */ while (pElem != NULL) { pPrev = pElem; pElem = pPrev->next; } if ((pElem = (SmlDevInfDatastoreListPtr_t)smlLibMalloc(sizeof(SmlDevInfDatastoreList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfDatastoreList_t)); if (pPrev != NULL) /* we already had some entries in the list */ pPrev->next = pElem; else /* nope we created a new list */ *ppElem = pElem; pElem->data = NULL; /* at this point pElem should point to an valid list element */ return buildDevInfDataStoreCmd(pDecoder, (VoidPtr_t)&pElem->data); } Ret_t buildDevInfExtList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { SmlDevInfExtListPtr_t pElem = NULL, pPrev = NULL; pElem = (SmlDevInfExtListPtr_t) *ppElem; /* advance to the end of the list, and create ther an empty list element */ while (pElem != NULL) { pPrev = pElem; pElem = pPrev->next; } if ((pElem = (SmlDevInfExtListPtr_t)smlLibMalloc(sizeof(SmlDevInfExtList_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfExtList_t)); if (pPrev != NULL) /* we already had some entries in the list */ pPrev->next = pElem; else /* nope we created a new list */ *ppElem = pElem; pElem->data = NULL; /* at this point pElem should point to an valid list element */ return buildDevInfExtCmd(pDecoder, (VoidPtr_t)&pElem->data); } /// @brief scans common elements of Properties and PropParams /// @return SML_ERR_XLT_INVAL_PROTO_ELEM if unknown tag is encountered static Ret_t scanPropOrParamElement(XltDecoderPtr_t pDecoder, SmlDevInfCTDataPtr_t pPropOrParam) { SmlPcdataListPtr_t *ppValenums = &(pPropOrParam->valenum); SmlPcdataListPtr_t pValenum; XltDecScannerPtr_t pScanner = pDecoder->scanner; Ret_t rc; // process tags switch (pScanner->curtok->tagid) { case TN_DEVINF_DISPLAYNAME: rc = buildPCData(pDecoder, (VoidPtr_t)&pPropOrParam->dname); break; case TN_DEVINF_DATATYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pPropOrParam->datatype); break; case TN_DEVINF_MAXSIZE: case TN_DEVINF_SIZE: rc = buildPCData(pDecoder, (VoidPtr_t)&pPropOrParam->maxsize); break; case TN_DEVINF_MAXOCCUR: rc = buildPCData(pDecoder, (VoidPtr_t)&pPropOrParam->maxoccur); break; /* Flags */ case TN_DEVINF_NOTRUNCATE: pPropOrParam->flags |= SmlDevInfNoTruncate_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* Valenum* */ case TN_DEVINF_VALENUM: // find last existing valenum while (*ppValenums!=NULL) ppValenums=&((*ppValenums)->next); // create new list element pValenum = (SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t)); if (pValenum == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pValenum, 0, sizeof(SmlPcdataList_t)); // insert contents rc = buildPCData(pDecoder, (VoidPtr_t)&pValenum->data); if (rc==SML_ERR_OK) { // ok, add element to list *ppValenums = pValenum; ppValenums = &(pValenum->next); } else smlFreePcdataList(pValenum); // invalid, get rid of it break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_PROTO_ELEM,pScanner,"scanPropOrParamElement"); } return rc; } // @brief scan a single bracket, or a <1.2 type list where a new implies end of current PropParam and start of a new one static Ret_t buildDevInfPropParam(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, int datastoreLocal) { SmlDevInfCTDataListPtr_t *ppListElem = NULL; SmlDevInfCTDataListPtr_t pParam = NULL; Boolean_t newElement = FALSE; XltDecScannerPtr_t pScanner = pDecoder->scanner; Ret_t rc; if (IS_EMPTY(pScanner->curtok)) { return SML_ERR_OK; } if (datastoreLocal) { // DS 1.2: we have no initial tag to process right away, get next tag now if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { return rc; } newElement=TRUE; // new has already started here } // get pointer to where we'd insert the next list element ppListElem = (SmlDevInfCTDataListPtr_t *)ppElem; while (*ppListElem!=NULL) { ppListElem = &((*ppListElem)->next); } pParam=NULL; // now ppListElem points to a SmlDevInfCTDataListPtr_t which is NULL and // can be overwritten with the link to a new element // scan until we hit end of enclosure () or an unknown other tag while (pScanner->curtok->type != TOK_TAG_END) { if (!datastoreLocal && pScanner->curtok->tagid==TN_DEVINF_PARAMNAME) { // DS 1.1-style CTCap, seeing implies new element newElement=TRUE; } // create new element if needed if (newElement) { newElement=FALSE; pParam = (SmlDevInfCTDataListPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataList_t)); if (pParam == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pParam, 0, sizeof(SmlDevInfCTDataList_t)); pParam->data = (SmlDevInfCTDataPtr_t)smlLibMalloc(sizeof(SmlDevInfCTData_t)); if (pParam->data == NULL) { smlFreeDevInfCTDataList(pParam); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pParam->data, 0, sizeof(SmlDevInfCTData_t)); // link into list *ppListElem = pParam; // set elem link to where we must link in next element ppListElem = &(pParam->next); } // now, if we don't have a pParam, this is an invalid curtok->tagid) { /* PCDATA */ case TN_DEVINF_PARAMNAME: rc = buildPCData(pDecoder, (VoidPtr_t)&pParam->data->name); break; default: rc = scanPropOrParamElement(pDecoder, pParam->data); if (rc==SML_ERR_XLT_INVAL_PROTO_ELEM && !datastoreLocal) return SML_ERR_OK; // parser signals unknown tag, this is ok for pre-1.2 break; } if (rc != SML_ERR_OK) return rc; if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) return rc; } /* while we do not see an end tag */ return SML_ERR_OK; } // @brief scan a single bracket, or a <1.2 type list where a new implies end of current property and start of a new one static Ret_t buildDevInfProperty(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, int datastoreLocal) { SmlDevInfCTDataPropListPtr_t *ppListElem = NULL; SmlDevInfCTDataPropListPtr_t pProp = NULL; Boolean_t newElement = FALSE; XltDecScannerPtr_t pScanner = pDecoder->scanner; Ret_t rc; /* Do not return immediately for <1.2 style, the outer loop ends only meeting an end tag * which will lead to an infinite loop*/ if (datastoreLocal && IS_EMPTY(pScanner->curtok)) { return SML_ERR_OK; } if (datastoreLocal) { // DS 1.2: we have no initial tag to process right away, get next tag now if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { return rc; } newElement=TRUE; // new has already started here } // get pointer to where we'd insert the next list element ppListElem = (SmlDevInfCTDataPropListPtr_t *) ppElem; while (*ppListElem!=NULL) { ppListElem = &((*ppListElem)->next); } pProp=NULL; // now ppListElem points to a SmlDevInfCTDataPropListPtr_t which is NULL and // can be overwritten with the link to a new element // scan until we hit end of enclosure () or an unknown other tag while (pScanner->curtok->type != TOK_TAG_END) { if (!datastoreLocal && pScanner->curtok->tagid==TN_DEVINF_PROPNAME) { // DS 1.1-style CTCap, seeing implies new element newElement=TRUE; } // create new element if needed if (newElement) { newElement=FALSE; pProp = (SmlDevInfCTDataPropListPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataPropList_t)); if (pProp == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pProp, 0, sizeof(SmlDevInfCTDataPropList_t)); pProp->data = (SmlDevInfCTDataPropPtr_t)smlLibMalloc(sizeof(SmlDevInfCTDataProp_t)); if (pProp->data == NULL) { smlFreeDevInfCTDataPropList(pProp); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pProp->data, 0, sizeof(SmlDevInfCTDataProp_t)); pProp->data->prop = (SmlDevInfCTDataPtr_t)smlLibMalloc(sizeof(SmlDevInfCTData_t)); if (pProp->data->prop == NULL) { smlFreeDevInfCTDataPropList(pProp); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pProp->data->prop, 0, sizeof(SmlDevInfCTData_t)); // link into list *ppListElem = pProp; // set elem link to where we must link in next element ppListElem = &(pProp->next); } // now, if we don't have a pProp, this is an invalid curtok->tagid) { case TN_DEVINF_PROPPARAM: // DS 1.2 case: only ends the param building process rc = buildDevInfPropParam(pDecoder, (VoidPtr_t)&pProp->data->param,datastoreLocal); break; case TN_DEVINF_PARAMNAME: // directly within (instead of enclosed in a ) - Nokia 2630 style // -> do not reject it but try to process in DS 1.1 style even if this is a DS 1.2 devInf rc = buildDevInfPropParam(pDecoder, (VoidPtr_t)&pProp->data->param,FALSE); // force DS 1.1 style if (rc==SML_ERR_OK) continue; // re-evaluate current tag (tag that caused buildDevInfPropParam() to end, either next , unknown or closing } else { rc = buildDevInfPropParam(pDecoder, (VoidPtr_t)&pProp->data->param,datastoreLocal); if (rc==SML_ERR_OK) continue; // re-evaluate current tag (tag that caused buildDevInfPropParam() to end, either next , unknown or closing } break; /* PCDATA */ case TN_DEVINF_PROPNAME: rc = buildPCData(pDecoder, (VoidPtr_t)&pProp->data->prop->name); break; default: rc = scanPropOrParamElement(pDecoder, pProp->data->prop); if (rc==SML_ERR_XLT_INVAL_PROTO_ELEM && !datastoreLocal) return SML_ERR_OK; // parser signals unknown tag, this is ok for pre-1.2 } if (rc != SML_ERR_OK) return rc; if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) return rc; } /* while we do not see an end tag */ return SML_ERR_OK; } // @brief scan a single bracket, which may contain serveral ctcaps for =DS 1.2 Ret_t buildDevInfCtcap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem, Boolean_t datastoreLocal) { SmlDevInfCtcapListPtr_t *ppListElem = NULL; SmlDevInfCtcapListPtr_t pCtcap = NULL; Boolean_t newElement = FALSE; XltDecScannerPtr_t pScanner = pDecoder->scanner; Ret_t rc; if (IS_EMPTY(pScanner->curtok)) { return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { return rc; } // get pointer to where we'd insert the next list element ppListElem = (SmlDevInfCtcapListPtr_t *)ppElem; while (*ppListElem!=NULL) { ppListElem = &((*ppListElem)->next); } pCtcap=NULL; // now ppListElem points to a SmlDevInfCtcapListPtr_t which is NULL and // can be overwritten with the link to a new element // datastore local CTCap is DS 1.2 or later, and implies that every type description has its own // So starting a CTCap implies creating a new element newElement=datastoreLocal; while (pScanner->curtok->type != TOK_TAG_END) { if (!datastoreLocal && pScanner->curtok->tagid==TN_DEVINF_CTTYPE) { // DS 1.1-style CTCap, seeing CTTYPE implies new element newElement=TRUE; } // create new element if needed if (newElement) { newElement=FALSE; pCtcap = (SmlDevInfCtcapListPtr_t)smlLibMalloc(sizeof(SmlDevInfCtcapList_t)); if (pCtcap == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pCtcap, 0, sizeof(SmlDevInfCtcapList_t)); pCtcap->data = (SmlDevInfCTCapPtr_t)smlLibMalloc(sizeof(SmlDevInfCTCap_t)); if (pCtcap->data == NULL) { smlFreeDevInfCtcapList(pCtcap); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pCtcap->data, 0, sizeof(SmlDevInfCTCap_t)); // link into list *ppListElem = pCtcap; // set elem link to where we must link in next element ppListElem = &(pCtcap->next); } // now, if we don't have a pCtcap, this is an invalid follows if (pCtcap==NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfCtcap"); // process tags switch (pScanner->curtok->tagid) { case TN_DEVINF_CTTYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pCtcap->data->cttype); break; case TN_DEVINF_VERCT: rc = buildPCData(pDecoder, (VoidPtr_t)&pCtcap->data->verct); break; case TN_DEVINF_PROPERTY: // DS 1.2 case: only ends the property building process, next token must be read first // If there is a Property tag, let's take it as DS 1.2 Property Decoding even if the CTCAP is globally // This is found from some Nokia phones (eg. N900, which will send a DevInf v1.2 but the CTCAP // was not inside the datastore as DevInf v1.1) rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,TRUE); break; case TN_DEVINF_PROPNAME: // must be inside else { rc = buildDevInfProperty(pDecoder, (VoidPtr_t)&pCtcap->data->prop,datastoreLocal); if (rc==SML_ERR_OK) continue; // re-evaluate current tag (tag that caused buildDevInfProperty() to end, either unknown or closing // this means do not return SML_ERR_OK unless this is an unknow tag or closing , otherwise it will trigger an infinite loop } break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfCtcap"); } if (rc != SML_ERR_OK) { return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { return rc; } } /* eof while */ return SML_ERR_OK; } Ret_t buildDevInfDSMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfDSMemPtr_t pElem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDSMemCmd"); if ((pElem = (SmlDevInfDSMemPtr_t)smlLibMalloc(sizeof(SmlDevInfDSMem_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfDSMem_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_DEVINF_SHAREDMEM: // %%% luz:2003-04-28: made work as a flag pElem->flags |= SmlDevInfSharedMem_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; case TN_DEVINF_MAXMEM: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->maxmem); break; case TN_DEVINF_MAXID: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->maxid); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfDSMemCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } } *ppElem = pElem; return SML_ERR_OK; } Ret_t buildDevInfCTCapCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfCTCapPtr_t pElem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfCTCapCmd"); if ((pElem = (SmlDevInfCTCapPtr_t)smlLibMalloc(sizeof(SmlDevInfCTCap_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfCTCap_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { case TN_DEVINF_CTTYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->cttype); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfCTCapCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } } *ppElem = pElem; return SML_ERR_OK; } Ret_t buildDevInfSyncCapCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfSyncCapPtr_t pElem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfSyncCapCmd"); if ((pElem = (SmlDevInfSyncCapPtr_t)smlLibMalloc(sizeof(SmlDevInfSyncCap_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfSyncCap_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { case TN_DEVINF_SYNCTYPE: rc = buildPCDataList(pDecoder, (VoidPtr_t)&pElem->synctype); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfSyncCapCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } } *ppElem = pElem; return SML_ERR_OK; } Ret_t buildDevInfExtCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlDevInfExtPtr_t pElem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfExtCmd"); if ((pElem = (SmlDevInfExtPtr_t)smlLibMalloc(sizeof(SmlDevInfExt_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pElem, 0, sizeof(SmlDevInfExt_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pElem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { case TN_DEVINF_XNAM: rc = buildPCData(pDecoder, (VoidPtr_t)&pElem->xnam); break; case TN_DEVINF_XVAL: rc = buildPCDataList(pDecoder, (VoidPtr_t)&pElem->xval); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildDevInfExtCmd"); } if (rc != SML_ERR_OK) { smlLibFree(pElem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlLibFree(pElem); return rc; } } *ppElem = pElem; return SML_ERR_OK; } /* see xltenc.c:XltEncBlock for description of parameters */ Ret_t devinfEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { //Return variable Ret_t _err; SmlPcdataListPtr_t pList = NULL; SmlDevInfDatastoreListPtr_t dsList = NULL; SmlDevInfCtcapListPtr_t ctList = NULL; SmlDevInfExtListPtr_t exList = NULL; SmlDevInfXmitListPtr_t xmList = NULL; SmlDevInfFilterCapListPtr_t fcapList = NULL; SmlDevInfCTDataPropListPtr_t propList = NULL; SmlDevInfCTDataListPtr_t paramList = NULL; XltTagID_t nameTagID = TN_UNDEF; SmlDevInfCTDataPtr_t pPropOrParam = NULL; //Check if pContent of a required field is missing if ((reqOptFlag == REQUIRED) && (pContent == NULL)) return SML_ERR_XLT_MISSING_CONT; //Check if pContent of a optional field is missing -> if yes we are done else if (pContent == NULL) return SML_ERR_OK; //Generate the commands -> see DTD switch (tagId) { case TN_DEVINF_EXT: if ((_err = xltGenerateTag(TN_DEVINF_EXT, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_XNAM, REQUIRED, ((SmlDevInfExtPtr_t) pContent)->xnam, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList = ((SmlDevInfExtPtr_t)pContent)->xval; while (pList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_XVAL, OPTIONAL, pList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList = pList->next; }; if ((_err = xltGenerateTag(TN_DEVINF_EXT, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; case TN_DEVINF_SYNCCAP: if ((_err = xltGenerateTag(TN_DEVINF_SYNCCAP, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList = ((SmlDevInfSyncCapPtr_t)pContent)->synctype; while (pList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_SYNCTYPE, OPTIONAL, pList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList = pList->next; }; if ((_err = xltGenerateTag(TN_DEVINF_SYNCCAP, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; case TN_DEVINF_SHAREDMEM: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfSharedMem_f)) if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; // %%% luz:2003-04-28 added missing 1.1 devinf tags here case TN_DEVINF_UTC: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfUTC_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; case TN_DEVINF_NOFM: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfNOfM_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; case TN_DEVINF_LARGEOBJECT: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfLargeObject_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ case TN_DEVINF_FIELDLEVEL: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfFieldLevel_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; case TN_DEVINF_HIERARCHICAL: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfHierarchical_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; case TN_DEVINF_NOTRUNCATE: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlDevInfNoTruncate_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; case TN_DEVINF_PROPERTY: // pContent is SmlDevInfCTDataPropPtr_t paramList = ((SmlDevInfCTDataPropPtr_t)pContent)->param; // get param list // modify pContent pPropOrParam = ((SmlDevInfCTDataPropPtr_t)pContent)->prop; // common property/propparam description record // set the tag to be used for name nameTagID=TN_DEVINF_PROPNAME; // is a property, use goto param_or_property; case TN_DEVINF_PROPPARAM: // pContent is SmlDevInfCTDataPtr_t (common data structure for and ) paramList=NULL; // set the tag to be used for name nameTagID=TN_DEVINF_PARAMNAME; // is a propparam, use // set content pPropOrParam = (SmlDevInfCTDataPtr_t)pContent; goto param_or_property; param_or_property: // - pPropOrParam is SmlDevInfCTDataPtr_t (common data structure for and ) // - paramList is either NULL (for params, which do not have params themselves) or SmlDevInfCTDataListPtr_t (for properties) // DS 1.2 or higher : open / to properly group all property related elements if (pBufMgr->vers>=SML_VERS_1_2) { if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } /* -- Propname or ParamName */ if ((_err = devinfEncBlock(nameTagID, REQUIRED, pPropOrParam->name, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* -- (ValEnum+ | (Datatype, Size?))? */ //%%% luz 2007-08-14 empty datatype is allowed as well (as this is what e.g. Nokia E90 sends, and when using SML to translate back to XML, we'd failed here before) if (pPropOrParam->valenum != NULL && pPropOrParam->datatype != NULL && pPropOrParam->datatype->length!=0) return SML_ERR_XLT_INVAL_INPUT_DATA; if (pPropOrParam->valenum != NULL) { // ValEnum+ pList = pPropOrParam->valenum; while (pList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_VALENUM, REQUIRED, pList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList = pList->next; }; } else if (pPropOrParam->datatype != NULL) { // Datatype? if ((_err = devinfEncBlock(TN_DEVINF_DATATYPE, REQUIRED, pPropOrParam->datatype, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } /* (Max)Size? (note, in <1.2, the tag was called "Size", in >=1.2, the tag is called "MaxSize" - but both have the same WBXML token) */ if ((_err = devinfEncBlock(pBufMgr->vers>=SML_VERS_1_2 ? TN_DEVINF_MAXSIZE : TN_DEVINF_SIZE, OPTIONAL, pPropOrParam->maxsize, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* -- DS 1.2: MaxOccur?, is valid for Properties only, not for PropParams */ if ((_err = devinfEncBlock(TN_DEVINF_MAXOCCUR, OPTIONAL, pPropOrParam->maxoccur, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* -- DS 1.2: (NoTruncate?), is valid for Properties only, not for PropParams */ if ((_err = devinfEncBlock(TN_DEVINF_NOTRUNCATE, OPTIONAL, &(pPropOrParam->flags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* -- DisplayName ? */ if ((_err = devinfEncBlock(TN_DEVINF_DISPLAYNAME, OPTIONAL, pPropOrParam->dname, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* -- now the paramList */ while (paramList != NULL) { /* Synthesis/luz 2005-08-24 : separated generation of element into own case */ if ((_err = devinfEncBlock(TN_DEVINF_PROPPARAM, REQUIRED, paramList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; paramList = paramList->next; } // DS 1.2 or higher : close / encapsulation if (pBufMgr->vers>=SML_VERS_1_2) { if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } break; case TN_DEVINF_CTCAP: ctList = ((SmlDevInfCtcapListPtr_t)pContent); if (ctList == NULL) break; // empty CTCap - is ok, do not output anything // before DS 1.2 : all types are encapsulated in a single CTCap if (pBufMgr->versdata == NULL) return SML_ERR_XLT_INVAL_INPUT_DATA; // DS 1.2 or higher : every content type is separately enclosed in a CTCap if (pBufMgr->vers>=SML_VERS_1_2) { if ((_err = xltGenerateTag(TN_DEVINF_CTCAP, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } if ((_err = devinfEncBlock(TN_DEVINF_CTTYPE, REQUIRED, ctList->data->cttype, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* SyncML DS 1.2, Synthesis/luz 2005-09-28, required for DS 1.2 only, therefore OPTIONAL here */ if ((_err = devinfEncBlock(TN_DEVINF_VERCT, OPTIONAL, ctList->data->verct, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ if ((_err = devinfEncBlock(TN_DEVINF_FIELDLEVEL, OPTIONAL, &(ctList->data->flags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* now the propList */ // %%% luz 2002-11-27: made property list optional (e.g. text/message of P800 has none) propList = ctList->data->prop; // %%% original: if (propList == NULL) return SML_ERR_XLT_INVAL_INPUT_DATA; while (propList != NULL) { if (propList->data == NULL) return SML_ERR_XLT_INVAL_INPUT_DATA; if (propList->data->prop == NULL) return SML_ERR_XLT_INVAL_INPUT_DATA; /* Synthesis/luz 2005-08-24 : separated generation of element into own case */ if ((_err = devinfEncBlock(TN_DEVINF_PROPERTY, REQUIRED, propList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; propList = propList->next; } // DS 1.2 or higher : every content type is separately enclosed in a CTCap if (pBufMgr->vers>=SML_VERS_1_2) { if ((_err = xltGenerateTag(TN_DEVINF_CTCAP, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; } /* eof propList */ ctList = ctList->next; }; // before DS 1.2 : all types are encapsulated in a single CTCap if (pBufMgr->versflags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_MAXMEM, OPTIONAL, ((SmlDevInfDSMemPtr_t) pContent)->maxmem, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_MAXID, OPTIONAL, ((SmlDevInfDSMemPtr_t) pContent)->maxid, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = xltGenerateTag(TN_DEVINF_DSMEM, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; // special case, the following 5 have the same structure, only the tag name differs case TN_DEVINF_RX: case TN_DEVINF_TX: case TN_DEVINF_RXPREF: case TN_DEVINF_TXPREF: case TN_DEVINF_FILTERRX: /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_CTTYPE, REQUIRED, ((SmlDevInfXmitPtr_t) pContent)->cttype, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_VERCT, REQUIRED, ((SmlDevInfXmitPtr_t) pContent)->verct, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ case TN_DEVINF_FILTERCAP: if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_CTTYPE, REQUIRED, ((SmlDevInfFilterCapPtr_t) pContent)->cttype, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_VERCT, REQUIRED, ((SmlDevInfFilterCapPtr_t) pContent)->verct, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList = ((SmlDevInfFilterCapPtr_t) pContent)->filterkeyword; while (pList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_FILTERKEYWORD, REQUIRED, pList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList=pList->next; } pList = ((SmlDevInfFilterCapPtr_t) pContent)->propname; while (pList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_PROPNAME, REQUIRED, pList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; pList=pList->next; } if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; case TN_DEVINF_DATASTORE: if ((_err = xltGenerateTag(TN_DEVINF_DATASTORE, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_SOURCEREF, REQUIRED, ((SmlDevInfDatastorePtr_t) pContent)->sourceref, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_DISPLAYNAME, OPTIONAL, ((SmlDevInfDatastorePtr_t) pContent)->displayname, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_MAXGUIDSIZE, OPTIONAL, ((SmlDevInfDatastorePtr_t) pContent)->maxguidsize, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_RXPREF, REQUIRED, ((SmlDevInfDatastorePtr_t) pContent)->rxpref, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; xmList = ((SmlDevInfDatastorePtr_t)pContent)->rx; while (xmList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_RX, OPTIONAL, xmList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; xmList = xmList->next; }; if ((_err = devinfEncBlock(TN_DEVINF_TXPREF, REQUIRED, ((SmlDevInfDatastorePtr_t) pContent)->txpref, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; xmList = ((SmlDevInfDatastorePtr_t)pContent)->tx; while (xmList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_TX, OPTIONAL, xmList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; xmList = xmList->next; }; /* For SyncML DS 1.2, CTCaps are local to datastore, no longer global in DevInf */ if ((_err = devinfEncBlock(TN_DEVINF_CTCAP, OPTIONAL, ((SmlDevInfDatastorePtr_t) pContent)->ctcap, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_DSMEM, OPTIONAL, ((SmlDevInfDatastorePtr_t) pContent)->dsmem, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ if ((_err = devinfEncBlock(TN_DEVINF_HIERARCHICAL, OPTIONAL, &(((SmlDevInfDatastorePtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_SYNCCAP, REQUIRED, ((SmlDevInfDatastorePtr_t) pContent)->synccap, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ xmList = ((SmlDevInfDatastorePtr_t)pContent)->filterrx; while (xmList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_FILTERRX, OPTIONAL, xmList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; xmList = xmList->next; }; /* SyncML DS 1.2, Synthesis/luz 2005-08-25 */ fcapList = ((SmlDevInfDatastorePtr_t)pContent)->filtercap; while (fcapList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_FILTERCAP, OPTIONAL, fcapList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; fcapList = fcapList->next; }; if ((_err = xltGenerateTag(TN_DEVINF_DATASTORE, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; case TN_DEVINF_DEVINF: if ((_err = xltGenerateTag(TN_DEVINF_DEVINF, TT_BEG, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_VERDTD, REQUIRED, ((SmlDevInfDevInfPtr_t) pContent)->verdtd, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_MAN, OPTIONAL, ((SmlDevInfDevInfPtr_t) pContent)->man, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_MOD, OPTIONAL, ((SmlDevInfDevInfPtr_t) pContent)->mod, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_OEM, OPTIONAL, ((SmlDevInfDevInfPtr_t) pContent)->oem, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_FWV, OPTIONAL, ((SmlDevInfDevInfPtr_t) pContent)->fwv, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_SWV, OPTIONAL, ((SmlDevInfDevInfPtr_t) pContent)->swv, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_HWV, OPTIONAL, ((SmlDevInfDevInfPtr_t) pContent)->hwv, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_DEVID, REQUIRED, ((SmlDevInfDevInfPtr_t) pContent)->devid, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_DEVTYP, REQUIRED, ((SmlDevInfDevInfPtr_t) pContent)->devtyp, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_UTC, OPTIONAL, &(((SmlDevInfDevInfPtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_NOFM, OPTIONAL, &(((SmlDevInfDevInfPtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; if ((_err = devinfEncBlock(TN_DEVINF_LARGEOBJECT, OPTIONAL, &(((SmlDevInfDevInfPtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; // According to SyncML standard, the dsList must not be empty. However as some implementations send such devInf, // and the RTK is also used to convert WBXML to XML for human readable message dumps, we now allow // generating such devInf (for the XML log output). dsList = ((SmlDevInfDevInfPtr_t)pContent)->datastore; //if (dsList == NULL) return SML_ERR_XLT_MISSING_CONT; if(dsList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_DATASTORE, REQUIRED, dsList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; dsList = dsList->next; while (dsList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_DATASTORE, OPTIONAL, dsList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; dsList = dsList->next; }; } // for pre DS 1.2, CTCaps are global (i.e at the devInf level): if ((_err = devinfEncBlock(TN_DEVINF_CTCAP, OPTIONAL, ((SmlDevInfDevInfPtr_t)pContent)->ctcap, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; // extensions exList = ((SmlDevInfDevInfPtr_t)pContent)->ext; while (exList != NULL) { if ((_err = devinfEncBlock(TN_DEVINF_EXT, OPTIONAL, exList->data, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; exList = exList->next; }; if ((_err = xltGenerateTag(TN_DEVINF_DEVINF, TT_END, enc, pBufMgr, SML_EXT_DEVINF)) != SML_ERR_OK) return _err; break; default: { // all leaf nodes (PCDATA#) return xltEncPcdata(tagId, reqOptFlag, pContent, enc, pBufMgr, attFlag); } //* eof default statement from switch tagid } // eof switch tagid return SML_ERR_OK; } #endif /* __USE_DEVINF__ */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltdevinf.h0000755000373300037200000000652312424517753030446 0ustar00nightlyallusers00000000000000/** * @file * Definition of DevInf DTD prototypefunctions for the en-/decoder * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _XLT_DEVINF_H #define _XLT_DEVINF_H /* process only if we really use DevInf DTD */ #ifdef __USE_DEVINF__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xlttagtbl.h" #include "xltenc.h" Ret_t buildDevInfDevInfCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfDataStoreCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfXmitCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfXmitList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfDSMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfCTCapCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfSyncCapCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfExtCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfDataStoreList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfExtList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDevInfCTCapList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t devinfEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag); #endif /* __USE_DEVINF__ */ #endif /* _XLT_DEVINF_H */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltenc.c0000755000373300037200000020072112424517753027727 0ustar00nightlyallusers00000000000000/** * @file * Encoder source file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include #ifdef __SML_WBXML__ #include "xltencwbxml.h" #endif #ifdef __SML_XML__ #include "xltencxml.h" #endif #include "xlttags.h" #include "xltmetinf.h" #include "xltdevinf.h" #include "smlmetinfdtd.h" #include "smldevinfdtd.h" #include #include #include Ret_t getTNbyPE(SmlProtoElement_t, XltTagID_t*); Ret_t xltEncBlock(XltTagID_t, XltRO_t, const VoidPtr_t, SmlEncoding_t, BufferMgmtPtr_t, SmlPcdataExtension_t); Ret_t xltEncList(XltListType_t, XltRO_t, VoidPtr_t, SmlEncoding_t, BufferMgmtPtr_t, SmlPcdataExtension_t); #ifndef __SML_LITE__ Ret_t xltBuildExtention(SmlPcdataExtension_t, XltRO_t, VoidPtr_t, SmlEncoding_t, BufferMgmtPtr_t); #endif typedef struct PEEnc_s { XltTagID_t tagid; SmlProtoElement_t type; } PEEnc_t, *PEEncPtr_t; /* luz 2005-08-17: simplified, removed unnecessary copying of the const static table */ static const PEEnc_t cPE_Enc[] = { { TN_ADD, SML_PE_ADD }, { TN_ALERT, SML_PE_ALERT }, { TN_ATOMIC, SML_PE_ATOMIC_START }, { TN_ATOMIC_END, SML_PE_ATOMIC_END }, { TN_COPY, SML_PE_COPY }, { TN_DELETE, SML_PE_DELETE }, { TN_EXEC, SML_PE_EXEC }, { TN_GET, SML_PE_GET }, { TN_MAP, SML_PE_MAP }, { TN_PUT, SML_PE_PUT }, { TN_RESULTS, SML_PE_RESULTS }, { TN_SEARCH, SML_PE_SEARCH }, { TN_SEQUENCE, SML_PE_SEQUENCE_START }, { TN_SEQUENCE_END, SML_PE_SEQUENCE_END }, { TN_STATUS, SML_PE_STATUS }, { TN_SYNC, SML_PE_SYNC_START }, { TN_SYNC_END, SML_PE_SYNC_END }, { TN_REPLACE, SML_PE_REPLACE }, { TN_UNDEF, SML_PE_UNDEF } }; Ret_t getTNbyPE(SmlProtoElement_t pE, XltTagID_t *tagID) { int i = 0; while ((cPE_Enc[i].type) != SML_PE_UNDEF) { if ((cPE_Enc[i].type) == pE) { *tagID = cPE_Enc[i].tagid; return SML_ERR_OK; } i++; } *tagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM; } // %%% luz:2003-07-31: added SyncML FPI (formal public identifier) tables const char * const SyncMLFPI[SML_NUM_VERS] = { "???", "-//SYNCML//DTD SyncML 1.0//EN", "-//SYNCML//DTD SyncML 1.1//EN", "-//SYNCML//DTD SyncML 1.2//EN" }; const char * const SyncMLDevInfFPI[SML_NUM_VERS] = { "???", "-//SYNCML//DTD DevInf 1.0//EN", "-//SYNCML//DTD DevInf 1.1//EN", "-//SYNCML//DTD DevInf 1.2//EN" }; const int SyncMLWBXMLPublicID[SML_NUM_VERS] = { 0, 0, // we use the string ID, not the binary value (altough it seems to be defined as 0x0FD1 0x0FD3, 0x1201 }; const int SyncMLDevInfWBXMLPublicID[SML_NUM_VERS] = { 0, 0, 0x0FD4, // according to Nokia E70 0x1203 // according to Nokia E70 }; /** * Initializes an XML buffer; Creates XML code for the SyncHdr * and appends it to the buffer. * Returns 0 if operation was successful. * * @pre no memory should be allocated for ppEncoder (should be NULL) * pHeader has to contain a valid SyncHdr structure * pBufEnd must point to the end of the (WB)XML buffer * ppBufPos has to be initialized to the start point of the * (WB)XML buffer. * @post After the function call ppBufPos points to the * first free byte in the buffer behind the (WB)XML document * @param enc (IN) * the encoding constant (SML_WBXML or SML_XML) * @param pHeader (IN) * the SyncML header structure * @param pBufEnd (IN) * pointer to the end of the buffer to write on * @param ppBufPos (IN/OUT) * current position of the bufferpointer * @param ppEncoder (IN/OUT) * the encoder object * @param vers (IN) * SyncML version * @return shows error codes of function,\n * 0, if OK\n * Possible Error Codes: * - SML_ERR_XLT_MISSING_CONT * - SML_ERR_XLT_BUF_ERR * - SML_ERR_XLT_INVAL_ELEM_TYPE * - SML_ERR_XLT_INVAL_LIST_TYPE * - SML_ERR_XLT_INVAL_TAG_TYPE * - SML_ERR_XLT_ENC_UNK * - SML_ERR_XLT_INVAL_PROTO_ELEM */ Ret_t xltEncInit(SmlEncoding_t enc, const SmlSyncHdrPtr_t pHeader, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltEncoderPtr_t *ppEncoder, SmlVersion_t vers) { // Return variable Ret_t _err; XltEncoderPtr_t _pEncoder; //Structure containing buffer pointers, length and written bytes BufferMgmtPtr_t _pBufMgr; #ifdef __SML_XML__ MemPtr_t _tmpStr; MemPtr_t _xmlver = (MemPtr_t)XML_VERSION; MemPtr_t _xmlenc = (MemPtr_t)XML_ENCODING; MemByte_t _begpar = XML_BEGPAR; MemByte_t _endpar = XML_ENDPAR; #endif #ifdef __SML_WBXML__ MemByte_t _wbxmlver = XLT_WBXMLVER; MemByte_t _charset = XLT_CHARSET; // check if we want to send numeric or textual FPI MemByte_t _pubident1 = 0; // default to textual MemByte_t _pubident2 = 0; const char *_syncmldtd = SyncMLFPI[vers]; unsigned short fpi = SyncMLWBXMLPublicID[vers]; MemByte_t _stablen = smlLibStrlen(_syncmldtd); // %% not 0x1D constant! if (fpi) { // numeric FPI available _pubident1 = ((fpi>>7) & 0x7F)+0x80; // upper 7 bit _pubident2 = (fpi & 0x7F); // lower 7 bits _stablen = 0; // no string table } #endif //MemByte_t _tmp = 0x00;CURRENTLY NOT USED if ((_pEncoder = (XltEncoderPtr_t)smlLibMalloc(sizeof(XltEncoder_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; if ((_pBufMgr = (BufferMgmtPtr_t)smlLibMalloc(sizeof(BufferMgmt_t))) == NULL) { smlLibFree(_pEncoder); return SML_ERR_NOT_ENOUGH_SPACE; } //set the encoding _pEncoder->enc = enc; // %%% luz:2003-07-31: added version _pEncoder->vers = vers; _pEncoder->cur_ext = (SmlPcdataExtension_t)SML_EXT_UNDEFINED; _pEncoder->last_ext = (SmlPcdataExtension_t)SML_EXT_UNDEFINED; _pEncoder->end_tag_size = 0; _pEncoder->space_evaluation = NULL; _pBufMgr->smlXltBufferP = *ppBufPos; _pBufMgr->smlXltBufferLen = pBufEnd - *ppBufPos; _pBufMgr->smlXltStoreBufP = _pBufMgr->smlXltBufferP; _pBufMgr->smlXltWrittenBytes = 0; _pBufMgr->smlCurExt = _pEncoder->cur_ext; _pBufMgr->smlLastExt = _pEncoder->last_ext; _pBufMgr->smlActiveExt = SML_EXT_UNDEFINED; _pBufMgr->switchExtTag = TN_UNDEF; _pBufMgr->spaceEvaluation = 0; _pBufMgr->vers = vers; _pBufMgr->endTagSize = 0; switch (enc) { #ifdef __SML_WBXML__ case SML_WBXML: { // Set the WBXML Header Values // WBXML Version if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_wbxmlver), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // Public Idetifier - default unknown if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_pubident1), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_pubident2), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // Character set - not yet implemented if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_charset), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // - String table length - only used for textual FPI if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_stablen), TAG, 1, _pBufMgr)) != SML_ERR_OK) break; // FPI - %%% luz:2003-07-31: not constant any more, varies according to SyncML version if (fpi==0) { // textual FPI // - string table consisting of FPI only if ((_err = xltAddToBuffer((MemPtr_t) (_syncmldtd) , smlLibStrlen((String_t)_syncmldtd), _pBufMgr)) != SML_ERR_OK) break; } else { // numeric FPI // NOP - no string table } break; } #endif #ifdef __SML_XML__ case SML_XML: { if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, _pBufMgr)) != SML_ERR_OK) break; _tmpStr = (MemPtr_t)"?xml version=\""; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = _xmlver; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = (MemPtr_t)"\" encoding=\""; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = _xmlenc; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; _tmpStr = (MemPtr_t)"\"?"; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), _pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, _pBufMgr)) != SML_ERR_OK) break; break; } #endif default: { _err = SML_ERR_XLT_ENC_UNK; } } if (_err != SML_ERR_OK) { smlLibFree(_pBufMgr); smlLibFree(_pEncoder); return _err; } // SyncML Tag if ((_err = xltGenerateTag(TN_SYNCML, TT_BEG, enc, _pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) { smlLibFree(_pBufMgr); smlLibFree(_pEncoder); return _err; } // Generate SmlSyncHdr if ((_err = xltEncBlock(TN_SYNCHDR, REQUIRED, pHeader, enc, _pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) { smlLibFree(_pBufMgr); smlLibFree(_pEncoder); return _err; } // SyncBody Tag if ((_err = xltGenerateTag(TN_SYNCBODY, TT_BEG, enc, _pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) { smlLibFree(_pBufMgr); smlLibFree(_pEncoder); return _err; } _pEncoder->cur_ext = _pBufMgr->smlCurExt; _pEncoder->last_ext = _pBufMgr->smlLastExt; _pEncoder->end_tag_size = _pBufMgr->endTagSize; *ppBufPos = _pBufMgr->smlXltBufferP; smlLibFree(_pBufMgr); _pEncoder->final = 0; *ppEncoder = (XltEncoderPtr_t)_pEncoder; return SML_ERR_OK; } /** * Generates (WB)XML code and appends it to the XML buffer. * * @pre pEncoder holds the initialized encoder structure. * the initialization takes place in the xltEncAppend function * pContent has to contain a valid content structure structure * pBufEnd must point to the end of the (WB)XML buffer * ppBufPos has to be initialized to the start point of the * (WB)XML buffer. * @post After the function call ppBufPos points to the * first free byte in the buffer behind the (WB)XML document * @param pEncoder (IN) * the encoder object * @param pe (IN) * the protocol element (PE_ADD, ...) * @param pBufEnd (IN) * pointer to the end of the buffer to write on * @param pContent (IN) * the content to append to the SyncML document * @param ppBufPos (IN/OUT) * current position of the bufferpointer * @return shows error codes of function,\n * 0, if OK\n * Possible Error Codes: * - SML_ERR_XLT_MISSING_CONT * - SML_ERR_XLT_BUF_ERR * - SML_ERR_XLT_INVAL_ELEM_TYPE * - SML_ERR_XLT_INVAL_LIST_TYPE * - SML_ERR_XLT_INVAL_TAG_TYPE * - SML_ERR_XLT_ENC_UNK * - SML_ERR_XLT_INVAL_PROTO_ELEM */ Ret_t xltEncAppend(const XltEncoderPtr_t pEncoder, SmlProtoElement_t pe, const MemPtr_t pBufEnd, const VoidPtr_t pContent, MemPtr_t *ppBufPos) { // Return variable Ret_t _err; XltTagID_t tagID = TN_UNDEF; // encoding type SmlEncoding_t _enc; //Structure containing buffer pointers, length and written bytes BufferMgmtPtr_t _pBufMgr; if ((_pBufMgr = (BufferMgmtPtr_t)smlLibMalloc(sizeof(BufferMgmt_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(_pBufMgr, 0, sizeof(BufferMgmt_t)); //get the encoding type _enc = pEncoder->enc; _pBufMgr->vers = pEncoder->vers; // %%% luz:2003-07-31: pass SyncML version to bufmgr _pBufMgr->smlXltBufferP = *ppBufPos; _pBufMgr->smlXltBufferLen = pBufEnd - *ppBufPos; _pBufMgr->smlXltStoreBufP = _pBufMgr->smlXltBufferP; _pBufMgr->smlXltWrittenBytes = 0; _pBufMgr->smlActiveExt = SML_EXT_UNDEFINED; _pBufMgr->switchExtTag = TN_UNDEF; _pBufMgr->spaceEvaluation = ((pEncoder->space_evaluation == NULL) ? 0 : 1); // %%% luz 2002-09-03: evaluation may not mess with encoder state if ( _pBufMgr->spaceEvaluation) { // spaceEval state _pBufMgr->smlCurExt = pEncoder->space_evaluation->cur_ext; _pBufMgr->smlLastExt = pEncoder->space_evaluation->last_ext; } else { // normal encoder state _pBufMgr->smlCurExt = pEncoder->cur_ext; _pBufMgr->smlLastExt = pEncoder->last_ext; } _pBufMgr->endTagSize =0; _err = getTNbyPE(pe, &tagID); _err = xltEncBlock(tagID, REQUIRED, pContent, _enc, _pBufMgr, SML_EXT_UNDEFINED); if (_err != SML_ERR_OK) { smlLibFree(_pBufMgr); return _err; } if (pEncoder->space_evaluation != NULL) { // Only calculating size pEncoder->space_evaluation->written_bytes += _pBufMgr->smlXltWrittenBytes; pEncoder->space_evaluation->end_tag_size += _pBufMgr->endTagSize; // save it only into evaluation state pEncoder->space_evaluation->cur_ext = _pBufMgr->smlCurExt; pEncoder->space_evaluation->last_ext = _pBufMgr->smlLastExt; } else { // really generating data pEncoder->end_tag_size += _pBufMgr->endTagSize; // save it into encoder state pEncoder->cur_ext = _pBufMgr->smlCurExt; pEncoder->last_ext = _pBufMgr->smlLastExt; } *ppBufPos = _pBufMgr->smlXltBufferP; smlLibFree(_pBufMgr); return SML_ERR_OK; } /** * Filnalizes the (WB)XML document and returns the size of written bytes to * the workspace module * * @pre pEncoder holds the initialized encoder structure. * the initialization takes place in the xltEncAppend function * pBufEnd must point to the end of the (WB)XML buffer * ppBufPos has to be initialized to the start point of the * (WB)XML buffer. * @post After the function call ppBufPos points to the * first free byte in the buffer behind the (WB)XML document * @param pEncoder (IN) * the encoder object * @param pBufEnd (IN) * pointer to the end of the buffer to write on * @param ppBufPos (IN/OUT) * current position of the bufferpointer * @return shows error codes of function,\n * 0, if OK\n * Possible Error Codes: * - SML_ERR_XLT_BUF_ERR * - SML_ERR_XLT_MISSING_CONT * - SML_ERR_XLT_INVAL_ELEM_TYPE * - SML_ERR_XLT_INVAL_LIST_TYPE * - SML_ERR_XLT_INVAL_TAG_TYPE * - SML_ERR_XLT_ENC_UNK * - SML_ERR_XLT_INVAL_PROTO_ELEM */ Ret_t xltEncTerminate(const XltEncoderPtr_t pEncoder, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos) { // Return variable Ret_t _err; // encoding type SmlEncoding_t _enc; //Structure containing buffer pointers, length and written bytes BufferMgmtPtr_t _pBufMgr; //get the encoding type _enc = pEncoder->enc; //Initialize buffer variables if ((_pBufMgr = smlLibMalloc(sizeof(BufferMgmt_t))) == NULL) { smlLibFree(pEncoder); return SML_ERR_NOT_ENOUGH_SPACE; } _pBufMgr->vers = pEncoder->vers; // %%% luz:2003-07-31: pass SyncML version to bufmgr _pBufMgr->smlXltWrittenBytes = 0; _pBufMgr->smlXltBufferP = *ppBufPos; _pBufMgr->smlXltStoreBufP = _pBufMgr->smlXltBufferP; _pBufMgr->smlXltBufferLen = pBufEnd - *ppBufPos; _pBufMgr->smlCurExt = pEncoder->cur_ext; _pBufMgr->smlLastExt = pEncoder->last_ext; _pBufMgr->smlActiveExt = pEncoder->cur_ext; _pBufMgr->switchExtTag = TN_UNDEF; _pBufMgr->spaceEvaluation = ((pEncoder->space_evaluation == NULL) ? 0 : 1); _pBufMgr->endTagSize =0; if (pEncoder->final == 1) { // Final Flag if ((_err = xltGenerateTag(TN_FINAL, TT_ALL, _enc, _pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) { smlLibFree(_pBufMgr); xltEncReset(pEncoder); return _err; } } // SyncBody End Tag if ((_err = xltGenerateTag(TN_SYNCBODY, TT_END, _enc, _pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) { smlLibFree(_pBufMgr); xltEncReset(pEncoder); return _err; } // SyncML End Tag if ((_err = xltGenerateTag(TN_SYNCML, TT_END, _enc, _pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) { smlLibFree(_pBufMgr); xltEncReset(pEncoder); return _err; } pEncoder->cur_ext = _pBufMgr->smlCurExt; pEncoder->last_ext = _pBufMgr->smlLastExt; *ppBufPos = _pBufMgr->smlXltBufferP; smlLibFree(_pBufMgr); xltEncReset(pEncoder); return SML_ERR_OK; } Ret_t xltEncReset(XltEncoderPtr_t pEncoder) { if ((pEncoder) && (pEncoder->space_evaluation)) { smlLibFree(pEncoder->space_evaluation); pEncoder->space_evaluation = NULL; } smlLibFree(pEncoder); return SML_ERR_OK; } /** * Starts an evaluation run which prevents further API-Calls to write tags - * just the tag-sizes are calculated. Must be sopped via smlEndEvaluation * * @param pEncoder (IN) * the encoder object * @return Return Code */ SML_API Ret_t xltStartEvaluation(XltEncoderPtr_t pEncoder) { XltSpaceEvaluationPtr_t _pSpaceEvaluation; if (pEncoder->space_evaluation != NULL) return SML_ERR_WRONG_USAGE; if ((_pSpaceEvaluation = (XltSpaceEvaluationPtr_t)smlLibMalloc(sizeof(XltSpaceEvaluation_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(_pSpaceEvaluation, 0, sizeof(XltSpaceEvaluation_t)); // %%% luz 2002-09-03: init encoder state shadow copies for evaluation from real encoder _pSpaceEvaluation->cur_ext = pEncoder->cur_ext; _pSpaceEvaluation->last_ext = pEncoder->last_ext; pEncoder->space_evaluation = _pSpaceEvaluation; return SML_ERR_OK; } /** * Stops an evaluation run which prevents further API-Calls to write tags - * the remaining free buffer size after all Tags are written is returned * * @param id (IN) * instance ID * @param pEncoder (IN) * the encoder object * @param freemem (IN/OUT) * Size of free buffer for data after all tags are written * @return Return Code */ SML_API Ret_t xltEndEvaluation(InstanceID_t id, XltEncoderPtr_t pEncoder, MemSize_t *freemem) { MemSize_t _free; XltSpaceEvaluationPtr_t _evaluation; _evaluation = pEncoder->space_evaluation; if (_evaluation == NULL) return SML_ERR_WRONG_USAGE; _free = smlGetFreeBuffer(id); _free -= _evaluation->written_bytes; _free -= _evaluation->end_tag_size; _free -= pEncoder->end_tag_size; *freemem = _free; smlLibFree(_evaluation); pEncoder->space_evaluation = NULL; return SML_ERR_OK; } /** * Generates a (WB)XML Block for a given tag ID and a given content * * @pre pContent holds a valid content structure * tagId contains a valid SyncML tag ID * @post the (WB)XML buffer in the pBufMgr structure contains the * encoded (WB)XML block * @param tagId (IN) * the ID for the tag to generate (TN_ADD, ...) * @param reqOptFlag (IN) * flag if the block is required or optional * @param pContent (IN) * the content structure of the block * @param enc (IN) * the encoding constant (SML_WBXML or SML_XML) * @param attFlag (IN) * indicates if the encoded tag contain Attributes * in namespace extensions * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t xltEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { //Return variable Ret_t _err; //Check if pContent of a required field is missing if ((reqOptFlag == REQUIRED) && (pContent == NULL)) { switch ((int)tagId) { case TN_ATOMIC_END: case TN_SYNC_END: case TN_SEQUENCE_END: break; default: return SML_ERR_XLT_MISSING_CONT; } } //Check if pContent of a optional field is missing else if ((pContent == NULL) && (tagId != TN_SYNC_END) && (tagId != TN_ATOMIC_END) && (tagId != TN_SEQUENCE_END)) return SML_ERR_OK; //Generate the commands -> see DTD switch ((int)tagId){ case TN_SYNCHDR: // SyncHdr Begin Tag if ((_err = xltGenerateTag(TN_SYNCHDR, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Version if ((_err = xltEncBlock(TN_VERSION, REQUIRED, ((SmlSyncHdrPtr_t) pContent)->version, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Proto if ((_err = xltEncBlock(TN_PROTO, REQUIRED, ((SmlSyncHdrPtr_t) pContent)->proto, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // SessionID if ((_err = xltEncBlock(TN_SESSIONID, REQUIRED, ((SmlSyncHdrPtr_t) pContent)->sessionID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // MsgID if ((_err = xltEncBlock(TN_MSGID, REQUIRED, ((SmlSyncHdrPtr_t) pContent)->msgID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Target if ((_err = xltEncBlock(TN_TARGET, REQUIRED, ((SmlSyncHdrPtr_t) pContent)->target, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Source if ((_err = xltEncBlock(TN_SOURCE, REQUIRED, ((SmlSyncHdrPtr_t) pContent)->source, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // RespURI? if ((_err = xltEncBlock(TN_RESPURI, OPTIONAL, ((SmlSyncHdrPtr_t) pContent)->respURI, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlSyncHdrPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlSyncHdrPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlSyncHdrPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // SyncHdr End Tag if ((_err = xltGenerateTag(TN_SYNCHDR, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_CRED: // Begin tag if ((_err = xltGenerateTag(TN_CRED, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlCredPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Data if ((_err = xltEncBlock(TN_DATA, REQUIRED, ((SmlCredPtr_t) pContent)->data, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_CRED, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_SOURCEPARENT: case TN_TARGETPARENT: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // LocURI if ((_err = xltEncBlock(TN_LOCURI, REQUIRED, ((SmlSourceParentPtr_t) pContent)->locURI, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_SOURCE: case TN_TARGET: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // LocURI if ((_err = xltEncBlock(TN_LOCURI, REQUIRED, ((SmlSourcePtr_t) pContent)->locURI, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // LocName? if ((_err = xltEncBlock(TN_LOCNAME, OPTIONAL, ((SmlSourcePtr_t) pContent)->locName, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Filter? if ((_err = xltEncBlock(TN_FILTER, OPTIONAL, ((SmlSourcePtr_t) pContent)->filter, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_ITEM: // Begin tag if ((_err = xltGenerateTag(TN_ITEM, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Target? if ((_err = xltEncBlock(TN_TARGET, OPTIONAL, ((SmlItemPtr_t) pContent)->target, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Source? if ((_err = xltEncBlock(TN_SOURCE, OPTIONAL, ((SmlItemPtr_t) pContent)->source, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // TargetParent? if ((_err = xltEncBlock(TN_TARGETPARENT, OPTIONAL, ((SmlItemPtr_t) pContent)->targetParent, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // SourceParent? if ((_err = xltEncBlock(TN_SOURCEPARENT, OPTIONAL, ((SmlItemPtr_t) pContent)->sourceParent, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlItemPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Data? if ((_err = xltEncBlock(TN_DATA, OPTIONAL, ((SmlItemPtr_t) pContent)->data, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // MoreData? if ((_err = xltEncBlock(TN_MOREDATA, OPTIONAL, &(((SmlItemPtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_ITEM, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; /* %%% Added Filter tags 2005-08-17 by synthesis/luz for DS 1.2 */ case TN_FIELD: case TN_RECORD: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item if ((_err = xltEncBlock(TN_ITEM, REQUIRED, ((SmlRecordOrFieldFilterPtr_t) pContent)->item, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_FILTER: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta if ((_err = xltEncBlock(TN_META, REQUIRED, ((SmlFilterPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Field? if ((_err = xltEncBlock(TN_FIELD, OPTIONAL, ((SmlFilterPtr_t) pContent)->field, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Record? if ((_err = xltEncBlock(TN_RECORD, OPTIONAL, ((SmlFilterPtr_t) pContent)->record, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // FilterType? if ((_err = xltEncBlock(TN_FILTERTYPE, OPTIONAL, ((SmlFilterPtr_t) pContent)->filtertype, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_REPLACE: case TN_ADD: case TN_COPY: case TN_MOVE: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlGenericCmdPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlGenericCmdPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlGenericCmdPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlGenericCmdPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item+ if ((_err = xltEncList(ITEM_LIST, REQUIRED, ((SmlGenericCmdPtr_t) pContent)->itemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_ALERT: // Begin tag if ((_err = xltGenerateTag(TN_ALERT, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlAlertPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlAlertPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlAlertPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Data? if ((_err = xltEncBlock(TN_DATA, OPTIONAL, ((SmlAlertPtr_t) pContent)->data, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item* if ((_err = xltEncList(ITEM_LIST, OPTIONAL, ((SmlAlertPtr_t) pContent)->itemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_ALERT, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; #if (defined ATOMIC_SEND || defined SEQUENCE_SEND) case TN_ATOMIC: case TN_SEQUENCE: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlAtomicPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlAtomicPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlAtomicPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; //End tag in TN_ATOMIC_END break; case TN_ATOMIC_END: // End tag if ((_err = xltGenerateTag(TN_ATOMIC, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_SEQUENCE_END: // End tag if ((_err = xltGenerateTag(TN_SEQUENCE, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; #endif case TN_DELETE: // Begin tag if ((_err = xltGenerateTag(TN_DELETE, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlDeletePtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlDeletePtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Archive? if ((_err = xltEncBlock(TN_ARCHIVE, OPTIONAL, &(((SmlDeletePtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // SftDel? if ((_err = xltEncBlock(TN_SFTDEL, OPTIONAL, &(((SmlDeletePtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlDeletePtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlDeletePtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item+ if ((_err = xltEncList(ITEM_LIST, REQUIRED, ((SmlDeletePtr_t) pContent)->itemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_DELETE, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; #ifdef EXEC_SEND case TN_EXEC: // Begin tag if ((_err = xltGenerateTag(TN_EXEC, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlExecPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlExecPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlExecPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlExecPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item if ((_err = xltEncBlock(TN_ITEM, REQUIRED, ((SmlExecPtr_t) pContent)->item, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_EXEC, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; #endif case TN_GET: case TN_PUT: // Begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlGetPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlGetPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Lang? if ((_err = xltEncBlock(TN_LANG, OPTIONAL, ((SmlGetPtr_t) pContent)->lang, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlGetPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlGetPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item+ if ((_err = xltEncList(ITEM_LIST, REQUIRED, ((SmlGetPtr_t) pContent)->itemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_MAP: // Begin tag if ((_err = xltGenerateTag(TN_MAP, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlMapPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Target if ((_err = xltEncBlock(TN_TARGET, REQUIRED, ((SmlMapPtr_t) pContent)->target, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Source if ((_err = xltEncBlock(TN_SOURCE, REQUIRED, ((SmlMapPtr_t) pContent)->source, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlMapPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlMapPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Mapitemlist if ((_err = xltEncList(MAPITEM_LIST, REQUIRED, ((SmlMapPtr_t) pContent)->mapItemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_MAP, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_MAPITEM: // Begin tag if ((_err = xltGenerateTag(TN_MAPITEM, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Target if ((_err = xltEncBlock(TN_TARGET, REQUIRED, ((SmlMapItemPtr_t) pContent)->target, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Source if ((_err = xltEncBlock(TN_SOURCE, REQUIRED, ((SmlMapItemPtr_t) pContent)->source, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_MAPITEM, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_RESULTS: // Begin tag if ((_err = xltGenerateTag(TN_RESULTS, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlResultsPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // MsgRef? if ((_err = xltEncBlock(TN_MSGREF, OPTIONAL, ((SmlResultsPtr_t) pContent)->msgRef, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdRef if ((_err = xltEncBlock(TN_CMDREF, REQUIRED, ((SmlResultsPtr_t) pContent)->cmdRef, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlResultsPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // TargetRef? if ((_err = xltEncBlock(TN_TARGETREF, OPTIONAL, ((SmlResultsPtr_t) pContent)->targetRef, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // SourceRef? if ((_err = xltEncBlock(TN_SOURCEREF, OPTIONAL, ((SmlResultsPtr_t) pContent)->sourceRef, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item+ if ((_err = xltEncList(ITEM_LIST, REQUIRED, ((SmlResultsPtr_t) pContent)->itemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_RESULTS, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_CHAL: // Begin tag if ((_err = xltGenerateTag(TN_CHAL, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta if ((_err = xltEncBlock(TN_META, REQUIRED, ((SmlChalPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_CHAL, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; #ifdef SEARCH_SEND case TN_SEARCH: // Begin tag if ((_err = xltGenerateTag(TN_SEARCH, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlSearchPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlSearchPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResults? if ((_err = xltEncBlock(TN_NORESULTS, OPTIONAL, &((SmlSearchPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlSearchPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Target? if ((_err = xltEncBlock(TN_TARGET, OPTIONAL, ((SmlSearchPtr_t) pContent)->target, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Source List if ((_err = xltEncList(SOURCE_LIST, REQUIRED, ((SmlSearchPtr_t) pContent)->sourceList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Lang? if ((_err = xltEncBlock(TN_LANG, OPTIONAL, ((SmlSearchPtr_t) pContent)->lang, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta if ((_err = xltEncBlock(TN_META, REQUIRED, ((SmlSearchPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Dsta if ((_err = xltEncBlock(TN_DATA, REQUIRED, ((SmlSearchPtr_t) pContent)->data, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_SEARCH, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; #endif case TN_STATUS: // Begin tag if ((_err = xltGenerateTag(TN_STATUS, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlStatusPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // MsgRef? if ((_err = xltEncBlock(TN_MSGREF, REQUIRED, ((SmlStatusPtr_t) pContent)->msgRef, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdRef if ((_err = xltEncBlock(TN_CMDREF, REQUIRED, ((SmlStatusPtr_t) pContent)->cmdRef, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cmd if ((_err = xltEncBlock(TN_CMD, REQUIRED, ((SmlStatusPtr_t) pContent)->cmd, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // TargetRefList? if ((_err = xltEncList(TARGETREF_LIST, OPTIONAL, ((SmlStatusPtr_t) pContent)->targetRefList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // SourceRefList? if ((_err = xltEncList(SOURCEREF_LIST, OPTIONAL, ((SmlStatusPtr_t) pContent)->sourceRefList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlStatusPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Chal? if ((_err = xltEncBlock(TN_CHAL, OPTIONAL, ((SmlStatusPtr_t) pContent)->chal, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Data if ((_err = xltEncBlock(TN_DATA, REQUIRED, ((SmlStatusPtr_t) pContent)->data, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Item* if ((_err = xltEncList(ITEM_LIST, OPTIONAL, ((SmlStatusPtr_t) pContent)->itemList, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag if ((_err = xltGenerateTag(TN_STATUS, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_SYNC: // Begin tag if ((_err = xltGenerateTag(TN_SYNC, TT_BEG, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // CmdID if ((_err = xltEncBlock(TN_CMDID, REQUIRED, ((SmlSyncPtr_t) pContent)->cmdID, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NoResp? if ((_err = xltEncBlock(TN_NORESP, OPTIONAL, &((SmlSyncPtr_t) pContent)->flags, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Cred? if ((_err = xltEncBlock(TN_CRED, OPTIONAL, ((SmlSyncPtr_t) pContent)->cred, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Target? if ((_err = xltEncBlock(TN_TARGET, OPTIONAL, ((SmlSyncPtr_t) pContent)->target, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Source? if ((_err = xltEncBlock(TN_SOURCE, OPTIONAL, ((SmlSyncPtr_t) pContent)->source, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // Meta? if ((_err = xltEncBlock(TN_META, OPTIONAL, ((SmlSyncPtr_t) pContent)->meta, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // NumberOfChanges? if ((_err = xltEncBlock(TN_NUMBEROFCHANGES, OPTIONAL, ((SmlSyncPtr_t) pContent)->noc, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; // End tag in TN_SYNC_END break; case TN_SYNC_END: //End tag if ((_err = xltGenerateTag(TN_SYNC, TT_END, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; break; case TN_ARCHIVE: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t*)pContent)) & (SmlArchive_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; } break; case TN_SFTDEL: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlSftDel_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; } break; case TN_MOREDATA: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlMoreData_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; } break; case TN_NORESULTS: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlNoResults_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; } break; case TN_NORESP: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlNoResp_f)){ if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; } break; case TN_FINAL: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlFinal_f)) { if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_UNDEFINED)) != SML_ERR_OK) return _err; } break; default: // all leaf nodes (PCDATA#) return xltEncPcdata(tagId, reqOptFlag, pContent, enc, pBufMgr, attFlag); } return SML_ERR_OK; } Ret_t xltEncPcdata(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { //Return variable Ret_t _err; //generate PCDATA begin tag if ((_err = xltGenerateTag(tagId, TT_BEG, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; //write the pContent to the buffer according the encoding type switch ((int)enc) { #ifdef __SML_WBXML__ case SML_WBXML: { switch (((SmlPcdataPtr_t)pContent)->contentType) { case SML_PCDATA_STRING: if ((_err = wbxmlWriteTypeToBuffer(((SmlPcdataPtr_t)pContent)->content, STR_I, ((SmlPcdataPtr_t)pContent)->length, pBufMgr)) != SML_ERR_OK) return _err; break; // Note: SML_PCDATA_CDATA case added by luz to allow direct translation from XML to WBXML case SML_PCDATA_CDATA: case SML_PCDATA_OPAQUE: if ((_err = wbxmlWriteTypeToBuffer(((SmlPcdataPtr_t)pContent)->content, OPAQUE, ((SmlPcdataPtr_t)pContent)->length, pBufMgr)) != SML_ERR_OK) return _err; break; #ifdef __USE_EXTENSIONS__ case SML_PCDATA_EXTENSION: if ((_err = xltBuildExtention(((SmlPcdataPtr_t)pContent)->extension, reqOptFlag, ((SmlPcdataPtr_t)pContent)->content, enc, pBufMgr)) != SML_ERR_OK) return _err; break; #endif default: // 2003-11-24: Tomy to deal with pcdata empty extensions (for example which is valid) // refer to xltdec.c to see that empty extensions result in SmlPcdataPtr_t with all fields (data) set to 0 if (((SmlPcdataPtr_t)pContent)->contentType != SML_PCDATA_UNDEFINED || ((SmlPcdataPtr_t)pContent)->extension != SML_EXT_UNDEFINED || ((SmlPcdataPtr_t)pContent)->length != 0 || ((SmlPcdataPtr_t)pContent)->content != NULL) return SML_ERR_XLT_INVAL_PCDATA_TYPE; // return SML_ERR_XLT_INVAL_PCDATA_TYPE; // end modified by Tomy }; // eof switch(contenttype) break; } // case WBXML #endif // eof WBXML #ifdef __SML_XML__ case SML_XML: { MemPtr_t _tmpStr; MemPtr_t p; MemSize_t len,n; char c; switch (((SmlPcdataPtr_t)pContent)->contentType) { // Note: SML_PCDATA_OPAQUE case added by luz to allow direct translation from WBXML to XML #ifdef PCDATA_OPAQUE_AS_CDATA case SML_PCDATA_OPAQUE: #endif case SML_PCDATA_CDATA: stringAsCData: { // %%% luz 2006-09-07 : made completely CDATA nesting safe // add CDATA _tmpStr = (MemPtr_t) " sequences p=((SmlPcdataPtr_t)pContent)->content; len=((SmlPcdataPtr_t)pContent)->length; n=0; while (n') { // we must substitute "]]>" with "]]>]" // - copy what we have so far (includes ]]>) n+=3; if ((_err = xltAddToBuffer(p, n, pBufMgr)) != SML_ERR_OK) return _err; // - add extra code needed _tmpStr = (MemPtr_t) "]"; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), pBufMgr)) != SML_ERR_OK) return _err; // - restart where we are now p+=n; // first char after ]]> len-=n; // remaining length n=0; // processed chars } else { n++; // just go to next char } } // add remaining data if ((_err = xltAddToBuffer(p, len, pBufMgr)) != SML_ERR_OK) return _err; // add end of CDATA marker _tmpStr = (MemPtr_t) "]]>"; if ((_err = xltAddToBuffer(_tmpStr, smlLibStrlen((String_t)_tmpStr), pBufMgr)) != SML_ERR_OK) return _err; break; } // Note: SyncFest #5 shows that content; len=((SmlPcdataPtr_t)pContent)->length; while (len-->0) { c=*p++; if (c=='&' || c=='<' || c=='>') goto stringAsCData; // encode as CDATA } // ok, string is clean and does not need CDATA if ((_err = xltAddToBuffer(((SmlPcdataPtr_t)pContent)->content, ((SmlPcdataPtr_t)pContent)->length, pBufMgr)) != SML_ERR_OK) return _err; break; } #ifdef __USE_EXTENSIONS__ case SML_PCDATA_EXTENSION: { if ((_err = xltBuildExtention(((SmlPcdataPtr_t)pContent)->extension, reqOptFlag, ((SmlPcdataPtr_t)pContent)->content, enc, pBufMgr)) != SML_ERR_OK) return _err; break; } #endif default: { // 2003-11-24: Tomy to deal with pcdata empty extensions (for example which is valid) // refer to xltdec.c to see that empty extensions result in SmlPcdataPtr_t with all fields (data) set to 0 if (((SmlPcdataPtr_t)pContent)->contentType != SML_PCDATA_UNDEFINED || ((SmlPcdataPtr_t)pContent)->extension != SML_EXT_UNDEFINED || ((SmlPcdataPtr_t)pContent)->length != 0 || ((SmlPcdataPtr_t)pContent)->content != NULL) return SML_ERR_XLT_INVAL_PCDATA_TYPE; // return SML_ERR_XLT_INVAL_PCDATA_TYPE; // end modified by Tomy } } // switch tags break; } // case XML #endif // eof XML default: return SML_ERR_XLT_ENC_UNK; } // eof switch(enc) //generate PCDATA END tag if ((_err = xltGenerateTag(tagId, TT_END, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; return SML_ERR_OK; } /** * Generates a list element which is not directly related to a tag * * @pre pList holds a valid list structure * listId contains a valid SyncML list ID * @post the (WB)XML buffer in the pBufMgr structure contains the * encoded (WB)XML list * @param listId (IN) * the ID of the list to generate (e.g. TARGET_LIST, ...) * @param reqOptFlag (IN) * flag if the block is required or optional * @param pList (IN) * reference to the list to process * @param enc (IN) * the encoding constant (SML_WBXML or SML_XML) * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @param attFlag (IN) * indicates if the encoded tag contain Attributes * in namespace extensions * @return shows error codes of function,\n * 0, if OK */ Ret_t xltEncList(XltListType_t listId, XltRO_t reqOptFlag, VoidPtr_t pList, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { //Return variable Ret_t _err; //check if list is required or not if ((reqOptFlag == REQUIRED) && (pList == NULL)) return SML_ERR_XLT_MISSING_CONT; else if (pList == NULL) return SML_ERR_OK; //encode the different list types switch ((int)listId) { case ITEM_LIST: { do { if ((_err = xltEncBlock(TN_ITEM, OPTIONAL, ((SmlItemListPtr_t)pList)->item, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; pList = ((SmlItemListPtr_t)pList)->next; } while ((SmlItemListPtr_t)pList != NULL); break; } case SOURCE_LIST: { do { if ((_err = xltEncBlock(TN_SOURCE, OPTIONAL, ((SmlSourceListPtr_t)pList)->source, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; pList = ((SmlSourceListPtr_t)pList)->next; } while ((SmlSourceListPtr_t)pList != NULL); break; } case TARGETREF_LIST: { do { if ((_err = xltEncBlock(TN_TARGETREF, OPTIONAL, ((SmlTargetRefListPtr_t)pList)->targetRef, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; pList = ((SmlTargetRefListPtr_t)pList)->next; } while ((SmlTargetRefListPtr_t)pList != NULL); break; } case SOURCEREF_LIST: { do { if ((_err = xltEncBlock(TN_SOURCEREF, OPTIONAL, ((SmlSourceRefListPtr_t)pList)->sourceRef, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; pList = ((SmlSourceRefListPtr_t)pList)->next; } while ((SmlSourceRefListPtr_t)pList != NULL); break; } case MAPITEM_LIST: { do { if ((_err = xltEncBlock(TN_MAPITEM, OPTIONAL, ((SmlMapItemListPtr_t)pList)->mapItem, enc, pBufMgr, attFlag)) != SML_ERR_OK) return _err; pList = ((SmlMapItemListPtr_t)pList)->next; } while ((SmlMapItemListPtr_t)pList != NULL); break; } default: return SML_ERR_XLT_INVAL_LIST_TYPE; } return SML_ERR_OK; } /** * Generates a (WB)XML tag * * @pre valid parameters * @post the buffer contains a new tag * @param tagId (IN) * the tag ID * @param TagType (IN) * the tag type (begin tag, end tag, ...) * @param enc (IN) * the encoding constant (SML_WBXML or SML_XML) * @param attFlag (IN) * indicates if the encoded tag contain Attributes * in namespace extensions * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t xltGenerateTag(XltTagID_t tagId, XltTagType_t TagType, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { Ret_t _err; #ifdef __SML_WBXML__ MemByte_t _switchpage = XLT_SWITCHPAGE; #endif switch ((int)enc) { #ifdef __SML_WBXML__ case SML_WBXML: /* in WBXML codepage switches are done for starting tags only */ if (TagType != TT_END) { //codepage switching with wbxml instead of namespace if (getCodePage(attFlag) != getCodePage(pBufMgr->smlCurExt)) { MemByte_t _newcp = getCodePage(attFlag); if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_switchpage), TAG, 1, pBufMgr)) != SML_ERR_OK) return _err; if ((_err = wbxmlWriteTypeToBuffer((MemPtr_t)(&_newcp), TAG, 1, pBufMgr)) != SML_ERR_OK) return _err; } if (attFlag != pBufMgr->smlCurExt) { pBufMgr->switchExtTag = tagId; pBufMgr->smlLastExt = pBufMgr->smlCurExt; pBufMgr->smlCurExt = attFlag; } } // for TagType return wbxmlGenerateTag(tagId, TagType, pBufMgr); #endif #ifdef __SML_XML__ case SML_XML: if (attFlag != pBufMgr->smlCurExt) { pBufMgr->switchExtTag = tagId; pBufMgr->smlLastExt = pBufMgr->smlCurExt; pBufMgr->smlCurExt = attFlag; } return xmlGenerateTag(tagId, TagType, pBufMgr, attFlag); #endif default: return SML_ERR_XLT_ENC_UNK; } //return SML_ERR_XLT_ENC_UNK;NOT NEEDED } #ifdef __USE_EXTENSIONS__ /* Entrypoint for SubDTD's. If we reached this point we already know * a) we have data fora sub-DTD to encode and * b) we know which sub-DTD should be encoded. * So just call the appropriate sub-DTD encoder and thats it. */ Ret_t xltBuildExtention(SmlPcdataExtension_t extId, XltRO_t reqOptFlag, VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr) { switch (extId) { #ifdef __USE_METINF__ case SML_EXT_METINF: /* a metaInf DTD always starts with this token */ return metinfEncBlock(TN_METINF_METINF,reqOptFlag,pContent,enc,pBufMgr,SML_EXT_METINF); break; #endif #ifdef __USE_DEVINF__ case SML_EXT_DEVINF: /* a deviceInf DTD always starts with this token */ /* we have to choose, wether we have to encode the DevInf as XML or WBXML */ /* in the latter case, we need a special treatment of this sub-dtd, as we have */ /* to put it into a SML_PCDATA_OPAQUE field ... */ if (enc == SML_XML) return devinfEncBlock(TN_DEVINF_DEVINF,reqOptFlag,pContent,enc,pBufMgr,SML_EXT_DEVINF); else return subdtdEncWBXML(TN_DEVINF_DEVINF,reqOptFlag,pContent,SML_WBXML,pBufMgr,SML_EXT_DEVINF); break; #endif /* oops - we don not know about that extension -> bail out */ default: return SML_ERR_XLT_INVAL_EXT; } //return SML_ERR_OK;CAN NOT BE REACHED } /* Sub DTD's need a special treatment when used together with WBXML. * We need to eoncode them as a complete WBXML message including headers and stuff * and store the result within an SML_PCDATA_OPAQUE datafield. * To archieve this we create a new encoder, encode the message and finally * copy the result into the allready existing encoder. */ #ifdef __SML_WBXML__ Ret_t subdtdEncWBXML(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { #ifdef __USE_DEVINF__ Ret_t _err = SML_ERR_OK; #endif /* Double the size of SubBufSize for the memory is small for some complex * content. */ MemSize_t SubBufSize = 12000 * 2; // for starters we use 12kB for each sub DTD to encode in WBXML BufferMgmtPtr_t pSubBufMgr = NULL; /* Even the doubled size was still too small. Instead of hard-coding the size, make it as large as the buffer we are copying into. The size of that one can be configured by the user of the toolkit. -- Patrick Ohly */ MemSize_t VarSubBufSize = pBufMgr->smlXltBufferLen - pBufMgr->smlXltWrittenBytes; if (VarSubBufSize > SubBufSize) { SubBufSize = VarSubBufSize; } // first create a sub buffer pSubBufMgr = (BufferMgmtPtr_t)smlLibMalloc(sizeof(BufferMgmt_t)); if (pSubBufMgr == NULL) { if (enc && pContent && reqOptFlag && tagId) { } return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pSubBufMgr, 0,sizeof(BufferMgmt_t)); pSubBufMgr->smlXltBufferLen = SubBufSize; pSubBufMgr->smlXltBufferP = (MemPtr_t)smlLibMalloc(SubBufSize); if (pSubBufMgr->smlXltBufferP == NULL) { smlLibFree(pSubBufMgr); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibMemset(pSubBufMgr->smlXltBufferP, 0, SubBufSize); pSubBufMgr->smlXltStoreBufP = pSubBufMgr->smlXltBufferP; pSubBufMgr->smlXltWrittenBytes = 0; pSubBufMgr->smlActiveExt = pBufMgr->smlActiveExt; pSubBufMgr->smlCurExt = pBufMgr->smlCurExt; pSubBufMgr->smlLastExt = pBufMgr->smlLastExt; pSubBufMgr->spaceEvaluation = pBufMgr->spaceEvaluation; pSubBufMgr->vers = pBufMgr->vers; // check if we want to use numeric or textual FPI if (SyncMLDevInfWBXMLPublicID[pBufMgr->vers]==0) { // textual FPI // - get the FPI string const char *FPIstring = SyncMLDevInfFPI[pBufMgr->vers]; Short_t FPIsize = smlLibStrlen(FPIstring); if (pSubBufMgr->spaceEvaluation == 0) { // - create the WBXML header pSubBufMgr->smlXltBufferP[0] = 0x02; // WBXML Version 1.2 pSubBufMgr->smlXltBufferP[1] = 0x00; // use Stringtable for ID pSubBufMgr->smlXltBufferP[2] = 0x00; // empty/unknown public ID pSubBufMgr->smlXltBufferP[3] = 0x6A; // charset encoding UTF-8 pSubBufMgr->smlXltBufferP[4] = FPIsize; // %%% not fixed=0x1D!! lenght of stringtable = length of FPIsize pSubBufMgr->smlXltBufferP += 5; // - Generate textual FPI smlLibMemmove(pSubBufMgr->smlXltBufferP, FPIstring, FPIsize); pSubBufMgr->smlXltBufferP += FPIsize; } // in case of space evaluation, just count the number of written bytes pSubBufMgr->smlXltWrittenBytes = 5 + FPIsize; } else { // numeric FPI, no string table if (pSubBufMgr->spaceEvaluation == 0) { // - create the WBXML header unsigned short fpi=SyncMLDevInfWBXMLPublicID[pBufMgr->vers]; pSubBufMgr->smlXltBufferP[0] = 0x02; // WBXML Version 1.2 pSubBufMgr->smlXltBufferP[1] = ((fpi>>7) & 0x7F)+0x80; // upper 7 bit pSubBufMgr->smlXltBufferP[2] = (fpi & 0x7F); // lower 7 bits pSubBufMgr->smlXltBufferP[3] = 0x6A; // charset encoding UTF-8 pSubBufMgr->smlXltBufferP[4] = 0; // no string table pSubBufMgr->smlXltBufferP += 5; } // in case of space evaluation, just count the number of written bytes pSubBufMgr->smlXltWrittenBytes = 5; } // do the encoding switch (attFlag) { #ifdef __USE_DEVINF__ case SML_EXT_DEVINF: if ((_err = devinfEncBlock(TN_DEVINF_DEVINF,reqOptFlag,pContent,enc,pSubBufMgr,SML_EXT_DEVINF)) != SML_ERR_OK) { smlLibFree(pSubBufMgr->smlXltStoreBufP); smlLibFree(pSubBufMgr); return _err; } break; #endif /* oops - we don not know about that extension -> bail out */ default: smlLibFree(pSubBufMgr->smlXltStoreBufP); smlLibFree(pSubBufMgr); return SML_ERR_XLT_INVAL_EXT; } #ifdef __USE_DEVINF__ // move it to the 'real' encoder buffer // now set up the OPAQUE field if (pBufMgr->spaceEvaluation == 0) { pBufMgr->smlXltBufferP[0] = 0xC3; // OPAQUE data identifier pBufMgr->smlXltBufferP += 1; wbxmlOpaqueSize2Buf(pSubBufMgr->smlXltWrittenBytes, pBufMgr); smlLibMemmove(pBufMgr->smlXltBufferP, pSubBufMgr->smlXltStoreBufP, pSubBufMgr->smlXltWrittenBytes); pBufMgr->smlXltBufferP += pSubBufMgr->smlXltWrittenBytes; pBufMgr->smlXltWrittenBytes += pSubBufMgr->smlXltWrittenBytes; } else { pBufMgr->smlXltWrittenBytes++; wbxmlOpaqueSize2Buf(pSubBufMgr->smlXltWrittenBytes, pBufMgr); pBufMgr->smlXltWrittenBytes += pSubBufMgr->smlXltWrittenBytes; } // clean up the temporary stuff smlLibFree(pSubBufMgr->smlXltStoreBufP); smlLibFree(pSubBufMgr); return _err; #endif } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltenccom.c0000755000373300037200000001000212424517753030415 0ustar00nightlyallusers00000000000000/** * @file * Encoder utils file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "xltenccom.h" #include #include /** * Add a string to the global buffer * * @pre pContent contains some content bytes to write to the (WB) XML buffer * @post content is written to the buffer * @param pContent (IN) * the character pointer referencing the content to write to the buffer * @param size (IN) * the content length * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t xltAddToBuffer(const MemPtr_t pContent, MemSize_t size, BufferMgmtPtr_t pBufMgr) { // if we are doing a space evaluation, do not write the data physically - just remember its length if (!pBufMgr->spaceEvaluation) { //check if buffersize is to small to write the content if ((size + pBufMgr->smlXltWrittenBytes) > pBufMgr->smlXltBufferLen) { #ifdef NCDEBUGPRINTFX #warning "%%%%% delete that message later" NCDEBUGPRINTFX(DBG_RTK_SML,( "xltAddToBuffer: buffer too small, pContent='%0.30s', size=%ld, pBufMgr->smlXltWrittenBytes=%ld, pBufMgr->smlXltBufferLen=%ld", pContent, size, pBufMgr->smlXltWrittenBytes, pBufMgr->smlXltBufferLen )); #endif return SML_ERR_XLT_BUF_ERR; } if (!(smlLibMemcpy((void*) pBufMgr->smlXltBufferP, (void*) pContent, (MemSize_t) size))) { #ifdef NCDEBUGPRINTFX #warning "%%%%% delete that message later" NCDEBUGPRINTFX(DBG_RTK_SML,( "xltAddToBuffer: memCpy failed, pBufMgr->smlXltBufferP=%lX, size=%ld", (long)pBufMgr->smlXltBufferP, size )); #endif return SML_ERR_XLT_BUF_ERR; } pBufMgr->smlXltBufferP += size; } pBufMgr->smlXltWrittenBytes += size; return SML_ERR_OK; } syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltenccom.h0000755000373300037200000000724612424517753030442 0ustar00nightlyallusers00000000000000/** * @file * Encoder utils header file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_ENC_COM_H #define _XLT_ENC_COM_H #include #include #include #include "xlttags.h" #ifdef __cplusplus extern "C" { #endif /** flags if a (WB)XML block is required or optional */ typedef enum { OPTIONAL = 0, REQUIRED } XltRO_t; /** Tag Types (TT) - begin tags, end tags, ... */ typedef enum { TT_END = 0, TT_BEG, TT_ALL } XltTagType_t; /** Structure elements which are not directly relied to a tag */ typedef enum { ITEM_LIST, TARGET_LIST, SOURCE_LIST, META_LIST, MAPITEM_LIST, TARGETREF_LIST, SOURCEREF_LIST } XltListType_t; /** Type for storing free mem size evaluation information */ typedef struct XltSpaceEvaluation_s { MemSize_t written_bytes; MemSize_t end_tag_size; // %%% luz 2002-09-03: evaluation needs private shadow copies of these: SmlPcdataExtension_t cur_ext; SmlPcdataExtension_t last_ext; } XltSpaceEvaluation_t, *XltSpaceEvaluationPtr_t; typedef struct bufferMgmt_s { MemPtr_t smlXltBufferP; MemPtr_t smlXltStoreBufP; MemSize_t smlXltWrittenBytes; MemSize_t smlXltBufferLen; XltTagID_t switchExtTag; SmlPcdataExtension_t smlCurExt; SmlPcdataExtension_t smlLastExt; SmlPcdataExtension_t smlActiveExt; MemSize_t endTagSize; Boolean_t spaceEvaluation; // %%% luz:2003-04-24: added syncmlvers // %%% luz:2003-07-31: made it an enum, now called vers SmlVersion_t vers; } BufferMgmt_t, *BufferMgmtPtr_t; Ret_t xltAddToBuffer(const MemPtr_t pContent, MemSize_t size, BufferMgmtPtr_t pBufMgr); #ifdef __cplusplus } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltencwbxml.c0000755000373300037200000002213112424517753030776 0ustar00nightlyallusers00000000000000/** * @file * The WBXML Encoder source file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" #ifdef __SML_WBXML__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xltencwbxml.h" #include #include #include "xlttags.h" /** * Converts a element type into its wbxml token * * @pre valid element type * @post return of wbxml token * @param elType (IN) * element type * @return wbxml token\n * 0, if no matching wbxml token */ MemByte_t wbxmlGetGlobToken(XltElementType_t elType) { typedef struct GlobTok_s { XltElementType_t id; MemByte_t wbxml; } GlobTok_t; // encoding of global tokens; related to the type XML_ElementType_t GlobTok_t globtoken[] = { { END, 0x01 }, //Tag End { STR_I, 0x03 }, //Inline string { OPAQUE, 0xC3 }, //Opaque Data { UNDEF, 0x00 } }; int i = -1; while (globtoken[++i].id != UNDEF) if (globtoken[i].id == elType) return globtoken[i].wbxml; return 0; } /** * Converts a Long_t opaque size to a wbxml mb_u_int32 and adds it to the buffer * * @pre size of the content to be written as opaque datatype * @post the size is converted to the mb_u_int32 representation and added * to the buffer * @param size (IN) * length of the opaque data * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t wbxmlOpaqueSize2Buf(Long_t size, BufferMgmtPtr_t pBufMgr) { Long_t _thresholdcount = 1; Long_t _bytesNeeded = 0; MemPtr_t _byteArray; MemPtr_t _tmpByteArray; int i, j; Ret_t _err; //j max = number of bytes of size for (j=1; j<=sizeof(size); j++) { //if the size of the content is smaller than the power of 128,j -> //one more byte is needed in the mb_u_int32 representation of WBXML _thresholdcount = _thresholdcount * 128; if(size < _thresholdcount) { _bytesNeeded = j; break; } } if (pBufMgr->spaceEvaluation == 0) { //allocate number of bytes needed by the mb_u_int32 data type if ((_byteArray = smlLibMalloc(_bytesNeeded)) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; _tmpByteArray = _byteArray; //process al bytes in the mb_u_int32 data type for (i=1; i<=_bytesNeeded; i++) { // the lowest byte needs a 0 in its highest bit -> no | 0x80 if ((_bytesNeeded - i) == 0) { *_tmpByteArray = ((unsigned char)(size & 0x7F)); } // all the other byte needs a 1 in its highest bit -> | 0x80 else { // only the seven lower bits contain the size value -> >> 7 *_tmpByteArray = ((unsigned char)(((size >> (7 * (_bytesNeeded - i))) & 0x7F) | 0x80)); _tmpByteArray++; } } _err = xltAddToBuffer(_byteArray, _bytesNeeded, pBufMgr); smlLibFree(_byteArray); } else { pBufMgr->smlXltWrittenBytes += _bytesNeeded; // %%% luz 2002-09-03: return value was missing here. _err=SML_ERR_OK; } return _err; } /** * Generates a tag for a given tag ID and a given tag type * * @pre valid parameters * @post a new wbxml tag is written to the buffer * @param tagId (IN) * the ID for the tag to generate (TN_ADD, ...) * @param tagType (IN) * the tag type (e.g. Begin Tag -> TT_BEG, ...) * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t wbxmlGenerateTag(XltTagID_t tagId, XltTagType_t tagType, BufferMgmtPtr_t pBufMgr ) { Ret_t _err = SML_ERR_OK; MemByte_t _tmp = 0x00; //check if content byte has to be added to the tag switch (tagType) { //set the end tag case TT_END: { _tmp = (MemByte_t)wbxmlGetGlobToken(END); if (!_tmp) return SML_ERR_XLT_INVAL_TAG_TYPE; _err = xltAddToBuffer((&_tmp), 1, pBufMgr); // remember the number of byte that must follow for the according end-tag if (_err == SML_ERR_OK) pBufMgr->endTagSize -= 1; return _err; } //Begin and End Tag in one case TT_ALL: { _err = (MemByte_t)getTagByte(tagId, pBufMgr->smlCurExt, &_tmp); if ((!_tmp) || (_err != SML_ERR_OK)) return _err; return xltAddToBuffer((MemPtr_t)(&_tmp), 1, pBufMgr); } //Only Begin Tag -> content follows -> content byte has to be added case TT_BEG: { _err = (MemByte_t)getTagByte(tagId, pBufMgr->smlCurExt, &_tmp); if ((!_tmp) || (_err != SML_ERR_OK)) return _err; _tmp = ((MemByte_t)(_tmp | XLT_CONTBYTE)); _err = xltAddToBuffer(&_tmp, 1, pBufMgr); // remember the number of byte that must follow for the according end-tag if (_err == SML_ERR_OK) pBufMgr->endTagSize += 1; return _err; } default: return SML_ERR_XLT_INVAL_TAG_TYPE; } // return SML_ERR_OK;Unreachable } /** * Write a content of a certain WBXML element type (e.g.\ STR_I) * to the global buffer * * @pre valid parameters * @post the content is written to the wbxml buffer with the leading * bytes for the opaque data type or the STR_I data type * @param pContent (IN) * the character pointer referencing the content to * write to the buffer * @param elType (IN) * the element type to write to the buffer (e.g. STR_I) * @param size (IN) * the content length * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t wbxmlWriteTypeToBuffer(const MemPtr_t pContent, XltElementType_t elType, Long_t size, BufferMgmtPtr_t pBufMgr) { Ret_t _err; MemByte_t _termstr = XLT_TERMSTR; MemByte_t _tmp; switch((int)elType) { case TAG: { return (xltAddToBuffer(pContent, size, pBufMgr)); } case STR_I: { _tmp = (MemByte_t)wbxmlGetGlobToken(STR_I); if (!_tmp) return SML_ERR_XLT_WBXML_UKN_TOK; //add the STR_I identifier if ((_err = xltAddToBuffer(&_tmp, 1, pBufMgr)) != SML_ERR_OK) return _err; //add the string to the buffer if ((_err = xltAddToBuffer(pContent, (!pContent) ? 0 : smlLibStrlen((String_t)pContent), pBufMgr)) != SML_ERR_OK) return _err; //add the string terminator '\0' if ((_err = xltAddToBuffer(&_termstr, 1, pBufMgr)) != SML_ERR_OK) return _err; return SML_ERR_OK; } case OPAQUE: { _tmp = (MemByte_t)wbxmlGetGlobToken(OPAQUE); if (!_tmp) return SML_ERR_XLT_WBXML_UKN_TOK; //add the OPAQUE identifier if ((_err = xltAddToBuffer(&_tmp, 1, pBufMgr)) != SML_ERR_OK) return _err; //add the pContent length if ((_err = wbxmlOpaqueSize2Buf(size, pBufMgr)) != SML_ERR_OK) return _err; //add the string buffer if ((_err = xltAddToBuffer(pContent, size, pBufMgr)) != SML_ERR_OK) return _err; return SML_ERR_OK; } default: return SML_ERR_XLT_INVAL_PCDATA_TYPE; } // return SML_ERR_OK;unreachable } #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltencwbxml.h0000755000373300037200000000723212424517753031010 0ustar00nightlyallusers00000000000000/** * @file * The WBXML Encoder header file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_ENC_WBXML_H #define _XLT_ENC_WBXML_H #include #include #include #include "xlttags.h" #include "xltenccom.h" #define test 1 /** byte for WBXML String Table Length - not yet implemented yet -> 0x00 */ #define XLT_STABLEN 0x00 /** byte for WBXML charset - not yet implemented - default UTF-8 */ #define XLT_CHARSET 0x6A /** byte for WBXML Version Number */ #define XLT_WBXMLVER 0x02 /** byte to add to a tag if a content follows */ #define XLT_CONTBYTE 0x40 /** byte to add to a tag if an attribute follows */ #define XLT_ATTRBYTE 0x80 /** termination character for certain WBXML element types (e.g.\ STR_I) */ #define XLT_TERMSTR 0x00 /** public identifier 0x00,0x00 -> unknown, use stringtable */ #define XLT_PUBIDENT1 0x00 #define XLT_PUBIDENT2 0x00 // %%% luz: 2003-07-31: now in xltenc.c's SyncMLFPI table //#define XLT_DTD_ID "-//SYNCML//DTD SyncML 1.0//EN" /** switch page tag 0x00 */ #define XLT_SWITCHPAGE 0x00 /** default codepage */ #define XLT_DEFAULTCODEPAGE 0x00 #ifdef __cplusplus extern "C" { #endif /** global tokens in WBXML */ typedef enum { UNDEF = 0, END, STR_I, OPAQUE, TAG } XltElementType_t; Ret_t wbxmlGenerateTag(XltTagID_t tagId, XltTagType_t tagType, BufferMgmtPtr_t pBufMgr); Ret_t wbxmlWriteTypeToBuffer(const MemPtr_t pContent, XltElementType_t elType, Long_t size, BufferMgmtPtr_t pBufMgr); Ret_t wbxmlOpaqueSize2Buf(Long_t size, BufferMgmtPtr_t pBufMgr); MemByte_t wbxmlGetGlobToken(XltElementType_t elType); #ifdef __cplusplus } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltencxml.c0000755000373300037200000001515612424517753030456 0ustar00nightlyallusers00000000000000/** * @file * The XML Encoder source file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" #ifdef __SML_XML__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xltencxml.h" #include #include "xlttags.h" #include /** * Generates a XML tag * * @pre valid parameters * @post the XML tag is written to the XML buffer * @param tagId (IN) * the ID for the tag to generate (TN_ADD, ...) * @param tagType (IN) * the tag type (e.g. Begin Tag -> TT_BEG, ...) * @param attFlag (IN) * indicates if the encoded tag contain Attributes in namespace * extensions * @param pBufMgr (IN/OUT) * pointer to a structure containing buffer management elements * @return shows error codes of function,\n * 0, if OK */ Ret_t xmlGenerateTag(XltTagID_t tagId, XltTagType_t tagType, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { Ret_t _err; MemByte_t _begpar = XML_BEGPAR; MemByte_t _tagdel = XML_TAGDEL; MemByte_t _endpar = XML_ENDPAR; MemByte_t _nstagstart[] = XML_NSSTART; MemByte_t _nstagend[] = XML_NSEND; String_t _tagstr; String_t _tagnsattr = NULL; if ((_tagstr = (String_t)smlLibMalloc(XML_MAX_TAGLEN)) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; if ((_err = getTagString(tagId, _tagstr, attFlag)) != SML_ERR_OK) { smlLibFree(_tagstr); return _err; } if (!_tagstr) { // check again as _tagstr might be alterd in getTagString smlLibFree(_tagstr); return SML_ERR_XLT_INVAL_TAG_TYPE; } /* the tag _must_ have an xmlns attribute */ if (attFlag != pBufMgr->smlActiveExt || tagId == TN_SYNCML) { // %%% luz:2003-07-31: now uses namespace from table according to version if (getExtName(attFlag, &_tagnsattr, pBufMgr->vers) != SML_ERR_OK) { smlLibFree(_tagstr); return SML_ERR_XLT_INVAL_TAG_TYPE; } } pBufMgr->smlActiveExt = attFlag; //check if content byte has to be added to the tag switch (tagType) { // set the end tag case TT_END: { if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)(&_tagdel), 1, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)_tagstr, smlLibStrlen(_tagstr), pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, pBufMgr)) != SML_ERR_OK) break; if (tagId == pBufMgr->switchExtTag) { pBufMgr->smlActiveExt = pBufMgr->smlLastExt; pBufMgr->smlCurExt = pBufMgr->smlLastExt; pBufMgr->smlLastExt = attFlag; } // just forget the stored number ob bytes for this end-tag since written now pBufMgr->endTagSize -= (3 + smlLibStrlen(_tagstr)); break; } //Empty tag case TT_ALL: { if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)_tagstr, smlLibStrlen(_tagstr), pBufMgr)) != SML_ERR_OK) break; if (_tagnsattr) { if ((_err = xltAddToBuffer((MemPtr_t)(&_nstagstart), 8, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)_tagnsattr, smlLibStrlen(_tagnsattr), pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)&_nstagend, 1, pBufMgr)) != SML_ERR_OK) break; } if ((_err = xltAddToBuffer((MemPtr_t)(&_tagdel), 1, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, pBufMgr)) != SML_ERR_OK) break; break; } //Only Begin Tag -> content follows -> content byte has to be added case TT_BEG: { if ((_err = xltAddToBuffer((MemPtr_t)(&_begpar), 1, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)_tagstr, smlLibStrlen(_tagstr), pBufMgr)) != SML_ERR_OK) break; if (_tagnsattr) { if ((_err = xltAddToBuffer((MemPtr_t)&_nstagstart, 8, pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)_tagnsattr, smlLibStrlen(_tagnsattr), pBufMgr)) != SML_ERR_OK) break; if ((_err = xltAddToBuffer((MemPtr_t)&_nstagend, 1, pBufMgr)) != SML_ERR_OK) break; } if ((_err = xltAddToBuffer((MemPtr_t)(&_endpar), 1, pBufMgr)) != SML_ERR_OK) break; // remember the number of byte that must follow for the according end-tag pBufMgr->endTagSize += (3 + smlLibStrlen(_tagstr)); break; } default: { smlLibFree(_tagstr); smlLibFree(_tagnsattr); return SML_ERR_XLT_INVAL_TAG_TYPE; } } smlLibFree(_tagstr); smlLibFree(_tagnsattr); return _err; } #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltencxml.h0000755000373300037200000000550512424517753030460 0ustar00nightlyallusers00000000000000/** * @file * The XML Encoder header file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifdef __SML_XML__ #ifndef _XLT_ENC_XML_H #define _XLT_ENC_XML_H #include #include "xlttags.h" #include "xltenccom.h" /** byte for XML tag begin parentheses */ #define XML_BEGPAR '<' /** byte for XML tag end parentheses */ #define XML_ENDPAR '>' /** byte for XML tag del */ #define XML_TAGDEL '/' /** XML version */ #define XML_VERSION "1.0" /** XML encoding */ #define XML_ENCODING "UTF-8" /** XML namespaceattribute */ #define XML_NSSTART " xmlns='" #define XML_NSEND "'" #ifdef __cplusplus extern "C" { #endif Ret_t xmlGenerateTag(XltTagID_t tagId, XltTagType_t tagType, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag); #ifdef __cplusplus } #endif #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltmetinf.c0000755000373300037200000003762112424517753030453 0ustar00nightlyallusers00000000000000/** * @file * MetaInf DTD related functions for the en-/decoder * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "define.h" #ifdef __USE_METINF__ #include "smlmetinfdtd.h" #include "xlttags.h" #include "xltmetinf.h" #include "xlttagtbl.h" #include "xltenc.h" #include "xltencwbxml.h" #include "define.h" #include "libstr.h" #include "smlerr.h" #include "smldtd.h" #include "libmem.h" #include "libutil.h" /* extern */ extern SML_API void smlFreeMetinfAnchor(SmlMetInfAnchorPtr_t data) XLT_FUNC; extern SML_API void smlFreeMetinfMem(SmlMetInfMemPtr_t data) XLT_FUNC; extern SML_API void smlFreeMetinfMetinf(SmlMetInfMetInfPtr_t data) XLT_FUNC; /* decoder callbacks */ Ret_t buildMetInfAnchorCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlMetInfAnchorPtr_t pAnchor; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMetInfAnchorCmd"); if ((pAnchor = (SmlMetInfAnchorPtr_t)smlLibMalloc(sizeof(SmlMetInfAnchor_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pAnchor, 0, sizeof(SmlMetInfAnchor_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pAnchor; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfAnchor(pAnchor); //smlLibFree(pAnchor); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* PCDATA elements */ case TN_METINF_LAST: rc = buildPCData(pDecoder, (VoidPtr_t)&pAnchor->last); break; case TN_METINF_NEXT: rc = buildPCData(pDecoder, (VoidPtr_t)&pAnchor->next); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC,pScanner,"buildMetInfAnchorCmd_2"); } if (rc != SML_ERR_OK) { smlFreeMetinfAnchor(pAnchor); //smlLibFree(pAnchor); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfAnchor(pAnchor); //smlLibFree(pAnchor); return rc; } } *ppElem = pAnchor; return SML_ERR_OK; } Ret_t buildMetinfNextCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlMetInfAnchorPtr_t pAnchor; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem == NULL) { if ((pAnchor = (SmlMetInfAnchorPtr_t)smlLibMalloc(sizeof(SmlMetInfAnchor_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pAnchor, 0, sizeof(SmlMetInfAnchor_t)); } else { pAnchor = (SmlMetInfAnchorPtr_t)*ppElem; if (pAnchor->next != NULL) return SML_ERR_XLT_INVAL_SYNCML_DOC; } rc = buildPCData(pDecoder, (VoidPtr_t)&pAnchor->next); if (rc != SML_ERR_OK && ppElem == NULL) { smlFreeMetinfAnchor(pAnchor); return rc; } if (ppElem == NULL) { *ppElem = pAnchor; } return SML_ERR_OK; } Ret_t buildMetInfMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlMetInfMemPtr_t pMem; Ret_t rc; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC, pScanner, "buildMetInfMemCmd"); if ((pMem = (SmlMetInfMemPtr_t)smlLibMalloc(sizeof(SmlMetInfMem_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pMem, 0, sizeof(SmlMetInfMem_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pMem; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfMem(pMem); //smlLibFree(pMem); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { /* %%% luz 2005-08-24 :this definition was plain wrong - shared is a flag, not Pcdata! case TN_METINF_SHAREDMEM: rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->shared); break; */ /* PCDATA elements */ case TN_METINF_FREEMEM: rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->free); break; case TN_METINF_FREEID: rc = buildPCData(pDecoder, (VoidPtr_t)&pMem->freeid); break; /* flags */ case TN_METINF_SHAREDMEM: pMem->flags |= SmlMetInfSharedMem_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC, pScanner, "buildMetInfMemCmd_2"); } if (rc != SML_ERR_OK) { smlFreeMetinfMem(pMem); //smlLibFree(pMem); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfMem(pMem); //smlLibFree(pMem); return rc; } } *ppElem = pMem; return SML_ERR_OK; } Ret_t buildMetInfMetInfCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem) { XltDecScannerPtr_t pScanner; SmlMetInfMetInfPtr_t pMeta; Ret_t rc; int foundWrapper = 0; pScanner = pDecoder->scanner; if (*ppElem != NULL) return SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC, pScanner, "buildMetInfMetInfCmd"); if ((pMeta = (SmlMetInfMetInfPtr_t)smlLibMalloc(sizeof(SmlMetInfMetInf_t))) == NULL) return SML_ERR_NOT_ENOUGH_SPACE; smlLibMemset(pMeta, 0, sizeof(SmlMetInfMetInf_t)); if (IS_EMPTY(pScanner->curtok)) { *ppElem = pMeta; return SML_ERR_OK; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfMetinf(pMeta); //smlLibFree(pMeta); return rc; } while (pScanner->curtok->type != TOK_TAG_END) { switch (pScanner->curtok->tagid) { case TN_METINF_METINF: /* ignore - it's just the wrapper tag */ foundWrapper = 1; break; case TN_METINF_FORMAT: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->format); break; case TN_METINF_TYPE: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->type); break; case TN_METINF_MARK: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->mark); break; case TN_METINF_SIZE: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->size); break; case TN_METINF_VERSION: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->version); break; case TN_METINF_NEXTNONCE: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->nextnonce); break; case TN_METINF_ANCHOR: rc = buildMetInfAnchorCmd(pDecoder, (VoidPtr_t)&pMeta->anchor); break; case TN_METINF_MAXMSGSIZE: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->maxmsgsize); break; /* SCTSTK - 18/03/2002 S.H. 2002-04-05: SyncML 1.1 */ case TN_METINF_MAXOBJSIZE: rc = buildPCData(pDecoder, (VoidPtr_t)&pMeta->maxobjsize); break; case TN_METINF_MEM: rc = buildMetInfMemCmd(pDecoder, (VoidPtr_t)&pMeta->mem); break; case TN_METINF_EMI: rc = buildPCDataList(pDecoder, (VoidPtr_t)&pMeta->emi); break; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ case TN_METINF_FIELDLEVEL: pMeta->flags |= SmlMetInfFieldLevel_f; rc = buildEmptyTag(pDecoder); // allow for instead of break; /* Next without Anchor, Andris Pavenis 2012-05-29 */ case TN_METINF_NEXT: rc = buildMetinfNextCmd(pDecoder, (VoidPtr_t)&pMeta->anchor); break; default: rc = SML_DECODEERROR(SML_ERR_XLT_INVAL_SYNCML_DOC, pScanner, "buildMetInfMetInfCmd_2"); } if (rc != SML_ERR_OK) { smlFreeMetinfMetinf(pMeta); //smlLibFree(pMeta); return rc; } if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfMetinf(pMeta); //smlLibFree(pMeta); return rc; } } if (foundWrapper) { /* Optional Metinf root tag was used in this message. * The actual token is the closing root tag. * It is required that the scanner points to the first tag _after_ * ..., so we just skip to the next token and continue. */ if (((rc = nextToken(pDecoder)) != SML_ERR_OK)) { smlFreeMetinfMetinf(pMeta); //smlLibFree(pMeta); return rc; } } *ppElem = pMeta; return SML_ERR_OK; } /* see xltenc.c:XltEncBlock for description of parameters */ Ret_t metinfEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) { //Return variable Ret_t _err; SmlPcdataListPtr_t pList = NULL; //Check if pContent of a required field is missing if ((reqOptFlag == REQUIRED) && (pContent == NULL)) return SML_ERR_XLT_MISSING_CONT; //Check if pContent of a optional field is missing -> if yes we are done else if (pContent == NULL) return SML_ERR_OK; //Generate the commands -> see DTD switch (tagId) { case TN_METINF_ANCHOR: if ((_err = xltGenerateTag(TN_METINF_ANCHOR, TT_BEG, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_LAST, OPTIONAL, ((SmlMetInfAnchorPtr_t) pContent)->last, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_NEXT, REQUIRED, ((SmlMetInfAnchorPtr_t) pContent)->next, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = xltGenerateTag(TN_METINF_ANCHOR, TT_END, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; break; case TN_METINF_MEM: if ((_err = xltGenerateTag(TN_METINF_MEM, TT_BEG, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_SHAREDMEM, OPTIONAL, &(((SmlMetInfMemPtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_FREEMEM, REQUIRED, ((SmlMetInfMemPtr_t) pContent)->free, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_FREEID, REQUIRED, ((SmlMetInfMemPtr_t) pContent)->freeid, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = xltGenerateTag(TN_METINF_MEM, TT_END, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; break; case TN_METINF_SHAREDMEM: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlMetInfSharedMem_f)) if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; break; case TN_METINF_FIELDLEVEL: //set the flag in the (WB)XML document if the flag is in the pContent if ((*((Flag_t *) pContent)) & (SmlMetInfFieldLevel_f)) if ((_err = xltGenerateTag(tagId, TT_ALL, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; break; case TN_METINF_METINF: //if ((_err = xltGenerateTag(TN_METINF_METINF, TT_BEG, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_FORMAT, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->format, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_TYPE, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->type, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_MARK, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->mark, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_SIZE, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->size, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_ANCHOR, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->anchor, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_VERSION, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->version, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_NEXTNONCE, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->nextnonce, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; if ((_err = metinfEncBlock(TN_METINF_MAXMSGSIZE,OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->maxmsgsize, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; // %%% luz 2003-04-24: added maxobjsize generation (was missing = bug in original RTK 4.1) if ((_err = metinfEncBlock(TN_METINF_MAXOBJSIZE,OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->maxobjsize, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; pList = ((SmlMetInfMetInfPtr_t)pContent)->emi; while (pList != NULL) { if ((_err = xltEncBlock(TN_METINF_EMI, OPTIONAL, pList->data, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; pList = pList->next; }; if ((_err = metinfEncBlock(TN_METINF_MEM, OPTIONAL, ((SmlMetInfMetInfPtr_t) pContent)->mem, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; /* SyncML DS 1.2, Synthesis/luz 2005-08-24 */ if ((_err = metinfEncBlock(TN_METINF_FIELDLEVEL,OPTIONAL, &(((SmlMetInfMetInfPtr_t) pContent)->flags), enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; //if ((_err = xltGenerateTag(TN_METINF_METINF, TT_END, enc, pBufMgr, SML_EXT_METINF)) != SML_ERR_OK) return _err; break; default: { // all leaf nodes (PCDATA#) return xltEncPcdata(tagId, reqOptFlag, pContent, enc, pBufMgr, attFlag); } /* eof default statement from switch tagid */ } /* eof switch tagid */ return SML_ERR_OK; } #endif /* __USE_METINF__ */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltmetinf.h0000755000373300037200000000541012424517753030447 0ustar00nightlyallusers00000000000000/** * @file * Definition of MetaInf DTD prototypefunctions for the en-/decoder * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _XLT_METINF_H #define _XLT_METINF_H /* process only if we really use MetInf DTD */ #ifdef __USE_METINF__ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xlttagtbl.h" #include "xltenc.h" Ret_t buildMetInfAnchorCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildMetInfMetInfCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildMetInfMemCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t metinfEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag); #endif /* __USE_METINF__ */ #endif /* _XLT_METINF_H */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xlttags.c0000755000373300037200000005554212424517753030131 0ustar00nightlyallusers00000000000000/** * @file * Definition of WBXML/XML tags for the en-/decoder * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "xlttags.h" #include #include #include #include #include #include "xltmetinf.h" #include "xltdevinf.h" #include "xlttagtbl.h" // %%% luz:2003-07-31: added SyncML namespace tables const char * const SyncMLNamespaces[SML_NUM_VERS] = { "???", "SYNCML:SYNCML1.0", "SYNCML:SYNCML1.1", "SYNCML:SYNCML1.2" }; /* local prototypes */ #ifdef NOWSM //%%% removed const to prevent gcc "type qualifiers ignored on function return type" warning //const // without WSM, the tag table is a global read-only constant #endif TagPtr_t getTagTable(SmlPcdataExtension_t ext); //SmlPcdataExtension_t getByName(String_t ns); void freeDtdTable(DtdPtr_t tbl); #ifdef NOWSM //%%% removed const to prevent gcc "type qualifiers ignored on function return type" warning //const // without WSM, the DTD table is a global read-only constant #endif DtdPtr_t getDtdTable(); // free table obtained with getDtdTable() void freeDtdTable(DtdPtr_t tbl) { #ifndef NOWSM // only with WSM this is an allocated table smlLibFree(tbl); #endif } /** * Returns a copy of the table containing all known (sub) dtd's * On error a NULL pointer is returned */ #ifdef NOWSM //%%% removed const to prevent gcc "type qualifiers ignored on function return type" warning //const // without WSM, the DTD table is a global read-only constant #endif DtdPtr_t getDtdTable() { #ifdef NOWSM // NOWSM method, table is const, just return a pointer static const Dtd_t XltDtdTbl[] = { { "SYNCML:SYNCML1.0", SML_EXT_UNDEFINED}, // %%% note that this is the default, will be override by syncml version specific string from { "syncml:metinf", SML_EXT_METINF}, { "syncml:devinf", SML_EXT_DEVINF}, { NULL, SML_EXT_LAST} }; return (DtdPtr_t)XltDtdTbl; #else // WSM method wasting a lot of memory DtdPtr_t _tmpPtr; Dtd_t XltDtdTbl[] = { { "SYNCML:SYNCML1.0", SML_EXT_UNDEFINED}, { "syncml:metinf", SML_EXT_METINF}, { "syncml:devinf", SML_EXT_DEVINF}, { NULL, SML_EXT_LAST} }; _tmpPtr = NULL; _tmpPtr = (DtdPtr_t)smlLibMalloc(sizeof(XltDtdTbl)); if (_tmpPtr == NULL) return NULL; smlLibMemcpy(_tmpPtr, &XltDtdTbl, sizeof(XltDtdTbl)); return _tmpPtr; #endif } /** * Returns the official name for a given extention/sub-DTD * and stored it in 'name'. If not found name isn't modified */ // %%% luz:2003-04-24: added syncmlvers parameter // %%% luz:2003-07-31: changed to vers enum Ret_t getExtName(SmlPcdataExtension_t ext, String_t *name, SmlVersion_t vers) { DtdPtr_t dtdhead = getDtdTable(); DtdPtr_t dtd = dtdhead; const char *dtdname; if (!dtdhead) return -1; for (;dtd->ext != SML_EXT_LAST; dtd++) { if (!dtd->name) continue; /* skip empty names (should not appear but better be on the safe side) */ if (dtd->ext == ext) { String_t _tmp; // this is the default dtdname=dtd->name; // %%% luz:2003-04-24: added dynamic generation of namespace according to SyncML version if (ext==SML_EXT_UNDEFINED && vers!=SML_VERS_UNDEF) { // this requests SyncML namespace dtdname=SyncMLNamespaces[vers]; } _tmp = smlLibMalloc(smlLibStrlen(dtdname)+1); if (!_tmp) { freeDtdTable(dtdhead); return SML_ERR_NOT_ENOUGH_SPACE; } smlLibStrcpy(_tmp, dtdname); freeDtdTable(dtdhead); *name = _tmp; return SML_ERR_OK; } } freeDtdTable(dtdhead); return -1; } /** * Returns the codepage constant assoziated with the name stored in 'ns' * * @return a SmlPcdataExtension_t representing the corresponding codepage id. * If no corresponding codepage is found -1 is returned. */ SmlPcdataExtension_t getExtByName(String_t ns) { DtdPtr_t dtdhead = getDtdTable(); DtdPtr_t dtd = dtdhead; SmlPcdataExtension_t ext = (SmlPcdataExtension_t) 255; if (!dtdhead) return SML_EXT_UNDEFINED; for (;dtd->ext != SML_EXT_LAST; dtd++) { const char *dtdname=dtd->name; if (!dtdname) continue; /* skip empty names (should not appear but better be on the safe side) */ if (dtd->ext==SML_EXT_UNDEFINED && smlLibStrnCasecmp("SYNCML:SYNCML",ns,13)==0) { // SyncML namespace is ok without checking version! ext = SML_EXT_UNDEFINED; break; } else if (smlLibStrcmp(dtdname,ns) == 0) { ext = dtd->ext; break; } } freeDtdTable(dtdhead); return ext; } /* if the commands are not defined we let the functions point to NULL */ #ifndef RESULT_RECEIVE #define buildResults NULL #endif #ifndef MAP_RECEIVE #define buildMap NULL #endif #ifndef EXEC_RECEIVE #define buildExec NULL #endif #if !defined(ATOMIC_RECEIVE) && !defined(SEQUENCE_RECEIVE) #define buildAtomOrSeq NULL #endif #ifndef SEARCH_RECEIVE #define buildSearch NULL #endif /** * Returns the tag table - this function is used to avoid a global * tag table variable * * @return a pointer to the tag table containing tag ids, * codepages, wbxml tags and xml tags */ /* T.K. initialized the structure via _TOKEN Macro, to take * out the XML name tags when not compiled with XML support. * In addtion removed the (unused) pointer for the build functions */ #if defined(__SML_XML__) || defined(__SML_WBXML_TEXTTOKENS__) #define _TOKEN(id, wbxml, xml) (id), (wbxml), (xml) #else #define _TOKEN(id, wbxml, xml) (id), (wbxml), "" #endif #ifdef NOWSM //%%% removed const to prevent gcc "type qualifiers ignored on function return type" warning //const // without WSM, the tag table is a global read-only constant #endif TagPtr_t getTagTable(SmlPcdataExtension_t ext) { #ifndef NOWSM int mySize = 0; TagPtr_t _tmpTagPtr; SyncMLInfoPtr_t pGA = NULL; #else TagPtr_t _tmpTagPtr=NULL; #endif /* standard SyncML codepage */ static const Tag_t syncml[] = { { _TOKEN(TN_ADD, 0x05, "Add")}, { _TOKEN(TN_ALERT, 0x06, "Alert")}, { _TOKEN(TN_ARCHIVE, 0x07, "Archive")}, { _TOKEN(TN_ATOMIC, 0x08, "Atomic")}, { _TOKEN(TN_CHAL, 0x09, "Chal")}, { _TOKEN(TN_CMD, 0x0A, "Cmd")}, { _TOKEN(TN_CMDID, 0x0B, "CmdID")}, { _TOKEN(TN_CMDREF, 0x0C, "CmdRef")}, { _TOKEN(TN_COPY, 0x0D, "Copy")}, { _TOKEN(TN_CRED, 0x0E, "Cred")}, { _TOKEN(TN_DATA, 0x0F, "Data")}, { _TOKEN(TN_DELETE, 0x10, "Delete")}, { _TOKEN(TN_EXEC, 0x11, "Exec")}, { _TOKEN(TN_FINAL, 0x12, "Final")}, { _TOKEN(TN_GET, 0x13, "Get")}, { _TOKEN(TN_ITEM, 0x14, "Item")}, { _TOKEN(TN_LANG, 0x15, "Lang")}, { _TOKEN(TN_LOCNAME, 0x16, "LocName")}, { _TOKEN(TN_LOCURI, 0x17, "LocURI")}, { _TOKEN(TN_MAP, 0x18, "Map")}, { _TOKEN(TN_MAPITEM, 0x19, "MapItem")}, { _TOKEN(TN_META, 0x1A, "Meta")}, { _TOKEN(TN_MSGID, 0x1B, "MsgID")}, { _TOKEN(TN_MSGREF, 0x1C, "MsgRef")}, { _TOKEN(TN_NORESP, 0x1D, "NoResp")}, { _TOKEN(TN_NORESULTS, 0x1E, "NoResults")}, { _TOKEN(TN_PUT, 0x1F, "Put")}, { _TOKEN(TN_REPLACE, 0x20, "Replace")}, { _TOKEN(TN_RESPURI, 0x21, "RespURI")}, { _TOKEN(TN_RESULTS, 0x22, "Results")}, { _TOKEN(TN_SEARCH, 0x23, "Search")}, { _TOKEN(TN_SEQUENCE, 0x24, "Sequence")}, { _TOKEN(TN_SESSIONID, 0x25, "SessionID")}, { _TOKEN(TN_SFTDEL, 0x26, "SftDel")}, { _TOKEN(TN_SOURCE, 0x27, "Source")}, { _TOKEN(TN_SOURCEREF, 0x28, "SourceRef")}, { _TOKEN(TN_STATUS, 0x29, "Status")}, { _TOKEN(TN_SYNC, 0x2A, "Sync")}, { _TOKEN(TN_SYNCBODY, 0x2B, "SyncBody")}, { _TOKEN(TN_SYNCHDR, 0x2C, "SyncHdr")}, { _TOKEN(TN_SYNCML, 0x2D, "SyncML")}, { _TOKEN(TN_TARGET, 0x2E, "Target")}, { _TOKEN(TN_TARGETREF, 0x2F, "TargetRef")}, { _TOKEN(TN_VERSION, 0x31, "VerDTD")}, { _TOKEN(TN_PROTO, 0x32, "VerProto")}, /* SyncML DS 1.1 */ { _TOKEN(TN_NUMBEROFCHANGES, 0x33, "NumberOfChanges")}, { _TOKEN(TN_MOREDATA, 0x34, "MoreData")}, /* SyncML DS 1.2, Synthesis/luz 2005-08-17 */ { _TOKEN(TN_FIELD, 0x35, "Field")}, { _TOKEN(TN_FILTER, 0x36, "Filter")}, { _TOKEN(TN_RECORD, 0x37, "Record")}, { _TOKEN(TN_FILTERTYPE, 0x38, "FilterType")}, { _TOKEN(TN_SOURCEPARENT, 0x39, "SourceParent")}, { _TOKEN(TN_TARGETPARENT, 0x3A, "TargetParent")}, { _TOKEN(TN_MOVE, 0x3B, "Move")}, { _TOKEN(TN_CORRELATOR, 0x3C, "Correlator")}, /* End of table */ { _TOKEN(TN_UNDEF, 0x00, NULL)} }; #ifdef __USE_METINF__ static const Tag_t metinf[] = { { _TOKEN(TN_METINF_ANCHOR, 0x05, "Anchor")}, { _TOKEN(TN_METINF_EMI, 0x06, "EMI")}, { _TOKEN(TN_METINF_FORMAT, 0x07, "Format")}, { _TOKEN(TN_METINF_FREEID, 0x08, "FreeID")}, { _TOKEN(TN_METINF_FREEMEM, 0x09, "FreeMem")}, { _TOKEN(TN_METINF_LAST, 0x0A, "Last")}, { _TOKEN(TN_METINF_MARK, 0x0B, "Mark")}, { _TOKEN(TN_METINF_MAXMSGSIZE, 0x0C, "MaxMsgSize")}, { _TOKEN(TN_METINF_MEM, 0x0D, "Mem")}, { _TOKEN(TN_METINF_METINF, 0x0E, "MetInf")}, { _TOKEN(TN_METINF_NEXT, 0x0F, "Next")}, { _TOKEN(TN_METINF_NEXTNONCE, 0x10, "NextNonce")}, { _TOKEN(TN_METINF_SHAREDMEM, 0x11, "SharedMem")}, { _TOKEN(TN_METINF_SIZE, 0x12, "Size")}, { _TOKEN(TN_METINF_TYPE, 0x13, "Type")}, { _TOKEN(TN_METINF_VERSION, 0x14, "Version")}, /* SCTSTK - 18/03/2002, S.H. 2002-04-05 : SyncML 1.1 */ { _TOKEN(TN_METINF_MAXOBJSIZE, 0x15, "MaxObjSize")}, /* SyncML DS 1.2, Synthesis/luz 2005-08-17 */ { _TOKEN(TN_METINF_FIELDLEVEL, 0x16, "FieldLevel")}, /* End of table */ { _TOKEN(TN_UNDEF, 0x00, NULL)} }; #endif #ifdef __USE_DEVINF__ static const Tag_t devinf[] = { {_TOKEN(TN_DEVINF_CTCAP, 0x05, "CTCap")}, {_TOKEN(TN_DEVINF_CTTYPE, 0x06, "CTType")}, {_TOKEN(TN_DEVINF_DATASTORE, 0x07, "DataStore")}, {_TOKEN(TN_DEVINF_DATATYPE, 0x08, "DataType")}, {_TOKEN(TN_DEVINF_DEVID, 0x09, "DevID")}, {_TOKEN(TN_DEVINF_DEVINF, 0x0A, "DevInf")}, {_TOKEN(TN_DEVINF_DEVTYP, 0x0B, "DevTyp")}, {_TOKEN(TN_DEVINF_DISPLAYNAME, 0x0C, "DisplayName")}, {_TOKEN(TN_DEVINF_DSMEM, 0x0D, "DSMem")}, {_TOKEN(TN_DEVINF_EXT, 0x0E, "Ext")}, {_TOKEN(TN_DEVINF_FWV, 0x0F, "FwV")}, {_TOKEN(TN_DEVINF_HWV, 0x10, "HwV")}, {_TOKEN(TN_DEVINF_MAN, 0x11, "Man")}, {_TOKEN(TN_DEVINF_MAXGUIDSIZE, 0x12, "MaxGUIDSize")}, {_TOKEN(TN_DEVINF_MAXID, 0x13, "MaxID")}, {_TOKEN(TN_DEVINF_MAXMEM, 0x14, "MaxMem")}, {_TOKEN(TN_DEVINF_MOD, 0x15, "Mod")}, {_TOKEN(TN_DEVINF_OEM, 0x16, "OEM")}, {_TOKEN(TN_DEVINF_PARAMNAME, 0x17, "ParamName")}, {_TOKEN(TN_DEVINF_PROPNAME, 0x18, "PropName")}, {_TOKEN(TN_DEVINF_RX, 0x19, "Rx")}, {_TOKEN(TN_DEVINF_RXPREF, 0x1A, "Rx-Pref")}, {_TOKEN(TN_DEVINF_SHAREDMEM, 0x1B, "SharedMem")}, {_TOKEN(TN_DEVINF_SIZE, 0x1C, "Size")}, {_TOKEN(TN_DEVINF_SOURCEREF, 0x1D, "SourceRef")}, {_TOKEN(TN_DEVINF_SWV, 0x1E, "SwV")}, {_TOKEN(TN_DEVINF_SYNCCAP, 0x1F, "SyncCap")}, {_TOKEN(TN_DEVINF_SYNCTYPE, 0x20, "SyncType")}, {_TOKEN(TN_DEVINF_TX, 0x21, "Tx")}, {_TOKEN(TN_DEVINF_TXPREF, 0x22, "Tx-Pref")}, {_TOKEN(TN_DEVINF_VALENUM, 0x23, "ValEnum")}, {_TOKEN(TN_DEVINF_VERCT, 0x24, "VerCT")}, {_TOKEN(TN_DEVINF_VERDTD, 0x25, "VerDTD")}, {_TOKEN(TN_DEVINF_XNAM, 0x26, "XNam")}, {_TOKEN(TN_DEVINF_XVAL, 0x27, "XVal")}, /* %%% luz:2003-04-28 : added these SyncML 1.2 tags, they were missing */ {_TOKEN(TN_DEVINF_UTC, 0x28, "UTC")}, {_TOKEN(TN_DEVINF_NOFM, 0x29, "SupportNumberOfChanges")}, {_TOKEN(TN_DEVINF_LARGEOBJECT, 0x2A, "SupportLargeObjs")}, /* SyncML DS 1.2, Synthesis/luz 2005-08-17 */ {_TOKEN(TN_DEVINF_PROPERTY, 0x2B, "Property")}, {_TOKEN(TN_DEVINF_PROPPARAM, 0x2C, "PropParam")}, {_TOKEN(TN_DEVINF_MAXOCCUR, 0x2D, "MaxOccur")}, {_TOKEN(TN_DEVINF_NOTRUNCATE, 0x2E, "NoTruncate")}, {_TOKEN(TN_DEVINF_FILTERRX, 0x30, "Filter-Rx")}, {_TOKEN(TN_DEVINF_FILTERCAP, 0x31, "FilterCap")}, {_TOKEN(TN_DEVINF_FILTERKEYWORD,0x32, "FilterKeyword")}, {_TOKEN(TN_DEVINF_FIELDLEVEL, 0x33, "FieldLevel")}, {_TOKEN(TN_DEVINF_HIERARCHICAL, 0x34, "SupportHierarchicalSync")}, {_TOKEN(TN_DEVINF_MAXSIZE, 0x1C, "MaxSize")}, // alias for TN_DEVINF_SIZE (same WBXML, different XML) /* End of table */ {_TOKEN(TN_UNDEF, 0x00, NULL)} }; #endif #ifndef NOWSM _tmpTagPtr = NULL; pGA = mgrGetSyncMLAnchor(); if (pGA == NULL) return NULL; #endif /* get the correct codepage */ if (ext == SML_EXT_UNDEFINED) { #ifndef NOWSM _tmpTagPtr = pGA->tokTbl->SyncML; if (_tmpTagPtr == NULL) { mySize = sizeof(syncml); pGA->tokTbl->SyncML = (TagPtr_t)smlLibMalloc(mySize); if (pGA->tokTbl->SyncML == NULL) return NULL; smlLibMemcpy(pGA->tokTbl->SyncML, &syncml, mySize); _tmpTagPtr = pGA->tokTbl->SyncML; } #else _tmpTagPtr=(TagPtr_t)syncml; #endif } #ifdef __USE_METINF__ else if (ext == SML_EXT_METINF) { #ifndef NOWSM _tmpTagPtr = pGA->tokTbl->MetInf; if (_tmpTagPtr == NULL) { mySize = sizeof(metinf); pGA->tokTbl->MetInf = (TagPtr_t)smlLibMalloc(mySize); if (pGA->tokTbl->MetInf == NULL) return NULL; smlLibMemcpy(pGA->tokTbl->MetInf, &metinf, mySize); _tmpTagPtr = pGA->tokTbl->MetInf; } #else _tmpTagPtr=(TagPtr_t)metinf; #endif } #endif #ifdef __USE_DEVINF__ else if (ext == SML_EXT_DEVINF) { #ifndef NOWSM _tmpTagPtr = pGA->tokTbl->DevInf; if (_tmpTagPtr == NULL) { mySize = sizeof(devinf); pGA->tokTbl->DevInf = (TagPtr_t)smlLibMalloc(mySize); if (pGA->tokTbl->DevInf == NULL) return NULL; smlLibMemcpy(pGA->tokTbl->DevInf, &devinf, mySize); _tmpTagPtr = pGA->tokTbl->DevInf; } #else _tmpTagPtr=(TagPtr_t)devinf; #endif } #endif return _tmpTagPtr; } #undef _TOKEN // we don't need that macro any longer /** * Returns a tag string which belongs to a tag ID. * This function is needed for the XML encoding * * @pre valid tag ID, the tagSring has to be allocated * @post tag string is returned * @param tagID (IN) * the ID for the tag * @param tagString (IN/OUT) * allocated string into which the XML tag string will be written * @param ext (IN) * the PCDATA extension type * @return 0, if OK */ #ifdef __SML_XML__ Ret_t getTagString(XltTagID_t tagID, String_t tagString, SmlPcdataExtension_t ext) { // %%% luz 2005-11-11 : added retry loop to try MetInf as a fallback (workaround for ill-formed xml like in sync4j pda clients) do { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { tagString[0] = '\0'; return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->id) == tagID) { String_t _tmp = (pTags+i)->xml; smlLibStrcpy(tagString, _tmp); return SML_ERR_OK; } i++; } // tag not found if (ext==SML_EXT_METINF) break; // already tried with implicit or explicit metinf // try metinf implicitly for ill-formed xml like sync4j clients ext=SML_EXT_METINF; } while(TRUE); tagString[0] = '\0'; return SML_ERR_XLT_INVAL_PROTO_ELEM; } #endif /** * Returns a WBXML byte which belongs to a tag ID in a defined codepage. * This function is needed for the WBXML encoding * * @pre valid tag ID, valid code page * @post tag byte is returned * @param tagID (IN) * the ID for the tag * @param ext (IN) * code page group for the tag * @param pTagByte (IN) * the byte representation of the tag * @return 0, if OK */ Ret_t getTagByte(XltTagID_t tagID, SmlPcdataExtension_t ext, Byte_t *pTagByte) { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->id) == tagID) { *pTagByte = (pTags+i)->wbxml; return SML_ERR_OK; } i++; } *pTagByte = 0; return SML_ERR_XLT_INVAL_PROTO_ELEM; } /** * Returns the code page which belongs to a certain PCDATA extension type. * * @pre valid PCDATA extension type * @post the code page is returned * @param ext (IN) * the PCDATA extension type * @return the code page */ Byte_t getCodePage(SmlPcdataExtension_t ext) { #ifdef __USE_METINF__ if (ext == SML_EXT_METINF) return 1; #endif #ifdef __USE_DEVINF__ if (ext == SML_EXT_DEVINF) return 0; #endif return 0; } /** * Returns the codepage which belongs to a certain tag ID * * @pre valid tag ID * @post the code page is returned * @param tagID (IN) * the ID of the tag * @param pExt (IN) * the codepage/extention of the tag * @return 0, if OK */ Ret_t getExtById(XltTagID_t tagID, SmlPcdataExtension_t *pExt) { int i = 0; SmlPcdataExtension_t ext; /* Iterate over all defined extensions to find the corresponding TAG. * Empty extensions, e.g. not defined numbers will be skipped. */ for (ext = SML_EXT_UNDEFINED; ext < SML_EXT_LAST; ext++) { TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { continue; /* skip empty codepage */ } i = 0; while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->id) == tagID){ *pExt = ext; return SML_ERR_OK; } i++; } } /* tag not found in any extension */ *pExt = (SmlPcdataExtension_t)255; return SML_ERR_XLT_INVAL_PROTO_ELEM; } /** * Returns the tag ID which belongs to a tag string in a certain codepage * * @pre valid tag string, valid code page * @post tag id is returned * @param tag (IN) * the string representation of the tag * @param ext (IN) * code page group for the tag * @param pTagID (IN) * the tag id of the tag * @return 0, if OK */ Ret_t getTagIDByStringAndExt(String_t tag, SmlPcdataExtension_t ext, XltTagID_t *pTagID) { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } for (i=0;((pTags+i)->id) != TN_UNDEF; i++) { if (*(pTags+i)->xml != *tag) continue; // if the first char doesn't match we skip the strcmp to speed things up if (smlLibStrcmp(((pTags+i)->xml), tag) == 0) { *pTagID = (pTags+i)->id; return SML_ERR_OK; } } *pTagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM; } /** * Returns the tag ID which belongs to a tag byte in a certain codepage * * @pre valid tag byte, valid code page * @post tag id is returned * @param tag (IN) * the byte representation of the tag * @param ext (IN) * code page group for the tag * @param pTagID (IN) * the tag id of the tag * @return 0, if OK */ Ret_t getTagIDByByteAndExt(Byte_t tag, SmlPcdataExtension_t ext, XltTagID_t *pTagID) { int i = 0; TagPtr_t pTags = getTagTable(ext); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if (((pTags+i)->wbxml) == tag) { *pTagID = (pTags+i)->id; return SML_ERR_OK; } i++; } *pTagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM; } #ifdef __SML_XML__ /** * Returns the tag ID which belongs to a tag string in a certain namespace * * @pre valid tag string, valid namespace * @post tag id is returned * @param tag (IN) * the string representation of the tag * @param ns (IN) * namespace group for the tag * @param pTagID (IN) * the tag id of the tag * @return 0, if OK */ Ret_t getTagIDByStringAndNamespace(String_t tag, String_t ns, XltTagID_t *pTagID) { int i = 0; TagPtr_t pTags = getTagTable(getExtByName(ns)); if (pTags == NULL) { return SML_ERR_NOT_ENOUGH_SPACE; } while (((pTags+i)->id) != TN_UNDEF) { if ((smlLibStrcmp(((pTags+i)->xml), tag) == 0)) { *pTagID = (pTags+i)->id; return SML_ERR_OK; } i++; } *pTagID = TN_UNDEF; return SML_ERR_XLT_INVAL_PROTO_ELEM; } #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xlttags.h0000755000373300037200000001353612424517753030133 0ustar00nightlyallusers00000000000000/** * @file * Definition of WBXML/XML tags for the en-/decoder * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_TAGS_H #define _XLT_TAGS_H #include #include #define XML_MAX_TAGLEN 35 #ifdef __cplusplus extern "C" { #endif // Tag IDs typedef enum { TN_UNDEF = 0, TN_ADD, TN_ALERT, TN_ARCHIVE, TN_ATOMIC, TN_ATOMIC_END, /* 5 */ TN_CHAL, TN_CMD, TN_CMDID, TN_CMDREF, TN_COPY, /* 10 */ TN_CRED, TN_DATA, TN_DELETE, TN_EXEC, TN_FINAL, /* 15 */ TN_GET, TN_ITEM, TN_LANG, TN_LOCNAME, TN_LOCURI, /* 20 */ TN_MAP, TN_MAPITEM, TN_META, TN_MSGID, TN_MSGREF, /* 25 */ TN_NORESP, TN_NORESULTS, TN_PUT, TN_REPLACE, TN_RESPURI, /* 30 */ TN_RESULTS, TN_SEARCH, TN_SEQUENCE, TN_SEQUENCE_END, TN_SESSIONID, /* 35 */ TN_SFTDEL, TN_SOURCE, TN_SOURCEREF, TN_STATUS, TN_SYNC, /* 40 */ TN_SYNCBODY, TN_SYNCHDR, TN_SYNCML, TN_SYNC_END, TN_TARGET, /* 45 */ TN_TARGETREF, TN_VERSION, TN_PROTO, TN_METINF_ANCHOR, TN_METINF_EMI, /* 50 */ TN_METINF_FORMAT, TN_METINF_FREEID, TN_METINF_FREEMEM, TN_METINF_LAST, TN_METINF_MARK, /* 55 */ TN_METINF_MAXMSGSIZE, TN_METINF_MEM, TN_METINF_METINF, TN_METINF_NEXT, TN_METINF_NEXTNONCE, /* 60 */ TN_METINF_SHAREDMEM, TN_METINF_SIZE, TN_METINF_TYPE, TN_METINF_VERSION, TN_DEVINF_CTCAP, /* 65 */ TN_DEVINF_CTTYPE, TN_DEVINF_DATASTORE, TN_DEVINF_DATATYPE, TN_DEVINF_DEVID, TN_DEVINF_DEVINF, /* 70 */ TN_DEVINF_DEVTYP, TN_DEVINF_DISPLAYNAME, TN_DEVINF_DSMEM, TN_DEVINF_EXT, TN_DEVINF_FWV, /* 75 */ TN_DEVINF_HWV, TN_DEVINF_MAN, TN_DEVINF_MAXGUIDSIZE, TN_DEVINF_MAXID, TN_DEVINF_MAXMEM, /* 80 */ TN_DEVINF_MOD, TN_DEVINF_OEM, TN_DEVINF_PARAMNAME, TN_DEVINF_PROPNAME, TN_DEVINF_RX, /* 85 */ TN_DEVINF_RXPREF, TN_DEVINF_SHAREDMEM, TN_DEVINF_SIZE, TN_DEVINF_SOURCEREF, TN_DEVINF_SWV, /* 90 */ TN_DEVINF_SYNCCAP, TN_DEVINF_SYNCTYPE, TN_DEVINF_TX, TN_DEVINF_TXPREF, TN_DEVINF_VALENUM, /* 95 */ TN_DEVINF_VERCT, TN_DEVINF_VERDTD, TN_DEVINF_XNAM, TN_DEVINF_XVAL, /* SCTSTK - 18/03/2002, S.H. 2002-04-05 : SyncML 1.1 */ TN_NUMBEROFCHANGES, /* 100 */ TN_MOREDATA, TN_METINF_MAXOBJSIZE, TN_DEVINF_UTC, TN_DEVINF_NOFM, TN_DEVINF_LARGEOBJECT, /* SyncML DS 1.2, Synthesis/luz 2005-08-17 */ TN_FIELD, TN_FILTER, TN_RECORD, TN_FILTERTYPE, TN_SOURCEPARENT, TN_TARGETPARENT, TN_MOVE, TN_CORRELATOR, TN_METINF_FIELDLEVEL, TN_DEVINF_PROPERTY, TN_DEVINF_PROPPARAM, TN_DEVINF_MAXOCCUR, TN_DEVINF_NOTRUNCATE, TN_DEVINF_FILTERRX, TN_DEVINF_FILTERCAP, TN_DEVINF_FILTERKEYWORD, TN_DEVINF_FIELDLEVEL, TN_DEVINF_HIERARCHICAL, TN_DEVINF_MAXSIZE // alias for TN_DEVINF_SIZE (same WBXML, different XML) } XltTagID_t; extern const char * const SyncMLNamespaces[SML_NUM_VERS]; typedef struct Dtd_s { String_t name; SmlPcdataExtension_t ext; } Dtd_t, *DtdPtr_t; Ret_t getTagString(XltTagID_t tagID, String_t tagString, SmlPcdataExtension_t ext); #ifdef __SML_WBXML__ Ret_t getTagByte(XltTagID_t tagID, SmlPcdataExtension_t ext, Byte_t *tagByte); #endif Byte_t getCodePage(SmlPcdataExtension_t ext); Ret_t getTagIDByStringAndExt(String_t tag, SmlPcdataExtension_t ext, XltTagID_t *pTagID); #ifdef __SML_WBXML__ Ret_t getTagIDByByteAndExt(Byte_t tag, SmlPcdataExtension_t ext, XltTagID_t *pTagID); #endif #ifdef __SML_XML__ Ret_t getTagIDByStringAndNamespace(String_t tag, String_t ns, XltTagID_t *pTagID); #endif Ret_t getExtById(XltTagID_t tagID, SmlPcdataExtension_t *pExt); // %%% luz:2003-07-31: added vers parameter Ret_t getExtName(SmlPcdataExtension_t ext, String_t *name, SmlVersion_t vers); Ret_t getTagIDByStringAndExt(String_t tag, SmlPcdataExtension_t ext, XltTagID_t *pTagID); SmlPcdataExtension_t getExtByName(String_t ns); #ifdef __cplusplus } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xlttagtbl.h0000755000373300037200000001205312424517753030443 0ustar00nightlyallusers00000000000000/** * @file * Definition of en-/decoder tagtable data * * @target_system all * @target_os all */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ #ifndef _XLT_TAGTBL_H #define _XLT_TAGTBL_H /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "xlttags.h" #include "xltdec.h" #include "xltdeccom.h" typedef struct Tag_s { XltTagID_t id; Byte_t wbxml; String_t xml; } Tag_t, *TagPtr_t; /** * buildXXX * * These functions each decode one single SyncML element starting at the * current position within the SyncML document. Child elements are build * recursively. * The functions check that the pointer to the memory structures are * NULL when called and return an error otherwise. This will only happen * when a SyncML element contains several child elements of the same type * for which this is not allowed according to the SyncML DTD; e.g. a * SyncHdr with two or more MsgID tags. Items and other list types * are handled separately by the appendXXXList functions (see below). * * @pre ppElem is NULL * The scanner's current token is the start tag (may be * empty) of the SyncML element to be decoded. * @post The scanner's current token is the end tag (or empty * start tag) of the SyncML element to be decoded. */ /* implemented in xltdec.c! */ Ret_t buildAlert(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); #if (defined ATOMIC_RECEIVE || defined SEQUENCE_RECEIVE) Ret_t buildAtomOrSeq(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); #endif Ret_t buildChal(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildCred(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildDelete(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildExec(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildRecordFieldFilter(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildFilter(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildGenericCmd(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildItem(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildMap(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildMapItem(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildEmptyTag(XltDecoderPtr_t pDecoder); Ret_t buildPCData(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildPCDataList(XltDecoderPtr_t pDecoder, VoidPtr_t *ppPCData); Ret_t buildPutOrGet(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildResults(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); #ifdef SEARCH_RECEIVE Ret_t buildSearch(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); #endif Ret_t buildStatus(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildSync(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildSyncHdr(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildTargetOrSource(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); Ret_t buildTargetOrSourceParent(XltDecoderPtr_t pDecoder, VoidPtr_t *ppElem); #ifdef NOWSM //%%% removed const to prevent gcc "type qualifiers ignored on function return type" warning //const // without WSM, the tag table is a global read-only constant #endif TagPtr_t getTagTable(SmlPcdataExtension_t cp); #endif /* _XLT_TAGTBL_H */ syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltutilstack.c0000755000373300037200000001512112424517753031163 0ustar00nightlyallusers00000000000000/** * @file * XLT Decoder Stack * * @target_system all * @target_os all * @description A simple array-based stack implementation. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #include "syncml_tk_prefix_file.h" // %%% luz: needed for precompiled headers in eVC++ #include "xltdeccom.h" #include "xltutilstack.h" #include #include struct ArrayStack_s; typedef struct ArrayStack_s *ArrayStackPtr_t, ArrayStack_t; struct ArrayStack_s { /* public */ Ret_t (*top)(const XltUtilStackPtr_t, XltUtilStackItem_t *); Ret_t (*pop)(XltUtilStackPtr_t, XltUtilStackItem_t *); Ret_t (*push)(XltUtilStackPtr_t, const XltUtilStackItem_t); Ret_t (*destroy)(XltUtilStackPtr_t); /* private */ Long_t topidx; // index of the top of the stack Long_t size; // size of the stack (multiple of chunksize) Long_t chunksize; // size of memory chunks allocated at a time XltUtilStackItem_t *array; // the stack itself }; static Ret_t _top(const XltUtilStackPtr_t, XltUtilStackItem_t *); static Ret_t _pop(XltUtilStackPtr_t, XltUtilStackItem_t *); static Ret_t _push(XltUtilStackPtr_t, const XltUtilStackItem_t); static Ret_t _destroy(XltUtilStackPtr_t); /*************************************************************************/ /* External Functions */ /*************************************************************************/ Ret_t xltUtilCreateStack(XltUtilStackPtr_t *ppStack, const Long_t size) { ArrayStackPtr_t pStack; if (size <= 0) return SML_ERR_WRONG_PARAM; if ((pStack = (ArrayStackPtr_t)smlLibMalloc(sizeof(ArrayStack_t))) == NULL) { *ppStack = NULL; return SML_ERR_NOT_ENOUGH_SPACE; } pStack->top = _top; pStack->pop = _pop; pStack->push = _push; pStack->destroy = _destroy; pStack->topidx = -1; pStack->size = size; pStack->chunksize = size; pStack->array = NULL; if ((pStack->array = (XltUtilStackItem_t*)smlLibMalloc(size * sizeof(XltUtilStackItem_t))) == NULL) { *ppStack = NULL; smlLibFree(pStack); return SML_ERR_NOT_ENOUGH_SPACE; } *ppStack = (XltUtilStackPtr_t)pStack; return SML_ERR_OK; } /*************************************************************************/ /* Internal Functions */ /*************************************************************************/ static Ret_t _top(const XltUtilStackPtr_t pStack, XltUtilStackItem_t *itemPtr) { ArrayStackPtr_t pStackPriv = (ArrayStackPtr_t)pStack; if (pStackPriv->topidx == -1) return SML_ERR_WRONG_USAGE; *itemPtr = pStackPriv->array[pStackPriv->topidx]; return SML_ERR_OK; } static Ret_t _pop(XltUtilStackPtr_t pStack, XltUtilStackItem_t *itemPtr) { ArrayStackPtr_t pStackPriv = (ArrayStackPtr_t)pStack; XltUtilStackItem_t item; if (pStackPriv->topidx == -1) return SML_ERR_WRONG_USAGE; item = pStackPriv->array[pStackPriv->topidx]; pStackPriv->topidx--; if ((pStackPriv->topidx >= 0) && (pStackPriv->topidx < pStackPriv->size - pStackPriv->chunksize)) { Long_t newsize; XltUtilStackItem_t *newarray; newsize = pStackPriv->size - pStackPriv->chunksize; if ((newarray = (XltUtilStackItem_t*)smlLibRealloc(pStackPriv->array, newsize * sizeof(XltUtilStackItem_t))) != NULL) { pStackPriv->size = newsize; pStackPriv->array = newarray; } else { return SML_ERR_NOT_ENOUGH_SPACE; } } *itemPtr = item; return SML_ERR_OK; } static Ret_t _push(XltUtilStackPtr_t pStack, const XltUtilStackItem_t item) { ArrayStackPtr_t pStackPriv = (ArrayStackPtr_t)pStack; if (pStackPriv->topidx == pStackPriv->size - 1) { Long_t newsize; XltUtilStackItem_t *newarray; newsize = pStackPriv->size + pStackPriv->chunksize; if ((newarray = (XltUtilStackItem_t*)smlLibRealloc(pStackPriv->array, newsize * sizeof(XltUtilStackItem_t))) != NULL) { pStackPriv->size = newsize; pStackPriv->array = newarray; } else { return SML_ERR_NOT_ENOUGH_SPACE; } } pStackPriv->topidx++; pStackPriv->array[pStackPriv->topidx] = item; return SML_ERR_OK; } static Ret_t _destroy(XltUtilStackPtr_t pStack) { ArrayStackPtr_t pStackPriv; if (pStack == NULL) return SML_ERR_OK; pStackPriv = (ArrayStackPtr_t)pStack; smlLibFree(pStackPriv->array); smlLibFree(pStackPriv); return SML_ERR_OK; } syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/all/xltutilstack.h0000755000373300037200000001212412424517753031170 0ustar00nightlyallusers00000000000000/** * @file * XLT Decoder Util * * @target_system all * @target_os all * @description Header file for a simple stack implementation used * by the WBXML scanner and the SyncML parser. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_UTIL_STACK_H #define _XLT_UTIL_STACK_H #include "xlttags.h" #include /** type for stack elements */ typedef XltTagID_t XltUtilStackItem_t; /** @copydoc XltUtilStack_s */ typedef struct XltUtilStack_s *XltUtilStackPtr_t, XltUtilStack_t; /** * XLTUtilStack interface * * Like the WBXML/XML scanner, this stack implementation tries to emulate * an object-oriented interface. It consist of one stack structure that * contains the public methods and attributes and another private stack * structure that is not visible to the users of the stack. A stack object * has the following public methods: */ struct XltUtilStack_s { /** * Returns the top element of the stack. * * @pre the stack contains at least one element * @param XltUtilStackPtr_t (IN) * the stack * @param XltUtilStackItem_t (OUT) * the top element of the stack * @return - SML_ERR_WRONG_USAGE, if the stack is empty * - SML_ERR_OK, else */ Ret_t (*top)(const XltUtilStackPtr_t, XltUtilStackItem_t *); /** * Returns the top element and takes it off the stack. * * @pre the stack contains at least one element * @post the top element of the stack is removed * @param XltUtilStackPtr_t (IN/OUT) * the stack * @param XltUtilStackItem_t (OUT) * the top element of the stack * @return - SML_ERR_WRONG_USAGE, if the stack is empty * - SML_ERR_NOT_ENOUGH_SPACE, if memory reallocation failed * - SML_ERR_OK, else */ Ret_t (*pop)(XltUtilStackPtr_t, XltUtilStackItem_t *); /** * Put a new element on top of the stack. * * @post popping the stack yields the same stack as before the push * @param XltUtilStackPtr_t (IN/OUT) * the stack * @param XltUtilStackItem_t (IN) * the new stack element * @return - SML_ERR_NOT_ENOUGH_SPACE, if memory reallocation failed * - SML_ERR_OK, else */ Ret_t (*push)(XltUtilStackPtr_t, const XltUtilStackItem_t); /** * Free the memory used by the stack. * * @param XltUtilStackPtr_t (IN/OUT) * the stack * @return - SML_ERR_OK */ Ret_t (*destroy)(XltUtilStackPtr_t); }; /** * Creates a new stack. The size parameter indicates for how many elements * memory should be allocated initially. This does _not_ mean that you can * not push more than that many element onto the stack - in that case * memory for another size elements is allocated. * * @post the stack pointer points to a new, empty stack * @param ppStack (OUT) * a new stack * @param size (IN) * the initial size of the stack * @return - SML_ERR_NOT_ENOUGH_SPACE, if memory allocation failed * - SML_ERR_OK, else */ Ret_t xltUtilCreateStack(XltUtilStackPtr_t *ppStack, const Long_t size); #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/inc/0000755000373300037200000000000012424517753026262 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/inc/xltdec.h0000755000373300037200000001742612424517753027733 0ustar00nightlyallusers00000000000000/** * @file * Interface for the XLT Decoder component. * * @target_system all * @target_os all * @description Interface for the WBXML and XML decoder component. */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_DEC_H #define _XLT_DEC_H #include #include #include #include "xltdeccom.h" #include "xltutilstack.h" #ifdef __cplusplus extern "C" { #endif /** * Better parsing error reporting when used within Synthesis SyncML engine * added 2006-11-02 by luz@synthesis.ch */ #ifdef SYDEBUG #include "sysync_debug.h" Ret_t show_decode_error(Ret_t aRc, XltDecScannerPtr_t aScanner, char *aRoutineName); #define SML_DECODEERROR(e,sc,n) show_decode_error(e,(XltDecScannerPtr_t)sc,n) #else #define SML_DECODEERROR(e,sc,n) (e) #endif /** * The XLT Decoder Interface consists of a single XltDecoder "object" * (struct) and an creation/initialization function. The XltDecoder * object contains all "public" methods and data structures. The first * parameter for any public method is the object of which the method is * called. */ typedef struct XltDecoder_s { /** * Character set used in the document - this is the MIBEnum value assigned * by the IANA for the character encoding, e.g. "3" for US-ASCII. */ Long_t charset; /** * Name of the character set, e.g. "US-ASCII" - valid * only when charset == 0. */ String_t charsetStr; /** * Indicates whether the decoder has reached the end of the buffer during * the last call to xltDecNext. */ Flag_t finished; Boolean_t final; /** * Pointer to the scanner status object used by this decoder. The scanner * will be created during the initialization of the decoder as either a XML * or WBXML scanner. */ XltDecScannerPtr_t scanner; /** * The decoder uses an internal stack to check that for every start tag * there is a corresponding end tag. */ XltUtilStackPtr_t tagstack; } XltDecoder_t, *XltDecoderPtr_t; /** * Initializes a new decoder object. This function allocates memory for the * decoder structure which has to be freed by a call to the decoder's * terminate method when the decoder is not needed anymore. As part of the * initialization the decoder begins decoding the SyncML document to find * the SyncHdr element. * * @pre ppDecoder is NULL * ppBufPos * @post ppDecoder points to an initialized decoder status object * @param enc (IN) * the document encoding (WBXML or XML) * @param pBufEnd (IN) * pointer to the end of the buffer which contains the document * @param ppBufPos (IN/OUT) * pointer to the current position within the buffer * @param ppDecoder (OUT) * the decoder status object * @param ppSyncHdr (OUT) * the SyncHdr element * @return * - SML_ERR_OK, if the decoder could be created and the * SmlSyncHdr was found * - else error code */ Ret_t xltDecInit(const SmlEncoding_t enc, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltDecoderPtr_t *ppDecoder, SmlSyncHdrPtr_t *ppSyncHdr) XLT_FUNC; /** * Decodes the next protocol element of the given SyncML document. This * function creates the data structures detailed in the SMLDtd header file. * It is the responsibility of the SyncML client application to free the * allocated memory after it is done processing the data. * This function sets the decoder's finished flag if no protocol element was * found. In that case pPE is set to SML_PE_UNDEF and pContent is NULL. * * @pre pDecoder points to a decoder status object initialized by xltDecInit * @post pPE and pContent describe the next valid protocol * element within the SyncML document OR * the finished flag of the decoder status object is set * @param pBufEnd (IN) * pointer to the end of the buffer * @param pDecoder (IN/OUT) * the decoder status object * @param ppBufPos (IN/OUT) * pointer to the current position within the * buffer before and after the call to xltDecNext * @param pPE (OUT) * the type of the protocol element (e.g. SML_PE_ADD) * @param pContent (OUT) * the data structure for the p.e. cast * (e.g. AddPtr_t) to a void pointer * @return * - SML_ERR_OK, if a valid protocol element was found * or if decoder reached the end of the buffer * - else error code showing where the parsing failed */ Ret_t xltDecNext(XltDecoderPtr_t pDecoder, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, SmlProtoElement_t *pPE, VoidPtr_t *pContent) XLT_FUNC; /** * Frees the memory allocated by the decoder. * * @pre pDecoder points to a decoder status object initialized by xltDecInit * @post all memory allocated by the decoder status object is freed * @param pDecoder (IN) * the decoder * @return * - SML_ERR_OK, if the memory could be freed * - else error code */ Ret_t xltDecTerminate(XltDecoderPtr_t pDecoder) XLT_FUNC; Ret_t xltDecReset(XltDecoderPtr_t pDecoder) XLT_FUNC; /* T.K. moved here from xltdec.c for use in sub-DTD parsing */ #define IS_START(tok) ((tok)->type == TOK_TAG_START) #define IS_END(tok) ((tok)->type == TOK_TAG_END) #define IS_EMPTY(tok) ((tok)->type == TOK_TAG_EMPTY) #define IS_TAG(tok) (IS_START(tok) || IS_EMPTY(tok) || IS_END(tok)) #define IS_START_OR_EMPTY(tok) (IS_START(tok) || IS_EMPTY(tok)) #define IS_CONTENT(tok) ((tok)->type == TOK_CONT) /** * just wrapper around the scanner's * nextTok methods that do some error checking. */ Ret_t nextToken(XltDecoderPtr_t pDecoder) XLT_FUNC; /** * just wrapper around the scanner's * pushTok methods that do some error checking. */ Ret_t discardToken(XltDecoderPtr_t pDecoder) XLT_FUNC; /* eof xltdec.c stuff */ #ifdef __cplusplus } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk/src/sml/xlt/inc/xltenc.h0000755000373300037200000001007612424517753027737 0ustar00nightlyallusers00000000000000/** * @file * Encoder header file * * @target_system All * @target_os All */ /* * Copyright Notice * Copyright (c) Ericsson, IBM, Lotus, Matsushita Communication * Industrial Co., Ltd., Motorola, Nokia, Openwave Systems, Inc., * Palm, Inc., Psion, Starfish Software, Symbian, Ltd. (2001). * All Rights Reserved. * Implementation of all or part of any Specification may require * licenses under third party intellectual property rights, * including without limitation, patent rights (such a third party * may or may not be a Supporter). The Sponsors of the Specification * are not responsible and shall not be held responsible in any * manner for identifying or failing to identify any or all such * third party intellectual property rights. * * THIS DOCUMENT AND THE INFORMATION CONTAINED HEREIN ARE PROVIDED * ON AN "AS IS" BASIS WITHOUT WARRANTY OF ANY KIND AND ERICSSON, IBM, * LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO. LTD, MOTOROLA, * NOKIA, PALM INC., PSION, STARFISH SOFTWARE AND ALL OTHER SYNCML * SPONSORS DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT * SHALL ERICSSON, IBM, LOTUS, MATSUSHITA COMMUNICATION INDUSTRIAL CO., * LTD, MOTOROLA, NOKIA, PALM INC., PSION, STARFISH SOFTWARE OR ANY * OTHER SYNCML SPONSOR BE LIABLE TO ANY PARTY FOR ANY LOSS OF * PROFITS, LOSS OF BUSINESS, LOSS OF USE OF DATA, INTERRUPTION OF * BUSINESS, OR FOR DIRECT, INDIRECT, SPECIAL OR EXEMPLARY, INCIDENTAL, * PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND IN CONNECTION WITH * THIS DOCUMENT OR THE INFORMATION CONTAINED HEREIN, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH LOSS OR DAMAGE. * * The above notice and this paragraph must be included on all copies * of this document that are made. * */ /*************************************************************************/ /* Definitions */ /*************************************************************************/ #ifndef _XLT_ENC_H #define _XLT_ENC_H #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /** Type for storing encoder information */ typedef struct XltEncoder_s { SmlEncoding_t enc; SmlVersion_t vers; // %%% luz 2003-07-31: added SyncML version here SmlPcdataExtension_t cur_ext; SmlPcdataExtension_t last_ext; Boolean_t final; XltSpaceEvaluationPtr_t space_evaluation; MemSize_t end_tag_size; } XltEncoder_t, *XltEncoderPtr_t; Ret_t xltEncInit(SmlEncoding_t enc, const SmlSyncHdrPtr_t pHeader, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos, XltEncoderPtr_t *ppEncoder, SmlVersion_t vers) XLT_FUNC; Ret_t xltEncAppend(const XltEncoderPtr_t pEncoder, SmlProtoElement_t pe, const MemPtr_t pBufEnd, const VoidPtr_t pContent, MemPtr_t *ppBufPos) XLT_FUNC; Ret_t xltEncTerminate(const XltEncoderPtr_t pEncoder, const MemPtr_t pBufEnd, MemPtr_t *ppBufPos) XLT_FUNC; Ret_t xltEncReset(XltEncoderPtr_t pEncoder) XLT_FUNC; Ret_t xltGenerateTag(XltTagID_t, XltTagType_t, SmlEncoding_t, BufferMgmtPtr_t, SmlPcdataExtension_t) XLT_FUNC; Ret_t xltStartEvaluation(XltEncoderPtr_t pEncoder) XLT_FUNC; Ret_t xltEndEvaluation(InstanceID_t id, XltEncoderPtr_t pEncoder, MemSize_t *freemem) XLT_FUNC; Ret_t xltEncBlock(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) XLT_FUNC; Ret_t xltBuildExtention(SmlPcdataExtension_t extId, XltRO_t reqOptFlag, VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr) XLT_FUNC; Ret_t xltEncPcdata(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) XLT_FUNC; Ret_t subdtdEncWBXML(XltTagID_t tagId, XltRO_t reqOptFlag, const VoidPtr_t pContent, SmlEncoding_t enc, BufferMgmtPtr_t pBufMgr, SmlPcdataExtension_t attFlag) XLT_FUNC; #ifdef __cplusplus } #endif #endif syncevolution-1.5/src/synthesis/src/syncml_tk_prefix_file.h0000755000373300037200000000063612424517753026055 0ustar00nightlyallusers00000000000000// dummy prefix file, used for CW based projects which do // not need the prefix file here, but in the target settings #ifdef _MSC_VER #error "this is not the right syncml_tk_prefix_file.h -> reorder include paths such that project-specific prefix is used!" #endif #ifdef __PALM_OS__ #error "this is not the right syncml_tk_prefix_file.h -> reorder access paths such that project-specific prefix is used!" #endif syncevolution-1.5/src/synthesis/src/synthesis-linker.map0000644000373300037200000000053112424517753025326 0ustar00nightlyallusers00000000000000VER_1.0 { global: SySync_*ConnectEngine; SySync_*ConnectEngineS; SySync_*DisconnectEngine; SySync_*ConsolePrintf; SySync_CondTimedWait; SySync_CondWait; extern "C++" { sysync::DataConversion*; sysync::SySyncDebugPuts*; }; local: *; }; syncevolution-1.5/src/synthesis/src/sysync/0000755000373300037200000000000012424517753022645 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync/binfilebase.cpp0000755000373300037200000003266212424517753025630 0ustar00nightlyallusers00000000000000/** * @File binfile.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinFileBase * Simple record based binary file storage class * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2006-03-28 : luz : extracted into separate file from TBinfileImplDS */ #include "prefix_file.h" #include "binfilebase.h" namespace sysync { // TBinFileBase // ============ // constructor TBinFileBase::TBinFileBase() : fDestructed(false) { fBinFileHeader.idword=0; fBinFileHeader.version=0; fBinFileHeader.headersize=sizeof(TBinFileHeader); fBinFileHeader.recordsize=0; fBinFileHeader.numrecords=0; fBinFileHeader.allocatedrecords=0; fBinFileHeader.uniquerecordid=0; fHeaderDirty=false; fExtraHeaderDirty=false; fExtraHeaderP=NULL; fExtraHeaderSize=0; fFoundVersion=0; } // TBinFileBase::TBinFileBase // destructor TBinFileBase::~TBinFileBase() { // If the instance hasn't been destructed yet, it is too late now, // because close() depends on pure-virtual methods from derived // classes which are no longer accessible (derived classes already // deconstructed!). This should never happen, because destruct() // must be called by ALL destructors of derivates. // // Removing destruct() here because it is redundant, would crash and // causes a cppcheck warning ("Call of pure virtual function // 'platformFileIsOpen' in destructor."). // destruct(); } // TBinFileBase::~TBinFileBase void TBinFileBase::destruct(void) { if (!fDestructed) doDestruct(); fDestructed=true; } // TBinFileBase::destruct void TBinFileBase::doDestruct(void) { // make sure files are closed close(); } // TBinFileBase::doDestruct // - set path to binary file containing the database void TBinFileBase::setFileInfo(const char *aFilename, uInt32 aVersion, uInt32 aIdWord, uInt32 aExpectedRecordSize) { close(); fFilename=aFilename; fIdWord=aIdWord; fVersion=aVersion; fExpectedRecordSize=aExpectedRecordSize; } // TBinFileBase::setFileInfo // - copy entire binfile 1:1 without looking at header bferr TBinFileBase::createAsCopyFrom(TBinFileBase &aSourceBinFile, bool aOverwrite) { // make sure it is closed first close(); aSourceBinFile.close(); // open original if (!aSourceBinFile.platformOpenFile(aSourceBinFile.fFilename.c_str(), fopm_update)) return BFE_NOTFOUND; // get original header into my own fBinFileHeader aSourceBinFile.platformSeekFile(0); if (!aSourceBinFile.platformReadFile(&fBinFileHeader,sizeof(fBinFileHeader))) { aSourceBinFile.platformCloseFile(); return BFE_BADSTRUCT; } // calculate file size uInt32 filesize = fBinFileHeader.headersize + fBinFileHeader.recordsize * fBinFileHeader.allocatedrecords; // create output file if (!aOverwrite) { // first test for existing file if (platformOpenFile(fFilename.c_str(), fopm_update)) { // already exists, don't copy platformCloseFile(); // close existing file aSourceBinFile.platformCloseFile(); // close input return BFE_EXISTS; // already exists, don't overwrite } } if (!platformOpenFile(fFilename.c_str(), fopm_create)) { aSourceBinFile.platformCloseFile(); // close input return BFE_IOERR; } // allocate buffer to read entire file void *copybuffer = malloc(filesize); if (!copybuffer) { aSourceBinFile.platformCloseFile(); // close input platformCloseFile(); // close output return BFE_MEMORY; // fatal } // read everything from old file aSourceBinFile.platformSeekFile(0); if (!aSourceBinFile.platformReadFile(copybuffer,filesize)) { aSourceBinFile.platformCloseFile(); // close input platformCloseFile(); // close output return BFE_IOERR; } aSourceBinFile.platformCloseFile(); // done with input file // write everything out to new file if (!platformWriteFile(copybuffer,filesize)) { platformCloseFile(); // close output return BFE_IOERR; } // return memory free(copybuffer); // close output platformCloseFile(); // done ok return BFE_OK; } // - try to open existing DB file according to params set with setFileInfo bferr TBinFileBase::open(uInt32 aExtraHeadersize, void *aExtraHeaderP, TUpdateFunc aUpdateFunc) { // make sure it is closed first close(); // save extra header info fExtraHeaderSize=aExtraHeadersize; fExtraHeaderP=aExtraHeaderP; // try to open file for (binary) update if (!platformOpenFile(fFilename.c_str(),fopm_update)) return BFE_NOTFOUND; // read header fHeaderDirty=false; platformSeekFile(0); if (!platformReadFile(&fBinFileHeader,sizeof(fBinFileHeader))) { close(); return BFE_BADSTRUCT; } // check type and Version if (fBinFileHeader.idword!=fIdWord) { close(); return BFE_BADTYPE; } // remember the version we found when trying to open fFoundVersion = fBinFileHeader.version; // check need for upgrade if (fBinFileHeader.version!=fVersion) { // try to update file if update-func is provided if (aUpdateFunc) { // check if we can update (no data provided for update) uInt32 newrecordsize=aUpdateFunc(fFoundVersion,fVersion,NULL,NULL,0); if (newrecordsize) { // we can update from current to requested version // - allocate buffer for all records uInt32 numrecords = fBinFileHeader.numrecords; uInt32 oldrecordsize = fBinFileHeader.recordsize; void *oldrecords = malloc(numrecords * oldrecordsize); if (!oldrecords) return BFE_MEMORY; // - read all current records into memory (relative to old headersize) readRecord(0,oldrecords,numrecords); // Update header because extra header might have changed in size if (fExtraHeaderP && (fBinFileHeader.headersize!=sizeof(TBinFileHeader)+fExtraHeaderSize)) { // (extra) header has changed in size // - read old extra header (or part of it that will be retained in case it shrinks between versions) uInt32 oldEHdrSz = fBinFileHeader.headersize-sizeof(TBinFileHeader); platformSeekFile(sizeof(TBinFileHeader)); platformReadFile(fExtraHeaderP,oldEHdrSz<=fExtraHeaderSize ? oldEHdrSz : fExtraHeaderSize); // - adjust the overall header size fBinFileHeader.headersize = sizeof(TBinFileHeader)+fExtraHeaderSize; // - let the update function handle init of the extra header aUpdateFunc(fFoundVersion,fVersion,NULL,fExtraHeaderP,0); // - make sure new extra header gets written fExtraHeaderDirty = true; } // - modify header fields fBinFileHeader.version=fVersion; // update version fBinFileHeader.recordsize=newrecordsize; // update record size fHeaderDirty=true; // header must be updated // - write new header (to make sure file is at least as long as header+extraheader) flushHeader(); // - truncate the file (taking new extra header size into account already, in case it has changed) truncate(); // - now convert buffered records void *newrecord = malloc(newrecordsize); for (uInt32 i=0; i0) { platformSeekFile(sizeof(TBinFileHeader)); platformReadFile(fExtraHeaderP,fExtraHeaderSize); fExtraHeaderDirty=false; } return BFE_OK; } // TBinFileBase::open // - create new DB file according to params set with setFileInfo bferr TBinFileBase::create(uInt32 aRecordsize, uInt32 aExtraHeadersize, void *aExtraHeaderP, bool aOverwrite) { bferr e; close(); // try to open e=open(aExtraHeadersize,NULL); // do not pass our new header data in case there is an old file already if (e==BFE_NOTFOUND || aOverwrite) { close(); // create new file if (!platformOpenFile(fFilename.c_str(),fopm_create)) return BFE_IOERR; // could not create for some reason // prepare header fBinFileHeader.idword=fIdWord; fBinFileHeader.version=fVersion; fBinFileHeader.headersize=sizeof(TBinFileHeader)+aExtraHeadersize; fBinFileHeader.recordsize=aRecordsize; fBinFileHeader.numrecords=0; fBinFileHeader.allocatedrecords=0; fBinFileHeader.uniquerecordid=0; fHeaderDirty = true; // - link in the new extra header buffer fExtraHeaderP = aExtraHeaderP; fExtraHeaderDirty = true; // make sure it gets written // write entire header e=flushHeader(); // opened with new version fFoundVersion = fVersion; } else if (e==BFE_OK) { // already exists close(); e=BFE_EXISTS; } return e; } // TBinFileBase::create // - close the file bferr TBinFileBase::close(void) { if (platformFileIsOpen()) { // remove empty space from end of file truncate(fBinFileHeader.numrecords); // write new header flushHeader(); // close file platformCloseFile(); } return BFE_OK; } // TBinFileBase::close // - close and delete file (full cleanup) bferr TBinFileBase::closeAndDelete(void) { close(); // now delete return platformDeleteFile(fFilename.c_str()) ? BFE_OK : BFE_IOERR; } // TBinFileBase::closeAndDelete // - flush the header to the file bferr TBinFileBase::flushHeader(void) { // save header if dirty if (fHeaderDirty) { platformSeekFile(0); platformWriteFile(&fBinFileHeader,sizeof(fBinFileHeader)); fHeaderDirty=false; } // save extra header if existing and requested if (fExtraHeaderP && fExtraHeaderDirty) { platformSeekFile(sizeof(fBinFileHeader)); platformWriteFile(fExtraHeaderP,fExtraHeaderSize); fExtraHeaderDirty=false; } // make sure data is really flushed in case we get improperly // destructed platformFlushFile(); return BFE_OK; } // TBinFileBase::flushHeader // - truncate to specified number of records bferr TBinFileBase::truncate(uInt32 aNumRecords) { if (!platformFileIsOpen()) return BFE_NOTOPEN; platformTruncateFile(fBinFileHeader.headersize+aNumRecords*fBinFileHeader.recordsize); fBinFileHeader.numrecords=aNumRecords; fBinFileHeader.allocatedrecords=aNumRecords; fHeaderDirty=true; return BFE_OK; } // TBinFileBase::truncate // - read by index bferr TBinFileBase::readRecord(uInt32 aIndex, void *aRecordData, uInt32 aNumRecords) { if (!platformFileIsOpen()) return BFE_NOTOPEN; if (aNumRecords==0) return BFE_OK; // find record position in file if (aIndex+aNumRecords>fBinFileHeader.numrecords) return BFE_BADINDEX; // not enough records to read if (!platformSeekFile(fBinFileHeader.headersize+aIndex*fBinFileHeader.recordsize)) return BFE_BADINDEX; // read data now if (!platformReadFile(aRecordData,fBinFileHeader.recordsize*aNumRecords)) return BFE_IOERR; // could not read as expected return BFE_OK; } // TBinFileBase::readRecord // - update by index bferr TBinFileBase::updateRecord(uInt32 aIndex, const void *aRecordData, uInt32 aNumRecords) { if (!platformFileIsOpen()) return BFE_NOTOPEN; if (aNumRecords==0) return BFE_OK; // nothing to do // find record position in file if (aIndex+aNumRecords>fBinFileHeader.numrecords) return BFE_BADINDEX; // trying to update more records than actually here if (!platformSeekFile(fBinFileHeader.headersize+aIndex*fBinFileHeader.recordsize)) return BFE_BADINDEX; // write data now if (!platformWriteFile(aRecordData,fBinFileHeader.recordsize*aNumRecords)) return BFE_IOERR; // could not read as expected return BFE_OK; } // TBinFileBase::updateRecord // - new record, returns new index bferr TBinFileBase::newRecord(uInt32 &aIndex, const void *aRecordData) { if (!platformFileIsOpen()) return BFE_NOTOPEN; // go to end of file if (!platformSeekFile(fBinFileHeader.headersize+fBinFileHeader.numrecords*fBinFileHeader.recordsize)) return BFE_IOERR; // write a new record if (!platformWriteFile(aRecordData,fBinFileHeader.recordsize)) return BFE_IOERR; // could not read as expected // update header aIndex=fBinFileHeader.numrecords++; // return index of new record fBinFileHeader.allocatedrecords++; fHeaderDirty=true; return BFE_OK; } // TBinFileBase::newRecord // - delete record bferr TBinFileBase::deleteRecord(uInt32 aIndex) { if (!platformFileIsOpen()) return BFE_NOTOPEN; if (aIndex>=fBinFileHeader.numrecords) return BFE_BADINDEX; if (aIndex using namespace std; namespace sysync { #ifndef ANDROID #pragma pack(push,4) // 32bit #endif // general defines for bindatastore // File header typedef struct { uInt32 idword; // identifies the database file type uInt32 version; // identifies the version of the database file uInt32 headersize; // size of header in bytes (specific files might have additional header info) uInt32 recordsize; // size in bytes of a single record uInt32 numrecords; // number of actual records uInt32 allocatedrecords; // number of allocated records in the file (including empty space) uInt32 uniquerecordid; // ever increasing counter to generate unique IDs for records } TBinFileHeader; #ifndef ANDROID #pragma pack(pop) #endif typedef uInt16 bferr; #define BFE_OK 0 // ok #define BFE_BADVERSION 1 // version mismatch #define BFE_BADTYPE 2 // type mismatch #define BFE_BADSTRUCT 3 // bad file structure (e.g. extra header size too big) #define BFE_NOTFOUND 4 // file not found #define BFE_EXISTS 5 // file already exists #define BFE_BADINDEX 6 // no such record #define BFE_NOTOPEN 7 // file not open #define BFE_IOERR 8 // I/O error #define BFE_MEMORY 9 // memory error typedef enum { fopm_update, // open for read and write fopm_create // create for read and write (truncate possibly existing) } TFileOpenModes; // DB version update function: // - when called with aOldRecordData==aNewRecordData==NULL, just checks if update is possible and returns new record size if yes // - when called with aOldRecordData==NULL, but aNewRecordData!=0, aNewRecordData points to the extra header and should be // updated for new version (only called when extra header size is actually different) // - when called with aOldRecordData!=0 and aNewRecordData!=0, it must update the record data to the new version. // This is repeated for all records in the binfile. typedef uInt32 (*TUpdateFunc)(uInt32 aOldVersion, uInt32 aNewVersion, void *aOldRecordData, void *aNewRecordData, uInt32 aOldSize); class TBinFileBase { // construction/destruction private: bool fDestructed; // flag which will be set once destruct() has been called - by the outermost derivate's destructor public: TBinFileBase(); virtual void doDestruct(void); // will be called by destruct, derived must call inherited if they implement it void destruct(void); // to be called by ALL destructors of derivates. virtual ~TBinFileBase(); // DB file access // - set path to binary file containing the database (aExpectedRecordSize can be zero if record size is not predetermined by a sizeof()) void setFileInfo(const char *aFilename, uInt32 aVersion, uInt32 aIdWord, uInt32 aExpectedRecordSize); // - get version file had when opening uInt32 getFoundVersion(void) { return fFoundVersion; }; // - check if open bool isOpen(void) { return platformFileIsOpen(); }; // - create a copy bferr createAsCopyFrom(TBinFileBase &aSourceBinFile, bool aOverwrite=false); // - try to open existing DB file according to params set with setFileInfo bferr open(uInt32 aExtraHeadersize=0, void *aExtraHeaderP=NULL, TUpdateFunc aUpdateFunc=NULL); // - create existing DB file according to params set with setFileInfo bferr create(uInt32 aRecordsize, uInt32 aExtraHeadersize=0, void *aExtraHeaderP=NULL, bool aOverwrite=false); // - truncate to specified number of records bferr truncate(uInt32 aNumRecords=0); // - make the extra header dirty void setExtraHeaderDirty(void) { fExtraHeaderDirty=true; }; // - flush the header to the file bferr flushHeader(void); // - close the file bferr close(void); // - close and delete file (full cleanup) bferr closeAndDelete(void); // Info // - number of records uInt32 getNumRecords(void) { return fBinFileHeader.numrecords; }; // - net size of record uInt32 getRecordSize(void) { return fBinFileHeader.recordsize; }; // - get next unique ID (starts at 1, is never 0!) uInt32 getNextUniqueID(void) { return ++fBinFileHeader.uniquerecordid; fHeaderDirty=true; }; // record access // - read by index bferr readRecord(uInt32 aIndex, void *aRecordData, uInt32 aNumRecords=1); // - update by index bferr updateRecord(uInt32 aIndex, const void *aRecorddata, uInt32 aNumRecords=1); // - new record bferr newRecord(const void *aRecorddata) { uInt32 i; return newRecord(i,aRecorddata); }; bferr newRecord(uInt32 &aIndex, const void *aRecorddata); // - delete record bferr deleteRecord(uInt32 aIndex); protected: // Platform file implementation abstraction // - test if platform file open virtual bool platformFileIsOpen(void) = 0; // - open file virtual bool platformOpenFile(cAppCharP aFilePath, TFileOpenModes aMode) = 0; // - close file virtual bool platformCloseFile(void) = 0; // - seek in file virtual bool platformSeekFile(uInt32 aPos, bool aFromEnd=false) = 0; // - read from file virtual bool platformReadFile(void *aBuffer, uInt32 aMaxRead) = 0; // - write to file virtual bool platformWriteFile(const void *aBuffer, uInt32 aBytes) = 0; // - flush all buffers virtual bool platformFlushFile(void) = 0; // - truncate file to a specific length virtual bool platformTruncateFile(uInt32 aNewSize) = 0; // - delete file entirely virtual bool platformDeleteFile(cAppCharP aFilePath) = 0; private: // file identification string fFilename; uInt32 fIdWord; uInt32 fVersion; uInt32 fFoundVersion; // version of file found when opening (to check after opening for happened upgrade) uInt32 fExpectedRecordSize; // cached header bool fHeaderDirty; // set if header must be written back to DB file bool fExtraHeaderDirty; // set if extra header must be written back to DB file TBinFileHeader fBinFileHeader; // standard header void *fExtraHeaderP; // pointer to extra header that will be read at open() and written at close() uInt32 fExtraHeaderSize; // size of extra header bytes at fExtraHeaderP }; // TBinFileBase } // namespace sysync #endif // BINFILEBASE_H syncevolution-1.5/src/synthesis/src/sysync/binfileimplclient.cpp0000755000373300037200000032307412424517753027056 0ustar00nightlyallusers00000000000000/** * @File binfileimplclient.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinfileImplClient * Represents a client session (agent) that saves profile, target, resume info * and optionally changelog in TBinFile binary files * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-30 : luz : created from TBinfileImplClient */ /* */ // includes #include "prefix_file.h" #include "binfileimplclient.h" #include "binfileimplds.h" #include "syserial.h" #include namespace sysync { // Support for EngineModule common interface // ========================================= #ifdef ENGINEINTERFACE_SUPPORT #ifndef ENGINE_LIBRARY #ifdef RELEASE_VERSION #error "this is here for Q&D testing with outlook client only" #endif // factory function implementation - declared in TEngineInterface ENGINE_IF_CLASS *newClientEngine(void) { return new TBinfileEngineInterface; } // newEngine #ifdef RELEASE_VERSION #error "this is only here for Q&D testing with outlook client - remove it later, global factory function may no longer be used by engineInterface targets!!" #else /// @brief returns a new application base. TSyncAppBase *TBinfileEngineInterface::newSyncAppBase(void) { return sysync::newSyncAppBase(); // use global factory function } // TBinfileEngineInterface::newSyncAppBase #endif #endif // not ENGINE_LIBRARY // create appropriate root key TSettingsKeyImpl *TBinfileEngineInterface::newSettingsRootKey(void) { return new TBinfileAgentRootKey(this); // return base class which can return some engine infos } // TBinfileEngineInterface::newSettingsRootKey // Target key // ---------- // constructor TBinfileTargetKey::TBinfileTargetKey( TEngineInterface *aEngineInterfaceP, sInt32 aTargetIndex, TBinfileDBSyncTarget *aTargetP, TBinfileClientConfig *aBinfileClientConfigP, TBinfileDSConfig *aBinfileDSConfigP ) : inherited(aEngineInterfaceP), fTargetIndex(aTargetIndex), fTargetP(aTargetP), fBinfileClientConfigP(aBinfileClientConfigP), fBinfileDSConfigP(aBinfileDSConfigP) { // nop } // TBinfileTargetKey::TBinfileTargetKey // destructor - close key TBinfileTargetKey::~TBinfileTargetKey() { // closing key if (fTargetP) { if (fDirty && fTargetIndex>=0) { // write back changed record fBinfileClientConfigP->writeTarget(fTargetIndex,*fTargetP); } // now delete the target record delete fTargetP; } } // TBinfileTargetKey::~TBinfileTargetKey // return ID of current key TSyError TBinfileTargetKey::GetKeyID(sInt32 &aID) { aID = fTargetP ? fTargetP->localDBTypeID : KEYVAL_ID_UNKNOWN; return LOCERR_OK; } // TBinfileTargetKey::GetKeyID // - read display name static TSyError readDispName( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { // get from config TBinfileTargetKey *targetKeyP = static_cast(aStructFieldsKeyP); cAppCharP dispName = ""; #ifndef MINIMAL_CODE dispName = targetKeyP->getBinfileDSConfig()->fDisplayName.c_str(); #endif if (*dispName==0) { // no display name, get technical name instead dispName = targetKeyP->getBinfileDSConfig()->getName(); } return TStructFieldsKey::returnString(dispName, aBuffer, aBufSize, aValSize); } // readDispName // - read path where binfiles are, for plugin config files passed around engine static TSyError readBinFileDirTarget( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileTargetKey *targetKeyP = static_cast(aStructFieldsKeyP); // get info string binFilesDir; targetKeyP->getBinfileClientConfig()->getBinFilesPath(binFilesDir); return TStructFieldsKey::returnString(binFilesDir.c_str(), aBuffer, aBufSize, aValSize); } // readBinFileDirTarget // - read availability flag for this datastore static TSyError readIsAvailable( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileTargetKey *targetKeyP = static_cast(aStructFieldsKeyP); // - get profile by ID bool avail = false; if (targetKeyP && targetKeyP->getTarget()) { TBinfileDBSyncProfile profile; targetKeyP->getBinfileClientConfig()->getProfileByID(targetKeyP->getProfileID(),profile); avail = targetKeyP->getBinfileClientConfig()->isTargetAvailable(&profile,targetKeyP->getTarget()->localDBTypeID); } return TStructFieldsKey::returnInt(avail, sizeof(avail), aBuffer, aBufSize, aValSize); } // readIsAvailable // - read danger flags for this datastore (will return them even if not enabled) static TSyError readTargetDangerFlags( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileTargetKey *targetKeyP = static_cast(aStructFieldsKeyP); bool zapsServer, zapsClient; lineartime_t lastSync; uInt32 dbid; // get info uInt8 danger=0; TBinfileDBSyncTarget *targetP; if (targetKeyP && (targetP=targetKeyP->getTarget())) { targetKeyP->getBinfileClientConfig()->getTargetLastSyncTime(*targetP, lastSync, zapsServer, zapsClient, dbid); danger = (zapsServer ? DANGERFLAG_WILLZAPSERVER : 0) + (zapsClient ? DANGERFLAG_WILLZAPCLIENT : 0); } return TStructFieldsKey::returnInt(danger, sizeof(danger), aBuffer, aBufSize, aValSize); } // readTargetDangerFlags // - write a readonly bitmask (rdonly_xxx), if this returns LOCERR_OK, readonly is enabled static TSyError writeTargetReadOnlyCheck( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TBinfileTargetKey *targetKeyP = static_cast(aStructFieldsKeyP); // get readonly mask to check for uInt16 readOnlyMask = *((uInt16 *)aBuffer); // check in profile bool rdOnly=false; if (targetKeyP && targetKeyP->getTarget()) { TBinfileDBSyncProfile profile; targetKeyP->getBinfileClientConfig()->getProfileByID(targetKeyP->getProfileID(),profile); rdOnly = targetKeyP->getBinfileClientConfig()->isReadOnly( &profile, readOnlyMask ); } // if feature is enabled for this profile, return LOCERR_OK, DB_NoContent otherwise return rdOnly ? LOCERR_OK : DB_NoContent; } // writeTargetReadOnlyCheck // - write a feature number (APPFTR_xxx), if this returns LOCERR_OK, feature is available, otherwise not static TSyError writeTargetFeatureCheck( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TBinfileTargetKey *targetKeyP = static_cast(aStructFieldsKeyP); // get feature to check for uInt16 featureNo = *((uInt16 *)aBuffer); // extra check for those that only make sense together with certain fDSAvailFlag bool avail=true; uInt16 dsAvailFlags = targetKeyP->getBinfileDSConfig()->fDSAvailFlag; if (featureNo==APP_FTR_EVENTRANGE && (dsAvailFlags & dsavail_events)==0) avail=false; // event range makes sense for events only if (featureNo==APP_FTR_EMAILRANGE && (dsAvailFlags & dsavail_emails)==0) avail=false; // email range makes sense for emails only // check on profile (and global) level if (avail && targetKeyP && targetKeyP->getTarget()) { TBinfileDBSyncProfile profile; targetKeyP->getBinfileClientConfig()->getProfileByID(targetKeyP->getProfileID(),profile); avail = targetKeyP->getBinfileClientConfig()->isFeatureEnabled( &profile, featureNo ); } // if feature is enabled for this profile, return LOCERR_OK, DB_NoContent otherwise return avail ? LOCERR_OK : DB_NoContent; } // writeTargetFeatureCheck // macro simplifying typing in the table below #define OFFS_SZ_TG(n) (offsetof(TBinfileDBSyncTarget,n)), sizeof(((TBinfileDBSyncTarget *)NULL)->n) // accessor table for target key and for TARGETSETTING() script function const TStructFieldInfo TargetFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz { "profileID", VALTYPE_INT32, false, OFFS_SZ_TG(remotepartyID) }, // read-only profile ID { "enabled", VALTYPE_ENUM, true, OFFS_SZ_TG(enabled) }, { "forceslow", VALTYPE_ENUM, true, OFFS_SZ_TG(forceSlowSync) }, { "syncmode", VALTYPE_ENUM, true, OFFS_SZ_TG(syncmode) }, { "limit1", VALTYPE_INT32, true, OFFS_SZ_TG(limit1) }, { "limit2", VALTYPE_INT32, true, OFFS_SZ_TG(limit2) }, { "extras", VALTYPE_INT32, true, OFFS_SZ_TG(extras) }, { "localpath", VALTYPE_TEXT, true, OFFS_SZ_TG(localDBPath) }, { "remotepath", VALTYPE_TEXT, true, OFFS_SZ_TG(remoteDBpath) }, #if defined(DESKTOP_CLIENT) || TARGETS_DB_VERSION>4 { "localcontainer", VALTYPE_TEXT, true, OFFS_SZ_TG(localContainerName) }, #endif // read-only status info { "dbname", VALTYPE_TEXT, false, OFFS_SZ_TG(dbname) }, { "lastSync", VALTYPE_TIME64, false, OFFS_SZ_TG(lastSync) }, { "lastChangeCheck", VALTYPE_TIME64, false, OFFS_SZ_TG(lastChangeCheck) }, { "resumeAlertCode", VALTYPE_INT16, true, OFFS_SZ_TG(resumeAlertCode) }, // programmatic danger flags (will sync zap client or server data?) { "dangerFlags", VALTYPE_INT8, false, 0,0, &readTargetDangerFlags, NULL }, // special programmatic availability and feature checks { "isAvailable", VALTYPE_ENUM, false, 0,0, &readIsAvailable, NULL }, // datastore availability { "checkForReadOnly", VALTYPE_INT16, true, 0,0, NULL, &writeTargetReadOnlyCheck }, // target level readonly check { "checkForFeature", VALTYPE_INT16, true, 0,0, NULL, &writeTargetFeatureCheck }, // target level feature check // display name from config { "dispName", VALTYPE_TEXT, false, 0,0, &readDispName, NULL }, // path where binfiles are, for plugin config files passed around engine { "binfilesDir", VALTYPE_TEXT, false, 0,0, &readBinFileDirTarget, NULL }, // new fields of TARGETS_DB_VERSION 6 and beyond #if TARGETS_DB_VERSION>5 { "remoteDispName", VALTYPE_TEXT, false, OFFS_SZ_TG(remoteDBdispName) }, // filtering { "filterCapDesc", VALTYPE_TEXT, false, OFFS_SZ_TG(filterCapDesc) }, { "remoteFilters", VALTYPE_TEXT, true, OFFS_SZ_TG(remoteFilters) }, { "localFilters", VALTYPE_TEXT, true, OFFS_SZ_TG(localFilters) }, #endif }; const sInt32 numTargetFieldInfos = sizeof(TargetFieldInfos)/sizeof(TStructFieldInfo); // get table describing the fields in the struct const TStructFieldInfo *TBinfileTargetKey::getFieldsTable(void) { return TargetFieldInfos; } // TBinfileTargetKey::getFieldsTable sInt32 TBinfileTargetKey::numFields(void) { return numTargetFieldInfos; } // TBinfileTargetKey::numFields // get actual struct base address uInt8P TBinfileTargetKey::getStructAddr(void) { return (uInt8P)fTargetP; } // TBinfileTargetKey::getStructAddr // Profiles container key // ---------------------- // constructor TBinfileTargetsKey::TBinfileTargetsKey(TEngineInterface *aEngineInterfaceP, sInt32 aProfileID) : inherited(aEngineInterfaceP), fProfileID(aProfileID), fTargetIterator(-1) { // get pointer to BinFileClientConfig fBinfileClientConfigP = static_cast( aEngineInterfaceP->getSyncAppBase()->getRootConfig()->fAgentConfigP ); } // TBinfileTargetsKey::TBinfileTargetsKey // target can be opened only by (dbtype-)ID TSyError TBinfileTargetsKey::OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ) { // safety check to see if targets are open at all if (!fBinfileClientConfigP->fTargetsBinFile.isOpen()) return LOCERR_WRONGUSAGE; TBinfileDBSyncTarget *targetP = new TBinfileDBSyncTarget; TSyError sta = LOCERR_OK; sInt32 targetIndex = -1; while(true) { switch (aID) { case KEYVAL_ID_FIRST: fTargetIterator = 0; // go to first goto getnthtarget; // then fetch next case KEYVAL_ID_NEXT: // increment fTargetIterator++; getnthtarget: // get n-th target as indicated by iterator if (fTargetIterator>=0) targetIndex = fBinfileClientConfigP->findTargetIndex(fProfileID,fTargetIterator); if (targetIndex>=0) goto gettarget; // next target found in iteration, get it // no more targets found sta=DB_NoContent; // no more targets break; default: // get target by ID if (aID<0) { sta=LOCERR_WRONGUSAGE; break; } // find target by dbtypeid targetIndex = fBinfileClientConfigP->findTargetIndexByDBInfo(fProfileID,aID,NULL); gettarget: // get target by index targetIndex = fBinfileClientConfigP->getTarget(targetIndex,*targetP); // check error if (targetIndex<0) sta=DB_NotFound; // target not found break; } if (sta==LOCERR_OK && targetIndex>=0) { // we have loaded a target, create subkey handler and pass data /* %%% old: search by name // - find related datastore config (by dbname) TBinfileDSConfig *dsCfgP = static_cast( fBinfileClientConfigP->getLocalDS(targetP->dbname) ); */ // - find related datastore config (by dbtypeid) TBinfileDSConfig *dsCfgP = static_cast( fBinfileClientConfigP->getLocalDS(NULL,targetP->localDBTypeID) ); if (dsCfgP==NULL) { // this target entry is not configured in the config -> skip it while iterating, // or return "DB error" if explicitly addressed // - re-enter iteration if iterating if (aID==KEYVAL_ID_FIRST) aID=KEYVAL_ID_NEXT; if (aID==KEYVAL_ID_NEXT) continue; // re-iterate // otherwise return DB error to signal inconsistency between target and config sta=DB_Error; } else { aSettingsKeyP = new TBinfileTargetKey(fEngineInterfaceP,targetIndex,targetP,fBinfileClientConfigP,dsCfgP); if (aSettingsKeyP) targetP=NULL; // ownership passed else sta=LOCERR_OUTOFMEM; // cannot create object } } // done, no re-iteration needed break; } // while true // get rid of it if we couldn't pass it to the subkey handler if (targetP) delete targetP; // done return sta; } // TBinfileTargetsKey::OpenSubkey #ifdef AUTOSYNC_SUPPORT // Autosync level key // ------------------ // constructor TBinfileASLevelKey::TBinfileASLevelKey( TEngineInterface *aEngineInterfaceP, sInt32 aLevelIndex, TBinfileDBSyncProfile *aProfileP, TBinfileClientConfig *aBinfileClientConfigP ) : inherited(aEngineInterfaceP), fLevelIndex(aLevelIndex), fProfileP(aProfileP), fBinfileClientConfigP(aBinfileClientConfigP) { } // TBinfileASLevelKey::TBinfileASLevelKey // destructor - close key TBinfileASLevelKey::~TBinfileASLevelKey() { // closing key // NOP here } // TBinfileASLevelKey::~TBinfileASLevelKey // return ID of current key TSyError TBinfileASLevelKey::GetKeyID(sInt32 &aID) { aID = fLevelIndex; // ID is level index return LOCERR_OK; } // TBinfileASLevelKey::GetKeyID // macro simplifying typing in the table below #define OFFS_SZ_AS(n) (offsetof(TAutoSyncLevel,n)), sizeof(dP_as->n) // dummy pointer needed for sizeof static const TAutoSyncLevel *dP_as=NULL; // accessor table for profiles static const TStructFieldInfo ASLevelFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz { "mode", VALTYPE_ENUM, true, OFFS_SZ_AS(Mode) }, { "startDayTime", VALTYPE_INT16, true, OFFS_SZ_AS(StartDayTime) }, { "endDayTime", VALTYPE_INT16, true, OFFS_SZ_AS(EndDayTime) }, { "weekdayMask", VALTYPE_INT8, true, OFFS_SZ_AS(WeekdayMask) }, { "chargeLevel", VALTYPE_INT8, true, OFFS_SZ_AS(ChargeLevel) }, { "memLevel", VALTYPE_INT8, true, OFFS_SZ_AS(MemLevel) }, { "flags", VALTYPE_INT8, true, OFFS_SZ_AS(Flags) }, }; // get table describing the fields in the struct const TStructFieldInfo *TBinfileASLevelKey::getFieldsTable(void) { return ASLevelFieldInfos; } // TBinfileASLevelKey::getFieldsTable sInt32 TBinfileASLevelKey::numFields(void) { return sizeof(ASLevelFieldInfos)/sizeof(TStructFieldInfo); } // TBinfileASLevelKey::numFields // get actual struct base address uInt8P TBinfileASLevelKey::getStructAddr(void) { return (uInt8P)&(fProfileP->AutoSyncLevel[fLevelIndex]); } // TBinfileASLevelKey::getStructAddr // Autosync levels container key // ----------------------------- // constructor TBinfileASLevelsKey::TBinfileASLevelsKey(TEngineInterface *aEngineInterfaceP, TBinfileDBSyncProfile *aProfileP) : inherited(aEngineInterfaceP), fASLevelIterator(-1), fProfileP(aProfileP) { // get pointer to BinFileClientConfig fBinfileClientConfigP = static_cast( aEngineInterfaceP->getSyncAppBase()->getRootConfig()->fAgentConfigP ); } // TBinfileASLevelsKey::TBinfileASLevelsKey // autosync levels can be opened only by ID TSyError TBinfileASLevelsKey::OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ) { TSyError sta = LOCERR_OK; switch (aID) { case KEYVAL_ID_FIRST: fASLevelIterator = 0; // go to first goto getlevel; // then fetch next case KEYVAL_ID_NEXT: // increment fASLevelIterator++; getlevel: // use iterator as ID (ID=level index) aID = fASLevelIterator; default: // open specified ID if (aID<0) { sta=LOCERR_WRONGUSAGE; } else if (aID>=NUM_AUTOSYNC_LEVELS) sta=DB_NoContent; // no more autosync levels else { fASLevelIterator = aID; aSettingsKeyP = new TBinfileASLevelKey(fEngineInterfaceP,aID,fProfileP,fBinfileClientConfigP); } break; } // done return sta; } // TBinfileASLevelsKey::OpenSubkey #endif // AUTOSYNC_SUPPORT // Profile key // ----------- // constructor TBinfileProfileKey::TBinfileProfileKey( TEngineInterface *aEngineInterfaceP, sInt32 aProfileIndex, // if <0, aProfileP is the running session's profile record TBinfileDBSyncProfile *aProfileP, TBinfileClientConfig *aBinfileClientConfigP ) : inherited(aEngineInterfaceP), fProfileIndex(aProfileIndex), fProfileP(aProfileP), fBinfileClientConfigP(aBinfileClientConfigP) { } // TBinfileProfileKey::TBinfileProfileKey // destructor - close key TBinfileProfileKey::~TBinfileProfileKey() { // closing key if (fProfileP) { if (fDirty && fProfileIndex>=0) { // write back changed record fBinfileClientConfigP->writeProfile(fProfileIndex,*fProfileP); } // now delete the profile record if it is not a running session's (because then it is just passed) if (fProfileIndex>=0) delete fProfileP; } } // TBinfileProfileKey::~TBinfileProfileKey // return ID of current key TSyError TBinfileProfileKey::GetKeyID(sInt32 &aID) { aID = getProfileID(); return LOCERR_OK; } // TBinfileProfileKey::GetKeyID // open subkey by name (not by path!) // - this is the actual implementation TSyError TBinfileProfileKey::OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { if (fProfileP && strucmp(aName,"targets",aNameSize)==0) aSettingsKeyP = new TBinfileTargetsKey(fEngineInterfaceP,fProfileP->profileID); #ifdef AUTOSYNC_SUPPORT else if (fProfileP && strucmp(aName,"autosynclevels",aNameSize)==0) aSettingsKeyP = new TBinfileASLevelsKey(fEngineInterfaceP,fProfileP); #endif else return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; } // TBinfileProfileKey::OpenSubKeyByName // - read path where binfiles are, for plugin config files passed around engine static TSyError readBinFileDirProfile( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileProfileKey *profileKeyP = static_cast(aStructFieldsKeyP); // get info string binFilesDir; profileKeyP->getBinfileClientConfig()->getBinFilesPath(binFilesDir); return TStructFieldsKey::returnString(binFilesDir.c_str(), aBuffer, aBufSize, aValSize); } // readBinFileDirProfile // - read danger flags for the profile (combined danger of all enabled datastores) static TSyError readDangerFlags( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileProfileKey *profileKeyP = static_cast(aStructFieldsKeyP); bool zapsServer, zapsClient; lineartime_t lastSync; // get info uInt8 danger=0; profileKeyP->getBinfileClientConfig()->getProfileLastSyncTime( profileKeyP->getProfileID(), lastSync, zapsServer, zapsClient ); danger = (zapsServer ? DANGERFLAG_WILLZAPSERVER : 0) + (zapsClient ? DANGERFLAG_WILLZAPCLIENT : 0); return TStructFieldsKey::returnInt(danger, sizeof(danger), aBuffer, aBufSize, aValSize); } // readDangerFlags // - write a feature number (APPFTR_xxx), if this returns LOCERR_OK, feature is available, otherwise not static TSyError writeFeatureCheck( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TBinfileProfileKey *profileKeyP = static_cast(aStructFieldsKeyP); // get feature to check for uInt16 featureNo = *((uInt16 *)aBuffer); // if feature is enabled for this profile, return LOCERR_OK, DB_NoContent otherwise return profileKeyP->getBinfileClientConfig()->isFeatureEnabled( profileKeyP->getProfile(), featureNo ) ? LOCERR_OK : DB_NoContent; } // writeFeatureCheck // - write a readonly bitmask (rdonly_xxx), if this returns LOCERR_OK, readonly is enabled static TSyError writeReadOnlyCheck( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TBinfileProfileKey *profileKeyP = static_cast(aStructFieldsKeyP); // get readonly mask to check for uInt16 readOnlyMask = *((uInt16 *)aBuffer); // check in profile bool rdOnly= profileKeyP->getBinfileClientConfig()->isReadOnly( profileKeyP->getProfile(), readOnlyMask ); // if feature is enabled for this profile, return LOCERR_OK, DB_NoContent otherwise return rdOnly ? LOCERR_OK : DB_NoContent; } // writeReadOnlyCheck // macro simplifying typing in the table below #define OFFS_SZ_PF(n) (offsetof(TBinfileDBSyncProfile,n)), sizeof(((TBinfileDBSyncProfile *)NULL)->n) // accessor table for profiles and for PROFILESETTING script function const TStructFieldInfo ProfileFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz { "profileName", VALTYPE_TEXT, true, OFFS_SZ_PF(profileName) }, { "protocol", VALTYPE_ENUM, true, OFFS_SZ_PF(protocol) }, { "serverURI", VALTYPE_TEXT, true, OFFS_SZ_PF(serverURI) }, { "URIpath", VALTYPE_TEXT, true, OFFS_SZ_PF(URIpath) }, { "serverUser", VALTYPE_TEXT, true, OFFS_SZ_PF(serverUser) }, { "serverPassword", VALTYPE_TEXT_OBFUS, true, OFFS_SZ_PF(serverPassword) }, { "transportUser", VALTYPE_TEXT, true, OFFS_SZ_PF(transportUser) }, { "transportPassword", VALTYPE_TEXT_OBFUS, true, OFFS_SZ_PF(transportPassword) }, { "socksHost", VALTYPE_TEXT, true, OFFS_SZ_PF(socksHost) }, { "proxyHost", VALTYPE_TEXT, true, OFFS_SZ_PF(proxyHost) }, { "proxyUser", VALTYPE_TEXT, true, OFFS_SZ_PF(proxyUser) }, { "proxyPassword", VALTYPE_TEXT_OBFUS, true, OFFS_SZ_PF(proxyPassword) }, { "encoding", VALTYPE_ENUM, true, OFFS_SZ_PF(encoding) }, { "lastAuthMethod", VALTYPE_ENUM, true, OFFS_SZ_PF(lastAuthMethod) }, { "lastNonce", VALTYPE_TEXT, true, OFFS_SZ_PF(lastNonce) }, { "syncmlvers", VALTYPE_ENUM, true, OFFS_SZ_PF(lastSyncMLVersion) }, { "useProxy", VALTYPE_ENUM, true, OFFS_SZ_PF(useProxy) }, { "useConnectionProxy", VALTYPE_ENUM, true, OFFS_SZ_PF(useConnectionProxy) }, { "transpFlags", VALTYPE_INT32, true, OFFS_SZ_PF(transpFlags) }, { "profileFlags", VALTYPE_INT32, true, OFFS_SZ_PF(profileFlags) }, // generic fields for app specific usage { "profileExtra1", VALTYPE_INT32, true, OFFS_SZ_PF(profileExtra1) }, { "profileExtra2", VALTYPE_INT32, true, OFFS_SZ_PF(profileExtra2) }, { "profileData", VALTYPE_BUF, true, OFFS_SZ_PF(profileData) }, // feature/availability/extras flags { "dsAvailFlags", VALTYPE_INT16, true, OFFS_SZ_PF(dsAvailFlags) }, { "readOnlyFlags", VALTYPE_INT8, true, OFFS_SZ_PF(readOnlyFlags) }, { "remoteFlags", VALTYPE_INT8, false, OFFS_SZ_PF(remoteFlags) }, { "featureFlags", VALTYPE_INT8, true, OFFS_SZ_PF(featureFlags) }, // programmatic danger flags (will sync zap client or server data?) { "dangerFlags", VALTYPE_INT8, false, 0,0, &readDangerFlags, NULL }, // special programmatic feature check { "checkForFeature", VALTYPE_INT16, true, 0,0, NULL, &writeFeatureCheck }, { "checkForReadOnly", VALTYPE_INT16, true, 0,0, NULL, &writeReadOnlyCheck }, // path where binfiles are, for plugin config files passed around engine { "binfilesDir", VALTYPE_TEXT, false, 0,0, &readBinFileDirProfile, NULL }, #ifdef AUTOSYNC_SUPPORT // autosync { "timedSyncMobile", VALTYPE_INT16, true, OFFS_SZ_PF(TimedSyncMobilePeriod) }, { "timedSyncCradled", VALTYPE_INT16, true, OFFS_SZ_PF(TimedSyncCradledPeriod) }, #endif }; const sInt32 numProfileFieldInfos = sizeof(ProfileFieldInfos)/sizeof(TStructFieldInfo); // get table describing the fields in the struct const TStructFieldInfo *TBinfileProfileKey::getFieldsTable(void) { return ProfileFieldInfos; } // TBinfileProfileKey::getFieldsTable sInt32 TBinfileProfileKey::numFields(void) { return numProfileFieldInfos; } // TBinfileProfileKey::numFields // get actual struct base address uInt8P TBinfileProfileKey::getStructAddr(void) { return (uInt8P)fProfileP; } // TBinfileProfileKey::getStructAddr // Profiles container key // ---------------------- // constructor TBinfileProfilesKey::TBinfileProfilesKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP), fProfileIterator(-1) { // get pointer to BinFileClientConfig (can be NULL in case engine was never initialized with a config) fBinfileClientConfigP = static_cast( aEngineInterfaceP->getSyncAppBase()->getRootConfig()->fAgentConfigP ); // default to not loosing or upgrading config fMayLooseOldCfg=false; } // TBinfileProfilesKey::TBinfileProfilesKey // destructor TBinfileProfilesKey::~TBinfileProfilesKey() { // make sure all settings are saved if ( fBinfileClientConfigP && // it's possible that we get there before engine was ever initialized! (fBinfileClientConfigP->fProfileBinFile.isOpen() || fBinfileClientConfigP->fTargetsBinFile.isOpen()) ) { fBinfileClientConfigP->closeSettingsDatabases(); fBinfileClientConfigP->openSettingsDatabases(false); } } // TBinfileProfilesKey::~TBinfileProfilesKey // profiles can be opened only by ID TSyError TBinfileProfilesKey::OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ) { TBinfileDBSyncProfile *profileP = NULL; TSyError sta = LOCERR_OK; // safety check to see if config is here and profiles are open if (!fBinfileClientConfigP || !(fBinfileClientConfigP->fProfileBinFile.isOpen())) return LOCERR_WRONGUSAGE; // now create a profile record (which will be passed to subkey on success) profileP = new TBinfileDBSyncProfile; // check what to do switch (aID) { case KEYVAL_ID_NEW: // create a new empty profile fProfileIterator = fBinfileClientConfigP->newProfile("empty profile", false); // now get it goto getprofile; case KEYVAL_ID_NEW_DEFAULT: // create new profile with default values fProfileIterator = fBinfileClientConfigP->newProfile("default profile", true); // now get it goto getprofile; case KEYVAL_ID_NEW_DUP: // create duplicate of last opened profile (if any) fProfileIterator = fBinfileClientConfigP->newProfile("duplicated profile", false, fProfileIterator); // now get it goto getprofile; case KEYVAL_ID_FIRST: fProfileIterator = 0; // go to first goto getprofile; // then fetch next case KEYVAL_ID_NEXT: // increment fProfileIterator++; getprofile: // get profile by index if (fProfileIterator>=0) fProfileIterator=fBinfileClientConfigP->getProfile(fProfileIterator,*profileP); goto checkerror; default: if (aID<0) { sta=LOCERR_WRONGUSAGE; break; } // open by ID fProfileIterator=fBinfileClientConfigP->getProfileByID(aID,*profileP); checkerror: // check error if (fProfileIterator<0) sta=DB_NoContent; // no more profiles break; } if (sta==LOCERR_OK && fProfileIterator>=0) { // we have loaded a profile, create subkey handler and pass data aSettingsKeyP = new TBinfileProfileKey(fEngineInterfaceP,fProfileIterator,profileP,fBinfileClientConfigP); if (aSettingsKeyP) profileP=NULL; // ownership passed else sta=LOCERR_OUTOFMEM; // cannot create object } // get rid of it if we couldn't pass it to the subkey handler if (profileP) delete profileP; // done return sta; } // TBinfileProfilesKey::OpenSubkey // delete profile by ID TSyError TBinfileProfilesKey::DeleteSubkey(sInt32 aID) { sInt32 profileIndex = fBinfileClientConfigP->getProfileIndex(aID); if (profileIndex<0) return DB_NotFound; fBinfileClientConfigP->deleteProfile(profileIndex); fProfileIterator = -1; // invalidate iterator return LOCERR_OK; } // TBinfileProfilesKey::DeleteSubkey // - write a feature number (APPFTR_xxx), if this returns LOCERR_OK, feature is available, otherwise not static TSyError writeGlobalFeatureCheck( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { // get feature to check for uInt16 featureNo = *((uInt16 *)aBuffer); // if feature is enabled for this profile, return LOCERR_OK, DB_NoContent otherwise return aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->isFeatureEnabled(featureNo) ? LOCERR_OK : DB_NoContent; } // writeGlobalFeatureCheck // - write provisioning string static TSyError writeProvisioningString( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TBinfileProfilesKey *profilesKeyP = static_cast(aStructFieldsKeyP); // execute the provisioning string // Note: if a new profile is created, the iterator is set such that KEYVAL_ID_NEXT // will return the profile just added/updated by provisioning sInt32 touchedProfile; cAppCharP p=cAppCharP(aBuffer); TSyError sta = LOCERR_CFGPARSE; while (p && *p) { // push this line if (profilesKeyP->getBinfileClientConfig()->executeProvisioningString(p, touchedProfile)) { // parsed ok sta = LOCERR_OK; // at least one line is ok profilesKeyP->setNextProfileindex(touchedProfile); // such that KEYVAL_ID_NEXT will get the new/modified profile } // search for next line // - skip to end while (*p && *p!=0x0A && *p!=0x0D) ++p; // - skip line end while (*p==0x0A || *p==0x0D) ++p; } return sta; } // writeProvisioningString // - read registration status code static TSyError readVarCfgStatus( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { aValSize=2; if (aBufSize>=aValSize) { // get ptr TBinfileProfilesKey *profilesKeyP = static_cast(aStructFieldsKeyP); // sanity check if (!(profilesKeyP->fBinfileClientConfigP)) return LOCERR_WRONGUSAGE; // it's possible that we get there before engine was ever initialized! // try to access variable part of config (profiles/targets) localstatus sta = profilesKeyP->fBinfileClientConfigP->loadVarConfig(profilesKeyP->fMayLooseOldCfg); if (sta==LOCERR_OK) { // make sure profiles have all targets currently found in config profilesKeyP->fBinfileClientConfigP->checkProfiles(); } // copy from config *((uInt16*)aBuffer)=sta; } return LOCERR_OK; } // readVarCfgStatus // - read "overwrite" flag static TSyError readMayLooseOldConfig( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { return TStructFieldsKey::returnInt(static_cast(aStructFieldsKeyP)->fMayLooseOldCfg, 1, aBuffer, aBufSize, aValSize); } // readMayLooseOldConfig // - write "overwrite" flag static TSyError writeMayLooseOldConfig( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { // set flag static_cast(aStructFieldsKeyP)->fMayLooseOldCfg = *((uInt8 *)aBuffer); return LOCERR_OK; } // writeMayLooseOldConfig // does not work at this time, but intention would be to get rid of the warning below // #pragma GCC diagnostic ignored "-Wno-invalid-offsetof" // accessor table for profiles static const TStructFieldInfo ProfilesFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz { "settingsstatus", VALTYPE_INT16, false, 0, 0, &readVarCfgStatus, NULL }, //{ "overwrite", VALTYPE_INT8, true, offsetof(TBinfileProfilesKey,fMayLooseOldCfg), 1 }, //%%% this use of offsetof is not clean, so we use a getter/setter instead { "overwrite", VALTYPE_INT8, true, 0, 0, &readMayLooseOldConfig, &writeMayLooseOldConfig }, { "provisioningstring", VALTYPE_TEXT, true, 0, 0, NULL, &writeProvisioningString }, { "checkForFeature", VALTYPE_INT16, true, 0, 0, NULL, &writeGlobalFeatureCheck }, // global level feature check }; // get table describing the fields in the struct const TStructFieldInfo *TBinfileProfilesKey::getFieldsTable(void) { return ProfilesFieldInfos; } // TBinfileProfilesKey::getFieldsTable sInt32 TBinfileProfilesKey::numFields(void) { return sizeof(ProfilesFieldInfos)/sizeof(TStructFieldInfo); } // TBinfileProfilesKey::numFields // get actual struct base address uInt8P TBinfileProfilesKey::getStructAddr(void) { return (uInt8P)this; } // TBinfileProfilesKey::getStructAddr // Log entry key // ------------- // constructor TBinfileLogKey::TBinfileLogKey( TEngineInterface *aEngineInterfaceP, TLogFileEntry *aLogEntryP, TBinfileClientConfig *aBinfileClientConfigP ) : inherited(aEngineInterfaceP), fLogEntryP(aLogEntryP), fBinfileClientConfigP(aBinfileClientConfigP) { } // TBinfileLogKey::TBinfileLogKey // destructor - close key TBinfileLogKey::~TBinfileLogKey() { // closing key // - dispose log entry memory if (fLogEntryP) delete fLogEntryP; } // TBinfileLogKey::~TBinfileLogKey // - read DB display name related to this log entry static TSyError readLogDispName( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileLogKey *logentryKeyP = static_cast(aStructFieldsKeyP); // get config of datastore via DBID TLocalDSConfig *dscfgP = logentryKeyP->getBinfileClientConfig()->getLocalDS(NULL,logentryKeyP->getLogEntry()->dbID); cAppCharP dispName = ""; #ifndef MINIMAL_CODE dispName = dscfgP->fDisplayName.c_str(); #endif if (*dispName==0) { // no display name, get technical name instead dispName = dscfgP->getName(); } return TStructFieldsKey::returnString(dispName, aBuffer, aBufSize, aValSize); } // readLogDispName // - read DB display name related to this log entry static TSyError readLogProfileName( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TBinfileLogKey *logentryKeyP = static_cast(aStructFieldsKeyP); // get profile data via profile ID TBinfileDBSyncProfile profile; logentryKeyP->getBinfileClientConfig()->getProfileByID(logentryKeyP->getLogEntry()->profileID,profile); return TStructFieldsKey::returnString(profile.profileName, aBuffer, aBufSize, aValSize); } // readLogProfileName // macro simplifying typing in the table below #define OFFS_SZ_LOG(n) (offsetof(TLogFileEntry,n)), sizeof(((TLogFileEntry *)NULL)->n) // accessor table for log entries static const TStructFieldInfo LogEntryFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz // - direct access { "time", VALTYPE_TIME64, false, OFFS_SZ_LOG(time) }, { "dbtypeid", VALTYPE_INT32, false, OFFS_SZ_LOG(dbID) }, { "profileid", VALTYPE_INT32, false, OFFS_SZ_LOG(profileID) }, { "status", VALTYPE_INT16, false, OFFS_SZ_LOG(status) }, { "mode", VALTYPE_INT16, false, OFFS_SZ_LOG(mode) }, { "dirmode", VALTYPE_INT16, false, OFFS_SZ_LOG(dirmode) }, { "locAdded", VALTYPE_INT32, false, OFFS_SZ_LOG(locAdded) }, { "locUpdated", VALTYPE_INT32, false, OFFS_SZ_LOG(locUpdated) }, { "locDeleted", VALTYPE_INT32, false, OFFS_SZ_LOG(locDeleted) }, { "remAdded", VALTYPE_INT32, false, OFFS_SZ_LOG(remAdded) }, { "remUpdated", VALTYPE_INT32, false, OFFS_SZ_LOG(remUpdated) }, { "remDeleted", VALTYPE_INT32, false, OFFS_SZ_LOG(remDeleted) }, { "inBytes", VALTYPE_INT32, false, OFFS_SZ_LOG(inBytes) }, { "outBytes", VALTYPE_INT32, false, OFFS_SZ_LOG(outBytes) }, { "locRejected", VALTYPE_INT32, false, OFFS_SZ_LOG(locRejected) }, { "remRejected", VALTYPE_INT32, false, OFFS_SZ_LOG(remRejected) }, // - procedural convenience { "dispName", VALTYPE_TEXT, false, 0, 0, &readLogDispName, NULL }, { "profileName", VALTYPE_TEXT, false, 0, 0, &readLogProfileName, NULL }, }; // get table describing the fields in the struct const TStructFieldInfo *TBinfileLogKey::getFieldsTable(void) { return LogEntryFieldInfos; } // TBinfileLogKey::getFieldsTable sInt32 TBinfileLogKey::numFields(void) { return sizeof(LogEntryFieldInfos)/sizeof(TStructFieldInfo); } // TBinfileLogKey::numFields // get actual struct base address uInt8P TBinfileLogKey::getStructAddr(void) { return (uInt8P)(fLogEntryP); } // TBinfileLogKey::getStructAddr // Log entries container key // ------------------------- // constructor TBinfileLogsKey::TBinfileLogsKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP), fLogEntryIterator(-1) { fBinfileClientConfigP = static_cast( aEngineInterfaceP->getSyncAppBase()->getRootConfig()->fAgentConfigP ); // open the log file // - get base path string filepath; fBinfileClientConfigP->getBinFilesPath(filepath); filepath += LOGFILE_DB_NAME; // - try to open fLogFile.setFileInfo(filepath.c_str(),LOGFILE_DB_VERSION,LOGFILE_DB_ID,sizeof(TLogFileEntry)); fLogFile.open(0,NULL,NULL); // Note: errors are not checked here, as no logfile is ok. We'll check before trying to read with isOpen() } // TBinfileLogsKey::TBinfileLogsKey // log entries can be opened only by reverse index (0=newest...n=oldest) TSyError TBinfileLogsKey::OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ) { // if there is no logfile, we have no entries if (!fLogFile.isOpen()) return DB_NotFound; switch (aID) { case KEYVAL_ID_FIRST: fLogEntryIterator = 0; // go to latest (last in file!) goto getnthentry; // then fetch next case KEYVAL_ID_NEXT: // increment fLogEntryIterator++; goto getnthentry; default: fLogEntryIterator=aID; getnthentry: // get n-th-last log entry as indicated by iterator // - check index range sInt32 numrecs = fLogFile.getNumRecords(); if (fLogEntryIterator<0) return LOCERR_WRONGUSAGE; if (fLogEntryIterator>=numrecs) return DB_NoContent; // - retrieve TLogFileEntry *entryP = new TLogFileEntry; if (fLogFile.readRecord(numrecs-1-fLogEntryIterator,entryP) != BFE_OK) { delete entryP; return DB_Fatal; } // - create key and return it (loaded entry gets owned by key) aSettingsKeyP = new TBinfileLogKey(fEngineInterfaceP,entryP,fBinfileClientConfigP); } return LOCERR_OK; } // TBinfileLogsKey::OpenSubkey // delete profile by ID TSyError TBinfileLogsKey::DeleteSubkey(sInt32 aID) { // log can only be cleared entirely if (aID!=KEYVAL_ID_ALL) return LOCERR_WRONGUSAGE; // erase log fLogFile.truncate(0); return LOCERR_OK; } // TBinfileLogsKey::DeleteSubkey // Binfile Agent root key // ---------------------- // Constructor TBinfileAgentRootKey::TBinfileAgentRootKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP) { } // TBinfileAgentRootKey::TBinfileAgentRootKey // open subkey by name (not by path!) // - this is the actual implementation TSyError TBinfileAgentRootKey::OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { if (strucmp(aName,"profiles",aNameSize)==0) { // allow accessing profiles only for active binfiles if ( static_cast( fEngineInterfaceP->getSyncAppBase()->getRootConfig()->fAgentConfigP )->fBinfilesActive ) { aSettingsKeyP = new TBinfileProfilesKey(fEngineInterfaceP); } else { // cannot access profiles of inactive binfile layer return LOCERR_WRONGUSAGE; } } else if (strucmp(aName,"synclogs",aNameSize)==0) aSettingsKeyP = new TBinfileLogsKey(fEngineInterfaceP); else return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; } // TBinfileAgentRootKey::OpenSubKeyByName // Client runtime settings key // --------------------------- // Constructor TBinFileAgentParamsKey::TBinFileAgentParamsKey(TEngineInterface *aEngineInterfaceP, TSyncAgent *aClientSessionP) : inherited(aEngineInterfaceP,aClientSessionP) { } // TBinFileAgentParamsKey::TBinFileAgentParamsKey // open subkey by name (not by path!) TSyError TBinFileAgentParamsKey::OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { if (strucmp(aName,"profile",aNameSize)==0) { // get binfileclient session pointer TBinfileImplClient *bfclientP = static_cast(fAgentP); // opens current session's active profile aSettingsKeyP = new TBinfileProfileKey( fEngineInterfaceP, -1, // signals passing active session's profile &bfclientP->fProfile, // pointer to the current session's profile bfclientP->fConfigP // the config ); } else return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; } // TBinFileAgentParamsKey::OpenSubKeyByName #endif // ENGINEINTERFACE_SUPPORT // Config // ====== TBinfileClientConfig::TBinfileClientConfig(TConfigElement *aParentElement) : TAgentConfig("BinFileDBClient",aParentElement) { } // TBinfileClientConfig::TBinfileClientConfig TBinfileClientConfig::~TBinfileClientConfig() { clear(); } // TBinfileClientConfig::~TBinfileClientConfig // init defaults void TBinfileClientConfig::clear(void) { // Only active in clients by default fBinfilesActive = IS_CLIENT; #ifndef HARDCODED_CONFIG // init defaults fSeparateChangelogs = true; // for engine libraries with full config, use separated changelogs by default (auto-migration w/o side effects is built-in) fBinFilesPath.erase(); #else fSeparateChangelogs = false; // for traditional hard-coded clients like WinMobile and PalmOS, use pre 3.4.0.10 behaviour (uses less memory) #endif fBinFileLog=false; // - clear inherited inherited::clear(); } // TBinfileClientConfig::clear #ifndef HARDCODED_CONFIG // config element parsing bool TBinfileClientConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - binfiles path if (strucmp(aElementName,"binfilespath")==0) expectMacroString(fBinFilesPath); else if (strucmp(aElementName,"binfilelog")==0) expectBool(fBinFileLog); else if (strucmp(aElementName,"binfilesactive")==0) expectBool(fBinfilesActive); else if (strucmp(aElementName,"separatechangelogs")==0) expectBool(fSeparateChangelogs); // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TBinfileClientConfig::localStartElement #endif // update profile record contents static uInt32 profileUpdateFunc(uInt32 aOldVersion, uInt32 aNewVersion, void *aOldRecordData, void *aNewRecordData, uInt32 aOldSize) { if (aOldVersionPROFILE_DB_VERSION) return 0; // unknown old or newer than current version, cannot update if (aNewVersion!=PROFILE_DB_VERSION) return 0; // cannot update to other version than current // create default values for profile if (aOldRecordData && aNewRecordData) { TBinfileDBSyncProfile *profileP = (TBinfileDBSyncProfile *)aNewRecordData; // make an empty default profile TBinfileClientConfig::initProfile(*profileP, "dummy", true); #if (PROFILE_DB_VERSION>=6) && (LOWEST_PROFILE_DB_VERSION<6) // copy in old version's data if (aOldVersion<=5) { // between 5 and 6, sizes of user and pw fields have all changed in size, so we need // to copy field-by-field o_TBinfileDBSyncProfile *oP=(o_TBinfileDBSyncProfile *)aOldRecordData; // now copy profileP->profileID = oP->profileID; AssignCString(profileP->profileName,oP->profileName,maxnamesiz); profileP->encoding = oP->encoding; AssignCString(profileP->serverURI,oP->serverURI,maxurisiz); AssignCString(profileP->serverUser,oP->serverUser,maxupwsiz); memcpy(profileP->serverPassword,oP->serverPassword,o_maxupwsiz); AssignCString(profileP->transportUser,oP->transportUser,maxupwsiz); memcpy(profileP->transportPassword,oP->transportPassword,o_maxupwsiz); AssignCString(profileP->socksHost,oP->socksHost,maxurisiz); AssignCString(profileP->proxyHost,oP->proxyHost,maxurisiz); profileP->sessionID = oP->sessionID; profileP->lastSyncMLVersion = oP->lastSyncMLVersion; profileP->lastAuthMethod = oP->lastAuthMethod; profileP->lastAuthFormat = oP->lastAuthFormat; AssignCString(profileP->lastNonce,oP->lastNonce,maxnoncesiz); profileP->firstuse = oP->firstuse; if (aOldVersion>=5) { // can only be OldVersion==5 // copy additional PROFILE_DB_VERSION 5 settings AssignCString(profileP->URIpath,oP->URIpath,maxpathsiz); profileP->protocol = oP->protocol; profileP->readOnlyFlags = oP->readOnlyFlags; AssignCString(profileP->localDBProfileName,oP->localDBProfileName,localDBpathMaxLen); profileP->useProxy = oP->useProxy; profileP->useConnectionProxy = oP->useConnectionProxy; // - Auto-Sync levels (3 levels, first match overrides lower level settings) profileP->AutoSyncLevel[0]=oP->AutoSyncLevel[0]; profileP->AutoSyncLevel[1]=oP->AutoSyncLevel[1]; profileP->AutoSyncLevel[2]=oP->AutoSyncLevel[2]; profileP->TimedSyncMobilePeriod = oP->TimedSyncMobilePeriod; profileP->TimedSyncCradledPeriod = oP->TimedSyncCradledPeriod; // - IPP settings are not copied, they have changed a bit between 6 and 7 } } #endif if (aOldVersion<7) { // as ippsettings have changed between 6 and 7, do not copy them, but erase them #if PROFILE_DB_VERSION>=5 profileP->ippSettings.id[0]=0; profileP->ippSettings.cred[0]=0; profileP->ippSettings.srv[0]=0; profileP->ippSettings.method=0; #endif } // From Version 7 onwards, only some fields were added at the end, so simple copy is ok if (aOldVersion==7) { memcpy(aNewRecordData,aOldRecordData,PROFILE_DB_VERSION_7_SZ); } if (aOldVersion==8) { memcpy(aNewRecordData,aOldRecordData,PROFILE_DB_VERSION_8_SZ); } /* when we have PROFILE_DB_VERSION > 9 if (aOldVersion==9) { memcpy(aNewRecordData,aOldRecordData,PROFILE_DB_VERSION_9_SZ); } */ } // updated ok (or updateable ok if no data pointers provided) return sizeof(TBinfileDBSyncProfile); } // profileUpdateFunc // update target record contents static uInt32 targetUpdateFunc(uInt32 aOldVersion, uInt32 aNewVersion, void *aOldRecordData, void *aNewRecordData, uInt32 aOldSize) { if (aOldVersionTARGETS_DB_VERSION) return 0; // unknown old version, cannot update if (aNewVersion!=TARGETS_DB_VERSION) return 0; // cannot update to other version than current // create default values for profile if (aOldRecordData && aNewRecordData) { TBinfileDBSyncTarget *targetP = (TBinfileDBSyncTarget *)aNewRecordData; // copy old data - beginning of record is identical memcpy(aNewRecordData,aOldRecordData,aOldSize); // now initialize fields that old version didn't have if (aOldVersion<4) { // init new version 4 fields targetP->resumeAlertCode = 0; // also wipe out version 3 "lastModCount", which now becomes "lastSuspendModCount" targetP->lastSuspendModCount = 0; } #if TARGETS_DB_VERSION >= 5 if (aOldVersion<5) { // init new version 5 fields AssignCString(targetP->localContainerName,NULL,localDBpathMaxLen); } #endif #if TARGETS_DB_VERSION >= 6 if (aOldVersion<6) { // init new version 6 fields AssignCString(targetP->dummyIdentifier1,NULL,remoteAnchorMaxLen); AssignCString(targetP->dummyIdentifier2,NULL,remoteAnchorMaxLen); AssignCString(targetP->remoteDBdispName,NULL,dispNameMaxLen); AssignCString(targetP->filterCapDesc,NULL,filterCapDescMaxLen); AssignCString(targetP->remoteFilters,NULL,filterExprMaxLen); AssignCString(targetP->localFilters,NULL,filterExprMaxLen); } #endif } // updated ok (or updateable ok if no data pointers provided) // - return size of new record return sizeof(TBinfileDBSyncTarget); } // targetUpdateFunc // get path where to store binfiles void TBinfileClientConfig::getBinFilesPath(string &aPath) { #ifndef HARDCODED_CONFIG if (!fBinFilesPath.empty()) aPath = fBinFilesPath; else #endif { // use appdata directory as defined by the current platform/OS if (!getPlatformString(pfs_appdata_path,aPath)) { // we have no path aPath.erase(); } } // make OS path of it (if not empty) and create directory if not existing yet if (!aPath.empty()) { // make sure it exists makeOSDirPath(aPath,true); } }; // TBinfileClientConfig::getBinFilesPath // open settings databases localstatus TBinfileClientConfig::openSettingsDatabases(bool aDoLoose) { if (!fBinfilesActive) { // databases can be opened only with active binfiles layer return LOCERR_WRONGUSAGE; } else { // safe for calling more than once if (fProfileBinFile.isOpen() && fTargetsBinFile.isOpen()) return LOCERR_OK; // already open - ok // open profile and targets databases // - get base path string basepath; getBinFilesPath(basepath); string usedpath; bool newprofiles=false; bferr err; // - profiles usedpath=basepath + PROFILE_DB_NAME; fProfileBinFile.setFileInfo(usedpath.c_str(),PROFILE_DB_VERSION,PROFILE_DB_ID,sizeof(TBinfileDBSyncProfile)); err = fProfileBinFile.open(0,NULL,profileUpdateFunc); if (err!=BFE_OK) { // create new one or overwrite incompatible one if allowed if (aDoLoose || err!=BFE_BADVERSION) { err=fProfileBinFile.create(sizeof(TBinfileDBSyncProfile),0,NULL,true); newprofiles=true; } else { // would create new file due to bad (newer or non-upgradeable older) version return LOCERR_CFGPARSE; // this is kind of a config parsing error } } // - targets usedpath=basepath + TARGETS_DB_NAME; fTargetsBinFile.setFileInfo(usedpath.c_str(),TARGETS_DB_VERSION,TARGETS_DB_ID,sizeof(TBinfileDBSyncTarget)); err = fTargetsBinFile.open(0,NULL,targetUpdateFunc); if (err!=BFE_OK || newprofiles) { // create new one or overwrite incompatible one // also ALWAYS create new targets if we HAVE created new profiles if (aDoLoose || newprofiles || err!=BFE_BADVERSION) { err=fTargetsBinFile.create(sizeof(TBinfileDBSyncTarget),0,NULL,true); } else { // would create new file due to bad (newer or non-upgradeable older) version return LOCERR_CFGPARSE; // this is kind of a config parsing error } } return err; } } // TBinfileClientConfig::openSettingsDatabases // close settings databases void TBinfileClientConfig::closeSettingsDatabases(void) { // open profile and targets databases fProfileBinFile.close(); fTargetsBinFile.close(); } // TBinfileClientConfig::closeSettingsDatabases // resolve void TBinfileClientConfig::localResolve(bool aLastPass) { // resolve inherited inherited::localResolve(aLastPass); } // TBinfileClientConfig::localResolve // MUST be called after creating config to load (or pre-load) variable parts of config // such as binfile profiles. If aDoLoose==false, situations, where existing config // is detected but cannot be re-used will return an error. With aDoLoose==true, config // files etc. are created even if it means a loss of data. localstatus TBinfileClientConfig::loadVarConfig(bool aDoLoose) { // let inherited to it's stuff localstatus err=inherited::loadVarConfig(aDoLoose); if (fBinfilesActive) { // now do my own stuff if (err==LOCERR_OK) { err=openSettingsDatabases(aDoLoose); } } // return status return err; } // TBinfileClientConfig::loadVarConfig // save app state (such as settings in datastore configs etc.) void TBinfileClientConfig::saveAppState(void) { if (fBinfilesActive) { // close and re-open the settings binfiles to make sure their // contents is permanently saved closeSettingsDatabases(); openSettingsDatabases(false); } } // TBinfileClientConfig::saveAppState // API for settings management // initialize a new-created profile database void TBinfileClientConfig::initProfileDb(void) { // create default profile newProfile("Default",true); } // TBinfileClientConfig::initProfileDb // Defaults for profile #ifndef DEFAULT_ENCODING #define DEFAULT_ENCODING SML_WBXML #endif #ifndef DEFAULT_SERVER_URI #define DEFAULT_SERVER_URI NULL #endif #ifndef DEFAULT_URI_PATH #define DEFAULT_URI_PATH NULL #endif #ifndef DEFAULT_SERVER_USER #define DEFAULT_SERVER_USER NULL #endif #ifndef DEFAULT_SERVER_PASSWD #define DEFAULT_SERVER_PASSWD NULL #endif #ifndef DEFAULT_TRANSPORT_USER #define DEFAULT_TRANSPORT_USER NULL #endif #ifndef DEFAULT_TRANSPORT_PASSWD #define DEFAULT_TRANSPORT_PASSWD NULL #endif #ifndef DEFAULT_SOCKS_HOST #define DEFAULT_SOCKS_HOST NULL #endif #ifndef DEFAULT_PROXY_HOST #define DEFAULT_PROXY_HOST NULL #endif #ifndef DEFAULT_PROXY_USER #define DEFAULT_PROXY_USER NULL #endif #ifndef DEFAULT_PROXY_PASSWD #define DEFAULT_PROXY_PASSWD NULL #endif #ifndef DEFAULT_DATASTORES_ENABLED #define DEFAULT_DATASTORES_ENABLED false #endif #ifndef DEFAULT_LOCALDB_PROFILE #define DEFAULT_LOCALDB_PROFILE NULL #endif #ifndef DEFAULT_USESYSTEMPROXY #define DEFAULT_USESYSTEMPROXY true #endif // create new profile with targets for all configured datastores // - returns index of new profile sInt32 TBinfileClientConfig::newProfile(const char *aProfileName, bool aSetDefaults, sInt32 aTemplateProfile) { TBinfileDBSyncProfile profile; TBinfileDBSyncTarget target; sInt32 profileIndex; TBinfileDBSyncProfile templateprofile; TBinfileDBSyncTarget templatetarget; // create profile record initProfile(profile,aProfileName,aSetDefaults); #ifdef EXPIRES_AFTER_DAYS // copy date of first use (to see if someone tried to tamper with...) uInt32 vers; getSyncAppBase()->getFirstUseInfo(SYSER_VARIANT_CODE,profile.firstuse,vers); #endif // copy from template profile, if any if (aTemplateProfile>=0) { aTemplateProfile=getProfile(aTemplateProfile,templateprofile); if (aTemplateProfile>=0) { // copy user config profile.encoding=templateprofile.encoding; #ifndef HARD_CODED_SERVER_URI strncpy(profile.serverURI,templateprofile.serverURI,maxurisiz); // if hardcoded, don't copy from template #endif strncpy(profile.serverUser,templateprofile.serverUser,maxupwsiz); strncpy(profile.transportUser,templateprofile.transportUser,maxupwsiz); strncpy(profile.socksHost,templateprofile.socksHost,maxurisiz); strncpy(profile.proxyHost,templateprofile.proxyHost,maxurisiz); strncpy(profile.proxyUser,templateprofile.proxyUser,maxupwsiz); // additional proxy flags profile.useProxy=templateprofile.useProxy; profile.useConnectionProxy=templateprofile.useConnectionProxy; // improved URI settings strncpy(profile.URIpath,templateprofile.URIpath,maxpathsiz); profile.protocol=templateprofile.protocol; // feature flags profile.readOnlyFlags = 0; // no read-only flags by default profile.featureFlags=templateprofile.featureFlags; // inherit features profile.dsAvailFlags=templateprofile.dsAvailFlags; // inherit datastore availability // extras profile.transpFlags=templateprofile.transpFlags; // inherit transport related flags profile.profileFlags=templateprofile.profileFlags; // inherit general profile flags // Note: do not copy profileExtra1/2 and profileData - as these are too app specific // local DB profile (not used in PPC, only for Outlook client) strncpy(profile.localDBProfileName,templateprofile.localDBProfileName,localDBpathMaxLen); // autosync settings profile.AutoSyncLevel[0]=templateprofile.AutoSyncLevel[0]; profile.AutoSyncLevel[1]=templateprofile.AutoSyncLevel[1]; profile.AutoSyncLevel[2]=templateprofile.AutoSyncLevel[2]; // timed sync settings profile.TimedSyncMobilePeriod=templateprofile.TimedSyncMobilePeriod; profile.TimedSyncCradledPeriod=templateprofile.TimedSyncCradledPeriod; /* %%% do not copy IPP settings, these should be provisioned by the SyncML server // IPP settings (not available in all clients, but present in all profile records profile.ippSettings=templateprofile.ippSettings; */ } } #ifndef HARD_CODED_SERVER_URI // override with config-defined fixed server URL, if any if (!fServerURI.empty()) { strncpy(profile.serverURI,fServerURI.c_str(),maxurisiz); profile.readOnlyFlags = rdonly_URI; // make URI readonly } #endif // save profile record profileIndex=writeProfile(-1,profile); // create a target for each configured datastore // Note: create target also for not available datastores TLocalDSList::iterator pos; for (pos=fDatastores.begin();pos!=fDatastores.end();pos++) { if ((*pos)->isAbstractDatastore()) continue; // don't try to create targets for abstract datastores (like superdatastores) // non-abstract datastores at this point are always binfile-based by definition (this is a binfileimplclient, and this is one of its datastores) TBinfileDSConfig *cfgP = static_cast(*pos); cfgP->initTarget(target,profile.profileID,aSetDefaults ? NULL : "",aSetDefaults && DEFAULT_DATASTORES_ENABLED); // remote datastore names default to local ones, empty if not default // copy from template if (aTemplateProfile>=0) { // find matching template target sInt32 tti=findTargetIndexByDBInfo( templateprofile.profileID, // profile to search targets for cfgP->fLocalDBTypeID, NULL // can be NULL if name does not matter ); if (tti>=0) { getTarget(tti,templatetarget); // copy user config strncpy(target.remoteDBpath,templatetarget.remoteDBpath,remoteDBpathMaxLen); target.syncmode=templatetarget.syncmode; target.limit1=templatetarget.limit1; target.limit2=templatetarget.limit2; target.extras=templatetarget.extras; } } // save target record writeTarget(-1,target); } return profileIndex; } // TBinfileClientConfig::newProfile // helper static void AssignDefault(char *aCStr, bool aWithDefaults, const char *aDefault, size_t aLen) { if (aWithDefaults) AssignCString(aCStr,aDefault,aLen); else AssignCString(aCStr,NULL,aLen); } // AssignDefault // init empty profile record void TBinfileClientConfig::initProfile(TBinfileDBSyncProfile &aProfile, const char *aName, bool aWithDefaults) { // - wipe it to all zeroes to make sure we don't save any garbage under no circumstances memset((void *)&aProfile,0,sizeof(TBinfileDBSyncProfile)); // - Name if (aName==0) aName=""; strncpy(aProfile.profileName,aName,maxnamesiz); // - encoding defaults to WBXML aProfile.encoding=DEFAULT_ENCODING; AssignDefault(aProfile.serverURI,aWithDefaults, DEFAULT_SERVER_URI, maxurisiz); // - suffix (for hardcoded base URI versions) AssignDefault(aProfile.URIpath,aWithDefaults, DEFAULT_URI_PATH, maxpathsiz); #ifdef PROTOCOL_SELECTOR aProfile.protocol=PROTOCOL_SELECTOR; #else aProfile.protocol=transp_proto_uri; #endif aProfile.readOnlyFlags=0; // all read&write so far aProfile.remoteFlags=0; // no remote specifics known so far #ifdef FTRFLAGS_ALWAYS_AVAILABLE aProfile.featureFlags=FTRFLAGS_ALWAYS_AVAILABLE; // set default availability #else aProfile.featureFlags=0; // no special feature flags #endif #ifdef DSFLAGS_ALWAYS_AVAILABLE aProfile.dsAvailFlags=DSFLAGS_ALWAYS_AVAILABLE; // set default availability #else aProfile.dsAvailFlags=0; // no extra DS enabled #endif // - User name AssignDefault(aProfile.serverUser,aWithDefaults, DEFAULT_SERVER_USER, maxupwsiz); // - password, mangled assignMangledToCString(aProfile.serverPassword, (const char *)(aWithDefaults ? DEFAULT_SERVER_PASSWD : NULL), maxupwsiz,true); // - Transport user AssignDefault(aProfile.transportUser,aWithDefaults, DEFAULT_TRANSPORT_USER, maxupwsiz); // - Transport password, mangled assignMangledToCString(aProfile.transportPassword, (const char *)(aWithDefaults ? DEFAULT_TRANSPORT_PASSWD : NULL), maxupwsiz,true); // - Socks Host AssignDefault(aProfile.socksHost,aWithDefaults, DEFAULT_SOCKS_HOST, maxurisiz); // - Proxy Host AssignDefault(aProfile.proxyHost,aWithDefaults, DEFAULT_PROXY_HOST, maxurisiz); // - local DB profile name AssignDefault(aProfile.localDBProfileName,true,DEFAULT_LOCALDB_PROFILE,localDBpathMaxLen); // - additional proxy flags aProfile.useProxy=aProfile.proxyHost[0]!=0; // use if a default proxy is defined aProfile.useConnectionProxy=DEFAULT_USESYSTEMPROXY; // use proxy from connection if available // - proxy user AssignDefault(aProfile.proxyUser,aWithDefaults, DEFAULT_PROXY_USER, maxupwsiz); // - proxy password, mangled assignMangledToCString(aProfile.proxyPassword, (const char *)(aWithDefaults ? DEFAULT_PROXY_PASSWD : NULL), maxupwsiz,true); // - extra flags aProfile.transpFlags = 0; aProfile.profileFlags = 0; // - general purpose reserved fields aProfile.profileExtra1 = 0; aProfile.profileExtra2 = 0; memset(&aProfile.profileData, 0, profiledatasiz); // - automatic sync scheduling aProfile.AutoSyncLevel[0].Mode=autosync_none; // not enabled aProfile.AutoSyncLevel[0].StartDayTime=8*60; // 8:00 AM aProfile.AutoSyncLevel[0].EndDayTime=17*60; // 5:00 PM (17:00) aProfile.AutoSyncLevel[0].WeekdayMask=0x3E; // Mo-Fr aProfile.AutoSyncLevel[0].ChargeLevel=60; // 60% battery level needed aProfile.AutoSyncLevel[0].MemLevel=10; // 10% memory must be free aProfile.AutoSyncLevel[0].Flags=0; // no flags so far aProfile.AutoSyncLevel[1].Mode=autosync_none; // not enabled aProfile.AutoSyncLevel[1].StartDayTime=0; aProfile.AutoSyncLevel[1].EndDayTime=0; aProfile.AutoSyncLevel[1].WeekdayMask=0; aProfile.AutoSyncLevel[1].ChargeLevel=0; aProfile.AutoSyncLevel[1].MemLevel=0; aProfile.AutoSyncLevel[1].Flags=0; aProfile.AutoSyncLevel[2].Mode=autosync_none; // not enabled aProfile.AutoSyncLevel[2].StartDayTime=0; aProfile.AutoSyncLevel[2].EndDayTime=0; aProfile.AutoSyncLevel[2].WeekdayMask=0; aProfile.AutoSyncLevel[2].ChargeLevel=0; aProfile.AutoSyncLevel[2].MemLevel=0; aProfile.AutoSyncLevel[2].Flags=0; // Timed sync settings aProfile.TimedSyncMobilePeriod=2*60; // every 2 hours aProfile.TimedSyncCradledPeriod=15; // every 15 minutes // IPP settings aProfile.ippSettings.srv[0]=0; aProfile.ippSettings.port=0; aProfile.ippSettings.period=5*60; // 5 mins aProfile.ippSettings.path[0]=0; aProfile.ippSettings.id[0]=0; aProfile.ippSettings.method=0; // none defined aProfile.ippSettings.cred[0]=0; aProfile.ippSettings.maxinterval=0; aProfile.ippSettings.timedds[0]=0; // Internals // - session ID aProfile.sessionID=0; // - last connection's parameters (used as default for next session) aProfile.lastSyncMLVersion=syncml_vers_unknown; aProfile.lastAuthMethod=auth_none; aProfile.lastAuthFormat=fmt_chr; AssignCString(aProfile.lastNonce,NULL,maxnoncesiz); } // initProfile // checks that all profiles are complete with targets for all configured datastores // (in case of STD->PRO upgrade for example) void TBinfileClientConfig::checkProfiles(void) { for (sInt32 pidx=0; pidxPRO upgrade for example) void TBinfileClientConfig::checkProfile(sInt32 aProfileIndex) { TBinfileDBSyncProfile profile; // get profile record if (getProfile(aProfileIndex,profile)>=0) { // make sure a target exists for each configured datastore // Note: also creates targets for currently unavailable datastores (profile.dsAvailFlags, license...) TLocalDSList::iterator pos; for (pos=fDatastores.begin();pos!=fDatastores.end();pos++) { TBinfileDSConfig *cfgP = static_cast(*pos); // find matching template target findOrCreateTargetIndexByDBInfo( profile.profileID, // profile to search targets for cfgP->fLocalDBTypeID, NULL // can be NULL if name does not matter ); } } } // TBinfileClientConfig::newProfile // - write profile, returns index of profile sInt32 TBinfileClientConfig::writeProfile( sInt32 aProfileIndex, // -1 if adding new profile TBinfileDBSyncProfile &aProfile // profile ID is set to new ID in aProfile ) { uInt32 newindex=aProfileIndex; if (aProfileIndex<0) { // set new unqiue ID aProfile.profileID=fProfileBinFile.getNextUniqueID(); // create new record fProfileBinFile.newRecord(newindex,&aProfile); // make sure header is up to date (in case we terminate improperly) fProfileBinFile.flushHeader(); } else { // find record fProfileBinFile.updateRecord(aProfileIndex,&aProfile); } // return index of data return newindex; } // TBinfileClientConfig::writeProfile // - delete profile (and all of its targets) bool TBinfileClientConfig::deleteProfile(sInt32 aProfileIndex) { // remove all targets sInt32 idx; uInt32 profileID = getIDOfProfile(aProfileIndex); if (profileID==0) return false; do { // find first (still existing) target for this profile idx = findTargetIndex(profileID,0); if (idx<0) break; // no more targets // if we have separate changelogs or this is the last profile, also delete targets' changelogs if (fSeparateChangelogs || fProfileBinFile.getNumRecords()<=1) { // clean related changelogs cleanChangeLogForTarget(idx,profileID); } // delete target deleteTarget(idx); } while (true); // remove profile itself if (fProfileBinFile.deleteRecord(aProfileIndex)!=BFE_OK) return false; if (fProfileBinFile.getNumRecords()==0) { // last profile deleted, remove file itself to clean up as much as possible fProfileBinFile.closeAndDelete(); // re-create fProfileBinFile.create(sizeof(TBinfileDBSyncProfile),0,NULL,true); } else { // make sure header is up to date (in case we terminate improperly) fProfileBinFile.flushHeader(); } // return return true; } // TBinfileClientConfig::deleteProfile // - get number of existing profiles sInt32 TBinfileClientConfig::numProfiles(void) { return fProfileBinFile.getNumRecords(); } // TBinfileClientConfig::numProfiles // - get profile, returns index or -1 if no more profiles sInt32 TBinfileClientConfig::getProfile( sInt32 aProfileIndex, TBinfileDBSyncProfile &aProfile ) { if (fProfileBinFile.readRecord(aProfileIndex,&aProfile)!=BFE_OK) return -1; return aProfileIndex; } // TBinfileClientConfig::getProfile // - get index of profile by ID sInt32 TBinfileClientConfig::getProfileIndex(uInt32 aProfileID) { TBinfileDBSyncProfile profile; return getProfileByID(aProfileID,profile); } // TBinfileClientConfig::getProfileIndex // - get profile by ID, returns index or -1 if no profile found // Note: aProfile might be writte even if profile is not found sInt32 TBinfileClientConfig::getProfileByID( uInt32 aProfileID, TBinfileDBSyncProfile &aProfile ) { sInt32 aIndex=0; while (true) { aIndex = getProfile(aIndex,aProfile); if (aIndex<0) break; // not found // check ID if (aProfile.profileID == aProfileID) break; // next profile aIndex++; } return aIndex; } // TBinfileClientConfig::getProfile // - get profile index from name, returns index or -1 if no matching profile found sInt32 TBinfileClientConfig::getProfileIndexByName(cAppCharP aProfileName) { sInt32 np = numProfiles(); sInt32 pi = np; TBinfileDBSyncProfile profile; while (pi>0) { pi--; getProfile(pi,profile); if (strucmp(profile.profileName,aProfileName)==0) { return pi; // found, return index } } return -1; // not found } // TBinfileClientConfig::getProfileByName // - get ID of profile from index, 0 if none found uInt32 TBinfileClientConfig::getIDOfProfile(sInt32 aProfileIndex) { // get profile ID TBinfileDBSyncProfile profile; if (fProfileBinFile.readRecord(aProfileIndex,&profile)!=BFE_OK) return 0; return profile.profileID; } // TBinfileClientConfig::getIDOfProfile // - get last sync (earliest of lastSync of all sync-enabled targets), 0=never bool TBinfileClientConfig::getProfileLastSyncTime(uInt32 aProfileID, lineartime_t &aLastSync, bool &aZapsServer, bool &aZapsClient) { sInt32 i,targetIndex; uInt32 dbid; lineartime_t targlast; aLastSync=maxLinearTime; aZapsServer=false; aZapsClient=false; bool zs,zc; i=0; do { targetIndex=findTargetIndex(aProfileID,i++); if (targetIndex<0) break; // get last sync of this target if (getTargetLastSyncTime(targetIndex,targlast,zs,zc,dbid)) { // enabled target if (targlastisFeatureEnabled(aFeatureNo)) return false; // this feature is not enabled at all #ifdef FTRFLAGS_ALWAYS_AVAILABLE // check for profile-level enabling // - get flag for feature No uInt8 ftrflag=0; switch (aFeatureNo) { case APP_FTR_AUTOSYNC: ftrflag=ftrflg_autosync; break; case APP_FTR_IPP: ftrflag=ftrflg_dmu; break; case APP_FTR_EVENTRANGE: case APP_FTR_EMAILRANGE: ftrflag=ftrflg_range; break; default : return true; // not a profile-level feature, but it is globally on -> is enabled } // - check if generally enabled even if not in profile flags if ((ftrflag & FTRFLAGS_ALWAYS_AVAILABLE)!=0) return true; // always available (hardcoded) // - now it depends on the profile flags return (aProfileP && (aProfileP->featureFlags & ftrflag)!=0); #else // no profile level feature enabling - everything that is globally enabled is also enabled in this profile return true; #endif } // TBinfileClientConfig::isFeatureEnabled // - check for feature enabled (profile or license dependent) bool TBinfileClientConfig::isReadOnly(sInt32 aProfileIndex, uInt8 aReadOnlyMask) { TBinfileDBSyncProfile profile; if (getProfile(aProfileIndex,profile)<0) return true; // make all read-only if we have no profile else return isReadOnly(&profile, aReadOnlyMask); // check if available in this profile } // TBinfileClientConfig::isFeatureEnabled // - check for readonly (profile or license dependent) bool TBinfileClientConfig::isReadOnly(TBinfileDBSyncProfile *aProfileP, uInt8 aReadOnlyMask) { // check special hardcoded cases #ifdef HARD_CODED_DBNAMES if (aReadOnlyMask & rdonly_dbpath) return true; // with hardcoded DB names, these are ALWAYS readonly #endif #ifdef HARD_CODED_SERVER_URI if (aReadOnlyMask & rdonly_URI) return true; // with hardcoded URI, this is ALWAYS readonly #endif // just check profile flags if (!aProfileP) return true; // make all read-only if we have no profile return aProfileP->readOnlyFlags & aReadOnlyMask; // readonly if flag is set in profile } // TBinfileClientConfig::isReadOnly // - check if datastore of specified target is available // in the given profile bool TBinfileClientConfig::isTargetAvailable( TBinfileDBSyncProfile *aProfileP, uInt32 aLocalDBTypeID ) { TLocalDSList::iterator pos; for (pos=fDatastores.begin();pos!=fDatastores.end();pos++) { TBinfileDSConfig *cfgP = static_cast(*pos); if ( cfgP->fLocalDBTypeID==aLocalDBTypeID ) { // right datastore config found // - return it's availability status return cfgP->isAvailable(aProfileP); } } // datastore not found -> not available return false; } // TBinfileClientConfig::isTargetAvailable // - find available target for profile by DB ID/name. Returns target index or -1 if // DBTypeID not available in this profile/license or not implemented at all sInt32 TBinfileClientConfig::findAvailableTargetIndexByDBInfo( TBinfileDBSyncProfile *aProfileP, // profile to search targets for uInt32 aLocalDBTypeID, const char *aLocalDBName // can be NULL if name does not matter ) { if (!isTargetAvailable(aProfileP,aLocalDBTypeID)) return -1; if (!aProfileP) return -1; // no profile, no target return findOrCreateTargetIndexByDBInfo(aProfileP->profileID,aLocalDBTypeID,aLocalDBName); } // TBinfileClientConfig::findAvailableTargetIndexByDBInfo // - find target for profile by DB ID/name. Returns target index or -1 if none found sInt32 TBinfileClientConfig::findOrCreateTargetIndexByDBInfo( uInt32 aProfileID, // profile to search targets for uInt32 aLocalDBTypeID, const char *aLocalDBName // can be NULL if name does not matter ) { sInt32 targidx; TBinfileDBSyncTarget target; targidx=findTargetIndexByDBInfo(aProfileID,aLocalDBTypeID,aLocalDBName); if (targidx<0) { // does not exist yet, create it now TLocalDSList::iterator pos; for (pos=fDatastores.begin();pos!=fDatastores.end();pos++) { if ((*pos)->isAbstractDatastore()) continue; // only non-abstract datastores are guaranteed binfileds and have a target TBinfileDSConfig *cfgP = static_cast(*pos); if ( cfgP->fLocalDBTypeID==aLocalDBTypeID && (aLocalDBName==NULL || cfgP->fLocalDBPath==aLocalDBName) ) { // right datastore found cfgP->initTarget(target,aProfileID,NULL,DEFAULT_DATASTORES_ENABLED); // init default // write new target and get a index back targidx=writeTarget(-1,target); // done break; } } } return targidx; } // findOrCreateTargetIndexByDBInfo // - find target for profile by DB ID/name. Returns target index or -1 if none found sInt32 TBinfileClientConfig::findTargetIndexByDBInfo( uInt32 aProfileID, // profile to search targets for uInt32 aLocalDBTypeID, const char *aLocalDBName // can be NULL if name does not matter ) { // now search targets TBinfileDBSyncTarget target; sInt32 maxidx = fTargetsBinFile.getNumRecords(); sInt32 targidx; for (targidx=0; targidx=0) { StringObjAppendPrintf(basefilename, "_%d",aProfileID); } return basefilename; } // completely clear changelog and pending maps for specified target void TBinfileClientConfig::cleanChangeLogForTarget(sInt32 aTargetIndex, sInt32 aProfileID) { TBinfileDBSyncTarget target; getTarget(aTargetIndex,target); cleanChangeLogForDBname(target.dbname, aProfileID); } // TBinfileClientConfig::cleanChangeLogForTarget // completely clear changelog and pending maps for specified database name and profile void TBinfileClientConfig::cleanChangeLogForDBname(cAppCharP aDBName, sInt32 aProfileID) { // open changelog. Name is datastore name with _XXX_clg.bfi suffix (XXX=profileID, if negative, combined changelog/maps/pendingitem will be deleted) string basefilename = relatedDBNameBase(aDBName, aProfileID); string filename; TBinFile binfile; // delete changelog filename = basefilename + CHANGELOG_DB_SUFFIX; binfile.setFileInfo(filename.c_str(),CHANGELOG_DB_VERSION,CHANGELOG_DB_ID,0); binfile.closeAndDelete(); // delete pending maps filename = basefilename + PENDINGMAP_DB_SUFFIX; binfile.setFileInfo(filename.c_str(),PENDINGMAP_DB_VERSION,PENDINGMAP_DB_ID,0); binfile.closeAndDelete(); // delete pending item filename = basefilename + PENDINGITEM_DB_SUFFIX; binfile.setFileInfo(filename.c_str(),PENDINGITEM_DB_VERSION,PENDINGITEM_DB_ID,0); binfile.closeAndDelete(); } // TBinfileClientConfig::cleanChangeLogForDBname void TBinfileClientConfig::separateDBFile(cAppCharP aDBName, cAppCharP aDBSuffix, sInt32 aProfileID) { TBinFile sourceFile; TBinFile targetFile; string sourceName = relatedDBNameBase(aDBName, -1) + aDBSuffix; // without profile ID in name string targetName = relatedDBNameBase(aDBName, aProfileID) + aDBSuffix; // with profile ID in name sourceFile.setFileInfo(sourceName.c_str(), 0, 0, 0); targetFile.setFileInfo(targetName.c_str(), 0, 0, 0); targetFile.createAsCopyFrom(sourceFile); } // separate changelogs and other related files into separate files for each profile void TBinfileClientConfig::separateChangeLogsAndRelated(cAppCharP aDBName) { // iterate over all profiles TBinfileDBSyncProfile profile; sInt32 idx = 0; // set up original basename while (true) { idx = getProfile(idx,profile); if (idx<0) break; // no more profiles // copy all dependent files of that profile and the given database // - copy changelog separateDBFile(aDBName,CHANGELOG_DB_SUFFIX,profile.profileID); // - copy pendingmaps separateDBFile(aDBName,PENDINGMAP_DB_SUFFIX,profile.profileID); // - copy pendingitem separateDBFile(aDBName,PENDINGITEM_DB_SUFFIX,profile.profileID); // next profile idx++; } // - delete original files that were shared between profiles cleanChangeLogForDBname(aDBName,-1); } // remote provisioning (using generic code in include file) #include "clientprovisioning_inc.cpp" // Autosync mechanisms (using generic code in include file) #include "clientautosync_inc.cpp" /* * Implementation of TBinfileImplClient */ /* public TBinfileImplClient members */ TBinfileImplClient::TBinfileImplClient(TSyncAppBase *aSyncAppBaseP, TSyncSessionHandle *aSyncSessionHandleP, cAppCharP aSessionID) : TStdLogicAgent(aSyncAppBaseP, aSyncSessionHandleP, aSessionID), fConfigP(NULL) { // get config for agent TRootConfig *rootcfgP = aSyncAppBaseP->getRootConfig(); // - save direct link to agent config for easy reference fConfigP = static_cast(rootcfgP->fAgentConfigP); // - make profile invalid fProfileIndex=-1; fProfileDirty=false; // Note: Datastores are already created from config } // TBinfileImplClient::TBinfileImplClient TBinfileImplClient::~TBinfileImplClient() { // make sure everything is terminated BEFORE destruction of hierarchy begins TerminateSession(); } // TBinfileImplClient::~TBinfileImplClient // Terminate session void TBinfileImplClient::TerminateSession() { if (!fTerminated && fConfigP->fBinfilesActive) { // save profile changes if (fProfileIndex>=0 && fProfileDirty) { fConfigP->fProfileBinFile.updateRecord(fProfileIndex,&fProfile); fProfileDirty=false; fProfileIndex=-1; } // now reset session InternalResetSession(); // make sure all data is flushed fConfigP->fProfileBinFile.flushHeader(); fConfigP->fTargetsBinFile.flushHeader(); } inherited::TerminateSession(); } // TBinfileImplClient::TerminateSession #ifdef ENGINEINTERFACE_SUPPORT // set profileID to client session before doing first SessionStep void TBinfileImplClient::SetProfileSelector(uInt32 aProfileSelector) { if (aProfileSelector==0) fProfileSelectorInternal = DEFAULT_PROFILE_ID; else fProfileSelectorInternal = fConfigP->getProfileIndex(aProfileSelector); } // TBinfileImplClient::SetProfileSelector /// @brief Get new session key to access details of this session appPointer TBinfileImplClient::newSessionKey(TEngineInterface *aEngineInterfaceP) { return new TBinFileAgentParamsKey(aEngineInterfaceP,this); } // TBinfileImplClient::newSessionKey #endif // ENGINEINTERFACE_SUPPORT // Reset session void TBinfileImplClient::InternalResetSession(void) { // reset all datastores now to make sure all DB activity is done // before we possibly close session-global databases // (Note: TerminateDatastores() will be called again by TSyncSession) TerminateDatastores(); fRemoteFlags=0; // no remote-specifics enabled so far } // TBinfileImplClient::InternalResetSession // Virtual version void TBinfileImplClient::ResetSession(void) { if (fConfigP->fBinfilesActive) { // do my own stuff InternalResetSession(); } // let ancestor do its stuff TStdLogicAgent::ResetSession(); } // TBinfileImplClient::ResetSession // - load remote connect params (syncml version, type, format and last nonce) // Note: agents that can cache this information between sessions will load // last info here. void TBinfileImplClient::loadRemoteParams(void) { if (!fConfigP->fBinfilesActive || fProfileIndex<0) { // not active or no profile loaded, let ancestor handle case TStdLogicAgent::loadRemoteParams(); } else { // copy profile cached values fSyncMLVersion= fProfile.lastSyncMLVersion >= numSyncMLVersions ? syncml_vers_unknown : // if profile has higher version than we support, reset to unknown fProfile.lastSyncMLVersion; fRemoteRequestedAuth= fProfile.lastAuthMethod >= numAuthTypes ? auth_md5 : // if auth is unknown, reset to MD5 fProfile.lastAuthMethod; fRemoteRequestedAuthEnc= fProfile.lastAuthFormat >= numFmtTypes ? fmt_b64 : // if format is unknown, reset to B64 fProfile.lastAuthFormat; fRemoteNonce=fProfile.lastNonce; fRemoteFlags=fProfile.remoteFlags; // init remote specific behaviour flags from profile } // modify some behaviour based on remote flags if (fRemoteFlags & remotespecs_noDS12Filters) fServerHasSINCEBEFORE = false; // prevent auto-generated SINCE/BEFORE } // TBinfileImplClient::loadRemoteParams // - save remote connect params for use in next session (if descendant implements it) void TBinfileImplClient::saveRemoteParams(void) { if (fConfigP->fBinfilesActive && fProfileIndex>=0) { // save values to profile // - SyncML version (save it only if it is "better" than what we knew so far) if (fSyncMLVersion > fProfile.lastSyncMLVersion) { fProfile.lastSyncMLVersion=fSyncMLVersion; } fProfile.lastAuthMethod=fRemoteRequestedAuth; fProfile.lastAuthFormat=fRemoteRequestedAuthEnc; fProfile.remoteFlags=fRemoteFlags; // save remote-specific behaviour flags fProfileDirty=true; AssignCString(fProfile.lastNonce,fRemoteNonce.c_str(),maxnoncesiz); } } // TBinfileImplClient::saveRemoteParams // check remote devinf to detect special behaviour needed for some servers. localstatus TBinfileImplClient::checkRemoteSpecifics(SmlDevInfDevInfPtr_t aDevInfP, SmlDevInfDevInfPtr_t *aOverrideDevInfP) { if (fConfigP->fBinfilesActive && aDevInfP) { // check for some specific servers we KNOW they need special treatment uInt8 setFlags = 0; uInt8 clearFlags = 0; if (strnncmp(smlPCDataToCharP(aDevInfP->devid),"OracleSyncServer")==0) { // Oracle OCS // - unqiue ID even if device might have non-unique ones // - no X-nnn type params // - no DS 1.2 PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("Detected Oracle OCS Server - suppress dynamic X-nnnn TYPE params, and ")); setFlags |= remotespecs_noXTypeParams+remotespecs_noDS12Filters; #ifndef GUARANTEED_UNIQUE_DEVICID // - Oracle OCS needs unique deviceID/locURI under ALL circumstances as they do // session tracking by locURI, so we always use a hash of deviceID + username // as visible deviceID PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("OCS with device that has not guaranteed unique ID - use user+devid hash for Source LocURI")); setFlags |= remotespecs_devidWithUserHash; #else clearFlags |= remotespecs_devidWithUserHash; #endif } else if (strnncmp(smlPCDataToCharP(aDevInfP->mod), "Beehive", 7)==0) { // Oracle Beehive, starts with "Beehive", i.e. "Beehive R1" // - no DS 1.2 PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("Detected Oracle Beehive - suppress ")); setFlags |= remotespecs_noDS12Filters; clearFlags |= remotespecs_noXTypeParams+remotespecs_devidWithUserHash; } else { // make sure oracle-specific flags are cleared for all other server types clearFlags |= remotespecs_noXTypeParams+remotespecs_noDS12Filters+remotespecs_devidWithUserHash; } // now apply sInt8 newFlags = (fRemoteFlags & ~clearFlags) | setFlags; if (newFlags != fRemoteFlags) { // change of remotespecs_devidWithUserHash needs session restart bool needrestart = (newFlags & remotespecs_devidWithUserHash) != (fRemoteFlags & remotespecs_devidWithUserHash); // remote flags need to be changed fRemoteFlags = newFlags; // save them into profile saveRemoteParams(); // restart session when needed if (needrestart) { // - abort session, but have main loop retry starting it PDEBUGPRINTFX(DBG_ERROR,("Warning: must restart session with changed remotespecs_devidWithUserHash")); AbortSession(LOCERR_RESTART,true); } } } // let session handle other details return inherited::checkRemoteSpecifics(aDevInfP, aOverrideDevInfP); } // TBinfileImplClient::checkRemoteSpecifics #ifdef IPP_SUPPORT // generates custom PUT in case IPP/DMU is enabled to request settings void TBinfileImplClient::issueCustomGetPut(bool aGotDevInf, bool aSentDevInf) { if (fConfigP->fBinfilesActive) { // get autosync PUT req string string req; fConfigP->autosync_get_putrequest(req); // now create a PUT if (!req.empty()) { TPutCommand *putcommandP = new TPutCommand(this); putcommandP->setMeta(newMetaType(IPP_PARAMS_ITEM_METATYPE)); SmlItemPtr_t putItemP = putcommandP->addSourceLocItem(IPP_PARAMS_LOCURI_REQ); // - add data to item putItemP->data = newPCDataString(req.c_str()); putcommandP->allowFailure(); // do not abort session in case server does not understand the command ISSUE_COMMAND_ROOT(this,putcommandP); } } // let ancestors issue their custom gets and puts, if any inherited::issueCustomGetPut(aGotDevInf, aSentDevInf); } // TBinfileImplClient::issueCustomGetPut #endif // IPP_SUPPORT // handler of custom IPP/DMU put and result commands void TBinfileImplClient::processPutResultItem(bool aIsPut, const char *aLocUri, TSmlCommand *aPutResultsCommandP, SmlItemPtr_t aPutResultsItemP, TStatusCommand &aStatusCommand) { if (fConfigP->fBinfilesActive) { #ifdef IPP_SUPPORT // check for DMU specials if (strucmp(relativeURI(aLocUri),relativeURI(IPP_PARAMS_LOCURI_CFG))==0) { // get DMU string const char *ippstring = smlItemDataToCharP(aPutResultsItemP); PDEBUGPRINTFX(DBG_HOT,("received IPP config string: %s",ippstring)); // process it string tag,value; while (ippstring && *ippstring) { ippstring=nextTag(ippstring,tag,value); // set ipp params in current profile fConfigP->ipp_setparam(tag.c_str(),value.c_str(),fProfile.ippSettings); // make sure autosync profile copy gets updated as well if (fConfigP->fAutosyncProfileLastidx==fProfileIndex) { fConfigP->fAutosyncProfile = fProfile; // copy profile into autosync fConfigP->autosync_condchanged(); // do immediately check settings at next autosync step } // make sure profile gets saved fProfileDirty=true; } // is ok aStatusCommand.setStatusCode(200); // is ok aStatusCommand.dontSend(); // ..but do not send it (%%% as session would then end with error 9999) } else #endif #ifdef SETTINGS_PROVISIONING_VIA_PUT // check for provisioning strings arriving via PUT command if (strucmp(relativeURI(aLocUri),relativeURI(SETTINGS_LOCURI_CFG))==0) { // get provisioning string const char *provstring = smlItemDataToCharP(aPutResultsItemP); PDEBUGPRINTFX(DBG_HOT,("received settings provisioning string: %s",provstring)); // process it // - but first save current profile fConfigP->writeProfile(fProfileIndex,fProfile); // - now modify profile (may include the current profile) sInt32 activeprofile; bool provok = fConfigP->executeProvisioningString(provstring, activeprofile); // - reload current profile (possibly modified) fConfigP->getProfile(fProfileIndex,fProfile); // is ok aStatusCommand.setStatusCode(provok ? 200 : 400); // ok or bad request aStatusCommand.dontSend(); // ..but do not send it (%%% as session would then end with error 9999) } else #endif { // let ancestors process it inherited::processPutResultItem(aIsPut,aLocUri,aPutResultsCommandP,aPutResultsItemP,aStatusCommand); } } else { // let ancestors process it inherited::processPutResultItem(aIsPut,aLocUri,aPutResultsCommandP,aPutResultsItemP,aStatusCommand); } } // TBinfileImplClient::processPutResultItem #ifdef PROTOCOL_SELECTOR // Names of protocols according to TTransportProtocols const char * const Protocol_Names[num_transp_protos] = { "", // none, protocol contained in URI "http://", "https://", "wsp://", // WSP protocol "OBEX:IRDA", // OBEX/IRDA protocol "OBEX:BT", // OBEX/BT protocol "OBEX://", // OBEX/TCP protocol }; #endif // - selects a profile (returns LOCERR_NOCFG if profile not found) // Note: This call must create and initialize all datastores that // are to be synced with that profile. localstatus TBinfileImplClient::SelectProfile(uInt32 aProfileSelector, bool aAutoSyncSession) { uInt32 recidx,maxidx; // detect special tunnel session's selection bool tunnel = aProfileSelector==TUNNEL_PROFILE_ID; // select profile if active if (fConfigP->fBinfilesActive) { if (tunnel) { aProfileSelector=DEFAULT_PROFILE_ID; } // Note: profile database has already been opened in config resolve() if (aProfileSelector==DEFAULT_PROFILE_ID) { // default is first one aProfileSelector=0; } // try to load profile if (fConfigP->fProfileBinFile.readRecord(aProfileSelector,&fProfile)!=BFE_OK) goto defaultprofile; // use default // Now we have the profile fProfileIndex=aProfileSelector; fRemotepartyID=fProfile.profileID; // Set session parameters #ifdef SYNCML_ENCODING_OVERRIDE fEncoding = SYNCML_ENCODING_OVERRIDE; // we use a globally defined encoding #else fEncoding = fProfile.encoding; // we use the profile's encoding #endif #ifdef HARD_CODED_SERVER_URI // - Hard coded base URL of server fRemoteURI=DEFAULT_SERVER_URI; // always use fixed URI #else // - configured URL // check config-level fixed URI first if (!fConfigP->fServerURI.empty()) { // override server URL from fixed value in config fRemoteURI = fConfigP->fServerURI; // config if (strucmp(fProfile.serverURI,fRemoteURI.c_str())!=0) { PDEBUGPRINTFX(DBG_ERROR,("Warning - config overrides/overwrites server URL in profile")); // re-adjust profile AssignCString(fProfile.serverURI, fConfigP->fServerURI.c_str(), maxurisiz); // copy predefined URI back into profile fProfile.readOnlyFlags |= rdonly_URI; // make it read-only } } else { // use URL from profile fRemoteURI=fProfile.serverURI; } #endif // not HARD_CODED_SERVER_URI // check for URI that is a template and need inserts: size_t n; // - %%% check future other inserts here, \u should be last because if there's no \u, standard // CUSTOM_URI_SUFFIX mechanism may apply in else branch // - \u for URIpath n = fRemoteURI.find("\\u"); if (n!=string::npos) { // URIPath may only not contain any special chars that might help to inject different server URLs string up = fProfile.URIpath; if (up.find_first_of(":/?.&=%,;")!=string::npos) fRemoteURI.erase(n, 2); // no insert, invalid chars in URIpath else fRemoteURI.replace(n, 2, up); // insert URIPath instead of \u } #ifdef CUSTOM_URI_SUFFIX else { // Only if original URI is not a template // - append custom URI suffix stored in serverURI field of profile (if one is set) if (*(fProfile.URIpath)) { // - append delimiter first if one defined (CUSTOM_URI_SUFFIX not NULL) const char *p=CUSTOM_URI_SUFFIX; if (p) fRemoteURI.append(p); // - now append custom URI suffix fRemoteURI.append(fProfile.URIpath); } } #endif // CUSTOM_URI_SUFFIX #ifdef PROTOCOL_SELECTOR fRemoteURI.insert(0,Protocol_Names[fProfile.protocol]); fNoCRCPrefixLen=strlen(Protocol_Names[fProfile.protocol]); #endif // PROTOCOL_SELECTOR fServerUser=fProfile.serverUser; getUnmangled(fServerPassword,fProfile.serverPassword,maxupwsiz); // - HTTP auth fTransportUser=fProfile.transportUser; getUnmangled(fTransportPassword,fProfile.transportPassword,maxupwsiz); // - proxy fSocksHost.erase(); // default to none fProxyHost.erase(); fProxyUser.erase(); fProxyPassword.erase(); #ifdef PROXY_SUPPORT if (fProfile.useProxy) { fSocksHost=fProfile.socksHost; fProxyHost=fProfile.proxyHost; fProxyUser=fProfile.proxyUser; getUnmangled(fProxyPassword,fProfile.proxyPassword,maxupwsiz);; PDEBUGPRINTFX(DBG_TRANSP,("Sync Profile contains active proxy settings: http=%s, socks=%s, proxyuser=%s",fProxyHost.c_str(), fSocksHost.c_str(), fProxyUser.c_str())); } #endif // PROXY_SUPPORT // check for forced legacy mode fLegacyMode = fProfile.profileFlags & PROFILEFLAG_LEGACYMODE; // check for lenient mode fLenientMode = fProfile.profileFlags & PROFILEFLAG_LENIENTMODE; // - get and increment session ID and save for next session // Note: as auth retries will increment the ID as well, we inc by 5 // to avoid repeating the ID too soon fProfile.sessionID+=5; fProfileDirty=true; fClientSessionNo=fProfile.sessionID; // Note: loadRemoteParams will fetch the cached params from fProfile // Reset session after profile change (especially fRemoteURI) // and also remove any datastores we might have ResetAndRemoveDatastores(); // in case of tunnel, don't touch datastores if (tunnel) return LOCERR_OK; // Now iterate trough associated target records and create datastores maxidx=fConfigP->fTargetsBinFile.getNumRecords(); TBinfileDBSyncTarget target; for (recidx=0; recidxfTargetsBinFile.readRecord(recidx,&target)==BFE_OK) { // check if this one of my targets if (target.remotepartyID == fRemotepartyID) { // get datastore config #ifdef HARDCODED_CONFIG // - traditional method by name for old monolythic builds (to make sure we don't break anything) TBinfileDSConfig *binfiledscfgP = static_cast( getSessionConfig()->getLocalDS(target.dbname) ); #else // - newer, engine based targets should use the DBtypeID instead, to allow change of DB name without loosing config TBinfileDSConfig *binfiledscfgP = static_cast( getSessionConfig()->getLocalDS(NULL,target.localDBTypeID) ); #endif // check if we have config and if this DS is available now (profile.dsAvailFlags, DSFLAGS_ALWAYS_AVAILABLE, evtl. license...) if (binfiledscfgP && binfiledscfgP->isAvailable(&fProfile)) { // check if this DB must be synced bool syncit=false; #ifdef AUTOSYNC_SUPPORT if (aAutoSyncSession) { // target enable status is not relevant, but autosync alert is syncit = binfiledscfgP->fAutosyncForced || (binfiledscfgP->fAutosyncAlerted && target.enabled); } else { // normal session syncit = target.enabled && target.remoteDBpath[0]!=0; // and remote DB path specified binfiledscfgP->fAutosyncAlerted=false; // this is NOT an autosync session binfiledscfgP->fAutosyncForced=false; } #else syncit = target.enabled && target.remoteDBpath[0]!=0; // and remote DB path specified #endif if (syncit) { TBinfileImplDS *binfiledsP=NULL; if (binfiledscfgP) { // create datastore binfiledsP = static_cast(binfiledscfgP->newLocalDataStore(this)); } if (binfiledsP) { // copy target info to datastore for later access during sync binfiledsP->fTargetIndex=recidx; binfiledsP->fTarget=target; // determine sync mode / flags to use TSyncModes myMode; bool mySlow; #ifdef AUTOSYNC_SUPPORT if (aAutoSyncSession && binfiledscfgP->fAutosyncAlertCode!=0) { // syncmode provided from auto sync alert (e.g. SAN) bool myIsSA; TLocalEngineDS::getSyncModeFromAlertCode( binfiledscfgP->fAutosyncAlertCode, myMode, mySlow, myIsSA ); } else #endif { // take it from config myMode = target.syncmode; mySlow = target.forceSlowSync; } // clean change logs if... // ...we have separate changelog or this is the only profile // ...this is NOT a resumable session (resumable not necessarily means that it WILL be resumed) // ...we're about to slow sync if (mySlow && target.resumeAlertCode==0 && (fConfigP->fSeparateChangelogs || fConfigP->fProfileBinFile.getNumRecords()==1)) { fConfigP->cleanChangeLogForDBname(target.dbname,fProfile.profileID); } // set non-BinFile specific parameters (note that this call might // be to a derivate which uses additional info from fTarget to set sync params) binfiledsP->dsSetClientSyncParams( myMode, mySlow, target.remoteDBpath, NULL, // DB user NULL, // DB password NULL, // local path extension // %%% add filters here later!!! NULL, // filter query false // filter inclusive ); // prepare local datastore (basic init can be done here) and check availability if (binfiledsP->localDatastorePrep()) { // add to datastores for this sync fLocalDataStores.push_back(binfiledsP); } else { // silently discard (do not sync it) PDEBUGPRINTFX(DBG_ERROR,("Local Database for datastore '%s' prepares not ok -> not synced",binfiledsP->getName())); // show event (alerted for no database) SESSION_PROGRESS_EVENT( this, pev_error, binfiledscfgP, LOCERR_LOCDBNOTRDY,0,0 ); delete binfiledsP; } } } // if target DB enabled for sync } // if we have a datastore config for this target } // if target belongs to this profile } // if we can read the target record } // for all target records // ok if at least one datastore enabled; #ifdef ENGINE_LIBRARY // For engine library, check for a non-empty URL makes no // sense any more, because the app on top of libsynthesis may know how // to contact the server without an URL (for example, via some transport // which doesn't need a parameter) return fLocalDataStores.size()>0 ? LOCERR_OK : LOCERR_NOCFG; #else // for classic synthesis builds (winmobile, palmos) the app relies on // the check for a non-empty URL, so we keep it for these legacy build cases return fLocalDataStores.size()>0 && fRemoteURI.size()>0 ? LOCERR_OK : LOCERR_NOCFG; #endif } // active defaultprofile: return inherited::SelectProfile(aProfileSelector, aAutoSyncSession); } // TBinfileImplClient::SelectProfile /* end of TBinfileImplClient implementation */ } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/binfileimplclient.h0000755000373300037200000004654312424517753026526 0ustar00nightlyallusers00000000000000/** * @File binfileimplclient.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinfileImplClient * Represents a client session (agent) that saves profile, target, resume info * and optionally changelog in TBinFile binary files * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-30 : luz : created from TBinfileImplClient */ /* */ #ifndef BINFILEIMPLCLIENT_H #define BINFILEIMPLCLIENT_H // includes #include "sysync.h" #include "stdlogicagent.h" #include "binfileimplds.h" #include "engineinterface.h" #include "syncclientbase.h" #ifndef SYSYNC_CLIENT #error "binfileimplclient only makes sense with client datastores" #endif namespace sysync { // Support for EngineModule common interface // ========================================= #ifdef ENGINEINTERFACE_SUPPORT // forward class TBinfileAgentRootKey; class TBinfileClientConfig; // Engine module class class TBinfileEngineInterface : public TClientEngineInterface { typedef TClientEngineInterface inherited; public: //%%% protected: /// @brief Must be derived in engineBase derivates for generating root for the appropriate settings tree /// @return root settings object, or NULL if failure virtual TSettingsKeyImpl *newSettingsRootKey(void); #ifndef ENGINE_LIBRARY #ifdef RELEASE_VERSION #error "this is here for Q&D testing with outlook client only" #endif /// @brief returns a new application base. /// @note in engineInterface based targets, this is the replacement for the formerly /// global newSyncAppBase() factory function. virtual TSyncAppBase *newSyncAppBase(void); #endif }; // TBinfileEngineInterface // extern for accessing these in TARGETSETTING script function extern const TStructFieldInfo TargetFieldInfos[]; extern const sInt32 numTargetFieldInfos; // Binfile based target key class TBinfileTargetKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TBinfileTargetKey( TEngineInterface *aEngineInterfaceP, sInt32 aTargetIndex, TBinfileDBSyncTarget *aTargetP, TBinfileClientConfig *aBinfileClientConfigP, TBinfileDSConfig *aBinfileDSConfigP ); virtual ~TBinfileTargetKey(); TBinfileDSConfig *getBinfileDSConfig(void) { return fBinfileDSConfigP; }; TBinfileDBSyncTarget *getTarget(void) { return fTargetP; }; TBinfileClientConfig *getBinfileClientConfig(void) { return fBinfileClientConfigP; }; sInt32 getProfileID() { return fTargetP ? fTargetP->remotepartyID : KEYVAL_ID_UNKNOWN; }; protected: // return ID of this key virtual TSyError GetKeyID(sInt32 &aID); // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); private: // profile sInt32 fTargetIndex; // index for writing back profile TBinfileDBSyncTarget *fTargetP; TBinfileClientConfig *fBinfileClientConfigP; TBinfileDSConfig *fBinfileDSConfigP; }; // TBinfileTargetKey // Binfile based targets collection key class TBinfileTargetsKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TBinfileTargetsKey(TEngineInterface *aEngineInterfaceP, sInt32 aProfileID); protected: // targets can be opened only by dbtype-ID virtual TSyError OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ); private: sInt32 fProfileID; // profile ID sInt32 fTargetIterator; TBinfileClientConfig *fBinfileClientConfigP; }; // TBinfileTargetsKey #ifdef AUTOSYNC_SUPPORT // Binfile based autosync level key class TBinfileASLevelKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TBinfileASLevelKey( TEngineInterface *aEngineInterfaceP, sInt32 aLevelIndex, TBinfileDBSyncProfile *aProfileP, TBinfileClientConfig *aBinfileClientConfigP ); virtual ~TBinfileASLevelKey(); protected: // return ID of this key virtual TSyError GetKeyID(sInt32 &aID); // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); private: // profile sInt32 fLevelIndex; // level index TBinfileDBSyncProfile *fProfileP; TBinfileClientConfig *fBinfileClientConfigP; }; // TBinfileASLevelKey // Binfile based autosync levels collection key class TBinfileASLevelsKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TBinfileASLevelsKey(TEngineInterface *aEngineInterfaceP, TBinfileDBSyncProfile *aProfileP); protected: // levels can be opened only by ID virtual TSyError OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ); private: sInt32 fASLevelIterator; TBinfileDBSyncProfile *fProfileP; TBinfileClientConfig *fBinfileClientConfigP; }; // TBinfileASLevelsKey #endif // AUTOSYNC_SUPPORT // extern for accessing these in PROFILESETTING script function extern const TStructFieldInfo ProfileFieldInfos[]; extern const sInt32 numProfileFieldInfos; // Binfile based profile key class TBinfileProfileKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TBinfileProfileKey( TEngineInterface *aEngineInterfaceP, sInt32 aProfileIndex, TBinfileDBSyncProfile *aProfileP, TBinfileClientConfig *aBinfileClientConfigP ); virtual ~TBinfileProfileKey(); TBinfileClientConfig *getBinfileClientConfig(void) { return fBinfileClientConfigP; }; TBinfileDBSyncProfile *getProfile(void) { return fProfileP; }; sInt32 getProfileID() { return fProfileP ? fProfileP->profileID : KEYVAL_ID_UNKNOWN; }; protected: // return ID of this key virtual TSyError GetKeyID(sInt32 &aID); // open subkey by name (not by path!) // - this is the actual implementation virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ); // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); private: // profile sInt32 fProfileIndex; // index for writing back profile TBinfileDBSyncProfile *fProfileP; TBinfileClientConfig *fBinfileClientConfigP; }; // TBinfileProfileKey // Binfile based profiles collection key class TBinfileProfilesKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TBinfileProfilesKey(TEngineInterface *aEngineInterfaceP); virtual ~TBinfileProfilesKey(); TBinfileClientConfig *getBinfileClientConfig(void) { return fBinfileClientConfigP; }; // set iterator void setNextProfileindex(sInt32 aProfileIndex) { fProfileIterator=aProfileIndex-1; }; protected: // profiles can be opened only by ID virtual TSyError OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ); virtual TSyError DeleteSubkey(sInt32 aID); // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); private: // internal sInt32 fProfileIterator; public: // binfileconfig TBinfileClientConfig *fBinfileClientConfigP; // flag how to call loadVarConfig bool fMayLooseOldCfg; }; // TBinfileProfilesKey // Binfile based log entry key class TBinfileLogKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TBinfileLogKey( TEngineInterface *aEngineInterfaceP, TLogFileEntry *aLogEntryP, TBinfileClientConfig *aBinfileClientConfigP ); virtual ~TBinfileLogKey(); TBinfileClientConfig *getBinfileClientConfig(void) { return fBinfileClientConfigP; }; TLogFileEntry *getLogEntry(void) { return fLogEntryP; }; protected: // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); private: TLogFileEntry *fLogEntryP; TBinfileClientConfig *fBinfileClientConfigP; }; // TBinfileLogKey // Binfile based log entry collection key class TBinfileLogsKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TBinfileLogsKey(TEngineInterface *aEngineInterfaceP); protected: // targets can be opened only by dbtype-ID virtual TSyError OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ); virtual TSyError DeleteSubkey(sInt32 aID); private: // binfileconfig TBinfileClientConfig *fBinfileClientConfigP; // iterator sInt32 fLogEntryIterator; // the log file TBinFile fLogFile; }; // TBinfileLogsKey // Binfile based client settings rootkey class TBinfileAgentRootKey : public TSettingsRootKey { typedef TSettingsRootKey inherited; public: TBinfileAgentRootKey(TEngineInterface *aEngineInterfaceP); protected: // open subkey by name (not by path!) virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ); }; // TBinfileAgentRootKey #endif // ENGINEINTERFACE_SUPPORT // Config // ====== class TBinfileClientConfig: public TAgentConfig { typedef TAgentConfig inherited; public: TBinfileClientConfig(TConfigElement *aParentElement); virtual ~TBinfileClientConfig(); // API for settings management // - initialize a new-created profile database void initProfileDb(void); // - create a new profile including appropriate targets sInt32 newProfile(const char *aProfileName, bool aSetDefaults, sInt32 aTemplateProfile=-1); // - init profile record with defaults static void initProfile(TBinfileDBSyncProfile &aProfile, const char *aName, bool aWithDefaults); // - write profile, returns index of profile sInt32 writeProfile( sInt32 aProfileIndex, // -1 if adding new profile TBinfileDBSyncProfile &aProfile // profile ID is set to new ID in aProfile ); // - delete profile (and all of its targets) bool deleteProfile( sInt32 aProfileIndex ); // - get number of existing profiles sInt32 numProfiles(void); // - get profile, returns index or -1 if no more profiles sInt32 getProfile( sInt32 aProfileIndex, TBinfileDBSyncProfile &aProfile ); // - get profile index from name, returns index or -1 if no matching profile found sInt32 getProfileIndexByName(cAppCharP aProfileName); // - get profile by ID sInt32 getProfileByID( uInt32 aProfileID, TBinfileDBSyncProfile &aProfile ); sInt32 getProfileIndex(uInt32 aProfileID); // - checks that all profiles are complete with targets for all configured datastores // (in case of STD->PRO upgrade for example) void checkProfiles(void); // - checks that profile is complete with targets for all configured datastores // (in case of STD->PRO upgrade for example) void checkProfile(sInt32 aProfileIndex); // - get profile ID by index, 0 if none found uInt32 getIDOfProfile(sInt32 aProfileIndex); // - check for feature enabled (profile or license dependent) bool isFeatureEnabled(TBinfileDBSyncProfile *aProfileP, uInt16 aFeatureNo); // with profile already loaded bool isFeatureEnabled(sInt32 aProfileIndex, uInt16 aFeatureNo); // by profile index // - check for readonly parts of profile settings bool isReadOnly(TBinfileDBSyncProfile *aProfileP, uInt8 aReadOnlyMask); bool isReadOnly(sInt32 aProfileIndex, uInt8 aReadOnlyMask); // - get last sync (earliest of lastSync of all sync-enabled targets), 0=never. Returns false if no enabled targets bool getProfileLastSyncTime(uInt32 aProfileID, lineartime_t &aLastSync, bool &aZapsServer, bool &aZapsClient); // - get last sync of target, 0=never. Returns false if target not enabled bool getTargetLastSyncTime(sInt32 aTargetIndex, lineartime_t &aLastSync, bool &aZapsServer, bool &aZapsClient, uInt32 &aDBID); bool getTargetLastSyncTime(TBinfileDBSyncTarget &aTarget, lineartime_t &aLastSync, bool &aZapsServer, bool &aZapsClient, uInt32 &aDBID); // - check if datastore of specified target is available in the given profile bool isTargetAvailable(TBinfileDBSyncProfile *aProfileP, uInt32 aLocalDBTypeID); // - find available target for profile by DB ID/name. Returns target index or -1 if // DBTypeID not available in this profile/license or not implemented at all sInt32 findAvailableTargetIndexByDBInfo( TBinfileDBSyncProfile *aProfileP, // profile to search targets for uInt32 aLocalDBTypeID, const char *aLocalDBName // can be NULL if name does not matter ); // - find or create target for profile by DB ID/name. creates target if not found existing already. sInt32 findOrCreateTargetIndexByDBInfo( uInt32 aProfileID, // profile to search targets for uInt32 aLocalDBTypeID, const char *aLocalDBName // can be NULL if name does not matter ); // - find target for profile by DB ID/name. Returns target index or -1 if none found sInt32 findTargetIndexByDBInfo( uInt32 aProfileID, // profile to search targets for uInt32 aLocalDBTypeID, const char *aLocalDBName ); // - find target for profile. Returns target index or -1 if none found sInt32 findTargetIndex( uInt32 aProfileID, // profile to search targets for sInt32 aTargetSeqNum // sequence number (0..n) ); // - write target, returns index of target sInt32 writeTarget( sInt32 aTargetIndex, // -1 if adding new target const TBinfileDBSyncTarget &aTarget ); // - delete target bool deleteTarget( sInt32 aTargetIndex ); // - get target info sInt32 getTarget( sInt32 aTargetIndex, TBinfileDBSyncTarget &aTarget ); // - get path where to store binfiles void getBinFilesPath(string &aPath); // activtion switch (for making it inactive e.g. in server case) bool fBinfilesActive; // separate changelogs per profile bool fSeparateChangelogs; #ifndef HARDCODED_CONFIG // - configurable path where to store binfiles string fBinFilesPath; #endif // - if set, sync log statistics are saved to binfile bool fBinFileLog; // Binary Files TBinFile fProfileBinFile; TBinFile fTargetsBinFile; // - cleanup changelog, pendingmap, pendingitem string relatedDBNameBase(cAppCharP aDBName, sInt32 aProfileID); void cleanChangeLogForTarget(sInt32 aTargetIndex, sInt32 aProfileID); void cleanChangeLogForDBname(cAppCharP aDBName, sInt32 aProfileID); void separateChangeLogsAndRelated(cAppCharP aDBName); // - called when app should save its persistent state virtual void saveAppState(void); // - MUST be called after creating config to load (or pre-load) variable parts of config // such as binfile profiles. If aDoLoose==false, situations, where existing config // is detected but cannot be re-used will return an error. With aDoLoose==true, config // files etc. are created even if it means a loss of data. virtual localstatus loadVarConfig(bool aDoLoose=false); // open and close the settings databases localstatus openSettingsDatabases(bool aDoLoose); void closeSettingsDatabases(void); private: // helper for migrating to separated changelogs/pendingmaps/pendingitem void separateDBFile(cAppCharP aDBName, cAppCharP aDBSuffix, sInt32 aProfileID); protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); virtual void localResolve(bool aLastPass); // Client provisioning declarations CLIENTPROVISIONING_CLASSDECL // Autosync declarations CLIENTAUTOSYNC_CLASSDECL }; // TBinfileClientConfig // Binary file based session class TBinfileImplClient: public TStdLogicAgent { typedef TStdLogicAgent inherited; #ifdef ENGINEINTERFACE_SUPPORT friend class TBinFileAgentParamsKey; #endif public: TBinfileImplClient(TSyncAppBase *aSyncAppBaseP, TSyncSessionHandle *aSyncSessionHandleP, cAppCharP aSessionID); /// check if active derived classes (in particular: customImplDS that CAN derive binfiles, but does not necessarily so) bool binfilesActive(void) { return fConfigP && fConfigP->fBinfilesActive; }; // - selects a profile (returns false if profile not found) // Note: This call must create and initialize all datastores that // are to be synced with that profile. virtual localstatus SelectProfile(uInt32 aProfileSelector, bool aAutoSyncSession=false); virtual ~TBinfileImplClient(); virtual void TerminateSession(void); // Terminate session, like destructor, but without actually destructing object itself virtual void ResetSession(void); // Resets session (but unlike TerminateSession, session might be re-used) void InternalResetSession(void); // static implementation for calling through virtual destructor and virtual ResetSession(); #ifdef ENGINEINTERFACE_SUPPORT // set profileID to client session before doing first SessionStep virtual void SetProfileSelector(uInt32 aProfileSelector); /// @brief Get new session key to access details of this session virtual appPointer newSessionKey(TEngineInterface *aEngineInterfaceP); #endif // ENGINEINTERFACE_SUPPORT // - load remote connect params (syncml version, type, format and last nonce) // Note: agents that can cache this information between sessions will load // last info here. virtual void loadRemoteParams(void); // - save remote connect params for use in next session (if descendant implements it) virtual void saveRemoteParams(void); // special behaviour #ifndef GUARANTEED_UNIQUE_DEVICID virtual bool devidWithUserHash(void) { return (fRemoteFlags & remotespecs_devidWithUserHash)!=0; }; // include user name to make a hash-based pseudo-device ID when flag is set #endif // - handle custom put and result commands (for remote provisioning and IPP) virtual void processPutResultItem(bool aIsPut, const char *aLocUri, TSmlCommand *aPutResultsCommandP, SmlItemPtr_t aPutResultsItemP, TStatusCommand &aStatusCommand); #ifdef IPP_SUPPORT // - called to issue custom get and put commands virtual void issueCustomGetPut(bool aGotDevInf, bool aSentDevInf); #endif // binfile agent config TBinfileClientConfig *fConfigP; // unique ID to identify info record of remote party (profile for client, deviceentry for server) uInt32 fRemotepartyID; // - check remote devinf to detect special behaviour needed for some servers. Base class // does not do anything on server level (configured rules are handled at session level) virtual localstatus checkRemoteSpecifics(SmlDevInfDevInfPtr_t aDevInfP, SmlDevInfDevInfPtr_t *aOverrideDevInfP); TBinfileDBSyncProfile fProfile; // - remote specific client behaviour flags uInt8 fRemoteFlags; // flags for remote specific behaviour (remotespecs_XXX) private: // selected profile sInt32 fProfileIndex; bool fProfileDirty; }; // TBinfileImplClient #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= // client runtime parameters class TBinFileAgentParamsKey : public TAgentParamsKey { typedef TAgentParamsKey inherited; public: TBinFileAgentParamsKey(TEngineInterface *aEngineInterfaceP, TSyncAgent *aClientSessionP); virtual ~TBinFileAgentParamsKey() {}; protected: // open subkey by name (not by path!) virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ); }; // TBinFileAgentParamsKey #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync #endif // BINFILEIMPLCLIENT_H // eof syncevolution-1.5/src/synthesis/src/sysync/binfileimplds.cpp0000755000373300037200000033364512424517753026213 0ustar00nightlyallusers00000000000000/** * @File binfileimplds.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinfileImplDS * Represents a client datastore implementation which has target management * (and optionally change log) based on binary files * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-30 : luz : created from TBinfileImplDS */ /* */ // includes #include "prefix_file.h" #include "sysync.h" #include "binfileimplclient.h" #include "binfileimplds.h" #include #if defined(BINFILE_ALWAYS_ACTIVE) && defined(SYSYNC_SERVER) #error "BINFILE_ALWAYS_ACTIVE is not compatible with server-enabled builds" #endif namespace sysync { #ifdef SCRIPT_SUPPORT // Script Functions // ================ class TBFDSfuncs { public: static TItemField *fieldFromStructField(cAppCharP aFieldName, const TStructFieldInfo *aStructFieldInfos, sInt32 aNumFields, uInt8P aStructAddr, TScriptContext *aFuncContextP) { TItemField *fldP = NULL; // search for name for (sInt32 i=0; ivalName, aFieldName)==0 && info->valSiz>0) { // found field if (info->valType==VALTYPE_TEXT) { // text fldP = newItemField(fty_string, aFuncContextP->getSessionZones()); fldP->setAsString((cAppCharP)(aStructAddr+info->fieldOffs)); return fldP; } else if (info->valType==VALTYPE_TIME64) { // timestamp fldP = newItemField(fty_timestamp, aFuncContextP->getSessionZones()); static_cast(fldP)->setTimestampAndContext( *((lineartime_t *)(aStructAddr+info->fieldOffs)), TCTX_UTC // internal timestamps are UTC ); return fldP; } else { // all other types are treated as integers fieldinteger_t fint = 0; switch(info->valSiz) { case 1 : fint = *((uInt8 *)(aStructAddr+info->fieldOffs)); break; case 2 : fint = *((uInt16 *)(aStructAddr+info->fieldOffs)); break; case 4 : fint = *((uInt32 *)(aStructAddr+info->fieldOffs)); break; case 8 : fint = *((uInt64 *)(aStructAddr+info->fieldOffs)); break; } fldP = newItemField(fty_integer, aFuncContextP->getSessionZones()); fldP->setAsInteger(fint); return fldP; } } } // no such field, return an unassigned field fldP=newItemField(fty_none, aFuncContextP->getSessionZones()); fldP->unAssign(); // make it (already is...) unassigned return fldP; } // fieldFromStructField // variant PROFILESETTING(string settingsfieldname) // returns data from profile settings (like /profiles/n does) static void func_ProfileSetting(TItemField *&aTermP, TScriptContext *aFuncContextP) { string varname; TBinfileImplDS *dsP = static_cast(aFuncContextP->getCallerContext()); // get name aFuncContextP->getLocalVar(0)->getAsString(varname); // get value aTermP = fieldFromStructField( varname.c_str(), ProfileFieldInfos, numProfileFieldInfos, (uInt8P)&(static_cast(dsP->getSession())->fProfile), aFuncContextP ); }; // func_ProfileSetting // variant TARGETSETTING(string settingsfieldname) // returns data from target settings (like /profiles/n/targets/dbid/settingsfieldname does) static void func_TargetSetting(TItemField *&aTermP, TScriptContext *aFuncContextP) { string varname; TBinfileImplDS *dsP = static_cast(aFuncContextP->getCallerContext()); // get name aFuncContextP->getLocalVar(0)->getAsString(varname); // get value aTermP = fieldFromStructField( varname.c_str(), TargetFieldInfos, numTargetFieldInfos, (uInt8P)&(dsP->fTarget), aFuncContextP ); }; // func_TargetSetting }; // TBFDSfuncs const uInt8 param_OneStr[] = { VAL(fty_string) }; const TBuiltInFuncDef BinfileDBFuncDefs[] = { { "TARGETSETTING", TBFDSfuncs::func_TargetSetting, fty_none, 1, param_OneStr }, { "PROFILESETTING", TBFDSfuncs::func_ProfileSetting, fty_none, 1, param_OneStr }, }; // chain to general ClientDB functions static void *BinfileClientDBChainFunc(void *&aCtx) { // caller context remains unchanged // -> no change needed // next table is general ClientDB func table return (void *)&ClientDBFuncTable; } // BinfileClientDBChainFunc // function table for client-only script functions const TFuncTable BinfileClientDBFuncTable = { sizeof(BinfileDBFuncDefs) / sizeof(TBuiltInFuncDef), // size of table BinfileDBFuncDefs, // table pointer BinfileClientDBChainFunc // chain to general agent funcs. }; #endif // SCRIPT_SUPPORT // Config // ====== TBinfileDSConfig::TBinfileDSConfig(const char* aName, TConfigElement *aParentElement) : TLocalDSConfig(aName,aParentElement) { // nop so far clear(); } // TBinfileDSConfig::TBinfileDSConfig TBinfileDSConfig::~TBinfileDSConfig() { // nop so far } // TBinfileDSConfig::~TBinfileDSConfig // init defaults void TBinfileDSConfig::clear(void) { // Only active in clients by default fBinfileDSActive = IS_CLIENT; // change detection by CRC is enabled by default only for builds that CAN'T have DB-side detection #ifdef CHANGEDETECTION_AVAILABLE fCRCChangeDetection = false; // normally, DB can report changes. CRC checking can be enabled as an option fCRCPseudoChangeDetection = false; // normally, DB reports changes correctly. Verifying changes can be enabled as an option #endif // init defaults fLocalDBPath.erase(); fDSAvailFlag=0; // set default according to former build-time target setting #ifdef SYNCTIME_IS_ENDOFSESSION fCmpRefTimeStampAtEnd = true; #else fCmpRefTimeStampAtEnd = false; #endif // clear inherited inherited::clear(); } // TBinfileDSConfig::clear #ifndef HARDCODED_CONFIG // config element parsing bool TBinfileDSConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"dbpath")==0) expectString(fLocalDBPath); else if (strucmp(aElementName,"dsavailflag")==0) expectUInt16(fDSAvailFlag); else if (strucmp(aElementName,"cmptimestampatend")==0) expectBool(fCmpRefTimeStampAtEnd); else if (strucmp(aElementName,"binfiledsactive")==0) expectBool(fBinfileDSActive); #ifdef CHANGEDETECTION_AVAILABLE else if (strucmp(aElementName,"crcchangedetection")==0) expectBool(fCRCChangeDetection); else if (strucmp(aElementName,"pseudochangedetection")==0) expectBool(fCRCPseudoChangeDetection); #endif // - none known here else return TLocalDSConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TBinfileDSConfig::localStartElement #endif // resolve void TBinfileDSConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings #ifdef CHANGEDETECTION_AVAILABLE // - pseudochange detection would interfere with regular CRC based change detection and is also completely useless then if (fCRCChangeDetection) fCRCPseudoChangeDetection = false; // just switch it off, makes no sense #endif } // resolve inherited inherited::localResolve(aLastPass); } // TBinfileDSConfig::localResolve // checks if datastore is available for given profile. If aProfileP is NULL, // general availability is checked (profile might allow more or less) bool TBinfileDSConfig::isAvailable(TBinfileDBSyncProfile *aProfileP) { #ifndef DSFLAGS_ALWAYS_AVAILABLE // all datastores are always available return true; #else // check if available // - %%%later: check if license allows using this datastore // %%% // - if it's one of the always available datastores, always return true if (fDSAvailFlag & DSFLAGS_ALWAYS_AVAILABLE) return true; // - check if it's enabled in the profile if (aProfileP==NULL) return false; // no profile return (aProfileP->dsAvailFlags & fDSAvailFlag)!=0; #endif } // TBinfileDSConfig::isAvailable #ifndef DEFAULT_SYNCMODE #define DEFAULT_SYNCMODE smo_twoway #endif // init default target for datastore void TBinfileDSConfig::initTarget( TBinfileDBSyncTarget &aTarget, uInt32 aRemotepartyID, const char *aRemoteName, // defaults to name of datastore bool aEnabled // enabled? ) { //set to zeros to avoid memory warnings memset(&aTarget, 0, sizeof(aTarget)); // link to the profile aTarget.remotepartyID=aRemotepartyID; // enabled or not? aTarget.enabled=aEnabled; // force slow sync (slow sync is used anyway, but shows this to user) aTarget.forceSlowSync=true; // sync mode aTarget.syncmode=DEFAULT_SYNCMODE; // reset all options aTarget.limit1=0; aTarget.limit2=0; aTarget.extras=0; // database identification aTarget.localDBTypeID=fLocalDBTypeID; // what target database AssignCString(aTarget.localDBPath,fLocalDBPath.c_str(),localDBpathMaxLen); #if defined(DESKTOP_CLIENT) || TARGETS_DB_VERSION>4 AssignCString(aTarget.localContainerName,NULL,localDBpathMaxLen); #endif // link to configuration is by datastore name AssignCString(aTarget.dbname,getName(),dbnamelen); // default name for remote datastore is same as local one if (!aRemoteName) aRemoteName=getName(); AssignCString(aTarget.remoteDBpath,aRemoteName,remoteDBpathMaxLen); // - init new target record's variables (will be updated after sync) aTarget.lastSync=0; // no last sync date yet aTarget.lastChangeCheck=0; aTarget.lastSuspendModCount=0; /// @note: before DS 1.2 enginem this was used as "lastModCount" aTarget.resumeAlertCode=0; // no resume yet aTarget.lastTwoWayModCount=0; aTarget.remoteAnchor[0]=0; // no anchor yet // Version 6 and later #if TARGETS_DB_VERSION>5 aTarget.dummyIdentifier1[0]=0; aTarget.dummyIdentifier2[0]=0; AssignCString(aTarget.remoteDBdispName, getName(), dispNameMaxLen); // default to local name aTarget.filterCapDesc[0]=0; aTarget.remoteFilters[0]=0; aTarget.localFilters[0]=0; #endif } // initTarget /* * Implementation of TBinfileImplDS */ TBinfileImplDS::TBinfileImplDS( TBinfileDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask ) : TStdLogicDS(aConfigP, aSessionP, aName, aCommonSyncCapMask) { // no changelog loaded yet (needed here because InternalResetDataStore will test it) fLoadedChangeLog=NULL; fLoadedChangeLogEntries=0; // just to make sure fHasPendingChanges=false; fPreviousToRemoteModCount=0; fPreviousSuspendModCount=0; fCurrentModCount=0; // now do internal reset InternalResetDataStore(); // save config pointer fConfigP=aConfigP; // no target loaded yet fTargetIndex=-1; } // TBinfileImplDS::TBinfileImplDS void TBinfileImplDS::dsResetDataStore(void) { // Do my normal internal reset InternalResetDataStore(); // Let ancestor initialize inherited::dsResetDataStore(); if (binfileDSActive()) { // And now force MaxGUIDSize to what this datastore can handle fMaxGUIDSize=BINFILE_MAXGUIDSIZE; } } // TBinfileImplDS::dsResetDataStore void TBinfileImplDS::InternalResetDataStore(void) { // forget preflight fPreflighted=false; // forget loaded changelog forgetChangeLog(); // no pending changes known yet fHasPendingChanges=0; // unknown number of changes fNumberOfLocalChanges=-1; } // TBinfileImplDS::InternalResetDataStore TBinfileImplDS::~TBinfileImplDS() { InternalResetDataStore(); } // TBinfileImplDS::~TBinfileImplDS // called when message processing (and probably thread) ends // (can be used to finalize things that cannot continue until next request // such as code that cannot be called from different threads) void TBinfileImplDS::dsEndOfMessage(void) { // %%% save between messages in debug #ifdef SYDEBUG //endWrite(); #endif // let ancestor do things inherited::dsEndOfMessage(); } // TBinfileImplDS::dsEndOfMessage /// inform logic of coming state change localstatus TBinfileImplDS::dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { return inherited::dsBeforeStateChange(aOldState, aNewState); } // TBinfileImplDS::dsBeforeStateChange /// inform logic of happened state change localstatus TBinfileImplDS::dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { if (aNewState == dssta_completed) { // free resources which are not valid when restarting, // in particular the change log InternalResetDataStore(); } return inherited::dsAfterStateChange(aOldState, aNewState); } // TBinfileImplDS::dsAfterStateChange // - init Sync Parameters for datastore // Derivates might override this to pre-process and modify parameters // (such as adding client settings as CGI to remoteDBPath) bool TBinfileImplDS::dsSetClientSyncParams( TSyncModes aSyncMode, bool aSlowSync, const char *aRemoteDBPath, const char *aDBUser, const char *aDBPassword, const char *aLocalPathExtension, const char *aRecordFilterQuery, bool aFilterInclusive ) { if (binfileDSActive()) { #ifdef AUTOSYNC_SUPPORT string s; bool cgi=false; // add autosync options if this is an autosync if (fConfigP->fAutosyncAlerted || fConfigP->fAutosyncForced) { if (!fConfigP->fAutosyncPathCGI.empty()) { s=aRemoteDBPath; cgi = s.find('?')!=string::npos; if (!cgi) { s+='?'; cgi=true; } s += fConfigP->fAutosyncPathCGI; aRemoteDBPath=s.c_str(); } } #endif } return inherited::dsSetClientSyncParams(aSyncMode,aSlowSync,aRemoteDBPath,aDBUser,aDBPassword,aLocalPathExtension,aRecordFilterQuery,aFilterInclusive); } // TBinfileImplDS::dsSetClientSyncParams // BinFile DB implementation specific routines // =========================================== // clean up change log // - removes chgl_deleted entries that are older or // same age as indicated by aOldestSyncModCount) // - finalizes localids localstatus TBinfileImplDS::changeLogPostflight(uInt32 aOldestSyncModCount) { // review all logentries TChangeLogEntry logentry; uInt32 logindex=0; while (true) { if (fChangeLog.readRecord(logindex,&logentry)!=BFE_OK) break; // seen all if ( (logentry.flags & chgl_deleted) && (logentry.modcount<=aOldestSyncModCount) ) { // all peers (in all profiles related to this changelog, which is only one with the separated changelogs!) // have seen this delete already, so this one should be deleted // - delete the record, another one will appear at this index fChangeLog.deleteRecord(logindex); } else { // no delete, finalize localid (possible only with string localIDs) #ifndef NUMERIC_LOCALIDS localid_out_t locID = logentry.dbrecordid; if (dsFinalizeLocalID(locID)) { // update log entry ASSIGN_LOCALID_TO_FLD(logentry.dbrecordid,LOCALID_OUT_TO_IN(locID)); fChangeLog.updateRecord(logindex, &logentry); } #endif // no delete, advance index logindex++; } } return LOCERR_OK; } // TBinfileImplDS::changeLogPostflight // zap changelog. Should be called if datastore as a entiety was replaced // by another datatstore (or created new) void TBinfileImplDS::zapChangeLog(void) { // forget cached changelog if any forgetChangeLog(); // make sure changelog file is open if (openChangeLog()) { // kill all entries fChangeLog.truncate(0); // reset modcount fChgLogHeader.modcount = 0; fChgLogHeader.lastChangeCheckIdentifier[0] = 0; fChgLogHeader.lastChangeCheck = noLinearTime; // make sure header is written fChangeLog.setExtraHeaderDirty(); fChangeLog.flushHeader(); } PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("zapChangeLog: erased changelog")); } // TBinfileImplDS::zapChangeLog // update change log record contents static uInt32 changelogUpdateFunc(uInt32 aOldVersion, uInt32 aNewVersion, void *aOldRecordData, void *aNewRecordData, uInt32 aOldSize) { if (aOldVersionCHANGELOG_DB_VERSION) return 0; // unknown old version or too new version, cannot update if (aNewVersion!=CHANGELOG_DB_VERSION) return 0; // cannot update to other version than current // create default values for profile if (aOldRecordData && aNewRecordData) { // update records TChangeLogEntry *chglogEntryP = (TChangeLogEntry *)aNewRecordData; // check for special case that old record is V2 or V3 and was compiled without CHANGEDETECTION_AVAILABLE uInt16 crc = 0; if ((aOldVersion==2 || aOldVersion==3) && aOldSize!=offsetof(TChangeLogEntry,modcount_created)) { // this means that the records were compiled without CHANGEDETECTION_AVAILABLE and had a // dataCRC field between modcount and flags //#if defined(WINCE) || #if defined(__PALM_OS__) #error "This code must be verified to check if upgrade works as intended with targets that did not have CHANGEDETECTION_AVAILABLE" #endif // - offset of the CRC field we already have int o = offsetof(TChangeLogEntry,flags); // - copy up to the CRC which is already there memcpy(aNewRecordData,aOldRecordData,o); // - get the CRC which is already there to init the new V5 DB field below crc = *((uInt16 *)((uInt8 *)aOldRecordData+o)); // - also copy the flags chglogEntryP->flags = *((uInt8 *)((uInt8 *)aOldRecordData+o+sizeof(uInt16))); // next after dataCRC chglogEntryP->dummy = *((uInt8 *)((uInt8 *)aOldRecordData+o+sizeof(uInt16)+sizeof(uInt8))); // next after flags } else { // copy old data - beginning of record is identical memcpy(aNewRecordData,aOldRecordData,aOldSize); } // now initialize fields that old version didn't have if (aOldVersion<4) { // init new version 4 fields chglogEntryP->modcount_created = 0; // assume created before changelogging history started } if (aOldVersion<5) { // init new V5 dataCRC; if we are updating from V2 or V3 (which is handled above) we'll assign the previous CRC here, 0 otherwise chglogEntryP->dataCRC = crc; } } else if (aNewRecordData) { // update extra header TChangeLogHeader *extraHeaderP = (TChangeLogHeader *)aNewRecordData; if (aOldVersion<3) { // header has got new fields between v2 and v3 // Note: these will be updated with data from target fields after actually opening the changelog // Just init them now extraHeaderP->lastChangeCheckIdentifier[0] = 0; extraHeaderP->lastChangeCheck = noLinearTime; } // updated header ok return sizeof(TChangeLogHeader); } // updated ok (or updateable ok if no data pointers provided) // - return size of new record return sizeof(TChangeLogEntry); } // changelogUpdateFunc // returns true if we had a valid changelog bool TBinfileImplDS::openChangeLog(void) { if (fChangeLog.isOpen()) return true; // was already open // open and possibly migrate the changelog TBinfileImplClient *bfcP = static_cast(fSessionP); TBinfileClientConfig *bfcfgP = static_cast(fSessionP->getSessionConfig()); // open changelog. Name is datastore name with _clg.bfi suffix string changelogname = bfcfgP->relatedDBNameBase(getName(), bfcP->fRemotepartyID); changelogname += CHANGELOG_DB_SUFFIX; fChangeLog.setFileInfo(changelogname.c_str(),CHANGELOG_DB_VERSION,CHANGELOG_DB_ID,sizeof(TChangeLogEntry)); if (fChangeLog.open(sizeof(TChangeLogHeader),&fChgLogHeader,changelogUpdateFunc)!=BFE_OK) { // can't open changelog - check if we might need need migration from united changelogs to separated if (bfcfgP->fSeparateChangelogs) { // check if we have the old united changelog and migrate everything if so string unitedchangelogname = bfcfgP->relatedDBNameBase(getName(), -1); // united name unitedchangelogname += CHANGELOG_DB_SUFFIX; fChangeLog.setFileInfo(unitedchangelogname.c_str(),CHANGELOG_DB_VERSION,CHANGELOG_DB_ID,sizeof(TChangeLogEntry)); if (fChangeLog.open(sizeof(TChangeLogHeader),&fChgLogHeader,changelogUpdateFunc)==BFE_OK) { // the old unified changelog is there - we need to do a full migration now // - close it fChangeLog.close(); // - perform migration for this DB PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("openChangeLog: auto-migrating from common to profile-separated changelog for this datastore")); bfcfgP->separateChangeLogsAndRelated(getName()); // - recursively call myself, now the profile specific log should be there return openChangeLog(); } // we're not migrating (we could not open the changelog because this is a new profile!) // - restore the per-profile name for creation of new log below fChangeLog.setFileInfo(changelogname.c_str(),CHANGELOG_DB_VERSION,CHANGELOG_DB_ID,sizeof(TChangeLogEntry)); } // create new change log or overwrite incompatible one // - init changelog header fields fChgLogHeader.modcount=0; //set all bytes to zero to avoid memory warnings memset(fChgLogHeader.lastChangeCheckIdentifier, 0, changeIndentifierMaxLen); fChgLogHeader.lastChangeCheck = noLinearTime; // - create new changelog fChangeLog.create(sizeof(TChangeLogEntry),sizeof(TChangeLogHeader),&fChgLogHeader,true); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("openChangeLog: changelog did not exist (or bad version) -> created new")); return false; // changelog is new, so we need a slow sync } else { // check if opening was an upgrade from version 2 if (fChangeLog.getFoundVersion()<3) { // version 3 has introduced saving the last-check date/identifiers in the changelog header, // before that the identifiers used where (wrongly) those of the target. So copy // the target info to the new header now. This gives perfect results only for single // profile use, but existing products before update to v3 were single profile so we can // safely assume this will give a smooth transition (without re-send-everything effects). #if TARGETS_DB_VERSION>5 // - dummyIdentifier1 is the former lastSyncIdentifier and contains the token from the // last change check towards the DB (in case sync identifiers are available at all) AssignCString(fChgLogHeader.lastChangeCheckIdentifier,fTarget.dummyIdentifier1,changeIndentifierMaxLen); #endif // - lastChangeCheck is the former lastTwoWaySync and contains the timestamp of the last change check towards the DB fChgLogHeader.lastChangeCheck = fTarget.lastChangeCheck; // - make sure it gets written back fChangeLog.setExtraHeaderDirty(); fChangeLog.flushHeader(); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("openChangeLog: upgraded changelog from V2 to V4 (new header, new modcount_created)")); } } return true; // changelog already existed, so we assume it's up-to-date } // TBinfileImplDS::openChangeLog // returns true if we had a valid pending map file bool TBinfileImplDS::openPendingMaps(void) { if (fPendingMaps.isOpen()) return true; // was already open openChangeLog(); // must be open, because it checks for migration of pendingmaps as well string pendingmapsname = static_cast(fSessionP->getSessionConfig())->relatedDBNameBase(getName(), fTarget.remotepartyID); pendingmapsname += PENDINGMAP_DB_SUFFIX; fPendingMaps.setFileInfo(pendingmapsname.c_str(),PENDINGMAP_DB_VERSION,PENDINGMAP_DB_ID, sizeof(TPendingMapEntry)); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("openPendingMaps: file name='%s'",pendingmapsname.c_str())); if (fPendingMaps.open(sizeof(TPendingMapHeader),&fPendingMapHeader)!=BFE_OK) { // create new pending maps or overwrite incompatible one // - bind to remote party (in case of combined changelog, we only have a single pendingmap file, and it is valid only for ONE remote party) fPendingMapHeader.remotepartyID = static_cast(fSessionP)->fRemotepartyID; // - create new changelog fPendingMaps.create(sizeof(TPendingMapEntry),sizeof(TPendingMapHeader),&fPendingMapHeader,true); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("openPendingMaps: pending maps did not exist (or bad version) -> created new")); return false; // pending map file is new, so we have no already pending maps } return true; // pending map file already existed, so we assume it's up-to-date } // TBinfileImplDS::openPendingMaps // get reference time to be used as reference date for this sync's modifications // Note: this time marks the beginning of the sync session. If possible // datastore should mark all modifications with this time, even if // they occur later during the sync session. Only if setting the // modified date explicitly is not possible, setting fCmpRefTimeStampAtEnd // (default = defined(SYNCTIME_IS_ENDOFSESSION)) can be used to make sure // that modifications made during the session are not detected as changed // for the next session. lineartime_t TBinfileImplDS::getThisSyncModRefTime(void) { return #ifdef SYNCTIME_IS_LOCALTIME makeLocalTimestamp(fCurrentSyncTime); // make local time for comparison #else fCurrentSyncTime; #endif } // TBinfileImplDS::getThisSyncModRefTime // get reference time to be used in case datastore implementation wants to compare // with the time of last sync (last two-way sync, that is!) lineartime_t TBinfileImplDS::getLastSyncModRefTime(void) { return #ifdef SYNCTIME_IS_LOCALTIME makeLocalTimestamp(fPreviousSyncTime); // make local time for comparison #else fPreviousSyncTime; #endif } // TBinfileImplDS::getLastSyncModRefTime // update change log using CRC checksum comparison before syncing // Note: Don't call before types are ok (we need TSyncItems) localstatus TBinfileImplDS::changeLogPreflight(bool &aValidChangelog) { localstatus sta = LOCERR_OK; aValidChangelog = false; bferr err = BFE_OK; TChangeLogEntry *existingentries = NULL; // none yet uInt32 numexistinglogentries; bool foundone; uInt32 seen = 0; uInt32 logindex; TChangeLogEntry newentry; //set zeros to avoid memory warnings memset(&newentry, 0, sizeof(newentry)); TSyncItem *itemP = NULL; localid_out_t itemLocalID; uInt16 dataCRC = 0; bool itemIsModified = false; // just in case: make sure we don't have a changelog loaded here forgetChangeLog(); // no changes detected yet fNumberOfLocalChanges=0; // make sure we have the change log DB open openChangeLog(); // - get saved modcount for this database and increment for this preflight fChgLogHeader.modcount += 1; fCurrentModCount = fChgLogHeader.modcount; // - update date of last check to start of sync - everything happening during or after this sync is for next session // Note: this is used only if not CRC_CHANGE_DETECTION fChgLogHeader.lastChangeCheck = fCurrentSyncTime; // change log header is dirty fChangeLog.setExtraHeaderDirty(); PDEBUGBLOCKCOLL("changeLogPreflight"); #ifdef SYDEBUG string lsd; StringObjTimestamp(lsd,fPreviousSyncTime); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,( "changeLogPreflight: %sfCurrentModCount=%ld, fPreviousToRemoteModCount=%ld, fPreviousSyncTime(UTC)=%s", isResuming() ? "RESUMING, " : "", (long)fCurrentModCount, (long)fPreviousToRemoteModCount, lsd.c_str() )); #endif // - force saving of header only if some entry changes bool modified=false; string origentries; // - we don't need the changelog to be updated when all we do is refresh from server if (isRefreshOnly()) goto done; // done ok // - load entire existing changelog into memory numexistinglogentries = fChangeLog.getNumRecords(); // logentries that are already there PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("changeLogPreflight: at start, changelog has %ld entries",(long)numexistinglogentries)); if (numexistinglogentries>0) { // - allocate array for all existing entries (use sysync_malloc because e.g. on PalmOS this uses special funcs to allow > 64k) size_t entriessize = sizeof(TChangeLogEntry)*numexistinglogentries; existingentries = (TChangeLogEntry *)sysync_malloc(entriessize); if (!existingentries) { err=BFE_MEMORY; goto done; } // not enough memory // - read all entries fChangeLog.readRecord(0,existingentries,numexistinglogentries); origentries.assign((char *)existingentries, entriessize); // Mark all not-yet-deleted in the log as delete candidate // (those that still exist will be get the candidate mark removed below) for (logindex=0;logindexgetLocalID(),localid); } else { // without CRC, we have got the ID into itemLocalID already localid=LOCALID_OUT_TO_IN(itemLocalID); } #endif // not RECORDHASH_FROM_DBAPI // show item info found in DB #ifdef SYDEBUG string sl; LOCALID_TO_STRING(localid,sl); if (CRC_CHANGE_DETECTION) { #ifdef RECORDHASH_FROM_DBAPI PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("changeLogPreflight: item #%ld : localid=%s, dataCRC=0x%04hX, NOC=%ld ",(long)seen,sl.c_str(),(long)fNumberOfLocalChanges,dataCRC)); #else PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("changeLogPreflight: item #%ld : localid=%s, NOC=%ld ",(long)seen,sl.c_str(),(long)fNumberOfLocalChanges)); #endif } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,( "changeLogPreflight: item #%ld : localid=%s, database says item %s modified", (long)seen,sl.c_str(), itemIsModified ? "IS" : "is NOT" )); } #endif // SYDEBUG // - search for already existing changelog entry for this uniqueID // (prevent searching those that we have created in this preflight) bool chgentryexists=false; // none found yet TChangeLogEntry *currentEntryP = NULL; // no entry yet for (logindex=0; logindexflags & chgl_delete_candidate) { currentEntryP->flags &= ~chgl_delete_candidate; // remove candidate flag } // found if (CRC_CHANGE_DETECTION) { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "- found in changelog at index=%ld, flags=0x%02hX, modcount=%ld, modcount_created=%ld, saved CRC=0x%04hX", (long)logindex, (uInt16)currentEntryP->flags, (long)currentEntryP->modcount, (long)currentEntryP->modcount_created, currentEntryP->dataCRC )); } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "- found in changelog at index=%ld, flags=0x%02hX, modcount=%ld, modcount_created=%ld", (long)logindex, (uInt16)currentEntryP->flags, (long)currentEntryP->modcount, (long)currentEntryP->modcount_created )); } break; } } // - create new record if (!chgentryexists) { // set unique ID, init other fields ASSIGN_LOCALID_TO_FLD(newentry.dbrecordid,localid); // - just init these, will be updated with real values below newentry.flags = 0; newentry.dataCRC = 0; newentry.modcount = 0; newentry.modcount_created = 0; PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("- does not yet exist in changelog, created new")); // new entry is now current entry currentEntryP = &newentry; } // now check what to do if (CRC_CHANGE_DETECTION) { #ifndef RECORDHASH_FROM_DBAPI // we need a CRC but don't have it precalculated from the DB layer dataCRC=itemP->getDataCRC(0,true); // start new CRC, do not include eqm_none fields #endif // not RECORDHASH_FROM_DBAPI } // - check if new or changed if (chgentryexists && !(currentEntryP->flags & chgl_deleted)) { // entry exists (and is not a deleted one), could be changed if (CRC_CHANGE_DETECTION) { // - check CRC to calculate itemIsModified itemIsModified = existingentries[logindex].dataCRC!=dataCRC; if (itemIsModified) { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "- item has changed (current CRC=0x%04hX, old CRC=0x%04hX)", dataCRC, currentEntryP->dataCRC )); // has changed since last time checked by preflight (but only those! There might be more items // changed since last sync or resume, but these ALREADY have a modcount in the changelog that // flags them such). // So this is the place to reset chgl_modbysync (which marks items changed by a sync and not from outside) currentEntryP->flags &= ~chgl_modbysync; // detecting a real change here cancels the mod-by-sync flag set for sync-added/changed entries // update CRC and modification count currentEntryP->dataCRC=dataCRC; currentEntryP->modcount=fCurrentModCount; // update modification count // this is a local change for this session fNumberOfLocalChanges++; // for suspend: those that detect a change here were modified AFTER last suspend, so always count them } } else { // - DB has reported change status into itemIsModified already if (itemIsModified) { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("- item has changed (according to what database says)")); // has changed since last time checked by preflight (but only those! There might be more items // changed since last sync or resume, but these ALREADY have a modcount in the changelog that // flags them such). // So this is the place to reset chgl_modbysync (which marks items changed by a sync and not from outside) currentEntryP->flags &= ~chgl_modbysync; // detecting a real change here cancels the mod-by-sync flag set for sync-added/changed entries // update modification count currentEntryP->modcount=fCurrentModCount; // this is a local change for this session fNumberOfLocalChanges++; // for suspend: those that detect a change here were modified AFTER last suspend, so always count them } } if (!itemIsModified) { // no change detected since last preflight (but still, this could be a change to report to the server) if (isResuming()) { // if resuming - only those count that are marked for resume if (currentEntryP->flags & chgl_markedforresume) fNumberOfLocalChanges++; // in resumes: only count those that are actually marked for resume } else { // not resuming - all existing ones count if this is a slow sync, // otherwise, those modified since last to-remote-sync count as well (although not modified since last preflight!) if (fSlowSync || currentEntryP->modcount>fPreviousToRemoteModCount) fNumberOfLocalChanges++; } } } else { // entry does not exist (or existed as deleted entry) -> means that this record was (maybe: re-)added new // (since last preflight, which always means also AFTER last suspend!) // - is modified now currentEntryP->modcount = fCurrentModCount; // - is (re)created now: set the creation modcount, this is used to detect a client-side newly added item currentEntryP->modcount_created = fCurrentModCount; // - no flags set currentEntryP->flags = 0; // - update CRC to current value if CRC is in use if (CRC_CHANGE_DETECTION) { currentEntryP->dataCRC = dataCRC; } else { currentEntryP->dataCRC = 0; // clean it for cosmetic reasons only } // create if entry is new if (!chgentryexists) { // this is a new, additional entry (and not a resurrected deleted one) modified=true; fChangeLog.newRecord(currentEntryP); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("- item was newly added (no entry existed in changelog before)")); } else { // the entry itself existed, but was a deleted entry. We're now re-using that one PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("- item has re-appeared (i.e. item with same local uniqueID that was once before deleted is now here again)")); } // this is a local change for this session (even for resume - we need to add newly added ones in resume!) fNumberOfLocalChanges++; } // Next item if (CRC_CHANGE_DETECTION) { #ifdef RECORDHASH_FROM_DBAPI foundone = getNextItemCRC(itemLocalID,dataCRC); #else // forget this one delete itemP; // check next foundone = getNextItem(itemP); #endif } else { #ifdef CHANGEDETECTION_AVAILABLE foundone = getNextItemInfo(itemLocalID,itemIsModified); #endif } } // while all records in DB // check that we've terminated the list because we've really seen all items and not // because of an error reading an item (which would cause false deletes) if (isDBError(lastDBError())) { sta=510; // database error goto error; } // now find and update delete candidates // (That is, all entries in the log that have no DB record associated any more) // Note: we only search logentries that were here already before the preflight, // because new ones never are delete candidates for (logindex=0;logindex mark deleted",(long)logindex)); // this is a local change for this session if (!isResuming() || (existingentries[logindex].flags & chgl_markedforresume)) fNumberOfLocalChanges++; // in resumes: only count those that are actually marked for resume } } // successfully updated in memory, now write changed entries back to binfile // Note: entries created during this preflight are already saved. Only in-memory modifications to pre-existing ones need to be saved. #ifdef SYDEBUG DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("changeLogPreflight: saving %ld existing entries",(long)numexistinglogentries)); if (DEBUGTEST(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC)) { for (uInt32 si=0; si(fSessionP)->fRemotepartyID; TBinFile *targetsBinFileP = &(static_cast(fSessionP)->fConfigP->fTargetsBinFile); // for server or version with syncrequests in config, we must try to load // the target record or create one if it is missing if (fTargetIndex<0) { // try to find target by fRemotepartyID and targetDB code/name uInt32 maxidx=targetsBinFileP->getNumRecords(); uInt32 recidx; for (recidx=0; recidxreadRecord(recidx,&fTarget)==BFE_OK) { // check if this is my target if ( fTarget.remotepartyID == remotepartyID && fTarget.localDBTypeID == fConfigP->fLocalDBTypeID && strucmp(fTarget.localDBPath,fConfigP->fLocalDBPath.c_str(),localDBpathMaxLen)==0 ) { // this is the target record for our DB, now get it (mark it busy) fTargetIndex=recidx; return LOCERR_OK; // target found } } } // target not found if (aCreateIfMissing) { // create new target record // - init with defaults fConfigP->initTarget(fTarget,remotepartyID,aRemoteDBID,true); // enabled if created here! // - save new record uInt32 ti; targetsBinFileP->newRecord(ti,&fTarget); fTargetIndex = ti; return LOCERR_OK; // created and loaded now } return 404; // not found } return LOCERR_OK; // already loaded } // TBinfileImplDS::loadTarget // - called for SyncML 1.1 if remote wants number of changes. // Must return -1 if no NOC value can be returned // NOTE: we implement it here only for server, as it is not really needed // for clients normally - if it is needed, client's agent must provide // it in derived class as StdLogicDS has no own list it can use to count // in client case. sInt32 TBinfileImplDS::getNumberOfChanges(void) { if (binfileDSActive() && IS_CLIENT) { // for client case with active binfile, we return the locally computed count // (for server, the entire list of changes is loaded by the baseclass // before NOC is needed, so the baseclass has the more accurate count // which takes filtering etc. into account). return fNumberOfLocalChanges; } // otherwise, let base class handle it (server and client w/o binfile) return inherited::getNumberOfChanges(); } bool TBinfileImplDS::hasPendingChangesForNextSync() { if (binfileDSActive() && IS_CLIENT) { // shortcut? if (fHasPendingChanges) { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("sync session known to be incomplete")); return true; } // also check change log, just to be sure; // note that new entries in the change log that were // added during the current sync session are not yet loaded, // and that entries in memory may still need to be flushed // to disk if (fLoadedChangeLog) { for (uInt32 si=0; si fCurrentModCount) { #ifdef NUMERIC_LOCALIDS PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "%ld : localID=%ld, flags=0x%X, modcount=%ld, modcount_created=%ld => pending change", (long)si, fLoadedChangeLog[si].dbrecordid, (int)fLoadedChangeLog[si].flags, (long)fLoadedChangeLog[si].modcount, (long)fLoadedChangeLog[si].modcount_created )); #else PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "%ld : localID='%s', flags=0x%X, modcount=%ld, modcount_created=%ld => pending change", (long)si, fLoadedChangeLog[si].dbrecordid, (int)fLoadedChangeLog[si].flags, (long)fLoadedChangeLog[si].modcount, (long)fLoadedChangeLog[si].modcount_created )); #endif return true; } } } return false; } return inherited::getNumberOfChanges(); } /// sync login (into this database) /// @note might be called several times (auth retries at beginning of session) /// @note must update the following saved AND current state variables /// - in TLocalEngineDS: fLastRemoteAnchor, (fLastLocalAnchor), fResumeAlertCode, fFirstTimeSync /// - for client: fPendingAddMaps /// - in TStdLogicDS: fPreviousSyncTime, fCurrentSyncTime /// - in TBinfileImplDS: ??? /// @todo document these /// - in derived classes: whatever else belongs to dsSavedAdmin and dsCurrentAdmin state localstatus TBinfileImplDS::implMakeAdminReady( cAppCharP aDeviceID, // remote device URI (device ID) cAppCharP aDatabaseID, // database ID cAppCharP aRemoteDBID // database ID of remote device ) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all localstatus sta=LOCERR_OK; // assume ok PDEBUGBLOCKDESCCOLL("implMakeAdminReady","Loading target info and pending maps"); // - init defaults fLastRemoteAnchor.erase(); fPreviousSyncTime=0; fFirstTimeSync=false; // assume not first time #if !defined(PRECONFIGURED_SYNCREQUESTS) // when sync params are in binfiles, target must be present by now - make sure it is loaded sta=loadTarget(false); // target info must already be present by now (loaded at session's SelectProfile) if (sta!=LOCERR_OK || fTargetIndex<0) { // problem loading target record sta = sta ? sta : 404; PDEBUGPRINTFX(DBG_ERROR,("Error %d loading target record",sta)); PDEBUGENDBLOCK("implMakeAdminReady"); return sta; } // we have the target in the fTarget member #else // e.g. for clients without syncrequests in config, target record might not exist here, so we allow creating it sta=loadTarget(true, aRemoteDBID); #endif // Now fTarget has valid target info // - if we don't have any remote anchor stored, this must be a first time sync if (*(fTarget.remoteAnchor)==0) fFirstTimeSync=true; // - get last anchor if (fTarget.forceSlowSync) { // - forget last anchor fLastRemoteAnchor.erase(); // make sure we get a slow sync } else { // - get last anchor fLastRemoteAnchor.assign(fTarget.remoteAnchor); } // - get last resume info fPreviousSuspendModCount = fTarget.lastSuspendModCount; /// @note: before DS 1.2 engine this was used as "lastModCount" fResumeAlertCode = fTarget.resumeAlertCode; // - get last sync time and changelog cursor fPreviousToRemoteModCount = fTarget.lastTwoWayModCount; // reference is when we've last full-synced! fPreviousSyncTime = fTarget.lastSync; PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,( "implMakeAdminReady(binfile): ResumeAlertCode=%hd, PreviousSuspendModCount=%ld, PreviousToRemoteModCount=%ld, LastRemoteAnchor='%s'", fResumeAlertCode, (long)fPreviousSuspendModCount, (long)fPreviousToRemoteModCount, fLastRemoteAnchor.c_str() )); // determine time of this sync (will be overridden in case of BASED_ON_BINFILE_CLIENT) fCurrentSyncTime=getSession()->getSystemNowAs(TCTX_UTC); // NOW ! // do some more things if we are starting sync now if (!fPreflighted) { if (!openChangeLog()) { // changelog did not exist yet // - force slow sync fTarget.forceSlowSync=true; // set target flag to force slowsync even if we repeat this fLastRemoteAnchor.erase(); fPreviousSyncTime = noLinearTime; fPreviousToRemoteModCount = 0; fPreviousSuspendModCount = 0; // - no compare references yet fPreviousToRemoteSyncCmpRef = noLinearTime; fPreviousSuspendIdentifier.erase(); } else { // Get token and date representing last update of this changelog (last preflight) // Note: towards the database, we only check for changes since the last preflight (the fPreviousToRemoteSyncCmpRef is semantically // incorrect when TCustomImplDS is used with BASED_ON_BINFILE_CLIENT on top of binfile). // The separation between changes since last-to-remote sync and last resume is done based on the changelog modcounts. // - get date of last check fPreviousToRemoteSyncCmpRef=fChgLogHeader.lastChangeCheck; fPreviousSuspendCmpRef=fPreviousToRemoteSyncCmpRef; // DB on top of binfile only needs one reference time, which is the last changelog check time. #ifdef SYDEBUG string lsd; StringObjTimestamp(lsd,fPreviousToRemoteSyncCmpRef); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("- last preflight update (fPreviousToRemoteSyncCmpRef) at %s",lsd.c_str())); #endif // SYDEBUG #if TARGETS_DB_VERSION>=6 // - DB api level change detection identifiers fPreviousToRemoteSyncIdentifier.assign(fChgLogHeader.lastChangeCheckIdentifier); fPreviousSuspendIdentifier = fPreviousToRemoteSyncIdentifier; // DB on top of binfile only needs one reference time, which is the last changelog check time. PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("- last preflight update (fPreviousToRemoteSyncIdentifier) is '%s'",fPreviousToRemoteSyncIdentifier.c_str())); #endif // TARGETS_DB_VERSION>=6 } } // get pending maps anyway (even if not resuming there might be pending maps) if(openPendingMaps()) { // there is a pending map file, check if these are really our maps // Note: with separated changelogs, this should be always the case! PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "implMakeAdminReady: remotePartyID of pendingmaps=%ld, current profile's remotepartyID=%ld", (long)fPendingMapHeader.remotepartyID, (long)static_cast(fSessionP)->fRemotepartyID )); if (fPendingMapHeader.remotepartyID == static_cast(fSessionP)->fRemotepartyID) { // these are our maps, load them TPendingMapEntry pme; string localid; for (uInt32 i=0; i(fSessionP->getSessionConfig())->relatedDBNameBase(getName(), fTarget.remotepartyID); fname += PENDINGITEM_DB_SUFFIX; pendingItemFile.setFileInfo(fname.c_str(),PENDINGITEM_DB_VERSION,PENDINGITEM_DB_ID,0); // no expected record size PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "opening pending item file: file name='%s'", fname.c_str() )); if (pendingItemFile.open(sizeof(TPendingItemHeader),&pendingItemHeader)==BFE_OK) { // we have a pending item file if (pendingItemHeader.remotepartyID == static_cast(fSessionP)->fRemotepartyID) { // this is our pending item, load it // - transfer header data fPartialItemState = pendingItemHeader.piState; // note: we always have the pi_state_loaded... state here fLastItemStatus = pendingItemHeader.lastItemStatus; fLastSourceURI = pendingItemHeader.lastSourceURI; fLastTargetURI = pendingItemHeader.lastTargetURI; fPITotalSize = pendingItemHeader.totalSize; fPIUnconfirmedSize = pendingItemHeader.unconfirmedSize; fPIStoredSize = pendingItemHeader.storedSize; // - load the data if any if (fPIStoredDataP && fPIStoredDataAllocated) smlLibFree(fPIStoredDataP); fPIStoredDataP=NULL; fPIStoredDataAllocated=false; if (fPIStoredSize) { fPIStoredDataP=smlLibMalloc(fPIStoredSize+1); // one for safety null terminator if (fPIStoredDataP) { fPIStoredDataAllocated=true; // get the data pendingItemFile.readRecord(0,fPIStoredDataP,1); *((uInt8 *)fPIStoredDataP+fPIStoredSize)=0; // safety null terminator } else { PDEBUGPRINTFX(DBG_ERROR,("Cannot allocate buffer (%ld bytes) for pendingitem",(long)fPIStoredSize)); fPIStoredSize=0; } } } PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("implMakeAdminReady: loaded pending item with %ld data bytes",(long)fPIStoredSize)); // done pendingItemFile.close(); } } // done PDEBUGENDBLOCK("implMakeAdminReady"); return sta; } // TBinfileImplDS::implMakeAdminReady localstatus TBinfileImplDS::implStartDataRead() { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all // init reading of all records // - start at beginning of log fLogEntryIndex=0; return LOCERR_OK; } // TBinfileImplDS::implStartDataRead /* %%% seems obsolete - never called from anywhere #ifdef OBJECT_FILTERING // Test Filters bool TBinfileImplDS::testFilters(TMultiFieldItem *aItemP) { return // generally suitable item for this datastore aItemP->testFilter(fLocalDBFilter.c_str()) && // and passing current sync set filter aItemP->testFilter(fSyncSetFilter.c_str()) && // and not invisible ( getDSConfig()->fInvisibleFilter.empty() || // no invisible filter means visible !aItemP->testFilter(getDSConfig()->fInvisibleFilter.c_str()) // failing invisible filter means visible too ); } // TBinfileImplDS::testFilters #endif */ /// @brief called to have all non-yet-generated sync commands as "to-be-resumed" void TBinfileImplDS::implMarkOnlyUngeneratedForResume(void) { if (!binfileDSActive()) return; // must be active when called at all TChangeLogEntry *chglogP; // simply return aEof when just refreshing if (fRefreshOnly) return; // make sure we have the changelog in memory loadChangeLog(); // check if more records uInt32 logEntryIndex=fLogEntryIndex; DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("implMarkOnlyUngeneratedForResume: total=%ld, already generated=%ld",(long)fLoadedChangeLogEntries,(long)logEntryIndex)); // Note: already generated entries had their flag cleared when they were generated. // Some of them might already be marked now again by early markItemForResume() due to unsuccessful status // for all remaining records, check if they must be marked or not // (depends on current marked state as well if this is a resumed session already) while (logEntryIndexflags & chgl_markedforresume)) { // not marked for resume, but check if it has changed after the last suspend if (chglogP->modcount<=fPreviousSuspendModCount) { // is not marked for resume AND has not changed since last suspend markforresume=false; // not to be included in resume } } } if (markforresume) { // this item would have been reported in THIS session // now check if this should be marked for resume for NEXT session if (fSlowSync) { // slow sync mode if (chglogP->flags & chgl_deleted) { // skip deleted in slow sync markforresume=false; // not to be included in resume } } else if (!fSlowSync) { // prevent ANY reporting of items marked as receiveOnly in normal sync (but send them in slow sync!) if (chglogP->flags & chgl_receive_only) { // skip receive-only items in normal sync. So deleting or changing them locally will not send them // to the server. However after a slow sync, existing local items will be send (and possibly added, // if not already there) to the server markforresume=false; // not to be included in resume } else { // mark for resume if change to be reported markforresume=chglogP->modcount>fPreviousToRemoteModCount; } } } // now apply change of chgl_markedforresume to actual changelog entry #ifdef NUMERIC_LOCALIDS DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "implMarkOnlyUngeneratedForResume: localID=%ld new markforresume=%d, old markforresume=%d", (long)chglogP->dbrecordid, (int)markforresume, (int)((chglogP->flags & chgl_markedforresume)!=0) )); #else DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "implMarkOnlyUngeneratedForResume: localID='%s' new markforresume=%d, old markforresume=%d", chglogP->dbrecordid, (int)markforresume, (int)((chglogP->flags & chgl_markedforresume)!=0) )); #endif // update flag if (markforresume) chglogP->flags |= chgl_markedforresume; else chglogP->flags &= ~chgl_markedforresume; // Note: changelog will be saved at SaveAdminData } } // TBinfileImplDS::implMarkOnlyUngeneratedForResume // called to mark an already generated (but unsent or sent but not yet statused) item // as "to-be-resumed", by localID or remoteID (latter only in server case). void TBinfileImplDS::implMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) { if (!binfileDSActive()) return; // must be active when called at all // make sure we have the changelog in memory loadChangeLog(); localid_out_t locID; STR_TO_LOCALID(aLocalID,locID); // search for item by localID uInt32 i; for (i=0; i=fLoadedChangeLogEntries) { DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "implMarkItemForResume: localID='%s': changelog entry not found", aLocalID )) } #endif } // TBinfileImplDS::implMarkItemForResume // called to mark an already sent item as "to-be-resent", e.g. due to temporary // error status conditions, by localID or remoteID (latter only in server case). void TBinfileImplDS::implMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) { if (!binfileDSActive()) return; // must be active when called at all // make sure we have the changelog in memory loadChangeLog(); localid_out_t locID; STR_TO_LOCALID(aLocalID,locID); // search for item by localID uInt32 i; for (i=0; i=fLoadedChangeLogEntries) { DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "implMarkItemForResend: localID='%s': changelog entry not found", aLocalID )) } #endif } // TBinfileImplDS::implMarkItemForResend // Get next item from database localstatus TBinfileImplDS::implGetItem( bool &aEof, bool &aChanged, // if set on entry, only changed ones will be reported, otherwise all will be returned and aChanged contains flag if entry has changed or not TSyncItem* &aSyncItemP ) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all localstatus sta=LOCERR_OK; TSyncItem *myitemP=NULL; TChangeLogEntry *chglogP; bool onlyChanged = aChanged; aEof=true; // Update change log // Note: we cannot do it earlier as we need item types setup correctly // which is not the case before here! if (!fPreflighted) { fPreflighted=true; // find and update (if not refreshing) changelog for this database bool normal=false; sta=changeLogPreflight(normal); if (sta!=LOCERR_OK) return sta; // database error } // simply return aEof when just refreshing if (fRefreshOnly) return LOCERR_OK; // make sure we have the changelog in memory loadChangeLog(); do { if (fLogEntryIndexflags & chgl_markedforresume)) { // not marked for resume, but check if it has changed after the last suspend // NOTE: this catches those added after last suspend as well, which is IMPORTANT // (otherwise, they would not get detected later, as we do not differentiate // adds and replaces (unlike in server, where new adds will be shown in the // next session after the resumed one) if (chglogP->modcount<=fPreviousSuspendModCount) { // is not marked for resume AND has not changed (or was added) since last suspend continue; // not for resume - check next } else { // New behaviour here from 3.1.5.2 onwards: // SyncML DS 1.2.1 explicitly FORBIDS that changes happening after suspending // are included in a resume. So we have to post-pone these. For that we must artificially // mark them changed such that they will be detected in next non-resume (but not before). // Note that this also affects other profiles as there is only one single changelog - // however, this is not a problem because the records detected new or changed now // will inevitably be new or changed in all other profiles as well. So we can // safely touch these record's modcount w/o any noticeable side effects in other profiles. PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Detected item changed/added after suspend -> postpone reporting it for next non-resumed session")); // - update the mod count such that this record will be detected again in the next non-resumed session // (fCurrentModCount marks entries changed in this session, +1 makes sure these will be detected in the NEXT session) chglogP->modcount=fCurrentModCount+1; // also update the creation stamp for new added item if(chglogP->modcount_created > fPreviousToRemoteModCount) { chglogP->modcount_created=fCurrentModCount+1; } // - mark it "modified by sync" to prevent it being sent during resume chglogP->flags |= chgl_modbysync; } } /* NOTE: 2007-12-17, luz: I initially added chgl_modbysync just to prevent that adds from server occurred in a suspended part of the session would be sent back to the server in the resume (as these DO get marked for resume). However, this is not a good strategy because the server cannot know which of its adds were actually successful, so the client MUST send them back to the server so the server can tell which items must be sent (possibly again) and which are definitely already stored in the client. See correspondence with Faisal from Oracle around 2007-12-17. So the chgl_modbysync flag is maintained for now, but not used for anything. */ /* NOTE: 2008-01-11, luz: THE ABOVE IS WRONG! The server CAN know which adds were successful: those for which it has received a map in the suspended session or a begin-of-session-map in the current session (or both). So we SHOULD suppress those items that have chgl_modbysync set. */ // we are resuming, prevent reporting those back that were added or changed // by one of the suspended earlier parts of this session if (chglogP->flags & chgl_modbysync) { PDEBUGPRINTFX(DBG_ADMIN+DBG_HOT,("Item not sent because it was added/changed by remote in suspended previous session or by user on device after suspend")); continue; // these must NOT be reported back during a resumed sync } } else { // make sure we clear the resume mark on ALL entries, even those not reported // (as the marks are all invalid) chglogP->flags &= ~chgl_markedforresume; // for a non-resumed slow sync, also clear all resend flags if (fSlowSync) chglogP->flags &= ~chgl_resend; } // At this point, the current entry is a candidate for being reported // (not excplicitly excluded) // - now check if and how to report it if (fSlowSync) { // slow sync mode // - skip deleted in slow sync, but report all others if (chglogP->flags & chgl_deleted) { continue; // check next } } else { // prevent ANY reporting of items marked as receiveOnly in normal sync (but send them in slow sync!) if (chglogP->flags & chgl_receive_only) { // skip receive-only items in normal sync. So deleting or changing them locally will not send them // to the server. However after a slow sync, existing local items will be send (and possibly added, // if not already there) to the server continue; } // mark those as "changed" which have really changed or have the resend flag set bool hasChanged= (chglogP->modcount>fPreviousToRemoteModCount) || // change detected (chglogP->flags & chgl_resend); // or marked for resend e.g. due to error in last session #ifdef SYDEBUG if (chglogP->flags & chgl_resend) { PDEBUGPRINTFX(DBG_ADMIN+DBG_HOT,( "Item treated as changed because resend-flag was set" )); } #endif // clear resend flag now - it is processed chglogP->flags &= ~chgl_resend; // skip unchanged ones if only changed ones are to be reported if (!hasChanged && onlyChanged) continue; // unchanged, do not report // always report changed status in aChanged aChanged=hasChanged; } // this entry is to be reported // - now check how to report if (chglogP->flags & chgl_deleted) { // deleted: only report if it is also changed (i.e. delete detected since last sync) // Note: this can only happen when caller requests to see all records, not only changed, // which usually only occurs in slowsync where deletes are NOT reported anyway. // However: when caller must dynamically filter the syncset, it will request all records // even in normal syncs and then this can happen. if (!aChanged) continue; // delete was reported earlier, don't report it again // deleted, we cannot get it from the DB, create a empty item myitemP = new TSyncItem(); // add ID ASSIGN_LOCALID_TO_ITEM(*myitemP,chglogP->dbrecordid); // deleted, syncop is delete myitemP->setSyncOp(sop_delete); } else { // get contents from the DB myitemP=NULL; // in case getItemByID should abort before pointer assigned sta = getItemByID(chglogP->dbrecordid,myitemP); if ((sta!=LOCERR_OK) || !myitemP) { // error getting record if (sta==404) { // record seems to have vanished between preflight and now PDEBUGPRINTFX(DBG_ERROR,("Record does not exist any more in database%s -> ignore",lastDBErrorText().c_str())); // simply don't include in sync set - next preflight will detect it deleted if (myitemP) delete myitemP; // delete in case we have some half-filled record here continue; // try next } else { // record does not exist PDEBUGPRINTFX(DBG_ERROR,("Error getting Record from DB%s -> Status %hd",lastDBErrorText().c_str(),sta)); goto error; } } // detect wheter the item is new added or changed if(chglogP->modcount_created > fPreviousToRemoteModCount) { // Added myitemP->setSyncOp(sop_add); } else { // Not added (changed or just reported because we want all records reported) // - if enabled, also verify change by checking CRC before reporting it (unless this is a slow sync) if (CRC_DETECT_PSEUDOCHANGES && aChanged) { // check if really changed using CRC, but only... // ...if not slow sync (all items must be reported) // ...if change was detected in this session's preflight. If the change was detected earlier and is still // pending (i.e. newer than the last sync), this means that this change might have failed to be applied // in a previous sync and thus must be reported again (but as CRC was updated in the last run, // it would be suppressed). This is a compromise that minimizes pseudochanges normally, but cannot // entirely prevent them. In other words: the first attempt to report a pseudo-change is // suppressed, but in case this sync fails, subsequent syncs will report it. uInt16 newDataCRC = myitemP->getDataCRC(0,true); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "CRC comparison for pseudo-change detection: old CRC=0x%hX, new CRC=0x%hX, recordModCount=%u, currentModCount=%u", chglogP->dataCRC, newDataCRC, chglogP->modcount, fCurrentModCount )); if (chglogP->dataCRC==newDataCRC && !fSlowSync && chglogP->modcount==fCurrentModCount) { // none of the relevant fields have changed -> don't report the item PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("Not reporting localID='%s' as changed because CRC detected this as a pseudo-change.",myitemP->getLocalID())); aChanged = false; // even if it gets reported, it does not count as changed any more if (onlyChanged) { // we don't need to report this at all, as we only report changed ones delete myitemP; // delete the item continue; // don't report, try next } // report as unchanged } else { // change will now be reported, so update CRC to what we report now // Note: the problem with this is that in case the sync does not succeed now, the CRC is already updated and would // trigger pseudo-change detection in the next session. Therefore, pseudo-change detection is only active for // changes newly detected during this sync. chglogP->dataCRC = newDataCRC; } } // CRC_DETECT_PSEUDOCHANGES // - report as replace (changed or not) myitemP->setSyncOp(sop_replace); } // make sure item has the localid which was used to retrieve it ASSIGN_LOCALID_TO_ITEM(*myitemP,chglogP->dbrecordid); } // - make sure IDs are ok myitemP->clearRemoteID(); // client never has a remote ID // record found // - items that do go out into the engine must not any longer be marked for resume (from this session) // Note: they may get marked by receiving unsuccessful status for them before session ends! chglogP->flags &= ~chgl_markedforresume; DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("Reporting localID='%s', flags=0x%x as sop=%s",myitemP->getLocalID(),(int)chglogP->flags,SyncOpNames[myitemP->getSyncOp()])); aEof=false; break; } else { // no more records break; } } while(true); // loop until record found or EOF // set item to return aSyncItemP = myitemP; // ok return LOCERR_OK; error: // general database error PDEBUGPRINTFX(DBG_ERROR,("implGetItem error %hd%s",sta,lastDBErrorText().c_str())); aSyncItemP=NULL; return sta; } // TBinfileImplDS::implGetItem // end of read localstatus TBinfileImplDS::implEndDataRead(void) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all // pass it on to the DB api (usually dummy for traditional binfile derivates, but // needed for customimplds) return apiEndDataRead(); } // TBinfileImplDS::implEndDataRead /// forget changelog in memory void TBinfileImplDS::forgetChangeLog(void) { if (fLoadedChangeLog==NULL) return; // ok, already gone PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("forgetChangeLog: DISCARDING already loaded changelog with %ld entries",(long)fLoadedChangeLogEntries)); sysync_free(fLoadedChangeLog); fLoadedChangeLog=NULL; fLoadedChangeLogEntries=0; } // TBinfileImplDS::forgetChangeLog /// load changelog into memory for quick access void TBinfileImplDS::loadChangeLog(void) { // if already loaded, simply return if (fLoadedChangeLog) return; // ok, already there // allocate memory for it fLoadedChangeLogEntries=fChangeLog.getNumRecords(); if (fLoadedChangeLogEntries>0) { // (use sysync_malloc because e.g. on PalmOS this uses special funcs to allow > 64k) fLoadedChangeLog = (TChangeLogEntry *)sysync_malloc(sizeof(TChangeLogEntry)*fLoadedChangeLogEntries); if (fLoadedChangeLog) { // now load it if (fChangeLog.readRecord(0,fLoadedChangeLog,fLoadedChangeLogEntries)==BFE_OK) { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("loadChangeLog: loaded changelog with %ld entries",(long)fLoadedChangeLogEntries)); } else { // cannot load from file, discard allocated buffer forgetChangeLog(); } } else { // not enough memory, cannot load fLoadedChangeLogEntries=0; } } } // TBinfileImplDS::loadChangeLog #define ZAP_FORCES_SLOWSYNC 1 // start of write localstatus TBinfileImplDS::implStartDataWrite(void) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all localstatus sta = LOCERR_OK; // latest chance to do preflight in case GetItem was never called if (!fPreflighted) { fPreflighted=true; // find and update (if not refreshing) changelog for this database bool normal=false; changeLogPreflight(normal); if (!normal) return LOCERR_UNDEFINED; // failure } // let api layer do it's stuff sta = apiStartDataWrite(); if (sta!=LOCERR_OK) return sta; // failed // check if we need to zap the datastore first // Note: only do it if not resuming! if (fSlowSync && fRefreshOnly && !isResuming()) { // yes, zap data sta = zapDatastore(); if (sta!=LOCERR_OK) { preventResuming(); // only half-zapped, prevent resuming (we must retry zapping ALL and then do a full slow sync anyway) return sta; // failed } // now, either zap the changelog and set this datastore to slowsync in all // other profiles or flag all entries as deleted during this sync. #ifdef ZAP_FORCES_SLOWSYNC // we force a slowsync, zap the changelog fChangeLog.truncate(0); // forget the anchor to force a slow sync anyway fTarget.remoteAnchor[0]=0; // (only to make sure. If sync completes successfully, this will be updated anyway in SaveAnchor) // for combined changelog, we need to take care of other profiles if (!static_cast(fSessionP->getSessionConfig())->fSeparateChangelogs) { // zap the anchors in all other profiles for this datastore // because we have deleted the (common) changelog. Note that this also resets our own // target's anchor (again) // get target DB TBinFile *targetsBinFileP = &(static_cast(fSessionP)->fConfigP->fTargetsBinFile); TBinfileDBSyncTarget target; // - loop trough all targets for (uInt32 ti=0; tigetNumRecords(); ti++) { targetsBinFileP->readRecord(ti,&target); if ( (target.localDBTypeID == fTarget.localDBTypeID) && // same datastoreID (strucmp(target.localDBPath,fTarget.localDBPath)==0) // ..and name ) { // this is a target of this datastore, remove saved anchor // to irreversibely force a slowsync next time target.remoteAnchor[0]=0; targetsBinFileP->updateRecord(ti,&target); } } } // if combined changelog #endif } // Load changelog as we need quick access loadChangeLog(); #ifndef ZAP_FORCES_SLOWSYNC if (fLoadedChangeLogEntries>0) { if (fSlowSync && fRefreshOnly) { // database was zapped, all existing changelog entries must be set to deleted // by this sync session. // (This is important for combined changelog, for separate changelog these entries // get obsolete anyway after this sync, but updating them for consistency is still good) for (uInt32 k=0; ksetSyncOp(aItem.getSyncOp()); // now copy retrieved contents to original item aItem = *itemP; delete itemP; } // ok return true; } // TBinfileImplDS::implRetrieveItemByID // process single item (but does not consume it) bool TBinfileImplDS::implProcessItem( TSyncItem *aItemP, // the item TStatusCommand &aStatusCommand ) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all localid_out_t newid; TSyError statuscode; localstatus sta; bool ok; bool receiveOnly=false; // default to normal two-way bool reportAsChangedInNextSync=false; bool reportAsDeletedInNextSync=false; TMultiFieldItem *augmentedItemP = NULL; SYSYNC_TRY { // - get op TSyncOperation sop = aItemP->getSyncOp(); // - get localid localid_t localid; STR_TO_LOCALID(aItemP->getLocalID(),localid); // - now perform op switch (sop) { // %%% note: sop_copy is now implemented by read/add sequence // in localdatatstore, but will be moved here later possibly case sop_add : // add record if ((sta=createItem(aItemP,newid,receiveOnly))!=LOCERR_OK) { if (sta != LOCERR_AGAIN) { PDEBUGPRINTFX(DBG_ERROR,("cannot create record in database (sta=%hd)",sta)); } // check special "needs merge" case if (sta==DB_Conflict) { // DB has detected item conflicts with data already stored in the database and // request merging current data from the backend with new data before storing. // - get the ID of the record to merge with localid = LOCALID_OUT_TO_IN(newid); ASSIGN_LOCALID_TO_ITEM(*aItemP,localid); // - merge with database contents bool changedDBVersion, changedNewVersion; augmentedItemP = mergeWithDatabaseVersion(aItemP, changedDBVersion, changedNewVersion); if (augmentedItemP==NULL) sta = DB_Error; // no item found, DB error else { // store augmented version back to DB only if modified if (changedDBVersion) { STR_TO_LOCALID(augmentedItemP->getLocalID(),localid); sta = updateItemByID(localid,augmentedItemP); // we'll need to sync it back in the next session, // because the server's copy is now older than the // client's copy if (sta == LOCERR_OK) reportAsChangedInNextSync = true; } else { sta = LOCERR_OK; } } // The server now has two items where the client only has // one. If we were to tell the server the same local ID // for both of the server's items, it would get confused. // For example, the Synthesis engine then sent a Delete // request with empty client and server ID. // // Instead, let the rest of the code below proceed (to get // the state of the existing local item right), and then // create a unique, fake local ID that we assign to the // item and copy into the change log as "deleted item". if (sta == LOCERR_OK) reportAsDeletedInNextSync = true; } else { statuscode=sta; goto error; // check errors } } // set status statuscode=201; // added // set new localID into item localid = LOCALID_OUT_TO_IN(newid); ASSIGN_LOCALID_TO_ITEM(*aItemP,localid); break; case sop_replace : // change record if ((sta=updateItemByID(localid,aItemP))!=LOCERR_OK) { if (sta != LOCERR_AGAIN) { PDEBUGPRINTFX(DBG_ERROR,("cannot update record in database (sta=%hd)",sta)); } statuscode=sta; goto error; // check errors } // set status statuscode=200; // replaced break; case sop_delete : // delete record if ((sta=deleteItemByID(localid))!=LOCERR_OK) { if (sta != LOCERR_AGAIN) { PDEBUGPRINTFX(DBG_ERROR,("cannot delete record in database (sta=%hd)",sta)); } statuscode=sta; // not found goto error; // check errors } // set status statuscode=200; break; default : PDEBUGPRINTFX(DBG_ERROR,("Unknown sync-op in TBinfileImplDS::ProcessItem")); statuscode=501; // not implemented goto error; } // switch(sop) // update changelog uInt16 crc=0; // none unless we need it if (CRC_CHANGE_DETECTION || CRC_DETECT_PSEUDOCHANGES) { // - calc new data CRC if not deleted record if (sop!=sop_delete) { // - get new CRC. Note: to avoid differences in written and readback // data to cause "changed" records, we read the item from the DB again // altough this needs a little extra CPU performance #ifdef RECORDHASH_FROM_DBAPI if (getItemCRCByID(localid,crc)!=LOCERR_OK) { // we don't find the item with that localID. // Probably it has got another localID due to DB-internal reasons // (such as POOM changing a recurring appointment) // - handle this as if it was ok. Next session's preflight will find // that the item is gone and will send a delete to server, and // will also find a new item (this one under new localid) and add // this to the server. crc=0; DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("Item has probably changed its localid during replace, CRC gets invalid")); } #else TSyncItem *readbackItemP=NULL; if (getItemByID(localid,readbackItemP)!=LOCERR_OK) { // we don't find the item with that localID. // Probably it has got another localID due to DB-internal reasons // (such as POOM changing a recurring appointment) // - handle this as if it was ok. Next session's preflight will find // that the item is gone and will send a delete to server, and // will also find a new item (this one under new localid) and add // this to the server. crc=0; DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("Item has probably changed its localid during replace, CRC gets invalid")); } else { // Note: we don't need to set localID in item as it is not used in the CRC crc = readbackItemP->getDataCRC(0,true); // start new CRC, do not include eqm_none fields } if (readbackItemP) delete readbackItemP; #endif // not RECORDHASH_FROM_DBAPI } } // - search changelog entry sInt32 logindex=-1; TChangeLogEntry newentry; TChangeLogEntry *affectedentryP = &newentry; memset(&newentry, 0, sizeof(newentry)); for (uInt32 i=0; idataCRC=crc; if (reportAsChangedInNextSync) { // make sure NEXT sync will catch this again, as stored version is different // from what we received (merged with pre-existing duplicate) affectedentryP->modcount=fCurrentModCount+1; fHasPendingChanges=true; } else { // just current mod count affectedentryP->modcount=fCurrentModCount; } if (sop==sop_delete) affectedentryP->flags |= chgl_deleted; // set receiveOnly flag if needed. Note that this flag, once set, is never deleted (so item stays write only) if (receiveOnly) affectedentryP->flags |= chgl_receive_only; // set special flag which prevents that this change gets sent back in a resume as a // "modified or added after last suspend" type record (which it technically is, but we // use the flag to prevent that it is sent back if this session is suspended and resumed later. // Note that real adds and changes happening during suspend will also get this flag set // (but also receive a modcount>fCurrentModCount that makes sure these will be reported in // the next non-resumed session). affectedentryP->flags |= chgl_modbysync; // add to changelog DB if needed if (logindex<0) { // new added item ASSIGN_LOCALID_TO_FLD(affectedentryP->dbrecordid,localid); // also record the time this entry was created affectedentryP->modcount_created=fCurrentModCount; // save it #ifdef NUMERIC_LOCALIDS DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "new entry %ld : localID=%ld, flags=0x%X, modcount=modcount_created=%ld, new dataCRC=0x%hX", (long)fChangeLog.getNumRecords(), affectedentryP->dbrecordid, (int)affectedentryP->flags, (long)affectedentryP->modcount, affectedentryP->dataCRC )); #else DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "new entry %ld : localID='%s', flags=0x%X, modcount=modcount_created=%ld, new dataCRC=0x%hX", (long)fChangeLog.getNumRecords(), affectedentryP->dbrecordid, (int)affectedentryP->flags, (long)affectedentryP->modcount, affectedentryP->dataCRC )); #endif // Note: changeLogPostflight() will check these for temporary localids and finalize them when needed fChangeLog.newRecord(affectedentryP); } if (reportAsDeletedInNextSync) { fHasPendingChanges=true; #ifdef NUMERIC_LOCALIDS // assumes that valid local IDs are positive // and can hold values in the range of -1 to -RAND_MAX-1 localid_t fakelocalid = -(rand() & 0x7FFFFFFF) - 1; #else char fakelocalid[STRING_LOCALID_MAXLEN]; static unsigned int fakeidcounter; sprintf(fakelocalid, "fake-%u-%d", ++fakeidcounter, rand()); #endif // Checking for collisions with other fake IDs would be nice, // but isn't easy because new entries in fChangeLog are not // in memory. We have to trust the random number generator // and the sequence counter (for string IDs). memset(&newentry, 0, sizeof(newentry)); ASSIGN_LOCALID_TO_FLD(newentry.dbrecordid,fakelocalid); ASSIGN_LOCALID_TO_ITEM(*aItemP,fakelocalid); newentry.flags = chgl_deleted; // send during next sync newentry.modcount_created = newentry.modcount = fCurrentModCount+1; #ifdef NUMERIC_LOCALIDS DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "fake new entry %ld : localID=%ld, flags=0x%X, modcount=modcount_created=%ld, new dataCRC=0x%hX", (long)fChangeLog.getNumRecords(), newentry.dbrecordid, (int)newentry.flags, (long)newentry.modcount, newentry.dataCRC )); #else DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "fake new entry %ld : localID='%s', flags=0x%X, modcount=modcount_created=%ld, new dataCRC=0x%hX", (long)fChangeLog.getNumRecords(), newentry.dbrecordid, (int)newentry.flags, (long)newentry.modcount, newentry.dataCRC )); #endif fChangeLog.newRecord(&newentry); } // done ok=true; goto done; } SYSYNC_CATCH (exception &e) statuscode=500; DEBUGPRINTFX(DBG_ERROR,("******** Exception in TBinfileImplDS::ProcessItem: %s (status=%ld)",e.what(), (long)statuscode)); ok=false; goto done; SYSYNC_ENDCATCH SYSYNC_CATCH (...) DEBUGPRINTFX(DBG_ERROR,("******** Exception in TBinfileImplDS::ProcessItem")); statuscode=500; ok=false; goto done; SYSYNC_ENDCATCH error: // report OS specific error codes as item text back to the originator ok=false; if (statuscode != LOCERR_AGAIN) { PDEBUGPRINTFX(DBG_ERROR,("Database Error --> SyncML status %ld%s",(long)statuscode,lastDBErrorText().c_str())); } //aStatusCommand.addItemString(lastDBErrorDbgText().c_str()); done: delete augmentedItemP; aStatusCommand.setStatusCode(statuscode); return ok; } // TBinfileImplDS::implProcessItem // called to confirm a sync operation's completion (status from remote received) // @note aSyncOp passed not necessarily reflects what was sent to remote, but what actually happened void TBinfileImplDS::dsConfirmItemOp(TSyncOperation aSyncOp, cAppCharP aLocalID, cAppCharP aRemoteID, bool aSuccess, localstatus aErrorStatus) { if (binfileDSActive()) { // Nothing to do here, even successful deletes must not delete changelog entry (this will be done // by changeLogPostFlight() for those enties that have been reported as deleted in all profiles!) } // - let inherited know as well inherited::dsConfirmItemOp(aSyncOp, aLocalID, aRemoteID, aSuccess, aErrorStatus); } // TBinfileImplDS::confirmItemOp // - save status information required to possibly perform a resume (as passed to datastore with // implMarkOnlyUngeneratedForResume() and implMarkItemForResume()) // (or, in case the session is really complete, make sure that no resume state is left) localstatus TBinfileImplDS::implSaveResumeMarks(void) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all // update modcount reference of last suspend fPreviousSuspendModCount = fCurrentModCount; // save admin data now return SaveAdminData(true,false); // end of session, but not successful } // TBinfileImplDS::implSaveResumeMarks // log datastore sync result // - Called at end of sync with this datastore void TBinfileImplDS::dsLogSyncResult(void) { // Note: binfile logs can be active even if binfiles layer otherwise is not active TBinfileClientConfig *clientCfgP = static_cast(fSessionP->getSessionConfig()); if (clientCfgP->fBinFileLog) { // writing binfile logs enabled TBinFile logFile; // Open logfile // - get base path string filepath; clientCfgP->getBinFilesPath(filepath); filepath += LOGFILE_DB_NAME; // - open or create logFile.setFileInfo(filepath.c_str(),LOGFILE_DB_VERSION,LOGFILE_DB_ID,sizeof(TLogFileEntry)); if (logFile.open(0,NULL,NULL)!=BFE_OK) { // create new one or overwrite incompatible one logFile.create(sizeof(TLogFileEntry),0,NULL,true); } // append new record // - create record TLogFileEntry logInfo; logInfo.time = fCurrentSyncTime; // current sync's time logInfo.status = getAbortStatusCode(); // reason for abort (0 if ok) logInfo.mode = (fSlowSync ? (fFirstTimeSync ? 2 : 1) : 0) + (fResuming ? 10 : 0); logInfo.dirmode = fSyncMode; // sync direction mode logInfo.infoID = 0; // none logInfo.dbID = fConfigP->fLocalDBTypeID; // ID of DB (to allow fetching name) logInfo.profileID = static_cast(fSessionP)->fRemotepartyID; // ID of profile (to allow fetching name) logInfo.locAdded = fLocalItemsAdded; logInfo.locUpdated = fLocalItemsUpdated; logInfo.locDeleted = fLocalItemsDeleted; logInfo.remAdded = fRemoteItemsAdded; logInfo.remUpdated = fRemoteItemsUpdated; logInfo.remDeleted = fRemoteItemsDeleted; logInfo.inBytes = fIncomingDataBytes; logInfo.outBytes = fOutgoingDataBytes; logInfo.locRejected = fLocalItemsError; logInfo.remRejected = fRemoteItemsError; // - save it logFile.newRecord(&logInfo); // close the logfile again logFile.close(); } } // TBinfileImplDS::dsLogSyncResult // save end of session state // Note that in BASED_ON_BINFILE_CLIENT case, this is derived in customimplds and will // be called by the derivate after doing customimpl specific stuff. localstatus TBinfileImplDS::implSaveEndOfSession(bool aUpdateAnchors) { if (!binfileDSActive()) return LOCERR_WRONGUSAGE; // must be active when called at all // update TCustomImplDS dsSavedAdmin variables (other levels have already updated their variables if (aUpdateAnchors) { if (!fRefreshOnly || fSlowSync) { // This was really a two-way sync or we implicitly know that // we are now in sync with remote (like after one-way-from-remote refresh = reload local) fPreviousToRemoteModCount = fCurrentModCount; } // updating anchor means invalidating last Suspend fPreviousSuspendCmpRef = fPreviousToRemoteSyncCmpRef; // setting to current reference can do less harm than setting it to zero fPreviousSuspendModCount=0; } // save admin data now localstatus sta=SaveAdminData(true,aUpdateAnchors); // end of session if (sta==LOCERR_OK) { // finalize admin data stuff now uInt32 oldestmodcount=0xFFFFFFFF; // do a postFlight to remove unused entries from the changelog if (static_cast(fSessionP->getSessionConfig())->fSeparateChangelogs) { // Each profile has it's own changelog, so just delete entries that are older than this profile's last sync or resume if (fTarget.lastSuspendModCount!=0) oldestmodcount = fTarget.lastSuspendModCount; if (fTarget.lastTwoWayModCount!=0 && fTarget.lastTwoWayModCount(fSessionP)->fConfigP->fTargetsBinFile); uInt32 maxidx = targetsBinFileP->getNumRecords(); uInt32 idx; TBinfileDBSyncTarget target; for (idx=0; idxreadRecord(idx,&target); if ( // Note: %%% this is same mechanism as for changelog filenames // Not ok if multiple databases go with the same datastore.getName() strucmp(target.dbname,getName())==0 ) { // target for this database found, check if modcount is older if (target.lastSuspendModCount!=0 && target.lastSuspendModCountfCmpRefTimeStampAtEnd) { fChgLogHeader.lastChangeCheck = getSession()->getSystemNowAs(TCTX_UTC); // NOW ! (again); } fChangeLog.setExtraHeaderDirty(); fChangeLog.flushHeader(); // save other admin data TBinFile *targetsBinFileP = &(static_cast(fSessionP)->fConfigP->fTargetsBinFile); // update target fields // - update anchor AssignCString(fTarget.remoteAnchor,fLastRemoteAnchor.c_str(),remoteAnchorMaxLen); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("SaveAdminData: saving remote anchor = '%s'",fLastRemoteAnchor.c_str())); // - update this sync time (last sync field in DB) and modcount fTarget.lastSync=fPreviousSyncTime; fTarget.lastTwoWayModCount=fPreviousToRemoteModCount; // Note: compare times and identifiers are not needed any more (these are now in the changelog), // But we assigne some for dbg purposes. // - update the last changelog check time. fTarget.lastChangeCheck=fPreviousToRemoteSyncCmpRef; #if TARGETS_DB_VERSION>=6 // - identifiers (tokens for StartDataRead) PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("SaveAdminData: saving target sync token %s", fPreviousToRemoteSyncIdentifier.c_str())); AssignCString(fTarget.dummyIdentifier1,fPreviousToRemoteSyncIdentifier.c_str(),remoteAnchorMaxLen); // former lastSyncIdentifier AssignCString(fTarget.dummyIdentifier2,NULL,remoteAnchorMaxLen); // former lastSuspendIdentifier, not needed, make empty // store remote datastore's display name (is empty if we haven't got one from the remote via devInf) if (getRemoteDatastore()) { AssignCString(fTarget.remoteDBdispName,getRemoteDatastore()->getDisplayName(),dispNameMaxLen); } #endif // check for other target record updates needed at end of session if (aSessionFinished && aSuccessful) { // - reset mode back to normal, that is after a forced reload of client OR server // we assume that two-way sync will be what we want next. if (fTarget.forceSlowSync) { fTarget.syncmode = smo_twoway; } fTarget.forceSlowSync=false; } // special operations needed depending on suspend state fTarget.resumeAlertCode=fResumeAlertCode; if (fResumeAlertCode==0) { fTarget.lastSuspendModCount = 0; } else { /// @note: lastSuspendModCount is the same target field that previously was called "lastModCount" fTarget.lastSuspendModCount = fPreviousSuspendModCount; if (!static_cast(fSessionP->getSessionConfig())->fSeparateChangelogs) { // Combined changelogs: make sure that resume alert codes of all other profile's targets for this datastore are erased // (because in a single changelog there is only one set of markforresume flags and single pendingmap+pendingitem files) TBinfileDBSyncTarget otherTarget; memset(&otherTarget, 0, sizeof(otherTarget)); for (sInt32 ti=0; tigetNumRecords()); ti++) { if (ti!=fTargetIndex) { // get that target targetsBinFileP->readRecord(ti,&otherTarget); if ( (otherTarget.localDBTypeID == fTarget.localDBTypeID) && // same datastoreID (strucmp(otherTarget.localDBPath,fTarget.localDBPath)==0) && // ..and name (otherTarget.resumeAlertCode!=0) // ..and has a saved suspend state ) { // same datastore, but different profile is also suspended -> new suspend cancels old one DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("SaveAdminData: cancelled resumeAlertCode in profile=%ld",(long)otherTarget.remotepartyID)); otherTarget.resumeAlertCode=0; otherTarget.lastSuspendModCount=0; targetsBinFileP->updateRecord(ti,&otherTarget); } } } } } PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI,("SaveAdminData: lastTwoWayModCount = %ld, lastSuspendModCount = %ld", (long)fPreviousToRemoteModCount, (long)fPreviousSuspendModCount)); // save pending maps (anyway, even if not suspended) openPendingMaps(); // make sure we have the pendingmap file open now fPendingMaps.truncate(0); // delete current contents TStringToStringMap::iterator spos; TPendingMapEntry pme; localid_t localid; // - pending maps now belong to us! // Note: they always do with separated changelogs fPendingMapHeader.remotepartyID = static_cast(fSessionP)->fRemotepartyID; fPendingMaps.setExtraHeaderDirty(); // - now pending maps (unsent ones) DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_DETAILS,("SaveAdminData: saving %ld entries from fPendingAddMaps to fPendingMaps binfile",(long)fPendingAddMaps.size())); for (spos=fPendingAddMaps.begin();spos!=fPendingAddMaps.end();spos++) { string locID = (*spos).first; dsFinalizeLocalID(locID); // pending maps might have non-final ID, so give datastore implementation to return finalized version STR_TO_LOCALID(locID.c_str(),localid); ASSIGN_LOCALID_TO_FLD(pme.dbrecordid,localid); AssignCString(pme.remoteID,(*spos).second.c_str(),BINFILE_MAXGUIDSIZE+1); fPendingMaps.newRecord(&pme); } // - now pending maps (sent, but not seen status yet) DEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_DETAILS,("SaveAdminData: saving %ld entries from fUnconfirmedMaps to fPendingMaps binfile",(long)fUnconfirmedMaps.size())); for (spos=fUnconfirmedMaps.begin();spos!=fUnconfirmedMaps.end();spos++) { STR_TO_LOCALID((*spos).first.c_str(),localid); ASSIGN_LOCALID_TO_FLD(pme.dbrecordid,localid); AssignCString(pme.remoteID,(*spos).second.c_str(),BINFILE_MAXGUIDSIZE+1); fPendingMaps.newRecord(&pme); } // - save them fPendingMaps.close(); // Save last item info and possibly partial item data TPendingItemHeader pendingItemHeader; memset((void*)&pendingItemHeader,0,sizeof(pendingItemHeader)); // make nicely empty by default bool saveit=false; // - profile ID where this pending item belongs to pendingItemHeader.remotepartyID = static_cast(fSessionP)->fRemotepartyID; // determine if and what to save if (fPartialItemState==pi_state_none) { pendingItemHeader.piState = pi_state_none; pendingItemHeader.storedSize=0; // no data to store saveit=true; } else if (fPartialItemState==pi_state_save_incoming || fPartialItemState==pi_state_save_outgoing) { // - last item info pendingItemHeader.lastItemStatus = fLastItemStatus; AssignCString(pendingItemHeader.lastSourceURI,fLastSourceURI.c_str(),BINFILE_MAXGUIDSIZE+1); AssignCString(pendingItemHeader.lastTargetURI,fLastTargetURI.c_str(),BINFILE_MAXGUIDSIZE+1); // - partial item info pendingItemHeader.totalSize = fPITotalSize; pendingItemHeader.unconfirmedSize = fPIUnconfirmedSize; if (fPartialItemState==pi_state_save_incoming) { // store incoming pendingItemHeader.piState = pi_state_loaded_incoming; pendingItemHeader.storedSize=fPIStoredSize; } else if (fPartialItemState==pi_state_save_outgoing) { // store outgoing pendingItemHeader.piState = pi_state_loaded_outgoing; pendingItemHeader.storedSize=fPIStoredSize; } else pendingItemHeader.storedSize=0; // nothing to store saveit=true; } if (saveit) { TBinFile pendingItemFile; string fname = static_cast(fSessionP->getSessionConfig())->relatedDBNameBase(getName(), fTarget.remotepartyID); fname += PENDINGITEM_DB_SUFFIX; pendingItemFile.setFileInfo(fname.c_str(),PENDINGITEM_DB_VERSION,PENDINGITEM_DB_ID,0); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,( "SaveAdminData: creating pending item file: file name='%s', storing %ld bytes", fname.c_str(), (long)pendingItemHeader.storedSize )); PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_DETAILS,( "SaveAdminData: saved pending item: src='%s', targ='%s', laststatus=%hd, pistate=%d, total=%ld, unconfirmed=%ld, stored=%ld", pendingItemHeader.lastSourceURI, pendingItemHeader.lastTargetURI, pendingItemHeader.lastItemStatus, pendingItemHeader.piState, (long)pendingItemHeader.totalSize, (long)pendingItemHeader.unconfirmedSize, (long)pendingItemHeader.storedSize )); bferr bfe=pendingItemFile.create( pendingItemHeader.storedSize, // record size = size of data chunk to be buffered sizeof(TPendingItemHeader), // extra header size &pendingItemHeader, // extra header data true // overwrite existing ); if (bfe==BFE_OK) { // created successfully, store data if any if (pendingItemHeader.storedSize && fPIStoredDataP) { // we have data to store uInt32 newIndex; bfe=pendingItemFile.newRecord(newIndex,fPIStoredDataP); } // close file pendingItemFile.close(); } if (bfe!=BFE_OK) { PDEBUGPRINTFX(DBG_ERROR,("Error writing pending item file, bferr=%hd",bfe)); } } PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_DETAILS,("SaveAdminData: fTargetIndex %d resumeAlertCode = %hd, lastSuspendModCount = %ld",fTargetIndex,fResumeAlertCode,(long)fTarget.lastSuspendModCount)); // update the target record if (fTargetIndex>=0) { targetsBinFileP->updateRecord(fTargetIndex,&fTarget); fTargetIndex=-1; // invalid now } PDEBUGENDBLOCK("SaveAdminData"); // ok return LOCERR_OK; } // TBinfileImplDS::SaveAdminData /* end of TBinfileImplDS implementation */ } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/binfileimplds.h0000755000373300037200000011273112424517753025647 0ustar00nightlyallusers00000000000000/** * @File binfileimplds.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TBinfileImplDS * Represents a client datastore implementation which has target management * (and optionally change log) based on binary files * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-30 : luz : created from TBinfileImplDS */ /* */ #ifndef BINFILEIMPLDS_H #define BINFILEIMPLDS_H // includes #include "binfile.h" // platform specific header (using binfilebase) #include "stdlogicds.h" #include "multifielditem.h" // defines that allow using the generic method implementations // for provisioning and autosync #define CLIENTAGENTCONFIG TBinfileClientConfig #define CLIENTDSCONFIG TBinfileDSConfig #define PROFILERECORD TBinfileDBSyncProfile #define TARGETRECORD TBinfileDBSyncTarget #include "clientprovisioning_inc.h" #include "clientautosync_inc.h" namespace sysync { // Defines // ======= #ifndef ANDROID #pragma pack(push,4) // 32bit #endif // specific sync const uInt16 dbnamelen=32; // Local IDs // ========= // local ID typedefs and Macros #ifdef NUMERIC_LOCALIDS // numeric local IDs typedef NUMERIC_LOCALIDS localid_t; typedef localid_t localid_out_t; #define LOCALID_EQUAL(a,b) (a==b) #if NUMERIC_LOCALID_SZ==2 #define STR_TO_LOCALID(s,i) StrToUShort(s,i) #elif NUMERIC_LOCALID_SZ==4 #define STR_TO_LOCALID(s,i) StrToULong(s,i) #elif NUMERIC_LOCALID_SZ==8 #define STR_TO_LOCALID(s,i) StrToULongLong(s,i) #else #error "unknown size of numeric local ID" #endif #define ASSIGN_LOCALID_TO_FLD(a,b) (a=b) #define LOCALID_OUT_TO_IN(out) out #if NUMERIC_LOCALID_SZ<=4 #define LOCALID_TO_STRING(i,s) { StringObjPrintf(s,"%lu",(uInt32)i); } #else #define LOCALID_TO_STRING(i,s) { StringObjPrintf(s,"%llu",(uInt64)i); } #endif #define ASSIGN_LOCALID_TO_ITEM(it,i) { string s; LOCALID_TO_STRING(i,s); (it).setLocalID(s.c_str()); } #else // string local IDs const uInt16 maxidlen = STRING_LOCALID_MAXLEN; typedef char *localid_t; typedef string localid_out_t; #define LOCALID_EQUAL(a,b) (strnncmp(a,b,maxidlen)==0) #define STR_TO_LOCALID(s,i) (i=(char *)s) #define LOCALID_TO_STRING(i,s) s=i #define ASSIGN_LOCALID_TO_FLD(a,b) AssignCString(a,b,maxidlen) #define LOCALID_OUT_TO_IN(out) ((char *)out.c_str()) #define ASSIGN_LOCALID_TO_ITEM(it,i) (it).setLocalID(i) #endif // User log // ======== // Note: Engine 3.1.5.1 and later have the fBinFileLog which can be turned on to have binfileds // write the log records automatically. With ENGINEINTERFACE_SUPPORT, the /synclogs // settingskey can be used to access the log records. // In 3.0 clients, implementation of filling and displaying the log binfile is platform dependent // simply using this typedef to have a common format. #ifdef SETTINGS_BFI_PREFIX // custom settings name prefix #define LOGFILE_DB_NAME SETTINGS_BFI_PREFIX "log.bfi" #else #define LOGFILE_DB_NAME "sysylog.bfi" #endif #define LOGFILE_DB_ID 8 #define LOGFILE_DB_VERSION 3 typedef struct { lineartime_t time; ///< timestamp for this log entry uInt32 dbID; ///< the datastore involved uInt32 profileID; ///< id of the profile localstatus status; uInt16 mode; ///< sync mode: 0=normal, 1=slow, 2=first time, +10 = resumed sInt32 infoID; ///< ressource id of text describing error (only valid with platform-specific log file filling, not available via /synclogs) uInt32 locAdded; uInt32 locUpdated; uInt32 locDeleted; uInt32 remAdded; uInt32 remUpdated; uInt32 remDeleted; uInt32 inBytes; uInt32 outBytes; // V2 fields start here uInt32 locRejected; uInt32 remRejected; // V3 fields start here uInt16 dirmode; /// 4 // unite desktop and mobile client // - container name / entryID char localContainerName[localDBpathMaxLen]; #endif #if !defined(DESKTOP_CLIENT) && TARGETS_DB_VERSION>4 #error "Make sure to unite desktop and mobile versions - desktop already is version 5. Note that localDBpathMaxLen is shorter in mobile; check if 128 is really needed for desktop!" #endif // Version 6 fields start here // =========================== #if TARGETS_DB_VERSION>5 // storage for non-time sync identifiers in case DB on top is customImplDS char dummyIdentifier1[remoteAnchorMaxLen]; // (formerly lastSyncIdentifier) not used any more - single identifier in changelog is sufficient char dummyIdentifier2[remoteAnchorMaxLen]; // (formerly lastSuspendIdentifier) not used any more - single identifier in changelog is sufficient // remote datastore info (retrieved from devInf, if possible) char remoteDBdispName[dispNameMaxLen]; // display name of remote datastore char filterCapDesc[filterCapDescMaxLen]; // description string of remote filter capabilities // remote filter expression (in internal format) char remoteFilters[filterExprMaxLen]; // local (client side) filter expression (in internal format) char localFilters[filterExprMaxLen]; #endif // TARGETS_DB_VERSION > 5 // Version 7 fields %%%will%%% start here // =========================== #if TARGETS_DB_VERSION>6 #error "target versions > 6 not yet supported! - please check TARGETS_DB_VERSION" #endif // TARGETS_DB_VERSION > 6 } TBinfileDBSyncTarget; #define TARGETS_DB_VERSION_4_SZ sizeof(TBinfileDBSyncTarget) #define TARGETS_DB_VERSION_3_SZ offsetof(TBinfileDBSyncTarget,resumeAlertCode) // Sync Profile database // ===================== #ifdef SETTINGS_BFI_PREFIX // custom settings name prefix #define PROFILE_DB_NAME SETTINGS_BFI_PREFIX "prof.bfi" #else #define PROFILE_DB_NAME "sysyprof.bfi" #endif #ifndef ENHANCED_PROFILES_2004 #error "non-enhanced profiles and profile version <6 no longer supported!" #endif #define PROFILE_DB_ID 2 #define PROFILE_DB_VERSION 9 // lowest profile DB version still supported for automatic upgrading #define LOWEST_PROFILE_DB_VERSION 4 // read-only flags const uInt8 rdonly_URI = 0x01; // server URI const uInt8 rdonly_URIpath = 0x02; // URI path suffix const uInt8 rdonly_protocol = 0x04; // protocol (transport http/https flag as well as SyncML version) const uInt8 rdonly_dbpath = 0x08; // DB path names const uInt8 rdonly_profile = 0x10; // profile may not be deleted or renamed (but non-readonly options can be set) const uInt8 rdonly_proxy = 0x20; // proxy settings (except proxy auth settings). // - Bit 6+7 reserved // feature flags const uInt8 ftrflg_autosync = 0x01; // autosync enabled const uInt8 ftrflg_dmu = 0x02; // DMU enabled const uInt8 ftrflg_range = 0x04; // Range filtering enabled (APP_FTR_EVENTRANGE etc...) // datastore availability flags const uInt16 dsavail_all = 0xFFFF; // all implemented datastores const uInt16 dsavail_contacts = 0x0001; // contacts const uInt16 dsavail_events = 0x0002; // events const uInt16 dsavail_tasks = 0x0004; // tasks const uInt16 dsavail_memos = 0x0008; // notes/memos const uInt16 dsavail_emails = 0x0010; // emails // remote-specifics flags const uInt8 remotespecs_devidWithUserHash = 0x01; // device ID must always include the user name const uInt8 remotespecs_noXTypeParams = 0x02; // vCard should not contain any X-Synthesis-RefX and other X-hhh type tags const uInt8 remotespecs_noDS12Filters = 0x04; // we should not use DS 1.2 SINCE/BEFORE filters // - Bit 3..7 reserved // field sizes const uInt16 maxurisiz=128; const uInt16 maxupwsiz=64; const uInt16 maxnamesiz=42; const uInt16 maxnoncesiz=64; const uInt16 maxpathsiz=64; const uInt16 profiledatasiz=256; typedef enum { transp_proto_uri, // protocol included in URI transp_proto_http, // HTTP protocol transp_proto_https, // HTTPS protocol transp_proto_wsp, // WSP protocol transp_proto_obex_irda, // OBEX/IRDA protocol transp_proto_obex_bt, // OBEX/BT protocol transp_proto_obex_tcp, // OBEX/TCP protocol num_transp_protos // number of protocols } TTransportProtocols; // NOTE!!!: changing number of levels implies a change of PROFILE_DB_VERSION!! #define NUM_AUTOSYNC_LEVELS 3 // we provide 3 levels of autosync typedef struct { // Unique ID uInt32 profileID; // internal unique ID of the profile (selects targets by their remotepartyID) // PROFILE_DB_VERSION <=4 settings char profileName[maxnamesiz]; // - encoding (note that release client might not allow XML) SmlEncoding_t encoding; // - Old-style Server URI, misused for several other things // Note: for hard-coded server URI, this is also misused as companyID or secure flag: // - ONE_e2g: serverURI = companyID // - SCM: serverURI[0] = secure flag (HTTPS) char serverURI[maxurisiz]; // - User name char serverUser[maxupwsiz]; // - password char serverPassword[maxupwsiz]; // - Transport user char transportUser[maxupwsiz]; // - Transport password char transportPassword[maxupwsiz]; // - Socks Host char socksHost[maxurisiz]; // - Proxy Host char proxyHost[maxurisiz]; // Internals // - session ID uInt8 sessionID; // - last connection's parameters (used as default for next session) TSyncMLVersions lastSyncMLVersion; TAuthTypes lastAuthMethod; TFmtTypes lastAuthFormat; char lastNonce[maxnoncesiz]; // - for registration checking lineardate_t firstuse; // copy of a global setting, so we can compare and see if someone has tampered with // Additional PROFILE_DB_VERSION 5 settings // - Enhanced server addressing // - possibly some path extension char URIpath[maxpathsiz]; // - protocol selector (0=free-form from URI, 1..n = reserved for fixed protocols) TTransportProtocols protocol; // - read-only flags (rdonly_xxx) uInt8 readOnlyFlags; // - flags for special remote-specific behaviour (remotespecs_XXX) - was reserved until 2.5.0.68 / 2.9.8.10. uInt8 remoteFlags; // - profile feature flags (ftrflg_xxx) uInt8 featureFlags; // - Local Database profile name char localDBProfileName[localDBpathMaxLen]; // - Proxy usage options bool useProxy; // use configured proxies bool useConnectionProxy; // using proxy from current connection, if available // - Auto-Sync levels (3 levels, first match overrides lower level settings) TAutoSyncLevel AutoSyncLevel[NUM_AUTOSYNC_LEVELS]; // - Datastore available flags (for clients with variable datastores) uInt16 dsAvailFlags; // dsavail_xxx flags // - Timed sync settings uInt16 TimedSyncMobilePeriod; // [min] how often to sync when mobile (battery, wireless) uInt16 TimedSyncCradledPeriod; // [min] how often to sync when cradled (ac powered, wired) // - IPP settings (not available in all clients, but present in all profile records TIPPSettings ippSettings; // Additional PROFILE_DB_VERSION 8 settings // - Proxy user char proxyUser[maxupwsiz]; // - Proxy password char proxyPassword[maxupwsiz]; // Additional PROFILE_DB_VERSION 9 settings // - transport related profile flags uInt32 transpFlags; // - general profile flags uInt32 profileFlags; // - general profile ints uInt32 profileExtra1; uInt32 profileExtra2; // - general purpose profile data (intended for SDK based app's usage) uInt8 profileData[profiledatasiz]; } TBinfileDBSyncProfile; #define PROFILE_DB_VERSION_7_SZ offsetof(TBinfileDBSyncProfile,proxyUser) #define PROFILE_DB_VERSION_8_SZ offsetof(TBinfileDBSyncProfile,transpFlags) #if LOWEST_PROFILE_DB_VERSION<6 // old structs and consts used to access fields of profiles older than PROFILE_DB_VERSION 6 const uInt16 o_maxurisiz=128; const uInt16 o_maxupwsiz=32; const uInt16 o_maxnamesiz=42; const uInt16 o_maxnoncesiz=64; const uInt16 o_maxpathsiz=64; typedef struct { char srv[maxipppathsiz]; uInt16 port; uInt16 period; char path[maxipppathsiz]; char id[maxippidsiz]; uInt8 method; } o_TIPPSettings; typedef struct { // Unique ID uInt32 profileID; // internal unique ID of the profile (selects targets by their remotepartyID) // PROFILE_DB_VERSION <=4 settings char profileName[o_maxnamesiz]; // - encoding (note that release client might not allow XML) SmlEncoding_t encoding; // - Old-style Server URI, misused for several other things // Note: for hard-coded server URI, this is also misused as companyID or secure flag: // - ONE_e2g: serverURI = companyID // - SCM: serverURI[0] = secure flag (HTTPS) char serverURI[o_maxurisiz]; // - User name char serverUser[o_maxupwsiz]; // - password char serverPassword[o_maxupwsiz]; // - Transport user char transportUser[o_maxupwsiz]; // - Transport password char transportPassword[o_maxupwsiz]; // - Socks Host char socksHost[o_maxurisiz]; // - Proxy Host char proxyHost[o_maxurisiz]; // Internals // - session ID uInt8 sessionID; // - last connection's parameters (used as default for next session) TSyncMLVersions lastSyncMLVersion; TAuthTypes lastAuthMethod; TFmtTypes lastAuthFormat; char lastNonce[o_maxnoncesiz]; // - for registration checking lineardate_t firstuse; // copy of a global setting, so we can compare and see if someone has tampered with // Additional PROFILE_DB_VERSION 5 settings // - Enhanced server addressing // - possibly some path extension char URIpath[o_maxpathsiz]; // - protocol selector (0=free-form from URI, 1..n = reserved for fixed protocols) TTransportProtocols protocol; // - read-only flags (Bit 0=URI, 1=URIpath, 2=protocol, 3..7 reserved) uInt8 readOnlyFlags; // - 2 bytes reserved for future use uInt16 reserved1; // - Local Database profile name char localDBProfileName[localDBpathMaxLen]; // - Proxy usage options bool useProxy; // use configured proxies bool useConnectionProxy; // using proxy from current connection, if available // - Auto-Sync levels (3 levels, first match overrides lower level settings) TAutoSyncLevel AutoSyncLevel[NUM_AUTOSYNC_LEVELS]; // - reserved uInt8 reserved2; // reserved uInt8 reserved3; // reserved // - Timed sync settings uInt16 TimedSyncMobilePeriod; // [min] how often to sync when mobile (battery, wireless) uInt16 TimedSyncCradledPeriod; // [min] how often to sync when cradled (ac powered, wired) // - IPP settings (not available in all clients, but present in all profile records o_TIPPSettings ippSettings; } o_TBinfileDBSyncProfile; #endif // versioned record sizes #define PROFILE_DB_VERSION_5_SZ sizeof(o_TBinfileDBSyncProfile) #define PROFILE_DB_VERSION_4_SZ offsetof(o_TBinfileDBSyncProfile,URIpath) #ifndef ANDROID #pragma pack(pop) #endif #ifndef CHANGEDETECTION_AVAILABLE #define CRC_CHANGE_DETECTION true #define CRC_DETECT_PSEUDOCHANGES false #else #define CRC_CHANGE_DETECTION (fConfigP->fCRCChangeDetection) #define CRC_DETECT_PSEUDOCHANGES (fConfigP->fCRCPseudoChangeDetection) #endif // datastore config // ================ #ifdef SCRIPT_SUPPORT // publish func table for chaining extern const TFuncTable BinfileClientDBFuncTable; #endif // SCRIPT_SUPPORT class TBinfileDSConfig: public TLocalDSConfig { typedef TLocalDSConfig inherited; public: TBinfileDSConfig(const char* aName, TConfigElement *aParentElement); virtual ~TBinfileDSConfig(); // properties // - activtion switch (for making it inactive e.g. in server case) bool fBinfileDSActive; #ifdef CHANGEDETECTION_AVAILABLE // - we have change detection, but we can be set to enable change detection by CRC, // or verifying DB reported changes by CRC to avoid pseudo-changes (only touched, but not modified records). bool fCRCChangeDetection; bool fCRCPseudoChangeDetection; #endif // - identifies local Database related to this datastore string fLocalDBPath; // - flag that corresponds with profile.dsAvailFlags / dsavail_xxx uInt16 fDSAvailFlag; // - if set, the compare reference time for changelog updates is set to end-of-session time // Note: before 3.2.0.32, this was hardcoded via SYNCTIME_IS_ENDOFSESSION. Now SYNCTIME_IS_ENDOFSESSION // only defines the default value for this setting bool fCmpRefTimeStampAtEnd; // public methods // - init a default target for this datastore virtual void initTarget( TBinfileDBSyncTarget &aTarget, // target record to initialize uInt32 aRemotepartyID, const char *aRemoteName=NULL, // defaults to name of datastore bool aEnabled=false // enabled? ); // - checks if datastore is available for given profile. If aProfileP is NULL, // general availability is checked (profile might allow more or less) bool isAvailable(TBinfileDBSyncProfile *aProfileP); // - one-way support is always given for binfile based DS virtual bool isOneWayFromRemoteSupported() { return true; } #ifdef SCRIPT_SUPPORT // function table virtual const TFuncTable *getClientDBFuncTable(void) { return &BinfileClientDBFuncTable; }; #endif // SCRIPT_SUPPORT protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); virtual void localResolve(bool aLastPass); // Autosync declarations CLIENTAUTOSYNC_CLASSDECL_DB }; // TBinfileDSConfig class TBinfileImplDS: public TStdLogicDS { typedef TStdLogicDS inherited; private: void InternalResetDataStore(void); // reset for re-use without re-creation protected: /// @name dsSavedAdmin administrative data (anchors, timestamps, maps) as saved or to-be-saved /// @Note These will be loaded and saved be derived classes /// @Note Some of these will be updated from resp. @ref dsCurrentAdmin members at distinct events (suspend, session end, etc.) /// @Note Some of these will be updated during the session, but in a way that does NOT affect the anchoring of current/last session // /// @{ /// Reference time of previous changelog update (preflight) /// @note the name of the variable indicates "previous to remote sync" time because in BASED_ON_BINFILE_CLIENT case where // TCustomImplDS sits on top of binfile, it expects that instance var name (because in non binfile-based cases, // that is in fact the "previous to remote sync" date. With the intermediate binfile changelog however, only // changes since last preflight (changelog update) need to be reported. lineartime_t fPreviousToRemoteSyncCmpRef; /// Reference string used by database API level (in BASED_ON_BINFILE_CLIENT case) to detect changes string fPreviousToRemoteSyncIdentifier; /// modification count of last sync target's modifications uInt32 fPreviousToRemoteModCount; /// Reference time of last suspend, needed to detect modifications that took place between last suspend and current resume lineartime_t fPreviousSuspendCmpRef; /// Reference string used by database API level (in BASED_ON_BINFILE_CLIENT case) to detect changes after last suspend string fPreviousSuspendIdentifier; /// modification count used to determine modifications since last to-remote-sync uInt32 fPreviousSuspendModCount; /// @} /// @name dsCurrentAdmin current session's admin data (anchors, timestamps, maps) /// @Note These will be copied to @ref dsSavedAdmin members ONLY when a session completes successfully/suspends. /// @Note Admin data is NEVER directly saved or loaded from these /// @Note Derivates will update some of these at dssta_adminready with current time/anchor values // /// @{ /// Reference time of current sync to compare modification dates against /// @note initially==fCurrentSyncTime, but might be set to end-of-session time for databases which cannot explicitly set modification timestamps lineartime_t fCurrentSyncCmpRef; /// modification count identifying this session's time (for detecting changes taking place after this session) uInt32 fCurrentModCount; /// Reference string returned by database API level identifying this session's time (for detecting changes taking place after this session) string fCurrentSyncIdentifier; /// @} public: TBinfileImplDS( TBinfileDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual ~TBinfileImplDS(); virtual void announceAgentDestruction(void) { /** @todo nop for now */ }; virtual void dsResetDataStore(void); // - called from TBinFileDBAgent::SelectProfile(), should return false if local datastore is not accessible virtual bool localDatastorePrep(void) { return true; } // - set Sync Parameters. Derivate adds CGI to aRemoteDBPath virtual bool dsSetClientSyncParams( TSyncModes aSyncMode, bool aSlowSync, const char *aRemoteDBPath, const char *aDBUser = NULL, const char *aDBPassword = NULL, const char *aLocalPathExtension = NULL, const char *aRecordFilterQuery = NULL, bool aFilterInclusive = false ); // Target vars sInt32 fTargetIndex; TBinfileDBSyncTarget fTarget; protected: /// called for SyncML 1.1 if remote wants number of changes. /// Must return -1 no NOC value can be returned virtual sInt32 getNumberOfChanges(void); /// checks change log for already known changes virtual bool hasPendingChangesForNextSync(); // Simple custom DB access interface methods /// sync login (into this database) /// @note might be called several times (auth retries at beginning of session) /// @note must update the following state variables /// - in TLocalEngineDS: fLastRemoteAnchor, fLastLocalAnchor, fResumeAlertCode, fFirstTimeSync /// - for client: fPendingAddMaps /// - in TStdLogicDS: fPreviousSyncTime, fCurrentSyncTime /// - in derived classes: whatever else belongs to dsSavedAdmin and dsCurrentAdmin state virtual localstatus implMakeAdminReady( const char *aDeviceID, ///< remote device URI (device ID) const char *aDatabaseID, ///< database ID const char *aRemoteDBID ///< database ID of remote device ); /// start data read /// @note: fSlowSync and fRefreshOnly must be valid before calling this method virtual localstatus implStartDataRead(); /// get item from DB virtual localstatus implGetItem( bool &aEof, bool &aChanged, TSyncItem* &aSyncItemP ); /// end of read virtual localstatus implEndDataRead(void); /// start of write virtual localstatus implStartDataWrite(void); /// review reported entry (allows post-processing such as map deleting) /// MUST be called after implStartDataWrite, before any actual writing, /// for each item obtained in implGetItem virtual localstatus implReviewReadItem( TSyncItem &aItem // the item ) { return true; }; // nop here /// retrieve specified item from database virtual bool implRetrieveItemByID( TSyncItem &aItem, // the item TStatusCommand &aStatusCommand ); /// process item (according to operation: add/delete/replace - and for future: copy/move) virtual bool implProcessItem( TSyncItem *aItemP, // the item TStatusCommand &aStatusCommand ); /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void implMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent); /// called to mark an already sent item as "to-be-resent", e.g. due to temporary /// error status conditions, by localID or remoteID (latter only in server case). virtual void implMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID); /// called to have all non-yet-generated sync commands as "to-be-resumed" virtual void implMarkOnlyUngeneratedForResume(void); /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume() and markItemForResume()) /// (or, in case the session is really complete, make sure that no resume state is left) virtual localstatus implSaveResumeMarks(void); /// save end of session state virtual localstatus implSaveEndOfSession(bool aUpdateAnchors); /// end write sequence virtual bool implEndDataWrite(void); public: /// @name dsXXXX virtuals defined by TLocalEngineDS /// These are usually designed such that they should always call inherited::dsXXX to let the entire chain /// of ancestors see the calls /// @{ // /// end of message handling virtual void dsEndOfMessage(void); /// inform logic of coming state change virtual localstatus dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); /// inform logic of happened state change virtual localstatus dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); /// called to confirm a sync operation's completion (ok status from remote received) /// @note aSyncOp passed not necessarily reflects what was sent to remote, but what actually happened virtual void dsConfirmItemOp(TSyncOperation aSyncOp, cAppCharP aLocalID, cAppCharP aRemoteID, bool aSuccess, localstatus aErrorStatus=0); /// returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps) virtual bool dsResumeSupportedInDB(void) { return true; }; // resume supported /// returns true if DB implementation supports resuming in midst of a chunked item (can save fPIxxx.. and related admin data) virtual bool dsResumeChunkedSupportedInDB(void) { return true; }; /// saves user log information about the sync session virtual void dsLogSyncResult(void); /// @} protected: // Routines to be implemented by derived classes to actually access // local databases #ifdef RECORDHASH_FROM_DBAPI /// get first item's ID and CRC from the sync set. /// @return false if no item found virtual bool getFirstItemCRC(localid_out_t &aLocalID, uInt16 &aItemCRC) = 0; /// get next item's ID and CRC from the sync set. /// @return false if no item found virtual bool getNextItemCRC(localid_out_t &aLocalID, uInt16 &aItemCRC) = 0; #else /// get first item from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return false if no item found virtual bool getFirstItem(TSyncItem *&aItemP) = 0; /// get next item from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return false if no item found virtual bool getNextItem(TSyncItem *&aItemP) = 0; #endif // RECORDHASH_FROM_DBAPI #ifdef CHANGEDETECTION_AVAILABLE /// get first item's ID and modification status from the sync set /// @return false if no item found virtual bool getFirstItemInfo(localid_out_t &aLocalID, bool &aItemHasChanged) = 0; /// get next item's ID and modification status from the sync set. /// @return false if no item found virtual bool getNextItemInfo(localid_out_t &aLocalID, bool &aItemHasChanged) = 0; #endif // CHANGEDETECTION_AVAILABLE /// get item by local ID from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus getItemByID(localid_t aLocalID, TSyncItem *&aItemP) = 0; #ifdef RECORDHASH_FROM_DBAPI /// get specified item's CRC as calculated by DB /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus getItemCRCByID(localid_t aLocalID, uInt16 &aItemCRC) = 0; #endif // RECORDHASH_FROM_DBAPI /// end of syncset reading phase (especially for customimplds on top of binfileds) virtual localstatus apiEndDataRead(void) { return LOCERR_OK; }; /// signal start of data write phase virtual localstatus apiStartDataWrite(void) { return LOCERR_OK; }; /// signal end of data write phase virtual localstatus apiEndDataWrite(void) { return LOCERR_OK; }; /// update item by local ID in the sync set. Caller retains ownership of aItemP /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus updateItemByID(localid_t aLocalID, TSyncItem *aItemP) = 0; /// delete item by local ID in the sync set. /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus deleteItemByID(localid_t aLocalID) = 0; /// create new item in the sync set. Caller retains ownership of aItemP. /// @return LOCERR_OK or error code. /// @param[out] aNewLocalID local ID assigned to new item /// @param[out] aReceiveOnly is set to true if local changes/deletion of this item should not be /// reported to the server in normal syncs. virtual localstatus createItem(TSyncItem *aItemP,localid_out_t &aNewLocalID, bool &aReceiveOnly) = 0; /// zaps the entire datastore, returns LOCERR_OK if ok /// @return LOCERR_OK or error code. virtual localstatus zapDatastore(void) = 0; /// returns timestamp of this sync session (must be used to set mod-timestamp on added and changed records) lineartime_t getThisSyncTime(void) { return fCurrentSyncTime; } /// get reference time or count to be used as reference date for this sync's modifications lineartime_t getThisSyncModRefTime(void); uInt32 getThisSyncModCount(void) { return fCurrentModCount; } /// get reference time or count to be used in case datastore implementation wants to compare /// with the time or count of last sync (last two-way sync, that is!) lineartime_t getLastSyncModRefTime(void); uInt32 getLastSyncModCount(void) { return fPreviousToRemoteModCount; } /// zaps changelog. Should be called if datastore as a entiety was replaced /// by another datatstore (or created new) void zapChangeLog(void); /// check if active derived classes (in particular: customImplDS that CAN derive binfiles, but does not necessarily so) bool binfileDSActive(void) { return fConfigP && fConfigP->fBinfileDSActive; }; private: /// load changelog into memory for quick access void loadChangeLog(void); /// forget changelog in memory void forgetChangeLog(void); /// private helper to prepare for apiSaveAdminData() localstatus SaveAdminData(bool aSessionFinished, bool aSuccessful); /// load target record for this datastore localstatus loadTarget(bool aCreateIfMissing, cAppCharP aRemoteDBID=NULL); /* %%% seems obsolete - never called from anywhere // private utils #ifdef OBJECT_FILTERING // - Test Filters bool testFilters(TMultiFieldItem *aItemP); #endif */ // sync anchor, time and changelog cursor (modcount) #ifdef CHECKSUM_CHANGELOG /// change log TBinFile fChangeLog; ///< change log binfile TChangeLogHeader fChgLogHeader; ///< change log header // - returns true if we had a valid changelog bool openChangeLog(void); // - returns true if we had a valid pending map file bool openPendingMaps(void); // - update change log before syncing. Don't call before types are ok (we need TSyncItems) localstatus changeLogPreflight(bool &aValidChangelog); // - clean up change log after syncing localstatus changeLogPostflight(uInt32 aOldestSyncModCount); // - vars bool fPreflighted; // set if preflight (changelog update) was done // - entire change log, loaded into memory for quick reference during write phase TChangeLogEntry *fLoadedChangeLog; uInt32 fLoadedChangeLogEntries; // - true if there are known pending changes for the next sync // (necessary for hasPendingChangesForNextSync() // because not all of the change log is always in memory) bool fHasPendingChanges; #endif // CHECKSUM_CHANGELOG /// pending maps for Resume TBinFile fPendingMaps; ///< pending map binfile TPendingMapHeader fPendingMapHeader; ///< pending map header // number of local changes sInt32 fNumberOfLocalChanges; // GetItem vars uInt32 fLogEntryIndex; // config (typed pointer for convenience) TBinfileDSConfig *fConfigP; }; // TBinfileImplDS } // namespace sysync #endif // BINFILEIMPLDS_H // eof syncevolution-1.5/src/synthesis/src/sysync/clientautosync_inc.cpp0000755000373300037200000023125612424517753027262 0ustar00nightlyallusers00000000000000/* * File: clientautosync_inc.cpp * * Include file for binfileagent.cpp and palmdbagent.cpp to provide * autosync mechanisms. * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-05-10 : luz : created from clientprovisioning_inc.cpp * * */ #ifdef AUTOSYNC_SUPPORT #ifdef SYDEBUG static const char * const IPPStateNames[num_ipp_states] = { "unknown", "idle", "activated", "subscribed" }; static const char * const AutoSyncModeNames[num_autosync_modes] = { "push", "timed", "none", "serveralert" }; static const char * const AutoSyncStateNames[num_autosync_states] = { "idle", "start", // start selected autosync mechanism "timedsync", // pure scheduled sync "timedsync_wait", // waiting for scheduled sync to occur "ipp_connectwait", // start waiting until connecting again "ipp_connectwaiting", // waiting for connecting again "ipp_resubscribe", // re-subscribe to DMU method 1 "alert_implicit", // alert implicit datastores "ipp_connect", // connect to server "ipp_sendrequest", // send request to server "ipp_answerwait", // connected, waiting for answer from IPP server "ipp_disconnect", // disconnect from the server "ipp_endanswer", // disconnect after a IPP answer "ipp_processanswer" // process collected IPP answer }; #endif // utility functions // applies the value to the IPP parameter identified by aTag // This can be called from client provisioning code or from a sync session's GET // command RESULT (if the server supports IPP autoconfig) void CLIENTAGENTCONFIG::ipp_setparam(const char *aTag, const char *aValue, TIPPSettings &aIPPSettings) { #ifdef IPP_SUPPORT uInt16 res=0; if (strucmp(aTag,"srv")==0) { AssignCString(aIPPSettings.srv,aValue,maxipppathsiz); fIPPState=ippstate_unknown; } else if (strucmp(aTag,"path")==0) { AssignCString(aIPPSettings.path,aValue,maxipppathsiz); } else if (strucmp(aTag,"id")==0) { AssignCString(aIPPSettings.id,aValue,maxippidsiz); fIPPState=ippstate_unknown; } else if (strucmp(aTag,"port")==0) { StrToUShort(aValue,aIPPSettings.port); } else if (strucmp(aTag,"period")==0) { StrToUShort(aValue,aIPPSettings.period); } else if (strucmp(aTag,"method")==0) { StrToUShort(aValue,res); aIPPSettings.method=(uInt8)res; fIPPState=ippstate_unknown; } else if (strucmp(aTag,"cred")==0) { AssignCString(aIPPSettings.cred,aValue,maxipppathsiz); fIPPState=ippstate_unknown; } else if (strucmp(aTag,"maxinterval")==0) { StrToUShort(aValue,res); aIPPSettings.maxinterval=res; } else if (strucmp(aTag,"timedds")==0) { AssignCString(aIPPSettings.timedds,aValue,maxipppathsiz); } #ifdef GAL_CLIENT_SUPPORT else if (strucmp(aTag,"gal_url")==0) { AssignCString(gGALInfo.url,aValue,GAL_STRING_MAX); gGALInfo.galUpdated=true; } else if (strucmp(aTag,"gal_domain")==0) { AssignCString(gGALInfo.domain,aValue,GAL_STRING_MAX); gGALInfo.galUpdated=true; } #endif #endif } // CLIENTAGENTCONFIG::ipp_setparam // generic code that can work as palmdbagent or binfiledbagent method // must be called when application starts to initialize autosync // BEFORE autosync_setprofile() void CLIENTAGENTCONFIG::autosync_init(lineartime_t aLastAlert) { // make sure all autosync is disabled fAutosyncProfile.AutoSyncLevel[0].Mode=autosync_none; fAutosyncProfile.AutoSyncLevel[1].Mode=autosync_none; fAutosyncProfile.AutoSyncLevel[2].Mode=autosync_none; // init state fAutosyncState=autosync_idle; fAutosyncProfileLastidx=-1; // no profile selected yet fAutosyncLastAlert=aLastAlert; // as saved by the main app fNewMode=autosync_none; // no new mode // init per-profile state fCurrentLevelIndex=-1; // none yet fAutoSyncMode=autosync_none; // disabled until we have checked fNextSyncAt=0; // we do not know when next sync will be fWhyNotFlags=0; // no reason why not // cancel all current alerts autosync_ackAlert(false); #ifdef TCP_LEAK_DEBUG fTcpLeakCounter=0; #endif } // CLIENTAGENTCONFIG::autosync_init // to be called to forget or actually execute prepared autosync alerts in DS config // (e.g. after asking user for confirmation after receiving a SAN) void CLIENTAGENTCONFIG::autosync_ackAlert(bool aAck) { if (!aAck) { // cancel alert fAutosyncAlerted=false; fUnsuccessfulAlerts=0; // make sure all prepared alerts in the DS config are cleared TLocalDSList::iterator pos; for (pos=fDatastores.begin(); pos!=fDatastores.end(); pos++) { CLIENTDSCONFIG *dscfgP = static_cast(*pos); dscfgP->fAutosyncAlerted=false; dscfgP->fAutosyncForced=false; dscfgP->fAutosyncAlertCode=0; dscfgP->fAutosyncPathCGI.erase(); } } else { // activate alerts prepared in DS config fAutosyncAlerted=true; } } // autosync_ackAlert // must be called when active profile changes (or at start of application) void CLIENTAGENTCONFIG::autosync_setprofile(sInt32 aProfileIndex, bool aHasChanged) { if (aProfileIndex != fAutosyncProfileLastidx || aHasChanged) { // a new profile gets active fAutosyncProfileLastidx=aProfileIndex; // - first stop autosync autosync_stop(); // - cancel eventually pending alerts autosync_ackAlert(false); // - read profile that determines autosync behaviour if (getProfile(aProfileIndex,fAutosyncProfile)<0) { // make sure all autosync is disabled fAutosyncProfile.AutoSyncLevel[0].Mode=autosync_none; fAutosyncProfile.AutoSyncLevel[1].Mode=autosync_none; fAutosyncProfile.AutoSyncLevel[2].Mode=autosync_none; } // - re-init per-profile state fAutoSyncMode=autosync_none; // disabled until we have checked fAutosyncAlerted=false; fNextSyncAt=0; // we do not know when next sync will be fWhyNotFlags=0; // no reason why not #ifdef IPP_SUPPORT fIPPState=ippstate_unknown; // we do not know yet #endif // - make sure we do a full settings check fNextCheckAt=0; // do immediately check settings at next step fNextWakeupCheckAt=0; } } // CLIENTAGENTCONFIG::autosync_setprofile // must be called to obtain DMU PUT command data to send to SyncML server void CLIENTAGENTCONFIG::autosync_get_putrequest(string &aReq) { // use custom Put for requesting activation in s2g methods 0 and 1 (but not for method 2 and above) aReq.erase(); // no DMU request when DMU is not active or status unknown #ifdef IPP_SUPPORT if (fAutoSyncMode==autosync_ipp && fIPPState!=ippstate_unknown && fAutosyncProfile.ippSettings.method3 // Note: do no show this in normal debug clients any more as it now happens for EVERY autosync check if (PDEBUGTEST(DBG_TRANSP)) { string ts; StringObjTimestamp(ts,aRestartAt); PDEBUGPRINTFX(DBG_TRANSP,( "AUTOSYNC: app %s quit now, and must be running (again) by %s", canquit ? "MAY" : "MUST NOT", ts.c_str() )); } #endif return canquit; } // CLIENTAGENTCONFIG::autosync_canquit // returns true if we need to perform a sync session now bool CLIENTAGENTCONFIG::autosync_check(bool aActive) { // process one state machine step in active mode autosync_step(aActive); // check if we have a pending re-alert due to failed session execution, // but only if autosync mode is still active (could be temporarily off because of phone flight mode) if (!fAutosyncAlerted && aActive && fAutoSyncMode!=autosync_none) { // no real alert pending, check if we need to generate one for retry reasons if (fUnsuccessfulAlerts>0 && fUnsuccessfulAlertsfAutosyncLastAlert+(AUTOSYNC_MIN_ALERTRETRY << (fUnsuccessfulAlerts-1))*secondToLinearTimeFactor) { // re-alert PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: re-alerting after %hd unsuccessful attempts to run AutoSync Session",fUnsuccessfulAlerts)); fAutosyncLastAlert=getSystemNowAs(TCTX_SYSTEM); fAutosyncAlerted=true; if (fUnsuccessfulAlerts>=AUTOSYNC_FORCEDOWN_RETRIES) { #ifndef ENGINE_LIBRARY // explicitly bring down connection (if we are in a XPT client) getXPTClientBase()->releaseConnection(true); #endif // bring down autosync autosync_stop(); } } } } return fAutosyncAlerted && aActive; } // CLIENTAGENTCONFIG::autosync_check // called to announce that a autosync session was performed void CLIENTAGENTCONFIG::autosync_confirm(bool aUnsuccessful) { if (aUnsuccessful) { // re-alert again later fUnsuccessfulAlerts++; // but clear main alert flag fAutosyncAlerted=false; } else { // clear alert autosync_ackAlert(false); } PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: confirmed %ssuccessful execution of autosync session",aUnsuccessful ? "un" : "")); } // CLIENTAGENTCONFIG::autosync_confirm // returns true if we need to perform a sync session now void CLIENTAGENTCONFIG::autosync_stop(void) { // perform steps until autosync is idle while(fAutosyncState!=autosync_idle) { // process one state machine step in inactive mode autosync_step(false); } } // CLIENTAGENTCONFIG::autosync_stop // parse parameter from aText static const char *getParam(const char *aText, string &aParam, bool aNeedsSemicolon) { aParam.erase(); // skip leading spaces while (*aText && (*aText==' ')) aText++; // must start with semicolon if (!aNeedsSemicolon || (*aText && (*aText==';'))) { if (aNeedsSemicolon) aText++; // skip it // skip more spaces if any while (*aText && (*aText==' ')) aText++; char quotechar=0; if (*aText==0x22) { quotechar=*aText++; // remember quote char } // read parameter while (*aText && (quotechar ? *aText!=quotechar : !isspace(*aText) && (*aText!=';'))) { // read char if (*aText=='\\') { aText++; if (*aText==0) break; } // add to result aParam += *aText++; } // skip quote char if this was one if (quotechar && *aText==quotechar) aText++; } return aText; } // getParam // get status information about autosync void CLIENTAGENTCONFIG::autosync_status( TAutosyncModes &aAutosyncMode, // currently active mode lineartime_t &aNextSync, // 0 if no scheduled nextsync lineartime_t &aLastAlert, // 0 if no alert seen so far uInt8 &aWhyNotFlags // autosync status flags ) { // return current mode aAutosyncMode = fAutosyncState==autosync_idle ? autosync_none : // show "disabled" state while idle fAutoSyncMode; // special check for IPP (but only if we are really in autosync at this time) #ifdef IPP_SUPPORT if (aAutosyncMode==autosync_ipp) { // check if we have the right activation level if (fIPPState!=ippstate_subscribed) { // reason for not being active is that we are not (yet) correctly activated and/or subscribed aWhyNotFlags=autosync_status_notsubscribed; aAutosyncMode=autosync_none; // show "disabled" while not activated or subscribed } } else #endif { // return reason for not being active right now // (but omit wrongday/wrongtime as these are user settings and should not show up as errors aWhyNotFlags= (fAutosyncState==autosync_idle || fAutosyncState==autosync_timedsync_wait) ? fWhyNotFlags & ~(autosync_status_wrongday+autosync_status_wrongtime) : 0; } // return time of next known sync aNextSync = fNextSyncAt; // timed sync disabled by zero interval? if (aAutosyncMode==autosync_timed) { if (aNextSync==0) { // reason for not being active is that for current mode (cradled/mobile), the interval is set to 0 aWhyNotFlags=autosync_status_disabled; aAutosyncMode=autosync_none; // show "disabled" while timed autosync is not active } else if (aWhyNotFlags) { // other reason for timed sync to be not active aAutosyncMode=autosync_none; // show "disabled" while timed autosync is not active } } // also report last alert aLastAlert=fAutosyncLastAlert; } // CLIENTAGENTCONFIG::autosync_status /// @brief helper: check if environment factors (other than time), such as Mem or Bat, allow this level /// @return true if active, false if not (and updated aWhyNotFlags) static bool checkLevelEnvFactors(const TAutoSyncLevel &aLevel, uInt8 &aWhyNotFlags) { bool levelActive; #ifndef ENGINE_LIBRARY uInt8 battlevel; bool acpowered; #ifdef ENGINEINTERFACE_SUPPORT #error "fMasterPointer in AppBase links to owning TEngineInterface!!" #endif if (getPowerStatus(battlevel,acpowered,getXPTClientBase()->fMasterPointer)) { // valid power info, check if this allows enabling level levelActive = acpowered || battlevel>=aLevel.ChargeLevel; } else { // no valid power info, enabled only if there's no min charge level defined levelActive = aLevel.ChargeLevel==0; } #else #ifdef RELEASE_VERSION #error "reorganize batt and memory level checks in a XPT independent way" #endif levelActive=true; #endif // set flag if battery is reason for inactive level if (!levelActive) aWhyNotFlags |= autosync_status_lowbat; // - check mem as well if (levelActive) { #ifndef ENGINE_LIBRARY // - battery power uInt8 memlevel; #ifdef ENGINEINTERFACE_SUPPORT #error "fMasterPointer in AppBase links to owning TEngineInterface!!" #endif if (getMemFreeStatus(memlevel,getXPTClientBase()->fMasterPointer)) { // valid memory info, check if this allows enabling level levelActive = memlevel>=aLevel.MemLevel; } else { // no valid memory info, enabled only if there's no min free mem level defined levelActive = aLevel.MemLevel==0; } #else levelActive=true; #endif // set flag if memory is reason for inactive level if (!levelActive) aWhyNotFlags |= autosync_status_lowmem; } return levelActive; } // checkLevelEnvFactors /// @brief helper: check if this level is active. /// @return /// - true if yes: returns true and sets aMode. /// - false if no: returns false /// - aNextCheckNeeded is always updated, if 0, we do not need to check because this level cannot get active any time /// OR no timed activity is needed to activate it (as in case of SAN - as long as app starts when SMS arrives, /// that's sufficient. static bool checkAutoSyncLevel(const TAutoSyncLevel &aLevel, lineartime_t aNow, lineartime_t &aNextCheckNeeded, uInt8 &aWhyNotFlags) { bool levelActive=false; // check if we are in one of the selected weekdays (localtime) uInt8 weekday=lineartime2weekday(aNow); if ((aLevel.WeekdayMask & (1<=aLevel.StartDayTime; bool beforend = minuteofdayserverURI; #endif const char *uripos = strstr(serverURI,sanObj.fServerID.c_str()); if (!uripos) { if (aLocalPush && strstr(serverURI,"/*")) { // catchall for local push PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: ServerID in SAN (%s) does not match, but profile has catchall-URI for local push",sanObj.fServerID.c_str())); } else { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: ServerID in SAN (%s) is not substring of current profile's Server URL (%s)",sanObj.fServerID.c_str(),serverURI)); return DB_NotFound; // no matching profile found } } // server identifier is ok, check if there are any syncs at all if (sanObj.fNSync<1) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: SAN does not contain any Sync requests")); return LOCERR_PROCESSMSG; // bad SAN } // check Digest for SANs Version 1.2 and higher if (sanObj.fProtocolVersion>=12) { // get real size of SAN size_t sanSize=aPushMsgSz; // not longer than this err = sanObj.GetSanSize(aPushMsg,sanSize); if (err!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: invalid SAN size (raw buffer = %ld), err=%d",aPushMsgSz,err)); return LOCERR_PROCESSMSG; // bad SAN } // now we have user/pw - check the digest string pw; getUnmangled(pw,alertedProfile->serverPassword,maxupwsiz); err=sanObj.CreateDigest( alertedProfile->serverUser, pw.c_str(), alertedProfile->lastNonce, aPushMsg, sanSize ); if (err==LOCERR_OK) { // have it checked if (!sanObj.DigestOK(aPushMsg)) { /// @todo %%% as long as it is unclear where nonce should come from, allow a "Synthesis" constant noce err=sanObj.CreateDigest( alertedProfile->serverUser, pw.c_str(), "Synthesis", aPushMsg, sanSize ); if (err==LOCERR_OK) err = sanObj.DigestOK(aPushMsg) ? LOCERR_OK : DB_Forbidden; } else err=LOCERR_OK; } // - @todo %%% missing for the moment, needs some work on san.cpp first if (err!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: invalid SAN digest, err=%hd",err)); return err; // digest not ok } } // SAN with Digest // store some info from SAN aAlertedProfile = fAutosyncProfileLastidx; // %%% for now, we only check the current profile aUIMode=sanObj.fUI_Mode; // pass UI mode out to allow GUI to react // - adjust UI mode if not specified if (aUIMode==UI_not_specified) { // not specified: in background for local sync, visible for remote sync (which will not run unless AutoSync is generally on!) aUIMode = aLocalPush ? UI_background : UI_informative; } fAutosyncSANSessionID = sanObj.fSessionID; // process the sync requests, first one is already here do { // alert by name, force sync (= sync wether target is enabled or not) // if we have UI interaction or localPush, we also alert those datastores that have never synced so far PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: SAN requests alert %d for '%s', content type code = 0x%lX",syncType,datastoreURI.c_str(),contentType)); if (alertDbByName(datastoreURI.c_str(), "",true,syncType,aUIMode==UI_user_interaction || aLocalPush)) { wantsSync=true; } // check if there are more nth++; err=sanObj.GetNthSync( nth, syncType, contentType, datastoreURI ); } while(err==LOCERR_OK); if (err!=404) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: error processing %d-th sync request",nth,err)); // but do not exit - it might still be that we have started alerted a sync already } if (wantsSync) { // update server version according to SAN SyncML version TSyncMLVersions alertVers; switch (sanObj.fProtocolVersion) { case 12 : alertVers = syncml_vers_1_2; break; case 11 : alertVers = syncml_vers_1_1; break; case 10 : alertVers = syncml_vers_1_0; break; default : alertVers = syncml_vers_unknown; break; } PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: SAN requests SyncML version %d.%d",sanObj.fProtocolVersion/10,sanObj.fProtocolVersion%10)); if (alertedProfile->lastSyncMLVersion!=alertVers) { // adjust it alertedProfile->lastSyncMLVersion=alertVers; writeProfile(aAlertedProfile,*alertedProfile); } // check if the profile is enabled for autosync at all /// @todo implement checking through all matching profiles - for now, only current is active if ( (fAutoSyncMode!=autosync_serveralerted && fAutoSyncMode!=autosync_ipp) || // no push mode selected for now fAutosyncState==autosync_idle // or active but disabled ) { // SAN is fine, however we are not in Autosync mode // Note: datastores are already alerted in DS config - GUI may choose to start a sync even if Autosync is off return DB_NotAllowed; } else { // we are in autosync mode, but check environment first fEnvCheckedAt = getSystemNowAs(TCTX_SYSTEM); if (fCurrentLevelIndex>=0 && !checkLevelEnvFactors(fAutosyncProfile.AutoSyncLevel[fCurrentLevelIndex], fWhyNotFlags)) { // environment factors disallow syncing now PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: SAN wants sync, but Bat/Mem of current level does not allow -> re-checking levels")); fNextCheckAt=0; // force re-checking for active levels return DB_NotAllowed; } } } // everything fine return wantsSync ? LOCERR_OK : DB_NotFound; // no matching target DS found } // autosync_processSAN #endif // performs next step in the state machine void CLIENTAGENTCONFIG::autosync_step(bool aActive) { #ifdef IPP_SUPPORT TcpRc_t tcperr; localstatus err; uInt16 connwaitseconds; const char *q,*p; const int bufsiz=2000; unsigned char buffer[bufsiz]; unsigned long received; #endif string s; TARGETRECORD target; sInt32 idx,seq; CLIENTDSCONFIG *dscfgP; uInt16 interval; string dbname; string filtercgi; bool done; bool newmode; lineartime_t now,nowminute; TAutoSyncStates newstate; bool isCradled; // get clientbase object #ifndef ENGINE_LIBRARY TXPTClientBase *clientBaseP = getXPTClientBase(); #endif do { // assume no state change newstate=fAutosyncState; fCurrentLevelIndex = -1; // none chosen yet // get current time now=getSystemNowAs(TCTX_SYSTEM); nowminute = (now / 60 / secondToLinearTimeFactor) * 60 * secondToLinearTimeFactor; // precision by minute only newmode=false; // assume no mode change done=true; // assume done after processing current state // sanity check for last alert: if (fAutosyncLastAlert>now) fAutosyncLastAlert=0; // reset when "last" alert seems to be in the future - which is not possible // check for new mode if (fNextCheckAt==0 || fNextCheckAt<=now) { // we need to find relevant autosync params fNextCheckAt=maxLinearTime; // infinity fNextWakeupCheckAt=maxLinearTime; // infinity lineartime_t nextcheck; uInt8 lvl; fWhyNotFlags=0; bool found=false; for (lvl=0; lvl0) t=now+AUTOSYNC_MEMCHECK_INTERVAL*secondToLinearTimeFactor; if (t0) t=now+AUTOSYNC_BATTCHECK_INTERVAL*secondToLinearTimeFactor; if (tisConnectable(true)) { found=false; fWhyNotFlags=autosync_status_notconnectable; // check availability of connection soon again fNextCheckAt=now+AUTOSYNC_CONNCHECK_INTERVAL*secondToLinearTimeFactor; } else #endif if (fAutosyncState==autosync_ipp_answerwait) { // is connectable and we are waiting for an answer // now check for changes in cradled/mobile status #ifndef ENGINE_LIBRARY isCradled = clientBaseP->isDeviceCradled(); #else isCradled = true; #endif if (fCurrentlyCradled!=isCradled) { fCurrentlyCradled=isCradled; #ifdef IPP_SUPPORT // seems this has changed, make sure we do a disconnect/reconnect // %%% is a bit ugly to influence the state machine here, but // on the other hand it's here we check so we act here as well... PDEBUGPRINTFX(DBG_HOT,("Detected change to %s state -> reconnect IPP",fCurrentlyCradled ? "cradled" : "mobile")); newstate=autosync_ipp_disconnect; fAutosyncRetries=2; // retry almost immediately done=false; #endif } } } // switch autosync off if none of the levels is active if (!found) { fNewMode=autosync_none; // disable } } // if we have a mode switch pending if (fNewMode!=fAutoSyncMode) { // delay mode switch until we have reached autosync_idle in between if (fAutosyncState==autosync_idle) { // show mode change PDEBUGPRINTFX(DBG_HOT,( "AUTOSYNC: ** MODE CHANGED from %s to %s", AutoSyncModeNames[fAutoSyncMode], AutoSyncModeNames[fNewMode] )); // now we can switch modes fAutoSyncMode=fNewMode; // this is a real mode switch (not only temporary deactivation), // - last alert is cleared when we are now actively going idle. For switching // between DMU and timed, we'll keep the last alert. if (fNewMode==autosync_none) { // - forget last alert, such that timed syncs will immediately start after re-start fAutosyncLastAlert=0; // never so far } } else { // stop current activity first before starting new aActive=false; // show pending mode change PDEBUGPRINTFX(DBG_TRANSP,( "AUTOSYNC: pending mode change from %s to %s - waiting for state to get idle", AutoSyncModeNames[fAutoSyncMode], AutoSyncModeNames[fNewMode] )); } } // now determine IPP state #ifdef IPP_SUPPORT if (isFeatureEnabled(&fAutosyncProfile,APP_FTR_IPP)) { if (fIPPState==ippstate_unknown) { // we have restarted, determine mode from what we have in the settings // (NOTE: this is independent of current autosync mode!) fIPPState=ippstate_idle; // Assume not activated at all fConversationStage=ippconvstage_login; // we need to log in first fDSCfgIterator = fDatastores.end(); if (fAutosyncProfile.ippSettings.id[0]!=0) { // we have a DMUCI/deviceID // - check further params that must be present for either state if (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMUS2G) { fIPPState=ippstate_activated; // with a DMUCI, we are at least activated // method IPP_METHOD_DMUS2G: if we have creds and server, we think we are subscribed if ( fAutosyncProfile.ippSettings.srv[0]!=0 && fAutosyncProfile.ippSettings.cred[0]!=0 ) fIPPState=ippstate_subscribed; } else { // method IPP_METHOD_DMU0 and OMP: when we have a server, we are subscribed // Note: for OMP, the actual SUBSCRIBE command will be issued after connecting later. // The "subscribed" term here relates to DMU terminology. if (fAutosyncProfile.ippSettings.srv[0]!=0) fIPPState=ippstate_subscribed; } } if (fAutosyncProfile.ippSettings.method!=IPP_METHOD_DMU0) { PDEBUGPRINTFX(DBG_TRANSP,( "AUTOSYNC: re-evaluated IPP state from available settings = %s", IPPStateNames[fIPPState] )); } } } #endif // now let state machine run switch (fAutosyncState) { case autosync_idle: // if idle and we want autosync active, we must start it now if (aActive && fAutoSyncMode!=autosync_none) { newstate=autosync_start; done=false; } break; case autosync_start: if (!aActive) { newstate=autosync_idle; break; } // select which loop to start in the state machine if (fAutoSyncMode==autosync_timed) { // go to timed sync checks newstate=autosync_timedsync; done=false; } #ifdef IPP_SUPPORT else if (fAutoSyncMode==autosync_ipp) { // for push methods, we do NOT want a timed sync immediately, // but only after a certain time after the last alert. if (fAutosyncLastAlert==0) fAutosyncLastAlert=now; // assume we have just synced (to avoid a sync shortly after start) // try to connect newstate=autosync_ipp_connect; fAutosyncRetries=0; done=false; } #endif // otherwise, just stay in autosync_start (e.g. for SAN push) break; case autosync_timedsync: if (!aActive) { newstate=autosync_idle; break; } // check for timed sync #ifndef ENGINE_LIBRARY isCradled=clientBaseP->isDeviceCradled(); #else isCradled=true; #endif interval = isCradled ? fAutosyncProfile.TimedSyncCradledPeriod : fAutosyncProfile.TimedSyncMobilePeriod; // calculate time of next sync, minute precision if (fAutosyncLastAlert==0) { if (interval!=0) fNextSyncAt=now; // if we don't know when we've last synced, sync NOW! } else { if (interval==0) break; // do not enter timed sync wait if interval is zero fNextSyncAt = fAutosyncLastAlert + (interval * 60 * secondToLinearTimeFactor); } if (PDEBUGTEST(DBG_TRANSP)) { string ts1,ts2; StringObjTimestamp(ts1,now); StringObjTimestamp(ts2,fNextSyncAt); PDEBUGPRINTFX(DBG_TRANSP,( "AUTOSYNC: Entered timed sync at %s, interval(%s)=%hd min -> next sync at %s", ts1.c_str(), isCradled ? "cradled" : "mobile", interval, ts2.c_str() )); } // update whyNot flags so we'll show the whynot cause as status if (fCurrentLevelIndex>=0) { checkLevelEnvFactors(fAutosyncProfile.AutoSyncLevel[fCurrentLevelIndex], fWhyNotFlags); fEnvCheckedAt = now; } // go waiting newstate=autosync_timedsync_wait; done=false; break; case autosync_timedsync_wait: if (!aActive) { newstate=autosync_idle; fNextSyncAt=0; // when we are not in timed sync, we don't know when next sync will be break; } // remove whynots after a while if (fWhyNotFlags && (now > fEnvCheckedAt+AUTOSYNC_ENVERRSDISPLAY_SECS*secondToLinearTimeFactor)) fWhyNotFlags = 0; // forget them until we re-evaluate them // check for timed sync if (fNextSyncAt!=0 && now>=fNextSyncAt) { // we should start a timed sync - but check environment first (might have changed since we checked last when entering timed sync) if (fCurrentLevelIndex<0) { fNextCheckAt=0; // force immediate check for active levels break; // don't check before we know which level we are in } fEnvCheckedAt = now; if(!checkLevelEnvFactors(fAutosyncProfile.AutoSyncLevel[fCurrentLevelIndex], fWhyNotFlags)) { // environment factors disallow syncing now PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: timed sync scheduled for now, but Bat/Mem does not allow -> re-checking levels")); fNextCheckAt=0; // force immediate check for active levels fNextSyncAt=0; // cancel this sync fAutosyncLastAlert = now; // prevent immediate retries, treat as if a sync was alerted newstate=autosync_timedsync; // calc next timed sync break; } // we should start a autosync PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: starting timed sync session")); // we need to re-evaluate the time of next sync, and eventually // enter another mode (could be that we've got here to perform // a safeguard timed sync while in push mode) newstate=autosync_start; // if any datastores are enabled, this will now cause // a sync, so count this as alert fAutosyncLastAlert=now; // autosync-alert all enabled local datastores seq=0; do { idx=findTargetIndex(fAutosyncProfile.profileID,seq++); if (idx<0) break; // no more targets getTarget(idx,target); // get related datastore in config dscfgP = static_cast(getLocalDS(target.dbname)); // check if we would cause a zap on either side if (target.enabled) { if (!( target.forceSlowSync && (target.syncmode==smo_fromclient || target.syncmode==smo_fromserver) )) { dscfgP->fAutosyncForced=false; dscfgP->fAutosyncAlerted=true; dscfgP->fAutosyncPathCGI.erase(); // alerted at least one, autosync is in alerted state now fAutosyncAlerted=true; PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: *** ALERTED timed autosync for all enabled datastores")); } else { // prevent autosync because of possible zap PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: datastore '%s' would cause client or server to be totally overwritten -> do not do timed autosync",dscfgP->getName())); } } } while (true); #ifdef SYDEBUG if (!fAutosyncAlerted) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: No timed sync possible because no datastore available for sync")); } #endif } break; #ifdef IPP_SUPPORT case autosync_ipp_connectwait: if (!aActive) { newstate=autosync_idle; break; } // start wait phase fAutosyncLastStateChange=now; newstate=autosync_ipp_connectwaiting; // check if we need to resubscribe instead of connecting // (IPP_METHOD_DMUS2G only) if ( fAutosyncProfile.ippSettings.method==IPP_METHOD_DMUS2G && fAutosyncRetries>=IPP_RESUBSCRIBE_RETRIES ) { // check if we need to reactivate if (fAutosyncRetries>=IPP_REACTIVATE_RETRIES) { // force re-activation fIPPState=ippstate_idle; #ifdef SYDEBUG if (fAutosyncRetries==IPP_REACTIVATE_RETRIES) PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: too many unsuccessful retries (#%hd) -> cleared activation",fAutosyncRetries)); #endif if (fAutosyncRetries>=IPP_BLOCK_RETRIES) { // prevent hectic syncs in case nothing works at all #ifdef SYDEBUG if (fAutosyncRetries==IPP_BLOCK_RETRIES) PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: too many unsuccessful retries (#%hd) -> IPP deactivated",fAutosyncRetries)); #endif newstate=autosync_idle; break; } } if (fUnsuccessfulAlerts==0) { // resubscribe PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: too many unsuccessful retries (#%hd) -> requesting resubscription",fAutosyncRetries)); newstate=autosync_ipp_resubscribe; break; } // in case of unsuccesful alerts pending, we'll just enter the waiting state } PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: waiting to connect before next retry (#%hd)",fAutosyncRetries)); done=false; break; case autosync_ipp_connectwaiting: // check for deactivation if (!aActive) { newstate=autosync_idle; break; } // wait until we can reconnect connwaitseconds = IPP_MIN_RECONNECTWAIT<<(fAutosyncRetries-1); if (connwaitseconds>IPP_MAX_RECONNECTWAIT) connwaitseconds=IPP_MAX_RECONNECTWAIT; if (fAutosyncRetries==0 || now>fAutosyncLastStateChange+connwaitseconds*secondToLinearTimeFactor) { // waited long enough newstate=autosync_ipp_connect; PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: waited for %hd seconds in autosync_ipp_connectwaiting",connwaitseconds)); done=false; } break; case autosync_ipp_resubscribe: // IPP_METHOD_DMUS2G only: // force a sync session for resubscription PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: Performing a sync session to (re-)subscribe now, datastores=%s",fAutosyncProfile.ippSettings.timedds)); if (fIPPState>ippstate_activated) fIPPState=ippstate_activated; // forget subscription if we had one // - wipe server address to make sure we don't use old, expired one any more fAutosyncProfile.ippSettings.srv[0]=0; // - wipe credential fAutosyncProfile.ippSettings.cred[0]=0; // - do an implicit sync newstate=autosync_alert_implicit; done=false; break; case autosync_alert_implicit: // state is idle after an implicit alert newstate=autosync_idle; // only alert if no unsuccessful alerts are pending if (fUnsuccessfulAlerts==0) { // alert all datastores in fImplicitDatastores p = fAutosyncProfile.ippSettings.timedds; while (*p) { // find next comma or EOS for (q=p; *q!=',' && *q!=0; q++); dbname.assign(p,q-p); // alert for sync, no extra filter if (alertDbByName(dbname.c_str(),"",true)) { fAutosyncAlerted=true; fAutosyncLastAlert=now; } // next name if (*q) q++; // skip delimiter p=q; // start after next delimiter, if any } } // - now alert a timed sync session done=true; break; case autosync_ipp_connect: // check if we are connectable at this time if (!clientBaseP->isConnectable(true)) { // we cannot connect now, disable autosync for now newstate=autosync_idle; // effective immediately done=false; // force re-checking of autosync mode (which will keep autosync off until connectable) fNextCheckAt=0; } if (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMU0) { // use the "maxinterval" sync interval in addition to push if ( (fAutosyncLastAlert!=0) && (fAutosyncProfile.ippSettings.maxinterval!=0) && (now>fAutosyncLastAlert+fAutosyncProfile.ippSettings.maxinterval*60*secondToLinearTimeFactor) && !(fAutosyncProfile.ippSettings.timedds[0]==0) && (fUnsuccessfulAlerts==0) ) { // no push alert within maxinterval, perform an implicit timed sync with the datastores from timedds newstate=autosync_alert_implicit; PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: no alert within maxinterval=%hd mins, performing an implicit autosync session now",fAutosyncProfile.ippSettings.maxinterval)); done=false; break; } } else if (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMUS2G) { // enhanced protocol with router/server architecture // - check if we need to trigger a sync session to (re-)activate/subscribe and get creds // - we start a sync session if we are not subscribed (and we haven't tried for at least IPP_MIN_RESUBSCRIBEWAIT) // - we start a sync session if current credential has timed out if ( ( (fIPPState!=ippstate_subscribed && (fAutosyncRetries==0 || now>fAutosyncLastAlert+IPP_MIN_RESUBSCRIBEWAIT*secondToLinearTimeFactor)) || ( (fAutosyncLastAlert!=0) && (fAutosyncProfile.ippSettings.maxinterval!=0) && (now>fAutosyncLastAlert+fAutosyncProfile.ippSettings.maxinterval*60*secondToLinearTimeFactor) ) ) && !(fAutosyncProfile.ippSettings.timedds[0]==0) && (fUnsuccessfulAlerts==0) ) { PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: no credential or no alert within current credential lifetime=%d mins, performing an implicit sync to (re-)subscribe now",fAutosyncProfile.ippSettings.maxinterval)); // we need to resubscribe newstate=autosync_ipp_resubscribe; // this is a failed attempt to connect, make sure fAutosyncRetries is not zero any more fAutosyncRetries++; done=false; break; } } // if we have no server here, state must be re-evaluated if (fAutosyncProfile.ippSettings.srv[0]==0) fIPPState=ippstate_unknown; // check for unsubscribed again if (fIPPState!=ippstate_subscribed) { // not subscribed (no server address) -> keep waiting PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: IPP connection cannot be made because IPP state is not subscribed -> wait again")); if (fAutosyncRetriesestablishConnectionFor(s.c_str(),true); // background priority connection if (err!=LOCERR_OK) { // failed, wait until trying again PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: autosync_ipp_connect: failed establishing connection, err=%hd",err)); newstate=autosync_ipp_connectwait; // just not being able to establish a connection MUST NOT trigger a resubscription! if (fAutosyncRetriesreleaseConnection(fAutosyncRetries>=IPP_FORCEDOWN_RETRIES); PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: disconnected, entering wait for next connection...")); newstate=autosync_ipp_connectwait; break; case autosync_ipp_sendrequest: // check for deactivation if (!aActive) { newstate=autosync_ipp_disconnect; done=false; break; } // send IPP request // - clear answer string fAutosyncIPPAnswer.erase(); // - nothing known about headers or conten length yet fHeaderLength = 0; fContentLength = 0; if (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMU0) { // DMU method 0 (aka IPP, aka DMU demo) // - create GET request string StringObjPrintf(s, "GET %s%s\r\n", fAutosyncProfile.ippSettings.path, fAutosyncProfile.ippSettings.id ); } else if (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMUS2G) { // DMU method 1 (s2g router/server architecture) // - create LOGIN request string StringObjPrintf(s, "LOGIN %s%s\r\n" "cred=%s\r\n" "\r\n", fAutosyncProfile.ippSettings.path, fAutosyncProfile.ippSettings.id, fAutosyncProfile.ippSettings.cred ); } else if (fAutosyncProfile.ippSettings.method==IPP_METHOD_OMP) { // Oracle Mobile Push string data; data.erase(); // - prepare POST request StringObjPrintf(s, "POST %s HTTP/1.1\r\n" "Host: %s\r\n" "Content-Type: application/vnd.mobilepush\r\n", fAutosyncProfile.ippSettings.path, fAutosyncProfile.ippSettings.srv ); // - now add specific command if (fConversationStage==ippconvstage_login) { // need login first string pw; getUnmangled(pw, fAutosyncProfile.serverPassword); // we need to login first StringObjPrintf(data, "LOGIN %s#P%s %s\r\n", fAutosyncProfile.serverUser, fAutosyncProfile.ippSettings.id, pw.c_str() ); } else { // not login, add the cookie StringObjAppendPrintf(s, "Cookie: %s\r\n", fOMPCookie.c_str() ); // now the command if (fConversationStage==ippconvstage_subscribe) { // logged in, now subscribe to all available datastores while (fDSCfgIterator != fDatastores.end()) { // check the datastore CLIENTDSCONFIG *dscfgP = static_cast(*fDSCfgIterator); fDSCfgIterator++; cAppCharP subsName = NULL; if (dscfgP->fDSAvailFlag & dsavail_contacts) subsName = "CONTACTS"; else if (dscfgP->fDSAvailFlag & dsavail_events) subsName = "CALENDAR"; else if (dscfgP->fDSAvailFlag & dsavail_tasks) subsName = "TODO"; else if (dscfgP->fDSAvailFlag & dsavail_emails) subsName = "EMAIL"; else continue; // try next // create subscription for this datastore StringObjPrintf(data, "SUBSCRIBE %s\r\n", subsName ); break; } } else if (fConversationStage==ippconvstage_polling) { // subscribed, now poll // - add push time header StringObjAppendPrintf(s, "TruePush-time: %d\r\n", fAutosyncProfile.ippSettings.period ); // - and the command data = "P\r\n"; } } // add content with length header StringObjAppendPrintf(s, "Content-Length: %ld\r\n" "\r\n" "%s", data.size(), data.c_str() ); } else { // unknown method, disconnect again PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: Warning: unknown method=%d, disconnecting",(int)fAutosyncProfile.ippSettings.method)); newstate=autosync_ipp_disconnect; done=false; break; } PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: sending request: %s",s.c_str())); // - sent it tcperr = tcpSendDataEx( &fAutosyncIPPSocket, // socket (unsigned char *)s.c_str(), // request string s.size(), 5 // maximally 5 seconds (usually, this should work w/o ANY timeout) ); if (tcperr==TCP_RC_ETIMEDOUT) break; // just try again later if (tcperr!=TCP_RC_OK) { // failed: disconnect & reconnect PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: failed sending request, tcperr=%d",tcperr)); newstate=autosync_ipp_disconnect; fAutosyncRetries++; // count retry done=false; break; } // request sent ok newstate=autosync_ipp_answerwait; // and wait for answer fAutosyncLastStateChange=now; break; case autosync_ipp_answerwait: // check for deactivation if (!aActive) { newstate=autosync_ipp_disconnect; done=false; break; } // when we've got so far, now enable timed-sync-while-ipp-active // if not already enabled (enabled = fAutosyncLastAlert is set) if (fAutosyncLastAlert==0) fAutosyncLastAlert=now; // wait for IPP answer received=bufsiz; tcperr = tcpReadDataEx( &fAutosyncIPPSocket, // Socket buffer, &received, 0 ); if (tcperr==TCP_RC_ETIMEDOUT) { // check if connection is still ok if (!clientBaseP->isConnectionOK()) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: Connection not ok any more while waiting for answer -> disconnect")); newstate=autosync_ipp_disconnect; fAutosyncRetries=2; // retry almost immediately done=false; } // check if IPP period is over uInt32 timeout = fAutosyncProfile.ippSettings.method==IPP_METHOD_OMP && fConversationStage!=ippconvstage_polling ? IPP_OMP_COMMAND_TIMEOUT : // non-poll OMP command fAutosyncProfile.ippSettings.period; // poll command if (now>fAutosyncLastStateChange+timeout*secondToLinearTimeFactor) { // IPP period timeout PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: IPP period timeout (%d secs), go to disconnect",timeout)); newstate=autosync_ipp_disconnect; fAutosyncRetries=0; // ok so far done=false; } break; // stay in answerwait or disconnect after period timeout } if (tcperr==TCP_RC_EOF) { // connection properly closed newstate=autosync_ipp_endanswer; break; } if (tcperr!=TCP_RC_OK) { // failed: disconnect & reconnect PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: failed receiving answer, tcperr=%d",tcperr)); newstate=autosync_ipp_disconnect; fAutosyncRetries++; // count retry done=false; break; } // received answer bytes fAutosyncIPPAnswer.append((const char *)buffer,received); if (fAutosyncProfile.ippSettings.method==IPP_METHOD_OMP) { size_t n; // check for content length if (fContentLength==0) { n = fAutosyncIPPAnswer.find("Content-Length: "); if (n!=string::npos) { n += 16; n += StrToULong(fAutosyncIPPAnswer.c_str()+n, fContentLength, 9); } } // check for end of headers if (fHeaderLength==0) { n = fAutosyncIPPAnswer.find("\r\n\r\n"); if (n!=string::npos) { fHeaderLength = n+4; } } // check for all data seen if (fHeaderLength && fContentLength && fAutosyncIPPAnswer.size()>=fHeaderLength+fContentLength) { // End of request, but not necessarily connection. // (processing answer will decide if connection must be closed) newstate=autosync_ipp_processanswer; break; } } // stay in answerwait until connection closes break; case autosync_ipp_endanswer: PDEBUGPRINTFX(DBG_TRANSP,("AUTOSYNC: end of data from server, closing connection")); // close connection tcpCloseConnection(&fAutosyncIPPSocket); fAutosyncIPPSocket=0; #ifdef TCP_LEAK_DEBUG fTcpLeakCounter--; #endif // release connection clientBaseP->releaseConnection(); // state is idle after processing a message newstate=autosync_ipp_processanswer; // leave app some time to close and release the connection done=true; break; case autosync_ipp_processanswer: PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: processing answer from server: %" FMT_LENGTH("0.100") "s",FMT_LENGTH_LIMITED(100,fAutosyncIPPAnswer.c_str()))); // state is idle after processing a message newstate=autosync_idle; // process collected answer bytes p=fAutosyncIPPAnswer.c_str(); uInt16 retriedsofar=fAutosyncRetries; fAutosyncRetries=0; bool disconnect=true; // default to disconnect for every message if (fAutosyncProfile.ippSettings.method==IPP_METHOD_OMP) { // parse line by line bool inheaders=true; disconnect=false; // for OMP, only disconnect if explicitly requested by "Connection:" header while (*p) { // check for those headers we need to know if (strucmp(p,"\r\n",2)==0) { p+=2; inheaders=false; break; } if (strucmp(p,"Set-Cookie: ",12)==0) { // extract login cookie p+=12; q=p; while (*q && *q!=';' && *q>=' ') q++; fOMPCookie.assign(p,q-p); } else if (strucmp(p,"Connection: close",22)==0) { disconnect=true; } // go past next CRLF while (*p && *p!='\r') p++; p++; if (*p=='\n') p++; } // now decode status returned (still in headers means failure as well) bool success = !inheaders && (strucmp(p,"OK ",3)==0) || isdigit(*p); // a non-ok on any stage means we must retry or fall back to login after some retries if (!success) { fAutosyncRetries=retriedsofar+1; // this is an error, keep counting retries PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: OMP server error: %" FMT_LENGTH("0.100") "s",FMT_LENGTH_LIMITED(100,p))); newstate=autosync_ipp_disconnect; if (fAutosyncRetries>IPP_OMP_RELOGIN_RETRIES) { PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: OMP repeated server error -> force relogin")); fConversationStage = ippconvstage_login; } break; } // basically ok, now depends on communication stage if (fConversationStage==ippconvstage_login) { // last command sent was login // - next is subscribe fConversationStage=ippconvstage_subscribe; // - start with first datastore fDSCfgIterator = fDatastores.begin(); } else if (fConversationStage==ippconvstage_subscribe) { // check if more DS must be subscribed if (fDSCfgIterator == fDatastores.end()) fConversationStage=ippconvstage_polling; // all subscribed, proceed to polling now } else if (fConversationStage==ippconvstage_polling) { // check polling response while (isdigit(*p)) { // event line // Syntax: notify_seqno SP dest_app SP username SP deviceID SP event // 12 EMAIL john.doe@oracle.com 123123:132123:132123 SYNC // - skip seqno while (*p && isdigit(*p)) p++; if (*p==' ') { p++; // - extract app uInt16 availFlag; q=p; while (*q && *q!=' ') q++; if (strucmp(p,"CONTACTS",q-p)==0) availFlag = dsavail_contacts; else if (strucmp(p,"CALENDAR",q-p)==0) availFlag = dsavail_events; else if (strucmp(p,"TODO",q-p)==0) availFlag = dsavail_tasks; else if (strucmp(p,"EMAIL",q-p)==0) availFlag = dsavail_emails; if (availFlag) { // check for SYNC event p=q; if (*p==' ') p++; // - skip user while (*p && *p!=' ') p++; if (*p==' ') p++; // - skip device ID while (*p && *p!=' ') p++; if (*p==' ') p++; // check for SYNC command if (strucmp(p,"SYNC",4)==0) { PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: received OMP sync request for availFlags=0x%hX",availFlag)); // alert for sync if (alertDbByAppType(availFlag,true)) { fAutosyncAlerted=true; fAutosyncLastAlert=now; disconnect=true; // break TCP connection } } } else break; } // forward to end of line or string while (*p && (*p>=0x20)) p++; while (*p && ((*p=='\n') || (*p=='\r'))) p++; } // while } } else { // DMU0 or DMUS2G while (*p) { // check for basic command if ( (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMU0 && strucmp(p,"Sync:",5)==0) || (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMUS2G && strucmp(p,"sync=",5)==0) ) { p+=5; // get datastore name (remote datastore path, that is!) p=getParam(p,dbname,false); // get eventual additional params // - first is filter CGI p=getParam(p,filtercgi,true); // search DB to flag autosync for it PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: received sync request for db='%s', filter='%s'",dbname.c_str(),filtercgi.c_str())); // alert for sync if (alertDbByName(dbname.c_str(),filtercgi.c_str(),true)) { fAutosyncAlerted=true; fAutosyncLastAlert=now; } } // if "Sync:" or "sync=" line else if ( (fAutosyncProfile.ippSettings.method==IPP_METHOD_DMUS2G && strucmp(p,"error=",6)==0) ) { p+=6; fAutosyncRetries=retriedsofar+1; // this is an error, keep counting retries // get error code uInt32 dmuerr=99999; // unknown error code StrToULong(p,dmuerr,6); if (dmuerr==10010 || dmuerr==10020) { // credential unknown, bad or expired // - make sure that we'll resubscribe if (fAutosyncRetries( getLocalDS(target.dbname) ); bool mayStart= aAlwaysStart || (target.lastSync!=0); // start allowed ONLY if we have synced before with this target // if we have an explicit sync mode, this overrides the preset mode if (mayStart) { if (aSyncAlert!=0) { // caller provides a sync mode dscfgP->fAutosyncAlertCode=aSyncAlert; // use passed sync alert code } else { // do not automatically start in "dangerous" modes dscfgP->fAutosyncAlertCode=0; // get mode from config mayStart = !( target.forceSlowSync && (target.syncmode==smo_fromclient || target.syncmode==smo_fromserver) ); } } // start if not "dangerous" or when sync mode is explicitly requested by trusted party (SAN) if (mayStart) { // alert dscfgP->fAutosyncForced=aForced; // forced if selected dscfgP->fAutosyncAlerted=true; // alerted anyway AssignString(dscfgP->fAutosyncPathCGI, aFilterCGI); // alerted at least one, IPP is in alerted state now alertedAny=true; PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: *** ALERTED autosync for datastore '%s' (requested alert=%hd)",dscfgP->getName(),dscfgP->fAutosyncAlertCode)); } else { // prevent autosync because of possible zap PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: datastore '%s' never synceed so far or would IMPLICITLY cause client or server to be totally overwritten -> do not autosync",dscfgP->getName())); } } } while (true); return alertedAny; } // CLIENTAGENTCONFIG::alertDbByName /// @brief alert a datastore by generic application type (DSAvailFlag) /// @note if syncType is given (e.g. from a SAN) complete overwrites are possible if explicitly requested bool CLIENTAGENTCONFIG::alertDbByAppType(uInt16 aDSAvailFlag, bool aForced, bool aAlwaysStart) { bool alertedAny=false; TARGETRECORD target; TLocalDSList::iterator pos; for(pos=fDatastores.begin();pos!=fDatastores.end();pos++) { CLIENTDSCONFIG *dscfgP = static_cast(*pos); if ((dscfgP->fDSAvailFlag & aDSAvailFlag) == aDSAvailFlag) { // found datastore // - get target record to check settings sInt32 idx = findTargetIndexByDBInfo(fAutosyncProfile.profileID, dscfgP->fLocalDBTypeID, NULL); if (idx>=0) { getTarget(idx,target); bool mayStart= aAlwaysStart || (target.lastSync!=0); // start allowed ONLY if we have synced before with this target // if we have an explicit sync mode, this overrides the preset mode if (mayStart) { // do not automatically start in "dangerous" modes dscfgP->fAutosyncAlertCode=0; // get mode from config mayStart = !( target.forceSlowSync && (target.syncmode==smo_fromclient || target.syncmode==smo_fromserver) ); } // start if not "dangerous" or when sync mode is explicitly requested by trusted party (SAN) if (mayStart) { // alert dscfgP->fAutosyncForced=aForced; // forced if selected dscfgP->fAutosyncAlerted=true; // alerted anyway // alerted at least one, IPP is in alerted state now alertedAny=true; PDEBUGPRINTFX(DBG_HOT,("AUTOSYNC: *** ALERTED OMP autosync for datastore '%s' (requested alert=%hd)",dscfgP->getName(),dscfgP->fAutosyncAlertCode)); } else { // prevent autosync because of possible zap PDEBUGPRINTFX(DBG_ERROR,("AUTOSYNC: datastore '%s' never synced so far or would IMPLICITLY cause client or server to be totally overwritten -> do not autosync",dscfgP->getName())); } } } } return alertedAny; } // CLIENTAGENTCONFIG::alertDbByAppType #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync/clientautosync_inc.h0000755000373300037200000002645312424517753026730 0ustar00nightlyallusers00000000000000/* * File: clientautosync_inc.h * */ #ifdef IPP_SUPPORT // we need the platform-specific TCP-IP implementation extern "C" { #include "xptitcp.h" } #endif // we need the xpt client base if we directly do TCP/IP #if defined(IPP_SUPPORT) || !defined(ENGINE_LIBRARY) #include "xptclientbase.h" #endif #ifdef SERVERALERT_SUPPORT #include "san.h" #endif // define to debug TCP open/close balance //#define TCP_LEAK_DEBUG 1 #ifdef GAL_CLIENT_SUPPORT #define GAL_STRING_MAX 80 // globals typedef struct { // GAL settings bool galUpdated; char url[GAL_STRING_MAX]; char domain[GAL_STRING_MAX]; } TGALInfo; extern TGALInfo gGALInfo; #endif // we need some system status routins // these routines must be implemented in the application // - get power status (percentage) of the system, returns false if none available bool getPowerStatus(uInt8 &aBattLevel, bool &aACPowered, void *aMasterPointer); // - get free memory status (percentage free) of the system, returns false if none available bool getMemFreeStatus(uInt8 &aMemLevel, void *aMasterPointer); // - check if device is cradled bool isDeviceCradled(void *aMasterPointer); namespace sysync { // Autosync modes // note: %%% eventually, SMP GUI still depends on this order - PPC is fixed as per 2006-03-09 typedef enum { autosync_ipp, // Intelligent Push&Poll (DMU) autosync_timed, // timed sync (scheduled sync) autosync_none, // no autosync autosync_serveralerted, // SAN - SyncML server alerted sync num_autosync_modes } TAutosyncModes; // Autosync status #define autosync_status_wrongday 0x01 #define autosync_status_wrongtime 0x02 #define autosync_status_lowmem 0x04 #define autosync_status_lowbat 0x08 #define autosync_status_disabled 0x10 // disabled by interval=0 (for example) #define autosync_status_notconnectable 0x20 #define autosync_status_notsubscribed 0x40 #define autosync_status_notlicensed 0x80 // IPP/DMU without license // Autosync condition level settings record // NOTE!!!!!: If this struct is changed, this implies a PROFILE_DB_VERSION change!!! typedef struct { TAutosyncModes Mode; uInt16 StartDayTime; // [min from midnight] when to start autosync uInt16 EndDayTime; // [min from midnight] when to stop autosync uInt8 WeekdayMask; // [Bits: 0=sun, 1=mon .. 6=sat] days when autosync is active uInt8 ChargeLevel; // percent of battery charge required to activate uInt8 MemLevel; // percent of memory that must be free for doing autosync uInt8 Flags; // additional condition flags - reserved for future use } TAutoSyncLevel; // IPP methods #define IPP_METHOD_DMU0 0 // simple poll, open specification, used by Toffa SyncWiseEnterprise #define IPP_METHOD_DMUS2G 1 // proprietary s2g method 1 protocol, confidential spec #define IPP_METHOD_OMP 2 // Oracle Mobile Push // Autosync IPP settings record // NOTE!!!!!: If this struct is changed, this implies a PROFILE_DB_VERSION change!!! const uInt16 maxippidsiz=64; const uInt16 maxipppathsiz=64; typedef struct { char srv[maxipppathsiz]; uInt16 port; uInt16 period; char path[maxipppathsiz]; char id[maxippidsiz]; uInt8 method; // new PROFILE_DB_VERSION>=6 fields char cred[maxipppathsiz]; uInt16 maxinterval; char timedds[maxipppathsiz]; } TIPPSettings; typedef enum { ippstate_unknown, ippstate_idle, ippstate_activated, ippstate_subscribed, num_ipp_states } TIPPActivationState; typedef enum { ippconvstage_login, ippconvstage_subscribe, ippconvstage_polling } TIPPConvStage; // AutoSync states typedef enum { autosync_idle, // no activity autosync_start, // start selected autosync mechanism autosync_timedsync, // start pure scheduled sync (calc when we need next sync) autosync_timedsync_wait, // waiting for scheduled sync to occur autosync_ipp_connectwait, // start waiting until connecting again autosync_ipp_connectwaiting, // waiting for connecting again autosync_ipp_resubscribe, // cause a timed sync to re-subscribe to IPP autosync_alert_implicit, // implicit alert autosync_ipp_connect, // connect to server autosync_ipp_sendrequest, // send request to server autosync_ipp_answerwait, // connected, waiting for answer from IPP server autosync_ipp_disconnect, // disconnect from the server autosync_ipp_endanswer, // disconnect after a IPP answer autosync_ipp_processanswer, // process collected IPP answer num_autosync_states } TAutoSyncStates; // IPP parameters #define IPP_MIN_RECONNECTWAIT 3 // [seconds] #define IPP_MAX_RECONNECTWAIT 1800 // [seconds] = half an hour #define IPP_FORCEDOWN_RETRIES 3 // force down connection after 3 failed reconnects #define IPP_RESUBSCRIBE_RETRIES 5 // re-subscribe after 5 failed reconnects #define IPP_REACTIVATE_RETRIES 7 // after 7 failed reconnects with resubscription, force a reactivation #define IPP_BLOCK_RETRIES 9 // after 9 failed reconnects, do not do anything any more #define IPP_MIN_RESUBSCRIBEWAIT 180 // [seconds] wait minimally 3 minutes until re-trying subcription in case previous sync session did not deliver subscription params #define IPP_OMP_COMMAND_TIMEOUT 10 // [seconds] wait x seconds for non-poll OMP command to get answer #define IPP_OMP_RELOGIN_RETRIES 2 // fall back to re-login after 2 failed attempts // Autosync parameters #define AUTOSYNC_MAX_ALERTRETRIES 5 // retry max 5 times to start a sync session again after a failed alert #define AUTOSYNC_FORCEDOWN_RETRIES 2 // after 2 retries, bring down connection first before re-trying #define AUTOSYNC_MIN_ALERTRETRY 10 // retry after 10,20,40,80 and 160 secs #define AUTOSYNC_BATTCHECK_INTERVAL 60 // check battery level every minute #define AUTOSYNC_MEMCHECK_INTERVAL 60 // check memory every minute #define AUTOSYNC_CONNCHECK_INTERVAL 10 // check connection status every 10 seconds #define AUTOSYNC_ENVERRSDISPLAY_SECS 15 // show battery/mem errors 15 seconds after failed timed autosync #ifdef IPP_SUPPORT // applies the value to the IPP parameter identified by aTag // This can be called from client provisioning code or from a sync session's GET // command RESULT (if the server supports IPP autoconfig) void ipp_setparam(const char *aTag, const char *aValue, TIPPSettings &aIPPSettings); #endif #ifdef TCP_LEAK_DEBUG #define TCP_LEAKCOUNTER uInt32 fTcpLeakCounter; #else #define TCP_LEAKCOUNTER #endif #ifdef IPP_SUPPORT #define IPP_VARS \ uInt16 fAutosyncRetries; /* retry count for IPP connection attempts */ \ Socket_t fAutosyncIPPSocket; /* the socket used for IPP */ \ string fAutosyncIPPAnswer; /* the IPP answer is collected here */ \ TIPPActivationState fIPPState; /* the IPP activation state */ \ TIPPConvStage fConversationStage; /* conversation stage within IPP poll connection (OMG only at this time) */ \ TLocalDSList::iterator fDSCfgIterator; /* iterator for datastores (used for SUBSCRIBE in OMP) */ \ string fOMPCookie; /* cookie for OMP */ \ uInt32 fHeaderLength; /* header length */ \ uInt32 fContentLength; /* content length */ #define IPP_METHODS #else #define IPP_METHODS #define IPP_VARS #endif #ifdef SERVERALERT_SUPPORT #define SAN_VARS \ uInt32 fAutosyncSANSessionID; /* Session ID as requested by SAN */ #define SAN_METHODS \ /* - analyzes server alert (SAN) message */ \ localstatus autosync_processSAN(bool aLocalPush, void *aPushMsg, uInt32 aPushMsgSz, cAppCharP aHeaders, sInt32 &aAlertedProfile, UI_Mode &aUIMode); #else #define SAN_METHODS #define SAN_VARS #endif // macro to declare autosync methods and fields in agent config #ifndef AUTOSYNC_SUPPORT #define CLIENTAUTOSYNC_CLASSDECL #else #define CLIENTAUTOSYNC_CLASSDECL \ public: \ /* Autosync methods */ \ /* - init autosync mechanism */ \ void autosync_init(lineartime_t aLastAlert); \ /* - set profile */ \ void autosync_setprofile(sInt32 aProfileIndex, bool aHasChanged); \ /* must be called to obtain DMU PUT command data to send to SyncML server */ \ void autosync_get_putrequest(string &aReq); \ /* - should be called when environmental params have changed */ \ void autosync_condchanged(void); \ /* - check if app may quit */ \ bool autosync_canquit(lineartime_t &aRestartAt, bool aEnabled); \ /* - check if we need a sync now */ \ bool autosync_check(bool aActive); \ /* - get status information about autosync */ \ void autosync_status( \ TAutosyncModes &aAutosyncMode, /* currently active mode */ \ lineartime_t &aNextSync, /* 0 if no scheduled nextsync */ \ lineartime_t &aLastAlert, /* 0 if no alert seen so far */ \ uInt8 &aWhyNotFlags /* why-no-autosync status flags */ \ ); \ /* - returns true if we need to perform a sync session now */ \ void autosync_stop(void); \ /* - performs next step in the state machine */ \ void autosync_step(bool aActive); \ /* - forget or activate syncs alerted for autosync in DS config */ \ void autosync_ackAlert(bool aAck); \ /* - confirm that autosync has taken place (clears alerted flag) */ \ void autosync_confirm(bool aUnsuccessful=false); \ /* - parse ipp params */ \ void ipp_setparam(const char *aTag, const char *aValue, TIPPSettings &aIPPSettings); \ IPP_METHODS \ SAN_METHODS \ /* - profile record */ \ PROFILERECORD fAutosyncProfile; \ sInt32 fAutosyncProfileLastidx; /* -1 if no profile selected before */ \ private: \ /* alert a datastore by remote database name */ \ bool alertDbByName(const char *aRemoteDBName, const char *aFilterCGI, bool aForced, uInt16 syncAlert=0, bool aAlwaysStart=false); \ /* alert a datastore by generic type flag */ \ bool alertDbByAppType(uInt16 aDSAvailFlag, bool aForced, bool aAlwaysStart=false); \ /* private vars needed for autosync */ \ /* - state vars */ \ sInt16 fCurrentLevelIndex; /* index of currently active autosync level, -1 if none */ \ TAutosyncModes fAutoSyncMode; /* currently active autosync mode */ \ TAutosyncModes fNewMode; /* new target mode */ \ lineartime_t fNextCheckAt; /* when we need to check for mode change or timed sync next, 0 if immediately */ \ lineartime_t fNextWakeupCheckAt; /* when we need to wakeup app to check levels, 0 if immediately */ \ uInt8 fWhyNotFlags; /* reason why we cannot run autosync now */ \ lineartime_t fEnvCheckedAt; /* when we last checked the mem/batt environmental factors */ \ lineartime_t fNextSyncAt; /* when next sync will take place */ \ TAutoSyncStates fAutosyncState; /* current state machine state */ \ bool fAutosyncAlerted; /* set when some datastores get alerted, cleared when autosync_confirm() */ \ lineartime_t fAutosyncLastStateChange; /* time when state changed last time */ \ uInt16 fUnsuccessfulAlerts; /* if > 0, we had unsuccessful alerts - delay re-alerting */ \ IPP_VARS \ SAN_VARS \ bool fCurrentlyCradled; /* the current IPP connection is assuming cradled operation */ \ /* timed sync */ \ lineartime_t fAutosyncLastAlert; /* time when last autosync was alerted */ \ TCP_LEAKCOUNTER #endif // macro to declare autosync fields in DB (target) config #ifndef AUTOSYNC_SUPPORT #define CLIENTAUTOSYNC_CLASSDECL_DB #else #define CLIENTAUTOSYNC_CLASSDECL_DB \ public: \ bool fAutosyncAlerted; /* set if server requested sync of this datastore */ \ bool fAutosyncForced; /* set if server requests sync of this datastore even if target is disabled */ \ uInt16 fAutosyncAlertCode; /* if not 0, this is the alert code requested e.g. by a SAN initiated autosync */ \ string fAutosyncPathCGI; /* the CGI to be appended to the database path */ #endif } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync/clientprovisioning_inc.cpp0000755000373300037200000003061112424517753030133 0ustar00nightlyallusers00000000000000/* * File: clientprovisioning_inc.cpp * * Include file for binfileagent.cpp and palmdbagent.cpp to provide * string-command based client provisioning. * * Author: Lukas Zeller (luz@plan44.ch) * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * 2003-09-30 : luz : created * * */ #ifndef ENHANCED_PROFILES_2004 #error "no support any more for non-ENHANCED_PROFILES_2004" #endif // Configure profile // - params must always start with pf="profilename" or defpf="profilename" // - aActiveProfile is updated only if profile was actually added, changed or deleted static bool configProfile(CLIENTAGENTCONFIG *aCfgP, const char *aParm, bool aMayAdd, bool aMayUpdate, sInt32 &aActiveProfile) { #ifdef MULTI_PROFILE_SUPPORT const sInt32 maxprofiles = 30; // prevent overflowing popup too much #else const sInt32 maxprofiles = 1; // only one profile #endif string tag,pfnam,value; // get profile name aParm=nextTag(aParm,tag,pfnam); if (!aParm) return false; bool def=false; if (tag=="defpf") def=true; else if (!(tag=="pf")) return false; // find profile by name sInt32 np = aCfgP->numProfiles(); sInt32 pi = np; PROFILERECORD profile; bool found=false; while (pi>0) { pi--; aCfgP->getProfile(pi,profile); if (strucmp(profile.profileName,pfnam.c_str())==0) { found=true; break; } } // now profile is current profile record if found==true // - check delete first if (!aMayAdd && !aMayUpdate) { // delete requested if (!found) return false; // does not exist if (np<2) return false; // only one profile left, do not delete // perform delete aCfgP->deleteProfile(pi); aActiveProfile=0; // re-activate profile 0 return true; } // - For update (modify or add): If profile not found AND... // ...if a default profile is specified -> overwrite first profile // ...if single-profile client -> overwrite the profile if (!found && aMayUpdate && aMayAdd && (def || maxprofiles==1) && np>0) { pi=0; // first is default aCfgP->getProfile(pi,profile); AssignCString(profile.profileName,pfnam.c_str(),maxnamesiz); found=true; } // - if not found and add not allowed or already too many profiles -> exit if (!found && (!aMayAdd || np>=maxprofiles)) return false; // nothing added // - if found, but update not allowed -> exit if (found && !aMayUpdate) return false; // nothing updated // Now, create new profile if we don't modify if (!found) { // - create new profile without default settings pi = aCfgP->newProfile(pfnam.c_str(),false); // - get the record aCfgP->getProfile(pi,profile); } // now set the params sInt32 ti=-1; // no target selected yet TARGETRECORD target; uInt32 profileID=aCfgP->getIDOfProfile(pi); // loop through params while (aParm!=NULL) { // get next tag aParm=nextTag(aParm,tag,value); // process tag if (tag=="db") { // save current target first, if any if (ti>=0) aCfgP->writeTarget(ti,target); // select new target by DB name sInt32 si=0; do { ti=aCfgP->findTargetIndex(profileID,si++); if (ti<0) break; // all checked, none found // check db name ti=aCfgP->getTarget(ti,target); } while(!(value==target.dbname)); } else if (tag=="uri") { // URI (or URI suffix) #ifdef HARD_CODED_SERVER_URI // - URI is fixed, so specified URI must be URI suffix (from old pre-2004 profiles) AssignCString(profile.URIpath,value.c_str(),maxpathsiz); #else // - URI can be set, except if config specifies a fixed URI if (aCfgP->fServerURI.empty()) AssignCString(profile.serverURI,value.c_str(),maxurisiz); #endif // setting URI resets the device to unknown SyncML version profile.lastSyncMLVersion=syncml_vers_unknown; } #ifdef PROTOCOL_SELECTOR else if (tag=="proto") { // Protocol selector profile.protocol = (TTransportProtocols)uint16Val(value.c_str()); if (profile.protocol>=num_transp_protos) profile.protocol=transp_proto_uri; } #endif else if (tag=="syncmlvers") { // initial SyncML version profile.lastSyncMLVersion = (TSyncMLVersions)uint16Val(value.c_str()); if (profile.lastSyncMLVersion>=numSyncMLVersions) profile.lastSyncMLVersion=syncml_vers_unknown; } else if (tag=="uripath") { // URI path AssignCString(profile.URIpath,value.c_str(),maxpathsiz); } else if (tag=="roflags") { // Read only flags profile.readOnlyFlags=uint16Val(value.c_str()); } else if (tag=="ftrflags") { // Feature flags profile.featureFlags=uint16Val(value.c_str()); } else if (tag=="dsflags") { // Datastore available flags profile.dsAvailFlags=uint16Val(value.c_str()); } else if (tag=="user") { // User AssignCString(profile.serverUser,value.c_str(),maxupwsiz); } else if (tag=="pwd") { // password assignMangledToCString(profile.serverPassword, value.c_str(), maxupwsiz,true); } else if (tag=="httpuser") { // User AssignCString(profile.transportUser,value.c_str(),maxupwsiz); } else if (tag=="httppwd") { // password assignMangledToCString(profile.transportPassword, value.c_str(), maxupwsiz,true); } else if (tag=="transpflags") { // transport related flags profile.transpFlags=uint32Val(value.c_str()); } else if (tag=="profileflags") { // general profile flags profile.transpFlags=uint32Val(value.c_str()); } #ifdef PROXY_SUPPORT else if (tag=="proxy") { // User AssignCString(profile.proxyHost,value.c_str(),maxurisiz); } else if (tag=="socks") { // User AssignCString(profile.socksHost,value.c_str(),maxurisiz); } else if (tag=="connproxy") { // use connection's proxy settings profile.useConnectionProxy=boolVal(value.c_str()); } else if (tag=="useproxy") { // use connection's proxy settings profile.useProxy=boolVal(value.c_str()); } else if (tag=="proxyuser") { // User AssignCString(profile.proxyUser,value.c_str(),maxupwsiz); } else if (tag=="proxypwd") { // password assignMangledToCString(profile.proxyPassword, value.c_str(), maxupwsiz,true); } #endif #ifdef AUTOSYNC_SUPPORT // Autosync activity schedule if (strucmp(tag.c_str(),"asl",3)==0) { // autosync level do { // - get level number if (tag.size()<5) break; // too short uInt8 lvl=tag[3]-0x30-1; // get level number 1..n and convert to 0-based index if (lvl>=NUM_AUTOSYNC_LEVELS) break; // invalid level number if (tag[4]!='_') break; // - level number found, check for subtag const char *subtag = tag.c_str()+5; if (strucmp(subtag,"mode")==0) { // autosync mode profile.AutoSyncLevel[lvl].Mode=(TAutosyncModes)uint16Val(value.c_str()); } else if (strucmp(subtag,"start")==0) { // start day time for autosync profile.AutoSyncLevel[lvl].StartDayTime=uint16Val(value.c_str()); } else if (strucmp(subtag,"end")==0) { // end day time for autosync profile.AutoSyncLevel[lvl].EndDayTime=uint16Val(value.c_str()); } else if (strucmp(subtag,"wdays")==0) { // weekdays for autosync (bit 0=Su, 1=Mo .. 6=Sa) profile.AutoSyncLevel[lvl].WeekdayMask=uint16Val(value.c_str()); } else if (strucmp(subtag,"charge")==0) { // charge level (% of full battery) profile.AutoSyncLevel[lvl].ChargeLevel=uint16Val(value.c_str()); } else if (strucmp(subtag,"mem")==0) { // min free mem level (% of total memory) profile.AutoSyncLevel[lvl].MemLevel=uint16Val(value.c_str()); } else if (strucmp(subtag,"flags")==0) { // extra flags profile.AutoSyncLevel[lvl].Flags=uint16Val(value.c_str()); } } while(false); } // aslvlN_xxxx #ifdef IPP_SUPPORT else if (strucmp(tag.c_str(),"ipp_",4)==0) { // IPP parameters, parse rest after ipp_ prefix aCfgP->ipp_setparam(tag.c_str()+4,value.c_str(),profile.ippSettings); } #endif // Timed sync schedule else if (tag=="ts_mobile") { // interval (minutes) for mobile timed sync profile.TimedSyncMobilePeriod=uint16Val(value.c_str()); } else if (tag=="ts_cradled") { // interval (minutes) for cradled timed sync profile.TimedSyncCradledPeriod=uint16Val(value.c_str()); } #endif else if (ti>=0) { // target-level settings if (tag=="enabled") { // enabled target.enabled = value=="1"; } else if (tag=="slow") { // force slowsync target.forceSlowSync = value=="1"; } else if (tag=="mode" && value.size()>=1) { // mode: 0=twoway, 1=fromserver, 2=fromclient uInt8 m=value[0]-0x30; if (m<=2) target.syncmode = (TSyncModes)m; } else if (tag=="path") { // remote DB path AssignCString(target.remoteDBpath,value.c_str(),remoteDBpathMaxLen); } #if TARGETS_DB_VERSION>5 else if (tag=="remoteFilters") { // remote DB path AssignCString(target.remoteFilters,value.c_str(),filterExprMaxLen); } else if (tag=="localFilters") { // remote DB path AssignCString(target.remoteFilters,value.c_str(),filterExprMaxLen); } #endif else if (tag=="ext") { // extras StrToULong(value.c_str(), target.extras); } else if (tag=="lim1") { // limit1 StrToLong(value.c_str(), target.limit1); } else if (tag=="lim2") { // limit2 StrToLong(value.c_str(), target.limit2); } } // if target selected } // while more tags // save open target if any if (ti>=0) aCfgP->writeTarget(ti,target); // save profile aCfgP->writeProfile(pi,profile); aActiveProfile=pi; // return changed or added profile number return true; } // configProfile // Configure registration // cmd="reg";text="name ::m=manufacturer";key="ABCD-EFGH-KIJL-1234"; static bool configRegistration(const char *aRegParams, TSyncAppBase *aAppBaseP) { #ifdef SYSER_REGISTRATION string tag,text,key; // get text aRegParams = nextTag(aRegParams,tag,text); if (!(tag=="text")) return false; // get key if (!aRegParams) return false; aRegParams = nextTag(aRegParams,tag,key); if (!(tag=="key")) return false; // apply registration return aAppBaseP->checkAndSaveRegInfo(text.c_str(), key.c_str())==LOCERR_OK; #else return false; // no registration possible #endif } // configRegistration // generic code that can work as palmdbagent or binfiledbagent method // - Provisioning string format: tag="value"[;tag="value"].... // - commands: // - add : only adds a profile, does nothing if already existing or // with single-profile-client. // - update : adds new or updates existing profile, if defpf is used // or with single-profile client, the first profile will be // updated (overwritten) // - modify : only modifies profile with specified name, never overwrites // another profile. // - delete : deletes profile with specified name (except if it is only // profile left) // - reg : apply license information bool CLIENTAGENTCONFIG::executeProvisioningString(const char *aProvisioningCmd, sInt32 &aActiveProfile) { string tag,value; const char *p=aProvisioningCmd; // get command tag p=nextTag(p,tag,value); if (!p) return false; // first tag must be "cmd" if (!(tag=="cmd")) return false; // dispatch commands if (value=="reg") { // registration return configRegistration(p,getSyncAppBase()); } else if (value=="add") { // add new profile if not already there return configProfile(this,p,true,false,aActiveProfile); // may add but may not update } else if (value=="update") { // update or add profile return configProfile(this,p,true,true,aActiveProfile); // may add and update } else if (value=="modify") { // only modify existing return configProfile(this,p,false,true,aActiveProfile); // may not add but may update } else if (value=="delete") { // delete existing return configProfile(this,p,false,false,aActiveProfile); // neither add nor update = delete } else return false; // unknown command } // CLIENTAGENTCONFIG::executeProvisioningString /* eof */ syncevolution-1.5/src/synthesis/src/sysync/clientprovisioning_inc.h0000755000373300037200000000046612424517753027605 0ustar00nightlyallusers00000000000000/* * File: clientprovisioning_inc.h * */ // macro to declare clientprovisioning methods and fields #define CLIENTPROVISIONING_CLASSDECL \ public: \ /* - execute remote provisioning command */ \ bool executeProvisioningString(const char *aProvisioningCmd, sInt32 &aActiveProfile); /* eof */ syncevolution-1.5/src/synthesis/src/sysync/configelement.cpp0000755000373300037200000010027312424517753026176 0ustar00nightlyallusers00000000000000/* * File: ConfigElement.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TConfigElement * Element of hierarchical configuration * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-11-14 : luz : created */ // includes #include "prefix_file.h" #include "sysync.h" #include "configelement.h" #include "syncappbase.h" #include "scriptcontext.h" #include "multifielditem.h" #include "sysync_crc16.h" #include "vtimezone.h" using namespace sysync; #ifndef RELEASE_VERSION // if defined, parsing debug info goes to console //#define CONSDEBUG #endif #ifdef CONSDEBUG #define CONSDBGPRINTF(m) CONSOLEPRINTF(m) const char * const ParseModeNames[numParseModes] = { "element", // normal, expecting sub-elements "nested", // like pamo_element, but scanning nested elements in same TConfigElement "delegated", // I have delegated parsing of a single sub-element of mine to another element (without XML nesting) "end", // expecting end of element "endnested", // expecting end of nested element (i.e. will call nestedElementEnd()) "all", // read over all content "string", // string, but with all WSP converted to space and removed at beginning an end "rawstring", // string without any changes "cstring", // string with \\, \t,\n,\r and \xXX escape conversion "macrostring", // string which can contain macros to substitute config vars in $xxx or $() format #ifdef SCRIPT_SUPPORT "script", // tokenized script "functiondef", // script function definition #endif "field", "path", // string is updated such that a filename can be appended directly "boolean", "tristate", "timestamp", "timezone", "vtimezone", "idcode", "char", "int64", "int32", "int16", "enum1by", "enum2by", "enum4by" }; #else #define CONSDBGPRINTF(m) #endif /* * Implementation of TConfigElement */ /* public TConfigElement members */ TConfigElement::TConfigElement(const char *aElementName, TConfigElement *aParentElementP) { // set element name fElementName=aElementName; fResolveImmediately=false; // by default, elements do not resolve immediately, but when entire config is read // set parent and root element pointers fParentElementP=aParentElementP; if (fParentElementP) { // has parent, get root from parent fRootElementP=fParentElementP->getRootElement(); } else { // base element cannot be root fRootElementP=NULL; } #ifndef HARDCODED_CONFIG // init parsing ResetParsing(); #endif fCfgVarExp=0; } // TConfigElement::TConfigElement TConfigElement::~TConfigElement() { clear(); } // TConfigElement::~TConfigElement TSyncAppBase *TConfigElement::getSyncAppBase(void) { return fRootElementP ? fRootElementP->fSyncAppBaseP : NULL; } // TConfigElement::getSyncAppBase // - convenience version for getting time lineartime_t TConfigElement::getSystemNowAs(timecontext_t aContext) { return sysync::getSystemNowAs(aContext,getSyncAppBase()->getAppZones()); } // TConfigElement::getSystemNowAs #ifndef HARDCODED_CONFIG // static helper, returns attribute value or NULL if none const char *TConfigElement::getAttr(const char **aAttributes, const char *aAttrName) { if (!aAttributes) return NULL; const char *attname; while ((attname=*aAttributes)!=0) { if (strucmp(attname,aAttrName)==0) { return *(++aAttributes); // found, return value } aAttributes+=2; // skip value, go to next name } return NULL; // not found } // TConfigElement::getAttr // get attribute value, check for macro expansion // @param aDefaultExpand : if set, non-recursive expansion is done anyway, otherwise, a "expand" attribute is required bool TConfigElement::getAttrExpanded(const char **aAttributes, const char *aAttrName, string &aValue, bool aDefaultExpand) { cAppCharP val = getAttr(aAttributes, aAttrName); if (!val) return false; // no value aValue = val; getSyncAppBase()->expandConfigVars(aValue, aDefaultExpand ? 1 : fCfgVarExp, this, getName()); return true; } // TConfigElement::getAttrExpanded // static helper, returns true if attribute has valid (or none, if aOpt) bool value bool TConfigElement::getAttrBool(const char **aAttributes, const char *aAttrName, bool &aBool, bool aOpt) { const char *v = getAttr(aAttributes,aAttrName); if (!v) return aOpt; // not existing, is ok if optional return StrToBool(v,aBool); } // TConfigElement::getAttrBool // static helper, returns true if attribute has valid (or none, if aOpt) short value bool TConfigElement::getAttrShort(const char **aAttributes, const char *aAttrName, sInt16 &aShort, bool aOpt) { const char *v = getAttr(aAttributes,aAttrName); if (!v) return aOpt; // not existing, is ok if optional return StrToShort(v,aShort); } // TConfigElement::getAttrShort // static helper, returns true if attribute has valid (or none, if aOpt) short value bool TConfigElement::getAttrLong(const char **aAttributes, const char *aAttrName, sInt32 &aLong, bool aOpt) { const char *v = getAttr(aAttributes,aAttrName); if (!v) return aOpt; // not existing, is ok if optional return StrToLong(v,aLong); } // TConfigElement::getAttrLong #ifdef SCRIPT_SUPPORT sInt16 TConfigElement::getFieldIndex(cAppCharP aFieldName, TFieldListConfig *aFieldListP, TScriptContext *aScriptContextP) { // fields or local script variables (if any) can be mapped if (aScriptContextP) return aScriptContextP->getIdentifierIndex(OBJ_AUTO, aFieldListP,aFieldName); else return aFieldListP ? aFieldListP->fieldIndex(aFieldName) : VARIDX_UNDEFINED; } #else sInt16 TConfigElement::getFieldIndex(cAppCharP aFieldName, TFieldListConfig *aFieldListP) { // only direct mapping of MultiFieldItem fields return aFieldListP ? aFieldListP->fieldIndex(aFieldName) : VARIDX_UNDEFINED; } #endif #endif // HARDCODED_CONFIG void TConfigElement::clear(void) { // nop } // TConfigElement::clear // resolve (finish after all data is parsed) void TConfigElement::Resolve(bool aLastPass) { #ifndef HARDCODED_CONFIG // Only resolve if element was not already resolved when it finished parsing // or if it was not parsed at all (that is, it did not appear in the config // at all and only contains default values) if (!fResolveImmediately || !fCompleted) { // try to finally resolve private stuff now that all children are resolved localResolve(aLastPass); } #else // hardcoded config is never resolved early localResolve(aLastPass); #endif }; // TConfigElement::Resolve #ifdef SYDEBUG TDebugLogger *TConfigElement::getDbgLogger(void) { // commands log to session's logger TSyncAppBase *appBase = getSyncAppBase(); return appBase ? appBase->getDbgLogger() : NULL; } // TConfigElement::getDbgLogger uInt32 TConfigElement::getDbgMask(void) { TSyncAppBase *appBase = getSyncAppBase(); if (!appBase) return 0; // no session, no debug return appBase->getDbgMask(); } // TConfigElement::getDbgMask #endif #ifndef HARDCODED_CONFIG void TConfigElement::ResetParsing(void) { fChildParser=NULL; fParseMode=pamo_element; // expecting elements fNest=0; // normal elements start with Nest=0 fExpectAllNestStart=-1; // no expectAll called yet fCompleted=false; // not yet completed parsing fTempString.erase(); // nothing accumulated yet #ifdef SYSER_REGISTRATION fLockedElement=false; fHadLockedSubs=false; #endif } // TConfigElement::ResetParsing(void) // report error void TConfigElement::ReportError(bool aFatal, const char *aMessage, ...) { const sInt32 maxmsglen=1024; char msg[maxmsglen]; va_list args; msg[0]='\0'; va_start(args, aMessage); char *p = msg; int n=0; // show fatal flag if (aFatal) { strcat(p,"Fatal: "); n=strlen(p); p+=n; } // assemble the message string vsnprintf(p, maxmsglen-n, aMessage, args); va_end(args); // set the message TRootConfigElement *rootP = getRootElement(); if (!rootP) SYSYNC_THROW(TConfigParseException("Element without root")); rootP->setError(aFatal,msg); } // TConfigElement::ReportError // fail in parsing (short form of ReportError) bool TConfigElement::fail(const char *aMessage, ...) { const sInt32 maxmsglen=1024; char msg[maxmsglen]; va_list args; msg[0]='\0'; va_start(args, aMessage); // assemble the message string vsnprintf(msg, maxmsglen, aMessage, args); va_end(args); // report the error ReportError(true,msg); // skip the rest expectAll(); // return value return true; } // TConfigElement::fail // start of element, this config element decides who processes this element bool TConfigElement::startElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { if (fChildParser) { // parsing in a sub-level, delegate return fChildParser->startElement(aElementName,aAttributes,aLine); } else { CONSDBGPRINTF(( "'%s' starts in configElement='%s' with parsemode='%s' nest=%hd at source line=%ld", aElementName, getName(), ParseModeNames[fParseMode], fNest, aLine )); if (fParseMode==pamo_all) { // read over contents, no matter what is inside fNest++; return true; } #ifdef SYSER_REGISTRATION // check for locked elements or subtrees // - copy parent's lock status if (getParentElement()) fLockedElement=getParentElement()->fLockedElement; // - if not already locked, see if locked section starts with this element if (!fLockedElement) { getAttrBool(aAttributes,"locked",fLockedElement,true); } // Perform CRC sum if locked element if (fLockedElement) { CONSDBGPRINTF(( "'%s' is locked and is included in LockCRC = 0x%04hX", aElementName, getRootElement()->getConfigLockCRC() )); // CRC over opening element name getRootElement()->addToLockCRC(aElementName); // CRC over all attributes if (aAttributes) { const char **attrs=aAttributes; const char *attelem; while ((attelem=*attrs++)!=0) { // alternating names and values getRootElement()->addToLockCRC(attelem); } } } #endif // check conditional parsing bool condmet=true; // assume parsing cAppCharP cond; string vv,val; // check platform filter if (condmet) { cAppCharP pf=getAttr(aAttributes,"platform"); if (pf && strucmp(pf,SYSYNC_PLATFORM_NAME)!=0) { // tag is not for this platform, ignore condmet=false; } } // check for config var conditionals if (condmet) { cond=getAttr(aAttributes,"if"); if (cond) { // check for value comparison string nam; // - determine comparison cAppCharP p2,p = cond; int cmpres = 2; // 2: invalid, 1: var > cond, -1: var < cond, 0: var=cond bool neg=false; appChar c; while ((c=*p)) { p2=p++; if (c=='=') { if (*p=='=') p++; // = and == are equivalent cmpres=0; // must be equal break; } else if (c=='!' && *p=='=') { p++; cmpres=0; neg=true; // must not be equal break; } else if (c=='>') { if (*p=='=') { p++; cmpres=-1; // var >= cond is equal to NOT val < cond neg=true; } else { cmpres=1; // var > cond } break; } else if (c=='<') { if (*p=='=') { p++; cmpres=1; // var <= cond is equal to NOT val > cond neg=true; } else { cmpres=-1; // var < cond } break; } } // now value is at *p or we have not found a comparison op if (cmpres<2) { nam.assign(cond,p2-cond); val=p; } else { nam=cond; val.erase(); } // get var - if it does not exist, comparison always renders false if (nam=="version") { // special comparison mode for version // - parse reference into version components uInt16 maj=0,min=0,rev=0,bld=0; p = val.c_str(); do { p+=StrToUShort(p,maj); if (*p++!='.') break; p+=StrToUShort(p,min); if (*p++!='.') break; p+=StrToUShort(p,rev); if (*p++!='.') break; p+=StrToUShort(p,bld); } while(false); // - compare with hexversion StringObjPrintf(val,"%02X%02X%02X%02X",maj,min,rev,bld); nam="hexversion"; } // get config var to perform condition check condmet=getSyncAppBase()->getConfigVar(nam.c_str(),vv); if (condmet) { // var exists, perform comparison if (cmpres>=2) { // no comparison, but just boolean check. Non-bool but empty=false, non-bool-non-empty=true condmet = !vv.empty(); if (condmet) StrToBool(vv.c_str(), condmet); } else { int res = strcmp(vv.c_str(),val.c_str()); res = res>0 ? 1 : (res<0 ? -1 : 0); condmet = neg != (cmpres==res); } } } } // check for ifdef if (condmet) { cond=getAttr(aAttributes,"ifdef"); if (cond) condmet = getSyncAppBase()->getConfigVar(cond,vv); } // check for ifndef if (condmet) { cond=getAttr(aAttributes,"ifndef"); if (cond) condmet = !getSyncAppBase()->getConfigVar(cond,vv); } // skip this tag if conditions not met if (!condmet) { // skip everything inside CONSDBGPRINTF(("Condition for parsing not met - skipping tag")); expectAll(); return true; // ok, go on } // Now we know that we must actually parse this tag // check configvar expansion mode fCfgVarExp=0; // default to automatic (i.e. certain content such as paths or macrostrings will be expanded without "expand" attr) cAppCharP cm=getAttr(aAttributes,"expand"); if (cm) { // explicit expand directive for this tag (includes expandable attributes of this tag, // but only attributes queried with getAttrExpanded() can expand at all) bool b; if (strucmp(cm,"single")==0) fCfgVarExp=1; else if (StrToBool(cm,b)) fCfgVarExp = b ? 2 : -1; } // check for use-everywhere special tags if (strucmp(aElementName,"configmsg")==0) { bool iserr=true; cAppCharP msg=getAttr(aAttributes,"error"); if (!msg) { msg=getAttr(aAttributes,"warning"); iserr=false; } if (!msg) msg="Error: found "; ReportError(iserr,msg); expectAll(); return false; // generate error message } // check if we are re-entering the same object again (trying to overwrite) if (fCompleted) { ReportError(true,"Duplicate definition of <%s>",aElementName); expectAll(); return false; // not allowed, generate error message } if (fParseMode==pamo_element || fParseMode==pamo_nested) { // expecting element fTempString.erase(); if (localStartElement(aElementName,aAttributes,aLine)) { // element known and parsing initialized ok #ifdef SYSER_REGISTRATION if (fLockedElement && fChildParser==NULL && fParseMode!=pamo_element && fParseMode!=pamo_nested) fHadLockedSubs=true; // flag that this element has processed non-child subelements in locked mode #endif return true; } else { // unknown element: read over all its contents ReportError(false,"invalid tag <%s>",aElementName); expectAll(); return false; // element not known, generate error message } } /* %%% moved up to beginning else if (fParseMode==pamo_all) { // read over contents fNest++; } */ else { ReportError(false,"no XML tag expected here"); } return true; } } // TConfigElement::startElement // character data of current element void TConfigElement::charData(const char *aCharData, sInt32 aNumChars) { if (fChildParser) { // parsing in a sub-level, delegate return fChildParser->charData(aCharData,aNumChars); } else { if (fParseMode==pamo_all /* %%% not needed, I think || fNest>0 */) { // just ignore } else if (fParseMode==pamo_element || fParseMode==pamo_nested || fParseMode==pamo_end || fParseMode==pamo_endnested) { // only whitespace allowed here while (aNumChars--) { if (!isspace(*aCharData++)) { ReportError(false,"no character data expected"); break; } } } else { // accumulate char data in string fTempString.append(aCharData,aNumChars); } } } // TConfigElement::charData // read over all contents of current TConfigElement void TConfigElement::expectAll(void) { // we are already in an element but have no non-decrementing // parse mode set like expectEmpty() or expectString() etc. // so nest count must be incremented to balance decrement occurring // at next element end. fExpectAllNestStart = fParseMode==pamo_nested ? fNest : -1; // remember where we left nested mode and entered ignoring mode fNest++; fParseMode=pamo_all; } // TConfigElement::expectAll // expect Enum element void TConfigElement::expectEnum(sInt16 aDestSize,void *aPtr, const char * const aEnumNames[], sInt16 aNumEnums) { // save params fParseEnumArray = aEnumNames; fParseEnumNum = aNumEnums; // determine mode and destination switch (aDestSize) { case 1 : fParseMode=pamo_enum1by; fResultPtr.fCharP=(char *)aPtr; break; case 2 : fParseMode=pamo_enum2by; fResultPtr.fShortP=(sInt16 *)aPtr; break; case 4 : fParseMode=pamo_enum4by; fResultPtr.fLongP=(sInt32 *)aPtr; break; default: SYSYNC_THROW(TConfigParseException("expectEnum: invalid enum size")); } } // TConfigElement::expectEnum // delegate parsing of a single element to another config element // after processing aElementName and all subtags, processing will return to this object // (rather than waiting for an end tag in aConfigElemP) bool TConfigElement::delegateParsingTo(TConfigElement *aConfigElemP, const char *aElementName, const char **aAttributes, sInt32 aLine) { if (aConfigElemP) { expectChildParsing(*aConfigElemP); fParseMode=pamo_delegated; // let child parse the current tag right away return aConfigElemP->localStartElement(aElementName,aAttributes,aLine); } else return false; // if we have no delegate, we can't understand this tag } // TConfigElement::delegateParsingTo // end of element, returns true when this config element is done parsing bool TConfigElement::endElement(const char *aElementName, bool aIsDelegated) { if (fChildParser) { // parsing in a real or simulated (delegateParsingTo) sub-level if (fChildParser->endElement(aElementName,fParseMode==pamo_delegated)) { // child has finished parsing fChildParser=NULL; // handle next element myself if (aIsDelegated) { // - we were delegated to process a single element from another element. // So, we nust not continue parsing here, but pass back to parent // for next element return true; } // otherwise, wait here for next element to start (or encosing element to end) fParseMode=pamo_element; // expect another element or end of myself } else { // child is still parsing, so am I return false; } } else { CONSDBGPRINTF(( "'%s' ends in configElement='%s' with parsemode='%s' nest=%hd, aIsDelegated=%d", aElementName, getName(), ParseModeNames[fParseMode], fNest, aIsDelegated )); #ifdef SYSER_REGISTRATION // Perform CRC sum if locked element if (fLockedElement) { // CRC over CharData getRootElement()->addToLockCRC(fTempString.c_str()); } #endif const char *p; // BCPPB: declaring vars in case does not work. size_t n,lnwsp; bool hlp; timecontext_t tctx; // expand macros in string first if (fCfgVarExp==0) { // auto mode fCfgVarExp = fParseMode==pamo_path || fParseMode==pamo_macrostring ? 2 : -1; } // do config variable expansion now (or not, according to fCfgVarExp) getSyncAppBase()->expandConfigVars(fTempString,fCfgVarExp,this,aElementName); // now parse switch (fParseMode) { case pamo_end: case pamo_endnested: if (fNest>0) { // Note: normal empty elements are NOT considered nested elements by default, only if // they request endnested mode explicitly if (fParseMode==pamo_endnested) nestedElementEnd(); // inform possible parser of nested element that a nested element ends here // back to nested fParseMode=pamo_nested; } else fParseMode=pamo_element; // back to normal element parsing return false; // do not exit case pamo_all: case pamo_nested: if (fNest>0) { // not yet finished with startlevel, continue with pamo_all/pamo_nested fNest--; if (fExpectAllNestStart>0) { // we are in expectAll mode within pamo_nested if(fNest==fExpectAllNestStart) { // reached level where we started ignoring contents before fExpectAllNestStart = -1; // processed now fParseMode = pamo_nested; // back to nested (but active) parsing, like in Mime-Dir profile } else { // NOP here - do NOT call nestedElementEnd() } } else { // end of active nested element nestedElementEnd(); // inform possible parser of nested element if (fNest==0) { // if back on nest level 0, switch to pamo_element fParseMode = pamo_element; } } return false; // stay in this element } // nested or all at level 0 cause handling like pamo_element case pamo_element: // end of element while looking for elements: // this is end of this config element itself // - flag completion of this element fCompleted=true; // prevents re-entry // Resolve if this is element says it is self-contained (no references to other elements // that might follow later in the config file) if (fResolveImmediately) { // resolve element NOW, last pass localResolve(true); } // - return parsing authority to caller return true; case pamo_cstring: // interpret C-type escapes (only \t,\r,\n and \xXX, no octal) #ifdef SYSER_REGISTRATION if (fHadLockedSubs && !fResultPtr.fStringP->empty()) ReportError(true,"Duplicate definition of <%s>",aElementName); #endif fResultPtr.fStringP->erase(); CStrToStrAppend(fTempString.c_str(), *(fResultPtr.fStringP)); break; case pamo_string: case pamo_macrostring: case pamo_path: #ifdef SYSER_REGISTRATION if (fHadLockedSubs && !fResultPtr.fStringP->empty()) ReportError(true,"Duplicate definition of <%s>",aElementName); #endif // remove spaces at beginning and end fResultPtr.fStringP->erase(); p = fTempString.c_str(); // - skip leading spaces while (*p && isspace(*p)) ++p; // - copy chars and convert all wsp to spaces n=0; lnwsp=0; while (*p) { ++n; // count char if (isspace(*p)) fResultPtr.fStringP->append(" "); else { fResultPtr.fStringP->append(p,1); lnwsp=n; // remember last non-whitespace } ++p; } // - remove trailing spaces fResultPtr.fStringP->resize(lnwsp); // - if path requested, shape it up if needed if (fParseMode==pamo_path) { makeOSDirPath(*(fResultPtr.fStringP)); } break; case pamo_rawstring: #ifdef SYSER_REGISTRATION if (fHadLockedSubs && !fResultPtr.fStringP->empty()) ReportError(true,"Duplicate definition of <%s>",aElementName); #endif (*(fResultPtr.fStringP))=fTempString; break; case pamo_field: #ifdef SCRIPT_SUPPORT *(fResultPtr.fShortP) = getFieldIndex(fTempString.c_str(),fFieldListP,fScriptContextP); #else *(fResultPtr.fShortP) = getFieldIndex(fTempString.c_str(),fFieldListP); #endif break; #ifdef SCRIPT_SUPPORT case pamo_script: case pamo_functiondef: SYSYNC_TRY { if (fParseMode==pamo_functiondef) TScriptContext::TokenizeAndResolveFunction(getSyncAppBase(),fExpectLine,fTempString.c_str(),(*(fResultPtr.fFuncDefP))); else { #ifdef SYSER_REGISTRATION if (fHadLockedSubs && !fResultPtr.fStringP->empty()) ReportError(true,"Duplicate definition of <%s>",aElementName); #endif TScriptContext::Tokenize(getSyncAppBase(),aElementName,fExpectLine,fTempString.c_str(),(*(fResultPtr.fStringP)),fExpectContextFuncs,false,fExpectNoDeclarations); } } SYSYNC_CATCH (exception &e) ReportError(true,"Script Error: %s",e.what()); SYSYNC_ENDCATCH break; #endif case pamo_timestamp: // expect timestamp, store as UTC if (ISO8601StrToTimestamp(fTempString.c_str(), *(fResultPtr.fTimestampP), tctx)==0) ReportError(false,"bad ISO8601 timestamp value"); if (TCTX_IS_UNKNOWN(tctx)) tctx=TCTX_SYSTEM; TzConvertTimestamp(*(fResultPtr.fTimestampP),tctx,TCTX_UTC,getSyncAppBase()->getAppZones()); break; case pamo_timezone: // time zone by name (internal or olson) if (!TimeZoneNameToContext(fTempString.c_str(), *(fResultPtr.fTimeContextP), getSyncAppBase()->getAppZones(), true)) ReportError(false,"invalid/unknown timezone name"); break; case pamo_vtimezone: // definition of custom time zone in vTimezone format if (!VTIMEZONEtoInternal(fTempString.c_str(), tctx, fResultPtr.fGZonesP, getDbgLogger())) ReportError(false,"invalid vTimezone defintion"); break; case pamo_boolean: if (!StrToBool(fTempString.c_str(),*(fResultPtr.fBoolP))) ReportError(false,"bad boolean value"); break; case pamo_tristate: if (fTempString.empty() || fTempString=="unspecified" || fTempString=="default") *(fResultPtr.fByteP)=-1; // unspecified else { if (!StrToBool(fTempString.c_str(),hlp)) ReportError(false,"bad boolean value"); else *(fResultPtr.fByteP)= hlp ? 1 : 0; } break; case pamo_int64: if (!StrToLongLong(fTempString.c_str(),*(fResultPtr.fLongLongP))) ReportError(false,"bad integer (64bit) value"); break; case pamo_int32: if (!StrToLong(fTempString.c_str(),*(fResultPtr.fLongP))) ReportError(false,"bad integer (32bit) value"); break; case pamo_char: if (fTempString.size()>1) ReportError(false,"single char or nothing (=NUL char) expected"); if (fTempString.size()==0) *(fResultPtr.fCharP) = 0; else *(fResultPtr.fCharP) = fTempString[0]; break; case pamo_idCode: // Palm/MacOS-type 4-char code if (fTempString.size()!=4) ReportError(false,"id code must be exactly 4 characters"); *(fResultPtr.fLongP) = ((uInt32)fTempString[0] << 24) + ((uInt32)fTempString[1] << 16) + ((uInt16)fTempString[2] << 8) + ((uInt8)fTempString[3]); break; case pamo_int16: if (!StrToShort(fTempString.c_str(),*(fResultPtr.fShortP))) ReportError(false,"bad integer (16bit) value"); break; case pamo_enum1by: case pamo_enum2by: case pamo_enum4by: sInt16 tempenum; if (!StrToEnum(fParseEnumArray,fParseEnumNum,tempenum,fTempString.c_str())) ReportError(false,"bad enumeration value '%s'",fTempString.c_str()); else { // now assign enum if (fParseMode==pamo_enum1by) *fResultPtr.fCharP = tempenum; else if (fParseMode==pamo_enum2by) *fResultPtr.fShortP = tempenum; else if (fParseMode==pamo_enum4by) *fResultPtr.fLongP = tempenum; } break; default: SYSYNC_THROW(TConfigParseException(DEBUGTEXT("Unknown parse mode","ce1"))); } // normal case: end of simple element parsed at same level as parent if (aIsDelegated) { // - we were delegated to process a single element from another element. // So, we nust not continue parsing here, but pass back to parent // for next element return true; } else { // - expect next element fParseMode=pamo_element; } } // end of embedded element, but not of myself #ifdef SYSER_REGISTRATION #ifdef CONSDEBUG if (fLockedElement) { CONSDBGPRINTF(( "'%s' was locked and was included in LockCRC = 0x%04hX", aElementName, getRootElement()->getConfigLockCRC() )); } #endif // - back to parent's lock status (or false if no parent) fLockedElement=getParentElement() ? getParentElement()->fLockedElement : false; #endif // do not return to parent config element return false; } // TConfigElement::endElement // reset error void TRootConfigElement::resetError(void) { fError=false; fErrorMessage.erase(); } // TRootConfigElement::ResetError // set error void TRootConfigElement::setError(bool aFatal, const char *aMsg) { if (!fErrorMessage.empty()) fErrorMessage += '\n'; // multiple messages on multiple lines fErrorMessage.append(aMsg); if (aFatal && fFatalError==LOCERR_OK) fFatalError=LOCERR_CFGPARSE; // this is a config parse error fError=true; } // TRootConfigElement::setError // check for error message const char *TRootConfigElement::getErrorMsg(void) { if (!fError) return NULL; return fErrorMessage.c_str(); } // TRootConfigElement::GetErrorMsg // reset parsing (=reset error and fatal errors) void TRootConfigElement::ResetParsing(void) { resetError(); fDocStarted=false; fFatalError=LOCERR_OK; #ifdef SYSER_REGISTRATION fLockCRC=0; // no CRC lock sum yet #endif TConfigElement::ResetParsing(); } // TRootConfigElement::ResetParsing #endif // resolve config tree and catch errors bool TRootConfigElement::ResolveAll(void) { SYSYNC_TRY { Resolve(true); return true; } SYSYNC_CATCH (TConfigParseException &e) #ifndef HARDCODED_CONFIG ReportError(true,e.what()); #endif return false; SYSYNC_ENDCATCH } // TRootConfigElement::ResolveAll #ifndef HARDCODED_CONFIG // start of element, this config element decides who processes this element bool TRootConfigElement::startElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { if (!fDocStarted) { // document not yet started if (strucmp(aElementName,XMLCONFIG_DOCNAME)==0) { // check version const char* vers = getAttr(aAttributes,"version"); if (!vers) { ReportError(true,"Missing version attribute for document"); expectAll(); // ignore everything } else if (strucmp(vers,XMLCONFIG_DOCVERSION)!=0) { ReportError(true, "Bad config document version (expected %s, found %s)", XMLCONFIG_DOCVERSION, vers ); expectAll(); // ignore everything inside that element } fDocStarted=true; // started normally return true; } else { // invalid element return false; } } else { return TConfigElement::startElement(aElementName,aAttributes,aLine); } } // TRootConfigElement::startElement #ifdef SYSER_REGISTRATION // add config text to locking CRC void TRootConfigElement::addToLockCRC(const char *aCharData, size_t aNumChars) { size_t n = aNumChars ? aNumChars : strlen(aCharData); char c; bool lastwasctrl=false; while (n--) { c=*aCharData++; // compact multiple whitespace to single char if ((uInt8)c<=' ') { if (lastwasctrl) continue; lastwasctrl=true; // treat them all as spaces c=' '; } else { lastwasctrl=false; // this is a non-space } // add to CRC fLockCRC=sysync::sysync_crc16(fLockCRC,(uInt8)c); } } // TRootConfigElement::addToLockCRC #endif #endif // no hardcode config /* end of TConfigElement implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/configelement.h0000755000373300037200000002703012424517753025642 0ustar00nightlyallusers00000000000000/* * File: ConfigElement.h * * Author: Lukas Zeller (luz@plan44.ch) * * TConfigElement * Element of hierarchical configuration * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-11-14 : luz : created */ #ifndef ConfigElement_H #define ConfigElement_H #include "prefix_file.h" #include "sysync.h" #include "syncexception.h" #include "sysync_globs.h" namespace sysync { // forward class TConfigElement; class TDebugLogger; // parse modes typedef enum { pamo_element, // normal, expecting sub-elements pamo_nested, // like pamo_element, but scanning nested elements in same TConfigElement pamo_delegated, // I have delegated parsing of a single sub-element of mine to another element (without XML nesting) pamo_end, // expecting end of element (empty element) pamo_endnested, // expecting end of nested element (i.e. will call nestedElementEnd()) pamo_all, // read over all content pamo_string, pamo_cstring, pamo_rawstring, pamo_macrostring, // string which can contain macros to substitute config vars in $xxx or $() format #ifdef SCRIPT_SUPPORT pamo_script, pamo_functiondef, #endif pamo_field, // field ID pamo_path, // string is updated such that a filename can be appended directly, otherwise like pamo_macrostring pamo_boolean, pamo_tristate, pamo_timestamp, pamo_timezone, // time zone name pamo_vtimezone, // time zone definition in vTimezone format pamo_idCode, pamo_char, pamo_int64, pamo_int32, pamo_int16, pamo_enum1by, pamo_enum2by, pamo_enum4by, numParseModes } TCfgParseMode; class TConfigParseException : public TSyncException { typedef TSyncException inherited; public: TConfigParseException(const char *aMsg1) : TSyncException(aMsg1) {}; }; // TConfigParseException class TRootConfigElement; // forward class TFieldListConfig; #ifdef SCRIPT_SUPPORT class TUserScriptFunction; class TScriptContext; #endif class TSyncAppBase; // forward class TConfigElement { public: // constructor TConfigElement(const char *aElementName, TConfigElement *aParentElementP); virtual ~TConfigElement(); virtual void clear(void); // remove all dynamic elements, reset to default values // - called when all parsing is done, intended for cross-element links void Resolve(bool aLastPass); // - called when app should save its persistent state virtual void saveAppState(void) { /* nop by default */}; #ifndef HARDCODED_CONFIG // Sax parsing // - report parsing error (may only be called from within parsing methods) void ReportError(bool aFatal, const char *aMessage, ...); bool fail(const char *aMessage, ...); // - start of element, this config element decides who processes this element virtual bool startElement(const char *aElementName, const char **aAttributes, sInt32 aLine); // - character data of current element void charData(const char *aCharData, sInt32 aNumChars); // - end of element, returns true when this config element is done parsing bool endElement(const char *aElementName, bool aIsDelegated=false); #endif // access to nodes // - root node TRootConfigElement *getRootElement(void) { return fRootElementP; }; // - parent node, NULL if none TConfigElement *getParentElement(void) { return fParentElementP; }; // - get sync app base (application root) TSyncAppBase *getSyncAppBase(void); // - convenience version for getting time lineartime_t getSystemNowAs(timecontext_t aContext); // - name const char *getName(void) { return fElementName.c_str(); }; // Public properties // - name of element string fElementName; #ifndef HARDCODED_CONFIG // helpers for attributes static const char *getAttr(const char **aAttributes, const char *aAttrName); bool getAttrExpanded(const char **aAttributes, const char *aAttrName, string &aValue, bool aDefaultExpand); static bool getAttrBool(const char **aAttributes, const char *aAttrName, bool &aBool, bool aOpt=false); static bool getAttrShort(const char **aAttributes, const char *aAttrName, sInt16 &aShort, bool aOpt=false); static bool getAttrLong(const char **aAttributes, const char *aAttrName, sInt32 &aLong, bool aOpt=false); #ifdef SCRIPT_SUPPORT static sInt16 getFieldIndex(cAppCharP aFieldName, TFieldListConfig *aFieldListP, TScriptContext *aScriptContextP=NULL); #else static sInt16 getFieldIndex(cAppCharP aFieldName, TFieldListConfig *aFieldListP); #endif // public helpers bool delegateParsingTo(TConfigElement *aConfigElemP, const char *aElementName, const char **aAttributes, sInt32 aLine); void expectChildParsing(TConfigElement &aConfigElem) { aConfigElem.ResetParsing(); fChildParser=&aConfigElem; }; // let child element parse contents void expectAll(void); void expectEmpty(bool nested=false) { fParseMode = nested ? pamo_endnested : pamo_end; }; #endif // locked config sections support #ifdef SYSER_REGISTRATION bool fLockedElement; // set while parsing locked element bool fHadLockedSubs; // set if this element contained locked non-child subelements (will prevent string overwrites) #endif protected: #ifdef SYDEBUG TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif // - called after parsing is finished, should resolve links and throws on error virtual void localResolve(bool /* aLastPass */) { }; // nop #ifndef HARDCODED_CONFIG // parsing virtual void ResetParsing(void); // - checks if element known and decides what to do virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { return false; } // unknown element // - called after nested level ends virtual void nestedElementEnd(void) {}; // - helpers void expectNested(void) { fParseMode=pamo_nested; }; void startNestedParsing() { fNest++; expectNested(); } // let same element parse nested levels void expectString(string &aString) { fParseMode=pamo_string; fResultPtr.fStringP=&aString; }; void expectMacroString(string &aString) { fParseMode=pamo_macrostring; fResultPtr.fStringP=&aString; }; void expectCString(string &aString) { fParseMode=pamo_cstring; fResultPtr.fStringP=&aString; }; void expectRawString(string &aString) { fParseMode=pamo_rawstring; fResultPtr.fStringP=&aString; }; #ifdef SCRIPT_SUPPORT void expectScript(string &aTScript,sInt32 aLine, const TFuncTable *aContextFuncs, bool aNoDeclarations=false) { fParseMode=pamo_script; fResultPtr.fStringP=&aTScript; fExpectLine=aLine; fExpectContextFuncs=aContextFuncs; fExpectNoDeclarations=aNoDeclarations; }; void expectFunction(TUserScriptFunction &aFuncDef,sInt32 aLine=0) { fParseMode=pamo_functiondef; fResultPtr.fFuncDefP=&aFuncDef; fExpectLine=aLine; }; #endif void expectPath(string &aString) { fParseMode=pamo_path; fResultPtr.fStringP=&aString; }; void expectBool(bool &aBool) { fParseMode=pamo_boolean; fResultPtr.fBoolP=&aBool; }; void expectTristate(sInt8 &aTristate) { fParseMode=pamo_tristate; fResultPtr.fByteP=&aTristate; }; void expectTimestamp(lineartime_t &aTimestamp) { fParseMode=pamo_timestamp; fResultPtr.fTimestampP=&aTimestamp; }; void expectTimezone(timecontext_t &aTimeContext) { fParseMode=pamo_timezone; fResultPtr.fTimeContextP=&aTimeContext; }; void expectVTimezone(GZones *aZonesToAddTo) { fParseMode=pamo_vtimezone; fResultPtr.fGZonesP=aZonesToAddTo; }; void expectIdCode(uInt32 &aLong) { fParseMode=pamo_idCode; fResultPtr.fLongP=(sInt32 *)(&aLong); }; void expectChar(char &aChar) { fParseMode=pamo_char; fResultPtr.fCharP=(char *)(&aChar); }; void expectInt64(sInt64 &aLongLong) { fParseMode=pamo_int64; fResultPtr.fLongLongP=&aLongLong; }; void expectInt32(sInt32 &aLong) { fParseMode=pamo_int32; fResultPtr.fLongP=&aLong; }; void expectUInt32(uInt32 &aLong) { fParseMode=pamo_int32; fResultPtr.fLongP=(sInt32 *)(&aLong); }; void expectInt16(sInt16 &aShort) { fParseMode=pamo_int16; fResultPtr.fShortP=&aShort; }; void expectUInt16(uInt16 &aShort) { fParseMode=pamo_int16; fResultPtr.fShortP=(sInt16 *)(&aShort); }; void expectEnum(sInt16 aDestSize,void *aPtr, const char * const aEnumNames[], sInt16 aNumEnums); #ifdef SCRIPT_SUPPORT void expectFieldID(sInt16 &aShort, TFieldListConfig *aFieldListP, TScriptContext *aScriptContextP=NULL) { fParseMode=pamo_field; fResultPtr.fShortP=&aShort; fFieldListP=aFieldListP; fScriptContextP=aScriptContextP; }; #else void expectFieldID(sInt16 &aShort, TFieldListConfig *aFieldListP) { fParseMode=pamo_field; fResultPtr.fShortP=&aShort; fFieldListP=aFieldListP; }; #endif #endif // config tree branches (childs) TRootConfigElement *fRootElementP; // root element sInt16 fNest; // nesting count for unprocessed or nested (in same TConfigElement) XML tags sInt16 fExpectAllNestStart; // nesting count where expectAll() was called while in pamo_nested mode bool fResolveImmediately; private: TConfigElement *fParentElementP; // parent of this element #ifndef HARDCODED_CONFIG // parsing TConfigElement *fChildParser; // child parser, NULL if none (this is parsing) string fTempString; // string to accumulate chars TCfgParseMode fParseMode; sInt32 fExpectLine; // line number of where expected data started TFieldListConfig *fFieldListP; // field list for expectField #ifdef SCRIPT_SUPPORT const TFuncTable *fExpectContextFuncs; // context-specific function table TScriptContext *fScriptContextP; // script context for expectField bool fExpectNoDeclarations; // flag for tokenizer #endif // - parse params const char * const * fParseEnumArray; sInt16 fParseEnumNum; bool fCompleted; // set when entire element has been scanned ok (not in progress any more) sInt8 fCfgVarExp; // config var expansion mode: -1 = no, 0=auto (depending on expectXXX), 1=yes, 2=yes with recursion // - where to store result (must be in accordance with fParseMode union { string *fStringP; sInt64 *fLongLongP; sInt32 *fLongP; char *fCharP; sInt16 *fShortP; bool *fBoolP; sInt8 *fByteP; lineartime_t *fTimestampP; GZones *fGZonesP; timecontext_t *fTimeContextP; #ifdef SCRIPT_SUPPORT TUserScriptFunction *fFuncDefP; #endif } fResultPtr; #endif // free config }; // TConfigElement class TRootConfigElement : public TConfigElement { typedef TConfigElement inherited; friend class TConfigElement; public: TRootConfigElement(TSyncAppBase *aSyncAppBaseP) : TConfigElement("root",NULL) { fSyncAppBaseP=aSyncAppBaseP; fRootElementP=this; }; bool ResolveAll(void); #ifndef HARDCODED_CONFIG void resetError(void); const char *getErrorMsg(void); localstatus getFatalError(void) { return fFatalError; }; void setError(bool aFatal, const char *aMsg); void setFatalError(localstatus aLocalFatalError) { fFatalError=aLocalFatalError; }; virtual void ResetParsing(void); // - start of element, this config element decides who processes this element virtual bool startElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif protected: // Sync app base TSyncAppBase *fSyncAppBaseP; #ifndef HARDCODED_CONFIG // global parsing error handling bool fError; // error occurred localstatus fFatalError; // set<>0 if parsing should be aborted string fErrorMessage; // error message public: // section locking support #ifndef SYSER_REGISTRATION // - dummy uInt16 getConfigLockCRC(void) { return 0; }; #else // - get current config lock CRC uInt16 getConfigLockCRC(void) { return fLockCRC; }; // - add config text to locking CRC void addToLockCRC(const char *aCharData, size_t aNumChars=0); private: uInt16 fLockCRC; // accumulated CRC of all locked elements #endif private: bool fDocStarted; #endif }; } // namespace sysync #endif // ConfigElement_H // eof syncevolution-1.5/src/synthesis/src/sysync/customimplagent.cpp0000755000373300037200000006747712424517753026614 0ustar00nightlyallusers00000000000000/** * @File customimplagent.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TCustomAgent * Base class for agenst (servers or clients) with customizable datastores * based on TCustomImplDS * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-12-05 : luz : separated from odbcdbagent */ // includes #include "sysync.h" #include "multifielditem.h" #include "mimediritemtype.h" #include "customimplagent.h" #include "customimplds.h" namespace sysync { // Charset names for DB charset specification // Note: numCharSets and the TCharSets type enum is defined in sysync_utils const char * const DBCharSetNames[numCharSets] = { "unknown", "ASCII", "ANSI", "ISO-8859-1", "UTF-8", "UTF-16", #ifdef CHINESE_SUPPORT "GB2312", "CP936", #endif }; // database field type names const char * const DBFieldTypeNames[numDBfieldTypes] = { "string", "blob", "date", "time", "timefordate", "timestamp", "dateonly", "zoneoffset_hours", "zoneoffset_mins", "zoneoffset_secs", "zonename", "numeric", "lineartime", "lineardate", "unixtime_s", "unixtime_ms", "unixtime_us", "unixdate_s", "unixdate_ms", "unixdate_us", "nsdate" }; // Generic Utils // ============= // integer in DB to lineartime conversion lineartime_t dbIntToLineartime(sInt64 aDBInt, TDBFieldType aDbfty) { switch (aDbfty) { case dbft_unixtime_s: case dbft_unixdate_s: // integer value representing UNIX epoch date in seconds return secondToLinearTimeFactor*aDBInt+UnixToLineartimeOffset; case dbft_nsdate_s: // integer value representing NSDate in seconds return secondToLinearTimeFactor*aDBInt+NSDateToLineartimeOffset; case dbft_unixtime_ms: case dbft_unixdate_ms: // integer value representing UNIX epoch date in milliseconds return aDBInt*secondToLinearTimeFactor/1000+UnixToLineartimeOffset; case dbft_unixdate_us: case dbft_unixtime_us: // integer value representing UNIX epoch time stamp in microseconds return aDBInt*secondToLinearTimeFactor/1000000+UnixToLineartimeOffset; case dbft_lineardate: // linear date as-is return aDBInt*linearDateToTimeFactor; case dbft_lineartime: default: // linear time as-is return aDBInt; } } // dbIntToLineartime // lineartime to integer in DB conversion sInt64 lineartimeToDbInt(lineartime_t aLinearTime, TDBFieldType aDbfty) { switch (aDbfty) { case dbft_unixtime_s: case dbft_unixdate_s: // integer value representing UNIX epoch date in seconds return (aLinearTime-UnixToLineartimeOffset)/secondToLinearTimeFactor; case dbft_nsdate_s: // integer value representing NSDate in seconds return (aLinearTime-NSDateToLineartimeOffset)/secondToLinearTimeFactor; case dbft_unixtime_ms: case dbft_unixdate_ms: // integer value representing UNIX epoch date in milliseconds return (aLinearTime-UnixToLineartimeOffset)*1000/secondToLinearTimeFactor; case dbft_unixdate_us: case dbft_unixtime_us: // integer value representing UNIX epoch time stamp in microseconds return (aLinearTime-UnixToLineartimeOffset)*1000000/secondToLinearTimeFactor; case dbft_lineardate: // linear date as-is return aLinearTime/linearDateToTimeFactor; case dbft_lineartime: default: // linear time as-is return aLinearTime; } } // lineartimeToDbInt // Config // ====== TCustomAgentConfig::TCustomAgentConfig(TConfigElement *aParentElement) : #ifdef BASED_ON_BINFILE_CLIENT TBinfileClientConfig(aParentElement) #else TAgentConfig("CustomAgent",aParentElement) #endif #ifdef SCRIPT_SUPPORT , fResolverContext(NULL) #endif { // nop so far } // TCustomAgentConfig::TCustomAgentConfig TCustomAgentConfig::~TCustomAgentConfig() { clear(); } // TCustomAgentConfig::~TCustomAgentConfig // init defaults void TCustomAgentConfig::clear(void) { // init defaults fCurrentDateIsUTC=false; // compatibility flag only, will set fCurrentDateTimeZone to TCTX_UTC at Resolve if set fCurrentDateTimeZone=TCTX_SYSTEM; // assume system local time fDataCharSet=chs_ansi; // assume ANSI, is probable for ODBC connection fDataLineEndMode=lem_dos; // default to CRLF, as this seems to be safest assumption // resolver context #ifndef BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT fLoginInitScript.erase(); fLoginCheckScript.erase(); fLoginFinishScript.erase(); if (fResolverContext) { delete fResolverContext; fResolverContext=NULL; } #endif #endif // BINFILE_ALWAYS_ACTIVE // clear inherited inherited::clear(); } // TCustomAgentConfig::clear #ifdef SCRIPT_SUPPORT // Custom agent specific script functions // ====================================== class TCustomAgentFuncs { public: #ifndef BINFILE_ALWAYS_ACTIVE // Login context functions // integer CHECKAUTH(string user, string secret, integer secretismd5) // returns auth status of checking given user name and given secret against user/secret from remote static void func_CheckAuth(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get local side info string dbuser,dbsecret,nonce; bool secretismd5,authok; aFuncContextP->getLocalVar(0)->getAsString(dbuser); aFuncContextP->getLocalVar(1)->getAsString(dbsecret); secretismd5=aFuncContextP->getLocalVar(2)->getAsBoolean(); // check against remote side info. TCustomImplAgent *agentP = static_cast(aFuncContextP->getCallerContext()); if (agentP->fAuthType==sectyp_md5_V10 || agentP->fAuthType==sectyp_md5_V11) agentP->getAuthNonce(agentP->fAuthDevice,nonce); if (!secretismd5) { // local secret is clear text password, check against what was transmitted from remote authok=agentP->checkAuthPlain( dbuser.c_str(), // user name as specified by caller dbsecret.c_str(), // secret as specfied by caller (usually retrieved from DB) nonce.c_str(), // the nonce agentP->fAuthSecret, // the auth secret as transmitted from remote agentP->fAuthType // the type of the auth secret ); } else { // local secret is b64(md5(user:password)) authok= agentP->fAuthType==sectyp_md5_V11 && // auth secret from remote MUST be V1.1 type MD5 agentP->checkMD5WithNonce( dbsecret.c_str(), // b64(md5(user:password)) as provided by caller to check against nonce.c_str(), // the nonce agentP->fAuthSecret // auth secret according to SyncML 1.1 (b64(md5(b64(md5(user:pw)):nonce)) ); } // return auth checking result aTermP->setAsInteger(authok ? 1 : 0); }; // func_CheckAuth // integer AUTHOK() // returns current auth ok status (standard checking enabled) static void func_AuthOK(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsInteger( static_cast(aFuncContextP->getCallerContext())->fStandardAuthOK ? 1 : 0 ); }; // func_AuthOK // string AUTHUSER() // returns name of user that tries to authenticate static void func_AuthUser(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fAuthUser ); }; // func_AuthUser // SETUSERNAME(string username) // set user name that will be used to find user in DB // (but note that original username will be used to check auth with MD5 auth) static void func_SetUserName(TItemField *&aTermP, TScriptContext *aFuncContextP) { aFuncContextP->getLocalVar(0)->getAsString( static_cast(aFuncContextP->getCallerContext())->fUserName ); }; // func_SetUserName // SETDOMAIN(string domainname) // set "domain" name that can be used to differentiate user domains // (mainly an xml2go requirement) static void func_SetDomain(TItemField *&aTermP, TScriptContext *aFuncContextP) { aFuncContextP->getLocalVar(0)->getAsString( static_cast(aFuncContextP->getCallerContext())->fDomainName ); }; // func_SetDomain // string AUTHSTRING() // returns auth string (MD5 digest or plain text, according to AUTHTYPE()) // sent by user trying to authenticate static void func_AuthString(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fAuthSecret ); }; // func_AuthString // string AUTHDEVICEID() // returns remote device ID static void func_AuthDeviceID(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fAuthDevice ); }; // func_AuthDeviceID // integer AUTHTYPE() // returns static void func_AuthType(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsInteger( (fieldinteger_t) static_cast(aFuncContextP->getCallerContext())->fAuthType ); }; // func_AuthType // integer UNKNOWNDEVICE() // returns if device was not yet in device table (valid in fLoginCheckScript only) static void func_Unknowndevice(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsInteger( static_cast(aFuncContextP->getCallerContext())->fUnknowndevice ? 1 : 0 ); }; // func_Unknowndevice // string USERKEY() // returns user key static void func_UserKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fUserKey ); }; // func_UserKey // SETUSERKEY(variant userkey) // set user key for this sync session static void func_SetUserKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aFuncContextP->getLocalVar(0)->getAsString( static_cast(aFuncContextP->getCallerContext())->fUserKey ); }; // func_SetUserKey // string DEVICEKEY() // returns device key static void func_DeviceKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fDeviceKey ); }; // func_DeviceKey // SETDEVICEKEY(variant devicekey) // set device key for this sync session static void func_SetDeviceKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aFuncContextP->getLocalVar(0)->getAsString( static_cast(aFuncContextP->getCallerContext())->fDeviceKey ); }; // func_SetDeviceKey #endif // not BINFILE_ALWAYS_ACTIVE // timestamp DBINTTOTIMESTAMP(integer dbint,string dbfieldtype) // convert database integer to timestamp static void func_DBIntToTimestamp(TItemField *&aTermP, TScriptContext *aFuncContextP) { string tname,literal; aFuncContextP->getLocalVar(1)->getAsString(tname); // DB type string // search DB type, default to lineartime sInt16 ty; TDBFieldType dbfty=dbft_lineartime; if (StrToEnum(DBFieldTypeNames,numDBfieldTypes,ty,tname.c_str())) dbfty=(TDBFieldType)ty; // now set timestamp static_cast(aTermP)->setTimestampAndContext( dbIntToLineartime(aFuncContextP->getLocalVar(0)->getAsInteger(), dbfty), // timestamp TCTX_UNKNOWN // unknown zone ); }; // func_DBIntToTimestamp // integer TIMESTAMPTODBINT(timestamp ts,string dbfieldtype) // convert database integer to timestamp static void func_TimestampToDBInt(TItemField *&aTermP, TScriptContext *aFuncContextP) { string tname,literal; aFuncContextP->getLocalVar(1)->getAsString(tname); // DB type string // search DB type, default to lineartime sInt16 ty; TDBFieldType dbfty=dbft_lineartime; if (StrToEnum(DBFieldTypeNames,numDBfieldTypes,ty,tname.c_str())) dbfty=(TDBFieldType)ty; // now set timestamp aTermP->setAsInteger( lineartimeToDbInt( static_cast(aFuncContextP->getLocalVar(0))->getTimestampAs(TCTX_UNKNOWN), dbfty ) ); }; // func_TimestampToDBInt // timestamp CONVERTTODATAZONE(timestamp atime [,boolean doUnfloat]) // returns timestamp converted to database time zone. // - If doUnfloat, floating timestamps will be fixed in the new zone w/o conversion of the timestamp itself. static void func_ConvertToDataZone(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get DB zone TCustomImplAgent *agentP = static_cast(aFuncContextP->getCallerContext()); TCustomImplDS *datastoreP = static_cast(agentP->fScriptContextDatastore); timecontext_t actual,tctx; if (datastoreP) tctx = static_cast(datastoreP->getDSConfig())->fDataTimeZone; else tctx = agentP->fConfigP->fCurrentDateTimeZone; // get timestamp TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // convert and get actually resulting context back lineartime_t ts = tsP->getTimestampAs(tctx,&actual); // unfloat floats if selected if (aFuncContextP->getLocalVar(1)->getAsBoolean() && TCTX_IS_UNKNOWN(actual)) actual=tctx; // unfloat // assign it to result static_cast(aTermP)->setTimestampAndContext(ts,actual); }; // func_ConvertToDataZone }; // TCustomAgentFuncs const uInt8 param_CheckAuth[] = { VAL(fty_string), VAL(fty_string), VAL(fty_integer) }; const uInt8 param_DBIntToTimestamp[] = { VAL(fty_integer), VAL(fty_string) }; const uInt8 param_TimestampToDBInt[] = { VAL(fty_timestamp), VAL(fty_string) }; const uInt8 param_ConvertToDataZone[] = { VAL(fty_timestamp), OPTVAL(fty_integer) }; const uInt8 param_variant[] = { VAL(fty_none) }; #ifndef BINFILE_ALWAYS_ACTIVE // builtin function table for login context const TBuiltInFuncDef CustomAgentFuncDefs[numCustomAgentFuncs] = { { "AUTHOK", TCustomAgentFuncs::func_AuthOK, fty_integer, 0, NULL }, { "CHECKAUTH", TCustomAgentFuncs::func_CheckAuth, fty_integer, 3, param_CheckAuth }, { "AUTHUSER", TCustomAgentFuncs::func_AuthUser, fty_string, 0, NULL }, { "SETUSERNAME", TCustomAgentFuncs::func_SetUserName, fty_none, 1, param_oneString }, { "SETDOMAIN", TCustomAgentFuncs::func_SetDomain, fty_none, 1, param_oneString }, { "AUTHSTRING", TCustomAgentFuncs::func_AuthString, fty_string, 0, NULL }, { "AUTHDEVICEID", TCustomAgentFuncs::func_AuthDeviceID, fty_string, 0, NULL }, { "AUTHTYPE", TCustomAgentFuncs::func_AuthType, fty_integer, 0, NULL }, { "UNKNOWNDEVICE", TCustomAgentFuncs::func_Unknowndevice, fty_integer, 0, NULL }, { "SETUSERKEY", TCustomAgentFuncs::func_SetUserKey, fty_none, 1, param_variant }, { "SETDEVICEKEY", TCustomAgentFuncs::func_SetDeviceKey, fty_none, 1, param_variant }, }; #endif // not BINFILE_ALWAYS_ACTIVE // builtin function defs for customImpl database and login contexts const TBuiltInFuncDef CustomAgentAndDSFuncDefs[numCustomAgentAndDSFuncs] = { #ifndef BINFILE_ALWAYS_ACTIVE { "DEVICEKEY", TCustomAgentFuncs::func_DeviceKey, fty_string, 0, NULL }, { "USERKEY", TCustomAgentFuncs::func_UserKey, fty_string, 0, NULL }, #endif { "DBINTTOTIMESTAMP", TCustomAgentFuncs::func_DBIntToTimestamp, fty_timestamp, 2, param_DBIntToTimestamp }, { "TIMESTAMPTODBINT", TCustomAgentFuncs::func_TimestampToDBInt, fty_integer, 2, param_TimestampToDBInt }, { "CONVERTTODATAZONE", TCustomAgentFuncs::func_ConvertToDataZone, fty_timestamp, 2, param_ConvertToDataZone }, }; #ifndef BINFILE_ALWAYS_ACTIVE // function table which is chained from login-context function table const TFuncTable CustomAgentFuncTable2 = { sizeof(CustomAgentAndDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of table CustomAgentAndDSFuncDefs, // table pointer NULL // no chain func }; // chain from login context agent funcs to general agent funcs extern const TFuncTable CustomDSFuncTable2; static void *CustomAgentChainFunc(void *&aCtx) { // caller context remains unchanged // -> no change needed // next table is Agent's general function table return (void *)&CustomAgentFuncTable2; } // CustomAgentChainFunc // function table for login context scripts const TFuncTable CustomAgentFuncTable = { sizeof(CustomAgentFuncDefs) / sizeof(TBuiltInFuncDef), // size of table CustomAgentFuncDefs, // table pointer CustomAgentChainFunc // chain to general agent funcs. }; #endif // not BINFILE_ALWAYS_ACTIVE // chain from agent funcs to custom datastore funcs (when chained via CustomDSFuncTable1 extern const TFuncTable CustomDSFuncTable2; static void *CustomDSChainFunc1(void *&aCtx) { // caller context for datastore-level functions is the datastore pointer if (aCtx) aCtx = static_cast(aCtx)->fScriptContextDatastore; // next table is custom datastore's return (void *)&CustomDSFuncTable2; } // CustomDSChainFunc1 // function table which is used by CustomImplDS scripts to access agent-level funcs and then chain // back to datastore level funcs const TFuncTable CustomDSFuncTable1 = { sizeof(CustomAgentAndDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of agent's table CustomAgentAndDSFuncDefs, // table pointer to agent's general purpose (non login-context specific) funcs CustomDSChainFunc1 // chain to ODBC datastore level DB functions }; #endif // SCRIPT_SUPPORT // config element parsing bool TCustomAgentConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements #ifndef BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT if (strucmp(aElementName,"logininitscript")==0) expectScript(fLoginInitScript,aLine,getAgentFuncTableP()); else if (strucmp(aElementName,"logincheckscript")==0) expectScript(fLoginCheckScript,aLine,getAgentFuncTableP()); else if (strucmp(aElementName,"loginfinishscript")==0) expectScript(fLoginFinishScript,aLine,getAgentFuncTableP()); else #endif // SCRIPT_SUPPORT #endif // BINFILE_ALWAYS_ACTIVE // - session level Date/Time info if ( strucmp(aElementName,"timestamputc")==0 || // old 2.1 compatible strucmp(aElementName,"timeutc")==0 // new 3.0 variant, unified with datastore level setting ) { // - warn for usage of old timeutc ReportError(false,"Warning: / is deprecated - please use instead",aElementName); expectBool(fCurrentDateIsUTC); } else if (strucmp(aElementName,"datatimezone")==0) expectTimezone(fCurrentDateTimeZone); // - session level charset and line ends else if (strucmp(aElementName,"datacharset")==0) expectEnum(sizeof(fDataCharSet),&fDataCharSet,DBCharSetNames,numCharSets); else if (strucmp(aElementName,"datalineends")==0) expectEnum(sizeof(fDataLineEndMode),&fDataLineEndMode,lineEndModeNames,numLineEndModes); // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TCustomAgentConfig::localStartElement // resolve void TCustomAgentConfig::localResolve(bool aLastPass) { // convert legacy UTC flag to timezone setting if (fCurrentDateIsUTC) fCurrentDateTimeZone = TCTX_UTC; // Scripts etc. if (aLastPass) { #ifndef BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT // login scripting TScriptContext::resolveScript(getSyncAppBase(),fLoginInitScript,fResolverContext,NULL); TScriptContext::resolveScript(getSyncAppBase(),fLoginCheckScript,fResolverContext,NULL); TScriptContext::resolveScript(getSyncAppBase(),fLoginFinishScript,fResolverContext,NULL); ResolveAPIScripts(); // - derivates' scripts are resolved by now, we can dispose of the resolver context // NOTE: this is true if (fResolverContext) delete fResolverContext; fResolverContext=NULL; #endif #endif // not BINFILE_ALWAYS_ACTIVE } // resolve inherited inherited::localResolve(aLastPass); } // TCustomAgentConfig::localResolve /* public TCustomImplAgent members */ TCustomImplAgent::TCustomImplAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID) : inherited(aAppBaseP, aSessionHandleP, aSessionID), fConfigP(NULL) #ifdef SCRIPT_SUPPORT ,fScriptContextDatastore(NULL) #endif #ifdef SCRIPT_SUPPORT ,fAgentContext(NULL) #endif #ifdef DBAPI_TUNNEL_SUPPORT ,fTunnelDatastoreP(NULL) #endif { // get config for agent and save direct link to agent config for easy reference fConfigP = static_cast(getRootConfig()->fAgentConfigP); #ifndef BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT // create login script context if there are scripts // Note: derivates might already have initialized fAgentContext here, that's why we // now NULL it via ctor. TScriptContext::rebuildContext(getSyncAppBase(),fConfigP->fLoginInitScript,fAgentContext,this); TScriptContext::rebuildContext(getSyncAppBase(),fConfigP->fLoginCheckScript,fAgentContext,this); TScriptContext::rebuildContext(getSyncAppBase(),fConfigP->fLoginFinishScript,fAgentContext,this,true); // now build vars // Note: derivates will rebuild NOW, AFTER our rebuilds, in the derived constructor #endif #endif // BINFILE_ALWAYS_ACTIVE // Note: Datastores are already created from config } // TCustomImplAgent::TCustomImplAgent // destructor TCustomImplAgent::~TCustomImplAgent() { // make sure everything is terminated BEFORE destruction of hierarchy begins TerminateSession(); } // TCustomImplAgent::~TCustomImplAgent // Terminate session void TCustomImplAgent::TerminateSession() { if (!fTerminated) { // Note that the following will happen BEFORE destruction of // individual datastores, so make sure datastores are already // independent of the agnet's ressources InternalResetSession(); #ifdef SCRIPT_SUPPORT // get rid of login context if (fAgentContext) delete fAgentContext; #endif // Make sure datastores know that the agent will go down soon announceDestruction(); } inherited::TerminateSession(); } // TCustomImplAgent::TerminateSession // Reset session void TCustomImplAgent::InternalResetSession(void) { // reset all datastores now to make everything is done which might need the // Agent before it is destroyed // (Note: TerminateDatastores() will be called again by ancestors) TerminateDatastores(); } // TCustomImplAgent::InternalResetSession // Virtual version void TCustomImplAgent::ResetSession(void) { // do my own stuff InternalResetSession(); // let ancestor do its stuff inherited::ResetSession(); } // TCustomImplAgent::ResetSession #ifdef DBAPI_TUNNEL_SUPPORT // initialize session for DBAPI tunnel usage localstatus TCustomImplAgent::InitializeTunnelSession(cAppCharP aDatastoreName) { localstatus sta = LOCERR_OK; // do the minimum of profile selection needed to make DBs work sta = SelectProfile(TUNNEL_PROFILE_ID, false); if (sta==LOCERR_OK) { // find datastore to work with TLocalDSConfig *dsCfgP = getSessionConfig()->getLocalDS(aDatastoreName); if (!dsCfgP) { // no such datastore found sta = DB_NotFound; } else { // found config for given name, instantiate the datastore object fTunnelDatastoreP = static_cast(dsCfgP->newLocalDataStore(this)); if (!fTunnelDatastoreP) sta = DB_Error; } } // done return sta; } // TCustomImplAgent::InitializeTunnelSession // return the datastore initialized for tunnel access TLocalEngineDS *TCustomImplAgent::getTunnelDS() { return fTunnelDatastoreP; } // TCustomImplAgent::getTunnelDS #endif // DBAPI_TUNNEL_SUPPORT #ifndef BINFILE_ALWAYS_ACTIVE // check credential string // Note: if authentication is successful, odbcDBServer session // saves the user key and device key for later reference in subsequent // DB accesses. bool TCustomImplAgent::SessionLogin(const char *aUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfilesActive()) { return inherited::SessionLogin(aUserName, aAuthString, aAuthStringType, aDeviceID); } #endif // BASED_ON_BINFILE_CLIENT bool authok = false; string nonce; if (!fConfigP) return false; // no config -> fail early (no need for cleanup) #ifdef SYSYNC_CLIENT if (IS_CLIENT) { #ifndef NO_LOCAL_DBLOGIN // check for possible client without need for local DB login if (fNoLocalDBLogin) { // just use local DB login name as user key (userkey is probably not needed anyway) fUserKey=fLocalDBUser; // accept as auth ok return true; // return early, no need for cleanup } #else // client without need for local login return true; //#warning "we could probably eliminate much more code here" #endif } #endif // SYSYNC_CLIENT // first step: set defaults fUserKey=aUserName; // user key is equal to user name fDeviceKey=aDeviceID; // device key is equal to device name #ifndef SCRIPT_SUPPORT #define DB_USERNAME aUserName #else #define DB_USERNAME fUserName.c_str() fDomainName.erase(); // no domain name // second step: run script to possibly grant auth before any other method is // needed at all // - set status vars that can be referenced by context funcs in script fStandardAuthOK=false; // not yet authorized, for AUTHOK() func fAuthUser=aUserName; // for AUTHUSER() func fUserName=aUserName; // copy into string var that can be modified by SETUSERNAME() fAuthSecret=aAuthString; // for AUTHSECRET() func fAuthDevice=aDeviceID; // for AUTHDEVICEID() func fAuthType=aAuthStringType; // for AUTHTYPE() func fUnknowndevice=true; // we do not know the device here already // now call and evaluate boolean result TItemField *resP=NULL; fScriptContextDatastore=NULL; if (!TScriptContext::executeWithResult( resP, // can be default result or NULL, will contain result or NULL if no result fAgentContext, fConfigP->fLoginInitScript, fConfigP->getAgentFuncTableP(), // context function table this, // context data (myself) NULL, false, NULL, false )) { authok=false; // script failed, auth failed goto cleanup; } else { if (resP) { // explicit auth or reject at this stage SYSYNC_TRY { // - first let device register itself (and find devicekey possibly) CheckDevice(aDeviceID); // - now get auth result authok = resP->getAsBoolean(); } SYSYNC_CATCH(exception &e) // log error PDEBUGPRINTFX(DBG_ERROR,("Exception during CheckDevice after initscript has accepted/rejected auth: %s",e.what())); // fail auth authok=false; SYSYNC_ENDCATCH delete resP; goto cleanup; } // otherwise, we haven't authorized yet authok=false; } #endif SYSYNC_TRY { // fourth step: get device info, if any CheckDevice(aDeviceID); // fifth step: check simpleauth (in base class) // NOTE: overrides any API level checks if simpleauth is set! if (TSyncSession::SessionLogin(aUserName,aAuthString,aAuthStringType,aDeviceID)) { authok=true; goto cleanup; } // sixth step: let DB API level check authorisation authok=CheckLogin(aUserName, DB_USERNAME, aAuthString, aAuthStringType, aDeviceID); #ifdef SCRIPT_SUPPORT // finalize login // - refresh auth status fStandardAuthOK=authok; // for AUTHOK() func // - call script (if any) fScriptContextDatastore=NULL; authok=TScriptContext::executeTest( authok, // default for no script, no result or script error is current auth fAgentContext, fConfigP->fLoginFinishScript, fConfigP->getAgentFuncTableP(), // context function table (void *)this // context data (myself) ); #endif } SYSYNC_CATCH(exception &e) // log error PDEBUGPRINTFX(DBG_ERROR,("Exception while trying to access DB for SessionLogin: %s",e.what())); authok=false; SYSYNC_ENDCATCH cleanup: // clean up login stuff LoginCleanUp(); // let derived class clean up (like closing transactions etc.) // return status return authok; } // TCustomImplAgent::SessionLogin #endif // BINFILE_ALWAYS_ACTIVE } // namespace sysync /* end of TCustomImplAgent implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/customimplagent.h0000755000373300037200000002017412424517753026240 0ustar00nightlyallusers00000000000000/** * @File customimplagent.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TCustomImplAgent * Base class for agenst (servers or clients) with customizable datastores * based on TCustomImplDS * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-12-05 : luz : separated from odbcdbagent */ #ifndef CUSTOMIMPLAGENT_H #define CUSTOMIMPLAGENT_H // includes #include "stdlogicagent.h" #include "stdlogicds.h" #include "multifielditem.h" #include "scriptcontext.h" #ifdef BASED_ON_BINFILE_CLIENT #include "binfileimplclient.h" #endif using namespace sysync; namespace sysync { #ifdef SCRIPT_SUPPORT // publish as derivates might need it extern const TFuncTable CustomAgentFuncTable; extern const TFuncTable CustomAgentFuncTable2; extern const TFuncTable CustomDSFuncTable1; // - define count here as derivates will access the funcdefs table directly const int numCustomAgentFuncs=14; extern const TBuiltInFuncDef CustomAgentFuncDefs[numCustomAgentFuncs]; #ifndef BINFILE_ALWAYS_ACTIVE const int numCustomAgentAndDSFuncs=5; #else const int numCustomAgentAndDSFuncs=3; #endif extern const TBuiltInFuncDef CustomAgentAndDSFuncDefs[numCustomAgentAndDSFuncs]; #endif // config names for character sets extern const char * const DBCharSetNames[numCharSets]; // database field types typedef enum { dbft_string, dbft_blob, // binary contents of string will be used, no translations dbft_date, dbft_time, dbft_timefordate, // to add time to a date dbft_timestamp, dbft_dateonly, // timestamp, but carrying only a date, so no zone correction is applied dbft_uctoffsfortime_hours, // to add UTC offset to a time or timestamp dbft_uctoffsfortime_mins, // to add UTC offset to a time or timestamp dbft_uctoffsfortime_secs, // to add UTC offset to a time or timestamp dbft_zonename, // to get zone name of a timestamp dbft_numeric, // string value is used w/o any quotes in SQL dbft_lineartime, // linear time as-is dbft_lineardate, // linear date as-is dbft_unixtime_s, // integer value representing UNIX epoch time stamp in seconds dbft_unixtime_ms, // integer value representing UNIX epoch time stamp in milliseconds dbft_unixtime_us, // integer value representing UNIX epoch time stamp in microseconds dbft_unixdate_s, // integer value representing UNIX epoch date in seconds dbft_unixdate_ms, // integer value representing UNIX epoch date in milliseconds dbft_unixdate_us, // integer value representing UNIX epoch date in microseconds dbft_nsdate_s, // integer value representing NSDate (seconds since 2001-01-01 00:00) numDBfieldTypes } TDBFieldType; extern const char * const DBFieldTypeNames[numDBfieldTypes]; // integer in DB <-> lineartime conversions lineartime_t dbIntToLineartime(sInt64 aDBInt, TDBFieldType aDbfty); sInt64 lineartimeToDbInt(lineartime_t aLinearTime, TDBFieldType aDbfty); // forward class TCustomDSConfig; #ifdef SCRIPT_SUPPORT class TScriptContext; #endif class TCustomAgentConfig: #ifdef BASED_ON_BINFILE_CLIENT public TBinfileClientConfig #else public TAgentConfig #endif { #ifdef BASED_ON_BINFILE_CLIENT typedef TBinfileClientConfig inherited; #else typedef TAgentConfig inherited; #endif public: TCustomAgentConfig(TConfigElement *aParentElement); virtual ~TCustomAgentConfig(); // properties #ifdef SCRIPT_SUPPORT // - login scripts string fLoginInitScript; // called to initialize variables and early check for auth string fLoginCheckScript; // called to check permission for all users in question string fLoginFinishScript; // called when login is finished (failed or successful) #endif // SCRIPT_SUPPORT // - Date/Time info bool fCurrentDateIsUTC; //%%% legacy flag for compatibility, superseded by fCurrentDateTimeZone timecontext_t fCurrentDateTimeZone; // time zone for storing/retrieving timestamps in DB // - charset to be used in the data table TCharSets fDataCharSet; // - line end mode to be used in the data table for multiline data TLineEndModes fDataLineEndMode; #ifdef SCRIPT_SUPPORT // provided to allow derivates to add API specific script functions to scripts called from customagent virtual const TFuncTable *getAgentFuncTableP(void) { #ifndef BASED_ON_BINFILE_CLIENT return &CustomAgentFuncTable; #else return NULL; #endif }; TScriptContext *fResolverContext; #endif protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void clear(); virtual void localResolve(bool aLastPass); #ifdef SCRIPT_SUPPORT virtual void ResolveAPIScripts(void) { /* NOP */ }; #endif }; // TCustomAgentConfig class TCustomImplDS; class TCustomImplAgent: #ifdef BASED_ON_BINFILE_CLIENT public TBinfileImplClient #else public TStdLogicAgent #endif { friend class TCustomCommonFuncs; friend class TCustomAgentFuncs; #ifdef BASED_ON_BINFILE_CLIENT typedef TBinfileImplClient inherited; #else typedef TStdLogicAgent inherited; #endif public: TCustomImplAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID); virtual ~TCustomImplAgent(); virtual void TerminateSession(void); // Terminate session, like destructor, but without actually destructing object itself virtual void ResetSession(void); // Resets session (but unlike TerminateSession, session might be re-used) void InternalResetSession(void); // static implementation for calling through virtual destructor and virtual ResetSession(); // Custom agent config TCustomAgentConfig *fConfigP; // Needed for general script support #ifdef SCRIPT_SUPPORT TCustomImplDS *fScriptContextDatastore; // needed because datastore chains agent's script funcs #endif // SCRIPT_SUPPORT #ifdef DBAPI_TUNNEL_SUPPORT // Initialize a datastore tunnel session virtual localstatus InitializeTunnelSession(cAppCharP aDatastoreName); virtual TLocalEngineDS *getTunnelDS(); #endif #ifndef BASED_ON_BINFILE_CLIENT // if binfiles are not compiled in, they are always inactive (otherwise binfileclient parent defines this method) bool binfilesActive(void) { return false; }; #endif // Login and device management only if not exclusively based on binfile client #ifndef BINFILE_ALWAYS_ACTIVE // - login for this session virtual bool SessionLogin(const char *aUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID); // - clean up after all login activity is over (including finishscript) virtual void LoginCleanUp(void) { /* NOP at this level */ }; // - get user key const char *getUserKey(void) { return fUserKey.c_str(); }; // status vars, valid during login context script execution only! #ifdef SCRIPT_SUPPORT bool fStandardAuthOK; // result of standard auth checking string fUserName; // possibly modified user name used to find user in DB string fDomainName; // domain name possibly derived from LOCALURI or similar const char *fAuthUser; // original username as sent by remote const char *fAuthSecret; // secret from remote (normally, MD5 of user:password) const char *fAuthDevice; // device ID TAuthSecretTypes fAuthType; // set if V11-type secret bool fUnknowndevice; // set if device is unknown so far #endif // SCRIPT_SUPPORT // session vars string fUserKey; // user key obtained at SessionLogin string fDeviceKey; // device key obtained at SessionLogin protected: // - check device ID related stuff virtual void CheckDevice(const char *aDeviceID) { /* NOP here */ }; // - check user/pw (part of SessionLogin process) virtual bool CheckLogin(const char *aOriginalUserName, const char *aModifiedUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID) { return false; /* cannot login */ }; // - remote device is analyzed, possibly save status virtual void remoteAnalyzed(void) { /* NOP at this level */ }; // script contexts #endif // BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT TScriptContext *fAgentContext; #endif // SCRIPT_SUPPORT #ifdef DBAPI_TUNNEL_SUPPORT TCustomImplDS *fTunnelDatastoreP; #endif // DBAPI_TUNNEL_SUPPORT }; // TCustomImplAgent } // namespace sysync #endif // CUSTOMIMPLAGENT_H // eof syncevolution-1.5/src/synthesis/src/sysync/customimplds.cpp0000755000373300037200000052136612424517753026114 0ustar00nightlyallusers00000000000000/** * @File customimpl.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TCustomImplDS * Base class for customizable datastores (mainly extended DB mapping features * common to all derived classes like ODBC, DBAPI etc.). * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-12-05 : luz : separated from odbcapids */ // includes #include "sysync.h" #include "multifielditem.h" #include "mimediritemtype.h" #include "customimplds.h" #include "customimplagent.h" #ifdef DBAPI_TUNNEL_SUPPORT #include "SDK_util.h" #endif namespace sysync { #ifndef BINFILE_ALWAYS_ACTIVE #ifdef SYDEBUG const char * const MapEntryTypeNames[numMapEntryTypes] = { "invalid", "normal", "tempidmap", "pendingmap" }; #endif #endif // not BINFILE_ALWAYS_ACTIVE #ifdef SCRIPT_SUPPORT class TCustomDSfuncs { public: // Custom Impl datastore specific script functions // =============================================== // string FOLDERKEY() // returns folder key static void func_FolderKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fFolderKey.c_str() ); }; // func_FolderKey // string TARGETKEY() // returns target key static void func_TargetKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fTargetKey.c_str() ); }; // func_TargetKey // integer ARRAYINDEX() // returns current array index when reading or writing an array // in the finish function it denotes the number of array items totally static void func_ArrayIndex(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsInteger( static_cast(aFuncContextP->getCallerContext())->fArrIdx ); }; // func_ArrayIndex // string PARENTKEY() // returns key of (array) parent object (like %k) static void func_ParentKey(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->fParentKey.c_str() ); }; // func_ParentKey // integer WRITING() // returns true if script is called while writing to DB static void func_Writing(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->fWriting ); }; // func_Writing // integer DELETING() // returns true if script is called while deleting in DB static void func_Deleting(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->fDeleting ); }; // func_Deleting // integer INSERTING() // returns true if script is called while inserting new data to DB static void func_Inserting(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->fInserting ); }; // func_Inserting // string LOGSUBST(string logtext) // returns log placeholders substituted in logtext static void func_LogSubst(TItemField *&aTermP, TScriptContext *aFuncContextP) { string logtext; aFuncContextP->getLocalVar(0)->getAsString(logtext); // log text // perform substitutions static_cast(aFuncContextP->getCallerContext())->DoLogSubstitutions(logtext,false); // return it aTermP->setAsString(logtext); }; // func_LogSubst }; // TCustomDSfuncs const uInt8 param_LogSubst[] = { VAL(fty_string) }; // builtin function table for datastore level const TBuiltInFuncDef CustomDSFuncDefs[] = { { "FOLDERKEY", TCustomDSfuncs::func_FolderKey, fty_string, 0, NULL }, { "TARGETKEY", TCustomDSfuncs::func_TargetKey, fty_string, 0, NULL }, { "ARRAYINDEX", TCustomDSfuncs::func_ArrayIndex, fty_integer, 0, NULL }, { "PARENTKEY", TCustomDSfuncs::func_ParentKey, fty_string, 0, NULL }, { "WRITING", TCustomDSfuncs::func_Writing, fty_integer, 0, NULL }, { "INSERTING", TCustomDSfuncs::func_Inserting, fty_integer, 0, NULL }, { "DELETING", TCustomDSfuncs::func_Deleting, fty_integer, 0, NULL }, { "LOGSUBST", TCustomDSfuncs::func_LogSubst, fty_string, 1, param_LogSubst } }; // chain to generic local engine datastore funcs static void *CustomDSChainFunc2(void *&aCtx) { // context pointer for datastore-level funcs is the datastore // -> no change needed // next table is localEngineDS's return (void *)&DBFuncTable; } // CustomDSChainFunc2 const TFuncTable CustomDSFuncTable2 = { sizeof(CustomDSFuncDefs) / sizeof(TBuiltInFuncDef), // size of table CustomDSFuncDefs, // table pointer CustomDSChainFunc2 // chain generic DB functions }; #endif // Config // ====== TCustomDSConfig::TCustomDSConfig(const char* aName, TConfigElement *aParentElement) : inherited(aName,aParentElement), fFieldMappings("mappings",this) #ifdef SCRIPT_SUPPORT ,fResolveContextP(NULL) ,fDSScriptsResolved(false) #endif { // nop so far clear(); } // TCustomDSConfig::TCustomDSConfig TCustomDSConfig::~TCustomDSConfig() { // clear clear(); } // TCustomDSConfig::~TCustomDSConfig // init defaults void TCustomDSConfig::clear(void) { // init defaults // - multi-folder support fMultiFolderDB=false; // Data table options // - charset to be used in the data table fDataCharSet=chs_ansi; // suitable default for ODBC // - line end mode to be used in the data table for multiline data fDataLineEndMode=lem_dos; // default to CRLF, as this seems to be safest assumption // - if set, causes that data is read from DB first and then merged // with updated fields. Not needed in normal SQL DBs, as they can // update a subset of all columns. However, might still be needed // for special cases like Achil that needs record size calculation // or sortfeldXXX generation. fUpdateAllFields=false; // - Date/Time info fDataIsUTC=false; // compatibility flag only, will set fDataTimeZone to TCTX_UTC at Resolve if set fDataTimeZone=TCTX_SYSTEM; // default to local system time fUserZoneOutput=true; // by default, non-floating timestamps are moved to user zone after reading from DB. Only if zone context for timestamp fields is really retrieved from the DB on a per record level, this can be switched off #ifndef BINFILE_ALWAYS_ACTIVE // - flag indicating that admin tables have DS 1.2 support (map entrytype, map flags, fResumeAlertCode, fLastSuspend, fLastSuspendIdentifier fResumeSupport=false; fResumeItemSupport=false; // no item resume as well // - admin capability info fSyncTimeStampAtEnd=false; // if set, time point of sync is taken AFTER last write to DB (for single-user DBs like FMPro). Note that target table layout is different in this case! fOneWayFromRemoteSupported=false; // compatible with old layout of target tables, no support #endif // not BINFILE_ALWAYS_ACTIVE fStoreSyncIdentifiers=false; // compatible with old layout of target tables, no support // clear embedded fFieldMappings.clear(); #ifdef SCRIPT_SUPPORT // - script called after admin data is loaded (before any data access takes place) fAdminReadyScript.erase(); // - script called at end of sync session fSyncEndScript.erase(); // - clear script resolve context if (fResolveContextP) { delete fResolveContextP; fResolveContextP=NULL; } fDSScriptsResolved=false; #endif // clear inherited inherited::clear(); } // TCustomDSConfig::clear // config element parsing bool TCustomDSConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // multi-folder-support if (strucmp(aElementName,"multifolder")==0) expectBool(fMultiFolderDB); // user data related properties else if (strucmp(aElementName,"datacharset")==0) expectEnum(sizeof(fDataCharSet),&fDataCharSet,DBCharSetNames,numCharSets); else if (strucmp(aElementName,"datalineends")==0) expectEnum(sizeof(fDataLineEndMode),&fDataLineEndMode,lineEndModeNames,numLineEndModes); else if (strucmp(aElementName,"updateallfields")==0) expectBool(fUpdateAllFields); // - Date/Time info else if (strucmp(aElementName,"timeutc")==0) { // - warn for usage of old timeutc ReportError(false,"Warning: is deprecated - please use instead",aElementName); expectBool(fDataIsUTC); } else if (strucmp(aElementName,"datatimezone")==0) expectTimezone(fDataTimeZone); else if (strucmp(aElementName,"userzoneoutput")==0) expectBool(fUserZoneOutput); #ifndef BINFILE_ALWAYS_ACTIVE // - admin capability info else if (strucmp(aElementName,"synctimestampatend")==0) expectBool(fSyncTimeStampAtEnd); else if (strucmp(aElementName,"fromremoteonlysupport")==0) expectBool(fOneWayFromRemoteSupported); else if (strucmp(aElementName,"resumesupport")==0) expectBool(fResumeSupport); else if (strucmp(aElementName,"resumeitemsupport")==0) expectBool(fResumeItemSupport); #endif // BINFILE_ALWAYS_ACTIVE else if ( strucmp(aElementName,"storelastsyncidentifier")==0 || strucmp(aElementName,"storesyncidentifiers")==0 ) expectBool(fStoreSyncIdentifiers); #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"adminreadyscript")==0) expectScript(fAdminReadyScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"syncendscript")==0) expectScript(fSyncEndScript, aLine, getDSFuncTableP()); #endif // - field mappings else if (strucmp(aElementName,"fieldmap")==0) { // check reference argument const char* ref = getAttr(aAttributes,"fieldlist"); if (!ref) { ReportError(true,"fieldmap missing 'fieldlist' attribute"); } else { // look for field list TMultiFieldDatatypesConfig *mfcfgP = DYN_CAST(getSyncAppBase()->getRootConfig()->fDatatypesConfigP); if (!mfcfgP) SYSYNC_THROW(TConfigParseException("no multifield config")); TFieldListConfig *cfgP = mfcfgP->getFieldList(ref); if (!cfgP) return fail("fieldlist '%s' not defined for fieldmap",ref); // - store field list reference in map fFieldMappings.fFieldListP=cfgP; // - let element handle parsing expectChildParsing(fFieldMappings); } } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TCustomDSConfig::localStartElement // resolve void TCustomDSConfig::localResolve(bool aLastPass) { // convert legacy UTC flag to timezone setting if (fDataIsUTC) fDataTimeZone = TCTX_UTC; // scripts #ifdef SCRIPT_SUPPORT if (aLastPass) { // resolve map scripts now in case they haven't been resolved already ResolveDSScripts(); } #endif // resolve children fFieldMappings.Resolve(aLastPass); #ifdef SCRIPT_SUPPORT // Now everything is resolved, we can forget the resolve context if (aLastPass && fResolveContextP) { delete fResolveContextP; fResolveContextP = NULL; } #endif // resolve inherited inherited::localResolve(aLastPass); } // TCustomDSConfig::localResolve #ifdef SCRIPT_SUPPORT // resolve DS related scripts, but make sure we do that only once // Note: MAKE SURE that order of resolving is same as rebuilding order! void TCustomDSConfig::ResolveDSScripts(void) { // resolve if (!fDSScriptsResolved) { // resolve possible API level scripts first apiResolveScripts(); // resolve start and end scripts first TScriptContext::resolveScript(getSyncAppBase(),fAdminReadyScript,fResolveContextP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fSyncEndScript,fResolveContextP,NULL); // - option filter generator script TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fOptionFilterScript,fResolveContextP,fFieldMappings.fFieldListP); // - map scripts TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fInitScript,fResolveContextP,fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fAfterReadScript,fResolveContextP,fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fBeforeWriteScript,fResolveContextP,fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fAfterWriteScript,fResolveContextP,fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fFinishScript,fResolveContextP,fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fFieldMappings.fFinalisationScript,fResolveContextP,fFieldMappings.fFieldListP); fDSScriptsResolved=true; } } // TCustomDSConfig::ResolveDSScripts #endif // transfer size limits from map to type static void transferMapOptionsToType(TFieldMapList &aFml, TMultiFieldItemType *aItemTypeP, sInt16 aMaxRepeat, sInt16 aRepInc) { TFieldMapList::iterator pos; TFieldMapItem *fmiP; for (pos=aFml.begin(); pos!=aFml.end(); pos++) { fmiP = *pos; #ifdef ARRAYDBTABLES_SUPPORT if (fmiP->isArray()) { // is array, recurse into fields of array TFieldMapArrayItem *fmaiP = static_cast(fmiP); transferMapOptionsToType( fmaiP->fArrayFieldMapList, aItemTypeP, fmaiP->fMaxRepeat, fmaiP->fRepeatInc ); } else #endif if (fmiP->fid>=0) { // normal map, apply to all related fields if (aMaxRepeat==0) aMaxRepeat=1; // unlimited repeat is only applied to first field #ifdef ARRAYFIELD_SUPPORT TFieldDefinition *fdP=aItemTypeP->getFieldDefinition(fmiP->fid); if (fdP && fdP->array) { // this is an array field, disable fid offsetting aMaxRepeat=1; } #endif for (sInt16 k=0; kgetFieldOptions(fmiP->fid+k*aRepInc); if (!optP) break; if ( optP->maxsize==FIELD_OPT_MAXSIZE_NONE || // no size defined yet optP->maxsize==FIELD_OPT_MAXSIZE_UNKNOWN || // or defined as unknown (optP->maxsize>sInt32(fmiP->maxsize) && // or defined size is larger than that one set in the mapping... fmiP->maxsize!=0) // ..but map size is not unlimited ) { // set new max size optP->maxsize = fmiP->maxsize; } if (fmiP->notruncate) optP->notruncate=true; } } } } // transferMapOptionsToType // Add (probably datastore-specific) limits such as MaxSize and NoTruncate to types void TCustomDSConfig::addTypeLimits(TLocalEngineDS *aLocalDatastoreP, TSyncSession *aSessionP) { // add field size limitations from map to all types TSyncItemTypePContainer::iterator pos; TSyncItemTypePContainer *typesP = &(aLocalDatastoreP->fRxItemTypes); for (uInt8 i=0; i<2; i++) { for (pos=typesP->begin(); pos!=typesP->end(); pos++) { // apply maps to type transferMapOptionsToType( fFieldMappings.fFieldMapList, static_cast(*pos), 1,1 // single instance only ); } typesP = &(aLocalDatastoreP->fTxItemTypes); } } // TCustomDSConfig::addTypeLimits // proptotype to make compiler happy bool parseMap(TCustomDSConfig *aCustomDSConfig, TConfigElement *cfgP, bool aIsArray, TFieldListConfig *aFieldListP, TFieldMapList &aFieldMapList, const char **aAttributes, bool aUpdateParams); // parse map items bool parseMap(TCustomDSConfig *aCustomDSConfig, TConfigElement *cfgP, bool aIsArray, TFieldListConfig *aFieldListP, TFieldMapList &aFieldMapList, const char **aAttributes, bool aUpdateParams) { TFieldMapItem *mapitemP = NULL; sInt16 fid = VARIDX_UNDEFINED; // get name const char* nam = cfgP->getAttr(aAttributes,"name"); // get base field reference is possible for arrays too, to specify the relevant array size const char* ref = cfgP->getAttr(aAttributes,aIsArray ? "sizefrom" : "references"); if (ref) { // get fid for referenced field if (!aCustomDSConfig->fFieldMappings.fFieldListP) SYSYNC_THROW(TConfigParseException("map with no field list defined")); #ifdef SCRIPT_SUPPORT fid = TConfigElement::getFieldIndex(ref,aCustomDSConfig->fFieldMappings.fFieldListP,aCustomDSConfig->fResolveContextP); #else fid = TConfigElement::getFieldIndex(ref,aCustomDSConfig->fFieldMappings.fFieldListP); #endif } // now decide what to do if (aUpdateParams) { // only updating params of existing map (non-arrays only!) // - search for existing map item by name TFieldMapList::iterator pos; for (pos=aFieldMapList.begin(); pos!=aFieldMapList.end(); pos++) { // check for name TFieldMapItem *fmiP = static_cast(*pos); if (strucmp(nam,fmiP->getName())==0) { // found it mapitemP = fmiP; } } if (!mapitemP) { return cfgP->fail("mapredefine must refer to an existing map"); } } else { // creating a new map #ifdef ARRAYDBTABLES_SUPPORT if (aIsArray) { // array container mapitemP = aCustomDSConfig->newFieldMapArrayItem(aCustomDSConfig,cfgP); // save size field reference if any mapitemP->fid=fid; // extra attributes for derived classes mapitemP->checkAttrs(aAttributes); // let array container parse details cfgP->expectChildParsing(*mapitemP); } #endif } if (!aIsArray) { // simple map cfgP->expectEmpty(); // plain maps may not have content // process creation of map item const char* type = cfgP->getAttr(aAttributes,"type"); const char* mode = cfgP->getAttr(aAttributes,"mode"); bool truncate = true; cfgP->getAttrBool(aAttributes,"truncate",truncate,true); if (!nam || !ref || !type) return cfgP->fail("map must have 'name', 'references', 'type' and 'mode' attributes at least"); if (fid==VARIDX_UNDEFINED) return cfgP->fail("map references unknown field '%s'",ref); // convert type sInt16 ty; if (!StrToEnum(DBFieldTypeNames,numDBfieldTypes,ty,type)) return cfgP->fail("unknown type '%s'",type); // convert mode // - needed flags bool rd,wr,fins,fupd; // - optional flags bool asparam=false,floatingts=false,needsfinalisation=false; if (mode) { rd=false,wr=false; fins=false; fupd=false; while (*mode) { if (tolower(*mode)=='r') rd=true; else if (tolower(*mode)=='w') { wr=true; fins=true; fupd=true; } // for both insert and update else if (tolower(*mode)=='i') { wr=true; fins=true; } // insert only else if (tolower(*mode)=='u') { wr=true; fupd=true; } // update only else if (tolower(*mode)=='p') { asparam=true; } // map as parameter (e.g. ODBC parameter mechanism for INSERT/UPDATE statements) else if (tolower(*mode)=='f') { floatingts=true; } // map as floating time field (will be written as-is, no conversion from/to DB time zone takes place) else if (tolower(*mode)=='x') { needsfinalisation=true; } // needs to be kept for finalisation at end of session (for relational link updates etc.) else return cfgP->fail("invalid mode '%c'",*mode); // next char mode++; } } else { // default mode for needed flags rd=true; wr=true; fins=true; fupd=true; } // Optionals // - size sInt32 sz=0; // default to unlimited if (!cfgP->getAttrLong(aAttributes,"size",sz,true)) cfgP->fail("invalid size specification"); // - statement index sInt16 setno=0; // default to 0 if (!cfgP->getAttrShort(aAttributes,"set_no",setno,true)) cfgP->fail("invalid set_no specification"); // create mapitem, name is DB field name if (!aUpdateParams) { mapitemP = aCustomDSConfig->newFieldMapItem(nam,cfgP); } mapitemP->fid=fid; mapitemP->dbfieldtype=(TDBFieldType)ty; mapitemP->readable=rd; mapitemP->writable=wr; mapitemP->for_insert=fins; mapitemP->for_update=fupd; mapitemP->as_param=asparam; mapitemP->floating_ts=floatingts; mapitemP->needs_finalisation=needsfinalisation; mapitemP->maxsize=(uInt32)sz; mapitemP->notruncate=!truncate; mapitemP->setNo=(uInt16)setno; // extra attributes for derived classes mapitemP->checkAttrs(aAttributes); } // if normal map if (!aUpdateParams) { // - and add it to the list aFieldMapList.push_back(mapitemP); } return true; } // parseMap // Field Map item // ============== TFieldMapItem::TFieldMapItem(const char *aElementName, TConfigElement *aParentElement) : TConfigElement(aElementName,aParentElement) { // default suitable for array container readable=false; writable=false; for_insert=false; for_update=false; as_param=false; floating_ts=false; needs_finalisation=false; setNo=0; // default set is 0 maxsize=0; // no max size notruncate=false; // allow truncation by default fid=VARIDX_UNDEFINED; // no field dbfieldtype=dbft_string; // default to string } // TFieldMapItem::TFieldMapItem #ifdef ARRAYDBTABLES_SUPPORT // array container // =============== TFieldMapArrayItem::TFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement) : TFieldMapItem("array",aParentElement), fCustomDSConfigP(aCustomDSConfigP) { clear(); } // TFieldMapArrayItem::TFieldMapArrayItem TFieldMapArrayItem::~TFieldMapArrayItem() { // nop so far clear(); } // TFieldMapArrayItem::~TFieldMapArrayItem // init defaults void TFieldMapArrayItem::clear(void) { // init defaults // - clear values #ifdef OBJECT_FILTERING fNoItemsFilter.erase(); #endif fMaxRepeat=1; fRepeatInc=1; fStoreEmpty=false; #ifdef SCRIPT_SUPPORT // - clear scripts fInitScript.erase(); fAfterReadScript.erase(); fBeforeWriteScript.erase(); fAfterWriteScript.erase(); fFinishScript.erase(); fScriptsResolved=false; #endif // - clear map items TFieldMapList::iterator pos; for (pos=fArrayFieldMapList.begin(); pos!=fArrayFieldMapList.end(); pos++) delete (*pos); fArrayFieldMapList.clear(); // clear inherited inherited::clear(); } // TFieldMapArrayItem::clear #ifdef SCRIPT_SUPPORT void TFieldMapArrayItem::expectScriptUnresolved(string &aTScript,sInt32 aLine, const TFuncTable *aContextFuncs) { if (fScriptsResolved) { fail("array scripts must be defined before first within array"); } else { expectScript(aTScript,aLine,aContextFuncs); } } // TFieldMapArrayItem::expectScriptUnresolved #endif // config element parsing bool TFieldMapArrayItem::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"map")==0) { #ifdef SCRIPT_SUPPORT // early resolve basic map scripts so map entries can refer to local vars if (!fScriptsResolved) ResolveArrayScripts(); #endif // now parse new map item return parseMap(fCustomDSConfigP,this,false,fCustomDSConfigP->fFieldMappings.fFieldListP,fArrayFieldMapList,aAttributes, false); } /* nested arrays not yet supported // %%%% Note: if we do support them, we need to update // the script resolution stuff above and make ProcessArrayScripts recursive else if (strucmp(aElementName,"array")==0) #ifdef SCRIPT_SUPPORT // early resolve basic map scripts so map entries can refer to local vars if (!fScriptsResolved) ResolveArrayScripts(); #endif // now parse nested array map return parseMap(fBaseFieldMappings,this,true,fFieldListP,fArrayFieldMapList,aAttributes, false); */ else if (strucmp(aElementName,"maxrepeat")==0) expectInt16(fMaxRepeat); else if (strucmp(aElementName,"repeatinc")==0) expectInt16(fRepeatInc); else if (strucmp(aElementName,"storeempty")==0) expectBool(fStoreEmpty); #ifdef OBJECT_FILTERING else if (strucmp(aElementName,"noitemsfilter")==0) expectString(fNoItemsFilter); #endif #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"initscript")==0) expectScriptUnresolved(fInitScript, aLine, fCustomDSConfigP->fFieldMappings.getDSFuncTableP()); else if (strucmp(aElementName,"afterreadscript")==0) expectScriptUnresolved(fAfterReadScript, aLine, fCustomDSConfigP->fFieldMappings.getDSFuncTableP()); else if (strucmp(aElementName,"beforewritescript")==0) expectScriptUnresolved(fBeforeWriteScript, aLine, fCustomDSConfigP->fFieldMappings.getDSFuncTableP()); else if (strucmp(aElementName,"afterwritescript")==0) expectScriptUnresolved(fAfterWriteScript, aLine, fCustomDSConfigP->fFieldMappings.getDSFuncTableP()); else if (strucmp(aElementName,"finishscript")==0) expectScriptUnresolved(fFinishScript, aLine, fCustomDSConfigP->fFieldMappings.getDSFuncTableP()); #endif // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TFieldMapArrayItem::localStartElement #ifdef SCRIPT_SUPPORT // process single array's scripts (resolve or rebuild them) void TFieldMapArrayItem::ResolveArrayScripts(void) { // resolve TScriptContext::resolveScript(getSyncAppBase(),fInitScript,fCustomDSConfigP->fResolveContextP,fCustomDSConfigP->fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fAfterReadScript,fCustomDSConfigP->fResolveContextP,fCustomDSConfigP->fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fBeforeWriteScript,fCustomDSConfigP->fResolveContextP,fCustomDSConfigP->fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fAfterWriteScript,fCustomDSConfigP->fResolveContextP,fCustomDSConfigP->fFieldMappings.fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fFinishScript,fCustomDSConfigP->fResolveContextP,fCustomDSConfigP->fFieldMappings.fFieldListP); fScriptsResolved=true; } // TFieldMapArrayItem::ResolveArrayScripts #endif // resolve void TFieldMapArrayItem::localResolve(bool aLastPass) { if (aLastPass) { #ifdef SCRIPT_SUPPORT // resolve map scripts now in case they haven't been resolved already if (!fScriptsResolved) ResolveArrayScripts(); #endif } // resolve inherited inherited::localResolve(aLastPass); } // TFieldMapArrayItem::localResolve #endif // field mappings // ============== TFieldMappings::TFieldMappings(const char* aName, TConfigElement *aParentElement) : TConfigElement(aName,aParentElement), fFieldListP(NULL) { clear(); } // TFieldMappings::TFieldMappings TFieldMappings::~TFieldMappings() { // nop so far clear(); } // TFieldMappings::~TFieldMappings // init defaults void TFieldMappings::clear(void) { // init defaults // - clear map items TFieldMapList::iterator pos; for (pos=fFieldMapList.begin(); pos!=fFieldMapList.end(); pos++) delete (*pos); fFieldMapList.clear(); #ifdef SCRIPT_SUPPORT // - clear scripts fOptionFilterScript.erase(); fInitScript.erase(); fAfterReadScript.erase(); fBeforeWriteScript.erase(); fAfterWriteScript.erase(); fFinishScript.erase(); // fFinishScript is now in use for exit call of datastore handling fFinalisationScript.erase(); // called for each item with fields having the needs_finalisation set (BEFORE fFinishScript) #endif // - clear reference fFieldListP=NULL; // clear inherited inherited::clear(); } // TFieldMappings::clear #ifdef SCRIPT_SUPPORT void TFieldMappings::expectScriptUnresolved(string &aTScript,sInt32 aLine, const TFuncTable *aContextFuncs) { TCustomDSConfig *dscfgP = static_cast(getParentElement()); if (dscfgP->fDSScriptsResolved) { fail("database scripts must be defined before first "); } else { expectScript(aTScript,aLine,aContextFuncs); } } // TFieldMappings::expectScriptUnresolved #endif // config element parsing bool TFieldMappings::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { TCustomDSConfig *dscfgP = static_cast(getParentElement()); // checking the elements if (strucmp(aElementName,"map")==0) { #ifdef SCRIPT_SUPPORT // early resolve basic datastore scripts so map entries can refer to local vars already dscfgP->ResolveDSScripts(); #endif // now parse map return parseMap(dscfgP,this,false,fFieldListP,fFieldMapList,aAttributes, false); } else if (strucmp(aElementName,"mapredefine")==0) { // allow specifying parameters for some maps in a automap generated mappings list return parseMap(dscfgP,this,false,fFieldListP,fFieldMapList,aAttributes, true); } else if (strucmp(aElementName,"automap")==0) { // auto-create map entries for all fields in the field list // (this is a convenience function to allow nearly identical usage of textdb and dbapi with text module) if (!fFieldListP) SYSYNC_THROW(TConfigParseException("automap with no field list defined")); // check mode option bool indexAsName=false; if (!getAttrBool(aAttributes,"indexasname",indexAsName,true)) fail("invalid indexasname value"); // iterate through field definitions and create a string mapping TFieldDefinitionList::iterator pos; sInt16 fid=0; string fieldname; for (pos=fFieldListP->fFields.begin(); pos!=fFieldListP->fFields.end(); ++pos, ++fid) { // create DB field name if (indexAsName) StringObjPrintf(fieldname,"%hd",fid); // use fid as field name else fieldname=TCFG_CSTR(pos->fieldname); // use internal field's name // create mapitem using field index/itemfield name as DB field name TFieldMapItem *mapitemP = static_cast(getParentElement())->newFieldMapItem(fieldname.c_str(),this); mapitemP->fid=fid; // fid corresponds with position in field definitions list mapitemP->dbfieldtype = pos->type==fty_timestamp ? dbft_timestamp : dbft_string; // map timestamps as such, otherwise all are strings mapitemP->readable=true; mapitemP->writable=true; mapitemP->for_insert=true; mapitemP->for_update=true; // - and add it to the list fFieldMapList.push_back(mapitemP); } // that's it expectEmpty(); } #ifdef ARRAYDBTABLES_SUPPORT else if (strucmp(aElementName,"array")==0) { #ifdef SCRIPT_SUPPORT // early resolve basic datastore scripts so array map entries can refer to local vars already! dscfgP->ResolveDSScripts(); #endif // now parse array map return parseMap(dscfgP,this,true,fFieldListP,fFieldMapList,aAttributes,false); } #endif #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"optionfilterscript")==0) expectScriptUnresolved(fOptionFilterScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"initscript")==0) expectScriptUnresolved(fInitScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"afterreadscript")==0) expectScriptUnresolved(fAfterReadScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"beforewritescript")==0) expectScriptUnresolved(fBeforeWriteScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"afterwritescript")==0) expectScriptUnresolved(fAfterWriteScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"finishscript")==0) expectScriptUnresolved(fFinishScript, aLine, getDSFuncTableP()); else if (strucmp(aElementName,"finalisationscript")==0) expectScriptUnresolved(fFinalisationScript, aLine, getDSFuncTableP()); #endif // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TFieldMappings::localStartElement // resolve void TFieldMappings::localResolve(bool aLastPass) { // resolve each map TFieldMapList::iterator pos; for (pos=fFieldMapList.begin(); pos!=fFieldMapList.end(); pos++) { (*pos)->Resolve(aLastPass); } // resolve inherited inherited::localResolve(aLastPass); } // TFieldMappings::localResolve #ifdef SCRIPT_SUPPORT // access to DS func table pointer const TFuncTable *TFieldMappings::getDSFuncTableP(void) { return static_cast(getParentElement())->getDSFuncTableP(); } // TFieldMappings::getDSFuncTableP #endif /* * Implementation of TCustomImplDS */ // constructor TCustomImplDS::TCustomImplDS( TCustomDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask ) : inherited(aConfigP,aSessionP, aName, aCommonSyncCapMask) { fNeedFinalisation=false; // save pointer to config record fConfigP=aConfigP; fMultiFolderDB = fConfigP->fMultiFolderDB; // make a local copy of the typed agent pointer fAgentP=static_cast(fSessionP); // make a local copy of the typed agent config pointer fAgentConfigP = DYN_CAST( aSessionP->getRootConfig()->fAgentConfigP ); if (!fAgentConfigP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TCustomImplDS finds no AgentConfig","odds7"))); #ifdef SCRIPT_SUPPORT fScriptContextP=NULL; // no context yet #endif // init these keys - these might or might not be used by descendants fFolderKey.erase(); // the folder key is undefined fTargetKey.erase(); // the target key is undefined // clear rest InternalResetDataStore(); } // TCustomImplDS::TCustomImplDS TCustomImplDS::~TCustomImplDS() { InternalResetDataStore(); } // TCustomImplDS::~TCustomImplDS /// @brief called while agent is still fully ok, so we must clean up such that later call of destructor does NOT access agent any more void TCustomImplDS::announceAgentDestruction(void) { // reset myself InternalResetDataStore(); // make sure we don't access the agent any more // Note: as CustomImplDS always needs to be derived, we don't call // engTerminateDatastore() here, but rely on descendants having done that already fAgentP = NULL; // call inherited inherited::announceAgentDestruction(); } // TCustomImplDS::announceAgentDestruction /// @brief called to reset datastore /// @note must be safe to be called multiple times and even after announceAgentDestruction() void TCustomImplDS::InternalResetDataStore(void) { #ifdef SCRIPT_SUPPORT fOptionFilterTested=false; // not tested yet fOptionFilterWorksOnDBLevel=true; // assume true #endif // delete sync set DeleteSyncSet(); // delete finalisation queue TMultiFieldItemList::iterator pos; for (pos=fFinalisationQueue.begin();pos!=fFinalisationQueue.end();pos++) delete (*pos); // delete the item fFinalisationQueue.clear(); #ifndef BINFILE_ALWAYS_ACTIVE fGetPhase=gph_done; // must be initialized first by startDataRead fGetPhasePrepared=false; // Clear map table and sync set lists fMapTable.clear(); #endif // BINFILE_ALWAYS_ACTIVE #ifdef BASED_ON_BINFILE_CLIENT fSyncSetLoaded=false; #endif // BASED_ON_BINFILE_CLIENT fNoSingleItemRead=false; // assume we can read single items if (fAgentP) { // forget script context #ifdef SCRIPT_SUPPORT if (fScriptContextP) { delete fScriptContextP; // forget context fScriptContextP=NULL; } #endif } #ifdef DBAPI_TUNNEL_SUPPORT // Tunnel DB access support fTunnelReadStarted = false; #endif } // TCustomImplDS::InternalResetDataStore // helper for getting a field pointer (local script var or item's field) TItemField *TCustomImplDS::getMappedBaseFieldOrVar(TMultiFieldItem &aItem, sInt16 aFid) { // get base field (array itself for array fields, not an element) #ifdef SCRIPT_SUPPORT if (fScriptContextP) return fScriptContextP->getFieldOrVar(&aItem,aFid); else return aItem.getField(aFid); #else return aItem.getField(aFid); #endif } // TCustomImplDS::getMappedBaseFieldOrVar // helper for getting a field pointer (local script var or item's field) TItemField *TCustomImplDS::getMappedFieldOrVar(TMultiFieldItem &aItem, sInt16 aFid, sInt16 aRepOffset, bool aExistingOnly) { TItemField *fieldP=NULL; // get field (or base field) #ifdef ARRAYFIELD_SUPPORT fieldP = getMappedBaseFieldOrVar(aItem,aFid); if (!fieldP) return NULL; // no field if (fieldP->isArray()) { // use aRepOffset as array index fieldP = fieldP->getArrayField(aRepOffset,aExistingOnly); } else #endif { // use aRepOffset as fid offset #ifdef SCRIPT_SUPPORT if (aFid<0) aRepOffset=0; // locals are never offset #endif fieldP = getMappedBaseFieldOrVar(aItem,aFid+aRepOffset); } return fieldP; } // TCustomImplDS::getMappedFieldOrVar // inform logic of coming state change localstatus TCustomImplDS::dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { if (aNewState>=dssta_dataaccessdone && aOldStatefScriptContextDatastore=this; while (fFinalisationQueue.size()>0) { // process finalisation script TMultiFieldItem *itemP = *(fFinalisationQueue.begin()); PDEBUGBLOCKFMTCOLL(("Finalizing","Finalizing item","LocalID=%s",itemP->getLocalID())); TScriptContext::execute( fScriptContextP,fConfigP->fFieldMappings.fFinalisationScript,fConfigP->getDSFuncTableP(),fAgentP, itemP,true // pass the item from the queue, is writable (mainly to allow fields to be passed as by-ref params) ); PDEBUGENDBLOCK("Finalizing"); // no longer needed delete itemP; // remove from queue fFinalisationQueue.erase(fFinalisationQueue.begin()); } PDEBUGENDBLOCK("Finalisation"); } // Finally, call the finish script of the field mappings fWriting=false; fInserting=false; fDeleting=false; fAgentP->fScriptContextDatastore=this; if (!TScriptContext::execute(fScriptContextP,fConfigP->fFieldMappings.fFinishScript,fConfigP->getDSFuncTableP(),fAgentP)) return 510; // script error -> DB error #endif } // let inherited do its stuff as well return inherited::dsBeforeStateChange(aOldState,aNewState); } // TCustomImplDS::dsBeforeStateChange // inform logic of happened state change localstatus TCustomImplDS::dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { if (aNewState==dssta_completed) { // completed now, call finish script #ifdef SCRIPT_SUPPORT // process sync end script fAgentP->fScriptContextDatastore=this; TScriptContext::execute(fScriptContextP,fConfigP->fSyncEndScript,fConfigP->getDSFuncTableP(),fAgentP); #endif // reset in case that we restart DeleteSyncSet(); #ifdef BASED_ON_BINFILE_CLIENT fSyncSetLoaded=false; #endif } // let inherited do its stuff as well return inherited::dsAfterStateChange(aOldState,aNewState); } // TCustomImplDS::dsAfterStateChange #ifndef BINFILE_ALWAYS_ACTIVE // mark all map entries as deleted bool TCustomImplDS::deleteAllMaps(void) { string sql,s; bool allok=true; TMapContainer::iterator pos; for (pos=fMapTable.begin();pos!=fMapTable.end();pos++) { (*pos).deleted=true; // deleted } PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("deleteAllMaps: all existing map entries (%ld) now marked deleted=1",(long)fMapTable.size())); return allok; } // TCustomImplDS::deleteAllMaps // find non-deleted map entry by local ID/maptype TMapContainer::iterator TCustomImplDS::findMapByLocalID(const char *aLocalID,TMapEntryType aEntryType, bool aDeletedAsWell) { TMapContainer::iterator pos; if (aLocalID) { for (pos=fMapTable.begin();pos!=fMapTable.end();pos++) { if ( (*pos).localid==aLocalID && (*pos).entrytype==aEntryType // && !(*pos).remoteid.empty() // Note: was ok in old versions, but now we can have map entries from resume with empty localID && (aDeletedAsWell || !(*pos).deleted) // if selected, don't show deleted entries ) { // found return pos; } } } return fMapTable.end(); } // TCustomImplDS::findMapByLocalID // find map entry by remote ID TMapContainer::iterator TCustomImplDS::findMapByRemoteID(const char *aRemoteID) { TMapContainer::iterator pos; if (aRemoteID) { for (pos=fMapTable.begin();pos!=fMapTable.end();pos++) { if ( (*pos).remoteid==aRemoteID && (*pos).entrytype == mapentry_normal && !(*pos).deleted // only plain normal non-deleted maps (no tempid or mapforresume) ) { // found return pos; } } } return fMapTable.end(); } // TCustomImplDS::findMapByRemoteID #ifdef SYSYNC_SERVER // - called when a item in the sync set changes its localID (due to local DB internals) // Datastore must make sure that possibly cached items get updated void TCustomImplDS::dsLocalIdHasChanged(const char *aOldID, const char *aNewID) { // find item in map TMapContainer::iterator pos=findMapByLocalID(aOldID,mapentry_normal); // only plain maps, no deleted ones if (pos!=fMapTable.end()) { // found, modify now // NOTE: we may not modify a localid, but must delete the entry and add a new one // - get remote ID string remoteid = (*pos).remoteid; uInt32 mapflags = (*pos).mapflags; // - mark old map entry as deleted (*pos).deleted=true; // - create new one modifyMap(mapentry_normal,aNewID,remoteid.c_str(),mapflags,false); } // let base class do what is needed to update the item itself inherited::dsLocalIdHasChanged(aOldID, aNewID); } // TCustomImplDS::dsLocalIdHasChanged #endif /// @brief modify internal map table /// @note /// - if aDelete is set, map entry will be deleted /// - aClearFlags (default=all) will be cleared when updating only /// - aMapFlags will be set when updating /// - if aRemoteID is NULL when updating an existing (not marked deleted) item, existing remoteID will NOT be modified /// - otherwise, map item will be added or updated. /// - routine makes sure that there is no more than one map for each localID/entrytype and /// each remoteID. /// - remoteID can also be a temporary localID used by server to send to clients with too small MaxGUIDSize (mapflag_tempidmap set) /// - routine will re-activate deleted entries to avoid unnecessary delete/insert void TCustomImplDS::modifyMap(TMapEntryType aEntryType, const char *aLocalID, const char *aRemoteID, uInt32 aMapFlags, bool aDelete, uInt32 aClearFlags) { TMapContainer::iterator pos=fMapTable.end(); DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "ModifyMap called: aEntryType=%s, aLocalID='%s, aRemoteid='%s', aMapflags=0x%lX, aDelete=%d", MapEntryTypeNames[aEntryType], aLocalID && *aLocalID ? aLocalID : "", aRemoteID ? (*aRemoteID ? aRemoteID : "") : "", (long)aMapFlags, (int)aDelete )); // - if there is a localID, search map entry (even if it is deleted) if (aLocalID && *aLocalID!=0) { for (pos=fMapTable.begin();pos!=fMapTable.end();pos++) { if ( // localID and entrytype matches (*pos).localid==aLocalID && (*pos).entrytype==aEntryType ) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "- found entry by entrytype/localID='%s' - remoteid='%s', mapflags=0x%lX, changed=%d, deleted=%d, added=%d, markforresume=%d, savedmark=%d", aLocalID, (*pos).remoteid.c_str(), (long)(*pos).mapflags, (int)(*pos).changed, (int)(*pos).deleted, (int)(*pos).added, (int)(*pos).markforresume, (int)(*pos).savedmark )); break; } } } else aLocalID=NULL; // decide what to do if (aDelete) { // delete if (!aLocalID) { if (!aRemoteID) return; // nop // we need to search by remoteID first pos=findMapByRemoteID(aRemoteID); #ifdef SYDEBUG if (pos!=fMapTable.end()) { DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "- found entry by remoteID='%s' - localid='%s', mapflags=0x%lX, changed=%d, deleted=%d, added=%d, markforresume=%d, savedmark=%d", aRemoteID, (*pos).localid.c_str(), (long)(*pos).mapflags, (int)(*pos).changed, (int)(*pos).deleted, (int)(*pos).added, (int)(*pos).markforresume, (int)(*pos).savedmark )); } #endif } if (pos==fMapTable.end()) return; // not found, nop // mark deleted if ((*pos).added) { // has been added in this session and not yet saved // so it does not yet exist in the DB at all // - simply forget entry fMapTable.erase(pos); // - done, ok return; } // entry has already been saved to DB before - only mark deleted (*pos).deleted=true; } // delete else { // update or add if (pos==fMapTable.end()) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "- found no matching entry for localID '%s' - creating new one, added=true", aLocalID )); // add, because there is not yet an item with that localid/entrytype TMapEntry entry; entry.entrytype=aEntryType; entry.added=true; entry.changed=true; entry.localid=aLocalID; AssignString(entry.remoteid,aRemoteID); // if NULL, remoteID will be empty entry.savedmark=false; entry.markforresume=false; entry.mapflags=0; // none set by default fMapTable.push_front(entry); pos=fMapTable.begin(); // first entry is new entry } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "- matching entry found - re-activating deleted and/or updating contents if needed" )); /* %%% NO!!!! plain wrong - because this causes added and later changed entries never be added to the DB! // %%% No room for paranoia here - makes things worse! // just to make sure - added should not be set here // (if we delete an added one before, it will be completely deleted from the list again) (*pos).added=false; */ // check if contents change, update if so if ( (((*pos).mapflags & ~mapflag_useforresume) != aMapFlags) || // flags different (useForResume not tested!) (aRemoteID && !((*pos).remoteid==aRemoteID)) // remoteID different ) { // new RemoteID (but not NULL = keep existing) or different mapflags were passed -> this is a real change if (aRemoteID) (*pos).remoteid=aRemoteID; (*pos).changed=true; // really changed compared to what is already in DB } } // now item exists, set details (*pos).deleted=false; // in case we had it deleted before, but not yet saved // clear those flags shown in aClearFlags (by default: all) and set those in aMapFlags (*pos).mapflags = ((*pos).mapflags & ~aClearFlags) | aMapFlags; // now remove all other items with same remoteID (except if we have no or empty remoteID) if (aEntryType==mapentry_normal && aRemoteID && *aRemoteID) { // %%% note: this is strictly necessary only for add, but cleans up for update TMapContainer::iterator pos2; for (pos2=fMapTable.begin();pos2!=fMapTable.end();pos2++) { if (pos2!=pos && (*pos2).remoteid==aRemoteID && (*pos2).entrytype==aEntryType) { // found another one with same remoteID/entrytype PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "- cleanup: removing same remoteID from other entry with localid='%s', mapflags=0x%lX, changed=%d, deleted=%d, added=%d, markforresume=%d, savedmark=%d", (*pos2).localid.c_str(), (long)(*pos2).mapflags, (int)(*pos2).changed, (int)(*pos2).deleted, (int)(*pos2).added, (int)(*pos2).markforresume, (int)(*pos2).savedmark )); // this remoteID is invalid for sure as we just have assigned it to another item - remove it (*pos2).remoteid.erase(); (*pos2).changed=true; // make sure it gets saved } } } } // modify or add } // TCustomImplDS::modifyMap #endif // not BINFILE_ALWAYS_ACTIVE // delete syncset // - if aContentsOnly, only item data will be deleted, but localID/containerid will // be retained void TCustomImplDS::DeleteSyncSet(bool aContentsOnly) { TSyncSetList::iterator pos; for (pos=fSyncSetList.begin();pos!=fSyncSetList.end();pos++) { // delete contained item, if any if ((*pos)->itemP) { delete ((*pos)->itemP); (*pos)->itemP=NULL; } if (!aContentsOnly) delete (*pos); // delete syncsetitem itself } if (!aContentsOnly) fSyncSetList.clear(); } // TCustomImplDS::DeleteSyncSet // - get container ID for specified localid bool TCustomImplDS::getContainerID(const char *aLocalID, string &aContainerID) { TSyncSetList::iterator pos = findInSyncSet(aLocalID); if (pos!=fSyncSetList.end()) { aContainerID = (*pos)->containerid; return true; // found } return false; // not found } // TCustomImplDS::getContainerID // find entry in sync set by localid TSyncSetList::iterator TCustomImplDS::findInSyncSet(const char *aLocalID) { TSyncSetList::iterator pos; for (pos=fSyncSetList.begin();pos!=fSyncSetList.end();pos++) { if ((*pos)->localid==aLocalID) { // found return pos; } } return fSyncSetList.end(); } // TCustomImplDS::findInSyncSet // called when message processing void TCustomImplDS::dsEndOfMessage(void) { // let ancestor do things inherited::dsEndOfMessage(); } // TCustomImplDS::dsEndOfMessage // Simple DB access interface methods // - returns true if database implementation can only update all fields of a record at once bool TCustomImplDS::dsReplaceWritesAllDBFields(void) { // return true if we should read record from DB before replacing. return fConfigP->fUpdateAllFields; } // TCustomImplDS::dsReplaceWritesAllDBFields #ifndef BINFILE_ALWAYS_ACTIVE // returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps, tempGUIDs) bool TCustomImplDS::dsResumeSupportedInDB(void) { #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) return inherited::dsResumeSupportedInDB(); else #endif return fConfigP && fConfigP->fResumeSupport; } // TCustomImplDS::dsResumeSupportedInDB // returns true if DB implementation supports resuming in midst of a chunked item (can save fPIxxx.. and related admin data) bool TCustomImplDS::dsResumeChunkedSupportedInDB(void) { #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) return inherited::dsResumeChunkedSupportedInDB(); else #endif return fConfigP && fConfigP->fResumeItemSupport; } // TCustomImplDS::dsResumeChunkedSupportedInDB #endif // BINFILE_ALWAYS_ACTIVE #ifdef OBJECT_FILTERING // - returns true if DB implementation can also apply special filters like CGI-options // /dr(x,y) etc. during fetching bool TCustomImplDS::dsOptionFilterFetchesFromDB(void) { #ifndef SYSYNC_TARGET_OPTIONS // there are no ranges to filter at all return true; // we can "filter" this (nothing) #else // no filter range set: yes, we can filter if (fDateRangeStart==0 && fDateRangeEnd==0) return true; // we can "filter" this // see if a script provides a solution #ifdef SCRIPT_SUPPORT if (!fOptionFilterTested) { fOptionFilterTested=true; // call script to take measures such that database implementation can // filter, returns true if filtering is entirely possible // (e.g. for ODBC, script should generate appropriate WHERE clause and set it with SETSQLFILTER()) fAgentP->fScriptContextDatastore=this; fOptionFilterWorksOnDBLevel = TScriptContext::executeTest( false, // assume we cannot filter if no script or script returns nothing fScriptContextP, // context fConfigP->fFieldMappings.fOptionFilterScript, // the script fConfigP->getDSFuncTableP(),fAgentP // funcdefs/context ); } if (fOptionFilterWorksOnDBLevel) return true; #endif // we can't filter, let anchestor try return inherited::dsOptionFilterFetchesFromDB(); #endif } // TCustomImplDS::dsOptionFilterFetchesFromDB #endif // OBJECT_FILTERING /// sync login (into this database) /// @note might be called several times (auth retries at beginning of session) /// @note must update the following saved AND current state variables /// - in TLocalEngineDS: fLastRemoteAnchor, fLastLocalAnchor, fResumeAlertCode, fFirstTimeSync /// - for client: fPendingAddMaps /// - for server: fTempGUIDMap /// - in TStdLogicDS: fPreviousSyncTime, fCurrentSyncTime /// - in TCustomImplDS: fCurrentSyncCmpRef, fCurrentSyncIdentifier, fPreviousToRemoteSyncCmpRef, /// fPreviousToRemoteSyncIdentifier, fPreviousSuspendCmpRef, fPreviousSuspendIdentifier /// - in derived classes: whatever else belongs to dsSavedAdmin and dsCurrentAdmin state localstatus TCustomImplDS::implMakeAdminReady( const char *aDeviceID, // remote device URI (device ID) const char *aDatabaseID, // database ID const char *aRemoteDBID // database ID of remote device ) { localstatus sta=LOCERR_OK; // assume ok string sql; // init state variables // dsSavedAdmin // - of TLocalEngineDS: fFirstTimeSync=true; // assume first time sync fLastRemoteAnchor.erase(); // remote anchor not known yet fResumeAlertCode=0; // no session to resume // - of TStdLogicDS: fPreviousSyncTime=0; // - of TCustomImplDS: fPreviousToRemoteSyncCmpRef=0; // no previous session fPreviousToRemoteSyncIdentifier.erase(); fPreviousSuspendCmpRef=0; // no previous suspend fPreviousSuspendIdentifier.erase(); // dsCurrentAdmin // - of TLocalEngineDS: // - of TStdLogicDS: fCurrentSyncTime=0; // - of TCustomImplDS: fCurrentSyncCmpRef=0; fCurrentSyncIdentifier.erase(); #ifndef BINFILE_ALWAYS_ACTIVE fMapTable.clear(); // map is empty to begin with #endif // now get admin data SYSYNC_TRY { #ifdef SCRIPT_SUPPORT // rebuild context for all scripts (if not already resolved) // Note: unlike while reading config, here all maps and scripts are already available // so this will build the entire context at once. if (!fScriptContextP) { // Rebuild order MUST be same as resolving order (see ResolveDSScripts()) // - scripts in possible derivates apiRebuildScriptContexts(); // - adminready and end scripts outside the fieldmappings TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fAdminReadyScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fSyncEndScript,fScriptContextP,fSessionP); // - scripts within fieldmappings TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fOptionFilterScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fInitScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fAfterReadScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fBeforeWriteScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fAfterWriteScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fFinishScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fConfigP->fFieldMappings.fFinalisationScript,fScriptContextP,fSessionP); #ifdef ARRAYDBTABLES_SUPPORT // - rebuild array script vars TFieldMapList::iterator pos; for (pos=fConfigP->fFieldMappings.fFieldMapList.begin(); pos!=fConfigP->fFieldMappings.fFieldMapList.end(); pos++) { if ((*pos)->isArray()) { TFieldMapArrayItem *fmaiP = DYN_CAST(*pos); if (fmaiP) { // rebuild // %%% note, this is not capable of nested arrays yet TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fmaiP->fInitScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fmaiP->fAfterReadScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fmaiP->fBeforeWriteScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fmaiP->fAfterWriteScript,fScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fmaiP->fFinishScript,fScriptContextP,fSessionP); } } } #endif // now instantiate variables TScriptContext::buildVars(fScriptContextP); } #endif #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) { // binfile's implMakeAdminReady will do the job sta = inherited::implMakeAdminReady(aDeviceID, aDatabaseID, aRemoteDBID); } else #endif // BASED_ON_BINFILE_CLIENT { #ifndef BINFILE_ALWAYS_ACTIVE // Load admin data from TXXXApiDS (ODBC, text or derived class' special implementation) sta = apiLoadAdminData( aDeviceID, // remote device URI (device ID) aDatabaseID, // database ID aRemoteDBID // database ID of remote device ); #endif } // set error if one occurred during load if (sta==LOCERR_OK) { // extra check: if we get empty remote anchor, this is a first-time sync even if DB claims the opposite if (fLastRemoteAnchor.empty()) fFirstTimeSync=true; // create identifier if we don't have it stored in the DB if (!fConfigP->fStoreSyncIdentifiers) { // we generate the identifiers as ISO8601 UTC string from the timestamp TimestampToISO8601Str(fPreviousToRemoteSyncIdentifier,fPreviousToRemoteSyncCmpRef,TCTX_UTC,false,false); TimestampToISO8601Str(fPreviousSuspendIdentifier,fPreviousSuspendCmpRef,TCTX_UTC,false,false); } // determine time of this sync fCurrentSyncTime= fAgentP->getDatabaseNowAs(TCTX_UTC); // by default, these two are equal // (but if DB cannot write items with timestamp exactly==fCurrentSyncTime, fCurrentSyncCmpRef might be a later time, like end-of-session) fCurrentSyncCmpRef = fCurrentSyncTime; // admin ready now, call script that may access DB to fetch some extra options #ifdef SCRIPT_SUPPORT fAgentP->fScriptContextDatastore=this; if (!TScriptContext::executeTest(true,fScriptContextP,fConfigP->fAdminReadyScript,fConfigP->getDSFuncTableP(),fAgentP)) sta=510; // script returns false or fails -> DB error #endif if (sta==LOCERR_OK) { // successful so far, now allow for early startDataRead to occur if configured on api level sta = apiEarlyDataAccessStart(); if (sta==508) { // special case: the database requests a slow sync for internal reasons (like change tracking disabled) // - force slow sync by removing last anchor fLastRemoteAnchor.erase(); sta = LOCERR_OK; } } } // if apiLoadAdminData successful } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("implMakeAdminReady exception: %s",e.what())); sta=510; SYSYNC_ENDCATCH // done return sta; } // TCustomImplDS::implMakeAdminReady // start data read localstatus TCustomImplDS::implStartDataRead() { localstatus sta = LOCERR_OK; // get field map list TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; // check if we have fileds that must be finalized or array fields at all (to avoid unneeded operations if not) TFieldMapList::iterator pos; #ifdef ARRAYDBTABLES_SUPPORT fHasArrayFields=false; // until we KNOW otherwise #endif fNeedFinalisation=false; // until we KNOW otherwise for (pos=fml.begin(); pos!=fml.end(); pos++) { // - check finalisation if ((*pos)->needs_finalisation) fNeedFinalisation=true; // - check array mappings #ifdef ARRAYDBTABLES_SUPPORT if ((*pos)->isArray()) fHasArrayFields=true; #endif } #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) { // further preparation is in binfileds sta = inherited::implStartDataRead(); if (sta==LOCERR_OK) { // now make sure the syncset is loaded sta = makeSyncSetLoaded( fSlowSync // all items with data needed for slow sync #ifdef OBJECT_FILTERING || fFilteringNeededForAll // all item data needed for dynamic filtering #endif || CRC_CHANGE_DETECTION // all item data needed when binfile must detect changes using CRC ); } } else #endif // BASED_ON_BINFILE_CLIENT { #ifndef BINFILE_ALWAYS_ACTIVE // kill all map entries if slow sync (but not if resuming!!) if (fSlowSync && !isResuming()) { // mark all map entries as deleted deleteAllMaps(); } // - count entire read as database read TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); PDEBUGBLOCKFMTCOLL(("ReadSyncSet","Reading Sync Set from Database","datastore=%s",getName())); SYSYNC_TRY { // read sync set (maybe from derived non-odbc data source) // - in slow sync, we need all items (so allow ReadSyncSet to read them all here) // - if all items must be filtered, we also need all data // Note: ReadSyncSet will decide if it actually needs to load the syncset or not (depends on refresh, slowsync and needs of apiZapSyncSet()) sta = apiReadSyncSet( fSlowSync #ifdef OBJECT_FILTERING || fFilteringNeededForAll #endif ); // determine how GetItem will start fGetPhase = fSlowSync ? gph_added_changed : gph_deleted; // just report added (not-in-map, map is cleared already) for slowsync // phase not yet prepared fGetPhasePrepared = false; // end of DB read PDEBUGENDBLOCK("ReadSyncSet"); TP_START(fSessionP->fTPInfo,li); } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("StartDataRead exception: %s",e.what())); sta=510; // end of DB read PDEBUGENDBLOCK("ReadSyncSet"); TP_START(fSessionP->fTPInfo,li); SYSYNC_ENDCATCH #endif // BINFILE_ALWAYS_ACTIVE } return sta; } // TCustomImplDS::implStartDataRead // Queue the data needed for finalisation (usually - relational link updates) // as a item copy with only finalisation-required fields void TCustomImplDS::queueForFinalisation(TMultiFieldItem *aItemP) { sInt16 fid; // create a same-typed copy of the original item (initially empty) TMultiFieldItem *itemP = new TMultiFieldItem(aItemP->getItemType(),aItemP->getTargetItemType()); // copy localID and syncop itemP->setLocalID(aItemP->getLocalID()); itemP->setSyncOp(aItemP->getSyncOp()); // copy fields that are marked for finalisation TFieldMapList &fml = fConfigP->fFieldMappings.fFieldMapList; TFieldMapList::iterator pos; for (pos=fml.begin(); pos!=fml.end(); pos++) { TFieldMapItem *fmiP = *pos; #ifdef ARRAYDBTABLES_SUPPORT if (fmiP->isArray()) { TFieldMapList::iterator pos2; TFieldMapList &afml = static_cast(fmiP)->fArrayFieldMapList; for (pos2=afml.begin(); pos2!=afml.end(); pos2++) { TFieldMapItem *fmi2P = *pos2; fid = fmi2P->fid; if (fmi2P->needs_finalisation && fid>=0) { // this mapping indicates need for finalisation and references a fieldlist field, copy referenced field *(itemP->getField(fid))=*(aItemP->getField(fid)); } } } else #endif // ARRAYDBTABLES_SUPPORT { fid = fmiP->fid; if (fmiP->needs_finalisation && fid>=0) { // this mapping indicates need for finalisation and references a fieldlist field, copy referenced field *(itemP->getField(fid))=*(aItemP->getField(fid)); } } } // put the finalisation item into the queue fFinalisationQueue.push_back(itemP); } // TCustomImplDS::queueForFinalisation #ifndef BINFILE_ALWAYS_ACTIVE /// @brief called to have all non-yet-generated sync commands as "to-be-resumed" void TCustomImplDS::implMarkOnlyUngeneratedForResume(void) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { inherited::implMarkOnlyUngeneratedForResume(); return; } #endif // BASED_ON_BINFILE_CLIENT // Note: all "markforresume" flags (but NOT the actual mapflag_useforresume!) are cleared // after loading or saving admin, so we can start adding resume marks BEFORE // implMarkOnlyUngeneratedForResume is called (needed to re-add items that got // an unsuccessful status from remote that suggests re-trying in next resume, such as 514) // add all not-yet-got items TMapContainer::iterator pos; TGetPhases getPhase = fGetPhase; // start at current get phase bool getPrepared = fGetPhasePrepared; // now flag all deletes that need resuming if (getPhase==gph_deleted) { // now mark pending deletes; if we are still in "deleted" phase, add these first for (pos = !getPrepared ? fMapTable.begin() : fDeleteMapPos; pos!=fMapTable.end(); ++pos) { // check only undeleted map entries // Note: non-normal maps are always in deleted state in fMapTable, so these will be skipped as well if ((*pos).deleted) continue; // check if deleted if (findInSyncSet((*pos).localid.c_str())==fSyncSetList.end()) { // mark this as pending for resume (*pos).markforresume=true; } } getPhase=gph_added_changed; getPrepared=false; } // now flag all changes and adds that need resuming // if we are already gph_done, no items need to be flagged here if (getPhase==gph_added_changed) { // if we are in the add/change phase, add not-yet handled adds/changes TSyncSetList::iterator syncsetpos; if (!getPrepared) syncsetpos=fSyncSetList.begin(); else syncsetpos=fSyncSetPos; // now mark pending changes and adds while (syncsetpos!=fSyncSetList.end()) { // check if we need to mark it bool needMark=false; pos=findMapByLocalID((*syncsetpos)->localid.c_str(),mapentry_normal,true); // find deleted ones as well if (fSlowSync) { if (IS_CLIENT) { // for client, there are no reference-only: mark all leftovers in a slow sync needMark=true; } else { // for server, make sure not to mark reference-only. if (!isResuming() || pos==fMapTable.end()) { // if not resuming, or we have no map for this one at all - we'll need it again for resume needMark=true; } else { // for slowsync resume which have already a map: // - items that are not marked for resume, but already have a remoteID mapped // are reference-only and must NOT be marked if (((*pos).mapflags & mapflag_useforresume) || (*pos).remoteid.empty()) needMark=true; } } } else if (!isRefreshOnly() || (isRefreshOnly() && isCacheData())) { // not slow sync, and not refresh from remote only - mark those that are actually are involved if (pos!=fMapTable.end()) { // known item, needs a mark only if record is modified (and updates reported at all) needMark=((*syncsetpos)->isModified) && fReportUpdates; } else { // adds need marking, anyway needMark=true; } } // now apply mark if needed if (needMark) { if (pos==fMapTable.end()) { // no map entry for this item yet (this means that this is a new detected add // - add pendingAddConfirm item now, and mark it for resume TMapEntry entry; entry.entrytype=mapentry_normal; entry.localid=(*syncsetpos)->localid.c_str(); entry.remoteid.erase(); entry.mapflags=mapflag_pendingAddConfirm; entry.added=true; entry.changed=true; entry.deleted=false; entry.markforresume=true; entry.savedmark=false; fMapTable.push_back(entry); } else { // add flag to existing map item if ((*pos).deleted) { // undelete (re-use existing, but currently invalid entry) (*pos).remoteid.erase(); (*pos).changed=true; (*pos).deleted=false; (*pos).mapflags=0; } (*pos).markforresume=true; } } // next ++syncsetpos; } } } // TCustomImplDS::implMarkOnlyUngeneratedForResume // called to confirm a sync operation's completion (status from remote received) // @note aSyncOp passed not necessarily reflects what was sent to remote, but what actually happened void TCustomImplDS::dsConfirmItemOp(TSyncOperation aSyncOp, cAppCharP aLocalID, cAppCharP aRemoteID, bool aSuccess, localstatus aErrorStatus) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { inherited::dsConfirmItemOp(aSyncOp, aLocalID, aRemoteID, aSuccess, aErrorStatus); return; } #endif // BASED_ON_BINFILE_CLIENT if (aSyncOp==sop_delete || aSyncOp==sop_archive_delete) { // a confirmed delete causes the entire map entry to be removed (item no longer exists (or is visible) locally or remotely) if (aSuccess) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("successful status for delete received -> delete map entry now")); modifyMap(mapentry_normal,aLocalID,aRemoteID,0,true); } } else { TMapContainer::iterator pos; if (IS_CLIENT) { // for client, always find by localid pos=findMapByLocalID(aLocalID,mapentry_normal); } else { // for server, only add can be found by localid if (aSyncOp==sop_add) pos=findMapByLocalID(aLocalID,mapentry_normal); else pos=findMapByRemoteID(aRemoteID); } if (pos!=fMapTable.end()) { // Anyway, clear the status pending flag // Note: we do not set the "changed" bit here because we don't really need to make this persistent between sessions (*pos).mapflags &= ~mapflag_pendingStatus; if (IS_CLIENT) { if (aSuccess) { // Note: we do not check for sop here - any successfully statused sop will clear the pending add status // (e.g. in slow sync, items reported as add to engine are actually sent as replaces, but still // seeing a ok status means that they are not any longer pending as adds) // Note: the same functionality formerly was in TStdLogicDS::startDataWrite() - making sure that a // add sent to the server is not repeated. As every item reported by implGetItem now already // has a map entry (adds get one with mapflag_pendingAddConfirm set), we just need to clear // the flag here now that we know the add has reached the server. // Note: For the server, we can clear the mapflag_pendingAddConfirm not before we have received a item for it! PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("successful status for non-delete received -> clear mapflag_pendingAddConfirm")); (*pos).mapflags &= ~mapflag_pendingAddConfirm; (*pos).changed = true; // this MUST be made persistent! } } // if client } else { PDEBUGPRINTFX(DBG_ERROR+DBG_EXOTIC,("dsConfirmItemOp - INTERNAL ERROR: no map entry exists for item")); } } // let inherited know as well inherited::dsConfirmItemOp(aSyncOp, aLocalID, aRemoteID, aSuccess, aErrorStatus); } // TCustomImplDS::confirmItemOp // called to mark an already sent item as "to-be-resent", e.g. due to temporary // error status conditions, by localID or remoteID (latter only in server case). void TCustomImplDS::implMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { inherited::implMarkItemForResend(aLocalID, aRemoteID); return; } #endif // BASED_ON_BINFILE_CLIENT // Note: this is only relevant for replaces and some adds: // - some adds will not have a map entry yet // - deletes will not have their map entry deleted until they are confirmed // But replaces would not get re-sent as they would not get detected // modified any more once a session has completed. TMapContainer::iterator pos; if (aLocalID && *aLocalID) pos=findMapByLocalID(aLocalID,mapentry_normal,false); // only undeleted ones else if (aRemoteID && *aRemoteID) pos=findMapByRemoteID(aRemoteID); else return; // neither local nor remote ID specified -> nop if (pos==fMapTable.end()) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("implMarkItemForResend: no map entry found -> item does not exist or is an add which will be sent anyway")); return; // no item can be searched or created } // set resend flag now (if not already set) if (!((*pos).mapflags & mapflag_resend)) { (*pos).mapflags |= mapflag_resend; (*pos).changed=true; } // and make sure it gets resent in case of a suspend as well (mark for resume) // This is needed for suspends where unprocessed items gets statused with 514 BEFORE // the server knows that this is going to be a suspend. (*pos).markforresume=true; PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC+DBG_HOT,( "localID='%s' marked for resending by setting mapflag_resend (AND mark for eventual resume!), flags now=0x%lX", (*pos).localid.c_str(), (long)(*pos).mapflags )); } // TCustomImplDS::implMarkItemForResend // called to mark an already generated (but unsent or sent but not yet statused) item // as "to-be-resumed", by localID or remoteID (latter only in server case). void TCustomImplDS::implMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { inherited::implMarkItemForResume(aLocalID, aRemoteID, aUnSent); return; } #endif // BASED_ON_BINFILE_CLIENT TMapContainer::iterator pos; if (aLocalID && *aLocalID) pos=findMapByLocalID(aLocalID,mapentry_normal,true); // also find deleted ones else if (aRemoteID && *aRemoteID) pos=findMapByRemoteID(aRemoteID); else return; // no item can be searched or created if (pos!=fMapTable.end()) { // we have an entry for this item, mark it for resume if ((*pos).deleted) { // undelete (re-use existing, but currently invalid entry) (*pos).remoteid.erase(); (*pos).changed=true; (*pos).deleted=false; (*pos).mapflags=0; } // for unsent ones, the status is not pending any more else if (aUnSent && ((*pos).mapflags & (mapflag_pendingStatus+mapflag_pendingDeleteStatus))) { // reset the status pending flags (*pos).changed=true; (*pos).mapflags &= ~(mapflag_pendingStatus+mapflag_pendingDeleteStatus); } // For Server: those that have mapflag_pendingAddConfirm (adds) may be marked for // resume ONLY if we can rely on early maps or if they are completely unsent. // Sent adds will just keep their mapflag_pendingAddConfirm until they receive their map // For Client: all items will be marked for resume if ( IS_SERVER && ((*pos).mapflags & mapflag_pendingAddConfirm) && // is an add... !aUnSent && // ...and already sent out !fSessionP->getSessionConfig()->fRelyOnEarlyMaps // and we can't rely on the client sending the maps before ) { // for server: already sent adds may not be repeated unless we can rely on early maps PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "implMarkItemForResume: localID='%s', has mapFlags=0x%lX and was probably executed at remote -> NOT marked for resume", (*pos).localid.c_str(), (long)(*pos).mapflags )); (*pos).markforresume=false; } else { // for client: everything may be repeated and therefore marked for resume // for server: unsent adds will also be marked, or all if we can rely on early maps (which is the default) PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "implMarkItemForResume: localID='%s', has mapFlags=0x%lX and was %s executed at remote%s -> mark for resume", (*pos).localid.c_str(), (long)(*pos).mapflags, aUnSent ? "NOT" : "probably", fSessionP->getSessionConfig()->fRelyOnEarlyMaps ? " (relying on early maps)" : "" )); (*pos).markforresume=true; } } else if (aLocalID && *aLocalID) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "implMarkItemForResume: localID='%s', was not yet in map and was %sexecuted at remote -> created map and marked for resume", aLocalID, aUnSent ? "NOT " : "probably" )); // we have no entry for this item, make one (only if this is not a remoteID-only item, // but this should not occur here anyway - items without localID can only be replaces // from server to client, in which case we have a map entry anyway) TMapEntry entry; entry.entrytype=mapentry_normal; entry.localid=aLocalID; entry.remoteid.erase(); entry.mapflags=0; entry.added=true; entry.changed=true; entry.deleted=false; entry.markforresume=true; entry.savedmark=false; fMapTable.push_back(entry); } } // TCustomImplDS::implMarkItemForResume // Get next item from database localstatus TCustomImplDS::implGetItem( bool &aEof, bool &aChanged, // if set on entry, only changed ones will be reported, otherwise all will be returned and aChanged contains flag if entry has changed or not TSyncItem* &aSyncItemP ) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { return inherited::implGetItem(aEof, aChanged, aSyncItemP); } #endif // BASED_ON_BINFILE_CLIENT localstatus sta = LOCERR_OK; bool reportChangedOnly = aChanged; // save initial state, as we might repeat... bool rep=true; // to start-up lower part TSyncOperation sop=sop_none; aEof=true; // assume we have nothing to report string remid; TMultiFieldItem *myitemP=NULL; // short-cut if refreshing only and not slowsync resuming (then we need the items for comparison) if (isRefreshOnly() && !isCacheData() && !(isResuming() && isSlowSync())) return sta; // aEof is set, return nothing TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); SYSYNC_TRY { // check mode if (fGetPhase==gph_deleted) { // report deleted items, that is those in the map that are not // any more in the sync set of local IDs // Note: we need no extra database access any more for this if (!fGetPhasePrepared) { // start at beginning of map table fDeleteMapPos=fMapTable.begin(); fGetPhasePrepared=true; } do { rep=false; // report all those map entries that have no data entry (any more) // as deleted records // - check if there is more data in map table to process if (fDeleteMapPos==fMapTable.end()) { fGetPhase=gph_added_changed; // end of this phase, now report additions and modifications rep=true; // continue in second part (get updated records) fGetPhasePrepared=false; // next phase must be prepared break; } else { // search if there is a local ID still existing for that ID TMapEntry entry = (*fDeleteMapPos); // check only undeleted map entries if (entry.deleted || entry.entrytype!=mapentry_normal) { // deleted or non-normal map entry - simply skip rep=true; } else if (isResuming() && !(entry.mapflags & mapflag_useforresume)) { // this delete has already been reported deleted in previous suspended session // (or it was deleted from the datastore WHILE or after start of a suspended session, // in this case the item will be reported deleted in the NEXT complete sync session) PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Resuming and found item not marked for resume -> ignore for delete checking")); rep=true; } else if (findInSyncSet(entry.localid.c_str())==fSyncSetList.end()) { // this item has been deleted (and not yet been reported if this is a resume) -> report it PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Normal sync and found item in map which is not in syncset -> delete and mark with mapflag_pendingDeleteStatus")); // - create new empty TMultiFieldItem myitemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); // - add IDs myitemP->setRemoteID(entry.remoteid.c_str()); myitemP->setLocalID(entry.localid.c_str()); // - set operation myitemP->setSyncOp(sop_delete); // - set item aSyncItemP = myitemP; aEof=false; // report something // mark entry as waiting for delete status // NOTES: - we cannot delete the map entry until we get a confirmItemOp() for it // - the pendingStatus flag does not need to be persistent between sessions, so we don't set the changed flag here! // - the flag is important in case a server-delete vs client-replace conflict occurs which the client wins. In that // case implProcessItem needs to be able to tell that still having a map entry does NOT mean we do have // the record still in the DB. entry.mapflags |= mapflag_pendingDeleteStatus; (*fDeleteMapPos)=entry; // save updated entry in list // found one to report } else { rep=true; // must repeat again } } // go to next fDeleteMapPos++; } while(rep); } // report deleted phase if (rep && fGetPhase==gph_added_changed) { // report changed and added items. Those that are in the sync set but // not yet in the map are added items, those that are already in the // map are changed items if the mod date is newer than last sync // and deleted if they don't pass extra filters if (!fGetPhasePrepared) { // start at beginning of map table fSyncSetPos=fSyncSetList.begin(); fGetPhasePrepared=true; } do { rep=false; remid.erase(); // - check if there is more data in the syncset to process if (fSyncSetPos==fSyncSetList.end()) { fGetPhase=gph_done; // end of this phase, now report additions and modifications rep=true; // continue in next phase (if any) fGetPhasePrepared=false; // next phase must be prepared break; } else { // get syncset entry TSyncSetItem *syncsetitemP = (*fSyncSetPos); sop=sop_none; TMapContainer::iterator pos; // search if there is a map entry for this item already pos=findMapByLocalID(syncsetitemP->localid.c_str(),mapentry_normal); // do not find deleted ones, only valid entries! #ifdef SYDEBUG if (pos!=fMapTable.end()) { // Debug PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "Item localID='%s' already has map entry: remoteid='%s', mapflags=0x%lX, changed=%d, deleted=%d, added=%d, markforresume=%d, savedmark=%d", syncsetitemP->localid.c_str(), (*pos).remoteid.c_str(), (long)(*pos).mapflags, (int)(*pos).changed, (int)(*pos).deleted, (int)(*pos).added, (int)(*pos).markforresume, (int)(*pos).savedmark )); } #endif // now find what syncop results if (fSlowSync && !isResuming()) { // all items in local sync set are to be reported PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Slow sync and not resuming -> all items are first reported sop_wants_replace (will become add later)")); sop=sop_wants_replace; aChanged=true; // clear the resend flags if any if (pos!=fMapTable.end()) { if ((*pos).mapflags & mapflag_resend) { (*pos).mapflags &= ~mapflag_resend; (*pos).changed = true; } } } else { if (pos!=fMapTable.end()) { // for slowsync resume - items that are not marked for resume, but already have a remoteID mapped // must be presented for re-match with sop_reference_only if (IS_SERVER && fSlowSync && isResuming() && !((*pos).mapflags & mapflag_useforresume) && !(*pos).remoteid.empty()) { // this item apparently was already slow-sync-matched before the suspend - still show it for reference to avoid re-adding it sop=sop_reference_only; } else if (!isRefreshOnly() || (isRefreshOnly() && isCacheData())) { // item is already in map: check if this is an already detected, but unfinished add if (!((*pos).mapflags & mapflag_pendingAddConfirm)) { // is a replace (not an add): changed if mod date newer or resend flagged (AND updates enabled) // Note: For reporting modifications, the date of last sending-data-to-remote date is relevant bool hasChanged= (((*fSyncSetPos)->isModified) || ((*pos).mapflags & mapflag_resend)) && fReportUpdates; // reset resend flag here if it acutually causes a resend here (otherwise, keep it for later) if (hasChanged && (*pos).mapflags & mapflag_resend) { PDEBUGPRINTFX(DBG_ADMIN+DBG_HOT,("Item '%s' treated as changed because resend-flag was set",syncsetitemP->localid.c_str())); (*pos).mapflags &= ~mapflag_resend; (*pos).changed = true; } if (isResuming()) { // Basically, on resume just report those that have the mapflag_useforresume flag set. // However, there is one difficult problem here: // - Those that were successfully modified in the suspended part of a session, but get modified // AGAIN between suspend and this resume will NOT be detected as changes any more. Therefore, for // items we see here that don't have the mapflag_useforresume, we need to check additionally if // they possibly have changed AFTER THE LAST SUSPEND SAVE if ((*pos).mapflags & mapflag_useforresume) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Resuming and found marked-for-resume -> send replace")); sop=sop_wants_replace; hasChanged=true; // mark this as change (again, because marked for resume) } else if (!reportChangedOnly || hasChanged) { // this one does not have the flag set, but it would be reported as a change if this was not a resume // so this could be a change happened between suspend and resume if (syncsetitemP->isModifiedAfterSuspend) { // yes, this one was modified AFTER the suspended session, so we'll send it, too PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Resuming and found NOT marked-for-resume, but changed after last suspend -> send replace again")); sop=sop_wants_replace; hasChanged=true; // mark this as change (since last suspend, that is) } } } else if (!reportChangedOnly || hasChanged) { // report only if aChanged was false on entry (=reportChangedOnly is false) or if modified anyway PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Normal sync, item changed -> send replace")); sop=sop_wants_replace; } remid=(*pos).remoteid; aChanged=hasChanged; // return changed status anyway } // if not add else { // already detected, but unfinished add // For server: Might be resent ONLY if resuming and marked for resume (otherwise, we MUST wait for map or we'll get duplicates) // For client: resend always except if resuming and not marked for it if (isResuming()) { if ((*pos).mapflags & mapflag_useforresume) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Resuming and found marked-for-resume with mapflag_pendingAddConfirm -> unsent add, send it again")); sop=sop_wants_add; } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Resuming and NOT marked-for-resume with mapflag_pendingAddConfirm -> ignore")); } } else { if (IS_CLIENT) { // for client - repeating an add does not harm (but helps if it did not reach the server in the previous attempt PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Non-resume sync found item with mapflag_pendingAddConfirm -> send it again")); sop=sop_wants_add; } // client else { // for server - repeating an add potentially DOES harm (duplicate if client already got the add, but didn't send a map yet) // but it's ok if it's flagged as an explicit resend (this happens only if we have got error status from remote) if ((*pos).mapflags & mapflag_resend) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Item with mapflag_pendingAddConfirm (add) also has mapflag_resend -> we can safely resend")); sop=sop_wants_add; // - reset resend flag here (*pos).mapflags &= ~mapflag_resend; (*pos).changed = true; } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Non-resume sync found item with mapflag_pendingAddConfirm (add) -> ignore until map is found")); } } // server } } } // if not refreshonly } // a map entry already exists else { // item is not yet in map: this is a new one. Report it if we are not resuming a previous session // (in this case, items added after start of the original session will be detected at NEXT full // session, so just leave it out for now) // Note: this is first-time add detection. If we get this reported as sop_wants_add below, a map with // mapflag_pendingAddConfirm will be created for it. if (isRefreshOnly() && isCacheData()) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("New item (no map yet) detected during Refresh only -> ignore for now, will be deleted later unless matched against peer item")); sop=sop_none; } else if (isRefreshOnly()) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("New item (no map yet) detected during Refresh only -> ignore for now, will be added in next two-way sync")); sop=sop_none; } else if (isResuming()) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Resuming and found new item which was not present in original session -> ignore for now, will be added in next regular sync")); sop=sop_none; } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Normal sync, item not yet in map -> add to remote")); sop=sop_wants_add; } } } if (sop!=sop_none) { // we need the item from the database SYSYNC_TRY { bool fetched=false; // - check if we've already read it (at apiReadSyncSet()) if (syncsetitemP->itemP) { // yes, take it out of the syncset if (fNoSingleItemRead) { // we may need it later, so we can only pass a copy to caller myitemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); if (!myitemP) SYSYNC_THROW(TSyncException("newItemForRemote could not create new Item")); // copy item (id, op, contents) (*myitemP) = (*(syncsetitemP->itemP)); } else { // we don't need it later, pass original to caller and remove link in syncsetitem myitemP = syncsetitemP->itemP; syncsetitemP->itemP = NULL; // syncsetitem does not own it any longer } fetched=true; // we have the item // Make sure item is fully equipped // - assign local id, as it is required by DoDataSubstitutions myitemP->setLocalID(syncsetitemP->localid.c_str()); // - assign remote id if we know one myitemP->setRemoteID(remid.c_str()); // - set operation myitemP->setSyncOp(sop); } else { // We need to read the item here // - create new empty TMultiFieldItem myitemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); if (!myitemP) SYSYNC_THROW(TSyncException("newItemForRemote could not create new Item")); // - assign local id, as it is required by DoDataSubstitutions myitemP->setLocalID(syncsetitemP->localid.c_str()); // - assign remote id if we know one myitemP->setRemoteID(remid.c_str()); // - set operation myitemP->setSyncOp(sop); // Now fetch item (read phase) sta=apiFetchItem(*myitemP,true,syncsetitemP); if (sta==LOCERR_OK) { // successfully fetched fetched=true; } else if (sta==404) { // this record has been deleted since we have read the // localid list. If this is was an add, we can simply // ignore it // - decide what this means now if (sop==sop_reference_only || sop==sop_wants_add) { // was deleted before we could fetch it for adding (or reference), just ignore PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,("to-be-added record localID=%s was deleted during this sync session -> ignore",myitemP->getLocalID())); rep=true; delete myitemP; // could still be that we have a mapflag_useforresume map entry, make sure we get rid of it if (pos!=fMapTable.end()) { // mark deleted (*pos).deleted=true; } goto nextchanged; } else { // was changed, but now doesn't exist any more -> treat as delete // - adjust operation PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,("to-be-changed record localID=%s was deleted during this sync session -> delete",myitemP->getLocalID())); myitemP->setSyncOp(sop_delete); myitemP->cleardata(); // make sure it is empty // - set item to return to caller aSyncItemP = myitemP; aEof=false; // report something if (!fSlowSync) { // Note: we can safely assume that the map entry exists - otherwise sop would be sop_wants_add // map entry must be marked to show that this now is a pending delete (*pos).changed=true; (*pos).mapflags &= ~(mapflag_pendingStatus); (*pos).mapflags |= mapflag_pendingDeleteStatus; } fetched=false; // prevent map manipulations below } } else { // other error SYSYNC_THROW(TSyncException("Error fetching data from DB",sta)); } } // else: fetch from DB needed if (fetched) { // set item to return to caller aSyncItemP = myitemP; aEof=false; // report something // info PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,("Fetched record data from DB with localID=%s",myitemP->getLocalID())); } } SYSYNC_CATCH(...) if (myitemP) delete myitemP; SYSYNC_RETHROW; SYSYNC_ENDCATCH } // item to report else { // item read must not be reported, try to get next rep=true; } } // not end of syncset nextchanged: // go to next fSyncSetPos++; } while(rep); } // report added and changed phase if (rep) { // end of items aEof=true; // syncset can be deleted only if we can retrieve individual items later from DB // if not, we must keep the syncset in memory if (!fNoSingleItemRead) { // we don't need the SyncSet list any more // (and especially the items that did NOT get reported to the caller of GetItem // can be deleted now to free memory. Reported items are now owned by the caller) DeleteSyncSet(fMultiFolderDB); } } // done TP_START(fSessionP->fTPInfo,li); // show item fetched #ifdef SYDEBUG if (PDEBUGTEST(DBG_DATA+DBG_SCRIPTS) && aSyncItemP) aSyncItemP->debugShowItem(DBG_DATA); // show item fetched #endif } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("GetItem exception: %s",e.what())); TP_START(fSessionP->fTPInfo,li); sta=510; SYSYNC_ENDCATCH // done return sta; } // TCustomImplDS::implGetItem #endif // not BINFILE_ALWAYS_ACTIVE // end of read localstatus TCustomImplDS::implEndDataRead(void) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { return inherited::implEndDataRead(); } #endif // BASED_ON_BINFILE_CLIENT // let API handle it directly return apiEndDataRead(); } // TCustomImplDS::implEndDataRead // start of write localstatus TCustomImplDS::implStartDataWrite() { localstatus sta = LOCERR_OK; #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { sta = inherited::implStartDataWrite(); } else #endif // BASED_ON_BINFILE_CLIENT { #ifndef BINFILE_ALWAYS_ACTIVE SYSYNC_TRY { // let actual data implementation prepare sta = apiStartDataWrite(); if (sta==LOCERR_OK) { // Notes: // - transaction starts implicitly when first INSERT / UPDATE / DELETE occurs // - resumed slow refreshes must NOT zap the sync set again! // - prevent zapping when datastore is in readonly mode! if (fRefreshOnly && !fCacheData && fSlowSync && !isResuming() && !fReadOnly) { // - make sure we have at least one pev_deleting event, in case app tracks it to see if session caused changes to DB DB_PROGRESS_EVENT(this,pev_deleting,0,0,0); // now, we need to zap the DB first PDEBUGBLOCKFMTCOLL(("ZapSyncSet","Zapping sync set in database","datastore=%s",getName())); SYSYNC_TRY { sta=apiZapSyncSet(); PDEBUGENDBLOCK("ZapSyncSet"); } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("ZapSyncSet exception: %s",e.what())); sta=510; // end of DB read PDEBUGENDBLOCK("ZapSyncSet"); SYSYNC_ENDCATCH if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("implStartDataWrite: cannot zap data for refresh, status=%hd",sta)); } // ok, now that the old data is zapped, we MUST forget the former sync set, it is now for sure invalid DeleteSyncSet(false); } } } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("implStartDataWrite exception: %s",e.what())); sta=510; SYSYNC_ENDCATCH #endif } // done return sta; } // TCustomImplDS::implStartDataWrite #ifndef BINFILE_ALWAYS_ACTIVE // review reported entry (allows post-processing such as map deleting) // MUST be called after StartDataWrite, before any actual writing, // for each item obtained in GetItem localstatus TCustomImplDS::implReviewReadItem( TSyncItem &aItem // the item ) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { return inherited::implReviewReadItem(aItem); } #endif // BASED_ON_BINFILE_CLIENT // get the operation TSyncOperation sop = aItem.getSyncOp(); // NOTE: Don't touch map if this is a for-reference-only (meaning that the map is // already ok, and it is included here ONLY to find possible slowsync matches)! if (sop!=sop_reference_only) { // Adjust map flags or create map if needed if (fSlowSync || sop==sop_add || sop==sop_wants_add) { // for slowsync, all items are kind of "adds", that is, not yet mapped (server case) // or not yet statused (client case) // for normal sync, make sure adds get mapflag_pendingAddConfirm set and remoteID gets cleared (is not valid in any case) modifyMap(mapentry_normal,aItem.getLocalID(),"",mapflag_pendingAddConfirm+mapflag_pendingStatus,false,mapflag_pendingDeleteStatus); } else if (sop==sop_delete) { // In case when postFetch filtering changed an item from replace to delete, // we must make sure that the map entry gets the deleted status set // - simply make sure deleted item's map entry will get deleted once the delete is confirmed modifyMap(mapentry_normal,aItem.getLocalID(),NULL,mapflag_pendingDeleteStatus,false,0); } else { // not add (and never a delete here) -> is replace. Set status pending flag (which doesn't need to be saved to DB) modifyMap(mapentry_normal,aItem.getLocalID(),NULL,mapflag_pendingStatus,false,mapflag_pendingAddConfirm+mapflag_pendingDeleteStatus); } } return LOCERR_OK; } // TCustomImplDS::implReviewReadItem // - retrieve specified item from database bool TCustomImplDS::implRetrieveItemByID( TSyncItem &aItem, // the item TStatusCommand &aStatusCommand ) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { return inherited::implRetrieveItemByID(aItem, aStatusCommand); } #endif // BASED_ON_BINFILE_CLIENT bool ok=true; // determine item's local ID if (!aItem.hasLocalID()) { if (IS_CLIENT) { // client case: MUST have local ID aStatusCommand.setStatusCode(400); // bad request (no address) return false; } else { // no local ID specified directly, address by remote ID if (!aItem.hasRemoteID()) { aStatusCommand.setStatusCode(400); // bad request (no address) return false; } // lookup remote ID in map TMapContainer::iterator mappos = findMapByRemoteID(aItem.getRemoteID()); if (mappos==fMapTable.end()) { aStatusCommand.setStatusCode(404); // not found return false; } // set local ID aItem.setLocalID(mappos->localid.c_str()); // check if we have a local ID now if (!aItem.hasLocalID()) { aStatusCommand.setStatusCode(400); // bad request (no address) return false; } } } TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); // if we can't fetch single items from DB, we should have all // in the syncset and can get them from there if (fNoSingleItemRead) { // search sync set by localID TSyncSetList::iterator pos=findInSyncSet(aItem.getLocalID()); if (pos!=fSyncSetList.end() && (*pos)->itemP) { // found, copy data to item passed aItem.replaceDataFrom(*((*pos)->itemP)); } else { // not found aStatusCommand.setStatusCode(404); // not found ok=false; } } else { // fetch from DB SYSYNC_TRY { // fetch data from DB localstatus sta=apiFetchItem(*((TMultiFieldItem *)&aItem),false,NULL); // no syncsetitem known if (sta!=LOCERR_OK) { aStatusCommand.setStatusCode(sta); ok=false; } } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("implRetrieveItemByID exception: %s",e.what())); aStatusCommand.setStatusCode(510); ok=false; SYSYNC_ENDCATCH } // return status TP_START(fSessionP->fTPInfo,li); return ok; } // TCustomImplDS::implRetrieveItemByID /// called to set maps. /// @note aRemoteID or aLocalID can be NULL - which signifies deletion of a map entry /// @note that this might be needed for clients accessing a server-style database as well localstatus TCustomImplDS::implProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) { localstatus sta = 510; // error // Note: Map must be ready to have either empty local or remote ID to delete an entry if (!aLocalID) { // delete by remote ID modifyMap(mapentry_normal,NULL,aRemoteID,0,true); PDEBUGPRINTFX(DBG_ADMIN,("Map entry (or entries) for RemoteID='%s' removed",aRemoteID)); sta=LOCERR_OK; } else { // - if RemoteID is empty, this means that Map should be deleted if (!aRemoteID) { // Map delete request modifyMap(mapentry_normal,aLocalID,NULL,0,true); PDEBUGPRINTFX(DBG_ADMIN,("Map entry (or entries) for LocalID='%s' removed",aLocalID)); sta=LOCERR_OK; } else { // Map modify or add request, automatically clears mapflag_pendingAddConfirm (and all other) // flag(s), INLCUDING resume mark. So even if all sent adds (and not only the unsent ones) // get marked for resume in a suspend (fRelyOnEarlyMaps set), those that actually got added // in the previous session will not be re-sent for sure. modifyMap(mapentry_normal,aLocalID,aRemoteID,0,false); PDEBUGPRINTFX(DBG_ADMIN,("Map entry updated: LocalID='%s', RemoteID='%s'",aLocalID,aRemoteID)); sta=LOCERR_OK; } // if not map delete } // return status return sta; } // TCustomImplDS::implProcessMap enum CustomItemOp { CUSTOM_ITEM_ADD, CUSTOM_ITEM_ADD_AUGMENTED, CUSTOM_ITEM_UPDATE, CUSTOM_ITEM_UPDATE_AUGMENTED, CUSTOM_ITEM_DELETE }; struct TCustomItemAux : public TSyncItemAux { string fLocalID; string fRemoteID; // A copy of the original C string, to be on the safe side. bool fRemoteIDSet; TSyncOperation fSop; bool fRemoteHasLatestData; CustomItemOp fOp; bool fChangedDBVersion; bool fChangedNewVersion; }; /// process item (according to operation: add/delete/replace - and for future: copy/move) /// @note data items will be sent only after StartWrite() bool TCustomImplDS::implProcessItem( TSyncItem *aItemP, // the item TStatusCommand &aStatusCommand ) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { return inherited::implProcessItem(aItemP, aStatusCommand); } #endif // BASED_ON_BINFILE_CLIENT // Same approach as in TLocalEngineDS::engProcessRemoteItem: // backup local state and restore when called again. bool ok=true; localstatus sta=LOCERR_OK; string localID; const char *remoteID; // %%% bool RemoteIDKnown=false; TMapContainer::iterator mappos; TSyncOperation sop=sop_none; TMultiFieldItem *augmentedItemP = NULL; bool remoteHasLatestData; CustomItemOp op; bool changedDBVersion, changedNewVersion; TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); SYSYNC_TRY { // get casted item pointer TMultiFieldItem *myitemP = (TMultiFieldItem *)aItemP; TCustomItemAux *aux = static_cast(myitemP->getAux(TSyncItem::CUSTOM_DS)); DEBUGPRINTFX(DBG_DATA,( "TCustomImplDS::implProcessItem %p %s, SyncOp=%s, RemoteID='%s', LocalID='%s'", myitemP, aux ? "resuming" : "starting", SyncOpNames[myitemP->getSyncOp()], myitemP->getRemoteID(), myitemP->getLocalID() )); if (aux) { // Resuming the function call: restore variables, jump to store // method call. localID = aux->fLocalID; remoteID = aux->fRemoteIDSet ? aux->fRemoteID.c_str() : NULL; sop = aux->fSop; remoteHasLatestData = aux->fRemoteHasLatestData; op = aux->fOp; changedDBVersion = aux->fChangedDBVersion; changedNewVersion = aux->fChangedNewVersion; // Stripped down logic from normal code path below. // We can't save/restore mapppos because it points into // a data structure which may change between calls, thus // invalidating the old iterator. if (IS_CLIENT) { if (!localID.empty() && sop!=sop_add && sop!=sop_wants_add) mappos=findMapByLocalID(localID.c_str(),mapentry_normal); else mappos=fMapTable.end(); } else { mappos=findMapByRemoteID(remoteID); if (mappos!=fMapTable.end()) { localID = (*mappos).localid; } } aStatusCommand.setStatusCode(510); switch (op) { case CUSTOM_ITEM_ADD: goto do_add; case CUSTOM_ITEM_ADD_AUGMENTED: goto do_add_augmented; case CUSTOM_ITEM_UPDATE: goto do_update; case CUSTOM_ITEM_UPDATE_AUGMENTED: goto do_update_augmented; case CUSTOM_ITEM_DELETE: goto do_delete; }; } if (false) { // Prepare for resuming the function call. Will only be reached // via goto with "op" set to something identifying the source of // the jump. again: #define CHECK_FOR_AGAIN(_status, _op) \ if (_status == LOCERR_AGAIN) { \ op = _op; \ goto again; \ } if (!aux) { aux = new TCustomItemAux; myitemP->setAux(TSyncItem::CUSTOM_DS, aux); } aux->fLocalID = localID; aux->fRemoteID = remoteID ? remoteID : ""; aux->fRemoteIDSet = remoteID != NULL; aux->fSop = sop; // cppcheck-suppress uninitvar aux->fRemoteHasLatestData = remoteHasLatestData; // cppcheck-suppress uninitvar aux->fOp = op; // cppcheck-suppress uninitvar aux->fChangedDBVersion = changedDBVersion; // cppcheck-suppress uninitvar aux->fChangedNewVersion = changedNewVersion; aStatusCommand.setStatusCode(LOCERR_AGAIN); goto error; } // - get op sop = myitemP->getSyncOp(); // - check IDs if (IS_CLIENT) { // Client case: we always get the local ID, except for add localID=myitemP->getLocalID(); remoteID=myitemP->getRemoteID(); if (!localID.empty() && sop!=sop_add && sop!=sop_wants_add) mappos=findMapByLocalID(localID.c_str(),mapentry_normal); // for all but sop == sop_add else mappos=fMapTable.end(); // if there is no localid or it is an add, we have no map entry yet } else { // Server case: we only know the remote ID // - get remoteID remoteID=myitemP->getRemoteID(); // first see if we have a map entry for this remote ID localID.erase(); // none yet // Note: // - even items detected for deletion still have a map item until deletion is confirmed by the remote party, // so we'll be able to update already "deleted" items (in case they are not really gone, but only invisible in the sync set) // - we can use mapflag_pendingDeleteStatus (which does not need persistence in the DB, so works even for not resume-enabled backends) // to keep still existing and deleted items apart. mappos=findMapByRemoteID(remoteID); // search for it if (mappos!=fMapTable.end()) { localID = (*mappos).localid; // assign it if we have it } } // - now perform op aStatusCommand.setStatusCode(510); // default DB error remoteHasLatestData = false; switch (sop) { /// @todo sop_copy is now implemented by read/add sequence /// in localEngineDS, but will be moved here later possibly case sop_add : // check for duplicated add // Notes: // - server must check it here, because map lookup is needed. Contrarily, client // can check it on localengineds level against the pending maps list with isAddFromLastSession(). // - if mapflag_pendingDeleteStatus is set, the item still has a map entry, but does not exist in the DB any more // so do not report 418 here! if (IS_SERVER && mappos!=fMapTable.end() && ((*mappos).mapflags & mapflag_pendingDeleteStatus)==0) { // we already know this item (and it was not already detected as deleted from the DB, so should exist there) // - status "already exists" aStatusCommand.setStatusCode(418); ok = false; break; } // add item and retrieve new localID for it do_add: sta = apiAddItem(*myitemP,localID); CHECK_FOR_AGAIN(sta, CUSTOM_ITEM_ADD); myitemP->setLocalID(localID.c_str()); // possibly following operations need to be based on new localID returned by add // check for backend asking engine to do a merge if (sta==DB_Conflict) { // DB has detected item conflicts with data already stored in the database and // request merging current data from the backend with new data before storing. augmentedItemP = mergeWithDatabaseVersion(myitemP, changedDBVersion, changedNewVersion); if (augmentedItemP==NULL) sta = DB_Error; // no item found, DB error else { // store augmented version back to DB only if modified do_add_augmented: if (changedDBVersion) sta = apiUpdateItem(*augmentedItemP); else sta = LOCERR_OK; CHECK_FOR_AGAIN(sta, CUSTOM_ITEM_ADD_AUGMENTED); // in server case, further process like backend merge (but no need to fetch again, we just keep augmentedItemP) if (IS_SERVER && sta==LOCERR_OK) { // TLocalEngineDS::engProcessRemoteItemAsServer() in // localengineds.cpp already counted the item as added // because it didn't know that special handling would be // needed. Instead of a complicated mechanism to report // back the actual outcome, let's fix the statistics // here. fLocalItemsAdded--; if (changedDBVersion) fLocalItemsUpdated++; sta = DB_DataMerged; } // in the processing below avoid sending an unnecessare Replace // if the data sent by the peer already was up-to-date if (!changedNewVersion) remoteHasLatestData = true; } } if (IS_SERVER) { #ifdef SYSYNC_SERVER if (sta==DB_DataMerged || sta==DB_DataReplaced) { // while adding, data was merged with pre-existing data from... // ..either data external from the sync set, such as augmenting a contact with info from a third-party lookup // ..or another item pre-existing in the sync set. PDEBUGPRINTFX(DBG_DATA,("Database adapter indicates that added item was merged with pre-existing data (status 207/209/409)")); // check if the item resulting from merge is known by the client already (in it's pre-merge form, that is) TMapContainer::iterator conflictingMapPos = findMapByLocalID(localID.c_str(), mapentry_normal); bool remoteAlreadyKnowsItem = conflictingMapPos!=fMapTable.end(); // also check if we have a (pre-merge) operation pending for that item already TSyncItem *conflictingItemP = getConflictingItemByLocalID(myitemP); if (conflictingItemP) { // cancel any pending operation for the original item. dontSendItemAsServer(conflictingItemP); } // If client already knows that item, we must propagate the merge to the client // by deleting the original item (in addition to sending the update of the merge) if (remoteAlreadyKnowsItem) { PDEBUGPRINTFX(DBG_DATA,( "Merge occured with an item already known remotely (localID=%s, remoteID=%s) -> delete duplicate from client", (*conflictingMapPos).localid.c_str(), (*conflictingMapPos).remoteid.c_str() )); // client already knows an item with that server-side localID // - check if it is the same item as the added one from a server's perspective // (this should not normally not be the case, as otherwise we should not have // tried to add it in the first place - check above should have generated 418 error) bool sameRemoteItem = (*conflictingMapPos).remoteid==myitemP->getRemoteID(); if (sameRemoteItem) { PDEBUGPRINTFX(DBG_ERROR,("Consistency error: despite being added new, this remoteID is already known!?")); } else { // create delete for now duplicate item on client TSyncItem *duplDelP = newItemForRemote(myitemP->getTypeID()); if (duplDelP) { // - setup delete item duplDelP->setRemoteID((*conflictingMapPos).remoteid.c_str()); duplDelP->clearLocalID(); duplDelP->setSyncOp(sop_delete); // - add it to the list of changes to be sent to the client later SendItemAsServer(duplDelP); } } } // if backend has not replaced, but merely merged data, we're done. Otherwise, client needs to be updated with // merged/augmented version of the data if (!remoteHasLatestData && sta!=DB_DataReplaced) { // now create a replace command to update the item added from the client with the merge result // - this is like forcing a conflict, i.e. this loads the item by local/remoteid and adds it to // the to-be-sent list of the server. if (augmentedItemP) { // augmented version was created in engine, just add that version to the list of items to be sent SendItemAsServer(augmentedItemP); // takes ownership of augmentedItemP augmentedItemP = NULL; } else { // augmented version was created in backend, fetch it now and add to list of items to be sent SendDBVersionOfItemAsServer(myitemP); } } sta = LOCERR_OK; // otherwise, treat as ok } #endif // SYSYNC_SERVER } // server // - we don't need the augmented item any more if it still exists at this point if (augmentedItemP) { delete augmentedItemP; augmentedItemP = NULL; } if (sta!=LOCERR_OK) { aStatusCommand.setStatusCode(sta); ok=false; } else { // added ok // - save what is needed for finalisation if (fNeedFinalisation) { myitemP->setLocalID(localID.c_str()); // finalisation needs to know the local ID queueForFinalisation(myitemP); } // - status ok aStatusCommand.setStatusCode(201); // item added // - add or update map entry (in client case, remoteID is irrelevant and possibly is not saved) modifyMap(mapentry_normal,localID.c_str(),remoteID,0,false); ok=true; } break; case sop_replace : if (mappos==fMapTable.end()) { // not found in map table aStatusCommand.setStatusCode(404); ok=false; } else { // - make sure item has local ID set myitemP->setLocalID(localID.c_str()); // update item do_update: sta = apiUpdateItem(*myitemP); CHECK_FOR_AGAIN(sta, CUSTOM_ITEM_UPDATE); if (sta==DB_Conflict) { // DB has detected item conflicts with data already stored in the database and // request merging current data from the backend with new data before storing. augmentedItemP = mergeWithDatabaseVersion(myitemP, changedDBVersion, changedNewVersion); if (augmentedItemP==NULL) sta = DB_Error; // no item found, DB error else { // store augmented version back to DB only if modified do_update_augmented: if (changedDBVersion) sta = apiUpdateItem(*augmentedItemP); else sta = LOCERR_OK; CHECK_FOR_AGAIN(sta, CUSTOM_ITEM_UPDATE_AUGMENTED); delete augmentedItemP; // forget now } } // now check final status if (sta!=LOCERR_OK) { aStatusCommand.setStatusCode(sta); ok=false; } else { // updated ok // - save what is needed for finalisation if (fNeedFinalisation) queueForFinalisation(myitemP); // - status ok aStatusCommand.setStatusCode(200); // item replaced ok ok=true; } } break; case sop_delete : case sop_archive_delete : case sop_soft_delete : if (mappos==fMapTable.end()) { // not found in map table means that remote is trying to // delete an item that wasn't mapped before. This is different from // the case below when the actual item is not there any more, but // the map still existed (-> 211) aStatusCommand.setStatusCode(404); ok=false; } else { // - make sure item has local ID set myitemP->setLocalID(localID.c_str()); // delete item do_delete: sta = apiDeleteItem(*myitemP); CHECK_FOR_AGAIN(sta, CUSTOM_ITEM_DELETE); if (sta!=LOCERR_OK) { // not found is reported as successful 211 status, because result is ok (item deleted, whatever reason) if (sta==404) sta=211; // ok, but item was not there any more else ok=false; // others are real errors aStatusCommand.setStatusCode(sta); } else { // - ok aStatusCommand.setStatusCode(200); // item deleted ok ok=true; } if (ok) { // delete map entry anyway // - mark the map entry for deletion modifyMap(mapentry_normal,localID.c_str(),NULL,0,true); } } break; default : SYSYNC_THROW(TSyncException("Unknown sync op in TCustomImplDS::implProcessItem")); } // switch if (ok) { // successful, save new localID in item myitemP->setLocalID(localID.c_str()); TP_START(fSessionP->fTPInfo,li); return true; } else { TP_START(fSessionP->fTPInfo,li); return false; } } SYSYNC_CATCH (exception &e) PDEBUGPRINTFX(DBG_ERROR,("******** TCustomImplDS::implProcessItem exception: %s",e.what())); aStatusCommand.setStatusCode(510); goto error; SYSYNC_ENDCATCH SYSYNC_CATCH (...) PDEBUGPRINTFX(DBG_ERROR,("******** TCustomImplDS::implProcessItem unknown exception")); goto error; SYSYNC_ENDCATCH error: // Switch back to previous timer TP_START(fSessionP->fTPInfo,li); return false; } // TCustomImplDS::implProcessItem // private helper to prepare for apiSaveAdminData() localstatus TCustomImplDS::SaveAdminData(bool aSessionFinished, bool aSuccessful) { TMapContainer::iterator pos; localstatus sta=LOCERR_OK; // calculate difference between current and previous state of tempGUID maps or pending maps // - mark all non-main map entries as deleted (those that still exist will be re-added later) // - also do some clean-up in case of successful end-of-session pos=fMapTable.begin(); while (pos!=fMapTable.end()) { if ((*pos).entrytype!=mapentry_normal) { // Note: this is not strictly needed any more, as non-normal maps are // now already entered into fMapTable with deleted flag set // (to make sure they don't get used by accident) (*pos).deleted=true; } else if (!(*pos).deleted) { // in case of map table without flags, we must get rid of all non-real maps if (!dsResumeSupportedInDB() && aSessionFinished) { // For client, remoteid is irrelevant and can well be empty // Map entries exist for those items that are not newly added on the client // For server, maps w/o remoteid are not really mapped and must not be saved when // we have no flags to mark this special conditon (mapflag_pendingAddConfirm) if (IS_SERVER && (*pos).remoteid.empty()) { // no remoteid -> this is not a real map, we cannot represent it w/o resume support (=flags) in map table DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("LocalID='%s' has no remoteID - cannot be stored in non-DS-1.2 Map DB -> removed map",(*pos).localid.c_str())); if ((*pos).added) { // was never added to DB, so no need to delete it in DB either - just forget it TMapContainer::iterator delpos=pos++; fMapTable.erase(delpos); continue; } else { // is already in DB - mark deleted (*pos).deleted=true; } } else { // clear all specials (*pos).mapflags=0; (*pos).savedmark=false; (*pos).markforresume=false; } } // normal, undeleted map entry, check for cleanup else if ( aSessionFinished && aSuccessful && ((*pos).mapflags & mapflag_pendingAddConfirm) ) { // successful end of session - we can forget pending add confirmations (as the add commands apparently never reached the remote at all) // Note: for clients, maps can well have an empty remoteid (because it does not need to be saved) if (IS_SERVER && (*pos).remoteid.empty()) { PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("Successful end of session but localID='%s' has no remoteID and pendingAddConfirm still set -> removed map",(*pos).localid.c_str())); // if not mapped, this will be a re-add in the next session, so forget it for now if ((*pos).added) { // was never added to DB, so no need to delete it in DB either - just forget it TMapContainer::iterator delpos=pos++; fMapTable.erase(delpos); continue; } else { // is already in DB - mark deleted (*pos).deleted=true; } } else { // For server: is mapped, which means that it now exists in the client - just clean mapflag_pendingAddConfirm // For client: just clean the pendingAddConfirm // Note: maps like this should not exist at this time - as at end of a successful session all items should // have got confirmation. PDEBUGPRINTFX(DBG_ERROR,("Apparently successful end of session - but localID='%s' has pendingAddConfirm still set: sync may not be fully complete",(*pos).localid.c_str())); (*pos).mapflags &= ~mapflag_pendingAddConfirm; // keep mapflag_pendingStatus for documentary/debug purposes (*pos).changed = true; // make sure it gets written to DB } } } // increment here only so we can do "continue" w/o pos increment after delete pos++; } // for all map entries if (dsResumeSupportedInDB()) { // If we have different map entry types - re-add the special entries from the separate lists // Note: these entries are already in the global map table, but with the deleted flag set. // Here those that still exist now will be re-activated (without saving them again if not needed) TStringToStringMap::iterator spos; if (IS_CLIENT) { #ifdef SYSYNC_CLIENT // - now pending maps (unsent ones) PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("SaveAdminData: adding %ld entries from fPendingAddMaps as mapentry_pendingmap",(long)fPendingAddMaps.size())); for (spos=fPendingAddMaps.begin();spos!=fPendingAddMaps.end();spos++) { string locID = (*spos).first; dsFinalizeLocalID(locID); // make sure we have the permanent version in case datastore implementation did deliver temp IDs modifyMap(mapentry_pendingmap, locID.c_str(), (*spos).second.c_str(), 0, false); } // - now pending maps (sent, but not seen status yet) PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("SaveAdminData: adding %ld entries from fUnconfirmedMaps as mapentry_pendingmap/mapflag_pendingMapStatus",(long)fUnconfirmedMaps.size())); for (spos=fUnconfirmedMaps.begin();spos!=fUnconfirmedMaps.end();spos++) { modifyMap(mapentry_pendingmap, (*spos).first.c_str(), (*spos).second.c_str(), mapflag_pendingMapStatus, false); } #endif } else { #ifdef SYSYNC_SERVER // - the tempguid maps PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,("SaveAdminData: adding %ld entries from fTempGUIDMap as mapentry_tempidmap",(long)fTempGUIDMap.size())); for (spos=fTempGUIDMap.begin();spos!=fTempGUIDMap.end();spos++) { modifyMap(mapentry_tempidmap, (*spos).second.c_str(), (*spos).first.c_str(), 0, false); } #endif } } sta=apiSaveAdminData(aSessionFinished,aSuccessful); if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("SaveAdminData failed, err=%hd",sta)); } return sta; } // TCustomImplDS::SaveAdminData #endif // not BINFILE_ALWAYS_ACTIVE // save end of session state localstatus TCustomImplDS::implSaveEndOfSession(bool aUpdateAnchors) { localstatus sta=LOCERR_OK; PDEBUGBLOCKCOLL("SaveEndOfSession"); // update TCustomImplDS dsSavedAdmin variables (other levels have already updated their variables if (aUpdateAnchors) { if (!fRefreshOnly || (fRefreshOnly && fCacheData) || fSlowSync) { // This was really a two-way sync or we implicitly know that // we are now in sync with remote (like after one-way-from-remote refresh = reload local) #ifdef BASED_ON_BINFILE_CLIENT if (!binfileDSActive()) #endif // BASED_ON_BINFILE_CLIENT { #ifndef BINFILE_ALWAYS_ACTIVE // Note: in case of BASED_ON_BINFILE_CLIENT, these updates will be done by binfileds // (also note that fPreviousToRemoteSyncCmpRef has different semantics in BASED_ON_BINFILE_CLIENT, // as it serves as a last-changelog-update reference then) // But here, fPreviousToRemoteSyncCmpRef is what it seems - the timestamp corresponding to last sync to remote if (fConfigP->fSyncTimeStampAtEnd) { // if datastore cannot explicitly set modification timestamps, best time to save is current time fPreviousToRemoteSyncCmpRef = fAgentP->getDatabaseNowAs(TCTX_UTC); } else { // if datastore can set modification timestamps, best time to save is start of sync fPreviousToRemoteSyncCmpRef = fCurrentSyncTime; } #endif } // also update opaque reference string possibly needed in DS API implementations fPreviousToRemoteSyncIdentifier = fCurrentSyncIdentifier; PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("updating sync token (fPreviousToRemoteSyncIdentifier) from %s to current sync token %s",fPreviousToRemoteSyncIdentifier.c_str(),fCurrentSyncIdentifier.c_str())); } else { PDEBUGPRINTFX(DBG_ADMIN+DBG_DBAPI+DBG_EXOTIC,("keeping old sync token (fPreviousToRemoteSyncIdentifier) %s instead of updating to current sync token %s",fPreviousToRemoteSyncIdentifier.c_str(),fCurrentSyncIdentifier.c_str())); } // updating anchor means invalidating last Suspend fPreviousSuspendCmpRef = fPreviousToRemoteSyncCmpRef; // setting to current reference can do less harm than setting it to zero fPreviousSuspendIdentifier.erase(); } #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) { // if we sit on top of activated binfile, let binfile do the actual end-if-session work // (updates of cmprefs etc. are done at binfile level again). sta = inherited::implSaveEndOfSession(aUpdateAnchors); } else #endif // BASED_ON_BINFILE_CLIENT { // save admin data myself now sta=SaveAdminData(true,aUpdateAnchors); // end of session // we can foget the maps now fMapTable.clear(); } PDEBUGENDBLOCK("SaveEndOfSession"); return sta; } // TCustomImplDS::implSaveEndOfSession // - end write with commit bool TCustomImplDS::implEndDataWrite(void) { localstatus sta=LOCERR_OK; TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); SYSYNC_TRY { // first make sure data writing ends (and obtain current sync identifier) sta = apiEndDataWrite(fCurrentSyncIdentifier); } SYSYNC_CATCH (exception &e) PDEBUGPRINTFX(DBG_ERROR,("******** implEndDataWrite exception: %s",e.what())); TP_START(fSessionP->fTPInfo,li); return false; SYSYNC_ENDCATCH TP_START(fSessionP->fTPInfo,li); #ifdef BASED_ON_BINFILE_CLIENT if (binfileDSActive()) { // binfile level must be called as well sta = inherited::implEndDataWrite(); } #endif return sta; } // TCustomImplDS::implEndDataWrite // delete sync set one by one localstatus TCustomImplDS::zapSyncSetOneByOne(void) { TSyncSetList::iterator pos; localstatus sta; TStatusCommand dummy(getSession()); // check if we need to apply filters bool filteredDelete = fFilteringNeededForAll || fFilteringNeeded; TSyncItem *delitemP = NULL; if (!filteredDelete) { PDEBUGPRINTFX(DBG_DATA,("Zapping datastore unfiltered: deleting %ld items from database",(long)fSyncSetList.size())); } else { PDEBUGPRINTFX(DBG_DATA,("Zapping datastore with filter: deleting only filter passing items of max %ld items",(long)fSyncSetList.size())); } long tot = fSyncSetList.size(); long n = 0; for (pos=fSyncSetList.begin(); pos!=fSyncSetList.end(); ++pos) { if (filteredDelete) { // we need to inspect further, as we may NOT delete the entire sync set // - get the item with data (we become owner of it!) getItemFromSyncSetItem(*pos,delitemP); // - check filters bool passes=postFetchFiltering(delitemP); if (!passes) { tot--; // one less than initially assumed continue; // don't delete this one, it does not pass the filter } // - delete now PDEBUGPRINTFX(DBG_DATA,("- item '%s' passes filter -> deleting",delitemP->getLocalID())); } else { // all items loaded need to be deleted // - create dummy item delitemP = newItemForRemote(ity_multifield); delitemP->setLocalID((*pos)->localid.c_str()); } // delete sta = apiDeleteItem(*(static_cast(delitemP))); n++; DB_PROGRESS_EVENT(this,pev_deleting,n,tot,0); // forget the item delete delitemP; // success or "211 - not deleted" is ok. if (sta!=LOCERR_OK && sta!=211) return sta; } return LOCERR_OK; // zapped ok } // TCustomImplDS::zapSyncSetOneByOne // private helper: get item with data from sync set list. Retrieves item if not already // there from loading the sync set // Note: can be called with aSyncSetItemP==NULL, which causes directly loading from DB // in all cases. localstatus TCustomImplDS::getItemFromSyncSetItem(TSyncSetItem *aSyncSetItemP, TSyncItem *&aItemP) { if (aSyncSetItemP && aSyncSetItemP->itemP) { // already fetched - pass it to caller and remove link in syncsetitem aItemP = aSyncSetItemP->itemP; aSyncSetItemP->itemP = NULL; // syncsetitem does not own it any longer } else { // item not yet fetched (or already retrieved once), fetch it now // - create new empty TMultiFieldItem aItemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); if (!aItemP) return 510; // - assign local id, as it is required e.g. by DoDataSubstitutions aItemP->setLocalID(aSyncSetItemP->localid.c_str()); // - set default operation aItemP->setSyncOp(sop_replace); // Now fetch item (read phase) localstatus sta = apiFetchItem(*((TMultiFieldItem *)aItemP),true,aSyncSetItemP); if (sta!=LOCERR_OK) { delete aItemP; aItemP = NULL; } return sta; } // ok return LOCERR_OK; } // TCustomImplDS::getItemFromSyncSetItem #ifndef BINFILE_ALWAYS_ACTIVE // - save status information required to possibly perform a resume (as passed to datastore with // implMarkOnlyUngeneratedForResume() and implMarkItemForResume()) // (or, in case the session is really complete, make sure that no resume state is left) localstatus TCustomImplDS::implSaveResumeMarks(void) { #ifdef BASED_ON_BINFILE_CLIENT // let binfile handle it if it is active if (binfileDSActive()) { return inherited::implSaveResumeMarks(); } #endif // BASED_ON_BINFILE_CLIENT // update anchoring info for resume if (fConfigP->fSyncTimeStampAtEnd) { // if datastore cannot explicitly set modification timestamps, best time to save is current time fPreviousSuspendCmpRef = fAgentP->getDatabaseNowAs(TCTX_UTC); } else { // if datastore can set modification timestamps, best time to save is start of sync fPreviousSuspendCmpRef = fCurrentSyncTime; } // also update opaque reference string possibly needed in DS API implementations fPreviousSuspendIdentifier = fCurrentSyncIdentifier; // save admin data now return SaveAdminData(false,false); // not end of session, not successful end either } // TCustomImplDS::implSaveResumeMarks #endif // not BINFILE_ALWAYS_ACTIVE #ifdef BASED_ON_BINFILE_CLIENT // Connecting methods when CustomImplDS is used on top of BinFileImplDS // Note: these are defined by BinFileImplDS and are ONLY CALLED IF BinFileImplDS is // active. In setups where we can switch off the intermediate binfile layer, // these routines are never called and can't harm // private helper localstatus TCustomImplDS::makeSyncSetLoaded(bool aNeedAll) { localstatus sta = LOCERR_OK; // assume loaded ok if (!fSyncSetLoaded) { // not yet loaded, try to load PDEBUGBLOCKFMTCOLL(("ReadSyncSet","Reading Sync Set from Database","datastore=%s",getName())); SYSYNC_TRY { sta = apiReadSyncSet(aNeedAll); PDEBUGENDBLOCK("ReadSyncSet"); } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("makeSyncSetLoaded exception: %s",e.what())); sta=510; // end of DB read PDEBUGENDBLOCK("ReadSyncSet"); SYSYNC_ENDCATCH if (sta==LOCERR_OK) fSyncSetLoaded=true; // is now loaded } return sta; // ok only if now loaded } // TCustomImplDS::makeSyncSetLoaded /// get first item from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return false if no item found bool TCustomImplDS::getFirstItem(TSyncItem *&aItemP) { // reset the iterator fSyncSetPos = fSyncSetList.begin(); // now get first item's info return getNextItem(aItemP); } // TCustomImplDS::getFirstItem /// get next item from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return false if no item found bool TCustomImplDS::getNextItem(TSyncItem *&aItemP) { if (!fSyncSetLoaded) return false; // no syncset, nothing to report if (fSyncSetPos!=fSyncSetList.end()) { // get the info TSyError sta = getItemFromSyncSetItem(*fSyncSetPos,aItemP); if (sta==LOCERR_OK) { // advance to next item in sync set fSyncSetPos++; // successful return true; } } // no more items (or problem getting item) return false; } // TCustomImplDS::getNextItem #ifdef CHANGEDETECTION_AVAILABLE /// get item's ID and modification status from the sync set, not including data /// @return false if no item found bool TCustomImplDS::getFirstItemInfo(localid_out_t &aLocalID, bool &aItemHasChanged) { // reset the iterator fSyncSetPos = fSyncSetList.begin(); // now get first item's info return getNextItemInfo(aLocalID, aItemHasChanged); } // TCustomImplDS::getFirstItemInfo /// get next item's ID and modification status from the sync set, not including data /// @return false if no item found bool TCustomImplDS::getNextItemInfo(localid_out_t &aLocalID, bool &aItemHasChanged) { if (!fSyncSetLoaded) return false; // no syncset, nothing to report if (fSyncSetPos!=fSyncSetList.end()) { // get the info TSyncSetItem *syncsetitemP = (*fSyncSetPos); // - ID STR_TO_LOCALID(syncsetitemP->localid.c_str(),aLocalID); // - changeflag aItemHasChanged = syncsetitemP->isModified; // advance to next item in sync set fSyncSetPos++; // ok return true; } // no more items return false; } // TCustomImplDS::getNextItemInfo #endif // CHANGEDETECTION_AVAILABLE /// get item by local ID from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return != LOCERR_OK if item with specified ID is not found. localstatus TCustomImplDS::getItemByID(localid_t aLocalID, TSyncItem *&aItemP) { if (!fSyncSetLoaded) return 510; // syncset should be loaded here! // search in syncset string localid; LOCALID_TO_STRING(aLocalID,localid); TSyncSetList::iterator syncsetpos = findInSyncSet(localid.c_str()); if (syncsetpos==fSyncSetList.end()) { // not found in current sync set, but could be a newly inserted item - try direct load // - create new empty TMultiFieldItem aItemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); if (!aItemP) return 510; // - assign local id, as it is required e.g. by DoDataSubstitutions aItemP->setLocalID(localid.c_str()); // - set default operation aItemP->setSyncOp(sop_replace); // - now fetch directly from DB localstatus sta = apiFetchItem(*((TMultiFieldItem *)aItemP),true,NULL); if (sta!=LOCERR_OK) { delete aItemP; aItemP = NULL; } return sta; } else { // return sync item from syncset item (fetches data now if not fetched before) return getItemFromSyncSetItem(*syncsetpos,aItemP); } } // TCustomImplDS::getItemByID /// update item by local ID in the sync set. Caller retains ownership of aItemP /// @return != LOCERR_OK if item with specified ID is not found. localstatus TCustomImplDS::updateItemByID(localid_t aLocalID, TSyncItem *aItemP) { if (!aItemP) return 510; // error if (!aItemP->isBasedOn(ity_multifield)) return 415; // must be multifield item TMultiFieldItem *myItemP = static_cast(aItemP); // - assign localid string localid; LOCALID_TO_STRING(aLocalID,localid); myItemP->setLocalID(localid.c_str()); // have API handle it localstatus sta = apiUpdateItem(*myItemP); if (sta==LOCERR_OK) { // updated ok // - save what is needed for finalisation if (fNeedFinalisation) { queueForFinalisation(myItemP); } } return sta; } // TCustomImplDS::updateItemByID /// delete item by local ID in the sync set. /// @return != LOCERR_OK if item with specified ID is not found. localstatus TCustomImplDS::deleteItemByID(localid_t aLocalID) { // create new dummy TMultiFieldItem TMultiFieldItem *myItemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); // assign localid string localid; LOCALID_TO_STRING(aLocalID,localid); myItemP->setLocalID(localid.c_str()); // have API delete it localstatus sta = apiDeleteItem(*myItemP); delete myItemP; // delete dummy item // return status return sta; } // TCustomImplDS::deleteItemByID /// create new item in the sync set. Caller retains ownership of aItemP. /// @return LOCERR_OK or error code. /// @param[out] aNewLocalID local ID assigned to new item /// @param[out] aReceiveOnly is set to true if local changes/deletion of this item should not be /// reported to the server in normal syncs. localstatus TCustomImplDS::createItem(TSyncItem *aItemP,localid_out_t &aNewLocalID, bool &aReceiveOnly) { if (!aItemP) return 510; // error if (!aItemP->isBasedOn(ity_multifield)) return 415; // must be multifield item TMultiFieldItem *myItemP = static_cast(aItemP); // add it to the database string newLocalID; localstatus sta = apiAddItem(*myItemP,newLocalID); // return assigned ID STR_TO_LOCALID(newLocalID.c_str(),aNewLocalID); if (sta==LOCERR_OK) { // added ok // - save what is needed for finalisation if (fNeedFinalisation) { myItemP->setLocalID(newLocalID.c_str()); // finalisation needs to know the local ID queueForFinalisation(myItemP); } } // so far, we don't have receive-only items aReceiveOnly = false; // return status return sta; } // TCustomImplDS::createItem /// zaps the entire datastore, returns LOCERR_OK if ok /// @return LOCERR_OK or error code. localstatus TCustomImplDS::zapDatastore(void) { // make sure we have the sync set if we need it to zap it if (apiNeedSyncSetToZap()) { // make sure we have the sync set localstatus sta = makeSyncSetLoaded(false); if (sta!=LOCERR_OK) return sta; // error } // Zap the sync set in this datastore (will possibly call zapSyncSetOneByOne if there's no more efficient way to do it than one by one) // - make sure we have at least one pev_deleting event, in case app tracks it to see if session caused changes to DB DB_PROGRESS_EVENT(this,pev_deleting,0,0,0); // - now zap return apiZapSyncSet(); } // TCustomImplDS::zapDatastore #endif // BASED_ON_BINFILE_CLIENT connecting methods #ifdef DBAPI_TEXTITEMS // helper to process params // - if aParamName!=NULL, it searches for the value of the requested parameter and returns != NULL, NULL if none found // - if aParamName==NULL, it scans until all params are skipped and returns end of params cAppCharP paramScan(cAppCharP aParams,cAppCharP aParamName, string &aValue) { cAppCharP p = aParams; cAppCharP q,r; int nl,vl; bool quotedvalue=false; if (!p) return NULL; while (*p && *p==';') { // skip param intro p++; // find end of param name for (q=p; *q!=0 && *q!=';' && *q!=':' && *q!='=';) q++; nl=q-p; // - now: p=start of name, nl=length of name // find end of param value if (nl && *q=='=') { // value starts after equal sign q++; if (*q=='"') { // " ) { work around bug in colorizer // quoted value quotedvalue=true; r=++q; while (*r && *r!='"') { // " ) { work around bug in colorizer if (*r=='\\') { r++; if (*r) r++; } else r++; } vl=r-q; if (*r) r++; // skip closing quote if not delimited by end of string } else { // unquoted value, ends at next colon, semicolon or line end (no value case) for (r=q; *r && *r!=':' && *r!=';' && *r!='\r' && *r!='\n';) r++; vl = r-q; } // - now: q=start of value, vl=length of value, *r=char after value } else { // no value r=q; vl=0; } // check if it's our value if (aParamName) { // we are searching a single parameter if (strucmp(p,aParamName,nl)==0) { // found, return it's value if (quotedvalue) CStrToStrAppend(q, aValue, true); // stop at quote or end of line else aValue.assign(q,vl); return p; // position of parameter name } } // next param p=r; } // end of all params if (aParamName) return NULL; // we were searching for a special param and haven't found it // we were scanning for the end of all params // - save all params aValue.assign(aParams,p-aParams); // - return pointer to what comes after params return p; } // paramScan // store API key/value pair field in named field bool TCustomImplDS::storeField( cAppCharP aName, cAppCharP aParams, cAppCharP aValue, TMultiFieldItem &aItem, uInt16 aSetNo, // unused here in base class sInt16 aArrayIndex ) { string s; // find field by name TItemField *fieldP = aItem.getArrayField(aName, aArrayIndex, false); // create element if not existing if (!fieldP) return false; // nothing stored // convert to app string s.erase(); appendStringAsUTF8(aValue, s, chs_utf8, lem_cstr); // treat timestamp specially if (fieldP->isBasedOn(fty_timestamp)) { TTimestampField *tsfP = static_cast(fieldP); // default time zone is none timecontext_t tctx = TCTX_UNKNOWN; // modify time zone if params contain a TZNAME if (paramScan(aParams,"TZNAME",s)) { // convert to time zone context (olson allowed) TimeZoneNameToContext(s.c_str(), tctx, tsfP->getGZones(), true); } // now parse text string into field tsfP->setAsISO8601(aValue, tctx, false); } else { // all others: just set as string fieldP->setAsString(aValue); } return true; } // TCustomImplDS::storeField // - parse text data into item // Note: generic implementation, using virtual storeField() method // to differentiate between use with mapped fields in DBApi and // direct (unmapped) TMultiFieldItem access in Tunnel API. bool TCustomImplDS::parseItemData( TMultiFieldItem &aItem, cAppCharP aItemData, uInt16 aSetNo ) { // read data from input string into mapped fields (or local vars) cAppCharP p = aItemData; cAppCharP q; string fieldname,params,value; bool readsomething=false; uInt16 arrayindex; // show item data as is PDEBUGPRINTFX(DBG_USERDATA+DBG_DBAPI+DBG_EXOTIC+DBG_HOT,("parseItemData received string from DBApi:")); PDEBUGPUTSXX(DBG_USERDATA+DBG_DBAPI+DBG_EXOTIC,aItemData,0,true); // read all fields while(*p) { arrayindex=0; // find name for (q=p; *q && *q!='[' && *q!=':' && *q!=';';) q++; fieldname.assign(p,q-p); // check for array index if (*q=='[') { q++; q+=StrToUShort(q,arrayindex); if (*q==']') q++; } p=q; // find and skip params p = paramScan(p,NULL,params); // p should now point to ':' if (*p==':' || !params.empty()) { // blobs needn't to contain a ':' value.erase(); if (*p==':') { // only get a value, if there is one !! p++; // consume colon // get value p += CStrToStrAppend( p,value,true ); // stop at quote or ctrl char } // if // store field now if (storeField( fieldname.c_str(), params.c_str(), value.c_str(), aItem, aSetNo, // ordering of params is correct now ( before !! ) arrayindex )) readsomething=true; } // skip everything up to next end of line (in case value was terminated by a quote or other ctrl char) while (*p && *p!='\r' && *p!='\n') p++; // skip all line end chars up to beginning of next line or end of record while (*p && (*p=='\r' || *p=='\n')) p++; // p now points to next line's beginning }; return readsomething; } // TCustomImplDS::parseItemData // generate text representation of a single item field bool TCustomImplDS::generateItemFieldData( bool aAssignedOnly, TCharSets aDataCharSet, TLineEndModes aDataLineEndMode, timecontext_t aTimeContext, TItemField *aBasefieldP, cAppCharP aBaseFieldName, string &aDataFields ) { TItemField *leaffieldP; string val; if (!aBasefieldP) return false; // ignore field if it is not assigned and assignedonly flag is set if (aAssignedOnly && aBasefieldP->isUnassigned()) return false; // yes, we want to write this field #ifdef ARRAYFIELD_SUPPORT uInt16 arrayIndex=0; #endif do { // first check if there is an element at all #ifdef ARRAYFIELD_SUPPORT if (aBasefieldP->isArray()) leaffieldP = aBasefieldP->getArrayField(arrayIndex,true); // get existing leaf fields only else leaffieldP = aBasefieldP; // leaf is base field #else leaffieldP = aBasefieldP; // leaf is base field #endif // if no leaf field, we'll need to exit here (we're done with the array) if (leaffieldP==NULL) break; // we have some data, first append name aDataFields += aBaseFieldName; #ifdef ARRAYFIELD_SUPPORT // append array index if this is an array field if (aBasefieldP->isArray()) StringObjAppendPrintf(aDataFields,"[%d]",arrayIndex); #endif // append value if (aBasefieldP->elementsBasedOn(fty_blob)) { // - for blobs we use a BlobID and send the data later aDataFields += ";BLOBID="; aDataFields += aBaseFieldName; #ifdef ARRAYFIELD_SUPPORT // append array index if this is an array field if (aBasefieldP->isArray()) StringObjAppendPrintf(aDataFields,"[%d]",arrayIndex); #endif } else { // - literal value (converted to DB charset as C-escaped string) if (leaffieldP->isBasedOn(fty_timestamp)) { TTimestampField *tsfP = static_cast(leaffieldP); // get original zone timecontext_t tctx = tsfP->getTimeContext(); if (TCTX_IS_DURATION(tctx) || TCTX_IS_DATEONLY(tctx) ||!TCTX_IS_UNKNOWN(tctx)) { // not fully floating, get name TimeZoneContextToName(tctx, val, tsfP->getGZones()); // append it aDataFields+= ";TZNAME="; aDataFields+= val; } // now convert to database time zone tctx = aTimeContext; // desired output zone // report as-is if we have a floating map or if it IS floating if (tsfP->isFloating()) tctx = TCTX_UNKNOWN; // report as-is // now create ISO8601 representation in the requested output time zone // Note: unless output time zone is "FLOATING", this timestamp is *not* in the time zone // of TZNAME, but normalized to the requested output time zone! tsfP->getAsISO8601(val,tctx,true,false,false); } else { leaffieldP->getAsString(val); // get value } aDataFields+=':'; // delimiter string valDB; appendUTF8ToString( val.c_str(), valDB, aDataCharSet, aDataLineEndMode ); StrToCStrAppend(valDB.c_str(),aDataFields,true); // allow 8-bit chars to be represented as-is (no \xXX escape needed) } // if aDataFields+="\r\n"; // CRLF at end // next item in array #ifdef ARRAYFIELD_SUPPORT arrayIndex++; #endif } while(aBasefieldP->isArray()); // only arrays do loop // generated something return true; } // TCustomImplDS::generateItemFieldData #ifdef DBAPI_TUNNEL_SUPPORT // - parse itemdata into item using DB mappings bool TCustomImplDS::parseTunnelItemData( TMultiFieldItem &aItem, cAppCharP aItemData ) { return parseItemData(aItem, aItemData, 0); // internal fields don't have set numbers } // TCustomImplDS::parseTunnelItemData // generate text representations of item's fields (BLOBs and parametrized fields not included) // - returns true if at least one field appended bool TCustomImplDS::generateTunnelItemData( bool aAssignedOnly, TMultiFieldItem *aItemP, string &aDataFields ) { bool createdone=false; // create text representation for all fields in the field list TFieldListConfig *flcP = aItemP->getFieldDefinitions(); sInt16 fid = 0; while (fidnumFields()) { // get base field TItemField *basefieldP = aItemP->getField(fid); // The plugin api docs say that text items should be UTF8 with CRLF line ends. // Plugins might choose how they render their timestamps, we choose UTC (so rendered timestamps will have trailing Z, // unless they are really floating). Note that the TZNAME param still indicates the originating timezone (so is NOT // always UTC!). if (generateItemFieldData(aAssignedOnly, chs_utf8, lem_dos, TCTX_UTC, basefieldP, TCFG_CSTR(flcP->fFields[fid].fieldname), aDataFields)) createdone=true; // we now have at least one field fid++; } // for all field mappings PDEBUGPRINTFX(DBG_USERDATA+DBG_EXOTIC+DBG_HOT,("generateItemData generated string for TunnelAPI:")); PDEBUGPUTSXX(DBG_USERDATA+DBG_EXOTIC,aDataFields.c_str(),0,true); return createdone; } // TCustomImplDS::generateTunnelItemData #endif // DBAPI_TUNNEL_SUPPORT #endif // DBAPI_TEXTITEMS #if defined(DBAPI_ASKEYITEMS) && defined(ENGINEINTERFACE_SUPPORT) // - get a settings key instance that can access the item // NULL is allowed for aItemP for cases where we don't have or want an item (!ReadNextItem:allfields) TDBItemKey *TCustomImplDS::newDBItemKey(TMultiFieldItem *aItemP, bool aOwnsItem) { return new TDBItemKey(getSession()->getSyncAppBase()->fEngineInterfaceP,aItemP,this,aOwnsItem); } // TCustomImplDS::newDBItemKey // TDBItemKey // ========== // set new content item void TDBItemKey::setItem(TMultiFieldItem *aItemP, bool aPassOwner) { forgetItem(); fItemP = aItemP; fOwnsItem = aPassOwner; fWritten = fItemP; // if we have set an item, this counts as written } // TDBItemKey::setItem // get FID for specified name sInt16 TDBItemKey::getFidFor(cAppCharP aName, stringSize aNameSz) { if (!fItemP) return VARIDX_UNDEFINED; // no item, no field is accessible TFieldMapList *fmlP = &(fCustomImplDS->fConfigP->fFieldMappings.fFieldMapList); // check for iterator commands first if (strucmp(aName,VALNAME_FIRST)==0) { fIterator=fmlP->begin(); if (fIterator!=fmlP->end()) return static_cast(*fIterator)->fid; } else if (strucmp(aName,VALNAME_NEXT)==0) { if (fIterator!=fmlP->end()) fIterator++; if (fIterator!=fmlP->end()) return static_cast(*fIterator)->fid; } else { TFieldMapList::iterator pos; for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { // check for name TFieldMapItem *fmiP = static_cast(*pos); if (strucmp(aName,fmiP->getName(),aNameSz)==0) { // return field ID (negative = local script var, positive = item field) return fmiP->fid; } } } // none found return VARIDX_UNDEFINED; } // TDBItemKey::getFidFor TItemField *TDBItemKey::getBaseFieldFromFid(sInt16 aFid) { if (!fItemP) return NULL; // no item, no field is accessible return fCustomImplDS->getMappedBaseFieldOrVar(*fItemP, aFid); } // TDBItemKey::getBaseFieldFromFid bool TDBItemKey::getFieldNameFromFid(sInt16 aFid, string &aFieldName) { if (!fItemP) return false; // no item, no field is accessible // name is map name (NOT field name!) TFieldMapList *fmlP = &(fCustomImplDS->fConfigP->fFieldMappings.fFieldMapList); TFieldMapList::iterator pos; TFieldMapItem *fmiP; // search field map item by fid, return name for (pos=fmlP->begin(); pos!=fmlP->end(); pos++) { fmiP = static_cast(*pos); // check for fid if (fmiP->fid == aFid) { // return name aFieldName = fmiP->getName(); return true; } } // none found return false; } // TDBItemKey::getFieldNameFromFid #endif // DBAPI_ASKEYITEMS and ENGINEINTERFACE_SUPPORT // Tunnel DB API (accessing a datastore from UIAPI) within a tunnel session // ------------------------------------------------------------------------ #ifdef DBAPI_TUNNEL_SUPPORT // private helper preparing type infrastucture so we can use it void TCustomImplDS::setupTunnelTypes(TSyncItemType *aItemTypeP) { // make sure we have types, or set type if we explicitly specify one if (!canCreateItemForRemote() || aItemTypeP) { // default to preferred TX type if none specified if (!aItemTypeP) aItemTypeP = getPreferredTxItemType(); // install single type for everything setSendTypeInfo(aItemTypeP,aItemTypeP); setReceiveTypeInfo(aItemTypeP,aItemTypeP); } } // must be called to start accesses (read or write) TSyError TCustomImplDS::TunnelStartDataRead(cAppCharP lastToken, cAppCharP resumeToken) { TSyError sta = LOCERR_OK; // forget previously started stuff InternalResetDataStore(); // force reading all data (we are simulating a plugin, which always reports entire sync set!) fSlowSync = true; // make admin ready string deviceID = "tunnelSession_"; deviceID += getName(); // append datastore name to build pseudo device name sta = implMakeAdminReady(deviceID.c_str(), getName(), "tunnelDBAPI"); if (sta==LOCERR_OK) { // setup types - default to preferred tx if not explicitly set (via /tunnel/itemtype) setupTunnelTypes(); // make sure types are ready for use initDataTypeUse(); // start anew sta = implStartDataRead(); } return sta; } TSyError TCustomImplDS::TunnelReadNextItemInternal(ItemID aID, TSyncItem *&aItemP, sInt32 *aStatus, bool aFirst) { TSyError sta = LOCERR_OK; // rewind if first item requested if (aFirst) { sta = implStartDataRead(); } // get next item from DB if (sta==LOCERR_OK) { bool isEOF; bool changed = false; // report all items, not only changed ones aItemP = NULL; sta = implGetItem(isEOF, changed, aItemP); if (sta==LOCERR_OK) { if (isEOF) { // no item *aStatus = ReadNextItem_EOF; } else { // item found // Note: changed status is not really reliable, does not differentiate resumed/normal // and does not relate to tokens passed in TunnelStartDataRead(). // It reflects what the next normal sync would report as changed *aStatus = changed ? ReadNextItem_Changed : ReadNextItem_Unchanged; // implGetItem should deliver some data in all cases if (!aItemP) return DB_Error; // something's wrong // get ID aID->item = StrAlloc(aItemP->getLocalID()); aID->parent = NULL; // none } } } return sta; } // TCustomImplDS::TunnelReadNextItemInternal TSyError TCustomImplDS::TunnelReadNextItem(ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst) { TSyncItem *itemP = NULL; *aItemData = NULL; TSyError sta = TunnelReadNextItemInternal(aID,itemP,aStatus,aFirst); if (itemP) { if (aItemData) { // create text version and return it string textData; textData.erase(); generateTunnelItemData(false,static_cast(itemP),textData); *aItemData = StrAlloc(textData.c_str()); } // not used any more, we have the text representation delete itemP; } return sta; } TSyError TCustomImplDS::TunnelReadNextItemAsKey(ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst) { TSyncItem *itemP = NULL; TSyError sta = TunnelReadNextItemInternal(aID,itemP,aStatus,aFirst); if (itemP) { // assign data if (aItemKey) { // pass the item to the key and let key own it, so item will be deleted with key reinterpret_cast(aItemKey)->setItem(static_cast(itemP), true); } else { // nobody wants the item, delete it delete itemP; } } return sta; } // TCustomImplDS::TunnelReadNextItemAsKey TSyError TCustomImplDS::TunnelReadItem(cItemID aID, appCharP *aItemData) { *aItemData = NULL; // create empty item TMultiFieldItem *itemP = static_cast(newItemForRemote(ity_multifield)); // set localID to retrieve itemP->setLocalID(aID->item); // retrieve TStatusCommand dummy(getSession()); TSyError sta = implRetrieveItemByID(*itemP, dummy) ? LOCERR_OK : dummy.getStatusCode(); if (sta==LOCERR_OK) { if (aItemData) { // create text version and return it string textData; textData.erase(); generateTunnelItemData(false,static_cast(itemP),textData); *aItemData = StrAlloc(textData.c_str()); } // not used any more, we have the text representation delete itemP; } return sta; } TSyError TCustomImplDS::TunnelReadItemAsKey(cItemID aID, KeyH aItemKey) { // get item TMultiFieldItem *itemP = reinterpret_cast(aItemKey)->getItem(); // set localID to retrieve itemP->setLocalID(aID->item); // retrieve TStatusCommand dummy(getSession()); return implRetrieveItemByID(*itemP, dummy) ? LOCERR_OK : dummy.getStatusCode(); } // TCustomImplDS::TunnelReadItemAsKey // end of accessing sync set (single item retrieval still possible) TSyError TCustomImplDS::TunnelEndDataRead() { // just pass on return implEndDataRead(); } // TCustomImplDS::TunnelEndDataRead TSyError TCustomImplDS::TunnelStartDataWrite() { // just pass on return apiStartDataWrite(); } // TCustomImplDS::TunnelStartDataWrite // helper routine for insert TSyError TCustomImplDS::TunnelInsertItemInternal(TMultiFieldItem *aItemP, ItemID aNewID) { string newid; TSyError sta = apiAddItem(*aItemP, newid); if (sta==LOCERR_OK) { if (aNewID) { aNewID->item = StrAlloc(newid.c_str()); aNewID->parent = NULL; // none } } return sta; } // TCustomImplDS::TunnelInsertItemInternal TSyError TCustomImplDS::TunnelInsertItem(cAppCharP aItemData, ItemID aID) { TMultiFieldItem *itemP = static_cast(newItemForRemote(ity_multifield)); TSyError sta = LOCERR_WRONGUSAGE; // no parseable data if (parseItemData(*itemP, aItemData, 0)) { // parsed some data, insert it sta = TunnelInsertItemInternal(itemP,aID); } // delete the item delete itemP; return sta; } // TCustomImplDS::TunnelInsertItem TSyError TCustomImplDS::TunnelInsertItemAsKey(KeyH aItemKey, ItemID aID) { return TunnelInsertItemInternal(reinterpret_cast(aItemKey)->getItem(),aID); } // TCustomImplDS::TunnelInsertItemAsKey // helper routine for update TSyError TCustomImplDS::TunnelUpdateItemInternal(TMultiFieldItem *aItemP, cItemID aID, ItemID aUpdID) { string updid; aItemP->setLocalID(aID->item); TSyError sta = apiUpdateItem(*aItemP); if (sta==LOCERR_OK) { if (aUpdID) { cAppCharP newID = aItemP->getLocalID(); if (strcmp(newID,aID->item)!=0) aUpdID->item = StrAlloc(newID); else aUpdID->item = NULL; aUpdID->parent = NULL; // none } } return sta; } // TCustomImplDS::TunnelUpdateItemInternal TSyError TCustomImplDS::TunnelUpdateItem(cAppCharP aItemData, cItemID aID, ItemID aUpdID) { TMultiFieldItem *itemP = static_cast(newItemForRemote(ity_multifield)); TSyError sta = LOCERR_WRONGUSAGE; // no parseable data if (parseItemData(*itemP, aItemData, 0)) { // parsed some data, insert it sta = TunnelUpdateItemInternal(itemP,aID,aUpdID); } // delete the item delete itemP; return sta; } // TCustomImplDS::TunnelUpdateItem TSyError TCustomImplDS::TunnelUpdateItemAsKey(KeyH aItemKey, cItemID aID, ItemID aUpdID) { return TunnelUpdateItemInternal(reinterpret_cast(aItemKey)->getItem(),aID,aUpdID); } // TCustomImplDS::TunnelUpdateItemAsKey TSyError TCustomImplDS::TunnelMoveItem(cItemID aID, cAppCharP newParID) { return LOCERR_NOTIMP; } // TCustomImplDS::TunnelMoveItem TSyError TCustomImplDS::TunnelDeleteItem(cItemID aID) { TMultiFieldItem *itemP = static_cast(newItemForRemote(ity_multifield)); itemP->setLocalID(aID->item); TSyError sta = apiDeleteItem(*itemP); delete itemP; return sta; } // TCustomImplDS::TunnelDeleteItem TSyError TCustomImplDS::TunnelEndDataWrite(bool aSuccess, appCharP *aNewToken) { string newToken; TSyError sta = apiEndDataWrite(newToken); if (aNewToken) { *aNewToken = StrAlloc(newToken.c_str()); } return sta; } // TCustomImplDS::TunnelEndDataWrite void TCustomImplDS::TunnelDisposeObj(void* aMemory) { // return string we have created as a plugin (is NULL safe) StrDispose(aMemory); } // TCustomImplDS::TunnelDisposeObj // Tunnel key factory method TSettingsKeyImpl *TCustomImplDS::newTunnelKey(TEngineInterface *aEngineInterfaceP) { return new TCustomDSTunnelKey(aEngineInterfaceP,this); } // TCustomImplDS::newTunnelKey // TTunnelKey // ---------- // constructor TCustomDSTunnelKey::TCustomDSTunnelKey( TEngineInterface *aEngineInterfaceP, TCustomImplDS *aCustomImplDsP ) : inherited(aEngineInterfaceP), fCustomImplDsP(aCustomImplDsP) { } // TCustomDSTunnelKey::TCustomDSTunnelKey // destructor - close key TCustomDSTunnelKey::~TCustomDSTunnelKey() { // closing key } // TCustomDSTunnelKey::~TCustomDSTunnelKey // open subkey by name (not by path!) // - this is the actual implementation TSyError TCustomDSTunnelKey::OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { if (strucmp(aName,"item",aNameSize)==0) { // make sure defaults are initialized fCustomImplDsP->setupTunnelTypes(); // create a sendable item TMultiFieldItem *itemP = static_cast(fCustomImplDsP->newItemForRemote(ity_multifield)); // wrap it into a item key aSettingsKeyP = new TMultiFieldItemKey(fEngineInterfaceP, itemP, true); // item is owned by key, which means that it will be deleted with key // done return LOCERR_OK; } else return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; } // TCustomDSTunnelKey::OpenSubKeyByName // - get item type name (if not written before, this will be the preferred type of the datastore) static TSyError readItemType( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TCustomImplDS *ds = static_cast(aStructFieldsKeyP)->getCustomImplDs(); // make sure defaults are initialized ds->setupTunnelTypes(); // get name of fLocalSendToRemoteTypeP return TStructFieldsKey::returnString(ds->getLocalSendType()->getTypeName(), aBuffer, aBufSize, aValSize); } // readItemType // - set item type static TSyError writeItemType( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TCustomImplDS *ds = static_cast(aStructFieldsKeyP)->getCustomImplDs(); cAppCharP p=cAppCharP(aBuffer); TSyncItemType *ty = ds->getSendType(p,NULL); if (!ty) return 404; // type not found ds->setupTunnelTypes(ty); // done return LOCERR_OK; } // writeItemType // accessor table for tunnel key values const TStructFieldInfo TunnelFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz { "itemtype", VALTYPE_TEXT, true, 0, 0, &readItemType, &writeItemType }, }; const sInt32 numTunnelFieldInfos = sizeof(TunnelFieldInfos)/sizeof(TStructFieldInfo); // get table describing the fields in the struct const TStructFieldInfo *TCustomDSTunnelKey::getFieldsTable(void) { return TunnelFieldInfos; } // TCustomDSTunnelKey::getFieldsTable sInt32 TCustomDSTunnelKey::numFields(void) { return numTunnelFieldInfos; } // TCustomDSTunnelKey::numFields #endif // DBAPI_TUNNEL_SUPPORT /* end of TCustomImplDS implementation */ } // namespace // eof syncevolution-1.5/src/synthesis/src/sysync/customimplds.h0000755000373300037200000012615612424517753025557 0ustar00nightlyallusers00000000000000/** * @File customimpl.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TCustomImplDS * Base class for customizable datastores (mainly extended DB mapping features * common to all derived classes like ODBC, DBAPI etc.). * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-12-05 : luz : separated from odbcapids */ #ifndef CUSTOMIMPLDS_H #define CUSTOMIMPLDS_H // includes #include "stdlogicds.h" #include "multifielditemtype.h" #include "customimplagent.h" #ifdef BASED_ON_BINFILE_CLIENT #include "binfileimplds.h" #else #ifdef BINFILE_ALWAYS_ACTIVE #error "BINFILE_ALWAYS_ACTIVE is only possible when BASED_ON_BINFILE_CLIENT" #endif #endif using namespace sysync; namespace sysync { #ifdef SCRIPT_SUPPORT // publish as derivates might need it extern const TFuncTable CustomDSFuncTable2; #endif // the datastore config // field mapping base class class TFieldMapItem : public TConfigElement { typedef TConfigElement inherited; public: TFieldMapItem(const char *aElementName, TConfigElement *aParentElement); virtual bool isArray(void) { return false; }; // - parser for extra attributes (for derived classes) virtual void checkAttrs(const char **aAttributes) { /* nop in base class */ }; // - field mode, here in base class to simplify things bool readable; // used to read (for SELECT) bool writable; // used to write (for UPDATE,INSERT) // - more detailed control bool for_insert; bool for_update; // - map as parameter (rather than literally inserting field values in INSERT and UPDATE statements) bool as_param; // - map as floating time field (will be written as-is, no conversion from/to DB time zone takes place) bool floating_ts; // - if set, this field's value needs to be saved for finalisation run at the very end of the sync session bool needs_finalisation; // - set number (for having different sets in different statement parts) uInt16 setNo; // - name of the field in SQL statements is the name of the item // - field ID in MultiFieldItem sInt16 fid; // - type // Note: Fields that are separate date/time in the DB but one // field in MultiFieldItem can be specified as dbft_date FIRST and // then as dbft_timefordate in this list, causing time to be combined // with date. TDBFieldType dbfieldtype; // database field type // - field size uInt32 maxsize; // number of chars field can hold (if string or BLOB), 0=unlimited bool notruncate; // set if this field should never be sent truncated by the remote }; // TFieldMapItem typedef std::list TFieldMapList; #ifdef ARRAYDBTABLES_SUPPORT class TFieldMappings; class TCustomDSConfig; // special field map item: Array map class TFieldMapArrayItem : public TFieldMapItem { typedef TFieldMapItem inherited; public: TFieldMapArrayItem(TCustomDSConfig *aCustomDSConfigP, TConfigElement *aParentElement); virtual ~TFieldMapArrayItem(); // properties // - the map for the fields in the array. fid of maps are used as base fid // if they do not reference array fields TFieldMapList fArrayFieldMapList; // - config of related datastore TCustomDSConfig *fCustomDSConfigP; // - base TFieldMappings %%% not used any more, we take it from fCustomDSConfigP //TFieldMappings *fBaseFieldMappings; // - referenced fieldlist %%% not used any more, we take it from fBaseFieldMappings // TFieldListConfig *fFieldListP; #ifdef OBJECT_FILTERING // - filter expression: // if filter evaluates as true, array is not written (or deleted at update) // if array has no items on read, filter is applied to item with makepass() string fNoItemsFilter; #endif #ifdef SCRIPT_SUPPORT // array record's scripts string fInitScript; string fAfterReadScript; string fBeforeWriteScript; string fAfterWriteScript; string fFinishScript; #endif // - repeating params sInt16 fMaxRepeat; // if==0, unlimited repeats (for array fields only) sInt16 fRepeatInc; // increment per repetition bool fStoreEmpty; // if set, empty leaf fields will also be stored in the array // Methods virtual bool isArray(void) { return true; }; virtual void clear(); protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); #ifdef SCRIPT_SUPPORT // process map scripts (resolve or rebuild them) bool fScriptsResolved; void ResolveArrayScripts(void); void expectScriptUnresolved(string &aTScript,sInt32 aLine, const TFuncTable *aContextFuncs); #endif }; // TFieldMapArrayItem #endif class TCustomDSConfig; class TFieldMappings: public TConfigElement { typedef TConfigElement inherited; public: TFieldMappings(const char* aName, TConfigElement *aParentElement); virtual ~TFieldMappings(); // properties // - the map itself TFieldMapList fFieldMapList; #ifdef SCRIPT_SUPPORT // - script that evaluates the syncset options such as STARTDATE() and ENDDATE() // and configures the DB such that the filtering takes place during fetch. // Must return TRUE if DB level filter can perform requested options string fOptionFilterScript; // - main record's scripts string fInitScript; string fAfterReadScript; string fBeforeWriteScript; string fAfterWriteScript; string fFinishScript; string fFinalisationScript; #endif // - a reference to a field list TFieldListConfig *fFieldListP; virtual void clear(); #ifdef SCRIPT_SUPPORT // processing of map scripts (resolve or rebuild them) virtual const TFuncTable *getDSFuncTableP(void); //%%% moved to fDSScriptsResolved: bool fScriptsResolved; //%%% moved to ResolveDSScripts: void ResolveMapScripts(void); #endif protected: #ifdef SCRIPT_SUPPORT void expectScriptUnresolved(string &aTScript,sInt32 aLine, const TFuncTable *aContextFuncs); #endif // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); }; // TFieldMappings class TCustomDSConfig: #ifdef BASED_ON_BINFILE_CLIENT public TBinfileDSConfig #else public TLocalDSConfig #endif { #ifdef BASED_ON_BINFILE_CLIENT typedef TBinfileDSConfig inherited; #else typedef TLocalDSConfig inherited; #endif public: TCustomDSConfig(const char* aName, TConfigElement *aParentElement); virtual ~TCustomDSConfig(); // properties // - if set, multi-folder (datastore consisting of multiple folders, such as email) // features are enabled for this datastore bool fMultiFolderDB; // - charset to be used in the data table TCharSets fDataCharSet; // - line end mode to be used in the data table for multiline data TLineEndModes fDataLineEndMode; // - if set, causes that data is read from DB first and then merged // with updated fields. Not needed in normal DBs that can // update a subset of all columns. bool fUpdateAllFields; // - Date/Time info bool fDataIsUTC; //%%% legacy flag for compatibility, superseded by fDataTimeZone timecontext_t fDataTimeZone; // time zone for storing/retrieving timestamps in DB bool fUserZoneOutput; // if set, all non-floating timestamps are moved to user time zone (probably from datatimezone) // - admin capability info bool fStoreSyncIdentifiers; // if set, database separately stores "last sync with data sent to remote" and "last suspend" identifiers (stored as string, not necessarily a date) #ifndef BINFILE_ALWAYS_ACTIVE bool fSyncTimeStampAtEnd; // if set, time point of sync is taken AFTER last write to DB (for single-user DBs like FMPro) bool fOneWayFromRemoteSupported; // if set, database has a separate "last sync with data sent to remote" timestamp bool fResumeSupport; // if set, admin tables have DS 1.2 support needed for resume (map entrytype, map flags, fResumeAlertCode, fLastSuspend, fLastSuspendIdentifier bool fResumeItemSupport; // if set, admin tables have support for storing data to resume a partially transferred item // - one-way support is always given for binfile based DS virtual bool isOneWayFromRemoteSupported() { return fOneWayFromRemoteSupported; } #endif // not BINFILE_ALWAYS_ACTIVE // - Database field to item field mappings TFieldMappings fFieldMappings; #ifdef SCRIPT_SUPPORT // provided to allow derivates to add API specific script functions to scripts called from CustomImplDS virtual const TFuncTable *getDSFuncTableP(void) { return &CustomDSFuncTable1; }; // - script called after admin data is loaded (before any data access takes place) string fAdminReadyScript; // - script called after sync with this datastore is ended (before writing the log) string fSyncEndScript; // - context for resolving scripts in datastore context TScriptContext *fResolveContextP; // - resolve DS scripts, this may be called before entire DS config is resolved to allow map's accessing local vars bool fDSScriptsResolved; void ResolveDSScripts(void); virtual void apiResolveScripts(void) { /* nop here */ }; #endif // factory functions for field map items virtual TFieldMapItem *newFieldMapItem(const char *aElementName, TConfigElement *aParentElement) { return new TFieldMapItem(aElementName,aParentElement); }; #ifdef ARRAYDBTABLES_SUPPORT virtual TFieldMapArrayItem *newFieldMapArrayItem(TCustomDSConfig *aCustomDSConfig, TConfigElement *aParentElement) { return new TFieldMapArrayItem(aCustomDSConfig,aParentElement); }; #endif // returns false for datastores that are not abstract, i.e. have a backend implementation (=all stdlogicds derivates) virtual bool isAbstractDatastore(void) { return false; }; // customimplds is the foundation for a implemented backend - so it is no longer abstract protected: // Add (probably datastore-specific) limits such as MaxSize and NoTruncate to types virtual void addTypeLimits(TLocalEngineDS *aLocalDatastoreP, TSyncSession *aSessionP); // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void clear(); virtual void localResolve(bool aLastPass); }; // TCustomDSConfig #ifndef BINFILE_ALWAYS_ACTIVE // getitem phase typedef enum { gph_deleted, gph_added_changed, gph_done } TGetPhases; /// Map flags #define mapflag_useforresume 0x00000001 ///< set on map items that were marked for resume in the previous session #define mapflag_pendingMapStatus 0x00000002 ///< set on pending maps that have been sent, but not seen status yet #define mapflag_pendingStatus 0x00000004 ///< set on map items that have generated a add/update/move, but not seen status yet #define mapflag_pendingDeleteStatus 0x00000008 ///< set on map items that have generated a delete, but not seen status yet #define mapflag_pendingAddConfirm 0x00000010 ///< set on items that have generated a add op, and have not yet received full confirmation (=status for client, =map for server) #define mapflag_resend 0x00000020 ///< set on items that should be re-sent to remote in next session /// Map entry types typedef enum { mapentry_invalid, ///< should not ever be present mapentry_normal, ///< normal localID to remoteID map item mapentry_tempidmap, ///< pseudo-map items that is not a local/remote maps, but saved local/adjustedLocal map (server only) mapentry_pendingmap, ///< pseudo-map item that represents pending maps to be sent after resume (client only) numMapEntryTypes } TMapEntryType; #ifdef SYDEBUG extern const char * const MapEntryTypeNames[]; #endif /// local in-memory map entry /// @Note This mapentry can hold main maps, as well as tempGUID and pendingMap pseudo maps typedef struct { TMapEntryType entrytype; ///< type of mapentry string localid; ///< localID string remoteid; ///< remoteID uInt32 mapflags; ///< mapflag_xxxx bool changed; ///< set for map items changed in this session bool deleted; ///< set for map items deleted in this session bool added; ///< set for map items added in this session bool markforresume; ///< set for map items that must be saved with mapflag_useforresume bool savedmark; ///< set for map items that are already saved with mapflag_useforresume (optimisation) } TMapEntry; // container for map entries typedef list TMapContainer; #endif // BINFILE_ALWAYS_ACTIVE // local SyncSet entry typedef struct { string localid; string containerid; // for multi-folder DBs bool isModified; // set if modified since last sync bool isModifiedAfterSuspend; // set if modified since last suspend // optional item contents (depends on implementation of ReadSyncSet()) TMultiFieldItem *itemP; } TSyncSetItem; // container for sync set information typedef list TSyncSetList; // container for finalisation typedef list TMultiFieldItemList; class TDBItemKey; class TCustomImplDS: #ifdef BASED_ON_BINFILE_CLIENT public TBinfileImplDS #else public TStdLogicDS #endif { #ifdef BASED_ON_BINFILE_CLIENT typedef TBinfileImplDS inherited; #else typedef TStdLogicDS inherited; #endif friend class TCustomDSfuncs; friend class TCustomCommonFuncs; friend class TDBItemKey; friend class TCustomDSTunnelKey; private: void InternalResetDataStore(void); // reset for re-use without re-creation protected: /// @name dsSavedAdmin administrative data (anchors, timestamps, maps) as saved or to-be-saved /// @Note These will be loaded and saved be derived classes /// @Note Some of these will be updated from resp. @ref dsCurrentAdmin members at distinct events (suspend, session end, etc.) /// @Note Some of these will be updated during the session, but in a way that does NOT affect the anchoring of current/last session // /// @{ /// Reference time of previous sync which sent data to remote to compare modification dates against /// @note normally==fPreviousSyncTime, but can be end of sync for datastore that can't write modified timestamps at will #ifndef BASED_ON_BINFILE_CLIENT /// @note for BASED_ON_BINFILE_CLIENT case, these already exist at the binfile level, so we MUST NOT have them here again!! /// @note if binfile is there, but disabled, we still dont need these member vars. lineartime_t fPreviousToRemoteSyncCmpRef; /// Reference string used by database API level to determine modifications since last to-remote-sync string fPreviousToRemoteSyncIdentifier; /// Reference time of last suspend, needed to detect modifications that took place between last suspend and current resume lineartime_t fPreviousSuspendCmpRef; /// Reference string used by database API level to detect modifications that took place between last suspend and current resume string fPreviousSuspendIdentifier; /// @} /// @name dsCurrentAdmin current session's admin data (anchors, timestamps, maps) /// @Note These will be copied to @ref dsSavedAdmin members ONLY when a session completes successfully/suspends. /// @Note Admin data is NEVER directly saved or loaded from these /// @Note Derivates will update some of these at dssta_adminready with current time/anchor values // /// @{ /// Reference time of current sync to compare modification dates against /// @note initially==fCurrentSyncTime, but might be set to end-of-session time for databases which cannot explicitly set modification timestamps lineartime_t fCurrentSyncCmpRef; /// Reference string returned by database API level identifying this session's time (for detecting changes taking place after this session) string fCurrentSyncIdentifier; /// @} #endif public: TCustomImplDS( TCustomDSConfig *aConfigP, sysync::TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual void announceAgentDestruction(void); virtual void dsResetDataStore(void) { InternalResetDataStore(); inherited::dsResetDataStore(); }; virtual ~TCustomImplDS(); /// @name apiXXXX methods defining the interface from TCustomImplDS to TXXXApi actual API implementations /// @{ // #ifndef BINFILE_ALWAYS_ACTIVE /// @brief Load admin data from database /// @param aDeviceID[in] remote device URI (device ID) /// @param aDatabaseID[in] local database ID /// @param aRemoteDBID[in] database ID of remote device /// Must search for existing target record matching the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// - if there is a matching record: load it /// - if there is no matching record, set fFirstTimeSync=true. The implementation may already create a /// new record with the key (aDeviceID,aDatabaseID,aRemoteDBID) and initialize it with the data from /// the items as shown below. At least, fTargetKey must be set to a value that will allow apiSaveAdminData to /// update the record. In case implementation chooses not create the record only in apiSaveAdminData, it must /// buffer the triple (aDeviceID,aDatabaseID,aRemoteDBID) such that it is available at apiSaveAdminData. /// If a record exists implementation must load the following items: /// - fTargetKey = some key value that can be used to re-identify the target record later at SaveAdminData. /// If the database implementation has other means to re-identify the target, this can be /// left unassigned. /// - fLastRemoteAnchor = anchor string used by remote party for last session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of last session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT). Needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must load all map entries /// related to the current sync target identified by the triple of (aDeviceID,aDatabaseID,aRemoteDBID) /// or by fTargetKey. The entries added to fMapTable must have "changed", "added" and "deleted" flags /// set to false. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps = map. The implementation must load all all pending maps (client only) into /// fPendingAddMaps (and fUnconfirmedMaps must be left empty). /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) virtual localstatus apiLoadAdminData( const char *aDeviceID, // remote device URI (device ID) const char *aDatabaseID, // database ID const char *aRemoteDBID // database ID of remote device ) = 0; /// @brief Save admin data to database /// @param[in] aSessionFinished if true, this is a end-of-session save (and not only a suspend save) - but not necessarily a successful one /// @param[in] aSuccessful if true, this is a successful end-of-session /// Must save to the target record addressed at LoadAdminData() by the triple (aDeviceID,aDatabaseID,aRemoteDBID) /// Implementation must save the following items: /// - fLastRemoteAnchor = anchor string used by remote party for this session (and saved to DB then) /// - fPreviousSyncTime = anchor (beginning of session) timestamp of this session. /// - fPreviousToRemoteSyncCmpRef = Reference time to determine items modified since last time sending data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT) /// - fPreviousToRemoteSyncIdentifier = string identifying last session that sent data to remote /// (or last changelog update in case of BASED_ON_BINFILE_CLIENT). Needs only be saved /// if derived datastore cannot work with timestamps and has its own identifier. /// - fMapTable = list containing map entries. The implementation must save all map entries /// that have changed, are new or are deleted. See below for additional resume requirements. /// For resumable datastores: /// - fMapTable = In addition to the above, the markforresume flag must be saved in the mapflags // when it is not equal to the savedmark flag - independently of added/deleted/changed. /// - fResumeAlertCode = alert code of current suspend state, 0 if none /// - fPreviousSuspendCmpRef = reference time of last suspend (used to detect items modified during a suspend / resume) /// - fPreviousSuspendIdentifier = identifier of last suspend (used to detect items modified during a suspend / resume) /// (needs only be saved if derived datastore cannot work with timestamps and has /// its own identifier) /// - fPendingAddMaps and fUnconfirmedMaps = map. The implementation must save all entries as /// pending maps (client only). localIDs might be temporary, so call dsFinalizeLocalID() to /// ensure these are final. /// - fTempGUIDMap = map. The implementation must save all entries as temporary LUID to GUID mappings /// (server only) virtual localstatus apiSaveAdminData(bool aSessionFinished, bool aSuccessful) = 0; #endif // BINFILE_ALWAYS_ACTIVE /// allow early data access start (if datastore is configured for it) virtual localstatus apiEarlyDataAccessStart(void) { return LOCERR_OK; /* nop if not overridden */ }; /// read sync set IDs and mod dates. /// @param[in] if set, all data fields are needed, so ReadSyncSet MAY /// read items here already. Note that ReadSyncSet MAY read items here /// even if aNeedAll is not set (if it is more efficient than reading /// them separately afterwards). virtual localstatus apiReadSyncSet(bool aNeedAll) = 0; /// Zap all data in syncset (note that everything outside the sync set will remain intact) virtual localstatus apiZapSyncSet(void) = 0; virtual bool apiNeedSyncSetToZap(void) = 0; // derivate must define this so we can prepare the sync set before zapping if needed /// fetch record contents from DB by localID. virtual localstatus apiFetchItem(TMultiFieldItem &aItem, bool aReadPhase, TSyncSetItem *aSyncSetItemP) = 0; /// add new item to datastore, returns created localID virtual localstatus apiAddItem(TMultiFieldItem &aItem, string &aLocalID) = 0; /// update existing item in datastore, returns 404 if item not found virtual localstatus apiUpdateItem(TMultiFieldItem &aItem) = 0; /// delete existing item in datastore, returns 211 if not existing any more virtual localstatus apiDeleteItem(TMultiFieldItem &aItem) = 0; /// end of syncset reading phase virtual localstatus apiEndDataRead(void) = 0; /// start of write virtual localstatus apiStartDataWrite(void) = 0; #ifdef __clang__ /// Same name as in TBinfileImplDS. Tell clang compiler to ignore that name clash, /// it is okay here. #pragma clang diagnostic push #pragma clang diagnostic ignored "-Woverloaded-virtual" #endif /// end DB data write sequence (but not yet admin data) virtual localstatus apiEndDataWrite(string &aThisSyncIdentifier) = 0; #ifdef __clang__ #pragma clang diagnostic pop #endif /// @} #ifdef DBAPI_TUNNEL_SUPPORT /// @name TunnelXXX methods allowing abstracted access to datastores from UIApi from within a tunnel session /// @{ // virtual TSyError TunnelStartDataRead(cAppCharP aLastToken, cAppCharP aResumeToken); virtual TSyError TunnelReadNextItem(ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst); virtual TSyError TunnelReadItem(cItemID aID, appCharP *aItemData); virtual TSyError TunnelEndDataRead(); virtual TSyError TunnelStartDataWrite(); virtual TSyError TunnelInsertItem(cAppCharP aItemData, ItemID aID); virtual TSyError TunnelUpdateItem(cAppCharP aItemData, cItemID aID, ItemID aUpdID); virtual TSyError TunnelMoveItem(cItemID aID, cAppCharP aNewParID); virtual TSyError TunnelDeleteItem(cItemID aID); virtual TSyError TunnelEndDataWrite(bool aSuccess, appCharP *aNewToken); virtual void TunnelDisposeObj(void* aMemory); virtual TSyError TunnelReadNextItemAsKey(ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst); virtual TSyError TunnelReadItemAsKey(cItemID aID, KeyH aItemKey); virtual TSyError TunnelInsertItemAsKey(KeyH aItemKey, ItemID aID); virtual TSyError TunnelUpdateItemAsKey(KeyH aItemKey, cItemID aID, ItemID aUpdID); virtual TSettingsKeyImpl *newTunnelKey(TEngineInterface *aEngineInterfaceP); // helpers void setupTunnelTypes(TSyncItemType *aItemTypeP=NULL); /// @} #endif public: /// @name dsXXXX virtuals defined by TLocalEngineDS /// These are usually designed such that they should always call inherited::dsXXX to let the entire chain /// of ancestors see the calls /// @{ // /// end of message handling virtual void dsEndOfMessage(void); /// inform logic of coming state change virtual localstatus dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); /// inform logic of happened state change virtual localstatus dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); #ifndef BINFILE_ALWAYS_ACTIVE /// called to confirm a sync operation's completion (ok status from remote received) /// @note aSyncOp passed not necessarily reflects what was sent to remote, but what actually happened virtual void dsConfirmItemOp(TSyncOperation aSyncOp, cAppCharP aLocalID, cAppCharP aRemoteID, bool aSuccess, localstatus aErrorStatus=0); #endif // BINFILE_ALWAYS_ACTIVE /// @} /// @name dsHelpers private/protected helper routines /// @{ // private: /// private helper to prepare for apiSaveAdminData() localstatus SaveAdminData(bool aSessionFinished, bool aSuccessful); /// @} // agent TCustomImplAgent *fAgentP; // access to agent (casted fSessionP for convenience) // config (typed pointers for convenience) TCustomDSConfig *fConfigP; TCustomAgentConfig *fAgentConfigP; protected: // some vars sInt16 fArrIdx; #ifdef SCRIPT_SUPPORT // - temp vars while running scripts string fParentKey; bool fWriting; bool fInserting; bool fDeleting; #endif #ifdef ARRAYDBTABLES_SUPPORT bool fHasArrayFields; // set if array table access needed #endif bool fNeedFinalisation; // set if fields which need finalisation exist in field mappings // script context #ifdef SCRIPT_SUPPORT TScriptContext *fScriptContextP; virtual void apiRebuildScriptContexts(void) { /* nop here */ }; #endif // Simple custom DB access interface methods // - returns true if database implementation can only update all fields of a record at once virtual bool dsReplaceWritesAllDBFields(void); #ifndef BINFILE_ALWAYS_ACTIVE // - returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps, tempGUIDs) virtual bool dsResumeSupportedInDB(void); // - returns true if DB implementation supports resuming in midst of a chunked item (can save fPIxxx.. and related admin data) virtual bool dsResumeChunkedSupportedInDB(void); #endif // not BINFILE_ALWAYS_ACTIVE #ifdef OBJECT_FILTERING // - returns true if DB implementation can also apply special filters like CGI-options // /dr(x,y) etc. during fetching virtual bool dsOptionFilterFetchesFromDB(void); #endif /// @name implXXX methods used when based on StdLogicDS /// @{ /// @brief sync login (into this database) /// @note also exists in BASED_ON_BINFILE_CLIENT, will do the job together with /// inhertited binfile version (instead of using DB api) /// @note might be called several times (auth retries at beginning of session) /// @note must update the following state variables /// - in TLocalEngineDS: fLastRemoteAnchor, fLastLocalAnchor, fResumeAlertCode, fFirstTimeSync /// - for client: fPendingAddMaps /// - for server: fTempGUIDMap /// - in TStdLogicDS: fPreviousSyncTime, fCurrentSyncTime /// - in derived classes: whatever else belongs to dsSavedAdmin and dsCurrentAdmin state /// (for example fTargetKey, fFolderKey) virtual localstatus implMakeAdminReady( const char *aDeviceID, ///< remote device URI (device ID) const char *aDatabaseID, ///< database ID const char *aRemoteDBID ///< database ID of remote device ); /// save end of session state /// @note also exists in BASED_ON_BINFILE_CLIENT, will do the job together with /// inhertited binfile version (instead of using DB api) virtual localstatus implSaveEndOfSession(bool aUpdateAnchors); /// start data read /// @note: fSlowSync and fRefreshOnly must be valid before calling this method virtual localstatus implStartDataRead(); /// end of read /// @note also exists in BASED_ON_BINFILE_CLIENT, will do the job together with /// inhertited binfile version. virtual localstatus implEndDataRead(void); /// start of write /// @note also exists in BASED_ON_BINFILE_CLIENT, will do the job together with /// inhertited binfile version. virtual localstatus implStartDataWrite(void); /// end write sequence /// @note also exists in BASED_ON_BINFILE_CLIENT, will do the job together with /// inhertited binfile version. virtual bool implEndDataWrite(void); #ifdef BASED_ON_BINFILE_CLIENT /// when based on binfile client, we need the syncset loaded when binfile is active bool implNeedSyncSetToRetrieve(void) { return binfileDSActive(); }; /// when based on binfile client, we can't track syncop changes (like having the DB report /// items as added again when stdlogic filters have decided they fell out of the syncset) virtual bool implTracksSyncopChanges(void) { return !binfileDSActive(); }; #else bool implNeedSyncSetToRetrieve(void) { return false; }; // non-binfiles don't need the syncset to retrieve virtual bool implTracksSyncopChanges(void) { return true; }; // non-binfile custimpls are capable of this #endif #ifndef BINFILE_ALWAYS_ACTIVE /// get item from DB virtual localstatus implGetItem( bool &aEof, bool &aChanged, TSyncItem* &aSyncItemP ); /// review reported entry (allows post-processing such as map deleting) /// MUST be called after implStartDataWrite, before any actual writing, /// for each item obtained in implGetItem virtual localstatus implReviewReadItem( TSyncItem &aItem // the item ); /// called to set maps. /// @note aLocalID or aRemoteID can be NULL - which signifies deletion of a map entry /// @note that this might be needed for clients accessing a server-style database as well virtual localstatus implProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID); /// retrieve specified item from database virtual bool implRetrieveItemByID( TSyncItem &aItem, // the item TStatusCommand &aStatusCommand ); virtual localstatus logicDeleteItemByID(TSyncItem &aSyncItem) { return apiDeleteItem((TMultiFieldItem &)aSyncItem); } /// process item (according to operation: add/delete/replace - and for future: copy/move) virtual bool implProcessItem( TSyncItem *aItemP, // the item TStatusCommand &aStatusCommand ); /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void implMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent); /// called to mark an already sent item as "to-be-resent", e.g. due to temporary /// error status conditions, by localID or remoteID (latter only in server case). virtual void implMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID); /// called to have all non-yet-generated sync commands as "to-be-resumed" virtual void implMarkOnlyUngeneratedForResume(void); /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume() and markItemForResume()) /// (or, in case the session is really complete, make sure that no resume state is left) virtual localstatus implSaveResumeMarks(void); /// @} #endif // not BINFILE_ALWAYS_ACTIVE #ifdef BASED_ON_BINFILE_CLIENT /// @name methods used when based on BinfileImplDS /// @{ #ifndef CHANGEDETECTION_AVAILABLE #error "CustomImplDS can be built only on BinFileImplDS with CHANGEDETECTION_AVAILABLE" #endif /// get first item's ID and modification status from the sync set /// @return false if no item found virtual bool getFirstItemInfo(localid_out_t &aLocalID, bool &aItemHasChanged); /// get next item's ID and modification status from the sync set. /// @return false if no item found virtual bool getNextItemInfo(localid_out_t &aLocalID, bool &aItemHasChanged); /// get first item from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return false if no item found virtual bool getFirstItem(TSyncItem *&aItemP); /// get next item from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return false if no item found virtual bool getNextItem(TSyncItem *&aItemP); /// get item by local ID from the sync set. Caller obtains ownership if aItemP is not NULL after return /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus getItemByID(localid_t aLocalID, TSyncItem *&aItemP); /* no need to implement these here, calling API level directly from binfile is enough /// signal start of data write phase virtual localstatus apiStartDataWrite(void); /// signal end of data write phase virtual localstatus apiEndDataWrite(void); */ /// update item by local ID in the sync set. Caller retains ownership of aItemP /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus updateItemByID(localid_t aLocalID, TSyncItem *aItemP); /// delete item by local ID in the sync set. /// @return != LOCERR_OK if item with specified ID is not found. virtual localstatus deleteItemByID(localid_t aLocalID); /// create new item in the sync set. Caller retains ownership of aItemP. /// @return LOCERR_OK or error code. /// @param[out] aNewLocalID local ID assigned to new item /// @param[out] aReceiveOnly is set to true if local changes/deletion of this item should not be /// reported to the server in normal syncs. virtual localstatus createItem(TSyncItem *aItemP,localid_out_t &aNewLocalID, bool &aReceiveOnly); /// zaps the entire datastore, returns LOCERR_OK if ok /// @return LOCERR_OK or error code. virtual localstatus zapDatastore(void); /// @} #endif // BASED_ON_BINFILE_CLIENT protected: // - helper for getting a base field pointer (not resolved down to array element) TItemField *getMappedBaseFieldOrVar(TMultiFieldItem &aItem, sInt16 aFid); // - helper for getting a field pointer (local script var or item's field) TItemField *getMappedFieldOrVar(TMultiFieldItem &aItem, sInt16 aFid, sInt16 aRepOffset, bool aExistingOnly=false); // In-memory map and syncset access // - mark all map entries as deleted bool deleteAllMaps(void); // - delete syncset void DeleteSyncSet(bool aContentsOnly=false); // - get container ID for specified localid bool getContainerID(const char *aLocalID, string &aContainerID); // - delete sync set one by one localstatus zapSyncSetOneByOne(void); // - Queue the data needed for finalisation (usually - relational link updates) // as a item copy with only finalisation-required fields void queueForFinalisation(TMultiFieldItem *aItemP); public: // - get last to-remote sync time lineartime_t getPreviousToRemoteSyncCmpRef(void) { return fPreviousToRemoteSyncCmpRef; }; lineartime_t getPreviousSuspendCmpRef(void) { return fPreviousSuspendCmpRef; }; // - get syncset list TSyncSetList *getSyncSetList(void) { return &fSyncSetList; }; // - find entry in sync set by localid TSyncSetList::iterator findInSyncSet(const char *aLocalID); protected: #ifndef BINFILE_ALWAYS_ACTIVE // - find non-deleted map entry by local ID / entry type TMapContainer::iterator findMapByLocalID(const char *aLocalID,TMapEntryType aEntryType, bool aDeletedAsWell=false); // - find map entry by remote ID TMapContainer::iterator findMapByRemoteID(const char *aRemoteID); // - modify map, if remoteID or localID is NULL or empty, map item will be deleted (if it exists at all) void modifyMap(TMapEntryType aEntryType, const char *aLocalID, const char *aRemoteID, uInt32 aMapFlags, bool aDelete, uInt32 aClearFlags=0xFFFFFFFF); #endif // not BINFILE_ALWAYS_ACTIVE #ifdef SYSYNC_SERVER // - called when a item in the sync set changes its localID (due to local DB internals) // Datastore must make sure that possibly cached items get updated virtual void dsLocalIdHasChanged(const char *aOldID, const char *aNewID); #endif // SYSYNC_SERVER // - target key (if needed by descendant) string fTargetKey; // - folder key (key value for subselecting in datastore, determined at implMakeAdminReady()) string fFolderKey; // local list of local IDs/mod timestamps of current sync set for speedup and avoiding LEFT OUTER JOIN TSyncSetList fSyncSetList; // - iterator for reporting new and added items in GetItem TSyncSetList::iterator fSyncSetPos; // - list of items that must be processed in finalisation at end of sync TMultiFieldItemList fFinalisationQueue; #ifndef BINFILE_ALWAYS_ACTIVE // local map list TMapContainer fMapTable; // - iterator for reporting deleted items in GetItem TMapContainer::iterator fDeleteMapPos; bool fReportDeleted; TGetPhases fGetPhase; // phase of get bool fGetPhasePrepared; // set if phase is prepared (select or list iterator init) #endif // BINFILE_ALWAYS_ACTIVE #ifdef BASED_ON_BINFILE_CLIENT bool fSyncSetLoaded; // set if sync set is currently loaded localstatus makeSyncSetLoaded(bool aNeedAll); #endif // BASED_ON_BINFILE_CLIENT localstatus getItemFromSyncSetItem(TSyncSetItem *aSyncSetItemP, TSyncItem *&aItemP); bool fNoSingleItemRead; // if set, syncset list will also contain items bool fMultiFolderDB; // if set, we need the syncset list for finding container IDs later #ifdef SCRIPT_SUPPORT bool fOptionFilterTested; bool fOptionFilterWorksOnDBLevel; // set if option filters can be executed by DB #endif // SCRIPT_SUPPORT #ifdef DBAPI_TUNNEL_SUPPORT // Tunnel DB access support bool fTunnelReadStarted; bool generateTunnelItemData(bool aAssignedOnly, TMultiFieldItem *aItemP, string &aDataFields); bool parseTunnelItemData(TMultiFieldItem &aItem, const char *aItemData); TSyError TunnelReadNextItemInternal(ItemID aID, TSyncItem *&aItemP, sInt32 *aStatus, bool aFirst); TSyError TunnelInsertItemInternal(TMultiFieldItem *aItemP, ItemID aNewID); TSyError TunnelUpdateItemInternal(TMultiFieldItem *aItemP, cItemID aID, ItemID aUpdID); #endif // DBAPI_TUNNEL_SUPPORT #ifdef DBAPI_TEXTITEMS // Text item handling // - store itemdata field into named TItemField (derived DBApi store will override this with DB-mapped version) virtual bool storeField( const char *aName, const char *aParams, const char *aValue, TMultiFieldItem &aItem, uInt16 aSetNo, sInt16 aArrayIndex ); // - parse itemdata into item (generic, using virtual storeField() for actually finding field by name) bool parseItemData( TMultiFieldItem &aItem, const char *aItemData, uInt16 aSetNo ); // - generate text data for one field (common for Tunnel and DB API) bool generateItemFieldData( bool aAssignedOnly, TCharSets aDataCharSet, TLineEndModes aDataLineEndMode, timecontext_t aTimeContext, TItemField *aBasefieldP, cAppCharP aBaseFieldName, string &aDataFields ); #endif // DBAPI_TEXTITEMS #if (defined(DBAPI_ASKEYITEMS) || defined(DBAPI_TUNNEL_SUPPORT)) && defined(ENGINEINTERFACE_SUPPORT) TDBItemKey *newDBItemKey(TMultiFieldItem *aItemP, bool aOwnsItem=false); #endif // (DBAPI_ASKEYITEMS or DBAPI_TUNNEL_SUPPORT) and ENGINEINTERFACE_SUPPORT }; // TCustomImplDS #ifdef DBAPI_TEXTITEMS // helper to process params // - if aParamName!=NULL, it searches for the value of the requested parameter and returns != NULL, NULL if none found // - if aParamName==NULL, it scans until all params are skipped and returns end of params cAppCharP paramScan(cAppCharP aParams,cAppCharP aParamName, string &aValue); #endif // DBAPI_TEXTITEMS #if (defined(DBAPI_ASKEYITEMS) || defined(DBAPI_TUNNEL_SUPPORT)) && defined(ENGINEINTERFACE_SUPPORT) // key for access to a item using the settings key API class TDBItemKey : public TItemFieldKey { typedef TItemFieldKey inherited; public: TDBItemKey(TEngineInterface *aEngineInterfaceP, TMultiFieldItem *aItemP, TCustomImplDS *aCustomImplDS, bool aOwnsItem=false) : inherited(aEngineInterfaceP), fCustomImplDS(aCustomImplDS), fItemP(aItemP), fOwnsItem(aOwnsItem) {}; virtual ~TDBItemKey() { forgetItem(); }; TMultiFieldItem *getItem(void) { return fItemP; }; void setItem(TMultiFieldItem *aItemP, bool aPassOwner=false); protected: // methods to actually access a TItemField virtual sInt16 getFidFor(cAppCharP aName, stringSize aNameSz); virtual bool getFieldNameFromFid(sInt16 aFid, string &aFieldName); virtual TItemField *getBaseFieldFromFid(sInt16 aFid); // the datastore TCustomImplDS *fCustomImplDS; // the item being accessed TMultiFieldItem *fItemP; bool fOwnsItem; // iterator TFieldMapList::iterator fIterator; private: void forgetItem() { if (fOwnsItem && fItemP) { delete fItemP; } fItemP=NULL; }; }; // TDBItemKey #endif // (DBAPI_ASKEYITEMS or DBAPI_TUNNEL_SUPPORT) and ENGINEINTERFACE_SUPPORT #ifdef DBAPI_TUNNEL_SUPPORT // tunnel DB API parameters class TCustomDSTunnelKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TCustomDSTunnelKey(TEngineInterface *aEngineInterfaceP, TCustomImplDS *aCustomImplDsP); virtual ~TCustomDSTunnelKey(); TCustomImplDS *getCustomImplDs(void) { return fCustomImplDsP; } protected: // open subkey by name (not by path!) // - this is the actual implementation virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ); // field access const TStructFieldInfo *getFieldsTable(void); sInt32 numFields(void); // fields TCustomImplDS *fCustomImplDsP; }; // TCustomDSTunnelKey #endif // DBAPI_TUNNEL_SUPPORT } // namespace sysync #endif // CUSTOMIMPLDS_H // eof syncevolution-1.5/src/synthesis/src/sysync/dataconversion.cpp0000644000373300037200000001366312424517753026401 0ustar00nightlyallusers00000000000000#include #include #include using namespace sysync; namespace sysync { class TDummyLocalDSConfig : public TLocalDSConfig { public: TDummyLocalDSConfig(TConfigElement *element) : TLocalDSConfig("dummy", element) {} virtual TLocalEngineDS* newLocalDataStore(sysync::TSyncSession*) { return NULL; } }; class TDummyTLocalEngineDS : public TLocalEngineDS { public: TDummyTLocalEngineDS(TLocalDSConfig *config, TSyncSession *session) : TLocalEngineDS(config, session, "dummy") {} virtual bool logicProcessRemoteItem(TSyncItem*, TStatusCommand&, bool&, std::string*) { return false; } virtual bool logicRetrieveItemByID(TSyncItem&, TStatusCommand&) { return false; } #ifdef SYSYNC_CLIENT virtual bool logicGenerateSyncCommandsAsClient(TSmlCommandPContainer&, TSmlCommand*&, const char*) { return false; } #endif #ifdef SYSYNC_SERVER virtual bool logicGenerateSyncCommandsAsServer(TSmlCommandPContainer &, TSmlCommand * &, const char *) { return false; } #endif virtual void logicMarkOnlyUngeneratedForResume() {} virtual void logicMarkItemForResume(const char*, const char*, bool) {} virtual void logicMarkItemForResend(const char*, const char*) {} #ifdef SYSYNC_SERVER virtual TSyncItem *getConflictingItemByRemoteID(TSyncItem *syncitemP) { return NULL; } virtual TSyncItem *getConflictingItemByLocalID(TSyncItem *syncitemP) { return NULL; } virtual TSyncItem *getMatchingItem(TSyncItem *syncitemP, TEqualityMode aEqMode) { return NULL; } virtual void dontSendItemAsServer(TSyncItem *syncitemP) {} virtual void SendItemAsServer(TSyncItem *aSyncitemP) {} virtual localstatus logicProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) { return 0; } #endif }; bool DataConversion(SessionH aSession, const char *aFromTypeName, const char *aToTypeName, std::string &aItemData) { bool res = false; TProfileHandler *fromProfile = NULL; TProfileHandler *toProfile = NULL; TSyncItemType *fromItemType = NULL; TSyncItemType *toItemType = NULL; TSyncItem *fromItem = NULL; TSyncItem *toItem = NULL; SmlItemPtr_t smlitem = NULL; TSyncSession *session = reinterpret_cast(aSession); TConfigElement dummyElement("dummy", NULL); class TDummyLocalDSConfig dummyConfig(&dummyElement); class TDummyTLocalEngineDS dummy(&dummyConfig, session); // Temporarily disable per-session workarounds for our peer's // time handling. Eventually we want to make this configurable // per function call, not per session, but for that more // code restructuring is necessary. bool oldRemoteCanHandleUTC = session->fRemoteCanHandleUTC; session->fRemoteCanHandleUTC = true; timecontext_t oldUserTimeContext = session->fUserTimeContext; session->fUserTimeContext = TCTX_UNKNOWN; SYSYNC_TRY { TRootConfig *config = session->getRootConfig(); TDatatypesConfig *types = config->fDatatypesConfigP; TDataTypeConfig *fromTypeConfig = types->getDataType(aFromTypeName); TDataTypeConfig *toTypeConfig = types->getDataType(aToTypeName); TStatusCommand statusCmd(session); if (!fromTypeConfig) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("%s: unknown type", aFromTypeName)); goto done; } if (!toTypeConfig) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("%s: unknown type", aToTypeName)); goto done; } fromItemType = fromTypeConfig->newSyncItemType(session, NULL); toItemType = toTypeConfig->newSyncItemType(session, NULL); if (!fromItemType || !toItemType) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("could not create item types")); goto done; } // parse data and create item from it smlitem = newItem(); if (!smlitem) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("SML item allocation failed")); goto done; } smlitem->data = newPCDataStringX(reinterpret_cast(aItemData.c_str()), true, aItemData.size()); if (!smlitem->data) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("SML data allocation failed")); goto done; } fromItem = fromItemType->newSyncItem(smlitem, sop_replace, fmt_chr, fromItemType, &dummy, statusCmd); smlFreeItemPtr(smlitem); smlitem = NULL; if (!fromItem) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("could not parse data as %s", aFromTypeName)); goto done; } // create item of target format, fill it with the parsed data, then encode toItem = toItemType->newSyncItem(toItemType, &dummy); if (!toItem) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("could not allocate item")); goto done; } if (!toItem->replaceDataFrom(*fromItem)) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("%s and %s are not compatible", aFromTypeName, aToTypeName)); goto done; } smlitem = toItemType->newSmlItem(toItem, &dummy); if (!smlitem) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("could not encode data as %s", aToTypeName)); goto done; } stringSize size; const char *data = smlPCDataToCharP(smlitem->data, &size); if (!data && size) { LOGDEBUGPRINTFX(session->getDbgLogger(), DBG_PARSE, ("string allocation failed")); goto done; } aItemData.assign(data, size); res = true; } SYSYNC_CATCH (...) // TODO: error logging res = false; SYSYNC_ENDCATCH done: if (smlitem) smlFreeItemPtr(smlitem); delete fromItem; delete toItem; delete fromProfile; delete toProfile; delete fromItemType; delete toItemType; session->fRemoteCanHandleUTC = oldRemoteCanHandleUTC; session->fUserTimeContext = oldUserTimeContext; return res; } } // namespace sysync syncevolution-1.5/src/synthesis/src/sysync/dataobjtype.cpp0000755000373300037200000007731412424517753025676 0ustar00nightlyallusers00000000000000/* * File: DataObjType.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * TDataObjType * base class for data object based items (EMAILOBJ, FILEOBJ, FOLDEROBJ) * implemented for OMA DS V1.2 * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * 2005-07-20 : bfo : created from TextItemType * */ // includes #include "prefix_file.h" #include "sysync.h" #include "dataobjtype.h" using namespace sysync; namespace sysync { const char* BeginCDATA= ""; const char* LowerCDATA= "]]]]>> const char* nam = getAttr(aAttributes,"field"); if (!fFieldListP) return fail("'use' must be specfied before first "); // search field // %%% add context here if we have any sInt16 fid = TConfigElement::getFieldIndex(nam,fFieldListP); if (fid==VARIDX_UNDEFINED) return fail("'field' references unknown field '%s'",nam); // create new tagmap TTagMapDefinition *tagmapP= new TTagMapDefinition(this,fid); // - save in list fTagMaps.push_back(tagmapP); // - let element handle parsing expectChildParsing(*tagmapP); return true; } // if // - none known here if (inherited::localStartElement(aElementName,aAttributes,aLine)) return true; // let the profile parse as if it was inside a or if (fProfileConfigP) return delegateParsingTo(fProfileConfigP,aElementName,aAttributes,aLine); // cannot parse return false; } // TDataObjConfig::localStartElement // resolve void TDataObjConfig::localResolve(bool aLastPass) { // nop // resolve inherited inherited::localResolve(aLastPass); } // TDataObjConfig::localResolve #endif // CONFIGURABLE_TYPE_SUPPORT #ifdef HARDCODED_TYPE_SUPPORT TTagMapDefinition *TDataObjConfig::addTagMap( sInt16 aFid, const char* aXmlTag, bool aBoolType, bool aEmbedded, const char* aParent ) { // create new tagmap TTagMapDefinition *tagmapP = new TTagMapDefinition(this,aFid); // save the options TCFG_ASSIGN(tagmapP->fXmlTag,aXmlTag); tagmapP->fBoolType= aBoolType; tagmapP->fEmbedded= aEmbedded; tagmapP->fParent = aParent; // save in list fTagMaps.push_back(tagmapP); // return pointer return tagmapP; } // TDataObjConfig::addTagMap #endif // HARDCODED_TYPE_SUPPORT /* * Implementation of TDataObjType */ TDataObjType::TDataObjType( TSyncSession *aSessionP, TDataTypeConfig *aTypeCfgP, // type config const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ) : TMultiFieldItemType(aSessionP,aTypeCfgP,aCTType,aVerCT,aRelatedDatastoreP,aFieldDefinitions), fProfileHandlerP(NULL) { // save typed config pointer again fTypeCfgP = static_cast(aTypeCfgP); // create the profile handler if there is one at all (a profile is optional) if (fTypeCfgP->fProfileConfigP) { // create the handler fProfileHandlerP = fTypeCfgP->fProfileConfigP->newProfileHandler(this); // set profile mode fProfileHandlerP->setProfileMode(fTypeCfgP->fProfileMode); } } // TDataObjType::TDataObjType TDataObjType::~TDataObjType() { // handler not needed any more if (fProfileHandlerP) delete fProfileHandlerP; } // TDataObjType::~TDataObjType #ifdef OBJECT_FILTERING // get field index of given filter expression identifier. sInt16 TDataObjType::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // check if explicit field level identifier if (strucmp(aIdentifier,"F.",2)==0) { // explicit field identifier, skip property lookup aIdentifier+=2; } else { // search tagmaps for tagged fields TTagMapList::iterator pos; for (pos= fTypeCfgP->fTagMaps.begin(); pos!=fTypeCfgP->fTagMaps.end(); pos++) { // first priority: compare with explicit filterkeyword, if any if (!TCFG_ISEMPTY((*pos)->fFilterKeyword)) { // compare with filterkeyword if (strucmp(TCFG_CSTR((*pos)->fFilterKeyword),aIdentifier)==0) return (*pos)->fFid; } else if (!TCFG_ISEMPTY((*pos)->fXmlTag)) { // compare with xml tag name itself if (strucmp(TCFG_CSTR((*pos)->fXmlTag),aIdentifier)==0) return (*pos)->fFid; } // if } // for // no matching tag found, let TTextProfileHandler search for its own filter identifiers if (fProfileHandlerP) { sInt16 fid = fProfileHandlerP->getFilterIdentifierFieldIndex(aIdentifier,aIndex); if (fid!=FID_NOT_SUPPORTED) return fid; } // no tagged field found, search underlying field list } // if no field ID found so far, look up in field list return TMultiFieldItemType::getFilterIdentifierFieldIndex(aIdentifier, aIndex); } // TDataObjType::getFilterIdentifierFieldIndex #endif // OBJECT_FILTERING // helper to create same-typed instance via base class TSyncItemType *TDataObjType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TDataObjType,DBG_OBJINST,"TDataObjType",TDataObjType( aSessionP, fTypeConfigP, getTypeName(), getTypeVers(), aDatastoreP, fFieldDefinitionsP )); } // TDataObjType::newCopyForSameType // create new sync item of proper type and optimization for specified target TSyncItem *TDataObjType::internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP) { // All DataObjs are stored in MultiFieldItems if (!aTargetItemTypeP->isBasedOn(ity_multifield)) SYSYNC_THROW(TSyncException(DEBUGTEXT("TDataObjType::internalNewSyncItem with bad-typed target","txit3"))); TMultiFieldItemType *targetitemtypeP = static_cast (aTargetItemTypeP); return new TMultiFieldItem(this,targetitemtypeP); } // TDataObjType::internalNewSyncItem // fill in SyncML data (but leaves IDs empty) bool TDataObjType::internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ) { // check type if (!aSyncItemP->isBasedOn(ity_multifield)) SYSYNC_THROW(TSyncException(DEBUGTEXT("TDataObjType::internalFillInData: incompatible item class","txit4"))); TMultiFieldItem *itemP = static_cast (aSyncItemP); // process data if any if (aItemP->data) { // parse data stringSize sz; cAppCharP t = smlPCDataToCharP(aItemP->data,&sz); if (!parseData(t,sz,*itemP,aLocalDatastoreP)) { // format error aStatusCmd.setStatusCode(415); // Unsupported media type or format ADDDEBUGITEM(aStatusCmd,"Error parsing Text content"); return false; } } else { // no data aStatusCmd.setStatusCode(412); // incomplete command ADDDEBUGITEM(aStatusCmd,"No data found in item"); return false; } // ok, let ancestor process data as well return TMultiFieldItemType::internalFillInData(aSyncItemP,aItemP,aLocalDatastoreP,aStatusCmd); } // TDataObjType::internalFillInData // sets data and meta from SyncItem data, but leaves source & target untouched bool TDataObjType::internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ) { // check type if (!aSyncItemP->isBasedOn(ity_multifield)) SYSYNC_THROW(TSyncException(DEBUGTEXT("TDataObjType::internalSetItemData: incompatible item class","txit4"))); TMultiFieldItem *itemP = static_cast (aSyncItemP); // let ancestor prepare first if (!TMultiFieldItemType::internalSetItemData(aSyncItemP,aItem,aLocalDatastoreP)) return false; // generate data item string dataitem; generateData(aLocalDatastoreP,*itemP,dataitem); // put data item into opaque/cdata PCData (note that dataitem could be BINARY string, so we need to pass size!) aItem->data=newPCDataStringX((const uInt8 *)dataitem.c_str(),true,dataitem.size()); // can't go wrong return true; } // TDataObjType::internalSetItemData static void AddXmlTag( string &aString, string aTag, bool newline= false ) { aString+= "<" + aTag + ">"; if (newline) aString+= "\n"; } // AddXmlTag static void AddXmlTagEnd( string &aString, string aTag, bool newline= true ) { aString+= ""; if (newline) aString+= "\n"; } // AddXmlTagEnd static void AppendXml( string &aString, string aTag, const char* value, bool tagDone= false ) { if (*value!='\0') { if (!tagDone) AddXmlTag( aString, aTag ); aString+= value; AddXmlTagEnd( aString, aTag ); } // if } // AppendXml static void AppendCDATA( string &aString, const char* aTag, const char* aValue ) { AddXmlTag( aString, aTag ); // must be shown according to OMA DS 1.2, // even if the body is empty if (*aValue!='\0') { aString+= BeginCDATA; // only for the xml representation aString+= aValue; // the body //%%% luz: not needed here as there is no enclosing CData any more (or this will be done when needed by the SML encoder!) //aString+= LowerCDATA; // only for the xml representation aString+= '\n'; } // if AddXmlTagEnd( aString, aTag ); } // AppendCDATA string TDataObjType::getAttr( TMultiFieldItem &aItem, const char* aXmlTag, const char* aXmlAttr ) { TItemField* fieldP; TTagMapList::iterator pos; string v; // search for an element, which matches for both and for (pos= fTypeCfgP->fTagMaps.begin(); pos!=fTypeCfgP->fTagMaps.end(); pos++) { fieldP= aItem.getField( (*pos)->fFid ); // this is the element we're looking for if (strcmp( aXmlTag, TCFG_CSTR((*pos)->fXmlTag ))==0 && strcmp( aXmlAttr,TCFG_CSTR((*pos)->fXmlAttr))==0) { fieldP->getAsString( v ); // this is the attribute we're looking for break; } // if } // for return v; // is "", if no attribute found } // TDataObjType::getAttr // generate Data item (includes header and footer) void TDataObjType::generateData(TLocalEngineDS *aDatastoreP, TMultiFieldItem &aItem, string &aString) { #ifdef SYDEBUG PDEBUGPRINTFX(DBG_GEN+DBG_HOT,("Generating:") ); aItem.debugShowItem(DBG_GEN); #endif TItemField* fieldP; TItemField* fieldDocType; // the reference to the "DOCTYPE" (File/Folder/Email) field TTagMapList::iterator pos; string docT, v; string inParent; bool tagOpened= false; //%%% luz: do not add extra CData here, this will be done when needed by the SML encoder! //aString= BeginCDATA; // start a CDATA sequence fieldDocType= aItem.getField( "DOCTYPE" ); if (fieldDocType) { fieldDocType->getAsString( docT ); // main tag, straight forward implementation AddXmlTag ( aString, docT, true ); } // if // go thru the tag element list and get the matching element for (pos= fTypeCfgP->fTagMaps.begin(); pos!=fTypeCfgP->fTagMaps.end(); pos++) { fieldP= aItem.getField( (*pos)->fFid ); // this is the element we're looking for if (!fieldP || // not a valid field fieldP==fieldDocType) continue; // has been done outside already, ignore it bool isArr= fieldP->isArray(); sInt16 maxI= 1; // do it once w/o array if (isArr) maxI= fieldP->arraySize(); if (maxI==0) continue; // it is an array w/o any items, skip it if ((*pos)->fEmbedded && fProfileHandlerP) { // set related datastore so handler can access session specific datastore state fProfileHandlerP->setRelatedDatastore(aDatastoreP); fProfileHandlerP->generateText(aItem, v); AppendCDATA( aString, TCFG_CSTR((*pos)->fXmlTag), v.c_str()); continue; // it's done now for this element } // if // the standard case (not embedded): cover both cases: array AND no array sInt16 i; for (i= 0; igetArrayField( i ); if (fieldAP->isAssigned() && TCFG_ISEMPTY((*pos)->fParent) && !inParent.empty()) { AddXmlTagEnd( aString,inParent.c_str() ); inParent= ""; } // there is no native bool representation for the field lists // So do it with the help of an additional flag v= ""; if (fieldAP->isAssigned()) { if (fieldAP->isBasedOn( fty_blob ) && fieldAP->hasProxy()) { #ifdef STREAMFIELD_SUPPORT string enc= getAttr( aItem, TCFG_CSTR((*pos)->fXmlTag), "enc" ); // according OMA DS 1.2, the endcoding attribute "enc" must be // either not present (no encoding), "quoted-printable" or "base64". // The implementation SHOULD NOT use other enc attribute values. const char* ptr = fieldAP->getCStr(); size_t size= fieldAP->getStreamSize(); if (enc.empty()) { // no encoding v.assign( ptr,size ); // => assign directly } else if (strucmp( enc.c_str(),"base64" )==0) { char* bb= b64::encode( (uInt8*)ptr,size ); v= bb; // maybe one copy operation can be avoided in future b64::free( bb ); // does never contain '\0' => can be treated as normal string } else if (strucmp( enc.c_str(),"quoted-printable")==0) { sysync::appendEncoded( (uInt8*)ptr,size, v, enc_quoted_printable, MIME_MAXLINESIZE,0,true,true ); } else { v = "unknown_encoding: \""; v+= enc; v+= "\""; } #endif } else if ((*pos)->fBoolType) { // best fitting for integer and string int ii= fieldAP->getAsInteger(); switch ( ii ) { // this is the integer - boolean mapping case -1: v= "false"; break; // a strange value for "false" case 0: v= ""; break; // 0 is the empty value (not assigned at parsing) case 1: v= "true"; break; // the 'normal' value for "true" } // switch } // if else fieldAP->getAsString( v ); if (!v.empty()) { // avoid multiple identical elements (even if it's allowed in OMA DS 1.2) if (!TCFG_ISEMPTY((*pos)->fParent)) { bool ok= inParent.empty(); // either iParent==0 or strings are different if (!ok && strucmp( inParent.c_str(),TCFG_CSTR((*pos)->fParent) )!=0) { AddXmlTagEnd( aString,inParent.c_str() ); // switch off old tag first, if different ok= true; } // if if (ok) { inParent= (*pos)->fParent; AddXmlTag( aString,inParent.c_str(), true ); } // if } // if } // if } // if if (TCFG_ISEMPTY((*pos)->fXmlAttr)) { // w/o attributes if (tagOpened) aString+= ">"; AppendXml ( aString, (*pos)->fXmlTag, v.c_str(), tagOpened ); tagOpened= false; } else if (!v.empty()) { // with XML attribute handling if (!tagOpened) { aString+= "<"; aString+= TCFG_CSTR((*pos)->fXmlTag); } // if aString+= " "; aString+= TCFG_CSTR((*pos)->fXmlAttr); aString+= "=\"" + v + "\""; tagOpened= true; } // if } // for } // for // Leave the block finally if (!inParent.empty()) AddXmlTagEnd( aString,inParent.c_str()); if (fieldDocType) { fieldDocType->getAsString( docT ); // end of main tag, straight forward implementation AddXmlTagEnd ( aString, docT ); } // if //%%% luz: do not add extra CData here, this will be done when needed by the SML encoder! //aString+= EndCDATA; // terminate the sequence #ifdef SYDEBUG if (PDEBUGTEST(DBG_GEN)) { // note, do not use debugprintf because string is too long PDEBUGPRINTFX(DBG_GEN,("%s", "") ); PDEBUGPRINTFX(DBG_GEN,("Successfully generated:") ); PDEBUGPUTSX (DBG_GEN+DBG_USERDATA, aString.c_str() ); PDEBUGPRINTFX(DBG_GEN+DBG_USERDATA,("%s", "") ); } // if #endif } // TDataObjType::generateData /*! Skip white spaces */ static void SkipWhiteSP( const char* &p ) { while (*p==0x0D || // CR *p==0x0A || // LF *p==0x09 || // HT *p==' ') p++; // skip leading CR/LF/Tabs and spaces } // SkipWhiteSP // simple straight forward letter recognition static bool IsLetter( char ch ) { ch= toupper(ch); return ch>='A' && ch<='Z'; } // IsLetter /*! Get the next tag and value of

* * @param may contain attributes, e.g. * @param +1 go down in the hierarchy * 0 stay on the same level * -1 go up in the hierarchy */ static bool NextTag( const char* &p, string &aTag, string &aAttr, const char* &aPos, int &aSize, int &level, int &direction ) { const char* BeginCom= ""; const char* q; // default values bool vDone= false; aAttr = ""; aPos = ""; aSize = 0; direction = 0; SkipWhiteSP( p ); q= strstr( p,BeginCom ); // comment ? if (q && q==p) { } else { if (*p!='<') return false; // must start with a tag p++; if (*p=='/') { p++; direction= -1; } q= strstr( p,">" ); if (!q) return false; aTag.assign( p, (unsigned int)( q-p ) ); // this is the tag int pos= aTag.find(" "); if (pos>=0) { // the tag contains some attributes aAttr= aTag.substr( pos+1 ); // ==> get them aTag = aTag.substr( 0,pos ); // the real tag } // if p= q+1; } // if do { SkipWhiteSP( p ); if (direction==-1) return true; // end tag reached if (*p!='<') break; // a value is coming now, not nested // is it a comment ? q= strstr( p,BeginCom ); if (q && q==p) { q= strstr( q, EndCom ); if (!q) return false; p= q + strlen ( EndCom ); continue; // comment is skipped } // if q= strstr( p," do handling outside return true; } while (true); SkipWhiteSP( p ); q= strstr( p, "" ); if (!q) return false; p= q+1; return true; } // NextTag // the structure for attributes with values struct TAField { string name; string value; }; // AField /* struct VVV { VVV() { printf( "hinein\n" ); } ~VVV() { printf( "hinaus '%s'\n", a.c_str() ); } string a; }; */ // parse Data item (includes header and footer) bool TDataObjType::parseData(const char *aText, stringSize aSize, TMultiFieldItem &aItem, TLocalEngineDS *aDatastoreP) { TItemField* fieldP; TTagMapList::iterator pos; string tag, attr, value, docType; const char* vPos; int vSize; // Hierarchical tags typedef std::list TStrList; TStrList tagHierarchy; TStrList::iterator px; TAField a; typedef std::list TAList; TAList aList; TAList::iterator ax; #ifdef SYDEBUG if (PDEBUGTEST(DBG_PARSE)) { // very detailed, show item being parsed PDEBUGPRINTFX(DBG_PARSE+DBG_HOT, ("Parsing: ") ); PDEBUGPUTSX (DBG_PARSE+DBG_USERDATA, aText); } #endif // Go thru all the tags and build temporary stack at int level= 0; int direction; const char* p= aText; if (strstr( p, BeginCDATA )==p) p+= strlen( BeginCDATA ); while (NextTag( p, tag,attr, vPos,vSize, level,direction )) { // parse all attributes and put them into aList.clear(); while (!attr.empty()) { int apos= attr.find( "=\"" ); if (apos<0) { attr= ""; break; } a.name = attr.substr( 0,apos ); attr = attr.substr( apos+2 ); apos= attr.find( "\"" ); if (apos<0) { attr= ""; break; } a.value= attr.substr( 0,apos ); attr = attr.substr( apos+1 ); while (attr.find(" ")==0) attr= attr.substr( 1 ); aList.push_back( a ); } // while switch (direction) { case -1 : px= tagHierarchy.end(); // are we going up in the hierarchy ? if (px!=tagHierarchy.begin()) // if the list is not empty ... tagHierarchy.erase( --px ); // erase last element break; case 1 : tagHierarchy.push_back( tag ); // are we going down in the hierarchy ? if (level>1) break; docType= tag; vPos = docType.c_str(); vSize= docType.length(); tag = "DOCTYPE"; // assign the document type // go on for this special case default: // go thru the tag element list and get the matching element for (pos= fTypeCfgP->fTagMaps.begin(); pos!=fTypeCfgP->fTagMaps.end(); pos++) { if (strucmp( tag.c_str(),TCFG_CSTR((*pos)->fXmlTag) )==0) { fieldP= aItem.getField( (*pos)->fFid ); // this is the element we're looking for if (fieldP) { if (fieldP->isAssigned() && // -> allow multiple fields with the same name !fieldP->isArray()) continue; // it is assigned already ! // for embedded structures, the content shouldn't be copied // in all other cases, it can still be used as string if (!(*pos)->fEmbedded) value.assign( vPos,vSize ); // this is the value of this tag bool xAtt= !TCFG_ISEMPTY((*pos)->fXmlAttr); if (aList.size()==0) { if (xAtt) continue; // does not fit, both must be either empty } else { if (xAtt) { value= ""; for (ax= aList.begin(); ax!=aList.end(); ax++) { if (strucmp( (*ax).name.c_str(),TCFG_CSTR((*pos)->fXmlAttr) )==0) { value= (*ax).value.c_str(); break; // for attribute handling take as . } // if } // for if (value.empty()) continue; } // if } // if do { // there must be either no parent, or the parent must match if ( !TCFG_ISEMPTY((*pos)->fParent) && strucmp( TCFG_CSTR ((*pos)->fParent),tagHierarchy.back().c_str() )!=0) break; if (fieldP->isBasedOn( fty_blob )) { #ifdef STREAMFIELD_SUPPORT string enc= getAttr( aItem, TCFG_CSTR((*pos)->fXmlTag), "enc" ); if (enc.empty()) { // no encoding } else if (strucmp( enc.c_str(),"base64" )==0) { uInt32 oLen; uInt8* bb= b64::decode( value.c_str(), 0, &oLen ); fieldP->setAsString( (const char*)bb, oLen ); // assign the value b64::free ( bb ); break; // already done now (blob assigned correctly } else if (strucmp( enc.c_str(),"quoted-printable")==0) { string v; sysync::appendDecoded( value.c_str(),value.length(), v, enc_quoted_printable ); fieldP->setAsString( v.c_str(), v.size() ); // assign the value break; // already done now (blob assigned correctly } else { value = "unknown_encoding: \""; value+= enc; value+= "\""; } #endif } // if // we don't have a boolean type directly, so make a special conversion for it if ((*pos)->fBoolType) { // assuming the field list item is integer for boolean if (strucmp( value.c_str(),"0" )==0) break; // as defined in OMA DS 1.2 else if (strucmp( value.c_str(),"false" )==0) value= "-1"; // special boolean treatement else if (strucmp( value.c_str(),"true" )==0) value= "1"; } // if // delegate parsing of embedded object if ((*pos)->fEmbedded && fProfileHandlerP) { // set related datastore so handler can access session specific datastore state fProfileHandlerP->setRelatedDatastore(aDatastoreP); // vPos,vSize is not a copy, but a direct reference into bool ok= fProfileHandlerP->parseText(vPos,vSize, aItem); if (!ok) { // format error // aStatusCmd.setStatusCode(415); // Unsupported media type or format // ADDDEBUGITEM(aStatusCmd,"Error parsing Text content"); return false; } // if break; // already done (at profile handler) } // if // it's ok now to fill in if (fieldP->isArray()) fieldP->appendString( value.c_str() ); else fieldP->setAsString ( value.c_str() ); // assign the value } while (false); } // if if (aList.size()==0) break; } // if } // for } // switch } // while #ifdef SYDEBUG PDEBUGPRINTFX(DBG_PARSE,("Successfully parsed: ")); aItem.debugShowItem(DBG_DATA+DBG_PARSE); #endif return true; } // TDataObjType::parseData // generates SyncML-Devinf property list for type SmlDevInfCTDataPropListPtr_t TDataObjType::newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor) { // no properties here return NULL; } // TDataObjType::newCTDataPropList // Filtering: add keywords and property names to filterCap void TDataObjType::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDescriptor) { // add keywords from tagmaps #ifdef OBJECT_FILTERING TTagMapList::iterator pos; for(pos=fTypeCfgP->fTagMaps.begin();pos!=fTypeCfgP->fTagMaps.end();pos++) { // first priority: compare with explicit filterkeyword, if any if (!TCFG_ISEMPTY((*pos)->fFilterKeyword)) { // has a filterkeyword, show it addPCDataStringToList(TCFG_CSTR((*pos)->fFilterKeyword), &aFilterKeywords); } } // let embedded profile add the keywords if (fProfileHandlerP) { fProfileHandlerP->addFilterCapPropsAndKeywords(aFilterKeywords, aFilterProps, aVariantDescriptor, this); } // let base class add own keywords/props inherited::addFilterCapPropsAndKeywords(aFilterKeywords, aFilterProps, aVariantDescriptor); #endif } // TDataObjType::addFilterCapPropsAndKeywords // intended for creating SyncItemTypes for remote databases from // transmitted DevInf. // SyncItemType MUST NOT take ownership of devinf structure passed // (because multiple types might be created from a single CTCap entry) bool TDataObjType::analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP) { // just let parent handle return inherited::analyzeCTCap(aCTCapP); } // TDataObjType::analyzeCTCap /// @brief copy CTCap derived info from another SyncItemType /// @return false if item not compatible /// @note required to create remote type variants from ruleMatch type alternatives bool TDataObjType::copyCTCapInfoFrom(TSyncItemType &aSourceItem) { // just let parent handle return inherited::copyCTCapInfoFrom(aSourceItem); } // TDataObjType::copyCTCapInfoFrom } // namespace sysync /* end of TDataObjType implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/dataobjtype.h0000755000373300037200000001413112424517753025327 0ustar00nightlyallusers00000000000000/* * File: DataObjType.h * * Author: Beat Forster (bfo@synthesis.ch) * * TDataObjType * base class for data object based items (EMAILOBJ, FILEOBJ, FOLDEROBJ) * implemented for OMA DS V1.2 * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * 2005-07-20 : bfo : created from TextItemType * */ #ifndef DataObjType_H #define DataObjType_H // includes #include "syncitemtype.h" #include "multifielditemtype.h" #include "textprofile.h" // for test //#define HARDCODED_TYPE_SUPPORT namespace sysync { // property definition class TTagMapDefinition : public TConfigElement { typedef TConfigElement inherited; public: // constructor/destructor TTagMapDefinition(TConfigElement *aParentElementP, sInt16 aFid); virtual ~TTagMapDefinition(); // properties // - tagged field TCFG_STRING fXmlTag; // - attribute field of tag TCFG_STRING fXmlAttr; // - specifies the field as boolean bool fBoolType; // - specifies an embedded profile (for RFC2822) bool fEmbedded; // - the expected parent tag (if not empty) TCFG_STRING fParent; // - field id sInt16 fFid; #ifdef OBJECT_FILTERING // - no filterkeyword TCFG_STRING fFilterKeyword; #endif #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); }; // TTagMapDefinition // tag mapping definitions typedef std::list TTagMapList; // Text based datatype class TDataObjConfig : public TMultiFieldTypeConfig { typedef TMultiFieldTypeConfig inherited; public: TDataObjConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TDataObjConfig(); // properties // - Note, field list is parsed here, but is a property of TMultiFieldTypeConfig // - text-line based field definitions TTagMapList fTagMaps; // public functions // - create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP); #ifdef HARDCODED_TYPE_SUPPORT TTagMapDefinition *addTagMap( sInt16 aFid, const char* aXmlTag, bool aBoolType, bool aEmbedded, const char* aParent ); #endif protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement( const char *aElementName, const char **aAttributes, sInt32 aLine ); virtual void localResolve( bool aLastPass ); #endif virtual void clear(); }; // TDataObjConfig const uInt16 ity_dataobj= 200; // must be unique class TDataObjType: public TMultiFieldItemType { typedef TMultiFieldItemType inherited; public: // constructor TDataObjType( TSyncSession *aSessionP, TDataTypeConfig *aTypeCfgP, // type config const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ); // destructor virtual ~TDataObjType(); // access to type virtual uInt16 getTypeID(void) const { return ity_dataobj; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_dataobj ? true : TMultiFieldItemType::isBasedOn(aItemTypeID); }; // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // MIME-DIR is an implementation // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); /// @brief copy CTCap derived info from another SyncItemType virtual bool copyCTCapInfoFrom(TSyncItemType &aSourceItem); #ifdef OBJECT_FILTERING // filtering // - get field index of given filter expression identifier. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); #endif protected: // - analyze CTCap for specific type virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP); // - obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor); // - Filtering: add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc); // Item data management // - create new sync item of proper type and optimization for specified target virtual TSyncItem *internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP); // - fill in SyncML data (but leaves IDs empty) virtual bool internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ); // - sets data and meta from SyncItem data, but leaves source & target untouched virtual bool internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ); // get attribute of . If not available, return "" virtual string getAttr( TMultiFieldItem &aItem, const char* aXmlTag, const char* aXmlAttr ); // generate Data item (includes header and footer) virtual void generateData(TLocalEngineDS *aDatastoreP, TMultiFieldItem &aItem, string &aString); // parse Data item (includes header and footer) virtual bool parseData(const char *aText, stringSize aSize, TMultiFieldItem &aItem, TLocalEngineDS *aDatastoreP); private: // member fields TProfileHandler *fProfileHandlerP; TDataObjConfig *fTypeCfgP; // the text type config element }; // TDataObjType } // namespace sysync #endif // DataObjType_H // eof syncevolution-1.5/src/synthesis/src/sysync/debuglogger.cpp0000755000373300037200000017326112424517753025654 0ustar00nightlyallusers00000000000000/* * File: debuglogger.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Global debug mechanisms * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * 2005-08-04 : luz : created * */ #include "prefix_file.h" #ifdef SYDEBUG #include "debuglogger.h" #ifdef MULTI_THREAD_SUPPORT #include "platform_thread.h" #endif #ifdef USE_DLT #include #endif namespace sysync { #ifdef USE_DLT static bool DbgDLTInitialized; static DltContext DbgProtoContext; static DltContext DbgSessionContext; static DltContext DbgAdminContext; static DltContext DbgDataContext; static DltContext DbgRemoteInfoContext; static DltContext DbgParseContext; static DltContext DbgGenerateContext; static DltContext DbgTranspContext; static DltContext DbgSyncMLTKContext; static DltContext DbgDefaultContext; #endif #ifndef HARDCODED_CONFIG // debug format modes cAppCharP const DbgOutFormatNames[numDbgOutFormats] = { "text", // plain text format (but can be indented) "xml", // XML format "html" // HTML format #ifdef USE_DLT // If DLT support is not enabled, then trying to uses it in a config // will lead to a generic parse error. Might be good enough, although // a dedicated error message about "DLT being disabled in this build" // would be nicer. , "dlt" // GENIVI Diagnostic Log and Trace #endif }; // HTML dynamic folding modes cAppCharP const DbgFoldingModeNames[numDbgFoldingModes] = { "none", // do not include dynamic folding into HTML logs "collapsed", // include folding - all collapsed by default "expanded", // include folding - all expanded by default "auto" // include folding - collapse/expand state predefined on a block-by-block basis }; cAppCharP const DbgSourceModeNames[numDbgSourceModes] = { "none", // do not include links into source code in HTML logs "hint", // no links, but info about what file/line number the message comes from "doxygen", // include link into doxygen prepared HTML version of source code "txmt", // include txmt:// link (understood by TextMate and BBEdit) into source code }; // debug flush modes cAppCharP const DbgFlushModeNames[numDbgFlushModes] = { "buffered", // no flush, keep open as long as possible, output buffered (fast, needed for network drives) "flush", // flush every debug message "openclose" // open and close debug channel separately for every message (as in 2.x engine) }; // debug subthread isolation modes cAppCharP const DbgSubthreadModeNames[numDbgSubthreadModes] = { "none", // do not handle output from subthread specially "suppress", // suppress output from subthreads "separate", // create separate output stream (=file) for each subthread "mix", // mix on a line by line basis "mixblocks" // buffer thread's output and mix block-wise it into main stream when appropriate }; #endif // file extentsions for debug format modes cAppCharP const DbgOutFormatExtensions[numDbgOutFormats] = { ".log", // plain text format (but can be indented) ".xml", // XML format ".html" // HTML format }; cAppCharP const DbgOutDefaultPrefixes[numDbgOutFormats] = { "*** Start of log", "\n" "", "\n" "SySync SyncML Engine " SYSYNC_FULL_VERSION_STRING " Log\n" "\n" "\n" "

Start of log - SySync SyncML Engine " SYSYNC_FULL_VERSION_STRING "

\n
    \n" }; cAppCharP const DbgOutDefaultSuffixes[numDbgOutFormats] = { "*** End of log", "", "

End of log

" }; cAppCharP FoldingPrefix = "\n" "
  • [-- collapse all --][++ expand all ++]
  • \n"; // externals #ifdef CONSOLEINFO // privately redefined here to avoid circular headers (would need syncappbase.h) extern "C" void ConsolePuts(const char *text); #endif // TDbgOptions implementation // -------------------------- TDbgOptions::TDbgOptions() { // set defaults clear(); } // TDbgOptions::TDbgOptions void TDbgOptions::clear(void) { fOutputFormat = dbgfmt_html; // most universally readable and convenient fIndentString = " "; // two spaces fCustomPrefix.erase(); // no custom prefix fCustomSuffix.erase(); // no custom suffix fSeparateMsgs = true; // separate text message lines ( in xml) fTimestampStructure = true; // timestamps in structure... fTimestampForAll = false; // ..but not for every line fThreadIDForAll = false; // not by default fFlushMode = dbgflush_none; // no special flush or openclose (fast, but might loose info on process abort) fFoldingMode = dbgfold_auto; // dynamic folding enabled, expanded/collapsed defaults automatically set on block-by-block basis #ifdef SYDEBUG_LOCATION fSourceLinkMode = dbgsource_none; // no links into source code fSourceRootPath = SYDEBUG_LOCATION; // use default path from build #endif fAppend = false; // default to overwrite existing logfiles fSubThreadMode = dbgsubthread_suppress; // simply suppress subthread info fSubThreadBufferMax = 1024*1024; // don't buffer more than one meg. } // TDbgOptions::clear // TDbgOut implementation // ---------------------- TDbgOut::TDbgOut() : fDestructed(false) { // init fIsOpen=false; } // TDbgOut::TDbgOut TDbgOut::~TDbgOut() { destruct(); } // TDbgOut::~TDbgOut void TDbgOut::destruct(void) { if (!fDestructed) doDestruct(); fDestructed=true; } // TDbgOut::destruct void TDbgOut::doDestruct(void) { // make sure files are closed closeDbg(); } // TDbgOut::doDestruct // TStdFileDbgOut implementation // ----------------------------- #ifndef NO_C_FILES TStdFileDbgOut::TStdFileDbgOut() { // init fFileName.erase(); fFile=NULL; mutex=newMutex(); } // TStdFileDbgOut::TStdFileDbgOut TStdFileDbgOut::~TStdFileDbgOut() { destruct(); freeMutex(mutex); } // TStdFileDbgOut::~TStdFileDbgOut #ifdef LINUX # include # include #endif static FILE *FOpen(const char *path, const char *mode) { FILE *file = fopen(path, mode); #ifdef LINUX // Be careful not to leak this file descriptor into forked // processes. int fd = file ? fileno(file) : -1; if (fd >= 0) { int flags = fcntl(fd, F_GETFD); if (flags != -1) { fcntl(fd, F_SETFD, flags | FD_CLOEXEC); } } #endif return file; } // open standard C file based debug output channel bool TStdFileDbgOut::openDbg(cAppCharP aDbgOutputName, cAppCharP aSuggestedExtension, TDbgFlushModes aFlushMode, bool aOverWrite, bool aRawMode) { if (fIsOpen) { // first close closeDbg(); } // now apply new flush mode fFlushMode=aFlushMode; // save new file name fFileName=aDbgOutputName; // for C files, use the extension provided fFileName+=aSuggestedExtension; // open fFile=FOpen(fFileName.c_str(),aRawMode ? (aOverWrite ? "wb" : "ab") : (aOverWrite ? "w" : "a")); // in case this fails, we'll have a NULL fFile. We can't do anything more here fIsOpen=fFile!=NULL; // For openclose mode, we have opened here only to check for logfile writability - close again if (fIsOpen && fFlushMode==dbgflush_openclose) { fclose(fFile); fFile=NULL; } // return false if we haven't been successful opening the channel return fIsOpen; } // TStdFileDbgOut::openDbg // return current size of debug file uInt32 TStdFileDbgOut::dbgFileSize(void) { if (!fIsOpen) return 0; // no file, no size uInt32 sz; if (fFlushMode==dbgflush_openclose) { // we need to open the file for append first fFile=FOpen(fFileName.c_str(),"a"); fseek(fFile,0,SEEK_END); // move to end (needed, otherwise ftell may return 0 despite "a" fopen mode) sz=ftell(fFile); fclose(fFile); fFile=NULL; } else { fseek(fFile,0,SEEK_END); // move to end (needed, otherwise ftell may return 0 despite "a" fopen mode) sz=ftell(fFile); // return size } return sz; } // TStdFileDbgOut::dbgFileSize // close standard C file based debug channel void TStdFileDbgOut::closeDbg(void) { if (fIsOpen) { if (fFile) { fclose(fFile); fFile=NULL; } fIsOpen=false; } } // TStdFileDbgOut::closeDbg // write single line to standard file based output channel void TStdFileDbgOut::putLine(cAppCharP aLine, bool aForceFlush) { // if not open, just NOP if (fIsOpen) { if (fFlushMode==dbgflush_openclose) { // we need to open the file for append first lockMutex(mutex); fFile=FOpen(fFileName.c_str(),"a"); if (!fFile) unlockMutex(mutex); } if (fFile) { // now output fputs(aLine,fFile); fputs("\n",fFile); // do required flushing if (fFlushMode==dbgflush_openclose) { // we need to close the file after every line of output fclose(fFile); fFile=NULL; unlockMutex(mutex); } else if (aForceFlush || fFlushMode==dbgflush_flush) { // simply flush fflush(fFile); } } } } // TStdFileDbgOut::putLine // write raw data to output file void TStdFileDbgOut::putRawData(cAppPointer aData, memSize aSize) { if (fIsOpen) { if (fFlushMode==dbgflush_openclose) { // we need to open the file for append first lockMutex(mutex); fFile=FOpen(fFileName.c_str(),"a"); } if (fFile) { if (fwrite(aData, 1, aSize, fFile) != 1) { // error ignored } } // do required flushing if (fFlushMode==dbgflush_openclose) { // we need to close the file after every line of output fclose(fFile); fFile=NULL; unlockMutex(mutex); } else if (fFlushMode==dbgflush_flush) { // simply flush fflush(fFile); } } } // TStdFileDbgOut::putRawData #endif // TConsoleDbgOut implementation // ----------------------------- TConsoleDbgOut::TConsoleDbgOut() { // init } // TStdFileDbgOut::TStdFileDbgOut // open standard C file based debug output channel bool TConsoleDbgOut::openDbg(cAppCharP aDbgOutputName, cAppCharP aSuggestedExtension, TDbgFlushModes aFlushMode, bool aOverWrite, bool aRawMode) { if (fIsOpen) { // first close closeDbg(); } // raw mode is not supported if (!aRawMode) fIsOpen=true; // return false if we haven't been successful opening the channel return fIsOpen; } // TConsoleDbgOut::openDbg // close standard C file based debug channel void TConsoleDbgOut::closeDbg(void) { fIsOpen=false; } // TConsoleDbgOut::closeDbg // write single line to standard file based output channel void TConsoleDbgOut::putLine(cAppCharP aLine, bool aForceFlush) { // if not open, just NOP if (fIsOpen) { CONSOLEPUTS(aLine); } } // TConsoleDbgOut::putLine // TDebugLoggerBase implementation // ------------------------------- // constructor TDebugLoggerBase::TDebugLoggerBase(GZones *aGZonesP) : fGZonesP(aGZonesP) { fDebugMask=0; fDebugEnabled=true; // enabled by default fNextDebugMask=0; fDbgOutP=NULL; fDbgOptionsP=NULL; fIndent=0; fBlockHistory=NULL; // no Block open yet fOutStarted=false; // not yet started fBlockNo=0; fGZonesP=NULL; fOutputLoggerP=NULL; // no redirected output yet } // TDebugLoggerBase::TDebugLoggerBase // destructor TDebugLoggerBase::~TDebugLoggerBase() { // make sure debug is finalized DebugFinalizeOutput(); // make sure possibly left-over history elements are erased while (fBlockHistory) { TBlockLevel *bl=fBlockHistory; fBlockHistory=bl->fNext; delete bl; } // get rid of output object if (fDbgOutP) delete fDbgOutP; fDbgOutP=NULL; } // TDebugLoggerBase::TDebugLoggerBase // @brief convenience version for getting time lineartime_t TDebugLoggerBase::getSystemNowAs(timecontext_t aContext) { return sysync::getSystemNowAs(aContext,fGZonesP); } // TDebugLoggerBase::getSystemNowAs // install outputter void TDebugLoggerBase::installOutput(TDbgOut *aDbgOutP) { // get rid of possibly installed previous outputter if (fDbgOutP) delete fDbgOutP; fDbgOutP=aDbgOutP; } // TDebugLoggerBase::installOutput /// @brief link this logger to another logger and redirect output to that logger /// @param aDebugLoggerP[in] another logger, that must be alive as long as this logger is alive void TDebugLoggerBase::outputVia(TDebugLoggerBase *aDebugLoggerP) { // save logger and prefix fOutputLoggerP = aDebugLoggerP; } // TDebugLoggerBase::outputVia #if defined(CONSOLEINFO) && defined(CONSOLEINFO_LIBC) extern "C" { int (*SySync_ConsolePrintf)(FILE *stream, const char *format, ...) = fprintf; } #endif // output formatted text void TDebugLoggerBase::DebugVPrintf(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aFormat, va_list aArgs) { // we need a format and debug not completely off if ((getMask() & aDbgMask)==aDbgMask && aFormat) { const sInt16 maxmsglen=1024; char msg[maxmsglen]; msg[0]='\0'; // assemble the message string vsnprintf(msg, maxmsglen, aFormat, aArgs); // write the string DebugPuts(TDBG_LOCATION_ARG aDbgMask,msg); } } // TDebugLoggerBase::DebugVPrintf // helper needed for maintaining old DEBUGPRINTFX() macro syntax TDebugLoggerBase &TDebugLoggerBase::setNextMask(uInt32 aDbgMask) { fNextDebugMask=aDbgMask; return *this; } // TDebugLoggerBase::setNextMask // like DebugPrintf(), but using mask previously set by setNextMask() void TDebugLoggerBase::DebugPrintfLastMask(TDBG_LOCATION_PROTO cAppCharP aFormat, ...) { va_list args; // we need a format and debug not completely off if ((getMask() & fNextDebugMask)==fNextDebugMask && aFormat) { va_start(args, aFormat); DebugVPrintf(TDBG_LOCATION_ARG fNextDebugMask,aFormat,args); va_end(args); } fNextDebugMask=0; } // TDebugLoggerBase::DebugPrintfLastMask // output formatted text void TDebugLoggerBase::DebugPrintf(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aFormat, ...) { va_list args; // we need a format and debug not completely off if ((getMask() & aDbgMask)==aDbgMask && aFormat) { va_start(args, aFormat); DebugVPrintf(TDBG_LOCATION_ARG aDbgMask,aFormat,args); va_end(args); } } // TDebugLoggerBase::DebugVPrintf // open new Block without attribute list void TDebugLoggerBase::DebugOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed) { // we need a format and debug not completely off if (getMask() && aBlockName) { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wformat-security" #endif DebugOpenBlock(TDBG_LOCATION_ARG aBlockName,aBlockTitle,aCollapsed,NULL); #ifdef __clang__ #pragma clang diagnostic pop #endif } } // TDebugLoggerBase::DebugOpenBlock // open new Block with attribute list, printf style void TDebugLoggerBase::DebugOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed, cAppCharP aBlockFmt, ...) { va_list args; // we need a format and debug not completely off if (getMask() && aBlockName) { va_start(args, aBlockFmt); DebugVOpenBlock(TDBG_LOCATION_ARG aBlockName,aBlockTitle,aCollapsed,aBlockFmt,args); va_end(args); } } // TDebugLoggerBase::DebugOpenBlock // open new Block with attribute list, printf style, expanded by default void TDebugLoggerBase::DebugOpenBlockExpanded(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, cAppCharP aBlockFmt, ...) { va_list args; // we need a format and debug not completely off if (getMask() && aBlockName) { va_start(args, aBlockFmt); DebugVOpenBlock(TDBG_LOCATION_ARG aBlockName,aBlockTitle,false,aBlockFmt,args); va_end(args); } } // TDebugLoggerBase::DebugOpenBlockExpanded // open new Block with attribute list, printf style, collapsed by default void TDebugLoggerBase::DebugOpenBlockCollapsed(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, cAppCharP aBlockFmt, ...) { va_list args; // we need a format and debug not completely off if (getMask() && aBlockName) { va_start(args, aBlockFmt); DebugVOpenBlock(TDBG_LOCATION_ARG aBlockName,aBlockTitle,true,aBlockFmt,args); va_end(args); } } // TDebugLoggerBase::DebugOpenBlockCollapsed #ifdef SYDEBUG_LOCATION #define MAKEDBGLINK(txt) dbg2Link(TDBG_LOCATION_ARG txt) /// turn text into link to source code string TDebugLoggerBase::dbg2Link(const TDbgLocation &aTDbgLoc, const string &aTxt) { if (!aTDbgLoc.fFile || !fDbgOptionsP || fDbgOptionsP->fSourceLinkMode==dbgsource_none || fDbgOptionsP->fOutputFormat!=dbgfmt_html) return aTxt; // disabled, non-html or no information to create source link // create link or hint to source code string line; switch(fDbgOptionsP->fSourceLinkMode) { case dbgsource_hint: { // only add name/line number/function as title hint (in a otherwise inactive link) line = "fSourceRootPath; line += "/"; string file = aTDbgLoc.fFile; size_t off = file.rfind('/'); if (off != file.npos) file = file.substr(off + 1); for (off = 0; off < file.size(); off++) { switch(file[off]) { case '_': line+="__"; break; case '.': line+="_8"; break; default: line+=file[off]; break; } } StringObjAppendPrintf(line,"-source.html#l%05d",aTDbgLoc.fLine); line+="\""; if (aTDbgLoc.fFunction) { line+=" title=\""; line+=aTDbgLoc.fFunction; line+="\""; } goto closelink; } case dbgsource_txmt: { // create txmt:// URL scheme link, which opens TextMate or BBEdit at the correct line in MacOS X line = "fSourceRootPath; path += aTDbgLoc.fFile; // - add path CGI encoded line += encodeForCGI(path.c_str()); // - add line number if (aTDbgLoc.fLine>0) StringObjAppendPrintf(line,"&line=%d",aTDbgLoc.fLine); line+="\""; if (aTDbgLoc.fFunction) { line+=" title=\""; line+=aTDbgLoc.fFunction; line+='"'; } } closelink: { line+=">"; line+=aTxt; line+=""; break; } default: line = aTxt; } // switch // return return line; } // TDebugLoggerBase::dbg2Link #else #define MAKEDBGLINK(txt) (txt) #endif // SYDEBUG_LOCATION #ifdef USE_DLT static void DbgText2PlainText(const char *in, size_t len, std::string &out) { const char *q=in; const char *s=q; const char *end=in + len; while (q=6 && strucmp(q,"&html;",6)==0) { if (q>s) out.append(s,q-s); // everything until next &html; must be filtered out // - search next &html; s=q=q+6; while(q+6<=end && strucmp(q,"&html;",6)!=0) q++; s=q=q+6; } else if (end-q>=4 && strucmp(q,"&sp;",4)==0) { if (q>s) out.append(s,q-s); s=q=q+4; out += ' '; // convert to plain space } else q++; } else { q++; } } if (q>s) out.append(s,q-s); } #endif // USE_DLT // output text to debug channel void TDebugLoggerBase::DebugPuts(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aText, stringSize aTextSize, bool aPreFormatted) { // we need a text and debug not completely off if (!((getMask() & aDbgMask)==aDbgMask && aText && fDbgOptionsP)) { // cannot output //#ifdef __MWERKS__ //#warning "ugly hack" DebugPutLine(TDBG_LOCATION_NONE "
  • Warning: Dbg output system already half shut down (limited formatting)!
  • "); if (aText) DebugPutLine(TDBG_LOCATION_NONE aText); DebugPutLine(TDBG_LOCATION_NONE "
  • "); //#endif } else { // make sure output is started if (!fOutStarted) { // try starting output DebugStartOutput(); // disable debugging in this logger if starting output failed // (prevents endless re-trying to open debug logs e.g. when log directory does not exist) if (!fOutStarted) { fDebugEnabled = false; return; // stop all efforts here } } #ifdef USE_DLT // DLT logging logs everything in one chunk if (fDbgOptionsP->fOutputFormat == dbgfmt_dlt) { DltContext *context = &DbgDefaultContext; if (aDbgMask & DBG_PROTO) { context = &DbgProtoContext; } else if (aDbgMask & DBG_SESSION) { context = &DbgSessionContext; } else if (aDbgMask & DBG_ADMIN) { context = &DbgAdminContext; } else if (aDbgMask & DBG_DATA) { context = &DbgDataContext; } else if (aDbgMask & DBG_REMOTEINFO) { context = &DbgRemoteInfoContext; } else if (aDbgMask & DBG_PARSE) { context = &DbgParseContext; } else if (aDbgMask & DBG_GEN) { context = &DbgGenerateContext; } else if (aDbgMask & DBG_TRANSP) { context = &DbgTranspContext; } else if (aDbgMask & (DBG_RTK_SML|DBG_RTK_XPT)) { context = &DbgSyncMLTKContext; } DltLogLevelType level = DLT_LOG_VERBOSE; if (level > DLT_LOG_INFO && (aDbgMask & DBG_HOT)) { level = DLT_LOG_INFO; } if (level > DLT_LOG_ERROR && (aDbgMask & DBG_ERROR)) { level = DLT_LOG_ERROR; } if (level > DLT_LOG_DEBUG && (aDbgMask & (DBG_USERDATA|DBG_PLUGIN|DBG_FILTER|DBG_CONFLICT))) { level = DLT_LOG_DEBUG; } if (level < DLT_LOG_VERBOSE && (aDbgMask & DBG_DETAILS)) { level = (DltLogLevelType)((int)level + 1); } if ((aTextSize > 0 && strlen(aText) > aTextSize) || strstr(aText, "&html;") || strstr(aText, "&sp;")) { // Must make a copy and potentially filter out html markup. string buffer; buffer.reserve(aTextSize); DbgText2PlainText(aText, aTextSize ? aTextSize : strlen(aText), buffer); DLT_LOG(*context, level, DLT_STRING(buffer.c_str())); } else { // Fast path: log directly. DLT_LOG(*context, level, DLT_STRING(aText)); } return; } #endif // USE_DLT // dissect into lines cAppCharP end=aTextSize ? aText+aTextSize : NULL; bool firstLine=true; // check for preformatted message bool pre=strnncmp(aText,"⪯",5)==0; if (pre) aText+=5; pre = pre || aPreFormatted; // now process text while ((!end || aTextfOutputFormat) { // HTML case dbgfmt_html: // prefix first line with
  • , second and further with
    if (firstLine) { line="
  • "; // add timestamp if needed for every line if ( fDbgOptionsP->fTimestampForAll || fDbgOptionsP->fThreadIDForAll #ifdef SYDEBUG_LOCATION || fDbgOptionsP->fSourceLinkMode!=dbgsource_none #endif ) { string prefix; prefix = "["; #ifdef MULTI_THREAD_SUPPORT if (fDbgOptionsP->fThreadIDForAll) { StringObjAppendPrintf(prefix,"%09lu",myThreadID()); if (fDbgOptionsP->fTimestampForAll) prefix += ", "; } #endif if (fDbgOptionsP->fTimestampForAll) { StringObjTimestamp(ts,getSystemNowAs(TCTX_SYSTEM)); prefix += ts; } #ifdef SYDEBUG_LOCATION else if (!fDbgOptionsP->fThreadIDForAll) { // neither threadID nor timestamp, but source requested -> put small text here prefix += "src"; } #endif prefix+="] "; // if we have links into source code, add it here line += MAKEDBGLINK(prefix); } // colorize some messages string cl=""; // colors, not mixable, most relevant first if (aDbgMask & DBG_ERROR) { cl="error"; } else if (aDbgMask & DBG_EXOTIC) { cl="exotic"; } else if (aDbgMask & DBG_SCRIPTS) { cl="script"; } else if (aDbgMask & DBG_PLUGIN) { cl="plugin"; } else if (aDbgMask & DBG_DBAPI) { cl="dbapi"; } else if (aDbgMask & DBG_CONFLICT) { cl="conflict"; } else if (aDbgMask & DBG_MATCH) { cl="match"; } else if (aDbgMask & DBG_REMOTEINFO) { cl="remote"; } else if (aDbgMask & DBG_PROTO) { cl="proto"; } else if (aDbgMask & DBG_FILTER) { cl="filter"; } else if (aDbgMask & DBG_PARSE) { cl="incoming"; } else if (aDbgMask & DBG_GEN) { cl="outgoing"; } else if (aDbgMask & DBG_REST) { cl="rest"; } // apply basic color style if (!cl.empty()) { line+=""; } // aditional style modifiers that can be combined with colors if (aDbgMask & DBG_HOT) { if (cl.empty()) line+=""; else line+=""; } // start preformatted if selected if (pre) line+="
    ";
              }
              else {
                if (!pre) line="
    "; } goto xmlize; // XML, just output and replace special chars as needed case dbgfmt_xml: if (firstLine) { #ifdef MULTI_THREAD_SUPPORT if (fDbgOptionsP->fThreadIDForAll) { line+=""; StringObjAppendPrintf(line,"%09lu",myThreadID()); line+=""; } #endif if (fDbgOptionsP->fTimestampForAll) { StringObjTimestamp(ts,getSystemNowAs(TCTX_SYSTEM)); line+=""; } DebugPutLine(TDBG_LOCATION_NONE line.c_str(),line.size()); line.erase(); } if (fDbgOptionsP->fSeparateMsgs) { line+=""; } xmlize: q=aText; s=q; while (qs) line.append(s,q-s); // flush stuff scanned so far // everything until next &html; does not need or want escaping, copy it as is // - search next &html; s=q=q+6; while(*q && strucmp(q,"&html;",6)!=0) q++; // - append everything between if we are in HTML mode if (fDbgOptionsP->fOutputFormat==dbgfmt_html && q>s) line.append(s,q-s); s=q=q+6; } else if (strucmp(q,"&sp;",4)==0) { if (q>s) line.append(s,q-s); // flush stuff scanned so far // non-breaking space in HTML, normal space otherwise if (fDbgOptionsP->fOutputFormat==dbgfmt_html) line += " "; else line += ' '; s=q=q+4; // skip &sp; } else { if (q>s) line.append(s,q-s); line+="&"; s=++q; } } else if (*q=='<') { if (q>s) line.append(s,q-s); line+="<"; s=++q; } else if (*q=='>') { if (q>s) line.append(s,q-s); line+=">"; s=++q; } else { q++; } } if (q>s) line.append(s,q-s); if (fDbgOptionsP->fSeparateMsgs && fDbgOptionsP->fOutputFormat==dbgfmt_xml) { line+=""; } break; // plain text default: case dbgfmt_text: q=aText; s=q; while (qs) line.append(s,q-s); // everything until next &html; must be filtered out // - search next &html; s=q=q+6; while(*q && strucmp(q,"&html;",6)!=0) q++; s=q=q+6; } else if (strucmp(q,"&sp;",4)==0) { if (q>s) line.append(s,q-s); s=q=q+4; line += ' '; // convert to plain space } else q++; } else { q++; } } if (q>s) line.append(s,q-s); break; } // switch text output firstLine=false; // skip the lineend, if any while (((!end || pfOutputFormat==dbgfmt_html && ((end && p>=end) || *p==0)) { // end preformatted if (pre) line+="
    "; // colors if (aDbgMask & ( DBG_ERROR | DBG_SCRIPTS | DBG_REST | DBG_EXOTIC | DBG_DBAPI | DBG_PLUGIN | DBG_PARSE | DBG_GEN | DBG_CONFLICT | DBG_MATCH | DBG_REMOTEINFO | DBG_PROTO | DBG_FILTER )) { line+="
    "; // end special style } // HOT modifier if (aDbgMask & ( DBG_HOT )) { line+="
    "; // end special style } line+="
  • "; // we need to close the list entry } DebugPutLine(TDBG_LOCATION_NONE line.c_str(),line.size(),pre); // next line, if any aText=p; } // loop until all text done } } // TDebugLoggerBase::DebugPuts // open new Block with attribute list, varargs passed void TDebugLoggerBase::DebugVOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed, cAppCharP aBlockFmt, va_list aArgs) { if (!fDbgOptionsP) return; if (fDbgOptionsP->fFoldingMode==dbgfold_collapsed) aCollapsed=true; else if (fDbgOptionsP->fFoldingMode==dbgfold_expanded) aCollapsed=false; if (getMask() && aBlockName && fDbgOptionsP) { // make sure output is started if (!fOutStarted) DebugStartOutput(); // create Block line on current indent level string bl; string ts; // - preamble, possibly with timestamp bool withTime = fDbgOptionsP->fTimestampStructure; if (withTime) StringObjTimestamp(ts,getSystemNowAs(TCTX_SYSTEM)); switch (fDbgOptionsP->fOutputFormat) { // XML case dbgfmt_xml: bl="<"; bl+=aBlockName; if (withTime) { bl+=" time=\"" + ts + "\""; } if (aBlockTitle) { bl+=" title=\""; bl+=aBlockTitle; bl+="\""; } break; // HTML case dbgfmt_html: bl="
  • "; if (fDbgOptionsP->fFoldingMode!=dbgfold_none) { StringObjAppendPrintf(bl, "
    +
    ", long(getBlockNo()), aCollapsed ? "inline" : "none", long(getBlockNo()), long(getBlockNo()), aCollapsed ? "none" : "inline", long(getBlockNo()) ); } StringObjAppendPrintf(bl,"", long(getBlockNo())); if (withTime) { bl += MAKEDBGLINK(string("[") + ts + "] "); } #ifdef SYDEBUG_LOCATION else if (fDbgOptionsP->fSourceLinkMode!=dbgsource_none) { bl += MAKEDBGLINK(string("[src] ")); } #endif bl+="'"; bl+=aBlockName; bl+="'"; if (aBlockTitle) { bl+=" - "; bl+=aBlockTitle; } bl+="
    "; break; // plain text default: case dbgfmt_text: bl.erase(); if (!fDbgOptionsP->fTimestampForAll && withTime) { // avoid timestamp here if all lines get timestamped anyway bl+="[" + ts + "] "; } bl+=aBlockName; if (aBlockTitle) { bl+=" - "; bl+=aBlockTitle; } break; } // switch preamble // - attributes if (aBlockFmt) { // first expand all printf parameters string attrs; vStringObjPrintf(attrs,aBlockFmt,true,aArgs); // isolate |-separated attribute format strings cAppCharP q,r,s,p=attrs.c_str(); while (*p) { // search for beginning of value q=p; while(*q && *q!='=' && *q!='|') q++; // search for end of value r=q; s=q; // in case we don't have a = if (*q=='=') { s=q+1; r=s; while (*r && *r!='|') r++; } // now: p=start of attrname, q=end of attrname // s=start of value, r=end of value // output an attribute now if (q>p && r>s) { switch (fDbgOptionsP->fOutputFormat) { // XML case dbgfmt_xml: bl+=" "; bl.append(p,q-p); bl+="=\""; bl.append(s,r-s); bl+="\""; break; case dbgfmt_html: bl+=", "; bl.append(p,q-p); bl+="="; bl.append(s,r-s); bl+=""; break; case dbgfmt_text: default: bl+=", "; bl.append(p,q-p); bl+="="; bl.append(s,r-s); break; } // switch attribute } // non-empty attribute // more attributes to come? if (*r=='|') r++; // skip separator p=r; } // while } // attributes present // - finalize Block switch (fDbgOptionsP->fOutputFormat) { // XML case dbgfmt_xml: bl+=">"; break; // HTML case dbgfmt_html: bl+=""; // end span for attributes if (fDbgOptionsP->fFoldingMode!=dbgfold_none) { StringObjAppendPrintf(bl, " [--][++]", long(getBlockNo()), long(getBlockNo()) ); } // link to end of block StringObjAppendPrintf(bl," [->end]", long(getBlockNo())); // link to start of enclosing block (if any) if (fBlockHistory) { StringObjAppendPrintf(bl," [->enclosing]", long(fBlockHistory->fBlockNo)); } // start div for content folding if (fDbgOptionsP->fFoldingMode!=dbgfold_none) { StringObjAppendPrintf(bl, "
    ", long(getBlockNo()), aCollapsed ? "none" : "inline" ); } bl+="
      "; // now start list for block's contents break; // plain text default: case dbgfmt_text: break; } // switch preamble // now output Block line (on current indent level) DebugPutLine(TDBG_LOCATION_NONE bl.c_str(), bl.size()); // increase indent level (applies to all Block contents) fIndent++; // save Block on stack TBlockLevel *newLevel = new TBlockLevel; newLevel->fBlockName=aBlockName; newLevel->fNext=fBlockHistory; newLevel->fBlockNo=getBlockNo(); // save block number to reference block in collapse box at end of block nextBlock(); // increment block number fBlockHistory=newLevel; // insert new level at start of list } } // TDebugLoggerBase::DebugVOpenBlock // close named Block. If no name given, topmost Block will be closed void TDebugLoggerBase::DebugCloseBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName) { if (fOutStarted && getMask() && fDbgOptionsP && fBlockHistory) { if (aBlockName==NULL) { #if SYDEBUG>1 internalCloseBlocks(TDBG_LOCATION_ARG fBlockHistory->fBlockName.c_str(),"Block Nest Warning: Missing Block name at close"); #else internalCloseBlocks(TDBG_LOCATION_ARG fBlockHistory->fBlockName.c_str(),NULL); #endif } else { internalCloseBlocks(TDBG_LOCATION_ARG aBlockName,NULL); } } } // TDebugLoggerBase::DebugCloseBlock // internal helper used to close all or some Blocks void TDebugLoggerBase::internalCloseBlocks(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aCloseComment) { if (!fDbgOptionsP) return; // security bool withTime = fDbgOptionsP->fTimestampStructure; string comment; #if SYDEBUG>1 if (!fBlockHistory && aBlockName) { // no blocks open any more and not close-all-remaining call (log close...) DebugPrintf(TDBG_LOCATION_ARG DBG_EXOTIC+DBG_ERROR,"Block Nest Warning: Trying to close block '%s', but no block is open",aBlockName); } #endif while (fBlockHistory) { // prepare comment comment.erase(); if (aCloseComment) { comment += " - "; comment += aCloseComment; } // check if closing top-of-stack Block now bool found= (aBlockName && strucmp(aBlockName,fBlockHistory->fBlockName.c_str())==0); if (!found && fBlockHistory->fNext==NULL) { // last Block always counts as "found"... found = true; #if SYDEBUG>1 // ...but issue warning as name is not what we would have expected StringObjAppendPrintf(comment, " - Block Nest Warning: closing '%s', but expected '%s'",aBlockName ? aBlockName : "", fBlockHistory->fBlockName.c_str()); #endif } // now close topmost Block string ts,bl; // - get time if needed and possibly put it within indented block if (withTime) { StringObjTimestamp(ts,getSystemNowAs(TCTX_SYSTEM)); // for XML, the time must be shown before the close tag on a separate line if (fDbgOptionsP->fOutputFormat == dbgfmt_xml) { StringObjPrintf(bl,"",ts.c_str()); DebugPutLine(TDBG_LOCATION_NONE bl.c_str(), bl.size()); // still within block, indented } } // - now unindent if (fIndent>0) fIndent--; // - then create closing Block #if SYDEBUG>1 if (!found) StringObjAppendPrintf(comment," - Block Nest Warning: implicitly closed (by explicitly closing '%s')",aBlockName ? aBlockName : ""); #endif switch (fDbgOptionsP->fOutputFormat) { // XML case dbgfmt_xml: bl="fBlockName; bl+=">"; if (!comment.empty()) { bl+=" "; } break; // HTML case dbgfmt_html: bl="
    "; // end of content list if (fDbgOptionsP->fFoldingMode!=dbgfold_none) { StringObjAppendPrintf(bl, "", long(fBlockHistory->fBlockNo) ); } StringObjAppendPrintf(bl,"",long(fBlockHistory->fBlockNo)); if (withTime) { bl += MAKEDBGLINK(string("[") + ts + "] "); } bl += "End of '"; bl+=fBlockHistory->fBlockName; bl+="'"; bl+=comment; bl+=""; // link to top of block StringObjAppendPrintf(bl," [->top]",long(fBlockHistory->fBlockNo)); // link to end of enclosing block (if any) if (fBlockHistory->fNext) { StringObjAppendPrintf(bl," [->enclosing]",long(fBlockHistory->fNext->fBlockNo)); } if (fDbgOptionsP->fFoldingMode!=dbgfold_none) { bl+="
    "; // end of folding division } bl+="
  • "; // end of list entry containing entire block break; // plain text default: case dbgfmt_text: bl.erase(); if (!fDbgOptionsP->fTimestampForAll && withTime) { // avoid timestamp here if all lines get timestamped anyway bl+="[" + ts + "] "; } bl+="End of '"; bl+=fBlockHistory->fBlockName; bl+="'"; bl+=comment; break; } // switch Block close // - output closing Block line DebugPutLine(TDBG_LOCATION_NONE bl.c_str(), bl.size()); // - remove Block level TBlockLevel *closedLevel = fBlockHistory; fBlockHistory = closedLevel->fNext; delete closedLevel; // if we have found the Block, exit here if (found) break; } } // TDebugLoggerBase::internalCloseBlocks #ifdef USE_DLT static void RegisterContext(DltContext *aHandle, const char *aContextID, const char *aDescription) { std::string envName = "LIBSYNTHESIS_"; envName += aContextID; const char *value = getenv(envName.c_str()); if (value) { // Explicit level. DltLogLevelType level = (DltLogLevelType)atoi(value); dlt_register_context_ll_ts(aHandle, aContextID, aDescription, level, DLT_TRACE_STATUS_OFF); } else { // Default level. dlt_register_context(aHandle, aContextID, aDescription); } } #endif // USE_DLT // start debugging output if needed and sets fOutStarted bool TDebugLoggerBase::DebugStartOutput(void) { if (!fOutStarted) { #ifdef USE_DLT if (fDbgOptionsP && fDbgOptionsP->fOutputFormat==dbgfmt_dlt) { // Register our logging contexts. if (!DbgDLTInitialized) { RegisterContext(&DbgProtoContext, "PROT", "SyncML protocol related information"); RegisterContext(&DbgSessionContext, "SESS", "session management related information"); RegisterContext(&DbgAdminContext, "ADMN", "verything that has to do with administrative data (anchors, targets, map table)"); RegisterContext(&DbgDataContext, "DATA", "Everything that has to do with handling user data (data objects). Actual user data will however be shown only if loglevel >= debug."); RegisterContext(&DbgRemoteInfoContext, "REMI", "This shows information delivered in the remote party's device information, such as manufacturer name, datatypes supported, fields supported etc."); RegisterContext(&DbgParseContext, "PARS", "This shows information related to parsing and processing incoming data from the remote party. Actual user data will however be shown only if loglevel >= debug."); RegisterContext(&DbgGenerateContext, "GEN", "This shows information related to generating outgoing data for the remote party. Actual user data will however be shown only if loglevel >= debug."); RegisterContext(&DbgTranspContext, "TRNS", "shows transport (http and TCP communication) related information"); RegisterContext(&DbgSyncMLTKContext, "SMLT", "messages generated by the SyncML Toolkit code"); RegisterContext(&DbgDefaultContext, "SYS", "any other libsynthesis debug log message that does not fit in any of the other contexts"); DbgDLTInitialized = true; } fOutStarted = true; } else #endif // USE_DLT if (fOutputLoggerP) { // using another logger, call it to start output fOutStarted = fOutputLoggerP->DebugStartOutput(); if (fOutStarted) { // start with indent level of parent logger fIndent = fOutputLoggerP->fIndent; // note: we'll use the parent logger's block number... fBlockNo = 0; // ...but init to something just in case } } else if (fDbgOptionsP && fDbgOutP && !fDbgPath.empty()) { // try to open the debug channel (force to openclose if we have multiple threads mixed in one file) if (fDbgOutP->openDbg( fDbgPath.c_str(), DbgOutFormatExtensions[fDbgOptionsP->fOutputFormat], fDbgOptionsP->fSubThreadMode==dbgsubthread_linemix ? dbgflush_openclose : fDbgOptionsP->fFlushMode, !fDbgOptionsP->fAppend )) { // make sure we don't recurse when we produce some output fOutStarted = true; fIndent = 0; // reset to make sure // create a block number that is unique in the file, even if we append multiple times. // We assume that a block consumes at least 256 bytes, so size_of_file/256 always gets // an unused block ID within that file // 256 is a safe assumption because the "fold" button alone are around 250 bytes fBlockNo = 1 + (fDbgOutP->dbgFileSize()/256); // now create required prefix DebugPutLine(TDBG_LOCATION_NONE fDbgOptionsP->fCustomPrefix.empty() ? DbgOutDefaultPrefixes[fDbgOptionsP->fOutputFormat] : fDbgOptionsP->fCustomPrefix.c_str()); // add folding javascript if needed if (fDbgOptionsP->fOutputFormat==dbgfmt_html && fDbgOptionsP->fFoldingMode!=dbgfold_none) { DebugPutLine(TDBG_LOCATION_NONE FoldingPrefix); } } // debug channel opened successfully } // use own debug channel } // environment ready to start output return fOutStarted; } // TDebugLoggerBase::DebugStartOutput // @brief finalize debugging output (close Blocks, close output channel) void TDebugLoggerBase::DebugFinalizeOutput(void) { if (fOutputLoggerP) { // just close my own blocks internalCloseBlocks(TDBG_LOCATION_NONE NULL,"closed because sub-log ends here"); } if (fOutStarted && fDbgOptionsP && fDbgOutP) { // close all left-open open Blocks internalCloseBlocks(TDBG_LOCATION_NONE NULL,"closed because log ends here"); // now finalize output // - special stuff before if (fDbgOptionsP->fOutputFormat == dbgfmt_xml) fIndent=0; // unindent to zero (document is not a real Block) // - then suffix DebugPutLine(TDBG_LOCATION_NONE fDbgOptionsP->fCustomSuffix.empty() ? DbgOutDefaultSuffixes[fDbgOptionsP->fOutputFormat] : fDbgOptionsP->fCustomSuffix.c_str()); // now close the debug channel fDbgOutP->closeDbg(); } // whatever happened, we are not started any more fOutStarted=false; } // TDebugLoggerBase::DebugFinalizeOutput // Output single line to debug channel (includes indenting and other prefixing, but no further formatting) void TDebugLoggerBase::DebugPutLine(TDBG_LOCATION_PROTO cAppCharP aText, stringSize aTextSize, bool aPre) { #ifdef USE_DLT if (fDbgOptionsP && fDbgOptionsP->fOutputFormat==dbgfmt_dlt) { // One example where this gets called is DebugVOpen/CloseBlock() // with lines prepared as if we are printing plain text. Use // a fairly neutral log level here. if (aText) { if (aTextSize > 0 && aTextSize < strlen(aText)) { string buffer(aText, aTextSize); DLT_LOG(DbgDefaultContext, DLT_LOG_INFO, DLT_STRING(buffer.c_str())); } else { DLT_LOG(DbgDefaultContext, DLT_LOG_INFO, DLT_STRING(aText)); } } return; } #endif // USE_DLT if (!aText || (!fDbgOutP && !fOutputLoggerP)) return; if (*aText) { // not an empty line string msg; msg.erase(); // prefix with timestamp if selected in text format if (fDbgOptionsP && fDbgOptionsP->fOutputFormat==dbgfmt_text && fDbgOptionsP->fTimestampForAll) { // prefix each line (before the indent!) with a timestamp string ts; StringObjTimestamp(ts,getSystemNowAs(TCTX_SYSTEM)); msg='['; msg+=ts; msg+="] "; } // Indent if selected if (fDbgOptionsP && !fDbgOptionsP->fIndentString.empty() && !(fDbgOptionsP->fOutputFormat==dbgfmt_html && aPre)) { // with indent for (uInt16 n=0; nfIndentString; } } // add message itself if (aTextSize) msg.append(aText,aTextSize); else msg.append(aText); // now output if (fOutputLoggerP) { // use parent's output fOutputLoggerP->fDbgOutP->putLine(msg.c_str(),false); // %%% no forceflush for now } else { // use my own output channel fDbgOutP->putLine(msg.c_str(),false); // %%% no forceflush for now } } } // TDebugLoggerBase::DebugPutLine // TDebugLogger implementation // --------------------------- // constructor TDebugLogger::TDebugLogger(GZones *aGZonesP) : inherited(aGZonesP) { #ifdef MULTI_THREAD_SUPPORT fMainThreadID=0; fSubThreadLogs=NULL; fSilentLoggerP=NULL; #endif } // TDebugLogger::TDebugLogger // destructor TDebugLogger::~TDebugLogger() { #ifdef MULTI_THREAD_SUPPORT // remove subthread loggers TSubThreadLog* subThreadP = fSubThreadLogs; fSubThreadLogs = NULL; while (subThreadP) { // delete logger if any if (subThreadP->fSubThreadLogger) { SYSYNC_TRY { delete subThreadP->fSubThreadLogger; } SYSYNC_CATCH(...) // nop SYSYNC_ENDCATCH } TSubThreadLog* delP = subThreadP; subThreadP = subThreadP->fNext; delete delP; } // if (fSilentLoggerP) { delete fSilentLoggerP; fSilentLoggerP = NULL; } #endif } // TDebugLogger::~TDebugLogger #ifdef MULTI_THREAD_SUPPORT void TDebugLogger::setOptions(const TDbgOptions *aDbgOptionsP) { TDebugLoggerBase::setOptions(aDbgOptionsP); TSubThreadLog* subThreadP = fSubThreadLogs; while (subThreadP) { if (subThreadP->fSubThreadLogger) { subThreadP->fSubThreadLogger->setOptions(aDbgOptionsP); } subThreadP = subThreadP->fNext; } } /// @brief find (and possibly delete) subthread record /// @param aAndRemove[in] if set, the subthread record will be removed in a thread safe way /// IF AND ONLY IF aThreadID is the calling thread (i.e. only own thread may be removed from the list)! /// Note that the caller must take care of deleting the subthread record TSubThreadLog *TDebugLogger::findSubThread(uInt32 aThreadID, bool aAndRemove) { TSubThreadLog* subThreadP = fSubThreadLogs; TSubThreadLog** subThreadLinkPP = &fSubThreadLogs; while (subThreadP) { if (subThreadP->fThreadID == aThreadID) { if (aAndRemove) { // bridge previous with next in one single assignment (i.e. thread safe) *subThreadLinkPP = subThreadP->fNext; } // return found record (note that it MUST BE DELETED by caller if no longer used) return subThreadP; } subThreadLinkPP = &subThreadP->fNext; subThreadP = *subThreadLinkPP; } return NULL; // none found } // TDebugLogger::findSubThread /// @brief find or create logger for subthread TDebugLoggerBase *TDebugLogger::getThreadLogger(bool aCreateNew) { if (fOutputLoggerP) { TDebugLoggerBase *logger = fOutputLoggerP->getThreadLogger(aCreateNew); if (logger) return logger; } if (!fDbgOptionsP || fDbgOptionsP->fSubThreadMode==dbgsubthread_none) return this; // no options, do not handle subthreads specially uIntArch threadID = myThreadID(); if (fDbgOptionsP->fSubThreadMode==dbgsubthread_linemix || threadID==fMainThreadID) { // In line mix and for mainthread - I am the logger for this thread! return this; } TSubThreadLog* subThreadP = findSubThread(threadID); if (subThreadP) { // we know this subthread, return its logger return subThreadP->fSubThreadLogger; // can be NULL if subthread logging is disabled } // unknown subthread if (fMainThreadID==0) { // no current mainthread, let subthread write to main log // Note: this makes sure log info possibly trailing the DebugThreadOutputDone() // also lands in the main log. This is not critical - the only thing that must be // ensured is that starting new threads is made only with DebugDefineMainThread set. return this; } // new subthread, create entry in list if (aCreateNew) { string s; // create new entry subThreadP = new TSubThreadLog; subThreadP->fThreadID=threadID; subThreadP->fNext=fSubThreadLogs; // link current list behind this new entry // create logger for the thread (or none) switch (fDbgOptionsP->fSubThreadMode) { case dbgsubthread_separate: // separate file for subthread output // - create new base logger subThreadP->fSubThreadLogger = new TDebugLoggerBase(fGZonesP); // - install output (copy) subThreadP->fSubThreadLogger->installOutput(fDbgOutP ? fDbgOutP->clone() : NULL); // - same options subThreadP->fSubThreadLogger->setOptions(getOptions()); // - inherit current mask/enable subThreadP->fSubThreadLogger->setMask(getMask()); subThreadP->fSubThreadLogger->setEnabled(fDebugEnabled); // - debug path is same as myself plus Thread ID subThreadP->fSubThreadLogger->setDebugPath(fDbgPath.c_str()); StringObjPrintf(s,"_%lu",(long unsigned)threadID); subThreadP->fSubThreadLogger->appendToDebugPath(s.c_str()); break; case dbgsubthread_suppress: default: // no output from subthreads subThreadP->fSubThreadLogger=NULL; // no logger break; } // now activate by linking it at top of list (this is thread safe) fSubThreadLogs = subThreadP; // return the logger return subThreadP->fSubThreadLogger; } return NULL; // no logger for this thread } // TDebugLogger::getThreadLogger // helper needed for maintaining old DEBUGPRINTFX() macro syntax TDebugLoggerBase &TDebugLogger::setNextMask(uInt32 aDbgMask) { TDebugLoggerBase *loggerP = getThreadLogger(); if (loggerP) { // return pointer to loggerbase whose DebugPrintfLastMask() must be called return loggerP->inherited::setNextMask(aDbgMask); } else { // we have no logger but still need to return something if (!fSilentLoggerP) { fSilentLoggerP = new TDebugLoggerBase(fGZonesP); fSilentLoggerP->setEnabled(false); } fSilentLoggerP->setNextMask(DBG_ERROR); // must set non-zero to make sure it is NOT output! return *fSilentLoggerP; } } // TDebugLoggerBase::setNextMask // output text to debug channel, with checking for subthreads void TDebugLogger::DebugPuts(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aText, stringSize aTextSize, bool aPreFormatted) { TDebugLoggerBase *loggerP = getThreadLogger(); if (loggerP) loggerP->inherited::DebugPuts(TDBG_LOCATION_ARG aDbgMask,aText,aTextSize,aPreFormatted); } // TDebugLogger::DebugPuts void TDebugLogger::DebugVPrintf(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aFormat, va_list aArgs) { TDebugLoggerBase *loggerP = getThreadLogger(); if (loggerP) loggerP->inherited::DebugVPrintf(TDBG_LOCATION_ARG aDbgMask,aFormat,aArgs); } // TDebugLogger::DebugVPrintf void TDebugLogger::DebugVOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed, cAppCharP aBlockFmt, va_list aArgs) { TDebugLoggerBase *loggerP = getThreadLogger(); if (loggerP) loggerP->inherited::DebugVOpenBlock(TDBG_LOCATION_ARG aBlockName, aBlockTitle, aCollapsed, aBlockFmt, aArgs); } // TDebugLogger::DebugVOpenBlock void TDebugLogger:: DebugCloseBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName) { TDebugLoggerBase *loggerP = getThreadLogger(); if (loggerP) loggerP->inherited::DebugCloseBlock(TDBG_LOCATION_ARG aBlockName); } // TDebugLogger::DebugCloseBlock #endif // output all buffered subthread's output in a special subthread Block in the main output void TDebugLogger::DebugShowSubThreadOutput(void) { #ifdef MULTI_THREAD_SUPPORT // nop as long mixed-block mode is not implemented #endif } // TDebugLogger::DebugShowSubThreadOutput // the calling thread signals that it is done with doing output for now. If the main // thread is doing this and we have bufferandmix mode, the next subthread will be allowed // to write into the output channel until a new main thread gains control via // DebugDefineMainThread(); void TDebugLogger::DebugThreadOutputDone(bool aRemoveIt) { #ifdef MULTI_THREAD_SUPPORT uIntArch threadID = myThreadID(); if (threadID==fMainThreadID) { // current main thread done fMainThreadID = 0; } // for session logs, subthreads are usually left in the list at this time (aRemoveIt==false) // (as they will get deleted with the session logger later anyway) if (aRemoveIt) { TSubThreadLog* tP = findSubThread(threadID,true); if (tP) { if (tP->fSubThreadLogger) { SYSYNC_TRY { delete tP->fSubThreadLogger; } SYSYNC_CATCH(...) // nop SYSYNC_ENDCATCH } delete tP; } } #endif } // TDebugLogger::DebugThreadOutputDone // Used to regain control as main thread (e.g. for the next request of a session which // possibly occurs from another thread). void TDebugLogger::DebugDefineMainThread(void) { #ifdef MULTI_THREAD_SUPPORT uIntArch threadID = myThreadID(); // if this is already the main thread, no op if (threadID == fMainThreadID) return; // nop, done // thread is not the current main thread // - search if it is a registered subthread TSubThreadLog *subThreadP = findSubThread(threadID); if (fMainThreadID==0) { // no main thread currently registered if (subThreadP!=NULL) { // this is not a new thread, but a known subthread, can't get main thread now return; // no further op } else { // this is not a known subthread, so it can become the main thread fMainThreadID = threadID; return; // done } } else { // cannot become main thread, will be treated as subthread if it generates output // - no op required } #endif } // TDebugLogger::DebugDefineMainThread } // namespace sysync #endif // SYDEBUG // eof syncevolution-1.5/src/synthesis/src/sysync/debuglogger.h0000755000373300037200000004774212424517753025325 0ustar00nightlyallusers00000000000000/* * File: debuglogger.h * * Author: Lukas Zeller (luz@plan44.ch) * * Global debug mechanisms * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * 2005-08-04 : luz : created * */ #ifndef DEBUGLOGGER_H #define DEBUGLOGGER_H #ifdef SYDEBUG #include "generic_types.h" #include "platform_mutex.h" #include "platform_thread.h" #include "sysync.h" #include "sysync_noncopyable.h" namespace sysync { /// @brief Debug output formats typedef enum { dbgfmt_text, ///< plain text format (but can be indented) dbgfmt_xml, ///< XML format dbgfmt_html, ///< HTML format #ifdef USE_DLT dbgfmt_dlt, ///< GENIVI Diagnostic Log and Trace #endif numDbgOutFormats } TDbgOutFormats; /// @brief HTML dynamic folding typedef enum { dbgfold_none, ///< do not include dynamic folding into HTML logs dbgfold_collapsed, ///< include folding - all collapsed by default dbgfold_expanded, ///< include folding - all expanded by default dbgfold_auto, ///< include folding - collapse/expand state predefined on a block-by-block basis numDbgFoldingModes } TDbgFoldingModes; /// @brief Debug flush modes typedef enum { dbgflush_none, ///< no flush, keep open as long as possible dbgflush_flush, ///< flush every debug message dbgflush_openclose, ///< open and close debug channel separately for every message (as in 2.x engine) numDbgFlushModes } TDbgFlushModes; /// @brief Debug subthread logging modes typedef enum { dbgsubthread_none, ///< do not handle output from subthread specially dbgsubthread_suppress, ///< suppress output from subthreads dbgsubthread_separate, ///< create separate output stream (=file) for each subthread dbgsubthread_linemix, ///< mix output on a line by line basis (forcing output to slow openclose mode) dbgsubthread_bufferandmix, ///< buffer thread's output and mix it into main stream when appropriate numDbgSubthreadModes } TDbgSubthreadModes; /// @brief HTML linking into source code typedef enum { dbgsource_none, ///< do not include links into source code in HTML logs dbgsource_hint, ///< no links, but info about what file/line number the message comes from dbgsource_doxygen, ///< include link into doxygen prepared HTML version of source code dbgsource_txmt, ///< include txmt:// link (understood by TextMate and BBEdit) into source code numDbgSourceModes } TDbgSourceModes; #ifndef HARDCODED_CONFIG extern cAppCharP const DbgOutFormatNames[numDbgOutFormats]; extern cAppCharP const DbgFoldingModeNames[numDbgFoldingModes]; extern cAppCharP const DbgFlushModeNames[numDbgFlushModes]; extern cAppCharP const DbgSubthreadModeNames[numDbgSubthreadModes]; extern cAppCharP const DbgSourceModeNames[numDbgSourceModes]; #endif extern cAppCharP const DbgOutFormatExtensions[numDbgOutFormats]; /// @brief Debug options container class TDbgOptions { public: // constructor TDbgOptions(); // methods void clear(void); // properties TDbgOutFormats fOutputFormat; ///< format string fIndentString; ///< indent string string fCustomPrefix; ///< custom prefix (different xml header or html with different styles for example) string fCustomSuffix; ///< custom suffix (should match prefix) string fBasename; ///< the initial part of the log file name, can override the hard-coded TARGETID (empty if unset) bool fSeparateMsgs; ///< separate message lines (needed especially in XML to avoid unformatted PCDATA block) bool fTimestampStructure; ///< include timestamp for structure elements (blocks) bool fTimestampForAll; ///< include timestamp information for every message bool fThreadIDForAll; ///< include thread ID information for every message TDbgFlushModes fFlushMode; ///< how and when to flush TDbgFoldingModes fFoldingMode; ///< if and how to fold HTML output TDbgSourceModes fSourceLinkMode; ///< if and how to link with source code string fSourceRootPath; ///< defines root path for source links bool fAppend; ///< if set, existing debug files will not be overwritten, but appended to TDbgSubthreadModes fSubThreadMode; ///< how to handle debug messages from subthreads uInt32 fSubThreadBufferMax; ///< how much to buffer for subthread maximally }; // TDbgOptions /// @brief Debug output channel class TDbgOut : noncopyable { // construction/destruction private: bool fDestructed; // flag which will be set once destruct() has been called - by the outermost derivate's destructor public: TDbgOut(); virtual ~TDbgOut(); virtual void doDestruct(void); // will be called by destruct, derived must call inherited if they implement it void destruct(void); // to be called by ALL destructors of derivates. // methods /// @brief duplicate output channel virtual TDbgOut *clone(void) { return new TDbgOut; }; /// @brief open debug output channel /// Notes: /// - Autocloses current channel if already open /// - May not actually open the channel, but should test if channel is writable /// @return false if debug channel cannot be opened and written to /// @param aDbgOutputName[in] name (usually file name) of debug output channel /// @param aSuggestedExtension[in] file extension suggested (may not be used depending on channel type) /// @param aFlushMode[in] flush mode to be used on the channel /// @param aOverWrite[in] if true, debug output channel (=file) will be overwritten (otherwise: appended to) /// @param aRawMode[in] if true, debug output channel (=file) is opened in binary raw mode (for message dumps etc.) virtual bool openDbg(cAppCharP aDbgOutputName, cAppCharP aSuggestedExtension, TDbgFlushModes aFlushMode, bool aOverWrite, bool aRawMode=false) { return true; }; /// @brief get current size of output file /// @return number of bytes, 0 if file is empty or for non-files (like console) virtual uInt32 dbgFileSize(void) { return 0; }; /// @brief close and flush all log output virtual void closeDbg(void) { /* nop */ }; /// @brief write single line to debug output channel /// @param aLine[in] text for line to be written out (must not contain line ends) /// @param aForceFlush[in] if true, debug output will be flushed to permanent storage regardless of current flush mode virtual void putLine(cAppCharP aLine, bool aForceFlush) { /* nop */}; /// @brief write raw data to debug output channel (usually makes sense only when channel is opened in raw mode) /// @param aData[in] pointer to data to be written /// @param aSize[in] size in bytes of data block at aData to be written virtual void putRawData(cAppPointer aData, memSize aSize) { /* nop */}; protected: bool fIsOpen; }; // TDbgOut #ifndef NO_C_FILES /// @brief Standard file debug output channel class TStdFileDbgOut : public TDbgOut { typedef TDbgOut inherited; public: // constructor/destructor TStdFileDbgOut(); virtual ~TStdFileDbgOut(); // methods virtual TDbgOut *clone(void) { return new TStdFileDbgOut; }; virtual bool openDbg(cAppCharP aDbgOutputName, cAppCharP aSuggestedExtension, TDbgFlushModes aFlushMode, bool aOverWrite, bool aRawMode=false); virtual uInt32 dbgFileSize(void); virtual void closeDbg(void); virtual void putLine(cAppCharP aLine, bool aForceFlush); virtual void putRawData(cAppPointer aData, memSize aSize); private: TDbgFlushModes fFlushMode; string fFileName; FILE * fFile; MutexPtr_t mutex; }; // TStdFileDbgOut #endif /// @brief Output to console class TConsoleDbgOut : public TDbgOut { typedef TDbgOut inherited; public: // constructor/destructor TConsoleDbgOut(); // methods virtual TDbgOut *clone(void) { return new TConsoleDbgOut; }; virtual bool openDbg(cAppCharP aDbgOutputName, cAppCharP aSuggestedExtension, TDbgFlushModes aFlushMode, bool aOverWrite, bool aRawMode=false); virtual void closeDbg(void); virtual void putLine(cAppCharP aLine, bool aForceFlush); virtual void putRawData(cAppPointer aData, memSize aSize) { /* not supported on console, just NOP */ }; }; // TConsoleDbgOut // Debug logger class // ------------------ /// @brief hierachical block history typedef struct BlockLevel { string fBlockName; uInt32 fBlockNo; struct BlockLevel *fNext; } TBlockLevel; class TDebugLogger; class GZones; /// @brief Debug logger base class (without subthread handling) class TDebugLoggerBase : noncopyable { public: // constructor/destructor TDebugLoggerBase(GZones *aGZonesP); virtual ~TDebugLoggerBase(); // methods /// @brief install output channel handler object (and pass it's ownership!) /// @param aDbgOutP[in] output channel to be used for this logger (will be owned and finally destroyed by the logger) void installOutput(TDbgOut *aDbgOutP); /// @brief link this logger to another logger and redirect output to that logger /// @param aDebugLoggerP[in] another logger, that must be alive as long as this logger is alive void outputVia(TDebugLoggerBase *aDebugLoggerP); /// @brief check if an output channel is already established other than with default values bool outputEstablished(void) { return fOutStarted; }; /// @brief set debug options virtual void setOptions(const TDbgOptions *aDbgOptionsP) { fDbgOptionsP = aDbgOptionsP; }; /// @brief get debug options pointer const TDbgOptions *getOptions(void) { return fDbgOptionsP; }; // @brief convenience version for getting time lineartime_t getSystemNowAs(timecontext_t aContext); /// @brief get current debug mask for this logger. /// Note that setEnabled(false) will cause this to return 0 even if the mask itself is non-zero uInt32 getMask(void) { return fDebugEnabled ? fDebugMask : 0; }; uInt32 getRealMask(void) { return fDebugMask; }; /// @brief set new debug mask for this logger void setMask(uInt32 aDbgMask) { fDebugMask=aDbgMask; }; /// @brief enable or disable this logger (but leave dbgMask intact) void setEnabled(bool aEnabled) { fDebugEnabled=aEnabled; }; /// @brief set debug output path + filename (no extension, please) void setDebugPath(cAppCharP aPath) { fDbgPath = aPath; }; /// @brief append to debug output path + filename (no extension, please) void appendToDebugPath(cAppCharP aPathElement) { fDbgPath += aPathElement; }; /// @brief get debug output file path (w/o extension) cAppCharP getDebugPath(void) { return fOutputLoggerP ? fOutputLoggerP->getDebugPath() : fDbgPath.c_str(); }; /// @brief get debug output file name (w/o path or extension) cAppCharP getDebugFilename(void) { if (fOutputLoggerP) return fOutputLoggerP->getDebugFilename(); size_t n=fDbgPath.find_last_of("\\/:"); return fDbgPath.c_str()+(n!=string::npos ? n+1 : 0); }; /// @brief get debug output file extension cAppCharP getDebugExt(void) { return fOutputLoggerP ? fOutputLoggerP->getDebugExt() : fDbgOptionsP ? DbgOutFormatExtensions[fDbgOptionsP->fOutputFormat] : ""; }; // - normal output /// @brief Write text to debug output channel. /// Notes: /// - Line will be terminated by linefeed automatically (no need to include a linefeed for single line message) /// - \n chars can be used to separate multi-line output. Formatter will take care that /// all lines are equally indented/formatted/prefixed /// @param aDbgMask debug mask, bits set here must be set in the debuglogger's own mask in order to display the debug text /// @param aText[in] text to be written out /// @param aTextSize[in] if>0, this is the maximum number of chars to output from aText virtual void DebugPuts(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aText, stringSize aTextSize=0, bool aPreFormatted=false); /// @brief Write formatted text to debug output channel. /// @param aDbgMask debug mask, bits set here must be set in the debuglogger's own mask in order to display the debug text /// @param aFormat[in] format text in vprintf style to be written out /// @param aArgs[in] varargs in vprintf style virtual void DebugVPrintf(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aFormat, va_list aArgs); /// @brief Write formatted text to debug output channel. /// @param aDbgMask debug mask, bits set here must be set in the debuglogger's own mask in order to display the debug text /// @param aFormat[in] format text in printf style to be written out void DebugPrintf(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aFormat, ...) #ifdef __GNUC__ __attribute__((format(printf, TDBG_LOCATION_ARG_NUM + 3, TDBG_LOCATION_ARG_NUM + 4))) #endif ; /// @brief set debug mask to be used for next DebugPrintfLastMask() call /// @param aDbgMask debug mask, bits set here must be set in the debuglogger's own mask in order to display the debug text virtual TDebugLoggerBase &setNextMask(uInt32 aDbgMask); /// @brief like DebugPrintf(), but using mask previously set by setNextMask() /// @param aFormat[in] format text in printf style to be written out void DebugPrintfLastMask(TDBG_LOCATION_PROTO cAppCharP aFormat, ...) #ifdef __GNUC__ __attribute__((format(printf, TDBG_LOCATION_ARG_NUM + 2, TDBG_LOCATION_ARG_NUM + 3))) #endif ; // - Blocks /// @brief Open structure Block. Depending on the output format, this will generate indent, XML tags, HTML headers etc. /// @param aBlockName[in] Name of Block. Will be used e.g. for tag name in XML. Intention is to group similar entities with the same BlockName /// @param aBlockTitle[in] Title (descriptive text) of Block. /// @param aCollapsed[in] If set, and folding mode is auto, block will be initially collapsed when log is opened in browser. /// @param aBlockFmt[in] Format string for additional Block info. Should contain one or multiple tag=value pairs, separated by the pipe char |. /// This will be used to generate XML attributes or other identifiers. /// @param aArgs[in] varargs in vprintf style for aBlockFmt virtual void DebugVOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed, cAppCharP aBlockFmt, va_list aArgs); /// @brief Open structure Block, printf style variant void DebugOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed, cAppCharP aBlockFmt, ...) #ifdef __GNUC__ __attribute__((format(printf, TDBG_LOCATION_ARG_NUM + 5, TDBG_LOCATION_ARG_NUM + 6))) #endif ; void DebugOpenBlockExpanded(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, cAppCharP aBlockFmt, ...) #ifdef __GNUC__ __attribute__((format(printf, TDBG_LOCATION_ARG_NUM + 4, TDBG_LOCATION_ARG_NUM + 5))) #endif ; void DebugOpenBlockCollapsed(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, cAppCharP aBlockFmt, ...) #ifdef __GNUC__ __attribute__((format(printf, TDBG_LOCATION_ARG_NUM + 4, TDBG_LOCATION_ARG_NUM + 5))) #endif ; /// @brief Open structure Block, without any attributes virtual void DebugOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle=NULL, bool aCollapsed=false); /// @brief Close structure Block. Name is used to close possibly unclosed contained Blocks automatically. virtual void DebugCloseBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName); /// @brief find or create logger for subthread, may return NULL if not implemented virtual TDebugLoggerBase *getThreadLogger(bool aCreateNew=true) { return NULL; } protected: // helper methods /// @brief start debugging output if needed and sets fOutStarted bool DebugStartOutput(void); /// @brief Output single line to debug channel (includes indenting, but no other formatting) void DebugPutLine(TDBG_LOCATION_PROTO cAppCharP aText, stringSize aTextSize=0, bool aPre=false); /// @brief finalize debugging output void DebugFinalizeOutput(void); /// @brief get block number uInt32 getBlockNo(void) { return fOutputLoggerP ? fOutputLoggerP->getBlockNo() : fBlockNo; }; /// @brief increment block number void nextBlock(void) { if (fOutputLoggerP) fOutputLoggerP->nextBlock(); else fBlockNo++; }; /// @brief internal helper for closing debug Blocks /// @param aBlockName[in] Name of Block to close. All Blocks including the first with given name will be closed. If NULL, all Blocks will be closed. /// @param aCloseComment[in] Comment about closing Block. If NULL, no comment will be shown (unless implicit closes occur, which auto-creates a comment) void internalCloseBlocks(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aCloseComment); #ifdef SYDEBUG_LOCATION /// @brief turn text into link to source code string dbg2Link(const TDbgLocation &aTDbgLoc, const string &aTxt); #endif // SYDEBUG_LOCATION // Variables TDbgOut *fDbgOutP; // the debug output string fDbgPath; // the output path+filename (w/o extension) const TDbgOptions *fDbgOptionsP; // the debug options uInt32 fDebugMask; // the debug mask bool fDebugEnabled; // on-off-switch for debugging output uInt32 fNextDebugMask; // debug mask to be used for next DebugPrintfLastMask() uInt16 fIndent; // the current indent TBlockLevel *fBlockHistory; // the linked list of Block history entries bool fOutStarted; // set if output has started uInt32 fBlockNo; // block count for folding GZones *fGZonesP; // zones list for time conversions TDebugLoggerBase *fOutputLoggerP; // another logger to be used for output }; // TDebugLoggerBase #ifdef MULTI_THREAD_SUPPORT /// @brief Subthread log handling typedef struct SubThreadLog { uInt32 fThreadID; struct SubThreadLog *fNext; TDebugLoggerBase *fSubThreadLogger; } TSubThreadLog; #endif /// @brief Debug logger class class TDebugLogger : public TDebugLoggerBase { typedef TDebugLoggerBase inherited; public: // constructor/destructor TDebugLogger(GZones *aGZonesP); virtual ~TDebugLogger(); // methods #ifdef MULTI_THREAD_SUPPORT /// @brief set debug options in this logger and all sub thread loggers virtual void setOptions(const TDbgOptions *aDbgOptionsP); virtual void DebugPuts(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aText, stringSize aTextSize=0, bool aPreFormatted=false); virtual void DebugVPrintf(TDBG_LOCATION_PROTO uInt32 aDbgMask, cAppCharP aFormat, va_list aArgs); virtual void DebugVOpenBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName, cAppCharP aBlockTitle, bool aCollapsed, cAppCharP aBlockFmt, va_list aArgs); virtual void DebugCloseBlock(TDBG_LOCATION_PROTO cAppCharP aBlockName); virtual TDebugLoggerBase &setNextMask(uInt32 aDbgMask); #endif // - thread debug output serializing /// @brief output all buffered subthread's output in a special subthread Block in the main output void DebugShowSubThreadOutput(void); /// @brief signals the calling thread that it is done with doing output for now. /// @param aRemoveIt[in] if set, do remove thread from the subthread logger list /// Notes: /// - If the main thread is doing this and we have bufferandmix mode, the next subthread will be allowed /// to write into the output channel until a new main thread gains control via DebugDefineMainThread(); void DebugThreadOutputDone(bool aRemoveIt=false); /// @brief Define the current calling thread as the main debug thread /// Note: This is used for example when starting to process the next request of a session which possibly // occurs from another thread). void DebugDefineMainThread(void); private: #ifdef MULTI_THREAD_SUPPORT // helpers /// @brief find (and possibly delete) subthread record /// @param aAndRemove[in] if set, the subthread record will be removed in a thread safe way /// IF AND ONLY IF aThreadID is the calling thread (i.e. only own thread may be removed from the list)! /// Note that the caller must take care of deleting the subthread record TSubThreadLog *findSubThread(uInt32 aThreadID, bool aAndRemove=false); /// @brief find or create logger for subthread, actually implements the call virtual TDebugLoggerBase *getThreadLogger(bool aCreateNew=true); // Variables uIntArch fMainThreadID; TSubThreadLog *fSubThreadLogs; // the linked list of active subthreads TDebugLoggerBase *fSilentLoggerP; // a silent (inactive) logger required for suppressed subthreads #endif }; // TDebugLogger } // namespace sysync #endif // SYDEBUG #endif // DEBUGLOGGER_H // eof syncevolution-1.5/src/synthesis/src/sysync/engineentry.cpp0000755000373300037200000003534112424517753025711 0ustar00nightlyallusers00000000000000/** * @File enginementry.cpp * * @Author Beat Forster (bfo@synthesis.ch) * * @brief TEngineModuleBase * engine bus bar class * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ /* */ #include "prefix_file.h" #include "SDK_util.h" #include "engineentry.h" #include "enginemodulebase.h" namespace sysync { // Get object reference static DB_Callback DBC ( void* aCB ) { return (DB_Callback) aCB; } static TEngineModuleBase* URef( void* aCB ) { return (TEngineModuleBase*)DBC( aCB )->thisBase; } static TunnelWrapper* TW ( CContext aContext ) { return (TunnelWrapper*)aContext; } static TEngineModuleBase* TRef( CContext aContext ) { return URef( TW( aContext )->tCB ); } static SessionH TCon( CContext aContext ) { return TW( aContext )->tContext; } // --- Callback entries -------------------------- void DebugDB ( void* aCB, cAppCharP aParams ) { DBC( aCB )->DB_DebugPuts ( aCB, aParams ); } // DebugDB void DebugExotic ( void* aCB, cAppCharP aParams ) { DBC( aCB )->DB_DebugExotic ( aCB, aParams ); } // DebugExotic void DebugBlock ( void* aCB, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText ) { DBC( aCB )->DB_DebugBlock ( aCB, aTag, aDesc, aAttrText ); } // DebugBlock void DebugEndBlock ( void* aCB, cAppCharP aTag ) { DBC( aCB )->DB_DebugEndBlock ( aCB, aTag ); } // DebugEndBlock void DebugEndThread ( void* aCB ) { DBC( aCB )->DB_DebugEndThread( aCB ); } // DebugEndThread // ---------------------------------------------------------------------------------------- TSyError SetStringMode ( void* aCB, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ) { return URef( aCB )->SetStringMode ( aCharSet, aLineEndMode, aBigEndian ); } // SetStringMode TSyError InitEngineXML ( void* aCB, cAppCharP aConfigXML ) { return URef( aCB )->InitEngineXML ( aConfigXML ); } // InitEngineXML TSyError InitEngineFile( void* aCB, cAppCharP aConfigFilePath ) { return URef( aCB )->InitEngineFile ( aConfigFilePath ); } // InitEngineFile TSyError InitEngineCB ( void* aCB, TXMLConfigReadFunc aReaderFunc, void* aContext ) { return URef( aCB )->InitEngineCB ( aReaderFunc, aContext ); } // InitEngineCB // ---------------------------------------------------------------------------------------- TSyError OpenSession( void* aCB, SessionH *aSessionH, uInt32 aSelector, cAppCharP aSessionName ) { return URef( aCB )->OpenSession( *aSessionH, aSelector, aSessionName ); } // OpenSession TSyError OpenSessionKey( void* aCB, SessionH aSessionH, KeyH *aKeyH, uInt16 aMode ) { return URef( aCB )->OpenSessionKey ( aSessionH, *aKeyH, aMode ); } // OpenSessionKey TSyError SessionStep( void* aCB, SessionH aSessionH, uInt16 *aStepCmd, TEngineProgressInfo *aInfoP ) { return URef( aCB )->SessionStep ( aSessionH, *aStepCmd, aInfoP ); } // SessionStep TSyError GetSyncMLBuffer( void* aCB, SessionH aSessionH, bool aForSend, appPointer *aBuffer, memSize *aBufSize ) { return URef( aCB )->GetSyncMLBuffer ( aSessionH, aForSend, *aBuffer, *aBufSize ); } // GetSyncMLBuffer TSyError RetSyncMLBuffer( void* aCB, SessionH aSessionH, bool aForSend, memSize aRetSize ) { return URef( aCB )->RetSyncMLBuffer ( aSessionH, aForSend, aRetSize ); } // RetSyncMLBuffer TSyError ReadSyncMLBuffer ( void* aCB, SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize *aValSize ) { return URef( aCB )->ReadSyncMLBuffer ( aSessionH, aBuffer, aBufSize, *aValSize ); } // ReadSyncMLBuffer TSyError WriteSyncMLBuffer( void* aCB, SessionH aSessionH, appPointer aBuffer, memSize aValSize ) { return URef( aCB )->WriteSyncMLBuffer ( aSessionH, aBuffer, aValSize ); } // WriteSyncMLBuffer TSyError CloseSession( void* aCB, SessionH aSessionH ) { return URef( aCB )->CloseSession ( aSessionH ); } // CloseSession // ---------------------------------------------------------------------------------------- TSyError OpenKeyByPath( void* aCB, KeyH *aKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ) { return URef( aCB )->OpenKeyByPath ( *aKeyH, aParentKeyH, aPath, aMode ); } // OpenKeyByPath TSyError OpenSubkey ( void* aCB, KeyH *aKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ) { return URef( aCB )->OpenSubkey ( *aKeyH, aParentKeyH, aID, aMode ); } // OpenSubkey TSyError DeleteSubkey( void* aCB, KeyH aParentKeyH, sInt32 aID ) { return URef( aCB )->DeleteSubkey ( aParentKeyH, aID ); } // DeleteSubkey TSyError GetKeyID( void* aCB, KeyH aKeyH, sInt32 *aID ) { return URef( aCB )->GetKeyID ( aKeyH, *aID ); } // GetKeyID TSyError SetTextMode( void* aCB, KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ) { return URef( aCB )->SetTextMode ( aKeyH, aCharSet, aLineEndMode, aBigEndian ); } // SetTextMode TSyError SetTimeMode( void* aCB, KeyH aKeyH, uInt16 aTimeMode ) { return URef( aCB )->SetTimeMode ( aKeyH, aTimeMode ); } // SetTimeMode TSyError CloseKey( void* aCB, KeyH aKeyH ) { return URef( aCB )->CloseKey ( aKeyH ); } // CloseKey // ---------------------------------------------------------------------------------------- TSyError GetValue ( void* aCB, KeyH aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize ) { return URef( aCB )->GetValue( aKeyH, aValName, aValType, aBuffer, aBufSize,*aValSize ); } // GetValue TSyError GetValueByID( void* aCB, KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize ) { return URef( aCB )->GetValueByID( aKeyH, aID, arrIndex, aValType, aBuffer, aBufSize, *aValSize ); } // GetValueByID sInt32 GetValueID ( void* aCB, KeyH aKeyH, cAppCharP aName ) { return URef( aCB )->GetValueID ( aKeyH, aName ); } // GetValueID TSyError SetValue ( void* aCB, KeyH aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { return URef( aCB )->SetValue ( aKeyH, aValName, aValType, aBuffer, aValSize ); } // SetValue TSyError SetValueByID( void* aCB, KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { return URef( aCB )->SetValueByID( aKeyH, aID, arrIndex, aValType, aBuffer, aValSize ); } // SetValueByID // ---------------------------------------------------------------------------------------- TSyError StartDataRead ( CContext ac, cAppCharP lastToken, cAppCharP resumeToken ) { return TRef( ac )->StartDataRead ( TCon( ac ), lastToken, resumeToken ); } // StartDataRead TSyError ReadNextItem ( CContext ac, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) { return TRef( ac )->ReadNextItem ( TCon( ac ), aID, aItemData, aStatus, aFirst ); } // ReadNextItem TSyError ReadItem ( CContext ac, cItemID aID, appCharP *aItemData ) { return TRef( ac )->ReadItem ( TCon( ac ), aID, aItemData ); } // ReadItem TSyError EndDataRead ( CContext ac ) { return TRef( ac )->EndDataRead ( TCon( ac ) ); } // EndDataRead TSyError StartDataWrite ( CContext ac ) { return TRef( ac )->StartDataWrite ( TCon( ac ) ); } // StartDataWrite TSyError InsertItem ( CContext ac, cAppCharP aItemData, ItemID aID ) { return TRef( ac )->InsertItem ( TCon( ac ), aItemData, aID ); } // InsertItem TSyError UpdateItem ( CContext ac, cAppCharP aItemData, cItemID aID, ItemID updID ) { return TRef( ac )->UpdateItem ( TCon( ac ), aItemData, aID, updID ); } // UpdateItem TSyError MoveItem ( CContext ac, cItemID aID, cAppCharP newParID ) { return TRef( ac )->MoveItem ( TCon( ac ), aID, newParID ); } // MoveItem TSyError DeleteItem ( CContext ac, cItemID aID ) { return TRef( ac )->DeleteItem ( TCon( ac ), aID ); } // DeleteItem TSyError EndDataWrite ( CContext ac, bool success, appCharP *newToken ) { return TRef( ac )->EndDataWrite ( TCon( ac ), success, newToken ); } // EndDataWrite void DisposeObj ( CContext ac, void* memory ) { TRef( ac )->DisposeObj ( TCon( ac ), memory ); } // DisposeObj // ---- asKey functions ---- TSyError ReadNextItemAsKey( CContext ac, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ) { return TRef( ac )->ReadNextItemAsKey( TCon( ac ), aID, aItemKey, aStatus, aFirst ); } // ReadNextItemAsKey TSyError ReadItemAsKey ( CContext ac, cItemID aID, KeyH aItemKey ) { return TRef( ac )->ReadItemAsKey ( TCon( ac ), aID, aItemKey ); } // ReadItemAsKey TSyError InsertItemAsKey ( CContext ac, KeyH aItemKey, ItemID aID ) { return TRef( ac )->InsertItemAsKey ( TCon( ac ), aItemKey, aID ); } // InsertItemAsKey TSyError UpdateItemAsKey ( CContext ac, KeyH aItemKey, cItemID aID, ItemID updID ) { return TRef( ac )->UpdateItemAsKey ( TCon( ac ), aItemKey, aID, updID ); } // UpdateItemAsKey // ---------------------------------------------------------------------------------------- // connect generic key access routines void CB_Connect_KeyAccess( void* aCB ) { DB_Callback cb= (DB_Callback)aCB; if (!CB_OK( cb,8 )) return; // minimum callback version required // calls used by both DBApi and UIApi cb->ui.OpenKeyByPath = OpenKeyByPath; cb->ui.OpenSubkey = OpenSubkey; cb->ui.DeleteSubkey = DeleteSubkey; cb->ui.GetKeyID = GetKeyID; cb->ui.SetTextMode = SetTextMode; cb->ui.SetTimeMode = SetTimeMode; cb->ui.CloseKey = CloseKey; cb->ui.GetValue = GetValue; cb->ui.GetValueByID = GetValueByID; cb->ui.GetValueID = GetValueID; cb->ui.SetValue = SetValue; cb->ui.SetValueByID = SetValueByID; } // CB_Connect_KeyAccess static void CB_Connect_Tunnel( void* aCB ) { DB_Callback cb= (DB_Callback)aCB; if (!CB_OK( cb, 9 )) return; // minimum callback version required cb->dt.StartDataRead = StartDataRead; cb->dt.ReadNextItem = ReadNextItem; cb->dt.ReadItem = ReadItem; cb->dt.EndDataRead = EndDataRead; cb->dt.StartDataWrite = StartDataWrite; cb->dt.InsertItem = InsertItem; cb->dt.UpdateItem = UpdateItem; cb->dt.MoveItem = MoveItem; cb->dt.DeleteItem = DeleteItem; cb->dt.EndDataWrite = EndDataWrite; if (!CB_OK( cb,11 )) return; // minimum callback version required cb->dt.DisposeObj = DisposeObj; cb->dt.ReadNextItemAsKey= ReadNextItemAsKey; cb->dt.ReadItemAsKey = ReadItemAsKey; cb->dt.InsertItemAsKey = InsertItemAsKey; cb->dt.UpdateItemAsKey = UpdateItemAsKey; } // CB_Connect_Tunnel void CB_Connect( void* aCB ) { DB_Callback cb= (DB_Callback)aCB; if (!CB_OK( cb,8 )) return; // minimum callback version required // calls needed for accessing engine from the outside (UIApi) cb->ui.SetStringMode = SetStringMode; cb->ui.InitEngineXML = InitEngineXML; cb->ui.InitEngineFile = InitEngineFile; cb->ui.InitEngineCB = InitEngineCB; cb->ui.OpenSession = OpenSession; cb->ui.OpenSessionKey = OpenSessionKey; cb->ui.SessionStep = SessionStep; cb->ui.GetSyncMLBuffer = GetSyncMLBuffer; cb->ui.RetSyncMLBuffer = RetSyncMLBuffer; cb->ui.ReadSyncMLBuffer = ReadSyncMLBuffer; cb->ui.WriteSyncMLBuffer= WriteSyncMLBuffer; cb->ui.CloseSession = CloseSession; // generic key access calls used by both DBApi and UIApi CB_Connect_KeyAccess( cb ); CB_Connect_Tunnel ( cb ); } // CB_Connect void SySyncDebugPuts(void* aCB, cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aLinePrefix, cAppCharP aText) { URef( aCB )->debugPuts(aFile, aLine, aFunction, aDbgLevel, aLinePrefix, aText); } } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/engineentry.h0000755000373300037200000001703112424517753025352 0ustar00nightlyallusers00000000000000/** * @File engineentry.h * * @Author Beat Forster (bfo@synthesis.ch) * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ /* */ #ifndef ENGINEENTRY_H #define ENGINEENTRY_H #include "generic_types.h" #include "sync_dbapidef.h" // we need STL strings #include using namespace std; namespace sysync { ENGINE_ENTRY_CXX void DebugDB ( void* aCB, cAppCharP aParams ) ENTRY_ATTR; ENGINE_ENTRY_CXX void DebugExotic ( void* aCB, cAppCharP aParams ) ENTRY_ATTR; ENGINE_ENTRY_CXX void DebugBlock ( void* aCB, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText ) ENTRY_ATTR; ENGINE_ENTRY_CXX void DebugEndBlock ( void* aCB, cAppCharP aTag ) ENTRY_ATTR; ENGINE_ENTRY_CXX void DebugEndThread ( void* aCB ) ENTRY_ATTR; // ---------------------------------------------------------------------------------------- ENGINE_ENTRY_CXX TSyError SetStringMode ( void* aCB, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError InitEngineXML ( void* aCB, cAppCharP aConfigXML ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError InitEngineFile ( void* aCB, cAppCharP aConfigFilePath ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError InitEngineCB ( void* aCB, TXMLConfigReadFunc aReaderFunc, void* aContext ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError OpenSession ( void* aCB, SessionH *aSessionH, uInt32 aSelector, cAppCharP aSessionName ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError OpenSessionKey ( void* aCB, SessionH aSessionH, KeyH *aKeyH, uInt16 aMode ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError SessionStep ( void* aCB, SessionH aSessionH, uInt16 *aStepCmd, TEngineProgressInfo *aInfoP ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError GetSyncMLBuffer ( void* aCB, SessionH aSessionH, bool aForSend, appPointer *aBuffer, memSize *aBufSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError RetSyncMLBuffer ( void* aCB, SessionH aSessionH, bool aForSend, memSize aRetSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError ReadSyncMLBuffer ( void* aCB, SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize *aValSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError WriteSyncMLBuffer( void* aCB, SessionH aSessionH, appPointer aBuffer, memSize aValSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError CloseSession ( void* aCB, SessionH aSessionH ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError OpenKeyByPath ( void* aCB, KeyH *aKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError OpenSubkey ( void* aCB, KeyH *aKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError DeleteSubkey ( void* aCB, KeyH aParentKeyH, sInt32 aID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError GetKeyID ( void* aCB, KeyH aKeyH, sInt32 *aID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError SetTextMode ( void* aCB, KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError SetTimeMode ( void* aCB, KeyH aKeyH, uInt16 aTimeMode ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError CloseKey ( void* aCB, KeyH aKeyH ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError GetValue ( void* aCB, KeyH aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError GetValueByID ( void* aCB, KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX sInt32 GetValueID ( void* aCB, KeyH aKeyH, cAppCharP aName ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError SetValue ( void* aCB, KeyH aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError SetValueByID ( void* aCB, KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) ENTRY_ATTR; // ---- tunnel -------------------------------------------------------------------------------------------------------- ENGINE_ENTRY_CXX TSyError StartDataRead ( CContext ac, cAppCharP lastToken, cAppCharP resumeToken ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError ReadNextItem ( CContext ac, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError ReadItem ( CContext ac, cItemID aID, appCharP *aItemData ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError EndDataRead ( CContext ac ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError StartDataWrite ( CContext ac ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError InsertItem ( CContext ac, cAppCharP aItemData, ItemID aID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError UpdateItem ( CContext ac, cAppCharP aItemData, cItemID aID, ItemID updID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError MoveItem ( CContext ac, cItemID aID, cAppCharP newParID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError DeleteItem ( CContext ac, cItemID aID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError EndDataWrite ( CContext ac, bool success, appCharP *newToken ) ENTRY_ATTR; ENGINE_ENTRY_CXX void DisposeObj ( CContext ac, void* memory ) ENTRY_ATTR; // ---- asKey ---- ENGINE_ENTRY_CXX TSyError ReadNextItemAsKey( CContext ac, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError ReadItemAsKey ( CContext ac, cItemID aID, KeyH aItemKey ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError InsertItemAsKey ( CContext ac, KeyH aItemKey, ItemID aID ) ENTRY_ATTR; ENGINE_ENTRY_CXX TSyError UpdateItemAsKey ( CContext ac, KeyH aItemKey, cItemID aID, ItemID updID ) ENTRY_ATTR; // ---------------------------------------------------------------------------------------- ENGINE_ENTRY_CXX void CB_Connect( void* aCB ) ENTRY_ATTR; // engine local helper, used e.g. from PluginDS/Agent void CB_Connect_KeyAccess ( void* aCB ); } // namespace sysync #endif // ENGINEENTRY_H // eof syncevolution-1.5/src/synthesis/src/sysync/engineinterface.cpp0000644000373300037200000021061612424517753026505 0ustar00nightlyallusers00000000000000/** * @File engineinterface.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TEngineInterface - common interface to SySync engine for SDK * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ #include "prefix_file.h" #ifdef ENGINEINTERFACE_SUPPORT #include "engineinterface.h" #include "syserial.h" #include "syncappbase.h" #include "SDK_util.h" namespace sysync { // TSettingsKeyImpl // ================ TSettingsKeyImpl::TSettingsKeyImpl( TEngineInterface *aEngineInterfaceP ) : fEngineInterfaceP(aEngineInterfaceP), fImplicitParentKeyP(NULL) { // init defaults from engine interface fCharSet = fEngineInterfaceP->fCharSet; fBigEndian = fEngineInterfaceP->fBigEndian; fLineEndMode = fEngineInterfaceP->fLineEndMode; // init hardcoded defaults fTimeMode = TMODE_LINEARTIME+TMODE_FLAG_FLOATING; // linear time (as floating, which means UTC for engine timestamps) } // TSettingsKeyImpl::TSettingsKeyImpl TSettingsKeyImpl::~TSettingsKeyImpl() { // deleting object means closing key // - At this point (in baseclass), actual key implementation is closed // already, so we can delete implicitly opened ancestors now recursively if (fImplicitParentKeyP) { delete fImplicitParentKeyP; fImplicitParentKeyP=NULL; } } // TSettingsKeyImpl::TSettingsKeyImpl // open subkey(chain) by path // - walks down through needed subkeys TSyError TSettingsKeyImpl::OpenKeyByPath( TSettingsKeyImpl *&aSettingsKeyP, // might be set even if overall open fails - caller must delete object passed back in case of failure cAppCharP aPath, uInt16 aMode, bool aImplicit // if set, this means that THIS key was implicitly opened, and should be implicitly closed as well ) { TSyError sta; TSettingsKeyImpl *subKeyP=NULL; // as long as we haven't openend anything, make sure pointer returned is NULL aSettingsKeyP=NULL; // open by relative path, starting at myself if (aPath==NULL) return LOCERR_WRONGUSAGE; // strip leading separators while (*aPath==SETTINGSKEY_PATH_SEPARATOR) aPath++; // search end of string or next separator cAppCharP e = aPath; while (*e && *e!=SETTINGSKEY_PATH_SEPARATOR) e++; // open the element we have found sta = OpenSubKeyByName(aSettingsKeyP,aPath,e-aPath,aMode); if (sta == LOCERR_OK) { // immediate subkey opened successfully // - if this is an implicit open, link back to myself as I must be deleted when subkey is deleted if (aImplicit) { aSettingsKeyP->fImplicitParentKeyP = this; } // new opened key inherits base key's value formatting settings aSettingsKeyP->SetTextMode(fCharSet, fLineEndMode,fBigEndian); aSettingsKeyP->SetTimeMode(fTimeMode); // - check if chain continues while (*e==SETTINGSKEY_PATH_SEPARATOR) e++; // strip leading separators if (*e) { // another path element follows, open it recursively // - this is implicit in any case! sta = aSettingsKeyP->OpenKeyByPath(subKeyP,e,aMode,true); if (subKeyP != NULL) { // more subkeys were opened, possibly not entire chain as requested. But in // any case, we need to pass back the rightmost opened key in the path as this // must be deleted by the caller (causing all implicitly related objects to delete as well) aSettingsKeyP = subKeyP; } } } // return status return sta; } // TSettingsKeyImpl::OpenKeyByPath const uInt16 engineCharSets[numCharSets] = { CHS_UNKNOWN, CHS_ASCII, CHS_ANSI, CHS_ISO_8859_1, CHS_UTF8, CHS_UTF16, #ifdef CHINESE_SUPPORT CHS_GB2312, CHS_CP936 #endif }; const uInt16 engineLineEndModes[numLineEndModes] = { LEM_NONE, LEM_UNIX, LEM_MAC, LEM_DOS, LEM_CSTR, LEM_FILEMAKER }; // Set text format parameters TSyError TSettingsKeyImpl::SetTextMode(uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian) { // translate charset uInt16 chs; for (chs=0; chs we can return native value directly if (aValType == VALTYPE_TEXT) { if (!aBuffer || aBufSize==0) { // only measure size return GetValueInternal(aID,aArrayIndex,NULL,0,aValSize); } else { // low level text routines do not set terminators for simplicity, so make sure we have one here // - request only max one char less than buf can hold, so we always have room for a terminator sta = GetValueInternal(aID,aArrayIndex,aBuffer,aBufSize-1,aValSize); // - make sure we have a NUL terminator at the very end of the buffer in all cases ((appCharP)aBuffer)[aBufSize-1] = 0; // ultimate terminator // - also make sure we have a terminator at the end of the actual string if (sta==LOCERR_OK && aValSizeaBufSize-1) { sta = LOCERR_TRUNCATED; aValSize = aBufSize-1; // return actual size, not untruncated one } return sta; } } else { // non-text, simply return value sta = GetValueInternal(aID,aArrayIndex,aBuffer,aBufSize,aValSize); if (sta==LOCERR_OK && aBufSize && aBuffer && aValSize>aBufSize) { // not only measuring size, check for truncation if (aValType==VALTYPE_BUF) { // in case of buffer, we call this "truncated" (we don't know if the result is usable or not, depends on data itself) sta = LOCERR_TRUNCATED; aValSize = aBufSize; // return actual size, not untruncated one } else { // in other cases, too small buffer makes result unusable, so we don't call it "truncated" // AND: we return the needed buffer size sta = LOCERR_BUFTOOSMALL; } } return sta; } } // some kind of conversion needed // - get native size of value first memSize valSiz; sta = GetValueInternal(aID,aArrayIndex,NULL,0,valSiz); if (sta!=LOCERR_OK) return sta; // - allocate matching buffer memSize bufSiz = valSiz+1; // extra room for terminator uInt8P bufP = (uInt8P) malloc(bufSiz); bufP[valSiz]=0; // make sure we have a terminator if (bufP==NULL) return LOCERR_OUTOFMEM; // - get value in native type sta = GetValueInternal(aID,aArrayIndex,bufP,bufSiz,valSiz); if (sta==LOCERR_OK) { // value conversion matrix // - switch by native value type switch (valType) { // Timestamp native type (always VALTYPE_TIME64) case VALTYPE_TIME64: tempTime = *((lineartime_t *)bufP); tctx = (fTimeMode & TMODE_FLAG_UTC)==0 ? TCTX_SYSTEM : TCTX_UTC; // convert it from internal format (UTC), unless we request floating if ((fTimeMode & TMODE_FLAG_FLOATING)==0) TzConvertTimestamp(tempTime,TCTX_UTC,tctx,getEngineInterface()->getSyncAppBase()->getAppZones()); else tctx = TCTX_UNKNOWN; // make sure that ISO8601 representation has no TZ info in floating mode // now return if (aValType==VALTYPE_TEXT) { // return time as text TimestampToISO8601Str(valStr, tempTime, tctx, false, false); txt = valStr.c_str(); goto textConv; } // no time will return an error code if (tempTime==noLinearTime) { // no time sta=DB_NoContent; // indicates NO value break; } // return time as integer number switch (fTimeMode & TMODE_MODEMASK) { case TMODE_LINEARDATE: tempInt = tempTime / linearDateToTimeFactor; goto intConv; case TMODE_UNIXTIME_MS: tempInt = tempTime-UnixToLineartimeOffset; // lineartime_t (that is, milliseconds), but with unix epoch origin goto intConv; case TMODE_UNIXTIME: tempInt = (tempTime-UnixToLineartimeOffset)/secondToLinearTimeFactor; goto intConv; default : tempInt = tempTime; goto intConv; } break; // Integer native types case VALTYPE_INT8: tempInt = *((sInt8 *)bufP); goto intConv; case VALTYPE_INT16: tempInt = *((sInt16 *)bufP); goto intConv; case VALTYPE_INT32: tempInt = *((sInt32 *)bufP); goto intConv; case VALTYPE_INT64: tempInt = *((sInt64 *)bufP); intConv: // convert integer into desired target type switch (aValType) { case VALTYPE_INT8: case VALTYPE_ENUM: aValSize=1; if (aBufSize0 ? aBufSize-2 : 0 // max output size (but no limit if measuring actual size) )) sta = LOCERR_TRUNCATED; // return (possibly truncated) size aValSize=convStr.size(); // this will be added as part of the content, and gives a 16bit NUL terminator convStr+=(char)0; } else { // 8-bit character encoding if (!appendUTF8ToString( txt, convStr, fCharSet, fLineEndMode, qm_none, aBufSize>0 ? aBufSize-1 : 0 // max output size (but no limit if measuring actual size) )) sta = LOCERR_TRUNCATED; // return (possibly truncated) size aValSize=convStr.size(); } // if requested, return value into buffer if (aBufSize>0) { // copy including implicit NUL terminator BYTE (in case of UTF16, there is an extra explicit NUL char in the convStr itself to make a 16-bit NUL!) memcpy(aBuffer,(appPointer)convStr.c_str(),convStr.size()+1>aBufSize ? aBufSize : convStr.size()+1); } else { // measuring size always returns OK sta = LOCERR_OK; } } break; } // switch by native type } // if value returned // - return temp buffer free(bufP); // - return status return sta; } // TSettingsKeyImpl::GetValueByID // Writes a named value in specified format passed in memory buffer TSyError TSettingsKeyImpl::SetValueByID( sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { TSyError sta = LOCERR_OK; sInt64 tempInt; lineartime_t tempTime; timecontext_t tctx; appPointer bP; memSize siz; string convStr; // get native type of value (and check validity of ID - invalid IDs must return VALTYPE_UNKNOWN) uInt16 valType = GetValueType(aID); if (valType==VALTYPE_UNKNOWN) return DB_NotFound; // measure value for strings if (aValType == VALTYPE_TEXT && aValSize == memSize(-1)) { if (fCharSet==chs_utf16) return LOCERR_NOTIMP; // measuring UTF-16 not supported yet //aValSize = wcslen((short *)aBuffer)/2; else aValSize = strlen((char *)aBuffer); } // we can set directly if input type matches native type if ( (aValType == VALTYPE_BUF) || ((valType == aValType) && (valType != VALTYPE_TEXT || (fCharSet==chs_utf8 && fLineEndMode==lem_cstr)) && (valType != VALTYPE_TIME64 || ((fTimeMode & TMODE_MODEMASK)==TMODE_LINEARTIME)) ) ) { // presented type&format matches native or we are setting bytes 1:1 anyway -> we can set native value directly return SetValueInternal(aID,aArrayIndex,aBuffer,aValSize); } // some kind of conversion needed // - switch by presented value type switch (aValType) { // Set "no value" case VALTYPE_NULL: sta = SetValueInternal(aID,aArrayIndex,NULL,0); break; // Text presented case VALTYPE_TEXT: // first convert into internal text format if (fCharSet==chs_utf16) { appendUTF16AsUTF8((uInt16 *)aBuffer,aValSize/2,fBigEndian,convStr, true, true); } else { string s; s.assign((cAppCharP)aBuffer,aValSize); appendStringAsUTF8(s.c_str(), convStr, fCharSet, lem_cstr, true); } // possibly convert text to native switch (valType) { case VALTYPE_TIME64: // convert text to internal time format ISO8601StrToTimestamp(convStr.c_str(), tempTime, tctx); // if not floating, assume target timestamp is UTC, so ISO string w/o time zone is treated as system time for convenience if ((fTimeMode & TMODE_FLAG_FLOATING)==0) TzConvertTimestamp(tempTime, tctx, TCTX_UTC, getEngineInterface()->getSyncAppBase()->getAppZones(), TCTX_SYSTEM); siz=8; bP = &tempTime; break; case VALTYPE_INT8: case VALTYPE_INT16: case VALTYPE_INT32: case VALTYPE_INT64: // convert text to integer StrToLongLong(convStr.c_str(),tempInt); goto intConv; case VALTYPE_TEXT: siz=convStr.size(); bP=(appPointer)convStr.c_str(); break; default: // cannot return as text return LOCERR_WRONGUSAGE; } // set it sta = SetValueInternal(aID,aArrayIndex,bP,siz); break; // Timestamp presented case VALTYPE_TIME32: if (aValSize<4) return LOCERR_BUFTOOSMALL; tempTime = *((sInt32 *)aBuffer); goto timeConv; case VALTYPE_TIME64: if (aValSize<8) return LOCERR_BUFTOOSMALL; tempTime = *((sInt64 *)aBuffer); timeConv: switch (fTimeMode & TMODE_MODEMASK) { case TMODE_LINEARDATE: tempInt = tempTime * linearDateToTimeFactor; break; case TMODE_UNIXTIME_MS: tempInt = tempTime+UnixToLineartimeOffset; break; case TMODE_UNIXTIME: tempInt = secondToLinearTimeFactor*tempTime+UnixToLineartimeOffset; break; case TMODE_LINEARTIME: default : tempInt = tempTime; break; } tctx = (fTimeMode & TMODE_FLAG_UTC)==0 ? TCTX_SYSTEM : TCTX_UTC; // convert to UTC if needed if ((fTimeMode & TMODE_FLAG_FLOATING)==0) TzConvertTimestamp(tempInt,tctx,TCTX_UTC,getEngineInterface()->getSyncAppBase()->getAppZones()); goto intConv; // Integer presented types case VALTYPE_INT8: case VALTYPE_ENUM: if (aValSize<1) return LOCERR_BUFTOOSMALL; tempInt = *((sInt8 *)aBuffer); goto intConv; case VALTYPE_INT16: if (aValSize<2) return LOCERR_BUFTOOSMALL; tempInt = *((sInt16 *)aBuffer); goto intConv; case VALTYPE_INT32: if (aValSize<4) return LOCERR_BUFTOOSMALL; tempInt = *((sInt32 *)aBuffer); goto intConv; case VALTYPE_INT64: if (aValSize<8) return LOCERR_BUFTOOSMALL; tempInt = *((sInt64 *)aBuffer); intConv: // convert integer into native type union { sInt64 buffer64; sInt32 buffer32; sInt16 buffer16; sInt8 buffer8; } buffer; bP = &buffer; switch (valType) { case VALTYPE_INT8: siz=1; buffer.buffer8 = tempInt; break; case VALTYPE_INT16: siz=2; buffer.buffer16 = tempInt; break; case VALTYPE_INT32: siz=4; buffer.buffer32 = tempInt; break; case VALTYPE_INT64: case VALTYPE_TIME64: // native timestamp siz=8; buffer.buffer64 = tempInt; break; default: // other types (like text) cannot set as integer return LOCERR_WRONGUSAGE; // conversion not allowed break; } // now write int/time value sta = SetValueInternal(aID,aArrayIndex,bP,siz); break; } // switch by presented type return sta; } // TSettingsKeyImpl::SetValueByID #define VALID_IDXOFFS_VALTYPE 0x100000 #define VALID_MASK_IDX 0x00FFFF // helper for detecting generic field attribute access bool TSettingsKeyImpl::checkFieldAttrs(cAppCharP aName, size_t &aBaseNameSize, sInt32 &aFldID) { aBaseNameSize = strlen(aName); aFldID = 0; // basic if (aBaseNameSize >= strlen(VALSUFF_TYPE) && strucmp(aName+aBaseNameSize-strlen(VALSUFF_TYPE),VALSUFF_TYPE)==0) { // value type aBaseNameSize-=strlen(VALSUFF_TYPE); aFldID += VALID_IDXOFFS_VALTYPE; } if (strucmp(aName,VALNAME_FLAG,aBaseNameSize)==0) return true; // asking for flag mask only return false; // aFldID is only the flag mask, caller must add base index } // TSettingsKeyImpl::checkFieldAttrs // helper for returning generic field attribute type bool TSettingsKeyImpl::checkAttrValueType(sInt32 aID, uInt16 &aValType) { if (aID>0 && (aID & VALID_IDXOFFS_VALTYPE)) { aValType = VALTYPE_INT16; // valtype is always uInt16 return true; } return false; } // TSettingsKeyImpl::checkAttrValueType // helper for returning generic field attribute values bool TSettingsKeyImpl::checkAttrValue( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { if (aID>0 && (aID & VALID_IDXOFFS_VALTYPE)) { // return type, not value aValSize = 2; uInt16 valtype = GetValueType(aID & VALID_MASK_IDX); if (aBufSize>=aValSize) { memcpy(aBuffer,&valtype,aValSize); } return true; } return false; } // TSettingsKeyImpl::checkAttrValue // TReadOnlyInfoKey // ================ // get value's ID (e.g. internal index) sInt32 TReadOnlyInfoKey::GetValueID(cAppCharP aName) { const TReadOnlyInfo *tblP = getInfoTable(); sInt32 idx=0; size_t namsz; sInt32 fldID; if (checkFieldAttrs(aName,namsz,fldID)) return fldID; while(tblP && idx=numInfos()) return VALTYPE_UNKNOWN; return getInfoTable()[aID].valType; } // TReadOnlyInfoKey::GetValueType // get value TSyError TReadOnlyInfoKey::GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { if (checkAttrValue(aID,aArrayIndex,aBuffer,aBufSize,aValSize)) return LOCERR_OK; const TReadOnlyInfo *infoP = &(getInfoTable()[aID]); memSize siz = infoP->valSiz; if (siz==0 && infoP->valType==VALTYPE_TEXT) siz = strlen((cAppCharP)(infoP->valPtr)); // return actual size aValSize = siz; // return requested amount of data or all we have, whatever is smaller if (siz>aBufSize) siz=aBufSize; // limit to buffer size (aBufSiz is compensated for NUL terminator already, so we can use memcpy for strings as well) memcpy(aBuffer,infoP->valPtr,siz); return LOCERR_OK; } // TReadOnlyInfoKey::GetValueInternal // TConfigVarKey // ============= // get value's ID (config vars do NOT have a real ID!) sInt32 TConfigVarKey::GetValueID(cAppCharP aName) { size_t namsz; sInt32 fldID; checkFieldAttrs(aName,namsz,fldID); if (fldID!=0) return fldID; // is an attribute // value itself cannot be accessed by ID - so cache name for next call to getValueInternal fVarName = aName; // cache name return KEYVAL_NO_ID; }; // get value's native type (all config vars are text) uInt16 TConfigVarKey::GetValueType(sInt32 aID) { uInt16 valType; if (checkAttrValueType(aID,valType)) return valType; // value itself is always text return VALTYPE_TEXT; } // TConfigVarKey::GetValueType // get value TSyError TConfigVarKey::GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { if (checkAttrValue(aID,aArrayIndex,aBuffer,aBufSize,aValSize)) return LOCERR_OK; string s; if (!fEngineInterfaceP->getSyncAppBase()->getConfigVar(fVarName.c_str(),s)) return DB_NotFound; // copy string into buffer aValSize=s.size(); strncpy((appCharP)aBuffer,s.c_str(),aBufSize); return LOCERR_OK; } // TConfigVarKey::GetValueInternal // set value TSyError TConfigVarKey::SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ) { if (!aBuffer) { // writing NULL means undefining variable fEngineInterfaceP->getSyncAppBase()->unsetConfigVar(fVarName.c_str()); return LOCERR_OK; } string v; v.assign((cAppCharP)aBuffer,(size_t)aValSize); // copy because input could be unterminated string if (!fEngineInterfaceP->getSyncAppBase()->setConfigVar(fVarName.c_str(),v.c_str())) return DB_NotFound; return LOCERR_OK; } // TConfigVarKey::SetValueInternal // TStructFieldsKey // ================ // static helper for procedural string readers TSyError TStructFieldsKey::returnString(cAppCharP aReturnString, appPointer aBuffer, memSize aBufSize, memSize &aValSize) { aValSize=strlen(aReturnString); if (aBufSize>=aValSize) { // copy string strncpy((appCharP)aBuffer,aReturnString,aValSize); } return LOCERR_OK; } // returnString // static helper for procedural int readers TSyError TStructFieldsKey::returnInt(sInt32 aInt, memSize aIntSize, appPointer aBuffer, memSize aBufSize, memSize &aValSize) { aValSize=aIntSize; if (aBufSize==0) return LOCERR_OK; // measuring size if (aBufSize=4) *((sInt32 *)aBuffer) = (sInt32)aInt; else if (aValSize>=2) *((sInt16 *)aBuffer) = (sInt16)aInt; else *((sInt8 *)aBuffer) = (sInt8)aInt; return LOCERR_OK; } // returnInt TSyError TStructFieldsKey::returnLineartime(lineartime_t aTime, appPointer aBuffer, memSize aBufSize, memSize &aValSize) { aValSize=sizeof(lineartime_t); if (aBufSize==0) return LOCERR_OK; // measuring size if (aBufSize=numFields()) return VALTYPE_UNKNOWN; const TStructFieldInfo *fldinfoP = &(getFieldsTable()[aID]); valType = fldinfoP->valType; if (valType == VALTYPE_ENUM) { // VALTYPE_ENUM: determine integer type from actual size of variable switch (fldinfoP->valSiz) { default : return VALTYPE_INT8; // smallest causes least harm: use as default case 2 : return VALTYPE_INT16; case 4 : return VALTYPE_INT32; case 8 : return VALTYPE_INT64; } } else if (valType == VALTYPE_TEXT_OBFUS) return VALTYPE_TEXT; // obfuscated fields are text for SDK user else return valType; // just return specified type } // TStructFieldsKey::GetValueType // get value TSyError TStructFieldsKey::GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { if (checkAttrValue(aID,aArrayIndex,aBuffer,aBufSize,aValSize)) return LOCERR_OK; const TStructFieldInfo *fldinfoP = &(getFieldsTable()[aID]); // check for programmatic access to value if (fldinfoP->getValueProc) { // get value programmatically return fldinfoP->getValueProc(this,fldinfoP,aBuffer,aBufSize,aValSize); } // fetch value from structure memSize siz = fldinfoP->valSiz; // get (max) size if (siz==0) return DB_Forbidden; // read access not allowed uInt8P valPtr = getStructAddr()+fldinfoP->fieldOffs; // for text fields, measure actual size if (fldinfoP->valType==VALTYPE_TEXT) siz = strlen((cAppCharP)valPtr); // return actual size aValSize = siz; // return requested amount of data or all we have, whatever is smaller if (siz>aBufSize) siz=aBufSize; // limit to buffer size (aBufSiz is compensated for NUL terminator already, so we can use memcpy for strings as well) // for obfuscated fields, use special routine if (fldinfoP->valType==VALTYPE_TEXT_OBFUS && siz>0) { getUnmangledAsBuf((appCharP)aBuffer, siz, (cAppCharP)valPtr); // measure decoded aValSize = strlen((cAppCharP)aBuffer); } else memcpy(aBuffer,valPtr,siz); return LOCERR_OK; } // TStructFieldsKey::GetValueInternal // set value TSyError TStructFieldsKey::SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ) { if (!aBuffer) return LOCERR_WRONGUSAGE; // cannot handle NULL values if (aID & VALID_IDXOFFS_VALTYPE) return DB_Forbidden; // can't write type TSyError sta = LOCERR_OK; const TStructFieldInfo *fldinfoP = &(getFieldsTable()[aID]); // refuse writing to read-only fields if (!fldinfoP->writable) return DB_Forbidden; // check for programmatic access to value if (fldinfoP->setValueProc) { // set value programmatically return fldinfoP->setValueProc(this,fldinfoP,aBuffer,aValSize); } // write value to structure memSize siz = fldinfoP->valSiz; // get (max) size (for strings: buffer including NUL) if (siz==0) return DB_Forbidden; // write access not allowed uInt8P valPtr = getStructAddr()+fldinfoP->fieldOffs; // adjust usable size for strings if (fldinfoP->valType == VALTYPE_TEXT) siz--; // reserve one for terminator // check and signal truncation if (aValSize>siz) sta=LOCERR_TRUNCATED; else siz=aValSize; // copy data into struct if (fldinfoP->valType==VALTYPE_TEXT_OBFUS) { string v; v.assign((cAppCharP)aBuffer,aValSize); assignMangledToCString((appCharP)valPtr, v.c_str(), fldinfoP->valSiz, true); // always use entire buffer and fill it with garbage beyond end of actual data } else memcpy(valPtr,aBuffer,siz); // - struct modified, signal that (for derivates that might want to save the record on close) fDirty=true; // append terminator in case of text if (fldinfoP->valType == VALTYPE_TEXT) *(valPtr+siz)=0; // done return sta; } // TStructFieldsKey::SetValueInternal #ifdef SYSER_REGISTRATION // Licensing key // ------------- // Accessors for license text and code // - read license text static TSyError readLicenseText( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { // copy from config aValSize=aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->getRootConfig()->fLicenseName.size(); if (aBufSize>0) strncpy((char *)aBuffer,aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->getRootConfig()->fLicenseName.c_str(),aBufSize); return LOCERR_OK; } // readLicenseText // - write license text static TSyError writeLicenseText( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { // assign to config aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->getRootConfig()->fLicenseName.assign((cAppCharP)aBuffer,aValSize); /* DO NOT recalculate, only when setting code // recalculate app enabled status fEngineInterfaceP->getSyncAppBase()->isRegistered(); */ return LOCERR_OK; } // writeLicenseText // - write license code static TSyError writeLicenseCode( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { // assign to config aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->getRootConfig()->fLicenseCode.assign((cAppCharP)aBuffer,aValSize); // recalculate all license dependent variables aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->isRegistered(); // always ok return LOCERR_OK; } // writeLicenseCode // - read (and recalculate) registration status code // (i.e. status of currently installed license. Note that even if this returns non-ok, the app // might still be able to sync, e.g. due to a free demo period) static TSyError readRegStatus( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { aValSize=2; if (aBufSize>=aValSize) { // recalculate all license dependent variables localstatus sta = aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->isRegistered(); // copy from config *((uInt16*)aBuffer)=sta; } return LOCERR_OK; } // readRegStatus // - read (and recalculate) application enable status code // (i.e. if app can sync now. Note that this does not necessarily mean that a valid license is installed, // read "regStatus" for that). static TSyError readEnabledStatus( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { aValSize=2; if (aBufSize>=aValSize) { // recalculate all license dependent variables and current enabled status // Note: includes checking for daysleft localstatus sta = aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->appEnableStatus(); // copy from config *((uInt16*)aBuffer)=sta; } return LOCERR_OK; } // readEnabledStatus #if defined(EXPIRES_AFTER_DAYS) && defined(ENGINEINTERFACE_SUPPORT) // - write first use version number static TSyError writeFuv( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { uInt32 fuv = *((uInt32 *)aBuffer); if (fuv==0x53595359) { // start eval aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->updateFirstUseInfo( aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->fFirstUseDate, aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->fFirstUseVers ); } else { // simply assign (usually values read from here in an earlier session and stored persistently outside) aStructFieldsKeyP->getEngineInterface()->getSyncAppBase()->fFirstUseVers = fuv; } // always ok return LOCERR_OK; } // writeFuv #endif // EXPIRES_AFTER_DAYS+ENGINEINTERFACE_SUPPORT // macro simplifying typing in the table below #define OFFS_SZ_AB(n) (offsetof(TSyncAppBase,n)), sizeof(dP_ab->n) // dummy pointer needed for sizeof static const TSyncAppBase *dP_ab=NULL; // accessor table for licensing info static const TStructFieldInfo LicensingFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz // - license text and code (writable) { "licensetext", VALTYPE_TEXT, true, 0, 0, &readLicenseText, &writeLicenseText }, { "licensecode", VALTYPE_TEXT, true, 0, 0, NULL, &writeLicenseCode }, #if defined(EXPIRES_AFTER_DAYS) && defined(ENGINEINTERFACE_SUPPORT) // - read/write for eval { "fud", VALTYPE_INT32, true, OFFS_SZ_AB(fFirstUseDate) }, // first use date { "fuv", VALTYPE_INT32, true, OFFS_SZ_AB(fFirstUseVers), NULL, &writeFuv }, // first use version #endif // - read-only info about licensing status from syncappbase { "regStatus", VALTYPE_INT16, false, 0, 0, &readRegStatus, NULL }, { "enabledStatus", VALTYPE_INT16, false, 0, 0, &readEnabledStatus, NULL }, { "regOK", VALTYPE_ENUM, false, OFFS_SZ_AB(fRegOK) }, { "productCode", VALTYPE_ENUM, false, OFFS_SZ_AB(fRegProductCode) }, { "productFlags", VALTYPE_ENUM, false, OFFS_SZ_AB(fRegProductFlags) }, { "quantity", VALTYPE_ENUM, false, OFFS_SZ_AB(fRegQuantity) }, { "licenseType", VALTYPE_ENUM, false, OFFS_SZ_AB(fRegLicenseType) }, { "daysleft", VALTYPE_ENUM, false, OFFS_SZ_AB(fDaysLeft) }, }; // get table describing the fields in the struct const TStructFieldInfo *TLicensingKey::getFieldsTable(void) { return LicensingFieldInfos; } // TLicensingKey::getFieldsTable sInt32 TLicensingKey::numFields(void) { return sizeof(LicensingFieldInfos)/sizeof(TStructFieldInfo); } // TLicensingKey::numFields // get actual struct base address uInt8P TLicensingKey::getStructAddr(void) { return (uInt8P)fEngineInterfaceP->getSyncAppBase(); // we are accessing SyncAppBase fields } // TLicensingKey::getStructAddr #endif // SYSER_REGISTRATION // TEngineInterface // ================ // constructor TEngineInterface::TEngineInterface() : fAppBaseP(NULL) { // init string modes to default fCharSet = chs_utf8; fLineEndMode = lem_cstr; fBigEndian = false; // default to Intel order } // TEngineInterface // constructor TSyError TEngineInterface::Init() { #ifdef DIRECT_APPBASE_GLOBALACCESS // global anchor only exists in old-style targets; pure engines do not have it any more sysync_glob_setanchor(this); #endif // create the appropriate SyncAppBase object fAppBaseP = newSyncAppBase(); if (fAppBaseP==NULL) return LOCERR_UNDEFINED; // set myself as the Master fAppBaseP->fEngineInterfaceP = this; // connect the debug routines to the appbase logger #ifdef SYDEBUG if (fCI) { fCI->callbackRef = fAppBaseP; fCI->DB_DebugPuts = AppBaseLogDebugPuts; fCI->DB_DebugBlock = AppBaseLogDebugBlock; fCI->DB_DebugEndBlock = AppBaseLogDebugEndBlock; fCI->DB_DebugEndThread = AppBaseLogDebugEndThread; fCI->DB_DebugExotic = AppBaseLogDebugExotic; } #endif // we have an appbase now return LOCERR_OK; } // TEngineInterface::Init TSyError TEngineInterface::Term() { // empty for the moment return LOCERR_OK; } // TEnigneInterface::Term // destructor TEngineInterface::~TEngineInterface() { // delete the SyncAppBase if (fAppBaseP) { delete fAppBaseP; fAppBaseP=NULL; } #ifdef DIRECT_APPBASE_GLOBALACCESS // global anchor only exists in old-style targets; pure engines do not have it any more sysync_glob_setanchor(NULL); #endif } // ~TEngineInterface // Set text format parameters TSyError TEngineInterface::SetStringMode(uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian) { // translate charset uInt16 chs; for (chs=0; chsfApiInterModuleContext = fCI->gContext; // make sure we have string as UTF-8 string tempStr; aConfigXML = makeAppString(aConfigXML, tempStr); // feed config string directly into engine return getSyncAppBase()->readXMLConfigConstant(aConfigXML); #endif } // TEngineInterface::InitEngineXML /// @brief init object, optionally passing a open FILE for reading config /// @param aCfgFile[in] open file containing XML config /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::InitEngineFile(cAppCharP aConfigFilePath) { // make sure we have string as UTF-8 string tempStr; aConfigFilePath = makeAppString(aConfigFilePath, tempStr); // get the global context for pooling ressources like Java VM fAppBaseP->fApiInterModuleContext = fCI->gContext; // read config from a file string pathStr = aConfigFilePath; getSyncAppBase()->expandConfigVars(pathStr,2); // now parse config return getSyncAppBase()->readXMLConfigFile(pathStr.c_str()); } // TEngineInterface::InitEngineFile /// @brief init object, optionally passing a callback for reading config /// @param aReaderFunc[in] callback function which can deliver next chunk of XML config data /// @param aContext[in] free context pointer passed back with callback /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::InitEngineCB(TXMLConfigReadFunc aReaderFunc, void *aContext) { // get the global context for pooling ressources like Java VM fAppBaseP->fApiInterModuleContext = fCI->gContext; // now parse config return getSyncAppBase()->readXMLConfigStream(aReaderFunc, aContext); } // TEngineInterface::InitEngineCB /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. For multi-profile clients: profile ID to use /// @param aSessionName[in] a text name/id to identify a session, useage depending on session type. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::OpenSession(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName) { // safety check - app must be enabled (initialized with config and ok license before we can open a session) localstatus sta=getSyncAppBase()->appEnableStatus(); if (sta!=LOCERR_OK) return sta; // app not enabled (and maybe not initialized properly) - prevent any session opening // make sure we have string as UTF-8 string tempStr; aSessionName = makeAppString(aSessionName, tempStr); return OpenSessionInternal(aNewSessionH, aSelector, aSessionName); } // TEngineInterface::OpenSession /// @brief internal implementation, derived in actual clients or servers TSyError TEngineInterface::OpenSessionInternal(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName) { // must be implemented in derived class return LOCERR_NOTIMP; } // TEngineInterface::OpenSessionInternal /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::OpenSessionKey(SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode) { // no session key available in base class return DB_NotFound; } // TEngineInterface::OpenSessionKey /// @brief Close a session /// @note It depends on session type if this also destroys the session or if it may persist and can be re-opened. /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::CloseSession(SessionH aSessionH) { // must be implemented in derived class return LOCERR_NOTIMP; } // TEngineInterface::CloseSession /// @brief Executes next step of the session /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::SessionStep (SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { // must be implemented in derived class return LOCERR_NOTIMP; } // TEngineInterface::SessionStep /// @brief Get access to SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aForSend[in] send mode (true) / receive mode (false) /// @param aBuffer[out] receives pointer to buffer (empty for receive, full for send) /// @param aBufSize[out] receives size of empty or full buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::GetSyncMLBuffer(SessionH aSessionH, bool aForSend, appPointer &aBuffer, memSize &aBufSize) { Ret_t rc; MemSize_t bufSz; // Note: this is SML_TK definition of memsize! // get SML instance for this session (note that "session" could be a SAN checker as well) InstanceID_t myInstance = getSmlInstanceOfSession(aSessionH); if (myInstance==0) return LOCERR_WRONGUSAGE; // no instance, usage must be wrong // provide access to the buffer if (aForSend) { // we want to read the SyncML buffer rc=smlLockReadBuffer( myInstance, (unsigned char **)&aBuffer, // receives address of buffer containing SyncML to send &bufSz // receives size of SyncML to send ); aBufSize = bufSz; } else { // we want to write the SyncML buffer rc=smlLockWriteBuffer( myInstance, (unsigned char **)&aBuffer, // receives address of buffer where received SyncML can be put &bufSz // capacity of the buffer ); aBufSize = bufSz; } // check error if (rc!=SML_ERR_OK) return LOCERR_SMLFATAL; // problem with SML toolkit // done return LOCERR_OK; } // TEngineInterface::GetSyncMLBuffer /// @brief Return SyncML message buffer to engine /// @param aSessionH[in] session handle obtained with OpenSession /// @param aForSend[in] send mode (true) / receive mode (false) /// @param aProcessed[in] number of bytes put into or read from the buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::RetSyncMLBuffer(SessionH aSessionH, bool aForSend, memSize aProcessed) { Ret_t rc; // get SML instance for this session (note that "session" could be a SAN checker as well) InstanceID_t myInstance = getSmlInstanceOfSession(aSessionH); if (myInstance==0) return LOCERR_WRONGUSAGE; // no instance, usage must be wrong // return buffer if (aForSend) { // we have read the SyncML from the buffer (and usually sent to the remote) rc=smlUnlockReadBuffer( myInstance, aProcessed // number of bytes read from the buffer (and sent to the remote, hopefully...) ); } else { // we have written some data (usually received from the remote) into the SyncML buffer rc=smlUnlockWriteBuffer( myInstance, aProcessed // number of SyncML bytes put into the buffer (coming from the remote, usually...) ); } // check error if (rc!=SML_ERR_OK) return LOCERR_SMLFATAL; // problem with SML toolkit // done return LOCERR_OK; } // TEngineInterface::RetSyncMLBuffer /// @brief Read data from SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[in] pointer to buffer /// @param aBufSize[in] size of buffer, maximum to be read /// @param aMsgSize[out] size of data available in the buffer for read INCLUDING just returned data. /// @note If the aBufSize is too small to return all available data LOCERR_TRUNCATED will be returned, and the /// caller can repeat calls to ReadSyncMLBuffer to get the next chunk. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::ReadSyncMLBuffer(SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize &aMsgSize) { TSyError sta; appPointer bufP; memSize msgsiz; // get buffer for read sta = GetSyncMLBuffer(aSessionH,true,bufP,msgsiz); if (sta!=LOCERR_OK) return sta; // anyway: pass size of data in the buffer aMsgSize = msgsiz; // check if buffer passed is large enough if (aBufSize0) { // copy data memcpy(aBuffer,bufP,msgsiz); } // return SyncML buffer to engine RetSyncMLBuffer(aSessionH,true,msgsiz); // return status return sta; } // TEngineInterface::ReadSyncMLBuffer /// @brief Write data to SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[in] pointer to buffer /// @param aMsgSize[in] size of message to write to the buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::WriteSyncMLBuffer(SessionH aSessionH, appPointer aBuffer, memSize aMsgSize) { TSyError sta; appPointer bufP; memSize bufsiz; // get buffer for write sta = GetSyncMLBuffer(aSessionH,false,bufP,bufsiz); if (sta!=LOCERR_OK) return sta; // check if buffer large enough to write data if (aMsgSize>bufsiz) { // can't write data - message too large sta = LOCERR_BUFTOOSMALL; aMsgSize=0; // don't write anything } else { if (aMsgSize>0) { // copy data memcpy(bufP,aBuffer,aMsgSize); } } // return SyncML buffer to engine RetSyncMLBuffer(aSessionH,false,aMsgSize); // return status return sta; } // TEngineInterface::WriteSyncMLBuffer /// @brief open Settings key by path specification /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aParentKeyH[in] NULL if path is absolute from root, handle to an open key for relative access /// @param aPath[in] the path specification as null terminated string /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::OpenKeyByPath ( KeyH &aNewKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ) { TSettingsKeyImpl *aBaseKeyP = NULL; TSettingsKeyImpl *aKeyP = NULL; bool implicit = false; TSyError sta; // make sure we have string as UTF-8 string tempStr; aPath = makeAppString(aPath, tempStr); // determine base key if (aParentKeyH) { // already opened base key passed aBaseKeyP = reinterpret_cast(aParentKeyH); implicit = false; // we have the parent already, do not delete it implicitly } else { // we need to implicitly create the root key aBaseKeyP = newSettingsRootKey(); implicit = true; // the root key is implicitly created and must be deleted implicitly as well } // open key if (implicit && (aPath==NULL || *aPath==0 || (*aPath==SETTINGSKEY_PATH_SEPARATOR && *(aPath+1)==0))) { // opening root requested aKeyP = aBaseKeyP; sta = LOCERR_OK; } else { // open subkey of current key sta = aBaseKeyP->OpenKeyByPath(aKeyP,aPath,aMode,implicit); } if (sta!=LOCERR_OK) { if (aKeyP) { // make sure all implicitly opened elements of the chain are deleted // (includes the TSettingsRootKey, if one was created above) delete aKeyP; } } else { // pass back pointer to opened key aNewKeyH = (KeyH)aKeyP; } return sta; } // TEngineInterface::OpenKeyByPath /// @brief open Settings subkey key by ID or iterating over all subkeys /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aParentKeyH[in] handle to the parent key /// @param aID[in] the ID of the subkey to open, /// or KEYVAL_ID_FIRST/KEYVAL_ID_NEXT to iterate over existing subkeys /// or KEYVAL_ID_NEW to create a new subkey /// @param aMode[in] the open mode /// @return LOCERR_OK on success, DB_NoContent when no more subkeys are found with /// KEYVAL_ID_FIRST/KEYVAL_ID_NEXT /// or any other SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::OpenSubkey( KeyH &aNewKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ) { TSettingsKeyImpl *baseKeyP = NULL; TSettingsKeyImpl *keyP = NULL; TSyError sta; // We need a parent key if (!aParentKeyH) return LOCERR_WRONGUSAGE; // Get key baseKeyP = reinterpret_cast(aParentKeyH); // now open subkey sta = baseKeyP->OpenSubkey(keyP,aID,aMode); if (sta == LOCERR_OK) { // return key handle aNewKeyH = (KeyH)keyP; } return sta; } // TEngineInterface::OpenSubkey /// @brief delete Settings subkey key by ID /// @param aID[in] the ID of the subkey to delete /// @param aParentKeyH[in] handle to the parent key /// @return LOCERR_OK on success /// or any other SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::DeleteSubkey(KeyH aParentKeyH, sInt32 aID) { // We need a parent key if (!aParentKeyH) return LOCERR_WRONGUSAGE; // Get key return reinterpret_cast(aParentKeyH)->DeleteSubkey(aID); } // TEngineInterface::DeleteSubkey /// @brief Get key ID of currently open key. Note that the Key ID is only locally unique within /// the parent key. /// @param aKeyH[in] an open key handle /// @param aID[out] receives the ID of the open key, which can be used to re-access the /// key within its parent using OpenSubkey() /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::GetKeyID(KeyH aKeyH, sInt32 &aID) { if (!aKeyH) return LOCERR_WRONGUSAGE; return reinterpret_cast(aKeyH)->GetKeyID(aID); } // TEngineInterface::GetKeyID /// @brief Set text format parameters /// @param aKeyH[in] an open key handle /// @param aCharSet[in] charset (default is UTF-8 when SetTextMode() is not used) /// @param aLineEndMode[in] line end mode (default is C-lineends of the platform (almost always LF) when SetTextMode() is not used) /// @param aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::SetTextMode(KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian) { if (!aKeyH) return LOCERR_WRONGUSAGE; return reinterpret_cast(aKeyH)->SetTextMode(aCharSet,aLineEndMode,aBigEndian); } // TEngineInterface::SetTextMode /// @brief Set time format parameters /// @param aKeyH[in] an open key handle /// @param aTimeMode[in] time mode, see TMODE_xxx (default is platform's lineratime_t when SetTimeMode() is not used) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::SetTimeMode(KeyH aKeyH, uInt16 aTimeMode) { if (!aKeyH) return LOCERR_WRONGUSAGE; return reinterpret_cast(aKeyH)->SetTimeMode(aTimeMode); } // TEngineInterface::SetTimeMode /// @brief Closes a key opened by OpenKeyByPath() or OpenSubKey() /// @param aKeyH[in] an open key handle. Will be invalid when call returns with LOCERR_OK. Do not re-use! /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::CloseKey(KeyH aKeyH) { if (aKeyH) { // deleting key will close it (including all implicitly opened parents) delete reinterpret_cast(aKeyH); } return LOCERR_OK; } // TEngineInterface::CloseKey /// @brief get value's ID for use with Get/SetValueByID() /// @return KEYVAL_ID_UNKNOWN when name is unknown, /// KEYVAL_NO_ID when name is known, but no ID exists for it (ID access not possible) /// ID of value otherwise sInt32 TEngineInterface::GetValueID(KeyH aKeyH, cAppCharP aName) { if (!aKeyH) return KEYVAL_ID_UNKNOWN; // make sure we have string as UTF-8 string tempStr; aName = makeAppString(aName, tempStr); return reinterpret_cast(aKeyH)->GetValueID(aName); } // TEngineInterface::GetValueID /// @brief Reads a named value in specified format into passed memory buffer /// @param aKeyH[in] an open key handle /// @param aValueName[in] name of the value to read /// @param aValType[in] desired return type, see VALTYPE_xxxx /// @param aBuffer[in/out] buffer where to store the data /// @param aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) /// @param aValSize[out] actual size of value. /// For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator /// Note that this will be set also when return value is LOCERR_BUFTOOSMALL, to indicate the required buffer size /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::GetValue( KeyH aKeyH, cAppCharP aValueName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { if (!aKeyH) return LOCERR_WRONGUSAGE; // GetValueID will convert aValueName to app format if needed sInt32 valId = GetValueID(aKeyH,aValueName); if (valId==KEYVAL_ID_UNKNOWN) return DB_NotFound; // directly call settingsKeyImpl, for cases where value has no ID return reinterpret_cast(aKeyH)->GetValueByID( valId,0,aValType,aBuffer,aBufSize,aValSize ); } // GetValue /// @brief Reads value by ID in specified format into passed memory buffer /// @param aKeyH[in] an open key handle /// @param aID[in] ID of the value to read /// @param aArrayIndex[in] 0-based array element index for array values. /// @param aValType[in] desired return type, see VALTYPE_xxxx /// @param aBuffer[in/out] buffer where to store the data /// @param aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) /// @param aValSize[out] actual size of value. /// For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator /// Note that this will be set also when return value is LOCERR_BUFTOOSMALL, to indicate the required buffer size /// @return LOCERR_OK on success, LOCERR_OUTOFRANGE when array index is out of range /// SyncML or LOCERR_xxx error code on other failure TSyError TEngineInterface::GetValueByID( KeyH aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { if (!aKeyH) return LOCERR_WRONGUSAGE; if (aID==KEYVAL_NO_ID) return LOCERR_BADPARAM; return reinterpret_cast(aKeyH)->GetValueByID( aID,aArrayIndex,aValType,aBuffer,aBufSize,aValSize ); } // TEngineInterface::GetValueByID /// @brief Writes a named value in specified format passed in memory buffer /// @param aKeyH[in] an open key handle /// @param aValueName[in] name of the value to write /// @param aValType[in] type of value passed in, see VALTYPE_xxxx /// @param aBuffer[in] buffer containing the data /// @param aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::SetValue( KeyH aKeyH, cAppCharP aValueName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { if (!aKeyH) return LOCERR_WRONGUSAGE; // GetValueID will convert aValueName to app format if needed sInt32 valId = GetValueID(aKeyH,aValueName); if (valId==KEYVAL_ID_UNKNOWN) return DB_NotFound; return reinterpret_cast(aKeyH)->SetValueByID( valId,0,aValType,aBuffer,aValSize ); } // TEngineInterface::SetValue /// @brief Writes a named value in specified format passed in memory buffer /// @param aKeyH[in] an open key handle /// @param aID[in] ID of the value to read /// @param aArrayIndex[in] 0-based array element index for array values. /// @param aValType[in] type of value passed in, see VALTYPE_xxxx /// @param aBuffer[in] buffer containing the data /// @param aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TEngineInterface::SetValueByID( KeyH aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { if (!aKeyH) return LOCERR_WRONGUSAGE; if (aID==KEYVAL_NO_ID) return LOCERR_BADPARAM; return reinterpret_cast(aKeyH)->SetValueByID( aID,aArrayIndex,aValType,aBuffer,aValSize ); } // TEngineInterface::SetValueByID #ifdef DBAPI_TUNNEL_SUPPORT // DBApi-like access to datastores // =============================== TSyError TEngineInterface::StartDataRead(SessionH aSessionH, cAppCharP lastToken, cAppCharP resumeToken) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelStartDataRead(lastToken,resumeToken); } // StartDataRead TSyError TEngineInterface::ReadNextItem(SessionH aSessionH, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelReadNextItem(aID,aItemData,aStatus,aFirst); } // ReadNextItem TSyError TEngineInterface::ReadItem(SessionH aSessionH, cItemID aID, appCharP *aItemData) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelReadItem(aID,aItemData); } // ReadItem TSyError TEngineInterface::EndDataRead(SessionH aSessionH) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelEndDataRead(); } // EndDataRead TSyError TEngineInterface::StartDataWrite(SessionH aSessionH) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelStartDataWrite(); } // StartDataWrite TSyError TEngineInterface::InsertItem(SessionH aSessionH, cAppCharP aItemData, ItemID aID) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelInsertItem(aItemData,aID); } // InsertItem TSyError TEngineInterface::UpdateItem(SessionH aSessionH, cAppCharP aItemData, cItemID aID, ItemID updID ) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelUpdateItem(aItemData,aID,updID); } // UpdateItem TSyError TEngineInterface::MoveItem(SessionH aSessionH, cItemID aID, cAppCharP newParID) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelMoveItem(aID,newParID); } // MoveItem TSyError TEngineInterface::DeleteItem(SessionH aSessionH, cItemID aID) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelDeleteItem(aID); } // DeleteItem TSyError TEngineInterface::EndDataWrite(SessionH aSessionH, bool success, appCharP *newToken) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelEndDataWrite(success,newToken); } // EndDataWrite void TEngineInterface::DisposeObj(SessionH aSessionH, void* memory) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return; // need properly opened tunnel session/datastore return ds->TunnelDisposeObj(memory); } // DisposeObj // ---- asKey ---- TSyError TEngineInterface::ReadNextItemAsKey(SessionH aSessionH, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelReadNextItemAsKey(aID,aItemKey,aStatus,aFirst); } // ReadNextItemAsKey TSyError TEngineInterface::ReadItemAsKey(SessionH aSessionH, cItemID aID, KeyH aItemKey) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelReadItemAsKey(aID,aItemKey); } // ReadItemAsKey TSyError TEngineInterface::InsertItemAsKey(SessionH aSessionH, KeyH aItemKey, ItemID aID) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelInsertItemAsKey(aItemKey,aID); } // InsertItemAsKey TSyError TEngineInterface::UpdateItemAsKey(SessionH aSessionH, KeyH aItemKey, cItemID aID, ItemID updID) { TLocalEngineDS *ds = reinterpret_cast(aSessionH)->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // need properly opened tunnel session/datastore return ds->TunnelUpdateItemAsKey(aItemKey,aID,updID); } // UpdateItemAsKey #endif // DBAPI_TUNNEL_SUPPORT TSyError TEngineInterface::debugPuts(cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aPrefix, cAppCharP aText) { #if defined(SYDEBUG) // Including the prefix as meta-data would be better, because it would // allow formatting it, for example in HTML. Instead of // dropping it entirely, at least mix into the normal text. if (aPrefix) { std::string body = aPrefix; if (aText) { body += ": "; body += aText; } getSyncAppBase()->getDbgLogger()->DebugPuts(TDBG_LOCATION_ARGS(aFunction, aFile, aLine /*, aPrefix */) aDbgLevel, body.c_str()); } else { getSyncAppBase()->getDbgLogger()->DebugPuts(TDBG_LOCATION_ARGS(aFunction, aFile, aLine) aDbgLevel, aText); } return 0; #else return LOCERR_NOTIMP; #endif } // debugPuts #ifdef ENGINE_LIBRARY #ifndef SIMPLE_LINKING // Callback "factory" function implementation static TSyError internal_ConnectEngine( bool aIsServer, UI_Call_In *aCIP, uInt16 aCallbackVersion, // if==0, engine creates new aCI CVersion *aEngVersionP, CVersion aPrgVersion, uInt16 aDebugFlags ) { // create new engine TEngineModuleBase *engine = NULL; TSyError err = LOCERR_OK; if (aIsServer) { #ifdef SYSYNC_SERVER engine = newServerEngine(); #else err = LOCERR_WRONGUSAGE; #endif } else { #ifdef SYSYNC_CLIENT engine = newClientEngine(); #else err = LOCERR_WRONGUSAGE; #endif } if (err==LOCERR_OK) { // connect the engine if (aCallbackVersion!=0) { // valid aCIP passed in // - flag static engine->fCIisStatic= true; // - prepare callback and pass to engine (*aCIP)->callbackVersion = aCallbackVersion; // fill in the outside callback version engine->fCI = *aCIP; // engine uses the structure provided by the uiapp // - connect the engine err = engine->Connect("", aPrgVersion, aDebugFlags); } else { // no aCIP passed, let engine create one // - connect engine err = engine->Connect("", aPrgVersion, aDebugFlags); // - get CI from engine *aCIP = engine->fCI; } // - get the version if (aEngVersionP) *aEngVersionP = Plugin_Version(0); } return err; } // internal_ConnectEngine // Client engine main entry point TSyError SYSYNC_EXTERNAL(ConnectEngine)( UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) { return internal_ConnectEngine(false, aCI, 0, aEngVersion, aPrgVersion, aDebugFlags); } // ConnectEngine // The same, but coming in with a valid */ TSyError SYSYNC_EXTERNAL(ConnectEngineS)( UI_Call_In aCI, uInt16 aCallbackVersion, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) { return internal_ConnectEngine(false, &aCI, aCallbackVersion, aEngVersion, aPrgVersion, aDebugFlags); } // ConnectEngineS // Server engine main entry point TSyError SYSYNC_EXTERNAL_SRV(ConnectEngine)( UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) { return internal_ConnectEngine(true, aCI, 0, aEngVersion, aPrgVersion, aDebugFlags); } // ConnectEngine // The same, but coming in with a valid */ TSyError SYSYNC_EXTERNAL_SRV(ConnectEngineS)( UI_Call_In aCI, uInt16 aCallbackVersion, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) { return internal_ConnectEngine(true, &aCI, aCallbackVersion, aEngVersion, aPrgVersion, aDebugFlags); } // ConnectEngineS static TSyError internal_DisconnectEngine(UI_Call_In aCI) { TSyError err= LOCERR_OK; if (aCI && aCI->thisBase) { // structure must still exist // first get pointer to engine TEngineModuleBase *engine = static_cast(aCI->thisBase); err= engine->Disconnect(); aCI->thisBase= NULL; // no longer valid // delete the engine (this also deletes the callback!) SYSYNC_TRY { delete engine; } SYSYNC_CATCH (...) err = LOCERR_EXCEPTION; SYSYNC_ENDCATCH // done } // if return err; } // internal_DisconnectEngine /* Entry point to disconnect client engine */ TSyError SYSYNC_EXTERNAL(DisconnectEngine)(UI_Call_In aCI) { return internal_DisconnectEngine(aCI); } /* Entry point to disconnect server engine */ TSyError SYSYNC_EXTERNAL_SRV(DisconnectEngine)(UI_Call_In aCI) { return internal_DisconnectEngine(aCI); } #endif // not SIMPLE_LINKING #endif // ENGINE_LIBRARY } // namespace sysync /* end of TEngineInterface implementation */ #endif // ENGINEINTERFACE_SUPPORT // eof syncevolution-1.5/src/synthesis/src/sysync/engineinterface.h0000755000373300037200000010060112424517753026145 0ustar00nightlyallusers00000000000000/** * @File engineinterface.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TEngineInterface - common interface to SySync engine for SDK * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ /* */ #ifndef ENGINEINTERFACE_H #define ENGINEINTERFACE_H #ifdef ENGINEINTERFACE_SUPPORT // published engine definitions #include "engine_defs.h" // internal sysync engine definitions #include "sysync.h" #include "syserial.h" // decide if using with EngineModuleBase class #ifdef SIMPLE_LINKING #define EMBVIRTUAL #else #include "enginemodulebase.h" #define EMBVIRTUAL virtual #endif // DBAPI tunnel support #ifdef DBAPI_TUNNEL_SUPPORT #define TUNNEL_IMPL #define TUNNEL_IMPL_VOID #else #define TUNNEL_IMPL { return LOCERR_NOTIMP; } #define TUNNEL_IMPL_VOID {} #endif using namespace std; namespace sysync { // forward class TEngineInterface; class TSyncAppBase; #ifdef SIMPLE_LINKING // for using the engineInterface without EngineModuleBase, engine base class // for the newXXXXEngine() functions is TEngineInterface #define ENGINE_IF_CLASS TEngineInterface // factory function declarations are here, as we have no EngineModuleBase #ifdef SYSYNC_CLIENT ENGINE_IF_CLASS *newClientEngine(void); #endif #ifdef SYSYNC_SERVER ENGINE_IF_CLASS *newServerEngine(void); #endif #else // with EngineModuleBase, use it as base class. newXXXXXEngine are declared in // enginemodulebase.h #define ENGINE_IF_CLASS TEngineModuleBase #endif // settings key implementation base class class TSettingsKeyImpl : noncopyable { public: TSettingsKeyImpl(TEngineInterface *aEngineInterfaceP); virtual ~TSettingsKeyImpl(); // open subkey(chain) by relative(!) path // - walks down through needed subkeys, always starting at myself TSyError OpenKeyByPath( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aPath, uInt16 aMode, bool aImplicit ); // open Settings subkey key by ID or iterating over all subkeys virtual TSyError OpenSubkey( TSettingsKeyImpl *&aSettingsKeyP, sInt32 aID, uInt16 aMode ) { // by default, opening by key is not allowed (only if derived class implements it) return DB_NotAllowed; }; // delete Settings subkey key by ID virtual TSyError DeleteSubkey(sInt32 aID) { // by default, keys cannot be deleted return DB_NotAllowed; }; // return ID of current key virtual TSyError GetKeyID(sInt32 &aID) { // by default, key has no ID access to subkeys return DB_NotAllowed; }; // get value's ID (e.g. internal index) virtual sInt32 GetValueID(cAppCharP aName) { return KEYVAL_ID_UNKNOWN; // unknown }; // Set text format parameters TSyError SetTextMode(uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian); // Set text format parameters TSyError SetTimeMode(uInt16 aTimeMode) { fTimeMode = aTimeMode; return LOCERR_OK; }; // Reads a named value in specified format into passed memory buffer TSyError GetValueByID( sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); // Writes a named value in specified format passed in memory buffer TSyError SetValueByID( sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); // get engine interface TEngineInterface *getEngineInterface(void) { return fEngineInterfaceP; }; protected: // open subkey by name (not by path!) // - this is the actual implementation virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { // by default, no key can be found (derived class must implement it) return DB_NotFound; }; // get value's native type // Note: this must be safe if aID is out of range and must return VALTYPE_UNKNOWN if so. virtual uInt16 GetValueType(sInt32 aID) { return VALTYPE_UNKNOWN; // unknown }; // Internal Get Value in internal format. // Notes: // - all values, even strings can be returned as bare data (no NUL terminator needed, but allowed for VALTYPE_TEXT) // - in all cases, no more than aBufSize bytes may be copied (and in case of strings, if aBufSize equals the string // size, the routine must return the entire string data, even if this means omitting the terminator) // - in all cases, aValSize must return the actual size of the entire value, regardless of how many bytes could // actually be copied. Note that this is UNLIKE aValSize for the exposed API GetValue(), which always returns // the number of bytes returned, even if these are truncated. virtual TSyError GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { // By default, there are no values return DB_NotAllowed; }; // set value virtual TSyError SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ) { // By default, there are no values return DB_NotAllowed; }; // helper for detecting generic field attribute access bool checkFieldAttrs(cAppCharP aName, size_t &aBaseNameSize, sInt32 &aFldID); // helper for returning generic field attribute type bool checkAttrValueType(sInt32 aID, uInt16 &aValType); // helper for returning generic field attribute values bool checkAttrValue( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); // the engine interface TEngineInterface *fEngineInterfaceP; // Value format modes TCharSets fCharSet; bool fBigEndian; TLineEndModes fLineEndMode; uInt16 fTimeMode; private: // link to implicitly opened parent (when opening via OpenKeyByPath) TSettingsKeyImpl *fImplicitParentKeyP; }; // TSettingsKeyImpl // Table for TReadOnlyInfoKey typedef struct { cAppCharP valName; // null for terminator uInt16 valType; appPointer valPtr; memSize valSiz; // size of var or 0 for autosize for null terminated strings } TReadOnlyInfo; // key delivering constant infos class TReadOnlyInfoKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TReadOnlyInfoKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP) {}; // get value's ID (e.g. internal index) virtual sInt32 GetValueID(cAppCharP aName); protected: // get value's native type virtual uInt16 GetValueType(sInt32 aID); // get value virtual TSyError GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); virtual const TReadOnlyInfo *getInfoTable(void) = 0; virtual sInt32 numInfos(void) = 0; private: // iterator uInt16 fIterator; }; // TReadOnlyInfoKey // key for accessing global config vars class TConfigVarKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TConfigVarKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP) {}; // get value's ID (config vars do NOT have an ID!) virtual sInt32 GetValueID(cAppCharP aName); protected: // get value's native type (all config vars are text) virtual uInt16 GetValueType(sInt32 aID); // get value virtual TSyError GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); // set value virtual TSyError SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ); private: // cached name of last variable name used (to get around IDs) string fVarName; }; // TConfigVarKey // forward class TStructFieldsKey; typedef struct TStructFieldInfo TStructFieldInfo; // function prototype to get values typedef TSyError (*TGetValueProc)( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); // function prototype to set values typedef TSyError (*TSetValueProc)( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ); // Table for TStructFieldsKey typedef struct TStructFieldInfo { cAppCharP valName; // null for terminator uInt16 valType; bool writable; // set if field can be written size_t fieldOffs; // offset of field from beginning of structure size_t valSiz; // size of field in bytes, if 0, only get/setValueProc access is possible (and if these are not defined, access is not allowed) TGetValueProc getValueProc; // if not NULL, this routine is called instead of reading data directly TSetValueProc setValueProc; // if not NULL, this routine is called instead of writing data directly } TStructFieldInfo; // key for access to a struct containing settings fields class TStructFieldsKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TStructFieldsKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP), fDirty(false), fIterator(0) {}; // get value's ID (e.g. internal index) virtual sInt32 GetValueID(cAppCharP aName); // Static helpers // - static helper for procedural string readers static TSyError returnString(cAppCharP aReturnString, appPointer aBuffer, memSize aBufSize, memSize &aValSize); static TSyError returnInt(sInt32 aInt, memSize aIntSize, appPointer aBuffer, memSize aBufSize, memSize &aValSize); static TSyError returnLineartime(lineartime_t aTime, appPointer aBuffer, memSize aBufSize, memSize &aValSize); protected: // get value's native type virtual uInt16 GetValueType(sInt32 aID); // get value virtual TSyError GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); // set value virtual TSyError SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ); // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void) { return NULL; }; virtual sInt32 numFields(void) { return 0; }; // get actual struct base address virtual uInt8P getStructAddr(void) { return NULL; }; // flag that will be set on first write access bool fDirty; private: // iterator uInt16 fIterator; }; // TStructFieldsKey // Engine info static const uInt16 variantCode = SYSER_VARIANT_CODE; static const TReadOnlyInfo EngineInfoTable[] = { // name, type, ptr, siz { "version", VALTYPE_TEXT, (appPointer)SYSYNC_FULL_VERSION_STRING, 0 }, { "platform", VALTYPE_TEXT, (appPointer)SYSYNC_PLATFORM_NAME, 0 }, { "name", VALTYPE_TEXT, (appPointer)CUST_SYNC_MODEL, 0 }, { "manufacturer", VALTYPE_TEXT, (appPointer)CUST_SYNC_MAN, 0 }, { "comment", VALTYPE_TEXT, (appPointer)VERSION_COMMENTS, 0 }, // other build infos { "variantcode", VALTYPE_INT16, (appPointer)&variantCode, 2 }, // Note: productcode and extraid are already available as configvars }; class TEngineInfoKey : public TReadOnlyInfoKey { typedef TReadOnlyInfoKey inherited; public: TEngineInfoKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP) {}; protected: virtual const TReadOnlyInfo *getInfoTable(void) { return EngineInfoTable; }; virtual sInt32 numInfos(void) { return sizeof(EngineInfoTable)/sizeof(TReadOnlyInfo); }; }; // TEngineInfoKey // Licensing #ifdef SYSER_REGISTRATION class TLicensingKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TLicensingKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP) {}; protected: // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); }; // TLicensingKey #endif // Generic root key, providing settings keys common to all // SySync applications class TSettingsRootKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TSettingsRootKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP) {}; protected: // open subkey by name (not by path!) // - this is the actual implementation virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { if (strucmp(aName,"engineinfo",aNameSize)==0) aSettingsKeyP = new TEngineInfoKey(fEngineInterfaceP); else if (strucmp(aName,"configvars",aNameSize)==0) aSettingsKeyP = new TConfigVarKey(fEngineInterfaceP); #ifdef SYSER_REGISTRATION else if (strucmp(aName,"licensing",aNameSize)==0) aSettingsKeyP = new TLicensingKey(fEngineInterfaceP); #endif else return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; }; }; // TSettingsRootKey // Common Engine Interface class TEngineInterface : #ifdef SIMPLE_LINKING noncopyable #else public TEngineModuleBase #endif { #ifndef SIMPLE_LINKING typedef TEngineModuleBase inherited; #endif friend class TSettingsKeyImpl; public: TEngineInterface(); // constructor virtual ~TEngineInterface(); // destructor /// @brief Object init, usually called at connect time /// @note needed to allow virtual call to newSyncAppBase() factory function EMBVIRTUAL TSyError Init(void); EMBVIRTUAL TSyError Term(void); // Engine init // ----------- /// @brief Set the global mode for string paramaters (when never called, default params are UTF-8 with C-style line ends) /// @param aCharSet[in] charset /// @param aLineEndMode[in] line end mode (default is C-lineends of the platform (almost always LF)) /// @param aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError SetStringMode(uInt16 aCharSet, uInt16 aLineEndMode=LEM_CSTR, bool aBigEndian=false); /// @brief init object, optionally passing XML config text in memory /// @param aConfigXML[in] NULL or empty string if no external config needed, config text otherwise /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError InitEngineXML(cAppCharP aConfigXML); /// @brief init object, optionally passing a open FILE for reading config /// @param aConfigFilePath[in] path to config file /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError InitEngineFile(cAppCharP aConfigFilePath); /// @brief init object, optionally passing a callback for reading config /// @param aReaderFunc[in] callback function which can deliver next chunk of XML config data /// @param aContext[in] free context pointer passed back with callback /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError InitEngineCB(TXMLConfigReadFunc aReaderFunc, void *aContext); // Running a Sync Session // ---------------------- /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. For multi-profile clients: profile ID to use /// @param aSessionName[in] a text name/id to identify a session, useage depending on session type. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError OpenSession(SessionH &aNewSessionH, uInt32 aSelector=0, cAppCharP aSessionName=NULL); protected: // internal implementation, sessionname already in application format virtual TSyError OpenSessionInternal(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName); public: /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession. /// When used as callback from DBApi, this parameter is irrelevant and /// must be set to NULL as a callback from DBApi has an implicit session context /// automatically. /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSessionKey(SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode); /// @brief Close a session /// @note It depends on session type if this also destroys the session or if it may persist and can be re-opened. /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError CloseSession(SessionH aSessionH); /// @brief Executes sync session or other sync related activity step by step /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SessionStep(SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP = NULL); /// @brief Get access to SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[out] receives pointer to buffer (empty for receive, full for send) /// @param aBufSize[out] receives size of empty or full buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError GetSyncMLBuffer(SessionH aSessionH, bool aForSend, appPointer &aBuffer, memSize &aBufSize); /// @brief Return SyncML message buffer to engine /// @param aSessionH[in] session handle obtained with OpenSession /// @param aProcessed[in] number of bytes put into or read from the buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError RetSyncMLBuffer(SessionH aSessionH, bool aForSend, memSize aProcessed); /// @brief Read data from SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[in] pointer to buffer /// @param aBufSize[in] size of buffer, maximum to be read /// @param aMsgSize[out] size of data available in the buffer for read INCLUDING just returned data. /// @note If the aBufSize is too small to return all available data LOCERR_TRUNCATED will be returned, and the /// caller can repeat calls to ReadSyncMLBuffer to get the next chunk. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError ReadSyncMLBuffer (SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize &aMsgSize); /// @brief Write data to SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[in] pointer to buffer /// @param aMsgSize[in] size of message to write to the buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError WriteSyncMLBuffer(SessionH aSessionH, appPointer aBuffer, memSize aMsgSize); // Settings access // --------------- /// @brief open Settings key by path specification /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aParentKeyH[in] NULL if path is absolute from root, handle to an open key for relative access /// @param aPath[in] the path specification as null terminated string /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError OpenKeyByPath ( KeyH &aNewKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ); /// @brief open Settings subkey key by ID or iterating over all subkeys /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aParentKeyH[in] handle to the parent key (NULL = root key) /// @param aID[in] the ID of the subkey to open, /// or KEYVAL_ID_FIRST/KEYVAL_ID_NEXT to iterate over existing subkeys, returns DB_NoContent when no more found /// or KEYVAL_ID_NEW(_xxx) to create a new subkey /// @param aMode[in] the open mode /// @return LOCERR_OK on success, DB_NoContent when no more subkeys are found with /// KEYVAL_ID_FIRST/KEYVAL_ID_NEXT /// or any other SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError OpenSubkey( KeyH &aNewKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ); /// @brief delete Settings subkey key by ID /// @param aParentKeyH[in] handle to the parent key /// @param aID[in] the ID of the subkey to delete /// @return LOCERR_OK on success /// or any other SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError DeleteSubkey(KeyH aParentKeyH, sInt32 aID); /// @brief Get key ID of currently open key. Note that the Key ID is only locally unique within /// the parent key. /// @param aKeyH[in] an open key handle /// @param aID[out] receives the ID of the open key, which can be used to re-access the /// key within its parent using OpenSubkey() /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError GetKeyID(KeyH aKeyH, sInt32 &aID); /// @brief Set text format parameters (when never called, default params are those set with global SetStringMode()) /// @param aKeyH[in] an open key handle /// @param aCharSet[in] charset /// @param aLineEndMode[in] line end mode (defaults to C-lineends of the platform (almost always LF)) /// @param aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError SetTextMode(KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode=LEM_CSTR, bool aBigEndian=false); /// @brief Set time format parameters /// @param aKeyH[in] an open key handle /// @param aTimeMode[in] time mode, see TMODE_xxx (default is platform's lineratime_t when SetTimeMode() is not used) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError SetTimeMode(KeyH aKeyH, uInt16 aTimeMode); /// @brief Closes a key opened by OpenKeyByPath() or OpenSubKey() /// @param aKeyH[in] an open key handle. Will be invalid when call returns with LOCERR_OK. Do not re-use! /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError CloseKey(KeyH aKeyH); /// @brief Reads a named value in specified format into passed memory buffer /// @param aKeyH[in] an open key handle /// @param aValueName[in] name of the value to read. Some keys offer special ".XXX" /// suffixes (VALSUFF_XXX) to value names, which return alternate values (like a timestamp field's /// time zone name with ".TZNAME"). /// @param aValType[in] desired return type, see VALTYPE_xxxx /// @param aBuffer[in/out] buffer where to store the data /// @param aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) /// Note: to get only size of a value (useful especially for strings), pass 0 as buffer size. /// @param aValSize[out] actual size of value. /// For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator /// Note that this will be set also when return value is LOCERR_BUFTOOSMALL, /// to indicate the required buffer size (buffer contents is undefined in case of LOCERR_BUFTOOSMALL). /// For values that can be truncated (strings), LOCERR_TRUNCATED will be returned /// when returned value is not entire value - aValSize is truncated size then. Use /// a call with aBufSize==0 to determine actual value size in bytes. Add one character size /// to the buffer size in case of VALTYPE_TEXT for the NUL terminator. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure EMBVIRTUAL TSyError GetValue( KeyH aKeyH, cAppCharP aValueName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); /// @brief Writes a named value in specified format passed in memory buffer /// @param aKeyH[in] an open key handle /// @param aValueName[in] name of the value to write. Some keys offer special ".XXX" /// suffixes (VALSUFF_XXX) to value names, which are used to set alternate values (like a /// timestamp field's time zone name with ".TZNAME"). /// @param aValType[in] type of value passed in, see VALTYPE_xxxx /// @param aBuffer[in] buffer containing the data /// @param aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure. If value /// buffer passed in is too small for aValType (such as only 2 bytes for a VALTYPE_INT32, /// LOCERR_BUFTOOSMALL will be returned and nothing stored. If buffer passed in is too /// long (e.g. for strings) to be entirely stored, only the beginning is stored and /// LOCERR_TRUNCATED is returned. EMBVIRTUAL TSyError SetValue( KeyH aKeyH, cAppCharP aValueName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); /// @brief get value's ID for use with Get/SetValueByID() /// @param aKeyH[in] an open key handle /// @param aName[in] name of the value to write. Some keys offer special ".FLAG.XXX" /// values, which return flag bits which can be added to the regular ID to obtain /// alternate values (like the value name with ".FLAG.VALNAME", useful when iterating /// over values). /// @return KEYVAL_ID_UNKNOWN when no ID available for name, ID of value otherwise EMBVIRTUAL sInt32 GetValueID(KeyH aKeyH, cAppCharP aName); /// @brief Reads a named value in specified format into passed memory buffer /// @param aKeyH[in] an open key handle /// @param aID[in] ID of the value to read (evenually plus flag mask obtained by GetValueID(".FLAG.XXX") call) /// @param aArrayIndex[in] 0-based array element index for array values. /// @param aValType[in] desired return type, see VALTYPE_xxxx /// @param aBuffer[in/out] buffer where to store the data /// @param aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) /// Note: to get only size of a value (useful especially for strings), pass 0 as buffer size. /// @param aValSize[out] actual size of value. /// For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator /// Note that this will be set also when return value is LOCERR_BUFTOOSMALL, /// to indicate the required buffer size (buffer contents is undefined in case of LOCERR_BUFTOOSMALL). /// For values that can be truncated (strings), LOCERR_TRUNCATED will be returned /// when returned value is not entire value - aValSize is truncated size then. Use /// a call with aBufSize==0 to determine actual value size in bytes. Add one character size /// to the buffer size in case of VALTYPE_TEXT for the NUL terminator. /// @return LOCERR_OK on success, LOCERR_OUTOFRANGE when array index is out of range /// SyncML or LOCERR_xxx error code on other failure. EMBVIRTUAL TSyError GetValueByID( KeyH aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); /// @brief Writes a named value in specified format passed in memory buffer /// @param aKeyH[in] an open key handle /// @param aID[in] ID of the value to write (evenually plus flag mask obtained by GetValueID(".FLAG.XXX") call) /// @param aArrayIndex[in] 0-based array element index for array values. /// @param aValType[in] type of value passed in, see VALTYPE_xxxx /// @param aBuffer[in] buffer containing the data /// @param aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure. If value /// buffer passed in is too small for aValType (such as only 2 bytes for a VALTYPE_INT32, /// LOCERR_BUFTOOSMALL will be returned and nothing stored. If buffer passed in is too /// long (e.g. for strings) to be entirely stored, only the beginning is stored and /// LOCERR_TRUNCATED is returned. EMBVIRTUAL TSyError SetValueByID( KeyH aKeyH, sInt32 aID, sInt32 aArrayIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); /// @name DB-Api-like access to datastore adaptor (eg. when using tunnel plugin) /// @note These all return LOCERR_NOTIMP when DBAPI_TUNNEL_SUPPORT is not defined /// /// @{ EMBVIRTUAL TSyError StartDataRead ( SessionH aSessionH, cAppCharP lastToken, cAppCharP resumeToken ) TUNNEL_IMPL; EMBVIRTUAL TSyError ReadNextItem ( SessionH aSessionH, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) TUNNEL_IMPL; EMBVIRTUAL TSyError ReadItem ( SessionH aSessionH, cItemID aID, appCharP *aItemData ) TUNNEL_IMPL; EMBVIRTUAL TSyError EndDataRead ( SessionH aSessionH ) TUNNEL_IMPL; EMBVIRTUAL TSyError StartDataWrite ( SessionH aSessionH ) TUNNEL_IMPL; EMBVIRTUAL TSyError InsertItem ( SessionH aSessionH, cAppCharP aItemData, ItemID aID ) TUNNEL_IMPL; EMBVIRTUAL TSyError UpdateItem ( SessionH aSessionH, cAppCharP aItemData, cItemID aID, ItemID updID ) TUNNEL_IMPL; EMBVIRTUAL TSyError MoveItem ( SessionH aSessionH, cItemID aID, cAppCharP newParID ) TUNNEL_IMPL; EMBVIRTUAL TSyError DeleteItem ( SessionH aSessionH, cItemID aID ) TUNNEL_IMPL; EMBVIRTUAL TSyError EndDataWrite ( SessionH aSessionH, bool success, appCharP *newToken ) TUNNEL_IMPL; EMBVIRTUAL void DisposeObj ( SessionH aSessionH, void* memory ) TUNNEL_IMPL_VOID; // ---- asKey ---- EMBVIRTUAL TSyError ReadNextItemAsKey( SessionH aSessionH, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ) TUNNEL_IMPL; EMBVIRTUAL TSyError ReadItemAsKey ( SessionH aSessionH, cItemID aID, KeyH aItemKey ) TUNNEL_IMPL; EMBVIRTUAL TSyError InsertItemAsKey ( SessionH aSessionH, KeyH aItemKey, ItemID aID ) TUNNEL_IMPL; EMBVIRTUAL TSyError UpdateItemAsKey ( SessionH aSessionH, KeyH aItemKey, cItemID aID, ItemID updID ) TUNNEL_IMPL; EMBVIRTUAL TSyError debugPuts(cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aLinePrefix, cAppCharP aText); /// @} /// @brief returns the current application base object TSyncAppBase *getSyncAppBase(void) { return fAppBaseP; }; #ifdef DIRECT_APPBASE_GLOBALACCESS // only as a hack until we are completely free of global anchors void setSyncAppBase(TSyncAppBase *aAppBaseP) { fAppBaseP=aAppBaseP; }; #endif protected: /// @brief Must be derived in engineBase derivates for generating root for the appropriate settings tree /// @return root settings object, or NULL if failure virtual TSettingsKeyImpl *newSettingsRootKey(void) { return new TSettingsRootKey(this); // return base class which can return some engine infos }; /// @brief returns a new application base. /// @note in engineInterface based targets, this is the replacement for the formerly /// global newSyncAppBase() factory function. virtual TSyncAppBase *newSyncAppBase(void) = 0; /// @brief returns the SML instance for a given session handle virtual InstanceID_t getSmlInstanceOfSession(SessionH aSessionH) { return 0; /* no instance in base class */ }; private: // conversion helper // - converts byte stream (which can be an 8-bit char set or unicode in intel or motorola order) // to internal UTF-8, according to text mode set with SetStringMode() cAppCharP makeAppString(cAppCharP aTextP, string &aString); // the application base TSyncAppBase *fAppBaseP; // String format modes TCharSets fCharSet; bool fBigEndian; TLineEndModes fLineEndMode; }; // TEngineInterface } // namespace sysync #endif // ENGINEINTERFACE_SUPPORT #endif // ENGINEINTERFACE_H // eof syncevolution-1.5/src/synthesis/src/sysync/global_progress.h0000755000373300037200000000611012424517753026203 0ustar00nightlyallusers00000000000000/* * Include file to allow SyncML RTK to use progress callback * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch */ #ifndef GLOBAL_PROGRESS_H #define GLOBAL_PROGRESS_H #include "generic_types.h" #ifdef __cplusplus namespace sysync { #endif // - progress event types typedef enum { // global pev_error, // some fatal aborting error pev_message, // extra messages pev_errcode, // extra error code pev_nop, // no extra message, just called to allow aborting pev_wait, // called to signal main program that caller would want to wait for extra1 milliseconds pev_debug, // called to allow debug interactions, extra1=code // transport-related pev_sendstart, pev_sendend, pev_recvstart, pev_recvend, pev_ssl_expired, // expired pev_ssl_notrust, // not completely trusted pev_conncheck, // sent periodically when waiting for network, allows application to check connection pev_suspendcheck, // sent when client could initiate a explicit suspend // General pev_display100, // alert 100 received from remote, extra1=char * to message text in UTF8 // Session-related pev_sessionstart, pev_sessionend, // session ended, probably with error in extra // Datastore-related pev_preparing, // preparing (e.g. preflight in some clients), extra1=progress, extra2=total pev_deleting, // deleting (zapping datastore), extra1=progress, extra2=total pev_alerted, // datastore alerted (extra1=0 for normal, 1 for slow, 2 for first time slow, extra2=1 for resumed session, extra3=syncmode) pev_syncstart, // sync started pev_itemreceived, // item received, extra1=current item count, extra2=number of expected changes (if >= 0) pev_itemsent, // item sent, extra1=current item count, extra2=number of expected items to be sent (if >=0) pev_itemprocessed, // item locally processed, extra1=# added, extra2=# updated, extra3=# deleted pev_syncend, // sync finished, probably with error in extra1 (0=ok), syncmode in extra2 (0=normal, 1=slow, 2=first time), extra3=1 for resumed session) pev_dsstats_l, // datastore statistics for local (extra1=# added, extra2=# updated, extra3=# deleted) pev_dsstats_r, // datastore statistics for remote (extra1=# added, extra2=# updated, extra3=# deleted) pev_dsstats_e, // datastore statistics for local/remote rejects (extra1=# locally rejected, extra2=# remotely rejected) pev_dsstats_s, // datastore statistics for server slowsync (extra1=# slowsync matches) pev_dsstats_c, // datastore statistics for server conflicts (extra1=# server won, extra2=# client won, extra3=# duplicated) pev_dsstats_d, // datastore statistics for data volume (extra1=outgoing bytes, extra2=incoming bytes) // number of enums numProgressEventTypes } TProgressEventType; #ifndef ENGINE_LIBRARY // globally accessible progress event posting #ifdef __cplusplus extern "C" int GlobalNotifyProgressEvent #else extern int GlobalNotifyProgressEvent #endif ( TProgressEventType aEventType, sInt32 aExtra1, sInt32 aExtra2, sInt32 aExtra3 ); #endif // not ENGINE_LIBRARY #ifdef __cplusplus } // namespace sysync #endif #endif // GLOBAL_PROGRESS_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync/iso8601.cpp0000644000373300037200000003211312424517753024462 0ustar00nightlyallusers00000000000000/* * File: iso8601.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * conversion from/to linear time scale. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-05-02 : luz : extracted from sysync_utils * */ #include "prefix_file.h" #include "iso8601.h" #include "stringutils.h" #include "timezones.h" #if defined(EXPIRES_AFTER_DATE) && !defined(FULLY_STANDALONE) // only if used in sysync context #include "sysync.h" #endif namespace sysync { /// @brief convert ISO8601 to timestamp and timezone /// @return number of successfully converted characters or 0 if no valid ISO8601 specification could be decoded /// @param[in] aISOString input string in ISO8601 /// @param[out] aTimestamp representation of ISO time spec as is (no time zone conversions) /// @param[out] aWithTime if set, time specification was found in input string /// @param[out] aTimeContext: /// TCTX_DURATION if ISO8601 is a duration format (PnDTnHnMnS.MS) /// TCTX_UNKNOWN if ISO8601 does not include a time zone specification /// TCTX_UTC if ISO8601 ends with the "Z" specifier /// TCTX_DATEONLY if ISO8601 only contains a date, but no time /// TCTX_OFFSCONTEXT(xx) if ISO8601 explicitly specifies a UTC offset sInt16 ISO8601StrToTimestamp(cAppCharP aISOString, lineartime_t &aTimestamp, timecontext_t &aTimeContext) { uInt16 y,m,d,hr,mi,s,ms; // unsigned because these can't be signed when parsing bool isExtended=false; sInt16 n,h,sg; n=0; // check if it might be duration sg=0; // duration sign // - sign if (*aISOString=='-') { sg=-1; // negative duration aISOString++; n++; } else if(*aISOString=='+') { sg=1; // positive duration aISOString++; n++; } if (*aISOString=='P') { if (sg==0) sg=1; aISOString++; n++; } else if (sg!=0) return 0; // we had a sign, but no 'P' -> invalid ISO8601 date // if y!=0 here, this is a duration if (sg!=0) { // duration aTimestamp = 0; aTimeContext = TCTX_UNKNOWN + TCTX_DURATION; bool timepart = false; // parse duration parts while (true) { if (*aISOString=='T' && !timepart) { timepart = true; aISOString++; n++; } #ifdef NO_FLOATS sInt32 part; h = StrToLong(aISOString,part); #else double part; h = StrToDouble(aISOString,part); #endif if (h>0) { aISOString+=h; n+=h; // this is a part, must be followed by a designator switch (*aISOString) { case 'Y': part*=365; goto days; // approximate year case 'M': // month or minute if (timepart) { aTimestamp += (lineartime_t)(part*sg*secondToLinearTimeFactor*SecsPerMin); // minute break; } else { part*=30; // approximate month goto days; } case 'W': part *= 7; goto days; // one week case 'D': days: aTimestamp += (lineartime_t)(part*sg*linearDateToTimeFactor); break; case 'H': aTimestamp += (lineartime_t)(part*sg*secondToLinearTimeFactor*SecsPerHour); break; case 'S': aTimestamp += (lineartime_t)(part*sg*secondToLinearTimeFactor); break; default: return 0; // bad designator, error } aISOString++; n++; } // if number else { // no more digits -> end of duration string return n; // number of chars processed } } // while } // if duration // try to parse date // - first should be 4 digit year h = StrToUShort(aISOString,y,4); if (h!=4) return 0; // no ISO8601 date aISOString+=h; n+=h; // - test for format if (*aISOString=='-') { isExtended=true; aISOString++; n++; } // - next must be 2 digit month h = StrToUShort(aISOString,m,2); if (h!=2) return 0; // no ISO8601 date aISOString+=h; n+=h; // - check separator in case of extended format if (isExtended) { if (*aISOString != '-') return 0; // missing separator, no ISO8601 date aISOString++; n++; } // - next must be 2 digit day h = StrToUShort(aISOString,d,2); if (h!=2) return 0; // no ISO8601 date aISOString+=h; n+=h; // convert date to timestamp aTimestamp = date2lineartime(y,m,d); // Now next must be "T" if time spec is included if (*aISOString!='T') { // date-only, floating aTimeContext = TCTX_DATEONLY|TCTX_UNKNOWN; } else { // parse time as well aISOString++; n++; // skip "T" mi=0; s=0; ms=0; // reset optional time components // - next must be 2 digit hour h = StrToUShort(aISOString,hr,2); if (h!=2) return 0; // no ISO8601 time, we need the hour, minimally aISOString+=h; n+=h; // - check separator in case of extended format if (isExtended) { if (*aISOString != ':') return 0; // missing separator, no ISO8601 time (Note: hour-only reduced precision does not exist for extended format) aISOString++; n++; } // - next must be 2 digit minute (or nothing for hour-only reduced precision basic format) h = StrToUShort(aISOString,mi,2); if (!isExtended && h==0) goto timeok; if (h!=2) return 0; // no ISO8601 time, must be 2 digits here aISOString+=h; n+=h; // - check separator in case of extended format if (isExtended) { if (*aISOString != ':') goto timeok; // no separator means hour:minute reduced precision for extended format aISOString++; n++; } // - next must be 2 digit second (or nothing for reduced precision without seconds) h = StrToUShort(aISOString,s,2); if (!isExtended && h==0) goto timeok; // no seconds is ok for basic format only (in extended format, the separator must be omitted as well, which is checked above) if (h!=2) return 0; // no ISO8601 time, must be 2 digits here aISOString+=h; n+=h; // optional fractions of seconds if (*aISOString=='.') { aISOString++; n++; h = StrToUShort(aISOString,ms,3); if (h==0) return 0; // invalid fraction specified aISOString+=h; n+=h; while (h<3) { ms *= 10; h++; } // make milliseconds } timeok: // add to timestamp aTimestamp += time2lineartime(hr,mi,s,ms); // check for zone specification h = ISO8601StrToContext(aISOString,aTimeContext); aISOString+=h; n+=h; } // return number of characters converted return n; } // ISO8601StrToTimestamp /// @brief convert ISO8601 zone offset to internal time zone /// @return number of successfully converted characters or 0 if no valid ISO8601 time zone spec could be decoded /// @param[in] aISOString input string in ISO8601 time zone offset format (or just "Z" for UTC) /// @param[out] aTimeContext: /// TCTX_UNKNOWN if no time zone specification is found /// TCTX_UTC if "Z" specifier found /// TCTX_OFFSCONTEXT(xx) if explicit UTC offset is found sInt16 ISO8601StrToContext(cAppCharP aISOString, timecontext_t &aTimeContext) { sInt16 n=0,h; sInt16 minoffs; uInt16 offs; aTimeContext = TCTX_UNKNOWN; bool western=false; // check for UTC special case if (*aISOString=='Z') { n++; aTimeContext = TCTX_UTC; } else { // check for time zone offset if (*aISOString!='+' && *aISOString!='-') return 0; // error, nothing converted western = *aISOString=='-'; // time is behind of UTC in the west aISOString++; n++; h=StrToUShort(aISOString,offs,2); if (h!=2) return 0; // not +HH format with 2 digits, nothing converted aISOString+=h; n+=h; // make minutes minoffs = offs*60; // hour offset ok, now check minutes if (*aISOString==':') { aISOString++; n++; }; // extended format // get minutes, if any h = StrToUShort(aISOString,offs,2); if (h==2) { // minute specified minoffs += offs; // add minutes } // adjust sign if (western) minoffs=-minoffs; // western offset is negative // return non-symbolic minute offset aTimeContext = TCTX_OFFSCONTEXT(minoffs); } // return number of characters converted return n; } // ISO8601StrToContext /// @brief convert timestamp to ISO8601 representation /// @param[out] aISOString will receive ISO8601 formatted date/time /// @param[in] aTimestamp representation of ISO time spec as is (no time zone conversions) /// @param[in] aExtFormat if set, extended format is generated /// @param[in] aWithFracSecs if set, fractional seconds are displayed (3 digits, milliseconds) /// @param[in] aTimeContext: /// TCTX_DURATION: timestamp is a duration and is shown in ISO8601 duration format (PnDTnHnMnS.MS) /// TCTX_UNKNOWN : time is shown as relative format (no "Z", no explicit offset) /// TCTX_TIMEONLY /// TCTX_UTC : time is shown with "Z" specifier /// TCTX_DATEONLY: only date part is shown (of date or duration) /// TCTX_OFFSCONTEXT(xx) : time is shown with explicit UTC offset (but not with "Z", even if offset is 0:00) void TimestampToISO8601Str(string &aISOString, lineartime_t aTimestamp, timecontext_t aTimeContext, bool aExtFormat, bool aWithFracSecs) { // check for duration (should be rendered even if value is 0) if (TCTX_IS_DURATION(aTimeContext)) { // render as duration // - sign if (aTimestamp<0) { aTimestamp=-aTimestamp; aISOString = "-"; } else { aISOString.erase(); } // - "P" duration designator aISOString += "P"; // - days lineardate_t days = aTimestamp / linearDateToTimeFactor; if (days!=0) StringObjAppendPrintf(aISOString,"%ldD",(long)days); // - time part if needed if (!TCTX_IS_DATEONLY(aTimeContext) && lineartime2timeonly(aTimestamp)>(aWithFracSecs ? 0 : secondToLinearTimeFactor-1)) { aISOString += "T"; // we have a time part sInt16 h,m,s,ms; lineartime2time(aTimestamp,&h,&m,&s,&ms); if (h!=0) StringObjAppendPrintf(aISOString,"%hdH",h); if (m!=0) StringObjAppendPrintf(aISOString,"%hdM",m); if (aWithFracSecs && ms!=0) { // with milliseconds, implies seconds as well, even if they are zero StringObjAppendPrintf(aISOString,"%hd.%03hdS",s,ms); } else { // no milliseconds, show seconds if not zero if (s!=0) StringObjAppendPrintf(aISOString,"%hdS",s); } } else if(days==0) { aISOString="PT0S"; // no time part and no days, just display 0 seconds (and not negative, even if fraction might be) } // done return; } // no timestamp, no string if (aTimestamp==0) { aISOString.erase(); return; } // Date if we want date bool hasDate=false; if (!TCTX_IS_TIMEONLY(aTimeContext)) { // we want the date part sInt16 y,m,d; lineartime2date(aTimestamp,&y,&m,&d); if (!TCTX_IS_DURATION(aTimeContext) || !(y==0 && m==0 && d==0)) { if (aExtFormat) StringObjPrintf(aISOString,"%04d-%02d-%02d",y,m,d); // Extended format else StringObjPrintf(aISOString,"%04d%02d%02d",y,m,d); // Basic format hasDate=true; } } else { aISOString.erase(); } // Add time if we want time if (!TCTX_IS_DATEONLY(aTimeContext)) { // we want the time part // - add separator if (hasDate) aISOString+='T'; // - now add the time sInt16 h,m,s,ms; lineartime2time(aTimestamp,&h,&m,&s,&ms); if (aExtFormat) StringObjAppendPrintf(aISOString,"%02hd:%02hd:%02hd",h,m,s); // Extended format else StringObjAppendPrintf(aISOString,"%02hd%02hd%02hd",h,m,s); // Basic format // - add fractions of the second if selected and not 0 if (aWithFracSecs && (ms!=0)) { StringObjAppendPrintf(aISOString,".%03hd",ms); // 3 decimal fraction digits for milliseconds } if (!TCTX_IS_DURATION(aTimeContext)) { // add explicit time zone specification (or UTC "Z") if aTimecontext is a non-symbolic offset ContextToISO8601StrAppend(aISOString, aTimeContext, aExtFormat); } } } // TimestampToISO8601Str /// @brief append internal time zone as ISO8601 zone offset to string /// @param[out] aISOString ISO8601 time zone spec will be appended to this string /// @param[in] aTimeContext /// @param[in] aExtFormat if set, extended format is generated bool ContextToISO8601StrAppend(string &aISOString, timecontext_t aTimeContext, bool aExtFormat) { // check for UTC special case if (TCTX_IS_UTC(aTimeContext)) { aISOString += 'Z'; return true; // has time zone } // check if this is a resolved or a symbolic time zone if (TCTX_IS_TZ(aTimeContext)) return false; // symbolic (includes unknown) - cannot append minute offset // offset specified, show it long moffs = TCTX_MINOFFSET(aTimeContext); bool minus = moffs<0; moffs = abs(moffs); long hoffs = moffs / MinsPerHour; moffs = moffs % MinsPerHour; StringObjAppendPrintf(aISOString, "%c%02ld", minus ? '-' : '+', hoffs); if (moffs!=0 || aExtFormat) { // minute specification required (always so for extended format) if (aExtFormat) aISOString+=':'; // add separator for extended format StringObjAppendPrintf(aISOString, "%02ld", moffs); } return true; // has time zone } // ContextToISO8601StrAppend } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync/iso8601.h0000755000373300037200000000515312424517753024136 0ustar00nightlyallusers00000000000000/* * File: iso8601.h * * Author: Lukas Zeller (luz@plan44.ch) * * conversion from/to linear time scale. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-05-02 : luz : extracted from sysync_utils * */ #ifndef ISO8601_H #define ISO8601_H #include #include "lineartime.h" #include "timezones.h" using namespace std; namespace sysync { /// @brief convert ISO8601 to timestamp /// @return number of successfully converted characters /// @param[in] aISOString input string in ISO8601 /// @param[out] aTimestamp representation of ISO time spec as is (no time zone conversions) /// @param[out] aTimeContext: /// TCTX_UNKNOWN if ISO8601 does not include a time zone specification /// TCTX_UTC if ISO8601 ends with the "Z" specifier /// TCTX_DATEONLY if ISO8601 only contains a date, but no time /// TCTX_OFFSCONTEXT(xx) if ISO8601 explicitly specifies a UTC offset sInt16 ISO8601StrToTimestamp(cAppCharP aISOString, lineartime_t &aTimestamp, timecontext_t &aTimeContext); /// @brief convert ISO8601 zone offset to internal time context /// @param[in] aISOString input string in ISO8601 /// @param[out] aTimeContext context, TCTX_UNKNOWN if none found sInt16 ISO8601StrToContext(cAppCharP aISOString, timecontext_t &aTimeContext); /// @brief convert timestamp to ISO8601 representation /// @param[out] aISOString will receive ISO8601 formatted date/time /// @param[in] aTimestamp representation of ISO time spec as is (no time zone conversions) /// @param[in] aExtFormat if set, extended format is generated /// @param[in] aTimeContext: /// TCTX_UNKNOWN : time is shown as relative format (no "Z", no explicit offset) /// TCTX_UTC : time is shown with "Z" specifier /// TCTX_DATEONLY: only date part is shown /// TCTX_OFFSCONTEXT(xx) : time is shown with explicit UTC offset (but not with "Z", even if offset is 0:00) /// @param[in] aWithFracSecs if set, factional parts of the second are shown in the output void TimestampToISO8601Str(string &aISOString, lineartime_t aTimestamp, timecontext_t aTimeContext, bool aExtFormat=false, bool aWithFracSecs=false); /// @brief append internal time context as ISO8601 zone offset to string /// @param[out] aISOString ISO8601 time zone spec will be appended to this string /// @param[in] aTimeContext /// @param[in] aExtFormat if set, extended format is generated /// @return true if time zone spec appended, false if not bool ContextToISO8601StrAppend(string &aISOString, timecontext_t aTimeContext, bool aExtFormat); } // namespace sysync #endif // ISO8601_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync/itemfield.cpp0000644000373300037200000020254312424517753025321 0ustar00nightlyallusers00000000000000/* * File: itemfield.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TItemField * Abstract class, holds a single field value * TStringField, TIntegerField, TTimeStampField etc. * Implementations of field types * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-08 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "itemfield.h" #include "multifielditemtype.h" #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) #include "sysync_crc16.h" #endif using namespace sysync; namespace sysync { // type names cAppCharP const ItemFieldTypeNames[numFieldTypes] = { "string", "telephone", "integer", "timestamp", "date", "url", "multiline", "blob", "none" }; // corresponding SyncML devInf const TPropDataTypes devInfPropTypes[numFieldTypes] = { proptype_chr, // string -> Character proptype_phonenum, // telephone -> Phone number proptype_int, // integer -> Integer proptype_datetime, // Timestamp -> Date and time of day proptype_datetime, // Date -> Date and time of day proptype_chr, // URL -> Character proptype_text, // multiline -> plain text proptype_bin, // BLOB -> Binary proptype_unknown, // none -> unknown }; /* * Implementation of TItemField */ TItemField::TItemField() : fAssigned(false) // unassigned at creation { } // TItemField::TItemField TItemField::~TItemField() { } // TItemField::~TItemField #ifdef SYDEBUG // show field contents as string for debug output size_t TItemField::StringObjFieldAppend(string &s, uInt16 aMaxStrLen) { if (isUnassigned()) s+=""; else if (isEmpty()) s+=""; else appendToString(s, aMaxStrLen); return 0; // non-strings do not have a real size } // TItemField::StringObjFieldAppend #endif // append (default to appending string value of other field) void TItemField::append(TItemField &aItemField) { string s; aItemField.getAsString(s); appendString(s); } // TItemField::append // generic cross-type assignment via string format TItemField& TItemField::operator=(TItemField &aItemField) { string s; if (aItemField.isUnassigned()) unAssign(); // copy unassigned status else if (aItemField.isEmpty()) assignEmpty(); // copy empty status else { aItemField.getAsString(s); setAsString(s); } return *this; } // TItemField::operator= // get any field as integer fieldinteger_t TItemField::getAsInteger(void) { // convert to integer number string s; fieldinteger_t i; getAsString(s); if (! #ifndef NO64BITINT StrToLongLong(s.c_str(),i) #else StrToLong(s.c_str(),i) #endif ) i=0; // defined value return i; } // TItemField::getAsInteger // get integer as numeric string void TItemField::setAsInteger(fieldinteger_t aInteger) { string s; #ifndef NO64BITINT LONGLONGTOSTR(s,PRINTF_LLD_ARG(aInteger)); #else StringObjPrintf(s,"%ld",(sInt32)aInteger); #endif // set as string setAsString(s); } // TItemField::setAsInteger // set as string, max number of chars = aLen void TItemField::setAsString(cAppCharP aString, size_t aLen) { if (!aString) assignEmpty(); else { string t(aString,aLen); // now call basic setter setAsString(t.c_str()); } } // TItemField::setAsString size_t TItemField::getStringSize(void) { if (getType()==fty_none) return 0; // empty/unassigned field has no size (avoid unneeded getAsString) string s; getAsString(s); return s.size(); } // TItemField::getStringSize bool TItemField::contains(TItemField &aItemField, bool aCaseInsensitive) { string s; aItemField.getAsString(s); return findInString(s.c_str(), aCaseInsensitive)>=0; } #ifdef STREAMFIELD_SUPPORT // reset stream (start reading and/or writing at specified position) void TItemField::resetStream(size_t aPos) { if (aPos==0) fStreamPos=0; // optimized short-cut else { size_t sz=getStreamSize(); if (aPos>sz) fStreamPos=sz; else fStreamPos=aPos; } } // TItemField::resetStream // read from stream size_t TItemField::readStream(void *aBuffer, size_t aMaxBytes) { string s; getAsString(s); size_t sz=s.size(); if (fStreamPos>sz) fStreamPos=sz; if (fStreamPos+aMaxBytes > sz) aMaxBytes=sz-fStreamPos; if (aMaxBytes>0) { // copy memory memcpy(aBuffer,s.c_str()+fStreamPos,aMaxBytes); } // return number of chars actually read fStreamPos+=aMaxBytes; return aMaxBytes; } // TItemField::readStream // write to stream size_t TItemField::writeStream(void *aBuffer, size_t aNumBytes) { if (aNumBytes==0) return 0; if (fStreamPos!=0) { // not replacing entire contents, need read-modify-write of string string s; getAsString(s); if (fStreamPos>s.size()) fStreamPos=s.size(); s.resize(fStreamPos); s.append((cAppCharP)aBuffer,aNumBytes); setAsString(s); } else { setAsString((cAppCharP)aBuffer,aNumBytes); } fStreamPos+=aNumBytes; return aNumBytes; } // TItemField::writeStream #endif /* end of TItemField implementation */ #ifdef ARRAYFIELD_SUPPORT /* * Implementation of TArrayField */ // constructor TArrayField::TArrayField(TItemFieldTypes aLeafFieldType, GZones *aGZonesP) { fLeafFieldType=aLeafFieldType; fGZonesP = aGZonesP; // field for index==0 always exists fFirstField = newItemField(fLeafFieldType,fGZonesP,false); } // TArrayField::TArrayField // destructor TArrayField::~TArrayField() { // make sure leaf fields (except idx==0) are gone unAssign(); // and kill firstfield delete fFirstField; } // TArrayField::~TArrayField bool TArrayField::elementsBasedOn(TItemFieldTypes aFieldType) const { return fFirstField->isBasedOn(aFieldType); } // TArrayField::elementsBasedOn #ifdef SYDEBUG // show field contents as string for debug output size_t TArrayField::StringObjFieldAppend(string &s, uInt16) { if (!isAssigned()) return inherited::StringObjFieldAppend(s,0); // let ancestor show StringObjAppendPrintf(s,"",(long int)(arraySize())); return 0; } // TArrayField::StringObjFieldAppend #endif // get field from array (creates new if index is larger than current array size) TItemField *TArrayField::getArrayField(sInt16 aArrIdx, bool aExistingOnly) { TItemField *fldP = NULL; // check index, negative index means array field itself if (aArrIdx<0) return this; // check if we have that field already if (aArrIdxgetDataCRC(crc); } return crc; } // TArrayField::getDataCRC #endif // clear all leaf fields void TArrayField::unAssign(void) { for (sInt16 idx=0; idxunAssign(); // first is always kept, it is the fFirstField, so only unassign to remove content else delete fArray[idx]; fArray[idx]=NULL; } } // clear list now fArray.clear(); // clear flag as well that could be set in case of an explicitly assigned empty array fAssigned = false; } // TArrayField::unAssign // assign TItemField& TArrayField::operator=(TItemField &aItemField) { // assignment of empty (could be EMPTY or UNASSIGNED) must be handled by base class if (aItemField.isEmpty()) return TItemField::operator=(aItemField); // handle array-to-array assignments if (aItemField.isArray()) { // delete my current contents unAssign(); // copy leaf fields from other field for (sInt16 idx=0; idxgetArrayField(idx)); } } else { // non-array (non-empty) assigned to array: just assign value to first element unAssign(); *(getArrayField(0)) = aItemField; } return *this; } // TArrayField::operator= // append values (only assigned ones) // - if other field is an array, too, all elements of other array // will be appended at end of this array. // - if other field is a scalar, it's value will be appended to // the array. void TArrayField::append(TItemField &aItemField) { if (aItemField.isArray()) { // append elements of another array to this array for (sInt16 idx=0; idxsetAsString(aString,aMaxChars); } // TArrayField::appendString // contains for arrays means "contains in any of the elements" // (if aItemField is an array as well, this means that every element must be // contained somewhere in my own array) bool TArrayField::contains(TItemField &aItemField, bool aCaseInsensitive) { bool contained = false; if (aItemField.isArray()) { contained=true; // array: all array elements must be contained in at least one of my elements for (sInt16 idx=0; idx not contained contained = false; break; } } } else { // leaf element: must be contained in at least one of my elements contained = false; for (sInt16 idx=0; idxcontains(aItemField,aCaseInsensitive)) { // the value of aItemField is contained in one of my elements -> contained contained = true; break; } } } return contained; } // TItemField::contains // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not comparable at all or not equal and no ordering known // Note: array fields are only comparable with other array fields sInt16 TArrayField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { if (!aItemField.isArray()) return SYSYNC_NOT_COMPARABLE; // get sizes of arrays sInt16 mysz = arraySize(); sInt16 othersz = aItemField.arraySize(); sInt16 commonsz = mysz>othersz ? othersz : mysz; // compare common array elements for (sInt16 idx=0; idxcompareWith(*(aItemField.getArrayField(idx)), aCaseInsensitive); if (res!=0) return res; // all non-equal return } // all compared fields are equal if (mysz==othersz) return 0; // same size : equal // Sizes differ, but that only matters if the extra entries are // actually assigned. Without that special case, we end up // with the situation where parsing, encoding and parsing // again leads to different fields: // - EMAIL;TYPE=OTHER:foo -> EMAIL_FLAGS 1 entry "unassigned" // - unassigned -> EMAIL:foo // - EMAIL:foo -> EMAIL_FLAGS 0 entry // - EMAIL_FLAGS 1 entry "unassigned" > EMAIL_FLAGS 0 entry TItemField &largerField = mysz < othersz ? aItemField : *this; sInt16 minsz, maxsz; sInt16 res; // larger array is greater if (mysz < othersz) { minsz = mysz; maxsz = othersz; res = -1; } else { minsz = othersz; maxsz = mysz; res = 1; } for (sInt16 idx=minsz; idxisAssigned()) // found real difference return res; } // larger array contains only extra unassigned entries, ignore them return 0; } // TArrayField::compareWith /* end of TArrayField implementation */ #endif /* * Implementation of TStringField */ TStringField::TStringField() { #ifdef STREAMFIELD_SUPPORT fBlobProxyP=NULL; #endif } // TStringField::TStringField TStringField::~TStringField() { #ifdef STREAMFIELD_SUPPORT // remove proxy if any TBlobProxy::unlink(fBlobProxyP); #endif } // TStringField::~TStringField #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) // changelog support: calculate CRC over contents uInt16 TStringField::getDataCRC(uInt16 crc) { // CRC over characters in the string return sysync_crc16_block(getCStr(),getStringSize(),crc); } // TStringField::getDataCRC #endif // assignment TItemField& TStringField::operator=(TItemField &aItemField) { DELETEPROXY; // forget old value and old proxy as well // handle myself only if other is string field as well if (aItemField.isBasedOn(fty_string)) { // copy fields 1:1 const TStringField *sfP = static_cast(&aItemField); fString=sfP->fString; fAssigned=sfP->fAssigned; #ifdef STREAMFIELD_SUPPORT fBlobProxyP=sfP->fBlobProxyP; // copy proxy as well if (fBlobProxyP) fBlobProxyP->link(); // link again, now both fields use the proxy #endif } else TItemField::operator=(aItemField); // generic cross-type assignment (via string) return *this; } // TStringField::operator= // get size of string size_t TStringField::getStringSize(void) { #ifdef STREAMFIELD_SUPPORT return getStreamSize(); #else return fString.size(); #endif } // TStringField::getStringSize // normalized string is contents without leading or trailing control chars or spaces void TStringField::getAsNormalizedString(string &aString) { size_t nsiz = getStringSize(); // we need the actual string to do this PULLFROMPROXY; // find first non-control or non-WSP char size_t start = 0; while (start0 && ((uInt8)fString[nsiz-1])<=' ') nsiz--; // take string without any leading or trailing white space or other control chars aString.assign(fString,start,nsiz-start); } // TStringField::getAsNormalizedString #ifdef SYDEBUG // show field contents as string for debug output size_t TStringField::StringObjFieldAppend(string &s, uInt16 aMaxStrLen) { size_t n = 0; // empty or unassigned is handled by base class if (isEmpty()) { return inherited::StringObjFieldAppend(s,aMaxStrLen); } // with proxy installed, do not pull the string if (PROXYINSTALLED) { s+=""; n=0; // unknown size at this time } else { // no proxy installed s+='"'; // - check if display length is sufficient size_t i; n = getStringSize(); if (aMaxStrLen==0 || n<=10 || n<=size_t(aMaxStrLen-2)) { // strings below 11 chars are always shown in full s.append(fString); } else { i = (aMaxStrLen-5)/2; // half of the size that can be displayed s.append(fString,0,i); s.append("..."); s.append(fString,n-i,i); } s+='"'; } // return actual string size (not shortened one!) return n; } // TStringField::StringObjFieldAppend #endif #ifdef STREAMFIELD_SUPPORT // set blob loader proxy (ownership is passed to field) void TStringField::setBlobProxy(TBlobProxy *aBlobProxyP) { if (fBlobProxyP==aBlobProxyP) return; // same proxy, just ignore // unlink previous proxy, if any TBlobProxy::unlink(fBlobProxyP); // assign new proxy fBlobProxyP=aBlobProxyP; // assigning a proxy means that the field is now assigned fAssigned=true; } // TStringField::setBlobProxy // pull entire string from proxy and forget proxy void TStringField::pullFromProxy(void) { if (fBlobProxyP) { const size_t bufsiz=4096; cAppCharP bufP = new char[bufsiz]; resetStream(); size_t by; SYSYNC_TRY { do { by=fBlobProxyP->readBlobStream(this, fStreamPos, (void *)bufP, bufsiz); fString.append(bufP,by); } while (by==bufsiz); } SYSYNC_CATCH(exception &e) // avoid crashing session if proxy pull fails fString="Server error while getting data from proxy object: "; fString+=e.what(); SYSYNC_ENDCATCH delete bufP; // proxy is no longer needed TBlobProxy::unlink(fBlobProxyP); } } // TStringField::pullFromProxy // return size of stream size_t TStringField::getStreamSize(void) { if (fBlobProxyP) SYSYNC_TRY { return fBlobProxyP->getBlobSize(this); // return size of entire blob } SYSYNC_CATCH(exception &e) return 0; // cannot return actual size SYSYNC_ENDCATCH else return fString.size(); // just return size of already stored string } // TStringField::getStreamSize // read as stream size_t TStringField::readStream(void *aBuffer, size_t aMaxBytes) { if (fBlobProxyP) { SYSYNC_TRY { // let proxy handle this return fBlobProxyP->readBlobStream(this, fStreamPos, aBuffer, aMaxBytes); } SYSYNC_CATCH(...) // do not return anything return 0; // do not return anything SYSYNC_ENDCATCH } else { // read from string itself size_t sz=fString.size(); if (fStreamPos>sz) fStreamPos=sz; if (fStreamPos+aMaxBytes > sz) aMaxBytes=sz-fStreamPos; if (aMaxBytes>0) { // copy memory memcpy(aBuffer,fString.c_str()+fStreamPos,aMaxBytes); } // return number of chars actually read fStreamPos+=aMaxBytes; return aMaxBytes; } } // TStringField::readStream // write as stream size_t TStringField::writeStream(void *aBuffer, size_t aNumBytes) { if (aNumBytes==0) return 0; if (fStreamPos>fString.size()) fStreamPos=fString.size(); fString.resize(fStreamPos); fString.append((cAppCharP)aBuffer,aNumBytes); fStreamPos+=aNumBytes; return aNumBytes; } // TStringField::writeStream #endif // set as string, max number of chars to assign = aLen void TStringField::setAsString(cAppCharP aString, size_t aLen) { DELETEPROXY; // forget old value and old proxy as well if (!aString) fString.erase(); else fString.assign(aString,aLen); stringWasAssigned(); } // TStringField::setAsString // append to string void TStringField::appendString(cAppCharP aString, size_t aMaxChars) { PULLFROMPROXY; // make sure we have all chars if (aString) { fString.append(aString,aMaxChars); } stringWasAssigned(); } // TStringField::appendString // merge field contents into this field bool TStringField::merge(TItemField &aItemField, const char aSep) { bool mergedsomething=false; if (aItemField.isBasedOn(fty_string)) { TStringField *sfP = static_cast(&aItemField); #ifdef STREAMFIELD_SUPPORT pullFromProxy(); // make sure we have all chars sfP->pullFromProxy(); // make sure we have all chars #endif if (aSep) { // take each aSep separated part of source (aItemField), and if it is not // yet part of target (this), then add it string::size_type j,i=0; string part; do { // extract part from source j=sfP->fString.find(aSep,i); if (j==string::npos) part.assign(sfP->fString,i,sfP->fString.size()-i); else part.assign(sfP->fString,i,j-i); // see if it is contained in target already if (!part.empty() && fString.find(part)==string::npos) { // not contained, add if (!fString.empty()) fString+=aSep; inherited::appendString(part); mergedsomething=true; } // check next part i=j+1; // char after last separator } while (j!=string::npos); } else { // no intelligent separator based merge, just append if not equal if (sfP->fString != fString) { inherited::appendString(sfP->fString); mergedsomething=true; } } } return mergedsomething; } // TStringField::merge // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. // Note: ordering may NOT be age relevant; it just means that an ordering // for this field type exists. // Note: Both fields must be assigned. NO TEST IS DONE HERE! sInt16 TStringField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { int result; PULLFROMPROXY; if (aItemField.isBasedOn(fty_string)) { TStringField *sfP = static_cast(&aItemField); #ifdef STREAMFIELD_SUPPORT sfP->pullFromProxy(); // make sure we have all chars #endif // direct compare possible, return strcmp if (aCaseInsensitive) result=strucmp(fString.c_str(),sfP->fString.c_str()); else result=fString.compare(sfP->fString); } else { // convert other field to string string s; aItemField.getAsString(s); if (aCaseInsensitive) result=strucmp(fString.c_str(),s.c_str()); else result=fString.compare(s); } return result >0 ? 1 : (result<0 ? -1 : 0); } // TStringField::compareWith // check if specified field is shortened version of this one bool TStringField::isShortVers(TItemField &aItemField, sInt32 aOthersMax) { if (!aItemField.isBasedOn(fty_string)) return false; // different types TStringField *sfP = static_cast(&aItemField); #ifdef STREAMFIELD_SUPPORT pullFromProxy(); // make sure we have all chars sfP->pullFromProxy(); // make sure we have all chars #endif // same type // - if other field is empty, it does not count as a shortened version in any case if (sfP->isEmpty()) return false; // - show if other field is shortened version of this one return ( aOthersMax!=FIELD_OPT_MAXSIZE_NONE && // other field is limited (if not, cannot be short version) (aOthersMax==FIELD_OPT_MAXSIZE_UNKNOWN || uInt32(aOthersMax)==sfP->getStringSize()) && // size is unknown or other value is max size findInString(sfP->fString.c_str())==0 // other value is contained at beginning of this value ); } // TStringField::isShortVers // - check if String is contained in value and returns position sInt16 TStringField::findInString(cAppCharP aString, bool aCaseInsensitive) { PULLFROMPROXY; if (aString==NULL || *aString==0) return fString.empty() ? 0 : -1; // if I am empty myself,treat empty string as contained at beginning // no empty reference string if (!aCaseInsensitive) { return fString.find(aString); } else { return strupos(fString.c_str(),aString,fString.size()); } }; /* end of TStringField implementation */ /* * Implementation of TBlobField */ TBlobField::TBlobField() { // nothing known about contents yet fHasEncoding = enc_none; fWantsEncoding = enc_none; fCharset = chs_utf8; } // TBlobField::TBlobField TBlobField::~TBlobField() { } // TBlobField::~TBlobField // assignment TItemField& TBlobField::operator=(TItemField &aItemField) { DELETEPROXY; // forget old value and old proxy as well // assignment of empty (could be EMPTY or UNASSIGNED) must be handled by base class if (aItemField.isEmpty()) return TItemField::operator=(aItemField); // handle non-empty myself if other is based on string (blob is just a enhanced string) if (aItemField.isBasedOn(fty_string)) { // assign string portions TStringField::operator=(aItemField); if(aItemField.isBasedOn(fty_blob)) { // other is a blob, copy blob specific options const TBlobField *bfP = static_cast(&aItemField); fHasEncoding=bfP->fHasEncoding; fWantsEncoding=bfP->fWantsEncoding; fCharset=bfP->fCharset; } else { // reset blob options to default for string content fHasEncoding = enc_none; fWantsEncoding = enc_none; fCharset = chs_utf8; } } else TItemField::operator=(aItemField); // generic cross-type assignment (via string) return *this; } // TBlobField::operator= #ifdef SYDEBUG // debug support size_t TBlobField::StringObjFieldAppend(string &s, uInt16 aMaxStrLen) { // empty or unassigned is handled by base class if (isEmpty()) { return inherited::StringObjFieldAppend(s, aMaxStrLen); } // avoid pulling a proxy for debug if (!PROXYINSTALLED) { appendToString(s); // show standard string which is pseudo-content return getStringSize(); // return actual size of BLOB } else return inherited::StringObjFieldAppend(s, aMaxStrLen); // with proxy installed, base class will show that } // TBlobField::StringObjFieldAppend #endif // SYDEBUG /* end of TBlobField implementation */ /* * Implementation of TTelephoneField */ TTelephoneField::TTelephoneField() { } // TTelephoneField::TTelephoneField TTelephoneField::~TTelephoneField() { } // TTelephoneField::~TTelephoneField void TTelephoneField::getAsNormalizedString(string &aString) { cAppCharP p = getCStr(); char c; aString.erase(); // only returns alphanum and +,*,#, rest is filtered out while ((c=*p++)!=0) { if (isalnum(c) || c=='+' || c=='#' || c=='*') aString+=c; } } // TTelephoneField::getAsNormalizedString // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. // Note: ordering may NOT be age relevant; it just means that an ordering // for this field type exists. // Note: Both fields must be assigned. NO TEST IS DONE HERE! sInt16 TTelephoneField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { if (!aItemField.isBasedOn(fty_telephone)) { // if other field is not telephone, try normal string comparison return TStringField::compareWith(aItemField, aCaseInsensitive); } // compare possible, return strcmp of normalized numbers TTelephoneField *tfP = static_cast(&aItemField); string s1,s2; getAsNormalizedString(s1); tfP->getAsNormalizedString(s2); if (s1==s2) return 0; // equal else return SYSYNC_NOT_COMPARABLE; // not equal, ordering makes no sense for tel numbers } // TTelephoneField::compareWith /* end of TTelephoneField implementation */ /* * Implementation of TTelephoneField */ TMultilineField::TMultilineField() { } // TMultilineField::TMultilineField TMultilineField::~TMultilineField() { } // TMultilineField::~TMultilineField // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. // Note: ordering may NOT be age relevant; it just means that an ordering // for this field type exists. // Note: Both fields must be assigned. NO TEST IS DONE HERE! sInt16 TMultilineField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { if (!aItemField.isBasedOn(fty_multiline)) { // if other field is not multiline, try normal string comparison return TStringField::compareWith(aItemField); } // compare possible, return strcmp of normalized texts TMultilineField *mfP = static_cast(&aItemField); string s1,s2; getAsNormalizedString(s1); mfP->getAsNormalizedString(s2); // compare sInt8 result; if (aCaseInsensitive) result=strucmp(s1.c_str(),s2.c_str()); else result=strcmp(s1.c_str(),s2.c_str()); return result >0 ? 1 : (result<0 ? -1 : 0); } // TMultilineField::compareWith /* end of TMultilineField implementation */ /* * Implementation of TURLField */ TURLField::TURLField() { } // TURLField::TURLField TURLField::~TURLField() { } // TURLField::~TURLField void TURLField::stringWasAssigned(void) { // post-process string that was just assigned string proto; if (!fString.empty()) { // make sure we have a URL with protocol splitURL(fString.c_str() ,&proto, NULL, NULL, NULL, NULL, NULL, NULL); if (proto.empty()) { // no protocol set, but string not empty --> assume http fString.insert(0, "http://"); } } inherited::stringWasAssigned(); } // TURLField::stringWasAssigned /* end of TURLField implementation */ /* * Implementation of TTimestampField */ TTimestampField::TTimestampField(GZones *aGZonesP) { fGZonesP = aGZonesP; fTimestamp=0; fTimecontext=TCTX_UNKNOWN; } // TTimestampField::TTimestampField TTimestampField::~TTimestampField() { } // TTimestampField::~TTimestampField #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) // changelog support: calculate CRC over contents uInt16 TTimestampField::getDataCRC(uInt16 crc) { // calculate CRC such that only a effective change in the time zone will cause a // CRC change: TCTX_SYSTEM must be converted to UTC as changing the system time zone // should not re-sync the entire calendar lineartime_t crcts = fTimestamp; timecontext_t crcctx = fTimecontext; if (TCTX_IS_SYSTEM(crcctx)) { if (TzConvertTimestamp(crcts,crcctx,TCTX_UTC,fGZonesP)) crcctx=TCTX_UTC; // use UTC representation for CRC (= same as in 3.0) } // try to avoid re-sync when upgrading from 3.0 to 3.1 if (TCTX_IS_UTC(crcctx)) crcctx=0; // this is what we had in 3.0 for non-floating timestamps // CRC over timestamp itself and zone offset crc=sysync_crc16_block(&crcts,sizeof(crcts),crc); return sysync_crc16_block(&crcctx,sizeof(crcctx),crc); } // TTimestampField::getDataCRC #endif // assignment TItemField& TTimestampField::operator=(TItemField &aItemField) { // assignment of empty (could be EMPTY or UNASSIGNED) must be handled by base class if (aItemField.isEmpty()) return TItemField::operator=(aItemField); // handle non-empty myself if (aItemField.isBasedOn(fty_timestamp)) { const TTimestampField *sfP = static_cast(&aItemField); fTimestamp=sfP->fTimestamp; fTimecontext=sfP->fTimecontext; fAssigned=sfP->fAssigned; } else if (aItemField.getCalcType()==fty_integer) { setAsInteger(aItemField.getAsInteger()); } else TItemField::operator=(aItemField); // generic cross-type assignment (via string) return *this; } // TTimestampField::operator= // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. // Note: ordering may NOT be age relevant; it just means that an ordering // for this field type exists. // Note: Both fields must be assigned. NO TEST IS DONE HERE! sInt16 TTimestampField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { sInt16 res; lineartime_t cmpval; timecontext_t cmpcontext; // determine value to compare with if (aItemField.isBasedOn(fty_timestamp)) { cmpval=static_cast(&aItemField)->fTimestamp; cmpcontext=static_cast(&aItemField)->fTimecontext; } else { // not same type if (aItemField.getCalcType()==fty_integer) { // use second argument as lineartime units number cmpval=aItemField.getAsInteger(); cmpcontext=fTimecontext; // treat number as timestamp value in my own context } else { // use second argument as ISO8601 string string s; aItemField.getAsString(s); ISO8601StrToTimestamp(s.c_str(), cmpval, cmpcontext); if (TCTX_IS_UNKNOWN(cmpcontext)) cmpcontext=fTimecontext; // treat unqualified ISO timestamp in my own context } } // convert compare value into my own context (if not already so) if (!TzConvertTimestamp(cmpval,cmpcontext,fTimecontext,fGZonesP)) return SYSYNC_NOT_COMPARABLE; // contexts are not compatible to compare // compare possible, return strcmp-type result res=fTimestamp==cmpval ? 0 : (fTimestamp>cmpval ? 1 : -1); if (res!=0) { // greater/less-type result is valid only if both sides are not empty if (fTimestamp==0) return SYSYNC_NOT_COMPARABLE; // empty value, cannot compare if (cmpval==0) return SYSYNC_NOT_COMPARABLE; // empty value, cannot compare } return res; } // TTimestampField::compareWith #ifdef SYDEBUG // debug support size_t TTimestampField::StringObjFieldAppend(string &s, uInt16 aMaxStrLen) { // empty or unassigned is handled by base class if (isEmpty()) { return inherited::StringObjFieldAppend(s, aMaxStrLen); } string str; timecontext_t tctx; TimestampToISO8601Str(str,fTimestamp,fTimecontext,true,true); s.append(str); tctx=fTimecontext; if (TCTX_IS_TZ(tctx)) { // symbolic time zone not represented in ISO8601, show extra s.append(" ("); if (TCTX_IS_UNKNOWN(tctx)) { s.append("floating"); } else { if (TCTX_IS_SYSTEM(tctx)) { // is the system zone s.append("System "); // resolve from meta to symbolic zone TzResolveMetaContext(tctx,fGZonesP); } if (!TCTX_IS_BUILTIN(tctx)) { s.append("imported "); } s.append("TZ: "); // show time zone name TimeZoneContextToName(tctx,str,fGZonesP); s.append(str); } s.append(")"); } // size not known return 0; } // TTimestampField::StringObjFieldAppend #endif // SYDEBUG // set timestamp from ISO8601 string void TTimestampField::setAsString(cAppCharP aString) { // - set context if contained in ISO string, otherwise leave it as TCTX_UNKNOWN setAsISO8601(aString, TCTX_UNKNOWN, false); } // TTimestampField::setAsString // get timestamp as ISO8601 string (default representation) void TTimestampField::getAsString(string &aString) { // use default rendering // - show with current context, show UTC with Z but other zones without zone specifier getAsISO8601(aString,TCTX_UNKNOWN,true,false,false,false); } // getAsString /// @brief add a delta time to the timestamp /// @param aDeltaTime[in] : delta time value in lineartime_t units void TTimestampField::addTime(lineartime_t aDeltaTime) { fTimestamp=fTimestamp+aDeltaTime; fAssigned=true; } // TTimestampField::addTime /// @brief get time context /// @return minute offset east of UTC, returns 0 for floating timestamps (and UTC, of course) sInt16 TTimestampField::getMinuteOffset(void) { sInt16 moffs; if (TzResolveToOffset(fTimecontext, moffs, fTimestamp, false, fGZonesP)) return moffs; // found offset else return 0; // no offset (e.g. floating timestamp) } // TTimestampField::getMinuteOffset /// @brief test for floating time (=time not in a specified zone context) /// @return true if context is TCTX_UNKNOWN bool TTimestampField::isFloating(void) { return TCTX_IS_UNKNOWN(fTimecontext); } // TTimestampField::isFloating /// @brief make timestamp floating (i.e. remove time zone info from context) void TTimestampField::makeFloating(void) { // rendering flags from original context, new zone is UNKNOWN (=floating) fTimecontext = TCTX_JOIN_RFLAGS_TZ(fTimecontext, TCTX_UNKNOWN); } // TTimestampField::makeFloating /// @brief test for duration /// @return true if context has TCTX_DURATION rendering flag set bool TTimestampField::isDuration(void) { return TCTX_IS_DURATION(fTimecontext); } // TTimestampField::isDuration /// @brief make timestamp a duration (also implies making it floating) void TTimestampField::makeDuration(void) { // rendering flags from original context, new zone is UNKNOWN (=floating) fTimecontext |= TCTX_DURATION; makeFloating(); } // TTimestampField::makeDuration /// @brief get timestamp converted to a specified time context /// @param aTargetContext[in] : requests output context for timestamp. /// Use TCTX_UNKNOWN to get timestamp as-is. /// If timestamp is floating, it will always be returned as-is /// @param aActualContext[out] : if not NULL, the actual context of the returned value /// will be returned here. This might be another // context than specified with aTargetContext depending on floating/notime status. /// @return timestamp in lineartime lineartime_t TTimestampField::getTimestampAs(timecontext_t aTargetContext, timecontext_t *aActualContext) { // default context is that of the field (will be overwritten if result is moved to another context) if (aActualContext) *aActualContext = fTimecontext; // current field's context // if no time set or TCTX_UNKNOWN specified, just return the timestamp as-is if (fTimestamp==noLinearTime || TCTX_IS_UNKNOWN(aTargetContext)) { return TCTX_IS_DATEONLY(aTargetContext) ? lineartime2dateonlyTime(fTimestamp) : // truncated to date-only fTimestamp; // as-is } // convert to the requested context lineartime_t ts = fTimestamp; if (TCTX_IS_DATEONLY(fTimecontext)) { // is date only, connot convert to another zone, just return date part (and original context) return lineartime2dateonlyTime(ts); } else { // datetime or time if (!TzConvertTimestamp(ts,fTimecontext,aTargetContext,fGZonesP)) { // cannot convert, but we return unconverted timestamp if we can also return the actual context if (aActualContext) return fTimestamp; // return as-is else return noLinearTime; // invalid conversion, can't return a value } } // return target context as actual context if (aActualContext) *aActualContext = aTargetContext; // return timestamp, possibly truncated to date-only or time-only if requested if (TCTX_IS_DATEONLY(aTargetContext)) return lineartime2dateonlyTime(ts); else if (TCTX_IS_TIMEONLY(aTargetContext)) return lineartime2timeonly(ts); else return ts; // date and time } // TTimestampField::getTimestampAs /// @brief get timestamp as ISO8601 string. /// @param aISOString[out] : timestamp in ISO8601 format /// @param aTargetContext[in] : requests output context for timestamp. Use TCTX_UNKNOWN to show timestamp (or dateonly or timeonly) as-is. /// @param aShowWithZ[in] : if set and timezone is UTC, value will be shown with "Z" appended /// @param aShowWithZone[in] : if set and timestamp is not floating, zone offset will be appended in +-xx:xx form /// @param aExtFormat[in] : if set, ISO8601 extended format is used /// @param aWithFracSecs[in] : if set, fractions of seconds will be shown (millisecond resolution) void TTimestampField::getAsISO8601(string &aISOString, timecontext_t aTargetContext, bool aShowWithZ, bool aShowWithZone, bool aExtFormat, bool aWithFracSecs) { // get time in requested context lineartime_t ts = getTimestampAs(aTargetContext); // if target context was set to TCTX_UNKNOWN, this means that we want to use the stored context if (aTargetContext==TCTX_UNKNOWN) // really explicitly TCTX_UNKNOWN without any rendering flags! aTargetContext = fTimecontext; // return empty string if no timestamp or conversion impossible (but show empty duration as such!) if (ts==noLinearTime && !TCTX_IS_DURATION(fTimecontext)) { aISOString.erase(); return; } // check if time zone should be included or not if (!TCTX_IS_UNKNOWN(aTargetContext)) { if ( TCTX_IS_UTC(aTargetContext) ? !aShowWithZ : !aShowWithZone ) { // prevent showing with time zone aTargetContext = TCTX_JOIN_RFLAGS_TZ(aTargetContext,TCTX_UNKNOWN); } } // now convert TimestampToISO8601Str(aISOString, ts, aTargetContext, aExtFormat, aWithFracSecs); } // TTimestampField::getAsISO8601 /// @brief move timestamp to specified context (i.e. convert the timestamp value from current to /// specified context). Floating timestamps cannot and will not be moved. /// @param aNewcontext[in] : context to move timestamp to. /// timestamp will be converted to represent the same point in time in the new context /// @param aSetUnmovables : if set, non-movable timestamps will be just assigned the new context, // that is floating timestamps will be bound to specified context or // non-floating timestamps will be made floating if new context is TCTX_UNKNOWN bool TTimestampField::moveToContext(timecontext_t aNewcontext, bool aSetUnmovables) { bool ok=true; if (isFloating() || fTimestamp==noLinearTime) { // floating and empty timestamp cannot be moved if (aSetUnmovables) { // bind floating timestamp to specified zone fTimecontext = aNewcontext; } else ok=false; // floating/empty timestamps can only be fixed, not moved } else { // timestamp is not floating or empty if (TCTX_IS_UNKNOWN(aNewcontext)) { if (aSetUnmovables) fTimecontext = aNewcontext; // make floating else ok = false; } else { // new context is not floating and old context isn't, either -> convert ok = TzConvertTimestamp(fTimestamp, fTimecontext, aNewcontext, fGZonesP); } } if (ok) fTimecontext = aNewcontext; // we are now in the new context return ok; } // TTimestampField::moveToContext /// @brief set timestamp from ISO8601 string. /// @return true if successful /// @param aISOString[in] : timestamp in ISO8601 basic or extended format, optionally including Z or +xx:xx zone specifier /// @param aDefaultContext[in] : timezone context to use when ISO8601 does not specify a zone context or when aIgnoreZone is true /// @param aIgnoreZone[in] : if set, timezone specification contained in ISO8601 is ignored. Resulting time context will be aDefaultContext (or TCTX_UNKNOWN for date-only) bool TTimestampField::setAsISO8601(cAppCharP aISOString, timecontext_t aDefaultContext, bool aIgnoreZone) { bool ok = ISO8601StrToTimestamp(aISOString, fTimestamp, fTimecontext); if (ok) { fAssigned=true; // if timestamp has unknown zone because it is a date-only or a duration, do NOT assign the default zone! if (aIgnoreZone || (TCTX_IS_UNKNOWN(fTimecontext) && !TCTX_IS_DATEONLY(fTimecontext) && !TCTX_IS_DURATION(fTimecontext))) { // set default context fTimecontext = aDefaultContext; } } else assignEmpty(); // in all cases, this is now assigned (but probably empty if string was not ok) return ok; } // TTimestampField::setAsISO8601 #ifdef EMAIL_FORMAT_SUPPORT static cAppCharP const rfc822_weekdays[7] = { "Sun","Mon","Tue","Wed","Thu","Fri","Sat" }; const size_t rfc822maxMonthLen = 3; static cAppCharP const rfc822_months[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; /// @brief get timestamp as RFC(2)822 style date /// @param aRFC822String[out] : timestamp in RFC(2)822 format /// @param aTargetContext[in] : requests output context for timestamp. Use TCTX_UNKNOWN to show timestamp as-is. /// @param aShowWithZone[in] : if set and timestamp is not floating, zone offset will be shown void TTimestampField::getAsRFC822date(string &aRFC822String, timecontext_t aTargetContext, bool aShowWithZone) { // get time in requested context lineartime_t ts = getTimestampAs(aTargetContext); // if target context was set to TCTX_UNKNOWN, this means that we want to use the stored context if (TCTX_IS_UNKNOWN(aTargetContext)) aTargetContext = fTimecontext; // get elements sInt16 y,mo,d,h,mi,s,ms,w, moffs; lineartime2date(ts,&y,&mo,&d); lineartime2time(ts,&h,&mi,&s,&ms); w = lineartime2weekday(ts); // now print StringObjPrintf( aRFC822String, "%s, %02hd %s %04hd %02hd:%02hd:%02hd", rfc822_weekdays[w], d,rfc822_months[mo-1],y, h,mi,s ); if (aShowWithZone && !TCTX_IS_UNKNOWN(aTargetContext)) { // get offset TzResolveToOffset(aTargetContext, moffs, ts, false, fGZonesP); StringObjAppendPrintf( aRFC822String, " %c%02hd%02hd", moffs>=0 ? '+' : '-', (uInt16)(abs(moffs) / MinsPerHour), (uInt16)(abs(moffs) % MinsPerHour) ); } } // TTimestampField::getAsRFC822date /// @brief set timestamp as RFC(2)822 style date /// @return true if successful /// @param aRFC822String[in] : timestamp in RFC(2)822 format /// @param aDefaultContext[in] : timezone context to use when RFC822 date does not specify a time zone /// @param aIgnoreZone[in] : if set, timezone specification contained in input string is ignored. Resulting time context will be aDefaultContext bool TTimestampField::setAsRFC822date(cAppCharP aRFC822String, timecontext_t aDefaultContext, bool aIgnoreZone) { cAppCharP p; size_t inpSiz = strlen(aRFC822String); cAppCharP eot=aRFC822String+inpSiz; sInt16 minoffs=0; // check for weekday p = (cAppCharP) memchr(aRFC822String,',',inpSiz); if (p) p++; // skip comma else p=aRFC822String; // start at beginning // scan elements char month[rfc822maxMonthLen+1]; sInt16 y,mo,d,h,m,s; s=0; // optional second // scan day while (peot) return false; // string too short p+=StrToShort(p,d,2); // scan month while (peot) return false; // string too short p+=StrToShort(p,y,4); // scan time while (peot) return false; // string too short p+=StrToShort(p,h,2); if (p+3>eot || *p++ !=':') return false; // one for colon, two for minutes p+=StrToShort(p,m,2); if (p+3<=eot && *p==':') { // one for colon, two for minutes // optional second p++; p+=StrToShort(p,s,2); } // convert month for (mo=0; mo<12; mo++) if (strucmp(month,rfc822_months[mo])==0) break; if (mo==12) return false; // bad format mo++; // make month number // make timestamp fTimestamp = date2lineartime(y,mo,d) + time2lineartime(h,m,s,0); // check time zone bool neg=false; while (p=eot) return false; // string too short p++; sInt16 tzh,tzm; // scan timezone if ( p+4<=eot && StrToShort(p,tzh,2)==2 && StrToShort(p+2,tzm,2)==2 ) { p+=4; // set time zone minoffs=((tzh*MinsPerHour)+tzm); if (neg) minoffs = -minoffs; // make zone fTimecontext = TCTX_OFFSCONTEXT(minoffs); aIgnoreZone=false; // zone spec valid } } else if (isalpha(*p)) { // could be time zone name, internal or olson name (if not, ignore zone spec) aIgnoreZone = !TimeZoneNameToContext(p,fTimecontext,fGZonesP,true); } } // if no valid zone, use default if (aIgnoreZone) { // assume default time fTimecontext = aDefaultContext; } return true; } // RFC822dateToTimeStamp #endif // EMAIL_FORMAT_SUPPORT /* end of TTimestampField implementation */ /* * Implementation of TDateField */ TDateField::TDateField(GZones *aGZonesP) : TTimestampField(aGZonesP) { fTimecontext |= TCTX_DATEONLY; } // TDateField::TDateField TDateField::~TDateField() { } // TDateField::~TDateField // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. // Note: ordering may NOT be age relevant; it just means that an ordering // for this field type exists. // Note: Both fields must be assigned. NO TEST IS DONE HERE! sInt16 TDateField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { sInt16 res; // check comparison with non-date if (!aItemField.isBasedOn(fty_timestamp)) return TTimestampField::compareWith(aItemField); // handles all comparisons with other types // date comparison is context independent TTimestampField *sfP = static_cast(&aItemField); // compare possible, return strcmp-type result // - convert to date only lineardate_t a = getTimestampAs(TCTX_UNKNOWN+TCTX_DATEONLY) / linearDateToTimeFactor; lineardate_t b = sfP->getTimestampAs(TCTX_UNKNOWN+TCTX_DATEONLY) / linearDateToTimeFactor; // - compare dates res=a==b ? 0 : (a>b ? 1 : -1); if (res!=0) { // greater/less-type result is valid only if both sides are not empty if ( isEmpty()) return SYSYNC_NOT_COMPARABLE; // empty value, cannot compare if (sfP->isEmpty()) return SYSYNC_NOT_COMPARABLE; // empty value, cannot compare } return res; } // TDateField::compareWith // get date as ISO8601 string (default representation) void TDateField::getAsString(string &aString) { // use default rendering // - show with current context, but always date-only, no Z or zone info inherited::getAsISO8601(aString,TCTX_UNKNOWN+TCTX_DATEONLY,false,false,false,false); } // TDateField::getAsString // set date from ISO8601 string (default interpretation) void TDateField::setAsString(cAppCharP aString) { // default interpretation is floating date // - parse timestamp, ignore timezone if (setAsISO8601(aString, TCTX_UNKNOWN+TCTX_DATEONLY, true)) { // truncate to date-only fTimestamp = lineartime2dateonlyTime(fTimestamp); } // in all cases, this is now assigned (but probably empty) fAssigned=true; } // TDateField::setAsString /* end of TDateField implementation */ /* * Implementation of TIntegerField */ TIntegerField::TIntegerField() { fInteger=0; fEmpty=true; } // TIntegerField::TIntegerField TIntegerField::~TIntegerField() { } // TIntegerField::~TIntegerField #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) // changelog support: calculate CRC over contents uInt16 TIntegerField::getDataCRC(uInt16 crc) { // CRC over integer number return sysync_crc16_block(&fInteger,sizeof(fInteger),crc); } // TIntegerField::getDataCRC #endif // assignment TItemField& TIntegerField::operator=(TItemField &aItemField) { // assignment of empty (could be EMPTY or UNASSIGNED) must be handled by base class if (aItemField.isEmpty()) return TItemField::operator=(aItemField); // handle non-empty myself if (aItemField.isBasedOn(fty_integer)) { const TIntegerField *sfP = static_cast(&aItemField); fInteger=sfP->fInteger; fEmpty=sfP->fEmpty; fAssigned=sfP->fAssigned; } else if (aItemField.getCalcType()==fty_integer) { fInteger=aItemField.getAsInteger(); fEmpty=false; fAssigned=aItemField.isAssigned(); } else TItemField::operator=(aItemField); // generic cross-type assignment (via string) return *this; } // TIntegerField::operator= // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. // Note: ordering may NOT be age relevant; it just means that an ordering // for this field type exists. // Notes: - Both fields must be assigned. NO TEST IS DONE HERE! // - emptyness is not taken into account (empty counts as 0 here) sInt16 TIntegerField::compareWith(TItemField &aItemField, bool aCaseInsensitive) { if (aItemField.getCalcType()!=fty_integer) return TItemField::compareWith(aItemField); // handles generic comparisons fieldinteger_t otherInt = aItemField.getAsInteger(); // compare possible, return strcmp-type result return fInteger==otherInt ? 0 : (fInteger>otherInt ? 1 : -1); } // TIntegerField::compareWith // get integer as integer fieldinteger_t TIntegerField::getAsInteger(void) { return fInteger; } // TIntegerField::getAsInteger // set integer void TIntegerField::setAsInteger(fieldinteger_t aInteger) { fInteger=aInteger; fAssigned=true; fEmpty=false; } // TIntegerField::setAsInteger // set integer from numeric string void TIntegerField::setAsString(cAppCharP aString) { // check for hex bool ok; if (strucmp(aString,"0x",2)==0) { // hex number #ifndef NO64BITINT ok = HexStrToULongLong(aString+2,*((uInt64 *)&fInteger)); #else ok = HexStrToULong(aString+2,*((uInt32 *)&fInteger)); #endif } else { // decimal integer number #ifndef NO64BITINT ok = StrToLongLong(aString,fInteger); #else ok = StrToLong(aString,fInteger); #endif } if (!ok) fInteger=0; // defined value // setting with a non-integer value makes the integer empty (but having integer value 0) fEmpty = !ok; // in all cases, this is now assigned (but probably with the default=0) fAssigned=true; } // TIntegerField::setAsString // get integer as numeric string void TIntegerField::getAsString(string &aString) { if (fEmpty) aString.erase(); else { #ifndef NO64BITINT LONGLONGTOSTR(aString,PRINTF_LLD_ARG(fInteger)); #else StringObjPrintf(aString,"%ld",(sInt32)fInteger); #endif } } // TIntegerField::getAsString /* end of TIntegerField implementation */ // factory function TItemField *newItemField(const TItemFieldTypes aType, GZones *aGZonesP, bool aAsArray) { #ifdef ARRAYFIELD_SUPPORT if (aAsArray) { return new TArrayField(aType,aGZonesP); } else #endif { switch (aType) { case fty_string: return new TStringField; case fty_telephone: return new TTelephoneField; case fty_integer: return new TIntegerField; case fty_timestamp: return new TTimestampField(aGZonesP); case fty_date: return new TDateField(aGZonesP); case fty_url: return new TURLField; case fty_multiline: return new TMultilineField; case fty_blob: return new TBlobField; case fty_none: return new TItemField; // base class, can represent EMPTY and UNASSIGNED default: return NULL; } } } // newItemField #ifdef ENGINEINTERFACE_SUPPORT // TItemFieldKey // ============= // get value's ID (e.g. internal index) sInt32 TItemFieldKey::GetValueID(cAppCharP aName) { // check special suffixes size_t namsz = strlen(aName); sInt32 fldID = 0; // basic if (namsz >= strlen(VALSUFF_TZNAME) && strucmp(aName+namsz-strlen(VALSUFF_TZNAME),VALSUFF_TZNAME)==0) { // time zone name as string requested namsz-=7; fldID += VALID_FLAG_TZNAME; } else if (namsz >= strlen(VALSUFF_TZOFFS) && strucmp(aName+namsz-strlen(VALSUFF_TZOFFS),VALSUFF_TZOFFS)==0) { // time zone offset in minutes namsz-=7; fldID += VALID_FLAG_TZOFFS; } else if (namsz >= strlen(VALSUFF_NORM) && strucmp(aName+namsz-strlen(VALSUFF_NORM),VALSUFF_NORM)==0) { // normalized value namsz-=5; fldID += VALID_FLAG_NORM; } else if (namsz >= strlen(VALSUFF_ARRSZ) && strucmp(aName+namsz-strlen(VALSUFF_ARRSZ),VALSUFF_ARRSZ)==0) { // array size namsz-=10; fldID += VALID_FLAG_ARRSIZ; } else if (namsz >= strlen(VALSUFF_NAME) && strucmp(aName+namsz-strlen(VALSUFF_NAME),VALSUFF_NAME)==0) { // value name namsz-=8; fldID += VALID_FLAG_VALNAME; } else if (namsz >= strlen(VALSUFF_TYPE) && strucmp(aName+namsz-strlen(VALSUFF_TYPE),VALSUFF_TYPE)==0) { // value type namsz-=8; fldID += VALID_FLAG_VALTYPE; } // check if this is only a query for the flags alone if (strucmp(aName,VALNAME_FLAG,namsz)==0) return fldID; // return flags alone // get fid for given name sInt16 fid = getFidFor(aName,namsz); if (fid==VARIDX_UNDEFINED) return KEYVAL_ID_UNKNOWN; // unknown field else return fldID + (sInt32)((uInt16)fid); // return FID in lo word, flags in highword } // TItemFieldKey::GetValueID // get value's native type uInt16 TItemFieldKey::GetValueType(sInt32 aID) { // fid is lower 16 bits of aID (and gets negative if bit15 of aID is set) sInt16 fid; *((uInt16 *)(&fid)) = aID & VALID_MASK_FID; // assign without sign extension // now get base field TItemField *baseFieldP = getBaseFieldFromFid(fid); if (baseFieldP) { // field exists // - check special queries if (aID & VALID_FLAG_ARRSIZ) return VALTYPE_INT16; // size is a 16-bit integer, regardless of field type else if (aID & VALID_FLAG_VALNAME) return VALTYPE_TEXT; // name of the value is text else if (aID & VALID_FLAG_VALTYPE) return VALTYPE_INT16; // VALTYPE_XXX are 16-bit integers else if (aID & VALID_FLAG_NORM) return VALTYPE_TEXT; // normalized value is text // - otherwise, valtype depends on field type TItemFieldTypes fty = baseFieldP->getElementType(); // return native type switch (fty) { case fty_none: return VALTYPE_UNKNOWN; case fty_blob: return VALTYPE_BUF; case fty_string: case fty_multiline: case fty_telephone: case fty_url: return VALTYPE_TEXT; case fty_integer: return VALTYPE_INT64; case fty_timestamp: case fty_date: if (aID & VALID_FLAG_TZNAME) return VALTYPE_TEXT; // time zone name is a text else if (aID & VALID_FLAG_TZOFFS) return VALTYPE_INT16; // minute offset is 16-bit integer else return VALTYPE_TIME64; // time values case numFieldTypes: // invalid break; } // switch } // no field, no type return VALTYPE_UNKNOWN; } // TItemFieldKey::GetValueType // helper for getting a leaf field pointer (interpretation of aRepOffset depends on array field or not) TItemField *TItemFieldKey::getFieldFromFid(sInt16 aFid, sInt16 aRepOffset, bool aExistingOnly) { TItemField *fieldP=NULL; // get field (or base field) #ifdef ARRAYFIELD_SUPPORT fieldP = getBaseFieldFromFid(aFid); if (!fieldP) return NULL; // no field if (fieldP->isArray()) { // use aRepOffset as array index fieldP = fieldP->getArrayField(aRepOffset,aExistingOnly); } else #endif { // use aRepOffset as fid offset #ifdef SCRIPT_SUPPORT if (aFid<0) aRepOffset=0; // locals are never offset #endif fieldP = getBaseFieldFromFid(aFid+aRepOffset); } return fieldP; } // TItemFieldKey::getFieldFromFid // get value TSyError TItemFieldKey::GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { string sval; TItemField *fieldP; // fid is lower 16 bits of aID (and gets negative if bit15 of aID is set) sInt16 fid; *((uInt16 *)(&fid)) = aID & VALID_MASK_FID; // assign without sign extension // check for special queries not actually accessing a leaf field if (aID & VALID_FLAG_ARRSIZ) { // return array size (returns DB_NotFound for non-arrays) fieldP = getBaseFieldFromFid(fid); // if not an array, return DB_NotFound if (!fieldP || !fieldP->isArray()) return DB_NotFound; // there is no array size for non-arrays // return size aValSize=sizeof(sInt16); // value if enough room if (aBufSize>=aValSize) *((sInt16 *)aBuffer)=fieldP->arraySize(); // ok return LOCERR_OK; } else if (aID & VALID_FLAG_VALNAME) { // only return name of field if (!getFieldNameFromFid(fid,sval)) return DB_NotFound; if (aBufSize>=sval.size()) memcpy(aBuffer,sval.c_str(),sval.size()); // copy name data aValSize=sval.size(); return LOCERR_OK; } else if (aID & VALID_FLAG_VALTYPE) { // only return VALTYPE of field uInt16 valtype = GetValueType(aID & ~VALID_FLAG_VALTYPE); aValSize = sizeof(valtype); if (aBufSize>=aValSize) memcpy(aBuffer,&valtype,aValSize); // copy valtype uInt16 return LOCERR_OK; } // Get actual data - we need the leaf field (unless we pass <0 for aArrayIndex, which accesses the array base field) fieldP = getFieldFromFid(fid, aArrayIndex, true); // existing array elements only if (!fieldP) { // array instance does not exist return LOCERR_OUTOFRANGE; } else { // leaf field (or explicitly requested array base field) exists if (!fieldP->isAssigned()) return DB_NotFound; // no content found because none assigned if (fieldP->isEmpty()) return DB_NoContent; // empty if (fieldP->isArray()) return LOCERR_OUTOFRANGE; // no real access for array base field possible - if we get here it means non-empty // assigned and not empty, return actual value TItemFieldTypes fty = fieldP->getType(); appPointer valPtr = NULL; size_t sz; fieldinteger_t intVal; lineartime_t ts; timecontext_t tctx; sInt16 minOffs; TTimestampField *tsFldP; if (aID & VALID_FLAG_NORM) { // for all field types: get normalized string value fieldP->getAsNormalizedString(sval); aValSize = sval.size(); valPtr = (appPointer)sval.c_str(); } else { switch (fty) { case fty_timestamp: case fty_date: tsFldP = static_cast(fieldP); if (aID & VALID_FLAG_TZNAME) { // time zone name is a text sval.erase(); // no zone tctx = tsFldP->getTimeContext(); if (!TCTX_IS_UNKNOWN(tctx) || TCTX_IS_DURATION(tctx) || TCTX_IS_DATEONLY(tctx)) { // has a zone (or is duration/dateonly), get name TimeZoneContextToName(tctx, sval, tsFldP->getGZones()); } aValSize = sval.size(); valPtr = (appPointer)sval.c_str(); } else if (aID & VALID_FLAG_TZOFFS) { // minute offset as 16-bit integer aValSize = sizeof(sInt16); if ( tsFldP->isFloating() || !TzResolveToOffset(tsFldP->getTimeContext(), minOffs, tsFldP->getTimestampAs(TCTX_UNKNOWN), false, tsFldP->getGZones()) ) return DB_NotFound; // cannot get minute offset or floating timestamp -> no result // return minute offset valPtr = &minOffs; } else { // return timestamp itself (either as-is or in UTC, if TMODE_FLAG_FLOATING not set) aValSize = sizeof(lineartime_t); if (fTimeMode & TMODE_FLAG_FLOATING) ts = tsFldP->getTimestampAs(TCTX_UNKNOWN); // as-is else ts = tsFldP->getTimestampAs(TCTX_UTC,&tctx); // always as UTC, will be converted to SYSTEM possibly by caller // return timestamp valPtr = &ts; } break; case fty_integer: aValSize = sizeof(fieldinteger_t); intVal = fieldP->getAsInteger(); valPtr = &intVal; break; case fty_none: aValSize = 0; break; case fty_blob: static_cast(fieldP)->getBlobDataPtrSz(valPtr,sz); aValSize = sz; break; case fty_string: case fty_multiline: case fty_telephone: case fty_url: aValSize = fieldP->getStringSize(); valPtr = (appPointer)static_cast(fieldP)->getCStr(); break; case numFieldTypes: // invalid break; } // switch } // now we have valid aValSize and valPtr if (aBuffer && aBufSize>=aValSize) { // copy value data memcpy(aBuffer,valPtr,aValSize); } } // ok return LOCERR_OK; } // TItemFieldKey::GetValueInternal // set value TSyError TItemFieldKey::SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ) { TItemField *fieldP; // fid is lower 16 bits of aID (and gets negative if bit15 of aID is set) sInt16 fid; *((uInt16 *)(&fid)) = aID & VALID_MASK_FID; // assign without sign extension // check for special array size query if (aID & VALID_FLAG_ARRSIZ) { // array size is not writable return DB_NotAllowed; } // now get leaf field fieldP = getFieldFromFid(fid, aArrayIndex, false); // create element if needed if (!fieldP) { // should not happen return DB_Error; } else { // leaf field exists, set value fWritten = true; TItemFieldTypes fty = fieldP->getType(); fieldinteger_t intVal; lineartime_t ts; timecontext_t tctx; sInt16 minOffs; string sval; TTimestampField *tsFldP; // treat setting normalized value like setting as string if (aID & VALID_FLAG_NORM) fty = fty_string; // treat like string // handle NULL (empty) case if (aBuffer==0) { // buffer==NULL means NULL value fieldP->assignEmpty(); return LOCERR_OK; } // now handle according to type switch (fty) { case fty_timestamp: case fty_date: tsFldP = static_cast(fieldP); if (aID & VALID_FLAG_TZNAME) { // set time zone by name sval.assign((cAppCharP)aBuffer,aValSize); tctx = TCTX_UNKNOWN; if (!sval.empty()) { // convert (internal or olson names allowed) if (!TimeZoneNameToContext(sval.c_str(), tctx, tsFldP->getGZones(), true)) return LOCERR_BADPARAM; // bad timezone name } // set context tsFldP->setTimeContext(tctx); } else if (aID & VALID_FLAG_TZOFFS) { // minute offset as 16-bit integer minOffs = *((sInt16 *)aBuffer); // set context tsFldP->setTimeContext(TCTX_MINOFFSET(minOffs)); } else { // set timestamp itself (either as-is or in UTC, if TMODE_FLAG_FLOATING not set) ts = *((lineartime_t *)aBuffer); if ((fTimeMode & TMODE_FLAG_FLOATING)==0) tsFldP->setTimestampAndContext(ts,TCTX_UTC); // incoming timestamp is UTC, set it as such else tsFldP->setTimestamp(ts); // just set timestamp as-is and don't touch rest } break; case fty_integer: intVal = *((fieldinteger_t *)aBuffer); fieldP->setAsInteger(intVal); break; case fty_blob: static_cast(fieldP)->setBlobDataPtrSz((void *)aBuffer,aValSize); break; case fty_string: case fty_multiline: case fty_telephone: case fty_url: fieldP->setAsString((cAppCharP)aBuffer,aValSize); break; case fty_none: case numFieldTypes: // invalid break; } // switch } // ok return LOCERR_OK; } // TItemFieldKey::SetValueInternal #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/itemfield.h0000755000373300037200000007647712424517753025010 0ustar00nightlyallusers00000000000000/* * File: itemfield.h * * Author: Lukas Zeller (luz@plan44.ch) * * TItemField * Abstract class, holds a single field value * TStringField, TIntegerField, TTelephoneField, TTimeStampField etc. * Implementations of field types * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-08 : luz : created * */ #ifndef ItemField_H #define ItemField_H // includes #include "sysync_globs.h" #include "sysync_utils.h" #include "engineinterface.h" #include #ifdef ARRAYFIELD_SUPPORT #include #endif namespace sysync { extern cAppCharP const ItemFieldTypeNames[numFieldTypes]; extern const TPropDataTypes devInfPropTypes[numFieldTypes]; #ifndef NO64BITINT typedef sInt64 fieldinteger_t; #define StrToFieldinteger(s,i) StrToLongLong(s,i) #else typedef sInt32 fieldinteger_t; #define StrToFieldinteger(s,i) StrToLong(s,i) #endif // our own implementation for dynamic casts for Items without needing RTTI #define ITEMFIELD_DYNAMIC_CAST_PTR(ty,tyid,src) (src->isBasedOn(tyid) ? static_cast(src) : NULL) // basically abstract class, but can be used to represent EMPTY and ASSIGNED values class TItemField { public: TItemField(); virtual ~TItemField(); #ifdef ARRAYFIELD_SUPPORT // check array virtual bool isArray(void) const { return false; } virtual TItemField *getArrayField(sInt16 aArrIdx, bool /* aExistingOnly */=false) { return aArrIdx==0 ? this : NULL; }; virtual sInt16 arraySize(void) const { return 1; } // non-array has one element virtual TItemFieldTypes getElementType(void) const { return getType(); } // non array element is same as base type #else // non-virtual versions if we have no array fields at all bool isArray(void) const { return false; } TItemField *getArrayField(sInt16 aArrIdx, bool aExistingOnly=false) { return aArrIdx==0 ? this : NULL; }; sInt16 arraySize(void) const { return 1; } // non-array has one element TItemFieldTypes getElementType(void) const { return getType(); } #endif // changelog support #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) virtual uInt16 getDataCRC(uInt16 crc=0) { return crc; }; // base class is always empty #endif // access to type virtual TItemFieldTypes getType(void) const { return fty_none; } // no real type virtual TItemFieldTypes getCalcType(void) const { return getType(); }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_none; }; virtual bool elementsBasedOn(TItemFieldTypes aFieldType) const { return isBasedOn(aFieldType); }; // dependency on a local ID virtual void setParentLocalID(cAppCharP /* aParentLocalID */) { /* nop */ }; // access to field contents #ifdef STREAMFIELD_SUPPORT // - stream interface (default implementation accesses string representation of field) virtual void resetStream(size_t aPos=0); virtual size_t getStreamSize(void) { return getStringSize(); }; virtual size_t getStreamPos(void) const { return fStreamPos; }; virtual size_t readStream(void *aBuffer, size_t aMaxBytes); virtual size_t writeStream(void *aBuffer, size_t aNumBytes); void appendStream(void) { resetStream(getStreamSize()); }; #endif virtual bool hasProxy(void) { return false; }; // normal fields don't have a proxy // - as string virtual void setAsString(cAppCharP /* aString */) { fAssigned=true; }; // basic setter, this one must be derived for all non-string descendants virtual void setAsString(cAppCharP aString, size_t aLen); virtual void setAsString(const string &aString) { setAsString(aString.c_str(),aString.size()); }; virtual void getAsString(string &aString) { aString.erase(); }; // empty string by default virtual void appendToString(string &aString, size_t aMaxLen=0) { string s; getAsString(s); if (aMaxLen) aString.append(s,0,aMaxLen); else aString.append(s); }; // generic append virtual cAppCharP getCStr(void) { return NULL; } // only real strings can return CStr (used for PalmOS optimization) virtual void getAsNormalizedString(string &aString) { getAsString(aString); }; virtual size_t getStringSize(void); // - as boolean (default: non-empty is true) virtual bool getAsBoolean(void) { return !isEmpty(); }; virtual void setAsBoolean(bool aBool) { if (aBool) setAsString("1"); else assignEmpty(); }; // - as integer virtual fieldinteger_t getAsInteger(void); virtual void setAsInteger(fieldinteger_t aInteger); // some string operations // - append string/char virtual void appendString(cAppCharP /* aString */, size_t /* aMaxChars */) { /* nop */ }; void appendString(cAppCharP aString) { appendString(aString,strlen(aString)); }; void appendString(const string &aString) { appendString(aString.c_str(),aString.size()); }; void appendChar(const char aChar) { appendString(&aChar,1); }; // - check if specified value is contained in myself virtual bool contains(TItemField &aItemField, bool aCaseInsensitive); // - find string in contents virtual sInt16 findInString(cAppCharP /* aString */, bool /* aCaseInsensitive */) { return -1; }; // - check if specified field is shortened version of this one virtual bool isShortVers(TItemField & /* aItemField */, sInt32 /* aOthersMax */) { return false; }; // - assignment virtual bool isAssigned(void) { return fAssigned; }; bool isUnassigned(void) { return !isAssigned(); }; virtual void unAssign(void) { fAssigned=false; }; // empty is NOT always same as unassigned; e.g. for strings empty can be empty string assigned virtual bool isEmpty(void) { return getType()==fty_none ? true : isUnassigned(); } // - make assigned, but empty (explicit "" string assigned) virtual void assignEmpty(void) { fAssigned=true; }; // assignment virtual TItemField& operator=(TItemField &aItemField); // field comparison bool operator==(TItemField &aItem) { return compareWith(aItem)==0; } bool operator!=(TItemField &aItem) { return compareWith(aItem)!=0; } bool operator>(TItemField &aItem) { return compareWith(aItem)>0; } bool operator>=(TItemField &aItem) { return compareWith(aItem)>=0; } bool operator<(TItemField &aItem) { return compareWith(aItem)<0; } bool operator<=(TItemField &aItem) { return compareWith(aItem)<=0; } // append (default to appending string value of other field) virtual void append(TItemField &aItemField); // merge fields virtual bool merge(TItemField & /* aItemField */, const char /* aSep */=0) { return false; /* nop */ }; // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not comparable at all or not equal and no ordering known virtual sInt16 compareWith(TItemField & /* aItemField */, bool =false /* aCaseInsensitive */) { return SYSYNC_NOT_COMPARABLE; }; // debug support #ifdef SYDEBUG virtual size_t StringObjFieldAppend(string &s, uInt16 aMaxStrLen); // show field contents as string for debug output #endif protected: // assigned flag bool fAssigned; #ifdef STREAMFIELD_SUPPORT // stream position size_t fStreamPos; #endif }; // TItemField typedef TItemField *TItemFieldP; #ifdef ARRAYFIELD_SUPPORT typedef std::vector TFieldArray; // array field, contains a list of fields of TItemFields class TArrayField : public TItemField, noncopyable { typedef TItemField inherited; public: TArrayField(TItemFieldTypes aLeafFieldType, GZones *aGZonesP); virtual ~TArrayField(); // check array virtual bool isArray(void) const { return true; } virtual TItemField *getArrayField(sInt16 aArrIdx, bool aExistingOnly=false); virtual sInt16 arraySize(void) const { return fArray.size(); } // return size of array // changelog support #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) virtual uInt16 getDataCRC(uInt16 crc=0); #endif // access to type virtual TItemFieldTypes getType(void) const { return fty_none; } // array has no type virtual TItemFieldTypes getElementType(void) const { return fLeafFieldType; } // type of leaf fields (accessible even if array is empty) virtual bool elementsBasedOn(TItemFieldTypes aFieldType) const; // some string operations // - assignment virtual bool isAssigned(void) { return !isEmpty() || fAssigned; }; // empty, but explicitly assigned so is assigned as well virtual void unAssign(void); // clear all elements and clear fAssigned // - append string to array = append string as last element of array virtual void appendString(cAppCharP aString, size_t aMaxChars); // empty is array with no elements virtual bool isEmpty(void) { return arraySize()==0; }; // - make assigned virtual void assignEmpty(void) { unAssign(); fAssigned = true; }; // assigning emptyness must make isAssigned true! // assignment virtual TItemField& operator=(TItemField &aItemField); // check if specified value is contained in myself virtual bool contains(TItemField &aItemField, bool aCaseInsensitive); // append (default to appending value of other field as a new array element) virtual void append(TItemField &aItemField); // merge fields virtual bool merge(TItemField & /* aItemField */, const char /* aSep */=0) { return false; /* nop */ }; // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem, // SYSYNC_NOT_COMPARABLE if not comparable at all or not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); // debug support #ifdef SYDEBUG virtual size_t StringObjFieldAppend(string &s, uInt16); // show field contents as string for debug output #endif protected: // type of contained leaf fields TItemFieldTypes fLeafFieldType; // first field, is instantiated with array to allow type comparisons TItemField *fFirstField; // Zones for fields GZones *fGZonesP; // actual field vector TFieldArray fArray; }; // TArrayField #endif #ifndef STREAMFIELD_SUPPORT #define PULLFROMPROXY #define DELETEPROXY #define PROXYINSTALLED false #else #define PULLFROMPROXY pullFromProxy() #define DELETEPROXY setBlobProxy(NULL) #define PROXYINSTALLED (fBlobProxyP!=NULL) // forward class TStringField; // abstract Proxy object for Blob contents, allows loading a BLOB from DB at the moment it is // actually required. // Intended to be derived by database implementations class TBlobProxy { public: TBlobProxy() { fUsage=1; } // initial creator also gets owner virtual ~TBlobProxy() {}; // - returns size of entire blob virtual size_t getBlobSize(TStringField *aFieldP) = 0; // - read from Blob from specified stream position and update stream pos virtual size_t readBlobStream(TStringField *aFieldP, size_t &aPos, void *aBuffer, size_t aMaxBytes) = 0; // - dependency on a local ID virtual void setParentLocalID(cAppCharP aParentLocalID) { /* nop */ }; // - usage control void link(void) { fUsage++; }; static void unlink(TBlobProxy *&aProxyP) { if (aProxyP) { if (--(aProxyP->fUsage) == 0) delete aProxyP; aProxyP=NULL; } }; private: uInt16 fUsage; }; // TBlobProxy #endif // string field. // Note that a string can also be a string of binary data, // not only a NUL-terminated string (as used in derived blob class) class TStringField: public TItemField { typedef TItemField inherited; friend class TBlobProxy; public: TStringField(); virtual ~TStringField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_string; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_string ? true : TItemField::isBasedOn(aFieldType); }; // changelog support #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) virtual uInt16 getDataCRC(uInt16 crc=0); #endif // assignment virtual TItemField& operator=(TItemField &aItemField); // access to normalized version of content virtual void getAsNormalizedString(string &aString); // access to field contents #ifdef STREAMFIELD_SUPPORT // - set blob loader proxy (ownership is passed to field) void setBlobProxy(TBlobProxy *aBlobProxyP); // - stream interface virtual size_t getStreamSize(void); virtual size_t readStream(void *aBuffer, size_t aMaxBytes); virtual size_t writeStream(void *aBuffer, size_t aNumBytes); virtual bool hasProxy(void) { return fBlobProxyP!=NULL; }; // - stream field proxies actually can have dependencies on a local ID virtual void setParentLocalID(cAppCharP aParentLocalID) { if (fBlobProxyP) fBlobProxyP->setParentLocalID(aParentLocalID); }; #endif // - as string virtual void setAsString(cAppCharP aString) { DELETEPROXY; if (aString) fString=aString; else fString.erase(); stringWasAssigned(); }; virtual void setAsString(const string &aString) { DELETEPROXY; fString=aString; stringWasAssigned(); }; // works even if string contains NULs virtual void setAsString(cAppCharP aString, size_t aLen); virtual void getAsString(string &aString) { PULLFROMPROXY; aString=fString; }; virtual void appendToString(string &aString, size_t aMaxLen=0) { PULLFROMPROXY; if (aMaxLen) aString.append(fString,0,aMaxLen); else aString.append(fString); }; virtual cAppCharP getCStr(void) { PULLFROMPROXY; return fString.c_str(); } // string can return CStr (used for PalmOS optimization) virtual size_t getStringSize(void); // can cause proxied values to be retrieved, so use with care with BLOBS virtual void unAssign(void) { DELETEPROXY; fString.erase(); TItemField::unAssign(); }; // empty test virtual bool isEmpty(void) { return isUnassigned() || getStringSize()==0; } virtual void assignEmpty(void) { DELETEPROXY; fString.erase(); TItemField::assignEmpty(); }; // some string operations // - append string virtual void appendString(cAppCharP aString, size_t aMaxChars); // - check if specified field is shortened version of this one virtual bool isShortVers(TItemField &aItemField, sInt32 aOthersMax); // - check if String is contained in value and returns position virtual sInt16 findInString(cAppCharP aString, bool aCaseInsensitive=false); // merge fields virtual bool merge(TItemField &aItemField, const char aSep=0); // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); #ifdef STREAMFIELD_SUPPORT void pullFromProxy(void); #endif // debug support #ifdef SYDEBUG virtual size_t StringObjFieldAppend(string &s, uInt16 aMaxStrLen); #endif protected: virtual void stringWasAssigned(void) { fAssigned=true; }; // post-process string that was just assigned #ifdef STREAMFIELD_SUPPORT TBlobProxy *fBlobProxyP; #endif string fString; }; // TStringField // BLOB field. This is a string field but has many direct access functions // disabled, contents should only be read using stream interface, // comparing is not possible class TBlobField: public TStringField { typedef TStringField inherited; public: TBlobField(); virtual ~TBlobField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_blob; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_blob ? true : TStringField::isBasedOn(aFieldType); }; // changelog support // Note: uses inherited implementation of TStringField // assignment virtual TItemField& operator=(TItemField &aItemField); // - as string virtual void getAsString(string &aString) { StringObjPrintf(aString,"", long(getStringSize())); }; // must be read with stream interface void getBlobAsString(string &aString) { TStringField::getAsString(aString); }; // must use this one to get as string // - as Pointer/Data void getBlobDataPtrSz(void *&aPtr, size_t &aSize) { aPtr=(void *)TStringField::getCStr(); aSize=TStringField::getStringSize(); }; void setBlobDataPtrSz(void *aPtr, size_t aSize) { setAsString((cAppCharP)aPtr, aSize); }; // - test virtual bool isEmpty(void) { return isUnassigned(); } // do not test for empty string as this would cause BLOB to be read // some string operations // - check if specified field is shortened version of this one virtual bool isShortVers(TItemField & /* aItemField */, sInt32 /* aOthersMax */) { return false; }; // cannot compare // - check if String is contained in value and returns position virtual sInt16 findInString(cAppCharP /* aString */, bool /* aCaseInsensitive */) { return -1; }; // cannot search // merge fields virtual bool merge(TItemField & /* aItemField */, const char /* aSep */=0) { return false; }; // cannot merge // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField & /* aItemField */, bool /* aCaseInsensitive */) { return SYSYNC_NOT_COMPARABLE; }; // cannot compare // make contents and encoding/charset valid void makeContentsValid(void) { PULLFROMPROXY; }; // debug support #ifdef SYDEBUG virtual size_t StringObjFieldAppend(string &s, uInt16 aMaxStrLen); // show field contents as string for debug output #endif // extra info about BLOB contents TEncodingTypes fHasEncoding; TEncodingTypes fWantsEncoding; TCharSets fCharset; }; // TBlobField // telephone number string field // compares normalized version of number text (only +*# and digits) class TTelephoneField: public TStringField { typedef TStringField inherited; public: TTelephoneField(); virtual ~TTelephoneField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_telephone; }; virtual TItemFieldTypes getCalcType(void) const { return fty_string; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_telephone ? true : TStringField::isBasedOn(aFieldType); }; // assignment virtual TItemField& operator=(TItemField &aItemField) { return TStringField::operator=(aItemField); }; // access to normalized version of content virtual void getAsNormalizedString(string &aString); // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); }; // TTelephoneField // multiline string field // compares without any leading or trailing whitespace, linefeeds, controlchars class TMultilineField: public TStringField { typedef TStringField inherited; public: TMultilineField(); virtual ~TMultilineField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_multiline; }; virtual TItemFieldTypes getCalcType(void) const { return fty_string; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_multiline ? true : TStringField::isBasedOn(aFieldType); }; // assignment virtual TItemField& operator=(TItemField &aItemField) { return TStringField::operator=(aItemField); }; // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); }; // TMultilineField // URL field // normalizes URL (appends http:// if no protocol part specified) class TURLField: public TStringField { typedef TStringField inherited; public: TURLField(); virtual ~TURLField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_url; }; virtual TItemFieldTypes getCalcType(void) const { return fty_string; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_url ? true : TStringField::isBasedOn(aFieldType); }; // assignment virtual TItemField& operator=(TItemField &aItemField) { return TStringField::operator=(aItemField); }; //%%%virtual void setAsString(cAppCharP aString); virtual void stringWasAssigned(void); // post-process string that was just assigned }; // TURLField class TTimestampField: public TItemField { typedef TItemField inherited; public: TTimestampField(GZones *aGZonesP); virtual ~TTimestampField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_timestamp; }; virtual TItemFieldTypes getCalcType(void) const { return fty_integer; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_timestamp ? true : TItemField::isBasedOn(aFieldType); }; // assignment virtual TItemField& operator=(TItemField &aItemField); // changelog support #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) virtual uInt16 getDataCRC(uInt16 crc=0); #endif // access to field contents virtual void setAsString(cAppCharP aString); virtual void getAsString(string &aString); virtual fieldinteger_t getAsInteger(void) { return (fieldinteger_t)fTimestamp; }; virtual void setAsInteger(fieldinteger_t aInteger) { fTimestamp = (lineartime_t)aInteger; }; // does not touch the timecontext! virtual void unAssign(void) { fTimestamp=noLinearTime; fTimecontext=TCTX_UNKNOWN; TItemField::unAssign(); }; // empty test (zero timestamp means empty, unless it is a duration) virtual bool isEmpty(void) { return isUnassigned() || (fTimestamp==noLinearTime && !TCTX_IS_DURATION(fTimecontext)); } virtual void assignEmpty(void) { fTimestamp=noLinearTime; fTimecontext=TCTX_UNKNOWN; TItemField::assignEmpty(); }; // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); // type specific access and utilities /// @brief add a delta time to the timestamp /// @param aDeltaTime[in] : delta time value in lineartime_t units void addTime(lineartime_t aDeltaTime); /// @brief get time context /// @return time context timecontext_t getTimeContext(void) { return fTimecontext; } /// @brief get time context /// @return minute offset east of UTC, returns 0 for floating timestamps (and UTC, of course) sInt16 getMinuteOffset(void); /// @brief test for floating time (=time not in a specified zone context) /// @return true if context is TCTX_UNKNOWN bool isFloating(void); /// @brief make timestamp floating (i.e. remove time zone info from context) void makeFloating(void); /// @brief test for duration /// @return true if context has TCTX_DURATION rendering flag set bool isDuration(void); /// @brief make timestamp a duration (also implies making it floating) void makeDuration(void); /// @brief get timestamp converted to a specified time context /// @param aTargetContext[in] : requests output context for timestamp. /// Use TCTX_UNKNOWN to get timestamp as-is. /// If timestamp is floating, it will always be returned as-is /// @param aActualContext[out] : if not NULL, the actual context of the returned value /// will be returned here. This might be another // context than specified with aTargetContext depending on floating/notime status. /// @return timestamp in lineartime lineartime_t getTimestampAs(timecontext_t aTargetContext, timecontext_t *aActualContext=NULL); /// @brief get timestamp as ISO8601 string. /// @param aISOString[out] : timestamp in ISO8601 format /// @param aTargetContext[in] : requests output context for timestamp. Use TCTX_UNKNOWN to show timestamp as-is. /// @param aShowWithZ[in] : if set and timezone is UTC, value will be shown with "Z" appended /// @param aShowWithZone[in] : if set and timestamp is not floating, zone offset will be appended in +-xx:xx form /// @param aExtFormat[in] : if set, ISO8601 extended format is used /// @param aWithFracSecs[in] : if set, fractions of seconds will be shown (millisecond resolution) void getAsISO8601(string &aISOString, timecontext_t aTargetContext, bool aShowWithZ=true, bool aShowWithZone=false, bool aExtFormat=false, bool aWithFracSecs=false); /// @brief set timestamp value and context /// @param aTimestamp[in] : timestamp to set /// @param aTimecontext[in] : context to set void setTimestampAndContext(lineartime_t aTimestamp, timecontext_t aTimecontext) { setTimestamp(aTimestamp); setTimeContext(aTimecontext); }; /// @brief set timestamp value without context /// @param aTimestamp[in] : timestamp to set void setTimestamp(lineartime_t aTimestamp) { fTimestamp=aTimestamp; fAssigned=true; }; /// @brief set timestamp value and context /// @param aTimecontext[in] : context to set (timestamp will not be touched or converted) virtual void setTimeContext(timecontext_t aTimecontext) { fTimecontext=aTimecontext; fAssigned=true; }; /// @brief move timestamp to specified context (i.e. convert the timestamp value from current to /// specified context). Floating timestamps cannot and will not be moved. /// @param aNewcontext[in] : context to move timestamp to. /// timestamp will be converted to represent the same point in time in the new context /// @param aSetUnmovables : if set, non-movable timestamps will be just assigned the new context, // that is floating timestamps will be bound to specified context or // non-floating timestamps will be made floating if new context is TCTX_UNKNOWN bool moveToContext(timecontext_t aNewcontext, bool aSetUnmovables=false); /// @brief set timestamp from ISO8601 string. /// @return true if successful /// @param aISOString[in] : timestamp in ISO8601 basic or extended format, optionally including Z or +xx:xx zone specifier /// @param aDefaultContext[in] : timezone context to use when ISO8601 does not specify a zone context or when aIgnoreZone is true /// @param aIgnoreZone[in] : if set, timezone specification contained in ISO8601 is ignored. Resulting time context will be aDefaultContext bool setAsISO8601(cAppCharP aISOString, timecontext_t aDefaultContext=TCTX_UNKNOWN, bool aIgnoreZone=false); #ifdef EMAIL_FORMAT_SUPPORT /// @brief get timestamp as RFC(2)822 style date /// @param aRFC822String[out] : timestamp in RFC(2)822 format /// @param aTargetContext[in] : requests output context for timestamp. Use TCTX_UNKNOWN to show timestamp as-is. /// @param aShowWithZone[in] : if set and timestamp is not floating, zone offset will be shown void getAsRFC822date(string &aRFC822String, timecontext_t aTargetContext, bool aShowWithZone=false); /// @brief set timestamp as RFC(2)822 style date /// @return true if successful /// @param aRFC822String[in] : timestamp in RFC(2)822 format /// @param aDefaultContext[in] : timezone context to use when RFC822 date does not specify a time zone /// @param aIgnoreZone[in] : if set, timezone specification contained in input string is ignored. Resulting time context will be aDefaultContext bool setAsRFC822date(cAppCharP aRFC822String, timecontext_t aDefaultContext=TCTX_UNKNOWN, bool aIgnoreZone=false); #endif // EMAIL_FORMAT_SUPPORT // debug support #ifdef SYDEBUG virtual size_t StringObjFieldAppend(string &s, uInt16 aMaxStrLen); #endif GZones *getGZones(void) { return fGZonesP; }; protected: lineartime_t fTimestamp; // timestamp in context indicated by fTimecontext timecontext_t fTimecontext; // context/options of timestamp GZones *fGZonesP; // zones }; // TTimestampField class TDateField: public TTimestampField { typedef TTimestampField inherited; public: TDateField(GZones *aGZonesP); virtual ~TDateField(); // assignment virtual TItemField& operator=(TItemField &aItemField) { return TTimestampField::operator=(aItemField); }; // access to type virtual TItemFieldTypes getType(void) const { return fty_date; }; virtual TItemFieldTypes getCalcType(void) const { return fty_integer; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_date ? true : TTimestampField::isBasedOn(aFieldType); }; // access to field contents virtual void setAsString(cAppCharP aString); virtual void getAsString(string &aString); // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); /// @brief set timestamp value and context /// @param aTimecontext[in] : context to set (timestamp will not be touched or converted) virtual void setTimeContext(timecontext_t aTimecontext) { fTimecontext=aTimecontext | TCTX_DATEONLY; fAssigned=true; }; }; // TDateField class TIntegerField: public TItemField { typedef TItemField inherited; public: TIntegerField(); virtual ~TIntegerField(); // access to type virtual TItemFieldTypes getType(void) const { return fty_integer; }; virtual bool isBasedOn(TItemFieldTypes aFieldType) const { return aFieldType==fty_integer ? true : TItemField::isBasedOn(aFieldType); }; // assignment virtual TItemField& operator=(TItemField &aItemField); // changelog support #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) virtual uInt16 getDataCRC(uInt16 crc=0); #endif // access to field contents // - as string virtual void setAsString(cAppCharP aString); virtual void getAsString(string &aString); virtual void unAssign(void) { fInteger=0; TItemField::unAssign(); }; // - as boolean (empty is false, zero value is false, other values are true) virtual bool getAsBoolean(void) { return !(isEmpty() || fInteger==0); }; virtual void setAsBoolean(bool aBool) { fAssigned=true; fEmpty=false; if (aBool) fInteger=1; else fInteger=0; }; virtual fieldinteger_t getAsInteger(void); virtual void setAsInteger(fieldinteger_t aInteger); // empty test and assignment virtual bool isEmpty(void) { return isUnassigned() || fEmpty; }; virtual void assignEmpty(void) { fInteger=0; fEmpty=true; TItemField::assignEmpty(); }; // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith(TItemField &aItemField, bool aCaseInsensitive=false); protected: fieldinteger_t fInteger; // integer value bool fEmpty; // extra empty flag }; // TIntegerField // factory function TItemField *newItemField(const TItemFieldTypes aType, GZones *aGZonesP, bool aAsArray=false); #ifdef ENGINEINTERFACE_SUPPORT // special flags coded into value ID #define VALID_FLAG_TZNAME 0x010000 #define VALID_FLAG_TZOFFS 0x020000 #define VALID_FLAG_ARRSIZ 0x040000 #define VALID_FLAG_VALNAME 0x080000 #define VALID_FLAG_VALTYPE 0x100000 #define VALID_FLAG_NORM 0x200000 #define VALID_MASK_FID 0x00FFFF // key for access to a item using the settings key API class TItemFieldKey : public TSettingsKeyImpl { typedef TSettingsKeyImpl inherited; public: TItemFieldKey(TEngineInterface *aEngineInterfaceP) : inherited(aEngineInterfaceP), fWritten(false) {}; // get value's ID (e.g. internal index) virtual sInt32 GetValueID(cAppCharP aName); bool isWritten(void) { return fWritten; }; protected: // get value's native type virtual uInt16 GetValueType(sInt32 aID); // get value virtual TSyError GetValueInternal( sInt32 aID, sInt32 aArrayIndex, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); // set value virtual TSyError SetValueInternal( sInt32 aID, sInt32 aArrayIndex, cAppPointer aBuffer, memSize aValSize ); // flag that will be set on first write access bool fWritten; // abstract methods to actually access a TItemField virtual sInt16 getFidFor(cAppCharP aName, stringSize aNameSz) = 0; virtual TItemField *getBaseFieldFromFid(sInt16 aFid) = 0; virtual bool getFieldNameFromFid(sInt16 aFid, string &aFieldName) { return false; /* no name */ }; private: // utility TItemField *getFieldFromFid(sInt16 aFid, sInt16 aRepOffset, bool aExistingOnly=false); }; // TItemFieldKey #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync #endif // ItemField_H // eof syncevolution-1.5/src/synthesis/src/sysync/localengineds.cpp0000644000373300037200000106546712424517753026203 0ustar00nightlyallusers00000000000000/** * @File localengineds.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TLocalEngineDS * Abstraction of the local datastore - interface class to the * sync engine. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-15 : luz : created from localdatastore */ // includes #include "prefix_file.h" #include "sysync.h" #include "localengineds.h" #include "syncappbase.h" #include "scriptcontext.h" #include "superdatastore.h" #include "syncagent.h" using namespace sysync; namespace sysync { #ifdef SYDEBUG cAppCharP const LocalDSStateNames[numDSStates] = { "idle", "client_initialized", "admin_ready", "client_sent_alert", "server_alerted", "server_answered_alert", "client_alert_statused", "client_alerted", "sync_mode_stable", "data_access_started", "sync_set_ready", "client_sync_gen_started", "server_seen_client_mods", "server_sync_gen_started", "sync_gen_done", "data_access_done", "client_maps_sent", "admin_done", "completed" }; #endif #ifdef OBJECT_FILTERING // add a new expression to an existing filter static void addToFilter(const char *aNewFilter, string &aFilter, bool aORChain=false) { if (aNewFilter && *aNewFilter) { // just assign if current filter expression is empty if (aFilter.empty()) aFilter = aNewFilter; else { // construct new filter string newFilter; StringObjPrintf(newFilter,"(%s)%c(%s)",aFilter.c_str(),aORChain ? '|' : '&',aNewFilter); aFilter = newFilter; } } } // addToFilter #endif #ifdef SCRIPT_SUPPORT // Script functions // ================ class TLDSfuncs { public: #ifdef OBJECT_FILTERING #ifdef SYNCML_TAF_SUPPORT // string GETCGITARGETFILTER() // returns current CGI-specified target address filter expression static void func_GetCGITargetFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(dsP->fTargetAddressFilter.c_str()); }; // func_GetCGITargetFilter // string GETTARGETFILTER() // returns current internal target address filter expression static void func_GetTargetFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(dsP->fIntTargetAddressFilter.c_str()); }; // func_GetTargetFilter // SETTARGETFILTER(string filter) // sets (overwrites) the internal target address filter static void func_SetTargetFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(dsP->fIntTargetAddressFilter); }; // func_SetTargetFilter // ADDTARGETFILTER(string filter) // adds a filter expression to the existing internal targetfilter (automatically paranthesizing and adding AND) static void func_AddTargetFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { string f; TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(f); addToFilter(f.c_str(),dsP->fIntTargetAddressFilter,false); // AND-chaining }; // func_AddTargetFilter #endif // SYNCML_TAF_SUPPORT // string GETFILTER() // returns current sync set filter expression static void func_GetFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(dsP->fSyncSetFilter.c_str()); }; // func_GetFilter // SETFILTER(string filter) // sets (overwrites) the current sync set filter static void func_SetFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(dsP->fSyncSetFilter); dsP->engFilteredFetchesFromDB(true); // update filter dependencies }; // func_SetFilter // ADDFILTER(string filter) // adds a filter expression to the existing (dynamic) targetfilter (automatically paranthesizing and adding AND) static void func_AddFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { string f; TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(f); addToFilter(f.c_str(),dsP->fSyncSetFilter,false); // AND-chaining dsP->engFilteredFetchesFromDB(true); // update filter dependencies }; // func_AddFilter // ADDSTATICFILTER(string filter) // adds a filter expression to the existing (static) localdbfilter (automatically paranthesizing and adding AND) static void func_AddStaticFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { string f; TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(f); addToFilter(f.c_str(),dsP->fLocalDBFilter,false); // AND-chaining dsP->engFilteredFetchesFromDB(true); // update filter dependencies }; // func_AddStaticFilter #endif // OBJECT_FILTERING #ifdef SYSYNC_TARGET_OPTIONS // string DBOPTIONS() // returns current DB options static void func_DBOptions(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(dsP->fDBOptions.c_str()); }; // func_DBOptions // integer DBHANDLESOPTS() // returns true if database can completely handle options like /dr() and /li during fetching static void func_DBHandlesOpts(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->dsOptionFilterFetchesFromDB() ); }; // func_DBHandlesOpts // timestamp STARTDATE() // returns startdate if one is set in datastore static void func_StartDate(TItemField *&aTermP, TScriptContext *aFuncContextP) { lineartime_t d = static_cast(aFuncContextP->getCallerContext())->fDateRangeStart; TTimestampField *resP = static_cast(aTermP); if (d==noLinearTime) resP->assignEmpty(); else resP->setTimestampAndContext(d,TCTX_UTC); }; // func_StartDate // SETSTARTDATE(timestamp startdate) // sets startdate for datastore static void func_SetStartDate(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); timecontext_t tctx; static_cast(aFuncContextP->getCallerContext())->fDateRangeStart = tsP->getTimestampAs(TCTX_UTC,&tctx); // floating will also be treated as UTC }; // func_SetStartDate // timestamp ENDDATE() // returns enddate if one is set in datastore static void func_EndDate(TItemField *&aTermP, TScriptContext *aFuncContextP) { lineartime_t d = static_cast(aFuncContextP->getCallerContext())->fDateRangeEnd; TTimestampField *resP = static_cast(aTermP); if (d==noLinearTime) resP->assignEmpty(); else resP->setTimestampAndContext(d,TCTX_UTC); }; // func_EndDate // SETENDDATE(timestamp startdate) // sets enddate for datastore static void func_SetEndDate(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); timecontext_t tctx; static_cast(aFuncContextP->getCallerContext())->fDateRangeEnd = tsP->getTimestampAs(TCTX_UTC,&tctx); // floating will also be treated as UTC }; // func_SetEndDate // integer DEFAULTSIZELIMIT() // returns limit set for all items in this datastore (the /li(xxx) CGI option value) static void func_DefaultLimit(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t i = static_cast(aFuncContextP->getCallerContext())->fSizeLimit; if (i<0) aTermP->unAssign(); // no limit else aTermP->setAsInteger(i); }; // func_DefaultLimit // SETDEFAULTSIZELIMIT(integer limit) // sets limit for all items in this datastore (the /li(xxx) CGI option value) static void func_SetDefaultLimit(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fSizeLimit = aFuncContextP->getLocalVar(0)->getAsInteger(); }; // func_SetDefaultLimit // integer NOATTACHMENTS() // returns true if attachments should be suppressed (/na CGI option) static void func_NoAttachments(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->fNoAttachments ); }; // func_NoAttachments // SETNOATTACHMENTS(integer flag) // if true, attachments will be suppressed (/na CGI option) static void func_SetNoAttachments(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fNoAttachments = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetNoAttachments // integer MAXITEMCOUNT() // returns item count limit (0=none) as set by /max(n) CGI option static void func_MaxItemCount(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsInteger( static_cast(aFuncContextP->getCallerContext())->fMaxItemCount ); }; // func_MaxItemCount // SETMAXITEMCOUNT(integer maxcount) // set item count limit (0=none) as set by /max(n) CGI option static void func_SetMaxItemCount(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fMaxItemCount = aFuncContextP->getLocalVar(0)->getAsInteger(); }; // func_SetMaxItemCount #endif // SYSYNC_TARGET_OPTIONS // integer SLOWSYNC() // returns true if we are in slow sync static void func_SlowSync(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->isSlowSync() ); }; // func_SlowSync // FORCESLOWSYNC() // force a slow sync (like with /na CGI option) static void func_ForceSlowSync(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->engForceSlowSync(); }; // func_ForceSlowSync // integer ALERTCODE() // returns the alert code as currently know by datastore (might change from normal to slow while processing) static void func_AlertCode(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsInteger( static_cast(aFuncContextP->getCallerContext())->fAlertCode ); }; // func_AlertCode // SETALERTCODE(integer maxcount) // set the alert code (makes sense in alertscript to modify the incoming code to something different) static void func_SetAlertCode(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fAlertCode = aFuncContextP->getLocalVar(0)->getAsInteger(); }; // func_SetAlertCode // integer REFRESHONLY() // returns true if sync is only refreshing local (note that alert code might be different, as local // refresh can take place without telling the remote so, for compatibility with clients that do not support the mode) static void func_RefreshOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->isRefreshOnly() ); }; // func_RefreshOnly // SETREFRESHONLY(integer flag) // modifies the refresh only flag (one way sync from remote to local only) // Note that clearing this flag when a client has alerted one-way will probably lead to an error static void func_SetRefreshOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->engSetRefreshOnly( aFuncContextP->getLocalVar(0)->getAsBoolean() ); }; // func_SetRefreshOnly // integer CACHEDATA() // returns true if sync is refreshing local data in caching mode (without deleting everything beforehand) static void func_CacheData(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->isCacheData() ); }; // func_CacheData static void func_SetCacheData(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->engSetCacheData( aFuncContextP->getLocalVar(0)->getAsBoolean() ); }; // func_SetCacheData // integer READONLY() // returns true if sync is read-only (only reading from local datastore) static void func_ReadOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->isReadOnly() ); }; // func_ReadOnly // SETREADONLY(integer flag) // modifies the read only flag (only reading from local datastore) static void func_SetReadOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->engSetReadOnly( aFuncContextP->getLocalVar(0)->getAsBoolean() ); }; // func_SetReadOnly // integer FIRSTTIMESYNC() // returns true if we are in first time slow sync static void func_FirstTimeSync(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsBoolean( static_cast(aFuncContextP->getCallerContext())->isFirstTimeSync() ); }; // func_FirstTimeSync // void SETCONFLICTSTRATEGY(string strategy) // sets conflict strategy for this session static void func_SetConflictStrategy(TItemField *&aTermP, TScriptContext *aFuncContextP) { // convert to syncop string s; aFuncContextP->getLocalVar(0)->getAsString(s); sInt16 strategy; StrToEnum(conflictStrategyNames,numConflictStrategies, strategy, s.c_str()); static_cast(aFuncContextP->getCallerContext())->fSessionConflictStrategy = (TConflictResolution) strategy; }; // func_SetConflictStrategy // string DBNAME() // returns name of DB static void func_DBName(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->getName() ); }; // func_DBName // void ABORTDATASTORE(integer statuscode) static void func_AbortDatastore(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->engAbortDataStoreSync(aFuncContextP->getLocalVar(0)->getAsInteger(),true); // we cause the abort locally } // func_AbortDatastore // string LOCALDBNAME() // returns name of local DB with which it was identified for the sync static void func_LocalDBName(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( static_cast(aFuncContextP->getCallerContext())->getIdentifyingName() ); }; // func_LocalDBName // string REMOTEDBNAME() // returns remote datastore's full name (as used by the remote in command, may contain subpath and CGI) static void func_RemoteDBName(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(dsP->getRemoteDatastore()->getFullName()); }; // func_RemoteDBName #ifdef SYSYNC_CLIENT // ADDTARGETCGI(string cgi) // adds CGI to the target URI. If target URI already contains a ?, string will be just // appended, otherwise a ? is added, then the new CGI. // Note: if string to be added is already contained, it will not be added again static void func_AddTargetCGI(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); // Add extra CGI specified string cgi; aFuncContextP->getLocalVar(0)->getAsString(cgi); addCGItoString(dsP->fRemoteDBPath,cgi.c_str(),true); }; // func_AddTargetCGI // SETRECORDFILTER(string filter, boolean inclusive) // Sets record level filter expression for remote static void func_SetRecordFilter(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); // put into record level filter if (dsP->getSession()->getSyncMLVersion()>=syncml_vers_1_2) { // DS 1.2: use aFuncContextP->getLocalVar(0)->getAsString(dsP->fRemoteRecordFilterQuery); dsP->fRemoteFilterInclusive = aFuncContextP->getLocalVar(1)->getAsBoolean(); } else if (!aFuncContextP->getLocalVar(0)->isEmpty()) { // DS 1.1 and below and not empty filter: add as cgi string filtercgi; if (aFuncContextP->getLocalVar(1)->getAsBoolean()) filtercgi = "/tf("; // exclusive, use TAF else filtercgi = "/fi("; // inclusive, use sync set filter aFuncContextP->getLocalVar(0)->appendToString(filtercgi); filtercgi += ')'; addCGItoString(dsP->fRemoteDBPath,filtercgi.c_str(),true); } }; // func_SetRecordFilter // SETDAYSRANGE(integer daysbefore, integer daysafter) // Sets type of record filter static void func_SetDaysRange(TItemField *&aTermP, TScriptContext *aFuncContextP) { TLocalEngineDS *dsP = static_cast(aFuncContextP->getCallerContext()); // get params int daysbefore = aFuncContextP->getLocalVar(0)->getAsInteger(); int daysafter = aFuncContextP->getLocalVar(1)->getAsInteger(); // depending on SyncML version, create a SINCE/BEFORE filter or use the /dr(x,y) syntax if (dsP->getSession()->getSyncMLVersion()>=syncml_vers_1_2 && static_cast(dsP->getSession())->fServerHasSINCEBEFORE) { // use the SINCE/BEFORE syntax // BEFORE&EQ;20070808T000000Z&AND;SINCE&EQ;20070807T000000Z lineartime_t now = getSystemNowAs(TCTX_UTC,aFuncContextP->getSessionZones()); string ts; // AND-chain with possibly existing filter cAppCharP sep = ""; if (!dsP->fRemoteRecordFilterQuery.empty()) sep = "&AND;"; if (daysbefore>=0) { dsP->fRemoteRecordFilterQuery += sep; dsP->fRemoteRecordFilterQuery += "SINCE&EQ;"; TimestampToISO8601Str(ts,now-daysbefore*linearDateToTimeFactor,TCTX_UTC,false,false); dsP->fRemoteRecordFilterQuery += ts; sep = "&AND;"; } if (daysafter>=0) { dsP->fRemoteRecordFilterQuery += sep; dsP->fRemoteRecordFilterQuery += "BEFORE&EQ;"; TimestampToISO8601Str(ts,now+daysafter*linearDateToTimeFactor,TCTX_UTC,false,false); dsP->fRemoteRecordFilterQuery += ts; } } else { // use the /dr(-x,y) syntax string rangecgi; StringObjPrintf(rangecgi,"/dr(%ld,%ld)",(long int)(-daysbefore),(long int)(daysafter)); addCGItoString(dsP->fRemoteDBPath,rangecgi.c_str(),true); } }; // func_SetDaysRange #endif // SYSYNC_CLIENT }; // TLDSfuncs const uInt8 param_FilterArg[] = { VAL(fty_string) }; const uInt8 param_DateArg[] = { VAL(fty_timestamp) }; const uInt8 param_IntArg[] = { VAL(fty_integer) }; const uInt8 param_StrArg[] = { VAL(fty_string) }; const uInt8 param_OneInteger[] = { VAL(fty_integer) }; const TBuiltInFuncDef DBFuncDefs[] = { #ifdef OBJECT_FILTERING #ifdef SYNCML_TAF_SUPPORT { "GETCGITARGETFILTER", TLDSfuncs::func_GetCGITargetFilter, fty_string, 0, NULL }, { "GETTARGETFILTER", TLDSfuncs::func_GetTargetFilter, fty_string, 0, NULL }, { "SETTARGETFILTER", TLDSfuncs::func_SetTargetFilter, fty_none, 1, param_FilterArg }, { "ADDTARGETFILTER", TLDSfuncs::func_AddTargetFilter, fty_none, 1, param_FilterArg }, #endif { "GETFILTER", TLDSfuncs::func_GetFilter, fty_string, 0, NULL }, { "SETFILTER", TLDSfuncs::func_SetFilter, fty_none, 1, param_FilterArg }, { "ADDFILTER", TLDSfuncs::func_AddFilter, fty_none, 1, param_FilterArg }, { "ADDSTATICFILTER", TLDSfuncs::func_AddStaticFilter, fty_none, 1, param_FilterArg }, #endif #ifdef SYSYNC_TARGET_OPTIONS { "DBOPTIONS", TLDSfuncs::func_DBOptions, fty_string, 0, NULL }, { "STARTDATE", TLDSfuncs::func_StartDate, fty_timestamp, 0, NULL }, { "ENDDATE", TLDSfuncs::func_EndDate, fty_timestamp, 0, NULL }, { "SETSTARTDATE", TLDSfuncs::func_SetStartDate, fty_none, 1, param_DateArg }, { "SETENDDATE", TLDSfuncs::func_SetEndDate, fty_none, 1, param_DateArg }, { "MAXITEMCOUNT", TLDSfuncs::func_MaxItemCount, fty_integer, 0, NULL }, { "SETMAXITEMCOUNT", TLDSfuncs::func_SetMaxItemCount, fty_none, 1, param_IntArg }, { "NOATTACHMENTS", TLDSfuncs::func_NoAttachments, fty_integer, 0, NULL }, { "SETNOATTACHMENTS", TLDSfuncs::func_SetNoAttachments, fty_none, 1, param_IntArg }, { "DEFAULTSIZELIMIT", TLDSfuncs::func_DefaultLimit, fty_integer, 0, NULL }, { "SETDEFAULTSIZELIMIT", TLDSfuncs::func_SetDefaultLimit, fty_none, 1, param_IntArg }, { "DBHANDLESOPTS", TLDSfuncs::func_DBHandlesOpts, fty_integer, 0, NULL }, #endif { "ALERTCODE", TLDSfuncs::func_AlertCode, fty_integer, 0, NULL }, { "SETALERTCODE", TLDSfuncs::func_SetAlertCode, fty_none, 1, param_IntArg }, { "SLOWSYNC", TLDSfuncs::func_SlowSync, fty_integer, 0, NULL }, { "FORCESLOWSYNC", TLDSfuncs::func_ForceSlowSync, fty_none, 0, NULL }, { "REFRESHONLY", TLDSfuncs::func_RefreshOnly, fty_integer, 0, NULL }, { "SETREFRESHONLY", TLDSfuncs::func_SetRefreshOnly, fty_none, 1, param_IntArg }, { "CACHEDATA", TLDSfuncs::func_CacheData, fty_integer, 0, NULL }, { "SETCACHEDATA", TLDSfuncs::func_SetCacheData, fty_none, 1, param_IntArg }, { "READONLY", TLDSfuncs::func_ReadOnly, fty_integer, 0, NULL }, { "SETREADONLY", TLDSfuncs::func_SetReadOnly, fty_none, 1, param_IntArg }, { "FIRSTTIMESYNC", TLDSfuncs::func_FirstTimeSync, fty_integer, 0, NULL }, { "SETCONFLICTSTRATEGY", TLDSfuncs::func_SetConflictStrategy, fty_none, 1, param_StrArg }, { "DBNAME", TLDSfuncs::func_DBName, fty_string, 0, NULL }, { "LOCALDBNAME", TLDSfuncs::func_LocalDBName, fty_string, 0, NULL }, { "REMOTEDBNAME", TLDSfuncs::func_RemoteDBName, fty_string, 0, NULL }, { "ABORTDATASTORE", TLDSfuncs::func_AbortDatastore, fty_none, 1, param_OneInteger }, }; // functions for all datastores const TFuncTable DBFuncTable = { sizeof(DBFuncDefs) / sizeof(TBuiltInFuncDef), // size of table DBFuncDefs, // table pointer NULL // no chain func }; #ifdef SYSYNC_CLIENT const uInt8 param_OneStr[] = { VAL(fty_string) }; // const uInt8 param_OneInt[] = { VAL(fty_integer) }; const uInt8 param_TwoInt[] = { VAL(fty_integer), VAL(fty_integer) }; const uInt8 param_SetRecordFilter[] = { VAL(fty_string), VAL(fty_integer) }; const TBuiltInFuncDef ClientDBFuncDefs[] = { { "ADDTARGETCGI", TLDSfuncs::func_AddTargetCGI, fty_none, 1, param_OneStr }, { "SETRECORDFILTER", TLDSfuncs::func_SetRecordFilter, fty_none, 2, param_SetRecordFilter }, { "SETDAYSRANGE", TLDSfuncs::func_SetDaysRange, fty_none, 2, param_TwoInt }, }; // chain to general DB functions static void *ClientDBChainFunc(void *&aCtx) { // caller context remains unchanged // -> no change needed // next table is general DS func table return (void *)&DBFuncTable; } // ClientDBChainFunc // function table for client-only script functions const TFuncTable ClientDBFuncTable = { sizeof(ClientDBFuncDefs) / sizeof(TBuiltInFuncDef), // size of table ClientDBFuncDefs, // table pointer ClientDBChainFunc // chain to general agent funcs. }; #endif // SYSYNC_CLIENT #endif // SCRIPT_SUPPORT // config // ====== // conflict strategy names // bfo: Problems with XCode (expicit qualification), already within namespace ? //const char * const sysync::conflictStrategyNames[numConflictStrategies] = { const char * const conflictStrategyNames[numConflictStrategies] = { "duplicate", // add conflicting counterpart to both databases "newer-wins", // newer version wins (if date/version comparison is possible, like sst_duplicate otherwise) "server-wins", // server version wins (and is written to client) "client-wins" // client version wins (and is written to server) }; // type support config TTypeSupportConfig::TTypeSupportConfig(const char* aName, TConfigElement *aParentElement) : TConfigElement(aName,aParentElement) { clear(); } // TTypeSupportConfig::TTypeSupportConfig TTypeSupportConfig::~TTypeSupportConfig() { clear(); } // TTypeSupportConfig::~TTypeSupportConfig // init defaults void TTypeSupportConfig::clear(void) { // init defaults fPreferredTx = NULL; fPreferredRx = NULL; fPreferredLegacy = NULL; fAdditionalTypes.clear(); #ifndef NO_REMOTE_RULES fRuleMatchTypes.clear(); #endif // clear inherited inherited::clear(); } // TTypeSupportConfig::clear #ifdef HARDCODED_CONFIG // add type support bool TTypeSupportConfig::addTypeSupport( cAppCharP aTypeName, bool aForRead, bool aForWrite, bool aPreferred, cAppCharP aVariant, cAppCharP aRuleMatch ) { // search datatype TDataTypeConfig *typecfgP = static_cast(getRootElement())->fDatatypesConfigP->getDataType(aTypeName); if (!typecfgP) return false; // search variant TTypeVariantDescriptor variantDescP = NULL; if (aVariant && *aVariant) variantDescP = typecfgP->getVariantDescriptor(aVariant); // now add datatype if (aPreferred) { // - preferred if (aForRead) { if (!fPreferredRx) { fPreferredRx=typecfgP; // set it fPrefRxVariantDescP=variantDescP; } } if (aForWrite) { if (!fPreferredTx) { fPreferredTx=typecfgP; // set it fPrefTxVariantDescP=variantDescP; } } } // if preferred else { // - additional TAdditionalDataType adt; adt.datatypeconfig=typecfgP; adt.forRead=aForRead; adt.forWrite=aForWrite; adt.variantDescP=variantDescP; // variant of that type #ifndef NO_REMOTE_RULES if (aRuleMatch) { // this is a rulematch type (which overrides normal type selection mechanism) AssignString(atd.remoteRuleMatch,aRuleMatch); // remote rule match string fRuleMatchTypes.push_back(adt); // save it in the list } else #endif { // standard type fAdditionalTypes.push_back(adt); // save it in the list } } return true; } // TTypeSupportConfig::addTypeSupport #else // config element parsing bool TTypeSupportConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"use")==0) { expectEmpty(); // datatype usage specs may not have // process arguments const char* nam = getAttr(aAttributes,"datatype"); if (!nam) return fail("use must have 'datatype' attribute"); // search datatype TDataTypeConfig *typecfgP = static_cast(getRootElement())->fDatatypesConfigP->getDataType(nam); if (!typecfgP) return fail("unknown datatype '%s' specified",nam); #ifndef NO_REMOTE_RULES // get rulematch string, if any cAppCharP ruleMatch = getAttr(aAttributes,"rulematch"); #endif // convert variant TTypeVariantDescriptor variantDescP=NULL; // no variant descriptor by default cAppCharP variant = getAttr(aAttributes,"variant"); if (variant) { // get a type-specific descriptor which describes the variant of a type to be used with this datastore variantDescP = typecfgP->getVariantDescriptor(variant); if (!variantDescP) return fail("unknown variant '%s' specified",variant); } // convert mode bool rd=true,wr=true; const char* mode = getAttr(aAttributes,"mode"); if (mode) { rd=false; wr=false; while (*mode) { if (tolower(*mode)=='r') rd=true; else if (tolower(*mode)=='w') wr=true; else { ReportError(true,"invalid mode '%c'",*mode); return true; } // next char mode++; } if (!rd && !wr) return fail("mode must specify 'r', 'w' or 'rw' at least"); } // get preferred bool preferred=false; const char* pref = getAttr(aAttributes,"preferred"); if (pref) { if (!StrToBool(pref, preferred)) { if (strucmp(pref,"legacy")==0) { // this is the preferred type for blind and legacy mode sync attempts fPreferredLegacy=typecfgP; // remember (note that there is only ONE preferred type, mode is ignored) preferred=false; // not officially preferred } else return fail("bad value for 'preferred'"); } } // now add datatype if (preferred) { // - preferred if (rd) { if (fPreferredRx) return fail("preferred read type already defined"); else { fPreferredRx=typecfgP; // set it fPrefRxVariantDescP=variantDescP; } } if (wr) { if (fPreferredTx) return fail("preferred write type already defined"); else { fPreferredTx=typecfgP; // set it fPrefTxVariantDescP=variantDescP; } } } // if preferred else { // - additional TAdditionalDataType adt; adt.datatypeconfig=typecfgP; adt.forRead=rd; adt.forWrite=wr; adt.variantDescP=variantDescP; #ifndef NO_REMOTE_RULES if (ruleMatch) { // this is a rulematch type (which overrides normal type selection mechanism) AssignString(adt.remoteRuleMatch,ruleMatch); // remote rule match string fRuleMatchTypes.push_back(adt); // save it in the list } else #endif { // standard type fAdditionalTypes.push_back(adt); // save it in the list } } } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TTypeSupportConfig::localStartElement #endif // resolve void TTypeSupportConfig::localResolve(bool aLastPass) { #ifndef HARDCODED_CONFIG if (aLastPass) { // check for required settings if (!fPreferredTx || !fPreferredRx) SYSYNC_THROW(TConfigParseException("'typesupport' must contain at least one preferred type for read and write")); } #endif // resolve inherited inherited::localResolve(aLastPass); } // TTypeSupportConfig::localResolve // datastore config TLocalDSConfig::TLocalDSConfig(const char* aName, TConfigElement *aParentElement) : TConfigElement(aName,aParentElement), fTypeSupport("typesupport",this) { clear(); } // TLocalDSConfig::TLocalDSConfig TLocalDSConfig::~TLocalDSConfig() { // nop so far } // TLocalDSConfig::~TLocalDSConfig // init defaults void TLocalDSConfig::clear(void) { // init defaults // - conflict resolution strategy fConflictStrategy=cr_newer_wins; fSlowSyncStrategy=cr_newer_wins; fFirstTimeStrategy=cr_newer_wins; // options fLocalDBTypeID=0; fReadOnly=false; fCanRestart=false; fReportUpdates=true; fDeleteWins=false; // replace wins over delete by default fResendFailing=true; // resend failing items in next session by default #ifdef SYSYNC_SERVER fTryUpdateDeleted=false; // no attempt to update already deleted items (assuming they are invisible only) fAlwaysSendLocalID=false; // off as it used to be not SCTS conformant (but would give clients chances to remap IDs) #endif fMaxItemsPerMessage=0; // no limit #ifdef OBJECT_FILTERING // - filters fRemoteAcceptFilter.erase(); fSilentlyDiscardUnaccepted=false; fLocalDBFilterConf.erase(); fMakePassFilter.erase(); fInvisibleFilter.erase(); fMakeVisibleFilter.erase(); // - DS 1.2 Filter support ( allowed in Alert, / shown in devInf) fDS12FilterSupport=false; // off by default, as clients usually don't have it // - Set if date range support is available in this datastore fDateRangeSupported=false; #endif #ifdef SCRIPT_SUPPORT fDBInitScript.erase(); fSentItemStatusScript.erase(); fReceivedItemStatusScript.erase(); fAlertScript.erase(); #ifdef SYSYNC_CLIENT fAlertPrepScript.erase(); #endif fDBFinishScript.erase(); #endif // clear embedded fTypeSupport.clear(); // clear inherited inherited::clear(); } // TLocalDSConfig::clear #ifndef HARDCODED_CONFIG // config element parsing bool TLocalDSConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"dbtypeid")==0) expectUInt32(fLocalDBTypeID); else if (strucmp(aElementName,"typesupport")==0) expectChildParsing(fTypeSupport); else if (strucmp(aElementName,"conflictstrategy")==0) expectEnum(sizeof(fConflictStrategy),&fConflictStrategy,conflictStrategyNames,numConflictStrategies); else if (strucmp(aElementName,"slowsyncstrategy")==0) expectEnum(sizeof(fSlowSyncStrategy),&fSlowSyncStrategy,conflictStrategyNames,numConflictStrategies); else if (strucmp(aElementName,"firsttimestrategy")==0) expectEnum(sizeof(fFirstTimeStrategy),&fFirstTimeStrategy,conflictStrategyNames,numConflictStrategies); else if (strucmp(aElementName,"readonly")==0) expectBool(fReadOnly); else if (strucmp(aElementName,"canrestart")==0) expectBool(fCanRestart); else if (strucmp(aElementName,"syncmode")==0) { if (!fSyncModeBuffer.empty()) { fSyncModes.insert(fSyncModeBuffer); fSyncModeBuffer.clear(); } expectString(fSyncModeBuffer); } else if (strucmp(aElementName,"reportupdates")==0) expectBool(fReportUpdates); else if (strucmp(aElementName,"deletewins")==0) expectBool(fDeleteWins); else if (strucmp(aElementName,"resendfailing")==0) expectBool(fResendFailing); #ifdef SYSYNC_SERVER else if (strucmp(aElementName,"tryupdatedeleted")==0) expectBool(fTryUpdateDeleted); else if (strucmp(aElementName,"alwayssendlocalid")==0) expectBool(fAlwaysSendLocalID); else if (strucmp(aElementName,"alias")==0) { // get a name string name; if (!getAttrExpanded(aAttributes, "name", name, true)) return fail("Missing 'name' attribute in 'alias'"); fAliasNames.push_back(name); expectEmpty(); } #endif else if (strucmp(aElementName,"maxitemspermessage")==0) expectUInt32(fMaxItemsPerMessage); #ifdef OBJECT_FILTERING // filtering else if (strucmp(aElementName,"acceptfilter")==0) expectString(fRemoteAcceptFilter); else if (strucmp(aElementName,"silentdiscard")==0) expectBool(fSilentlyDiscardUnaccepted); else if (strucmp(aElementName,"localdbfilter")==0) expectString(fLocalDBFilterConf); else if (strucmp(aElementName,"makepassfilter")==0) expectString(fMakePassFilter); else if (strucmp(aElementName,"invisiblefilter")==0) expectString(fInvisibleFilter); else if (strucmp(aElementName,"makevisiblefilter")==0) expectString(fMakeVisibleFilter); else if (strucmp(aElementName,"ds12filters")==0) expectBool(fDS12FilterSupport); else if (strucmp(aElementName,"daterangesupport")==0) expectBool(fDateRangeSupported); #endif #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"datastoreinitscript")==0) expectScript(fDBInitScript,aLine,&DBFuncTable); else if (strucmp(aElementName,"sentitemstatusscript")==0) expectScript(fSentItemStatusScript,aLine,&ErrorFuncTable); else if (strucmp(aElementName,"receiveditemstatusscript")==0) expectScript(fReceivedItemStatusScript,aLine,&ErrorFuncTable); else if (strucmp(aElementName,"alertscript")==0) expectScript(fAlertScript,aLine,&DBFuncTable); #ifdef SYSYNC_CLIENT else if (strucmp(aElementName,"alertprepscript")==0) expectScript(fAlertPrepScript,aLine,getClientDBFuncTable()); #endif else if (strucmp(aElementName,"datastorefinishscript")==0) expectScript(fDBFinishScript,aLine,&DBFuncTable); #endif #ifndef MINIMAL_CODE else if (strucmp(aElementName,"displayname")==0) expectString(fDisplayName); #endif // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TLocalDSConfig::localStartElement #endif // resolve void TLocalDSConfig::localResolve(bool aLastPass) { if (!fSyncModeBuffer.empty()) { fSyncModes.insert(fSyncModeBuffer); fSyncModeBuffer.clear(); } if (aLastPass) { #ifdef SCRIPT_SUPPORT TScriptContext *sccP = NULL; SYSYNC_TRY { // resolve all scripts in same context // - first script needed (when alert is created) #ifdef SYSYNC_CLIENT TScriptContext::resolveScript(getSyncAppBase(),fAlertPrepScript,sccP,NULL); #endif // - scripts needed when database is made ready TScriptContext::resolveScript(getSyncAppBase(),fDBInitScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fSentItemStatusScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fReceivedItemStatusScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fAlertScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fDBFinishScript,sccP,NULL); // - forget this context if (sccP) delete sccP; } SYSYNC_CATCH (...) if (sccP) delete sccP; SYSYNC_RETHROW; SYSYNC_ENDCATCH #endif } // resolve embedded fTypeSupport.Resolve(aLastPass); // resolve inherited inherited::localResolve(aLastPass); } // TLocalDSConfig::localResolve // - add type support to datatstore from config void TLocalDSConfig::addTypes(TLocalEngineDS *aDatastore, TSyncSession *aSessionP) { TSyncItemType *typeP; TSyncItemType *writetypeP; // preferred types, create instances only if not already existing // - preferred receive typeP = aSessionP->findLocalType(fTypeSupport.fPreferredRx); if (!typeP) { typeP = fTypeSupport.fPreferredRx->newSyncItemType(aSessionP,NULL); // local types are never exclusively related to a datastore aSessionP->addLocalItemType(typeP); // add to session } // - preferred send writetypeP = aSessionP->findLocalType(fTypeSupport.fPreferredTx); if (!writetypeP) { writetypeP = fTypeSupport.fPreferredTx->newSyncItemType(aSessionP,NULL); // local types are never exclusively related to a datastore aSessionP->addLocalItemType(writetypeP); } // - set preferred types aDatastore->setPreferredTypes(typeP,writetypeP); // additional types TAdditionalTypesList::iterator pos; for (pos=fTypeSupport.fAdditionalTypes.begin(); pos!=fTypeSupport.fAdditionalTypes.end(); pos++) { // - search for type already created from same config item typeP = aSessionP->findLocalType((*pos).datatypeconfig); if (!typeP) { // - does not exist yet, create the type typeP = (*pos).datatypeconfig->newSyncItemType(aSessionP,NULL); // local types are never exclusively related to a datastore // - add type to session types aSessionP->addLocalItemType(typeP); } // - add type to datastore's supported types aDatastore->addTypeSupport(typeP,(*pos).forRead,(*pos).forWrite); } #ifndef NO_REMOTE_RULES // rulematch types for (pos=fTypeSupport.fRuleMatchTypes.begin(); pos!=fTypeSupport.fRuleMatchTypes.end(); pos++) { // - search for type already created from same config item typeP = aSessionP->findLocalType((*pos).datatypeconfig); if (!typeP) { // - does not exist yet, create the type typeP = (*pos).datatypeconfig->newSyncItemType(aSessionP,NULL); // local types are never exclusively related to a datastore // - add type to session types aSessionP->addLocalItemType(typeP); } // - add type to datastore's rulematch types aDatastore->addRuleMatchTypeSupport(typeP,(*pos).remoteRuleMatch.c_str()); } #endif // now apply type limits // Note: this is usually derived, as limits are often defined within the datastore, // not the type itself (however, for hardcoded template-based fieldlists, // the limits are taken from the template, see TLocalDSConfig::addTypeLimits() addTypeLimits(aDatastore, aSessionP); } // TLocalDSConfig::addTypes // Add (probably datastore-specific) limits such as MaxSize and NoTruncate to types void TLocalDSConfig::addTypeLimits(TLocalEngineDS *aLocalDatastoreP, TSyncSession *aSessionP) { // add field size limitations from map to all types TSyncItemTypePContainer::iterator pos; TSyncItemTypePContainer *typesP = &(aLocalDatastoreP->fRxItemTypes); for (uInt8 i=0; i<2; i++) { for (pos=typesP->begin(); pos!=typesP->end(); pos++) { // apply default limits to type (e.g. from hard-coded template in config) (*pos)->addDefaultTypeLimits(); } typesP = &(aLocalDatastoreP->fTxItemTypes); } } // TLocalDSConfig::addTypeLimits // Check for alias names uInt16 TLocalDSConfig::isDatastoreAlias(cAppCharP aDatastoreURI) { // only servers have (and may need) aliases #ifdef SYSYNC_SERVER for (TStringList::iterator pos = fAliasNames.begin(); pos!=fAliasNames.end(); pos++) { if (*pos == aDatastoreURI) return (*pos).size(); // return size of match } #endif return 0; } // TLocalDSConfig::isDatastoreAlias /* * Implementation of TLocalEngineDS */ /// @Note InternalResetDataStore() must also be callable from destructor /// (care not to call other objects which will refer to the already /// half-destructed datastore!) void TLocalEngineDS::InternalResetDataStore(void) { // possibly complete, if not already done (should be, by engFinishDataStoreSync() !) if (fLocalDSState>dssta_idle) changeState(dssta_completed); // complete NOW, opportunity to show stats, etc. // switch down to idle changeState(dssta_idle); /// @todo obsolete: fState=dss_idle; fAbortStatusCode=LOCERR_OK; // not aborted yet fLocalAbortCause=true; // assume local cause fRemoteAddingStopped=false; fAlertCode=0; // not yet alerted /// Init Sync mode @ref dsSyncMode fSyncMode=smo_twoway; // default to twoway fForceSlowSync=false; fSlowSync=false; fRefreshOnly=false; fCacheData=false; fReadOnly=false; fReportUpdates=fDSConfigP->fReportUpdates; // update reporting according to what is configured fCanRestart=fDSConfigP->fCanRestart; fSyncModes=fDSConfigP->fSyncModes; fServerAlerted=false; fResuming=false; #ifdef SUPERDATASTORES fAsSubDatastoreOf=NULL; // is not a subdatastore #endif /// Init administrative data to defaults @ref dsAdminData // - last fLastRemoteAnchor.erase(); fLastLocalAnchor.erase(); // - current fNextRemoteAnchor.erase(); fNextLocalAnchor.erase(); // suspend state fResumeAlertCode=0; // none fPreventResuming=false; // suspend of chunked items fPartialItemState=pi_state_none; fLastSourceURI.erase(); fLastTargetURI.erase(); fLastItemStatus=0; fPITotalSize=0; fPIStoredSize=0; fPIUnconfirmedSize=0; if (fPIStoredDataAllocated) { smlLibFree(fPIStoredDataP); fPIStoredDataAllocated=false; } fPIStoredDataP=NULL; // other state info fFirstTimeSync=false; // not first sync by default #ifdef SYSYNC_CLIENT // - maps for add commands fPendingAddMaps.clear(); fUnconfirmedMaps.clear(); fLastSessionMaps.clear(); #endif #ifdef SYSYNC_SERVER PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "fTempGUIDMap: removing %ld items", (long)fTempGUIDMap.size() )); fTempGUIDMap.clear(); #endif /// Init type negotiation /// - for sending data fLocalSendToRemoteTypeP = NULL; fRemoteReceiveFromLocalTypeP = NULL; /// - for receiving data fLocalReceiveFromRemoteTypeP = NULL; fRemoteSendToLocalTypeP = NULL; /// Init Filtering @ref dsFiltering resetFiltering(); /// Init item processing @ref dsItemProcessing fSessionConflictStrategy=cr_duplicate; // will be updated later when sync mode is known fItemSizeLimit=-1; // no limit yet fCurrentSyncOp = sop_none; // will be set at engProcessItem() fEchoItemOp = sop_none; // will be set at engProcessItem() fItemConflictStrategy=fSessionConflictStrategy; // will be set at engProcessItem() fForceConflict = false; // will be set at engProcessItem() fDeleteWins = false; // will be set at engProcessItem() fRejectStatus = -1; // will be set at engProcessItem() #ifdef SCRIPT_SUPPORT // - delete the script context if any if (fSendingTypeScriptContextP) { delete fSendingTypeScriptContextP; fSendingTypeScriptContextP=NULL; } if (fReceivingTypeScriptContextP) { delete fReceivingTypeScriptContextP; fReceivingTypeScriptContextP=NULL; } if (fDataStoreScriptContextP) { delete fDataStoreScriptContextP; fDataStoreScriptContextP=NULL; } #endif /// Init other vars @ref dsOther /// Init Counters and statistics @ref dsCountStats // - NOC from remote fRemoteNumberOfChanges=-1; // none known yet // - data transferred fIncomingDataBytes=0; fOutgoingDataBytes=0; // - locally performed ops fLocalItemsAdded=0; fLocalItemsUpdated=0; fLocalItemsDeleted=0; fLocalItemsError=0; // - remotely performed ops fRemoteItemsAdded=0; fRemoteItemsUpdated=0; fRemoteItemsDeleted=0; fRemoteItemsError=0; #ifdef SYSYNC_SERVER // - conflicts fConflictsServerWins=0; fConflictsClientWins=0; fConflictsDuplicated=0; // - slow sync matches fSlowSyncMatches=0; #endif // Override defaults from ancestor // - generally, limit GUID size to reasonable size (even if we can // theoretically handle unlimited GUIDs in client, except for // some DEBUGPRINTF statements that will crash for example with // the brain-damaged GUIDs that Exchange server uses. fMaxGUIDSize = 64; } // TLocalEngineDS::InternalResetDataStore /// constructor TLocalEngineDS::TLocalEngineDS(TLocalDSConfig *aDSConfigP, TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask) : TSyncDataStore(aSessionP, aName, aCommonSyncCapMask) ,fPIStoredDataP(NULL) ,fPIStoredDataAllocated(false) #ifdef SCRIPT_SUPPORT ,fSendingTypeScriptContextP(NULL) // no associated script context ,fReceivingTypeScriptContextP(NULL) // no associated script context ,fDataStoreScriptContextP(NULL) // no datastore level context #endif ,fRemoteDatastoreP(NULL) // no associated remote { // set config ptr fDSConfigP = aDSConfigP; if (!fDSConfigP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TLocalEngineDS::TLocalEngineDS called with NULL config","lds1"))); /// Init Sync state @ref dsSyncState fLocalDSState=dssta_idle; // idle to begin with // now reset InternalResetDataStore(); } // TLocalEngineDS::TLocalEngineDS TLocalEngineDS::~TLocalEngineDS() { // reset everything InternalResetDataStore(); } // TLocalEngineDS::~TLocalEngineDS #ifdef SYDEBUG // return datastore state name cAppCharP TLocalEngineDS::getDSStateName(void) { return LocalDSStateNames[fLocalDSState]; } // TLocalEngineDS::getDSStateName // return datastore state name cAppCharP TLocalEngineDS::getDSStateName(TLocalEngineDSState aState) { return LocalDSStateNames[aState]; } // TLocalEngineDS::getDSStateName #endif // reset datastore (after use) void TLocalEngineDS::engResetDataStore(void) { // now reset // - logic layer and above dsResetDataStore(); // - myself InternalResetDataStore(); // - anchestors inherited::engResetDataStore(); } // TLocalEngineDS::engResetDataStore // check if this datastore is accessible with given URI // NOTE: By default, local datastore type is addressed with // first path element of URI, rest of path might be used // by derivates to subselect data folders etc. uInt16 TLocalEngineDS::isDatastore(const char *aDatastoreURI) { // extract base name string basename; analyzeName(aDatastoreURI,&basename); // compare only base name // - compare with main name int res = inherited::isDatastore(basename.c_str()); if (res==0) { // Not main name: compare with aliases res = fDSConfigP->isDatastoreAlias(basename.c_str()); } return res; } // TLocalEngineDS::isDatastore /// get DB specific error message text for dbg log, or empty string if none /// @return platform specific DB error text string TLocalEngineDS::lastDBErrorText(void) { string s; s.erase(); uInt32 err = lastDBError(); if (isDBError(err)) { StringObjPrintf(s," (DB specific error code = %ld)",(long)lastDBError()); } return s; } // TLocalEngineDS::lastDBErrorText #ifdef SYSYNC_CLIENT // - init Sync Parameters (client case) // Derivates might override this to pre-process and modify parameters // (such as adding client settings as CGI to remoteDBPath) bool TLocalEngineDS::dsSetClientSyncParams( TSyncModes aSyncMode, bool aSlowSync, const char *aRemoteDBPath, const char *aDBUser, const char *aDBPassword, const char *aLocalPathExtension, const char *aRecordFilterQuery, bool aFilterInclusive ) { // - set remote params fRemoteDBPath=aRemoteDBPath; AssignString(fDBUser,aDBUser); AssignString(fDBPassword,aDBPassword); // check for running under control of a superdatastore // - aRemoteDBPath might contain a special prefix: "remote", with "super" specifying the // name of a local superdatastore to run the sync with string opts; if (!fRemoteDBPath.empty() && fRemoteDBPath.at(0)=='<') { // we have an option prefix size_t pfxe = fRemoteDBPath.find('>', 1); if (pfxe!=string::npos) { // extract options opts.assign(fRemoteDBPath, 1, pfxe-1); // store remote path cleaned from options fRemoteDBPath.erase(0,pfxe+1); } } if (!opts.empty()) { #ifdef SUPERDATASTORES // For now, the only option withing angle brackets is the name of the superdatastore, so opts==superdatastorename // - look for superdatastore having the specified name TSuperDSConfig *superdscfgP = static_cast(getSession()->getSessionConfig()->getLocalDS(opts.c_str())); if (superdscfgP && superdscfgP->isAbstractDatastore()) { // see if we have an instance of this already fAsSubDatastoreOf = static_cast(getSession()->findLocalDataStore(superdscfgP)); if (fAsSubDatastoreOf) { // that superdatastore already exists, just override client sync params with those already set aSyncMode = fAsSubDatastoreOf->fSyncMode; aSlowSync = fAsSubDatastoreOf->fSlowSync; aRecordFilterQuery = fAsSubDatastoreOf->fRemoteRecordFilterQuery.c_str(); } else { // instantiate new superdatastore fAsSubDatastoreOf = static_cast(superdscfgP->newLocalDataStore(getSession())); if (fAsSubDatastoreOf) { fSessionP->fLocalDataStores.push_back(fAsSubDatastoreOf); // configure it with the same parameters as the subdatastore if (!fAsSubDatastoreOf->dsSetClientSyncParams( aSyncMode, aSlowSync, fRemoteDBPath.c_str(), // already cleaned from prefix aDBUser, aDBPassword, aLocalPathExtension, aRecordFilterQuery, aFilterInclusive )) return false; // failed } } if (fAsSubDatastoreOf) { // find link config for this superdatastore TSubDSLinkConfig *lcfgP = NULL; TSubDSConfigList::iterator pos; for(pos=superdscfgP->fSubDatastores.begin();pos!=superdscfgP->fSubDatastores.end();pos++) { if ((*pos)->fLinkedDSConfigP==fDSConfigP) { // this is the link lcfgP = *pos; break; } } if (lcfgP) { // now link into superdatastore fAsSubDatastoreOf->addSubDatastoreLink(lcfgP,this); } else { PDEBUGPRINTFX(DBG_ERROR,("Warning: '%s' is not a subdatastore of '%s'", getName(), opts.c_str())); return false; // failed } } } else { PDEBUGPRINTFX(DBG_ERROR,("Warning: No superdatastore name '%s' exists -> can't run '%s' under superdatastore control", opts.c_str(), getName())); return false; // failed } #endif // SUPERDATASTORES } // sync mode fSyncMode=aSyncMode; fSlowSync=aSlowSync; fRefreshOnly=fSyncMode==smo_fromserver; // here to make sure, should be set by setSyncMode(FromAlertCode) later anyway // DS 1.2 filters AssignString(fRemoteRecordFilterQuery,aRecordFilterQuery); fRemoteFilterInclusive=aFilterInclusive; // params // - build local path fLocalDBPath=URI_RELPREFIX; fLocalDBPath+=getName(); if (aLocalPathExtension && *aLocalPathExtension) { fLocalDBPath+='/'; fLocalDBPath+=aLocalPathExtension; } // - we have the params for syncing now return changeState(dssta_clientparamset)==LOCERR_OK; } // TLocalEngineDS::dsSetClientSyncParams #endif // SYSYNC_CLIENT // add support for more data types // (for programatically creating local datastores from specialized TSyncSession derivates) void TLocalEngineDS::addTypeSupport(TSyncItemType *aItemTypeP,bool aForRx, bool aForTx) { if (aForRx) fRxItemTypes.push_back(aItemTypeP); if (aForTx) fTxItemTypes.push_back(aItemTypeP); } // TLocalEngineDS::addTypeSupport #ifndef NO_REMOTE_RULES // add data type that overrides normal type selection if string matches active remote rule void TLocalEngineDS::addRuleMatchTypeSupport(TSyncItemType *aItemTypeP,cAppCharP aRuleMatchString) { TRuleMatchTypeEntry rme; rme.itemTypeP = aItemTypeP; rme.ruleMatchString = aRuleMatchString; fRuleMatchItemTypes.push_back(rme); } // TLocalEngineDS::addRuleMatchTypeSupport #endif TTypeVariantDescriptor TLocalEngineDS::getVariantDescForType(TSyncItemType *aItemTypeP) { // search in config for specific variant descriptor // - first check preferred rx if (fDSConfigP->fTypeSupport.fPreferredRx == aItemTypeP->getTypeConfig()) return fDSConfigP->fTypeSupport.fPrefRxVariantDescP; // - then check preferred tx if (fDSConfigP->fTypeSupport.fPreferredTx == aItemTypeP->getTypeConfig()) return fDSConfigP->fTypeSupport.fPrefTxVariantDescP; // - then check additional types TAdditionalTypesList::iterator pos; for (pos=fDSConfigP->fTypeSupport.fAdditionalTypes.begin(); pos!=fDSConfigP->fTypeSupport.fAdditionalTypes.end(); pos++) { if ((*pos).datatypeconfig == aItemTypeP->getTypeConfig()) return (*pos).variantDescP; } // none found return NULL; } // TLocalEngineDS::getVariantDescForType // - called when a item in the sync set changes its localID (due to local DB internals) void TLocalEngineDS::dsLocalIdHasChanged(const char *aOldID, const char *aNewID) { #ifdef SYSYNC_SERVER if (IS_SERVER) { // make sure remapped localIDs get updated as well TStringToStringMap::iterator pos; for (pos=fTempGUIDMap.begin(); pos!=fTempGUIDMap.end(); pos++) { if (pos->second == aOldID) { // update ID PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "fTempGUIDMap: updating mapping of %s from %s to %s", pos->first.c_str(), aOldID, aNewID )); pos->second = aNewID; break; } } } #endif // SYSYNC_SERVER } // TLocalEngineDS::dsLocalIdHasChanged #ifdef SYSYNC_SERVER // for received GUIDs (Map command), obtain real GUID (might be temp GUID due to maxguidsize restrictions) void TLocalEngineDS::obtainRealLocalID(string &aLocalID) { if (aLocalID.size()>0 && aLocalID[0]=='#') { // seems to be a temp GUID TStringToStringMap::iterator pos = fTempGUIDMap.find(aLocalID); if (pos!=fTempGUIDMap.end()) { // found temp GUID mapping, replace it PDEBUGPRINTFX(DBG_DATA,( "translated tempLocalID='%s' back to real localID='%s'", aLocalID.c_str(), (*pos).second.c_str() )); aLocalID = (*pos).second; } else { PDEBUGPRINTFX(DBG_ERROR,("No realLocalID found for tempLocalID='%s'",aLocalID.c_str())); } } } // TLocalEngineDS::obtainRealLocalID // for sending GUIDs (Add command), generate temp GUID which conforms to maxguidsize of remote datastore if needed void TLocalEngineDS::adjustLocalIDforSize(string &aLocalID, sInt32 maxguidsize, sInt32 prefixsize) { if (maxguidsize>0) { if (aLocalID.length()+prefixsize>(uInt32)maxguidsize) { //BCPPB needed unsigned cast // real GUID is too long, we need to create a temp #if SYDEBUG>1 // first check if there is already a mapping for it, // because on-disk storage can only hold one; also // saves space // TODO: implement this more efficiently than this O(N) search for (TStringToStringMap::const_iterator it = fTempGUIDMap.begin(); it != fTempGUIDMap.end(); ++it) { if (it->second == aLocalID) { // found an existing mapping! PDEBUGPRINTFX(DBG_ERROR,( "fTempGUIDMap: translated realLocalID='%s' to tempLocalID='%s' (reused?!)", aLocalID.c_str(), it->first.c_str() )); aLocalID = it->first; return; } } string tempguid; long counter = fTempGUIDMap.size(); // as list only grows, we have unique tempuids for sure while (true) { counter++; StringObjPrintf(tempguid,"#%ld",counter); if (fTempGUIDMap.find(tempguid) != fTempGUIDMap.end()) { PDEBUGPRINTFX(DBG_ERROR,( "fTempGUIDMap: '%s' not new?!", tempguid.c_str() )); } else { break; } } #else // rely on tempguid list only growing (which still holds true) string tempguid; StringObjPrintf(tempguid,"#%ld",(long)fTempGUIDMap.size()+1); // as list only grows, we have unique tempuids for sure #endif fTempGUIDMap[tempguid]=aLocalID; PDEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "fTempGUIDMap: translated realLocalID='%s' to tempLocalID='%s'", aLocalID.c_str(), tempguid.c_str() )); aLocalID=tempguid; } } } // TLocalEngineDS::adjustLocalIDforSize #endif // SYSYNC_SERVER // set Sync types needed for sending local data to remote DB void TLocalEngineDS::setSendTypeInfo( TSyncItemType *aLocalSendToRemoteTypeP, TSyncItemType *aRemoteReceiveFromLocalTypeP ) { fLocalSendToRemoteTypeP=aLocalSendToRemoteTypeP; fRemoteReceiveFromLocalTypeP=aRemoteReceiveFromLocalTypeP; } // TLocalEngineDS::setSendTypeInfo // set Sync types needed for receiving remote data in local DB void TLocalEngineDS::setReceiveTypeInfo( TSyncItemType *aLocalReceiveFromRemoteTypeP, TSyncItemType *aRemoteSendToLocalTypeP ) { fLocalReceiveFromRemoteTypeP=aLocalReceiveFromRemoteTypeP; fRemoteSendToLocalTypeP=aRemoteSendToLocalTypeP; } // TLocalEngineDS::setReceiveTypeInfo // - init usage of datatypes set with setSendTypeInfo/setReceiveTypeInfo localstatus TLocalEngineDS::initDataTypeUse(void) { localstatus sta = LOCERR_OK; // check compatibility if ( !fLocalSendToRemoteTypeP || !fLocalReceiveFromRemoteTypeP || !fLocalSendToRemoteTypeP->isCompatibleWith(fLocalReceiveFromRemoteTypeP) ) { // send and receive types not compatible sta = 415; PDEBUGPRINTFX(DBG_ERROR,("Incompatible send and receive types -> cannot sync (415)")); engAbortDataStoreSync(sta,true,false); // do not proceed with sync of this datastore, local problem, not resumable return sta; } #ifdef SCRIPT_SUPPORT // let types initialize themselves for being used by this datastore // - optimization: if both types are same, initialize only once if (fLocalSendToRemoteTypeP == fLocalReceiveFromRemoteTypeP) fLocalReceiveFromRemoteTypeP->initDataTypeUse(this,true,true); // send and receive else { fLocalSendToRemoteTypeP->initDataTypeUse(this,true,false); // for sending, not receiving fLocalReceiveFromRemoteTypeP->initDataTypeUse(this,false,true); // not sending, for receiving } #endif // ok return sta; } // TLocalEngineDS::initDataTypeUse // conflict resolution strategy. Conservative here TConflictResolution TLocalEngineDS::getConflictStrategy(bool aForSlowSync, bool aForFirstTime) { return aForSlowSync ? (aForFirstTime ? fDSConfigP->fFirstTimeStrategy : fDSConfigP->fSlowSyncStrategy) : fDSConfigP->fConflictStrategy; } // TLocalEngineDS::getConflictStrategy // add filter keywords and property names to filterCap void TLocalEngineDS::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps) { #ifdef OBJECT_FILTERING // add my own properties if (fDSConfigP->fDateRangeSupported) { addPCDataStringToList("BEFORE", &aFilterKeywords); addPCDataStringToList("SINCE", &aFilterKeywords); } // get default send type TSyncItemType *itemTypeP = fSessionP->findLocalType(fDSConfigP->fTypeSupport.fPreferredTx); TTypeVariantDescriptor variantDesc = NULL; doesUseType(itemTypeP, &variantDesc); // have it add it's keywords and properties itemTypeP->addFilterCapPropsAndKeywords(aFilterKeywords,aFilterProps,variantDesc); #endif } // TLocalEngineDS::addFilterCapPropsAndKeywords // reset all filter settings void TLocalEngineDS::resetFiltering(void) { #ifdef OBJECT_FILTERING // - dynamic sync set filter fSyncSetFilter.erase(); // - static filter fLocalDBFilter=fDSConfigP->fLocalDBFilterConf; // use configured localDB filter // - TAF filters #ifdef SYNCML_TAF_SUPPORT fTargetAddressFilter.erase(); // none from yet fIntTargetAddressFilter.erase(); // none from internal source (script) #endif #ifdef SYSYNC_TARGET_OPTIONS // - Other filtering options fDateRangeStart=0; // no date range fDateRangeEnd=0; fSizeLimit=-1; // no size limit fMaxItemCount=0; // no item count limit fNoAttachments=false; // attachments not suppressed fDBOptions.erase(); // no options #endif // - Filtering requirements fTypeFilteringNeeded=false; fFilteringNeededForAll=false; fFilteringNeeded=false; #endif // OBJECT_FILTERING } // TLocalEngineDS::resetFiltering #ifdef OBJECT_FILTERING /// @brief check single filter term for DS 1.2 filterkeywords. /// @return true if term still needs to be added to normal filter expression, false if term will be handled otherwise bool TLocalEngineDS::checkFilterkeywordTerm( cAppCharP aIdent, bool aAssignToMakeTrue, cAppCharP aOp, bool aCaseInsensitive, cAppCharP aVal, bool aSpecialValue, TSyncItemType *aItemTypeP ) { // show it to the datatype (if any) if (aItemTypeP) { if (!aItemTypeP->checkFilterkeywordTerm(aIdent, aAssignToMakeTrue, aOp, aCaseInsensitive, aVal, aSpecialValue)) return false; // type fully handles it, no need to check it further or add it to the filter expression } // we generally implement BEFORE and SINCE on the datastore level // This might not make sense depending on the actual datatype, but does not harm either #ifdef SYSYNC_TARGET_OPTIONS timecontext_t tctx; if (strucmp(aIdent,"BEFORE")==0) { if (ISO8601StrToTimestamp(aVal,fDateRangeEnd,tctx)) { TzConvertTimestamp(fDateRangeEnd,tctx,TCTX_UTC,getSessionZones(),fSessionP->fUserTimeContext); } else { PDEBUGPRINTFX(DBG_ERROR,("invalid ISO datetime for BEFORE: '%s'",aVal)); return true; // add it to filter, possibly this is not meant to be a filterkeyword } } else if (strucmp(aIdent,"SINCE")==0) { if (ISO8601StrToTimestamp(aVal,fDateRangeStart,tctx)) { TzConvertTimestamp(fDateRangeStart,tctx,TCTX_UTC,getSessionZones(),fSessionP->fUserTimeContext); } else { PDEBUGPRINTFX(DBG_ERROR,("invalid ISO datetime for SINCE: '%s'",aVal)); return true; // add it to filter, possibly this is not meant to be a filterkeyword } } else if (strucmp(aIdent,"MAXSIZE")==0) { if (StrToFieldinteger(aVal,fSizeLimit)==0) { PDEBUGPRINTFX(DBG_ERROR,("invalid integer for MAXSIZE: '%s'",aVal)); return true; // add it to filter, possibly this is not meant to be a filterkeyword } } else if (strucmp(aIdent,"MAXCOUNT")==0) { if (StrToULong(aVal,fMaxItemCount)==0) { PDEBUGPRINTFX(DBG_ERROR,("invalid integer for MAXSIZE: '%s'",aVal)); return true; // add it to filter, possibly this is not meant to be a filterkeyword } } else if (strucmp(aIdent,"NOATT")==0) { if (!StrToBool(aVal,fNoAttachments)==0) { PDEBUGPRINTFX(DBG_ERROR,("invalid boolean for NOATT: '%s'",aVal)); return true; // add it to filter, possibly this is not meant to be a filterkeyword } } else if (strucmp(aIdent,"DBOPTIONS")==0) { fDBOptions = aVal; // just get DB options } #endif else { // unknown identifier, add to filter expression return true; } // this term will be processed by special mechanism like fDateRangeStart/fDateRangeEnd // or fSizeLimit, so there is no need for normal filtering return false; // do not include into filter } // TLocalEngineDS::checkFilterkeywordTerm /// @brief parse "syncml:filtertype-cgi" filter, convert into internal filter syntax /// and possibly sets some special filter options (fDateRangeStart, fDateRangeEnd) /// based on "filterkeywords" available for the type passed (DS 1.2). /// For parsing DS 1.1/1.0 TAF-style filters, aItemType can be NULL, no type-specific /// filterkeywords can be parsed then. /// @return pointer to next character after processing (usually points to terminator) /// @param[in] aCGI the NUL-terminated filter string /// @param[in] aItemTypeP if not NULL, this is the item type the filter applies to const char *TLocalEngineDS::parseFilterCGI(cAppCharP aCGI, TSyncItemType *aItemTypeP, string &aFilter) { const char *p=aCGI, *q; sInt16 paraNest=0; // nested paranthesis string ident; char op[3]; char logop; string val; bool termtofilter; bool assigntomaketrue; bool specialvalue; bool caseinsensitive; PDEBUGPRINTFX(DBG_FILTER+DBG_EXOTIC,("Parsing syncml:filtertype-cgi filter: %s",aCGI)); aFilter.erase(); logop=0; while (p && *p) { if (aFilter.empty()) logop=0; // ignore logical operation that would be at beginning of an expression // skip spaces while (isspace(*p)) p++; // now we need an ident or paranthesis if (*p=='(') { if (logop) aFilter+=logop; // expression continues, we need the logop now logop=0; // now consumed paraNest++; aFilter+='('; p++; } else { // must be term: ident op val // - check special case pseudo-identifiers if (strucmp(p,"&LUID;",6)==0) { ident="LUID"; p+=6; } else { // normal identifier // - search end q=p; while (isalnum(*q) || *q=='[' || *q==']' || *q=='.' || *q=='_') q++; // - assign if (q==p) { PDEBUGPRINTFX(DBG_ERROR,("Expected identifier but found '%s'",p)); break; } ident.assign(p,q-p); p=q; } // skip spaces while (isspace(*p)) p++; // next must be comparison operator, possibly preceeded by modifiers op[0]=0; op[1]=0; op[2]=0; assigntomaketrue=false; specialvalue=false; caseinsensitive=false; // - check modifiers first if (*p==':') { assigntomaketrue=true; p++; } if (*p=='*') { specialvalue=true; p++; } if (*p=='^') { caseinsensitive=true; p++; } // - now OP either in internal form or as pseudo-entity if (*p=='>' || *p=='<') { // possible two-char ops (>=, <=, <>) op[0]=*p++; if (*p=='>' || *p=='=') { op[1]=*p++; } } else if (*p=='=' || *p=='%' || *p=='$') { // single char ops, just use them as is op[0]=*p++; } else if (*p=='&') { p++; if (tolower(*p)=='i') { caseinsensitive=true; p++; } if (strucmp(p,"eq;",3)==0) { op[0]='='; p+=3; } else if (strucmp(p,"gt;",3)==0) { op[0]='>'; p+=3; } else if (strucmp(p,"ge;",3)==0) { op[0]='>'; op[1]='='; p+=3; } else if (strucmp(p,"lt;",3)==0) { op[0]='<'; p+=3; } else if (strucmp(p,"le;",3)==0) { op[0]='<'; op[1]='='; p+=3; } else if (strucmp(p,"ne;",3)==0) { op[0]='<'; op[1]='>'; p+=3; } else if (strucmp(p,"con;",4)==0) { op[0]='%'; p+=4; } else if (strucmp(p,"ncon;",5)==0) { op[0]='$'; p+=5; } else { PDEBUGPRINTFX(DBG_ERROR,("Expected comparison operator pseudo-entity but found '%s'",p-1)); break; } } else { PDEBUGPRINTFX(DBG_ERROR,("Expected comparison operator but found '%s'",p)); break; } // next must be value // - check for special value cases if (strucmp(p,"&NULL;",6)==0) { // SyncML DS 1.2 p+=6; val='E'; specialvalue=true; } else if (strucmp(p,"&UNASSIGNED;",12)==0) { // Synthesis extension p+=12; val='U'; specialvalue=true; } else { val.erase(); } // - get value chars while (*p && *p!='&' && *p!='|' && *p!=')') { // value char, possibly hex escaped uInt16 c; if (*p=='%') { // convert from hex if (HexStrToUShort(p+1,c,2)==2) { p+=3; } else c=*p++; } else c=*p++; // add to value val += (char)c; } // value // now we have identifier, op and value // - check and possibly sort out filterkeyword terms termtofilter = checkFilterkeywordTerm(ident.c_str(),assigntomaketrue,op,caseinsensitive,val.c_str(),specialvalue,aItemTypeP); // - add to filter if not handled already by other mechanism if (termtofilter) { if (logop) aFilter+=logop; // if this is a continuation, add logical operator now aFilter += ident; if (assigntomaketrue) aFilter+=':'; if (specialvalue) aFilter+='*'; if (caseinsensitive) aFilter+='^'; aFilter += op; aFilter += val; } else { PDEBUGPRINTFX(DBG_FILTER+DBG_EXOTIC,( "checkFilterkeywordTerm(%s,%hd,%s,%hd,%s,%hd) prevents adding to filter", ident.c_str(),(uInt16)assigntomaketrue,op,(uInt16)caseinsensitive,val.c_str(),(uInt16)specialvalue )); if (logop) { PDEBUGPRINTFX(DBG_FILTER,("Ignored logical operation '%c' due to always-ANDed filterkeyword",logop)); } } // now check for continuation: optional closing paranthesis plus logical op // - closing paranthesis do { // skip spaces while (isspace(*p)) p++; if (*p!=')') break; if (paraNest==0) { // as we might parse filters as part of /fi() or /tf() options, // this is not an error but only means end of filter expression goto endFilter; } aFilter+=')'; paraNest--; p++; } while (true); // - logical op if (*p==0) break; // done else if (*p=='&') { logop=*p++; // if no entity matches, & by itself is treated as AND if (strucmp(p,"amp;",4)==0) { logop='&'; p+=4; } else if (strucmp(p,"and;",4)==0) { logop='&'; p+=4; } else if (strucmp(p,"or;",3)==0) { logop='|'; p+=3; } } else if (*p=='|') { logop='|'; } else { PDEBUGPRINTFX(DBG_ERROR,("Expected logical operator or end of filter but found '%s'",p)); break; } } // not opening paranthesis } // while not end of filter endFilter: PDEBUGPRINTFX(DBG_FILTER+DBG_EXOTIC,("Resulting internal filter: %s",aFilter.c_str())); // return pointer to terminating character return p; } // TLocalEngineDS::parseFilterCGI #endif // analyze database name void TLocalEngineDS::analyzeName( const char *aDatastoreURI, string *aBaseNameP, string *aTableNameP, string *aCGIP ) { const char *p,*q=NULL, *r; r=strchr(aDatastoreURI,'?'); p=strchr(aDatastoreURI,'/'); if (r && p>r) p=NULL; // if slash is in CGI, ignore it else q=p+1; // slash exclusive if (p!=NULL) { // we have more than just the first element if (aBaseNameP) aBaseNameP->assign(aDatastoreURI,p-aDatastoreURI); // rest is table name and probably CGI if (aTableNameP) { if (r) aTableNameP->assign(q,r-q); // we have CGI else *aTableNameP=q; // entire rest is tablename } } else { // no second path element, but possibly CGI // - assign base name if (aBaseNameP) { if (r) (*aBaseNameP).assign(aDatastoreURI,r-aDatastoreURI); // only up to CGI else (*aBaseNameP)=aDatastoreURI; // complete name } // - there is no table name if (aTableNameP) aTableNameP->erase(); } // return CGI (w/o question mark) if any if (aCGIP) { if (r) *aCGIP=r+1; else aCGIP->erase(); } } // TLocalEngineDS::analyzeName #ifdef SYSYNC_TARGET_OPTIONS // parses single option, returns pointer to terminating char of argument string // or NULL on error // Note: if aArguments is passed NULL, this is an option without arguments, // and an arbitrary non-NULL will be returned if parsing is ok const char *TLocalEngineDS::parseOption( const char *aOptName, const char *aArguments, bool aFromSyncCommand ) { #ifdef OBJECT_FILTERING if (strucmp(aOptName,"fi")==0) { if (!aArguments) return NULL; // make sync set filter expression string f; aArguments=parseFilterCGI(aArguments,fLocalSendToRemoteTypeP,f); // if type being used for sending to remote is known here, use it if (!aFromSyncCommand) { addToFilter(f.c_str(),fSyncSetFilter,false); // AND chaining // call this once to give derivate a chance to see if it can filter the now set fSyncSetFilter engFilteredFetchesFromDB(true); } return aArguments; // end of filter pattern } #ifdef SYNCML_TAF_SUPPORT else if (strucmp(aOptName,"tf")==0) { if (!aArguments) return NULL; // make temporary filter (or TAF) expression aArguments=parseFilterCGI(aArguments,fLocalSendToRemoteTypeP,fTargetAddressFilter); // if type being used for sending to remote is known here, use it // Note: TAF filters are always evaluated internally as we need all SyncSet records // regardless of possible TAF suppression (for slowsync matching etc.) return aArguments; // end of filter pattern } #endif else if (aArguments && strucmp(aOptName,"dr")==0) { // date range limit sInt16 dstart,dend; if (sscanf(aArguments,"%hd,%hd",&dstart,&dend)==2) { // - find end of arguments aArguments=strchr(aArguments,')'); // - calculate start and end fDateRangeStart=getSystemNowAs(TCTX_UTC,getSessionZones()); fDateRangeEnd=fDateRangeStart; // - now use offsets fDateRangeStart+=dstart*linearDateToTimeFactor; fDateRangeEnd+=dend*linearDateToTimeFactor; return aArguments; } else return NULL; } else if (aArguments && strucmp(aOptName,"li")==0) { // size limit sInt16 n=StrToFieldinteger(aArguments,fSizeLimit); if (n>0) { // - find end of arguments aArguments+=n; return aArguments; } else return NULL; } else if (!aArguments && strucmp(aOptName,"na")==0) { // no attachments fNoAttachments=true; return (const char *)1; // non-zero } else if (aArguments && strucmp(aOptName,"max")==0) { // maximum number of items (for email for example) sInt16 n=StrToULong(aArguments,fMaxItemCount); if (n>0) { // - find end of arguments aArguments+=n; return aArguments; } else return NULL; } else #endif #ifdef SYSYNC_SERVER if (IS_SERVER && !aArguments && strucmp(aOptName,"slow")==0) { // force a slow sync PDEBUGPRINTFX(DBG_HOT,("Slowsync forced by CGI-option in db path")); fForceSlowSync=true; return (const char *)1; // non-zero } else #endif // SYSYNC_SERVER if (aArguments && strucmp(aOptName,"o")==0) { // datastore options // - find end of arguments const char *p=strchr(aArguments,')'); if (p) fDBOptions.assign(aArguments,p-aArguments); return p; } else return NULL; // not parsed } // TLocalEngineDS::parseOption #endif // parse options localstatus TLocalEngineDS::engParseOptions( const char *aTargetURIOptions, // option string contained in target URI bool aFromSyncCommand // must be set when parsing options from target URI ) { localstatus sta=LOCERR_OK; if (aTargetURIOptions) { const char *p = aTargetURIOptions; #ifdef SYSYNC_TARGET_OPTIONS const char *q; #endif char c; string taf; // official TAF while ((c=*p)) { #ifdef SYSYNC_TARGET_OPTIONS if (c=='/') { // proprietary option lead-in // - get option name string optname; optname.erase(); while(isalnum(c=*(++p))) optname+=c; // - get arguments if (c=='(') { q=p; // save p++; // skip "(" p=parseOption(optname.c_str(),p,aFromSyncCommand); if (!p) { // unrecognized or badly formatted option, just add it to TAF taf+='/'; taf+=optname; p=q; // restart after option name continue; } if (*p!=')') { sta=406; PDEBUGPRINTFX(DBG_ERROR,("Syntax error in target options")); break; } } else { // option without arguments if (!parseOption(optname.c_str(),NULL,aFromSyncCommand)) { sta=406; PDEBUGPRINTFX(DBG_ERROR,("Unknown target option")); break; } // error, not parsed p--; // will be incremented once again below } } else #endif { // char not part of an option taf+=c; } // next p++; } // check if we have TAF if (taf.size()>0) { #if defined(TAF_AS_SYNCSETFILTER) && defined(SYSYNC_TARGET_OPTIONS) // treat as "fi()" option like before 1.0.8.10 if (!parseOption("fi",taf.c_str(),aFromSyncCommand)) { sta=406; } // error, not parsed #else #ifdef SYNCML_TAF_SUPPORT // treat as "tf()" = real TAF if (!parseOption("tf",taf.c_str(),aFromSyncCommand)) { sta=406; } // error, not parsed #else sta=406; PDEBUGPRINTFX(DBG_ERROR,("TAF not supported")); #endif #endif } } // return status return sta; } // TLocalEngineDS::engParseOptions // process SyncML 1.2 style filter localstatus TLocalEngineDS::engProcessDS12Filter(SmlFilterPtr_t aTargetFilter) { localstatus sta=LOCERR_OK; if (aTargetFilter) { // check general availability #ifdef OBJECT_FILTERING if (!fDSConfigP->fDS12FilterSupport) #endif { PDEBUGPRINTFX(DBG_ERROR,("DS 1.2 style filtering is not available or disabled in config ()")); sta=406; goto error; } // check filter TSyncItemType *itemTypeP=NULL; // no associated type so far bool inclusiveFilter=false; // default is EXCLUSIVE // - meta if (aTargetFilter->meta) { SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(aTargetFilter->meta); const char *typestr = smlMetaTypeToCharP(metaP); // get sync item type for it // - filter mostly applies to items SENT, so we search these first itemTypeP = getSendType(typestr,NULL); if (!itemTypeP) itemTypeP = getReceiveType(typestr,NULL); PDEBUGPRINTFX(DBG_FILTER,("DS12 is '%s' -> %sfound",typestr,itemTypeP ? "" : "NOT ")); if (!itemTypeP) { sta=415; goto error; } } // - filtertype if (aTargetFilter->filtertype) { const char *ftystr = smlPCDataToCharP(aTargetFilter->filtertype); if (strucmp(ftystr,SYNCML_FILTERTYPE_INCLUSIVE)==0) { inclusiveFilter=true; } else if (strucmp(ftystr,SYNCML_FILTERTYPE_EXCLUSIVE)==0) { inclusiveFilter=false; } else { PDEBUGPRINTFX(DBG_ERROR,("Invalid '%s'",ftystr)); sta=422; goto error; } } // - field level filter if (aTargetFilter->field) { /// @todo %%% to be implemented PDEBUGPRINTFX(DBG_ERROR,("Field-level filtering not supported")); sta=406; goto error; } // - record level filter if (aTargetFilter->record) { #ifdef OBJECT_FILTERING SmlItemPtr_t recordItemP = aTargetFilter->record->item; if (recordItemP) { // - check grammar const char *grammarstr = smlMetaTypeToCharP(smlPCDataToMetInfP(recordItemP->meta)); if (strucmp(grammarstr,SYNCML_FILTERTYPE_CGI)!=0) { PDEBUGPRINTFX(DBG_ERROR,("Invalid filter grammar '%s'",grammarstr)); sta=422; goto error; } // now get the actual filter string const char *filterstring = smlPCDataToCharP(recordItemP->data); PDEBUGPRINTFX(DBG_HOT,( "Remote specified %sCLUSIVE filter query: '%s'", inclusiveFilter ? "IN" : "EX", filterstring )); if (*filterstring) { string f; // parse it filterstring = parseFilterCGI(filterstring,itemTypeP,f); if (*filterstring) { // not read to end PDEBUGPRINTFX(DBG_ERROR,("filter query syntax error at: '%s'",filterstring)); sta=422; goto error; } /// @todo: %%% check if this is correct interpretation // - exclusive is what we used to call "sync set" filtering // - inclusive seems to be former TAF if (inclusiveFilter) { // INCLUSIVE #ifdef SYNCML_TAF_SUPPORT fTargetAddressFilter=f; #else PDEBUGPRINTFX(DBG_ERROR,("This SyncML engine version has no INCLUSIVE filter support")); #endif } else { // EXCLUSIVE addToFilter(f.c_str(),fSyncSetFilter,false); // AND chaining PDEBUGPRINTFX(DBG_FILTER,("complete sync set filter is now: '%s'",fSyncSetFilter.c_str())); // call this once to give derivate a chance to see if it can filter the now set fSyncSetFilter engFilteredFetchesFromDB(true); } } } // if item #else // no object filtering PDEBUGPRINTFX(DBG_ERROR,("This SyncML engine version has no filter support (only PRO has)")); sta=406; goto error; #endif } // record } // filter at all error: return sta; } // TLocalEngineDS::engProcessDS12Filter // process Sync alert from remote party: check if alert code is supported, // check if slow sync is needed due to anchor mismatch // - server case: also generate appropriate Alert acknowledge command TAlertCommand *TLocalEngineDS::engProcessSyncAlert( TSuperDataStore *aAsSubDatastoreOf, // if acting as subdatastore uInt16 aAlertCode, // the alert code const char *aLastRemoteAnchor, // last anchor of remote const char *aNextRemoteAnchor, // next anchor of remote const char *aTargetURI, // target URI as sent by remote, no processing at all const char *aIdentifyingTargetURI, // target URI that was used to identify datastore const char *aTargetURIOptions, // option string contained in target URI SmlFilterPtr_t aTargetFilter, // DS 1.2 filter, NULL if none const char *aSourceURI, // source URI TStatusCommand &aStatusCommand // status that might be modified ) { TAlertCommand *alertcmdP=NULL; localstatus sta=LOCERR_OK; SYSYNC_TRY { if (IS_SERVER) { // save the identifying URI fIdentifyingDBName = aIdentifyingTargetURI; } // determine status of read-only option fReadOnly= fSessionP->getReadOnly() || // session level read-only flag (probably set by login) fDSConfigP->fReadOnly; // or datastore config #ifdef SUPERDATASTORES // if running as subdatastore of a superdatastore already, this call mus be from a superdatastore as well (aAsSubDatastoreOf!=NULL) // Note: On a client, fAsSubDatastoreOf is set earlier in dsSetClientSyncParams() // On a server, fAsSubDatastoreOf will be set now to avoid alerting as sub- and normal datastore at the same time. if (fAsSubDatastoreOf && !aAsSubDatastoreOf) { // bad, cannot be alerted directly AND as subdatastore aStatusCommand.setStatusCode(400); ADDDEBUGITEM(aStatusCommand,"trying to alert already alerted subdatastore"); PDEBUGPRINTFX(DBG_ERROR,("Already alerted as subdatastore of '%s'",fAsSubDatastoreOf->getName())); return NULL; } // set subdatastore mode fAsSubDatastoreOf = aAsSubDatastoreOf; #endif // reset type info fLocalSendToRemoteTypeP = NULL; fLocalReceiveFromRemoteTypeP = NULL; fRemoteReceiveFromLocalTypeP=NULL; fRemoteSendToLocalTypeP=NULL; // prepare database-level scripts // NOTE: in client case, alertprepscript is already rebuilt here! #ifdef SCRIPT_SUPPORT TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fDSConfigP->fDBInitScript,fDataStoreScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fDSConfigP->fSentItemStatusScript,fDataStoreScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fDSConfigP->fReceivedItemStatusScript,fDataStoreScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fDSConfigP->fAlertScript,fDataStoreScriptContextP,fSessionP); TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fDSConfigP->fDBFinishScript,fDataStoreScriptContextP,fSessionP,true); // now instantiate vars #endif // NOTE for client case: // ALL instantiated datastores have already sent an Alert to the server by now here // check DS 1.2 sta = engProcessDS12Filter(aTargetFilter); if (sta != LOCERR_OK) { aStatusCommand.setStatusCode(sta); ADDDEBUGITEM(aStatusCommand,"Invalid in target options"); return NULL; // error in options } // Filter CGI is now a combination of TAF and Synthesis-Style // extras (options). if (aTargetURIOptions && *aTargetURIOptions) { // there are target address options (such as filter CGI and TAF) sta = engParseOptions(aTargetURIOptions,false); if (sta != LOCERR_OK) { aStatusCommand.setStatusCode(sta); ADDDEBUGITEM(aStatusCommand,"Invalid CGI target URI options"); return NULL; // error in options } } if (IS_SERVER) { // server case: initially we are not in refresh only mode. Alert code or alert script could change this fRefreshOnly=false; fCacheData=false; } // save it for suspend and reference in scripts fAlertCode=aAlertCode; #ifdef SCRIPT_SUPPORT // call the alert script, which might want to force a slow sync and/or a server sync set zap TScriptContext::execute( fDataStoreScriptContextP, fDSConfigP->fAlertScript, &DBFuncTable, this // caller context ); aAlertCode=fAlertCode; // get possibly modified version back (SETALERTCODE) #endif // if we process a sync alert now, we haven't started sync or map generation #ifdef SYSYNC_SERVER if (IS_SERVER) { // server case: forget Temp GUID mapping // make sure we are not carrying forward any left-overs. Last sessions's tempGUID mappings that are // needed for "early map" resolution might be loaded by the call to engInitSyncAnchors below. // IMPORTANT NOTE: the tempGUIDs that might get loaded will become invalid as soon as // starts - so fTempGUIDMap needs to be cleared again as soon as the first command arrives from the client. fTempGUIDMap.clear(); } #endif // save remote's next anchor for saving at end of session fNextRemoteAnchor = aNextRemoteAnchor; // get target info in case we are server #ifdef SYSYNC_SERVER if (IS_SERVER) { // now get anchor info out of database // - make sure other anchor variables are set sta = engInitSyncAnchors( aIdentifyingTargetURI, // use processed form, not as sent by remote aSourceURI ); if (sta!=LOCERR_OK) { // error getting anchors aStatusCommand.setStatusCode(syncmlError(sta)); PDEBUGPRINTFX(DBG_ERROR,("Could not get Sync Anchor info, status=%hd",sta)); return NULL; // no alert to send back } // Server ok until here PDEBUGPRINTFX(DBG_PROTO,( "Saved Last Remote Client Anchor='%s', received Remote Client Anchor='%s' (must match for normal sync)", fLastRemoteAnchor.c_str(), aLastRemoteAnchor )); PDEBUGPRINTFX(DBG_PROTO,( "Received Remote Client Anchor='%s' (to be compared with in NEXT session)", fNextRemoteAnchor.c_str() )); PDEBUGPRINTFX(DBG_PROTO,( "(Saved) Last Local Server Anchor='%s', (generated) Next Local Server Anchor='%s' (sent to client as / in )", fLastLocalAnchor.c_str(), fNextLocalAnchor.c_str() )); } #endif #ifdef SYSYNC_CLIENT if (IS_CLIENT) { // Client ok until here PDEBUGPRINTFX(DBG_PROTO,( "Saved Last Remote Server Anchor='%s', received Remote Server Anchor='%s' (must match for normal sync)", fLastRemoteAnchor.c_str(), aLastRemoteAnchor )); PDEBUGPRINTFX(DBG_PROTO,( "Received Remote Server Anchor='%s' (to be compared with in NEXT session)", fNextRemoteAnchor.c_str() )); } #endif PDEBUGPRINTFX(DBG_PROTO,( "(Saved) fResumeAlertCode = %hd (valid for >DS 1.2 only)", fResumeAlertCode )); // Now check for resume // - default to what was actually alerted uInt16 effectiveAlertCode=aAlertCode; #ifdef SYSYNC_SERVER if (IS_SERVER) { // - check if resuming server session fResuming=false; if (aAlertCode==225) { if (fSessionP->getSyncMLVersion()fLenientMode && IS_CLIENT) #endif ) ) || // either anchors must match (or lenient mode for client)... (fResuming && *aLastRemoteAnchor==0) // ...or in case of resume, remote not sending anchor is ok as well ) && !fForceSlowSync // ...but no force for slowsync may be set internally ) || fSlowSync // if slow sync is requested by the remote anyway, we don't need to be in sync anyway, so just go on ) { if (!(fLastRemoteAnchor==aLastRemoteAnchor) && fSessionP->fLenientMode) { PDEBUGPRINTFX(DBG_ERROR,("Warning - remote anchor mismatch but tolerated in lenient mode")); } // sync state ok or Slow sync requested anyway: #ifdef SYSYNC_SERVER if (IS_SERVER) { // we can generate Alert with same code as sent // %%% Note: this is not entirely clear, as SCTS sends // corresponding SERVER ALERTED code back. // Specs suggest that we send the code back unmodified uInt16 alertCode = getSyncStateAlertCode(fServerAlerted); alertcmdP = new TAlertCommand(fSessionP,this,alertCode); fAlertCode=alertCode; // save it for reference in scripts and for suspend/resume } #endif } else { // switch to slow sync fSlowSync=true; PDEBUGPRINTFX(DBG_HOT,("Switched to SlowSync because of Anchor mismatch or server-side user option")); CONSOLEPRINTF(("- switched to SlowSync because of Sync Anchor mismatch")); // sync state not ok, we need slow sync aStatusCommand.setStatusCode(508); // Refresh required // update effective alert code uInt16 alertCode = getSyncStateAlertCode(false); fAlertCode=alertCode; // save it for reference in scripts and for suspend // NOTE: if client detected slow-sync not before here, status 508 alone // (without another Alert 201 sent to the server) is sufficient for // server to switch to slow sync. if (IS_SERVER) { // generate Alert for Slow sync alertcmdP = new TAlertCommand(fSessionP,this,alertCode); } } // Now we are alerted for a sync // - reset item counters fItemsSent = 0; fItemsReceived = 0; #ifdef SYSYNC_SERVER if (IS_SERVER) { // Server case // - show info PDEBUGPRINTFX(DBG_HOT,( "ALERTED from client for %s%s%s Sync", fResuming ? "resumed " : "", fSlowSync ? "slow" : "normal", fFirstTimeSync ? " first time" : "" )); // server: add Item with Anchors and URIs SmlItemPtr_t itemP = newItem(); // - anchors itemP->meta=newMetaAnchor(fNextLocalAnchor.c_str(),fLastLocalAnchor.c_str()); // - MaxObjSize here again to make SCTS happy if ( (fSessionP->getRootConfig()->fLocalMaxObjSize>0) && (fSessionP->getSyncMLVersion()>=syncml_vers_1_1) ) { // SyncML 1.1 has object size and we need to put it here for SCTS smlPCDataToMetInfP(itemP->meta)->maxobjsize=newPCDataLong( fSessionP->getRootConfig()->fLocalMaxObjSize ); } // - URIs (reversed from what was received in Alert) itemP->source=newLocation(aTargetURI); // use unprocessed form as sent by remote itemP->target=newLocation(aSourceURI); // - add to alert command alertcmdP->addItem(itemP); // - set new state, alert now answered changeState(dssta_serveransweredalert,true); // force it } // server case #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT if (IS_CLIENT) { // Client case // - now sync mode is stable (late switch to slowsync has now occurred if any) changeState(dssta_syncmodestable,true); // - show info PDEBUGPRINTFX(DBG_HOT,( "ALERTED from server for %s%s%s Sync", fResuming ? "resumed " : "", fSlowSync ? "slow" : "normal", fFirstTimeSync ? " first time" : "" )); } // client Case #endif // SYSYNC_CLIENT } // clear partial item if we definitely know we are not resuming if (!fResuming) { // not resuming - prevent that partial item is used in TSyncOpCommand fPartialItemState=pi_state_none; // free this space early (would be freed at session end anyway, but we don't need it any more now) if (fPIStoredDataAllocated) { smlLibFree(fPIStoredDataP); fPIStoredDataAllocated=false; } fPIStoredDataP=NULL; } // save name how remote adresses local database // (for sending same URI back in own Sync) fRemoteViewOfLocalURI = aTargetURI; // save it if (IS_SERVER) { fRemoteDBPath = aSourceURI; } if (sta!=LOCERR_OK) { // no alert command if (alertcmdP) delete alertcmdP; alertcmdP=NULL; aStatusCommand.setStatusCode(syncmlError(sta)); PDEBUGPRINTFX(DBG_HOT,("engProcessSyncAlert failed with status=%hd",sta)); } } SYSYNC_CATCH (...) // clean up locally owned objects if (alertcmdP) delete alertcmdP; SYSYNC_RETHROW; SYSYNC_ENDCATCH // return alert command, if any return alertcmdP; } // TLocalEngineDS::engProcessSyncAlert // process status received for sync alert bool TLocalEngineDS::engHandleAlertStatus(TSyError aStatusCode) { bool handled=false; if (IS_CLIENT) { // for client, make sure we have just sent the alert if (!testState(dssta_clientsentalert,true)) return false; // cannot switch if server not alerted // anyway, we have seen the status changeState(dssta_clientalertstatused,true); // force it } else { // for server, check if client did combined init&sync if (fLocalDSState>=dssta_syncmodestable) { // must be combined init&sync if (aStatusCode!=200) { // everything except ok is not allowed here PDEBUGPRINTFX(DBG_ERROR,("In combined init&sync, Alert status must be ok (but is %hd)",aStatusCode)); dsAbortDatastoreSync(400,false); // remote problem } // aborted or not, status is handled return true; } // normal case with separate init: we need to have answered the alert here if (!testState(dssta_serveransweredalert,true)) return false; // cannot switch if server not alerted } // server case // now check status code if (aStatusCode==508) { // remote party needs slow sync PDEBUGPRINTFX(DBG_HOT,("engHandleAlertStatus: Remote party needs SlowSync, switching to slowsync (AFTER alert, cancelling possible Resume)")); // Note: in server and client cases, this mode change may happen AFTER alert command exchange // - switch to slow sync fSlowSync=true; // - if we are late-forced to slow sync, this means that this cannot be a resume fResuming=false; // - update effective alert code that will be saved when this session gets suspended fAlertCode=getSyncStateAlertCode(fServerAlerted); handled=true; } else if (aStatusCode==200) { handled=true; } if (IS_CLIENT) { // check for resume override by server if (!handled && fResuming) { // we have requested resume if (aStatusCode==509) { // resume not accepted by server, but overridden by another sync type fResuming=false; PDEBUGPRINTFX(DBG_ERROR,("engHandleAlertStatus: Server rejected Resume")); handled=true; } } } else { // if we have handled it here, sync mode is now stable if (handled) { // if we get that far, sync mode for server is now stable AND we can receive cached maps changeState(dssta_syncmodestable,true); // force it, sync mode is now stable, no further changes are possible } } // no other status codes are supported at the datastore level if (!handled && aStatusCode>=400) { engAbortDataStoreSync(aStatusCode, false); // remote problem handled=true; } return handled; // status handled } // TLocalEngineDS::engHandleAlertStatus // initialize reception of syncop commands for datastore // Note: previously, this was implemented as initLocalDatastoreSync in syncsession localstatus TLocalEngineDS::engInitForSyncOps( const char *aRemoteDatastoreURI // URI of remote datastore ) { localstatus sta = LOCERR_OK; // no default types TSyncItemType *LocalSendToRemoteTypeP=NULL; // used by local to send to remote TSyncItemType *RemoteReceiveFromLocalTypeP=NULL; // used by remote to receive from local TSyncItemType *LocalReceiveFromRemoteTypeP=NULL; // used by local to receive from remote TSyncItemType *RemoteSendToLocalTypeP=NULL; // used by remote to send to local // Now determine remote datastore // Note: It might be that this was called already earlier in the session, so // the link between local and remote datastore might already exist if (fRemoteDatastoreP==NULL) { // try to locate it by name and set it - in case of superdatastore, it will be set in all subdatastores engSetRemoteDatastore(fSessionP->findRemoteDataStore(aRemoteDatastoreURI)); } else { // There is a remote datastore already associated #ifdef SYDEBUG // - make a sanity check to see if sepcified remote URI matches if(fRemoteDatastoreP!=fSessionP->findRemoteDataStore(aRemoteDatastoreURI)) { PDEBUGPRINTFX(DBG_ERROR,( "Warning: Received remote DS LocURI '%s' does not match already associated DS '%s'. We use the associated DS.", aRemoteDatastoreURI, fRemoteDatastoreP->getName() )); } #endif } // Now create a dummy remote data store for a blind sync attempt if (!fRemoteDatastoreP) { // no such remote datastore for this local datastore known, create one (or fail) #ifdef REMOTE_DS_MUST_BE_IN_DEVINF if (fSessionP->fRemoteDataStoresKnown) { // we have received devinf, but still can't find remote data store: error // Note: we had to disable this because of bugs in smartner server PDEBUGPRINTFX(DBG_ERROR,("Remote datastore name '%s' not found in received DevInf",aRemoteDatastoreURI)); return 404; } else #else if (fSessionP->fRemoteDataStoresKnown) { // we have received devinf, but still can't find remote data store: // just show in log, but continue as if there was no devInf received at all PDEBUGPRINTFX(DBG_ERROR,("Warning: Remote datastore name '%s' not found in received DevInf.",aRemoteDatastoreURI)); } #endif { // We couldn't retrieve DevInf (or !REMOTE_DS_MUST_BE_IN_DEVINF), so we have to try blind // - check remote specifics here if we had no devinf (there might be default remote // rules to apply or checking license restrictions // - this is executed only once per session, after that, we'll be fRemoteDevInfLock-ed if (!fSessionP->fRemoteDevInfKnown && !fSessionP->fRemoteDevInfLock) { // detect client specific server behaviour if needed sta = fSessionP->checkRemoteSpecifics(NULL, NULL); fSessionP->remoteAnalyzed(); // analyzed now (accepted or not does not matter) if (sta!=LOCERR_OK) return sta; // not ok, device rejected } // default data types are those preferred by local datastore (or explicitly marked for blind sync attempts) if (getDSConfig()->fTypeSupport.fPreferredLegacy) { // we have a preferred type for blind sync attempts LocalSendToRemoteTypeP = getSession()->findLocalType(getDSConfig()->fTypeSupport.fPreferredLegacy); LocalReceiveFromRemoteTypeP = LocalSendToRemoteTypeP; } else { // no specific "blind" preference, use my own normally preferred types LocalSendToRemoteTypeP = getPreferredTxItemType(); // send in preferred tx type of local datastore LocalReceiveFromRemoteTypeP = getPreferredRxItemType(); // receive in preferred rx type of local datastore } // same type on both end (as only local type exists) RemoteReceiveFromLocalTypeP = LocalSendToRemoteTypeP; // same on both end RemoteSendToLocalTypeP = LocalReceiveFromRemoteTypeP; // same on both end (as only local type exists) // create "remote" datastore with matching properties to local one PDEBUGPRINTFX(DBG_ERROR,("Warning: No DevInf for remote datastore, running blind sync attempt")); TRemoteDataStore *remDsP; MP_NEW(remDsP,DBG_OBJINST,"TRemoteDataStore",TRemoteDataStore( fSessionP, aRemoteDatastoreURI, // remote name of datastore 0 // standard Sync caps )); // - set it (in case of superdatastore in all subdatastores as well) engSetRemoteDatastore(remDsP); // add type support fRemoteDatastoreP->setPreferredTypes( RemoteReceiveFromLocalTypeP, // remote receives in preferred tx type of local datastore RemoteSendToLocalTypeP // remote sends in preferred rx type of local datastore ); // add it to the remote datastore list fSessionP->fRemoteDataStores.push_back(fRemoteDatastoreP); // make sure late devInf arriving won't supersede our artificially created remote datastore any more fSessionP->fRemoteDevInfLock=true; } } else { // found remote DB, determine default data exchange types // - common types for sending data to remote LocalSendToRemoteTypeP=getTypesForTxTo(fRemoteDatastoreP,&RemoteReceiveFromLocalTypeP); // - common types for receiving data from remote LocalReceiveFromRemoteTypeP=getTypesForRxFrom(fRemoteDatastoreP,&RemoteSendToLocalTypeP); } #ifndef NO_REMOTE_RULES // check if rule match type will override what we found so far if (!fSessionP->fActiveRemoteRules.empty()) { // have a look at our rulematch types TRuleMatchTypesContainer::iterator pos; TSyncItemType *ruleMatchTypeP = NULL; for (pos=fRuleMatchItemTypes.begin();pos!=fRuleMatchItemTypes.end();++pos) { // there is a rule applied // - parse match string in format "rule[,rule]..." with * and ? wildcards allowed in "rule" cAppCharP p=(*pos).ruleMatchString; while (*p!=0) { // split at commas cAppCharP e=strchr(p,','); size_t n; if (e) { n=e-p; e++; } else { n=strlen(p); e=p+n; } // see if that matches with any of the active rules TRemoteRulesList::iterator apos; for(apos=fSessionP->fActiveRemoteRules.begin();apos!=fSessionP->fActiveRemoteRules.end();apos++) { if (strwildcmp((*apos)->getName(), p, 0, n)==0) { ruleMatchTypeP=(*pos).itemTypeP; // get the matching type break; } } if (ruleMatchTypeP) break; // found a rule match type // test next match target p=e; } // apply if found one already if (ruleMatchTypeP) { // use this instead of normal types // - local types LocalSendToRemoteTypeP=ruleMatchTypeP; // used by local to send to remote LocalReceiveFromRemoteTypeP=ruleMatchTypeP; // used by local to receive from remote // Find matching remote types // - first look for existing remote type with same config as local one TSyncItemType *remCorrTypeP = fSessionP->findRemoteType(ruleMatchTypeP->getTypeConfig(),fRemoteDatastoreP); // - if none found, create one and have it inherit the CTCap options of the generic version that is already there if (!remCorrTypeP) { // none found: need to create one remCorrTypeP = ruleMatchTypeP->newCopyForSameType(fSessionP,fRemoteDatastoreP); if (remCorrTypeP) { // - get generic remote type (the one that might have received CTCap already) TSyncItemType *remGenericTypeP = fRemoteDatastoreP->getSendType(ruleMatchTypeP); // - copy options if (remGenericTypeP) remCorrTypeP->copyCTCapInfoFrom(*remGenericTypeP); } } // now assign RemoteReceiveFromLocalTypeP=remCorrTypeP; RemoteSendToLocalTypeP=remCorrTypeP; // Show that we are using ruleMatch type PDEBUGPRINTFX(DBG_DATA+DBG_HOT,( "An active remote rule overrides default type usage - forcing type '%s' for send and receive", ruleMatchTypeP->getTypeConfig()->getName() )); // done break; } } } #endif // check if we are sync compatible (common type for both directions) if (LocalSendToRemoteTypeP && LocalReceiveFromRemoteTypeP && RemoteReceiveFromLocalTypeP && RemoteSendToLocalTypeP) { // avoid further changes in remote devInf (e.g. by late result of GET, sent *after* first ) fSessionP->fRemoteDevInfLock=true; // there is a common data type for each of both directions // - show local types PDEBUGPRINTFX(DBG_DATA,( "Local Datastore '%s' - Types: tx to remote: '%s': %s (%s), rx from remote: '%s': %s (%s)", getName(), LocalSendToRemoteTypeP->getTypeConfig()->getName(),LocalSendToRemoteTypeP->getTypeName(), LocalSendToRemoteTypeP->getTypeVers(), LocalReceiveFromRemoteTypeP->getTypeConfig()->getName(),LocalReceiveFromRemoteTypeP->getTypeName(), LocalReceiveFromRemoteTypeP->getTypeVers() )); // - show remote types PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,( "Remote Datastore '%s' - Types: tx to local: '%s': %s (%s), rx from local: '%s': %s (%s)", fRemoteDatastoreP->getName(), RemoteSendToLocalTypeP->getTypeConfig()->getName(),RemoteSendToLocalTypeP->getTypeName(), RemoteSendToLocalTypeP->getTypeVers(), RemoteReceiveFromLocalTypeP->getTypeConfig()->getName(),RemoteReceiveFromLocalTypeP->getTypeName(), RemoteReceiveFromLocalTypeP->getTypeVers() )); } else { // datastores are not sync compatible sta=415; PDEBUGPRINTFX(DBG_ERROR,("No common datastore formats -> cannot sync (415)")); PDEBUGPRINTFX(DBG_EXOTIC,("- LocalSendToRemoteTypeP = '%s'", LocalSendToRemoteTypeP ? LocalSendToRemoteTypeP->getTypeName() : "")); PDEBUGPRINTFX(DBG_EXOTIC,("- LocalReceiveFromRemoteTypeP = '%s'", LocalReceiveFromRemoteTypeP ? LocalReceiveFromRemoteTypeP->getTypeName() : "")); PDEBUGPRINTFX(DBG_EXOTIC,("- RemoteSendToLocalTypeP = '%s'", RemoteSendToLocalTypeP ? RemoteSendToLocalTypeP->getTypeName() : "")); PDEBUGPRINTFX(DBG_EXOTIC,("- RemoteReceiveFromLocalTypeP = '%s'", RemoteReceiveFromLocalTypeP ? RemoteReceiveFromLocalTypeP->getTypeName() : "")); engAbortDataStoreSync(sta,true,false); // do not proceed with sync of this datastore, local problem, not resumable return sta; } // set type info in local datastore setSendTypeInfo(LocalSendToRemoteTypeP,RemoteReceiveFromLocalTypeP); setReceiveTypeInfo(LocalReceiveFromRemoteTypeP,RemoteSendToLocalTypeP); // - initialize usage of types (checks compatibility as well) return initDataTypeUse(); } // TLocalEngineDS::engInitForSyncOps // called from command to generate sync sub-commands to be sent to remote // Returns true if now finished for this datastore // also changes state to dssta_syncgendone when all sync commands have been generated bool TLocalEngineDS::engGenerateSyncCommands( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix ) { PDEBUGBLOCKFMT(("SyncGen","Now generating sync commands","datastore=%s",getName())); bool finished=false; #ifdef SYSYNC_CLIENT if (IS_CLIENT) finished = logicGenerateSyncCommandsAsClient(aNextMessageCommands, aInterruptedCommandP, aLocalIDPrefix); #endif #ifdef SYSYNC_SERVER if (IS_SERVER) finished = logicGenerateSyncCommandsAsServer(aNextMessageCommands, aInterruptedCommandP, aLocalIDPrefix); #endif // change state when finished if (finished) { changeState(dssta_syncgendone,true); if (IS_CLIENT) { // from client only skips to clientmapssent without any server communication // (except if we are in old synthesis-compatible mode which runs from-client-only // with empty sync-from-server and map phases. if (getSyncMode()==smo_fromclient && !fSessionP->fCompleteFromClientOnly) { // data access ends with all sync commands generated in from-client-only PDEBUGPRINTFX(DBG_PROTO,("From-Client-Only sync: skipping directly to end of map phase now")); changeState(dssta_dataaccessdone,true); changeState(dssta_clientmapssent,true); } } } PDEBUGPRINTFX(DBG_DATA,( "engGenerateSyncCommands ended, state='%s', sync generation %sdone", getDSStateName(), fLocalDSState>=dssta_syncgendone ? "" : "NOT " )); PDEBUGENDBLOCK("SyncGen"); return finished; } // TLocalEngineDS::engGenerateSyncCommands // called to confirm a sync operation's completion (status from remote received) // @note aSyncOp passed not necessarily reflects what was sent to remote, but what actually happened void TLocalEngineDS::dsConfirmItemOp(TSyncOperation aSyncOp, cAppCharP aLocalID, cAppCharP aRemoteID, bool aSuccess, localstatus aErrorStatus) { // commands failed with "cancelled" should be re-sent for resume if (!aSuccess && aErrorStatus==514 && dsResumeSupportedInDB() && fSessionP->isSuspending()) { // cancelled syncop as result of explicit suspend: mark for resume as it was never really processed at the other end PDEBUGPRINTFX(DBG_DATA+DBG_EXOTIC,("Cancelled SyncOp during suspend -> mark for resume")); engMarkItemForResume(aLocalID,aRemoteID,true); } PDEBUGPRINTFX(DBG_DATA+DBG_EXOTIC,( "dsConfirmItemOp completed, syncop=%s, localID='%s', remoteID='%s', %s, errorstatus=%hd", SyncOpNames[aSyncOp], aLocalID ? aLocalID : "", aRemoteID ? aRemoteID : "", aSuccess ? "SUCCESS" : "FAILURE", aErrorStatus )); } // TLocalEngineDS::dsConfirmItemOp // handle status of sync operation // Note: in case of superdatastore, status is always directed to the originating subdatastore, as // the fDataStoreP of the SyncOpCommand is set to subdatastore when generating the SyncOps. bool TLocalEngineDS::engHandleSyncOpStatus(TStatusCommand *aStatusCmdP,TSyncOpCommand *aSyncOpCmdP) { TSyError statuscode = aStatusCmdP->getStatusCode(); // we can make it simple here because we KNOW that we do not send multiple items per SyncOp, so we // just need to look at the first item's target and source const char *localID = aSyncOpCmdP->getSourceLocalID(); const char *remoteID = aSyncOpCmdP->getTargetRemoteID(); #ifdef SYSYNC_SERVER string realLocID; #endif if (localID) { #ifdef SUPERDATASTORES // remove possible prefix if this item was sent in the command context of a superdatastore if (fAsSubDatastoreOf) { // let superdatastore remove the prefix for me localID = fAsSubDatastoreOf->removeSubDSPrefix(localID,this); } #endif #ifdef SYSYNC_SERVER if (IS_SERVER) { // for server only: convert to internal representation realLocID=localID; obtainRealLocalID(realLocID); localID=realLocID.c_str(); } #endif } // handle special cases for Add/Replace/Delete TSyncOperation sop = aSyncOpCmdP->getSyncOp(); switch (sop) { case sop_wants_add: case sop_add: if (statuscode<300 || statuscode==419) { // All ok status 2xx as well as special "merged" 419 is ok for an add: // Whatever remote said, I know this is an add and so I counts this as such // (even if the remote somehow merged it with existing data, // it is obviously a new item in my sync set with this remote) fRemoteItemsAdded++; dsConfirmItemOp(sop_add,localID,remoteID,true); // ok added } else if ( statuscode==418 && (isResuming() || (isSlowSync() && IS_CLIENT) ) ) { // "Already exists"/418 is acceptable... // ... in slow sync as client, as some servers use it instead of 200/419 for slow sync match // ... during resumed sync as server with clients like Symbian which // can detect duplicate adds themselves. Should not generally // occur, as we shouldn't re-send them as long as we haven't seen // a map. But symbian cannot send early maps - it instead does // it's own duplicate checking. // ... during resumed sync as client (as servers might issue 418 for // items sent a second time after an implicit suspend) PDEBUGPRINTFX(DBG_ERROR,("Warning: received 418 status for add in resumed/slowsync session -> treat it as ok (200)")); dsConfirmItemOp(sop_replace,localID,remoteID,true); // kind of ok statuscode=200; // convert to ok (but no count incremented, as nothing changed) } else { dsConfirmItemOp(sop_add,localID,remoteID,false,statuscode); // failed add } // adding with 420 error: device full if (statuscode==420) { // special case: device indicates that it is full, so stop adding in this session PDEBUGPRINTFX(DBG_ERROR,("Warning: Status %hd: Remote device full -> preventing further adds in this session",statuscode)); engStopAddingToRemote(); fRemoteItemsError++; // this is considered a remote item error } break; // case sop_copy: break; case sop_wants_replace: case sop_replace: #ifdef SYSYNC_SERVER if (IS_SERVER && (statuscode==404 || statuscode==410)) { // obviously, remote item that we wanted to change does not exist any more. // Instead of aborting the session we'll just remove the map item for that // server item, such that it will be re-added in the next sync session PDEBUGPRINTFX(DBG_DATA,("Status %hd: Replace target not found on client -> silently ignore but remove map in server (item will be added in next session), ",statuscode)); // remove map for remote item(s), targetRef contain remoteIDs SmlTargetRefListPtr_t targetrefP = aStatusCmdP->getStatusElement()->targetRefList; while (targetrefP) { // target ref available engProcessMap(smlPCDataToCharP(targetrefP->targetRef),NULL); // next targetrefP=targetrefP->next; } statuscode=410; // always use "gone" status (even if we might have received a 404) dsConfirmItemOp(sop_replace,localID,remoteID,false,statuscode); break; } else #endif if (statuscode==201) { fRemoteItemsAdded++; dsConfirmItemOp(sop_add,localID,remoteID,true); // ok as add } else if (statuscode<300 || statuscode==419) { // conflict resolved counts as ok as well fRemoteItemsUpdated++; dsConfirmItemOp(sop_replace,localID,remoteID,true); // ok as replace } #ifdef SYSYNC_CLIENT else if (IS_CLIENT && (isSlowSync() && statuscode==418)) { // "Already exists"/418 is acceptable as client in slow sync because some // servers use it instead of 200/419 for slow sync match PDEBUGPRINTFX(DBG_ERROR,("Warning: received 418 for for replace during slow sync - treat it as ok (200), but don't count as update")); dsConfirmItemOp(sop_replace,localID,remoteID,true); // 418 is acceptable in slow sync (not really conformant, but e.g. happening with Scheduleworld) statuscode=200; // always use "gone" status (even if we might have received a 404) } #endif // SYSYNC_CLIENT else { dsConfirmItemOp(sop_replace,localID,remoteID,false,statuscode); // failed replace } break; case sop_archive_delete: case sop_soft_delete: case sop_delete: if (statuscode<211) fRemoteItemsDeleted++; // allow 211 and 404 for delete - after all, the record is not there // any more on the remote if (statuscode==404 || statuscode==211) { PDEBUGPRINTFX(DBG_DATA,("Status: %hd: To-be-deleted item not found, but accepted this (changed status to 200)",statuscode)); statuscode=200; } // if ok (explicit or implicit), we can confirm the delete dsConfirmItemOp(sop_delete,localID,remoteID,statuscode<300,statuscode); // counts as ok delete break; default: break; } // switch // check if we want to mark failed items for resend in the next session or abort bool resend = fDSConfigP->fResendFailing; // get default from config #ifdef SCRIPT_SUPPORT // let script check status code TErrorFuncContext errctx; errctx.statuscode = statuscode; errctx.resend = resend; errctx.newstatuscode = statuscode; errctx.syncop = sop; errctx.datastoreP = this; // - first check datastore level if ( TScriptContext::executeTest( false, // assume script does NOT handle status entirely fDataStoreScriptContextP, fDSConfigP->fSentItemStatusScript, &ErrorFuncTable, &errctx // caller context ) ) { // completely handled PDEBUGPRINTFX(DBG_ERROR,("Status: %hd: Handled by datastore script (original op was %s)",statuscode,SyncOpNames[sop])); return true; } errctx.statuscode = errctx.newstatuscode; // - then check session level if ( TScriptContext::executeTest( false, // assume script does NOT handle status entirely fSessionP->fSessionScriptContextP, fSessionP->getSessionConfig()->fSentItemStatusScript, &ErrorFuncTable, &errctx // caller context ) ) { // completely handled PDEBUGPRINTFX(DBG_ERROR,("Status: %hd: Handled by session script (original op was %s)",statuscode,SyncOpNames[sop])); return true; } // not completely handled, use possibly modified status code #ifdef SYDEBUG if (statuscode != errctx.newstatuscode) { PDEBUGPRINTFX(DBG_ERROR,("Status: Script changed original status=%hd to %hd (original op was %s)",statuscode,errctx.newstatuscode,SyncOpNames[errctx.syncop])); } #endif statuscode = errctx.newstatuscode; resend = errctx.resend; #endif // now perform default action according to status code switch (statuscode) { case 200: break; case 201: PDEBUGPRINTFX(DBG_PROTO,("Status: %hd: Item added (original op was %s)",statuscode,SyncOpNames[sop])); break; case 204: PDEBUGPRINTFX(DBG_PROTO,("Status: %hd: No content (original op was %s)",statuscode,SyncOpNames[sop])); break; case 207: case 208: case 209: case 419: PDEBUGPRINTFX(DBG_HOT,("Status: %hd: Conflict resolved (original op was %s)",statuscode,SyncOpNames[sop])); break; case 210: PDEBUGPRINTFX(DBG_HOT,("Status: %hd: Delete without archive (original op was %s)",statuscode,SyncOpNames[sop])); break; case 211: PDEBUGPRINTFX(DBG_ERROR,("Status: %hd: nothing deleted, item not found (original op was %s)",statuscode,SyncOpNames[sop])); break; case 410: // gone case 420: // device full // these have been handled above and are considered ok now break; case 514: // cancelled // ignore cancelling while suspending, as these are CAUSED by the suspend if (fSessionP->isSuspending() && dsResumeSupportedInDB()) { // don't do anything here - we'll be suspended later (but process commands until then) // dsConfirmItemOp() has already caused the item to be marked for resume break; } // for non-DS-1.2 sessions, we treat 514 like the other errors below (that is - retry might help) case 424: // size mismatch (e.g. due to faild partial item resume attempt -> retry will help) case 417: // retry later (remote says that retry will probably work) case 506: // processing error, retry later (remote says that retry will probably work) case 404: // not found (retry is not likely to help, but does not harm too much, either) case 408: // timeout (if that happens on a single item, retry probably helps) case 415: // bad type (retry is not likely to help, but does not harm too much, either) case 510: // datastore failure (too unspecific to know if retry might help, but why not?) case 500: // general failure (too unspecific to know if retry might help, but why not?) // these errors cause either a resend in a later session // or only abort the datastore, but not the session if (resend && dsResumeSupportedInDB()) { PDEBUGPRINTFX(DBG_ERROR,("Status: General error %hd (original op was %s) -> marking item for resend in next session",statuscode,SyncOpNames[sop])); engMarkItemForResend(localID,remoteID); // Note: includes incrementing fRemoteItemsError } else { PDEBUGPRINTFX(DBG_ERROR,("Status: General error %hd (original op was %s) -> aborting sync with this datastore",statuscode,SyncOpNames[sop])); engAbortDataStoreSync(statuscode,false); // remote problem } break; default: // let command handle it return false; //break; } // status handled return true; // handled status } // TLocalEngineDS::engHandleSyncOpStatus /// Internal events during sync for derived classes /// @Note local DB authorisation must be established already before calling these /// - cause loading of all session anchoring info and other admin data (logicMakeAdminReady()) /// fLastRemoteAnchor,fLastLocalAnchor,fNextLocalAnchor; isFirstTimeSync() will be valid after the call /// - in case of superdatastore, consolidates the anchor information from the subdatastores localstatus TLocalEngineDS::engInitSyncAnchors( cAppCharP aDatastoreURI, ///< local datastore URI cAppCharP aRemoteDBID ///< ID of remote datastore (to find session information in local DB) ) { // nothing more to do than making admin data ready // - this will fill all dsSavedAdminData members here and in all derived classes localstatus sta=logicMakeAdminReady(aDatastoreURI, aRemoteDBID); if (sta==LOCERR_OK) { changeState(dssta_adminready); // admin data is now ready } // return on error return sta; } // TLocalEngineDS::engInitSyncAnchors #ifdef SYSYNC_CLIENT // initialize Sync alert for datastore according to Parameters set with dsSetClientSyncParams() localstatus TLocalEngineDS::engPrepareClientSyncAlert(void) { #ifdef SUPERDATASTORES // no operation here if running under control of a superdatastore. // superdatastore's engPrepareClientSyncAlert() will call engPrepareClientRealDSSyncAlert of all subdatastores at the right time if (fAsSubDatastoreOf) return LOCERR_OK; #endif // this is a real datastore return engPrepareClientDSForAlert(); } // TLocalEngineDS::engPrepareClientSyncAlert // initialize Sync alert for datastore according to Parameters set with dsSetClientSyncParams() localstatus TLocalEngineDS::engPrepareClientDSForAlert(void) { localstatus sta; // reset the filters that might be added to in alertprepscript // (as they might have been half set-up in a previous failed alert, they must be cleared and re-constructed here) resetFiltering(); #ifdef SCRIPT_SUPPORT // AlertPrepareScript to add filters and CGI // - rebuild early (before all of the other DS scripts in makeAdminReady caused by engInitSyncAnchors below!) TScriptContext::rebuildContext(fSessionP->getSyncAppBase(),fDSConfigP->fAlertPrepScript,fDataStoreScriptContextP,fSessionP); // - add custom DS 1.2 filters and/or custom CGI to fRemoteDBPath TScriptContext::execute( fDataStoreScriptContextP, fDSConfigP->fAlertPrepScript, fDSConfigP->getClientDBFuncTable(), // function table with extra this // datastore pointer needed for context ); #endif // - save the identifying name of the DB fIdentifyingDBName = fLocalDBPath; // - get information about last session out of database sta = engInitSyncAnchors( relativeURI(fLocalDBPath.c_str()), fRemoteDBPath.c_str() ); if (sta!=LOCERR_OK) { // error getting anchors PDEBUGPRINTFX(DBG_ERROR,("Could not get Sync Anchor info")); return localError(sta); } // check if we are forced to slowsync (otherwise, fSlowSync is pre-set from dsSetClientSyncParams() fSlowSync = fSlowSync || fLastLocalAnchor.empty() || fFirstTimeSync; // check for resume if (fResumeAlertCode!=0 && fSessionP->getSyncMLVersion()>=syncml_vers_1_2) { // we have a suspended session, try to resume PDEBUGPRINTFX(DBG_PROTO,("Found suspended session with Alert Code = %hd",fResumeAlertCode)); fResuming = true; } return LOCERR_OK; // ok } // TLocalEngineDS::engPrepareClientDSForAlert // generate Sync alert for datastore after initialisation with engPrepareClientSyncAlert() // Note: this could be repeatedly called due to auth failures at beginning of session // Note: this is a NOP for subDatastores (should not be called in this case, anyway) localstatus TLocalEngineDS::engGenerateClientSyncAlert( TAlertCommand *&aAlertCommandP ) { aAlertCommandP=NULL; #ifdef SUPERDATASTORES if (fAsSubDatastoreOf) return LOCERR_OK; // NOP, ok, only superdatastore creates an alert! #endif PDEBUGPRINTFX(DBG_PROTO,( "(Saved) Last Local Client Anchor='%s', (generated) Next Local Client Anchor='%s' (sent to server as / in )", fLastLocalAnchor.c_str(), fNextLocalAnchor.c_str() )); // create appropriate initial alert command TAgentConfig *configP = static_cast(static_cast(getSession())->getRootConfig()->fAgentConfigP); uInt16 alertCode = getSyncStateAlertCode(fServerAlerted, configP->fPreferSlowSync); // check for resume if (fResuming) { // check if what we resume is same as what we wanted to do if (alertCode != fResumeAlertCode) { // this is ok for client, just show in log PDEBUGPRINTFX(DBG_PROTO,( "Sync mode seems to have changed (alert code = %hd) since last Suspend (alert code = %hd)", alertCode, fResumeAlertCode )); } // resume alertCode=225; // resume PDEBUGPRINTFX(DBG_PROTO,( "Alerting resume of last sync session (original alert code = %hd)", fResumeAlertCode )); } aAlertCommandP = new TAlertCommand(fSessionP,this,alertCode); PDEBUGPRINTFX(DBG_HOT,( "%s: ALERTING server for %s%s%s Sync", getName(), fResuming ? "RESUMED " : "", fSlowSync ? "slow" : "normal", fFirstTimeSync ? " first time" : "" )); // add Item with Anchors and URIs SmlItemPtr_t itemP = newItem(); // - anchors itemP->meta=newMetaAnchor(fNextLocalAnchor.c_str(),fLastLocalAnchor.c_str()); // - MaxObjSize here again to make SCTS happy if ( (fSessionP->getSyncMLVersion()>=syncml_vers_1_1) && (fSessionP->getRootConfig()->fLocalMaxObjSize>0) ) { // SyncML 1.1 has object size and we need to put it here for SCTS smlPCDataToMetInfP(itemP->meta)->maxobjsize=newPCDataLong( fSessionP->getRootConfig()->fLocalMaxObjSize ); } // - URIs itemP->source=newLocation(fLocalDBPath.c_str()); // local DB ID itemP->target=newLocation(fRemoteDBPath.c_str()); // use remote path as configured in client settings // - add DS 1.2 filters if (!fRemoteRecordFilterQuery.empty() || false /* %%% field level filter */) { if (fSessionP->getSyncMLVersion()findLocalType(fDSConfigP->fTypeSupport.fPreferredRx); if (itemTypeP) { // add meta type filterP->meta = newMetaType(itemTypeP->getTypeName()); } // add filtertype if needed (=not EXCLUSIVE) if (fRemoteFilterInclusive) { filterP->filtertype=newPCDataString(SYNCML_FILTERTYPE_INCLUSIVE); } // record level if (!fRemoteRecordFilterQuery.empty()) { // add filterP->record = SML_NEW(SmlRecordOrFieldFilter_t); // - add item with data=filterquery filterP->record->item = newStringDataItem(fRemoteRecordFilterQuery.c_str()); // - add meta type with grammar filterP->record->item->meta = newMetaType(SYNCML_FILTERTYPE_CGI); PDEBUGPRINTFX(DBG_HOT,( "Alerting with %sCLUSIVE Record Level Filter Query = '%s'", fRemoteFilterInclusive ? "IN" : "EX", fRemoteRecordFilterQuery.c_str() )); } // field level /// @todo %%% to be implemented if (false) { // !!! remember to add real check (now: false) in outer if-statement as well!!!!! // %%% tbd } } // add it to item itemP->target->filter = filterP; } // - add to alert command aAlertCommandP->addItem(itemP); // we have now produced the client alert command, change state return changeState(dssta_clientsentalert); } // TLocalEngineDS::engGenerateClientSyncAlert // Init engine for client sync // - determine types to exchange // - make sync set ready localstatus TLocalEngineDS::engInitForClientSync(void) { #ifdef SUPERDATASTORES // no init in case we are under control of a superdatastore -> the superdatastore will do that if (fAsSubDatastoreOf) return LOCERR_OK; #endif return engInitDSForClientSync(); } // TLocalEngineDS::engInitForClientSync // Init engine for client sync // - determine types to exchange // - make sync set ready localstatus TLocalEngineDS::engInitDSForClientSync(void) { // make ready for syncops localstatus sta = engInitForSyncOps(getRemoteDBPath()); if (sta==LOCERR_OK) { // - let local datastore (derived DB-specific class) prepare for sync sta = changeState(dssta_dataaccessstarted); if (sta==LOCERR_OK && isStarted(false)) { // already started now, change state sta = changeState(dssta_syncsetready); } } return sta; } // TLocalEngineDS::engInitDSForClientSync #endif // Client // get Alert code for current Sync State uInt16 TLocalEngineDS::getSyncStateAlertCode(bool aServerAlerted, bool aClientMinimal) { uInt16 alertcode=0; switch (fSyncMode) { case smo_twoway : alertcode = aServerAlerted ? 206 : 200; break; case smo_fromclient : alertcode = aServerAlerted ? 207 : 202; // fully specified break; case smo_fromserver : if (aClientMinimal) { // refresh from server is just client not sending any data, so we can alert like two-way alertcode = aServerAlerted ? 206 : 200; } else { // correctly alert it alertcode = aServerAlerted ? 209 : 204; } break; case numSyncModes: // invalid break; } // slowsync/refresh variants are always plus one, except 206 --> 201 (same as client initiated slow sync) if (fSlowSync) alertcode = (alertcode!=206 ? alertcode+1 : 201); return alertcode; } // TLocalEngineDS::getSyncStateAlertCode /// initializes Sync state variables and returns false if alert is not supported localstatus TLocalEngineDS::setSyncModeFromAlertCode(uInt16 aAlertCode, bool aAsClient) { localstatus sta; TSyncModes syncMode; bool slowSync, serverAlerted; // - translate into mode and flags sta=getSyncModeFromAlertCode(aAlertCode,syncMode,slowSync,serverAlerted); if (sta==LOCERR_OK) { // - set them sta=setSyncMode(aAsClient,syncMode,slowSync,serverAlerted); } return sta; } // TLocalEngineDS::setSyncModeFromAlertCode /// initializes Sync mode variables localstatus TLocalEngineDS::setSyncMode(bool aAsClient, TSyncModes aSyncMode, bool aIsSlowSync, bool aIsServerAlerted) { // get sync caps of this datastore uInt32 synccapmask=getSyncCapMask(); // check if mode supported if (aIsServerAlerted) { // check if we support server alerted modes, SyncCap/Bit=7 if (~synccapmask & (1<<7)) return 406; // not supported } switch(aSyncMode) { case smo_twoway: // Two-way Sync, SyncCap/Bit=1 // or Two-way slow Sync, SyncCap/Bit=2 if (~synccapmask & (1<< (aIsSlowSync ? 2 : 1))) return 406; // not supported if (fSyncMode==smo_fromserver && aAsClient) aSyncMode=smo_fromserver; // for client, if already fromserver mode set, keep it break; case smo_fromclient: // One-way from client, SyncCap/Bit=3 // or Refresh (=slow one-way) from client, SyncCap/Bit=4 if (~synccapmask & (1<< (aIsSlowSync ? 4 : 3))) return 406; // not supported if (!aAsClient) fRefreshOnly=true; // as server, we are in refresh-only-mode if we get one-way from client break; case smo_fromserver: // One-way from server, SyncCap/Bit=5 // or Refresh (=slow one-way) from server, SyncCap/Bit=6 if (~synccapmask & (1<< (aIsSlowSync ? 6 : 5))) return 406; // not supported if (aAsClient) fRefreshOnly=true; // as client, we are in refresh-only-mode if we get one-way fromm server break; default: return 400; // bad request } // now set mode and flags (possibly adjusted above) fSyncMode=aSyncMode; fSlowSync=aIsSlowSync; fServerAlerted=aIsServerAlerted; // ok return LOCERR_OK; } // TLocalEngineDS::setSyncMode /// get Sync mode variables from given alert code localstatus TLocalEngineDS::getSyncModeFromAlertCode(uInt16 aAlertCode, TSyncModes &aSyncMode, bool &aIsSlowSync, bool &aIsServerAlerted) { // these might be pre-defined) /// @deprecated state change does not belong here aIsSlowSync=false; aIsServerAlerted=false; aSyncMode=smo_twoway; // to make sure it is valid // first test if server-alerted if (aAlertCode>=206 && aAlertCode<210) { // Server alerted modes aIsServerAlerted=true; } // test for compatibility with alert code switch(aAlertCode) { case 200: case 206: // Two-way Sync aSyncMode=smo_twoway; aIsSlowSync=false; break; case 201: // Two-way slow Sync aSyncMode=smo_twoway; aIsSlowSync=true; break; case 202: case 207: // One-way from client aSyncMode=smo_fromclient; aIsSlowSync=false; break; case 203: case 208: // refresh (=slow one-way) from client aSyncMode=smo_fromclient; aIsSlowSync=true; break; case 204: case 209: // One-way from server aSyncMode=smo_fromserver; aIsSlowSync=false; break; case 205: case 210: // refresh (=slow one-way) from server aSyncMode=smo_fromserver; aIsSlowSync=true; break; default: // bad alert return 400; } return LOCERR_OK; } // TLocalEngineDS::getSyncModeFromAlertCode // create new Sync capabilities info from capabilities mask // Bit0=reserved, Bit1..Bitn = SyncType 1..n available // Note: derived classes might add special sync codes and/or mask standard ones SmlDevInfSyncCapPtr_t TLocalEngineDS::newDevInfSyncCap(uInt32 aSyncCapMask) { SmlDevInfSyncCapPtr_t synccapP; SmlPcdataPtr_t synctypeP; // new synccap structure synccapP = SML_NEW(SmlDevInfSyncCap_t); // synccap list is empty synccapP->synctype=NULL; // now add standard synccaps for (sInt16 k=0; k<32; k++) { if (aSyncCapMask & (1<synctype)); } } // Now add non-standard synccaps. // From the spec: "Other values can also be specified." // Values are PCDATA, so we can use plain strings. // // But the Funambol server expects integer numbers and // throws a parser error when sent a string. So better // stick to a semi-random number (hopefully no-one else // is using it). // // Worse, Nokia phones cancel direct sync sessions with an // OBEX error ("Forbidden") when non-standard sync modes // are included in the SyncCap. // Event worse, some servers refuse to sync at // all with strange/misleading error codes when extensions are found. // Therefore, this is nothing to be enabled in general, // so it needs to be explicitly enabled in config from // 3.4.0.45 onwards (using yes // If it is enabled in config, the following logic is used: // - libsynthesis in a SyncML client will always send // all the extended sync modes; with the Funambol // workaround in place that works // - libsynthesis in a SyncML server will only send the // extended sync modes if the client has sent any // extended sync modes itself; the 390002 mode is // sent unconditionally for that purpose // // Corresponding code in TRemoteDataStore::setDatastoreDevInf(). // if ( fSessionP->getSessionConfig()->fSyncModeExtensions && // must be enabled in config (!IS_SERVER || fSessionP->receivedSyncModeExtensions()) // and if, server only uses it with clients which have it in their devInf as well ) { bool extended=false; if (canRestart()) { synctypeP=newPCDataString("390001"); addPCDataToList(synctypeP,&(synccapP->synctype)); extended=true; } // Finally add non-standard synccaps that are outside of the // engine's control. set modes; getSyncModes(modes); for (set::const_iterator it = modes.begin(); it != modes.end(); ++it) { synctypeP=newPCDataString(*it); addPCDataToList(synctypeP,&(synccapP->synctype)); extended=true; } // Add fake mode to signal peer that we support extensions. // Otherwise a server won't send them, to avoid breaking // client's (like Nokia phones) which don't. // // Don't send the fake mode unnecessarily (= when some other // non-standard modes where already added), because Funambol seems // to have a hard-coded limit of 9 entries in the and // complains with a 513 internal server error (when using WBXML) // or a 'Expected "CTCap" end tag, found "CTType" end tag' (when // using XML). if (!extended) { synctypeP=newPCDataString("390002"); addPCDataToList(synctypeP,&(synccapP->synctype)); } } // return it return synccapP; } // TLocalEngineDS::newDevInfSyncCap // obtain new datastore info, returns NULL if none available SmlDevInfDatastorePtr_t TLocalEngineDS::newDevInfDatastore(bool aAsServer, bool aWithoutCTCapProps) { SmlDevInfDatastorePtr_t datastoreP; // set only basic info, details must be added in derived class // - sourceref is the name of the datastore, // or for server, if already alerted, the name used in the alert // (this is to allow /dsname/foldername with clients that expect the // devInf to contain exactly the same full path as name, like newer Nokias) string dotname; #ifdef SYSYNC_SERVER if (IS_SERVER && testState(dssta_serveralerted,false) && fSessionP->fDSPathInDevInf) { // server and already alerted // - don't include sub-datastores if (fAsSubDatastoreOf) { return NULL; } // - use datastore spec as sent from remote, minus CGI, as relative spec dotname = URI_RELPREFIX; dotname += fSessionP->SessionRelativeURI(fRemoteViewOfLocalURI.c_str()); if (!fSessionP->fDSCgiInDevInf) { // remove CGI string::size_type n=dotname.find("?"); if (n!=string::npos) dotname.resize(n); // remove CGI } } else #endif { // client or not yet alerted - just use datastore base name StringObjPrintf(dotname,URI_RELPREFIX "%s",fName.c_str()); } // create new datastoreP=SML_NEW(SmlDevInfDatastore_t); datastoreP->sourceref=newPCDataString(dotname); #ifndef MINIMAL_CODE // - Optional display name datastoreP->displayname=newPCDataOptString(getDisplayName()); #else datastoreP->displayname=NULL; #endif // - MaxGUIDsize (for client only) if (aAsServer) datastoreP->maxguidsize=NULL; else datastoreP->maxguidsize=newPCDataLong(fMaxGUIDSize); // - check for legacy mode type (that is to be used as "preferred" instead of normal preferred) TSyncItemType *legacyTypeP = NULL; if (getSession()->fLegacyMode && getDSConfig()->fTypeSupport.fPreferredLegacy) { // get the type marked as blind legacyTypeP = getSession()->findLocalType(getDSConfig()->fTypeSupport.fPreferredLegacy); } // - RxPref if (!fRxPrefItemTypeP) SYSYNC_THROW(TStructException("Datastore has no RxPref ItemType")); datastoreP->rxpref = (legacyTypeP ? legacyTypeP : fRxPrefItemTypeP)->newXMitDevInf(); // - Rx (excluding the type we report as preferred) datastoreP->rx=TSyncItemType::newXMitListDevInf(fRxItemTypes,legacyTypeP ? legacyTypeP : fRxPrefItemTypeP); // - TxPref if (!fTxPrefItemTypeP) SYSYNC_THROW(TStructException("Datastore has no TxPref ItemType")); datastoreP->txpref = (legacyTypeP ? legacyTypeP : fTxPrefItemTypeP)->newXMitDevInf(); // - Tx (excluding the type we report as preferred) datastoreP->tx=TSyncItemType::newXMitListDevInf(fTxItemTypes,legacyTypeP ? legacyTypeP : fTxPrefItemTypeP); // - DSMem /// @todo %%% tbd: add dsmem datastoreP->dsmem=NULL; // - SyncML DS 1.2 datastore-local CTCap if (fSessionP->getSyncMLVersion()>=syncml_vers_1_2) { // CTCap is local to datastore, get only CTCaps relevant for this datastore, but independently from alerted state datastoreP->ctcap = fSessionP->newLocalCTCapList(false, this, aWithoutCTCapProps); } else datastoreP->ctcap=NULL; // before SyncML 1.2, there was no datastore-local CTCap // - SyncML DS 1.2 flags (SmlDevInfHierarchical_f) /// @todo %%% tbd: add SmlDevInfHierarchical_f datastoreP->flags=0; // - SyncML DS 1.2 filters datastoreP->filterrx=NULL; datastoreP->filtercap=NULL; #ifdef OBJECT_FILTERING if (IS_SERVER && fDSConfigP->fDS12FilterSupport && fSessionP->getSyncMLVersion()>=syncml_vers_1_2) { // Show Filter info in 1.2 devInf if this is not a client // - FilterRx constant datastoreP->filterrx = SML_NEW(SmlDevInfXmitList_t); datastoreP->filterrx->next = NULL; datastoreP->filterrx->data = SML_NEW(SmlDevInfXmit_t); datastoreP->filterrx->data->cttype=newPCDataString(SYNCML_FILTERTYPE_CGI); datastoreP->filterrx->data->verct=newPCDataString(SYNCML_FILTERTYPE_CGI_VERS); // build filtercap SmlPcdataListPtr_t filterkeywords = NULL; SmlPcdataListPtr_t filterprops = NULL; // - fill the lists from types addFilterCapPropsAndKeywords(filterkeywords,filterprops); // - if we have something, actually build a filtercap if (filterkeywords || filterprops) { // we have filtercaps, add them // - FilterCap list datastoreP->filtercap = SML_NEW(SmlDevInfFilterCapList_t); datastoreP->filtercap->next = NULL; datastoreP->filtercap->data = SML_NEW(SmlDevInfFilterCap_t); datastoreP->filtercap->data->cttype=newPCDataString(SYNCML_FILTERTYPE_CGI); datastoreP->filtercap->data->verct=newPCDataString(SYNCML_FILTERTYPE_CGI_VERS); // - add list we've got datastoreP->filtercap->data->filterkeyword=filterkeywords; datastoreP->filtercap->data->propname=filterprops; } } #endif // OBJECT_FILTERING // - Sync capabilities of this datastore datastoreP->synccap=newDevInfSyncCap(getSyncCapMask()); // return it return datastoreP; } // TLocalEngineDS::newDevInfDatastore // Set remote datastore for local void TLocalEngineDS::engSetRemoteDatastore( TRemoteDataStore *aRemoteDatastoreP // the remote datastore involved ) { // save link to remote datastore if (fRemoteDatastoreP) { if (fRemoteDatastoreP!=aRemoteDatastoreP) SYSYNC_THROW(TSyncException("Sync continues with different datastore")); } fRemoteDatastoreP=aRemoteDatastoreP; } // TLocalEngineDS::engSetRemoteDatastore // SYNC command bracket start (check credentials if needed) bool TLocalEngineDS::engProcessSyncCmd( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // status that might be modified bool &aQueueForLater // will be set if command must be queued for later (re-)execution ) { // get number of changes info if available if (aSyncP->noc) { StrToLong(smlPCDataToCharP(aSyncP->noc),fRemoteNumberOfChanges); } // check if datastore is aborted if (CheckAborted(aStatusCommand)) return false; // check if (!fRemoteDatastoreP) SYSYNC_THROW(TSyncException("No remote datastore linked")); // let remote datastore process it first if (!fRemoteDatastoreP->remoteProcessSyncCmd(aSyncP,aStatusCommand,aQueueForLater)) { PDEBUGPRINTFX(DBG_ERROR,("TLocalEngineDS::engProcessSyncCmd: remote datastore failed processing ")); changeState(dssta_idle,true); // force it return false; } // check for combined init&sync if (!testState(dssta_syncmodestable,false)) { // encountered before sync mode stable: could be combined init&sync session if (fLocalDSState>=dssta_serveransweredalert) { // ok for switching to combined init&sync PDEBUGPRINTFX(DBG_HOT,("TLocalEngineDS::engProcessSyncCmd: detected combined init&sync, freeze sync mode already now")); // - freeze sync mode as it is now changeState(dssta_syncmodestable,true); // force it, sync mode is now stable, no further changes are possible } } // now init if this is the first command bool startingNow = false; // assume start already initiated if (testState(dssta_syncmodestable,true)) { // all alert and alert status must be done by now, sync mode must be stable CONSOLEPRINTF(("- Starting Sync with Datastore '%s', %s sync",fRemoteViewOfLocalURI.c_str(),fSlowSync ? "slow" : "normal")); startingNow = true; // initiating start now #ifdef SYSYNC_SERVER if (IS_SERVER) { // at this point, all temporary GUIDs become invalid (no "early map" possible any more which might refer to last session's tempGUIDs) fTempGUIDMap.clear(); // forget all previous session's temp GUID mappings // let local datastore (derived DB-specific class) prepare for sync localstatus sta = changeState(dssta_dataaccessstarted); if (sta!=LOCERR_OK) { // abort session (old comment: %%% aborting datastore only does not work, will loop, why? %%%) aStatusCommand.setStatusCode(syncmlError(sta)); PDEBUGPRINTFX(DBG_ERROR,("TLocalEngineDS::engProcessSyncCmd: could not change state to dsssta_dataaccessstarted -> abort")); engAbortDataStoreSync(sta,true); // local problem return false; } } #endif } // if data access started (finished or not), check start status // for every execution and re-execution of the sync command if (testState(dssta_dataaccessstarted)) { // queue command if datastore is not yet started already if (engIsStarted(!startingNow)) { // wait only if start was already initiated // - is now initialized if (IS_SERVER) { // - for server, make the sync set ready now (as engine is now started) changeState(dssta_syncsetready,true); // force it } else { // - for client, we need at least dssta_syncgendone (sync set has been ready long ago, we've already sent changes to server!) if (!testState(dssta_syncgendone)) { // bad sequence of commands ( from server too early!) aStatusCommand.setStatusCode(400); PDEBUGPRINTFX(DBG_ERROR,("TLocalEngineDS::engProcessSyncCmd: client received SYNC before sending SYNC complete")); engAbortDataStoreSync(400,false,false); // remote problem, not resumable return false; } } PDEBUGPRINTFX(DBG_HOT,( "- Started %s Sync (first command)", fSlowSync ? "slow" : "normal" )); if (fRemoteNumberOfChanges>=0) PDEBUGPRINTFX(DBG_HOT,("- NumberOfChanges announced by remote = %ld",(long)fRemoteNumberOfChanges)); DB_PROGRESS_EVENT(this,pev_syncstart,0,0,0); } else { // - not yet started PDEBUGPRINTFX(DBG_HOT,( "- Starting sync not yet complete - re-execute command again in next message" )); aQueueForLater=true; return true; // ok so far } } // must be syncready here (otherwise we return before we reach this) if (!testState(dssta_syncsetready)) { aStatusCommand.setStatusCode(403); // forbidden ADDDEBUGITEM(aStatusCommand,"SYNC received too early"); PDEBUGPRINTFX(DBG_ERROR,("TLocalEngineDS::engProcessSyncCmd: SYNC received too early")); engAbortDataStoreSync(403,false,false); // remote problem, not resumable return false; } // state is now syncing /// @deprecated - dssta_syncsetready is enough //fState=dss_syncing; return true; } // TLocalEngineDS::engProcessSyncCmd // SYNC command bracket end (but another might follow in next message) bool TLocalEngineDS::engProcessSyncCmdEnd(bool &aQueueForLater) { bool ok=true; // queue it for later as long as datastore is not ready now if (!engIsStarted(false)) { // not waiting if not started // no state change, just postpone execution aQueueForLater=true; } // also inform remote if (fRemoteDatastoreP) ok=fRemoteDatastoreP->remoteProcessSyncCmdEnd(); return ok; } // TLocalEngineDS::engProcessSyncCmdEnd #ifdef SYSYNC_SERVER // server case: called whenever outgoing Message of Sync Package starts void TLocalEngineDS::engServerStartOfSyncMessage(void) { // this is where we might start our own command (all // received commands are now processed) // - Note that this might be a subdatastore -> if so, do NOT // start a sync (superdatastore will handle this) // - Note that this will be called even if current message is // already full, so it could well be that this sync command // is queued. if (!fSessionP->fCompleteFromClientOnly && testState(dssta_serverseenclientmods) && getSyncMode()==smo_fromclient) { // from-client only does not send back a command, simply end data access here PDEBUGPRINTFX(DBG_PROTO,("from-client-only:do not send command back to client, data access ends here")); changeState(dssta_syncgendone,true); changeState(dssta_dataaccessdone,true); } // ### SyncFest #5, found with Tactel Jazz Client: // - do not send anything when remote datastore is not known else if (fRemoteDatastoreP) { if (!testState(dssta_serversyncgenstarted) && testState(dssta_serverseenclientmods)) { changeState(dssta_serversyncgenstarted,true); if (!isSubDatastore()) { // - Note: if sync command was already started, the // finished(), continueIssue() mechanism will make sure that // more commands are generated // - Note2: if all sync commands can be sent at once, // fState will be modified by issuing , so // it must be ok for issuing syncops here already! TSyncCommand *synccmdP = new TSyncCommand( fSessionP, this, // local datastore fRemoteDatastoreP // remote datastore ); // issue ISSUE_COMMAND_ROOT(fSessionP,synccmdP); } } } else { changeState(dssta_idle,true); // force it } } // TLocalEngineDS::engServerStartOfSyncMessage #endif // server only // called whenever Message of Sync Package ends or after last queued Sync command is executed // - aEndOfAllSyncCommands is true when at end of Sync-data-from-remote packet // AND all possibly queued sync/syncop commands have been processed. void TLocalEngineDS::engEndOfSyncFromRemote(bool aEndOfAllSyncCommands) { // is called for all local datastores, including superdatastore, even inactive ones, so check state first if (testState(dssta_syncsetready)) { if (aEndOfAllSyncCommands) { // we are at end of sync-data-from-remote for THIS datastore if (IS_CLIENT) { // - we are done with from server, that is, data access is done now changeState(dssta_dataaccessdone,true); // force it } else { // - server has seen all client modifications now // Note: in case of the simulated-empty-sync-hack in action, we // allow that we are already in server_sync_gen_started and // won't try to force down to dssta_serverseenclientmods if (!fSessionP->fFakeFinalFlag || getDSState() active - allowing state>server_seen_client_mods")); } } } #ifdef SYSYNC_SERVER if (IS_SERVER) { engServerStartOfSyncMessage(); } #endif // now do final things if (testState(dssta_dataaccessdone,true)) { // @todo: I think, as long as we need to send maps, we're not done yet!!! // sync packets in both directions done, forget remote datastore fRemoteDatastoreP=NULL; } } // dssta_syncsetready } // TLocalEngineDS::engEndOfSyncFromRemote // - must return true if this datastore is finished with // (if all datastores return true, // session is allowed to finish sync packet with outgoing message bool TLocalEngineDS::isSyncDone(void) { // is called for all local datastores, even inactive ones, which must signal sync done, too // - only datastores currently receiving or sending commands are not done with sync // - aborted datastores are also done with sync, no matter what status they have return ( fAbortStatusCode!=0 || //(fState!=dss_syncsend && fState!=dss_syncing && fState!=dss_syncready && fState!=dss_syncfinish) !testState(dssta_clientsentalert) || // nothing really happened yet... testState(dssta_syncgendone) // ...or already completed generating ); } // TLocalEngineDS::isSyncDone // test datastore state for minimal or exact state bool TLocalEngineDS::testState(TLocalEngineDSState aMinState, bool aNeedExactMatch) { bool result = (!aNeedExactMatch || (fLocalDSState==aMinState)) && (fLocalDSState>=aMinState); DEBUGPRINTFX(DBG_EXOTIC,( "%s: testState=%s - expected state%c='%s', found state=='%s'", getName(), result ? "TRUE" : "FALSE", aNeedExactMatch ? '=' : '>', getDSStateName(aMinState), getDSStateName() )); return result; } // TLocalEngineDS::testState // change datastore state, calls logic layer before and after change localstatus TLocalEngineDS::changeState(TLocalEngineDSState aNewState, bool aForceOnError) { localstatus err1,err2; TLocalEngineDSState oldState = fLocalDSState; // nop if no change in state if (aNewState==oldState) return LOCERR_OK; // state cannot be decremented except down to adminready and below if ((aNewStatedssta_adminready)) { PDEBUGPRINTFX(DBG_ERROR,( "%s: Internal error: attempt to reduce state from '%s' to '%s' - aborting", getName(), getDSStateName(oldState), getDSStateName(aNewState) )); err1 = 500; dsAbortDatastoreSync(err1,true); return err1; } // give logic opportunity to react before state changes PDEBUGBLOCKFMT(( "DSStateChange", "Datastore changes state", "datastore=%s|oldstate=%s|newstate=%s", getName(), getDSStateName(oldState), getDSStateName(aNewState) )); err2 = LOCERR_OK; err1 = dsBeforeStateChange(oldState,aNewState); if (!aForceOnError && err1) goto endchange; // switch state fLocalDSState = aNewState; if (aNewState == dssta_syncmodestable) { // There are multiple places where the sync mode is frozen. Ensure // that this change is reported in all of them by putting the code // here. PDEBUGPRINTFX(DBG_HOT,( "executing %s%s%s Sync%s", fResuming ? "resumed " : "", fSlowSync ? "slow" : "normal", fFirstTimeSync ? " first time" : "", fSyncMode == smo_twoway ? ", two-way" : fSyncMode == smo_fromclient ? " from client" : fSyncMode == smo_fromserver ? " from server" : " in unknown direction?!" )); #ifdef PROGRESS_EVENTS // progress event DB_PROGRESS_EVENT(this, pev_alerted, fSlowSync ? (fFirstTimeSync ? 2 : 1) : 0, fResuming ? 1 : 0, fSyncMode ); #endif // PROGRESS_EVENTS } // now give logic opportunity to react again err2 = dsAfterStateChange(oldState,aNewState); endchange: PDEBUGENDBLOCK("DSStateChange"); // return most recent error return err2 ? err2 : err1; } // TLocalEngineDS::changeState // test datastore abort status // datastore is aborted when // - it was explicitly aborted (engAbortDataStoreSync() called, fAbortStatusCode set) // - session is suspending and the datastore has not yet completed sync up to sending // maps (client) or admin already saved (server+client). // If client has sent maps, all that MIGHT be missing would be map status, and // if that hasn't arrived, the pendingMaps mechanism will make sure these get // sent in the next session. bool TLocalEngineDS::isAborted(void) { return fAbortStatusCode!=0 || (fSessionP->isSuspending() && !testState(dssta_clientmapssent)); } // TLocalEngineDS::isAborted // abort sync with this datastore void TLocalEngineDS::engAbortDataStoreSync(TSyError aStatusCode, bool aLocalProblem, bool aResumable) { if (fLocalDSState!=dssta_idle && !fAbortStatusCode) { // prepare status fAbortStatusCode = aStatusCode ? aStatusCode : 514; // make sure we have a non-zero fAbortStatusCode fLocalAbortCause = aLocalProblem; if (!aResumable) preventResuming(); // prevent resuming PDEBUGBLOCKFMT(( "DSAbort","Aborting datastore sync","abortStatusCode=%hd|localProblem=%s|resumable=%s", aStatusCode, aLocalProblem ? "yes" : "no", aResumable ? "yes" : "no" )); // tell that to the session fSessionP->DatastoreFailed(aStatusCode,aLocalProblem); // as soon as sync set is ready, we have potentially started the sync and resume makes sense // NOTE: before we have made the sync set ready, WE MUST NOT resume, because making the sync // set ready includes zapping it on slow refreshes, and this is only done when not resuming // (so saving a suspend state before dssta_syncsetready would cause that the zapping is // possibly skipped) if (!testState(dssta_syncsetready)) preventResuming(); // prevent resuming before sync set is ready // save resume (or non-resumable!) status only if this is NOT A TIMEOUT, because if it is a // (server) timeout, suspend state was saved at end of last request, and writing again here would destroy // the state. if (aStatusCode!=408) { engSaveSuspendState(true); // save even if already aborted } // let derivates know dsAbortDatastoreSync(aStatusCode, aLocalProblem); // show abort PDEBUGPRINTFX(DBG_ERROR,( "*************** Warning: Datastore flagged aborted (after %ld sec. request processing, %ld sec. total) with %s Status %hd", (long)((getSession()->getSystemNowAs(TCTX_UTC)-fSessionP->getLastRequestStarted()) / secondToLinearTimeFactor), (long)((getSession()->getSystemNowAs(TCTX_UTC)-fSessionP->getSessionStarted()) / secondToLinearTimeFactor), aLocalProblem ? "LOCAL" : "REMOTE", aStatusCode )); DB_PROGRESS_EVENT( this, pev_syncend, getAbortStatusCode(), fSlowSync ? (fFirstTimeSync ? 2 : 1) : 0, fResuming ? 1 : 0 ); PDEBUGENDBLOCK("DSAbort"); } } // TLocalEngineDS::engAbortDataStoreSync // check if aborted, set status to abort reason code if yes bool TLocalEngineDS::CheckAborted(TStatusCommand &aStatusCommand) { if (fAbortStatusCode!=0) { aStatusCommand.setStatusCode( fSessionP->getSyncMLVersion()>=syncml_vers_1_1 ? 514 : // cancelled (fAbortStatusCodegetSessionStarted()); StringSubst(aLog,"%ssT",s,4); } // %sdT sync duration (in seconds) for this datastore (start of session until datastore finished) StringSubst(aLog,"%sdT",((sInt32)(fEndOfSyncTime-fSessionP->getSessionStarted())/secondToLinearTimeFactor),4); // %nD Datastore name StringSubst(aLog,"%nD",getName(),3); // %rD Datastore remote path StringSubst(aLog,"%rD",fRemoteDBPath,3); // %lD Datastore local path (complete with all CGI) StringSubst(aLog,"%lD",fRemoteViewOfLocalURI,3); // %iR Remote Device ID (URI) StringSubst(aLog,"%iR",fSessionP->getRemoteURI(),3); // %nR Remote name: [Manufacturer ]Model") StringSubst(aLog,"%nR",fSessionP->getRemoteDescName(),3); // %vR Remote Device Version Info ("Type (HWV, FWV, SWV) Oem") StringSubst(aLog,"%vR",fSessionP->getRemoteInfoString(),3); // %U User Name StringSubst(aLog,"%U",fSessionP->getSyncUserName(),2); // %iS local Session ID StringSubst(aLog,"%iS",fSessionP->getLocalSessionID(),3); // %sS Status code (0 if successful) StringSubst(aLog,"%sS",fAbortStatusCode,3); // %ssS Session Status code (0 if successful) StringSubst(aLog,"%ssS",fSessionP->getAbortReasonStatus(),4); // %syV SyncML version (as text) of session StringSubst(aLog,"%syV",SyncMLVerDTDNames[fSessionP->getSyncMLVersion()],4); // %syV SyncML version numeric (0=unknown, 1=1.0, 2=1.1, 3=1.2) of session StringSubst(aLog,"%syVn",(long)fSessionP->getSyncMLVersion(),5); // %mS Syncmode (0=twoway, 1=fromclient 2=fromserver) StringSubst(aLog,"%mS",(sInt32)fSyncMode,3); // %tS Synctype (0=normal,1=slow,2=firsttime slow, +10 if resumed session) StringSubst(aLog,"%tS",(fSlowSync ? (fFirstTimeSync ? 2 : 1) : 0) + (isResuming() ? 10 : 0),3); // %laI locally added Items StringSubst(aLog,"%laI",fLocalItemsAdded,4); // %raI remotely added Items StringSubst(aLog,"%raI",fRemoteItemsAdded,4); // %ldI locally deleted Items StringSubst(aLog,"%ldI",fLocalItemsDeleted,4); // %rdI remotely deleted Items StringSubst(aLog,"%rdI",fRemoteItemsDeleted,4); // %luI locally updated Items StringSubst(aLog,"%luI",fLocalItemsUpdated,4); // %ruI remotely updated Items StringSubst(aLog,"%ruI",fRemoteItemsUpdated,4); // %reI locally not accepted Items (sent error to remote, remote MAY resend them or abort the session) StringSubst(aLog,"%leI",fLocalItemsError,4); // %leI remotely not accepted Items (got error from remote, local will resend them later) StringSubst(aLog,"%reI",fRemoteItemsError,4); #ifdef SYSYNC_SERVER if (IS_SERVER) { // %smI Slowsync matched Items StringSubst(aLog,"%smI",fSlowSyncMatches,4); // %scI Server won Conflicts StringSubst(aLog,"%scI",fConflictsServerWins,4); // %ccI Client won Conflicts StringSubst(aLog,"%ccI",fConflictsClientWins,4); // %dcI Conflicts with duplications StringSubst(aLog,"%dcI",fConflictsDuplicated,4); // %tiB total incoming bytes StringSubst(aLog,"%tiB",fSessionP->getIncomingBytes(),4); // %toB total outgoing bytes StringSubst(aLog,"%toB",fSessionP->getOutgoingBytes(),4); } #endif // %niB net incoming data bytes for this datastore StringSubst(aLog,"%diB",fIncomingDataBytes,4); // %noB net incoming data bytes for this datastore StringSubst(aLog,"%doB",fOutgoingDataBytes,4); #endif } // TLocalEngineDS::DoLogSubstitutions // log datastore sync result // - Called at end of sync with this datastore void TLocalEngineDS::dsLogSyncResult(void) { #ifndef MINIMAL_CODE if (fSessionP->logEnabled()) { string logtext; logtext=fSessionP->getSessionConfig()->fLogFileFormat; if (!logtext.empty()) { // substitute DoLogSubstitutions(logtext,true); // plaintext // show fSessionP->WriteLogLine(logtext.c_str()); } } #endif } // TLocalEngineDS::dsLogSyncResult // Terminate all activity with this datastore // Note: may be called repeatedly, must only execute relevant shutdown code once void TLocalEngineDS::engTerminateDatastore(localstatus aAbortStatusCode) { // now abort (if not already aborted), then finish activities engFinishDataStoreSync(aAbortStatusCode); // and finally reset completely engResetDataStore(); } // TLocalEngineDS::TerminateDatastore // called at very end of sync session, when everything is done // Note: is also called before deleting a datastore (so aborted sessions // can do cleanup and/or statistics display as well) void TLocalEngineDS::engFinishDataStoreSync(localstatus aErrorStatus) { // set end of sync time fEndOfSyncTime = getSession()->getSystemNowAs(TCTX_UTC); // check if we have something to do at all if (fLocalDSState!=dssta_idle && fLocalDSState!=dssta_completed) { if (aErrorStatus==LOCERR_OK) { // Check if we need to abort now due to failed items only if (fRemoteItemsError>0) { // remote reported errors if (fSlowSync && fRemoteItemsAdded==0 && fRemoteItemsDeleted==0 && fRemoteItemsUpdated==0 && fSessionP->getSessionConfig()->fAbortOnAllItemsFailed) { PDEBUGPRINTFX(DBG_ERROR+DBG_DETAILS,("All remote item operations failed -> abort sync")); engAbortDataStoreSync(512,false,false); // remote problems (only failed items in a slow sync) caused sync to fail, not resumable } else fSessionP->DatastoreHadErrors(); // at least SOME items were successful, so it's not a completely unsuccessful sync } } // abort, if requested from caller or only-failed-items if (aErrorStatus!=LOCERR_OK) engAbortDataStoreSync(aErrorStatus,true); // if we have an error here, this is considered a local problem else { DB_PROGRESS_EVENT( this, pev_syncend, fAbortStatusCode, fSlowSync ? (fFirstTimeSync ? 2 : 1) : 0, fResuming ? 1 : 0 ); } #ifdef SUPERDATASTORES // if this is part of a superdatastore, include its statistics into mine, as // superdatastore can not save any statistics. // This ensures that the result sum over all subdatastores is correct, // however the assignment of error and byte counts is not (all non-related // counts go to first subdatastores with the following code) if (fAsSubDatastoreOf) { fOutgoingDataBytes += fAsSubDatastoreOf->fOutgoingDataBytes; fIncomingDataBytes += fAsSubDatastoreOf->fIncomingDataBytes; fRemoteItemsError += fAsSubDatastoreOf->fRemoteItemsError; fLocalItemsError += fAsSubDatastoreOf->fLocalItemsError; // consumed now, clear in superdatastore fAsSubDatastoreOf->fOutgoingDataBytes=0; fAsSubDatastoreOf->fIncomingDataBytes=0; fAsSubDatastoreOf->fRemoteItemsError=0; fAsSubDatastoreOf->fLocalItemsError=0; } #endif // make log entry dsLogSyncResult(); // update my session state vars for successful sessions if (aErrorStatus==LOCERR_OK) { // update anchor fLastRemoteAnchor=fNextRemoteAnchor; fLastLocalAnchor=fNextLocalAnchor; // note: when using TStdLogicDS, this is not saved, but re-generated at next sync from timestamp // no resume fResumeAlertCode=0; // no resume item (just to make sure we don't get strange effects later) fLastItemStatus = 0; fLastSourceURI.erase(); fLastTargetURI.erase(); fPartialItemState = pi_state_none; fPIStoredSize = 0; } // now shift state to complete, let logic and implementation save the state changeState(dssta_completed,true); #ifdef SCRIPT_SUPPORT // - call DB finish script TScriptContext::execute( fDataStoreScriptContextP, fDSConfigP->fDBFinishScript, &DBFuncTable, // context's function table this // datastore pointer needed for context ); #endif } // in any case: idle now again (note: could be shift from dssta_completed to dssta_idle) changeState(dssta_idle,true); } // TLocalEngineDS::engFinishDataStoreSync /// inform everyone of coming state change localstatus TLocalEngineDS::dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { localstatus sta = LOCERR_OK; return sta; } // TLocalEngineDS::dsBeforeStateChange /// inform everyone of happened state change localstatus TLocalEngineDS::dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { localstatus sta = LOCERR_OK; if (aOldState>dssta_idle && aNewState==dssta_completed) { // we are going from a non-idle state to completed // - show statistics showStatistics(); } return sta; } // TLocalEngineDS::dsAfterStateChange // show statistics or error of current sync void TLocalEngineDS::showStatistics(void) { // Console CONSOLEPRINTF(("")); CONSOLEPRINTF(("- Sync Statistics for '%s' (%s), %s sync", getName(), fRemoteViewOfLocalURI.c_str(), fSlowSync ? "slow" : "normal" )); // now show results if (isAborted()) { // failed CONSOLEPRINTF((" ************ Failed with status code=%hd",fAbortStatusCode)); } else { // successful: show statistics on console CONSOLEPRINTF((" ==================================================")); if (IS_SERVER) { CONSOLEPRINTF((" on Server on Client")); } else { CONSOLEPRINTF((" on Client on Server")); } CONSOLEPRINTF((" Added: %9ld %9ld",(long)fLocalItemsAdded,(long)fRemoteItemsAdded)); CONSOLEPRINTF((" Deleted: %9ld %9ld",(long)fLocalItemsDeleted,(long)fRemoteItemsDeleted)); CONSOLEPRINTF((" Updated: %9ld %9ld",(long)fLocalItemsUpdated,(long)fRemoteItemsUpdated)); CONSOLEPRINTF((" Rejected with error: %9ld %9ld",(long)fLocalItemsError,(long)fRemoteItemsError)); #ifdef SYSYNC_SERVER if (IS_SERVER) { CONSOLEPRINTF((" SlowSync Matches: %9ld",(long)fSlowSyncMatches)); CONSOLEPRINTF((" Server won Conflicts: %9ld",(long)fConflictsServerWins)); CONSOLEPRINTF((" Client won Conflicts: %9ld",(long)fConflictsClientWins)); CONSOLEPRINTF((" Conflicts with Duplication: %9ld",(long)fConflictsDuplicated)); } #endif } CONSOLEPRINTF(("")); // Always provide statistics as events DB_PROGRESS_EVENT(this,pev_dsstats_l,fLocalItemsAdded,fLocalItemsUpdated,fLocalItemsDeleted); DB_PROGRESS_EVENT(this,pev_dsstats_r,fRemoteItemsAdded,fRemoteItemsUpdated,fRemoteItemsDeleted); DB_PROGRESS_EVENT(this,pev_dsstats_e,fLocalItemsError,fRemoteItemsError,0); #ifdef SYSYNC_SERVER if (IS_SERVER) { DB_PROGRESS_EVENT(this,pev_dsstats_s,fSlowSyncMatches,0,0); DB_PROGRESS_EVENT(this,pev_dsstats_c,fConflictsServerWins,fConflictsClientWins,fConflictsDuplicated); } #endif // NOTE: pev_dsstats_d should remain the last log data event sent (as it terminates collecting data in some GUIs) DB_PROGRESS_EVENT(this,pev_dsstats_d,fOutgoingDataBytes,fIncomingDataBytes,fRemoteItemsError); // Always show statistics in debug log #ifdef SYDEBUG PDEBUGPRINTFX(DBG_HOT,("Sync Statistics for '%s' (%s), %s sync", getName(), fRemoteViewOfLocalURI.c_str(), fSlowSync ? "slow" : "normal" )); if (PDEBUGTEST(DBG_HOT)) { string stats = "==================================================\n"; if (IS_SERVER) { stats += " on Server on Client\n"; } else { stats += " on Client on Server\n"; } StringObjAppendPrintf(stats,"Added: %9ld %9ld\n",(long)fLocalItemsAdded,(long)fRemoteItemsAdded); StringObjAppendPrintf(stats,"Deleted: %9ld %9ld\n",(long)fLocalItemsDeleted,(long)fRemoteItemsDeleted); StringObjAppendPrintf(stats,"Updated: %9ld %9ld\n",(long)fLocalItemsUpdated,(long)fRemoteItemsUpdated); StringObjAppendPrintf(stats,"Rejected with error: %9ld %9ld\n\n",(long)fLocalItemsError,(long)fRemoteItemsError); #ifdef SYSYNC_SERVER if (IS_SERVER) { StringObjAppendPrintf(stats,"SlowSync Matches: %9ld\n",(long)fSlowSyncMatches); StringObjAppendPrintf(stats,"Server won Conflicts: %9ld\n",(long)fConflictsServerWins); StringObjAppendPrintf(stats,"Client won Conflicts: %9ld\n",(long)fConflictsClientWins); StringObjAppendPrintf(stats,"Conflicts with Duplication: %9ld\n\n",(long)fConflictsDuplicated); } #endif StringObjAppendPrintf(stats,"Content Data Bytes sent: %9ld\n",(long)fOutgoingDataBytes); StringObjAppendPrintf(stats,"Content Data Bytes received: %9ld\n\n",(long)fIncomingDataBytes); StringObjAppendPrintf(stats,"Duration of sync [seconds]: %9ld\n",(long)((fEndOfSyncTime-fSessionP->getSessionStarted())/secondToLinearTimeFactor)); PDEBUGPUTSXX(DBG_HOT,stats.c_str(),0,true); } if (isAborted()) { // failed PDEBUGPRINTFX(DBG_ERROR,("Warning: Failed with status code=%hd, statistics are incomplete!!",fAbortStatusCode)); } #endif } // TLocalEngineDS::showStatistics // create a new syncop command for sending to remote TSyncOpCommand *TLocalEngineDS::newSyncOpCommand( TSyncItem *aSyncItemP, // the sync item TSyncItemType *aSyncItemTypeP, // the sync item type cAppCharP aLocalIDPrefix ) { // get operation TSyncOperation syncop=aSyncItemP->getSyncOp(); // obtain meta SmlPcdataPtr_t metaP = newMetaType(aSyncItemTypeP->getTypeName()); // create command TSyncOpCommand *syncopcmdP = new TSyncOpCommand(fSessionP,this,syncop,metaP); // make sure item does not have stuff it is not allowed to have // %%% SCTS does not like SourceURI in Replace and Delete commands sent to Client // there are the only ones allowed to carry a GUID if (IS_SERVER) { #ifdef SYSYNC_SERVER // Server: commands only have remote IDs, except add which only has target ID if (syncop==sop_add || syncop==sop_wants_add) aSyncItemP->clearRemoteID(); // no remote ID else { if (!fDSConfigP->fAlwaysSendLocalID && aSyncItemP->hasRemoteID()) { // only if localID may not be included in all syncops, // and not if the item has no remote ID yet // // The second case had to be added to solve an issue // during suspended syncs: // - server tries to add a new item and uses the Replace op for it // - pending Replace is added to map // - next sync resends the Replace, but with empty IDs and thus // cannot be processed by client // // Log from such a failed sync: // Item localID='328' already has map entry: remoteid='', mapflags=0x1, changed=0, deleted=0, added=0, markforresume=0, savedmark=1 // Resuming and found marked-for-resume -> send replace // ... // Command 'Replace': is 1-th counted cmd, cmdsize(+tags needed to end msg)=371, available=130664 (maxfree=299132, freeaftersend=298761, notUsableBufferBytes()=168468) // Item remoteID='', localID='', datasize=334 // Replace: issued as (outgoing MsgID=2, CmdID=4), now queueing for status // ... // Status 404: Replace target not found on client -> silently ignore but remove map in server (item will be added in next session), aSyncItemP->clearLocalID(); // no local ID } } #endif } else { // Client: all commands only have local IDs aSyncItemP->clearRemoteID(); // no remote ID } // add the localID prefix if we do have a localID to send if (aSyncItemP->hasLocalID()) { if (IS_SERVER) { #ifdef SYSYNC_SERVER // make sure GUID (plus prefixes) is not exceeding allowed size adjustLocalIDforSize(aSyncItemP->fLocalID,getRemoteDatastore()->getMaxGUIDSize(),aLocalIDPrefix ? strlen(aLocalIDPrefix) : 0); #endif } // add local ID prefix, if any if (aLocalIDPrefix && *aLocalIDPrefix) aSyncItemP->fLocalID.insert(0,aLocalIDPrefix); } #ifdef SYSYNC_TARGET_OPTIONS // init item generation variables fItemSizeLimit=fSizeLimit; #else fItemSizeLimit=-1; // no limit #endif // now add item SmlItemPtr_t itemP = aSyncItemTypeP->newSmlItem(aSyncItemP,this); // check if data size is ok if (itemP && fSessionP->fMaxOutgoingObjSize) { if (itemP->data && itemP->data->content && itemP->data->length) { // there is data, check if size is ok if (itemP->data->length > (MemSize_t)fSessionP->fMaxOutgoingObjSize) { // too large, suppress it PDEBUGPRINTFX(DBG_ERROR,( "WARNING: outgoing item is larger (%ld) than MaxObjSize (%ld) of remote -> suppress now/mark for resend", (long)itemP->data->length, (long)fSessionP->fMaxOutgoingObjSize )); smlFreeItemPtr(itemP); itemP=NULL; // mark item for resend // For datastores without resume support, this will just have no effect at all engMarkItemForResend(aSyncItemP->getLocalID(),aSyncItemP->getRemoteID()); } } } if (itemP) { // add it to the command syncopcmdP->addItem(itemP); } else { // no item - command is invalid, delete it delete syncopcmdP; syncopcmdP=NULL; } // return command return syncopcmdP; } // TLocalEngineDS::newSyncOpCommand // create SyncItem suitable for being sent from local to remote TSyncItem *TLocalEngineDS::newItemForRemote( uInt16 aExpectedTypeID // typeid of expected type ) { // safety if (!canCreateItemForRemote()) SYSYNC_THROW(TSyncException("newItemForRemote called without sufficient type information ready")); // create TSyncItem *itemP = fLocalSendToRemoteTypeP->newSyncItem(fRemoteReceiveFromLocalTypeP,this); if (!itemP) SYSYNC_THROW(TSyncException("newItemForRemote could not create item")); // check type if (!itemP->isBasedOn(aExpectedTypeID)) { PDEBUGPRINTFX(DBG_ERROR,( "newItemForRemote created item of typeID %hd, caller expects %hd", itemP->getTypeID(), aExpectedTypeID )); SYSYNC_THROW(TSyncException("newItemForRemote created wrong item type")); } return itemP; } // TLocalEngineDS::newItemForRemote // return pure relative (item) URI (removes absolute part or ./ prefix) const char *TLocalEngineDS::DatastoreRelativeURI(const char *aURI) { return relativeURI(relativeURI(aURI,fSessionP->getLocalURI()),getName()); } // TLocalEngineDS::DatastoreRelativeURI // - init filtering and check if needed (sets fTypeFilteringNeeded, fFilteringNeeded and fFilteringNeededForAll) void TLocalEngineDS::initPostFetchFiltering(void) { #ifdef OBJECT_FILTERING if (!fLocalSendToRemoteTypeP) { fTypeFilteringNeeded=false; fFilteringNeeded=false; fFilteringNeededForAll=false; } else { // get basic settings from type fLocalSendToRemoteTypeP->initPostFetchFiltering(fTypeFilteringNeeded,fFilteringNeededForAll,this); fFilteringNeeded=fTypeFilteringNeeded; // NOTE: if type filtering is needed, it's the responsibility of initPostFetchFiltering() of // the type to check (using the DBHANDLESOPTS() script func) if DB does already handle // the range filters and such and possibly avoid type filtering then. // then check for standard filter requirements #ifdef SYDEBUG #ifdef SYNCML_TAF_SUPPORT if (!fTargetAddressFilter.empty()) PDEBUGPRINTFX(DBG_DATA,("using (dynamic, temporary) TAF expression from CGI : %s",fTargetAddressFilter.c_str())); if (!fIntTargetAddressFilter.empty()) PDEBUGPRINTFX(DBG_DATA,("using (dynamic, temporary) internally set TAF expression : %s",fIntTargetAddressFilter.c_str())); #endif // SYNCML_TAF_SUPPORT if (!fSyncSetFilter.empty()) PDEBUGPRINTFX(DBG_DATA,("using (dynamic) sync set filter expression : %s",fSyncSetFilter.c_str())); if (!fLocalDBFilter.empty()) PDEBUGPRINTFX(DBG_DATA,("using (static) local db filter expression : %s",fLocalDBFilter.c_str())); #endif // SYDEBUG // - if DB does the standard filters, we don't need to check them here again if (!engFilteredFetchesFromDB(true)) { // If DB does NOT do the standard filters, we have to do them here // - this is the case if we have an (old-style) sync set filter, but not filtered by DB // we need to filter all because sync set filter can be dynamic if (!fSyncSetFilter.empty()) fFilteringNeededForAll=true; // always return true if there is something to filter at all if ( !fLocalDBFilter.empty() || !fDSConfigP->fInvisibleFilter.empty() || !fSyncSetFilter.empty() || !fDSConfigP->fRemoteAcceptFilter.empty() ) fFilteringNeeded=true; } } PDEBUGPRINTFX(DBG_FILTER+DBG_HOT,( "Datastore-level postfetch filtering %sneeded%s", fFilteringNeeded ? "" : "NOT ", fFilteringNeeded ? (fFilteringNeededForAll ? " and to be applied to all records" : " only for changed records") : "" )); #endif } // TLocalEngineDS::initPostFetchFiltering // filter fetched record bool TLocalEngineDS::postFetchFiltering(TSyncItem *aSyncItemP) { #ifndef OBJECT_FILTERING return true; // no filters, always pass #else if (!aSyncItemP) return false; // null item does not pass // first do standard filters // - if DB has filtered the bool passes=true; if (fFilteringNeeded) { // - first make sure outgoing object has all properties set // such that it would pass the acceptance filter (for example KIND for calendar...) if (!aSyncItemP->makePassFilter(fDSConfigP->fRemoteAcceptFilter.c_str())) { // we could not make item pass acceptance filters PDEBUGPRINTFX(DBG_ERROR,("- item localid='%s' cannot be made passing -> ignored",aSyncItemP->getLocalID())); passes=false; } // now check for field-level filters if (passes && !engFilteredFetchesFromDB()) { // DB has not already filtered these, so we need to do it here // - "moving target" first passes=fSyncSetFilter.empty() || aSyncItemP->testFilter(fSyncSetFilter.c_str()); if (passes) { // - static filters passes = aSyncItemP->testFilter(fLocalDBFilter.c_str()) && // local filter ( fDSConfigP->fInvisibleFilter.empty() || // and either no invisibility defined... !aSyncItemP->testFilter(fDSConfigP->fInvisibleFilter.c_str()) // ...or NOT passed ); } } if (passes && fTypeFilteringNeeded) { // finally, apply type's filter passes=aSyncItemP->postFetchFiltering(this); } } else { // no filtering needed, DB has already filtered out those that would not pass // BUT: make sure outgoing items WILL pass the acceptance filter. If this // cannot be done, item will be filtered out. if (!aSyncItemP->makePassFilter(fDSConfigP->fRemoteAcceptFilter.c_str())) { // we could not make item pass acceptance filters PDEBUGPRINTFX(DBG_ERROR,("- item localid='%s' cannot be made passing -> ignored",aSyncItemP->getLocalID())); passes=false; } } #ifdef SYDEBUG if (!passes) { PDEBUGPRINTFX(DBG_DATA,("- item localid='%s' does not pass filters -> ignored",aSyncItemP->getLocalID())); } #endif // return result return passes; #endif } // TLocalEngineDS::postFetchFiltering #ifdef OBJECT_FILTERING // - called to check if incoming item passes acception filters bool TLocalEngineDS::isAcceptable(TSyncItem *aSyncItemP, TStatusCommand &aStatusCommand) { // test acceptance if (aSyncItemP->testFilter(fDSConfigP->fRemoteAcceptFilter.c_str())) return true; // ok // not accepted, set 415 error if (!fDSConfigP->fSilentlyDiscardUnaccepted) aStatusCommand.setStatusCode(415); ADDDEBUGITEM(aStatusCommand,"Received item does not pass acceptance filter"); PDEBUGPRINTFX(DBG_ERROR,( "Received item does not pass acceptance filter: %s", fDSConfigP->fRemoteAcceptFilter.c_str() )); return false; } // TLocalEngineDS::isAcceptable /// @brief called to make incoming item visible /// @return true if now visible bool TLocalEngineDS::makeVisible(TSyncItem *aSyncItemP) { bool invisible=false; if (!fDSConfigP->fInvisibleFilter.empty()) { invisible=aSyncItemP->testFilter(fDSConfigP->fInvisibleFilter.c_str()); } if (invisible) { return aSyncItemP->makePassFilter(fDSConfigP->fMakeVisibleFilter.c_str()); } return true; // is already visible } // TLocalEngineDS::makeVisible /// @brief called to make incoming item INvisible /// @return true if now INvisible bool TLocalEngineDS::makeInvisible(TSyncItem *aSyncItemP) { // return true if could make invisible or already was invisible if (fDSConfigP->fInvisibleFilter.empty()) return false; // no invisible filter, cannot make invisible // make pass invisible filter - if successful, we're now invisible return aSyncItemP->makePassFilter(fDSConfigP->fInvisibleFilter.c_str()); // try to make invisible (and return result) } // TLocalEngineDS::makeInvisible // - called to make incoming item pass sync set filtering bool TLocalEngineDS::makePassSyncSetFilter(TSyncItem *aSyncItemP) { bool pass=true; // make sure we pass sync set filtering and stay visible if (!fSyncSetFilter.empty()) { // try to make pass sync set filter (modifies item only if it would not pass otherwise) pass=aSyncItemP->makePassFilter(fSyncSetFilter.c_str()); } if (!pass || fSyncSetFilter.empty()) { // specified sync set filter cannot make item pass, or no sync set filter at all: // - apply makePassFilter default expression if (!fDSConfigP->fMakePassFilter.empty()) { pass=aSyncItemP->makePassFilter(fDSConfigP->fMakePassFilter.c_str()); if (pass) { // check again to check if item would pass the syncset filter now pass=aSyncItemP->testFilter(fSyncSetFilter.c_str()); } } } return pass; } // TLocalEngineDS::makePassSyncSetFilter #endif // process remote item bool TLocalEngineDS::engProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand ) { #ifdef SYSYNC_CLIENT if (IS_CLIENT) return engProcessRemoteItemAsClient(syncitemP,aStatusCommand); // status, must be set to correct status code (ok / error) #endif #ifdef SYSYNC_SERVER if (IS_SERVER) return engProcessRemoteItemAsServer(syncitemP,aStatusCommand); // status, must be set to correct status code (ok / error) #endif // neither return false; } // TLocalEngineDS::engProcessRemoteItem class SyncOpItemAux : public SmlItemAux_t { static void freeAuxImpl(SmlItemAuxPtr_t ptr); public: SyncOpItemAux(); TSyncItemType *remoteTypeP; TSyncItemType *localTypeP; TFmtTypes fmt; TSyncItem *syncitemP; }; SyncOpItemAux::SyncOpItemAux() { freeAux = freeAuxImpl; } void SyncOpItemAux::freeAuxImpl(SmlItemAuxPtr_t ptr) { delete static_cast(ptr); } // process SyncML SyncOp command for this datastore bool TLocalEngineDS::engProcessSyncOpItem( TSyncOperation aSyncOp, // the operation SmlItemPtr_t aItemP, // the item to be processed SmlMetInfMetInfPtr_t aMetaP, // command-wide meta, if any TStatusCommand &aStatusCommand // pre-set 200 status, can be modified in case of errors ) { bool regular = false; // determine SyncItemType that can handle this item data if (fRemoteDatastoreP==NULL) { PDEBUGPRINTFX(DBG_ERROR,("engProcessSyncOpItem: Remote Datastore not known")); aStatusCommand.setStatusCode(500); } // We need the local and remote type plus format to // process the item. TSyncItemType *remoteTypeP; TSyncItemType *localTypeP; TFmtTypes fmt; TSyncItem *syncitemP=NULL; string versstr; SyncOpItemAux *aux = aItemP->aux ? static_cast(aItemP->aux) : NULL; if (aux) { // Reuse the previously calculated // values when being called again. remoteTypeP = aux->remoteTypeP; localTypeP = aux->remoteTypeP; fmt = aux->fmt; syncitemP = aux->syncitemP; goto process; } if (false) { again: if (!aux) { aux = new SyncOpItemAux; } aItemP->aux = aux; // cppcheck-suppress uninitvar aux->remoteTypeP = remoteTypeP; // cppcheck-suppress uninitvar aux->localTypeP = localTypeP; aux->fmt = fmt; aux->syncitemP = syncitemP; return false; } // - start with default remoteTypeP=getRemoteSendType(); localTypeP=getLocalReceiveType(); // - see if command-wide meta plus item contents specify another type // (item meta, if present, overrides command wide meta) // see if item itself or command meta specify a type name or format SmlMetInfMetInfPtr_t itemmetaP; itemmetaP = smlPCDataToMetInfP(aItemP->meta); // - format fmt=fmt_chr; if (itemmetaP && itemmetaP->format) smlPCDataToFormat(itemmetaP->format,fmt); // use type name from item's meta else if (aMetaP && aMetaP->format) smlPCDataToFormat(aMetaP->format,fmt); // use type name from command-wide meta // - type const char *typestr; typestr = NULL; if (itemmetaP && itemmetaP->type) typestr = smlPCDataToCharP(itemmetaP->type); // use type name from item's meta else if (aMetaP && aMetaP->type) typestr = smlPCDataToCharP(aMetaP->type); // use type name from command-wide meta // check if there is a type specified if (typestr) { PDEBUGPRINTFX(DBG_DATA,("Explicit type '%s' specified in command or item meta",typestr)); if (strcmp(remoteTypeP->getTypeName(),typestr)!=0) { // specified type is NOT default type: search appropriate remote type remoteTypeP=fRemoteDatastoreP->getSendType(typestr,NULL); // no version known so far if (!remoteTypeP) { // specified type is not a remote type listed in remote's devInf. // But as remote is actually using it, we can assume it does support it, so use local type of same name instead PDEBUGPRINTFX(DBG_ERROR,("According to remote devInf, '%s' is not supported, but obviously it is used here so we try to handle it",typestr)); // look it up in local datastore's list remoteTypeP=getReceiveType(typestr,NULL); } } if (remoteTypeP) { #ifdef APP_CAN_EXPIRE // get modified date of item lineardate_t moddat=0; // IMPORTANT, must be initialized in case expiryFromData returns nothing! bool ok = remoteTypeP->expiryFromData(aItemP,moddat)<=MAX_EXPIRY_DIFF+5; // ok==true: we are within hard expiry // ok==false: we are out of hard expiry #ifdef SYSER_REGISTRATION if (getSession()->getSyncAppBase()->fRegOK) { // we have a license (permanent or timed) --> hard expiry is irrelevant // (so override ok according to validity of current license) ok=true; // assume ok // check if license is timed, and if so, check if mod date is within timed range // (if not, set ok to false) uInt8 rd = getSession()->getSyncAppBase()->fRegDuration; if (rd) { lineardate_t ending = date2lineardate(rd/12+2000,rd%12+1,1); ok = ending>=moddat; // ok if not modified after end of license period } } #endif // when we have no license (neither permanent nor timed), hard expiry decides as is // (so just use ok as is) if (!ok) { aStatusCommand.setStatusCode(403); // forbidden to hack this expiry stuff! fSessionP->AbortSession(403,true); // local problem return false; } #endif // APP_CAN_EXPIRE // we have a type, which should be able to determine version from data if (remoteTypeP->versionFromData(aItemP,versstr)) { // version found, Make sure version matches as well PDEBUGPRINTFX(DBG_DATA,("Version '%s' obtained from item data",versstr.c_str())); // check if current remotetype already has correct version (and type, but we know this already) if (!remoteTypeP->supportsType(remoteTypeP->getTypeName(),versstr.c_str(),true)) { // no, type/vers do not match, search again remoteTypeP=fRemoteDatastoreP->getSendType(typestr,versstr.c_str()); if (!remoteTypeP) { // specified type is not a remote type listed in remote's devInf. // But as remote is actually using it, we can assume it does support it, so use local type of same name instead PDEBUGPRINTFX(DBG_ERROR,("According to remote devInf, '%s' version '%s' is not supported, but obviously it is used here so we try to handle it",typestr,versstr.c_str())); // look it up in local datastore's list remoteTypeP=getReceiveType(typestr,versstr.c_str()); } } } else { PDEBUGPRINTFX(DBG_HOT,("Version could not be obtained from item data")); } } if (!remoteTypeP) { // no matching remote type: fail aStatusCommand.setStatusCode(415); ADDDEBUGITEM(aStatusCommand,"Incompatible content type specified in command or item meta"); PDEBUGPRINTFX(DBG_ERROR,( "Incompatible content type '%s' version '%s' specified in command or item meta", typestr, versstr.empty() ? "[none]" : versstr.c_str() )); return false; // irregular } else { // we have the remote type, now determine matching local type // - first check if this is compatible with the existing localTypeP (which // was possibly selected by remote rule match if (!localTypeP->supportsType(remoteTypeP->getTypeName(),remoteTypeP->getTypeVers(),false)) { // current default local type does not support specified remote type // - find a matching local type localTypeP=getReceiveType(remoteTypeP); #ifdef SYDEBUG if (localTypeP) { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,( "Explicit type '%s' does not match default type -> switching to local type '%s' for processing item", typestr, localTypeP->getTypeConfig()->getName() )); } #endif } } } // Now process or resume. We cannot jump right into // the block because of the try/catch, so some checks // for resuming are necessary. process: if (localTypeP && remoteTypeP) { // create the item (might have empty data in case of delete) if (!syncitemP) syncitemP=remoteTypeP->newSyncItem(aItemP,aSyncOp,fmt,localTypeP,this,aStatusCommand); if (!syncitemP) { // failed to create item return false; // irregular } // Now start the real processing PDEBUGBLOCKFMT(("Process_Item","processing remote item", "SyncOp=%s|LocalID=%s|RemoteID=%s", SyncOpNames[syncitemP->getSyncOp()], syncitemP->getLocalID(), syncitemP->getRemoteID() )); #ifdef SCRIPT_SUPPORT TErrorFuncContext errctx; errctx.syncop = syncitemP->getSyncOp(); #endif SYSYNC_TRY { // this call frees the item, unless it wants to be called again regular = engProcessRemoteItem(syncitemP,aStatusCommand); if (aStatusCommand.getStatusCode() == LOCERR_AGAIN) { goto again; } syncitemP = NULL; PDEBUGENDBLOCK("Process_Item"); } SYSYNC_CATCH (...) // Hmm, was the item freed? Not sure, so assume that it was freed. PDEBUGENDBLOCK("Process_Item"); SYSYNC_RETHROW; SYSYNC_ENDCATCH // Check for datastore level scripts that might change the status code and/or regular status #ifdef SCRIPT_SUPPORT errctx.statuscode = aStatusCommand.getStatusCode(); errctx.newstatuscode = errctx.statuscode; errctx.datastoreP = this; // call script regular = TScriptContext::executeTest( regular, // pass through regular status fDataStoreScriptContextP, fDSConfigP->fReceivedItemStatusScript, &ErrorFuncTable, &errctx // caller context ); // use possibly modified status code #ifdef SYDEBUG if (aStatusCommand.getStatusCode() != errctx.newstatuscode) { PDEBUGPRINTFX(DBG_ERROR,("Status: Datastore script changed original status=%hd to %hd (original op was %s)",aStatusCommand.getStatusCode(),errctx.newstatuscode,SyncOpNames[errctx.syncop])); } #endif aStatusCommand.setStatusCode(errctx.newstatuscode); #endif if (regular) { // item 100% successfully processed // - set new defaults to same type as current item setReceiveTypeInfo(localTypeP,remoteTypeP); } } else { // missing remote or local type: fail aStatusCommand.setStatusCode(415); ADDDEBUGITEM(aStatusCommand,"Unknown content type"); PDEBUGPRINTFX(DBG_ERROR,( "Missing remote or local SyncItemType" )); regular=false; // irregular } return regular; } // TLocalEngineDS::engProcessSyncOpItem #ifdef SYSYNC_SERVER // Server Case // =========== // helper to cause database version of an item (as identified by aSyncItemP's ID) to be sent to client // (aka "force a conflict") TSyncItem *TLocalEngineDS::SendDBVersionOfItemAsServer(TSyncItem *aSyncItemP) { TStatusCommand dummy(fSessionP); // - create new item TSyncItem *conflictingItemP = newItemForRemote(aSyncItemP->getTypeID()); if (!conflictingItemP) return NULL; // - set IDs conflictingItemP->setLocalID(aSyncItemP->getLocalID()); conflictingItemP->setRemoteID(aSyncItemP->getRemoteID()); // - this is always a replace conflict (item exists in DB) conflictingItemP->setSyncOp(sop_wants_replace); // - try to get from DB bool ok=logicRetrieveItemByID(*conflictingItemP,dummy); if (ok && dummy.getStatusCode()!=404) { // item found in DB, add it to the sync set so it can be sent to remote // if not cancelled by dontSendItemAsServer() SendItemAsServer(conflictingItemP); PDEBUGPRINTFX(DBG_DATA,("Forced conflict with corresponding item from server DB")); } else { // no item found, we cannot force a conflict delete conflictingItemP; conflictingItemP=NULL; } return conflictingItemP; } // TLocalEngineDS::SendDBVersionOfItemAsServer // process map localstatus TLocalEngineDS::engProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) { if (!testState(dssta_syncmodestable)) { // Map received when not appropriate PDEBUGPRINTFX(DBG_ERROR,("Map not allowed in this stage of sync")); return 403; } // pre-process localID string realLocalID; if (aLocalID && *aLocalID) { // Note: Map must be ready to have either empty local or remote ID to delete an entry // perform reverse lookup of received GUID to real GUID realLocalID = aLocalID; obtainRealLocalID(realLocalID); aLocalID=realLocalID.c_str(); } else { aLocalID=NULL; } // pre-process remoteID if (!aRemoteID || *aRemoteID==0) aRemoteID=NULL; // let implementation process the map command return logicProcessMap(aRemoteID, aLocalID); } // TLocalEngineDS::engProcessMap enum LocalItemOp { LOCAL_ITEM_DELETE, LOCAL_ITEM_ADD_NORMAL, LOCAL_ITEM_ADD_DELETED, LOCAL_ITEM_ADD_DUPLICATE, LOCAL_ITEM_REPLACE_MERGED, LOCAL_ITEM_REPLACE_FROM_CLIENT, LOCAL_ITEM_REPLACE, LOCAL_ITEM_ADD_MERGED, LOCAL_ITEM_REPLACE_MERGED2, LOCAL_ITEM_ADD_SLOW }; struct TLocalSyncItemAux : public TSyncItemAux { TSyncItem *fConflictingItemP; TSyncItem *fEchoItemP; TSyncItem *fDelItemP; TSyncItem *fMatchingItemP; bool fChangedIncoming; bool fChangedExisting; bool fRemainsVisible; TSyncOperation fSyncOp; uInt16 fItemTypeID; string fRemoteID; LocalItemOp fOp; TSyncOperation fCurrentSyncOp; TSyncOperation fEchoItemOp; TConflictResolution fItemConflictStrategy; bool fForceConflict; bool fDeleteWins; bool fPreventAdd; bool fIgnoreUpdate; sInt16 fRejectStatus; }; // process sync operation from client with specified sync item // (according to current sync mode of local datastore) // - returns true (and unmodified or non-200-successful status) if // operation could be processed regularily // - returns false (but probably still successful status) if // operation was processed with internal irregularities, such as // trying to delete non-existant item in datastore with // incomplete Rollbacks (which returns status 200 in this case!). bool TLocalEngineDS::engProcessRemoteItemAsServer( TSyncItem *aSyncItemP, TStatusCommand &aStatusCommand // status, must be set to correct status code (ok / error) ) { // The logic of this function is pretty complex. Instead of trying // to retrace our steps when called again after a LOCERR_AGAIN, let's // jump to labels directly. For that to work, all local variables // must be defined before the goto. TSyncItem *conflictingItemP; TSyncItem *echoItemP; TSyncItem *delitemP; TSyncItem *matchingItemP = NULL; bool changedincoming; bool changedexisting; bool remainsvisible; TSyncOperation syncop; uInt16 itemtypeid; string remoteid; LocalItemOp op; bool ok=false; TLocalSyncItemAux *aux = static_cast(aSyncItemP->getAux(TSyncItem::LOCAL_ENGINE)); if (aux) { // Resuming the function call: restore variables, jump to store // method call. // // The compiler will tell us if we jump across a variable // instantiation which initializes the variable ("jump bypasses // variable initialization"). Variables which are not needed when // resuming must be initialized with normal assignments to avoid // this error. Variables which are needed, need to be moved to the // section above and added to the store/restore. conflictingItemP = aux->fConflictingItemP; echoItemP = aux->fEchoItemP; delitemP = aux->fDelItemP; matchingItemP = aux->fMatchingItemP; changedincoming = aux->fChangedIncoming; changedexisting = aux->fChangedExisting; remainsvisible = aux->fRemainsVisible; syncop = aux->fSyncOp; itemtypeid = aux->fItemTypeID; remoteid = aux->fRemoteID; op = aux->fOp; // Besides the local variables, we also need to set members // to the value they had before leaving. See checkItem() below. // Some of these will never be different from the default because // if they got set in the first call, we don't queue and thus // don't get here. But restore them anyway, just to be sure. fCurrentSyncOp = aux->fCurrentSyncOp; fEchoItemOp = aux->fEchoItemOp; fItemConflictStrategy = aux->fItemConflictStrategy; fForceConflict = aux->fForceConflict; fDeleteWins = aux->fDeleteWins; fPreventAdd = aux->fPreventAdd; fIgnoreUpdate = aux->fIgnoreUpdate; fRejectStatus = aux->fRejectStatus; PDEBUGPRINTFX(DBG_DATA,("%s item operation resumed",SyncOpNames[syncop])); switch (op) { case LOCAL_ITEM_DELETE: goto do_delete; case LOCAL_ITEM_ADD_NORMAL: goto do_add_normal; case LOCAL_ITEM_ADD_DELETED: goto do_add_deleted; case LOCAL_ITEM_ADD_DUPLICATE: goto do_add_duplicate; case LOCAL_ITEM_REPLACE_MERGED: goto do_replace_merged; case LOCAL_ITEM_REPLACE_FROM_CLIENT: goto do_replace_from_client; case LOCAL_ITEM_REPLACE: goto do_replace; case LOCAL_ITEM_ADD_MERGED: goto do_add_merged; case LOCAL_ITEM_REPLACE_MERGED2: goto do_replace_merged2; case LOCAL_ITEM_ADD_SLOW: goto do_add_slow; }; } if (false) { // Prepare for resuming the function call. Will only be reached // via goto with "op" set to something identifying the source of // the jump. again: #define CHECK_FOR_AGAIN(_op) \ if (aStatusCommand.getStatusCode() == LOCERR_AGAIN) { \ op = _op; \ goto again; \ } if (!aux) { aux = new TLocalSyncItemAux; aSyncItemP->setAux(TSyncItem::LOCAL_ENGINE, aux); } // cppcheck-suppress uninitvar aux->fConflictingItemP = conflictingItemP; // cppcheck-suppress uninitvar aux->fEchoItemP = echoItemP; // cppcheck-suppress uninitvar aux->fDelItemP = delitemP; aux->fMatchingItemP = matchingItemP; // cppcheck-suppress uninitvar aux->fChangedIncoming = changedincoming; // cppcheck-suppress uninitvar aux->fChangedExisting = changedexisting; // cppcheck-suppress uninitvar aux->fRemainsVisible = remainsvisible; aux->fSyncOp = syncop; aux->fItemTypeID = itemtypeid; aux->fRemoteID = remoteid; // cppcheck-suppress uninitvar aux->fOp = op; aux->fCurrentSyncOp = fCurrentSyncOp; aux->fEchoItemOp = fEchoItemOp; aux->fItemConflictStrategy = fItemConflictStrategy; aux->fForceConflict = fForceConflict; aux->fDeleteWins = fDeleteWins; aux->fPreventAdd = fPreventAdd; aux->fIgnoreUpdate = fIgnoreUpdate; aux->fRejectStatus = fRejectStatus; aStatusCommand.setStatusCode(LOCERR_AGAIN); return false; } // Normal control flow: initialize variables, then execute. conflictingItemP=NULL; echoItemP=NULL; delitemP=NULL; changedincoming=false; changedexisting=false; remainsvisible=true; // usually, we want the item to remain visible in the sync set // get some info out of item (we might need it after item is already consumed) syncop=aSyncItemP->getSyncOp(); itemtypeid=aSyncItemP->getTypeID(); remoteid=aSyncItemP->getRemoteID(); // check if datastore is aborted if(CheckAborted(aStatusCommand)) return false; // send event (but no abort checking) DB_PROGRESS_EVENT(this,pev_itemreceived,++fItemsReceived,fRemoteNumberOfChanges,0); fPreventAdd = false; fIgnoreUpdate = false; // show PDEBUGPRINTFX(DBG_DATA,("%s item operation received",SyncOpNames[syncop])); // check if receiving commands is allowed at all if (fSyncMode==smo_fromserver) { // Modifications from client not allowed during update from server only aStatusCommand.setStatusCode(403); ADDDEBUGITEM(aStatusCommand,"Client command not allowed in one-way/refresh from server"); PDEBUGPRINTFX(DBG_ERROR,("Client command not allowed in one-way/refresh from server")); delete aSyncItemP; return false; } // let item check itself to catch special cases // - init variables which are used/modified by item checking #ifdef SYSYNC_TARGET_OPTIONS // init item generation variables fItemSizeLimit=fSizeLimit; #else fItemSizeLimit=-1; // no limit #endif fCurrentSyncOp = syncop; fEchoItemOp = sop_none; fItemConflictStrategy=fSessionConflictStrategy; // get default strategy for this item fForceConflict = false; fDeleteWins = fDSConfigP->fDeleteWins; // default to configured value fRejectStatus = -1; // no rejection // - now check // check reads and possibly modifies: // - fEchoItemOp : if not sop_none, the incoming item is echoed back to the remote with the specified syncop // - fItemConflictStrategy : might be changed from the pre-set datastore default // - fForceConflict : if set, a conflict is forced by adding the corresponding local item (if any) to the list of items to be sent // - fDeleteWins : if set, in a replace/delete conflict delete will win (regardless of strategy) // - fPreventAdd : if set, attempt to add item from remote (even implicitly trough replace) will cause no add but delete of remote item // - fIgnoreUpdate : if set, attempt to update item from remote will be ignored, only adds (also implicit ones) are executed // - fRejectStatus : if set>=0, incoming item is irgnored silently(==0) or with error(!=0) aSyncItemP->checkItem(this); // - create echo item if we need one if (fEchoItemOp!=sop_none) { // Note: sop_add makes no sense at all. // Note: If echo is enabled, conflicts are not checked, as echo makes only sense in // cases where we know that a conflict cannot occur or is irrelevant // - artifically create a "conflicting" item, that is, one to be sent back to remote echoItemP=newItemForRemote(aSyncItemP->getTypeID()); // - assign data from incoming item if echo is not a delete if (fEchoItemOp!=sop_delete && fEchoItemOp!=sop_archive_delete && fEchoItemOp!=sop_soft_delete) echoItemP->replaceDataFrom(*aSyncItemP); // - set remote ID (note again: sop_add makes no sense here) echoItemP->setRemoteID(aSyncItemP->getRemoteID()); // - set sop echoItemP->setSyncOp(fEchoItemOp); // - now check for possible conflict if (!fSlowSync) { conflictingItemP = getConflictingItemByRemoteID(aSyncItemP); // remove item if there is one that would conflict with the echo if (conflictingItemP) dontSendItemAsServer(conflictingItemP); conflictingItemP = NULL; } // - add echo to the list of items to be sent (DB takes ownership) SendItemAsServer(echoItemP); PDEBUGPRINTFX(DBG_DATA,("Echoed item back to remote with sop=%s",SyncOpNames[fEchoItemOp])); // process item normally (except that we don't check for LUID conflicts) } // - check if incoming item should be processed at all if (fRejectStatus>=0) { // Note: a forced conflict can still occur even if item is rejected // (this has the effect of unconditionally letting the server item win) if (fForceConflict && syncop!=sop_add) { conflictingItemP = SendDBVersionOfItemAsServer(aSyncItemP); // Note: conflictingitem is always a replace if (conflictingItemP) { if (syncop==sop_delete) { // original was delete, forced conflict means re-adding to remote conflictingItemP->setSyncOp(sop_wants_add); } else { // merge here because we'll not process the item further conflictingItemP->mergeWith(*aSyncItemP,changedexisting,changedincoming,this); } } } // now discard the incoming item delete aSyncItemP; PDEBUGPRINTFX(fRejectStatus>=400 ? DBG_ERROR : DBG_DATA,("Item rejected with Status=%hd",fRejectStatus)); if (fRejectStatus>0) { // rejected with status code (not necessarily error) aStatusCommand.setStatusCode(fRejectStatus); if (fRejectStatus>=300) { // non 200-codes are errors ADDDEBUGITEM(aStatusCommand,"Item rejected"); return false; } } // silently rejected return true; } // now perform requested operation localstatus sta; switch (syncop) { readonly_delete: // read-only handling of delete is like soft delete: remove map entry, but nothing else PDEBUGPRINTFX(DBG_DATA,("Read-Only Datastore: Prevented actual deletion, just removing map entry")); case sop_soft_delete: // Readonly: allowed, as only map is touched // soft delete from client is treated as an indication that the item was // removed from the client's datastore, but is still in the set // of sync data for that client. // This means that the map item must be removed. // - when the item is hard-deleted on the server, nothing will happen at next sync // - when the item is modified on the server, it will be re-added to the client at next sync // - when slow sync is performed, the item will be re-added, too. // %%%%% Note that this does NOT work as it is now, as adds also occur for non-modified // items that have no map AND are visible under current targetFilter. // probably we should use a map entry with no remoteID for soft-deleted items later.... // Delete Map entry by remote ID aSyncItemP->clearLocalID(); // none sta=engProcessMap(aSyncItemP->getRemoteID(),NULL); ok=sta==LOCERR_OK; aStatusCommand.setStatusCode(ok ? 200 : sta); break; case sop_archive_delete: if (fReadOnly) goto readonly_delete; // register removal of item in map, but do nothing to data itself #ifdef OBJECT_FILTERING if (!fDSConfigP->fInvisibleFilter.empty()) { // turn into replace with all fields unavailable but made to pass invisible filter // - make sure that no data field is assigned aSyncItemP->cleardata(); // - make item pass "invisible" filter if (aSyncItemP->makePassFilter(fDSConfigP->fInvisibleFilter.c_str())) { // item now passes invisible rule, that is, it is invisible -> replace in DB goto archive_delete; } } // fall trough, no archive delete supported #endif // No archive delete support if there is no filter to detect/generate invisibles // before SyncML 1.1 : we could return 210 here and still process the delete op. // SyncML 1.1 : we must return 501 (not implemented) here aStatusCommand.setStatusCode(501); PDEBUGPRINTFX(DBG_ERROR,("Datastore does not support Archive-Delete, error status = 501")); delete aSyncItemP; ok=false; break; case sop_delete: // delete item by LUID if (fSlowSync) { aStatusCommand.setStatusCode(403); ADDDEBUGITEM(aStatusCommand,"Delete during slow sync not allowed"); PDEBUGPRINTFX(DBG_ERROR,("Delete during slow sync not allowed")); delete aSyncItemP; ok=false; break; } // check for conflict with replace from server // Note: conflict cases do not change local DB, so they are allowed before checking fReadOnly if (!echoItemP) conflictingItemP = getConflictingItemByRemoteID(aSyncItemP); // do not check conflicts if we have already created an echo // - check if we must force the conflict if (!conflictingItemP && fForceConflict) { conflictingItemP=SendDBVersionOfItemAsServer(aSyncItemP); } if (conflictingItemP) { // conflict only if other party has replace if (conflictingItemP->getSyncOp()==sop_replace || conflictingItemP->getSyncOp()==sop_wants_replace) { if (!fDeleteWins) { // act as if successfully deleted and cause re-adding of still existing server item // - discard deletion delete aSyncItemP; // - remove map entry for this item (it no longer exists on the client) sta = engProcessMap(NULL,conflictingItemP->getLocalID()); aStatusCommand.setStatusCode(sta==LOCERR_OK ? 200 : sta); // - change replace to add (as to-be-replaced item is already deleted on remote) conflictingItemP->setSyncOp(sop_add); // - remove remote ID (will be assigned a new ID because the item is now re-added) conflictingItemP->setRemoteID(""); // - no server operation needed PDEBUGPRINTFX(DBG_DATA,("Conflict of Client Delete with Server replace -> discarded delete, re-added server item to client")); ok=true; break; } else { // delete preceedes replace // - avoid sending item from server dontSendItemAsServer(conflictingItemP); // - let delete happen } } // if both have deleted the item, we should remove the map // and avoid sending a delete to the client else if (conflictingItemP->getSyncOp()==sop_delete) { // - discard deletion delete aSyncItemP; // - remove map entry for this item (it no longer exists) sta = engProcessMap(NULL,conflictingItemP->getLocalID()); aStatusCommand.setStatusCode(sta==LOCERR_OK ? 200 : sta); // - make sure delete from server is not sent dontSendItemAsServer(conflictingItemP); PDEBUGPRINTFX(DBG_DATA,("Client and Server have deleted same item -> just removed map entry")); ok=true; break; } } // real delete is discarded silently when fReadOnly is set if (fReadOnly) goto readonly_delete; // register removal of item in map, but do nothing to data itself // really delete fLocalItemsDeleted++; remainsvisible=false; // deleted not visible any more do_delete: ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // delete in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_DELETE); break; case sop_copy: if (fReadOnly) { delete aSyncItemP; // we don't need it aStatusCommand.setStatusCode(200); PDEBUGPRINTFX(DBG_DATA,("Read-Only: copy command silently discarded")); ok=true; break; } // %%% note: this would belong into specific datastore implementation, but is here // now for simplicity as copy isn't used heavily het // retrieve data from local datastore if (!logicRetrieveItemByID(*aSyncItemP,aStatusCommand)) { ok=false; break; } // process like add /// @todo %%%%%%%%%%%%%%%% NOTE: MISSING SENDING BACK MAP COMMAND for new GUID created goto normal_add; case sop_add: // test for slow sync if (fSlowSync) goto sop_slow_add; // add in slow sync is like replace normal_add: // add as new item to server DB aStatusCommand.setStatusCode(201); // item added (if no error occurs) if (fReadOnly) { delete aSyncItemP; // we don't need it PDEBUGPRINTFX(DBG_DATA,("Read-Only: add command silently discarded")); ok=true; break; } // check if adds are prevented if (!fPreventAdd) { // add allowed fLocalItemsAdded++; #ifdef OBJECT_FILTERING // test if acceptable if (!isAcceptable(aSyncItemP,aStatusCommand)) { ok=false; break; } // cannot be accepted // Note: making item to pass sync set filter is implemented in derived DB implementation // as criteria for passing might be in data that must first be read from the DB #endif do_add_normal: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // add to local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_ADD_NORMAL); if (!remainsvisible && fSessionP->getSyncMLVersion()>=syncml_vers_1_2) { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Added item is not visible under current filters -> remove it on client")); goto removefromremoteandsyncset; } break; } goto preventadd; archive_delete: sop_slow_add: aSyncItemP->setSyncOp(sop_replace); // set correct op // ...and process like replace case sop_reference_only: case sop_replace: #ifdef OBJECT_FILTERING // test if acceptable if (!isAcceptable(aSyncItemP,aStatusCommand)) { ok=false; break; } // cannot be accepted // Note: making item to pass sync set filter is implemented in derived DB implementation // as criteria for passing might be in data that must first be read from the DB #endif // check for conflict with server side modifications if (!fSlowSync) { if (!echoItemP) conflictingItemP = getConflictingItemByRemoteID(aSyncItemP); // - check if we must force the conflict if (!conflictingItemP && fForceConflict) { conflictingItemP=SendDBVersionOfItemAsServer(aSyncItemP); } bool deleteconflict; deleteconflict=false; if (conflictingItemP) { // Note: if there is a conflict, this replace cannot be an // implicit add, so we don't need to check for fPreventAdd // here. // Note: if we are in ignoreUpdate mode, the only conflict resolution // possible is unconditional server win sInt16 cmpRes; cmpRes = SYSYNC_NOT_COMPARABLE; // assume we can resolve the conflict aStatusCommand.setStatusCode(419); // default to server win ADDDEBUGITEM(aStatusCommand,"Conflict resolved by server"); PDEBUGPRINTFX(DBG_HOT,( "Conflict: Remote <%s> with remoteID=%s <--> Local <%s> with localID=%s, remoteID=%s", SyncOpNames[aSyncItemP->getSyncOp()], aSyncItemP->getRemoteID(), SyncOpNames[conflictingItemP->getSyncOp()], conflictingItemP->getLocalID(), conflictingItemP->getRemoteID() )); // we have a conflict, decide what to do TConflictResolution crstrategy; if (fReadOnly || fIgnoreUpdate) { // server always wins and overwrites modified client version PDEBUGPRINTFX(DBG_DATA,("Read-Only or IgnoreUpdate: server always wins")); crstrategy=cr_server_wins; } else if (fCacheData) { PDEBUGPRINTFX(DBG_DATA,("Caching data: client always wins")); crstrategy=cr_client_wins; } else { // two-way crstrategy = fItemConflictStrategy; // get conflict strategy pre-set for this item if (conflictingItemP->getSyncOp()==sop_delete) { // server wants to delete item, client wants to replace if (fDSConfigP->fTryUpdateDeleted) { // if items are not really deleted, but only made invisible, // we can assume we can update the "deleted" item // BUT ONLY if the conflict strategy is not "server always wins" if (crstrategy==cr_server_wins) { PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("Conflict of Client Replace with Server delete and strategy is server-wins -> delete from client")); aStatusCommand.setStatusCode(419); // server wins, client command ignored break; // done } else { PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("Conflict of Client Replace with Server delete -> try to update already deleted item (as it might still exist in syncset)")); // apply replace (and in case of !fDeleteWins, possible implicit add) fPreventAdd=fDeleteWins; // we want implicit add only if delete cannot win do_add_deleted: remainsvisible=!fDeleteWins; // we want to see the item in the sync set if delete does not win! ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); CHECK_FOR_AGAIN(LOCAL_ITEM_ADD_DELETED); } if (fDeleteWins) { if (!ok) { // could not update already deleted item PDEBUGPRINTFX(DBG_PROTO,("Could not update already deleted server item (seems to be really deleted, not just invisible)")); aStatusCommand.setStatusCode(419); // server wins, client command ignored } else { // update of invisible item successful, but it will still be deleted from client // Note: possibly, the update was apparently successful, but only because an UPDATE with no // target does not report an error. So effectively, no update might have happened. PDEBUGPRINTFX(DBG_PROTO,("Updated already deleted server item, but delete still wins -> client item will be deleted")); fLocalItemsUpdated++; aStatusCommand.setStatusCode(200); // client command successful (but same item will still be deleted) } // nothing more to do, let delete happen on the client (conflictingItemP delete will be sent) ok=true; } else { // not fDeleteWins - item failed, updated or implicitly added if (ok) { // update (or implicit add) successful if (aStatusCommand.getStatusCode()==201) { PDEBUGPRINTFX(DBG_PROTO,("Client Update wins and has re-added already deleted server item -> prevent delete on client")); fLocalItemsAdded++; } else { PDEBUGPRINTFX(DBG_PROTO,("Client Update wins and has updated still existing server item -> prevent delete on client")); fLocalItemsUpdated++; } // and client item wins - prevent sending delete to client // - don't send delete to client conflictingItemP->setSyncOp(sop_none); // just in case... dontSendItemAsServer(conflictingItemP); } } // done break; } else { // Normal delete conflict processing (assuming deleted items REALLY deleted) if (!fDeleteWins) { // - client always wins (replace over delete) crstrategy=cr_client_wins; deleteconflict=true; // flag condition for processing below // - change from replace to add, because item is already deleted in server and must be re-added fLocalItemsAdded++; aSyncItemP->setSyncOp(sop_add); PDEBUGPRINTFX(DBG_PROTO,("Conflict of Client Replace with Server delete -> client wins, client item is re-added to server")); } else { // delete wins, just discard incoming item delete aSyncItemP; PDEBUGPRINTFX(DBG_PROTO,("Conflict of Client Replace with Server delete -> DELETEWINS() set -> ignore client replace")); ok=true; break; } } } else { // replace from client conflicts with replace from server // - compare items for further conflict resolution // NOTE: it is serveritem.compareWith(clientitem) cmpRes = conflictingItemP->compareWith( *aSyncItemP,eqm_conflict,this #ifdef SYDEBUG ,PDEBUGTEST(DBG_CONFLICT) // show conflict comparisons in normal sync if conflict details are enabled #endif ); PDEBUGPRINTFX(DBG_DATA,( "Compared conflicting items with eqm_conflict: remoteItem %s localItem", cmpRes==0 ? "==" : (cmpRes>0 ? "<" : ">") )); // see if we can determine newer item if (crstrategy==cr_newer_wins) { if (cmpRes!=0 && conflictingItemP->sortable(*aSyncItemP)) { // newer item wins // (comparison was: serveritem.compareWith(clientitem), so // cmpRes<0 means that client is newer PDEBUGPRINTFX(DBG_PROTO,("Conflict resolved by identifying newer item")); if (cmpRes > 0) crstrategy=cr_server_wins; // server has newer item else crstrategy=cr_client_wins; // client has newer item } else { // newer item cannot be determined, duplicate items crstrategy=cr_duplicate; } PDEBUGPRINTFX(DBG_DATA,( "Newer item %sdetermined: %s", crstrategy==cr_duplicate ? "NOT " : "", crstrategy==cr_client_wins ? "Client item is newer and wins" : (crstrategy==cr_server_wins ? "Server item is newer ans wins" : "item is duplicated if different") )); } } // modify strategy based on compare if (cmpRes==0 && crstrategy==cr_duplicate) { // items are equal by definition of item comparison, // but obviously both changed, this means that changes should be // mergeable // So, by deciding arbitrarily that server has won, we will not loose any data crstrategy=cr_server_wins; // does not matter, because merge will be attempted PDEBUGPRINTFX(DBG_DATA,("Duplication avoided because items are equal by their own definition, just merge")); } // if adds prevented, we cannot duplicate, let server win if (fPreventAdd && crstrategy==cr_duplicate) crstrategy=cr_server_wins; } // not fReadOnly // now apply strategy if (crstrategy==cr_duplicate) { // add items vice versa PDEBUGPRINTFX(DBG_PROTO,("Conflict resolved by duplicating items in both databases")); aStatusCommand.setStatusCode(209); fConflictsDuplicated++; // - set server item such that it will be added as new item to client DB conflictingItemP->setSyncOp(sop_add); // - break up mapping between client and server item BEFORE adding to server // because else adding of item with already existing remoteID can fail. // In addition, item now being sent to client may not have a map before // it receives a map command from the client! sta = engProcessMap(NULL,conflictingItemP->getLocalID()); if(sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,( "Problem (status=%hd) removing map entry for LocalID='%s'", sta, conflictingItemP->getLocalID() )); } // - add client item as new item to server DB fLocalItemsAdded++; aSyncItemP->setSyncOp(sop_add); // set correct op do_add_duplicate: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // add to local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_ADD_DUPLICATE); break; } else if (crstrategy==cr_server_wins) { // Note: for fReadOnly, this is always the case! // server item wins and is sent to client PDEBUGPRINTFX(DBG_PROTO,("Conflict resolved: server item replaces client item")); aStatusCommand.setStatusCode(419); // server wins, client command ignored fConflictsServerWins++; // - make sure item is set to replace data in client conflictingItemP->setSyncOp(sop_replace); // - attempt to merge data from loosing item (accumulating fields) if (!fReadOnly) { conflictingItemP->mergeWith(*aSyncItemP,changedexisting,changedincoming,this); } if (fIgnoreUpdate) changedexisting=false; // never try to update existing item if (changedexisting) { // we have merged something, so server must be updated, too // Note: after merge, both items are equal. We check if conflictingitem // has changed, but if yes, we write the incoming item. Conflicting item // will get sent to client later PDEBUGPRINTFX(DBG_DATA,("*** Merged some data from loosing client item into winning server item")); // set correct status for conflict resultion by merge aStatusCommand.setStatusCode(207); // merged // process update in local database fLocalItemsUpdated++; aSyncItemP->setSyncOp(sop_replace); // update do_replace_merged: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // update in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_REPLACE_MERGED); break; } else { // - item sent by client has lost and can be deleted now // %%% possibly add option here to archive item in some way // BUT ONLY IF NOT fReadOnly delete aSyncItemP; } } else if (crstrategy==cr_client_wins) { // client item wins and is sent to server PDEBUGPRINTFX(DBG_PROTO,("Conflict resolved: client item replaces server item")); aStatusCommand.setStatusCode(208); // client wins fConflictsClientWins++; // - attempt to merge data from loosing item (accumulating fields) if (!fCacheData && !deleteconflict) { aSyncItemP->mergeWith(*conflictingItemP,changedincoming,changedexisting,this); } if (changedincoming) { // we have merged something, so client must be updated even if it has won // Note: after merge, both items are equal. We check if aSyncItemP // has changed, but if yes, we make sure the conflicting item gets // sent to the client PDEBUGPRINTFX(DBG_DATA,("*** Merged some data from loosing server item into winning client item")); conflictingItemP->setSyncOp(sop_replace); // update // set correct status for conflict resultion by merge aStatusCommand.setStatusCode(207); // merged // will be sent because it is in the list } else { // - make sure conflicting item from server is NOT sent to client conflictingItemP->setSyncOp(sop_none); // just in case... dontSendItemAsServer(conflictingItemP); aStatusCommand.setStatusCode(200); // ok } // - replace item in server (or leave it as is, if conflict was with delete) if (!deleteconflict) { fLocalItemsUpdated++; aSyncItemP->setSyncOp(sop_replace); } do_replace_from_client: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // replace in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_REPLACE_FROM_CLIENT); break; } } // replace conflict else { // normal replace without any conflict if (fReadOnly) { delete aSyncItemP; // we don't need it aStatusCommand.setStatusCode(200); PDEBUGPRINTFX(DBG_DATA,("Read-Only: replace command silently discarded")); ok=true; break; } // no conflict, just let client replace server's item PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,("No Conflict: client item replaces server item")); // - replace item in server (or add if item does not exist and not fPreventAdd) aSyncItemP->setSyncOp(sop_replace); do_replace: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); CHECK_FOR_AGAIN(LOCAL_ITEM_REPLACE); if (!ok) { // check if this is a 404 or 410 and fPreventAdd if (fPreventAdd && (aStatusCommand.getStatusCode()==404 || aStatusCommand.getStatusCode()==410)) goto preventadd2; // to-be-replaced item not found and implicit add prevented -> delete from remote // simply failed break; } // still visible in sync set? if (!remainsvisible && fSessionP->getSyncMLVersion()>=syncml_vers_1_2) { // -> cause item to be deleted on remote PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Item replaced no longer visible in syncset -> returning delete to remote")); goto removefromremoteandsyncset; } // processed ok if (aStatusCommand.getStatusCode()==201) fLocalItemsAdded++; else fLocalItemsUpdated++; ok=true; break; } } // normal sync else { // slow sync (replaces AND adds are treated the same) // - first do a strict search for identical item. This is required to // prevent that in case of multiple (loosely compared) matches we // catch the wrong item and cause a mess at slowsync // NOTE: we do compare only relevant fields (eqm_conflict) matchingItemP = getMatchingItem(aSyncItemP,eqm_conflict); // separate assignment, only done as part of normal control flow if (!matchingItemP) { // try again with less strict comparison (eqm_slowsync or eqm_always for firsttimesync) DEBUGPRINTFX(DBG_DATA+DBG_MATCH,("Strict search for matching item failed, try with configured EqMode now")); matchingItemP = getMatchingItem(aSyncItemP,fFirstTimeSync ? eqm_always : eqm_slowsync); } if (matchingItemP) { // both sides already have this item PDEBUGPRINTFX(DBG_DATA+DBG_HOT,( "Slow Sync Match detected - localID='%s' matches incoming item", matchingItemP->getLocalID() )); fSlowSyncMatches++; aStatusCommand.setStatusCode(syncop==sop_add ? 201 : 200); // default is: simply ok. But if original op was Add, MUST return 201 status (SCTS requires it) bool matchingok; matchingok = false; // - do not update map yet, as we still don't know if client item will // possibly be added instead of mapped // Note: ONLY in case this is a reference-only item, the map is already updated! bool mapupdated; mapupdated = syncop==sop_reference_only; // - determine which one is winning bool needserverupdate; bool needclientupdate; needserverupdate = false; needclientupdate = false; // if updates are ignored, we can short-cut here // Note: if this is a reference-only item, it was already updated (if needed) before last suspend // so skip updating now! if (syncop!=sop_reference_only && !fIgnoreUpdate) { // Not a reference-only and also updates not suppressed // - for a read-only datastore, this defaults to server always winning TConflictResolution crstrategy; crstrategy = fReadOnly ? cr_server_wins : // server always wins for read-only fItemConflictStrategy; // pre-set strategy for this item // Determine what data to use if (crstrategy==cr_newer_wins) { // use newer // Note: comparison is clientitem.compareWith(serveritem) // so if result>0, client is newer than server sInt16 cmpRes = aSyncItemP->compareWith( *matchingItemP,eqm_nocompare,this #ifdef SYDEBUG ,PDEBUGTEST(DBG_CONFLICT+DBG_DETAILS) // show age comparisons only if we want to see details #endif ); if (cmpRes==1) crstrategy=cr_client_wins; else if (cmpRes==-1 || fPreventAdd) crstrategy=cr_server_wins; // server wins if adds prevented else crstrategy=cr_duplicate; // fall back to duplication if we can't determine newer item PDEBUGPRINTFX(DBG_DATA,( "Newer item %sdetermined: %s", crstrategy==cr_duplicate ? "NOT " : "", crstrategy==cr_client_wins ? "Client item is newer and wins" : (crstrategy==cr_server_wins ? "Server item is newer and wins" : "item is duplicated if different") )); } // if adds prevented, we cannot duplicate, let server win if (fPreventAdd && crstrategy==cr_duplicate) crstrategy=cr_server_wins; else if (fCacheData) crstrategy=cr_client_wins; // now execute chosen strategy if (crstrategy==cr_client_wins) { if (fCacheData) { // - merge server's data into client item PDEBUGPRINTFX(DBG_DATA,("Caching: copying winning client item into loosing server item")); aSyncItemP->mergeWith(*matchingItemP,changedincoming,changedexisting,this, TSyncItem::MERGE_OPTION_CHANGE_OTHER); } else { // - merge server's data into client item PDEBUGPRINTFX(DBG_DATA,("Trying to merge some data from loosing server item into winning client item")); aSyncItemP->mergeWith(*matchingItemP,changedincoming,changedexisting,this); // only count if server gets updated if (changedexisting) fConflictsClientWins++; } // Note: changedexisting will cause needserverupdate to be set below } else if (crstrategy==cr_server_wins) { // - merge client data into server item PDEBUGPRINTFX(DBG_DATA,("Trying to merge some data from loosing client item into winning server item")); matchingItemP->mergeWith(*aSyncItemP,changedexisting,changedincoming,this); // only count if client gets updated if (changedincoming) fConflictsServerWins++; // Note: changedincoming will cause needclientupdate to be set below } else if (crstrategy==cr_duplicate) { // test if items are equal enough // (Note: for first-sync, compare mode for item matching can be looser // (eqm_always), so re-comparison here makes sense) if ( matchingItemP->compareWith( *aSyncItemP,eqm_slowsync,this #ifdef SYDEBUG ,PDEBUGTEST(DBG_CONFLICT+DBG_DETAILS) // show equality re-test only for details enabled #endif )!=0 ) { // items are not really equal in content, so duplicate them on both sides PDEBUGPRINTFX(DBG_PROTO,("Matching items are not fully equal, duplicate them on both sides")); fConflictsDuplicated++; // - duplicates contain merged data matchingItemP->mergeWith(*aSyncItemP,changedexisting,changedincoming,this); // - add client item (with server data merged) as new item to server fLocalItemsAdded++; aSyncItemP->setSyncOp(sop_add); aStatusCommand.setStatusCode(201); // item added (if no error occurs) do_add_merged: string guid; remainsvisible=true; // should remain visible matchingok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible,&guid); // add item in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_ADD_MERGED); aSyncItemP=NULL; // is already deleted! if (matchingok) { // do it only if server add successful, because otherwise we don't have a GUID // - make sure same item is ADDED as new item to client matchingItemP->setSyncOp(sop_add); // add it, prevent it from re-match (is sop_wants_add now) matchingItemP->setLocalID(guid.c_str()); // this is now a pair with the newly added item (not the original one) matchingItemP->setRemoteID(""); // we don't know the remote ID yet } // adding duplicate to server (add) is already done changedexisting=false; changedincoming=false; mapupdated=true; // no need to update map needserverupdate=false; // already done // client must received the (updated) server item as an add (set above) needclientupdate=true; } } } // if not ignoreUpdate // Update server map now if required // - NOTE THAT THIS IS VERY IMPORTANT TO DO BEFORE any possible // replaces, because replacing the matchingItem can only be // done via its remoteID, which is, at this moment, probably not // valid. After Mapping, it is ensured that the mapped remoteID // uniquely identifies the matchingItem. if (!mapupdated) { // - update map in server sta = engProcessMap( aSyncItemP->getRemoteID(), // remote ID (LUID) of item received from client matchingItemP->getLocalID() // local ID (GUID) of item already stored in server ); matchingok = sta==LOCERR_OK; if (!matchingok) { // failed ok=false; aStatusCommand.setStatusCode(sta); break; } } // Now prepare updates of (already mapped) server and client items if needed if (changedexisting) { // matched item in server's sync set was changed and must be update in server DB // update server only if updates during non-first-time slowsync are enabled if (fFirstTimeSync || fSessionP->fUpdateServerDuringSlowsync) { needserverupdate=true; // note: ineffective if fReadOnly PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Server data was updated by record sent by client, REPLACE it in server DB")); } else { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Server data was updated by record sent by client, but server updates during non-firsttime slowsyncs are disabled")); } } if (changedincoming) { // incoming item from remote was changed after receiving and must be reflected // back to client // NOTE: this can also happen with sop_reference_only items // - client will be updated because matchingItemP is still in list matchingItemP->setSyncOp(sop_replace); // cancel wants_add state, prevent re-match // - matchingItem was retrieved BEFORE map was done, and has no valid remote ID // so remote ID must be added now. matchingItemP->setRemoteID(aSyncItemP->getRemoteID()); // update client only if updates during non-first-time slowsync are enabled if (fFirstTimeSync || fSessionP->fUpdateClientDuringSlowsync) { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Record sent by client was updated with server data, client will receive a REPLACE")); needclientupdate=true; } else { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Record sent by client was updated, but client updates during non-firsttime slowsyncs are disabled")); } } // update // - check if client must be updated if (!needclientupdate) { // prevent updating client // - make sure matching item from server is NOT sent to client matchingItemP->setSyncOp(sop_none); // just in case... dontSendItemAsServer(matchingItemP); } else { // check if replaces may be sent to client during slowsync if (matchingItemP->getSyncOp()==sop_replace && fSessionP->fNoReplaceInSlowsync) { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Update of client item suppressed because of ")); matchingItemP->setSyncOp(sop_none); // just in case... dontSendItemAsServer(matchingItemP); } else { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Update of client item enabled (will be sent later)")); } } // - check if server must be updated (NEVER for fReadOnly) if (!fReadOnly && needserverupdate && aSyncItemP) { // update server // - update server side (NOTE: processItemAsServer takes ownership, pointer gets invalid!) fLocalItemsUpdated++; aSyncItemP->setSyncOp(sop_replace); do_replace_merged2: remainsvisible=true; // should remain visible matchingok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // replace item in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_REPLACE_MERGED2); PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Updated server item")); } else { // - delete incoming item unprocessed (if not already deleted) if (aSyncItemP) delete aSyncItemP; } // check if we need to actively delete item from the client as it falls out of the filter if (!remainsvisible && fSessionP->getSyncMLVersion()>=syncml_vers_1_2) { // -> cause item to be deleted on remote PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Slow sync matched item no longer visible in syncset -> returning delete to remote")); goto removefromremoteandsyncset; } ok=matchingok; break; } else { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("No matching item found - add it to local database")); // this item is not yet on the server, add it normally aStatusCommand.setStatusCode(201); // item added (if no error occurs) if (fReadOnly) { delete aSyncItemP; // we don't need it PDEBUGPRINTFX(DBG_DATA,("Read-Only: slow-sync add/replace command silently discarded")); ok=true; break; } if (fPreventAdd) goto preventadd; fLocalItemsAdded++; aSyncItemP->setSyncOp(sop_add); // set correct op do_add_slow: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // add to local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_ADD_SLOW); break; } } // slow sync break; // just in case.... preventadd: // add not allowed, delete remote item instead // - consume original delete aSyncItemP; preventadd2: aStatusCommand.setStatusCode(201); // pretend adding item was successful PDEBUGPRINTFX(DBG_DATA,("Prevented explicit add, returning delete to remote")); ok=true; goto removefromremote; // as we have PREVENTED adding the item, it is not in the map removefromremoteandsyncset: // remove item from local map first engProcessMap(remoteid.c_str(),NULL); removefromremote: // have item removed from remote delitemP = newItemForRemote(itemtypeid); delitemP->setRemoteID(remoteid.c_str()); delitemP->setSyncOp(sop_delete); SendItemAsServer(delitemP); // pass ownership break; default : SYSYNC_THROW(TSyncException("Unknown sync op in TLocalEngineDS::processRemoteItemAsServer")); } // switch if (ok) { DB_PROGRESS_EVENT(this,pev_itemprocessed,fLocalItemsAdded,fLocalItemsUpdated,fLocalItemsDeleted); } else { // if the DB has a error string to show, add it here aStatusCommand.addItemString(lastDBErrorText().c_str()); } // done return ok; } // TLocalEngineDS::engProcessRemoteItemAsServer /// @brief called at end of request processing, should be used to save suspend state /// @note superdatastore does it itself to have correct order of things happening void TLocalEngineDS::engRequestEnded(void) { #ifdef SUPERDATASTORES if (fAsSubDatastoreOf) return; #endif // If DS 1.2: Make sure everything is ready for a resume in case there's an abort (implicit Suspend) // before the next request. Note that the we cannot wait for session timeout, as the resume attempt // from the client probably arrives much earlier. // Note: It is ESSENTIAL not to save the state until sync set is ready, because saving state will // cause DB access, and DB access is not permitted while sync set is possibly still loading // (possibly in a separate thread!). So dssta_syncmodestable (as in <=3.0.0.2) is NOT enough here! if (testState(dssta_syncsetready)) { // make sure all unsent items are marked for resume engSaveSuspendState(false); // only if not already aborted } // let datastore prepare for end of request dsRequestEnded(); // and let it prepare for end of this thread as well dsThreadMayChangeNow(); } // TLocalEngineDS::engRequestEnded #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT // Client Case // =========== // process sync operation from server with specified sync item // (according to current sync mode of local datastore) // - returns true (and unmodified or non-200-successful status) if // operation could be processed regularily // - returns false (but probably still successful status) if // operation was processed with internal irregularities, such as // trying to delete non-existant item in datastore with // incomplete Rollbacks (which returns status 200 in this case!). bool TLocalEngineDS::engProcessRemoteItemAsClient( TSyncItem *aSyncItemP, TStatusCommand &aStatusCommand // status, must be set to correct status code (ok / error) ) { string remoteid,localid; bool ok; bool remainsvisible; // send event and check for user abort #ifdef PROGRESS_EVENTS if (!DB_PROGRESS_EVENT(this,pev_itemreceived,++fItemsReceived,fRemoteNumberOfChanges,0)) { fSessionP->AbortSession(500,true,LOCERR_USERABORT); // this also causes datastore to be aborted } if (!SESSION_PROGRESS_EVENT(fSessionP,pev_suspendcheck,NULL,0,0,0)) { fSessionP->SuspendSession(LOCERR_USERSUSPEND); } #endif // check if datastore is aborted if (CheckAborted(aStatusCommand)) return false; // init behaviour vars (these are normally used by server only, // but must be initialized correctly for client as well as descendants might test them fPreventAdd = false; fIgnoreUpdate = false; TSyncOperation syncop; LocalItemOp op; TLocalSyncItemAux *aux = static_cast(aSyncItemP->getAux(TSyncItem::LOCAL_ENGINE)); if (aux) { // Resuming the function call: restore variables, jump to store // method call. remainsvisible = aux->fRemainsVisible; syncop = aux->fSyncOp; remoteid = aux->fRemoteID; op = aux->fOp; fCurrentSyncOp = aux->fCurrentSyncOp; fEchoItemOp = aux->fEchoItemOp; fItemConflictStrategy = aux->fItemConflictStrategy; fForceConflict = aux->fForceConflict; fDeleteWins = aux->fDeleteWins; fRejectStatus = aux->fRejectStatus; PDEBUGPRINTFX(DBG_DATA,("%s item operation resumed",SyncOpNames[syncop])); switch (op) { case LOCAL_ITEM_DELETE: goto do_delete; case LOCAL_ITEM_ADD_NORMAL: goto do_add; case LOCAL_ITEM_REPLACE: goto do_replace; // Not used in client: case LOCAL_ITEM_ADD_DELETED: case LOCAL_ITEM_ADD_DUPLICATE: case LOCAL_ITEM_REPLACE_MERGED: case LOCAL_ITEM_REPLACE_FROM_CLIENT: case LOCAL_ITEM_ADD_MERGED: case LOCAL_ITEM_REPLACE_MERGED2: case LOCAL_ITEM_ADD_SLOW: break; }; } if (false) { // Prepare for resuming the function call. Will only be reached // via goto with "op" set to something identifying the source of // the jump. again: if (!aux) { aux = new TLocalSyncItemAux; aSyncItemP->setAux(TSyncItem::LOCAL_ENGINE, aux); } // cppcheck-suppress uninitvar aux->fRemainsVisible = remainsvisible; aux->fSyncOp = syncop; aux->fRemoteID = remoteid; // cppcheck-suppress uninitvar aux->fOp = op; aux->fCurrentSyncOp = fCurrentSyncOp; aux->fEchoItemOp = fEchoItemOp; aux->fItemConflictStrategy = fItemConflictStrategy; aux->fForceConflict = fForceConflict; aux->fDeleteWins = fDeleteWins; aux->fRejectStatus = fRejectStatus; aStatusCommand.setStatusCode(LOCERR_AGAIN); return false; } // get operation out of item syncop=aSyncItemP->getSyncOp(); // show DEBUGPRINTFX(DBG_DATA,("%s item operation received",SyncOpNames[syncop])); // check if receiving commands is allowed at all // - must be in correct sync state if (!testState(dssta_syncgendone)) { // Modifications from server not allowed before client has done sync gen // %%% we could possibly relax this one, depending on the DB aStatusCommand.setStatusCode(403); PDEBUGPRINTFX(DBG_ERROR,("Server command not allowed before client has sent entire ")); delete aSyncItemP; return false; } // - must not be one-way if (fSyncMode==smo_fromclient) { // Modifications from server not allowed during update from client only aStatusCommand.setStatusCode(403); ADDDEBUGITEM(aStatusCommand,"Server command not allowed in one-way/refresh from client"); PDEBUGPRINTFX(DBG_ERROR,("Server command not allowed in one-way/refresh from client")); delete aSyncItemP; return false; } else { // silently discard all modifications if readonly if (fReadOnly) { PDEBUGPRINTFX(DBG_ERROR,("Read-Only: silently discarding all modifications")); aStatusCommand.setStatusCode(200); // always ok (but never "added"), so server cannot expect Map delete aSyncItemP; return true; } // let item check itself to catch special cases // - init variables which are used/modified by item checking fItemSizeLimit=-1; // no limit fCurrentSyncOp = syncop; fEchoItemOp = sop_none; fItemConflictStrategy=fSessionConflictStrategy; // get default strategy for this item fForceConflict = false; fDeleteWins = fDSConfigP->fDeleteWins; // default to configured value fRejectStatus = -1; // no rejection // - now check // check reads and possibly modifies: // - fEchoItemOp : if not sop_none, the incoming item is echoed back to the remote with the specified syncop // - fItemConflictStrategy : might be changed from the pre-set datastore default // - fForceConflict : if set, a conflict is forced by adding the corresponding local item (if any) to the list of items to be sent // - fDeleteWins : if set, in a replace/delete conflict delete will win (regardless of strategy) // - fPreventAdd : if set, attempt to add item from remote (even implicitly trough replace) will cause no add but delete of remote item // - fIgnoreUpdate : if set, attempt to update item from remote will be ignored, only adds (also implicit ones) are executed // - fRejectStatus : if set>=0, incoming item is irgnored silently(==0) or with error(!=0) aSyncItemP->checkItem(this); // - check if incoming item should be processed at all if (fRejectStatus>=0) { // now discard the incoming item delete aSyncItemP; PDEBUGPRINTFX(fRejectStatus>=400 ? DBG_ERROR : DBG_DATA,("Item rejected with Status=%hd",fRejectStatus)); if (fRejectStatus>0) { // rejected with status code (not necessarily error) aStatusCommand.setStatusCode(fRejectStatus); if (fRejectStatus>=300) { // non 200-codes are errors ADDDEBUGITEM(aStatusCommand,"Item rejected"); return false; } } // silently rejected return true; } // now perform requested operation switch (syncop) { case sop_soft_delete: case sop_archive_delete: case sop_delete: // delete item fLocalItemsDeleted++; do_delete: remainsvisible=false; // deleted not visible any more ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible); // delete in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_DELETE); break; case sop_copy: // %%% note: this would belong into specific datastore implementation, but is here // now for simplicity as copy isn't used heavily het // retrieve data from local datastore if (!logicRetrieveItemByID(*aSyncItemP,aStatusCommand)) { ok=false; break; } // process like add case sop_add: // add as new item to client DB aStatusCommand.setStatusCode(201); // item added (if no error occurs) fLocalItemsAdded++; // add to local datastore // - get remoteid BEFORE processing item (as logicProcessRemoteItem consumes the item!!) remoteid=aSyncItemP->getRemoteID(); // get remote ID // check if this remoteid is already known from last session - if so, this means that // this add was re-sent and must NOT be executed if (isAddFromLastSession(remoteid.c_str())) { aStatusCommand.setStatusCode(418); // already exists PDEBUGPRINTFX(DBG_ERROR,("Warning: Item with same server-side ID (GUID) was already added in previous session - ignore add now")); delete aSyncItemP; // forget item ok=false; break; } #ifdef OBJECT_FILTERING if (!isAcceptable(aSyncItemP,aStatusCommand)) { delete aSyncItemP; // forget item ok=false; // cannot be accepted break; } #endif do_add: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible,&localid); // add to local database NOW, get back local GUID CHECK_FOR_AGAIN(LOCAL_ITEM_ADD_NORMAL); if (!ok) break; // if added (not replaced), we need to send map if (aStatusCommand.getStatusCode()==201) { // really added: remember map entry DEBUGPRINTFX(DBG_ADMIN+DBG_DETAILS,( "engProcessRemoteItemAsClient: add command: adding new entry to fPendingAddMaps - localid='%s', remoteID='%s'", localid.c_str(), remoteid.c_str() )); fPendingAddMaps[localid]=remoteid; } ok=true; // fine break; case sop_replace: // - replace item in client fLocalItemsUpdated++; aSyncItemP->setSyncOp(sop_replace); #ifdef OBJECT_FILTERING if (!isAcceptable(aSyncItemP,aStatusCommand)) { ok=false; // cannot be accepted break; } #endif // - get remoteid BEFORE processing item (as logicProcessRemoteItem consumes the item!!), // in case replace is converted to add and we need to register a map entry. remoteid=aSyncItemP->getRemoteID(); // get remote ID do_replace: remainsvisible=true; // should remain visible ok=logicProcessRemoteItem(aSyncItemP,aStatusCommand,remainsvisible,&localid); // replace in local database NOW CHECK_FOR_AGAIN(LOCAL_ITEM_REPLACE); // if added (not replaced), we need to send map if (aStatusCommand.getStatusCode()==201) { // Note: logicProcessRemoteItem should NOT do an add if we have no remoteid, but return 404. // The following check is just additional security. // really added: remember map entry if server sent remoteID (normally, it won't for Replace) if (!remoteid.empty()) { // we can handle that, as remote sent us the remoteID we need to map it correctly DEBUGPRINTFX(DBG_ADMIN+DBG_DETAILS,( "engProcessRemoteItemAsClient: replace command for unknown localID but with remoteID -> adding new entry to fPendingAddMaps - localid='%s', remoteID='%s'", localid.c_str(), remoteid.c_str() )); fPendingAddMaps[localid]=remoteid; } else { // we cannot handle this (we shouldn't have, in logicProcessRemoteItem!!) aStatusCommand.setStatusCode(510); ok=false; } } break; // fine, ok = irregularity status default: SYSYNC_THROW(TSyncException("Unknown sync op in TLocalEngineDS::processRemoteItemAsClient")); } // switch // processed if (ok) { DB_PROGRESS_EVENT(this,pev_itemprocessed,fLocalItemsAdded,fLocalItemsUpdated,fLocalItemsDeleted); } else { // if the DB has a error string to show, add it here aStatusCommand.addItemString(lastDBErrorText().c_str()); } return ok; } } // TLocalEngineDS::processRemoteItemAsClient // client case: called whenever outgoing Message of Sync Package starts void TLocalEngineDS::engClientStartOfSyncMessage(void) { // is called for all local datastores, even inactive ones, so check state first if (testState(dssta_dataaccessstarted) && !isAborted()) { // only alerted non-sub datastores will start a command here, ONCE // if there are pending maps, they will be sent FIRST if (fRemoteDatastoreP) { if (!testState(dssta_clientsyncgenstarted)) { // shift state to syncgen started // NOTE: if all sync commands can be sent at once, // state will change again by issuing , so // it MUST be changed here (not after issuing!) changeState(dssta_clientsyncgenstarted,true); // - make sure remotedatastore has correct full name fRemoteDatastoreP->setFullName(getRemoteDBPath()); // an interrupted command at this point is a map command - continueIssue() will take care if (!fSessionP->isInterrupedCmdPending() && numUnsentMaps()>0) { // Check for pending maps from previous session (even in DS 1.0..1.1 case this is possible) fUnconfirmedMaps.clear(); // no unconfirmed maps left... fLastSessionMaps.clear(); // ...and no lastSessionMaps yet: all are in pendingMaps // if this is a not-resumed slow sync, pending maps must not be sent, but discarded if (isSlowSync() && !isResuming()) { // forget the pending maps PDEBUGPRINTFX(DBG_HOT,("There are %ld cached map entries from last Session, but this is a non-resumed slow sync: discard them",(long)numUnsentMaps())); fPendingAddMaps.clear(); } else { // - now sending pending (cached) map commands from previous session // Note: if map command was already started, the // finished(), continueIssue() mechanism will make sure that // more commands are generated. This mechanism will also make // sure that outgoing package cannot get until // map is completely sent. // Note2: subdatastores do not generate their own map commands, // but are called by superdatastore for contributing to united map if (!isSubDatastore()) { PDEBUGBLOCKFMT(("LastSessionMaps","Now sending cached map entries from last Session","datastore=%s",getName())); TMapCommand *mapcmdP = new TMapCommand( fSessionP, this, // local datastore fRemoteDatastoreP // remote datastore ); // issue ISSUE_COMMAND_ROOT(fSessionP,mapcmdP); PDEBUGENDBLOCK("LastSessionMaps"); } } } // Now, send sync command (unless we are a subdatastore, in this case the superdatastore will take care) if (!isSubDatastore()) { // Note: if sync command was already started, the // finished(), continueIssue() mechanism will make sure that // more commands are generated // Note2: subdatastores do not generate their own sync commands, // but switch to dssta_client/serversyncgenstarted for contributing to united sync command TSyncCommand *synccmdP = new TSyncCommand( fSessionP, this, // local datastore fRemoteDatastoreP // remote datastore ); // issue ISSUE_COMMAND_ROOT(fSessionP,synccmdP); } } } else { PDEBUGPRINTFX(DBG_ERROR,("engClientStartOfSyncMessage can't start sync phase - missing remotedatastore")); changeState(dssta_idle,true); // force to idle, nothing happened yet } } // if dsssta_dataaccessstarted and not aborted } // TLocalEngineDS::engClientStartOfSyncMessage // Client only: returns number of unsent map items sInt32 TLocalEngineDS::numUnsentMaps(void) { return fPendingAddMaps.size(); } // TLocalEngineDS::numUnsentMaps // Client only: called whenever outgoing Message starts that may contain commands // @param[in] aNotYetInMapPackage set if we are still in sync-from-server package // @note usually, client starts sending maps while still receiving syncops from server void TLocalEngineDS::engClientStartOfMapMessage(bool aNotYetInMapPackage) { // is called for all local datastores, even inactive ones, so check state first if (testState(dssta_syncgendone) && !isAborted()) { // datastores that have finished generating their // now can start a command here, once (if not isInterrupedCmdPending(), that is, not a map already started) if (fRemoteDatastoreP) { // start a new map command if we don't have any yet and we are not done (dssta_clientmapssent) yet if (!fSessionP->isInterrupedCmdPending() && !testState(dssta_clientmapssent)) { // check if we should start one (that is, if the list is not empty) if (numUnsentMaps()>0) { // - now sending map command // NOTE: if all map commands can be sent at once, // fState will be modified again by issuing , so // it MUST be set here (not after issuing!) // - data access done only if we are in Map package now if (!aNotYetInMapPackage) changeState(dssta_dataaccessdone); // usually already set in engEndOfSyncFromRemote(), but does not harm here // Note: if map command was already started, the // finished(), continueIssue() mechanism will make sure that // more commands are generated. This mechanism will also make // sure that outgoing package cannot get until // map is completely sent. // Note2: subdatastores do not generate their own map commands, // but superdatastore calls their generateMapItem for contributing to united map if (!isSubDatastore()) { TMapCommand *mapcmdP = new TMapCommand( fSessionP, this, // local datastore fRemoteDatastoreP // remote datastore ); // issue ISSUE_COMMAND_ROOT(fSessionP,mapcmdP); } } else { // we need no map items now, but if this is still sync-from-server-package, // we are not done yet if (aNotYetInMapPackage) { DEBUGPRINTFX(DBG_PROTO,("No map command need to be generated now, but still in from server package")); } else { // we are done now DEBUGPRINTFX(DBG_PROTO,("All map commands sending complete")); changeState(dssta_clientmapssent); } } } } // if fRemoteDataStoreP } // if >=dssta_syncgendone } // TLocalEngineDS::engClientStartOfMapMessage // called to mark maps confirmed, that is, we have received ok status for them void TLocalEngineDS::engMarkMapConfirmed(cAppCharP aLocalID, cAppCharP aRemoteID) { // As this is client-only, we don't need to check for tempGUIDs here. // Note: superdatastore has an implementation which dispatches by prefix TStringToStringMap::iterator pos=fUnconfirmedMaps.find(aLocalID); if (pos!=fUnconfirmedMaps.end()) { DEBUGPRINTFX(DBG_ADMIN+DBG_EXOTIC,( "engMarkMapConfirmed: deleting confirmed entry localID='%s', remoteID='%s' from fUnconfirmedMaps", aLocalID, aRemoteID )); // move it to lastsessionmap fLastSessionMaps[(*pos).first]=(*pos).second; // remove it from unconfirmed map fUnconfirmedMaps.erase(pos); } } // TLocalEngineDS::engMarkMapConfirmed // Check if the remoteid was used by an add command not // fully mapped&confirmed in the previous session bool TLocalEngineDS::isAddFromLastSession(cAppCharP aRemoteID) { TStringToStringMap::iterator pos; TStringToStringMap *mapListP; for (int i=0; i<3; i++) { // determine next list to search mapListP = i==0 ? &fPendingAddMaps : (i==1 ? &fUnconfirmedMaps : &fLastSessionMaps); // search it for (pos=mapListP->begin(); pos!=mapListP->end(); ++pos) { if (strcmp((*pos).second.c_str(),aRemoteID)==0) return true; // remoteID known -> is add from last session } } // not found in any of the lists return false; } // TLocalEngineDS::isAddFromLastSession // - called to generate Map items // Returns true if now finished for this datastore // also sets fState to dss_done when finished bool TLocalEngineDS::engGenerateMapItems(TMapCommand *aMapCommandP, cAppCharP aLocalIDPrefix) { #ifdef USE_SML_EVALUATION sInt32 leavefree = fSessionP->getNotUsableBufferBytes(); #else sInt32 freeroom = fSessionP->getFreeCommandSize(); #endif TStringToStringMap::iterator pos=fPendingAddMaps.begin(); PDEBUGBLOCKFMT(("MapGenerate","Generating Map items...","datastore=%s",getName())); do { // check if already done if (pos==fPendingAddMaps.end()) break; // done // get ID string locID = (*pos).first; dsFinalizeLocalID(locID); // make sure we have the permanent version in case datastore implementation did deliver temp IDs // create prefixed version of ID string prefixedLocID; AssignString(prefixedLocID, aLocalIDPrefix); // init with prefix (if any) prefixedLocID += locID; // append local ID // add it to map command aMapCommandP->addMapItem(prefixedLocID.c_str(),(*pos).second.c_str()); // check if we could send this command #ifdef USE_SML_EVALUATION if ( (aMapCommandP->evalIssue( fSessionP->peekNextOutgoingCmdID(), fSessionP->getOutgoingMsgID() ) // what is left in buffer after sending Map so far >=leavefree) // all this must still be more than what we MUST leave free ) #else if (freeroom>aMapCommandP->messageSize()) #endif { // yes, it should work PDEBUGPRINTFX(DBG_PROTO,( "Mapitem generated: localID='%s', remoteID='%s'", prefixedLocID.c_str(), (*pos).second.c_str() )); // move sent ones to unconfirmed list (Note: use real locID, without prefix!) fUnconfirmedMaps[locID]=(*pos).second; // remove item from to-be-sent list TStringToStringMap::iterator temp_pos = pos++; // make copy and set iterator to next fPendingAddMaps.erase(temp_pos); // now entry can be deleted (N.M. Josuttis, pg204) } else { // no room for this item in this message, interrupt now // - delete already added item again aMapCommandP->deleteLastMapItem(); // - interrupt here PDEBUGPRINTFX(DBG_PROTO,("Interrupted generating Map items because max message size reached")) PDEBUGENDBLOCK("MapGenerate"); return false; } } while(true); // done // if we are dataaccessdone or more -> end of map phase for this datastore if (testState(dssta_dataaccessdone)) { changeState(dssta_clientmapssent,true); PDEBUGPRINTFX(DBG_PROTO,("Finished generating Map items, server has finished , we are done now")) } #ifdef SYDEBUG // else if we are not yet dssta_syncgendone -> this is the end of a early pending map send else if (!dbgTestState(dssta_syncgendone)) { PDEBUGPRINTFX(DBG_PROTO,("Finished sending cached Map items from last session")) } // otherwise, we are not really finished with the maps yet (but with the current map command) else { PDEBUGPRINTFX(DBG_PROTO,("Finished generating Map items for now, but server still sending ")) } #endif PDEBUGENDBLOCK("MapGenerate"); return true; } // TLocalEngineDS::engGenerateMapItems #endif // SYSYNC_SERVER // - called to mark an already generated (but probably not sent or not yet statused) item // as "to-be-resumed", by localID or remoteID (latter only in server case). // NOTE: This must be repeatable without side effects, as server must mark/save suspend state // after every request (and not just at end of session) void TLocalEngineDS::engMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) { #ifdef SUPERDATASTORES // if we are acting as a subdatastore, aLocalID might be prefixed if (fAsSubDatastoreOf && aLocalID) { // remove prefix aLocalID = fAsSubDatastoreOf->removeSubDSPrefix(aLocalID, this); } #endif #ifdef SYSYNC_SERVER // Now mark for resume if (IS_SERVER && aLocalID && *aLocalID) { // localID can be a translated localid at this point (for adds), so check for it string localid=aLocalID; obtainRealLocalID(localid); logicMarkItemForResume(localid.c_str(), aRemoteID, aUnSent); } else #endif { // localID not used or client (which never has tempGUIDs) logicMarkItemForResume(aLocalID, aRemoteID, aUnSent); } } // TLocalEngineDS::engMarkItemForResume // - called to mark an already generated (but probably not sent or not yet statused) item // as "to-be-resent", by localID or remoteID (latter only in server case). void TLocalEngineDS::engMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) { #ifdef SUPERDATASTORES // if we are acting as a subdatastore, aLocalID might be prefixed if (fAsSubDatastoreOf && aLocalID) { // remove prefix aLocalID = fAsSubDatastoreOf->removeSubDSPrefix(aLocalID, this); } #endif // a need to resend is always a problem with the remote (either explicit non-ok status // received or implicit like data size too big to be sent at all due to maxmsgsize or // maxobjsize restrictions. fRemoteItemsError++; // now mark for resend #ifdef SYSYNC_SERVER if (IS_SERVER && aLocalID && *aLocalID) { // localID can be a translated localid at this point (for adds), so check for it string localid=aLocalID; obtainRealLocalID(localid); logicMarkItemForResend(localid.c_str(), aRemoteID); } else #endif { // localID not used or client (which never has tempGUIDs) logicMarkItemForResend(aLocalID, aRemoteID); } } // TLocalEngineDS::engMarkItemForResend // @brief save everything needed to resume later, in case we get suspended /// - Might be called multiple times during a session, must make sure every time /// that the status is correct, that is, previous suspend state is erased localstatus TLocalEngineDS::engSaveSuspendState(bool aAnyway) { // only save here if not aborted already (aborting saves the state immediately) // or explicitly requested if (aAnyway || !isAborted()) { // only save if DS 1.2 and supported by DB if ((fSessionP->getSyncMLVersion()>=syncml_vers_1_2) && dsResumeSupportedInDB()) { PDEBUGBLOCKFMT(("SaveSuspendState","Saving state for suspend/resume","datastore=%s",getName())); // save alert state (if not explicitly prevented) fResumeAlertCode=fPreventResuming ? 0 : fAlertCode; if (fResumeAlertCode) { if (fPartialItemState!=pi_state_save_outgoing) { // ONLY if we have no request for saving an outgoing item state already, // we possibly need to save a pending incoming item // if there is an incompletely received item, let it update Partial Item (fPIxxx) state // (if it is an item of this datastore, that is). if (fSessionP->fIncompleteDataCommandP) fSessionP->fIncompleteDataCommandP->updatePartialItemState(this); } // this makes sure that only ungenerated (but to-be generated) items will be // marked for resume. Items that have been generated in this session (but might // have been marked for resume in a previous session must no longer be marked // after this call. // This also includes saving state for a partially sent item so we could resume it (fPIxxx) logicMarkOnlyUngeneratedForResume(); // then, we need to additionally mark those items for resume which have been // generated, but not yet sent or sent but not received status so far. fSessionP->markPendingForResume(this); } // let datastore make all this persistent // NOTE: this must happen even if we have no suspend state here, // as marked-for-resends need to be saved here as well. localstatus sta=logicSaveResumeMarks(); if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("Error saving suspend state with logicSaveResumeMarks(), status=%hd",sta)); } PDEBUGENDBLOCK("SaveSuspendState"); return sta; } // resume not supported due to datastore or SyncML version<1.2 -> ok anyway PDEBUGPRINTFX(DBG_PROTO,("SaveSuspendState not possible (SyncML<1.2 or not supported by DB)")); } return LOCERR_OK; } // TLocalEngineDS::engSaveSuspendState } // namespace sysync /* end of TLocalEngineDS implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/localengineds.h0000755000373300037200000017135312424517753025642 0ustar00nightlyallusers00000000000000/** * @File localengineds.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TLocalEngineDS * Abstraction of the local datastore - interface class to the * sync engine. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-15 : luz : created from localdatastore */ #ifndef LocalEngineDS_H #define LocalEngineDS_H // includes #include "configelement.h" #include "syncitem.h" #include "syncdatastore.h" #include "itemfield.h" // more includes after config classes definitions using namespace sysync; namespace sysync { extern const char * const conflictStrategyNames[]; #ifdef SCRIPT_SUPPORT // publish as derivates might need it extern const TFuncTable DBFuncTable; #endif class TLocalEngineDS; // forward // datatype list entry class TAdditionalDataType { public: TDataTypeConfig *datatypeconfig; bool forRead; bool forWrite; TTypeVariantDescriptor variantDescP; #ifndef NO_REMOTE_RULES string remoteRuleMatch; // remote rule match string #endif }; // datatypes list typedef std::list TAdditionalTypesList; #ifndef NO_REMOTE_RULES // rule match type list entry typedef struct { TSyncItemType *itemTypeP; cAppCharP ruleMatchString; } TRuleMatchTypeEntry; // container types typedef std::list TRuleMatchTypesContainer; // contains rule match item types #endif // type support configuration of that database class TTypeSupportConfig : public TConfigElement { typedef TConfigElement inherited; public: TTypeSupportConfig(const char* aName, TConfigElement *aParentElement); virtual ~TTypeSupportConfig(); // properties // - preferred data types TDataTypeConfig *fPreferredTx; TTypeVariantDescriptor fPrefTxVariantDescP; TDataTypeConfig *fPreferredRx; TTypeVariantDescriptor fPrefRxVariantDescP; // - preferred data type for blind and legacy mode sync attempts TDataTypeConfig *fPreferredLegacy; // - other data types TAdditionalTypesList fAdditionalTypes; #ifndef NO_REMOTE_RULES // - types that are selected when matching with a remote rule TAdditionalTypesList fRuleMatchTypes; #endif // public methods virtual void clear(); #ifdef HARDCODED_CONFIG // add type support bool addTypeSupport( cAppCharP aTypeName, bool aForRead, bool aForWrite, bool aPreferred, cAppCharP aVariant, cAppCharP aRuleMatch=NULL ); #endif protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); }; // TTypeSupportConfig #if defined(SCRIPT_SUPPORT) && defined(SYSYNC_CLIENT) // publish func table for chaining extern const TFuncTable ClientDBFuncTable; #endif typedef list TStringList; // local datastore config class TLocalDSConfig: public TConfigElement { typedef TConfigElement inherited; public: TLocalDSConfig(const char* aName, TConfigElement *aParentElement); virtual ~TLocalDSConfig(); // properties // - ID to identify datastore instance in callbacks and derived // classes implementing multiple interface variants (such as PalmDbDatastore) // and to relate client (profile) target settings with datastores uInt32 fLocalDBTypeID; // - supported datatypes TTypeSupportConfig fTypeSupport; // - conflict strategy TConflictResolution fConflictStrategy; TConflictResolution fSlowSyncStrategy; TConflictResolution fFirstTimeStrategy; // - options bool fReadOnly; // if set, datastore will not write any data (only maps) to local DB (but fake successful status to remote) bool fCanRestart; // if set, then the datastore is able to participate in multiple sync sessions; in other words after a successful read/write cycle it is possible to restart at the reading phase set fSyncModes; // all additional, non-standard sync modes #ifndef HARDCODED_CONFIG string fSyncModeBuffer; // only used during XML config parsing #endif bool fReportUpdates; // if set(normal case), updates of server items will be sent to client (can be set to false for example for emails) bool fResendFailing; // if set, items that receive a failure status from the remote will be resent in the next session (if DS 1.2 suspend marks supported by the DB) bool fDeleteWins; // if set, in a replace/delete conflict the delete wins (also see DELETEWINS()) #ifdef SYSYNC_SERVER bool fTryUpdateDeleted; // if set, in a client update with server delete conflict, server tries to update the already deleted item (in case it is just invisible) bool fAlwaysSendLocalID; // always send localID to clients (which gives them opportunity to remap IDs on Replace) TStringList fAliasNames; // list of aliases for this datastore #endif // SYSYNC_SERVER uInt32 fMaxItemsPerMessage; // if >0, limits the number of items sent per SyncML message (useful in case of slow datastores where collecting data might exceed client timeout) #ifdef OBJECT_FILTERING // filtering // - filter applied to items coming from remote party, non-matching // items will be rejected with 415 (unknown format) status // unless fSilentlyDiscardUnaccepted is set to true (then we accept and discard silently) // (outgoing items will be made pass this filter with makePassFilter) string fRemoteAcceptFilter; bool fSilentlyDiscardUnaccepted; // - filter will be applied to items read from the local database, // IN ADDITION to possibly specified target address filtering string fLocalDBFilterConf; // - filter applied to incoming items with makePassFilter // when there is no fSyncSetFilter or when applying fSyncSetFilter // with makePassFilter still does not make item pass. string fMakePassFilter; // - filter to check if item is to be treated as "invisible", // also applied to incoming items to make them invisible // (archive-delete) // %%%%% these notes are from earlier syncVisibility stuff that never // %%%%% worked: // - for delete items going to remote, fSyncVisibiliy=false means that Soft Delete should be // - for delete items coming from remote, fSyncVisibility=false means that Archive delete is requested string fInvisibleFilter; // - filter applied to incoming items if they do pass fInvisibleFilter (i.e. would be invisible) string fMakeVisibleFilter; // - DS 1.2 Filter support ( allowed in Alert, / shown in devInf) bool fDS12FilterSupport; // - Set if date range support is available in this datastore bool fDateRangeSupported; #endif #ifdef SCRIPT_SUPPORT // General DB scripts string fDBInitScript; string fSentItemStatusScript; string fReceivedItemStatusScript; string fAlertScript; string fDBFinishScript; #ifdef SYSYNC_CLIENT string fAlertPrepScript; // function table virtual const TFuncTable *getClientDBFuncTable(void) { return &ClientDBFuncTable; }; #endif // SYSYNC_CLIENT #endif // SCRIPT_SUPPORT #ifndef MINIMAL_CODE // display name string fDisplayName; #endif // public methods // - create appropriate datastore from config, calls addTypeSupport as well virtual TLocalEngineDS *newLocalDataStore(TSyncSession *aSessionP) = 0; // - add type support to datatstore from config virtual void addTypes(TLocalEngineDS *aDatastore, TSyncSession *aSessionP); // - add (probably datastore-specific) limits such as MaxSize and NoTruncate to types // (called by addTypes), usually derived as type limits come from DS implementation virtual void addTypeLimits(TLocalEngineDS *aLocalDatastoreP, TSyncSession *aSessionP); // - reset config to defaults virtual void clear(); // - check for alias names uInt16 isDatastoreAlias(cAppCharP aDatastoreURI); // - returns true for datastores that are abstract, i.e. don't have a backend implementation (like superdatastores, or non-derived localengineds) virtual bool isAbstractDatastore(void) { return true; }; // pure localengineds is abstract. First derivate towards backend (stdlogicds) will override this with "false". protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); }; // TLocalDSConfig // datastore config list typedef std::list TLocalDSList; // forward class TAlertCommand; class TRemoteDataStore; class TSyncOpCommand; /// @brief Local Engine Datastore States /// @Note these states are strictly in sequence as they happen during a sync session, so /// we can use < and > comparisons to check stage of sync process typedef enum { dssta_idle, ///< client&server, inactive, idle (after reset or creation) dssta_clientparamset, ///< client only, client has received params for syncing (dsSetClientSyncParams()) dssta_adminready, ///< client&server, administration data ready (all last & next timestamps/anchors/ids/maps available) dssta_clientsentalert, ///< client only, client has sent alert for sync to server dssta_serveralerted, ///< server only, server has received alert for sync from client dssta_serveransweredalert, ///< server only, server has sent status and response alert for client dssta_clientalertstatused, ///< client only, client has received status for sync alert dssta_clientalerted, ///< client only, client has received response alert from server dssta_syncmodestable, ///< client&server, sync mode is now stable (all alerts and alert statuses are exchanged and processed), server is ready for early maps dssta_dataaccessstarted, ///< client&server, user data access has started (e.g. loading of sync set in progress) dssta_syncsetready, ///< client&server, sync set is ready and can be accessed with logicXXXX sync op calls dssta_clientsyncgenstarted, ///< client only, generation of sync command(s) in client for server has started (possibly, we send some pending maps first) dssta_serverseenclientmods, ///< server only, server has seen all client modifications now dssta_serversyncgenstarted, ///< server only, generation of sync command(s) in server for client has started dssta_syncgendone, ///< client&server, generation of sync command(s) is complete dssta_dataaccessdone, ///< client&server, user data access has ended (no more user data reads or writes, but still maps) dssta_clientmapssent, ///< client only, all maps have been sent to server dssta_admindone, ///< client&server, administration data access done (all anchors, timestamps, maps and stuff saved) dssta_completed, ///< client&server, sync session complete (not necessarily successfully, check isAborted()!), including showing logs etc. numDSStates } TLocalEngineDSState; typedef enum { pi_state_none, ///< no partial item pi_state_loaded_incoming, ///< we have an incoming item loaded from admin data (but not changed) pi_state_loaded_outgoing, ///< we have an outgoing item loaded from admin data (but not changed) pi_state_save_incoming, ///< we must save the incoming item at next suspend pi_state_save_outgoing ///< we must save the outgoing item at next suspend } TPartialItemState; } // end namespace sysync // additional includes here as they need config classes already defined #include "synccommand.h" #include "syncsession.h" namespace sysync { #ifdef SCRIPT_SUPPORT class TScriptContext; class TLDSfuncs; #endif // for engXXXX methods that need only be virtual in case we have superdatastores #ifdef SUPERDATASTORES #define SUPERDS_VIRTUAL virtual class TSuperDataStore; // forward declaration #else #define SUPERDS_VIRTUAL #define TSuperDataStore TLocalEngineDS // to allow parameter for engProcessSyncAlert() #endif /// @brief Local datastore engine and abstraction of actual implementation /// - session and commands only call non-virtual engXXXX members of this class to /// perform any operations on the datastore /// - to perform actual access logic (which might be implemented in different flavors), /// this class calls virtual (usually abstract) logicXXXX members, which are /// implemented in derived classes. class TLocalEngineDS: public TSyncDataStore { typedef TSyncDataStore inherited; friend class TLDSfuncs; friend class TMFTypeFuncs; friend class TSyncSession; friend class TSyncCommand; friend class TSyncOpCommand; friend class TMultiFieldItemType; friend class TTextProfileHandler; friend class TSyncAgent; #ifdef SUPERDATASTORES friend class TSuperDataStore; #endif protected: /// @name dsSyncState member fields defining the sync state of the datastore // /// @{ TLocalEngineDSState fLocalDSState; ///< internal state of the datastore sync process localstatus fAbortStatusCode; ///< status code when engAbortDatastoreSync() was called bool fLocalAbortCause; ///< flag signalling if abort cause was local or remote bool fRemoteAddingStopped; ///< set when no more add commands should be sent to remote (e.g. device full) localstatus fAlertCode; ///< alert code in use by this datastore (for scripts and for suspend) /// @} /// @name dsSyncMode member fields defining the sync mode of the datastore /// @Note These get valid for the first time in dssta_clientinit (for client) or /// dssta_serveralerted (for server), but might change again due to /// detection of slowsync or resume until dssta_syncmodestable is reached // /// @{ TSyncModes fSyncMode; ///< basic Sync mode (twoway, fromclient, fromserver) bool fForceSlowSync; ///< set if external reason wants to force a slow sync even if it is not needed bool fSlowSync; ///< set if slow sync or refresh bool fRefreshOnly; ///< set if local data is refreshed from remote only, that is, no local changes will be sent to remote (can be set independently of apparent fSyncMode) bool fCacheData; ///< only relevant if fRefreshOnly is also set: instead of throwing away /// all data at the start of the sync, apply remote changes and remove /// all local data that the peer doesn't have bool fReadOnly; ///< if set, datastore will not write any user data (but fake successful status to remote) bool fReportUpdates; ///< if NOT set, datastore will not report updates to client (e.g. for email) bool fServerAlerted; ///< set if sync was server alerted bool fResuming; ///< set if this is a resume of a previous session #ifdef SUPERDATASTORES TSuperDataStore *fAsSubDatastoreOf; ///< if set, this points to the superdatastore, and MUST NOT receive any commands from the session directly #endif /// @} /// @name dsSavedAdmin administrative data (anchors, timestamps, maps) as saved or to-be-saved /// @Note These will be loaded and saved be derived classes /// @Note Some of these will be updated from resp. @ref dsCurrentAdmin members at distinct events (suspend, session end, etc.) /// @Note Some of these will be updated during the session, but in a way that does NOT affect the anchoring of current/last session // /// @{ // - anchors, valid at dssta_adminready string fLastRemoteAnchor; ///< last remote anchor (saved remote's next anchor in DB at end of last session) string fLastLocalAnchor; ///< last local anchor (saved local next anchor in DB at end of last session) @note this will be generated as // - suspend state uInt16 fResumeAlertCode; ///< alert code saved at suspend of previous session, 0 if none bool fPreventResuming; ///< can be set by running session to prevent that session can be resumed (e.g. in case of incomplete zapping at "reload device") // - other state info bool fFirstTimeSync; ///< set to true if this is the first sync // - item ID lists (maps) #ifdef SYSYNC_SERVER TStringToStringMap fTempGUIDMap; ///< container for temp GUID to real GUID mapping #endif #ifdef SYSYNC_CLIENT TStringToStringMap fPendingAddMaps; ///< container for map items to be sent to server: fPendingAddMaps[localid]=remoteid; Note: might contain temporary localIDs that must be converted to final ones before using in or saving with dsFinalizeLocalID() TStringToStringMap fUnconfirmedMaps; ///< container for map items already sent to server, but not yet confirmed: fUnconfirmedMaps[localid]=remoteid; TStringToStringMap fLastSessionMaps; ///< container for map items already confirmed, but still needed for duplicate checking:: fLastSessionMaps[localid]=remoteid; #endif // - information about last item sent or received in previously suspended session TSyError fLastItemStatus; ///< final status sent for last item in previously suspended session. string fLastSourceURI; ///< Source LocURI of last item sent in previously suspended session. string fLastTargetURI; ///< Target LocURI of partial item // - resuming chunked item data (send or receive) TPartialItemState fPartialItemState; ///< state of partial item vars uInt32 fPITotalSize; ///< total size of the partially transmitted item, 0 if none uInt32 fPIUnconfirmedSize; ///< size of already received, but probably repeated data - or size of data pending to be (re-)sent uInt32 fPIStoredSize; ///< total size of stored data (some of it might not be confirmed) appPointer fPIStoredDataP; ///< stored data, allocated with smlLibMalloc(). bool fPIStoredDataAllocated; ///< set if stored data was allocated by the session. Otherwise, it is owned by the currently incomplete command /// @} /// @name dsCurrentAdmin current session's admin data (anchors, timestamps, maps) /// @Note These will be copied to @ref dsSavedAdmin members ONLY when a session completes successfully/suspends. /// @Note Admin data is NEVER directly saved or loaded from these /// @Note Derivates will update some of these at dssta_adminready with current time/anchor values // /// @{ // - anchors, valid at dssta_adminready string fNextRemoteAnchor; ///< next remote anchor (sent at Alert by remote) string fNextLocalAnchor; ///< local anchor of this session /// @} /// @name dsFiltering item and syncset filtering /// @Note syncset restriction filtering expressions and limits /// must be evaluated by derived datastore implementations // /// @{ #ifdef OBJECT_FILTERING /// dynamic filter, if set and the datastore cannot handle it directly, all records need to be read /// this filter is good for filter expressions that might change between sync sessions string fSyncSetFilter; /// static filter, only applied to already read items, no need to filter all items string fLocalDBFilter; #ifdef SYNCML_TAF_SUPPORT /// real SyncML-like Target Address Filtering (TAF), set from commands string fTargetAddressFilter; /// internal SyncML-like Target Address Filtering (TAF), set internally by scripts string fIntTargetAddressFilter; #endif // SYNCML_TAF_SUPPORT #ifdef SYSYNC_TARGET_OPTIONS // Date range lineartime_t fDateRangeStart; ///< date range start, 0=none, must be evaluated by derived datastore implementations lineartime_t fDateRangeEnd; ///< date range end, 0=none, must be evaluated by derived datastore implementations /// size limit, -1=none, must be evaluated by derived datastore implementations fieldinteger_t fSizeLimit; /// max item count, 0=none (for example for emails) uInt32 fMaxItemCount; /// no attachments (for example emails) bool fNoAttachments; /// datastore options, can be evaluated in scripts, obtained from /o() CGI in database path string fDBOptions; // free database options #endif // SYSYNC_TARGET_OPTIONS // - filtering needs, initialized by initPostFetchFiltering() bool fTypeFilteringNeeded; bool fFilteringNeeded; bool fFilteringNeededForAll; #endif // OBJECT_FILTERING /// @} /// @name dsItemProcessing item processing parameters and options /// @note these can be influenced by various script functions during the session // /// @{ /// conflict strategy for this datastore in this session /// @note can be modified by datastoreinitscript TConflictResolution fSessionConflictStrategy; fieldinteger_t fItemSizeLimit; ///< size limit for item being processed or generated (initally=fSizeLimit) but can be changed by scripts TSyncOperation fEchoItemOp; ///< if not sop_none, processed item will be echoed back to remote TSyncOperation fCurrentSyncOp; ///< current sync-operation TConflictResolution fItemConflictStrategy; ///< conflict strategy for currently processed item bool fForceConflict; ///< if set, a conflict will be forced bool fDeleteWins; ///< if set, in a replace/delete conflict delete will win (regardless of strategy) bool fPreventAdd; ///< if set, attempt to add item from remote will cause no add but delete of remote item bool fIgnoreUpdate; ///< if set, attempt to update item from remote will be ignored (only adds, also implicit ones) are executed) sInt16 fRejectStatus; ///< if >=0, incoming item will be discarded with this status code (0=silently) #ifdef SCRIPT_SUPPORT /// @{ Type Script support (actual scripts are in the datatypes, but contexts are here as /// same datatype can be used in parallel in different datastores) TScriptContext *fSendingTypeScriptContextP; TScriptContext *fReceivingTypeScriptContextP; ///< @note can be NULL if sending and receiving uses the same context /// @} /// @{ generic datastore-level scripts TScriptContext *fDataStoreScriptContextP; // for executing status check scripts /// @} #endif /// @} /// @name dsCountStats item counting and statistics /// @{ // /// number of changes remote will send (valid if >=0), SyncML 1.1 sInt32 fRemoteNumberOfChanges; /// @{ net data transferred (item data, without any SyncML protocol overhead, meta etc.) sInt32 fIncomingDataBytes; sInt32 fOutgoingDataBytes; /// }@ /// @{ locally performed ops sInt32 fLocalItemsAdded; sInt32 fLocalItemsUpdated; sInt32 fLocalItemsDeleted; sInt32 fLocalItemsError; // items that caused an error to be sent to the remote (and SHOULD be sent again by the remote, or abort the session) /// }@ // @{ remotely performed ops sInt32 fRemoteItemsAdded; sInt32 fRemoteItemsUpdated; sInt32 fRemoteItemsDeleted; sInt32 fRemoteItemsError; // items that had a remote error (and will be resent later) /// }@ #ifdef SYSYNC_SERVER // @{ conflicts sInt32 fConflictsServerWins; sInt32 fConflictsClientWins; sInt32 fConflictsDuplicated; /// slow sync matches sInt32 fSlowSyncMatches; #endif /// @{ item transmission counts sInt32 fItemsSent; sInt32 fItemsReceived; /// }@ /// @} private: /// @name dsOther other members needed for handling the sync /// @{ /// datastore config pointer TLocalDSConfig *fDSConfigP; #ifdef SYSYNC_CLIENT // parameters for syncing with remote DB as client // - local string fLocalDBPath; ///< client, entire path to the local database, which might include subpaths/CGI to subselect records in the local DB // - remote string fDBUser; ///< client, DB layer user name string fDBPassword; ///< client, DB layer password string fRemoteRecordFilterQuery; ///< client, record level filter query bool fRemoteFilterInclusive; ///< client, inclusive filter flag #endif // SYSYNC_CLIENT string fRemoteDBPath; ///< server and client, path of remote DB, for documentary purposes string fIdentifyingDBName; ///< server and client, name with which the to-be-synced DB is identified (important in case of aliases in server) /// remote datastore involved, valid after processSyncCmdAsServer() TRemoteDataStore *fRemoteDatastoreP; /// Remote view if local URI /// - Server case: URI how remote has accessed local, for sending Sync commands back and to /// create devInf datastore name when devInf is queried AFTER being alerted from client /// - Client case: URI of local DB (only used to match commands coming back) string fRemoteViewOfLocalURI; /// time when datastore terminated sync, for statistics only lineartime_t fEndOfSyncTime; // default types of remote datastore for sending/receiving during Sync TSyncItemType *fRemoteReceiveFromLocalTypeP; ///< type used by remote to receive from local TSyncItemType *fRemoteSendToLocalTypeP; ///< type used by remote to send to local TSyncItemType *fLocalSendToRemoteTypeP; ///< type used by local to send to remote TSyncItemType *fLocalReceiveFromRemoteTypeP; ///< type used by local to receive from remote /// @} private: /// reset for re-use without re-creation, used by constructor as well void InternalResetDataStore(void); public: /// constructor TLocalEngineDS(TLocalDSConfig *aDSConfigP, TSyncSession *aSessionP, cAppCharP aName, uInt32 aCommonSyncCapMask=0); /// destructor virtual ~TLocalEngineDS(); /// @name dsProperty property and state querying methods /// @{ #ifndef MINIMAL_CODE // - return display name (descriptive) virtual const char *getDisplayName(void) { return fDSConfigP->fDisplayName.empty() ? getName() : fDSConfigP->fDisplayName.c_str(); }; #endif TLocalEngineDSState getDSState(void) { return fLocalDSState; } #ifdef SYDEBUG cAppCharP getDSStateName(void); static cAppCharP getDSStateName(TLocalEngineDSState aState); bool dbgTestState(TLocalEngineDSState aMinState, bool aNeedExactMatch=false) { return aNeedExactMatch ? fLocalDSState==aMinState : fLocalDSState>=aMinState; }; #endif // get name with which this datastore was identified by the remote cAppCharP getIdentifyingName(void) { return fIdentifyingDBName.c_str(); } /// calculate Sync mode and flags from given alert code /// @note does not affect DS state in any way, nor checks if DS can handle this code. /// (this will be done only when calling setSyncMode()) static localstatus getSyncModeFromAlertCode(TSyError aAlertCode, TSyncModes &aSyncMode, bool &aIsSlowSync, bool &aIsServerAlerted); /// determine if this is a first time sync situation bool isFirstTimeSync(void) { return fFirstTimeSync; }; /// check if sync is started (e.g. background loading of syncset) virtual bool isStarted(bool aWait) { return fLocalDSState>=dssta_dataaccessstarted; }; // single thread version is started when data access is started (and never waits) // called for >=SyncML 1.1 if remote wants number of changes. // Must return -1 if no NOC value can be returned virtual sInt32 getNumberOfChanges(void) { return -1; /* no NOC supported */ }; /// Called at end of sync to determine whether the store already knows /// that it has more changes for the server in the next sync session. /// For example, the TBinFileImplDS looks at its change log to determine that. virtual bool hasPendingChangesForNextSync() { return false; } /// test abort status, datastore is aborted also when session is just suspended bool isAborted(void); /// abort status code with local error code prefix if cause was local TSyError getAbortStatusCode(void) { return fLocalAbortCause ? localError(fAbortStatusCode) : syncmlError(fAbortStatusCode); }; /// test if active bool isActive(void) { return fLocalDSState!=dssta_idle && !isAborted(); }; // test active-in-sync status /// Returns true if this datastore is done with commands (but not necessarily done with maps) virtual bool isSyncDone(void); lineartime_t getEndOfSyncTime() { return fEndOfSyncTime; }; // documentary only! // - sync mode TSyncModes getSyncMode(void) { return fSyncMode; }; ///< get sync mode bool isSlowSync(void) { return fSlowSync; }; ///< true if slow sync bool isResuming(void) { return fResuming; }; ///< true if resuming a previous session bool isRefreshOnly(void) { return fRefreshOnly; }; ///< true if only refreshing with data from remote (no send to remote) bool isCacheData(void) { return fCacheData; }; bool isReadOnly(void) { return fReadOnly; }; ///< true if only reading from local datastore (and ignoring any updates from remote) /// get remote datastore related to this datastore TRemoteDataStore *getRemoteDatastore(void) { return fRemoteDatastoreP; }; /// return remote view of local URI (might be different from what we might think it is locally) cAppCharP getRemoteViewOfLocalURI(void) { return fRemoteViewOfLocalURI.c_str(); }; /// check if this datastore is accessible with given URI /// @note By default, local datastore type is addressed with /// first path element of URI, rest of path might be used /// by derivates to subselect data folders etc. /// @note returns number of characters matched to allow searching to /// detect "better" matches (Oracle server case with /Calendar AND /Calendar/Events) virtual uInt16 isDatastore(const char *aDatastoreURI); /// returns true if this datastore is currently in use as subdatastore of a superdatastore #ifdef SUPERDATASTORES bool isSubDatastore(void) { return fAsSubDatastoreOf!=NULL; }; #else bool isSubDatastore(void) { return false; }; #endif // - data type information TSyncItemType *getLocalSendType(void) { return fLocalSendToRemoteTypeP; }; ///< type used by local to send to remote TSyncItemType *getLocalReceiveType(void) { return fLocalReceiveFromRemoteTypeP; }; ///< type used by local to receive from remote TSyncItemType *getRemoteSendType(void) { return fRemoteSendToLocalTypeP; }; ///< type used by remote to send to local TSyncItemType *getRemoteReceiveType(void) { return fRemoteReceiveFromLocalTypeP; }; ///< type used by remote to receive from local /// get remote DB path cAppCharP getRemoteDBPath(void) { return fRemoteDBPath.c_str(); }; #ifdef SYSYNC_CLIENT /// get local DB path cAppCharP getLocalDBPath(void) { return fLocalDBPath.c_str(); }; #endif /// get datastore config pointer TLocalDSConfig *getDSConfig(void) { return fDSConfigP; }; /// datastore options fieldinteger_t getItemSizeLimit(void) { return fItemSizeLimit; }; bool getNoAttachments(void) { #ifdef SYSYNC_TARGET_OPTIONS return fNoAttachments; #else return false; #endif }; /// @} /// @name engXXXX methods defining the interface to other engine components (session, commands) /// Only these will be called by the engine - the engine will no longer call directly into logicXXXX /// @Note some of these are virtuals ONLY for being derived by superdatastore, NEVER by locic or other derivates /// We use the SUPERDS_VIRTUAL macro for these, which is empty in case we don't have superdatastores, then /// these can be non-virtual. /// @{ // /// reset datastore, but does not end sync nicely /// @note is virtual because derived from TSyncDataStore virtual void engResetDataStore(void); /// flag that sync with this datastore is aborted. Datastore is not yet terminated by this. /// @note calling engAbortDatastoreSync should not cause large activities - all terminating /// activity should be in engTerminateSync(), which will be called later virtual void engAbortDataStoreSync(TSyError aReason, bool aLocalProblem, bool aResumable=true); /// Finish all activity with this datastore /// @note functionality is that of former TLocalDataStore::endOfSync() /// @note if not yet aborted with other reason, datastore now gets aborted with given aErrorStatus /// @note the datastore should perform all activity needed to end the sync SUPERDS_VIRTUAL void engFinishDataStoreSync(localstatus aErrorStatus=LOCERR_OK); /// Terminate all activity with this datastore /// @note may be called repeatedly, relevant shutdown code is executed only once void engTerminateDatastore(localstatus aAbortStatusCode=408); // default to timeout /// called at end of incoming message for all localEngineDS (super or not) /// @note is not virtual, as superdatastore MUST NOT implement it void engEndOfMessage(void) { dsEndOfMessage(); }; // simply call protected virtual chain /// force slow sync void engForceSlowSync(void) { fForceSlowSync=true; }; /// set refresh only mode (do not send to remote) void engSetRefreshOnly(bool b) { fRefreshOnly=b; }; void engSetCacheData(bool b) { fCacheData=b; }; /// set read only mode (do not receive from remote) void engSetReadOnly(bool b) { fReadOnly=b; }; /// can be called to avoid further ADD commands to be sent to remote (device full case, e.g.) void engStopAddingToRemote(void) { fRemoteAddingStopped=true; }; /// can be called to prevent that current session can be resumed later (e.g. when user aborts zapping datastore in client) void preventResuming(void) { fPreventResuming=true; } #ifdef OBJECT_FILTERING /// returns true if DB implementation can filter the standard filters /// (LocalDBFilter, TargetFilter and InvisibleFilter) during database fetch - /// otherwise, fetched items will be filtered after being read from DB. /// Defined as abstract here to make sure derived datastores do implement filtering SUPERDS_VIRTUAL bool engFilteredFetchesFromDB(bool aFilterChanged=false) { return dsFilteredFetchesFromDB(aFilterChanged); }; #endif // called for >=SyncML 1.1 if remote wants number of changes. // Must return -1 if no NOC value can be returned SUPERDS_VIRTUAL sInt32 engGetNumberOfChanges(void) { return getNumberOfChanges(); }; /// Set remote datastore for local datastore /// (must be called before engProcessSyncCmd and engGenerateSyncCmd) SUPERDS_VIRTUAL void engSetRemoteDatastore(TRemoteDataStore *aRemoteDatastoreP); #ifdef SYSYNC_CLIENT /// initialize Sync alert for datastore according to Parameters set with dsSetClientSyncParams() /// @note initializes anchors and makes calls to isFirstTimeSync() valid SUPERDS_VIRTUAL localstatus engPrepareClientSyncAlert(void); /// internal helper to be called by engPrepareClientSyncAlert() from this class and from superdatastore localstatus engPrepareClientDSForAlert(void); /// generate Sync alert for datastore /// @note this could be repeatedly called due to auth failures at beginning of session /// @note this is a NOP for subDatastores (should not be called in this case, anyway) localstatus engGenerateClientSyncAlert(TAlertCommand *&aAlertCommandP); // Init engine for client sync (superdatastore aware) // - determine types to exchange // - make sync set ready SUPERDS_VIRTUAL localstatus engInitForClientSync(void); // - non-superdatastore aware base functionality localstatus engInitDSForClientSync(void); #endif /// Internal events during sync for derived classes /// @note local DB authorisation must be established already before calling these /// - cause loading of all session anchoring info and other admin data (logicMakeAdminReady()) /// fLastRemoteAnchor,fLastLocalAnchor,fNextLocalAnchor; isFirstTimeSync() will be valid after the call /// - in case of superdatastore, consolidates the anchor information from the subdatastores SUPERDS_VIRTUAL localstatus engInitSyncAnchors( cAppCharP aDatastoreURI, ///< local datastore URI cAppCharP aRemoteDBID ///< ID of remote datastore (to find session information in local DB) ); /// process Sync alert for a datastore SUPERDS_VIRTUAL TAlertCommand *engProcessSyncAlert( TSuperDataStore *aAsSubDatastoreOf, ///< if acting as subdatastore, this is the pointer to the superdatastore uInt16 aAlertCode, ///< the alert code const char *aLastRemoteAnchor, ///< last anchor of client const char *aNextRemoteAnchor, ///< next anchor of client const char *aTargetURI, ///< target URI as sent by remote, no processing at all const char *aIdentifyingTargetURI, ///< target URI that was used to identify datastore const char *aTargetURIOptions, ///< option string contained in target URI SmlFilterPtr_t aTargetFilter, ///< DS 1.2 filter, NULL if none const char *aSourceURI, ///< source URI TStatusCommand &aStatusCommand ///< status that might be modified ); /// process status received for sync alert SUPERDS_VIRTUAL bool engHandleAlertStatus(TSyError aStatusCode); /// parse target address options /// @note this will be called BEFORE engInitForSyncOps() localstatus engParseOptions( const char *aTargetURIOptions, ///< option string contained in target URI bool aFromSyncCommand=false ///< must be set when parsing options from target URI ); /// reset all filter settings void resetFiltering(void); /// process SyncML 1.2 style filter localstatus engProcessDS12Filter(SmlFilterPtr_t aTargetFilter); /// initialize reception of syncop commands for datastore /// @note previously, this was implemented as initLocalDatastoreSync in syncsession localstatus engInitForSyncOps( const char *aRemoteDatastoreURI ///< URI of remote datastore ); /// called from command to generate sync sub-commands to be sent to remote /// Returns true if now finished for this datastore /// also changes state to dssta_syncgendone when all sync commands have been generated SUPERDS_VIRTUAL bool engGenerateSyncCommands( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix=NULL ); #ifdef SYSYNC_CLIENT /// client only: called whenever outgoing Message of Sync Package starts /// @note should start a sync command for all alerted datastores SUPERDS_VIRTUAL void engClientStartOfSyncMessage(void); /// Client only: called whenever outgoing Message starts that may contain commands /// @param[in] aNotYetInMapPackage set if we are still in sync-from-server package /// @note usually, client starts sending maps while still receiving syncops from server void engClientStartOfMapMessage(bool aNotYetInMapPackage); /// Client only: returns number of unsent map items SUPERDS_VIRTUAL sInt32 numUnsentMaps(void); #endif // SYSYNC_CLIENT #ifdef SYSYNC_SERVER /// server only: called whenever we should start a sync command for all alerted datastores /// if not already started void engServerStartOfSyncMessage(void); /// called to process map commands from client to server /// @note aLocalID or aRemoteID can be NULL - which signifies deletion of a map entry SUPERDS_VIRTUAL localstatus engProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID); #endif // SYSYNC_SERVER /// check is datastore is completely started. /// @param[in] aWait if set, call will not return until either started state is reached /// or cannot be reached within the maximally allowed request processing time left. SUPERDS_VIRTUAL bool engIsStarted(bool aWait) { return isStarted(aWait); }; /// SYNC command bracket start (check credentials if needed) SUPERDS_VIRTUAL bool engProcessSyncCmd( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // status that might be modified bool &aQueueForLater // will be set if command must be queued for later (re-)execution ); /// SYNC command bracket end (but another might follow in next message) SUPERDS_VIRTUAL bool engProcessSyncCmdEnd(bool &aQueueForLater); /// called whenever Message of Sync Package ends or after last queued Sync command is executed void engEndOfSyncFromRemote(bool aEndOfAllSyncCommands); /// process SyncML SyncOp command for this datastore /// @return true if regular processing (status can still be non-200!) /// @note this routine does the common pre-processing like conversion to internal item format /// and type checking. The actual work is then done by @ref engProcessRemoteItemAsClient /// or @ref engProcessRemoteItemAsServer bool engProcessSyncOpItem( TSyncOperation aSyncOp, // the operation SmlItemPtr_t aItemP, // the item to be processed SmlMetInfMetInfPtr_t aMetaP, // command-wide meta, if any TStatusCommand &aStatusCommand // pre-set 200 status, can be modified in case of errors ); /// @{ /// process sync operation from remote with specified sync item /// (according to current sync mode of local datastore) /// @note /// - returns true (and unmodified or non-200-successful status) if /// operation could be processed regularily /// - returns false (but probably still successful status) if /// operation was processed with internal irregularities, such as /// trying to delete non-existant item in datastore with /// incomplete Rollbacks (which returns status 200 in this case!). #ifdef SYSYNC_CLIENT bool engProcessRemoteItemAsClient( TSyncItem *aSyncItemP, ///< the item to be processed TStatusCommand &aStatusCommand ///< status, must be set to correct status code (ok / error) ); #endif #ifdef SYSYNC_SERVER bool engProcessRemoteItemAsServer( TSyncItem *aSyncItemP, ///< the item to be processed TStatusCommand &aStatusCommand ///< status, must be set to correct status code (ok / error) ); #endif SUPERDS_VIRTUAL bool engProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand ); /// handle status of sync operation bool engHandleSyncOpStatus(TStatusCommand *aStatusCmdP,TSyncOpCommand *aSyncOpCmdP); /// called to mark maps confirmed, that is, we have received ok status for them #ifdef SYSYNC_CLIENT SUPERDS_VIRTUAL void engMarkMapConfirmed(cAppCharP aLocalID, cAppCharP aRemoteID); /// called to generate Map items /// @note Returns true if now finished for this datastore /// @note also sets fState to done when finished SUPERDS_VIRTUAL bool engGenerateMapItems(TMapCommand *aMapCommandP, cAppCharP aLocalIDPrefix); /// Client only: Check if the remoteid was used by an add command not /// fully mapped&confirmed in the previous session bool isAddFromLastSession(cAppCharP aRemoteID); #endif /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) void engMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent); // - called to mark an already generated (but probably not sent or not yet statused) item // as "to-be-resent", by localID or remoteID (latter only in server case). void engMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID); // - Set types to be used for sending and receiving items SUPERDS_VIRTUAL void setSendTypeInfo( TSyncItemType *aLocalSendToRemoteTypeP, TSyncItemType *aRemoteReceiveFromLocalTypeP ); SUPERDS_VIRTUAL void setReceiveTypeInfo( TSyncItemType *aLocalReceiveFromRemoteTypeP, TSyncItemType *aRemoteSendToLocalTypeP ); // - init usage of datatypes set with setSendTypeInfo/setReceiveTypeInfo SUPERDS_VIRTUAL localstatus initDataTypeUse(void); // "modern" filtering (in contrast to the "old" fSyncSetFilter et.al. stuff) // - init filtering and check if needed (sets fFilteringNeeded and fFilteringNeededForAll) void initPostFetchFiltering(void); // - check if item passes filter and probably apply some modifications to it bool postFetchFiltering(TSyncItem *aSyncItemP); // add filter keywords and property names to filterCap void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps); #ifdef OBJECT_FILTERING /* %%% outdated // - converts CGI-style filter string to internal filter string syntax // and expands special functions const char *filterCGIToString(cAppCharP aCGI, string &aFilter); */ /// @brief parse "syncml:filtertype-cgi" filter, convert into internal filter syntax /// and possibly sets some special filter options (fDateRangeStart, fDateRangeEnd) /// based on "filterkeywords" available for the type passed (DS 1.2). /// For parsing DS 1.1/1.0 TAF-style filters, aItemType can be NULL, no type-specific /// filterkeywords can be parsed then. /// @return pointer to next character after processing (usually points to terminator) /// @param[in] aCGI the NUL-terminated filter string /// @param[in] aItemTypeP if not NULL, this is the item type the filter applies to const char *parseFilterCGI(cAppCharP aCGI, TSyncItemType *aItemTypeP, string &aFilter); /// @brief check single filter term for DS 1.2 filterkeywords. /// @return true if term still needs to be added to normal filter expression, false if term will be handled otherwise virtual bool checkFilterkeywordTerm( cAppCharP aIdent, bool aAssignToMakeTrue, cAppCharP aOp, bool aCaseInsensitive, cAppCharP aVal, bool aSpecialValue, TSyncItemType *aItemTypeP ); // - called to check if incoming item passes acception filters bool isAcceptable(TSyncItem *aSyncItemP, TStatusCommand &aStatusCommand); // - called to make incoming item pass sync set filtering bool makePassSyncSetFilter(TSyncItem *aSyncItemP); /// @brief called to make incoming item visible /// @return true if now visible bool makeVisible(TSyncItem *aSyncItemP); /// @brief called to make incoming item INvisible /// @return true if now INvisible bool makeInvisible(TSyncItem *aSyncItemP); #endif // log datastore sync result // - Called at end of sync with this datastore virtual void dsLogSyncResult(void); // add support for more data types // (for programatically creating local datastores from specialized TSyncSession derivates) void addTypeSupport(TSyncItemType *aItemTypeP,bool aForRx=true, bool aForTx=true); #ifndef NO_REMOTE_RULES // add data type that overrides normal type selection if string matches active remote rule void addRuleMatchTypeSupport(TSyncItemType *aItemTypeP,cAppCharP aRuleMatchString); #endif // get usage variant for a specified type usage virtual TTypeVariantDescriptor getVariantDescForType(TSyncItemType *aItemTypeP); #ifdef SYSYNC_SERVER /// called at end of request processing in server (derived only by superdatastore) SUPERDS_VIRTUAL void engRequestEnded(void); /// end map operation (derived class might want to rollback) bool MapFinishAsServer( bool aDoCommit, // if not set, entire map operation must be undone TStatusCommand &aStatusCommand // status, must be set on error or non-200-status ) { return true; } #endif /// @} #ifdef DBAPI_TUNNEL_SUPPORT /// @name TunnelXXX methods allowing abstracted access to datastores from UIApi from within a tunnel session /// @{ // virtual TSyError TunnelStartDataRead(cAppCharP aLastToken, cAppCharP aResumeToken) { return LOCERR_NOTIMP; }; virtual TSyError TunnelReadNextItem(ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst) { return LOCERR_NOTIMP; }; virtual TSyError TunnelReadItem(cItemID aID, appCharP *aItemData) { return LOCERR_NOTIMP; }; virtual TSyError TunnelEndDataRead() { return LOCERR_NOTIMP; }; virtual TSyError TunnelStartDataWrite() { return LOCERR_NOTIMP; }; virtual TSyError TunnelInsertItem(cAppCharP aItemData, ItemID aID) { return LOCERR_NOTIMP; }; virtual TSyError TunnelUpdateItem(cAppCharP aItemData, cItemID aID, ItemID aUpdID) { return LOCERR_NOTIMP; }; virtual TSyError TunnelMoveItem(cItemID aID, cAppCharP aNewParID) { return LOCERR_NOTIMP; }; virtual TSyError TunnelDeleteItem(cItemID aID) { return LOCERR_NOTIMP; }; virtual TSyError TunnelEndDataWrite(bool aSuccess, appCharP *aNewToken) { return LOCERR_NOTIMP; }; virtual void TunnelDisposeObj(void* aMemory) { return; }; virtual TSyError TunnelReadNextItemAsKey(ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst) { return LOCERR_NOTIMP; }; virtual TSyError TunnelReadItemAsKey(cItemID aID, KeyH aItemKey) { return LOCERR_NOTIMP; }; virtual TSyError TunnelInsertItemAsKey(KeyH aItemKey, ItemID aID) { return LOCERR_NOTIMP; }; virtual TSyError TunnelUpdateItemAsKey(KeyH aItemKey, cItemID aID, ItemID aUpdID) { return LOCERR_NOTIMP; }; virtual TSettingsKeyImpl *newTunnelKey(TEngineInterface *) { return NULL; }; /// @} #endif /// @name dsXXXX (usually abstract) virtuals defining the interface to derived datastore classes (logic, implementation, api) /// These are usually designed such that they should always call inherited::dsXXX to let the entire chain /// of ancestors see the calls /// @{ // public: /// alert possible thread change virtual void dsThreadMayChangeNow(void) {}; // nop at this level #ifdef SYSYNC_CLIENT /// set Sync Parameters. Derivates might override this to pre-process and modify parameters /// (such as adding client settings as CGI to remoteDBPath) virtual bool dsSetClientSyncParams( TSyncModes aSyncMode, bool aSlowSync, const char *aRemoteDBPath, const char *aDBUser = NULL, const char *aDBPassword = NULL, const char *aLocalPathExtension = NULL, const char *aRecordFilterQuery = NULL, bool aFilterInclusive = false ); #endif // SYSYNC_CLIENT protected: /// reset datastore to a re-usable, like new-created state. virtual void dsResetDataStore(void) {}; /// make sure datastore does not need agent any more. /// @note Called while agent is still fully ok, so we must clean up such /// that later call of destructor does NOT access agent any more virtual void announceAgentDestruction(void) { engTerminateDatastore(); }; /// abort datastore (no reset yet, everything is just frozen as it is) virtual void dsAbortDatastoreSync(TSyError aStatusCode, bool aLocalProblem) {}; // nop here /// inform everyone of coming state change virtual localstatus dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); /// inform everyone of happened state change virtual localstatus dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); #ifdef SYSYNC_CLIENT /// finalize local ID (for datastores that can't efficiently produce these at insert) virtual bool dsFinalizeLocalID(string &aLocalID) { return false; /* no change, ID is ok */}; #endif #ifdef OBJECT_FILTERING /// tests if DB implementation can filter the standard filters /// (LocalDBFilter, TargetFilter and InvisibleFilter) during database fetch - /// otherwise, fetched items will be filtered after being read from DB. /// Defined as abstract here to make sure derived datastores do implement filtering /// @param[in] aFilterChanged if true, this signals to the datastore that filter expression might have changed in between virtual bool dsFilteredFetchesFromDB(bool aFilterChanged=false) { return false; }; // datastores can't do this by default /// returns true if DB implementation can also apply special filters like CGI-options /// /dr(x,y) etc. during fetching virtual bool dsOptionFilterFetchesFromDB(void) { return false; }; // datastores can't do this by default #endif /// returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps, tempGUIDs) virtual bool dsResumeSupportedInDB(void) { return false; }; /// returns true if DB implementation supports resuming in midst of a chunked item (can save fPIxxx.. and related admin data) virtual bool dsResumeChunkedSupportedInDB(void) { return false; }; /// called when a item in the sync set changes its localID (due to local DB internals) /// Datastore must make sure that possibly cached items get updated virtual void dsLocalIdHasChanged(const char *aOldID, const char *aNewID); /// called when request processing ends virtual void dsEndOfMessage(void) {}; // nop at this level /// called at end of request processing in server /// @note handling of suspend state saving and calling dsThreadMayChangeNow MUST NOT /// be implemented here - engEndOfMessage() takes care of this virtual void dsRequestEnded(void) {}; // nop at this level /// called to confirm a sync operation's completion (ok status from remote received) /// @note aSyncOp passed not necessarily reflects what was sent to remote, but what actually happened virtual void dsConfirmItemOp(TSyncOperation aSyncOp, cAppCharP aLocalID, cAppCharP aRemoteID, bool aSuccess, localstatus aErrorStatus=0); /// @} protected: /// @name logicXXXX (usually abstract) virtuals defining the interface to the datastore logic implementation layer /// These will never be called directly by the engine, but only from engXXX members of this class /// @{ // /// - might be called several times (auth retries at beginning of session) virtual localstatus logicMakeAdminReady(cAppCharP aDataStoreURI, cAppCharP aRemoteDBID) { return LOCERR_NOTIMP; }; /// returns true if logic layer has running threads in the background virtual bool logicHasBackgroundThreads(void) { return false; }; // single thread never has background /// returns true if DB implementation cannot guarantee complete /// rollback of all writes (e.g. if DB must commit at end of message) /// @todo rollbacks are obsolete, kick this one out virtual bool incompleteRollbacksPossible(void) { return false; } /// get conflict resolution strategy. virtual TConflictResolution getConflictStrategy(bool aForSlowSync, bool aForFirstTime=false); #ifdef SYSYNC_SERVER /// check if conflicting item already exist in list of items-to-be-sent-to-client virtual TSyncItem *getConflictingItemByRemoteID(TSyncItem *syncitemP) = 0; virtual TSyncItem *getConflictingItemByLocalID(TSyncItem *syncitemP) = 0; /// called to check if content-matching item from server exists virtual TSyncItem *getMatchingItem(TSyncItem *syncitemP, TEqualityMode aEqMode) = 0; /// called to prevent item to be sent to client in subsequent engGenerateSyncCommands() // item in question should be an item that was returned by getConflictingItemByRemoteID() or getMatchingItem() virtual void dontSendItemAsServer(TSyncItem *syncitemP) = 0; /// called to have additional item sent to remote (DB takes ownership of item) virtual void SendItemAsServer(TSyncItem *aSyncitemP) = 0; /// called for servers when receiving map from client virtual localstatus logicProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) = 0; #endif /// called to process incoming item operation. /// Method must take ownership of syncitemP in all cases virtual bool logicProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand, bool &aVisibleInSyncset, // on entry: tells if resulting item SHOULD be visible; on exit: set if processed item remains visible in the sync set. string *aGUID=NULL // GUID is stored here if not NULL ) = 0; /// called to read a specified item from the server DB (not restricted to set of conflicting items) virtual bool logicRetrieveItemByID( TSyncItem &aSyncItem, ///< item to be filled with data from server. Local or Remote ID must already be set TStatusCommand &aStatusCommand ///< status, must be set on error or non-200-status ) = 0; #ifdef SYSYNC_CLIENT /// client: called to generate sync sub-commands to be sent to server /// Returns true if now finished for this datastore /// also sets fState to dss_syncdone(server)/dss_syncready(client) when finished virtual bool logicGenerateSyncCommandsAsClient( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix=NULL ) = 0; #endif #ifdef SYSYNC_SERVER /// server: called to generate sync sub-commands to be sent to client /// Returns true if now finished for this datastore /// also sets fState to dss_syncdone(server)/dss_syncready(client) when finished virtual bool logicGenerateSyncCommandsAsServer( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix=NULL ) = 0; #endif /// called to have all non-yet-generated sync commands as "to-be-resumed" virtual void logicMarkOnlyUngeneratedForResume(void) = 0; /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void logicMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) = 0; /// called to mark an already sent item as "to-be-resent", e.g. due to temporary /// error status conditions, by localID or remoteID (latter only in server case). virtual void logicMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) = 0; /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume() and markItemForResume()) /// (or, in case the session is really complete, make sure that no resume state is left) /// @note Must also save tempGUIDs (for server) and pending/unconfirmed maps (for client) virtual localstatus logicSaveResumeMarks(void) { return LOCERR_NOTIMP; }; // must be derived (or avoided, as in superdatastore) /// do log substitutions virtual void DoLogSubstitutions(string &aLog,bool aPlaintext); /// @} /// @name dsHelpers private/protected helper routines /// These will never be called directly by the engine, but only from engXXX members of this class /// @{ // #ifdef SUPERDATASTORES protected: #else private: #endif /// change datastore state, calls logic layer before and after change localstatus changeState(TLocalEngineDSState aNewState, bool aForceOnError=false); /// test datastore state for minimal or exact state bool testState(TLocalEngineDSState aMinState, bool aNeedExactMatch=false); private: /// get Alert code for current Sync State uInt16 getSyncStateAlertCode(bool aServerAlerted=false, bool aClientMinimal=false); /// initializes Sync state variables localstatus setSyncMode(bool aAsClient, TSyncModes aSyncMode, bool aIsSlowSync, bool aIsServerAlerted); /// initializes Sync state variables and returns error if alert is not supported localstatus setSyncModeFromAlertCode(uInt16 aAlertCode, bool aAsClient); /// check if aborted and if yes, set status with appropriate error code bool CheckAborted(TStatusCommand &aStatusCommand); /// called to show sync statistics in debug log and on console SUPERDS_VIRTUAL void showStatistics(void); /// Parse CGI option #ifdef SYSYNC_TARGET_OPTIONS cAppCharP parseOption( const char *aOptName, const char *aArguments, bool aFromSyncCommand ); #endif #ifndef NO_REMOTE_RULES /// rule match types container TRuleMatchTypesContainer fRuleMatchItemTypes; // contains rule match item types #endif protected: #ifdef SYSYNC_SERVER /// for sending GUIDs (Add command), generate temp GUID which conforms to maxguidsize of remote datastore if needed void adjustLocalIDforSize(string &aLocalID, sInt32 maxguidsize, sInt32 prefixsize); /// for received GUIDs (Map command), obtain real GUID (might be temp GUID due to maxguidsize restrictions) void obtainRealLocalID(string &aLocalID); /// helper to cause database version of an item (as identified by aSyncItemP's ID) to be sent to client /// (aka "force a conflict") TSyncItem *SendDBVersionOfItemAsServer(TSyncItem *aSyncItemP); #endif // SYSYNC_SERVER /// helper to save resume state either at end of request or explicitly at reception of a "suspend" SUPERDS_VIRTUAL localstatus engSaveSuspendState(bool aAnyway); /// Returns true if type information is sufficient to create items to be sent to remote party bool canCreateItemForRemote(void) { return (fLocalSendToRemoteTypeP && fRemoteReceiveFromLocalTypeP); }; /// create SyncItem suitable for being sent from local to remote TSyncItem *newItemForRemote( uInt16 aExpectedTypeID ///< typeid of expected type ); /// helper for derived classes to generate sync op commands TSyncOpCommand *newSyncOpCommand( TSyncItem *aSyncItemP, // the sync item TSyncItemType *aSyncItemTypeP, // the sync item type cAppCharP aLocalIDPrefix // prefix for localID (can be NULL for none) ); /// return pure relative (item) URI (removes absolute part or ./ prefix) /// @note this one is virtual because it is defined in TSyncDataStore virtual cAppCharP DatastoreRelativeURI(cAppCharP aURI); /// obtain new datastore info, returns NULL if none available /// @note this one is virtual because it is defined in TSyncDataStore virtual SmlDevInfDatastorePtr_t newDevInfDatastore(bool aAsServer, bool aWithoutCTCapProps); /// obtain sync capabilities list for datastore /// @note this one is virtual because it is defined in TSyncDataStore virtual SmlDevInfSyncCapPtr_t newDevInfSyncCap(uInt32 aSyncCapMask); /// analyze database name void analyzeName( const char *aDatastoreURI, string *aBaseNameP, string *aTableNameP=NULL, string *aCGIP=NULL ); /// get DB specific error code for last routine call that returned !=LOCERR_OK /// @return platform specific DB error code virtual uInt32 lastDBError(void) { return 0; }; virtual bool isDBError(uInt32 aErrCode) { return aErrCode!=0; } // standard implementation assumes 0=ok /// get error message text showing lastDBError for dbg log, or empty string if none /// @return platform specific DB error text virtual string lastDBErrorText(void); /// @} }; // TLocalEngineDS } // namespace sysync #endif // LocalEngineDS_H // eof syncevolution-1.5/src/synthesis/src/sysync/mimediritemtype.cpp0000755000373300037200000002774412424517753026601 0ustar00nightlyallusers00000000000000/* * File: mimediritemtype.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TMimeDirItemType * base class for MIME DIR based content types (vCard, vCalendar...) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-12 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "mimediritemtype.h" #include "vtimezone.h" using namespace sysync; namespace sysync { // Config // ====== // MIMEDir-based datatype config TMIMEDirTypeConfig::TMIMEDirTypeConfig(const char* aName, TConfigElement *aParentElement) : TMultiFieldTypeConfig(aName,aParentElement) { clear(); } // TMIMEDirTypeConfig::TMIMEDirTypeConfig TMIMEDirTypeConfig::~TMIMEDirTypeConfig() { clear(); } // TMIMEDirTypeConfig::~TMIMEDirTypeConfig // init defaults void TMIMEDirTypeConfig::clear(void) { // clear inherited inherited::clear(); } // TMIMEDirTypeConfig::clear // init defaults void TMIMEDirTypeConfig::localResolve(bool aLastPass) { if (aLastPass) { // make a casted copy of the profile pointer GET_CASTED_PTR(fMIMEProfileP,TMIMEProfileConfig,fProfileConfigP,DEBUGTEXT("TMIMEDirTypeConfig with non-TMIMEProfileConfig profile","mdit2")); #ifdef CONFIGURABLE_TYPE_SUPPORT if (!fMIMEProfileP) SYSYNC_THROW(TConfigParseException("no 'mimeprofile' found")); #endif } // resolve inherited inherited::localResolve(aLastPass); } // TMIMEDirTypeConfig::localResolve // create Sync Item Type of appropriate type from config TSyncItemType *TMIMEDirTypeConfig::newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP) { if (!fMIMEProfileP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TMIMEDirTypeConfig: no or wrong-typed profile","mdit1"))); return new TMimeDirItemType( aSessionP, this, fTypeName.c_str(), fTypeVersion.c_str(), aDatastoreP, fMIMEProfileP->fFieldListP ); } // TMIMEDirTypeConfig::newSyncItemType // get a descriptor for selecting a variant of a datatype (if any), NULL=no variant with this name TTypeVariantDescriptor TMIMEDirTypeConfig::getVariantDescriptor(const char *aVariantName) { // variants in MIME-Dir are currently level 1 subprofiles // - we need it here already (we calculate it once again in Resolve) GET_CASTED_PTR(fMIMEProfileP,TMIMEProfileConfig,fProfileConfigP,DEBUGTEXT("TMIMEDirTypeConfig with non-TMIMEProfileConfig profile","mdit2")); const TProfileDefinition *subprofileP = fMIMEProfileP->fRootProfileP->subLevels; while (subprofileP) { if (strucmp(aVariantName,TCFG_CSTR(subprofileP->levelName))==0) { return (TTypeVariantDescriptor) subprofileP; // pointer to subProfile is our descriptor } // next subprofileP=subprofileP->next; } // not found return NULL; } // TMIMEDirTypeConfig::getVariantDescriptor #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TMIMEDirTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements /* use profilemode instead if (strucmp(aElementName,"mimedirmode")==0) expectEnum(sizeof(fMimeDirMode),&fMimeDirMode,mimeModeNames,numMimeModes); else */ // - none known here return TMultiFieldTypeConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TMIMEDirTypeConfig::localStartElement #endif #pragma exceptions reset #undef EXCEPTIONS_HERE #define EXCEPTIONS_HERE TARGET_HAS_EXCEPTIONS /* * Implementation of TMimeDirItemType */ TMimeDirItemType::TMimeDirItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ) : TMultiFieldItemType(aSessionP,aTypeConfigP,aCTType,aVerCT,aRelatedDatastoreP,aFieldDefinitions) { // create the profile handler fProfileHandlerP = static_cast(static_cast(aTypeConfigP)->fProfileConfigP->newProfileHandler(this)); // set profile mode fProfileHandlerP->setProfileMode(static_cast(aTypeConfigP)->fProfileMode); fReceivedFieldDefs=false; } // TMimeDirItemType::TMimeDirItemType TMimeDirItemType::~TMimeDirItemType() { // release the profile handler delete fProfileHandlerP; } // TMimeDirItemType::~TMimeDirItemType #ifdef OBJECT_FILTERING // get field index of given filter expression identifier. sInt16 TMimeDirItemType::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // check if explicit field level identifier if (strucmp(aIdentifier,"F.",2)==0) { // explicit field identifier, skip property lookup aIdentifier+=2; } else if (fProfileHandlerP) { // let profile search for fields by profile-defined alternative names sInt16 fid = fProfileHandlerP->getFilterIdentifierFieldIndex(aIdentifier, aIndex); if (fid!=FID_NOT_SUPPORTED) return fid; } // if no field ID found so far, look up in field list return TMultiFieldItemType::getFilterIdentifierFieldIndex(aIdentifier, aIndex); } // TMimeDirItemType::getFilterIdentifierFieldIndex #endif // create new sync item of proper type and optimization for specified target TSyncItem *TMimeDirItemType::internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP) { // All MimeDirs are stored in MultiFieldItems TMultiFieldItemType *targetitemtypeP; GET_CASTED_PTR(targetitemtypeP,TMultiFieldItemType,aTargetItemTypeP,DEBUGTEXT("TMimeDirItemType::internalNewSyncItem with bad-typed target","mdit6")); MP_RETURN_NEW(TMultiFieldItem,DBG_OBJINST,"TMultiFieldItem",TMultiFieldItem(this,targetitemtypeP)); } // TMimeDirItemType::internalNewSyncItem // fill in SyncML data (but leaves IDs empty) bool TMimeDirItemType::internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ) { // check type TMultiFieldItem *itemP; GET_CASTED_PTR(itemP,TMultiFieldItem,aSyncItemP,DEBUGTEXT("TMimeDirItemType::internalFillInData: incompatible item class","mdit7")); // process data if any if (aItemP->data) { // set related datastore so handler can access datastore/session specific datastore state fProfileHandlerP->setRelatedDatastore(aLocalDatastoreP); // parse data stringSize sz; cAppCharP t = smlPCDataToCharP(aItemP->data,&sz); if (!fProfileHandlerP->parseText(t,sz,*itemP)) { // format error aStatusCmd.setStatusCode(415); // Unsupported media type or format ADDDEBUGITEM(aStatusCmd,"Error parsing MIME-DIR content"); return false; } } else { // no data aStatusCmd.setStatusCode(412); // incomplete command ADDDEBUGITEM(aStatusCmd,"No data found in item"); return false; } // let ancestor process data as well return TMultiFieldItemType::internalFillInData(aSyncItemP,aItemP,aLocalDatastoreP,aStatusCmd); } // TMimeDirItemType::internalFillInData // sets data and meta from SyncItem data, but leaves source & target untouched bool TMimeDirItemType::internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ) { // check type TMultiFieldItem *itemP; GET_CASTED_PTR(itemP,TMultiFieldItem,aSyncItemP,DEBUGTEXT("TMimeDirItemType::internalSetItemData: incompatible item class","mdit8")); // let ancestor prepare first if (!TMultiFieldItemType::internalSetItemData(aSyncItemP,aItem,aLocalDatastoreP)) return false; // set related datastore so handler can access datastore/session specific datastore state fProfileHandlerP->setRelatedDatastore(aLocalDatastoreP); // generate data item string dataitem; fProfileHandlerP->generateText(*itemP,dataitem); // put data item into opaque/cdata PCData aItem->data=newPCDataStringX((const uInt8 *)dataitem.c_str(),true); // can't go wrong return true; } // TMimeDirItemType::internalSetItemData bool TMimeDirItemType::parseForProperty(SmlItemPtr_t aItemP, const char *aPropName, string &aString) { if (aItemP && aItemP->data) return parseForProperty(smlPCDataToCharP(aItemP->data),aPropName,aString); else return false; } // TMimeDirItemType::parseForProperty // scan Data item for specific property (used for quick type tests) bool TMimeDirItemType::parseForProperty(const char *aText, const char *aPropName, string &aString) { return static_cast(fProfileHandlerP)->parseForProperty(aText, aPropName, aString); } // TMimeDirItemType::parseForProperty // generates SyncML-Devinf property list for type SmlDevInfCTDataPropListPtr_t TMimeDirItemType::newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor) { // let profile handle that return fProfileHandlerP->newCTDataPropList(aVariantDescriptor, this); } #ifdef OBJECT_FILTERING // Filtering: add keywords and property names to filterCap void TMimeDirItemType::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDescriptor) { fProfileHandlerP->addFilterCapPropsAndKeywords(aFilterKeywords, aFilterProps, aVariantDescriptor, this); // add basics inherited::addFilterCapPropsAndKeywords(aFilterKeywords,aFilterProps,aVariantDescriptor); } // TMimeDirItemType::addFilterCapPropsAndKeywords #endif // OBJECT_FILTERING // Analyze CTCap part of devInf bool TMimeDirItemType::analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP) { if (TMultiFieldItemType::analyzeCTCap(aCTCapP)) { // let profile check fProfileHandlerP->analyzeCTCap(aCTCapP, this); } #ifdef SYDEBUG if (PDEBUGTEST(DBG_REMOTEINFO+DBG_DETAILS)) { // Show which fields are enabled PDEBUGPRINTFX(DBG_REMOTEINFO,("Field options after CTCap analyzing:")); string finfo; for (sInt16 i=0; inumFields(); i++) { StringObjAppendPrintf(finfo, "- %-20s : %-12s maxoccur=%ld, maxsize=%ld %s%s\n", fFieldDefinitionsP->fFields[i].TCFG_CSTR(fieldname), getFieldOptions(i)->available ? "AVAILABLE" : "n/a", (long)getFieldOptions(i)->maxoccur, (long)getFieldOptions(i)->maxsize, getFieldOptions(i)->maxsize == FIELD_OPT_MAXSIZE_UNKNOWN ? "(limited, but unknown size)" : (getFieldOptions(i)->maxsize == FIELD_OPT_MAXSIZE_NONE ? "(unlimited)" : ""), getFieldOptions(i)->notruncate ? ", noTruncate" : "" ); } PDEBUGPUTSXX(DBG_REMOTEINFO+DBG_DETAILS,finfo.c_str(),0,true); } #endif return true; } /// @brief helper to create same-typed instance via base class TSyncItemType *TMimeDirItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TMimeDirItemType,DBG_OBJINST,"TMimeDirItemType",TMimeDirItemType( aSessionP, fTypeConfigP, getTypeName(), getTypeVers(), aDatastoreP, fFieldDefinitionsP )); } // TMimeDirItemType::newCopyForSameType /// @brief copy CTCap derived info from another SyncItemType /// @return false if item not compatible /// @note required to create remote type variants from ruleMatch type alternatives bool TMimeDirItemType::copyCTCapInfoFrom(TSyncItemType &aSourceItem) { // must be same type as myself or based on the type of myself if (!aSourceItem.isBasedOn(getTypeID())) return false; // not compatible TMimeDirItemType *itemTypeP = static_cast(&aSourceItem); // copy the fieldDefs flag fReceivedFieldDefs = itemTypeP->fReceivedFieldDefs; // other CTCap info is in the field options of MultiFieldItemType return inherited::copyCTCapInfoFrom(aSourceItem); } // TMimeDirItemType::copyCTCapInfoFrom /* end of TMimeDirItemType implementation */ } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/mimediritemtype.h0000755000373300037200000001173012424517753026232 0ustar00nightlyallusers00000000000000/* * File: mimediritemtype.h * * Author: Lukas Zeller (luz@plan44.ch) * * TMimeDirItemType * base class for MIME DIR based content types (vCard, vCalendar...) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-12 : luz : created * */ #ifndef MimeDirItemType_H #define MimeDirItemType_H // includes #include "syncitemtype.h" #include "multifielditemtype.h" #include "mimedirprofile.h" #include namespace sysync { // MIME-dir based datatype class TMIMEDirTypeConfig : public TMultiFieldTypeConfig { typedef TMultiFieldTypeConfig inherited; public: TMIMEDirTypeConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TMIMEDirTypeConfig(); // properties // - associated MIME profile (casted version of ancestor's fProfileConfigP) TMIMEProfileConfig *fMIMEProfileP; // public functions // - create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP); // get a descriptor for selecting a variant of a datatype (if any), NULL=no variant with this name virtual TTypeVariantDescriptor getVariantDescriptor(const char *aVariantName); protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); virtual void clear(); }; // TMIMEDirTypeConfig const uInt16 ity_mimedir=101; // must be unique class TMimeDirItemType: public TMultiFieldItemType { typedef TMultiFieldItemType inherited; friend class TMimeDirProfileHandler; public: // constructor TMimeDirItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ); // destructor virtual ~TMimeDirItemType(); // access to type virtual uInt16 getTypeID(void) const { return ity_mimedir; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_mimedir ? true : TMultiFieldItemType::isBasedOn(aItemTypeID); }; // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // MIME-DIR is an implementati on // returns true if field options are based on remote devinf (and not just defaults) virtual bool hasReceivedFieldOptions(void) { return fReceivedFieldDefs; }; // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); #ifdef OBJECT_FILTERING // filtering // - get field index of given filter expression identifier. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); #endif protected: // member fields TMimeDirProfileHandler *fProfileHandlerP; // CTCap parsing/generation // - analyze CTCap for specific type virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP); /// @brief copy CTCap derived info from another SyncItemType virtual bool copyCTCapInfoFrom(TSyncItemType &aSourceItemP); // - obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor); #ifdef OBJECT_FILTERING // - Filtering: add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc); #endif // scan for specific property value string (for version check) bool parseForProperty(const char *aText, const char *aPropName, string &aString); bool parseForProperty(SmlItemPtr_t aItemP, const char *aPropName, string &aString); // Item data management // - create new sync item of proper type and optimization for specified target virtual TSyncItem *internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP); // - fill in SyncML data (but leaves IDs empty) virtual bool internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ); // - sets data and meta from SyncItem data, but leaves source & target untouched virtual bool internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ); private: bool fReceivedFieldDefs; }; // TMimeDirItemType } // namespace sysync #endif // MimeDirItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/mimedirprofile.cpp0000644000373300037200000072520512424517753026373 0ustar00nightlyallusers00000000000000/* * File: mimedirprofile.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TMimeDirItemType * base class for MIME DIR based content types (vCard, vCalendar...) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2009-01-09 : luz : created from mimediritemtype.cpp * */ // includes #include "prefix_file.h" #include "sysync.h" #include "vtimezone.h" #include "rrules.h" #include "mimedirprofile.h" #include "mimediritemtype.h" #include "syncagent.h" #include using namespace sysync; namespace sysync { // mime-DIR mode names const char * const mimeModeNames[numMimeModes] = { "old", "standard" }; // VTIMEZONE generation modes const char * const VTimeZoneGenModes[numVTimeZoneGenModes] = { "current", "start", "end", "range", "openend" }; // VTIMEZONE generation modes const char * const VTzIdGenModes[numTzIdGenModes] = { "default", "olson" }; // enumeration modes const char * const EnumModeNames[numEnumModes] = { "translate", // translation from value to name and vice versa "prefix", // translation of prefix while copying rest of string "defaultname", // default name when translating from value to name "defaultvalue", // default value when translating from name to value "ignore" // ignore value or name }; // profile modes const char * const ProfileModeNames[numProfileModes] = { "custom", // custom profile "vtimezones", // VTIMEZONE profile(s), expands to a VTIMEZONE for every time zone referenced by convmode TZID fields }; // Config // ====== #pragma exceptions off // Type registry TMIMEProfileConfig::TMIMEProfileConfig(const char* aName, TConfigElement *aParentElement) : TProfileConfig(aName,aParentElement) { fRootProfileP=NULL; // no profile yet clear(); } // TMIMEProfileConfig::TMIMEProfileConfig TMIMEProfileConfig::~TMIMEProfileConfig() { clear(); } // TMIMEProfileConfig::~TMIMEProfileConfig // init defaults void TMIMEProfileConfig::clear(void) { // init defaults if (fRootProfileP) { delete fRootProfileP; fRootProfileP=NULL; // no profile any more } // init options fUnfloatFloating = false; fVTimeZoneGenMode = vtzgen_current; // show VTIMEZONE valid for current year (i.e. not dependent on record's time stamps) fTzIdGenMode = tzidgen_default; // default TZIDs // reset group building mechanism #ifdef CONFIGURABLE_TYPE_SUPPORT fLastProperty = NULL; fPropertyGroupID = 1; // start at 1 (0=no group) #endif // clear inherited inherited::clear(); } // TMIMEProfileConfig::clear #pragma exceptions reset // handler factory TProfileHandler *TMIMEProfileConfig::newProfileHandler(TMultiFieldItemType *aItemTypeP) { // check if fieldlists match as they should if (aItemTypeP->getFieldDefinitions()!=fFieldListP) { // profile is for another field list, cannot be used for this item type return NULL; } // our handler is the text profile handler return (TProfileHandler *)(new TMimeDirProfileHandler(this,aItemTypeP)); } #ifdef CONFIGURABLE_TYPE_SUPPORT // get conversion mode, virtual, can be overridden by derivates bool TMIMEProfileConfig::getConvMode(cAppCharP aText, sInt16 &aConvMode) { // separate options size_t n=0; // no size cAppCharP op = strchr(aText, '+'); if (op) n = op-aText; // check basic modes if (op && n==0) { // only options, no basic mode aConvMode = CONVMODE_NONE; } else { // first item is basic mode if (strucmp(aText,"none",n)==0) aConvMode = CONVMODE_NONE; else if (strucmp(aText,"version",n)==0) aConvMode = CONVMODE_VERSION; else if (strucmp(aText,"prodid",n)==0) aConvMode = CONVMODE_PRODID; else if (strucmp(aText,"timestamp",n)==0) aConvMode = CONVMODE_TIMESTAMP; else if (strucmp(aText,"date",n)==0) aConvMode = CONVMODE_DATE; else if (strucmp(aText,"autodate",n)==0) aConvMode = CONVMODE_AUTODATE; else if (strucmp(aText,"autoenddate",n)==0) aConvMode = CONVMODE_AUTOENDDATE; else if (strucmp(aText,"tz",n)==0) aConvMode = CONVMODE_TZ; else if (strucmp(aText,"daylight",n)==0) aConvMode = CONVMODE_DAYLIGHT; else if (strucmp(aText,"tzid",n)==0) aConvMode = CONVMODE_TZID; else if (strucmp(aText,"emptyonly",n)==0) aConvMode = CONVMODE_EMPTYONLY; else if (strucmp(aText,"bitmap",n)==0) aConvMode = CONVMODE_BITMAP; else if (strucmp(aText,"multimix",n)==0) aConvMode = CONVMODE_MULTIMIX; else if (strucmp(aText,"blob_b64",n)==0) aConvMode = CONVMODE_BLOB_B64; else if (strucmp(aText,"blob_auto",n)==0) aConvMode = CONVMODE_BLOB_AUTO; else if (strucmp(aText,"mailto",n)==0) aConvMode = CONVMODE_MAILTO; else if (strucmp(aText,"valuetype",n)==0) aConvMode = CONVMODE_VALUETYPE; else if (strucmp(aText,"fullvaluetype",n)==0) aConvMode = CONVMODE_FULLVALUETYPE; else if (strucmp(aText,"rrule",n)==0) aConvMode = CONVMODE_RRULE; else { fail("'conversion' value '%s' is invalid",aText); return false; } } // now check for options flags and or them into conversion value while (op) { aText = op+1; // skip + n = 0; op = strchr(aText, '+'); if (op) n = op-aText; if (strucmp(aText,"extfmt",n)==0) aConvMode |= CONVMODE_FLAG_EXTFMT; else if (strucmp(aText,"millisec",n)==0) aConvMode |= CONVMODE_FLAG_MILLISEC; else { fail("'conversion' option '%s' is invalid",aText); return false; } } return true; } // TMIMEProfileConfig::getConvMode // private helper bool TMIMEProfileConfig::getConvAttrs(const char **aAttributes, sInt16 &aFid, sInt16 &aConvMode, char &aCombSep) { // - get options const char *fnam = getAttr(aAttributes,"field"); if (fnam && *fnam!=0) { // has field spec // - find field ID aFid = fFieldListP->fieldIndex(fnam); if (aFid==VARIDX_UNDEFINED) { fail("'field' '%s' does not exist in field list '%s'",fnam,fFieldListP->getName()); return false; } } // - get conversion mode const char *conv = getAttr(aAttributes,"conversion"); if (conv) { if (!getConvMode(conv,aConvMode)) return false; } // - get combination char const char *comb = getAttr(aAttributes,"combine"); if (comb) { if (strucmp(comb,"no")==0) aCombSep=0; else if (strucmp(comb,"lines")==0) aCombSep='\n'; else if (strlen(comb)==1) aCombSep=*comb; else { fail("'combine' value '%s' is invalid",comb); return false; } } return true; // ok } // TMIMEProfileConfig::getConvAttrs bool TMIMEProfileConfig::getMask(const char **aAttributes, const char *aName, TParameterDefinition *aParamP, TNameExtIDMap &aMask) { const char *m=getAttr(aAttributes,aName); if (m) { while (*m) { // skip comma separators and spaces if (*m==',' || *m<=0x20) { m++; continue; } // decode substring TParameterDefinition *paramP = aParamP; // default param size_t n=0; while(m[n]>0x20 && m[n]!=',') { if (m[n]=='.') { // qualified enum, search param paramP=fOpenProperty->findParameter(m,n); if (!paramP) { fail("Unknown param '%s' referenced in '%s'",m,aName); return false; } m+=n+1; // set start to enum name n=0; // start anew continue; // prevent increment } n++; } if (!paramP) { fail("Enum value must be qualified with parameter name: '%s'",m); return false; } TNameExtIDMap msk = paramP->getExtIDbit(m,n); if (msk==0) { fail("'%s' is not an enum of parameter '%s'",m,paramP->paramname.c_str()); return false; } aMask = aMask | msk; m+=n; // advance pointer } } return true; // ok; } // TMIMEProfileConfig::getMask bool TMIMEProfileConfig::processPosition(TParameterDefinition *aParamP, const char **aAttributes) { // // - get maps TNameExtIDMap hasmap=0; TNameExtIDMap hasnotmap=0; TNameExtIDMap showsmap=0; if (!getMask(aAttributes,"has",aParamP,hasmap)) return false; // failed if (!getMask(aAttributes,"hasnot",aParamP,hasnotmap)) return false; // failed if (!getMask(aAttributes,"shows",aParamP,showsmap)) return false; // failed // - get field sInt16 fid=FID_NOT_SUPPORTED; const char *fnam = getAttr(aAttributes,"field"); if (fnam) { fid = fFieldListP->fieldIndex(fnam); if (fid==VARIDX_UNDEFINED) return !fail("'field' '%s' does not exist in field list '%s'",fnam,fFieldListP->getName()); } // - calculate offset from first specified value field in property sInt16 fidoffs=FID_NOT_SUPPORTED; if (fid>=0) { for (sInt16 k=0; knumValues; k++) { fidoffs=fOpenProperty->convdefs[k].fieldid; if (fidoffs>=0) break; // found field offset } if (fidoffs<0) return !fail("property '%s' does not have any field assigned, cannot use 'position'",fOpenProperty->propname.c_str()); // calc now fidoffs=fid-fidoffs; } // - get repeat and increment sInt16 repeat=1; // no repeat, no rewrite, but check other s when property occurs again. sInt16 incr=1; // inc by 1 sInt16 minshow=-1; // auto mode, same as repeat bool overwriteempty=true; // do not store empty repetitions bool readonly=false; // not just a parsing alternative sInt16 sharecountoffs=0; // no repeat counter sharing // - check special maxrepeat values const char *repval = getAttr(aAttributes,"repeat"); if (repval) { if (strucmp(repval,"rewrite")==0) repeat=REP_REWRITE; #ifdef ARRAYFIELD_SUPPORT else if (strucmp(repval,"array")==0) repeat=REP_ARRAY; #endif else if (!StrToShort(repval,repeat)) return !fail("expected number, 'rewrite' or 'array' in 'repeat'"); } // - increment and minshow if ( !getAttrShort(aAttributes,"increment",incr,true) || !getAttrShort(aAttributes,"minshow",minshow,true) || !getAttrShort(aAttributes,"sharepreviouscount",sharecountoffs,true) ) return !fail("number expected in 'increment', 'minshow' and 'sharepreviouscount'"); // - overwrite empty if (!getAttrBool(aAttributes,"overwriteempty",overwriteempty,true)) return !fail("expected boolean value in 'overwriteempty'"); // - read only position if (!getAttrBool(aAttributes,"readonly",readonly,true)) return !fail("expected boolean value in 'readonly'"); // - create name extension (position) fOpenProperty->addNameExt( fRootProfileP,hasmap,hasnotmap,showsmap,fidoffs, repeat,incr,minshow,overwriteempty,readonly,sharecountoffs ); expectEmpty(); // no contents (and not a separte nest level) return true; // ok } // TMIMEProfileConfig::processPosition // called at end of nested parsing level void TMIMEProfileConfig::nestedElementEnd(void) { // - change mode if (fOpenConvDef) fOpenConvDef=NULL; // done with value spec else if (fOpenParameter) fOpenParameter=NULL; // done with paramater else if (fOpenProperty) fOpenProperty=NULL; // done with property else if (fOpenProfile) { fOpenProfile=fOpenProfile->parentProfile; // back to parent profile (or NULL if root) // groups do not span profiles fLastProperty=NULL; } } // TMIMEProfileConfig::nestedElementEnd // config element parsing bool TMIMEProfileConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { sInt16 nummand; const char *nam; const char *val; const char *fnam; sInt16 fid; sInt16 convmode; char combsep; // MIME profile. This is multi-level and therefore needs // complicated parser. if (fNest==0) { // reset to root level fOpenProfile=NULL; fOpenProperty=NULL; fOpenParameter=NULL; fOpenConvDef=NULL; } // - parse generics // - get MIME-DIR type dependency TMimeDirMode modeDep = numMimeModes; // no mode dependency by default sInt16 m; cAppCharP modeDepName = getAttr(aAttributes,"onlyformode"); if (modeDepName) { if (!StrToEnum(mimeModeNames,numMimeModes,m,modeDepName)) return fail("unknown 'onlyformode' attribute value '%s'",modeDepName); else modeDep=(TMimeDirMode)m; } // - now parse specifics if (fOpenConvDef) { if (strucmp(aElementName,"enum")==0) { // // - get name and value nam = getAttr(aAttributes,"name"); val = getAttr(aAttributes,"value"); // - get mode TEnumMode mode=enm_translate; // default to translate const char *mod=getAttr(aAttributes,"mode"); if (mod) { if (!StrToEnum(EnumModeNames,numEnumModes,m,mod)) return fail("unknown 'mode' '%s'",mod); else mode=(TEnumMode)m; } // - get options bool positional=fOpenParameter && fOpenParameter->extendsname; // default to parameter if (!getAttrBool(aAttributes,"positional",positional,true)) return fail("bad boolean value for 'positional'"); if (fOpenParameter && positional && !fOpenParameter->extendsname) return fail("'parameter' must have set 'positional' to use positional 'enum's"); // check logic if (mode!=enm_default_value && mode!=enm_ignore && (!nam || *nam==0)) return fail("non-default/non-positional 'enum' must have 'name' attribute"); // 1:1 translation shortcut: if no value specified, use name as value if (mode==enm_translate && !val) val=nam; // use name as value // default name and ignore can have no value (prefix can have empty value) if (!positional && mode!=enm_default_name && mode!=enm_ignore && (!val || (*val==0 && mode!=enm_prefix))) return fail("non-default 'enum' must have (possibly non-empty) 'value' attribute"); // - create enum if (positional) fOpenConvDef->addEnumNameExt(fOpenProperty, nam,val,mode); else fOpenConvDef->addEnum(nam,val,mode); expectEmpty(); // no contents (and not a separate nest level) } // none known here else return false; // parent is TConfigElement, no need to call inherited } else if (fOpenParameter) { if (strucmp(aElementName,"value")==0) { // // - set default options fid=FID_NOT_SUPPORTED; convmode = CONVMODE_NONE; combsep = 0; // - get other options of convdef if (!getConvAttrs(aAttributes,fid,convmode,combsep)) return true; // failed // - set convdef fOpenConvDef = fOpenParameter->setConvDef(fid,convmode,combsep); startNestedParsing(); } else if (strucmp(aElementName,"position")==0) { // Position within parameter, enums reference this parameter without // explicitly qualified enum names. To reference enums of other params, // qualified names are allowed. // if (!processPosition(fOpenParameter,aAttributes)) return true; // failed } // none known here else return inherited::localStartElement(aElementName, aAttributes, aLine); // call inherited } else if (fOpenProperty) { if (strucmp(aElementName,"value")==0) { // // - get index sInt16 idx=0; if (!getAttrShort(aAttributes,"index",idx,fOpenProperty->numValues==1)) // optional only for 1-value properties (or lists) return fail("'index' missing or with invalid value"); if (idx>=fOpenProperty->numValues) return fail("'index' out of range (0..%hd)",fOpenProperty->numValues); // - set default options fid=FID_NOT_SUPPORTED; convmode = CONVMODE_NONE; combsep = 0; // - get other options of convdef if (!getConvAttrs(aAttributes,fid,convmode,combsep)) return true; // failed // - set convdef fOpenConvDef = fOpenProperty->setConvDef(idx,fid,convmode,combsep); startNestedParsing(); } else if (strucmp(aElementName,"parameter")==0) { // // - get name nam = getAttr(aAttributes,"name"); if (!nam || *nam==0) return fail("'parameter' must have 'name' attribute"); // - get options bool positional=false; bool defparam=false; bool shownonempty=false; // don't show properties that have only param values, but no main value bool showinctcap=false; // don't show parameter in CTCap by default bool sharedfield=false; // assume traditional, unshared field for parameter if ( !getAttrBool(aAttributes,"sharedfield",sharedfield,true) || !getAttrBool(aAttributes,"positional",positional,true) || !getAttrBool(aAttributes,"default",defparam,true) || !getAttrBool(aAttributes,"shownonempty",shownonempty,true) || !getAttrBool(aAttributes,"show",showinctcap,true) || !getAttrBool(aAttributes,"showindevinf",showinctcap,true) // synonymous with "show" for parameters (note that "show" on properties is no longer effective on purpose!) ) return fail("bad boolean value"); // - add parameter fOpenParameter = fOpenProperty->addParam(nam,defparam,positional,shownonempty,showinctcap,modeDep,sharedfield); #ifndef NO_REMOTE_RULES const char *depRuleName = getAttr(aAttributes,"rule"); TCFG_ASSIGN(fOpenParameter->dependencyRuleName,depRuleName); // save name for later resolving #endif startNestedParsing(); } else if (strucmp(aElementName,"position")==0) { // Position outside parameter, enums must reference parameters using // explicitly qualified enum names like "TYPE.HOME" // if (!processPosition(NULL,aAttributes)) return true; // failed } // none known here else return inherited::localStartElement(aElementName, aAttributes, aLine); // call inherited } else if (fOpenProfile) { if (strucmp(aElementName,"subprofile")==0) { // // // - starting a new subprofile starts a new property group anyway fLastProperty=NULL; // - get name nam = getAttr(aAttributes,"name"); if (!nam || *nam==0) return fail("'subprofile' must have 'name' attribute"); // - get profile mode TProfileModes mode = profm_custom; cAppCharP pfmode = getAttr(aAttributes,"mode"); if (pfmode) { if (!StrToEnum(ProfileModeNames,numProfileModes,m,pfmode)) return fail("unknown profile 'mode' '%s'",pfmode); else mode=(TProfileModes)m; } // - check mode dependent params TProfileDefinition *profileP = NULL; // no foreign properties by default if (mode==profm_custom) { // Custom profile // - get number of mandatory properties if (!getAttrShort(aAttributes,"nummandatory",nummand,false)) return fail ("missing or bad 'nummandatory' specification"); // - check if using properties of other profile const char *use = getAttr(aAttributes,"useproperties"); if (use) { profileP = fRootProfileP->findProfile(use); if (!profileP) return fail("unknown profile '%s' specified in 'useproperties'",use); expectEmpty(true); // subprofile is a nest level, so we need to flag that (otherwise, nestedElementEnd() would not get called) } else { // parsing nested elements in this TConfigElement startNestedParsing(); } } else { // non-custom profiles are expected to be empty expectEmpty(true); // subprofile is a nest level, so we need to flag that (otherwise, nestedElementEnd() would not get called) } // - get DevInf visibility options bool showifselectedonly = false; // default: show anyway if (!getAttrBool(aAttributes,"showifselectedonly",showifselectedonly,true)) return fail("bad boolean value for showifselectedonly"); // - create subprofile now fOpenProfile = fOpenProfile->addSubProfile(nam,nummand,showifselectedonly,mode,modeDep); // - add properties of other level if any if (profileP) fOpenProfile->usePropertiesOf(profileP); // - add level control field stuff, if any fnam = getAttr(aAttributes,"field"); if (fnam) { // - "value" is optional, without a value subprofile is activated if field is non-empty val = getAttr(aAttributes,"value"); // - find field fid = fFieldListP->fieldIndex(fnam); if (fid==VARIDX_UNDEFINED) return fail("'field' '%s' does not exist in field list '%s'",fnam,fFieldListP->getName()); // - set level control convdef TConversionDef *cdP = fOpenProfile->setConvDef(fid); // set field ID of level control field if (val) cdP->addEnum("",val,enm_translate); // set value to be set into level control field when level is entered } } else if (strucmp(aElementName,"property")==0) { // // - get name nam = getAttr(aAttributes,"name"); if (!nam || *nam==0) return fail("'property' must have 'name' attribute"); // - check grouping if (!fLastProperty || strucmp(TCFG_CSTR(fLastProperty->propname),nam)!=0) { // first property in group fPropertyGroupID++; // new group ID } #ifndef NO_REMOTE_RULES // - get rule dependency bool isRuleDep=false; const char *depRuleName = getAttr(aAttributes,"rule"); if (depRuleName) { isRuleDep=true; if (strucmp(depRuleName,"other")==0) { // "other" rule (property is active if no other property from the group gets active) depRuleName=NULL; } } #endif // - get number of values sInt16 numval=1; // default to 1 const char *nvs = getAttr(aAttributes,"values"); if (nvs) { if (strucmp(nvs,"list")==0) numval=NUMVAL_LIST; else if (strucmp(nvs,"expandedlist")==0) numval=NUMVAL_REP_LIST; else if (!StrToShort(nvs,numval)) return fail("invalid value in 'values' attribute"); } // - get options bool mandatory = false; bool showprop = true; // show property in devInf by default bool suppressempty = false; bool allowFoldAtSep = false; bool canfilter = false; // 3.2.0.9 onwards: do not show filter caps by default (devInf gets too large) if ( !getAttrBool(aAttributes,"mandatory",mandatory,true) || !getAttrBool(aAttributes,"showindevinf",showprop,true) || // formerly just called "show" (but renamed to make it ineffective in old configs as new engine prevents duplicates automatically) !getAttrBool(aAttributes,"suppressempty",suppressempty,true) || !getAttrBool(aAttributes,"filter",canfilter,true) || !getAttrBool(aAttributes,"foldbetween",allowFoldAtSep,true) ) return fail("bad boolean value"); const char *valsep= getAttr(aAttributes,"valueseparator"); if (!valsep) valsep=";"; // default to semicolon if not defined const char *altvalsep= getAttr(aAttributes,"altvalueseparator"); if (!altvalsep) altvalsep=""; // default to none if not defined // - group field ID sInt16 groupFieldID = FID_NOT_SUPPORTED; // no group field ID by default cAppCharP gfin = getAttr(aAttributes, "groupfield"); if (gfin) { groupFieldID = fFieldListP->fieldIndex(gfin); if (groupFieldID==VARIDX_UNDEFINED) { fail("'groupfield' '%s' does not exist in field list '%s'",gfin,fFieldListP->getName()); return false; } } // - delayed processing sInt16 delayedprocessing=0; // default to 0 if (!getAttrShort(aAttributes,"delayedparsing",delayedprocessing,true)) return fail ("bad 'delayedparsing' specification"); // - create property now and open new level of parsing fOpenProperty=fOpenProfile->addProperty(nam, numval, mandatory, showprop, suppressempty, delayedprocessing, *valsep, fPropertyGroupID, canfilter, modeDep, *altvalsep, groupFieldID, allowFoldAtSep); fLastProperty=fOpenProperty; // for group checking #ifndef NO_REMOTE_RULES // - add rule dependency (pointer will be resolved later) fOpenProperty->dependsOnRemoterule=isRuleDep; fOpenProperty->ruleDependency=NULL; // not known yet TCFG_ASSIGN(fOpenProperty->dependencyRuleName,depRuleName); // save name for later resolving #endif startNestedParsing(); } // none known here else return inherited::localStartElement(aElementName, aAttributes, aLine); // call inherited } else { if (strucmp(aElementName,"profile")==0) { // if (fRootProfileP) return fail("'profile' cannot be defined more than once"); // new profile starts new property group fLastProperty=NULL; // get name nam = getAttr(aAttributes,"name"); if (!nam || *nam==0) return fail("'profile' must have 'name' attribute"); // - get number of mandatory properties if (!getAttrShort(aAttributes,"nummandatory",nummand,false)) return fail ("missing or bad 'nummandatory' specification"); // create root profile fRootProfileP = new TProfileDefinition(NULL,nam,nummand,false,profm_custom,numMimeModes); // root needs no selection to be shown, is always a custom profile, and not mode dependent // parsing nested elements in this TConfigElement fOpenProfile=fRootProfileP; // current open profile startNestedParsing(); } else if (strucmp(aElementName,"unfloattimestamps")==0) expectBool(fUnfloatFloating); else if (strucmp(aElementName,"vtimezonegenmode")==0) expectEnum(sizeof(fVTimeZoneGenMode),&fVTimeZoneGenMode,VTimeZoneGenModes,numVTimeZoneGenModes); else if (strucmp(aElementName,"tzidgenmode")==0) expectEnum(sizeof(fTzIdGenMode),&fTzIdGenMode,VTzIdGenModes,numTzIdGenModes); // none known here else return inherited::localStartElement(aElementName, aAttributes, aLine); } // ok return true; } // TMIMEProfileConfig::localStartElement #ifndef NO_REMOTE_RULES // resolve remote rule dependencies in profile (recursive) static void resolveRemoteRuleDeps(TProfileDefinition *aProfileP, TAgentConfig *aSessionConfigP) { TProfileDefinition *profileP = aProfileP; while (profileP) { // resolve properties TPropertyDefinition *propP = profileP->propertyDefs; while (propP) { // check for rule-dependent props if (propP->dependsOnRemoterule) { propP->ruleDependency=NULL; // assume the "other" rule entry if (!TCFG_ISEMPTY(propP->dependencyRuleName)) { // find remote rule TRemoteRulesList::iterator pos; for(pos=aSessionConfigP->fRemoteRulesList.begin();pos!=aSessionConfigP->fRemoteRulesList.end();pos++) { if (strucmp(TCFG_CSTR(propP->dependencyRuleName),(*pos)->getName())==0) { // found rule by name propP->ruleDependency=(*pos); break; } } if (propP->ruleDependency==NULL) { string s; StringObjPrintf(s,"property '%s' depends on unknown rule '%s'",TCFG_CSTR(propP->propname),TCFG_CSTR(propP->dependencyRuleName)); SYSYNC_THROW(TConfigParseException(s.c_str())); } } // rule specified } // also fix rule-dependent parameters TParameterDefinition *paramP = propP->parameterDefs; while (paramP) { if (!TCFG_ISEMPTY(paramP->dependencyRuleName)) { TRemoteRulesList::iterator pos; for(pos=aSessionConfigP->fRemoteRulesList.begin();pos!=aSessionConfigP->fRemoteRulesList.end();pos++) { if (strucmp(TCFG_CSTR(paramP->dependencyRuleName),(*pos)->getName())==0) { paramP->ruleDependency=(*pos); break; } } if (paramP->ruleDependency==NULL) { string s; StringObjPrintf(s,"parameter '%s' in property '%s' depends on unknown rule '%s'", TCFG_CSTR(paramP->paramname), TCFG_CSTR(propP->propname), TCFG_CSTR(propP->dependencyRuleName)); SYSYNC_THROW(TConfigParseException(s.c_str())); } } paramP = paramP->next; } // next propP=propP->next; } // resolve subprofiles resolveRemoteRuleDeps(profileP->subLevels,aSessionConfigP); // next profileP=profileP->next; } } // resolveRemoteRuleDeps #endif // resolve void TMIMEProfileConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings if (!fRootProfileP) SYSYNC_THROW(TConfigParseException("empty 'mimeprofile' not allowed")); #ifndef NO_REMOTE_RULES // recursively resolve remote rule dependencies in all properties resolveRemoteRuleDeps( fRootProfileP, static_cast(static_cast(getRootElement())->fAgentConfigP) ); #endif } // resolve inherited inherited::localResolve(aLastPass); } // TMIMEProfileConfig::localResolve #endif // CONFIGURABLE_TYPE_SUPPORT // implementation of MIME-DIR info classes #pragma exceptions off #define EXCEPTIONS_HERE 0 TEnumerationDef::TEnumerationDef(const char *aEnumName, const char *aEnumVal, TEnumMode aMode, sInt16 aNameExtID) { next=NULL; TCFG_ASSIGN(enumtext,aEnumName); TCFG_ASSIGN(enumval,aEnumVal); enummode=aMode; nameextid=aNameExtID; } // TEnumerationDef::TEnumerationDef TEnumerationDef::~TEnumerationDef() { // make sure entire chain gets deleted if (next) delete next; } // TEnumerationDef::~TEnumerationDef TConversionDef::TConversionDef() { fieldid=FID_NOT_SUPPORTED; enumdefs=NULL; convmode=0; combineSep=0; } // TConversionDef::TConversionDef TConversionDef::~TConversionDef() { // make sure enum list gets deleted if (enumdefs) delete enumdefs; } // TEnumerationDef::~TEnumerationDef TConversionDef *TConversionDef::setConvDef( sInt16 aFieldId, sInt16 aConvMode, char aCombSep ) { fieldid=aFieldId; convmode=aConvMode; combineSep=aCombSep; return this; } // TConversionDef::setConvDef const TEnumerationDef *TConversionDef::findEnumByName(const char *aName, sInt16 n) const { TEnumerationDef *enumP = enumdefs; TEnumerationDef *defaultenumP = NULL; while(enumP) { // check plain match if ( (enumP->enummode==enm_translate || enumP->enummode==enm_ignore) && strucmp(aName,TCFG_CSTR(enumP->enumtext),n)==0 ) break; // found full match // check prefix match else if ( enumP->enummode==enm_prefix && (TCFG_SIZE(enumP->enumtext)==0 || strucmp(aName,TCFG_CSTR(enumP->enumtext),TCFG_SIZE(enumP->enumtext))==0) ) break; // found prefix match (or prefix entry with no text, which means match as well) // otherwise: remember if this is a default else if (enumP->enummode==enm_default_value) { // default value entry defaultenumP=enumP; // anyway: remember default value entry // allow searching default value by name (for "has","hasnot" parsing via getExtIDbit()) if (!(TCFG_ISEMPTY(enumP->enumtext)) && strucmp(aName,TCFG_CSTR(enumP->enumtext),n)==0) break; // found named default value } // check next enumP=enumP->next; } return enumP ? enumP : defaultenumP; } // TConversionDef::findEnumByName const TEnumerationDef *TConversionDef::findEnumByVal(const char *aVal, sInt16 n) const { TEnumerationDef *enumP = enumdefs; TEnumerationDef *defaultenumP = NULL; while(enumP) { // check full match if ( (enumP->enummode==enm_translate || enumP->enummode==enm_ignore) && strucmp(aVal,TCFG_CSTR(enumP->enumval),n)==0 ) break; // found // check prefix match else if ( enumP->enummode==enm_prefix && (TCFG_SIZE(enumP->enumval)==0 || strucmp(aVal,TCFG_CSTR(enumP->enumval),TCFG_SIZE(enumP->enumval))==0) ) break; // found prefix match (or prefix entry with no value, which means match as well) // remember if this is a default else if (enumP->enummode == enm_default_name) defaultenumP=enumP; // remember default // check next enumP=enumP->next; } return enumP ? enumP : defaultenumP; } // TConversionDef::findEnumByVal void TConversionDef::addEnum(const char *aEnumName, const char *aEnumVal, TEnumMode aMode) { TEnumerationDef **enumPP = &enumdefs; while(*enumPP!=NULL) enumPP=&((*enumPP)->next); // find last in chain *enumPP = new TEnumerationDef(aEnumName,aEnumVal,aMode); // w/o name extension } // TConversionDef::addEnum // add enum for name extension, auto-creates property-unique name extension ID void TConversionDef::addEnumNameExt(TPropertyDefinition *aProp, const char *aEnumName, const char *aEnumVal, TEnumMode aMode) { TEnumerationDef **enumPP = &enumdefs; while(*enumPP!=NULL) enumPP=&((*enumPP)->next); // find last in chain if (aProp->nextNameExt>31) #if EXCEPTIONS_HERE SYSYNC_THROW(TSyncException(DEBUGTEXT("more than 32 name extensions","mdit3"))); #else return; // silently ignore #endif *enumPP = new TEnumerationDef(aEnumName,aEnumVal, aMode, aProp->nextNameExt++); } // TConversionDef::addEnumNameExt TParameterDefinition::TParameterDefinition( const char *aName, bool aDefault, bool aExtendsName, bool aShowNonEmpty, bool aShowInCTCap, TMimeDirMode aModeDep , bool aSharedField) { next=NULL; TCFG_ASSIGN(paramname,aName); defaultparam=aDefault; extendsname=aExtendsName; shownonempty=aShowNonEmpty; showInCTCap=aShowInCTCap; sharedField=aSharedField; modeDependency=aModeDep; #ifndef NO_REMOTE_RULES ruleDependency=NULL; TCFG_CLEAR(dependencyRuleName); #endif } // TParameterDefinition::TParameterDefinition TParameterDefinition::~TParameterDefinition() { if (next) delete next; } // TParameterDefinition::~TParameterDefinition TNameExtIDMap TParameterDefinition::getExtIDbit(const char *aEnumName, sInt16 n) { const TEnumerationDef *enumP=convdef.findEnumByName(aEnumName,n); if (enumP) { return ((TNameExtIDMap)1<nameextid); } return 0; } // TParameterDefinition::getExtIDbit TPropNameExtension::TPropNameExtension( TNameExtIDMap aMusthave_ids, TNameExtIDMap aForbidden_ids, TNameExtIDMap aAddtlSend_ids, sInt16 aFieldidoffs, sInt16 aMaxRepeat, sInt16 aRepeatInc, sInt16 aMinShow, bool aOverwriteEmpty, bool aReadOnly, sInt16 aRepeatID ) { next=NULL; musthave_ids=aMusthave_ids; forbidden_ids=aForbidden_ids; addtlSend_ids=aAddtlSend_ids; fieldidoffs=aFieldidoffs; maxRepeat=aMaxRepeat; repeatInc=aRepeatInc; minShow=aMinShow; overwriteEmpty=aOverwriteEmpty; readOnly=aReadOnly; repeatID=aRepeatID; } // TPropNameExtension::TPropNameExtension TPropNameExtension::~TPropNameExtension() { if (next) delete next; } // TPropNameExtension::~TPropNameExtension TPropertyDefinition::TPropertyDefinition(const char* aName, sInt16 aNumVals, bool aMandatory, bool aShowInCTCap, bool aSuppressEmpty, uInt16 aDelayedProcessing, char aValuesep, char aAltValuesep, uInt16 aPropertyGroupID, bool aCanFilter, TMimeDirMode aModeDep, sInt16 aGroupFieldID, bool aAllowFoldAtSep) { next = NULL; TCFG_ASSIGN(propname,aName); nameExts = NULL; // none yet nextNameExt = 0; // no enums with name extensions defined yet for this property valuelist = false; // no value list by default expandlist = false; // not expanding value list into repeating property by default valuesep = aValuesep; // separator for structured-value and value-list properties altvaluesep = aAltValuesep; // alternate separator for structured-value and value-list properties (for parsing only) allowFoldAtSep = aAllowFoldAtSep; // allow folding at value separators even if it inserts a space at the end of the previous value groupFieldID = aGroupFieldID; // fid for field that contains the group tag (prefix to the property name, like "a" in "a.TEL:079122327") propGroup = aPropertyGroupID; // property group ID // check if this is an unprocessed wildcard property unprocessed = strchr(aName, '*')!=NULL; // check value list if (aNumVals==NUMVAL_LIST || aNumVals==NUMVAL_REP_LIST) { // value list valuelist = true; expandlist = aNumVals==NUMVAL_REP_LIST; numValues = 1; // we accept a single convdef only } else { // individual values numValues = aNumVals; } // create convdefs array convdefs = new TConversionDef[numValues]; parameterDefs = NULL; // none yet mandatory = aMandatory; showInCTCap = aShowInCTCap; canFilter = aCanFilter; suppressEmpty = aSuppressEmpty; delayedProcessing = aDelayedProcessing; modeDependency = aModeDep; #ifndef NO_REMOTE_RULES // not dependent on rule yet (as rules do not exists at TPropertyDefinition creation, // dependency will be added later, if any) dependsOnRemoterule = false; ruleDependency = NULL; #endif } // TPropertyDefinition::TPropertyDefinition TPropertyDefinition::~TPropertyDefinition() { // delete name extensions if (nameExts) delete nameExts; // delete convdefs array if (convdefs) delete [] convdefs; // delete parameter definitions if (parameterDefs) delete parameterDefs; // delete rest of chain if (next) delete next; } // TPropertyDefinition::~TPropertyDefinition TConversionDef *TPropertyDefinition::setConvDef(sInt16 aValNum, sInt16 aFieldId,sInt16 aConvMode,char aCombSep) { if (aValNum<0 || aValNum>=numValues) #if EXCEPTIONS_HERE SYSYNC_THROW(TSyncException(DEBUGTEXT("setConvDef for Property with bad value number","mdit4"))); #else return NULL; // silently ignore #endif return convdefs[aValNum].setConvDef(aFieldId,aConvMode,aCombSep); }; // TPropertyDefinition::TConversionDef void TPropertyDefinition::addNameExt(TProfileDefinition *aRootProfile, // for profile-global RepID generation TNameExtIDMap aMusthave_ids, TNameExtIDMap aForbidden_ids, TNameExtIDMap aAddtlSend_ids, sInt16 aFieldidoffs, sInt16 aMaxRepeat, sInt16 aRepeatInc, sInt16 aMinShow, bool aOverwriteEmpty, bool aReadOnly, sInt16 aShareCountOffs ) { TPropNameExtension **namextPP = &nameExts; while(*namextPP!=NULL) namextPP=&((*namextPP)->next); // find last in chain if (aMinShow<0) { if (aMaxRepeat==REP_ARRAY) aMinShow=0; // by default, show nothing if array is empty else aMinShow=aMaxRepeat; // auto mode, show all repetitions } *namextPP = new TPropNameExtension( aMusthave_ids,aForbidden_ids,aAddtlSend_ids,aFieldidoffs, aMaxRepeat,aRepeatInc,aMinShow,aOverwriteEmpty,aReadOnly, // readOnly alternative parsing might want to share the // repeat count with previous occurrences aShareCountOffs ? aRootProfile->nextRepID-aShareCountOffs : aRootProfile->nextRepID++ ); } // TPropertyDefinition::addNameExt TParameterDefinition *TPropertyDefinition::addParam( const char *aName, bool aDefault, bool aExtendsName, bool aShowNonEmpty, bool aShowInCTCap, TMimeDirMode aModeDep , bool aSharedField) { TParameterDefinition **paramPP = ¶meterDefs; while(*paramPP!=NULL) paramPP=&((*paramPP)->next); // find last in chain *paramPP = new TParameterDefinition(aName,aDefault,aExtendsName,aShowNonEmpty,aShowInCTCap, aModeDep, aSharedField); return *paramPP; } // TPropertyDefinition::addParam // find parameter by name TParameterDefinition *TPropertyDefinition::findParameter(const char *aNam, sInt16 aLen) { TParameterDefinition *paramP = parameterDefs; while (paramP) { if (strucmp(aNam,TCFG_CSTR(paramP->paramname),aLen)==0) return paramP; // found paramP=paramP->next; // next } // not found return NULL; } // TPropertyDefinition::findParameter TProfileDefinition::TProfileDefinition( TProfileDefinition *aParentProfileP, // parent profile const char *aProfileName, // name sInt16 aNumMandatory, bool aShowInCTCapIfSelectedOnly, TProfileModes aProfileMode, TMimeDirMode aModeDep ) { parentProfile=aParentProfileP; // NULL if root next=NULL; // set fields TCFG_ASSIGN(levelName,aProfileName); shownIfSelectedOnly = aShowInCTCapIfSelectedOnly; profileMode = aProfileMode; modeDependency = aModeDep; // init numMandatoryProperties=aNumMandatory; propertyDefs=NULL; subLevels=NULL; ownsProps=true; nextRepID=0; } // TProfileDefinition::TProfileDefinition TProfileDefinition::~TProfileDefinition() { if (propertyDefs && ownsProps) delete propertyDefs; if (subLevels) delete subLevels; if (next) delete next; } // TProfileDefinition::~TProfileDefinition TProfileDefinition *TProfileDefinition::addSubProfile( const char *aProfileName, // name sInt16 aNumMandatory, bool aShowInCTCapIfSelectedOnly, TProfileModes aProfileMode, TMimeDirMode aModeDep ) { TProfileDefinition **profilePP=&subLevels; while (*profilePP!=NULL) profilePP=&((*profilePP)->next); *profilePP=new TProfileDefinition(this,aProfileName,aNumMandatory,aShowInCTCapIfSelectedOnly,aProfileMode,aModeDep); return *profilePP; } // TProfileDefinition::addSubProfile TPropertyDefinition *TProfileDefinition::addProperty( const char *aName, // name sInt16 aNumValues, // number of values bool aMandatory, // mandatory bool aShowInCTCap, // show in CTCap bool aSuppressEmpty, // suppress empty ones on send uInt16 aDelayedProcessing, // delayed processing when parsed, 0=immediate processing, 1..n=delayed char aValuesep, // value separator uInt16 aPropertyGroupID, // property group ID (alternatives for same-named properties should have same ID>0) bool aCanFilter, // can be filtered -> show in filter cap TMimeDirMode aModeDep, // property valid only for specific MIME mode char aAltValuesep, // alternate separator (for parsing) sInt16 aGroupFieldID, // group field ID bool aAllowFoldAtSep // allow folding at separators ) { TPropertyDefinition **propPP=&propertyDefs; while (*propPP!=NULL) propPP=&((*propPP)->next); *propPP=new TPropertyDefinition(aName,aNumValues,aMandatory,aShowInCTCap,aSuppressEmpty,aDelayedProcessing,aValuesep,aAltValuesep,aPropertyGroupID,aCanFilter,aModeDep,aGroupFieldID,aAllowFoldAtSep); // return new property return *propPP; } // TProfileDefinition::addProperty void TProfileDefinition::usePropertiesOf(TProfileDefinition *aProfile) { ownsProps=false; propertyDefs=aProfile->propertyDefs; } // TProfileDefinition::usePropertiesOf // find (sub)profile by name, recursively TProfileDefinition *TProfileDefinition::findProfile(const char *aNam) { // check myself if (levelName==aNam) return this; // check sublevels TProfileDefinition *lvlP = subLevels; TProfileDefinition *foundlvlP; while(lvlP) { foundlvlP=lvlP->findProfile(aNam); if (foundlvlP) return foundlvlP; lvlP=lvlP->next; } // does not match myself nor one of my sublevels return NULL; } // TProfileDefinition::findProfile #pragma exceptions reset #undef EXCEPTIONS_HERE #define EXCEPTIONS_HERE TARGET_HAS_EXCEPTIONS #ifdef OBJECT_FILTERING // get property definition of given filter expression identifier. TPropertyDefinition *TProfileDefinition::getPropertyDef(const char *aPropName) { TPropertyDefinition *propP = NULL; if (!aPropName) return propP; // no name, no fid // Depth first: search in subprofiles, if any TProfileDefinition *profileP = subLevels; while (profileP) { // search depth first if ((propP=profileP->getPropertyDef(aPropName))!=NULL) return propP; // found // test next profile profileP=profileP->next; } // now search my own properties propP = propertyDefs; while (propP) { // compare names if (strucmp(aPropName,TCFG_CSTR(propP->propname))==0) { return propP; } // test next property propP=propP->next; } // not found return NULL; } // TProfileDefinition::getPropertyDef // get field index of given filter expression identifier. sInt16 TProfileDefinition::getPropertyMainFid(const char *aPropName, uInt16 aIndex) { sInt16 fid = VARIDX_UNDEFINED; // search property definition with matching name TPropertyDefinition *propP = getPropertyDef(aPropName); // search for first value with a field assigned if (propP) { // found property with matching name if (propP->convdefs) { if (aIndex==0) { // no index specified -> search first with a valid FID for (uInt16 i=0; inumValues; i++) { if ((fid=propP->convdefs[i].fieldid)!=VARIDX_UNDEFINED) return fid; // found a field index } } else { // index specified for multivalued properties -> return specified value's ID if (aIndex<=propP->numValues) { return propP->convdefs[aIndex-1].fieldid; } } } } // not found return VARIDX_UNDEFINED; } // TProfileDefinition::getPropertyMainFid #endif // OBJECT_FILTERING /* * Implementation of TMimeDirProfileHandler */ TMimeDirProfileHandler::TMimeDirProfileHandler( TMIMEProfileConfig *aMIMEProfileCfgP, TMultiFieldItemType *aItemTypeP ) : TProfileHandler(aMIMEProfileCfgP, aItemTypeP) { // save profile config pointer fProfileCfgP = aMIMEProfileCfgP; fProfileDefinitionP = fProfileCfgP->fRootProfileP; // settable options defaults fMimeDirMode=mimo_standard; fReceiverCanHandleUTC = true; fVCal10EnddatesSameDay = false; // avoid 23:59:59 style end date by default fReceiverTimeContext = TCTX_UNKNOWN; // none in particular fDontSendEmptyProperties = false; // send all defined properties fDefaultOutCharset = chs_utf8; // standard fDefaultInCharset = chs_utf8; // standard fDoQuote8BitContent = false; // no quoting needed per se fDoNotFoldContent = false; // standard requires folding fTreatRemoteTimeAsLocal = false; // only for broken implementations fTreatRemoteTimeAsUTC = false; // only for broken implementations fActiveRemoteRules.clear(); // no dependency on certain remote rules } // TMimeDirProfileHandler::TMimeDirProfileHandler TMimeDirProfileHandler::~TMimeDirProfileHandler() { // nop for now } // TMimeDirProfileHandler::~TTextProfileHandler #ifdef OBJECT_FILTERING // get field index of given filter expression identifier. sInt16 TMimeDirProfileHandler::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // search properties for field index return fProfileDefinitionP->getPropertyMainFid(aIdentifier, aIndex); } // TMimeDirProfileHandler::getFilterIdentifierFieldIndex #endif // OBJECT_FILTERING // parses enum value for CONVMODE_MULTIMIX // [offs.](Bx|Lzzzzzzz) // aN returns the bit number or the offset of the zzzzz literal within aMixVal, depending on aIsBitMap static bool mixvalparse(cAppCharP aMixVal, uInt16 &aOffs, bool &aIsBitMap, uInt16 &aN) { aOffs = 0; cAppCharP p = aMixVal; // check offset (2 digit max) if (isdigit(*p)) { p+=StrToUShort(p,aOffs,2); if (*p++ != '.') return false; // wrong syntax } // check command if (*p == 'B') { // bit number aIsBitMap = true; if (StrToUShort(p+1,aN,2)<1) return false; // wrong syntax } else if (*p=='L') { // literal, return position within string aIsBitMap = false; aN = p+1-aMixVal; // literal starts at this position } else return false; // unknown command return true; } // mixvalparse // returns the size of the field block (how many fids in sequence) related // to a given convdef (for multi-field conversion modes such as CONVMODE_RRULE sInt16 TMimeDirProfileHandler::fieldBlockSize(const TConversionDef &aConvDef) { if ((aConvDef.convmode & CONVMODE_MASK)==CONVMODE_RRULE) return 6; // RRULE fieldblock: DTSTART,FREQ,INTERVAL,FIRSTMASK,LASTMASK,UNTIL = 6 fields else return 1; // single field } // TMimeDirProfileHandler::fieldBlockSize // special field translation (to be extended in derived classes) // Note: the string returned by this function will be scanned as a // value list if combinesep is set, and every single value will be // enum-translated if enums defined. bool TMimeDirProfileHandler::fieldToMIMEString( TMultiFieldItem &aItem, // the item where data comes from sInt16 aFid, // the field ID (can be NULL for special conversion modes) sInt16 aArrIndex, // the repeat offset to handle array fields const TConversionDef *aConvDefP, // the conversion definition record string &aString // output string ) { const int maxmix = 10; uInt16 mixOffs[maxmix]; bool mixIsFlags[maxmix]; TEnumerationDef *enumP; uInt16 offs; bool isFlags; int nummix, i; fieldinteger_t flags; uInt16 bitNo; TTimestampField *tsFldP; TIntegerField *ifP; TStringField *sfP; timecontext_t tctx; lineartime_t ts; string s; // RRULE field block values char freq; // frequency char freqmod; // frequency modifier sInt16 interval; // interval fieldinteger_t firstmask; // day mask counted from the first day of the period fieldinteger_t lastmask; // day mask counted from the last day of the period lineartime_t until; // last day timecontext_t untilcontext; // get pointer to leaf field TItemField *fldP = aItem.getArrayField(aFid,aArrIndex,true); // existing array elements only bool dateonly = false; // assume timestamp mode bool autodate = true; // show date-only values automatically as date-only, even if stored in a timestamp field bool extFmt = (aConvDefP->convmode & CONVMODE_FLAG_EXTFMT)!=0; bool milliSec = (aConvDefP->convmode & CONVMODE_FLAG_MILLISEC)!=0; sInt16 convmode = aConvDefP->convmode & CONVMODE_MASK; switch (convmode) { // no special mode case CONVMODE_NONE: case CONVMODE_EMPTYONLY: // just get field as string if (!fldP) return false; // no field, no value if (!fldP->isBasedOn(fty_timestamp)) goto normal; // Based on timestamp // - handle date-only specially if (fldP->getType()==fty_date) goto dateonly; // date-only else goto timestamp; // others are treated as timestamps // date & time modes case CONVMODE_DATE: // always show as date dateonly: dateonly = true; // render as date in all cases goto timestamp; case CONVMODE_AUTOENDDATE: case CONVMODE_AUTODATE: // show date-only as date in iCal 2.0 (mimo_standard), but always as timestamp for vCal 1.0 (mimo_old) if (fMimeDirMode==mimo_standard) goto timestamp; // use autodate if MIME-DIR format is not vCal 1.0 style // for vCal 1.0 style, always renders as timestamp (as date-only values are not allowed there) case CONVMODE_TIMESTAMP: // always show as timestamp // get explictly as timestamp (even if field or field contents is date) autodate = false; // do not show as date, even if it is a date-only timestamp: if (!fldP) return false; // no field, no value if (!fldP->isBasedOn(fty_timestamp)) goto normal; // show as timestamp tsFldP = static_cast(fldP); tctx = tsFldP->getTimeContext(); // check for auto-date if (autodate) { if (TCTX_IS_DATEONLY(tctx)) dateonly=true; } // check for special cases if (TCTX_IS_DURATION(tctx)) { // duration is shown as such tsFldP->getAsISO8601(aString, TCTX_UNKNOWN | TCTX_DURATION, false, false, extFmt, milliSec); } else if (dateonly) { // date-only are either floating or shown as date-only part of original timestamp tsFldP->getAsISO8601(aString, TCTX_UNKNOWN | TCTX_DATEONLY, false, false, extFmt, milliSec); } else if (fReceiverCanHandleUTC && !tsFldP->isFloating()) { // remote can handle UTC and the timestamp is not floating if (!TCTX_IS_UNKNOWN(fPropTZIDtctx)) { // if we have rendered a TZID for this property, this means that apparently the remote // supports TZID (otherwise the field would not be marked available in the devInf). // - show it as floating, explicitly with both date AND time (both flags set) tsFldP->getAsISO8601(aString, TCTX_UNKNOWN | TCTX_TIMEONLY | TCTX_DATEONLY, false, false, extFmt, milliSec); } else { // - show it as UTC tsFldP->getAsISO8601(aString, TCTX_UTC, true, false, extFmt, milliSec); } } else { // remote cannot handle UTC or time is floating (possibly dateonly or duration) if (tsFldP->isFloating()) { // floating, show as-is ts = tsFldP->getTimestampAs(TCTX_UNKNOWN); if (ts==noLinearTime) aString.erase(); else { if (TCTX_IS_DATEONLY(tctx)) { // value is a date-only, but we must render it a datetime ts=lineartime2dateonlyTime(ts); // make time part 0:00:00 } // first check for auto-end-date (which must be floating) // Note: we don't get here with a date only mimo_standard because it will be catched above, so test is not really needed if (convmode==CONVMODE_AUTOENDDATE && fVCal10EnddatesSameDay && TCTX_IS_DATEONLY(tctx) && fMimeDirMode==mimo_old) ts-=1; // subtract one unit to make end show last time unit of previous day // now show as floating ISO8601 TimestampToISO8601Str(aString, ts, TCTX_UNKNOWN, extFmt, milliSec); } } else { // not floating (=not a enddateonly), but we can't send UTC - render as localtime // in item time zone (which defaults to session time zone) tsFldP->getAsISO8601(aString, fItemTimeContext, false, false, extFmt, milliSec); } } return true; // found normal: // simply as string fldP->getAsString(aString); return true; // found case CONVMODE_TZ: case CONVMODE_TZID: case CONVMODE_DAYLIGHT: // use now as default point in time for possible offset calculations ts = getSession()->getSystemNowAs(TCTX_SYSTEM); // if no field is specified, the item context is used (which defaults to // the session's user context) // Note that testing fldP is not enough, because an empty array will also cause fldP==NULL if (!fldP) { if (aFid!=FID_NOT_SUPPORTED) return false; // field not available (but conversion definition DOES refer to a field --> no time zone) // conversion definition does not refer to a field: use item context tctx = fItemTimeContext; } else if (fldP->isBasedOn(fty_timestamp)) { // time zone of a timestamp tsFldP = static_cast(fldP); // - if floating time, we have no time zone if (tsFldP->isFloating() || tsFldP->isDuration()) return false; // floating or duration -> no time zone // - get context tctx = tsFldP->getTimeContext(); // get the context // - get the value ts = tsFldP->getTimestampAs(TCTX_UNKNOWN); // prevent generating TZID (and associated VTIMEZONES later) for empty timestamp if (ts==noLinearTime) return false; // no timestamp -> no time zone } else if (fldP->getCalcType()==fty_integer) { // integer field is simply a time zone offset in minutes tctx = TCTX_MINOFFSET(fldP->getAsInteger()); } else if (!fldP->isEmpty()) { // string field can be timezone name (internal or olson) or numeric minute offset fldP->getAsString(s); if (!TimeZoneNameToContext(s.c_str(),tctx,getSessionZones(), true)) { // if not recognized as time zone name, use integer value tctx = TCTX_MINOFFSET(fldP->getAsInteger()); } } else return false; // no TZ to show // if remote cannot handle UTC (i.e. only understands localtime), then make sure // the time zone shown is the general item zone (user zone). if (!fReceiverCanHandleUTC) { TzConvertTimestamp(ts,tctx,fItemTimeContext,getSessionZones()); tctx = fItemTimeContext; // use item zone } // now render context as selected if (convmode==CONVMODE_TZID) { // time zone ID for iCal 2.0 TZID parameter // - make sure meta context is resolved (we don't want "SYSTEM" as TZID!) if (!TzResolveMetaContext(tctx, getSessionZones())) return false; // cannot resolve, no time zone ID // - if time zone is not UTC (which is represented as "Z" and needs no TZID), show name if (!TCTX_IS_UTC(tctx) && !TCTX_IS_UNKNOWN(tctx) && !TCTX_IS_DATEONLY(tctx)) { // - show name of zone as TZID if (!TimeZoneContextToName(tctx, aString, getSessionZones(), fProfileCfgP->fTzIdGenMode==tzidgen_olson ? "o" : NULL)) return false; // cannot get name/ID // - flag property-level TZID generated now fPropTZIDtctx=tctx; // - add to set of TZID-referenced time zones (for vTimezone generation) fUsedTCtxSet.insert(fUsedTCtxSet.end(),tctx); // - update range of time covered for generating VTIMEZONE later if (ts) { if (fEarliestTZDate==noLinearTime || fEarliestTZDate>ts) fEarliestTZDate = ts; // new minimum if (fLatestTZDate==noLinearTime || fLatestTZDategetAsString(s); aString.erase(); if (strucmp(s.c_str(),"mailto:",7)!=0 && s.size()>0) aString="mailto:"; aString+=s; return true; case CONVMODE_VALUETYPE: case CONVMODE_FULLVALUETYPE: // specify value type of field if needed if (!fldP) return false; // no field -> no VALUE param if (fldP->isBasedOn(fty_timestamp)) { // show VALUE=DATE if we have date-only or time-only tctx = static_cast(fldP)->getTimeContext(); if (TCTX_IS_DURATION(tctx)) aString="DURATION"; else if (TCTX_IS_DATEONLY(tctx)) aString="DATE"; else if (TCTX_IS_TIMEONLY(tctx)) aString="TIME"; else { // only show type if full value type requested if (convmode==CONVMODE_FULLVALUETYPE) aString="DATE-TIME"; else return false; // we don't need a VALUE param for normal datetimes } } else return false; // no field type that needs VALUE param // valuetype generated return true; case CONVMODE_VERSION: // version string aString=aItem.getItemType()->getTypeVers(fProfileMode); return true; case CONVMODE_PRODID: // PRODID ISO9070 non-registered FPI // -//ABC Corporation//NONSGML My Product//EN aString = SYSYNC_FPI; return true; case CONVMODE_BITMAP: // bitmap is a special case of multimix, set up params nummix = 1; mixOffs[0]=0; mixIsFlags[0]=true; goto genmix; case CONVMODE_MULTIMIX: // list of special values that can be either literals or bit masks, and can optionally affect more than one field // Syntax: // Bx : Bit number x (like in CONVMODE_BITMAP, x = 0..63) // Lxxxx : Literal xxxxx (xxxxx will just be copied from the source field) // y.Bx or y.Lxxxx : use y as field offset to use (no y means 0 offset) // - collect parameters to generate mix from enums nummix = 0; enumP = aConvDefP->enumdefs; while(enumP) { if (mixvalparse(TCFG_CSTR(enumP->enumval),offs,isFlags,bitNo)) { // check if this field is in list already for (i=0; i=maxmix) break; // no more mixes allowed, stop scanning } next: // check next enum enumP=enumP->next; } genmix: // now generate strings from collected data aString.erase(); for (i=0; igetAsInteger(); bitNo=0; while (flags) { if (flags & 1) { // create bit representation if (!aString.empty() && aConvDefP->combineSep) aString+=aConvDefP->combineSep; // separator first if not first item if (convmode==CONVMODE_MULTIMIX) { // multimix mode, use full syntax if (mixOffs[i]>0) StringObjAppendPrintf(aString,"%d.",mixOffs[i]); aString += 'B'; } // add bit number StringObjAppendPrintf(aString,"%hd",bitNo); } flags >>= 1; // consume this one bitNo++; } } else { // literal if (!fldP->isEmpty()) { if (!aString.empty() && aConvDefP->combineSep) aString+=aConvDefP->combineSep; // append separator if there are more flags if (mixOffs[i]>0) StringObjAppendPrintf(aString,"%d.",mixOffs[i]); aString += 'L'; // literal fldP->appendToString(aString); } } } // field available } // for each mix return true; case CONVMODE_RRULE: { // get values from field block if (aFid<0) return false; // no field, no string // - freq/freqmod if (!(sfP = ITEMFIELD_DYNAMIC_CAST_PTR(TStringField,fty_string,aItem.getArrayField(aFid,aArrIndex,true)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice sfP->getAsString(s); freq='0'; // none freqmod=' '; // no modifier if (s.size()>0) freq=s[0]; if (s.size()>1) freqmod=s[1]; // - interval if (!(ifP = ITEMFIELD_DYNAMIC_CAST_PTR(TIntegerField,fty_integer,aItem.getArrayField(aFid,aArrIndex,true)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice interval=(sInt16)ifP->getAsInteger(); // - firstmask if (!(ifP = ITEMFIELD_DYNAMIC_CAST_PTR(TIntegerField,fty_integer,aItem.getArrayField(aFid,aArrIndex,true)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice firstmask=ifP->getAsInteger(); // - lastmask if (!(ifP = ITEMFIELD_DYNAMIC_CAST_PTR(TIntegerField,fty_integer,aItem.getArrayField(aFid,aArrIndex,true)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice lastmask=ifP->getAsInteger(); // - until if (!(tsFldP = ITEMFIELD_DYNAMIC_CAST_PTR(TTimestampField,fty_timestamp,aItem.getArrayField(aFid,aArrIndex,true)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice // Until // - UTC preferred as output format if basically possible and not actively disabled untilcontext= fReceiverCanHandleUTC && getSession()->canHandleUTC() ? TCTX_UTC : fItemTimeContext; // - get in preferred zone (or floating) until=tsFldP->getTimestampAs(untilcontext,&untilcontext); lineartime_t tzend = until; // A RRULE with no end extends at least into current time (for tz range update, see below) if (until==noLinearTime) { // no end, but we still need a range to generate time zones for tzend = getSession()->getSystemNowAs(TCTX_UTC); } else { // Treat RR_END similar to CONVMODE_AUTODATE, i.e. prevent rendering a date-only value in mimo_old (which is not correct according to the standard) if (TCTX_IS_DATEONLY(untilcontext) && fMimeDirMode==mimo_old) { // there are no date-only recurrence ends in vCalendar 1.0 until = lineartime2dateonlyTime(until)+secondToLinearTimeFactor*SecsPerHour*24-1 ; // make time part 23:59:59.999 of this day untilcontext &= ~TCTX_DATEONLY; // clear dateonly rendering flag } } // Now do the conversion bool ok; if (fMimeDirMode==mimo_old) { // vCalendar 1.0 type RRULE ok = internalToRRULE1( aString, freq, freqmod, interval, firstmask, lastmask, until, untilcontext, GETDBGLOGGER ); } else { // iCalendar 2.0 type RRULE ok = internalToRRULE2( aString, freq, freqmod, interval, firstmask, lastmask, until, untilcontext, GETDBGLOGGER ); } // if we actually generated a RRULE, the range of used time zones must be updated according // to the recurrence end (date or open end, see tzend calculation above) if (!aString.empty()) { if (fEarliestTZDate==noLinearTime || tzendfLatestTZDate) fLatestTZDate = tzend; } return ok; break; // just in case } default: // unknown mode, no value return false; } return false; } // TMimeDirProfileHandler::fieldToMIMEString /// @brief test if char is part of a line end /// @return true if aChar is a line end char /// @param [in] aChar charcter to check static bool isLineEndChar(appChar aChar) { return (aChar=='\x0D') || (aChar=='\x0A'); } // isLineEndChar /// @brief test if char is end of a line or end of the text (NUL) /// @return true if aChar is a line end char or NUL /// @param [in] aChar charcter to check static bool isEndOfLineOrText(appChar aChar) { return (aChar==0) || isLineEndChar(aChar); } // isEndOfLineOrText /// @brief test if a line end of any kind is at aText /// @note CR,LF,CRLF and CR...CRLF sequences are all considered one line end /// @return true if line end found /// @param [in/out] aText advance past line end sequence static bool testAndSkipLineEnd(cAppCharP &aText) { cAppCharP p = aText; bool crFound = false; // skip sequence of CRs while (*p=='\x0D') { p++; crFound = true; } // past all CRs in a row if (*p=='\x0A') { // independent of the number of CRs preceeding, this is a line end including the LF aText = p+1; // past LF return true; } else if (crFound) { // we previously found at least one CR at the beginning, but no LF is following // -> assume CR only line ends, consider first CR as a line end by itself aText++; // skip first CR return true; } // not a line end return false; } // testAndSkipLineEnd // return incremented pointer pointing to original char or next non-folded char static cAppCharP skipfolded(cAppCharP aText, TMimeDirMode aMimeMode, bool qpSoftBreakCancel=false) { cAppCharP p = aText; if (testAndSkipLineEnd(p)) { // check for folding sequence if (*p==' ' || *p=='\x09') { // line end followed by space: folding sequence if (aMimeMode==mimo_standard) { // ignore entire sequence (CR,LF,SPACE/TAB) return p+1; } else { // old folding type, LWSP must be preserved return p; } } } else if (qpSoftBreakCancel && *p=='=') { // could be soft break sequence, check for line end p++; if (testAndSkipLineEnd(p)) { return p; } } // not folding sequence, return ptr to char as is return aText; } // skipfolded // get next character, while skipping MIME-DIR folding sequences // if qpSoftBreakCancel, QUOTED-PRINTABLE encoding style soft-line-break sequences // will be eliminated static const char *nextunfolded(const char *p, TMimeDirMode aMimeMode, bool qpSoftBreakCancel=false) { if (*p==0) return p; // at end of string, do not advance p++; // point to next return skipfolded(p,aMimeMode,qpSoftBreakCancel); } // nextunfolded // helper for MIME DIR parsing: // - apply encoding and charset conversion to values part of property if needed static void decodeValue( TEncodingTypes aEncoding, // the encoding to be used TCharSets aCharset, // charset to be applied to 8-bit chars TMimeDirMode aMimeMode, // the MIME mode char aStructSep, // input is structured value, stop when aStructSep is encountered char aAltSep, // alternate separator, also stop when encountering this one (but only if aStructSep is !=0) const char *&aText, // where to start decoding, updated past last char added to aVal string &aVal // decoded data is stored here (possibly some binary data) ) { const int maxseqlen=6; int seqlen; char c,chrs[maxseqlen]; const char *p,*q; aVal.erase(); bool escaped = false; bool lastWasQPCR = false; if (aEncoding==enc_quoted_printable) { // decode quoted-printable content p = skipfolded(aText,aMimeMode,true); // get unfolded start point (in case value starts with folding sequence) do { // decode standard content c=*p; if (isEndOfLineOrText(c) || (!escaped && aStructSep!=0 && (c==aStructSep || c==aAltSep))) break; // EOLN and struct separators terminate value // test if escape char (but do not filter it out, as actual de-escaping is done in parseValue() later escaped=(!escaped) && (c=='\\'); // escape next only if we are not escaped already // char found if (c=='=') { uInt16 code; const char *s; char hex[2]; s=nextunfolded(p,aMimeMode,true); if (*s==0) break; // end of string hex[0]=*s; // first digit s=nextunfolded(s,aMimeMode,true); if (*s==0) break; // end of string hex[1]=*s; // second digit if (HexStrToUShort(hex,code,2)==2) { p=s; // continue with next char after second digit c=code; // decoded char if (c=='\x0D') { c='\n'; // convert to newline lastWasQPCR = true; // remember } else if (c=='\x0A') { if (lastWasQPCR) { // if last was CR, ignore LF (CR already has generated a newline) p = nextunfolded(p,aMimeMode,true); // but skip it for now. lastWasQPCR = false; continue; // ignore LF } // LF not preceeded by CR is a newline c='\n'; // convert to newline } else { // neither CR nor LF lastWasQPCR = false; } } } else { lastWasQPCR = false; } seqlen=1; // assume logical char consists of single byte chrs[0]=c; do { seqlen=appendCharsAsUTF8(chrs,aVal,aCharset,seqlen); // add char (possibly with UTF8 expansion) to aVal if (seqlen<=1) break; // done // need more bytes to encode entire char for (int i=1;i this appears to be the end of the property // Now for ill-encoded vCard 2.1 which chop B64 into lines, but do not prefix continuation // lines with some whitespace, make sure the next line contains a colon // - skip that line end while (isLineEndChar(*r)) r++; // - examine next line bool eob64 = false; for (cAppCharP r2=r; *r2 && !isLineEndChar(*r2); r2++) { if (*r2==':' || *r2==';') { eob64 = true; break; } } if (eob64) break; // q is end of B64 string -> go decode it // there's more to the b64 string at r, continue looking for end } // skip to continuation of B64 string q=r; } else q++; } // - decode base 64 uInt32 binsz=0; uInt8 *binP = b64::decode(p, q-p, &binsz); aVal.append((const char *)binP,binsz); b64::free(binP); // - continue at next char after b64 value p=q; } else { // no (known) encoding p = skipfolded(aText,aMimeMode,false); // get unfolded start point (in case value starts with folding sequence) do { c=*p; if (isEndOfLineOrText(c) || (!escaped && aStructSep!=0 && (c==aStructSep || c==aAltSep))) break; // EOLN and structure-sep (usually ;) terminate value // test if escape char (but do not filter it out, as actual de-escaping is done in parseValue() later escaped=(!escaped) && (c=='\\'); // escape next only if we are not escaped already // process char seqlen=1; // assume logical char consists of single byte chrs[0]=c; do { seqlen=appendCharsAsUTF8(chrs,aVal,aCharset,seqlen); // add char (possibly with UTF8 expansion) to aVal if (seqlen<=1) break; // done // need more bytes to encode entire char for (int i=1;i=MIME_MAXLINESIZE && *proptext) || explf) { // avoid unnecessary folding (there must be something more coming) // folding needed (line gets longer than MIME_MAXLINESIZE or '\n' found in input string) if (aMimeMode==mimo_old && !explf) { // vCard 2.1 type folding, must occur before an LWSP if (foldLoc<0) { // emergency force fold and accept data being shredded // - copy all we have by now aString.append(firstunwritten,n); firstunwritten += n; // now pointing to next n = 0; // none left - new line is empty now // - insert line break aString.append("\x0D\x0A "); // line break AND an extra shredding space } else { // - copy all up to (but not including) last LWSP (or '\b' break indicator) aString.append(firstunwritten,foldLoc); firstunwritten += foldLoc; // now pointing to LWSP (or non-LWSP in case of '\b') n -= foldLoc; // number of chars left (including LWSP) // - insert line break aString.append("\x0D\x0A"); // line break if (*firstunwritten!=' ' && *firstunwritten!=0x09) aString += ' '; // breaking at location indicated by '\b', LWSP must be added // - copy rest scanned so far (except in '\b' case, this begins with an LWSP) aString.append(firstunwritten,n); } } else { // MIME-DIR type folding, can occur anywhere and *adds* a LWSP (which is removed at unfolding later) // or mimo-old type folding containing explicit CR(LF)s -> break here if (explf) { // explicit \n or \r is not copied, but only causes line break to occur n--; } if (foldLoc<0 || explf) { // no or explf indicator, just fold here aString.append(firstunwritten,n); n = 0; // nothing left to carry over - new line is empty now } else { // we have a preferred folding location detected before: copy all up to (but not including) break indicator aString.append(firstunwritten,foldLoc); firstunwritten += foldLoc; // now pointing to next char after break) n -= foldLoc; // number of chars left (including LWSP) } // now fold aString.append("\x0D\x0A"); // line break if ( (c!='\r' && aMimeMode==mimo_standard) || // folding indicator and MIME-DIR -> folding always must insert extra space (c=='\r' && !aDoSoftBreak) // soft-break indicator, but not in softbreak mode (i.e. B64 input) -> always insert extra space ) aString += ' '; // not only soft line break, but MIMD-DIR type folding // - copy carry over from previous line if (n>0) aString.append(firstunwritten,n); } // we are on a new line now llen = n; // new line has this size of what was carried over from the previous line foldLoc = -1; n = 0; firstunwritten = proptext; } } // append rest aString.append(firstunwritten,n); // terminate property aString.append("\x0D\x0A"); // CRLF } // finalizeProperty // results for generateValue: #define GENVALUE_NOTSUPPORTED 0 // field not supported #define GENVALUE_EXHAUSTED 1 // array field exhausted #define GENVALUE_EMPTYELEMENT 2 // array field empty #define GENVALUE_EMPTY 3 // non-array field empty #define GENVALUE_ELEMENT 4 // non-empty array element #define GENVALUE_NONEMPTY 5 // non-empty non-array value // helper for generateMimeDir() // - generate parameter or property value(list), // returns: GENVALUE_xxx sInt16 TMimeDirProfileHandler::generateValue( TMultiFieldItem &aItem, // the item where data comes from const TConversionDef *aConvDefP, sInt16 aBaseOffset, // basic fid offset to use sInt16 aRepOffset, // repeat offset, adds to aBaseOffset for non-array fields, is array index for array fields string &aString, // where value is ADDED char aSeparator, // separator to be used between values if field contains multiple values in a list separated by confdef->combineSep TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) bool aParamValue, // set if generating parameter value (different escaping rules, i.e. colon must be escaped, or entire value double-quoted) bool aStructured, // set if value consists of multiple values (needs semicolon content escaping) bool aCommaEscape, // set if "," content escaping is needed (for values in valuelists like TYPE=TEL,WORK etc.) TEncodingTypes &aEncoding, // modified if special value encoding is required bool &aNonASCII, // set if any non standard 7bit ASCII-char is contained char aFirstChar, // will be appended before value if there is any value (and in MIME-DIR '\b' optional break indicator is appended as well) sInt32 &aNumNonSpcs, // how many non-spaces are already in the value bool aFoldAtSeparators, // if true, even in mimo_old folding may appear at value separators (adding an extra space - which is ok for EXDATE and similar) bool aEscapeOnlyLF // if true, only linefeeds are escaped as \n, but nothing else (not even \ itself) ) { string vallist; // as received from fieldToMIMEString() string val; // single value string outval; // entire value (list) escaped char c; // determine field ID bool isarray = false; // no array by default sInt16 fid=aConvDefP->fieldid; if (fid>=0) { // field has storage // - fid is always offset by baseoffset fid += aBaseOffset; // - adjust now isarray = aItem.adjustFidAndIndex(fid,aRepOffset); // generate only if available in both source and target (or non-SyncML context) if (isFieldAvailable(aItem,fid)) { // find out if value exists if (aItem.isAssigned(fid)) { // - field has a value assigned (altough this might be empty string) // determine max size to truncate value if needed outval.erase(); sInt32 valsiz=0; // net size of value //%%%% getTargetItemType??? sInt32 maxSiz=aItem.getTargetItemType()->getFieldOptions(fid)->maxsize; if (maxSiz==FIELD_OPT_MAXSIZE_UNKNOWN || maxSiz==FIELD_OPT_MAXSIZE_NONE) maxSiz = 0; // no size restriction bool noTruncate=aItem.getTargetItemType()->getFieldOptions(fid)->notruncate; // check for BLOB values sInt16 convmode = aConvDefP->convmode & CONVMODE_MASK; if (convmode==CONVMODE_BLOB_B64 || convmode==CONVMODE_BLOB_AUTO) { // no value lists, escaping, enums. Simply set value and encoding TItemField *fldP = aItem.getArrayField(fid,aRepOffset,true); // existing array elements only if (!fldP) return GENVALUE_EXHAUSTED; // no leaf field - must be exhausted array (fldP==NULL is not possible here for non-arrays) if (fldP->isUnassigned()) return GENVALUE_EMPTYELEMENT; // must be empty element empty element, but field supported (fldP==NULL is not possible here for non-arrays) // check max size and truncate if needed if (maxSiz && sInt32(fldP->getStringSize())>maxSiz) { if (noTruncate || getSession()->getSyncMLVersion() omit", (long)maxSiz)); return GENVALUE_NOTSUPPORTED; // treat it as if field was not supported locally } } // append to existing string fldP->appendToString(outval,maxSiz); if (convmode==CONVMODE_BLOB_AUTO) { // auto mode: use B64 encoding only if non-printable or // non-ASCII characters are in the value size_t len = outval.size(); for (size_t i = 0; i < len; i++) { char c = outval[i]; if (!isascii(c) || !isprint(c)) { aEncoding=enc_base64; break; } } } else { // blob mode: always use B64 aEncoding=enc_base64; } // only ASCII in value: either because it contains only // those to start with or because they will be encoded aNonASCII=false; } else { // apply custom field(s)-to-string translation if needed if (!fieldToMIMEString(aItem,fid,aRepOffset,aConvDefP,vallist)) { // check if no value because array was exhausted if (aItem.getArrayField(fid,aRepOffset,true)) return isarray ? GENVALUE_EMPTYELEMENT : GENVALUE_EMPTY; // no value (but field supported) else return GENVALUE_EXHAUSTED; // no leaf field - must be exhausted array } // separate value list into multiple values if needed const char *lp = vallist.c_str(); // list item pointer const char *sp; // start of item pointer (helper) sInt32 n; while (*lp!=0) { // find (single) input value string's end for (sp=lp,n=0; (c=*lp)!=0; lp++, n++) { if (c==aConvDefP->combineSep) break; } // - n=size of input value, p=ptr to end of value (0 or sep) val.assign(sp,n); // perform enum translation if needed if (aConvDefP->enumdefs) { const TEnumerationDef *enumP = aConvDefP->findEnumByVal(val.c_str()); if (enumP) { PDEBUGPRINTFX(DBG_GEN+DBG_EXOTIC,("Val='%s' translated to enumName='%s' mode=%s", val.c_str(), TCFG_CSTR(enumP->enumtext), EnumModeNames[enumP->enummode])); if (enumP->enummode==enm_ignore) val.erase(); // ignore -> make value empty as empty values are never stored else if (enumP->enummode==enm_prefix) { // replace value prefix by text prefix n=TCFG_SIZE(enumP->enumval); val.replace(0,n,TCFG_CSTR(enumP->enumtext)); // replace val prefix by text prefix } else { // simply use translated value val=enumP->enumtext; } } else { PDEBUGPRINTFX(DBG_GEN+DBG_EXOTIC,("No translation found for Val='%s'", val.c_str())); } } // - val is now translated enum (or original value if value does not match any enum text) valsiz+=val.size(); // We have two choices for parameter values: // - quoted string in double quotes // - a simple string without // // Line breaks and control characters are not supported // either way; the backslash escape mechanism is not used // unless explicitly specified otherwise for specific // parameters (like TYPE). // // We pick the simple string option only if the value // contains only alphanumeric characters plus hyphen and // underscore. Spaces are allowed by the RFC, but are // known to cause issues in other parsers (EDS before // 3.10) unless used in a quoted string, therefore we // are more conservative than the RFC. bool quotedstring = false; if (aParamValue) { for (const char *p=val.c_str();(c=*p)!=0;p++) { if (!(isalnum(c) || c == '-' || c == '_')) { quotedstring = true; outval+='"'; break; } } } // perform escaping and determine need for encoding bool spaceonly = true; for (const char *p=val.c_str();(c=*p)!=0 && (c!=aConvDefP->combineSep);p++) { // process char // - check for whitespace if (!isspace(c)) { spaceonly = false; // does not consist of whitespace only aNumNonSpcs++; // count consecutive non-spaces if (aMimeMode==mimo_old && aEncoding==enc_none && aNumNonSpcs>MIME_MAXLINESIZE) { // If text contains words with critical (probably unfoldable) size in mimo-old, select quoted printable encoding aEncoding=enc_quoted_printable; } } else { aNumNonSpcs = 0; // new word starts } // only text must be fully escaped, turn escaping off for RRULE (RECUR type) // escape reserved chars switch (c) { case '"': if (aParamValue) { c = '\''; goto add_char; } // replace double quotes with single quotes goto add_char; // otherwise, just add case ',': // in MIME-DIR, always escape commas, in pre-MIME-DIR only if usage in value list requires it if ((!aCommaEscape && aMimeMode==mimo_old) || quotedstring) goto add_char; goto do_escape; case ':': // always escape colon in parameters if (!aParamValue || quotedstring) goto add_char; goto do_escape; case '\\': if (quotedstring) goto add_char; // Backslash must always be escaped // - for MIMO-old: at least Nokia 9210 does it this way // - for MIME-DIR: specified in the standard goto do_escape; case ';': // in MIME-DIR, always escape semicolons, in pre-MIME-DIR only in parameters and structured values if ((!aParamValue && !aStructured && aMimeMode==mimo_old) || quotedstring) goto add_char; do_escape: if (!aEscapeOnlyLF) { // escape chars with backslash outval+='\\'; } goto out_char; case '\r': // ignore returns break; case '\n': if (quotedstring) { c = ' '; goto add_char; } // quote linefeeds if (aMimeMode==mimo_old) { if (aEncoding==enc_none) { // For line ends in mimo_old: select quoted printable encoding aEncoding=enc_quoted_printable; } // just pass it, will be encoded later goto add_char; } else { // MIME-DIR: use quoted C-style notation outval.append("\\n"); } break; default: add_char: // prevent adding space-only for params if (spaceonly && aParamValue) break; // just check next out_char: // check for non ASCII and set flag if found if ((uInt8)c > 0x7F) aNonASCII=true; // just copy to output outval+=c; break; } } // for all chars in val item // terminate quoted string parameter value if (quotedstring) { outval+='"'; } // go to next item in the val list (if any) if (*lp!=0) { // more items in the list // - add separator if previous one is not empty param value if (!(spaceonly && aParamValue)) { if (aMimeMode==mimo_standard || aFoldAtSeparators) { outval+='\b'; // preferred break location (or location where extra space is allowed for mimo_old) aNumNonSpcs=0; // we can fold here, so word is broken } outval+=aSeparator; aNumNonSpcs++; // count it (assuming separator is never a space!) valsiz++; // count it as part of the value } lp++; // skip input list separator } // check for truncation needs (do not truncate parameters, ever) if (maxSiz && valsiz>maxSiz && !aParamValue) { // size exceeded if (noTruncate) { // truncate not allowed PDEBUGPRINTFX(DBG_ERROR+DBG_GEN,( "Value '%" FMT_LENGTH(".40") "s' exceeds %ld chars net length but is noTruncate -> omit", FMT_LENGTH_LIMITED(40,outval.c_str()), (long)maxSiz )); // treat it as if field was not supported locally return GENVALUE_NOTSUPPORTED; } else { // truncate allowed, shorten output accordingly outval.erase(outval.size()-(valsiz-maxSiz)); PDEBUGPRINTFX(DBG_GEN,( "Truncated value '%" FMT_LENGTH(".40") "s' to %ld chars net length (maxSize)", FMT_LENGTH_LIMITED(40,outval.c_str()), (long)maxSiz )); // do not add more chars break; } } } // while value chars available } // not BLOB conversion // value generated in outval (altough it might be an empty string) } // if field assigned else { // not assigned. However a not assigned array means an array with no elements, which // is the same as an exhausted array return isarray ? GENVALUE_EXHAUSTED : GENVALUE_NOTSUPPORTED; // array is exhaused, non-array unassigned means not available } } // source and target both support the field (or field belongs to mandatory property) else return GENVALUE_NOTSUPPORTED; // field not supported by either source or target (and not mandatory) -> do not generate value } // if fieldid exists else { // could be special conversion using no data or data from // internal object variables (such as VERSION value) if (fieldToMIMEString(aItem,FID_NOT_SUPPORTED,0,aConvDefP,vallist)) { // got some output, use it as value outval=vallist; } else // no value, no output return GENVALUE_NOTSUPPORTED; // field not supported } // now we have a value in outval, check if encoding needs to be applied // - check if we should select QUOTED-PRINTABLE because of nonASCII if (aNonASCII && fDoQuote8BitContent && aEncoding==enc_none) aEncoding=enc_quoted_printable; // just append if (!outval.empty() && aFirstChar!=0) { if (aMimeMode==mimo_standard || aFoldAtSeparators) { aString+='\b'; // preferred break location (or location where extra space is allowed for mimo_old) aNumNonSpcs = 0; // we can break here, new word starts } aString+=aFirstChar; // we have a value, add sep char first aNumNonSpcs++; // count it (assuming separator is never a space!) } aString.append(outval); // done return outval.empty() ? (isarray ? GENVALUE_EMPTYELEMENT : GENVALUE_EMPTY) // empty : (isarray ? GENVALUE_ELEMENT : GENVALUE_NONEMPTY); // non empty } // TMimeDirProfileHandler::generateValue // generate parameters for one property instance // - returns true if parameters with shownonempty=true were generated bool TMimeDirProfileHandler::generateParams( TMultiFieldItem &aItem, // the item where data comes from string &aString, // the string to add parameters to const TPropertyDefinition *aPropP, // the property to generate (all instances) TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) sInt16 aBaseOffset, sInt16 aRepOffset, TPropNameExtension *aPropNameExt, // propname extension for generating musthave param values sInt32 &aNumNonSpcs // number of consecutive non-spaces, accumulated so far ) { const TParameterDefinition *paramP; bool paramstarted; char sep=0; // separator for value lists bool nonasc=false; TEncodingTypes encoding; string paramstr; bool showalways=false; // Generate parameters // Note: altough positional values are always the same, non-positional values // can vary from repetition to repetition and can be mixed with the // positional values. So we must generate the mixture again for // every repetition. // - check all parameters for musthave values paramP = aPropP->parameterDefs; while (paramP) { // parameter not started yet paramstarted=false; // process param only if matching mode and active rules if (mimeModeMatch(paramP->modeDependency) #ifndef NO_REMOTE_RULES && (!paramP->ruleDependency || isActiveRule(paramP->ruleDependency)) #endif ) { // first append extendsname param values if (paramP->extendsname && aPropNameExt) { const TEnumerationDef *enumP = paramP->convdef.enumdefs; while (enumP) { if (enumP->nameextid>=0) { // value is relevant for name extension, check if required for this param if ((((TNameExtIDMap)1<nameextid) & (aPropNameExt->musthave_ids | aPropNameExt->addtlSend_ids))!=0) { // found param value which is required or flagged to be sent additionally as name extension if (!paramstarted) { paramstarted=true; aString+=';'; // param always starts with ; if (paramP->defaultparam && (aMimeMode==mimo_old)) { // default param, values are written like a list of params sep=';'; // separator, in case other values follow } else { // normal parameter, first add param separator and name // - lead-in aString.append(paramP->paramname); aString+='='; // - separator, in case other values follow sep=','; // value list separator is comma by default } } else { // add separator for one more value aString+=sep; } // add value aString.append(enumP->enumtext); } // if enum value is a "must have" value for name extension } // if enum value is relevant to name extension // next enum value enumP=enumP->next; } // while enum values } // if extendsname // append value(s) if there is an associated field paramstr.erase(); // none to start with if (paramP->convdef.fieldid!=FID_NOT_SUPPORTED) { if (!paramstarted) { // Note: paramstarted must not be set here, as empty value might prevent param from being written // parameter starts with ";" paramstr+=';'; if (paramP->defaultparam && (aMimeMode==mimo_old)) { // default param, values are written like a list of params sep=';'; } else { // normal parameter, first add name paramstr.append(paramP->paramname); paramstr+='='; sep=','; // value list separator is comma by default } } else { // already started values, just add more // - next value starts with a separator paramstr+=sep; } // add parameter value(list) encoding=enc_none; // parameters are not encoded // NOTE: only non-empty parameters are generated // NOTE: parameters themselves cannot have a value list that is stored in an array, // but parameters of repeating properties can be stored in array elements (using the // same index as for the property itself) // Note: Escape commas if separator is a comma sInt32 numNoSpcs = aNumNonSpcs; if (generateValue(aItem,&(paramP->convdef),aBaseOffset,aRepOffset,paramstr,sep,aMimeMode,true,false,sep==',',encoding,nonasc,0,numNoSpcs,false,false)>=GENVALUE_ELEMENT) { // value generated, add parameter name/value (or separator/value for already started params) aString.append(paramstr); aNumNonSpcs = numNoSpcs; // actually added, count now paramstarted=true; // started only if we really have appended something at all } } // if field defined for this param // update show status if (paramP->shownonempty && paramstarted) showalways=true; // param has a value and must make property show } // next param paramP=paramP->next; } // while params return showalways; } // TMimeDirProfileHandler::generateParams // generateProperty return codes: #define GENPROP_EXHAUSTED 0 // nothing generated because data source exhausted (or field not supported) #define GENPROP_EMPTY 1 // nothing generated because empty value (but field supported) #define GENPROP_NONEMPTY 2 // something generated // helper for generateMimeDir(), expansion of property according to nameExts void TMimeDirProfileHandler::expandProperty( TMultiFieldItem &aItem, // the item where data comes from string &aString, // the string to add properties to const char *aPrefix, // the prefix (property name) const TPropertyDefinition *aPropP, // the property to generate (all instances) TMimeDirMode aMimeMode // MIME mode (older or newer vXXX format compatibility) ) { // scan nameExts to generate name-extended variants and repetitions TPropNameExtension *propnameextP = aPropP->nameExts; if (!propnameextP) { // no name extensions -> this is a non-repeating property // just generate once, even if empty (except if it has suppressempty set) generateProperty( aItem, // the item where data comes from aString, // the string to add properties to aPrefix, // the prefix (property name) aPropP, // the property to generate 0, // field ID offset to be used 0, // additional repeat offset / array index aMimeMode, // MIME mode (older or newer vXXX format compatibility) false // if set, a property with only empty values will never be generated ); } else { // scan name extensions sInt16 generated=0; sInt16 maxOccur=0; // default to no limit while (propnameextP) { sInt16 baseoffs=propnameextP->fieldidoffs; sInt16 repoffs=0; // no repeat offset yet if (baseoffs!=OFFS_NOSTORE && !propnameextP->readOnly) { // we can address fields for this property and it's not readonly (parsing variant) // generate value part sInt16 n=propnameextP->maxRepeat; // check for value list if (aPropP->valuelist && !aPropP->expandlist) { // property contains a value list -> all repetitions are shown within ONE property instance // NOTE: generateProperty will exhaust possible repeats generateProperty( aItem, // the item where data comes from aString, // the string to add properties to aPrefix, // the prefix (property name) aPropP, // the property to generate baseoffs, // field ID offset to be used repoffs, // additional repeat offset / array index aMimeMode, // MIME mode (older or newer vXXX format compatibility) propnameextP->minShow<1, // suppress if fewer to show than 1 (that is, like suppressempty in this case) propnameextP // propname extension for generating musthave param values and maxrep/repinc for valuelists ); } else { // now generate separate properties for all repetitions // Note: strategy is to keep order as much as possible (completely if // minShow is >= maxRepeat sInt16 emptyRepOffs=-1; // get occurrence limit as provided by remote for (sInt16 i=0; inumValues; i++) { sInt16 fid=aPropP->convdefs[0].fieldid; if (fid>=0) { if (fRelatedDatastoreP) { // only if datastore is related we are in SyncML context, otherwise we should not check maxOccur maxOccur = aItem.getItemType()->getFieldOptions(fid)->maxoccur; } else maxOccur = 0; // no limit // Note: all value fields of the property will have the same maxOccur, so we can stop here break; } } do { // generate property for this repetition // - no repeating within generateProperty takes place! sInt16 genres = generateProperty( aItem, // the item where data comes from aString, // the string to add properties to aPrefix, // the prefix (property name) aPropP, // the property to generate baseoffs, // field ID offset to be used repoffs, // additional repeat offset / array index aMimeMode, // MIME mode (older or newer vXXX format compatibility) propnameextP->minShow-generatedmaxRepeat==REP_ARRAY && genres==GENPROP_EXHAUSTED) break; // exit loop if any only if array exhausted } // one more generated of the maximum possible (note: REP_ARRAY=32k, so this will not limit an array) n--; repoffs+=propnameextP->repeatInc; // end generation if remote's maxOccur limit is reached if (maxOccur && generated>=maxOccur) { PDEBUGPRINTFX(DBG_GEN,( "maxOccur (%hd) for Property '%s' reached - no more instances will be generated", maxOccur, TCFG_CSTR(aPropP->propname) )); break; } } while(n>0); // add empty ones if needed while (generatedminShow && emptyRepOffs>=0 && !(maxOccur && generated>=maxOccur)) { // generate empty ones (no suppression) generateProperty(aItem,aString,aPrefix,aPropP,baseoffs,emptyRepOffs,aMimeMode,false); generated++; // count as generated anyway (even in case generation of empty is globally turned off) } } // repeat properties when we have repeating enabled } // if name extension is stored propnameextP=propnameextP->next; // stop if maxOccur reached if (maxOccur && generated>=maxOccur) break; } // while nameexts } // if nameexts at all } // TMimeDirProfileHandler::expandProperty // helper for expandProperty: generates property // returns: GENPROP_xxx sInt16 TMimeDirProfileHandler::generateProperty( TMultiFieldItem &aItem, // the item where data comes from string &aString, // the string to add properties to const char *aPrefix, // the prefix (property name) const TPropertyDefinition *aPropP, // the property to generate (all instances) sInt16 aBaseOffset, // field ID offset to be used sInt16 aRepeatOffset, // additional repeat offset / array index TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) bool aSuppressEmpty, // if set, a property with only empty values will not be generated TPropNameExtension *aPropNameExt // propname extension for generating musthave param values and maxrep/repinc for valuelists ) { string proptext; // unfolded property text proptext.reserve(300); // not too small string elemtext; // single element (value or param) text TEncodingTypes encoding; bool nonasc=false; // - reset TZID presence flag fPropTZIDtctx = TCTX_UNKNOWN; // - start with empty text proptext.erase(); // - init flags bool anyvaluessupported = false; // at least one of the main values must be supported by the remote in order to generate property at all bool arrayexhausted = false; // flag will be set if a main value was not generated because array exhausted bool anyvalues = false; // flag will be set when at least one value has been generated sInt32 numNonSpcs=0; encoding=enc_none; // default is no encoding sInt16 v=0; // value counter nonasc=false; // assume plain ASCII sInt16 genres; TEncodingTypes enc; bool na; const TConversionDef *convP; // - now generate if (aPropP->unprocessed) { convP = &(aPropP->convdefs[0]); // unfolded and not-linefeed-escaped raw property stored in string - generate it as one value enc=encoding; na=false; genres=generateValue( aItem, convP, aBaseOffset, // base offset, relative to aRepeatOffset, // repeat offset or array index elemtext, // value will be stored here (might be binary in case of BLOBs, but then encoding will be set) 0, // should for some exotic reason values consist of a list, separate it by "," (";" is reserved for structured values) aMimeMode, false, // no parameter false, // not structured value, don't escape ";" false, // don't escape commas, either enc, // will receive needed encoding (usually B64 for binary values) na, 0, // no first char numNonSpcs, // number of consecutive non-spaces, accumulated aPropP->allowFoldAtSep, true // linefeed only escaping ); // check if something was generated if (genres>=GENVALUE_ELEMENT) { // generated something, might have caused encoding/noasc change encoding=enc; nonasc=nonasc || na; anyvaluessupported=true; anyvalues=true; // separate name+params and values bool dq = false; bool fc = true; size_t pti = string::npos; appChar c; for (cAppCharP p=elemtext.c_str(); (c=*p)!=0; p++) { if (dq) { if (c=='"') dq = false; // end of double quoted part } else { // not in doublequote if (fc && c=='"') dq = true; // if first char is doublequote, start quoted string else if (c==':') { pti = p-elemtext.c_str(); break; } // found else if (c=='\\' && *(p+1)) p++; // make sure next char is not evaluated } fc = false; // no longer first char } if (pti!=string::npos) { proptext.assign(elemtext, 0, pti); // name+params without separator elemtext.erase(0, pti+1); // remove name and separator } } else { arrayexhausted = true; // no more values, assume array exhausted } } else { // Normally generated property // - first set group if there is one if (aPropP->groupFieldID!=FID_NOT_SUPPORTED) { // get group name TItemField *g_fldP = aItem.getArrayFieldAdjusted(aPropP->groupFieldID+aBaseOffset, aRepeatOffset, true); if (g_fldP && !g_fldP->isEmpty()) { g_fldP->appendToString(proptext); proptext += '.'; // group separator } } // - append name and (possibly) parameters that are constant over all repetitions proptext += aPrefix; // - up to here assume no spaces numNonSpcs = proptext.size()+14; // some extra room for possible ";CHARSET=UTF8" // - append parameter values // anyvalues gets set if a parameter with shownonempty attribute was generated anyvalues=generateParams( aItem, // the item where data comes from proptext, // where params will be appended aPropP, // the property definition aMimeMode, aBaseOffset, aRepeatOffset, aPropNameExt, numNonSpcs ); // - append value(s) sInt16 maxrep=1,repinc=1; if (aPropNameExt) { maxrep=aPropNameExt->maxRepeat; repinc=aPropNameExt->repeatInc; } // generate property contents if (aPropP->valuelist && !aPropP->expandlist) { // property with value list // NOTE: convdef[0] is used for all values, aRepeatOffset changes convP = &(aPropP->convdefs[0]); // - now iterate over available repeats or array contents while(aRepeatOffsetvaluesep, // use valuelist separator between multiple values possibly generated from a list in a single field (e.g. CATEGORIES) aMimeMode, false, // not a param true, // always escape ; in valuelist properties aPropP->valuesep==',' || aPropP->altvaluesep==',', // escape commas if one of the separators is a comma enc, na, v>0 ? aPropP->valuesep : 0, // separate with specified multi-value-delimiter if not first value numNonSpcs, // number of consecutive non-spaces, accumulated aPropP->allowFoldAtSep, (convP->convmode & CONVMODE_MASK)==CONVMODE_RRULE // RRULES are not to be escaped ); // check if something was generated if (genres>=GENVALUE_ELEMENT) { // generated something, might have caused encoding/noasc change encoding=enc; nonasc=nonasc || na; } // update if we have at least one value of this property supported (even if empty) by the remote party if (genres>GENVALUE_NOTSUPPORTED) anyvaluessupported=true; if (genres==GENVALUE_EXHAUSTED) arrayexhausted=true; // for at least one component of the property, the array is exhausted // update if we have any value now (even if only empty) // - generate empty property according to // - aSuppressEmpty // - session-global fDontSendEmptyProperties // - supressEmpty property flag in property definition // - if no repeat (i.e. no aPropNameExt), exhausted array is treated like empty value (i.e. rendered unless suppressempty set) anyvalues = anyvalues || (genres>= (aSuppressEmpty || fDontSendEmptyProperties || aPropP->suppressEmpty ? GENVALUE_ELEMENT // if empty values should be suppressed, we need a non-empty element (array or simple field) : GENVALUE_EXHAUSTED // for valuelists, if empty values are not explicitly suppressed (i.e. minshow==0, see caller) exhausted array must always produce an empty value ) ); // count effective value appended v++; // update repeat offset aRepeatOffset+=repinc; // check for array mode - stop if array is exhausted or field not supported if (maxrep==REP_ARRAY && genres<=GENVALUE_EXHAUSTED) break; } } else { // property with individual values (like N) // NOTE: field changes with different convdefs, offsets remain stable arrayexhausted = true; // assume all arrays exhausted unless we find at least one non-exhausted array bool somearrays = false; // no arrays yet do { convP = &(aPropP->convdefs[v]); // generate one value enc=encoding; na=false; genres=generateValue( aItem, convP, aBaseOffset, // base offset, relative to aRepeatOffset, // repeat offset or array index elemtext, // value will be stored here (might be binary in case of BLOBs, but then encoding will be set) ',', // should for some exotic reason values consist of a list, separate it by "," (";" is reserved for structured values) aMimeMode, false, aPropP->numValues>1, // structured value, escape ";" aPropP->altvaluesep==',', // escape commas if alternate separator is a comma enc, // will receive needed encoding (usually B64 for binary values) na, 0, // no first char numNonSpcs, // number of consecutive non-spaces, accumulated aPropP->allowFoldAtSep, (convP->convmode & CONVMODE_MASK)==CONVMODE_RRULE // RRULES are not to be escaped ); //* %%% */ PDEBUGPRINTFX(DBG_EXOTIC,("generateValue #%hd for property '%s' returns genres==%hd",v,TCFG_CSTR(aPropP->propname),genres)); // check if something was generated if (genres>=GENVALUE_ELEMENT) { // generated something, might have caused encoding/noasc change encoding=enc; nonasc=nonasc || na; } // update if we have at least one value of this property supported (even if empty) by the remote party if (genres>GENVALUE_NOTSUPPORTED) anyvaluessupported=true; if (genres==GENVALUE_ELEMENT || genres==GENVALUE_EMPTYELEMENT) { arrayexhausted = false; // there is at least one non-exhausted array we're reading from (even if only empty value) somearrays = true; // generating from array } else if (genres==GENVALUE_EXHAUSTED) somearrays = true; // generating from array // update if we have any value now (even if only empty) // - generate empty property according to // - aSuppressEmpty // - session-global fDontSendEmptyProperties // - supressEmpty property flag in property definition // - if no repeat (i.e. no aPropNameExt), exhausted array is treated like empty value (i.e. rendered unless suppressempty set) anyvalues = anyvalues || (genres>=(aSuppressEmpty || fDontSendEmptyProperties || aPropP->suppressEmpty ? GENVALUE_ELEMENT : (aPropNameExt ? GENVALUE_EMPTYELEMENT : GENVALUE_EXHAUSTED))); // insert delimiter if not last value v++; if (v>=aPropP->numValues) break; // done with all values // add delimiter for next value if (aMimeMode==mimo_standard || aPropP->allowFoldAtSep) { elemtext+='\b'; // preferred break location (or location where extra space is allowed for mimo_old) numNonSpcs = 0; // can break here, new word starts } elemtext+=aPropP->valuesep; numNonSpcs++; // count it (assuming separator is never a space!) // add break indicator } while(true); // if none of the data sources is an array, we can't be exhausted. if (!somearrays) arrayexhausted = false; } } // normal generated property from components // - finalize property if it contains supported fields at all (or is mandatory) if ((anyvaluessupported && anyvalues) || aPropP->mandatory) { // - generate charset parameter if needed // NOTE: MIME-DIR based formats do NOT have the CHARSET attribute any more! if (nonasc && aMimeMode==mimo_old && fDefaultOutCharset!=chs_ansi) { // non-ASCII chars contained, generate property telling what charset is used proptext.append(";CHARSET="); proptext.append(MIMECharSetNames[fDefaultOutCharset]); } // - generate encoding parameter if needed if (encoding!=enc_none) { // in MIME-DIR, only "B" is allowed for binary, for vCard 2.1 it is "BASE64" if (encoding==enc_base64 || encoding==enc_b) { encoding = aMimeMode==mimo_standard ? enc_b : enc_base64; } // add the parameter proptext.append(";ENCODING="); proptext.append(MIMEEncodingNames[encoding]); } // - separate value from property text proptext+=':'; // - append (probably encoded) values now, always in UTF-8 encodeValues(encoding,fDefaultOutCharset,elemtext,proptext,fDoNotFoldContent); // - fold, copy and terminate (CRLF) property into aString output finalizeProperty(proptext.c_str(),aString,aMimeMode,fDoNotFoldContent,encoding==enc_quoted_printable); // - special case: base64 (but not B) encoded value must have an extra CRLF even if folding is // disabled, so we need to insert it here (because non-folding mode eliminates it from being // generated automatically in encodeValues/finalizeProperty) if (fDoNotFoldContent && encoding==enc_base64) aString.append("\x0D\x0A"); // extra CRLF terminating a base64 encoded property (note, base64 only occurs in mimo_old) // - property generated return GENPROP_NONEMPTY; } else { // Note: it is essential to return GENPROP_EXHAUSTED if no values are supported for this property at // all (otherwise caller might loop endless trying to generate a non-empty property return anyvaluessupported ? (arrayexhausted ? GENPROP_EXHAUSTED : GENPROP_EMPTY) // no property generated : GENPROP_EXHAUSTED; // no values supported means "exhausted" as well } } // TMimeDirProfileHandler::generateProperty // generate MIME-DIR from item into string object void TMimeDirProfileHandler::generateMimeDir(TMultiFieldItem &aItem, string &aString) { // clear string aString.reserve(3000); // not too small aString.erase(); // reset item time zone before generating fHasExplicitTZ = false; // none set explicitly fItemTimeContext = fReceiverTimeContext; // default to receiver context fUsedTCtxSet.clear(); // no TZIDs used yet fEarliestTZDate = noLinearTime; // reset range of generated timestamps related to a TZID or TZ/DAYLIGHT fLatestTZDate = noLinearTime; fVTimeZonePendingProfileP = NULL; // no VTIMEZONE pending for generation fVTimeZoneInsertPos = 0; // no insert position yet // recursively generate levels generateLevels(aItem,aString,fProfileDefinitionP); // now generate VTIMEZONE, if needed if (fVTimeZonePendingProfileP) { string s, val, vtz; vtz.erase(); // generate needed vTimeZones (according to fUsedTCtxSet) for (TTCtxSet::iterator pos=fUsedTCtxSet.begin(); pos!=fUsedTCtxSet.end(); pos++) { // - calculate first and last year covered by timestamps in this record sInt16 startYear=0,endYear=0; if (fEarliestTZDate && fProfileCfgP->fVTimeZoneGenMode!=vtzgen_current) { // dependent on actually created dates lineartime2date(fEarliestTZDate, &startYear, NULL, NULL); lineartime2date(fLatestTZDate, &endYear, NULL, NULL); // there is at least one date in the record switch (fProfileCfgP->fVTimeZoneGenMode) { case vtzgen_start: endYear = startYear; // only show for start of range break; case vtzgen_end: startYear = endYear; // only show for end of range break; case vtzgen_range: // pass both start and end year break; case vtzgen_openend: // pass start year but request that all rules from start up to the current date are inlcuded endYear = 0; break; case vtzgen_current: case numVTimeZoneGenModes: // case statement to keep gcc happy, will not be reached because of if() above break; } } // - lead-in s="BEGIN:"; s.append(fVTimeZonePendingProfileP->levelName); finalizeProperty(s.c_str(),vtz,fMimeDirMode,false,false); // - generate raw string //%%% endYear is not yet implemented in internalToVTIMEZONE(), fTzIdGenMode has only the olson option for now internalToVTIMEZONE(*pos, val, getSessionZones(), NULL, startYear, endYear, fProfileCfgP->fTzIdGenMode==tzidgen_olson ? "o" : NULL); size_t i,n = 0; while (val.size()>n) { i = val.find('\n',n); // next line end if (i==string::npos) i=val.size(); if (i-n>1) { // more than one char = not only a trailing line end s.assign(val,n,i-n); // finalize and add property finalizeProperty(s.c_str(),vtz,fMimeDirMode,false,false); // advance cursor beyond terminating LF n=i+1; } } // - lead out s="END:"; s.append(fVTimeZonePendingProfileP->levelName); finalizeProperty(s.c_str(),vtz,fMimeDirMode,false,false); } // for // now insert the VTIMEZONE into the output string (so possibly making it appear BEFORE the // properties that use TZIDs) aString.insert(fVTimeZoneInsertPos, vtz); // done fVTimeZonePendingProfileP = NULL; } // if pending VTIMEZONE } // TMimeDirProfileHandler::generateMimeDir // generate nested levels of MIME-DIR content void TMimeDirProfileHandler::generateLevels( TMultiFieldItem &aItem, string &aString, const TProfileDefinition *aProfileP ) { // check if level must be generated bool dolevel=false; string s,val; sInt16 fid=aProfileP->levelConvdef.fieldid; if (fid<0) dolevel=true; // if no controlling field there, generate anyway else { // check field contents to determine if generation is needed if (aItem.isAssigned(fid)) { const TEnumerationDef *enumP = aProfileP->levelConvdef.enumdefs; aItem.getField(fid)->getAsString(val); if (enumP) { // if enumdefs, content must match first enumdef's enumval (NOT enumtext!!) dolevel = strucmp(val.c_str(),TCFG_CSTR(enumP->enumval))==0; } else { // just being not empty enables level dolevel = !aItem.getField(fid)->isEmpty(); } } } // check for MIME mode dependency dolevel = dolevel && mimeModeMatch(aProfileP->modeDependency); // generate level if enabled if (dolevel) { // generate level start if (aProfileP->profileMode==profm_vtimezones) { // don't generate now, just remember the string position where we should add the // VTIMEZONEs when we're done generating the record. fVTimeZonePendingProfileP = aProfileP; fVTimeZoneInsertPos = aString.size(); } else { // standard custom level s="BEGIN:"; s.append(aProfileP->levelName); finalizeProperty(s.c_str(),aString,fMimeDirMode,false,false); // loop through all properties of that level const TPropertyDefinition *propP = aProfileP->propertyDefs; #ifndef NO_REMOTE_RULES uInt16 propGroup=0; // group identifier (all props with same name have same group ID) const TPropertyDefinition *otherRulePropP = NULL; // default property which is used if none of the rule-dependent in the group was used bool ruleSpecificExpanded = false; #endif const TPropertyDefinition *expandPropP; while (propP) { // check for mode dependency if (!mimeModeMatch(propP->modeDependency)) { // no mode match -> just skip this one propP=propP->next; continue; } #ifndef NO_REMOTE_RULES // check for beginning of new group (no or different property group number) if (propP->propGroup==0 || propP->propGroup!=propGroup) { // end of last group - start of new group propGroup = propP->propGroup; // remember new group number // expand "other"-rule dependent variant from last group if (!ruleSpecificExpanded && otherRulePropP) { expandProperty( aItem, aString, TCFG_CSTR(otherRulePropP->propname), // the prefix consists of the property name otherRulePropP, // the property definition fMimeDirMode // MIME-DIR mode ); } // for next group, no rule-specific version has been expanded yet ruleSpecificExpanded = false; // for next group, we don't have a "other"-rule variant otherRulePropP=NULL; } // check if entry is rule-specific expandPropP=NULL; // do not expand by default if (propP->dependsOnRemoterule) { // check if depends on current rule if (propP->ruleDependency==NULL) { // this is the "other"-rule dependent variant // - just remember otherRulePropP=propP; } else if (isActiveRule(propP->ruleDependency)) { // specific for the applied rule expandPropP=propP; // default to expand current prop // now we have expanded a rule-specific property (blocks expanding of "other"-rule dependent prop) ruleSpecificExpanded=true; } } else { // does not depend on rule, expand anyway expandPropP=propP; } // check if this is last prop of list propP=propP->next; if (!propP && otherRulePropP && !ruleSpecificExpanded) { // End of prop list, no rule-specific expand yet, and there is a otherRuleProp // expand "other"-rule's property instead expandPropP=otherRulePropP; } #else // simply expand it expandPropP=propP; propP=propP->next; #endif // now expand if selected if (expandPropP) { // recursively generate all properties that expand from this entry // (includes extendsfieldid-parameters and repetitions expandProperty( aItem, aString, TCFG_CSTR(expandPropP->propname), // the prefix consists of the property name expandPropP, // the property definition fMimeDirMode // MIME-DIR mode ); } } // properties loop // generate sublevels, if any const TProfileDefinition *subprofileP = aProfileP->subLevels; while (subprofileP) { // generate sublevels (possibly, none is generated) generateLevels(aItem,aString,subprofileP); // next subprofileP=subprofileP->next; } // generate level end s="END:"; s.append(aProfileP->levelName); finalizeProperty(s.c_str(),aString,fMimeDirMode,false,false); } // normal level } // if level must be generated } // TMimeDirProfileHandler::generateLevels // Convert string from MIME-format into field value(s). // - the string passed to this function is already a translated value // list if combinesep is set, and every single value is already // enum-translated if enums are defined. // - returns false if field(s) could not be assigned because aText has // a bad syntax. // - returns true if field(s) assigned something useful or no field is // available to assign anything to. bool TMimeDirProfileHandler::MIMEStringToField( const char *aText, // the value text to assign or add to the field const TConversionDef *aConvDefP, // the conversion definition record TMultiFieldItem &aItem, // the item where data goes to sInt16 aFid, // the field ID (can be NULL for special conversion modes) sInt16 aArrIndex // the repeat offset to handle array fields ) { sInt16 moffs; uInt16 offs,n; bool isBitMap; fieldinteger_t flags = 0; TTimestampField *tsFldP; timecontext_t tctx; TParsedTzidSet::iterator tz; string s; // RRULE lineartime_t dtstart; timecontext_t startcontext = 0, untilcontext = 0; char freq; char freqmod; sInt16 interval; fieldinteger_t firstmask; fieldinteger_t lastmask; lineartime_t until; bool dostore; // get pointer to leaf field TItemField *fldP = aItem.getArrayField(aFid,aArrIndex); sInt16 convmode = aConvDefP->convmode & CONVMODE_MASK; switch (convmode) { case CONVMODE_MAILTO: // remove the mailto: prefix if there is one if (strucmp(aText,"mailto:",7)==0) aText+=7; // remove leading "mailto:" goto normal; case CONVMODE_EMPTYONLY: // same as CONVMODE_NONE, but assigns only first occurrence (that is, // when field is still empty) if (!fldP) return true; // no field, assignment "ok" (=nop) if (!fldP->isEmpty()) return true; // field not empty, discard new assignment case CONVMODE_TIMESTAMP: // nothing special for parsing case CONVMODE_AUTODATE: // nothing special for parsing case CONVMODE_AUTOENDDATE: // check for "last minute of the day" case CONVMODE_DATE: // dates will be made floating case CONVMODE_NONE: normal: if (!fldP) return true; // no field, assignment "ok" (=nop) // just set as string or add if combine mode if (aConvDefP->combineSep) { // combine mode if (!fldP->isEmpty()) { // not empty, append with separator char cs[2]; cs[0]=aConvDefP->combineSep; cs[1]=0; fldP->appendString(cs); } fldP->appendString(aText); } else { // for non-strings, skip leading spaces before trying to parse if (!fldP->isBasedOn(fty_string)) { while (*aText && *aText==' ') aText++; // skip leading spaces } // simple assign mode if (fldP->isBasedOn(fty_timestamp)) { // read as ISO8601 timestamp tsFldP = static_cast(fldP); // if field already has a non-unknown context (e.g. set via TZID, or TZ/DAYLIGHT), // use that as context for floating ISO date (i.e. no "Z" or "+/-hh:mm" suffix) if (!tsFldP->isFloating()) { // field already has a TZ specified (e.g. by a TZID param), use that instead of item level context tctx = tsFldP->getTimeContext(); } else { // no pre-known zone for this specific field, check if property has a specific zone if (!TCTX_IS_UNKNOWN(fPropTZIDtctx)) { // property has a specified time zone context from a TZID, use it tctx = fPropTZIDtctx; // default to property's TZID (if one was parsed, otherwise this will be left floating) } else if (fHasExplicitTZ) { // item has an explicitly specified time zone context (e.g. set via TZ: property), // treat all timestamps w/o own time zone ("Z" suffix) in that context tctx = fItemTimeContext; } else { // item has no explicitly specified time zone context, // parse and leave floating float for now tctx = TCTX_UNKNOWN; // default to floating } } // Now tctx is the default zone to bet set for ALL values that are in floating notation // - check for special handling of misbehaving remotes if (fTreatRemoteTimeAsLocal || fTreatRemoteTimeAsUTC) { // ignore time zone specs which might be present possibly tsFldP->setAsISO8601(aText, tctx, true); // now force time zone to item/user context or UTC depending on flag settings tctx = fTreatRemoteTimeAsLocal ? fItemTimeContext : TCTX_UTC; // set it tsFldP->setTimeContext(tctx); } else { // read with time zone, if present, and default to tctx set above tsFldP->setAsISO8601(aText, tctx, false); // check if still floating now if (tsFldP->isFloating()) { // unfloat only if remote cannot handle UTC and therefore ALWAYS uses localtime. // otherwise, assume that floating status is intentional and must be retained. // Note: TZID and TZ, if present, are already applied by now // Note: DURATION and DATE floating will always be retained, as they are always intentional if ((!fReceiverCanHandleUTC || fProfileCfgP->fUnfloatFloating) && !TCTX_IS_DATEONLY(tsFldP->getTimeContext()) && !tsFldP->isDuration()) { // not intentionally floating, but just not capable otherwise // - put it into context of item (which is in this case session's user context) tsFldP->setTimeContext(fItemTimeContext); } } else { // non-floating if (fHasExplicitTZ) { // item has explicit zone - move timestamp to it (e.g. if timestamps are sent // in ISO8601 Z notation, but a TZ/DAYLIGHT or TZID is present) tsFldP->moveToContext(tctx,false); } } } // special conversions if (convmode==CONVMODE_DATE) { tsFldP->makeFloating(); // date-only is forced floating } else if (convmode==CONVMODE_AUTOENDDATE && fMimeDirMode==mimo_old) { // check if this could be a 23:59 type end-of-day lineartime_t ts = tsFldP->getTimestampAs(fItemTimeContext,&tctx); // get in item context or floating lineartime_t ts0 = lineartime2dateonlyTime(ts); if (ts0!=ts && AlldayCount(ts0,ts)>0) { // only if not already a 0:00 // this is a 23:59 type end-of-day, convert it to midnight of next day (AND adjust time context, in case it is now different from original) tsFldP->setTimestampAndContext(lineartime2dateonlyTime(ts)+linearDateToTimeFactor,tctx); } } } else { // read as text fldP->setAsString(aText); } } return true; // found // Time zones case CONVMODE_TZ: // parse time zone if (ISO8601StrToContext(aText, tctx)!=0) { // Note: this is always global for the entire item, so set the item context // (which is then used when parsing dates (which should be delayed to make sure TZ is seen first) fItemTimeContext = tctx; if (!TCTX_IS_TZ(tctx)) { // only offset. Try to symbolize it by passing a DAYLIGHT:FALSE and the offset if (TzDaylightToContext("FALSE", fItemTimeContext, tctx, getSessionZones(), fReceiverTimeContext)) fItemTimeContext = tctx; // there is a symbolized context, keep that } fHasExplicitTZ = true; // zone explicitly set, not only copied from session's user zone goto timecontext; } return true; // not set, is ok case CONVMODE_DAYLIGHT: // parse DAYLIGHT zone description property, prefer user zone (among multiple zones matching the Tz/daylight info) // - resolve to offset (assuming that item context came from a TZ property, so it will // be one of the non-DST zones, so reftime does not matter) tctx = fItemTimeContext; TzResolveContext(tctx, getSystemNowAs(TCTX_UTC, getSessionZones()), true, getSessionZones()); // - now find matching zone for given offset and DAYLIGHT property string if (TzDaylightToContext(aText,tctx,tctx,getSessionZones(),fReceiverTimeContext)) { // this is always global for the entire item, so set the item context // (which is then used when parsing dates (which should be delayed to make sure TZ is seen first) fItemTimeContext = tctx; fHasExplicitTZ = true; // zone explicitly set, not only copied from session's user zone goto timecontext; } return true; // not set, is ok case CONVMODE_TZID: // try to get context for named zone // - look up in TZIDs we've parsed so far from VTIMEZONE tz = fParsedTzidSet.find(aText); if (tz!=fParsedTzidSet.end()) { tctx = tz->second; // get tctx resolved from VTIMEZONE // use tctx for all values from this property fPropTZIDtctx = tctx; goto timecontext; } else if (TimeZoneNameToContext(aText, tctx, getSessionZones(), true)) { // found valid TZID property, save it so we can use it for all values of this property that don't specify their own TZ PDEBUGPRINTFX(DBG_ERROR,("Warning: TZID %s could be resolved against internal name, but appropriate VTIMEZONE is missing",aText)); fPropTZIDtctx=tctx; goto timecontext; } else { PDEBUGPRINTFX(DBG_ERROR,("Invalid TZID value '%s' found (no related VTIMEZONES found and not referring to an internal time zone name)",aText)); } return true; // not set, is ok timecontext: // if no field, we still have the zone as fItemTimeContext if (!fldP) return true; // no field, is ok else if (fldP->isBasedOn(fty_timestamp)) { // based on timestamp, assign context to that timestamp tsFldP = static_cast(fldP); tsFldP->setTimeContext(tctx); } else if (fldP->getCalcType()==fty_integer || !TCTX_IS_TZ(tctx)) { // integer field or non-symbolic time zone: // assign minute offset as number (calculated for now) TzResolveToOffset(tctx, moffs, getSession()->getSystemNowAs(TCTX_UTC), true, getSessionZones()); fldP->setAsInteger(moffs); } else { // assign symbolic time zone name TimeZoneContextToName(tctx, s, getSessionZones()); fldP->setAsString(s); } return true; case CONVMODE_MULTIMIX: case CONVMODE_BITMAP: while (*aText && *aText==' ') aText++; // skip leading spaces if (convmode==CONVMODE_MULTIMIX) { // parse value to determine field if (!mixvalparse(aText, offs, isBitMap, n)) return true; // syntax not ok, nop fldP = aItem.getArrayField(aFid+offs,aArrIndex); } else { // just bit number isBitMap=true; if (StrToUShort(aText,n,2)<1) return true; // no integer convertible value, nop } if (!fldP) return true; // no field, assignment "ok" (=nop) if (isBitMap) { // store or add to bitmap // - get current bitmap value if we have a spearator (means that we can have multiple values) if (aConvDefP->combineSep) flags=fldP->getAsInteger(); flags = flags | ((fieldinteger_t)1<setAsInteger(flags); } else { // store as literal fldP->setAsString(aText+n); } return true; // ok case CONVMODE_VERSION: // version string // - return true if correct version string return strucmp(aText,aItem.getItemType()->getTypeVers(fProfileMode))==0; case CONVMODE_PRODID: case CONVMODE_VALUETYPE: case CONVMODE_FULLVALUETYPE: return true; // simply ignore, always ok case CONVMODE_RRULE: // helpers TTimestampField *tfP; TIntegerField *ifP; TStringField *sfP; if (aFid<0) return true; // no field block, assignment "ok" (=nop) // read DTSTART (last=6th field in block) as reference for converting count to end time point dtstart=0; // start date/time, as reference if (!(tfP = ITEMFIELD_DYNAMIC_CAST_PTR(TTimestampField,fty_timestamp,aItem.getArrayField(aFid+5,aArrIndex)))) return false; // TZ and TZID should be applied to dates by now, so dtstart should be in right zone dtstart = tfP->getTimestampAs(TCTX_UNKNOWN,&startcontext); if (TCTX_IS_UTC(startcontext)) { // UTC is probably not the correct zone to resolve weekdays -> convert to item zone dtstart = tfP->getTimestampAs(fItemTimeContext,&startcontext); } // init field block values freq='0'; // frequency freqmod=' '; // frequency modifier interval=0; // unspecified interval firstmask=0; // day mask counted from the first day of the period lastmask=0; // day mask counted from the last day of the period until=0; // last day // do the conversion here dostore=false; if (fMimeDirMode==mimo_old) { // vCalendar 1.0 type RRULE dostore=RRULE1toInternal( aText, // RRULE string to be parsed dtstart, // reference date for parsing RRULE startcontext, freq, freqmod, interval, firstmask, lastmask, until, untilcontext, GETDBGLOGGER ); } else { // iCalendar 2.0 type RRULE dostore=RRULE2toInternal( aText, // RRULE string to be parsed dtstart, // reference date for parsing RRULE startcontext, freq, freqmod, interval, firstmask, lastmask, until, untilcontext, GETDBGLOGGER ); } if (dostore) { // store values into field block // - freq/freqmod if (!(sfP = ITEMFIELD_DYNAMIC_CAST_PTR(TStringField,fty_string,aItem.getArrayField(aFid,aArrIndex)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice sfP->assignEmpty(); if (freq!='0') { sfP->appendChar(freq); sfP->appendChar(freqmod); } // - interval if (!(ifP = ITEMFIELD_DYNAMIC_CAST_PTR(TIntegerField,fty_integer,aItem.getArrayField(aFid,aArrIndex)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice ifP->setAsInteger(interval); // - firstmask if (!(ifP = ITEMFIELD_DYNAMIC_CAST_PTR(TIntegerField,fty_integer,aItem.getArrayField(aFid,aArrIndex)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice ifP->setAsInteger(firstmask); // - lastmask if (!(ifP = ITEMFIELD_DYNAMIC_CAST_PTR(TIntegerField,fty_integer,aItem.getArrayField(aFid,aArrIndex)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice ifP->setAsInteger(lastmask); // - until if (!(tfP = ITEMFIELD_DYNAMIC_CAST_PTR(TTimestampField,fty_timestamp,aItem.getArrayField(aFid,aArrIndex)))) return false; aFid++; // do NOT INCREMENT in macro, as it would get incremented twice tfP->setTimestampAndContext(until,untilcontext); // - dtstart is not stored, but only read above for reference // done return true; } else { return false; } break; // just in case default: // unknown mode, cannot convert return false; } return false; } // TMimeDirProfileHandler::MIMEStringToField // helper for parseMimeDir() // - parse parameter or property value(list), returns false if no value(list) bool TMimeDirProfileHandler::parseValue( const string &aText, // string to parse as value (could be binary content) const TConversionDef *aConvDefP, sInt16 aBaseOffset, // base offset sInt16 aRepOffset, // repeat offset, adds to aBaseOffset for non-array fields, is array index for array fileds TMultiFieldItem &aItem, // the item where data goes to bool &aNotEmpty, // is set true (but never set false) if property contained any (non-positional) values char aSeparator, // separator between values TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) bool aParamValue, // set if parsing parameter value (different escaping rules) bool aStructured, // set if value consists of multiple values (has semicolon content escaping) bool aOnlyDeEscLF // set if de-escaping only for \n -> LF, but all visible char escapes should be left intact ) { string val,val2; char c; const char *p; // determine field ID sInt16 fid=aConvDefP->fieldid; if (fid>=0) { // value has field where it can be stored // - fid is ALWAYS offset by baseoffset fid += aBaseOffset; // - adjust fid and repoffset (add them and reset aRepOffset if no array field) aItem.adjustFidAndIndex(fid,aRepOffset); // find out if value exists (available in source and target) if (isFieldAvailable(aItem,fid)) { // parse only if field available in both source and target if ( (aConvDefP->convmode & CONVMODE_MASK)==CONVMODE_BLOB_B64 || (aConvDefP->convmode & CONVMODE_MASK)==CONVMODE_BLOB_AUTO ) { // move 1:1 into field // - get pointer to leaf field TItemField *fldP = aItem.getArrayField(fid,aRepOffset); // - directly set field with entire (possiby binary) string content if (fldP) fldP->setAsString(aText); // parsed successfully return true; } // normal text value, apply de-escaping, charset transformation, value list and enum conversion p = aText.c_str(); // start here while (*p) { // value list loop // - get next value val.erase(); while ((c=*p)!=0) { // check for field list separator (if field allows list at all) if (c==aSeparator && aConvDefP->combineSep) { p++; // skip separator break; } // check for escaped chars if (!aParamValue && c=='\\') { p++; c=*p; if (!c) break; // half escape sequence, ignore else if (c=='n' || c=='N') c='\n'; else if (aOnlyDeEscLF) val+='\\'; // if deescaping only for \n, transfer this non-LF escape into output // other escaped chars are shown as themselves } // add char val+=c; // next p++; } // find first non-space and number of chars excluding leading and trailing spaces const char* valnospc = val.c_str(); size_t numnospc=val.size(); while (*valnospc && *valnospc==' ') { valnospc++; numnospc--; } while (*(valnospc+numnospc-1)==' ') { numnospc--; } // - counts as non-empty if there is a non-empty (and not space-only) value string (even if // it might be converted to empty-value in enum conversion) if (*valnospc) aNotEmpty=true; // - apply enum translation if any const TEnumerationDef *enumP = aConvDefP->findEnumByName(valnospc,numnospc); if (enumP) { // we have an explicit value (can be default if there is a enm_defaultvalue enum) if (enumP->enummode==enm_ignore) continue; // do not assign anything, get next value else { if (enumP->enummode==enm_prefix) { // append original value minus prefix to translation size_t n=TCFG_SIZE(enumP->enumtext); val2.assign(valnospc+n,numnospc-n); // copying from original val val=enumP->enumval; // assign the prefix val+=val2; // and append the original value sans prefix } else { val=enumP->enumval; // just use translated value } } } // assign (or add) value to field if (!MIMEStringToField( val.c_str(), // the value text to assign or add to the field aConvDefP, // the conversion definition aItem, fid, // field ID, can be -1 aRepOffset // 0 or array index )) { // field conversion error PDEBUGPRINTFX(DBG_ERROR,( "TMimeDirProfileHandler::parseValue: MIMEStringToField assignment (fid=%hd, arrindex=%hd) failed", fid, aRepOffset )); return false; } } // while(more chars in value text) } // if source and target fields available else { // show this in log, as most probably it's a remote devInf bug PDEBUGPRINTFX(DBG_PARSE,("No value stored for field index %hd because remote indicates not supported in devInf",fid)); } } // if fieldid exists else { // could be special conversion using no data or data from // internal object variables (such as VERSION value) if (!MIMEStringToField( aText.c_str(), // the value text to process aConvDefP, // the conversion definition aItem, FID_NOT_SUPPORTED, 0 )) { // field conversion error PDEBUGPRINTFX(DBG_ERROR,( "TMimeDirProfileHandler::parseValue: MIMEStringToField in check mode (no field) failed with val=%s", aText.c_str() )); return false; } } // parsed successfully return true; } // TMimeDirProfileHandler::parseValue // parse given property bool TMimeDirProfileHandler::parseProperty( cAppCharP &aText, // where to start interpreting property, will be updated past end of what was scanned TMultiFieldItem &aItem, // item to store data into const TPropertyDefinition *aPropP, // the property definition sInt16 *aRepArray, // array[repeatID], holding current repetition COUNT for a certain nameExts entry sInt16 aRepArraySize, // size of array (for security) TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) cAppCharP aGroupName, // property group ("a" in "a.TEL:131723612") size_t aGroupNameLen, cAppCharP aFullPropName, // entire property name (excluding group) - might be needed in case of wildcard property match size_t aFullNameLen ) { TNameExtIDMap nameextmap; const TParameterDefinition *paramP; const char *p,*ep,*vp; char c; string pname; string val; string unprocessedVal; bool defaultparam; bool fieldoffsetfound; bool notempty = false; bool valuelist; sInt16 pidx; // parameter index TEncodingTypes encoding; TCharSets charset; // field storage info vars, defaults are used if property has no TPropNameExtension sInt16 baseoffset = 0; sInt16 repoffset = 0; sInt16 maxrep = 1; // no repeat by default sInt16 repinc = 1; // inc by 1 sInt16 repid = -1; // invalid by default bool overwriteempty = false; // do not overwrite empty values by default bool repoffsByGroup = false; // init encoding = enc_none; // no encoding by default charset = aMimeMode==mimo_standard ? chs_utf8 : fDefaultInCharset; // always UTF8 for real MIME-DIR (same as enclosing SyncML doc), for mimo_old depends on remote rule option (normally UTF-8) nameextmap = 0; // no name extensions detected so far fieldoffsetfound = (aPropP->nameExts==NULL); // no first pass needed at all w/o nameExts, just use offs=0 valuelist = aPropP->valuelist; // cache flag // prepare storage as unprocessed value if (aPropP->unprocessed) { if (aGroupName && *aGroupName) { unprocessedVal.assign(aGroupName, aGroupNameLen); unprocessedVal += '.'; } unprocessedVal.append(aFullPropName, aFullNameLen); } // scan parameter list (even if unprocessed, to catch ENCODING and CHARSET) do { p=aText; while (*p==';') { // param follows defaultparam=false; pname.erase(); p=nextunfolded(p,aMimeMode); // parameter expected here // - find end of parameter name vp=NULL; // no param name found for (ep=p; *ep; ep=nextunfolded(ep,aMimeMode)) { if (*ep=='=') { // param value follows at vp vp=nextunfolded(ep,aMimeMode); break; } else if (*ep==':' || *ep==';') { // end of parameter name w/o equal sign if (aMimeMode!=mimo_old) { // only mimo_old allows default params, but as e.g. Nokia Intellisync (Synchrologic) does this completely wrong, we now tolerate it POBJDEBUGPRINTFX(getSession(),DBG_ERROR,( "Parameter without value: %s - is wrong in MIME-DIR, but we tolerate it and parse as default param name", pname.c_str() )); } // treat this as a value of the default parameter (correct syntax in old vCard 2.1/vCal 1.0, wrong in MIME-DIR) defaultparam=true; // default param // value is equal to param name and starts at p vp=p; break; } // add char to param name (unfolded!) pname+=*ep; } if (!vp) { POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("parseProperty: bad parameter %s (missing value)",pname.c_str())); return false; } // parameter name & value isolated, pname=name (if not defaultparam), vp points to value // - obtain unfolded value val.erase(); bool dquoted = false; bool wasdquoted = false; // - note: we allow quoted params even with mimo_old, as the chance is much higher that a param value // beginning with doublequote is actually a quoted string than a value containing a doublequote at the beginning if (*vp=='"') { dquoted = true; wasdquoted = true; vp=nextunfolded(vp,aMimeMode); } do { c=*vp; if (isEndOfLineOrText(c)) break; if (dquoted) { // within double quoted value, only closing dquote can end it if (c=='"') { // swallow closing double quote and proceed (next should be end of value anyway) vp = nextunfolded(vp,aMimeMode); dquoted = false; continue; } } else { // not within double quoted value if (c==':' || c==';') break; // end of value } val+=c; // cancel QP softbreaks if encoding is already switched to QP at this point vp=nextunfolded(vp,aMimeMode,encoding==enc_quoted_printable); } while(true); // - processing of next param starts here p=vp; // check for global parameters bool storeUnprocessed = true; // in case this is a unprocessed property, flag will be cleared to prevent storing params that still ARE processed if ((aMimeMode==mimo_old && defaultparam) || strucmp(pname.c_str(),"ENCODING")==0) { // get encoding // Note: always process ENCODING, as QP is mimo-old specific and must be removed for normalized storage for (sInt16 k=0; k (k); } } if (aPropP->unprocessed) { if (encoding==enc_quoted_printable) storeUnprocessed = false; // QP will be decoded (for unprocessed properties), so param must not be stored else encoding = enc_none; // other encodings will not be processed for unprocessed properties } } else if (strucmp(pname.c_str(),"CHARSET")==0) { // charset specified (mimo_old value-only not supported) // Note: always process CHARSET, because non-UTF8 cannot be safely passed to DBs, so we need // to convert in case it's not UTF-8 even for "unprocessed" properties sInt16 k; for (k=1; k=numCharSets) { // unknown charset POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("========== WARNING: Unknown Charset '%s'",val.c_str())); // %%% replace 8bit chars with underscore charset=chs_unknown; } storeUnprocessed = false; // CHARSET is never included in unprocessed property, as we always store UTF-8 } if (aPropP->unprocessed && storeUnprocessed && fieldoffsetfound) { // append in reconstructed form for storing "unprocessed" (= lightly normalized) unprocessedVal += ';'; unprocessedVal += pname; if (!defaultparam) { unprocessedVal += '='; if (wasdquoted) unprocessedVal += '"'; unprocessedVal += val; if (wasdquoted) unprocessedVal += '"'; } } // find param in list now paramP = aPropP->parameterDefs; pidx=0; // parameter index while (paramP) { // check for match if ( mimeModeMatch(paramP->modeDependency) && #ifndef NO_REMOTE_RULES (!paramP->ruleDependency || isActiveRule(paramP->ruleDependency)) && #endif ((defaultparam && paramP->defaultparam) || strucmp(pname.c_str(),TCFG_CSTR(paramP->paramname))==0) ) { // param name found // - process value (list) if (!fieldoffsetfound) { // first pass, check for extendsname parameters if (paramP->extendsname) { // - for each value in the value list, check if it has a nameextid if (!paramP->convdef.enumdefs) { DEBUGPRINTFX(DBG_PARSE,( "parseProperty: extendsname param w/o enum : %s;%s", TCFG_CSTR(aPropP->propname), TCFG_CSTR(paramP->paramname) )); return false; } // - loop through value list ep=val.c_str(); while (*ep) { sInt32 n; const char *pp; // find end of next value in list for (n=0,pp=ep; *pp; pp++) { if (*pp==',') { pp++; // skip the comma break; } n++; } // search in enums list const TEnumerationDef *enumP = paramP->convdef.findEnumByName(ep,n); if (enumP && enumP->nameextid>=0) { // set name extension map bit nameextmap |= ((TNameExtIDMap)1<nameextid); } // next value in list ep=pp; } } // if extendsname } // first pass else { // second pass: read param value(s) if (!parseValue( val, // input string, possibly binary (e.g. in case of B64 encoded PHOTO) &(paramP->convdef), baseoffset, // base offset (as determined by position) repoffset, // repetition offset or array index aItem, // the item where data goes to notempty, // set true if value(s) parsed are not all empty defaultparam ? ';' : ',', // value list separator aMimeMode, // MIME mode (older or newer vXXX format compatibility) true, // parsing a parameter false, // no structured value false // normal, full de-escaping )) { DEBUGPRINTFX(DBG_PARSE,( "TMimeDirProfileHandler::parseProperty: %s: value not parsed: %s", pname.c_str(), val.c_str() )); return false; } } // second pass } // if (param known) // test next param paramP=paramP->next; pidx++; } // while more params // p points to ';' of next param or ':' of value } // while more parameters (*p==';') // check if both passes done or if property storage is explicitly blocked already (baseoffset=-1) if (fieldoffsetfound) break; // start second pass fieldoffsetfound=true; // - assume empty to start with notempty=false; // - prepare for second pass: check if set of param values match // an entry in the nameexts list TPropNameExtension *propnameextP = aPropP->nameExts; if (propnameextP) { repoffsByGroup = false; bool dostore = false; while (propnameextP) { // check if entry matches parsed extendsname param values if ( ((propnameextP->musthave_ids & nameextmap) == propnameextP->musthave_ids) && // needed there ((propnameextP->forbidden_ids & nameextmap) == 0) // none of the forbidden ones there ) { // found match, get offset baseoffset=propnameextP->fieldidoffs; if (baseoffset==OFFS_NOSTORE) break; // abort with dostore=false // check if repeat needed/allowed maxrep=propnameextP->maxRepeat; if (maxrep==REP_REWRITE) { dostore=true; // we can store break; // unlimited repeat allowed but stored in same fields (overwrite), no need for index search by group } // find index where to store this repetition repid=propnameextP->repeatID; if (repid>=aRepArraySize) SYSYNC_THROW(TSyncException(DEBUGTEXT("TMimeDirProfileHandler::parseProperty: repID too high","mdit11"))); // check if a group ID determines the repoffset (not possible for valuelists) if (aPropP->groupFieldID!=FID_NOT_SUPPORTED && !valuelist) { // search in group field string s; bool someGroups = false; for (sInt16 n=0; nrepeatInc; // original repeatoffset (not adjusted yet) TItemField *g_fldP = aItem.getArrayFieldAdjusted(aPropP->groupFieldID+baseoffset,g_repoffset,true); // get leaf field, if it exists if (!g_fldP) break; // group field for that repetition does not (yet) exist, array exhausted // compare group name if (g_fldP->isAssigned()) { someGroups = someGroups || !g_fldP->isEmpty(); // when we find a non-empty group field, we have at least one group detected if (someGroups) { // don't use repetitions already used by SOME of the fields in the group // for auto-assigning new groups (or ungrouped occurrences) if (aRepArray[repid]getAsString(s); if (aGroupName && strucmp(aGroupName,s.c_str(),aGroupNameLen)==0) { repoffsByGroup = true; dostore = true; repoffset = g_repoffset; PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,("parseProperty: found group '%s' at repoffset=%d (repcount=%d)",s.c_str(),repoffset,n)); break; } } } // for all possible repetitions // minrep now contains minimal repetition count for !repoffsByGroup case } // if grouped property if (!repoffsByGroup) { if (aRepArray[repid]repeatInc; // note: repArray will be updated below (if property not empty or !overwriteempty) do { repoffset = aRepArray[repid]*repinc; // - set flag if repeat offset should be incremented after storing an empty property or not overwriteempty = propnameextP->overwriteEmpty; // - check if target property main value is empty (must be, or we will skip that repetition) dostore = false; // if no field exists, we do not store for (sInt16 e=0; enumValues; e++) { if (aPropP->convdefs[e].fieldid==FID_NOT_SUPPORTED) continue; // no field, no need to check it sInt16 e_fid = aPropP->convdefs[e].fieldid+baseoffset; sInt16 e_rep = repoffset; aItem.adjustFidAndIndex(e_fid,e_rep); // - get base field TItemField *e_basefldP = aItem.getField(e_fid); TItemField *e_fldP = NULL; if (e_basefldP) e_fldP=e_basefldP->getArrayField(e_rep,true); // get leaf field, if it exists if (!e_basefldP || (e_fldP && e_fldP->isAssigned()) || (aPropP->groupFieldID!=FID_NOT_SUPPORTED && !valuelist && aItem.getArrayFieldAdjusted(aPropP->groupFieldID+baseoffset,e_rep,true))) { // base field of one of the main fields does not exist or leaf field is already assigned, // or the group field entry is already in use (doesn't matter whether it is empty) // -> skip that repetition dostore = false; break; } else dostore = true; // at least one field exists, we might store } // - check if shared fields used for parameters are available; // must be enabled explicitly with const TParameterDefinition *paramP = aPropP->parameterDefs; while (paramP) { if (paramP->sharedField && mimeModeMatch(paramP->modeDependency) #ifndef NO_REMOTE_RULES && (!paramP->ruleDependency || isActiveRule(paramP->ruleDependency)) #endif ) { if (paramP->convdef.fieldid==FID_NOT_SUPPORTED) continue; // no field, no need to check it sInt16 e_fid = paramP->convdef.fieldid /* +baseoffset */; sInt16 e_rep = repoffset; aItem.adjustFidAndIndex(e_fid,e_rep); // - get base field TItemField *e_basefldP = aItem.getField(e_fid); TItemField *e_fldP = NULL; if (e_basefldP) e_fldP=e_basefldP->getArrayField(e_rep,true); // get leaf field, if it exists if (!e_basefldP || e_fldP) { // base field or leaf field is already in use // (unassigned is not good enough, otherwise we might end up adding information // to some other, previously parsed property using the same array field) // -> skip that repetition dostore=false; break; } } paramP=paramP->next; } // check if we can test more repetitions if (!dostore) { if (aRepArray[repid]+1next; } // while search for matching nameExts entry // abort if we can't store if (!dostore) { aText=p; // this is what we've read so far return false; } } // if name extension list not empty // Now baseoffset/repoffset are valid to be used for storage } while(true); // until parameter pass 1 & pass 2 done // parameters are all processed by now, decision made to store data (if !dostore, routine exits above) // - store the group tag value if we have one if (aPropP->groupFieldID!=FID_NOT_SUPPORTED) { TItemField *g_fldP = aItem.getArrayFieldAdjusted(aPropP->groupFieldID+baseoffset,repoffset,false); if (g_fldP) g_fldP->setAsString(aGroupName,aGroupNameLen); // store the group name (aGroupName might be NULL, that's ok) } if (aPropP->unprocessed) { if (*p==':') { // there is a value p++; // - get entire property value part, not checking for any separators, but converting to appchar (UTF-8) and unfolding decodeValue(encoding==enc_quoted_printable ? encoding : enc_none, charset, aMimeMode, 0, 0, p, val); // - add it to "unprocessed" value representation unprocessedVal += ':'; unprocessedVal += val; // - process this as a whole (de-escaping ONLY CRLFs) and assign to field if (!parseValue( unprocessedVal, &(aPropP->convdefs[0]), // the conversion definition baseoffset, // identifies base field repoffset, // repeat offset to base field / array index aItem, // the item where data goes to notempty, // set true if value(s) parsed are not all empty 0, // no value list separator aMimeMode, // MIME mode (older or newer vXXX format compatibility) false, // no parameter false, // not structured true // only de-escape linefeeds, but nothing else )) { return false; } } // if property has a value part } // if unprocessed property else { // - read and decode value(s) char sep=':'; // first value starts with colon // repeat until we have all values for (sInt16 i=0; inumValues || valuelist; i++) { if (*p!=sep && (aPropP->altvaluesep==0 || *p!=aPropP->altvaluesep)) { #ifdef SYDEBUG // Note: for valuelists, this is the normal loop exit case as we are not limited by numValues if (!valuelist) { // New behaviour: omitting values is ok (needed e.g. for T39m) DEBUGPRINTFX(DBG_PARSE,("TMimeDirProfileHandler::parseProperty: %s does not specify all values",TCFG_CSTR(aPropP->propname))); } #endif break; // all available values read } // skip separator p++; // get value(list) unfolded decodeValue(encoding,charset,aMimeMode,aPropP->numValues > 1 || valuelist ? aPropP->valuesep : 0,aPropP->altvaluesep,p,val); // check if we can store, otherwise just read over value // - get the conversion def for the value TConversionDef *convDef = &(aPropP->convdefs[valuelist ? 0 : i]); // always use convdef[0] for value lists // - store value if not a value list (but simple value or part of structured value), or store if // valuelist and repeat not yet exhausted, or if valuelist without repetition but combination separator // which allows to put multiple values into a single field if (!valuelist || repoffsetcombineSep)) { // convert and store value (or comma separated value-list, not to mix with valuelist-property!!) if (!parseValue( val, convDef, baseoffset, // identifies base field repoffset, // repeat offset to base field / array index aItem, // the item where data goes to notempty, // set true if value(s) parsed are not all empty ',', aMimeMode, // MIME mode (older or newer vXXX format compatibility) false, // no parameter aPropP->numValues > 1, // structured if multiple values false // normal, full de-escaping )) { PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,( "TMimeDirProfileHandler::parseProperty: %s: value not parsed: %s", TCFG_CSTR(aPropP->propname), val.c_str() )); return false; } // update repeat offset and repeat count if this is a value list if (valuelist && convDef->combineSep==0 && (notempty || !overwriteempty)) { // - update count for every non-empty value (for empty values only if overwriteempty is not set) if (repid>=0) aRepArray[repid]++; // next repetition repoffset+=repinc; // also update repeat offset } } else { // value cannot be stored PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,( "TMimeDirProfileHandler::parseProperty: %s: value not stored because repeat exhausted: %s", TCFG_CSTR(aPropP->propname), val.c_str() )); } // more values must be separated by the value sep char (default=';' but can be ',' e.g. for iCalendar 2.0 CATEGORIES) sep = aPropP->valuesep; } // for all values } // process values if (notempty && !valuelist) { // at least one of the components is not empty. Make sure all components are "touched" such that // in case of arrays, these are assigned even if empty for (sInt16 j=0; jnumValues; j++) { sInt16 fid=aPropP->convdefs[j].fieldid; if (fid>=0) { // requesting the pointer creates the field if it does not already exist aItem.getArrayFieldAdjusted(fid+baseoffset,repoffset,false); } } const TParameterDefinition *paramP = aPropP->parameterDefs; while (paramP) { if (paramP->sharedField && mimeModeMatch(paramP->modeDependency) #ifndef NO_REMOTE_RULES && (!paramP->ruleDependency || isActiveRule(paramP->ruleDependency)) #endif ) { sInt16 fid=paramP->convdef.fieldid; if (fid>=0) { aItem.getArrayFieldAdjusted(fid+baseoffset,repoffset,false); } } paramP=paramP->next; } } if (!valuelist && repid>=0 && (notempty || !overwriteempty) && !repoffsByGroup) { // we have used this repetition and actually stored values, so count it now // (unless we have stored an empty value only and overwriteempty is true, in // this case we don't increment, so next value found for this repetition will // overwrite empty value // Also, if repeat offset was found by group name, don't increment (aRepArray // is already updated in this case) aRepArray[repid]++; } // update read pointer past end of what we've scanned (but not necessarily up // to next property beginning) aText=p; // done, ok return true; } // TMimeDirProfileHandler::parseProperty // parse MIME-DIR from specified string into item bool TMimeDirProfileHandler::parseMimeDir(const char *aText, TMultiFieldItem &aItem) { // start with empty item aItem.cleardata(); // reset item time zone before parsing fHasExplicitTZ = false; // none set explicitly fItemTimeContext = fReceiverTimeContext; // default to user context fDelayedProps.clear(); // start w/o delayed props fParsedTzidSet.clear(); // start w/o time zones // start parsing on root level if (parseLevels(aText,aItem,fProfileDefinitionP,true)) { // make sure all supported (=available) fields are at least empty (but not missing!) aItem.assignAvailables(); return true; } else return false; } // TMimeDirProfileHandler::parseMimeDir // parameter string for QP encoding. Needed when skipping otherwise unknown properties #define QP_ENCODING_PARAM "ENCODING=QUOTED-PRINTABLE" // parse MIME-DIR level from specified string into item bool TMimeDirProfileHandler::parseLevels( const char *&aText, TMultiFieldItem &aItem, const TProfileDefinition *aProfileP, bool aRootLevel ) { appChar c; cAppCharP p, propname, groupname; sInt32 n, gn; sInt16 foundmandatory=0; const sInt16 maxreps = 50; sInt16 repArray[maxreps]; bool atStart = aRootLevel; // reset repetition counts for (sInt16 k=0; klevelConvdef.fieldid; if (fid>=0) { // field defined for level entry // - make sure field exists and is assigned empty value at least aItem.getFieldRef(fid).assignEmpty(); const TEnumerationDef *enumP = aProfileP->levelConvdef.enumdefs; if (enumP) { // if enumdefs, content is set to first enumdef's enumval (NOT enumtext!!) aItem.getField(fid)->setAsString(TCFG_CSTR(enumP->enumval)); } } // skip possible leading extra LF and CR and whitespace here // NOTE: Magically server sends XML CDATA with 0x0D 0x0D 0x0A for example while (isspace(*aText)) aText++; // parse input text property by property do { // start of property parsing // - reset TZID flag fPropTZIDtctx = TCTX_UNKNOWN; // - prepare scanning p=aText; propname = p; // assume name starts at beginning of text n = 0; groupname = NULL; // assume no group gn = 0; // determine property name end (and maybe group name) do { c=*p; if (!c) { // end of text reached w/o property name POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("parseMimeDir: no property name found, text=%s",aText)); return false; } if (c==':' || c==';') break; // handle grouping if (c=='.') { // this is a group name (or element of it) // - remember the group name if (!groupname) groupname = propname; gn = p-groupname; // size of groupname // - prop name starts after group name (and dot) propname = ++p; // skip group n = 0; continue; } // next char p++; n++; } while(true); // propname points to start, p points to end of property name, n=name size // - search through all properties bool propparsed=false; // - check for BEGIN and END if (strucmp(propname,"BEGIN",n)==0) { // BEGIN encountered p = propname+n; // - skip possible parameters for broken implementations like Intellisync/Synchrologic if (*p==';') while (*p && *p!=':') p++; // - isolate value size_t l=0; const char *lnam=p+1; while (*(lnam+l)>=0x20) l++; // calculate length of value p=lnam+l; // advance scanning pointer to terminator n=0; // prevent false advancing at end of prop loop if (atStart) { // value must be level name, else this is a bad profile if (strucmp(lnam,TCFG_CSTR(aProfileP->levelName),l)!=0) { POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("parseMimeDir: root level BEGIN has bad value: %s",aText)); return false; } atStart=false; // no special lead-in check any more propparsed=true; } else { // value determines new level to enter if (disabledLevels==0) { // search for sublevel const TProfileDefinition *subprofileP = aProfileP->subLevels; while (subprofileP) { // check if ( mimeModeMatch(subprofileP->modeDependency) && strucmp(lnam,TCFG_CSTR(subprofileP->levelName),l)==0 ) { // sublevel found, process while ((uInt8)(*p)<0x20) p++; // advance scanning pointer to beginning of next property // check special case first if (subprofileP->profileMode==profm_vtimezones) { // vTimeZone is handled specially string s2; string s = "END:"; s.append(subprofileP->levelName); n = s.size(); // size of lead-out cAppCharP e = strstr(p,s.c_str()); if (e==NULL) return false; // unterminated vTimeZone sublevel s.assign(p,e-p); // everything between lead-in and lead-out p = e+n; // advance pointer beyond VTIMEZONES appendStringAsUTF8(s.c_str(), s2, chs_utf8, lem_cstr, false); timecontext_t tctx; // identify or add this in the session zones string tzid; if (VTIMEZONEtoInternal(s2.c_str(), tctx, getSessionZones(), getDbgLogger(), &tzid)) { // time zone identified #ifdef SYDEBUG string tzname; TimeZoneContextToName(tctx, tzname, getSessionZones()); PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,("parseMimeDir: VTIMEZONE with ID='%s' parsed to internal time zone '%s'",tzid.c_str(),tzname.c_str())); #endif // remember it by original name for TZID parsing fParsedTzidSet[tzid] = tctx; } else { POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("parseMimeDir: could not parse VTIMEZONE: %s",s.c_str())); } } else { // ordinary non-root level if (!parseLevels(p,aItem,subprofileP,false)) return false; } // - now continue on this level propparsed=true; break; } // next subprofileP=subprofileP->next; } if (!propparsed) { // no matching sublevel found, disable this level disabledLevels=1; } } else { // already disabled, just nest disabledLevels++; } } // BEGIN not on rootlevel } // BEGIN found else if (strucmp(propname,"END",n)==0) { // END encountered p = propname+n; // - skip possible parameters for broken implementations like Intellisync/Synchrologic if (*p==';') while (*p && *p!=':') p++; // - isolate value size_t l=0; const char *lnam=p+1; while (*(lnam+l)>=0x20) l++; // calculate length of value p=lnam+l; // advance scanning pointer to terminator n=0; // prevent false advancing at end of prop loop // check if (disabledLevels>0) { // end of a disabled level, just un-nest disabledLevels--; } else { // should be end of active level, check name if (strucmp(lnam,TCFG_CSTR(aProfileP->levelName),l)!=0) { POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("parseMimeDir: unexpected END value: %s",aText)); return false; } // correct end of level aText=p; // points to terminator, which is correct for end-of-level // break scanner loop break; } } // END found else if (disabledLevels==0) { if (atStart) { POBJDEBUGPRINTFX(getSession(),DBG_ERROR,("parseMimeDir: root level does not start with BEGIN: %s",aText)); return false; } // not disabled level const TPropertyDefinition *propP = aProfileP->propertyDefs; #ifndef NO_REMOTE_RULES const TPropertyDefinition *otherRulePropP = NULL; // default property which is used if none of the rule-dependent in the group was used bool ruleSpecificParsed = false; uInt16 propGroup=0; // group identifier (all props with same name have same group ID) #endif const TPropertyDefinition *parsePropP; while(propP) { // compare if ( mimeModeMatch(propP->modeDependency) && // none or matching mode dependency strwildcmp(propname,TCFG_CSTR(propP->propname),n)==0 // wildcards allowed (for unprocessed properties for example) ) { // found property def with matching name (and MIME mode) // check all in group (=all subsequent with same name) #ifndef NO_REMOTE_RULES propGroup=propP->propGroup; ruleSpecificParsed=false; otherRulePropP=NULL; while (propP && propP->propGroup==propGroup && propP->propGroup!=0) #else do #endif { // still in same group (= same name) #ifndef NO_REMOTE_RULES // check if this property should be used for parsing parsePropP=NULL; // do not parse by default if (propP->dependsOnRemoterule) { // check if depends on current rule if (propP->ruleDependency==NULL) { // this is the "other"-rule dependent variant // - just remember for now otherRulePropP=propP; } else if (isActiveRule(propP->ruleDependency)) { // specific for the applied rule parsePropP=propP; // default to expand current prop // now we have expanded a rule-specific property (blocks parsing of "other"-rule dependent prop) ruleSpecificParsed=true; } } else { // does not depend on rule, parse anyway parsePropP=propP; } // check if this is last prop of list propP=propP->next; if (!(propP && propP->propGroup==propGroup) && otherRulePropP && !ruleSpecificParsed) { // End of alternatives for parsing this property, no rule-specific parsed yet, and there is a otherRuleProp // parse "other"-rule's property instead parsePropP=otherRulePropP; } #else // simply parse it parsePropP=propP; propP=propP->next; #endif // now parse (or save for delayed parsing later) if (parsePropP) { if (parsePropP->delayedProcessing) { // buffer parameters needed to parse later PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,("parseMimeDir: property %s parsing delayed, rank=%hd",TCFG_CSTR(parsePropP->propname),parsePropP->delayedProcessing)); TDelayedPropParseParams dppp; dppp.delaylevel = parsePropP->delayedProcessing; dppp.start = p; dppp.groupname = groupname; dppp.groupnameLen = gn; dppp.propDefP = parsePropP; TDelayedParsingPropsList::iterator pos; for (pos=fDelayedProps.begin(); pos!=fDelayedProps.end(); pos++) { // insert at end or before first occurrence of higer delay if ((*pos).delaylevel>dppp.delaylevel) { fDelayedProps.insert(pos,dppp); break; } } if (pos==fDelayedProps.end()) fDelayedProps.push_back(dppp); // update mandatory count (even if we haven't parsed it yet) if (parsePropP->mandatory) foundmandatory++; // skip for now p=propname+n; propparsed=true; // but is "parsed" for loop break; // parse next } if (parseProperty( p, // where to start interpreting property, will be updated past end of poperty aItem, // item to store data into parsePropP, // the (matching) property definition repArray, maxreps, fMimeDirMode, // MIME-DIR mode groupname, gn, propname, n )) { // property parsed successfully propparsed=true; // count mandarory properties found if (parsePropP->mandatory) foundmandatory++; break; // parse next } // if not successfully parsed, continue with next property which // can have the same name, but possibly different parameter definitions } // if parseProp } // while same property group (poperties with same name) #ifdef NO_REMOTE_RULES while(false); // if no remote rules, we do not loop #endif if (propparsed) break; // do not continue outer loop if inner loop has parsed a prop successfully } // if name matches (=start of group found) else { // not start of group // - next property propP=propP->next; } } // while all properties } // else: neither BEGIN nor END if (!propparsed) { // unknown property PDEBUGPRINTFX(DBG_PARSE,("parseMimeDir: property not parsed (unknown or not storable): %" FMT_LENGTH(".30") "s",FMT_LENGTH_LIMITED(30,aText))); // skip parsed part (the name) p=propname+n; } // p is now end of parsed part // - skip rest up to EOLN (=any ctrl char) // Note: we need to check if this is quoted-printable, otherwise we might NOT cancel soft breaks bool isqp = false; while ((c=*p)!=0) { if (isEndOfLineOrText(c)) break; // end of line or string if (c==';' && *(p+1)) { if (strucmp(p+1, QP_ENCODING_PARAM, strlen(QP_ENCODING_PARAM))==0) { c = *(p+1+strlen(QP_ENCODING_PARAM)); isqp = c==':' || c==';'; // the property is QP encoded, we need to cancel QP softbreaks while looking for end of property } } p=nextunfolded(p,fMimeDirMode,isqp); // cancel soft breaks if we are in QP encoded property } // - skip entire EOLN (=all control chars in sequence %%%) while (*p && (uInt8)(*p)<'\x20') p=nextunfolded(p,fMimeDirMode); // set next property start point aText=p; } while (*aText); // exit if end of string // now parse delayed ones (list is in delay order already) if (aRootLevel) { // process delayed properties only after entire record is parsed (i.e. when we are at root level here) TDelayedParsingPropsList::iterator pos; for (pos=fDelayedProps.begin(); pos!=fDelayedProps.end(); pos++) { p = (*pos).start; // where to start parsing PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,( "parseMimeDir: now parsing delayed property rank=%hd: %" FMT_LENGTH(".30") "s", (*pos).delaylevel, FMT_LENGTH_LIMITED(30,(*pos).start) )); if (parseProperty( p, // where to start interpreting property, will be updated past end of property aItem, // item to store data into (*pos).propDefP, // the (matching) property definition repArray, maxreps, fMimeDirMode, // MIME-DIR mode (*pos).groupname, (*pos).groupnameLen, "X-delayed", 9 // dummy, unprocessed properties must not be parsed in delayed mode! )) { // count mandarory properties found //%%% moved this to when we queue the delayed props, as mandatory count is per-profile //if ((*pos).propDefP->mandatory) foundmandatory++; } else { // delayed parsing failed PDEBUGPRINTFX(DBG_PARSE,("parseMimeDir: failed delayed parsing of property %" FMT_LENGTH(".30") "s",FMT_LENGTH_LIMITED(30,(*pos).start))); } } // we don't need them any more - clear delayed props fDelayedProps.clear(); } // verify integrity if (foundmandatorynumMandatoryProperties) { // not all mandatory properties found POBJDEBUGPRINTFX(getSession(),DBG_ERROR,( "parseMimeDir: missing %d of %hd mandatory properies", aProfileP->numMandatoryProperties-foundmandatory, aProfileP->numMandatoryProperties )); // unsuccessful parsing return false; } // successful parsing done return true; // %%%%% NOTE: exactly those fields in aItem should be assigned // which are available in source and target. // possibly this should be done in prepareForSendTo (o.‰) of // MultiFieldItem... } // TMimeDirProfileHandler::parseLevels void TMimeDirProfileHandler::getOptionsFromDatastore(void) { // get options datastore if one is related; // ignore the session from getSession() here because we need // to distinguish between script context and normal sync context // (the former has no datastore, the latter has) TSyncSession *sessionP = fRelatedDatastoreP ? fRelatedDatastoreP->getSession() : NULL; if (sessionP) { fReceiverCanHandleUTC = sessionP->fRemoteCanHandleUTC; fVCal10EnddatesSameDay = sessionP->fVCal10EnddatesSameDay; fReceiverTimeContext = sessionP->fUserTimeContext; // default to user context fDontSendEmptyProperties = sessionP->fDontSendEmptyProperties; fDefaultOutCharset = sessionP->fDefaultOutCharset; fDefaultInCharset = sessionP->fDefaultInCharset; fDoQuote8BitContent = sessionP->fDoQuote8BitContent; fDoNotFoldContent = sessionP->fDoNotFoldContent; fTreatRemoteTimeAsLocal = sessionP->fTreatRemoteTimeAsLocal; fTreatRemoteTimeAsUTC = sessionP->fTreatRemoteTimeAsUTC; #ifndef NO_REMOTE_RULES fActiveRemoteRules = sessionP->fActiveRemoteRules; // copy the list #endif } } // generate Data item (includes header and footer) void TMimeDirProfileHandler::generateText(TMultiFieldItem &aItem, string &aString) { // get options datastore if one is related getOptionsFromDatastore(); #ifdef SYDEBUG PDEBUGPRINTFX(DBG_GEN+DBG_HOT,("Generating....")); aItem.debugShowItem(DBG_DATA+DBG_GEN); #endif // baseclass just generates MIME-DIR fBeginEndNesting=0; // no BEGIN out yet generateMimeDir(aItem,aString); #ifdef SYDEBUG if (PDEBUGTEST(DBG_GEN+DBG_USERDATA)) { // note, do not use debugprintf because string is too long PDEBUGPRINTFX(DBG_GEN,("Generated: ")); PDEBUGPUTSXX(DBG_GEN+DBG_USERDATA,aString.c_str(),0,true); } #endif } // TMimeDirProfileHandler::generateText // parse Data item (includes header and footer) bool TMimeDirProfileHandler::parseText(const char *aText, stringSize aTextSize, TMultiFieldItem &aItem) { //#warning "aTextSize must be checked!" // get options datastore if one is related getOptionsFromDatastore(); // baseclass just parses MIME-DIR fBeginEndNesting = 0; // no BEGIN found yet #ifdef SYDEBUG if (PDEBUGTEST(DBG_PARSE)) { // very detailed, show item being parsed PDEBUGPRINTFX(DBG_PARSE+DBG_HOT,("Parsing: ")); PDEBUGPUTSXX(DBG_PARSE+DBG_USERDATA,aText,0,true); } #endif if (parseMimeDir(aText,aItem)) { if (fBeginEndNesting) { PDEBUGPRINTFX(DBG_ERROR,("TMimeDirProfileHandler parsing ended with NestCount<>0: %hd",fBeginEndNesting)); return false; // unmatched BEGIN/END } #ifdef SYDEBUG PDEBUGPRINTFX(DBG_PARSE,("Successfully parsed: ")); aItem.debugShowItem(DBG_DATA+DBG_PARSE); #endif return true; } else { PDEBUGPRINTFX(DBG_ERROR,("Failed parsing item")); return false; } } // TMimeDirProfileHandler::parseText bool TMimeDirProfileHandler::parseForProperty(SmlItemPtr_t aItemP, const char *aPropName, string &aString) { if (aItemP && aItemP->data) return parseForProperty(smlPCDataToCharP(aItemP->data),aPropName,aString); else return false; } // TMimeDirProfileHandler::parseForProperty // scan Data item for specific property (used for quick type tests) bool TMimeDirProfileHandler::parseForProperty(const char *aText, const char *aPropName, string &aString) { uInt16 n=strlen(aPropName); while (*aText) { const char *p=aText; // find property end do { p=nextunfolded(p,fMimeDirMode,true); } while ((*p)>=0x20); // p now points to property end if (strucmp(aText,aPropName,n)==0 && aText[n]==':') { aText+=n+1; // start of value aString.assign(aText,p-aText); // save value return true; } // find next property beginning do { p=nextunfolded(p,fMimeDirMode,true); } while (*p && ((*p)<0x20)); // set to beginning of next aText=p; } // not found return false; } // TMimeDirProfileHandler::parseForProperty // helper for newCTDataPropList void TMimeDirProfileHandler::enumerateLevels(const TProfileDefinition *aProfileP, SmlPcdataListPtr_t *&aPcdataListPP, const TProfileDefinition *aSelectedProfileP, TMimeDirItemType *aItemTypeP) { // only if mode matches if (!mimeModeMatch(aProfileP->modeDependency)) return; // add name of this profile if... // ...generally enabled for CTCap (shownIfSelectedOnly=false), independent of what other profiles might be selected (e.g. VALARM) // ...this is the explicitly selected profile (like VTODO while creating DS 1.2 devinf for the tasks datastor) // ...no profile is specifically selected, which means we want to see ALL profiles (like a DS 1.1 vCalendar type outside ) // This means, the only case a name is NOT added are those with those having showlevel="no" when ANOTHER profile is explicitly selected. if (!aProfileP->shownIfSelectedOnly || aProfileP==aSelectedProfileP || aSelectedProfileP==NULL) { aPcdataListPP = addPCDataStringToList(TCFG_CSTR(aProfileP->levelName),aPcdataListPP); // check for special subprofiles if (aProfileP->profileMode==profm_vtimezones) { // has STANDARD and DAYLIGHT subprofiles aPcdataListPP = addPCDataStringToList("STANDARD",aPcdataListPP); aPcdataListPP = addPCDataStringToList("DAYLIGHT",aPcdataListPP); } // add names of subprofiles, if any const TProfileDefinition *subprofileP = aProfileP->subLevels; while (subprofileP) { // If this profile is the selected profile, ALL subprofiles must be shown in all cases (so we pass NULL) enumerateLevels(subprofileP,aPcdataListPP,aProfileP==aSelectedProfileP ? NULL : aSelectedProfileP, aItemTypeP); // next subprofileP=subprofileP->next; } } } // TMimeDirProfileHandler::enumerateLevels // add a CTDataProp item to a CTDataPropList static void addCTDataPropToListIfNotExists( SmlDevInfCTDataPropPtr_t aCTDataPropP, // existing CTDataProp item data structure, ownership is passed to list SmlDevInfCTDataPropListPtr_t *aCTDataPropListPP // adress of list root pointer (which points to existing item list or NULL) ) { // add it to the list (but only if we don't already have it) while (*aCTDataPropListPP) { // check name if (strcmp(smlPCDataToCharP(aCTDataPropP->prop->name),smlPCDataToCharP((*aCTDataPropListPP)->data->prop->name))==0) { //%%% we can add merging parameters here as well // same property already exists, forget this one smlFreeDevInfCTDataProp(aCTDataPropP); aCTDataPropP = NULL; break; } aCTDataPropListPP = &((*aCTDataPropListPP)->next); } // if not detected duplicate, add it now if (aCTDataPropP) { addCTDataPropToList(aCTDataPropP,aCTDataPropListPP); } } // addCTDataPropToListIfNotExists // add a CTData describing a property (as returned by newDevInfCTData()) // as a new property without parameters to a CTDataPropList static void addNewPropToListIfNotExists( SmlDevInfCTDataPtr_t aPropCTData, // CTData describing property SmlDevInfCTDataPropListPtr_t *aCTDataPropListPP // adress of list root pointer (which points to existing item list or NULL) ) { SmlDevInfCTDataPropPtr_t propdataP = SML_NEW(SmlDevInfCTDataProp_t); propdataP->param = NULL; // no params propdataP->prop = aPropCTData; addCTDataPropToListIfNotExists(propdataP, aCTDataPropListPP); } // addNewPropToListIfNotExists // helper for newCTDataPropList void TMimeDirProfileHandler::enumerateProperties(const TProfileDefinition *aProfileP, SmlDevInfCTDataPropListPtr_t *&aPropListPP, const TProfileDefinition *aSelectedProfileP, TMimeDirItemType *aItemTypeP) { // remember start of properties // add all properties of this level (if enabled) // Note: if this is the explicitly selected (sub)profile, it will be shown under any circumstances if ((!aProfileP->shownIfSelectedOnly || aProfileP==aSelectedProfileP || aSelectedProfileP==NULL) && mimeModeMatch(aProfileP->modeDependency)) { if (aProfileP->profileMode==profm_vtimezones) { // Add properties of VTIMEZONE here addNewPropToListIfNotExists(newDevInfCTData("TZID"),aPropListPP); addNewPropToListIfNotExists(newDevInfCTData("DTSTART"),aPropListPP); addNewPropToListIfNotExists(newDevInfCTData("RRULE"),aPropListPP); addNewPropToListIfNotExists(newDevInfCTData("TZOFFSETFROM"),aPropListPP); addNewPropToListIfNotExists(newDevInfCTData("TZOFFSETTO"),aPropListPP); addNewPropToListIfNotExists(newDevInfCTData("TZNAME"),aPropListPP); } else { // normal profile defined in config, add properties as defined in profile, avoid duplicates const TPropertyDefinition *propP = aProfileP->propertyDefs; while (propP) { if (propP->showInCTCap && mimeModeMatch(propP->modeDependency)) { // - new list entry in CTCap (if property to be shown) SmlDevInfCTDataPropPtr_t propdataP = SML_NEW(SmlDevInfCTDataProp_t); propdataP->param = NULL; // default to no params // - add params, if needed SmlDevInfCTDataListPtr_t *nextParamPP = &(propdataP->param); const TParameterDefinition *paramP = propP->parameterDefs; while(paramP) { // check if parameter is enabled for being shown in CTCap if (paramP->showInCTCap && mimeModeMatch(paramP->modeDependency)) { // For some older 1.1 devices (in particular Nokia 7610), enum values of default params // in pre-MIME-DIR must be shown as param NAMES (not enums). // But newer 1.2 Nokias like E90 need proper TYPE param with valEnums (when run in 1.2 mode. E90 is fine with 7610 style for 1.1) // So: normally (fEnumDefaultPropParams==undefined==-1), we show 7610 style for 1.1 and E90 style for 1.2. // and ENUMDEFAULTPROPPARAMS() can be used to control this behaviour when needed if ( paramP->defaultparam && fMimeDirMode==mimo_old && ( (getSession()->fEnumDefaultPropParams==-1 && getSession()->getSyncMLVersion()fEnumDefaultPropParams==1) // ..or explicitly enabled ) ) { // add the name extending enum values as param names TEnumerationDef *enumP = paramP->convdef.enumdefs; while(enumP) { if (!TCFG_ISEMPTY(enumP->enumtext) && enumP->enummode==enm_translate) { // create new param list entry nextParamPP = addCTDataToList(newDevInfCTData(TCFG_CSTR(enumP->enumtext)),nextParamPP); } enumP=enumP->next; } } else { // - proper parameter with valEnum list SmlDevInfCTDataPtr_t paramdataP = newDevInfCTData(TCFG_CSTR(paramP->paramname)); // - add valenums if any SmlPcdataListPtr_t *nextValenumPP = &(paramdataP->valenum); TEnumerationDef *enumP = paramP->convdef.enumdefs; while(enumP) { if (!TCFG_ISEMPTY(enumP->enumtext) && enumP->enummode==enm_translate) { // create new valenum list entry nextValenumPP = addPCDataStringToList(TCFG_CSTR(enumP->enumtext),nextValenumPP); } enumP=enumP->next; } // - add it to the params list nextParamPP = addCTDataToList(paramdataP,nextParamPP); } } // if param to be shown paramP=paramP->next; } // - get possible size limit and notruncate flag uInt32 sz=0; // no size limit by default bool noTruncate=false; // by default, truncation is ok TFieldDefinition *fieldDefP = NULL; for (sInt16 i=0; inumValues; i++) { sInt16 fid=propP->convdefs[0].fieldid; if (fid>=0) { // Field type (we need it later when we have a maxsize, which is only allowed together with a datatype in 1.1 DTD) if (!fieldDefP) fieldDefP = fItemTypeP->getFieldDefinition(fid); // Size uInt32 fsz = fItemTypeP->getFieldOptions(fid)->maxsize; // only if related datastore (i.e. SyncML context) // - smallest non-fieldblock (excludes RRULE-type special conversions), not-unknown and not-unlimited maxsize is used if (fieldBlockSize(propP->convdefs[0])==1 && (sz==0 || sz>fsz) && fsz!=FIELD_OPT_MAXSIZE_NONE && sInt32(fsz)!=FIELD_OPT_MAXSIZE_UNKNOWN) sz=fsz; // If any field requests no truncation, report noTruncate if (getSession()->getSyncMLVersion()>=syncml_vers_1_2 && fItemTypeP->getFieldOptions(fid)->notruncate) noTruncate=true; } } // - calculate our own maxoccur (value in our field options is not used for now %%%) uInt32 maxOccur=0; if (getSession()->getSyncMLVersion()>=syncml_vers_1_2) { if (propP->nameExts) { // name extensions determine repeat count TPropNameExtension *extP = propP->nameExts; while (extP) { if (!extP->readOnly) { if (extP->maxRepeat==REP_ARRAY) { // no limit maxOccur=0; // unlimited break; // prevent other name extensions to intervene } else { // limited number of occurrences, add to count maxOccur+=extP->maxRepeat; } } // next extP=extP->next; } } else { // not repeating: property may not occur more than once maxOccur=1; } } // - some SyncML 1.0 clients crash when they see type/size if (!(getSession()->fShowTypeSzInCTCap10) && getSession()->getSyncMLVersion()<=syncml_vers_1_0) { sz = 0; // prevent size/type in SyncML 1.0 (as old clients like S55 crash if it is included) } // - find out if we need to show the type (before SyncML 1.2, Size MUST be preceeded by DataType) // On the other hand, DataType MUST NOT be used in 1.2 for VersIt types!!! cAppCharP dataType=NULL; if (sz!=0 && fieldDefP && getSession()->getSyncMLVersion()type]; if (dt==proptype_text) dt=proptype_chr; // SyncML 1.1 does not have "text" type if (dt!=proptype_unknown) dataType = propDataTypeNames[dt]; } // - add property data descriptor propdataP->prop = newDevInfCTData(TCFG_CSTR(propP->propname),sz,noTruncate,maxOccur,dataType); if (propP->convdefs && (propP->convdefs->convmode & CONVMODE_MASK)==CONVMODE_VERSION) { // special case: add version valenum addPCDataStringToList(aItemTypeP->getTypeVers(),&(propdataP->prop->valenum)); } // add it if not already same-named property in the list, otherwise discard it addCTDataPropToListIfNotExists(propdataP,aPropListPP); } // if to be shown in CTCap propP=propP->next; } // while properties } // normal profile defined in config // add properties of other levels const TProfileDefinition *subprofileP = aProfileP->subLevels; while (subprofileP) { // only if the current profile is the selected profile, properties of ALL contained subprofiles will be shown // (otherwise, selection might be within the current profile, so we need to pass on the selection) enumerateProperties(subprofileP,aPropListPP,aProfileP==aSelectedProfileP ? NULL : aSelectedProfileP, aItemTypeP); // next subprofileP=subprofileP->next; } } } // TMimeDirProfileHandler::enumerateProperties // helper: enumerate filter properties void TMimeDirProfileHandler::enumeratePropFilters(const TProfileDefinition *aProfileP, SmlPcdataListPtr_t &aFilterProps, const TProfileDefinition *aSelectedProfileP, TMimeDirItemType *aItemTypeP) { // add all properties of this level (if enabled) // Note: if this is the explicitly selected (sub)profile, it will be shown under any circumstances if (!aProfileP->shownIfSelectedOnly || aProfileP==aSelectedProfileP) { const TPropertyDefinition *propP = aProfileP->propertyDefs; while (propP) { if ( propP->canFilter && (propP->showInCTCap || aProfileP==aSelectedProfileP) && propP->convdefs && (propP->convdefs[0].convmode & CONVMODE_MASK)!=CONVMODE_VERSION && (propP->convdefs[0].convmode & CONVMODE_MASK)!=CONVMODE_PRODID ) { // Note: properties of explicitly selected (sub)profiles will be shown anyway, // as only purpose of suppressing properties in devInf is to avoid // duplicate listing in case of multiple subprofiles in ONE CTCap. // - add property name to filter property list addPCDataStringToList(TCFG_CSTR(propP->propname), &aFilterProps); } // if to be shown in filterCap propP=propP->next; } } // add properties of other levels const TProfileDefinition *subprofileP = aProfileP->subLevels; while (subprofileP) { if (aSelectedProfileP==NULL || subprofileP==aSelectedProfileP) { // only if the current profile is the selected profile, filter properties of ALL contained subprofiles will be shown enumeratePropFilters(subprofileP,aFilterProps,aProfileP==aSelectedProfileP ? NULL : aSelectedProfileP, aItemTypeP); } // next subprofileP=subprofileP->next; } } // TMimeDirProfileHandler::enumeratePropFilters #ifdef OBJECT_FILTERING // Filtering: add keywords and property names to filterCap void TMimeDirProfileHandler::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDescriptor, TSyncItemType *aItemTypeP) { // get pointer to selected variant (if none, all variants will be shown) const TProfileDefinition *selectedSubprofileP = (const TProfileDefinition *)aVariantDescriptor; // get pointer to mimedir item type TMimeDirItemType *mimeDirItemTypeP; GET_CASTED_PTR(mimeDirItemTypeP,TMimeDirItemType,aItemTypeP,"MIME-DIR profile used with non-MIME-DIR type"); // add name of all properties that have canFilter attribute set enumeratePropFilters(fProfileDefinitionP,aFilterProps,selectedSubprofileP, mimeDirItemTypeP); } // TMimeDirProfileHandler::addFilterCapPropsAndKeywords #endif // OBJECT_FILTERING // generates SyncML-Devinf property list for type SmlDevInfCTDataPropListPtr_t TMimeDirProfileHandler::newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor, TSyncItemType *aItemTypeP) { TMimeDirItemType *itemTypeP = static_cast(aItemTypeP); // get pointer to selected variant (if none, all variants will be shown) const TProfileDefinition *selectedSubprofileP = (const TProfileDefinition *)aVariantDescriptor; // generate new list SmlDevInfCTDataPropListPtr_t proplistP = SML_NEW(SmlDevInfCTDataPropList_t); SmlDevInfCTDataPropListPtr_t nextpropP = proplistP; // generate BEGIN property // - add property contents nextpropP->data = SML_NEW(SmlDevInfCTDataProp_t); nextpropP->data->param=NULL; // no params // - property data descriptor SmlDevInfCTDataPtr_t pdataP = newDevInfCTData("BEGIN"); nextpropP->data->prop = pdataP; // - add valenums for all profiles and subprofiles SmlPcdataListPtr_t *liststartPP = &pdataP->valenum; enumerateLevels(fProfileDefinitionP,liststartPP,selectedSubprofileP,itemTypeP); // generate END property nextpropP->next = SML_NEW(SmlDevInfCTDataPropList_t); nextpropP=nextpropP->next; // - add property contents nextpropP->data = SML_NEW(SmlDevInfCTDataProp_t); nextpropP->data->param=NULL; // no params // - property data descriptor pdataP = newDevInfCTData("END"); nextpropP->data->prop = pdataP; // - add valenums for all profiles and subprofiles liststartPP = &pdataP->valenum; enumerateLevels(fProfileDefinitionP,liststartPP,selectedSubprofileP,itemTypeP); // generate all other properties of all levels nextpropP->next=NULL; // in case no properties are found SmlDevInfCTDataPropListPtr_t *propstartPP = &nextpropP->next; enumerateProperties(fProfileDefinitionP,propstartPP,selectedSubprofileP,itemTypeP); // done return proplistP; } // TMimeDirProfileHandler::newCTDataPropList // Analyze CTCap part of devInf bool TMimeDirProfileHandler::analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP, TSyncItemType *aItemTypeP) { TMimeDirItemType *itemTypeP = static_cast(aItemTypeP); // assume all sublevels enabled (as long as we don't get a // BEGIN CTCap listing all the available levels. //aItemTypeP->setLevelOptions(NULL,true); // check details SmlDevInfCTDataPropListPtr_t proplistP = aCTCapP->prop; if (proplistP) { if (!itemTypeP->fReceivedFieldDefs) { // there is a propList, and we haven't scanned one already for this type // (could be the case for DS 1.2 vCalendar where we get events & tasks separately) // so disable all non-mandatory fields first (available ones will be re-enabled) for (sInt16 i=0; ifFieldDefinitionsP->numFields(); i++) { itemTypeP->getFieldOptions(i)->available=false; } // force mandatory properties to be always "available" setfieldoptions(NULL,fProfileDefinitionP,itemTypeP); } // now we have received fields itemTypeP->fReceivedFieldDefs=true; } while (proplistP) { // get property descriptor SmlDevInfCTDataPtr_t propP = proplistP->data->prop; // see if we have this property in any of the levels setfieldoptions(propP,fProfileDefinitionP,itemTypeP); // next property in CTCap proplistP=proplistP->next; } // properties in CTCap return true; } // TMimeDirProfileHandler::analyzeCTCap // %%%%% dummy for now bool TMimeDirProfileHandler::setLevelOptions(const char *aLevelName, bool aEnable, TMimeDirItemType *aItemTypeP) { // do it recursively. // %%% we need to have a flag somewhere for these // don't we have one already??? // YES, its fSubLevelRestrictions (supposedly a bitmask for max 32 levels) // %%% checking the levels and ignoring incoming/outgoing items with // wrong levels must be added later return true; } // TMimeDirProfileHandler::setLevelOptions // enable fields related to aPropP property in profiles recursively // or (if aPropP is NULL), enable fields of all mandatory properties void TMimeDirProfileHandler::setfieldoptions( const SmlDevInfCTDataPtr_t aPropP, // property to enable fields for, NULL if all mandatory properties should be enabled const TProfileDefinition *aProfileP, TMimeDirItemType *aItemTypeP ) { // set defaults sInt32 propsize = FIELD_OPT_MAXSIZE_NONE; sInt32 maxOccur = 0; // none by default bool noTruncate=false; const char* propname = NULL; TFieldOptions *fo; // get params from CTCap property definition (if any) if (aPropP) { // get name of CTCap property propname = smlPCDataToCharP(aPropP->name); // get possible maxSize if (aPropP->maxsize) { if (getSession()->fIgnoreDevInfMaxSize) { // remote rule flags maxsize as invalid (like in E90), flag it as unknown (but possibly limited) propsize = FIELD_OPT_MAXSIZE_UNKNOWN; } else { // treat as valid StrToLong(smlPCDataToCharP(aPropP->maxsize),propsize); } } // get possible maxOccur if (aPropP->maxoccur) { StrToLong(smlPCDataToCharP(aPropP->maxoccur),maxOccur); } // get possible noTruncate if (aPropP->flags & SmlDevInfNoTruncate_f) noTruncate=true; // check for BEGIN to check for enabled sublevels if (strucmp(propname,"BEGIN")==0) { // check ValEnums that denote supported levels SmlPcdataListPtr_t valenumP = aPropP->valenum; if (valenumP) { // we HAVE supported BEGINs listed, so disable all levels first // and have them individually enabled below according to ValEnums setLevelOptions(NULL,false,aItemTypeP); } while (valenumP) { // get sublevel name const char *slname = smlPCDataToCharP(valenumP->data); setLevelOptions(slname,true,aItemTypeP); // enable this one // check next valenumP=valenumP->next; } } } // if enabling for specified property // enable all fields related to this property and set options const TPropertyDefinition *propdefP = aProfileP->propertyDefs; sInt16 j,q,i,o,r,bs; while (propdefP) { // compare if ( (propname==NULL && propdefP->mandatory) || (propname && (strucmp(propname,TCFG_CSTR(propdefP->propname))==0)) ) { // match (or enabling mandatory) -> enable all fields that are related to this property // - values for (i=0; inumValues; i++) { // base field ID j=propdefP->convdefs[i].fieldid; bs=fieldBlockSize(propdefP->convdefs[i]); if (j>=0) { // field supported TPropNameExtension *pneP = propdefP->nameExts; if (pneP) { while(pneP) { o = pneP->fieldidoffs; if (o>=0) { r=0; // for all repetitions (but only for first if mode is REP_ARRAY // or field is an array) do { // make entire field block addressed by this convdef available // and set maxoccur/notruncate for (q=0; qgetFieldOptions(j+o+q); if (fo) fo->available=true; } // set size if specified (only for first field in block) fo = aItemTypeP->getFieldOptions(j+o); if (fo) { if (propsize!=FIELD_OPT_MAXSIZE_NONE) fo->maxsize=propsize; // set maxoccur if specified if (maxOccur!=0) fo->maxoccur=maxOccur; // set noTruncate if (noTruncate) fo->notruncate=true; } // next o+=pneP->repeatInc; } while ( ++r < pneP->maxRepeat && pneP->maxRepeat!=REP_ARRAY #ifdef ARRAYFIELD_SUPPORT && !aItemTypeP->getFieldDefinition(j)->array #endif ); } pneP=pneP->next; } } else { // single variant, non-repeating property // make entire field block addressed by this convdef available for (q=0; qgetFieldOptions(j+q); if (fo) fo->available=true; } // set size if specified fo = aItemTypeP->getFieldOptions(j); if (fo) { if (propsize!=FIELD_OPT_MAXSIZE_NONE) fo->maxsize=propsize; // set maxoccur if specified if (maxOccur!=0) fo->maxoccur=maxOccur; // set noTruncate if (noTruncate) fo->notruncate=true; } } } } // enable values // - parameter values const TParameterDefinition *paramdefP = propdefP->parameterDefs; while(paramdefP) { // base field ID j=paramdefP->convdef.fieldid; bs=fieldBlockSize(paramdefP->convdef); if (j>=0) { // field supported TPropNameExtension *pneP = propdefP->nameExts; if (pneP) { while(pneP) { o = pneP->fieldidoffs; if (o>=0) { r=0; // for all repetitions do { // make entire field block addressed by this convdef available for (q=0; qgetFieldOptions(j+o+q); if (fo) fo->available=true; } // set size if specified fo = aItemTypeP->getFieldOptions(j+o); if (propsize!=FIELD_OPT_MAXSIZE_NONE && fo) fo->maxsize=propsize; // Note: MaxOccur and NoTruncate are not relevant for parameter values // next o+=pneP->repeatInc; } while ( ++r < pneP->maxRepeat && pneP->maxRepeat!=REP_ARRAY #ifdef ARRAYFIELD_SUPPORT && !aItemTypeP->getFieldDefinition(j)->array #endif ); } pneP=pneP->next; } } else { // single variant, non-repeating property // make entire field block addressed by this convdef available for (q=0; qgetFieldOptions(j+q); if (fo) fo->available=true; } // set size if specified fo = aItemTypeP->getFieldOptions(j); if (propsize!=FIELD_OPT_MAXSIZE_NONE && fo) fo->maxsize=propsize; } } paramdefP=paramdefP->next; } // while } // if known property propdefP=propdefP->next; } // now enable fields in all subprofiles const TProfileDefinition *subprofileP = aProfileP->subLevels; while (subprofileP) { setfieldoptions(aPropP,subprofileP,aItemTypeP); // next subprofileP=subprofileP->next; } } // TMimeDirProfileHandler::setfieldoptions // set mode (for those profiles that have more than one, like MIME-DIR's old/standard) void TMimeDirProfileHandler::setProfileMode(sInt32 aMode) { fProfileMode = aMode; // determine derived mime mode switch (aMode) { case PROFILEMODE_OLD : fMimeDirMode=mimo_old; break; // 1 = old = vCard 2.1 / vCalendar 1.0 default : fMimeDirMode=mimo_standard; break; // anything else = standard = vCard 3.0 / iCalendar 2.0 style } } // TMimeDirProfileHandler::setProfileMode #ifndef NO_REMOTE_RULES void TMimeDirProfileHandler::setRemoteRule(const string &aRemoteRuleName) { TSessionConfig *scP = getSession()->getSessionConfig(); TRemoteRulesList::iterator pos; for(pos=scP->fRemoteRulesList.begin();pos!=scP->fRemoteRulesList.end();pos++) { if((*pos)->fElementName == aRemoteRuleName) { // only this rule and all rules included by it rule must be active fActiveRemoteRules.clear(); activateRemoteRule(*pos); break; } } } // TMimeDirProfileHandler::setRemoteRule void TMimeDirProfileHandler::activateRemoteRule(TRemoteRuleConfig *aRuleP) { // activate this rule (similar code as in TSyncSession::checkRemoteSpecifics() fActiveRemoteRules.push_back(aRuleP); // - apply options that have a value //if (aRuleP->fLegacyMode>=0) fLegacyMode = aRuleP->fLegacyMode; //if (aRuleP->fLenientMode>=0) fLenientMode = aRuleP->fLenientMode; //if (aRuleP->fLimitedFieldLengths>=0) fLimitedRemoteFieldLengths = aRuleP->fLimitedFieldLengths; if (aRuleP->fDontSendEmptyProperties>=0) fDontSendEmptyProperties = aRuleP->fDontSendEmptyProperties; if (aRuleP->fDoQuote8BitContent>=0) fDoQuote8BitContent = aRuleP->fDoQuote8BitContent; if (aRuleP->fDoNotFoldContent>=0) fDoNotFoldContent = aRuleP->fDoNotFoldContent; //if (aRuleP->fNoReplaceInSlowsync>=0) fNoReplaceInSlowsync = aRuleP->fNoReplaceInSlowsync; if (aRuleP->fTreatRemoteTimeAsLocal>=0) fTreatRemoteTimeAsLocal = aRuleP->fTreatRemoteTimeAsLocal; if (aRuleP->fTreatRemoteTimeAsUTC>=0) fTreatRemoteTimeAsUTC = aRuleP->fTreatRemoteTimeAsUTC; if (aRuleP->fVCal10EnddatesSameDay>=0) fVCal10EnddatesSameDay = aRuleP->fVCal10EnddatesSameDay; //if (aRuleP->fIgnoreDevInfMaxSize>=0) fIgnoreDevInfMaxSize = aRuleP->fIgnoreDevInfMaxSize; //if (aRuleP->fIgnoreCTCap>=0) fIgnoreCTCap = aRuleP->fIgnoreCTCap; //if (aRuleP->fDSPathInDevInf>=0) fDSPathInDevInf = aRuleP->fDSPathInDevInf; //if (aRuleP->fDSCgiInDevInf>=0) fDSCgiInDevInf = aRuleP->fDSCgiInDevInf; //if (aRuleP->fUpdateClientDuringSlowsync>=0) fUpdateClientDuringSlowsync = aRuleP->fUpdateClientDuringSlowsync; //if (aRuleP->fUpdateServerDuringSlowsync>=0) fUpdateServerDuringSlowsync = aRuleP->fUpdateServerDuringSlowsync; //if (aRuleP->fAllowMessageRetries>=0) fAllowMessageRetries = aRuleP->fAllowMessageRetries; //if (aRuleP->fStrictExecOrdering>=0) fStrictExecOrdering = aRuleP->fStrictExecOrdering; //if (aRuleP->fTreatCopyAsAdd>=0) fTreatCopyAsAdd = aRuleP->fTreatCopyAsAdd; //if (aRuleP->fCompleteFromClientOnly>=0) fCompleteFromClientOnly = aRuleP->fCompleteFromClientOnly; //if (aRuleP->fRequestMaxTime>=0) fRequestMaxTime = aRuleP->fRequestMaxTime; if (aRuleP->fDefaultOutCharset!=chs_unknown) fDefaultOutCharset = aRuleP->fDefaultOutCharset; if (aRuleP->fDefaultInCharset!=chs_unknown) fDefaultInCharset = aRuleP->fDefaultInCharset; // - possibly override decisions that are otherwise made by session // Note: this is not a single option because we had this before rule options were tristates. //if (aRuleP->fForceUTC>0) fRemoteCanHandleUTC=true; //if (aRuleP->fForceLocaltime>0) fRemoteCanHandleUTC=false; // now recursively activate included rules TRemoteRulesList::iterator pos; for(pos=aRuleP->fSubRulesList.begin();pos!=aRuleP->fSubRulesList.end();pos++) { activateRemoteRule(*pos); } } // check if given rule (by name, or if aRuleName=NULL by rule pointer) is active bool TMimeDirProfileHandler::isActiveRule(TRemoteRuleConfig *aRuleP) { TRemoteRulesList::iterator pos; for(pos=fActiveRemoteRules.begin();pos!=fActiveRemoteRules.end();pos++) { if ((*pos)==aRuleP) return true; } // no match return false; } // TMimeDirProfileHandler::isActiveRule #endif // NO_REMOTE_RULES // - check mode bool TMimeDirProfileHandler::mimeModeMatch(TMimeDirMode aMimeMode) { return aMimeMode==numMimeModes || // not dependent on MIME mode aMimeMode==fMimeDirMode; } // TMimeDirProfileHandler::mimeModeMatch /* end of TMimeDirProfileHandler implementation */ // Utility functions // ----------------- /// @brief checks two timestamps if they represent an all-day event /// @param[in] aStart start time /// @param[in] aEnd end time /// @return 0 if not allday, x=1..n if allday (spanning x days) by one of the /// following criteria: /// - both start and end at midnight of the same day (= 1 day) /// - both start and end at midnight of different days (= 1..n days) /// - start at midnight and end between 23:59:00 and 23:59:59 of /// same or different days (= 1..n days) uInt16 AlldayCount(lineartime_t aStart, lineartime_t aEnd) { lineartime_t startTime = lineartime2timeonly(aStart); if (startTime!=0) return 0; // start not at midnight -> no allday lineartime_t endTime = lineartime2timeonly(aEnd); if (endTime==0) { if (aStart==aEnd) aEnd += linearDateToTimeFactor; // one day } else if (endTime>= (23*MinsPerHour+59)*SecsPerMin*secondToLinearTimeFactor) { // add one minute to make sure we reach into next day aEnd += SecsPerMin*secondToLinearTimeFactor; } else return 0; // allday criteria not met // now calculate number of days return (aEnd-aStart) / linearDateToTimeFactor; } // AlldayCount /// @brief checks two timestamps if they represent an all-day event /// @param[in] aStartFldP start time field /// @param[in] aEndFldP end time field /// @param[in] aTimecontext context to use to check allday criteria for all non-floating timestamps /// or UTC timestamps only (if aContextForUTC is set). /// @param[in] aContextForUTC if set, context is only applied for UTC timestamps, other non-floatings are checked as-is /// @return 0 if not allday, x=1..n if allday (spanning x days) uInt16 AlldayCount(TItemField *aStartFldP, TItemField *aEndFldP, timecontext_t aTimecontext, bool aContextForUTC) { if (!aStartFldP->isBasedOn(fty_timestamp)) return 0; if (!aEndFldP->isBasedOn(fty_timestamp)) return 0; TTimestampField *startFldP = static_cast(aStartFldP); TTimestampField *endFldP = static_cast(aEndFldP); // check in specified time zone if originally UTC (or aContextForUTC not set), otherwise check as-is timecontext_t tctx; lineartime_t start = startFldP->getTimestampAs(!aContextForUTC || TCTX_IS_UTC(startFldP->getTimeContext()) ? aTimecontext : TCTX_UNKNOWN, &tctx); lineartime_t end = endFldP->getTimestampAs(!aContextForUTC || TCTX_IS_UTC(endFldP->getTimeContext()) ? aTimecontext : TCTX_UNKNOWN, &tctx); return AlldayCount(start,end); } // AlldayCount /// @brief makes two timestamps represent an all-day event /// @param[in/out] aStart start time within the first day, will be set to midnight (00:00:00) /// @param[in/out] aEnd end time within the last day or at midnight of the next day, /// will be set to midnight of the next day /// @param[in] aDays if>0, this is used to calculate the aEnd timestamp (aEnd input is /// ignored then) void MakeAllday(lineartime_t &aStart, lineartime_t &aEnd, sInt16 aDays) { lineartime_t duration = 0; // first calculate duration (assuming that even if there's a timezone problem, both // timestamps will be affected so duration is still correct) if (aDays<=0) { // use implicit duration duration = aEnd-aStart; } else { // use explicit duration duration = aDays * linearDateToTimeFactor; } // truncate start to midnight aStart = lineartime2dateonlyTime(aStart); // calculate timestamp that for sure is in next day aEnd = aStart + duration + linearDateToTimeFactor-1; // one unit less than a full day, ensures that 00:00:00 input will remain same day // make day-only of next day aEnd = lineartime2dateonlyTime(aEnd); } // MakeAllday /// @brief makes two timestamp fields represent an all-day event /// @param[in/out] aStartFldP start time within the first day, will be set to dateonly /// @param[in/out] aEndFldP end time within the last day or at midnight of the next day, will be set to dateonly of the next day /// @param[in] aTimecontext context to calculate day boundaries in (if timestamp is not already floating), can be floating to treat in context of start date /// @param[in] aDays if>0, this is used to calculate the aEnd timestamp (aEnd input is /// ignored then) /// @note fields will be made floating and dateonly void MakeAllday(TItemField *aStartFldP, TItemField *aEndFldP, timecontext_t aTimecontext, sInt16 aDays) { if (!aStartFldP->isBasedOn(fty_timestamp)) return; if (!aEndFldP->isBasedOn(fty_timestamp)) return; TTimestampField *startFldP = static_cast(aStartFldP); TTimestampField *endFldP = static_cast(aEndFldP); // adjust in specified time zone (or floating) timecontext_t tctx; lineartime_t start = startFldP->getTimestampAs(aTimecontext,&tctx); // context must match, unless either requested-as-is or timestamp is already floating if (tctx!=aTimecontext && !TCTX_IS_UNKNOWN(aTimecontext) && !TCTX_IS_UNKNOWN(tctx)) return; // cannot do anything // get end in same context as start is lineartime_t end = endFldP->getTimestampAs(tctx); // make allday MakeAllday(start,end,aDays); // store back and floating + dateonly tctx = TCTX_UNKNOWN | TCTX_DATEONLY; // for output format capable of date-only startFldP->setTimestampAndContext(start,tctx); endFldP->setTimestampAndContext(end,tctx); } // MakeAllday } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/mimedirprofile.h0000755000373300037200000010615512424517753026040 0ustar00nightlyallusers00000000000000/* * File: mimedirprofile.h * * Author: Lukas Zeller (luz@plan44.ch) * * TMimeDirItemType * base class for MIME DIR based content types (vCard, vCalendar...) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2009-01-09 : luz : created from mimediritemtype.h * */ #ifndef MimeDirProfile_H #define MimeDirProfile_H // includes #include "syncitemtype.h" #include "multifielditemtype.h" #include "engine_defs.h" #include namespace sysync { // conversion mode is a basic value plus some optional flags #define CONVMODE_MASK 0xFF // 8 bits for basic convmode // flags #define CONVMODE_FLAG_EXTFMT 0x0100 // use ISO8601 extended format for rendering date and time #define CONVMODE_FLAG_MILLISEC 0x0200 // render milliseconds // special field conversion modes #define CONVMODE_NONE 0 // no conversion (just string copy), but includes value list parsing and enum conversion #define CONVMODE_VERSION 1 // version #define CONVMODE_PRODID 2 // PRODID #define CONVMODE_TIMESTAMP 3 // forced full timestamp, even if this is a date field #define CONVMODE_DATE 4 // forced date-only, even if this is a timestamp field #define CONVMODE_AUTODATE 5 // in vCal 1.0 style formats, force to timestamp representation, in MIME-DIR, show depending on actual value #define CONVMODE_AUTOENDDATE 6 // in vCal 1.0 style formats, force to timestamp representation - if actual value is a date, subtract 1 unit (to show end of previous day rather than midnight of next) #define CONVMODE_TZ 7 // time zone offset in ISO8601 hh:mm representation for vCalendar 1.0 representation #define CONVMODE_DAYLIGHT 8 // DAYLIGHT property to describe time zone with DST in vCalendar 1.0 #define CONVMODE_TZID 9 // time zone ID for iCalendar 2.0 #define CONVMODE_EMPTYONLY 10 // same as CONVMODE_NONE, except that assignment occurs only if field is still empty #define CONVMODE_BITMAP 11 // values, converted to integer, are interpreted as bit numbers #define CONVMODE_BLOB_B64 12 // 1:1 storage of (decoded) value into field. When encoding, b64 is used #define CONVMODE_MAILTO 13 // 1:1 storage of (decoded) value into field. When encoding, b64 is used #define CONVMODE_VALUETYPE 14 // automatic VALUE parameter e.g. for timestamp fields that contain a date-only value (VALUE=DATE) or duration (VALUE=DURATION) #define CONVMODE_MULTIMIX 15 // special mode for mapping enums to bits (like CONVMODE_BITMAP), but mixed from multiple fields and with option to store as-is (special enum "value" syntax needed) #define CONVMODE_FULLVALUETYPE 16 // explicit VALUE parameter, does not assume a default #define CONVMODE_BLOB_AUTO 17 // like CONVMODE_BLOB_B64, but if data consists of printable ASCII-chars only, no B64 encoding is used // derived type modes start here #define CONVMODE_MIME_DERIVATES 20 // define those that we want to implement (also work as getConfMode conditionals) #define CONVMODE_RRULE CONVMODE_MIME_DERIVATES+0 // RRULE, needs RRULE field block // special numvals #define NUMVAL_LIST -1 // property contains a value list (like EXDATE) rather than individual values (like N) #define NUMVAL_REP_LIST -2 // same as NUMVAL_LIST, but property is output as repetition of the entire property rather than as list in single property // profile internal MIME-DIR mode (externally, profile mode is set by PROFILEMODE_xxx and setProfileMode() typedef enum { mimo_old, // vCard 2.1 type encoding, CRLF, default params mimo_standard, // MIME DIR conformant, vCard 3.0 mode numMimeModes } TMimeDirMode; // VTIMEZONE generation mode (what timezone definition rules to include) typedef enum { vtzgen_current, vtzgen_start, vtzgen_end, vtzgen_range, vtzgen_openend, numVTimeZoneGenModes } TVTimeZoneGenMode; typedef enum { tzidgen_default, tzidgen_olson, numTzIdGenModes } TTzIdGenMode; // name extension map typedef uInt32 TNameExtIDMap; // forward class TProfileDefinition; class TPropertyDefinition; class TMimeDirItemType; class TRemoteRuleConfig; // enumeration modes typedef enum { enm_translate, // translation from value to name and vice versa enm_prefix, // enumtext/enumval are prefixes of enm_default_name, // default name when translating from value to name enm_default_value, // default value when translating from name to value enm_ignore, // ignore value or name numEnumModes } TEnumMode; // enumeration element definition class TEnumerationDef : noncopyable { public: // constructor/destructor TEnumerationDef(const char *aEnumName, const char *aEnumVal, TEnumMode aMode, sInt16 aNameExtID=-1); ~TEnumerationDef(); // next item TEnumerationDef *next; // enum text TCFG_STRING enumtext; // enum translation (value to be stored in DB field), NULL if no translation TCFG_STRING enumval; // enum mode TEnumMode enummode; // ID (0..31) identifying ID of this value for property name extension purposes // -1 means value is irrelevant to name extension sInt16 nameextid; }; // TEnumerationDef // conversion & storage definition class TConversionDef : noncopyable { public: // constructor/destructor TConversionDef(); ~TConversionDef(); // tools void addEnum(const char *aEnumName, const char *aEnumVal, TEnumMode aMode=enm_translate); void addEnumNameExt(TPropertyDefinition *aProp, const char *aEnumName, const char *aEnumVal=NULL, TEnumMode aMode=enm_translate); TConversionDef *setConvDef(sInt16 aFieldId=FID_NOT_SUPPORTED,sInt16 aConvMode=0,char aCombSep=0); const TEnumerationDef *findEnumByName(const char *aName, sInt16 n=0) const; const TEnumerationDef *findEnumByVal(const char *aVal, sInt16 n=0) const; // base field id for parameter (will be offset for name-extended and repeated properties) sInt16 fieldid; // VARIDX_UNDEFINED (negative) means value is not supported // enumeration list, NULL if none TEnumerationDef *enumdefs; // conversion sInt16 convmode; // 0=direct, 1..n=special procedure needed char combineSep; // 0=no combination, char=char to be used to combine multiple values in field }; // TConversionDef // parameter definition class TParameterDefinition : noncopyable { public: // constructor/destructor TParameterDefinition(const char *aName, bool aDefault, bool aExtendsName, bool aShowNonEmpty, bool aShowInCTCap, TMimeDirMode aModeDep, bool aSharedField); ~TParameterDefinition(); // tools TConversionDef *setConvDef(sInt16 aFieldId=FID_NOT_SUPPORTED,sInt16 aConvMode=0,char aCombSep=0) { return convdef.setConvDef(aFieldId,aConvMode,aCombSep); }; TNameExtIDMap getExtIDbit(const char *aEnumName, sInt16 n=0); // next TParameterDefinition *next; // parameter name TCFG_STRING paramname; // NULL for terminator // used as default param, for example for type tags which have no explicit TYPE= in older vXX formats bool defaultparam; // parameter exists only in specific MIME-DIR mode (set to numMimeModes for non-dependent parameter) TMimeDirMode modeDependency; // parameter can extend property name by enumerated values with nameextid's bool extendsname; // if parameter has non-empty value, property will be treated as non-empty bool shownonempty; // flag if parameter should be (not necessarily IS, depending on SyncML version) shown in CTCap bool showInCTCap; // flag if parameter field is shared between different properties and thus needs to be checked // when looking for the offset where repeating properties get stored bool sharedField; // conversion information TConversionDef convdef; #ifndef NO_REMOTE_RULES // rule processing is simpler than with properties: // a parameter is expanded or parsed if no rule was set or the given // rule is active TRemoteRuleConfig *ruleDependency; // name of remote rule dependency (will be resolved to set ruleDependency) TCFG_STRING dependencyRuleName; #endif }; // TParameterDefinition // property name extension by values of parameters class TPropNameExtension : noncopyable { public: // constructor/destructor TPropNameExtension( TNameExtIDMap aMusthave_ids, TNameExtIDMap aForbidden_ids, TNameExtIDMap aAddtlSend_ids, sInt16 aFieldidoffs, sInt16 aMaxRepeat, sInt16 aRepeatInc, sInt16 aMinShow, bool aOverwriteEmpty, bool aReadOnly, sInt16 aRepeatID ); ~TPropNameExtension(); // link to next, NULL if end TPropNameExtension *next; // Bitmap, has bit set for each nameextid which must be present for property // in order to store it with given fid offset. // - This nameextids will also be used to generate properties with // corresponding parameter values. TNameExtIDMap musthave_ids; // Bitmap, has bit set for each nameextid which MAY NOT be present for // property in order to store it with given fid offset. TNameExtIDMap forbidden_ids; // Bitmap, has bit set for each nameextid which should additionally be present // when sending the property (such as VOICE for telephone), but is not a musthave. TNameExtIDMap addtlSend_ids; // field ID offset to be used for storage of property value(s) and // non-name extending parameter value(s) on musthave_ids/forbidden_ids matches // OFFS_NOSTORE : prevents storing/generating of this property value sInt16 fieldidoffs; // allowable repeat count (adding repeatInc to all related field ids when property is repeated) // - if set to REP_REWRITE (=0), value can occur multiple times, but later occurrences // override earlier ones (no offset incrementing) // - if set to REP_ARRAY, repeat is unlimited (should be used with array fields only) sInt16 maxRepeat; // if maxRepeat>1, the offset is incremented by the given value // (to allow multi-value properties to be repeated blockwise, not field-by-field) sInt16 repeatInc; // minimal number of times the property should be shown, even if repetitions do not contain // any values. If set to 0, property will not show at all if no values are there sInt16 minShow; // flag to allow overwriting empty instances with next non-empty instance of same property bool overwriteEmpty; // flag for name extension variants only used for parsing, not for generating bool readOnly; // unique (over all TPropNameExtension) ID used for keeping track of repetitions at parsing sInt16 repeatID; }; // TPropNameExtension // property definition class TPropertyDefinition : noncopyable { public: // constructor/destructor TPropertyDefinition(const char* aName, sInt16 aNumVals, bool aMandatory, bool aShowInCTCap, bool aSuppressEmpty, uInt16 aDelayedProcessing, char aValuesep, char aAltValuesep, uInt16 aPropertyGroupID, bool aCanFilter, TMimeDirMode aModeDep, sInt16 aGroupFieldID, bool aAllowFoldAtSep); ~TPropertyDefinition(); // tools TParameterDefinition *addParam(const char *aName, bool aDefault, bool aExtendsName, bool aShowNonEmpty=false, bool aShowInCTCap=false, TMimeDirMode aModeDep=numMimeModes, bool aSharedField=false); void addNameExt(TProfileDefinition *aRootProfile, // for profile-global RepID generation TNameExtIDMap aMusthave_ids, TNameExtIDMap aForbidden_ids, TNameExtIDMap aAddtlSend_ids, sInt16 aFieldidoffs, sInt16 aMaxRepeat=1, sInt16 aRepeatInc=1, sInt16 aMinShow=-1, bool aOverwriteEmpty=true, // show all, but overwrite empty repetitions bool aReadOnly=false, // not a parsing alternative sInt16 aShareCountOffs=0 // not sharing the repeat ID with a previous name extension ); TConversionDef *setConvDef(sInt16 aValNum, sInt16 aFieldId=FID_NOT_SUPPORTED,sInt16 aConvMode=0,char aCombSep=0); TParameterDefinition *findParameter(const char *aNam, sInt16 aLen=0); // next in list TPropertyDefinition *next; // property name TCFG_STRING propname; // property name extension list. // - If NULL, property is non-repeatable and has no name extensions at all TPropNameExtension *nameExts; // ID of group field sInt16 groupFieldID; // number of values sInt16 numValues; // conversion specification(s) for each value TConversionDef *convdefs; // if set, property is not processed but stored entirely (unfolded, but otherwise unprocessed) in the first defined // This gets automatically set when a property name contains an asterisk wildcard character bool unprocessed; // if set, property has a list of values that are stored in an array field or // by offseting fid. Note that a PropNameExtension is needed to allow storing more // than a single value. If valuelist=true, convdefs should only contain a single entry, // other entries are not used bool valuelist; // if set, valuelist properties should be rendered by repeating the property instead of creating a list of values in one property bool expandlist; // char to separate value list items (defaults to semicolon) char valuesep; char altvaluesep; // second value separator to respect when parsing (generating always uses valuesep) bool allowFoldAtSep; // allow folding at value separators (for mimo_old, even if it inserts an extra space) // parameter listm TParameterDefinition *parameterDefs; // mandatory bool mandatory; // flag if property should be shown in CTCap bool showInCTCap; // flag if property can be used in filters (and will be shown in FilterCap, when showInCTCap is true as well bool canFilter; // flag if property should be suppressed if it has only empty values bool suppressEmpty; // delayed processing order (for things like RRULE that must be processed at the end) uInt16 delayedProcessing; // property exists only in specific MIME-DIR mode (set to numMimeModes for non-dependent properties) TMimeDirMode modeDependency; // internal for creation of name extension IDs sInt16 nextNameExt; // property group ID uInt16 propGroup; // starting at 1, groups subsequent props that have the same name #ifndef NO_REMOTE_RULES // set if property enabled only if ruleDependency matches session's applied rule (even if NULL = no rule must be applied) bool dependsOnRemoterule; // the rule that must be selected to enable this property. If NULL, this property // is used only if NO rule is selected. TRemoteRuleConfig *ruleDependency; #ifdef CONFIGURABLE_TYPE_SUPPORT // name of remote rule dependency (will be resolved to set ruleDependency) TCFG_STRING dependencyRuleName; #endif #endif }; // TPropertyDefinition // enumeration modes typedef enum { profm_custom, // custom defined profile/subprofile profm_vtimezones, // VTIMEZONE profile(s), expands to a VTIMEZONE for every time zone referenced by convmode TZID fields numProfileModes } TProfileModes; // Profile level definition class TProfileDefinition : noncopyable { public: // constructor/destructor TProfileDefinition( TProfileDefinition *aParentProfileP, // parent profile const char *aProfileName, // name sInt16 aNumMandatory, bool aShowInCTCapIfSelectedOnly, TProfileModes aProfileMode, TMimeDirMode aModeDep ); ~TProfileDefinition(); // tools TConversionDef *setConvDef(sInt16 aFieldId=FID_NOT_SUPPORTED,sInt16 aConvMode=0,char aCombSep=0) { return levelConvdef.setConvDef(aFieldId,aConvMode,aCombSep); }; TProfileDefinition *addSubProfile( const char *aProfileName, // name sInt16 aNumMandatory, bool aShowInCTCapIfSelectedOnly, TProfileModes aProfileMode = profm_custom, TMimeDirMode aModeDep = numMimeModes ); TPropertyDefinition *addProperty( const char *aName, // name sInt16 aNumValues, // number of values, NUMVAL_LIST/NUMVAL_REP_LIST if it is a value list bool aMandatory, // mandatory bool aShowInCTCap, // show in CTCap bool aSuppressEmpty, // suppress empty ones on send uInt16 aDelayedProcessing=0, // delayed processing when parsed, 0=immediate processing, 1..n=delayed char aValuesep=';', // value separator uInt16 aPropertyGroupID=0, // property group ID (alternatives for same-named properties should have same ID>0) bool aCanFilter=false, // can be filtered -> show in filter cap TMimeDirMode aModeDep=numMimeModes, // property valid only for specific MIME mode char aAltValuesep=0, // no alternate separator sInt16 aGroupFieldID=FID_NOT_SUPPORTED, // no group field bool aAllowFoldAtSep=false // do not fold at separators when it would insert extra spaces ); void usePropertiesOf(TProfileDefinition *aProfile); TPropertyDefinition *getPropertyDef(const char *aPropName); sInt16 getPropertyMainFid(const char *aPropName, uInt16 aIndex); TProfileDefinition *findProfile(const char *aNam); // next in chain TProfileDefinition *next; // parent profile TProfileDefinition *parentProfile; // NULL if root // Profile Level name TCFG_STRING levelName; // Level existence control field (affected/tested when level entered) // NOTE: levelConvdef.enumdefs is used specially: it points to a SINGLE entry, // not an array (no terminator!!). This entry contains IN THE enumval // field (NOT enumtext!!!) the value to be stored in the field // indicated by fieldid when this level is entered with BEGIN TConversionDef levelConvdef; // this subprofile (and related properties and sub-sub-profiles) // is shown in devInf only if it is explictly selected or if all are selected bool shownIfSelectedOnly; // number of mandatory properties in this level sInt16 numMandatoryProperties; // property list, NULL if none TPropertyDefinition *propertyDefs; // sublevel list, NULL if none TProfileDefinition *subLevels; // next repeat ID for this (root) profile sInt16 nextRepID; // profile mode (custom profile or predefined profile like vTIMEZONE) TProfileModes profileMode; // dependency on MIME-dir mode TMimeDirMode modeDependency; private: bool ownsProps; }; // TProfileDefinition // MIME profile definition config class TMIMEProfileConfig : public TProfileConfig { typedef TProfileConfig inherited; public: TMIMEProfileConfig(const char* aName, TConfigElement *aParentElement); virtual ~TMIMEProfileConfig(); // handler factory virtual TProfileHandler *newProfileHandler(TMultiFieldItemType *aItemTypeP); // properties // - root profile TProfileDefinition *fRootProfileP; // - options bool fUnfloatFloating; // set if floating timestamps should always be unfloated into item time zone TVTimeZoneGenMode fVTimeZoneGenMode; // how outgoing VTIMEZONE records should be generated TTzIdGenMode fTzIdGenMode; // what type of TZIDs should be generated protected: // check config elements #ifdef CONFIGURABLE_TYPE_SUPPORT virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); public: virtual void localResolve(bool aLastPass); protected: virtual void nestedElementEnd(void); // parse conversion mode bool getConvMode(cAppCharP aText, sInt16 &aConvMode); #endif virtual void clear(); private: #ifdef CONFIGURABLE_TYPE_SUPPORT // parsing help bool getConvAttrs(const char **aAttributes, sInt16 &aFid, sInt16 &aConvMode, char &aCombSep); bool getMask(const char **aAttributes, const char *aName, TParameterDefinition *aParamP, TNameExtIDMap &aMask); bool processPosition(TParameterDefinition *aParamP, const char **aAttributes); // parsing vars TProfileDefinition *fOpenProfile; // profile being parsed TPropertyDefinition *fOpenProperty; // property being parsed TParameterDefinition *fOpenParameter; // parameter being parsed TConversionDef *fOpenConvDef; // conversion definition being parsed TPropertyDefinition *fLastProperty; // last property added in profile (to build groups) uInt16 fPropertyGroupID; // property grouping #endif }; // TMIMEProfileConfig // delayed property parsing info typedef struct { uInt16 delaylevel; const char *start; const char *groupname; size_t groupnameLen; const TPropertyDefinition *propDefP; } TDelayedPropParseParams; // delayed property parsing list typedef std::list TDelayedParsingPropsList; // used time context set typedef std::set TTCtxSet; // parsed TZID map typedef std::map TParsedTzidSet; class TMimeDirProfileHandler : public TProfileHandler { typedef TProfileHandler inherited; public: // constructor TMimeDirProfileHandler( TMIMEProfileConfig *aMIMEProfileCfgP, TMultiFieldItemType *aItemTypeP ); // destructor virtual ~TMimeDirProfileHandler(); #ifdef OBJECT_FILTERING // filtering // - get field index of given filter expression identifier. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); // - add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDescriptor, TSyncItemType *aItemTypeP); #endif // - obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor, TSyncItemType *aItemTypeP); // - Analyze CTCap part of devInf virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP, TSyncItemType *aItemTypeP); // set profile options // - mode (for those profiles that have more than one, like MIME-DIR's old/standard) virtual void setProfileMode(sInt32 aMode); #ifndef NO_REMOTE_RULES // set specific remote rule and activate the behavior defined by it; // to be used only in script context, inside a session the session // properties are used instead virtual void setRemoteRule(const string &aRemoteRuleName); #endif // generate Text Data (includes header and footer) virtual void generateText(TMultiFieldItem &aItem, string &aString); // parse Data item (includes header and footer) virtual bool parseText(const char *aText, stringSize aTextSize, TMultiFieldItem &aItem); // scan for specific property value string (for version check) bool parseForProperty(const char *aText, const char *aPropName, string &aString); bool parseForProperty(SmlItemPtr_t aItemP, const char *aPropName, string &aString); // get profile definition TProfileDefinition *getProfileDefinition(void) { return fProfileDefinitionP; }; private: // Settable options // - profile mode sInt32 fProfileMode; // - derived from profile mode: MIME dir mode TMimeDirMode fMimeDirMode; // - ability of receiver to handle UTC bool fReceiverCanHandleUTC; // - how end dates should be formatted bool fVCal10EnddatesSameDay; // - empty property policy bool fDontSendEmptyProperties; // - default output charset TCharSets fDefaultOutCharset; // - default input interpretation charset TCharSets fDefaultInCharset; // - user time context timecontext_t fReceiverTimeContext; // - set if any 8-bit content must be encoded QUOTED-PRINTABLE bool fDoQuote8BitContent; // - set if no line folding should be done bool fDoNotFoldContent; // - time handling bool fTreatRemoteTimeAsLocal; bool fTreatRemoteTimeAsUTC; #ifndef NO_REMOTE_RULES // - dependency on certain remote rule(s) TRemoteRulesList fActiveRemoteRules; // list of active remote rules that might influence behaviour bool isActiveRule(TRemoteRuleConfig *aRuleP); // check if given rule is among the active ones #endif // vars TMIMEProfileConfig *fProfileCfgP; // the MIME-DIR profile config element // property definitions TProfileDefinition *fProfileDefinitionP; // BEGIN/END nesting sInt16 fBeginEndNesting; // time zone management bool fHasExplicitTZ; // parsed or generated explicit time zone for entire item (CONVMODE_TZ) timecontext_t fItemTimeContext; // time zone context for entire item, is copy of session's user context as long as fHasExplicitTZ not set timecontext_t fPropTZIDtctx; // property level time zone context - is set whenever a CONVMODE_TZID is successfully parsed or generated, reset at property start TTCtxSet fUsedTCtxSet; // all time contexts used in this item (for generating) lineartime_t fEarliestTZDate; // earliest date/time generated using a time context from fUsedTCtxSet lineartime_t fLatestTZDate; // latest date/time generated using a time context from fUsedTCtxSet TParsedTzidSet fParsedTzidSet; // all time contexts parsed in from VTIMEZONE // delayed generation of VTIMEZONE subprofile (after all TZID are collected in fUserTctxSet) const TProfileDefinition *fVTimeZonePendingProfileP; // the profile definition, NULL if none size_t fVTimeZoneInsertPos; // where to insert VTIMEZONE // delayed processing TDelayedParsingPropsList fDelayedProps; // list of properties to parse out-of-order // helper void getOptionsFromDatastore(void); protected: // generate MIME-DIR from item into string object void generateMimeDir(TMultiFieldItem &aItem, string &aString); // parse MIME-DIR from specified string into item bool parseMimeDir(const char *aText, TMultiFieldItem &aItem); // special field translations (to be overridden in derived classes) // - returns the size of the field block (how many fids in sequence) related // to a given convdef (for multi-field conversion modes such as CONVMODE_RRULE virtual sInt16 fieldBlockSize(const TConversionDef &aConvDef); // - field value to string for further MIME-DIR generation processing virtual bool fieldToMIMEString( TMultiFieldItem &aItem, // the item where data goes to sInt16 aFid, // the field ID (can be NULL for special conversion modes) sInt16 aArrIndex, // the repeat offset to handle array fields const TConversionDef *aConvDefP, // the conversion definition record string &aString // output string ); // - single MIME-DIR value string to field (to be overridden in derived classes) virtual bool MIMEStringToField( const char *aText, // the value text to assign or add to the field const TConversionDef *aConvDefP, // the conversion definition record TMultiFieldItem &aItem, // the item where data goes to sInt16 aFid, // the field ID (can be NULL for special conversion modes) sInt16 aArrIndex // the repeat offset to handle array fields ); private: // helpers for CTCap/FilterCap // - set field options (enabled, maxsize, maxoccur, notruncate) of fields related to aPropP property in profiles recursively // or (if aPropP is NULL), enable fields of all mandatory properties void setfieldoptions( const SmlDevInfCTDataPtr_t aPropP, // property to enable fields for, NULL if all mandatory properties should be enabled const TProfileDefinition *aProfileP, TMimeDirItemType *aItemTypeP ); // - set level bool setLevelOptions(const char *aLevelName, bool aEnable, TMimeDirItemType *aItemTypeP); // - add level description to CTCap list void enumerateLevels(const TProfileDefinition *aProfileP, SmlPcdataListPtr_t *&aPcdataListPP, const TProfileDefinition *aSelectedProfileP, TMimeDirItemType *aItemTypeP); // - add property description to CTCap list void enumerateProperties(const TProfileDefinition *aProfileP, SmlDevInfCTDataPropListPtr_t *&aPropListPP, const TProfileDefinition *aSelectedProfileP, TMimeDirItemType *aItemTypeP); // - enumerate filter properties void enumeratePropFilters(const TProfileDefinition *aProfileP, SmlPcdataListPtr_t &aFilterProps, const TProfileDefinition *aSelectedProfileP, TMimeDirItemType *aItemTypeP); // - check mode bool mimeModeMatch(TMimeDirMode aMimeMode); // helpers for generateMimeDir() // - generate parameter or property value(list), // returns: 2 if value found, 1 if no value (but field supported), 0 if field not supported sInt16 generateValue( TMultiFieldItem &aItem, // the item where data comes from const TConversionDef *aConvDefP, sInt16 aBaseOffset, // basic fid offset to use sInt16 aArrayOffset, // additional offset to use, or array index in case of array field string &aString, // where value is ADDED char aSeparator, TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) bool aParamValue, // set if generating parameter value (different escaping rules, i.e. ";" and ":" must be escaped) bool aStructured, // set if value consists of multiple values (needs ";" escaping) bool aCommaEscape, // set if "," content escaping is needed (for values in valuelists like TYPE=TEL,WORK etc.) TEncodingTypes &aEncoding, // modified if special value encoding is required bool &aNonASCII, // set if any non standard 7bit ASCII-char is contained char aFirstChar, // will be appended before value if there is any value sInt32 &aNumNonSpcs, // how many non-spaces are already in the value bool aFoldAtSeparator, // if true, even in mimo_old folding may appear at value separators (adding an extra space - which is ok for EXDATE and similar) bool aEscapeOnlyLF // if true, only linefeeds are escaped as \n, but nothing else (not even \ itself) ); // - recursive expansion of properties void expandProperty( TMultiFieldItem &aItem, // the item where data comes from string &aString, // the string to add properties to const char *aPrefix, // the prefix (property name) const TPropertyDefinition *aPropP, // the property to generate (all instances) TMimeDirMode aMimeMode // MIME mode (older or newer vXXX format compatibility) ); // - generate single property (except for valuelist-type properties) sInt16 generateProperty( TMultiFieldItem &aItem, // the item where data comes from string &aString, // the string to add properties to const char *aPrefix, // the prefix (property name) const TPropertyDefinition *aPropP, // the property to generate (single instance) sInt16 aBaseOffset, // field ID offset to be used sInt16 aRepeatOffset, // additional repeat offset / array index TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) bool aSuppressEmpty, // if set, a property with only empty values will not be generated TPropNameExtension *aPropNameExt=NULL // propname extension for generating musthave param values and maxrep/repinc for valuelists ); // - generate parameters for one property instance // returns true if parameters with shownonempty=true were generated bool generateParams( TMultiFieldItem &aItem, // the item where data comes from string &aString, // the string to add parameters to const TPropertyDefinition *aPropP, // the property to generate (all instances) TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) sInt16 aBaseOffset, sInt16 aRepOffset, TPropNameExtension *aPropNameExt, // propname extension for generating musthave param values sInt32 &aNumNonSpcs // how many non-spaces are already in the value ); // - recursively generate levels void generateLevels( TMultiFieldItem &aItem, string &aString, const TProfileDefinition *aProfileP ); // - parse parameter or property value(list), returns false if no value(list) bool parseValue( const string &aText, // string to parse as value (could be binary content) const TConversionDef *aConvDefP, sInt16 aBaseOffset, // base offset sInt16 aRepOffset, // repeat offset, adds to aBaseOffset for non-array fields, is array index for array fileds TMultiFieldItem &aItem, // the item where data goes to bool &aNotEmpty, // is set true (but never set false) if property contained any (non-positional) values char aSeparator, // separator between values that consist of a list of enums etc. (more common for params than for values) TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) bool aParamValue, // set if parsing parameter value (different escaping rules) bool aStructured, // set if value consists of multiple values (has semicolon content escaping) bool aOnlyDeEscLF // set if de-escaping only for \n -> LF, but all visible char escapes should be left intact ); // - parse given property bool parseProperty( cAppCharP &aText, // where to start interpreting property, will be updated past end of poperty TMultiFieldItem &aItem, // item to store data into const TPropertyDefinition *aPropP, // the property definition sInt16 *aRepArray, // array[repeatID], holding current repetition COUNT for a certain nameExts entry sInt16 aRepArraySize, // size of array (for security) TMimeDirMode aMimeMode, // MIME mode (older or newer vXXX format compatibility) cAppCharP aGroupName, // property group ("a" in "a.TEL:131723612") size_t aGroupNameLen, cAppCharP aFullPropName, // entire property name (excluding group) - might be needed in case of wildcard property match size_t aFullNameLen ); // parse MIME-DIR level from specified string into item bool parseLevels( const char *&aText, TMultiFieldItem &aItem, const TProfileDefinition *aProfileP, bool aRootLevel ); #ifndef NO_REMOTE_RULES // helper for setRemoteRule(): add one specific remote rule and activate the behavior defined by it void activateRemoteRule(TRemoteRuleConfig *aRuleP); #endif }; // TMimeDirProfileHandler // Utility functions // ----------------- /// @brief checks two timestamps if they represent an all-day event /// @param[in] aStart start time /// @param[in] aEnd end time /// @return 0 if not allday, x=1..n if allday (spanning x days) by one of the /// following criteria: /// - both start and end at midnight of the same day (= 1 day) /// - both start and end at midnight of different days (= 1..n days) /// - start at midnight and end between 23:59:00 and 23:59:59 of /// same or different days (= 1..n days) uInt16 AlldayCount(lineartime_t aStart, lineartime_t aEnd); /// @brief checks two timestamps if they represent an all-day event /// @param[in] aStartFldP start time field /// @param[in] aEndFldP end time field /// @param[in] aTimecontext context to use to check allday criteria for all non-floating timestamps /// or UTC timestamps only (if aContextForUTC is set). /// @param[in] aContextForUTC if set, context is only applied for UTC timestamps, other non-floatings are checked as-is /// @return 0 if not allday, x=1..n if allday (spanning x days) uInt16 AlldayCount(TItemField *aStartFldP, TItemField *aEndFldP, timecontext_t aTimecontext, bool aContextForUTC); /// @brief makes two timestamps represent an all-day event /// @param[in/out] aStart start time within the first day, will be set to midnight (00:00:00) /// @param[in/out] aEnd end time within the last day or at midnight of the next day, /// will be set to midnight of the next day /// @param[in] aDays if>0, this is used to calculate the aEnd timestamp (aEnd input is /// ignored then) void MakeAllday(lineartime_t &aStart, lineartime_t &aEnd, sInt16 aDays=0); /// @brief makes two timestamp fields represent an all-day event /// @param[in/out] aStartFldP start time within the first day, will be set to dateonly /// @param[in/out] aEndFldP end time within the last day or at midnight of the next day, will be set to dateonly of the next day /// @param[in] aTimecontext context to calculate day boundaries in /// @param[in] aDays if>0, this is used to calculate the aEnd timestamp (aEnd input is /// ignored then) /// @note fields will be made floating and dateonly void MakeAllday(TItemField *aStartFldP, TItemField *aEndFldP, timecontext_t aTimecontext, sInt16 aDays=0); } // namespace sysync #endif // MimeDirProfile_H // eof syncevolution-1.5/src/synthesis/src/sysync/multifielditem.cpp0000755000373300037200000016302612424517753026401 0ustar00nightlyallusers00000000000000/* * File: MultiFieldItem.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TMultiFieldItem * Item consisting of multiple data fields (TItemField objects) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-08 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "multifielditem.h" #include "multifielditemtype.h" using namespace sysync; namespace sysync { // Config // ====== TFieldListConfig::TFieldListConfig(const char* aName, TConfigElement *aParentElement) : TConfigElement(aName,aParentElement) { clear(); } // TFieldListConfig::TFieldListConfig TFieldListConfig::~TFieldListConfig() { clear(); } // TFieldListConfig::~TFieldListConfig // init defaults void TFieldListConfig::clear(void) { // init defaults fAgeSortable=false; fFields.clear(); #ifdef HARDCODED_TYPE_SUPPORT fFieldListTemplateP=NULL; #endif // clear inherited inherited::clear(); } // TFieldListConfig::clear #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TFieldListConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // - fieldlist entry // if (strucmp(aElementName,"field")==0) { // may not contain anything expectEmpty(); // check attributes const char *nam = getAttr(aAttributes,"name"); const char *type = getAttr(aAttributes,"type"); const char *rel = getAttr(aAttributes,"compare"); if (!(nam && *nam && type && rel)) return fail("'field' must have 'name', 'type' and 'compare' attributes"); // parse enums sInt16 ty; if (!StrToEnum(ItemFieldTypeNames,numFieldTypes,ty,type)) return fail("Unknown 'type' attribute: '%s'",type); sInt16 eqrel; if (!StrToEnum(compareRelevanceNames,numEQmodes,eqrel,rel)) return fail("Unknown 'compare' attribute: '%s'",rel); // set defaults bool agerelevant=false; // not age relevant by default sInt16 mergemode=mem_none; // no merge by default // get optional attributes if (!getAttrBool(aAttributes,"age",agerelevant,true)) return fail("Bad boolean value"); #ifdef ARRAYFIELD_SUPPORT bool array=false; // not an array if (!getAttrBool(aAttributes,"array",array,true)) return fail("Bad boolean value"); #endif const char *p = getAttr(aAttributes,"merge"); if (p) { // sort out special cases if (strucmp(p,"no")==0) mergemode=mem_none; else if (strucmp(p,"fillempty")==0) mergemode=mem_fillempty; else if (strucmp(p,"addunassigned")==0) mergemode=mem_addunassigned; else if (strucmp(p,"append")==0) mergemode=mem_concat; else if (strucmp(p,"lines")==0) mergemode='\n'; else if (strlen(p)==1) mergemode=*p; // single char is merge char else return fail("Invalid value '%s' for 'merge' attribute",p); } // now add new field specification TFieldDefinition fielddef; // prepare template element fielddef.type=(TItemFieldTypes)ty; #ifdef ARRAYFIELD_SUPPORT fielddef.array = array; #endif TCFG_ASSIGN(fielddef.fieldname,nam); fielddef.eqRelevant=(TEqualityMode)eqrel; fielddef.ageRelevant=agerelevant; fAgeSortable=fAgeSortable || fielddef.ageRelevant; // if at least one field is age-relevant, we can sort items fielddef.mergeMode=mergemode; // copy into array fFields.push_back(fielddef); } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TFieldListConfig::localStartElement // resolve void TFieldListConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings if (fFields.size()==0) SYSYNC_THROW(TSyncException("fieldlist must contain at least one field")); } // resolve inherited inherited::localResolve(aLastPass); } // TFieldListConfig::localResolve #endif // get index of a field sInt16 TFieldListConfig::fieldIndex(const char *aName, size_t aLen) { TFieldDefinitionList::iterator pos; sInt16 n; for (n=0,pos=fFields.begin(); pos!=fFields.end(); ++n,pos++) { if (strucmp(aName,pos->TCFG_CSTR(fieldname),aLen)==0) { return n; // return field ID } } return VARIDX_UNDEFINED; // not found } // TFieldListConfig::fieldIndex // profile handler TProfileHandler::TProfileHandler(TProfileConfig *aProfileCfgP, TMultiFieldItemType *aItemTypeP) { // save profile config pointer fItemTypeP = aItemTypeP; // no related datastore yet fRelatedDatastoreP = NULL; } // TProfileHandler::TProfileHandler TProfileHandler::~TProfileHandler() { // nop for now } // TProfileHandler::~TProfileHandler // - get session pointer TSyncSession *TProfileHandler::getSession(void) { return fItemTypeP ? fItemTypeP->getSession() : NULL; } // TProfileHandler::getSession // - get session zones pointer GZones *TProfileHandler::getSessionZones(void) { return fItemTypeP ? fItemTypeP->getSessionZones() : NULL; } // TProfileHandler::getSessionZones #ifdef SYDEBUG TDebugLogger *TProfileHandler::getDbgLogger(void) { // commands log to session's logger return fItemTypeP ? fItemTypeP->getDbgLogger() : NULL; } // TProfileHandler::getDbgLogger uInt32 TProfileHandler::getDbgMask(void) { if (!fItemTypeP) return 0; // no item type, no debug return fItemTypeP->getDbgMask(); } // TProfileHandler::getDbgMask #endif // - check availability (depends on item "supported" flags only in SyncML datastore context) bool TProfileHandler::isFieldAvailable(TMultiFieldItem &aItem, sInt16 aFieldIndex) { if (fRelatedDatastoreP) { // in datastore/SyncML context, only fields supported on both sides are considered "available" return aItem.isAvailable(aFieldIndex); } else { // in non-datastore context, all fields are considered available, as long as // the field index is in range TMultiFieldItemType *mfitP = aItem.getItemType(); return mfitP && mfitP->isFieldIndexValid(aFieldIndex); } } // TProfileHandler::isFieldAvailable // Profile config root element TProfileConfig::TProfileConfig(const char* aName, TConfigElement *aParentElement) : TConfigElement(aName,aParentElement) { clear(); } // TProfileConfig::TProfileConfig TProfileConfig::~TProfileConfig() { clear(); } // TProfileConfig::~TProfileConfig // init defaults void TProfileConfig::clear(void) { // init defaults fFieldListP=NULL; // no field list linked // clear inherited inherited::clear(); } // TProfileConfig::clear #ifdef HARDCODED_TYPE_SUPPORT // read hardcoded fieldlist config void TFieldListConfig::readFieldListTemplate(const TFieldDefinitionsTemplate *aTemplateP) { if (!aTemplateP) return; // save the link to the template as well (we'll need it for maxsize etc. later) fFieldListTemplateP=aTemplateP; fFields.clear(); // copy values fAgeSortable=false; TFieldDefinition fielddef; for (sInt16 i=0; inumFields; i++) { const TFieldDefinitionTemplate *afieldP= &(aTemplateP->fieldDefs[i]); // prepare template element fielddef.type=afieldP->type; #ifdef ARRAYFIELD_SUPPORT fielddef.array = afieldP->array; #endif TCFG_ASSIGN(fielddef.fieldname,afieldP->fieldname); fielddef.eqRelevant=afieldP->eqRelevant; fielddef.ageRelevant=afieldP->ageRelevant; fAgeSortable=fAgeSortable || fielddef.ageRelevant; // if at least one field is age-relevant, we can sort fielddef.mergeMode=afieldP->mergeMode; // copy into array fFields.push_back(fielddef); } } // TFieldListConfig::readFieldListTemplate #endif TMultiFieldDatatypesConfig::TMultiFieldDatatypesConfig(TConfigElement *aParentElement) : TDatatypesConfig("datatypes",aParentElement) { clear(); } // TMultiFieldDatatypesConfig::TMultiFieldDatatypesConfig TMultiFieldDatatypesConfig::~TMultiFieldDatatypesConfig() { // make sure we don't re-build types (createHardcodedTypes() in clear()) // so we call internalClear() here! internalClear(); } // TMultiFieldDatatypesConfig::~TMultiFieldDatatypesConfig // init defaults void TMultiFieldDatatypesConfig::clear(void) { // remove internals internalClear(); // Now datatypes registry is really empty #ifdef HARDCODED_TYPE_SUPPORT // - add hard-coded default type information (if any) static_cast(getRootElement())->createHardcodedTypes(this); #endif } // TMultiFieldDatatypesConfig::clear // init defaults void TMultiFieldDatatypesConfig::internalClear(void) { // remove fieldlists TFieldListsList::iterator pos1; for(pos1=fFieldLists.begin();pos1!=fFieldLists.end();pos1++) delete *pos1; fFieldLists.clear(); // remove profiles TProfilesList::iterator pos2; for(pos2=fProfiles.begin();pos2!=fProfiles.end();pos2++) delete *pos2; fProfiles.clear(); // clear inherited inherited::clear(); } // TMultiFieldDatatypesConfig::internalClear // get a field list by name TFieldListConfig *TMultiFieldDatatypesConfig::getFieldList(const char *aName) { TFieldListsList::iterator pos; for(pos=fFieldLists.begin();pos!=fFieldLists.end();pos++) { if (strucmp((*pos)->getName(),aName)==0) { // found return *pos; } } return NULL; // not found } // TMultiFieldDatatypesConfig::getFieldList // get a profile by name TProfileConfig *TMultiFieldDatatypesConfig::getProfile(const char *aName) { TProfilesList::iterator pos; for(pos=fProfiles.begin();pos!=fProfiles.end();pos++) { if (strucmp((*pos)->getName(),aName)==0) { // found return *pos; } } return NULL; // not found } // TMultiFieldDatatypesConfig::getProfile #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TMultiFieldDatatypesConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - field lists or profiles can appear at this level bool newFieldList=false; TProfileConfig *newProfileP=NULL; TFieldListConfig *flP = NULL; // in case it is a field list or a profile - check for name const char* nam = getAttr(aAttributes,"name"); // now check if fieldlist or profile if (strucmp(aElementName,"fieldlist")==0) { newFieldList=true; } // the xml tag itself is used as the profile's typename (historical reasons/compatibility with existing config) else if ((newProfileP=getSyncAppBase()->getRootConfig()->newProfileConfig(nam,aElementName,this))!=NULL) { const char* flnam = getAttr(aAttributes,"fieldlist"); if (!flnam) return fail("%s is missing 'fieldlist' attribute",aElementName); else { flP = getFieldList(flnam); if (!flP) return fail("fieldlist '%s' unknown in %s",flnam,aElementName); } } // - tag not known here else return TDatatypesConfig::localStartElement(aElementName,aAttributes,aLine); // known tag, check if we need further processing if (newFieldList || newProfileP) { if (!nam) return fail("%s is missing 'name' attribute",aElementName); // create new named field list or use already created profile if (newFieldList) { // new field list TFieldListConfig *fieldlistcfgP = new TFieldListConfig(nam,this); fFieldLists.push_back(fieldlistcfgP); // save in list expectChildParsing(*fieldlistcfgP); // let element handle parsing } else { // new profile newProfileP->fFieldListP=flP; // set field list for profile fProfiles.push_back(newProfileP); // save in list expectChildParsing(*newProfileP); // let element handle parsing } } // ok return true; } // TMultiFieldDatatypesConfig::localStartElement // resolve void TMultiFieldDatatypesConfig::localResolve(bool aLastPass) { // resolve profiles TProfilesList::iterator pos1; for(pos1=fProfiles.begin();pos1!=fProfiles.end();pos1++) { (*pos1)->localResolve(aLastPass); } // resolve field lists TFieldListsList::iterator pos2; for(pos2=fFieldLists.begin();pos2!=fFieldLists.end();pos2++) { (*pos2)->localResolve(aLastPass); } // resolve inherited inherited::localResolve(aLastPass); } // TMultiFieldDatatypesConfig::localResolve #endif /* * Implementation of TMultiFieldItem */ /* public TMultiFieldItem members */ TMultiFieldItem::TMultiFieldItem( TMultiFieldItemType *aItemTypeP, // owner's (=source) type TMultiFieldItemType *aTargetItemTypeP // target type (for optimization) ) : TSyncItem(aItemTypeP) { // save types fItemTypeP = aItemTypeP; // owner (source) type fTargetItemTypeP = aTargetItemTypeP; // target (destination) type // copy field definitions pointer for fast access fFieldDefinitionsP = fItemTypeP->getFieldDefinitions(); if (!fFieldDefinitionsP) SYSYNC_THROW(TSyncException(DEBUGTEXT("MultiFieldItem without FieldDefinitions","mfi3"))); // test if target has same field defs if (fTargetItemTypeP->getFieldDefinitions()!=fFieldDefinitionsP) SYSYNC_THROW(TSyncException(DEBUGTEXT("MultiFieldItem with non-matching target field definitions","mfi1"))); // create fields array fFieldsP = new TItemFieldP[fFieldDefinitionsP->numFields()]; // - init it with null pointers for (sInt16 i=0; inumFields(); i++) fFieldsP[i]=NULL; } // TMultiFieldItem::TMultiFieldItem TMultiFieldItem::~TMultiFieldItem() { // remove fields cleardata(); // remove fields list delete[] fFieldsP; } // TMultiFieldItem::~TMultiFieldItem // remove all data from item void TMultiFieldItem::cleardata(void) { if (fFieldDefinitionsP) { for (sInt16 i=0; inumFields(); i++) { if (fFieldsP[i]) { delete fFieldsP[i]; // delete field object fFieldsP[i]=NULL; } } } } // TMultiFieldItem::cleardata #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) // changelog support: calculate CRC over contents uInt16 TMultiFieldItem::getDataCRC(uInt16 crc, bool aEQRelevantOnly) { // iterate over all fields if (fFieldDefinitionsP) { for (sInt16 i=0; inumFields(); i++) { if (!aEQRelevantOnly || fFieldDefinitionsP->fFields[i].eqRelevant!=eqm_none) { if (fFieldsP[i]) { crc=fFieldsP[i]->getDataCRC(crc); } } } } return crc; } // TMultiFieldItem::getDataCRC #endif // adjust fid and repeat offset to access array element if // base fid is an array field or to offset fid accordingly // if based fid is NOT an array field // - returns adjusted aFid and aIndex ready to be used with getArrayField() // - returns true if aFid IS an array field bool TMultiFieldItem::adjustFidAndIndex(sInt16 &aFid, sInt16 &aIndex) { bool arrfield; #ifdef ARRAYFIELD_SUPPORT // fid is offset repoffset only if not an array field arrfield=true; // check for array field first TItemField *fldP = getField(aFid); if (fldP) { if (!(fldP->isArray())) { // no array field arrfield=false; aFid += aIndex; // use array offset as additional field ID offset aIndex=0; // no array index } } else { // Note: if field does not exist, do not apply offset, but don't report array field either! arrfield = false; } #else // without array support, fid is always offset by rep offset aFid += aIndex; aIndex=0; // no array index arrfield=false; #endif // return true if this is really an array field return arrfield; } // adjustFidAndIndex // return specified leaf field of array field or regular field // depending if aFid addresses an array or not. // (This is a shortcut method to access fields specified by a base fid and a repeat) TItemField *TMultiFieldItem::getArrayFieldAdjusted(sInt16 aFid, sInt16 aIndex, bool aExistingOnly) { adjustFidAndIndex(aFid,aIndex); return getArrayField(aFid, aIndex, aExistingOnly); } // TMultiFieldItem::getArrayFieldAdjusted // return specified leaf field of array field TItemField *TMultiFieldItem::getArrayField(sInt16 aFid, sInt16 aIndex, bool aExistingOnly) { #ifdef ARRAYFIELD_SUPPORT TItemField *fiP = getField(aFid); if (!fiP) return NULL; return fiP->getArrayField(aIndex,aExistingOnly); #else // without array support, we can only access index==0 if (aIndex>0) return NULL; // other indices don't exist return getField(aFid); #endif } // TMultiFieldItem::getArrayField // get field by name (returns NULL if not known, creates if known but not existing yet) TItemField *TMultiFieldItem::getArrayField(const char *aFieldName, sInt16 aIndex, bool aExistingOnly) { return getArrayField(fItemTypeP->getFieldIndex(aFieldName),aIndex,aExistingOnly); } // TMultiFieldItem::getArrayField // get field by index (returns NULL if not known, creates if known but not existing yet) TItemField *TMultiFieldItem::getField(sInt16 aFieldIndex) { if (!fItemTypeP->isFieldIndexValid(aFieldIndex)) return NULL; // invalid index TItemField *fiP = fFieldsP[aFieldIndex]; if (!fiP) { // we must create the field first fiP=newItemField( fFieldDefinitionsP->fFields[aFieldIndex].type, getSessionZones() #ifdef ARRAYFIELD_SUPPORT ,fFieldDefinitionsP->fFields[aFieldIndex].array #endif ); // save in array fFieldsP[aFieldIndex] = fiP; } return fiP; } // TMultiFieldItem::getField // find index of field (returns FID_NOT_SUPPORTED if field is not a field of this item) sInt16 TMultiFieldItem::getIndexOfField(const TItemField *aFieldP) { for (sInt16 i=0; inumFields(); i++) { if (fFieldsP[i]==aFieldP) { // found field, return it's index return i; } } return FID_NOT_SUPPORTED; // not found } // TMultiFieldItem::getIndexOfField // get field by name (returns NULL if not known, creates if known but not existing yet) TItemField *TMultiFieldItem::getField(const char *aFieldName) { return getField(fItemTypeP->getFieldIndex(aFieldName)); } // TMultiFieldItem::getField // get field reference (create if not yet created) // throws if bad index TItemField &TMultiFieldItem::getFieldRef(sInt16 aFieldIndex) { TItemField *fiP = getField(aFieldIndex); if (!fiP) SYSYNC_THROW(TSyncException(DEBUGTEXT("getFieldRef with bad index called","mfi2"))); // invalid index return *fiP; } // TMultiFieldItem::getFieldRef // check if field is assigned (exists and has a value) bool const TMultiFieldItem::isAssigned(const char *aFieldName) { return isAssigned(fItemTypeP->getFieldIndex(aFieldName)); } // TMultiFieldItem::isAssigned TMultiFieldItemType *TMultiFieldItem::getLocalItemType(void) { return fItemTypeP && fItemTypeP->isRemoteType() ? fTargetItemTypeP : fItemTypeP; } // TMultiFieldItem::getLocalItemType TMultiFieldItemType *TMultiFieldItem::getRemoteItemType(void) { return fItemTypeP && fItemTypeP->isRemoteType() ? fItemTypeP : fTargetItemTypeP; } // TMultiFieldItem::getRemoteItemType // check if field is assigned (exists and has a value) bool const TMultiFieldItem::isAssigned(sInt16 aFieldIndex) { // check if field object exists at all if (!fItemTypeP->isFieldIndexValid(aFieldIndex)) return false; // invalid index TItemField *fiP = fFieldsP[aFieldIndex]; if (!fiP) return false; // field object does not exist // return if field object is assigned return fiP->isAssigned(); } // TMultiFieldItem::isAssigned // field availability (combined source & target) bool TMultiFieldItem::isAvailable(const char *aFieldName) { return isAvailable(fItemTypeP->getFieldIndex(aFieldName)); } // TMultiFieldItem::isAvailable // field availability (combined source & target) bool TMultiFieldItem::isAvailable(sInt16 aFieldIndex) { if (fItemTypeP && fTargetItemTypeP) { if (!fItemTypeP->isFieldIndexValid(aFieldIndex)) return false; // invalid index return fItemTypeP->getFieldOptions(aFieldIndex)->available && fTargetItemTypeP->getFieldOptions(aFieldIndex)->available; } else return false; // source or target missing, not available } // TMultiFieldItem::isAvailable bool TMultiFieldItem::knowsRemoteFieldOptions(void) { // knows them if either myself or the other side has received devInf // (depends: received item has it in its own type, to be sent one in the target type) return (fItemTypeP && fItemTypeP->hasReceivedFieldOptions()) || (fTargetItemTypeP && fTargetItemTypeP->hasReceivedFieldOptions()); } // TMultiFieldItem::knowsRemoteFieldOptions // make sure that all fields that are available in source and target are // assigned at least an empty value void TMultiFieldItem::assignAvailables(void) { if (fFieldDefinitionsP) { for (sInt16 k=0; knumFields(); k++) { if (isAvailable(k)) { TItemField *fldP=getField(k); // force creation if (fldP) { // make sure it is assigned a "empty" value if (fldP->isUnassigned()) fldP->assignEmpty(); } } } } } // TMultiFieldItem::assignAvailables // cast pointer to same type, returns NULL if incompatible TMultiFieldItem *TMultiFieldItem::castToSameTypeP(TSyncItem *aItemP) { if (aItemP->isBasedOn(ity_multifield)) { TMultiFieldItem *multifielditemP=static_cast (aItemP); // class compatible, now test type compatibility // - field definition list must be the same instance(!) in both items if (fFieldDefinitionsP==multifielditemP->fFieldDefinitionsP) return multifielditemP; else return NULL; } // not even class compatible return NULL; } // TMultiFieldItem::castToSameTypeP // test if comparable (at least for equality) bool TMultiFieldItem::comparable(TSyncItem &aItem) { // test if comparable: other type must be same type of multifield return castToSameTypeP(&aItem)!=NULL; } // TMultiFieldItem::comparable // test if sortable (by age, newer are > than older) bool TMultiFieldItem::sortable(TSyncItem &aItem) { if (!fFieldDefinitionsP->fAgeSortable) return false; // not sortable at all if (comparable(aItem)) { // item is comparable (has same FieldDefinitions) // Now check if all ageRelevant fields are assigned on both sides // Note: we can static-cast here because comparable() has verified aItem's type TMultiFieldItem *multifielditemP=static_cast (&aItem); // search for ageRelevant fields for (sInt16 i=0; inumFields(); i++) { if (fFieldDefinitionsP->fFields[i].ageRelevant) { // check if available for both types if (!( isAssigned(i) && // my own multifielditemP->isAssigned(i) // aItem's )) return false; // missing needed field on one side } } return true; // all ageRelevant fields are assigned in both sides } else return false; // not comparable is not sortable either } // TMultiFieldItem::sortable #ifdef OBJECT_FILTERING // check post-fetch filter bool TMultiFieldItem::postFetchFiltering(TLocalEngineDS *aDatastoreP) { return fItemTypeP->postFetchFiltering(this,aDatastoreP); } // TMultiFieldItem::postFetchFiltering // test if item passes filter bool TMultiFieldItem::testFilter(const char *aFilterString) { // process filter without modifying #ifdef SYDEBUG PDEBUGPRINTFX(DBG_DATA+DBG_FILTER+DBG_HOT,( "Testing filter '%s' against item:", aFilterString )); if (*aFilterString && PDEBUGTEST(DBG_DATA+DBG_FILTER+DBG_USERDATA)) { debugShowItem(DBG_DATA+DBG_FILTER); } #endif bool result=processFilter(false,aFilterString); PDEBUGPRINTFX(DBG_DATA+DBG_FILTER+DBG_HOT,( "Filter test result is %s", result ? "TRUE" : "FALSE" )); // false on syntax error if (*aFilterString) { PDEBUGPRINTFX(DBG_ERROR,("unexpected chars in filter expression: %s",aFilterString)); return false; } return result; } // TMultiFieldItem::testFilter // make item pass filter bool TMultiFieldItem::makePassFilter(const char *aFilterString) { // process filter with making modifications such that item passes filter condition bool result = processFilter(true,aFilterString); // false on syntax error if (*aFilterString) { PDEBUGPRINTFX(DBG_ERROR+DBG_FILTER,("unexpected chars in filter expression: %s",aFilterString)); return false; } return result; } // TMultiFieldItem::makePassFilter // process filter expression bool TMultiFieldItem::processFilter(bool aMakePass, const char *&aPos, const char *aStop, sInt16 aLastOpPrec) { char c=0; const char *st; string str; bool result; sInt16 fid; sInt16 cmpres=0; bool neg; bool assignToMakeTrue; bool specialValue; bool caseinsensitive; TStringField idfield; TItemField *fldP; // determine max length if (aStop==NULL) aStop=aPos+strlen(aPos); // empty expression is true result=true; // process simple term () // Note: do not allow negation to make sure // that TRUE of a comparison always // adds to TRUE of the entire expression neg=false; // not negated // - get first non-space while (aPos<=aStop) { c=*aPos; if (c!=' ') break; aPos++; } // Term starts here, first char is c, aPos points to it // - check subexpression paranthesis if (c=='(') { // boolean term is grouped subexpression, don't stop at logical operation aPos++; result=processFilter(aMakePass,aPos,aStop,0); // dont stop at any logical operator // check if matching paranthesis if (*(aPos++)!=')') { PDEBUGPRINTFX(DBG_ERROR+DBG_FILTER,("Filter expression error (missing \")\") at: %s",--aPos)); //%%% no, don't skip rest, as otherwise caller will not know that filter processing failed!%%% aPos=aStop; // skip rest return false; // always fail } if (neg) result=!result; } else if (c==0) { // empty term, counts as true return result; } else { // must be simple boolean term // - remember start of ident st=aPos; // - search end of ident while (isFilterIdent(c)) c=*(++aPos); // - c/aPos=char after ident, get ident str.assign(st,aPos-st); // - check for subscript index uInt16 subsIndex=0; // no index (index is 1-based in DS 1.2 filter specs) if (c=='[') { // expect numeric index aPos++; // next aPos+=StrToUShort(aPos,subsIndex); if (*aPos!=']') { PDEBUGPRINTFX(DBG_ERROR+DBG_FILTER,("Filter expression error (missing \"]\") at: %s",--aPos)); return false; // syntax error, does not pass } c=*(++aPos); // process next after subscript } // - get field ID for that ident (can be -1 if none found) // - check special idents first if (str=="LUID") { // this is SyncML-TAF Standard // it is also produced by DS 1.2 &LUID; pseudo-identifier if (IS_CLIENT) idfield.setAsString(getLocalID()); else idfield.setAsString(getRemoteID()); fldP=&idfield; } else if (str=="LOCALID") { // this is a Synthesis extension idfield.setAsString(getLocalID()); fldP=&idfield; } #ifdef SYSYNC_SERVER else if (IS_SERVER && str=="GUID") { // this is a Synthesis extension, added for symmetry to LUID idfield.setAsString(getLocalID()); fldP=&idfield; } else if (IS_SERVER && str=="REMOTEID") { // this is a Synthesis extension idfield.setAsString(getRemoteID()); fldP=&idfield; } #endif // SYSYNC_SERVER else { // must be a field if (fItemTypeP) fid=fItemTypeP->getFilterIdentifierFieldIndex(str.c_str(),subsIndex); else fid=VARIDX_UNDEFINED; // none // now get field pointer (or NULL if field not found) fldP = getField(fid); } // - skip spaces while (isspace(c)) c=*(++aPos); // - check for makepass-assignment modifier ":" assignToMakeTrue=c==':'; if (assignToMakeTrue) c=*(++aPos); // - check for special-value modifier "*" specialValue=c=='*'; if (specialValue) c=*(++aPos); // - check for case-insensitive comparison mode caseinsensitive=c=='^'; if (caseinsensitive) c=*(++aPos); // - now find comparison mode // cmpres = expected strcmp-style result: // 0 if equal, 1 if ident > value, -1 if ident < value, aPos++; // consume first char of comparison anyway if (c=='%') { cmpres=2; } // special flag for CONTAINS else if (c=='$') { cmpres=2; neg=!neg; } else if (c=='=') { cmpres=0; } // equal else if (c=='>') { if (*aPos=='=') { aPos++; neg=!neg; cmpres=-1; } // >= is not < else { cmpres=1; } // > } else if (c=='<') { if (*aPos=='>') { aPos++; neg=!neg; cmpres=0; } // <> is not = else if (*aPos=='=') { aPos++; neg=!neg; cmpres=1; } // <= is not > else { cmpres=-1; } // < } // - now read value st=aPos; // should start here // - find end (end of string, closing paranthesis or logical op) while (aPos result of term, negated or not, is always FALSE result=false; } else { if (cmpres==2) { // "contains" // - create a reference field TItemField *valfldP = newItemField(fldP->getElementType(),getSessionZones()); // - assign value as string valfldP->setAsString(str.c_str()); result = fldP->contains(*valfldP,caseinsensitive); // assign to make pass if enabled if (!result && aMakePass && assignToMakeTrue) { if (fldP->isArray()) fldP->append(*valfldP); // just append another element to make it contained else *fldP = *valfldP; // just overwrite value with to-be-contained value result=true; // now passes } delete valfldP; // no longer needed } else { if (specialValue) { if (cmpres!=0) result=false; // can only compare for equal else { if (str=="E") { // empty result = fldP->isEmpty(); } else if (str=="N") { // NULL, unassigned result = fldP->isAssigned(); } if (neg) result=!result; // make empty or unassigned to pass filter (make non-empty is not possible) if (!result && aMakePass && assignToMakeTrue && !neg) { if (str=="E") { fldP->assignEmpty(); } else if (str=="N") { fldP->unAssign(); } result=true; // now passes } } } else { // create a reference field TItemField *valfldP = newItemField(fldP->getElementType(),getSessionZones()); // assign value as string valfldP->setAsString(str.c_str()); // compare fields, then compare result with what was expected result = (fldP->compareWith(*valfldP,caseinsensitive) == cmpres); // negate result if needed if (neg) result=!result; // if field not assigned, comparison is always false if (fldP->isUnassigned()) result=false; // assign to make pass if enabled if (!result && aMakePass && assignToMakeTrue) { (*fldP) = (*valfldP); result=true; // now passes } // now clear again delete valfldP; } } } } // term is now evaluated, show what follows // - check for boolean op chain, aPos points now to possible logical operator do { // - skip spaces c=*aPos; while (c==' ') c=*(++aPos); // - check char at aPos if (c=='&') { // AND if (2<=aLastOpPrec) return result; // evaluation continues in caller (always as long as we don't have higher prec than AND) // skip op aPos++; // next term must be true as well // - return when encountering AND, OR and end of expression // - next term must also be modified to make pass bool termres = processFilter(aMakePass, aPos, aStop, 2); result = result && termres; } else if (c=='|') { // OR if (1<=aLastOpPrec) return result; // evaluation continues in caller // skip op aPos++; // next term must be true only if this one is not true // - return only when encountering AND or // - if first term is already true, next must never be modifed to pass bool termres = processFilter(result ? false : aMakePass, aPos, aStop, 1); result = result || termres; } else { // End of Expression // would be: if (0<=aLastOpPrec) return result; } } while(true); } #endif #ifdef SYSYNC_SERVER // compare function, returns 0 if equal, 1 if this > aItem, -1 if this < aItem sInt16 TMultiFieldItem::compareWith( TSyncItem &aItem, TEqualityMode aEqMode, TLocalEngineDS *aDatastoreP #ifdef SYDEBUG ,bool aDebugShow #endif ) { #ifndef SYDEBUG const aDebugShow = false; #endif sInt16 cmpres; TMultiFieldItem *multifielditemP = castToSameTypeP(&aItem); if (!multifielditemP) { cmpres = SYSYNC_NOT_COMPARABLE; goto exit; } // do the compare if (fItemTypeP) cmpres=fItemTypeP->compareItems(*this,*multifielditemP,aEqMode,aDebugShow,aDatastoreP); else cmpres=standardCompareWith(*multifielditemP,aEqMode,aDebugShow); exit: #ifdef SYDEBUG if (aDebugShow) { OBJDEBUGPRINTFX(getItemType()->getSession(),DBG_DATA,( "Compared [LOC=%s,REM=%s] with [LOC=%s,REM=%s] (eqMode=%hd), cmpres=%hd", getLocalID(), getRemoteID(), aItem.getLocalID(), aItem.getRemoteID(), (sInt16) aEqMode, cmpres )); } #endif return cmpres; } // TMultiFieldItem::compareWith // compare function, returns 0 if equal, 1 if this > aItem, -1 if this < aItem sInt16 TMultiFieldItem::standardCompareWith( TMultiFieldItem &aItem, TEqualityMode aEqMode, bool aDebugShow ) { sInt16 commonfound=0; sInt16 result=0; // default to equal // we should test for comparable() before! if (!comparable(aItem)) { result=SYSYNC_NOT_COMPARABLE; goto exit; } // now compare field-by-field // - equal means equality of all eqRelevant fields (both non-existing is // equality, too) // (but possibly differences in ageRelevant fields) // - larger/smaller means not equal in eqRelevant fields but // older/newer by ageRelevant fields // - SYSYNC_NOT_COMPARABLE means not equal and not ageSortable either if (aEqMode!=eqm_nocompare) { for (sInt16 i=0; inumFields(); i++) { // both fields must be available in their respective ItemType if (!getItemType()->getFieldOptions(i)->available || !aItem.getItemType()->getFieldOptions(i)->available) continue; // not available in both items, do not compare // then test for equality (if relevant in given context) if (fFieldDefinitionsP->fFields[i].eqRelevant>=aEqMode) { // at least one is available and relevant in both items commonfound++; // this is an EQ-relevant field // - get fields TItemField &f1=getFieldRef(i); TItemField &f2=aItem.getFieldRef(i); // - For slowsync and firstsync matching, non-ASSIGNED fields will not // be compared (to allow matching a less-equipped clinet record with its // better equipped server record and vice versa. Example is the S55 // which discards private addresses, old method rendered lots of // duplicates on slow sync if (aEqMode>=eqm_slowsync) { if (f1.isUnassigned() || f2.isUnassigned()) continue; // omit comparing fields where one side is unassigned } // - get assigned status of both fields // BCPPB revealed bad error: isAssigned was not called (forgot ())!!! // %%% Note: I think that isAssigned() is the wrong function here, we will use // !isEmpty(), which returns true for unassigned fields as well as for empty ones //bool a1 = f1.isAssigned(); // assignment status of field in this item //bool a2 = f2.isAssigned(); // assignment status of same field in other item bool a1 = !f1.isEmpty(); // non-empty status of field in this item bool a2 = !f2.isEmpty(); // non-empty status of same field in other item // - if both are unassigned -> equal if (!a1 && !a2) continue; // we are staying equal, test next field // - if one of them is unassigned -> not equal // - if both are assigned, fields must be equal if (!a1 || !a2) { // one not assigned result=SYSYNC_NOT_COMPARABLE; #ifdef SYDEBUG if (aDebugShow) { // not assigned if (!a1) { PDEBUGPRINTFX(DBG_DATA+DBG_MATCH,("- not equal because fid=%hd not assigned/empty in this item",i)); } else if (!a2) { PDEBUGPRINTFX(DBG_DATA+DBG_MATCH,("- not equal because fid=%hd not assigned/empty in other item",i)); } } #endif break; } else if (f1 != f2) { // content not equal #ifdef SYDEBUG string ds; if (aDebugShow) { // assigned but not equal PDEBUGPRINTFX(DBG_DATA+DBG_MATCH,("- not equal because fid=%hd not same in both items:",i)); getField(i)->getAsString(ds); PDEBUGPRINTFX(DBG_DATA+DBG_MATCH+DBG_USERDATA,( "- this item : '%-.1000s'",ds.c_str() )); aItem.getField(i)->getAsString(ds); PDEBUGPRINTFX(DBG_DATA+DBG_MATCH+DBG_USERDATA,( "- other item : '%-.1000s'",ds.c_str() )); PDEBUGPRINTFX(DBG_DATA+DBG_MATCH,( "- thisItem.CompareWith(otherItem) = %hd", getFieldRef(i).compareWith(aItem.getFieldRef(i)) )); } #endif // now check for cut-off situation sInt32 s1=getItemType()->getFieldOptions(i)->maxsize; sInt32 s2=aItem.getItemType()->getFieldOptions(i)->maxsize; // Note: (2002-12-01) do not actually use size, as it will probably not be accurate enough, // but always pass FIELD_OPT_MAXSIZE_UNKNOWN. if (s1!=FIELD_OPT_MAXSIZE_NONE) s1=FIELD_OPT_MAXSIZE_UNKNOWN; if (s2!=FIELD_OPT_MAXSIZE_NONE) s2=FIELD_OPT_MAXSIZE_UNKNOWN; // Now check short versions if (f1.isShortVers(f2,s2) || f2.isShortVers(f1,s1)) { // cutoff detected, counts as equal #ifdef SYDEBUG if (aDebugShow) { PDEBUGPRINTFX(DBG_DATA+DBG_MATCH,( "- Cutoff detected, field considered equal, maxsize(thisitem)=%ld, maxsize(otheritem)=%ld", (long)s1,(long)s2 )); } #endif } else { // no cutoff, not equal result=SYSYNC_NOT_COMPARABLE; break; } } // else if not equal } // if eq-relevant } // for all fields } // if EQ-compare at all if (!commonfound) result=SYSYNC_NOT_COMPARABLE; // if not equal, try to compare age (if age-sortable item at all) if (result!=0 && fFieldDefinitionsP->fAgeSortable) { for (sInt16 i=0; inumFields(); i++) { // then test for age (if relevant) if (fFieldDefinitionsP->fFields[i].ageRelevant) { // this is an age relevant field // - get assigned status of both fields bool a1 = isAssigned(i); // assignment status of field in this item bool a2 = aItem.isAssigned(i); // assignment status of same field in other item // - if both are unassigned -> cannot decide, continue if (!a1 && !a2) continue; // test next field // - if one of them is unassigned -> not age-comparable if (!a1 || !a2) { result=SYSYNC_NOT_COMPARABLE; goto exit; } // - if both are assigned, return field comparison value result=getFieldRef(i).compareWith(aItem.getFieldRef(i)); if (result!=0) { // not equal, newer item determined goto exit; } // continue to resolve age with next fields } } // no age relevant fields or all age relevant fields equal (possibly all unassigned) result=SYSYNC_NOT_COMPARABLE; } // done exit: return result; } // TMultiFieldItem::standardCompareWith #endif // server only // update dependencies of fields (such as BLOB proxies) on localID void TMultiFieldItem::updateLocalIDDependencies(void) { const char *localid = getLocalID(); // go through all fields for (sInt16 k=0; knumFields(); k++) { TItemField *fldP = getField(k); for (sInt16 i=0; iarraySize(); i++) { TItemField *leaffldP = fldP->getArrayField(i); if (leaffldP) leaffldP->setParentLocalID(localid); } } } // TMultiFieldItem::updateLocalIDDependencies /// @brief replace data contents from specified item /// @param aAvailableOnly: only replace contents actually available in aItem, leave rest untouched /// NOTE: this was changed slightly between 1.x.8.5 and 1.x.8.6: /// If the source type has not received devinf saying which fields are available, /// only fields that are actually ASSIGNED are written. If aAssignedOnly is /// additionally set, only assigned fields will be written anyway. /// @param aDetectCutOffs: use field's maxsize specs to detect contents cut off by limited field /// lengths and do not replace data if target is equal with source up to field length /// @param aAssignedOnly: just copy assigned fields (no check for availability) /// @param aTransferUnassigned: transfer unassigned status from source item (i.e. unassign those /// in target that are unassigned in source, no check for availability) bool TMultiFieldItem::replaceDataFrom(TSyncItem &aItem, bool aAvailableOnly, bool aDetectCutoffs, bool aAssignedOnly, bool aTransferUnassigned) { TMultiFieldItem *multifielditemP = castToSameTypeP(&aItem); if (!multifielditemP) return false; // ok, same type, copy data for (sInt16 i=0; inumFields(); i++) { if ( !aAvailableOnly || ( !aAssignedOnly && // availability is relevant only if not aAssignedOnly multifielditemP->fItemTypeP->hasReceivedFieldOptions() && multifielditemP->fItemTypeP->getFieldOptions(i)->available ) || multifielditemP->isAssigned(i) ) { // copy field sInt32 siz=multifielditemP->fItemTypeP->getFieldOptions(i)->maxsize; if (aDetectCutoffs && siz!=FIELD_OPT_MAXSIZE_NONE) { // check if source fields's content is fully contained at beginning of // target string, if yes, don't do anything // Note: (2002-12-01) do not actually use size, as it will probably not be accurate enough, // but always pass FIELD_OPT_MAXSIZE_UNKNOWN. if (getFieldRef(i).isShortVers(multifielditemP->getFieldRef(i),FIELD_OPT_MAXSIZE_UNKNOWN)) { // yes, we think that this is a cut-off, // so leave target untouched as it has more complete version of this field continue; } } // copy source field into this target field getFieldRef(i)=multifielditemP->getFieldRef(i); } else if (aTransferUnassigned && !multifielditemP->isAssigned(i)) { // explicitly transfer unassigned status // Note: this is useful in read-modify-write done exclusively for cutoff prevention, // as it prevents re-writing fields that were not actually transmitted from the remote // (i.e. no get-from-DB-and-write-same-value-back). Might be essential in case of special // fields where the datastore MUST know if these were sent with the data, like FN in pocketpc) getFieldRef(i).unAssign(); } } return true; } // TMultiFieldItem::replaceDataFrom // check item before processing it bool TMultiFieldItem::checkItem(TLocalEngineDS *aDatastoreP) { return fItemTypeP->checkItem(*this,aDatastoreP); } // TMultiFieldItem::checkItem #ifdef SYSYNC_SERVER // merge this item with specified item. // Notes: // - specified item is treated as loosing item, this item is winning item // - also updates other item to make sure it is equal to the winning after the merge // sets (but does not reset) change status of this and other item. // Note that changes of non-relevant fields are not reported here. void TMultiFieldItem::mergeWith(TSyncItem &aItem, bool &aChangedThis, bool &aChangedOther, TLocalEngineDS *aDatastoreP, int mode) { TMultiFieldItem *multifielditemP = castToSameTypeP(&aItem); if (!multifielditemP) return; // do the merge if (fItemTypeP) fItemTypeP->mergeItems(*this,*multifielditemP,aChangedThis,aChangedOther,aDatastoreP, mode); else standardMergeWith(*multifielditemP,aChangedThis,aChangedOther, mode); // show result OBJDEBUGPRINTFX(getItemType()->getSession(),DBG_DATA+DBG_CONFLICT,( "mergeWith() final status: thisitem: %schanged, otheritem: %schanged (relevant; eqm_none field changes are not indicated)", aChangedThis ? "" : "not ", aChangedOther ? "" : "not " )); } // TMultiFieldItem::mergeWith // merge this item with specified item. // Notes: // - specified item is treated as loosing item, this item is winning item // - also updates other item to make sure it is equal to the winning after the merge // returns update status of this and other item. Note that changes of non-relevant fields are // not reported here. void TMultiFieldItem::standardMergeWith(TMultiFieldItem &aItem, bool &aChangedThis, bool &aChangedOther, int mode, const std::set &aIgnoreFields) { // same type of multifield, try to merge for (sInt16 i=0; inumFields(); i++) { // Ignore fields if told so by optional MERGEFIELDS() parameter. if (aIgnoreFields.find(fFieldDefinitionsP->fFields[i].fieldname) != aIgnoreFields.end()) { continue; } // get merge mode sInt16 sep=fFieldDefinitionsP->fFields[i].mergeMode; // possible merging is only relevant (=to be reported) for fields that are not eqm_none bool mergerelevant = fFieldDefinitionsP->fFields[i].eqRelevant!=eqm_none; // check if available in both items at all if ( fItemTypeP->getFieldOptions(i)->available && // winning aItem.fItemTypeP->getFieldOptions(i)->available // loosing ) { // fields available in both items // - get both fields TItemField &winningField = getFieldRef(i); TItemField &loosingField = aItem.getFieldRef(i); // - get assigned status of both fields bool winning = winningField.isAssigned(); bool loosing = loosingField.isAssigned(); // - now decide what to do if (sep!=mem_none && mode == MERGE_OPTION_FROM_CONFIG) { // merge enabled PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,( "Field '%s' available and enabled for merging, mode/sep=0x%04hX, %srelevant", fFieldDefinitionsP->fFields[i].TCFG_CSTR(fieldname), sep, mergerelevant ? "" : "NOT " )); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,( "- %sassigned in winning / %sassigned in loosing", winning ? "" : "not ", loosing ? "" : "not " )); // - if both are unassigned -> nop if (!winning && !loosing) continue; // test next field // - if this item has field unassigned and other has it assigned: copy contents else if (!winning && loosing && (sep==mem_fillempty || sep==mem_addunassigned)) { // assign loosing item's content to non-assigned winning item getFieldRef(i)=aItem.getFieldRef(i); #ifdef SYDEBUG string ds; getFieldRef(i).getAsString(ds); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT+DBG_USERDATA,( "- assigned value '%" FMT_LENGTH(".40") "s' to winning (which had nothing assigned here)", FMT_LENGTH_LIMITED(40,ds.c_str()) )); #endif // count only if relevant and not assigned empty value // (so empty and unassigned are treated equally) if (mergerelevant && !aItem.getFieldRef(i).isEmpty()) aChangedThis=true; // merged something into this item } else if (winning && loosing) { // merge loosing field into winning field if (sep==mem_fillempty) { // only fill up empty winning fields if (winningField.isEmpty() && !loosingField.isEmpty()) { // only copy value from loosing if winning is empty winningField=loosingField; #ifdef SYDEBUG string ds; winningField.getAsString(ds); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT+DBG_USERDATA,( "- copied value '%" FMT_LENGTH(".40") "s' from loosing to empty winning", FMT_LENGTH_LIMITED(40,ds.c_str()) )); #endif if (mergerelevant) aChangedThis=true; } } else { // try real merge (sep might be 0 (mem_concat) or a separator char) #ifdef SYDEBUG string ds1,ds2; winningField.getAsString(ds1); loosingField.getAsString(ds2); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT+DBG_USERDATA,( "- try merging winning value '%" FMT_LENGTH(".40") "s' with loosing value '%" FMT_LENGTH(".40") "s'", FMT_LENGTH_LIMITED(40,ds1.c_str()), FMT_LENGTH_LIMITED(40,ds2.c_str()) )); #endif if (winningField.merge(loosingField,sep)) aChangedThis=true; #ifdef SYDEBUG winningField.getAsString(ds1); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT+DBG_USERDATA,( " merged %sthing, winning value is '%" FMT_LENGTH(".40") "s'", aChangedThis ? "some" : "no", FMT_LENGTH_LIMITED(40,ds1.c_str()) )); #endif } } } // merge enabled // with or without merge, loosing fields must be equal to winning ones // - for non merge-relevant (that is, never-compared) fields, // just assign winning value to loosing and do not compare (this // is important to avoid pulling large blobs and strings here - // assignment just passes the proxy) if (!mergerelevant) { // everything is handled by the field assignment mechanisms if (mode == MERGE_OPTION_CHANGE_THIS) { winningField = loosingField; } else { loosingField = winningField; } } else if (winningField!=loosingField) { // merge relevant fields will get more sophisticated treatment, such // as checking if a change has occurred and cutoff detection #ifdef SYDEBUG string wfv,lfv; winningField.getAsString(wfv); loosingField.getAsString(lfv); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT+DBG_USERDATA,( "Winning and loosing Field '%s' not equal: '%" FMT_LENGTH(".30") "s' <> '%" FMT_LENGTH(".30") "s'", fFieldDefinitionsP->fFields[i].TCFG_CSTR(fieldname), FMT_LENGTH_LIMITED(30,wfv.c_str()),FMT_LENGTH_LIMITED(30,lfv.c_str()) )); #endif // update loosing item, too, unless the winning field is shorter or explicitly requested if (mode == MERGE_OPTION_CHANGE_THIS || loosingField.isShortVers(winningField,fItemTypeP->getFieldOptions(i)->maxsize)) { // winning field is short version of loosing field -> loosing field is "better", use it winningField=loosingField; aChangedThis=true; } else { // standard case, loosing field is replaced by winning field loosingField=winningField; aChangedOther=true; } // this is some kind of item-level merge as well #ifdef SYDEBUG string ds; winningField.getAsString(ds); PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT+DBG_USERDATA,( "- updated fields such that both have same value '%" FMT_LENGTH(".40") "s'", FMT_LENGTH_LIMITED(40,ds.c_str()) )); #endif } } // field available in both items } // field loop } // TMultiFieldItem::standardMergeWith #endif // server only #ifdef SYDEBUG // show item contents for debug void TMultiFieldItem::debugShowItem(uInt32 aDbgMask) { TFieldListConfig *fielddefsP = getFieldDefinitions(); string val,fshow,oloc,orem; TFieldOptions *foptP; TItemField *fldP; if (PDEBUGTEST(aDbgMask|DBG_DETAILS)) { // very detailed bool hasdata = getSyncOp()!=sop_archive_delete && getSyncOp()!=sop_soft_delete && getSyncOp()!=sop_delete && getSyncOp()!=sop_copy && getSyncOp()!=sop_move; // - item header info PDEBUGPRINTFX(aDbgMask|DBG_DETAILS|DBG_HOT,( "Item LocalID='%s', RemoteID='%s', operation=%s%s", getLocalID(), getRemoteID(), SyncOpNames[getSyncOp()], hasdata && PDEBUGTEST(aDbgMask|DBG_USERDATA) ? ", size: [maxlocal,maxremote,actual]" : "" )); if (!hasdata) return; // do not show data for delete if (!PDEBUGTEST(aDbgMask|DBG_USERDATA)) { PDEBUGPRINTFX(aDbgMask|DBG_DETAILS,("*** field data not shown because userdata log is disabled ***")); return; // do not show any field data } // - fields fshow.erase(); for (sInt16 k=0; knumFields(); k++) { SYSYNC_TRY { const TFieldDefinition *fdP = &(fielddefsP->fFields[k]); // get options oloc="?"; if (fItemTypeP) { foptP=fItemTypeP->getFieldOptions(k); if (!foptP->available) oloc="n/a"; else StringObjPrintf(oloc,"%ld",(long)foptP->maxsize); } orem="?"; if (fTargetItemTypeP) { foptP=fTargetItemTypeP->getFieldOptions(k); if (!foptP->available) orem="n/a"; else StringObjPrintf(orem,"%ld",(long)foptP->maxsize); } // get value (but prevent pulling proxies) fldP=NULL; size_t n=0; // empty or unknown size if (isAssigned(k)) { fldP = getField(k); val.erase(); n = fldP->StringObjFieldAppend(val,99); // get string representation and size } else val=""; // now show main info StringObjAppendPrintf(fshow, "- %2d : %10s %-15s [%4s,%4s,%6ld] : %s\n", k, // fid ItemFieldTypeNames[fdP->type], // field type TCFG_CSTR(fdP->fieldname), // field name oloc.c_str(), orem.c_str(), long(n), val.c_str() ); // show array contents if any if (fldP && fldP->isArray()) { int arridx; for (arridx=0; arridxarraySize(); arridx++) { // show array elements TItemField *elemP = fldP->getArrayField(arridx,true); val.erase(); elemP->StringObjFieldAppend(val,99); StringObjAppendPrintf(fshow, " -- element %4d : %s\n", arridx, val.c_str() ); } } // isArray } SYSYNC_CATCH(exception &e) PDEBUGPRINTFX(DBG_ERROR,("Exception when trying to show field fid=%hd: %s[FLUSH]",k,e.what())); SYSYNC_ENDCATCH SYSYNC_CATCH(...) PDEBUGPRINTFX(DBG_ERROR,("Unknown Exception when trying to show field fid=%hd[FLUSH]",k)); SYSYNC_ENDCATCH } // for all fields PDEBUGPUTSXX(aDbgMask|DBG_DETAILS|DBG_USERDATA,fshow.c_str(),0,true); } else if (PDEBUGTEST(aDbgMask)) { // single line only StringObjPrintf(fshow, "Item locID='%s', RemID='%s', op=%s", getLocalID(), getRemoteID(), SyncOpNames[getSyncOp()] ); if (!PDEBUGTEST(aDbgMask|DBG_USERDATA)) { fshow+=", *** userdata log disabled ***"; } else if ( getSyncOp()==sop_archive_delete || getSyncOp()==sop_soft_delete || getSyncOp()==sop_delete ) { // do not show data for delete } else { fshow+=", Fields: "; for (sInt16 k=0; knumFields(); k++) { if (isAssigned(k)) { if (!getField(k)->isEmpty() && !getField(k)->hasProxy()) { getField(k)->StringObjFieldAppend(fshow,20); fshow+=", "; } } } } PDEBUGPUTSX(aDbgMask,fshow.c_str()); } } // TMultiFieldItem::debugShowItem #endif /* end of TMultiFieldItem implementation */ #ifdef DBAPI_TUNNEL_SUPPORT // TMultiFieldItemKey // ================== // set new content item void TMultiFieldItemKey::setItem(TMultiFieldItem *aItemP, bool aPassOwner) { forgetItem(); fItemP = aItemP; fOwnsItem = aPassOwner; fWritten = fItemP; // if we have set an item, this counts as written } // TMultiFieldItemKey::setItem // get FID for specified name sInt16 TMultiFieldItemKey::getFidFor(cAppCharP aName, stringSize aNameSz) { if (!fItemP) return VARIDX_UNDEFINED; // no item, no field is accessible TFieldListConfig *flcP = fItemP->getFieldDefinitions(); // check for iterator commands first if (strucmp(aName,VALNAME_FIRST)==0) { fIteratorFid = 0; if (fIteratorFidnumFields()) return fIteratorFid; } else if (strucmp(aName,VALNAME_NEXT)==0) { if (fIteratorFidnumFields()) fIteratorFid++; if (fIteratorFidnumFields()) return fIteratorFid; } else { return flcP->fieldIndex(aName,aNameSz); } // none found return VARIDX_UNDEFINED; } // TMultiFieldItemKey::getFidFor TItemField *TMultiFieldItemKey::getBaseFieldFromFid(sInt16 aFid) { if (!fItemP) return NULL; // no item, no field is accessible return fItemP->getField(aFid); } // TMultiFieldItemKey::getBaseFieldFromFid bool TMultiFieldItemKey::getFieldNameFromFid(sInt16 aFid, string &aFieldName) { if (!fItemP) return false; // no item, no field is accessible // name is field name TFieldListConfig *flcP = fItemP->getFieldDefinitions(); if (aFid>=0 && aFidnumFields()) { aFieldName = flcP->fFields[aFid].fieldname; return true; } // none found return false; } // TMultiFieldItemKey::getFieldNameFromFid #endif // DBAPI_TUNNEL_SUPPORT } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/multifielditem.h0000755000373300037200000003716712424517753026054 0ustar00nightlyallusers00000000000000/* * File: MultiFieldItem.h * * Author: Lukas Zeller (luz@plan44.ch) * * TMultiFieldItem * Item consisting of multiple data fields (TItemField objects) * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-08 : luz : created * */ #ifndef MultiFieldItem_H #define MultiFieldItem_H // includes #include "syncitem.h" #include "itemfield.h" #include "configelement.h" #include "syncappbase.h" #include using namespace sysync; namespace sysync { // undefined field/var index // Notes: // - positive indices address fields in the field list, negative indices address script variables // - this must be in 8-bit-negative range for current implementation of TScripTContext // - FID_NOT_SUPPORTED must be the same value as these are used interchangeably // (historically FID_NOT_SUPPORTED was -1). Definition of FID_NOT_SUPPORTED checks this now. #define VARIDX_UNDEFINED -128 // helper macros for getting a field by FID with casting // - get dynamically casted field, returns NULL if field has wrong type or does not exist #define GETFIELD_DYNAMIC_CAST(ty,tyid,fid,itemP) ( itemP->getField(fid) ? ITEMFIELD_DYNAMIC_CAST_PTR(ty,tyid,itemP->getField(fid)) : NULL ) // - get statically casted field, field must exist and have that type #define GETFIELD_STATIC_CAST(ty,fid,itemP) ( static_cast(itemP->getField(fid)) ) // single field definition class TFieldDefinition { public: // type TItemFieldTypes type; #ifdef ARRAYFIELD_SUPPORT bool array; // set if this is an array field #endif // name TCFG_STRING fieldname; // relevant for equality (used in slow sync and in conflicts) TEqualityMode eqRelevant; // relevant for age sorting (used in case of conflict) bool ageRelevant; // merge options (used whenever one record overwrites other) // - if mergeMode = mem_none, merge is disabled // - if mergeMode = mem_fillempty, empty fields will be filled, but no concatenation is used // - if mergeMode>=0, fields that are non-equal will be accumulated // - if >0 then mergeMode will be used as separation char char mergeMode; }; // TFieldDefinition #ifdef HARDCODED_TYPE_SUPPORT // single field definition typedef struct { // type TItemFieldTypes type; //#ifdef ARRAYFIELD_SUPPORT //%%% make all templates equal bool array; // set if this is an array field //#endif // name const char *fieldname; // relevant for equality (used in slow sync and in conflicts) TEqualityMode eqRelevant; // relevant for age sorting (used in case of conflict) bool ageRelevant; // merge options (used whenever one record overwrites other) // - if mergeMode = mem_none, merge is disabled // - if mergeMode = mem_fillempty, empty fields will be filled, but no concatenation is used // - if mergeMode>=0, fields that are non-equal will be accumulated // - if >0 then mergeMode will be used as separation char char mergeMode; // Type limit defaults uInt32 maxSize; bool noTruncate; } TFieldDefinitionTemplate; // field definitions template typedef struct { // number of fields sInt16 numFields; // sortable by age? bool ageSortable; // %%%% not needed any more, will be set automatically if at least one field is agerelevant // field definitions [0..numfields-1] // note: sort order is 0..n, i.e. fields with lower indexes are more relevant const TFieldDefinitionTemplate *fieldDefs; } TFieldDefinitionsTemplate; #endif // field array typedef std::vector TFieldDefinitionList; class TMultiFieldDatatypesConfig; // forward class TMultiFieldItem; class TMultiFieldItemType; // field definition config // This object MUST exist only ONCE per // MultiField-based type (as assignment compatibility is // given by POINTER IDENTITY of the MultiField's TFieldListConfig). class TFieldListConfig : public TConfigElement { typedef TConfigElement inherited; friend class TMultiFieldDatatypesConfig; public: TFieldListConfig(const char* aName, TConfigElement *aParentElement); virtual ~TFieldListConfig(); #ifdef HARDCODED_TYPE_SUPPORT const TFieldDefinitionsTemplate *fFieldListTemplateP; void readFieldListTemplate(const TFieldDefinitionsTemplate *aTemplateP); #endif // properties // - sortable by age? bool fAgeSortable; // - field definition array TFieldDefinitionList fFields; sInt16 numFields(void) { return fFields.size(); }; sInt16 fieldIndex(const char *aName, size_t aLen=0); protected: // check config elements #ifdef CONFIGURABLE_TYPE_SUPPORT virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); #endif virtual void clear(); }; // TFieldListConfig // profile handler abstract base class class TProfileHandler { public: // constructor/destructor TProfileHandler(TProfileConfig *aProfileCfgP, TMultiFieldItemType *aItemTypeP); virtual ~TProfileHandler(); #ifdef OBJECT_FILTERING // filtering // - get field index of given filter expression identifier. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) = 0; // - add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc, TSyncItemType *aItemTypeP) = 0; #endif // DevInf // - obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor, TSyncItemType *aItemTypeP) { return NULL; }; // - Analyze CTCap part of devInf virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP, TSyncItemType *aItemTypeP) { return true; }; // set profile options // - mode (for those profiles that have more than one, like MIME-DIR's old/standard) virtual void setProfileMode(sInt32 aMode) { /* nop here */ }; #ifndef NO_REMOTE_RULES // - choose remote rule by name, true if found virtual void setRemoteRule(const string &aRemoteRuleName) { /* nop here */ } #endif // set related datastore (NULL for independent use e.g. from script functions) void setRelatedDatastore(TLocalEngineDS *aRelatedDatastoreP) { fRelatedDatastoreP = aRelatedDatastoreP; }; // generate Text Data virtual void generateText(TMultiFieldItem &aItem, string &aString) = 0; // parse Data item virtual bool parseText(const char *aText, stringSize aTextSize, TMultiFieldItem &aItem) = 0; // Debug #ifdef SYDEBUG TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif protected: TLocalEngineDS *fRelatedDatastoreP; // related datastore, can be NULL TMultiFieldItemType *fItemTypeP; // the item type using this handler // helpers // - get session pointer TSyncSession *getSession(void); // - get session zones pointer GZones *getSessionZones(void); // - check availability (depends on item "supported" flags only in SyncML datastore context) bool isFieldAvailable(TMultiFieldItem &aItem, sInt16 aFieldIndex); }; // TProfileHandler // profile config base class (e.g. for MIMEDIR and text profiles) // A profile is a config element related to a single fieldlist, but probably to more // than one datatype class TProfileConfig : public TConfigElement { typedef TConfigElement inherited; friend class TMultiFieldDatatypesConfig; friend class TTextTypeConfig; public: TProfileConfig(const char* aName, TConfigElement *aParentElement); virtual ~TProfileConfig(); // handler factory virtual TProfileHandler *newProfileHandler(TMultiFieldItemType *aItemTypeP) = 0; // properties // - field list config TFieldListConfig *fFieldListP; protected: // check config elements virtual void clear(); }; // TProfileConfig // fieldlists list typedef std::list TFieldListsList; // profiles list typedef std::list TProfilesList; // multi-field based type config registry class TMultiFieldDatatypesConfig : public TDatatypesConfig { typedef TDatatypesConfig inherited; public: TMultiFieldDatatypesConfig(TConfigElement *aParentElement); virtual ~TMultiFieldDatatypesConfig(); // properties // - field lists TFieldListsList fFieldLists; TFieldListConfig *getFieldList(const char *aName); // - profiles (fieldlist-related definitions, but probably used in multiple datatypes) TProfilesList fProfiles; TProfileConfig *getProfile(const char *aName); protected: // check config elements #ifdef CONFIGURABLE_TYPE_SUPPORT virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); #endif virtual void clear(); private: void internalClear(void); }; // TMultiFieldDatatypesConfig const uInt16 ity_multifield = 100; // must be unique class TMultiFieldItem: public TSyncItem { typedef TSyncItem inherited; public: TMultiFieldItem( TMultiFieldItemType *aItemTypeP, // owner's (=source) type TMultiFieldItemType *aTargetItemTypeP // target type (for optimization) ); virtual ~TMultiFieldItem(); // access to type virtual uInt16 getTypeID(void) const { return ity_multifield; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_multifield ? true : TSyncItem::isBasedOn(aItemTypeID); }; // assignment (IDs and contents) virtual TSyncItem& operator=(TSyncItem &aSyncItem) { return TSyncItem::operator=(aSyncItem); }; // changelog support #if defined(CHECKSUM_CHANGELOG) && !defined(RECORDHASH_FROM_DBAPI) virtual uInt16 getDataCRC(uInt16 crc=0, bool aEQRelevantOnly=false); #endif // update dependencies of fields (such as BLOB proxies) on localID virtual void updateLocalIDDependencies(void); // - access fields by field name or index TItemField *getField(sInt16 aFieldIndex); TItemField *getField(const char *aFieldName); TItemField &getFieldRef(sInt16 aFieldIndex); // get field reference (create if not yet created) // for array support, but is always there to simplify implementations TItemField *getArrayField(const char *aFieldName, sInt16 aIndex, bool aExistingOnly=false); TItemField *getArrayField(sInt16 aFid, sInt16 aIndex, bool aExistingOnly=false); TItemField *getArrayFieldAdjusted(sInt16 aFid, sInt16 aIndex, bool aExistingOnly=false); // find index of field (returns FID_NOT_SUPPORTED if field is not a field of this item) sInt16 getIndexOfField(const TItemField *aFieldP); // adjust fid and repeat offset to access array element if // base fid is an array field or to offset fid accordingly // if based fid is NOT an array field // - returns adjusted aFid and aIndex ready to be used with getArrayField() // - returns true if aFid IS an array field bool adjustFidAndIndex(sInt16 &aFid, sInt16 &aIndex); // - check if field is assigned (exists and has a value) bool const isAssigned(sInt16 aFieldIndex); bool const isAssigned(const char *aFieldName); // access field definitions TFieldListConfig *getFieldDefinitions(void) { return fFieldDefinitionsP; }; // get associated MultiFieldItemType TMultiFieldItemType *getItemType(void) { return fItemTypeP; }; TMultiFieldItemType *getTargetItemType(void) { return fTargetItemTypeP; }; TMultiFieldItemType *getLocalItemType(void); TMultiFieldItemType *getRemoteItemType(void); // field availability (combined source & target) bool isAvailable(sInt16 aFieldIndex); bool isAvailable(const char *aFieldName); bool knowsRemoteFieldOptions(void); // - instantiate all fields that are available in source and target void assignAvailables(void); // compare abilities virtual bool comparable(TSyncItem &aItem); virtual bool sortable(TSyncItem &aItem); // clear item data virtual void cleardata(void); // replace data contents from specified item // - aAvailable only: only replace contents actually available in aItem, leave rest untouched // - aDetectCutOffs: handle case where aItem could have somehow cut-off data and prevent replacing // complete data with cut-off version (e.g. mobiles like T39m with limited name string capacity) virtual bool replaceDataFrom(TSyncItem &aItem, bool aAvailableOnly=false, bool aDetectCutoffs=false, bool aAssignedOnly=false, bool aTransferUnassigned=false); // check item before processing it virtual bool checkItem(TLocalEngineDS *aDatastoreP); #ifdef SYSYNC_SERVER // merge this item with specified item. // Notes: // - specified item is treated as loosing item, this item is winning item // - also updates other item to make sure it is equal to the winning after the merge // sets (but does not reset) change status of this and other item. // Note that changes of non-relevant fields are not reported here. virtual void mergeWith(TSyncItem &aItem, bool &aChangedThis, bool &aChangedOther, TLocalEngineDS *aDatastoreP, int mode = MERGE_OPTION_FROM_CONFIG); // standard merge (subset of mergeWith, used if no merge script is defined) void standardMergeWith(TMultiFieldItem &aItem, bool &aChangedThis, bool &aChangedOther, int mode = MERGE_OPTION_FROM_CONFIG, const std::set &aIgnoreFields = std::set()); // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith( TSyncItem &aItem, TEqualityMode aEqMode, TLocalEngineDS *aDatastoreP #ifdef SYDEBUG ,bool aDebugShow=false #endif ); // standard compare (subset of compareWith, used if no compare script is defined) sInt16 standardCompareWith( TMultiFieldItem &aItem, TEqualityMode aEqMode, bool aDebugShow ); #endif #ifdef SYDEBUG // show item contents for debug virtual void debugShowItem(uInt32 aDbgMask=DBG_DATA); #endif #ifdef OBJECT_FILTERING // New style generic filtering // - check if item passes filter and probably apply some modifications to it virtual bool postFetchFiltering(TLocalEngineDS *aDatastoreP); // Old style object filtering // - test if item passes filter virtual bool testFilter(const char *aFilterString); // - make item pass filter virtual bool makePassFilter(const char *aFilterString); // - actually process filter expression bool processFilter(bool aMakePass, const char *&aPos, const char *aStop=NULL, sInt16 aLastOpPrec=0); #endif protected: // associated multifield type items (owner and target) TMultiFieldItemType *fItemTypeP; TMultiFieldItemType *fTargetItemTypeP; // associated field definitions (copied from ItemType for performance) TFieldListConfig *fFieldDefinitionsP; // contents: array of actual fields TItemField **fFieldsP; private: // cast pointer to same type, returns NULL if incompatible TMultiFieldItem *castToSameTypeP(TSyncItem *aItemP); // all are compatible TSyncItem }; // TMultiFieldItem #ifdef DBAPI_TUNNEL_SUPPORT // key for access to a item using the settings key API class TMultiFieldItemKey : public TItemFieldKey { typedef TItemFieldKey inherited; public: TMultiFieldItemKey(TEngineInterface *aEngineInterfaceP, TMultiFieldItem *aItemP, bool aOwnsItem=false) : inherited(aEngineInterfaceP), fItemP(aItemP), fOwnsItem(aOwnsItem) {}; virtual ~TMultiFieldItemKey() { forgetItem(); }; TMultiFieldItem *getItem(void) { return fItemP; }; void setItem(TMultiFieldItem *aItemP, bool aPassOwner=false); protected: // methods to actually access a TItemField virtual sInt16 getFidFor(cAppCharP aName, stringSize aNameSz); virtual bool getFieldNameFromFid(sInt16 aFid, string &aFieldName); virtual TItemField *getBaseFieldFromFid(sInt16 aFid); // the item being accessed TMultiFieldItem *fItemP; bool fOwnsItem; // iterator sInt16 fIteratorFid; private: void forgetItem() { if (fOwnsItem && fItemP) { delete fItemP; } fItemP=NULL; }; }; // TMultiFieldItemKey #endif // DBAPI_TUNNEL_SUPPORT } // namespace sysync #endif // MultiFieldItem_H // eof syncevolution-1.5/src/synthesis/src/sysync/multifielditemtype.cpp0000755000373300037200000013200212424517753027271 0ustar00nightlyallusers00000000000000/* * File: MultiFieldItemType.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TMultiFieldItemType * Type consisting of multiple data fields (TItemField objects) * To be used as base class for field formats like vCard, * vCalendar etc. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-13 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "multifielditemtype.h" namespace sysync { // multifield-based datatype config TMultiFieldTypeConfig::TMultiFieldTypeConfig(const char* aName, TConfigElement *aParentElement) : TDataTypeConfig(aName,aParentElement) { clear(); } // TMultiFieldTypeConfig::TMultiFieldTypeConfig TMultiFieldTypeConfig::~TMultiFieldTypeConfig() { clear(); } // TMultiFieldTypeConfig::~TMultiFieldTypeConfig // init defaults void TMultiFieldTypeConfig::clear(void) { // clear properties // - remove link to field list fFieldListP=NULL; // - remove link to field list fProfileConfigP=NULL; #ifdef SCRIPT_SUPPORT fInitScript.erase(); fIncomingScript.erase(); fOutgoingScript.erase(); fFilterInitScript.erase(); fPostFetchFilterScript.erase(); #ifdef SYSYNC_SERVER fCompareScript.erase(); fMergeScript.erase(); #endif fProcessItemScript.erase(); #endif // clear properties fProfileMode=PROFILEMODE_DEFAULT; // default profile mode // clear inherited inherited::clear(); } // TMultiFieldTypeConfig::clear #ifdef SCRIPT_SUPPORT class TMFTypeFuncs { public: // integer SYNCMODESUPPORTED(string mode) // // True if the remote datastore is known to support the specific mode // (usually because it sent SyncCap including the mode), false if unknown // or not supported. // // Only works inside scripts which work on remote items. static void func_SyncModeSupported(TItemField *&aTermP, TScriptContext *aFuncContextP) { bool supported = false; TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (mfitP->fFirstItemP && mfitP->fFirstItemP->getRemoteItemType()) { TSyncDataStore *related = mfitP->fFirstItemP->getRemoteItemType()->getRelatedDatastore(); if (related) { std::string mode; aFuncContextP->getLocalVar(0)->getAsString(mode); supported = related->syncModeSupported(mode); } } aTermP->setAsInteger(supported); }; // func_SyncModeSupported // void SETFILTERALL(integer all) // sets if all records in the syncset need to checked against filter or only those that are new or changed static void func_SetFilterAll(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fNeedToFilterAll = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetFilterAll #ifdef SYSYNC_TARGET_OPTIONS // integer SIZELIMIT() // gets the size limit set for this item static void func_Limit(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t i = static_cast(aFuncContextP->getCallerContext())->fDsP->fItemSizeLimit; if (i<0) aTermP->unAssign(); else aTermP->setAsInteger(i); }; // func_Limit // SETSIZELIMIT(integer limit) // sets size limit used for generating this item for remote static void func_SetLimit(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fDsP->fItemSizeLimit = aFuncContextP->getLocalVar(0)->isUnassigned() ? -1 : aFuncContextP->getLocalVar(0)->getAsInteger(); }; // func_SetLimit #endif #ifdef SYSYNC_SERVER // void ECHOITEM(string syncop) // creates a duplicate of the processed item to be sent back to sender with the specified syncop static void func_EchoItem(TItemField *&aTermP, TScriptContext *aFuncContextP) { // convert to syncop string s; aFuncContextP->getLocalVar(0)->getAsString(s); sInt16 sop; StrToEnum(SyncOpNames, numSyncOperations, sop, s.c_str()); static_cast(aFuncContextP->getCallerContext())->fDsP->fEchoItemOp = (TSyncOperation) sop; }; // func_EchoItem // void CONFLICTSTRATEGY(string strategy) // sets the conflict strategy for this item static void func_ConflictStrategy(TItemField *&aTermP, TScriptContext *aFuncContextP) { // convert to conflictstrategy string s; aFuncContextP->getLocalVar(0)->getAsString(s); sInt16 strategy; StrToEnum(conflictStrategyNames,numConflictStrategies, strategy, s.c_str()); static_cast(aFuncContextP->getCallerContext())->fDsP->fItemConflictStrategy = (TConflictResolution) strategy; }; // func_ConflictStrategy // void FORCECONFLICT() // forces conflict between this item and item from the DB static void func_ForceConflict(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fDsP->fForceConflict=true; }; // func_ForceConflict // void DELETEWINS() // in a replace/delete conflict, delete wins (normally, replace wins) static void func_DeleteWins(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fDsP->fDeleteWins=true; }; // func_DeleteWins // void PREVENTADD() // if set, attempt to add item from remote will cause no add but delete of remote item static void func_PreventAdd(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fDsP->fPreventAdd=true; }; // func_PreventAdd // void IGNOREUPDATE() // if set, attempt to update existing items from remote will be ignored static void func_IgnoreUpdate(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fDsP->fIgnoreUpdate=true; }; // func_IgnoreUpdate // void MERGEFIELDS(mode = 0, ignoreFields = "") // Optional mode parameter determines the result of the merge. // 0 = according to config, 1 = loosing item is overwritten, 2 = winning item is overwritten // Any field names in the space separated ignoreFields parameter will be skipped. // The assumption is that the calling script has already dealt with these fields. static void func_MergeFields(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (mfitP->fFirstItemP) { TItemField *argP = aFuncContextP->getLocalVar(0); int mode = (argP && argP->isAssigned()) ? argP->getAsInteger() : 0; // Split optional string into set of field names. argP = aFuncContextP->getLocalVar(1); std::string fields; if (argP && argP->isAssigned()) { argP->getAsString(fields); } std::set ignoreFields; size_t offset = 0; while (offset < fields.size()) { while (offset < fields.size() && isspace(fields[offset])) offset++; size_t start = offset; while (offset < fields.size() && !isspace(fields[offset])) offset++; size_t len = offset - start; if (len) ignoreFields.insert(fields.substr(start, len)); } mfitP->fFirstItemP->standardMergeWith(*(mfitP->fSecondItemP),mfitP->fChangedFirst,mfitP->fChangedSecond, mode, ignoreFields); } }; // func_MergeFields enum ArrayEntriesState { ALL_UNSET, // All arrays have no entries at the array index -> past end of valid entries. ALL_EMPTY, // Some entries exist, but all of those are empty. NON_EMPTY // Some entry is non-empty. }; static ArrayEntriesState checkArrayEntries(sInt16 arridx, TMultiFieldItem &aItem, const std::vector &aFields) { ArrayEntriesState state = ALL_UNSET; for (size_t i = 0; state != NON_EMPTY && i < aFields.size() && aFields[i] >= 0; i++) { TItemField *elemP = aItem.getArrayField(aFields[i],arridx,true); if (elemP && state == ALL_UNSET) { state = elemP->isEmpty() ? ALL_EMPTY : NON_EMPTY; } } return state; } // Increments arridx until it runs into ALL_UNSET or NON_EMPTY. static ArrayEntriesState nextArrayEntries(sInt16 &arridx, TMultiFieldItem &aItem, const std::vector &aFields) { while (true) { ++arridx; ArrayEntriesState state = checkArrayEntries(arridx, aItem, aFields); switch (state) { case ALL_UNSET: case NON_EMPTY: return state; case ALL_EMPTY: break; } } } // string RELAXEDCOMPARE(mainfield1, mainfield2, mainfield3, "", addfield1, addfield2, ...) // Returns "" if a relaxed comparison of the given fields in the winning and loosing // item finds no differences and string with all given field names concatenated together // with space at the beginning and and the end. // // The intended usage is: // ignorefields = ignorefields + RELAXEDCOMPARE("TEL", "", "TEL_FLAGS", "LABEL"); // ignorefields = ignorefields + RELAXEDCOMPARE("ADR", "ADR_STREET", "ADR_CITY", "", "LABEL"); // MERGEFIELDS(mode, ignorefields); // // All fields must be arrays. Only entries with non-empty main fields are considered. // However, if the main fields are non-empty, the additional ones must also match. // The order of entries in loosing and winning item *does* matter, a difference // is only reported if an entry has no exact match in the other item. static void func_RelaxedCompare(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); bool difference = false; std::string fieldnames; if (mfitP->fFirstItemP && mfitP->fSecondItemP) { // Determine field index of the fields we need to compare. std::vector fields; TFieldListConfig *fieldlist = mfitP->fFirstItemP->getFieldDefinitions(); for (int i = 0; ; i++) { TItemField *argP = aFuncContextP->getLocalVar(i); if (!argP || !argP->isAssigned()) { break; } std::string fieldname; argP->getAsString(fieldname); if (fieldname.empty()) { // Separator between main and additional fields. fields.push_back(-1); } else { for (sInt16 e=0; enumFields(); e++) { if (fieldlist->fFields[e].fieldname == fieldname) { fieldnames.append(" "); fieldnames.append(fieldname); fields.push_back(e); break; } } // TODO (?): error for unknown field } } if (!fields.empty()) { // Walk through both array sets in parallel. Skip empty // entries and compare non-empty ones. sInt16 firstArrIdx = -1; ArrayEntriesState firstState = nextArrayEntries(firstArrIdx, *mfitP->fFirstItemP, fields); sInt16 secondArrIdx = -1; ArrayEntriesState secondState = nextArrayEntries(secondArrIdx, *mfitP->fSecondItemP, fields); while (firstState == NON_EMPTY && secondState == NON_EMPTY) { // Compare entries. for (size_t i=0; ifFirstItemP->getArrayField(fid, firstArrIdx, true); TItemField *secondP = mfitP->fSecondItemP->getArrayField(fid, secondArrIdx, true); if (firstP && secondP) { if (firstP->isAssigned() != secondP->isAssigned() || *firstP != *secondP) { difference = true; break; } } else if ((firstP && firstP->isAssigned()) || (secondP && secondP->isAssigned())) { difference = true; break; } } firstState = nextArrayEntries(firstArrIdx, *mfitP->fFirstItemP, fields); secondState = nextArrayEntries(secondArrIdx, *mfitP->fSecondItemP, fields); } if (firstState != secondState) { // One side has data that the other hasn't. difference = true; } } else { // TODO (?): error if no fields specified. } } else { difference = true; } aTermP->setAsString(difference ? "" : fieldnames); }; // func_RelaxedCompare // integer WINNINGCHANGED() // returns true if winning was changed static void func_WinningChanged(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsInteger(mfitP->fChangedFirst ? 1 : 0); }; // func_WinningChanged // integer LOOSINGCHANGED() // returns true if loosing was changed static void func_LoosingChanged(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsInteger(mfitP->fChangedSecond ? 1 : 0); }; // func_LoosingChanged static void func_SetWinningChanged(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); mfitP->fChangedFirst = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetWinningChanged static void func_SetLoosingChanged(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); mfitP->fChangedSecond = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetLoosingChanged // integer COMPAREFIELDS() // returns 0 if equal, 1 if first > second, -1 if first < second static void func_CompareFields(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (!mfitP->fFirstItemP) aTermP->setAsInteger(SYSYNC_NOT_COMPARABLE); else { aTermP->setAsInteger( mfitP->fFirstItemP->standardCompareWith(*(mfitP->fSecondItemP),mfitP->fEqMode,OBJDEBUGTEST(mfitP,DBG_SCRIPTS+DBG_DATA+DBG_MATCH)) ); } }; // func_CompareFields // string COMPARISONMODE() // returns mode of comparison static void func_ComparisonMode(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (!mfitP->fFirstItemP) aTermP->unAssign(); // no comparison else { aTermP->setAsString(comparisonModeNames[mfitP->fEqMode]); } }; // func_CompareFields // int MERGEMODE() // returns mode of merging, see MERGEFIELDS() static void func_MergeMode(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (!mfitP->fFirstItemP) aTermP->unAssign(); // no merging else { aTermP->setAsInteger(mfitP->fMergeMode); } }; // func_MergeMode #endif // string SYNCOP() // returns sync-operation as text static void func_SyncOp(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString( SyncOpNames[static_cast(aFuncContextP->getCallerContext())->fCurrentSyncOp] ); }; // func_SyncOp // void REJECTITEM(integer statuscode) // causes current item not to be processed, but rejected with status code (0=silently rejected) static void func_RejectItem(TItemField *&aTermP, TScriptContext *aFuncContextP) { static_cast(aFuncContextP->getCallerContext())->fDsP->fRejectStatus= aFuncContextP->getLocalVar(0)->getAsInteger(); }; // func_RejectItem // string REMOTEID() // returns target item's remoteID as text static void func_RemoteID(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (mfitP->fFirstItemP) { aTermP->setAsString(mfitP->fFirstItemP->getRemoteID()); } }; // func_RemoteID // void SETREMOTEID(string remoteid) // sets the target item's remote ID as text static void func_SetRemoteID(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (mfitP->fFirstItemP) { string s; aFuncContextP->getLocalVar(0)->getAsString(s); mfitP->fFirstItemP->setRemoteID(s.c_str()); } }; // func_SetRemoteID // string LOCALID() // returns target item's localID as text static void func_LocalID(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (mfitP->fFirstItemP) { aTermP->setAsString(mfitP->fFirstItemP->getLocalID()); } }; // func_LocalID // void SETLOCALID(string remoteid) // sets the target item's localID as text static void func_SetLocalID(TItemField *&aTermP, TScriptContext *aFuncContextP) { TMultiFieldItemType *mfitP = static_cast(aFuncContextP->getCallerContext()); if (mfitP->fFirstItemP) { string s; aFuncContextP->getLocalVar(0)->getAsString(s); mfitP->fFirstItemP->setLocalID(s.c_str()); } }; // func_SetLocalID }; // TMFTypeFuncs // chain function to link datastore-level functions static void* DataTypeChainFunc(void *&aNextCallerContext) { // caller context for datastore-level functions is the datastore pointer if (aNextCallerContext) aNextCallerContext = static_cast(aNextCallerContext)->fDsP; // next table is that of the localdatastore return (void *) &DBFuncTable; } // DataTypeChainFunc const uInt8 param_StrArg[] = { VAL(fty_string) }; const uInt8 param_IntArg[] = { VAL(fty_integer) }; const uInt8 param_RelaxedCompare[] = { OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string), OPTVAL(fty_string),}; const uInt8 param_MergeFields[] = { OPTVAL(fty_integer), OPTVAL(fty_string) }; // builtin functions for datastore-context table const TBuiltInFuncDef DataTypeFuncDefs[] = { { "SYNCMODESUPPORTED", TMFTypeFuncs::func_SyncModeSupported, fty_integer, 1, param_StrArg }, { "SETFILTERALL", TMFTypeFuncs::func_SetFilterAll, fty_none, 1, param_IntArg }, #ifdef SYSYNC_TARGET_OPTIONS { "SIZELIMIT", TMFTypeFuncs::func_Limit, fty_integer, 0, NULL }, { "SETSIZELIMIT", TMFTypeFuncs::func_SetLimit, fty_none, 1, param_IntArg }, #endif #ifdef SYSYNC_SERVER { "ECHOITEM", TMFTypeFuncs::func_EchoItem, fty_none, 1, param_StrArg }, { "CONFLICTSTRATEGY", TMFTypeFuncs::func_ConflictStrategy, fty_none, 1, param_StrArg }, { "FORCECONFLICT", TMFTypeFuncs::func_ForceConflict, fty_none, 0, NULL }, { "DELETEWINS", TMFTypeFuncs::func_DeleteWins, fty_none, 0, NULL }, { "PREVENTADD", TMFTypeFuncs::func_PreventAdd, fty_none, 0, NULL }, { "IGNOREUPDATE", TMFTypeFuncs::func_IgnoreUpdate, fty_none, 0, NULL }, { "MERGEFIELDS", TMFTypeFuncs::func_MergeFields, fty_none, sizeof(param_MergeFields)/sizeof(param_MergeFields[0]), param_MergeFields }, { "RELAXEDCOMPARE", TMFTypeFuncs::func_RelaxedCompare, fty_string, sizeof(param_RelaxedCompare)/sizeof(param_RelaxedCompare[0]), param_RelaxedCompare }, { "WINNINGCHANGED", TMFTypeFuncs::func_WinningChanged, fty_integer, 0, NULL }, { "LOOSINGCHANGED", TMFTypeFuncs::func_LoosingChanged, fty_integer, 0, NULL }, { "SETWINNINGCHANGED", TMFTypeFuncs::func_SetWinningChanged, fty_none, 1, param_IntArg }, { "SETLOOSINGCHANGED", TMFTypeFuncs::func_SetLoosingChanged, fty_none, 1, param_IntArg }, { "COMPAREFIELDS", TMFTypeFuncs::func_CompareFields, fty_integer, 0, NULL }, { "COMPARISONMODE", TMFTypeFuncs::func_ComparisonMode, fty_string, 0, NULL }, { "MERGEMODE", TMFTypeFuncs::func_MergeMode, fty_integer, 0, NULL }, #endif { "SYNCOP", TMFTypeFuncs::func_SyncOp, fty_string, 0, NULL }, { "REJECTITEM", TMFTypeFuncs::func_RejectItem, fty_none, 1, param_IntArg }, { "LOCALID", TMFTypeFuncs::func_LocalID, fty_string, 0, NULL }, { "SETLOCALID", TMFTypeFuncs::func_SetLocalID, fty_none, 1, param_StrArg }, { "REMOTEID", TMFTypeFuncs::func_RemoteID, fty_string, 0, NULL }, { "SETREMOTEID", TMFTypeFuncs::func_SetRemoteID, fty_none, 1, param_StrArg }, }; const TFuncTable DataTypeFuncTable = { sizeof(DataTypeFuncDefs) / sizeof(TBuiltInFuncDef), // size of table DataTypeFuncDefs, // table pointer DataTypeChainFunc // chain to localdatastore funcs }; #endif #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TMultiFieldTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // Note: derived classes might override this "use" further // Here, we check for using only a file list, or a profile which implies a field list if (strucmp(aElementName,"use")==0) { if (fFieldListP || fProfileConfigP) return fail("'use' cannot be specified more than once"); // - get type registry TMultiFieldDatatypesConfig *mufcP; GET_CASTED_PTR(mufcP,TMultiFieldDatatypesConfig,getParentElement(),DEBUGTEXT("TMultiFieldTypeConfig with non-TMultiFieldDatatypesConfig parent","txit2")); // - check what to look for const char *pnam = getAttr(aAttributes,"fieldlist"); if (pnam) { // we are addressing a fieldlist fFieldListP=mufcP->getFieldList(pnam); if (!fFieldListP) return fail("unknown field list '%s' specified in 'use'",pnam); } else { // this must be a profile (we may also call it 'mimeprofile' for historical, <=2.1 engine reasons) pnam = getAttr(aAttributes,"profile"); if (!pnam) pnam = getAttr(aAttributes,"mimeprofile"); // %%% for compatibility with <=2.1 engine configs if (!pnam) return fail("'use' must have a 'fieldlist' or 'profile' attribute"); fProfileConfigP=mufcP->getProfile(pnam); if (!fProfileConfigP) return fail("unknown profile '%s' specified in 'use'",pnam); // - copy field list pointer into TMultiFieldTypeConfig as well fFieldListP = fProfileConfigP->fFieldListP; } expectEmpty(); } else if (strucmp(aElementName,"profilemode")==0) expectInt32(fProfileMode); // usually, this is set implicitly by derived types, such as vCard, vCalendar #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"initscript")==0) expectScript(fInitScript,aLine,&DataTypeFuncTable); else if (strucmp(aElementName,"incomingscript")==0) expectScript(fIncomingScript,aLine,&DataTypeFuncTable); else if (strucmp(aElementName,"outgoingscript")==0) expectScript(fOutgoingScript,aLine,&DataTypeFuncTable); else if (strucmp(aElementName,"filterinitscript")==0) expectScript(fFilterInitScript,aLine,&DataTypeFuncTable); else if (strucmp(aElementName,"filterscript")==0) expectScript(fPostFetchFilterScript,aLine,&DataTypeFuncTable); #ifdef SYSYNC_SERVER else if (strucmp(aElementName,"comparescript")==0) expectScript(fCompareScript,aLine,&DataTypeFuncTable); else if (strucmp(aElementName,"mergescript")==0) expectScript(fMergeScript,aLine,&DataTypeFuncTable); #endif else if (strucmp(aElementName,"processitemscript")==0) expectScript(fProcessItemScript,aLine,&DataTypeFuncTable); #endif // - none known here else return TDataTypeConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TMultiFieldTypeConfig::localStartElement // resolve void TMultiFieldTypeConfig::localResolve(bool aLastPass) { // check if (aLastPass) { if (!fFieldListP) SYSYNC_THROW(TConfigParseException("missing 'use' in datatype")); #ifdef SCRIPT_SUPPORT TScriptContext *sccP = NULL; SYSYNC_TRY { // resolve all scripts in same context // - init script TScriptContext::resolveScript(getSyncAppBase(),fInitScript,sccP,fFieldListP); // - incoming/outgoing scripts TScriptContext::resolveScript(getSyncAppBase(),fIncomingScript,sccP,fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fOutgoingScript,sccP,fFieldListP); // - filtering scripts TScriptContext::resolveScript(getSyncAppBase(),fFilterInitScript,sccP,fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fPostFetchFilterScript,sccP,fFieldListP); // - compare and merge scripts #ifdef SYSYNC_SERVER TScriptContext::resolveScript(getSyncAppBase(),fCompareScript,sccP,fFieldListP); TScriptContext::resolveScript(getSyncAppBase(),fMergeScript,sccP,fFieldListP); #endif // - special processing of incoming items before they are sent to the DB TScriptContext::resolveScript(getSyncAppBase(),fProcessItemScript,sccP,fFieldListP); // - forget this context (rebuild will take place in the datastore's fXXXXTypeScriptContextP) if (sccP) delete sccP; } SYSYNC_CATCH (...) if (sccP) delete sccP; SYSYNC_RETHROW; SYSYNC_ENDCATCH #endif } // resolve inherited inherited::localResolve(aLastPass); } // TMultiFieldTypeConfig::localResolve #endif // CONFIGURABLE_TYPE_SUPPORT #ifdef HARDCODED_TYPE_SUPPORT void TMultiFieldTypeConfig::setConfig(TFieldListConfig *aFieldList, const char *aTypeName, const char* aTypeVers) { // set field list fFieldListP=aFieldList; // set type name/version if (aTypeName) fTypeName=aTypeName; if (aTypeVers) fTypeVersion=aTypeVers; } // TMultiFieldTypeConfig::setConfig #endif // HARDCODED_TYPE_SUPPORT /* * Implementation of TMultiFieldItemType */ /* public TMultiFieldItemType members */ TMultiFieldItemType::TMultiFieldItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definition list ) : TSyncItemType(aSessionP,aTypeConfigP,aCTType,aVerCT,aRelatedDatastoreP) { // save field definition pointer fFieldDefinitionsP = aFieldDefinitions; if (!fFieldDefinitionsP) SYSYNC_THROW(TSyncException(DEBUGTEXT("MultiFieldItemType without fieldDefinitions","mfit1"))); // create options array fFieldOptionsP = new TFieldOptions[fFieldDefinitionsP->numFields()]; // - init default options for (sInt16 i=0; inumFields(); i++) { // by default, all fields in the list are available fFieldOptionsP[i].available=true; // available fFieldOptionsP[i].maxsize= aSessionP->fLimitedRemoteFieldLengths ? FIELD_OPT_MAXSIZE_UNKNOWN : // limited, but unknown length FIELD_OPT_MAXSIZE_NONE; // no known limit fFieldOptionsP[i].maxoccur=0; // maximum occurrence count not defined fFieldOptionsP[i].notruncate=false; // allow truncation by default } } // TMultiFieldItemType::TMultiFieldItemType TMultiFieldItemType::~TMultiFieldItemType() { // remove fields options array delete [] fFieldOptionsP; } // TMultiFieldItemType::~TMultiFieldItemType // compatibility (=assignment compatibility between items based on these types) bool TMultiFieldItemType::isCompatibleWith(TSyncItemType *aReferenceType) { // check compatibility // - reference must be based on TMultiFieldItemType if (!aReferenceType->isBasedOn(ity_multifield)) return false; // - both multifields must be based on same field list return fFieldDefinitionsP == static_cast(aReferenceType)->fFieldDefinitionsP; } // TMultiFieldItemType::isCompatibleWith // Initialize use of datatype with a datastore // Note: This might not affect any datatype-related members, as datatype can // be in use by different datastores at a time. Intitialisation is // performed on members of the datastore (such as fXXXXTypeScriptContextP) void TMultiFieldItemType::initDataTypeUse(TLocalEngineDS *aDatastoreP, bool aForSending, bool aForReceiving) { #ifdef SCRIPT_SUPPORT // Note: identifier situation is equal for all calls of initDataTypeUse, however, // as multiple datastores might use the datatype, several instances of the // context (with separate local var VALUEs) might exist. // Delete old context(s), if any if (aDatastoreP->fSendingTypeScriptContextP && aForSending) { // delete only if actually using this type for sending (otherwise, sending context must be left untouched) delete aDatastoreP->fSendingTypeScriptContextP; aDatastoreP->fSendingTypeScriptContextP=NULL; } if (aDatastoreP->fReceivingTypeScriptContextP && aForReceiving) { // delete only if actually using this type for receiving (otherwise, receiving context must be left untouched) delete aDatastoreP->fReceivingTypeScriptContextP; aDatastoreP->fReceivingTypeScriptContextP=NULL; } // Create contexts in datastore and instantiate variables for scripts TMultiFieldTypeConfig *cfgP = getMultifieldTypeConfig(); // Get context // NOTE: if initialized for both sending and receiving, only the sending // context will be used for both receiving and sending TScriptContext **ctxPP; if (aForSending) // sending or both ctxPP = &aDatastoreP->fSendingTypeScriptContextP; else // only receiving ctxPP = &aDatastoreP->fReceivingTypeScriptContextP; // NOTE: always rebuild all scripts, even though // some might remain unused in the sending or receiving context // This is needed because we don't know at ResolveScript() if a // type will be used for input or output only, and rebuild must // be in the same order as Resolve to guarantee same var/field indexes. // - init script (will be executed right after all scripts are resolved) TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fInitScript,*ctxPP,fSessionP); // - incoming and outgoing data brush-ups scripts TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fIncomingScript,*ctxPP,fSessionP); TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fOutgoingScript,*ctxPP,fSessionP); // - filtering scripts TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fFilterInitScript,*ctxPP,fSessionP); TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fPostFetchFilterScript,*ctxPP,fSessionP); // - compare and merge scripts #ifdef SYSYNC_SERVER TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fCompareScript,*ctxPP,fSessionP); TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fMergeScript,*ctxPP,fSessionP); #endif // - special processing of incoming items before they are sent to the DB TScriptContext::rebuildContext(cfgP->getSyncAppBase(),cfgP->fProcessItemScript,*ctxPP,fSessionP,true); // now build vars // Now execute init script // - init the needed member vars fDsP = aDatastoreP; fFirstItemP = NULL; fSecondItemP = NULL; fEqMode = eqm_none; fCurrentSyncOp = sop_none; TScriptContext::execute( *ctxPP, // the context cfgP->fInitScript, // the script &DataTypeFuncTable, // context function table this // context data (myself) ); #endif } // TMultiFieldItemType::initDataTypeUse #ifdef OBJECT_FILTERING // - check if new-style filtering needed void TMultiFieldItemType::initPostFetchFiltering(bool &aNeeded, bool &aNeededForAll, TLocalEngineDS *aDatastoreP) { // init filter and determine if we need any filtering #ifndef SCRIPT_SUPPORT aNeeded=false; aNeededForAll=false; #else fNeedToFilterAll=true; // init member that will be acessed by the script fDsP=aDatastoreP; // set for access from script funcs fFirstItemP = NULL; fSecondItemP = NULL; fEqMode = eqm_none; aNeeded=TScriptContext::executeTest( false, // default to no need for any filters aDatastoreP->fSendingTypeScriptContextP, static_cast(fTypeConfigP)->fFilterInitScript, &DataTypeFuncTable, // context function table this // context data (myself) ); // - copy back script output aNeededForAll=fNeedToFilterAll; if (!aNeeded) aNeededForAll=false; // keep this consistent POBJDEBUGPRINTFX(fSessionP,DBG_FILTER,( "Type-specific postfetch filtering %sneeded%s", aNeeded ? "" : "NOT ", aNeeded ? (aNeededForAll ? " and to be applied to all records" : " only for changed records") : "" )); #endif } // TMultiFieldItemType::initPostFetchFiltering // called by TMultiField::postFetchFiltering() // Checks if to-be-sent item fetched from DB passes all filters to be actually sent to remote bool TMultiFieldItemType::postFetchFiltering(TMultiFieldItem *aItemP, TLocalEngineDS *aDatastoreP) { #ifndef SCRIPT_SUPPORT return true; // no scripts, always pass #else // if no script, always pass string &script = static_cast(fTypeConfigP)->fPostFetchFilterScript; if (script.empty()) return true; // call script to test filter fDsP=aDatastoreP; // set for access from script funcs fFirstItemP = NULL; fSecondItemP = NULL; fEqMode = eqm_none; fCurrentSyncOp = aItemP->getSyncOp(); return TScriptContext::executeTest( false, // default to not passing if filter script fails or returns no value aDatastoreP->fSendingTypeScriptContextP, script, &DataTypeFuncTable, // context function table this, // context data (myself) aItemP, // target item true // can be written if needed ); #endif } // TMultiFieldItemType::postFetchFiltering #endif // check item before processing it bool TMultiFieldItemType::checkItem(TMultiFieldItem &aItem, TLocalEngineDS *aDatastoreP) { #ifndef SCRIPT_SUPPORT return true; // simply ok #else // execute a script if there is a context for it fDsP=aDatastoreP; // set for access from script funcs fFirstItemP = &aItem; fSecondItemP = NULL; fEqMode = eqm_none; fCurrentSyncOp = aItem.getSyncOp(); return TScriptContext::execute( aDatastoreP->fReceivingTypeScriptContextP ? aDatastoreP->fReceivingTypeScriptContextP : aDatastoreP->fSendingTypeScriptContextP, static_cast(fTypeConfigP)->fProcessItemScript, &DataTypeFuncTable, // context function table this, // context data (myself) &aItem, // the item true // checking might change data ); fFirstItemP = NULL; #endif } // TMultiFieldItemType::checkItem #ifdef SYSYNC_SERVER // compare two items sInt16 TMultiFieldItemType::compareItems( TMultiFieldItem &aFirstItem, TMultiFieldItem &aSecondItem, TEqualityMode aEqMode, bool aDebugShow, TLocalEngineDS *aDatastoreP ) { #ifndef SCRIPT_SUPPORT // just do standard compare return aFirstItem.standardCompareWith(aSecondItem,aEqMode,aDebugShow); #else // if no script use standard comparison sInt16 cmpres; string &script = static_cast(fTypeConfigP)->fCompareScript; if (script.empty()) return aFirstItem.standardCompareWith(aSecondItem,aEqMode,aDebugShow); // execute script to perform comparison // - set up helpers fDsP = aDatastoreP; fEqMode = aEqMode; fFirstItemP = &aFirstItem; fSecondItemP = &aSecondItem; fCurrentSyncOp = fDsP->fCurrentSyncOp; TItemField *resP=NULL; bool ok=TScriptContext::executeWithResult( resP, // result will be put here if there is one aDatastoreP->fReceivingTypeScriptContextP ? aDatastoreP->fReceivingTypeScriptContextP : aDatastoreP->fSendingTypeScriptContextP, script, &DataTypeFuncTable, // context function table this, // context data (myself) &aFirstItem, // winning item false, // compare is read-only &aSecondItem, // loosing item false, // compare is read-only !PDEBUGTEST(DBG_MATCH+DBG_EXOTIC) // suppress script debug output unless comparison detail display is on ); // items are no longer available fFirstItemP = NULL; fSecondItemP = NULL; // get result cmpres=SYSYNC_NOT_COMPARABLE; // default to not comparable (if error or no result) if (ok) { if (resP) cmpres=resP->getAsInteger(); } // dispose result field if (resP) delete resP; // return result return cmpres; #endif } // TMultiFieldItemType::compareItems // merge two items void TMultiFieldItemType::mergeItems( TMultiFieldItem &aWinningItem, TMultiFieldItem &aLoosingItem, bool &aChangedWinning, bool &aChangedLoosing, TLocalEngineDS *aDatastoreP, int mode ) { #ifndef SCRIPT_SUPPORT // just do standard merge aWinningItem.standardMergeWith(aLoosingItem,aChangedWinning,aChangedLoosing,mode); return; #else // if no script use standard merging string &script = static_cast(fTypeConfigP)->fMergeScript; if (script.empty()) { aWinningItem.standardMergeWith(aLoosingItem,aChangedWinning,aChangedLoosing,mode); return; } // execute script to perform merge // - set up helpers fDsP = aDatastoreP; fFirstItemP = &aWinningItem; fSecondItemP = &aLoosingItem; fChangedFirst = aChangedWinning; fChangedSecond = aChangedLoosing; fCurrentSyncOp = fDsP->fCurrentSyncOp; fMergeMode = mode; TScriptContext::execute( aDatastoreP->fReceivingTypeScriptContextP ? aDatastoreP->fReceivingTypeScriptContextP : aDatastoreP->fSendingTypeScriptContextP, script, &DataTypeFuncTable, // context function table this, // context data (myself) &aWinningItem, // winning item true, // can be written if needed &aLoosingItem, // loosing item true, // can be written if needed !PDEBUGTEST(DBG_CONFLICT) // script output only if conflict details enabled ); // items are no longer available fFirstItemP = NULL; fSecondItemP = NULL; // get change status back aChangedWinning = fChangedFirst; aChangedLoosing = fChangedSecond; #endif } // TMultiFieldItemType::mergeItems #endif // SYSYNC_SERVER // helper to create same-typed instance via base class TSyncItemType *TMultiFieldItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TMultiFieldItemType,DBG_OBJINST,"TMultiFieldItemType",TMultiFieldItemType(aSessionP,fTypeConfigP,getTypeName(),getTypeVers(),aDatastoreP,fFieldDefinitionsP)); } // TMultiFieldItemType::newCopyForSameType /// @brief copy CTCap derived info from another SyncItemType /// @return false if item not compatible /// @note required to create remote type variants from ruleMatch type alternatives bool TMultiFieldItemType::copyCTCapInfoFrom(TSyncItemType &aSourceItem) { // must be based on same type as myself and have the same fieldlist if (!aSourceItem.isBasedOn(getTypeID())) return false; // not compatible TMultiFieldItemType *itemTypeP = static_cast(&aSourceItem); if (fFieldDefinitionsP!=itemTypeP->fFieldDefinitionsP) return false; // not compatible // both have the same fFieldDefinitionsP, so both option arrays have the same size // - we can copy the options 1:1 for (sInt16 i=0; inumFields(); i++) { // by default, all fields in the list are available fFieldOptionsP[i] = itemTypeP->fFieldOptionsP[i]; } // other CTCap info is in the field options of MultiFieldItemType return inherited::copyCTCapInfoFrom(aSourceItem); } // TMultiFieldItemType::copyCTCapInfoFrom // apply default limits to type (e.g. from hard-coded template in config) void TMultiFieldItemType::addDefaultTypeLimits(void) { #ifdef HARDCODED_TYPE_SUPPORT // get default type settings from field list template if (fFieldDefinitionsP && fFieldDefinitionsP->fFieldListTemplateP) { // copy options from field list template for (sInt16 i=0; ifFieldListTemplateP->numFields; i++) { // get options TFieldOptions *optP = getFieldOptions(i); // transfer limits if not already defined // - max field size if (optP->maxsize==FIELD_OPT_MAXSIZE_NONE) optP->maxsize=fFieldDefinitionsP->fFieldListTemplateP->fieldDefs[i].maxSize; // - notruncate option if (!optP->notruncate) optP->notruncate=fFieldDefinitionsP->fFieldListTemplateP->fieldDefs[i].noTruncate; } } #endif } // TMultiFieldItemType::addDefaultTypeLimits // access to fields by name (returns FID_NOT_SUPPORTED if field not found) sInt16 TMultiFieldItemType::getFieldIndex(const char *aFieldName) { for (sInt16 i=0; inumFields(); i++) { if (strucmp(aFieldName,fFieldDefinitionsP->fFields[i].TCFG_CSTR(fieldname))==0) return i; // found } return FID_NOT_SUPPORTED; // not found } // TMultiFieldItemType::getFieldIndex bool TMultiFieldItemType::isFieldIndexValid(sInt16 aFieldIndex) { return (aFieldIndex>=0 && aFieldIndexnumFields()); } // TMultiFieldItemType::isFieldIndexValid // access to field options (returns NULL if field not found) TFieldOptions *TMultiFieldItemType::getFieldOptions(sInt16 aFieldIndex) { if (!isFieldIndexValid(aFieldIndex)) return NULL; return &(fFieldOptionsP[aFieldIndex]); } // TMultiFieldItemType::getFieldOptions // test if item could contain cut-off data (e.g. because of field size restrictions) // compared to specified reference item // NOTE: if no reference item is specified, any occurrence of a // size-limited field will signal possible cutoff bool TMultiFieldItemType::mayContainCutOffData(TSyncItemType *aReferenceType) { TMultiFieldItemType *refP=NULL; if (aReferenceType->isBasedOn(ity_multifield)) refP=static_cast(aReferenceType); for (sInt16 i=0; inumFields(); i++) { sInt32 refsize,mysize; mysize = getFieldOptions(i)->maxsize; if (refP) refsize = refP->getFieldOptions(i)->maxsize; else refsize = FIELD_OPT_MAXSIZE_NONE; // assume no limit // now sort out cases: cutOff data can happen if if ( // - this field is somehow limited && reference field is unlimited or limited, but unknown (mysize!=FIELD_OPT_MAXSIZE_NONE && (refsize<=0)) || // - this field has smaller size than reference field (mysize0 && refsize>0) ) { // field could contain cut-off data (when conataining data from reference type) return true; } } // no field limits detected, no cutoff return false; } // TMultiFieldItemType::mayContainCutOffData // fill in SyncML data (but leaves IDs empty) // Note: for MultiFieldItem, this is for post-processing data (FieldFillers) bool TMultiFieldItemType::internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ) { #if defined(SCRIPT_SUPPORT) // check type TMultiFieldItem *itemP; GET_CASTED_PTR(itemP,TMultiFieldItem,aSyncItemP,DEBUGTEXT("TMultiFieldItemType::internalFillInData: incompatible item class","mfit2")); #endif #ifdef SCRIPT_SUPPORT // post-process data: apply incoming script // - init the needed member vars fDsP = aLocalDatastoreP; fFirstItemP = itemP; fSecondItemP = NULL; fEqMode = eqm_none; fCurrentSyncOp = itemP->getSyncOp(); TScriptContext::execute( aLocalDatastoreP->fReceivingTypeScriptContextP ? aLocalDatastoreP->fReceivingTypeScriptContextP : // separate context for receiving, use it aLocalDatastoreP->fSendingTypeScriptContextP, // send and receive use same context (sending one) static_cast(fTypeConfigP)->fIncomingScript, &DataTypeFuncTable, this, itemP, true, NULL, false, !PDEBUGTEST(DBG_PARSE) ); fFirstItemP = NULL; #endif // - do NOT call ancestor (it's a dummy for types w/o implementation returning false) // can't go wrong return true; } // TMultiFieldItemType::internalFillInData // sets data and meta from SyncItem data, but leaves source & target untouched // Note: for MultiFieldItem, this is for pre-processing data (FieldFillers) bool TMultiFieldItemType::internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ) { #if defined(SCRIPT_SUPPORT) // check type TMultiFieldItem *itemP; GET_CASTED_PTR(itemP,TMultiFieldItem,aSyncItemP,DEBUGTEXT("TMultiFieldItemType::internalSetItemData: incompatible item class","mdit8")); // do NOT call ancestor (it's a dummy for types w/o implementation returning false) #endif #ifdef SCRIPT_SUPPORT // pre-process data: apply outgoing script // - init the needed member vars fDsP = aLocalDatastoreP; fFirstItemP = itemP; fSecondItemP = NULL; fEqMode = eqm_none; fCurrentSyncOp = itemP->getSyncOp(); return TScriptContext::execute( aLocalDatastoreP->fSendingTypeScriptContextP, static_cast(fTypeConfigP)->fOutgoingScript, &DataTypeFuncTable, this, itemP, true, NULL, false, !PDEBUGTEST(DBG_GEN) ); fFirstItemP = NULL; #else // can't go wrong return true; #endif } // TMultiFieldItemType::internalSetItemData } // namespace sysync /* end of TMultiFieldItemType implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/multifielditemtype.h0000755000373300037200000002324412424517753026745 0ustar00nightlyallusers00000000000000/* * File: MultiFieldItemType.h * * Author: Lukas Zeller (luz@plan44.ch) * * TMultiFieldItemType * Type consisting of multiple data fields (TItemField objects) * To be used as base class for field formats like vCard, * vCalendar etc. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-13 : luz : created * */ #ifndef MultiFieldItemType_H #define MultiFieldItemType_H // includes #include "syncitemtype.h" #include "multifielditem.h" #include "scriptcontext.h" using namespace sysync; namespace sysync { // special field IDs #define FID_NOT_SUPPORTED -128 // no field-ID #if defined(VARIDX_UNDEFINED) && FID_NOT_SUPPORTED!=VARIDX_UNDEFINED #error "FID_NOT_SUPPORTED must be the same as VARIDX_UNDEFINED" #endif // special field offsets #define OFFS_NOSTORE -9999 // offset meaning "do not store" // special repeat counts #define REP_REWRITE 0 // unlimited repeating, but later occurrences overwrite previous ones #define REP_ARRAY 32767 // virtually unlimited repeating, should be used with array fields only // default profile mode (devivates might define their own) #define PROFILEMODE_DEFAULT 0 // default mode of the profile, usually MIME-DIR // type-instance specific options (there can be multiple // TSyncItemType instances with the same TFieldListConfig, // but different sets of field options, e.g. different // versions of the same content type where one has fewer // fields implemented, or server and client types with // differing sets of available fields) #define FIELD_OPT_MAXSIZE_UNKNOWN -1 #define FIELD_OPT_MAXSIZE_NONE 0 typedef struct { bool available; // set if field is available in this type sInt32 maxsize; // maximum field length, FIELD_OPT_MAXSIZE_NONE=none, FIELD_OPT_MAXSIZE_UNKNOWN=limited, but unknown bool notruncate; // set if type doesn't want to get truncated values for this field from remote sInt32 maxoccur; // maximum number of repetitions of properties based on this field } TFieldOptions; // multi-field based datatype class TMultiFieldTypeConfig : public TDataTypeConfig { typedef TDataTypeConfig inherited; public: TMultiFieldTypeConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TMultiFieldTypeConfig(); // properties // - associated field list config (normally set from derived type) TFieldListConfig *fFieldListP; // - associated profile TProfileConfig *fProfileConfigP; // - mode for profile sInt32 fProfileMode; #ifdef SCRIPT_SUPPORT // - scripts string fInitScript; // executed once per usage by a datastore string fIncomingScript; // script that is executed after receiving item string fOutgoingScript; // script that is executed just before sending item string fFilterInitScript; // script that is executed once per session when filter params are all available. Must return true if something to filter at all string fPostFetchFilterScript; // script that is executed after item is fetched from DB. Must return true if item passes string fCompareScript; // script that is executed to compare items string fMergeScript; // script that is executed to merge items string fProcessItemScript; // script that is executed to decide what to do with an incoming item #endif #ifdef HARDCODED_TYPE_SUPPORT void setConfig(TFieldListConfig *aFieldList, const char *aTypeName, const char* aTypeVers); #endif protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); #endif virtual void clear(); }; // TMultiFieldTypeConfig class TMultiFieldItemType: public TSyncItemType { typedef TSyncItemType inherited; public: TMultiFieldItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definition list ); virtual ~TMultiFieldItemType(); // access to type virtual uInt16 getTypeID(void) const { return ity_multifield; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_multifield ? true : TSyncItemType::isBasedOn(aItemTypeID); }; // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // MultiFields are implemented // compatibility (=assignment compatibility between items based on these types) virtual bool isCompatibleWith(TSyncItemType *aReferenceType); // test if item could contain cut-off data (e.g. because of field size restrictions) // compared to specified reference item virtual bool mayContainCutOffData(TSyncItemType *aReferenceType); // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL non-virtual DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); /// @brief copy CTCap derived info from another SyncItemType virtual bool copyCTCapInfoFrom(TSyncItemType &aSourceItemP); // apply default limits to type (e.g. from hard-coded template in config) virtual void addDefaultTypeLimits(void); // get config pointer TMultiFieldTypeConfig *getMultifieldTypeConfig(void) { return static_cast(fTypeConfigP); }; // access field definitions TFieldListConfig *getFieldDefinitions(void) { return fFieldDefinitionsP; }; // access to fields by name (returns -1 if field not found) sInt16 getFieldIndex(const char *aFieldName); bool isFieldIndexValid(sInt16 aFieldIndex); // access to field options (returns NULL if field not found) TFieldOptions *getFieldOptions(sInt16 aFieldIndex); TFieldOptions *getFieldOptions(const char *aFieldName) { return getFieldOptions(getFieldIndex(aFieldName)); }; virtual bool hasReceivedFieldOptions(void) { return false; }; // returns true if field options are based on remote devinf (and not just defaults) // access to field definitions TFieldDefinition *getFieldDefinition(sInt16 aFieldIndex) { if (fFieldDefinitionsP) return &(fFieldDefinitionsP->fFields[aFieldIndex]); else return NULL; } // Prepare datatype for use with a datastore. This might be implemented // in derived classes to initialize the datastore's script context etc. virtual void initDataTypeUse(TLocalEngineDS *aDatastoreP, bool aForSending, bool aForReceiving); #ifdef OBJECT_FILTERING // new style generic filtering // - init new-style filtering, returns flag if needed at all virtual void initPostFetchFiltering(bool &aNeeded, bool &aNeededForAll, TLocalEngineDS *aDatastoreP); // - do the actual filtering bool postFetchFiltering(TMultiFieldItem *aItemP, TLocalEngineDS *aDatastoreP); // old style expression filtering // - get field index of given filter expression identifier. Note that // derived classes might first check for MIME property names etc. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { return getFieldIndex(aIdentifier); }; // base class just handles field names #endif // comparing and merging sInt16 compareItems(TMultiFieldItem &aFirstItem, TMultiFieldItem &aSecondItem, TEqualityMode aEqMode, bool aDebugShow, TLocalEngineDS *aDatastoreP); void mergeItems( TMultiFieldItem &aWinningItem, TMultiFieldItem &aLoosingItem, bool &aChangedWinning, bool &aChangedLoosing, TLocalEngineDS *aDatastoreP, int mode //< MERGE_OPTION_* ); // check item before processing it bool checkItem(TMultiFieldItem &aItem, TLocalEngineDS *aDatastoreP); protected: // Item data management // - create new sync item of proper type and optimization for specified target /* MultiFields are only a base class and lack implementation of the following: virtual TSyncItem *internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP); */ // - fill in SyncML data (but leaves IDs empty) // Note: for MultiFieldItem, this is for post-processing data (FieldFillers) virtual bool internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ); // - sets data and meta from SyncItem data, but leaves source & target untouched // Note: for MultiFieldItem, this is for pre-processing data (FieldFillers) virtual bool internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ); // field definition list pointer TFieldListConfig *fFieldDefinitionsP; public: // temporary variables needed by filter script context funcs bool fNeedToFilterAll; // need to filter all records, even not-changed ones (dynamic syncset) #ifdef SCRIPT_SUPPORT TLocalEngineDS *fDsP; // helper for script context funcs TMultiFieldItem *fFirstItemP; // helper for script context funcs TMultiFieldItem *fSecondItemP; // helper for script context funcs bool fChangedFirst; // helper for script context funcs bool fChangedSecond; // helper for script context funcs TEqualityMode fEqMode; // helper for script context funcs TSyncOperation fCurrentSyncOp; // helper for script context funcs int fMergeMode; // helper for script context funcs #endif private: // array of field options TFieldOptions *fFieldOptionsP; }; // TMultiFieldItemType } // namespace sysync #endif // MultiFieldItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/rawdataitemtype.cpp0000644000373300037200000001761612424517753026570 0ustar00nightlyallusers00000000000000/* * File: rawdataitemtype.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TRawDataItemType * Item type for 1:1 raw items (SyncML payload is exchanged 1:1 with database backend) * * Copyright (c) 2010 by Synthesis AG (www.synthesis.ch) * * 2010-05-14 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "rawdataitemtype.h" using namespace sysync; namespace sysync { // Config // ====== // MIMEDir-based datatype config TRawDataTypeConfig::TRawDataTypeConfig(const char* aName, TConfigElement *aParentElement) : TMultiFieldTypeConfig(aName,aParentElement) { clear(); } // TRawDataTypeConfig::TRawDataTypeConfig TRawDataTypeConfig::~TRawDataTypeConfig() { clear(); } // TRawDataTypeConfig::~TRawDataTypeConfig // init defaults void TRawDataTypeConfig::clear(void) { // clear FIDs fFidItemData = FID_NOT_SUPPORTED; // clear inherited inherited::clear(); } // TRawDataTypeConfig::clear // resolve dependencies void TRawDataTypeConfig::localResolve(bool aLastPass) { if (aLastPass) { // get FIDs of the fields we directly use // - the "ITEMDATA" field containing the raw item data fFidItemData = getFieldIndex("ITEMDATA",fFieldListP); if (fFidItemData==FID_NOT_SUPPORTED) goto missingfield; // %%% add more FID searches (and checks, if the field is mandatory) here } // resolve inherited inherited::localResolve(aLastPass); return; missingfield: SYSYNC_THROW(TConfigParseException("fieldlist for RawDataItem must contain certain predefined fields (like ITEMDATA)!")); } // TRawDataTypeConfig::localResolve // create Sync Item Type of appropriate type from config TSyncItemType *TRawDataTypeConfig::newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP) { return new TRawDataItemType( aSessionP, this, fTypeName.c_str(), fTypeVersion.c_str(), aDatastoreP, fFieldListP ); } // TRawDataTypeConfig::newSyncItemType #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TRawDataTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - none known here return TMultiFieldTypeConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TRawDataTypeConfig::localStartElement #endif /* * Implementation of TRawDataItemType */ TRawDataItemType::TRawDataItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ) : TMultiFieldItemType(aSessionP,aTypeConfigP,aCTType,aVerCT,aRelatedDatastoreP,aFieldDefinitions) { fCfgP = static_cast(aTypeConfigP); } // TRawDataItemType::TRawDataItemType TRawDataItemType::~TRawDataItemType() { } // TRawDataItemType::~TRawDataItemType // create new sync item of proper type and optimization for specified target TSyncItem *TRawDataItemType::internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP) { // All RawDataItems are stored in MultiFieldItems (in specific, predefined fields) TMultiFieldItemType *targetitemtypeP; GET_CASTED_PTR(targetitemtypeP,TMultiFieldItemType,aTargetItemTypeP,DEBUGTEXT("TRawDataItemType::internalNewSyncItem with bad-typed target","mdit6")); MP_RETURN_NEW(TMultiFieldItem,DBG_OBJINST,"TMultiFieldItem",TMultiFieldItem(this,targetitemtypeP)); } // TRawDataItemType::internalNewSyncItem // fill in SyncML data (but leaves IDs empty) bool TRawDataItemType::internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ) { // check type TMultiFieldItem *itemP; GET_CASTED_PTR(itemP,TMultiFieldItem,aSyncItemP,DEBUGTEXT("TRawDataItemType::internalFillInData: incompatible item class","mdit7")); // store data, if any, in predefined ITEMDATA field if (aItemP->data) { // read data into predefined raw data field TItemField *fldP = itemP->getField(fCfgP->fFidItemData); if (fldP) { // get raw data stringSize sz; cAppCharP data = smlPCDataToCharP(aItemP->data,&sz); // put it into ITEMDATA field fldP->setAsString(data, sz); } } else { // no data aStatusCmd.setStatusCode(412); // incomplete command ADDDEBUGITEM(aStatusCmd,"No data found in item"); return false; } // let ancestor process data as well return TMultiFieldItemType::internalFillInData(aSyncItemP,aItemP,aLocalDatastoreP,aStatusCmd); } // TRawDataItemType::internalFillInData // sets data and meta from SyncItem data, but leaves source & target untouched bool TRawDataItemType::internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ) { // check type TMultiFieldItem *itemP; GET_CASTED_PTR(itemP,TMultiFieldItem,aSyncItemP,DEBUGTEXT("TRawDataItemType::internalSetItemData: incompatible item class","mdit8")); // let ancestor prepare first if (!TMultiFieldItemType::internalSetItemData(aSyncItemP,aItem,aLocalDatastoreP)) return false; // generate data item from predefined ITEMDATA field TItemField *fldP = itemP->getField(fCfgP->fFidItemData); if (fldP) { string dataitem; if (fldP->isBasedOn(fty_blob)) { // is a BLOB, don't use getAsString as BLOB only returns pseudo-data indicating length of BLOB ((TBlobField *)fldP)->getBlobAsString(dataitem); } else { // for all other types, just get it as string fldP->getAsString(dataitem); } // put data item into opaque/cdata PCData aItem->data=newPCDataStringX((const uInt8 *)dataitem.c_str(),true,dataitem.size()); } // can't go wrong return true; } // TRawDataItemType::internalSetItemData // generates SyncML-Devinf property list for type SmlDevInfCTDataPropListPtr_t TRawDataItemType::newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor) { // return supported properties //#warning "TODO create this list from some configuration data" return NULL; // %%% for now: none } // Analyze CTCap part of devInf bool TRawDataItemType::analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP) { // no analysis so far // TODO: maybe add mechanism to capture CTCap here and pass it to the DB backend in a predefined field for analysis return inherited::analyzeCTCap(aCTCapP); } /// @brief helper to create same-typed instance via base class TSyncItemType *TRawDataItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TRawDataItemType,DBG_OBJINST,"TRawDataItemType",TRawDataItemType( aSessionP, fTypeConfigP, getTypeName(), getTypeVers(), aDatastoreP, fFieldDefinitionsP )); } // TRawDataItemType::newCopyForSameType /// @brief copy CTCap derived info from another SyncItemType /// @return false if item not compatible /// @note required to create remote type variants from ruleMatch type alternatives bool TRawDataItemType::copyCTCapInfoFrom(TSyncItemType &aSourceItem) { // must be same type as myself or based on the type of myself if (!aSourceItem.isBasedOn(getTypeID())) return false; // not compatible //TRawDataItemType *itemTypeP = static_cast(&aSourceItem); // all CTCap info we might have is in the field options of MultiFieldItemType return inherited::copyCTCapInfoFrom(aSourceItem); } // TRawDataItemType::copyCTCapInfoFrom /* end of TRawDataItemType implementation */ } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/rawdataitemtype.h0000644000373300037200000000772412424517753026234 0ustar00nightlyallusers00000000000000/* * File: rawdataitemtype.h * * Author: Lukas Zeller (luz@plan44.ch) * * TRawDataItemType * Item type for 1:1 raw items (SyncML payload is exchanged 1:1 with database backend) * * Copyright (c) 2010 by Synthesis AG (www.synthesis.ch) * * 2010-05-14 : luz : created * */ #ifndef RawDataItemType_H #define RawDataItemType_H // includes #include "syncitemtype.h" #include "multifielditemtype.h" namespace sysync { // MIME-dir based datatype class TRawDataTypeConfig : public TMultiFieldTypeConfig { typedef TMultiFieldTypeConfig inherited; public: TRawDataTypeConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TRawDataTypeConfig(); // properties // public functions // - create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP); protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); virtual void clear(); public: // FIDs of the predefined fields we need to access sInt16 fFidItemData; // BLOB or string field that will contain item // %%% add more FID vars here }; // TRawDataTypeConfig const uInt16 ity_rawdata=90; // must be unique class TRawDataItemType: public TMultiFieldItemType { typedef TMultiFieldItemType inherited; friend class TMimeDirProfileHandler; public: // constructor TRawDataItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ); // destructor virtual ~TRawDataItemType(); // access to type virtual uInt16 getTypeID(void) const { return ity_rawdata; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_rawdata ? true : inherited::isBasedOn(aItemTypeID); }; // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // RawItem is an implementati on // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); protected: // CTCap parsing/generation // - analyze CTCap for specific type virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP); /// @brief copy CTCap derived info from another SyncItemType virtual bool copyCTCapInfoFrom(TSyncItemType &aSourceItemP); // - obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor); // Item data management // - create new sync item of proper type and optimization for specified target virtual TSyncItem *internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP); // - fill in SyncML data (but leaves IDs empty) virtual bool internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ); // - sets data and meta from SyncItem data, but leaves source & target untouched virtual bool internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ); private: // convenience casted pointer to my config TRawDataTypeConfig *fCfgP; }; // TRawDataItemType } // namespace sysync #endif // RawDataItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/remotedatastore.cpp0000755000373300037200000002337612424517753026571 0ustar00nightlyallusers00000000000000/* * File: RemoteDataStore.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TRemoteDataStore * Abstraction of remote data store for SyncML Server * Buffers and forwards incoming remote data store commands for * processing by sync engine. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-12 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "syncagent.h" #include "remotedatastore.h" using namespace sysync; /* * Implementation of TRemoteDataStore */ void TRemoteDataStore::init(void) { // nop so far } // TSyncDataStore::init void TRemoteDataStore::InternalResetDataStore(void) { // for server, get default GUID size (in case remote devInf does not send one) #ifdef SYSYNC_SERVER if (IS_SERVER) { fMaxGUIDSize = static_cast(getSession()->getSessionConfig())->fMaxGUIDSizeSent; } #endif } // TRemoteDataStore::InternalResetDataStore TRemoteDataStore::TRemoteDataStore(TSyncSession *aSessionP) : TSyncDataStore(aSessionP) { // nop so far } // TSyncDataStore::TSyncDataStore TRemoteDataStore::TRemoteDataStore( TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask ) : TSyncDataStore(aSessionP, aName, aCommonSyncCapMask) { // assume full name same as real name, but could be updated at or fFullName=aName; } // TSyncDataStore::TSyncDataStore TRemoteDataStore::~TRemoteDataStore() { InternalResetDataStore(); // nop so far } // TRemoteDataStore::~TRemoteDataStore // - return pure relative (item) URI (removes absolute part or ./ prefix) const char *TRemoteDataStore::DatastoreRelativeURI(const char *aURI) { return relativeURI(aURI,fSessionP->getRemoteURI()); } // TRemoteDataStore::DatastoreRelativeURI // check if this remote datastore is accessible with given URI // NOTE: URI might include path elements or CGI params that are // access options to the database. // Remote datastores however only represent devinf, so // it counts as name match if start of specified URI matches // name and then continues with "/" or "?" (subpaths and CGI ignored) uInt16 TRemoteDataStore::isDatastore(const char *aDatastoreURI) { // - make pure relative paths const char *nam=DatastoreRelativeURI(fName.c_str()); size_t n=strlen(nam); const char *uri=DatastoreRelativeURI(aDatastoreURI); // - compare up to end of local name if (strucmp(nam,uri,n,n)==0) { // beginnig matches. char c=uri[n]; // terminating char // match if full match, or uri continues with '/' or '?' // Note: return number of chars matched, to allow search for best match return (c==0 || c=='/' || c=='?') ? n : 0; } else return 0; // no match } // TRemoteDataStore::isDatastore // SYNC command bracket start (check credentials if needed) bool TRemoteDataStore::remoteProcessSyncCmd( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // status that might be modified bool &aQueueForLater // will be set if command must be queued for later (re-)execution ) { // adjust name of datastore (may include subpath or CGI) fFullName = smlSrcTargLocURIToCharP(aSyncP->source); // read meta of Sync Command for remote datastore // NOTE: this will overwrite Max values possibly read from DevInf // as meta is more accurate (actual free bytes/ids, not total) SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(aSyncP->meta); if (metaP) { if (metaP->mem) { // - max free bytes if (metaP->mem->free) if (!StrToLongLong(smlPCDataToCharP(metaP->mem->free),fFreeMemory)) return false; // - maximum ID if (metaP->mem->freeid) if (!StrToLongLong(smlPCDataToCharP(metaP->mem->freeid),fFreeID)) return false; } PDEBUGPRINTFX(DBG_REMOTEINFO,("Sync Meta provides memory constraints: FreeMem=" PRINTF_LLD ", FreeID=" PRINTF_LLD,PRINTF_LLD_ARG(fFreeMemory),PRINTF_LLD_ARG(fFreeID))); } return true; } // TRemoteDataStore::remoteProcessSyncCmd // SYNC command bracket end (but another might follow in next message) bool TRemoteDataStore::remoteProcessSyncCmdEnd(void) { // %%% nop for now, %%% possibly obsolete return true; } // TRemoteDataStore::remoteProcessSyncCmdEnd // end of all sync commands from client bool TRemoteDataStore::endOfClientSyncCmds(void) { // %%% nop for now, %%% possibly obsolete return true; } // TRemoteDataStore::endOfClientSyncCmds // set description structure of datastore bool TRemoteDataStore::setDatastoreDevInf( SmlDevInfDatastorePtr_t aDataStoreDevInfP, // the datastore DevInf TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes // list to add analyzed types if not already there ) { // get important info out of the structure SYSYNC_TRY { // - name (sourceRef) fName=smlPCDataToCharP(aDataStoreDevInfP->sourceref); #ifndef MINIMAL_CODE // - displayname fDisplayName=smlPCDataToCharP(aDataStoreDevInfP->displayname); #endif // - MaxGUIDsize if (aDataStoreDevInfP->maxguidsize) { if (!StrToLong(smlPCDataToCharP(aDataStoreDevInfP->maxguidsize),fMaxGUIDSize)) return false; } else { PDEBUGPRINTFX(DBG_REMOTEINFO,("Datastore DevInf does not specify MaxGUIDSize -> using default")); } PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,( "Remote Datastore Name='%s', DisplayName='%s', MaxGUIDSize=%ld", getName(), getDisplayName(), (long)fMaxGUIDSize )); PDEBUGPRINTFX(DBG_REMOTEINFO,( "Preferred Rx='%s' version '%s', preferred Tx='%s' version '%s'", smlPCDataToCharP(aDataStoreDevInfP->rxpref->cttype), smlPCDataToCharP(aDataStoreDevInfP->rxpref->verct), smlPCDataToCharP(aDataStoreDevInfP->txpref->cttype), smlPCDataToCharP(aDataStoreDevInfP->txpref->verct) )); // - analyze DS 1.2 style datastore local CTCap if (getSession()->getSyncMLVersion()>=syncml_vers_1_2) { // analyze CTCaps (content type capabilities) SmlDevInfCtcapListPtr_t ctlP = aDataStoreDevInfP->ctcap; // loop through list PDEBUGBLOCKDESC("RemoteTypes", "Analyzing remote types listed in datastore level CTCap"); if (getSession()->fIgnoreCTCap) { // ignore CTCap if (ctlP) { PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,("Remote rule prevents looking at CTCap")); } } else { while (ctlP) { if (ctlP->data) { // create appropriate remote data itemtypes if (TSyncItemType::analyzeCTCapAndCreateItemTypes( getSession(), this, // this is the DS1.2 style where CTCap is related to this datastore ctlP->data, // CTCap aLocalItemTypes, // look up in local types for specialized classes aNewItemTypes // add new item types here )) { // we have CTCap info of at least one remote type getSession()->fRemoteDataTypesKnown=true; } else return false; } // - go to next item ctlP=ctlP->next; } // while } PDEBUGENDBLOCK("RemoteTypes"); } // if >=DS1.2 // - analyze supported rx types TSyncDataStore *relDsP = getSession()->getSyncMLVersion()>=syncml_vers_1_2 ? this : NULL; fRxPrefItemTypeP=TSyncItemType::registerRemoteType(fSessionP,aDataStoreDevInfP->rxpref,aLocalItemTypes,aNewItemTypes,relDsP); fRxItemTypes.push_back(fRxPrefItemTypeP); registerTypes(fRxItemTypes,aDataStoreDevInfP->rx,aLocalItemTypes,aNewItemTypes,relDsP); // - analyze supported tx types fTxPrefItemTypeP=TSyncItemType::registerRemoteType(fSessionP,aDataStoreDevInfP->txpref,aLocalItemTypes,aNewItemTypes,relDsP); fTxItemTypes.push_back(fTxPrefItemTypeP); registerTypes(fTxItemTypes,aDataStoreDevInfP->tx,aLocalItemTypes,aNewItemTypes,relDsP); // - Datastore Memory if (aDataStoreDevInfP->dsmem) { // datastore provides memory information // Note: command meta could override these with actual free info // - max free bytes if (aDataStoreDevInfP->dsmem->maxmem) { if (!StrToLongLong(smlPCDataToCharP(aDataStoreDevInfP->dsmem->maxmem),fMaxMemory)) return false; else fFreeMemory=fMaxMemory; // default for free = max (sync meta might correct this) } // - maximum free ID if (aDataStoreDevInfP->dsmem->maxid) { if (!StrToLongLong(smlPCDataToCharP(aDataStoreDevInfP->dsmem->maxid),fMaxID)) return false; else fFreeID=fMaxID; // default for free = max (sync meta might correct this) } PDEBUGPRINTFX(DBG_REMOTEINFO,("DevInf provides DSMem: MaxMem=" PRINTF_LLD ", MaxID=" PRINTF_LLD,PRINTF_LLD_ARG(fFreeMemory),PRINTF_LLD_ARG(fMaxID))); } // - SyncCap - standard types currently ignored, only // our own extensions are relevant. // Corresponding code in TLocalEngineDS::newDevInfSyncCap() if (aDataStoreDevInfP->synccap) { SmlPcdataListPtr_t stlP = aDataStoreDevInfP->synccap->synctype; // loop through list PDEBUGBLOCKDESCCOLL("RemoteSyncTypes", "Analyzing remote sync types listed in datastore level SyncCap"); while (stlP) { if (stlP->data) { const char *type = smlPCDataToCharP(stlP->data); PDEBUGPRINTFX(DBG_REMOTEINFO,("SyncType='%s'", type)); fSyncModes.insert(type); if (!strcmp(type, "390001")) { fCanRestart = true; } } stlP = stlP->next; } PDEBUGENDBLOCK("RemoteSyncTypes"); } } SYSYNC_CATCH (...) DEBUGPRINTFX(DBG_ERROR,("******** setDatastoreDevInf caused exception")); return false; SYSYNC_ENDCATCH return true; } // TRemoteDataStore::setDatastoreDevInf /* end of TRemoteDataStore implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/remotedatastore.h0000755000373300037200000000545312424517753026232 0ustar00nightlyallusers00000000000000/* * File: RemoteDataStore.h * * Author: Lukas Zeller (luz@plan44.ch) * * TRemoteDataStore * Abstraction of remote data store for SyncML Server * Buffers and forwards incoming remote data store commands for * processing by sync engine. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-12 : luz : created * */ #ifndef RemoteDataStore_H #define RemoteDataStore_H // includes #include "sysync.h" #include "syncdatastore.h" namespace sysync { class TRemoteDataStore: public TSyncDataStore { typedef TSyncDataStore inherited; friend class TSyncAgent; private: void init(void); // internal init void InternalResetDataStore(void); // reset for re-use without re-creation public: TRemoteDataStore(TSyncSession *aSessionP); TRemoteDataStore(TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual void engResetDataStore(void) { InternalResetDataStore(); inherited::engResetDataStore(); }; virtual ~TRemoteDataStore(); // Naming // check if this remote datastore is accessible with given URI virtual uInt16 isDatastore(const char *aDatastoreURI); const char *getFullName(void) { return fFullName.c_str(); } void setFullName(const char *aFullName) { fFullName=aFullName; }; // - SYNC command bracket start (check credentials if needed) bool remoteProcessSyncCmd( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // status that might be modified bool &aQueueForLater // will be set if command must be queued for later (re-)execution ); // %%% probably obsolete %%%% process client commands in server case // - SYNC command bracket end (but another might follow in next message) bool remoteProcessSyncCmdEnd(void); // %%% probably obsolete %%%% process client commands in server case // - end of all sync commands from client bool endOfClientSyncCmds(void); // description structure of datastore (NULL if not available) // - set description structure, ownership is passed to TSyncDataStore virtual bool setDatastoreDevInf( SmlDevInfDatastorePtr_t aDataStoreDevInfP, // the datastore DevInf TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes // list to add analyzed types if not already there ); // helpers // - return display name #ifndef MINIMAL_CODE virtual const char *getDisplayName(void) { return fDisplayName.c_str(); }; #endif // - return pure relative (item) URI (removes absolute part or ./ prefix) const char *DatastoreRelativeURI(const char *aURI); protected: #ifndef MINIMAL_CODE // Display name of Datastore string fDisplayName; #endif private: string fFullName; }; // TRemoteDataStore } // namespace sysync #endif // RemoteDataStore_H // eof syncevolution-1.5/src/synthesis/src/sysync/rrules.cpp0000755000373300037200000023356712424517753024710 0ustar00nightlyallusers00000000000000/* * File: rrules.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Parser/Generator routines for vCalendar RRULES * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2004-11-23 : luz : created from exctracts from vcalendaritemtype.cpp * */ #include "prefix_file.h" #include #include "rrules.h" #if defined(SYSYNC_TOOL) #include "syncappbase.h" // for CONSOLEPRINTF #endif using namespace sysync; namespace sysync { // Names of weekdays in RRULEs const char* const RRULE_weekdays[ DaysOfWeek ] = { "SU", "MO", "TU", "WE", "TH", "FR", "SA" }; // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL // convert between RRULE and internal format int rruleConv(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" rrule ...")); CONSOLEPRINTF((" Convert between RRULE representations:")); CONSOLEPRINTF((" mode \"i\" : internal format: startdate,freq,freqmod,interval,firstmask,lastmask,until")); CONSOLEPRINTF((" (firstmask/lastmask in decimal or hex, until in ISO8601 format)")); CONSOLEPRINTF((" mode \"t\" : output only, like \"i\" but also shows table of first 10 recurrence dates")); CONSOLEPRINTF((" mode \"1\" : startdate,RRULE according to vCalendar 1.0 specs")); CONSOLEPRINTF((" mode \"2\" : startdate,RRULE according to iCalendar (RFC2445) specs")); return EXIT_SUCCESS; } // check for argument if (argc!=3) { CONSOLEPRINTF(("3 arguments required")); return EXIT_FAILURE; } // mode char inmode,outmode; // internal representation lineartime_t start; char freq; char freqmod; sInt16 interval; fieldinteger_t firstmask; fieldinteger_t lastmask; lineartime_t until; // time zone stuff timecontext_t rulecontext=TCTX_UNKNOWN; timecontext_t untilcontext; GZones zones; // RRULE char isodate[50]; char rulebuf[200]; string rrule,iso; // get input mode inmode=tolower(*(argv[0])); if (inmode!='i' && inmode!='1' && inmode!='2') { CONSOLEPRINTF(("invalid input mode, must be i, 1 or 2")); return EXIT_FAILURE; } // get output mode outmode=tolower(*(argv[1])); if (outmode!='i' && outmode!='t' && outmode!='1' && outmode!='2') { CONSOLEPRINTF(("invalid output mode, must be i, t, 1 or 2")); return EXIT_FAILURE; } CONSOLEPRINTF(("")); // reset params freq='0'; // frequency = none freqmod=' '; // frequency modifier interval=0; // interval firstmask=0; // day mask counted from the first day of the period lastmask=0; // day mask counted from the last day of the period until= noLinearTime; // last day // get input and convert to internal format (if needed) if (inmode=='i') { if (sscanf(argv[2], "%[^,],%c,%c,%hd,%lld,%lld,%s", rulebuf, &freq, &freqmod, &interval, &firstmask, &lastmask, isodate )!=7) { CONSOLEPRINTF(("invalid internal format input")); return EXIT_FAILURE; } // - convert dates ISO8601StrToTimestamp(rulebuf,start,rulecontext); // Start determines rule context ISO8601StrToTimestamp(isodate,until,untilcontext); // until will be converted to same context TzConvertTimestamp(until,untilcontext,rulecontext,&zones); } else if (inmode=='1') { if (sscanf(argv[2],"%[^,],%[^\n]",isodate,rulebuf)!=2) { CONSOLEPRINTF(("error, expected: startdate,RRULE")); return EXIT_FAILURE; } ISO8601StrToTimestamp(isodate,start,rulecontext); if (!RRULE1toInternal( rulebuf, // RRULE string to be parsed start, // reference date for parsing RRULE rulecontext, // time context of RRULE freq, freqmod, interval, firstmask, lastmask, until, untilcontext, NULL )) { CONSOLEPRINTF(("invalid/unsupported RRULE type 1 specification")); return EXIT_FAILURE; } } else if (inmode=='2') { if (sscanf(argv[2],"%[^,],%[^\n]",isodate,rulebuf)!=2) { CONSOLEPRINTF(("error, expected: startdate,RRULE")); return EXIT_FAILURE; } ISO8601StrToTimestamp(isodate,start,rulecontext); if (!RRULE2toInternal( rulebuf, // RRULE string to be parsed start, // reference date for parsing RRULE rulecontext, // time context of RRULE freq, freqmod, interval, firstmask, lastmask, until, untilcontext, NULL )) { CONSOLEPRINTF(("invalid/unsupported RRULE type 2 specification")); return EXIT_FAILURE; } } // convert to rrule (if needed) and output TimestampToISO8601Str(iso,start,rulecontext,true); if (outmode=='i' || outmode=='t') { TimestampToISO8601Str(rrule,until,TCTX_UTC,true); CONSOLEPRINTF(( "Internal format (start,freq,freqmod,interval,firstmask,lastmask,until:\n%s,%c,%c,%hd,0x%llX,0x%llX,%s", iso.c_str(), freq, freqmod, interval, firstmask, lastmask, rrule.c_str() )); // extra info if we have 't' table mode lineartime_t occurrence; if (outmode=='t') { sInt16 cnt; for (cnt=1; cnt<=10; cnt++) { // calculate date of cnt-th recurrence if (!endDateFromCount( occurrence, start, freq, freqmod, interval, firstmask, lastmask, cnt, true, // counting occurrences NULL )) break; // see if limit already reached if (occurrence>until) { cnt=0; break; } // show this recurrence TimestampToISO8601Str(iso,occurrence,rulecontext,true); CONSOLEPRINTF(( "%3d. occurrence at %s (%s)", cnt, iso.c_str(), RRULE_weekdays[lineartime2weekday(occurrence)] )); } // show end date if not all recurrences shown already if (cnt>10) { // calculate occurrence count if (countFromEndDate( cnt, true, // counting occurrences start, freq, freqmod, interval, firstmask, lastmask, until, NULL )) { if (cnt==0) { CONSOLEPRINTF(( "last occurrence: (repeating infinitely)", cnt, iso.c_str() )); } else { // convert back to date if (endDateFromCount( occurrence, start, freq, freqmod, interval, firstmask, lastmask, cnt, true, // counting occurrences NULL )) { TimestampToISO8601Str(iso,occurrence,rulecontext,true); CONSOLEPRINTF(( "%3d./LAST occ. at %s (%s)", cnt, iso.c_str(), RRULE_weekdays[lineartime2weekday(occurrence)] )); } } } } } } else if (outmode=='1') { if (!internalToRRULE1( rrule, // receives RRULE string freq, freqmod, interval, firstmask, lastmask, until, rulecontext, NULL )) { CONSOLEPRINTF(("Cannot show as RRULE type 1")); return EXIT_FAILURE; } CONSOLEPRINTF(("RRULE type 1 format (start,rrule):\n%s,%s",iso.c_str(),rrule.c_str())); } else if (outmode=='2') { if (!internalToRRULE2( rrule, // receives RRULE string freq, freqmod, interval, firstmask, lastmask, until, rulecontext, NULL )) { CONSOLEPRINTF(("Cannot show as RRULE type 2")); return EXIT_FAILURE; } CONSOLEPRINTF(("RRULE type 2 format (start,rrule):\n%s,%s",iso.c_str(),rrule.c_str())); } return EXIT_SUCCESS; } // rruleConv #endif // SYSYNC_TOOL /* // sample of a field block: Offset=0: - frequency codes: 0 = none, s = secondly, m = minutely, h = hourly, D = daily, W = weekly, M = monthly, Y = yearly - frequency modifiers space = none s = by second list m = by minute list h = by hour list W = by weekday list D = by monthday list Y = by yearday list N = by weeknumber list M = by monthlist P = by setposlist Offset=1: - interval Offset=2: - bit-coded list of items according to frequency modifier, relative to the beginning of the interval - for seconds, minutes, hours: Bit0=first, Bit1=second.... - for weekly: Bit0=Sun, Bit6=Sat - for monthly by weekday: Bit0=first Sun, Bit7=2nd Sun... Bit35=5th Sun - for monthly by day: Bit0=1st, Bit1=2nd, Bit31=31st. - for yearly by month: Bit0=jan, Bit1=feb,... - for yearly by weeknumber: Bit0=weekno1,.... Offset=3: - bit coded list of items according to frequency modifier, relative to the end of the interval: - Bit0=last, Bit1=second last, Bit2=third last.... - for weekly: Bit0=last Sun, Bit1=last Mon,... Bit7=second last Sun,... Offset=4: - end date. This is calculated from DTSTART and count if incoming rule does not specify an end date Offset=5: - for reference only */ // Converts internal recurrence into vCalendar 1.0 RRULE string bool internalToRRULE1( string &aString, // receives RRULE string char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask, fieldinteger_t lastmask, lineartime_t until, timecontext_t untilcontext, TDebugLogger *aLogP ) { // Now do the conversion string s; sInt16 i,j,k; fieldinteger_t m; bool repshown; aString.erase(); // frequency and modifier switch (freq) { case '0' : return true; // no repetition case 'D' : aString+='D'; break; case 'W' : aString+='W'; break; case 'M' : aString+='M'; if (freqmod=='W') aString+='P'; // by-(weekday)-position else if (freqmod=='D') aString+='D'; // by (month)day else goto incompat; break; case 'Y' : aString+='Y'; if (freqmod=='M') aString+='M'; // by month // else if (freqmod=='Y') aString+='D'; // by yearday, %%%% not supported else goto incompat; break; default : goto incompat; } // switch freq // add interval if (interval<1) goto incompat; StringObjAppendPrintf(aString,"%hd",interval); // add modifiers switch (freqmod) { case 'W' : if (freq=='M') { // Monthly by weekday m = firstmask; for (i=0; i<2; i++) { // - from start and from end for (j=0; j0) aString+='-'; else aString+='+'; } // show day aString+=' '; aString+=RRULE_weekdays[k]; } } } // - switch to those that are relative to the end of the month m = lastmask; } } else { // weekly by weekday for (k=0; k0) aString+='-'; } } // - switch to those that are relative to the end of the month / year m = lastmask; } break; case ' ' : // no modifiers, that's ok as well break; default : goto incompat; } // switch freqmod // add end date (or #0 if no end date = endless) if (until!=noLinearTime) { // there is an end date, use it aString+=' '; TimestampToISO8601Str(s, until, untilcontext); aString+=s; } else { // there is no end date, repeat forever aString+=" #0"; } // genereated a RRULE return true; incompat: // incompatible, cannot be shown as vCal 1.0 RRULE aString.erase(); return false; // no value generated } // internalToRRULE1 // Converts internal recurrence into vCalendar 2.0 RRULE string bool internalToRRULE2( string &aString, // receives RRULE string char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask, fieldinteger_t lastmask, lineartime_t until, timecontext_t untilcontext, TDebugLogger *aLogP ) { LOGDEBUGPRINTFX(aLogP,DBG_EXOTIC+DBG_GEN,( "InternalToRRULE2(): expanding freq=%c, freqmod=%c, interval=%hd, firstmask=%llX, lastmask=%llX", freq, freqmod, interval, (long long)firstmask, (long long)lastmask )); // Now do the conversion string s; sInt16 i,j,k; fieldinteger_t m; bool repshown; cAppCharP sep; aString.erase(); // frequency and modifier switch (freq) { case '0' : return true; // no repetition case 'D' : aString+="FREQ=DAILY"; break; case 'W' : aString+="FREQ=WEEKLY"; break; case 'M' : aString+="FREQ=MONTHLY"; break; case 'Y' : aString+="FREQ=YEARLY"; break; default : goto incompat; } // switch freq // add interval if (interval<1) goto incompat; StringObjAppendPrintf(aString,";INTERVAL=%hd",interval); // add modifiers switch (freqmod) { case 'W' : sep=";BYDAY="; if (freq=='M') { // Monthly by weekday m = firstmask; for (i=0; i<2; i++) { // - from start and from end for (j=0; j0) aString+='-'; StringObjAppendPrintf(aString,"%d",j+1); // - show if relative to beginning or end of month } // show day aString+=RRULE_weekdays[k]; } } } // - switch to those that are relative to the end of the month m = lastmask; } } else { // weekly by weekday for (k=0; k parse error switch (c) { case 'D' : freq='D'; break; case 'W' : freq='W'; freqmod='W'; break; case 'M' : freq='M'; // get modifier c=*p++; if (c=='P') freqmod='W'; // by weekday else if (c=='D') freqmod='D'; // by monthday else goto norep; // unknown modifier: cancel repetition (but no error) break; case 'Y' : freq='Y'; // get modifier c=*p++; if (c=='M') freqmod='M'; // by monthlist else if (c=='D') freqmod='Y'; // by day-of-year list %%% not supported else goto norep; // unknown modifier: cancel repetition (but no error) break; default : goto incompat; } // get interval while (isdigit(*p)) { interval=interval*10+((*p++)-'0'); } if (interval==0) goto incompat; // no interval is incompatible -> parse error // get modifier(s) if any switch (freq) { case 'W' : // weekly may or may not have modifiers do { do c=*p++; while(c==' '); // next non-space if (isalpha(c)) { c2=*p++; if (!isalpha(c2)) goto incompat; // bad weekday syntax -> parse error for (k=0;k parse error firstmask = firstmask | ((uInt64)1<'5' || c<'1') goto incompat; // no more than 5 weeks in a month! -> parse error j=c-'1'; // first occurrence=0 // check for '+' or '-' if (*p=='+') p++; // simply skip else if (!(fromstart=!(*p=='-'))) p++; // skip } else if (isalpha(c)) { // get weekday spec c2=*p++; if (!isalpha(c2)) goto incompat; // bad weekday syntax -> parse error for (k=0;k parse error m=(uInt64)1<<(DaysOfWeek*j+k); if (fromstart) firstmask |= m; else lastmask |= m; // add weekday rep } else { // end of modifiers p--; break; } } while(true); // check if we need defaults if (!(firstmask | lastmask)) { if (!dtstart) goto norep; // cannot set, no start date (but no error) // determine the repetition in the month of this weekday j=(startday-1) / DaysOfWeek; firstmask = ((uInt64)1<<(DaysOfWeek*j+startwday)); // set nth repetition of current weekday } } else { // must be 'D' = monthly by day of month do { fromstart=true; do c=*p++; while(c==' '); // next non-space if (c=='L' && *p=='D') { // special case: "LD" means last day of month lastmask |= 1; } else if (isdigit(c) && (*p) && (!isdigit(*p) || !isdigit(*(p+1)))) { // more than two digits are end date // get day number k=c-'0'; if (isdigit(*p)) k=k*10+((*p++)-'0'); // check for '+' or '-' if (*p=='+') p++; // simply skip plus if (!(fromstart=!(*p=='-'))) p++; // skip minus and set fromstart to false if (k==0) goto incompat; // 0 is not allowed -> parse error // set mask k--; // bits are 0 based m = (uInt64)1< parse error // set mask k--; // bits are 0 based firstmask |= (uInt64)1<= 4 digits) or # or end of string --p; // we have fetched one to many // - make best try to convert to by-monthlist freqmod='M'; firstmask = ((uInt64)1<<(startmonth-1)); // set bit of current day-in-month } // yearly modifiers done break; } // switch for modifier reading // get count or end date do c=*p++; while (c==' '); // next non-space cnt=2; // default to repeat once (=applied two times) if (c==0) goto calcenddate; else if (c=='#') { // count specified if (!StrToShort(p,cnt)) goto incompat; // bad count -> parse error calcenddate: if (!endDateFromCount(until,dtstart,freq,freqmod,interval,firstmask,lastmask,cnt,false,aLogP)) goto norep; untilcontext = startcontext; // until is in same context as start } // count specified else { // must be end date, or spec is bad p--; if (ISO8601StrToTimestamp(p, until, untilcontext)==0) goto incompat; // bad end date -> parse error } // end date specified // parsed ok, now store it goto store; norep: // no repetition (but no parse error generated) freq='0'; // frequency = none freqmod=' '; // frequency modifier interval=0; // interval firstmask=0; // day mask counted from the first day of the period lastmask=0; // day mask counted from the last day of the period until= noLinearTime; // last day store: return true; // ok incompat: // incompatible, value cannot be parsed usefully return false; // no value generated } // RRULE1toInternal /// @brief calculate end date of RRULE when count is specified /// @return true if repeating, false if not repeating at all /// @note returns until=noLinearTime for endless repeat (count=0) bool endDateFromCount( lineartime_t &until, lineartime_t dtstart, char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask,fieldinteger_t lastmask, sInt16 cnt, bool countsoccurrences, TDebugLogger *aLogP ) { // count<=0 means endless if (cnt<=0) { until= noLinearTime; // forever, we don't need a start date for this return true; // ok } // check no-rep cases if (cnt<0) return false; // negative count, no repeat if (dtstart==noLinearTime) return false; // no start date, cannot calc end date -> no rep (but no error) if (interval<=0) return false; // interval=0 means no recurrence (but no error) // default to dtstart until = dtstart; // calculate elements of start point sInt16 startwday; sInt16 startyear,startmonth,startday; lineartime_t starttime; starttime = lineartime2timeonly(dtstart); // start time of day startwday = lineartime2weekday(dtstart); // get starting weekday lineartime2date(dtstart,&startyear,&startmonth,&startday); // year, month, day-in-month // calculate interval repetitions (which is what is needed for daily and RRULE v1 calculation) sInt16 ivrep = (cnt-1)*interval; // check if daily if (freq == 'D') { // Daily recurrence is same for occurrence and interval counts LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: daily calc - same in all cases")); until = dtstart+(ivrep*linearDateToTimeFactor); return true; } else if (!countsoccurrences) { // RRULE v1 interpretation of count (=number of repetitions of interval, not number of occurrences) // - determine end of recurrence interval (which is usually NOT a occurrence precisely) switch (freq) { case 'W': LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: simple weekly calc")); // v1 end date calc, we need to take into account possible masks, so result must be end of interval, not just start date+interval // weekly: end date is last day of target week until=dtstart+((ivrep*DaysOfWeek-startwday+6)*linearDateToTimeFactor); return true; case 'M': LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: simple monthly calc")); startmonth--; // make 0 based startmonth += ivrep+1; // add number of months plus one (as we want next month, and then go one day back to last day of month) startyear += startmonth / 12; // update years startmonth = startmonth % 12 + 1; // update month and make 1 based again // - calculate last day in month of occurrence until = (date2lineardate(startyear,startmonth,1)-1)*linearDateToTimeFactor+starttime; return true; case 'Y': LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: simple yearly calc")); // yearly: end date is end of end year until = (date2lineardate(startyear+ivrep,12,31))*linearDateToTimeFactor+starttime; return true; } } else { // v2 type counting, means that count specifies number of occurrences, not interval repetitions // requires more elaborate expansion // NOTE: this does not work without masks set, so we need to calculate the default masks if none are explicitly set // - we need the number of days in the month in most cases sInt16 lastday = getMonthDays(lineartime2dateonly(dtstart)); // number of days in this month sInt16 newYearsPassed; switch (freq) { case 'W': LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: full expansion weekly calc")); // - make sure we have a mask if (firstmask==0 && lastmask==0) firstmask = 1<6) { // new week starts startwday=0; // skip part of interval which has no occurrence until+=(interval-1)*7*linearDateToTimeFactor; } } return true; case 'M': if (freqmod=='W') { // monthly by weekday LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: full expansion of monthly by weekday")); // - make sure we have a mask if (firstmask==0 && lastmask==0) firstmask = (uInt64)1<<(startwday+7*((startday-1)/7)); // set start day in mask // - now calculate while (firstmask || lastmask) { // calculate which weeks we are in sInt16 fwk=(startday-1) / 7; // start is nth week of the month sInt16 lwk=(lastday-startday) / 7; // start is nth-last week of the month if ( (firstmask & ((uInt64)1<<(startwday+7*fwk))) || // nth occurrence of weekday in month (lastmask & ((uInt64)1<<(startwday+7*lwk))) // nth-last occurrence of weekday in month ) { // found an occurrence cnt--; // count it if (cnt<=0) break; // found all } // increment day until+=linearDateToTimeFactor; startday++; // next day in month startwday++; if (startwday>6) startwday=0; // next day in the week // check for new month if (startday>lastday) { // new month starts sInt16 i=interval; while (true) { lastday = getMonthDays(lineartime2dateonly(until)); // number of days in next month startday = 1; // start at 1st of month again if (--i == 0) break; // done // skip entire next month until+=lastday*linearDateToTimeFactor; // advance by number of days in this month } // now recalculate weekday startwday=lineartime2weekday(until); // calculation continues here } } } else { // everything else, including no modifier, is treated as monthly by monthday LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: full expansion of monthly by monthday")); // - make sure we have a mask if (firstmask==0 && lastmask==0) firstmask = (uInt64)1<<(startday-1); // set start day in mask // - now calculate while (firstmask || lastmask) { if ( (firstmask & ((uInt64)1<<(startday-1))) || // nth day in month (lastmask & ((uInt64)1<<(lastday-startday))) // nth-last day in month ) { // found an occurrence cnt--; // count it if (cnt<=0) break; // found all } // increment day until+=linearDateToTimeFactor; startday++; // next day in month if (startday>lastday) { // new month starts sInt16 i=interval; while (true) { lastday = getMonthDays(lineartime2dateonly(until)); // number of days in next month startday = 1; // start at 1st of month again if (--i == 0) break; // done // skip entire next month until+=lastday*linearDateToTimeFactor; // advance by number of days in this month } } } } return true; case 'Y': if (freqmod=='M') { // Yearly by month LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: full expansion of yearly by month")); // - make sure we have a mask if (firstmask==0 && lastmask==0) firstmask = (uInt64)1<<(startmonth-1); // set start month in mask // - do entire calculation on 1st of month such that we can be sure that day exists (unlike a Feb 30th or April 31th) until -= (startday-1)*linearDateToTimeFactor; // - now calculate newYearsPassed=0; // occurrence interval can be at most 4 years in the future (safety abort) while (newYearsPassed<=4) { if (firstmask & ((uInt64)1<<(startmonth-1))) { // possibly found an occurrence // - is an occurrence only if that day exists in the month if (startday<=lastday) { cnt--; // count it newYearsPassed = 0; if (cnt<=0) break; // found all } } // go to same day in next month (and skip months that don't have that day, like an 31st April or 30Feb until+=lastday*linearDateToTimeFactor; startmonth++; if (startmonth>12) { // new year starts startmonth=1; newYearsPassed++; // skip additional years (in month steps) for (sInt16 i=(interval-1)*12; i>0; i--) { lastday = getMonthDays(lineartime2dateonly(until)); // number of days in next month // skip month until+=lastday*linearDateToTimeFactor; // advance by number of days in this month } } // get size of next month to check lastday = getMonthDays(lineartime2dateonly(until)); // number of days in next month } // move back to start day until += (startday-1)*linearDateToTimeFactor; } else { // everything else, including no modifier, is treated as yearly on the same date (multiple occurrences per year not supported) LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("endDateFromCount: full expansion of yearly by yearday - NOT SUPPORTED with more than one day")); until = (date2lineardate(startyear+ivrep,startmonth,startday))*linearDateToTimeFactor+starttime; } return true; } // switch } // no recurrence return false; } // endDateFromCount #ifdef DEBUG /* // %%%% hack debug #define SYNTHESIS_UNIT_TEST 1 #define UNIT_TEST_TITLE(a) #define UNIT_TEST_CALL(x,p,t,v) */ #endif #ifdef SYNTHESIS_UNIT_TEST // helper to create lineartime parameters static lineartime_t t(char *aTime) { if (!aTime || *aTime==0) return noLinearTime; timecontext_t tctx; lineartime_t res; ISO8601StrToTimestamp(aTime, res, tctx); return res; } // helper to show lineartime results static char buf[100]; char *s(lineartime_t aTime) { if (aTime==noLinearTime) return ""; string str; TimestampToISO8601Str(str, aTime, TCTX_UNKNOWN, true, false); strcpy(buf,str.c_str()); return buf; } // RRULE expansion tests bool test_expand_rrule(void) { bool ok=true; lineartime_t lt; TRRuleExpandStatus es; { UNIT_TEST_TITLE("Birthday 1"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2008-03-31T00:00:00"),'Y','M',1,0x4,0x0,t("2009-03-31T00:00:00"),t("2009-04-01T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-31T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 3) UNIT_TEST_TITLE("Birthday 2"); UNIT_TEST_CALL(initRRuleExpansion(es,t("1979-03-06T00:00:00"),'Y','M',1,0x4,0x0,t("2009-03-31T00:00:00"),t("2009-04-01T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // no occurrences (checked 32) UNIT_TEST_TITLE("Birthday 3"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2006-03-13T00:00:00"),'Y','M',1,0x4,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-13T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 5) UNIT_TEST_TITLE("Pay day"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2006-06-20T00:00:00"),'M','D',1,0x80000,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-20T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 35) UNIT_TEST_TITLE("St. Patrick's Day"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2006-03-17T00:00:00"),'Y','M',1,0x4,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-17T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 5) // Expanding 'Change fish tank filter': UNIT_TEST_TITLE("Change fish tank filter"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2007-10-21T00:00:00"),'W','W',5,0x1,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-29T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 17) // Expanding 'Start of British Summer Time': UNIT_TEST_TITLE("Start of British Summer Time"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2003-03-30T00:00:00"),'M','W',12,0x0,0x1,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-29T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 8) UNIT_TEST_TITLE("Birthday 4"); UNIT_TEST_CALL(initRRuleExpansion(es,t("1957-03-14T00:00:00"),'Y','M',1,0x4,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-14T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 54) UNIT_TEST_TITLE("Buy Lottery tickets"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2007-08-11T00:00:00"),'W','W',3,0x40,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-02-28T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-21T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 30) UNIT_TEST_TITLE("Recycling bin collection"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2007-08-17T00:00:00"),'W','W',2,0x20,0x0,t("2009-02-23T00:00:00"),t("2009-03-31T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-02-27T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-13T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-03-27T00:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); // generated occurrences (checked 44) UNIT_TEST_TITLE("test feb 29th"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2008-02-29T14:00:00"),'Y','M',1,0x0,0x0,t("2009-04-01T00:00:00"),t("2019-04-04T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2012-02-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2016-02-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); UNIT_TEST_TITLE("February and March 29th every year"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2008-02-29T14:00:00"),'Y','M',1,0x6,0x0,t("2009-04-01T00:00:00"),t("2016-04-04T00:00:00")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2010-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2011-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2012-02-29T14:00:00"),ok); // leap year UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2012-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2013-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2014-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2015-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2016-02-29T14:00:00"),ok); // leap year UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2016-03-29T14:00:00"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); UNIT_TEST_TITLE("suddenly expanding from start problem"); UNIT_TEST_CALL(initRRuleExpansion(es,t("2007-08-17"),'W','W',2,0x20,0x0,t("2009-07-04"),t("2009-08-08")),("-none-"),true,ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-07-17"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t("2009-07-31"),ok); UNIT_TEST_CALL(lt = getNextOccurrence(es),("lt = %s",s(lt)),lt==t(""),ok); } return ok; } #endif // SYNTHESIS_UNIT_TEST /// @brief initialize expansion of RRule void initRRuleExpansion( TRRuleExpandStatus &es, lineartime_t aDtstart, char aFreq, char aFreqmod, sInt16 aInterval, fieldinteger_t aFirstmask, fieldinteger_t aLastmask, lineartime_t aExpansionStart, lineartime_t aExpansionEnd ) { // %%% hardcoded for now es.weekstart = 0; // starts on sunday for now // save recurrence parameters es.freq = aFreq; es.freqmod = aFreqmod; es.interval = aInterval; es.firstmask = aFirstmask; es.lastmask = aLastmask; // analyze bits es.singleFMaskBit = -1; if (es.lastmask==0 && es.firstmask) { fieldinteger_t m = es.firstmask; es.singleFMaskBit = 0; while((m & 1)==0) { m>>=1; es.singleFMaskBit++; } // calculate bit number of next set bit if (m & ~1) es.singleFMaskBit = -1; // more bits to come - reset again } // init expansion parameters // - no valid occurrence yet es.started = false; // - elements of start point es.starttime = lineartime2timeonly(aDtstart); // start time of day lineartime2date(aDtstart,&es.startyear,&es.startmonth,&es.startday); // year, month, day-in-month // - cursor, initialized to start point es.cursor = aDtstart; es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); es.cursorWDay = lineartime2weekday(es.cursor); // get cursor weekday // save expansion range es.expansionEnd = aExpansionEnd; // can be noLinearTime if no end is set es.expansionStartDayOffset = 0; if (aExpansionStart!=noLinearTime) { // specified start of expansion period, apply if later than beginning of recurrence es.expansionStartDayOffset = (lineartime2dateonly(aExpansionStart)-lineartime2dateonly(es.cursor)); if (es.expansionStartDayOffset<0) es.expansionStartDayOffset = 0; } #ifdef SYNTHESIS_UNIT_TEST sInt16 y,m,d,h,mi,s,ms; lineartime2date(aExpansionStart, &y, &m, &d); lineartime2time(aExpansionStart, &h, &mi, &s, &ms); printf(" aExpansionStart = %04hd-%02hd-%02hd %02hd:%02hd:%02hd - es.expansionStartDayOffset=%ld\n",y,m,d,h,mi,s,es.expansionStartDayOffset); #endif } // advance cursor by given number of days static void adjustCursor(TRRuleExpandStatus &es, lineardate_t aDays) { // now days = number of days to advance es.cursor += aDays*linearDateToTimeFactor; // adjust weekday es.cursorWDay += aDays % DaysPerWk; if (es.cursorWDay<0) es.cursorWDay += DaysPerWk; else if (es.cursorWDay>=DaysPerWk) es.cursorWDay -= DaysPerWk; #ifdef SYNTHESIS_UNIT_TEST sInt16 y,m,d,h,mi,s,ms; lineartime2date(es.cursor, &y, &m, &d); lineartime2time(es.cursor, &h, &mi, &s, &ms); printf(" es.cursor = %04hd-%02hd-%02hd %02hd:%02hd:%02hd / Day=%hd, lt=%lld\n",y,m,d,h,mi,s,es.cursorWDay,es.cursor); #endif } static lineardate_t makeMultiple(lineardate_t d, sInt16 aMultiple, sInt16 aMaxRemainder=0) { if (aMultiple>1) { // we need to make sure remainder is 0 and advance extra lineardate_t r = d % aMultiple; // remainder if (r>aMaxRemainder) { // round up to next multiple d += aMultiple - r; } } return d; } // simple and fast cursor increment static void incCursor(TRRuleExpandStatus &es) { es.cursor += linearDateToTimeFactor; es.cursorWDay += 1; if (es.cursorWDay>=DaysPerWk) es.cursorWDay=0; } static bool expansionEnd(TRRuleExpandStatus &es) { if (es.expansionEnd && es.cursor>=es.expansionEnd) { // end of expansion, reset cursor es.cursor = noLinearTime; return true; } // not yet end of expansion return false; } static sInt16 monthDiff(sInt16 y1, sInt16 m1, sInt16 y2, sInt16 m2) { return (y1-y2)*12 + (m1-m2); } static void monthAdd(sInt16 &y, sInt16 &m, sInt16 a) { m += a; if (m>12) { sInt16 r = (m-1)/12; // years plus y += r; // add the years m -= (r*12); // remove from the months } } /// @brief get next occurrence /// @return noLinearTime if no next occurrence exists, lineartime of next occurrence otherwise lineartime_t getNextOccurrence(TRRuleExpandStatus &es) { if (es.cursor==noLinearTime) return noLinearTime; // already done (or never started properly) if (es.interval<=0) return noLinearTime; // interval=0 means no recurrence (but no error) // if we are already started, we need to advance the cursor first, then check for match bool advanceFirst = es.started; // now calculate if (es.freq=='D') { // Daily: can be calculated directly if (!es.started) { // calculate first occurrence adjustCursor(es, makeMultiple(es.expansionStartDayOffset, es.interval)); // move cursor to first day } else { // calculate next occurrence adjustCursor(es, es.interval); } } // D else if (es.freq=='W') { // Note: interval of weekly recurrences starts at sunday, // so recurrence starting at a Thu, scheduled for every two weeks on Mo and Thu will have: // 1st week: Thu, 2nd week: nothing, 3rd week: Mo,Thu, 4rd week: nothing, 5th week: Mo,Thu... if (!es.started) { // make sure we have a mask if (es.firstmask==0) es.firstmask = 1<0) { // need to go into subsequent month numMonths += es.interval-monthMod; // months to next interval start // entire month is after expansion start, so begin with 1st es.startday = 1; } monthAdd(es.startyear,es.startmonth,numMonths); // startYear/month/day now on first candidate // - calculate linear start es.cursor = date2lineartime(es.startyear, es.startmonth, es.startday); if (expansionEnd(es)) goto done; // could by beyond current expanding scope due to interval jump // - calculate last day in this month es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); // - make sure cursor weekday is correct es.cursorWDay = lineartime2weekday(es.cursor); } } // apply freqmod if (es.freqmod=='W') { // monthly by weekday // - calculate first/next occurrence (if not first occurrence, do not check initially but advance first) while(true) { // calculate which weeks we are in sInt16 fwk=(es.startday-1) / DaysPerWk; // start is nth week of the month sInt16 lwk=(es.cursorMLen-es.startday) / DaysPerWk; // start is nth-last week of the month // check if we found an occurrence if (!advanceFirst) { if ( (es.firstmask & ((uInt64)1<<(es.cursorWDay+DaysPerWk*fwk))) || // nth occurrence of weekday in month (es.lastmask & ((uInt64)1<<(es.cursorWDay+DaysPerWk*lwk))) // nth-last occurrence of weekday in month ) break; } advanceFirst = false; // next time we need to check // - next day-in-month is next candidate es.cursorWDay++; if (es.cursorWDay>=DaysPerWk) es.cursorWDay=0; // next day in the week es.startday++; if (es.startday>es.cursorMLen) { // end of month reached // - goto next relevant month monthAdd(es.startyear,es.startmonth,es.interval); // - first day es.startday=1; // - advance cursor into new month es.cursor = date2lineartime(es.startyear, es.startmonth, es.startday); // - get length of this month es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); // - make sure cursor weekday is correct es.cursorWDay = lineartime2weekday(es.cursor); } } // found occurrence, update cursor es.cursor = date2lineartime(es.startyear, es.startmonth, es.startday)+es.starttime; } // MW else { // monthly by monthday list // - calculate first/next occurrence (if not first occurrence, do not check initially but advance first) while(advanceFirst || !( (es.firstmask & ((uInt64)1<<(es.startday-1))) || // nth day in month (es.lastmask & ((uInt64)1<<(es.cursorMLen-es.startday))) // nth-last day in month )) { advanceFirst = false; // next time we need to check if (es.singleFMaskBit>=0) { // - next candidate is indicated by single mask bit if (es.startdayes.cursorMLen) { // end of month reached // - goto next relevant month monthAdd(es.startyear,es.startmonth,es.interval); // - first day es.startday=1; // - advance cursor into new month es.cursor = date2lineartime(es.startyear, es.startmonth, es.startday); // - get length of this month es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); } } // found occurrence, update cursor es.cursor = date2lineartime(es.startyear, es.startmonth, es.startday)+es.starttime; } // MD } // M else if (es.freq=='Y') { if (!es.started) { // Make sure we have a mask or cancel freqmod entirely if (es.firstmask==0 && es.lastmask==0) { // no mask at all, only startmonth counts anyway -> revert to simple direct calculation (cancel freqmod) es.freqmod = 0; } else if (es.singleFMaskBit>=0 && es.singleFMaskBit+1==es.startmonth) { // mask with single bit on start date month -> can revert to simple diect calculation (cancel freqmod) es.freqmod = 0; // no month list parsing needed } // For all yearly repeats: find first year to apply freqmod to if (es.expansionStartDayOffset) { // does not necessarily start in cursor year // - move cursor to where we want to begin earliest adjustCursor(es, es.expansionStartDayOffset); // - year of the expansion start sInt16 y,m,d; lineartime2date(es.cursor,&y,&m,&d); // year, month, day-in-month // - make sure cursor can be a candidate (i.e. is not before start) if (es.freqmod=='M') { if (d>es.startday) monthAdd(y, m, 1); // no occurrence possible in this month, next candidate is in next month } else { if (m>es.startmonth || (m==es.startmonth && d>es.startday)) y++; // no occurrence possible this year, next candidate is in next year } // - make sure we are in a year at the beginning of the interval sInt16 numYears = y-es.startyear; sInt16 yearMod = numYears % es.interval; if (yearMod>0) { // need to go into subsequent year numYears += es.interval-yearMod; // months to next interval start m = 1; // start with Jan again (only used below when checking monthlist i.e. freqmod==M) } es.startyear += numYears; if (es.freqmod=='M') { // month-by-month checking es.startmonth = m; } // startYear/month/day now on first candidate // - calculate linear start es.cursor = date2lineartime(es.startyear, es.startmonth, 1)+es.starttime; es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); adjustCursor(es, es.startday-1); if (expansionEnd(es)) goto done; // could by beyond current expanding scope due to interval jump // - calculate last day in this month } } // apply freqmod if (es.freqmod=='M') { // yearly by month list (and we really have a month list, not only a single month bit) // - calculate first/next occurrence (if not first occurrence, do not check initially but advance first) int yearsscanned = 0; do { while(advanceFirst || !( (es.firstmask & ((uInt64)1<<(es.startmonth-1))) || // nth month (es.lastmask & ((uInt64)1<<(12-es.startmonth))) // nth-last month )) { advanceFirst = false; // next time we need to check // - next month is next candidate es.startmonth++; if (es.startmonth>12) { // end of year reached // - goto next relevant year es.startyear += es.interval; yearsscanned ++; // - first month again es.startmonth = 1; } } // found possible occurrence (could be a day that does not exist in the month), update cursor es.cursor = date2lineartime(es.startyear, es.startmonth, 1)+es.starttime; es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); adjustCursor(es, es.startday-1); // repeat until day actually exists if (es.startday>es.cursorMLen) { // disable checking for match again advanceFirst = true; } } while(advanceFirst && yearsscanned<5); // found occurrence } // YM else { // yearly on same date while (advanceFirst || es.startday>es.cursorMLen ) { advanceFirst = false; // next time we need to check // just calculate next candiate es.startyear += es.interval; // update cursor and calculate es.cursor = date2lineartime(es.startyear, es.startmonth, 1)+es.starttime; es.cursorMLen = getMonthDays(lineartime2dateonly(es.cursor)); adjustCursor(es, es.startday-1); } // found occurrence } // Yx } // Y else { // unknown = nonexpandable recurrence // - return start date as first occurrence to make sure it does not get invisible if (es.started) { // subsequent occurrence requested: not available es.cursor = noLinearTime; } } // stop expansion if end of expansion period reached expansionEnd(es); done: // done es.started = true; return es.cursor; } // getNthNextOccurrence /// @brief calculate number of recurrences from specified end date of RRULE /// @return true if count could be calculated, false otherwise /// @param[in] dtstart, until : must be in the correct context to evaluate weekday rules /// @param[in] countsoccurrences : if true, counting occurrences (rather than intervals) /// @note returns until=noLinearTime for endless repeat (count=0) bool countFromEndDate( sInt16 &cnt, bool countsoccurrences, lineartime_t dtstart, char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask,fieldinteger_t lastmask, lineartime_t until, TDebugLogger *aLogP ) { if (dtstart==noLinearTime || interval<1) return false; // no start date or interval, cannot calc count if (until==noLinearTime) { // endless repeat cnt=0; return true; } // iterate until end date is reached cnt=1; lineartime_t occurrence=noLinearTime; // break after 500 recurrences while (cnt<500) { if (!endDateFromCount( occurrence, dtstart, freq,freqmod, interval, firstmask,lastmask, cnt, countsoccurrences, aLogP )) return false; // error, cannot calc end date if (occurrence>until) { // no more occurrences cnt--; if (cnt==0) return false; // if not endless, but no occurrence found in range -> not repeating return true; // return count } // next occurrence cnt++; } // 500 and more recurrences count as endless cnt=0; return true; } // countFromEndDate // Converts vCalendar 2.0 RRULE string into internal recurrence representation bool RRULE2toInternal( const char *aText, // RRULE string to be parsed lineartime_t dtstart, // reference date for parsing RRULE timecontext_t startcontext, // context of reference date char &freq, char &freqmod, sInt16 &interval, fieldinteger_t &firstmask, fieldinteger_t &lastmask, lineartime_t &until, timecontext_t &untilcontext, TDebugLogger *aLogP, lineartime_t *aNewStartP ) { #ifdef SYDEBUG string abc; LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("RRULE2toInternal(): start analyzing '%s'", aText)); #endif string temp; const char *p; char s [50]; sInt16 startwday; sInt16 startyear,startmonth,startday; string::size_type endIndex = 0; string::size_type startIndex = 0; uInt16 cnt = 0; size_t pos; bool calculateEndDate = false; // indicator that end date calc is required as last step bool calculateFirstOccurrence = false; // indicator that aNewStartP should be adjusted to show the first occurrence string key,value,byday,bymonthday,bymonth; // get elements of start point startwday=lineartime2weekday(dtstart); // get starting weekday lineartime2date(dtstart,&startyear,&startmonth,&startday); // year, month, day-in-month until= noLinearTime; // initialize end point, if not available // do the conversion here p=aText; int start = 0; // get freq if (!getNextDirective(temp, p, start)) { // failed goto incompat; } // analyze freq if (temp == "FREQ=YEARLY") { freq='Y'; } else if (temp == "FREQ=MONTHLY") { freq='M'; } else if (temp == "FREQ=WEEKLY") { freq='W'; } else if (temp == "FREQ=DAILY") { freq='D'; } else { goto incompat; } LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- found frequency %s which maps to freq %c", temp.c_str(), freq)); // init vars cnt = 0; // set interval to 1 interval = 1; freqmod = ' '; firstmask = 0; lastmask = 0; // get next directives while (getNextDirective(temp, p, start)) { LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- found next directive %s", temp.c_str())); // split pos = temp.find("="); if (pos == string::npos || pos == 0 || pos == (temp.length() - 1)) { goto incompat; } key = temp.substr(0, pos); value = temp.substr(pos + 1, temp.length() - 1); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted key/value %s/%s", key.c_str(), value.c_str())); // check for until if (key == "UNTIL") { if (ISO8601StrToTimestamp(value.c_str(), until, untilcontext)==0) goto incompat; // invalid end date calculateEndDate = false; } // check for count else if (key == "COUNT") { // convert count for (int i = 0, ii = value.length(); i < ii; ++i) { if (isdigit(value[i])) { cnt = cnt * 10 + ((value[i]) - '0'); } } // check if no count or one only if (cnt <= 1) goto norep; // no repetition // we need to recalculate the enddate from count calculateEndDate = true; } // check for interval else if (key == "INTERVAL") { // convert interval interval = 0; for (int i = 0, ii = value.length(); i < ii; ++i) { if (isdigit(value[i])) { interval = interval * 10 + ((value[i]) - '0'); } } if (interval == 0) goto incompat; // invalid interval } // just copy all supported BYxxx rules into vars else if (key == "BYDAY") byday = value; else if (key == "BYMONTHDAY") bymonthday = value; else if (key == "BYMONTH") bymonth = value; // ignore week start else if (key == "WKST") { // nop } else goto incompat; // unknown directive } // while #ifdef SYDEBUG LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- dtstart weekday is %i", startwday)); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted interval %u", interval)); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted interval (2nd time) %u", interval)); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted count %u", cnt)); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- end date calc required? %s", calculateEndDate ? "true" : "false")); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted byday %s", byday.c_str())); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted bymonthday %s", bymonthday.c_str())); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted bymonth %s", bymonth.c_str())); TimestampToISO8601Str(abc,until,startcontext,false,false); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- extracted until %s", abc.c_str())); #endif // Generally, we only support one BYxxx, not combinations. However, FREQ=YEARLY + BYMONTH + BYDAY is common // to express start and end times of DST in VTIMEZONEs, so we convert these into equivalent FREQ=MONTHLY if (freq=='Y' && !byday.empty() && !bymonth.empty() && bymonth.find(",")==string::npos) { // yearly by (single!) month and by day // - get month as indicated by BYMONTH sInt16 newStartMonth = 0; if (StrToShort(bymonth.c_str(), newStartMonth)>0 && newStartMonth) { // - check if BYMONTH is just redundant and references same month as start date bool convertToMonthly = startmonth>0 && startmonth==newStartMonth; if (!convertToMonthly && aNewStartP) { // not redundant, but we can return a new start date convertToMonthly = true; // calculate the new start date startmonth = newStartMonth; dtstart = date2lineartime(startyear, startmonth, startday) + lineartime2timeonly(dtstart); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- moved recurrence origin to %04hd-%02hd-%02hd",startyear, startmonth, startday)); // pass it back to caller calculateFirstOccurrence = true; // need to fine tune at the end *aNewStartP = dtstart; } if (convertToMonthly) { LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- converted FREQ=YEARLY BYMONTH into MONTHLY")); freq = 'M'; // convert from YEARLY to MONTHLY interval = 12*interval; // but with 12 months interval -> equivalent bymonth.erase(); // forget BYMONTH clause } } } // if FREQ=YEARLY + BYMONTH + BYDAY // check freq endIndex = 0; startIndex = 0; switch (freq) { case 'D' : // make weekly if byday and nothing else is set if (!(byday == "") && bymonth == "" && bymonthday == "") { freq='W'; freqmod='W'; // search separator ',' while ((endIndex = byday.find(",", startIndex)) != string::npos) { // set masks for the specific day if (!setWeekday(byday, firstmask, lastmask, startIndex, endIndex, false)) goto incompat; // set new start startIndex = endIndex + 1; if (startIndex >= byday.length()) break; } // check if anything is behind endindex if (endIndex == string::npos && startIndex < byday.length()) { endIndex = byday.length(); if (!setWeekday(byday, firstmask, lastmask, startIndex, endIndex, false)) goto incompat; } } else { // we don't support byday and anything else at the same time if (!byday.empty()) goto incompat; // ok, no mod freqmod = ' '; } break; case 'W' : // we don't support month or monthday within weekly if (!bymonth.empty() || !bymonthday.empty()) goto incompat; // set weekly and days freqmod='W'; if (!byday.empty()) { // search separator ',' while ((endIndex = byday.find(",", startIndex)) != string::npos) { // set masks for the specific day if (!setWeekday(byday, firstmask, lastmask, startIndex, endIndex, false)) goto incompat; // set new start startIndex = endIndex + 1; if (startIndex >= byday.length()) break; } // check if anything is behind endindex if (endIndex == string::npos && startIndex < byday.length()) { endIndex = byday.length(); if (!setWeekday(byday, firstmask, lastmask, startIndex, endIndex, false)) goto incompat; } } break; case 'M' : // we don't support by month in monthly if (!bymonth.empty()) goto incompat; // we don't support byday and bymonthday at the same time if (!byday.empty() && !bymonthday.empty()) goto incompat; // check if bymonthday if (!bymonthday.empty()) { freqmod = 'D'; // search separator ',' while ((endIndex = bymonthday.find(",", startIndex)) != string::npos) { // set masks for the specific day if (!setMonthDay(bymonthday, firstmask, lastmask, startIndex, endIndex)) goto incompat; // set new start startIndex = endIndex + 1; if (startIndex >= bymonthday.length()) break; } // check if anything is behind endindex if (endIndex == string::npos && startIndex < bymonthday.length()) { endIndex = bymonthday.length(); if (!setMonthDay(bymonthday, firstmask, lastmask, startIndex, endIndex)) goto incompat; } } // or if by weekday else if (!byday.empty()) { freqmod = 'W'; // search separator ',' while ((endIndex = byday.find(",", startIndex)) != string::npos) { // set masks for the specific day if (!setWeekday(byday, firstmask, lastmask, startIndex, endIndex, true)) goto incompat; // set new start startIndex = endIndex + 1; if (startIndex >= byday.length()) break; } // check if anything is behind endindex if (endIndex == string::npos && startIndex < byday.length()) { endIndex = byday.length(); if (!setWeekday(byday, firstmask, lastmask, startIndex, endIndex, true)) goto incompat; } } else { // fine, no mod freqmod = ' '; } break; case 'Y' : if ( byday == "" || (byday.length() == 2 && byday[0] == RRULE_weekdays[startwday][0] && byday[1] == RRULE_weekdays[startwday][1]) ) { temp.erase(); sprintf(s, "%hd", startday); temp.append(s); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- bymonthday checking %s against %s", temp.c_str(), bymonthday.c_str())); if (bymonthday == "" || bymonthday == temp) { temp.erase(); sprintf(s, "%hd", startmonth); temp.append(s); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- bymonth checking %s against %s", temp.c_str(), bymonth.c_str())); if (bymonth == "" || bymonth == temp) { // this should usually be ' ' but the vcard conversion has a bug and requires 'M' freqmod = 'M'; lastmask = 0; firstmask = 0; } else goto incompat; } else goto incompat; } else goto incompat; break; default : LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- strange self-set freq %c, rule was %s", freq, aText)); break; } // switch // calc end date, assumption/make sure: cnt > 1 if (calculateEndDate) { LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- calculating end date now")); if (!endDateFromCount(until,dtstart,freq,freqmod,interval,firstmask,lastmask,cnt,true,aLogP)) goto norep; untilcontext = startcontext; // until is in same context as start } // calculate exact date of first occurrence if (calculateFirstOccurrence && aNewStartP) { TRRuleExpandStatus es; initRRuleExpansion(es, dtstart, freq, freqmod, interval, firstmask, lastmask, dtstart, noLinearTime); dtstart = getNextOccurrence(es); if (LOGDEBUGTEST(aLogP,DBG_PARSE+DBG_EXOTIC)) { sInt16 ny,nm,nd; lineartime2date(dtstart,&ny,&nm,&nd); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- adjusted first occurrence date to %04hd-%02hd-%02hd",ny, nm, nd)); } *aNewStartP = dtstart; } // parsed ok, now store it goto store; norep: // no repetition (but no parse error generated) freq='0'; // frequency = none freqmod=' '; // frequency modifier interval=0; // interval firstmask=0; // day mask counted from the first day of the period lastmask=0; // day mask counted from the last day of the period until= noLinearTime; // last day store: #ifdef SYDEBUG LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("- leaving with freq %c, freqmod %c, interval %hd, firstmask %ld, lastmask %ld", freq, freqmod, interval, (long)firstmask, (long)lastmask)); TimestampToISO8601Str(abc,until,untilcontext,false,false); LOGDEBUGPRINTFX(aLogP,DBG_PARSE+DBG_EXOTIC,("RRULE2toInternal(): extracted until '%s'", abc.c_str())); #endif return true; // ok incompat: // incompatible, value cannot be parsed usefully return false; // no value generated } // RRULE2toInternal // appends the firstmask and lastmask as numbers to the string. // all values are increased by one prior to adding them to string. void appendMaskAsNumbers( cAppCharP aPrefix, // if list is not empty, this will be appended in front of the list string &aString, // receives list string fieldinteger_t firstmask, fieldinteger_t lastmask ) { fieldinteger_t m = firstmask; int i,k; for (i=0; i<2; i++) { // - show day numbers for (k=0; k<32; k++) { if (m & ((uInt64)1<0) aString+='-'; StringObjAppendPrintf(aString,"%d",k+1); } } // - switch to those that are relative to the end of the month / year m = lastmask; } } // appendMaskAsNumbers // returns the next directive for the ical format bool getNextDirective( string &aString, const char *aText, int &aStart ) { // check if (*aText == 0) { return false; } char c; // check start if (aStart > 0) { // skip to start for (int i = 0; (i < aStart) && ((c = *aText) != 0); ++i) aText++; } else { // skip all spaces while ((c = *aText) == ' ') { aText++; } } // erase string, set counter aString.erase(); uInt16 counter = 0; // append text c = *aText++; aStart++; while (c != 0 && c != ';') { aString.append(1, c); ++counter; c = *aText++; aStart++; } // empty? if (counter == 0) return false; // remove trailing whitespace sInt16 i = counter - 1; while (i >= 0 && aString[i] == ' ') { aString.erase(i, 1); --i; } // check length if (i == -1) return false; // fine return true; } // getNextDirective // maps the byday rule into the masks bool setWeekday( const string &byday, fieldinteger_t &firstmask, fieldinteger_t &lastmask, string::size_type &startIndex, const string::size_type &endIndex, bool allowSpecial ) { // remove leading spaces while (byday[startIndex] == ' ' && startIndex < endIndex) { ++startIndex; } // check if digit or sign if (isdigit(byday[startIndex]) || byday[startIndex] == '+' || byday[startIndex] == '-') { // check if numbers before week days are allowed if (!allowSpecial) { return false; } // special treatment return setSpecialWeekday(byday, firstmask, lastmask, startIndex, endIndex); } // get index of weekday array sInt16 weekdayIndex = getWeekdayIndex(byday, startIndex); if (weekdayIndex == -1) { return false; } // put into mask if (!allowSpecial) { firstmask |= ((uInt64)1<= endIndex - 1) { return false; } // get index for weekday sInt16 index = getWeekdayIndex(byday, startIndex); if (index == -1) { return false; } // put into mask if (isNegative) { lastmask |= (((uInt64)1< #include "lineartime.h" #endif using namespace sysync; namespace sysync { #ifdef FULLY_STANDALONE typedef sInt64 fieldinteger_t; class TDebugLogger; #endif #ifdef SYSYNC_TOOL // convert between RRULE and internal format int rruleConv(int argc, const char *argv[]); #endif #ifdef MOBOSX // make this usable by the Todo+Cal app #define PUBLIC_ENTRY extern "C" #define PUBLIC_ENTRY_ATTR __attribute__((visibility("default"))) #else #define PUBLIC_ENTRY #define PUBLIC_ENTRY_ATTR #endif const int DaysOfWeek = 7; const int WeeksOfMonth= 5; #ifdef SYNTHESIS_UNIT_TEST // RRULE expansion tests bool test_expand_rrule(void); #endif // Converts internal recurrence into vCalendar 1.0 RRULE string bool internalToRRULE1( string &aString, // receives RRULE string char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask, fieldinteger_t lastmask, lineartime_t until, timecontext_t untilcontext, TDebugLogger *aLogP ); // Converts internal recurrence into vCalendar 2.0 RRULE string bool internalToRRULE2( string &aString, // receives RRULE string char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask, fieldinteger_t lastmask, lineartime_t until, timecontext_t untilcontext, TDebugLogger *aLogP ); // Converts vCalendar 1.0 RRULE string into internal recurrence representation bool RRULE1toInternal( const char *aText, // RRULE string to be parsed lineartime_t dtstart, // reference date for parsing RRULE timecontext_t startcontext, // context of reference date, until will be in same context char &freq, char &freqmod, sInt16 &interval, fieldinteger_t &firstmask, fieldinteger_t &lastmask, lineartime_t &until, timecontext_t &untilcontext, TDebugLogger *aLogP ); // Converts vCalendar 2.0 RRULE string into internal recurrence representation bool RRULE2toInternal( const char *aText, // RRULE string to be parsed lineartime_t dtstart, // reference date for parsing RRULE timecontext_t startcontext, // context of reference date, until will be in same context char &freq, char &freqmod, sInt16 &interval, fieldinteger_t &firstmask, fieldinteger_t &lastmask, lineartime_t &until, timecontext_t &untilcontext, TDebugLogger *aLogP, lineartime_t *aNewStartP = NULL // optional, if not NULL, conversion may return modified start date ); /// @brief recurrence rule expansion status record typedef struct { // recurrence definition parameters char freq; char freqmod; sInt16 interval; fieldinteger_t firstmask; fieldinteger_t lastmask; sInt16 weekstart; // 0=Su, 1=Mo... // bit anaalysis for speedup sInt16 singleFMaskBit; // if >=0, only this bit number is set in firstmask and none in lastmask. // start and end point of recurrence lineardate_t expansionStartDayOffset; lineartime_t expansionEnd; // internal status // - start point sInt16 startyear,startmonth,startday; lineartime_t starttime; // time part for re-adding after expansion // - current point of expansion lineartime_t cursor; sInt16 cursorWDay; // weekday sInt16 cursorMLen; // length of month // - set if started (i.e. advanced cursor to first valid recurrence) bool started; } TRRuleExpandStatus; /// @brief initialize expansion of RRule PUBLIC_ENTRY void initRRuleExpansion( TRRuleExpandStatus &es, lineartime_t aDtstart, char aFreq, char aFreqmod, sInt16 aInterval, fieldinteger_t aFirstmask, fieldinteger_t aLastmask, lineartime_t aExpansionStart=noLinearTime, lineartime_t aExpansionEnd=noLinearTime ); /// @brief get next occurrence /// @return noLinearTime if no next occurrence exists, lineartime of next occurrence otherwise PUBLIC_ENTRY lineartime_t getNextOccurrence(TRRuleExpandStatus &es); /// @brief calculate end date of RRULE when count is specified /// @return true if repeating, false if not repeating at all /// @note returns until=noLinearTime for endless repeat (count=0) /// @note this is made public as TodoZ iPhone app uses it for calendar recurrence expansion PUBLIC_ENTRY bool endDateFromCount( lineartime_t &until, lineartime_t dtstart, char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask,fieldinteger_t lastmask, sInt16 cnt, bool countsoccurrences, TDebugLogger *aLogP ) PUBLIC_ENTRY_ATTR; /// @brief calculate number of recurrences from specified end date of RRULE /// @return true if count could be calculated, false otherwise /// @note returns until=noLinearTime for endless repeat (count=0) bool countFromEndDate( sInt16 &cnt, bool countsoccurrences, lineartime_t dtstart, char freq, char freqmod, sInt16 interval, fieldinteger_t firstmask,fieldinteger_t lastmask, lineartime_t until, TDebugLogger *aLogP ); // appends the firstmask and lastmask as numbers to the string. // all values are increased by one prior to adding them to string. void appendMaskAsNumbers( cAppCharP aPrefix, // if list is not empty, this will be appended in front of the list string &aString, // receives list string fieldinteger_t firstmask, fieldinteger_t lastmask ); // returns the next directive for the ical format bool getNextDirective( string &aString, const char *aText, int &aStart ); // maps the byday rule into the masks bool setWeekday( const string &byday, fieldinteger_t &firstmask, fieldinteger_t &lastmask, string::size_type &startIndex, const string::size_type &endIndex, bool allowSpecial ); // maps a special weekday (+/- int WEEKDAY) into the masks bool setSpecialWeekday( const string &byday, fieldinteger_t &firstmask, fieldinteger_t &lastmask, string::size_type &startIndex, const string::size_type &endIndex ); // returns the index within the rrule weekday array for the next // two chars of the supplied string starting at startIndex sInt16 getWeekdayIndex( const string &byday, sInt16 startIndex ); // set a day in month bool setMonthDay( const string &bymonthday, fieldinteger_t &firstmask, fieldinteger_t &lastmask, string::size_type &startIndex, const string::size_type &endIndex ); } // namespace sysync #endif // RRULES_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync/scriptcontext.cpp0000755000373300037200000055250112424517753026275 0ustar00nightlyallusers00000000000000/* * File: scriptcontext.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TScriptContext * Environment to tokenize, prepare and run scripts * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-09-11 : luz : created * */ #include "prefix_file.h" #ifdef SCRIPT_SUPPORT // includes #include "scriptcontext.h" #include "platform_exec.h" // for SHELLEXECUTE #include "rrules.h" // for RECURRENCE_COUNT/DATE #include "vtimezone.h" // for SETTIMEZONE #include "mimediritemtype.h" // for AlldayCount/MakeAllday #ifdef REGEX_SUPPORT #include "pcre.h" // for RegEx functions #endif #include #include // script debug messages #ifdef SYDEBUG #define SCRIPTDBGMSGX(lvl,x) { if (debugon && fSessionP) { POBJDEBUGPRINTFX(fSessionP,lvl,x); } } #define SCRIPTDBGMSG(x) SCRIPTDBGMSGX(DBG_SCRIPTS,x) #define SCRIPTDBGSTART(nam) { if (debugon && fSessionP) { if (fSessionP->getDbgMask() & DBG_SCRIPTS) { fSessionP->PDEBUGBLOCKFMTCOLL(("ScriptExecute","Start executing Script","name=%s",nam)); } else { POBJDEBUGPRINTFX(fSessionP,DBG_DATA,("Executing Script '%s'",nam)); } } } #define SCRIPTDBGEND() { if (debugon && fSessionP && (fSessionP->getDbgMask() & DBG_SCRIPTS)) { fSessionP->PDEBUGENDBLOCK("ScriptExecute"); } } #define SCRIPTDBGTEST (debugon && fSessionP && (fSessionP->getDbgMask() & DBG_SCRIPTS)) #define EXPRDBGTEST (debugon && fSessionP && ((fSessionP->getDbgMask() & (DBG_SCRIPTS|DBG_SCRIPTEXPR)) == (DBG_SCRIPTS|DBG_SCRIPTEXPR))) #define DBGSTRINGDEF(s) string s #define DBGVALUESHOW(s,v) dbgValueShow(s,v) #if SYDEBUG>1 #define SHOWVARDEFS(t) showVarDefs(t) #else #define SHOWVARDEFS(t) #endif #else #define SCRIPTDBGMSGX(lvl,x) #define SCRIPTDBGMSG(x) #define SCRIPTDBGSTART(nam) #define SCRIPTDBGEND() #define SCRIPTDBGTEST false #define EXPRDBGTEST false #define DBGSTRINGDEF(s) #define DBGVALUESHOW(s,v) #define SHOWVARDEFS(t) #endif namespace sysync { #ifdef SYDEBUG // show value of a field static void dbgValueShow(string &aString, TItemField *aFieldP) { TItemFieldTypes ty; if (aFieldP) { // value aString = "&html;&html;"; aFieldP->StringObjFieldAppend(aString,200); aString += "&html;&html;"; // add type info ty=aFieldP->getType(); aString += " ("; aString += ItemFieldTypeNames[ty]; aString += ")"; } else { aString=""; } } // dbgValueShow #endif TTokenizeException::TTokenizeException(cAppCharP aScriptName, cAppCharP aMsg1,cAppCharP aScript, uInt16 aIndex, uInt16 aLine) : TConfigParseException("") { cAppCharP p2=aScript+aIndex; cAppCharP p1=p2-(aIndex>5 ? 5 : aIndex); StringObjPrintf(fMessage, "%s: %s at line %hd: '...%-.5s_%-.10s...'", aScriptName ? aScriptName : "", aMsg1, aLine, p1, p2 ); } // TTokenizeException::TTokenizeException TScriptErrorException::TScriptErrorException(cAppCharP aMsg1, uInt16 aLine, cAppCharP aIdent) : TConfigParseException("") { if (aIdent) { StringObjPrintf(fMessage,aMsg1,aIdent); } else { StringObjPrintf(fMessage,"%s",aMsg1); } StringObjAppendPrintf( fMessage, " in script at line %hd", aLine ); } // TScriptErrorException::TScriptErrorException /* * Implementation of TScriptConfig */ // config constructor TScriptConfig::TScriptConfig(TConfigElement *aParentElementP) : TConfigElement("scripting",aParentElementP) { clear(); } // TScriptConfig::TScriptConfig // config destructor TScriptConfig::~TScriptConfig() { clear(); } // TScriptConfig::~TScriptConfig // init defaults void TScriptConfig::clear(void) { // delete options fMaxLoopProcessingTime = #if SYDEBUG>1 60; // 1 min for debugging #else 5; // 5 seconds for real execution #endif // delete functions TUserScriptList::iterator pos; for (pos=fFunctionScripts.begin();pos!=fFunctionScripts.end();++pos) { delete (*pos); } fFunctionScripts.clear(); fScriptMacros.clear(); // clear inherited inherited::clear(); } // TScriptConfig::clear // server config element parsing bool TScriptConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"looptimeout")==0) expectUInt32(fMaxLoopProcessingTime); else if (strucmp(aElementName,"function")==0) { // create new function definition TUserScriptFunction *funcdefP = new TUserScriptFunction; fFunctionScripts.push_back(funcdefP); expectFunction(*funcdefP,aLine); } else if (strucmp(aElementName,"macro")==0) { const char *macroname = getAttr(aAttributes,"name"); if (!macroname) fail(" must have a 'name' attribute"); // create new macro expectRawString(fScriptMacros[macroname]); } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TScriptConfig::localStartElement // resolve void TScriptConfig::localResolve(bool aLastPass) { // resolve inherited inherited::localResolve(aLastPass); } // TScriptConfig::localResolve // get script text string *TScriptConfig::getFunctionScript(sInt16 aFuncIndex) { if (aFuncIndex<0 || aFuncIndex>(sInt16)fFunctionScripts.size()) return NULL; return &(fFunctionScripts[aFuncIndex]->fFuncDef); } // TScriptConfig::getFunctionScript // get index of specific function sInt16 TScriptConfig::getFunctionIndex(cAppCharP aName, size_t aLen) { TUserScriptList::iterator pos; sInt16 i=0; for (pos=fFunctionScripts.begin();pos!=fFunctionScripts.end();++pos) { if (strucmp((*pos)->fFuncName.c_str(),aName)==0) return i; i++; } // unknown return VARIDX_UNDEFINED; } // TScriptConfig::getFunctionIndex // Script variable definition // create new scrip variable definition TScriptVarDef::TScriptVarDef(cAppCharP aName,uInt16 aIdx, TItemFieldTypes aType, bool aIsArray, bool aIsRef, bool aIsOpt) { fVarName=aName; fIdx=aIdx; fVarType=aType; fIsArray=aIsArray; fIsRef=aIsRef; fIsOpt=aIsOpt; } // TScriptVarDef::TScriptVarDef TScriptVarDef::~TScriptVarDef() { } // TScriptVarDef::~TScriptVarDef /* * builtin function definitions */ class TBuiltinStdFuncs { public: // timestamp NOW() // returns current date/time stamp in UTC with timezone set static void func_Now(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aTermP); tsP->setTimestampAndContext( getSystemNowAs(TCTX_UTC, tsP->getGZones()), TCTX_UTC ); }; // func_Now // timestamp SYSTEMNOW() // returns current date/time stamp as system time with timezone set static void func_SystemNow(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aTermP); tsP->setTimestampAndContext( getSystemNowAs(TCTX_SYSTEM, tsP->getGZones()), TCTX_SYSTEM ); }; // func_SystemNow // timestamp DBNOW() // returns database's idea of "now" in UTC with local timezone set static void func_DbNow(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aTermP); tsP->setTimestampAndContext( aFuncContextP->getSession()->getDatabaseNowAs(TCTX_UTC), TCTX_UTC ); }; // func_DbNow // integer ZONEOFFSET(timestamp atime) // returns zone offset for given timestamp. // New in 3.1: Floating timestamps return unassigned static void func_ZoneOffset(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); sInt16 moffs=0; if (tsP->isFloating()) { // floating timestamps do not have an offset aTermP->unAssign(); } else { moffs = tsP->getMinuteOffset(); aTermP->setAsInteger((sInt32)moffs*SecsPerMin); } }; // func_ZoneOffset // helper to get a time context from integer seconds offset or string zone name static timecontext_t contextFromSpec(TItemField *aVariantP, TScriptContext *aFuncContextP) { timecontext_t tctx = TCTX_UNKNOWN; if (aVariantP->isBasedOn(fty_timestamp)) { // just use context of another timestamp tctx = static_cast(aVariantP)->getTimeContext(); } else if (aVariantP->getCalcType()==fty_integer) { // integer specifies a seconds offset tctx = TCTX_MINOFFSET(aVariantP->getAsInteger() / SecsPerMin); } else if (aVariantP->isEmpty()) { // empty non-timestamp and non-integer mean unknown/floating timezone tctx = TCTX_UNKNOWN; } else { // treat as string specifying time zone by name or vTimezone string str; aVariantP->getAsString(str); if (strucmp(str.c_str(),"USERTIMEZONE")==0) { // special case - session's user time zone tctx = aFuncContextP->getSession()->fUserTimeContext; } else if (strucmp(str.c_str(),"SYSTEM")==0) { tctx = TCTX_SYSTEM; } else if (strucmp(str.c_str(),"BEGIN:VTIMEZONE",15)==0) { // is a vTimezone, get it if (!VTIMEZONEtoInternal(str.c_str(), tctx, aFuncContextP->getSession()->getSessionZones(),aFuncContextP->getSession()->getDbgLogger())) tctx = TCTX_UNKNOWN; } else { // search for timezone by name (internal or olson) if (!TimeZoneNameToContext(str.c_str(), tctx, aFuncContextP->getSession()->getSessionZones(), true)) { // last attempt is parsing it as a ISO8601 offset spec ISO8601StrToContext(str.c_str(), tctx); } } } return tctx; } // contextFromSpec // helper to represent a time context as string static void zoneStrFromContext(timecontext_t aContext, TItemField *aZoneStrFieldP, TScriptContext *aFuncContextP) { string str; if (TCTX_IS_UNKNOWN(aContext)) { // no time zone aZoneStrFieldP->unAssign(); } else if (TCTX_IS_TZ(aContext)) { // symbolic time zone, show name TimeZoneContextToName(aContext,str,aFuncContextP->getSession()->getSessionZones()); aZoneStrFieldP->setAsString(str); } else { // is non-symbolic minute offset, show it in ISO8601 extended form str.erase(); ContextToISO8601StrAppend(str, aContext, true); } } // zoneStrFromContext // string TIMEZONE(timestamp atime) // returns time zone name static void func_Timezone(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); zoneStrFromContext(tsP->getTimeContext(), aTermP, aFuncContextP); }; // func_Timezone // string VTIMEZONE(timestamp atime) // returns time zone in VTIMEZONE format static void func_VTimezone(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); string z; internalToVTIMEZONE(tsP->getTimeContext(),z,aFuncContextP->getSession()->getSessionZones()); aTermP->setAsString(z); }; // func_VTimezone // SETTIMEZONE(timestamp &atime,variant zonespec) // sets time zone for given timestamp field static void func_SetTimezone(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // get context from variant spec timecontext_t tctx = contextFromSpec(aFuncContextP->getLocalVar(1), aFuncContextP); // set it tsP->setTimeContext(tctx); }; // func_SetTimezone // SETFLOATING(timestamp &atime) // sets given timestamp to floating (no timezone) // this is an efficient shortform for SETTIMEZONE(atime,"FLOATING") or SETTIMEZONE(atime,"") static void func_SetFloating(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // set it tsP->setTimeContext(TCTX_UNKNOWN); }; // func_SetFloating // timestamp CONVERTTOZONE(timestamp atime, variant zonespec [,boolean doUnfloat]) // returns timestamp converted to specified zone. // - If doUnfloat, floating timestamps will be fixed in the new zone w/o conversion of the timestamp itself. // - timestamps that already have a zone will be converted static void func_ConvertToZone(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // get context from variant spec timecontext_t actual,tctx = contextFromSpec(aFuncContextP->getLocalVar(1), aFuncContextP); // convert and get actually resulting context back (can also be floating) lineartime_t ts = tsP->getTimestampAs(tctx,&actual); // unfloat floats if selected if (aFuncContextP->getLocalVar(2)->getAsBoolean() && TCTX_IS_UNKNOWN(actual)) actual=tctx; // unfloat // assign it to result static_cast(aTermP)->setTimestampAndContext(ts,actual); }; // func_ConvertToZone // timestamp CONVERTTOUSERZONE(timestamp atime [,boolean doUnfloat]) // returns timestamp converted to user time zone.(or floating timestamp as-is) // - this is an efficient shortform for CONVERTTOZONE(atime,"USERTIMEZONE") // - If doUnfloat, floating timestamps will be fixed in the new zone w/o conversion of the timestamp itself. // - timestamps that already have a zone will be converted static void func_ConvertToUserZone(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); timecontext_t actual,tctx = aFuncContextP->getSession()->fUserTimeContext; // convert and get actually resulting context back (can also be floating) lineartime_t ts = tsP->getTimestampAs(tctx,&actual); // unfloat floats if selected if (aFuncContextP->getLocalVar(1)->getAsBoolean() && TCTX_IS_UNKNOWN(actual)) actual=tctx; // unfloat // assign it to result static_cast(aTermP)->setTimestampAndContext(ts,actual); }; // func_ConvertToUserZone // string USERTIMEZONE() // returns session user time zone name static void func_UserTimezone(TItemField *&aTermP, TScriptContext *aFuncContextP) { zoneStrFromContext(aFuncContextP->getSession()->fUserTimeContext,aTermP, aFuncContextP); }; // func_UserTimezone // SETUSERTIMEZONE(variant zonespec) // sets session user time zone static void func_SetUserTimezone(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get context from variant spec timecontext_t tctx = contextFromSpec(aFuncContextP->getLocalVar(1), aFuncContextP); aFuncContextP->getSession()->fUserTimeContext = tctx; }; // func_SetUserTimezone // integer ISDATEONLY(timestamp atime) // returns true if given timestamp is a date-only static void func_IsDateOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); aTermP->setAsInteger(TCTX_IS_DATEONLY(tsP->getTimeContext()) ? 1 : 0); }; // func_IsDateOnly // timestamp DATEONLY(timestamp atime) // returns a floating(!) date-only of the given timestamp static void func_DateOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // get timestamp as dateonly timecontext_t tctx; lineartime_t ts; ts = tsP->getTimestampAs(TCTX_UNKNOWN | TCTX_DATEONLY, &tctx); // assign it to result (but do NOT pass in tctx, as it might contain a zone // but we need it as floating to make dates comparable static_cast(aTermP)->setTimestampAndContext(ts,TCTX_DATEONLY|TCTX_UNKNOWN); }; // func_DateOnly // timestamp TIMEONLY(timestamp atime) // returns a floating(!) time-only of the given timestamp static void func_TimeOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // get timestamp as dateonly timecontext_t tctx; lineartime_t ts; ts = tsP->getTimestampAs(TCTX_UNKNOWN | TCTX_TIMEONLY, &tctx); // assign it to result (but do NOT pass in tctx, as it might contain a zone // but we need it as floating to make dates comparable static_cast(aTermP)->setTimestampAndContext(ts,TCTX_TIMEONLY|TCTX_UNKNOWN); }; // func_TimeOnly // integer ISDURATION(timestamp atime) // returns true if given timestamp is a duration value static void func_IsDuration(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); aTermP->setAsInteger(tsP->isDuration() ? 1 : 0); }; // func_IsDuration // timestamp DURATION(timestamp atime) // returns the timestamp as a duration (floating, duration flag set) static void func_Duration(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // get timestamp as-is timecontext_t tctx; lineartime_t ts; ts = tsP->getTimestampAs(TCTX_UNKNOWN, &tctx); // result is floating timestamp with duration flag set (and dateonly/timeonly flags retained) static_cast(aTermP)->setTimestampAndContext(ts,TCTX_UNKNOWN|(tctx&TCTX_RFLAGMASK)|TCTX_DURATION); }; // func_Duration // timestamp POINTINTIME(timestamp atime) // returns the timestamp as a point in time (i.e. not duration and not dateonly/timeonly) static void func_PointInTime(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); // get timestamp as-is timecontext_t tctx; lineartime_t ts; ts = tsP->getTimestampAs(TCTX_UNKNOWN, &tctx); // assign it to result with duration and dateonly flag cleared static_cast(aTermP)->setTimestampAndContext(ts,tctx & (~(TCTX_DURATION+TCTX_DATEONLY+TCTX_TIMEONLY))); }; // func_PointInTime // integer ISFLOATING(timestamp atime) // returns true if given timestamp is floating (i.e. not bound to a time zone) static void func_IsFloating(TItemField *&aTermP, TScriptContext *aFuncContextP) { TTimestampField *tsP = static_cast(aFuncContextP->getLocalVar(0)); aTermP->setAsInteger(tsP->isFloating() ? 1 : 0); }; // func_IsFloating // integer ALLDAYCOUNT(timestamp start, timestamp end [, boolean checkinusercontext [, onlyutcinusercontext]]) // returns number of days for an all-day event // Note: Timestamps must be in the context in which they are to be checked for midnight, 23:59:xx etc. // except if checkinusercontext ist set (then non-floating timestamps are moved into user context before // checking. onlyutcinusercontext limits moving to user context to UTC timestamps only. static void func_AlldayCount(TItemField *&aTermP, TScriptContext *aFuncContextP) { sInt16 c = AlldayCount( aFuncContextP->getLocalVar(0), aFuncContextP->getLocalVar(1), aFuncContextP->getLocalVar(2)->getAsBoolean() ? aFuncContextP->getSession()->fUserTimeContext : TCTX_UNKNOWN, aFuncContextP->getLocalVar(3)->getAsBoolean() ); aTermP->setAsInteger(c); }; // func_AlldayCount // MAKEALLDAY(timestamp &start, timestamp &end [,integer days]) // adjusts timestamps for allday representation, makes them floating // Note: Timestamps must already represent local day times static void func_MakeAllday(TItemField *&aTermP, TScriptContext *aFuncContextP) { sInt16 days=aFuncContextP->getLocalVar(2)->getAsInteger(); // returns 0 if unassigned MakeAllday( aFuncContextP->getLocalVar(0), aFuncContextP->getLocalVar(1), TCTX_UNKNOWN, days ); }; // func_MakeAllday // integer WEEKDAY(timestamp timestamp) // returns weekday (0=sunday, 1=monday ... 6=saturday) from a timestamp static void func_Weekday(TItemField *&aTermP, TScriptContext *aFuncContextP) { lineartime_t lt = static_cast(aFuncContextP->getLocalVar(0))->getTimestampAs(TCTX_UNKNOWN); aTermP->setAsInteger(lineartime2weekday(lt)); }; // func_Weekday // integer SECONDS(integer timeunits) // returns number of seconds from a time unit spec static void func_Seconds(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t v=aFuncContextP->getLocalVar(0)->getAsInteger(); aTermP->setAsInteger(v/secondToLinearTimeFactor); }; // func_Seconds // integer MILLISECONDS(integer timeunits) // returns number of milliseconds from a time unit spec static void func_Milliseconds(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t v=aFuncContextP->getLocalVar(0)->getAsInteger(); if (secondToLinearTimeFactor==1) { v=v*1000; // internal unit is seconds } else if (secondToLinearTimeFactor!=1000) { v=v/secondToLinearTimeFactor; // seconds v=v*1000; // artifical milliseconds } aTermP->setAsInteger(v); }; // func_Milliseconds // void SLEEPMS(integer milliseconds) // sleeps process (or thread) for specified time static void func_SleepMS(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t sl=aFuncContextP->getLocalVar(0)->getAsInteger(); // make nanoseconds, then timeunits sl *= 1000000LL; sl /= nanosecondsPerLinearTime; sleepLineartime(sl); }; // func_SleepMS // integer TIMEUNITS(integer seconds) // returns number of time units from a seconds spec static void func_Timeunits(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t v=aFuncContextP->getLocalVar(0)->getAsInteger(); aTermP->setAsInteger(v*secondToLinearTimeFactor); }; // func_Timeunits // integer DAYUNITS(integer days) // returns number of time units from a seconds spec static void func_Dayunits(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t v=aFuncContextP->getLocalVar(0)->getAsInteger(); aTermP->setAsInteger(v*linearDateToTimeFactor); }; // func_Dayunits // integer MONTHDAYS(timestamp date) // returns number of days of the month date is in static void func_MonthDays(TItemField *&aTermP, TScriptContext *aFuncContextP) { lineartime_t ts = static_cast(aFuncContextP->getLocalVar(0))->getTimestampAs(TCTX_UNKNOWN); aTermP->setAsInteger(getMonthDays(lineartime2dateonly(ts))); }; // func_MonthDays // DEBUGMESSAGE(string msg) // writes debug message to debug log file if debugging is not completely disabled static void func_Debugmessage(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG if (aFuncContextP->getDbgMask()) { // get message string s; aFuncContextP->getLocalVar(0)->getAsString(s); // write it if (aFuncContextP->getSession()) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_HOT,("Script DEBUGMESSAGE() at Line %hd: %s",aFuncContextP->getScriptLine(),s.c_str())); } else { POBJDEBUGPRINTFX(aFuncContextP->getSyncAppBase(),DBG_HOT,("Script DEBUGMESSAGE() at Line %hd: %s",aFuncContextP->getScriptLine(),s.c_str())); } } #endif }; // func_Debugmessage // DEBUGSHOWVARS() // shows values of all local script variables static void func_DebugShowVars(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG if (aFuncContextP->getDbgMask() && aFuncContextP->fParentContextP) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_HOT,("Script DEBUGSHOWVARS() at Line %hd:",aFuncContextP->getScriptLine())); // show all local vars (of PARENT!) TScriptContext *showContextP = aFuncContextP->fParentContextP; string fshow; uInt16 i; for (i=0; igetNumLocals(); i++) { StringObjAppendPrintf(fshow,"- %-20s : ",showContextP->getVarDef(i)->fVarName.c_str()); showContextP->getLocalVar(i)->StringObjFieldAppend(fshow,80); fshow += '\n'; } // output preformatted POBJDEBUGPUTSXX(aFuncContextP->getSession(),DBG_HOT,fshow.c_str(),0,true); } #endif }; // func_DebugShowVars // DEBUGSHOWITEM([bool aShowRefItem]) // shows all fields and values of current item static void func_DebugShowItem(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG if (aFuncContextP->getDbgMask() && aFuncContextP->fParentContextP) { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_HOT,("Script DEBUGSHOWITEM() at Line %hd:",aFuncContextP->getScriptLine())); // select item TMultiFieldItem *showItemP = aFuncContextP->getLocalVar(0)->getAsBoolean() ? // optional param to select ref item instead of target aFuncContextP->fParentContextP->fReferenceItemP : aFuncContextP->fParentContextP->fTargetItemP; if (showItemP) { showItemP->debugShowItem(DBG_HOT); } else { POBJDEBUGPRINTFX(aFuncContextP->getSession(),DBG_HOT,("- no item to show")); } } #endif }; // func_DebugShowItem // SETXMLTRANSLATE(bool yesorno) // enables or disables XML translated SyncML message dumping on a per session basis static void func_SetXMLTranslate(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG if (aFuncContextP->getSession()) aFuncContextP->getSession()->fXMLtranslate=aFuncContextP->getLocalVar(0)->getAsBoolean(); #endif }; // func_SetXMLTranslate // SETMSGDUMP(bool yesorno) // enables or disables raw SyncML message dumping on a per session basis static void func_SetMsgDump(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG if (aFuncContextP->getSession()) aFuncContextP->getSession()->fMsgDump=aFuncContextP->getLocalVar(0)->getAsBoolean(); #endif }; // func_SetMsgDump // SETDEBUGOPTIONS(string optionname, boolean set) // sets or clears debug option flags (for the currently running session) static void func_SetDebugOptions(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG TDebugLogger *loggerP=aFuncContextP->getDbgLogger(); if (loggerP) { // get option string string s; aFuncContextP->getLocalVar(0)->getAsString(s); // convert to bitmask sInt16 k; if (StrToEnum(debugOptionNames,numDebugOptions,k,s.c_str())) { // found mask, modify uInt32 currentmask=loggerP->getRealMask(); if (aFuncContextP->getLocalVar(1)->getAsBoolean()) currentmask |= debugOptionMasks[k]; else currentmask &= ~debugOptionMasks[k]; // .. and apply loggerP->setMask(currentmask); } } #endif }; // func_SetDebugOptions // SETDEBUGMASK(integer mask) // sets the debug mask static void func_SetDebugMask(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG TDebugLogger *loggerP=aFuncContextP->getDbgLogger(); if (loggerP) { // get mask value loggerP->setMask(aFuncContextP->getLocalVar(0)->getAsInteger()); } #endif }; // func_SetDebugMask // integer GETDEBUGMASK() // gets the current debug mask static void func_GetDebugMask(TItemField *&aTermP, TScriptContext *aFuncContextP) { uInt32 m=0; // without debug, mask is always 0 #ifdef SYDEBUG TDebugLogger *loggerP=aFuncContextP->getDbgLogger(); if (loggerP) { // get mask value loggerP->getRealMask(); } #endif aTermP->setAsInteger(m); }; // func_GetDebugMask // void REQUESTMAXTIME(integer maxtime_seconds) static void func_RequestMaxTime(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) { sessionP->fRequestMaxTime=aFuncContextP->getLocalVar(0)->getAsInteger(); } } // func_RequestMaxTime // void REQUESTMINTIME(integer maxtime_seconds) // artificial delay for testing static void func_RequestMinTime(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) { sessionP->fRequestMinTime=aFuncContextP->getLocalVar(0)->getAsInteger(); } } // func_RequestMinTime // string SYNCMLVERS() // gets the SyncML version of the current session as string like "1.2" or "1.0" etc. static void func_SyncMLVers(TItemField *&aTermP, TScriptContext *aFuncContextP) { aTermP->setAsString(SyncMLVersionNames[aFuncContextP->getSession()->getSyncMLVersion()]); }; // func_SyncMLVers // integer SHELLEXECUTE(string command, string arguments [,boolean inbackground]) // executes the command line in a shell, returns the exit code of the command static void func_Shellexecute(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string cmd,params; bool inbackground; sInt32 exitcode; aFuncContextP->getLocalVar(0)->getAsString(cmd); aFuncContextP->getLocalVar(1)->getAsString(params); // optional param inbackground=aFuncContextP->getLocalVar(2)->getAsBoolean(); // returns false if not assigned -> not in background // execute now exitcode=shellExecCommand(cmd.c_str(),params.c_str(),inbackground); // return result code aTermP->setAsInteger(exitcode); }; // func_Shellexecute // string READ(string file) // reads the file and returns its content or UNASSIGNED in case of failure; // errors are logged static void func_Read(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string file; aFuncContextP->getLocalVar(0)->getAsString(file); // execute now string content; FILE *in; in = fopen(file.c_str(), "rb"); if (in) { long size = fseek(in, 0, SEEK_END); if (size >= 0) { // managed to obtain size, use it to pre-allocate result content.reserve(size); fseek(in, 0, SEEK_SET); } else { // ignore seek error, might not be a plain file clearerr(in); } if (!ferror(in)) { char buf[8192]; size_t read; while ((read = fread(buf, 1, sizeof(buf), in)) > 0) { content.append(buf, read); } } } if (in && !ferror(in)) { // return content as string aTermP->setAsString(content); } else { PLOGDEBUGPRINTFX(aFuncContextP->getDbgLogger(),DBG_ERROR,( "IO error in READ(\"%s\"): %s ", file.c_str(), strerror(errno) )); } if (in) { fclose(in); } } // func_Read // string URIToPath(string uri) // extracts the file path in a file:// uri; handles uri decoding // Returns UNASSIGNED if not a file:// uri static void func_URIToPath(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string uri; aFuncContextP->getLocalVar(0)->getAsString(uri); string protocol, doc; splitURL(uri.c_str(), &protocol, NULL, &doc, NULL, NULL, NULL, NULL); if (protocol == "file") { string path; path.reserve(doc.size() + 1); path += "/"; // leading slash is never included by splitURL() path += doc; urlDecode(&path); aTermP->setAsString(path); } } // func_URIToPath // string URLEncode(string text) static void func_URLDecode(TItemField *&aTermP, TScriptContext *aFuncContextP) { string text; aFuncContextP->getLocalVar(0)->getAsString(text); urlDecode(&text); aTermP->setAsString(text); } // func_URLDecode // string URLDecode(string url) static void func_URLEncode(TItemField *&aTermP, TScriptContext *aFuncContextP) { string text; aFuncContextP->getLocalVar(0)->getAsString(text); urlEncode(&text); aTermP->setAsString(text); } // func_URLEncode // string REMOTERULENAME() // returns name of the LAST matched remote rule (or subrule), empty if none // Note: this is legacy from 3.4.0.4 onwards, as we now have a list of multiple active rules static void func_Remoterulename(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifndef NO_REMOTE_RULES if (aFuncContextP->getSession()) { // there is a session if (!aFuncContextP->getSession()->fActiveRemoteRules.empty()) { // there is at least one rule applied, get the last one in the list aTermP->setAsString(aFuncContextP->getSession()->fActiveRemoteRules.back()->getName()); return; } } #endif // no remote rule applied aTermP->assignEmpty(); }; // func_Remoterulename // boolean ISACTIVERULE(string rulename) // checks if given rule is currently activated static void func_isActiveRule(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifndef NO_REMOTE_RULES string r; aFuncContextP->getLocalVar(0)->getAsString(r); if (aFuncContextP->getSession()) { // there is a session, return status aTermP->setAsBoolean(aFuncContextP->getSession()->isActiveRule(r.c_str())); return; } #endif // remote rules not supported or no session active aTermP->assignEmpty(); }; // func_Remoterulename // TREATASLOCALTIME(integer flag) static void func_SetTreatAsLocaltime(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) sessionP->fTreatRemoteTimeAsLocal = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetTreatAsLocaltime // TREATASUTC(integer flag) static void func_SetTreatAsUTC(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) sessionP->fTreatRemoteTimeAsUTC = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetTreatAsUTC // UPDATECLIENTINSLOWSYNC(integer flag) static void func_SetUpdateClientInSlowSync(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) sessionP->fUpdateClientDuringSlowsync = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetUpdateClientInSlowSync // UPDATESERVERINSLOWSYNC(integer flag) static void func_SetUpdateServerInSlowSync(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) sessionP->fUpdateServerDuringSlowsync = aFuncContextP->getLocalVar(0)->getAsBoolean(); }; // func_SetUpdateServerInSlowSync // SHOWCTCAPPROPERTIES(bool yesorno) static void func_ShowCTCapProps(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) sessionP->fShowCTCapProps = aFuncContextP->getLocalVar(0)->getAsBoolean(); } // func_ShowCTCapProps // SHOWTYPESIZEINCTCAP10(bool yesorno) static void func_ShowTypeSizeInCTCap10(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) sessionP->fShowTypeSzInCTCap10 = aFuncContextP->getLocalVar(0)->getAsBoolean(); } // func_ShowTypeSizeInCTCap10 // ENUMDEFAULTPROPPARAMS(bool yesorno) static void func_EnumDefaultPropParams(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); // Note that this is a tristate! if (sessionP) sessionP->fEnumDefaultPropParams = aFuncContextP->getLocalVar(0)->getAsBoolean() ? 1 : 0; } // func_EnumDefaultPropParams // string LOCALURI() // returns local URI as used by client for starting session static void func_LocalURI(TItemField *&aTermP, TScriptContext *aFuncContextP) { string r; if (aFuncContextP->getSession()) { // there is a session aTermP->setAsString(aFuncContextP->getSession()->getInitialLocalURI()); return; } // no session?? aTermP->assignEmpty(); }; // func_LocalURI // string SUBSTR(string, from [, count]) static void func_Substr(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s; aFuncContextP->getLocalVar(0)->getAsString(s); string::size_type i=aFuncContextP->getLocalVar(1)->getAsInteger(); // optional param string::size_type l=s.size(); // default to entire string if (aFuncContextP->getLocalVar(2)->isAssigned()) l=aFuncContextP->getLocalVar(2)->getAsInteger(); // use specified count string r; // adjust params if (i>=s.size()) l=0; else if (i+l>s.size()) l=s.size()-i; // evaluate if (l>0) r.assign(s,i,l); // save result aTermP->setAsString(r); }; // func_Substr // string EXPLODE(string glue, variant &parts[]) static void func_Explode(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string glue,s; aFuncContextP->getLocalVar(0)->getAsString(glue); TItemField *fldP = aFuncContextP->getLocalVar(1); // concatenate array elements with glue aTermP->assignEmpty(); for (uInt16 i=0; iarraySize(); i++) { // get array element as string fldP->getArrayField(i)->getAsString(s); // add to output aTermP->appendString(s); if (i+1arraySize()) { // we have more elements, add glue aTermP->appendString(glue); } } }; // func_Explode #ifdef _MSC_VER static long long V_llabs( long long j ) { return (j < 0 ? -j : j); } #endif // integer ABS(integer val) static void func_Abs(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef _MSC_VER aTermP->setAsInteger(V_llabs(aFuncContextP->getLocalVar(0)->getAsInteger())); #else aTermP->setAsInteger(::llabs(aFuncContextP->getLocalVar(0)->getAsInteger())); #endif }; // func_Abs // integer SIGN(integer val) // i == 0 : 0 // i > 0 : 1 // i < 0 : -1 static void func_Sign(TItemField *&aTermP, TScriptContext *aFuncContextP) { fieldinteger_t i = aFuncContextP->getLocalVar(0)->getAsInteger(); aTermP->setAsInteger(i==0 ? 0 : (i>0 ? 1 : -1)); }; // func_Sign // integer RANDOM(integer range [, integer seed]) // generates random number between 0 and range-1. Seed is optional to init random generator static void func_Random(TItemField *&aTermP, TScriptContext *aFuncContextP) { // seed if second param there if (aFuncContextP->getLocalVar(1)->isAssigned()) { // seed random gen first srand((unsigned int)aFuncContextP->getLocalVar(1)->getAsInteger()); } // now get random value fieldinteger_t r = rand(); fieldinteger_t max = RAND_MAX; // scale to specified range aTermP->setAsInteger(r * aFuncContextP->getLocalVar(0)->getAsInteger() / (max+1)); }; // func_Random // string NUMFORMAT(integer num, integer digits [,string filler=" " [,boolean opts=""]]) static void func_NumFormat(TItemField *&aTermP, TScriptContext *aFuncContextP) { // mandatory params fieldinteger_t i = aFuncContextP->getLocalVar(0)->getAsInteger(); sInt16 numdigits = aFuncContextP->getLocalVar(1)->getAsInteger(); // negative = left justified // optional params string filler = " "; // default to filling with spaces if (aFuncContextP->getLocalVar(2)->isAssigned()) aFuncContextP->getLocalVar(2)->getAsString(filler); // empty: no filling, only truncation string opts; aFuncContextP->getLocalVar(3)->getAsString(opts); // +: show plus sign. space: show space as plus sign // generate raw string string s; // - determine hex mode bool hex = opts.find("x")!=string::npos; // - create sign char sign = 0; if (!hex) { if (i<0) sign = '-'; else { if (opts.find("+")!=string::npos) sign='+'; else if (opts.find(" ")!=string::npos) sign=' '; } } // create raw numeric string if (hex) { StringObjPrintf(s,"%llX",(long long)i); } else { #ifdef _MSC_VER StringObjPrintf(s,"%lld",V_llabs(i)); #else StringObjPrintf(s,"%lld",::llabs(i)); #endif } // adjust char c = *(filler.c_str()); // NUL or filler char if (c!='0' && sign) { s.insert((size_t)0,(size_t)1,sign); // no zero-padding: insert sign before padding sign=0; // done now } sInt32 n,sz = s.size() + (sign ? 1 : 0); // leave room for sign after zero padding if (numdigits>0) { // right aligned field n = numdigits-sz; // empty space in field if (n<0) s.erase(0,-n); // delete at beginning else if (n>0 && c) s.insert((size_t)0,(size_t)n,c); // insert at beginning } else { // left aligned field n = -numdigits-sz; // empty space in field if (n<0) s.erase(sz-n,-n); // delete at end else if (n>0 && c) s.insert((size_t)sz,(size_t)n,c); // insert at end } // insert plus now if filled with zeroes if (sign) s.insert((size_t)0,(size_t)1,sign); // insert sign after zero padding // return string aTermP->setAsString(s); } // func_NumFormat // integer LENGTH(string) static void func_Length(TItemField *&aTermP, TScriptContext *aFuncContextP) { TItemField *fldP = aFuncContextP->getLocalVar(0); fieldinteger_t siz; if (fldP->isBasedOn(fty_string)) { // don't get value to avoid pulling large strings just for size siz=static_cast(fldP)->getStringSize(); } else { // brute force string s; fldP->getAsString(s); siz=s.size(); } // save result aTermP->setAsInteger(siz); }; // func_Length // integer SIZE(&var) static void func_Size(TItemField *&aTermP, TScriptContext *aFuncContextP) { TItemField *fldP = aFuncContextP->getLocalVar(0); fieldinteger_t siz; if (fldP->isArray()) { siz=fldP->arraySize(); } else if (fldP->isBasedOn(fty_string)) { // don't get value to avoid pulling large strings just for size siz=static_cast(fldP)->getStringSize(); } else { // brute force string s; fldP->getAsString(s); siz=s.size(); } // save result aTermP->setAsInteger(siz); }; // func_Size // integer FIND(string, pattern [, startat]) static void func_Find(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s,pat; string::size_type p; aFuncContextP->getLocalVar(0)->getAsString(s); aFuncContextP->getLocalVar(1)->getAsString(pat); // optional param uInt32 i=aFuncContextP->getLocalVar(2)->getAsInteger(); // returns 0 if unassigned // find in string if (iunAssign(); else aTermP->setAsInteger(p); }; // func_Find // integer RFIND(string, pattern [, startat]) static void func_RFind(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s,pat; string::size_type p; aFuncContextP->getLocalVar(0)->getAsString(s); aFuncContextP->getLocalVar(1)->getAsString(pat); // optional param uInt32 i=aFuncContextP->getLocalVar(2)->getAsInteger(); // returns 0 if unassigned if (i>s.size()) i=s.size(); // find in string p=s.rfind(pat,i); // return UNASSIGNED for "not found" and position otherwise if (p==string::npos) aTermP->unAssign(); else aTermP->setAsInteger(p); }; // func_RFind #ifdef REGEX_SUPPORT // run PCRE regexp // Returns: > 0 => success; value is the number of elements filled in // = 0 => success, but offsets is not big enough // -1 => failed to match // -2 => PCRE_ERROR_NULL => did not compile, error reported to aDbgLogger // < -2 => some kind of unexpected problem static int run_pcre(cAppCharP aRegEx, cAppCharP aSubject, stringSize aSubjLen, stringSize aSubjStart, int *aOutVec, int aOVSize, TDebugLogger *aDbgLogger) { string regexpat; // set default options int options=0; // scan input pattern. If it starts with /, we assume /xxx/opt form cAppCharP p = aRegEx; char c=*p; if (c=='/') { // delimiter found p++; // - now search end while (*p) { if (*p=='\\') { // escaped char p++; if (*p) p++; } else { if (*p==c) { // found end of regex size_t n=p-aRegEx-1; // size of plain regExp // - scan options cAppCharP o = p++; while (*o) { switch (*o) { case 'i' : options |= PCRE_CASELESS; break; case 'm' : options |= PCRE_MULTILINE; break; case 's' : options |= PCRE_DOTALL; break; case 'x' : options |= PCRE_EXTENDED; break; case 'U' : options |= PCRE_UNGREEDY; break; } o++; } // - extract regex itself regexpat.assign(aRegEx+1,n); aRegEx = regexpat.c_str(); break; // done } p++; } } // while chars in regex } // if regex with delimiter // - compile regex pcre *regex; cAppCharP errMsg=NULL; int errOffs=0; regex = pcre_compile(aRegEx, options | PCRE_UTF8, &errMsg, &errOffs, NULL); if (regex==NULL) { // error, display it in log if script logging is on PLOGDEBUGPRINTFX(aDbgLogger,DBG_SCRIPTS+DBG_ERROR,( "RegEx error at pattern pos %d: %s ", errOffs, errMsg ? errMsg : "" )); return PCRE_ERROR_NULL; // -2, regexp did not compile } else { // regExp is ok and can be executed against subject int r = pcre_exec(regex, NULL, aSubject, aSubjLen, aSubjStart, 0, aOutVec, aOVSize); pcre_free(regex); return r; } } // run_pcre // integer REGEX_FIND(string subject, string pattern [, integer startat]) static void func_Regex_Find(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s,pat; aFuncContextP->getLocalVar(0)->getAsString(s); aFuncContextP->getLocalVar(1)->getAsString(pat); // optional param sInt16 i=aFuncContextP->getLocalVar(2)->getAsInteger(); // returns 0 if unassigned // use PCRE to find const int ovsize=3; // we need no matches int ov[ovsize]; int rc = run_pcre(pat.c_str(),s.c_str(),s.size(),i,ov,ovsize,aFuncContextP->getDbgLogger()); if (rc>=0) { // return start position aTermP->setAsInteger(ov[0]); } else { // return UNASSIGNED for "not found" and error aTermP->unAssign(); } }; // func_Regex_Find // integer REGEX_MATCH(string subject, string regexp, integer startat, array &matches) static void func_Regex_Match(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s,pat; aFuncContextP->getLocalVar(0)->getAsString(s); aFuncContextP->getLocalVar(1)->getAsString(pat); sInt32 i=aFuncContextP->getLocalVar(2)->getAsInteger(); TItemField *matchesP = aFuncContextP->getLocalVar(3); string m; // use PCRE to find const int ovsize=54; // max matches (they say this must be a multiple of 3, no idea why; I'd say 2...) int ov[ovsize]; int rc = run_pcre(pat.c_str(),s.c_str(),s.size(),i,ov,ovsize,aFuncContextP->getDbgLogger()); if (rc>0) { // return start position aTermP->setAsInteger(ov[0]); // return matches int mIdx; TItemField *fldP; for (mIdx=0; mIdxisArray()) fldP = matchesP->getArrayField(mIdx); else { // non-array specified fldP = matchesP; // - if there are no subpatterns, assign the first match (entire pattern) // - if there are subpatterns, assign the first subpattern match if (rc>1) { // there is at least one subpattern mIdx++; // skip the entire pattern match such that 1st subpattern gets assigned } } // assign match (first is entire pattern) fldP->setAsString(s.c_str()+ov[mIdx*2],ov[mIdx*2+1]-ov[mIdx*2]); // assign substring // end if matches is not an array if (!matchesP->isArray()) break; } } else { // return UNASSIGNED for "not found" and all errors aTermP->unAssign(); } }; // func_Regex_Match // integer REGEX_SPLIT(string subject, string separatorregexp, array elements [, boolean emptyElements]) // returns number of elements created in elements array static void func_Regex_Split(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s,pat; aFuncContextP->getLocalVar(0)->getAsString(s); aFuncContextP->getLocalVar(1)->getAsString(pat); TItemField *elementsP = aFuncContextP->getLocalVar(2); // optional params bool emptyElements = aFuncContextP->getLocalVar(3)->getAsBoolean(); // skip empty elements by default // find all recurrences of separator uInt32 i = 0; // start at beginning sInt32 rIdx = 0; // no results so far while (igetDbgLogger()); if (rc<=0) { // no further match found // - simulate match at end of string ov[0]=s.size(); ov[1]=ov[0]; } // copy element if (uInt32(ov[0])>i || emptyElements) { TItemField *fldP = elementsP->getArrayField(rIdx); if (ov[0]-i>0) fldP->setAsString(s.c_str()+i,ov[0]-i); else fldP->assignEmpty(); // empty element // next element rIdx++; } // skip separator i = ov[1]; } // while not at end of string // return number of elements found aTermP->setAsInteger(rIdx); }; // func_Regex_Split // string REGEX_REPLACE(string,regexp,replacement [,startat [,repeat]]) static void func_Regex_Replace(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string s,pat,reppat,res; aFuncContextP->getLocalVar(0)->getAsString(s); aFuncContextP->getLocalVar(1)->getAsString(pat); aFuncContextP->getLocalVar(2)->getAsString(reppat); // optional params sInt16 i=aFuncContextP->getLocalVar(3)->getAsInteger(); // returns 0 if unassigned -> start at beginning sInt32 c=aFuncContextP->getLocalVar(4)->getAsInteger(); // returns 0 if unassigned -> replace all // use PCRE to find const int ovsize=54; // max matches (they say this must be a multiple of 3, no idea why; I'd say 2...) int ov[ovsize]; res.assign(s.c_str(),i); // part of string not searched at all do { int rc = run_pcre(pat.c_str(),s.c_str(),s.size(),i,ov,ovsize,aFuncContextP->getDbgLogger()); if (rc<0) break; // error or no more matches found // found an occurrence // - subsititute matches in replacement string cAppCharP p=reppat.c_str(); cAppCharP q=p; string rep; rep.erase(); while (*p) { if (*p=='\\') { p++; if (*p==0) break; // check for escaped backslash if (*p=='\\') { p++; continue; } // get replacement number if (isdigit(*p)) { // is replacement escape sequence, get index uInt16 mIdx = *(p++)-'0'; // append chars before \x rep.append(q,p-q-2); // append match (if there is one) if (mIdx0); // if c==0, replace all, otherwise as many times as c says res.append(s.c_str()+i); // rest // return result aTermP->setAsString(res); }; // func_Regex_Replace #endif // REGEX_SUPPORT // integer COMPARE(value, value) // - returns 0 if equal, 1 if first > second, -1 if first < second, // SYSYNC_NOT_COMPARABLE if not equal and no ordering known or if field // types do not match. static void func_Compare(TItemField *&aTermP, TScriptContext *aFuncContextP) { // compare first field with second one aTermP->setAsInteger( aFuncContextP->getLocalVar(0)->compareWith(*(aFuncContextP->getLocalVar(1))) ); }; // func_Compare // integer CONTAINS(&ref, value [,bool caseinsensitive]) // - returns 1 if value contained in ref, 0 if not static void func_Contains(TItemField *&aTermP, TScriptContext *aFuncContextP) { // check if second is contained in first bool caseinsensitive = aFuncContextP->getLocalVar(2)->getAsBoolean(); // returns false if not specified aTermP->setAsBoolean( aFuncContextP->getLocalVar(0)->contains(*(aFuncContextP->getLocalVar(1)),caseinsensitive) ); }; // func_Contains // APPEND(&ref, value) // - appends value to ref (ref can be array) static void func_Append(TItemField *&aTermP, TScriptContext *aFuncContextP) { // append second to first aFuncContextP->getLocalVar(0)->append(*(aFuncContextP->getLocalVar(1))); }; // func_Append // string UPPERCASE(string) static void func_UpperCase(TItemField *&aTermP, TScriptContext *aFuncContextP) { string s; TItemField *fldP = aFuncContextP->getLocalVar(0); if (fldP->isAssigned()) { fldP->getAsString(s); StringUpper(s); // save result aTermP->setAsString(s); } else { aTermP->unAssign(); } }; // func_UpperCase // string LOWERCASE(string) static void func_LowerCase(TItemField *&aTermP, TScriptContext *aFuncContextP) { string s; TItemField *fldP = aFuncContextP->getLocalVar(0); if (fldP->isAssigned()) { fldP->getAsString(s); StringLower(s); // save result aTermP->setAsString(s); } else { aTermP->unAssign(); } }; // func_LowerCase // string NORMALIZED(variant value) // get as normalized string (trimmed CR/LF/space at both ends, no special chars for telephone numbers, http:// added for URLs w/o protocol spec) static void func_Normalized(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get field reference TItemField *fldP = aFuncContextP->getLocalVar(0); if (fldP->isAssigned()) { // get normalized version string s; fldP->getAsNormalizedString(s); // save it aTermP->setAsString(s); } else { aTermP->unAssign(); } }; // func_Normalized // bool ISAVAILABLE(variant &fieldvar) // check if field is available (supported by both ends) // - returns EMPTY if availability is not known // - fieldvar must be a field contained in the primary item of the caller, else function returns UNASSIGNED static void func_IsAvailable(TItemField *&aTermP, TScriptContext *aFuncContextP) { if (aFuncContextP->fParentContextP) { // get item to find field in TMultiFieldItem *checkItemP = aFuncContextP->fParentContextP->fTargetItemP; // check if this item's type has actually received availability info if (!checkItemP->knowsRemoteFieldOptions()) { aTermP->assignEmpty(); // nothing known about field availability return; } else { // we have availability info // - get index of field by field pointer (passed by reference) sInt16 fid = checkItemP->getIndexOfField(aFuncContextP->getLocalVar(0)); if (fid!=FID_NOT_SUPPORTED) { // field exists, return availability aTermP->setAsBoolean(checkItemP->isAvailable(fid)); return; } } } // no parent context or field not found aTermP->unAssign(); }; // func_IsAvailable // SETFIELDOPTIONS(variant &fieldvar, bool available [[[, int maxsize=0 ], int maxoccur=0 ], int notruncate=FALSE]) // set field options (override what might have been set by reading devInf) // - fieldvar must be a field contained in the primary item of the caller, else function is NOP static void func_SetFieldOptions(TItemField *&aTermP, TScriptContext *aFuncContextP) { if (aFuncContextP->fParentContextP) { // get item to find field in TMultiFieldItem *checkItemP = aFuncContextP->fParentContextP->fTargetItemP; // modify options on the "remote" type TMultiFieldItemType *mfitP = checkItemP->getRemoteItemType(); // - get index of field by field pointer (passed by reference) sInt16 fid = checkItemP->getIndexOfField(aFuncContextP->getLocalVar(0)); if (mfitP && fid!=FID_NOT_SUPPORTED) { // field exists, we can set availability // - get params bool available = aFuncContextP->getLocalVar(1)->getAsBoolean(); sInt32 maxsize = FIELD_OPT_MAXSIZE_NONE; if (aFuncContextP->getLocalVar(2)->isAssigned()) maxsize = aFuncContextP->getLocalVar(2)->getAsInteger(); sInt32 maxoccur = aFuncContextP->getLocalVar(3)->getAsInteger(); // returns 0 if not specified bool notruncate = aFuncContextP->getLocalVar(4)->getAsBoolean(); // - now set options TFieldOptions *fo = mfitP->getFieldOptions(fid); if (fo) { fo->available=available; fo->maxsize=maxsize; fo->maxoccur=maxoccur; fo->notruncate=notruncate; } } } }; // func_SetFieldOptions // string ITEMDATATYPE() // returns the type's internal name (like "vcard21") static void func_ItemDataType(TItemField *&aTermP, TScriptContext *aFuncContextP) { if (aFuncContextP->fParentContextP) { // get item of which we want to know the type TMultiFieldItem *checkItemP = aFuncContextP->fParentContextP->fTargetItemP; if (checkItemP) { TMultiFieldItemType *mfitP = static_cast(checkItemP->getItemType()); if (mfitP) { aTermP->setAsString(mfitP->getTypeConfig()->getName()); return; } } } // no type associated or no item in current context aTermP->unAssign(); }; // func_ItemDataType // string ITEMTYPENAME() // returns the type's name (like "text/x-vcard") static void func_ItemTypeName(TItemField *&aTermP, TScriptContext *aFuncContextP) { if (aFuncContextP->fParentContextP) { // get item of which we want to know the type TMultiFieldItem *checkItemP = aFuncContextP->fParentContextP->fTargetItemP; if (checkItemP) { TMultiFieldItemType *mfitP = static_cast(checkItemP->getItemType()); if (mfitP) { aTermP->setAsString(mfitP->getTypeName()); return; } } } // no type associated or no item in current context aTermP->unAssign(); }; // func_ItemTypeName // string ITEMTYPEVERS() // returns the type's version string (like "2.1") static void func_ItemTypeVers(TItemField *&aTermP, TScriptContext *aFuncContextP) { if (aFuncContextP->fParentContextP) { // get item of which we want to know the type TMultiFieldItem *checkItemP = aFuncContextP->fParentContextP->fTargetItemP; if (checkItemP) { TMultiFieldItemType *mfitP = static_cast(checkItemP->getItemType()); if (mfitP) { aTermP->setAsString(mfitP->getTypeVers()); return; } } } // no type associated or no item in current context aTermP->unAssign(); }; // func_ItemTypeVers // void SWAP(untyped1,untyped2) static void func_Swap(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params TItemField *p1 = aFuncContextP->getLocalVar(0); TItemField *p2 = aFuncContextP->getLocalVar(1); TItemField *tempP = newItemField(p1->getType(), aFuncContextP->getSessionZones()); // swap (*tempP)=(*p1); (*p1)=(*p2); (*p2)=(*tempP); delete tempP; }; // func_Swap // string TYPENAME(untyped1) static void func_TypeName(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params TItemFieldTypes ty = aFuncContextP->getLocalVar(0)->getType(); // return type name aTermP->setAsString(ItemFieldTypeNames[ty]); }; // func_TypeName // variant SESSIONVAR(string varname) static void func_SessionVar(TItemField *&aTermP, TScriptContext *aFuncContextP) { TItemField *sessionVarP; TScriptVarDef *sessionVarDefP; string varname; TScriptContext *sessionContextP=NULL; // get name aFuncContextP->getLocalVar(0)->getAsString(varname); // get variable from session if (aFuncContextP->getSession()) sessionContextP=aFuncContextP->getSession()->getSessionScriptContext(); if (sessionContextP) { // get definition sessionVarDefP = sessionContextP->getVarDef( varname.c_str(),varname.size() ); if (sessionVarDefP) { // get variable sessionVarP = sessionContextP->getLocalVar(sessionVarDefP->fIdx); if (sessionVarP) { // create result field of appropriate type aTermP = newItemField(sessionVarP->getType(), aFuncContextP->getSessionZones()); // copy value (*aTermP) = (*sessionVarP); } } } if (!aTermP) { // if no such variable found, return unassigned (but not no-value, which would abort script) aTermP=newItemField(fty_none, aFuncContextP->getSessionZones()); aTermP->unAssign(); // make it (already is...) unassigned } }; // func_SessionVar // SETSESSIONVAR(string varname, value) static void func_SetSessionVar(TItemField *&aTermP, TScriptContext *aFuncContextP) { TItemField *sessionVarP; TScriptVarDef *sessionVarDefP; string varname; TScriptContext *sessionContextP=NULL; // get name aFuncContextP->getLocalVar(0)->getAsString(varname); // get variable from session if (aFuncContextP->getSession()) sessionContextP=aFuncContextP->getSession()->getSessionScriptContext(); if (sessionContextP) { // get definition sessionVarDefP = sessionContextP->getVarDef( varname.c_str(),varname.size() ); if (sessionVarDefP) { // get variable sessionVarP = sessionContextP->getLocalVar(sessionVarDefP->fIdx); if (sessionVarP) { // store new value (*sessionVarP) = (*(aFuncContextP->getLocalVar(1))); } } } }; // func_SetSessionVar // void ABORTSESSION(integer statuscode) static void func_AbortSession(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) { sessionP->AbortSession(aFuncContextP->getLocalVar(0)->getAsInteger(),true); // locally caused } }; // func_AbortSession // SETDEBUGLOG(integer enabled) // set debug log output for this sync session static void func_SetDebugLog(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifdef SYDEBUG TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) { sessionP->getDbgLogger()->setEnabled( aFuncContextP->getLocalVar(0)->getAsBoolean() ); /// @todo: remove this // %%% for now, we also need to set this separate flag sessionP->fSessionDebugLogs= aFuncContextP->getLocalVar(0)->getAsBoolean(); } #endif }; // func_SetDebugLog // SETLOG(integer enabled) // set debug log output for this sync session static void func_SetLog(TItemField *&aTermP, TScriptContext *aFuncContextP) { #ifndef MINIMAL_CODE TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) { sessionP->fLogEnabled= aFuncContextP->getLocalVar(0)->getAsBoolean(); } #endif }; // func_SetLog // SETREADONLY(integer readonly) // set readonly option of this sync session static void func_SetReadOnly(TItemField *&aTermP, TScriptContext *aFuncContextP) { TSyncSession *sessionP = aFuncContextP->getSession(); if (sessionP) { sessionP->setReadOnly(aFuncContextP->getLocalVar(0)->getAsBoolean()); } }; // func_SetReadOnly // string CONFIGVAR(string varname) static void func_ConfigVar(TItemField *&aTermP, TScriptContext *aFuncContextP) { string varname,value; // get name aFuncContextP->getLocalVar(0)->getAsString(varname); // get value from syncappbase if (!aFuncContextP->getSyncAppBase()->getConfigVar(varname.c_str(),value)) aTermP->setAsString(value); else aTermP->unAssign(); // not found }; // func_ConfigVar // timestamp RECURRENCE_DATE( // timestamp start, // string rr_freq, integer interval, // integer fmask, integer lmask, // boolean occurrencecount, // integer count // ) static void func_Recurrence_Date(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string rr_freq; TTimestampField *startFldP = static_cast(aFuncContextP->getLocalVar(0)); timecontext_t tctx; // - get start timestamp as is along with current context lineartime_t start = startFldP->getTimestampAs(TCTX_UNKNOWN,&tctx); aFuncContextP->getLocalVar(1)->getAsString(rr_freq); char freq = rr_freq.size()>0 ? rr_freq[0] : ' '; char freqmod = rr_freq.size()>1 ? rr_freq[1] : ' '; sInt16 interval = aFuncContextP->getLocalVar(2)->getAsInteger(); fieldinteger_t fmask = aFuncContextP->getLocalVar(3)->getAsInteger(); fieldinteger_t lmask = aFuncContextP->getLocalVar(4)->getAsInteger(); bool occurrencecount = aFuncContextP->getLocalVar(5)->getAsBoolean(); uInt16 count = aFuncContextP->getLocalVar(6)->getAsInteger(); // now calculate lineartime_t occurrence; if(endDateFromCount( occurrence, start, freq,freqmod, interval, fmask,lmask, count, occurrencecount, aFuncContextP->getDbgLogger() )) { // successful, set timestamp in same context as start timestamp had static_cast(aTermP)->setTimestampAndContext(occurrence,tctx); } else { // unsuccessful aTermP->unAssign(); } } // func_Recurrence_Date // integer RECURRENCE_COUNT( // timestamp start, // string rr_freq, integer interval, // integer fmask, integer lmask, // boolean occurrencecount, // timestamp occurrence // ) static void func_Recurrence_Count(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string rr_freq; timecontext_t tctx; // - start time context is used for rule evaluation lineartime_t start = static_cast(aFuncContextP->getLocalVar(0))->getTimestampAs(TCTX_UNKNOWN,&tctx); aFuncContextP->getLocalVar(1)->getAsString(rr_freq); char freq = rr_freq.size()>0 ? rr_freq[0] : ' '; char freqmod = rr_freq.size()>1 ? rr_freq[1] : ' '; sInt16 interval = aFuncContextP->getLocalVar(2)->getAsInteger(); fieldinteger_t fmask = aFuncContextP->getLocalVar(3)->getAsInteger(); fieldinteger_t lmask = aFuncContextP->getLocalVar(4)->getAsInteger(); bool occurrencecount = aFuncContextP->getLocalVar(5)->getAsBoolean(); // - get end date / recurrence to get count for // Note: this is obtained in the same context as start, even if it might be in another context lineartime_t occurrence = static_cast(aFuncContextP->getLocalVar(6))->getTimestampAs(tctx); // now calculate sInt16 count; if(countFromEndDate( count, occurrencecount, start, freq,freqmod, interval, fmask,lmask, occurrence, aFuncContextP->getDbgLogger() )) { // successful aTermP->setAsInteger(count); } else { // unsuccessful aTermP->unAssign(); } } // func_Recurrence_Count // string MAKE_RRULE( // boolean rrule2, // string rr_freq, integer interval, // integer fmask, integer lmask, // timestamp until // ) static void func_Make_RRULE(TItemField *&aTermP, TScriptContext *aFuncContextP) { // get params string rr_freq; timecontext_t untilcontext; // - start time context is used for rule evaluation bool rruleV2 = aFuncContextP->getLocalVar(0)->getAsBoolean(); aFuncContextP->getLocalVar(1)->getAsString(rr_freq); char freq = rr_freq.size()>0 ? rr_freq[0] : ' '; char freqmod = rr_freq.size()>1 ? rr_freq[1] : ' '; sInt16 interval = aFuncContextP->getLocalVar(2)->getAsInteger(); fieldinteger_t fmask = aFuncContextP->getLocalVar(3)->getAsInteger(); fieldinteger_t lmask = aFuncContextP->getLocalVar(4)->getAsInteger(); lineartime_t until = static_cast(aFuncContextP->getLocalVar(5))->getTimestampAs(TCTX_UNKNOWN,&untilcontext); // convert to RRULE string string rrule; bool ok; if (rruleV2) ok = internalToRRULE2(rrule,freq,freqmod,interval,fmask,lmask,until,untilcontext,aFuncContextP->getDbgLogger()); else ok = internalToRRULE1(rrule,freq,freqmod,interval,fmask,lmask,until,untilcontext,aFuncContextP->getDbgLogger()); if (ok) { // successful aTermP->setAsString(rrule); } else { // unsuccessful aTermP->unAssign(); } } // func_Make_RRULE // boolean PARSE_RRULE( // boolean rruleV2, // string rrule, // timestamp start, // string &rr_freq, integer &interval, // integer &fmask, integer &lmask, // timestamp &until // ) static void func_Parse_RRULE(TItemField *&aTermP, TScriptContext *aFuncContextP) { timecontext_t startcontext; char freq[3] = {' ', ' ', 0}; sInt16 interval; fieldinteger_t fmask,lmask; lineartime_t until; timecontext_t untilcontext; // get params // - start time context is used for rule evaluation bool rruleV2 = aFuncContextP->getLocalVar(0)->getAsBoolean(); string rrule; aFuncContextP->getLocalVar(1)->getAsString(rrule); lineartime_t start = static_cast(aFuncContextP->getLocalVar(2))->getTimestampAs(TCTX_UNKNOWN,&startcontext); bool ok; if (rruleV2) ok = RRULE2toInternal(rrule.c_str(),start,startcontext,freq[0],freq[1],interval,fmask,lmask,until,untilcontext,aFuncContextP->getDbgLogger()); else ok = RRULE1toInternal(rrule.c_str(),start,startcontext,freq[0],freq[1],interval,fmask,lmask,until,untilcontext,aFuncContextP->getDbgLogger()); if (ok) { // successful // - save return values aFuncContextP->getLocalVar(3)->setAsString(freq); aFuncContextP->getLocalVar(4)->setAsInteger(interval); aFuncContextP->getLocalVar(5)->setAsInteger(fmask); aFuncContextP->getLocalVar(6)->setAsInteger(lmask); static_cast(aFuncContextP->getLocalVar(7))->setTimestampAndContext(until, untilcontext); } aTermP->setAsBoolean(ok); } // func_Parse_RRULE // integer PARSEEMAILSPEC(string emailspec, string &name, string &email) static void func_ParseEmailSpec(TItemField *&aTermP, TScriptContext *aFuncContextP) { string spec,name,addr; aFuncContextP->getLocalVar(0)->getAsString(spec); cAppCharP e = parseRFC2822AddrSpec(spec.c_str(),name,addr); aTermP->setAsInteger(e-spec.c_str()); // return number of chars parsed aFuncContextP->getLocalVar(1)->setAsString(name); aFuncContextP->getLocalVar(2)->setAsString(addr); } // func_ParseEmailSpec // string MAKEEMAILSPEC(string name, string email) static void func_MakeEmailSpec(TItemField *&aTermP, TScriptContext *aFuncContextP) { string spec,name,addr; aFuncContextP->getLocalVar(0)->getAsString(name); aFuncContextP->getLocalVar(1)->getAsString(addr); makeRFC2822AddrSpec(name.c_str(),addr.c_str(),spec); aTermP->setAsString(spec); // return RFC2822 email address specification } // func_MakeEmailSpec // helper to create profile handler by name // - returns NULL if no such profile name or profile's field list does not match the item's fieldlist static TProfileHandler *newProfileHandlerByName(cAppCharP aProfileName, TMultiFieldItem *aItemP) { // get type registry to find profile config in TMultiFieldDatatypesConfig *mufcP; GET_CASTED_PTR(mufcP,TMultiFieldDatatypesConfig,aItemP->getItemType()->getTypeConfig()->getParentElement(),"PARSETEXTWITHPROFILE/MAKETEXTWITHPROFILE used with non-multifield item"); // get profile config from type registry TProfileConfig *profileConfig = mufcP->getProfile(aProfileName); if (profileConfig) { // create a profile handler for the item type return profileConfig->newProfileHandler(aItemP->getItemType()); } return NULL; // no such profile } // integer PARSETEXTWITHPROFILE(string textformat, string profileName [, int mode = 0 = default [, string remoteRuleName = "" = other]]) static void func_ParseTextWithProfile(TItemField *&aTermP, TScriptContext *aFuncContextP) { bool ok = false; if (aFuncContextP->fParentContextP) { // get the item to work with TMultiFieldItem *itemP = aFuncContextP->fParentContextP->fTargetItemP; // get a handler by name string s; aFuncContextP->getLocalVar(1)->getAsString(s); TProfileHandler *profileHandlerP = newProfileHandlerByName(s.c_str(), itemP); if (profileHandlerP) { // now we can convert // - set the mode code (none = 0 = default) profileHandlerP->setProfileMode(aFuncContextP->getLocalVar(2)->getAsInteger()); profileHandlerP->setRelatedDatastore(NULL); // no datastore in particular is related #ifndef NO_REMOTE_RULES // - try to find remote rule TItemField *field = aFuncContextP->getLocalVar(3); if (field) { field->getAsString(s); if (!s.empty()) profileHandlerP->setRemoteRule(s); } #endif // - convert aFuncContextP->getLocalVar(0)->getAsString(s); ok = profileHandlerP->parseText(s.c_str(), s.size(), *itemP); // - forget delete profileHandlerP; } } aTermP->setAsBoolean(ok); } // func_ParseTextWithProfile // string MAKETEXTWITHPROFILE(string profileName [, int mode [, string remoteRuleName = "" = other] ]) static void func_MakeTextWithProfile(TItemField *&aTermP, TScriptContext *aFuncContextP) { if (aFuncContextP->fParentContextP) { // get the item to work with TMultiFieldItem *itemP = aFuncContextP->fParentContextP->fTargetItemP; // get a handler by name string s; aFuncContextP->getLocalVar(0)->getAsString(s); TProfileHandler *profileHandlerP = newProfileHandlerByName(s.c_str(), itemP); if (profileHandlerP) { // now we can convert // - set the mode code (none = 0 = default) profileHandlerP->setProfileMode(aFuncContextP->getLocalVar(1)->getAsInteger()); profileHandlerP->setRelatedDatastore(NULL); // no datastore in particular is related #ifndef NO_REMOTE_RULES // - try to find remote rule TItemField *field = aFuncContextP->getLocalVar(2); if (field) { field->getAsString(s); if (!s.empty()) profileHandlerP->setRemoteRule(s); } #endif // - convert, after clearing the string (some generateText() implementations // append instead of overwriting) s = ""; profileHandlerP->generateText(*itemP,s); aTermP->setAsString(s); // return text generated according to profile // - forget delete profileHandlerP; } } } // func_MakeTextWithProfile }; // TBuiltinStdFuncs const uInt8 param_oneTimestamp[] = { VAL(fty_timestamp) }; const uInt8 param_oneInteger[] = { VAL(fty_integer) }; const uInt8 param_oneString[] = { VAL(fty_string) }; const uInt8 param_oneVariant[] = { VAL(fty_none) }; const uInt8 param_oneOptInteger[] = { OPTVAL(fty_integer) }; const uInt8 param_Random[] = { VAL(fty_integer), OPTVAL(fty_integer) }; const uInt8 param_SetTimezone[] = { REF(fty_timestamp), VAL(fty_none) }; const uInt8 param_SetFloating[] = { REF(fty_timestamp) }; const uInt8 param_ConvertToZone[] = { VAL(fty_timestamp), VAL(fty_none), OPTVAL(fty_integer) }; const uInt8 param_ConvertToUserZone[] = { VAL(fty_timestamp), OPTVAL(fty_integer) }; const uInt8 param_Shellexecute[] = { VAL(fty_string), VAL(fty_string), OPTVAL(fty_integer) }; const uInt8 param_substr[] = { VAL(fty_string), VAL(fty_integer), OPTVAL(fty_integer) }; const uInt8 param_size[] = { REF(fty_none) }; const uInt8 param_Normalized[] = { REF(fty_none) }; const uInt8 param_find[] = { VAL(fty_string), VAL(fty_string), OPTVAL(fty_integer) }; const uInt8 param_compare[] = { VAL(fty_none), VAL(fty_none) }; const uInt8 param_contains[] = { REF(fty_none), VAL(fty_none), OPTVAL(fty_integer) }; const uInt8 param_append[] = { REF(fty_none), VAL(fty_none) }; const uInt8 param_swap[] = { REF(fty_none), REF(fty_none) }; const uInt8 param_isAvailable[] = { REF(fty_none) }; const uInt8 param_setFieldOptions[] = { REF(fty_none), VAL(fty_integer), OPTVAL(fty_integer), OPTVAL(fty_integer), OPTVAL(fty_integer) }; // const uInt8 param_typename[] = { VAL(fty_none) }; const uInt8 param_SetSessionVar[] = { VAL(fty_string), VAL(fty_none) }; const uInt8 param_SetDebugOptions[] = { VAL(fty_string), VAL(fty_integer) }; const uInt8 param_Recurrence_Date[] = { VAL(fty_timestamp), VAL(fty_string), VAL(fty_integer), VAL(fty_integer), VAL(fty_integer), VAL(fty_integer), VAL(fty_integer) }; const uInt8 param_Recurrence_Count[] = { VAL(fty_timestamp), VAL(fty_string), VAL(fty_integer), VAL(fty_integer), VAL(fty_integer), VAL(fty_integer), VAL(fty_timestamp) }; const uInt8 param_Make_RRULE[] = { VAL(fty_integer), VAL(fty_string), VAL(fty_integer), VAL(fty_integer), VAL(fty_integer), VAL(fty_timestamp) }; const uInt8 param_Parse_RRULE[] = { VAL(fty_integer), VAL(fty_string), VAL(fty_timestamp), REF(fty_string), REF(fty_integer), REF(fty_integer), REF(fty_integer), REF(fty_timestamp) }; const uInt8 param_AlldayCount[] = { VAL(fty_timestamp), VAL(fty_timestamp), OPTVAL(fty_integer), OPTVAL(fty_integer) }; const uInt8 param_MakeAllday[] = { REF(fty_timestamp), REF(fty_timestamp), OPTVAL(fty_integer) }; const uInt8 param_NumFormat[] = { VAL(fty_integer), VAL(fty_integer), OPTVAL(fty_string), OPTVAL(fty_string) }; const uInt8 param_Explode[] = { VAL(fty_string), REFARR(fty_none) }; const uInt8 param_parseEmailSpec[] = { VAL(fty_string), REF(fty_string), REF(fty_string) }; const uInt8 param_makeEmailSpec[] = { VAL(fty_string), VAL(fty_string) }; const uInt8 param_parseTextWithProfile[] = { VAL(fty_string), VAL(fty_string), OPTVAL(fty_integer), OPTVAL(fty_string) }; const uInt8 param_makeTextWithProfile[] = { VAL(fty_string), OPTVAL(fty_integer), OPTVAL(fty_string) }; #ifdef REGEX_SUPPORT const uInt8 param_regexfind[] = { VAL(fty_string), VAL(fty_string), OPTVAL(fty_integer) }; const uInt8 param_regexmatch[] = { VAL(fty_string), VAL(fty_string), VAL(fty_integer), REF(fty_none) }; const uInt8 param_regexreplace[] = { VAL(fty_string), VAL(fty_string), VAL(fty_string), OPTVAL(fty_integer), OPTVAL(fty_integer) }; const uInt8 param_regexsplit[] = { VAL(fty_string), VAL(fty_string), REFARR(fty_none), OPTVAL(fty_integer) }; #endif // builtin function table const TBuiltInFuncDef BuiltInFuncDefs[] = { { "ABS", TBuiltinStdFuncs::func_Abs, fty_integer, 1, param_oneInteger }, { "SIGN", TBuiltinStdFuncs::func_Sign, fty_integer, 1, param_oneInteger }, { "RANDOM", TBuiltinStdFuncs::func_Random, fty_integer, 2, param_Random }, { "NUMFORMAT", TBuiltinStdFuncs::func_NumFormat, fty_string, 4, param_NumFormat }, { "NORMALIZED", TBuiltinStdFuncs::func_Normalized, fty_string, 1, param_Normalized }, { "ISAVAILABLE", TBuiltinStdFuncs::func_IsAvailable, fty_integer, 1, param_isAvailable }, { "SETFIELDOPTIONS", TBuiltinStdFuncs::func_SetFieldOptions, fty_none, 5, param_setFieldOptions }, { "ITEMDATATYPE", TBuiltinStdFuncs::func_ItemDataType, fty_string, 0, NULL }, { "ITEMTYPENAME", TBuiltinStdFuncs::func_ItemTypeName, fty_string, 0, NULL }, { "ITEMTYPEVERS", TBuiltinStdFuncs::func_ItemTypeVers, fty_string, 0, NULL }, { "EXPLODE", TBuiltinStdFuncs::func_Explode, fty_string, 2, param_Explode }, { "SUBSTR", TBuiltinStdFuncs::func_Substr, fty_string, 3, param_substr }, { "LENGTH", TBuiltinStdFuncs::func_Length, fty_integer, 1, param_oneString }, { "SIZE", TBuiltinStdFuncs::func_Size, fty_integer, 1, param_size }, { "FIND", TBuiltinStdFuncs::func_Find, fty_integer, 3, param_find }, { "RFIND", TBuiltinStdFuncs::func_RFind, fty_integer, 3, param_find }, #ifdef REGEX_SUPPORT { "REGEX_FIND", TBuiltinStdFuncs::func_Regex_Find, fty_integer, 3, param_regexfind }, { "REGEX_MATCH", TBuiltinStdFuncs::func_Regex_Match, fty_integer, 4, param_regexmatch }, { "REGEX_SPLIT", TBuiltinStdFuncs::func_Regex_Split, fty_integer, 4, param_regexsplit }, { "REGEX_REPLACE", TBuiltinStdFuncs::func_Regex_Replace, fty_string, 5, param_regexreplace }, #endif { "COMPARE", TBuiltinStdFuncs::func_Compare, fty_integer, 2, param_compare }, { "CONTAINS", TBuiltinStdFuncs::func_Contains, fty_integer, 3, param_contains }, { "APPEND", TBuiltinStdFuncs::func_Append, fty_none, 2, param_append }, { "UPPERCASE", TBuiltinStdFuncs::func_UpperCase, fty_string, 1, param_oneString }, { "LOWERCASE", TBuiltinStdFuncs::func_LowerCase, fty_string, 1, param_oneString }, { "SWAP", TBuiltinStdFuncs::func_Swap, fty_none, 2, param_swap }, { "TYPENAME", TBuiltinStdFuncs::func_TypeName, fty_string, 1, param_oneVariant }, { "REMOTERULENAME", TBuiltinStdFuncs::func_Remoterulename, fty_string, 0, NULL }, { "ISACTIVERULE", TBuiltinStdFuncs::func_isActiveRule, fty_integer, 1, param_oneString }, { "LOCALURI", TBuiltinStdFuncs::func_LocalURI, fty_string, 0, NULL }, { "NOW", TBuiltinStdFuncs::func_Now, fty_timestamp, 0, NULL }, { "SYSTEMNOW", TBuiltinStdFuncs::func_SystemNow, fty_timestamp, 0, NULL }, { "DBNOW", TBuiltinStdFuncs::func_DbNow, fty_timestamp, 0, NULL }, { "ZONEOFFSET", TBuiltinStdFuncs::func_ZoneOffset, fty_integer, 1, param_oneTimestamp }, { "TIMEZONE", TBuiltinStdFuncs::func_Timezone, fty_string, 1, param_oneTimestamp }, { "VTIMEZONE", TBuiltinStdFuncs::func_VTimezone, fty_string, 1, param_oneTimestamp }, { "SETTIMEZONE", TBuiltinStdFuncs::func_SetTimezone, fty_none, 2, param_SetTimezone }, { "SETFLOATING", TBuiltinStdFuncs::func_SetFloating, fty_none, 1, param_SetFloating }, { "CONVERTTOZONE", TBuiltinStdFuncs::func_ConvertToZone, fty_timestamp, 3, param_ConvertToZone }, { "CONVERTTOUSERZONE", TBuiltinStdFuncs::func_ConvertToUserZone, fty_timestamp, 2, param_ConvertToUserZone }, { "USERTIMEZONE", TBuiltinStdFuncs::func_UserTimezone, fty_string, 0, NULL }, { "SETUSERTIMEZONE", TBuiltinStdFuncs::func_SetUserTimezone, fty_none, 1, param_oneVariant }, { "ISDATEONLY", TBuiltinStdFuncs::func_IsDateOnly, fty_integer, 1, param_oneTimestamp }, { "DATEONLY", TBuiltinStdFuncs::func_DateOnly, fty_timestamp, 1, param_oneTimestamp }, { "TIMEONLY", TBuiltinStdFuncs::func_TimeOnly, fty_timestamp, 1, param_oneTimestamp }, { "ISDURATION", TBuiltinStdFuncs::func_IsDuration, fty_integer, 1, param_oneTimestamp }, { "DURATION", TBuiltinStdFuncs::func_Duration, fty_timestamp, 1, param_oneTimestamp }, { "POINTINTIME", TBuiltinStdFuncs::func_PointInTime, fty_timestamp, 1, param_oneTimestamp }, { "ISFLOATING", TBuiltinStdFuncs::func_IsFloating, fty_integer, 1, param_oneTimestamp }, { "WEEKDAY", TBuiltinStdFuncs::func_Weekday, fty_integer, 1, param_oneTimestamp }, { "SECONDS", TBuiltinStdFuncs::func_Seconds, fty_integer, 1, param_oneInteger }, { "MILLISECONDS", TBuiltinStdFuncs::func_Milliseconds, fty_integer, 1, param_oneInteger }, { "SLEEPMS", TBuiltinStdFuncs::func_SleepMS, fty_none, 1, param_oneInteger }, { "TIMEUNITS", TBuiltinStdFuncs::func_Timeunits, fty_integer, 1, param_oneInteger }, { "DAYUNITS", TBuiltinStdFuncs::func_Dayunits, fty_integer, 1, param_oneInteger }, { "MONTHDAYS", TBuiltinStdFuncs::func_MonthDays, fty_integer, 1, param_oneTimestamp }, { "DEBUGMESSAGE", TBuiltinStdFuncs::func_Debugmessage, fty_none, 1, param_oneString }, { "DEBUGSHOWVARS", TBuiltinStdFuncs::func_DebugShowVars, fty_none, 0, NULL }, { "DEBUGSHOWITEM", TBuiltinStdFuncs::func_DebugShowItem, fty_none, 1, param_oneOptInteger }, { "SETDEBUGOPTIONS", TBuiltinStdFuncs::func_SetDebugOptions, fty_none, 2, param_SetDebugOptions }, { "SETDEBUGMASK", TBuiltinStdFuncs::func_SetDebugMask, fty_none, 1, param_oneInteger }, { "SETXMLTRANSLATE", TBuiltinStdFuncs::func_SetXMLTranslate, fty_none, 1, param_oneInteger }, { "SETMSGDUMP", TBuiltinStdFuncs::func_SetMsgDump, fty_none, 1, param_oneInteger }, { "GETDEBUGMASK", TBuiltinStdFuncs::func_GetDebugMask, fty_integer, 0, NULL }, { "REQUESTMAXTIME", TBuiltinStdFuncs::func_RequestMaxTime, fty_none, 1, param_oneInteger }, { "REQUESTMINTIME", TBuiltinStdFuncs::func_RequestMinTime, fty_none, 1, param_oneInteger }, { "SHELLEXECUTE", TBuiltinStdFuncs::func_Shellexecute, fty_integer, 3, param_Shellexecute }, { "READ", TBuiltinStdFuncs::func_Read, fty_string, 1, param_oneString }, { "URITOPATH", TBuiltinStdFuncs::func_URIToPath, fty_string, 1, param_oneString }, { "URLENCODE", TBuiltinStdFuncs::func_URLEncode, fty_string, 1, param_oneString }, { "URLDECODE", TBuiltinStdFuncs::func_URLDecode, fty_string, 1, param_oneString }, { "SESSIONVAR", TBuiltinStdFuncs::func_SessionVar, fty_none, 1, param_oneString }, { "SETSESSIONVAR", TBuiltinStdFuncs::func_SetSessionVar, fty_none, 2, param_SetSessionVar }, { "ABORTSESSION", TBuiltinStdFuncs::func_AbortSession, fty_none, 1, param_oneInteger }, { "SETDEBUGLOG", TBuiltinStdFuncs::func_SetDebugLog, fty_none, 1, param_oneInteger }, { "SETLOG", TBuiltinStdFuncs::func_SetLog, fty_none, 1, param_oneInteger }, { "SETREADONLY", TBuiltinStdFuncs::func_SetReadOnly, fty_none, 1, param_oneInteger }, { "CONFIGVAR", TBuiltinStdFuncs::func_ConfigVar, fty_string, 1, param_oneString }, { "TREATASLOCALTIME", TBuiltinStdFuncs::func_SetTreatAsLocaltime, fty_none, 1, param_oneInteger }, { "TREATASUTC", TBuiltinStdFuncs::func_SetTreatAsUTC, fty_none, 1, param_oneInteger }, { "UPDATECLIENTINSLOWSYNC", TBuiltinStdFuncs::func_SetUpdateClientInSlowSync, fty_none, 1, param_oneInteger }, { "UPDATESERVERINSLOWSYNC", TBuiltinStdFuncs::func_SetUpdateServerInSlowSync, fty_none, 1, param_oneInteger }, { "SHOWCTCAPPROPERTIES", TBuiltinStdFuncs::func_ShowCTCapProps, fty_none, 1, param_oneInteger }, { "SHOWTYPESIZEINCTCAP10", TBuiltinStdFuncs::func_ShowTypeSizeInCTCap10, fty_none, 1, param_oneInteger }, { "ENUMDEFAULTPROPPARAMS", TBuiltinStdFuncs::func_EnumDefaultPropParams, fty_none, 1, param_oneInteger }, { "RECURRENCE_DATE", TBuiltinStdFuncs::func_Recurrence_Date, fty_timestamp, 7, param_Recurrence_Date }, { "RECURRENCE_COUNT", TBuiltinStdFuncs::func_Recurrence_Count, fty_integer, 7, param_Recurrence_Count }, { "MAKE_RRULE", TBuiltinStdFuncs::func_Make_RRULE, fty_string, 6, param_Make_RRULE }, { "PARSE_RRULE", TBuiltinStdFuncs::func_Parse_RRULE, fty_integer, 8, param_Parse_RRULE }, { "PARSEEMAILSPEC", TBuiltinStdFuncs::func_ParseEmailSpec, fty_integer, 3, param_parseEmailSpec }, { "MAKEEMAILSPEC", TBuiltinStdFuncs::func_MakeEmailSpec, fty_string, 2, param_makeEmailSpec }, { "PARSETEXTWITHPROFILE", TBuiltinStdFuncs::func_ParseTextWithProfile, fty_integer, 4, param_parseTextWithProfile }, { "MAKETEXTWITHPROFILE", TBuiltinStdFuncs::func_MakeTextWithProfile, fty_string, 3, param_makeTextWithProfile }, { "SYNCMLVERS", TBuiltinStdFuncs::func_SyncMLVers, fty_string, 0, NULL }, { "ALLDAYCOUNT", TBuiltinStdFuncs::func_AlldayCount, fty_integer, 4, param_AlldayCount }, { "MAKEALLDAY", TBuiltinStdFuncs::func_MakeAllday, fty_integer, 3, param_MakeAllday }, }; const TFuncTable BuiltInFuncTable = { sizeof(BuiltInFuncDefs) / sizeof(TBuiltInFuncDef), // size of table BuiltInFuncDefs, // table pointer NULL // no chain func }; /* * Implementation of TScriptContext */ /* public TScriptContext members */ TScriptContext::TScriptContext(TSyncAppBase *aAppBaseP, TSyncSession *aSessionP) : fAppBaseP(aAppBaseP), // save syncappbase link, must always exist fSessionP(aSessionP), // save session, can be NULL fNumVars(0), // number of instantiated vars fNumParams(0), fFieldsP(NULL), // no field contents yet scriptname(NULL), // no script name known yet linesource(NULL), executing(false), debugon(false), fTargetItemP(NULL), fReferenceItemP(NULL), fParentContextP(NULL) { fVarDefs.clear(); } // TScriptContext::TScriptContext TScriptContext::~TScriptContext() { clear(); } // TScriptContext::~TScriptContext // Reset context (clear all variables and definitions) void TScriptContext::clear(void) { // clear actual fields clearFields(); // clear definitions TVarDefs::iterator pos; for (pos=fVarDefs.begin(); pos!=fVarDefs.end(); pos++) { if (*pos) delete (*pos); } fVarDefs.clear(); } // TScriptContext::clear GZones *TScriptContext::getSessionZones(void) { return fSessionP ? fSessionP->getSessionZones() : NULL; } // TScriptContext::getSessionZones #ifdef SYDEBUG // get debug logger TDebugLogger *TScriptContext::getDbgLogger(void) { // use session logger if linked to a session if (fSessionP) return fSessionP->getDbgLogger(); // otherwise, use global logger return fAppBaseP ? fAppBaseP->getDbgLogger() : NULL; } // TScriptContext::getDbgLogger uInt32 TScriptContext::getDbgMask(void) { // use session logger if linked to a session if (fSessionP) return fSessionP->getDbgMask(); // otherwise, use global logger return fAppBaseP ? fAppBaseP->getDbgMask() : 0; } // TScriptContext::getDbgMask #endif // Reset context (clear all variables and definitions) void TScriptContext::clearFields(void) { if (fFieldsP) { // clear local vars (fields), but not references TVarDefs::iterator pos; for (pos=fVarDefs.begin(); pos!=fVarDefs.end(); pos++) { sInt16 i=(*pos)->fIdx; if (i>=fNumVars) break; // all instantiated vars done, stop even if more might be defined if (fFieldsP[i]) { if (!(*pos)->fIsRef) delete fFieldsP[i]; // delete field object (but only if not reference) fFieldsP[i]=NULL; } } // clear array of field pointers delete [] fFieldsP; fFieldsP=NULL; fNumVars=0; } } // TScriptContext::clearFields // check for identifier static bool isidentchar(appChar c) { return isalnum(c) || c=='_'; } // isidentchar // adds source line (including source text, if selected) to token stream static void addSourceLine(uInt16 aLine, const char *aText, string &aScript, bool aIncludeSource, uInt16 &aLastIncludedLine) { aScript+=TK_SOURCELINE; // token #ifdef SYDEBUG sInt16 linelen=0; // line #0 is script/function name and must be included anyway if (aIncludeSource && (aLine>aLastIncludedLine || aLine==0)) { const char *tt=aText; while (*tt && *tt!=0x0D && *tt!=0x0A) ++tt; linelen=tt-aText+1; // room for the terminator if (linelen>250) linelen=250; // limit size (2 chars needed for number, 3 reserved) // Note: even empty line will have at least one char (the terminator) aScript+=(appChar)(2+linelen); // length of additional data } else { // Note: not-included line will have no extra data (not even the terminator), so // it can be distinguished from empty line aIncludeSource=false; aScript+=(appChar)(2); // length of additional data } #else aScript+=(appChar)(2); // length of additional data #endif // add source line number aScript+=(appChar)(aLine>>8); // source line aScript+=(appChar)(aLine & 0xFF); // add source itself #ifdef SYDEBUG if (aIncludeSource) { aScript.append(aText,linelen-1); aScript+=(appChar)(0); // add terminator aLastIncludedLine = aLine; } #endif } // addSourceLine // Tokenize input string void TScriptContext::Tokenize(TSyncAppBase *aAppBaseP, cAppCharP aScriptName, sInt32 aLine, cAppCharP aScriptText, string &aTScript, const TFuncTable *aContextFuncs, bool aFuncHeader, bool aNoDeclarations, TMacroArgsArray *aMacroArgsP) { string itm; string macro; appChar c,c2; appChar token,lasttoken=0; cAppCharP text = aScriptText; cAppCharP p; uInt16 line=aLine; // script starts here sInt16 enu; // clear output aTScript.erase(); // debug info if script debugging is enabled in configuration bool includesource = #ifdef SYDEBUG aAppBaseP->getRootConfig()->fDebugConfig.fDebug & DBG_SCRIPTS; #else false; #endif uInt16 lastincludedline = 0; if (*text) { #ifdef SYDEBUG // insert script name as line #0 in all but completely empty scripts (or functions) if (aScriptName) addSourceLine(0,aScriptName,aTScript,true,lastincludedline); #endif // insert source line identification token for start of script for all but completely empty scripts addSourceLine(line,text,aTScript,includesource,lastincludedline); } // marco argument expansion // Note: $n (with n=1,2,3...9) is expanded before any other processing. To insert e.g. $2 literally, use $$2. // $n macros that can't be expanded will be left in the text AS IS string itext; if (aMacroArgsP) { itext = text; // we need a string to substitute macro args in size_t i = 0; while (i=0 && (size_t)argidxsize()) { // found macro argument, replace in input string itext.replace(i-1, 2, (*aMacroArgsP)[argidx]); // no nested macro argument eval, just advance pointer behind replacement text i += (*aMacroArgsP)[argidx].size()-1; // check next char continue; } } } } // now use expanded version of text for tokenizing text = itext.c_str(); } // actual tokenisation cAppCharP textstart = text; SYSYNC_TRY { // process text while (*text) { // get next token token=0; // none yet // - skip spaces (but not line ends) while (*text==' ' || *text=='\t') text++; // - dispatch different types of tokens c=*text++; if (c==0) break; // done with script // - check input now if (isdigit(c)) { // numeric literal p=text-1; // beginning of literal while (isalnum(*text)) text++; // - p=start, text=past end of numeric literal itm.assign(p,text-p); // code literal into token string aTScript+=TK_NUMERIC_LITERAL; // token aTScript+=(appChar)(itm.size()); // length of additional data aTScript.append(itm); } else if (c=='"') { // string literal, parse itm.erase(); while ((c=*text)) { text++; if (c=='"') { break; } // done if (c=='\\') { // escape char c2=*text++; if (!c2) break; // escape without anything following -> done else if (c2=='n') c='\n'; // internal line end else if (c2=='t') c='\t'; // internal tab else if (c2=='x') { // hex char spec uInt16 sh; text+=HexStrToUShort(text,sh,2); c=(appChar)sh; } else c=c2; // simply use char following the escape char } // now add if (c) itm+=c; } // code literal into token string aTScript+=TK_STRING_LITERAL; // token aTScript+=(appChar)(itm.size()); // length of additional data aTScript.append(itm); } else if (isalpha(c)) { // identifier // - get identifier p=text-1; while (isidentchar(*text)) text++; // - now p=start of identified, text=end uInt16 il=text-p; // - skip whitespace following identifier while (*text==' ' || *text=='\t') text++; // - check language keywords if (strucmp(p,"IF",il)==0) token=TK_IF; else if (strucmp(p,"ELSE",il)==0) token=TK_ELSE; else if (strucmp(p,"LOOP",il)==0) token=TK_LOOP; else if (strucmp(p,"WHILE",il)==0) token=TK_WHILE; else if (strucmp(p,"BREAK",il)==0) token=TK_BREAK; else if (strucmp(p,"CONTINUE",il)==0) token=TK_CONTINUE; else if (strucmp(p,"RETURN",il)==0) token=TK_RETURN; // - check special constants else if (strucmp(p,"EMPTY",il)==0) token=TK_EMPTY; else if (strucmp(p,"UNASSIGNED",il)==0) token=TK_UNASSIGNED; else if (strucmp(p,"TRUE",il)==0) token=TK_TRUE; else if (strucmp(p,"FALSE",il)==0) token=TK_FALSE; // - check types else if (StrToEnum(ItemFieldTypeNames,numFieldTypes,enu,p,il)) { // check if declaration and if allowed if (aNoDeclarations && lasttoken!=TK_OPEN_PARANTHESIS) SYSYNC_THROW(TTokenizeException(aScriptName, "no local variable declarations allowed in this script",textstart,text-textstart,line)); // code type into token aTScript+=TK_TYPEDEF; // token aTScript+=1; // length of additional data aTScript+=enu; // type } // - check function calls if in body else if (*text=='(' && !aFuncHeader) { // identifier followed by ( must be function call (if not in header of function itself) // - check for built-in function sInt16 k=0; while (k=0) { // no built-in base function, could be context-related function k=0; // function index (may span several chain links) // - start with passed functable TFuncTable *functableP = (TFuncTable *)aContextFuncs; while(functableP) { // get the function table properties sInt16 fidx,numfuncs = functableP->numFuncs; const TBuiltInFuncDef *funcs = functableP->funcDefs; // process this func table for (fidx=0; fidxchainFunc) { // obtain next function table (caller context pointer is irrelevant here) k+=numfuncs; // index for next chained table starts at end of indexes for current table void *ctx=NULL; functableP=(TFuncTable *)functableP->chainFunc(ctx); } else { functableP=NULL; // end chaining loop } } // while if (k>=0) { // no built-in nor context-built-in found, assume user-defined aTScript+=TK_USERFUNCTION; // token aTScript+=(appChar)(il+1); // length of additional data aTScript+=VARIDX_UNDEFINED; // no function index defined yet aTScript.append(p,il); // identifier name } } } // - check object qualifiers else if (*text=='.') { // must be qualifier uInt8 objidx=OBJ_AUTO; if (strucmp(p,"LOCAL",il)==0) objidx=OBJ_LOCAL; else if (strucmp(p,"OLD",il)==0) objidx=OBJ_REFERENCE; else if (strucmp(p,"LOOSING",il)==0) objidx=OBJ_REFERENCE; else if (strucmp(p,"REFERENCE",il)==0) objidx=OBJ_REFERENCE; else if (strucmp(p,"NEW",il)==0) objidx=OBJ_TARGET; else if (strucmp(p,"WINNING",il)==0) objidx=OBJ_TARGET; else if (strucmp(p,"TARGET",il)==0) objidx=OBJ_TARGET; else SYSYNC_THROW(TTokenizeException(aScriptName,"unknown object name",textstart,text-textstart,line)); text++; // skip object qualifier aTScript+=TK_OBJECT; // token aTScript+=1; // length of additional data aTScript+=objidx; // object index } else { // generic identifier, must be some kind of variable reference aTScript+=TK_IDENTIFIER; // token aTScript+=(appChar)(il+1); // length of additional data aTScript+=VARIDX_UNDEFINED; // no variable index defined yet aTScript.append(p,il); // identifier name } } // if identifier else { // get next char for double-char tokens c2=*text; // check special single chars switch (c) { // - macro case '$': { // get macro name p=text; while (isidentchar(*text)) text++; if (text==p) SYSYNC_THROW(TTokenizeException(aScriptName,"missing macro name after $",textstart,text-textstart,line)); itm.assign(p,text-p); // see if we have such a macro TScriptConfig *cfgP = aAppBaseP->getRootConfig()->fScriptConfigP; TStringToStringMap::iterator pos = cfgP->fScriptMacros.find(itm); if (pos==cfgP->fScriptMacros.end()) SYSYNC_THROW(TTokenizeException(aScriptName,"unknown macro",textstart,p-1-textstart,line)); TMacroArgsArray macroArgs; // check for macro arguments if (*text=='(') { // Macro has Arguments text++; string arg; // Note: closing brackets and commas must be escaped when used as part of a macro argument while (*text) { c=*text++; if (c==',' || c==')') { // end of argument macroArgs.push_back(arg); // save it in array arg.erase(); if (c==')') break; // end of macro continue; // skip comma, next arg } else if (c=='\\') { if (*text==0) break; // end of string // escaped - use next char w/o testing for , or ) c=*text++; } // add to argument string arg += c; } } // continue tokenizing with macro text TScriptContext::Tokenize( aAppBaseP, itm.c_str(), // pass macro name as "script" name 1, // line number relative to beginning of macro (*pos).second.c_str(), // use macro text as script text macro, // produce tokenized macro here aContextFuncs, // same context false, // not in function header aNoDeclarations, // same condition ¯oArgs // macro arguments ); // append tokenized macro to current script aTScript+=macro; // continue with normal text break; } // - grouping case '(': token=TK_OPEN_PARANTHESIS; break; // open subexpression/argument paranthesis case ')': token=TK_CLOSE_PARANTHESIS; break; // close subexpression/argument paranthesis case ',': token=TK_LIST_SEPARATOR; break; // comma for separating arguments case '{': token=TK_BEGIN_BLOCK; aFuncHeader=false; break; // begin block (and start of function body) case '}': token=TK_END_BLOCK; break; // end block case ';': token=TK_END_STATEMENT; break; // end statement case '[': token=TK_OPEN_ARRAY; break; // open array paranthesis case ']': token=TK_CLOSE_ARRAY; break; // close array paranthesis // line ends case 0x0D: if (c2==0x0A) text++; // skip LF of CRLF sequence as well to make sure it is not counted twice // otherwise treat like LF case 0x0A: // new line begins : insert source line identification token (and source of next line, if any) line++; addSourceLine(line,text,aTScript,includesource,lastincludedline); break; // possible multi-char tokens case '/': if (c2=='/') { text++; // end-of-line comment, skip it do { c=*text; if (c==0 || c==0x0D || c==0x0A) break; text++; } while(true); } else if (c2=='*') { // C-style comment, skip until next '*/' text++; do { c=*text; if (c==0) break; text++; // next if (c=='*' && *text=='/') { // end of comment text++; // skip / break; // end of comment } else if (c==0x0D || c==0x0A) { if (*text==0x0A) text++; // skip LF of CRLF sequence as well to make sure it is not counted twice // new line begins : insert source line identification token (and source of next line, if any) line++; addSourceLine(line,text,aTScript,includesource,lastincludedline); } } while(true); } else token=TK_DIVIDE; // simple division break; case '*': token=TK_MULTIPLY; break; // multiply case '%': token=TK_MODULUS; break; // modulus case '+': token=TK_PLUS; break; // add case '-': token=TK_MINUS; break; // subtract/unary minus case '^': token=TK_BITWISEXOR; break; // bitwise XOR case '~': token=TK_BITWISENOT; break; // bitwise not (one's complement) case '!': if (c2=='=') { token=TK_NOTEQUAL; text++; } // != else token=TK_LOGICALNOT; // ! break; case '=': if (c2=='=') { token=TK_EQUAL; text++; } // == else token=TK_ASSIGN; // = break; case '>': if (c2=='=') { token=TK_GREATEREQUAL; text++; } // >= else if (c2=='>') { token=TK_SHIFTRIGHT; text++; } // >> else token=TK_GREATERTHAN; // > break; case '<': if (c2=='=') { token=TK_LESSEQUAL; text++; } // <= else if (c2=='<') { token=TK_SHIFTLEFT; text++; } // << else if (c2=='>') { token=TK_NOTEQUAL; text++; } // <> else token=TK_LESSTHAN; // < break; case '&': if (c2=='&') { token=TK_LOGICALAND; text++; } // && else token=TK_BITWISEAND; // & break; case '|': if (c2=='|') { token=TK_LOGICALOR; text++; } // || else token=TK_BITWISEOR; // | break; default: SYSYNC_THROW(TTokenizeException(aScriptName,"Syntax Error",textstart,text-textstart,line)); } } // add token if simple token found if (token) aTScript+=token; lasttoken=token; // save for differentiating casts from declarations etc. } // while more script text } SYSYNC_CATCH (...) // make sure that script with errors is not stored aTScript.erase(); SYSYNC_RETHROW; SYSYNC_ENDCATCH } // TScriptContext::Tokenize // tokenize and resolve user-defined function void TScriptContext::TokenizeAndResolveFunction(TSyncAppBase *aAppBaseP, sInt32 aLine, cAppCharP aScriptText, TUserScriptFunction &aFuncDef) { TScriptContext *resolvecontextP=NULL; Tokenize(aAppBaseP, NULL, aLine,aScriptText,aFuncDef.fFuncDef,NULL,true); // parse as function SYSYNC_TRY { // resolve identifiers resolvecontextP=new TScriptContext(aAppBaseP,NULL); resolvecontextP->ResolveIdentifiers( aFuncDef.fFuncDef, NULL, // no fields false, // not rebuild &aFuncDef.fFuncName // store name here ); delete resolvecontextP; } SYSYNC_CATCH (exception &e) delete resolvecontextP; SYSYNC_RETHROW; SYSYNC_ENDCATCH } // TScriptContext::TokenizeAndResolveFunction // resolve identifiers in a script, if there is a context passed at all void TScriptContext::resolveScript(TSyncAppBase *aAppBaseP, string &aTScript,TScriptContext *&aCtxP, TFieldListConfig *aFieldListConfigP) { if (aTScript.empty()) return; // no resolving needed if (!aCtxP) { // we need a context, create one aCtxP = new TScriptContext(aAppBaseP, NULL); } aCtxP->ResolveIdentifiers( aTScript, aFieldListConfigP, false ); } // TScriptContext::ResolveScript // link a script into a context with already instantiated variables. // This is for "late bound" scripts (such as rulescript) that cannot be bound at config // but are determined only later, when their context is already instantiated. void TScriptContext::linkIntoContext(string &aTScript,TScriptContext *aCtxP, TSyncSession *aSessionP) { if (aTScript.empty() || !aCtxP) return; // no resolving needed (no script or no context) // resolve identfiers (no new declarations possible) aCtxP->ResolveIdentifiers( aTScript, NULL, // no field list false, // do not rebuild NULL, // no function name false // no declarations allowed ); } // TScriptContext::linkIntoContext // rebuild a script context for a script, if the script is not empty // - Script must already be resolved with ResolveIdentifiers // - If context already exists, adds new locals to existing ones // - If aBuildVars is set, buildVars() will be called after rebuilding variable definitions void TScriptContext::rebuildContext(TSyncAppBase *aAppBaseP, string &aTScript,TScriptContext *&aCtxP, TSyncSession *aSessionP, bool aBuildVars) { // Optimization: Nop if script is empty and NOT build var requested for already existing context (=vars from other scripts!) if (aTScript.empty() && !(aBuildVars && aCtxP)) return; // Create context if there isn't one yet if (!aCtxP) { // we need a context, create one aCtxP = new TScriptContext(aAppBaseP,aSessionP); } SYSYNC_TRY { aCtxP->ResolveIdentifiers( aTScript, NULL, true ); if (aBuildVars) { // call this one, too buildVars(aCtxP); } } SYSYNC_CATCH (TScriptErrorException &e) // show error in log, but otherwise ignore it POBJDEBUGPRINTFX(aSessionP,DBG_ERROR,("Failed rebuilding script context: %s",e.what())); SYSYNC_ENDCATCH SYSYNC_CATCH (...) SYSYNC_ENDCATCH } // TScriptContext::rebuildContext // Builds the local variables according to definitions (clears existing vars first) void TScriptContext::buildVars(TScriptContext *&aCtxP) { if (aCtxP) { // instantiate the variables aCtxP->PrepareLocals(); } } // TScriptContext::buildVars // init parsing vars void TScriptContext::initParse(const string &aTScript, bool aExecuting) { executing=aExecuting; bp=(cUInt8P)aTScript.c_str(); // start of script ep=bp+aTScript.size(); // end of script p=bp; // cursor, start at beginning np=NULL; // no next token yet line=0; // no line yet linesource=NULL; // no source yet scriptname=NULL; // no name yet inComment=false; // not in comment yet if (p == ep) // empty script return; // try to get start line if (ep>bp && *p!=TK_SOURCELINE) SYSYNC_THROW(TScriptErrorException(DEBUGTEXT("Script does not start with TK_SOURCELINE","scri2"),line)); do { // get script name or first source code line line = (((uInt8)*(p+2))<<8) + (uInt8)(*(p+3)); nextline=line; // assume same #ifdef SYDEBUG sInt16 n=(uInt8)*(p+1)-2; if (n>0) { linesource=(const char *)(p+4); // source for this line starts here if (line==0) { // this is the script name scriptname=linesource; // remember linesource=NULL; } } p+=2+2+n; #else p+=2+2; // script starts here #endif if (line==0) { // we have the name continue; // get first line now } break; } while(true); } // TScriptContext::initParse #ifdef SYDEBUG // colorize source line (comments only so far) static void colorizeSourceLine(cAppCharP aSource, string &aColorSource, bool &aComment, bool skipping) { appChar c; bool start=true; bool incomment=aComment; bool lineendcomment=false; aColorSource.erase(); while ((c=*aSource++)) { // check for comment start if (!aComment && !skipping) { // not in comment if (c=='/') { if (*aSource=='*') { aComment=true; } else if (*aSource=='/') { aComment=true; lineendcomment=true; } } } // switch to new color if changes at this point if (start || incomment!=aComment) { aColorSource += "&html;"; if (!start) aColorSource += ""; // not start aColorSource += "&html;"; incomment = aComment; } // output current char if (c==' ') aColorSource += "&sp;"; // will convert to   in HTML else aColorSource += c; // check for end of comment after this char if (aComment && !lineendcomment && !skipping) { // in C-style comment if (c=='/' && !start && *(aSource-2)=='*') { // this was end of C-comment aComment=false; } } // not start any more start=false; } // end of color aColorSource += "&html;&html;"; // end of line terminates //-style comment if (lineendcomment) aComment=false; } // colorizeSourceLine #endif // get token at p if not end of script, updates np to point to next token uInt8 TScriptContext::gettoken(void) { uInt8 tk; DBGSTRINGDEF(s); if (np) p=np; // advance to next token line=nextline; // advance to next line if (p>=ep) return 0; // end of script do { // get token and search next tk=*p; // get token if (tk>TK_MAX_MULTIBYTE) np=p+1; // single byte token, next is next char else np=p+2+*(p+1); // use length to find next token // show current line with source if we have it #ifdef SYDEBUG // delay display of line when processing a end block statement to make sure // end-skipping decision is made BEFORE showing the line if (SCRIPTDBGTEST && linesource && executing && tk!=TK_END_STATEMENT && tk!=TK_END_BLOCK) { bool sk = skipping>0; colorizeSourceLine(linesource,s,inComment,sk); SCRIPTDBGMSG(("Line %4hd: %s",line,s.c_str())); linesource=NULL; // prevent showing same line twice } #endif // check if it is line token, which would be processed invisibly if (tk==TK_SOURCELINE) { // get source code line number line = (((uInt8)*(p+2))<<8) + (uInt8)(*(p+3)); // get source code itself, if present #ifdef SYDEBUG sInt16 n=(uInt8)*(p+1)-2; if (n>0) linesource=(const char *)(p+4); // source for this line starts here #endif // go to next token p=np; continue; // fetch next } nextline=line; // by default, assume next token is on same line do { // check if next is line token, if yes, skip it as well if (*np==TK_SOURCELINE) { // get next token's source code line #ifdef SYDEBUG uInt16 showline = nextline; // current line is next that must be shown #endif nextline = (((uInt8)*(np+2))<<8) + (uInt8)(*(np+3)); #ifdef SYDEBUG // - show last line if we'll skip another line if (linesource && executing) { colorizeSourceLine(linesource,s,inComment,skipping>0); SCRIPTDBGMSG(("Line %4hd: %s",showline,s.c_str())); linesource=NULL; // prevent showing same line twice } // - get next line's number and text sInt16 n=(uInt8)*(np+1)-2; if (n>0) linesource=(const char *)(np+4); // source for this line starts here np=np+2+2+n; #else np=np+2+2; // skip token #endif continue; // test again } break; } while(true); break; } while(true); return tk; } // TScriptContext::gettoken // re-use last token fetched with gettoken() void TScriptContext::reusetoken(void) { // set pointer such that next gettoken will fetch the same token again np=p; nextline=line; } // TScriptContext::reusetoken // Resolve local variable declarations, references and field references // Note: does not clear the context, so multiple scripts can // share the same context // Note: modifies the aTScript passed (inserts identifier IDs) void TScriptContext::ResolveIdentifiers(string &aTScript,TFieldListConfig *aFieldListConfigP, bool aRebuild, string *aFuncNameP, bool aNoNewLocals) { uInt8 tk; // current token TItemFieldTypes ty=fty_none; bool deftype=false; bool refdecl=false; bool funcparams=false; string ident; sInt16 objidx; // init parsing initParse(aTScript); objidx=OBJ_AUTO; while ((tk=gettoken())) { // check declaration syntax if (deftype && tk!=TK_IDENTIFIER) SYSYNC_THROW(TScriptErrorException("Bad declaration",line)); if (!funcparams && tk==TK_OPEN_PARANTHESIS) { // could be typecast if (*np==TK_TYPEDEF) { // is a typecase gettoken(); // swallow type identifier // next must be closing paranthesis if (gettoken()!=TK_CLOSE_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("Invalid typecast",line)); } } // process token else if (tk==TK_TYPEDEF) { // type definition (for variable declaration or function definition) ty = (TItemFieldTypes)(*(p+2)); deftype=true; // we are in type definition mode now // check if we are declaring a variable reference if (*np==TK_BITWISEAND) { gettoken(); refdecl=true; // defining a reference if (!funcparams) SYSYNC_THROW(TScriptErrorException("Field reference declaration allowed for function parameters",line)); } } else if (tk==TK_OBJECT) { objidx=*(p+2); continue; // avoid resetting to OBJ_AUTO at end of loop } else if (tk==TK_CLOSE_PARANTHESIS) { if (funcparams) { // end of function parameters fNumParams=fVarDefs.size(); // locals declared up to here are parameters funcparams=false; // done with parameters } } else if (tk==TK_IDENTIFIER) { // get identifier ident.assign((cAppCharP)(p+3),(size_t)(*(p+1)-1)); // check for function definition if (!funcparams && *np==TK_OPEN_PARANTHESIS) { // this is a function declaration if (!aRebuild) { // - check if allowed if (!aFuncNameP) SYSYNC_THROW(TScriptErrorException("cannot declare function here",line)); // - save name of function aFuncNameP->assign(ident); } // - determine return type if (deftype) fFuncType=ty; // save function return type else fFuncType=fty_none; // void function // - switch to function param parsing gettoken(); // get opening paranthesis funcparams=true; deftype=false; } else if (deftype) { // defining new local variable or parameter if (objidx!=OBJ_AUTO && objidx!=OBJ_LOCAL) SYSYNC_THROW(TScriptErrorException("cannot declare non-local variable '%s'",line,ident.c_str())); bool arr=false; // define new identifier(s) cUInt8P idp=p; // remember identifier token pointer // - check if this is an array definition if (*np==TK_OPEN_ARRAY) { arr=true; gettoken(); if (*np!=TK_CLOSE_ARRAY) SYSYNC_THROW(TScriptErrorException("Invalid array declaration for '%s'",line,ident.c_str())); #ifndef ARRAYFIELD_SUPPORT SYSYNC_THROW(TScriptErrorException("Arrays not available in this version",line)); #endif gettoken(); // swallow closing bracket } // - check if variable already defined TScriptVarDef *vardefP=NULL; #if SYDEBUG>1 // always get it by name and compare index vardefP = getVarDef(ident.c_str(),ident.size()); #else if (!aRebuild || (sInt8)(*(idp+2))==VARIDX_UNDEFINED) // first time build or index not yet set for another reason: get by name vardefP = getVarDef(ident.c_str(),ident.size()); else // on rebuild, get definition by already known index vardefP = getVarDef(-((sInt8)(*(idp+2))+1)); #endif #ifndef RELEASE_VERSION DEBUGPRINTFX(DBG_SCRIPTS+DBG_EXOTIC,( "ident=%s, vardefP=0x%lX, vardefP->fIdx=%d, stored idx=%d (=vardef idx %d)", ident.c_str(), (long)vardefP, vardefP ? (int)vardefP->fIdx : VARIDX_UNDEFINED, (int)((sInt8)(*(idp+2))), (int)(-((sInt8)(*(idp+2))+1)) )); #endif // check for match if (vardefP) { // check if type matching if (ty!=vardefP->fVarType || arr!=vardefP->fIsArray || refdecl!=vardefP->fIsRef) SYSYNC_THROW(TScriptErrorException("Redefined '%s' to different type",line,ident.c_str())); } else { // not existing yet if (aNoNewLocals) { // Note: aNoNewLocals is useful when resolving a script into a context // with already existing variables (such as RuleScript). We cannot // add new variables once the VarDefs have been instantiated! SYSYNC_THROW(TScriptErrorException("Cannot declare variables in this script",line)); } else { // create new variable definition vardefP = new TScriptVarDef(ident.c_str(),fVarDefs.size(),ty,arr,refdecl,false); fVarDefs.push_back(vardefP); #ifndef RELEASE_VERSION DEBUGPRINTFX(DBG_SCRIPTS+DBG_EXOTIC,( "created new vardef, ident=%s, type=%s, vardefP=0x%lX, vardefs.size()=%ld", ident.c_str(), ItemFieldTypeNames[ty], (long)vardefP, (long)fVarDefs.size() )); #endif } } if (!aRebuild) { // creating defs for the first time, set index aTScript[idp-bp+2]= -(sInt8)(vardefP->fIdx)-1; } #if SYDEBUG>1 else { // check existing index against new one if ((sInt8)(*(idp+2))!=-(sInt8)(vardefP->fIdx)-1) SYSYNC_THROW(TScriptErrorException(DEBUGTEXT("Rebuilding defs gives different index","scri1"),line)); } #endif // - check what follows deftype=false; // default to nothing refdecl=false; if (funcparams) { if (*np==TK_LIST_SEPARATOR) gettoken(); // ok, next param } else { if (*np==TK_LIST_SEPARATOR) { deftype=true; // continue with more definitions of same type gettoken(); // consume separator } else if (*np!=TK_END_STATEMENT) SYSYNC_THROW(TScriptErrorException("Missing ';' after declaration of '%s'",line,ident.c_str())); } } else if (!aRebuild) { // refer to identifier sInt16 i=getIdentifierIndex(objidx,aFieldListConfigP,ident.c_str(),ident.size()); if (i==VARIDX_UNDEFINED) SYSYNC_THROW(TScriptErrorException("Undefined identifier '%s'",line,ident.c_str())); // save field/var index in script aTScript[p-bp+2]= (sInt8)i; } } else { // Other non-declaration tokens // - if this is function param def, no other tokens are allowed if (funcparams) { SYSYNC_THROW(TScriptErrorException("Invalid function parameter declaration",line)); } else { // non-declaration stuff if (tk==TK_USERFUNCTION && !aRebuild) { // resolve function ident.assign((cAppCharP)(p+3),(size_t)(*(p+1)-1)); sInt16 i=getSyncAppBase()->getRootConfig()->fScriptConfigP->getFunctionIndex(ident.c_str(),ident.size()); if (i==VARIDX_UNDEFINED) SYSYNC_THROW(TScriptErrorException("Undefined function '%s'",line,ident.c_str())); // save function index in script aTScript[p-bp+2]= (sInt8)i; } } } objidx=OBJ_AUTO; // default to auto-select // process next } SHOWVARDEFS(aRebuild ? "Rebuilding" : "Resolving"); } // TScriptContext::ResolveIdentifiers // create local variable definitions for calling a built-in function // This is called for built-in functions before calling PrepareLocals, and // builds up local var definitions like ResolveIdentifiers does for // script code. void TScriptContext::defineBuiltInVars(const TBuiltInFuncDef *aFuncDefP) { // get information and save it in the function's context fNumParams=aFuncDefP->fNumParams; fFuncType=aFuncDefP->fReturntype; // get params sInt16 i=0; while (ifParamTypes[i]; TItemFieldTypes ty= (TItemFieldTypes)(paramdef & PARAM_TYPEMASK); bool isref = paramdef & PARAM_REF; bool isarr = paramdef & PARAM_ARR; bool isopt = paramdef & PARAM_OPT; TScriptVarDef *vardefP = new TScriptVarDef("", fVarDefs.size(), ty, isarr, isref, isopt); fVarDefs.push_back(vardefP); i++; } } // TScriptContext::defineBuiltInVars // execute built-in function void TScriptContext::executeBuiltIn(TItemField *&aTermP, const TBuiltInFuncDef *aFuncDefP) { TItemField *resultP=NULL; // pre-create result field if type is known // Note: multi-typed functions might create result themselves depending on result type if (fFuncType!=fty_none) resultP = newItemField(fFuncType, getSessionZones()); // call actual function routine (aFuncDefP->fFuncProc)(resultP,this); // return result if (aTermP) { // copy value to exiting result field if (resultP) { (*aTermP)=(*resultP); delete resultP; } else aTermP=NULL; // no result } else { // just pass back result field (or NULL) aTermP=resultP; } } // TScriptContext::executeBuiltIn #if SYDEBUG>1 void TScriptContext::showVarDefs(cAppCharP aTxt) { if (DEBUGTEST(DBG_SCRIPTS+DBG_EXOTIC)) { // Show var defs DEBUGPRINTFX(DBG_SCRIPTS+DBG_EXOTIC+DBG_HOT,("%s - %s, ctx=0x%lX, VarDefs:",aTxt,scriptname ? scriptname : "",(long)this)); TVarDefs::iterator pos; for (pos=fVarDefs.begin(); pos!=fVarDefs.end(); pos++) { DEBUGPRINTFX(DBG_SCRIPTS+DBG_EXOTIC,( "%d: %s %s%s%s", (*pos)->fIdx, ItemFieldTypeNames[(*pos)->fVarType], (*pos)->fIsRef ? "&" : "", (*pos)->fVarName.c_str(), (*pos)->fIsArray ? "[]" : "" )); } } } // TScriptContext::showVarDefs #endif // Prepare local variables (create local fields), according to definitions (re-)built with ResolveIdentifiers() // Note: This is called after ResolveIdentifiers() for each script of that context // have been called. Normally ResolveIdentifiers() was called already at config parse // with an anonymous context that is lost when PrepareLocals needs to be called. // Therefore, ResolveIdentifiers(aRebuild=true) can be called to rebuild the definitions from // the script(s) involved. Care must be taken to call ResolveIdentifiers() for each script // in the same order as at config parse to make sure already resolved indexes will match the variables (again). // Note: Field references will have a NULL pointer (which must be filled when the function is // called. bool TScriptContext::PrepareLocals(void) { // make sure old array is cleared SHOWVARDEFS("PrepareLocals"); clearFields(); // create array of appropriate size for locals fNumVars=fVarDefs.size(); SYSYNC_TRY { if (fNumVars) { fFieldsP=new TItemFieldP[fNumVars]; if (fFieldsP==NULL) return false; // - init it with null pointers to make sure we can survive when field instantiation fails for (sInt16 i=0; ifIsRef && ((*pos)->fVarType!=fty_none)) { // this is not a reference and not an untyped parameter: // instantiate a locally owned field fFieldsP[(*pos)->fIdx]=sysync::newItemField((*pos)->fVarType,getSessionZones(),(*pos)->fIsArray); } } } } SYSYNC_CATCH (...) // failed, remove fields again clearFields(); return false; SYSYNC_ENDCATCH return true; } // TScriptContext::PrepareLocals // execute a script returning a boolean bool TScriptContext::executeTest( bool aDefaultAnswer, // result if no script is there or script returns no value TScriptContext *aCtxP, const string &aTScript, const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions and chain function TMultiFieldItem *aTargetItemP, // target (or "loosing") item bool aTargetWritable, // if set, target item may be modified TMultiFieldItem *aReferenceItemP, // reference for source (or "old" or "winning") item bool aRefWritable // if set, reference item may also be written ) { // if no script (no context), return default answer if (!aCtxP) return aDefaultAnswer; // now call and evaluate boolean result TItemField *resP; bool res; res=aCtxP->ExecuteScript( aTScript, &resP, // we want a result false, // not a function aFuncTableP, // context function table aCallerContext, // context data aTargetItemP, // target (or "loosing") item aTargetWritable, // if set, target item may be modified aReferenceItemP, // reference for source (or "old" or "winning") item aRefWritable // if set, reference item may also be written ); if (!res) { // script execution failed, do as if there was no script res=aDefaultAnswer; } else { // evaluate result if (resP) { res=resP->getAsBoolean(); // get rid of result delete resP; } else { // no result, return default res=aDefaultAnswer; } } // return result return res; } // TScriptContext::executeTest // execute a script returning a result if there is a context for it bool TScriptContext::executeWithResult( TItemField *&aResultField, // can be default result or NULL, will contain result or NULL if no result TScriptContext *aCtxP, const string &aTScript, const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP, // target (or "loosing") item bool aTargetWritable, // if set, target item may be modified TMultiFieldItem *aReferenceItemP, // reference for source (or "old" or "winning") item bool aRefWritable, // if set, reference item may also be written bool aNoDebug // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ) { // if no script (no context), return default answer if (!aCtxP) return true; // ok, leave aResultFieldP unmodified // now call and evaluate result return aCtxP->ExecuteScript( aTScript, &aResultField, // we want a result, if we pass a default it will be modified if script has a result false, // not a function aFuncTableP, // context function table aCallerContext, // context data aTargetItemP, // target (or "loosing") item aTargetWritable, // if set, target item may be modified aReferenceItemP, // reference for source (or "old" or "winning") item aRefWritable, // if set, reference item may also be written aNoDebug // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ); } // TScriptContext::executeTest // execute a script if there is a context for it bool TScriptContext::execute( TScriptContext *aCtxP, const string &aTScript, const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP, // target (or "loosing") item bool aTargetWritable, // if set, target item may be modified TMultiFieldItem *aReferenceItemP, // reference for source (or "old" or "winning") item bool aRefWritable, // if set, reference item may also be written bool aNoDebug // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ) { if (!aCtxP) return true; // no script, success // execute script in given context SYSYNC_TRY { bool r=aCtxP->ExecuteScript( aTScript, NULL, // we don't need a result false, // not a function aFuncTableP, // context specific function table aCallerContext, // caller's context private data pointer aTargetItemP, // target (or "loosing") item aTargetWritable, // if set, target item may be modified aReferenceItemP, // reference for source (or "old" or "winning") item aRefWritable, // if set, reference item may also be written aNoDebug // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ); return r; } SYSYNC_CATCH (...) SYSYNC_RETHROW; SYSYNC_ENDCATCH } // TScriptContext::execute void TScriptContext::pushState(TScriptState aNewState, cUInt8P aBegin, uInt16 aLine) { if (fStackEntries>=maxstackentries) SYSYNC_THROW(TScriptErrorException("too many IF/ELSE/WHILE/LOOP nested",line)); // use defaults if (aBegin==NULL) { aBegin = np; // next token after current token aLine = nextline; } // push current state fScriptstack[fStackEntries].state=aNewState; // new state fScriptstack[fStackEntries].begin=aBegin; // start of block fScriptstack[fStackEntries].line=aLine; // line where block starts fStackEntries++; } // TScriptContext::pushState // pop state from flow control state stack void TScriptContext::popState(TScriptState aCurrentStateExpected) { if (fScriptstack[fStackEntries-1].state!=aCurrentStateExpected) SYSYNC_THROW(TScriptErrorException("bad block/IF/ELSE/WHILE/LOOP nesting",line)); // remove entry fStackEntries--; // remove stack entry if (fStackEntries<1) SYSYNC_THROW(TScriptErrorException(DEBUGTEXT("unbalanced control flow stack pop","scri3"),line)); } // TScriptContext::popState // get variable specification, returns true if writable bool TScriptContext::getVarField(TItemField *&aItemFieldP) { sInt16 objnum, varidx, arridx; TMultiFieldItem *itemP=NULL; bool writeable=false; bool fidoffs=false; uInt8 tk; aItemFieldP=NULL; // none by default tk=gettoken(); objnum=OBJ_AUTO; // default to automatic object selection // check for object specifier if (tk==TK_OBJECT) { // object qualifier objnum=*(p+2); tk=gettoken(); // must be followed by identifier if (tk!=TK_IDENTIFIER) SYSYNC_THROW(TScriptErrorException("bad variable/field reference",line)); } // check for object itself if (tk==TK_IDENTIFIER) { #ifdef SYDEBUG cAppCharP idnam=(cAppCharP)(p+3); int idlen=*(p+1)-1; #endif // get index varidx=(sInt8)(*(p+2)); if (varidx==VARIDX_UNDEFINED) SYSYNC_THROW(TScriptErrorException("Undefined identifier",line)); // check possible array index arridx=-1; // default to non-array if (*np==TK_OPEN_ARRAY) { tk=gettoken(); // consume open bracket // check special field-offset access mode if (*np==TK_PLUS) { fidoffs=true; gettoken(); // consume the plus } TItemField *fldP = new TIntegerField; SYSYNC_TRY { evalExpression(fldP,EXPRDBGTEST,NULL); // do not show array index expression evaluation arridx=fldP->getAsInteger(); delete fldP; } SYSYNC_CATCH (...) delete fldP; SYSYNC_RETHROW; SYSYNC_ENDCATCH // check closing array bracket tk=gettoken(); if (tk!=TK_CLOSE_ARRAY) SYSYNC_THROW(TScriptErrorException("missing ']' for array reference",line)); } // now access field #ifdef SYDEBUG sInt16 oai=arridx; #endif // - determine object if not explicitly specified if (objnum==OBJ_AUTO) { if (varidx<0) objnum=OBJ_LOCAL; else objnum=OBJ_TARGET; } // - now access (arridx==-1 if we don't want to access leaf element) if (objnum==OBJ_LOCAL) { if (fidoffs) { varidx-=arridx; arridx=-1; } // use array index as offset within local fields (negative indices!) aItemFieldP=getFieldOrVar(NULL,varidx,arridx); writeable=true; // locals are always writeable } else { // prepare index/arrayindex to access if (fidoffs) { varidx+=arridx; arridx=-1; } // use array index as offset within field list // get item to access if (objnum==OBJ_TARGET) { itemP=fTargetItemP; writeable=fTargetWritable; } else if (objnum==OBJ_REFERENCE) { itemP=fReferenceItemP; writeable=fRefWritable; } if (itemP) aItemFieldP=getFieldOrVar(itemP,varidx,arridx); else SYSYNC_THROW(TScriptErrorException("field not accessible in this context",line)); } // error if no field DBGSTRINGDEF(s); DBGSTRINGDEF(sa); DBGVALUESHOW(s,aItemFieldP); if (EXPRDBGTEST) { if (oai>=0) { if (arridx!=-1) StringObjPrintf(sa,"[%hd]",oai); else StringObjPrintf(sa,"[+%hd]",oai); } else { // no array access sa.erase(); } SCRIPTDBGMSG(( "- %s: %.*s%s = %s", objnum==OBJ_LOCAL ? "Local Variable" : (objnum==OBJ_REFERENCE ? "OLD/LOOSING Field " : "Field"), idlen,idnam, sa.c_str(), s.c_str() )); } if (!aItemFieldP) SYSYNC_THROW(TScriptErrorException("undefined identifier, bad array index or offset",line)); // return field pointer we've found, if any return writeable; } else SYSYNC_THROW(TScriptErrorException("expected identifier",line)); } // TScriptContext::getVarField // evaluate function parameters void TScriptContext::evalParams(TScriptContext *aFuncContextP) { uInt8 tk; sInt16 paramidx; TScriptVarDef *vardefP; TItemField *fldP; tk=gettoken(); if (tk!=TK_OPEN_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("missing '(' of function parameter list",line)); paramidx=0; // special check for function with only optional params if (aFuncContextP->getNumParams()>0 && aFuncContextP->getVarDef((short)0)->fIsOpt) { if (*np==TK_CLOSE_PARANTHESIS) goto noparams; // first is optional already -> ok to see closing paranthesis here } // at least one param while(paramidxgetNumParams()) { vardefP=aFuncContextP->getVarDef(paramidx); // check what param is expected next if (vardefP->fIsRef) { // by reference, we must have a writable lvalue here fldP=NULL; if (*np==TK_IDENTIFIER || *np==TK_OBJECT) { // get writable field/var of caller if (!getVarField(fldP)) SYSYNC_THROW(TScriptErrorException("expected writable by-reference parameter",line)); // type must match (or destination must be untyped) if (vardefP->fVarType!=fldP->getType() && vardefP->fVarType!=fty_none) SYSYNC_THROW(TScriptErrorException("expected by-reference parameter of type '%s'",line,ItemFieldTypeNames[vardefP->fVarType])); // type must match (or destination must be untyped) if (vardefP->fIsArray && !(fldP->isArray())) SYSYNC_THROW(TScriptErrorException("expected array as by-reference parameter",line)); // assign field to function context's local var list aFuncContextP->setLocalVar(paramidx,fldP); } else SYSYNC_THROW(TScriptErrorException("expected by-reference parameter",line)); } else { // by value // - get field where to assign value if (vardefP->fVarType!=fty_none) { // already prepared typed parameter fldP=aFuncContextP->getLocalVar(paramidx); // - evaluate expression into local var evalExpression(fldP,EXPRDBGTEST); // do not show expression, as we will show param } else { // untyped param, let evaluation create correct type fldP=NULL; evalExpression(fldP,EXPRDBGTEST); // do not show expression, as we will show param // untyped params are not yet instantiated, assign expression result now aFuncContextP->setLocalVar(paramidx,fldP); } } DBGSTRINGDEF(s); DBGVALUESHOW(s,fldP); SCRIPTDBGMSG(( "- Parameter #%d (by %s) = %s", paramidx+1, vardefP->fIsRef ? "reference" : "value", s.c_str() )); // got param paramidx++; // check parameter delimiters if (paramidxgetNumParams()) { // function potentially has more params tk=gettoken(); if (tk!=TK_LIST_SEPARATOR) { // - check if next is an optional parameter if (aFuncContextP->getVarDef(paramidx)->fIsOpt) goto endofparams; // yes, optional -> check for end of parameter list else SYSYNC_THROW(TScriptErrorException("expected ',' (more parameters)",line)); // non-optional parameter missing } } } // check end of parameter list noparams: tk=gettoken(); endofparams: if (tk!=TK_CLOSE_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("missing ')' of function parameter list",line)); } // TScriptContext::evalParams // evaluate term, return caller-owned field containing term data TItemField *TScriptContext::evalTerm(TItemFieldTypes aResultType) { TItemFieldTypes termtype=aResultType; // default to result type TItemField *termP=NULL; uInt8 tk; TScriptContext *funccontextP; string *funcscript; const char *funcname; uInt16 funcnamelen; // Evaluate term. A term is // - a subexpression in paranthesis // - a variable reference // - a builtin function call // - a user defined function call // - a literal, including the special EMPTY and UNASSIGNED ones // A term can be preceeded by a typecast do { tk=gettoken(); if (tk==TK_OPEN_PARANTHESIS) { // typecast or subexpression if (*np==TK_TYPEDEF) { // this is a typecast gettoken(); // actually get type termtype=(TItemFieldTypes)(*(p+2)); // set new term target type if (gettoken()!=TK_CLOSE_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("missing ')' after typecast",line)); if (aResultType!=fty_none && aResultType!=termtype) SYSYNC_THROW(TScriptErrorException("invalid typecast",line)); continue; // now get term } else { // process subexpression into term if (termtype!=fty_none) { // prepare distinct result type field termP=newItemField(termtype, getSessionZones()); } // puts result in a caller-owned termP (creates new one ONLY if caller passes NULL) evalExpression(termP,EXPRDBGTEST); // do not show subexpression results if (gettoken()!=TK_CLOSE_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("missing ')' after expression",line)); } } else if (tk==TK_FUNCTION || tk==TK_CONTEXTFUNCTION) { // get function definition table reference const TFuncTable *functableP = (tk==TK_FUNCTION) ? &BuiltInFuncTable : // globally available functions fFuncTableP; // context specific functions // get the function index sInt16 funcid=*(p+2); // now find the function definition record in the chain of function tables void *callerContext = fCallerContext; // start with caller context of current script while(functableP && funcid>=functableP->numFuncs) { // function is in a chained table // - adjust id to get offset based on next table funcid-=functableP->numFuncs; // - get next table and next caller context if (functableP->chainFunc) functableP = (TFuncTable *)functableP->chainFunc(callerContext); else functableP = NULL; } if (!functableP) SYSYNC_THROW(TScriptErrorException("undefined context function",line)); // found function table and caller context, now get funcdef const TBuiltInFuncDef *funcdefP = &(functableP->funcDefs[funcid]); // execute built-in function call funcname=funcdefP->fFuncName; funcnamelen=100; // enough SCRIPTDBGMSG(("- %s() built-in function call:",funcname)); // - get context for built-in function funccontextP=new TScriptContext(fAppBaseP,fSessionP); SYSYNC_TRY { // define built-in parameters of function context funccontextP->defineBuiltInVars(funcdefP); // prepare local variables of function context funccontextP->PrepareLocals(); // prepare parameters evalParams(funccontextP); // copy current line for reference (as builtins have no own line number funccontextP->line=line; // copy caller's context pointer (possibly modified by function table chaining) funccontextP->fCallerContext=callerContext; funccontextP->fParentContextP=this; // link to calling script context // copy target and reference item vars funccontextP->fTargetItemP = fTargetItemP; funccontextP->fTargetWritable = fTargetWritable; funccontextP->fReferenceItemP = fReferenceItemP; funccontextP->fRefWritable = fRefWritable; // execute function funccontextP->executeBuiltIn(termP,funcdefP); // show by-ref parameters after call if (SCRIPTDBGTEST) { // show by-ref variables for (uInt16 i=0; ifNumParams; i++) { if (funcdefP->fParamTypes[i] & PARAM_REF) { // is a parameter passed by reference, possibly changed by function call DBGSTRINGDEF(s); DBGVALUESHOW(s,funccontextP->getLocalVar(i)); SCRIPTDBGMSG(( "- return value of by-ref parameter #%d = %s", i+1, s.c_str() )); } } } // done delete funccontextP; } SYSYNC_CATCH (...) if (funccontextP) delete funccontextP; SYSYNC_RETHROW; SYSYNC_ENDCATCH goto funcresult; } else if (tk==TK_USERFUNCTION) { // user defined function call funcname=(const char *)p+3; funcnamelen=*(p+1)-1; SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- User-defined function %.*s call:",funcnamelen,funcname)); // - get function text funcscript=getSyncAppBase()->getRootConfig()->fScriptConfigP->getFunctionScript(*(p+2)); if (!funcscript) SYSYNC_THROW(TSyncException(DEBUGTEXT("invalid user function index","scri7"))); // %%% possibly add caching of function contexts here. // Now we rebuild a context for every function call. Not extremely efficient... funccontextP=NULL; rebuildContext(fAppBaseP,*funcscript,funccontextP,fSessionP,true); if (!funccontextP) SYSYNC_THROW(TSyncException(DEBUGTEXT("no context for user-defined function call","scri5"))); SYSYNC_TRY { // prepare parameters evalParams(funccontextP); // pass parent context funccontextP->fParentContextP=this; // link to calling script context // process sub-script into term if (termtype!=fty_none) termP=newItemField(termtype, getSessionZones()); // we want a specific type, pre-define the field // execute function if (!funccontextP->ExecuteScript( *funcscript, &termP, // receives result, if any true, // is a function NULL, NULL, // no context functions/datapointer NULL, false, // no target fields NULL, false // no reference fields )) { SCRIPTDBGMSG(("- User-defined function failed to execute")); SYSYNC_THROW(TSyncException("User-defined function failed to execute properly")); } // done if (funccontextP) delete funccontextP; } SYSYNC_CATCH (...) if (funccontextP) delete funccontextP; SYSYNC_RETHROW; SYSYNC_ENDCATCH funcresult: DBGSTRINGDEF(s); DBGVALUESHOW(s,termP); SCRIPTDBGMSG(( "- %.*s() function result = %s", funcnamelen,funcname, s.c_str() )); } else if (tk==TK_EMPTY) { termP=newItemField(fty_none, getSessionZones()); termP->assignEmpty(); // make it EMPTY (that is, assigned) //SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Literal: EMPTY")); } else if (tk==TK_UNASSIGNED) { termP=newItemField(fty_none, getSessionZones()); termP->unAssign(); // make it (already is...) unassigned //SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Literal: UNASSIGNED")); } else if (tk==TK_TRUE || tk==TK_FALSE) { termP=newItemField(fty_integer, getSessionZones()); termP->setAsInteger(tk==TK_TRUE ? 1 : 0); // set 0 or 1 //SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Literal BOOLEAN: %d",tk==TK_TRUE ? 1 : 0)); } else if (tk==TK_NUMERIC_LITERAL) { // %%% possibly add fty_float later // set type to integer if not another type requested //SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Literal number: %0.*s",*(p+1),p+2)); if (termtype==fty_none) termtype=fty_integer; goto literalterm; } else if (tk==TK_STRING_LITERAL) { if (termtype==fty_none) termtype=fty_string; //SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Literal string: \"%0.*s\"",*(p+1),p+2)); literalterm: termP = newItemField(termtype, getSessionZones()); termP->setAsString((cAppCharP)(p+2),*(p+1)); } else { // must be identifier reusetoken(); TItemField *varP=NULL; getVarField(varP); // copy and convert if (termtype==fty_none) termtype=varP->getType(); termP=newItemField(termtype, getSessionZones()); (*termP)=(*varP); // simply assign (automatically converts if needed) } break; } while(true); // repeat only for typecast return termP; // return caller-owned field } // TScriptContext::evalTerm // evaluate expression, creates new or fills passed caller-owned field with result void TScriptContext::evalExpression( TItemField *&aResultFieldP, // result (created new if passed NULL, modified and casted if passed a field) bool aShowResult, // if set, this is the main expression (and we want to see the result in DBG) TItemField *aLeftTermP, // if not NULL, chain-evaluate rest of expression according to aBinaryOp and aPreviousOp. WILL BE CONSUMED uInt8 *aBinaryOpP, // operator to be applied between term passed in aLeftTermP and next term, will receive next operator that has same or lower precedence than aPreviousOp uInt8 aPreviousOp // if an operator of same or lower precedence than this is found, expression evaluation ends ) { TItemFieldTypes termtype; // type of term TItemField *termP; // next term TItemField *resultP; // intermediate result string s; // temp string bool retainType=false; uInt8 unaryop,binaryop,nextbinaryop; fieldinteger_t a,b; // defaults binaryop=0; // none by default if (aBinaryOpP) binaryop=*aBinaryOpP; // get one if one was passed termtype=fty_none; // first term can be anything // init first term/operation if there is one if (binaryop && !aLeftTermP) binaryop=0; // security // process expression #ifdef SYDEBUG // - determine if subexpression if (!binaryop) { // starting new evaluation SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Starting expression evaluation")); } #endif SYSYNC_TRY { // Note: if binaryop!=0, we have a valid aLeftTermP do { resultP=NULL; termP=NULL; // Get next term unaryop=0; // default to none // - check for unaries if (*np==TK_BITWISENOT || *np==TK_LOGICALNOT || *np==TK_MINUS) { unaryop=gettoken(); // evaluate to integer, as unary ops all only make sense with integers termtype=fty_integer; } // - get next term termP=evalTerm(termtype); // Apply unaries now if (unaryop) { // all unaries are integer ops if (termP->getCalcType()!=fty_integer) SYSYNC_THROW(TScriptErrorException("unary operator applied to non-integer",line)); fieldinteger_t ival = termP->getAsInteger(); // apply op switch (unaryop) { case TK_MINUS: ival=-ival; break; case TK_BITWISENOT: ival= ~ival; break; case TK_LOGICALNOT: ival= !termP->getAsBoolean(); break; } // store back into term field termP->setAsInteger(ival); } // now we have a new term in termP (or NULL if term had no result) // - check for a next operator nextbinaryop=0; if (*np>=TK_BINOP_MIN && *np <=TK_BINOP_MAX) { // this is a binary operator nextbinaryop=gettoken(); } // - check for non-existing term if (!termP && (binaryop || nextbinaryop)) SYSYNC_THROW(TScriptErrorException("non-value cannot be used in expression",line)); // - check if there is a previous operation pending if (binaryop) { fieldinteger_t intres; // There is an operation to perform between aLeftTermP and current term (or expression with // higher precedence) // - get precedences (make them minus to have lowerpreccurrentprec) { // next operator has higher precedence, evaluate everything up to next operator with same or // lower precedence as current one BEFORE applying binaryop evalExpression( resultP, // we'll receive the result here EXPRDBGTEST, // do not normally show subexpression results termP, // left term of new expression, WILL BE CONSUMED &nextbinaryop, // operator, will be updated to receive next operator to apply binaryop // evaluation stops when expression reaches operator with same or lower precedence ); // nextbinaryop now has next operation to perform AFTER doing binaryop termP=resultP; // original termP has been consumed, use result as new termP resultP=NULL; } // Now we can apply binaryop between lasttermP and termP // Note: this must CONSUME termP AND aLeftTermP and CREATE resultP // - check for operators that work with multiple types if (binaryop==TK_PLUS) { if (aLeftTermP->getCalcType()!=fty_integer) { // treat plus as general append (defaults to string append for non-arrays) aLeftTermP->append(*termP); resultP=aLeftTermP; // we can simply pass the pointer aLeftTermP=NULL; // consume goto opdone; // operation done, get rid of termP } } else if (binaryop>=TK_LESSTHAN && binaryop<=TK_NOTEQUAL) { // comparison operators sInt16 cmpres=-3; // will never happen bool neg=false; switch (binaryop) { // - comparison case TK_LESSTHAN : cmpres=-1; break; case TK_GREATERTHAN : cmpres=1; break; case TK_LESSEQUAL : cmpres=1; neg=true; break; case TK_GREATEREQUAL : cmpres=-1; neg=true; break; // - equality case TK_EQUAL : cmpres=0; break; case TK_NOTEQUAL : cmpres=0; neg=true; break; } // do comparison if (termP->getType()==fty_none) { // EMPTY or UNASSIGNED comparison if (termP->isUnassigned()) { intres = aLeftTermP->isUnassigned() ? 0 : 1; // if left is assigned, it is greater } else { intres = aLeftTermP->isEmpty() ? 0 : 1; // if left is not empty, it is greater } } else { // normal comparison intres=aLeftTermP->compareWith(*termP); } if (intres==SYSYNC_NOT_COMPARABLE) intres=0; // false else { intres=cmpres==intres; if (neg) intres=!intres; } retainType= aLeftTermP->getType()==fty_integer;; // comparisons must always have plain integer result goto intresult; } // - integer operators a=aLeftTermP->getAsInteger(); b=termP->getAsInteger(); // for integer math operators, retain type of left term if it can calculate as integer // (such that expressions like: "timestamp + integer" will have a result type of timestamp) retainType = aLeftTermP->getCalcType()==fty_integer; // now perform integer operation switch (binaryop) { // - multiply, divide case TK_MULTIPLY : intres=a*b; break; case TK_DIVIDE : intres=a/b; break; case TK_MODULUS : intres=a%b; break; // - add, subtract case TK_PLUS : intres=a+b; break; case TK_MINUS : intres=a-b; break; // - shift case TK_SHIFTLEFT : intres=a<>b; break; // - bitwise AND case TK_BITWISEAND : intres=a&b; break; // - bitwise XOR case TK_BITWISEXOR : intres=a^b; break; // - bitwise OR case TK_BITWISEOR : intres=a|b; break; // - logical AND case TK_LOGICALAND : intres=a&&b; break; // - logical OR case TK_LOGICALOR : intres=a||b; break; default: SYSYNC_THROW(TScriptErrorException("operator not implemented",line)); } intresult: // save integer result (optimized, generate new field only if aLeftTermP is not already integer-calc-type) if (retainType) resultP=aLeftTermP; // retain original left-side type (including extra information like time zone context and rendering type) else { // create new integer field resultP = newItemField(fty_integer, getSessionZones()); delete aLeftTermP; } aLeftTermP=NULL; resultP->setAsInteger(intres); opdone: // check for special conditions when operating on timestamps if (resultP->isBasedOn(fty_timestamp) && termP->isBasedOn(fty_timestamp)) { // both based on timestamp. if (binaryop==TK_MINUS && !static_cast(resultP)->isDuration() && !static_cast(termP)->isDuration()) { // subtracted two points in time -> result is duration static_cast(resultP)->makeDuration(); } } // get rid of termP delete termP; termP=NULL; } // if binary op was pending else { // no binary op pending, simply pass term as result resultP=termP; termP=NULL; } // Now termP and aLeftTermP are consumed, resultP is alive // - determine next operation if (nextbinaryop) { // check precedence, if we can pass back to previous sInt8 lastprec=-(aPreviousOp & TK_OP_PRECEDENCE_MASK); sInt8 thisprec=-(nextbinaryop & TK_OP_PRECEDENCE_MASK); if (aPreviousOp && thisprec<=lastprec) break; // force exit, resultP is assigned } // result is going to be left term for next operation aLeftTermP=resultP; binaryop=nextbinaryop; } while(nextbinaryop); // as long as expression continues // show result #ifdef SYDEBUG // show final result of main expression only if (!nextbinaryop && aShowResult) { DBGVALUESHOW(s,resultP); SCRIPTDBGMSG(( "- Expression result: %s", s.c_str() )); } #endif // convert result to desired type if (!aResultFieldP) { // no return field passed, just pass pointer (and ownership) of our resultP aResultFieldP=resultP; } else { // return field already exists, assign value (will convert type if needed) if (resultP) { (*aResultFieldP)=(*resultP); delete resultP; // not passed to caller, so we must get rid of it } else { // no result, unAssign aResultFieldP->unAssign(); } } // return nextbinaryop if requested if (aBinaryOpP) *aBinaryOpP=nextbinaryop; // this is how we ended } SYSYNC_CATCH (...) // delete terms if (resultP) delete resultP; if (aLeftTermP) delete aLeftTermP; if (termP) delete termP; SYSYNC_RETHROW; SYSYNC_ENDCATCH } // TScriptContext:evalExpression // execute script // returns false if script execution was not successful bool TScriptContext::ExecuteScript( const string &aTScript, TItemField **aResultPP, // if not NULL, a result field will be returned here (must be deleted by caller) bool aAsFunction, // if set, this is a function call const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP, // target (or "loosing") item bool aTargetWritable, // if set, target item may be modified TMultiFieldItem *aReferenceItemP, // reference for source (or "old" or "winning") item bool aRefWritable, // if set, reference item may also be written bool aNoDebug // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ) { if (aResultPP) *aResultPP=NULL; // no result yet TItemField *resultP = NULL; // none yet uInt8 tk; // current token TScriptState sta; // status skipping=0; // skipping level bool funchdr=aAsFunction; // flag if processing function header first if (funchdr) skipping=1; // skip stuff // endless loop protection lineartime_t loopmaxtime=0; // not in a loop // save context parameters fTargetItemP=aTargetItemP; // target (or "loosing") item fTargetWritable=aTargetWritable; // if set, target item may be modified fReferenceItemP=aReferenceItemP; // reference for source (or "old" or "winning") item fRefWritable=aRefWritable; // if set, reference item may also be written fFuncTableP=aFuncTableP; // context's function table, NULL if none fCallerContext=aCallerContext; #ifdef SYDEBUG debugon = !aNoDebug; #endif // init parsing (for execute) initParse(aTScript,true); // test if there's something to execute at all if (ep>bp) { #ifdef SYDEBUG if (aAsFunction) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,("* Starting execution of user-defined function")); } else { SCRIPTDBGSTART(scriptname ? scriptname : ""); } #endif SYSYNC_TRY { // init state stack fStackEntries=0; // stack is empty pushState(ssta_statement); // start with statement // execute while ((tk=gettoken())) { resultP=NULL; // start of statement // - check for block if (tk==TK_BEGIN_BLOCK) { // push current state to stack and start new block pushState(ssta_block); if (funchdr) { // start of first block = start of function body, stop skipping funchdr=false; skipping=0; } continue; // process next } else if (tk==TK_END_BLOCK) { // pop block start, throw error if none there popState(ssta_block); // treat like end-of-statement, check for IF/ELSE/LOOP etc. goto endstatement; } else if (tk==TK_END_STATEMENT) { goto endstatement; } // - handle skipping of conditionally excluded blocks if (skipping!=0) { // only IF and ELSE are of any relevance if (tk==TK_IF) { pushState(ssta_if); // nested IF skipping++; // skip anyway } else if (tk==TK_ELSE) { // %%% this case probably never happens, as it is pre-fetched at end-of-statement // only push ELSE if this is not a chained ELSE IF if (*np!=TK_IF) pushState(ssta_else); // nested ELSE } // all others are irrelevant during skip continue; } else { // really executing // - check empty statement if (tk==TK_END_STATEMENT) goto endstatement; // - check IF statement else if (tk==TK_IF || tk==TK_WHILE) { // IF or WHILE conditional // - remember for WHILE case as condition must be re-evaluated for every loop cUInt8P condBeg = p; uInt16 condLine = line; // - process boolean expression tk=gettoken(); if (tk!=TK_OPEN_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("missing '(' after IF or WHILE",line)); SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- IF or WHILE, evaluating condition...")); evalExpression(resultP,EXPRDBGTEST); tk=gettoken(); if (tk!=TK_CLOSE_PARANTHESIS) SYSYNC_THROW(TScriptErrorException("missing ')' in IF or WHILE",line)); // - determine which branch to process if (!(resultP && resultP->getAsBoolean())) skipping=1; // enter skip level 1 SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC,("- %s condition is %s", *condBeg==TK_WHILE ? "WHILE" : "IF", skipping ? "false" : "true")); delete resultP; resultP=NULL; if (*condBeg==TK_WHILE) { if (skipping) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,("- WHILE condition is false -> skipping WHILE body")); } // for every subsequent loop, WHILE must be reprocessed pushState(ssta_while,condBeg,condLine); goto startloop; // limit loop execution time } else { // process statement (block) after IF pushState(ssta_if); } continue; } // Note: ELSE is checked at end of statement only // Check loop beginning else if (tk==TK_LOOP) { // initiate loop pushState(ssta_loop); SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC,("- LOOP entered")); startloop: // - remember entry time of outermost loop if (loopmaxtime==0) { uInt32 loopSecs = getSyncAppBase()->getRootConfig()->fScriptConfigP->fMaxLoopProcessingTime; if (loopSecs>0) { loopmaxtime= getSystemNowAs(TCTX_UTC, getSessionZones())+ secondToLinearTimeFactor * loopSecs; } else { loopmaxtime=maxLinearTime; // virtually unlimited time } } continue; } else if (tk==TK_CONTINUE || tk==TK_BREAK) { // see if there is a LOOP or WHILE on the stack bool inloop=false; bool inwhile=false; sInt16 sp=fStackEntries; while (sp>0) { sta = fScriptstack[sp-1].state; if (sta==ssta_loop) { inloop=true; break; } // we are in a LOOP if (sta==ssta_while) { inwhile=true; break; } // we are in a WHILE sp--; } // no loop found, error if (!inloop && !inwhile) SYSYNC_THROW(TScriptErrorException("BREAK or CONTINUE without enclosing LOOP or WHILE",line)); if (tk==TK_BREAK) { // make sure we are skipping everything (including any number of nested if/else // and blocks up to reaching next end-of-loop). Note that if a LOOP or WHILE is in the // skipped part, it will not cause troubles because it is not recognized as // such while skipping. skipping=maxstackentries; } else { // continue, remove stack entries down to LOOP or WHILE and jump to beginning of loop // - same as if we had reached the bottom of the loop, but pop // open blocks, if's and else's first // - sta is ssta_loop or ssta_while to decide if we must pop the status or not goto loopcontinue; } } else if (tk==TK_TYPEDEF) { // declaration, skip it do { if (*np!=TK_IDENTIFIER) SYSYNC_THROW(TScriptErrorException("Invalid declaration",line)); tk=gettoken(); // swallow identifier if (*np==TK_OPEN_ARRAY) { // must be array declaration tk=gettoken(); // swallow [ if (*np==TK_CLOSE_ARRAY) gettoken(); // swallow ] } if (*np!=TK_LIST_SEPARATOR) break; gettoken(); // swallow separator } while(true); // end of statement should follow here, will be checked below. } else if (tk==TK_IDENTIFIER || tk==TK_OBJECT) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Starting assignment/unstored expression")); // could be assignment if identifier is followed by TK_ASSIGN // otherwise, it could be a simple expression evaluation cUInt8P ts=p; // remember start of statement uInt16 tl=line; // remember line as well TItemField *fldP; reusetoken(); bool writeable=getVarField(fldP); // now check if this is an assignment if (*np==TK_ASSIGN) { gettoken(); // swallow TK_ASSIGN // must be writeable if (!writeable) SYSYNC_THROW(TScriptErrorException("Not allowed to assign to this field/variable",line)); // evaluate expression into given field evalExpression(fldP,false); // we show the result ourselves DBGSTRINGDEF(s); DBGVALUESHOW(s,fldP); SCRIPTDBGMSG(("- Assigned expression result = %s",s.c_str())); } else { // must be plain expression np=ts; // back to start of statement; nextline=tl; evalExpression(resultP,true); // we always want to see the result SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Evaluated unstored expression")); // - if nothing follows, script ends here with result of expression if (*np==0) break; // - otherwise, forget result delete resultP; resultP=NULL; } } else if (tk==TK_RETURN) { // simply return if no expression follows resultP=NULL; if (*np==TK_END_STATEMENT) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,("- RETURN: ending %s without result",aAsFunction ? "function" : "script")); break; } // evaluate expression first SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- RETURN: evaluating result expression...")); evalExpression(resultP,false); // we always show the result ourselves DBGSTRINGDEF(s); DBGVALUESHOW(s,resultP); SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,( "- RETURN: ending %s with result = %s", aAsFunction ? "function" : "script", s.c_str() )); // now end script break; } else { // everything else must be plain expression (e.g. function calls etc.) SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Starting evaluating unstored expression")); reusetoken(); evalExpression(resultP,false); // we always show the result ourselves SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC+DBG_SCRIPTEXPR,("- Evaluated unstored expression")); /* %%% wrong, prevents script from returning NOTHING! to return a value, RETURN *must* be used! // - if nothing follows, script ends here with result of expression if (*np==0) { DBGSTRINGDEF(s); DBGVALUESHOW(s,resultP); SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,( "- Script ends with result = %s", s.c_str() )); break; } */ // - otherwise, forget result delete resultP; resultP=NULL; } } // not skipping // Statement executed, next must be end-of-statement tk=gettoken(); if (tk!=TK_END_STATEMENT) SYSYNC_THROW(TScriptErrorException("missing ';' after statement",line)); // Statement executed and properly terminated endstatement: // check state sta=fScriptstack[fStackEntries-1].state; // check end of IF block if (sta==ssta_if) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC,("- End of %s IF",skipping ? "skipped" : "executed")); popState(sta); // end this state if (skipping) { // IF branch was not executed, check for else if (*np==TK_ELSE) { // else follows // - swallow TK_ELSE gettoken(); // - check for ELSE IF chain // (in this case, we must NOT push a state, but let chained IF push TK_IF again // and also increment skipping again, after it is decremented by one below) if (*np!=TK_IF) { pushState(ssta_else); // end-of-chain ELSE: enter else state // keep skipping (compensate for decrement below) ONLY if end-of-chain ELSE // is not to be executed due to surrounding skip. if (skipping>1) skipping++; } } // no ELSE, just continue with next statement skipping--; // reduce skip level continue; } else { // IF branch was executed, check for else if (*np==TK_ELSE) { // else follows, skip it (including all chained IFs) skipping=1; gettoken(); // swallow ELSE // - check for ELSE IF chain if (*np==TK_IF) { // chained if while skipping gettoken(); // consume it (avoid regular parsing to see it and increment skipping) pushState(ssta_chainif); // chained IF, make sure nothing is executed up to and including end-of-chain else } else pushState(ssta_else); // process as skipped ELSE part } // no else, simply continue execution continue; } } else if (sta==ssta_chainif) { // only entered while skipping rest of chain SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC,("- End of skipped ELSE IF")); if (*np==TK_ELSE) { gettoken(); // consume it if (*np==TK_IF) { // chained if while skipping gettoken(); // consume it (avoid regular parsing to see it and increment skipping) // stay in ssta_chainif } else { popState(ssta_chainif); // end of ELSE IF chain pushState(ssta_else); // rest is a normal skipped ELSE part } } else { // end of skipped chained ifs popState(ssta_chainif); skipping--; } } else if (sta==ssta_else) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC,("- End of %s ELSE",skipping ? "skipped" : "executed")); popState(ssta_else); // end of else state if (skipping) skipping--; } // check end of LOOP block else if (sta==ssta_loop || sta==ssta_while) { // Note: we'll never see that for a completely skipped loop/while, as // no ssta_loop/ssta_while is pushed while skipping. if (!skipping) goto loopcontinue; // not end of while or breaking out of loop, repeat // - end of loop reached popState(sta); skipping=0; // end of loop found after BREAK, continue normal execution SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_EXOTIC,("- End of WHILE or LOOP")); } // nothing special, just execute next statement continue; loopcontinue: // continue at beginning of loop which is at top of state stack if (getSystemNowAs(TCTX_UTC, getSessionZones())>loopmaxtime) SYSYNC_THROW(TScriptErrorException("loop execution aborted because reached (endless loop?)",line)); // go to beginning of loop: restore position of beginning of loop (including condition in case of WHILE) np=fScriptstack[fStackEntries-1].begin; // next token after current token nextline=fScriptstack[fStackEntries-1].line; // line of next token after current token linesource=NULL; // prevent showing source (which is that of NEXT line, not that of jump target's // for while, we must pop the stack entry as it will be recreated by re-excution of the WHILE statement if (sta==ssta_while) popState(sta); SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,("- Starting next iteration of LOOP/WHILE -> jumping to line %hd",nextline)); continue; } // while more tokens } // try SYSYNC_CATCH (exception &e) // make sure field is deleted if (resultP) delete resultP; // show error message SCRIPTDBGMSGX(DBG_ERROR,("Warning: TERMINATING SCRIPT WITH ERROR: %s",e.what())); if (!aAsFunction) SCRIPTDBGEND(); return false; SYSYNC_ENDCATCH #ifdef SYDEBUG if (aAsFunction) { SCRIPTDBGMSGX(DBG_SCRIPTS+DBG_HOT,("* Successfully finished execution of user-defined function")); } else { SCRIPTDBGEND(); } #endif } // if something to execute at all // return most recent evaluated expression (normally RETURN expression) if (aResultPP) { // caller wants to see result, pass it back if (*aResultPP && resultP) { // script result field already exists, assign value (**aResultPP)=(*resultP); delete resultP; } else { // script result field does not yet exist, just pass result (even if it is NULL) *aResultPP=resultP; } } else if (resultP) delete resultP; // nobody needs the result, delete it // execution successful return true; } // TScriptContext::ExecuteScript // get variable definition by name, NULL if none defined yet TScriptVarDef *TScriptContext::getVarDef(cAppCharP aVarName,size_t len) { TVarDefs::iterator pos; for (pos=fVarDefs.begin(); pos!=fVarDefs.end(); pos++) { if (strucmp((*pos)->fVarName.c_str(),aVarName,0,len)==0) return (*pos); } return NULL; } // TScriptContext::getVarDef // get variable definition by index, NULL if none defined yet TScriptVarDef *TScriptContext::getVarDef(sInt16 aLocalVarIdx) { if (aLocalVarIdx<0 || uInt32(aLocalVarIdx)>=fVarDefs.size()) return NULL; return fVarDefs[aLocalVarIdx]; } // TScriptContext::getVarDef // - get identifier index (>=0: field index, <0: local var) // returns VARIDX_UNDEFINED for unknown identifier sInt16 TScriptContext::getIdentifierIndex(sInt16 aObjIndex, TFieldListConfig *aFieldListConfigP, cAppCharP aIdentifier,size_t aLen) { // first look for local variable if (aObjIndex==OBJ_AUTO || aObjIndex==OBJ_LOCAL) { TScriptVarDef *vardefP = getVarDef(aIdentifier,aLen); if (vardefP) { return - (sInt16)vardefP->fIdx-1; } } if (aObjIndex==OBJ_AUTO || aObjIndex==OBJ_TARGET || aObjIndex==OBJ_REFERENCE) { // look for field with that name if (!aFieldListConfigP) return VARIDX_UNDEFINED; // no field list available here return aFieldListConfigP->fieldIndex(aIdentifier,aLen); } else return VARIDX_UNDEFINED; // unknown object, unknown index } // TScriptContext::getIdentifierIndex // get field by fid, can also be field of aItem, also resolves arrays TItemField *TScriptContext::getFieldOrVar(TMultiFieldItem *aItemP, sInt16 aFid, sInt16 aArrIdx) { TItemField *fldP = getFieldOrVar(aItemP,aFid); if (!fldP) return NULL; #ifdef ARRAYFIELD_SUPPORT if (aArrIdx>=0) return fldP->getArrayField(aArrIdx); else return fldP; // return field without array resolution #else if (aArrIdx>0) return NULL; return fldP; #endif } // TScriptContext::getFieldOrVar // get field by fid, can be field of aItem (positive aFid) or local variable (negative fid) TItemField *TScriptContext::getFieldOrVar(TMultiFieldItem *aItemP, sInt16 aFid) { if (aFid<0) return getLocalVar(-aFid-1); if (!aItemP) return NULL; return aItemP->getField(aFid); } // TScriptContext::getFieldOrVar // get local var by local index TItemField *TScriptContext::getLocalVar(sInt16 aVarIdx) { if (aVarIdx<0 || aVarIdx>=fNumVars) return NULL; return fFieldsP[aVarIdx]; } // TScriptContext::getLocalVar // set local var by local index (used for passing references) void TScriptContext::setLocalVar(sInt16 aVarIdx, TItemField *aFieldP) { if (aVarIdx<0 || aVarIdx>=fNumVars) return; fFieldsP[aVarIdx]=aFieldP; // set new } // TScriptContext::setLocalVar /* end of TScriptContext implementation */ #ifdef ENGINEINTERFACE_SUPPORT // TScriptVarKey // ============= // get FID for specified name sInt16 TScriptVarKey::getFidFor(cAppCharP aName, stringSize aNameSz) { if (fScriptContext==NULL) return VARIDX_UNDEFINED; // check for iterator commands first if (strucmp(aName,VALNAME_FIRST)==0) { fIterator=0; if (fIterator>=sInt32(fScriptContext->fVarDefs.size())) return VARIDX_UNDEFINED; return -fIterator-1; } else if (strucmp(aName,VALNAME_NEXT)==0) { fIterator++; if (fIterator>=sInt32(fScriptContext->fVarDefs.size())) return VARIDX_UNDEFINED; return -fIterator-1; } else return fScriptContext->getIdentifierIndex(OBJ_LOCAL, NULL, aName, aNameSz); } // TScriptVarKey::getFidFor // get base field from FID TItemField *TScriptVarKey::getBaseFieldFromFid(sInt16 aFid) { if (fScriptContext==NULL) return NULL; return fScriptContext->getFieldOrVar(NULL, aFid); } // TScriptVarKey::getBaseFieldFromFid // get field name from FID bool TScriptVarKey::getFieldNameFromFid(sInt16 aFid, string &aFieldName) { if (fScriptContext==NULL) return false; TScriptVarDef *vardefP = fScriptContext->getVarDef(-aFid-1); if (vardefP) { aFieldName = vardefP->fVarName; return true; } // none found return false; } // TScriptVarKey::getFieldNameFromFid #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync #endif // SCRIPT_SUPPORT // eof syncevolution-1.5/src/synthesis/src/sysync/scriptcontext.h0000755000373300037200000004206012424517753025734 0ustar00nightlyallusers00000000000000/* * File: scriptcontext.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TScriptContext * Environment to tokenize, prepare and run scripts * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-09-11 : luz : created * * */ #ifdef SCRIPT_SUPPORT #ifndef SCRIPT_CONTEXT_H #define SCRIPT_CONTEXT_H // includes #include "sysync.h" #include "itemfield.h" #include "multifielditem.h" using namespace sysync; namespace sysync { /* * builtin function definitions */ #define PARAM_TYPEMASK 0x1F #define PARAM_OPT 0x20 #define PARAM_REF 0x40 #define PARAM_ARR 0x80 #define VAL(x) ( (uInt8)x) #define OPTVAL(x) (((uInt8)x)+PARAM_OPT) #define REF(x) (((uInt8)x)+PARAM_REF) #define REFARR(x) (((uInt8)x)+PARAM_REF+PARAM_ARR) extern const uInt8 param_oneTimestamp[]; extern const uInt8 param_oneInteger[]; extern const uInt8 param_oneString[]; extern const uInt8 param_oneVariant[]; extern const uInt8 param_oneOptInteger[]; // Token definitions // - Multi-Byte tokens: // tldddddddddddddd // - t=token ID alphanum. // - l=length of additional token data, 0x00..0xFF as one char // - dddddd=additional token data // highest Multibyte token #define TK_MAX_MULTIBYTE 0x1F // - literals, dddd=literal string #define TK_NUMERIC_LITERAL 0x10 #define TK_STRING_LITERAL 0x11 // - variable identifiers, dddd = idddddd // where i=room for field index, dddd=identifier #define TK_IDENTIFIER 0x12 // - script line token, dd = line number 16bit, followed by source text (NUL terminated) if script debug on #define TK_SOURCELINE 0x13 // - object specifier, d=single object index byte #define TK_OBJECT 0x14 // - builtin function identifier, d=function index #define TK_FUNCTION 0x15 // - user defined function identifier, idddddd i=room for function index, ddd=function name #define TK_USERFUNCTION 0x16 // - built-in context-dependent function #define TK_CONTEXTFUNCTION 0x17 // - type definition, d=TItemFieldTypes enum #define TK_TYPEDEF 0x18 // object indices #define OBJ_AUTO 0 // not specified, is local or target field #define OBJ_LOCAL 1 // local variable #define OBJ_TARGET 2 // target field #define OBJ_REFERENCE 3 // reference field // - language elements, 0x80..0x9F #define TK_IF 0x80 #define TK_ELSE 0x81 #define TK_LOOP 0x82 #define TK_BREAK 0x83 #define TK_CONTINUE 0x84 #define TK_RETURN 0x85 #define TK_WHILE 0x86 // - constants #define TK_EMPTY 0x90 #define TK_UNASSIGNED 0x91 #define TK_TRUE 0x92 #define TK_FALSE 0x93 // - grouping, in the 0x20..0x3F area #define TK_DOMAINSEP '.' #define TK_OPEN_PARANTHESIS '(' #define TK_CLOSE_PARANTHESIS ')' #define TK_LIST_SEPARATOR ',' #define TK_BEGIN_BLOCK 0x30 #define TK_END_BLOCK 0x31 #define TK_END_STATEMENT ';' #define TK_OPEN_ARRAY 0x32 #define TK_CLOSE_ARRAY 0x33 // - operators, in the 0x40..0x7F range // in order of precedence (upper 6 bits = precedence) #define TK_OP_PRECEDENCE_MASK 0xFC #define TK_BINOP_MIN 0x44 #define TK_BINOP_MAX 0x68 // excluding assignment %%% // Pure unaries // - negation #define TK_BITWISENOT 0x40 #define TK_LOGICALNOT 0x41 // Binaries (some of them also used as unaries, like MINUS) // - multiply, divide #define TK_MULTIPLY 0x44 #define TK_DIVIDE 0x45 #define TK_MODULUS 0x46 // - add, subtract #define TK_PLUS 0x48 #define TK_MINUS 0x49 // - shift #define TK_SHIFTLEFT 0x4C #define TK_SHIFTRIGHT 0x4D // - comparison #define TK_LESSTHAN 0x50 #define TK_GREATERTHAN 0x51 #define TK_LESSEQUAL 0x52 #define TK_GREATEREQUAL 0x53 // - equality #define TK_EQUAL 0x54 #define TK_NOTEQUAL 0x55 // - bitwise AND #define TK_BITWISEAND 0x58 // - bitwise XOR #define TK_BITWISEXOR 0x5C // - bitwise OR #define TK_BITWISEOR 0x60 // - logical AND #define TK_LOGICALAND 0x64 // - logical OR #define TK_LOGICALOR 0x68 // Special modifying operator // - assignment #define TK_ASSIGN 0x6C // local script variable definition class TScriptVarDef { public: TScriptVarDef(cAppCharP aName,uInt16 aIdx, TItemFieldTypes aType, bool aIsArray, bool aIsRef, bool aIsOpt); ~TScriptVarDef(); uInt16 fIdx; // index (position in container). string fVarName; // Variable name TItemFieldTypes fVarType; // type of variable bool fIsArray; bool fIsRef; // set if this is a local reference to an existing variable bool fIsOpt; // set if this is a optional parameter }; // TScriptVarDef // script variables typedef std::vector TVarDefs; // user defined script function class TUserScriptFunction { public: string fFuncName; string fFuncDef; }; // TUserScriptFunction typedef std::vector TUserScriptList; // global script config (such as user-defined functions) class TScriptConfig : public TConfigElement { typedef TConfigElement inherited; public: TScriptConfig(TConfigElement *aParentElementP); virtual ~TScriptConfig(); // properties uInt32 fMaxLoopProcessingTime; // seconds // special scripts // user-defined functions TUserScriptList fFunctionScripts; // macros (pure texts used while parsing) TStringToStringMap fScriptMacros; // accessing user defined functions string *getFunctionScript(sInt16 aFuncIndex); sInt16 getFunctionIndex(cAppCharP aName, size_t aLen); virtual void clear(); void clearmacros() { fScriptMacros.clear(); }; // called when config is read, as then templates are no longer needed protected: // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); }; // TScriptConfig // script tokenizing error class TTokenizeException : public TConfigParseException { typedef TConfigParseException inherited; public: TTokenizeException(cAppCharP aScriptName, cAppCharP aMsg1,cAppCharP aScript, uInt16 aIndex, uInt16 aLine); }; // TTokenizeException // script resolving or execution error class TScriptErrorException : public TConfigParseException { typedef TConfigParseException inherited; public: TScriptErrorException(cAppCharP aMsg1, uInt16 aLine, cAppCharP aIdent=NULL); }; // TScriptErrorException // folder mapping table typedef std::vector TMacroArgsArray; // script execution state stack typedef enum { ssta_statement, ssta_block, ssta_if, ssta_else, ssta_chainif, ssta_loop, ssta_while, } TScriptState; typedef struct { TScriptState state; // state cUInt8P begin; // begin of that state in source uInt16 line; // line number } TScriptStackEntry; // flow control stack depth const sInt16 maxstackentries=40; class TMultiFieldItem; // script context class TScriptContext { friend class TScriptVarKey; public: TScriptContext(TSyncAppBase *aAppBaseP, TSyncSession *aSessionP); virtual ~TScriptContext(); // Tokenizing is available without context static void Tokenize(TSyncAppBase *aAppBaseP, cAppCharP aScriptName, sInt32 aLine, cAppCharP aScriptText, string &aTScript, const TFuncTable *aContextFuncs, bool aFuncHeader=false, bool aNoDeclarations=false, TMacroArgsArray *aMacroArgsP=NULL); static void TokenizeAndResolveFunction(TSyncAppBase *aAppBaseP, sInt32 aLine, cAppCharP aScriptText, TUserScriptFunction &aFuncDef); // resolve identifiers in a script, if there is a context passed at all static void resolveScript(TSyncAppBase *aAppBaseP, string &aTScript,TScriptContext *&aCtxP, TFieldListConfig *aFieldListConfigP); // rebuild a script context for a script, if the script is not empty // - Script must already be resolved with ResolveIdentifiers // - If context already exists, adds new locals to existing ones // - If aBuildVars is set, buildVars() will be called after rebuilding variable definitions static void rebuildContext(TSyncAppBase *aAppBaseP, string &aTScript,TScriptContext *&aCtxP, TSyncSession *aSessionP=NULL, bool aBuildVars=false); // - link a script into a contect with already instantiated variables. This is e.g. for activating remoterule scripts static void linkIntoContext(string &aTScript,TScriptContext *aCtxP, TSyncSession *aSessionP); // Build the local variables according to definitions (clears existing vars first) static void buildVars(TScriptContext *&aCtxP); // execute a script if there is a context for it bool static execute( TScriptContext *aCtxP, const string &aTScript, const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP=NULL, // target (or "loosing") item bool aTargetWritable=true, // if set, target item may be modified TMultiFieldItem *aReferenceItemP=NULL, // reference for source (or "old" or "winning") item bool aRefWritable=false, // if set, reference item may also be written bool aNoDebug=false // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ); // execute a script returning a boolean if there is a context for it bool static executeTest( bool aDefaultAnswer, // result if no script is there or script returns no value TScriptContext *aCtxP, const string &aTScript, const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP=NULL, // target (or "loosing") item bool aTargetWritable=true, // if set, target item may be modified TMultiFieldItem *aReferenceItemP=NULL, // reference for source (or "old" or "winning") item bool aRefWritable=false // if set, reference item may also be written ); // execute a script returning a result if there is a context for it bool static executeWithResult( TItemField *&aResultField, // can be default result or NULL, will contain result or NULL if no result TScriptContext *aCtxP, const string &aTScript, const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP, // target (or "loosing") item bool aTargetWritable, // if set, target item may be modified TMultiFieldItem *aReferenceItemP, // reference for source (or "old" or "winning") item bool aRefWritable, // if set, reference item may also be written bool aNoDebug=false // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ); // get info uInt16 getScriptLine(void) { return line; }; // get context pointers TSyncSession *getSession(void) { return fSessionP; }; TSyncAppBase *getSyncAppBase(void) { return fAppBaseP; }; GZones *getSessionZones(void); #ifdef SYDEBUG TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif // Reset context (clear all variables and definitions) void clear(void); // clear all fields (local variables), but not their definitions void clearFields(void); // Resolve local variable declarations, references and field references void ResolveIdentifiers( string &aTScript, TFieldListConfig *aFieldListConfigP, bool aRebuild=false, string *aFuncNameP=NULL, bool aNoNewLocals=false // if set, declaration of new locals will be suppressed ); // Prepare local variables (create local fields), according to definitions (re-)built with ResolveIdentifiers() bool PrepareLocals(void); // Execute script bool ExecuteScript( const string &aTScript, TItemField **aResultPP, // if not NULL, a result field will be returned here (must be deleted by caller) bool aAsFunction, // if set, this is a function call const TFuncTable *aFuncTableP, // context's function table, NULL if none void *aCallerContext, // free pointer possibly having a meaning for context functions TMultiFieldItem *aTargetItemP, // target (or "loosing") item bool aTargetWritable, // if set, target item may be modified TMultiFieldItem *aReferenceItemP, // reference for source (or "old" or "winning") item bool aRefWritable, // if set, reference item may also be written bool aNoDebug=false // if set, debug output is suppressed even if DBG_SCRIPTS is generally on ); // context variable access // - get variable definition, NULL if none defined yet TScriptVarDef *getVarDef(cAppCharP aVarName,size_t len=0); TScriptVarDef *getVarDef(sInt16 aLocalVarIdx); // - get identifier index (>=0: field index, <0: local var) // returns VARIDX_UNDEFINED for unknown identifier sInt16 getIdentifierIndex(sInt16 aObjIndex, TFieldListConfig *aFieldListConfigP, cAppCharP aIdentifier,size_t aLen=0); // - get field by fid, can also be field of aItem, also resolves arrays TItemField *getFieldOrVar(TMultiFieldItem *aItemP, sInt16 aFid, sInt16 aArrIdx); // - get field by fid, can also be field of aItem TItemField *getFieldOrVar(TMultiFieldItem *aItemP, sInt16 aFid); // - get local var by local index TItemField *getLocalVar(sInt16 aVarIdx); // - set local var by local index (used for passing references) void setLocalVar(sInt16 aVarIdx, TItemField *aFieldP); sInt16 getNumLocals(void) { return fNumVars; }; // - parameters sInt16 getNumParams(void) { return fNumParams; }; // - caller's context data pointer (opaque, for use by context functions) void *getCallerContext(void) { return fCallerContext; }; private: // syncappbase link, must always exist TSyncAppBase *fAppBaseP; // session link, can be NULL TSyncSession *fSessionP; // local variable definitions (used in resolve phase) TVarDefs fVarDefs; // actually instantiated local variable fields (size of fFieldsP array, used at execution) // Note: might differ from fVarDefs when new vars have been defined, but not instantiated yet) uInt16 fNumVars; // function properties (if context is a function context) uInt16 fNumParams; // this determines the number of parameter locals TItemFieldTypes fFuncType; // return type of function // The local variables and field references TItemField **fFieldsP; // script parsing // - variables sInt16 skipping; // skipping uInt16 line,nextline; // line numbers cUInt8P bp; // start of script cUInt8P ep; // end of script cUInt8P p; // cursor, start at beginning cUInt8P np; // next token #ifdef SYDEBUG const char *scriptname; // name of script const char *linesource; // start of embedded source for current line bool executing; // set if executing (not resolving) bool debugon; // set if debug enabled bool inComment; // for colorizer #endif // - helpers void initParse(const string &aTScript, bool aExecuting=false); // init parsing variables uInt8 gettoken(void); // get next token void reusetoken(void); // re-use last token fetched with gettoken() // script execution // - flow control state stack sInt16 fStackEntries; TScriptStackEntry fScriptstack[maxstackentries]; // - context information public: // Items TMultiFieldItem *fTargetItemP; bool fTargetWritable; TMultiFieldItem *fReferenceItemP; bool fRefWritable; // Link to calling script context (for function contexts) TScriptContext *fParentContextP; private: // Function table const TFuncTable *fFuncTableP; // caller context's function table void *fCallerContext; // free pointer possibly having a meaning for context functions // - helpers void pushState(TScriptState aNewState, cUInt8P aBegin=NULL, uInt16 aLine=0); void popState(TScriptState aCurrentStateExpected); bool getVarField(TItemField *&aItemFieldP); void evalParams(TScriptContext *aFuncContextP); TItemField *evalTerm(TItemFieldTypes aResultType); void evalExpression( TItemField *&aResultFieldP, // result (created new if passed NULL, modified and casted if passed a field) bool aShowResult=true, // if set, this is the main expression (and we want to see the result in DBG) TItemField *aLeftTermP=NULL, // if not NULL, chain-evaluate rest of expression according to aBinaryOp and aPreviousOp. WILL BE CONSUMED uInt8 *aBinaryOpP=NULL, // operator to be applied between term passed in aLeftTermP and next term, will receive next operator that has same or lower precedence than aPreviousOp uInt8 aPreviousOp=0 // if an operator of same or lower precedence than this is found, expression evaluation ends ); void defineBuiltInVars(const TBuiltInFuncDef *aFuncDefP); void executeBuiltIn(TItemField *&aTermP, const TBuiltInFuncDef *aFuncDefP); #ifdef SYDEBUG void showVarDefs(cAppCharP aTxt); #endif }; // TScriptContext #ifdef ENGINEINTERFACE_SUPPORT // key for access to script context variables class TScriptVarKey : public TItemFieldKey { typedef TItemFieldKey inherited; public: TScriptVarKey(TEngineInterface *aEngineInterfaceP, TScriptContext *aScriptContext) : inherited(aEngineInterfaceP), fScriptContext(aScriptContext), // may be NULL, no vars will be accessible then but no crash occurs fIterator(0) {}; protected: // methods to actually access a TItemField virtual sInt16 getFidFor(cAppCharP aName, stringSize aNameSz); virtual TItemField *getBaseFieldFromFid(sInt16 aFid); virtual bool getFieldNameFromFid(sInt16 aFid, string &aFieldName); // the script context TScriptContext *fScriptContext; // value iterator sInt16 fIterator; }; // TScriptVarKey #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync #endif // SCRIPT_CONTEXT_H #endif // SCRIPT_SUPPORT /* eof */ syncevolution-1.5/src/synthesis/src/sysync/simpleitem.cpp0000755000373300037200000000475512424517753025537 0ustar00nightlyallusers00000000000000/* * File: SimpleItem.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSimpleItem * Simple item, no internal structure but just a string * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-18 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "simpleitem.h" #ifdef CHECKSUM_CHANGELOG #include "sysync_crc16.h" #endif using namespace sysync; /* * Implementation of TSimpleItem */ TSimpleItem::TSimpleItem(TSyncItemType *aItemTypeP) : TSyncItem(aItemTypeP) { // save link to type fItemTypeP = aItemTypeP; } // TSimpleItem::TSimpleItem TSimpleItem::~TSimpleItem() { } // TSimpleItem::~TSimpleItem #ifdef CHECKSUM_CHANGELOG // changelog support: calculate CRC over contents uInt16 TSimpleItem::getDataCRC(uInt16 crc, bool aEQRelevantOnly) { // CRC of contents string (no change if nothing in it) return sysync_crc16_block(fContents.c_str(),fContents.size(),crc); } // TSimpleItem::getDataCRC #endif // test if comparable (at least for equality) bool TSimpleItem::comparable(TSyncItem &aItem) { // test if comparable: only SimpleItems can be compared return aItem.getTypeID() == getTypeID(); } // TSimpleItem::comparable // replace data contents from specified item // - aAvailable only: only replace contents actually available in aItem, leave rest untouched // - aDetectCutOffs: handle case where aItem could have somhow cut-off data and prevent replacing // complete data with cut-off version (e.g. mobiles like T39m with limited name string capacity) bool TSimpleItem::replaceDataFrom(TSyncItem &aItem, bool aAvailableOnly, bool aDetectCutoffs, bool aAssignedOnly, bool aTransferUnassigned) { // check type if (!aItem.isBasedOn(ity_simple)) return false; // ok, same type, copy data fContents=static_cast(&aItem)->fContents; return true; } // TSimpleItem::replaceDataFrom // compare function, returns 0 if equal, 1 if this > aItem, -1 if this < aItem sInt16 TSimpleItem::compareWith( TSyncItem &aItem, TEqualityMode aEqMode, TLocalEngineDS *aDatastoreP #ifdef SYDEBUG ,bool aDebugShow #endif ) { // we should test for comparable() before! if (!comparable(aItem)) return SYSYNC_NOT_COMPARABLE; TSimpleItem *simpleitemP = ((TSimpleItem *)&aItem); // compare (equality only, mod date/version is unknown) if (fContents == simpleitemP->fContents) return 0; else return SYSYNC_NOT_COMPARABLE; } // TSimpleItem::compareWith /* end of TSimpleItem implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/simpleitem.h0000755000373300037200000000451112424517753025172 0ustar00nightlyallusers00000000000000/* * File: SimpleItem.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSimpleItem * Simple item, no internal structure but just a string * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-18 : luz : created * */ #ifndef SimpleItem_H #define SimpleItem_H // includes #include "syncitem.h" #include "sysync.h" namespace sysync { const uInt16 ity_simple = 1; // must be unique class TSimpleItem: public TSyncItem { typedef TSyncItem inherited; public: TSimpleItem(TSyncItemType *aItemTypeP); virtual ~TSimpleItem(); // access to type virtual uInt16 getTypeID(void) const { return ity_simple; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_simple ? true : TSyncItem::isBasedOn(aItemTypeID); }; // assignment (IDs and contents) virtual TSyncItem& operator=(TSyncItem &aSyncItem) { return TSyncItem::operator=(aSyncItem); }; // access to simple item contents const char *getContents(void) { return fContents.c_str(); }; void setContents(const char *aContents) { fContents = aContents; }; // compare abilities virtual bool comparable(TSyncItem &aItem); virtual bool sortable(TSyncItem &aItem) { return false; } // clear item data virtual void cleardata(void) { fContents.erase(); }; // - changelog support #ifdef CHECKSUM_CHANGELOG virtual uInt16 getDataCRC(uInt16 crc=0, bool aEQRelevantOnly=false); #endif // replace data contents from specified item // - aAvailable only: only replace contents actually available in aItem, leave rest untouched // - aDetectCutOffs: handle case where aItem could have somhow cut-off data and prevent replacing // complete data with cut-off version (e.g. mobiles like T39m with limited name string capacity) virtual bool replaceDataFrom(TSyncItem &aItem, bool aAvailableOnly=false, bool aDetectCutoffs=false, bool aAssignedOnly=false, bool aTransferUnassigned=false); protected: // compare function, returns 0 if equal, 1 if this > aItem, -1 if this < aItem virtual sInt16 compareWith( TSyncItem &aItem, TEqualityMode aEqMode, TLocalEngineDS *aDatastoreP #ifdef SYDEBUG ,bool aDebugShow=false #endif ); // associated type item TSyncItemType *fItemTypeP; // contents: simple string string fContents; }; // TSimpleItem } // namespace sysync #endif // SimpleItem_H // eof syncevolution-1.5/src/synthesis/src/sysync/smltk_precomp.h0000755000373300037200000000170112424517753025677 0ustar00nightlyallusers00000000000000/* C Headers that might be available in precompiled form * for SML toolkit compilation. * (standard libraries, SyncML toolkit itself...) */ #ifndef SMLTK_PRECOMP_H #define SMLTK_PRECOMP_H /* prerequisites for SML toolkit */ // - compiler/platform specific defines #include "define.h" // - special, platform dependent lock library // (may include extra platform support headers BEFORE // other SML files will include standard platform support) #include "liblock.h" /* standard C includes */ #include #include #ifdef __PALM_OS__ #include #include #include #else #include #include #endif #if !defined(__MC68K__) && !defined(LINUX) && !defined(WINCE) && !defined(MACOSX) && !defined(__EPOC_OS__) #include #endif /* SyncML Toolkit includes */ // - SyncML Toolkit external API #include "sml.h" #include "smlerr.h" #endif /* defined SMLTK_PRECOMP_H */ syncevolution-1.5/src/synthesis/src/sysync/smltk_precomp_xpt.h0000755000373300037200000000054312424517753026575 0ustar00nightlyallusers00000000000000/* C Headers that might be available in precompiled form * for SML toolkit compilation. * (standard libraries, SyncML toolkit itself...) */ #ifndef SMLTK_PRECOMP_XPT_H #define SMLTK_PRECOMP_XPT_H /* SyncML Toolkit includes */ // standard stuff #include "smltk_precomp.h" // plus XPT stuff #include "xpt.h" #endif /* defined SMLTK_PRECOMP_XPT_H */ syncevolution-1.5/src/synthesis/src/sysync/stdlogicagent.cpp0000755000373300037200000000300112424517753026175 0ustar00nightlyallusers00000000000000/** * @File stdlogicagent.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TStdLogicAgent * Agent (=server or client session) for standard database logic implementations, see @ref TStdLogicDS * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-23 : luz : created from custdbagent */ /* */ // includes #include "prefix_file.h" #include "stdlogicagent.h" /* * Implementation of TStdLogicAgent */ /* public TStdLogicAgent members */ TStdLogicAgent::TStdLogicAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID) : inherited(aAppBaseP, aSessionHandleP, aSessionID) { if (IS_SERVER) { #ifdef SYSYNC_SERVER InternalResetSession(); #endif } } // TStdLogicAgent::TStdLogicAgent // destructor TStdLogicAgent::~TStdLogicAgent() { // make sure everything is terminated BEFORE destruction of hierarchy begins TerminateSession(); } // TStdLogicAgent::~TStdLogicAgent // Terminate session void TStdLogicAgent::TerminateSession() { if (!fTerminated) { InternalResetSession(); } inherited::TerminateSession(); } // TStdLogicAgent::TerminateSession // Reset session void TStdLogicAgent::InternalResetSession(void) { } // TStdLogicAgent::InternalResetSession // Virtual version void TStdLogicAgent::ResetSession(void) { // do my own stuff InternalResetSession(); // let ancestor do its stuff inherited::ResetSession(); } // TStdLogicAgent::ResetSession /* end of TStdLogicAgent implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/stdlogicagent.h0000755000373300037200000000301512424517753025647 0ustar00nightlyallusers00000000000000/** * @File stdlogicagent.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TStdLogicAgent * Agent (=server or client session) for standard database logic implementations, see @ref TStdLogicDS * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-23 : luz : created from custdbagent */ /* */ #ifndef STDLOGICAGENT_H #define STDLOGICAGENT_H // includes #include "sysync.h" #include "syncagent.h" #include "localengineds.h" using namespace sysync; namespace sysync { class TStdLogicAgent: public TSyncAgent { typedef TSyncAgent inherited; public: TStdLogicAgent(TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID); virtual ~TStdLogicAgent(); virtual void TerminateSession(void); // Terminate session, like destructor, but without actually destructing object itself virtual void ResetSession(void); // Resets session (but unlike TerminateSession, session might be re-used) void InternalResetSession(void); // static implementation for calling through virtual destructor and virtual ResetSession(); // user authentication #ifndef SYSYNC_CLIENT // - server-only build should implement it, so we make it abstract here again (altough there is // an implementation for simpleauth in session. virtual bool SessionLogin(const char *aUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID) = 0; #endif // not SYSYNC_CLIENT }; // TStdLogicAgent } // namespace sysync #endif // STDLOGICAGENT_H // eof syncevolution-1.5/src/synthesis/src/sysync/stdlogicds.cpp0000644000373300037200000021052512424517753025515 0ustar00nightlyallusers00000000000000/** * @File stdlogicds.cpp * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TStdLogicDS * Standard database logic implementation, suitable for most (currently all) * actual DS implementations, but takes as few assumptions about datastore * so for vastly different sync patterns, this could be replaced by differnt locic * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-15 : luz : created from custdbdatastore */ /* */ // includes #include "prefix_file.h" #include "sysync.h" #include "stdlogicds.h" #include "multifielditem.h" #include "multifielditemtype.h" using namespace sysync; namespace sysync { /* * Implementation of TStdLogicDS */ /* public TStdLogicDS members */ TStdLogicDS::TStdLogicDS( TLocalDSConfig *aDSConfigP, sysync::TSyncSession *aSessionP, const char *aName, long aCommonSyncCapMask ) : TLocalEngineDS(aDSConfigP, aSessionP, aName, aCommonSyncCapMask) #ifdef MULTI_THREAD_DATASTORE ,fMultiThread(false) ,fStartSyncStatus(aSessionP) // a thread-private status command to store status ocurring during threaded startDataAccessForServer() #endif { InternalResetDataStore(); fMultiThread= fSessionP->getSessionConfig()->fMultiThread; // get comfort pointer } // TStdLogicDS::TStdLogicDS TStdLogicDS::~TStdLogicDS() { InternalResetDataStore(); } // TStdLogicDS::~TStdLogicDS void TStdLogicDS::InternalResetDataStore(void) { // reset fFirstTimeSync=false; fWriteStarted=false; fPreviousSyncTime=0; fCurrentSyncTime=0; #ifdef MULTI_THREAD_DATASTORE // combined ifdef/flag if (fMultiThread) { // make sure background processing aborts if it is in progress fStartSyncThread.terminate(); // request soft termination of thread if (!fStartSyncThread.waitfor()) { // has not already terminated PDEBUGPRINTFX(DBG_HOT,("******** Waiting for background thread to terminate")); fStartSyncThread.waitfor(-1); // wait forever or until thread really terminates PDEBUGPRINTFX(DBG_HOT,("******** Background thread terminated")); } // if } // if #endif // we are not initializing fInitializing=false; // no start init request yet fStartInit=false; if(HAS_SERVER_DB) { #ifdef USES_SERVER_DB // remove all items TSyncItemPContainer::iterator pos; for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { delete *pos; } fItems.clear(); // clear list #endif } if (IS_SERVER) { #ifdef SYSYNC_SERVER fNumRefOnlyItems=0; #endif } } // TStdLogicDS::InternalResetDataStore // Internal events during sync to access local database // ==================================================== // called to make admin data ready localstatus TStdLogicDS::logicMakeAdminReady(cAppCharP aDataStoreURI, cAppCharP aRemoteDBID) { PDEBUGBLOCKFMTCOLL(("MakeAdminReady","Making Admin Data ready to check sync anchors","localDB=%s|remoteDB=%s",aDataStoreURI,aRemoteDBID)); // init local anchor strings, because it will not be set on impl level // (impl level only uses timestamps for local anchor) // These will be derived from timestamps below when implMakeAdminReady() is successful fLastLocalAnchor.erase(); fNextLocalAnchor.erase(); // Updates the following state variables // - from TLocalEngineDS: fLastRemoteAnchor, fLastLocalAnchor, fResumeAlertCode, fFirstTimeSync // - for client: fPendingAddMaps // - for server: fTempGUIDMap // - from TStdLogicDS: fPreviousSyncTime, fCurrentSyncTime // - from derived classes: whatever else belongs to dsSavedAdmin and dsCurrentAdmin state localstatus sta = implMakeAdminReady( fSessionP->getRemoteURI(), // remote device/server URI (device ID) aDataStoreURI, // entire relative URI of local datastore aRemoteDBID // database ID of remote device/server (=path as sent by remote) ); if (sta==LOCERR_OK) { // TStdLogicDS requires implementation to store timestamps to make the local anchors // - regenerate last session's local anchor string from timestamp TimestampToISO8601Str(fLastLocalAnchor,fPreviousSyncTime,TCTX_UTC,false,false); // - create this session's local anchor string from timestamp TimestampToISO8601Str(fNextLocalAnchor,fCurrentSyncTime,TCTX_UTC,false,false); // - check if config has changed since last sync if (fFirstTimeSync || fPreviousSyncTime<=fSessionP->getRootConfig()->fConfigDate) { // remote should see our (probably changed) devInf PDEBUGPRINTFX(DBG_PROTO,("First time sync or config changed since last sync -> remote should see our devinf")); fSessionP->remoteMustSeeDevinf(); } else if (IS_CLIENT && canRestart()) { // When a client can restart, it must tell the server before // asking for the server's DevInf, because restart capability is // negotiated with a SyncMode extension which is only sent by // the server if it has seen the client indicate that it // supports these extensions by sending its own. If the server // somehow didn't store our DevInf, it'll ask for it, but then // it may be too late, so we pro-actively always send it when // restarting is possible. PDEBUGPRINTFX(DBG_PROTO,("Client needs to negotiate restart capability -> remote should see our devinf")); fSessionP->remoteMustSeeDevinf(); } // empty saved anchors if first time sync (should be empty anyway, but...) if (fFirstTimeSync) { fLastLocalAnchor.empty(); fLastRemoteAnchor.empty(); } } PDEBUGENDBLOCK("MakeAdminReady"); return sta; } // TStdLogicDS::logicMakeAdminReady // start writing if not already started localstatus TStdLogicDS::startDataWrite() { localstatus sta = LOCERR_OK; if (!fWriteStarted) { sta = implStartDataWrite(); fWriteStarted = sta==LOCERR_OK; // must be here to prevent recursion as startDataWrite might be called implicitly below if (HAS_SERVER_DB) { #ifdef USES_SERVER_DB // server-type DB needs post-processing to update map entries (client and server case) TSyncItemPContainer::iterator pos; if (sta==LOCERR_OK) { // Now allow post-processing of all reported items for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { localstatus sta2 = implReviewReadItem(**pos); if (sta2!=LOCERR_OK) sta = sta2; } } #endif } if (IS_CLIENT && HAS_SERVER_DB) { #ifdef USES_SERVER_DB /// @todo we don't need the items to remain that long at all - not even for CLIENT_USES_SERVER_DB case fItems.clear(); // empty list #endif } } DEBUGPRINTFX(DBG_DATA,("startDataWrite called, status=%hd", sta)); return sta; } // TStdLogicDS::startDataWrite // end writing localstatus TStdLogicDS::endDataWrite(void) { localstatus sta=LOCERR_OK; DEBUGPRINTFX(DBG_DATA,( "endDataWrite called, write %s started", fWriteStarted ? "is" : "not" )); // if we commit a write, the session is ok, and we can clear the resume state if (fWriteStarted) { sta = implEndDataWrite(); // ended now fWriteStarted=false; } return sta; } // TStdLogicDS::endDataWrite // - read specific item from database // Data and missing ID information is filled in from local database bool TStdLogicDS::logicRetrieveItemByID( TSyncItem &aSyncItem, // item to be filled with data from server. Local or Remote ID must already be set TStatusCommand &aStatusCommand // status, must be set on error or non-200-status ) { // simply call implementation return implRetrieveItemByID(aSyncItem,aStatusCommand); } // TLocalEngineDS::logicRetrieveItemByID /// check is datastore is completely started. /// @param[in] aWait if set, call will not return until either started state is reached /// or cannot be reached within the maximally allowed request processing time left. bool TStdLogicDS::isStarted(bool aWait) { #ifdef SYSYNC_SERVER if (IS_SERVER) { // only server has threaded datastores so far if (aWait && fInitializing) { localstatus sta = startDataAccessForServer(); if (sta!=LOCERR_OK) { SYSYNC_THROW(TSyncException("startDataAccessForServer failed (when called from isStarted)", sta)); } } } #endif // if initialisation could not be completed in the first startDataAccessForServer() call // we are not started. return !fInitializing && inherited::isStarted(aWait); } // TStdLogicDS::isStarted /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) void TStdLogicDS::logicMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) { implMarkItemForResume(aLocalID, aRemoteID, aUnSent); } // TStdLogicDS::logicMarkItemForResume /// called to mark an already sent item as "to-be-resent", e.g. due to temporary /// error status conditions, by localID or remoteID (latter only in server case). void TStdLogicDS::logicMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) { implMarkItemForResend(aLocalID, aRemoteID); } // TStdLogicDS::logicMarkItemForResend /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume(), markItemForResume() and markItemForResend()) /// (or, in case the session is really complete, make sure that no resume state is left) /// @note Must also save tempGUIDs (for server) and pending/unconfirmed maps (for client) localstatus TStdLogicDS::logicSaveResumeMarks(void) { PDEBUGBLOCKFMTCOLL(("SaveResumeMarks","let implementation save resume info","datastore=%s",getName())); localstatus sta = implSaveResumeMarks(); PDEBUGENDBLOCK("SaveResumeMarks"); return sta; } // TStdLogicDS::logicSaveResumeMarks // - called for SyncML 1.1 if remote wants number of changes. // Must return -1 if no NOC value can be returned sInt32 TStdLogicDS::getNumberOfChanges(void) { if (IS_SERVER) { #ifdef SYSYNC_SERVER // for server, number of changes is the number of items in the item list // minus those that are for reference only (in a slow sync resume) return fItems.size()-fNumRefOnlyItems; #endif } else { // for client, derived class must provide it, or we'll return the default here (=no NOC) // Note: for client-only builds, this methods does not exist in StdLogicDS and thus // inherited is always used return inherited::getNumberOfChanges(); } } // TStdLogicDS::getNumberOfChanges #ifdef SYSYNC_SERVER // Server case // =========== // Actual start sync actions in DB. If server supports threaded init, this will // be called in a sub-thread's context localstatus TStdLogicDS::performStartSync(void) { localstatus sta = LOCERR_OK; TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); sta = implStartDataRead(); fNumRefOnlyItems=0; if (sta==LOCERR_OK) { // now get data from DB if (!isRefreshOnly() || (isRefreshOnly() && isCacheData()) || (isSlowSync() && isResuming())) { // not only updating from client, so read all items now // Note: for a resumed slow updating from client only, we need the // currently present syncset as well as we need it to detect // re-sent items bool eof; bool changed; PDEBUGBLOCKFMTCOLL(("GetItems","Read items from DB implementation","datastore=%s",getName())); do { // check if external request to terminate loop if (shouldExitStartSync()) { PDEBUGPRINTFX(DBG_ERROR,("performStartSync aborted by external request")); PDEBUGENDBLOCK("GetItems"); TP_START(fSessionP->fTPInfo,li); return 510; } // try to read item TSyncItem *myitemP=NULL; // report all items in syncset, not only changes if we need to filter changed=!fFilteringNeededForAll; // let GetItem // now fetch next item sta = implGetItem(eof,changed,myitemP); if (sta!=LOCERR_OK) { implEndDataRead(); // terminate reading PDEBUGENDBLOCK("GetItems"); TP_START(fSessionP->fTPInfo,li); return sta; } else { // read successful, test for eof if (eof) break; // reading done if (fSlowSync) changed=true; // all have changed (just in case GetItem does not return clean result here) // NOTE: sop can be sop_reference_only ONLY in case of server resuming a slowsync TSyncOperation sop=myitemP->getSyncOp(); // check if we need to do some filtering to determine final syncop // NOTE: call postFetchFiltering even in case we do not actually // need filtering (but we might need making item pass acceptance filter!) if (sop!=sop_delete && sop!=sop_soft_delete && sop!=sop_archive_delete) { // we need to post-fetch filter the item first bool passes=postFetchFiltering(myitemP); if (!passes) { // item was changed and does not pass now -> might be fallen out of the sync set now. // Only when the DB is capable of tracking items fallen out of the sync set (i.e. bring them up as adds // later should they match the filter criteria again), we can implement removing based // on filter criteria. Otherwise, these are simply ignored. if (implTracksSyncopChanges() && !fSlowSync && (sop==sop_wants_replace)) { // item already exists on remote but falls out of syncset now: delete // NOTE: This works only if reviewReadItem() is correctly implemented // and checks for items that are deleted after being reported // as replace to delete their local map entry (which makes // them add candidates again) sop=sop_delete; myitemP->cleardata(); // also get rid of unneeded data } else sop=sop_none; // ignore all others (especially adds or slowsync replaces) } else { // item passes = belongs to sync set if (sop==sop_wants_replace && !changed && !fSlowSync) { // exists but has not changed since last sync sop=sop_none; // ignore for now } } } // check if we should use that item if (sop==sop_none) { delete myitemP; continue; // try next from DB } // set final sop now myitemP->setSyncOp(sop); // %%% these are just-in-case tests for sloppy db interface // - adjust operation for slowsync if (fSlowSync) { if (sop==sop_delete || sop==sop_soft_delete || sop==sop_archive_delete) { // do not process deleted items during slow sync at all delete myitemP; // forget it continue; // Read next item } else { // must be add or replace, will be an add by default (if unmatched) // - set it to sop_wants_add to signal that this item was not matched yet! myitemP->setRemoteID(""); // forget remote ID, is unknown in slow sync anyway if (sop!=sop_reference_only) // if reference only (resumed slowsync), keep it as is myitemP->setSyncOp(sop_wants_add); // flag it unmatched } } // - now add it to my local list fItems.push_back(myitemP); if (sop==sop_reference_only) fNumRefOnlyItems++; // count these to avoid them being shown in NOC } } while (true); // exit by break PDEBUGENDBLOCK("GetItems"); } // not from client only // end reading sta=implEndDataRead(); // show items PDEBUGPRINTFX(DBG_HOT,("%s: number of local items involved in %ssync = %ld",getName(), fSlowSync ? "slow " : "",(long)fItems.size())); CONSOLEPRINTF((" %ld local items are new/changed/deleted for this sync",(long)fItems.size())); if (PDEBUGTEST(DBG_DATA+DBG_DETAILS)) { PDEBUGBLOCKFMTCOLL(("SyncSet","Items involved in Sync","datastore=%s",getName())); for (TSyncItemPContainer::iterator pos=fItems.begin();pos!=fItems.end();pos++) { TSyncItem *syncitemP = (*pos); PDEBUGPRINTFX(DBG_DATA,( "SyncOp=%-20s: LocalID=%15s RemoteID=%15s", SyncOpNames[syncitemP->getSyncOp()], syncitemP->getLocalID(), syncitemP->getRemoteID() )); } PDEBUGENDBLOCK("SyncSet"); } // initiate writing and cause reviewing of items now, // before any of them can be modified by sync process // Notes: // - startDataWrite() includes zapping the sync set // in slow refresh only sessions (not resumed, see next note) // - In case of resumed slow refresh from remote, the sync set // will not get zapped again, because some items are already there if (sta==LOCERR_OK) sta = startDataWrite(); // private helper // test if ok if (sta != LOCERR_OK) { // failed engAbortDataStoreSync(sta,true); return sta; } TP_START(fSessionP->fTPInfo,li); return sta; } // startDataRead successful else { TP_START(fSessionP->fTPInfo,li); return sta; } } // TStdLogicDS::performStartSync #ifdef MULTI_THREAD_DATASTORE // function executed by thread static uInt32 StartSyncThreadFunc(TThreadObject *aThreadObject, uIntArch aParam) { // parameter passed is pointer to datastore TStdLogicDS *datastoreP = static_cast((void *)aParam); // now call routine that actually performs datastore start uInt32 exitCode = (uInt32) (datastoreP->performStartSync()); // thread is about to end (has ended for the Impl and Api levels), inform datastore // and post necessary ThreadMayChangeNow() calls datastoreP->endingThread(); // return return exitCode; } // StartSyncThreadFunc bool TStdLogicDS::threadedStartSync(void) { // do this in a separate thread if requested // Note: ThreadMayChangeNow() has been posted already by startingThread() PDEBUGPRINTFX(DBG_HOT,("******* starting background thread for reading sync set...")); fStartSyncStatus.setStatusCode(200); // assume ok if (!fStartSyncThread.launch(StartSyncThreadFunc,(uIntArch)this)) { // pass datastoreP as param // starting thread failed PDEBUGPRINTFX(DBG_ERROR,("******* Failed starting background thread for reading sync set")); return false; } #ifdef SYDEBUG // show link to thread log PDEBUGPRINTFX(DBG_HOT,( "******* started &html;&html;background thread id=%lu&html;&html; for reading sync set", getDbgLogger()->getDebugFilename(), // href base (long unsigned)fStartSyncThread.getid(), // plus thread getDbgLogger()->getDebugExt(), // plus extension (long unsigned)fStartSyncThread.getid() )); #endif return true; // started ok } // TStdLogicDS::threadedStartSync // can be called to check if performStartSync() should be terminated bool TStdLogicDS::shouldExitStartSync(void) { // threaded version, check if termination flag was set return fMultiThread && fStartSyncThread.terminationRequested(); } // TStdLogicDS::shouldExitStartSync #else // MULTI_THREAD_DATASTORE // can be called to check if performStartSync() should be terminated bool TStdLogicDS::shouldExitStartSync(void) { // nonthread version, is never the case return false; } // TStdLogicDS::shouldExitStartSync #endif // MULTI_THREAD_DATASTORE // called by dsBeforeStateChange to dssta_dataaccessstarted to make sure datastore is // getting ready for being accessed. Also called by isStarted(true) when starting // up took longer than one request max time for threaded datastores localstatus TStdLogicDS::startDataAccessForServer(void) { localstatus sta = LOCERR_OK; DEBUGPRINTFX(DBG_HOT,("TStdLogicDS::startDataAccessForServer")); if (!fInitializing) { // The datastore has not started initializing yet // - start initialisation now fWriteStarted=false; // - read all records from DB right now if server data is used at all DEBUGPRINTFX(DBG_DATA,("- number of items in list before StartDataRead = %ld",(long)fItems.size())); // now we can initialize the conflict resolution mode for this session /// @todo move this to localengineds, at point where we get dssta_syncmodestable fSessionConflictStrategy=getConflictStrategy(fSlowSync,fFirstTimeSync); // prepare for read #ifdef SCRIPT_SUPPORT // - call DB init script, which might add extra filters depending on options and remoterule TScriptContext::execute( fDataStoreScriptContextP, getDSConfig()->fDBInitScript, &DBFuncTable, // context's function table this // datastore pointer needed for context ); // - datastoreinitscript might abort the sync with this datastore, check for that and exit if so if (isAborted()) { return getAbortStatusCode(); } #endif // - init post fetch filtering, sets fFilteringNeededForAll and fFilteringNeeded correctly initPostFetchFiltering(); // - now we can start reading (fFilteringNeededForAll can be checked by StartDataRead) fInitializing=true; // we enter the initialisation phase now fStartInit=true; // and we want to start the init } // try starting init now (possibly repeats until it can be done) if (fStartInit) { PDEBUGPRINTFX(DBG_DATA,( "MultiThread %sabled", fMultiThread ? "en":"dis" )); #ifdef MULTI_THREAD_DATASTORE // combined define and flag if (fMultiThread) { // start init thread if (startingThread()) { // we may start a thread here if (threadedStartSync()) fStartInit= false; // starting done now } // if } // if #endif if (!fMultiThread) { // Just perform initialisation sta = performStartSync(); fStartInit=false; // starting done now fInitializing=false; // initialisation is already complete here } // if } #ifdef MULTI_THREAD_DATASTORE // combined define and flag if (fMultiThread) { // wait for started initialisation to finish within time we have left for this request if (!fStartInit && fInitializing) { // initialisation started but not ended so far: wait for it until done or defined request time passed sInt32 t=fSessionP->RemainingRequestTime(); if (fStartSyncThread.waitfor(t<0 ? 0 : t * 1000)) { // background thread has terminated sta = fStartSyncThread.exitcode(); PDEBUGPRINTFX(DBG_HOT,("******* background thread for startSync() terminated with exit code=%ld, status sta=%hd", (long)fStartSyncThread.exitcode(),sta)); // initialisation is now complete fInitializing=false; } // if } // if } // if #endif // now complete initialisation if not still initializing in background if (!fStartInit && !fInitializing) { // finished background processing if (sta==LOCERR_OK) { // quick test: if number of items is > than allowed maxid of remote datatstore, // sync is unlikely to succeed if (getRemoteDatastore()->getMaxID()<(long)fItems.size()) { // this will not work, warn (but no longer abort session, as Siemens S55 guys don't like that) CONSOLEPRINTF(( "Warning: Synchronisation involves more items (%ld) than client can possibly manage (%ld", (long)fItems.size(), (long)getRemoteDatastore()->getMaxID() )); PDEBUGPRINTFX(DBG_ERROR,( "Warning: Synchronisation involves more items (%ld) than client can possibly manage (%ld)", (long)fItems.size(), (long)getRemoteDatastore()->getMaxID() )); } } // return status of initialisation return sta; } else { // background processing still in progress // - if we are still processing in background, init is ok so far return LOCERR_OK; } } // TStdLogicDS::startDataAccessForServer // called to check if conflicting replace or delete command from server exists TSyncItem *TStdLogicDS::getConflictingItemByRemoteID(TSyncItem *syncitemP) { // search for conflicting item by remoteID TSyncItemPContainer::iterator pos; for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { if (strcmp((*pos)->getRemoteID(),syncitemP->getRemoteID())==0) { // same LUID exists in data from server PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,( "TStdLogicDS::getConflictingItemByRemoteID, found RemoteID='%s', LocalID='%s', syncop=%s", syncitemP->getRemoteID(), syncitemP->getLocalID(), SyncOpNames[syncitemP->getSyncOp()] )); return (*pos); // return pointer to item in question } } PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,("TStdLogicDS::getConflictingItemByRemoteID, no conflicting item")); return NULL; } // TStdLogicDS::getConflictingItemByRemoteID // called to check if conflicting item (with same localID) already exists in the list of items // to be sent to the server TSyncItem *TStdLogicDS::getConflictingItemByLocalID(TSyncItem *syncitemP) { // search for conflicting item by localID TSyncItemPContainer::iterator pos; for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { if (strcmp((*pos)->getLocalID(),syncitemP->getLocalID())==0) { // same LUID exists in data from server PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,( "TStdLogicDS::getConflictingItemByLocalID, found RemoteID='%s', LocalID='%s', syncop=%s", syncitemP->getRemoteID(), syncitemP->getLocalID(), SyncOpNames[syncitemP->getSyncOp()] )); return (*pos); // return pointer to item in question } } PDEBUGPRINTFX(DBG_DATA+DBG_CONFLICT,("TStdLogicDS::getConflictingItemByLocalID, no conflicting item")); return NULL; } // TStdLogicDS::getConflictingItemByLocalID // called to check if content-matching item from server exists for slow sync TSyncItem *TStdLogicDS::getMatchingItem(TSyncItem *syncitemP, TEqualityMode aEqMode) { // search for content matching item TSyncItemPContainer::iterator pos; for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { DEBUGPRINTFX(DBG_DATA+DBG_MATCH+DBG_EXOTIC,( "comparing (this) local item localID='%s' with incoming (other) item remoteID='%s'", (*pos)->getLocalID(), syncitemP->getRemoteID() )); if ((*pos)->compareWith( *syncitemP,aEqMode,this #ifdef SYDEBUG ,PDEBUGTEST(DBG_DATA+DBG_MATCH+DBG_EXOTIC) // only show comparison if exotic AND match is enabled #endif )==0) { // items match in content // - check if item is not already matched if ((*pos)->getSyncOp()!=sop_wants_add && (*pos)->getSyncOp()!=sop_reference_only) { // item has already been matched before, so don't match it again DEBUGPRINTFX(DBG_DATA,( "TStdLogicDS::getMatchingItem, match but already used -> skip it: remoteID='%s' = localID='%s'", syncitemP->getRemoteID(), (*pos)->getLocalID() )); } else { // item has not been matched yet (wannabe add or reference-only), return it now PDEBUGPRINTFX(DBG_DATA+DBG_MATCH+DBG_HOT,( "TStdLogicDS::getMatchingItem, found remoteID='%s' is equal in content with localID='%s'", syncitemP->getRemoteID(), (*pos)->getLocalID() )); return (*pos); // return pointer to item in question } } } PDEBUGPRINTFX(DBG_DATA+DBG_MATCH,("TStdLogicDS::getMatchingItem, no matching item")); return NULL; } // TStdLogicDS::getMatchingItem // - called to prevent item to be sent to client in subsequent generateSyncCommands() // item in question should be an item that was returned by getConflictingItemByRemoteID() or getMatchingItem() void TStdLogicDS::dontSendItemAsServer(TSyncItem *syncitemP) { PDEBUGPRINTFX(DBG_DATA+DBG_EXOTIC,("Preventing localID='%s' to be sent to client",syncitemP->getLocalID())); syncitemP->setSyncOp(sop_none); // anyway, set to none // delete from list as we don't need it any more TSyncItemPContainer::iterator pos; for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { if (*pos == syncitemP) { // it is in our list PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("Item with localID='%s' will NOT be sent to client (slowsync match / duplicate prevention)",syncitemP->getLocalID())); delete *pos; // delete item itself fItems.erase(pos); // remove from list break; } } } // TStdLogicDS::dontSendItemAsServer // - called when a item in the sync set changes its localID (due to local DB internals) // Datastore must make sure that possibly cached items get updated // - NOTE: derivates must take care of updating map entries as well! void TStdLogicDS::dsLocalIdHasChanged(const char *aOldID, const char *aNewID) { PDEBUGPRINTFX(DBG_DATA,("TStdLogicDS::dsLocalIdHasChanged")); // update in loaded list of items TSyncItemPContainer::iterator pos; for (pos=fItems.begin(); pos!=fItems.end(); ++pos) { if (strcmp((*pos)->getLocalID(),aOldID)==0) { // found item, change it's local ID now (*pos)->setLocalID(aNewID); // make sure internal dependencies get updated (*pos)->updateLocalIDDependencies(); // done break; } } // let base class do what is needed to update the item itself inherited::dsLocalIdHasChanged(aOldID, aNewID); } // TStdLogicDS::dsLocalIdHasChanged // - called to have additional item sent to remote void TStdLogicDS::SendItemAsServer(TSyncItem *aSyncitemP) { // add to list of changes fItems.push_back(aSyncitemP); } // TStdLogicDS::SendItemAsServer // - end map operation (derived class might want to rollback) bool TStdLogicDS::MapFinishAsServer( bool aDoCommit, // if not set, entire map operation must be undone TStatusCommand &aStatusCommand // status, must be set on error or non-200-status ) { // unsuccessful Map will cause rollback of entire datastore transaction if (!aDoCommit) { // bad, abort session engAbortDataStoreSync(510,true); // data store failed, local problem } return true; } // TStdLogicDS::MapFinishAsServer // - called to let server generate sync commands for client // Returns true if now finished (or aborted) for this datastore // also sets fState to dss_syncdone when finished bool TStdLogicDS::logicGenerateSyncCommandsAsServer( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, cAppCharP aLocalIDPrefix ) { bool alldone=false; bool ignoreitem; uInt32 itemcount=0; // send as many as possible from list of local modifications // sop_want_replace can only be sent if state is already dss_syncfinish TSyncItemPContainer::iterator pos; pos = fItems.begin(); // first item TSyncItemType *itemtypeP = getRemoteReceiveType(); POINTERTEST(itemtypeP,("TStdLogicDS::logicGenerateSyncCommandsAsServer: fRemoteReceiveFromLocalTypeP undefined")); #ifdef SYDEBUG if (fMaxItemCount> 0) { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,( "Info: Max number of items to be sent in this session is limited to %ld (already sent by now=%ld)", (long)fMaxItemCount, (long)fItemsSent )); } #endif while ( !isAborted() && // not aborted (getDSConfig()->fMaxItemsPerMessage==0 || itemcountfMaxItemsPerMessage) && // max item count per message not reached or not active !fSessionP->outgoingMessageFull() && // message not full aNextMessageCommands.size()==0 // no commands already queued for next message ) { // get item to process if (pos == fItems.end()) { alldone=true; break; } // TSyncItem *syncitemP = (*pos); // get sync op to perform TSyncOperation syncop=syncitemP->getSyncOp(); // check if we can send the item now (for replaces, we need ALWAYS to wait until client has finished sending) // Note: usually sync engine will not start generating before dssta_serverseenclientmods anyway, but... if (syncop==sop_wants_replace && !testState(dssta_serverseenclientmods)) { // cannot be sent now, take next pos++; continue; } // check if we should ignore this item ignoreitem = syncop==sop_reference_only; // ignore anyway if reference only // further check if not already ignored if (!ignoreitem) { // - check if adding is still allowed if (fRemoteAddingStopped && (syncop==sop_wants_add || syncop==sop_add)) { // adding to remote has been stopped, discard add items PDEBUGPRINTFX(DBG_DATA,( "Suppressed add for item localID='%s' (fRemoteAddingStopped)", syncitemP->getLocalID() )); ignoreitem=true; } #ifdef SYNCML_TAF_SUPPORT // check other reasons to prevent further adds if (syncop==sop_wants_add || syncop==sop_add) { // - check if max number of items has already been reached if (fMaxItemCount!=0 && fItemsSent>=fMaxItemCount) { PDEBUGPRINTFX(DBG_DATA,( "Suppressed add for item localID='%s' (max item count=%ld reached)", syncitemP->getLocalID(), fMaxItemCount )); ignoreitem=true; } // - check if item passes possible TAF /// %%% (do not filter replaces, as these would not get reported again in the next session) /// @todo: the above is no longer true as we can now have them re-sent in next session, /// so this must be changed later!!! if (!( syncitemP->testFilter(fTargetAddressFilter.c_str()) && syncitemP->testFilter(fIntTargetAddressFilter.c_str()) )) { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,( "Item localID='%s' does not pass INCLUSIVE filter (TAF) -> Suppressed adding", syncitemP->getLocalID() )); ignoreitem=true; } } #endif } // Now discard if ignored if (ignoreitem) { // remove item from list TSyncItemPContainer::iterator temp_pos = pos++; // make copy and set iterator to next fItems.erase(temp_pos); // now entry can be deleted (N.M. Josuttis, pg204) // delete item itself delete syncitemP; // test next continue; } // create sync op command (may return NULL in case command cannot be created, e.g. for MaxObjSize limitations) TSyncOpCommand *syncopcmdP = newSyncOpCommand(syncitemP,itemtypeP,aLocalIDPrefix); // erase item from list delete syncitemP; pos = fItems.erase(pos); // issue command now // - Note that when command is split, issuePtr returns true, but we still may NOT generate new commands // as the message is already full now. That's why the while contains a check for message full and aNextMessageCommands size // (was not the case before 2.1.0.2, which could cause that the first chunk of a subsequent command // would be sent before the third..nth chunk of the previous command). TSmlCommand *cmdP = syncopcmdP; syncopcmdP=NULL; // possibly, we have a NULL command here (e.g. in case it could not be generated due to MaxObjSize restrictions) if (cmdP) { // We pass the command to the issue mechanism - last chance to count is here. // Note: the command might be queued and actually sent in a subsequent message. fItemsSent++; // overall counter for statistics itemcount++; // per message counter DB_PROGRESS_EVENT(this,pev_itemsent,fItemsSent,getNumberOfChanges(),0); // send event (but no check for abort) // now issue if (!fSessionP->issuePtr(cmdP,aNextMessageCommands,aInterruptedCommandP)) { alldone=false; // issue failed (no room in message), not finished so far break; // stop trying to issue more commands } } }; // while not aborted and not message full // we are not done until all aNextMessageCommands are also out // Note: this must be specially checked because we now have SyncML 1.1 chunked commands. // Those issue() fine, but leave a next chunk in the aNextMessageCommands queue. if (alldone && aNextMessageCommands.size()>0) { alldone=false; } // finished when we have done all return (alldone || isAborted()); } // TStdLogicDS::logicGenerateSyncCommandsAsServer // called for servers when receiving map from client localstatus TStdLogicDS::logicProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) { // simply call implementation return implProcessMap(aRemoteID, aLocalID); } // TStdLogicDS::logicProcessMap #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT // Client Case // =========== // called by dsBeforeStateChange to dssta_dataaccessstarted to make sure datastore is ready for being accessed. localstatus TStdLogicDS::startDataAccessForClient(void) { DEBUGPRINTFX(DBG_HOT,("TStdLogicDS::startDataAccessForClient")); // init fWriteStarted=false; fEoC=false; // not all changes seen yet // prepare for read #ifdef SCRIPT_SUPPORT // - call DB init script, which might add extra filters depending on options and remoterule TScriptContext::execute( fDataStoreScriptContextP, getDSConfig()->fDBInitScript, &DBFuncTable, // context's function table this // datastore pointer needed for context ); // - datastoreinitscript might abort the sync with this datastore, check for that and exit if so if (isAborted()) { return getAbortStatusCode(); } #endif // - init post fetch filtering, sets fFilteringNeededForAll and fFilteringNeeded correctly initPostFetchFiltering(); // - prepare for read localstatus sta=implStartDataRead(); return sta; } // TStdLogicDS::startDataAccessForClient // called to generate sync sub-commands as client for remote server // @return true if now finished for this datastore bool TStdLogicDS::logicGenerateSyncCommandsAsClient( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, cAppCharP aLocalIDPrefix ) { localstatus sta = LOCERR_OK; bool alldone=true; // send as many changed items as possible TSyncItemType *itemtypeP = getRemoteReceiveType(); POINTERTEST(itemtypeP,("TStdLogicDS::logicGenerateSyncCommandsAsClient: fRemoteReceiveFromLocalTypeP undefined")); while (!fEoC && !isAborted() && !fSessionP->outgoingMessageFull() && aNextMessageCommands.size()==0) { // get next item from DB TSyncItem *syncitemP = NULL; #ifdef OBJECT_FILTERING bool changed=!fFilteringNeededForAll; // set if we need all records for later filtering #else bool changed=true; // without filters, always let DB check if modified #endif sta = implGetItem(fEoC,changed,syncitemP); if (sta!=LOCERR_OK) { // fatal error implEndDataRead(); // terminate reading (error does not matter) engAbortDataStoreSync(sta, true); // local problem return false; // not complete } // read successful, test for EoC (end of changes) if (fEoC) break; // reading done if (fSlowSync) changed=true; // all have changed (just in case GetItem does not return clean result here) // get sync op to perform TSyncOperation syncop=syncitemP->getSyncOp(); if (syncop!=sop_delete && syncop!=sop_soft_delete && syncop!=sop_archive_delete) { #ifdef OBJECT_FILTERING // Filtering // - call this anyway (makes sure item is made conformant to remoteAccept filter, even if // fFilteringNeeded is not set) bool passes=postFetchFiltering(syncitemP); if (fFilteringNeeded && !passes) { // item was changed and does not pass now -> might be fallen out of the sync set now. // Only when the DB is capable of tracking items fallen out of the sync set (i.e. bring them up as adds // later should they match the filter criteria again), we can implement removing based // on filter criteria. Otherwise, these are simply ignored. if (implTracksSyncopChanges() && !fSlowSync && changed && (syncop==sop_replace || syncop==sop_wants_replace)) { // item already exists on remote but falls out of syncset now: delete // NOTE: This works only if reviewReadItem() is correctly implemented // and checks for items that are deleted after being reported // as replace to delete their local map entry (which makes // them add candidates again) syncop = sop_delete; syncitemP->cleardata(); // also get rid of unneeded data } else syncop = sop_none; // ignore all others (especially adds or slowsync replaces) } else #endif { // item passes (or no filters anyway) -> belongs to sync set if ((syncop==sop_replace || syncop==sop_wants_replace) && !changed && !fSlowSync) { // exists but has not changed since last sync syncop=sop_none; // ignore for now } } } // check if we should use that item if (syncop==sop_none) { delete syncitemP; continue; // try next from DB } // set final syncop now syncitemP->setSyncOp(syncop); // create sync op command TSyncOpCommand *syncopcmdP = newSyncOpCommand(syncitemP,itemtypeP,aLocalIDPrefix); #ifdef CLIENT_USES_SERVER_DB // save item, we need it later for post-processing and Map simulation fItems.push_back(syncitemP); #else // delete item, not used any more delete syncitemP; #endif // issue command now // - Note that when command is split, issuePtr returns true, but we still may NOT generate new commands // as the message is already full now. That's why the while contains a check for message full and aNextMessageCommands size // (was not the case before 2.1.0.2, which could cause that the first chunk of a subsequent command // would be sent before the third..nth chunk of the previous command). TSmlCommand *cmdP = syncopcmdP; syncopcmdP=NULL; // possibly, we have a NULL command here (e.g. in case it could not be generated due to MaxObjSize restrictions) if (cmdP) { // We pass the command to the issue mechanism - last chance to count is here. // Note: the command might be queued and actually sent in a subsequent message. fItemsSent++; #ifdef PROGRESS_EVENTS // send progress event and check for abort if (!DB_PROGRESS_EVENT(this,pev_itemsent,fItemsSent,getNumberOfChanges(),0)) { implEndDataRead(); // terminate reading fSessionP->AbortSession(500,true,LOCERR_USERABORT); return false; // error } #endif // issue now if (!fSessionP->issuePtr(cmdP,aNextMessageCommands,aInterruptedCommandP)) { alldone=false; // issue failed (no room in message), not finished so far break; } #ifdef PROGRESS_EVENTS // check for "soft" suspension if (!SESSION_PROGRESS_EVENT(fSessionP,pev_suspendcheck,NULL,0,0,0)) { fSessionP->SuspendSession(LOCERR_USERSUSPEND); } #endif } }; // while not aborted // we are not done until all aNextMessageCommands are also out // Note: this must be specially checked because we now have SyncML 1.1 chunked commands. // Those issue() fine, but leave a next chunk in the aNextMessageCommands queue. if (alldone && aNextMessageCommands.size()>0) { alldone=false; } // done if we are now ready for sync or if aborted return ((alldone && fEoC) || isAborted()); } // TStdLogicDS::logicGenerateSyncCommandsAsClient #endif // SYSYNC_CLIENT /// @brief called to have all not-yet-generated sync commands as "to-be-resumed" void TStdLogicDS::logicMarkOnlyUngeneratedForResume(void) { if (IS_SERVER) { #ifdef SYSYNC_SERVER // we do not maintain the map/bookmark list at this level, so // derived class (ODBC, BinFile etc.) must make sure that their list is // clean (no marks from previous sessions) before calling this inherited version implMarkOnlyUngeneratedForResume(); // Now add those that we have already received from the implementation TSyncItemPContainer::iterator pos; for (pos = fItems.begin(); pos != fItems.end(); ++pos) { // let datastore mark these unprocessed TSyncItem *syncitemP = (*pos); // mark it for resume by ID logicMarkItemForResume(syncitemP->getLocalID(),syncitemP->getRemoteID(),true); // these are unsent } #endif // SYSYNC_SERVER } else { #ifdef SYSYNC_CLIENT // we do not maintain the map/bookmark list at this level, so // derived class (ODBC, BinFile etc.) must make sure that their list is // clean (no marks from previous sessions) before calling this inherited version implMarkOnlyUngeneratedForResume(); // in client case, fItems does not contain ungenerated/unprocessed items // so we don't have anything more do here for now #endif // SYSYNC_CLIENT } } // TStdLogicDS::logicMarkOnlyUngeneratedForResume /// helper to merge database version of an item with the passed version of the same item; /// does age comparison by default, with "local side wins" as fallback TMultiFieldItem *TStdLogicDS::mergeWithDatabaseVersion(TSyncItem *aSyncItemP, bool &aChangedDBVersion, bool &aChangedNewVersion) { aChangedDBVersion = false; aChangedNewVersion = false; TStatusCommand dummy(fSessionP); TMultiFieldItem *dbVersionItemP = (TMultiFieldItem *)newItemForRemote(aSyncItemP->getTypeID()); if (!dbVersionItemP) return NULL; // - set IDs dbVersionItemP->setLocalID(aSyncItemP->getLocalID()); dbVersionItemP->setRemoteID(aSyncItemP->getRemoteID()); // - result is always a replace (item exists in DB) dbVersionItemP->setSyncOp(sop_wants_replace); // - try to get from DB bool ok=logicRetrieveItemByID(*dbVersionItemP,dummy); if (ok && dummy.getStatusCode()!=404) { // item found in DB, merge with original item // TODO (?): make this configurable TConflictResolution crstrategy = cr_newer_wins; if (crstrategy==cr_newer_wins) { sInt16 cmpRes = aSyncItemP->compareWith( *dbVersionItemP, eqm_nocompare,this #ifdef SYDEBUG ,PDEBUGTEST(DBG_CONFLICT+DBG_DETAILS) // show age comparisons only if we want to see details #endif ); if (cmpRes==-1) crstrategy=cr_server_wins; else crstrategy=cr_client_wins; PDEBUGPRINTFX(DBG_DATA,( "Newer item determined: %s", crstrategy==cr_client_wins ? "Incoming item is newer and wins" : "DB item is newer and wins" )); if (crstrategy==cr_client_wins) { aSyncItemP->mergeWith(*dbVersionItemP, aChangedNewVersion, aChangedDBVersion, this); } else { dbVersionItemP->mergeWith(*aSyncItemP, aChangedDBVersion, aChangedNewVersion, this); } PDEBUGPRINTFX(DBG_DATA,( "Merged incoming item (%s,relevant,%smodified) with version from database (%s,%s,%smodified)", crstrategy==cr_client_wins ? "winning" : "loosing", aChangedNewVersion ? "" : "NOT ", crstrategy==cr_server_wins ? "winning" : "loosing", aChangedDBVersion ? "to-be-replaced" : "to-be-left-unchanged", aChangedDBVersion ? "" : "NOT " )); } } else { // no item found, we cannot force a conflict PDEBUGPRINTFX(DBG_ERROR,("Could not retrieve database version of item, DB status code = %hd",dummy.getStatusCode())); delete dbVersionItemP; dbVersionItemP=NULL; return NULL; } return dbVersionItemP; } // TStdLogicDS::mergeWithDatabaseVersion enum LogicItemOp { LOGIC_ITEM_WRITE, LOGIC_ITEM_REPLACE_FALLBACK, LOGIC_ITEM_ADD_FALLBACK }; struct TLogicSyncItemAux : public TSyncItemAux { bool fIrregular; bool fShouldBeVisible; bool fVisibleInSyncset; TSyncItem *fSyncItemP; LogicItemOp fOp; }; // called to process incoming item operation // Method takes ownership of syncitemP in all cases bool TStdLogicDS::logicProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand, bool &aVisibleInSyncset, // on entry: tells if resulting item SHOULD be visible; on exit: set if processed item remains visible in the sync set. string *aGUID // GUID is stored here if not NULL ) { localstatus sta=LOCERR_OK; bool irregular=false; bool shouldbevisible=aVisibleInSyncset; string datatext; LogicItemOp op; // Must be kept alive for the duration of the entire call, // in case that we need to resume. TSyncItem *origSyncItemP=syncitemP; TP_DEFIDX(li); TP_SWITCH(li,fSessionP->fTPInfo,TP_database); SYSYNC_TRY { // assume item will stay visible in the syncset after processing aVisibleInSyncset=true; // start writing if not already started sta=startDataWrite(); if (sta!=LOCERR_OK) { aStatusCommand.setStatusCode(sta); } else { TLogicSyncItemAux *aux = static_cast(origSyncItemP->getAux(TSyncItem::STD_LOGIC_DS)); // show DEBUGPRINTFX(DBG_DATA,( "TStdLogicDS::logicProcessRemoteItem %p %s, SyncOp=%s, RemoteID='%s', LocalID='%s'", origSyncItemP, aux ? "resuming" : "starting", SyncOpNames[origSyncItemP->getSyncOp()], origSyncItemP->getRemoteID(), origSyncItemP->getLocalID() )); // Same approach as in TLocalEngineDS::engProcessRemoteItemAsServer(): // jump directly to the point where we left the last time we where // called for this item. if (aux) { irregular = aux->fIrregular; shouldbevisible = aux->fShouldBeVisible; aVisibleInSyncset = aux->fVisibleInSyncset; syncitemP = aux->fSyncItemP; op = aux->fOp; switch (op) { case LOGIC_ITEM_WRITE: goto do_write; case LOGIC_ITEM_REPLACE_FALLBACK: goto do_replace_fallback; case LOGIC_ITEM_ADD_FALLBACK: goto do_add_fallback; } } if (false) { again: #define CHECK_FOR_AGAIN(_op) \ if (aStatusCommand.getStatusCode() == LOCERR_AGAIN) { \ op = _op; \ goto again; \ } if (!aux) { aux = new TLogicSyncItemAux; origSyncItemP->setAux(TSyncItem::STD_LOGIC_DS, aux); } aux->fIrregular = irregular; aux->fShouldBeVisible = shouldbevisible; aux->fVisibleInSyncset = aVisibleInSyncset; aux->fSyncItemP = syncitemP; // cppcheck-suppress uninitvar aux->fOp = op; aStatusCommand.setStatusCode(LOCERR_AGAIN); return false; } // now perform action if (syncitemP->getSyncOp()==sop_replace || syncitemP->getSyncOp()==sop_wants_replace) { // check if we should read before writing TMultiFieldItem *mfiP; GET_CASTED_PTR(mfiP,TMultiFieldItem,syncitemP,""); bool replacewritesallfields = dsReplaceWritesAllDBFields(); bool mightcontaincutoff=false; // - see if we would pass sync set filter as is #ifdef OBJECT_FILTERING aVisibleInSyncset = mfiP->testFilter(fSyncSetFilter.c_str()); bool invisible = !getDSConfig()->fInvisibleFilter.empty() && // has an invisible filter mfiP->testFilter(getDSConfig()->fInvisibleFilter.c_str()); // and passes it -> invisible bool visibilityok = (aVisibleInSyncset && !invisible) == shouldbevisible; // check if visibility is correct if (visibilityok && !replacewritesallfields && aVisibleInSyncset) // avoid expensive check if we have to read anyway #endif mightcontaincutoff = mfiP->getItemType()->mayContainCutOffData(mfiP->getTargetItemType()); // - if not, we must read item from the DB first and then // test again. if ( #ifdef OBJECT_FILTERING !visibilityok || #endif replacewritesallfields || mightcontaincutoff || fIgnoreUpdate // if we may not update items, only add them, then we must check first if item exists in DB ) { // the item we are replacing might contain cut-off data or // needs otherwise to be modified based on current contents // we should therefore read item from DB first // - create new empty TMultiFieldItem TMultiFieldItem *refitemP = (TMultiFieldItem *) newItemForRemote(ity_multifield); if (IS_CLIENT) { // Client: retrieve by local ID refitemP->clearRemoteID(); // not known refitemP->setLocalID(syncitemP->getLocalID()); // make sure we retrieve by local ID } else { // Server: retrieve by remote ID refitemP->clearLocalID(); // make sure we retrieve by remote ID refitemP->setRemoteID(syncitemP->getRemoteID()); // make sure we retrieve by remote ID } refitemP->setSyncOp(sop_replace); #ifdef OBJECT_FILTERING PDEBUGPRINTFX(DBG_DATA,( "TStdLogicDS: Need read-modify-write (cause: %s%s%s%s) -> retrieve original item from DB", !visibilityok ? "visibility_not_ok " : "", replacewritesallfields ? "replace_writes_all_fields " : "", mightcontaincutoff ? "might_contain_cutoff_data " : "", fIgnoreUpdate ? "ignoreUpdate " : "" )); #else PDEBUGPRINTFX(DBG_DATA,( "TStdLogicDS: Need read-modify-write (cause: %s%s%s) -> retrieve original item from DB", replacewritesallfields ? "replace_writes_all_fields " : "", mightcontaincutoff ? "might_contain_cutoff_data " : "", fIgnoreUpdate ? "ignoreUpdate " : "" )); #endif if (implRetrieveItemByID(*refitemP,aStatusCommand)) { #ifdef SYDEBUG if (PDEBUGTEST(DBG_DATA)) { PDEBUGPRINTFX(DBG_DATA,("TStdLogicDS: Retrieved item")); if (PDEBUGTEST(DBG_DATA+DBG_DETAILS)) refitemP->debugShowItem(); // show item retrieved } #endif if (fIgnoreUpdate) { // updates may not be executed at all, and be simply ignored aStatusCommand.setStatusCode(200); // fake ok. PDEBUGPRINTFX(DBG_DATA+DBG_HOT,("TStdLogicDS: fIgnoreUpdate set, update command not executed but answered with status 200")); irregular=true; sta=LOCERR_OK; goto processed; } // we got the item to be replaced // - now modify it: // - only modify available fields // - perform cutoff prevention // - do not just copy assigned fields (but all those that are available) // - IF replace can write individual fields, then transfer unassigned status // (also for non-availables!) to avoid that datastore needs to write back // values that are already there. refitemP->replaceDataFrom(*syncitemP,true,true,false,!replacewritesallfields); #ifdef SYDEBUG if (PDEBUGTEST(DBG_DATA)) { PDEBUGPRINTFX(DBG_DATA,("TStdLogicDS: Item updated with contents from remote")); if (PDEBUGTEST(DBG_DATA+DBG_EXOTIC)) refitemP->debugShowItem(); // show item retrieved } #endif #ifdef OBJECT_FILTERING // - make sure item will pass sync set filter NOW makePassSyncSetFilter(refitemP); // - make sure item will be visible NOW makeVisible(refitemP); #ifdef SYDEBUG if (PDEBUGTEST(DBG_DATA)) { PDEBUGPRINTFX(DBG_DATA,("TStdLogicDS: Made visible and pass sync set filter")); if (PDEBUGTEST(DBG_DATA+DBG_EXOTIC)) refitemP->debugShowItem(); // show item retrieved } #endif #endif // - use new item for further processing syncitemP=refitemP; } else { // failed retrieving item: switch to add sta = aStatusCommand.getStatusCode(); if (sta==404 || sta==410) { // this is an irregularity for a client (but it's perfectly // normal case for server, as client may use replace for adds+replaces) if (IS_CLIENT && !syncitemP->hasRemoteID()) { // - we cannot handle this properly, we have no remoteID, so report error to server PDEBUGPRINTFX(DBG_ERROR,("TStdLogicDS: Item not found, but cannot switch to add because no RemoteID is known, Status=%hd",aStatusCommand.getStatusCode())); } else { if (fPreventAdd) { // prevent implicit add -> return sta as is } else { // - switch to add if remote sent remoteID along so we can properly map syncitemP->setSyncOp(sop_add); PDEBUGPRINTFX(DBG_DATA,("TStdLogicDS: RetrieveItem: not found (Status=%hd) --> adding instead",sta)); if (IS_SERVER) { #ifdef SYSYNC_SERVER // server: make sure we delete the old item from the map table (as we *know* the item is gone - should it reappear under a different localID, it'll be re-added) implProcessMap(syncitemP->getRemoteID(),NULL); #endif } else { // client: we can handle it, as we know the remoteID irregular=true; // irregular only for client } sta=LOCERR_OK; // ok for further processing, anyway } } } else { // this is a fatal error, report it PDEBUGPRINTFX(DBG_ERROR,("TStdLogicDS: RetrieveItem failed, Status=%hd",sta)); } // get rid of reference item delete refitemP; } } } if (sta==LOCERR_OK) { // make sure that added items will pass sync set filters. If we can't make them pass // for DS 1.2 exclusive filters we must generate a delete so we must remember the itempassed status) #ifdef OBJECT_FILTERING if (syncitemP->getSyncOp()==sop_add || syncitemP->getSyncOp()==sop_wants_add) { // - make sure new item will pass sync set filter when re-read from DB aVisibleInSyncset=makePassSyncSetFilter(syncitemP); // - also make sure new item has correct visibility status if (shouldbevisible) makeVisible(syncitemP); // make visible else aVisibleInSyncset = !makeInvisible(syncitemP); // make invisible } #endif // Now let derived class process the item do_write: if (!implProcessItem(syncitemP,aStatusCommand)) sta = aStatusCommand.getStatusCode(); // not successful, get error status code CHECK_FOR_AGAIN(LOGIC_ITEM_WRITE); } // perform special case handling if (sta!=LOCERR_OK) { // irregular, special case handling switch (syncitemP->getSyncOp()) { case sop_wants_add : // to make sure case sop_add : if (sta==418) { // 418: item already exists, this is kind of a conflict if (isResuming() || fIgnoreUpdate || IS_CLIENT) { // - in a client, this should not happen (prevented via checking against pending maps before // this routine is called) - if it still does just report the status back // - in a resume, this can happen and the add should be ignored (se we return the status 418) // - if updates are to be ignored, don't try update instead (and report 418) // --> just return the status as-is } else { // in normal sync in the server case, this can happen when a previous session // was aborted (and already applied adds not rolled back) // --> reprocess it as a replace PDEBUGPRINTFX(DBG_DATA,("to-be-added item already exists -> trying replace (=conflict resolved by client winning)")); // - switch to replace syncitemP->setSyncOp(sop_replace); irregular=true; // - process again do_replace_fallback: if (implProcessItem(syncitemP,aStatusCommand)) { aStatusCommand.setStatusCode(208); // client has won } else { CHECK_FOR_AGAIN(LOGIC_ITEM_REPLACE_FALLBACK); // failed, return status sta = aStatusCommand.getStatusCode(); } } } break; case sop_replace : if (sta==404 || sta==410) { // this is an irregularity for a client (but it's perfectly // normal case for server, as client may use replace for adds+replaces) if (IS_CLIENT && !syncitemP->hasRemoteID()) { // - we cannot handle this properly, we have no remoteID, so report error to server PDEBUGPRINTFX(DBG_ERROR,("to-be-replaced item not found, but cannot switch to add because no RemoteID is known, Status=%hd",sta)); } else { if (fPreventAdd) { // prevent implicit add -> return status as is } else { // - switch to add if remote sent remoteID along so we can properly map syncitemP->setSyncOp(sop_add); if (IS_SERVER) { #ifdef SYSYNC_SERVER // - make sure we delete the old item from the map table (as we *know* the item is gone - should it reappear under a different localID, it'll be re-added) implProcessMap(syncitemP->getRemoteID(),NULL); #endif } else { // we can handle it, as we know the remoteID irregular=true; } PDEBUGPRINTFX(DBG_DATA,("to-be-replaced item not found (Status=%hd) --> adding instead",sta)); // - process again (note that we are re-using the status command that might // already have a text item with an OS errir if something failed before) sta=LOCERR_OK; // forget previous status do_add_fallback: if (!implProcessItem(syncitemP,aStatusCommand)) sta=aStatusCommand.getStatusCode(); // not successful, get error status code CHECK_FOR_AGAIN(LOGIC_ITEM_ADD_FALLBACK); } } } break; case sop_delete : case sop_archive_delete : case sop_soft_delete : if (sta==404 || sta==410) { if (fSessionP->getSessionConfig()->fDeletingGoneOK) { // 404/410: item not found, could be because previous aborted session has // already committed deletion of that item -> behave as if delete was ok PDEBUGPRINTFX(DBG_DATA,("to-be-deleted item was not found, but do NOT report %hd",sta)); aStatusCommand.setStatusCode(200); irregular=true; sta = LOCERR_OK; // this is ok, item is deleted already } } break; default : SYSYNC_THROW(TSyncException("Unknown sync op in TStdLogicDS::logicProcessRemoteItem")); } // switch } // if not ok processed: if (sta==LOCERR_OK) { PDEBUGPRINTFX(DBG_DATA,( "- Operation %s performed (%sregular), Remote ID=%s Local ID=%s, status=%hd", SyncOpNames[syncitemP->getSyncOp()], irregular ? "ir" : "", syncitemP->getRemoteID(), syncitemP->getLocalID(), aStatusCommand.getStatusCode() )); // return GUID if string ptr was passed if (aGUID) { (*aGUID)=syncitemP->getLocalID(); } } /* LOCERR_AGAIN */ else { PDEBUGPRINTFX(DBG_ERROR,( "- Operation %s failed with SyncML status=%hd", SyncOpNames[syncitemP->getSyncOp()], sta )); } } // if startDataWrite ok // anyway, we are done with this item, delete it now delete syncitemP; if (syncitemP != origSyncItemP) delete origSyncItemP; TP_START(fSessionP->fTPInfo,li); // done, return regular/irregular status return (sta==LOCERR_OK) && !irregular; } SYSYNC_CATCH (...) // delete the item if (syncitemP) delete syncitemP; if (syncitemP != origSyncItemP) delete origSyncItemP; TP_START(fSessionP->fTPInfo,li); // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH #ifndef __BORLANDC__ return false; // BCPPB: unreachable code #endif } // TStdLogicDS::logicProcessRemoteItem // Abort datastore sync void TStdLogicDS::dsAbortDatastoreSync(TSyError aReason, bool aLocalProblem) { // call anchestor inherited::dsAbortDatastoreSync(aReason, aLocalProblem); } // TStdLogicDS::dsAbortDatastoreSync // inform logic of coming state change localstatus TStdLogicDS::dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { localstatus sta=LOCERR_OK; if (aNewState==dssta_dataaccessstarted) { // start data access if (IS_CLIENT) { #ifdef SYSYNC_CLIENT sta = startDataAccessForClient(); #endif } else { #ifdef SYSYNC_SERVER sta = startDataAccessForServer(); #endif } } if (IS_CLIENT) { if (aNewState==dssta_syncgendone) { // when client has done sync gen, start writing sta = startDataWrite(); } } // client #ifdef SYSYNC_SERVER if (aNewState==dssta_serverseenclientmods) { // Can only happen in server. Implement removal of unmatched items // when in caching mode. if (fCacheData && fSlowSync) { TSyncItemPContainer::iterator pos=fItems.begin(); while (pos!=fItems.end()) { TSyncItem *syncitemP = (*pos); if (syncitemP->getSyncOp() == sop_wants_add) { PDEBUGPRINTFX(DBG_DATA,("caching mode: remove unmatched item %s", syncitemP->getLocalID())); syncitemP->setSyncOp(sop_delete); localstatus status = logicDeleteItemByID(*syncitemP); if (status != LOCERR_OK) { return status; } else { TSyncItemPContainer::iterator next = pos; ++next; delete syncitemP; fItems.erase(pos); pos = next; fLocalItemsDeleted++; } } else { ++pos; } } } } #endif // SYSYNC_SERVER if (aNewState==dssta_completed && !isAborted()) { // finish writing data now anyway endDataWrite(); // we must save anchors at the moment we shift from any state to dssta_completed PDEBUGPRINTFX(DBG_ADMIN,("TStdLogicDS: successfully completed, save anchors now")); // update our level's state fPreviousSyncTime = fCurrentSyncTime; // let implementation update their state and save it sta=implSaveEndOfSession(true); if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("TStdLogicDS: Could not save session completed status, err=%hd",sta)); } } if (aNewState==dssta_idle && aOldState>=dssta_syncsetready) { // again: make sure data is written anyway (if already done this is a NOP) endDataWrite(); } // abort on error if (sta!=LOCERR_OK) return sta; // let inherited do its stuff as well return inherited::dsBeforeStateChange(aOldState,aNewState); } // TStdLogicDS::dsBeforeStateChange // inform logic of happened state change localstatus TStdLogicDS::dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState) { localstatus sta=LOCERR_OK; if (aNewState==dssta_dataaccessdone) { // finish writing data now endDataWrite(); } // abort on error if (sta!=LOCERR_OK) return sta; // let inherited do its stuff as well return inherited::dsAfterStateChange(aOldState,aNewState); } // TStdLogicDS::dsAfterStateChange /** @deprecated obsolete, replaced by stuff in dsBeforeStateChange() // called at very end of sync session, when all map commands are done, too // Note: is also called before deleting a datastore (so aborted sessions // can do cleanup and/or statistics display as well) void TStdLogicDS::endOfSync(bool aRegular) { // save new sync anchor now // NOTE: gets called even if not active if (fState!=dss_idle) { PDEBUGPRINTFX(DBG_ADMIN,("TStdLogicDS::endOfSync, %sregular end of sync session",aRegular ? "" : "ir")); if (!aRegular) fRollback=true; // do not write irregular ends // datastore was active in sync, end it now if (!fRollback) { fRollback=!startWrite(); if (!fRollback) { fRollback=!SaveAnchor(fNextRemoteAnchor.c_str()); } } #ifdef SYDEBUG if (fRollback) DEBUGPRINTFX(DBG_ERROR,("************** Datastore error, rolling back transaction")); #endif // if session is complete, we can't resume it any more, so clear that status now if (!fRollback) { fResumeAlertCode=0; // no resume } // end writing now, sync is done endWrite(); } // let ancestor do its things TLocalEngineDS::endOfSync(aRegular); } // TStdLogicDS::endOfSync */ } // namespace sysync /* end of TStdLogicDS implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/stdlogicds.h0000755000373300037200000004216012424517753025163 0ustar00nightlyallusers00000000000000/** * @File stdlogicds.h * * @Author Lukas Zeller (luz@plan44.ch) * * @brief TStdLogicDS * Standard database logic implementation, suitable for most (currently all) * actual DS implementations, but takes as few assumptions about datastore * so for vastly different sync patterns, this could be replaced by differnt locic * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * @Date 2005-09-15 : luz : created from custdbdatastore */ /* */ #ifndef TStdLogicDS_H #define TStdLogicDS_H // includes #include "sysync.h" #include "syncappbase.h" #include "localengineds.h" #ifdef MULTI_THREAD_DATASTORE #include "platform_thread.h" #endif #if defined(CLIENT_USES_SERVER_DB) #define USES_SERVER_DB 1 #define HAS_SERVER_DB 1 #else #ifdef SERVER_SUPPORT #define USES_SERVER_DB 1 #endif #define HAS_SERVER_DB IS_SERVER #endif using namespace sysync; namespace sysync { // container for TSyncItem pointers typedef std::list TSyncItemPContainer; // contains data items /// @brief standard logic datastore /// - only called directly by TLocalEngineDS via logicXXXX virtuals. /// - to perform actual access to implementation, this class calls its (mostly abstract) /// implXXXX virtuals. class TStdLogicDS: public TLocalEngineDS { typedef TLocalEngineDS inherited; private: bool fWriteStarted; ///< set if write has started #ifdef SYSYNC_CLIENT bool fEoC; ///< end of changes #if defined(CLIENT_USES_SERVER_DB) && !defined(SYSYNC_SERVER) TSyncItemPContainer fItems; ///< list of data items, used to simulate maps in server DB #endif #endif #ifdef SYSYNC_SERVER TSyncItemPContainer fItems; ///< list of data items uInt32 fNumRefOnlyItems; #endif // startSync/threading privates bool fInitializing; bool fStartInit; bool fMultiThread; // copied flag from sessionConfig protected: /// @name dsSavedAdmin administrative data (anchors, timestamps, maps) as saved or to-be-saved /// @Note These will be loaded and saved be derived classes /// @Note Some of these will be updated from resp. @ref dsCurrentAdmin members at distinct events (suspend, session end, etc.) /// @Note Some of these will be updated during the session, but in a way that does NOT affect the anchoring of current/last session // /// @{ // - TStdLogicDS is timestamp-based, so we save timestamps of the previous session lineartime_t fPreviousSyncTime; ///< time of previous sync (used to generate local anchor string representing previous sync) /// @} /// @name dsCurrentAdmin current session's admin data (anchors, timestamps, maps) /// @Note These will be copied to @ref dsSavedAdmin members ONLY when a session completes successfully/suspends. /// @Note Admin data is NEVER directly saved or loaded from these /// @Note Derivates will update some of these at dssta_adminready with current time/anchor values // /// @{ // - TStdLogicDS is timestamp-based, so we get timestamp to anchor this session lineartime_t fCurrentSyncTime; ///< anchoring timestamp of this, currently running sync. /// @} private: /// internally reset for re-use without re-creation void InternalResetDataStore(void); public: /// constructor TStdLogicDS( TLocalDSConfig *aDSConfigP, sysync::TSyncSession *aSessionP, const char *aName, long aCommonSyncCapMask=0); virtual ~TStdLogicDS(); public: /// @name dsProperty property and state querying methods /// @{ /// check is datastore is completely started. /// @param[in] aWait if set, call will not return until either started state is reached /// or cannot be reached within the maximally allowed request processing time left. virtual bool isStarted(bool aWait); /// @} protected: /// @name dsXXXX (usually abstract) virtuals defining the interface to derived datastore classes (implementation, api) /// These are usually designed such that they should always call inherited::dsXXX to let the entire chain /// of ancestors see the calls /// @{ // /// reset datastore to a re-usable, like new-created state. virtual void dsResetDataStore(void) { InternalResetDataStore(); inherited::dsResetDataStore(); }; /// abort datastore (no reset yet, everything is just frozen as it is) virtual void dsAbortDatastoreSync(TSyError aStatusCode, bool aLocalProblem); /// inform logic of coming state change virtual localstatus dsBeforeStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); /// inform logic of happened state change virtual localstatus dsAfterStateChange(TLocalEngineDSState aOldState,TLocalEngineDSState aNewState); #ifdef SYSYNC_SERVER // - called when a item in the sync set changes its localID (due to local DB internals) // Datastore must make sure that possibly cached items get updated virtual void dsLocalIdHasChanged(const char *aOldID, const char *aNewID); #endif /// @} /// @name logicXXXX methods defining the interface to TLocalEngineDS. /// Only these will be called by TLocalEnginDS /// @Note some of these are virtuals ONLY for being derived by superdatastore, NEVER by locic or other derivates /// We use the SUPERDS_VIRTUAL macro for these, which is empty in case we don't have superdatastores, then /// these can be non-virtual. /// @{ // /// called to make admin data ready /// - might be called several times (auth retries at beginning of session) virtual localstatus logicMakeAdminReady(cAppCharP aDataStoreURI, cAppCharP aRemoteDBID); /// called to have all non-yet-generated sync commands as "to-be-resumed" virtual void logicMarkOnlyUngeneratedForResume(void); /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void logicMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent); /// called to mark an already sent item as "to-be-resent", e.g. due to temporary /// error status conditions, by localID or remoteID (latter only in server case). virtual void logicMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID); /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume(), markItemForResume() and markItemForResend()) /// (or, in case the session is really complete, make sure that no resume state is left) /// @note Must also save tempGUIDs (for server) and pending/unconfirmed maps (for client) virtual localstatus logicSaveResumeMarks(void); /// called to process incoming item operation /// @note Method must take ownership of syncitemP in all cases virtual bool logicProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand, bool &aVisibleInSyncset, ///< on entry: tells if resulting item SHOULD be visible; on exit: set if processed item remains visible in the sync set. string *aGUID=NULL ///< GUID is stored here if not NULL ); /// called to read a specified item from the server DB (not restricted to set of conflicting items) virtual bool logicRetrieveItemByID( TSyncItem &aSyncItem, ///< item to be filled with data from server. Local or Remote ID must already be set TStatusCommand &aStatusCommand ///< status, must be set on error or non-200-status ); /// delete existing item in datastore, returns 211 if not existing any more virtual localstatus logicDeleteItemByID(TSyncItem &aSyncItem) = 0; /// @} /// @name implXXXX methods defining the interface to TStdLogicDS. /// Only these will be called by TLocalEngineDS /// @Note some of these are virtuals ONLY for being derived by superdatastore, NEVER by locic or other derivates /// We use the SUPERDS_VIRTUAL macro for these, which is empty in case we don't have superdatastores, then /// these can be non-virtual. /// @{ // /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume() and markItemForResume()) /// (or, in case the session is really complete, make sure that no resume state is left) /// @note Must also save tempGUIDs (for server) and pending/unconfirmed maps (for client) virtual localstatus implSaveResumeMarks(void) = 0; // - called to have all non-yet-generated sync commands as "to-be-resumed" virtual void implMarkOnlyUngeneratedForResume(void) = 0; /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void implMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) = 0; /// called to mark an already sent item as "to-be-resent", e.g. due to temporary /// error status conditions, by localID or remoteID (latter only in server case). virtual void implMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) = 0; /// sync login (into this database) /// @note might be called several times (auth retries at beginning of session) /// @note must update the following state variables /// - in TLocalEngineDS: fLastRemoteAnchor, fLastLocalAnchor, fResumeAlertCode, fFirstTimeSync /// - for client: fPendingAddMaps /// - for server: fTempGUIDMap /// - in TStdLogicDS: fPreviousSyncTime, fCurrentSyncTime /// - in derived classes: whatever else belongs to dsSavedAdmin and dsCurrentAdmin state virtual localstatus implMakeAdminReady( const char *aDeviceID, ///< @param[in] remote device URI (device ID) const char *aDatabaseID, ///< @param[in] database ID const char *aRemoteDBID ///< @param[in] database ID of remote device ) = 0; /// start data read /// @note: fSlowSync and fRefreshOnly must be valid before calling this method virtual localstatus implStartDataRead() = 0; /// get item from DB virtual localstatus implGetItem( bool &aEof, ///< set if no more items bool &aChanged, ///< if set on entry, only changed items will be reported, otherwise all will be returned and aChanged denotes if items has changed or not TSyncItem* &aSyncItemP ///< will receive the item ) = 0; /// end of read virtual localstatus implEndDataRead(void) = 0; /// start of write virtual localstatus implStartDataWrite(void) = 0; /// Returns true when DB can track syncop changes (i.e. having the DB report /// items as added again when stdlogic filters have decided they fell out of the syncset, /// and has announced this to the DB using implReviewReadItem(). virtual bool implTracksSyncopChanges(void) { return false; }; // derived DB class needs to confirm true if /// review reported entry (allows post-processing such as map deleting) /// MUST be called after implStartDataWrite, before any actual writing, /// for each item obtained in implGetItem virtual localstatus implReviewReadItem( TSyncItem &aItem ///< the item ) = 0; #ifdef SYSYNC_SERVER /// called to set maps. /// @note aLocalID or aRemoteID can be NULL - which signifies deletion of a map entry /// @note that this might be needed for clients accessing a server-style database as well virtual localstatus implProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) = 0; #endif /// called to read a specified item from the server DB (not restricted to set of conflicting items) virtual bool implRetrieveItemByID( TSyncItem &aSyncItem, ///< item to be filled with data from server. Local or Remote ID must already be set TStatusCommand &aStatusCommand ///< status, must be set on error or non-200-status ) = 0; /// process item (according to operation: add/delete/replace/map) virtual bool implProcessItem( TSyncItem *aItemP, ///< the item TStatusCommand &aStatusCommand ) = 0; /// save end of session state virtual localstatus implSaveEndOfSession(bool aUpdateAnchors) = 0; /// end write sequence virtual bool implEndDataWrite(void) = 0; /// @} private: /// @name dsHelpers /// internal, private helper methods #ifdef SYSYNC_CLIENT /// called by dsBeforeStateChange to dssta_dataaccessstarted to make sure datastore is ready for being accessed. virtual localstatus startDataAccessForClient(void); #endif #ifdef SYSYNC_SERVER /// called by dsBeforeStateChange to dssta_dataaccessstarted to make sure datastore is ready for being accessed. virtual localstatus startDataAccessForServer(void); #endif /// @} protected: // - helper to merge database version of an item with the passed version of the same item TMultiFieldItem *mergeWithDatabaseVersion(TSyncItem *aSyncItemP, bool &aChangedDBVersion, bool &aChangedNewVersion); #ifdef SYSYNC_SERVER // - check if conflicting item already exist in list of items-to-be-sent-to-client virtual TSyncItem *getConflictingItemByRemoteID(TSyncItem *syncitemP); virtual TSyncItem *getConflictingItemByLocalID(TSyncItem *syncitemP); // - called to check if content-matching item from server exists virtual TSyncItem *getMatchingItem(TSyncItem *syncitemP, TEqualityMode aEqMode); // - called to prevent item to be sent to client in subsequent logicGenerateSyncCommandsAsServer() // item in question should be an item that was returned by getConflictingItemByRemoteID() or getMatchingItem() virtual void dontSendItemAsServer(TSyncItem *syncitemP); // - called to have additional item sent to remote (DB takes ownership of item) virtual void SendItemAsServer(TSyncItem *aSyncitemP); private: // - end map operation (rollback if not aDoCommit) virtual bool MapFinishAsServer( bool aDoCommit, // if not set, entire map operation must be undone TStatusCommand &aStatusCommand // status, must be set on error or non-200-status ); /// called to generate sync sub-commands as client for remote server /// @return true if now finished for this datastore virtual bool logicGenerateSyncCommandsAsServer( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, cAppCharP aLocalIDPrefix ); /// called for servers when receiving map from client /// @note aLocalID or aRemoteID can be NULL - which signifies deletion of a map entry virtual localstatus logicProcessMap(cAppCharP aLocalID, cAppCharP aRemoteID); #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT /// called to generate sync sub-commands as server for remote client /// @return true if now finished for this datastore virtual bool logicGenerateSyncCommandsAsClient( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, cAppCharP aLocalIDPrefix ); #endif // SYSYNC_CLIENT // - determine if this is a first time sync situation virtual bool isFirstTimeSync(void) { return fFirstTimeSync; }; protected: // - called for SyncML 1.1 if remote wants number of changes. // Must return -1 no NOC value can be returned // NOTE: we implement it here only for server, as it is not really needed // for clients normally - if it is needed, client's agent must provide // it as CustDBDatastore has no own list it can use to count in client case. virtual sInt32 getNumberOfChanges(void); public: // Simple custom DB access interface methods // - returns true if database implementation can only update all fields of a record at once virtual bool dsReplaceWritesAllDBFields(void) { return false; } // we assume DB is smart enough #ifdef OBJECT_FILTERING // - returns true if DB implementation can filter during database fetch // (otherwise, fetched items must be filtered after being read from DB) virtual bool dsFilteredFetchesFromDB(bool aFilterChanged=false) { return false; } // assume unfiltered data from DB #endif private: /// internal stdlogic: start writing if not already started localstatus startDataWrite(void); /// internal stdlogic: end writing if not already ended localstatus endDataWrite(void); public: // - must be called before starting a thread. If returns false, starting a thread now // is not allowed and must be postponed. virtual bool startingThread(void) { return true; }; // - must be called when a thread's activity has ended // BUT THE CALL MUST BE FROM THE ENDING THREAD, not the main thread! virtual void endingThread(void) {}; // - should be called before doing DB accesses that might be locked (e.g. because another thread is using the DB resources) virtual bool dbAccessLocked(void) { return false; }; // - Actual start sync actions in DB. If server supports threaded init, this will // be called in a sub-thread's context localstatus performStartSync(void); #ifdef MULTI_THREAD_DATASTORE TStatusCommand fStartSyncStatus; // a thread-private status command to store status ocurring during threaded startSync() #endif private: // - can be called to check if performStartSync() should be terminated bool shouldExitStartSync(void); #ifdef MULTI_THREAD_DATASTORE bool threadedStartSync(void); TThreadObject fStartSyncThread; // the wrapper object for the startSync thread #endif }; // TStdLogicDS } // namespace sysync #endif // TStdLogicDS_H // eof syncevolution-1.5/src/synthesis/src/sysync/stringutils.cpp0000755000373300037200000005633512424517753025757 0ustar00nightlyallusers00000000000000/* * File: stringutils.cpp * * Authors: Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * C++ string utils * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2002-05-01 : luz : extracted from sysync_utils */ #include "prefix_file.h" #include "stringutils.h" // Consistent support for Linux, MacOSX CW & XCode #if defined __GNUC__ || defined _MSC_VER #include #else #include #endif #include #include #include using namespace std; namespace sysync { #ifdef NO_VSNPRINTF // dummy (unsafe!!) map to vsprintf int vsnprintf(char *s, int sz, const char *formatStr, va_list arg) { return vsprintf(s,formatStr,arg); } // vsnprintf #endif #ifdef NO_SNPRINTF // own implementation (possibly unsafe, if vsnprintf is dummy) int snprintf(char *s, int sz, const char *formatStr, ...) { va_list args; va_start(args, formatStr); // now make the string int n=vsnprintf(s,sz,formatStr,args); va_end(args); return n; } // snprintf #endif /// @brief Return passed pointer as C string, if pointer is NULL, empty string is returned /// @param[in] aStr a C string or NULL /// @return if aStr is NULL, returns empty string, aStr otherwise const char *alwaysCStr(const char *aStr) { return aStr ? aStr : ""; } // alwaysCStr // Assign char ptr to string object // NOTE: NULL is allowed and means empty string void AssignString(string &aString, const char *aCharP) { if (aCharP) aString=aCharP; else aString.erase(); } // AssignString // Assign char ptr to char array of size aLen (note that we always leave room for terminator) // NOTE: NULL is allowed and means empty string void AssignCString(char *aCStr, const char *aCharP, size_t aLen) { if (aCharP) { strncpy(aCStr,aCharP,aLen-1); aCStr[aLen-1]=0; // make sure it is terminated } else aCStr[0]=0; } // AssignCString // trim leading spaces/ctrls and everything including and after the next space/ctrl void AssignTrimmedCString(char *aCStr, const char *aCharP, size_t aLen) { if (aCharP) { // not empty, find first non-control/space while (*aCharP && (uInt8)(*aCharP)<=0x20) aCharP++; // now find end const char *e = aCharP; while (*e && (uInt8)(*e)>0x20) e++; // copy valid part of URL size_t n=e-aCharP; if (n>aLen-1) n=aLen-1; // limit to max buffer size strncpy(aCStr,aCharP,n); aCStr[n]=0; // make sure it is terminated } else aCStr[0]=0; } // AssignTrimmedCString // save mangled into C-string buffer uInt16 assignMangledToCString(char *aCString, const char *aCode, uInt16 aMaxBytes, bool aIsName, uInt8 aMangleInc, const char *aSecondKey) { uInt8 mangler=aMangleInc; uInt16 b,bytes=0; uInt8 c; const char *kp = aSecondKey && *aSecondKey ? aSecondKey : NULL; // need at least once char of key while(aCode && *aCode && bytes=0x20)) || (!aIsName && isalnum(c))) { // save only visible chars and spaces from name and alphanums from code *(aCString++)= c ^ mangler ^ (kp ? *(kp++) : 0); // add mangled if (kp && *kp==0) kp=aSecondKey; // wrap around mangler+=aMangleInc; bytes++; } } // add terminator in all cases *aCString++=mangler ^ (kp ? *(kp++) : 0); if (kp && *kp==0) kp=aSecondKey; // wrap around bytes++; // now add some garbage to disguise length of actual data b=bytes; while (b 0 && aMangled && (c=((uInt8)(*aMangled) ^ mangler ^ (kp ? *(kp++) : 0)))) { aString += (char)c; if (kp && *kp==0) kp=aSecondKey; // wrap around aMangled++; mangler+=aMangleInc; } } // getUnmangled // get unmangled into buffer void getUnmangledAsBuf(appCharP aBuffer, uInt16 aBufSize, cAppCharP aMangled, uInt8 aMangleInc, cAppCharP aSecondKey) { uInt8 mangler=aMangleInc; uInt8 c; if (!aBuffer || aBufSize<1) return; // no buffer const char *kp = aSecondKey && *aSecondKey ? aSecondKey : NULL; // need at least once char of key aBuffer[--aBufSize]=0; // ultimate security terminator while (aBufSize-- > 0 && aMangled && (c=((uInt8)(*aMangled) ^ mangler ^ (kp ? *(kp++) : 0)))) { *(aBuffer++) = (char)c; if (kp && *kp==0) kp=aSecondKey; // wrap around aMangled++; mangler+=aMangleInc; } *(aBuffer) = 0; // terminate } // getUnmangled // case insensitive and whitespace trimming strcmp, NULL allowed as empty string input sInt16 strutrimcmp(const char *s1, const char *s2) { // skip whitespace on both strings first while (s1 && *s1 && isspace(*s1)) ++s1; while (s2 && *s2 && isspace(*s2)) ++s2; // count number of non-whitespaces sInt32 n1=0; while (s1 && s1[n1] && !isspace(s1[n1])) ++n1; sInt32 n2=0; while (s2 && s2[n2] && !isspace(s2[n2])) ++n2; // now compare return strucmp(s1,s2,n1,n2); } // strutrimcmp // case insensitive strcmp which allow wildcards ? and * in s2, NULL allowed as empty string input sInt16 strwildcmp(const char *s1, const char *s2, size_t len1, size_t len2) { // allow NULL as empty strings if (!s1) s1 = ""; if (!s2) s2 = ""; // s1>s2 : 1, s1==s2 : 0, s1len2 ? len2 : len1)); for (i=0; (!len || i full match return 0; } // next attempt s1++; j++; } // no match if we get this far return 1; } else if (*s2!='?' && toupper(*s1)!=toupper(*s2)) return toupper(*s1)>toupper(*s2) ? 1 : -1; // different and no wildcard in pattern at this place // next s1++; s2++; } // equal up to end of shorter string or reached len // - if both reached end or len if (len1 ? i==len1 : *s1==0) { // s1 has reached end, check special case that pattern ends with *, this would be ok if ((len==0 || i=slen)) return -1; // pattern too long to possibly match at all if (toupper(*(s+k))!=toupper(*pat)) break; // no match at this position pat++; } if (*pat==0 || (patlen && k>=patlen)) return i; // pattern end reached and all matches so far -> found string here // try next position s++; } return -1; // not found in any position } // strupos // case insensitive strcmp, NULL allowed as empty string input sInt16 strucmp(const char *s1, const char *s2, size_t len1, size_t len2) { // allow NULL as empty strings if (!s1) s1 = ""; if (!s2) s2 = ""; // s1>s2 : 1, s1==s2 : 0, s1len2 ? len2 : len1)); for (i=0; (!len || itoupper(*s2) ? 1 : -1; // different // next s1++; s2++; } // equal up to end of shorter string or reached len // - if both reached end or len -> equal if ( ((len1 ? i==len1 : false) || *s1==0) && ((len2 ? i==len2 : false) || *s2==0) ) return 0; // - not equal, longer string is larger // (if not reached end of s1 or stopped before len1, s1 is longer // but note than len1 can be longer than actual length of s1, so we // must check for *s1 to make sure we have really not reached end of s1) return (len1 ? is2 : 1, s1==s2 : 0, s1len2 ? len2 : len1)); for (i=0; (!len || i*s2 ? 1 : -1; // different // next s1++; s2++; } // equal up to end of shorter string or reached len // - if both reached end or len if ( ((len1 ? i==len1 : false) || *s1==0) && ((len2 ? i==len2 : false) || *s2==0) ) return 0; // - not equal, longer string is larger // (if not reached end of s1 or stopped before len1, s1 is longer // but note than len1 can be longer than actual length of s1, so we // must check for *s1 to make sure we have really not reached end of s1) return (len1 ? i0) return "Yes"; else return "No"; } const char *boolString(bool aBool) { if (aBool) return "Yes"; else return "No"; } // returns true on successful conversion of string to enum bool StrToEnum(const char * const aEnumNames[], sInt16 aNumEnums, sInt16 &aShort, const char *aStr, sInt16 aLen) { const char *e; for (sInt16 k=0; k9) return 'A'-0x0A+aNibble; else return '0'+aNibble; } // NibbleToHexDigit // returns number of successfully converted chars sInt16 HexStrToUShort(const char *aStr, uInt16 &aShort, sInt16 aMaxDigits) { // our own implementation char c; sInt16 n=0; aShort=0; //firstly check aMaxDigits to avoid accessing invalid value of 'aStr' //This will cause a memory warning checked by valgrind while ((n'9' ? toupper(*p)-'A'+0x0A : *p-'0'); p++; n++; } break; } // c is the char to add } else if (aStopAtQuoteOrCtrl && (c=='"' || c<0x20)) { // terminating char is NOT consumed p--; break; // stop here } // otherwise, ignore any control characters else if (c<0x20 && c!=ignore) continue; // add it to the result if (c) aString+=c; } // return number of converted chars return p-aStr; } // CStrToStrAppend // add a hex byte to a string // Note: this is required because PalmOS sprintf does not correctly // work with %02X (always writes 4 digits!) void AppendHexByte(string &aString, uInt8 aByte) { aString += NibbleToHexDigit(aByte>>4); aString += NibbleToHexDigit(aByte); } // AppendHexByte // returns number of C-string-escaped chars successfully converted to string sInt16 StrToCStrAppend(const char *aStr, string &aString, bool aAllow8Bit, char ignore) { unsigned char c; const char *p=aStr; while ((c=*p++)) { // check for specials if (c==ignore) aString+= c; else if (c==0x09) aString+="\\t"; else if (c==0x0A) aString+="\\n"; else if (c==0x0D) aString+="\\r"; else if (c==0x22) aString+="\\\""; else if (c=='\\') aString+="\\\\"; // escape the backslash as well else if (c<0x20 || c==0x7F || (!aAllow8Bit && c>=0x80)) { aString += "\\x"; AppendHexByte(aString,c); } else { // as is aString+=c; } } // return number of converted chars return p-aStr; } // CStrToStrAppend // old-style C-formatted output into string object void vStringObjPrintf(string &aStringObj, const char *aFormat, bool aAppend, va_list aArgs) { #ifndef NO_VSNPRINTF const size_t bufsiz=128; #else const size_t bufsiz=2048; #endif ssize_t actualsize; char buf[bufsiz]; buf[0]='\0'; char *bufP = NULL; if (!aAppend) aStringObj.erase(); #ifndef NO_VSNPRINTF // using aArgs in vsnprintf() is destructive, need a copy in // case we call the function a second time va_list args; va_copy(args, aArgs); #endif actualsize = vsnprintf(buf, bufsiz, aFormat, aArgs); #ifndef NO_VSNPRINTF if (actualsize>=(ssize_t)bufsiz) { // default buffer was too small, create bigger dynamic buffer bufP = new char[actualsize+1]; actualsize = vsnprintf(bufP, actualsize+1, aFormat, args); if (actualsize>0) { aStringObj += bufP; } delete [] bufP; } else #endif { // small default buffer was big enough, add it if (actualsize<0) return; // abort, error aStringObj += buf; } #ifndef NO_VSNPRINTF va_end(args); #endif } // vStringObjPrintf // old-style C-formatted output into string object void StringObjPrintf(string &aStringObj, const char *aFormat, ...) { va_list args; va_start(args, aFormat); // now make the string vStringObjPrintf(aStringObj,aFormat,false,args); va_end(args); } // StringObjPrintf // old-style C-formatted output appending into string object void StringObjAppendPrintf(string &aStringObj, const char *aFormat, ...) { va_list args; va_start(args, aFormat); // now make the string vStringObjPrintf(aStringObj,aFormat,true,args); va_end(args); } // StringObjAppendPrintf } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync/stringutils.h0000755000373300037200000001375012424517753025416 0ustar00nightlyallusers00000000000000/* * File: stringutils.h * * Authors: Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * C++ string utils * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2002-05-01 : luz : extracted from sysync_utils */ #ifndef STRINGUTILS_H #define STRINGUTILS_H #include #ifdef __EPOC_OS__ #include #include #else #include #include #endif #include #ifdef ANDROID #include #endif #include "generic_types.h" using namespace std; namespace sysync { // PALM OS specifics #ifdef __PALM_OS__ // StrVPrintF handles a subset of ANSI vsprintf, but normal cases are available #define vsprintf StrVPrintF #define sprintf StrPrintF // PalmOS 3.5 does not have strncmp, use our own enhanced strnncmp #define strncmp sysync::strnncmp // PalmOS does not have vnsprintf, we need to simulate them #define NO_VSNPRINTF #define NO_SNPRINTF #endif #if defined(WINCE) || defined(_MSC_VER) || defined(__EPOC_OS__) // WinCE and Symbian do not have vsnprintf, as well as Visual Studio #define NO_VSNPRINTF #define NO_SNPRINTF #endif #ifdef NO_VSNPRINTF int vsnprintf(char *s, int sz, const char *formatStr, va_list arg); #endif #ifdef NO_SNPRINTF int snprintf(char *s, int sz, const char *formatStr, ...); #endif /// @brief Return passed pointer as C string, if pointer is NULL, empty string is returned const char *alwaysCStr(const char *aStr); // Assign char ptr to string object // NOTE: NULL is allowed and means empty string void AssignString(string &aString, const char *aCharP); // Assign char ptr to char array // NOTE: NULL is allowed and means empty string void AssignCString(char *aCStr, const char *aCharP, size_t aLen); // trim leading spaces/ctrls and everything including and after the next space/ctrl // NOTE: NULL is allowed and means empty string void AssignTrimmedCString(char *aCStr, const char *aCharP, size_t aLen); // standard mangling increment #define SYSER_NAME_MANGLEINC 43 // save mangled into C-string buffer uInt16 assignMangledToCString(appCharP aCString, cAppCharP aCode, uInt16 aMaxBytes, bool aIsName, uInt8 aMangleInc=SYSER_NAME_MANGLEINC, cAppCharP aSecondKey=NULL); // get unmangled into string void getUnmangled(string &aString, cAppCharP aMangled, uInt16 aMaxChars=100, uInt8 aMangleInc=SYSER_NAME_MANGLEINC, cAppCharP aSecondKey=NULL); // get unmangled into buffer void getUnmangledAsBuf(appCharP aBuffer, uInt16 aBufSize, cAppCharP aMangled, uInt8 aMangleInc=SYSER_NAME_MANGLEINC, cAppCharP aSecondKey=NULL); // Note: NULL allowed as empty string input for struXXX // case insensitive and whitespace trimming strcmp sInt16 strutrimcmp(const char *s1, const char *s2); // case insensitive strcmp which allow wildcards ? and * in s2, NULL allowed as empty string input sInt16 strwildcmp(const char *s1, const char *s2, size_t len1=0, size_t len2=0); // case insensitive strpos, returns -1 if not found sInt32 strupos(const char *s, const char *pat, size_t slen=0, size_t patlen=0); // case insensitive strcmp sInt16 strucmp(const char *s1, const char *s2, size_t len1=0, size_t len2=0); // byte by byte strcmp // Note: is compatible with standard strncmp if len2 is left unspecified sInt16 strnncmp(const char *s1, const char *s2, size_t len1=0, size_t len2=0); // testing #ifdef SYNTHESIS_UNIT_TEST bool test_strwildcmp(void); #endif // parser for tag="value" type string format cAppCharP nextTag(cAppCharP aTagString, string &aTag, string &aTagValue); // direct conversion of value (usually from nextTag()) into uInt16 uInt16 uint16Val(cAppCharP aValue); // direct conversion of value (usually from nextTag()) into uInt32 uInt32 uint32Val(cAppCharP aValue); // direct conversion of value (usually from nextTag()) into bool bool boolVal(cAppCharP aValue); // returns true on successful conversion of string to bool bool StrToBool(const char *aStr, bool &aBool); // returns true on successful conversion of string to enum bool StrToEnum(const char * const aEnumNames[], sInt16 aNumEnums, sInt16 &aShort, const char *aStr, sInt16 aLen=0); const char *tristateString(sInt8 aTristate); const char *boolString(bool aBool); // return number of successfully converted chars // Note: despite the names these functions take *fixed-size* integers sInt16 StrToUShort(const char *aStr, uInt16 &aShort, sInt16 aMaxDigits=100); sInt16 StrToShort(const char *aStr, sInt16 &aShort, sInt16 aMaxDigits=100); sInt16 StrToULong(const char *aStr, uInt32 &aLong, sInt16 aMaxDigits=100); sInt16 StrToLong(const char *aStr, sInt32 &aLong, sInt16 aMaxDigits=100); sInt16 StrToULongLong(const char *aStr, uInt64 &aLongLong, sInt16 aMaxDigits=100); sInt16 StrToLongLong(const char *aStr, sInt64 &aLongLong, sInt16 aMaxDigits=100); sInt16 HexStrToUShort(const char *aStr, uInt16 &aShort, sInt16 aMaxDigits=100); sInt16 HexStrToULong(const char *aStr, uInt32 &aLong, sInt16 aMaxDigits=100); sInt16 HexStrToULongLong(const char *aStr, uInt64 &aLongLong, sInt16 aMaxDigits=100); sInt16 HexStrToUIntPtr(const char *aStr, uIntPtr &aIntPtr, sInt16 aMaxDigits=100); #ifndef NO_FLOATS sInt16 StrToDouble(const char *aStr, double &aDouble, sInt16 aMaxDigits=100); #endif sInt16 CStrToStrAppend(const char *aStr, string &aString, bool aStopAtQuoteOrCtrl=false, char ignore='\0'); sInt16 StrToCStrAppend(const char *aStr, string &aString, bool aAllow8Bit=false, char ignore='\0'); // makes hex char out of nibble char NibbleToHexDigit(uInt8 aNibble); // add a hex byte to a string void AppendHexByte(string &aString, uInt8 aByte); // old-style C-formatted output into string object void vStringObjPrintf(string &aStringObj, const char *aFormat, bool aAppend, va_list aArgs); // old-style C-formatted output into string object void StringObjPrintf(string &aStringObj, const char *aFormat, ...) #ifdef __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; void StringObjAppendPrintf(string &aStringObj, const char *aFormat, ...) #ifdef __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; } // namespace sysync #endif // STRINGUTILS_H syncevolution-1.5/src/synthesis/src/sysync/superdatastore.cpp0000755000373300037200000014557512424517753026442 0ustar00nightlyallusers00000000000000/* * File: SuperDataStore.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSuperDataStore * "Virtual" datastore consisting of an union of other * datastores, for example a vCal datastore based on * two separate vEvent and vTodo datastores. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-08-05 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "syncappbase.h" #include "superdatastore.h" #ifdef SUPERDATASTORES using namespace sysync; // sub-datastore link config // ========================= // config constructor TSubDSLinkConfig::TSubDSLinkConfig(TLocalDSConfig *aLocalDSConfigP, TConfigElement *aParentElementP) : TConfigElement(aLocalDSConfigP->getName(),aParentElementP) { clear(); fLinkedDSConfigP=aLocalDSConfigP; } // TSubDSLinkConfig::TSubDSLinkConfig // config destructor TSubDSLinkConfig::~TSubDSLinkConfig() { clear(); } // TSubDSLinkConfig::~TSubDSLinkConfig // init defaults void TSubDSLinkConfig::clear(void) { // init defaults fDispatchFilter.erase(); fGUIDPrefix.erase(); // clear inherited inherited::clear(); } // TSubDSLinkConfig::clear #ifndef HARDCODED_CONFIG // remote rule config element parsing bool TSubDSLinkConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - identification of remote if (strucmp(aElementName,"dispatchfilter")==0) expectString(fDispatchFilter); else if (strucmp(aElementName,"guidprefix")==0) expectString(fGUIDPrefix); // - not known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TSubDSLinkConfig::localStartElement #endif // superdatastore config // ===================== TSuperDSConfig::TSuperDSConfig(const char* aName, TConfigElement *aParentElement) : TLocalDSConfig(aName,aParentElement) { clear(); } // TSuperDSConfig::TSuperDSConfig TSuperDSConfig::~TSuperDSConfig() { clear(); } // TSuperDSConfig::~TSuperDSConfig // init defaults void TSuperDSConfig::clear(void) { // init defaults // - no datastore links TSubDSConfigList::iterator pos; for(pos=fSubDatastores.begin();pos!=fSubDatastores.end();pos++) delete *pos; fSubDatastores.clear(); // clear inherited inherited::clear(); } // TSuperDSConfig::clear #ifndef HARDCODED_CONFIG // config element parsing bool TSuperDSConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - links to sub-datastores if (strucmp(aElementName,"contains")==0) { // definition of a new datastore const char* nam = getAttr(aAttributes,"datastore"); if (!nam) return fail("'contains' missing 'datastore' attribute"); // search sub-datastore TLocalDSConfig *subdscfgP = static_cast(getParentElement())->getLocalDS(nam); if (!subdscfgP) return fail("unknown datastore '%s' specified",nam); // create new datastore link TSubDSLinkConfig *dslinkcfgP = new TSubDSLinkConfig(subdscfgP,this); // - save in list fSubDatastores.push_back(dslinkcfgP); // - let element handle parsing expectChildParsing(*dslinkcfgP); } // - none known here else return TLocalDSConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TSuperDSConfig::localStartElement #endif // resolve void TSuperDSConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings // %%% tbd } // resolve inherited inherited::localResolve(aLastPass); } // TSuperDSConfig::localResolve // - create appropriate datastore from config, calls addTypeSupport as well TLocalEngineDS *TSuperDSConfig::newLocalDataStore(TSyncSession *aSessionP) { // Synccap defaults to normal set supported by the engine by default TSuperDataStore *sdsP = new TSuperDataStore(this,aSessionP,getName(),aSessionP->getSyncCapMask()); // add type support addTypes(sdsP,aSessionP); return sdsP; } // TLocalDSConfig::newLocalDataStore /* * Implementation of TSuperDataStore */ /* public TSuperDataStore members */ TSuperDataStore::TSuperDataStore(TSuperDSConfig *aDSConfigP, TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask) : TLocalEngineDS(aDSConfigP, aSessionP, aName, aCommonSyncCapMask) { // set config ptr fDSConfigP = aDSConfigP; if (!fDSConfigP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TSuperDataStore::TSuperDataStore called with NULL config","lds1"))); // reset first InternalResetDataStore(); // for server, all configured subdatastores are automatically linked in // (for client, only those that are active will be linked in at dsSetClientParams() time) if (IS_SERVER) { // create links to subdatastores TSubDSConfigList::iterator pos; for(pos=aDSConfigP->fSubDatastores.begin();pos!=aDSConfigP->fSubDatastores.end();pos++) { // add link addSubDatastoreLink(*pos,NULL); // search datastore } } } // TSuperDataStore::TSuperDataStore void TSuperDataStore::addSubDatastoreLink(TSubDSLinkConfig *aDSLinkConfigP, TLocalEngineDS *aDatastoreP) { TSubDatastoreLink link; // start not yet pending link.fStartPending = false; // set link to subdatastore's config link.fDSLinkConfigP = aDSLinkConfigP; if (aDatastoreP) link.fDatastoreLinkP = aDatastoreP; // we already know the datastore (for client, it might not yet be in session list of datastores) else link.fDatastoreLinkP = fSessionP->findLocalDataStore(link.fDSLinkConfigP->fLinkedDSConfigP); // find actual datastore by "handle" (= config pointer) // make sure datastore is instantiated if (!link.fDatastoreLinkP) { // instantiate now (should not happen on server, as all datastores are instantiated on a server anyway) link.fDatastoreLinkP=fSessionP->addLocalDataStore(link.fDSLinkConfigP->fLinkedDSConfigP); } // save link fSubDSLinks.push_back(link); // Important: We need to get the iterator now again, in case the list was empty before // (because the iterator set in InternalResetDataStore() is invalid because it was created for an empty list). fCurrentGenDSPos=fSubDSLinks.begin(); } void TSuperDataStore::InternalResetDataStore(void) { // init fFirstTimeSync=false; TSubDSLinkList::iterator pos; // cancel all pending starts for(pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fStartPending=false; } fSuperStartPending = false; // make sure this is set in case startSync() is not called before generateSyncCommands() fCurrentGenDSPos=fSubDSLinks.begin(); } // TSuperDataStore::InternalResetDataStore TSuperDataStore::~TSuperDataStore() { InternalResetDataStore(); } // TSuperDataStore::~TSuperDataStore // Session events, which need some distribution to subdatastores // ============================================================= // Methods overriding TLocalEngineDS // ---------------------------------- bool TSuperDataStore::canRestart() { TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (!pos->fDatastoreLinkP->canRestart()) { return false; } } return true; } // obtain Sync Cap mask, must be lowest common mask of all subdatastores uInt32 TSuperDataStore::getSyncCapMask(void) { // AND of all subdatastores uInt32 capmask = ~0; // all bits set TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { capmask = capmask & pos->fDatastoreLinkP->getSyncCapMask(); } return capmask; } // TSuperDataStore::getSyncCapMask bool TSuperDataStore::syncModeSupported(const std::string &mode) { TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (!pos->fDatastoreLinkP->syncModeSupported(mode)) { return false; } } return true; } void TSuperDataStore::getSyncModes(set &modes) { // Initialize with content from first subdatastore. TSubDSLinkList::iterator pos = fSubDSLinks.begin(); if (pos!=fSubDSLinks.end()) { pos->fDatastoreLinkP->getSyncModes(modes); ++pos; } // Remove any mode not found in any of the other subdatastores. while (pos!=fSubDSLinks.end() && !modes.empty()) { set b; pos->fDatastoreLinkP->getSyncModes(b); set::iterator it = modes.begin(); while (it != modes.end()) { if (b.find(*it) != b.end()) { ++it; } else { set::iterator del = it; ++it; modes.erase(del); } } pos++; } } // process Sync alert from remote party: check if alert code is supported, // check if slow sync is needed due to anchor mismatch // - server case: also generate appropriate Alert acknowledge command TAlertCommand *TSuperDataStore::engProcessSyncAlert( TSuperDataStore *aAsSubDatastoreOf, // if acting as subdatastore uInt16 aAlertCode, // the alert code const char *aLastRemoteAnchor, // last anchor of client const char *aNextRemoteAnchor, // next anchor of client const char *aTargetURI, // target URI as sent by remote, no processing at all const char *aIdentifyingTargetURI, // target URI that was used to identify datastore const char *aTargetURIOptions, // option string contained in target URI SmlFilterPtr_t aTargetFilter, // DS 1.2 filter, NULL if none const char *aSourceURI, // source URI TStatusCommand &aStatusCommand // status that might be modified ) { TAlertCommand *alertcmdP=NULL; TAlertCommand *subalertcmdP=NULL; TStatusCommand substatus(fSessionP); SYSYNC_TRY { // alert all subdatastores TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { subalertcmdP=pos->fDatastoreLinkP->engProcessSyncAlert( this, // as subdatastore of myself aAlertCode, // the alert code aLastRemoteAnchor, // last anchor of client aNextRemoteAnchor, // next anchor of client aTargetURI, // target URI as sent by remote, no processing at all aIdentifyingTargetURI, // target URI (without possible CGI) aTargetURIOptions, // filtering CGI (NULL or empty if none) aTargetFilter, // DS 1.2 filter, NULL if none aSourceURI, // source URI substatus // status that might be modified ); if (subalertcmdP) { // get rid of this, we don't need it (server case only, client case does not generate an alert command here anyway) delete subalertcmdP; } // check if processing alert had a problem // Notes: // - When we have a subalertcmdP here, it is the server case, which means a non-zero status code // (such as 508) at this point is ok and should not stop processing alerts. // Only in case we have no alert we need to check the status code and abort immediately if it's not ok. // - 508 can happen even in client for the rare case the server thinks anchors are ok, but client check // says they are not, so we need to exclude 508 here. if (!subalertcmdP && substatus.getStatusCode()!=0 && substatus.getStatusCode()!=508) { // basic problem with one of the subdatastores // - propagate error code aStatusCommand.setStatusCode(substatus.getStatusCode()); // - no alert to send return NULL; } // this one is pending for start pos->fStartPending=true; } // set flag to indicate this subdatastore has init pending // Now all subdatastores should be successfully alerted and have current anchor infos ready, // so we can call inherited (which will obtain combined anchors from our logicInitSyncAnchors) alertcmdP = inherited::engProcessSyncAlert( aAsSubDatastoreOf, // as indicated by caller (normally, superdatastore is not subdatastore of another superdatastore, but...) aAlertCode, // the alert code aLastRemoteAnchor, // last anchor of client aNextRemoteAnchor, // next anchor of client aTargetURI, // target URI as sent by remote, no processing at all aIdentifyingTargetURI, // target URI (without possible CGI) aTargetURIOptions, // filtering CGI (NULL or empty if none) aTargetFilter, // DS 1.2 filter, NULL if none aSourceURI, // source URI aStatusCommand // status that might be modified ); // entire superdatastore is pending for start fSuperStartPending=true; } SYSYNC_CATCH (...) // clean up locally owned objects if (alertcmdP) delete alertcmdP; if (subalertcmdP) delete subalertcmdP; SYSYNC_RETHROW; SYSYNC_ENDCATCH return alertcmdP; } // TSuperDataStore::engProcessSyncAlert // process status received for sync alert bool TSuperDataStore::engHandleAlertStatus(TSyError aStatusCode) { // show it to all subdatastores TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->engHandleAlertStatus(aStatusCode); } // all subdatastores have seen the alert status, so let superdatastore handle it as well return TLocalEngineDS::engHandleAlertStatus(aStatusCode); } // TSuperDataStore::engHandleAlertStatus // Set remote datastore for local void TSuperDataStore::engSetRemoteDatastore( TRemoteDataStore *aRemoteDatastoreP // the remote datastore involved ) { // set all subdatastores to (same) remote datastore as superdatastore itself TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->engSetRemoteDatastore(aRemoteDatastoreP); } // set in superdatastore as well TLocalEngineDS::engSetRemoteDatastore(aRemoteDatastoreP); } // TSuperDataStore::engSetRemoteDatastore // set Sync types needed for sending local data to remote DB void TSuperDataStore::setSendTypeInfo( TSyncItemType *aLocalSendToRemoteTypeP, TSyncItemType *aRemoteReceiveFromLocalTypeP ) { // set all subdatastores to (same) types as superdatastore itself TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->setSendTypeInfo(aLocalSendToRemoteTypeP,aRemoteReceiveFromLocalTypeP); } // set in superdatastore as well TLocalEngineDS::setSendTypeInfo(aLocalSendToRemoteTypeP,aRemoteReceiveFromLocalTypeP); } // TSuperDataStore::setSendTypeInfo // set Sync types needed for receiving remote data in local DB void TSuperDataStore::setReceiveTypeInfo( TSyncItemType *aLocalReceiveFromRemoteTypeP, TSyncItemType *aRemoteSendToLocalTypeP ) { // set all subdatastores to (same) types as superdatastore itself TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->setReceiveTypeInfo(aLocalReceiveFromRemoteTypeP,aRemoteSendToLocalTypeP); } // set in superdatastore as well TLocalEngineDS::setReceiveTypeInfo(aLocalReceiveFromRemoteTypeP,aRemoteSendToLocalTypeP); } // TSuperDataStore::setReceiveTypeInfo // init usage of datatypes set with setSendTypeInfo/setReceiveTypeInfo localstatus TSuperDataStore::initDataTypeUse(void) { localstatus sta=LOCERR_OK; // set all subdatastores to (same) types as superdatastore itself TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { sta = pos->fDatastoreLinkP->initDataTypeUse(); if (sta!=LOCERR_OK) return sta; // failed } // set in superdatastore as well return TLocalEngineDS::initDataTypeUse(); } // TSuperDataStore::initDataTypeUse // SYNC command bracket start (check credentials if needed) bool TSuperDataStore::engProcessSyncCmd( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // status that might be modified bool &aQueueForLater // will be set if command must be queued for later (re-)execution ) { // start sync for all subdatastores bool ok=true; bool doqueue; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { // Note: this will cause subdatastores to call their own startSync, // so we do NOT need to iterate over subdatastores in our startSync! doqueue=false; // if in init phase (entire superdatastore pending to start) // only call subdatastores that are still pending for start, too ok=true; if (!fSuperStartPending || pos->fStartPending) { ok=pos->fDatastoreLinkP->engProcessSyncCmd(aSyncP,aStatusCommand,doqueue); if (!doqueue) { // this one is now initialized. Do not do it again until all others are initialized, too pos->fStartPending=false; } else { // we must queue the entire command for later (but some subdatastores might be excluded then) aQueueForLater=true; // queue if one of the subdatastores needs it } } if (!ok) return false; } // start sync myself ok=TLocalEngineDS::engProcessSyncCmd(aSyncP,aStatusCommand,doqueue); if (doqueue) aQueueForLater=true; // queue if one of the subdatastores needs it // if we reach this w/o queueing, start is no longer pending if (!aQueueForLater) fSuperStartPending=false; // done return ok; } // TSuperDataStore::processSyncCmd // SYNC command bracket end (but another might follow in next message) bool TSuperDataStore::engProcessSyncCmdEnd(bool &aQueueForLater) { // signal sync end to all subdatastores bool ok=true; bool doqueue; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { doqueue=false; ok=pos->fDatastoreLinkP->engProcessSyncCmdEnd(doqueue); if (doqueue) aQueueForLater=true; // queue if one of the subdatastores needs it if (!ok) return false; } // signal it to myself ok=TLocalEngineDS::engProcessSyncCmdEnd(doqueue); if (doqueue) aQueueForLater=true; // queue if one of the subdatastores needs it return ok; } // TSuperDataStore::engProcessSyncCmdEnd #ifdef SYSYNC_SERVER // process map localstatus TSuperDataStore::engProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) { TSubDatastoreLink *linkP = NULL; localstatus sta = LOCERR_OK; // item has local ID, we can find datastore by prefix linkP = findSubLinkByLocalID(aLocalID); if (!linkP) { sta = 404; // not found goto done; } // let subdatastore process (and only show subDS part of localID) sta=linkP->fDatastoreLinkP->engProcessMap( aRemoteID, aLocalID+linkP->fDSLinkConfigP->fGUIDPrefix.size() ); done: return sta; } // TSuperDataStore::engProcessMap #endif // SYSYNC_SERVER // called to process incoming item operation // Method takes ownership of syncitemP in all cases // - returns true (and unmodified or non-200-successful status) if // operation could be processed regularily // - returns false (but probably still successful status) if // operation was processed with internal irregularities, such as // trying to delete non-existant item in datastore with // incomplete Rollbacks (which returns status 200 in this case!). bool TSuperDataStore::engProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand ) { bool regular=true; string datatext; #ifdef SYSYNC_SERVER TSyncItem *itemcopyP = NULL; #endif // show PDEBUGBLOCKFMT(( "SuperProcessItem", "Processing incoming item in superdatastore", "datastore=%s|SyncOp=%s|RemoteID=%s|LocalID=%s", getName(), SyncOpNames[syncitemP->getSyncOp()], syncitemP->getRemoteID(), syncitemP->getLocalID() )); // let appropriate subdatastore handle the command TSubDatastoreLink *linkP = NULL; TSyncOperation sop=syncitemP->getSyncOp(); string remid; TSubDSLinkList::iterator pos; #ifdef SYSYNC_SERVER if (IS_SERVER) { switch (sop) { // Server case case sop_wants_replace: case sop_replace: case sop_wants_add: case sop_add: // item has no local ID, we need to apply filters to item data PDEBUGPRINTFX(DBG_DATA,("Checkin subdatastore filters to find where it belongs")); linkP = findSubLinkByData(*syncitemP); if (!linkP) goto nods; PDEBUGPRINTFX(DBG_DATA,( "Found item belongs to subdatastore '%s'", linkP->fDatastoreLinkP->getName() )); // make sure item does not have a local ID (which would be wrong because of prefixes anyway) syncitemP->clearLocalID(); // remembert because we might need it below for move-replace remid=syncitemP->getRemoteID(); // let subdatastore process regular=linkP->fDatastoreLinkP->engProcessRemoteItem(syncitemP,aStatusCommand); // now check if replace was treated as add, if yes, this indicates // that this might be a move between subdatastores if ( (sop==sop_replace || sop==sop_wants_replace) && !fSlowSync && aStatusCommand.getStatusCode()==201 ) { // this is probably a move from another datastore by changing an attribute // that dispatches datastores (such as a vEvent changed to a vToDo) // - so we delete all items with this remote ID in all other datastores PDEBUGPRINTFX(DBG_DATA,("Replace could be a move between subdatastores, trying to delete all items with same remoteID in other subdatastores")); TStatusCommand substatus(fSessionP); for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (&(*pos) != linkP) { // all but original datastore substatus.setStatusCode(200); itemcopyP = new TSyncItem(); // - only remote ID and syncop are relevant, leave everything else empty itemcopyP->setRemoteID(remid.c_str()); itemcopyP->setSyncOp(sop_delete); // - now try to delete. This might fail if replace above wasn't a move // itemcopyP is consumed PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,( "Trying to delete item with remoteID='%s' from subdatastore '%s'", itemcopyP->getRemoteID(), linkP->fDatastoreLinkP->getName() )); regular=pos->fDatastoreLinkP->engProcessRemoteItem(itemcopyP,substatus); #ifdef SYDEBUG if (regular) { // deleted ok PDEBUGPRINTFX(DBG_DATA,( "Found item in '%s', deleted here (and moved to '%s')", pos->fDatastoreLinkP->getName(), linkP->fDatastoreLinkP->getName() )); } #endif } } PDEBUGPRINTFX(DBG_DATA,("End of (possible) move-replace between subdatastores")); regular=true; // fully ok, no matter if delete above has succeeded or not } goto done; case sop_archive_delete: case sop_soft_delete: case sop_delete: case sop_copy: // item has no local ID AND no data, only a remoteID: // we must try to read item or attempt to delete in all subdatastores by remoteID // until found in one of them // get an empty item of correct type to call logicRetrieveItemByID itemcopyP = getLocalReceiveType()->newSyncItem(getRemoteSendType(),this); // - only remote ID is relevant, leave everything else empty itemcopyP->setRemoteID(syncitemP->getRemoteID()); // try to find item in any of the subdatastores for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { linkP = &(*pos); // always start with 200 aStatusCommand.setStatusCode(200); // item deleted by a failed engProcessRemoteItem()? if (!syncitemP) { // recreate it for next attempt syncitemP = getLocalReceiveType()->newSyncItem(getRemoteSendType(),this); syncitemP->setRemoteID(itemcopyP->getRemoteID()); syncitemP->setSyncOp(sop); } if (sop!=sop_copy && linkP->fDatastoreLinkP->dsDeleteDetectsItemPresence()) { // attempt to delete, consuming original item on success regular=linkP->fDatastoreLinkP->engProcessRemoteItem(syncitemP,aStatusCommand); // must be ok AND not 404 (item not found) if (regular && aStatusCommand.getStatusCode()!=404) { PDEBUGPRINTFX(DBG_DATA,( "Item found in subdatastore '%s', deleted it there", linkP->fDatastoreLinkP->getName() )); // done goto done; } else { // syncitemP was deleted by engProcessRemoteItem() (for // example, in TStdLogicDS::logicProcessRemoteItem()), // so we must remember to recreate it from the copy for // another attempt if there is one syncitemP = NULL; } } else { // try to read first to determine whether the subdatastore contains the item; // necessary because the subdatastore is not able to report a 404 error in // the delete operation when the item does not exist PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,( "Trying to read item by remoteID='%s' from subdatastore '%s' to see if it is there", itemcopyP->getRemoteID(), linkP->fDatastoreLinkP->getName() )); regular=linkP->fDatastoreLinkP->logicRetrieveItemByID(*itemcopyP,aStatusCommand); // must be ok AND not 404 (item not found) if (regular && aStatusCommand.getStatusCode()!=404) { PDEBUGPRINTFX(DBG_DATA,( "Item found in subdatastore '%s', deleting it there", linkP->fDatastoreLinkP->getName() )); // now we can delete or copy, consuming original item regular=linkP->fDatastoreLinkP->engProcessRemoteItem(syncitemP,aStatusCommand); // done regular=true; goto done; } } } // none of the datastores could process this item --> error // - make sure delete reports 200 for incomplete-rollback-datastores if (aStatusCommand.getStatusCode()==404 && sop!=sop_copy) { // not finding an item for delete might be ok for remote... if (fSessionP->getSessionConfig()->fDeletingGoneOK) { // 404/410: item not found, could be because previous aborted session has // already committed deletion of that item -> behave as if delete was ok PDEBUGPRINTFX(DBG_DATA,("to-be-deleted item was not found, but do NOT report %hd",aStatusCommand.getStatusCode())); aStatusCommand.setStatusCode(200); } // ...but it is a internal irregularity, fall thru to return false } // is an internal irregularity regular=false; goto done; case sop_reference_only: case sop_move: case sop_none: case numSyncOperations: // nothing to do or shouldn't happen break; } // switch } // server #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT if (IS_CLIENT) { switch (sop) { // Client case case sop_wants_replace: case sop_replace: case sop_archive_delete: case sop_soft_delete: case sop_delete: case sop_copy: // item has local ID, we can find datastore by prefix linkP = findSubLinkByLocalID(syncitemP->getLocalID()); if (!linkP) goto nods; // remove prefix before letting subdatastore process it syncitemP->fLocalID.erase(0,linkP->fDSLinkConfigP->fGUIDPrefix.size()); // now let subdatastore process regular=linkP->fDatastoreLinkP->engProcessRemoteItem(syncitemP,aStatusCommand); goto done; case sop_wants_add: case sop_add: // item has no local ID, we need to apply filters to item data linkP = findSubLinkByData(*syncitemP); if (!linkP) goto nods; // make sure item does not have a local ID (which would be wrong because of prefixes anyway) syncitemP->clearLocalID(); // let subdatastore process regular=linkP->fDatastoreLinkP->engProcessRemoteItem(syncitemP,aStatusCommand); goto done; case sop_reference_only: case sop_move: case sop_none: case numSyncOperations: // nothing to do or shouldn't happen break; } // switch } // client #endif // SYSYNC_CLIENT nods: // no datastore or unknown command, general DB error aStatusCommand.setStatusCode(510); PDEBUGPRINTFX(DBG_ERROR,("TSuperDataStore::processRemoteItem Fatal: Item cannot be processed by any subdatastore")); // consume item delete syncitemP; regular=false; goto done; done: #ifdef SYSYNC_SERVER delete itemcopyP; #endif PDEBUGENDBLOCK("SuperProcessItem"); return regular; } // TSuperDataStore::engProcessRemoteItem // - must return true if this datastore is finished with // (if all datastores return true, // session is allowed to finish sync packet with outgoing message bool TSuperDataStore::isSyncDone(void) { // check subdatastores bool done=true; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { done=done && pos->fDatastoreLinkP->isSyncDone(); } // check myself return done && TLocalEngineDS::isSyncDone(); } // TSuperDataStore::isSyncDone // abort sync with this super datastore (that is, with all subdatastores as well) void TSuperDataStore::engAbortDataStoreSync(TSyError aStatusCode, bool aLocalProblem, bool aResumable) { // abort subdatastores TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->engAbortDataStoreSync(aStatusCode,aLocalProblem,aResumable); } // set code in my own ancestor TLocalEngineDS::engAbortDataStoreSync(aStatusCode,aLocalProblem,aResumable); } // TSuperDataStore::engAbortDataStoreSync // - must return true if this datastore is finished with // (if all datastores return true, // session is allowed to finish sync packet with outgoing message bool TSuperDataStore::isAborted(void) { // check subdatastores TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (pos->fDatastoreLinkP->isAborted()) return true; // one aborted, super aborted as well } // check myself return TLocalEngineDS::isAborted(); } // TSuperDataStore::isAborted // called at very end of sync session, when everything is done // Note: is also called before deleting a datastore (so aborted sessions // can do cleanup and/or statistics display as well) void TSuperDataStore::engFinishDataStoreSync(localstatus aErrorStatus) { // inform all subdatastores TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->engFinishDataStoreSync(aErrorStatus); } // call inherited inherited::engFinishDataStoreSync(aErrorStatus); } // TSuperDataStore::engFinishDataStoreSync // Internal events during sync to access local database // ==================================================== // Methods overriding TLocalEngineDS // ---------------------------------- // called at sync alert (before generating for client, after receiving for server) // - obtains combined anchor from subdatastores // - combines them into a common anchor (if possible) // - updates fFirstTimeSync as well localstatus TSuperDataStore::engInitSyncAnchors( cAppCharP aDatastoreURI, // (Note: unused in superdatastore) local datastore URI cAppCharP aRemoteDBID // (Note: unused in superdatastore) ID of remote datastore (to find session information in local DB) ) { bool allanchorsequal=true; localstatus sta=LOCERR_OK; // superdatastore has no own anchors, so collect data from subdatastores fFirstTimeSync=false; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (pos==fSubDSLinks.begin()) { // Server case note: // Subdatastore's engInitSyncAnchors() MUST NOT be called here, because this routine will // always be called after all subdatastore's engProcessSyncAlert() was called // which in turn contains a call to engInitSyncAnchors(). // Client case note: // Subdatastore's engInitSyncAnchors() MUST NOT be called here, because this routine will // be called from TSuperDataStore::engPrepareClientSyncAlert() after iterating through // subdatastores and calling their engPrepareClientDSForAlert(), which in turn // contains a call to engInitSyncAnchors(). // This means we can safely assume we have the fLastRemoteAnchor/fNextLocalAnchor info // ready here. // - Assign references of first datastore // Note: remote anchor must be same from all subdatastores fLastRemoteAnchor=pos->fDatastoreLinkP->fLastRemoteAnchor; // - these are used from the first datastore, and might differ (a few seconds, // that is) for other datastores fLastLocalAnchor=pos->fDatastoreLinkP->fLastLocalAnchor; fNextLocalAnchor=pos->fDatastoreLinkP->fNextLocalAnchor; } else { // see if all are equal allanchorsequal = allanchorsequal && pos->fDatastoreLinkP->fLastRemoteAnchor == fLastRemoteAnchor; } // also combine firstTimeSync (first time if it's first for any of the subdatastores) fFirstTimeSync = fFirstTimeSync || pos->fDatastoreLinkP->fFirstTimeSync; } // make sure common anchor is valid only if all of the subdatastores have equal anchors if (sta!=LOCERR_OK || fFirstTimeSync || !allanchorsequal) { fLastLocalAnchor.empty(); fLastRemoteAnchor.empty(); } // superdatastore gets adminready when all subdatastores have successfully done engInitSyncAnchors() if (sta==LOCERR_OK) { changeState(dssta_adminready); // admin data is now ready } // return status return sta; } // TSuperDataStore::engInitSyncAnchors // - called at start of first command (prepare DB for reading/writing) bool TSuperDataStore::startSync(TStatusCommand &aStatusCommand) { DEBUGPRINTFX(DBG_HOT,("TSuperDataStore::startSync")); // make sure we start generating with first datastore fCurrentGenDSPos=fSubDSLinks.begin(); // NOTE: Do NOT iterate subdatastores, because these were called already // by engProcessSyncCmd (server case) or engProcessSyncAlert (client case) return true; // ok } // TSuperDataStore::startSync /// check is datastore is completely started. /// @param[in] aWait if set, call will not return until either started state is reached /// or cannot be reached within the maximally allowed request processing time left. bool TSuperDataStore::engIsStarted(bool aWait) { // check subdatastores bool ready=true; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { ready=ready && pos->fDatastoreLinkP->engIsStarted(aWait); } // check myself return ready && inherited::engIsStarted(aWait); } // TSuperDataStore::engIsStarted // remove prefix for given subDatastore // @param[in] aIDWithPrefix points to ID with prefix // @return NULL if either datastore not found or prefix not present in aIDWithPrefix // @return pointer to first char in aIDWithPrefix which is not part of the prefix cAppCharP TSuperDataStore::removeSubDSPrefix(cAppCharP aIDWithPrefix, TLocalEngineDS *aLocalDatastoreP) { if (!aIDWithPrefix) return NULL; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (pos->fDatastoreLinkP == aLocalDatastoreP) { // check the prefix if (strnncmp( aIDWithPrefix, pos->fDSLinkConfigP->fGUIDPrefix.c_str(), pos->fDSLinkConfigP->fGUIDPrefix.size() ) ==0) return aIDWithPrefix+pos->fDSLinkConfigP->fGUIDPrefix.size(); // return start of subDS ID else return aIDWithPrefix; // datastore found, but prefix is not there, return unmodified } } return NULL; } // TSuperDataStore::removeSubDSPrefix // private helper: find subdatastore which matches prefix of given localID TSubDatastoreLink *TSuperDataStore::findSubLinkByLocalID(const char *aLocalID) { TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { if (strnncmp( aLocalID, pos->fDSLinkConfigP->fGUIDPrefix.c_str(), pos->fDSLinkConfigP->fGUIDPrefix.size() ) ==0) { // found return &(*pos); } } return NULL; // not found } // TSuperDataStore::findSubLinkByLocalID // private helper: find subdatastore which can accept item data TSubDatastoreLink *TSuperDataStore::findSubLinkByData(TSyncItem &aSyncItem) { TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,( "Testing item data against of subdatastore '%s'", pos->fDatastoreLinkP->getName() )); if (aSyncItem.testFilter(pos->fDSLinkConfigP->fDispatchFilter.c_str())) { // found return &(*pos); } } return NULL; // not found } // TSuperDataStore::findSubLinkByData // only dummy, creates error if called bool TSuperDataStore::logicRetrieveItemByID( TSyncItem &aSyncItem, // item to be filled with data from server. Local or Remote ID must already be set TStatusCommand &aStatusCommand // status, must be set on error or non-200-status ) { aStatusCommand.setStatusCode(500); DEBUGPRINTFX(DBG_ERROR,("TSuperDataStore::logicRetrieveItemByID called, which should never happen!!!!!!")); return false; // not ok } // TSuperDataStore::logicRetrieveItemByID // only dummy, creates error if called // - Method takes ownership of syncitemP in all cases bool TSuperDataStore::logicProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand, bool &aVisibleInSyncset, // on entry: tells if resulting item SHOULD be visible; on exit: set if processed item remains visible in the sync set. string *aGUID // GUID is stored here if not NULL ) { delete syncitemP; // consume aStatusCommand.setStatusCode(500); DEBUGPRINTFX(DBG_ERROR,("TSuperDataStore::logicProcessRemoteItem called, which should never happen!!!!!!")); return false; // not ok } // TSuperDataStore::logicProcessRemoteItem // - returns true if DB implementation can filter during database fetch // (otherwise, fetched items must be filtered after being read from DB) bool TSuperDataStore::engFilteredFetchesFromDB(bool aFilterChanged) { // only if all subdatastores support it bool yes=true; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { yes = yes && pos->fDatastoreLinkP->engFilteredFetchesFromDB(aFilterChanged); } return yes; } // TSuperDataStore::engFilteredFetchesFromDB // - called for SyncML 1.1 if remote wants number of changes. // Must return -1 if no NOC value can be returned sInt32 TSuperDataStore::getNumberOfChanges(void) { sInt32 noc,totalNoc = 0; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { noc = pos->fDatastoreLinkP->getNumberOfChanges(); if (noc<0) return -1; // if one of the subdatastores does not know NOC, we can't return a NOC // subdatastore knows its NOC, sum up totalNoc+=noc; } // return sum of all NOCs return totalNoc; }; // TSuperDataStore::getNumberOfChanges // show statistics or error of current sync void TSuperDataStore::showStatistics(void) { // show something in debug log PDEBUGPRINTFX(DBG_HOT,("Superdatastore Sync for '%s' (%s), %s sync status:", getName(), fRemoteViewOfLocalURI.c_str(), fSlowSync ? "slow" : "normal" )); // and on user console CONSOLEPRINTF(("")); CONSOLEPRINTF(("- Superdatastore Sync for '%s' (%s), %s sync status:", getName(), fRemoteViewOfLocalURI.c_str(), fSlowSync ? "slow" : "normal" )); // now show results if (isAborted()) { // failed PDEBUGPRINTFX(DBG_ERROR,("Warning: Failed with status code=%hd",fAbortStatusCode)); CONSOLEPRINTF((" ************ Failed with status code=%hd",fAbortStatusCode)); } else { // successful: show statistics on console PDEBUGPRINTFX(DBG_HOT,("Completed successfully - details see subdatastores")); CONSOLEPRINTF((" Completed successfully - details see subdatastores")); } CONSOLEPRINTF(("")); } // TSuperDataStore::showStatistics // - returns true if DB implementation of all subdatastores support resume bool TSuperDataStore::dsResumeSupportedInDB(void) { // yes if all subdatastores support it bool yes=true; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { yes = yes && pos->fDatastoreLinkP->dsResumeSupportedInDB(); } return yes; } // TSuperDataStore::dsResumeSupportedInDB // helper to save resume state either at end of request or explicitly at reception of a "suspend" localstatus TSuperDataStore::engSaveSuspendState(bool aAnyway) { // only save here if not aborted already (aborting saves the state immediately) // or explicitly requested if (aAnyway || !isAborted()) { // only save if DS 1.2 and supported by DB if ((fSessionP->getSyncMLVersion()>=syncml_vers_1_2) && dsResumeSupportedInDB()) { PDEBUGBLOCKFMT(("SuperSaveSuspendState","Saving superdatastore suspend/resume state","superdatastore=%s",getName())); // save alert state fResumeAlertCode=fAlertCode; TSubDSLinkList::iterator pos; if (fResumeAlertCode) { // let all subdatastores update partial item and markOnlyUngeneratedForResume() for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { // save partial state if any if (pos->fDatastoreLinkP->fPartialItemState!=pi_state_save_outgoing) { // ONLY if we have no request for saving an outgoing item state already, // we possibly need to save a pending incoming item // if there is an incompletely received item, let it update Partial Item (fPIxxx) state // (if it is an item of this datastore, that is). if (fSessionP->fIncompleteDataCommandP) { fSessionP->fIncompleteDataCommandP->updatePartialItemState(pos->fDatastoreLinkP); } } // mark ungenerated pos->fDatastoreLinkP->logicMarkOnlyUngeneratedForResume(); } /// @note that already generated items are related to the originating /// localEngineDS, so markPendingForResume() on existing commands will /// directly reach the correct datastore /// @note markItemForResume() will get the localID as presented to /// remote, that is in case of superdatastores with prefixes that need to be removed fSessionP->markPendingForResume(this); } // let all subdatastores logicSaveResumeMarks() to make all this persistent localstatus globErr=LOCERR_OK; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { localstatus err=pos->fDatastoreLinkP->logicSaveResumeMarks(); if (err!=LOCERR_OK) globErr=err; } PDEBUGENDBLOCK("SuperSaveSuspendState"); return globErr; } } return LOCERR_OK; } // TSuperDataStore::engSaveSuspendState #ifdef SYSYNC_SERVER /// @brief called at end of request processing, should be used to save suspend state /// @note subdatastores don't do anything themselves, to make sure superds can make things happen in correct order void TSuperDataStore::engRequestEnded(void) { // variant for superdatastore - also handles its subdatastores // For DS 1.2: Make sure everything is ready for a resume in case there's an abort (implicit Suspend) // before the next request. Note that the we cannot wait for session timeout, as the resume attempt // from the client probably arrives much earlier. if (testState(dssta_syncmodestable)) { // make sure all unsent items are marked for resume localstatus sta=engSaveSuspendState(false); // only if not already aborted if (sta!=LOCERR_OK) { DEBUGPRINTFX(DBG_ERROR,("Could not save suspend state at end of Request: err=%hd",sta)); } } // let datastore prepare for end of request (other than thread change) TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->dsRequestEnded(); } // then let them know that thread may change for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->dsThreadMayChangeNow(); } } // TSuperDataStore::engRequestEnded #endif // - called to let server generate sync commands for client // Returns true if now finished for this datastore // also sets fState to dss_syncdone when finished bool TSuperDataStore::engGenerateSyncCommands( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix ) { PDEBUGBLOCKFMT(("SuperSyncGen","Now generating sync commands from superdatastore","datastore=%s",getName())); bool finished=false; string prefix; while (!isAborted()) { // check for end if (fCurrentGenDSPos==fSubDSLinks.end()) { // done, update status changeState(dssta_syncgendone,true); break; } // create current prefix AssignString(prefix,aLocalIDPrefix); prefix.append(fCurrentGenDSPos->fDSLinkConfigP->fGUIDPrefix); // call subdatastore to generate commands finished=fCurrentGenDSPos->fDatastoreLinkP->engGenerateSyncCommands( aNextMessageCommands, aInterruptedCommandP, prefix.c_str() ); // exit if not yet finished with generating commands for this datastore if (!finished) break; // done with this datastore, switch to next if any fCurrentGenDSPos++; } // while not aborted // finished when state is dss_syncdone PDEBUGPRINTFX(DBG_DATA,( "superdatastore's engGenerateSyncCommands ended, state='%s', sync generation %sdone", getDSStateName(), dbgTestState(dssta_syncgendone,true) ? "" : "NOT " )); PDEBUGENDBLOCK("SuperSyncGen"); // also finished with this datastore when aborted return (isAborted() || testState(dssta_syncgendone,true)); } // TSuperDataStore::generateSyncCommands #ifdef SYSYNC_CLIENT // Client only: initialize Sync alert for datastore according to Parameters set with dsSetClientSyncParams() localstatus TSuperDataStore::engPrepareClientSyncAlert(void) { localstatus sta; // not resuming by default fResuming = false; fResumeAlertCode = 0; // prepare all subdatastores that were parametrized to participate in a sync by dsSetClientSyncParams() TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { TLocalEngineDS *dsP = pos->fDatastoreLinkP; if (dsP->testState(dssta_clientparamset)) { // configured for sync, prepare for alert sta = dsP->engPrepareClientDSForAlert(); if (sta!=LOCERR_OK) return sta; // error // collect slow sync status fSlowSync = fSlowSync || dsP->fSlowSync; // collect resume alert code if (dsP->fResuming) { // subdatastore would like to resume if (fResumeAlertCode!=0 && fResumeAlertCode!=dsP->fResumeAlertCode) { // different idea about what to resume -> can't resume PDEBUGPRINTFX(DBG_ERROR,("subdatastores differ in resume alert code -> cancel resume of superdatastore")); fResuming = false; } else { // resume is possible (but might be cancelled if another subdatastore disagrees fResumeAlertCode = dsP->fResumeAlertCode; fResuming = true; } } } } // now init my own anchors and firstsync state, which are a combination of my subdatastore's sta = engInitSyncAnchors(NULL,NULL); if (sta!=LOCERR_OK) return sta; // error // determine final resume state if (fResuming) { PDEBUGPRINTFX(DBG_PROTO,("Found suspended session with Alert Code = %hd for all subdatastores",fResumeAlertCode)); } else { // superdatastore can't resume, cancel all subdatastore's resumes that might be set for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { pos->fDatastoreLinkP->fResuming = false; } } // all successful return LOCERR_OK; } // TSuperDataStore::engPrepareClientSyncAlert // Init engine for client sync // - determine types to exchange // - make sync set ready localstatus TSuperDataStore::engInitForClientSync(void) { localstatus sta = LOCERR_OK; // first let all subdatastores init for sync TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { sta = pos->fDatastoreLinkP->engInitDSForClientSync(); if (sta!=LOCERR_OK) return sta; } // now change my own state return inherited::engInitDSForClientSync(); } // TSuperDataStore::engInitForClientSync // Client only: returns number of unsent map items sInt32 TSuperDataStore::numUnsentMaps(void) { // add maps from all subdatastores uInt32 num=0; TSubDSLinkList::iterator pos; for (pos=fSubDSLinks.begin();pos!=fSubDSLinks.end();pos++) { num+=pos->fDatastoreLinkP->numUnsentMaps(); } return num; } // TSuperDataStore::numUnsentMaps // called to mark maps confirmed, that is, we have received ok status for them void TSuperDataStore::engMarkMapConfirmed(cAppCharP aLocalID, cAppCharP aRemoteID) { // we must detect the subdatastore by prefix TSubDatastoreLink *linkP = findSubLinkByLocalID(aLocalID); if (linkP) { // pass to subdatastore with prefix removed linkP->fDatastoreLinkP->engMarkMapConfirmed(aLocalID+linkP->fDSLinkConfigP->fGUIDPrefix.size(),aRemoteID); } } // TSuperDataStore::engMarkMapConfirmed // - client only: called to generate Map items // Returns true if now finished for this datastore // also sets fState to dss_done when finished bool TSuperDataStore::engGenerateMapItems(TMapCommand *aMapCommandP, cAppCharP aLocalIDPrefix) { TSubDSLinkList::iterator pos=fSubDSLinks.begin(); bool ok; string prefix; PDEBUGBLOCKDESC("SuperMapGenerate","TSuperDataStore: Generating Map items..."); do { // check if already done if (pos==fSubDSLinks.end()) break; // done // create current prefix AssignString(prefix,aLocalIDPrefix); prefix.append(pos->fDSLinkConfigP->fGUIDPrefix); // generate Map items ok=pos->fDatastoreLinkP->engGenerateMapItems(aMapCommandP,prefix.c_str()); // exit if not yet finished with generating map items for this datastore if (!ok) { PDEBUGENDBLOCK("MapGenerate"); return false; // not all map items generated } // next datastore pos++; } while(true); // done // we are done if state is syncdone (no more sync commands will occur) if (testState(dssta_dataaccessdone)) { changeState(dssta_clientmapssent,true); PDEBUGPRINTFX(DBG_PROTO,("TSuperDataStore: Finished generating Map items, server has finished , we are done now")) } #ifdef SYDEBUG // else if we are not yet dssta_syncgendone -> this is the end of a early pending map send else if (!dbgTestState(dssta_syncgendone)) { PDEBUGPRINTFX(DBG_PROTO,("TSuperDataStore: Finished sending cached Map items from last session")) } // otherwise, we are not really finished with the maps yet (but with the current map command) else { PDEBUGPRINTFX(DBG_PROTO,("TSuperDataStore: Finished generating Map items for now, but server still sending ")) } #endif PDEBUGENDBLOCK("MapGenerate"); return true; } // TSuperDataStore::engGenerateMapItems #endif // SYSYNC_CLIENT /* end of TSuperDataStore implementation */ #endif // SUPERDATASTORES // eof syncevolution-1.5/src/synthesis/src/sysync/superdatastore.h0000755000373300037200000003524212424517753026074 0ustar00nightlyallusers00000000000000/* * File: SuperDataStore.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSuperDataStore * "Virtual" datastore consisting of an union of other * datastores, for example a vCal datastore based on * two separate vEvent and vTodo datastores. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-08-05 : luz : created * */ #ifndef SuperDataStore_H #define SuperDataStore_H // includes #include "configelement.h" #include "syncitem.h" #include "localengineds.h" #ifdef SUPERDATASTORES using namespace sysync; namespace sysync { class TSuperDataStore; // forward #ifndef OBJECT_FILTERING #error "SUPERDATASTORE needs OBJECT_FILTERING" #endif // sub-datastore (contained datastore) link config class TSubDSLinkConfig: public TConfigElement { typedef TConfigElement inherited; public: TSubDSLinkConfig(TLocalDSConfig *aLocalDSConfigP, TConfigElement *aParentElement); virtual ~TSubDSLinkConfig(); // properties // - filter applied to test if incoming item is to be processed // by this datastore string fDispatchFilter; // - GUID prefix to create super-GUIDs out of individual datastore GUIDs string fGUIDPrefix; // - linked datastore's config TLocalDSConfig *fLinkedDSConfigP; // - reset config to defaults virtual void clear(); protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif }; // TSubDSLinkConfig typedef std::list TSubDSConfigList; // sub-datastore link typedef struct { TLocalEngineDS *fDatastoreLinkP; TSubDSLinkConfig *fDSLinkConfigP; bool fStartPending; } TSubDatastoreLink; typedef std::list TSubDSLinkList; // super datastore config class TSuperDSConfig: public TLocalDSConfig { typedef TLocalDSConfig inherited; public: TSuperDSConfig(const char* aName, TConfigElement *aParentElement); virtual ~TSuperDSConfig(); // properties // - contained subdatastores TSubDSConfigList fSubDatastores; // public methods // - create appropriate datastore from config, including creating links to subdatastores virtual TLocalEngineDS *newLocalDataStore(TSyncSession *aSessionP); // - reset config to defaults virtual void clear(); protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); }; // TSuperDSConfig class TSuperDataStore: public TLocalEngineDS { typedef TLocalEngineDS inherited; private: void InternalResetDataStore(void); // reset for re-use without re-creation public: TSuperDataStore(TSuperDSConfig *aDSConfigP, TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual ~TSuperDataStore(); virtual void dsResetDataStore(void) { InternalResetDataStore(); inherited::dsResetDataStore(); }; // add links to subdatastores void addSubDatastoreLink(TSubDSLinkConfig *aDSLinkConfigP, TLocalEngineDS *aDatastoreP); // abort virtual void engAbortDataStoreSync(TSyError aReason, bool aLocalProblem, bool aResumable=true); virtual bool isAborted(void); // test abort status // Sync operation Methods overriding TLocalEngineDS (which need some distribution to subdatastores) // - process Sync alert for a datastore virtual TAlertCommand *engProcessSyncAlert( TSuperDataStore *aAsSubDatastoreOf, // if acting as subdatastore uInt16 aAlertCode, // the alert code const char *aLastRemoteAnchor, // last anchor of client const char *aNextRemoteAnchor, // next anchor of client const char *aTargetURI, // target URI as sent by remote, no processing at all const char *aIdentifyingTargetURI, // target URI that was used to identify datastore const char *aTargetURIOptions, // option string contained in target URI SmlFilterPtr_t aTargetFilter, ///< DS 1.2 filter, NULL if none const char *aSourceURI, // source URI TStatusCommand &aStatusCommand // status that might be modified ); // - process status received for sync alert virtual bool engHandleAlertStatus(TSyError aStatusCode); // - Set remote datastore for local virtual void engSetRemoteDatastore(TRemoteDataStore *aRemoteDatastoreP); // - set Sync types needed for sending local data to remote DB virtual void setSendTypeInfo( TSyncItemType *aLocalSendToRemoteTypeP, TSyncItemType *aRemoteReceiveFromLocalTypeP); // - set Sync types needed for receiving remote data in local DB virtual void setReceiveTypeInfo( TSyncItemType *aLocalReceiveFromRemoteTypeP, TSyncItemType *aRemoteSendToLocalTypeP); // - init usage of datatypes set with setSendTypeInfo/setReceiveTypeInfo virtual localstatus initDataTypeUse(void); // - SYNC command bracket start (check credentials if needed) virtual bool engProcessSyncCmd(SmlSyncPtr_t aSyncP,TStatusCommand &aStatusCommand,bool &aQueueForLater); // - SYNC command bracket end (but another might follow in next message) virtual bool engProcessSyncCmdEnd(bool &aQueueForLater); // - called to process incoming item operation. // Method must take ownership of syncitemP in all cases virtual bool engProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand ); #ifdef SYSYNC_SERVER // - called to process map commands from client to server virtual localstatus engProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID); #endif // - must return true if this datastore is finished with // (if all datastores return true, // session is allowed to finish sync packet with outgoing message virtual bool isSyncDone(void); // - called at very end of sync session, when everything is done virtual void engFinishDataStoreSync(localstatus aErrorStatus=LOCERR_OK); // Abstracts of TLocalEngineDS protected: // check if all subdatastores can restart bool canRestart(); // obtain Sync Cap mask, must be lowest common mask of all subdatastores virtual uInt32 getSyncCapMask(void); // intersection of all sync mode sets in the subdatastores virtual bool syncModeSupported(const std::string &mode); virtual void getSyncModes(set &modes); // Internal events during sync for derived classes // Note: local DB authorisation must be established already before calling these // - prepares for Sync with this datastore // - updates fLastRemoteAnchor,fNextRemoteAnchor,fLastLocalAnchor,fNextLocalAnchor // - called at sync alert, obtains anchor information from local DB // (abstract, must be implemented in derived class) virtual localstatus engInitSyncAnchors( cAppCharP aDatastoreURI, // local datastore URI cAppCharP aRemoteDBID // ID of remote datastore (to find session information in local DB) ); // - called at start of first command (prepare DB for reading/writing) virtual bool startSync(TStatusCommand &aStatusCommand); /// check is datastore is completely started. /// @param[in] aWait if set, call will not return until either started state is reached /// or cannot be reached within the maximally allowed request processing time left. virtual bool engIsStarted(bool aWait); // - only dummy, creates error if called virtual bool logicRetrieveItemByID( TSyncItem &aSyncItem, // item to be filled with data from server. Local or Remote ID must already be set TStatusCommand &aStatusCommand // status, must be set on error or non-200-status ); // - only dummy, creates error if called virtual bool logicProcessRemoteItem( TSyncItem *syncitemP, TStatusCommand &aStatusCommand, bool &aVisibleInSyncset, // on entry: tells if resulting item SHOULD be visible; on exit: set if processed item remains visible in the sync set. string *aGUID=NULL // GUID is stored here if not NULL ); // - returns true if DB implementation can filter during database fetch // (otherwise, fetched items will be filtered after being read from DB) virtual bool engFilteredFetchesFromDB(bool aFilterChanged=false); // - called for SyncML 1.1 if remote wants number of changes. // Must return -1 if no NOC value can be returned virtual sInt32 getNumberOfChanges(void); // - called to show sync statistics in debug log and on console SUPERDS_VIRTUAL void showStatistics(void); // - called to generate sync sub-commands // Returns true if now finished for this datastore // also sets fState to dss_syncdone(server)/dss_syncready(client) when finished virtual bool engGenerateSyncCommands( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix ); // Suspend/Resume // - helper to save resume state either at end of request or explicitly at reception of a "suspend" // (overridden only by superdatastore) virtual localstatus engSaveSuspendState(bool aAnyway); // - returns true if DB implementation supports resume (saving of resume marks, alert code, pending maps, tempGUIDs) virtual bool dsResumeSupportedInDB(void); #ifdef SYSYNC_CLIENT // Client only: initialize Sync alert for datastore according to Parameters set with dsSetClientSyncParams() /// @note initializes anchors and makes calls to isFirstTimeSync() valid virtual localstatus engPrepareClientSyncAlert(void); // Client only: init engine for client sync (superdatastore aware) virtual localstatus engInitForClientSync(void); // Client only: called to generate Map items // - Returns true if now finished for this datastore // - also sets fState to dss_done when finished virtual bool engGenerateMapItems(TMapCommand *aMapCommandP, cAppCharP aLocalIDPrefix); // Client only: returns number of unsent map items virtual sInt32 numUnsentMaps(void); /// client: called to generate sync sub-commands to be sent to server /// Returns true if now finished for this datastore /// also sets fState to dss_syncdone(server)/dss_syncready(client) when finished virtual bool logicGenerateSyncCommandsAsClient( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix=NULL ) { return LOCERR_NOTIMP; }; // Client only: called to mark maps confirmed, that is, we have received ok status for them virtual void engMarkMapConfirmed(cAppCharP aLocalID, cAppCharP aRemoteID); #endif // SYSYNC_CLIENT #ifdef SYSYNC_SERVER // Server only: /// server: called to generate sync sub-commands to be sent to client /// Returns true if now finished for this datastore /// also sets fState to dss_syncdone(server)/dss_syncready(client) when finished virtual bool logicGenerateSyncCommandsAsServer( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, const char *aLocalIDPrefix=NULL ) { return LOCERR_NOTIMP; }; // - only dummy, creates error if called virtual localstatus logicProcessMap(cAppCharP aRemoteID, cAppCharP aLocalID) { return false; }; // dummy, should never be called // - called at end of request processing in server virtual void engRequestEnded(void); // Dummies, should never be called in Superdatastore, as all DB processing takes // place in subdatastores // - check if conflicting item already exist in list of items-to-be-sent-to-client virtual TSyncItem *getConflictingItemByRemoteID(TSyncItem *syncitemP) { return NULL; }; virtual TSyncItem *getConflictingItemByLocalID(TSyncItem *syncitemP) { return NULL; }; // - called to check if content-matching item from server exists virtual TSyncItem *getMatchingItem(TSyncItem *syncitemP, TEqualityMode aEqMode) { return NULL; }; // - called to prevent item to be sent to client in subsequent engGenerateSyncCommands() // item in question should be an item that was returned by getConflictingItemByRemoteID() or getMatchingItem() virtual void dontSendItemAsServer(TSyncItem *syncitemP) {}; // - called when a item in the sync set changes its localID (due to local DB internals) // NOTE: this is not called for superdatastores, only real datastores, so it's NOP here virtual void dsLocalIdHasChanged(const char *aOldID, const char *aNewID) {}; // - called to have additional item sent to remote (DB takes ownership of item) virtual void SendItemAsServer(TSyncItem *aSyncitemP) {}; #endif // SYSYNC_SERVER /// called to have all non-yet-generated sync commands as "to-be-resumed" virtual void logicMarkOnlyUngeneratedForResume(void) {}; /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void logicMarkItemForResume(cAppCharP aLocalID, cAppCharP aRemoteID, bool aUnSent) {}; /// called to mark an already generated (but probably not sent or not yet statused) item /// as "to-be-resumed", by localID or remoteID (latter only in server case). /// @note This must be repeatable without side effects, as server must mark/save suspend state /// after every request (and not just at end of session) virtual void logicMarkItemForResend(cAppCharP aLocalID, cAppCharP aRemoteID) {}; /// save status information required to possibly perform a resume (as passed to datastore with /// markOnlyUngeneratedForResume() and markItemForResume()) /// (or, in case the session is really complete, make sure that no resume state is left) /// @note Must also save tempGUIDs (for server) and pending/unconfirmed maps (for client) virtual localstatus logicSaveResumeMarks(void) { return LOCERR_NOTIMP; }; // must be derived (or avoided, as in superdatastore) public: /// remove prefix for given subDatastore /// @param[in] aIDWithPrefix points to ID with prefix /// @return NULL if not found /// @return pointer to first char in aIDWithPrefix which is not part of the prefix cAppCharP removeSubDSPrefix(cAppCharP aIDWithPrefix, TLocalEngineDS *aLocalDatastoreP); private: // find subdatastore which matches prefix of given localID TSubDatastoreLink *findSubLinkByLocalID(const char *aLocalID); // find subdatastore which can accept item data TSubDatastoreLink *findSubLinkByData(TSyncItem &aSyncItem); /** @deprecated moved to localEngineDS // combined first-time sync flag (collected from subdatastores) bool fFirstTimeSync; */ // this flag is set at alert and cleared after all subdatastores have fully initialized bool fSuperStartPending; // list of subdatastores TSubDSLinkList fSubDSLinks; // currently generating subdatastore TSubDSLinkList::iterator fCurrentGenDSPos; }; // TSuperDataStore } // namespace sysync #endif // SUPERDATASTORES #endif // SuperDataStore_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncagent.cpp0000755000373300037200000044223112424517753025355 0ustar00nightlyallusers00000000000000/* * File: syncagent.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncAgent: Provides functionality to run client or server * sessions. * Unifies former TSyncClient and TSyncServer * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2009-09-30 : luz : created from syncclient.cpp and syncserver.cpp * */ // includes #include "prefix_file.h" #include "sysync.h" #include "syncagent.h" #include "syncappbase.h" #ifdef HARD_CODED_SERVER_URI #include "syserial.h" #endif // includes that can't be in .h due to circular references #ifdef SYSYNC_SERVER #include "syncsessiondispatch.h" #endif #ifdef SYSYNC_CLIENT #include "syncclientbase.h" #endif #ifdef SYSYNC_TOOL #include #endif namespace sysync { #ifdef SYSYNC_TOOL // Support for SySync Diagnostic Tool // ================================== // test login into database int testLogin(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" login [ ] []")); CONSOLEPRINTF((" test login to database with syncml user/password and optional deviceid")); return EXIT_SUCCESS; } TSyncSession *sessionP = NULL; const char *username = NULL; const char *password = NULL; const char *deviceid = "sysytool_test"; // check for argument if (argc<2) { // no user/password, test anonymous login if (argc>0) deviceid = argv[0]; } else { // login with user/password username = argv[0]; password = argv[1]; if (argc>2) { // explicit device ID deviceid = argv[2]; } } // get session to work with sessionP = static_cast(getSyncAppBase())->getSySyToolSession(); bool authok = false; // try login if (username) { // real login with user and password authok = sessionP->SessionLogin(username, password, sectyp_clearpass, deviceid); } else { // anonymous - do a "login" with empty credentials authok = sessionP->SessionLogin("anonymous", NULL, sectyp_anonymous, deviceid); } if (authok) { CONSOLEPRINTF(("+++++ Successfully authorized")); } else { CONSOLEPRINTF(("----- Authorisation failed")); } return authok; } // testLogin // convert user data into internal format and back int convertData(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" convert [] []")); CONSOLEPRINTF((" Convert data to internal format of specified datastore and back")); return EXIT_SUCCESS; } TSyncSession *sessionP = NULL; const char *datastore = NULL; const char *rawfilename = NULL; const char *inputtype = NULL; const char *outputtype = NULL; // check for argument if (argc<2) { CONSOLEPRINTF(("required datatype name and raw file name arguments")); return EXIT_FAILURE; } datastore = argv[0]; rawfilename = argv[1]; if (argc>=3) { // third arg is explicit input type inputtype=argv[2]; } outputtype=inputtype; // default to input type if (argc>=4) { // fourth arg is explicit output type outputtype=argv[3]; } // get session to work with sessionP = static_cast(getSyncAppBase())->getSySyToolSession(); // configure session sessionP->fRemoteCanHandleUTC = true; // run generator and parser in UTC enabled mode // switch mimimal debugging on sessionP->getDbgLogger()->setMask(sessionP->getDbgLogger()->getMask() | (DBG_PARSE+DBG_GEN)); // find datastore TLocalEngineDS *datastoreP = sessionP->findLocalDataStore(datastore); TSyncItemType *inputtypeP = NULL; TSyncItemType *outputtypeP = NULL; if (!datastoreP) { CONSOLEPRINTF(("datastore type '%s' not found",datastore)); return EXIT_FAILURE; } // find input type if (inputtype) { // search in datastore inputtypeP=datastoreP->getReceiveType(inputtype,NULL); } else { // use preferred rx type inputtypeP=datastoreP->getPreferredRxItemType(); } if (!inputtypeP) { CONSOLEPRINTF(("input type not found")); return EXIT_FAILURE; } // find output type if (outputtype) { // search in datastore outputtypeP=datastoreP->getSendType(outputtype,NULL); } else { // use preferred rx type outputtypeP=datastoreP->getPreferredTxItemType(); } if (!outputtypeP) { CONSOLEPRINTF(("output type not found")); return EXIT_FAILURE; } // prepare type usage if (inputtypeP==outputtypeP) inputtypeP->initDataTypeUse(datastoreP, true, true); else { inputtypeP->initDataTypeUse(datastoreP, false, true); outputtypeP->initDataTypeUse(datastoreP, true, false); } // now open file and read data item FILE *infile; size_t insize=0; uInt8 *databuffer; infile = fopen(rawfilename,"rb"); if (!infile) { CONSOLEPRINTF(("Cannot open input file '%s' (%d)",rawfilename,errno)); return EXIT_FAILURE; } // - get size of file fseek(infile,0,SEEK_END); insize=ftell(infile); fseek(infile,0,SEEK_SET); // - create buffer of appropriate size databuffer = new uInt8[insize]; if (!databuffer) { CONSOLEPRINTF(("Not enough memory to read input file '%s' (%d)",rawfilename,errno)); return EXIT_FAILURE; } // - read data if (fread(databuffer,1,insize,infile)data=newPCDataStringX(databuffer,true,insize); delete[] databuffer; // create and fill a Sync item TSyncItem *syncitemP = inputtypeP->newSyncItem( smlitemP, // SyncML toolkit item Data to be converted into SyncItem sop_replace, // the operation to be performed with this item fmt_chr, // assume default (char) format inputtypeP, // target myself datastoreP, // local datastore statusCmd // status command that might be modified in case of error ); // forget SyncML version smlFreeItemPtr(smlitemP); if (!syncitemP) { CONSOLEPRINTF(("Error converting input file to internal format (SyncML status code=%hd)",statusCmd.getStatusCode())); return EXIT_FAILURE; } CONSOLEPRINTF(("\nNow copying item and convert back to transport format\n")); // make new for output type TSyncItem *outsyncitemP = outputtypeP->newSyncItem( outputtypeP, // target myself datastoreP // local datastore ); // copy data outsyncitemP->replaceDataFrom(*syncitemP); delete syncitemP; // convert back smlitemP=outputtypeP->newSmlItem( outsyncitemP, // the syncitem to be represented as SyncML datastoreP // local datastore ); if (!syncitemP) { CONSOLEPRINTF(("Could not convert back item data")); return EXIT_FAILURE; } // forget converted back item smlFreeItemPtr(smlitemP); return EXIT_SUCCESS; } // convertData #endif // SYSYNC_TOOL #ifdef PRECONFIGURED_SYNCREQUESTS // Implementation of TSyncReqConfig // ================================ // config for databases to sync with TSyncReqConfig::TSyncReqConfig(TLocalDSConfig *aLocalDSCfg, TConfigElement *aParentElement) : TConfigElement("syncrequest",aParentElement), fLocalDSConfig(aLocalDSCfg) { clear(); } // TSyncReqConfig::TSyncReqConfig TSyncReqConfig::~TSyncReqConfig() { // nop so far } // TSyncReqConfig::~TSyncReqConfig // init defaults void TSyncReqConfig::clear(void) { // init defaults // - local client datatstore subselection path or CGI (such as "test" in "contact/test") fLocalPathExtension.erase(); // - remote server DB layer auth fDBUser.erase(); fDBPassword.erase(); // - remote server datastore path fServerDBPath.erase(); // - sync mode fSyncMode=smo_twoway; fSlowSync=false; // default to non-slow // - DS 1.2 filtering parameters fRecordFilterQuery.erase(); fFilterInclusive=false; // clear inherited inherited::clear(); } // TSyncReqConfig::clear // config element parsing bool TSyncReqConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"localpathextension")==0) expectString(fLocalPathExtension); else if (strucmp(aElementName,"dbuser")==0) expectString(fDBUser); else if (strucmp(aElementName,"dbpassword")==0) expectString(fDBPassword); else if (strucmp(aElementName,"dbpath")==0) expectString(fServerDBPath); else if (strucmp(aElementName,"syncmode")==0) expectEnum(sizeof(fSyncMode),&fSyncMode,SyncModeNames,numSyncModes); else if (strucmp(aElementName,"slowsync")==0) expectBool(fSlowSync); else if (strucmp(aElementName,"recordfilter")==0) expectString(fRecordFilterQuery); else if (strucmp(aElementName,"filterinclusive")==0) expectBool(fFilterInclusive); // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TSyncReqConfig::localStartElement // resolve void TSyncReqConfig::localResolve(bool aLastPass) { if (aLastPass) { // check for required settings // %%% tbd } // resolve inherited inherited::localResolve(aLastPass); } // TSyncReqConfig::localResolve // create appropriate type of local datastore from config and init sync parameters TLocalEngineDS *TSyncReqConfig::initNewLocalDataStore(TSyncSession *aSessionP) { // - create appropriate type of localdsP TLocalEngineDS *localdsP = fLocalDSConfig->newLocalDataStore(aSessionP); // - set parameters localdsP->dsSetClientSyncParams( fSyncMode, fSlowSync, fServerDBPath.c_str(), fDBUser.c_str(), fDBPassword.c_str(), fLocalPathExtension.c_str(), fRecordFilterQuery.c_str(), fFilterInclusive ); return localdsP; } // TSyncReqConfig::initNewLocalDataStore #endif // PRECONFIGURED_SYNCREQUESTS // Implementation of TAgentConfig // ============================== TAgentConfig::TAgentConfig(const char* aName, TConfigElement *aParentElement) : inherited(aName,aParentElement) { clear(); } // TAgentConfig::TAgentConfig TAgentConfig::~TAgentConfig() { clear(); } // TAgentConfig::~TAgentConfig // init defaults void TAgentConfig::clear(void) { // clear inherited inherited::clear(); // Note: we always clear both client and server fields - even if we'll only use one set later #ifdef SYSYNC_CLIENT // init client auth defaults (note that these MUST correspond with the defaults set by loadRemoteParams() !!! fAssumedServerAuth=auth_none; // start with no auth fAssumedServerAuthEnc=fmt_chr; // start with char encoding fAssumedNonce.erase(); // start with no nonce fPreferSlowSync=true; // auth retry options (mainly for stupid servers like SCTS) #ifdef SCTS_COMPATIBILITY_HACKS fNewSessionForAuthRetry=false; fNoRespURIForAuthRetry=false; #else fNewSessionForAuthRetry=true; // all production Synthesis clients had it hardcoded (ifdeffed) this way until 2.9.8.7 fNoRespURIForAuthRetry=true; // all production Synthesis clients had it hardcoded (ifdeffed) this way until 2.9.8.7 #endif fSmartAuthRetry=true; // try to be smart and try different auth retry (different from fNewSessionForAuthRetry/fNoRespURIForAuthRetry) if first attempts fail // other defaults fPutDevInfAtSlowSync=true; // smartner server needs it, and it does not harm so we have it on by default #ifndef NO_LOCAL_DBLOGIN fLocalDBUser.erase(); fLocalDBPassword.erase(); fNoLocalDBLogin=false; #endif #ifdef PRECONFIGURED_SYNCREQUESTS fEncoding=SML_XML; // default to more readable XML fServerUser.erase(); fServerPassword.erase(); fServerURI.erase(); fTransportUser.erase(); fTransportPassword.erase(); fSocksHost.erase(); fProxyHost.erase(); fProxyUser.erase(); fProxyPassword.erase(); // remove sync db specifications TSyncReqList::iterator pos; for(pos=fSyncRequests.begin();pos!=fSyncRequests.end();pos++) delete *pos; fSyncRequests.clear(); #endif // clear inherited inherited::clear(); // modify timeout after inherited sets it fSessionTimeout=DEFAULT_CLIENTSESSIONTIMEOUT; // SyncML version support fAssumedServerVersion=MAX_SYNCML_VERSION; // try with highest version we support fMaxSyncMLVersionSupported=MAX_SYNCML_VERSION; // support what we request (overrides session default) #endif #ifdef SYSYNC_SERVER // init server defaults fRequestedAuth = auth_md5; fRequiredAuth = auth_md5; fAutoNonce = true; fConstantNonce.erase(); fExternalURL.erase(); fMaxGUIDSizeSent = 32; // reasonable size, but prevent braindamaged Exchange-size IDs to be sent fUseRespURI = true; fRespURIOnlyWhenDifferent = true; // modify timeout after inherited sets it fSessionTimeout=DEFAULT_SERVERSESSIONTIMEOUT; #endif } // TAgentConfig::clear #ifndef HARDCODED_CONFIG // config element parsing bool TAgentConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { if (IS_CLIENT) { // check the client elements #ifdef SYSYNC_CLIENT // - defaults for starting a session if (strucmp(aElementName,"defaultsyncmlversion")==0) expectEnum(sizeof(fAssumedServerVersion),&fAssumedServerVersion,SyncMLVersionNames,numSyncMLVersions); else if (strucmp(aElementName,"defaultauth")==0) expectEnum(sizeof(fAssumedServerAuth),&fAssumedServerAuth,authTypeNames,numAuthTypes); else if (strucmp(aElementName,"defaultauthencoding")==0) expectEnum(sizeof(fAssumedServerAuthEnc),&fAssumedServerAuthEnc,encodingFmtSyncMLNames,numFmtTypes); else if (strucmp(aElementName,"defaultauthnonce")==0) expectString(fAssumedNonce); else if (strucmp(aElementName,"preferslowsync")==0) expectBool(fPreferSlowSync); else if (strucmp(aElementName,"newsessionforretry")==0) expectBool(fNewSessionForAuthRetry); else if (strucmp(aElementName,"originaluriforretry")==0) expectBool(fNoRespURIForAuthRetry); else if (strucmp(aElementName,"smartauthretry")==0) expectBool(fSmartAuthRetry); // - other options else if (strucmp(aElementName,"putdevinfatslowsync")==0) expectBool(fPutDevInfAtSlowSync); else if (strucmp(aElementName,"fakedeviceid")==0) expectString(fFakeDeviceID); else #ifndef NO_LOCAL_DBLOGIN if (strucmp(aElementName,"localdbuser")==0) expectString(fLocalDBUser); else if (strucmp(aElementName,"localdbpassword")==0) expectString(fLocalDBPassword); else if (strucmp(aElementName,"nolocaldblogin")==0) expectBool(fNoLocalDBLogin); else #endif // serverURL is always available to allow define fixed URL in config that can't be overridden in profiles if (strucmp(aElementName,"serverurl")==0) expectString(fServerURI); else #ifdef PRECONFIGURED_SYNCREQUESTS if (strucmp(aElementName,"syncmlencoding")==0) expectEnum(sizeof(fEncoding),&fEncoding,SyncMLEncodingNames,numSyncMLEncodings); else if (strucmp(aElementName,"serveruser")==0) expectString(fServerUser); else if (strucmp(aElementName,"serverpassword")==0) expectString(fServerPassword); else if (strucmp(aElementName,"sockshost")==0) expectString(fSocksHost); else if (strucmp(aElementName,"proxyhost")==0) expectString(fProxyHost); else if (strucmp(aElementName,"proxyuser")==0) expectString(fProxyUser); else if (strucmp(aElementName,"proxypassword")==0) expectString(fProxyPassword); else if (strucmp(aElementName,"transportuser")==0) expectString(fTransportUser); else if (strucmp(aElementName,"transportpassword")==0) expectString(fTransportPassword); // - Sync DB specification else if (strucmp(aElementName,"syncrequest")==0) { // definition of a new datastore const char* nam = getAttr(aAttributes,"datastore"); if (!nam) { ReportError(true,"syncrequest missing 'datastore' attribute"); } else { // search datastore TLocalDSConfig *localDSCfgP = getLocalDS(nam); if (!localDSCfgP) return fail("unknown local datastore '%s' specified",nam); // create new syncDB config linked to that datastore TSyncReqConfig *syncreqcfgP = new TSyncReqConfig(localDSCfgP,this); // - save in list fSyncRequests.push_back(syncreqcfgP); // - let element handle parsing expectChildParsing(*syncreqcfgP); } } else #endif // - none known here return inherited::localStartElement(aElementName,aAttributes,aLine); #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER // check the server elements if (strucmp(aElementName,"requestedauth")==0) expectEnum(sizeof(fRequestedAuth),&fRequestedAuth,authTypeNames,numAuthTypes); else if (strucmp(aElementName,"requiredauth")==0) expectEnum(sizeof(fRequiredAuth),&fRequiredAuth,authTypeNames,numAuthTypes); // here to maintain compatibility with old pre 1.0.5.3 config files else if (strucmp(aElementName,"reqiredauth")==0) expectEnum(sizeof(fRequiredAuth),&fRequiredAuth,authTypeNames,numAuthTypes); else if (strucmp(aElementName,"autononce")==0) expectBool(fAutoNonce); else if (strucmp(aElementName,"constantnonce")==0) expectString(fConstantNonce); else if (strucmp(aElementName,"externalurl")==0) expectString(fExternalURL); else if (strucmp(aElementName,"maxguidsizesent")==0) expectUInt16(fMaxGUIDSizeSent); else if (strucmp(aElementName,"sendrespuri")==0) expectBool(fUseRespURI); else if (strucmp(aElementName,"respurionlywhendifferent")==0) expectBool(fRespURIOnlyWhenDifferent); // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); #endif // SYSYNC_SERVER } // ok return true; } // TAgentConfig::localStartElement #endif // HARDCODED_CONFIG // resolve void TAgentConfig::localResolve(bool aLastPass) { if (aLastPass) { if (IS_CLIENT) { #ifdef SYSYNC_CLIENT #ifdef PRECONFIGURED_SYNCREQUESTS // - resolve requests TSyncReqList::iterator pos; for(pos=fSyncRequests.begin();pos!=fSyncRequests.end();pos++) (*pos)->Resolve(aLastPass); #endif #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER if (!fAutoNonce && fConstantNonce.empty()) ReportError(false,"Warning: 'constantnonce' should be defined when 'autononce' is not set"); #endif // SYSYNC_SERVER } } // resolve inherited inherited::localResolve(aLastPass); } // TAgentConfig::localResolve // Implementation of TSyncAgent // ============================= // constructor TSyncAgent::TSyncAgent( TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, const char *aSessionID // a session ID ) : TSyncSession(aAppBaseP,aSessionID) { // General #ifdef ENGINE_LIBRARY // init the flags which are set by STEPCMD_SUSPEND, STEPCMD_ABORT and STEPCMD_TRANSPFAIL fAbortRequested = false; fSuspendRequested = false; fEngineSessionStatus = LOCERR_WRONGUSAGE; #ifdef NON_FULLY_GRANULAR_ENGINE // - erase the list of queued progress events fProgressInfoList.clear(); fPendingStepCmd = 0; // none pending #endif // NON_FULLY_GRANULAR_ENGINE // - issue session start event here (in non-engine case this is done in TSyncSession constructor) SESSION_PROGRESS_EVENT(this,pev_sessionstart,NULL,0,0,0); #endif // ENGINE_LIBRARY #ifdef SYSYNC_SERVER // reset data counts fIncomingBytes = 0; fOutgoingBytes = 0; #endif fRestartSyncOnce = false; fRestartingSync = false; // Specific for Client or Server if (IS_CLIENT) { #ifdef SYSYNC_CLIENT #ifdef HARD_CODED_SERVER_URI fNoCRCPrefixLen = 0; #endif #ifdef ENGINE_LIBRARY // engine fClientEngineState = ces_idle; #endif // reset session now to get correct initial state InternalResetSession(); // restart with session numbering at 1 (incremented before use) fClientSessionNo = 0; #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER // init answer buffer fBufferedAnswer = NULL; fBufferedAnswerSize = 0; #ifdef ENGINE_LIBRARY // engine fServerEngineState = ses_needdata; fRequestSize = 0; #endif // init own stuff InternalResetSession(); // save session handle fSessionHandleP = aSessionHandleP; // link to handle // get config defaults TAgentConfig *configP = static_cast(aAppBaseP->getRootConfig()->fAgentConfigP); fUseRespURI = configP->fUseRespURI; // create all locally available datastores from config TLocalDSList::iterator pos; for (pos=configP->fDatastores.begin(); pos!=configP->fDatastores.end(); pos++) { // create the datastore addLocalDataStore(*pos); } #endif // SYSYNC_SERVER } } // TSyncAgent::TSyncAgent // destructor TSyncAgent::~TSyncAgent() { if (IS_CLIENT) { // make sure everything is terminated BEFORE destruction of hierarchy begins TerminateSession(); } else { #ifdef SYSYNC_SERVER // forget any buffered answers bufferAnswer(NULL,0); // reset session InternalResetSession(); // show session data transfer PDEBUGPRINTFX(DBG_HOT,( "Session data transfer statistics: incoming bytes=%ld, outgoing bytes=%ld", (long)fIncomingBytes, (long)fOutgoingBytes )); // DO NOT remove session from dispatcher here, // this is the task of the dispatcher itself! CONSOLEPRINTF(("Terminated SyncML session (server id=%s)\n",getLocalSessionID())); // show end of session in global level POBJDEBUGPRINTFX(getSyncAppBase(),DBG_HOT,( "TSyncAgent::~TSyncAgent: Deleted SyncML session (local session id=%s)", getLocalSessionID() )); #endif // SYSYNC_SERVER } } // TSyncAgent::~TSyncAgent // Terminate session void TSyncAgent::TerminateSession() { #ifdef SYSYNC_CLIENT if (IS_CLIENT && !fTerminated) { InternalResetSession(); #ifdef ENGINE_LIBRARY // switch state to done to prevent any further activity via SessionStep() fClientEngineState = ces_done; #endif } #endif // SYSYNC_CLIENT inherited::TerminateSession(); } // TSyncAgent::TerminateSession void TSyncAgent::InternalResetSession(void) { if (IS_CLIENT) { #ifdef SYSYNC_CLIENT // use remote URI as specified to start a session fRespondURI = fRemoteURI; #ifdef HARD_CODED_SERVER_URI #if defined(CUSTOM_URI_SUFFIX) && !defined(HARD_CODED_SERVER_URI_LEN) #error "HARD_CODED_SERVER_URI_LEN must be defined when using CUSTOM_URI_SUFFIX" #endif #ifdef HARD_CODED_SERVER_URI_LEN // only part of URL must match (max HARD_CODED_SERVER_URI_LEN chars will be added, less if URI is shorter) fServerURICRC = addNameToCRC(SYSER_CRC32_SEED, fRemoteURI.c_str()+fNoCRCPrefixLen, false, HARD_CODED_SERVER_URI_LEN); #else // entire URL (except prefix) must match fServerURICRC = addNameToCRC(SYSER_CRC32_SEED, fRemoteURI.c_str()+fNoCRCPrefixLen, false); #endif #endif // set SyncML version // Note: will be overridden with call to loadRemoteParams() fSyncMLVersion = syncml_vers_unknown; // unknown // will be cleared to suppress automatic use of DS 1.2 SINCE/BEFORE filters // (e.g. for date range in func_SetDaysRange()) fServerHasSINCEBEFORE = true; // no outgoing alert 222 sent so far fOutgoingAlert222Count = 0; #endif } else { #ifdef SYSYNC_SERVER // %%% remove this as soon as Server is 1.1 compliant //fSyncMLVersion=syncml_vers_1_0; // only accepts 1.0 for now %%%% #endif } } // TSyncAgent::InternalResetSession // Virtual version void TSyncAgent::ResetSession(void) { // let ancestor do its stuff TSyncSession::ResetSession(); // do my own stuff (and probably modify settings of ancestor!) InternalResetSession(); } // TSyncAgent::ResetSession bool TSyncAgent::MessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad) { if (IS_CLIENT) { #ifdef SYSYNC_CLIENT return ClientMessageStarted(aContentP,aStatusCommand,aBad); #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER return ServerMessageStarted(aContentP,aStatusCommand,aBad); #endif // SYSYNC_SERVER } } void TSyncAgent::MessageEnded(bool aIncomingFinal) { if (IS_CLIENT) { #ifdef SYSYNC_CLIENT ClientMessageEnded(aIncomingFinal); #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER ServerMessageEnded(aIncomingFinal); #endif // SYSYNC_SERVER } } // starting with engine version 2.0.8.7 a client's device ID (in devinf) is no longer // a constant string, but the device's unique ID string TSyncAgent::getDeviceID(void) { if (fLocalURI.empty()) { if (IS_SERVER) return SYSYNC_SERVER_DEVID; // return default ID else return SYSYNC_CLIENT_DEVID; // return default ID } else return fLocalURI; } // TSyncAgent::getDeviceID // ask syncappbase for device type string TSyncAgent::getDeviceType(void) { // taken from configuration or default for engine type (client/server) return getSyncAppBase()->getDevTyp(); } // TSyncAgent::getDeviceType bool TSyncAgent::checkAllFromClientOnly() { bool allFromClientOnly=false; // Note: the map phase will not take place, if all datastores are in // send-to-server-only mode and we are not in non-conformant old // synthesis-compatible fCompleteFromClientOnly mode. #ifdef SYSYNC_SERVER if (!fCompleteFromClientOnly) #endif { // let all local datastores know that message has ended allFromClientOnly=true; for (TLocalDataStorePContainer::iterator pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // check sync modes if ((*pos)->isActive() && (*pos)->getSyncMode()!=smo_fromclient) { allFromClientOnly=false; break; } } } return allFromClientOnly; } #ifdef SYSYNC_CLIENT // initialize the client session and link it with the SML toolkit localstatus TSyncAgent::InitializeSession(uInt32 aProfileSelector, bool aAutoSyncSession) { localstatus sta; // Select profile now (before creating instance, as encoding is dependent on profile) sta=SelectProfile(aProfileSelector, aAutoSyncSession); if (sta) return sta; // Start a SyncML toolkit instance now and set the encoding from config InstanceID_t myInstance; if (!getSyncAppBase()->newSmlInstance( getEncoding(), getRootConfig()->fLocalMaxMsgSize * 2, // twice the message size myInstance )) { return LOCERR_SMLFATAL; } // let toolkit know the session pointer if (getSyncAppBase()->setSmlInstanceUserData(myInstance,this)!=SML_ERR_OK) // toolkit must know session (as userData) return LOCERR_SMLFATAL; // remember the instance myself setSmlWorkspaceID(myInstance); // session must know toolkit workspace // done return LOCERR_OK; } // TSyncAgent::InitializeSession // select a profile (returns false if profile not found) // Note: base class just tries to retrieve information from // config localstatus TSyncAgent::SelectProfile(uInt32 aProfileSelector, bool aAutoSyncSession) { #ifndef PRECONFIGURED_SYNCREQUESTS // no profile settings in config -> error return LOCERR_NOCFG; #else // get profile settings from config TAgentConfig *configP = static_cast(getRootConfig()->fAgentConfigP); // - get encoding fEncoding=configP->fEncoding; // SyncML encoding // - set server access details fRemoteURI=configP->fServerURI; // Remote URI = Server URI fTransportUser=configP->fTransportUser; // transport layer user (e.g. HTTP auth) fTransportPassword=configP->fTransportPassword; // transport layer password (e.g. HTTP auth) fServerUser=configP->fServerUser; // Server layer authentification user name fServerPassword=configP->fServerPassword; // Server layer authentification password #ifndef NO_LOCAL_DBLOGIN fLocalDBUser=configP->fLocalDBUser; // Local DB authentification user name (empty if local DB is single user) fNoLocalDBLogin=configP->fNoLocalDBLogin; // if set, no local DB auth takes place, but fLocalDBUser is used as userkey (depending on DB implementation) fLocalDBPassword=configP->fLocalDBPassword; // Local DB authentification password #endif fProxyHost=configP->fProxyHost; // Proxy host fSocksHost=configP->fSocksHost; // Socks host fProxyUser=configP->fProxyUser; fProxyPassword=configP->fProxyPassword; // Reset session after profile change // and also remove any datastores we might have ResetAndRemoveDatastores(); // if tunnel, that's all for now if (aProfileSelector==TUNNEL_PROFILE_ID) return LOCERR_OK; // - create and init datastores needed for this session from config // Note: probably config has no sync requests, but they are created later // programmatically TSyncReqList::iterator pos; for (pos=configP->fSyncRequests.begin(); pos!=configP->fSyncRequests.end(); pos++) { // create and init the datastore fLocalDataStores.push_back( (*pos)->initNewLocalDataStore(this) ); } // create "new" session ID (derivates will do this better) fClientSessionNo++; return LOCERR_OK; #endif } // TSyncAgent::SelectProfile // make sure we are logged in to local datastore localstatus TSyncAgent::LocalLogin(void) { #ifndef NO_LOCAL_DBLOGIN if (!fNoLocalDBLogin && !fLocalDBUser.empty()) { // check authorisation (login to correct user) in local DB if (!SessionLogin(fLocalDBUser.c_str(),fLocalDBPassword.c_str(),sectyp_clearpass,fRemoteURI.c_str())) { return localError(401); // done & error } } #endif return LOCERR_OK; } // TSyncAgent::LocalLogin // process message in the instance buffer localstatus TSyncAgent::processAnswer(void) { InstanceID_t myInstance = getSmlWorkspaceID(); Ret_t err; // now process data DEBUGPRINTF(("===> now calling smlProcessData")); #ifdef SYDEBUG MemPtr_t data = NULL; MemSize_t datasize; smlPeekMessageBuffer(getSmlWorkspaceID(), false, &data, &datasize); #endif fIgnoreMsgErrs=false; err=smlProcessData( myInstance, SML_ALL_COMMANDS ); if (err) { // dump the message that failed to process #ifdef SYDEBUG if (data) DumpSyncMLBuffer(data,datasize,false,err); #endif if (!fIgnoreMsgErrs) { PDEBUGPRINTFX(DBG_ERROR,("===> smlProcessData failed, returned 0x%hX",(sInt16)err)); // other problem or already using SyncML 1.0 --> error return LOCERR_PROCESSMSG; } } // now check if this is a session restart if (isStarting()) { // this is still the beginning of a session return LOCERR_SESSIONRST; } return LOCERR_OK; } // TSyncAgentBase::processAnswer bool TSyncAgent::restartSync() { if (IS_CLIENT) { // Restarting needs to be done if: // - all datastores support restarting a sync (= multiple read/write cycles) // on client and server side (expected not be set if the engine itself on // either side doesn't support it, so that is not checked separately) // - no datastore has failed in current iteration // - client has pending changes: // - server temporarily rejected a change, queued for resending // - an item added by the server was merged with another // item locally (might have an updated queued, need to send delete) // - change on client failed temporarily // - the app or a datastore asked for a restart via the "restartsync" // session variable if (!getenv("LIBSYNTHESIS_NO_RESTART")) { bool restartPossible=true; // ... unless proven otherwise below bool restartNecessary=fRestartSyncOnce; // one reason for restarting: requested by app int numActive = 0; // clear the flag after we checked it fRestartSyncOnce=false; if (fRestartSyncOnce) PDEBUGPRINTFX(DBG_SESSION,("try to restart sync as requested by app")); for (TLocalDataStorePContainer::iterator pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { TLocalEngineDS *localDS = *pos; if (localDS->isActive()) { numActive++; if (!localDS->canRestart()) { PDEBUGPRINTFX(DBG_SESSION,("cannot restart, %s does not support it", localDS->getName())); restartPossible=false; break; } if (localDS->isAborted()) { PDEBUGPRINTFX(DBG_SESSION,("cannot restart, %s faileed", localDS->getName())); restartPossible=false; break; } if (!localDS->getRemoteDatastore() || !localDS->getRemoteDatastore()->canRestart()) { PDEBUGPRINTFX(DBG_SESSION,("cannot restart, remote datastore %s matching with %s does not support it", localDS->getRemoteDatastore()->getName(), localDS->getName())); restartPossible=false; break; } } // check for pending local changes in the client if (localDS->numUnsentMaps() > 0) { PDEBUGPRINTFX(DBG_SESSION,("try to restart, %s has pending map entries", localDS->getName())); restartNecessary=true; } // TODO: detect temporarily failed items (server sent an add/update/delete // that we had to reject temporarily and where we expect the server to // resend the request) // detect pending changes (for example, 409 handling in binfile client) if (localDS->hasPendingChangesForNextSync()) { PDEBUGPRINTFX(DBG_SESSION,("try to restart, %s has pending changes", localDS->getName())); restartNecessary=true; } } return restartPossible && restartNecessary; } } return false; } // let session produce (or finish producing) next message into // SML workspace // - returns aDone if no answer needs to be sent (=end of session) // - returns 0 if successful // - returns SyncML status code if unsucessfully aborted session localstatus TSyncAgent::NextMessage(bool &aDone) { TLocalDataStorePContainer::iterator pos; TSyError status; TP_START(fTPInfo,TP_general); // could be new thread // default to not continuing aDone=true; #ifdef PROGRESS_EVENTS // check for user suspend if (!SESSION_PROGRESS_EVENT(this,pev_suspendcheck,NULL,0,0,0)) { SuspendSession(LOCERR_USERSUSPEND); } #endif // done if session was aborted by last received commands if (isAborted()) return getAbortReasonStatus(); // done & error // check package state if (fOutgoingState==psta_idle) { // if suspended here, we'll just stop - nothing has happened yet if (isSuspending()) { AbortSession(fAbortReasonStatus,true); return getAbortReasonStatus(); } // start of an entirely new client session #ifdef HARD_CODED_SERVER_URI // extra check to limit hacking if (fServerURICRC != SERVER_URI_CRC) { // someone has tried to change the URI DEBUGPRINTFX(DBG_ERROR,("hardcoded Server URI CRC mismatch")); return LOCERR_LIMITED; // user will not know what this means, but we will } #endif // - check if we have client requests if (fLocalDataStores.size()<1) { PDEBUGPRINTFX(DBG_ERROR,("No datastores defined to sync with")); return LOCERR_NOCFG; } // %%% later, we could probably load cached info about // server requested auth, devinf etc. here // use remote URI as specified to start a session fRespondURI=fRemoteURI; // get default params for sending first message to remote // Note: may include remote flag settings that influence creation of my own ID below, that's why we do it now here loadRemoteParams(); // get info about my own URI, whatever that is #ifndef HARDCODED_CONFIG if (!static_cast(getRootConfig()->fAgentConfigP)->fFakeDeviceID.empty()) { // return fake Device ID if we have one defined in the config file (useful for testing) fLocalURI = static_cast(getRootConfig()->fAgentConfigP)->fFakeDeviceID; } else #endif { if (!getSyncAppBase()->getMyDeviceID(fLocalURI) || devidWithUserHash()) { // Device ID is not really unique, make a hash including user name to make it pseudo-unique // create MD5 hash from non-unique ID and user name // Note: when compiled with GUARANTEED_UNIQUE_DEVICID, devidWithUserHash() is always false. md5::SYSYNC_MD5_CTX context; uInt8 digest[16]; // for MD5 digest md5::Init (&context); // - add what we got for ID md5::Update (&context, (uInt8 *)fLocalURI.c_str(), fLocalURI.size()); // - add user name, if any if (fLocalURI.size()>0) md5::Update (&context, (uInt8 *)fServerUser.c_str(), fServerUser.size()); // - done md5::Final (digest, &context); // now make hex string of that fLocalURI = devidWithUserHash() ? 'x' : 'X'; // start with X to document this special case (lowercase = forced by remoteFlag) for (int n=0; n<16; n++) { AppendHexByte(fLocalURI,digest[n]); } } } // get my own name (if any) getPlatformString(pfs_device_name,fLocalName); // override some of these if not set by loadRemoteParams() if (fSyncMLVersion==syncml_vers_unknown) fSyncMLVersion=static_cast(getRootConfig()->fAgentConfigP)->fAssumedServerVersion; if (fRemoteRequestedAuth==auth_none) fRemoteRequestedAuth=static_cast(getRootConfig()->fAgentConfigP)->fAssumedServerAuth; if (fRemoteRequestedAuthEnc==fmt_chr) fRemoteRequestedAuthEnc=static_cast(getRootConfig()->fAgentConfigP)->fAssumedServerAuthEnc; if (fRemoteNonce.empty()) fRemoteNonce=static_cast(getRootConfig()->fAgentConfigP)->fAssumedNonce; // we are not yet authenticated for the entire session fNeedAuth=true; // now ready for init fOutgoingState=psta_init; // %%%% could also set psta_initsync for combined init/sync fIncomingState=psta_idle; // remains idle until first answer SyncHdr with OK status is received fInProgress=true; // assume in progress // set session ID string StringObjPrintf(fSynchdrSessionID,"%hd",(sInt16)fClientSessionNo); // now we have a session id, can now display debug stuff #ifdef SYDEBUG string t; StringObjTimestamp(t,getSystemNowAs(TCTX_SYSTEM)); PDEBUGPRINTFX(DBG_HOT,("\n[%s] =================> Starting new client session",t.c_str())); #endif // - make sure we are logged into the local database (if needed) status=LocalLogin(); if (status!=LOCERR_OK) return status; // create header for first message no noResp issueHeader(false); } else { // check for proper end of session (caused by MessageEnded analysis) if (!fInProgress) { // give an opportunity to let make outgoing message end and flush xml end message FinishMessage(true, false); // end sync in all datastores (save anchors etc.) PDEBUGPRINTFX(DBG_PROTO,("Successful end of session -> calling engFinishDataStoreSync() for datastores now")); for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) (*pos)->engFinishDataStoreSync(); // successful end PDEBUGPRINTFX(DBG_PROTO,("Session not any more in progress: NextMessage() returns OK status=0")); return LOCERR_OK; // done & ok } } // check expired case #ifdef APP_CAN_EXPIRE if (getClientBase()->fAppExpiryStatus!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("Evaluation Version expired - Please contact Synthesis AG for release version")); return getClientBase()->fAppExpiryStatus; // payment required, done & error } #endif if (fOutgoingState==psta_init || fOutgoingState==psta_initsync) { // - if suspended in init, nothing substantial has happened already, so just exit if (isSuspending() && fOutgoingState==psta_init) { AbortSession(fAbortReasonStatus,true); return getAbortReasonStatus(); } // - prepare Alert(s) for databases to sync bool anyfirstsyncs=false; bool anyslowsyncs=false; TLocalEngineDS *localDS; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // prepare alert (Note: datastore may be run by a superdatastore) localDS = *pos; status=localDS->engPrepareClientSyncAlert(); if (status!=LOCERR_OK) { // local database error return localError(status); // not found } if (localDS->fFirstTimeSync) anyfirstsyncs=true; if (localDS->fSlowSync) anyslowsyncs=true; } // send devinf in Put command right away with init message if either... // - mustSendDevInf() returns true signalling an external condition that suggests sending devInf (like changed config) // - any datastore is doing first time sync // - fPutDevInfAtSlowSync is true and any datastore is doing slow sync // - not already sent (can be true here in later sync cycles) if (!fRemoteGotDevinf && (mustSendDevInf() || anyfirstsyncs || (anyslowsyncs && static_cast(getRootConfig()->fAgentConfigP)->fPutDevInfAtSlowSync)) ) { TDevInfPutCommand *putcmdP = new TDevInfPutCommand(this); issueRootPtr(putcmdP); } // try to load devinf from cache (only if we don't know it already) if (!fRemoteDataStoresKnown || !fRemoteDataTypesKnown) { SmlDevInfDevInfPtr_t devinfP; if (loadRemoteDevInf(getRemoteURI(),devinfP)) { // we have cached devinf, analyze it now analyzeRemoteDevInf(devinfP); } } // GET the server's info if server didn't send it and we haven't cached at least the datastores if (!fRemoteDataStoresKnown) { // if we know datastores here, but not types, this means that remote does not have // CTCap, so it makes no sense to issue a GET again. #ifndef NO_DEVINF_GET PDEBUGPRINTFX(DBG_REMOTEINFO,("Nothing known about server, request DevInf using GET command")); TGetCommand *getcommandP = new TGetCommand(this); getcommandP->addTargetLocItem(SyncMLDevInfNames[fSyncMLVersion]); string devinftype=SYNCML_DEVINF_META_TYPE; addEncoding(devinftype); getcommandP->setMeta(newMetaType(devinftype.c_str())); ISSUE_COMMAND_ROOT(this,getcommandP); #endif } // - create Alert(s) for databases to sync for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // create alert for non-subdatastores localDS = *pos; if (!localDS->isSubDatastore()) { TAlertCommand *alertcmdP; status = localDS->engGenerateClientSyncAlert(alertcmdP); if (status!=0) { // local database error return status; // not found } ///%%%% unneeded (probably got here by copy&paste accidentally): if (localDS->fFirstTimeSync) anyfirstsyncs=true; // issue alert issueRootPtr(alertcmdP); } } // append sync phase if we have combined init/sync if (fOutgoingState==psta_initsync) { fOutgoingState=psta_sync; fRestarting=false; } } // process sync/syncop/map generating phases after init if (!isSuspending()) { // normal, session continues if (fOutgoingState==psta_sync) { // hold back sync until server has finished first package (init or initsync) if (fIncomingState==psta_sync || fIncomingState==psta_initsync) { // start sync for alerted datastores for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // Note: some datastores might be aborted due to unsuccessful alert. if ((*pos)->isActive()) { // prepare engine for sync (%%% new routine in 3.2.0.3, summarizing engInitForSyncOps() and // switching to dssta_dataaccessstarted, i.e. loading sync set), but do in only once if (!((*pos)->testState(dssta_syncsetready))) { // not yet started status = (*pos)->engInitForClientSync(); if (status!=LOCERR_OK ) { // failed if (status!=LOCERR_DATASTORE_ABORT) { AbortSession(status,true); return getAbortReasonStatus(); } } } // start or continue (which is largely nop, as continuing works via unfinished sync command) // generating sync items (*pos)->engClientStartOfSyncMessage(); } } } } else if (fOutgoingState==psta_map) { // hold back map until server has started sync at least (incominstate >=psta_sync) // NOTE: This is according to the specs, which says that client can begin // with Map/update status package BEFORE sync package from server is // completely received. // NOTE: Starfish server expects this and generates a few 222 alerts // if we wait here, but then goes to map as well // (so (fIncomingState==psta_map)-version works as well here! // %%%% other version: wait until server has started map phase as well // %%%% if (fIncomingState==psta_map) { if (fIncomingState>=psta_sync) { // start map for synced datastores for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // Note: some datastores might be aborted due to unsuccessful alert. if ((*pos)->isActive()) { // now call datastore to generate map command if not already done (*pos)->engClientStartOfMapMessage(fIncomingState just generate a Alert 222 and wait for server to complete PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("Client finished so far, but needs to wait in supplement outgoing state until server finishes phase")); } else if (fOutgoingState!=psta_init) { // NOTE: can be psta_init because "if" begins again after psta_init checking // to allow psta_init appending psta_sync for combined init/sync // no known state return 9999; // %%%%% } } // if not suspended // security only: exit here if session got aborted in between if (isAborted()) return getAbortReasonStatus(); // done & error if (!fInProgress) return 9999; // that's fine with us // now, we know that we will (most probably) send a message, so default for aDone is false from now on aDone=false; bool outgoingfinal; // check for suspend if (isSuspending()) { // make sure we send a Suspend Alert TAlertCommand *alertCmdP = new TAlertCommand(this,NULL,(uInt16)224); // - we just put local and remote URIs here SmlItemPtr_t itemP = newItem(); itemP->target = newLocation(fRemoteURI.c_str()); itemP->source = newLocation(fLocalURI.c_str()); alertCmdP->addItem(itemP); ISSUE_COMMAND_ROOT(this,alertCmdP); // outgoing message is final, regardless of any session state outgoingfinal=true; MarkSuspendAlertSent(true); } else { // Determine if package can be final and if we need an 222 Alert // NOTE: if any commands were interruped or not sent due to outgoing message // size limits, FinishMessage() will prevent final anyway, so no // separate checking for enOfSync or endOfMap is needed. // - can finalize message when server has at least started answering current package // OR if this is the first message (probably repeatedly) sent outgoingfinal = fIncomingState >= fOutgoingState || fIncomingState==psta_idle; if (outgoingfinal) { // allow early success here in case of nothing to respond, and nothing pending // StarFish server does need this... if (!fNeedToAnswer) { if (hasPendingCommands()) { // we have pending commands, cannot be final message outgoingfinal=false; } else { // no pending commands -> we're done now PDEBUGPRINTFX(DBG_PROTO,("Early end of session (nothing to send to server any more) -> calling engFinishDataStoreSync() for datastores now")); // - end sync in all datastores (save anchors etc.) for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) (*pos)->engFinishDataStoreSync(); // successful end PDEBUGPRINTFX(DBG_PROTO,("Session not any more in progress: NextMessage() returns OK status=0")); // done & ok aDone=true; return LOCERR_OK; } } } } /* A dummy alert indicates this is a message with only alert222 request*/ bool dummyAlert = false; if (!outgoingfinal) { // - send Alert 222 if we need to continue package but have nothing to send // (or ALWAYS_CONTINUE222 defined) #ifndef ALWAYS_CONTINUE222 if (!fNeedToAnswer) #endif { /* End-less loop detection * Some servers will never end and triggers client sends * ALERT222 forever. Detect this scenario and abort the session if * detected. * It is still valid for the server to use ALERT222 to "keep-alive" the * connection. * Therefore the loop detection criteria is: * - Nothing to send except the 222 Alert (!fNeedToAnswer) * - 5 adjacent 222 alerts within 20 seconds * - no status for an actual sync op command received (fOutgoingAlert222Count will be reset by those) * because a server sending pending status in small chunks could also trigger the detector otherwise */ if (!fNeedToAnswer) { dummyAlert = true; if (fOutgoingAlert222Count++ == 0) { // start of 222 loop detection time fLastOutgoingAlert222 = getSystemNowAs(TCTX_UTC); } else if (fOutgoingAlert222Count > 5) { lineartime_t curTime = getSystemNowAs(TCTX_UTC); if (curTime - fLastOutgoingAlert222 < 20*secondToLinearTimeFactor) { PDEBUGPRINTFX(DBG_ERROR,( "Warning: More than 5 consecutive Alert 222 within 20 seconds- " "looks like endless loop, abort session" )); AbortSession(400, false); return getAbortReasonStatus(); } else { fOutgoingAlert222Count = 0; } } } // not final, and nothing to answer otherwise: create alert-Command to request more info TAlertCommand *alertCmdP = new TAlertCommand(this,NULL,(uInt16)222); // %%% not clear from spec what has to be in item for 222 alert code // but there MUST be an Item for the Alert command according to SyncML TK // - we just put local and remote URIs here SmlItemPtr_t itemP = newItem(); itemP->target = newLocation(fRemoteURI.c_str()); itemP->source = newLocation(fLocalURI.c_str()); alertCmdP->addItem(itemP); ISSUE_COMMAND_ROOT(this,alertCmdP); } } // We send a response with no dummy alert, so reset the alert detector if (!dummyAlert) { fOutgoingAlert222Count = 0; } // Normally the package will be closed normally when the client is // ready. The exception is if we might want to restart the sync // session. This is checked below. bool finalprevented = false; // send custom end-of session puts or restart session if (!isSuspending() && outgoingfinal && fOutgoingState==psta_map) { // End of outgoing map package; let custom PUTs which may transmit some session statistics etc. happen now // TODO: this code is not reached when fOutgoingState==psta_map is skipped // by ClientMessageEnded() (see "All datastores in from-client-only mode, and no need to answer: skip map phase"). // A bug? For restarting a sync, the problem is avoided by // disabling the standard-compliant "skip map phase" in favor // of "let client enter map phase" mode (fCompleteFromClientOnly). issueCustomEndPut(); if (restartSync()) { // don't allow if we are going to restart sync in // ClientMessageEnded(), also remember that we did that finalprevented=true; // flag for TSyncAgent::ClientMessageEnded() fRestartingSync=true; } } // message complete, now finish it FinishMessage( outgoingfinal, // allowed if possible finalprevented // final not allowed when restarting sync ); // Note, now fNewOutgoingPackage is set (by FinishMessage()) // if next message will be responded to with a new package // debug info #ifdef SYDEBUG if (PDEBUGMASK & DBG_SESSION) { PDEBUGPRINTFX(DBG_SESSION,( "---> NextMessage, outgoing state='%s', incoming state='%s'", PackageStateNames[fOutgoingState], PackageStateNames[fIncomingState] )); for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // Show state of local datastores PDEBUGPRINTFX(DBG_SESSION,( "Local Datastore '%s': %sState=%s, %s%s sync, %s%s", (*pos)->getName(), (*pos)->isAborted() ? "ABORTED - " : "", (*pos)->getDSStateName(), (*pos)->isResuming() ? "RESUMED " : "", (*pos)->fSlowSync ? "SLOW" : "normal", SyncModeDescriptions[(*pos)->fSyncMode], (*pos)->fServerAlerted ? ", Server-Alerted" : "" )); } } PDEBUGENDBLOCK("SyncML_Outgoing"); if (getLastIncomingMsgID()>0) { // we have already received an incoming message, so we have started an "SyncML_Incoming" blocks sometime PDEBUGENDBLOCK("SyncML_Incoming"); // terminate debug block of previous incoming message as well } #endif // ok return LOCERR_OK; // ok } // TSyncAgent::NextMessage // called after successful decoding of an incoming message bool TSyncAgent::ClientMessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad) { // message not authorized by default fMessageAuthorized=false; // Check information from SyncHdr if ( aBad || (!(fSynchdrSessionID==smlPCDataToCharP(aContentP->sessionID))) || (!(fLocalURI==smlSrcTargLocURIToCharP(aContentP->target))) ) { // bad response PDEBUGPRINTFX(DBG_ERROR,( "Bad SyncHeader from Server. Syntax %s, SessionID (rcvd/correct) = '%s' / '%s', LocalURI (rcvd/correct) = '%s' / '%s'", aBad ? "ok" : "BAD", smlPCDataToCharP(aContentP->sessionID), fSynchdrSessionID.c_str(), smlSrcTargLocURIToCharP(aContentP->target), fLocalURI.c_str() )); aStatusCommand.setStatusCode(400); // bad response/request AbortSession(400,true); return false; } // check for suspend: if we are suspended at this point, this means that we have sent the Suspend Alert already // in the previous message (due to user suspend request), so we can now terminate the session if (isSuspending() && isSuspendAlertSent()) { AbortSession(514,true,LOCERR_USERSUSPEND); return false; } // - RespURI (remote URI to respond to) if (aContentP->respURI) { fRespondURI=smlPCDataToCharP(aContentP->respURI); DEBUGPRINTFX(DBG_PROTO,("RespURI set to = '%s'",fRespondURI.c_str())); } // authorization check // Note: next message will be started not before status for last one // has been processed. Commands issued before will automatically // be queued by issuePtr() // %%% none for now fSessionAuthorized=true; fMessageAuthorized=true; // returns false on BAD header (but true on wrong/bad/missing cred) return true; } // TSyncAgent::ClientMessageStarted // determines new package states and sets fInProgress void TSyncAgent::ClientMessageEnded(bool aIncomingFinal) { TLocalDataStorePContainer::iterator pos; // show status before processing PDEBUGPRINTFX(DBG_SESSION,( "MessageEnded starts : old outgoing state='%s', old incoming state='%s', %sNeedToAnswer", PackageStateNames[fOutgoingState], PackageStateNames[fIncomingState], fNeedToAnswer ? "" : "NO " )); bool allFromClientOnly=false; // process exceptions if (fAborted) { PDEBUGPRINTFX(DBG_ERROR,("***** Session is flagged 'aborted' -> MessageEnded ends package and session")); fOutgoingState=psta_idle; fIncomingState=psta_idle; fInProgress=false; } // if aborted else if (!fMessageAuthorized) { // not authorized messages will just be ignored, so // nothing changes in states // %%% this will probably not really work, as we would need to repeat the last // message in this (unlikely) case that fMessageAuthorized is not set for // a non-first message (first message case is handled in handleHeaderStatus) DEBUGPRINTFX(DBG_ERROR,("***** received Message not authorized, ignore and DONT end package")); fInProgress=true; } else { fInProgress=true; // assume we need to continue allFromClientOnly=checkAllFromClientOnly(); // new outgoing state is determined by the incomingState of this message // (which is the answer to the message of the previous outgoing package) if (fNewOutgoingPackage && fIncomingState!=psta_idle) { // last message sent was an end-of-package, so next will be a new package if (fIncomingState==psta_init) { // server has responded (or is still responding) to our finished init, // so client enters sync state now (but holds back sync until server // has finished init) fOutgoingState=psta_sync; fRestarting=false; } else if (fIncomingState==psta_sync || fIncomingState==psta_initsync) { // server has started (or already finished) sending statuses for our // or its own // client can enter map state (but holds back maps until server // has finished sync/initsync). In case of allFromClientOnly, we skip the map phase // but only if there is no need to answer. // Otherwise, this is most probably an old (pre 2.9.8.2) Synthesis server that has // sent an empty (and the status for it has set fNeedToAnswer), so we still // go to map phase. if (allFromClientOnly && !fNeedToAnswer) { fOutgoingState=psta_supplement; // all datastores are from-client-only, skip map phase PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("All datastores in from-client-only mode, and no need to answer: skip map phase")); } else { fOutgoingState=psta_map; // Some datastores do from-server-only or twoway, so we need a map phase allFromClientOnly=false; // do not skip map phase } } else { // map is finished as well, we might need extra packages just to // finish getting results for map commands fOutgoingState=psta_supplement; } } // New incoming state is simply derived from the incoming state of // this message if (fRestartingSync) { PDEBUGPRINTFX(DBG_HOT,("MessageEnded: restart sync")); fOutgoingState=psta_init; fIncomingState=psta_init; } else if (aIncomingFinal && fIncomingState!=psta_idle) { if (fIncomingState==psta_init) { // switch to sync fIncomingState=psta_sync; } else if (fIncomingState==psta_sync || fIncomingState==psta_initsync) { // check what to do if (allFromClientOnly) { // no need to answer and allFromClientOnly -> this is the end of the session fIncomingState=psta_supplement; fInProgress=false; // normally, at end of map answer, we are done } else { fIncomingState=psta_map; } } else { // end of a map phase - end of session (if no fNeedToAnswer) fIncomingState=psta_supplement; // this only ALLOWS ending the session, but it will continue as long // as more than OK for SyncHdr (fNeedToAnswer) must be sent fInProgress=false; // normally, at end of map answer, we are done } } // continue anyway as long as we need to answer if (fNeedToAnswer) fInProgress=true; } // show states PDEBUGPRINTFX(DBG_HOT,( "MessageEnded finishes : new outgoing state='%s', new incoming state='%s', %sNeedToAnswer", PackageStateNames[fOutgoingState], PackageStateNames[fIncomingState], fNeedToAnswer ? "" : "NO " )); // let all local datastores know that message has ended for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { TLocalEngineDS *localDS = *pos; // let them know localDS->engEndOfMessage(); if (fRestartingSync) { // finish current session as far as the datastore is concerned localDS->engFinishDataStoreSync(LOCERR_OK); // and start again localDS->changeState(dssta_adminready); localDS->fFirstTimeSync = false; // unsetting flow sync leads to new sync mode: // - slow sync -> two-way sync or one-way if data direction was limited // - refresh sync -> one-way sync in same direction // - one-way sync -> do it again localDS->fSlowSync = false; } // Show state of local datastores PDEBUGPRINTFX(DBG_HOT,( "Local Datastore '%s': %sState=%s, %s%s sync, %s%s", localDS->getName(), localDS->isAborted() ? "ABORTED - " : "", localDS->getDSStateName(), localDS->isResuming() ? "RESUMED " : "", localDS->isSlowSync() ? "SLOW" : "normal", SyncModeDescriptions[localDS->getSyncMode()], localDS->fServerAlerted ? ", Server-Alerted" : "" )); } fRestartingSync = false; // thread might end here, so stop profiling TP_STOP(fTPInfo); } // TSyncAgent::ClientMessageEnded // get credentials/username to authenticate with remote party, NULL if none SmlCredPtr_t TSyncAgent::newCredentialsForRemote(void) { if (fNeedAuth) { // generate cretentials from username/password PDEBUGPRINTFX(DBG_PROTO+DBG_USERDATA,("Authenticating with server as user '%s'", fServerUser.c_str())); PDEBUGPRINTFX(DBG_PROTO+DBG_USERDATA+DBG_EXOTIC,("- using nonce '%s'", fRemoteNonce.c_str())); // NOTE: can be NULL when fServerRequestedAuth is auth_none return newCredentials( fServerUser.c_str(), fServerPassword.c_str() ); } else { // already authorized, no auth needed return NULL; } } // TSyncAgent::newCredentialsForRemote // get client base TSyncClientBase *TSyncAgent::getClientBase(void) { return static_cast(getSyncAppBase()); } // TSyncAgent::getClientBase // retry older protocol, returns false if no older protocol to try bool TSyncAgent::retryOlderProtocol(bool aSameVersionRetry, bool aOldMessageInBuffer) { if (fIncomingState==psta_idle) { // if we have not started a session yet and not using oldest protocol already, // we want to retry with next older SyncML version if (aSameVersionRetry) { // just retry same version PDEBUGPRINTFX(DBG_PROTO,("Retrying session start with %s",SyncMLVerProtoNames[fSyncMLVersion])); } else if (fSyncMLVersion>getSessionConfig()->fMinSyncMLVersionSupported) { // next lower fSyncMLVersion=(TSyncMLVersions)(((uInt16)fSyncMLVersion)-1); PDEBUGPRINTFX(DBG_PROTO,("Server does not support our SyncML version, trying with %s",SyncMLVerProtoNames[fSyncMLVersion])); } else { // cannot retry return false; } // retry retryClientSessionStart(aOldMessageInBuffer); return true; } // session already started or no older protocol to try return false; } // TSyncAgent::retryOlderProtocol // prepares client session such that it will do a retry to start a session // (but keeping already received auth/nonce/syncML-Version state) void TSyncAgent::retryClientSessionStart(bool aOldMessageInBuffer) { TAgentConfig *configP = static_cast(getRootConfig()->fAgentConfigP); // now restarting PDEBUGPRINTFX(DBG_HOT,("=================> Retrying Client Session Start")); bool newSessionForAuthRetry = configP->fNewSessionForAuthRetry; bool noRespURIForAuthRetry = configP->fNoRespURIForAuthRetry; // check if we should use modified behaviour (smart retries) if (configP->fSmartAuthRetry && fAuthRetries>MAX_NORMAL_AUTH_RETRIES) { if (newSessionForAuthRetry) { // if we had new session for retry, switch to in-session retry now newSessionForAuthRetry = false; noRespURIForAuthRetry = false; } else { // if we had in-session retry, try new session retry now newSessionForAuthRetry = true; noRespURIForAuthRetry = true; } PDEBUGPRINTFX(DBG_PROTO,("Smart retry with modified behaviour: newSessionForAuthRetry=%d, noRespURIForAuthRetry=%d",newSessionForAuthRetry,noRespURIForAuthRetry)); } // now retry if (newSessionForAuthRetry) { // Notes: // - must apparently be disabled for SCTS 3.1.2 and possibly Mightyphone // - must be enabled e.g for for Magically Server // Create new session ID StringObjPrintf(fSynchdrSessionID,"%hd",(sInt16)++fClientSessionNo); // restart message counting at 1 fIncomingMsgID=0; fOutgoingMsgID=0; // we must terminate the block here when we reset fIncomingMsgID, as NextMessage // only closes the incoming block when fIncomingMsgID>0 PDEBUGENDBLOCK("SyncML_Incoming"); } if (noRespURIForAuthRetry) { // Notes: // - must apparently be switched on for Starfish. // - must apparently be switched off for SCTS 3.1.2. // make sure we send next msg to the original URL fRespondURI=fRemoteURI; } // - make sure status for SyncHdr will not be generated! forgetHeaderWaitCommands(); // check if we have already started next outgoing message if (!fOutgoingStarted) { if (aOldMessageInBuffer) { // make sure we start with a fresh output buffer // Note: This usually only occur when we are not currently parsing // part of the buffer. If we are parsing, the remaining incoming // message gets cleared as well. getClientBase()->clrUnreadSmlBufferdata(); } // start a new message issueHeader(false); } else { if (aOldMessageInBuffer) { PDEBUGPRINTFX(DBG_ERROR,("Warning - restarting session with old message in output buffer")); } } // - make sure subsequent commands (most probably statuses for Alerts) // don't get processed AbortCommandProcessing(0); // silently discard all further commands // - make sure possible processing errors do not abort the session fIgnoreMsgErrs = true; } // TSyncAgent::retryClientSessionStart #endif // SYSYNC_CLIENT #ifdef SYSYNC_SERVER // undefine these only for tests. Introduced to find problem with T68i #define RESPURI_ONLY_WHEN_NEEDED // create a RespURI string. If none needed, return NULL SmlPcdataPtr_t TSyncAgent::newResponseURIForRemote(void) { if (IS_CLIENT) { return NULL; } // do it in a transport-independent way, therefore let dispatcher do it string respURI; // empty string if (fUseRespURI) { getSyncAppBase()->generateRespURI( respURI, // remains unaffected if no RespURI could be calculated fInitialLocalURI.c_str(), // initial URI used by remote to send first message fLocalSessionID.c_str() // server generated unique session ID ); // Omit RespURI if local URI as seen by client is identical if (getServerConfig()->fRespURIOnlyWhenDifferent) { // create RespURI only if different from original URI if (respURI==fLocalURI) { respURI.erase(); DEBUGPRINTFX(DBG_SESSION,( "Generated RespURI and sourceLocURI are equal (%s)-> RespURI omitted", fLocalURI.c_str() )); } } } // Note: returns NULL if respURI is empty string return newPCDataOptString(respURI.c_str()); } // newResponseURIForRemote // called after successful decoding of an incoming message bool TSyncAgent::ServerMessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad) { // message not authorized by default fMessageAuthorized=false; // Get information from SyncHdr which is needed for answers // - session ID to be used for responses fSynchdrSessionID=smlPCDataToCharP(aContentP->sessionID); // - local URI (as seen by remote client) fLocalURI=smlSrcTargLocURIToCharP(aContentP->target); fLocalName=smlSrcTargLocNameToCharP(aContentP->target); // - also remember URI to which first message was sent // %%% note: incoming ID is not a criteria, because it might be >1 due to // client retrying something which it thinks is for the same session //if (fIncomingMsgID==1) { if (fOutgoingMsgID==0) { // this is the first message, remember first URI used to contact server // (or set preconfigured string from ) if (getServerConfig()->fExternalURL.empty()) fInitialLocalURI=fLocalURI; // use what client sends to us else fInitialLocalURI=getServerConfig()->fExternalURL; // use preconfigured URL // Many clients, including SCTS send the second login attempt with a MsgID>1, // and depending on how they handle RespURI, they might get a new session for that // -> so, just handle the case that a new session does not start with MsgID=1 if (fIncomingMsgID>1) { PDEBUGPRINTFX(DBG_ERROR,( "New session gets first message with MsgID=%ld (should be 1). Might be due to retries, adjusting OutgoingID as well", (long)fIncomingMsgID )); fOutgoingMsgID=fIncomingMsgID-1; // to make it match what client expects } } // - remote URI fRemoteURI=smlSrcTargLocURIToCharP(aContentP->source); fRemoteName=smlSrcTargLocNameToCharP(aContentP->source); // - RespURI (remote URI to respond to, if different from source) fRespondURI.erase(); if (aContentP->respURI) { fRespondURI=smlPCDataToCharP(aContentP->respURI); DEBUGPRINTFX(DBG_PROTO,("RespURI specified = '%s'",fRespondURI.c_str())); } if (fRespondURI==fRemoteURI) fRespondURI.erase(); // if specified but equal to remote: act as if not specified // More checking if header was ok if (aBad) { // bad header, only do what is needed to get a status back to client fSessionAuthorized=false; fIncomingState=psta_init; fOutgoingState=psta_init; fNewOutgoingPackage=true; // issue header to make sure status can be sent back to client if (!fMsgNoResp) issueHeader(false); // issue header, do not prevent responses } else { // check busy (or expired) case if (serverBusy()) { #ifdef APP_CAN_EXPIRE if (getSyncAppBase()->fAppExpiryStatus!=LOCERR_OK) { aStatusCommand.setStatusCode(511); // server failure (expired) aStatusCommand.addItemString("License expired or invalid"); PDEBUGPRINTFX(DBG_ERROR,("License expired or invalid - Please contact Synthesis AG to obtain license")); } else #endif { aStatusCommand.setStatusCode(101); // busy } issueHeader(false); // issue header, do not prevent responses AbortSession(0,true); // silently discard rest of commands return false; // header not ok } // now check what state we are in if (fIncomingState==psta_idle) { // Initialize // - session-wide authorization not yet there fSessionAuthorized=false; fMapSeen=false; // - session has started, we are processing first incoming // package and generating first outgoing package // (init, possibly changed to combined init/sync by in this package) fIncomingState=psta_init; fOutgoingState=psta_init; fNewOutgoingPackage=true; } // authorization check if (fIncomingState>=psta_init) { // now check authorization if (!fSessionAuthorized) { // started, but not yet permanently authorized fMessageAuthorized=checkCredentials( smlSrcTargLocNameToCharP(aContentP->source), // user name in clear text according to SyncML 1.0.1 aContentP->cred, // actual credentials aStatusCommand ); // NOTE: aStatusCommand has now the appropriate status and chal (set by checkCredentials()) // if credentials do not match, stop processing commands (but stay with the session) if (!fMessageAuthorized) { AbortCommandProcessing(aStatusCommand.getStatusCode()); PDEBUGPRINTFX(DBG_PROTO,("Authorization failed with status %hd, stop command processing",aStatusCommand.getStatusCode())); } // now determine if authorization is permanent or not if (fMessageAuthorized) { fAuthFailures=0; // reset count if (messageAuthRequired()) { // each message needs autorisation again (or no auth at all) // - 200 ok, next message needs authorization again (or again: none) fSessionAuthorized=false; // no permanent authorization aStatusCommand.setStatusCode(200); // - add challenge for next auth (different nonce) aStatusCommand.setChallenge(newSessionChallenge()); PDEBUGPRINTFX(DBG_PROTO,("Authorization ok, but required again for subsequent messages: 200 + chal")); } else { // entire session is authorized fSessionAuthorized=true; // permanent authorization // - 212 authentication accepted (or 200 if none is reqired at all) aStatusCommand.setStatusCode(requestedAuthType()==auth_none ? 200 : 212); // - add challenge for next auth (in next session, but as we support carry // forward via using sessionID, we need to send one here as well) aStatusCommand.setChallenge(newSessionChallenge()); PDEBUGPRINTFX(DBG_PROTO,("Authorization accepted: 212")); } } } // authorisation check else { // already authorized from previous message PDEBUGPRINTFX(DBG_PROTO,("Authorization ok from previous request: 200")); fMessageAuthorized=true; } // Start response message AFTER auth check, to allow issueHeader // to check auth state and customize the header accordingly (no // RespURI for failed auth for example) if (!fMsgNoResp) { issueHeader(false); // issue header, do not prevent responses } } // if started at least } // if not aBad // return startmessage status // debug info #ifdef SYDEBUG if (PDEBUGMASK & DBG_SESSION) { PDEBUGPRINTFX(DBG_SESSION,( "---> MessageStarted, Message %sauthorized, incoming state='%s', outgoing state='%s'", fMessageAuthorized ? "" : "NOT ", PackageStateNames[fIncomingState], PackageStateNames[fOutgoingState] )); TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // Show state of local datastores PDEBUGPRINTFX(DBG_SESSION,( "Local Datastore '%s': State=%s, %s%s sync, %s%s", (*pos)->getName(), (*pos)->getDSStateName(), (*pos)->isResuming() ? "RESUMED " : "", (*pos)->fSlowSync ? "SLOW" : "normal", SyncModeDescriptions[(*pos)->fSyncMode], (*pos)->fServerAlerted ? ", Server-Alerted" : "" )); } } #endif // final check for too many auth failures if (!fMessageAuthorized) { #ifdef NO_NONCE_OLD_BEAHVIOUR AbortSession(aStatusCommand.getStatusCode(),true); // local error // avoid special treatment of non-authorized message, we have aborted, this is enough fMessageAuthorized=true; #else // Unsuccessful auth, count this fAuthFailures++; PDEBUGPRINTFX(DBG_ERROR,( "Authorization failed %hd. time, (any reason), sending status %hd", fAuthFailures, aStatusCommand.getStatusCode() )); // - abort session after too many auth failures if (fAuthFailures>=MAX_AUTH_ATTEMPTS) { PDEBUGPRINTFX(DBG_ERROR,("Too many (>=%d) failures, aborting session",MAX_AUTH_ATTEMPTS)); AbortSession(400,true); } #endif } // returns false on BAD header (but true on wrong/bad/missing cred) return true; } // TSyncAgent::ServerMessageStarted void TSyncAgent::ServerMessageEnded(bool aIncomingFinal) { bool alldone; TPackageStates newoutgoingstate,newincomingstate; TLocalDataStorePContainer::iterator pos; bool allFromClientOnly=false; // Incoming message ends here - what is following are commands initiated by the server // not directly related to a incoming command. PDEBUGENDBLOCK("SyncML_Incoming"); // assume that outgoing package is NOT finished, so outgoing state does not change newoutgoingstate=fOutgoingState; // new incoming state depends on whether this message is final or not if ((aIncomingFinal || (fIncomingState==psta_supplement)) && fMessageAuthorized) { // Note: in supplement state, incoming final is not relevant (may or may not be present, there is // no next phase anyway // find out if this is a shortened session (no map phase) due to // from-client-only in all datastores allFromClientOnly=checkAllFromClientOnly(); // determine what package comes next switch (fIncomingState) { case psta_init : newincomingstate=psta_sync; break; case psta_sync : case psta_initsync : // end of sync phase means end of session if all datastores are in from-client-only mode if (allFromClientOnly) { PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("All datastores in from-client-only mode: don't expect map phase from client")); newincomingstate=psta_supplement; } else { newincomingstate=psta_map; } break; case psta_map : case psta_supplement : // supplement state does not exit automatically // after map, possibly some supplement status/alert 222 messages are needed from client newincomingstate=psta_supplement; break; default: // by default, back to idle newincomingstate=psta_idle; break; } // switch } else { // not final or not authorized: no change in state newincomingstate=fIncomingState; } // show status before processing PDEBUGPRINTFX(DBG_SESSION,( "---> MessageEnded starts : old incoming state='%s', old outgoing state='%s', %sNeedToAnswer", PackageStateNames[fIncomingState], PackageStateNames[fOutgoingState], fNeedToAnswer ? "" : "NO " )); // process if (isAborted()) { // actual aborting has already taken place PDEBUGPRINTFX(DBG_ERROR,("***** Session is flagged 'aborted' -> MessageEnded ends package and session")); newoutgoingstate=psta_idle; newincomingstate=psta_idle; fInProgress=false; } // if aborted else if (isSuspending()) { // only flagged for suspend - but datastores are not yet aborted, do it now AbortSession(514,true,getAbortReasonStatus()); PDEBUGPRINTFX(DBG_ERROR,("***** Session is flagged 'suspended' -> MessageEnded ends package and session")); newoutgoingstate=psta_idle; newincomingstate=psta_idle; fInProgress=false; } else if (!fMessageAuthorized) { // not authorized messages will just be ignored, no matter if final or not, // so outgoing will NEVER be final on non-authorized messages // %%% before 1.0.4.9, this was fInProgress=true // DEBUGPRINTFX(DBG_ERROR,("***** Message not authorized, ignore and DONT end package, session continues")); // fInProgress=true; PDEBUGPRINTFX(DBG_ERROR,("***** Message not authorized, ignore msg and terminate session")); fInProgress=false; } else { // determine if session continues living or not // - if in other than idle state, session will continue fInProgress = (newincomingstate!=psta_idle) || // if not idle, we'll continue !fMessageAuthorized; // if not authorized, we'll continue as well (retrying auth) // Check if we need to send an Alert 222 to get more messages of this package if (!aIncomingFinal) { // not end of incoming package #ifndef ALWAYS_CONTINUE222 if (!fNeedToAnswer) #endif { #ifdef COMBINE_SYNCANDMAP // %%% make sure session gets to an end in case combined sync/map was used if (fMapSeen && fIncomingState==psta_map && fOutgoingState==psta_map) { DEBUGPRINTFX(DBG_HOT,("********** Incoming, non-final message in (combined)map state needs no answer -> force end of outgoing package")); newoutgoingstate=psta_idle; } else #endif { // detected 222-loop on init here: when we have nothing to answer in init // and nothing is alerted -> break session // %%% not sure if this is always ok if (fIncomingState<=psta_init) { PDEBUGPRINTFX(DBG_ERROR,("############## Looks like if we were looping in an init-repeat loop -> force final")); fInProgress=false; fOutgoingState=psta_idle; } else { // not final, and nothing to answer otherwise: create alert-Command to request more info TAlertCommand *alertCmdP = new TAlertCommand(this,NULL,(uInt16)222); // %%% not clear from spec what has to be in item for 222 alert code // but there MUST be an Item for the Alert command according to SyncML TK // - we just put local and remote URIs here SmlItemPtr_t itemP = newItem(); itemP->target = newLocation(fRemoteURI.c_str()); itemP->source = newLocation(fLocalURI.c_str()); alertCmdP->addItem(itemP); ISSUE_COMMAND_ROOT(this,alertCmdP); } } } } else { // end of package, finish processing package if (fIncomingState==psta_init) { // - try to load devinf from cache (only if we don't have both datastores and type info already) if (!fRemoteDataStoresKnown || !fRemoteDataTypesKnown) { SmlDevInfDevInfPtr_t devinfP; TStatusCommand dummystatus(this); if (loadRemoteDevInf(getRemoteURI(),devinfP)) { // we have cached devinf, analyze it now localstatus sta = analyzeRemoteDevInf(devinfP); PDEBUGPRINTFX(DBG_ERROR,("devInf from Cache could not be analyzed: error=%hd",sta)); } } // - if no DevInf for remote datastores cached or received yet, // issue GET for it now if (!fRemoteDataStoresKnown) { // if we know datastores here, but not types, this means that remote does not have // CTCap, so it makes no sense to issue a GET again. #ifndef NO_DEVINF_GET // end of initialisation package, but datastores not known yet // (=no DevInf Put received) --> ask for devinf now PDEBUGPRINTFX(DBG_REMOTEINFO,("No DevInf received or cached, request DevInf using GET command")); TGetCommand *getcommandP = new TGetCommand(this); getcommandP->addTargetLocItem(SyncMLDevInfNames[fSyncMLVersion]); string devinftype=SYNCML_DEVINF_META_TYPE; addEncoding(devinftype); getcommandP->setMeta(newMetaType(devinftype.c_str())); ISSUE_COMMAND_ROOT(this,getcommandP); #endif } } } // make sure syncing local datastores get informed of end-of--message if (fIncomingState==psta_sync || fIncomingState==psta_initsync) { // end of an incoming message of the Sync Package // - let all local datastores know, this is now the time to generate // commands, if needed // Note: if there are SyncEnd commands delayed, this means that this is // not yet the time to start commands. Instead, when all // queued SyncEnd commands are executed later, engEndOfSyncFromRemote() // will be called with the endOfAllSyncCommands flag true instead // of now. for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { (*pos)->engEndOfSyncFromRemote(aIncomingFinal && !delayedSyncEndsPending()); } } // Detect outgoing package state transitions // - init to sync if (fOutgoingState==psta_init && newincomingstate>psta_init) { // new outgoing state is sync. // Note: In combined init&sync mode, sync command received in init state // will set outgoing state from init to init-sync while processing message, // so no transition needs to be detected here newoutgoingstate=psta_sync; fRestarting=false; } // - sync to map else if ( (fOutgoingState==psta_sync || fOutgoingState==psta_initsync) && // outgoing is sync.. (newincomingstate>=psta_initsync) && // ..and incoming has finished sync !allFromClientOnly // ..and this is not a session with all datastores doing from-client-only ) { // outgoing message belongs to Sync package // - ask all local datastores if they are finished with sync command generation alldone=true; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { alldone = alldone && (*pos)->isSyncDone(); } if (alldone) { // outgoing state changes to map (or supplement if all datastores are from-client-only PDEBUGPRINTFX(DBG_HOT,("All datastores are done with generating ")); newoutgoingstate=psta_map; #ifdef COMBINE_SYNCANDMAP // %%% it seems as if 9210 needs combined Sync/Map package and if (fMapSeen) { // prevent FINAL to be sent at end of message DEBUGPRINTFX(DBG_HOT,("********** Combining outgoing sync and map-response packages into one")); fOutgoingState=psta_map; } #endif } } // - map (or from-client-only sync) to idle else if ( (fOutgoingState==psta_map && newincomingstate==psta_supplement) || (allFromClientOnly && (fOutgoingState==psta_sync || fOutgoingState==psta_initsync)) ) { // we are going back to idle now newoutgoingstate=psta_idle; // session ends if it doesn't need to continue for session-level reasons if (!sessionMustContinue()) { PDEBUGPRINTFX(DBG_HOT,("Session completed, now let datastores terminate all sync operations")); for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // finished with Map: end of sync (*pos)->engFinishDataStoreSync(); // successful } // session ends now fInProgress=false; // let custom PUTs which may transmit some session statistics etc. happen now issueCustomEndPut(); } } // - if no need to answer (e.g. nothing to send back except OK status for SyncHdr), // session is over now (as well) if (!fNeedToAnswer) fInProgress=false; } // else // Now finish outgoing message #ifdef DONT_FINAL_BAD_AUTH_ATTEMPTS // - PREVENT final flag after failed auth attempts if(FinishMessage( fOutgoingState!=newoutgoingstate || fOutgoingState==psta_idle, // final when state changed or idle !fMessageAuthorized || serverBusy() // busy or unauthorized prevent final flag at any rate )) #else // - DO set final flag after failed auth attempts if(FinishMessage( !fMessageAuthorized || fOutgoingState!=newoutgoingstate || fOutgoingState==psta_idle, // final when state changed or idle serverBusy() // busy prevents final flag at any rate )) #endif { // outgoing state HAS changed fOutgoingState=newoutgoingstate; } // Now update incoming state fIncomingState=newincomingstate; // show states PDEBUGPRINTFX(DBG_HOT,( "---> MessageEnded finishes : new incoming state='%s', new outgoing state='%s', %sNeedToAnswer", PackageStateNames[fIncomingState], PackageStateNames[fOutgoingState], fNeedToAnswer ? "" : "NO " )); // let all local datastores know that message has ended for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // let them know (*pos)->engEndOfMessage(); // Show state of local datastores PDEBUGPRINTFX(DBG_HOT,( "Local Datastore '%s': State=%s, %s%s sync, %s%s", (*pos)->getName(), (*pos)->getDSStateName(), (*pos)->isResuming() ? "RESUMED " : "", (*pos)->fSlowSync ? "SLOW" : "normal", SyncModeDescriptions[(*pos)->fSyncMode], (*pos)->fServerAlerted ? ", Server-Alerted" : "" )); } // End of outgoing message PDEBUGPRINTFX(DBG_HOT,( "=================> Finished generating outgoing message #%ld, request=%ld", (long)fOutgoingMsgID, (long)getSyncAppBase()->requestCount() )); PDEBUGENDBLOCK("SyncML_Outgoing"); } // TSyncAgent::ServerMessageEnded void TSyncAgent::RequestEnded(bool &aHasData) { // to make sure, finish any unfinished message FinishMessage(true); // final allowed, as this is an out-of-normal-order case anyway // if we need to answer, we have data // - SyncML specs 1.0.1 says that server must always respond, even if message // contains of a Status for the SyncHdr only aHasData=true; // %%% first drafts of 1.0.1 said that SyncHdr Status only messages must not be sent... // aHasData=fNeedToAnswer; // %%% // now let all datastores know that request processing ends here (so they might // prepare for a thread switch) // terminate sync with all datastores TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // now let them know that request has ended (*pos)->engRequestEnded(); } } // TSyncAgent::RequestEnded // Called at end of Request, returns true if session must be deleted // returns flag if data to be returned. If response URI was specified // different, it is returned in aRespURI, otherwise aRespURI is empty. bool TSyncAgent::EndRequest(bool &aHasData, string &aRespURI, uInt32 aReqBytes) { // count incoming data fIncomingBytes+=aReqBytes; // let client or server do what is needed if (fMessageRetried) { // Message processing cancelled CancelMessageProcessing(); // Nothing happened // - but count bytes fOutgoingBytes+=fBufferedAnswerSize; PDEBUGPRINTFX(DBG_HOT,( "========= Finished retried request with re-sending buffered answer (session %sin progress), incoming bytes=%ld, outgoing bytes=%ld", fInProgress ? "" : "NOT ", (long)aReqBytes, (long)fBufferedAnswerSize )); aHasData=false; // we do not have data in the sml instance (but we have/had some in the retry re-send buffer) } else { // end request RequestEnded(aHasData); // count bytes fOutgoingBytes+=getOutgoingMessageSize(); PDEBUGPRINTFX(DBG_HOT,( "========= Finished request (session %sin progress), processing time=%ld msec, incoming bytes=%ld, outgoing bytes=%ld", fInProgress ? "" : "NOT ", (long)((getSystemNowAs(TCTX_UTC)-getLastRequestStarted()) * nanosecondsPerLinearTime / 1000000), (long)aReqBytes, (long)getOutgoingMessageSize() )); // return RespURI (is empty if none specified or equal to message source URI) aRespURI = fRespondURI; } if (!fInProgress) { // terminate datastores here already in case we are not in progress any more // here. If any of the datastores are in progress at this point, this is a // protocol violation, and therefore we return a 400. // Note: resetting the session later will also call TerminateDatastores, but then // with a 408 (which is misleading when the session ends here due to protocol // problem. TerminateDatastores(400); } //%%% moved to happen before end of SyncML_Outgoing //PDEBUGENDBLOCK("SyncML_Incoming"); if (fRequestMinTime>0) { // make sure we spent enough time with this request, if not, artificially extend time // - get number of seconds already spent sInt32 t = (sInt32)((getSystemNowAs(TCTX_UTC)-getLastRequestStarted()) / (lineartime_t)secondToLinearTimeFactor); // - delay if needed if (t sleeping %ld seconds", (long)fRequestMinTime, (long)t, (long)fRequestMinTime-t )); CONSOLEPRINTF((" ...delaying response by %ld seconds because requestmintime is set to %ld",(long)fRequestMinTime,(long)(fRequestMinTime-t))); sleepLineartime((lineartime_t)(fRequestMinTime-t)*secondToLinearTimeFactor); } } // thread might end here, so stop profiling TP_STOP(fTPInfo); #ifdef SYDEBUG // we are not the main thread any longer getDbgLogger()->DebugThreadOutputDone(); #endif // return true if session is not in progress any more return(!fInProgress); } // TSyncAgent::EndRequest // buffer answer in the session's buffer if transport allows it Ret_t TSyncAgent::bufferAnswer(MemPtr_t aAnswer, MemSize_t aAnswerSize) { // get rid of previous buffered answer if (fBufferedAnswer) delete[] fBufferedAnswer; fBufferedAnswer=NULL; fBufferedAnswerSize=0; // save new answer (if not empty) if (aAnswer && aAnswerSize) { // allocate buffer fBufferedAnswer = new unsigned char[aAnswerSize]; // copy data if (!fBufferedAnswer) return SML_ERR_NOT_ENOUGH_SPACE; memcpy(fBufferedAnswer,aAnswer,aAnswerSize); // save size fBufferedAnswerSize=aAnswerSize; } return SML_ERR_OK; } // TSyncAgent::bufferAnswer // get buffered answer from the session's buffer if there is any void TSyncAgent::getBufferedAnswer(MemPtr_t &aAnswer, MemSize_t &aAnswerSize) { aAnswer=fBufferedAnswer; aAnswerSize=fBufferedAnswerSize; PDEBUGPRINTFX(DBG_HOT,( "Buffered answer read from session: %ld bytes", (long)fBufferedAnswerSize )); } // TSyncAgent::getBufferedAnswer // returns remaining time for request processing [seconds] sInt32 TSyncAgent::RemainingRequestTime(void) { if (IS_CLIENT) { // clients don't process requests, so there's no limit return 0x7FFFFFFF; // "infinite" } else { // if no request timeout specified, use session timeout sInt32 t = fRequestMaxTime ? fRequestMaxTime : getSessionConfig()->fSessionTimeout; // calculate number of remaining seconds return t==0 ? 0x7FFFFFFF : // "infinite" t - (sInt32)((getSystemNowAs(TCTX_UTC)-getLastRequestStarted()) / (lineartime_t)secondToLinearTimeFactor); } } // TSyncAgent::RemainingRequestTime // process a Map command in context of server session bool TSyncAgent::processMapCommand( SmlMapPtr_t aMapCommandP, // the map command contents TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater ) { bool allok=false; // assume not ok localstatus sta; // remember that this session has seen a map command already fMapSeen=true; // Detecting a map command in supplement incomin state indicates a // client like funambol that send to many in pre-map phases // (such as in 222-Alert messages). So we reset the session state back // to incoming/outgoing map to correct this client bug if (fIncomingState==psta_supplement) { // back to map phase, as client apparently IS still in map phase, despite too many // sent PDEBUGPRINTFX(DBG_ERROR,( "Warning: detected command after end of Map phase - buggy client sent too many . Re-entering map phase to compensate" )); fIncomingState=psta_map; fOutgoingState=psta_map; } // find database(s) // - get relative URI of requested database const char *targetdburi = smlSrcTargLocURIToCharP(aMapCommandP->target); TLocalEngineDS *datastoreP = findLocalDataStoreByURI(targetdburi); if (!datastoreP) { // no such local datastore aStatusCommand.setStatusCode(404); // not found } else { // local datastore found // - maps can be processed when we are at least ready for early (chached by client from previous session) maps if (datastoreP->testState(dssta_syncmodestable)) { // datastore is ready PDEBUGBLOCKFMT(("ProcessMap", "Processing items from Map command", "datastore=%s", targetdburi)); allok=true; // assume all ok SmlMapItemListPtr_t nextnode = aMapCommandP->mapItemList; while (nextnode) { POINTERTEST(nextnode->mapItem,("MapItemList node w/o MapItem")); PDEBUGPRINTFX(DBG_HOT,( "Mapping remoteID='%s' to localID='%s'", smlSrcTargLocURIToCharP(nextnode->mapItem->source), smlSrcTargLocURIToCharP(nextnode->mapItem->target) )); sta = datastoreP->engProcessMap( #ifdef DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS smlSrcTargLocURIToCharP(nextnode->mapItem->source), #else relativeURI(smlSrcTargLocURIToCharP(nextnode->mapItem->source)), #endif relativeURI(smlSrcTargLocURIToCharP(nextnode->mapItem->target)) ); if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,(" Mapping FAILED!")); aStatusCommand.setStatusCode(sta); allok=false; break; } // next mapitem nextnode=nextnode->next; } // while more mapitems // terminate Map command allok=datastoreP->MapFinishAsServer(allok,aStatusCommand); PDEBUGENDBLOCK("ProcessMap"); } else { // we must queue the command for later execution aQueueForLater=true; allok=true; // ok for now, we'll re-execute this later } } // database found return allok; } // TSyncAgent::processMapCommand // get next nonce string top be sent to remote party for subsequent MD5 auth void TSyncAgent::getNextNonce(const char *aDeviceID, string &aNextNonce) { fLastNonce.erase(); if (getServerConfig()->fAutoNonce) { // generate nonce out of source ref and session ID // This scheme can provide nonce carrying forward between // sessions by initializing lastNonce with the srcRef/sessionid-1 // assuming client to use nonce from last session. sInt32 sid; // use current day as nonce varying number sid = time(NULL) / 3600 / 24; generateNonce(fLastNonce,aDeviceID,sid); } else { // get constant nonce (if empty, this is NO nonce) fLastNonce=getServerConfig()->fConstantNonce; } // return new nonce DEBUGPRINTFX(DBG_PROTO,("getNextNonce: created nonce='%s'",fLastNonce.c_str())); aNextNonce=fLastNonce; } // TSyncAgent::getNextNonce // - get nonce string for specified deviceID void TSyncAgent::getAuthNonce(const char *aDeviceID, string &aAuthNonce) { // if no device ID, use session default nonce if (!aDeviceID) { TSyncSession::getAuthNonce(aDeviceID,fLastNonce); } else { // Basic nonce mechanism needing no per-device storage: // - we have no stored last nonce, but we can re-create nonce used // for last session with this device by the used algorithm if (getServerConfig()->fAutoNonce) { if (fLastNonce.empty()) { // none available, produce new one sInt32 sid; // use current day as nonce varying number sid = time(NULL) / 3600 / 24; generateNonce(fLastNonce,aDeviceID,sid); } } else { // return constant nonce fLastNonce=getServerConfig()->fConstantNonce; } } DEBUGPRINTFX(DBG_PROTO,("getAuthNonce: current auth nonce='%s'",fLastNonce.c_str())); aAuthNonce=fLastNonce; } // TSyncAgent::getAuthNonce // info about server status bool TSyncAgent::serverBusy(void) { // return flag (which might have been set by some connection // limit code in sessiondispatch). // When app is expired, all server sessions are busy anyway #ifdef APP_CAN_EXPIRE return fSessionIsBusy || (getSyncAppBase()->fAppExpiryStatus!=LOCERR_OK); #else return fSessionIsBusy; #endif } // TSyncAgent::serverBusy // access to config TAgentConfig *TSyncAgent::getServerConfig(void) { TAgentConfig *scP; GET_CASTED_PTR(scP,TAgentConfig,getSyncAppBase()->getRootConfig()->fAgentConfigP,DEBUGTEXT("no TAgentConfig","ss1")); return scP; } // TSyncAgent::getServerConfig #endif // SYSYNC_SERVER // info about requested auth type TAuthTypes TSyncAgent::requestedAuthType(void) { if (IS_SERVER) { #ifdef SYSYNC_SERVER return getServerConfig()->fRequestedAuth; #endif } else { return auth_none; // client does not require auth } } // TSyncAgent::requestedAuthType // check if auth type is allowed bool TSyncAgent::isAuthTypeAllowed(TAuthTypes aAuthType) { if (IS_SERVER) { #ifdef SYSYNC_SERVER return aAuthType>=getServerConfig()->fRequiredAuth; #endif } else { return true; // client accepts any auth } } // TSyncAgent::isAuthTypeAllowed // called when incoming SyncHdr fails to execute bool TSyncAgent::syncHdrFailure(bool aTryAgain) { if (IS_CLIENT) { // do not try to re-execute the header, just let message processing fail; // this will cause the client's main loop to try using an older protocol return false; } else { #ifdef SYSYNC_SERVER if (!aTryAgain) { // not already retried executing // special case: header failed to execute, this means that session must be reset // - Reset session (aborts all DB transactions etc.) ResetSession(); PDEBUGPRINTFX(DBG_ERROR,("Trying to recover SyncHdr failure: =========== Session restarted =====================")); // - now all session infos are gone except this command which is owned by // this function alone. Execute it again. aTryAgain=true; } else { // special special case: header failed to execute the second time DEBUGPRINTFX(DBG_ERROR,("Fatal internal problem, SyncHdr execution failed twice")); aTryAgain=false; // just to make sure SYSYNC_THROW(TSyncException("SyncHdr fatal execution problem")); } return aTryAgain; #endif } } // TSyncAgent::syncHdrFailure // handle status received for SyncHdr, returns false if not handled bool TSyncAgent::handleHeaderStatus(TStatusCommand *aStatusCmdP) { if (IS_CLIENT) { #ifdef SYSYNC_CLIENT TAgentConfig *configP = static_cast(getRootConfig()->fAgentConfigP); bool handled=true; const char *txt; SmlMetInfMetInfPtr_t chalmetaP=NULL; SmlChalPtr_t chalP; // first evaluate possible challenge in header status chalP = aStatusCmdP->getStatusElement()->chal; if (chalP) { chalmetaP = smlPCDataToMetInfP(chalP->meta); if (chalmetaP) { sInt16 ty; // - get auth type if (!chalmetaP->type) AbortSession(401,true); // missing auth, but no type txt = smlPCDataToCharP(chalmetaP->type); PDEBUGPRINTFX(DBG_PROTO,("Remote requests auth type='%s'",txt)); if (StrToEnum(authTypeSyncMLNames,numAuthTypes,ty,txt)) fRemoteRequestedAuth=(TAuthTypes)ty; else { AbortSession(406,true); // unknown auth type, not supported goto donewithstatus; } // - get auth format if (!smlPCDataToFormat(chalmetaP->format, fRemoteRequestedAuthEnc)) { AbortSession(406,true); // unknown auth format, not supported goto donewithstatus; } // - get next nonce if (chalmetaP->nextnonce) { // decode B64 uInt32 l; uInt8 *nonce = b64::decode(smlPCDataToCharP(chalmetaP->nextnonce), 0, &l); fRemoteNonce.assign((char *)nonce,l); b64::free(nonce); } // - show PDEBUGPRINTFX(DBG_PROTO,( "Next Cred will have type='%s' and format='%s' and use nonce='%s'", authTypeNames[fRemoteRequestedAuth], encodingFmtNames[fRemoteRequestedAuthEnc], fRemoteNonce.c_str() )); } /* %%% do not save here already, we don't know if SyncML version is ok moved to those status code cases below that signal // let descendant possibly save auth params saveRemoteParams(); */ } // now evaluate status code switch (aStatusCmdP->getStatusCode()) { case 101: // Busy // Abort AbortSession(101,false); break; case 212: // authentication accepted for entire session fNeedAuth=false; // no need for further auth PDEBUGPRINTFX(DBG_PROTO,("Remote accepted authentication for entire session")); case 200: // authentication accepted for this message // if this is the first authorized message we get an OK for the synchdr, this is // also the first incoming message that is really processed as init message if (fIncomingState==psta_idle && fMessageAuthorized) { // first incoming is expected to be same as first outgoing (init or initsync) fIncomingState=fOutgoingState; PDEBUGPRINTFX(DBG_PROTO,("Authenticated successfully with remote server")); } else { PDEBUGPRINTFX(DBG_PROTO,("Authentication with server ok for this message")); } // let descendant possibly save auth params saveRemoteParams(); break; case 501: // handle a "command not implemented" for the SyncHdr like 513 (indication that server does not like our header) case 400: // ..and 400 as well (sync4j case, as it seems) case 513: // bad protocol version case 505: // bad DTD version (NextHaus/DeskNow case) // try with next lower protocol PDEBUGENDBLOCK("processStatus"); // done processing status if (!retryOlderProtocol()) { // no older SyncML protocol we can try --> abort AbortSession(513,false); // server does not know any of our SyncML versions } break; case 401: // bad authentication // Bad authorisation if (fAuthRetries==0) // if first attempt is rejected with "bad", we conclude that the // last attempt was carrying auth data and was not a attempt to get challenge // from server. Therefore we count this as two tries (one get chal, one really failing) fAuthRetries=2; else fAuthRetries++; // just count attempt to auth /* %%% no longer required, is tested below at authfail: if (fAuthRetries>MAX_AUTH_RETRIES) { AbortSession(401,false); // abort session, too many retries break; } */ // Treat no nonce like empty nonce to make sure that a server (like SySync old versions...) // that does not send a nonce at all does not get auth with some old, invalid nonce string included. if (chalmetaP && chalmetaP->nextnonce==NULL) fRemoteNonce.erase(); // otherwise treat like 407 goto authfail; case 407: // authentication required // new since 2.0.4.6: count this as well (normally this happens once when sending // no auth to the server to force it to send us auth chal first). fAuthRetries++; authfail: PDEBUGPRINTFX(DBG_ERROR,("Authentication failed (status=%hd) with remote server",aStatusCmdP->getStatusCode())); // Auth fail after we have received a valid response for the init message indicates protocol messed up if (fIncomingState!=psta_idle) { AbortSession(400,true); // error in protocol handling from remote break; } // Check if smart retries (with modified in-session vs out-of-session behaviour) are enabled if (!configP->fSmartAuthRetry && fAuthRetries>MAX_NORMAL_AUTH_RETRIES) { fAuthRetries = MAX_SMART_AUTH_RETRIES+1; // skip additional smart retries } // Missing or bad authorisation, evaluate chal if (!chalmetaP || fAuthRetries>MAX_SMART_AUTH_RETRIES) { #ifdef SYDEBUG if (!chalmetaP) { PDEBUGPRINTFX(DBG_ERROR,("Bad auth but no challenge in response status -> can't work - no retry")); } #endif AbortSession(aStatusCmdP->getStatusCode(),false); // retries exhausted or no retry possible (no chal) -> stop session break; } // let descendant possibly save auth params saveRemoteParams(); // modify session for re-start PDEBUGENDBLOCK("processStatus"); // done processing status retryClientSessionStart(false); // no previously sent message in the buffer break; default: handled=false; // could not handle status } // switch donewithstatus: // Anyway, reception of status for header enables generation of next message header // (plus already generated commands such as status for response header) if (!fMsgNoResp && !isAborted()) { // issue header now if not already issued above if (!fOutgoingStarted) { // interrupt status processing block here as issueHeader will do a start-of-message PDEBUGBLOCK PDEBUGENDBLOCK("processStatus"); issueHeader(false); PDEBUGBLOCKDESC("processStatus","finishing processing incoming SyncHdr Status"); } } // return handled status return handled; #endif // SYSYNC_SERVER } else { // nothing special return inherited::handleHeaderStatus(aStatusCmdP); } } // TSyncAgent::handleHeaderStatus // - start sync group (called in client or server roles) bool TSyncAgent::processSyncStart( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater // will be set if command must be queued for later (re-)execution ) { if (IS_CLIENT) { #ifdef SYSYNC_CLIENT if (fIncomingState!=psta_sync && fIncomingState!=psta_initsync) { aStatusCommand.setStatusCode(403); // forbidden in this context PDEBUGPRINTFX(DBG_ERROR,("Sync command not allowed outside of sync phase (-> 403)")); AbortSession(400,true); return false; } // just find appropriate database, must be already initialized for sync! // determine local database to sync with (target) TLocalEngineDS *datastoreP = findLocalDataStoreByURI(smlSrcTargLocURIToCharP(aSyncP->target)); if (!datastoreP) { // no such local datastore PDEBUGPRINTFX(DBG_ERROR,("Sync command for unknown DS locURI '%s' (-> 404)",smlSrcTargLocURIToCharP(aSyncP->target))); aStatusCommand.setStatusCode(404); // not found return false; } else { // save the pointer, will e.g. be used to route subsequent server commands fLocalSyncDatastoreP=datastoreP; // let local datastore know return fLocalSyncDatastoreP->engProcessSyncCmd(aSyncP,aStatusCommand,aQueueForLater); } return true; #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER // Init datastores for sync localstatus sta = initSync( smlSrcTargLocURIToCharP(aSyncP->target), // local datastore smlSrcTargLocURIToCharP(aSyncP->source) // remote datastore ); if (sta!=LOCERR_OK) { aStatusCommand.setStatusCode(sta); return false; } // let local datastore prepare for sync as server // - let local process sync command bool ok=fLocalSyncDatastoreP->engProcessSyncCmd(aSyncP,aStatusCommand,aQueueForLater); // Note: ok means that the sync command is addressing existing datastores. However, // it does not mean that the actual processing is already executed; aQueueForLater // could be set! // if ok and not queued: update package states if (ok) { if (fIncomingState==psta_init || fIncomingState==psta_initsync) { // detected sync command in init package -> this is combined init/sync #ifdef SYDEBUG if (fIncomingState==psta_init) DEBUGPRINTFX(DBG_HOT,(" started init package -> switching to combined init/sync")); #endif // - set new incoming state fIncomingState=psta_initsync; // - also update outgoing state, if it is in init package if (fOutgoingState==psta_init) fOutgoingState=psta_initsync; } else if (fCmdIncomingState!=psta_sync) { DEBUGPRINTFX(DBG_ERROR,( " found in wrong incoming package state '%s' -> aborting session", PackageStateNames[fCmdIncomingState] )); aStatusCommand.setStatusCode(403); // forbidden fLocalSyncDatastoreP->engAbortDataStoreSync(403,true); // abort, local problem ok=false; } else { // - show sync start DEBUGPRINTFX(DBG_HOT,( " started, cmd-incoming state='%s', incoming state='%s', outgoing state='%s'", PackageStateNames[fCmdIncomingState], PackageStateNames[fIncomingState], PackageStateNames[fOutgoingState] )); } } return ok; #endif // SYSYNC_SERVER } } // TSyncAgent::processSyncStart #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= /// @brief Get new session key to access details of this session appPointer TSyncAgent::newSessionKey(TEngineInterface *aEngineInterfaceP) { return new TAgentParamsKey(aEngineInterfaceP,this); } // TSyncAgent::newSessionKey #ifdef ENGINE_LIBRARY TSyError TSyncAgent::SessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { #ifdef NON_FULLY_GRANULAR_ENGINE // pre-process step command and generate pseudo-steps to empty progress event queue // preprocess general step codes switch (aStepCmd) { case STEPCMD_TRANSPFAIL : // directly abort AbortSession(LOCERR_TRANSPFAIL,true); goto abort; case STEPCMD_ABORT : // directly abort AbortSession(LOCERR_USERABORT,true); abort: // also set the flag so subsequent progress events will result the abort status fAbortRequested=true; aStepCmd = STEPCMD_STEP; // convert to normal step goto step; case STEPCMD_SUSPEND : // directly suspend SuspendSession(LOCERR_USERSUSPEND); // also set the flag so subsequent pev_suspendcheck events will result the suspend status fSuspendRequested=true; aStepCmd = STEPCMD_OK; // this is a out-of-order step, and always just returns STEPCMD_OK. fEngineSessionStatus = 0; // ok for now, subsequent steps will perform the actual suspend goto done; // no more action for now case STEPCMD_STEP : step: // first just return all queued up progress events if (fProgressInfoList.size()>0) { // get first element in list TEngineProgressInfoList::iterator pos = fProgressInfoList.begin(); // pass it back to caller if caller is interested if (aInfoP) { *aInfoP = *pos; // copy progress event } // delete progress event from list fProgressInfoList.erase(pos); // that's it for now, engine state does not change, wait for next step aStepCmd = STEPCMD_PROGRESS; return LOCERR_OK; } else if (fPendingStepCmd != 0) { // now return previously generated step command // Note: engine is already in the new state matching fPendingStepCmd aStepCmd = fPendingStepCmd; fEngineSessionStatus = fPendingStatus; fPendingStepCmd=0; // none pending any more fPendingStatus=0; return fEngineSessionStatus; // return pending status now } // all progress events are delivered, now we can do the real work } #endif // NON_FULLY_GRANULAR_ENGINE // Now perform the actual step if (IS_CLIENT) { #ifdef SYSYNC_CLIENT fEngineSessionStatus = ClientSessionStep(aStepCmd,aInfoP); #endif // SYSYNC_CLIENT } else { #ifdef SYSYNC_SERVER fEngineSessionStatus = ServerSessionStep(aStepCmd,aInfoP); #endif // SYSYNC_SERVER } #ifdef NON_FULLY_GRANULAR_ENGINE // make sure caller issues STEPCMD_STEP to get all pending progress events if (fProgressInfoList.size()>0) { // save pending step command for returning later fPendingStepCmd = aStepCmd; fPendingStatus = fEngineSessionStatus; // return request for more steps instead aStepCmd = STEPCMD_OK; fEngineSessionStatus = LOCERR_OK; } #endif // NON_FULLY_GRANULAR_ENGINE done: // return step status return fEngineSessionStatus; } // TSyncAgent::SessionStep #ifdef PROGRESS_EVENTS bool TSyncAgent::HandleSessionProgressEvent(TEngineProgressInfo aProgressInfo) { // handle some events specially if (aProgressInfo.eventtype==pev_suspendcheck) return !(fSuspendRequested); else { // engine progress record that needs to be queued // - check for message if (aProgressInfo.eventtype==pev_display100) { // this is a pointer to a string, save it separately // extra1 is a pointer to the message text // - save it for retrieval via SessionKey fAlertMessage = (cAppCharP)(aProgressInfo.extra1); // - don't pass pointer aProgressInfo.extra1 = 0; } // queue progress event fProgressInfoList.push_back(aProgressInfo); } return !(fAbortRequested); } // TSyncAgent::HandleSessionProgressEvent #endif // PROGRESS_EVENTS #endif // ENGINE_LIBRARY #ifdef SYSYNC_SERVER // Server implementation // --------------------- #ifndef ENGINE_LIBRARY // dummy server engine support to allow AsKey from plugins #warning "using ENGINEINTERFACE_SUPPORT in old-style appbase-rooted environment. Should be converted to real engine usage later" // Engine factory function for non-Library case ENGINE_IF_CLASS *newServerEngine(void) { // For real engine based targets, newServerEngine must create a target-specific derivate // of the server engine, which then has a suitable newSyncAppBase() method to create the // appBase. For old-style environment, a generic TServerEngineInterface is ok, as this // in turn calls the global newSyncAppBase() which then returns the appropriate // target specific appBase. Here we just return a dummy server engine base. return new TDummyServerEngineInterface; } // newServerEngine /// @brief returns a new application base. TSyncAppBase *TDummyServerEngineInterface::newSyncAppBase(void) { // For not really engine based targets, the appbase factory function is // a global routine (for real engine targets, it is a true virtual of // the engineInterface, implemented in the target's leaf engineInterface derivate. // - for now, use the global appBase creator routine return sysync::newSyncAppBase(); // use global factory function } // TDummyServerEngineInterface::newSyncAppBase #else // old style // Real server engine support /// @brief Executes next step of the session /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to abort or time out the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TSyncAgent::ServerSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { uInt16 stepCmdIn = aStepCmd; localstatus sta = LOCERR_WRONGUSAGE; // init default response aStepCmd = STEPCMD_ERROR; // error if (aInfoP) { aInfoP->eventtype=PEV_NOP; aInfoP->targetID=0; aInfoP->extra1=0; aInfoP->extra2=0; aInfoP->extra3=0; } // if session is already aborted, no more steps are required if (isAborted()) { fServerEngineState = ses_done; // we are done } // handle pre-processed step command according to current engine state switch (fServerEngineState) { // Almost done state case ses_almostdone: // everything done, except for termination of session // - do it now TerminateSession(); // - now done fServerEngineState = ses_done; // fall through to done state // Done state case ses_done : // session done, nothing happens any more aStepCmd = STEPCMD_DONE; sta = LOCERR_OK; break; // Waiting for SyncML request data case ses_needdata: switch (stepCmdIn) { case STEPCMD_GOTDATA : { // got data, check content type MemPtr_t data = NULL; smlPeekMessageBuffer(getSmlWorkspaceID(), false, &data, &fRequestSize); // get request size SmlEncoding_t enc = TSyncAppBase::encodingFromData(data, fRequestSize); if (getEncoding()==SML_UNDEF) { // no encoding known so far - use what we found from looking at data PDEBUGPRINTFX(DBG_ERROR,( "Incoming data had no or invalid content type, Determined encoding by looking at data: %s", SyncMLEncodingNames[enc] )); setEncoding(enc); } else if (getEncoding()!=enc) { // already known encoding does not match actual encoding PDEBUGPRINTFX(DBG_ERROR,( "Warning: Incoming data encoding mismatch: expected=%s, found=%s", SyncMLEncodingNames[getEncoding()], SyncMLEncodingNames[enc] )); } if (getEncoding()==SML_UNDEF) { // if session encoding is still unknown at this point, reject data as non-SyncML PDEBUGPRINTFX(DBG_ERROR,("Incoming data is not SyncML")); sta = LOCERR_BADCONTENT; // bad content type aStepCmd = STEPCMD_ERROR; // Note: we do not abort the session here - app could have a retry strategy and re-enter // this step with better data break; } // content type ok - switch to processing mode fServerEngineState = ses_processing; aStepCmd = STEPCMD_OK; sta = LOCERR_OK; break; } } // switch stepCmdIn for ses_needdata break; // Waiting until SyncML answer data is sent // (only when session needs to continue, otherwise we are in ses_done) case ses_dataready: switch (stepCmdIn) { case STEPCMD_SENTDATA : // sent data, now wait for next request fServerEngineState = ses_needdata; aStepCmd = STEPCMD_NEEDDATA; sta = LOCERR_OK; break; } // switch stepCmdIn for ses_dataready break; // Ready for generation steps case ses_generating: switch (stepCmdIn) { case STEPCMD_STEP : sta = ServerGeneratingStep(aStepCmd,aInfoP); break; } // switch stepCmdIn for ses_generating break; // Ready for processing steps case ses_processing: switch (stepCmdIn) { case STEPCMD_STEP : sta = ServerProcessingStep(aStepCmd,aInfoP); break; } // switch stepCmdIn for ses_processing break; case numServerEngineStates: // invalid break; } // switch fServerEngineState // done return sta; } // TSyncAgent::ServerSessionStep // Step that processes SyncML request data TSyError TSyncAgent::ServerProcessingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { localstatus sta = LOCERR_WRONGUSAGE; InstanceID_t myInstance = getSmlWorkspaceID(); Ret_t rc; // now process next command PDEBUGPRINTFX(DBG_EXOTIC,("Calling smlProcessData(NEXT_COMMAND)")); #ifdef SYDEBUG MemPtr_t data = NULL; MemSize_t datasize; smlPeekMessageBuffer(getSmlWorkspaceID(), false, &data, &datasize); #endif rc=smlProcessData( myInstance, SML_NEXT_COMMAND ); if (rc==SML_ERR_CONTINUE) { // processed ok, but message not completely processed yet // - engine state remains as is aStepCmd = STEPCMD_OK; // ok w/o progress %%% for now, progress is delivered via queue in next step sta = LOCERR_OK; } else if (rc==SML_ERR_OK) { // message completely processed // - switch engine state to generating answer message (if any) aStepCmd = STEPCMD_OK; fServerEngineState = ses_generating; sta = LOCERR_OK; } else if (rc==LOCERR_RETRYMSG) { // server has detected that this message is a retry - report this to the app such that app can // first discard the instance buffer (consume everything in it) if (smlLockReadBuffer(myInstance,&data,&datasize)==SML_ERR_OK) smlUnlockReadBuffer(myInstance,datasize); // indicate that transport must resend the previous response PDEBUGPRINTFX(DBG_ERROR,( "Incoming message was identified as a retry - report STEPCMD_RESENDDATA - caller must resent last response" )); aStepCmd = STEPCMD_RESENDDATA; fServerEngineState = ses_dataready; } else { // processing failed PDEBUGPRINTFX(DBG_ERROR,("===> smlProcessData failed, returned 0x%hX",(sInt16)rc)); // dump the message that failed to process #ifdef SYDEBUG if (data) DumpSyncMLBuffer(data,datasize,false,rc); #endif // abort the session (causing proper error events to be generated and reported back) AbortSession(LOCERR_PROCESSMSG, true); // session is now done fServerEngineState = ses_done; // step by itself is ok - let app continue stepping (to restart session or complete abort) aStepCmd = STEPCMD_OK; sta = LOCERR_OK; } // done return sta; } // TSyncAgent::ServerProcessingStep // Step that generates (rest of) SyncML answer data at end of request TSyError TSyncAgent::ServerGeneratingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { bool done, hasdata; string respURI; // finish request done = EndRequest(hasdata, respURI, fRequestSize); // check different exit points if (hasdata) { // there is data to be sent aStepCmd = STEPCMD_SENDDATA; fServerEngineState = ses_dataready; } else { // no more data to send aStepCmd = STEPCMD_OK; // need one more step to finish } // in any case, if done, subsequent steps will terminate the session and return STEPCMD_DONE if (done) { // subsequent steps will all return STEPCMD_DONE fServerEngineState = ses_almostdone; } // request reset fRequestSize = 0; // finished generating outgoing message // - make sure read pointer is set (advanced in case incoming // message had trailing garbage) to beginning of generated // answer. With incoming message being clean SyncML without // garbage, this call is not needed, however with garbage // it is important because otherwise outgoing message // would have that garbage inserted before actual message // start. smlReadOutgoingAgain(getSmlWorkspaceID()); // return status return LOCERR_OK; } // TSyncAgent::ServerGeneratingStep #endif // ENGINE_LIBRARY #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT #ifdef ENGINE_LIBRARY // Client implementation // --------------------- /// @brief Executes next step of the session /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TSyncAgent::ClientSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { uInt16 stepCmdIn = aStepCmd; localstatus sta = LOCERR_WRONGUSAGE; // init default response aStepCmd = STEPCMD_ERROR; // error if (aInfoP) { aInfoP->eventtype=PEV_NOP; aInfoP->targetID=0; aInfoP->extra1=0; aInfoP->extra2=0; aInfoP->extra3=0; } // if session is already aborted, no more steps are required if (isAborted()) { fClientEngineState = ces_done; // we are done } // handle pre-processed step command according to current engine state switch (fClientEngineState) { // Idle state case ces_done : { // session done, nothing happens any more aStepCmd = STEPCMD_DONE; sta = LOCERR_OK; break; } case ces_idle : { // in idle, we can only start a session switch (stepCmdIn) { case STEPCMD_CLIENTSTART: case STEPCMD_CLIENTAUTOSTART: // initialize a new session sta = InitializeSession(fProfileSelectorInternal,stepCmdIn==STEPCMD_CLIENTAUTOSTART); if (sta!=LOCERR_OK) break; // engine is now ready, start generating first request fClientEngineState = ces_generating; // ok with no status aStepCmd = STEPCMD_OK; break; } // switch stepCmdIn for ces_idle break; } // Ready for generation steps case ces_generating: { switch (stepCmdIn) { case STEPCMD_STEP : sta = ClientGeneratingStep(aStepCmd,aInfoP); break; } // switch stepCmdIn for ces_generating break; } // Ready for processing steps case ces_processing: { switch (stepCmdIn) { case STEPCMD_STEP : sta = ClientProcessingStep(aStepCmd,aInfoP); break; } // switch stepCmdIn for ces_processing break; } // Waiting for SyncML data case ces_needdata: { switch (stepCmdIn) { case STEPCMD_GOTDATA : { // got data, now start processing it SESSION_PROGRESS_EVENT(this,pev_recvend,NULL,0,0,0); // check content type now MemPtr_t data = NULL; MemSize_t datasize; if (smlPeekMessageBuffer(getSmlWorkspaceID(), false, &data, &datasize) != SML_ERR_OK) { // SyncML TK has a problem when asked to store an empty message: // it then returns SML_ERR_WRONG_USAGE in smlPeekMessageBuffer and // leaves datasize unset. Happened after an application bug. // // Avoid undefined behavior and proceed without data (easier than // introducing an additional, untested error path). data = NULL; datasize = 0; } // check content type SmlEncoding_t enc = TSyncAppBase::encodingFromData(data, datasize); if (enc!=getEncoding()) { PDEBUGPRINTFX(DBG_ERROR,("Incoming data is not SyncML")); sta = LOCERR_BADCONTENT; // bad content type #ifdef SYDEBUG if (data) DumpSyncMLBuffer(data,datasize,false,SML_ERR_UNSPECIFIC); #endif // abort the session (causing proper error events to be generated and reported back) AbortSession(sta, true); // session is now done fClientEngineState = ces_done; aStepCmd = STEPCMD_ERROR; break; } // content type ok - switch to processing mode fIgnoreMsgErrs=false; // do not ignore errors by default fClientEngineState = ces_processing; aStepCmd = STEPCMD_OK; sta = LOCERR_OK; break; } case STEPCMD_RESENDDATA : // instead of having received new data, the network layer has found it needs to re-send the data. // performing the STEPCMD_RESENDDATA just generates a new send start event, but otherwise no engine action fClientEngineState = ces_resending; aStepCmd = STEPCMD_RESENDDATA; // return the same step command, to differentiate it from STEPCMD_SENDDATA SESSION_PROGRESS_EVENT(this,pev_sendstart,NULL,0,0,0); sta = LOCERR_OK; break; } // switch stepCmdIn for ces_needdata break; } // Waiting until SyncML data is sent case ces_dataready: case ces_resending: { switch (stepCmdIn) { case STEPCMD_SENTDATA : // allowed in dataready or resending state // sent (or re-sent) data, now request answer data SESSION_PROGRESS_EVENT(this,pev_sendend,NULL,0,0,0); fClientEngineState = ces_needdata; aStepCmd = STEPCMD_NEEDDATA; sta = LOCERR_OK; break; } // switch stepCmdIn for ces_dataready break; } case numClientEngineStates: { // invalid break; } } // switch fClientEngineState // done return sta; } // TSyncAgent::ClientSessionStep // Step that generates SyncML data TSyError TSyncAgent::ClientGeneratingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { localstatus sta = LOCERR_WRONGUSAGE; bool done; //%%% at this time, generate next message in one step sta = NextMessage(done); if (done) { // done with session, with or without error fClientEngineState = ces_done; // blocks any further activity with the session aStepCmd = STEPCMD_DONE; // terminate session to provoke all end-of-session progress events TerminateSession(); } else if (sta==LOCERR_OK) { // finished generating outgoing message // - make sure read pointer is set (advanced in case incoming // message had trailing garbage) to beginning of generated // answer. With incoming message being clean SyncML without // garbage, this call is not needed, however with garbage // it is important because otherwise outgoing message // would have that garbage inserted before actual message // start. smlReadOutgoingAgain(getSmlWorkspaceID()); // next is sending request to server fClientEngineState = ces_dataready; aStepCmd = STEPCMD_SENDDATA; SESSION_PROGRESS_EVENT(this,pev_sendstart,NULL,0,0,0); } // return status return sta; } // TSyncAgent::ClientGeneratingStep // Step that processes SyncML data TSyError TSyncAgent::ClientProcessingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { InstanceID_t myInstance = getSmlWorkspaceID(); Ret_t rc; localstatus sta = LOCERR_WRONGUSAGE; // now process next command PDEBUGPRINTFX(DBG_EXOTIC,("Calling smlProcessData(NEXT_COMMAND)")); #ifdef SYDEBUG MemPtr_t data = NULL; MemSize_t datasize; smlPeekMessageBuffer(getSmlWorkspaceID(), false, &data, &datasize); #endif rc=smlProcessData( myInstance, SML_NEXT_COMMAND ); if (rc==SML_ERR_CONTINUE) { // processed ok, but message not completely processed yet // - engine state remains as is aStepCmd = STEPCMD_OK; // ok w/o progress %%% for now, progress is delivered via queue in next step sta = LOCERR_OK; } else if (rc==SML_ERR_OK) { // message completely processed // - switch engine state to generating next message (if any) aStepCmd = STEPCMD_OK; fClientEngineState = ces_generating; sta = LOCERR_OK; } else { // processing failed PDEBUGPRINTFX(DBG_ERROR,("===> smlProcessData failed, returned 0x%hX",(sInt16)rc)); // dump the message that failed to process #ifdef SYDEBUG if (data) DumpSyncMLBuffer(data,datasize,false,rc); #endif if (!fIgnoreMsgErrs) { // abort the session (causing proper error events to be generated and reported back) AbortSession(LOCERR_PROCESSMSG, true); // session is now done fClientEngineState = ces_done; } else { // we must ignore errors e.g. because of session restart and go back to generate next message fClientEngineState = ces_generating; } // anyway, step by itself is ok - let app continue stepping (to restart session or complete abort) aStepCmd = STEPCMD_OK; sta = LOCERR_OK; } // now check if this is a session restart if (sta==LOCERR_OK && isStarting()) { // this is still the beginning of a session, which means // that we are restarting the session and caller should close // possibly open communication with the server before sending the next message aStepCmd = STEPCMD_RESTART; } // done return sta; } // TSyncAgent::ClientProcessingStep #endif // ENGINE_LIBRARY #endif // SYSYNC_CLIENT // Session runtime settings key // --------------------------- // Constructor TAgentParamsKey::TAgentParamsKey(TEngineInterface *aEngineInterfaceP, TSyncAgent *aAgentP) : inherited(aEngineInterfaceP,aAgentP), fAgentP(aAgentP) { } // TAgentParamsKey::TAgentParamsKey // - read local session ID static TSyError readLocalSessionID( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnString( mykeyP->fAgentP->getLocalSessionID(), aBuffer,aBufSize,aValSize ); } // readLocalSessionID // - read initial local URI static TSyError readInitialLocalURI( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnString( mykeyP->fAgentP->getInitialLocalURI(), aBuffer,aBufSize,aValSize ); } // readInitialLocalURI // - read abort status static TSyError readAbortStatus( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnInt( mykeyP->fAgentP->getAbortReasonStatus(), sizeof(TSyError), aBuffer,aBufSize,aValSize ); } // readAbortStatus // - write abort status, which means aborting a session TSyError writeAbortStatus( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); // abort the session TSyError sta = *((TSyError *)aBuffer); mykeyP->fAgentP->AbortSession(sta, true); return LOCERR_OK; } // writeAbortStatus // - read content type string static TSyError readContentType( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); string contentType = SYNCML_MIME_TYPE; mykeyP->fAgentP->addEncoding(contentType); return TStructFieldsKey::returnString( contentType.c_str(), aBuffer,aBufSize,aValSize ); } // readContentType // - write content type string static TSyError writeContentType( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { string contentType((cAppCharP)aBuffer,aValSize); TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); mykeyP->fAgentP->setEncoding(TSyncAppBase::encodingFromContentType(contentType.c_str())); return LOCERR_OK; } // writeContentType // - read connection URL static TSyError readConnectURI( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnString( mykeyP->fAgentP->getSendURI(), aBuffer,aBufSize,aValSize ); } // readConnectURI // - read host part of connection URL static TSyError readConnectHost( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); string host, port; splitURL(mykeyP->fAgentP->getSendURI(),NULL,&host,NULL,NULL,NULL,&port,NULL); // old semantic of splitURL was to include port in host string, // continue doing that if (!port.empty()) { host += ':'; host += port; } return TStructFieldsKey::returnString( host.c_str(), aBuffer,aBufSize,aValSize ); } // readConnectHost // - read document part of connection URL static TSyError readConnectDoc( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); string doc, query; splitURL(mykeyP->fAgentP->getSendURI(),NULL,NULL,&doc,NULL,NULL,NULL,&query); // old semantic of splitURL was to include query in document string, // continue doing that if (!query.empty()) { doc += '?'; doc += query; } return TStructFieldsKey::returnString( doc.c_str(), aBuffer,aBufSize,aValSize ); } // readConnectDoc // - time when session was last used static TSyError readLastUsed( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); // return it return TStructFieldsKey::returnLineartime(mykeyP->fAgentP->getSessionLastUsed(), aBuffer, aBufSize, aValSize); } // readLastUsed // - server only: check session timeout static TSyError readTimedOut( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); // check if session has timed out bool timedout = mykeyP->fAgentP->getSessionLastUsed()+mykeyP->fAgentP->getSessionConfig()->getSessionTimeout() < mykeyP->fAgentP->getSystemNowAs(TCTX_UTC); // return it return TStructFieldsKey::returnInt(timedout, sizeof(bool), aBuffer, aBufSize, aValSize); } // readTimedOut // - show if this is a server (for DB plugins) static TSyError readIsServer( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnInt(mykeyP->fAgentP->getSyncAppBase()->isServer(), sizeof(bool), aBuffer, aBufSize, aValSize); } // readIsServer #ifdef SYSYNC_SERVER // - server only: read respURI enable flag static TSyError readSendRespURI( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnInt(mykeyP->fAgentP->fUseRespURI, sizeof(bool), aBuffer, aBufSize, aValSize); } // readSendRespURI // - write respURI enable flag static TSyError writeSendRespURI( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); mykeyP->fAgentP->fUseRespURI = *((uInt8P)aBuffer); return LOCERR_OK; } // writeSendRespURI #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT // - write (volatile, write-only) password for running this session // (for cases where we don't want to rely on binfile storage for sensitive password data) TSyError writeSessionPassword( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); mykeyP->fAgentP->setServerPassword((cAppCharP)aBuffer, aValSize); return LOCERR_OK; } // writeSessionPassword #ifdef ENGINE_LIBRARY // - read display alert static TSyError readDisplayAlert( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnString( mykeyP->fAgentP->fAlertMessage.c_str(), aBuffer,aBufSize,aValSize ); } // readDisplayAlert #endif #endif // SYSYNC_CLIENT static TSyError readRestartSync( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); return TStructFieldsKey::returnInt(mykeyP->fAgentP->fRestartSyncOnce, sizeof(bool), aBuffer, aBufSize, aValSize); } // readRestartsync // - write respURI enable flag static TSyError writeRestartSync( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); mykeyP->fAgentP->fRestartSyncOnce = *((uInt8P)aBuffer); return LOCERR_OK; } // writeRestartSync // - write error message into session log TSyError writeErrorMsg( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); string msg; msg.assign((cAppCharP)aBuffer, aValSize); POBJDEBUGPRINTFX(mykeyP->fAgentP,DBG_ERROR,("external Error: %s",msg.c_str())); return LOCERR_OK; } // writeErrorMsg // - write debug message into session log TSyError writeDebugMsg( TStructFieldsKey *aStructFieldsKeyP, const TStructFieldInfo *aFldInfoP, cAppPointer aBuffer, memSize aValSize ) { TAgentParamsKey *mykeyP = static_cast(aStructFieldsKeyP); string msg; msg.assign((cAppCharP)aBuffer, aValSize); POBJDEBUGPRINTFX(mykeyP->fAgentP,DBG_HOT,("external Message: %s",msg.c_str())); return LOCERR_OK; } // writeDebugMsg // accessor table for session key static const TStructFieldInfo ServerParamFieldInfos[] = { // valName, valType, writable, fieldOffs, valSiz { "localSessionID", VALTYPE_TEXT, false, 0, 0, &readLocalSessionID, NULL }, { "initialLocalURI", VALTYPE_TEXT, false, 0, 0, &readInitialLocalURI, NULL }, { "abortStatus", VALTYPE_INT16, true, 0, 0, &readAbortStatus, &writeAbortStatus }, { "contenttype", VALTYPE_TEXT, true, 0, 0, &readContentType, &writeContentType }, { "connectURI", VALTYPE_TEXT, false, 0, 0, &readConnectURI, NULL }, { "connectHost", VALTYPE_TEXT, false, 0, 0, &readConnectHost, NULL }, { "connectDoc", VALTYPE_TEXT, false, 0, 0, &readConnectDoc, NULL }, { "timedout", VALTYPE_INT8, false, 0, 0, &readTimedOut, NULL }, { "lastused", VALTYPE_TIME64, false, 0, 0, &readLastUsed, NULL }, { "isserver", VALTYPE_INT8, false, 0, 0, &readIsServer, NULL }, #ifdef SYSYNC_SERVER { "sendrespuri", VALTYPE_INT8, true, 0, 0, &readSendRespURI, &writeSendRespURI }, #endif #ifdef SYSYNC_CLIENT { "sessionPassword", VALTYPE_TEXT, true, 0, 0, NULL, &writeSessionPassword }, #ifdef ENGINE_LIBRARY { "displayalert", VALTYPE_TEXT, false, 0, 0, &readDisplayAlert, NULL }, #endif #endif { "restartsync", VALTYPE_INT8, true, 0, 0, &readRestartSync, &writeRestartSync }, // write into debug log { "errorMsg", VALTYPE_TEXT, true, 0, 0, NULL, &writeErrorMsg }, { "debugMsg", VALTYPE_TEXT, true, 0, 0, NULL, &writeDebugMsg }, }; // get table describing the fields in the struct const TStructFieldInfo *TAgentParamsKey::getFieldsTable(void) { return ServerParamFieldInfos; } // TAgentParamsKey::getFieldsTable sInt32 TAgentParamsKey::numFields(void) { return sizeof(ServerParamFieldInfos)/sizeof(TStructFieldInfo); } // TAgentParamsKey::numFields // get actual struct base address uInt8P TAgentParamsKey::getStructAddr(void) { // prepared for accessing fields in server session object return (uInt8P)fAgentP; } // TAgentParamsKey::getStructAddr // open subkey by name (not by path!) TSyError TAgentParamsKey::OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { #ifdef DBAPI_TUNNEL_SUPPORT if (strucmp(aName,"tunnel",aNameSize)==0) { // get tunnel datastore pointer TLocalEngineDS *ds = fAgentP->getTunnelDS(); if (!ds) return LOCERR_WRONGUSAGE; // opens current session's tunnel key aSettingsKeyP = ds->newTunnelKey(fEngineInterfaceP); } else #endif return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; } // TAgentParamsKey::OpenSubKeyByName #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/syncagent.h0000755000373300037200000005435512424517753025030 0ustar00nightlyallusers00000000000000/* * File: SyncAgent.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncAgent: Provides functionality to run client or server * sessions. * Unifies former TSyncClient and TSyncServer * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2009-09-30 : luz : created from syncclient.h and syncserver.h * */ #ifndef SYNC_AGENT_H #define SYNC_AGENT_H #include "engine_defs.h" //%%% we still need this at this time #define NON_FULLY_GRANULAR_ENGINE 1 #ifdef NON_FULLY_GRANULAR_ENGINE namespace sysync { // queued progress events typedef std::list TEngineProgressInfoList; } #endif #include "syncsession.h" #include "localengineds.h" #include "remotedatastore.h" #include "engineinterface.h" using namespace sysync; namespace sysync { #ifndef SYSYNC_SERVER // dummy session handle type for client-only case to allow unified constructor class TSyncSessionHandle { }; #endif // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL int testLogin(int argc, const char *argv[]); int convertData(int argc, const char *argv[]); #endif /// @brief server engine state typedef enum { ses_needdata, ///< need SyncML request data, waiting for STEPCMD_GOTDATA ses_processing, ///< ready to perform next STEPCMD_STEP to process SyncML messages ses_generating, ///< ready to perform next STEPCMD_STEP to generate SyncML messages ses_dataready, ///< data is ready to be sent, waiting for STEPCMD_SENTDATA ses_almostdone, ///< session done, but termination delayed until next step ses_done, ///< session done numServerEngineStates } TServerEngineState; /// @brief client engine state typedef enum { ces_idle, ///< client engine is idle and can be initialized with STEPCMD_CLIENTSTART ces_generating, ///< ready to perform next STEPCMD_STEP to generate SyncML messages ces_dataready, ///< data is ready to be sent, waiting for STEPCMD_SENTDATA ces_resending, ///< data already sent, but app indicates with STEPCMD_RESENDDATA that it needed to resend the data ces_needdata, ///< need response data, waiting for STEPCMD_GOTDATA ces_processing, ///< ready to perform next STEPCMD_STEP to process SyncML messages ces_done, ///< session done numClientEngineStates } TClientEngineState; #ifdef PRECONFIGURED_SYNCREQUESTS // config for databases to sync with class TSyncReqConfig: public TConfigElement { typedef TConfigElement inherited; public: TSyncReqConfig(TLocalDSConfig *aLocalDSCfg, TConfigElement *aParentElement); virtual ~TSyncReqConfig(); // General sync db settings // - local client datastore involved TLocalDSConfig *fLocalDSConfig; // - local client datatstore path extension (such as "test" in "contact/test") string fLocalPathExtension; // - remote server DB layer auth string fDBUser; string fDBPassword; // - remote server datastore path string fServerDBPath; // - sync mode TSyncModes fSyncMode; // - slowsync bool fSlowSync; // - DS 1.2 filters string fRecordFilterQuery; bool fFilterInclusive; // public methods // - create appropriate localdatastore from config and init client request params TLocalEngineDS *initNewLocalDataStore(TSyncSession *aSessionP); protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); virtual void localResolve(bool aLastPass); }; // TSyncReqConfig // Sync DB config list typedef std::list TSyncReqList; #endif // forward class TSyncAgent; #ifdef SYSYNC_SERVER class TSyncSessionHandle; #endif #ifdef SYSYNC_CLIENT class TSyncClientBase; #endif // agent (client or server) config class TAgentConfig: public TSessionConfig { typedef TSessionConfig inherited; public: TAgentConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TAgentConfig(); #ifdef SYSYNC_CLIENT // Local client config // - syncml version TSyncMLVersions fAssumedServerVersion; // we use this version for first connect attempt // - PUT devinf at every slow sync?? (smartner server needs this) bool fPutDevInfAtSlowSync; // - default auth params TAuthTypes fAssumedServerAuth; TFmtTypes fAssumedServerAuthEnc; // start with char encoding string fAssumedNonce; // start with no nonce bool fPreferSlowSync; // Ask server for slow sync instead of refresh-from-server: // both have the same effect, but have different pros and cons. // Defaults to true, the traditional behavior of libsynthesis. // Some old servers only support slow sync. Some new ones // work better with refresh, because they throttle clients // which do slow syncs excessively. // auth retry options (mainly for stupid servers like SCTS) bool fNewSessionForAuthRetry; // restart session for auth retries bool fNoRespURIForAuthRetry; // send retry to original URI for auth retries bool fSmartAuthRetry; // try to be smart and try different auth retry (different from fNewSessionForAuthRetry/fNoRespURIForAuthRetry) if first attempts fail #ifndef NO_LOCAL_DBLOGIN // - user/pw to access local DB string fLocalDBUser; string fLocalDBPassword; bool fNoLocalDBLogin; // if set, no local DB login is required, fLocalDBUser is used as userkey #endif // - server URI (used for PRECONFIGURED_SYNCREQUESTS, but also to predefine server URL in config for fixed-server apps) string fServerURI; #ifdef PRECONFIGURED_SYNCREQUESTS // Preconfigured sync request settings // - encoding SmlEncoding_t fEncoding; // - server layer user / pw string fServerUser; string fServerPassword; string fSocksHost; string fProxyHost; string fProxyUser; string fProxyPassword; // - transport layer user / pw string fTransportUser; string fTransportPassword; // - DB sync requests array TSyncReqList fSyncRequests; #endif #ifndef HARDCODED_CONFIG // - for debug only - used to fake a devID in the config file (useful when testing) string fFakeDeviceID; #endif #endif // SYSYNC_CLIENT #ifdef SYSYNC_SERVER // General server settings // - requested auth type (Auth requested in Chal sent to client) TAuthTypes fRequestedAuth; // - minimally required auth type (lowest auth type that is allowed) TAuthTypes fRequiredAuth; // - use automatic nonce generation for MD5 auth (empty nonce if false) bool fAutoNonce; // - constant nonce string to be used if autononce is off. If empty, no nonce is used string fConstantNonce; // - constant external URL, if set, it is used to generate RespURI (instead of Target LocURI sent by client) string fExternalURL; // - max size of GUID sent if client does not specify a MaxGUIDSize in devInf. 0=unlimited uInt16 fMaxGUIDSizeSent; // - respURI bool fUseRespURI; bool fRespURIOnlyWhenDifferent; #endif // SYSYNC_SERVER // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); virtual void localResolve(bool aLastPass); #ifdef SYSYNC_SERVER // create appropriate session (=agent) for this server virtual TSyncAgent *CreateServerSession(TSyncSessionHandle *aSessionHandle, const char *aSessionID)=0; #endif #ifdef SYSYNC_CLIENT // create appropriate session (=agent) for this client virtual TSyncAgent *CreateClientSession(cAppCharP aSessionID) = 0; #endif }; // TAgentConfig // default profile ID #define DEFAULT_PROFILE_ID 0xFFFFFFFF #define TUNNEL_PROFILE_ID 0xFFFFFFFE class TSyncAgent: public TSyncSession { typedef TSyncSession inherited; public: TSyncAgent( TSyncAppBase *aAppBaseP, TSyncSessionHandle *aSessionHandleP, cAppCharP aSessionID // a session ID ); virtual ~TSyncAgent(); virtual void TerminateSession(void); // Terminate session, like destructor, but without actually destructing object itself virtual void ResetSession(void); // Resets session (but unlike TerminateSession, session might be re-used) void InternalResetSession(void); // static implementation for calling through virtual destructor and virtual ResetSession(); #ifdef ENGINEINTERFACE_SUPPORT #ifdef ENGINE_LIBRARY // Support for EngineModule common interface /// @brief Executes next step of the session /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to abort or time out the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError SessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); #ifdef PROGRESS_EVENTS // Handle (or dispatch) Session level progress event virtual bool HandleSessionProgressEvent(TEngineProgressInfo aProgressInfo); #endif // PROGRESS_EVENTS #endif // ENGINE_LIBRARY /// @brief Get new session key to access details of this session virtual appPointer newSessionKey(TEngineInterface *aEngineInterfaceP); #endif // ENGINEINTERFACE_SUPPORT // Server & Client common: // - message start and end virtual bool MessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad=false); virtual void MessageEnded(bool aIncomingFinal); // - handle status received for SyncHdr, returns false if not handled virtual bool handleHeaderStatus(TStatusCommand *aStatusCmdP); // - start command group virtual bool processSyncStart( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater // will be set if command must be queued for later (re-)execution ); // - info about needed auth type virtual TAuthTypes requestedAuthType(void); virtual bool isAuthTypeAllowed(TAuthTypes aAuthType); // - called when incoming SyncHdr fails to execute virtual bool syncHdrFailure(bool aTryAgain); // device info (uses defaults in this base class, override to customize) virtual string getDeviceType(void); virtual string getDeviceID(void); #ifdef SYSYNC_CLIENT #ifdef ENGINE_LIBRARY // set profileID to client session before doing first SessionStep virtual void SetProfileSelector(uInt32 aProfileSelector) { fProfileSelectorInternal = aProfileSelector; /* default is just passing it on */ }; #endif // ENGINE_LIBRARY // session set-up // - initialize the client session, select the profile and link session with SML instance // for the correct encoding localstatus InitializeSession(uInt32 aProfileSelector, bool aAutoSyncSession=false); // - selects a profile (returns false if profile not found) // Note: This call must create and initialize all datastores that // are to be synced with that profile. virtual localstatus SelectProfile(uInt32 aProfileSelector, bool aAutoSyncSession=false); // - Prepares connection-related stuff. Will be called after all // session init is done, but before first request is sent virtual localstatus PrepareConnect(void) { return LOCERR_OK; }; // retry older protocol, returns false if no older protocol to try bool retryOlderProtocol(bool aSameVersionRetry=false, bool aOldMessageInBuffer=false); // prepares client session such that it will do a retry to start a session // (but keeping already received auth/nonce/syncML-Version state) void retryClientSessionStart(bool aOldMessageInBuffer); // - check if session is just starting (no response yet) bool isStarting(void) { return fIncomingMsgID==0; }; // Session and DB management // - perform login to local DB to allow accessing datastores later localstatus LocalLogin(void); // - let session process message in the SML instance buffer localstatus processAnswer(void); // - let session produce (or finish producing) next message into // SML instance buffer // returns aDone if no answer needs to be sent (=end of session) // returns <>0 SyncML error status on error (no SyncML answer could be generated) localstatus NextMessage(bool &aDone); // URI to send outgoing message to virtual cAppCharP getSendURI(void) { return fRespondURI.c_str(); }; // use respondURI // login cAppCharP getServerUser(void) { return fServerUser.c_str(); }; cAppCharP getServerPassword(void) { return fServerPassword.c_str(); }; void setServerPassword(cAppCharP aPassword, sInt32 aPwSize=-1) { if (aPwSize<0) fServerPassword = aPassword; else fServerPassword.assign(aPassword, aPwSize); }; // transport layer login cAppCharP getTransportUser(void) { return fTransportUser.c_str(); }; cAppCharP getTransportPassword(void) { return fTransportPassword.c_str(); }; // proxy/socks hosts cAppCharP getSocksHost(void) { return fSocksHost.c_str(); }; cAppCharP getProxyHost(void) { return fProxyHost.c_str(); }; cAppCharP getProxyUser(void) { return fProxyUser.c_str(); }; cAppCharP getProxyPassword(void) { return fProxyPassword.c_str(); }; // special behaviour virtual bool devidWithUserHash(void) { return false; }; // do not include user name to make a hash-based pseudo-device ID by default // session handling // - get client base TSyncClientBase *getClientBase(void); #endif // SYSYNC_CLIENT #ifdef SYSYNC_SERVER virtual SmlPcdataPtr_t newResponseURIForRemote(void); // response URI // Request processing // - end of request (to make sure even incomplete SyncML messages get cleaned up properly) bool EndRequest(bool &aHasData, string &aRespURI, uInt32 aReqBytes); // returns true if session must be deleted // - buffer answer in the session's buffer if transport allows it Ret_t bufferAnswer(MemPtr_t aAnswer, MemSize_t aAnswerSize); // - get buffered answer from the session's buffer if there is any void getBufferedAnswer(MemPtr_t &aAnswer, MemSize_t &aAnswerSize); // - get byte statistics virtual uInt32 getIncomingBytes(void) { return fIncomingBytes; }; virtual uInt32 getOutgoingBytes(void) { return fOutgoingBytes; }; // session handling // - get session Handle pointer TSyncSessionHandle *getSessionHandle(void) { return fSessionHandleP; } // returns remaining time for request processing [seconds] virtual sInt32 RemainingRequestTime(void); // info about server status virtual bool serverBusy(void); // return busy status (set by connection limit or app expiry) #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT // variables protected: // - socks and proxy hosts if any string fSocksHost; string fProxyHost; string fProxyUser; string fProxyPassword; // - remote SyncML server layer login string fServerUser; // Server layer authentification user name string fServerPassword; // Server layer authentification password // - remote transport layer login string fTransportUser; string fTransportPassword; // - local DB login #ifndef NO_LOCAL_DBLOGIN bool fNoLocalDBLogin; string fLocalDBUser; string fLocalDBPassword; #endif // Authorisation // - get credentials/username to authenticate with remote party, NULL if none virtual SmlCredPtr_t newCredentialsForRemote(void); // get credentials to login to remote server virtual cAppCharP getUsernameForRemote(void) { return fServerUser.c_str(); }; // specified user name // internal processing events // - message start and end virtual bool ClientMessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad=false); virtual void ClientMessageEnded(bool aIncomingFinal); // if set, SML processing errors will not be reported // (in case session wants to re-try something) bool fIgnoreMsgErrs; // incrementing client session number 0..255 uInt8 fClientSessionNo; #ifdef HARD_CODED_SERVER_URI uInt32 fServerURICRC; uInt8 fNoCRCPrefixLen; #endif #ifdef ENGINE_LIBRARY // Engine interface // - process step TSyError ClientSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); // - Step that generates SyncML data TSyError ClientGeneratingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); // - Step that processes SyncML data TSyError ClientProcessingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); // - internal profile selector (can be ID or index) determined with // SetProfileSelector(), to be used with SelectProfile() uInt32 fProfileSelectorInternal; // - Client engine state TClientEngineState fClientEngineState; #endif // ENGINE_LIBRARY // - client side consecutive Alert 222, used to detect endless loop uInt32 fOutgoingAlert222Count; // Loop detecting time frame to avoid wrong detection of "keep-alive" message lineartime_t fLastOutgoingAlert222; // - called when essential status was received resets clien side Alert 222 loop detector // because receiving essential status means real session progress virtual void essentialStatusReceived(void) { fOutgoingAlert222Count = 0; }; public: // - can be cleared to suppress automatic use of DS 1.2 SINCE/BEFORE filters // (e.g. for date range in func_SetDaysRange()) bool fServerHasSINCEBEFORE; #endif // SYSYNC_CLIENT // flag controlled by app or datastore via "restartsync" session // variable: if true, the agent will try to restart the sync and // then clear the flag bool fRestartSyncOnce; #ifdef SYSYNC_SERVER public: // respuri bool fUseRespURI; protected: // access to config TAgentConfig *getServerConfig(void); // internal processing events // - message start and end virtual bool ServerMessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad=false); virtual void ServerMessageEnded(bool aIncomingFinal); // - request end, called by EndRequest, virtual for descendants virtual void RequestEnded(bool &aHasData); // - map operation virtual bool processMapCommand( SmlMapPtr_t aMapCommandP, // the map command contents TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater ); // Session level auth // - get next nonce string top be sent to remote party for subsequent MD5 auth virtual void getNextNonce(const char *aDeviceID, string &aNextNonce); // - get nonce string, which is expected to be used by remote party for MD5 auth. virtual void getAuthNonce(const char *aDeviceID, string &aAuthNonce); // restarting a sync session is allowed in non-standard mode // TODO: introduce DevInf extensions and use that instead virtual bool allowAlertAfterMap() { return fCompleteFromClientOnly; } #ifdef ENGINE_LIBRARY // Engine interface // - process step TSyError ServerSessionStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); // - Step that generates SyncML data TSyError ServerGeneratingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); // - Step that processes SyncML data TSyError ServerProcessingStep(uInt16 &aStepCmd, TEngineProgressInfo *aInfoP); // - Server engine state TServerEngineState fServerEngineState; // - request size MemSize_t fRequestSize; #endif // ENGINE_LIBRARY // set if map command received in this session bool fMapSeen; // standard nonce generation (without persistent device info) // %%% note: move this to session when we start supporting client auth checking string fLastNonce; // last nonce, will be returned at getAuthNonce() // busy status bool fServerIsBusy; // buffered answer MemPtr_t fBufferedAnswer; MemSize_t fBufferedAnswerSize; // data transfer statistics uInt32 fIncomingBytes; uInt32 fOutgoingBytes; // server session handle TSyncSessionHandle *fSessionHandleP; // the session "handle" (wrapper, containing server specific locking etc.) #endif // SYSYNC_SERVER #ifdef ENGINE_LIBRARY // Common for client & server #ifdef NON_FULLY_GRANULAR_ENGINE // progress event queue until engine is fully granular TEngineProgressInfoList fProgressInfoList; // pending step command and status during progress retrieval steps uInt16 fPendingStepCmd; localstatus fPendingStatus; public: string fAlertMessage; protected: #endif // NON_FULLY_GRANULAR_ENGINE // current session status localstatus fEngineSessionStatus; // suspend and abort requests bool fSuspendRequested; bool fAbortRequested; #endif // ENGINE_LIBRARY // instead of sending at the end of the last message, // the agent is going to ask the server for another sync session; // set in NextMessage() for restarting in ClientMessageEnded() bool fRestartingSync; // true if the SyncML client shall continue the session // by sending another package with , instead of closing // the session bool restartSync(); // true if all active stores are in "from client only" mode and // the engine is not in the fCompleteFromClientOnly mode // => map phase can be skipped bool checkAllFromClientOnly(); }; // TSyncAgent #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= #if defined(SYSYNC_SERVER) && !defined(ENGINE_LIBRARY) #warning "using ENGINEINTERFACE_SUPPORT in old-style appbase-rooted environment. Should be converted to real engine usage later" // Define dummy server engine class - no implementation of actual server engine routines, // defaults from TEngineInterface (returning error codes) will be used. class TDummyServerEngineInterface : public TEngineInterface { typedef TEngineInterface inherited; public: // constructor TDummyServerEngineInterface() {}; // appbase factory virtual TSyncAppBase *newSyncAppBase(void); }; // TDummyServerEngineInterface #endif // SYSYNC_SERVER and not ENGINE_LIBRARY // session runtime parameters class TAgentParamsKey : public TSessionKey { typedef TSessionKey inherited; public: TAgentParamsKey(TEngineInterface *aEngineInterfaceP, TSyncAgent *aAgentP); virtual ~TAgentParamsKey() {}; // open subkey by name (not by path!) virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ); protected: // get table describing the fields in the struct virtual const TStructFieldInfo *getFieldsTable(void); virtual sInt32 numFields(void); // get actual struct base address virtual uInt8P getStructAddr(void); public: // the associated server session TSyncAgent *fAgentP; }; // TAgentParamsKey #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync #endif // SYNC_AGENT_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncappbase.cpp0000755000373300037200000034624712424517753025704 0ustar00nightlyallusers00000000000000/* * TSyncAppBase * Base class for SySync applications, is supposed to exist * as singular object only, manages "global" things such * as config reading and session dispatching * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-03-06 : luz : Created */ #include "prefix_file.h" #include "sysync.h" #include "syncappbase.h" #include "scriptcontext.h" #include "iso8601.h" #include "syncagent.h" #include "multifielditem.h" // in case we have no scripts... #ifdef SYSER_REGISTRATION #include "syserial.h" #endif #ifdef DIRECT_APPBASE_GLOBALACCESS #include "sysync_glob_vars.h" #endif #include "global_progress.h" // globally accessible progress event posting #ifndef ENGINE_LIBRARY // can be called globally to post progress events extern "C" int GlobalNotifyProgressEvent ( TProgressEventType aEventType, sInt32 aExtra1, sInt32 aExtra2, sInt32 aExtra3 ) { #ifdef PROGRESS_EVENTS TSyncAppBase *baseP = getExistingSyncAppBase(); if (baseP) { return baseP->NotifyAppProgressEvent(aEventType,NULL,aExtra1,aExtra2,aExtra3); } #endif return true; // not aborted } // GlobalNotifyProgressEvent #endif // not ENGINE_LIBRARY namespace sysync { #ifndef HARDCODED_CONFIG // SyncML encoding names for end user config const char * const SyncMLEncodingNames[numSyncMLEncodings] = { "undefined", "wbxml", "xml" }; #endif // SyncML encoding names for MIME type const char * const SyncMLEncodingMIMENames[numSyncMLEncodings] = { "undefined", SYNCML_ENCODING_WBXML, SYNCML_ENCODING_XML }; #if !defined(HARDCODED_CONFIG) || defined(ENGINEINTERFACE_SUPPORT) // platform string names for accessing them as config variables const char * const PlatformStringNames[numPlatformStrings] = { "platformvers", // version string of the current platform "globcfg_path", // global system-wide config path (such as C:\Windows or /etc) "loccfg_path", // local config path (such as exedir or user's dir) "defout_path", // default path to writable directory to write logs and other output by default "temp_path", // path where we can write temp files "exedir_path", // path to directory where executable resides "userdir_path", // path to the user's home directory for user-visible documents and files "appdata_path", // path to the user's preference directory for this application "prefs_path", // path to directory where all application prefs reside (not just mine) "device_uri", // URI of the device (as from getDeviceInfo) "device_name", // Name of the device (as from getDeviceInfo) "user_name", // Name of the currently logged in user }; #endif #ifdef ENGINEINTERFACE_SUPPORT #ifdef DIRECT_APPBASE_GLOBALACCESS // Only for old-style targets that still use a global anchor #ifdef ENGINE_LIBRARY #error "Engine Library may NOT access appBase via global anchor any more!" #endif // With enginemodulebase support, the global anchor is the enginebase module, // not syncappbase itself. #define GET_SYNCAPPBASE (((TEngineInterface *)sysync_glob_anchor())->getSyncAppBase()) // get access to existing Sync app base object, NULL if none (i.e. if no TEngineInterface) TSyncAppBase *getExistingSyncAppBase(void) { TEngineInterface *eng = (TEngineInterface *)sysync_glob_anchor(); return eng ? eng->getSyncAppBase() : NULL; } // getExistingSyncAppBase // global function, returns pointer to (singular) app base // object. With EngineInterface, this is ALWAYS a member of // TEngineInterface, so we create the global engineinterface if we don't have it // already. TSyncAppBase *getSyncAppBase(void) { TSyncAppBase *appBase = getExistingSyncAppBase(); if (appBase) return appBase; // no appBase yet, we must create and anchor the TEngineInterface #ifdef SYSYNC_CLIENT ENGINE_IF_CLASS *engine = sysync::newClientEngine(); #else ENGINE_IF_CLASS *engine = sysync::newServerEngine(); #endif // we must init the engine to trigger creation of the appbase! if (engine) engine->Init(); return GET_SYNCAPPBASE; } // getSyncAppBase TEngineInterface *getEngineInterface(void) { return (TEngineInterface *)sysync_glob_anchor(); } // getEngineInterface // free Sync Session Dispatcher void freeSyncAppBase(void) { TEngineInterface *eng = getEngineInterface(); if (eng) { // kills interface, and also kills syncappbase in the process delete eng; } } #endif // DIRECT_APPBASE_GLOBALACCESS #else // ENGINEINTERFACE_SUPPORT // Old style without enginemodulebase: the global anchor is syncappbase #define GET_SYNCAPPBASE ((TSyncAppBase *)sysync_glob_anchor()) // global function, returns pointer to (singular) app base // object. If not yet existing, a new app base is created TSyncAppBase *getSyncAppBase(void) { if (!sysync_glob_anchor()) { // no dispatcher exists, create new one // (using function which will create derived app // specific dispatcher) sysync_glob_setanchor(newSyncAppBase()); } // dispatcher now exists, use it return GET_SYNCAPPBASE; } // getSyncAppBase // get access to existing Sync app base object, NULL if none TSyncAppBase *getExistingSyncAppBase(void) { return GET_SYNCAPPBASE; } // getExistingSyncAppBase // free Sync Session Dispatcher void freeSyncAppBase(void) { if (sysync_glob_anchor()) { // object exists, kill it now delete GET_SYNCAPPBASE; sysync_glob_setanchor(NULL); } } #endif // not ENGINEINTERFACE_SUPPORT #ifdef SYDEBUG // static routines for accessing appbase logs from UI_Call_In/DB_Callback extern "C" void AppBaseLogDebugPuts(void *aCallbackRef, const char *aText) { if (aCallbackRef) { POBJDEBUGPUTSX(static_cast(aCallbackRef),DBG_DBAPI+DBG_PLUGIN,aText); } } // AppBaseLogDebugPuts extern "C" void AppBaseLogDebugExotic(void *aCallbackRef, const char *aText) { if (aCallbackRef) { POBJDEBUGPUTSX(static_cast(aCallbackRef),DBG_DBAPI+DBG_PLUGIN+DBG_EXOTIC,aText); } } // AppBaseLogDebugExotic extern "C" void AppBaseLogDebugBlock(void *aCallbackRef, const char *aTag, const char *aDesc, const char *aAttrText ) { if (aCallbackRef) { bool collapsed=false; if (aTag && aTag[0]=='-') { aTag++; collapsed=true; } static_cast(aCallbackRef)->getDbgLogger()->DebugOpenBlock(TDBG_LOCATION_NONE aTag,aDesc,collapsed,"%s",aAttrText); } } // AppBaseLogDebugBlock extern "C" void AppBaseLogDebugEndBlock(void *aCallbackRef, const char *aTag) { if (aCallbackRef) { if (aTag && aTag[0]=='-') aTag++; static_cast(aCallbackRef)->getDbgLogger()->DebugCloseBlock(TDBG_LOCATION_NONE aTag); } } // AppBaseLogDebugEndBlock extern "C" void AppBaseLogDebugEndThread(void *aCallbackRef) { if (aCallbackRef) { static_cast(aCallbackRef)->getDbgLogger()->DebugThreadOutputDone(true); // remove thread record for global threads } } // AppBaseLogDebugEndThread #endif // root config constructor TRootConfig::TRootConfig(TSyncAppBase *aSyncAppBaseP) : TRootConfigElement(aSyncAppBaseP), fCommConfigP(NULL), fAgentConfigP(NULL), fDatatypesConfigP(NULL) #ifdef SCRIPT_SUPPORT , fScriptConfigP(NULL) #endif #ifdef SYDEBUG , fDebugConfig("debug",this) // init static debug config member #endif { // config date is unknown so far fConfigDate=0; #ifndef HARDCODED_CONFIG // string for identifying config file in logs fConfigIDString=""; #endif } // TRootConfig::TRootConfig TRootConfig::~TRootConfig() { // clear linked if (fAgentConfigP) delete fAgentConfigP; if (fDatatypesConfigP) delete fDatatypesConfigP; if (fCommConfigP) delete fCommConfigP; #ifdef SCRIPT_SUPPORT if (fScriptConfigP) delete fScriptConfigP; #endif } // TRootConfig::~TRootConfig void TRootConfig::clear(void) { // root config variables // - init PUT suppression fNeverPutDevinf=false; // - init message size fLocalMaxMsgSize=DEFAULT_MAXMSGSIZE; fLocalMaxObjSize=DEFAULT_MAXOBJSIZE; // - system time zone fSystemTimeContext=TCTX_SYSTEM; // default to automatic detection #ifdef ENGINEINTERFACE_SUPPORT // - default identification fMan.clear(); fMod.clear(); #endif // - init device limit #ifdef CUSTOMIZABLE_DEVICES_LIMIT fConcurrentDeviceLimit=CONCURRENT_DEVICES_LIMIT; #endif // remove, (re-)create and clear linked config branches (debug last to allow dbg output while clearing) // - global scripting config #ifdef SCRIPT_SUPPORT if (fScriptConfigP) delete fScriptConfigP; fScriptConfigP= new TScriptConfig(this); if (fScriptConfigP) fScriptConfigP->clear(); #endif // - communication config if (fCommConfigP) delete fCommConfigP; installCommConfig(); if (fCommConfigP) fCommConfigP->clear(); // - datatypes registry config if (fDatatypesConfigP) delete fDatatypesConfigP; installDatatypesConfig(); if (fDatatypesConfigP) fDatatypesConfigP->clear(); // - agent config if (fAgentConfigP) delete fAgentConfigP; installAgentConfig(); if (fAgentConfigP) fAgentConfigP->clear(); // clear embedded debug config (as the last action) #ifdef SYDEBUG fDebugConfig.clear(); #endif // clear inherited inherited::clear(); } // TRootConfig::clear // save app state (such as settings in datastore configs etc.) void TRootConfig::saveAppState(void) { if (fAgentConfigP) fAgentConfigP->saveAppState(); if (fDatatypesConfigP) fDatatypesConfigP->saveAppState(); if (fCommConfigP) fCommConfigP->saveAppState(); } // TRootConfig::saveAppState // MUST be called after creating config to load (or pre-load) variable parts of config // such as binfile profiles. If aDoLoose==false, situations, where existing config // is detected but cannot be re-used will return an error. With aDoLoose==true, config // files etc. are created even if it means a loss of data. localstatus TRootConfig::loadVarConfig(bool aDoLoose) { // only agent may load variable config if (fAgentConfigP) return fAgentConfigP->loadVarConfig(aDoLoose); else return LOCERR_NOCFG; // no config yet } // TRootConfig::loadVarConfig #ifndef HARDCODED_CONFIG // root config element parsing bool TRootConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // debug if (strucmp(aElementName,"debug")==0) { #ifdef SYDEBUG // let static TDebugConfig member handle it expectChildParsing(fDebugConfig); #else ReportError(false,"No debugging features available in this version"); expectAll(); // no debug code, simply ignore settings #endif } // config ID/date else if (strucmp(aElementName,"configdate")==0) expectTimestamp(fConfigDate); else if (strucmp(aElementName,"configidstring")==0) expectMacroString(fConfigIDString); else #ifdef ENGINEINTERFACE_SUPPORT // - product identification (in devInf) if (strucmp(aElementName,"manufacturer")==0) expectMacroString(fMan); else if (strucmp(aElementName,"model")==0) expectMacroString(fMod); else if (strucmp(aElementName,"HardwareVersion")==0) expectMacroString(fHwV); else if (strucmp(aElementName,"FirmwareVersion")==0) expectMacroString(fFwV); else if (strucmp(aElementName,"DeviceType")==0) expectMacroString(fDevTyp); else #endif // config variables if (strucmp(aElementName,"configvar")==0) { const char *nam = getAttr(aAttributes,"name"); if (!nam) return fail("Missing 'name' attribute in 'configvar'"); string val; if (!getAttrExpanded(aAttributes,"value",val,false)) return fail("Missing 'value' attribute in 'configvar'"); getSyncAppBase()->setConfigVar(nam,val.c_str()); expectEmpty(); } // options else if (strucmp(aElementName,"neverputdevinf")==0) expectBool(fNeverPutDevinf); else if (strucmp(aElementName,"maxmsgsize")==0) expectUInt32(fLocalMaxMsgSize); else if (strucmp(aElementName,"maxobjsize")==0) expectUInt32(fLocalMaxObjSize); else if (strucmp(aElementName,"maxconcurrentsessions")==0) { #ifdef CUSTOMIZABLE_DEVICES_LIMIT expectInt32(fConcurrentDeviceLimit); #else expectAll(); // no configurable limit, simply ignore contents #endif } // time zones else if (strucmp(aElementName,"definetimezone")==0) expectVTimezone(getSyncAppBase()->getAppZones()); // definition of custom time zone else if (strucmp(aElementName,"systemtimezone")==0) expectTimezone(fSystemTimeContext); // license else if (strucmp(aElementName,"licensename")==0) { #ifdef SYSER_REGISTRATION expectString(fLicenseName); #else expectAll(); // simply ignore contents for versions w/o registration #endif } else if (strucmp(aElementName,"licensecode")==0) { #ifdef SYSER_REGISTRATION expectString(fLicenseCode); #else expectAll(); // simply ignore contents for versions w/o registration #endif } #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"scripting")==0) { // let linked TScriptConfig handle it expectChildParsing(*fScriptConfigP); } #endif else // Agent: Server or client if ( (IS_CLIENT && strucmp(aElementName,"client")==0) || (IS_SERVER && strucmp(aElementName,"server")==0) ) { // Agent config if (!fAgentConfigP) return false; return parseAgentConfig(aAttributes, aLine); } // Transport else if (strucmp(aElementName,"transport")==0) { // transport config if (!fCommConfigP) return false; if (!parseCommConfig(aAttributes, aLine)) { // not a transport we can understand, simply ignore expectAll(); } } else if (strucmp(aElementName,"datatypes")==0) { // datatypes (type registry) config if (!fDatatypesConfigP) return false; return parseDatatypesConfig(aAttributes, aLine); } else { // invalid element return false; } // ok return true; } // TRootConfig::localStartElement #endif // resolve (finish after all data is parsed) void TRootConfig::localResolve(bool aLastPass) { // make sure static debug element is resolved so // possible debug information created by resolving other // elements go to the correct locations/files // Note: in XML configs, the debug element is resolved immediately // after parsing (has fResolveImmediately set) and will // not be re-resolved here unless the element was not parsed at all. #if defined(SYDEBUG) && !defined(SYSYNC_TOOL) // - for SysyTool, do not resolve here as we don't want to see all of the // DBG blurb on the screen created by resolving the config fDebugConfig.Resolve(aLastPass); #endif // set zone for system if one was defined explicitly if (!TCTX_IS_SYSTEM(fSystemTimeContext) && !TCTX_IS_UNKNOWN(fSystemTimeContext)) { getSyncAppBase()->getAppZones()->predefinedSysTZ = fSystemTimeContext; getSyncAppBase()->getAppZones()->ResetCache(); // make sure next query for SYSTEM tz will get new set zone } // MaxMessagesize must have a reasonable size if (fLocalMaxMsgSize<512) { SYSYNC_THROW(TConfigParseException(" must be at least 512 bytes")); } // make sure we have the registration info vars updated #ifdef APP_CAN_EXPIRE getSyncAppBase()->updateAppExpiry(); #elif defined(SYSER_REGISTRATION) getSyncAppBase()->isRegistered(); #endif // make sure linked elements are resolved #ifdef SCRIPT_SUPPORT if (fScriptConfigP) fScriptConfigP->Resolve(aLastPass); #endif if (fAgentConfigP) fAgentConfigP->Resolve(aLastPass); if (fDatatypesConfigP) fDatatypesConfigP->Resolve(aLastPass); if (fCommConfigP) fCommConfigP->Resolve(aLastPass); // finally, get rid of macros (all scripts are now read) #ifdef SCRIPT_SUPPORT if (fScriptConfigP && aLastPass) fScriptConfigP->clearmacros(); #endif #if defined(SYDEBUG) && defined(SYSYNC_TOOL) // - for SysyTool, resolve now, where resolving dbg output has gone /dev/null already fDebugConfig.Resolve(aLastPass); #endif // try to resolve variable config here, but without forcing new one if (aLastPass) { loadVarConfig(false); } } // TRootConfig::localResolve // Base datatype config // init defaults void TDataTypeConfig::clear(void) { // clear properties fTypeName.erase(); // no type fTypeVersion.erase(); // no version #ifdef ZIPPED_BINDATA_SUPPORT fZippedBindata=false; fZipCompressionLevel=-1; // valid range is 0-9, invalid value will select Z_DEFAULT_COMPRESSION #endif fBinaryParts=false; // no binary parts fUseUTF16=false; // no UTF-16/Unicode translation fMSBFirst=false; // default to Intel byte order for UTF16 // clear inherited inherited::clear(); } // TMIMEDirTypeConfig::clear #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TDataTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"typestring")==0) expectString(fTypeName); else if (strucmp(aElementName,"versionstring")==0) expectString(fTypeVersion); else if (strucmp(aElementName,"binaryparts")==0) expectBool(fBinaryParts); #ifdef ZIPPED_BINDATA_SUPPORT else if (strucmp(aElementName,"zippedbindata")==0) expectBool(fZippedBindata); else if (strucmp(aElementName,"zipcompressionlevel")==0) expectInt16(fZipCompressionLevel); #endif else if (strucmp(aElementName,"unicodedata")==0) expectBool(fUseUTF16); else if (strucmp(aElementName,"bigendian")==0) expectBool(fMSBFirst); // - none known here else return false; // base class is TConfigElement // ok return true; } // TDataTypeConfig::localStartElement // resolve void TDataTypeConfig::localResolve(bool aLastPass) { // check if (aLastPass) { // Note: type strings might be set explicitly or implicitly by derived classes // Note2: all types must have a version (SCTS will fail without). For example // Starfish's text/plain notes have Version "1.0" if (fTypeName.empty() || fTypeVersion.empty() ) SYSYNC_THROW(TConfigParseException("datatype must have non-empty 'typestring' and 'versionstring'")); } } // TDataTypeConfig::localResolve #endif // Datatype registry TDatatypesConfig::TDatatypesConfig(const char* aName, TConfigElement *aParentElement) : TConfigElement(aName,aParentElement) { clear(); } // TDatatypesConfig::TDatatypesConfig TDatatypesConfig::~TDatatypesConfig() { clear(); } // TDatatypesConfig::~TDatatypesConfig // init defaults void TDatatypesConfig::clear(void) { // remove datatypes TDataTypesList::iterator pos; for(pos=fDataTypesList.begin();pos!=fDataTypesList.end();pos++) delete *pos; fDataTypesList.clear(); // clear inherited inherited::clear(); } // TDatatypesConfig::clear TDataTypeConfig *TDatatypesConfig::getDataType(const char *aName) { TDataTypesList::iterator pos; for(pos=fDataTypesList.begin();pos!=fDataTypesList.end();pos++) { if (strucmp((*pos)->getName(),aName)==0) { // found return *pos; } } return NULL; // not found } // TDatatypesConfig::getDataType #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TDatatypesConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"datatype")==0) { // definition of a new data type // - get name const char *nam = getAttr(aAttributes,"name"); if (!nam) return fail("Missing 'name' attribute in 'datatype'"); // - get basetype const char *basetype = getAttr(aAttributes,"basetype"); if (!basetype) return fail("Missing 'basetype' attribute in 'datatype'"); // - call global function to get correct TDataTypeConfig derived object TDataTypeConfig *datatypeP = getSyncAppBase()->getRootConfig()->newDataTypeConfig(nam,basetype,this); if (!datatypeP) return fail("Unknown basetype '%s'",basetype); // - save in list fDataTypesList.push_back(datatypeP); // - let element handle parsing expectChildParsing(*datatypeP); } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TDatatypesConfig::localStartElement #endif // resolve void TDatatypesConfig::localResolve(bool aLastPass) { // resolve all types in list TDataTypesList::iterator pos; for(pos=fDataTypesList.begin();pos!=fDataTypesList.end();pos++) (*pos)->Resolve(aLastPass); // resolve inherited inherited::localResolve(aLastPass); } // TDatatypesConfig::localResolve #ifdef SYDEBUG // debug config constructor TDebugConfig::TDebugConfig(const char *aElementName, TConfigElement *aParentElementP) : TConfigElement(aElementName,aParentElementP) { // do not call clear(), because this is virtual! } // TDebugConfig::TDebugConfig void TDebugConfig::clear(void) { // set defaults fGlobalDbgLoggerOptions.clear(); // set logger options to defaults fSessionDbgLoggerOptions.clear(); // set logger options to defaults fDebug = DEFAULT_DEBUG; // if <>0 (and #defined SYDEBUG), debug output is generated, value is used as mask fMsgDump = DEFAULT_MSGDUMP; // if set (and #defined MSGDUMP), messages sent and received are logged; fSingleGlobLog = false; // create a separate global log per app start fSingleSessionLog = false; // create separate session logs fTimedSessionLogNames = true; // add session start time into file name fLogSessionsToGlobal = false; // use separate file(s) for session log fXMLtranslate = DEFAULT_XMLTRANSLATE; // if set, communication will be translated to XML and logged fSimMsgRead = DEFAULT_SIMMSGREAD; // if set (and #defined SIMMSGREAD), simulated input with "i_" prefixed incoming messages are supported fGlobalDebugLogs = DEFAULT_GLOBALDEBUGLOGS; fSessionDebugLogs = DEFAULT_SESSIONDEBUGLOGS; if (getPlatformString(pfs_defout_path,fDebugInfoPath)) makeOSDirPath(fDebugInfoPath); else fDebugInfoPath.erase(); // none // make sure that defaults are applied a first time NOW, BEFORE reading first config localResolve(true); #ifndef SYSYNC_TOOL // and make sure final resolve takes place early when element finishes parsing // (but not for SYSYNC_TOOL, where we want no debug output at all during config read & resolve!) fResolveImmediately = true; #endif // clear inherited inherited::clear(); } // TDebugConfig::clear // resolve (finish after all data is parsed) void TDebugConfig::localResolve(bool aLastPass) { if (aLastPass) { #ifdef SYDEBUG // we have debug #ifndef HARDCODED_CONFIG // XML config - user options settings are parsed into fSessionDbgLoggerOptions // - by default, global logging has same options as configured for session... fGlobalDbgLoggerOptions = fSessionDbgLoggerOptions; if (fLogSessionsToGlobal) { // ... and these settings are used as they are, if session and global // logging are identical... } else { // ...but when they are different, we have a few hard-coded things for global logging: #ifdef MULTITHREAD_PIPESERVER // - for pipe server, global logs should be per-thread fGlobalDbgLoggerOptions.fFlushMode=dbgflush_flush; // flush every log line fGlobalDbgLoggerOptions.fSubThreadMode=dbgsubthread_separate; // separate per thread fGlobalDbgLoggerOptions.fTimestampForAll=true; // timestamp for every message #else if (IS_SERVER) { // - global log for ISAPI/XPT *Servers* is always in openclose mode (possibly multiple processes accessing it) fGlobalDbgLoggerOptions.fFlushMode=dbgflush_openclose; // open and close for every log line } fGlobalDbgLoggerOptions.fSubThreadMode=dbgsubthread_linemix; // mix in one file #ifdef MULTI_THREAD_SUPPORT fGlobalDbgLoggerOptions.fThreadIDForAll=true; // thread ID for each message #endif #endif } #endif // initialize global debug logging options getSyncAppBase()->fAppLogger.setMask(fDebug); // set initial debug mask from config getSyncAppBase()->fAppLogger.setEnabled(fGlobalDebugLogs); // init from config getSyncAppBase()->fAppLogger.setOptions(&fGlobalDbgLoggerOptions); // install outputter, but only if not yet installed in an earlier invocation. We only want ONE log per engine instantiation! if (!getSyncAppBase()->fAppLogger.outputEstablished()) { getSyncAppBase()->fAppLogger.installOutput(getSyncAppBase()->newDbgOutputter(true)); // install the output object (and pass ownership!) getSyncAppBase()->fAppLogger.setDebugPath(fDebugInfoPath.c_str()); // global log all in one file getSyncAppBase()->fAppLogger.appendToDebugPath(fGlobalDbgLoggerOptions.fBasename.empty() ? TARGETID : fGlobalDbgLoggerOptions.fBasename.c_str()); if (fSingleGlobLog) { // One single log - in this case, we MUST append to current log fGlobalDbgLoggerOptions.fAppend=true; } else { // create a new global log for each app start getSyncAppBase()->fAppLogger.appendToDebugPath("_"); string t; TimestampToISO8601Str(t, getSyncAppBase()->getSystemNowAs(TCTX_UTC), TCTX_UTC, false, false); getSyncAppBase()->fAppLogger.appendToDebugPath(t.c_str()); getSyncAppBase()->fAppLogger.appendToDebugPath("_global"); } } // define this as the main thread getSyncAppBase()->fAppLogger.DebugDefineMainThread(); #endif } }; // TDebugConfig::localResolve #ifndef HARDCODED_CONFIG // debug option (combination) names const char * const debugOptionNames[numDebugOptions] = { // current categories "hot", "error", "data", "admin", "syncml", "remoteinfo", "parse", "generate", "rtk_sml", "rtk_xpt", "session", "lock", "objinst", "transp", "scripts", "profiling", "rest", // flags mostly (not always) used in combination with some of the basic categories "userdata", "dbapi", "plugin", "filter", "match", "conflict", "details", "exotic", "expressions", // useful sets "all", "minimal", "normal", "extended", "maximal", "db", "syncml_rtk", // old ones "items", "cmd", "devinf", "dataconf" }; const uInt32 debugOptionMasks[numDebugOptions] = { // current categories DBG_HOT, DBG_ERROR, DBG_DATA, DBG_ADMIN, DBG_PROTO, DBG_REMOTEINFO, DBG_PARSE, DBG_GEN, DBG_RTK_SML, DBG_RTK_XPT, DBG_SESSION, DBG_LOCK, DBG_OBJINST, DBG_TRANSP, DBG_SCRIPTS, DBG_PROFILE, DBG_REST, // flags mostly (not always) used in combination with some of the basic categories DBG_USERDATA, DBG_DBAPI, DBG_PLUGIN, DBG_FILTER, DBG_MATCH, DBG_CONFLICT, DBG_DETAILS, DBG_EXOTIC, DBG_SCRIPTEXPR, // useful sets DBG_ALL, DBG_MINIMAL, DBG_NORMAL, DBG_EXTENDED, DBG_MAXIMAL, DBG_ALLDB, DBG_RTK_SML+DBG_RTK_XPT, // old names that are mapped to new masks DBG_DATA, // formerly: DBG_ITEMS DBG_PROTO, // formerly: DBG_CMD DBG_REMOTEINFO, // formerly: DBG_DEVINF DBG_PARSE+DBG_GEN // formerly: DBG_DATACONV }; uInt32 TDebugConfig::str2DebugMask(const char **aAttributes) { expectEmpty(); // enable may not have content // process arguments const char* dbgopt = getAttr(aAttributes,"option"); if (!dbgopt) { ReportError(false,"debug enable/disable, missing 'option' attribute"); } sInt16 k; if (StrToEnum(debugOptionNames,numDebugOptions,k,dbgopt)) { return debugOptionMasks[k]; } ReportError(false,"unknown debug option '%s'",dbgopt); return 0; } // TDebugConfig::str2DebugMask // debug config element parsing bool TDebugConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"mask")==0) expectUInt32(fDebug); else if (strucmp(aElementName,"enable")==0) fDebug = fDebug | str2DebugMask(aAttributes); else if (strucmp(aElementName,"disable")==0) fDebug = fDebug & ~str2DebugMask(aAttributes); else if (strucmp(aElementName,"logpath")==0) expectPath(fDebugInfoPath); else if (strucmp(aElementName,"msgdump")==0) expectBool(fMsgDump); else if (strucmp(aElementName,"xmltranslate")==0) expectBool(fXMLtranslate); else if (strucmp(aElementName,"simmsgread")==0) expectBool(fSimMsgRead); else if (strucmp(aElementName,"sessionlogs")==0) expectBool(fSessionDebugLogs); else if (strucmp(aElementName,"globallogs")==0) expectBool(fGlobalDebugLogs); // options for TDebugLogger else if (strucmp(aElementName,"logformat")==0) expectEnum(sizeof(fSessionDbgLoggerOptions.fOutputFormat),&fSessionDbgLoggerOptions.fOutputFormat,DbgOutFormatNames,numDbgOutFormats); else if (strucmp(aElementName,"folding")==0) expectEnum(sizeof(fSessionDbgLoggerOptions.fFoldingMode),&fSessionDbgLoggerOptions.fFoldingMode,DbgFoldingModeNames,numDbgFoldingModes); // source link settings always available, even if feature is not: // allows adding the setting to configs unconditionally, without // triggering config parser errors else if (strucmp(aElementName,"sourcelink")==0) expectEnum(sizeof(fSessionDbgLoggerOptions.fSourceLinkMode),&fSessionDbgLoggerOptions.fSourceLinkMode,DbgSourceModeNames,numDbgSourceModes); else if (strucmp(aElementName,"sourcebase")==0) expectPath(fSessionDbgLoggerOptions.fSourceRootPath); else if (strucmp(aElementName,"indentstring")==0) expectCString(fSessionDbgLoggerOptions.fIndentString); else if (strucmp(aElementName,"fileprefix")==0) expectRawString(fSessionDbgLoggerOptions.fCustomPrefix); else if (strucmp(aElementName,"filesuffix")==0) expectRawString(fSessionDbgLoggerOptions.fCustomSuffix); else if (strucmp(aElementName,"filename")==0) expectRawString(fSessionDbgLoggerOptions.fBasename); else if (strucmp(aElementName,"logflushmode")==0) expectEnum(sizeof(fSessionDbgLoggerOptions.fFlushMode),&fSessionDbgLoggerOptions.fFlushMode,DbgFlushModeNames,numDbgFlushModes); else if (strucmp(aElementName,"appendtoexisting")==0) expectBool(fSessionDbgLoggerOptions.fAppend); else if (strucmp(aElementName,"timestamp")==0) expectBool(fSessionDbgLoggerOptions.fTimestampStructure); else if (strucmp(aElementName,"timestampall")==0) expectBool(fSessionDbgLoggerOptions.fTimestampForAll); else if (strucmp(aElementName,"showthreadid")==0) expectBool(fSessionDbgLoggerOptions.fThreadIDForAll); else if (strucmp(aElementName,"subthreadmode")==0) expectEnum(sizeof(fSessionDbgLoggerOptions.fSubThreadMode),&fSessionDbgLoggerOptions.fSubThreadMode,DbgSubthreadModeNames,numDbgSubthreadModes); else if (strucmp(aElementName,"subthreadbuffersize")==0) expectUInt32(fSessionDbgLoggerOptions.fSubThreadBufferMax); else if (strucmp(aElementName,"singlegloballog")==0) expectBool(fSingleGlobLog); else if (strucmp(aElementName,"singlesessionlog")==0) expectBool(fSingleSessionLog); else if (strucmp(aElementName,"timedsessionlognames")==0) expectBool(fTimedSessionLogNames); else if (strucmp(aElementName,"logsessionstoglobal")==0) expectBool(fLogSessionsToGlobal); else return false; // invalid element return true; } // TDebugConfig::localStartElement #endif #endif #ifndef ENGINE_LIBRARY // in engine library, all output must be in context of an engineInterface/appBase // Debug output routines // // If a fDebugLogOutputFunc callback is defined, // it will be used for output, otherwise global gDebugLogPath // file will be written uInt32 getDbgMask(void) { #ifdef SYDEBUG TSyncAppBase *appBase = getExistingSyncAppBase(); if (!appBase) return 0; // no appbase -> no debug return appBase->getDbgMask(); #else return 0; #endif } // getDebugMask TDebugLogger *getDbgLogger(void) { #ifdef SYDEBUG TSyncAppBase *appBase = getExistingSyncAppBase(); if (!appBase) return NULL; // no appbase -> no debuglogger return appBase->getDbgLogger(); #else return NULL; #endif } // getDbgLogger // non-class DebugPuts void DebugPuts(uInt32 mask, const char *text) { #ifdef SYDEBUG // use global debug channel of appBase for non-object-context output TSyncAppBase *appBase = getExistingSyncAppBase(); if (!appBase || appBase->getDbgMask()==0) return; // no appbase or debug off -> no output TDebugLogger *dbgLogger = appBase->getDbgLogger(); if (!dbgLogger) return; dbgLogger->DebugPuts(mask,text,0,false); #endif } // DebugPuts // non-class print to debug channel void DebugVPrintf(uInt32 mask, const char *format, va_list args) { #ifdef SYDEBUG // use global debug channel of appBase for non-object-context output TSyncAppBase *appBase = getExistingSyncAppBase(); if (!appBase || appBase->getDbgMask()==0) return; // no appbase or debug off -> no output TDebugLogger *dbgLogger = appBase->getDbgLogger(); if (!dbgLogger) return; dbgLogger->DebugVPrintf(mask,format,args); #endif } // DebugVPrintf // non-class print to debug channel void DebugPrintf(const char *text, ...) { #ifdef SYDEBUG va_list args; if (PDEBUGMASK) { va_start(args, text); DebugVPrintf(DBG_TRANSP, text,args); va_end(args); } // if (PDEBUGMASK) #endif } // DebugPrintf void smlLibPrint(const char *text, ...) { #ifdef SYDEBUG va_list args; va_start(args, text); DebugVPrintf(DBG_RTK_SML,text,args); va_end(args); #endif } // smlLibPrint void smlLibVprintf(const char *format, va_list va) { #ifdef SYDEBUG DebugVPrintf(DBG_RTK_SML,format,va); #endif } // smlLibVprintf // entry point for SyncML-Toolkit with // #define TRACE_TO_STDOUT void localOutput(const char *aFormat, va_list aArgs) { #ifdef SYDEBUG NCDEBUGVPRINTFX(DBG_RTK_SML,aFormat,aArgs); #endif } #endif // not ENGINE_LIBRARY // Console printout. Only enabled when defined(CONSOLEINFO) // non-class print to console void ConsolePrintf(const char *text, ...) { #ifdef CONSOLEINFO const sInt16 maxmsglen=1024; char msg[maxmsglen]; va_list args; msg[0]='\0'; va_start(args, text); // assemble the message string vsnprintf(msg, maxmsglen, text, args); va_end(args); // write the string ConsolePuts(msg); #endif } // sysyncConsolePrintf // non-class Console output void ConsolePuts(const char *text) { #ifdef CONSOLEINFO // show on app's console equivalent AppConsolePuts(text); #endif // console enabled } // sysyncConsolePuts // TSyncAppBase // ============ /* SyncML toolkit callback function declarations */ extern "C" { /* message callbacks */ static Ret_t smlStartMessageCallback(InstanceID_t id, VoidPtr_t userData, SmlSyncHdrPtr_t pContent); static Ret_t smlEndMessageCallback(InstanceID_t id, VoidPtr_t userData, Boolean_t final); /* grouping commands */ static Ret_t smlStartSyncCallback(InstanceID_t id, VoidPtr_t userData, SmlSyncPtr_t pContent); static Ret_t smlEndSyncCallback(InstanceID_t id, VoidPtr_t userData); #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ static Ret_t smlStartAtomicCallback(InstanceID_t id, VoidPtr_t userData, SmlAtomicPtr_t pContent); static Ret_t smlEndAtomicCallback(InstanceID_t id, VoidPtr_t userData); #endif #ifdef SEQUENCE_RECEIVE static Ret_t smlStartSequenceCallback(InstanceID_t id, VoidPtr_t userData, SmlSequencePtr_t pContent); static Ret_t smlEndSequenceCallback(InstanceID_t id, VoidPtr_t userData); #endif /* Sync Commands */ static Ret_t smlAddCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlAddPtr_t pContent); static Ret_t smlAlertCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlAlertPtr_t pContent); static Ret_t smlDeleteCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlDeletePtr_t pContent); static Ret_t smlGetCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlGetPtr_t pContent); static Ret_t smlPutCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlPutPtr_t pContent); #ifdef MAP_RECEIVE static Ret_t smlMapCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlMapPtr_t pContent); #endif #ifdef RESULT_RECEIVE static Ret_t smlResultsCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlResultsPtr_t pContent); #endif static Ret_t smlStatusCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlStatusPtr_t pContent); static Ret_t smlReplaceCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlReplacePtr_t pContent); /* othe commands */ #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ static Ret_t smlCopyCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlCopyPtr_t param); #endif static Ret_t smlMoveCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlMovePtr_t param); #ifdef EXEC_RECEIVE static Ret_t smlExecCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlExecPtr_t pContent); #endif #ifdef SEARCH_RECEIVE static Ret_t smlSearchCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlSearchPtr_t pContent); #endif /* Other Callbacks */ static Ret_t smlHandleErrorCallback(InstanceID_t id, VoidPtr_t userData); static Ret_t smlTransmitChunkCallback(InstanceID_t id, VoidPtr_t userData); /* print callback */ void smlPrintCallback(String_t outputString); } // extern "C" declaration // constructor TSyncAppBase::TSyncAppBase() : fIsServer(false), fDeleting(false), fConfigP(NULL), fRequestCount(0), #if defined(PROGRESS_EVENTS) && !defined(ENGINE_LIBRARY) fProgressEventFunc(NULL), #endif #ifdef ENGINEINTERFACE_SUPPORT fEngineInterfaceP(NULL), #else fMasterPointer(NULL), #endif fApiInterModuleContext(0) // reset all callbacks #ifdef SYDEBUG // app logger ,fAppLogger(&fAppZones) #endif { // at the moment of creation, this is now the SyncAppBase // (set it here already to allow getSyncAppBase() from derived constructors) #ifdef ENGINEINTERFACE_SUPPORT #ifdef DIRECT_APPBASE_GLOBALACCESS getEngineInterface()->setSyncAppBase(this); // set the link so getSyncAppBase() via EngineInterface works immediately #endif #else #ifdef ENGINE_LIBRARY #error "DIRECT_APPBASE_GLOBALACCESS is not allowed with ENGINE_LIBRARY" #endif sysync_glob_setanchor(this); #endif #ifdef MD5_TEST_FUNCS md5::dotest(); #endif // init profiling TP_INIT(fTPInfo); TP_START(fTPInfo,TP_general); #ifdef EXPIRES_AFTER_DATE // - get current time sInt16 y,m,d; lineartime2date(getSystemNowAs(TCTX_UTC),&y,&m,&d); // - calculate scrambled version thereof fScrambledNow = ((sInt32)y-1720l)*12l*42l+ ((sInt32)m-1)*42l+ ((sInt32)d+7l); /* #define SCRAMBLED_EXPIRY_VALUE \ (EXPIRY_DAY+7)+ \ (EXPIRY_MONTH-1)*42+ \ (EXPIRY_YEAR-1720)*12*42 */ #endif #ifdef APP_CAN_EXPIRE fAppExpiryStatus = LOCERR_OK; // do not compare here, would be too easy #endif #if defined(SYDEBUG) && defined(HARDCODED_CONFIG) fConfigFilePath = ""; #endif #ifdef SYSER_REGISTRATION // make sure that license is standard (no phone home, no expiry) in case there is NO license at all fRegLicenseType = 0; fRelDuration = 0; fRegDuration = 0; #if defined(EXPIRES_AFTER_DAYS) && defined(ENGINE_LIBRARY) fFirstUseDate = 0; fFirstUseVers = 0; #endif #endif // TODO: put this somewhere where the return code can be checked and reported to the user of TSyncAppBase fAppZones.initialize(); } // TSyncAppBase::TSyncAppBase // destructor TSyncAppBase::~TSyncAppBase() { fDeleting=true; // flag deletion to block calling critical (virtual) methods #if !defined(ENGINEINTERFACE_SUPPORT) || defined(DIRECT_APPBASE_GLOBALACCESS) sysync_glob_setanchor(NULL); #endif // stop and show profiling info TP_STOP(fTPInfo); #ifdef TIME_PROFILING if (PDEBUGMASK & DBG_PROFILE) { sInt16 i; PDEBUGPRINTFX(DBG_PROFILE,("Non-Session CPU usage statistics: (system/user)")); // sections for (i=0; iReportError(true,"Recursive config variable $(%s) in <%s>",vn.c_str(),aElementName); n=n2+1; // do not expand continue; } } // found value - substitute n-=2; // substitute beginning with leadin n2+=1; // include closing paranthesis aString.replace(n,n2-n,vv); if (aCfgVarExp<2) { // do not allow recursive macro expansion n+=vv.size(); // continue searching past substituted chars } } else { // not found - leave macro as-is if (aCfgElement) aCfgElement->ReportError(false,"Undefined config variable $(%s) in <%s>",vn.c_str(),aElementName); n=n2+1; // continue search after closing paranthesis } } else { if (aCfgElement) aCfgElement->ReportError(false,"Unterminated $(xxx)-style config variable in <%s>",aElementName); } } return true; } // TSyncAppBase::expandConfigVars #endif // not HARDCODED_CONFIG localstatus TSyncAppBase::finishConfig() { #ifdef SYDEBUG fAppZones.getDbgLogger = getDbgLogger(); #endif fAppZones.loggingStarted(); return LOCERR_OK; } #ifdef HARDCODED_CONFIG localstatus TSyncAppBase::initHardcodedConfig(void) { localstatus err; // initialize for receiving new config fConfigP->clear(); // now call initializer in derived root config err=fConfigP->createHardcodedConfig(); if (err!=LOCERR_OK) return err; // make sure it gets all resolved fConfigP->ResolveAll(); // is ok now return finishConfig(); } // TSyncAppBase::initHardcodedConfig #else // report config errors void TSyncAppBase::ConferrPrintf(const char *text, ...) { const sInt16 maxmsglen=1024; char msg[maxmsglen]; va_list args; msg[0]='\0'; va_start(args, text); // assemble the message string vsnprintf(msg, maxmsglen, text, args); va_end(args); // output config errors ConferrPuts(msg); } // TSyncAppBase::ConferrPrintf // report config errors to appropriate channel void TSyncAppBase::ConferrPuts(const char *msg) { #ifdef ENGINE_LIBRARY // engine variant string filename; // - get config var to see where we should put config errors if (!getConfigVar("conferrpath", filename)) return; // no output defined for config errors // a config error path is defined if (strucmp(filename.c_str(),"console")==0) { // put message directly to what is supposed to be the console #ifdef ANDROID __android_log_write( ANDROID_LOG_DEBUG, "ConferrPuts", msg ); #else AppConsolePuts(msg); #endif return; // done } #else // ENGINE_LIBRARY // old variant - output to predefined path #ifdef CONSOLEINFO ConsolePuts(msg); return; #elif defined(__PALM_OS__) return; // PalmOS has no file output #endif // prepare file name string filename; if (!getPlatformString(pfs_defout_path,filename)) return; makeOSDirPath(filename); filename+=CONFERRPREFIX; filename+=TARGETID; filename+=CONFERRSUFFIX; #endif // not ENGINE_LIBRARY #ifndef __PALM_OS__ // now write to file FILE * logfile=fopen(filename.c_str(),"a"); if (logfile) { string ts; StringObjTimestamp(ts,getSystemNowAs(TCTX_SYSTEM)); ts.append(": "); fputs(ts.c_str(),logfile); fputs(msg,logfile); fputs("\n",logfile); fclose(logfile); } #endif // __PALM_OS__ } // TSyncAppBase::ConferrPuts /* config reading */ // XML parser's "userdata" typedef struct { XML_Parser parser; TRootConfigElement *rootconfig; } TXMLUserData; // prototypes extern "C" { static void startElement(void *userData, const char *name, const char **atts); static void charData(void *userData, const XML_Char *s, int len); static void endElement(void *userData, const char *name); } static localstatus checkErrors(TRootConfigElement *aRootConfigP,XML_Parser aParser) { const char *errmsg = aRootConfigP->getErrorMsg(); if (errmsg) { aRootConfigP->getSyncAppBase()->ConferrPrintf( "%s at line %ld col %ld", errmsg, (sInt32)XML_GetCurrentLineNumber(aParser), (sInt32)XML_GetCurrentColumnNumber(aParser) ); aRootConfigP->resetError(); return aRootConfigP->getFatalError(); // return when fatal } else return LOCERR_OK; // no (fatal) error } // checkErrors // callback for expat static void startElement(void *userData, const char *name, const char **atts) { TRootConfigElement *cfgP = static_cast(userData)->rootconfig; XML_Parser parser = static_cast(userData)->parser; SYSYNC_TRY { cfgP->startElement(name,atts,XML_GetCurrentLineNumber(parser)); } SYSYNC_CATCH (exception &e) cfgP->ReportError(true,"Exception in StartElement: %s",e.what()); SYSYNC_ENDCATCH // check for errors checkErrors(cfgP,parser); } // startElement // callback for expat static void charData(void *userData, const XML_Char *s, int len) { TRootConfigElement *cfgP = static_cast(userData)->rootconfig; XML_Parser parser = static_cast(userData)->parser; SYSYNC_TRY { cfgP->charData(s,len); } SYSYNC_CATCH (exception &e) cfgP->ReportError(true,"Exception in charData: %s",e.what()); SYSYNC_ENDCATCH // check for errors checkErrors(cfgP,parser); } // charData // callback for expat static void endElement(void *userData, const char *name) { TRootConfigElement *cfgP = static_cast(userData)->rootconfig; XML_Parser parser = static_cast(userData)->parser; SYSYNC_TRY { cfgP->endElement(name); } SYSYNC_CATCH (exception &e) cfgP->ReportError(true,"Exception in endElement: %s",e.what()); SYSYNC_ENDCATCH // check for errors checkErrors(cfgP,parser); } // endElement // config stream reading localstatus TSyncAppBase::readXMLConfigStream(TXMLConfigReadFunc aReaderFunc, void *aContext) { localstatus fatalerr; // clear (reset to default) all config TP_DEFIDX(last); TP_SWITCH(last,fTPInfo,TP_configread); MP_SHOWCURRENT(DBG_HOT,"start reading config"); // initialize for new config fConfigP->clear(); fConfigP->ResetParsing(); // read XML appChar buf[CONFIG_READ_BUFSIZ]; sInt16 done; // - create parser XML_Parser parser = XML_ParserCreate(NULL); SYSYNC_TRY { // init user data struct TXMLUserData userdata; userdata.parser=parser; userdata.rootconfig=fConfigP; // pass pointer to root config here XML_SetUserData(parser, &userdata); XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, charData); do { bufferIndex len=0; // callback reader func if (!(aReaderFunc)(buf,CONFIG_READ_BUFSIZ,&len,aContext)) { fConfigP->setFatalError(LOCERR_CFGREAD); // this is also fatal ConferrPrintf( "Error reading from config" ); break; } // %%% changed stop criterium to smooth EngineInterface API //done = len < CONFIG_READ_BUFSIZ; done = len == 0; if (!XML_Parse(parser, buf, len, done)) { fConfigP->setFatalError(LOCERR_CFGPARSE); // this is also fatal ConferrPrintf( "%s at line %ld col %ld", XML_ErrorString(XML_GetErrorCode(parser)), (sInt32)XML_GetCurrentLineNumber(parser), (sInt32)XML_GetCurrentColumnNumber(parser) ); break; } else if (fConfigP->getFatalError()) break; } while (!done); XML_ParserFree(parser); if (!fConfigP->getFatalError()) { // now resolve fConfigP->ResolveAll(); // display resolve error, if any const char *msg = fConfigP->getErrorMsg(); if (msg) { // this is fatal only if error was thrown in Resolve. // Some warnings might be set with ReportError and // will not cause abort. ConferrPrintf(msg); } } // check if ok or not if ((fatalerr=fConfigP->getFatalError())!=LOCERR_OK) { // config failed, reset // %%% do not clear the config here //fConfigP->clear(); ConferrPrintf( "Fatal error %hd, no valid configuration could be read from XML file", (sInt16)fatalerr ); TP_START(fTPInfo,last); return fatalerr; } } SYSYNC_CATCH (...) XML_ParserFree(parser); fConfigP->clear(); fConfigP->setFatalError(LOCERR_CFGPARSE); // this is also fatal ConferrPrintf( "Exception while parsing XML, no valid configuration" ); TP_START(fTPInfo,last); return LOCERR_CFGPARSE; SYSYNC_ENDCATCH TP_START(fTPInfo,last); #if defined(APP_CAN_EXPIRE) && defined(RELEASE_YEAR) && defined(SYSER_REGISTRATION) if (fAppExpiryStatus==LOCERR_TOONEW) { ConferrPrintf( "License is invalid for software released on or after %04d-%02d-01", (fRelDuration / 12) + 2000, (fRelDuration) % 12 + 1 ); } #endif #ifdef APP_CAN_EXPIRE if (fAppExpiryStatus!=LOCERR_OK) { if (fAppExpiryStatus==LOCERR_EXPIRED) { ConferrPrintf("Time-limited License expired"); } else { ConferrPrintf("Missing or bad License Information"); } ConferrPrintf("Please contact Synthesis AG to obtain new license information"); fConfigP->setFatalError(fAppExpiryStatus); // this is also fatal return fAppExpiryStatus; } #endif #ifdef SYSER_REGISTRATION // check if config should have locked sections with a certain CRC value sInt16 daysleft; uInt32 shouldcrc; string s; bool ok=false; // - get restriction string from licensed info ok = getAppEnableInfo(daysleft, NULL, &s)==LOCERR_OK; string restrid,restrval; const char *p = s.c_str(); // start of license info string while (ok && (p=getLicenseRestriction(p,restrid,restrval))!=NULL) { if (restrid=="l") { // lock CRC StrToULong(restrval.c_str(),shouldcrc); ok=shouldcrc==fConfigP->getConfigLockCRC(); } } if (!ok) { ConferrPrintf("Locked config sections are not valid"); fConfigP->setFatalError(LOCERR_BADREG); // this is also fatal return LOCERR_BADREG; } #endif // ok if done MP_SHOWCURRENT(DBG_HOT,"finished reading config"); return finishConfig(); } // TSyncAppBase::readXMLConfigStream #ifdef CONSTANTXML_CONFIG // stream reader for reading from compiled-in text constant static int _CALLING_ ConstantReader( sysync::appCharP aBuffer, sysync::bufferIndex aMaxSize, sysync::bufferIndex *aReadCharsP, void *aContext // const char ** ) { // get cursor const char *readptr = *((const char **)aContext); // read from constant if (!readptr) return false; size_t len = strlen(readptr); if (len>aMaxSize) len=aMaxSize; // - copy if (len>0) strncpy(aBuffer,readptr,len); // - update cursor *((const char **)aContext)=readptr+len; *aReadCharsP=len; // return number of chars actually read return true; // successful } // ConstantReader // config file reading from hard-wired Constant localstatus TSyncAppBase::readXMLConfigConstant(const char *aConstantXML) { const char *aCursor = aConstantXML; return readXMLConfigStream(&ConstantReader, &aCursor); #ifdef SYDEBUG // signal where config came from fConfigFilePath=""; #endif } // TSyncAppBase::readXMLConfigConstant #endif // stream reader for cfile static int _CALLING_ CFileReader( appCharP aBuffer, bufferIndex aMaxSize, bufferIndex *aReadCharsP, void *aContext // FILE * ) { FILE *cfgfile = (FILE *)aContext; // read from file size_t len = fread(aBuffer, 1, aMaxSize, cfgfile); if (len<=0) { if (!feof(cfgfile)) return appFalse; // not EOF, other error: failed len=0; // nothing read, end of file } *aReadCharsP=len; // return number of chars actually read return appTrue; // successful } // CFileReader // config file reading from C file localstatus TSyncAppBase::readXMLConfigCFile(FILE *aCfgFile) { return readXMLConfigStream(&CFileReader, (void *)aCfgFile); } // TSyncAppBase::readXMLConfigCFile // read config from file path localstatus TSyncAppBase::readXMLConfigFile(cAppCharP aFilePath) { localstatus fatalerr; // open file FILE* cfgfile=fopen(aFilePath,"r"); if (cfgfile) { // yes, there is a config file. Get its date getRootConfig()->fConfigDate = getFileModificationDate(aFilePath); // now read the config file (and possibly override fConfigDate) if ((fatalerr=readXMLConfigCFile(cfgfile))!=LOCERR_OK) { fclose(cfgfile); PDEBUGPRINTFX(DBG_ERROR,( "==== Fatal Error %hd reading config file '%s'", fatalerr, aFilePath )); return fatalerr; // config file with fatal errors } fclose(cfgfile); #if defined(SYDEBUG) && !defined(SYSYNC_TOOL) string t; StringObjTimestamp(t,getRootConfig()->fConfigDate); // now write settings to log PDEBUGPRINTFX(DBG_HOT,( "==== Config file '%s' read: Last Config Change=%s, Debug=0x%08lX, Lock=%ld", aFilePath, t.c_str(), (long)PDEBUGMASK, (long)fConfigP->getConfigLockCRC() )); PDEBUGPRINTFX(DBG_HOT,( "==== Config file ID = '%s'", getRootConfig()->fConfigIDString.c_str() )); #endif CONSOLEPRINTF(("- Config file read from '%s'",aFilePath)); #ifdef SYDEBUG if (getRootConfig()->fDebugConfig.fSessionDebugLogs || getRootConfig()->fDebugConfig.fGlobalDebugLogs) { CONSOLEPRINTF(("- Debug log path: %s",getRootConfig()->fDebugConfig.fDebugInfoPath.c_str())); } // signal where config came from fConfigFilePath=aFilePath; #endif // config found return LOCERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("==== No Config file found under '%s'",aFilePath)); // reset config to defaults fConfigP->clear(); return LOCERR_NOCFGFILE; } } // TSyncAppBase::readXMLConfigFile #ifndef ENGINE_LIBRARY // standard reading of config on predefined paths localstatus TSyncAppBase::readXMLConfigStandard(const char *aConfigFileName, bool aOnlyGlobal, bool aAbsolute) { localstatus fatalerr; SYSYNC_TRY { // - get path where config file should be string cfgfilename; sInt16 attempt= aOnlyGlobal ? 1 : 0; // if only global, don't look in exe dir (e.g. for ISAPI modules) while (true) { // count attempt attempt++; if (aAbsolute) { if (attempt>1) { // no config file found return LOCERR_NOCFGFILE; } // just use path as it is cfgfilename=aConfigFileName; } else { // try paths if (attempt==1) { // first check if there's a local copy if (!getPlatformString(pfs_loccfg_path,cfgfilename)) continue; // none found, try next } else if (attempt==2) { // if no local config file, look for a global one if (!getPlatformString(pfs_globcfg_path,cfgfilename)) continue; // none found, try next } else { CONSOLEPRINTF(("- No config file found, using default settings")); // reset config to defaults fConfigP->clear(); return LOCERR_NOCFGFILE; // no config } // add file name makeOSDirPath(cfgfilename,false); cfgfilename+=aConfigFileName; } fatalerr=readXMLConfigFile(cfgfilename.c_str()); if (fatalerr==LOCERR_OK) break; // config found, ok } // attempt loop } // try SYSYNC_CATCH (...) ConferrPrintf("Fatal Error (exception) while reading config file"); return LOCERR_CFGREAD; SYSYNC_ENDCATCH return LOCERR_OK; // ok } // TSyncAppBase::readXMLConfigStandard #endif // ENGINE_LIBRARY #endif // HARDCODED_CONFIG /* progress sevent notification */ #if defined(PROGRESS_EVENTS) && !defined(ENGINE_LIBRARY) // event generator bool TSyncAppBase::NotifyAppProgressEvent( TProgressEventType aEventType, TLocalDSConfig *aDatastoreID, sInt32 aExtra1, sInt32 aExtra2, sInt32 aExtra3 ) { TProgressEvent theevent; if (fProgressEventFunc) { // there is a progress event callback // - prepare event theevent.eventtype=aEventType; theevent.datastoreID=aDatastoreID; theevent.extra=aExtra1; theevent.extra2=aExtra2; theevent.extra3=aExtra3; // - invoke callback (returns false if aborted) return fProgressEventFunc( theevent, fProgressEventContext ); } // if no callback, never abort return true; // ok, no abort } // TSyncAppBase::NotifyAppProgressEvent #endif // non-engine progress events /* logfile outputs */ /* SyncML toolkit callback handlers */ Ret_t TSyncAppBase::EndMessage(VoidPtr_t userData, Boolean_t aFinal) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->EndMessage(aFinal); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"EndMessage",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"EndMessage",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::EndMessage Ret_t TSyncAppBase::StartSync(VoidPtr_t userData, SmlSyncPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->StartSync(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"StartSync",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"StartSync",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::StartSync Ret_t TSyncAppBase::EndSync(VoidPtr_t userData) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->EndSync(); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"EndSync",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"EndSync",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::EndSync #ifdef SEQUENCE_RECEIVE Ret_t TSyncAppBase::StartSequence(VoidPtr_t userData, SmlSequencePtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->StartSequence(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"StartSequence",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"StartSequence",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::StartSequence Ret_t TSyncAppBase::EndSequence(VoidPtr_t userData) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->EndSequence(); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"EndSequence",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"EndSequence",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::EndSequence #endif #ifdef ATOMIC_RECEIVE Ret_t TSyncAppBase::StartAtomic(VoidPtr_t userData, SmlAtomicPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->StartAtomic(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"StartAtomic",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"StartAtomic",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::StartAtomic Ret_t TSyncAppBase::EndAtomic(VoidPtr_t userData) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->EndAtomic(); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"EndAtomic",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"EndAtomic",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::EndAtomic #endif Ret_t TSyncAppBase::AddCmd(VoidPtr_t userData, SmlAddPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->AddCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"AddCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"AddCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::AddCmd Ret_t TSyncAppBase::AlertCmd(VoidPtr_t userData, SmlAlertPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->AlertCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"AlertCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"AlertCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::AlertCmd Ret_t TSyncAppBase::DeleteCmd(VoidPtr_t userData, SmlDeletePtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->DeleteCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"DeleteCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"DeleteCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::DeleteCmd Ret_t TSyncAppBase::GetCmd(VoidPtr_t userData, SmlGetPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->GetCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"GetCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"GetCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::GetCmd Ret_t TSyncAppBase::PutCmd(VoidPtr_t userData, SmlPutPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->PutCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"PutCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"PutCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::PutCmd #ifdef MAP_RECEIVE Ret_t TSyncAppBase::MapCmd(VoidPtr_t userData, SmlMapPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->MapCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"MapCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"MapCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::MapCmd #endif #ifdef RESULT_RECEIVE Ret_t TSyncAppBase::ResultsCmd(VoidPtr_t userData, SmlResultsPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->ResultsCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"ResultsCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"ResultsCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::ResultsCmd #endif Ret_t TSyncAppBase::StatusCmd(VoidPtr_t userData, SmlStatusPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->StatusCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"StatusCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"StatusCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::StatusCmd Ret_t TSyncAppBase::ReplaceCmd(VoidPtr_t userData, SmlReplacePtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->ReplaceCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"ReplaceCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"ReplaceCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::ReplaceCmd #ifdef COPY_RECEIVE Ret_t TSyncAppBase::CopyCmd(VoidPtr_t userData, SmlCopyPtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->CopyCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"CopyCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"CopyCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::CopyCmd #endif Ret_t TSyncAppBase::MoveCmd(VoidPtr_t userData, SmlMovePtr_t aContentP) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->MoveCmd(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"MoveCmd",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"MoveCmd",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::MoveCmd /* Other Callbacks */ Ret_t TSyncAppBase::HandleError(VoidPtr_t userData) { if (!userData) return SML_ERR_WRONG_PARAM; // call Session SYSYNC_TRY { return ((TSyncSession *) userData)->HandleError(); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"HandleError",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"HandleError",NULL); SYSYNC_ENDCATCH } // TSyncAppBase::HandleError // %%%% Ret_t TSyncAppBase::DummyHandler(VoidPtr_t userData, const char* msg) { if (!userData) return SML_ERR_WRONG_PARAM; if (userData) { // session is attached SYSYNC_TRY { return ((TSyncSession *) userData)->DummyHandler(msg); } SYSYNC_CATCH (exception &e) return HandleDecodingException((TSyncSession *)userData,"DummyHandler",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException((TSyncSession *)userData,"DummyHandler",NULL); SYSYNC_ENDCATCH } else { DEBUGPRINTFX(DBG_HOT,("DummyHandler (without session attached): msg=%s",msg)); return SML_ERR_OK; } } // TSyncAppBase::DummyHandler /* SyncML toolkit callback address table */ static const SmlCallbacks_t mySmlCallbacks = { /* message callbacks */ smlStartMessageCallback, smlEndMessageCallback, /* grouping commands */ smlStartSyncCallback, smlEndSyncCallback, #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ smlStartAtomicCallback, smlEndAtomicCallback, #endif #ifdef SEQUENCE_RECEIVE smlStartSequenceCallback, smlEndSequenceCallback, #endif /* Sync Commands */ smlAddCmdCallback, smlAlertCmdCallback, smlDeleteCmdCallback, smlGetCmdCallback, smlPutCmdCallback, #ifdef MAP_RECEIVE smlMapCmdCallback, #endif #ifdef RESULT_RECEIVE smlResultsCmdCallback, #endif smlStatusCmdCallback, smlReplaceCmdCallback, /* other commands */ #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ smlCopyCmdCallback, #endif #ifdef EXEC_RECEIVE smlExecCmdCallback, #endif #ifdef SEARCH_RECEIVE smlSearchCmdCallback, #endif smlMoveCmdCallback, /* Other Callbacks */ smlHandleErrorCallback, smlTransmitChunkCallback }; /* sml_callbacks struct */ /* Context record to find back to appbase and store userData */ typedef struct { TSyncAppBase *appBaseP; void *userDataP; } TSmlContextDataRec; /* SyncML toolkit callback implementations */ // macros to simplify access to contex #define GET_APPBASE(x) (((TSmlContextDataRec *)x)->appBaseP) #define GET_USERDATA(x) (((TSmlContextDataRec *)x)->userDataP) /* message callbacks */ static Ret_t smlStartMessageCallback(InstanceID_t id, VoidPtr_t userData, SmlSyncHdrPtr_t pContent) { return GET_APPBASE(userData)->StartMessage(id,GET_USERDATA(userData),pContent); } static Ret_t smlEndMessageCallback(InstanceID_t id, VoidPtr_t userData, Boolean_t final) { return GET_APPBASE(userData)->EndMessage(GET_USERDATA(userData),final); } /* grouping commands */ static Ret_t smlStartSyncCallback(InstanceID_t id, VoidPtr_t userData, SmlSyncPtr_t pContent) { return GET_APPBASE(userData)->StartSync(GET_USERDATA(userData),pContent); } static Ret_t smlEndSyncCallback(InstanceID_t id, VoidPtr_t userData) { return GET_APPBASE(userData)->EndSync(GET_USERDATA(userData)); } #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ static Ret_t smlStartAtomicCallback(InstanceID_t id, VoidPtr_t userData, SmlAtomicPtr_t pContent) { return GET_APPBASE(userData)->StartAtomic(GET_USERDATA(userData),pContent); } static Ret_t smlEndAtomicCallback(InstanceID_t id, VoidPtr_t userData) { return GET_APPBASE(userData)->EndAtomic(GET_USERDATA(userData)); } #endif #ifdef SEQUENCE_RECEIVE static Ret_t smlStartSequenceCallback(InstanceID_t id, VoidPtr_t userData, SmlSequencePtr_t pContent) { return GET_APPBASE(userData)->StartSequence(GET_USERDATA(userData),pContent); } static Ret_t smlEndSequenceCallback(InstanceID_t id, VoidPtr_t userData) { return GET_APPBASE(userData)->EndSequence(GET_USERDATA(userData)); } #endif /* Sync Commands */ static Ret_t smlAddCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlAddPtr_t pContent) { return GET_APPBASE(userData)->AddCmd(GET_USERDATA(userData),pContent); } static Ret_t smlAlertCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlAlertPtr_t pContent) { return GET_APPBASE(userData)->AlertCmd(GET_USERDATA(userData),pContent); } static Ret_t smlDeleteCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlDeletePtr_t pContent) { return GET_APPBASE(userData)->DeleteCmd(GET_USERDATA(userData),pContent); } static Ret_t smlGetCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlGetPtr_t pContent) { return GET_APPBASE(userData)->GetCmd(GET_USERDATA(userData),pContent); } static Ret_t smlPutCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlPutPtr_t pContent) { return GET_APPBASE(userData)->PutCmd(GET_USERDATA(userData),pContent); } #ifdef MAP_RECEIVE static Ret_t smlMapCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlMapPtr_t pContent) { return GET_APPBASE(userData)->MapCmd(GET_USERDATA(userData),pContent); } #endif #ifdef RESULT_RECEIVE static Ret_t smlResultsCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlResultsPtr_t pContent) { return GET_APPBASE(userData)->ResultsCmd(GET_USERDATA(userData),pContent); } #endif static Ret_t smlStatusCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlStatusPtr_t pContent) { return GET_APPBASE(userData)->StatusCmd(GET_USERDATA(userData),pContent); } static Ret_t smlReplaceCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlReplacePtr_t pContent) { return GET_APPBASE(userData)->ReplaceCmd(GET_USERDATA(userData),pContent); } /* other commands */ #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ static Ret_t smlCopyCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlCopyPtr_t pContent) { return GET_APPBASE(userData)->CopyCmd(GET_USERDATA(userData),pContent); } #endif static Ret_t smlMoveCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlMovePtr_t pContent) { return GET_APPBASE(userData)->MoveCmd(GET_USERDATA(userData),pContent); } #ifdef EXEC_RECEIVE static Ret_t smlExecCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlExecPtr_t pContent) { /*%%%tbd return GET_APPBASE(userData)->ExecCmd(GET_USERDATA(userData),pContent); */ return SML_ERR_INVALID_OPTIONS; } #endif #ifdef SEARCH_RECEIVE static Ret_t smlSearchCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlSearchPtr_t pContent) { /*%%%tbd return GET_APPBASE(userData)->SearchCmd(GET_USERDATA(userData),pContent); */ return SML_ERR_INVALID_OPTIONS; } #endif /* Other Callbacks */ static Ret_t smlHandleErrorCallback(InstanceID_t id, VoidPtr_t userData) { return GET_APPBASE(userData)->DummyHandler(GET_USERDATA(userData),"ErrorCallback"); } static Ret_t smlTransmitChunkCallback(InstanceID_t id, VoidPtr_t userData) { /*%%%tdb return GET_APPBASE(userData)->TransmitChunk(GET_USERDATA(userData),pContent); */ return SML_ERR_INVALID_OPTIONS; } /* end callback implementations */ /* RTK interfacing */ Ret_t TSyncAppBase::setSmlInstanceUserData( InstanceID_t aInstanceID, void *aUserDataP ) { void *ctxP = NULL; if (smlGetUserData(aInstanceID,&ctxP)==SML_ERR_OK && ctxP) { static_cast(ctxP)->userDataP=aUserDataP; return SML_ERR_OK; } return SML_ERR_MGR_INVALID_INSTANCE_INFO; // invalid instance (has no TSmlContextDataRec in userData) } // TSyncAppBase::setSmlInstanceUserData Ret_t TSyncAppBase::getSmlInstanceUserData( InstanceID_t aInstanceID, void **aUserDataPP ) { void *ctxP = NULL; if (smlGetUserData(aInstanceID,&ctxP)==SML_ERR_OK && ctxP) { *aUserDataPP = static_cast(ctxP)->userDataP; return SML_ERR_OK; } return SML_ERR_MGR_INVALID_INSTANCE_INFO; // invalid instance (has no TSmlContextDataRec in userData) } // TSyncAppBase::setSmlInstanceUserData // create new SyncML toolkit instance bool TSyncAppBase::newSmlInstance( SmlEncoding_t aEncoding, sInt32 aWorkspaceMem, InstanceID_t &aInstanceID ) { SmlInstanceOptions_t myInstanceOptions; Ret_t err; #ifndef NOWSM #error "Only NOWSM version is supported any more" #endif // Set options // - encoding myInstanceOptions.encoding=aEncoding; // - total size of instance buffer // (must have room for both incoming and outgoing message if instance // is used for both) myInstanceOptions.workspaceSize=aWorkspaceMem; // - maximum outgoing message size myInstanceOptions.maxOutgoingSize=0; // %%% disabled for now, can be set later with setMaxOutgoingSize() // - create user data record TSmlContextDataRec *smlContextRecP = new TSmlContextDataRec; if (!smlContextRecP) return false; smlContextRecP->appBaseP=this; // pointer to find back to this syncappbase w/o the help of global vars smlContextRecP->userDataP=NULL; // userData will be SySyncSession pointer, but now session is not yet determined // - now instantiate (thread-safe!) err=smlInitInstance( &mySmlCallbacks, // callbacks &myInstanceOptions, smlContextRecP, &aInstanceID // where to store the instance ID ); // - return instance or NULL if failed if (err==SML_ERR_OK) { DEBUGPRINTFX(DBG_RTK_SML,("////////////// sml Instance created, id(=instanceInfoPtr)=0x%08lX",(long)aInstanceID)); return true; // success } else { DEBUGPRINTFX(DBG_ERROR,("************ smlInitInstance returned 0x%hX",(sInt16)err)); aInstanceID=NULL; // none return false; // failed } } // TSyncAppBase::newSmlInstance void TSyncAppBase::freeSmlInstance(InstanceID_t aInstance) { // forget instance now // - accept no-instance if (aInstance==NULL) return; // - there is an instance // - free context record void *ctxP; if (smlGetUserData(aInstance,&ctxP)==SML_ERR_OK && ctxP) delete static_cast(ctxP); // - free instance itself Ret_t err=smlTerminateInstance(aInstance); DEBUGPRINTFX(DBG_RTK_SML,("////////////// sml Instance freed, id(=instanceInfoPtr)=0x%08lX, err=0x%hX",(long)aInstance,(sInt16)err)); #ifdef SYDEBUG if (err!=SML_ERR_OK) { DEBUGPRINTFX(DBG_ERROR,("smlTerminateInstance returned 0x%hX",(sInt16)err)); } #endif } // TSyncAppBase::freeSmlInstance // determine encoding from beginning of SyncML message data SmlEncoding_t TSyncAppBase::encodingFromData(cAppPointer aData, memSize aDataSize) { SmlEncoding_t enc = SML_UNDEF; if (aData && aDataSize>=5) { // check for WBXML intro sequences // Only SyncML 2.0 (OMA-TS-DS_Syntax-V2_0-20090212-C.doc, Paragraph 5.4, WBXML Usage) specifies it explicitly: // For the purposes of OMA-DS, WBXML 1.1, WBXML 1.2 and WBXML 1.3 are functionally equivalent, and // all MUST be accepted in implementations that support WBXML. Effectively, this merely requires the // WBXML parser to accept 01, 02 or 03 as the first byte of the document. // About WBXML Versions, the WireShark Wiki http://wiki.wireshark.org/WAP_Binary_XML says: // The initial WBXML 1.0 specification was not adopted. It is significantly different from the subsequent WBXML // versions (1.1, 1.2 and 1.3). Those subsequent versions are almost identical. // Now check for valid WBXML versions: First byte is vvvvmmmm where v=major version-1, m=minor version uInt8 wbxmlvers = *((cUInt8P)aData); if ( wbxmlvers=='\x01' || // WBXML 1.1 wbxmlvers=='\x02' || // WBXML 1.2 wbxmlvers=='\x03' // WBXML 1.3 ) { // WBXML version ok, check FPI // - a WBXML integer defines the FPI (multi-byte, MSByte first, Bit 7 is continuation flag, Bit 6..0 are data. LSByte has Bit7=0) cAppCharP fpi = ((cAppCharP)aData)+1; if ( (*fpi=='\x01') || // FPI==1 means "unknown public identifier". Some Funambol servers use this (memcmp(fpi,"\x00\x00",2)==0) || // Public identifier as string (memcmp(fpi,"\xA4\x01",2)==0) || // Public identifier 0x1201 for SyncML 1.2 (memcmp(fpi,"\x9F\x53",2)==0) || // Public identifier 0x0FD3 for SyncML 1.1 (memcmp(fpi,"\x9F\x51",2)==0) // Public identifier 0x0FD1 for SyncML 1.0 ) enc=SML_WBXML; } // check XML now if not detected WBXML. if (enc==SML_UNDEF) { // could be XML // - skip UTF-8 BOM if there is one cUInt8P p = (cUInt8P)aData; if (p[0]==0xEF && p[1]==0xBB && p[2]==0xBF) p+=3; // skip the BOM // now check for XML if (strnncmp((cAppCharP)p,"(enc); } // TSyncAppBase::encodingFromContentType // save app state (such as settings in datastore configs etc.) void TSyncAppBase::saveAppState(void) { if (fConfigP) fConfigP->saveAppState(); } // TSyncAppBase::saveAppState // manufacturer of overall solution (can be configured, while OEM is fixed to Synthesis) string TSyncAppBase::getManufacturer(void) { #ifdef ENGINEINTERFACE_SUPPORT if (fConfigP && !(fConfigP->fMan.empty())) return fConfigP->fMan; string s; if (getConfigVar("custommanufacturer", s)) { return s; } #endif // if no string configured, return default return CUST_SYNC_MAN; } // TSyncAppBase::getManufacturer // model (application name) of overall solution string TSyncAppBase::getModel(void) { #ifdef ENGINEINTERFACE_SUPPORT if (fConfigP && !(fConfigP->fMod.empty())) return fConfigP->fMod; string s; if (getConfigVar("custommodel", s)) { return s; } #endif // if no string configured, return default return CUST_SYNC_MODEL; } // TSyncAppBase::getModel // hardware version string TSyncAppBase::getHardwareVersion(void) { string s; #ifdef ENGINEINTERFACE_SUPPORT if (fConfigP && !(fConfigP->fHwV.empty())) { return fConfigP->fHwV; } if (getConfigVar("customhardwareversion", s)) { return s; } #endif // if no string configured, return default getPlatformString(pfs_device_name, s); return s; } // TSyncAppBase::getHardwareVersion // firmware version (depends a lot on the context - OS version?) string TSyncAppBase::getFirmwareVersion(void) { string s; #ifdef ENGINEINTERFACE_SUPPORT if (fConfigP && !(fConfigP->fFwV.empty())) { return fConfigP->fFwV; } if (getConfigVar("customfirmwareversion", s)) { return s; } #endif // if no string configured, return default getPlatformString(pfs_platformvers, s); return s; } // TSyncAppBase::getHardwareVersion // hardware type (PDA, PC, ...) string TSyncAppBase::getDevTyp() { #ifdef ENGINEINTERFACE_SUPPORT string s; if (fConfigP && !(fConfigP->fDevTyp.empty())) { return fConfigP->fDevTyp; } if (getConfigVar("customdevicetype", s)) { return s; } #endif // if no string configured, return default if (isServer()) return SYNCML_SERVER_DEVTYP; else return SYNCML_CLIENT_DEVTYP; } // TSyncAppBase::getDevTyp // device ID (can be customized using "customdeviceid" config variable) // Returns true if deviceID is guaranteed unique bool TSyncAppBase::getMyDeviceID(string &devid) { #ifdef ENGINEINTERFACE_SUPPORT if (getConfigVar("customdeviceid", devid)) { return true; // custom device ID is assumed to be guaranteed unique } #endif // use device ID as determined by platform adapters return getLocalDeviceID(devid); } // TSyncAppBase::getMyDeviceID #ifdef APP_CAN_EXPIRE void TSyncAppBase::updateAppExpiry(void) { // this is the basic check. Some other checks // are spread in various files to disguise checking a little #if defined(EXPIRES_AFTER_DAYS) || defined(SYSER_REGISTRATION) // check soft expiry fAppExpiryStatus = appEnableStatus(); // check hard expiry only if demo, that is, if no valid license is installed if (fAppExpiryStatus==LOCERR_OK && fDaysLeft>=0 && !fRegOK) #endif { fAppExpiryStatus = #ifdef EXPIRES_AFTER_DATE // check hard expiry date fScrambledNow>SCRAMBLED_EXPIRY_VALUE ? LOCERR_EXPIRED : LOCERR_OK; #else // no hard expiry, just ok if enabled LOCERR_OK; #endif } } // TSyncAppBase::updateAppExpiry #endif #ifdef SYSER_REGISTRATION // checks if registered (must be implemented in base class) // returns LOCERR_EXPIRED, LOCERR_TOONEW or LOCERR_BADREG if not registered correctly localstatus TSyncAppBase::isRegistered(void) { #if !defined(HARDCODED_CONFIG) || defined(ENGINEINTERFACE_SUPPORT) // we have licensing in the config file or using engine interface, check it return fConfigP ? checkRegInfo(fConfigP->fLicenseName.c_str(),fConfigP->fLicenseCode.c_str(),false) : LOCERR_BADREG; #else // no license checking at this level (maybe overriden method provides check) return LOCERR_EXPIRED; #endif } // TSyncAppBase::isRegistered // get (entire) registration string void TSyncAppBase::getRegString(string &aString) { #if !defined(HARDCODED_CONFIG) || defined(ENGINEINTERFACE_SUPPORT) // we have licensing in the config file or set via engine interface, use it if (fConfigP) aString=fConfigP->fLicenseName; else #endif { aString.erase(); } } // TSyncAppBase::getRegString #endif // safety checks #if !defined(APP_CAN_EXPIRE) && defined(RELEASE_VERSION) && !defined(NEVER_EXPIRES_IS_OK) #error "Warning: Release version that never expires!" #endif #ifdef APP_CAN_EXPIRE // make sure we have a valid variant code for the target #ifndef SYSER_VARIANT_CODE #error "SYSER_VARIANT_CODE must be defined in target_options.h" #endif // check enable status of application localstatus TSyncAppBase::appEnableStatus(void) { // safety check - app w/o initialized config is NOT enabled // Note: agentconfig tested here, but all other config sections are created in clear() at the same time if (!fConfigP || !(fConfigP->fAgentConfigP)) { return LOCERR_WRONGUSAGE; } // check registration (which will disable normal expiry) #ifdef SYSER_REGISTRATION localstatus regsta = isRegistered(); // ok if registered #else #ifndef APP_CAN_EXPIRE localstatus regsta = LOCERR_OK; // not registerable, not exprining - just run forever #ifndef NEVER_EXPIRES_IS_OK #error "WARNING: Completely unlimited operation w/o license or expiry - is this intended??" #endif // not NEVER_EXPIRES_IS_OK #else localstatus regsta = LOCERR_BADREG; // not registerable, assume no license, must be eval which expires #endif // APP_CAN_EXPIRE #endif localstatus sta = regsta; // check expiry (only if registration has not already defined one) #ifdef APP_CAN_EXPIRE #ifdef NO_LICENSE_UNTIL_HARDEXPIRY // we don't need a valid license code until hard expiry date hits // so if we have a failure now, let the hard expiry decide if (regsta!=LOCERR_OK) { #ifdef SYSER_REGISTRATION fDaysLeft=1; // simulate expiring tomorrow #endif sta = LOCERR_OK; // ok if we find no hard expiry later // then let hard expiry decide #ifndef EXPIRES_AFTER_DATE #error "WARNING: NO_LICENSE_UNTIL_HARDEXPIRY without EXPIRES_AFTER_DATE - running forever w/o license - indended that way?" #endif } #endif sInt32 td = lineartime2dateonly(getSystemNowAs(TCTX_UTC)); #if defined(EXPIRES_AFTER_DAYS) || defined(NO_LICENSE_UNTIL_HARDEXPIRY) if (regsta==LOCERR_BADREG || regsta==LOCERR_WRONGPROD) { // not registered (for this product), check if we are in evaluation period #ifdef EXPIRES_AFTER_DATE // check hard expiry first if (fScrambledNow>SCRAMBLED_EXPIRY_VALUE) { #ifdef SYSER_REGISTRATION fDaysLeft=0; // hard-expired #endif sta = LOCERR_EXPIRED; } else #endif { #ifdef EXPIRES_AFTER_DAYS // (bfo found that we need to check for > demo days too, as // otherwise some clever guys could install with the // clock 20 years in the future and then set the clock back) uInt32 vers; lineardate_t firstuse; getFirstUseInfo(SYSER_VARIANT_CODE,firstuse,vers); sInt32 d = firstuse+EXPIRES_AFTER_DAYS - td; fDaysLeft = d>0 && d<=EXPIRES_AFTER_DAYS ? d : 0; sta = d>0 ? LOCERR_OK : LOCERR_EXPIRED; #else // Do NOT change the status to expired! - just pass on the license error status // which might be ok here in case we have a NO_LICENSE_UNTIL_HARDEXPIRY //sta = LOCERR_EXPIRED; #endif } } #endif #else fDaysLeft=-1; // App cannot expire, no limit #endif return sta; } // TSyncAppBase::appEnableStatus // get registration information to display (and check internally) localstatus TSyncAppBase::getAppEnableInfo(sInt16 &aDaysLeft, string *aRegnameP, string *aRegInternalsP) { #ifndef SYSER_REGISTRATION // no registration if (aRegnameP) aRegnameP->erase(); if (aRegInternalsP) aRegInternalsP->erase(); aDaysLeft = -1; // no expiring license (altough hardexpiry might still apply) return appEnableStatus(); #else // we have registration localstatus sta = appEnableStatus(); if (sta!=LOCERR_OK) { if (aRegnameP) aRegnameP->erase(); if (aRegInternalsP) aRegInternalsP->erase(); return sta; // not enabled } // do an extra check here aDaysLeft = fDaysLeft; if (fDaysLeft==0) SYSYNC_THROW(exception()); // exit app, as fDaysLeft must be > 0 or -1 here // get strings if requested if (aRegnameP || aRegInternalsP) { string s; // get entire string getRegString(s); // check for separation into a visible (name) and and invisible (email or license restriction) part size_t n,m; size_t l=s.size(); // - first priority: license restrictions in form ::x=something n=s.find("::"); if (n!=string::npos) { // found a license restriction m=n; // everthing before special separator belongs to name, rest to internals } else { // - second priority: a simple email address at the end of the string n=s.rfind('@'); if (n==string::npos) { n=l; m=l; // no email, entire string is name } else { n=s.rfind(' ',n); if (n==string::npos) { n=l; m=l; // no email, entire string is name } else { m=n+1; // do not return separating space in either name nor internals } } } // now remove spaces at the beginning to avoid // invisible registration info int i = s.find_first_not_of(' '); if (i==string::npos) i=0; // no non-space -> start at beginning /* int i; for (i= 0; iassign(s, i,n); if (aRegInternalsP) { if (massign(s,m,l-m); else aRegInternalsP->erase(); } } return sta; #endif } // TSyncAppBase::getAppEnableInfo #endif // APP_CAN_EXPIRE #ifdef EXPIRES_AFTER_DAYS // make sure we have a valid variant code for the target #ifndef SYSER_VERSCHECK_MASK #error "SYSER_VERSCHECK_MASK must be defined in target_options.h" #endif /// @brief get time and version of first use. Version is included to allow re-evaluating after version changes significantly void TSyncAppBase::getFirstUseInfo(uInt8 aVariant, lineardate_t &aFirstUseDate, uInt32 &aFirstUseVers) { #ifndef ENGINEINTERFACE_SUPPORT // no first use date in base class, is overridden in derived platform-specific appBase classes. aFirstUseDate=0; aFirstUseVers=0; #else // use values stored into engine via settings keys aFirstUseDate=fFirstUseDate; aFirstUseVers=fFirstUseVers; #endif } // TSyncAppBase::getFirstUseInfo /// @brief update first use info to allow for repeated eval when user installs an all-new version /// @return true if update was needed /// @param[in] aVariant variant context to perform update /// @param[in,out] aFirstUseDate date when this variant and version was used first. /// Will be updated /// @param[in,out] aFirstUseVers version that relates to aFirstUseDate. /// Will be updated to current version if version check allows re-starting demo period. bool TSyncAppBase::updateFirstUseInfo(lineardate_t &aFirstUseDate, uInt32 &aFirstUseVers) { // update if current version is significantly newer than what we used last time if ( aFirstUseDate==0 || ((aFirstUseVers & SYSER_VERSCHECK_MASK) < (SYSYNC_VERSION_UINT32 & SYSER_VERSCHECK_MASK)) ) { // current version is different in a relevant part of the version number, so reset first use aFirstUseDate = getSystemNowAs(TCTX_UTC) / linearDateToTimeFactor; aFirstUseVers = SYSYNC_VERSION_UINT32; return true; } // no updates return false; } // TSyncAppBase::updateFirstUseInfo #endif // EXPIRES_AFTER_DAYS #ifdef SYSER_REGISTRATION // helper to get next restriction out of license string const char * TSyncAppBase::getLicenseRestriction(const char *aInfo, string &aID, string &aVal) { const char *p; char c; bool quotedval=false; // if no info or at end of string, return NULL if (!aInfo || *aInfo==0) return NULL; // find next restriction aInfo=strstr(aInfo,"::"); if (!aInfo) return NULL; // no more restrictions found // get ID of restriction aInfo+=2; // skip :: p=strchr(aInfo,'='); if (!p) return NULL; // no more restrictions found // - assign ID aID.assign(aInfo,p-aInfo); aInfo=p+1; // skip = // get value of restriction aVal.erase(); if (*aInfo==0x22) { // starts with doublequote -> treat as quoted value quotedval=true; aInfo++; } while ((c=*aInfo)) { aInfo++; if (quotedval) { // quoted string ends with " and can contain backslash escapes if (c==0x22) break; // done after closing quote if (c=='\\') { if (*aInfo==0) break; // quote without char following, stop here c=*aInfo++; // get next char } } else { // unquoted string ends with next space if (isspace(c)) break; } // save char aVal+=c; } // return where to continue scanning for next item return aInfo; } // TSyncAppBase::getLicenseRestriction // checks registration code for CRC ok and compare with // predefined constants for product code etc. localstatus TSyncAppBase::checkRegInfo(const char *aRegKey, const char *aRegCode, bool aMangled) { uInt32 infocrc; // extract information from registration code localstatus regSta = LOCERR_OK; fRelDuration=0; // do not allow registration text less than 12 chars if (strlen(aRegKey)<12) regSta=LOCERR_BADREG; // too short code is a bad code else if (!getSySerialInfo( aRegCode, // code fRegProductFlags, fRegProductCode, fRegLicenseType, fRegQuantity, fRegDuration, fLicCRC, // CRC as included in the license code infocrc, aMangled )) regSta=LOCERR_BADREG; // no code is a bad code if (regSta==LOCERR_OK) { // code is basically ok, check standard info if (!( // product code ( (fRegProductCode == SYSER_PRODUCT_CODE_MAIN) #ifdef SYSER_PRODUCT_CODE_ALT1 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT1) #endif #ifdef SYSER_PRODUCT_CODE_ALT2 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT2) #endif #ifdef SYSER_PRODUCT_CODE_ALT3 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT3) #endif #ifdef SYSER_PRODUCT_CODE_ALT4 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT4) #endif #ifdef SYSER_PRODUCT_CODE_ALT5 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT5) #endif #ifdef SYSER_PRODUCT_CODE_ALT6 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT6) #endif #ifdef SYSER_PRODUCT_CODE_ALT7 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT7) #endif #ifdef SYSER_PRODUCT_CODE_ALT8 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT8) #endif #ifdef SYSER_PRODUCT_CODE_ALT9 || (fRegProductCode == SYSER_PRODUCT_CODE_ALT9) #endif ) // special SYSER_PRODFLAG_MAXRELDATE product flag && ( ((SYSER_NEEDED_PRODUCT_FLAGS & SYSER_PRODFLAG_MAXRELDATE)==0) || // either maxreldate flag is not required... (fRegProductFlags & SYSER_PRODFLAG_MAXRELDATE) || // ..or it is present.. (fRegDuration!=0) // ..or there is a time limit, which means that the even if the flag is required, product can run with a timed license without the flag ) // test other product flags (all except SYSER_PRODFLAG_MAXRELDATE) && ((fRegProductFlags & (SYSER_NEEDED_PRODUCT_FLAGS & ~SYSER_PRODFLAG_MAXRELDATE)) == (SYSER_NEEDED_PRODUCT_FLAGS & ~SYSER_PRODFLAG_MAXRELDATE)) && ((fRegProductFlags & SYSER_FORBIDDEN_PRODUCT_FLAGS) == 0) )) regSta=LOCERR_WRONGPROD; // anyway, check if CRC is ok if (!(fLicCRC == addNameToCRC(infocrc,aRegKey,aMangled))) { regSta=LOCERR_BADREG; // bad CRC is bad registration (and has precedence over wrong product) // make sure we do not enable exotic functionality fRegProductFlags=0; fRegLicenseType=0; fRegQuantity=1; fRegDuration=0; fRelDuration=0; } } // Now if we have OK, app is registered, but maybe limited // by time or max release date. if (regSta==LOCERR_OK) { // - check max release date limit first if (fRegProductFlags & SYSER_PRODFLAG_MAXRELDATE) { // duration is a release duration // - in case this is a max release date limited license, this // excludes time limited - max release date licenses are always permanent fRelDuration = fRegDuration; fRegDuration = 0; // Now check if this build has a hard-coded release date #ifdef RELEASE_YEAR // license valid only up to release date specified, check that // if (fRegDuration > (RELEASE_YEAR-2000)*12+RELEASE_MONTH-1) // plain if ( fRelDuration && (fRelDuration*3+48 <= 3*((RELEASE_YEAR-2000)*12+RELEASE_MONTH-1)+48) ) { // a bit disguised // license is not valid any more for a build as new as this one fRegOK=false; return LOCERR_TOONEW; } #endif } // - check for expired license now // Note: we don't check demo period (days after first use) here if (fRegDuration!=0) { lineardate_t ending = date2lineardate(fRegDuration/12+2000,fRegDuration%12+1,1); sInt32 d=ending-lineartime2dateonly(getSystemNowAs(TCTX_UTC)); fDaysLeft = d>0 ? d : 0; if (d<=0) { // license has expired fRegOK=false; return LOCERR_EXPIRED; } } else fDaysLeft=-1; // unlimited by registration } // if it is not ok here, registration code is bad fRegOK=regSta==LOCERR_OK; // save for further reference return regSta; // return status } // TSyncAppBase::checkRegInfo // checks if current license is properly activated // - note: must be called at a time when internet connection is available localstatus TSyncAppBase::checkLicenseActivation(lineardate_t &aLastcheck, uInt32 &aLastcrc) { bool ok = true; // - check if already activated if ( fRegLicenseType && ( (aLastcrc != fLicCRC) || // different license than at last activation (aLastcheck==0) || // never checked at all (aLastcheck+180 < lineartime2dateonly(getSystemNowAs(TCTX_UTC))) // not checked in the last half year ) ) { // re-check needed ok = checkLicenseType(fRegLicenseType); // update check date even if we fail (but only if we checked once before) // to prevent failed sync sessions when reg server has a problem if (ok || aLastcheck) { aLastcheck = lineartime2dateonly(getSystemNowAs(TCTX_UTC)); } // update CRC only if we could validate the new CRC if (ok) { aLastcrc = fLicCRC; } } // show it to user if (!ok) { #ifndef ENGINE_LIBRARY APP_PROGRESS_EVENT(this,pev_error,NULL,LOCERR_BADREG,0,0); #endif } // return status return ok ? LOCERR_OK : LOCERR_BADREG; } // TSyncAppBase::checkLicenseActivation #endif #ifdef CONCURRENT_DEVICES_LIMIT // check if session count is exceeded void TSyncAppBase::checkSessionCount(sInt32 aSessionCount, TSyncSession *aSessionP) { // Check if session must be busy (due to licensing restrictions) // - some minor arithmetic to hide actual comparison with limit #ifdef SYSER_REGISTRATION // number of users from license or hardcoded limit, whichever is lower sInt32 scrambledlimit = 3*(CONCURRENT_DEVICES_LIMIT!=0 && CONCURRENT_DEVICES_LIMIT=scrambledlimit && scrambledlimit!=42) #ifdef CUSTOMIZABLE_DEVICES_LIMIT // compare with configurable limit, if not set to zero (=unlimited) || (((aSessionCount<<2) > fConfigP->fConcurrentDeviceLimit*4) && fConfigP->fConcurrentDeviceLimit) #endif ) { // make session busy (not really responding) aSessionP->setSessionBusy(true); PDEBUGPRINTFX(DBG_HOT,("***** Limit of concurrent sessions reached, server response is 'busy'")); // info CONSOLEPRINTF(("- concurrent session limit reached, rejecting session with BUSY status")); } } // TSyncAppBase::checkSessionCount #endif // factory methods of Rootconfig // ============================= // Create datatypes registry - default to Multifield-capable version void TRootConfig::installDatatypesConfig(void) { fDatatypesConfigP = new TMultiFieldDatatypesConfig(this); // default } // TSyncAppBase::newDatatypesConfig #ifndef HARDCODED_CONFIG bool TRootConfig::parseDatatypesConfig(const char **aAttributes, sInt32 aLine) { // currently, only one type of datatype registry exists per app, so we do not // need to check attributes expectChildParsing(*fDatatypesConfigP); return true; } // TRootConfig::parseDatatypesConfig #endif } // namespace sysync #ifdef CONFIGURABLE_TYPE_SUPPORT #ifdef MIMEDIR_SUPPORT #include "vcarditemtype.h" #include "vcalendaritemtype.h" #endif #ifdef TEXTTYPE_SUPPORT #include "textitemtype.h" #endif #ifdef RAWTYPE_SUPPORT #include "rawdataitemtype.h" #endif #ifdef DATAOBJ_SUPPORT #include "dataobjtype.h" #endif namespace sysync { // create new datatype config by name // returns NULL if none found TDataTypeConfig *TRootConfig::newDataTypeConfig(const char *aName, const char *aBaseType, TConfigElement *aParentP) { #ifdef MIMEDIR_SUPPORT if (strucmp(aBaseType,"mimedir")==0) return new TMIMEDirTypeConfig(aName,aParentP); else if (strucmp(aBaseType,"vcard")==0) return new TVCardTypeConfig(aName,aParentP); else if (strucmp(aBaseType,"vcalendar")==0) return new TVCalendarTypeConfig(aName,aParentP); else #endif #ifdef TEXTTYPE_SUPPORT if (strucmp(aBaseType,"text")==0) return new TTextTypeConfig(aName,aParentP); else #endif #ifdef RAWTYPE_SUPPORT if (strucmp(aBaseType,"raw")==0) return new TRawDataTypeConfig(aName,aParentP); else #endif #ifdef DATAOBJ_SUPPORT if (strucmp(aBaseType,"dataobj")==0) return new TDataObjConfig(aName,aParentP); else #endif return NULL; // unknown basetype } // TRootConfig::newDataTypeConfig // create new profile config by name // returns NULL if none found TProfileConfig *TRootConfig::newProfileConfig(const char *aName, const char *aTypeName, TConfigElement *aParentP) { // create profiles by name #ifdef MIMEDIR_SUPPORT if (strucmp(aTypeName,"mimeprofile")==0) return new TMIMEProfileConfig(aName,aParentP); else #endif #ifdef TEXTTYPE_SUPPORT if (strucmp(aTypeName,"textprofile")==0) return new TTextProfileConfig(aName,aParentP); else #endif return NULL; // unknown profile } // TRootConfig::newProfileConfig } // namespace sysync #endif // only one of XML2GO or SDK/Plugin can be on top of customagent #ifdef XML2GO_SUPPORT #include "xml2goapiagent.h" #elif defined(SDK_SUPPORT) #include "pluginapiagent.h" #endif // ODBC can be in-between if selected #ifdef SQL_SUPPORT #include "odbcapiagent.h" #endif namespace sysync { // Create agent config - default to customImpl based agent void TRootConfig::installAgentConfig(void) { #if defined(XML2GO_SUPPORT) fAgentConfigP = new TXml2goAgentConfig(this); // xml2go (possibly on top of ODBC) #elif defined(SDK_SUPPORT) fAgentConfigP = new TPluginAgentConfig(this); // plugin/SDK (possibly on top of ODBC) #elif defined(SQL_SUPPORT) fAgentConfigP = new TOdbcAgentConfig(this); // ODBC only #else fAgentConfigP = NULL; // none #endif } // TSyncAppBase::installAgentConfig #ifndef HARDCODED_CONFIG bool TRootConfig::parseAgentConfig(const char **aAttributes, sInt32 aLine) { const char *typenam = getAttr(aAttributes,"type"); bool parseit=false; #ifdef XML2GO_SUPPORT if (strucmp(typenam,"xml2go")==0) parseit=true; #endif #ifdef SDK_SUPPORT if (strucmp(typenam,"plugin")==0) parseit=true; #endif #ifdef SQL_SUPPORT if (strucmp(typenam,"odbc")==0 || strucmp(typenam,"sql")==0) parseit=true; #endif if (parseit) { expectChildParsing(*fAgentConfigP); } return parseit; } // TRootConfig::parseAgentConfig #endif // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL #include // special RTK instance just for translating WBXML to XML #define GET_XMLOUTINSTANCE(u) ((InstanceID_t)GET_USERDATA(u)) #define ERRCHK(CMDNAME,GENFUNC) { Ret_t r = GENFUNC; if (r!=SML_ERR_OK) CONSOLEPRINTF(("Error converting %s to XML -> XML output truncated!",CMDNAME)); } // SyncML toolkit callback implementations for sysytool debug decoder // userData must be instance_id of XML instance to generate XML message into static Ret_t sysytoolStartMessageCallback(InstanceID_t id, VoidPtr_t userData, SmlSyncHdrPtr_t pContent) { // Note: we must find the SyncML version in advance, as fSyncMLVersion is not yet valid here sInt16 hdrVers; StrToEnum(SyncMLVerDTDNames,numSyncMLVersions,hdrVers,smlPCDataToCharP(pContent->version)); smlStartMessageExt(GET_XMLOUTINSTANCE(userData),pContent,SmlVersionCodes[hdrVers]); return SML_ERR_OK; } static Ret_t sysytoolEndMessageCallback(InstanceID_t id, VoidPtr_t userData, Boolean_t final) { ERRCHK("End Of Message",smlEndMessage(GET_XMLOUTINSTANCE(userData),final)); return SML_ERR_OK; } static Ret_t sysytoolStartSyncCallback(InstanceID_t id, VoidPtr_t userData, SmlSyncPtr_t pContent) { ERRCHK("",smlStartSync(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolEndSyncCallback(InstanceID_t id, VoidPtr_t userData) { ERRCHK("",smlEndSync(GET_XMLOUTINSTANCE(userData))); return SML_ERR_OK; } #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ static Ret_t sysytoolStartAtomicCallback(InstanceID_t id, VoidPtr_t userData, SmlAtomicPtr_t pContent) { ERRCHK("",smlStartAtomic(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolEndAtomicCallback(InstanceID_t id, VoidPtr_t userData) { ERRCHK("",smlEndAtomic(GET_XMLOUTINSTANCE(userData))); return SML_ERR_OK; } #endif #ifdef SEQUENCE_RECEIVE static Ret_t sysytoolStartSequenceCallback(InstanceID_t id, VoidPtr_t userData, SmlSequencePtr_t pContent) { ERRCHK("",smlStartSequence(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolEndSequenceCallback(InstanceID_t id, VoidPtr_t userData) { ERRCHK("",smlEndSequence(GET_XMLOUTINSTANCE(userData))); return SML_ERR_OK; } #endif static Ret_t sysytoolAddCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlAddPtr_t pContent) { ERRCHK("",smlAddCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolAlertCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlAlertPtr_t pContent) { ERRCHK("",smlAlertCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolDeleteCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlDeletePtr_t pContent) { ERRCHK("",smlDeleteCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolGetCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlGetPtr_t pContent) { ERRCHK("",smlGetCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolPutCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlPutPtr_t pContent) { ERRCHK("",smlPutCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #ifdef MAP_RECEIVE static Ret_t sysytoolMapCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlMapPtr_t pContent) { ERRCHK("",smlMapCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #endif #ifdef RESULT_RECEIVE static Ret_t sysytoolResultsCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlResultsPtr_t pContent) { ERRCHK("",smlResultsCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #endif static Ret_t sysytoolStatusCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlStatusPtr_t pContent) { ERRCHK("",smlStatusCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } static Ret_t sysytoolReplaceCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlReplacePtr_t pContent) { ERRCHK("",smlReplaceCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #ifdef COPY_RECEIVE static Ret_t sysytoolCopyCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlCopyPtr_t pContent) { ERRCHK("",smlCopyCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #endif static Ret_t sysytoolMoveCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlMovePtr_t pContent) { ERRCHK("",smlMoveCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #ifdef EXEC_RECEIVE static Ret_t sysytoolExecCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlExecPtr_t pContent) { ERRCHK("",smlExecCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #endif #ifdef SEARCH_RECEIVE static Ret_t sysytoolSearchCmdCallback(InstanceID_t id, VoidPtr_t userData, SmlSearchPtr_t pContent) { ERRCHK("",smlSearchCmd(GET_XMLOUTINSTANCE(userData),pContent)); return SML_ERR_OK; } #endif static Ret_t sysytoolHandleErrorCallback(InstanceID_t id, VoidPtr_t userData) { return SML_ERR_OK; } static Ret_t sysytoolTransmitChunkCallback(InstanceID_t id, VoidPtr_t userData) { return SML_ERR_INVALID_OPTIONS; } static const SmlCallbacks_t sysyncToolCallbacks = { /* message callbacks */ sysytoolStartMessageCallback, sysytoolEndMessageCallback, /* grouping commands */ sysytoolStartSyncCallback, sysytoolEndSyncCallback, #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ sysytoolStartAtomicCallback, sysytoolEndAtomicCallback, #endif #ifdef SEQUENCE_RECEIVE sysytoolStartSequenceCallback, sysytoolEndSequenceCallback, #endif /* Sync Commands */ sysytoolAddCmdCallback, sysytoolAlertCmdCallback, sysytoolDeleteCmdCallback, sysytoolGetCmdCallback, sysytoolPutCmdCallback, #ifdef MAP_RECEIVE sysytoolMapCmdCallback, #endif #ifdef RESULT_RECEIVE sysytoolResultsCmdCallback, #endif sysytoolStatusCmdCallback, sysytoolReplaceCmdCallback, /* other commands */ #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ sysytoolCopyCmdCallback, #endif #ifdef EXEC_RECEIVE sysytoolExecCmdCallback, #endif #ifdef SEARCH_RECEIVE sysytoolSearchCmdCallback, #endif sysytoolMoveCmdCallback, /* Other Callbacks */ sysytoolHandleErrorCallback, sysytoolTransmitChunkCallback }; /* sml_callbacks struct */ // WBXML to XML conversion int wbxmlConv(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" wbxml2xml []")); CONSOLEPRINTF((" Converts to XML using SyncML-Toolkit")); CONSOLEPRINTF((" If no output file is specified, input file name with suffix '.xml' is used")); return EXIT_SUCCESS; } // check for argument if (argc<1 || argc>2) { CONSOLEPRINTF(("1 or 2 arguments required")); return EXIT_FAILURE; } // open input file FILE *inFile = fopen(argv[0],"rb"); if (!inFile) { CONSOLEPRINTF(("Error opening input file '%s', error=%d",argv[0],errno)); return EXIT_FAILURE; } // prepare a instance for decoding the WBXML InstanceID_t wbxmlInInstance; if (!getSyncAppBase()->newSmlInstance( SML_WBXML, 500*1024, // 500k should be waaaaay enough wbxmlInInstance )) { CONSOLEPRINTF(("Error creating WBXML parser")); return EXIT_FAILURE; } // install the sysytool callbacks (default are the normal appbase ones) smlSetCallbacks(wbxmlInInstance, &sysyncToolCallbacks); // prepare instance for generating XML output InstanceID_t xmlOutInstance; if (!getSyncAppBase()->newSmlInstance( SML_XML, 500*1024, // 500k should be waaaaay enough xmlOutInstance )) { CONSOLEPRINTF(("Error creating XML generator")); return EXIT_FAILURE; } // link output instance as userdata into input instance getSyncAppBase()->setSmlInstanceUserData(wbxmlInInstance, xmlOutInstance); // read WBXML original file into workspace MemPtr_t wbxmlBufP; MemSize_t wbxmlBufSiz, wbxmlDataSiz; Ret_t rc; rc = smlLockWriteBuffer(wbxmlInInstance, &wbxmlBufP, &wbxmlBufSiz); if (rc!=SML_ERR_OK) { CONSOLEPRINTF(("Error getting WBXML buffer, err=%d",rc)); return EXIT_FAILURE; } wbxmlDataSiz = fread(wbxmlBufP,1,wbxmlBufSiz,inFile); if (wbxmlDataSiz==0) { CONSOLEPRINTF(("No data in WBXML input file or error, err=%d",errno)); return EXIT_FAILURE; } fclose(inFile); CONSOLEPRINTF(("Read %ld bytes from WBXML input file '%s'",wbxmlDataSiz,argv[0])); smlUnlockWriteBuffer(wbxmlInInstance,wbxmlDataSiz); // decode do { rc = smlProcessData(wbxmlInInstance, SML_NEXT_COMMAND); } while (rc==SML_ERR_CONTINUE); if (rc!=SML_ERR_OK) { CONSOLEPRINTF(("Error while decoding WBXML document, rc=%d",rc)); } else { CONSOLEPRINTF(("Successfully completed decoding WBXML document")); } // write to output file // - determine name string outFileName; outFileName = argv[0]; if (argc>1) outFileName = argv[1]; else outFileName += ".xml"; // save output FILE *outFile = fopen(outFileName.c_str(),"w"); if (!outFile) { CONSOLEPRINTF(("Error opening output file '%s', error=%d",outFileName.c_str(),errno)); return EXIT_FAILURE; } MemPtr_t xmlBufP; MemSize_t xmlDataSiz; rc = smlLockReadBuffer(xmlOutInstance,&xmlBufP,&xmlDataSiz); if (rc!=SML_ERR_OK) { CONSOLEPRINTF(("Error reading decoded XML from converter WBXML document, rc=%d",rc)); return EXIT_FAILURE; } CONSOLEPRINTF(("Writing %ld bytes of XML translation to '%s'",xmlDataSiz,outFileName.c_str())); fwrite(xmlBufP,1,xmlDataSiz,outFile); fclose(outFile); // done return EXIT_SUCCESS; } // wbxmlConv #endif // SYSYNC_TOOL } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/syncappbase.h0000755000373300037200000006275312424517753025346 0ustar00nightlyallusers00000000000000/* * TSyncAppBase * Base class for SySync applications, is supposed to exist * as singular object only, manages "global" things such * as config reading and session dispatching * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch */ #ifndef SYNCAPPBASE_H #define SYNCAPPBASE_H #include "configelement.h" #include "profiling.h" #include "debuglogger.h" #include "syncitemtype.h" #include "engineinterface.h" #include "global_progress.h" // expat if not hardcoded config #ifndef HARDCODED_CONFIG # ifdef HAVE_EXPAT #include # elif defined(HAVE_SYS_XMLTOK) #include # else /* HAVE_BUILTIN_XMLTOK */ #include "xmlparse.h" # endif #endif namespace sysync { #ifdef SYSYNC_TOOL // WBXML to XML conversion int wbxmlConv(int argc, const char *argv[]); #endif // XML config doc name (can be overridden in target_options if needed) #ifndef XMLCONFIG_DOCNAME #define XMLCONFIG_DOCNAME "sysync_config" #endif #ifndef XMLCONFIG_DOCVERSION #define XMLCONFIG_DOCVERSION "1.0" #endif // progress event posting macros // Note: engine libraries only have session level progress events #ifdef PROGRESS_EVENTS #ifndef ENGINE_LIBRARY #define APP_PROGRESS_EVENT(a,e,d,x,y,z) a->NotifyAppProgressEvent(e,d,x,y,z) #endif #define SESSION_PROGRESS_EVENT(s,e,d,x,y,z) s->NotifySessionProgressEvent(e,d,x,y,z) #define DB_PROGRESS_EVENT(d,e,x,y,z) d->getSession()->NotifySessionProgressEvent(e,d->getDSConfig(),x,y,z) #else #ifndef ENGINE_LIBRARY #define APP_PROGRESS_EVENT(a,e,d,x,y,z) true #endif #define SESSION_PROGRESS_EVENT(s,e,d,x,y,z) true #define DB_PROGRESS_EVENT(s,e,x,y,z) true #endif // non-class print to console (#ifdef CONSOLEINFO) extern "C" void ConsolePrintf(const char *text, ...); extern "C" void ConsolePuts(const char *text); // direct print to app's console, whatever that is // NOTE: implemented in derived xxxx_app.cpp void AppConsolePuts(const char *aText); #ifndef HARDCODED_CONFIG // debug option (combination) names const sInt16 numDebugOptions = 37; extern const char * const debugOptionNames[numDebugOptions]; extern const uInt32 debugOptionMasks[numDebugOptions]; // non-class print to report config errors void ConferrPrintf(const char *text, ...); #endif // provides additional context info void writeDebugContextInfo(FILE *logfile); extern "C" { /* moved to sysync_debug.h to make them accessible by just importing it // non-class debug output functions void DebugVPrintf(const char *format, va_list args); void DebugPrintf(const char *text, ...); void DebugPuts(const char *text); uInt16 getDebugMask(void); */ // entry point for XPT part of SyncML-Toolkit with // #define TRACE_TO_STDOUT // functionally equal to DebugPrintf void localOutput(const char *aFormat, va_list aArgs); #ifdef NOWSM // entry points for SML part of SyncML-Toolkit void smlLibPrint(const char *text, ...); void smlLibVprintf(const char *format, va_list va); #endif } // static routines for accessing appbase logs from UI_Call_In/DB_Callback #ifdef SYDEBUG extern "C" void AppBaseLogDebugPuts(void *aCallbackRef, const char *aText); extern "C" void AppBaseLogDebugExotic(void *aCallbackRef, const char *aText); extern "C" void AppBaseLogDebugBlock(void *aCallbackRef, const char *aTag, const char *aDesc, const char *aAttrText ); extern "C" void AppBaseLogDebugEndBlock(void *aCallbackRef, const char *aTag); extern "C" void AppBaseLogDebugEndThread(void *aCallbackRef); #endif #ifndef HARDCODED_CONFIG extern const char * const SyncMLEncodingNames[]; #endif extern const char * const SyncMLEncodingMIMENames[]; // forward declarations class TSyncSession; class TSyncAppBase; class TAgentConfig; class TDatatypesConfig; class TSyncDataStore; class TCommConfig; class TDataTypeConfig; class TSyncItemType; class TRootConfig; #ifdef SCRIPT_SUPPORT class TScriptConfig; #endif // prototype for dispatcher creation function // Note: This function must be implemented in the derived TSyncAppBase // class' .cpp file. This allows different SySync Apps to be // implemented by simply including the appropriate TSyncAppBase // derivate. THIS FUNCTION IS NOT IMPLEMENTED in SyncAppBase.cpp! TSyncAppBase *newSyncAppBase(void); #ifdef ENGINEINTERFACE_SUPPORT // only as an intermediate legacy solution we still grant appBase direct access #ifdef DIRECT_APPBASE_GLOBALACCESS // get access to Sync app base object, creates new one if none exists TSyncAppBase *getSyncAppBase(void); // get access to existing Sync app base object, NULL if none TSyncAppBase *getExistingSyncAppBase(void); // We also need a way to access the engineInterface if we are in old AppBase code TEngineInterface *getEngineInterface(void); // free Sync app base object - which means that engineInterface is deleted void freeSyncAppBase(void); #endif #else // get access to Sync app base object, creates new one if none exists TSyncAppBase *getSyncAppBase(void); // get access to existing Sync app base object, NULL if none TSyncAppBase *getExistingSyncAppBase(void); // free Sync app base object void freeSyncAppBase(void); #endif // communication (transport) config object class TCommConfig : public TConfigElement { private: typedef TConfigElement inherited; public: TCommConfig(const char *aElementName, TConfigElement *aParentElementP) : TConfigElement(aElementName,aParentElementP) {}; // nothing special so far }; // TCommConfig /* %%% this was a useless intermediate class. We now call the unilib config TAgentConfig (union of TClientConfig and TServerConfig) // agent configuration (an agent is a server or a client) class TAgentConfig : public TConfigElement { typedef TConfigElement inherited; public: TAgentConfig(const char *aElementName, TConfigElement *aParentElementP) : TConfigElement(aElementName,aParentElementP) {}; // - MUST be called after creating config to load (or pre-load) variable parts of config // such as binfile profiles. If aDoLoose==false, situations, where existing config // is detected but cannot be re-used will return an error. With aDoLoose==true, config // files etc. are created even if it means a loss of data. virtual localstatus loadVarConfig(bool aDoLoose=false) { return LOCERR_OK; } }; // TAgentConfig */ // single data type configuration abstract class // Note: derived instances are created using the global newDataTypeConfig() function class TDataTypeConfig : public TConfigElement { typedef TConfigElement inherited; public: TDataTypeConfig(const char *aElementName, TConfigElement *aParentElementP) : TConfigElement(aElementName,aParentElementP) {}; // properties // - type name string string fTypeName; // - type version string string fTypeVersion; #ifdef ZIPPED_BINDATA_SUPPORT // if flag is set, payload data will be bool fZippedBindata; sInt16 fZipCompressionLevel; #endif // if flag is set, we can use binary blocks within text (how this is done depends on actual type) bool fBinaryParts; // Unicode payload settings bool fUseUTF16; // 16-bit unicode rather than UTF-8 bool fMSBFirst; // byte order for unicode // create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP) = 0; // get a descriptor for selecting a variant of a datatype (if any), NULL=no variant with this name virtual TTypeVariantDescriptor getVariantDescriptor(const char *aVariantName) { return NULL; }; protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); #endif virtual void clear(); }; // TDataTypeConfig // datatypes list typedef std::list TDataTypesList; // datatypes registry configuration class TDatatypesConfig : public TConfigElement { typedef TConfigElement inherited; public: TDatatypesConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TDatatypesConfig(); // properties // - list of registered data types TDataTypesList fDataTypesList; // public methods TDataTypeConfig *getDataType(const char *aName); protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif // resolve is needed also for hardcoded types! virtual void localResolve(bool aLastPass); public: virtual void clear(); }; // TDatatypesConfig #ifdef SYDEBUG // debug Config element class TDebugConfig : public TConfigElement { typedef TConfigElement inherited; public: // create root config TDebugConfig(const char *aElementName, TConfigElement *aParentElementP); virtual void clear(void); // the debug info path string fDebugInfoPath; // global template for TDebugLogger options TDbgOptions fGlobalDbgLoggerOptions; TDbgOptions fSessionDbgLoggerOptions; // other global debug options // - if <>0 (and #defined SYDEBUG), debug output is generated, value is used as mask uInt32 fDebug; // if set (and #defined MSGDUMP), messages sent and received are logged; bool fMsgDump; // if set, communication will be translated to XML and logged bool fXMLtranslate; // if set (and #defined SIMMSGREAD), simulated input with "i_" prefixed incoming messages are supported bool fSimMsgRead; // if set, session debug logs are enabled by default (but can be disabled by session later) bool fSessionDebugLogs; // if set, global log file is enabled bool fGlobalDebugLogs; // if set, only one single global log file is created (instead of one for every start of the app) bool fSingleGlobLog; // if set, only one single session log file is created (instead of one for every session) bool fSingleSessionLog; // if set, ISO8601 timestamp will be added as part of the session log filename bool fTimedSessionLogNames; // if set, session logs will be embedded into global log. Note: only reliably works in unthreaded environments bool fLogSessionsToGlobal; protected: #ifndef HARDCODED_CONFIG // parsing virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif // resolving (finishing) virtual void localResolve(bool aLastPass); private: uInt32 str2DebugMask(const char **aAttributes); }; // TDebugConfig #endif class TProfileConfig; // forward class TAgentConfig; // forward // root Config element class TRootConfig : public TRootConfigElement, noncopyable { typedef TRootConfigElement inherited; public: // create root config TRootConfig(TSyncAppBase *aSyncAppBaseP); virtual ~TRootConfig(); // - factory methods for main config aspects virtual void installCommConfig(void) = 0; virtual void installDatatypesConfig(void); virtual void installAgentConfig(void); // - parsing of main config aspects #ifndef HARDCODED_CONFIG virtual bool parseCommConfig(const char **aAttributes, sInt32 aLine) = 0; virtual bool parseDatatypesConfig(const char **aAttributes, sInt32 aLine); virtual bool parseAgentConfig(const char **aAttributes, sInt32 aLine); #endif #ifdef CONFIGURABLE_TYPE_SUPPORT // - profile configs (MIME profiles, text profiles, etc.) virtual TProfileConfig *newProfileConfig(const char *aName, const char *aTypeName, TConfigElement *aParentP); virtual TDataTypeConfig *newDataTypeConfig(const char *aName, const char *aBaseType, TConfigElement *aParentP); #endif // - hardcoded types #ifdef HARDCODED_TYPE_SUPPORT virtual void createHardcodedTypes(TDatatypesConfig *aDatatypesConfig) = 0; #ifndef NO_REMOTE_RULES #error "%%%% warning: hardcoded type with remoterule support is not tested yet. Should work with old addProperty() calls propertyGroup is 0 by default which should disable grouping" #endif #endif // - hardcoded other config #ifdef HARDCODED_CONFIG // setup config elements (must be implemented in derived RootConfig class) virtual localstatus createHardcodedConfig(void) = 0; #endif // Clear config virtual void clear(void); // save app state (such as settings in datastore configs etc.) virtual void saveAppState(void); // MUST be called after creating config to load (or pre-load) variable parts of config // such as binfile profiles. If aDoLoose==false, situations, where existing config // is detected but cannot be re-used will return an error. With aDoLoose==true, config // files etc. are created even if it means a loss of data. virtual localstatus loadVarConfig(bool aDoLoose=false); // date when config has last changed lineartime_t fConfigDate; #ifndef HARDCODED_CONFIG // string for identifying config file in logs string fConfigIDString; #endif // flag to suppress sending devinf to clients that do not request it bool fNeverPutDevinf; // transport/environment config TCommConfig *fCommConfigP; // Agent (Server or Client session) config TAgentConfig *fAgentConfigP; // datatypes config TDatatypesConfig *fDatatypesConfigP; #ifdef SCRIPT_SUPPORT // global script definitions TScriptConfig *fScriptConfigP; #endif // embedded debug config #ifdef SYDEBUG TDebugConfig fDebugConfig; #endif #ifdef CUSTOMIZABLE_DEVICES_LIMIT // active session limit sInt32 fConcurrentDeviceLimit; #endif #ifdef ENGINEINTERFACE_SUPPORT // for engine libraries, MAN/MOD/HwV/DevTyp can be configured string fMan; string fMod; string fHwV; string fFwV; string fDevTyp; #endif #if defined(SYSER_REGISTRATION) && (!defined(HARDCODED_CONFIG) || defined(ENGINEINTERFACE_SUPPORT)) // licensing via config file or engine interface is possible string fLicenseName; string fLicenseCode; #endif // SyncML encoder/decoder parameters uInt32 fLocalMaxMsgSize; // my own maxmsgsize uInt32 fLocalMaxObjSize; // my own maxobjsize, if 0, large object support is disabled // - System time context (usually TCTX_SYSTEM, but might be explicitly set if system TZ info is not available) timecontext_t fSystemTimeContext; protected: #ifndef HARDCODED_CONFIG // parsing virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif // resolving (finishing) virtual void localResolve(bool aLastPass); private: }; // TRootConfig } // namespace sysync // now include rest (some of the config classes are // required by these includes already) #include "sysync.h" #include "syncsession.h" namespace sysync { /* TSyncAppBase is a global, singular object which is instantiated ONCE * per application. */ class TSyncAppBase : noncopyable { friend class TDebugConfig; public: // constructors/destructors TSyncAppBase(); virtual ~TSyncAppBase(); // request count sInt32 requestCount(void) { return fRequestCount; }; sInt32 incRequestCount(void) { return ++fRequestCount; }; // config access TRootConfig *getRootConfig(void) { return fConfigP; }; // - combine URI and session ID to make a RespURI according to transport virtual void generateRespURI( string & /* aRespURI */, cAppCharP /* aLocalURI */, cAppCharP /* aSessionID */ ) { /* nop, no RespURI */ }; #ifdef HARDCODED_CONFIG // create hardcoded config (root config element knows how) localstatus initHardcodedConfig(void); #else // config error printing virtual void ConferrPuts(const char *msg); void ConferrPrintf(const char *text, ...); // config reading localstatus readXMLConfigStream(TXMLConfigReadFunc aReaderFunc, void *aContext); virtual localstatus configStatus(void) { if (!fConfigP) return LOCERR_NOCFG; return fConfigP->getFatalError(); }; #ifdef CONSTANTXML_CONFIG localstatus readXMLConfigConstant(const char *aConstantXML); #endif localstatus readXMLConfigCFile(FILE *aCfgFile); localstatus readXMLConfigFile(cAppCharP aFilePath); #ifndef ENGINE_LIBRARY localstatus readXMLConfigStandard(const char *aConfigFileName, bool aOnlyGlobal, bool aAbsolute=false); #endif #endif // HARDCODED_CONFIG #ifdef APP_CAN_EXPIRE localstatus fAppExpiryStatus; // LOCERR_OK = ok, LOCERR_BADREG, LOCERR_TOONEW or LOCERR_EXPIRED = bad #endif #ifndef HARDCODED_CONFIG // access to config variables bool getConfigVar(cAppCharP aVarName, string &aValue); bool setConfigVar(cAppCharP aVarName, cAppCharP aNewValue); bool unsetConfigVar(cAppCharP aVarName); bool expandConfigVars(string &aString, sInt8 aCfgVarExp, TConfigElement *aCfgElement=NULL, cAppCharP aElementName=NULL); #endif #ifdef SYDEBUG // path where config came from string fConfigFilePath; // access to logging for session TDebugLogger *getDbgLogger(void) { return &fAppLogger; }; uInt32 getDbgMask(void) { return fAppLogger.getMask(); }; // factory function for debug output channel #ifndef NO_C_FILES virtual TDbgOut *newDbgOutputter(bool aGlobal) { return new TStdFileDbgOut; }; #else virtual TDbgOut *newDbgOutputter(bool aGlobal) = 0; #endif #endif // SYDEBUG // app time zones GZones *getAppZones(void) { return &fAppZones; }; // Profiling TP_DEFINFO(fTPInfo) // Handle exception happening while decoding commands for a session virtual Ret_t HandleDecodingException(TSyncSession *aSessionP, const char *aRoutine, exception *aExceptionP=NULL) = 0; // access to SyncML toolkit bool newSmlInstance(SmlEncoding_t aEncoding, sInt32 aWorkspaceMem, InstanceID_t &aInstanceID); Ret_t getSmlInstanceUserData(InstanceID_t aInstanceID, void **aUserDataPP); Ret_t setSmlInstanceUserData(InstanceID_t aInstanceID, void *aUserDataP); void freeSmlInstance(InstanceID_t aInstance); // determine encoding from beginning of SyncML message data static SmlEncoding_t encodingFromData(cAppPointer aData, memSize aDataSize); // determine encoding from Content-Type: header value static SmlEncoding_t encodingFromContentType(cAppCharP aTypeString); // virtual handlers for SyncML toolkit callbacks, must be separately derived for server/client cases // - Start/End Message: derived method in server case actually creates session virtual Ret_t StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // user data, should be NULL (as StartMessage is responsible for setting userdata) SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ) = 0; // test if message buffering is available virtual bool canBufferRetryAnswer(void) { return false; }; // must be set in server bases // non-virtual handlers, are always called with userData containing valid session pointer // - end of message Ret_t EndMessage(VoidPtr_t userData, Boolean_t aFinal); // - grouping commands Ret_t StartSync(VoidPtr_t userData, SmlSyncPtr_t aContentP); Ret_t EndSync(VoidPtr_t userData); Ret_t StartSequence(VoidPtr_t userData, SmlSequencePtr_t aContentP); Ret_t EndSequence(VoidPtr_t userData); Ret_t StartAtomic(VoidPtr_t userData, SmlAtomicPtr_t aContentP); Ret_t EndAtomic(VoidPtr_t userData); // - sync commands Ret_t AddCmd(VoidPtr_t userData, SmlAddPtr_t aContentP); Ret_t AlertCmd(VoidPtr_t userData, SmlAlertPtr_t aContentP); Ret_t DeleteCmd(VoidPtr_t userData, SmlDeletePtr_t aContentP); Ret_t GetCmd(VoidPtr_t userData, SmlGetPtr_t aContentP); Ret_t PutCmd(VoidPtr_t userData, SmlPutPtr_t aContentP); #ifdef MAP_RECEIVE Ret_t MapCmd(VoidPtr_t userData, SmlMapPtr_t aContentP); #endif #ifdef RESULT_RECEIVE Ret_t ResultsCmd(VoidPtr_t userData, SmlResultsPtr_t aContentP); #endif Ret_t StatusCmd(VoidPtr_t userData, SmlStatusPtr_t aContentP); Ret_t ReplaceCmd(VoidPtr_t userData, SmlReplacePtr_t aContentP); Ret_t CopyCmd(VoidPtr_t userData, SmlCopyPtr_t aContentP); Ret_t MoveCmd(VoidPtr_t userData, SmlMovePtr_t aContentP); // - error handling Ret_t HandleError(VoidPtr_t userData); Ret_t DummyHandler(VoidPtr_t userData, const char* msg); // flag to indicated deletion in progess (blocking virtuals for debug info) #ifdef SYSER_REGISTRATION // somewhat scattered within object to make reverse engineering harder uInt16 fRegProductCode; // updated by checkRegInfo uInt8 fRegLicenseType; // updated by checkRegInfo #endif // convenience version for getting time lineartime_t getSystemNowAs(timecontext_t aContext) { return sysync::getSystemNowAs(aContext,getAppZones()); }; protected: // Server or client bool fIsServer; // Application custom time zones GZones fAppZones; // Destruction flag bool fDeleting; // config TRootConfig *fConfigP; #ifndef HARDCODED_CONFIG // user-defined config variables TStringToStringMap fConfigVars; #endif // request count sInt32 fRequestCount; // count of requests public: // this is called to control behaviour for builds that can be client OR server bool isServer(void) { return fIsServer; }; #ifdef SYSER_REGISTRATION // somewhat scattered within object to make reverse engineering harder bool fRegOK; // updated by checkRegInfo, used to disable hard-coded-expiry #endif #if defined(PROGRESS_EVENTS) && !defined(ENGINE_LIBRARY) // callback for progress events TProgressEventFunc fProgressEventFunc; void *fProgressEventContext; // event generator bool NotifyAppProgressEvent( TProgressEventType aEventType, TLocalDSConfig *aDatastoreID=NULL, sInt32 aExtra1=0, sInt32 aExtra2=0, sInt32 aExtra3=0 ); #endif // non-engine progress events #ifdef ENGINEINTERFACE_SUPPORT // owning engineInterface TEngineInterface *fEngineInterfaceP; #else // "master" pointer, to allow callbacks to refer to "master" object which creates appbase void *fMasterPointer; #endif // save app state (such as settings in datastore configs etc.) virtual void saveAppState(void); public: // - inter-module context (needed for pooling global per-process ressources like Java VM) CContext fApiInterModuleContext; #ifdef SYSER_REGISTRATION // somewhat scattered within object to make reverse engineering harder uInt8 fRegProductFlags; // updated by checkRegInfo uInt16 fRegQuantity; // updated by checkRegInfo sInt16 fDaysLeft; // updated by appEnableStatus() and/or checkRegInfo(). 0=expired, -1=not limited #endif // identification // - identification of the application (constant for monolithic builds, configurable for engine library) string getManufacturer(); string getModel(); string getHardwareVersion(); string getFirmwareVersion(); // - device type, only used for clients string getDevTyp(); // - device ID, can be customized via "customdeviceid" config var bool getMyDeviceID(string &devid); // - hardwired information (cannot change, always identifying Synthesis engine and its version cAppCharP getOEM(void) { return SYSYNC_OEM; } // hardwired, not configurable in target options cAppCharP getSoftwareVersion(void) { return SYSYNC_FULL_VERSION_STRING; } // hardwired to real version number // expiry checking #ifdef EXPIRES_AFTER_DATE sInt32 fScrambledNow; // scrambled now, set at syncappbase creation #endif #if defined(APP_CAN_EXPIRE) || defined(SYSER_REGISTRATION) // check if app is enabled localstatus appEnableStatus(void); // get registration information to display localstatus getAppEnableInfo(sInt16 &aDaysLeft, string *aRegnameP=NULL, string *aRegInternalsP=NULL); #else localstatus appEnableStatus(void) { return LOCERR_OK; } // app is always enabled //#warning "WARNING: non-expiring app - is this intended?" #endif #ifdef APP_CAN_EXPIRE // updates fAppExpiryStatus according to registration and hardcoded expiry date void updateAppExpiry(void); #endif #ifdef SYSER_REGISTRATION // updated by checkRegInfo uInt8 fRegDuration; uInt8 fRelDuration; uInt32 fLicCRC; #if defined(EXPIRES_AFTER_DAYS) && defined(ENGINEINTERFACE_SUPPORT) lineardate_t fFirstUseDate; uInt32 fFirstUseVers; #endif // checks if registered (must be implemented in base class) // returns LOCERR_EXPIRED, LOCERR_TOONEW or LOCERR_BADREG if not registered correctly virtual localstatus isRegistered(void); // checks and saves registration info passed. Returns true if registration is ok // (note: derived class must implement saving) virtual localstatus checkAndSaveRegInfo(const char *aRegKey, const char *aRegCode) { return LOCERR_BADREG; } /* no implementation */ // checks registration code for CRC ok and compare with // predefined constants for product code etc. virtual localstatus checkRegInfo(const char *aRegKey, const char *aRegCode, bool aMangled=false); // extended license type depending check (such as activation) virtual bool checkLicenseType(uInt16 aLicenseType) { return aLicenseType==0; }; // defaults to ok for type==0 // checks if current license is properly activated localstatus checkLicenseActivation(lineardate_t &aLastcheck, uInt32 &aLastcrc); // scan for license restrictions static const char * getLicenseRestriction(const char *aInfo, string &aID, string &aVal); // get registration string virtual void getRegString(string &aString); #endif // - check for Feature enabled virtual bool isFeatureEnabled(uInt16 aFeatureNo) { return false; /* none enabled by default */ }; #ifdef CONCURRENT_DEVICES_LIMIT // check if session count is exceeded void checkSessionCount(sInt32 aSessionCount, TSyncSession *aSessionP); #endif #ifdef EXPIRES_AFTER_DAYS // gets information of first use for a given variant of the software. virtual void getFirstUseInfo(uInt8 aVariant, lineardate_t &aFirstUseDate, uInt32 &aFirstUseVers); // update first use info to allow for repeated eval when user installs an all-new version bool updateFirstUseInfo(lineardate_t &aFirstUseDate, uInt32 &aFirstUseVers); #endif private: // to be executed after reading config stream or hard-coded config localstatus finishConfig(); // debug logging #ifdef SYDEBUG TDebugLogger fAppLogger; // the logger #endif }; // TSyncAppBase } // namespace sysync #endif // SYNCAPPBASE_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncclientbase.cpp0000644000373300037200000003352112424517753026363 0ustar00nightlyallusers00000000000000/* * TSyncClientBase * Abstract baseclass for client * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * */ #include "prefix_file.h" #include "sysync.h" #include "syncclientbase.h" #include "syncagent.h" namespace sysync { #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= #ifndef ENGINE_LIBRARY #warning "using ENGINEINTERFACE_SUPPORT in old-style appbase-rooted environment. Should be converted to real engine usage later" // Engine factory function for non-Library case ENGINE_IF_CLASS *newClientEngine(void) { // For real engine based targets, newClientEngine must create a target-specific derivate // of the client engine, which then has a suitable newSyncAppBase() method to create the // appBase. For old-style environment, a generic TClientEngineInterface is ok, as this // in turn calls the global newSyncAppBase() which then returns the appropriate // target specific appBase. return new TClientEngineInterface; } // newClientEngine /// @brief returns a new application base. TSyncAppBase *TClientEngineInterface::newSyncAppBase(void) { // For not really engine based targets, the appbase factory function is // a global routine (for real engine targets, it is a true virtual of // the engineInterface, implemented in the target's leaf engineInterface derivate. // - for now, use the global appBase creator routine return sysync::newSyncAppBase(); // use global factory function } // TClientEngineInterface::newSyncAppBase #else // EngineInterface methods // ----------------------- /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. For multi-profile clients: profile ID to use /// @param aSessionName[in] a text name/id to identify a session, useage depending on session type. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TClientEngineInterface::OpenSessionInternal(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName) { TSyncClientBase *clientBaseP = static_cast(getSyncAppBase()); localstatus sta = LOCERR_WRONGUSAGE; // No client session may exist when opening a new one if (clientBaseP->fClientSessionP) return LOCERR_WRONGUSAGE; // check type of session if (aSelector == SESSIONSEL_DBAPI_TUNNEL) { // initiate a DBAPI tunnel session. #ifdef DBAPI_TUNNEL_SUPPORT // Create a new session, sessionName selects datastore sta = clientBaseP->CreateTunnelSession(aSessionName); if (sta==LOCERR_OK) { // return the session pointer as handle aNewSessionH=(SessionH)clientBaseP->fClientSessionP; } else { // error: make sure it is deleted in case it was half-constructed if (clientBaseP->fClientSessionP) { delete clientBaseP->fClientSessionP; clientBaseP->fClientSessionP = NULL; } } #else return LOCERR_NOTIMP; // tunnel not implemented #endif } else if ((aSelector & ~SESSIONSEL_PROFILEID_MASK) == SESSIONSEL_CLIENT_AS_CHECK) { // special autosync-checking "session" #ifdef AUTOSYNC_SUPPORT // %%% tbi return LOCERR_NOTIMP; // %%% not implemented for now #else return LOCERR_NOTIMP; // no Autosync in this engine #endif } else { // Create a new session sta = clientBaseP->CreateSession(); // Pass profile ID if (sta==LOCERR_OK) { clientBaseP->fClientSessionP->SetProfileSelector(aSelector & SESSIONSEL_PROFILEID_MASK); // return the session pointer as handle aNewSessionH=(SessionH)clientBaseP->fClientSessionP; } } // done return sta; } // TClientEngineInterface::OpenSessionInternal /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TClientEngineInterface::OpenSessionKey(SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode) { // %%% add autosync-check session case here // must be current session's handle (for now - however // future engines might allow multiple concurrent client sessions) if (aSessionH != (SessionH)static_cast(getSyncAppBase())->fClientSessionP) return LOCERR_WRONGUSAGE; // something wrong with that handle // get client session pointer TSyncAgent *clientSessionP = static_cast((void *)aSessionH); // create settings key for the session aNewKeyH = (KeyH)clientSessionP->newSessionKey(this); // done return LOCERR_OK; } // TClientEngineInterface::OpenSessionKey /// @brief Close a session /// @note It depends on session type if this also destroys the session or if it may persist and can be re-opened. /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TClientEngineInterface::CloseSession(SessionH aSessionH) { TSyncClientBase *clientBaseP = static_cast(getSyncAppBase()); // %%% add autosync-check session case here // Nothing to do if no client session exists or none is requested for closing if (!clientBaseP->fClientSessionP || !aSessionH) return LOCERR_OK; // nop // must be current session's handle if (aSessionH != (SessionH)clientBaseP->fClientSessionP) return LOCERR_WRONGUSAGE; // something wrong with that handle // terminate running session (if any) clientBaseP->KillClientSession(LOCERR_USERABORT); // closing while session in progress counts as user abort // done return LOCERR_OK; } // TClientEngineInterface::CloseSession /// @brief Executes next step of the session /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError TClientEngineInterface::SessionStep(SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP) { TSyncClientBase *clientBaseP = static_cast(getSyncAppBase()); // %%% add autosync-check session case here // must be current session's handle (for now - however // future engines might allow multiple concurrent client sessions) if (aSessionH != (SessionH)clientBaseP->fClientSessionP) return LOCERR_WRONGUSAGE; // something wrong with that handle // get client session pointer TSyncAgent *clientSessionP = static_cast((void *)aSessionH); // let client session handle it return clientSessionP->SessionStep(aStepCmd, aInfoP); } // TClientEngineInterface::SessionStep /// @brief returns the SML instance for a given session handle /// (internal helper to allow TEngineInterface to provide the access to the SyncML buffer) InstanceID_t TClientEngineInterface::getSmlInstanceOfSession(SessionH aSessionH) { TSyncClientBase *clientBaseP = static_cast(getSyncAppBase()); // %%% add autosync-check session case here // must be current session's handle (for now - however // future engines might allow multiple concurrent client sessions) if (aSessionH != (SessionH)clientBaseP->fClientSessionP) return 0; // something wrong with session handle -> no SML instance // get client session pointer TSyncAgent *clientSessionP = static_cast((void *)aSessionH); // return SML instance associated with that session return clientSessionP->getSmlWorkspaceID(); } // TClientEngineInterface::getSmlInstanceOfSession TSyError TClientEngineInterface::debugPuts(cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aPrefix, cAppCharP aText) { #if defined(SYDEBUG) static_cast(getSyncAppBase())->getDbgLogger()->DebugPuts(TDBG_LOCATION_ARGS(aFunction, aFile, aLine /* aPrefix */) aDbgLevel, aText); return 0; #else return LOCERR_NOTIMP; #endif } #endif // ENGINE_LIBRARY #endif // ENGINEINTERFACE_SUPPORT // TSyncClientBase // =============== #ifdef DIRECT_APPBASE_GLOBALACCESS // Only for old-style targets that still use a global anchor TSyncClientBase *getClientBase(void) { return static_cast(getSyncAppBase()); } // getClientBase #endif // DIRECT_APPBASE_GLOBALACCESS // constructor TSyncClientBase::TSyncClientBase() : TSyncAppBase(), fClientSessionP(NULL) { // this is a client engine fIsServer = false; } // TSyncClientBase::TSyncClientBase // destructor TSyncClientBase::~TSyncClientBase() { // kill session, if any KillClientSession(); fDeleting=true; // flag deletion to block calling critical (virtual) methods // delete client session, if any SYSYNC_TRY { // %%%%%%%% tdb... } SYSYNC_CATCH (...) SYSYNC_ENDCATCH } // TSyncClientBase::~TSyncClientBase // Called from SyncML toolkit when a new SyncML message arrives // - dispatches to session's StartMessage Ret_t TSyncClientBase::StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // pointer to a TSyncAgent descendant SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ) { TSyncSession *sessionP = static_cast(aUserData); // the client session SYSYNC_TRY { // let session handle details of StartMessage callback return sessionP->StartMessage(aContentP); } SYSYNC_CATCH (exception &e) return HandleDecodingException(sessionP,"StartMessage",&e); SYSYNC_ENDCATCH SYSYNC_CATCH (...) return HandleDecodingException(sessionP,"StartMessage",NULL); SYSYNC_ENDCATCH } // TSyncClientBase::StartMessage #ifdef DBAPI_TUNNEL_SUPPORT // - create a new client DBApi tunnel session localstatus TSyncClientBase::CreateTunnelSession(cAppCharP aDatastoreName) { localstatus sta; // create an ordinary session sta = CreateSession(); if (sta==LOCERR_OK) { // determine which datastore to address sta = fClientSessionP->InitializeTunnelSession(aDatastoreName); } // done return sta; } // TSyncClientBase::CreateTunnelSession #endif // DBAPI_TUNNEL_SUPPORT // create a new client session localstatus TSyncClientBase::CreateSession(void) { // remove any possibly existing old session first KillClientSession(); // get config //TAgentConfig *configP = static_cast(getSyncAppBase()->getRootConfig()->fAgentConfigP); // create a new client session of appropriate type // - use current time as session ID (only for logging purposes) string s; LONGLONGTOSTR(s,PRINTF_LLD_ARG(getSystemNowAs(TCTX_UTC))); fClientSessionP = static_cast(fConfigP->fAgentConfigP)->CreateClientSession(s.c_str()); if (!fClientSessionP) return LOCERR_UNDEFINED; // check expiry here return appEnableStatus(); } // TSyncClientBase::CreateSession // initialize the (already created) client session and link it with the SML toolkit localstatus TSyncClientBase::InitializeSession(uInt32 aProfileID, bool aAutoSyncSession) { // session must be created before with CreateSession() if (!fClientSessionP) return LOCERR_WRONGUSAGE; // initialitze session return fClientSessionP->InitializeSession(aProfileID, aAutoSyncSession); } // create a message into the instance buffer localstatus TSyncClientBase::generateRequest(bool &aDone) { return getClientSession()->NextMessage(aDone); } // TSyncClientBase::generateRequest // clear all unprocessed or unsent data from SML workspace void TSyncClientBase::clrUnreadSmlBufferdata(void) { InstanceID_t myInstance = getClientSession()->getSmlWorkspaceID(); MemPtr_t p; MemSize_t s; smlLockReadBuffer(myInstance,&p,&s); smlUnlockReadBuffer(myInstance,s); } // TSyncClientBase::clrUnreadSmlBufferdata // process message in the instance buffer localstatus TSyncClientBase::processAnswer(void) { return fClientSessionP->processAnswer(); } // - extract hostname from an URI according to transport void TSyncClientBase::extractHostname(const char *aURI, string &aHostName) { string port; splitURL(aURI,NULL,&aHostName,NULL,NULL,NULL,&port,NULL); // keep old semantic: port included in aHostName if (!port.empty()) { aHostName += ':'; aHostName += port; } } // TSyncClientBase::extractHostname // - extract document name from an URI according to transport void TSyncClientBase::extractDocumentInfo(const char *aURI, string &aDocName) { string query; splitURL(aURI,NULL,NULL,&aDocName,NULL,NULL,NULL,&query); // keep old semantic: query part of aDocName if (!query.empty()) { aDocName += '?'; aDocName += query; } } // TSyncClientBase::extractDocumentInfo // - extract protocol name from an URI according to transport void TSyncClientBase::extractProtocolname(const char *aURI, string &aProtocolName) { splitURL(aURI,&aProtocolName,NULL,NULL,NULL,NULL,NULL,NULL); } // TSyncClientBase::extractProtocolname // delete and unlink current session from SML toolkit void TSyncClientBase::KillClientSession(localstatus aStatusCode) { if (fClientSessionP) { // Abort session if (aStatusCode) fClientSessionP->AbortSession(aStatusCode,true); // remove instance of that session freeSmlInstance(fClientSessionP->getSmlWorkspaceID()); fClientSessionP->setSmlWorkspaceID(0); // make sure it isn't set any more // delete session itself TSyncAgent *clientP = fClientSessionP; fClientSessionP=NULL; delete clientP; } } // TSyncClientBase::KillSession } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync/syncclientbase.h0000644000373300037200000001376312424517753026036 0ustar00nightlyallusers00000000000000/* * TSyncClientBase * Abstract baseclass for client * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * */ #ifndef SYNCCLIENTBASE_H #define SYNCCLIENTBASE_H // general includes (SyncML tookit, windows, Clib) #include "sysync.h" #include "syncappbase.h" #include "syncagent.h" namespace sysync { // forward declarations class TSyncSession; class TSyncAgent; class TSyncClientBase; #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= // Engine module class class TClientEngineInterface: public TEngineInterface { typedef TEngineInterface inherited; public: // constructor TClientEngineInterface() {}; #ifndef ENGINE_LIBRARY // appbase factory (based on old appbase-root method) is here virtual TSyncAppBase *newSyncAppBase(void); #else // Running a Client Sync Session // ----------------------------- /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. For multi-profile clients: profile ID to use /// @param aSessionName[in] a text name/id to identify a session, useage depending on session type. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSessionInternal(SessionH &aNewSessionH, uInt32 aSelector, cAppCharP aSessionName); /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSessionKey(SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode); /// @brief Close a session /// @note It depends on session type if this also destroys the session or if it may persist and can be re-opened. /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError CloseSession(SessionH aSessionH); /// @brief Executes sync session or other sync related activity step by step /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SessionStep(SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP = NULL); virtual TSyError debugPuts(cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aLinePrefix, cAppCharP aText); protected: /// @brief returns the SML instance for a given session handle virtual InstanceID_t getSmlInstanceOfSession(SessionH aSessionH); #endif // ENGINE_LIBRARY }; // TClientEngineInterface #endif // ENGINEINTERFACE_SUPPORT #ifdef DIRECT_APPBASE_GLOBALACCESS // access to client base TSyncClientBase *getClientBase(void); #endif /* TSyncClientBase is a singular object that can set-up and * start Sync client sessions. * It also receives calls from SyncML toolkit callbacks and * can route them to the active TSyncSession */ class TSyncClientBase : public TSyncAppBase { typedef TSyncAppBase inherited; #ifdef ENGINEINTERFACE_SUPPORT friend class TClientEngineInterface; #endif public: // constructors/destructors TSyncClientBase(); virtual ~TSyncClientBase(); // Session flow entry points // - create a new client session localstatus CreateSession(void); #ifdef DBAPI_TUNNEL_SUPPORT // - create a new client DBApi tunnel session localstatus CreateTunnelSession(cAppCharP aDatastoreName); #endif // - initialize client session and link it with the SML toolkit // (session must be created with CreateSession() before) localstatus InitializeSession(uInt32 aProfileID, bool aAutoSyncSession=false); // - create a message into the instance buffer, returns aDone==true if none needed any more localstatus generateRequest(bool &aDone); // - clear unread data in the instance buffer (received and to-be-sent) void clrUnreadSmlBufferdata(void); // - process message in the instance buffer localstatus processAnswer(void); // - get current session TSyncAgent *getClientSession(void) { return fClientSessionP; }; // - remove and kill current session void KillClientSession(localstatus aStatusCode=0); // handlers for SyncML toolkit callbacks // - Start/End Message: identifies Session, and creates new or assigns existing session Ret_t StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // pointer to a TSyncAgent descendant SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ); // Session handling // - extract hostname from an URI according to transport virtual void extractHostname(const char *aURI, string &aHostName); // - extract document info (name/auth) from an URI according to transport void extractDocumentInfo(const char *aURI, string &aDocName); // - extract protocol name from an URI according to transport virtual void extractProtocolname(const char *aURI, string &aProtocolName); protected: // Handle exception happening while decoding commands for session // (Former KillSession) virtual Ret_t HandleDecodingException(TSyncSession * /* aSessionP */, const char * /* aRoutine */, exception * /* aExceptionP */=NULL) { return SML_ERR_UNSPECIFIC; /* %%%% nop so far */ }; private: // the current session TSyncAgent *fClientSessionP; }; // TSyncClientBase } // namespace sysync #endif // SYNCCLIENTBASE_H // eof syncevolution-1.5/src/synthesis/src/sysync/synccommand.cpp0000755000373300037200000047065512424517753025710 0ustar00nightlyallusers00000000000000/* * File: SyncCommand.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSmlCommand, TXXXCmd.... * Wrapper classes for SyncML Commands and the associated SyncML * Toolkit mechanics. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-30 : luz : created * */ // includes #include "prefix_file.h" #include "synccommand.h" #include "syncsession.h" // %%%% debug hack switch //#define DEBUG_XMLRESPONSE_FOR_WBXML 1 //#undef DEBUG_XMLRESPONSE_FOR_WBXML // Status for Results is not needed according to SyncML 1.0.1 // specs but 9210 seems to need it. // Note: future versions of the standard will require // status for all commands, so this is going to be the default #define RESULTS_SENDS_STATUS 1 // Map statuses are sent immediately, even if they will be part // of sync-updates-to-client package (instead of map-acknowledge) // This seems to be the normal case #define MAP_STATUS_IMMEDIATE 1 #ifndef SYNCCOMMAND_PART1_EXCLUDE using namespace sysync; namespace sysync { void TSmlCommandPContainerClear(TSmlCommandPContainer &aContainer) { while (!aContainer.empty()) { delete aContainer.front(); aContainer.pop_front(); } } } /* command name list, used for cmdRef */ const char * const SyncCommandNames[numSmlCommandTypes] = { "SyncHdr", "Sync", "Sync", // note this is actually SyncEnd, but as we send this as cmdRef, it MUST be named "Sync" as well "Add", "Alert", "Delete", "Get", "Put", "Map", "Results", "Status", "Replace", "Copy", "Move", "Sequence", "Atomic", "[unknown]" }; /* * Implementation of TSmlCommand */ /* public TSmlCommand members */ // base constructor (to be called by all derived constructors) TSmlCommand::TSmlCommand( TSmlCommandTypes aCmdType, // the command type bool aOutgoing, // set if this is a outgoing command (to avoid confusion) TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID // (optional, for receiving only) the Message ID of the command ) { // save info fCmdType=aCmdType; fMsgID=aMsgID; fSessionP=aSessionP; fOutgoing=aOutgoing; // init fWaitingForStatus=0; // not yet waiting for any statuses fCmdID=0; // no ID yet, will be either set at issue() or read at StartProcessing() fNoResp=false; // respond by default fDontSend=false; // send by default fEvalMode=false; // no eval fPrepared=false; fAllowFailure=false; // debug DEBUGPRINTFX(DBG_PROTO,("Created command '%s' (%s)", getName(), fOutgoing ? "outgoing" : "incoming")); } // TSmlCommand::TSmlCommand // get name of command const char *TSmlCommand::getName(void) { return SyncCommandNames[fCmdType]; } // TSmlCommand::getName #ifdef SYDEBUG TDebugLogger *TSmlCommand::getDbgLogger(void) { // commands log to session's logger return fSessionP ? fSessionP->getDbgLogger() : NULL; } // TSmlCommand::getDbgLogger uInt32 TSmlCommand::getDbgMask(void) { if (!fSessionP) return 0; // no session, no debug return fSessionP->getDbgMask(); } // TSmlCommand::getDbgMask #endif TSyncAppBase *TSmlCommand::getSyncAppBase(void) { return fSessionP ? fSessionP->getSyncAppBase() : NULL; } // TSmlCommand::getSyncAppBase // get name of certain command const char *TSmlCommand::getNameOf(TSmlCommandTypes aCmdType) { return SyncCommandNames[aCmdType]; } // TSmlCommand::getNameOf // start processing a command void TSmlCommand::StartProcessing( SmlPcdataPtr_t aCmdID, // ID of command Flag_t aFlags // flags of command ) { // get command ID StrToULong(smlPCDataToCharP(aCmdID),fCmdID); // get noResp state fNoResp=(aFlags & SmlNoResp_f)!=0; PDEBUGPRINTFX(DBG_HOT,("Started processing Command '%s' (incoming MsgID=%ld, CmdID=%ld)%s",getName(),(long)fMsgID,(long)fCmdID,fNoResp ? ", noResp" : "")); } // TSmlCommand::StartProcessing // - Prepare for issuing, evaluate size of command sInt32 TSmlCommand::evalIssue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp // issue without wanting response ) { MemSize_t res; bool ok; fPrepared=false; // force re-prepare // start evaluation run smlStartEvaluation(fSessionP->getSmlWorkspaceID()); fEvalMode=true; SYSYNC_TRY { // - call issue to get size ok=issue(aAsCmdID,aInMsgID,aNoResp); // - back to normal mode fEvalMode=false; smlEndEvaluation(fSessionP->getSmlWorkspaceID(),&res); if (!ok) res=-1; // no room, error /* %%% hack to force unsendable-sized syncop commands: #ifdef RELEASE_VERSION #error "%%%%remove this debuh hack!!!" #endif if (dynamic_cast(this)!=NULL) { // always oversized res=0; } */ } SYSYNC_CATCH (...) fEvalMode=false; smlEndEvaluation(fSessionP->getSmlWorkspaceID(),&res); SYSYNC_RETHROW; SYSYNC_ENDCATCH // return available space after sending this command return res; } // TSmlCommand::evalIssue void TSmlCommand::PrepareIssue( SmlPcdataPtr_t *aCmdID, // ID of command Flag_t *aFlags // flags of command ) { if (!fPrepared) { fPrepared=true; // set Command ID if (aCmdID) { // remove old if (*aCmdID) smlFreePcdata(*aCmdID); // create new *aCmdID=newPCDataLong(fCmdID); } // add NoResp flag if requested if (aFlags) *aFlags |= fNoResp ? SmlNoResp_f : 0; } if (!fEvalMode) { #ifdef SYDEBUG if (aCmdID) { if (*aCmdID==NULL) SYSYNC_THROW(TSyncException("No Command ID set at evalIssue() but requested one at issue()")); } #endif // save workspace size immediately before sending to calc message size fBytesbefore=fSessionP->getSmlWorkspaceFreeBytes(); #ifdef DEBUG_XMLRESPONSE_FOR_WBXML // %%% debug hack %%% force output to be XML smlSetEncoding(fSessionP->getSmlWorkspaceID(),SML_XML); #endif } } // TSmlCommand::PrepareIssue #ifndef USE_SML_EVALUATION // get (approximated) message size required for sending it uInt32 TSmlCommand::messageSize(void) { // default, should be enough for most commands return DEFAULTCOMMANDSIZE; } #endif // finalizes issuing a command (updates message size) void TSmlCommand::FinalizeIssue(void) { fSessionP->incOutgoingMessageSize(fBytesbefore-fSessionP->getSmlWorkspaceFreeBytes()); // update msg size #ifdef DEBUG_XMLRESPONSE_FOR_WBXML // %%% debug hack %%% force input to be WBXML again smlSetEncoding(fSessionP->getSmlWorkspaceID(),SML_WBXML); #endif } // TSmlCommand::FinalizeIssue // finalizes issuing a command (updates message size) bool TSmlCommand::queueForResponse(void) { return (!fNoResp && !fSessionP->fOutgoingNoResp); } // TSmlCommand::queueForStatus // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TSmlCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // set command ID and Message ID (for further compare with incoming statuses) fCmdID=aAsCmdID; fMsgID=aInMsgID; fNoResp=aNoResp; return fEvalMode; // evaluation ok, but base class commands cannot be issued } // TSmlCommand::issue // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TSmlCommand::execute(void) { // non-derived execute (such as map received by client): protocol error TStatusCommand *statusCmdP=newStatusCommand(400); ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); // done return false; } // TSmlCommand::execute // - test if command matches status bool TSmlCommand::matchStatus(TStatusCommand *aStatusCmdP) { // match if cmdID and msgID are the same return ( (fMsgID==aStatusCmdP->fRefMsgID) && (fCmdID==aStatusCmdP->fRefCmdID) ); } // TSmlCommand::matchStatus // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TSmlCommand::handleStatus(TStatusCommand *aStatusCmdP) { // base class just handles common cases TSyError statuscode = aStatusCmdP->getStatusCode(); if (statuscode<200) { // informational switch (statuscode) { case 101: // in progress, wait for final status POBJDEBUGPRINTFX(fSessionP,DBG_HOT,("Status: 101: In progress, keep waiting for final status")); return false; // keep in queue //break; default: // unknown POBJDEBUGPRINTFX(fSessionP,DBG_ERROR,("Status: %hd: unknown informational status -> accepted",statuscode)); return true; } } else if (statuscode<300) { if (statuscode==202) { // accepted for processing POBJDEBUGPRINTFX(fSessionP,DBG_PROTO,("Status: 202: accepted for processing, keep waiting for final status")); return false; // keep in queue } // successful POBJDEBUGPRINTFX(fSessionP,DBG_PROTO,("Status: %hd: successful --> accept as ok",statuscode)); return true; // done with command } else if (statuscode<400) { // redirection // %%% - we cannot handle them, abort for now POBJDEBUGPRINTFX(fSessionP,DBG_ERROR,("Status: %hd: redirected --> we cannot handle this, abort session",statuscode)); fSessionP->AbortSession(412,false,statuscode); // other party's fault: incomplete command return true; // done with command } else if (statuscode==418) { POBJDEBUGPRINTFX(fSessionP,DBG_PROTO,("Status: 418: already existed on peer --> accept as ok")); return true; // done with command } else if (statuscode<500) { // originator exception (we sent some bad stuff) POBJDEBUGPRINTFX(fSessionP,DBG_ERROR,("Status: %hd: originator exception",statuscode)); if (!fAllowFailure) fSessionP->AbortSession(500,false,statuscode); // our fault return true; // done with command } else { // must be recipient exception POBJDEBUGPRINTFX(fSessionP,DBG_ERROR,("Status: %hd: recipient exception",statuscode)); if (!fAllowFailure) fSessionP->AbortSession(statuscode,false,statuscode); // show other party's reason for error return true; // done with command } // just to make sure return true; // done with command } // TSmlCommand::handleStatus // generate status depending on fNoResp and session's fMsgNoResp TStatusCommand *TSmlCommand::newStatusCommand(TSyError aStatusCode, const char *aStringItem) { TStatusCommand *statusCmdP = new TStatusCommand(fSessionP,this,aStatusCode); if (aStringItem) statusCmdP->addItemString(aStringItem); return statusCmdP; } // TSmlCommand::newStatusCommand // generate and send status depending on fNoResp and session's fMsgNoResp void TSmlCommand::issueStatusCommand(TSyError aStatusCode) { // issuePtr can handle NULL in case no status was generated... fSessionP->issueRootPtr(newStatusCommand(aStatusCode)); } // TSmlCommand::issueStatusCommand TSmlCommand::~TSmlCommand() { TSmlCommandPContainerClear(fPendingStatusReplies); PDEBUGPRINTFX(DBG_PROTO,("Deleted command '%s' (%s MsgID=%ld, CmdID=%ld)",getName(),fOutgoing ? "outgoing" : "incoming", (long)fMsgID,(long)fCmdID)); } // TSmlCommand::~TSmlCommand void TSmlCommand::queueStatusCmd(TSmlCommand *aSyncCommandP) { fPendingStatusReplies.push_back(aSyncCommandP); } bool TSmlCommand::hasQueuedStatusCmds() const { return !fPendingStatusReplies.empty(); } void TSmlCommand::transferQueuedStatusCmds(TSmlCommandPContainer &commands) { while (!fPendingStatusReplies.empty()) { commands.push_back(fPendingStatusReplies.front()); fPendingStatusReplies.pop_front(); } } /* end of TSmlCommand implementation */ /* * Implementation of TSyncHeader */ /* public TSyncHeader members */ // constructor for receiving Sync header TSyncHeader::TSyncHeader( TSyncSession *aSessionP, // associated session (for callbacks) SmlSyncHdrPtr_t aSyncHdrElementP // associated SyncHdr content element ) : TSmlCommand(scmd_synchdr,false,aSessionP) { // save element fSyncHdrElementP = aSyncHdrElementP; } // TSyncHeader::TSyncHeader // constructor for sending SyncHdr TSyncHeader::TSyncHeader( TSyncSession *aSessionP, // associated session (for callbacks) bool aOutgoingNoResp // if true, entire message will request no responses ) : TSmlCommand(scmd_synchdr,true,aSessionP) { // prevent two simultaneous messages if (fSessionP->fOutgoingStarted) SYSYNC_THROW(TSyncException("Tried to start new message before finishing previous")); // let session create the structure (using session vars for info) fSyncHdrElementP=fSessionP->NewOutgoingSyncHdr(aOutgoingNoResp); // now outgoing message IS started fSessionP->fOutgoingStarted=true; } // TSyncHeader::TSyncHeader // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TSyncHeader::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // prepare basic stuff TSmlCommand::issue(0,aInMsgID,false); // now issue if (fSyncHdrElementP) { // issue command with SyncML toolkit, no CmdID or flags to set here PrepareIssue(NULL,NULL); if (!fEvalMode) { Ret_t err; #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) { err=smlStartMessageExt(fSessionP->fOutgoingXMLInstance,fSyncHdrElementP,SmlVersionCodes[fSessionP->fSyncMLVersion]); if (err!=SML_ERR_OK) { // problem with XML translation PDEBUGPRINTFX(DBG_ERROR,("XML translation disabled due to sml error=%04hX",err)); fSessionP->fXMLtranslate=false; } } #endif if ((err=smlStartMessageExt(fSessionP->getSmlWorkspaceID(),fSyncHdrElementP,SmlVersionCodes[fSessionP->fSyncMLVersion]))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlStartMessage",err)); } FinalizeIssue(); // we don't need the status structure any more, free (and NULL ptr) now FreeSmlElement(); } else // just evaluate size return smlStartMessageExt(fSessionP->getSmlWorkspaceID(),fSyncHdrElementP,SmlVersionCodes[fSessionP->fSyncMLVersion])==SML_ERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL synchdr")); } // header will normally receive status return queueForResponse(); } // TSyncHeader::issue // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TSyncHeader::handleStatus(TStatusCommand *aStatusCmdP) { // status for SyncHdr if (!fSessionP->handleHeaderStatus(aStatusCmdP)) { // session could not handle item return TSmlCommand::handleStatus(aStatusCmdP); } // status handled return true; // done with command } // TSyncHeader::handleStatus // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted // NOTE: synchdr is a special case: if it returns FALSE, // session must be reset and synchdr must be re-excecuted bool TSyncHeader::execute(void) { const char *verDTD; const char *verProto; TStatusCommand *statusCmdP=NULL; sInt16 statuscode=400; bool hdrok=true; if (!fSyncHdrElementP) SYSYNC_THROW(TSyncException("empty header")); if (!fSessionP) SYSYNC_THROW(TSyncException("missing fSessionP")); // first get message ID to be able to generate statuses fMsgID=0; // none by default if (StrToULong(smlPCDataToCharP(fSyncHdrElementP->msgID),fMsgID)) { // got msgID, check if ok if ( fMsgID==uInt32(fSessionP->fIncomingMsgID-1) && fSessionP->fAllowMessageRetries // check if we want to allow this (7250 for example seems to retry messages) ) { // this seems to be a transport-level retry of the previous message PDEBUGPRINTFX(DBG_ERROR,("*********** WARNING: Remote resent MsgID %ld",(long)fMsgID)); // set back incoming ID fSessionP->fIncomingMsgID = fMsgID; // -> we should resend the previous answer again. if ( fSessionP->getSyncAppBase()->canBufferRetryAnswer() ) { // we can resend answers PDEBUGPRINTFX(DBG_ERROR,("last answer buffered -> sending it again")); fSessionP->fMessageRetried=true; return false; } else { // use not foolproof poor man's method // %%% This will fail if the previous message received has // changed datastore/session/package states, but will work if // the retry is within a phase (probable case for long sessions) PDEBUGPRINTFX(DBG_ERROR,("No buffered answer to resend -> just process msg again (WARNING: possibly messes up session state)")); } } if (fMsgIDfIncomingMsgID)) { // bad Message ID (lower than previous): forget previous session, start new one PDEBUGPRINTFX(DBG_ERROR,("Bad incoming MsgID %ld, expected >=%ld -> Aborting previous Session, starting new",(long)fMsgID,(long)fSessionP->fIncomingMsgID)); return false; // session must be restarted, this command re-executed } } else { // header without session ID is bad statuscode=500; statusCmdP=newStatusCommand(statuscode); // log file entry PDEBUGPRINTFX(DBG_ERROR,("Missing incoming MsgID -> Aborting Session")); hdrok=false; // cannot start } // Assign session-var anyway fSessionP->fIncomingMsgID=fMsgID; // now check header for conformance SYSYNC_TRY { // get info out of SyncHdr if (hdrok) { // get noResp flag (which is valid for the entire message) fNoResp=(fSyncHdrElementP->flags & SmlNoResp_f)!=0; fSessionP->fMsgNoResp=fNoResp; // copy to session flag // test SyncML version compatibility verProto=smlPCDataToCharP(fSyncHdrElementP->proto); verDTD=smlPCDataToCharP(fSyncHdrElementP->version); sInt16 ver; // find version for (ver=1; verfSyncMLVersion=(TSyncMLVersions)ver; break; } } // - Protocol Version TSyncMLVersions maxver = fSessionP->getSessionConfig()->fMaxSyncMLVersionSupported; TSyncMLVersions minver = fSessionP->getSessionConfig()->fMinSyncMLVersionSupported; if ( ver=numSyncMLVersions || ver>maxver || (IS_SERVER && fSessionP->fSyncMLVersion!=syncml_vers_unknown && fSessionP->fSyncMLVersion!=ver) ) { // unsupported protocol version (or different than in first message): Status 513 // - Make sure we have a valid SyncML version if ( fSessionP->fSyncMLVersion==syncml_vers_unknown || fSessionP->fSyncMLVersion>maxver ) { // use highest version we know for the answering message fSessionP->fSyncMLVersion = maxver; } else if (fSessionP->fSyncMLVersionfSyncMLVersion = minver; } // - Set status statuscode=513; statusCmdP=newStatusCommand(statuscode); // - add version(s) we support in data item string vs; for (sInt16 v=minver; v<=maxver; v++) { if (!vs.empty()) vs+=", "; vs+=SyncMLVerProtoNames[v]; } statusCmdP->addItemString(vs.c_str()); // - log file entry PDEBUGPRINTFX(DBG_ERROR,("Unsupported or changing verProto %s -> Aborting Session",verProto)); hdrok=false; // bad header } // protocol version known, check if DTD matches else if (strcmp(verDTD,SyncMLVerDTDNames[ver])!=0) { // wrong DTD version for this protocol version: Status 505 statuscode=505; statusCmdP=newStatusCommand(statuscode); statusCmdP->addItemString(SyncMLVerDTDNames[ver]); // log file entry PDEBUGPRINTFX(DBG_ERROR,( "Wrong verDTD %s, expected %s -> Aborting Session", verDTD, SyncMLVerDTDNames[ver] )); hdrok=false; // bad header } // if ok so far, continue header processing if (hdrok) { PDEBUGPRINTFX(DBG_HOT,("Started Processing of message #%ld (%s)",(long)fSessionP->fIncomingMsgID,SyncMLVerProtoNames[ver])); // take a look at SyncHdr Meta SmlMetInfMetInfPtr_t metaP=smlPCDataToMetInfP(fSyncHdrElementP->meta); if (metaP) { // max (outgoing) message size if (metaP->maxmsgsize) { smlPCDataToLong(metaP->maxmsgsize,fSessionP->fMaxOutgoingMsgSize); PDEBUGPRINTFX(DBG_REMOTEINFO,("MaxMsgSize found in SyncHdr: %ld -> set for outgoing msgs",(long)fSessionP->fMaxOutgoingMsgSize)); } // max (outgoing) object size (SyncML 1.1 only) if (metaP->maxobjsize) { smlPCDataToLong(metaP->maxobjsize,fSessionP->fMaxOutgoingObjSize); PDEBUGPRINTFX(DBG_REMOTEINFO,("MaxObjSize found in SyncHdr: %ld",(long)fSessionP->fMaxOutgoingObjSize)); } } // call server/client specific message start in derived classes statusCmdP=newStatusCommand(200); // prepare OK default status (will possibly be modified by MessageStarted()) hdrok=fSessionP->MessageStarted(fSyncHdrElementP,*statusCmdP); } else { //#warning "comment the next line to have server respond like pre-1.0.8.29" // call client/server specific message start routine, but with error flag // Note: we already have a status command (containing an error) fSessionP->MessageStarted(fSyncHdrElementP,*statusCmdP,true); } } // complete and send status, if any if (statusCmdP) { statusCmdP->addTargetRef(fSessionP->fLocalURI.c_str()); statusCmdP->addSourceRef(fSessionP->fRemoteURI.c_str()); // issue as SyncHdr status (if successful status) TStatusCommand *cmdP = statusCmdP; statusCmdP=NULL; statuscode=cmdP->getStatusCode(); // get actual status code fSessionP->issueRootPtr(cmdP,false,statuscode==200); } // set session vars according to header success or failure // - ignore all further incoming commands when header is not ok // NOTE: bad cred will NOT (any longer, SyncFest #5) be flagged as bad header // but instead MessageStarted may have aborted command processing if (!hdrok) fSessionP->AbortSession(400,true); // bad request // free this one now, is not needed any more FreeSmlElement(); } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // done with command, delete it now: return true return true; } // TSyncHeader::execute void TSyncHeader::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fSyncHdrElementP); } // TSyncHeader::FreeSmlElement TSyncHeader::~TSyncHeader() { // free command elements, if any (use explicit invocation as this is a destructor) TSyncHeader::FreeSmlElement(); } // TSyncHeader::~TSyncHeader /* end of TSyncHeader implementation */ /* * Implementation of TSyncCommand */ // constructor for sending Sync Command TSyncCommand::TSyncCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aLocalDataStoreP, // local datastore TRemoteDataStore *aRemoteDataStoreP // remote datastore ) : TSmlCommand(scmd_sync,true,aSessionP), fInterruptedCommandP(NULL) { // save params fLocalDataStoreP=aLocalDataStoreP; fRemoteDataStoreP=aRemoteDataStoreP; // create internal sync element fSyncElementP = SML_NEW(SmlSync_t); // set proto element type to make it auto-disposable fSyncElementP->elementType=SML_PE_SYNC_START; // Cmd ID is now empty (will be set when issued) fSyncElementP->cmdID=NULL; // default to no flags (noResp is set at issue, if at all) fSyncElementP->flags=0; // set source and target fSyncElementP->target=newLocation(fRemoteDataStoreP->getFullName()); // remote is target for Sync command fSyncElementP->source=newLocation(fLocalDataStoreP->getRemoteViewOfLocalURI()); // local is source of Sync command // no optional elements for now fSyncElementP->cred=NULL; // %%% no database level auth yet at all fSyncElementP->meta=NULL; // %%% no search grammar for now // add number of changes for SyncML 1.1 if remote supports it fSyncElementP->noc=NULL; // default to none fRemoteWantsNOC=aSessionP->fRemoteWantsNOC; if (fRemoteWantsNOC) { sInt32 noc = fLocalDataStoreP->getNumberOfChanges(); if (noc>=0) { // we have a valid NOC value, add it fSyncElementP->noc=newPCDataLong(noc); } } // not yet in progress (as not yet issued) fInProgress=false; } // TSyncCommand::TSyncCommand // constructor for receiving Sync Command TSyncCommand::TSyncCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlSyncPtr_t aSyncElementP // associated Sync content element ) : TSmlCommand(scmd_sync,false,aSessionP,aMsgID), fInterruptedCommandP(NULL) { // save sync element fSyncElementP = aSyncElementP; fInProgress=false; // just in case... // no params fLocalDataStoreP=NULL; fRemoteDataStoreP=NULL; } // TSyncCommand::TSyncCommand // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TSyncCommand::handleStatus(TStatusCommand *aStatusCmdP) { // catch those codes that do not abort entire session TSyError statuscode = aStatusCmdP->getStatusCode(); bool handled=false; switch (statuscode) { case 404: // datastore not found case 403: // forbidden case 406: // bad mode case 415: // type(s) not supported case 422: // bad CGI case 510: // datastore error case 512: // sync failed case 514: // cancelled if (fLocalDataStoreP) { // there is a local datastore to abort fLocalDataStoreP->engAbortDataStoreSync(statuscode,false); // remote problem } if (fInProgress) { // make sure sync command is finished now fInProgress=false; // Note that setting fInProgress to false // is only completely safe in issue(). // Here it is allowed as we KNOW that syncCommand // is root level, so session's handleStatus() // will properly clear the fInterruptedCommandP // (this would not work if this command was nested) } handled = true; break; default: handled=TSmlCommand::handleStatus(aStatusCmdP); break; } return handled; } // TSyncCommand::handleStatus // mark any syncitems (or other data) for resume. Called for pending commands // when a Suspend alert is received or whenever a resumable state must be saved void TSyncCommand::markPendingForResume(TLocalEngineDS *aForDatastoreP, bool aUnsent) { // only act if this is for our local datastore and unsent // (sent ones will be in the status wait queue, and will be found there) if (aUnsent && fLocalDataStoreP==aForDatastoreP) { fSessionP->markPendingForResume( fNextMessageCommands, fInterruptedCommandP, fLocalDataStoreP ); } } // TSyncCommand::markPendingForResume // analyze command (but do not yet execute) bool TSyncCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fSyncElementP) { StartProcessing(fSyncElementP->cmdID,fSyncElementP->flags); return true; } else return false; // no proto element, bad command } // TSyncCommand::analyze // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TSyncCommand::execute(void) { TStatusCommand *statusCmdP=NULL; bool queueforlater = false; if (fSyncElementP) SYSYNC_TRY { // determine database to be synced (target LocURI) // - generate default OK status statusCmdP = newStatusCommand(200); // - add source and target refs from item statusCmdP->addSourceRef(smlSrcTargLocURIToCharP(fSyncElementP->source)); statusCmdP->addTargetRef(smlSrcTargLocURIToCharP(fSyncElementP->target)); PDEBUGPRINTFX(DBG_HOT,( "Processing Sync, Source='%s', Target='%s'", smlSrcTargLocURIToCharP(fSyncElementP->source), smlSrcTargLocURIToCharP(fSyncElementP->target) )); // - check for MaxObjSize here SmlMetInfMetInfPtr_t metaP=smlPCDataToMetInfP(fSyncElementP->meta); if (metaP && metaP->maxobjsize) { smlPCDataToLong(metaP->maxobjsize,fSessionP->fMaxOutgoingObjSize); PDEBUGPRINTFX(DBG_REMOTEINFO,("MaxObjSize found in Sync command: %ld",(long)fSessionP->fMaxOutgoingObjSize)); } // - let session do the processing queueforlater=false; fSessionP->processSyncStart( fSyncElementP, *statusCmdP, queueforlater // will be set if command must be queued for later re-execution ); if (queueforlater) { // we don't need the status now delete statusCmdP; } else { // Sync command execution completed, send (or save) status now #ifdef SYNCSTATUS_AT_SYNC_CLOSE // %%% don't send, just save for being sent at fSessionP->fSyncCloseStatusCommandP=statusCmdP; #else // - issue status for item ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); #endif /* %%% no need to abort session, failing sync command stops sync with this datastore anyway // make sure session gets aborted when Sync is not successful if (!ok) { fSessionP->AbortSession(500,true); } */ // free element FreeSmlElement(); } } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // return true if command has fully executed return !queueforlater; } // TSyncCommand::execute // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TSyncCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fSyncElementP) { // generate (first) opening (or evaluate) if (fEvalMode) return generateOpen(); generateOpen(); // generate commands, update fInProgress generateCommandsAndClose(); // Make sure this is not counted as command (will be counted in issuePtr(), so // decrement here). Note that this must be done AFTER calling generateCommandsAndClose(), // because generating needs the correct count (and this is not yet included by now!) fSessionP->fOutgoingCmds--; // we're now one below the real count, but that will be compensated when returning to issuePtr } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL sync")); } // return true if command must be queued for status/result response reception return queueForResponse(); } // TSyncCommand::issue // - test if completely issued (must be called after issue() and continueIssue()) bool TSyncCommand::finished(void) { // not finished as long there are more syncOps to send; // incoming are always finished after executing return (!fInProgress || !fOutgoing); } // TSyncCommand::finished // generate opening bracket bool TSyncCommand::generateOpen(void) { // issue command Start with SyncML toolkit fPrepared=false; // force re-preparing in all cases (as this might be continuing a command) PrepareIssue(&fSyncElementP->cmdID,&fSyncElementP->flags); // (re-)check NumberOfChanges, because in a SyncML client that number might not // have been available right away when constructing the TSyncCommand. if (!fSyncElementP->noc && fRemoteWantsNOC) { sInt32 noc = fLocalDataStoreP->getNumberOfChanges(); if (noc>=0) { fSyncElementP->noc=newPCDataLong(noc); } } if (!fEvalMode) { #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlStartSync(fSessionP->fOutgoingXMLInstance,fSyncElementP); #endif Ret_t err; if ((err=smlStartSync(fSessionP->getSmlWorkspaceID(),fSyncElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlStartSync",err)); } FinalizeIssue(); // show debug PDEBUGBLOCKFMT(("sync","Opened Sync command bracket", "Reopen=%s|SourceURI=%s|TargetURI=%s|IncomingMsgID=%ld|CmdID=%ld", fInProgress ? "yes" : "no", smlSrcTargLocURIToCharP(fSyncElementP->source), smlSrcTargLocURIToCharP(fSyncElementP->target), (long)fMsgID, (long)fCmdID )); PDEBUGPRINTFX(DBG_HOT,( "%sOpened bracket, Source='%s', Target='%s' as (outgoing MsgID=%ld, CmdID=%ld)", fInProgress ? "Re-" : "", smlSrcTargLocURIToCharP(fSyncElementP->source), smlSrcTargLocURIToCharP(fSyncElementP->target), (long)fMsgID, (long)fCmdID )); // calculate (approx) max free space for data fSessionP->fMaxRoomForData = fSessionP->getSmlWorkspaceFreeBytes()-fSessionP->getNotUsableBufferBytes()- // what is free DEFAULTCOMMANDSIZE; // minus a standard command size // now we are in progress fInProgress=true; return true; } else return smlStartSync(fSessionP->getSmlWorkspaceID(),fSyncElementP)==SML_ERR_OK; } // TSyncCommand::generateOpen // generate commands for inside of the bracket void TSyncCommand::generateCommandsAndClose(void) { // generate new commands only if message is not full already if (!fSessionP->outgoingMessageFull()) { // check for unassigned fLocalDataStoreP as this seems to happen sometimes in the cmdline client PPOINTERTEST(fLocalDataStoreP,("Warning: fLocalDataStoreP==NULL, cannot generate commands -> empty command")); if (fLocalDataStoreP) { fInProgress = !( fLocalDataStoreP->engGenerateSyncCommands ( fNextMessageCommands, fInterruptedCommandP ) ); } } // issue command End with SyncML toolkit // - save workspace size immediately before sending to calc message size fBytesbefore=fSessionP->getSmlWorkspaceFreeBytes(); #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlEndSync(fSessionP->fOutgoingXMLInstance); #endif Ret_t err; if ((err=smlEndSync(fSessionP->getSmlWorkspaceID()))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlEndSync",err)); } FinalizeIssue(); PDEBUGPRINTFX(DBG_HOT,( "Closed bracket, %sfinal", fInProgress ? "NOT " : "" )); PDEBUGENDBLOCK("sync"); } // TSyncCommand::generateCommandsAndClose // - continue issuing command. This is called by session at start of new message // when finished() returned false after issue()/continueIssue() // (which causes caller of finished() to put command into fInteruptedCommands queue) // returns true if command should be queued for status (again?) // NOTE: continueIssue must make sure that it gets a new CmdID/MsgID because // the command itself is issued multiple times bool TSyncCommand::continueIssue(bool &aNewIssue) { aNewIssue=false; // never issue anew! if (!fInProgress) return false; // done, don't queue for status again // command is in progress, re-open a bracket in this message // - get new CmdID/MsgID fCmdID = fSessionP->getNextOutgoingCmdID(); fMsgID = fSessionP->getOutgoingMsgID(); // - now issue open generateOpen(); // first try to execute queued sub-commands that could not be sent in last message fSessionP->ContinuePackage( fNextMessageCommands, fInterruptedCommandP ); // then generate more commands if needed (updates fInProgress) generateCommandsAndClose(); // new sync command must be queued for status again return true; } // TSyncCommand::continueIssue void TSyncCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fSyncElementP); } // TResultsCommand::FreeSmlElement TSyncCommand::~TSyncCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TSyncCommand::FreeSmlElement(); // forget any queued sub commands TSmlCommandPContainer::iterator pos; for (pos=fNextMessageCommands.begin(); pos!=fNextMessageCommands.end(); ++pos) { // show that command was not sent DEBUGPRINTFX(DBG_ERROR,("Never sent prepared Sub-Command '%s', (outgoing MsgID=%ld, CmdID=%ld)", (*pos)->getName(), (long)(*pos)->getMsgID(), (long)(*pos)->getCmdID() )); // delete delete *pos; } fNextMessageCommands.clear(); // clear list // - interrupted command // NOTE: interrupted subcommands may NOT exist in any of the main command // queues, because these OWN the commands and will delete them // at ResetSession(). if (fInterruptedCommandP) { // show that command was not sent DEBUGPRINTFX(DBG_ERROR,("Never finished interrupted sub-command '%s', (outgoing MsgID=%ld, CmdID=%ld)", fInterruptedCommandP->getName(), (long)fInterruptedCommandP->getMsgID(), (long)fInterruptedCommandP->getCmdID() )); delete fInterruptedCommandP; fInterruptedCommandP=NULL; } } // TSyncCommand::~TSyncCommand /* end of TSyncCommand implementation */ /* * Implementation of TSyncEndCommand */ // constructor for receiving Sync Command TSyncEndCommand::TSyncEndCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID // the Message ID of the command ) : TSmlCommand(scmd_syncend,false,aSessionP,aMsgID) { // nop so far } // TSyncEndCommand::TSyncEndCommand // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TSyncEndCommand::execute(void) { bool queueforlater=false; // let session do the appropriate processing fSessionP->processSyncEnd(queueforlater); // return true if command has fully executed return !queueforlater; } // TSyncEndCommand::execute TSyncEndCommand::~TSyncEndCommand() { } // TSyncEndCommand::~TSyncEndCommand /* end of TSyncEndCommand implementation */ /* * Implementation of TAlertCommand */ // constructor for sending Alert TAlertCommand::TAlertCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aLocalDataStoreP, // local datastore uInt16 aAlertCode // Alert code to send ) : TSmlCommand(scmd_alert,true,aSessionP) { // save datastore fLocalDataStoreP = aLocalDataStoreP; // save Alert Code fAlertCode = aAlertCode; // create internal alert element fAlertElementP = SML_NEW(SmlAlert_t); // set proto element type to make it auto-disposable fAlertElementP->elementType=SML_PE_ALERT; // Cmd ID is now empty (will be set when issued) fAlertElementP->cmdID=NULL; // default to no flags (noResp is set at issue, if at all) fAlertElementP->flags=0; // data is alert code fAlertElementP->data=newPCDataLong(fAlertCode); // no optional elements for now fAlertElementP->cred=NULL; fAlertElementP->itemList=NULL; } // TAlertCommand::TAlertCommand // constructor for receiving Alert TAlertCommand::TAlertCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlAlertPtr_t aAlertElementP // associated Alert content element ) : TSmlCommand(scmd_alert,false,aSessionP,aMsgID) { // save alert element fAlertElementP = aAlertElementP; // no params fLocalDataStoreP=NULL; } // TAlertCommand::TAlertCommand // analyze command (but do not yet execute) bool TAlertCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fAlertElementP) { StartProcessing(fAlertElementP->cmdID,fAlertElementP->flags); return true; } else return false; // no proto element, bad command } // TAlertCommand::analyze // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TAlertCommand::execute(void) { TStatusCommand *statusCmdP=NULL; TSmlCommand *alertresponsecmdP=NULL; SYSYNC_TRY { // get alert code sInt32 temp; if (!smlPCDataToLong(fAlertElementP->data,temp)) { // non-numeric alert PDEBUGPRINTFX(DBG_ERROR,( "Non-Integer Alert Data: '%s', cannot handle", smlPCDataToCharP(fAlertElementP->data) )); statusCmdP = newStatusCommand(400,"Alert Data not understood"); } else { fAlertCode=temp; PDEBUGPRINTFX(DBG_HOT,( "Code=%hd. %s Cred. Analyzing Items", fAlertCode, fAlertElementP->cred ? "has" : "No" )); // intercept special codes if (fAlertCode==221) { // %%% tdb PDEBUGPRINTFX(DBG_ERROR,("*********** RESULT ALERT 221 received in bad context")); statusCmdP = newStatusCommand(400,"221 Alert in bad context received"); } else if (fAlertCode==222) { // request next message in packet PDEBUGPRINTFX(DBG_HOT,("Next Message in Packet Alert (222): flag sending waiting commands")); // - acknowledge 222 alert statusCmdP = newStatusCommand(200); // - add source and target refs statusCmdP->addTargetRef(fSessionP->getLocalURI()); statusCmdP->addSourceRef(fSessionP->getRemoteURI()); // - issue status for item (but not being sent alone with SyncHdr status) // (treat it like ok-synchdr-status = NOT to be sent if there's no real command following) { TSmlCommand* p=statusCmdP; statusCmdP=NULL; fSessionP->issueRootPtr(p,false,true); } // - signal occurrence of 222 alert to session fSessionP->nextMessageRequest(); } else { // normal alert, walk through items SmlItemListPtr_t nextitemP = fAlertElementP->itemList; while (nextitemP) { if (nextitemP->item) { // - check for MaxObjSize here SmlMetInfMetInfPtr_t metaP=smlPCDataToMetInfP(nextitemP->item->meta); if (metaP && metaP->maxobjsize) { smlPCDataToLong(metaP->maxobjsize,fSessionP->fMaxOutgoingObjSize); PDEBUGPRINTFX(DBG_REMOTEINFO,("MaxObjSize found in Alert command: %ld",(long)fSessionP->fMaxOutgoingObjSize)); } // process alert item with common code // - generate default OK status statusCmdP = newStatusCommand(200); // - add source and target refs from item statusCmdP->addSourceRef(smlSrcTargLocURIToCharP(nextitemP->item->source)); statusCmdP->addTargetRef(smlSrcTargLocURIToCharP(nextitemP->item->target)); PDEBUGPRINTFX(DBG_HOT,( "- Processing Alert Item (code=%hd), Source='%s', Target='%s'", fAlertCode, smlSrcTargLocURIToCharP(nextitemP->item->source), smlSrcTargLocURIToCharP(nextitemP->item->target) )); // - let session process the alert item alertresponsecmdP = fSessionP->processAlertItem( fAlertCode, nextitemP->item, fAlertElementP->cred, *statusCmdP, fLocalDataStoreP // receives involved datastore (Note: if Alert cmd has multiple items, this will finally contain only the datastore of the last item, others might differ) ); // - issue status for item ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); // - issue result (e.g. acknowledge alert) for item, if any if (alertresponsecmdP) { fSessionP->queueForIssueRoot(alertresponsecmdP); } } // next nextitemP=nextitemP->next; } // while } // normal alert code with item } // numeric alert code // free element FreeSmlElement(); } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; if (alertresponsecmdP) delete alertresponsecmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // done with command, delete it now: return true return true; } // TAlertCommand::execute // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TAlertCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fAlertElementP) { // issue command with SyncML toolkit PrepareIssue(&fAlertElementP->cmdID,&fAlertElementP->flags); if (!fEvalMode) { #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlAlertCmd(fSessionP->fOutgoingXMLInstance,fAlertElementP); #endif Ret_t err; if ((err=smlAlertCmd(fSessionP->getSmlWorkspaceID(),fAlertElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlAlertCmd",err)); } FinalizeIssue(); // show debug #ifdef SYDEBUG PDEBUGPRINTFX(DBG_HOT,("Alert Code %s sent", smlPCDataToCharP(fAlertElementP->data) )); // normal alert, walk through items SmlItemListPtr_t nextitemP = fAlertElementP->itemList; while (nextitemP) { if (nextitemP->item) { // show alert item PDEBUGPRINTFX(DBG_HOT,( "- Alert Item: Source='%s', Target='%s'", smlSrcTargLocURIToCharP(nextitemP->item->source), smlSrcTargLocURIToCharP(nextitemP->item->target) )); } // next nextitemP=nextitemP->next; /// @note %%% we should not send more than one item for now! if (nextitemP) DEBUGPRINTFX(DBG_ERROR,("More than one item - handleStatus is not prepared for that!")); } // while #endif // we don't need the status structure any more, free (and NULL ptr) now FreeSmlElement(); } else return smlAlertCmd(fSessionP->getSmlWorkspaceID(),fAlertElementP)==SML_ERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL alert")); } // return true if command must be queued for status/result response reception return queueForResponse(); } // TAlertCommand::issue bool TAlertCommand::statusEssential(void) { // Alert 222 status is not essential return !(fAlertCode==222); } // TAlertCommand::statusEssential // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TAlertCommand::handleStatus(TStatusCommand *aStatusCmdP) { /// @note: This is a simplified implementation which KNOWS that /// we do not send Alerts with more than one item. If we did one /// day, we'd have to extend this implementation. // if this alert command was created by a datastore, let it handle it if (fLocalDataStoreP) { // pass to local datastore if (fLocalDataStoreP->engHandleAlertStatus(aStatusCmdP->getStatusCode())) return true; // datastore handled it } // let SmlCommand handle it return TSmlCommand::handleStatus(aStatusCmdP); } // TAlertCommand::handleStatus // add a String Item to the alert void TAlertCommand::addItemString( const char *aItemString // item string to be added ) { if (fAlertElementP && aItemString) { addItem(newStringDataItem(aItemString)); } } // TAlertCommand::addItemString // add an Item to the alert void TAlertCommand::addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Alert ) { if (fAlertElementP) addItemToList(aItemP,&(fAlertElementP->itemList)); } // TAlertCommand::addItem void TAlertCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fAlertElementP); } // TResultsCommand::FreeSmlElement TAlertCommand::~TAlertCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TAlertCommand::FreeSmlElement(); } // TAlertCommand::~TAlertCommand /* end of TAlertCommand implementation */ /* * Implementation of TUnimplementedCommand */ // constructor for receiving command TUnimplementedCommand::TUnimplementedCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlPcdataPtr_t aCmdID, // command ID (as contents are unknown an cannot be analyzed) Flag_t aFlags, // flags to get fNoResp TSmlCommandTypes aCmdType, // command type (for name) void *aContentP, // associated command content element TSyError aStatusCode // status code to be returned on execution ) : TSmlCommand(aCmdType,false,aSessionP,aMsgID) { // get command ID StrToULong(smlPCDataToCharP(aCmdID),fCmdID); // save noResp fNoResp=(aFlags & SmlNoResp_f)!=0; // forget element smlFreeProtoElement(aContentP); // save status type fStatusCode=aStatusCode; } // TUnimplementedCommand::TUnimplementedCommand // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TUnimplementedCommand::execute(void) { TStatusCommand *statusCmdP=NULL; DEBUGPRINTFX(DBG_HOT,("UNIMPLEMENTED, started dummy processing, (incoming MsgID=%ld, CmdID=%ld)",(long)fMsgID,(long)fCmdID)); SYSYNC_TRY { statusCmdP = newStatusCommand(fStatusCode); statusCmdP->addItemString("Unimplemented Command"); ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // done with command, delete it now: return true return true; } // TUnimplementedCommand::execute /* end of TUnimplementedCommand implementation */ /* * Implementation of TSyncOpCommand */ // constructor for receiving command TSyncOpCommand::TSyncOpCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aDataStoreP, // the local datastore this syncop belongs to uInt32 aMsgID, // the Message ID of the command TSyncOperation aSyncOp, // the Sync operation (sop_xxx) TSmlCommandTypes aCmdType, // the command type (scmd_xxx) SmlGenericCmdPtr_t aSyncOpElementP // associated syncml protocol element ) : TSmlCommand(aCmdType,false,aSessionP,aMsgID) { // save datastore fDataStoreP=aDataStoreP; // save operation type fSyncOp=aSyncOp; // save element fSyncOpElementP = aSyncOpElementP; // no remainder to be sent as next chunk fChunkedItemSize = 0; fIncompleteData = false; // no suspended part of item fStoredSize=0; fUnconfirmedSize=0; fLastChunkSize=0; } // TSyncOpCommand::TSyncOpCommand // constructor for sending command TSyncOpCommand::TSyncOpCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aDataStoreP, // datastore from which command originates TSyncOperation aSyncOp, // sync operation (=command type) SmlPcdataPtr_t aMetaP // meta for entire command (passing owner) ) : TSmlCommand(scmd_unknown,true,aSessionP) { // save datastore fDataStoreP=aDataStoreP; #ifndef USE_SML_EVALUATION // no items yet fItemSizes=0; #endif // no remainder to be sent as next chunk fChunkedItemSize = 0; fIncompleteData = false; // no suspended part of item fStoredSize=0; fUnconfirmedSize=0; fLastChunkSize=0; // command type not yet determined fSyncOp=aSyncOp; // create internal alert element fSyncOpElementP = SML_NEW(SmlGenericCmd_t); // set default to make sure it is disposable (will be adjusted when items are added) fSyncOpElementP->elementType=SML_PE_GENERIC; // Cmd ID is now empty (will be set when issued) fSyncOpElementP->cmdID=NULL; // default to no flags (noResp is set at issue, if at all) fSyncOpElementP->flags=0; // insert meta, if any fSyncOpElementP->meta=aMetaP; // no optional elements for now fSyncOpElementP->cred=NULL; fSyncOpElementP->itemList=NULL; // determine command type switch (fSyncOp) { case sop_wants_add: case sop_add: fSyncOpElementP->elementType=SML_PE_ADD; fCmdType=scmd_add; break; case sop_copy: fSyncOpElementP->elementType=SML_PE_COPY; fCmdType=scmd_copy; break; case sop_move: fSyncOpElementP->elementType=SML_PE_MOVE; fCmdType=scmd_move; break; case sop_wants_replace: case sop_replace: fSyncOpElementP->elementType=SML_PE_REPLACE; fCmdType=scmd_replace; break; case sop_archive_delete: fSyncOpElementP->flags |= SmlArchive_f; goto dodelete; case sop_soft_delete: fSyncOpElementP->flags |= SmlSftDel_f; case sop_delete: dodelete: fSyncOpElementP->elementType=SML_PE_DELETE; fCmdType=scmd_delete; break; default: SYSYNC_THROW(TSyncException("Invalid SyncOp in TSyncOpCommand")); //break; } // switch } // TSyncOpCommand::TSyncOpCommand #ifndef USE_SML_EVALUATION // get (approximated) message size required for sending it uInt32 TSyncOpCommand::messageSize(void) { // default, should be enough for most commands return TSmlCommand::messageSize()+fItemSizes; } #endif // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TSyncOpCommand::handleStatus(TStatusCommand *aStatusCmdP) { // check if this is a split command if (fIncompleteData) { // must be 213 if (aStatusCmdP->getStatusCode()==213) return true; // something wrong, we did not get a 213 PDEBUGPRINTFX(DBG_ERROR,("chunked object received status %hd instead of 213 --> aborting session",aStatusCmdP->getStatusCode())); // reason for aborting is incomplete command (reception) fSessionP->AbortSession(412,true); // local problem } else { // end of non-split SyncOp means that possibly saved // parts of partial outgoing item are now obsolete if (fDataStoreP->fPartialItemState==pi_state_save_outgoing) { fDataStoreP->fPartialItemState=pi_state_none; // not any more PDEBUGPRINTFX(DBG_PROTO+DBG_EXOTIC,("chunked object received final status %hd --> forget partial item data now",aStatusCmdP->getStatusCode())); // - forget stored data in case we have any if (fDataStoreP->fPIStoredDataP) { if (fDataStoreP->fPIStoredDataAllocated) smlLibFree(fDataStoreP->fPIStoredDataP); fDataStoreP->fPIStoredDataP=NULL; fDataStoreP->fPIStoredDataAllocated=false; // not any more } // - clear URIs fDataStoreP->fLastSourceURI.erase(); fDataStoreP->fLastTargetURI.erase(); // - clear other flags fDataStoreP->fLastItemStatus=0; // none left to send fDataStoreP->fPITotalSize=0; fDataStoreP->fPIUnconfirmedSize=0; fDataStoreP->fPIStoredSize=0; } } // let datastore handle this // Note: as fDataStoreP is linked to the generating datastore, this will never be // a superdatastore. engHandleSyncOpStatus() is prepared to convert // superID prefixed localIDs back to subDS's localID bool handled=false; if (fDataStoreP) { handled=fDataStoreP->engHandleSyncOpStatus(aStatusCmdP,this); } if (!handled) { // let base class handle it handled=TSmlCommand::handleStatus(aStatusCmdP); } return handled; } // TSyncOpCommand::handleStatus // mark any syncitems (or other data) for resume. Called for pending commands // when a Suspend alert is received or whenever a resumable state must be saved void TSyncOpCommand::markPendingForResume(TLocalEngineDS *aForDatastoreP, bool aUnsent) { // only act if this is for our local datastore, and only outgoing ones! if (fOutgoing && fDataStoreP==aForDatastoreP && fSyncOpElementP) { // go through all of my items SmlItemListPtr_t itemListP = fSyncOpElementP->itemList; SmlItemPtr_t itemP; while (itemListP) { itemP=itemListP->item; if (itemP) { // call datastore to mark this one for resume fDataStoreP->engMarkItemForResume( smlSrcTargLocURIToCharP(itemP->source), // source for outgoing items is localID smlSrcTargLocURIToCharP(itemP->target), // target for outgoing items is remoteID fIncompleteData ? true : aUnsent // if not completely sent yet, always treat it as unsent! ); } itemListP=itemListP->next; } } } // TSyncOpCommand::markPendingForResume // mark item for resend in next sync session (if possible) void TSyncOpCommand::markForResend(void) { if (fOutgoing && fDataStoreP) { // go through all of my items SmlItemListPtr_t itemListP = fSyncOpElementP->itemList; SmlItemPtr_t itemP; while (itemListP) { itemP=itemListP->item; if (itemP) { // call datastore to mark this one for resume fDataStoreP->engMarkItemForResend( smlSrcTargLocURIToCharP(itemP->source), // source for outgoing items is localID smlSrcTargLocURIToCharP(itemP->target) // target for outgoing items is remoteID ); } itemListP=itemListP->next; } } } // TSyncOpCommand::markForResend // let item update the partial item state for suspend // Note: this may only be called for an item that is actually the partial item void TSyncOpCommand::updatePartialItemState(TLocalEngineDS *aForDatastoreP) { if (!fOutgoing && fDataStoreP==aForDatastoreP && fDataStoreP->dsResumeChunkedSupportedInDB()) { // save info for only partially received item fDataStoreP->fLastItemStatus = 0; // no status sent yet // pass current item data // - get last item data SmlItemListPtr_t itemnodeP=fSyncOpElementP->itemList; while (itemnodeP) { if (!itemnodeP->next) { // this is the last item fDataStoreP->fPartialItemState=pi_state_save_incoming; // - get total expected size fDataStoreP->fPITotalSize=0; SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(itemnodeP->item->meta); if (!metaP || !metaP->size) { // item has no meta or no meta-size, so size must be in meta of command metaP = smlPCDataToMetInfP(fSyncOpElementP->meta); } if (metaP) smlPCDataToULong(metaP->size, fDataStoreP->fPITotalSize); // - get data if (itemnodeP->item && itemnodeP->item->data) { // dispose current contents if these were separately allocated // (otherwise, we can just overwrite the pointer) if (fDataStoreP->fPIStoredDataP && fDataStoreP->fPIStoredDataAllocated) smlLibFree(fDataStoreP->fPIStoredDataP); // datastore does NOT get owner of the data! fDataStoreP->fPIStoredDataAllocated=false; // we still own that data, session must NOT try to dispose! fDataStoreP->fPIStoredSize=itemnodeP->item->data->length; fDataStoreP->fPIStoredDataP=itemnodeP->item->data->content; } // - get amount of stored data that is unconfirmed // (=the size of the most recently received chunk. This is unconfirmed // until the next chunk arrives, because we don't know before that if the // status 213 has reached the sender) fDataStoreP->fPIUnconfirmedSize=fLastChunkSize; // summarize PDEBUGPRINTFX(DBG_ADMIN,( "State of partially received item: total size=%ld, received=%ld, unconfirmed=%ld", (long)fDataStoreP->fPITotalSize, (long)fDataStoreP->fPIStoredSize, (long)fDataStoreP->fPIUnconfirmedSize )); // done break; } itemnodeP=itemnodeP->next; } // while } } // TSyncOpCommand::updatePartialItemState // get source (localID) of sent command cAppCharP TSyncOpCommand::getSourceLocalID(void) { if (!fSyncOpElementP) return NULL; if (!fSyncOpElementP->itemList) return NULL; if (!fSyncOpElementP->itemList->item) return NULL; return smlSrcTargLocURIToCharP(fSyncOpElementP->itemList->item->source); } // TSyncOpCommand::getSourceLocalID // get target (remoteID) of sent command cAppCharP TSyncOpCommand::getTargetRemoteID(void) { if (!fSyncOpElementP) return NULL; if (!fSyncOpElementP->itemList) return NULL; if (!fSyncOpElementP->itemList->item) return NULL; return smlSrcTargLocURIToCharP(fSyncOpElementP->itemList->item->target); } // TSyncOpCommand::getTargetRemoteID // add an Item to the sync op command void TSyncOpCommand::addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to SyncOp command ) { // add item if (fSyncOpElementP) { addItemToList(aItemP,&(fSyncOpElementP->itemList)); #ifndef USE_SML_EVALUATION fItemSizes += ITEMOVERHEADSIZE + strlen(smlSrcTargLocURIToCharP(aItemP->target)) + strlen(smlSrcTargLocNameToCharP(aItemP->target)) + strlen(smlSrcTargLocURIToCharP(aItemP->source)) + strlen(smlSrcTargLocNameToCharP(aItemP->source)); SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(aItemP->meta); if (metaP) fItemSizes+=strlen(smlPCDataToCharP(metaP->type)); if (aItemP->data) fItemSizes+=aItemP->data->length; #endif } } // TSyncOpCommand::addItem // helper: add dataPos EMI to meta static void addDataPos(SmlMetInfMetInfPtr_t aMetaP, uInt32 aDataPos) { // - find end of emi list or existing datapos SmlPcdataListPtr_t *emiPP = &(aMetaP->emi); /* version that searches for existing datapos and will replace it while (*emiPP!=NULL) { if (strucmp(smlPCDataToCharP((*emiPP)->data),"datapos=",8)==0) { // found existing datapos break; } emiPP = &((*emiPP)->next); } if (*emiPP==NULL) { // - add new EMI *emiPP=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t)); (*emiPP)->next=NULL; } else { // - replace existing smlFreePcdata((*emiPP)->data); } */ while (*emiPP!=NULL) emiPP = &((*emiPP)->next); // - add new EMI list element *emiPP=(SmlPcdataListPtr_t)smlLibMalloc(sizeof(SmlPcdataList_t)); (*emiPP)->next=NULL; // - set new data string s; StringObjPrintf(s,"datapos=%ld",(long)aDataPos); (*emiPP)->data = newPCDataString(s.c_str(),s.size()); } // addDataPos void TSyncOpCommand::saveAsPartialItem(SmlItemPtr_t aItemP) { // - forget stored data in case we have any if (fDataStoreP->fPIStoredDataP) { if (fDataStoreP->fPIStoredDataAllocated) smlLibFree(fDataStoreP->fPIStoredDataP); fDataStoreP->fPIStoredDataP=NULL; fDataStoreP->fPIStoredDataAllocated=false; // not any more } // save only when we can actually store chunk resume data if (fDataStoreP->dsResumeChunkedSupportedInDB()) { // - save URIs fDataStoreP->fLastSourceURI=smlSrcTargLocURIToCharP(aItemP->source); fDataStoreP->fLastTargetURI=smlSrcTargLocURIToCharP(aItemP->target); // - copy current item's data now (before the split!) fDataStoreP->fPIStoredDataAllocated=true; // separately allocated buffer, not connected with item any more fDataStoreP->fPIStoredSize=aItemP->data->length; // length of unsplitted item's buffer fDataStoreP->fPIStoredDataP=smlLibMalloc(aItemP->data->length); smlLibMemcpy((uInt8 *)fDataStoreP->fPIStoredDataP,aItemP->data->content,aItemP->data->length); // - set other flags fDataStoreP->fLastItemStatus=0; // none left to send fDataStoreP->fPartialItemState=pi_state_save_outgoing; fDataStoreP->fPITotalSize=fChunkedItemSize; fDataStoreP->fPIUnconfirmedSize=fDataStoreP->fPIStoredSize; // just a copy } } // TSyncOpCommand::saveAsPartialItem // - possibly substitute data with previous session's buffered left-overs from a chunked transfer // for resuming a chunked item transfer. bool TSyncOpCommand::checkChunkContinuation(void) { if (fChunkedItemSize==0 && fDataStoreP && fDataStoreP->fPartialItemState==pi_state_loaded_outgoing) { // this is a so far unchunked item, and there is // to-be-resent data from the previously suspended session // - check if the command contains the partially sent item SmlItemListPtr_t itemListP = fSyncOpElementP->itemList; while (itemListP) { if ( itemListP->item && strcmp(smlSrcTargLocURIToCharP(itemListP->item->source),fDataStoreP->fLastSourceURI.c_str())==0 && strcmp(smlSrcTargLocURIToCharP(itemListP->item->target),fDataStoreP->fLastTargetURI.c_str())==0 ) { // detected to-be-continued chunked item PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Resuming sending chunked item Source='%s', Target='%s' -> replacing data with rest from suspended session", fDataStoreP->fLastSourceURI.c_str(), fDataStoreP->fLastTargetURI.c_str() )); // Do not send meta size on all but first chunk SmlMetInfMetInfPtr_t metinfP = itemListP->item->meta ? (SmlMetInfMetInfPtr_t)(itemListP->item->meta->content) : NULL; if (metinfP && metinfP->size) { smlFreePcdata(metinfP->size); metinfP->size=NULL; } // But make sure item knows the original total size (prevents splitCommand to add meta size again) fChunkedItemSize = fDataStoreP->fPITotalSize; // now add dataPos as : fPITotalSize-fPIStoredSize // - make sure we have meta if (!metinfP) { itemListP->item->meta=newMeta(); metinfP=(SmlMetInfMetInfPtr_t)(itemListP->item->meta->content); } // - add it (total - what remains to be sent) addDataPos(metinfP,fDataStoreP->fPITotalSize-fDataStoreP->fPIStoredSize); // update buffered data info if (itemListP->item->data) { // substitute original data with buffered rest of data from last session // (so in case the item has changed in the local DB, we'll still send the original data of // which the receiver already has seen a part) PDEBUGPRINTFX(DBG_PROTO+DBG_DETAILS,( "original data size of item=%ld, total size at time of suspend=%ld, rest being sent now=%ld", (long)itemListP->item->data->length, // current total size (long)fDataStoreP->fPITotalSize, // total size at time of suspend (long)fDataStoreP->fPIStoredSize // what we will send now )); // dispose current data smlLibFree(itemListP->item->data->content); // set new data from last session itemListP->item->data->length=fDataStoreP->fPIStoredSize; itemListP->item->data->content=fDataStoreP->fPIStoredDataP; // data is now owned by item fDataStoreP->fPIStoredDataP=NULL; fDataStoreP->fPIStoredSize=0; fDataStoreP->fPIStoredDataAllocated=false; } else { PDEBUGPRINTFX(DBG_ERROR,("WARNING: internal error: to-be-resumed item contains no data?")); } fDataStoreP->fPartialItemState=pi_state_none; // consumed now fDataStoreP->fPITotalSize=0; fDataStoreP->fPIUnconfirmedSize=0; // substitution of item data done // (don't check other items - we have ONE item only, anyway in the current implementation) return true; } // next item itemListP=itemListP->next; } } // no chunk continuation return false; } // TSyncOpCommand::checkChunkContinuation // check if split is possible at all bool TSyncOpCommand::canSplit(void) { // Sync Op commands can be split when remote supports mechanism return fSessionP->fRemoteSupportsLargeObjects; } // - try to split (e.g. by SyncML 1.1 moredata mechanism) command by reducing // original command by at least aReduceByBytes and generating a second // command containing the rest of the data // Returns NULL if split is not possible or not worth trying in the current situation // (e.g.: only ridiculously small part would remain) TSmlCommand *TSyncOpCommand::splitCommand(sInt32 aReduceByBytes) { SmlItemListPtr_t *itemListPP; TSyncOpCommand *remainingDataCmdP=NULL; // nothing remaining so far SmlItemListPtr_t remainingItems=NULL; // check other conditions if (!fSyncOpElementP) return NULL; // now find where we should split do { // start of list itemListPP = &(fSyncOpElementP->itemList); // check if any items if (*itemListPP==NULL) break; // no more items // find last item while ((*itemListPP)->next) itemListPP = &((*itemListPP)->next); // get it's data SmlItemPtr_t itemP = (*itemListPP)->item; SmlPcdataPtr_t dataP = itemP->data; // check if we should split this item if ( canSplit() && // remote can handle large objects (that is: chunked transfers) dataP && // there is data dataP->contentType!=SML_PCDATA_EXTENSION && // it's not an extension dataP->length > (MemSize_t)aReduceByBytes+MIN_SPLIT_DATA // remaining length of first part is large enough to make splitting worth doing now ) { // split within this item // Prepare original item // - make sure we have meta if (!itemP->meta) itemP->meta = newMeta(); // create meta as we haven't got one yet SmlMetInfMetInfPtr_t metinfP = (SmlMetInfMetInfPtr_t)(itemP->meta->content); // - set size if this is the first chunk if (metinfP->size) smlFreePcdata(metinfP->size); if (fChunkedItemSize==0) { // first chunk // - set dataPos to 0 addDataPos(metinfP,0); // Note: we don't need to buffer when sending the first chunk. // If we get suspended before the second chunk is being generated, the item will // start over from beginning anyway (and we can use data from the DB). fChunkedItemSize=dataP->length; metinfP->size=newPCDataLong(fChunkedItemSize); PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Item data too big (%ld) - must be chunked using , %ld bytes to be sent later", (long)fChunkedItemSize, (long)aReduceByBytes )); #ifdef SYDEBUG // %%% should not happen, but I'm not sure it really won't if (fDataStoreP->fPartialItemState==pi_state_loaded_outgoing) { PDEBUGPRINTFX(DBG_ERROR,("WARNING - internal error: Splitting new item apparently before previous session's item has been resent")); } #endif } else { // this item is NOT the first chunk -> save stuff we need to PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Remaining data still too big (%ld/%ld) - must be chunked again, %ld bytes to be sent later", (long)dataP->length, (long)fChunkedItemSize, (long)aReduceByBytes )); // Note: in this case, the item already has a dataPos - no need to add one here! // Resume the item in the middle rather than resending it in full. // IMPORTANT: It is essential not to store the fLastSourceURI/fLastTargetURI // on the first chunk, as it then probably still contains info from // the previous session. saveAsPartialItem(itemP); } // - set itemP->flags |= SmlMoreData_f; // - create new data for original item (original data is in dataP) itemP->data = newPCDataStringX( (uInt8 *)dataP->content, // original data dataP->contentType==SML_PCDATA_OPAQUE, // opaque if original was opaque dataP->length-aReduceByBytes // reduced length ); // Create additional item for next message // - new item SmlItemPtr_t nextItemP = newItem(); // - with meta nextItemP->meta = newMeta(); SmlMetInfMetInfPtr_t nextMetinfP = (SmlMetInfMetInfPtr_t)(nextItemP->meta->content); // - SyncML 1.1.1: The element MUST only be specified in the first chunk of the item. nextMetinfP->size=NULL; // no size in remaining items // - copy other meta if (metinfP->maxobjsize) nextMetinfP->format=newPCDataString(smlPCDataToCharP(metinfP->maxobjsize)); // We NEED this one of ZIPPED_BINDATA_SUPPORT! if (metinfP->format) nextMetinfP->format=newPCDataString(smlPCDataToCharP(metinfP->format)); if (metinfP->type) nextMetinfP->type=newPCDataString(smlPCDataToCharP(metinfP->type)); if (metinfP->mark) nextMetinfP->mark=newPCDataString(smlPCDataToCharP(metinfP->mark)); //%%% if we ever decide to carry over EMI here, make sure we don't copy dataPos=x, as // addDataPos() code relies on no dataPos being present when called. //if (metinfP->emi) nextMetinfP->emi=newPCDataString(smlPCDataToCharP(metinfP->emi)); // %%% not needed yet if (metinfP->version) nextMetinfP->version=newPCDataString(smlPCDataToCharP(metinfP->version)); // - copy source and target nextItemP->target=newOptLocation(smlSrcTargLocURIToCharP(itemP->target),smlSrcTargLocNameToCharP(itemP->target)); nextItemP->source=newOptLocation(smlSrcTargLocURIToCharP(itemP->source),smlSrcTargLocNameToCharP(itemP->source)); // - copy flags except nextItemP->flags = itemP->flags & ~SmlMoreData_f; // - now copy rest of data nextItemP->data = newPCDataStringX( (uInt8 *)dataP->content + dataP->length-aReduceByBytes, // original data minus what we have in original item dataP->contentType==SML_PCDATA_OPAQUE, // opaque if original was opaque aReduceByBytes // reduced length = remaining bytes ); // - original data can now be disposed smlFreePcdata(dataP); // Add correct data position to the next item now. addDataPos(nextMetinfP,fChunkedItemSize-aReduceByBytes); // Now insert new item containing remaining data to beginning of list for next chunk SmlItemListPtr_t ilP = SML_NEW(SmlItemList_t); ilP->next=remainingItems; ilP->item=nextItemP; remainingItems=ilP; // count reduction aReduceByBytes=0; // done break; } else { // Split between items fChunkedItemSize=0; // no chunking in progress now // - get last itemlist element SmlItemListPtr_t ilP = *itemListPP; // - cut it out of original list *itemListPP=NULL; // - put it at the BEGINNING of the remaining items list ilP->next=remainingItems; remainingItems=ilP; // - count reduction aReduceByBytes -= dataP ? dataP->length : 0; // loop to check second-last item } // repeat as long as reduction goal is not met } while (aReduceByBytes>0); // check if any items left in original command if (fSyncOpElementP->itemList == NULL) { // none left in original list, can't split // - put back remaining list to original item fSyncOpElementP->itemList = remainingItems; // - cannot split return NULL; } // now create new command containing the remaining items if (remainingItems) { if (aReduceByBytes<=0) { // duplicate meta SmlPcdataPtr_t splitMetaP = copyMeta(fSyncOpElementP->meta); // make new command remainingDataCmdP = new TSyncOpCommand( fSessionP, // associated session (for callbacks) fDataStoreP, // datastore from which command originates fSyncOp, // sync operation (=command type) splitMetaP // meta for entire command (passing owner) ); // now pass remaining items to new command remainingDataCmdP->fSyncOpElementP->itemList = remainingItems; // next command must know that it part of a chunked transfer remainingDataCmdP->fChunkedItemSize = fChunkedItemSize; // original command must know that it must expect a 213 status fIncompleteData = true; } else { // remaining items not used, delete them smlFreeItemList(remainingItems); } } // return split-off command return remainingDataCmdP; } // TSyncOpCommand::splitCommand // - test if completely issued (must be called after issue() and continueIssue()) bool TSyncOpCommand::finished(void) { return (fOutgoing) || // outgoing commands are always finished (new split mechanism actually splits the command in two separate commands) (!fOutgoing && fSessionP->fIncompleteDataCommandP!=this); // not part of an incoming chunked data transfer } // TSyncOpCommand::finished // analyze command (but do not yet execute) bool TSyncOpCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fSyncOpElementP) { StartProcessing(fSyncOpElementP->cmdID,fSyncOpElementP->flags); return true; } else return false; // no proto element, bad command } // TSyncOpCommand::analyze // Adds data chunk from specified command to this (incomplete) command // includes checking if sync op and item source/target match and // checks for size match #define MISSING_END_OF_CHUNK_ERROR 223 // End of Data for chunked object not received localstatus TSyncOpCommand::AddNextChunk(SmlItemPtr_t aNextChunkItem, TSyncOpCommand *aCmdP) { SmlItemListPtr_t incompletenode; SmlItemPtr_t incompleteitem; SmlPcdataPtr_t newdata; localstatus sta; // find last item in this command incompletenode = fSyncOpElementP->itemList; if (!incompletenode) return 412; // incomplete command while (incompletenode && incompletenode->next) incompletenode=incompletenode->next; incompleteitem = incompletenode->item; // check for data integrity if (!incompleteitem) return 412; if (!incompleteitem->data) return 412; if (!aNextChunkItem) return 412; if (!aNextChunkItem->data) return 412; // check for item compatibility // - commands must have same sync op if (getSyncOp() != aCmdP->getSyncOp()) goto missingeoc; // not a status - will be converted to alert // - must have same source and target URI if ( strcmp(smlSrcTargLocURIToCharP(incompleteitem->source),smlSrcTargLocURIToCharP(aNextChunkItem->source))!=0 || strcmp(smlSrcTargLocURIToCharP(incompleteitem->target),smlSrcTargLocURIToCharP(aNextChunkItem->target))!=0 ) goto missingeoc; // not a status - will be converted to alert // - must have same PCData type and not extension if ( incompleteitem->data->contentType != aNextChunkItem->data->contentType || aNextChunkItem->data->contentType == SML_PCDATA_EXTENSION ) return 400; // originator error, bad request // append data from next chunk to incomplete item newdata = SML_NEW(SmlPcdata_t); // - same content type as previous data had newdata->contentType = incompleteitem->data->contentType; newdata->contentType = incompleteitem->data->contentType; // - set new size newdata->length = incompleteitem->data->length + aNextChunkItem->data->length; // - remember size of chunk we're adding now in the incomplete command aCmdP->fLastChunkSize = aNextChunkItem->data->length; // - allocate new data for updated item (including an extra NUL terminator) newdata->content=smlLibMalloc(newdata->length+1); if (newdata->content==NULL) return 413; // request entity too large // - copy existing content smlLibMemcpy(newdata->content,incompleteitem->data->content,incompleteitem->data->length); // - add new chunk smlLibMemcpy((uInt8 *)newdata->content+incompleteitem->data->length,aNextChunkItem->data->content,aNextChunkItem->data->length); // - set the NUL terminator in case item is parsed as C string *(((uInt8 *)newdata->content)+newdata->length)=0; // - free old data in item smlFreePcdata(incompleteitem->data); // - insert updated data incompleteitem->data = newdata; // Now check if we are complete if ((aNextChunkItem->flags & SmlMoreData_f) == 0) { // end of chunk, verify size // - get total size from meta (of original item) SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(incompleteitem->meta); if (!metaP || !metaP->size) { // item has no meta or no meta-size, so size must be in meta of command metaP = smlPCDataToMetInfP(fSyncOpElementP->meta); if (!metaP) { PDEBUGPRINTFX(DBG_ERROR,("Chunked item has no meta -> no size found")); return 424; // no meta: Size mismatch } } sInt32 expectedSize; if (!smlPCDataToLong(metaP->size, expectedSize)) { PDEBUGPRINTFX(DBG_ERROR,("Chunked item had no or invalid meta in first chunk")); return 424; // bad size string: size mismatch } // - check for size match if (incompleteitem->data->length != (MemSize_t)expectedSize) { // check if size mismatch could be due to duplicate transmit of unconfirmed data if (fUnconfirmedSize == uInt32(incompleteitem->data->length - expectedSize)) { // size mismatch is exactly what could be caused by duplicate transmit PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Detected duplicate chunk in reassembled item due to resume without dataPos (%ld bytes at %ld) -> adjusting", (long)fUnconfirmedSize, (long)fStoredSize-fUnconfirmedSize )); // - cut out duplicate smlLibMemmove( ((uInt8 *)incompleteitem->data->content+fStoredSize-fUnconfirmedSize), // to end of confirmed data ((uInt8 *)incompleteitem->data->content+fStoredSize), // from end of stored data incompleteitem->data->length-fStoredSize // everything between end of stored data and end of item ); incompleteitem->data->length = expectedSize; // adjust length *((uInt8 *)incompleteitem->data->content+expectedSize)=0; // add new safety terminator fUnconfirmedSize=0; // no data unconfirmed any more } else { PDEBUGPRINTFX(DBG_ERROR,( "Chunked item has wrong size (%ld, expected=%ld) after reassembly", (long)incompleteitem->data->length, (long)expectedSize )); return 424; // size mismatch } } // successfully reassembled sta=0; } else { // not yet completely reassembled sta=213; } // get MsgID and CmdID from added chunk's commnd fCmdID = aCmdP->getCmdID(); fMsgID = aCmdP->getMsgID(); // copy actual cmdID tag (to make sure we don't get the wrong CmdID when re-processing the command later) smlFreePcdata(fSyncOpElementP->cmdID); // ged rid of current ID fSyncOpElementP->cmdID = smlPcdataDup(aCmdP->fSyncOpElementP->cmdID); // copy ID from last added chunk // return status code return sta; missingeoc: // missing end of chunk TAlertCommand *alertCmdP = new TAlertCommand(fSessionP, NULL, (uInt16)223); SmlItemPtr_t alertItemP = newItem(); alertItemP->target=newOptLocation(smlSrcTargLocURIToCharP(incompleteitem->source)); alertItemP->source=newOptLocation(smlSrcTargLocURIToCharP(incompleteitem->target)); alertCmdP->addItem(alertItemP); // issue the alert fSessionP->issueRootPtr(alertCmdP); // signal failure of reassembling chunked item return MISSING_END_OF_CHUNK_ERROR; } // TSyncOpCommand::AddNextChunk // SyncOp commands can execute out of order except when they // contain chunked items, because then we would have to issue // a 213 Status immediately, which would violate the ordering // of Status replies. bool TSyncOpCommand::canExecuteOutOfOrder() { SmlItemListPtr_t *itemnodePP=&(fSyncOpElementP->itemList); while (*itemnodePP) { SmlItemListPtr_t thisitemnode = *itemnodePP; if (thisitemnode->item && thisitemnode->item->flags & SmlMoreData_f) { return false; } itemnodePP = &(thisitemnode->next); } return true; } // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TSyncOpCommand::execute(void) { TStatusCommand *statusCmdP=NULL; SmlItemListPtr_t *itemnodePP, thisitemnode; localstatus sta; TSyncOpCommand *incompleteCmdP; bool queueforlater,processitem; bool nostatus; SmlItemListPtr_t tobequeueditems=NULL; SYSYNC_TRY { // get datastore pointer if we do not have one yet if (fDataStoreP==NULL) { // in case we did not get the pointer at creation - that is, when the enclosing // was delayed - we must now get datastore as set by the current command fDataStoreP = fSessionP->fLocalSyncDatastoreP; if (fDataStoreP==NULL) { statusCmdP=newStatusCommand(404); // no datastore, we can't process items for it ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); return true; // command executed } } // get command meta if any SmlMetInfMetInfPtr_t cmdmetaP=smlPCDataToMetInfP(fSyncOpElementP->meta); // process items DEBUGPRINTFX(DBG_HOT,("command started processing")); itemnodePP=&(fSyncOpElementP->itemList); while (*itemnodePP) { queueforlater=false; // do no queue by default processitem=true; // process by default nostatus=false; // set to true if someone else is responsible for updating fLastItemStatus thisitemnode = *itemnodePP; // no result nor status so far statusCmdP=NULL; // check for NULL item if (!thisitemnode->item) { PDEBUGPRINTFX(DBG_ERROR,("command with NULL item")); statusCmdP=newStatusCommand(400); // protocol error ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); return true; // command executed } // check if we are resuming a partially transmitted item (but MUST have data) if ( fSessionP->fIncompleteDataCommandP==NULL && thisitemnode->item->data && // item must have data fDataStoreP->fPartialItemState==pi_state_loaded_incoming && strcmp(smlSrcTargLocURIToCharP(thisitemnode->item->source),fDataStoreP->fLastSourceURI.c_str())==0 && strcmp(smlSrcTargLocURIToCharP(thisitemnode->item->target),fDataStoreP->fLastTargetURI.c_str())==0 ) { // this is the last item sent in the previously suspended session if (fDataStoreP->fPIStoredSize==0) { // No item was left only partially received from the suspended session. // But we must handle the special case where the final status of the last item sent // in the suspended session did not reach the recipient, so we now see the last chunk again. // In this case, simply re-issue the status and ignore the contents if (fDataStoreP->fLastItemStatus) { // item already processed, just repeat sending the status PDEBUGPRINTFX(DBG_PROTO,("Received last chunk for already processed item -> just resending status %hd",fDataStoreP->fLastItemStatus)); statusCmdP = newStatusCommand(fDataStoreP->fLastItemStatus); processitem=false; // do not further process the item, just status fDataStoreP->fPartialItemState=pi_state_none; // chunked transfer from last session finally done } } else { // we have a partially received item left from the suspended session // continue it PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Resuming receiving chunked item Source='%s', Target='%s'", fDataStoreP->fLastSourceURI.c_str(), fDataStoreP->fLastTargetURI.c_str() )); // simulate a meta size from suspended session's saved item size // - create meta if none there if (!thisitemnode->item->meta) thisitemnode->item->meta = newMeta(); // - now check/generate meta size SmlMetInfMetInfPtr_t metinfP = (SmlMetInfMetInfPtr_t)(thisitemnode->item->meta->content); if (metinfP->size) { #ifdef __MWERKS__ #warning "%%% maybe use presence of meta size to know that this is NOT resuming, that is as an implicit dataPos=0" #endif /* if I understand correctly, size MUST NOT be present on any but the first chunk. If that's correct, we could discard the saved partial item from a previous session in case we see a size (because this would mean the item is retransmitted as a whole and sender does not support resuming a partial item */ // item has meta size, check if correct uInt32 thissize; if ( !smlPCDataToULong(metinfP->size, thissize) || thissize!=fDataStoreP->fPITotalSize ) { PDEBUGPRINTFX(DBG_ERROR,( "Resumed item size does not match (expected=%ld, found=%ld)", (long)fDataStoreP->fPITotalSize, (long)thissize )); statusCmdP = newStatusCommand(424); processitem=false; // do not further process the item } } else { // item has no meta size, create it now metinfP->size=newPCDataLong(fDataStoreP->fPITotalSize); } SmlPcdataPtr_t newdata=NULL; uInt32 dataPos=0; if (processitem) { // save sizes confirmed/unconfirmed data in this command object // (for possible reassembly adjustment when command is complete) fUnconfirmedSize=fDataStoreP->fPIUnconfirmedSize; fStoredSize=fDataStoreP->fPIStoredSize; // Determine Data position // - check if we have it in EMI (Synthesis-Oracle enhancement) // datapos=NUM SmlPcdataListPtr_t emiP = metinfP->emi; // start with item meta EMI bool foundDataPos=false; for (uInt16 i=0; i<2; i++) { while (emiP) { if (emiP->data) { const char *p = smlPCDataToCharP(emiP->data); if (strucmp(p,"datapos=",8)==0) { // correct lead-in, get number now if (StrToULong(p+8,dataPos)>0) { PDEBUGPRINTFX(DBG_PROTO+DBG_DETAILS,("found datapos=%ld",(long)dataPos)); foundDataPos=true; // found dataPos break; } else { PDEBUGPRINTFX(DBG_ERROR,("invalid number in datapos, ignoring it")); } } } // check next emiP=emiP->next; } // done if found if (foundDataPos) break; // try with cmd meta if (!cmdmetaP) break; // we don't have a command meta, no point to search emiP = cmdmetaP->emi; // cmd meta EMI } if (foundDataPos) { // we have a dataPos value // - no unconfirmed size any more for this item (but we still need the datastore-level vars // below to do the copying fUnconfirmedSize=0; // - confirmed size is the data position now fStoredSize=dataPos; } else { // without known dataPos, we assume all received data confirmed for now // and will adjust at end of item if needed dataPos = fDataStoreP->fPIStoredSize; } // - check integrity if (dataPos>fDataStoreP->fPIStoredSize) { PDEBUGPRINTFX(DBG_ERROR,( "Data position invalid (max allowed=%ld, found=%ld)", (long)fDataStoreP->fPIStoredSize, (long)dataPos )); statusCmdP = newStatusCommand(412); processitem=false; // do not further process the item } if (processitem) { // - combine new and old data newdata = SML_NEW(SmlPcdata_t); // - same content type newdata->contentType = thisitemnode->item->data->contentType; // - set new size newdata->length = dataPos + thisitemnode->item->data->length; // - allocate new data for updated item (including an extra NUL terminator) newdata->content=smlLibMalloc(newdata->length+1); if (newdata->content==NULL) { statusCmdP = newStatusCommand(413); processitem=false; // do not further process the item } } } if (processitem) { // copy already received content up to dataPos smlLibMemcpy(newdata->content,fDataStoreP->fPIStoredDataP,dataPos); // forget data stored at DS level fDataStoreP->fPIStoredSize=0; if (fDataStoreP->fPIStoredDataP) { // only free if not owned by an item if (fDataStoreP->fPIStoredDataAllocated) smlLibFree(fDataStoreP->fPIStoredDataP); } fDataStoreP->fPIStoredDataP=NULL; // append content just received in this item smlLibMemcpy((uInt8 *)newdata->content+dataPos,thisitemnode->item->data->content,thisitemnode->item->data->length); // - set the NUL terminator in case item is parsed as C string *(((uInt8 *)newdata->content)+newdata->length)=0; // - free old data in item smlFreePcdata(thisitemnode->item->data); // - insert new data thisitemnode->item->data = newdata; } /* No, we need to keep pi_state_loaded_incoming until we get // Finished processing left-overs from last session fDataStoreP->fPartialItemState=pi_state_none; */ // Now we can treat this as if it was the first (or only) chunk of a non-resumed item } // if we have partial data received in last session } // if item is the same as last item in suspended session if (processitem) { processitem=false; // only process further if we detect complete data // check if this item is complete (not chunked by ) if (thisitemnode->item->flags & SmlMoreData_f) { // no, it's only a chunk if (thisitemnode->item->data==NULL) { PDEBUGPRINTFX(DBG_ERROR,("Chunked item has no ")); statusCmdP->setStatusCode(412); // do not further process the command, issue status and exit ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); return true; // processed (with error) } // - return appropriate status statusCmdP = newStatusCommand(213); // chunked item accepted and buffered // - no items may follow the chunked one if (thisitemnode->next) { PDEBUGPRINTFX(DBG_ERROR,("Chunked item had additional items after the chunked one")); statusCmdP->setStatusCode(400); // do not further process the command, issue status and exit ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); return true; // processed (with error) } if (fSessionP->fIncompleteDataCommandP==NULL) { // This is the first chunk, save this as the original command (as it contains all meta) fSessionP->fIncompleteDataCommandP = this; // make sure that already executed items will not get saved *itemnodePP=NULL; // disconnect not-yet-executed items from executed ones smlFreeItemList(fSyncOpElementP->itemList); // free executed items fSyncOpElementP->itemList = thisitemnode; // put not-yet-executed, partial item into command // make sure moredata flag is not set on reassembled item thisitemnode->item->flags &= ~SmlMoreData_f; // save size of the chunk fLastChunkSize=thisitemnode->item->data->length; } else { // this is a chunk in the middle, combine its data // with the already buffered incomplete command // and update MsgID/CmdID. If source and target do not match, // statusCmdP will set to appropriate error code sta=fSessionP->fIncompleteDataCommandP->AddNextChunk(thisitemnode->item,this); if (sta) statusCmdP->setStatusCode(sta); // set error if any } PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,(" set: Chunk (%ld bytes) received (plus possible carry over from suspend) and buffered",(long)fLastChunkSize)); } else { // Complete item or end of chunked item processitem=true; incompleteCmdP = fSessionP->fIncompleteDataCommandP; if (incompleteCmdP) { // end of chunked item, add final chunk and check for errors sta=incompleteCmdP->AddNextChunk(thisitemnode->item,this); if (sta==MISSING_END_OF_CHUNK_ERROR) { // command should have been end of chunked data, but wasn't. // Alert 223 is already issued. // - dispose of failed incomplete command delete incompleteCmdP; fSessionP->fIncompleteDataCommandP=NULL; // - process item as new command } else if (sta==0) { // successfully reassembled command, execute it now PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("Last Chunk received (%ld bytes), item is reassembled",(long)fLastChunkSize)); // - first remove global link to it to avoid recursion fSessionP->fIncompleteDataCommandP=NULL; // - execute now (and pass ownership) // issues appropriate statuses, so we don't need to deal with it; // in fact, we must not touch fLastItemStatus because we don't // know the status nostatus=true; fSessionP->process(incompleteCmdP); // - this item is processed now, continue in loop if there are more items processitem=false; // do not process the item normally // Note: statusCmdP is NULL here, so no extra status will be issued for the // item (process() should have already caused appropriate statuses to // be generated. } else { // some error with this item, generate status statusCmdP = newStatusCommand(sta); PDEBUGPRINTFX(DBG_ERROR,("Adding next chunk to item failed with status=%hd",sta)); // - dispose of failed incomplete command delete incompleteCmdP; fSessionP->fIncompleteDataCommandP=NULL; // do not process anything any further processitem=false; // do not process the item normally fDataStoreP->fLocalItemsError++; // count this as an error } } else { // save size of the chunk (if item has ANY data at all) fLastChunkSize=thisitemnode->item->data ? thisitemnode->item->data->length : 0; } if (processitem) { // - get remote and local IDs of item const char *remoteID=smlSrcTargLocURIToCharP(thisitemnode->item->source); const char *localID=smlSrcTargLocURIToCharP(thisitemnode->item->target); // prepare OK status for item statusCmdP = newStatusCommand(200); // let session process the item PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Item (syncop: %s) started processing, remoteID='%s', localID='%s'", SyncOpNames[(sInt16)fSyncOp], remoteID, localID )); queueforlater=false; if (fSessionP->processSyncOpItem( fSyncOp, // the operation thisitemnode->item, // the item to be processed cmdmetaP, // command-wide meta, if any fDataStoreP, // related datastore pointer *statusCmdP, // pre-set 200 status, can be modified in case of errors queueforlater // set if processing of item must be done later )) { // fully ok (no internal change of requested operations or // silent acceptance of deleting non-existant item) } else { // Internal processing of items showed some irregularity, but // status to remote peer can still be ok (for example when trying // to delete non-existant item in datastore with incomplete rollbacks, // processSyncOpItem() will return false, but Status=200. PDEBUGPRINTFX(DBG_PROTO,( "Irregularity in execution of item, status=%hd", statusCmdP->getStatusCode() )); } } // if processitem } // if complete item } // if processitem // now generate status or queue for later // - remember as last item for possible suspend and resume fDataStoreP->fLastSourceURI = smlSrcTargLocURIToCharP(thisitemnode->item->source); fDataStoreP->fLastTargetURI = smlSrcTargLocURIToCharP(thisitemnode->item->target); if (queueforlater) { PDEBUGPRINTFX(DBG_PROTO,( "Item could not be processed completely now -> will be queued for later processing" )); // item processing could not complete, we must queue this and all other items // in this command for later processing. However, re-assembling chunked // items must proceed as normal. fDataStoreP->fLastItemStatus = 0; // no status sent yet // Therefore, we move this item from the original list to a list of to-be-queued items addItemToList( thisitemnode->item, // the item &tobequeueditems // place pointer to next node here ); // cut item out of original list to make sure it does not get disposed with it // - itemnodePP points to pointer to list start or a "next" pointer in a node // (which in turn points to thisitemnode). Now let it point to the next item node. // - this also advance processing to the next item *itemnodePP = thisitemnode->next; // - dispose of the item node itself thisitemnode->next=NULL; // disconnect subsequent nodes thisitemnode->item=NULL; // disconnect item (which is now in tobequeueditems list) smlFreeItemList(thisitemnode); // dispose of node // - and the status command delete statusCmdP; statusCmdP = NULL; } else { // count incoming net data if (thisitemnode->item->data) { fDataStoreP->fIncomingDataBytes+=thisitemnode->item->data->length; } // item processed // - remember status (final only) for possible suspend and resume sta= statusCmdP ? statusCmdP->getStatusCode() : 0; if (!nostatus && sta!=213) { // final status received, save it for possible resend fDataStoreP->fLastItemStatus = sta; // but forget data stored at DS level fDataStoreP->fPIStoredSize=0; if (fDataStoreP->fPIStoredDataP) { // only free if not owned by an item if (fDataStoreP->fPIStoredDataAllocated) smlLibFree(fDataStoreP->fPIStoredDataP); } fDataStoreP->fPIStoredDataP=NULL; // make sure it gets saved fDataStoreP->fPartialItemState = pi_state_save_incoming; } // - issue status for it if (statusCmdP) { // add source and target refs of item statusCmdP->addTargetRef(smlSrcTargLocURIToCharP(thisitemnode->item->target)); // add target ref statusCmdP->addSourceRef(smlSrcTargLocURIToCharP(thisitemnode->item->source)); // add source ref // issue ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); } // advance to next item in list itemnodePP = &(thisitemnode->next); } } // item loop // free this one in advance (only if command is finished) if (finished() && !tobequeueditems) FreeSmlElement(); // update item list in command for queuing if needed if (tobequeueditems) { // there are to-be-queued items, insert them instead of the original item list // - delete current item list (only contains already processed and statused items) smlFreeItemList(fSyncOpElementP->itemList); // - insert to be queued items instead fSyncOpElementP->itemList=tobequeueditems; } } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // if not all items could be executed, command must be queued for later re-execution. // (all successfully executed items are already deleted from the item list) return !tobequeueditems; } // TSyncOpCommand::execute // returns true if command must be put to the waiting-for-status queue. // If false, command does not need to be put into waiting-for-status queue // and can be deleted if finished() returns true bool TSyncOpCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp // dummy here, because Status has always no response ) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fSyncOpElementP) { // issue command with SyncML toolkit (no flags) PrepareIssue(&fSyncOpElementP->cmdID,&fSyncOpElementP->flags); // CmdID and flags Ret_t err; InstanceID_t wspid = fSessionP->getSmlWorkspaceID(); switch (fCmdType) { case scmd_add: #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance && !fEvalMode) smlAddCmd(fSessionP->fOutgoingXMLInstance,fSyncOpElementP); #endif err=smlAddCmd(wspid,fSyncOpElementP); break; #ifdef COPY_SEND case scmd_copy: #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance && !fEvalMode) smlCopyCmd(fSessionP->fOutgoingXMLInstance,fSyncOpElementP); #endif err=smlCopyCmd(wspid,fSyncOpElementP); break; #endif case scmd_move: #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance && !fEvalMode) smlMoveCmd(fSessionP->fOutgoingXMLInstance,fSyncOpElementP); #endif err=smlMoveCmd(wspid,fSyncOpElementP); break; case scmd_replace: #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance && !fEvalMode) smlReplaceCmd(fSessionP->fOutgoingXMLInstance,fSyncOpElementP); #endif err=smlReplaceCmd(wspid,fSyncOpElementP); break; case scmd_delete: #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance && !fEvalMode) smlDeleteCmd(fSessionP->fOutgoingXMLInstance,fSyncOpElementP); #endif err=smlDeleteCmd(wspid,fSyncOpElementP); break; default: SYSYNC_THROW(TSyncException("TSyncOpCommand:issue, bad command type")); } if (!fEvalMode) { if (err!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlAdd/Copy/Replace/DeleteCmd",err)); } FinalizeIssue(); // show items SmlItemListPtr_t itemP = fSyncOpElementP->itemList; while (itemP) { // count net data sent sInt32 itemlen=0; if (itemP->item && itemP->item->data) { itemlen=itemP->item->data->length; fDataStoreP->fOutgoingDataBytes+=itemlen; } // show item source and target PDEBUGPRINTFX(DBG_PROTO,( "Item remoteID='%s', localID='%s', datasize=%ld", smlSrcTargLocURIToCharP(itemP->item->target), smlSrcTargLocURIToCharP(itemP->item->source), (long)itemlen )); if (fChunkedItemSize>0 && !fIncompleteData) { #ifdef SYDEBUG PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "Last Chunk (%ld bytes) of large object (%ld total) sent now - retaining it in case of implicit suspend", (long)itemlen, (long)fChunkedItemSize )); #endif if (itemlen>0) saveAsPartialItem(itemP->item); } // next itemP=itemP->next; } // we don't need the data any more, but we should keep the source and target IDs until we have the status // - get rid of data if (fSyncOpElementP->itemList) { // - free possible extra items (shouldn't be any - we always send single item per command) smlFreeItemList(fSyncOpElementP->itemList->next); fSyncOpElementP->itemList->next=NULL; // - free data and meta part of this item, but not target and source info if (fSyncOpElementP->itemList->item) { smlFreePcdata(fSyncOpElementP->itemList->item->meta); fSyncOpElementP->itemList->item->meta=NULL; smlFreePcdata(fSyncOpElementP->itemList->item->data); fSyncOpElementP->itemList->item->data=NULL; } } } else return err==SML_ERR_OK; // ok if evaluation had no error } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL status")); } // sync op commands do need status return true; // queue for status } // TSyncOpCommand::issue void TSyncOpCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fSyncOpElementP); } // TSyncOpCommand::FreeSmlElement TSyncOpCommand::~TSyncOpCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TSyncOpCommand::FreeSmlElement(); } // TSyncOpCommand::~TSyncOpCommand /* end of TSyncOpCommand implementation */ #endif // SYNCCOMMAND_PART1_EXCLUDE #ifndef SYNCCOMMAND_PART2_EXCLUDE /* * Implementation of TMapCommand */ // constructor for receiving Map command TMapCommand::TMapCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlMapPtr_t aMapElementP // associated syncml protocol element ) : TSmlCommand(scmd_map,false,aSessionP,aMsgID) { // save element fMapElementP = aMapElementP; fInProgress=false; // just in case... // no params fLocalDataStoreP=NULL; fRemoteDataStoreP=NULL; } // TMapCommand::TMapCommand #ifdef SYSYNC_SERVER // Server only receives Maps // analyze command (but do not yet execute) bool TMapCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fMapElementP) { StartProcessing(fMapElementP->cmdID,0); return true; } else return false; // no proto element, bad command } // TMapCommand::analyze // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TMapCommand::execute(void) { TStatusCommand *statusCmdP=NULL; bool queueforlater; SYSYNC_TRY { // prepare a status statusCmdP = newStatusCommand(200); // let session actually process the command queueforlater=false; fSessionP->processMapCommand(fMapElementP,*statusCmdP,queueforlater); // check if done or queued for later if (queueforlater) { delete statusCmdP; } else { // now issue status, if any if (statusCmdP) { statusCmdP->addTargetRef(smlSrcTargLocURIToCharP(fMapElementP->target)); // add target ref statusCmdP->addSourceRef(smlSrcTargLocURIToCharP(fMapElementP->source)); // add source ref #ifdef MAP_STATUS_IMMEDIATE // issue status right now (might cause map statuses // returned in sync-updates-to-client package #4 instead of map-confirm #6 ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); #else // issue status only if outgoing package is map-response fSessionP->issueNotBeforePackage(psta_map,statusCmdP); #endif } // free this one in advance FreeSmlElement(); } } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // return true if command has fully executed return !queueforlater; } // TMapCommand::execute #endif #ifdef SYSYNC_CLIENT // Client only sends maps // constructor for sending MAP Command TMapCommand::TMapCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aLocalDataStoreP, // local datastore TRemoteDataStore *aRemoteDataStoreP // remote datastore ) : TSmlCommand(scmd_map,true,aSessionP) { // save params fLocalDataStoreP=aLocalDataStoreP; fRemoteDataStoreP=aRemoteDataStoreP; // create new internal map element fMapElementP=NULL; // none yet generateEmptyMapElement(); // not yet in progress (as not yet issued) fInProgress=false; } // TMapCommand::TMapCommand // generate empty map element void TMapCommand::generateEmptyMapElement(void) { // free possibly still existing map element if (fMapElementP) FreeSmlElement(); // create internal map element fMapElementP = SML_NEW(SmlMap_t); // set proto element type to make it auto-disposable fMapElementP->elementType=SML_PE_MAP; // Cmd ID is now empty (will be set when issued) fMapElementP->cmdID=NULL; // set source and target fMapElementP->target=newLocation(fRemoteDataStoreP->getFullName()); // remote is target for Map command fMapElementP->source=newLocation(fLocalDataStoreP->getRemoteViewOfLocalURI()); // local is source of Map command // no optional elements for now fMapElementP->cred=NULL; // %%% no database level auth yet at all fMapElementP->meta=NULL; // %%% no meta for now // map itemlist is empty fMapElementP->mapItemList=NULL; #ifndef USE_SML_EVALUATION // no item sizes fItemSizes=0; #endif } // TMapCommand::generateEmptyMapElement // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted (except if it is not finished() ) bool TMapCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fMapElementP) { // add as many Map items as possible, update fInProgress // BUT DONT DO THAT IN EVAL MODE (would be recursive, as generateMapItems() // will call evalIssue() which will call this routine....) if (!fEvalMode) generateMapItems(); // issue command, but only if there are any items at all if (fMapElementP->mapItemList) { // now issue map command PrepareIssue(&fMapElementP->cmdID); if (!fEvalMode) { #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlMapCmd(fSessionP->fOutgoingXMLInstance,fMapElementP); #endif Ret_t err; if ((err=smlMapCmd(fSessionP->getSmlWorkspaceID(),fMapElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlMapCmd",err)); } FinalizeIssue(); // show debug DEBUGPRINTFX(DBG_HOT,( "Generated Map command, Source='%s', Target='%s'", smlSrcTargLocURIToCharP(fMapElementP->source), smlSrcTargLocURIToCharP(fMapElementP->target) )); } else return smlMapCmd(fSessionP->getSmlWorkspaceID(),fMapElementP)==SML_ERR_OK; } else { if (fEvalMode) return true; // evaluated nothing, is ok! DEBUGPRINTFX(DBG_PROTO,("Suppressed generating empty map command")); return false; // do not queue, delete command now } // keep smlElement, as we need it to mark confirmed map items // at handleStatus(). } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL sync")); } // return true if command must be queued for status/result response reception return queueForResponse(); } // TMapCommand::issue // - test if completely issued (must be called after issue() and continueIssue()) bool TMapCommand::finished(void) { // not finished as long there are more syncOps to send return (!fInProgress || !fOutgoing); } // TMapCommand::finished // - continue issuing command. This is called by session at start of new message // when finished() returned false after issue()/continueIssue() // (which causes caller of finished() to put command into fInteruptedCommands queue) // returns true if command should be queued for status (again?) // NOTE: continueIssue must make sure that it gets a new CmdID/MsgID because // the command itself is issued multiple times bool TMapCommand::continueIssue(bool &aNewIssue) { aNewIssue=false; // never issue anew! if (!fInProgress) return false; // done, don't queue for status again // we can generate next map command only after we have received status for this one if (isWaitingForStatus()) return true; // still in progress, still waiting for status // command is in progress, continue with another command in this message // - create new Map command generateEmptyMapElement(); // - issue again with new command ID fCmdID = fSessionP->getNextOutgoingCmdID(); fMsgID = fSessionP->getOutgoingMsgID(); // new map command must be queued for status again // but only if something was actually issued (map command issue can // be nop if there are no map items present) return issue(fCmdID,fMsgID,fNoResp); } // TMapCommand::continueIssue // add as many Map items as possible, update fInProgress void TMapCommand::generateMapItems(void) { // let datastore add Map items (possibly none) fInProgress = !( fLocalDataStoreP->engGenerateMapItems(this,NULL) ); } // TMapCommand::generateMapItems // add a Map Item to the map command void TMapCommand::addMapItem(const char *aLocalID, const char *aRemoteID) { // make item SmlMapItemPtr_t mapitemP = SML_NEW(SmlMapItem_t); mapitemP->target=newLocation(aRemoteID); mapitemP->source=newLocation(aLocalID); #ifndef USE_SML_EVALUATION // update size fItemSizes += ITEMOVERHEADSIZE + strlen(aLocalID) + strlen(aRemoteID); #endif // add item to item list SmlMapItemListPtr_t *mapItemListPP = &(fMapElementP->mapItemList); // find last itemlist pointer while (*mapItemListPP) { mapItemListPP=&((*mapItemListPP)->next); } // aItemListPP now points to a NULL pointer which must be replaced by addr of new ItemList entry *mapItemListPP = SML_NEW(SmlMapItemList_t); (*mapItemListPP)->next=NULL; (*mapItemListPP)->mapItem=mapitemP; // insert new item } // TMapCommand::addItem // remove last added map item from the command void TMapCommand::deleteLastMapItem(void) { // make item #ifndef USE_SML_EVALUATION #error "Not implemented for old non-eval method any more" #endif // kill last item in item list SmlMapItemListPtr_t *mapItemListPP = &(fMapElementP->mapItemList); // find last itemlist pointer pointing to an item while (*mapItemListPP && (*mapItemListPP)->next) { mapItemListPP=&((*mapItemListPP)->next); } // aItemListPP now points to the pointer which points to the last item list element (or is NULL if no items there) if (*mapItemListPP) { // delete rest of list, which consists of one item only smlFreeMapItemList(*mapItemListPP); // NULL link in previous item or beginning of list *mapItemListPP=NULL; } } // TMapCommand::deleteLastMapItem // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TMapCommand::handleStatus(TStatusCommand *aStatusCmdP) { bool handled=false; if (aStatusCmdP->getStatusCode()==200) { handled=true; // is ok // mark maps confirmed if (fLocalDataStoreP) { // go through all of my items SmlMapItemListPtr_t mapItemListP = fMapElementP->mapItemList; SmlMapItemPtr_t mapItemP; while (mapItemListP) { mapItemP=mapItemListP->mapItem; if (mapItemP) { // call datastore to mark this map confirmed (no need to be sent again in next session / resume) fLocalDataStoreP->engMarkMapConfirmed( smlSrcTargLocURIToCharP(mapItemP->source), // source for outgoing mapitem is localID smlSrcTargLocURIToCharP(mapItemP->target) // target for outgoing mapitem is remoteID ); } mapItemListP=mapItemListP->next; } } } // anyway, we can now get rid of the map items in the command if (fMapElementP) FreeSmlElement(); // check if base class must handle it if(!handled) { // let base class handle it handled=TSmlCommand::handleStatus(aStatusCmdP); } return handled; } // TMapCommand::handleStatus #endif // client-only map implementation // Common for Client and Server #ifndef USE_SML_EVALUATION // get (approximated) message size required for sending it uInt32 TMapCommand::messageSize(void) { // return size of command so far return TSmlCommand::messageSize()+fItemSizes; } // TMapCommand::messageSize #endif void TMapCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fMapElementP); } // TMapCommand::FreeSmlElement TMapCommand::~TMapCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TMapCommand::FreeSmlElement(); } // TMapCommand::TMapCommand /* end of TMapCommand implementation */ /* * Implementation of TGetCommand */ // constructor for receiving command TGetCommand::TGetCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlGetPtr_t aGetElementP // associated syncml protocol element ) : TSmlCommand(scmd_get,false,aSessionP,aMsgID) { // save element fGetElementP = aGetElementP; } // TGetCommand::TGetCommand // constructor for sending command TGetCommand::TGetCommand( TSyncSession *aSessionP // associated session (for callbacks) ) : TSmlCommand(scmd_get,true,aSessionP) { // create internal get element fGetElementP = SML_NEW(SmlGet_t); // set proto element type to make it auto-disposable fGetElementP->elementType=SML_PE_GET; // Cmd ID is now empty (will be set when issued) fGetElementP->cmdID=NULL; // default to no flags (noResp is set at issue, if at all) fGetElementP->flags=0; // no optional elements for now fGetElementP->cred=NULL; fGetElementP->lang=NULL; fGetElementP->meta=NULL; fGetElementP->itemList=NULL; } // TGetCommand::TGetCommand // set Meta of the get command void TGetCommand::setMeta( SmlPcdataPtr_t aMetaP // existing meta data structure, ownership is passed to Get ) { if (fGetElementP) fGetElementP->meta=aMetaP; } // TGetCommand::setMeta // add an Item to the get command void TGetCommand::addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Get ) { if (fGetElementP) addItemToList(aItemP,&(fGetElementP->itemList)); } // TGetCommand::addItem // add a target specification Item to the get command void TGetCommand::addTargetLocItem( const char *aTargetURI, const char *aTargetName ) { SmlItemPtr_t itemP = newItem(); itemP->target = newLocation(aTargetURI,aTargetName); addItem(itemP); } // TGetCommand::addTargetLocItem // analyze command (but do not yet execute) bool TGetCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fGetElementP) { StartProcessing(fGetElementP->cmdID,fGetElementP->flags); return true; } else return false; // no proto element, bad command } // TGetCommand::analyze // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TGetCommand::execute(void) { TStatusCommand *statusCmdP=NULL; TResultsCommand *resultsCmdP=NULL; SmlItemListPtr_t thisitemnode,nextitemnode; SYSYNC_TRY { // process items thisitemnode=fGetElementP->itemList; while (thisitemnode) { nextitemnode = thisitemnode->next; // no result nor status so far statusCmdP=NULL; resultsCmdP=NULL; // get Target LocURI if (!thisitemnode->item) SYSYNC_THROW(TSyncException("Get with NULL item")); string locURI=smlSrcTargLocURIToCharP(thisitemnode->item->target); DEBUGPRINTFX(DBG_HOT,("processing item with locURI=%s",locURI.c_str())); // let session (and descendants) process it // - default to "not found" status statusCmdP = newStatusCommand(404); resultsCmdP=fSessionP->processGetItem(locURI.c_str(),this,thisitemnode->item,*statusCmdP); // now complete and issue status statusCmdP->addTargetRef(locURI.c_str()); // add target ref ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); // issue results, if any if (resultsCmdP) { ISSUE_COMMAND_ROOT(fSessionP,resultsCmdP); } // next item thisitemnode=nextitemnode; } // free this one in advance FreeSmlElement(); } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; if (resultsCmdP) delete resultsCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // done with command, delete it now: return true return true; } // TGetCommand::execute // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TGetCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fGetElementP) { // issue command with SyncML toolkit PrepareIssue(&fGetElementP->cmdID,&fGetElementP->flags); if (!fEvalMode) { #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlGetCmd(fSessionP->fOutgoingXMLInstance,fGetElementP); #endif Ret_t err; if ((err=smlGetCmd(fSessionP->getSmlWorkspaceID(),fGetElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlGetCmd",err)); } FinalizeIssue(); // we don't need the status structure any more, free (and NULL ptr) now FreeSmlElement(); } else return smlGetCmd(fSessionP->getSmlWorkspaceID(),fGetElementP)==SML_ERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL get")); } // return true if command must be queued for status/result response reception return queueForResponse(); } // TGetCommand::issue bool TGetCommand::statusEssential(void) { // get status is not essential in lenient mode return !(fSessionP->fLenientMode); } // TGetCommand::statusEssential // handle status received for previously issued command // returns true if done, false if command must be kept in the status queue bool TGetCommand::handleStatus(TStatusCommand *aStatusCmdP) { // base class just handles common cases TSyError statuscode = aStatusCmdP->getStatusCode(); if (statuscode>=500) { // %%% for SCTS, which rejects GET with status 500 in some cases POBJDEBUGPRINTFX(fSessionP,DBG_ERROR,("Status: %hd: 5xx for get is passed w/o error",statuscode)); return true; } // let ancestor analyze return TSmlCommand::handleStatus(aStatusCmdP); } // TGetCommand::handleStatus void TGetCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fGetElementP); } // TGetCommand::FreeSmlElement TGetCommand::~TGetCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TGetCommand::FreeSmlElement(); } // TGetCommand::~TGetCommand /* end of TGetCommand implementation */ /* * Implementation of TPutCommand */ // constructor for receiving command TPutCommand::TPutCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlGetPtr_t aPutElementP // associated syncml protocol element ) : TSmlCommand(scmd_put,false,aSessionP,aMsgID) { // save element fPutElementP = aPutElementP; } // TPutCommand::TPutCommand // constructor for sending command TPutCommand::TPutCommand( TSyncSession *aSessionP // associated session (for callbacks) ) : TSmlCommand(scmd_put,true,aSessionP) { // create internal get element fPutElementP = SML_NEW(SmlPut_t); // set proto element type to make it auto-disposable fPutElementP->elementType=SML_PE_PUT; // Cmd ID is now empty (will be set when issued) fPutElementP->cmdID=NULL; // default to no flags (noResp is set at issue, if at all) fPutElementP->flags=0; // no optional elements for now fPutElementP->cred=NULL; fPutElementP->lang=NULL; fPutElementP->meta=NULL; fPutElementP->itemList=NULL; } // TPutCommand::TPutCommand // add Meta to the get command void TPutCommand::setMeta( SmlPcdataPtr_t aMetaP // existing meta data structure, ownership is passed to Get ) { if (fPutElementP) fPutElementP->meta=aMetaP; } // TPutCommand::setMeta // add an Item to the get command void TPutCommand::addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Get ) { if (fPutElementP) addItemToList(aItemP,&(fPutElementP->itemList)); } // TPutCommand::addItem // add a source specification Item to the put command and return a pointer // to add data to it SmlItemPtr_t TPutCommand::addSourceLocItem( const char *aTargetURI, const char *aTargetName ) { SmlItemPtr_t itemP = newItem(); itemP->source = newLocation(aTargetURI,aTargetName); addItem(itemP); return itemP; } // TPutCommand::addSourceLocItem // analyze command (but do not yet execute) bool TPutCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fPutElementP) { StartProcessing(fPutElementP->cmdID,fPutElementP->flags); return true; } else return false; // no proto element, bad command } // TPutCommand::analyze // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TPutCommand::execute(void) { TStatusCommand *statusCmdP=NULL; SmlItemListPtr_t thisitemnode,nextitemnode; SYSYNC_TRY { // process items thisitemnode=fPutElementP->itemList; while (thisitemnode) { nextitemnode = thisitemnode->next; // no result nor status so far statusCmdP=NULL; if (!thisitemnode->item) SYSYNC_THROW(TSyncException("Put with NULL item")); // get Source LocURI string locURI=smlSrcTargLocURIToCharP(thisitemnode->item->source); DEBUGPRINTFX(DBG_HOT,("processing item with locURI=%s",locURI.c_str())); // let session (and descendants) process it // - default to not allowed to put status statusCmdP = newStatusCommand(403); fSessionP->processPutResultItem(true,locURI.c_str(),this,thisitemnode->item,*statusCmdP); // now complete and issue status statusCmdP->addSourceRef(locURI.c_str()); // add source ref ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); // next item thisitemnode=nextitemnode; } // free element FreeSmlElement(); } SYSYNC_CATCH (...) // make sure owned objects in local scope are deleted if (statusCmdP) delete statusCmdP; // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH // done with command, delete it now: return true return true; } // TPutCommand::execute // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TPutCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fPutElementP) { // issue command with SyncML toolkit PrepareIssue(&fPutElementP->cmdID,&fPutElementP->flags); if (!fEvalMode) { #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlPutCmd(fSessionP->fOutgoingXMLInstance,fPutElementP); #endif Ret_t err; if ((err=smlPutCmd(fSessionP->getSmlWorkspaceID(),fPutElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlPutCmd",err)); } FinalizeIssue(); // we don't need the status structure any more, free (and NULL ptr) now FreeSmlElement(); } else return smlPutCmd(fSessionP->getSmlWorkspaceID(),fPutElementP)==SML_ERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL put")); } // return true if command must be queued for status/result response reception return queueForResponse(); } // TPutCommand::issue void TPutCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fPutElementP); } // TPutCommand::FreeSmlElement TPutCommand::~TPutCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TPutCommand::FreeSmlElement(); } // TPutCommand::~TPutCommand /* end of TPutCommand implementation */ /* * Implementation of TStatusCommand */ // constructor for generating status TStatusCommand::TStatusCommand( TSyncSession *aSessionP, // associated session (for callbacks) TSmlCommand *aCommandP, // command this status refers to TSyError aStatusCode // status code ) : TSmlCommand(scmd_status,true,aSessionP) { // save status code fStatusCode=aStatusCode; // get reference info if (aCommandP) { // referring to a command fRefMsgID=aCommandP->getMsgID(); fRefCmdID=aCommandP->getCmdID(); fRefCmdType=aCommandP->getCmdType(); // - set flag to suppress sending this status when NoResp is set fDontSend= aCommandP->getNoResp() || fSessionP->getMsgNoResp(); } else { // referring to SyncHdr of current message fRefMsgID=fSessionP->fIncomingMsgID; fRefCmdID=0; // "command" ID of SyncHdr is 0 fRefCmdType=scmd_synchdr; // is SyncHdr // - set flag to suppress sending this status when NoResp is set fDontSend=fSessionP->getMsgNoResp(); } // create internal status element fStatusElementP = SML_NEW(SmlStatus_t); // set proto element type to make it auto-disposable fStatusElementP->elementType=SML_PE_STATUS; // Cmd ID is now empty (will be set at Issue to ensure correct sequential ordering in case this status is not immediately sent) fStatusElementP->cmdID=NULL; // status refers to message of specified command fStatusElementP->msgRef=newPCDataLong(fRefMsgID); // status refers to ID of specified command fStatusElementP->cmdRef=newPCDataLong(fRefCmdID); // add name fStatusElementP->cmd=newPCDataString(getNameOf(fRefCmdType)); // no status code yet (will be added at issue()) fStatusElementP->data=NULL; // no optional elements for now fStatusElementP->targetRefList=NULL; fStatusElementP->sourceRefList=NULL; fStatusElementP->cred=NULL; fStatusElementP->chal=NULL; fStatusElementP->itemList=NULL; } // TStatusCommand::TStatusCommand // %%%% (later obsolete) constructor for generating status w/o having a command object TStatusCommand::TStatusCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aRefCmdID, // referred-to command ID TSmlCommandTypes aRefCmdType, // referred-to command type (scmd_xxx) bool aNoResp, // set if no-Resp TSyError aStatusCode // status code ) : TSmlCommand(scmd_status,true,aSessionP) { // save status code fStatusCode=aStatusCode; // get reference info fRefMsgID=fSessionP->fIncomingMsgID; fRefCmdID=aRefCmdID; fRefCmdType=aRefCmdType; // - set flag to suppress sending this status when NoResp is set fDontSend=aNoResp; // create internal status element fStatusElementP = SML_NEW(SmlStatus_t); // set proto element type to make it auto-disposable fStatusElementP->elementType=SML_PE_STATUS; // Cmd ID is now empty (will be set at Issue to ensure correct sequential ordering in case this status is not immediately sent) fStatusElementP->cmdID=NULL; // status refers to message of specified command fStatusElementP->msgRef=newPCDataLong(fRefMsgID); // status refers to ID of specified command fStatusElementP->cmdRef=newPCDataLong(fRefCmdID); // add name fStatusElementP->cmd=newPCDataString(getNameOf(fRefCmdType)); // no status code yet (will be added at issue()) fStatusElementP->data=NULL; // no optional elements for now fStatusElementP->targetRefList=NULL; fStatusElementP->sourceRefList=NULL; fStatusElementP->cred=NULL; fStatusElementP->chal=NULL; fStatusElementP->itemList=NULL; } // TStatusCommand::TStatusCommand // constructor for receiving status TStatusCommand::TStatusCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlStatusPtr_t aStatusElementP // associated STATUS command content element ) : TSmlCommand(scmd_status,false,aSessionP,aMsgID) { // save element fStatusElementP = aStatusElementP; } // TStatusCommand::TStatusCommand // analyze status bool TStatusCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fStatusElementP) { StartProcessing(fStatusElementP->cmdID,0); // get status code sInt32 temp; if (smlPCDataToLong(fStatusElementP->data,temp)) fStatusCode=temp; else { PDEBUGPRINTFX(DBG_ERROR,("Malformed status code: '%s'",smlPCDataToCharP(fStatusElementP->data))); return false; // bad status } // get message reference if (!fStatusElementP->msgRef) { // no MsgRef -> must assume 1 (according to SyncML specs) fRefMsgID=1; DEBUGPRINTFX(DBG_PROTO,("No MsgRef in Status, assumed 1")); } else if (!smlPCDataToULong(fStatusElementP->msgRef,fRefMsgID)) { PDEBUGPRINTFX(DBG_ERROR,("Malformed message reference: '%s'",smlPCDataToCharP(fStatusElementP->msgRef))); return false; // bad status } // get command reference if (!smlPCDataToULong(fStatusElementP->cmdRef,fRefCmdID)) { PDEBUGPRINTFX(DBG_ERROR,("Malformed command reference: '%s'",smlPCDataToCharP(fStatusElementP->msgRef))); return false; // bad status } #ifdef SYDEBUG // warn if error (don't treat slow sync status or conflict indication as errors) // - 418 = item already exits: sent by Funambol server when both client and // and server have a new item which is considered identical by the server // (must be really identical, minor difference will lead to a merged item // which is sent back to the client without the 418). See Moblin Bugzilla #4599. if (fStatusCode>=300 && fStatusCode!=508 && fStatusCode!=419 && fStatusCode!=418) { PDEBUGPRINTFX(DBG_ERROR,( "WARNING: RECEIVED NON-OK STATUS %hd for &html;&html;command '%s'&html;&html; (outgoing MsgID=%ld, CmdID=%ld)", fStatusCode, (long)fRefMsgID, (long)fRefCmdID, (long)fRefMsgID, (long)fRefCmdID, smlPCDataToCharP(fStatusElementP->cmd), (long)fRefMsgID, (long)fRefCmdID )); } else { // show what we have received PDEBUGPRINTFX(DBG_HOT,( "RECEIVED STATUS %hd for for &html;&html;command '%s'&html;&html; (outgoing MsgID=%ld, CmdID=%ld)", fStatusCode, (long)fRefMsgID, (long)fRefCmdID, (long)fRefMsgID, (long)fRefCmdID, smlPCDataToCharP(fStatusElementP->cmd), (long)fRefMsgID, (long)fRefCmdID )); } // - source and target refs if (PDEBUGMASK & DBG_HOT) { SmlTargetRefListPtr_t targetrefP = fStatusElementP->targetRefList; while (targetrefP) { // target ref available PDEBUGPRINTFX(DBG_HOT,("- TargetRef (remoteID) = '%s'",smlPCDataToCharP(targetrefP->targetRef))); // next targetrefP=targetrefP->next; } SmlSourceRefListPtr_t sourcerefP = fStatusElementP->sourceRefList; while (sourcerefP) { // target ref available PDEBUGPRINTFX(DBG_HOT,("- SourceRef (localID) = '%s'",smlPCDataToCharP(sourcerefP->sourceRef))); // next sourcerefP=sourcerefP->next; } } // - optional items if (PDEBUGMASK & DBG_ERROR) { SmlItemListPtr_t itemlistP = fStatusElementP->itemList; while (itemlistP) { // item available PDEBUGPRINTFX(DBG_HOT,("- Item data = %s",smlItemDataToCharP(itemlistP->item))); // next itemlistP=itemlistP->next; } } #endif return true; // good status } else return false; // no proto element, bad command } // TStatusCommand::analyze // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TStatusCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp // dummy here, because Status has always no response ) { // now issue if (fStatusElementP) { // prepare basic stuff TSmlCommand::issue(aAsCmdID,aInMsgID,true); // set status code in structure (but only once, in case we are evaluating before issuing) if (fStatusElementP->data==NULL) fStatusElementP->data=newPCDataLong(fStatusCode); // Status is meant to have a CmdID. SyncML 1.0 docs say no, but this was corrected in 1.0.1 // issue command with SyncML toolkit (no flags) PrepareIssue(&fStatusElementP->cmdID,NULL); // CmdID (SyncML 1.0.1 conformant) if (!fEvalMode) { // PrepareIssue(NULL,NULL); // no CmdID, no flags #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlStatusCmd(fSessionP->fOutgoingXMLInstance,fStatusElementP); #endif Ret_t err; if ((err=smlStatusCmd(fSessionP->getSmlWorkspaceID(),fStatusElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlStatusCmd",err)); } FinalizeIssue(); // show debug #ifdef SYDEBUG // - warning for non-ok (don't treat slow sync status as error) if (fStatusCode>=300 && fStatusCode!=508) { PDEBUGPRINTFX(DBG_ERROR,("WARNING: Non-OK Status %hd returned to remote!",fStatusCode)); } // - what was issued PDEBUGPRINTFX(DBG_HOT,("Status Code %s issued for Cmd=%s, (incoming MsgID=%s, CmdID=%s)", smlPCDataToCharP(fStatusElementP->data), smlPCDataToCharP(fStatusElementP->cmd), smlPCDataToCharP(fStatusElementP->msgRef), smlPCDataToCharP(fStatusElementP->cmdRef) )); // - source and target refs if (PDEBUGTEST(DBG_HOT)) { SmlTargetRefListPtr_t targetrefP = fStatusElementP->targetRefList; while (targetrefP) { // target ref available PDEBUGPRINTFX(DBG_HOT,("- TargetRef (localID) = '%s'",smlPCDataToCharP(targetrefP->targetRef))) // next targetrefP=targetrefP->next; } SmlSourceRefListPtr_t sourcerefP = fStatusElementP->sourceRefList; while (sourcerefP) { // target ref available PDEBUGPRINTFX(DBG_HOT,("- SourceRef (remoteID) = '%s'",smlPCDataToCharP(sourcerefP->sourceRef))) // next sourcerefP=sourcerefP->next; } } #endif // we don't need the status structure any more, free (and NULL ptr) now FreeSmlElement(); } else return smlStatusCmd(fSessionP->getSmlWorkspaceID(),fStatusElementP)==SML_ERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL status")); } // status does NOT await any answer, and can be deleted after issuing return false; // don't queue for status } // TStatusCommand::issue // add a target Ref to the status (no op if ref is NULL) void TStatusCommand::addTargetRef( const char *aTargetRef // Target LocURI of an item this status applies to ) { SmlTargetRefListPtr_t *targetreflistPP; if (fStatusElementP && aTargetRef && *aTargetRef) { // Note: empty refs will not be added targetreflistPP=&(fStatusElementP->targetRefList); // find last targetreflist pointer while (*targetreflistPP) { targetreflistPP=&((*targetreflistPP)->next); } // targetreflistPP now points to a NULL pointer which must be replaced by addr of new targetreflist entry *targetreflistPP = SML_NEW(SmlTargetRefList_t); (*targetreflistPP)->next=NULL; (*targetreflistPP)->targetRef= newPCDataString(aTargetRef); } } // TStatusCommand::addTargetRef // add a source Ref to the status (no op if ref is NULL) void TStatusCommand::addSourceRef( const char *aSourceRef // Target LocURI of an item this status applies to ) { SmlSourceRefListPtr_t *sourcereflistPP; if (fStatusElementP && aSourceRef && *aSourceRef) { // Note: empty refs will not be added sourcereflistPP=&(fStatusElementP->sourceRefList); // find last sourcereflist pointer while (*sourcereflistPP) { sourcereflistPP=&((*sourcereflistPP)->next); } // sourcereflistPP now points to a NULL pointer which must be replaced by addr of new sourcereflist entry *sourcereflistPP = SML_NEW(SmlSourceRefList_t); (*sourcereflistPP)->next=NULL; (*sourcereflistPP)->sourceRef= newPCDataString(aSourceRef); } } // TStatusCommand::addSourceRef // add a String Item to the status (only if not empty) void TStatusCommand::addItemString( const char *aItemString // item string to be added ) { if (fStatusElementP && aItemString && *aItemString) { addItem(newStringDataItem(aItemString)); } } // TStatusCommand::addItemString // add an Item to the status void TStatusCommand::addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Status ) { if (fStatusElementP) addItemToList(aItemP,&(fStatusElementP->itemList)); } // TStatusCommand::addItem // move items from another status to this one (passes ownership of items and deletes them from original) void TStatusCommand::moveItemsFrom(TStatusCommand *aStatusCommandP) { if (fStatusElementP && aStatusCommandP) { // pass item list to new owner fStatusElementP->itemList = aStatusCommandP->fStatusElementP->itemList; // remove items from original aStatusCommandP->fStatusElementP->itemList = NULL; } } // TStatusCommand::moveItemsFrom // add Challenge to status // challenge data structure ownership is passed to Status void TStatusCommand::setChallenge(SmlChalPtr_t aChallengeP) { if (fStatusElementP) { if (fStatusElementP->chal) { // get rid of old challenge smlFreeChalPtr(fStatusElementP->chal); fStatusElementP->chal=NULL; } // set new fStatusElementP->chal=aChallengeP; } } // TStatusCommand::setChallenge // set Status code void TStatusCommand::setStatusCode(TSyError aStatusCode) { fStatusCode = aStatusCode; } // TStatusCommand::setStatusCode void TStatusCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fStatusElementP); } // TResultsCommand::FreeSmlElement TStatusCommand::~TStatusCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TStatusCommand::FreeSmlElement(); } // TStatusCommand::TStatusCommand /* end of TStatusCommand implementation */ /* * Implementation of TResultsCommand */ // constructor for receiving command TResultsCommand::TResultsCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlResultsPtr_t aResultsElementP // associated syncml protocol element ) : TSmlCommand(scmd_results,false,aSessionP,aMsgID) { // save element fResultsElementP = aResultsElementP; } // TResultsCommand::TResultsCommand // constructor for generating results TResultsCommand::TResultsCommand( TSyncSession *aSessionP, // associated session (for callbacks) TSmlCommand *aCommandP, // command these results refer to const char *aTargetRef, // target reference const char *aSourceRef // source reference ) : TSmlCommand(scmd_results,true,aSessionP) { // create internal results element fResultsElementP = SML_NEW(SmlResults_t); // set proto element type to make it auto-disposable fResultsElementP->elementType=SML_PE_RESULTS; // Cmd ID is now empty (will be set when issued) fResultsElementP->cmdID=NULL; // results refer to message of specified command fResultsElementP->msgRef=newPCDataLong(aCommandP->getMsgID()); // results refer to ID of specified command fResultsElementP->cmdRef=newPCDataLong(aCommandP->getCmdID()); // no meta for now fResultsElementP->meta=NULL; // target reference if specified if (aTargetRef) fResultsElementP->targetRef=newPCDataString(aTargetRef); else fResultsElementP->targetRef=NULL; // source reference if specified if (aSourceRef) fResultsElementP->sourceRef=newPCDataString(aSourceRef); else fResultsElementP->sourceRef=NULL; // no items for now fResultsElementP->itemList=NULL; } // TResultsCommand::TResultsCommand // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool TResultsCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp // issue without wanting response ) { // prepare TSmlCommand::issue(aAsCmdID,aInMsgID,aNoResp); // now issue if (fResultsElementP) { // issue command with SyncML toolkit (no flags) PrepareIssue(&fResultsElementP->cmdID,NULL); if (!fEvalMode) { #ifdef SYDEBUG if (fSessionP->fXMLtranslate && fSessionP->fOutgoingXMLInstance) smlResultsCmd(fSessionP->fOutgoingXMLInstance,fResultsElementP); #endif Ret_t err; if ((err=smlResultsCmd(fSessionP->getSmlWorkspaceID(),fResultsElementP))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlResultsCmd",err)); } FinalizeIssue(); // show debug DEBUGPRINTFX(DBG_HOT,("results issued for (incoming MsgID=%s, CmdID=%s)", smlPCDataToCharP(fResultsElementP->msgRef), smlPCDataToCharP(fResultsElementP->cmdRef) )); // we don't need the results structure any more, free (and NULL ptr) now FreeSmlElement(); } else return smlResultsCmd(fSessionP->getSmlWorkspaceID(),fResultsElementP)==SML_ERR_OK; } else { DEBUGPRINTFX(DBG_ERROR,("*** Tried to issue NULL result")); } // SyncML 1.0: result does NOT await any answer, and can be deleted after issuing // SyncML 1.0.1: all commands will receive a status (except Status) return true; // queue for status/result } // TResultsCommand::issue // add a String Item to the results void TResultsCommand::addItemString( const char *aItemString // item string to be added ) { if (fResultsElementP && aItemString) { addItem(newStringDataItem(aItemString)); } } // TResultsCommand::addItemString // add an Item to the results void TResultsCommand::addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Results ) { if (fResultsElementP) addItemToList(aItemP,&(fResultsElementP->itemList)); } // TResultsCommand::addItem // set Meta of the results command void TResultsCommand::setMeta( SmlPcdataPtr_t aMetaP // existing meta data structure, ownership is passed to Get ) { if (fResultsElementP) fResultsElementP->meta=aMetaP; } // TResultsCommand::setMeta // analyze command (but do not yet execute) bool TResultsCommand::analyze(TPackageStates aPackageState) { TSmlCommand::analyze(aPackageState); // get Command ID and flags if (fResultsElementP) { StartProcessing(fResultsElementP->cmdID,0); return true; } else return false; // no proto element, bad command } // TResultsCommand::analyze // execute command (perform real actions, generate status) // returns true if command has executed and can be deleted bool TResultsCommand::execute(void) { TStatusCommand *statusCmdP=NULL; SmlItemListPtr_t thisitemnode,nextitemnode; // process items thisitemnode=fResultsElementP->itemList; while (thisitemnode) { nextitemnode = thisitemnode->next; if (!thisitemnode->item) SYSYNC_THROW(TSyncException("Results with NULL item")); // get Source LocURI string locURI=smlSrcTargLocURIToCharP(thisitemnode->item->source); DEBUGPRINTFX(DBG_HOT,("processing item with locURI=%s",locURI.c_str())); // let session (and descendants) process it // - default to ok status statusCmdP = newStatusCommand(200); fSessionP->processPutResultItem(false,locURI.c_str(),this,thisitemnode->item,*statusCmdP); #ifdef RESULTS_SENDS_STATUS // now complete and issue status statusCmdP->addSourceRef(locURI.c_str()); // add source ref ISSUE_COMMAND_ROOT(fSessionP,statusCmdP); #else // suppress (forget) status delete statusCmdP; #endif // next item thisitemnode=nextitemnode; } // free element FreeSmlElement(); // done with command, delete it now: return true return true; } // TResultsCommand::execute void TResultsCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) FREEPROTOELEMENT(fResultsElementP); } // TResultsCommand::FreeSmlElement TResultsCommand::~TResultsCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TResultsCommand::FreeSmlElement(); } // TResultsCommand::TResultsCommand /* end of TResultsCommand implementation */ /* * Implementation of TDevInfResultsCommand */ // constructor for generating devInf results TDevInfResultsCommand::TDevInfResultsCommand( TSyncSession *aSessionP, // associated session (for callbacks) TSmlCommand *aCommandP // command these results refer to ) : /* %%% if strictly following example in SyncML protocol specs * DevInf results don't have a source or target ref, only the item has TResultsCommand(aSessionP,aCommandP,SYNCML_DEVINF_LOCURI,NULL) */ TResultsCommand(aSessionP,aCommandP,NULL,NULL) { // standard result is now created // - create meta type /* %%% if strictly following example in SyncML protocol specs, meta * must be defined in the result/put command, not the individual item */ string metatype=SYNCML_DEVINF_META_TYPE; fSessionP->addEncoding(metatype); fResultsElementP->meta=newMetaType(metatype.c_str()); // - add local DevInf item to result // Note: explicit GET always returns entire devInf (all datastores) addItem(fSessionP->getLocalDevInfItem(false,false)); } // TDevInfResultsCommand::TDevInfResultsCommand // - try to shrink command by at least aReduceByBytes // Returns false if shrink is not possible bool TDevInfResultsCommand::shrinkCommand(sInt32 aReduceByBytes) { // measure current size (with current CmdID/MsgID) sInt32 origfree = evalIssue(fCmdID,fMsgID,fNoResp); // extract original devInf SmlItemPtr_t origDevInf = fResultsElementP->itemList->item; // remove it from the item list fResultsElementP->itemList->item = NULL; smlFreeItemList(fResultsElementP->itemList); fResultsElementP->itemList = NULL; // create reduced version of the devInf // - only alerted datastores if initialisation is complete (i.e. we KNOW which datastores the sync is about) // - no CTCap property lists SmlItemPtr_t reducedDevInf = fSessionP->getLocalDevInfItem( fSessionP->getIncomingState()>psta_init, // alerted only if init complete true // no CTCap property lists ); // insert it into command addItem(reducedDevInf); // measure again sInt32 nowfree = evalIssue(fCmdID,fMsgID,fNoResp); // decide if we are successful if (nowfree-origfree>=aReduceByBytes) { // new devinf matches size requirement smlFreeItemPtr(origDevInf); // discard original devInf return true; // shrink successful } else { // new reduced devInf is still too big fResultsElementP->itemList->item = origDevInf; // restore oiginal devInf smlFreeItemPtr(reducedDevInf); // discard reduced one return false; // cannot shrink enough } } // TDevInfResultsCommand::shrinkCommand // mark devinf as sent when issuing command bool TDevInfResultsCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { fSessionP->remoteGotDevinf(); return TResultsCommand::issue(aAsCmdID,aInMsgID,aNoResp); } // TDevInfResultsCommand::issue void TDevInfResultsCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) // - result might already be freed! if (fResultsElementP) { FREEPROTOELEMENT(fResultsElementP); } } // TDevInfResultsCommand::FreeSmlElement TDevInfResultsCommand::~TDevInfResultsCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TDevInfResultsCommand::FreeSmlElement(); // NOTE: fResultsElementP is NULLed so invocation of base class destuctor does no harm } // TDevInfResultsCommand::TDevInfResultsCommand /* end of TDevInfResultsCommand implementation */ /* * Implementation of TDevInfResultsCommand */ // constructor for generating devinf Put command TDevInfPutCommand::TDevInfPutCommand( TSyncSession *aSessionP // associated session (for callbacks) ) : TPutCommand(aSessionP) { // standard put is now created // - create meta type /* %%% if strictly following example in SyncML protocol specs, meta * must be defined in the result/put command, not the individual item */ string metatype=SYNCML_DEVINF_META_TYPE; fSessionP->addEncoding(metatype); fPutElementP->meta=newMetaType(metatype.c_str()); // - add local DevInf item to result // Note: PUT of server only returns alerted datastore's devInf addItem(fSessionP->getLocalDevInfItem(IS_SERVER,false)); } // TDevInfPutCommand::TDevInfPutCommand // mark devinf as sent when issuing command bool TDevInfPutCommand::issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ) { fSessionP->remoteGotDevinf(); return TPutCommand::issue(aAsCmdID,aInMsgID,aNoResp); } // TDevInfPutCommand::issue void TDevInfPutCommand::FreeSmlElement(void) { // remove SyncML toolkit element(s) // - result might already be freed! if (fPutElementP) { FREEPROTOELEMENT(fPutElementP); } } // TDevInfPutCommand::FreeSmlElement TDevInfPutCommand::~TDevInfPutCommand() { // free command elements, if any (use explicit invocation as this is a destructor) TDevInfPutCommand::FreeSmlElement(); // NOTE: fResultsElementP is NULLed so invocation of base class destuctor does not harm } // TDevInfPutCommand::~TDevInfPutCommand /* end of TDevInfPutCommand implementation */ #endif // SYNCCOMMAND_PART2_EXCLUDE // eof syncevolution-1.5/src/synthesis/src/sysync/synccommand.h0000755000373300037200000010325312424517753025340 0ustar00nightlyallusers00000000000000/* * File: SyncCommand.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSmlCommand, TXXXCmd.... * Wrapper classes for SyncML Commands and the associated SyncML * Toolkit mechanics. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-30 : luz : created * */ #ifndef SyncCommand_H #define SyncCommand_H // includes #include "sysync.h" using namespace sysync; namespace sysync { // forward class TSyncDataStore; class TLocalEngineDS; class TRemoteDataStore; // default command size #define DEFAULTCOMMANDSIZE 200; // Command Types (Note: not only strictly commands, but all // SyncML protocol items that need command-like processin // are wrapped in a command, too, e.g. "SyncHdr" typedef enum { scmd_synchdr, scmd_sync, scmd_syncend, scmd_add, scmd_alert, scmd_delete, scmd_get, scmd_put, scmd_map, scmd_results, scmd_status, scmd_replace, scmd_copy, scmd_move, scmd_sequence, scmd_atomic, scmd_unknown, numSmlCommandTypes } TSmlCommandTypes; // forward class TStatusCommand; class TSyncSession; class TSyncAppBase; // abstract base command class class TSmlCommand : noncopyable { public: // constructor for ALL commands TSmlCommand( TSmlCommandTypes aCmdType, // the command type bool aOutgoing, // set if this is a outgoing command (to avoid confusion) TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID=0 // the Message ID of the command (0=none yet) ); virtual ~TSmlCommand(); // methods #ifdef SYDEBUG TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif // - get session owner (dispatcher/clientbase) TSyncAppBase *getSyncAppBase(void); #ifndef USE_SML_EVALUATION // - get (approximated) message size required for sending it virtual uInt32 messageSize(void); #endif // - analyze command (but do not yet execute) virtual bool analyze(TPackageStates aPackageState) { fPackageState=aPackageState; return true; }; // returns false if command is bad and cannot be executed // - execute() can be called even if there are other already queued commands. // True by default, exceptions must be defined explicitly. virtual bool canExecuteOutOfOrder() { return true; } // - execute command (perform real actions, generate status) virtual bool execute(void); // returns true if command could execute, false if it must be queued for later finishing (next message) // - get number of bytes that will be still available in the workspace after // sending this command. sInt32 evalIssue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response ); // - issue (send) command to remote party // returns true if command must be put to the waiting-for-status queue. // If returns false, command can be deleted virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response ); // - try to split (SyncML 1.1 moredata mechanism) command by reducing // original command by at least aReduceByBytes and generating a second // command containing the rest of the data // Returns NULL if split is not possible virtual TSmlCommand *splitCommand(sInt32 /* aReduceByBytes */) { return NULL; /* normal commands can't be split */ }; virtual bool canSplit(void) { return false; /* normal commands can't be split */ }; // - try to shrink command by at least aReduceByBytes // Returns false if shrink is not possible virtual bool shrinkCommand(sInt32 /* aReduceByBytes */) { return false; /* normal commands can't be shrunk */ }; // - possibly substitute data with previous session's buffered left-overs from a chunked transfer // for resuming a chunked item transfer. virtual bool checkChunkContinuation(void) { return false; /* normal commands can't split and so can't continue */ }; // - test if completely issued (must be called after issue() and continueIssue()) // or completely executed (must be called after execute() to see if command can be deleted) virtual bool finished(void) { return true; }; // normal commands finish after issuing/executing // - continue issuing command. This is called by session at start of new message // when finished() returned false after issue()/continueIssue() // (which causes caller of finished() to put command into fInteruptedCommands queue) // returns true if command should be queued for status (again?) // NOTE: continueIssue must make sure that it gets a new CmdID/MsgID in case // the command itself was NOT yet issued (normally this does not happen, but...) virtual bool continueIssue(bool & /* aNewIssue */) { return true; } // - test if command matches status bool matchStatus(TStatusCommand *aStatusCmdP); // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); // - mark any syncitems (or other data) for resume. Called for pending commands // when a Suspend alert is received or whenever a resumable state must be saved virtual void markPendingForResume(TLocalEngineDS *aForDatastoreP, bool aUnsent) { /* nop */ }; // - mark item for resend in next sync session (if possible) virtual void markForResend(void) { /* nop */ }; // - generate status depending on fNoResp and session's fMsgNoResp // NOTE: always returns a Status (NoResp is handled by not SENDING status) TStatusCommand *newStatusCommand(TSyError aStatusCode, const char *aStringItem=NULL); // properties bool getNoResp(void) { return fNoResp; }; // noResp condition bool getDontSend(void) { return fDontSend; }; // send inhibited condition void dontSend(void) { fDontSend=true; }; // prevent sending this command void allowFailure(void) { fAllowFailure=true; }; // allow failure (don't abort session if this command returns 4xx or 5xx status) const char * getName(void); // name of command uInt32 getCmdID(void) { return fCmdID; }; // ID of command uInt32 getMsgID(void) { return fMsgID; }; // Message ID TSmlCommandTypes getCmdType(void) { return fCmdType; }; // get command type bool isWaitingForStatus(void) { return fWaitingForStatus>0; }; void setWaitingForStatus(bool w) { if (w) fWaitingForStatus++; else if (fWaitingForStatus>0) fWaitingForStatus--; }; TPackageStates getPackageState(void) { return fPackageState; }; virtual SmlPcdataPtr_t getMeta(void) { return NULL; }; virtual bool isSyncOp(void) { return false; }; virtual bool neverIgnore(void) { return false; }; // normal commands should be ignored when in fIgnoreIncomingCommands state virtual bool statusEssential(void) { return true; }; // normal commands MUST receive status void queueStatusCmd(TSmlCommand *aSyncCommandP); // to be called by TSyncSession::issuePtr() bool hasQueuedStatusCmds() const; void transferQueuedStatusCmds(TSmlCommandPContainer &commands); // transfer ownership of pending commands to caller protected: // helper methods for derived classes // - get name of certain command const char *getNameOf(TSmlCommandTypes aCmdType); // - start processing a command void StartProcessing( SmlPcdataPtr_t aCmdID, // ID of command Flag_t aFlags // flags of command ); // - prepare elements for issuing void PrepareIssue( SmlPcdataPtr_t *aCmdID=NULL, // ID of command Flag_t *aFlags=NULL // flags of command ); void FinalizeIssue(void); // finalizes issuing a command (updates message size) // returns true if command must be queued for status or result response virtual bool queueForResponse(void); // - generate and issue status depending on fNoResp and session's fMsgNoResp void issueStatusCommand(TSyError aStatusCode); // - free smlProtoElement structure (if any). Includes precautions if structure contains // parts that are not owned by the command itself virtual void FreeSmlElement(void) { /* nop in base class */ }; // debug #ifdef SYDEBUG // print to (session-related) debug output channel void DebugPrintf(const char *text, ...); #endif // session TSyncSession *fSessionP; // command info TSmlCommandTypes fCmdType; TPackageStates fPackageState; // incoming or outgoing package state of this command (may be different from current state for delayed commands) bool fOutgoing; // set if outgoing command bool fNoResp; uInt32 fCmdID; // command ID uInt32 fMsgID; // message ID // message size calculation uInt32 fBytesbefore; // commands that should not be sent (e.g. a "response" to a NoResp command) bool fDontSend; // set to signal to issue that this is a size evaluation issuing, not a real one bool fEvalMode; // set if PrepareIssue() was already called bool fPrepared; // set if command may fail with status 4xx or 5xx without aborting the session bool fAllowFailure; private: uInt16 fWaitingForStatus; // count for how many statuses a command is waiting TSmlCommandPContainer fPendingStatusReplies; // Status commands which could not be sent yet. }; // TSmlCommand // Unimplemented command class TUnimplementedCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for generating devinf results TUnimplementedCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlPcdataPtr_t aCmdID, // command ID (as contents are unknown an cannot be analyzed) Flag_t aFlags, // flags to get fNoResp TSmlCommandTypes aCmdType=scmd_unknown, // command type (for name) void *aContentP=NULL, // associated command content element TSyError aStatusCode=406 // status code to be returned on execution (default = unimplemented option 406) ); virtual bool execute(void); private: TSyError fStatusCode; }; // TUnimplementedCommand // Sync Header "command" class TSyncHeader: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving SyncHdr TSyncHeader( TSyncSession *aSessionP, // associated session (for callbacks) SmlSyncHdrPtr_t aSyncHdrElementP=NULL // associated SyncHdr content element ); // constructor for sending SyncHdr TSyncHeader( TSyncSession *aSessionP, // associated session (for callbacks) bool aOutgoingNoResp=false // if true, entire message will request no responses ); virtual ~TSyncHeader(); virtual bool execute(void); virtual bool issue( uInt32 aAsCmdID, // command ID to be used (is dummy=0 for SyncHdr) uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response FOR ENTIRE message ); // returns false, because command can be deleted immediately after issue() virtual bool statusEssential(void) { return false; }; // header status is not essential (per se - of course it is for login) // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); protected: virtual void FreeSmlElement(void); SmlSyncHdrPtr_t fSyncHdrElementP; }; // TSyncHeader // Alert Command class TAlertCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving Alert TAlertCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlAlertPtr_t aAlertElementP // associated Alert content element ); // constructor for sending Alert TAlertCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aLocalDataStoreP, // local datastore uInt16 aAlertCode // Alert code to send ); virtual ~TAlertCommand(); virtual bool analyze(TPackageStates aPackageState); virtual bool execute(void); virtual bool issue( uInt32 aAsCmdID, // command ID to be used (is dummy=0 for SyncHdr) uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response ); // returns false, because command can be deleted immediately after issue() virtual bool statusEssential(void); // depends on alert code if it is essential // - add a String Item void addItemString(const char *aItemString); // item string to be added // - add an Item void addItem(SmlItemPtr_t aItemP); // existing item data structure, ownership is passed to Command // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); protected: virtual void FreeSmlElement(void); SmlAlertPtr_t fAlertElementP; uInt16 fAlertCode; // alert code // involved datastore TLocalEngineDS *fLocalDataStoreP; }; // TAlertCommand // Sync Command class TSyncCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving Sync TSyncCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlSyncPtr_t aSyncElementP=NULL // associated Sync content element ); // constructor for sending Sync TSyncCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aLocalDataStoreP, // local datastore TRemoteDataStore *aRemoteDataStoreP // remote datastore ); virtual ~TSyncCommand(); virtual bool analyze(TPackageStates aPackageState); virtual bool execute(void); virtual bool issue( uInt32 aAsCmdID, // command ID to be used (is dummy=0 for SyncHdr) uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response ); // - test if completely issued (must be called after issue() and continueIssue()) // or completely executed (must be called after execute() to see if command can be deleted) virtual bool finished(void); // normal command finish // - continue issuing command. virtual bool continueIssue(bool &aNewIssue); // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); // - mark any syncitems (or other data) for resume. Called for pending commands // when a Suspend alert is received or whenever a resumable state must be saved virtual void markPendingForResume(TLocalEngineDS *aForDatastoreP, bool aUnsent); void setLocalDatastore(TLocalEngineDS *aLocalDataStoreP) { fLocalDataStoreP=aLocalDataStoreP; } TLocalEngineDS *getLocalDatastore() const { return fLocalDataStoreP; } protected: virtual void FreeSmlElement(void); SmlSyncPtr_t fSyncElementP; private: // internals bool generateOpen(void); void generateCommandsAndClose(void); bool fInProgress; // set if bracket must be re-opened in next message (=not finished) // variables for sync needing more than one message TSmlCommandPContainer fNextMessageCommands; TSmlCommand *fInterruptedCommandP; // involved datastores and mode TLocalEngineDS *fLocalDataStoreP; TRemoteDataStore *fRemoteDataStoreP; bool fRemoteWantsNOC; }; // TSyncCommand // Sync End Command (closing bracket: ) // Note: used for receiving only, when sending, the closing // bracket is part of TSyncCommand production process. class TSyncEndCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving TSyncEndCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID // the Message ID of the command ); virtual ~TSyncEndCommand(); virtual bool execute(void); }; // TSyncEndCommand // bytes required for empty item (approx) /* */ #define ITEMOVERHEADSIZE 90 // minimum size of data for a first split #define MIN_SPLIT_DATA 200 // SyncOp (Add/Delete/Replace/Copy/Move) command class TSyncOpCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving SyncOP command TSyncOpCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aDataStoreP, // the local datastore this syncop belongs to uInt32 aMsgID, // the Message ID of the command TSyncOperation aSyncOp, // the Sync operation (sop_xxx) TSmlCommandTypes aCmdType, // the command type (scmd_xxx) SmlGenericCmdPtr_t aSyncOpElementP=NULL // associated syncml protocol element ); // constructor for sending command TSyncOpCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aDataStoreP, // datastore from which command originates TSyncOperation aSyncOp, // sync operation (=command type) SmlPcdataPtr_t aMetaP // meta for entire command (passing owner) ); virtual ~TSyncOpCommand(); virtual bool isSyncOp() { return true; }; virtual bool analyze(TPackageStates aPackageState); virtual bool canExecuteOutOfOrder(); virtual bool execute(void); #ifndef USE_SML_EVALUATION // - get (approximated) message size required for sending it virtual uInt32 messageSize(void); #endif // - add an Item to an existing Sync op command void addItem(SmlItemPtr_t aItemP); // existing item data structure, ownership is passed to SyncOpCmd // returns true if command must be put to the waiting-for-status queue. // If false, command can be deleted bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp // dummy here, because Status has always no response ); // - try to split (e.g using SyncML 1.1 moredata mechanism) command by reducing // original command by at least aReduceByBytes and generating a second // command containing the rest of the data // Returns NULL if split is not possible virtual TSmlCommand *splitCommand(sInt32 aReduceByBytes); virtual bool canSplit(void); // - possibly substitute data with previous session's buffered left-overs from a chunked transfer // for resuming a chunked item transfer. virtual bool checkChunkContinuation(void); // - test if completely issued (must be called after issue() and continueIssue()) // or completely executed (must be called after execute() to see if command can be deleted) virtual bool finished(void); // normal command finish /* %%% not used any more with new splitCommand // - continue issuing command. This is called by session at start of new message // when finished() returned false after issue()/continueIssue() // (which causes caller of finished() to put command into fInteruptedCommands queue) // returns true if command should be queued for status (again?) // NOTE: continueIssue must make sure that it gets a new CmdID/MsgID in case // the command itself was NOT yet issued (normally this does not happen, but...) virtual bool continueIssue(bool &aNewIssue); */ // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); // - mark any unstatused mapitems for resume. Called for pending commands // when a Suspend alert is received or whenever a resumable state must be saved virtual void markPendingForResume(TLocalEngineDS *aForDatastoreP, bool aUnsent); // - mark item for resend in next sync session (if possible) virtual void markForResend(void); // - let item update the partial item state for suspend void updatePartialItemState(TLocalEngineDS *aForDatastoreP); // - get sync op TSyncOperation getSyncOp(void) { return fSyncOp; }; // - get source (localID) of sent command cAppCharP getSourceLocalID(void); // - get target (remoteID) of sent command cAppCharP getTargetRemoteID(void); protected: localstatus AddNextChunk(SmlItemPtr_t aNextChunkItem, TSyncOpCommand *aCmdP); void saveAsPartialItem(SmlItemPtr_t aItemP); virtual void FreeSmlElement(void); SmlGenericCmdPtr_t fSyncOpElementP; #ifndef USE_SML_EVALUATION uInt32 fItemSizes; // accumulated item size #endif TSyncOperation fSyncOp; // Sync operation (sop_xxx) TLocalEngineDS *fDataStoreP; // SyncML 1.1 data segmentation uInt32 fChunkedItemSize; // size of object currently being chunked bool fIncompleteData; // set for commands that do not tranfer the final chunk (and must be answered with 213 status) // SyncML 1.2 resuming a chunked item transmission uInt32 fStoredSize; // from previous session uInt32 fUnconfirmedSize; // from previous session uInt32 fLastChunkSize; // size of last chunk received in THIS session (=probably unconfirmed reception, will probably be sent again from remote) }; // TSyncOpCommand // Map command class TMapCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // Common for client and server virtual ~TMapCommand(); #ifndef USE_SML_EVALUATION // - get (approximated) message size required for sending it virtual uInt32 messageSize(void); #endif // - constructor for receiving MAP command TMapCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlMapPtr_t aMapElementP // associated syncml protocol element ); #ifdef SYSYNC_SERVER // Server implementation virtual bool analyze(TPackageStates aPackageState); virtual bool execute(void); #endif // SYSYNC_SERVER #ifdef SYSYNC_CLIENT // Client implementation // - constructor for sending MAP TMapCommand( TSyncSession *aSessionP, // associated session (for callbacks) TLocalEngineDS *aLocalDataStoreP, // local datastore TRemoteDataStore *aRemoteDataStoreP // remote datastore ); virtual bool issue( uInt32 aAsCmdID, // command ID to be used (is dummy=0 for SyncHdr) uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response ); // - test if completely issued (must be called after issue() and continueIssue()) // or completely executed (must be called after execute() to see if command can be deleted) virtual bool finished(void); // normal command finish // - continue issuing command. virtual bool continueIssue(bool &aNewIssue); // - add map item void addMapItem(const char *aLocalID, const char *aRemoteID); // - remove last added map item from the command void deleteLastMapItem(void); // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); #endif // SYSYNC_CLIENT protected: virtual void FreeSmlElement(void); SmlMapPtr_t fMapElementP; private: // internals #ifdef SYSYNC_CLIENT void generateEmptyMapElement(void); void generateMapItems(void); #endif bool fInProgress; // set if command must be continued in next message (=not finished) // involved datastores and mode TLocalEngineDS *fLocalDataStoreP; TRemoteDataStore *fRemoteDataStoreP; #ifndef USE_SML_EVALUATION // size uInt32 fItemSizes; // accumulated item size #endif }; // TMapCommand // Get command class TGetCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving GET command TGetCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlGetPtr_t aGetElementP=NULL // associated GET command content element ); // constructor for sending command TGetCommand( TSyncSession *aSessionP // associated session (for callbacks) ); // add an Item to the get command void addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Get ); // set Meta of the get command void setMeta( SmlPcdataPtr_t aMetaP // existing meta data structure, ownership is passed to Get ); // get meta of the get command virtual SmlPcdataPtr_t getMeta(void) { return fGetElementP==NULL ? NULL : fGetElementP->meta; }; // add a target specification Item to the get command void addTargetLocItem( const char *aTargetURI, const char *aTargetName=NULL ); virtual ~TGetCommand(); virtual bool analyze(TPackageStates aPackageState); virtual bool execute(void); virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=true // status does not want response by default ); // returns true if command must be put to the waiting-for-status queue. If false, command can be deleted virtual bool statusEssential(void); // can be essential or not // - handle status received for previously issued command // returns true if done, false if command must be kept in the status queue virtual bool handleStatus(TStatusCommand *aStatusCmdP); protected: virtual void FreeSmlElement(void); SmlGetPtr_t fGetElementP; }; // TGetCommand // Put command class TPutCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for receiving PUT command TPutCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlGetPtr_t aPutElementP=NULL // associated PUT command content element ); // constructor for sending command TPutCommand( TSyncSession *aSessionP // associated session (for callbacks) ); // add an Item to the put command void addItem( SmlItemPtr_t aItemP // existing item data structure, ownership is passed to Get ); // set Meta of the put command void setMeta( SmlPcdataPtr_t aMetaP // existing meta data structure, ownership is passed to Get ); // get meta of the put command virtual SmlPcdataPtr_t getMeta(void) { return fPutElementP==NULL ? NULL : fPutElementP->meta; }; // add a source specification + data Item to the Put command SmlItemPtr_t addSourceLocItem( const char *aTargetURI, const char *aTargetName=NULL ); virtual ~TPutCommand(); virtual bool analyze(TPackageStates aPackageState); virtual bool execute(void); virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=true // status does not want response by default ); // returns true if command must be put to the waiting-for-status queue. If false, command can be deleted protected: virtual void FreeSmlElement(void); SmlPutPtr_t fPutElementP; }; // TPutCommand // Status command class TStatusCommand: public TSmlCommand { typedef TSmlCommand inherited; friend class TSmlCommand; // command may look into status public: // constructor for generating status TStatusCommand( TSyncSession *aSessionP, // associated session (for callbacks) TSmlCommand *aCommandP, // command this status refers to, NULL=response to message header TSyError aStatusCode // status code ); // constructor for generating status w/o having a command object (e.g. dummy) TStatusCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aRefCmdID=0, // referred-to command ID TSmlCommandTypes aRefCmdType=scmd_unknown, // referred-to command type (scmd_xxx) bool aNoResp=true, // set if no-Resp TSyError aStatusCode=0 // status code ); // constructor for receiving status TStatusCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlStatusPtr_t aStatusElementP=NULL // associated STATUS command content element ); virtual ~TStatusCommand(); virtual bool analyze(TPackageStates aPackageState); // analyze status virtual bool execute(void) { return true; }; // cannot be executed #ifndef USE_SML_EVALUATION // - get (approximated) message size required for sending it virtual uInt32 messageSize(void) { return fDontSend ? 0 : TSmlCommand::messageSize(); }; #endif virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=true // status does not want response by default ); // returns true if command must be put to the waiting-for-status queue. If false, command can be deleted // status building tools // - add a target Ref void addTargetRef(const char *aTargetRef); // Target LocURI of an item this status applies to // - add a source Ref to an existing status void addSourceRef(const char *aSourceRef); // Source LocURI of an item this status applies to // - add a String Item to an existing status void addItemString(const char *aItemString); // item string to be added // - add an Item to an existing status void addItem(SmlItemPtr_t aItemP); // existing item data structure, ownership is passed to Status // - move items from another status to this one (passes ownership of items and deletes them from original) void moveItemsFrom(TStatusCommand *aStatusCommandP); // - set Status code void setStatusCode(TSyError aStatusCode); // - set Challenge of an existing status (overwrites existing one, if any) void setChallenge(SmlChalPtr_t aChallengeP); // existing challenge data structure, ownership is passed to Status // properties // - get status code TSyError getStatusCode(void) { return fStatusCode; }; // - get status Sml Element const SmlStatusPtr_t getStatusElement(void) { return fStatusElementP; } protected: virtual void FreeSmlElement(void); SmlStatusPtr_t fStatusElementP; // info TSyError fStatusCode; // status code uInt32 fRefMsgID; // referenced message ID uInt32 fRefCmdID; // referenced command ID TSmlCommandTypes fRefCmdType; // referenced command type }; // TStatusCommand // Results command class TResultsCommand: public TSmlCommand { typedef TSmlCommand inherited; public: // constructor for generating results TResultsCommand( TSyncSession *aSessionP, // associated session (for callbacks) TSmlCommand *aCommandP, // command this status refers to const char *aTargetRef, // target reference const char *aSourceRef // source reference ); // constructor for receiving command TResultsCommand( TSyncSession *aSessionP, // associated session (for callbacks) uInt32 aMsgID, // the Message ID of the command SmlResultsPtr_t aResultsElementP // associated syncml protocol element ); virtual ~TResultsCommand(); virtual bool neverIgnore() { return true; }; // result for devInf we requested should never be ignored virtual bool analyze(TPackageStates aPackageState); virtual bool execute(void); virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp=false // issue without wanting response ); // returns true if command must be put to the waiting-for-status queue. If false, command can be deleted // results building tools // - add a String Item to results void addItemString(const char *aItemString); // item string to be added // - add an Item to results void addItem(SmlItemPtr_t aItemP); // existing item data structure, ownership is passed to Status // set Meta of the results command void setMeta( SmlPcdataPtr_t aMetaP // existing meta data structure, ownership is passed to Get ); // get meta of the results command virtual SmlPcdataPtr_t getMeta(void) { return fResultsElementP==NULL ? NULL : fResultsElementP->meta; }; protected: virtual void FreeSmlElement(void); SmlResultsPtr_t fResultsElementP; }; // TResultsCommand // DevInf Results command (specialized TResultsCommand derivate for sending devInf) class TDevInfResultsCommand: public TResultsCommand { typedef TResultsCommand inherited; public: // constructor for generating devinf results TDevInfResultsCommand( TSyncSession *aSessionP, // associated session (for callbacks) TSmlCommand *aCommandP // command this status refers to ); virtual ~TDevInfResultsCommand(); virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ); virtual bool statusEssential(void) { return false; }; // results status is not essential // - try to shrink command by at least aReduceByBytes // Returns false if shrink is not possible virtual bool shrinkCommand(sInt32 aReduceByBytes); protected: virtual void FreeSmlElement(void); }; // TDevInfResultsCommand // DevInf Put command (specialized TPutCommand derivate for sending devInf) class TDevInfPutCommand: public TPutCommand { typedef TPutCommand inherited; public: // constructor for generating devinf Put TDevInfPutCommand( TSyncSession *aSessionP // associated session (for callbacks) ); virtual ~TDevInfPutCommand(); virtual bool issue( uInt32 aAsCmdID, // command ID to be used uInt32 aInMsgID, // message ID in which command is being issued bool aNoResp ); virtual bool statusEssential(void) { return false; }; // devInf Put status is not essential protected: virtual void FreeSmlElement(void); }; // TDevInfPutCommand } // namespace sysync #endif // SyncCommand_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncdatastore.cpp0000755000373300037200000002354212424517753026245 0ustar00nightlyallusers00000000000000/* * File: SyncDataStore.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncDataStore * * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-xx-xx : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "syncdatastore.h" #include "syncsession.h" using namespace sysync; /* * Implementation of TSyncDataStore */ void TSyncDataStore::init(TSyncSession *aSessionP) { // save link to session fSessionP=aSessionP; // no sync capabilities by default fCommonSyncCapMask=0; // name not known fName="[unknown]"; // no types fRxPrefItemTypeP = NULL; fTxPrefItemTypeP = NULL; // no max GUID size yet fMaxGUIDSize = 0; // unlimited (that is, maximum possible with longlong) size and ID #ifdef __BORLANDC__ fMaxMemory = numeric_limits::max(); fFreeMemory = fMaxMemory; fMaxID = numeric_limits::max(); fFreeID = fMaxID; #elif defined(LINUX) || defined(WINCE) || defined(_MSC_VER) || defined(__EPOC_OS__) fMaxMemory = LONG_MAX; fFreeMemory = fMaxMemory; fMaxID = LONG_MAX; fFreeID = fMaxID; #else fMaxMemory = numeric_limits<__typeof__(fMaxMemory)>::max(); fFreeMemory = fMaxMemory; fMaxID = numeric_limits<__typeof__(fMaxID)>::max(); fFreeID = fMaxID; #endif fCanRestart = false; // rest ist like reset InternalResetDataStore(); } // TSyncDataStore::init TSyncDataStore::TSyncDataStore(TSyncSession *aSessionP) { init(aSessionP); } // TSyncDataStore::TSyncDataStore TSyncDataStore::TSyncDataStore(TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask) { // basic init init(aSessionP); // make sure we have SyncML minimal Caps, save it fCommonSyncCapMask=aCommonSyncCapMask | SCAP_MASK_MINIMAL; // save name of datastore fName = aName; } // TSyncDataStore::TSyncDataStore void TSyncDataStore::setPreferredTypes(TSyncItemType *aRxItemTypeP, TSyncItemType *aTxItemTypeP) { // save standard Rx and Tx preferences fRxPrefItemTypeP = aRxItemTypeP; fTxPrefItemTypeP = aTxItemTypeP ? aTxItemTypeP : aRxItemTypeP; // add them to the tx/rx lists fRxItemTypes.push_back(fRxPrefItemTypeP); fTxItemTypes.push_back(fTxPrefItemTypeP); } // TSyncDataStore::setPreferredTypes void TSyncDataStore::InternalResetDataStore(void) { // empty for now } // TSyncDataStore::InternalResetDataStore TSyncDataStore::~TSyncDataStore() { InternalResetDataStore(); } // TSyncDataStore::~TSyncDataStore // - returns session zones GZones *TSyncDataStore::getSessionZones(void) { return fSessionP->getSessionZones(); } // TSyncDataStore::getSessionZones #ifdef SYDEBUG TDebugLogger *TSyncDataStore::getDbgLogger(void) { // commands log to session's logger return fSessionP ? fSessionP->getDbgLogger() : NULL; } // TSyncDataStore::getDbgLogger uInt32 TSyncDataStore::getDbgMask(void) { if (!fSessionP) return 0; // no session, no debug return fSessionP->getDbgMask(); } // TSyncDataStore::getDbgMask #endif TSyncAppBase *TSyncDataStore::getSyncAppBase(void) { return fSessionP ? fSessionP->getSyncAppBase() : NULL; } // TSyncDataStore::getSyncAppBase // check if this datastore is accessible with given URI // NOTE: URI might include path elements or CGI params that are // access options to the database; derived classes might // therefore base identity check on more than simple name match uInt16 TSyncDataStore::isDatastore(const char *aDatastoreURI) { // base class only implements case insensitive name comparison return strucmp(fName.c_str(),aDatastoreURI)==0 ? fName.size() : 0; } // TSyncDataStore::isDatastore /// @brief checks if specified type is used by this datastore /// @return true if type is used by this datastore /// @param aSyncItemType[in] type to be checked for being used /// @param aVariantDescP[out] if not NULL, will receive the variant descriptor associated with that use bool TSyncDataStore::doesUseType(TSyncItemType *aSyncItemType, TTypeVariantDescriptor *aVariantDescP) { // true if either used for send or for receive TSyncItemType *rx, *tx; rx=getReceiveType(aSyncItemType); tx=getSendType(aSyncItemType); // determine usage variant if needed if (aVariantDescP) { *aVariantDescP = getVariantDescForType(aSyncItemType); } // used if used as rx or tx return (rx!=NULL || tx!=NULL); } // TSyncDataStore::doesUseType // - returns type that this datastore can use to send data to specified datastore // Note: if possible, use preferred Rx type of specified datastore, if this // is not possible, use preferred Tx type of this datastore, else // use any matching pair. TSyncItemType *TSyncDataStore::getTypesForTxTo( TSyncDataStore *aDatastoreP, // usually remote datastore TSyncItemType **aCorrespondingTypePP ) { TSyncItemTypePContainer::iterator pos; TSyncItemType *corrP; TSyncItemType *txtypeP=NULL, *corrtypeP=NULL; // none found so far TSyncItemType *preftxP=NULL, *preftxcorrP=NULL; // none found so far // if no datastore there: none if (!aDatastoreP) return NULL; // get common type for transmitting TO specified datastore // - loop through all send types of myself for (pos=fTxItemTypes.begin(); pos!=fTxItemTypes.end(); ++pos) { // - check if remote has this type if ((corrP=aDatastoreP->getReceiveType(*pos))!=NULL) { // found matching type // - save pointers (we found at least one matching type) txtypeP=*pos; // TSyncItemType of this datastore corrtypeP=corrP; // TSyncItemType of other datastore // - check if preferred by remote if (aDatastoreP->getPreferredRxItemType()==corrtypeP) { // yes, this is best case, save it and stop searching preftxP=txtypeP; preftxcorrP=corrtypeP; break; // done } // - if found, but not preferred by remote, check if its our own preference if (getPreferredTxItemType()==txtypeP) { // remember in case we don't find the remote's preferred type preftxP=txtypeP; preftxcorrP=corrtypeP; // but continue because we might find remote's preferred } } } // Now txtypeP/corrtypeP are NULL if no match found // Now preftxP/=preftxcorrP are NULL if no preferred match found // check if we found a preferred if (preftxP) { // use it instead of last found (or NULL if none found) txtypeP=preftxP; corrtypeP=preftxcorrP; } // return send type if (aCorrespondingTypePP) *aCorrespondingTypePP = corrtypeP; // corresponding TSyncItemType of other datastore return txtypeP; } // TSyncDataStore::getTypesForTxTo // - returns type that this datastore can use to receive data from specified datastore TSyncItemType *TSyncDataStore::getTypesForRxFrom( TSyncDataStore *aDatastoreP, // usually remote datastore TSyncItemType **aCorrespondingTypePP ) { TSyncItemTypePContainer::iterator pos; TSyncItemType *rxtypeP=NULL, *corrP; // get common type for receiving FROM specified datastore for (pos=fRxItemTypes.begin(); pos!=fRxItemTypes.end(); ++pos) { // loop through all receive types of myself if ((corrP=aDatastoreP->getSendType(*pos))!=NULL) { // found rxtypeP=*pos; if (aCorrespondingTypePP) *aCorrespondingTypePP = corrP; // corresponding TSyncItemType of other datastore break; } } // return receive type return rxtypeP; } // TSyncDataStore::getTypesForRxFrom // get datastore's SyncItemType for receive of specified type, NULL if none TSyncItemType *TSyncDataStore::getReceiveType(const char *aType, const char *aVers) { return ( TSyncItemType::findTypeInList( fRxItemTypes, aType, aVers, false, // version doesn't need to match true, // but we want an implemented type NULL // no datastore link comparison ) ); } // TSyncDataStore::getReceiveType // get datastore's SyncItemType for receive of specified type, NULL if none TSyncItemType *TSyncDataStore::getReceiveType(TSyncItemType *aSyncItemTypeP) { return ( getReceiveType ( aSyncItemTypeP->getTypeName(), aSyncItemTypeP->getTypeVers() ) ); } // TSyncDataStore::getReceiveType // get datastore's SyncItemType for send of specified type, NULL if none TSyncItemType *TSyncDataStore::getSendType(const char *aType, const char *aVers) { return ( TSyncItemType::findTypeInList( fTxItemTypes, aType, aVers, false, // version doesn't need to match true, // but we want an implemented type NULL // no datastore link comparison ) ); } // TSyncDataStore::getSendType // get datastore's SyncItemType for send of specified type, NULL if none TSyncItemType *TSyncDataStore::getSendType(TSyncItemType *aSyncItemTypeP) { return ( getSendType( aSyncItemTypeP->getTypeName(), aSyncItemTypeP->getTypeVers() ) ); } // TSyncDataStore::getSendType // description structure of datastore (NULL if not available) SmlDevInfDatastorePtr_t TSyncDataStore::getDatastoreDevinf(bool aAsServer, bool aWithoutCTCapProps) { // get Datastore description (when I am a Server) return newDevInfDatastore(aAsServer, aWithoutCTCapProps); } // TSyncDataStore::getDatastoreDevinf // private helper for setDatastoreDevInf void TSyncDataStore::registerTypes( TSyncItemTypePContainer &aSupportedXmitTypes, SmlDevInfXmitListPtr_t aXmitTypeListP, TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes, // list to add analyzed types if not already there TSyncDataStore *aRelatedDatastoreP ) { while (aXmitTypeListP) { if (aXmitTypeListP->data) { // register TSyncItemType *itemtypeP = TSyncItemType::registerRemoteType(fSessionP,aXmitTypeListP->data,aLocalItemTypes,aNewItemTypes,aRelatedDatastoreP); // add to list aSupportedXmitTypes.push_back(itemtypeP); } // next aXmitTypeListP=aXmitTypeListP->next; } } // TSyncDataStore::registerTypes /* end of TSyncDataStore implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/syncdatastore.h0000755000373300037200000001531112424517753025705 0ustar00nightlyallusers00000000000000/* * File: SyncDataStore.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncDataStore * * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-xx-xx : luz : created * */ #ifndef SyncDataStore_H #define SyncDataStore_H #include "syncitemtype.h" #include namespace sysync { // forward class TSyncItemType; class TSyncSession; class TSyncAppBase; class TSyncDataStore : noncopyable { private: void init(TSyncSession *aSessionP); // internal init void InternalResetDataStore(void); // reset for re-use without re-creation public: TSyncDataStore(TSyncSession *aSessionP); TSyncDataStore(TSyncSession *aSessionP, const char *aName, uInt32 aCommonSyncCapMask=0); virtual ~TSyncDataStore(); virtual void engResetDataStore(void) { InternalResetDataStore(); }; virtual void announceAgentDestruction(void) { /* nop */ }; ///< called while agent is still fully ok, so we must clean up such that later call of destructor does NOT access agent any more // set preferred type support void setPreferredTypes(TSyncItemType *aRxItemTypeP, TSyncItemType *aTxItemTypeP=NULL); // access datastore // - get name (as used in path) const char *getName(void) { return fName.c_str(); } // - return display name (descriptive) virtual const char *getDisplayName(void) #ifndef MINIMAL_CODE =0; // implemented in derivates #else { return getName(); }; // just return normal name #endif // - check if this datastore is accessible with given URI // NOTE: URI might include path elements or CGI params that are // access options to the database; derived classes might // therefore base identity check on more than simple name match virtual uInt16 isDatastore(const char *aDatastoreURI); // - returns if specified type is used by this datastore bool doesUseType(TSyncItemType *aSyncItemType, TTypeVariantDescriptor *aVariantDescP=NULL); // - true if data store is able to return 404 when asked to delete non-existent item virtual bool dsDeleteDetectsItemPresence() const { return false; } // - get common types to send to or receive from another datastore TSyncItemType *getTypesForTxTo(TSyncDataStore *aDatastoreP, TSyncItemType **aCorrespondingTypePP=NULL); TSyncItemType *getTypesForRxFrom(TSyncDataStore *aDatastoreP, TSyncItemType **aCorrespondingTypePP=NULL); // - get datastore's type for receive / send of specified type TSyncItemType *getReceiveType(TSyncItemType *aSyncItemTypeP); TSyncItemType *getReceiveType(const char *aType, const char *aVers); TSyncItemType *getSendType(TSyncItemType *aSyncItemTypeP); TSyncItemType *getSendType(const char *aType, const char *aVers); virtual TTypeVariantDescriptor getVariantDescForType(TSyncItemType *aItemTypeP) { return NULL; }; // - get preferred Item types TSyncItemType *getPreferredRxItemType(void) { return fRxPrefItemTypeP; }; TSyncItemType *getPreferredTxItemType(void) { return fTxPrefItemTypeP; }; // - get max GUID size sInt32 getMaxGUIDSize(void) { return fMaxGUIDSize; }; // - memory limits sInt64 getFreeMemory(void) { return fFreeMemory; }; sInt64 getMaxMemory(void) { return fMaxMemory; }; sInt64 getFreeID(void) { return fFreeID; }; sInt64 getMaxID(void) { return fMaxID; }; bool canRestart() { return fCanRestart; } virtual bool syncModeSupported(const std::string &mode) { return fSyncModes.find(mode) != fSyncModes.end(); } virtual void getSyncModes(set &modes) { modes = fSyncModes; } // - session TSyncSession *getSession(void) { return fSessionP; }; // description structure of datastore (NULL if not available) // - get description structure, but ownership remains at TSyncDataStore SmlDevInfDatastorePtr_t getDatastoreDevinf(bool aAsServer, bool aWithoutCTCapProps); // - set description structure virtual bool setDatastoreDevInf( SmlDevInfDatastorePtr_t /* aDataStoreDevInfP */, // the datastore DevInf TSyncItemTypePContainer & /* aLocalItemTypes */, // list to look up local types (for reference) TSyncItemTypePContainer & /* aNewItemTypes */ // list to add analyzed types if not already there ) { return true; /* nop for base class */ }; // helpers // - returns session zones GZones *getSessionZones(void); // - return pure relative (item) URI (removes absolute part or ./ prefix) virtual const char *DatastoreRelativeURI(const char *aURI) = 0; // - get debug mask/logger #ifdef SYDEBUG TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif // - get session owner (dispatcher/clientbase) TSyncAppBase *getSyncAppBase(void); protected: // obtain new datastore info, returns NULL if none available virtual SmlDevInfDatastorePtr_t newDevInfDatastore(bool /* aAsServer */, bool /* aWithoutCTCapProps */) { return NULL; } // no description in base class SmlDevInfXmitListPtr_t newXMitListDevInf(TSyncItemTypePContainer &aTypeList); // obtain Sync Cap mask, defaults to value passed at creation by session virtual uInt32 getSyncCapMask(void) { return fCommonSyncCapMask; }; // SyncML-exposed name (SourceRef in DevInf) of the datastore string fName; // Maximal size of GUIDs sent to that (remote) datastore, so if real local GUID // is longer, temporary GUIDs that meet MaxGUIDSize must be created by the server. sInt32 fMaxGUIDSize; // Information about datastore memory (could be enormous, so provide longlongs here) sInt64 fMaxMemory; // maximum number bytes for datastore sInt64 fFreeMemory; // number of free bytes sInt64 fMaxID; // maximum number of ID sInt64 fFreeID; // free IDs bool fCanRestart; // if set, then the datastore is able to participate in multiple sync sessions; in other words after a successful read/write cycle it is possible to restart at the reading phase set fSyncModes; // all supported sync modes that we know about (empty unless SyncCap was parsed) public: // Type of items in this datastore (read-only, can be used by multiple Datastores simultaneously) // - receiving types (also used as default item type) TSyncItemType *fRxPrefItemTypeP; TSyncItemTypePContainer fRxItemTypes; // - sending types TSyncItemType *fTxPrefItemTypeP; TSyncItemTypePContainer fTxItemTypes; protected: // session TSyncSession *fSessionP; // common (session) Sync capabilities uInt32 fCommonSyncCapMask; // type registering void registerTypes( TSyncItemTypePContainer &aSupportedXmitTypes, SmlDevInfXmitListPtr_t aXmitTypeList, TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes, // list to add analyzed types if not already there TSyncDataStore *aRelatedDatastoreP ); }; // TSyncDataStore } // namespace sysync #endif // SyncDataStore_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncitem.cpp0000755000373300037200000000655012424517753025215 0ustar00nightlyallusers00000000000000/* * File: SyncItem.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncItem * Abstract Base class of all data containing items. * TSyncItems always correspond to a TSyncItemType * which holds type information and conversion * features. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-18 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "syncitem.h" #include "syncappbase.h" using namespace sysync; // equality mode names const char * const sysync::compareRelevanceNames[numEQmodes] = { "never", // irrelevant, only for fields with really unimportant data (such as REV) - note that this also prevents inclusion in CRC change detection "scripted", // relevant, but actual comparison is done in a script - standard compare loop must not check it (but it is automatically included in CRC change detection) "conflict", // for conflict, all fields that have user data should use at least this "slowsync", // for slow sync, all fields that must match for identifying records in slow sync "always", // always relevant, fields that must always match (first-time sync match set) "n/a" }; const char * const sysync::comparisonModeNames[numEQmodes] = { "all", // compare all fields, even irrelevant ones "n/a", // n/a (scripted) "conflict", // compare fields relevant for (normal sync) conflict detection "slowsync", // compare fields relevant for slow sync match "firstsync", // compare fields relevant for first time slow sync match (possibly relaxed comparison rules) "age", // no test for equality, only for age (returns SYSYNC_NOT_COMPARABLE if age comparison not possible) }; /* * Implementation of TSyncItem */ /* public TSyncItem members */ TSyncItem::TSyncItem(TSyncItemType *aItemType) { fSyncOp=sop_none; fSyncItemTypeP=aItemType; } // TSyncItem::TSyncItem TSyncItem::~TSyncItem() { for (SyncItemAux_t::iterator it = fSyncItemAux.begin(); it != fSyncItemAux.end(); ++it) { delete it->second; } } // TSyncItem::~TSyncItem TSyncItemAux *TSyncItem::getAux(EngineLevel level) const { SyncItemAux_t::const_iterator it = fSyncItemAux.find(level); return it == fSyncItemAux.end() ? NULL : it->second; } void TSyncItem::setAux(EngineLevel level, TSyncItemAux *aux) { fSyncItemAux[level] = aux; } // assignment (IDs and contents) TSyncItem& TSyncItem::operator=(TSyncItem &aSyncItem) { // - IDs setRemoteID(aSyncItem.getRemoteID()); setLocalID(aSyncItem.getLocalID()); // - syncop setSyncOp(aSyncItem.getSyncOp()); // - Contents replaceDataFrom(aSyncItem); // done return *this; } // TSyncItem::operator= // get session zones pointer GZones *TSyncItem::getSessionZones(void) { return getSession() ? getSession()->getSessionZones() : NULL; } // TSyncItem::getSessionZones #ifdef SYDEBUG TDebugLogger *TSyncItem::getDbgLogger(void) { // commands log to session's logger return fSyncItemTypeP ? fSyncItemTypeP->getDbgLogger() : NULL; } // TSyncItem::getDbgLogger uInt32 TSyncItem::getDbgMask(void) { if (!fSyncItemTypeP) return 0; // no session, no debug return fSyncItemTypeP->getDbgMask(); } // TSyncItem::getDbgMask #endif TSyncAppBase *TSyncItem::getSyncAppBase(void) { return getSession() ? getSession()->getSyncAppBase() : NULL; } // TSyncItem::getSyncAppBase /* end of TSyncItem implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/syncitem.h0000755000373300037200000002036112424517753024656 0ustar00nightlyallusers00000000000000/* * File: SyncItem.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncItem * Abstract Base class of all data containing items. * TSyncItems always correspond to a TSyncItemType * which holds type information and conversion * features. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-06-18 : luz : created * */ #ifndef SyncItem_H #define SyncItem_H // includes #include "syncitemtype.h" namespace sysync { // default command size #define DEFAULTITEMSIZE 50; // equality relevance / mode typedef enum { // RELEVANCE COMPARE MODE eqm_none, // not relevant at all (*) compares ALL fields, even not-relevant ones eqm_scripted, // relevant, handled in script n/a eqm_conflict, // relevant for conflicts only compares all somehow relevant fields for conflict comparison eqm_slowsync, // relevant for slow sync compares only fields relevant for slow sync eqm_always, // always relevant (e.g firsttime) compares only always-relevant fields (first time slowsync) eqm_nocompare, // n/a prevent equality test in compareWith totally numEQmodes } TEqualityMode; // (*) Note: eqm_none fields will be silently merged in mergeWith(), that is, if no other // fields are merged, mergeWith will report "nothing merged" even if eqm_none field might // be modified // Fields with eqm_none will also not be included in CRC calculations for detecting changes. // Names for TEqualityMode when used as field relevance extern const char * const compareRelevanceNames[numEQmodes]; // Names for TEqualityMode when used as comparison mode extern const char * const comparisonModeNames[numEQmodes]; // merge options #define mem_none -1 // do not merge at all #define mem_fillempty -2 // fill empty fields of winning item with loosig item's field contents #define mem_addunassigned -3 // add fields of loosing item to winning item if it has this field not yet assigned (not just empty) #define mem_concat 0 // simply concatenate field contents // NOTE: any positive char constant means intelligent merge using given char as separator // forward class TLocalEngineDS; class TSyncAppBase; class TSyncItemAux { public: virtual ~TSyncItemAux() {} }; class TSyncItem : noncopyable { public: TSyncItem(TSyncItemType *aItemType=NULL); virtual ~TSyncItem(); // access to type virtual uInt16 getTypeID(void) const { return ity_syncitem; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_syncitem; }; // get session pointer TSyncSession *getSession(void) { return fSyncItemTypeP ? fSyncItemTypeP->getSession() : NULL; }; // get session zones pointer GZones *getSessionZones(void); // assignment (IDs and contents) virtual TSyncItem& operator=(TSyncItem &aSyncItem); // access to IDs // - remote ID const char *getRemoteID(void) { return fRemoteID.c_str(); }; void setRemoteID(const char *aRemoteID) { fRemoteID = aRemoteID; }; bool hasRemoteID(void) { return !fRemoteID.empty(); }; void clearRemoteID(void) { fRemoteID.erase(); }; // - local ID const char *getLocalID(void) { return fLocalID.c_str(); }; void setLocalID(const char *aLocalID) { fLocalID = aLocalID; }; bool hasLocalID(void) { return !fLocalID.empty(); }; void clearLocalID(void) { fLocalID.erase(); }; virtual void updateLocalIDDependencies(void) { /* nop here */ } // - changelog support #ifdef CHECKSUM_CHANGELOG virtual uInt16 getDataCRC(uInt16 crc=0, bool /* aEQRelevantOnly */=false) { return crc; /* always empty */ }; #endif // access to operation TSyncOperation getSyncOp(void) { return fSyncOp; }; void setSyncOp(TSyncOperation aSyncOp) { fSyncOp=aSyncOp; }; // access to visibility // object filtering #ifdef OBJECT_FILTERING // New style generic filtering // - check if item passes filter and probably apply some modifications to it virtual bool postFetchFiltering(TLocalEngineDS *aDatastoreP) { return true; } // without filters, just pass everything // Old style filter expressions // - test if item passes filter virtual bool testFilter(const char *aFilterString) { return (!aFilterString || *aFilterString==0); }; // without real test, only empty filterstring pass // - make item pass filter virtual bool makePassFilter(const char *aFilterString) { return (!aFilterString || *aFilterString==0); }; // without real implementation, works only with no filter string #endif // compare abilities // - test if comparable at all (correct types) virtual bool comparable(TSyncItem & /* aItem */) { return false; }; // - test if comparison can find out newer (greater) item // NOTE: this should reflect the actually possible sorting state // related to current contents of the item (for example, a vCard // that COULD be sorted if it HAD a REV date may not return true // if the actual item does not have a REV property included. virtual bool sortable(TSyncItem & /* aItem */) { return false; }; // clear item data (means not only empty values, but NO VALUES assigned) virtual void cleardata(void) {}; // replace data contents from specified item (returns false if not possible) // - aAvailable only: only replace contents actually available in aItem, leave rest untouched // - aDetectCutOffs: handle case where aItem could have somhow cut-off data and prevent replacing // complete data with cut-off version (e.g. mobiles like T39m with limited name string capacity) virtual bool replaceDataFrom(TSyncItem & /* aItem */, bool /* aAvailableOnly */=false, bool /* aDetectCutoffs */=false, bool /* aAssignedOnly */=false, bool /* aTransferUnassigned */=false) { return true; }; // no data -> nop // check item before processing it virtual bool checkItem(TLocalEngineDS * /* aDatastoreP */) { return true; }; // default is: ok enum { MERGE_OPTION_FROM_CONFIG, /**< merge as defined in the field list */ MERGE_OPTION_CHANGE_OTHER, /**< ensure that the other item is the same as this item */ MERGE_OPTION_CHANGE_THIS /**< ensure that this items is the same as the other */ }; // merge this item with specified item. // Notes: // - specified item is treated as loosing item, this item is winning item // - also updates other item to make sure it is equal to the winning after the merge // sets (but does not reset) change status of this and other item. // Note that changes of non-relevant fields are not reported here. virtual void mergeWith(TSyncItem & /* aItem */, bool &aChangedThis, bool &aChangedOther, TLocalEngineDS * /* aDatastoreP */, int mode = MERGE_OPTION_FROM_CONFIG) { aChangedThis=false; aChangedOther=false; }; // nop by default // remote and local ID string fRemoteID; // ID in remote party (if this is a server: LUID, GUID otherwise) string fLocalID; // ID in this party (if this is a server: GUID, LUID otherwise) // compare: returns 0 if equal, 1 if this > aItem, -1 if this < aItem // SYSYNC_NOT_COMPARABLE if not equal and no ordering known virtual sInt16 compareWith( TSyncItem & /* aItem */, TEqualityMode /* aEqMode */, TLocalEngineDS * /* aDatastoreP */ #ifdef SYDEBUG ,bool /* aDebugShow */=false #endif ) { return SYSYNC_NOT_COMPARABLE; }; #ifdef SYDEBUG // show item contents for debug virtual void debugShowItem(uInt32 aDbgMask=DBG_DATA) { /* nop */ }; // get debug channel TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif // - get session owner (dispatcher/clientbase) TSyncAppBase *getSyncAppBase(void); // Opaque auxiliary data, for use in the different levels that the item passes through. enum EngineLevel { LOCAL_ENGINE, STD_LOGIC_DS, CUSTOM_DS, PLUGIN_API }; TSyncItemAux *getAux(EngineLevel level) const; void setAux(EngineLevel level, TSyncItemAux *aux); protected: // operation to be performed with this item at its destination TSyncOperation fSyncOp; TSyncItemType *fSyncItemTypeP; private: // cast pointer to same type, returns NULL if incompatible TSyncItem *castToSameTypeP(TSyncItem *aItemP) { return aItemP; } // all are compatible TSyncItem typedef std::map SyncItemAux_t; SyncItemAux_t fSyncItemAux; }; // TSyncItem } // namespace sysync #endif // SyncItem_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncitemtype.cpp0000755000373300037200000010207112424517753026112 0ustar00nightlyallusers00000000000000/* * File: SyncItemType.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncItemType * Type description and converter (template) for TSyncItem. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-16 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "syncitemtype.h" #include "syncitem.h" #include "synccommand.h" #include "syncsession.h" #ifdef ZIPPED_BINDATA_SUPPORT #include "zlib.h" #endif using namespace sysync; /* * Implementation of TSyncItemType */ /* TSyncItemType members */ void TSyncItemType::init( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP ) { // link to config fTypeConfigP=aTypeConfigP; // link to session fSessionP=aSessionP; // set type name and vers (if any) fTypeName=aCTType; if (aVerCT) fTypeVers=aVerCT; // set relation to a specific datastore (if any) fRelatedDatastoreP=aRelatedDatastoreP; // assume local fIsRemoteType = false; #if defined(ZIPPED_BINDATA_SUPPORT) && defined(SYDEBUG) // data compression accounting fRawDataBytes=0; fZippedDataBytes=0; #endif } // TSyncItemType::init TSyncItemType::TSyncItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP ) { // only basic init init(aSessionP,aTypeConfigP,aCTType,aVerCT,aRelatedDatastoreP); } // TSyncItemType::TSyncItemType TSyncItemType::~TSyncItemType() { #if defined(ZIPPED_BINDATA_SUPPORT) && defined(SYDEBUG) // show compression statistics, if any if (fSessionP && fRawDataBytes && fZippedDataBytes) { POBJDEBUGPRINTFX(fSessionP,DBG_HOT,( "##### Type '%s', zippedbindata send statistics: raw=%ld, compressed=%ld, compressed down to %ld%%", getTypeName(), (long)fRawDataBytes, (long)fZippedDataBytes, (long)(fZippedDataBytes*100/fRawDataBytes) )); } #endif } // TSyncItemType::~TSyncItemType // get session zones pointer GZones *TSyncItemType::getSessionZones(void) { return getSession() ? getSession()->getSessionZones() : NULL; } // TSyncItemType::getSessionZones #ifdef SYDEBUG TDebugLogger *TSyncItemType::getDbgLogger(void) { // commands log to session's logger return fSessionP ? getSession()->getDbgLogger() : NULL; } // TSyncItemType::getDbgLogger uInt32 TSyncItemType::getDbgMask(void) { if (!fSessionP) return 0; // no session, no debug return fSessionP->getDbgMask(); } // TSyncItemType::getDbgMask #endif // helper to create same-typed instance via base class TSyncItemType *TSyncItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TSyncItemType,DBG_OBJINST,"TSyncItemType",TSyncItemType(aSessionP,fTypeConfigP,getTypeName(),getTypeVers(),aDatastoreP)); } // TSyncItemType::newCopyForSameType // check if type is supported // - if version specified is NULL, first name-matching flavour is returned // - if type has no version, it matches any versions given // - if aVersMustMatch is set, version must match (both w/o version is a match, too) bool TSyncItemType::supportsType(const char *aName, const char *aVers, bool aVersMustMatch) { if (!aName) return false; // no support for unnamed if (!aVers) aVers=""; // empty version return ( strucmp(fTypeName.c_str(),aName)==0 && ( ((*aVers==0 || fTypeVers.empty()) && !aVersMustMatch) || strucmp(fTypeVers.c_str(),aVers)==0 ) ); } // TSyncItemType::supportsType bool TSyncItemType::supportsType(SmlDevInfXmitPtr_t aXmitType, bool aVersMustMatch) { if (!aXmitType) return false; // null type not found return ( supportsType( smlPCDataToCharP(aXmitType->cttype), smlPCDataToCharP(aXmitType->verct), aVersMustMatch ) ); } // TSyncItemType::supportsType /// @brief get CTCap entry /// @param aOnlyForDS[in] /// - if NULL, CTCap is generated suitable for all datastores /// - if not NULL, CTCap is generated specifically for the datastore passed const SmlDevInfCTCapPtr_t TSyncItemType::getCTCapDevInf(TLocalEngineDS *aOnlyForDS, TTypeVariantDescriptor aVariantDescriptor, bool aWithoutCTCapProps) { SmlDevInfCTCapPtr_t ctcap=NULL; // get item type and property description (part of ), if any // - first see if we have (and are allowed to show) property descriptions at all SmlDevInfCTDataPropListPtr_t proplistP = NULL; if (fSessionP->fShowCTCapProps && !aWithoutCTCapProps) proplistP = newCTDataPropList(aVariantDescriptor); // - and if we should report field level replace capability to remote bool acceptsFieldLevel = getSession()->getSyncMLVersion()>=syncml_vers_1_2 && canAcceptFieldLevelUpdates(); if (proplistP || acceptsFieldLevel) { // there are properties available for this item, create DevInfCTCap ctcap = SML_NEW(SmlDevInfCTCap_t); // - add type name ctcap->cttype=newPCDataString(getTypeName()); // - for DS 1.2, add the VerCT if (getSession()->getSyncMLVersion()>=syncml_vers_1_2) ctcap->verct=newPCDataString(getTypeVers()); else ctcap->verct=NULL; // - init the flags ctcap->flags= acceptsFieldLevel ? SmlDevInfFieldLevel_f : 0; // - add property list ctcap->prop=proplistP; } return ctcap; } // TSyncItemType::getCTCapDevInf // intended for creating SyncItemTypes for remote databases from // transmitted DevInf. bool TSyncItemType::analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP) { // Note: derived classes will possibly get some type-related info out of the CTCaps return true; } // TSyncItemType::analyzeCTCap /// @brief copy CTCap derived info from another SyncItemType /// @return false if item not compatible /// @note required to create remote type variants from ruleMatch type alternatives bool TSyncItemType::copyCTCapInfoFrom(TSyncItemType &aSourceItem) { // no generic CTCap info to copy return true; } // TSyncItemType::copyCTCapInfoFrom // - static function to search type in a TSyncItemTypePContainer TSyncItemType *TSyncItemType::findTypeInList( TSyncItemTypePContainer &aList, const char *aName, const char *aVers, bool aVersMustMatch, bool aMustBeImplemented, TSyncDataStore *aRelatedDatastoreP // if not NULL, type must be specific to this datastore (or unspecific) ) { TSyncItemTypePContainer::iterator pos; // first priority: return type which is specific to aRelatedDatastoreP for (pos=aList.begin(); pos!=aList.end(); ++pos) { if ((*pos)->supportsType(aName,aVers,aVersMustMatch)) { // found, return if implementation is ok and related to the correct datastore (or no relation requested) if ( ( !aMustBeImplemented || (*pos)->isImplemented() ) && ( (aRelatedDatastoreP==NULL) || ((*pos)->getRelatedDatastore()==aRelatedDatastoreP) ) ) return (*pos); // return it } } if (aRelatedDatastoreP) { // second priority: return type which is expressedly not specific to a datastore for (pos=aList.begin(); pos!=aList.end(); ++pos) { if ((*pos)->supportsType(aName,aVers,aVersMustMatch)) { // found, return if implementation is ok and related to the correct datastore if ( (!aMustBeImplemented || (*pos)->isImplemented()) && ((*pos)->getRelatedDatastore()==NULL) ) return (*pos); // return it } } } return NULL; // not found } // static TSyncItemType::findTypeInList // - static function to search type in a TSyncItemTypePContainer TSyncItemType *TSyncItemType::findTypeInList( TSyncItemTypePContainer &aList, SmlDevInfXmitPtr_t aXmitType, // name and version of type bool aVersMustMatch, bool aMustBeImplemented, TSyncDataStore *aRelatedDatastoreP // if not NULL, type must be specific to THIS datastore (or unspecific) ) { return ( findTypeInList( aList, smlPCDataToCharP(aXmitType->cttype), smlPCDataToCharP(aXmitType->verct), aVersMustMatch, aMustBeImplemented, aRelatedDatastoreP ) ); } // static TSyncItemType::findTypeInList // - static function to add new or copied ItemType to passed list TSyncItemType *TSyncItemType::registerRemoteType( TSyncSession *aSessionP, SmlDevInfXmitPtr_t aXmitTypeP, // name and version of type TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes, // list to add analyzed types if not already there TSyncDataStore *aRelatedDatastoreP ) { return ( registerRemoteType( aSessionP, smlPCDataToCharP(aXmitTypeP->cttype), smlPCDataToCharP(aXmitTypeP->verct), aLocalItemTypes, aNewItemTypes, aRelatedDatastoreP ) ); } // static TSyncItemType::registerRemoteType // - static function to add new or copied ItemType to passed list // If type is already in aNewItemTypes, nothing will be added TSyncItemType *TSyncItemType::registerRemoteType( TSyncSession *aSessionP, const char *aName, const char *aVers, // name and version of type TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) - aRelatedDatastoreP does NOT relate to the types here, as these are local ones TSyncItemTypePContainer &aNewItemTypes, // list to add analyzed types if not already there TSyncDataStore *aRelatedDatastoreP // if NULL, type is not related to a specific (remote!) datastore ) { if (!aName) SYSYNC_THROW(TSyncException("cannot register type w/o name")); #ifdef SYDEBUG if (aSessionP) { // Show warning if no version if (!aVers || *aVers==0) { POBJDEBUGPRINTFX(aSessionP,DBG_REMOTEINFO,("WARNING: Registering type with no version specification!")); } } #endif // - check if type is already in the list (version must match, but implementation not required TSyncItemType *newitemtypeP = findTypeInList(aNewItemTypes,aName,aVers,true,false,aRelatedDatastoreP); if (newitemtypeP) { POBJDEBUGPRINTFX(aSessionP,DBG_REMOTEINFO+DBG_EXOTIC,( "Type already registered as '%s' Version='%s'", newitemtypeP->getTypeName(), newitemtypeP->hasTypeVers() ? newitemtypeP->getTypeVers() : "[none]" )); } else { // - check if one of the local item types supports this type // Note: SySync engine only has one global list of supported types. It might contain multiple entries for // the same type, when related to different datastores. The following search will find the first with // matching name - this is no problem as long as all types with same name have the same CLASS type // (as the only reason to look up in local types is to create the correct class' instance). When // actually USED later by datastores, each datastore finds it's own INSTANCES via it's tx/rx(pref). // No need for version match, but for implementation TSyncItemType *localitemtypeP = findTypeInList(aLocalItemTypes,aName,aVers,false,true,NULL); // local types are not specific to a datastore if (localitemtypeP) { // %%% test for conforming version if type being registered has no version spec // local itemtype exists that can support this type/vers // - create new item type of same class (type-specialized derivate of TSyncItemType) // - but relate it to the remote datastore (for DS1.2, or none for DS1.1 and earlier) newitemtypeP = localitemtypeP->newCopyForSameType(aSessionP,aRelatedDatastoreP); } else { // no local support of this type // - create base class item just describing the type found // (but without handling abilities) newitemtypeP = new TSyncItemType(aSessionP,NULL,aName,aVers,aRelatedDatastoreP); } // this is a remote type! newitemtypeP->defineAsRemoteType(); // add item to list aNewItemTypes.push_back(newitemtypeP); POBJDEBUGPRINTFX(aSessionP,DBG_REMOTEINFO+DBG_HOT,( "Registered Type '%s' Version='%s', %s%s, related to remote datastore '%s'", newitemtypeP->getTypeName(), newitemtypeP->hasTypeVers() ? newitemtypeP->getTypeVers() : "[none]", newitemtypeP->isImplemented() ? "implemented by local type " : "NOT implemented", newitemtypeP->isImplemented() ? newitemtypeP->getTypeConfig()->getName() : "", aRelatedDatastoreP ? aRelatedDatastoreP->getName() : "" )); // Only show this if we REALLY have a local type-to-DS relation (NEVER so far - that is in 3.1.2.1) if (newitemtypeP->isImplemented() && localitemtypeP && localitemtypeP->getRelatedDatastore()) { POBJDEBUGPRINTFX(aSessionP,DBG_REMOTEINFO,( "- Implementation is exclusively related to local datastore '%s'", localitemtypeP->getRelatedDatastore()->getName() )); } } // if not already in list return newitemtypeP; } // static TSyncItemType::registerRemoteType /// @brief static function to analyze CTCap and add entries to passed list /// @todo %%% to be moved to TMimeDirItemType (as basic TSyncItemType does not really know the VERSION property) bool TSyncItemType::analyzeCTCapAndCreateItemTypes( TSyncSession *aSessionP, TRemoteDataStore *aRemoteDataStoreP, ///< if not NULL, this is the datastore to which this type is local (DS 1.2 case) SmlDevInfCTCapPtr_t aCTCapP, TSyncItemTypePContainer &aLocalItemTypes, ///< list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes ///< list to add analyzed types if not already there ) { bool versfound = false; // create one TSyncItemType for each type contained in this CTCap if (aCTCapP) { // type name const char *name = smlPCDataToCharP(aCTCapP->cttype); // - from DS 1.2 on, we should have the verct without digging into properties const char *vers = smlPCDataToCharP(aCTCapP->verct); if (vers && *vers) { // we have a non-empty version from verct (new DS 1.2 devinf) #ifdef SYDEBUG if (aSessionP) { PLOGDEBUGBLOCKFMTCOLL(aSessionP->getDbgLogger(),("RemoteCTCap", "Registering remote Type/Version from >=DS 1.2 style CTCap", "type=%s|version=%s", name, vers)); } #endif // valenum shows version supported TSyncItemType *newitemtypeP = registerRemoteType( aSessionP, name,vers, // name and version of type aLocalItemTypes, // list to look up local types (for reference) aNewItemTypes, // list to add it to aRemoteDataStoreP ); // now let new item process the CTCap if (newitemtypeP) newitemtypeP->analyzeCTCap(aCTCapP); #ifdef SYDEBUG if (aSessionP) { PLOGDEBUGENDBLOCK(aSessionP->getDbgLogger(),"RemoteCTCap"); } #endif versfound=true; } else { // - pre-DS 1.2 hack: try to find VERSION property SmlDevInfCTDataPropListPtr_t prlP = aCTCapP->prop; while (prlP) { // get property name const char *n = smlPCDataToCharP(prlP->data->prop->name); if (n && strcmp(n,"VERSION")==0) { // version property found. Now create flavour for each ValEnum SmlPcdataListPtr_t velP = prlP->data->prop->valenum; while (velP) { vers = smlPCDataToCharP(velP->data); if (vers) { versfound=true; // found at least one #ifdef SYDEBUG if (aSessionP) { PLOGDEBUGBLOCKFMTCOLL(aSessionP->getDbgLogger(),("RemoteCTCap", "Registering remote Type/Version from old style CTCap w/o verct", "type=%s|version=%s", name, vers)); } #endif // valenum shows version supported TSyncItemType *newitemtypeP = registerRemoteType( aSessionP, name,vers, // name and version of type aLocalItemTypes, // list to look up local types (for reference) aNewItemTypes, // list to add it to aRemoteDataStoreP ); // now let new item process the CTCap if (newitemtypeP) newitemtypeP->analyzeCTCap(aCTCapP); #ifdef SYDEBUG if (aSessionP) { PLOGDEBUGENDBLOCK(aSessionP->getDbgLogger(),"RemoteCTCap"); } #endif } // if version is not null // next velP=velP->next; } // while valenums break; // VERSION found, done with properties for now } // while properties prlP=prlP->next; } // while } if (!versfound) { // version is NULL, for a start, create type w/o version #ifdef SYDEBUG if (aSessionP) { PLOGDEBUGBLOCKFMT(aSessionP->getDbgLogger(),("RemoteCTCap", "Registering remote Type w/o version from CTCap", "type=%s|version=[none]", name)); } #endif TSyncItemType *newitemtypeP = registerRemoteType( aSessionP, name,NULL, // name, but no version aLocalItemTypes, // list to look up local types (for reference) aNewItemTypes, // list to add it to aRemoteDataStoreP ); // now let new item process the CTCap if (newitemtypeP) newitemtypeP->analyzeCTCap(aCTCapP); #ifdef SYDEBUG if (aSessionP) { PLOGDEBUGENDBLOCK(aSessionP->getDbgLogger(),"RemoteCTCap"); } #endif // this is ok, too return true; } // without version } return versfound; } // static TSyncItemType::analyzeCTCapAndCreateItemTypes // get type as transmit format SmlDevInfXmitPtr_t TSyncItemType::newXMitDevInf(void) { SmlDevInfXmitPtr_t xmitP; xmitP = SML_NEW(SmlDevInfXmit_t); xmitP->cttype=newPCDataString(getTypeName()); xmitP->verct=newPCDataString(getTypeVers()); return xmitP; } // TSyncItemType::newXMitDevInf // static helper: get type list as transmit format SmlDevInfXmitListPtr_t TSyncItemType::newXMitListDevInf( TSyncItemTypePContainer &aTypeList, TSyncItemType *aDontIncludeP ) { SmlDevInfXmitListPtr_t resultP = NULL; SmlDevInfXmitListPtr_t *listPP = &resultP; TSyncItemTypePContainer::iterator pos; for (pos=aTypeList.begin(); pos!=aTypeList.end(); ++pos) { if (aDontIncludeP!=(*pos)) { // only if item in list does not match "except" item // new list item (*listPP) = SML_NEW(SmlDevInfXmitList_t); (*listPP)->next=NULL; // add type (*listPP)->data=(*pos)->newXMitDevInf(); // next listPP=&((*listPP)->next); } } return resultP; } // TSyncItemType::newXMitListDevInf // create new empty sync item TSyncItem *TSyncItemType::newSyncItem( TSyncItemType *aTargetItemTypeP, // the targeted type (for optimizing field lists etc.) TLocalEngineDS *aLocalDataStoreP // the datastore ) { if (!aLocalDataStoreP) { PDEBUGPRINTFX(DBG_ERROR,("Trying to call newSyncItem w/o datastore")); return NULL; } // test if implemented at all if (!isImplemented()) { PDEBUGPRINTFX(DBG_ERROR,( "Tried to create SyncItem for unimplemented SyncItemType '%s' (%s)", fTypeName.c_str(), fTypeVers.c_str() )); return NULL; } // check for compatibility with targeted type if (!isCompatibleWith(aTargetItemTypeP)) { PDEBUGPRINTFX(DBG_ERROR,( "Local type (%s) is not assignment compatible with remote target type (%s) - probably multiple types with same name/version but different fieldlists in config", getTypeConfig()->getName(),aTargetItemTypeP-> getTypeConfig()->getName() )); return NULL; } // get appropriate item TSyncItem *syncitemP = internalNewSyncItem(aTargetItemTypeP,aLocalDataStoreP); // return new item (if any) return syncitemP; } // TSyncItemType::newSyncItem // create new sync item from SyncML data TSyncItem *TSyncItemType::newSyncItem( SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem TSyncOperation aSyncOp, // the operation to be performed with this item TFmtTypes aFormat, // the format (normally fmt_chr) TSyncItemType *aTargetItemTypeP, // the targeted type (for optimizing field lists etc.) TLocalEngineDS *aLocalDataStoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ) { TSyncItem *syncitemP = NULL; // test if implemented at all if (!isImplemented()) { DEBUGPRINTFX(DBG_ERROR,( "Tried to create SyncItem for unimplemented SyncItemType '%s' (%s)", fTypeName.c_str(), fTypeVers.c_str() )); aStatusCmd.setStatusCode(415); ADDDEBUGITEM(aStatusCmd,"Known, but unimplemented Item Type"); return NULL; } PDEBUGBLOCKFMT(("Item_Parse","parsing SyncML item", "SyncOp=%s|format=%s|LocalID=%s|RemoteID=%s", SyncOpNames[aSyncOp], encodingFmtNames[aFormat], smlSrcTargLocURIToCharP(aItemP->target), smlSrcTargLocURIToCharP(aItemP->source) )); SYSYNC_TRY { // get appropriate item type syncitemP = internalNewSyncItem(aTargetItemTypeP,aLocalDataStoreP); // get local and remote IDs if (syncitemP) { // set operation type syncitemP->setSyncOp(aSyncOp); // an appropriate syncitem was created, set target and source now // - we have received this item from remote, so target=myself, source=remote party syncitemP->setLocalID(relativeURI(smlSrcTargLocURIToCharP(aItemP->target))); #ifdef DONT_STRIP_PATHPREFIX_FROM_REMOTEIDS syncitemP->setRemoteID(smlSrcTargLocURIToCharP(aItemP->source)); #else syncitemP->setRemoteID(relativeURI(smlSrcTargLocURIToCharP(aItemP->source))); #endif PDEBUGPRINTFX(DBG_DATA+DBG_DETAILS,( "Created new item of datatype '%s', localID='%s' remoteID='%s'", getTypeConfig()->getName(), syncitemP->getLocalID(), syncitemP->getRemoteID() )); if (aSyncOp!=sop_delete && aSyncOp!=sop_archive_delete && aSyncOp!=sop_soft_delete && aSyncOp!=sop_copy && aSyncOp!=sop_move) { // Item has data, parse it // - uncompress data first if zippedbindata selected in type #ifdef ZIPPED_BINDATA_SUPPORT if (fTypeConfigP->fZippedBindata && fSessionP->getEncoding()==SML_WBXML && fSessionP->getSyncMLVersion()>=syncml_vers_1_1) { // this type uses zipped bindata and we have WBXML (we cannot use zipped bindata in XML) // - get input data MemPtr_t zipBinPayload = NULL; MemSize_t zipBinSize = 0; MemPtr_t expandedPayload = NULL; sInt32 expandedSize = 0; if (aItemP->data) { if ((zipBinSize=aItemP->data->length)>0) { zipBinPayload = (MemPtr_t) aItemP->data->content; } } // uncompress it, if we have data at all if (zipBinPayload) { // - contains expanded size of payload for pre-allocating the buffer SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(aItemP->meta); if (metaP && metaP->maxobjsize) { smlPCDataToLong(metaP->maxobjsize, expandedSize); } if (expandedSize>0) { // we have data to expand AND we know how big the output will be (if we did not get MaxObjSize, this // means that the data is not compressed expandedPayload = (MemPtr_t) smlLibMalloc(expandedSize+1); // we need one more for the terminator // uncompress the payload with gzip z_stream zipstream; // - no special alloc zipstream.zalloc=NULL; zipstream.zfree=NULL; zipstream.opaque=NULL; // - no input yet zipstream.next_in=NULL; zipstream.avail_in=0; // - init deflate inflateInit2(&zipstream,15+32); // 15=default window size, +16=sets gzip detect flag (+32: sets gzip+zlib detect flag) // - actually inflate item's ... zipstream.next_in=zipBinPayload; zipstream.avail_in=zipBinSize; // - ...into new buffer zipstream.next_out=expandedPayload; zipstream.avail_out=expandedSize; int err = inflate(&zipstream,Z_SYNC_FLUSH); // - replace compressed by expanded data if everything's fine if (err==Z_OK && zipstream.avail_in==0) { // make sure data is null terminated expandedPayload[expandedSize]=0; // set expanded data in place of compressed aItemP->data->length=expandedSize; aItemP->data->content=expandedPayload; // forget compressed data smlLibFree(zipBinPayload); } else { // if failed, get rid of unneeded buffer smlLibFree(expandedPayload); } // clean up zip decompressor inflateEnd(&zipstream); } // if expected data size is known (from maxobjsize), i.e. was sent compressed } // if input data available at all } // if zippedBinData enabled #endif // convert payload (as a whole) from known format encodings if (aFormat==fmt_b64) { MemSize_t origSize = aItemP->data->length; cAppCharP origData = (cAppCharP)aItemP->data->content; if (origSize) { // something to decode, do it and replace original content aItemP->data->content = b64::decode(origData, origSize, (uInt32 *)&(aItemP->data->length)); // we don't need the original data any more b64::free((void *)origData); } } // convert payload (as a whole) from UTF16 (Unicode) to UTF-8 if (fTypeConfigP->fUseUTF16) { // get original size MemSize_t origSize = aItemP->data->length; cAppCharP origData = (cAppCharP)aItemP->data->content; if (origSize) { // we usually don't need more memory than the original string utf8Payload; // now convert appendUTF16AsUTF8( (const uInt16 *)origData, origSize/2, fTypeConfigP->fMSBFirst, utf8Payload, false, false ); // replace contents if (MemSize_t(utf8Payload.size())data->content,utf8Payload.c_str(),origSize+1); // include terminator byte in copy aItemP->data->length=origSize; } } // fill in data, if any (virtual method implemented in descendant) if (!internalFillInData(syncitemP,aItemP,aLocalDataStoreP,aStatusCmd)) { // delete item, as it could not be filled properly delete syncitemP; PDEBUGPRINTFX(DBG_ERROR,("Could not fill item -> immediately deleted, none returned")); syncitemP=NULL; // none any more } } } PDEBUGENDBLOCK("Item_Parse"); } SYSYNC_CATCH (...) PDEBUGENDBLOCK("Item_Parse"); SYSYNC_RETHROW; SYSYNC_ENDCATCH // return new item (if any) return syncitemP; } // TSyncItemType::newSyncItem // - create new SyncML toolkit item from SyncItem SmlItemPtr_t TSyncItemType::newSmlItem( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML TLocalEngineDS *aLocalDatastoreP // local datastore ) { SmlItemPtr_t smlitemP = NULL; PDEBUGBLOCKFMT(("Item_Generate","generating SyncML item", "SyncOp=%s|LocalID=%s|RemoteID=%s", SyncOpNames[aSyncItemP->getSyncOp()], aSyncItemP->getLocalID(), aSyncItemP->getRemoteID() )); SYSYNC_TRY { // allocate an empty smlItem smlitemP = newItem(); // data only if not delete, copy or map TSyncOperation syncop = aSyncItemP->getSyncOp(); if (syncop!=sop_delete && syncop!=sop_archive_delete && syncop!=sop_soft_delete && syncop!=sop_copy) { // let virtual method implemented in descendant fill in data and, possibly, meta. if (!internalSetItemData(aSyncItemP,smlitemP,aLocalDatastoreP)) { SYSYNC_THROW(TSyncException("newSmlItem: internalSetItemData() failed")); } // convert payload (as a whole) to UTF16 (Unicode) if (fTypeConfigP->fUseUTF16) { string utf16bytestream; appendUTF8ToUTF16ByteString( (cAppCharP)smlitemP->data->content, utf16bytestream, fTypeConfigP->fMSBFirst, lem_none, 0 ); // dispose old data smlLibFree((appPointer)smlitemP->data->content); // create new data block smlitemP->data->content= (void*)( (const char *)smlLibMalloc(utf16bytestream.size()+2) ); smlitemP->data->length = utf16bytestream.size(); // copy contents memcpy((appPointer)smlitemP->data->content,utf16bytestream.c_str(),utf16bytestream.size()); } // compress data if zippedbindata selected in type #ifdef ZIPPED_BINDATA_SUPPORT if (fTypeConfigP->fZippedBindata && fSessionP->getEncoding()==SML_WBXML && fSessionP->getSyncMLVersion()>=syncml_vers_1_1) { // this type uses zipped bindata and we have WBXML (we cannot use zipped bindata in XML) // compress the payload with gzip if there IS any data MemSize_t expandedSize = 0; MemPtr_t expandedPayload = NULL; MemPtr_t zipBinPayload = NULL; // - get expanded data if (smlitemP->data) { if ((expandedSize=smlitemP->data->length)>0) { expandedPayload = (MemPtr_t) smlitemP->data->content; } } if (expandedPayload) { // there is data to send - zip it and send it as binary // - assume output will not be bigger than input zipBinPayload = (MemPtr_t) smlLibMalloc(expandedSize); if (zipBinPayload) { // compress the payload with gzip z_stream zipstream; // - no special alloc zipstream.zalloc=NULL; zipstream.zfree=NULL; zipstream.opaque=NULL; // - no input yet zipstream.next_in=NULL; zipstream.avail_in=0; // - init deflate int comprLevel = fTypeConfigP->fZipCompressionLevel; if (comprLevel>9 || comprLevel<0) comprLevel=Z_DEFAULT_COMPRESSION; deflateInit(&zipstream,comprLevel); // - actually deflate item's ... zipstream.next_in=expandedPayload; zipstream.avail_in=expandedSize; // not more than uncompressed version would take // - ...into new buffer zipstream.next_out=zipBinPayload; zipstream.avail_out=expandedSize; int err = deflate(&zipstream,Z_SYNC_FLUSH); // - replace compressed by expanded data if everything's fine if (err==Z_OK && zipstream.avail_in==0) { // compression ok, set compressed data in place of original smlitemP->data->length=zipstream.total_out; smlitemP->data->content=zipBinPayload; // forget original data smlLibFree(expandedPayload); // only if we have succeeded, we will set the maxobjsize and format Otherwise, we'll send uncompressed data SmlMetInfMetInfPtr_t metaP = smlPCDataToMetInfP(smlitemP->meta); if (!metaP) { // we have no meta yet at all, create it first smlitemP->meta = newMeta(); metaP = (SmlMetInfMetInfPtr_t)(smlitemP->meta->content); } // - store expanded size in meta maxobjsize if (metaP->maxobjsize) smlFreePcdata(metaP->maxobjsize); // delete if there is already something here metaP->maxobjsize=newPCDataLong(expandedSize); // - set format to "bin" as a flag that contents are compressed if (metaP->format) smlFreePcdata(metaP->format); // delete if there is already something here metaP->format=newPCDataString("bin"); } else { // if failed, get rid of unneeded buffer smlLibFree(zipBinPayload); } // update statistics #ifdef SYDEBUG POBJDEBUGPRINTFX(fSessionP,DBG_DATA,( "zippedbindata item statistics: raw=%ld, compressed=%ld, compressed down to %ld%%", (long)expandedSize, (long)smlitemP->data->length, (long)smlitemP->data->length*100/expandedSize )); fRawDataBytes+=expandedSize; fZippedDataBytes+=smlitemP->data->length; #endif // clean up zip compressor deflateEnd(&zipstream); } // can allocate } // if any payload at all } #endif } // set source and target (AFTER setting data, as item data might influence item ID // in some special cases (as for Nokia 9500-style email) // - we will send this item to remote, so target=remote party, source=myself smlitemP->target=newOptLocation(aSyncItemP->getRemoteID()); smlitemP->source=newOptLocation(aSyncItemP->getLocalID()); PDEBUGENDBLOCK("Item_Generate"); } SYSYNC_CATCH (...) PDEBUGENDBLOCK("Item_Generate"); SYSYNC_RETHROW; SYSYNC_ENDCATCH // return smlItem return smlitemP; } // TSyncItemType::newSmlItem /* end of TSyncItemType implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/syncitemtype.h0000755000373300037200000002675512424517753025575 0ustar00nightlyallusers00000000000000/* * File: SyncItemType.h * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncItemType * Type description and converter (template) for TSyncItem. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-16 : luz : created * */ #ifndef SyncItemType_H #define SyncItemType_H #include "sysync_globs.h" namespace sysync { // for hardcoded config, we do not use any C++ strings #ifndef CONFIGURABLE_TYPE_SUPPORT // string pointers only #define TCFG_STRING const char * #define TCFG_CSTR(s) s #define TCFG_ASSIGN(s,c) { if (c) s=c; else s=""; } #define TCFG_CLEAR(s) s="" #define TCFG_ISEMPTY(s) (!s || *s==0) #define TCFG_SIZE(s) (s ? strlen(s) : 0) #else // C++ strings #define TCFG_STRING string #define TCFG_CSTR(s) s.c_str() #define TCFG_ASSIGN(s,c) { if (c) s=c; else s.erase(); } #define TCFG_CLEAR(s) s.erase() #define TCFG_ISEMPTY(s) s.empty() #define TCFG_SIZE(s) s.size() #endif // forward class TSyncSession; class TSyncItemType; class TSyncItem; class TStatusCommand; class TDataTypeConfig; class TLocalEngineDS; class TRemoteDataStore; class TSyncDataStore; // container types typedef std::list TSyncItemTypePContainer; // contains item types // type variant descriptor (for now, a simple pointer, if needed we can make it a class later) typedef void * TTypeVariantDescriptor; const uInt16 ity_syncitem = 0; // must be unique class TSyncItemType : noncopyable { private: void init( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP ); public: // constructor TSyncItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP ); // destructor virtual ~TSyncItemType(); // access to type virtual uInt16 getTypeID(void) const { return ity_syncitem; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_syncitem; }; // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return false; }; // base class is descriptive only // differentiation between type describing local and remote items bool isRemoteType(void) { return fIsRemoteType; }; void defineAsRemoteType(void) { fIsRemoteType = true; }; // compatibility (=assignment compatibility between items based on these types) virtual bool isCompatibleWith(TSyncItemType *aReferenceType) { return this==aReferenceType; } // compatible if same type // get session pointer TSyncSession *getSession(void) { return fSessionP; }; // get session zones pointer GZones *getSessionZones(void); // ret related datastore (can be NULL for session-global types like before DS 1.2) TSyncDataStore *getRelatedDatastore(void) { return fRelatedDatastoreP; }; // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); // apply default limits to type (e.g. from hard-coded template in config) virtual void addDefaultTypeLimits(void) { /* nop */ }; // Prepare datatype for use with a datastore. This might be implemented // in derived classes to initialize the datastore's script context etc. virtual void initDataTypeUse(TLocalEngineDS * /* aDatastoreP */, bool /* aForSending */, bool /* aForReceiving */) { /* nop */ }; // Filtering // - add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc) { /* nop */ }; // - check for special filter keywords the type might want to handle directly virtual bool checkFilterkeywordTerm( cAppCharP aIdent, bool aAssignToMakeTrue, cAppCharP aOp, bool aCaseInsensitive, cAppCharP aVal, bool aSpecialValue ) { return true; /* we do not handle this specially, handle at DS level or include into filter expression */ }; // - init new-style filtering, returns flag if needed at all virtual void initPostFetchFiltering(bool &aNeeded, bool &aNeededForAll, TLocalEngineDS * /* aDatastoreP */) { aNeeded=false; aNeededForAll=false; }; // item read and write // - test if item could contain cut-off data (e.g. because of field size restrictions) // compared to specified reference item virtual bool mayContainCutOffData(TSyncItemType * /* aReferenceType */) { return false; }; // generally, no // - try to extract a version string from actual item data, NULL if none virtual bool versionFromData(SmlItemPtr_t /* aItemP */, string & /* aString */) { return false; }; #ifdef APP_CAN_EXPIRE // test if modified date of item is hard-expired virtual sInt32 expiryFromData(SmlItemPtr_t /* aItemP */, lineardate_t & /* aDat */) { return 0; }; // default to not expired #endif /// create new empty sync item TSyncItem *newSyncItem( TSyncItemType *aTargetItemTypeP, ///< the targeted type (for optimizing field lists etc.) TLocalEngineDS *aLocalDataStoreP ///< local datastore ); /// create new sync item from SyncML data TSyncItem *newSyncItem( SmlItemPtr_t aItemP, ///< SyncML toolkit item Data to be converted into SyncItem TSyncOperation aSyncOp, ///< the operation to be performed with this item TFmtTypes aFormat, ///< the format (normally fmt_chr) TSyncItemType *aTargetItemTypeP, ///< the targeted type (for optimizing field lists etc.) TLocalEngineDS *aLocalDataStoreP, ///< local datastore TStatusCommand &aStatusCmd ///< status command that might be modified in case of error ); /// create new SyncML toolkit item from SyncItem SmlItemPtr_t newSmlItem( TSyncItem *aSyncItemP, ///< the syncitem to be represented as SyncML TLocalEngineDS *aLocalDatastoreP ///< local datastore ); /// @brief get CTCap entry /// @param aOnlyForDS[in] /// - if NULL, CTCap is generated suitable for all datastores /// - if not NULL, CTCap is generated specifically for the datastore passed const SmlDevInfCTCapPtr_t getCTCapDevInf(TLocalEngineDS *aOnlyForDS, TTypeVariantDescriptor aVariantDescriptor, bool aWithoutCTCapProps); /// @brief analyze CTCap for specific type virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP); /// @brief copy CTCap derived info from another SyncItemType virtual bool copyCTCapInfoFrom(TSyncItemType &aSourceItem); /// @brief returns true if type is able to ACCEPT field level updates virtual bool canAcceptFieldLevelUpdates(void) { return false; }; /* no by default */ // - static function to search type in a TSyncItemTypePContainer static TSyncItemType *findTypeInList( TSyncItemTypePContainer &aList, const char *aName, const char *aVers, bool aVersMustMatch, bool aMustBeImplemented, TSyncDataStore *aRelatedDatastoreP ); static TSyncItemType *findTypeInList( TSyncItemTypePContainer &aList, SmlDevInfXmitPtr_t aXmitType, // name and version of type bool aVersMustMatch, bool aMustBeImplemented, TSyncDataStore *aRelatedDatastoreP ); // - static function to analyze CTCap and add entries to passed list static bool analyzeCTCapAndCreateItemTypes( TSyncSession *aSessionP, TRemoteDataStore *aRemoteDataStoreP, // if not NULL, this is the datastore to which this type is local (DS 1.2 case) SmlDevInfCTCapPtr_t aCTCapP, TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes // list to add analyzed types if not already there ); // - static function to add new or copied ItemType to passed list static TSyncItemType *registerRemoteType( TSyncSession *aSessionP, const char *aName, const char *aVers, // name and version of type TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes, // list to add analyzed types if not already there TSyncDataStore *aRelatedDatastoreP ); static TSyncItemType *registerRemoteType( TSyncSession *aSessionP, SmlDevInfXmitPtr_t aXmitTypeP, // name and version of type TSyncItemTypePContainer &aLocalItemTypes, // list to look up local types (for reference) TSyncItemTypePContainer &aNewItemTypes, // list to add analyzed types if not already there TSyncDataStore *aRelatedDatastoreP ); // static helper for creating rx/tx type lists static SmlDevInfXmitListPtr_t newXMitListDevInf( TSyncItemTypePContainer &aTypeList, TSyncItemType *aDontIncludeP ); // type support check virtual bool supportsType(const char *aName, const char *aVers, bool aVersMustMatch=false); bool supportsType(SmlDevInfXmitPtr_t aXmitType, bool aVersMustMatch=false); // - get type name / vers virtual cAppCharP getTypeName(sInt32 aMode=0) { return fTypeName.c_str(); }; virtual cAppCharP getTypeVers(sInt32 aMode=0) { return fTypeVers.c_str(); }; void setTypeVers(const char *aVers) { fTypeVers=aVers; }; bool hasTypeVers(void) { return !fTypeVers.empty(); }; // - read type as Rx/Tx entry SmlDevInfXmitPtr_t newXMitDevInf(void); // - get config pointer of type TDataTypeConfig *getTypeConfig(void) { return fTypeConfigP; }; // - get debug #ifdef SYDEBUG TDebugLogger *getDbgLogger(void); uInt32 getDbgMask(void); #endif protected: // methods // obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor) { return NULL; } // no properties available // Item data management // - create new sync item of proper type. // NOTE: aTargetItemTypeP is passed to allow creation of optimized items for // reception by a specific target type (e.g. common field list optimization etc.) virtual TSyncItem *internalNewSyncItem( TSyncItemType * /* aTargetItemTypeP */, TLocalEngineDS * /* aLocalDatastoreP */ ) { return NULL; } // no op in base class (returns no item) // - fill in SyncML data (but leaves IDs empty) virtual bool internalFillInData( TSyncItem * /* aSyncItemP */, // SyncItem to be filled with data SmlItemPtr_t /* aItemP */, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS * /* aLocalDatastoreP */, // local datastore TStatusCommand & /* aStatusCmd */ // status command that might be modified in case of error ) { return false; } // no op in base class (cannot fill) // - sets data and meta from SyncItem data, but leaves source & target untouched virtual bool internalSetItemData( TSyncItem * /* aSyncItemP */, // the syncitem to be represented as SyncML SmlItemPtr_t /* aItem */, // item with NULL meta and NULL data TLocalEngineDS * /* aLocalDatastoreP */ // local datastore ) { return false; } // no op in base class (leaves item untouched) // session pointer TSyncSession *fSessionP; // the config for this type TDataTypeConfig *fTypeConfigP; private: // the related datastore (for DS 1.2) TSyncDataStore *fRelatedDatastoreP; // the item's type name and version string fTypeName; string fTypeVers; #if defined(ZIPPED_BINDATA_SUPPORT) && defined(SYDEBUG) sInt32 fRawDataBytes; sInt32 fZippedDataBytes; #endif // flag if this is a remote type bool fIsRemoteType; }; // TSyncItemType } // namespace sysync #endif // SyncItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncml_globs.h0000755000373300037200000000342712424517753025522 0ustar00nightlyallusers00000000000000/* * File: syncml_globs.h * * Authors: Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * Global SyncML definitions/macros/constants * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * */ #ifndef SYNCML_GLOBS_H #define SYNCML_GLOBS_H #include "generic_types.h" #ifdef __cplusplus #if defined _MSC_VER && !defined WINCE #include #endif // Consistent support for Linux, MacOSX CW & XCode & Visual Studio #if defined __GNUC__ || defined _MSC_VER #include #else #include #endif // we need the namespace std using namespace std; namespace sysync { #endif // basic SyncML constants #define SYNCML_HDRCMDNAME "SyncHdr" // SyncML Encodings (to be appended to SYNCML_MIME_TYPE and SYNCML_DEVINF_META_TYPE #define SYNCML_ENCODING_XML "xml" #define SYNCML_ENCODING_WBXML "wbxml" // - spearator between MIME-Type and encoding string #define SYNCML_ENCODING_SEPARATOR "+" // SyncML content type constants #define SYNCML_MIME_TYPE "application/vnd.syncml" // plus encoding // SyncML charset #define SYNCML_DEFAULT_CHARSET "utf-8" // prefix for relative URIs #define URI_RELPREFIX "./" // SyncML DEVINF constants #define SYNCML_DEVINF_LOCNAME "Device Information" #define SYNCML_DEVINF_META_TYPE "application/vnd.syncml-devinf" // plus encoding ! #define SYNCML_META_VERSION "syncml:metinf" // SyncML Filter grammars #define SYNCML_FILTERTYPE_CGI "syncml:filtertype-cgi" #define SYNCML_FILTERTYPE_CGI_VERS "1.0" #define SYNCML_FILTERTYPE_INCLUSIVE "INCLUSIVE" #define SYNCML_FILTERTYPE_EXCLUSIVE "EXCLUSIVE" // SyncML encodings // Note: SmlEncoding_t is defined in the RTK smldef.h #define numSyncMLEncodings (SML_XML-SML_UNDEF+1) #ifdef __cplusplus } // namespace sysync #endif #endif // SYNCML_GLOBS_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncml_tk.h0000755000373300037200000000014512424517753025024 0ustar00nightlyallusers00000000000000/* sysync SyncML toolkit includes */ #ifndef SYNCML_TK_HPP #define SYNCML_TK_HPP #include #endif syncevolution-1.5/src/synthesis/src/sysync/syncsession.cpp0000644000373300037200000072217512424517753025747 0ustar00nightlyallusers00000000000000/* * TSyncSession * Represents an entire Synchronisation Session, possibly consisting * of multiple SyncML-Toolkit "Sessions" (Message composition/de- * composition) as well as multiple database synchronisations. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-07 : luz : Created * */ #include "prefix_file.h" #include "sysync.h" #include "syncsession.h" #include "syncagent.h" #ifdef SUPERDATASTORES #include "superdatastore.h" #endif #ifdef SCRIPT_SUPPORT #include "scriptcontext.h" #endif #ifdef MULTI_THREAD_SUPPORT #include "platform_thread.h" #endif #include #include #ifndef SYNCSESSION_PART1_EXCLUDE namespace sysync { // enum names // ---------- // SyncML version info const char * const SyncMLVerProtoNames[numSyncMLVersions] = { "undefined", "SyncML/1.0", "SyncML/1.1", "SyncML/1.2" }; const SmlVersion_t SmlVersionCodes[numSyncMLVersions] = { SML_VERS_UNDEF, SML_VERS_1_0, SML_VERS_1_1, SML_VERS_1_2 }; const char * const SyncMLVerDTDNames[numSyncMLVersions] = { "???", "1.0", "1.1", "1.2" }; const char * const SyncMLDevInfNames[numSyncMLVersions] = { NULL, "./devinf10", "./devinf11", "./devinf12" }; #ifndef HARDCODED_CONFIG // version for use in config files const char * const SyncMLVersionNames[numSyncMLVersions] = { "unknown", "1.0", "1.1", "1.2" }; #endif // auth type names for config const char * const authTypeNames[numAuthTypes] = { "none", // no authorisation "basic", // basic (B64 encoded user pw string) "md5", // Md5 encoded user:pw:nonce }; // sync mode names const char * const SyncModeNames[numSyncModes] = { "twoway", "fromserver", "fromclient" }; #ifdef SYDEBUG // package state names const char * const PackageStateNames[numPackageStates] = { "idle", "init", "sync", "initsync", "map", "supplement" }; // sync operations const char * const SyncOpNames[numSyncOperations] = { "wants-add", "add", "wants-replace", "replace", "reference-only", "archive+delete", "soft-delete", "delete", "copy", "move", "[none]" // should be last }; #endif // sync mode descriptions const char * const SyncModeDescriptions[numSyncModes] = { "two-way", "from server only", "from client only" }; #ifdef SCRIPT_SUPPORT // builtin functions for status-handling scripts // integer STATUS() static void func_Status(TItemField *&aTermP, TScriptContext *aFuncContextP) { TErrorFuncContext *errctxP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsInteger( errctxP->statuscode ); } // func_Status // void SETSTATUS(integer statuscode) static void func_SetStatus(TItemField *&aTermP, TScriptContext *aFuncContextP) { TErrorFuncContext *errctxP = static_cast(aFuncContextP->getCallerContext()); errctxP->newstatuscode= aFuncContextP->getLocalVar(0)->getAsInteger(); } // func_SetStatus // void SETRESEND(boolean doresend) static void func_SetResend(TItemField *&aTermP, TScriptContext *aFuncContextP) { TErrorFuncContext *errctxP = static_cast(aFuncContextP->getCallerContext()); errctxP->resend= aFuncContextP->getLocalVar(0)->getAsBoolean(); } // func_SetResend // void ABORTDATASTORE(integer statuscode) static void func_AbortDatastore(TItemField *&aTermP, TScriptContext *aFuncContextP) { TErrorFuncContext *errctxP = static_cast(aFuncContextP->getCallerContext()); if (errctxP->datastoreP) { errctxP->datastoreP->engAbortDataStoreSync(aFuncContextP->getLocalVar(0)->getAsInteger(),true); // we cause the abort locally } } // func_AbortDatastore // void STOPADDING() static void func_StopAdding(TItemField *&aTermP, TScriptContext *aFuncContextP) { TErrorFuncContext *errctxP = static_cast(aFuncContextP->getCallerContext()); if (errctxP->datastoreP) { errctxP->datastoreP->engStopAddingToRemote(); } } // func_StopAdding // string SYNCOP() // returns sync-operation as text static void func_SyncOp(TItemField *&aTermP, TScriptContext *aFuncContextP) { TErrorFuncContext *errctxP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString( SyncOpNames[errctxP->syncop] ); } // func_SyncOp const uInt8 param_OneInteger[] = { VAL(fty_integer) }; const uInt8 param_TwoIntegers[] = { VAL(fty_integer), VAL(fty_integer) }; const uInt8 param_OneString[] = { VAL(fty_string) }; const TBuiltInFuncDef ErrorFuncDefs[] = { { "STATUS", func_Status, fty_integer, 0, NULL }, { "SETSTATUS", func_SetStatus, fty_none, 1, param_OneInteger }, { "SETRESEND", func_SetResend, fty_none, 1, param_OneInteger }, { "ABORTDATASTORE", func_AbortDatastore, fty_none, 1, param_OneInteger }, { "STOPADDING", func_StopAdding, fty_none, 0, NULL }, { "SYNCOP", func_SyncOp, fty_string, 0, NULL }, }; const TFuncTable ErrorFuncTable = { sizeof(ErrorFuncDefs) / sizeof(TBuiltInFuncDef), // size of table ErrorFuncDefs, // table pointer NULL // no chain func }; // void SETSTATUS(integer statuscode) static void func_GetPutResSetStatus(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); gprctxP->statuscode= aFuncContextP->getLocalVar(0)->getAsInteger(); } // func_GetPutResSetStatus // integer ISPUT() static void func_IsPut(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsBoolean(gprctxP->isPut); } // func_IsPut // string ITEMURI() static void func_ItemURI(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(gprctxP->itemURI); } // func_ItemURI // void SETITEMURI(string data) static void func_SetItemURI(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(gprctxP->itemURI); } // func_SetItemURI // string ITEMDATA() static void func_ItemData(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(gprctxP->itemData); } // func_ItemData // void SETITEMDATA(string data) static void func_SetItemData(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(gprctxP->itemData); } // func_SetItemData // string METATYPE() static void func_MetaType(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aTermP->setAsString(gprctxP->metaType); } // func_MetaType // void SETMETATYPE(string data) static void func_SetMetaType(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); aFuncContextP->getLocalVar(0)->getAsString(gprctxP->metaType); } // func_SetMetaType // void ISSUEPUT(boolean allowFailure, boolean noResp) // use ITEMURI, ITEMDATA and METATYPE to issue a PUT command static void func_IssuePut(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); if (gprctxP->canIssue) { TPutCommand *putcommandP = new TPutCommand(aFuncContextP->getSession()); putcommandP->setMeta(newMetaType(gprctxP->metaType.c_str())); SmlItemPtr_t putItemP = putcommandP->addSourceLocItem(gprctxP->itemURI.c_str()); // - add data to item putItemP->data = newPCDataString(gprctxP->itemData); // issue it if (aFuncContextP->getLocalVar(0)->getAsBoolean()) putcommandP->allowFailure(); // allow failure (4xx or 5xx status) aFuncContextP->getSession()->issueRootPtr(putcommandP,aFuncContextP->getLocalVar(1)->getAsBoolean()); } } // func_IssuePut // void ISSUEGET(boolean allowFailure) // use ITEMURI and METATYPE to issue a GET command static void func_IssueGet(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); if (gprctxP->canIssue) { TGetCommand *getcommandP = new TGetCommand(aFuncContextP->getSession()); getcommandP->addTargetLocItem(gprctxP->itemURI.c_str()); getcommandP->setMeta(newMetaType(gprctxP->metaType.c_str())); // issue it if (aFuncContextP->getLocalVar(0)->getAsBoolean()) getcommandP->allowFailure(); // allow failure (4xx or 5xx status) aFuncContextP->getSession()->issueRootPtr(getcommandP,false); // get with noResp does not make sense } } // func_IssueGet // void ISSUEALERT(boolean allowFailure, integer alertcode) // use ITEMDATA to add an Alert item static void func_IssueAlert(TItemField *&aTermP, TScriptContext *aFuncContextP) { TGetPutResultFuncContext *gprctxP = static_cast(aFuncContextP->getCallerContext()); if (gprctxP->canIssue) { uInt16 alertcode = aFuncContextP->getLocalVar(1)->getAsInteger(); TAlertCommand *alertCommandP = new TAlertCommand(aFuncContextP->getSession(),NULL,alertcode); // - add string data item alertCommandP->addItem(newStringDataItem(gprctxP->itemData.c_str())); // issue it if (aFuncContextP->getLocalVar(0)->getAsBoolean()) alertCommandP->allowFailure(); // allow failure (4xx or 5xx status) aFuncContextP->getSession()->issueRootPtr(alertCommandP,false); // Alert with noResp not supported } } // func_IssueAlert const TBuiltInFuncDef GetPutResultFuncDefs[] = { { "SETSTATUS", func_GetPutResSetStatus, fty_none, 1, param_OneInteger }, { "ISPUT", func_IsPut, fty_integer, 0, NULL }, { "ITEMURI", func_ItemURI, fty_string, 0, NULL }, { "SETITEMURI", func_SetItemURI, fty_none, 1, param_OneString }, { "ITEMDATA", func_ItemData, fty_string, 0, NULL }, { "SETITEMDATA", func_SetItemData, fty_none, 1, param_OneString }, { "METATYPE", func_MetaType, fty_string, 0, NULL }, { "SETMETATYPE", func_SetMetaType, fty_none, 1, param_OneString }, { "ISSUEPUT", func_IssuePut, fty_none, 2, param_TwoIntegers }, { "ISSUEGET", func_IssueGet, fty_none, 1, param_OneInteger }, { "ISSUEALERT", func_IssueAlert, fty_none, 2, param_TwoIntegers } }; const TFuncTable GetPutResultFuncTable = { sizeof(GetPutResultFuncDefs) / sizeof(TBuiltInFuncDef), // size of table GetPutResultFuncDefs, // table pointer NULL // no chain func }; #endif #ifndef NO_REMOTE_RULES // Remote Rule Config // ================== #define DONT_REJECT 0xFFFF // config constructor TRemoteRuleConfig::TRemoteRuleConfig(const char *aElementName, TConfigElement *aParentElementP) : TConfigElement(aElementName,aParentElementP) { clear(); } // TRemoteRuleConfig::TRemoteRuleConfig // config destructor TRemoteRuleConfig::~TRemoteRuleConfig() { if (fOverrideDevInfBufferP) smlFreeProtoElement(fOverrideDevInfBufferP); clear(); } // TRemoteRuleConfig::~TRemoteRuleConfig // init defaults void TRemoteRuleConfig::clear(void) { // init defaults // - id fManufacturer.erase(); fModel.erase(); fOem.erase(); fFirmwareVers.erase(); fSoftwareVers.erase(); fHardwareVers.erase(); fDevId.erase(); fDevTyp.erase(); // - options fRejectStatusCode=DONT_REJECT; // not rejected fLegacyMode=-1; // set if remote is known legacy, so don't use new types fLenientMode=-1; // set if remote's SyncML should be handled leniently, i.e. not too strict checking where not absolutely needed fLimitedFieldLengths=-1; // set if remote has limited field lengths fDontSendEmptyProperties=-1; // set if remote does not want empty properties fDoQuote8BitContent=-1; // normally, only use QP for contents with EOLNs in vCard 2.1 fDoNotFoldContent=-1; // normally, content must be folded in MIME-DIR fNoReplaceInSlowsync=-1; // normally, we are allowed to use Replace (as server) in slow sync fTreatRemoteTimeAsLocal=-1; // do not ignore time zone fTreatRemoteTimeAsUTC=-1; // do not ignore time zone fVCal10EnddatesSameDay=-1; // use default end date rendering fIgnoreDevInfMaxSize=-1; // do not ignore max field size in remote's devInf fIgnoreCTCap=-1; // do not ignore CTCap fDSPathInDevInf=-1; // use actual DS path as used in Alert for creating datastore devInf (needed for newer Nokia clients) fDSCgiInDevInf=-1; // also show CGI as used in Alert for creating datastore devInf (needed for newer Nokia clients) fForceUTC=-1; // automatic decision based on DevInf (SyncML 1.1) or just UTC for SyncML 1.0 fForceLocaltime=-1; fTreatCopyAsAdd=-1; fCompleteFromClientOnly=-1; fRequestMaxTime=-1; // not defined fDefaultOutCharset=chs_unknown; // do not set the default output charset fDefaultInCharset=chs_unknown; // do not set the default input interpretation charset // - options that also have a configurable session default fUpdateClientDuringSlowsync=-1; fUpdateServerDuringSlowsync=-1; fAllowMessageRetries=-1; fStrictExecOrdering=-1; #ifndef MINIMAL_CODE fRemoteDescName.erase(); #endif fSubRulesList.clear(); // no included subrules fSubRule = false; // normal rule by default // - rules are final by default fFinalRule = true; // no DevInf by default fOverrideDevInfP = NULL; fOverrideDevInfBufferP = NULL; // clear inherited inherited::clear(); } // TRemoteRuleConfig::clear #ifndef HARDCODED_CONFIG // remote rule config element parsing bool TRemoteRuleConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements // - identification of remote (irrelevant for subrules) if (!fSubRule && strucmp(aElementName,"manufacturer")==0) expectString(fManufacturer); else if (!fSubRule && strucmp(aElementName,"model")==0) expectString(fModel); else if (!fSubRule && strucmp(aElementName,"oem")==0) expectString(fOem); else if (!fSubRule && strucmp(aElementName,"firmware")==0) expectString(fFirmwareVers); else if (!fSubRule && strucmp(aElementName,"software")==0) expectString(fSoftwareVers); else if (!fSubRule && strucmp(aElementName,"hardware")==0) expectString(fHardwareVers); else if (!fSubRule && strucmp(aElementName,"deviceid")==0) expectString(fDevId); else if (!fSubRule && strucmp(aElementName,"devicetype")==0) expectString(fDevTyp); // - options else if (strucmp(aElementName,"legacymode")==0) expectTristate(fLegacyMode); else if (strucmp(aElementName,"lenientmode")==0) expectTristate(fLenientMode); else if (strucmp(aElementName,"limitedfieldlengths")==0) expectTristate(fLimitedFieldLengths); else if (strucmp(aElementName,"noemptyproperties")==0) expectTristate(fDontSendEmptyProperties); else if (strucmp(aElementName,"quote8bitcontent")==0) expectTristate(fDoQuote8BitContent); else if (strucmp(aElementName,"nocontentfolding")==0) expectTristate(fDoNotFoldContent); else if (strucmp(aElementName,"noreplaceinslowsync")==0) expectTristate(fNoReplaceInSlowsync); else if (strucmp(aElementName,"treataslocaltime")==0) expectTristate(fTreatRemoteTimeAsLocal); else if (strucmp(aElementName,"treatasutc")==0) expectTristate(fTreatRemoteTimeAsUTC); else if (strucmp(aElementName,"autoenddateinclusive")==0) expectTristate(fVCal10EnddatesSameDay); else if (strucmp(aElementName,"ignoredevinfmaxsize")==0) expectTristate(fIgnoreDevInfMaxSize); else if (strucmp(aElementName,"ignorectcap")==0) expectTristate(fIgnoreCTCap); else if (strucmp(aElementName,"dspathindevinf")==0) expectTristate(fDSPathInDevInf); else if (strucmp(aElementName,"dscgiindevinf")==0) expectTristate(fDSCgiInDevInf); else if (strucmp(aElementName,"updateclientinslowsync")==0) expectTristate(fUpdateClientDuringSlowsync); else if (strucmp(aElementName,"updateserverinslowsync")==0) expectTristate(fUpdateServerDuringSlowsync); else if (strucmp(aElementName,"allowmessageretries")==0) expectTristate(fAllowMessageRetries); else if (strucmp(aElementName,"strictexecordering")==0) expectTristate(fStrictExecOrdering); else if (strucmp(aElementName,"treatcopyasadd")==0) expectTristate(fTreatCopyAsAdd); else if (strucmp(aElementName,"completefromclientonly")==0) expectTristate(fCompleteFromClientOnly); else if (strucmp(aElementName,"requestmaxtime")==0) expectInt32(fRequestMaxTime); else if (strucmp(aElementName,"outputcharset")==0) expectEnum(sizeof(fDefaultOutCharset),&fDefaultOutCharset,MIMECharSetNames,numCharSets); else if (strucmp(aElementName,"inputcharset")==0) expectEnum(sizeof(fDefaultInCharset),&fDefaultInCharset,MIMECharSetNames,numCharSets); else if (strucmp(aElementName,"rejectstatus")==0) expectUInt16(fRejectStatusCode); else if (strucmp(aElementName,"forceutc")==0) expectTristate(fForceUTC); else if (strucmp(aElementName,"forcelocaltime")==0) expectTristate(fForceLocaltime); else if (strucmp(aElementName,"overridedevinf")==0) expectString(fOverrideDevInfXML); // inclusion of subrules else if (strucmp(aElementName,"include")==0) { // expectEmpty(); const char* nam = getAttr(aAttributes,"rule"); if (!nam) return fail(" must specify \"rule\""); else { // find rule TRemoteRulesList::iterator pos; TSessionConfig *scfgP = static_cast(getParentElement()); for(pos=scfgP->fRemoteRulesList.begin();pos!=scfgP->fRemoteRulesList.end();pos++) { if (strucmp(nam,(*pos)->getName())==0) { fSubRulesList.push_back(*pos); return true; // done } } return fail("rule '%s' for not found (must be defined before included)",nam); } } // rule script. Note that this is special, as it is NOT resolved in the config, but // copied to the session first, as it might differ between sessions. #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"rulescript")==0) expectScript(fRuleScriptTemplate,aLine,NULL,true); // late binding, no declarations allowed #endif #ifndef MINIMAL_CODE else if (strucmp(aElementName,"descriptivename")==0) expectString(fRemoteDescName); #endif // - final rule? else if (strucmp(aElementName,"finalrule")==0) expectBool(fFinalRule); // - not known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TRemoteRuleConfig::localStartElement #endif // HARDCODED_CONFIG #endif // NO_REMOTE_RULES #endif // not SYNCSESSION_PART1_EXCLUDE #ifndef SYNCSESSION_PART2_EXCLUDE // Session Config // ============== // config constructor TSessionConfig::TSessionConfig(const char *aElementName, TConfigElement *aParentElementP) : inherited(aElementName,aParentElementP) { clear(); } // TSessionConfig::TSessionConfig // config destructor TSessionConfig::~TSessionConfig() { clear(); } // TSessionConfig::~TSessionConfig // init defaults void TSessionConfig::clear(void) { // init defaults #ifndef NO_REMOTE_RULES // - no remote rules TRemoteRulesList::iterator pos; for(pos=fRemoteRulesList.begin();pos!=fRemoteRulesList.end();pos++) delete *pos; fRemoteRulesList.clear(); #endif // remove datastores TLocalDSList::iterator pos2; for(pos2=fDatastores.begin();pos2!=fDatastores.end();pos2++) delete *pos2; fDatastores.clear(); // - no simple auth fSimpleAuthUser.erase(); fSimpleAuthPassword.erase(); // - medium timeout fSessionTimeout = 60; // one minute, will be overridden by derived classes // - set default maximum SyncML version enabled fMaxSyncMLVersionSupported = MAX_SYNCML_VERSION; // - minimum is 1.0 fMinSyncMLVersionSupported=syncml_vers_1_0; // - accept server-alerted codes by default fAcceptServerAlerted = true; // - defaults for remote-rule configurable behaviour fUpdateClientDuringSlowsync = false; // do not update client records during slowsync (but do it for first sync!) fUpdateServerDuringSlowsync = false; // do not update server records during NON-FIRST-TIME slowsync (but do it for first sync!) fAllowMessageRetries = true; // generally allow retries fCompleteFromClientOnly = false; // default to standard-compliant behaviour. fRequestMaxTime = 0; // no limit by default fRequestMinTime = 0; // no minimal request processing delay // - default value for flag to send property lists in CTCap fShowCTCapProps = true; // - default value for flag to send type/size in CTCap for SyncML 1.0 (disable as old clients like S55 crash on this) fShowTypeSzInCTCap10 = false; // - sync mode extensions may be needed for SyncEvolution, but are causing troubles with Nokia phones and some servers so these are off by default fSyncModeExtensions = false; if (IS_CLIENT) { // - Synthesis clients always behaved like that (sending 23:59:59), so we'll keep it as a default fVCal10EnddatesSameDay = true; } else { // - Many modern clients need the exclusive format (start of next day) to detect all-day events properly. // Synthesis clients detect these fine as well, so not using 23:59:59 style by default is more // compatible in general for a server. fVCal10EnddatesSameDay = false; } // traditionally Synthesis has folded content fDoNotFoldContent = false; // - default value for flag is "default" (depends on SyncML version) fEnumDefaultPropParams=-1; // - decide, whether multi-threading for the datastores will be used: // As there are some problems with older Linux versions (e.g. Debian 3.0r2 stable) the // default values are set for downwards compatibility Linux=false / all others=true // Multithreading can be switched of either by #define or by flag #if defined LINUX || !defined MULTI_THREAD_DATASTORE fMultiThread= false; #else fMultiThread= true; #endif // - do not wait for status of interrupted command by default (note: before 2.1.0.2, this was always true) fWaitForStatusOfInterrupted=false; // - accept delete commands for already deleted items with 200 (rather that 404 or 211) #ifdef SCTS_COMPATIBILITY_HACKS fDeletingGoneOK=false; // SCTS needs that #else fDeletingGoneOK=true; // makes more sense as it avoids unnecessary session aborts #endif // - abort if all items sent to remote fail fAbortOnAllItemsFailed=true; // note: does only apply in slow syncs now! // - default to system time fUserTimeContext=TCTX_SYSTEM; #ifdef SCRIPT_SUPPORT // - session init script fSessionInitScript.erase(); // - status handling scripts fSentItemStatusScript.erase(); fReceivedItemStatusScript.erase(); // - session termination script fSessionFinishScript.erase(); // - custom get handler fCustomGetHandlerScript.erase(); // - custom get and put generators fCustomGetPutScript.erase(); fCustomEndPutScript.erase(); // - custom PUT and RESULT handler fCustomPutResultHandlerScript.erase(); #endif #ifndef MINIMAL_CODE // - logfile fLogFileName.erase(); if (IS_SERVER) { fLogFileFormat.assign(DEFAULT_LOG_FORMAT_SERVER); fLogFileLabels.assign(DEFAULT_LOG_LABELS_SERVER); } else { fLogFileFormat.assign(DEFAULT_LOG_FORMAT_CLIENT); fLogFileLabels.assign(DEFAULT_LOG_LABELS_CLIENT); } fLogEnabled=true; fDebugChunkMaxSize=0; // disabled #endif fRelyOnEarlyMaps=true; // we rely on early maps sent by clients for adds from the previous session // clear inherited inherited::clear(); } // TSessionConfig::clear // get local DS config pointer by database name or dbTypeID TLocalDSConfig *TSessionConfig::getLocalDS(const char *aName, uInt32 aDBTypeID) { TLocalDSList::iterator pos; for(pos=fDatastores.begin();pos!=fDatastores.end();pos++) { if (aName==NULL) { if ((*pos)->fLocalDBTypeID==aDBTypeID) return *pos; // found by DBTypeID } else { if (strucmp((*pos)->getName(),aName)==0) return *pos; // found by name } } return NULL; // not found } // TSessionConfig::getLocalDS #ifndef HARDCODED_CONFIG // server config element parsing bool TSessionConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements #ifndef NO_REMOTE_RULES bool isSubRule = strucmp(aElementName,"subrule")==0; if (strucmp(aElementName,"remoterule")==0 || isSubRule) { // check for optional name attribute const char* nam = getAttr(aAttributes,"name"); if (!nam) nam="unnamed"; // create rule TRemoteRuleConfig *ruleP = new TRemoteRuleConfig(nam,this); ruleP->fSubRule = isSubRule; fRemoteRulesList.push_back(ruleP); expectChildParsing(*ruleP); } else #endif if (strucmp(aElementName,"sessiontimeout")==0) expectInt32(fSessionTimeout); else if (strucmp(aElementName,"requestmaxtime")==0) expectUInt32(fRequestMaxTime); else if (strucmp(aElementName,"requestmintime")==0) expectInt32(fRequestMinTime); else if (strucmp(aElementName,"simpleauthuser")==0) expectString(fSimpleAuthUser); else if (strucmp(aElementName,"simpleauthpw")==0) expectString(fSimpleAuthPassword); else if (strucmp(aElementName,"maxsyncmlversion")==0) expectEnum(sizeof(fMaxSyncMLVersionSupported),&fMaxSyncMLVersionSupported,SyncMLVersionNames,numSyncMLVersions); else if (strucmp(aElementName,"minsyncmlversion")==0) expectEnum(sizeof(fMinSyncMLVersionSupported),&fMinSyncMLVersionSupported,SyncMLVersionNames,numSyncMLVersions); else if (strucmp(aElementName,"acceptserveralerted")==0) expectBool(fAcceptServerAlerted); else if (strucmp(aElementName,"updateclientinslowsync")==0) expectBool(fUpdateClientDuringSlowsync); else if (strucmp(aElementName,"updateserverinslowsync")==0) expectBool(fUpdateServerDuringSlowsync); else if (strucmp(aElementName,"completefromclientonly")==0) expectBool(fCompleteFromClientOnly); else if (strucmp(aElementName,"allowmessageretries")==0) expectBool(fAllowMessageRetries); else if (strucmp(aElementName,"multithread")==0) expectBool(fMultiThread); else if (strucmp(aElementName,"waitforstatusofinterrupted")==0) expectBool(fWaitForStatusOfInterrupted); else if (strucmp(aElementName,"deletinggoneok")==0) expectBool(fDeletingGoneOK); else if (strucmp(aElementName,"abortonallitemsfailed")==0) expectBool(fAbortOnAllItemsFailed); else if (strucmp(aElementName,"showctcapproperties")==0) expectBool(fShowCTCapProps); else if (strucmp(aElementName,"showtypesizeinctcap10")==0) expectBool(fShowTypeSzInCTCap10); else if (strucmp(aElementName,"syncmodeextensions")==0) expectBool(fSyncModeExtensions); else if (strucmp(aElementName,"autoenddateinclusive")==0) expectBool(fVCal10EnddatesSameDay); else if (strucmp(aElementName,"donotfoldcontent")==0) expectBool(fDoNotFoldContent); else if (strucmp(aElementName,"enumdefaultpropparams")==0) expectTristate(fEnumDefaultPropParams); // Tristate!!! else if (strucmp(aElementName,"usertimezone")==0) expectTimezone(fUserTimeContext); #ifdef SCRIPT_SUPPORT else if (strucmp(aElementName,"sessioninitscript")==0) expectScript(fSessionInitScript,aLine,NULL); else if (strucmp(aElementName,"sentitemstatusscript")==0) expectScript(fSentItemStatusScript,aLine,&ErrorFuncTable); else if (strucmp(aElementName,"receiveditemstatusscript")==0) expectScript(fReceivedItemStatusScript,aLine,&ErrorFuncTable); else if (strucmp(aElementName,"sessionfinishscript")==0) expectScript(fSessionFinishScript,aLine,NULL); else if (strucmp(aElementName,"customgethandlerscript")==0) expectScript(fCustomGetHandlerScript,aLine,&GetPutResultFuncTable); else if (strucmp(aElementName,"customgetputscript")==0) expectScript(fCustomGetPutScript,aLine,&GetPutResultFuncTable); else if (strucmp(aElementName,"customendputscript")==0) expectScript(fCustomEndPutScript,aLine,&GetPutResultFuncTable); else if (strucmp(aElementName,"customputresulthandlerscript")==0) expectScript(fCustomPutResultHandlerScript,aLine,&GetPutResultFuncTable); #endif #ifndef MINIMAL_CODE // logfile else if (strucmp(aElementName,"logfile")==0) expectMacroString(fLogFileName); else if (strucmp(aElementName,"logformat")==0) expectCString(fLogFileFormat); else if (strucmp(aElementName,"loglabels")==0) expectCString(fLogFileLabels); else if (strucmp(aElementName,"logenabled")==0) expectBool(fLogEnabled); else if (strucmp(aElementName,"debugchunkmaxsize")==0) expectUInt32(fDebugChunkMaxSize); #endif else if (strucmp(aElementName,"relyonearlymaps")==0) expectBool(fRelyOnEarlyMaps); // - local datastores else if (strucmp(aElementName,"datastore")==0) { // definition of a new datastore const char* nam = getAttr(aAttributes,"name"); if (!nam) { ReportError(true,"datastore missing 'name' attribute"); } else { // get subtype attribute (some versions can have // different datastore types in same agent) const char* subtype = getAttr(aAttributes,"type"); // create new named datastore TLocalDSConfig *datastorecfgP = newDatastoreConfig(nam,subtype,this); if (!datastorecfgP) ReportError(true,"datastore has unknown 'type' attribute"); else { // - save in list fDatastores.push_back(datastorecfgP); // - let element handle parsing expectChildParsing(*datastorecfgP); } } } #ifdef SUPERDATASTORES // - superdatastore else if (strucmp(aElementName,"superdatastore")==0) { // definition of a new datastore const char* nam = getAttr(aAttributes,"name"); if (!nam) { ReportError(true,"datastore missing 'name' attribute"); } else { // create new named datastore TLocalDSConfig *datastorecfgP = new TSuperDSConfig(nam,this); // - save in list fDatastores.push_back(datastorecfgP); // - let element handle parsing expectChildParsing(*datastorecfgP); } } #endif // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TSessionConfig::localStartElement #endif // resolve void TSessionConfig::localResolve(bool aLastPass) { // resolve if (aLastPass) { #ifndef NO_REMOTE_RULES // - resolve rules and parse OverrideDevInf TRemoteRulesList::iterator pos; for(pos=fRemoteRulesList.begin();pos!=fRemoteRulesList.end();pos++) { (*pos)->Resolve(aLastPass); if (!(*pos)->fOverrideDevInfXML.empty()) { // SMLTK expects full SyncML message string buffer = "" "1.2" "SyncML/1.2" "1" "1" "foo" "bar" "" "" "" "1" "1" "1" "" "application/vnd.syncml-devinf+xml" "" "" "" "./devinf12" "" "" ; buffer += (*pos)->fOverrideDevInfXML; buffer += "" "" "" "" ""; MemPtr_t xml = (unsigned char *)buffer.c_str(); XltDecoderPtr_t decoder = NULL; SmlSyncHdrPtr_t hdr = NULL; Ret_t ret = xltDecInit(SML_XML, xml + buffer.size(), &xml, &decoder, &hdr); if (ret != SML_ERR_OK) { fRootElementP->setError(true, "initializing scanner for DevInf failed"); } else { smlFreeProtoElement(hdr); SmlProtoElement_t element; VoidPtr_t content = NULL; ret = xltDecNext(decoder, xml + buffer.size(), &xml, &element, &content); if (ret != SML_ERR_OK) { fRootElementP->setError(true, "parsing of OverrideDevInf failed"); } else if (element != SML_PE_RESULTS || !((SmlResultsPtr_t)content)->itemList || !((SmlResultsPtr_t)content)->itemList->item || !((SmlResultsPtr_t)content)->itemList->item->data || ((SmlResultsPtr_t)content)->itemList->item->data->contentType != SML_PCDATA_EXTENSION || ((SmlResultsPtr_t)content)->itemList->item->data->extension != SML_EXT_DEVINF) { fRootElementP->setError(true, "parsing of DevInf returned unexpected result"); if (content) smlFreeProtoElement(content); } else { (*pos)->fOverrideDevInfP = (SmlDevInfDevInfPtr_t)((SmlResultsPtr_t)content)->itemList->item->data->content; (*pos)->fOverrideDevInfBufferP = content; } } if (decoder) xltDecTerminate(decoder); } } #endif TLocalDSList::iterator pos2; for(pos2=fDatastores.begin();pos2!=fDatastores.end();pos2++) (*pos2)->Resolve(aLastPass); #ifdef SCRIPT_SUPPORT TScriptContext *sccP = NULL; SYSYNC_TRY { // resolve all scripts in same context // - init scripts TScriptContext::resolveScript(getSyncAppBase(),fSessionInitScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fSentItemStatusScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fReceivedItemStatusScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fSessionFinishScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fCustomGetHandlerScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fCustomGetPutScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fCustomEndPutScript,sccP,NULL); TScriptContext::resolveScript(getSyncAppBase(),fCustomPutResultHandlerScript,sccP,NULL); // - forget this context if (sccP) delete sccP; } SYSYNC_CATCH (...) if (sccP) delete sccP; SYSYNC_RETHROW; SYSYNC_ENDCATCH #endif } // resolve inherited inherited::localResolve(aLastPass); } // TSessionConfig::localResolve // TSyncSession // ============ // constructor TSyncSession::TSyncSession( TSyncAppBase *aSyncAppBaseP, // the owning application base (dispatcher/client base) const char *aSessionID // a session ID ) : #ifdef SYDEBUG fSessionDebugLogs(0), #endif fTerminated(false), #ifdef SYDEBUG fSessionLogger(&fSessionZones), #endif fSyncAppBaseP(aSyncAppBaseP) // link to owning base (dispatcher/clienbase) { // Inherit globally defined time zones // Note: this must be done as very first step as all time output routines will use the // session zones fSessionZones = *(fSyncAppBaseP->getAppZones()); // now mark used to avoid early timeout (will be marked again at InternalResetSession()) SessionUsed(); fLastRequestStarted=getSessionLastUsed(); // set this in case we terminate before StartMessage() fSessionStarted=fLastRequestStarted; // this is also the start of the session // show creation DEBUGPRINTFX(DBG_OBJINST,("++++++++ TSyncSession created")); // assign session ID to have debug ID on correct channel fLocalSessionID.assign(aSessionID); DEBUGPRINTFX(DBG_EXOTIC,("TSyncSession::TSyncSession: Session ID assigned")); // init and start profiling MP_SHOWCURRENT(DBG_PROFILE,"TSyncSession::TSyncSession: TSyncSession created"); TP_INIT(fTPInfo); TP_START(fTPInfo,TP_general); DEBUGPRINTFX(DBG_EXOTIC,("TSyncSession::TSyncSession: Profiling initialized")); // set fields fEncoding = SML_UNDEF; fLocalAbortReason = true; // unless set otherwise fAbortReasonStatus = 0; fSessionIsBusy = false; // not busy by default fSmlWorkspaceID = 0; // no SyncML toolkit workspace ID yet fMaxRoomForData = getRootConfig()->fLocalMaxMsgSize; // rough init // other pointers #ifdef SCRIPT_SUPPORT fSessionScriptContextP = NULL; #endif fInterruptedCommandP = NULL; fIncompleteDataCommandP = NULL; #ifdef SYNCSTATUS_AT_SYNC_CLOSE fSyncCloseStatusCommandP=NULL; #endif fCmdIncoming=NULL; // we do not know anything about remote datastores yet fRemoteDevInfKnown=false; fRemoteDataStoresKnown=false; fRemoteDataTypesKnown=false; fRemoteDevInfLock=false; // we have not sent any devinf to the remote yet fRemoteGotDevinf=false; fRemoteMustSeeDevinf=false; fCustomGetPutSent=false; // assume normal, full-featured session. Profile config or session progress might set this flag later fLegacyMode = false; fLenientMode = false; //initialize the conditonal variables to keep valgrind happy fNeedAuth = true; fRemoteRequestedAuth = auth_none; #ifdef SYDEBUG // initialize session debug logging fSessionDebugLogs=getRootConfig()->fDebugConfig.fSessionDebugLogs; /// init from config @todo: get rid of this special session level flag, handle it all via session logger's fDebugEnabled / getDbgMask() fSessionLogger.setEnabled(fSessionDebugLogs); // init from session-level flag @todo: get rid of this special session level flag, handle it all via session logger's fDebugEnabled / getDbgMask() fSessionLogger.setMask(getRootConfig()->fDebugConfig.fDebug); // init from config fSessionLogger.setOptions(&(getRootConfig()->fDebugConfig.fSessionDbgLoggerOptions)); if (getRootConfig()->fDebugConfig.fLogSessionsToGlobal) { // pass session output to app global logger fSessionLogger.outputVia(getSyncAppBase()->getDbgLogger()); // show start of log PDEBUGPRINTFX(DBG_HOT,("--------- START of embedded log for session ID '%s' ---------", fLocalSessionID.c_str())); } else { // use separate output for session logs fSessionLogger.installOutput(getSyncAppBase()->newDbgOutputter(false)); // install the output object (and pass ownership!) fSessionLogger.setDebugPath(getRootConfig()->fDebugConfig.fDebugInfoPath.c_str()); // base path const string &name = getRootConfig()->fDebugConfig.fSessionDbgLoggerOptions.fBasename; fSessionLogger.appendToDebugPath(name.empty() ? TARGETID : name.c_str()); if (getRootConfig()->fDebugConfig.fSingleSessionLog) { getRootConfig()->fDebugConfig.fSessionDbgLoggerOptions.fAppend=true; // One single log - in this case, we MUST append to current log fSessionLogger.appendToDebugPath("_session"); // only single session log, always with the same name } else { if (getRootConfig()->fDebugConfig.fTimedSessionLogNames) { fSessionLogger.appendToDebugPath("_"); string t; TimestampToISO8601Str(t, getSystemNowAs(TCTX_UTC), TCTX_UTC, false, false); fSessionLogger.appendToDebugPath(t.c_str()); } fSessionLogger.appendToDebugPath("_s"); fSessionLogger.appendToDebugPath(fLocalSessionID.c_str()); } } fSessionLogger.DebugDefineMainThread(); // initialize session level dump flags fDumpCount=0; fIgnoreIncomingCommands=false; fOutgoingXMLInstance=NULL; fIncomingXMLInstance=NULL; fXMLtranslate=getRootConfig()->fDebugConfig.fXMLtranslate; // initialize from config fMsgDump=getRootConfig()->fDebugConfig.fMsgDump; // initialize from config #endif // reset session at creation DEBUGPRINTFX(DBG_EXOTIC,("TSyncSession::TSyncSession: calling InternalResetSession")); InternalResetSessionEx(false); DEBUGPRINTFX(DBG_EXOTIC,("TSyncSession::TSyncSession: InternalResetSession called")); // show starting #ifndef ENGINE_LIBRARY // - don't show it here in library case as Agent must be ready as well to distribute event correctly SESSION_PROGRESS_EVENT(this,pev_sessionstart,NULL,0,0,0); #endif #ifdef SYDEBUG #if defined(SYSYNC_SERVER) && defined(SYSYNC_CLIENT) #define CAN_BE_TEXT "Server+Client" #elif defined(SYSYNC_SERVER) #define CAN_BE_TEXT "Server" #else #define CAN_BE_TEXT "Client" #endif if (PDEBUGTEST(DBG_HOT)) { // Show Session Start PDEBUGPRINTFX(DBG_HOT,( "==== %s Session started with SyncML (%s) Engine Version %d.%d.%d.%d", IS_SERVER ? "Server" : "Client", CAN_BE_TEXT, SYSYNC_VERSION_MAJOR, SYSYNC_VERSION_MINOR, SYSYNC_SUBVERSION, SYSYNC_BUILDNUMBER )); // show Product ID string PDEBUGPRINTFX(DBG_HOT,( "---- Hardcoded Product name: " CUST_SYNC_MODEL )); PDEBUGPRINTFX(DBG_HOT,( "---- Configured Model/Manufacturer: %s / %s", getSyncAppBase()->getModel().c_str(), getSyncAppBase()->getManufacturer().c_str() )); // show platform we're on string devid; getSyncAppBase()->getMyDeviceID(devid); PDEBUGPRINTFX(DBG_HOT,( "---- Running on " SYSYNC_PLATFORM_NAME ", URI/deviceID='%s'", devid.c_str() )); // show process and thread ID of the main session thread #ifdef MULTI_THREAD_SUPPORT PDEBUGPRINTFX(DBG_HOT,( "---- Process ID = %lu, Thread ID = %lu", myProcessID(), myThreadID() )); #endif // show platform details string dname,vers; // - as determined by engine itself getPlatformString(pfs_device_name,dname); getPlatformString(pfs_platformvers,vers); PDEBUGPRINTFX(DBG_HOT,( "---- Platform Hardware Name/Version = '%s', Firmware/OS Version = '%s'", dname.c_str(), vers.c_str() )); // - as configured PDEBUGPRINTFX(DBG_HOT,( "---- Configured Hardware Version = '%s', Firmware Version = '%s'", getSyncAppBase()->getHardwareVersion().c_str(), getSyncAppBase()->getFirmwareVersion().c_str() )); // show time zone infos lineartime_t tim; string z,ts; timecontext_t tctx; sInt16 offs; // - System local time and zone tctx = getRootConfig()->fSystemTimeContext; TzResolveMetaContext(tctx, getSessionZones()); // make non-meta TimeZoneContextToName(tctx, z, getSessionZones()); tim = getSystemNowAs(tctx); StringObjTimestamp(ts,tim); TzResolveToOffset(tctx, offs, tim, false, getSessionZones()); PDEBUGPRINTFX(DBG_HOT,( "---- System local time : %s (time zone '%s', offset %hd:%02hd hours east of UTC)", ts.c_str(),z.c_str(), (sInt16)(offs / MinsPerHour), (sInt16)abs(offs % MinsPerHour) )); PDEBUGPRINTFX(DBG_EXOTIC,(" Offset in Minutes east of UTC: %hd",offs)); // - System time in UTC tim = getSystemNowAs(TCTX_UTC); StringObjTimestamp(ts,tim); PDEBUGPRINTFX(DBG_HOT,("---- System time in UTC : %s",ts.c_str())); // - make a winter and a summer test if (PDEBUGTEST(DBG_EXOTIC)) { sInt16 y,m,d; lineartime2date(tim,&y,&m,&d); d=1;m=2; // February 1st tim=date2lineartime(y,m,d); TzResolveToOffset(TCTX_SYSTEM, offs, tim, true, getSessionZones()); PDEBUGPRINTFX(DBG_EXOTIC,( "---- System time zone offset per %04hd-02-01 = %hd:%02hd (=%hd mins)", y, (sInt16)(offs / MinsPerHour), (sInt16)abs(offs % MinsPerHour), offs )); d=1;m=8; // August 1st tim=date2lineartime(y,m,d); TzResolveToOffset(TCTX_SYSTEM, offs, tim, true, getSessionZones()); PDEBUGPRINTFX(DBG_EXOTIC,( "---- System time zone offset per %04hd-08-01 = %hd:%02hd (=%hd mins)", y, (sInt16)(offs / MinsPerHour), (sInt16)abs(offs % MinsPerHour), offs )); } } #endif DebugShowCfgInfo(); } // TSyncSession::TSyncSession // destructor TSyncSession::~TSyncSession() { // remove user data pointer because session does not exist any longer getSyncAppBase()->setSmlInstanceUserData(fSmlWorkspaceID,NULL); // make sure it is terminated (but normally it is already terminated here) TerminateSession(); // debug DEBUGPRINTFX(DBG_OBJINST,("-------- TSyncSession almost destroyed (except implicit member destruction)")); #ifdef SYDEBUG if (getRootConfig()->fDebugConfig.fLogSessionsToGlobal) { // show end of embedded log PDEBUGPRINTFX(DBG_HOT,("--------- END of embedded log for session ID '%s' ---------", fLocalSessionID.c_str())); } fSessionLogger.DebugThreadOutputDone(); #endif } // TSyncSession::~TSyncSession /// @brief terminate a session. /// @Note: Termination is final - session cannot be restarted by RestartSession() after // calling this routine void TSyncSession::TerminateSession(void) { if (!fTerminated) { // save type of ending (before fAborted gets reset in InternalResetSession()) bool normalend = !fAborted; bool allsuccess = isAllSuccess(); // do this class' reset stuff DEBUGPRINTFX(DBG_EXOTIC,("TSyncSession::TerminateSession: calling InternalResetSession")); InternalResetSessionEx(true); DEBUGPRINTFX(DBG_EXOTIC,("TSyncSession::TerminateSession: InternalResetSession called")); #ifdef SCRIPT_SUPPORT // remove the session script context if (fSessionScriptContextP) { delete fSessionScriptContextP; fSessionScriptContextP = NULL; } #endif // remove all local datastores TLocalDataStorePContainer::iterator pos1; int n=fLocalDataStores.size(); PDEBUGPRINTFX(DBG_EXOTIC,("Deleting %d datastores",n)); for (pos1=fLocalDataStores.begin(); pos1!=fLocalDataStores.end(); ++pos1) { delete *pos1; } fLocalDataStores.clear(); // clear list // remove all local itemtypes TSyncItemTypePContainer::iterator pos2; for (pos2=fLocalItemTypes.begin(); pos2!=fLocalItemTypes.end(); ++pos2) { delete *pos2; } fLocalItemTypes.clear(); // clear list #ifdef SYDEBUG // save half-begun XML translations XMLTranslationOutgoingEnd(); XMLTranslationIncomingEnd(); #endif // stop and show profiling info TP_STOP(fTPInfo); #ifdef TIME_PROFILING if (getDbgMask() & DBG_PROFILE) { sInt16 i; uInt32 sy,us; PDEBUGPRINTFX(DBG_PROFILE,("Session CPU usage statistics: (system/user/total)")); // sections for (i=0; iannounceAgentDestruction(); } } // TSyncSession::announceDestruction // - terminate all datastores void TSyncSession::TerminateDatastores(localstatus aAbortStatusCode) { // terminate sync with all datastores TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // terminate (*pos)->engTerminateDatastore(aAbortStatusCode); } } // TSyncSession::TerminateDatastores // - resets session and removes all datastores (local and remote) void TSyncSession::ResetAndRemoveDatastores(void) { // Must reset session before ResetSession(); // remove all local datastores TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // now actually delete them TLocalEngineDS *dsP = (*pos); if (dsP) { (*pos) = NULL; // to avoid double deletes delete dsP; } } fLocalDataStores.clear(); // remove pointers } // TSyncSession::ResetAndRemoveDatastores // reset session to inital state (new) // - this is called at creation and destruction but can be called // also when an existing session needs to be restarted. // - InternalResetSession() must be proof for being called more than // once in a row. // - InternalResetSession() must also be callable from destructor // (care not to call other objects which will refer to the already // half-destructed session!) void TSyncSession::InternalResetSessionEx(bool terminationCall) { #ifdef SCRIPT_SUPPORT // call session termination script (ONCE!) if (terminationCall && !fTerminated) { TScriptContext::execute( fSessionScriptContextP, getSessionConfig()->fSessionFinishScript, NULL, // context's function table NULL // datastore pointer needed for context ); } #endif // reset sync and datastores // - version not known in advance fSyncMLVersion=syncml_vers_unknown; // - immediately abort SYNC command in progress fLocalSyncDatastoreP = NULL; #ifndef NO_REMOTE_RULES // - no remote rules applied fActiveRemoteRules.clear(); #endif // - set defaults for >=SyncML 1.1 features fRemoteWantsNOC = false; // no, unless requested fRemoteCanHandleUTC = false; // assume remote can not handle UTC time (note that for SyncML 1.0 this will be set to true later) fRemoteSupportsLargeObjects = false; // no large object support by default // - default options fTreatRemoteTimeAsLocal = false; // do not ignore time zone information from remote fTreatRemoteTimeAsUTC = false; // do not ignore time zone information from remote fIgnoreDevInfMaxSize = false; // do not ignore specification in CTCap fIgnoreCTCap = false; // do not ignore CTCap fDSPathInDevInf = true; // newer Nokias need this, as they expect the same path in devInf as they sent in alert fDSCgiInDevInf = true; // newer Nokias need this, as they expect the same path AND CGI in devInf as they sent in alert fReadOnly = false; // always disabled unless set by SessionLogin() // - init user time zone from setting. May be modified later using SETUSERTIMEZONE() fUserTimeContext = getSessionConfig()->fUserTimeContext; #ifdef SYDEBUG fSessionLogger.setEnabled(getRootConfig()->fDebugConfig.fSessionDebugLogs); // get default value #endif #ifndef MINIMAL_CODE fLogEnabled = getSessionConfig()->fLogEnabled; #endif #ifdef SCRIPT_SUPPORT // retain session variables if InternalResetSessionEx() is called more than once in the same session // (which is normal procedure in clients, where SelectProfile calls ResetSession) // Note: fSessionScriptContextP will be deleted in the destructor if (!fSessionScriptContextP) { if (!terminationCall && !fTerminated) { // prepare session-level scripts TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fSessionInitScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fSentItemStatusScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fReceivedItemStatusScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fSessionFinishScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fCustomGetHandlerScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fCustomGetPutScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fCustomEndPutScript,fSessionScriptContextP,this); TScriptContext::rebuildContext(getSyncAppBase(),getSessionConfig()->fCustomPutResultHandlerScript,fSessionScriptContextP,this,true); // now instantiate vars } } #endif // - remove all remote datastores TRemoteDataStorePContainer::iterator pos1; for (pos1=fRemoteDataStores.begin(); pos1!=fRemoteDataStores.end(); ++pos1) { delete *pos1; } fRemoteDataStores.clear(); // clear list // - remove all remote itemtypes TSyncItemTypePContainer::iterator pos2; for (pos2=fRemoteItemTypes.begin(); pos2!=fRemoteItemTypes.end(); ++pos2) { delete *pos2; } fRemoteItemTypes.clear(); // clear list // reset basics SYSYNC_TRY { // empty command queues TSmlCommandPContainer::iterator pos; // - commands waiting for status for (pos=fStatusWaitCommands.begin(); pos!=fStatusWaitCommands.end(); ++pos) { #ifdef SYDEBUG TSmlCommand *cmdP = *pos; // show that command was not answered PDEBUGPRINTFX(DBG_PROTO,("Never received status for &html;&html;command '%s'&html;&html;, (outgoing MsgID=%ld, CmdID=%ld)", (long)cmdP->getMsgID(), (long)cmdP->getCmdID(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID(), cmdP->getName(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID() )); #endif // delete, if this is not the interrupted command. // Note: only the interrupted command can also be in the status queue. // Other queues are exclusive owners of their commands. if (*pos != fInterruptedCommandP) delete *pos; else DEBUGPRINTF(("- prevented deleting because command is interrupted")); } fStatusWaitCommands.clear(); // clear list // - commands waiting for outgoing message to begin forgetHeaderWaitCommands(); // - commands to be issued only after all commands in this message have // been processed and answered by a status for (pos=fEndOfMessageCommands.begin(); pos!=fEndOfMessageCommands.end(); ++pos) { // show that command was not sent DEBUGPRINTF(("Never sent end-of-message command '%s', (outgoing MsgID=%ld, CmdID=%ld)", (*pos)->getName(), (long)(*pos)->getMsgID(), (long)(*pos)->getCmdID() )); // delete delete *pos; } fEndOfMessageCommands.clear(); // clear list // - commands to be sent in next message for (pos=fNextMessageCommands.begin(); pos!=fNextMessageCommands.end(); ++pos) { // show that command was not sent DEBUGPRINTF(("Never sent next-message command '%s', (outgoing MsgID=%ld, CmdID=%ld)", (*pos)->getName(), (long)(*pos)->getMsgID(), (long)(*pos)->getCmdID() )); // delete delete *pos; } fNextMessageCommands.clear(); // clear list // - commands to be sent in next package for (pos=fNextPackageCommands.begin(); pos!=fNextPackageCommands.end(); ++pos) { // show that command was not sent DEBUGPRINTF(("Never sent next-package command '%s', (outgoing MsgID=%ld, CmdID=%ld)", (*pos)->getName(), (long)(*pos)->getMsgID(), (long)(*pos)->getCmdID() )); // delete delete *pos; } fNextPackageCommands.clear(); // clear list // - interrupted command if (fInterruptedCommandP) { // show that command was not sent DEBUGPRINTF(("Never finished interrupted command '%s', (outgoing MsgID=%ld, CmdID=%ld)", fInterruptedCommandP->getName(), (long)fInterruptedCommandP->getMsgID(), (long)fInterruptedCommandP->getCmdID() )); delete fInterruptedCommandP; fInterruptedCommandP=NULL; } // - commands to be executed again at beginning of next message fDelayedExecSyncEnds=0; for (pos=fDelayedExecutionCommands.begin(); pos!=fDelayedExecutionCommands.end(); ++pos) { // show that command was not sent DEBUGPRINTF(("Never finished executing command '%s', (incoming MsgID=%ld, CmdID=%ld)", (*pos)->getName(), (long)(*pos)->getMsgID(), (long)(*pos)->getCmdID() )); // delete delete *pos; } fDelayedExecutionCommands.clear(); // clear list #ifdef SYNCSTATUS_AT_SYNC_CLOSE // make sure sync status is disposed if (fSyncCloseStatusCommandP) delete fSyncCloseStatusCommandP; fSyncCloseStatusCommandP=NULL; #endif // remove incomplete data command if (fIncompleteDataCommandP) delete fIncompleteDataCommandP; fIncompleteDataCommandP=NULL; } SYSYNC_CATCH (exception &e) #ifdef SYDEBUG DEBUGPRINTFX(DBG_ERROR,( "WARNING: Exception during InternalResetSession(): %s", e.what() )); #endif SYSYNC_ENDCATCH SYSYNC_CATCH (...) #ifdef SYDEBUG DEBUGPRINTFX(DBG_ERROR,( "WARNING: Unknown Exception during InternalResetSession()" )); #endif SYSYNC_ENDCATCH // remember time of creation or last reset SessionUsed(); // reset session status fIncomingState=psta_idle; // no incoming package status yet fCmdIncomingState=psta_idle; fCmdIncoming=NULL; fOutgoingState=psta_idle; // no outgoing package status yet fRestarting=false; fNextMessageRequests=0; // no pending next message requests fFakeFinalFlag=false; // special flag to work around broken resume implementations fNewOutgoingPackage=true; // first message will be first in outgoing package fSessionAuthorized=false; // session not permanently authorized fMessageAuthorized=false; // message not authorized either fAuthFailures=0; // no failed attempts by remote so far fAuthRetries=0; // no failed attempts by myself so far fIncomingMsgID=0; // expected session to start with MsgID=1, so must be 0 now as it will be incremented at StartMessage() fOutgoingMsgID=0; // starting answers with MsgID=1, so must be 0 as it will be incremented before sending a new message fAborted=false; // not yet aborted fSuspended=false; // not being suspended yet fSuspendAlertSent=false; // no suspend alert sent so far fFailedDatastores=0; // none failed fErrorItemDatastores=0; // none generated or detected error items fInProgress=false; // not yet in progress fOutgoingStarted=false; // no outgoing message started yet fSequenceNesting=0; // no sequence command open fMaxOutgoingMsgSize=0; // no limit for outgoing messages so far fMaxOutgoingObjSize=0; // SyncML 1.1: no limit for outgoing objects so far fOutgoingMessageFull=false; // limit not yet reached // init special remote-dependent behaviour fLimitedRemoteFieldLengths=false; // assume remote has not generally limited field lenghts fDontSendEmptyProperties=false; // normally, empty properties will be sent fDoQuote8BitContent=false; fNoReplaceInSlowsync=false; fTreatRemoteTimeAsLocal=false; fTreatRemoteTimeAsUTC=false; fIgnoreDevInfMaxSize=false; fTreatCopyAsAdd=false; fStrictExecOrdering=true; // SyncML standard requires strict ordering (of statuses, but this implies execution of commands, too) fDefaultOutCharset=chs_utf8; // SyncML content is usually UTF-8 fDefaultInCharset=chs_utf8; // SyncML content is usually UTF-8 // defaults for possibly remote-dependent behaviour fCompleteFromClientOnly=getSessionConfig()->fCompleteFromClientOnly; // conform to standard by default fRequestMaxTime=getSessionConfig()->fRequestMaxTime; fRequestMinTime=getSessionConfig()->fRequestMinTime; fUpdateClientDuringSlowsync=getSessionConfig()->fUpdateClientDuringSlowsync; fUpdateServerDuringSlowsync=getSessionConfig()->fUpdateServerDuringSlowsync; fAllowMessageRetries=getSessionConfig()->fAllowMessageRetries; fShowCTCapProps=getSessionConfig()->fShowCTCapProps; fShowTypeSzInCTCap10=getSessionConfig()->fShowTypeSzInCTCap10; fVCal10EnddatesSameDay=getSessionConfig()->fVCal10EnddatesSameDay; fDoNotFoldContent=getSessionConfig()->fDoNotFoldContent; // tristates!! fEnumDefaultPropParams=getSessionConfig()->fEnumDefaultPropParams; #ifdef SCRIPT_SUPPORT // call session init script if (!terminationCall && !fTerminated) { TScriptContext::execute( fSessionScriptContextP, getSessionConfig()->fSessionInitScript, NULL, // context's function table NULL // datastore pointer needed for context ); } #endif } // TSyncSession::InternalResetSessionEx #ifdef PROGRESS_EVENTS // event generator bool TSyncSession::NotifySessionProgressEvent( TProgressEventType aEventType, TLocalDSConfig *aDatastoreID, sInt32 aExtra1, sInt32 aExtra2, sInt32 aExtra3 ) { #ifdef ENGINE_LIBRARY // library build, session level events get queued and dispatched via sessionstep // - handle some events specially if (aEventType == pev_nop) return true; // just continue else { // - prepare info record TEngineProgressInfo info; info.eventtype = (uInt16)(aEventType); // - datastore ID, if any if (aDatastoreID != NULL) info.targetID = (sInt32)(aDatastoreID->fLocalDBTypeID); else info.targetID = 0; // - extras info.extra1 = aExtra1; info.extra2 = aExtra2; info.extra3 = aExtra3; // - handle it return HandleSessionProgressEvent(info); } #else // old monolithic build, pass to appbase which dispatches them to the app via callback return getSyncAppBase()->NotifyAppProgressEvent(aEventType,aDatastoreID,aExtra1,aExtra2,aExtra3); #endif } // TSyncAppBase::NotifySessionProgressEvent #endif // PROGRESS_EVENTS // get root config pointer // NOTE: we have moved this here because Palm linker // would have problems accessing it as syncsession.cpp is // large enough to have EndMessage >32k away from the // original position of this routine. TRootConfig *TSyncSession::getRootConfig(void) { return fSyncAppBaseP->getRootConfig(); } // TSyncSession::getRootConfig // forget commands waiting to be sent when header is generated void TSyncSession::forgetHeaderWaitCommands(void) { // empty command queues TSmlCommandPContainer::iterator pos; // - commands waiting for outgoing message to begin for (pos=fHeaderWaitCommands.begin(); pos!=fHeaderWaitCommands.end(); ++pos) { #if SYDEBUG>1 TSmlCommand *cmdP = *pos; // show that command was not answered DEBUGPRINTF(("Never sent command '%s', (outgoing MsgID=%ld, CmdID=%ld) because outgoing message never started", cmdP->getName(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID() )); #endif // delete delete *pos; } fHeaderWaitCommands.clear(); // clear list } // TSyncSession::forgetHeaderWaitCommands // abort processing commands in this message void TSyncSession::AbortCommandProcessing(TSyError aStatusCode) { if (!fIgnoreIncomingCommands) { fIgnoreIncomingCommands=true; // do not process further commands fStatusCodeForIgnored=aStatusCode; // save status code PDEBUGPRINTFX(DBG_HOT,( "--------------- Ignoring all commands in this message (after %ld sec. request processing, %ld sec. total) with Status %hd (0=none) from here on", (long)((getSystemNowAs(TCTX_UTC)-getLastRequestStarted()) / (lineartime_t)secondToLinearTimeFactor), (long)((getSystemNowAs(TCTX_UTC)-getSessionStarted()) / (lineartime_t)secondToLinearTimeFactor), fStatusCodeForIgnored )); } } // TSyncSession::AbortCommandProcessing // suspend session (that is: flag abortion) void TSyncSession::SuspendSession(TSyError aReason) { // first check for suspend if (fSyncMLVersion>=syncml_vers_1_2) { // try suspend, only possible if not already suspended or aborted if (!fSuspended && !fAborted) { fSuspended=true; // trigger suspend fAbortReasonStatus = aReason; fLocalAbortReason = true; AbortCommandProcessing(514); // abort command processing, all subsequent commands will be ignored with "cancelled" status PDEBUGPRINTFX(DBG_ERROR,( "WARNING: Session locally flagged for suspend, reason=%hd", aReason )); CONSOLEPRINTF(( "Session will be suspended due to local error code %hd\n", aReason )); } } else { // We can't suspend, we need to abort AbortSession(500,true,aReason); } } // TSyncSession::SuspendSession void TSyncSession::MarkSuspendAlertSent(bool aSent) { fSuspendAlertSent = aSent; } // abort session (that is: flag abortion) void TSyncSession::AbortSession(TSyError aStatusCode, bool aLocalProblem, TSyError aReason) { // Catch the case that some inner routine, e.g. a plugin, detects a user suspend. It can // return LOCERR_USERSUSPEND then and will cause the engine instead of aborting. if (aStatusCode==LOCERR_USERSUSPEND) { SuspendSession(LOCERR_USERSUSPEND); return; } // make sure session gets aborted // BUT: do NOT reset yet. Reset would incorrectly abort message answering if (!fAborted && !fTerminated) { fAborted=true; // session aborted fAbortReasonStatus = aReason ? aReason : aStatusCode; fLocalAbortReason = aLocalProblem; fInProgress=false; // not in progress any more (will be deleted after end of request) PDEBUGBLOCKFMT(("SessionAbort","Aborting Session", "Status=%hd|ProblemSource=%s", fAbortReasonStatus, fLocalAbortReason ? "LOCAL" : "REMOTE" )); PDEBUGPRINTFX(DBG_ERROR,( "WARNING: Aborting Session with Reason Status %hd (%s problem) ***", fAbortReasonStatus, fLocalAbortReason ? "LOCAL" : "REMOTE" )); // In SyncML 1.1, we have a special status code to show that commands are not // executed any more due to cancellation of the session if (fSyncMLVersion>=syncml_vers_1_1) aStatusCode=514; // cancelled, command not completed AbortCommandProcessing(aStatusCode); // let all local datastores know TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { (*pos)->engAbortDataStoreSync(fAbortReasonStatus, fLocalAbortReason); } CONSOLEPRINTF(( "Session aborted because of %s SyncML error code %hd\n", fLocalAbortReason ? "LOCAL" : "REMOTE", fAbortReasonStatus )); SESSION_PROGRESS_EVENT( this, pev_sessionend, NULL, getAbortReasonStatus(), 0,0 ); PDEBUGENDBLOCK("SessionAbort"); } } // TSyncSession::AbortSession // returns true if session was a complete success bool TSyncSession::isAllSuccess(void) { return fFailedDatastores==0 && fErrorItemDatastores==0; } // TSyncSession::isAllSuccess // let session know that datastore has failed void TSyncSession::DatastoreFailed(TSyError aStatusCode, bool aLocalProblem) { fFailedDatastores++; // %%% note that this is not perfect for server, as inactive datastores are possible if (fFailedDatastores>=fLocalDataStores.size()) { // all have failed by now, abort the session AbortSession(aStatusCode, aLocalProblem, aStatusCode); } } // TSyncSession::DatastoreFailed // set SyncML toolkit workspace ID void TSyncSession::setSmlWorkspaceID(InstanceID_t aSmlWorkspaceID) { fSmlWorkspaceID=aSmlWorkspaceID; } // TSyncSession::setSmlWorkspaceID // show some information about the config void TSyncSession::DebugShowCfgInfo(void) { #ifdef SYDEBUG string t; StringObjTimestamp(t,getRootConfig()->fConfigDate); // now write settings to log PDEBUGPRINTFX(DBG_HOT,( "==== Config file='%s', Last Change=%s", getSyncAppBase()->fConfigFilePath.c_str(), t.c_str() )); #ifndef HARDCODED_CONFIG PDEBUGPRINTFX(DBG_HOT,( "==== Config ID string='%s'", getRootConfig()->fConfigIDString.c_str() )); #endif #endif } // TSyncSession::DebugShowCfgInfo #ifndef MINIMAL_CODE #include // write to sync log file void TSyncSession::WriteLogLine(const char *aLogline) { if (getSessionConfig()->fLogFileName.empty()) return; // do not write without a path // open for append FILE * logfile=fopen(getSessionConfig()->fLogFileName.c_str(),"a"); if (!logfile) { PDEBUGPRINTFX(DBG_ERROR,("**** Cannot write to logfile '%s' (errno=%ld)",getSessionConfig()->fLogFileName.c_str(),(long)errno)); return; // cannot write } // check if we need to write labels first if (!getSessionConfig()->fLogFileLabels.empty()) { // check file size if (ftell(logfile)==0) { // we are at the beginning, print labels first fputs(getSessionConfig()->fLogFileLabels.c_str(),logfile); } } // now write log line fputs(aLogline,logfile); // close file fclose(logfile); } // TSyncSession::WriteLogLine #endif // queue a SyncBody context command for issuing after incoming message has ended void TSyncSession::queueForIssueRoot( TSmlCommand * &aSyncCommandP // the command ) { fEndOfMessageCommands.push_back(aSyncCommandP); aSyncCommandP=NULL; } // TSyncSession::queueForIssueRoot // queue a SyncBody context command for issuing after incoming message has ended void TSyncSession::issueNotBeforePackage( TPackageStates aPackageState, TSmlCommand *aSyncCommandP // the command ) { if (fOutgoingState>=aPackageState) { issueRootPtr(aSyncCommandP); } else { PDEBUGPRINTFX(DBG_SESSION,("%s queued for next package",aSyncCommandP->getName())); fNextPackageCommands.push_back(aSyncCommandP); } } // TSyncSession::issueNotBeforePackage // issue a command in SyncBody context (uses session's interruptedCommand/NextMessageCommands) bool TSyncSession::issueRootPtr( TSmlCommand *aSyncCommandP, // the command bool aNoResp, // set if no response is wanted bool aIsOKSyncHdrStatus // set if this is sync hdr status ) { // now issue return issuePtr(aSyncCommandP,fNextMessageCommands,fInterruptedCommandP,aNoResp,aIsOKSyncHdrStatus); } // TSyncSession::issueRootPtr // issue object passed as pointer (rather than pointer reference) // normally used internally only bool TSyncSession::issuePtr( TSmlCommand *aSyncCommandP, // the command TSmlCommandPContainer &aNextMessageCommands, // the list to add the command if cannot be issued in this message TSmlCommand * &aInterruptedCommandP, // where to store command ptr if it was interrupted bool aNoResp, // set if no response is wanted bool aIsOKSyncHdrStatus // set if this is sync hdr status ) { bool issued=true; // NULL issue is successful issue if (aSyncCommandP) { PDEBUGBLOCKFMT(("issue","issuing command", "Cmd=%s", aSyncCommandP->getName() )); if (fCmdIncoming && aSyncCommandP->getCmdType()==scmd_status) { // Queue instead of sending immediately, see TSyncSession::process(). fCmdIncoming->queueStatusCmd(aSyncCommandP); if (fCmdIncoming->getCmdType()==scmd_sync) { TSyncCommand *syncCommandP=static_cast(fCmdIncoming); syncCommandP->setLocalDatastore(fLocalSyncDatastoreP); PDEBUGPRINTFX(DBG_SESSION,("issuePtr: store fLocalSyncDatastoreP in sync command")); } DEBUGPRINTFX(DBG_PROTO,("%s: queue reply to %s because of pending commands", aSyncCommandP->getName(), fCmdIncoming->getName() )); goto endissue; } SYSYNC_TRY { // check for not-to-be-sent commands if (aSyncCommandP->getDontSend()) { // command must not be sent, just silently discarded DEBUGPRINTFX(DBG_PROTO,("%s: not sent because fDontSend is set -> just delete", aSyncCommandP->getName() )); delete aSyncCommandP; issued=true; // counts as issued goto endissue; } // check if this commmand now triggers need to answer if (!aIsOKSyncHdrStatus) { fNeedToAnswer=true; } // check if outgoing message has already started. If not, queue command // for sending when message has started (client case, when status for // header must be evaluated before next header can be generated) if (!fOutgoingStarted) { fHeaderWaitCommands.push_back(aSyncCommandP); PDEBUGPRINTFX(DBG_SESSION+DBG_EXOTIC,( "Outgoing message header not yet generated, command '%s' queued", aSyncCommandP->getName() )); issued=true; // act as if issued goto endissue; } // check if this is a continuation of a suspended chunked item transfer // if yes, substitute the full data we currently have in the item (from // the database) with the buffered left-overs from the previous // session. aSyncCommandP->checkChunkContinuation(); // check if message size restrictions or local buffer size // will prevent command from being sent now TSmlCommand *splitCmdP = NULL; if (!fOutgoingMessageFull) { #ifndef USE_SML_EVALUATION #error "This Implementation does not work any more without USE_SML_EVALUATION" #endif // check if enough room to send data sInt32 freeaftersend=aSyncCommandP->evalIssue( peekNextOutgoingCmdID(), // this will be the ID getOutgoingMsgID(), aNoResp ); // - if room for new commands is smaller than expected message size sInt32 maxfree=getSmlWorkspaceFreeBytes(); sInt32 sizetoend=maxfree-freeaftersend; #ifdef SYDEBUG PDEBUGPRINTFX(DBG_SESSION+DBG_EXOTIC,( "Command '%s': is %hd-th counted cmd, cmdsize(+tags needed to end msg)=%ld, available=%ld (maxfree=%ld, freeaftersend=%ld, notUsableBufferBytes()=%ld)", aSyncCommandP->getName(), fOutgoingCmds, (long)sizetoend, // size of command (+tags needed to end msg) (long)(maxfree-getNotUsableBufferBytes()), (long)maxfree, (long)freeaftersend, (long)getNotUsableBufferBytes() )); #endif #ifndef MINIMAL_CODE // - check for artifical debug chunking if (getSessionConfig()->fDebugChunkMaxSize && aSyncCommandP->isSyncOp()) { // always chunk commands over the configured size uInt32 cmdSize=getSmlWorkspaceFreeBytes()-freeaftersend; if (cmdSize>getSessionConfig()->fDebugChunkMaxSize) { // simulate a different free after send to force chunking sInt32 nfas=getNotUsableBufferBytes()-(cmdSize-getSessionConfig()->fDebugChunkMaxSize)+100; if (nfas=syncml_vers_1_1) { // we can use moredata mechanism, try if it works for this command if (fOutgoingCmds>0 && sizetoend < getMaxOutgoingSize()/4) { // this is a small command, and not in best position // - command will most likely fit into next message, so end this message now fOutgoingMessageFull=true; sendable=true; // kind of "sendable" - as are confident it will be sendable in next message PDEBUGPRINTFX(DBG_PROTO,("command is less than 1/4 of maxmsgsize -> will likely fit into next message, so queue it")); } else { // - try to split // reserve about 200 bytes for Meta Size splitCmdP = aSyncCommandP->splitCommand(getNotUsableBufferBytes()-freeaftersend+200); if (splitCmdP) { sendable=true; } else if (aSyncCommandP->canSplit()) { // command is basically splittable, but not right now - end message now and try in next fOutgoingMessageFull=true; sendable=true; // kind of "sendable" - just not now, but certainly later } } } // - second choice: try to shrink (mainly devInf) if (!sendable) { // gets sendable if we can shrink it to given size sendable = aSyncCommandP->shrinkCommand(getNotUsableBufferBytes()-freeaftersend); PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,( "shrinkCommand could %sshrink command by %ld bytes or more (which is needed to send it now)", sendable ? "" : "NOT ", (long)(getNotUsableBufferBytes()-freeaftersend) )); } // - third choice: send it later as first command if (!sendable) { if (fOutgoingCmds>0 && sizetoend queue and hope we'll be able to send it as only command in subsequent message")); // - command will possibly fit into next message, so end this message now fOutgoingMessageFull=true; sendable=true; // kind of "sendable" - as we are hoping it will be sendable later } else { // this WAS already the best possible position to send or really too big // - we are in trouble, this command is unsendable PDEBUGPRINTFX(DBG_ERROR,("%s: Warning: command is too big to be sent at all -> discarded/mark for resend", aSyncCommandP->getName() )); // - try again in next session (data size might be smaller then, or remote might allow larger data at some time) aSyncCommandP->markForResend(); // - just discard it for now delete aSyncCommandP; issued=false; // not issued (but also not queued again). goto endissue; } } // check if command was made sendable by splitting off a part if (splitCmdP) { // - queue command containing remaining data for issuing in next message aNextMessageCommands.push_back(splitCmdP); PDEBUGPRINTFX(DBG_PROTO+DBG_HOT,("Split command, sending a chunk, queued rest of data for sending in next message")); // - Note: fOutgoingMessageFull is not set here (as first part of cmd must be sent first) // but will be set below after issuing first part (due to splitCmdP!=NULL) } } // command too large to be sent now } // Queue if message is full, or if we have a interrupted command and // command to be sent is something other than status. This will make sure // incoming commands get their statuses before message is filled with other // explicitly generated commands if (fOutgoingMessageFull || (aInterruptedCommandP && aSyncCommandP->getCmdType()!=scmd_status)) { // - queue for issuing in next message aNextMessageCommands.push_back(aSyncCommandP); PDEBUGPRINTFX(DBG_HOT,( "No room for issueing in this message, command '%s' queued for next message", aSyncCommandP->getName() )); // - could not be issued, was queued issued=false; } else { // issue the command if (splitCmdP) fOutgoingMessageFull=true; // if we are sending a split command, message IS full after that! bool dodelete=true; if (aSyncCommandP->issue(getNextOutgoingCmdID(),fOutgoingMsgID,aNoResp)) { // command expects status and must be kept in list PDEBUGPRINTFX(DBG_HOT,("%s: issued as (outgoing MsgID=%ld, CmdID=%ld), now queueing for &html;&html;status&html;&html;", aSyncCommandP->getName(), (long)aSyncCommandP->getMsgID(), (long)aSyncCommandP->getCmdID(), (long)aSyncCommandP->getMsgID(), (long)aSyncCommandP->getCmdID(), (long)aSyncCommandP->getMsgID(), (long)aSyncCommandP->getCmdID() )); // - queue for status aSyncCommandP->setWaitingForStatus(true); // increment waiting for status count of this command fStatusWaitCommands.push_back(aSyncCommandP); dodelete=false; } else { // command does not expect status and can be deleted if it is finished PDEBUGPRINTFX(DBG_HOT,("%s: issued as (outgoing MsgID=%ld, CmdID=%ld), not waiting for status", aSyncCommandP->getName(), (long)aSyncCommandP->getMsgID(), (long)aSyncCommandP->getCmdID() )); } // Now as it is issued, count all "real" commands if (!aIsOKSyncHdrStatus) { // count outgoing "real" command, that is NOT SyncHdr OK status nor Alert 222 OK statu // Note that issuing a container command such as will have pre-decremented fOutgoingCmds // to compensate (container should not be counted) fOutgoingCmds++; } // test if finished issuing if (!aSyncCommandP->finished()) { // issuing was interrupted, continue at start of next message aInterruptedCommandP=aSyncCommandP; // remember dodelete=false; issued=false; PDEBUGPRINTFX(DBG_SESSION,("%s: issue not finished -> queued interrupted command", aSyncCommandP->getName() )); } // - delete if not queued if (dodelete) { PDEBUGPRINTFX(DBG_SESSION,("%s: issue finished and not waiting for status -> deleting command", aSyncCommandP->getName() )); delete aSyncCommandP; } // message size PDEBUGPRINTFX(DBG_PROTO,("Outgoing Message size is now %ld bytes",(long)getOutgoingMessageSize())); } } SYSYNC_CATCH (...) // exception during command issuing // - make sure command is deleted (as issue owns it now) delete aSyncCommandP; // make sure session gets aborted AbortSession(500,true); // local problem // close block PDEBUGENDBLOCK("issue"); // re-throw SYSYNC_RETHROW; SYSYNC_ENDCATCH endissue: PDEBUGENDBLOCK("issue"); } // if something to issue at all else { DEBUGPRINTFX(DBG_SESSION,("issuePtr called with NULL command")); } // return true if completely issued, false if interrupted or not issued at all return issued; } // TSyncSession::issuePtr // returns true if given number of bytes are transferable // (not exceeding MaxMsgSize (in SyncML 1.0) or MaxObjSize (SyncML 1.1 and later) bool TSyncSession::dataSizeTransferable(uInt32 aDataBytes) { if (fSyncMLVersion 0 ? leavefree : 0; } else { // limited only by workspace itself: no bytes need to be left free return 0; } } // TSyncSession::getNotUsableBufferBytes // get max size outgoing message may have (either defined by remote's maxmsgsize or local buffer space) sInt32 TSyncSession::getMaxOutgoingSize(void) { return fMaxOutgoingMsgSize>0 ? fMaxOutgoingMsgSize : getSmlWorkspaceFreeBytes(); } // TSyncSession::getMaxOutgoingSize /// @brief mark all pending items for a datastore for resume /// (those items that are in a session queue for being issued or getting status) void TSyncSession::markPendingForResume(TLocalEngineDS *aForDatastoreP) { TSmlCommandPContainer::iterator pos; // - commands not issued yet because header not yet generated for (pos=fHeaderWaitCommands.begin(); pos!=fHeaderWaitCommands.end(); ++pos) { (*pos)->markPendingForResume(aForDatastoreP,true); // unsent } // - commands not issued yet because they belong at the end of the message for (pos=fEndOfMessageCommands.begin(); pos!=fEndOfMessageCommands.end(); ++pos) { (*pos)->markPendingForResume(aForDatastoreP,true); // unsent } // - interrupted and next-message commands markPendingForResume(fNextMessageCommands,fInterruptedCommandP,aForDatastoreP); // - next package commands for (pos=fNextPackageCommands.begin(); pos!=fNextPackageCommands.end(); ++pos) { (*pos)->markPendingForResume(aForDatastoreP,true); // unsent } // - commands waiting for status for (pos=fStatusWaitCommands.begin(); pos!=fStatusWaitCommands.end(); ++pos) { (*pos)->markPendingForResume(aForDatastoreP,false); // these are already sent (except if they are waiting for chunk ok 213 status)! } } // TSyncSession::markPendingForResume /// @brief mark all pending items for a datastore for resume /// (those items that are in a session queue for being issued or getting status) void TSyncSession::markPendingForResume( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand *aInterruptedCommandP, TLocalEngineDS *aForDatastoreP ) { // - all those that are in an interrupted command if (aInterruptedCommandP) { aInterruptedCommandP->markPendingForResume(aForDatastoreP,true); // these are unsent } // - all those pending for next message TSmlCommandPContainer::iterator pos; for (pos=aNextMessageCommands.begin(); pos!=aNextMessageCommands.end(); ++pos) { (*pos)->markPendingForResume(aForDatastoreP,true); // these are unsent } } // TSyncSession::markPendingForResume // continue interrupted or prevented issue of root level commands void TSyncSession::ContinuePackageRoot(void) { // check if we have anything to send, and if so, reset the count if (fNextMessageCommands.size()>0 || fInterruptedCommandP) { #ifdef SYDEBUG if (fNextMessageRequests) { PDEBUGPRINTFX(DBG_PROTO,("Fulfilling %ld Next-Message-Request-Alerts 222 by sending commands now",(long)fNextMessageRequests)); } #endif fNextMessageRequests=0; // sent something, request fulfilled } ContinuePackage(fNextMessageCommands,fInterruptedCommandP); } // TSyncSession::ContinuePackageRoot // continue interrupted or prevented issue in next package void TSyncSession::ContinuePackage( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP ) { TSmlCommand *cmdP = aInterruptedCommandP; // - first restart interrupted command if (cmdP && !isAborted() && !isSuspending()) { // first check if interrupted command has received status if (cmdP->isWaitingForStatus() && getSessionConfig()->fWaitForStatusOfInterrupted) { // Command to be continued has not yet received status, so wait with continuing it PDEBUGPRINTFX(DBG_SESSION,( "Interrupted command '%s' (outgoing MsgID=%ld, CmdID=%ld) is still waiting for status -> do not continue nor send queued commands", cmdP->getName(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID() )); // aInterruptedCommandP is still set, prevents sending of queued commands } else { PDEBUGPRINTFX(DBG_SESSION,("Sending command that was interrupted at end of last message")); // there is an interrupted command, continue it bool dodelete=true; // if an interrupted command must be continued, this can't be an OK for SyncHdr fNeedToAnswer=true; bool newIssue=false; // now continue issuing bool queueForStatus=cmdP->continueIssue(newIssue); // check if complete re-issuing is needed if (newIssue) { // command must be re-issued as if it was a new command PDEBUGPRINTFX(DBG_SESSION,("%s: continuing command by issuing anew",cmdP->getName())); // interruption is over for now, IssuePtr will set it again if interrupted again aInterruptedCommandP=NULL; // IssuePtr will take care of all needed status queueing and deleting command if finished etc. issuePtr(cmdP,aNextMessageCommands,aInterruptedCommandP); // never delete, as issuePtr will have done it if needed dodelete=false; } else { // no complete re-issuing needed, just check if we need to queue for status (again) if (queueForStatus) { // command expects status (again?) and must be kept in list PDEBUGPRINTFX(DBG_SESSION,("%s: continued, now queueing for status (again) as (outgoing MsgID=%ld, CmdID=%ld)", cmdP->getName(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID() )); // - queue for status (note that every SyncML 1.1 chunk wants to see a status 213 in any case!) if (!cmdP->isWaitingForStatus()) { // only put to the queue again if not already waiting there fStatusWaitCommands.push_back(cmdP); cmdP->setWaitingForStatus(true); } else { // already waiting, so it's already in the queue - do not push it again PDEBUGPRINTFX(DBG_SESSION,("%s: continued command was already waiting for status, do not push again", cmdP->getName())); } dodelete=false; } } // test if completely issued now if (!cmdP->finished()) { // issuing was again interrupted, continue at start of next message // - keep aInterruptedCommandP pointer unchanged dodelete=false; PDEBUGPRINTFX(DBG_SESSION,("%s: continueIssue not finished -> queued interrupted command again", cmdP->getName() )); } else { // no interrupted command any more aInterruptedCommandP=NULL; } // delete if not queued if (dodelete) { PDEBUGPRINTFX(DBG_SESSION,("%s: continueIssue finished and not waiting for status -> deleting command", cmdP->getName() )); delete cmdP; } } // if status was received for interrupted command } // if interrupted command // send commands from queue (until interrupted again) #ifdef SYDEBUG if (!isAborted() && !isSuspending() && !aInterruptedCommandP && aNextMessageCommands.size()>0) { PDEBUGPRINTFX(DBG_SESSION,("Sending %ld commands that didn't make it into last message",(long)aNextMessageCommands.size())); } #endif TSmlCommandPContainer::iterator pos; while (!isAborted() && !isSuspending() && !aInterruptedCommandP && !outgoingMessageFull()) { // first in list pos=aNextMessageCommands.begin(); if (pos==aNextMessageCommands.end()) break; // done // take command out of the list cmdP=(*pos); aNextMessageCommands.erase(pos); // issue it (without luck, might land in the queue again --> %%% endless retry??) if (!issuePtr(cmdP,aNextMessageCommands,aInterruptedCommandP)) break; } } // TSyncSession::ContinuePackage // create, send and delete SyncHeader "command" void TSyncSession::issueHeader(bool aNoResp) { #ifdef SYDEBUG // Start output translation before issuing outgoing header XMLTranslationOutgoingStart(); #endif if (IS_CLIENT) { #ifdef SYDEBUG // for client, document exchange starts with outgoing message // but for server, SyncML_Outgoing is started before SyncML_Incoming, as SyncML_Incoming ends first PDEBUGBLOCKDESC("SyncML_Outgoing","start of new outgoing message"); PDEBUGPRINTFX(DBG_HOT,("=================> Started new outgoing message")); #endif #ifdef EXPIRES_AFTER_DATE // set 1/4 of the date here fCopyOfScrambledNow=((getSyncAppBase()->fScrambledNow)<<2)+503; // scramble again a little #endif } // create and send response header TSyncHeader *syncheaderP; MP_NEW(syncheaderP,DBG_OBJINST,"TSyncHeader",TSyncHeader(this,aNoResp)); PDEBUGBLOCKFMT(("SyncHdr","SyncHdr generation","SyncMLVers=%s|OutgoingMsgID=%ld",SyncMLVerDTDNames[fSyncMLVersion],(long)fOutgoingMsgID)); SYSYNC_TRY { // Note: do not use session's issue(), as this is designed for real commands, not headers if (syncheaderP->issue(0,fOutgoingMsgID)) { // - queue for status PDEBUGPRINTFX(DBG_PROTO,("SyncHdr: issued in MsgID=%ld, now queueing for status",(long)syncheaderP->getMsgID())); syncheaderP->setWaitingForStatus(true); fStatusWaitCommands.push_back(syncheaderP); } else { PDEBUGPRINTFX(DBG_PROTO,("SyncHdr: issued in MsgID=%ld, now deleting",(long)syncheaderP->getMsgID())); delete syncheaderP; // not used any more } DEBUGPRINTFX(DBG_PROTO,("Outgoing Message size is now %ld bytes",(long)getOutgoingMessageSize())); // - init number of commands in message fOutgoingCmds=0; // - now issue all commands that could not yet be sent because outgoing // message was not started #ifdef SYDEBUG if (fHeaderWaitCommands.size()>0) { PDEBUGPRINTFX(DBG_SESSION,("Sending %ld commands that were queued because header was not yet generated",(long)fHeaderWaitCommands.size())); } #endif TSmlCommandPContainer::iterator pos; while (!fAborted) { // first in list pos=fHeaderWaitCommands.begin(); if (pos==fHeaderWaitCommands.end()) break; // done // take command out of the list TSmlCommand *cmdP=(*pos); fHeaderWaitCommands.erase(pos); if (!cmdP) { DEBUGPRINTFX(DBG_ERROR,("There was a NULL command in the fHeaderWaitCommands queue?!?")); continue; } // issue now (as if all were OK for synchdr, because fNeedToAnswer may not be affected here!) if (!issuePtr(cmdP,fNextMessageCommands,fInterruptedCommandP,false,true)) { PDEBUGPRINTFX(DBG_SESSION,("Could not issue queued command")); break; } } PDEBUGENDBLOCK("SyncHdr"); } SYSYNC_CATCH (...) PDEBUGENDBLOCK("SyncHdr"); delete syncheaderP; // not used any more SYSYNC_RETHROW; // rethrow SYSYNC_ENDCATCH } // TSyncSession::IssueHeader // process a command (analyze and execute it). // Ownership of command is passed to process() in all cases. // Note: This method does not throw exceptions (catches all) and // is suitable for being called without further precautions from // SyncML toolkit callbacks. Exceptions are translated to // smlXXX error codes. Ret_t TSyncSession::process(TSmlCommand *aSyncCommandP) { if (aSyncCommandP) { SYSYNC_TRY { // first analyze it (before we can open the block, as we need to find cmdID fisrt) if (!aSyncCommandP->analyze(fIncomingState)) { // bad command PDEBUGPRINTFX(DBG_ERROR,("%s: command failed analyze() -> aborting session",aSyncCommandP->getName())); AbortSession(400,true); // local problem delete aSyncCommandP; } else { // command ok so far (has cmdid, so we can refer to it) PDEBUGBLOCKFMT(("processCmd","Processing incoming command", "Cmd=%s|IncomingMsgID=%ld|CmdID=%ld", aSyncCommandP->getName(), (long)aSyncCommandP->getMsgID(), (long)aSyncCommandP->getCmdID() )); SYSYNC_TRY { // - test if processing is enabled if (fIgnoreIncomingCommands && !aSyncCommandP->neverIgnore()) { // commands must be ignored (fatal error in previous command/header) PDEBUGPRINTFX(DBG_ERROR,("%s: IGNORED ",aSyncCommandP->getName())); // - still generate status (except if aborted status is 0, which means silent abort) // but DO NOT generate status for status! if (fStatusCodeForIgnored!=0 && aSyncCommandP->getCmdType()!=scmd_status) { PDEBUGPRINTFX(DBG_ERROR,(" Sending status %hd for ignored command",fStatusCodeForIgnored)); TStatusCommand *aStatusCmdP = aSyncCommandP->newStatusCommand(fStatusCodeForIgnored); issueRootPtr(aStatusCmdP); } // - delete unexecuted delete aSyncCommandP; } else if ( // Be extra careful: even if fStrictExecOrdering=false, still delay // further commands if they would overtake non-trivial commands in the // delay queue. This solves a particular problem where the Sync command // gets delayed due to slow TStdLogicDS::startDataAccessForServer(). // The server then sees a second (fake?!) Sync command (incoming MsgID=2, CmdID=0) // which it must delay instead of executing it. (fStrictExecOrdering || !onlyItemChangesPending()) && fDelayedExecutionCommands.size()>0 && aSyncCommandP->getCmdType()!=scmd_status && aSyncCommandP->getCmdType()!=scmd_alert ) { // some commands have been delayed already -> delay all non-statuses and alerts as well PDEBUGPRINTFX(DBG_SESSION,("%s: command received after other commands needed to be delayed -> must be delayed, too",aSyncCommandP->getName())); // - put into delayed execution queue delayExecUntilNextRequest(aSyncCommandP); } else { if (fDelayedExecutionCommands.size()>0 && !aSyncCommandP->canExecuteOutOfOrder()) { PDEBUGPRINTFX(DBG_SESSION,("%s: command cannot be executed with other commands already delayed -> flush queue",aSyncCommandP->getName())); fCmdIncoming = NULL; tryDelayedExecutionCommands(); } // command is ok, execute it fCmdIncomingState=aSyncCommandP->getPackageState(); // Queue Status commands issued during execute()? if (fDelayedExecutionCommands.size()>0 && aSyncCommandP->getCmdType()!=scmd_status && aSyncCommandP->getCmdType()!=scmd_alert) { // Yes, let issueRootPtr() attach to queue in aSyncCommandP and issue later // in tryDelayedExecutionCommands() resp. executeDelayedCmd(). fCmdIncoming=aSyncCommandP; } else { fCmdIncoming=NULL; } if (aSyncCommandP->execute()) { // execution finished, can be deleted if (aSyncCommandP->finished()) { if (aSyncCommandP->hasQueuedStatusCmds()) { PDEBUGPRINTFX(DBG_SESSION,("%s: command finished execution with pending Status replies -> queue command",aSyncCommandP->getName())); delayExecUntilNextRequest(aSyncCommandP); } else { PDEBUGPRINTFX(DBG_SESSION,("%s: command finished execution -> deleting",aSyncCommandP->getName())); delete aSyncCommandP; } } else { PDEBUGPRINTFX(DBG_SESSION,("%s: command NOT finished execution, NOT deleting now",aSyncCommandP->getName())); } } else { // command has not finished execution, must be retried after next incoming message PDEBUGPRINTFX(DBG_SESSION,("%s: command wants re-execution later -> queueing",aSyncCommandP->getName())); // - put into delayed execution queue delayExecUntilNextRequest(aSyncCommandP); } } // if not ignored // successfully processed fCmdIncoming=NULL; PDEBUGENDBLOCK("processCmd"); } // try SYSYNC_CATCH (...) fCmdIncoming=NULL; PDEBUGENDBLOCK("processCmd"); SYSYNC_RETHROW; SYSYNC_ENDCATCH } // if analyzed successfully } SYSYNC_CATCH (TSmlException &e) // Sml error exception somewhere in command processing // - make sure command is deleted (as issue owns it now) delete aSyncCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: process(cmd) SmlException: %s, smlerr=%hd",e.what(),e.getSmlError())); // - return SML error that caused this exception return e.getSmlError(); SYSYNC_ENDCATCH SYSYNC_CATCH (TSyncException &e) // sync exception during command processing // - make sure command is deleted (as issue owns it now) delete aSyncCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: process(cmd) SyncException: %s, status=%hd",e.what(),e.status())); // - unspecific SyncML toolkit error, causes session to abort return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH SYSYNC_CATCH (exception &e) // C++ exception during command processing // - make sure command is deleted (as issue owns it now) delete aSyncCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: process(cmd) Exception: %s",e.what())); // - unspecific SyncML toolkit error, causes session to abort return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH SYSYNC_CATCH (...) // other exception during command processing // - make sure command is deleted (as issue owns it now) delete aSyncCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: process(cmd) unknown exception: -> cmd deleted")); // - unspecific SyncML toolkit error, causes session to abort return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH } // successful return SML_ERR_OK; } // TSyncSession::process // process synchdr (analyze and execute it). // Ownership of command is passed to process() in all cases. // Note: May cause session reset if message sequence numbers are not ok. Ret_t TSyncSession::processHeader(TSyncHeader *aSyncHdrP) { if (aSyncHdrP) { PDEBUGBLOCKDESC("processHdr","Processing incoming SyncHdr"); SYSYNC_TRY { // init some session vars // - do not ignore commands by default fIgnoreIncomingCommands=false; // - need to answer raises out of first non-synchdr-status command issue()d fNeedToAnswer=false; // no need yet // - initialize message status fMsgNoResp=false; // default to response for messages fIncomingMsgID++; // count this incoming message // init flag bool tryagain=false; do { // first analyze header if (!aSyncHdrP->analyze(fIncomingState)) { // bad command PDEBUGPRINTFX(DBG_ERROR,("%s: failed analyze() -> deleting",aSyncHdrP->getName())); delete aSyncHdrP; aSyncHdrP = NULL; } else { // command is ok, execute it fCmdIncomingState=aSyncHdrP->getPackageState(); PDEBUGBLOCKFMT(("SyncHdr","Processing incoming SyncHdr", "IncomingMsgID=%ld", (long)fIncomingMsgID )); SYSYNC_TRY { if (aSyncHdrP->execute()) { // show session info after processing header #ifdef SYDEBUG PDEBUGPRINTFX(DBG_HOT,("Incoming SyncHdr processed, incomingMsgID=%ld, SyncMLVers=%s",(long)fIncomingMsgID,SyncMLVerDTDNames[fSyncMLVersion])); PDEBUGPRINTFX(DBG_HOT,("- Session ID='%s'",fSynchdrSessionID.c_str())); PDEBUGPRINTFX(DBG_HOT,("- Source (Remote party): URI='%s' DisplayName='%s'",fRemoteURI.c_str(),fRemoteName.c_str())); PDEBUGPRINTFX(DBG_HOT,("- Response to be sent to URI='%s'",fRespondURI.empty() ? "[none specified, back to source]" : fRespondURI.c_str())); PDEBUGPRINTFX(DBG_HOT,("- Target (Local party) : URI='%s' DisplayName='%s'",fLocalURI.c_str(),fLocalName.c_str())); #endif CONSOLEPRINTF(("> SyncML message #%ld received from '%s'",(long)fIncomingMsgID,fRemoteURI.c_str())); // - UTC support is implied for SyncML 1.0 (as most devices support it, and // there is was no way to signal it in 1.0). if (!fRemoteDevInfKnown && fSyncMLVersion==syncml_vers_1_0) fRemoteCanHandleUTC=true; // execution finished, can be deleted PDEBUGPRINTFX(DBG_SESSION,("%s: finished execution -> deleting",aSyncHdrP->getName())); delete aSyncHdrP; aSyncHdrP = NULL; // now execute delayed commands (before executing new ones) PDEBUGPRINTFX(DBG_SESSION,("New message: Executing %ld delayed commands",(long)fDelayedExecutionCommands.size())); bool syncEndAfterSyncPackageEnd=tryDelayedExecutionCommands(); // check if all delayed commands are executed now if (fDelayedExecSyncEnds<=0 && syncEndAfterSyncPackageEnd) { // there was at least one queued syncend executed AFTER end of incoming sync package // This means that we must finalize the sync-from-remote phase for the datastores here // (as it was suppressed when the incoming sync package had ended) TLocalDataStorePContainer::iterator dspos; for (dspos=fLocalDataStores.begin(); dspos!=fLocalDataStores.end(); ++dspos) { (*dspos)->engEndOfSyncFromRemote(true); } } else { PDEBUGPRINTFX(DBG_SESSION,("%ld delayed commands could not yet be executed and are left in the queue for next message",(long)fDelayedExecutionCommands.size())); } // now issue next package commands if any if (fNewOutgoingPackage) { PDEBUGPRINTFX(DBG_SESSION,("New package: Sending %ld commands that were generated earlier for this package",(long)fNextPackageCommands.size())); TSmlCommandPContainer::iterator nppos; for (nppos=fNextPackageCommands.begin(); nppos!=fNextPackageCommands.end(); nppos++) { // issue it (might land in NextMessageCommands) issueRootPtr((*nppos)); } // done sending next package commands fNextPackageCommands.clear(); // clear list } // done, don't try again break; } else { // unexecutable SyncHdr // - could be resent message if (fMessageRetried) { // simply abort processing, let transport handle this PDEBUGENDBLOCK("processHdr"); return LOCERR_RETRYMSG; // signal retry has happened } // - let agent decide what to do (and whether to try again executing the command) DEBUGPRINTFX(DBG_SESSION,("%s: Cannot be executed properly, trying to recover",aSyncHdrP->getName())); tryagain = syncHdrFailure(tryagain); } // synchdr not ok } // try SYSYNC_CATCH (...) PDEBUGENDBLOCK("SyncHdr"); SYSYNC_RETHROW; SYSYNC_ENDCATCH } } while(tryagain && aSyncHdrP); PDEBUGENDBLOCK("SyncHdr"); } SYSYNC_CATCH (TSmlException &e) // Sml error exception somewhere in command processing // - make sure command is deleted (as issue owns it now) delete aSyncHdrP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: synchdr SmlException: %s, smlerr=%hd",e.what(),e.getSmlError())); PDEBUGENDBLOCK("processHdr"); // - return SML error that caused this exception return e.getSmlError(); SYSYNC_ENDCATCH SYSYNC_CATCH (exception &e) // C++ exception somewhere in command processing // - make sure command is deleted (as issue owns it now) delete aSyncHdrP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: synchdr exception: %s",e.what())); PDEBUGENDBLOCK("processHdr"); // - return SML error that caused this exception return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH SYSYNC_CATCH (...) // other exception during command processing // - make sure command is deleted (as issue owns it now) delete aSyncHdrP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: synchdr unknown-class exception: -> deleted")); PDEBUGENDBLOCK("processHdr"); // - unspecific SyncML toolkit error, causes session to abort return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH } // successful PDEBUGENDBLOCK("processHdr"); return SML_ERR_OK; } // TSyncSession::processHeader bool TSyncSession::onlyItemChangesPending() { TSmlCommandPContainer::iterator pos=fDelayedExecutionCommands.begin(); while (pos!=fDelayedExecutionCommands.end()) { TSmlCommand *cmdP = *pos; switch (cmdP->getCmdType()) { // A white-list of commands perform simple data changes. // These commands can be overtaken by the execution of // other commands, see TSyncSession::process(). case scmd_add: case scmd_delete: case scmd_replace: case scmd_copy: break; default: return false; } ++pos; } return true; } bool TSyncSession::onlySyncPending() { TSmlCommandPContainer::iterator pos=fDelayedExecutionCommands.begin(); while (pos!=fDelayedExecutionCommands.end()) { TSmlCommand *cmdP = *pos; if (cmdP->getCmdType() != scmd_sync) { return false; } ++pos; } return true; } bool TSyncSession::tryDelayedExecutionCommands() { bool syncEndAfterSyncPackageEnd=false; // Always try issuing the first command until queue is empty. while (!fDelayedExecutionCommands.empty()) { // execute again TSmlCommand *cmdP = fDelayedExecutionCommands.front(); // command ok so far (has cmdid, so we can refer to it) PDEBUGBLOCKFMT(("executeDelayedCmd","Re-executing command from delayed queue", "Cmd=%s|IncomingMsgID=%ld|CmdID=%ld", cmdP->getName(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID() )); SYSYNC_TRY { fCmdIncomingState=cmdP->getPackageState(); if (executeDelayedCmd(cmdP)) { // check if this was a syncend which was now executed AFTER the end of the incoming sync package if (cmdP->getCmdType()==scmd_syncend) { fDelayedExecSyncEnds--; // count executed syncend if (cmdP->getPackageState()!=fIncomingState) syncEndAfterSyncPackageEnd=true; // remember that we had at least one } // execution finished, can be deleted if (fIncompleteDataCommandP == cmdP) { PDEBUGPRINTFX(DBG_SESSION,("%s: command incomplete -> keeping it for next message",cmdP->getName())); } else { PDEBUGPRINTFX(DBG_SESSION,("%s: command finished execution -> deleting",cmdP->getName())); delete cmdP; } // delete from queue fDelayedExecutionCommands.pop_front(); } else { // command has not finished execution, must be retried after next incoming message PDEBUGPRINTFX(DBG_SESSION,("%s: command STILL NOT finished execution -> keep it (and all follwoing) in queue ",cmdP->getName())); // keep this and all subsequent commands in the queue PDEBUGENDBLOCK("executeDelayedCmd"); break; } PDEBUGENDBLOCK("executeDelayedCmd"); } // try SYSYNC_CATCH (...) PDEBUGENDBLOCK("executeDelayedCmd"); SYSYNC_RETHROW; SYSYNC_ENDCATCH } return syncEndAfterSyncPackageEnd; } bool TSyncSession::executeDelayedCmd(TSmlCommand *aCmdP) { if (aCmdP->hasQueuedStatusCmds()) { // The only way how such a command can end up in the queue is // if it has finished earlier. Now we can try to issue the // queued status replies, because all previous commands have // been dealt with. // If a Sync command was queued, all of its SyncOp commands // were also queued. We are going to execute them now for the // first time, which depends on having fLocalSyncDatastoreP // set correctly (see TSyncOpCommand::execute()). This was // set when executing the Sync command for the first time, and // must be restored here, otherwise we end up using the // fLocalSyncDatastoreP from, for example, a previously resumed // SyncOp from a different datastore. if (aCmdP->getCmdType()==scmd_sync) { TSyncCommand *syncCommandP=static_cast(aCmdP); fLocalSyncDatastoreP=syncCommandP->getLocalDatastore(); PDEBUGPRINTFX(DBG_SESSION,("executeDelayedCmd: restore fLocalSyncDatastoreP from sync command")); } // Take over ownership of all queued status commands. TSmlCommandPContainer statusCmds; aCmdP->transferQueuedStatusCmds(statusCmds); SYSYNC_TRY { while (!statusCmds.empty()) { TSmlCommand *statusCmdP=statusCmds.front(); statusCmds.pop_front(); // All commands for which we might queue statuses send // them with default parameters (see synccommand.cpp). // Therefore we can do the same here, without having to // store the parameters. issueRootPtr(statusCmdP); } } SYSYNC_CATCH (...) TSmlCommandPContainerClear(statusCmds); SYSYNC_RETHROW; SYSYNC_ENDCATCH TSmlCommandPContainerClear(statusCmds); return true; } else { return aCmdP->execute(); } } #ifdef __PALM_OS__ #pragma segment session2 #endif // %%% integrate Results command here, too (that, is, make a common // ancestor for both TStatusCommand and TResultsCommand which // is then handled here in common). // handle a status "command" // Ownership of status is passed to handleStatus() in all cases. // Note: This method does not throw exceptions (catches all) and // is suitable for being called without further precautions from // SyncML toolkit callbacks. Exceptions are translated to // smlXXX error codes. Ret_t TSyncSession::handleStatus(TStatusCommand *aStatusCommandP) { if (aStatusCommandP) { PDEBUGBLOCKDESC("processStatus","Processing incoming Status"); SYSYNC_TRY { // analyze first if (!aStatusCommandP->analyze(fIncomingState)) { // bad command PDEBUGPRINTFX(DBG_SESSION,("%s: status failed analyze() -> deleting",aStatusCommandP->getName())); delete aStatusCommandP; } else { bool found=false; // status is ok, find matching command TSmlCommandPContainer::iterator pos; for (pos=fStatusWaitCommands.begin(); pos!=fStatusWaitCommands.end(); ++pos) { if ((*pos)->matchStatus(aStatusCommandP)) { PDEBUGPRINTFX(DBG_PROTO,("Found matching command '%s' for Status",(*pos)->getName())); (*pos)->setWaitingForStatus(false); // has received status found=true; if (fIgnoreIncomingCommands) { // ignore statuses, but remove waiting command from queue if ((*pos)->finished()) delete (*pos); // unfinished are owned otherwise and must not be deleted fStatusWaitCommands.erase(pos); PDEBUGPRINTFX(DBG_SESSION,("Status ignored, command considered done -> deleted")); } else { // let descendants know when we process a required status if ((*pos)->statusEssential()) { essentialStatusReceived(); } // normally process status if ((*pos)->handleStatus(aStatusCommandP)) { PDEBUGPRINTFX(DBG_SESSION,("Status: processed, removed command '%s' from status wait queue",(*pos)->getName())); // done with command, remove from queue if ((*pos)->finished()) { // - if this is an interrupted command, make sure to remove pointer if ((*pos)==fInterruptedCommandP) fInterruptedCommandP=NULL; // - delete command itself // NOTE; if not finished, command is owned otherwise and must // persist PDEBUGPRINTFX(DBG_SESSION,("Status: command '%s' has handled status and allows to be deleted",(*pos)->getName())); delete (*pos); } else { PDEBUGPRINTFX(DBG_SESSION,("Status: command '%s' has handled status, but not finished() -> NOT deleted",(*pos)->getName())); } // - anyway, remove from list fStatusWaitCommands.erase(pos); } else { // command not yet acknowledged, keep in queue (*pos)->setWaitingForStatus(true); // is again waiting for a status PDEBUGPRINTFX(DBG_SESSION,("(intermediate) Status processed, command kept in queue, not deleted")); } } // else normal processing break; // exit for loop (iterator is not ok any more) } } // for if (!found) { // no matching command found PDEBUGPRINTFX(DBG_ERROR,("No command found for status -> ignoring")); } // now delete status delete aStatusCommandP; } // if analyzed successfully } SYSYNC_CATCH (TSmlException &e) // Sml error exception somewhere in command processing // - make sure command is deleted (as issue owns it now) delete aStatusCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: handleStatus SmlException: %s, smlerr=%hd",e.what(),e.getSmlError())); PDEBUGENDBLOCK("processStatus"); // - return SML error that caused this exception return e.getSmlError(); SYSYNC_ENDCATCH SYSYNC_CATCH (exception &e) // Sml error exception somewhere in command processing // - make sure command is deleted (as issue owns it now) delete aStatusCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: handleStatus exception: %s",e.what())); PDEBUGENDBLOCK("processStatus"); // - unspecific SyncML toolkit error, causes session to abort return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH SYSYNC_CATCH (...) // other exception during command processing // - make sure command is deleted (as issue owns it now) delete aStatusCommandP; PDEBUGPRINTFX(DBG_ERROR,("WARNING: handleStatus unknown-class exception: -> deleted")); PDEBUGENDBLOCK("processStatus"); // - unspecific SyncML toolkit error, causes session to abort return SML_ERR_UNSPECIFIC; SYSYNC_ENDCATCH } // successful PDEBUGENDBLOCK("processStatus"); return SML_ERR_OK; } // TSyncSession::handleStatus // Session level meta SmlPcdataPtr_t TSyncSession::newHeaderMeta(void) { SmlPcdataPtr_t metaP = NULL; // create meta for initialisation message only #ifdef SEND_MAXMSGSIZE_ON_INIT_ONLY if (fOutgoingState<=psta_init) #endif { metaP=newMeta(); SmlMetInfMetInfPtr_t metinfP = smlPCDataToMetInfP(metaP); // - add max message size metinfP->maxmsgsize=newPCDataLong(getRootConfig()->fLocalMaxMsgSize); if ( (getRootConfig()->fLocalMaxObjSize>0) && (fSyncMLVersion>=syncml_vers_1_1) ) { // SyncML 1.1 has object size metinfP->maxobjsize=newPCDataLong(getRootConfig()->fLocalMaxObjSize); } } return metaP; } // TSyncSession::newHeaderMeta // create new SyncHdr structure for TSyncHeader command // (here because all data for this is in session anyway) // Called exclusively from TSyncHeader command SmlSyncHdrPtr_t TSyncSession::NewOutgoingSyncHdr(bool aOutgoingNoResp) { SmlSyncHdrPtr_t headerP; MP_SHOWCURRENT(DBG_PROFILE,"Start of outgoing message"); // set response status for entire message fOutgoingNoResp=aOutgoingNoResp; // get new number for this message fOutgoingMsgID++; // reset message size counting fOutgoingMsgSize=0; // reset command ID fOutgoingCmdID=0; // now compose Sync Header from session vars // - create empty header headerP = SML_NEW(SmlSyncHdr_t); #ifdef EXPIRES_AFTER_DATE // prepare for a check, convert back to normal value * 4 sInt32 scramblednow4 = (fCopyOfScrambledNow-503); #endif SYSYNC_TRY { // set proto element type to make it auto-disposable headerP->elementType=SML_PE_HEADER; // set version information headerP->version=newPCDataString(SyncMLVerDTDNames[fSyncMLVersion]); headerP->proto=newPCDataString(SyncMLVerProtoNames[fSyncMLVersion]); // set session ID headerP->sessionID=newPCDataString(fSynchdrSessionID); // set new message ID for this message #ifdef APP_CAN_EXPIRE // check for expiry again #ifdef EXPIRES_AFTER_DATE // - has hard expiry date if ( (scramblednow4>SCRAMBLED_EXPIRY_VALUE*4) #ifdef SYSER_REGISTRATION && (!getSyncAppBase()->fRegOK) // only abort if no registration (but accept timed registration) #endif ) getSyncAppBase()->fAppExpiryStatus=LOCERR_EXPIRED; #else // - no hard expiry date, just check if license is still valid if ( !getSyncAppBase()->fRegOK || // no registered at all getSyncAppBase()->fDaysLeft==0 // or expired ) getSyncAppBase()->fAppExpiryStatus=LOCERR_EXPIRED; #endif #endif headerP->msgID=newPCDataLong(fOutgoingMsgID); // flags headerP->flags=fOutgoingNoResp ? SmlNoResp_f : 0; // target (URI/Name of Remote party) // Note: Tsutomu Uenoyama (uenoyama@trl.mei.co.jp) sais in syncml feedback // list that server RespURI behaviour should // be reflecting received RespURI in target, so we do it: headerP->target=newLocation( fRespondURI.empty() ? fRemoteURI.c_str() : fRespondURI.c_str(), fRemoteName.c_str() ); PDEBUGPRINTFX(DBG_PROTO,("Target (Remote URI) = '%s'",fRespondURI.empty() ? fRemoteURI.c_str() : fRespondURI.c_str())); // source (URI / User-Name of local party) // NOTE: The LocName must contain the name of the user and not // the name of the device (this is a SyncML 1.0.1 correction // to make MD5 auth implementable - we need a clear-text user name) headerP->source=newLocation( fLocalURI.c_str(), getUsernameForRemote() // user name for remote login, NULL if none available ); // add respURI if local party cannot be responded to via normal URI // New added for T68i: do not send a RespURI for an aborted session if (!isAborted() && fMessageAuthorized) headerP->respURI=newResponseURIForRemote(); else headerP->respURI=NULL; // add credentials if remote needs them headerP->cred=newCredentialsForRemote(); // agent-specific meta headerP->meta=newHeaderMeta(); } SYSYNC_CATCH (...) // make sure header is disposed smlFreeProtoElement(headerP); SYSYNC_RETHROW; // re-throw SYSYNC_ENDCATCH // return it return headerP; } // TSyncSession::NewOutgoingSyncHdr // delay command for execution at beginning of next received message void TSyncSession::delayExecUntilNextRequest(TSmlCommand *aCommand) { // push into delay queue fDelayedExecutionCommands.push_back(aCommand); // a delayed (=not processed) syncstart must clear the current fLocalSyncDatastoreP, // as it is not yet known for that . This causes syncops to receive a NULL datastore // at creation, so they must check for that and get it at execute(). if (aCommand->getCmdType()==scmd_sync) { // delayed has no datastore (yet) fLocalSyncDatastoreP=NULL; PDEBUGPRINTFX(DBG_DATA,("delayExecUntilNextRequest: unsetting fLocalSyncDatastoreP for scmd_sync")); } else if (aCommand->getCmdType()==scmd_syncend) { // count delayed syncends as they need special care later fDelayedExecSyncEnds++; if (fLocalSyncDatastoreP) { // and forget current datastore - safety only, should be NULL here anyway fLocalSyncDatastoreP=NULL; PDEBUGPRINTFX(DBG_DATA,("processSyncEnd: unsetting fLocalSyncDatastoreP for scmd_syncend")); } } } // TSyncSession::delayExecUntilNextRequest // remote party requests next message by Alert 222 void TSyncSession::nextMessageRequest(void) { // count the request fNextMessageRequests++; if (IS_SERVER) { // check if we have seen many requests but could not fulfil them if (fNextMessageRequests>3) { // check for resume that does not send us an empty Sync (Symbian client at TestFest 16) PDEBUGPRINTFX(DBG_ERROR,("Warning: More than 3 consecutive Alert 222 - looks like endless loop, check if we need to work around client implementation issues")); // - check datastores TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // see if it is currently resuming TLocalEngineDS *ldsP = (*pos); if (ldsP->isResuming() && ldsP->getDSState() from client to get things going again // - create it SmlSyncPtr_t fakeSyncCmdP = (SmlSyncPtr_t)smlLibMalloc(sizeof(SmlSync_t)); fakeSyncCmdP->elementType = SML_PE_SYNC_START; fakeSyncCmdP->cmdID=NULL; // none needed here fakeSyncCmdP->flags=0; // none fakeSyncCmdP->cred=NULL; fakeSyncCmdP->target=newLocation(ldsP->getName()); // client would target myself fakeSyncCmdP->source=newLocation(ldsP->getRemoteDBPath()); // client would target myself fakeSyncCmdP->meta=NULL; // no meta fakeSyncCmdP->noc=NULL; // no NOC // - have it processed like it was a real command PDEBUGPRINTFX(DBG_HOT+DBG_PROTO,("Probably client expects resume to continue without sending an empty -> simulate one")); PDEBUGBLOCKFMT(( "Resume_Sim_Sync","Simulated empty sync to get resume going", "datastore=%s", ldsP->getName() )); TStatusCommand *fakeStatusCmdP = new TStatusCommand(this); bool queueforlater=false; /* bool ok= */ processSyncStart( fakeSyncCmdP, *fakeStatusCmdP, queueforlater // will be set if command must be queued for later re-execution ); if (!queueforlater) { fNextMessageRequests=0; // reset that counter // and make sure we advance the sync session state // - now the real ugly hacking starts - we have to fake receiving a fFakeFinalFlag=true; } else { PDEBUGPRINTFX(DBG_ERROR,("simulated can't be processed now, we'll try again later")); } // now just simulate a processSyncEnd(queueforlater); // now let this particular datastore "know" that sync-from-client is over now (*pos)->engEndOfSyncFromRemote(true); // fake "final" PDEBUGENDBLOCK("Resume_Sim_Sync"); } } } } // server } // TSyncSession::nextMessageRequest // check if session must continue (for session-level reasons, that // is without regarding sync state of server or client) bool TSyncSession::sessionMustContinue(void) { // if there are delayed commands not yet executed after this message: session must go on if (!fDelayedExecutionCommands.empty()) { PDEBUGPRINTFX(DBG_SESSION,( "%ld commands in delayed-execution-queue -> session must continue", (long)fDelayedExecutionCommands.size() )); return true; // must continue } // if no status to wait for: session may be deleted now if (fStatusWaitCommands.empty()) return false; TSmlCommandPContainer::iterator pos; // show them #ifdef SYDEBUG for (pos=fStatusWaitCommands.begin(); pos!=fStatusWaitCommands.end(); ++pos) { TSmlCommand *cmdP = *pos; // show that command was not answered PDEBUGPRINTFX(DBG_PROTO,("- Not yet received %sstatus for command '%s', (outgoing MsgID=%ld, CmdID=%ld)", cmdP->statusEssential() ? "REQUIRED " : "", cmdP->getName(), (long)cmdP->getMsgID(), (long)cmdP->getCmdID() )); } #endif // check type of commands we miss status for bool mustgoon=false; for (pos=fStatusWaitCommands.begin(); pos!=fStatusWaitCommands.end(); ++pos) { TSmlCommand *cmdP = *pos; if (cmdP->statusEssential()) { // we need a status for at least one of these mustgoon=true; break; } } // if only one single status to wait for, check if it is // SyncHdr status; if no, session MUST continue // (otherwise, remote will not send status for SyncHdr alone) if (mustgoon) { PDEBUGPRINTFX(DBG_HOT,("SESSION CANNOT END - Not yet received REQUIRED status for some of %ld commands",(long)fStatusWaitCommands.size())); } return mustgoon; } // TSyncSession::sessionMustContinue // returns true if session has pending commands bool TSyncSession::hasPendingCommands(void) { return (!( fNextMessageCommands.size()==0 && // ..no commands to send in next message AND fDelayedExecutionCommands.size()==0 && // ..no commands to process in next message AND fInterruptedCommandP==NULL // ..no interrupted outgoing commands )); } // TSyncSession::hasPendingCommands // finish outgoing Message, returns true if final message of package bool TSyncSession::FinishMessage(bool aAllowFinal, bool aForceNonFinal) { Ret_t err; bool final=true; // finish message if any if (fOutgoingStarted) { // there is an unfinished message, finish it // - final only if no commands waiting for next message // and caller allows final final= !aForceNonFinal && ( fAborted || // if aborted, this is a final message, OR.. (aAllowFinal && !hasPendingCommands()) // ..(if allowed final AND no pending commands) ); // ...THEN this is a final package PDEBUGPRINTFX(DBG_PROTO,( "Ending message with %s%ld next-message/%ld next-package commands: %sFINAL (%sfinal %sallowed by caller)", fInterruptedCommandP ? "interrupted command and " : "", (long)fNextMessageCommands.size(), (long)fNextPackageCommands.size(), final ? "" : "NOT ", fAborted ? "ABORTED, " : "", aAllowFinal ? "" : "not " )); // - close message now sInt32 bytesbeforeissue=getSmlWorkspaceFreeBytes(); fOutgoingStarted=false; // done now fOutgoingMessageFull=false; // message finished, not full any more #ifdef SYDEBUG if (fXMLtranslate && fOutgoingXMLInstance) smlEndMessage(fOutgoingXMLInstance,final); // Now dump XML translation of outgoing message XMLTranslationOutgoingEnd(); #endif if ((err=smlEndMessage(fSmlWorkspaceID, final))!=SML_ERR_OK) { SYSYNC_THROW(TSmlException("smlEndMessage",err)); } incOutgoingMessageSize(bytesbeforeissue-getSmlWorkspaceFreeBytes()); PDEBUGPRINTFX(DBG_PROTO,("Entire message size is now %ld Bytes",(long)getOutgoingMessageSize())); // if outgoing message was not final, prevent session end // except if session is aborted (and final flag is forced nonFinal e.g. when ending session because of serverBusy() if (!final && !fAborted) fInProgress=true; CONSOLEPRINTF(("< SyncML message #%ld sent to '%s'",(long)fOutgoingMsgID,fRespondURI.empty() ? fRemoteURI.c_str() : fRespondURI.c_str())); MP_SHOWCURRENT(DBG_PROFILE,"End of outgoing message"); // dump it if configured #ifdef SYDEBUG DumpSyncMLMessage(true); // outgoing #endif } // if this message ends with , next message will be in new package fNewOutgoingPackage=final; return final; } // TSyncSession::FinishMessage // get name of current encoding const char *TSyncSession::getEncodingName(void) { return SyncMLEncodingMIMENames[fEncoding]; } // TSyncSession::getEncodingName // add current encoding spec to given (type-)string void TSyncSession::addEncoding(string &aString) { aString+=SYNCML_ENCODING_SEPARATOR; aString+=getEncodingName(); } // TSyncSession::addEncoding // set encoding for session void TSyncSession::setEncoding(SmlEncoding_t aEncoding) { Ret_t err=smlSetEncoding(fSmlWorkspaceID,aEncoding); if (err==SML_ERR_OK) { fEncoding = aEncoding; } } // TSyncSession::setEncoding // find remote datastore by (remote party specified) URI TRemoteDataStore *TSyncSession::findRemoteDataStore(const char *aDatastoreURI) { TRemoteDataStorePContainer::iterator pos; TRemoteDataStore *bestMatchP=NULL; uInt16 bestNumMatched=0; // search for BEST match (most number of chars matched) for (pos=fRemoteDataStores.begin(); pos!=fRemoteDataStores.end(); ++pos) { // test for match if ((*pos)->isDatastore(aDatastoreURI) > bestNumMatched) { bestMatchP = *pos; // best so far, but check all } } return bestMatchP; // return NULL if no match found or best matching } // TSyncSession::findRemoteDataStore // - find local datastore by URI and separate identifying from optional part of URI TLocalEngineDS *TSyncSession::findLocalDataStoreByURI(const char *aURI,string *aOptions, string *aIdentifyingURI) { string dburi; // - get relative URI of requested database const char *dblocuri = SessionRelativeURI(aURI); // In this base class implementation, identification is path, options are CGI // - separate target address and CGI (if any) const char *optionsCGI=(const char *)strchr(dblocuri,'?'); if (optionsCGI) { dburi.assign(dblocuri,optionsCGI-dblocuri); optionsCGI++; // skip '?' dblocuri=dburi.c_str(); PDEBUGPRINTFX(DBG_PROTO,("Target Address CGI Options: %s",optionsCGI)); if (aOptions) aOptions->assign(optionsCGI); } else { // no CGI contained if (aOptions) aOptions->erase(); } // assign identifying part of URL now if (aIdentifyingURI) { aIdentifyingURI->assign(dblocuri); } // find datastore now DEBUGPRINTF(("Determined relative, identifying URI (w/o CGI): %s",dblocuri)); return findLocalDataStore(dblocuri); } // TSyncSession::findLocalDataStorebyURI // find local datastore by (relative) URI TLocalEngineDS *TSyncSession::findLocalDataStore(const char *aDatastoreURI) { TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // test for match (we do not do best-match search here because these are names // under our own control that do not contain slashes and hence no // mismatch possibilities like "/Calendar" and "/Calendar/Events" as // with Oracle server. if ((*pos)->isDatastore(aDatastoreURI)) return (*pos); // found } return NULL; // none found } // TSyncSession::findLocalDataStore // - find local datastore by datastore handle (=config pointer) TLocalEngineDS *TSyncSession::findLocalDataStore(void *aDSHandle) { TLocalDataStorePContainer::iterator pos; for (pos=fLocalDataStores.begin(); pos!=fLocalDataStores.end(); ++pos) { // test for match TLocalEngineDS *ldsP = (*pos); if ((void *)(ldsP->getDSConfig())==aDSHandle) return (ldsP); // found } return NULL; // none found } // TSyncSession::findLocalDataStore TLocalEngineDS *TSyncSession::addLocalDataStore(TLocalDSConfig *aLocalDSConfigP) { TLocalEngineDS *ldsP=aLocalDSConfigP->newLocalDataStore(this); fLocalDataStores.push_back(ldsP); return ldsP; } // TSyncSession::addLocalDataStore // - find local datatype by config pointer (used to avoid duplicating types // in session if used by more than a single datastore) TSyncItemType *TSyncSession::findLocalType(TDataTypeConfig *aDataTypeConfigP) { TSyncItemTypePContainer::iterator pos; for (pos=fLocalItemTypes.begin(); pos!=fLocalItemTypes.end(); ++pos) { // test for match if ((void *)((*pos)->getTypeConfig())==aDataTypeConfigP) return (*pos); // found } return NULL; // none found } // TSyncSession::findLocalType // - find implemented remote datatype by config pointer (and related datastore, if any) TSyncItemType *TSyncSession::findRemoteType(TDataTypeConfig *aDataTypeConfigP, TSyncDataStore *aRelatedRemoteDS) { TSyncItemTypePContainer::iterator pos; for (pos=fRemoteItemTypes.begin(); pos!=fRemoteItemTypes.end(); ++pos) { // test for match if ((void *)((*pos)->getTypeConfig())==aDataTypeConfigP) { // match only if related to same datastore or not related if (aRelatedRemoteDS == (*pos)->getRelatedDatastore()) return (*pos); // found } } return NULL; // none found } // TSyncSession::findRemoteType // get new list of all local datastores SmlDevInfDatastoreListPtr_t TSyncSession::newDevInfDataStoreList(bool aAlertedOnly, bool aWithoutCTCapProps) { SmlDevInfDatastoreListPtr_t rootP,*insertpos; SmlDevInfDatastorePtr_t datastoreP; // no list at beginning rootP=NULL; insertpos = &rootP; // go through local datastore list TLocalDataStorePContainer::iterator pos1; for (pos1=fLocalDataStores.begin(); pos1!=fLocalDataStores.end(); ++pos1) { // check if we only want alerted datastore's info (client case) if (aAlertedOnly) { if (!(*pos1)->testState(dssta_clientsentalert)) continue; // not alerted, do not show this one } // see if we have info at all datastoreP = (*pos1)->getDatastoreDevinf(IS_SERVER, aWithoutCTCapProps); if (datastoreP) { // create new list item (*insertpos) = SML_NEW(SmlDevInfDatastoreList_t); (*insertpos)->next = NULL; (*insertpos)->data = datastoreP; // set new insert position insertpos = &((*insertpos)->next); } } return rootP; } // TSyncSession::newDevInfDataStoreList // get common sync capabilities mask of this session (datastores might modify it) uInt32 TSyncSession::getSyncCapMask(void) { return SCAP_MASK_NORMAL | (getSessionConfig()->fAcceptServerAlerted ? SCAP_MASK_SERVER_ALERTED : 0); } // TSyncSession::getSyncCapMask // get new list of all local item types SmlDevInfCtcapListPtr_t TSyncSession::newLocalCTCapList(bool aAlertedOnly, TLocalEngineDS *aOnlyForDS, bool aWithoutCTCapProps) { SmlDevInfCtcapListPtr_t rootP,*insertpos; SmlDevInfCTCapPtr_t ctcapP; // no list at beginning rootP=NULL; insertpos = &rootP; bool showTy; TTypeVariantDescriptor variantDesc = NULL; // go through local datastore list // Note: rulematch types should normally not be shown, but the way to do that // is not some testing here (which is almost impossible), but profiles // defined for rulematch types should be made invisible. TSyncItemTypePContainer::iterator pos2; TLocalDataStorePContainer::iterator pos1; for (pos2=fLocalItemTypes.begin(); pos2!=fLocalItemTypes.end(); ++pos2) { showTy=true; // check for restriction to certain datastore if (aOnlyForDS) { // only show if specified datastore is using the type showTy = aOnlyForDS->doesUseType(*pos2, &variantDesc); } // see if datatype is used by any of the alerted datastores if (showTy && aAlertedOnly) { showTy=false; for (pos1=fLocalDataStores.begin(); pos1!=fLocalDataStores.end(); ++pos1) { // check if we only want alerted datastore's info (client case) if (!(*pos1)->testState(dssta_clientsentalert)) continue; // test next // see if datatype is used by this datastore if ((*pos1)->doesUseType(*pos2)) { showTy=true; break; } } } // now show if selected if (showTy) { // see if we have info at all ctcapP = (*pos2)->getCTCapDevInf(aOnlyForDS, variantDesc, aWithoutCTCapProps); if (ctcapP) { // create new list item (*insertpos) = SML_NEW(SmlDevInfCtcapList_t); (*insertpos)->next = NULL; (*insertpos)->data = ctcapP; // set new insert position insertpos = &((*insertpos)->next); } } } return rootP; } // TSyncSession::newLocalCTCapList // build DevInf of this session SmlDevInfDevInfPtr_t TSyncSession::newDevInf(bool aAlertedOnly, bool aWithoutCTCapProps) { SmlDevInfDevInfPtr_t devinfP; // Create empty DevInf devinfP = SML_NEW(SmlDevInfDevInf_t); // Fill in information for current session devinfP->verdtd=newPCDataString(SyncMLVerDTDNames[fSyncMLVersion]); // - identification of this SyncML implementation devinfP->man=newPCDataOptString(getSyncAppBase()->getManufacturer().c_str()); devinfP->mod=newPCDataOptString(getSyncAppBase()->getModel().c_str()); devinfP->oem=newPCDataOptString(getSyncAppBase()->getOEM()); devinfP->swv=newPCDataOptString(getSyncAppBase()->getSoftwareVersion()); // - identification of the device ID and type (server/client etc.) devinfP->devid=newPCDataString(getDeviceID().c_str()); devinfP->devtyp=newPCDataString(getDeviceType().c_str()); // - identification of the platform the software runs on devinfP->hwv=newPCDataOptString(getSyncAppBase()->getHardwareVersion().c_str()); devinfP->fwv=newPCDataOptString(getSyncAppBase()->getFirmwareVersion().c_str()); // Now get info for content capabilities if (fSyncMLVersionctcap=newLocalCTCapList(aAlertedOnly, NULL, aWithoutCTCapProps); } else devinfP->ctcap=NULL; // no global CTCap any more at devInf level // Now get info for datastores devinfP->datastore=newDevInfDataStoreList(aAlertedOnly, aWithoutCTCapProps); // SyncML 1.1 related flags devinfP->flags=0; // no SyncML 1.1 flags by default if (fSyncMLVersion>=syncml_vers_1_1) { // - we can always parse number of changes (whether we can make use of it is irrelevant) devinfP->flags |= SmlDevInfNOfM_f; // - check if we support UTC based time (implementations with no means to obtain time zone might not) if (canHandleUTC()) devinfP->flags |= SmlDevInfUTC_f; // we can handle UTC // - we support large object devinfP->flags |= SmlDevInfLargeObject_f; } // Now get extensions info devinfP->ext=NULL; // %%% tdb, optional // return return devinfP; } // TSyncSession::newDevInf // get devInf for this session (caller is passed ownership) SmlItemPtr_t TSyncSession::getLocalDevInfItem(bool aAlertedOnly, bool aWithoutCTCapProps) { // - create item with correct source and Meta information SmlItemPtr_t devinf = newItem(); // %%% if strictly following example in SyncML protocol specs, // source should not have a Displayname //fLocalDevInfItemP->source=newLocation(SYNCML_DEVINF_LOCURI,SYNCML_DEVINF_LOCNAME); // %%% if strictly following example in SyncML protocol specs, // source should not have "./" prefix // %%% this is disputable, DCM expects ./, so we send it again now devinf->source=newLocation(SyncMLDevInfNames[fSyncMLVersion]); // - create meta type /* %%% if strictly following example in SyncML protocol specs, meta * must be defined in the result/put command, not the individual item string metatype=SYNCML_DEVINF_META_TYPE; addEncoding(metatype); fLocalDevInfItemP->meta=newMetaType(metatype.c_str()); %%% */ // - create DevInf PCData devinf->data = SML_NEW(SmlPcdata_t); devinf->data->contentType=SML_PCDATA_EXTENSION; devinf->data->extension=SML_EXT_DEVINF; // - %%% assume length is not relevant for structured content (looks like in mgrutil.c) devinf->data->length=0; // - create and insert DevInf devinf->data->content = newDevInf(aAlertedOnly, aWithoutCTCapProps); // - done return devinf; } // TSyncSession::getLocalDevInfItem // analyze remote devinf delivered by Put or Get/Result commands // or loaded from cache by loadRemoteDevInf() localstatus TSyncSession::analyzeRemoteDevInf( SmlDevInfDevInfPtr_t aDevInfP ) { localstatus sta = LOCERR_OK; PDEBUGBLOCKDESC("DevInf_Analyze","Analyzing remote devInf"); if (!aDevInfP) { PDEBUGPRINTFX(DBG_ERROR,("Warning: No DevInf found (possible cause: improperly encoded devInf from remote)")); sta=400; // no devInf goto done; } else { // we have seen the devinf now fRemoteDevInfKnown=true; // analyze what device we have here PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,( "Device ID='%" FMT_LENGTH(".50") "s', Type='%" FMT_LENGTH(".20") "s', Model='%" FMT_LENGTH(".50") "s'", FMT_LENGTH_LIMITED(50,smlPCDataToCharP(aDevInfP->devid)), FMT_LENGTH_LIMITED(20,smlPCDataToCharP(aDevInfP->devtyp)), FMT_LENGTH_LIMITED(50,smlPCDataToCharP(aDevInfP->mod)) )); PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,( "Manufacturer='%" FMT_LENGTH(".30") "s', OEM='%" FMT_LENGTH(".30") "s'", FMT_LENGTH_LIMITED(30,smlPCDataToCharP(aDevInfP->man)), FMT_LENGTH_LIMITED(30,smlPCDataToCharP(aDevInfP->oem)) )); PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,( "Softwarevers='%" FMT_LENGTH(".30") "s', Firmwarevers='%" FMT_LENGTH(".30") "s', Hardwarevers='%" FMT_LENGTH(".30") "s'", FMT_LENGTH_LIMITED(30,smlPCDataToCharP(aDevInfP->swv)), FMT_LENGTH_LIMITED(30,smlPCDataToCharP(aDevInfP->fwv)), FMT_LENGTH_LIMITED(30,smlPCDataToCharP(aDevInfP->hwv)) )); #ifndef MINIMAL_CODE // get the devinf details 1:1 fRemoteDevInf_devid=smlPCDataToCharP(aDevInfP->devid); fRemoteDevInf_devtyp=smlPCDataToCharP(aDevInfP->devtyp); fRemoteDevInf_mod=smlPCDataToCharP(aDevInfP->mod); fRemoteDevInf_man=smlPCDataToCharP(aDevInfP->man); fRemoteDevInf_oem=smlPCDataToCharP(aDevInfP->oem); fRemoteDevInf_swv=smlPCDataToCharP(aDevInfP->swv); fRemoteDevInf_fwv=smlPCDataToCharP(aDevInfP->fwv); fRemoteDevInf_hwv=smlPCDataToCharP(aDevInfP->hwv); // get the descriptive name of the device fRemoteDescName.assign(smlPCDataToCharP(aDevInfP->man)); if (fRemoteDescName.size()>0) fRemoteDescName+=" "; fRemoteDescName.append(smlPCDataToCharP(aDevInfP->mod)); // get extra info: "Type (HWV, FWV, SWV) Oem" fRemoteInfoString+=fRemoteDevInf_devtyp; fRemoteInfoString+=" ("; fRemoteInfoString+=fRemoteDevInf_hwv; fRemoteInfoString+=", "; fRemoteInfoString+=fRemoteDevInf_fwv; fRemoteInfoString+=", "; fRemoteInfoString+=fRemoteDevInf_swv; fRemoteInfoString+=") "; fRemoteInfoString+=fRemoteDevInf_oem; #endif // Show SyncML version here (again) PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,("SyncML Version: %s",SyncMLVerProtoNames[fSyncMLVersion])); // check SyncML 1.1 flags if (fSyncMLVersion>=syncml_vers_1_1) { // - check if remote can receive NOC (number of changes) fRemoteWantsNOC = (aDevInfP->flags & SmlDevInfNOfM_f); // - check if remote can handle UTC time fRemoteCanHandleUTC = (aDevInfP->flags & SmlDevInfUTC_f); // - check if remote supports large objects fRemoteSupportsLargeObjects = (aDevInfP->flags & SmlDevInfLargeObject_f); PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,( "SyncML capability flags: wantsNOC=%s, canHandleUTC=%s, supportsLargeObjs=%s", aDevInfP->flags & SmlDevInfNOfM_f ? "Yes" : "No", aDevInfP->flags & SmlDevInfUTC_f ? "Yes" : "No", aDevInfP->flags & SmlDevInfLargeObject_f ? "Yes" : "No" )); } // detect remote specific server behaviour if needed SmlDevInfDevInfPtr_t CTCapDevInfP = aDevInfP; sta = checkRemoteSpecifics(aDevInfP, &CTCapDevInfP); if (sta!=LOCERR_OK) { remoteAnalyzed(); // analyzed to reject goto done; } // switch to DevInf provided by remote rules if (CTCapDevInfP != aDevInfP) { PDEBUGPRINTFX(DBG_REMOTEINFO,("using CTCaps provided in DevInf of remote rule")); aDevInfP = CTCapDevInfP; } // Types and datastores may not be changed/added if sync has allready started if (fRemoteDevInfLock) { // Sync already started, in "blind" mode or previously received devInf, // do not confuse things with changing devInf in mid-sync PDEBUGPRINTFX(DBG_ERROR,( "WARNING: Type and Datastore info in DevInf ignored because it came to late" )); } else { if (getSyncMLVersion()ctcap; // loop through list PDEBUGBLOCKDESC("RemoteTypes", "Analyzing remote types listed in devInf level CTCap"); if (fIgnoreCTCap) { // ignore CTCap if (ctlP) { PDEBUGPRINTFX(DBG_REMOTEINFO+DBG_HOT,("Remote rule prevents looking at CTCap")); } } else { while (ctlP) { if (ctlP->data) { // create appropriate remote data itemtypes if (TSyncItemType::analyzeCTCapAndCreateItemTypes( this, NULL, // this is the pre-DS1.2 style where CTCap is on devInf level ctlP->data, // CTCap fLocalItemTypes, // look up in local types for specialized classes fRemoteItemTypes // add new item types here )) { // we have CTCap info of at least one remote type fRemoteDataTypesKnown=true; } else { PDEBUGPRINTFX(DBG_ERROR,("CTCap could not be used (missing version)")); sta=500; } } // - go to next item ctlP=ctlP->next; } // while } PDEBUGENDBLOCK("RemoteTypes"); } // if datastore; while(dslP) { if (dslP->data) { // we have DataStore info of remote datastores fRemoteDataStoresKnown=true; // there is a DataStore entry, create RemoteDataStore for it TRemoteDataStore *datastoreP; MP_NEW(datastoreP,DBG_OBJINST,"TRemoteDataStore",TRemoteDataStore(this)); PDEBUGBLOCKDESC("RemoteDSDevInf", "Registering remote Datastore from devInf"); // let new datastore analyze the devinf data if (!datastoreP->setDatastoreDevInf( dslP->data, fLocalItemTypes, // look up for datatypes here first fRemoteItemTypes // but add types here )) { // invalid CTCap PDEBUGPRINTFX(DBG_ERROR,("Invalid DataStore devInf")); delete datastoreP; // forget invalid data store sta=500; // failed } else { // CTCap set successfully, new type created // - save it in the list of remote types fRemoteDataStores.push_back(datastoreP); } PDEBUGENDBLOCK("RemoteDSDevInf"); } // - go to next item dslP=dslP->next; } // while PDEBUGENDBLOCK("RemoteDatastores"); } // else sync not started yet } // give descendants possibility to do something with the analyzed data remoteAnalyzed(); // ok done: PDEBUGENDBLOCK("DevInf_Analyze"); return sta; } // TSyncSession::analyzeRemoteDevInf #ifdef SYSYNC_SERVER // Initialize Sync: set up datastores and types for server sync session localstatus TSyncSession::initSync( const char *aLocalDatastoreURI, const char *aRemoteDatastoreURI ) { localstatus sta = LOCERR_OK; // search for local datastore first string cgiOptions; // - search for datastore and obtain possible CGI; // fallback to remote datastore URI is for Sony Ericsson C510, // which sends an empty target (= local) URI (also needs // to be done in Alert handling) fLocalSyncDatastoreP = findLocalDataStoreByURI(SessionRelativeURI((!aLocalDatastoreURI || !aLocalDatastoreURI[0]) ? aRemoteDatastoreURI : aLocalDatastoreURI),&cgiOptions); PDEBUGPRINTFX(DBG_DATA,("initSync: setting fLocalSyncDatastoreP")); if (!fLocalSyncDatastoreP) { // no such local datastore return 404; } // Local datastore is known here (fLocalSyncDatastoreP) // - now init for reception of syncops sta = fLocalSyncDatastoreP->engInitForSyncOps(aRemoteDatastoreURI); #ifdef SYNCML_TAF_SUPPORT if (sta==LOCERR_OK) { // - make sure that options are reparsed (TAF *might* change from Sync request to Sync request) sta = fLocalSyncDatastoreP->engParseOptions( cgiOptions.c_str(), true // we are parsing options from target URI ); } #endif #ifdef OBJECT_FILTERING if (sta==LOCERR_OK) { // %%% check for DS 1.2 in command as well (we do parse in already) #if (!defined _MSC_VER || defined WINCE) && !defined(__GNUC__) #warning "tbd %%%: check for DS 1.2 in command as well (we do parse in already)" #endif } #endif #ifdef OBJECT_FILTERING // Show filter summary #ifdef SYDEBUG #ifdef SYNCML_TAF_SUPPORT PDEBUGPRINTFX(DBG_FILTER,("TAF (temporary, INCLUSIVE) Filter : %s",fLocalSyncDatastoreP->fTargetAddressFilter.c_str())); #endif // SYNCML_TAF_SUPPORT PDEBUGPRINTFX(DBG_FILTER,("SyncSet (dynamic, EXCLUSIVE) Filter : %s",fLocalSyncDatastoreP->fSyncSetFilter.c_str())); #ifdef SYSYNC_TARGET_OPTIONS string ts; StringObjTimestamp(ts,fLocalSyncDatastoreP->fDateRangeStart); PDEBUGPRINTFX(DBG_FILTER,("Date Range Start : %s",fLocalSyncDatastoreP->fDateRangeStart ? ts.c_str() : "")); StringObjTimestamp(ts,fLocalSyncDatastoreP->fDateRangeEnd); PDEBUGPRINTFX(DBG_FILTER,("Date Range End : %s",fLocalSyncDatastoreP->fDateRangeEnd ? ts.c_str() : "")); #endif // SYSYNC_TARGET_OPTIONS #endif // SYDEBUG #endif // OBJECT_FILTERING // return status return sta; } // TSyncSession::initSync #endif // SYSYNC_SERVER // end sync group (of client sync commands) bool TSyncSession::processSyncEnd(bool &aQueueForLater) { bool ok=true; // inform local if (fLocalSyncDatastoreP) { // let datastore process it ok=fLocalSyncDatastoreP->engProcessSyncCmdEnd(aQueueForLater); } // end Sync bracket #ifdef SYNCSTATUS_AT_SYNC_CLOSE // %%% status for sync command sent AFTER statuses for contained commands if (fSyncCloseStatusCommandP) issueRoot(fSyncCloseStatusCommandP); #endif // no local datastore active fLocalSyncDatastoreP=NULL; PDEBUGPRINTFX(DBG_DATA,("processSyncEnd: unsetting fLocalSyncDatastoreP")); return ok; } // TSyncSession::processSyncEnd // process generic sync command item within Sync group // - returns true (and unmodified or non-200-successful status) if // operation could be processed regularily // - returns false (but probably still successful status) if // operation was processed with internal irregularities, such as // trying to delete non-existant item in datastore with // incomplete Rollbacks (which returns status 200 in this case!). bool TSyncSession::processSyncOpItem( TSyncOperation aSyncOp, // the operation SmlItemPtr_t aItemP, // the item to be processed SmlMetInfMetInfPtr_t aMetaP, // command-wide meta, if any TLocalEngineDS *aLocalSyncDatastore, // the local datastore for this syncop item TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater // must be set if item cannot be processed now, but must be processed later ) { // assign datastore context (%%% note: some day we will get rid of this // "global" pointer to the active datastore by moving it into the command // object and installing a hierarchical command processor.) fLocalSyncDatastoreP=aLocalSyncDatastore; PDEBUGPRINTFX(DBG_DATA,("processSyncOpItem: setting fLocalSyncDatastoreP")); // Server mode: commands affect datastores currently in sync if (!fLocalSyncDatastoreP) { // sync generic command outside sync bracket -> error aStatusCommand.setStatusCode(403); // forbidden ADDDEBUGITEM(aStatusCommand,"Add/Copy/Replace/Delete unrelated to datastores"); PDEBUGPRINTFX(DBG_ERROR,("Add/Copy/Replace/Delete unrelated to datastores")); // no success return false; } // check for aborted datastore if (fLocalSyncDatastoreP->CheckAborted(aStatusCommand)) return false; // check if we can process it now // Note: request time limit is active in server only. if (!fLocalSyncDatastoreP->engIsStarted(false) || RemainingRequestTime()<0) { aQueueForLater=true; // re-execute later... return true; // ...but otherwise ok } // process Sync operation sent by remote // - show PDEBUGPRINTFX(DBG_DATA,( "Remote sent %s-operation:", SyncOpNames[aSyncOp] )); PDEBUGPRINTFX(DBG_DATA,( "- Source: remoteID ='%s', remoteName='%s'", smlSrcTargLocURIToCharP(aItemP->source), smlSrcTargLocNameToCharP(aItemP->source) )); PDEBUGPRINTFX(DBG_DATA,( "- Target: localID ='%s', remoteName='%s'", smlSrcTargLocURIToCharP(aItemP->target), smlSrcTargLocNameToCharP(aItemP->target) )); // now let datastore handle it bool regular = fLocalSyncDatastoreP->engProcessSyncOpItem(aSyncOp, aItemP, aMetaP, aStatusCommand); TSyError statuscode = aStatusCommand.getStatusCode(); if (statuscode == LOCERR_AGAIN) { if (fStrictExecOrdering) { // Cannot reorder commands, so force execution now. If we had a way of // telling the store that it should not use LOCERR_AGAIN, we could // avoid this unnecessary "delay + flush" for each item. PDEBUGPRINTFX(DBG_DATA,("Re-executing %s-operation because is on.", SyncOpNames[aSyncOp])); regular = fLocalSyncDatastoreP->engProcessSyncOpItem(aSyncOp, aItemP, aMetaP, aStatusCommand); statuscode = aStatusCommand.getStatusCode(); } else { PDEBUGPRINTFX(DBG_DATA,("Queueing %s-operation for later.", SyncOpNames[aSyncOp])); aQueueForLater=true; // re-execute later... return true; // ...but otherwise ok } } #ifdef SCRIPT_SUPPORT // let script check status code if the operation completed TErrorFuncContext errctx; errctx.statuscode = statuscode; errctx.newstatuscode = errctx.statuscode; errctx.syncop = aSyncOp; errctx.datastoreP = fLocalSyncDatastoreP; // call script regular = TScriptContext::executeTest( regular, // pass through regular status fSessionScriptContextP, getSessionConfig()->fReceivedItemStatusScript, &ErrorFuncTable, &errctx // caller context ); // not completely handled, use possibly modified status code #ifdef SYDEBUG if (aStatusCommand.getStatusCode() != errctx.newstatuscode) { PDEBUGPRINTFX(DBG_ERROR,("Status: Session Script changed original status=%hd to %hd (original op was %s)",aStatusCommand.getStatusCode(),errctx.newstatuscode,SyncOpNames[errctx.syncop])); } #endif aStatusCommand.setStatusCode(errctx.newstatuscode); #endif // check status if (!regular) { localstatus sta=aStatusCommand.getStatusCode(); if (sta>=300 && sta!=419) { // conflict resolved with server data is not an error PDEBUGPRINTFX(DBG_ERROR,( "processSyncOpItem: Error while processing item, status=%hd", aStatusCommand.getStatusCode() )); fLocalSyncDatastoreP->fLocalItemsError++; // count this as an error, as remote will see it as such } else { PDEBUGPRINTFX(DBG_DATA+DBG_HOT,( "processSyncOpItem: Irregularity while processing item, status=%hd", aStatusCommand.getStatusCode() )); } } // done return regular; } // TSyncSession::processSyncOpItem #endif // not SYNCSESSION_PART2_EXCLUDE #ifndef SYNCSESSION_PART1_EXCLUDE // generate challenge for session SmlChalPtr_t TSyncSession::newSessionChallenge(void) { sysync::TAuthTypes auth = requestedAuthType(); // Avoid misleading debug output (there is no challenge) // and more importantly, creating a new nonce that is not // going to be used. That causes unnecessary disk writes. if (auth == sysync::auth_none) return NULL; string nonce; getNextNonce(fRemoteURI.c_str(),nonce); PDEBUGPRINTFX(DBG_PROTO,( "Challenge for next auth: AuthType=%s, Nonce='%s', binary %sallowed", authTypeSyncMLNames[auth], nonce.c_str(), getEncoding()==SML_WBXML ? "" : "NOT " )); return newChallenge(auth,nonce,getEncoding()==SML_WBXML); } // TSyncSession::newSessionChallenge // generate credentials (based on fRemoteNonce, fRemoteRequestedAuth, fRemoteRequestedAuthEnc) SmlCredPtr_t TSyncSession::newCredentials(const char *aUser, const char *aPassword) { SmlCredPtr_t credP = NULL; SmlMetInfMetInfPtr_t metinfP = NULL; uInt8 *authdata = NULL; void *tobefreed = NULL; uInt32 authdatalen=0; bool isbinary=false; uInt8 digest[16]; // for MD5 digest // create auth data // - build basic user/pw string string userpw; userpw.assign(aUser); userpw+=':'; userpw.append(aPassword); // - code auth data switch (fRemoteRequestedAuth) { case auth_basic: // Note: this has been clarified in SyncML 1.1: even if B64 is inherent for // Basic auth, specifying B64 as format does NOT mean that user:pw is B64-ed twice, // but it is just an optional declaration of the inherent B64 format. #ifdef BASIC_AUTH_HAS_INHERENT_B64 // %%% seems to be wrong according to SCTS... // Note that the b64 here is PART OF THE BASIC AUTH SCHEME // so format MUST NOT specify b64 again! fRemoteRequestedAuthEnc=fmt_chr; // make b64 of string authdata=(uInt8 *)b64::encode((const uInt8 *)userpw.c_str(), userpw.size(), &authdatalen); tobefreed=(void *)authdata; // remember to free at end of routine #else // basic auth is always b64 encoded fRemoteRequestedAuthEnc=fmt_b64; authdata=(uInt8 *)userpw.c_str(); #endif break; case auth_md5: // Note that b64 encoding IS NOT part of the MD5 auth scheme. // Only if remote specifies b64 format in challenge, b64 encoding is applied if (fSyncMLVersion=syncml_vers_1_1) { // starting with 1.1, nonce is added to b64ed-MD5 and the MD5ed again // - B64 it authdata=(uInt8*)b64::encode(digest, 16, &authdatalen); // - MD5 it while adding nonce md5::Init (&context); md5::Update (&context, authdata, authdatalen); b64::free((void *)authdata); // return buffer allocated by b64::encode // - important: add colon as nonce separator md5::Update (&context, (uInt8 *) ":", 1); // - also add nonce that will be used for checking later md5::Update (&context, (uInt8 *) fRemoteNonce.c_str(), fRemoteNonce.size()); // - this is the MD5 auth value // according to SyncML 1.1, // "changes_for_syncml_represent_v11_20020215.pdf", Section 2.19 md5::Final (digest, &context); // - according to the above mentioned section 2.19, MD5 auth is // always b64 encoded, even in binary transports. This is a // contradiction to discussion in syncml@yahoogroups, particularily // a statement by Peter Thompson who stated that MD5 auth MUST NOT // be b64 encoded in WBXML. Who knows??? fRemoteRequestedAuthEnc=fmt_b64; } // syncml 1.1 // auth data is 16 byte digest value in binary authdata=(uInt8 *)digest; authdatalen=16; isbinary=true; break; default : break; } // switch if (authdata) { // create cred credP = SML_NEW(SmlCred_t); // now add auth data (format if necessary) // - force b64 anyway if content is binary but transport isn't if (isbinary && getEncoding()==SML_XML) { fRemoteRequestedAuthEnc=fmt_b64; isbinary=false; } // - create formatted version of content. Use Opaque for binary content credP->data=newPCDataFormatted(authdata,authdatalen,fRemoteRequestedAuthEnc,isbinary); // create meta and get pointer credP->meta=newMeta(); metinfP = smlPCDataToMetInfP(credP->meta); // add auth type meta metinfP->type=newPCDataString(authTypeSyncMLNames[fRemoteRequestedAuth]); // Note: aEncType==fmt_chr will not add format tag, as fmt_chr is the default metinfP->format=newPCDataFormat(fRemoteRequestedAuthEnc,false); // no format if default of fmt_chr } // free buffer if (tobefreed) b64::free(tobefreed); // return cred or NULL if none return credP; } // TSyncSession::newCredentials // check credentials // Note: should be called even if there are no credentials, as we // need a Session login BEFORE generating status with next Nonce bool TSyncSession::checkCredentials(const char *aUserName, const SmlCredPtr_t aCredP, TStatusCommand &aStatusCommand) { TAuthTypes authtype=auth_basic; // default to basic char *tobefreed = NULL; const char *authdata = NULL; TFmtTypes authfmt = fmt_chr; bool authok = false; #ifdef EXPIRES_AFTER_DATE // check for hard expiry again if ( (fCopyOfScrambledNow>(SCRAMBLED_EXPIRY_VALUE*4+503)) #ifdef SYSER_REGISTRATION && (!getSyncAppBase()->fRegOK) // only abort if no registration (but accept timed registration) #endif ) { aStatusCommand.setStatusCode(401); // seems to be hacked return false; } #endif // Check type of credentials if (!aCredP) { // Anonymous login attempt authtype=auth_none; } else { SmlMetInfMetInfPtr_t metaP; if ((metaP=smlPCDataToMetInfP(aCredP->meta))!=NULL) { // look for type if (metaP->type) { // get type (otherwise default to auth-basic) const char *ty = smlPCDataToCharP(metaP->type); sInt16 t; if (StrToEnum(authTypeSyncMLNames,numAuthTypes,t,ty)) { authtype=(TAuthTypes)t; } else { // bad auth schema authtype=auth_none; // disable checking below aStatusCommand.setStatusCode(406); // unsupported optional feature (auth method) aStatusCommand.addItemString(ty); // identify bad auth method } } // look for format // - get format if (!smlPCDataToFormat(metaP->format,authfmt)) { authtype=auth_none; // disable checking below aStatusCommand.setStatusCode(415); // unsupported format aStatusCommand.addItemString(smlPCDataToCharP(metaP->format)); // identify bad format } // - handle format and get auth data according to auth type authdata = smlPCDataToCharP(aCredP->data); // get it as is // Now check auth switch (authtype) { case auth_none: // anonymous login attempt // - no special measure needed break; case auth_basic: // basic is always b64 encoded #ifdef SYDEBUG if (authfmt!=fmt_b64) PDEBUGPRINTFX(DBG_ERROR,("Auth-basic has no b64 spec --> assumed b64 anyway")); #endif authfmt=fmt_b64; // basic is ALWAYS b64 break; case auth_md5: // verify that we have the username in clear text for MD5 auth if (!aUserName || *aUserName==0) { // username missing, probably strict (bad) SyncML 1.0 conformance, // we need SyncML 1.0.1 corrected auth (MD5 w/o username is almost // impossible to process) authtype=auth_none; // disable checking below aStatusCommand.setStatusCode(415); // unsupported format ADDDEBUGITEM(aStatusCommand,"Missing clear-text username in Source LocName (SyncML 1.0.1)"); PDEBUGPRINTFX(DBG_ERROR,("Missing clear-text username in Source LocName (SyncML 1.0.1)")); break; } // MD5 can come as binary (for WBXML) if (getEncoding()==SML_WBXML) { if (authfmt==fmt_chr || authfmt==fmt_bin) { // assume unencoded MD5 digest (16 bytes binary), make b64 uInt32 l; tobefreed=b64::encode((uInt8 *)authdata,16,&l); authdata=tobefreed; // now authdata is b64 as well authfmt=fmt_b64; } } break; case numAuthTypes: // invalid type?! break; } } // if meta } #ifndef MINIMAL_CODE // save user name for later reference if (aUserName) fSyncUserName.assign(aUserName); else fSyncUserName.erase(); #endif // check credentials if (authtype==auth_none) { // check if we can login anonymously // NOTE: do it anyway, even if !isAuthTypeAllowed() to make sure // SessionLogin is called authok=checkCredentials(aUserName,NULL,auth_none); if (!authok || !isAuthTypeAllowed(auth_none)) { // anonymous login not possible, request credentials aStatusCommand.setStatusCode(407); // unauthorized, missing credentials PDEBUGPRINTFX(DBG_PROTO,("Authorization required but none found in SyncHdr, sending status 407 + chal")); // - add challenge aStatusCommand.setChallenge(newSessionChallenge()); authok=false; } } else { // verify format (must be MD5 by now) if (authfmt!=fmt_b64) { aStatusCommand.setStatusCode(415); // unsupported format } else if (!authdata || !*authdata) { aStatusCommand.setStatusCode(400); // missing data, malformed request } else { // first check credentials // NOTE: This must be done first, to force calling SessionLogin // in all cases authok=checkCredentials(aUserName,authdata,authtype); // now check result if (!isAuthTypeAllowed(authtype)) { aStatusCommand.setStatusCode(401); // we need another auth type, tell client which one authok=false; // anyway, reject PDEBUGPRINTFX(DBG_ERROR,("Authorization failed (wrong type of creds), sending 401 + chal")); } else if (!authok) { // auth type allowed, but auth itself not ok aStatusCommand.setStatusCode(401); // unauthorized, bad credentials PDEBUGPRINTFX(DBG_ERROR,("Authorization failed (invalid credentials) sending 401 + chal")); } if (!authok) { // - add challenge aStatusCommand.setChallenge(newSessionChallenge()); } } } // free buffer if any if (tobefreed) b64::free(tobefreed); // make sure we see what config was used in the log DebugShowCfgInfo(); PDEBUGPRINTFX(DBG_HOT,( "==== Authorisation %s with SyncML Engine Version %d.%d.%d.%d", authok ? "successful" : "failed", SYSYNC_VERSION_MAJOR, SYSYNC_VERSION_MINOR, SYSYNC_SUBVERSION, SYSYNC_BUILDNUMBER )); if (IS_SERVER) { #ifdef SYSYNC_SERVER PDEBUGPRINTFX(DBG_HOT,( "==== SyncML URL used = '%s', username as sent by remote = '%s'", fInitialLocalURI.c_str(), fSyncUserName.c_str() )); #endif } // server // return result return authok; } // TSyncSession::checkCredentials(SmlCredPtr_t...) // check credential string bool TSyncSession::checkCredentials(const char *aUserName, const char *aCred, TAuthTypes aAuthType) { // now check auth if (aAuthType==auth_basic) { // basic auth allows extracting clear-text password string user,password; getAuthBasicUserPass(aCred,user,password); #ifndef MINIMAL_CODE fSyncUserName = user; #endif if (aUserName && !(user==aUserName)) { // username does not match LocName (should, in SyncML 1.0.1 and later) PDEBUGPRINTFX(DBG_PROTO,( "basic_auth encoded username (%s) does not match LocName username (%s)", user.c_str(), aUserName ? aUserName : "[NULL Username]" )); } // we have the password in clear text return SessionLogin(user.c_str(), password.c_str(), sectyp_clearpass, fRemoteURI.c_str()); } else if (aAuthType==auth_md5) { // login user and device to the service // - this is normally implemented in derived classes return SessionLogin(aUserName, aCred, fSyncMLVersion>=syncml_vers_1_1 ? sectyp_md5_V11 : sectyp_md5_V10, fRemoteURI.c_str()); } else if (aAuthType==auth_none) { // even if we have no login, do a "login" with empty credentials return SessionLogin("anonymous", NULL, sectyp_anonymous, fRemoteURI.c_str()); } else { return false; // unknown auth, is not ok } } // TSyncSession::checkCredentials(const char *...) // Helper function: // check plain user / password / nonce combination // against given auth string. bool TSyncSession::checkAuthPlain( const char *aUserName, const char *aPassWord, const char *aNonce, // given values const char *aAuthString, TAuthSecretTypes aAuthStringType // check against this ) { string upw; #ifdef SYDEBUG PDEBUGPRINTFX(DBG_ADMIN,("Username = %s",aUserName)); DEBUGPRINTFX(DBG_USERDATA+DBG_EXOTIC,("Password = %s",aPassWord)); #endif if (aAuthStringType==sectyp_anonymous) { return (aPassWord==NULL || *aPassWord==0); // anonymous login ok if no password expected } else if (aAuthStringType==sectyp_clearpass) { return (strcmp(aAuthString,aPassWord)==0); // login ok if password matches } else { // must be MD5 // - concatenate user:password upw = aUserName; upw+=':'; upw.append(aPassWord); // depends on method if (aAuthStringType==sectyp_md5_V11) { // V1.1 requires MD5b64-ing user/pw before adding nonce MD5B64(upw.c_str(),upw.size(),upw); } // now check result return checkMD5WithNonce(upw.c_str(),aNonce,aAuthString); } // unknown auth secret type return false; } // TSyncSession::checkAuthPlain // Helper function: // check MD5B64(user:pw) / nonce combination // against given auth string. bool TSyncSession::checkAuthMD5( const char *aUserName, const char *aMD5B64, const char *aNonce, // given values const char *aAuthString, TAuthSecretTypes aAuthStringType // check against this ) { if (aAuthStringType==sectyp_md5_V11) { // we have a V11 authstring, check it against our MD5B64(user:pw) return checkMD5WithNonce(aMD5B64,aNonce,aAuthString); } else if (aAuthStringType==sectyp_clearpass) { // we must generate the MD5B64(user:pw) from clear text string myAuthString = aUserName; myAuthString+=':'; myAuthString+=aAuthString; MD5B64(myAuthString.c_str(),myAuthString.size(),myAuthString); #ifdef SYDEBUG PDEBUGPRINTFX(DBG_ADMIN,("MD5B64(user:pw) stored in local DB = %s",aMD5B64)); PDEBUGPRINTFX(DBG_ADMIN,("calculated MD5B64(remoteuser:remotepw) = %s",myAuthString.c_str())); #endif // then we can directly compare them return myAuthString==aMD5B64; } else return false; // we cannot auth V1.0 MD5 against MD5B64(user:password) } // checkAuthMD5 // Helper function: // check V1.1 MD5 type auth against known md5userpass // (B64 encoded MD5 digest of user:password) and nonce // Note: This works only with V1.1-type credentials!!!! bool TSyncSession::checkMD5WithNonce( const char *aStringBeforeNonce, const char *aNonce, const char *aMD5B64Creds ) { string pattern; // pattern to match with // see if user/pw/nonce matches given MD5 // - add nonce to prepared string // For V1.0 this is "user:password" // For >=V1.1 this is MD5B64("user:password") pattern = aStringBeforeNonce; pattern+=':'; pattern.append(aNonce); // - MD5 and B64 entire thing (again) MD5B64(pattern.c_str(),pattern.size(),pattern); #ifdef SYDEBUG DEBUGPRINTFX(DBG_ADMIN ,("String before Nonce = %s",aStringBeforeNonce)); DEBUGPRINTFX(DBG_ADMIN ,("Nonce used = %s",aNonce)); PDEBUGPRINTFX(DBG_ADMIN,("Locally calculated MD5B64 = %s",pattern.c_str())); PDEBUGPRINTFX(DBG_ADMIN,("Received MD5B64 from remote = %s",aMD5B64Creds)); #endif // - now compare with given credentials return strnncmp(aMD5B64Creds,pattern.c_str(),pattern.size())==0; } // TSyncSession::checkMD5WithNonce // helper: get user/password out of basic credential string, returns false if bad cred bool TSyncSession::getAuthBasicUserPass(const char *aBasicCreds, string &aUsername, string &aPassword) { // - convert to user/pw string uInt32 userpwlen; uInt8 *userpw=b64::decode(aBasicCreds, 0, &userpwlen); bool ok=false; if (userpw) { // adjust length if already null terminated if (userpw[userpwlen-1]==0) userpwlen=strlen((char *)userpw); // extract plain-text username first const char *p=strchr((const char *)userpw,':'); if (p) { // save user name aUsername.assign((const char *)userpw,p-(const char *)userpw); // save password aPassword.assign(p+1); ok=true; } } b64::free(userpw); return ok; } // TSyncSession::getAuthBasicUserPass // check credential string (clear text pw, MD5, etc.) // This function is normally derived to provide checking of auth string // Notes: // - all auth requests are resolved using this function. // - For pre-SyncML 1.1 MD5 auth, credentials are checkable only // against plain text passwords. It's up to the derived class to decide if // this is possible or not. bool TSyncSession::SessionLogin( const char *aUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID ) { string nonce; // get config for session TSessionConfig *scP = getSessionConfig(); // anonymous is always ok (because checking if anonymous allowed is done already) if (aAuthStringType==sectyp_anonymous) return true; // ok // check simple auth if (scP->fSimpleAuthUser.empty()) return false; // no simple auth // check user name if (strucmp(scP->fSimpleAuthUser.c_str(),aUserName)!=0) return false; // wrong user name // now check auth string if (aAuthStringType==sectyp_md5_V10 || aAuthStringType==sectyp_md5_V11) { // we need a nonce getAuthNonce(aDeviceID,nonce); } // now check return checkAuthPlain( scP->fSimpleAuthUser.c_str(), scP->fSimpleAuthPassword.c_str(), nonce.c_str(), aAuthString, aAuthStringType ); } // TSyncSession::SessionLogin // check remote devinf to detect special behaviour needed for some clients (or servers). Base class // does not do anything on server level (configured rules are handled at session level) // - NOTE: aDevInfP can be NULL to specify that remote device has not sent any devInf at all // and this is a blind sync attempt (so best-guess workaround settings might apply) localstatus TSyncSession::checkRemoteSpecifics(SmlDevInfDevInfPtr_t aDevInfP, SmlDevInfDevInfPtr_t *aOverrideDevInfP) { #if defined(SYSER_REGISTRATION) || !defined(NO_REMOTE_RULES) localstatus sta = LOCERR_OK; #endif // check hard-coded restrictions if (aDevInfP && ( false #ifdef REMOTE_RESTR_DEVID || strwildcmp(smlPCDataToCharP(aDevInfP->devid),REMOTE_RESTR_DEVID)!=0 #endif #ifdef REMOTE_RESTR_MAN || strwildcmp(smlPCDataToCharP(aDevInfP->man),REMOTE_RESTR_MAN)!=0 #endif #ifdef REMOTE_RESTR_MOD || strwildcmp(smlPCDataToCharP(aDevInfP->mod),REMOTE_RESTR_MOD)!=0 #endif #ifdef REMOTE_RESTR_OEM || strwildcmp(smlPCDataToCharP(aDevInfP->oem),REMOTE_RESTR_OEM)!=0 #endif #ifdef REMOTE_RESTR_URI || strwildcmp(fRemoteURI.c_str(),REMOTE_RESTR_URI)!=0 #endif )) { PDEBUGPRINTFX(DBG_ERROR,("Software not allowed syncing with this remote party")); AbortSession(403,true); return 403; } // check license restrictions #ifdef SYSER_REGISTRATION sInt16 daysleft; string s; // - get restriction string from licensed info sta = getSyncAppBase()->getAppEnableInfo(daysleft, NULL, &s); string restrid,restrval; const char *p = s.c_str(); // start of license info string while (sta==LOCERR_OK && (p=getSyncAppBase()->getLicenseRestriction(p,restrid,restrval))!=NULL) { const char *restr=NULL; if (restrid=="u") { // URL // we can check the remote URL without having devinf restr=fRemoteURI.c_str(); } else { if (restrid.size()==1) { // there is a restriction if (!aDevInfP) { // we cannot check these restrictions without having a devInf sta = LOCERR_BADREG; PDEBUGPRINTFX(DBG_ERROR,("License restriction needs devInf from remote but none found -> block sync")); break; } // we have devinf, we can check it switch (restrid[0]) { case 'i' : restr=smlPCDataToCharP(aDevInfP->devid); break; case 'm' : restr=smlPCDataToCharP(aDevInfP->man); break; case 't' : restr=smlPCDataToCharP(aDevInfP->mod); break; case 'o' : restr=smlPCDataToCharP(aDevInfP->oem); break; } } } // - now compare with wildcards allowed if we have anything to compare if (restr) sta = strwildcmp(restr,restrval.c_str())==0 ? LOCERR_OK : LOCERR_BADREG; // service unavailable } // - abort if not ok if (sta!=LOCERR_OK) { PDEBUGPRINTFX(DBG_ERROR,("License does not allow syncing with this remote party, status=%hd",sta)); AbortSession(403,true,sta); return sta; } #endif // SYSER_REGISTRATION // check remote rules #ifndef NO_REMOTE_RULES PDEBUGBLOCKDESC("RemoteRules","Checking for remote rules"); // get config for session TSessionConfig *scP = getSessionConfig(); // look if we have matching rule(s) for this device TRemoteRulesList::iterator pos; for(pos=scP->fRemoteRulesList.begin();pos!=scP->fRemoteRulesList.end();pos++) { TRemoteRuleConfig *ruleP = *pos; // compare with devinf (or test for default-rule if aDevInfP is NULL if ( !ruleP->fSubRule && // subrules never apply directly (ruleP->fManufacturer.empty() || (aDevInfP && strwildcmp(smlPCDataToCharP(aDevInfP->man),ruleP->fManufacturer.c_str())==0)) && (ruleP->fModel.empty() || (aDevInfP && strwildcmp(smlPCDataToCharP(aDevInfP->mod),ruleP->fModel.c_str())==0)) && (ruleP->fOem.empty() || (aDevInfP && strwildcmp(smlPCDataToCharP(aDevInfP->oem),ruleP->fOem.c_str())==0)) && (ruleP->fFirmwareVers.empty() || (aDevInfP && ruleP->fFirmwareVers==smlPCDataToCharP(aDevInfP->fwv))) && (ruleP->fSoftwareVers.empty() || (aDevInfP && ruleP->fSoftwareVers==smlPCDataToCharP(aDevInfP->swv))) && (ruleP->fHardwareVers.empty() || (aDevInfP && ruleP->fHardwareVers==smlPCDataToCharP(aDevInfP->hwv))) && (ruleP->fDevId.empty() || (aDevInfP && ruleP->fDevId==smlPCDataToCharP(aDevInfP->devid))) && (ruleP->fDevTyp.empty() || (aDevInfP && ruleP->fDevTyp==smlPCDataToCharP(aDevInfP->devtyp))) ) { // found matching rule PDEBUGPRINTFX(DBG_HOT,("Found '%s' matching for this peer",ruleP->getName())); // remember it fActiveRemoteRules.push_back(ruleP); // add included subrules TRemoteRulesList::iterator spos; for(spos=ruleP->fSubRulesList.begin();spos!=ruleP->fSubRulesList.end();spos++) { fActiveRemoteRules.push_back(*spos); PDEBUGPRINTFX(DBG_HOT,("- rule also activates sub-rule '%s'",(*spos)->getName())); } // if this rule is final, don't check for further matches if (ruleP->fFinalRule) break; } } // process activated rules and subrules for(pos=fActiveRemoteRules.begin();pos!=fActiveRemoteRules.end();pos++) { // activate this rule TRemoteRuleConfig *ruleP = *pos; if (ruleP->fOverrideDevInfP && aOverrideDevInfP) { // processing in caller will continue with updated DevInf *aOverrideDevInfP = ruleP->fOverrideDevInfP; } // - apply options that have a value if (ruleP->fLegacyMode>=0) fLegacyMode = ruleP->fLegacyMode; if (ruleP->fLenientMode>=0) fLenientMode = ruleP->fLenientMode; if (ruleP->fLimitedFieldLengths>=0) fLimitedRemoteFieldLengths = ruleP->fLimitedFieldLengths; if (ruleP->fDontSendEmptyProperties>=0) fDontSendEmptyProperties = ruleP->fDontSendEmptyProperties; if (ruleP->fDoQuote8BitContent>=0) fDoQuote8BitContent = ruleP->fDoQuote8BitContent; if (ruleP->fDoNotFoldContent>=0) fDoNotFoldContent = ruleP->fDoNotFoldContent; if (ruleP->fNoReplaceInSlowsync>=0) fNoReplaceInSlowsync = ruleP->fNoReplaceInSlowsync; if (ruleP->fTreatRemoteTimeAsLocal>=0) fTreatRemoteTimeAsLocal = ruleP->fTreatRemoteTimeAsLocal; if (ruleP->fTreatRemoteTimeAsUTC>=0) fTreatRemoteTimeAsUTC = ruleP->fTreatRemoteTimeAsUTC; if (ruleP->fVCal10EnddatesSameDay>=0) fVCal10EnddatesSameDay = ruleP->fVCal10EnddatesSameDay; if (ruleP->fIgnoreDevInfMaxSize>=0) fIgnoreDevInfMaxSize = ruleP->fIgnoreDevInfMaxSize; if (ruleP->fIgnoreCTCap>=0) fIgnoreCTCap = ruleP->fIgnoreCTCap; if (ruleP->fDSPathInDevInf>=0) fDSPathInDevInf = ruleP->fDSPathInDevInf; if (ruleP->fDSCgiInDevInf>=0) fDSCgiInDevInf = ruleP->fDSCgiInDevInf; if (ruleP->fUpdateClientDuringSlowsync>=0) fUpdateClientDuringSlowsync = ruleP->fUpdateClientDuringSlowsync; if (ruleP->fUpdateServerDuringSlowsync>=0) fUpdateServerDuringSlowsync = ruleP->fUpdateServerDuringSlowsync; if (ruleP->fAllowMessageRetries>=0) fAllowMessageRetries = ruleP->fAllowMessageRetries; if (ruleP->fStrictExecOrdering>=0) fStrictExecOrdering = ruleP->fStrictExecOrdering; if (ruleP->fTreatCopyAsAdd>=0) fTreatCopyAsAdd = ruleP->fTreatCopyAsAdd; if (ruleP->fCompleteFromClientOnly>=0) fCompleteFromClientOnly = ruleP->fCompleteFromClientOnly; if (ruleP->fRequestMaxTime>=0) fRequestMaxTime = ruleP->fRequestMaxTime; if (ruleP->fDefaultOutCharset!=chs_unknown) fDefaultOutCharset = ruleP->fDefaultOutCharset; if (ruleP->fDefaultInCharset!=chs_unknown) fDefaultInCharset = ruleP->fDefaultInCharset; // - possibly override decisions that are otherwise made by session // Note: this is not a single option because we had this before rule options were tristates. if (ruleP->fForceUTC>0) fRemoteCanHandleUTC=true; if (ruleP->fForceLocaltime>0) fRemoteCanHandleUTC=false; // - descriptive name for the device (for log) #ifndef MINIMAL_CODE if (!ruleP->fRemoteDescName.empty()) fRemoteDescName = ruleP->fRemoteDescName; #endif // - test for rejection if (ruleP->fRejectStatusCode!=DONT_REJECT) { // reject operation with this device sta = ruleP->fRejectStatusCode; PDEBUGPRINTFX(DBG_ERROR,("remote party rejected by '%s', status=%hd",ruleP->getName(),sta)); AbortSession(sta,true); return sta; } // - execute rule script #ifdef SCRIPT_SUPPORT if (!ruleP->fRuleScriptTemplate.empty()) { // copy from template string ruleScript = ruleP->fRuleScriptTemplate; // resolve variable references TScriptContext::linkIntoContext(ruleScript,fSessionScriptContextP,this); // execute now PDEBUGPRINTFX(DBG_HOT,("Executing rulescript for rule '%s'",ruleP->getName())); TScriptContext::execute( fSessionScriptContextP, ruleScript, NULL, // context's function table NULL // datastore pointer needed for context ); } #endif } // for all activated rules PDEBUGENDBLOCK("RemoteRules"); // something failed in applying remote rules? if (sta!=LOCERR_OK) return sta; #endif // NO_REMOTE_RULES // Final adjustments #ifndef NO_REMOTE_RULES if (fActiveRemoteRules.empty()) #endif { // no remote rule (none found or mechanism excluded by NO_REMOTE_RULES) if (!aDevInfP) { // no devinf -> blind sync attempt: apply best-guess workaround settings // Note that a blind sync attempt means that the remote party is at least partly non-compliant, as we always request a devInf! PDEBUGPRINTFX(DBG_ERROR,("No remote information available -> applying best-guess workaround behaviour options")); #ifndef MINIMAL_CODE // set device description fRemoteDescName = fRemoteName.empty() ? "[unknown remote]" : fRemoteName.c_str(); fRemoteDescName += " (no devInf)"; #endif // MINIMAL_CODE // switch on legacy behaviour (conservative preferred types) fLegacyMode = true; if (IS_CLIENT) { // Client case fRemoteCanHandleUTC = true; // Assume server can handle UTC (it is very improbable a server can't) } else { // Server case fRemoteCanHandleUTC = fSyncMLVersion==syncml_vers_1_0 ? true : false; // Assume client cannot handle UTC (it is likely a client can't, or at least can't properly, so localtime is safer) fLimitedRemoteFieldLengths = true; // assume limited client field length (almost all clients have limited length) } } } // show summary PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("Summary of all behaviour options (possibly modified by remote rule(s))")); #ifndef MINIMAL_CODE PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Remote Description : %s",fRemoteDescName.c_str())); #endif PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Legacy mode : %s",boolString(fLegacyMode))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Lenient mode : %s",boolString(fLenientMode))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Limited Field Lengths : %s",boolString(fLimitedRemoteFieldLengths))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Do not send empty props : %s",boolString(fDontSendEmptyProperties))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Quote 8bit content : %s",boolString(fDoQuote8BitContent))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Prevent Content Folding : %s",boolString(fDoNotFoldContent))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- No replace in slowsync : %s",boolString(fNoReplaceInSlowsync))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Treat remote TZ as local : %s",boolString(fTreatRemoteTimeAsLocal))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Treat remote TZ as UTC : %s",boolString(fTreatRemoteTimeAsUTC))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Use 23:59:59 end dates : %s",boolString(fVCal10EnddatesSameDay))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Ignore field maxSize : %s",boolString(fIgnoreDevInfMaxSize))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Ignore CTCap : %s",boolString(fIgnoreCTCap))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- send DS path in devInf : %s",boolString(fDSPathInDevInf))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- send DS CGI in devInf : %s",boolString(fDSCgiInDevInf))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Update Client in slowsync : %s",boolString(fUpdateClientDuringSlowsync))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Update Server in slowsync : %s",boolString(fUpdateServerDuringSlowsync))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Allow message retries : %s",boolString(fAllowMessageRetries))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Strict SyncML exec order : %s",boolString(fStrictExecOrdering))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Treat copy like add : %s",boolString(fTreatCopyAsAdd))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Complete From-Client-Only : %s",boolString(fCompleteFromClientOnly))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Remote can handle UTC : %s",boolString(fRemoteCanHandleUTC))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Max Request time [sec] : %ld",static_cast(fRequestMaxTime))); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Content output charset : %s",MIMECharSetNames[fDefaultOutCharset])); PDEBUGPRINTFX(DBG_HOT+DBG_REMOTEINFO,("- Content input charset : %s",MIMECharSetNames[fDefaultInCharset])); // done return LOCERR_OK; } // TSyncSession::checkRemoteSpecifics #ifndef NO_REMOTE_RULES // check if given rule (by name, or if aRuleName=NULL by rule pointer) is active bool TSyncSession::isActiveRule(cAppCharP aRuleName, TRemoteRuleConfig *aRuleP) { TRemoteRulesList::iterator pos; for(pos=fActiveRemoteRules.begin();pos!=fActiveRemoteRules.end();pos++) { if ( (aRuleName==NULL && (*pos)==aRuleP) || // match by pointer... (strucmp(aRuleName,(*pos)->getName())==0) // ...or name ) return true; } // no match return false; } // TSyncSession::isActiveRule #endif // NO_REMOTE_RULES // access to config TSessionConfig *TSyncSession::getSessionConfig(void) { TSessionConfig *scP; GET_CASTED_PTR(scP,TSessionConfig,getSyncAppBase()->getRootConfig()->fAgentConfigP,DEBUGTEXT("no TSessionConfig","sss1")); return scP; } // TSyncSession::getSessionConfig // process a Map command in context of session bool TSyncSession::processMapCommand( SmlMapPtr_t aMapCommandP, // the map command contents TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater ) { // if not overridden, we cannot process Map aStatusCommand.setStatusCode(403); ADDDEBUGITEM(aStatusCommand,"Map command not allowed in this context"); return false; // failed } // TSyncSession::processMapCommand // called to issue custom get and put commands // may issue custom get and put commands void TSyncSession::issueCustomGetPut(bool aGotDevInf, bool aSentDevInf) { #ifdef SCRIPT_SUPPORT // call script that might issue GETs and PUTs // - set up context TGetPutResultFuncContext ctx; ctx.isPut=false; ctx.canIssue=true; ctx.statuscode=0; ctx.itemURI.erase(); ctx.itemData.erase(); ctx.metaType.erase(); // - execute TScriptContext::execute( fSessionScriptContextP, getSessionConfig()->fCustomGetPutScript, &GetPutResultFuncTable, &ctx // caller context ); #endif } // TSyncSession::issueCustomGetPut // called to issue custom put commands at end of session // may issue custom put commands (gets don't make sense at end of a session) void TSyncSession::issueCustomEndPut(void) { #ifdef SCRIPT_SUPPORT // call script that might issue GETs and PUTs // - set up context TGetPutResultFuncContext ctx; ctx.isPut=false; ctx.canIssue=true; ctx.statuscode=0; ctx.itemURI.erase(); ctx.itemData.erase(); ctx.metaType.erase(); // - execute TScriptContext::execute( fSessionScriptContextP, getSessionConfig()->fCustomEndPutScript, &GetPutResultFuncTable, &ctx // caller context ); #endif } // TSyncSession::issueCustomEndPut // called to process unknown get item, may return a Results command. Must set status to non-404 if get could be served // (may be overridden by descendants, only called if no descendant can handle an item) TResultsCommand *TSyncSession::processGetItem(const char *aLocUri, TGetCommand *aGetCommandP, SmlItemPtr_t aGetItemP, TStatusCommand &aStatusCommand) { TResultsCommand *resultsCmdP = NULL; #ifdef SCRIPT_SUPPORT // first check if script handles it // - set up context TGetPutResultFuncContext ctx; ctx.isPut=false; ctx.canIssue=false; ctx.statuscode=aStatusCommand.getStatusCode(); ctx.itemURI=aLocUri; ctx.itemData.erase(); // - get meta type of item, if any AssignString(ctx.metaType,smlMetaTypeToCharP(smlPCDataToMetInfP(aGetItemP->meta))); if (ctx.metaType.empty()) { // none in item, get from command AssignString(ctx.metaType,smlMetaTypeToCharP(smlPCDataToMetInfP(aGetCommandP->getMeta()))); } // - execute bool hasResult = TScriptContext::executeTest( false, // do not assume script handles the GET fSessionScriptContextP, getSessionConfig()->fCustomGetHandlerScript, &GetPutResultFuncTable, &ctx // caller context ); // - update status, anyway aStatusCommand.setStatusCode(ctx.statuscode); // - create result, if script decides so if (hasResult) { // script returns true, so it has handled the GET command // - create a result command (%%% currently GET command itself does not carry src/targ URIs, only item does) resultsCmdP = new TResultsCommand(this,aGetCommandP,NULL,NULL); // - create data item SmlItemPtr_t resItemP = newItem(); // - source is get item's URI reflected (if not changed by script) resItemP->source=newLocation(ctx.itemURI.c_str()); // - data is just string resItemP->data = newPCDataString(ctx.itemData); // - add item to command resultsCmdP->addItem(resItemP); // - set result command meta if not empty string resultsCmdP->setMeta(newMetaType(ctx.metaType.c_str())); // get item handled, return return resultsCmdP; } #endif // look for ./devinf10 special case if (strucmp(aLocUri,SyncMLDevInfNames[getSyncMLVersion()])==0) { // status is ok aStatusCommand.setStatusCode(200); // prepare a devinf10 resultsCmdP = new TDevInfResultsCommand(this,aGetCommandP); } return resultsCmdP; } // TSyncSession::processGetItem // - put and results command processing // (may be overridden by descendants, only called if no descendant can handle an item) void TSyncSession::processPutResultItem(bool aIsPut, const char *aLocUri, TSmlCommand *aPutResultsCommandP, SmlItemPtr_t aPutResultsItemP, TStatusCommand &aStatusCommand) { localstatus sta = aStatusCommand.getStatusCode(); #ifdef SCRIPT_SUPPORT // first check if script handles it // - set up context TGetPutResultFuncContext ctx; ctx.isPut=aIsPut; ctx.canIssue=false; ctx.statuscode=sta; ctx.itemURI=aLocUri; // - get data of item, if any smlPCDataToStringObj(aPutResultsItemP->data,ctx.itemData); // - get meta type of item, if any AssignString(ctx.metaType,smlMetaTypeToCharP(smlPCDataToMetInfP(aPutResultsItemP->meta))); if (ctx.metaType.empty()) { // none in item, get from command AssignString(ctx.metaType,smlMetaTypeToCharP(smlPCDataToMetInfP(aPutResultsCommandP->getMeta()))); } // - execute bool hasProcessed = TScriptContext::executeTest( false, // do not assume script handles the PUT or RESULT fSessionScriptContextP, getSessionConfig()->fCustomPutResultHandlerScript, &GetPutResultFuncTable, &ctx // caller context ); // update status code sta=ctx.statuscode; if (sta!=LOCERR_OK) aStatusCommand.setStatusCode(syncmlError(sta)); // if processed, return now if (hasProcessed) return; #endif // check for ./devinfXX if (strucmp(aLocUri,SyncMLDevInfNames[getSyncMLVersion()])==0) { // remote is sending DevInf, receive it SmlDevInfDevInfPtr_t devinfP = smlPCDataToDevInfP(aPutResultsItemP->data); // save received devinf (if database supports it) saveRemoteDevInf(getRemoteURI(),devinfP); // analyze aStatusCommand.setStatusCode(200); // assume ok sta=analyzeRemoteDevInf(devinfP); if (sta!=LOCERR_OK) aStatusCommand.setStatusCode(syncmlError(sta)); } else { // unknown PDEBUGPRINTFX(DBG_ERROR,( "Unknown %s-command with URI=%s received, returning default status=%hd", aIsPut ? "PUT" : "RESULTS", aLocUri, sta )); } } // TSyncSession::processPutResultItem // process an alert item in context of session // Most handling takes place in derived classes, // this base class only implements basic stuff // - returns command to be issued after issuing status, NULL if none TSmlCommand *TSyncSession::processAlertItem( uInt16 aAlertCode, // alert code SmlItemPtr_t aItemP, // alert item to be processed (as one alert can have multiple items) SmlCredPtr_t aCredP, // alert cred element, if any TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors TLocalEngineDS *&aLocalDataStoreP // receives datastore pointer, if alert affects a datastore ) { // no alert response command by default TSmlCommand *alertresponsecmdP=NULL; TLocalEngineDS *datastoreP; string optionsCGI,identifyingTargetURI; // dispatch numeric alerts switch (aAlertCode) { // sync alerts case 200: case 201: case 202: case 203: case 204: case 205: // Sync resume alert case 225: { // Synchronisation initialisation alerts if (allowAlertAfterMap() && fIncomingState==psta_map) { // reset to state that allows a sync to start PDEBUGPRINTFX(DBG_HOT,("process alert: restart sync")); fIncomingState = psta_init; fOutgoingState = psta_init; fRestarting = true; } // - test if context is ok if (fIncomingState!=psta_init && fIncomingState!=psta_initsync) { // Sync alert only allowed in init package or combined init/sync PDEBUGPRINTFX(DBG_ERROR,( "Sync Alert not allowed with incoming package state='%s'", PackageStateNames[fIncomingState] )); aStatusCommand.setStatusCode(403); // forbidden ADDDEBUGITEM(aStatusCommand,"Sync Alert only allowed in init package"); return NULL; // no alert sent back } // find requested database by URI const char *target = smlSrcTargLocURIToCharP(aItemP->target); if (!target || !target[0]) { // same fallback for Sony Ericsson C510 as in // TSyncSession::initSync() target = smlSrcTargLocURIToCharP(aItemP->source); } datastoreP = findLocalDataStoreByURI( target, // target as sent from remote &optionsCGI, // options, if any &identifyingTargetURI // identifying part of URI (CGI removed) ); if (!datastoreP) { // no such local datastore aStatusCommand.setStatusCode(404); // not found } else { // save alerted datastore pointer (will be returned to caller, which is TAlertCommand) aLocalDataStoreP=datastoreP; // get anchors const char *nextRemoteAnchor = smlMetaNextAnchorToCharP(smlPCDataToMetInfP(aItemP->meta)); if (nextRemoteAnchor==NULL) nextRemoteAnchor=""; // some remotes may send NO anchor const char *lastRemoteAnchor = smlMetaLastAnchorToCharP(smlPCDataToMetInfP(aItemP->meta)); if (lastRemoteAnchor==NULL) lastRemoteAnchor=""; // some remotes may send NO anchor // get URIs const char *targetURI = smlSrcTargLocURIToCharP(aItemP->target); const char *sourceURI = smlSrcTargLocURIToCharP(aItemP->source); // get Filter SmlFilterPtr_t targetFilter = aItemP->target ? aItemP->target->filter : NULL; if (fRestarting) { // reset datastore first datastoreP->engFinishDataStoreSync(LOCERR_OK); } // alert datastore of requested sync // - let datastore process alert and generate additional alert if needed // NOTE: this might generate a PUT command if remote needs to see our // devInf (config changed since last sync) alertresponsecmdP=datastoreP->engProcessSyncAlert( NULL, // not as subdatastore aAlertCode, // the alert code lastRemoteAnchor, // last anchor of client nextRemoteAnchor, // next anchor of client targetURI, // target as sent from remote identifyingTargetURI.c_str(), // identifying part of URI (relative, options removed) optionsCGI.c_str(), // extracted options (e.g. filtering) CGI targetFilter, // DS 1.2 filter, if any (can be NULL if none) sourceURI, // source URI aStatusCommand // status that might be modified ); // echo next anchor sent with item back in status // %%% specs say that only next anchor must be echoed, SCTS echoes both SmlItemPtr_t itemP = newItem(); // empty item // NOTE: anchor is MetInf, but is echoed in DATA part of item, not META! itemP->data = newMetaAnchor(nextRemoteAnchor,NULL); // only next (like specs) aStatusCommand.addItem(itemP); // add it to status } break; } case 224 : // Suspend alert SuspendSession(514); break; case 100 : // DISPLAY PDEBUGPRINTFX(DBG_HOT,( "---------------- DISPLAY ALERT (100): %s", smlPCDataToCharP(aItemP->data) )); // show it on the console CONSOLEPRINTF(( "***** Message from Remote: %s", smlPCDataToCharP(aItemP->data) )); // callback to allow GUI clients to display the message if (!SESSION_PROGRESS_EVENT(this,pev_display100,NULL,uIntPtr(smlPCDataToCharP(aItemP->data)),0,0)) { // user answered no to our question "continue?" aStatusCommand.setStatusCode(514); // cancelled // Do NOT abort the session, so give the server a chance to do someting more sensible based on the 514 status. aStatusCommand.addItemString("User abort in response to Alert 100 message"); PDEBUGPRINTFX(DBG_ERROR,("User abort after seeing Alert 100 message: %s",smlPCDataToCharP(aItemP->data))); } break; case 223: // Chunking error: missing end of chunk aStatusCommand.setStatusCode(223); aStatusCommand.addItemString("Missing end of chunk"); PDEBUGPRINTFX(DBG_ERROR,( "Warning: Alert Code 223 -> Missing end of chunk for item localid='%s', remoteid='%s'", smlSrcTargLocURIToCharP(aItemP->target), smlSrcTargLocURIToCharP(aItemP->source) )); break; default : // unknown alert code aStatusCommand.setStatusCode(406); aStatusCommand.addItemString("Unimplemented Alert Code"); PDEBUGPRINTFX(DBG_ERROR,("Unimplemented Alert Code %hd -> Status 406",aAlertCode)); break; } // switch fAlertCode // return command generated (or NULL if none) return alertresponsecmdP; } // TSyncSession::processAlertItem #ifdef SYDEBUG #define XML_TRANSLATION_ENABLED #else #undef XML_TRANSLATION_ENABLED #endif #ifdef SYDEBUG void TSyncSession::XMLTranslationIncomingStart(void) { // start translation instances #ifdef XML_TRANSLATION_ENABLED if (fXMLtranslate && !getRootConfig()->fDebugConfig.fDebugInfoPath.empty()) { DEBUGPRINTFX(DBG_EXOTIC,("Initializing incoming XML translation instance")) if (!getSyncAppBase()->newSmlInstance( SML_XML, getRootConfig()->fLocalMaxMsgSize * 3, // XML should not be more than 3 times larger than WBXML fIncomingXMLInstance )) { // if instance cannot be created, turn off XML translation to avoid crashes fXMLtranslate=false; PDEBUGPRINTFX(DBG_ERROR,("XML translation disabled because of lacking memory")) } } else fXMLtranslate=false; #endif } // TSyncSession::XMLTranslationIncomingStart void TSyncSession::XMLTranslationOutgoingStart(void) { #ifdef XML_TRANSLATION_ENABLED // start translation instances if (fXMLtranslate && !getRootConfig()->fDebugConfig.fDebugInfoPath.empty()) { DEBUGPRINTFX(DBG_EXOTIC,("Initializing outgoing XML translation instance")) if (!getSyncAppBase()->newSmlInstance( SML_XML, getRootConfig()->fLocalMaxMsgSize * 3, // XML should not be more than 3 times larger than WBXML fOutgoingXMLInstance )) { // if instance cannot be created, turn off XML translation to avoid crashes fXMLtranslate=false; PDEBUGPRINTFX(DBG_ERROR,("XML translation disabled because of lacking memory")) } } else fXMLtranslate=false; #endif } // TSyncSession::XMLTranslationOutgoingStart /// @todo /// rewrite this to use a TDbgOut object to write stuff // finish and output XML translation of incoming traffic void TSyncSession::XMLTranslationIncomingEnd(void) { #ifdef XML_TRANSLATION_ENABLED if (fIncomingXMLInstance && fXMLtranslate) { // write XML translation of input and output to files DEBUGPRINTFX(DBG_EXOTIC,("XML translation enabled...")) MemPtr_t XMLtext; MemSize_t XMLsize; string fname; // - incoming // - get XML DEBUGPRINTFX(DBG_EXOTIC,("- Writing incoming XML translation")) XMLtext=NULL; XMLsize=0; if (smlLockReadBuffer(fIncomingXMLInstance,&XMLtext,&XMLsize)==SML_ERR_OK) { // save to file TDbgOut *dbgOutP = getSyncAppBase()->newDbgOutputter(false); if (dbgOutP) { // create base file name (trm = translated message) string dumpfilename; StringObjPrintf(dumpfilename, "%s_trm%03ld_%03ld_incoming", getDbgLogger()->getDebugPath(), // path + session log base name (long)getLastIncomingMsgID(), (long)++fDumpCount // to make sure it is unique even in case of retries ); // open file in raw mode if (dbgOutP->openDbg( dumpfilename.c_str(), ".xml", dbgflush_none, false, // append to existing if any true // raw mode )) { // write out the entire message dbgOutP->putRawData(XMLtext, XMLsize); // close the file dbgOutP->closeDbg(); // add a link into the session file to immediately get the file PDEBUGPRINTFX(DBG_HOT+DBG_PROTO,( "Incoming %sXML message msgID=%ld &html;&html;saved as XML translation&html;&html;", getEncoding()==SML_XML ? "" : "WB", (long)getLastIncomingMsgID(), getDbgLogger()->getDebugFilename(), // session log base name (long)getLastIncomingMsgID(), (long)fDumpCount )); } else { PDEBUGPRINTFX(DBG_ERROR,("Cannot write file")); } delete dbgOutP; } } } if (fIncomingXMLInstance) { // finally free instance getSyncAppBase()->freeSmlInstance(fIncomingXMLInstance); fIncomingXMLInstance=NULL; } #endif } // TSyncSession::XMLTranslationIncomingEnd // finish and output XML translation of outgoing traffic /// @todo /// rewrite this to use a TDbgOut object to write stuff void TSyncSession::XMLTranslationOutgoingEnd(void) { #ifdef XML_TRANSLATION_ENABLED if (fOutgoingXMLInstance && fXMLtranslate) { // write XML translation of input and output to files DEBUGPRINTFX(DBG_EXOTIC,("XML translation enabled...")) MemPtr_t XMLtext; MemSize_t XMLsize; string fname; // - outgoing // write only if session is debug-enabled // - get XML DEBUGPRINTFX(DBG_EXOTIC,("- Writing outgoing XML translation")) XMLtext=NULL; XMLsize=0; if (smlLockReadBuffer(fOutgoingXMLInstance,&XMLtext,&XMLsize)==SML_ERR_OK) { // save to file TDbgOut *dbgOutP = getSyncAppBase()->newDbgOutputter(false); if (dbgOutP) { // create base file name (trm = translated message) string dumpfilename; StringObjPrintf(dumpfilename, "%s_trm%03ld_%03ld_outgoing", getDbgLogger()->getDebugPath(), // path + session log base name (long)getOutgoingMsgID(), (long)++fDumpCount // to make sure it is unique even in case of retries ); // open file in raw mode if (dbgOutP->openDbg( dumpfilename.c_str(), ".xml", dbgflush_none, false, // append to existing if any true // raw mode )) { // write out the entire message dbgOutP->putRawData(XMLtext, XMLsize); // close the file dbgOutP->closeDbg(); // add a link into the session file to immediately get the file PDEBUGPRINTFX(DBG_HOT+DBG_PROTO,( "Outgoing %sXML message msgID=%ld &html;&html;saved as XML translation&html;&html;", getEncoding()==SML_XML ? "" : "WB", (long)getOutgoingMsgID(), getDbgLogger()->getDebugFilename(), // session log base name (long)getOutgoingMsgID(), (long)fDumpCount )); } else { PDEBUGPRINTFX(DBG_ERROR,("Cannot write file")); } delete dbgOutP; } } } if (fOutgoingXMLInstance) { // finally free instance getSyncAppBase()->freeSmlInstance(fOutgoingXMLInstance); fOutgoingXMLInstance=NULL; } #endif } // TSyncSession::XMLTranslationOutgoingEnd // dump message from specified buffer void TSyncSession::DumpSyncMLBuffer(MemPtr_t aBuffer, MemSize_t aBufSize, bool aOutgoing, Ret_t aDecoderError) { #ifdef MSGDUMP // log message currently in SML buffer if (fMsgDump && !getRootConfig()->fDebugConfig.fDebugInfoPath.empty()) { TDbgOut *dbgOutP = getSyncAppBase()->newDbgOutputter(false); if (dbgOutP) { // create base file name string dumpfilename; // regular message, StringObjPrintf(dumpfilename, "%s_msg%03ld_%03ld_%sing", getDbgLogger()->getDebugPath(), // path + session log base name (long)(aOutgoing ? getOutgoingMsgID() : getLastIncomingMsgID()+1), // just generated msgID / expected next incoming ID (long)++fDumpCount, // to make sure it is unique even in case of retries aOutgoing ? "outgo" : "incom" ); if (aDecoderError) { // append error code StringObjAppendPrintf(dumpfilename,"_ERR_0x%04X",aDecoderError); } // open file in raw mode if (dbgOutP->openDbg( dumpfilename.c_str(), getEncoding()==SML_XML ? ".xml" : ".wbxml", dbgflush_none, false, // append to existing if any true // raw mode )) { // write out the entire message dbgOutP->putRawData(aBuffer, aBufSize); // close the file dbgOutP->closeDbg(); // add a link into the session file to immediately get the file if it is XML if (getEncoding()==SML_XML) { PDEBUGPRINTFX(DBG_HOT+DBG_PROTO,( "%sing XML message msgID=%ld &html;&html;dumped to file&html;&html;", aOutgoing ? "Outgo" : "Incom", (long)getOutgoingMsgID(), getDbgLogger()->getDebugFilename(), // session log base name (long)(aOutgoing ? getOutgoingMsgID() : getLastIncomingMsgID()+1), // just generated msgID / expected next incoming ID (long)fDumpCount, aOutgoing ? "outgo" : "incom" )); } } else { PDEBUGPRINTFX(DBG_ERROR,("Cannot write file")); } delete dbgOutP; } } #endif // MSGDUMP } // TSyncSession::DumpSyncMLBuffer // Dump message in SML buffer to file void TSyncSession::DumpSyncMLMessage(bool aOutgoing) { // dump message if needed #ifdef MSGDUMP // log message currently in SML buffer if (fMsgDump && !getRootConfig()->fDebugConfig.fDebugInfoPath.empty()) { // peek into buffer MemPtr_t data; MemSize_t datasize; if (smlPeekMessageBuffer(getSmlWorkspaceID(), aOutgoing, &data, &datasize)==SML_ERR_OK) { DumpSyncMLBuffer(data,datasize,aOutgoing,SML_ERR_OK); } } #endif // MSGDUMP } // TSyncSession::DumpSyncMLMessage #endif // SYDEBUG // SyncML Toolkit callback handlers // ================================ // start of SyncML message Ret_t TSyncSession::StartMessage(SmlSyncHdrPtr_t aContentP) { #ifdef SYDEBUG fSessionLogger.DebugDefineMainThread(); #endif SessionUsed(); // session used fLastRequestStarted = getSystemNowAs(TCTX_UTC); // request started fMessageRetried = false; // we assume no message retry MP_SHOWCURRENT(DBG_PROFILE,"Start of incoming Message"); TP_START(fTPInfo,TP_general); // could be new thread #ifdef EXPIRES_AFTER_DATE if (IS_SERVER) { // set 1/4 of the date here fCopyOfScrambledNow=((getSyncAppBase()->fScrambledNow)<<2)+503; // scramble again a little } #endif // EXPIRES_AFTER_DATE // dump it if configured // Note: this must happen here before answer writing to the instance buffer starts, as otherwise // the already consumed part of the buffer might get overwritten (the SyncML message header in this case). #ifdef SYDEBUG DumpSyncMLMessage(false); // incoming #endif if (IS_SERVER) { // for server, SyncML_Outgoing is started here, as SyncML_Incoming ends before SyncML_Outgoing // but for client, document exchange starts with outgoing message PDEBUGBLOCKDESC("SyncML_Outgoing","preparing for response before starting to analyze new incoming message"); } PDEBUGBLOCKFMT(("SyncML_Incoming","Starting to analyze incoming message", "RequestNo=%ld|SySyncVers=%d.%d.%d.%d",(long)fSyncAppBaseP->requestCount(), SYSYNC_VERSION_MAJOR, SYSYNC_VERSION_MINOR, SYSYNC_SUBVERSION, SYSYNC_BUILDNUMBER )); PDEBUGPRINTFX(DBG_HOT,( "=================> Starting to analyze incoming message, SySync V%d.%d.%d.%d, RequestNo=%ld", SYSYNC_VERSION_MAJOR, SYSYNC_VERSION_MINOR, SYSYNC_SUBVERSION, SYSYNC_BUILDNUMBER, (long)fSyncAppBaseP->requestCount() )); #ifdef SYDEBUG // Start incoming translation before decoding header XMLTranslationIncomingStart(); if (fXMLtranslate && fIncomingXMLInstance) { // Note: we must find the SyncML version in advance, as fSyncMLVersion is not yet valid here sInt16 hdrVers; StrToEnum(SyncMLVerDTDNames,numSyncMLVersions,hdrVers,smlPCDataToCharP(aContentP->version)); smlStartMessageExt(fIncomingXMLInstance,aContentP,SmlVersionCodes[hdrVers]); } #endif // update encoding smlGetEncoding(fSmlWorkspaceID,&fEncoding); // create command TSyncHeader *syncheaderP; MP_NEW(syncheaderP,DBG_OBJINST,"TSyncHeader",TSyncHeader(this,aContentP)); // execute it (special case for header) return processHeader(syncheaderP); } // TSyncSession::StartMessage // special entry point to prematurely abort processing of a incoming message // and cause the necessary cleanup void TSyncSession::CancelMessageProcessing(void) { #ifdef SYDEBUG // Now dump XML translation of incoming message (as far as it was processed at all) XMLTranslationIncomingEnd(); #endif // Show premature end of input processing PDEBUGPRINTFX(DBG_HOT,( "=================> Aborted processing message #%ld, request=%ld", (long)fIncomingMsgID, (long)fSyncAppBaseP->requestCount() )); } // TSyncSession::CancelMessageProcessing Ret_t TSyncSession::EndMessage(Boolean_t final) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlEndMessage(fIncomingXMLInstance,final); // Now dump XML translation of incoming message XMLTranslationIncomingEnd(); #endif // Flush pending item change commands? // // Don't retry other commands here (like a pending Sync), because // the whole purpose of delaying Sync is to give a preliminary // answer to the peer before finishing the command. // // Delaying them although we are expected to finish (final set!) // would have two drawbacks: // - Requires another message roundtrip. // - More complex state transitions which is known to not work: // Synthesis<->Synthesis sync did not complete correctly when the // server forced the client to send another message, because client // and server did not agree on the end of the session. (see // "[os-libsynthesis] temporary local ID + FinalizeLocalID"). if (final && !onlySyncPending() && !fDelayedExecutionCommands.empty()) { // TODO: tell stores explicitly that we really need the results now // instead of relying on the indirect semantic of "second call must // succeed". tryDelayedExecutionCommands(); } // End of incoming message PDEBUGPRINTFX(DBG_HOT,( "=================> Finished processing incoming message #%ld (%sfinal), request=%ld", (long)fIncomingMsgID, final ? "" : "not ", (long)fSyncAppBaseP->requestCount() )); // start outgoing message if not already done so // Note: this should NOT happen, as EVERY message from the remote should contain a SyncHdr status which // should have started the message already if (!fOutgoingStarted) { PDEBUGPRINTFX(DBG_ERROR,("Warning: incoming message #%ld did not contain a SyncHdr status (protocol violation)",(long)fIncomingMsgID)); // try to continue by simply ignoring - might not always work out (e.g. when authorisation is not yet complete, this will fail) issueHeader(false); } // forget pending continue requests if (final) fNextMessageRequests=0; // no pending next message requests when a message is final // make sure peer gets devInf Put if needed (only if it didn't issue a GET) // Note: do it here because we have processed all commands (alerts) now but // server response alerts are still in the fEndOfMessageCommands queue. // This ensures that clients gets PUT before it gets ALERTs. if (!fRemoteGotDevinf && mustSendDevInf()) { // remote has not got devinf and should see it if (!getRootConfig()->fNeverPutDevinf) { // PUT devinf now PDEBUGPRINTFX(DBG_PROTO,("Remote must see our changed devInf -> creating PUT command")); TDevInfPutCommand *putcmdP = new TDevInfPutCommand(this); issueRootPtr(putcmdP); } else { PDEBUGPRINTFX(DBG_PROTO,("Remote should see devinf, but PUT is suppressed: ")); } } // hook for placing custom GET and PUT if (!fCustomGetPutSent) { fCustomGetPutSent=true; issueCustomGetPut(fRemoteDevInfKnown,fRemoteGotDevinf); } // now issue all commands that may only be issued AFTER sending statuses for incoming commands TSmlCommandPContainer::iterator pos; while (true) { // first in list pos=fEndOfMessageCommands.begin(); if (pos==fEndOfMessageCommands.end()) break; // done // take command out of the list TSmlCommand *cmdP=(*pos); fEndOfMessageCommands.erase(pos); PDEBUGPRINTFX(DBG_SESSION,("<--- Issuing command '%s' from EndOfMessage Queue",cmdP->getName())); // issue it (doesn't matter if cannot be sent with this message, // it will then be moved into the fNextMessageCommands queue) issuePtr(cmdP,fNextMessageCommands,fInterruptedCommandP); } // now continue with package if it was discontinued in last message // %%% if (fNextMessageRequests>0) { // We have received a 222 Alert, so continue package now // %%% always continue, even if we didn't see a 222 alert ContinuePackageRoot(); // %%% } // let client or server do what is needed if (fFakeFinalFlag) { PDEBUGPRINTFX(DBG_ERROR,("Warning: heavy workaround active - simulated to get resume without sync-from-client going")); } MessageEnded(final || fFakeFinalFlag); fFakeFinalFlag=false; #ifdef SYNCSTATUS_AT_SYNC_CLOSE // make sure sync status is disposed if (fSyncCloseStatusCommandP) delete fSyncCloseStatusCommandP; fSyncCloseStatusCommandP=NULL; #endif MP_SHOWCURRENT(DBG_PROFILE,"End of incoming message"); // ok if no exception thrown return SML_ERR_OK; } // TSyncSession::EndMessage Ret_t TSyncSession::StartSync(SmlSyncPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlStartSync(fIncomingXMLInstance,aContentP); #endif // create command object TSyncCommand *commandP = new TSyncCommand(this,fIncomingMsgID,aContentP); // process it return process(commandP); } // TSyncSession::StartSync Ret_t TSyncSession::EndSync(void) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlEndSync(fIncomingXMLInstance); #endif /* %%% old version: sync end is no command itself, makes queuing sequences for later processing impossible, so we made it be a separate command // process Sync End // %%% evtl. catch... PDEBUGPRINTFX(DBG_HOT,("End of command")); // Note: do not call if previous Sync start might not have been processed if (!fIgnoreIncomingCommands) processSyncEnd(); return SML_ERR_OK; */ // create command object TSyncEndCommand *commandP = new TSyncEndCommand(this,fIncomingMsgID); // process it return process(commandP); } // TSyncSession::EndSync #ifdef ATOMIC_RECEIVE Ret_t TSyncSession::StartAtomic(SmlAtomicPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlStartAtomic(fIncomingXMLInstance,aContentP); #endif // NOTE from Specs: Nested Atomic commands are not legal. A nested Atomic // command will generate an error 500 - command failed. // create command object // %%% create DUMMY command for now PDEBUGPRINTFX(DBG_HOT,("Start of Atomic bracket: return Status 406 unimplemented")); TUnimplementedCommand *commandP = new TUnimplementedCommand( this, fIncomingMsgID, aContentP->cmdID, 0, scmd_copy, aContentP, 406); // optional feature not supported // process it return process(commandP); } // TSyncSession::StartAtomic Ret_t TSyncSession::EndAtomic(void) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlEndAtomic(fIncomingXMLInstance); #endif // process Atomic end // %%% not implemented, just accept PDEBUGPRINTFX(DBG_HOT,("End of Atomic bracket")); return SML_ERR_OK; } // TSyncSession::EndAtomic #endif #ifdef SEQUENCE_RECEIVE Ret_t TSyncSession::StartSequence(SmlSequencePtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlStartSequence(fIncomingXMLInstance,aContentP); #endif // %%% later, implement a nestable command object and derive Sequence,Atomic and Sync // from it. Similar to nested command creation, maintain a chain of nested commands; // session will have a pointer to most recent nest and ALL commands will have a pointer // to owning command (or NULL if they are on root level). // Sequence is trivial as SySync executes command in sequence anyway // - simply keep track of nesting fSequenceNesting++; PDEBUGPRINTFX(DBG_HOT,("Start of Sequence bracket, nesting level is now %hd",fSequenceNesting)); // get cmdid sInt32 cmdid; StrToLong(smlPCDataToCharP(aContentP->cmdID),cmdid); // make status TStatusCommand *statusCmdP = new TStatusCommand( this, // associated session (for callbacks) cmdid, // referred-to command ID scmd_sequence, // referred-to command type (scmd_xxx) (aContentP->flags & SmlNoResp_f)!=0, // set if no-Resp 200 // status code ); // issue ok status // - return status issueRootPtr(statusCmdP); // - ok return SML_ERR_OK; } // TSyncSession::StartSequence Ret_t TSyncSession::EndSequence(void) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlEndSequence(fIncomingXMLInstance); #endif // - keep track of nesting if (fSequenceNesting<1) { // error in nesting PDEBUGPRINTFX(DBG_HOT,("End of Sequence bracket, MISSING PRECEEDING SEQUENCE START -> aborting session")); AbortSession(400,true); // bad nesting is severe, abort session } else { // nesting ok fSequenceNesting--; PDEBUGPRINTFX(DBG_HOT,("End of Sequence bracket, nesting level is now %hd",fSequenceNesting)); } return SML_ERR_OK; } // TSyncSession::EndSequence #endif Ret_t TSyncSession::AddCmd(SmlAddPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlAddCmd(fIncomingXMLInstance,aContentP); #endif // create SyncOp command object TSyncOpCommand *commandP = new TSyncOpCommand( this, fLocalSyncDatastoreP, fIncomingMsgID, sop_add, scmd_add, aContentP ); // process it return process(commandP); } // TSyncSession::AddCmd Ret_t TSyncSession::AlertCmd(SmlAlertPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlAlertCmd(fIncomingXMLInstance,aContentP); #endif // create command object TAlertCommand *commandP = new TAlertCommand(this,fIncomingMsgID,aContentP); // process it return process(commandP); } // TSyncSession::AlertCmd Ret_t TSyncSession::DeleteCmd(SmlDeletePtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlDeleteCmd(fIncomingXMLInstance,aContentP); #endif // determine type of delete TSyncOperation syncop; if (aContentP->flags & SmlArchive_f) syncop = sop_archive_delete; else if (aContentP->flags & SmlSftDel_f) syncop = sop_soft_delete; else syncop=sop_delete; // create SyncOp command object TSyncOpCommand *commandP = new TSyncOpCommand( this, fLocalSyncDatastoreP, // note that this one might be NULL in case previous sync command was delayed fIncomingMsgID, syncop, scmd_delete, aContentP ); // process it return process(commandP); } // TSyncSession::DeleteCmd // process GET commands Ret_t TSyncSession::GetCmd(SmlGetPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlGetCmd(fIncomingXMLInstance,aContentP); #endif // create command object TGetCommand *commandP = new TGetCommand(this,fIncomingMsgID,aContentP); // process it return process(commandP); } // TSyncSession::GetCmd Ret_t TSyncSession::PutCmd(SmlPutPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlPutCmd(fIncomingXMLInstance,aContentP); #endif // create command object TPutCommand *commandP = new TPutCommand(this,fIncomingMsgID,aContentP); // process it return process(commandP); } // TSyncSession::PutCmd #ifdef MAP_RECEIVE Ret_t TSyncSession::MapCmd(SmlMapPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlMapCmd(fIncomingXMLInstance,aContentP); #endif // create command object TMapCommand *commandP = new TMapCommand(this,fIncomingMsgID,aContentP); // process it return process(commandP); } // TSyncSession::MapCmd #endif #ifdef RESULT_RECEIVE Ret_t TSyncSession::ResultsCmd(SmlResultsPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlResultsCmd(fIncomingXMLInstance,aContentP); #endif // create command object TResultsCommand *commandP = new TResultsCommand(this,fIncomingMsgID,aContentP); // process it return process(commandP); } // TSyncSession::ResultsCmd #endif Ret_t TSyncSession::StatusCmd(SmlStatusPtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlStatusCmd(fIncomingXMLInstance,aContentP); #endif // create command object TStatusCommand *statuscommandP = new TStatusCommand(this,fIncomingMsgID,aContentP); // handle status (search for command that waits for this status) return handleStatus(statuscommandP); } // TSyncSession::StatusCmd Ret_t TSyncSession::ReplaceCmd(SmlReplacePtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlReplaceCmd(fIncomingXMLInstance,aContentP); #endif // create SyncOp command object TSyncOpCommand *commandP = new TSyncOpCommand( this, fLocalSyncDatastoreP, fIncomingMsgID, sop_replace, scmd_replace, aContentP ); // process it return process(commandP); } // TSyncSession::ReplaceCmd #ifdef COPY_RECEIVE Ret_t TSyncSession::CopyCmd(SmlReplacePtr_t aContentP) { #ifdef SYDEBUG #ifdef COPY_SEND // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlCopyCmd(fIncomingXMLInstance,aContentP); #else #error "We will have incomplete XML translation when only COPY_RECEIVE is defined" #endif #endif // create SyncOp command object TSyncOpCommand *commandP = new TSyncOpCommand( this, fLocalSyncDatastoreP, fIncomingMsgID, fTreatCopyAsAdd ? sop_add : sop_copy, scmd_copy, aContentP ); // process it return process(commandP); } // TSyncSession::CopyCmd #endif Ret_t TSyncSession::MoveCmd(SmlReplacePtr_t aContentP) { #ifdef SYDEBUG // generate XML translation if (fXMLtranslate && fIncomingXMLInstance) smlMoveCmd(fIncomingXMLInstance,aContentP); #endif // create SyncOp command object TSyncOpCommand *commandP = new TSyncOpCommand( this, fLocalSyncDatastoreP, fIncomingMsgID, sop_move, scmd_move, aContentP ); // process it return process(commandP); } // TSyncSession::MoveCmd // - error handling Ret_t TSyncSession::HandleError(void) { // %%% tbd DEBUGPRINTFX(DBG_ERROR,("HandleError reached")); return SML_ERR_OK; // %%% } // TSyncSession::HandleError Ret_t TSyncSession::DummyHandler(const char* msg) { //DEBUGPRINTFX(DBG_ERROR,("DummyHandler: msg=%s",msg)); return SML_ERR_OK; } // TSyncSession::DummyHandler #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= // open subkey by name (not by path!) // - this is the actual implementation TSyError TSessionKey::OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ) { #ifdef SCRIPT_SUPPORT if (strucmp(aName,"sessionvars",aNameSize)==0) { // note: if no session scripts are used, context does not exist and is NULL. // TScriptVarKey does not crash with a NULL, so we can give ok here (but no session vars // will be accessible). aSettingsKeyP = new TScriptVarKey(fEngineInterfaceP,fSessionP->getSessionScriptContext()); } else #endif return inherited::OpenSubKeyByName(aSettingsKeyP,aName,aNameSize,aMode); // opened a key return LOCERR_OK; } // TSessionKey::OpenSubKeyByName #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync // factory methods of Session Config // ================================= // only one of XML2GO or SDK/Plugin can be on top of customagent #ifdef XML2GO_SUPPORT #include "xml2goapids.h" #elif defined(SDK_SUPPORT) #include "pluginapids.h" #endif // ODBC can be in-between if selected #ifdef SQL_SUPPORT #include "odbcapids.h" #endif namespace sysync { #ifndef HARDCODED_CONFIG // create new datastore config by name // returns NULL if none found TLocalDSConfig *TSessionConfig::newDatastoreConfig(const char *aName, const char *aType, TConfigElement *aParentP) { #ifdef XML2GO_SUPPORT if (aType && strucmp(aType,"xml2go")==0) { // xml2go enhanced datastore return new TXml2goDSConfig(aName,aParentP); } else #elif defined(SDK_SUPPORT) if (aType && strucmp(aType,"plugin")==0) { // APIDB enhanced datastore (on top of ODBC if SQL_SUPPORT is on) return new TPluginDSConfig(aName,aParentP); } else #endif #ifdef SQL_SUPPORT if (aType==0 || strucmp(aType,"odbc")==0 || strucmp(aType,"sql")==0) { // ODBC enabled datastore return new TOdbcDSConfig(aName,aParentP); } else #endif return NULL; // unknown datastore } // TSessionConfig::newDatastoreConfig #endif // HARDCODED_CONFIG bool TSyncSession::receivedSyncModeExtensions() { TRemoteDataStorePContainer::iterator pos; for (pos=fRemoteDataStores.begin(); pos!=fRemoteDataStores.end(); ++pos) { set modes; (*pos)->getSyncModes(modes); set::const_iterator it; for (it=modes.begin(); it!=modes.end(); ++it) { const char *nptr = it->c_str(); char *endptr; if (!*nptr) { // ignore empty mode continue; } long mode = strtol(nptr, &endptr, 10); // ignore trailing spaces while (isspace(*endptr)) { endptr++; } if (*endptr) { // non-standard character => found extensions return true; } if (mode > 32) { // Non-standed integer code! // Choosing 32 is somewhat random, not all of those // are really defined in the standard. return true; } } } return false; } } // namespace sysync #endif // not SYNCSESSION_PART1_EXCLUDE // eof syncevolution-1.5/src/synthesis/src/sysync/syncsession.h0000755000373300037200000014616012424517753025411 0ustar00nightlyallusers00000000000000/* * TSyncSession * Represents an entire Synchronisation Session, possibly consisting * of multiple SyncML-Toolkit "Sessions" (Message composition/de- * composition) as well as multiple database synchronisations. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * */ #ifndef SYNC_SESSION_H #define SYNC_SESSION_H // general includes (SyncML tookit, windows, Clib) #include "sysync.h" // specific includes #include "syncappbase.h" #include "localengineds.h" #include "remotedatastore.h" #include "profiling.h" #include "scriptcontext.h" namespace sysync { extern const char * const SyncMLVerProtoNames[numSyncMLVersions]; extern const SmlVersion_t SmlVersionCodes[numSyncMLVersions]; extern const char * const SyncMLVerDTDNames[numSyncMLVersions]; extern const char * const SyncMLDevInfNames[numSyncMLVersions]; #ifndef HARDCODED_CONFIG extern const char * const SyncMLVersionNames[numSyncMLVersions]; #endif extern const char * const authTypeNames[numAuthTypes]; extern const char * const SyncModeNames[numSyncModes]; #ifdef SYDEBUG extern const char * const PackageStateNames[numPackageStates]; extern const char * const SyncOpNames[numSyncOperations]; #endif extern const char * const SyncModeDescriptions[numSyncModes]; // secret type for SessionLogin typedef enum { // Note: changes here will change AUTHTYPE() script func API in ODBC-Agent! sectyp_anonymous, // anonymous sectyp_clearpass, // clear text password sectyp_md5_V10, // SyncML V1.0 MD5 sectyp_md5_V11 // SyncML V1.1 MD5 } TAuthSecretTypes; // minimal free message size required to end message // %%% rough approx, should always be enough #define SIZEFORMESSAGEEND 200 // Container types typedef std::list TRemoteDataStorePContainer; // contains data stores // forward declaration class TSyncAppBase; class TSmlCommand; class TStatusCommand; class TSyncHeader; class TLocalEngineDS; class TRemoteDataStore; class TRootConfig; #ifdef SCRIPT_SUPPORT // publish as derivates might need it extern const TFuncTable ErrorFuncTable; typedef struct { TSyError statuscode; TSyError newstatuscode; bool resend; TLocalEngineDS *datastoreP; TSyncOperation syncop; } TErrorFuncContext; typedef struct { bool isPut; bool canIssue; TSyError statuscode; string itemURI; string itemData; string metaType; } TGetPutResultFuncContext; #endif // SCRIPT_SUPPORT #ifndef NO_REMOTE_RULES class TRemoteRuleConfig; // forward typedef std::list TRemoteRulesList; // remote party special rule class TRemoteRuleConfig: public TConfigElement { typedef TConfigElement inherited; public: TRemoteRuleConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TRemoteRuleConfig(); // properties // - identification of remote string fManufacturer; string fModel; string fOem; string fFirmwareVers; string fSoftwareVers; string fHardwareVers; string fDevId; string fDevTyp; // - options specific for that remote party (0=false, 1=true, -1=unspecified) sInt8 fLegacyMode; // set if remote is known legacy, so don't use new types sInt8 fLenientMode; // set if remote's SyncML should be handled leniently, i.e. not too strict checking where not absolutely needed sInt8 fLimitedFieldLengths; // set if remote has limited field lengths sInt8 fDontSendEmptyProperties; // set if remote does not want empty properties sInt8 fDoQuote8BitContent; // set if 8-bit chars should generally be encoded with QP in MIME-DIR sInt8 fDoNotFoldContent; // set if content should not be folded in MIME-DIR sInt8 fNoReplaceInSlowsync; // do not use Replace (as server) in slow sync (this is to COMPLETELY avoid replaces being sent during slowsync, for clients that crash on that such as old 9210) sInt8 fTreatRemoteTimeAsLocal; // treat remote time as localtime even if it carries different time zone information ("Z" suffix or zone spec) sInt8 fTreatRemoteTimeAsUTC; // treat remote time as UTC even if it carries different time zone information (no suffix or zone spec) sInt8 fVCal10EnddatesSameDay; // send end date-only values (like DTEND) as last time unit of previous day (i.e. 23:59:59, inclusive) instead of midnight of next day (exclusive, like in iCalendar 2.0) sInt8 fIgnoreDevInfMaxSize; // ignore specification in CTCap (when device has bad specs like in E90 for example) sInt8 fIgnoreCTCap; // ignore entire ctcap sInt8 fDSPathInDevInf; // use actual DS path as used in Alert for creating datastore devInf (needed for newer Nokia clients) sInt8 fDSCgiInDevInf; // also show CGI as used in Alert for creating datastore devInf (needed for newer Nokia clients) sInt8 fUpdateClientDuringSlowsync; // do not update client records (due to merge) in slowsync (However, updates can still occur in first-time sync and if server wins conflict) sInt8 fUpdateServerDuringSlowsync; // do not update server records during NON-FIRST-TIME slowsync (but do it for first sync!) sInt8 fAllowMessageRetries; // allow that client sends same message ID again (retry attempt) sInt8 fStrictExecOrdering; // requires strict SyncML-standard ordering of status responses sInt8 fTreatCopyAsAdd; // treat COPY like ADD (needed for Calmeno/Weblicon clients) sInt8 fCompleteFromClientOnly; // perform complete from-client-only session (non conformant, Synthesis before 2.9.8.2 style) sInt32 fRequestMaxTime; // max time [seconds] allowed for processing a single request, 0=unlimited, -1=not specified TCharSets fDefaultOutCharset; // default charset for generation TCharSets fDefaultInCharset; // default charset for input interpretation TSyError fRejectStatusCode; // if >=0, attempt to connect will always be rejected with given status code sInt8 fForceUTC; // force sending time in UTC (overrides SyncML 1.1 devInf flag) sInt8 fForceLocaltime; // force sending time in localtime (overrides SyncML 1.1 devInf flag) #ifndef MINIMAL_CODE string fRemoteDescName; // descriptive name of remote #endif #ifdef SCRIPT_SUPPORT string fRuleScriptTemplate; // template for rule script #endif // DevInf in XML format which is to be used instead of the one sent by peer. // If set, it is evaluated after identifying the peer based on the DevInf // that it has sent and before applying other remote rule workarounds. // XML DevInf directly from XML config. string fOverrideDevInfXML; SmlDevInfDevInfPtr_t fOverrideDevInfP; VoidPtr_t fOverrideDevInfBufferP; // list of subrules to activate TRemoteRulesList fSubRulesList; // flag if this is a final rule (if matches, no more rules will be checked) bool fFinalRule; // flag if this is a subrule (cannot match by itself) bool fSubRule; protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); }; // TRemoteRuleConfig #endif // NO_REMOTE_RULES // session config class TSessionConfig: public TConfigElement { typedef TConfigElement inherited; public: TSessionConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TSessionConfig(); // Properties // - session timeout (in seconds) sInt32 fSessionTimeout; // - Maximally supported SyncML version TSyncMLVersions fMaxSyncMLVersionSupported; // - Minimally supported SyncML version TSyncMLVersions fMinSyncMLVersionSupported; // - support of server alerted sync codes bool fAcceptServerAlerted; #ifndef NO_REMOTE_RULES // - list of remote rules TRemoteRulesList fRemoteRulesList; #endif // - simple auth string fSimpleAuthUser; string fSimpleAuthPassword; // - local datastores TLocalDSList fDatastores; #ifndef MINIMAL_CODE // - logfile string fLogFileName; string fLogFileFormat; string fLogFileLabels; bool fLogEnabled; uInt32 fDebugChunkMaxSize; #endif bool fRelyOnEarlyMaps; // if set, we rely on early maps sent by clients for adds from the previous session // defaults for remote-rule configurable behaviour bool fUpdateClientDuringSlowsync; // do not update client records (due to merge) in slowsync (However, updates can still occur in first-time sync and if server wins conflict) bool fUpdateServerDuringSlowsync; // do not update server records during NON-FIRST-TIME slowsync (but do it for first sync!) bool fAllowMessageRetries; // allow that client sends same message ID again (retry attempt) uInt32 fRequestMaxTime; // max time [seconds] allowed for processing a single request, 0=unlimited sInt32 fRequestMinTime; // min time [seconds] spent until returning answer (for debug purposes, 0=no minimum time) bool fCompleteFromClientOnly; // perform complete from-client-only session (non conformant, Synthesis before 2.9.8.2 style) // default value for flag to send property lists in CTCap bool fShowCTCapProps; // default value for flag to send type/size in CTCap for SyncML 1.0 (disable as old clients like S55 crash on this) bool fShowTypeSzInCTCap10; // flag to enable SyncEvolution-specific sync mode extensions in outgoing devInf. bool fSyncModeExtensions; // default value for sending end date-only values (like DTEND) as last time unit of previous day (i.e. 23:59:59, inclusive) // instead of midnight of next day (exclusive, like in iCalendar 2.0) bool fVCal10EnddatesSameDay; // instead of folding long lines (as required by the standard) use one line per property bool fDoNotFoldContent; // - set if we should show default parameter in mimo_old types as list of s for each value // Note that this is a tristate: 0=no, 1=yes, -1=auto (=yes for =SyncML 1.2, // thus making it work for Nokia 7610 (1.1) as well as E-Series like E90) sInt8 fEnumDefaultPropParams; // decides whether multi-threading for the datastores will be used bool fMultiThread; // defines if the engine waits with continuing interrupted commands until previous part received status bool fWaitForStatusOfInterrupted; // accept delete commands for already deleted items with 200 (rather that 404 or 211) bool fDeletingGoneOK; // abort if all items sent to remote fail bool fAbortOnAllItemsFailed; // - Session user time context (what time zone the current session's user is in, for clients w/o TZ/UTC support) timecontext_t fUserTimeContext; #ifdef SCRIPT_SUPPORT // session init script string fSessionInitScript; // Error status handling scripts string fSentItemStatusScript; string fReceivedItemStatusScript; // session init script string fSessionFinishScript; // custom GET command handler script string fCustomGetHandlerScript; // custom GET and PUT command generator scripts string fCustomGetPutScript; string fCustomEndPutScript; // custom PUT and RESULT handler script string fCustomPutResultHandlerScript; #endif // public methods TLocalDSConfig *getLocalDS(const char *aName, uInt32 aDBTypeID=0); lineartime_t getSessionTimeout(void) { return fSessionTimeout * secondToLinearTimeFactor; }; // - MUST be called after creating config to load (or pre-load) variable parts of config // such as binfile profiles. If aDoLoose==false, situations, where existing config // is detected but cannot be re-used will return an error. With aDoLoose==true, config // files etc. are created even if it means a loss of data. virtual localstatus loadVarConfig(bool aDoLoose=false) { return LOCERR_OK; } protected: // check config elements #ifndef HARDCODED_CONFIG virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual TLocalDSConfig *newDatastoreConfig(const char *aName, const char *aType,TConfigElement *aParentP); #endif virtual void clear(); virtual void localResolve(bool aLastPass); }; // TSessionConfig // forward class TLocalEngineDS; // Container types typedef std::list TLocalDataStorePContainer; // contains local data stores // Sync session class TSyncSession { friend class TSmlCommand; friend class TSyncHeader; friend class TAlertCommand; friend class TSyncCommand; friend class TStatusCommand; friend class TSyncOpCommand; friend class TRemoteDataStore; friend class TLocalEngineDS; #ifdef SUPERDATASTORES friend class TSuperDataStore; #endif public: // constructors/destructors TSyncSession( TSyncAppBase *aSyncAppBaseP, // the owning application base (dispatcher/client base) const char *aSessionID // a session ID ); virtual ~TSyncSession(); /// @brief terminate a session. /// @Note: Termination is final - session cannot be restarted by RestartSession() after /// calling this routine virtual void TerminateSession(void); // Announce destruction of descendant to all datastores which might have direct links to these descendants and must cancel those void announceDestruction(void); ///< must be called by derived class' destructors to allow datastores to detach from agent BEFORE descendant destructor has run // Reset session virtual void ResetSession(void); ///< resets session as if created totally new. Descendants must rollback any pending database transactions etc. void InternalResetSessionEx(bool terminationCall); // static implementation for calling through virtual destructor and virtual ResetSession(); #ifdef DBAPI_TUNNEL_SUPPORT // Initialize a datastore tunnel session virtual localstatus InitializeTunnelSession(cAppCharP aDatastoreName) { return LOCERR_NOTIMP; }; // is usually implemented in customimplagent, as it depends on DBApi architecture virtual TLocalEngineDS *getTunnelDS() { return NULL; }; // is usually implemented in customimplagent #endif // DBAPI_TUNNEL_SUPPORT #ifdef PROGRESS_EVENTS // Create Session level progress event bool NotifySessionProgressEvent( TProgressEventType aEventType, TLocalDSConfig *aDatastoreID, sInt32 aExtra1, sInt32 aExtra2, sInt32 aExtra3 ); // Handle (or dispatch) Session level progress event virtual bool HandleSessionProgressEvent(TEngineProgressInfo aProgressInfo) { return true; }; // no handling by default #endif // PROGRESS_EVENTS // called when incoming SyncHdr fails to execute virtual bool syncHdrFailure(bool aTryAgain) = 0; // Abort session void AbortSession(TSyError aStatusCode, bool aLocalProblem, TSyError aReason=0); // resets session and sets aborted flag to prevent further processing of message void MarkSuspendAlertSent(bool aSent); // Suspend session void SuspendSession(TSyError aReason); // Session status bool isAborted(void) { return fAborted; }; // test abort status bool isSuspending(void) { return fSuspended; }; // test if flagged for suspend bool isSuspendAlertSent (void) { return fSuspendAlertSent; }; // test if suspend alert was already sent bool isAllSuccess(void); // test if session was completely successful void DatastoreFailed(TSyError aStatusCode, bool aLocalProblem=false); // let session know that datastore has failed void DatastoreHadErrors(void) { fErrorItemDatastores++; }; // let session know that sync was ok, but some items had errors bool outgoingMessageFull(void) { return fOutgoingMessageFull; }; // test if outgoing full bool isInterrupedCmdPending(void) { return fInterruptedCommandP!=NULL; }; bool getIncomingState(void) { return fIncomingState; }; // stop processing commands in this message void AbortCommandProcessing(TSyError aStatusCode); // all further commands in message will be answered with given status // returns remaining time for request processing [seconds] virtual sInt32 RemainingRequestTime(void) { return 0x7FFFFFFF; }; // quasi infinite // forget commands waiting to be sent when header is generated void forgetHeaderWaitCommands(void); // SyncML toolkit workspace access void setSmlWorkspaceID(InstanceID_t aSmlWorkspaceID); InstanceID_t getSmlWorkspaceID(void) { return fSmlWorkspaceID; }; const char *getEncodingName(void); // encoding suffix in MIME type SmlEncoding_t getEncoding(void) { return fEncoding; }; // current encoding void setEncoding(SmlEncoding_t aEncoding); // set encoding for session void addEncoding(string &aString); // add current encoding spec to given (type-)string sInt32 getSmlWorkspaceFreeBytes(void) { return ((sInt32) smlGetFreeBuffer(fSmlWorkspaceID)); }; #ifdef ENGINEINTERFACE_SUPPORT /// @brief Get new session key to access details of this session virtual appPointer newSessionKey(TEngineInterface *aEngineInterfaceP) = 0; #endif // ENGINEINTERFACE_SUPPORT // session handling // - get session owner (dispatcher/clientbase) TSyncAppBase *getSyncAppBase(void) { return fSyncAppBaseP; } // - get time when session was last used lineartime_t getSessionLastUsed(void) { return fSessionLastUsed; }; // - get time when session was started and ended lineartime_t getSessionStarted(void) { return fSessionStarted; }; // - get time when last request started processing lineartime_t getLastRequestStarted(void) { return fLastRequestStarted; }; // - update last used time void SessionUsed(void) { fSessionLastUsed=getSystemNowAs(TCTX_UTC); }; // - session custom time zones object access GZones *getSessionZones(void) { return &fSessionZones; }; // - convenience version for getting time lineartime_t getSystemNowAs(timecontext_t aContext) { return sysync::getSystemNowAs(aContext,getSessionZones()); }; // debug and log printing (should NOT be virtual, so that they can be used in destructors) void DebugShowCfgInfo(void); // show some information about the config //%%%void LogPrintf(const char *text, ...); //%%%void LogPuts(const char *text); // properties TSyncMLVersions getSyncMLVersion(void) { return fSyncMLVersion; }; const char *getLocalURI(void) { return fLocalURI.c_str(); }; const char *getInitialLocalURI(void) { return fInitialLocalURI.c_str(); }; const char *getRemoteURI(void) { return fRemoteURI.c_str(); }; const char *getSynchdrSessionID(void) { return fSynchdrSessionID.c_str(); }; const char *getLocalSessionID(void) { return fLocalSessionID.c_str(); }; localstatus getAbortReasonStatus(void) { return fLocalAbortReason ? localError(fAbortReasonStatus) : syncmlError(fAbortReasonStatus); }; #ifndef MINIMAL_CODE const char *getRemoteInfoString(void) { return fRemoteInfoString.c_str(); }; const char *getRemoteDescName(void) { return fRemoteDescName.c_str(); }; const char *getSyncUserName(void) { return fSyncUserName.c_str(); }; #endif // MINIMAL_CODE sInt32 getLastIncomingMsgID(void) { return fIncomingMsgID; }; void setSessionBusy(bool aBusy) { fSessionIsBusy=aBusy; }; // make session behave busy generally bool getReadOnly(void) { return fReadOnly; }; // read-only option void setReadOnly(bool aReadOnly) { fReadOnly=aReadOnly; }; // read-only option // - check if we can handle UTC time (devices without time zone might override this) virtual bool canHandleUTC(void) { return true; }; // assume yes // helpers // - get session relative URI const char *SessionRelativeURI(const char *aURI) { return relativeURI(aURI,getLocalURI()); }; // - add local datastore from config TLocalEngineDS *addLocalDataStore(TLocalDSConfig *aLocalDSConfigP); // - add local type void addLocalItemType(TSyncItemType *aItemTypeP) { fLocalItemTypes.push_back(aItemTypeP); }; // - find local datatype by config pointer (used to avoid duplicating types // in session if used by more than a single datastore) TSyncItemType *findLocalType(TDataTypeConfig *aDataTypeConfigP); // - find implemented remote datatype by config pointer (and related datastore, if any) TSyncItemType *findRemoteType(TDataTypeConfig *aDataTypeConfigP, TSyncDataStore *aRelatedRemoteDS); // internal processing events implemented in derived classes // - message start and end virtual bool MessageStarted(SmlSyncHdrPtr_t aContentP, TStatusCommand &aStatusCommand, bool aBad=false)=0; virtual void MessageEnded(bool aIncomingFinal)=0; // - get command item processing, may return a Results command. Must set status to non-404 if get could be served virtual TResultsCommand *processGetItem(const char *aLocUri, TGetCommand *aGetCommandP, SmlItemPtr_t aGetItemP, TStatusCommand &aStatusCommand); // - put and results command processing virtual void processPutResultItem(bool aIsPut, const char *aLocUri, TSmlCommand *aPutResultsCommandP, SmlItemPtr_t aPutResultsItemP, TStatusCommand &aStatusCommand); // - alert processing virtual TSmlCommand *processAlertItem( uInt16 aAlertCode, // alert code SmlItemPtr_t aItemP, // alert item to be processed (as one alert can have multiple items) SmlCredPtr_t aCredP, // alert cred element, if any TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors TLocalEngineDS *&aLocalDataStoreP // receives datastore pointer, if alert affects a datastore ); // - handle status received for SyncHdr, returns false if not handled virtual bool handleHeaderStatus(TStatusCommand * /* aStatusCmdP */) { return false; } // no special handling by default // - map operation virtual bool processMapCommand( SmlMapPtr_t aMapCommandP, // the map command contents TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater ); // Sync processing (command group) // - start sync group virtual bool processSyncStart( SmlSyncPtr_t aSyncP, // the Sync element TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater // will be set if command must be queued for later (re-)execution ) = 0; // - end sync group virtual bool processSyncEnd(bool &aQueueForLater); // end of sync group // - process generic sync command item within Sync group // - returns true (and unmodified or non-200-successful status) if // operation could be processed regularily // - returns false (but probably still successful status) if // operation was processed with internal irregularities, such as // trying to delete non-existant item in datastore with // incomplete Rollbacks (which returns status 200 in this case!). bool processSyncOpItem( TSyncOperation aSyncOp, // the operation SmlItemPtr_t aItemP, // the item to be processed SmlMetInfMetInfPtr_t aMetaP, // command-wide meta, if any TLocalEngineDS *aLocalSyncDatastore, // the local datastore for this syncop item TStatusCommand &aStatusCommand, // pre-set 200 status, can be modified in case of errors bool &aQueueForLater // must be set if item cannot be processed now, but must be processed later ); // message handling // - get current size of message sInt32 getOutgoingMessageSize(void) { return fOutgoingMsgSize; }; // returns currently assembled message size // - get byte statistics (only implemented in server so far) virtual uInt32 getIncomingBytes(void) { return 0; }; virtual uInt32 getOutgoingBytes(void) { return 0; }; // - get how many bytes may not be used in the outgoing message buffer // because of maxMsgSize restrictions sInt32 getNotUsableBufferBytes(void); // - get max size outgoing message may have (either defined by remote's maxmsgsize or local buffer space) sInt32 getMaxOutgoingSize(void); // - returns true if given number of bytes are transferable // (not exceeding MaxMsgSize (in SyncML 1.0) or MaxObjSize (SyncML 1.1 and later) bool dataSizeTransferable(uInt32 aDataBytes); // - update outgoing message size void incOutgoingMessageSize(sInt32 aIncrement) { fOutgoingMsgSize+=aIncrement; }; // - get message-global noResp status bool getMsgNoResp(void) { return fMsgNoResp; } // - get next outgoing command ID sInt32 getNextOutgoingCmdID(void) { return (++fOutgoingCmdID); } // - get next outgoing command ID without actually consuming it sInt32 peekNextOutgoingCmdID(void) { return (fOutgoingCmdID+1); } // - get current outgoing message ID sInt32 getOutgoingMsgID(void) { return fOutgoingMsgID; } // command handling // - issue a command (and put it to status queue if it expects a result) bool issue(TSmlCommand * &aSyncCommandP, TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, bool aNoResp=false, bool aIsOKSyncHdrStatus=false ); bool issuePtr(TSmlCommand *aSyncCommandP, TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP, bool aNoResp=false, bool aIsOKSyncHdrStatus=false); // - issue a command in SyncBody context (uses session's interruptedCommand/NextMessageCommands) bool issueRoot(TSmlCommand * &aSyncCommandP, bool aNoResp=false, bool aIsOKSyncHdrStatus=false ); bool issueRootPtr(TSmlCommand *aSyncCommandP, bool aNoResp=false, bool aIsOKSyncHdrStatus=false ); // queue a SyncBody context command for issuing after incoming message // has been processed (and answers generated) void queueForIssueRoot( TSmlCommand * &aSyncCommandP // the command ); // issue a command, but queue it if outgoing package has not begun yet void issueNotBeforePackage( TPackageStates aPackageState, TSmlCommand *aSyncCommandP // the command ); // - session continuation and status void nextMessageRequest(void); bool sessionMustContinue(void); virtual void essentialStatusReceived(void) { /* NOP here */ }; void delayExecUntilNextRequest(TSmlCommand *aCommand); bool onlyItemChangesPending(); bool onlySyncPending(); bool tryDelayedExecutionCommands(); // returns syncEndAfterSyncPackageEnd bool executeDelayedCmd(TSmlCommand *aCmdP); // wrapper around TSmlCommand::execute() which issues queued Status commands if any are pending bool delayedSyncEndsPending(void) { return fDelayedExecSyncEnds>0; }; // - continue interrupted or prevented issue in next package void ContinuePackageRoot(void); void ContinuePackage( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand * &aInterruptedCommandP ); // - mark all pending items for a datastore for resume // (those items that are in a session queue for being issued or getting status) void markPendingForResume(TLocalEngineDS *aForDatastoreP); void markPendingForResume( TSmlCommandPContainer &aNextMessageCommands, TSmlCommand *aInterruptedCommandP, TLocalEngineDS *aForDatastoreP ); // access to session info from commands bool mustSendDevInf(void) { return fRemoteMustSeeDevinf; }; // - access DevInf (session owned) SmlItemPtr_t getLocalDevInfItem(bool aAlertedOnly, bool aWithoutCTCapProps); // - analyze devinf of remote party (can be derived to add client or server specific analysis) virtual localstatus analyzeRemoteDevInf( SmlDevInfDevInfPtr_t aDevInfP ); // - get possibly cached devinf for specified device, passes ownership of // created devinf structure to caller // returns false if no devinf could be loaded virtual bool loadRemoteDevInf(const char * /* aDeviceID */, SmlDevInfDevInfPtr_t & /* aDevInfP */) { return false; }; // - save devinf to cache for specified device // return false if devinf cannot be cached virtual bool saveRemoteDevInf(const char * /* aDeviceID */, SmlDevInfDevInfPtr_t /* aDevInfP */) { return false; }; // - finish outgoing Message, returns true if final message of package bool FinishMessage(bool aAllowFinal, bool aForceNonFinal=false); // - returns true if session has pending commands bool hasPendingCommands(void); // - incoming message processing aborted (EndMessage will not get called, clean up) void CancelMessageProcessing(void); // entry points for SyncML Toolkit callbacks // - message handling Ret_t StartMessage(SmlSyncHdrPtr_t aContentP); Ret_t EndMessage(Boolean_t final); // - grouping commands Ret_t StartSync(SmlSyncPtr_t aContentP); Ret_t EndSync(void); #ifdef ATOMIC_RECEIVE Ret_t StartAtomic(SmlAtomicPtr_t aContentP); Ret_t EndAtomic(void); #endif #ifdef SEQUENCE_RECEIVE Ret_t StartSequence(SmlSequencePtr_t aContentP); Ret_t EndSequence(void); #endif // - commands Ret_t AddCmd(SmlAddPtr_t aContentP); Ret_t AlertCmd(SmlAlertPtr_t aContentP); Ret_t DeleteCmd(SmlDeletePtr_t aContentP); Ret_t GetCmd(SmlGetPtr_t aContentP); Ret_t PutCmd(SmlPutPtr_t aContentP); #ifdef MAP_RECEIVE Ret_t MapCmd(SmlMapPtr_t aContentP); #endif #ifdef RESULT_RECEIVE Ret_t ResultsCmd(SmlResultsPtr_t aContentP); #endif Ret_t StatusCmd(SmlStatusPtr_t aContentP); Ret_t ReplaceCmd(SmlReplacePtr_t aContentP); #ifdef COPY_RECEIVE Ret_t CopyCmd(SmlReplacePtr_t aContentP); #endif Ret_t MoveCmd(SmlReplacePtr_t aContentP); // - error handling Ret_t HandleError(void); Ret_t DummyHandler(const char* msg); // - Other Callbacks: routed directly to appropriate session, error if none #ifdef SYNCSTATUS_AT_SYNC_CLOSE TStatusCommand *fSyncCloseStatusCommandP; #endif #ifdef SYDEBUG // Message dump void DumpSyncMLMessage(bool aOutgoing); void DumpSyncMLBuffer(MemPtr_t aBuffer, MemSize_t aBufSize, bool aOutgoing, Ret_t aDecoderError); uInt32 fDumpCount; // XML translations of communication // - recoding instances InstanceID_t fOutgoingXMLInstance,fIncomingXMLInstance; // - routines void XMLTranslationIncomingStart(void); void XMLTranslationOutgoingStart(void); void XMLTranslationIncomingEnd(void); void XMLTranslationOutgoingEnd(void); // - flags bool fXMLtranslate; // dump XML translation of SyncML traffic bool fMsgDump; // dump raw SyncML messages #endif // SYDEBUG // log writing #ifndef MINIMAL_CODE void WriteLogLine(const char *aLogline); bool logEnabled(void) { return fLogEnabled; }; #endif // MINIMAL_CODE // current database date & time (defaults to system time) virtual lineartime_t getDatabaseNowAs(timecontext_t aContext) { return getSystemNowAs(aContext); }; // devinf void remoteGotDevinf(void) { fRemoteGotDevinf=true; }; void remoteMustSeeDevinf(void) { fRemoteMustSeeDevinf=true; }; // config access TRootConfig *getRootConfig(void); // access to logging for session #ifdef SYDEBUG TDebugLogger *getDbgLogger(void) { return &fSessionLogger; }; uInt32 getDbgMask(void) { return fSessionDebugLogs ? fSessionLogger.getMask() : 0; }; #endif // SYDEBUG // Remote-specific options, will be set up by checkClient/ServerSpecifics() bool fLimitedRemoteFieldLengths; // if set, all fields will be assumed to have limited, but unknown field length (used for cut-off detection) bool fDontSendEmptyProperties; // if set, no empty properties will be sent to client bool fDoQuote8BitContent; // set if 8-bit chars should generally be encoded with QP in MIME-DIR bool fDoNotFoldContent; // set if content should not be folded in MIME-DIR bool fNoReplaceInSlowsync; // prevent replace commands totally at slow sync bool fTreatRemoteTimeAsLocal; // treat remote time as localtime even if it carries different time zone information ("Z" suffix or zone spec) bool fTreatRemoteTimeAsUTC; // treat remote time as UTC even if it carries different time zone information (no suffix or zone spec) bool fVCal10EnddatesSameDay; // send end date-only values (like DTEND) as last time unit of previous day (i.e. 23:59:59, inclusive) instead of midnight of next day (exclusive, like in iCalendar 2.0) bool fIgnoreDevInfMaxSize; // ignore specification in CTCap (when device has bad specs like in E90 for example) bool fIgnoreCTCap; // ignore entire ctcap bool fDSPathInDevInf; // use actual DS path as used in Alert for creating datastore devInf (needed for newer Nokia clients) bool fDSCgiInDevInf; // also show CGI as used in Alert for creating datastore devInf (needed for newer Nokia clients) bool fUpdateClientDuringSlowsync; // prevent updates of client records during non-first-time slow sync bool fUpdateServerDuringSlowsync; // do not update server records during NON-FIRST-TIME slowsync (but do it for first sync!) bool fAllowMessageRetries; // allow that client sends same message ID again (retry attempt) bool fStrictExecOrdering; // if set (=default, SyncML standard requirement), statuses are sent in order of incoming commands (=execution is ordered) bool fTreatCopyAsAdd; // treat copy commands as if they were adds bool fCompleteFromClientOnly; // perform complete from-client-only session (non conformant, Synthesis before 2.9.8.2 style) sInt32 fRequestMaxTime; // max time [seconds] allowed for processing a single request, 0=unlimited sInt32 fRequestMinTime; // min time [seconds] spent until returning answer (for debug purposes, 0=no minimum time) TCharSets fDefaultOutCharset; // default charset for output generation TCharSets fDefaultInCharset; // default charset for input interpretation #ifndef NO_REMOTE_RULES bool isActiveRule(cAppCharP aRuleName, TRemoteRuleConfig *aRuleP=NULL); // check if given rule (by name, or if aRuleName=NULL by rule pointer) is active TRemoteRulesList fActiveRemoteRules; // list of remote rules currently active in this session #endif // NO_REMOTE_RULES // legacy mode bool fLegacyMode; // if set, remote will see the types marked preferred="legacy" in devInf as preferred types, not the regular preferred ones // lenient mode bool fLenientMode; // if set, enine is less strict in checking (e.g. client-side anchor checking, terminating session while some status missing etc.) #ifdef EXPIRES_AFTER_DATE // copy of scrambled now sInt32 fCopyOfScrambledNow; #endif // EXPIRES_AFTER_DATE // Sync datastores // - find local datastore by URI and separate identifying from optional part of URI TLocalEngineDS *findLocalDataStoreByURI(const char *aURI,string *aOptions=NULL, string *aIdentifyingURI=NULL); // - find local datastore by relative path (may not contain any CGI) TLocalEngineDS *findLocalDataStore(const char *aDatastoreURI); // - find local datastore by datastore handle (=config pointer) TLocalEngineDS *findLocalDataStore(void *aDSHandle); // - find remote datastore by (remote party specified) URI TRemoteDataStore *findRemoteDataStore(const char *aDatastoreURI); // Profiling TP_DEFINFO(fTPInfo) // access to config TSessionConfig *getSessionConfig(void); #ifdef SCRIPT_SUPPORT // access to session script context TScriptContext *getSessionScriptContext(void) { return fSessionScriptContextP; }; #endif // SCRIPT_SUPPORT // unprotected options // - set if we should send property lists in CTCap bool fShowCTCapProps; // - set if we should send type/size in CTCap for SyncML 1.0 (disabled by default as old clients like S55 crash on this) bool fShowTypeSzInCTCap10; // - set if we should show default parameter in mimo_old types as list of s for each value // Note that this is a tristate: 0=no, 1=yes, -1=auto (=yes for =SyncML 1.2, // thus making it work for Nokia 7610 (1.1) as well as E-Series like E90) sInt8 fEnumDefaultPropParams; #ifdef SYDEBUG /// @todo /// fSessionDebugLogs should be removed (but this needs rewriting of the XML and SML dumpers) // - set if debug log for this session is enabled bool fSessionDebugLogs; #endif // SYDEBUG #ifndef MINIMAL_CODE // - se if normal log for this session is enabled bool fLogEnabled; // real log file enabled #endif // MINIMAL_CODE // - remote options (SyncML 1.1) bool fRemoteWantsNOC; // remote wants number-of-changes info bool fRemoteCanHandleUTC; // remote can handle UTC time bool fRemoteSupportsLargeObjects; // remote can handle large object splitting/reassembly // - object size handling sInt16 fOutgoingCmds; // number of outgoing commands in message, but NOT counting SyncHdr status and Alert 222 status (which are ALWAYS there even in an otherwise empty message) sInt32 fMaxRoomForData; // max room for data (free bytes available for data when startin a command) // - Session user time context timecontext_t fUserTimeContext; protected: // Session control // - terminate all datastores void TerminateDatastores(localstatus aAbortStatusCode=408); // - remove all datastores void ResetAndRemoveDatastores(void); // - session layer credential checking bool checkCredentials(const char *aUserName, const SmlCredPtr_t aCredP, TStatusCommand &aStatusCommand); bool checkCredentials(const char *aUserName, const char *aCred, TAuthTypes aAuthType); // - session layer challenge SmlChalPtr_t newSessionChallenge(void); // datastore and type vars // - list of local datastores TLocalDataStorePContainer fLocalDataStores; // - list of remote (client-side) datastores TRemoteDataStorePContainer fRemoteDataStores; bool receivedSyncModeExtensions(); // any of the remote datastores in fRemoteDataStores // had custom sync modes // - list of local content types TSyncItemTypePContainer fLocalItemTypes; // - list of remote item types TSyncItemTypePContainer fRemoteItemTypes; // - Local Database currently targeted by a Sync command, NULL if none // Note: This must be set correctly whenever sync commands (and syncend) are processed // This can be during actual receiving them, OR while processing them from the fDelayedExecutionCommands // queue. TLocalEngineDS *fLocalSyncDatastoreP; // set if we have received DevInf for remote DataStores / CTCap bool fRemoteDevInfKnown; // remote devInf known bool fRemoteDataStoresKnown; // data stores known bool fRemoteDataTypesKnown; // CTCap known bool fRemoteDevInfLock; // set after starting sync according to devInf we had to prevent in-sync devInf changes // see if we have sent or should send DevInf to remote bool fRemoteGotDevinf; // set if we sent a Put or Result containig DevInf bool fRemoteMustSeeDevinf; // set if we should force (Put) devinf to remote bool fCustomGetPutSent; // set if custom get/put has been sent to remote // DevInf // - get new sml list of all datastores (owner of list is transferred, but items are still owned by datastore SmlDevInfDatastoreListPtr_t newDevInfDataStoreList(bool aAlertedOnly, bool aWithoutCTCapProps); SmlDevInfCtcapListPtr_t newLocalCTCapList(bool aAlertedOnly, TLocalEngineDS *aOnlyForDS, bool aWithoutCTCapProps); // - get new DevInf for this session (as Result for GET or item for PUT) virtual SmlDevInfDevInfPtr_t newDevInf(bool aAlertedOnly, bool aWithoutCTCapProps); // - called to issue custom get and put commands virtual void issueCustomGetPut(bool aGotDevInf, bool aSentDevInf); virtual void issueCustomEndPut(void); // Sync processing // - prepare for sending and receiving Sync commands localstatus initSync( const char *aLocalDatastoreURI, const char *aRemoteDatastoreURI ); // Command processing // - process a command (analyze and execute it), // exception-free for simple call from smlCallback adaptors Ret_t process(TSmlCommand *aSyncCommandP); // - handle incoming status // exception-free for simple call from smlCallback adaptors Ret_t handleStatus(TStatusCommand *aStatusCommandP); // helpers for derived classes // - create, send and delete SyncHeader "command" void issueHeader(bool aNoResp=false); // - process the SyncHeader "command" Ret_t processHeader(TSyncHeader *aSyncHdrP); // Helpers for commands // - create new SyncHdr structure for TSyncHeader command // (here because all data for this is in session anyway) SmlSyncHdrPtr_t NewOutgoingSyncHdr(bool aOutgoingNoResp=false); // virtuals for overriding in specialized session derivates // - device ID must be handled on session level as it might depend on session runtime conditions // (like special pseudo-unique ID for Oracle servers when basic id is not unique etc.) virtual string getDeviceID(void)=0; virtual string getDeviceType(void)=0; // abstract, must be client or server // - get new response URI to be sent to remote party for subsequent messages TO local party virtual SmlPcdataPtr_t newResponseURIForRemote(void) { return NULL; }; // no RespURI by default // Authorisation // - required authentication type and mode virtual TAuthTypes requestedAuthType(void) = 0; // get preferred authentication type for authentication of remote party virtual bool isAuthTypeAllowed(TAuthTypes aAuthType) = 0; // test if auth type is allowed for authentication by remote party virtual bool messageAuthRequired(void) { return false; }; // no message-by-message auth by default // - get credentials/username to authenticate with remote party, NULL if none virtual SmlCredPtr_t newCredentialsForRemote(void) { return NULL; }; // normally (server case), none virtual const char * getUsernameForRemote(void) { return NULL; }; // normally (server case), none // - generate credentials (based on fRemoteNonce, fRemoteRequestedAuth, fRemoteRequestedAuthEnc) SmlCredPtr_t newCredentials(const char *aUser, const char *aPassword); public: // - URI to send outgoing message to virtual const char *getSendURI(void) { return ""; }; // none by default (and server) // - get common sync capabilities mask of this session (datastores might modify it) virtual uInt32 getSyncCapMask(void); // - check credentials, login to server virtual bool SessionLogin(const char *aUserName, const char *aAuthString, TAuthSecretTypes aAuthStringType, const char *aDeviceID); protected: // - get next nonce string top be sent to remote party for subsequent MD5 auth virtual void getNextNonce(const char * /* aDeviceID */, string &aNextNonce) { aNextNonce.erase(); }; // empty nonce public: // - get nonce string for specified device virtual void getAuthNonce(const char * /* aDeviceID */, string &aAuthNonce) { aAuthNonce.erase(); }; // - check auth helpers bool checkAuthPlain( const char *aUserName, const char *aPassWord, const char *aNonce, // given values const char *aAuthString, TAuthSecretTypes aAuthStringType // check against this ); bool checkAuthMD5( const char *aUserName, const char *aMD5B64, const char *aNonce, // given values const char *aAuthString, TAuthSecretTypes aAuthStringType // check against this ); bool checkMD5WithNonce( const char *aStringBeforeNonce, const char *aNonce, // given input const char *aMD5B64Creds // credential string to check ); protected: // - helper functions (for use be derived classes) bool getAuthBasicUserPass(const char *aBasicCreds, string &aUsername, string &aPassword); // - load remote connect params (syncml version, type, format and last nonce) // Note: agents that can cache this information between sessions will load // last info here. virtual void loadRemoteParams(void) { fSyncMLVersion=syncml_vers_unknown; fRemoteRequestedAuth=auth_none; fRemoteRequestedAuthEnc=fmt_chr; fRemoteNonce.erase(); }; // static defaults // - save remote connect params for use in next session (if descendant implements it) virtual void saveRemoteParams(void) { /* nop */ }; // - Session level meta virtual SmlPcdataPtr_t newHeaderMeta(void); // - check remote devinf to detect special behaviour needed for some clients. Base class // does not do anything on server level (configured rules are handled at session level) virtual localstatus checkRemoteSpecifics(SmlDevInfDevInfPtr_t aDevInfP, SmlDevInfDevInfPtr_t *aOverrideDevInfP); // - remote device is analyzed, possibly save status virtual void remoteAnalyzed(void) { /* nop */ }; // - tell session whether it may accept an in the map // phase and restart the sync virtual bool allowAlertAfterMap() { return false; } // SyncML Toolkit interface InstanceID_t fSmlWorkspaceID; // SyncML toolkit workspace instance ID SmlEncoding_t fEncoding; // Current encoding type in SyncML toolkit instance // Session custom time zones GZones fSessionZones; // session timing lineartime_t fSessionLastUsed; // time when session was last used lineartime_t fSessionStarted; // time when session was started lineartime_t fLastRequestStarted; // time when last request was received // session busy status (used for session count limiting normally) bool fSessionIsBusy; // session type // - SyncML protocol version TSyncMLVersions fSyncMLVersion; // - outgoing authorisation TAuthTypes fRemoteRequestedAuth; // type of auth requested by the remote TFmtTypes fRemoteRequestedAuthEnc; // type of encoding requested by the remote string fRemoteNonce; // next nonce to be used to authenticate with remote bool fNeedAuth; // set if we need to authorize to remote for next message // session ID vars string fSynchdrSessionID; // SyncML-protocol ID of this sync session (client generated) string fLocalURI; // local party URI string fInitialLocalURI; // local URI used in first message (or preconfigured with ) string fLocalName; // local party optional name string fRemoteURI; // remote party URI (remote deviceID or URL) string fRemoteName; // remote party optional name string fRespondURI; // remote party URI to send response to string fLocalSessionID; // locally generated session ID (server generated) #ifndef MINIMAL_CODE string fRemoteDescName; // descriptive name of remote (set from DevInf and probably adjusted by remoterule) string fRemoteInfoString; // remote party information string (from DevInf) string fSyncUserName; // remote user name // 1:1 devInf details string fRemoteDevInf_devid; string fRemoteDevInf_devtyp; string fRemoteDevInf_mod; string fRemoteDevInf_man; string fRemoteDevInf_oem; string fRemoteDevInf_swv; string fRemoteDevInf_fwv; string fRemoteDevInf_hwv; #endif // MINIMAL_CODE #ifdef SCRIPT_SUPPORT // Session level script context TScriptContext *fSessionScriptContextP; #endif // SCRIPT_SUPPORT // Session options bool fReadOnly; // Session state vars // - incoming authorisation bool fSessionAuthorized; // session is (permanently) authorized, that is, further messages do not need authorization bool fMessageAuthorized; // this message is authorized sInt16 fAuthFailures; // count of failed authentication attempts by remote in a row (normally, server case), will cause abort if too many sInt16 fAuthRetries; // count of failed authentication attempts by myself at remote (normally, client case) // - session state TPackageStates fIncomingState; // incoming package state TPackageStates fCmdIncomingState; // while executing commands: state when command was received (actual might be different due to queueing) TSmlCommand *fCmdIncoming; // while executing command inside process(): command being processed TPackageStates fOutgoingState; // outgoing package state bool fRestarting; // Set to true in TSyncSession::processAlertItem() while processing the first Alert from a // client which requests another sync cycle. Applies to all further Alerts, cleared // when entering fOutgoingState==psta_sync again. bool fFakeFinalFlag; // special flag to work around broken resume implementations bool fNewOutgoingPackage; // set if first outgoing message in outgoing package bool fNeedToAnswer; // set if an answer to currently processed message is needed (will be set by issuing of first non-synchdr-status) sInt32 fIncomingMsgID; // last incoming message ID (0 if none received yet) sInt32 fOutgoingMsgID; // last outgoing message ID (0 if none sent yet) bool fMessageRetried; // if set (by TSyncHeader::execute()) we have received a retried message and should resend the last answer bool fAborted; // if set, session is being aborted (and will be deleted at EndRequest) bool fSuspended; // if set, session is being suspended (stopped processing commands, will send Suspend Alert to remote at next opportunity) bool fSuspendAlertSent; // if set, session has sent a suspend alert to the remote party uInt16 fFailedDatastores; uInt16 fErrorItemDatastores; TSyError fAbortReasonStatus; // if fAborted, this contains a status code what command has aborted the session bool fLocalAbortReason; // if aborted, this signals if aborted due to local or remote reason bool fInProgress; // if set, session is in progress and must persist beyond this request // incoming Message status bool fMsgNoResp; // if set, current message MUST not be responded to. Suppresses all status sendig attempts bool fIgnoreIncomingCommands; // if set, commands dispatched will be ignored TSyError fStatusCodeForIgnored; // if fIgnoreIncomingCommands is set, this status code will be used to reply all incoming commands // - incoming data from a split data item TSyncOpCommand *fIncompleteDataCommandP; // outgoing message status sInt32 fOutgoingCmdID; // last outgoing command ID (0 if none generated yet) bool fOutgoingStarted; // started preparing an outgoing message bool fOutgoingNoResp; // outgoing message does not want response at all // termination flag - set when TerminateSession() has finished executing bool fTerminated; // session is terminated (finally, not restartable!) private: // debug logging #ifdef SYDEBUG TDebugLogger fSessionLogger; // the logger #endif // SYDEBUG // internal vars TSyncAppBase *fSyncAppBaseP; // the owning application base (dispatcher/client base) /* %%% prepared, to be implemented. Currently constant limits sInt32 fMaxIncomingMsgSize; // limit for incoming message, if<>0, causes MaxMsgSize Meta on outgoing SyncHdr sInt32 fMaxIncomingObjSize; // limit for incoming objects, if<>0, causes MaxObjSize Meta on outgoing SyncHdr */ sInt32 fMaxOutgoingMsgSize; // max size of outgoing message, 0 if unlimited sInt32 fMaxOutgoingObjSize; // SyncML 1.1: max size of outgoing object, 0 if unlimited sInt32 fOutgoingMsgSize; // current size of outgoing message bool fOutgoingMessageFull; // outgoing message is full, message must be finished and sent // context-free command queues // - sent commands waiting for status TSmlCommandPContainer fStatusWaitCommands; // - received commands that could not be executed immediately TSmlCommandPContainer fDelayedExecutionCommands; sInt32 fDelayedExecSyncEnds; // - commands that must be queued until SyncHdr is generated TSmlCommandPContainer fHeaderWaitCommands; // SyncBody-context command queues // - commands to be issued only after all commands in this message have // been processed and answered by a status TSmlCommandPContainer fEndOfMessageCommands; // - commands waiting for being sent in next outgoing message TSmlCommandPContainer fNextMessageCommands; // - commands waiting for being sent in next outgoing package TSmlCommandPContainer fNextPackageCommands; // - outgoing command that was interrupted by end of message and must be continued in next message TSmlCommand *fInterruptedCommandP; // - counter that gets incremented once per Alert 222 and decremented when package contents get sent uInt32 fNextMessageRequests; // - sequence nesting level sInt32 fSequenceNesting; }; // TSyncSession // macros #define ISSUE_COMMAND(sp,c,l1,l2) { TSmlCommand* p=c; c=NULL; sp->issuePtr(p,l1,l2); } #define ISSUE_COMMAND_ROOT(sp,c) { TSmlCommand* p=c; c=NULL; sp->issueRootPtr(p); } #ifdef ENGINEINTERFACE_SUPPORT // Support for EngineModule common interface // ========================================= // session runtime parameters (such as access to session script vars) class TSessionKey : public TStructFieldsKey { typedef TStructFieldsKey inherited; public: TSessionKey(TEngineInterface *aEngineInterfaceP, TSyncSession *aSessionP) : inherited(aEngineInterfaceP), fSessionP(aSessionP) {}; virtual ~TSessionKey() {}; protected: // open subkey by name (not by path!) // - this is the actual implementation virtual TSyError OpenSubKeyByName( TSettingsKeyImpl *&aSettingsKeyP, cAppCharP aName, stringSize aNameSize, uInt16 aMode ); // the associated sync session TSyncSession *fSessionP; }; // TSessionKey #endif // ENGINEINTERFACE_SUPPORT } // namespace sysync #endif // SYNC_SESSION_H // eof syncevolution-1.5/src/synthesis/src/sysync/syncsessiondispatch.cpp0000755000373300037200000010046412424517753027461 0ustar00nightlyallusers00000000000000/* * TSyncSessionDispatch * Global object, manages instantiation and removal of * TSyncSession objects, connects requests to sessions, * Interfaces between C-coded SyncML toolkit and SySync * C++ framework. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-07 : luz : Created * */ #include "prefix_file.h" // %%%% Note: CW8.2 has bugs in SEH when optimization is turned on (even if we don't use SEH // here, we might call routines with SEH so be careful here) #pragma optimization_level 0 #include "sysync.h" #include "syncsessiondispatch.h" // TSyncSessionHandle // ================== // constructor TSyncSessionHandle::TSyncSessionHandle(TSyncAppBase *aAppBaseP) : fAppBaseP(aAppBaseP), fSessionP(NULL), fOutdated(false) { OBJDEBUGPRINTFX(fAppBaseP,DBG_OBJINST,("++++++++ TSyncSessionHandle created")); MP_SHOWCURRENT(DBG_OBJINST,"TSyncSessionHandle created"); // nop } // TSyncSessionHandle::TSyncSessionHandle // destructor TSyncSessionHandle::~TSyncSessionHandle() { if (fSessionP) { POBJDEBUGPRINTFX(fAppBaseP,DBG_ERROR,("TSyncSessionHandle deleted with unterminated session (deleting now as well...)")); MP_DELETE(DBG_OBJINST,"fSessionP",fSessionP); } fSessionP=NULL; MP_SHOWCURRENT(DBG_OBJINST,"TSyncSessionHandle deleting"); OBJDEBUGPRINTFX(fAppBaseP,DBG_OBJINST,("-------- TSyncSessionHandle destroyed")); } // TSyncSessionHandle::~TSyncSessionHandle // terminate and delete session. Must protect caller from exceptions // when termination/deletion fails. // NOTE: keeps session Enter()ed, to avoid any other thread to enter. bool TSyncSessionHandle::EnterAndTerminateSession(uInt16 aStatusCode) { // no locks here, so just call TerminateSession return TerminateSession(aStatusCode); } // TSyncSessionHandle::EnterAndTerminateSession // terminate and delete session. Must protect caller from exceptions // when termination/deletion fails. // NOTE: keeps session Enter()ed, to avoid any other thread to enter. bool TSyncSessionHandle::TerminateSession(uInt16 aStatusCode) { if (fSessionP) { // - Set abort code if not zero (not aborted, regular termination) if (aStatusCode) fSessionP->AbortSession(aStatusCode,true); // assume local cause // - terminate the session, which causes datastores to be terminated as well fSessionP->TerminateSession(); // - now actually delete TSyncSession *delP = fSessionP; fSessionP=NULL; // make sure we can't delete again under any circumstance delete delP; POBJDEBUGPRINTFX(fAppBaseP,DBG_TRANSP,("TerminateSession(%hd): deleted session successfully", aStatusCode)); } else { POBJDEBUGPRINTFX(fAppBaseP,DBG_TRANSP+DBG_EXOTIC,("TerminateSession(%hd) - no op, session was already terminated/deleted before", aStatusCode)); } return true; } // TSyncSessionHandle::TerminateSession // TSyncSessionDispatch // ==================== // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL // get or create a session for use with the diagnostic tool TSyncAgent *TSyncSessionDispatch::getSySyToolSession(void) { TSyncAgent *sessionP=NULL; // the session (new or existing found in fSessions) if (fToolSessionHP) { sessionP = fToolSessionHP->fSessionP; } else { // - create session object with given ID fToolSessionHP = CreateSessionHandle(); sessionP = static_cast(fConfigP->fAgentConfigP)->CreateServerSession(fToolSessionHP,"SySyTool"); fToolSessionHP->fSessionP=sessionP; } return sessionP; } #endif // SYSYNC_TOOL // constructor TSyncSessionDispatch::TSyncSessionDispatch() : TSyncAppBase() { // this is a server engine fIsServer = true; // other init #ifdef SYSYNC_TOOL fToolSessionHP=NULL; // no tool session yet #endif } // TSyncSessionDispatch::TSyncSessionDispatch // immediately kill all sessions void TSyncSessionDispatch::TerminateAllSessions(uInt16 aStatusCode) { try { TSyncSessionHandlePContainer::iterator pos; for (pos=fSessions.begin(); pos!=fSessions.end(); ++pos) { if ((pos->second)->fSessionP) { (pos->second)->fSessionP->AbortSession(aStatusCode,true); (pos->second)->fSessionP->ResetSession(); // reset properly before deleting // delete the session handle including the session MP_DELETE(DBG_OBJINST,"leftover session",(pos->second)); } } // delete the session list fSessions.clear(); } catch (...) { } } // TSyncSessionDispatch::TerminateAllSessions // destructor TSyncSessionDispatch::~TSyncSessionDispatch() { fDeleting=true; // flag deletion to block calling critical (virtual) methods // delete all session handles // NOTE: fSessionslock is already gone as it is owned by // derived class TerminateAllSessions(500); // server error #ifdef SYSYNC_TOOL // delete tool session if (fToolSessionHP) { fToolSessionHP->fSessionP->ResetSession(); MP_DELETE(DBG_OBJINST,"leftover session",(fToolSessionHP)); fToolSessionHP=NULL; } #endif } // TSyncSessionDispatch::~TSyncSessionDispatch // Called from SyncML toolkit when a new SyncML message arrives // - finds appropriate session or creates new one // - dispatches to session's StartMessage Ret_t TSyncSessionDispatch::StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // user data, contains NULL or char* to transport-layer supported session ID SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ) { TSyncAgent *sessionP=NULL; // the session (new or existing found in fSessions) TSyncSessionHandle *sessionHP=NULL; Ret_t err; try { // obtain session (existing or new) // - lock access to list // NOTE: Basic policy is to keep sessions locked only while executing code // that cannot throw a SE or a C++ exception, as unlocking too much // (in a general exception catcher) makes much troubles. All Code // that might throw should be executed ONLY with session list released! LockSessions(); // - now get iterator TSyncSessionHandlePContainer::iterator pos=fSessions.end(); // - get SessionID, either from transport (aUserData) or from TargetURI string sessionID; AssignString(sessionID,(const char *)aUserData); if (!sessionID.empty()) { // - transport has provided a sessionID PDEBUGPRINTFX(DBG_PROTO,( "TSyncSessionDispatch::StartMessage called with transport layer session ID='%s'", sessionID.c_str() )); } else { // - try to get sessionID from TargetURI if (extractSessionID(smlSrcTargLocURIToCharP(aContentP->target),sessionID)) { PDEBUGPRINTFX(DBG_PROTO,( "TSyncSessionDispatch::StartMessage found session ID in Target.LocURI='%s'", sessionID.c_str() )); } } // - process session ID if (!sessionID.empty()) { // we seem to have a session ID pos=fSessions.find(sessionID); #ifdef SYDEBUG if (pos!=fSessions.end()) { PDEBUGPRINTFX(DBG_HOT,( "Session found by SessionID=%s", sessionID.c_str() )); } #endif } // now enter existing session or create new one if (pos!=fSessions.end()) { // found existing session: // - get handle sessionHP = (*pos).second; // - get session object pointer sessionP = sessionHP->fSessionP; PDEBUGPRINTFX(DBG_SESSION,("Entering found session...")); // Note: We have the session list locked, so we should not wait here for entering to avoid locking the entire server // - try entering int k=0; while (true) { if (sessionHP->EnterSession(0)) break; // successfully entered // could not enter. Temporarily release sessions list and wait 10 seconds ReleaseSessions(); if (k>60) { // 60*10 = 600 sec = 10 min waited, give up PDEBUGPRINTFX(DBG_ERROR,("Found session is locked for >%d seconds, giving up -> SML_ERR_UNSPECIFIC",k*10)); return SML_ERR_UNSPECIFIC; } PDEBUGPRINTFX(DBG_LOCK,("Session could not be entered after waiting %d seconds, keep trying",k*10)); // wait sleepLineartime(10*secondToLinearTimeFactor); // we need to re-find the session here, as we had given others control over the session list LockSessions(); pos=fSessions.find(sessionID); if (pos==fSessions.end()) { ReleaseSessions(); PDEBUGPRINTFX(DBG_HOT,( "SessionID=%s has disappeared from sessions list while we were waiting to enter it --> SML_ERR_UNSPECIFIC", sessionID.c_str() )); return SML_ERR_UNSPECIFIC; } // - get handle again sessionHP = (*pos).second; k++; } // Session is entered, so we can release the list (no other thread will be able to enter same session) ReleaseSessions(); // Show that we entered the session PDEBUGPRINTFX(DBG_SESSION,("Session entered")); } // if session already exists else { // we need a new session // Note: session list is still locked here PDEBUGPRINTFX(DBG_TRANSP+DBG_EXOTIC,("No session found, will need new one")); // - count sessions not belonging to this client sInt32 othersessioncount = 0; for (pos=fSessions.begin();pos!=fSessions.end();pos++) { // - get handle sessionHP = (*pos).second; // - get session sessionP=sessionHP->fSessionP; // check if session is for same device as current request if (strcmp(smlSrcTargLocURIToCharP(aContentP->source),sessionP->getRemoteURI())!=0) { // other device, count if not outdated if (!sessionHP->fOutdated) othersessioncount++; } else { // this device, set outdated flag to prevent inactive sessions from being // counted and limiting sessions sessionHP->fOutdated=true; } } // for PDEBUGPRINTFX(DBG_SESSION+DBG_EXOTIC,( "Found %ld sessions not related to device '%s'", (sInt32)othersessioncount, smlSrcTargLocURIToCharP(aContentP->source) )); // - get sessions that need to be deleted TSyncSessionHandlePList delList; collectTimedOutSessions(delList); // - now we can release the sessions list ReleaseSessions(); // - actually delete them while session list is again unlocked deleteListedSessions(delList); // Now create new session sessionHP = CreateAndEnterServerSession(NULL); // have sessionID generated // - get session object pointer sessionP = sessionHP->fSessionP; #ifdef CONCURRENT_DEVICES_LIMIT // - now check session count (makes session busy if licensed session count is exceeded) // Note: othersessioncount does not include our own session checkSessionCount(othersessioncount,sessionP); #endif } // now we should have a sessionP if (sessionP) { // Now let session handle SyncML header (start of message) // - sessionP and sessionHP are valid here // - assign pointers to allow direct // routing and calling between session and SyncML toolkit err=setSmlInstanceUserData(aSmlWorkspaceID,sessionP); // toolkit must know session (as userData) if (err!=SML_ERR_OK) throw(TSmlException("setSmlInstanceUserData",err)); // - let session know workspace ID sessionP->setSmlWorkspaceID(aSmlWorkspaceID); // session must know toolkit workspace // let session handle details of StartMessage callback return sessionP->StartMessage(aContentP); } else { PDEBUGPRINTFX(DBG_HOT,( "No session could be created --> SML_ERR_UNSPECIFIC", sessionID.c_str() )); return SML_ERR_UNSPECIFIC; } } catch (exception &e) { return HandleDecodingException(sessionP,"StartMessage",&e); } catch (...) { return HandleDecodingException(sessionP,"StartMessage",NULL); } } // TSyncSessionDispatch::StartMessage /// @brief Collect timed-out sessions and remove them from the session list /// @param aDeletableSessions to-be deleted sessions will be appended to this list /// @note session list must be locked before call! void TSyncSessionDispatch::collectTimedOutSessions(TSyncSessionHandlePList &aDeletableSessions) { TSyncAgent *sessionP=NULL; // the session (new or existing found in fSessions) TSyncSessionHandle *sessionHP=NULL; TAgentConfig *serverconfigP=NULL; // get agent config GET_CASTED_PTR(serverconfigP,TAgentConfig,fConfigP->fAgentConfigP,"missing agent (server) config"); // - find timed-out sessions and count sessions not belonging to this client TSyncSessionHandlePContainer::iterator pos; for (pos=fSessions.begin();pos!=fSessions.end();pos++) { // - get handle sessionHP = (*pos).second; // - get session sessionP=sessionHP->fSessionP; // - check if (getSystemNowAs(TCTX_UTC) > sessionP->getSessionLastUsed()+serverconfigP->getSessionTimeout()) { // this session is too old, queue it for killing aDeletableSessions.push_back(sessionHP); } } // for // now remove the outdated sessions from the main session list // to make sure no other process can possibly access them // - session list is locked once here TSyncSessionHandlePList::iterator delpos; DEBUGPRINTFX(DBG_SESSION,( "Now removing %ld outdated sessions from the session list", (sInt32)aDeletableSessions.size() )); for (delpos=aDeletableSessions.begin();delpos!=aDeletableSessions.end();delpos++) { // - get handle sessionHP = (*delpos); // - remove session handle from the list // NOTE: session list is already locked here, RemoveSession // MUST be called with locked session list! if (!(sessionHP == RemoveSession(sessionHP->fSessionP))) throw (TSyncException("invalid linked session/sessionhandle pair")); } } // collectTimedOutSessions /// @brief Try to enter and delete the sessions passed in one by one /// @note /// - listed sessions must not be part of the sessions list any more /// - on deletion failure, "zombie" sessions will be re-inserted into the session list (to get deleted once again later) /// - intended for implementations without a session thread (XPT, ISAPI, not pipe) void TSyncSessionDispatch::deleteListedSessions(TSyncSessionHandlePList &aDelSessionList) { TSyncAgent *sessionP=NULL; TSyncSessionHandle *sessionHP=NULL; TAgentConfig *serverconfigP=NULL; // get agent config GET_CASTED_PTR(serverconfigP,TAgentConfig,fConfigP->fAgentConfigP,"missing agent (server) config"); TSyncSessionHandlePList::iterator delpos; for (delpos=aDelSessionList.begin();delpos!=aDelSessionList.end();delpos++) { try { // - get handle and session sessionHP = (*delpos); sessionP = sessionHP->fSessionP; if (!sessionP) continue; // seems to be already deleted // - terminate the session #ifdef SYDEBUG string deletedsessionid = sessionP->getLocalSessionID(); #endif PDEBUGPRINTFX(DBG_HOT,( "Terminating timed-out (older than %lld milliseconds) session '%s'...", serverconfigP->getSessionTimeout(), sessionP->getLocalSessionID() )); // - now actually delete if (sessionHP->EnterAndTerminateSession(408)) { // request timeout PDEBUGPRINTFX(DBG_PROTO,("Terminated and deleted timed-out session '%s'",deletedsessionid.c_str())); // - delete session handle itself delete sessionHP; } else { PDEBUGPRINTFX(DBG_ERROR,("Could NOT properly terminate/delete timed-out session '%s' now --> becomes a ZOMBIE",deletedsessionid.c_str())); // We cannot safely get rid of this session now, so we must put it back to the queue if (sessionHP->fSessionP) { // make it used again, so it will timeout later again sessionHP->fSessionP->SessionUsed(); // re-insert into queue LockSessions(); // however, if we now see that there is NO other session running, we'll risk crashing here and delete the session if (fSessions.size()==0) { // we'll do no harm to other sessions because there are none - try to hard-kill the session PDEBUGPRINTFX(DBG_ERROR,("No non-ZOMBIE sessions running -> risking to delete this ZOMBIE",deletedsessionid.c_str())); delete sessionHP; } else { fSessions[deletedsessionid]=sessionHP; PDEBUGPRINTFX(DBG_HOT,( "ZOMBIE session ID='%s' is now again in session list, waiting once more for timeout and hopefully clean deletion later", deletedsessionid.c_str() )); } ReleaseSessions(); } else { PDEBUGPRINTFX(DBG_ERROR,("Termination failed, but sessionP gone nevertheless")); } } } catch (...) { PDEBUGPRINTFX(DBG_ERROR,("******** Exception while trying to kill outdated session")); } } // for } // deleteListedSessions /// Create new session, clean up timed-out sessions /// @param aPredefinedSessionID : predefined sessionID, if NULL, internal ID will be generated TSyncSessionHandle *TSyncSessionDispatch::CreateAndEnterServerSession(cAppCharP aPredefinedSessionID) { TSyncAgent *sessionP=NULL; // the session (new or existing found in fSessions) TSyncSessionHandle *sessionHP=NULL; TAgentConfig *serverconfigP=NULL; // - create new session instance // NOTE: session list is unlocked here already try { #ifdef APP_CAN_EXPIRE // Check expiry (note that this check is for a server running without restart) // - get current time lineartime_t nw = getSystemNowAs(TCTX_UTC); #ifdef EXPIRES_AFTER_DATE #ifdef SYSER_REGISTRATION if (!fRegOK) // only abort if no registration (but accept timed registration) #endif { sInt16 y,mo,d; lineartime2date(nw,&y,&mo,&d); // - calculate scrambled version thereof fScrambledNow= (y-1720)*12*42+ (mo-1)*42+ (d+7); if (fScrambledNow>SCRAMBLED_EXPIRY_VALUE) fAppExpiryStatus = LOCERR_EXPIRED; // hard expiry } #endif #ifdef SYSER_REGISTRATION // - check if timed license has expired if (fRegDuration && date2lineartime(fRegDuration/12+2000,fRegDuration%12+1,1)EnterSession(1000)) { PDEBUGPRINTFX(DBG_ERROR,("New created session cannot be entered")); return NULL; } try { // Determine session ID now string SessionIDString; if (aPredefinedSessionID) { SessionIDString=aPredefinedSessionID; } else { // - create unique server-side session ID // format = aaaabbbbccccdddd // - aaaa = low word of time(NULL) >> 1 (to make sure MSB is cleared) // - dddd = high word of time(NULL) // - bbbbcccc = memory address of session handle uInt64 sid = time(NULL); sid = ((sid >> 16) & 0xFFFF) + ((sid << 47) & 0x7FFF000000000000LL) + // aaaa00000000dddd ((((uIntPtr)sessionHP)&0xFFFFFFFF) << 16); // 0000bbbbcccc0000 // - make a string of it StringObjPrintf(SessionIDString,"%lld",sid); } #ifdef CONCURRENT_DEVICES_LIMIT // some minor arithmetic to hide actual comparison with limit #ifdef SYSER_REGISTRATION // number of users from license or hardcoded limit, whichever is lower sInt32 scrambledlimit = 3*(CONCURRENT_DEVICES_LIMIT!=0 && CONCURRENT_DEVICES_LIMIT(fConfigP->fAgentConfigP)->CreateServerSession(sessionHP,SessionIDString.c_str()); sessionHP->fSessionP=sessionP; // debug PDEBUGPRINTFX(DBG_HOT,( "Session created: local session ID='%s', not yet in session list", SessionIDString.c_str() )); // info CONSOLEPRINTF(("\nStarted new SyncML session (server id=%s)",SessionIDString.c_str())); // - add it to session map LockSessions(); fSessions[SessionIDString]=sessionHP; DEBUGPRINTFX(DBG_HOT,( "Session ID='%s' now in session list, total # of sessions now: %ld", sessionP->getLocalSessionID(), (sInt32)fSessions.size() )); ReleaseSessions(); } catch (...) { sessionHP->LeaveSession(); delete sessionHP; throw; // re-throw } } // session list is not locked here catch (exception &e) { PDEBUGPRINTFX(DBG_HOT,("******** Exception: Cannot create Session: %s",e.what())); return NULL; } catch (...) { PDEBUGPRINTFX(DBG_HOT,("******** Unknown exception: Cannot create Session")); return NULL; } // return session pointer (session is entered) return sessionHP; } // TSyncSessionDispatch::CreateAndEnterServerSession // called by owner of Session dispatcher to signal end of // a request. Responsible for finishing sending answers and // cleaning up the session if needed Ret_t TSyncSessionDispatch::EndRequest(InstanceID_t aSmlWorkspaceID, bool &aHasData, string &aRespURI, bool &aEOSession, uInt32 aReqBytes) { TSyncAgent *serverSessionP=NULL; // the session Ret_t err; // In case of a totally wrong request, this method may be // called when no session is attached to the smlWorkspace aEOSession=true; // default to ending session try { err=getSmlInstanceUserData(aSmlWorkspaceID,(void **)&serverSessionP); if (err==SML_ERR_OK && serverSessionP) { // Important: instance and session must remain attached until session either continues // running or is deleted. // Normal case: there IS a session attached DEBUGPRINTFX(DBG_SESSION,("Request ended with session attached, calling TSyncAgent::EndRequest")); if (serverSessionP->EndRequest(aHasData,aRespURI,aReqBytes)) { // TSyncSession::EndRequest returns true when session is done and must be removed PDEBUGPRINTFX(DBG_SESSION,("TSyncAgent::EndRequest returned true -> terminating and deleting session now")); // - take session out of session list LockSessions(); TSyncSessionHandle *sessionHP = RemoveSession(serverSessionP); ReleaseSessions(); // - delete session now (could cause AV in extreme case) if (sessionHP) { // - now actually delete if (sessionHP->EnterAndTerminateSession(0)) { // normal termination of session PDEBUGPRINTFX(DBG_PROTO,("Terminated and deleted session")); } else { PDEBUGPRINTFX(DBG_ERROR,("Could NOT properly terminate/delete session")); } // - delete handle (including session lock, if any) delete sessionHP; } else { PDEBUGPRINTFX(DBG_ERROR,("Very strange case: Session has no sessionhandle any more -> just delete session")); delete serverSessionP; } // safety: session no longer exists, make sure instance has no longer a pointer // (altough deleting the session should already have caused nulling the pointer by now) setSmlInstanceUserData(aSmlWorkspaceID,NULL); } else { // session is not finished, just leave lock as next message might come from another thread PDEBUGPRINTFX(DBG_SESSION,("TSyncAgent::EndRequest returned false -> just leave session")); serverSessionP->getSessionHandle()->LeaveSession(); aEOSession=false; // session does not end // remove session's reference to this workspace as next request might be decoded in a different workspace // (BUT NOT BEFORE HERE, to make sure the link still exists for the delete case above!) serverSessionP->setSmlWorkspaceID(NULL); // Note: session remains linked from instance's userData } } else { // end of request that could not be assiged a session at all DEBUGPRINTFX(DBG_HOT,("Request ended with no session attached")); } #ifdef SYDEBUG dbgListSessions(); #endif return SML_ERR_OK; } catch (exception &e) { aHasData=false; return HandleDecodingException(serverSessionP,"EndRequest",&e); } catch (...) { aHasData=false; return HandleDecodingException(serverSessionP,"EndRequest",NULL); } } // TSyncSessionDispatch::EndRequest // list currently active sessions void TSyncSessionDispatch::dbgListSessions(void) { #ifdef SYDEBUG string ts; TSyncSession *sP; if (PDEBUGTEST(DBG_SESSION)) { LockSessions(); try { // View list of active sessions TSyncSessionHandlePContainer::iterator pos; PDEBUGPRINTFX(DBG_SESSION,("-------------------------------------------")); PDEBUGPRINTFX(DBG_SESSION,("Active Sessions (%d):",fSessions.size())); for (pos=fSessions.begin(); pos!=fSessions.end(); pos++) { sP =(*pos).second->fSessionP; if (sP) { // handle has a session StringObjTimestamp(ts,sP->getSessionLastUsed()); PDEBUGPRINTFX(DBG_SESSION,( "- %s :Remote URI=%s, Local URI=%s, LastUsed=%s", (*pos).first.c_str(), sP->getRemoteURI(), sP->getLocalURI(), ts.c_str() )); } else { // Strange error: handle without session PDEBUGPRINTFX(DBG_SESSION,( "- %s : ", (*pos).first.c_str() )); } } PDEBUGPRINTFX(DBG_SESSION,("-------------------------------------------")); ReleaseSessions(); // make sure list does not remain blocked } catch (...) { ReleaseSessions(); // make sure list does not remain blocked } } #endif } // TSyncSessionDispatch::dbgListSessions // buffer answer in the session's buffer if instance still has a session attached at all Ret_t TSyncSessionDispatch::bufferAnswer(InstanceID_t aSmlWorkspaceID, MemPtr_t aAnswer, MemSize_t aAnswerSize) { TSyncAgent *serverSessionP=NULL; // the session Ret_t err; err=getSmlInstanceUserData(aSmlWorkspaceID,(void **)&serverSessionP); if ((err==SML_ERR_OK) && serverSessionP) { // there is a session attached, buffer err=serverSessionP->bufferAnswer(aAnswer,aAnswerSize); } return err; } // TSyncSessionDispatch::bufferAnswer // get buffered answer from the session's buffer if there is any void TSyncSessionDispatch::getBufferedAnswer(InstanceID_t aSmlWorkspaceID, MemPtr_t &aAnswer, MemSize_t &aAnswerSize) { TSyncAgent *serverSessionP=NULL; // the session Ret_t err; err=getSmlInstanceUserData(aSmlWorkspaceID,(void **)&serverSessionP); if (err==SML_ERR_OK && serverSessionP) { serverSessionP->getBufferedAnswer(aAnswer,aAnswerSize); } else { aAnswer=NULL; aAnswerSize=0; } } // TSyncSessionDispatch::getBufferedAnswer /* Session abort */ // called by owner or derivate of Session dispatcher when // session must be aborted due to error in request processing. // Kills session currently assigned to specified workspace // Note: may not be called when session list is already locked void TSyncSessionDispatch::KillSessionByInstance(InstanceID_t aSmlWorkspaceID, uInt16 aStatusCode, const char *aMsg, uInt32 aErrorCode) { TSyncAgent *sessionP; // In case of a totally bad request, this method may be // called when no session is attached to the smlWorkspace Ret_t err=getSmlInstanceUserData(aSmlWorkspaceID,(void **)&sessionP); if (err==SML_ERR_OK) { // there IS a session attached KillServerSession(sessionP,aStatusCode,aMsg,aErrorCode); // get rid of session } else { // there is no session at all DEBUGPRINTFX(DBG_HOT,("TSyncSessionDispatch::KillSessionByInstance: smlInstance has no session to be killed")); } } // TSyncSessionDispatch::KillSessionByInstance // remove and kill session // Note: may not be called when session list is already locked void TSyncSessionDispatch::KillServerSession(TSyncAgent *aSessionP, uInt16 aStatusCode, const char *aMsg, uInt32 aErrorCode) { if (aSessionP) { LockSessions(); // make sure session log shows the problem #ifdef SYDEBUG OBJDEBUGPRINTFX(aSessionP,DBG_ERROR,( "******* Warning: Terminating Session with Statuscode=%hd because: %s (Errorcode=%ld)", aStatusCode, aMsg ? aMsg : "", aErrorCode )); #endif // remove session TSyncSessionHandle *sessionHP = RemoveSession(aSessionP); // remove session from session list ReleaseSessions(); // terminate and delete session if (sessionHP) { // - terminate and delete session DEBUGPRINTFX(DBG_SESSION,("TSyncSessionDispatch::KillServerSession: terminating session first...")); if (sessionHP->EnterAndTerminateSession(aStatusCode)) { DEBUGPRINTFX(DBG_SESSION,("TSyncSessionDispatch::KillServerSession: ...terminated, now deleting session handle")); } else { DEBUGPRINTFX(DBG_ERROR,("TSyncSessionDispatch::KillServerSession: ...Session could NOT be deleted, left in memory")); } // - delete session handle itself delete sessionHP; DEBUGPRINTFX(DBG_HOT,("TSyncSessionDispatch::KillServerSession: finished")); } else { // - session not found DEBUGPRINTFX(DBG_ERROR,("TSyncSessionDispatch::KillServerSession: no session found, session pointer seems invalid")); } } else { DEBUGPRINTFX(DBG_ERROR,("TSyncSessionDispatch::KillServerSession: ******* Tried to kill NULL sessionP")); } } // TSyncSessionDispatch::KillServerSession // Handle exception happening while decoding commands for a session Ret_t TSyncSessionDispatch::HandleDecodingException(TSyncSession *aSessionP, const char *aRoutine, exception *aExceptionP) { #ifdef SYDEBUG // determine session name const char *sname = ""; try { if (aSessionP) { sname = aSessionP->getLocalSessionID(); } } catch (...) { sname = ""; aSessionP=NULL; // prevent attempt to write to session's log } // determine routine name if (!aRoutine) aRoutine=""; // show details if (aExceptionP) { // known exception // - show it in global log PDEBUGPRINTFX(DBG_ERROR,( "******** Exception in %s, sessionID=%s: %s", aRoutine, sname, aExceptionP->what() )); // - and also in session log #ifdef SYDEBUG if (aSessionP) { POBJDEBUGPRINTFX(aSessionP,DBG_ERROR,( "******** Warning: Exception in %s: %s", aRoutine, aExceptionP->what() )); } #endif } else { // unknown exception // - show it in global log PDEBUGPRINTFX(DBG_ERROR,( "******** Unknown Exception in %s, sessionID=%s", aRoutine, sname )); // - and also in session log #ifdef SYDEBUG if (aSessionP) { POBJDEBUGPRINTFX(aSessionP,DBG_ERROR,( "******** Warning: Unknown Exception in %s", aRoutine )); } #endif } #endif // try to kill session DEBUGPRINTFX(DBG_SESSION,("******** Exception aborts session: calling KillServerSession")); KillServerSession(static_cast(aSessionP),412,"Decoding Exception"); // return error DEBUGPRINTFX(DBG_SESSION,("******** Exception: returning SML_ERR_UNSPECIFIC to abort smlProcessData")); return SML_ERR_UNSPECIFIC; } // TSyncSessionDispatch::HandleDecodingException // remove session by pointer from session list. If none found, return NULL // NOTES: // - must be called with session list locked!!! // - does not throw TSyncSessionHandle *TSyncSessionDispatch::RemoveSession(TSyncSession *aSessionP) throw() { TSyncSessionHandle *foundhandleP = NULL; // remove session from Dispatcher // - locate session DEBUGPRINTFX(DBG_SESSION,("TSyncSessionDispatch::RemoveSession called...")); TSyncSessionHandlePContainer::iterator pos; for (pos=fSessions.begin(); pos!=fSessions.end(); ++pos) { TSyncSessionHandle *sessionHP = pos->second; if (sessionHP && (sessionHP->fSessionP == aSessionP)) { // - erase in list fSessions.erase(pos); DEBUGPRINTFX(DBG_SESSION,("...TSyncSessionDispatch::RemoveSession succeeded")); // - return handle foundhandleP=sessionHP; break; // done } } // - unlock access to list return foundhandleP; } // TSyncSessionDispatch::RemoveSession // eof syncevolution-1.5/src/synthesis/src/sysync/syncsessiondispatch.h0000755000373300037200000001403112424517753027120 0ustar00nightlyallusers00000000000000/* * TSyncSessionDispatch * Abstract baseclass for session manager controlling * instantiation and removal of TSySyncSession objects and * re-connecting requests to sessions. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * */ #ifndef SYNCSESSIONDISPATCH_H #define SYNCSESSIONDISPATCH_H // general includes (SyncML tookit, windows, Clib) #include "sysync.h" #include "syncappbase.h" #include "syncagent.h" namespace sysync { // forward declarations class TSyncSession; class TSyncAgent; class TSyncSessionDispatch; // Session handle, includes dispatcher-specific stuff for handling sessions // (such as thread IDs, locks, thread termination mechanisms etc.) class TSyncSessionHandle { public: // the session TSyncAgent * fSessionP; // the app base TSyncAppBase * fAppBaseP; // - used for counting session for session limiting bool fOutdated; // - enter session (re-entrance avoidance) virtual bool EnterSession(sInt32 aMaxWaitTime) = 0; // - leave session virtual void LeaveSession(void) = 0; // - Enter, terminate and delete session. Must protect caller from exceptions // when termination/deletion fails. // NOTE: keeps session Enter()ed, to avoid any other thread to enter. virtual bool EnterAndTerminateSession(uInt16 aStatusCode); // - terminate and delete session. Must protect caller from exceptions // when termination/deletion fails. // NOTE: session must be entered already virtual bool TerminateSession(uInt16 aStatusCode); // constructor/destructor TSyncSessionHandle(TSyncAppBase *aAppBaseP); virtual ~TSyncSessionHandle(); }; // TSyncSessionHandle // Container types // - main session list typedef std::map TSyncSessionHandlePContainer; // contains sync sessions by sessionID-String // - deletable sessions list typedef std::list TSyncSessionHandlePList; /* TSyncSessionDispatch manages a list of active sync sessions * and distributes server requests to the appropriate session, * or creates a new session if needed. * * This is a global, singular object which is instantiated ONCE per server * instance. It receives calls from SyncML-Toolkit callbacks. * * The adding an deleting of sessions is done in a thread-safe way * as multiple request might be processed simultaneously in different * threads. */ class TSyncSessionDispatch : public TSyncAppBase { typedef TSyncAppBase inherited; public: // constructors/destructors TSyncSessionDispatch(); virtual ~TSyncSessionDispatch(); // immediately kill all sessions void TerminateAllSessions(uInt16 aStatusCode); // handlers for SyncML toolkit callbacks // - Start Message: identifies Session, and creates new or assigns existing session Ret_t StartMessage( InstanceID_t aSmlWorkspaceID, // SyncML toolkit workspace instance ID VoidPtr_t aUserData, // user data, should be NULL (as StartMessage is responsible for setting userdata) SmlSyncHdrPtr_t aContentP // SyncML tookit's decoded form of the element ); // - end of request (to make sure even incomplete SyncML messages get cleaned up properly) Ret_t EndRequest(InstanceID_t aSmlWorkspaceID, bool &aHasData, string &aRespURI, bool &aEOSession, uInt32 aReqBytes); // Answer resending // - buffer answer in the session's buffer if transport allows it Ret_t bufferAnswer(InstanceID_t aSmlWorkspaceID, MemPtr_t aAnswer, MemSize_t aAnswerSize); // - get buffered answer from the session's buffer if there is any void getBufferedAnswer(InstanceID_t aSmlWorkspaceID, MemPtr_t &aAnswer, MemSize_t &aAnswerSize); // Session handling // - Collect timed-out sessions and remove them from the session list void collectTimedOutSessions(TSyncSessionHandlePList &aDeletableSessions); // - Try to enter and delete the sessions passed in one by one void deleteListedSessions(TSyncSessionHandlePList &aDelSessionList); // - create new session TSyncSessionHandle *CreateAndEnterServerSession(cAppCharP aPredefinedSessionID=NULL); // - create new session handle (of correct TSessionHandle derivate for dispatcher used) virtual TSyncSessionHandle *CreateSessionHandle(void) = 0; // - extract sessionID from query string (docname or TargetURI) virtual bool extractSessionID( const char *aQueryString, string &aSessionID ) { return false; /* no sessionID found */ } // list currently active sessions to debug channel void dbgListSessions(void); // - number of sessions sInt32 numSessions(void) { return fSessions.size(); }; #ifdef SYSYNC_TOOL // get or create a session for use with the diagnostic tool TSyncAgent *getSySyToolSession(void); #endif protected: // must be implemented in derived class to make access to // fSessions thread-safe virtual void LockSessions(void) { /* dummy in base class */ }; virtual void ReleaseSessions(void) { /* dummy in base class */ }; // remove session from internal session list and return it's handle object // Note: session list must be locked while calling RemoveSession TSyncSessionHandle *RemoveSession(TSyncSession *aSessionP) throw(); // remove and kill session // Note: may not be called when session list is already locked void KillServerSession(TSyncAgent *aSessionP, uInt16 aStatusCode, const char *aMsg=NULL, uInt32 aErrorCode=0); // by pointer void KillSessionByInstance(InstanceID_t aSmlWorkspaceID, uInt16 aStatusCode, const char *aMsg=NULL, uInt32 aErrorCode=0); // by SyncML toolkit instance ID // Handle exception happening while decoding commands for a session virtual Ret_t HandleDecodingException(TSyncSession *aSessionP, const char *aRoutine, exception *aExceptionP=NULL); #ifndef NOWSM // lock to make SyncML toolkit instance creation/freeing thread safe virtual void LockToolkit(void) { /* dummy in base class */ }; virtual void ReleaseToolkit(void) { /* dummy in base class */ }; #endif private: // session map TSyncSessionHandlePContainer fSessions; #ifdef SYSYNC_TOOL TSyncSessionHandle *fToolSessionHP; #endif }; // TSyncSessionDispatch } // namespace sysync #endif // SYNCSESSIONDISPATCH_H // eof syncevolution-1.5/src/synthesis/src/sysync/syserial.h0000644000373300037200000001702012424517753024651 0ustar00nightlyallusers00000000000000/* * File: syserial.h * * Author: Lukas Zeller (luz@plan44.ch) * * Serial number generator and checker * * Copyright (c) 2003-2011 by Synthesis AG + plan44.ch * * 2003-02-11 : luz : created * */ #ifndef SYSERIAL_H #define SYSERIAL_H #include "generic_types.h" #include using namespace std; namespace sysync { // variant codes // ============= #define SYSER_VARIANT_UNKNOWN 0 #define SYSER_VARIANT_STD 1 #define SYSER_VARIANT_PRO 2 #define SYSER_VARIANT_CUSTOM 3 #define SYSER_VARIANT_DEMO 10 // branding codes #define SYSER_EXTRA_ID_NONE 0 #define SYSER_EXTRA_ID_PROTO 1 #define SYSER_EXTRA_ID_DBG 2 #define SYSER_EXTRA_ID_GOOSYNC 10 // Toffa.com Goosync special version #define SYSER_EXTRA_ID_FONELINK 11 // novamedia FoneLink special version #define SYSER_EXTRA_ID_SOOCIAL 12 // soocial.com special version // product codes // ============= // PDA Clients // - universal codes for all PDA clients = pocketPC codes #define SYSER_PRODCODE_CLIENT_PDA_STD 2 // this is the former PocketPC STD code (most widespread) #define SYSER_PRODCODE_CLIENT_PDA_PRO 5 // this is the former PocketPC PRO code (most widespread) // Old platform specific PDA codes (still valid, but no longer required) // - Palm & PPC STD #define SYSER_PRODCODE_CLIENT_PALM_STD 1 // for PalmOS #define SYSER_PRODCODE_CLIENT_PPC_STD 2 // for PocketPC #define SYSER_PRODCODE_CLIENT_PALMPPC_STD 3 // combined for PPC and PalmOS // - Palm & PPC PRO #define SYSER_PRODCODE_CLIENT_PALM_PRO 4 // for PalmOS #define SYSER_PRODCODE_CLIENT_PPC_PRO 5 // for PocketPC #define SYSER_PRODCODE_CLIENT_PALMPPC_PRO 6 // combined for PPC and PalmOS // - Symbian client #define SYSER_PRODCODE_CLIENT_SYMBIAN_STD 18 #define SYSER_PRODCODE_CLIENT_SYMBIAN_PRO 19 // - Smartphone #define SYSER_PRODCODE_CLIENT_MSSMP_STD 13 // for Microsoft SmartPhone (2003) #define SYSER_PRODCODE_CLIENT_MSSMP_PRO 14 // for Microsoft SmartPhone (2003) // - ODBC client STD #define SYSER_PRODCODE_CLIENT_ODBC_STD_WIN32 7 // Win32 ODBC PRO #define SYSER_PRODCODE_CLIENT_ODBC_STD_MACOSX 8 // for Mac OS X #define SYSER_PRODCODE_CLIENT_ODBC_STD_LINUX 9 // for Linux // - ODBC client PRO #define SYSER_PRODCODE_CLIENT_ODBC_PRO_WIN32 10 // Win32 ODBC PRO #define SYSER_PRODCODE_CLIENT_ODBC_PRO_MACOSX 11 // for Mac OS X #define SYSER_PRODCODE_CLIENT_ODBC_PRO_LINUX 12 // for Linux // - Demo client #define SYSER_PRODCODE_CLIENT_DEMO 15 // Demo Client (Text only) // - Outlook client #define SYSER_PRODCODE_CLIENT_OUTLOOK_STD 16 // Outlook Client STD #define SYSER_PRODCODE_CLIENT_OUTLOOK_PRO 17 // Outlook Client PRO (with email) // - Client Libraries #define SYSER_PRODCODE_CLIENT_LIB_WIN32 18 // Win32 ODBC PRO #define SYSER_PRODCODE_CLIENT_LIB_MACOSX 19 // for Mac OS X #define SYSER_PRODCODE_CLIENT_LIB_LINUX 20 // for Linux #define SYSER_PRODCODE_CLIENT_LIB_SYMBIAN 21 // for Symbian #define SYSER_PRODCODE_CLIENT_LIB_WM 22 // for Windows Mobile #define SYSER_PRODCODE_CLIENT_LIB_PALM 23 // for PALMOS #define SYSER_PRODCODE_CLIENT_LIB_IPHONEOS 28 // iPhone OS #define SYSER_PRODCODE_CLIENT_LIB_ANDROID 40 // Android #define SYSER_PRODCODE_CLIENT_LIB_ALL 24 // ALL Platforms #define SYSER_PRODCODE_CLIENT_LIB_MOBILE 25 // ALL Mobile Platforms #define SYSER_PRODCODE_CLIENT_LIB_DESK 26 // ALL Desktop Platforms #define SYSER_PRODCODE_CLIENT_LIB_DEMO 27 // All DEMO Libraries // - Client product flags (no flags -> only XPT version allowed) #define SYSER_PRODFLAG_CLIENT_DMU 0x01 // DMU enabled #define SYSER_PRODFLAG_CLIENT_APP 0x02 // App enabled (not only library) // Servers // - Server (=usually unified server+client) Libraries #define SYSER_PRODCODE_SERVER_LIB_WIN32 39 // Win32 ODBC PRO #define SYSER_PRODCODE_SERVER_LIB_MACOSX 29 // for Mac OS X #define SYSER_PRODCODE_SERVER_LIB_LINUX 30 // for Linux #define SYSER_PRODCODE_SERVER_LIB_SYMBIAN 31 // for Symbian #define SYSER_PRODCODE_SERVER_LIB_WM 32 // for Windows Mobile #define SYSER_PRODCODE_SERVER_LIB_PALM 33 // for PALMOS #define SYSER_PRODCODE_SERVER_LIB_IPHONEOS 38 // iPhone OS #define SYSER_PRODCODE_SERVER_LIB_ANDROID 41 // Android #define SYSER_PRODCODE_SERVER_LIB_ALL 34 // ALL Platforms #define SYSER_PRODCODE_SERVER_LIB_MOBILE 35 // ALL Mobile Platforms #define SYSER_PRODCODE_SERVER_LIB_DESK 36 // ALL Desktop Platforms #define SYSER_PRODCODE_SERVER_LIB_DEMO 37 // All DEMO Libraries // - Demo #define SYSER_PRODCODE_SERVER_DEMO 50 // Demo Server (Text only) // - ODBC #define SYSER_PRODCODE_SERVER_STD 51 // STD Server (with ODBC) #define SYSER_PRODCODE_SERVER_PRO 52 // PRO Server (with ODBC) // - XML2GO #define SYSER_PRODCODE_SERVER_XML2GO 53 // xml2go Server (with ODBC and XML2GO) // - Server product flags (no ISAPI or APACHE flags -> only XPT version allowed) #define SYSER_PRODFLAG_SERVER_ISAPI 0x01 // ISAPI version #define SYSER_PRODFLAG_SERVER_APACHE 0x02 // Apache version #define SYSER_PRODFLAG_SERVER_SDKAPI 0x04 // external DB API plugins allowed // special flag: if set, time code in license does not specify when temporary // license expires, but for up to what release date (hard-coded into the binary) // this code is valid. This allows to issue time unlimited licenses that will allow // be used with new releases only up to a defined time period after issuing. // If set, the duration bits (encoded absolute month) are no longer the // expiry date, but the max release date supported. // If this bit is set in SYSER_NEEDED_PRODUCT_FLAGS, this means that the // license must either have the bit set, too, or the license must be a // time limited license. Only licenses limited neither in time nor in release // date will be rejected. #define SYSER_PRODFLAG_MAXRELDATE 0x80 // license types #define SYSER_LTYP_STANDARD 0 // standard license, nothing special #define SYSER_LTYP_SYN_REG 1 // requires activation at synthesis #define SYSER_LTYP_S2G_REG 2 // requires activation at space2go // registration checking URLs #define SYSER_SYN_REG_HOST "www.synthesis.ch" #define SYSER_SYN_REG_DOC "/reg/" #define SYSER_S2G_REG_HOST "sync.space2go.com" #define SYSER_S2G_REG_DOC "/reg/" // update checking URL #define SYSER_SYN_UDC_HOST "www.synthesis.ch" #define SYSER_SYN_UDC_DOC "/udc/" // Internals // ========= // size of serial number #define SYSER_SERIALNUM_SIZE 20 // 4*4 chars, plus 3 dashes, plus one terminator = 16+3+1 = 20 #define SYSER_SERIALNUM_MANGLED_SIZE 17 // dashes are optimized away, so 4*4+1 = 17 // max size of "name" string (only that much will be stored and tested) #define SYSER_NAMESTRING_MAX 80 // should be enough for name and email #ifdef LINUX #define SYSER_CRC32_SEED ((uInt32)4119203362LL) // phone Tiefenau :-) #else #define SYSER_CRC32_SEED 4119203362 // phone Tiefenau :-) #endif // make sure we don't ever include the generator into a product #ifndef SYSYNC_VERSION_MAJOR // generate serial void generateSySerial( char *outbuf, // must be able to receive SYSER_SERIALNUM_SIZE chars (including terminator) uInt8 productflags, uInt16 productcode, uInt8 licensetype, uInt16 quantity, uInt8 duration, const char *name, bool aIprevent ); #endif #if defined SYSER_REGISTRATION || !defined(SYSYNC_VERSION_MAJOR) bool getSySerialInfo( const char *input, uInt8 &productflags, uInt16 &productcode, uInt8 &licensetype, uInt16 &quantity, uInt8 &duration, uInt32 &crc, uInt32 &infocrc, bool aMangled=false ); #endif // SYSER_REGISTRATION uInt32 addToCrc(uInt32 aCRC, uInt8 aByte); uInt32 addNameToCRC(uInt32 aCRC, const char *aName, bool aMangled=false, uInt16 aMaxChars=32000); } // namespace sysync #endif // SYSERIAL_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync/sysync.h0000755000373300037200000000411512424517753024352 0ustar00nightlyallusers00000000000000/* sysync generic header file */ #ifndef SYSYNC_H #define SYSYNC_H /* Headers that might be available in precompiled form * (standard libraries) */ #ifndef SYSYNC_PRECOMP_H #include "sysync_precomp.h" #endif #if __MC68K__ // Note: STL includes may not be in precompiled headers for CW Palm v9 // (STL map crashes), so we have them here for MC68k /* - STL includes */ #include #include #include #include #endif #ifdef ANDROID #include "android/log.h" #endif /* SySync headers (not precompiled during SySync development) */ // global constants and settings #include "sysync_globs.h" #ifdef DIRECT_APPBASE_GLOBALACCESS // only in old style environment with global anchors #include "sysync_glob_vars.h" #endif /* SyncML Toolkit includes */ // - SyncML Toolkit external API extern "C" { #include "sml.h" #include "smlerr.h" #include "smldtd.h" #include "smldevinfdtd.h" #include "smlmetinfdtd.h" #include "mgrutil.h" // utilities to work with SmlXXX structs #include "libmem.h" // utilities to allocate/deallocate SML memory } // engine defs (public defines also used in SDK) #include "engine_defs.h" // utilities #include "sysync_utils.h" #ifdef SYSYNC_ENGINE #include "stringutils.h" #endif #include "lineartime.h" #include "iso8601.h" #include "debuglogger.h" // platform adapters #include "configfiles.h" /* integrated extensions into RTK sources 2002-06-20 %%% // Synthesis SyncML toolkit extensions extern "C" { #include "smlextensions.h" } */ // utility classes without cross-dependencies #include "syncexception.h" #include "profiling.h" // base classes //#include "syncappbase.h" //#include "itemfield.h" //#include "syncitemtype.h" //#include "syncitem.h" //#include "vcarditemtype.h" //#include "vcalendaritemtype.h" //#include "mimediritemtype.h" //#include "syncdatastore.h" //#include "localengineds.h" //#include "synccommand.h" //#include "syncsession.h" //#include "syncclient.h" //#include "syncserver.h" //#include "syncsessiondispatch.h" // use sysync namespace using namespace sysync; /* globals */ #endif // SYSYNC_H syncevolution-1.5/src/synthesis/src/sysync/sysync_crc16.cpp0000755000373300037200000001253312424517753025706 0ustar00nightlyallusers00000000000000/* * sysync_crc16.cpp * CRC 16 checksumming functions * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * */ #include "prefix_file.h" #include "sysync_crc16.h" namespace sysync { #define TAB_DRIVEN 1 /* 1 - fast ; 0 - small */ #define CRC_CCITT 0 /* 1 for CCITT algorithm */ #define CRC_CRC16 1 /* 1 for CRC16 algorithm */ #if TAB_DRIVEN #if CRC_CCITT /* CCITT 16 bit CRC table build using feedback value of 0x8408 */ static const uInt16 crc16_table[256] = { 0x0000,0x1189,0x2312,0x329b,0x4624,0x57ad,0x6536,0x74bf, 0x8c48,0x9dc1,0xaf5a,0xbed3,0xca6c,0xdbe5,0xe97e,0xf8f7, 0x1891,0x0918,0x3b83,0x2a0a,0x5eb5,0x4f3c,0x7da7,0x6c2e, 0x94d9,0x8550,0xb7cb,0xa642,0xd2fd,0xc374,0xf1ef,0xe066, 0x3122,0x20ab,0x1230,0x03b9,0x7706,0x668f,0x5414,0x459d, 0xbd6a,0xace3,0x9e78,0x8ff1,0xfb4e,0xeac7,0xd85c,0xc9d5, 0x29b3,0x383a,0x0aa1,0x1b28,0x6f97,0x7e1e,0x4c85,0x5d0c, 0xa5fb,0xb472,0x86e9,0x9760,0xe3df,0xf256,0xc0cd,0xd144, 0x6244,0x73cd,0x4156,0x50df,0x2460,0x35e9,0x0772,0x16fb, 0xee0c,0xff85,0xcd1e,0xdc97,0xa828,0xb9a1,0x8b3a,0x9ab3, 0x7ad5,0x6b5c,0x59c7,0x484e,0x3cf1,0x2d78,0x1fe3,0x0e6a, 0xf69d,0xe714,0xd58f,0xc406,0xb0b9,0xa130,0x93ab,0x8222, 0x5366,0x42ef,0x7074,0x61fd,0x1542,0x04cb,0x3650,0x27d9, 0xdf2e,0xcea7,0xfc3c,0xedb5,0x990a,0x8883,0xba18,0xab91, 0x4bf7,0x5a7e,0x68e5,0x796c,0x0dd3,0x1c5a,0x2ec1,0x3f48, 0xc7bf,0xd636,0xe4ad,0xf524,0x819b,0x9012,0xa289,0xb300, 0xc488,0xd501,0xe79a,0xf613,0x82ac,0x9325,0xa1be,0xb037, 0x48c0,0x5949,0x6bd2,0x7a5b,0x0ee4,0x1f6d,0x2df6,0x3c7f, 0xdc19,0xcd90,0xff0b,0xee82,0x9a3d,0x8bb4,0xb92f,0xa8a6, 0x5051,0x41d8,0x7343,0x62ca,0x1675,0x07fc,0x3567,0x24ee, 0xf5aa,0xe423,0xd6b8,0xc731,0xb38e,0xa207,0x909c,0x8115, 0x79e2,0x686b,0x5af0,0x4b79,0x3fc6,0x2e4f,0x1cd4,0x0d5d, 0xed3b,0xfcb2,0xce29,0xdfa0,0xab1f,0xba96,0x880d,0x9984, 0x6173,0x70fa,0x4261,0x53e8,0x2757,0x36de,0x0445,0x15cc, 0xa6cc,0xb745,0x85de,0x9457,0xe0e8,0xf161,0xc3fa,0xd273, 0x2a84,0x3b0d,0x0996,0x181f,0x6ca0,0x7d29,0x4fb2,0x5e3b, 0xbe5d,0xafd4,0x9d4f,0x8cc6,0xf879,0xe9f0,0xdb6b,0xcae2, 0x3215,0x239c,0x1107,0x008e,0x7431,0x65b8,0x5723,0x46aa, 0x97ee,0x8667,0xb4fc,0xa575,0xd1ca,0xc043,0xf2d8,0xe351, 0x1ba6,0x0a2f,0x38b4,0x293d,0x5d82,0x4c0b,0x7e90,0x6f19, 0x8f7f,0x9ef6,0xac6d,0xbde4,0xc95b,0xd8d2,0xea49,0xfbc0, 0x0337,0x12be,0x2025,0x31ac,0x4513,0x549a,0x6601,0x7788 }; #elif defined(CRC_CRC16) static const uInt16 crc16_table[256] = { 0x0000,0x1189,0x2312,0x329B,0x4624,0x57AD,0x6536,0x74BF, 0x8C48,0x9DC1,0xAF5A,0xBED3,0xCA6C,0xDBE5,0xE97E,0xF8F7, 0x1081,0x0108,0x3393,0x221A,0x56A5,0x472C,0x75B7,0x643E, 0x9CC9,0x8D40,0xBFDB,0xAE52,0xDAED,0xCB64,0xF9FF,0xE876, 0x2102,0x308B,0x0210,0x1399,0x6726,0x76AF,0x4434,0x55BD, 0xAD4A,0xBCC3,0x8E58,0x9FD1,0xEB6E,0xFAE7,0xC87C,0xD9F5, 0x3183,0x200A,0x1291,0x0318,0x77A7,0x662E,0x54B5,0x453C, 0xBDCB,0xAC42,0x9ED9,0x8F50,0xFBEF,0xEA66,0xD8FD,0xC974, 0x4204,0x538D,0x6116,0x709F,0x0420,0x15A9,0x2732,0x36BB, 0xCE4C,0xDFC5,0xED5E,0xFCD7,0x8868,0x99E1,0xAB7A,0xBAF3, 0x5285,0x430C,0x7197,0x601E,0x14A1,0x0528,0x37B3,0x263A, 0xDECD,0xCF44,0xFDDF,0xEC56,0x98E9,0x8960,0xBBFB,0xAA72, 0x6306,0x728F,0x4014,0x519D,0x2522,0x34AB,0x0630,0x17B9, 0xEF4E,0xFEC7,0xCC5C,0xDDD5,0xA96A,0xB8E3,0x8A78,0x9BF1, 0x7387,0x620E,0x5095,0x411C,0x35A3,0x242A,0x16B1,0x0738, 0xFFCF,0xEE46,0xDCDD,0xCD54,0xB9EB,0xA862,0x9AF9,0x8B70, 0x8408,0x9581,0xA71A,0xB693,0xC22C,0xD3A5,0xE13E,0xF0B7, 0x0840,0x19C9,0x2B52,0x3ADB,0x4E64,0x5FED,0x6D76,0x7CFF, 0x9489,0x8500,0xB79B,0xA612,0xD2AD,0xC324,0xF1BF,0xE036, 0x18C1,0x0948,0x3BD3,0x2A5A,0x5EE5,0x4F6C,0x7DF7,0x6C7E, 0xA50A,0xB483,0x8618,0x9791,0xE32E,0xF2A7,0xC03C,0xD1B5, 0x2942,0x38CB,0x0A50,0x1BD9,0x6F66,0x7EEF,0x4C74,0x5DFD, 0xB58B,0xA402,0x9699,0x8710,0xF3AF,0xE226,0xD0BD,0xC134, 0x39C3,0x284A,0x1AD1,0x0B58,0x7FE7,0x6E6E,0x5CF5,0x4D7C, 0xC60C,0xD785,0xE51E,0xF497,0x8028,0x91A1,0xA33A,0xB2B3, 0x4A44,0x5BCD,0x6956,0x78DF,0x0C60,0x1DE9,0x2F72,0x3EFB, 0xD68D,0xC704,0xF59F,0xE416,0x90A9,0x8120,0xB3BB,0xA232, 0x5AC5,0x4B4C,0x79D7,0x685E,0x1CE1,0x0D68,0x3FF3,0x2E7A, 0xE70E,0xF687,0xC41C,0xD595,0xA12A,0xB0A3,0x8238,0x93B1, 0x6B46,0x7ACF,0x4854,0x59DD,0x2D62,0x3CEB,0x0E70,0x1FF9, 0xF78F,0xE606,0xD49D,0xC514,0xB1AB,0xA022,0x92B9,0x8330, 0x7BC7,0x6A4E,0x58D5,0x495C,0x3DE3,0x2C6A,0x1EF1,0x0F78 }; #else #error "no CRC method defined" #endif /* compute 16 bit CRC using the table */ uInt16 sysync_crc16(uInt16 crc,uInt8 b) { int s, i; i = (b ^ crc) & 0xff; s = (crc >> 8) ^ crc16_table[i]; return s & 0xffff; } // sysync_crc16 #else #if CRC_CCITT /* compute 16 bit CCITT crc on the fly, doesn't use table */ /* use this one if you are tight on space. */ uInt16 sysync_crc16(uInt16 crc,uInt8 b) { int s; /* s = b ^ (crc & 0xff);*/ s = (b ^ crc) & 0xff; s = s ^ (s << 4); s = (crc >> 8) ^ (s << 8) ^ (s << 3) ^ (s >> 4); return s & 0xffff; } #endif #if CRC_CRC16 /* compute 16 bit CCR16 crc on the fly, doesn't use table */ /* use this one if you are tight on space. */ #error "this function not implemented ... " #endif #endif // calc CRC over a block of bytes uInt16 sysync_crc16_block(const void* dataP, uInt32 len, uInt16 crc) { uInt32 i; uInt8 *p=(uInt8 *)dataP; for (i=0; i #endif #ifdef __cplusplus using namespace std; namespace sysync { #endif #ifndef __PALM_OS__ #if defined __MACH__ && !defined __GNUC__ /* used for va_list support */ #include #else #include #endif #endif #ifdef __cplusplus #define SYSYCDECL extern "C" #else #define SYSYCDECL #endif /* REMARK: do not define it again for C /// @todo get rid of all GDEBUG references later #warning "get rid of all GDEBUG references later" #define GDEBUG getDbgMask() // use accessor, depends on context which one is used */ // non-class debug output functions SYSYCDECL void DebugVPrintf(uInt32 mask, const char *format, va_list args); SYSYCDECL void DebugPrintf(const char *text, ...); SYSYCDECL void DebugPuts(uInt32 mask, const char *text); SYSYCDECL uInt32 getDbgMask(void); #ifdef __cplusplus class TDebugLogger; TDebugLogger *getDbgLogger(void); #endif // debug level masks // - main categories #define DBG_HOT 0x00000001 // hot information #define DBG_ERROR 0x00000002 // Error conditions // - specialized info categories #define DBG_PROTO 0x00000010 // directly SyncML protocol related info #define DBG_SESSION 0x00000020 // more internal Session management stuff #define DBG_ADMIN 0x00000040 // administrative data management #define DBG_DATA 0x00000080 // content data management (but needs DBG_USERDATA to show actual data) #define DBG_REMOTEINFO 0x00000100 // information we get about remote party (e.g. devInf or remote rule) #define DBG_PARSE 0x00000200 // parsing external formats into internal ones #define DBG_GEN 0x00000400 // generate external formats from internal ones #define DBG_SCRIPTEXPR 0x00000800 // Script expression details #define DBG_SCRIPTS 0x00001000 // Script execution #define DBG_TRANSP 0x00002000 // transport debug (outside SySync, e.g. ISAPI) #define DBG_REST 0x00008000 // everything not categorized, includes all DEBUGPRINTF // - technical insider categories #define DBG_LOCK 0x00010000 // Thread lock info #define DBG_OBJINST 0x00020000 // object instantiation and deletion #define DBG_PROFILE 0x00040000 // Execution time and memory profiling // - external library debug info categories #define DBG_RTK_SML 0x00100000 // SyncML Toolkit SML messages #define DBG_RTK_XPT 0x00200000 // SyncML Toolkit XPT messages // - flags to select more info, usually combined with other data #define DBG_USERDATA 0x01000000 // user content data #define DBG_DBAPI 0x02000000 // DB API data (such as SQL statements) #define DBG_PLUGIN 0x04000000 // plugin debug messages (all plugins) #define DBG_FILTER 0x08000000 // Details on filtering #define DBG_MATCH 0x10000000 // Details on content matching (but no user data unless USERDATA is set as well) #define DBG_CONFLICT 0x20000000 // Details on conflict resolution, such as data merge // - more details #define DBG_DETAILS 0x40000000 // show more detailed data #define DBG_EXOTIC 0x80000000 // show even most exotic details // - useful sets #define DBG_ALL 0xFFFFFFFF #define DBG_MINIMAL (DBG_ERROR+DBG_HOT) #define DBG_NORMAL (DBG_MINIMAL +DBG_DATA+DBG_ADMIN+DBG_PROTO+DBG_REMOTEINFO) #define DBG_EXTENDED (DBG_NORMAL +DBG_TRANSP+DBG_DBAPI+DBG_PLUGIN+DBG_SESSION+DBG_PARSE+DBG_GEN+DBG_DETAILS+DBG_FILTER+DBG_CONFLICT+DBG_MATCH+DBG_USERDATA+DBG_RTK_SML) #define DBG_MAXIMAL ((DBG_EXTENDED +DBG_EXOTIC+DBG_SCRIPTS) & ~DBG_MATCH) // DBG_MATCH explicitly excluded, as it causes O(N^2) output with DBG_EXOTIC // - special sets (internally used) #define DBG_ALLDB (DBG_DATA+DBG_ADMIN+DBG_DBAPI+DBG_PLUGIN) // what used to be "DBG_DB" (more or less) #define DBG_TOOL (DBG_HOT+DBG_ERROR+DBG_ALLDB+DBG_SCRIPTS+DBG_TRANSP) // what is shown for sysytest/sysytool in verbose mode // output to console macro #ifdef CONSOLEINFO #ifdef CONSOLEINFO_LIBC // Short-circuit all of the intermediate layers and use libc directly; // useful to avoid dependencies in libsmltk on libsynthesis. // Because a lot of libs log to stderr, include a unique prefix. // Assumes that all printf format strings are plain strings. #define CONSOLEPUTS(m) CONSOLE_PRINTF_VARARGS("%s", (m)) #define CONSOLE_PRINTF_VARARGS(_m, _args...) SySync_ConsolePrintf(stderr, "SYSYNC " _m "\n", ##_args) #define CONSOLEPRINTF(m) CONSOLE_PRINTF_VARARGS m // default implementation invokes fprintf, can be set by app // @param stream stderr, useful for invoking fprintf directly // @param format guaranteed to start with "SYSYNC " (see above) #ifdef __cplusplus extern "C" { #endif extern int (*SySync_ConsolePrintf)(FILE *stream, const char *format, ...); #ifdef __cplusplus } #endif #else // CONSOLEINFO_LIBC #define CONSOLEPUTS(m) ConsolePuts(m) #define CONSOLEPRINTF(m) ConsolePrintf m #endif // CONSOLEINFO_LIBC #else #define CONSOLEPUTS(m) #define CONSOLEPRINTF(m) #endif #ifdef SYDEBUG_LOCATION /// Source location tracking in all debug messages /// Container for information about the location where a debug call was made. /// Strings are owned by caller. struct TDbgLocation { /// function name, may be NULL, derived from __FUNC__ if available const char *fFunction; /// file name, may be NULL, from __FILE__ const char *fFile; /// line number, 0 if unknown const int fLine; #ifdef __cplusplus TDbgLocation(const char *aFunction = NULL, const char *aFile = NULL, const int aLine = 0) : fFunction(aFunction), fFile(aFile), fLine(aLine) {} #endif }; # define TDBG_LOCATION_PROTO const TDbgLocation &aTDbgLoc, # define TDBG_LOCATION_ARG aTDbgLoc, # define TDBG_LOCATION_HERE TDbgLocation(__func__, __FILE__, __LINE__), # define TDBG_LOCATION_NONE TDbgLocation(), # define TDBG_LOCATION_ARGS(_func, _file, _line) TDbgLocation(_func, _file, _line), # define TDBG_VARARGS(m...) (TDbgLocation(__PRETTY_FUNCTION__, __FILE__, __LINE__), ## m) # define TDBG_LOCATION_ARG_NUM 1 #else // No links to source in debug messages # define TDBG_LOCATION_PROTO # define TDBG_LOCATION_ARG # define TDBG_LOCATION_HERE # define TDBG_LOCATION_NONE # define TDBG_LOCATION_ARGS(_func, _file, _line) # define TDBG_VARARGS # define TDBG_LOCATION_ARG_NUM 0 #endif // SYDEBUG_LOCATION // debug output macros (prevents unnecessary printf argument // calculations when SYDEBUG is UNDEFined). #ifndef DIRECT_APPBASE_GLOBALACCESS // without global access, all NC variants are always disabled #define PNCDEBUGPUTSX(lvl,m) #define PNCDEBUGPUTSXX(lvl,m,s,p) #define PNCDEBUGPRINTFX(lvl,m) #define PNCDEBUGVPRINTFX(lvl,f,a) #endif #ifdef SYDEBUG // "Public" debug info // Debug structure #define PDEBUGBLOCKFMT(m) getDbgLogger()->DebugOpenBlockExpanded TDBG_VARARGS m #define PDEBUGBLOCKFMTCOLL(m) getDbgLogger()->DebugOpenBlockCollapsed TDBG_VARARGS m #define PDEBUGBLOCKDESC(n,d) getDbgLogger()->DebugOpenBlock(TDBG_LOCATION_HERE n,d) #define PDEBUGBLOCKDESCCOLL(n,d) getDbgLogger()->DebugOpenBlock(TDBG_LOCATION_HERE n,d,true) #define PDEBUGBLOCK(n) getDbgLogger()->DebugOpenBlock(TDBG_LOCATION_HERE n) #define PDEBUGBLOCKCOLL(n) getDbgLogger()->DebugOpenBlock(TDBG_LOCATION_HERE n,NULL,true) #define PDEBUGENDBLOCK(n) getDbgLogger()->DebugCloseBlock(TDBG_LOCATION_HERE n) // current-class context debug output #define PDEBUGPUTSX(lvl,m) { if (((lvl) & getDbgMask()) == (lvl)) getDbgLogger()->DebugPuts(TDBG_LOCATION_HERE lvl,m); } #define PDEBUGPUTSXX(lvl,m,s,p) { if (((lvl) & getDbgMask()) == (lvl)) getDbgLogger()->DebugPuts(TDBG_LOCATION_HERE lvl,m,s,p); } #define PDEBUGPUTS(m) PDEBUGPUTSX(DBG_REST,m) #define PDEBUGVPRINTFX(lvl,f,a) { if (((lvl) & getDbgMask()) == (lvl)) getDbgLogger()->DebugVPrintf(TDBG_LOCATION_HERE lvl,f,a); } #define PDEBUGPRINTFX(lvl,m) { if (((lvl) & getDbgMask()) == (lvl)) getDbgLogger()->setNextMask(lvl).DebugPrintfLastMask TDBG_VARARGS m; } #define PDEBUGPRINTF(m) PDEBUGPRINTFX(DBG_REST,m) #define PPOINTERTEST(p,m) if (!p) getDbgLogger()->setNextMask(DBG_ERROR).DebugPrintfLastMask TDBG_VARARGS m #define PDEBUGTEST(lvl) (((lvl) & getDbgMask()) == (lvl)) #define PDEBUGMASK getDbgMask() // direct output to a logger #define PLOGDEBUGTEST(lo,lvl) ((lo) && (((lvl) & (lo)->getMask()) == (lvl))) #define PLOGDEBUGBLOCKFMT(lo,m) { if (lo) (lo)->DebugOpenBlockExpanded TDBG_VARARGS m; } #define PLOGDEBUGBLOCKFMTCOLL(lo,m) { if (lo) (lo)->DebugOpenBlockCollapsed TDBG_VARARGS m; } #define PLOGDEBUGBLOCKDESC(lo,n,d) { if (lo) (lo)->DebugOpenBlock(TDBG_LOCATION_HERE n,d); } #define PLOGDEBUGBLOCKDESCCOLL(lo,n,d) { if (lo) (lo)->DebugOpenBlock(TDBG_LOCATION_HERE n,d,true); } #define PLOGDEBUGBLOCK(lo,n) { if (lo) (lo)->DebugOpenBlock(TDBG_LOCATION_HERE n); } #define PLOGDEBUGBLOCKCOLL(lo,n) { if (lo) (lo)->DebugOpenBlock(TDBG_LOCATION_HERE n,NULL,true); } #define PLOGDEBUGENDBLOCK(lo,n) { if (lo) (lo)->DebugCloseBlock(TDBG_LOCATION_HERE n); } #define PLOGDEBUGPUTSX(lo,lvl,m) { if ((lo) && ((lvl) & (lo)->getMask()) == (lvl)) (lo)->DebugPuts(TDBG_LOCATION_HERE lvl,m); } #define PLOGDEBUGPUTSXX(lo,lvl,m,s,p) { if ((lo) && ((lvl) & (lo)->getMask()) == (lvl)) (lo)->DebugPuts(TDBG_LOCATION_HERE lvl,m,s,p); } #define PLOGDEBUGVPRINTFX(lo,lvl,f,a) { if ((lo) && ((lvl) & (lo)->getMask()) == (lvl)) (lo)->DebugVPrintf(TDBG_LOCATION_HERE lvl,f,a); } #define PLOGDEBUGPRINTFX(lo,lvl,m) { if ((lo) && ((lvl) & (lo)->getMask()) == (lvl)) (lo)->setNextMask(lvl).DebugPrintfLastMask TDBG_VARARGS m; } // non-class context or C-level debug output #ifdef DIRECT_APPBASE_GLOBALACCESS #ifdef __cplusplus #define PNCDEBUGPUTSX(lvl,m) { if (((lvl) & sysync::getDbgMask()) == (lvl)) sysync::DebugPuts(TDBG_LOCATION_HERE m); } #define PNCDEBUGPRINTFX(lvl,m) { if (((lvl) & sysync::getDbgMask()) == (lvl)) sysync::DebugPrintf TDBG_VARARGS m; } #define PNCDEBUGVPRINTFX(lvl,f,a) { if (((lvl) & sysync::getDbgMask()) == (lvl)) sysync::DebugVPrintf(TDBG_LOCATION_HERE lvl,f,a); } #else #define PNCDEBUGPUTSX(lvl,m) { if (((lvl) & getDbgMask()) == (lvl)) DebugPuts(TDBG_LOCATION_HERE m); } #define PNCDEBUGPRINTFX(lvl,m) { if (((lvl) & getDbgMask()) == (lvl)) DebugPrintf TDBG_VARARGS m; } #define PNCDEBUGVPRINTFX(lvl,f,a) { if (((lvl) & getDbgMask()) == (lvl)) DebugVPrintf(TDBG_LOCATION_HERE lvl,f,a); } #endif #endif // specified object-context debug output #define POBJDEBUGPRINTFX(obj,lvl,m) { if ((obj) && (((lvl) & (obj)->getDbgMask()) == (lvl))) (obj)->getDbgLogger()->setNextMask(lvl).DebugPrintfLastMask TDBG_VARARGS m; } #define POBJDEBUGPUTSX(obj,lvl,m) { if ((obj) && (((lvl) & (obj)->getDbgMask()) == (lvl))) (obj)->getDbgLogger()->DebugPuts(TDBG_LOCATION_HERE lvl,m); } #define POBJDEBUGPUTSXX(obj,lvl,m,s,p) { if ((obj) && (((lvl) & (obj)->getDbgMask()) == (lvl))) (obj)->getDbgLogger()->DebugPuts(TDBG_LOCATION_HERE lvl,m,s,p); } #define POBJDEBUGPRINTF(obj,m) POBJDEBUGPRINTFX(obj,DBG_REST,m) #define POBJDEBUGTEST(obj,lvl) ((obj) && (((lvl) & (obj)->getDbgMask()) == (lvl))) // get current logger #define GETDBGLOGGER (getDbgLogger()) #define OBJGETDBGLOGGER(obj) (obj->getDbgLogger()) #else #define PDEBUGBLOCKFMT(m) #define PDEBUGBLOCKFMTCOLL(m) #define PDEBUGBLOCKDESC(n,d) #define PDEBUGBLOCKDESCCOLL(n,d) #define PDEBUGBLOCK(n) #define PDEBUGBLOCKCOLL(n) #define PDEBUGENDBLOCK(n) #define PDEBUGPUTSX(lvl,m) #define PDEBUGPUTSXX(lvl,m,s,p) #define PDEBUGPUTS(m) #define PDEBUGVPRINTFX(lvl,f,a) #define PDEBUGPRINTFX(lvl,m) #define PDEBUGPRINTF(m) #define PPOINTERTEST(p,m) #define PDEBUGTEST(lvl) false #define PDEBUGMASK 0 #define PLOGDEBUGTEST(lo,lvl) false #define PLOGDEBUGBLOCKFMT(lo,m) #define PLOGDEBUGBLOCKFMTCOLL(lo,m) #define PLOGDEBUGBLOCKDESC(lo,n,d) #define PLOGDEBUGBLOCKDESCCOLL(lo,n,d) #define PLOGDEBUGBLOCK(lo,n) #define PLOGDEBUGBLOCKCOLL(lo,n) #define PLOGDEBUGENDBLOCK(lo,n) #define PLOGDEBUGPUTSX(lo,lvl,m) #define PLOGDEBUGPUTSXX(lo,lvl,m,s,p) #define PLOGDEBUGVPRINTFX(lo,lvl,f,a) #define PLOGDEBUGPRINTFX(lo,lvl,m) #ifdef DIRECT_APPBASE_GLOBALACCESS #define PNCDEBUGPUTSX(lvl,m) #define PNCDEBUGPUTSXX(lvl,m,s,p) #define PNCDEBUGPRINTFX(lvl,m) #define PNCDEBUGVPRINTFX(lvl,f,a) #endif //#define PTHREADDEBUGPRINTFX(lvl,m) #define POBJDEBUGPRINTFX(obj,lvl,m) #define POBJDEBUGPUTSX(obj,lvl,m) #define POBJDEBUGPUTSXX(obj,lvl,m,s,p) #define POBJDEBUGPRINTF(obj,m) #define POBJDEBUGTEST(obj,lvl) false // get current logger #define GETDBGLOGGER NULL #define OBJGETDBGLOGGER(obj) NULL #endif #if SYDEBUG>1 // full debugging, including private debug info #define DEBUGPUTSX(lvl,m) PDEBUGPUTSX(lvl,m) #define DEBUGPUTSXX(lvl,m,s,p) PDEBUGPUTSXX(lvl,m,s,p) #define DEBUGPUTS(m) PDEBUGPUTS(m) #define DEBUGVPRINTFX(lvl,f,a) PDEBUGVPRINTFX(lvl,f,a) #define DEBUGPRINTFX(lvl,m) PDEBUGPRINTFX(lvl,m) #define DEBUGPRINTF(m) PDEBUGPRINTF(m) #define POINTERTEST(p,m) PPOINTERTEST(p,m) #define DEBUGTEST(lvl) PDEBUGTEST(lvl) #define DEBUGMASK PDEBUGMASK #define NCDEBUGPUTSX(lvl,m) PNCDEBUGPUTSX(lvl,m) #define NCDEBUGPUTSXX(lvl,m,s,p) PNCDEBUGPUTSXX(lvl,m,s,p) #define NCDEBUGPRINTFX(lvl,m) PNCDEBUGPRINTFX(lvl,m) #define NCDEBUGVPRINTFX(lvl,f,a) PNCDEBUGVPRINTFX(lvl,f,a) #define LOGDEBUGTEST(lo,lvl) PLOGDEBUGTEST(lo,lvl) #define LOGDEBUGBLOCKFMT(lo,m) PLOGDEBUGBLOCKFMT(lo,m) #define LOGDEBUGBLOCKFMTCOLL(lo,m) PLOGDEBUGBLOCKFMTCOLL(lo,m) #define LOGDEBUGBLOCKDESC(lo,n,d) PLOGDEBUGBLOCKDESC(lo,n,d) #define LOGDEBUGBLOCKDESCCOLL(lo,n,d) PLOGDEBUGBLOCKDESCCOLL(lo,n,d) #define LOGDEBUGBLOCK(lo,n) PLOGDEBUGBLOCK(lo,n) #define LOGDEBUGBLOCKCOLL(lo,n) PLOGDEBUGBLOCKCOLL(lo,n) #define LOGDEBUGENDBLOCK(lo,n) PLOGDEBUGENDBLOCK(lo,n) #define LOGDEBUGPUTSX(lo,lvl,m) PLOGDEBUGPUTSX(lo,lvl,m) #define LOGDEBUGPUTSXX(lo,lvl,m,s,p) PLOGDEBUGPUTSXX(lo,lvl,m,s,p) #define LOGDEBUGVPRINTFX(lo,lvl,f,a) PLOGDEBUGVPRINTFX(lo,lvl,f,a) #define LOGDEBUGPRINTFX(lo,lvl,m) PLOGDEBUGPRINTFX(lo,lvl,m) //#define THREADDEBUGPRINTFX(lvl,m) PTHREADDEBUGPRINTFX(lvl,m) #define OBJDEBUGPRINTFX(obj,lvl,m) POBJDEBUGPRINTFX(obj,lvl,m) #define OBJDEBUGPUTSX(obj,lvl,m) POBJDEBUGPUTSX(obj,lvl,m) #define OBJDEBUGPUTSXX(obj,lvl,m,s,p) POBJDEBUGPUTSXX(obj,lvl,m,s,p) #define OBJDEBUGPRINTF(obj,m) POBJDEBUGPRINTF(obj,m) #define OBJDEBUGTEST(obj,lvl) POBJDEBUGTEST(obj,lvl) #else // public or no debugging, none or only P-variants are active #define DEBUGPUTSX(lvl,m) #define DEBUGPUTSXX(lvl,m,s,p) #define DEBUGPUTS(m) #define DEBUGVPRINTFX(lvl,f,a) #define DEBUGPRINTFX(lvl,m) #define DEBUGPRINTF(m) #define POINTERTEST(p,m) #define DEBUGTEST(lvl) false #define DEBUGMASK 0 #define NCDEBUGPUTSX(lvl,m) #define NCDEBUGPUTSXX(lvl,m,s,p) #define NCDEBUGPRINTFX(lvl,m) #define NCDEBUGVPRINTFX(lvl,f,a) #define LOGDEBUGTEST(lo,lvl) false #define LOGDEBUGBLOCKFMT(lo,m) #define LOGDEBUGBLOCKFMTCOLL(lo,m) #define LOGDEBUGBLOCKDESC(lo,n,d) #define LOGDEBUGBLOCKDESCCOLL(lo,n,d) #define LOGDEBUGBLOCK(lo,n) #define LOGDEBUGBLOCKCOLL(lo,n) #define LOGDEBUGENDBLOCK(lo,n) #define LOGDEBUGPUTSX(lo,lvl,m) #define LOGDEBUGPUTSXX(lo,lvl,m,s,p) #define LOGDEBUGVPRINTFX(lo,lvl,f,a) #define LOGDEBUGPRINTFX(lo,lvl,m) //#define THREADDEBUGPRINTFX(lvl,m) #define OBJDEBUGPRINTFX(obj,lvl,m) #define OBJDEBUGPUTSX(obj,lvl,m) #define OBJDEBUGPUTSXX(obj,lvl,m,s,p) #define OBJDEBUGPRINTF(obj,m) #define OBJDEBUGTEST(obj,lvl) false #endif // debug String macro (for omitting text from non-debug code) #ifdef SHORTDEBUGTEXTS #define DEBUGSHORT(l,s) s #else #define DEBUGSHORT(l,s) l #endif // debug String macro (for omitting text from non-debug code) #ifdef SYDEBUG #define DEBUGTEXT(m,c) m #else #define DEBUGTEXT(m,c) c #endif // "enhanced" status generation in debug mode: // adds String Item to Status with description #ifdef SYDEBUG #define ADDDEBUGITEM(s,m) { if (PDEBUGTEST(DBG_HOT)) s.addItemString(m); } #else #define ADDDEBUGITEM(s,m) #endif #ifdef __cplusplus } // namespace sysync #endif #endif // SYSYNC_DEBUG_H // eof syncevolution-1.5/src/synthesis/src/sysync/sysync_globs.h0000755000373300037200000003550612424517753025550 0ustar00nightlyallusers00000000000000/* * File: sysync_globs.h * * Author: Lukas Zeller (luz@plan44.ch) * * Global definitions/macros/constants * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-xx-xx : luz : created * */ #ifndef SYSYNC_GLOBS_H #define SYSYNC_GLOBS_H #include #include "generic_types.h" // global error codes #include "syerror.h" // include sysync-independent part #include "syncml_globs.h" // include debug definitions #include "sysync_debug.h" // include global progress defs #include "global_progress.h" #ifdef __cplusplus // we need some STL basics as we define types based on STL constructs #include #include #include using namespace std; namespace sysync { #endif // local status codes (normally generated from SyncML status + LOCAL_STATUS_CODE) typedef TSyError localstatus; // configuration switches (DEFAULT_xxx are defaults for corresponding globals) // - time (in seconds) how long a session will be kept inactive before it times out #define DEFAULT_SERVERSESSIONTIMEOUT (60*5) // 5 minutes #define DEFAULT_CLIENTSESSIONTIMEOUT 20 // 20 seconds // - log file format: datastore // - client #define DEFAULT_LOG_LABELS_CLIENT "SyncEndTime\tUser\tSyncMLVers\tStatus\tSynctype\tSessionID\tRemote ID\tRemote Name\tRemote VersInfo\tDatastore\tLocAdded\tLocUpdated\tLocDeleted\tLocErrors\tRemAdded\tRemUpdated\tRemDeleted\tRemErrors\tBytesOut\tBytesIn\n\n" #define DEFAULT_LOG_FORMAT_CLIENT "%seT\t%U\t%syV\t%sS\t%tS\t%iS\t%iR\t%nR\t%vR\t%nD\t%laI\t%luI\t%ldI\t%leI\t%raI\t%ruI\t%rdI\t%reI\t%doB\t%diB\n" // - server #define DEFAULT_LOG_LABELS_SERVER "SyncEndTime\tUser\tSyncMLVers\tStatus\tSynctype\tSessionID\tRemote ID\tRemote Name\tRemote VersInfo\tDatastore\tLocAdded\tLocUpdated\tLocDeleted\tLocErrors\tRemAdded\tRemUpdated\tRemDeleted\tRemErrors\tSlowSyncMatches\tServerWon\tClientWon\tDuplicated\tBytesOut\tBytesIn\tSessionBytesOut\tSessionBytesIn\n\n" #define DEFAULT_LOG_FORMAT_SERVER "%seT\t%U\t%syV\t%sS\t%tS\t%iS\t%iR\t%nR\t%vR\t%nD\t%laI\t%luI\t%ldI\t%leI\t%raI\t%ruI\t%rdI\t%reI\t%smI\t%scI\t%ccI\t%dcI\t%doB\t%diB\t%toB\t%tiB\n" // - defines debug mask that is active by default #define DEFAULT_DEBUG DBG_NORMAL // - if 1, enables message dumps (if included) #define DEFAULT_MSGDUMP 0 // - if 1, enables XML translation of messages (independent of MSGDUMP) #define DEFAULT_XMLTRANSLATE 0 // - if 1, enables incoming message simulation (if included) #define DEFAULT_SIMMSGREAD 0 // - if true, global log file is enabled #define DEFAULT_GLOBALDEBUGLOGS false // - if true, session-spcific log files are enabled by default #define DEFAULT_SESSIONDEBUGLOGS true // - hard-wired names for debug logs #define CONFERRPREFIX "sysync_" #define CONFERRSUFFIX "_cfgerr.log" #define LOGNAMEPREFIX "sysync_" #define LOGSUFFIX ".log" #define MSGDUMPPREFIX "sysync_" #define MSGDUMPINSUFFIX "_incoming.sml" #define MSGDUMPOUTSUFFIX "_outgoing.sml" // Expiry #ifdef EXPIRES_AFTER_DATE // gcc does not like line continuations in DOS text files // scalar value representing date #define SCRAMBLED_EXPIRY_VALUE ((EXPIRY_DAY+7l) + (EXPIRY_MONTH-1)*42l + (EXPIRY_YEAR-1720l)*12l*42l) #endif // define at least the max difference above formula can have to // a real difference because of non-smooth increment with time #define MAX_EXPIRY_DIFF 15 // 42-28(Feb) = 14 #if defined(EXPIRES_AFTER_DATE) || defined(EXPIRES_AFTER_DAYS) || defined(SYSER_REGISTRATION) #define APP_CAN_EXPIRE #else #undef APP_CAN_EXPIRE #endif // Hack switches for testing with difficult clients // - if defined, strings will be encoded as SML_PCDATA_OPAQUE //#define SML_STRINGS_AS_OPAQUE 1 // - if defined, status for command will be issued after // statuses for contained SyncOp commands. //#define SYNCSTATUS_AT_SYNC_CLOSE 1 // general constants // - used by compare functions to signal compare incompatibility // (i.e. non-orderable not-equal) #define SYSYNC_NOT_COMPARABLE -999 // - maximum auth retries attempted (client) before giving up // Note: since 2.0.4.6 this includes the attitional "retry" required to request auth chal from the server #define MAX_NORMAL_AUTH_RETRIES 2 // Note: retry only once (plus once for chal request) to avoid strict servers (such as COA-S) to lock accounts #define MAX_SMART_AUTH_RETRIES 4 // when fSmartAuthRetry option is set, some additional retries happen after MAX_NORMAL_AUTH_RETRIES are exhausted // - maximum auth attempts allowed (server) before session gets aborted #define MAX_AUTH_ATTEMPTS 3 // - number of message resend retries (client) #define MAX_MESSAGE_RESENDS 3 // - number of message resend retries before trying older protocol #define SAME_PROTOCOL_RESENDS 2 // - switch on multithread support if we need it #if defined(MULTI_THREAD_DATASTORE) || defined(MULTITHREAD_PIPESERVER) #define MULTI_THREAD_SUPPORT 1 #endif // - buffer sizes #define CONFIG_READ_BUFSIZ 3048 // size of buffer for XML config reading // Max message size #ifndef DEFAULT_MAXMSGSIZE #ifndef SYSYNC_SERVER // only client #define DEFAULT_MAXMSGSIZE 20000 // 20k now for DS 1.2 (we had 10k before 3.x) #else // server (or server and client) #define DEFAULT_MAXMSGSIZE 50000 // 50k should be enough #endif #endif // Max object size #ifndef DEFAULT_MAXOBJSIZE #define DEFAULT_MAXOBJSIZE 4000000 // 4MB should be enough #endif // default identification strings #define SYSYNC_OEM "Synthesis AG" #define SYSYNC_SERVER_DEVID "SySync Server" #define SYSYNC_CLIENT_DEVID "SySync Client" #ifndef SYNCML_SERVER_DEVTYP #define SYNCML_SERVER_DEVTYP "server" // could also be "workstation" #endif #ifndef SYNCML_CLIENT_DEVTYP #define SYNCML_CLIENT_DEVTYP "workstation" // general case, could also be "handheld" or "pda"... #endif // SyncML SyncCap mask bits #define SCAP_MASK_TWOWAY 0x0002 // Support of 'two-way sync' = 1 #define SCAP_MASK_TWOWAY_SLOW 0x0004 // Support of 'slow two-way sync' = 2 #define SCAP_MASK_ONEWAY_CLIENT 0x0008 // Support of 'one-way sync from client only' = 3 #define SCAP_MASK_REFRESH_CLIENT 0x0010 // Support of 'refresh sync from client only' = 4 #define SCAP_MASK_ONEWAY_SERVER 0x0020 // Support of 'one-way sync from server only' = 5 #define SCAP_MASK_REFRESH_SERVER 0x0040 // Support of 'refresh sync from server only' = 6 #define SCAP_MASK_SERVER_ALERTED 0x0080 // Support of 'server alerted sync' = 7 // - minimum needed for conformance #define SCAP_MASK_MINIMAL (SCAP_MASK_TWOWAY | SCAP_MASK_TWOWAY_SLOW) // Support of 'server alerted sync' = 7 // - normal capabilities #define SCAP_MASK_NORMAL (SCAP_MASK_MINIMAL | SCAP_MASK_ONEWAY_CLIENT | SCAP_MASK_REFRESH_CLIENT | SCAP_MASK_ONEWAY_SERVER | SCAP_MASK_REFRESH_SERVER) // DMU / IPP locUris #define IPP_PARAMS_LOCURI_BASE "./vendor/synthesis/ipp10/" // URI used to address DMU/IPP settings/subscription #define IPP_PARAMS_LOCURI_CFG IPP_PARAMS_LOCURI_BASE "cfg" // IPP config data from server #define IPP_PARAMS_LOCURI_REQ IPP_PARAMS_LOCURI_BASE "req" // IPP request from client #define IPP_PARAMS_ITEM_METATYPE "text/plain" // meta type for IPP req and cfg PUT data items #define IPP_REQ_ACTIVATE "activate" // activate-request #define IPP_REQ_SUBSCRIBE "subscribe" // activate-request #define IPP_REQ_CHECK "check" // check-request // Remote provisioning #define SETTINGS_LOCURI_BASE "./vendor/synthesis/settings10/" // URI used to address settings #define SETTINGS_LOCURI_CFG SETTINGS_LOCURI_BASE "cfg" // settings config data from server #define SETTINGS_ITEM_METATYPE "text/plain" // meta type for settings config data // fatal errors #ifdef __PALM_OS__ #ifndef PlatFormFatalErr #define PlatFormFatalErr { ErrDisplay("PlatFormFatalErr called"); ErrThrow(999); } #endif #define PlatFormFatalThrow(x) { exception *eP=new x; ErrDisplay(eP->what()); ErrThrow(999); } #define PlatFormFatalReThrow { ErrDisplay("C++ re-throw attempted"); ErrThrow(999); } #elif defined(ANDROID) #ifndef PlatFormFatalErr #define PlatFormFatalErr { __android_log_write( ANDROID_LOG_DEBUG, "exc", "PlatFormFatalErr called"); exit(999); } #endif #define PlatFormFatalThrow(x) { exception *eP=new x; __android_log_print( ANDROID_LOG_DEBUG, "exc", "C++ exception thrown: %s",eP->what()); exit(999); } #define PlatFormFatalReThrow { __android_log_write( ANDROID_LOG_DEBUG, "exc", "C++ re-throw attempted"); exit(999); } #else #ifndef PlatFormFatalErr #define PlatFormFatalErr { printf("PlatFormFatalErr called"); exit(999); } #endif #define PlatFormFatalThrow(x) { exception *eP=new x; printf("C++ exception thrown: %s",eP->what()); exit(999); } #define PlatFormFatalReThrow { printf("C++ re-throw attempted"); exit(999); } #endif #ifdef ANDROID #define DYN_CAST static_cast #else #define DYN_CAST dynamic_cast #endif // exceptions #ifndef TARGET_HAS_EXCEPTIONS // define here depending on compiler // if not defined e.g. in target options #ifdef __EPOC_OS__ // no exceptions in EPOC #define TARGET_HAS_EXCEPTIONS 0 #elif defined(__MWERKS__) // in Coderwarrior it depends on compiler settings #if __option (exceptions) #define TARGET_HAS_EXCEPTIONS 1 #else #define TARGET_HAS_EXCEPTIONS 0 #endif #elif defined(WINCE) || defined(ANDROID) // no exceptions in eVC #define TARGET_HAS_EXCEPTIONS 0 #else // otherwise generally assume yes #define TARGET_HAS_EXCEPTIONS 1 #endif #endif #if TARGET_HAS_EXCEPTIONS // really throw #define SYSYNC_THROW(x) throw x #define SYSYNC_RETHROW throw #define SYSYNC_TRY try #define SYSYNC_CATCH(x) catch(x) { #define SYSYNC_ENDCATCH } #else // global fatal error #define SYSYNC_THROW(x) PlatFormFatalThrow(x) #define SYSYNC_RETHROW PlatFormFatalReThrow #define SYSYNC_TRY #define SYSYNC_CATCH(x) if(false) { TSmlException e("",SML_ERR_UNSPECIFIC); #define SYSYNC_ENDCATCH } #endif // checked casts (non-checked when RTTI is not there) #if defined(WINCE) || defined(__EPOC_OS__) || defined(ANDROID) // eVC + symbian has no RTTI, so we rely on having the right type and // do a static cast here #define GET_CASTED_PTR(dst,ty,src,msg) dst=static_cast(src) #else // use dynamic cast and check if pointer is not NULL #define GET_CASTED_PTR(dst,ty,src,msg) { dst = dynamic_cast(src); if (!dst) { SYSYNC_THROW(TSyncException(msg)); } } #endif // global types // library calling interface #ifndef SYSYLIBCI #define SYSYLIBCI // default to compilers default calling interface #endif // extra1 values for pev_debug #define PEV_DEBUG_FORCERETRY 1 #ifdef __cplusplus // internal field types (item field types) typedef enum { fty_string, fty_telephone, fty_integer, fty_timestamp, fty_date, fty_url, fty_multiline, fty_blob, fty_none, // note: this one is mostly internal use numFieldTypes } TItemFieldTypes; #ifdef SCRIPT_SUPPORT // built-in function definition class TItemField; class TScriptContext; typedef void (*TBuiltinFunc)(TItemField *&aTermP, TScriptContext *aFuncContextP); typedef void* (*TTableChainFunc) (void *&aNextCallerContext); typedef struct { // name of function cAppCharP fFuncName; // implementation TBuiltinFunc fFuncProc; // return type of function TItemFieldTypes fReturntype; // parameters sInt16 fNumParams; // list of parameter definition bytes const uInt8 *fParamTypes; } TBuiltInFuncDef; typedef struct { // number of functions uInt16 numFuncs; // actual functions const TBuiltInFuncDef *funcDefs; // chain function TTableChainFunc chainFunc; } TFuncTable; #endif // SCRIPT_SUPPORT // progress event class TLocalDSConfig; // forward typedef struct { TProgressEventType eventtype; TLocalDSConfig *datastoreID; // config pointer is used as ID, NULL if global sInt32 extra; // extra info, such as error code or count for progress or # of added items sInt32 extra2; // extra info, such as total for progress or # of updated items sInt32 extra3; // extra info, such as # of deleted items } TProgressEvent; // Callbacks /* %%% from old ages, probably obsolete // - XML config data reader func type typedef int SYSYLIBCI (*TXMLTextReadFunc)( appCharP aBuffer, bufferIndex aMaxSize, bufferIndex *aReadCharsP, void *aContext ); // - text message output typedef void SYSYLIBCI (*TTextMsgProc)(cAppCharP aMessage, void *aContext); */ // - progress event notification typedef bool SYSYLIBCI (*TProgressEventFunc)( const TProgressEvent &aEvent, void *aContext ); #endif // __cplusplus // local status codes (normally generated from SyncML status + LOCAL_STATUS_CODE) typedef uInt16 localstatus; // SyncML encodings // Note: SmlEncoding_t is defined in the RTK smldef.h #define numSyncMLEncodings (SML_XML-SML_UNDEF+1) // SyncML Versions typedef enum { syncml_vers_unknown, syncml_vers_1_0, syncml_vers_1_1, syncml_vers_1_2, // number of enums numSyncMLVersions } TSyncMLVersions; // conflict resolution strategies typedef enum { cr_duplicate, // add conflicting counterpart to both databases cr_newer_wins, // newer version wins (if date/version comparison is possible, like sst_duplicate otherwise) cr_server_wins, // server version wins (and is written to client, with merge if enabled) cr_client_wins, // client version wins (and is written to server, with merge if enabled) // number of enums numConflictStrategies } TConflictResolution; // package states typedef enum { psta_idle, // not started yet, no package sent or received psta_init, // initialisation package psta_sync, // sync package psta_initsync, // combined initialisation and sync package psta_map, // data update status / map psta_supplement, // extra packages possibly needed at end of session // number of enums numPackageStates } TPackageStates; /// Sync operations typedef enum { sop_wants_add, ///< like add, but is still available for slowsync match sop_add, sop_wants_replace, ///< like replace, but not yet conflict-checked sop_replace, sop_reference_only, ///< slowsync resume only: like sop_wants_add/sop_wants_replace, but ONLY for comparing with incoming add/replace from client and avoiding add when matching - NEVER send these to client sop_archive_delete, sop_soft_delete, sop_delete, sop_copy, sop_move, // new for DS 1.2 sop_none, // should be last // number of enums numSyncOperations } TSyncOperation; // Sync modes (note: slow/refresh is a separate flag) typedef enum { smo_twoway, smo_fromserver, smo_fromclient, // number of enums numSyncModes } TSyncModes; // filter identifiers #define isFilterIdent(c) (isalnum(c) || c=='_' || c=='.') #ifdef __cplusplus // forwards class TSmlCommand; // container for TSmlCommand pointers typedef std::list TSmlCommandPContainer; // contains sync commands // Free all items in container and clear it. void TSmlCommandPContainerClear(TSmlCommandPContainer &aContainer); // string to string map typedef std::map TStringToStringMap; // string to string map #endif #ifdef __cplusplus } // namespace sysync #endif #endif // SYSYNC_GLOBS_H // eof syncevolution-1.5/src/synthesis/src/sysync/sysync_precomp.h0000755000373300037200000000213512424517753026077 0ustar00nightlyallusers00000000000000/* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #ifndef SYSYNC_PRECOMP_H #define SYSYNC_PRECOMP_H /* global includes */ #include "target_options.h" /* standard C includes */ #ifdef __PALM_OS__ // don't use the *.h versions! they don't work any more with CW Palm v9 #include #include #include #include #include #else #include #include #include #include #if !defined(WINCE) && !defined(MACOSX) #include // BCPPB #endif #endif /* C++/STL includes */ /* - RTTI */ #if !defined(WINCE) && !defined(__EPOC_OS__) #include #endif #if __MC68K__ #warning "STL headers excluded from precompiled headers due to problems with CW Palm v9" #else /* - STL */ #include #include #include #include #endif #if defined(LINUX) || defined(__EPOC_OS__) // gcc in standard distrs lacks the STL header #include #else #include #endif #endif // defined SYSYNC_PRECOMP_H syncevolution-1.5/src/synthesis/src/sysync/sysync_precomp_xpt.h0000755000373300037200000000060112424517753026766 0ustar00nightlyallusers00000000000000/* Headers that might be available in precompiled form * (standard libraries, SyncML toolkit...) */ #ifndef SYSYNC_PRECOMP_XPT_H #define SYSYNC_PRECOMP_XPT_H // include what is needed anyway for sysync... #include "sysync_precomp.h" // ...plus XPT SyncML Toolkit includes // - SyncML Toolkit external API extern "C" { #include "xpt.h" } #endif // defined SYSYNC_PRECOMP_XPT_H syncevolution-1.5/src/synthesis/src/sysync/textitemtype.cpp0000755000373300037200000002630112424517753026123 0ustar00nightlyallusers00000000000000/* * File: TextItemType.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TTextItemType * base class for plain text based items (notes, emails...) * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-05-29 : luz : created from MimeDirItemType * */ // includes #include "prefix_file.h" #include "sysync.h" #include "textitemtype.h" using namespace sysync; // Config // ====== // text-based datatype config TTextTypeConfig::TTextTypeConfig(const char* aName, TConfigElement *aParentElement) : TMultiFieldTypeConfig(aName,aParentElement) { clear(); } // TTextTypeConfig::TTextTypeConfig TTextTypeConfig::~TTextTypeConfig() { // make sure everything is deleted (was missing long time and caused mem leaks!) clear(); } // TTextTypeConfig::~TTextTypeConfig // init defaults void TTextTypeConfig::clear(void) { // clear inherited inherited::clear(); } // TTextTypeConfig::clear // create Sync Item Type of appropriate type from config TSyncItemType *TTextTypeConfig::newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP) { if (!fFieldListP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TTextTypeConfig::newSyncItemType: no fFieldListP","txit1"))); return new TTextItemType( aSessionP, this, fTypeName.c_str(), fTypeVersion.c_str(), aDatastoreP, fFieldListP ); } // TTextTypeConfig::newSyncItemType #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TTextTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // For >2.1 engines, the text item does not have linemaps etc. in the datatype, but uses // profiles that can be shared among datatypes. To maintain compatibility with old config // files, we implicitly create and link a profile if we see profile definions at this // level // - first, check textItem specifics // %%% none // - then, check ancestor if (TMultiFieldTypeConfig::localStartElement(aElementName,aAttributes,aLine)) return true; // ancestor could parse the tag else { // ancestor did not know the tag, could be implicit profile if (!fProfileConfigP) { // there is no profile config yet, create an implicit one // - create an implicit profile with the same name as the datatype itself if (!fFieldListP) return fail("%s must have a 'use' tag before referencing fields"); TMultiFieldDatatypesConfig *mfdtcfgP = static_cast(getParentElement()); fProfileConfigP=new TTextProfileConfig(getName(),mfdtcfgP); if (fProfileConfigP) { fProfileConfigP->fFieldListP = fFieldListP; // assign field list mfdtcfgP->fProfiles.push_back(fProfileConfigP); // add to profiles } // - warn ReportError(false, "Warning: old-style config - '%s' directly in datatype '%s', should be moved to textprofile", aElementName, getName() ); } // now try to parse if (fProfileConfigP) { // let the profile parse as if it was inside a "textprofile" return delegateParsingTo(fProfileConfigP,aElementName,aAttributes,aLine); } else return false; // cannot parse } } // TTextTypeConfig::localStartElement // resolve void TTextTypeConfig::localResolve(bool aLastPass) { // check correct type of profile if (DYN_CAST(fProfileConfigP)==NULL) SYSYNC_THROW(TConfigParseException("missing 'use' of a 'textprofile' in datatype")); // resolve inherited inherited::localResolve(aLastPass); } // TTextTypeConfig::localResolve #endif /* * Implementation of TTextItemType */ TTextItemType::TTextItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeCfgP, // type config const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ) : TMultiFieldItemType(aSessionP,aTypeCfgP,aCTType,aVerCT,aRelatedDatastoreP,aFieldDefinitions), fProfileHandlerP(NULL) { // save typed config pointer again fTypeCfgP = static_cast(aTypeCfgP); // create the profile handler fProfileHandlerP = static_cast(aTypeCfgP)->fProfileConfigP->newProfileHandler(this); // set profile mode fProfileHandlerP->setProfileMode(fTypeCfgP->fProfileMode); } // TTextItemType::TTextItemType TTextItemType::~TTextItemType() { if (fProfileHandlerP) delete fProfileHandlerP; } // TTextItemType::~TTextItemType cAppCharP TTextItemType::getTypeVers(sInt32 aMode) { // This function is called by TMimeDirProfile when generating the // VERSION property. Allow converting a plain text item to // iCalendar 2.0 (aMode = 2) or vCalendar 1.0 (aMode = 1) by // overriding the base version that was configured for the // underlying text item type. switch (aMode) { default: return inherited::getTypeVers(aMode); case 1: return "1.0"; case 2: return "2.0"; } } // TTextItemType::getTypeVers #ifdef OBJECT_FILTERING // get field index of given filter expression identifier. sInt16 TTextItemType::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // check if explicit field level identifier if (strucmp(aIdentifier,"F.",2)==0) { // explicit field identifier, skip property lookup aIdentifier+=2; } else if (fProfileHandlerP) { // let profile search for fields by profile-defined alternative names sInt16 fid = fProfileHandlerP->getFilterIdentifierFieldIndex(aIdentifier, aIndex); if (fid!=FID_NOT_SUPPORTED) return fid; } // if no field ID found so far, look up in field list return TMultiFieldItemType::getFilterIdentifierFieldIndex(aIdentifier, aIndex); } // TTextItemType::getFilterIdentifierFieldIndex #endif // helper to create same-typed instance via base class TSyncItemType *TTextItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TTextItemType,DBG_OBJINST,"TTextItemType",TTextItemType( aSessionP, fTypeConfigP, getTypeName(), getTypeVers(), aDatastoreP, fFieldDefinitionsP )); } // TTextItemType::newCopyForSameType // create new sync item of proper type and optimization for specified target TSyncItem *TTextItemType::internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP) { // All TextItems are stored in MultiFieldItems if (!aTargetItemTypeP->isBasedOn(ity_multifield)) SYSYNC_THROW(TSyncException(DEBUGTEXT("TTextItemType::internalNewSyncItem with bad-typed target","txit3"))); TMultiFieldItemType *targetitemtypeP = static_cast (aTargetItemTypeP); return new TMultiFieldItem(this,targetitemtypeP); } // TTextItemType::internalNewSyncItem // fill in SyncML data (but leaves IDs empty) bool TTextItemType::internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ) { // check type if (!aSyncItemP->isBasedOn(ity_multifield) || !fProfileHandlerP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TTextItemType::internalFillInData: incompatible item class","txit4"))); TMultiFieldItem *itemP = static_cast (aSyncItemP); // process data if any if (aItemP->data) { // set related datastore so handler can access session specific datastore state fProfileHandlerP->setRelatedDatastore(aLocalDatastoreP); // for text items, the profile handler does all the parsing stringSize sz; cAppCharP t = smlPCDataToCharP(aItemP->data,&sz); if (!fProfileHandlerP->parseText(t,sz,*itemP)) { // format error aStatusCmd.setStatusCode(415); // Unsupported media type or format ADDDEBUGITEM(aStatusCmd,"Error parsing Text content"); return false; } } else { // no data aStatusCmd.setStatusCode(412); // incomplete command ADDDEBUGITEM(aStatusCmd,"No data found in item"); return false; } // ok, let ancestor process data as well return TMultiFieldItemType::internalFillInData(aSyncItemP,aItemP,aLocalDatastoreP,aStatusCmd); } // TTextItemType::internalFillInData // sets data and meta from SyncItem data, but leaves source & target untouched bool TTextItemType::internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ) { // check type if (!aSyncItemP->isBasedOn(ity_multifield) || !fProfileHandlerP) SYSYNC_THROW(TSyncException(DEBUGTEXT("TTextItemType::internalSetItemData: incompatible item class","txit4"))); TMultiFieldItem *itemP = static_cast (aSyncItemP); // let ancestor prepare first if (!TMultiFieldItemType::internalSetItemData(aSyncItemP,aItem,aLocalDatastoreP)) return false; // set related datastore so handler can access session specific datastore state fProfileHandlerP->setRelatedDatastore(aLocalDatastoreP); // generate data item string dataitem; fProfileHandlerP->generateText(*itemP,dataitem); // put data item into opaque/cdata PCData (note that dataitem could be BINARY string, so we need to pass size!) aItem->data=newPCDataStringX((const uInt8 *)dataitem.c_str(),true,dataitem.size()); // can't go wrong return true; } // TTextItemType::internalSetItemData // generates SyncML-Devinf property list for type SmlDevInfCTDataPropListPtr_t TTextItemType::newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor) { // no properties here return NULL; } // TTextItemType::newCTDataPropList // Filtering: add keywords and property names to filterCap void TTextItemType::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDescriptor) { #ifdef OBJECT_FILTERING // let profile add the keywords if (fProfileHandlerP) { fProfileHandlerP->addFilterCapPropsAndKeywords(aFilterKeywords, aFilterProps, aVariantDescriptor, this); } // let base class add own keywords/props inherited::addFilterCapPropsAndKeywords(aFilterKeywords, aFilterProps, aVariantDescriptor); #endif } // TTextItemType::addFilterCapPropsAndKeywords // intended for creating SyncItemTypes for remote databases from // transmitted DevInf. // SyncItemType MUST NOT take ownership of devinf structure passed // (because multiple types might be created from a single CTCap entry) bool TTextItemType::analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP) { // just let parent handle return inherited::analyzeCTCap(aCTCapP); } // TTextItemType::analyzeCTCap /// @brief copy CTCap derived info from another SyncItemType /// @return false if item not compatible /// @note required to create remote type variants from ruleMatch type alternatives bool TTextItemType::copyCTCapInfoFrom(TSyncItemType &aSourceItem) { // just let parent handle return inherited::copyCTCapInfoFrom(aSourceItem); } // TTextItemType::copyCTCapInfoFrom /* end of TTextItemType implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/textitemtype.h0000755000373300037200000001032112424517753025563 0ustar00nightlyallusers00000000000000/* * File: TextItemType.h * * Author: Lukas Zeller (luz@plan44.ch) * * TTextItemType * base class for plain text based items (notes, emails...) * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-05-29 : luz : created from MimeDirItemType * */ #ifndef TextItemType_H #define TextItemType_H // includes #include "syncitemtype.h" #include "multifielditemtype.h" #include "textprofile.h" namespace sysync { // Text based datatype class TTextTypeConfig : public TMultiFieldTypeConfig { typedef TMultiFieldTypeConfig inherited; public: TTextTypeConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TTextTypeConfig(); // properties // public functions // - create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP); protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); virtual void localResolve(bool aLastPass); #endif virtual void clear(); }; // TTextTypeConfig const uInt16 ity_text=102; // must be unique class TTextItemType: public TMultiFieldItemType { typedef TMultiFieldItemType inherited; public: // constructor TTextItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeCfgP, // type config const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ); // destructor virtual ~TTextItemType(); // access to type virtual cAppCharP getTypeVers(sInt32 aMode=0); virtual uInt16 getTypeID(void) const { return ity_text; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_text ? true : TMultiFieldItemType::isBasedOn(aItemTypeID); }; // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // MIME-DIR is an implementation // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); /// @brief copy CTCap derived info from another SyncItemType virtual bool copyCTCapInfoFrom(TSyncItemType &aSourceItem); #ifdef OBJECT_FILTERING // filtering // - get field index of given filter expression identifier. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); #endif protected: // - analyze CTCap for specific type virtual bool analyzeCTCap(SmlDevInfCTCapPtr_t aCTCapP); // - obtain property list for type, returns NULL if none available virtual SmlDevInfCTDataPropListPtr_t newCTDataPropList(TTypeVariantDescriptor aVariantDescriptor); // - Filtering: add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc); // Item data management // - create new sync item of proper type and optimization for specified target virtual TSyncItem *internalNewSyncItem(TSyncItemType *aTargetItemTypeP, TLocalEngineDS *aLocalDatastoreP); // - fill in SyncML data (but leaves IDs empty) virtual bool internalFillInData( TSyncItem *aSyncItemP, // SyncItem to be filled with data SmlItemPtr_t aItemP, // SyncML toolkit item Data to be converted into SyncItem (may be NULL if no data, in case of Delete or Map) TLocalEngineDS *aLocalDatastoreP, // local datastore TStatusCommand &aStatusCmd // status command that might be modified in case of error ); // - sets data and meta from SyncItem data, but leaves source & target untouched virtual bool internalSetItemData( TSyncItem *aSyncItemP, // the syncitem to be represented as SyncML SmlItemPtr_t aItem, // item with NULL meta and NULL data TLocalEngineDS *aLocalDatastoreP // local datastore ); private: // member fields TProfileHandler *fProfileHandlerP; TTextTypeConfig *fTypeCfgP; // the text type config element }; // TTextItemType } // namespace sysync #endif // TextItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/textprofile.cpp0000755000373300037200000016331412424517753025731 0ustar00nightlyallusers00000000000000/* * File: textprofile.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TTextProfile * utility class to parse line-by-line type text including RFC822 emails * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2005-07-26 : luz : extracted from textitemtype * */ // includes #include "prefix_file.h" #include "sysync.h" #include "textprofile.h" using namespace sysync; // Config // ====== #define X_LIMIT_HEADER_NAME "X-Sync-Message-Limit" // line map config TLineMapDefinition::TLineMapDefinition(TConfigElement *aParentElementP, sInt16 aFid) : TConfigElement("lm",aParentElementP) { // save field ID fFid=aFid; // init others clear(); } // TLineMapDefinition::TLineMapDefinition void TLineMapDefinition::clear(void) { // clear // - default: all text fNumLines=0; fInHeader=false; // not restricted to header fAllowEmpty=false; // no empty ones // - no tagged header TCFG_CLEAR(fHeaderTag); // - no RFC822 specials fValueType=vt822_plain; fListSeparator=0; fMaxRepeat=1; fRepeatInc=1; #ifdef OBJECT_FILTERING // - no filterkeyword TCFG_CLEAR(fFilterKeyword); #endif } // TLineMapDefinition::clear #ifdef CONFIGURABLE_TYPE_SUPPORT // Conversion names for RFC(2)822 parsing const char * const RFC822ValueTypeNames[num822ValueTypes] = { "text", "date", "body", "rfc2047" }; // server config element parsing bool TLineMapDefinition::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"numlines")==0) expectInt16(fNumLines); else if (strucmp(aElementName,"inheader")==0) expectBool(fInHeader); else if (strucmp(aElementName,"allowempty")==0) expectBool(fAllowEmpty); else if (strucmp(aElementName,"headertag")==0) expectString(fHeaderTag); // filtering #ifdef OBJECT_FILTERING else if (strucmp(aElementName,"filterkeyword")==0) expectString(fFilterKeyword); #endif // RFC(2)822 parsing options else if (strucmp(aElementName,"valuetype")==0) expectEnum(sizeof(fValueType),&fValueType,RFC822ValueTypeNames,num822ValueTypes); else if (strucmp(aElementName,"list")==0) { // list spec // - separator const char *attr = getAttr(aAttributes,"separator"); if (!attr) fail("list needs 'separator'"); fListSeparator=*attr; // - max repetitions fMaxRepeat=1; attr = getAttr(aAttributes,"repeat"); if (attr) { #ifdef ARRAYFIELD_SUPPORT if (strucmp(attr,"array")==0) fMaxRepeat=REP_ARRAY; else #endif if (!StrToShort(attr,fMaxRepeat)) return !fail("expected number or 'array' in 'repeat'"); } fRepeatInc=1; if (!getAttrShort(aAttributes,"increment",fRepeatInc,true)) return !fail("number expected in 'increment'"); } // - none known here else return inherited::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TLineMapDefinition::localStartElement #endif TLineMapDefinition::~TLineMapDefinition() { // nop so far } // TLineMapDefinition::~TLineMapDefinition // text-based datatype config TTextProfileConfig::TTextProfileConfig(const char *aElementName, TConfigElement *aParentElementP) : TProfileConfig(aElementName,aParentElementP) { clear(); } // TTextProfileConfig::TTextProfileConfig TTextProfileConfig::~TTextProfileConfig() { // make sure everything is deleted (was missing long time and caused mem leaks!) clear(); } // TTextProfileConfig::~TTextProfileConfig // init defaults void TTextProfileConfig::clear(void) { // clear properties // - init fFieldListP=NULL; #ifdef EMAIL_FORMAT_SUPPORT fMIMEMail=false; fBodyMIMETypesFid=VARIDX_UNDEFINED; fSizeLimitField=VARIDX_UNDEFINED; fBodyCountFid=VARIDX_UNDEFINED; #ifdef EMAIL_ATTACHMENT_SUPPORT // - no limit fMaxAttachments=29999; // enough // - fields not yet known fAttachmentCountFid=VARIDX_UNDEFINED; fAttachmentMIMETypesFid=VARIDX_UNDEFINED; fAttachmentContentsFid=VARIDX_UNDEFINED; fAttachmentSizesFid=VARIDX_UNDEFINED; fAttachmentNamesFid=VARIDX_UNDEFINED; #endif #endif // - remove line maps TLineMapList::iterator pos; for(pos=fLineMaps.begin();pos!=fLineMaps.end();pos++) delete *pos; fLineMaps.clear(); // clear inherited inherited::clear(); } // TTextProfileConfig::clear #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TTextProfileConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { /* %%% this must be enabled if we want to reference script vars #ifdef SCRIPT_SUPPORT // early resolve basic multifield scripts so we can refer to local vars if (!fScriptsResolved) %%% resolve resolvecontext; #endif */ // checking the elements if (strucmp(aElementName,"linemap")==0) { // const char* nam = getAttr(aAttributes,"field"); if (!fFieldListP) return fail("'use' must be specified before first "); // search field // %%% add context here if we have any sInt16 fid = TConfigElement::getFieldIndex(nam,fFieldListP); if (fid==VARIDX_UNDEFINED) return fail("'field' references unknown field '%s'",nam); // create new linemap TLineMapDefinition *linemapP = new TLineMapDefinition(this,fid); // - save in list fLineMaps.push_back(linemapP); // - let element handle parsing expectChildParsing(*linemapP); } #ifdef EMAIL_FORMAT_SUPPORT else if (strucmp(aElementName,"mimemail")==0) expectBool(fMIMEMail); else if (strucmp(aElementName,"sizelimitfield")==0) expectFieldID(fSizeLimitField,fFieldListP); else if (strucmp(aElementName,"bodymimetypesfield")==0) expectFieldID(fBodyMIMETypesFid,fFieldListP); else if (strucmp(aElementName,"bodycountfield")==0) expectFieldID(fBodyCountFid,fFieldListP); #ifdef EMAIL_ATTACHMENT_SUPPORT else if (strucmp(aElementName,"maxattachments")==0) expectInt16(fMaxAttachments); else if (strucmp(aElementName,"attachmentcountfield")==0) expectFieldID(fAttachmentCountFid,fFieldListP); else if (strucmp(aElementName,"attachmentmimetypesfield")==0) expectFieldID(fAttachmentMIMETypesFid,fFieldListP); else if (strucmp(aElementName,"attachmentsfield")==0) expectFieldID(fAttachmentContentsFid,fFieldListP); else if (strucmp(aElementName,"attachmentsizesfield")==0) expectFieldID(fAttachmentSizesFid,fFieldListP); else if (strucmp(aElementName,"attachmentnamesfield")==0) expectFieldID(fAttachmentNamesFid,fFieldListP); #endif #endif // - none known here else return TProfileConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TTextProfileConfig::localStartElement // resolve void TTextProfileConfig::localResolve(bool aLastPass) { // nop // resolve inherited inherited::localResolve(aLastPass); } // TTextProfileConfig::localResolve #endif #ifdef HARDCODED_TYPE_SUPPORT TLineMapDefinition *TTextProfileConfig::addLineMap( sInt16 aFid, sInt16 aNumLines, bool aAllowEmpty, bool aInHeader, const char* aHeaderTag, T822ValueType aValueType, char aListSeparator, sInt16 aMaxRepeat, sInt16 aRepeatInc ) { // create new linemap TLineMapDefinition *linemapP = new TLineMapDefinition(this,aFid); // set properties linemapP->fNumLines=aNumLines; linemapP->fAllowEmpty=aAllowEmpty; linemapP->fInHeader=aInHeader; TCFG_ASSIGN(linemapP->fHeaderTag,aHeaderTag); // save email options linemapP->fValueType=aValueType; linemapP->fListSeparator=aListSeparator; linemapP->fListSeparator=aMaxRepeat; linemapP->fListSeparator=aRepeatInc; // save in list fLineMaps.push_back(linemapP); // return pointer return linemapP; } // TTextProfileConfig::addLineMap #endif // handler factory TProfileHandler *TTextProfileConfig::newProfileHandler(TMultiFieldItemType *aItemTypeP) { // check if fieldlists match as they should if (aItemTypeP->getFieldDefinitions()!=fFieldListP) { // profile is for another field list, cannot be used for this item type return NULL; } // our handler is the text profile handler return (TProfileHandler *)(new TTextProfileHandler(this,aItemTypeP)); } /* * Implementation of TTextProfileHandler */ TTextProfileHandler::TTextProfileHandler( TTextProfileConfig *aTextProfileCfgP, TMultiFieldItemType *aItemTypeP ) : TProfileHandler(aTextProfileCfgP, aItemTypeP) { // save profile config pointer fProfileCfgP = aTextProfileCfgP; // datastore settable options defaults fNoAttachments = false; fItemSizeLimit = -1; } // TTextProfileHandler::TTextProfileHandler TTextProfileHandler::~TTextProfileHandler() { // nop for now } // TTextProfileHandler::~TTextProfileHandler #ifdef OBJECT_FILTERING // Filtering: add keywords and property names to filterCap void TTextProfileHandler::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDescriptor, TSyncItemType *aItemTypeP) { // search linemaps for fields with keyword TLineMapList::iterator pos; for(pos=fProfileCfgP->fLineMaps.begin();pos!=fProfileCfgP->fLineMaps.end();pos++) { // first priority: compare with explicit filterkeyword, if any if (!TCFG_ISEMPTY((*pos)->fFilterKeyword)) { // has a filterkeyword, show it addPCDataStringToList(TCFG_CSTR((*pos)->fFilterKeyword), &aFilterKeywords); } } } // TTextProfileHandler::addFilterCapPropsAndKeywords // get field index of given filter expression identifier. sInt16 TTextProfileHandler::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // search linemaps for tagged fields TLineMapList::iterator pos; for(pos=fProfileCfgP->fLineMaps.begin();pos!=fProfileCfgP->fLineMaps.end();pos++) { // first priority: compare with explicit filterkeyword, if any if (!TCFG_ISEMPTY((*pos)->fFilterKeyword)) { // compare with filterkeyword if (strucmp(TCFG_CSTR((*pos)->fFilterKeyword),aIdentifier)==0) return (*pos)->fFid; } else if (TCFG_SIZE((*pos)->fHeaderTag)>1) { // one tag char and a separator at least // if no filterkeyword defined, compare to header without separator if (strucmp(TCFG_CSTR((*pos)->fHeaderTag),aIdentifier,TCFG_SIZE((*pos)->fHeaderTag)-1)==0) return (*pos)->fFid; } } // no field ID found in profile return FID_NOT_SUPPORTED; } // TTextProfileHandler::getFilterIdentifierFieldIndex #endif #ifdef EMAIL_FORMAT_SUPPORT // find token in header data static cAppCharP findToken(cAppCharP aText, cAppCharP aTextEnd, char aStopChar, cAppCharP &aTokenStart, stringSize &aTokenLen) { // skip trailing whitespace cAppCharP e=aTextEnd; if (!e) e=aText+strlen(aText); while (aTexterase(); if (strucmp(tok,"attachment",toksz)==0 || strucmp(tok,"inline",toksz)==0) { while (*p==';') { p++; p=findToken(p,e,'=',tok,toksz); if (strucmp(tok,"filename",toksz)==0) { // filename, get it if (*p=='=') { p++; p=findToken(p,e,';',tok,toksz); aFileNameP->assign(tok,toksz); } } else { // other param, skip it if (*p=='=') { p++; p=findToken(p,e,';',tok,toksz); } } } } } else return false; // no MIME header // found MIME header return true; } // checkMimeHeaders // parse body into appropriate field(s) cAppCharP TTextProfileHandler::parseBody( cAppCharP aText, // body text to parse stringSize aTextSize, // max text to parse cAppCharP aType, TEncodingTypes aEncoding, uInt32 aContentLen, TCharSets aCharSet, TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP, cAppCharP aBoundary // boundary, NULL if none ) { // empty boundary is no boundary if (aBoundary && *aBoundary==0) aBoundary=NULL; POBJDEBUGPRINTFX(fItemTypeP->getSession(),DBG_PARSE,( "Parsing body (part) with Content-Type='%s', Encoding=%s, contentLen=%ld, Charset=%s, Boundary='%s'", aType, MIMEEncodingNames[aEncoding], (long)aContentLen, MIMECharSetNames[aCharSet], aBoundary ? aBoundary : "" )); // params for parts string contentType=aType; // content type string boundary; // main boundary string filename; // attachment TEncodingTypes encoding=aEncoding; // main encoding uInt32 contentlen=aContentLen; // content len in case encoding is binary TCharSets charset=aCharSet; // main charset // helpers string decoded; string converted; TItemField *fldP; // check if alternative bool alternative = strucmp(aType,"multipart/alternative")==0; bool foundBody=false; // search for first boundary occurrence if this is multipart cAppCharP toBeParsed=NULL; // pointer to previous part to be processed size_t previousSize=0; cAppCharP prevStart=NULL; cAppCharP p=aText; cAppCharP eot=p+aTextSize; bool startpart=false; // process parts do { startpart=false; // search for a boundary occurrence if this is multipart if (aBoundary) { size_t bl=strlen(aBoundary); prevStart=p; // check for special case: if we have something to parse, and encoding is binary, // use the content-length header to skip to next boundary if (toBeParsed && encoding==enc_binary) { // we simply KNOW how much to skip until next boundary starts p=toBeParsed+contentlen; // p now points to the next boundary indicator } // now detect boundary indicator do { if (p+2+bl<=eot && strucmp(p,"--",2)==0) { p+=2; if (strucmp(p,aBoundary,bl)==0) { // start of line matches boundary startpart=true; // calc how much we skipped until finding this boundary previousSize=p-2-prevStart; // A boundary has to be preceeded by a CRLF according to rfc2046, and // this CRLF belongs to the boundary and is NOT considered to be content of the preceeding part // Therefore, the following code is only needed for error tolerance reasons - for // correctly formatted message it's just a -=2. if (previousSize>2) { if (*(p-3)==0x0A || *(p-3)==0x0D) previousSize--; if (*(p-4)==0x0A || *(p-4)==0x0D) previousSize--; } // Note: in case of binary encoding, previousSize should be contentlen here! p+=bl; } } // skip until end of line while (p0) { // parse leaf part (DO NOT CHANGE p HERE, it points to next part) // decide if this is body or attachment bool isText = contentType.empty() || (strucmp(contentType.c_str(),"text/",5)==0); if (isText && filename.empty()) { // this is a part of the body // - check if we can store multiple bodies bool multibody = aItem.getField(aLineMapP->fFid)->isArray(); if (!foundBody || multibody) { sInt16 bodyIndex=VARIDX_UNDEFINED; // not found plain text body yet (or we can store multiple bodies) if (!alternative || strucmp(contentType.c_str(),"text/plain")==0) { // strictly plain text or not alternative, store it in the first body array element bodyIndex=0; // found plain text body, discard other alternatives if we have no other body variants if (alternative) foundBody=true; } else if (multibody) { // text, but not plain - and we can store alternatives, do it! bodyIndex=++fBodyAlternatives; } // if we shall store, do it now (otherwise, fldP is NULL) if (bodyIndex!=VARIDX_UNDEFINED) { // - get MIME-type field fldP = aItem.getArrayField(fProfileCfgP->fBodyMIMETypesFid,bodyIndex); if (fldP) { fldP->setAsString(contentType); // store MIME type } // - get content field fldP = aItem.getArrayField(aLineMapP->fFid,bodyIndex); if (fldP) { // - decode decoded.erase(); decoded.reserve(previousSize); // we need approx this sizee -> reserve to speed up appendDecoded( toBeParsed, previousSize, decoded, encoding ); // - convert charset converted.erase(); converted.reserve(decoded.size()); // we need approx this size -> reserve to speed up appendStringAsUTF8( decoded.c_str(), converted, charset, lem_cstr ); decoded.erase(); // we do not need this any more // add to field fldP->appendString(converted.c_str(), converted.size()); } } } } else { // this is an attachment, ignore it if we have no attachment support #ifdef EMAIL_ATTACHMENT_SUPPORT if (filename.empty()) { // create filename StringObjPrintf(filename,"attachment%hd.bin",fExtraParts); } // save filename if (fProfileCfgP->fAttachmentNamesFid!=VARIDX_UNDEFINED) { fldP=aItem.getArrayField(fProfileCfgP->fAttachmentNamesFid,fExtraParts); if (fldP) { fldP->setAsString(filename.c_str()); } } // save type if (fProfileCfgP->fAttachmentMIMETypesFid!=VARIDX_UNDEFINED) { fldP=aItem.getArrayField(fProfileCfgP->fAttachmentMIMETypesFid,fExtraParts); if (fldP) { fldP->setAsString(contentType.c_str()); } } // now decode attachment itself decoded.erase(); decoded.reserve(previousSize); // we need approx this sizee -> reserve to speed up appendDecoded( toBeParsed, previousSize, decoded, encoding ); // save attachment data if (fProfileCfgP->fAttachmentContentsFid!=VARIDX_UNDEFINED) { fldP=aItem.getArrayField(fProfileCfgP->fAttachmentContentsFid,fExtraParts); if (fldP) { fldP->setAsString(decoded.c_str(),decoded.size()); } } // save size in extra field if (fProfileCfgP->fAttachmentSizesFid!=VARIDX_UNDEFINED) { fldP=aItem.getArrayField(fProfileCfgP->fAttachmentSizesFid,fExtraParts); if (fldP) { fldP->setAsInteger(decoded.size()); } } decoded.erase(); // we do not need this any more // done, found one extra part fExtraParts++; #else // Attachment cannot be processed // - get body field fldP = aItem.getArrayField(aLineMapP->fFid,0); // - append attachment replacement message string msg; if (filename.empty()) filename=""; StringObjPrintf(msg,"\n\nAttachment not stored: %s\n\n",filename.c_str()); fldP->appendString(msg.c_str()); #endif } } // if not empty part // done toBeParsed=NULL; // if parsing single part, we're done if (!aBoundary) return p; } // check for more parts or exit if this was the closing boundary if (startpart) { // we have found a boundary above, p=space following it // part starts here bool isPart=false; // - get headers while (pfFid); // use appropriate translator string s; switch (aLineMapP->fValueType) { case vt822_timestamp: #ifdef EMAIL_FORMAT_SUPPORT // rfc822 timestamp if (!fieldP->isBasedOn(fty_timestamp)) break; s.assign(aValue,aValSize); if (!(static_cast(fieldP)->setAsRFC822date(s.c_str(),aItem.getSession()->fUserTimeContext,false))) fieldP->assignEmpty(); break; #endif case vt822_body: #ifdef EMAIL_FORMAT_SUPPORT // falls through to plain if email support is switched off if (fProfileCfgP->fMIMEMail) { // clear body text field fieldP->assignEmpty(); fExtraParts=0; fBodyAlternatives=0; // now parse body (we should already have parsed the content headers parseBody( aValue, // body text to parse aValSize, fContentType.c_str(),fEncoding,fContentLen,fCharSet, aItem, aLineMapP, fBoundary.c_str() // boundary, NULL or empty if none ); // save number of bodies if (fProfileCfgP->fBodyCountFid!=VARIDX_UNDEFINED) { TItemField *fldP=aItem.getField(fProfileCfgP->fBodyCountFid); if (fldP) { fldP->setAsInteger(fBodyAlternatives+1); } } // save number of attachments #ifdef EMAIL_ATTACHMENT_SUPPORT if (fProfileCfgP->fAttachmentCountFid!=VARIDX_UNDEFINED) { TItemField *fldP=aItem.getField(fProfileCfgP->fAttachmentCountFid); if (fldP) { fldP->setAsInteger(fExtraParts); } } #endif break; } #endif goto standardfield; case vt822_rfc2047: #ifdef EMAIL_FORMAT_SUPPORT // text field encoded according to RFC2047 s.erase(); appendRFC2047AsUTF8(aValue,aValSize,s); fieldP->setAsString(s.c_str()); break; #else goto standardfield; #endif standardfield: case vt822_plain: // plain text default: // assign as string fieldP->setAsString(aValue,aValSize); break; } return true; } // TTextProfileHandler::parseContent #ifdef EMAIL_FORMAT_SUPPORT // add a MIME-Boundary static void addBoundary(string &aString, sInt16 aLevel, bool aForHeader=false) { if (!aForHeader) aString+="\x0D\x0A--"; StringObjAppendPrintf(aString,"--==========_=_nextpart_%03hd_42503735617.XE======",aLevel); if (!aForHeader) aString+="\x0D\x0A"; } // TTextProfileHandler::addBoundary // add a body content-type header static void addBodyTypeHeader(sInt16 aBodyTypeFid, sInt16 aBodyIndex, TMultiFieldItem &aItem, string &aString) { string bodytype; TItemField *fldP = aItem.getArrayField(aBodyTypeFid,aBodyIndex,true); if (fldP && !fldP->isEmpty()) fldP->getAsString(bodytype); else bodytype="text/plain"; aString+="Content-Type: "; aString+=bodytype; aString+="; charset=\"UTF-8\"\x0D\x0A"; } // addBodyTypeHeader // generate body (multipart/alternative if there is more than one) // if aLevel==0, content type was already set before bool TTextProfileHandler::generateBody(sInt16 aLevel, TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP, string &aString) { // check if we need to add headers if (aLevel>0) { #ifdef EMAIL_ATTACHMENT_SUPPORT if (fBodyAlternatives>0) { // multiple bodies, nested multipart aString+="Content-Type: multipart/alternative;\x0D\x0A boundary=\""; addBoundary(aString,aLevel,true); // nested boundary aString+="\"\x0D\x0A"; } else #endif { // single body, add body type addBodyTypeHeader(fProfileCfgP->fBodyMIMETypesFid, 0, aItem, aString); // - end part header aString+="\x0D\x0A"; } } // now add body/bodies // - get size limit for this item sInt16 bodyindex=0; do { #ifdef EMAIL_ATTACHMENT_SUPPORT if (fBodyAlternatives>0 && fItemSizeLimit!=0) { // - opening boundary addBoundary(aString,aLevel); // nested // - content type addBodyTypeHeader(fProfileCfgP->fBodyMIMETypesFid, bodyindex, aItem, aString); // - end part header aString+="\x0D\x0A"; } #endif // get body field TItemField *fieldP = aItem.getArrayField(aLineMapP->fFid,bodyindex); if (!fieldP) break; // should not happen // now generate body contents if (fItemSizeLimit==0) { // limited to nothing, just don't send anything fLimited=true; break; } else if (fieldP->isBasedOn(fty_string)) { TStringField *sfP = static_cast(fieldP); if (fItemSizeLimit>0) { // limited string field // - check if we can add more if (fItemSizeLimit<=fGeneratedBytes) { // already exhausted, suppress body completely fLimited=true; break; } // add limited number of body bytes // - determine number of bytes to send #ifdef STREAMFIELD_SUPPORT sInt32 bodysize=sfP->getStreamSize(); if (bodysize+fGeneratedBytes > fItemSizeLimit) { bodysize=fItemSizeLimit-fGeneratedBytes; fLimited=true; } // - get appropriate number of bytes char *bodyP = new char[bodysize+1]; sfP->resetStream(); bodysize = sfP->readStream(bodyP,bodysize); bodyP[bodysize]=0; // - append to content string aString.reserve(aString.size()+bodysize); // reserve what we need approximately appendUTF8ToString( bodyP, aString, chs_utf8, // always UTF8 for body lem_dos // CRLFs for email ); // approximately, UTF-8 conversion and CRLF might cause slightly more chars fGeneratedBytes+=bodysize; // - get rid of buffer delete [] bodyP; #else // simply get it fieldP->appendToString(aString,fItemSizeLimit); fGeneratedBytes+=fieldP->getStringSize(); #endif } else { // no limit, simply append to content string appendUTF8ToString( sfP->getCStr(), aString, chs_utf8, // always UTF8 for body lem_dos // CRLFs for email ); // approximately, UTF-8 conversion and CRLF might cause slightly more chars fGeneratedBytes+=sfP->getStringSize(); } } else { // no string field, just append string representation fieldP->appendToString(aString); fGeneratedBytes+=fieldP->getStringSize(); } // done one body bodyindex++; // repeat until all done } while (bodyindex<=fBodyAlternatives && (fItemSizeLimit<0 || fGeneratedBytes0 && fItemSizeLimit!=0) { // - closing boundary for last part addBoundary(aString,aLevel); // nested } #endif return true; } // TTextProfileHandler::generateBody #endif // generate contents of a header or body // returns true if tagging and folding is needed on output, // false if output can simply be appended to text (such as: no output at all) bool TTextProfileHandler::generateContent(TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP, string &aString) { aString.erase(); // nothing by default bool needsfolding=true; string s; // %%% missing repeats TItemField *fieldP=aItem.getField(aLineMapP->fFid); if (!fieldP) return false; // no field contents, do not even show the tag switch (aLineMapP->fValueType) { case vt822_body: // body with size restriction #ifdef EMAIL_FORMAT_SUPPORT #ifdef EMAIL_ATTACHMENT_SUPPORT // - multipart is supported if (fExtraParts>0) { // add body as first part // - opening boundary addBoundary(aString,0); // - add body on level 1 (means that it must add its own headers) generateBody(1,aItem,aLineMapP,aString); // - add attachments sInt16 attIdx; TItemField *fldP; for (attIdx=0; attIdxfAttachmentSizesFid!=VARIDX_UNDEFINED) { fldP=aItem.getArrayField(fProfileCfgP->fAttachmentSizesFid,attIdx,true); if (!fldP) continue; // get it from separate field attachsize=fldP->getAsInteger(); } else { // get it from attachment itself (will probably pull proxy) fldP=aItem.getArrayField(fProfileCfgP->fAttachmentContentsFid,attIdx,true); if (!fldP) continue; attachsize=fldP->getStringSize(); } // - check if we have data for the attachment if (attachsize==0) continue; // Prepare attachment TItemField *attfldP = NULL; // none yet string attachMsg; attachMsg.erase(); // no message // - get content type bool isText=false; fldP = aItem.getArrayField(fProfileCfgP->fAttachmentMIMETypesFid,attIdx,true); string contenttype; if (fldP && !fldP->isEmpty()) { fldP->getAsString(contenttype); } else { contenttype="application/octet-stream"; } // - check for text/xxxx contents if (strucmp(contenttype.c_str(),"text/",5)==0) isText=true; // - check if attachment has enough room if ( (fItemSizeLimit>=0 && fGeneratedBytes+attachsize>fItemSizeLimit) || // limit specified by client !fItemTypeP->getSession()->dataSizeTransferable(fGeneratedBytes+attachsize*(isText ? 3 : 4)/3) // physical limit as set by maxMsgSize in SyncML 1.0 and maxObjSize in SyncML 1.1 ) { // no room for attachment, include a text message instead fldP = aItem.getArrayField(fProfileCfgP->fAttachmentNamesFid,attIdx,true); string attnam; if (fldP) fldP->getAsString(attnam); else attnam="unnamed"; StringObjPrintf(attachMsg, "\x0D\x0A" "Attachment suppressed: '%s' (%ld KBytes)\x0D\x0A", attnam.empty() ? "" : attnam.c_str(), long(attachsize/1024) ); // set type contenttype="text/plain"; isText=true; // force in-line // signal incomplete message // NOTE: other attachments that are smaller may still be included fLimited=true; } else { // we can send the attachment attfldP = aItem.getArrayField(fProfileCfgP->fAttachmentContentsFid,attIdx,true); if (!attfldP) continue; // cannot generate this attachment } // - opening boundary for attachment addBoundary(aString,0); // - add disposition aString+="Content-Disposition: "; if (isText) { // text is always in-line aString+="inline"; } else { // non-text is attachment if it has a filename fldP = aItem.getArrayField(fProfileCfgP->fAttachmentNamesFid,attIdx,true); if (fldP && !fldP->isEmpty()) { // has a filename, make attachment aString+="attachment; filename=\""; fldP->appendToString(aString); aString+="\""; } else { // has no filename, show inline aString+="inline"; } } aString+="\x0D\x0A"; // - start content type (but no charset yet) aString+="Content-Type: "; aString+=contenttype; // - check attachment mode if (attfldP && attfldP->isBasedOn(fty_blob)) { // Attachment is a BLOB, so it may contain binary data TBlobField *blobP = static_cast(attfldP); // make sure charset/encoding are valid blobP->makeContentsValid(); // - get charset from the BLOB if (blobP->fCharset!=chs_unknown) { aString+="; charset=\""; aString+=MIMECharSetNames[blobP->fCharset]; aString+='"'; } aString+="\x0D\x0A"; // - if known, use originally requested encoding TEncodingTypes enc = blobP->fWantsEncoding; TEncodingTypes hasenc = blobP->fHasEncoding; // - make sure we use a valid encoding that is ok for sending as text if (enc==enc_b || enc==enc_none || enc==enc_binary) { enc = isText ? enc_8bit : enc_base64; } // - see if we should transmit the existing encoding if (isText) { if (hasenc==enc_7bit && hasenc==enc_8bit && hasenc==enc_quoted_printable) enc=hasenc; // already encoded } else { if (hasenc==enc_base64 || hasenc==enc_b) enc=hasenc; // already encoded } // when we are in Synthesis-special mode, and encoding is WBXML, we can use plain binary encoding // (specifying the length with a Content-Length: header) if (fItemTypeP->getTypeConfig()->fBinaryParts && fItemTypeP->getSession()->getEncoding()==SML_WBXML && (enc==enc_b || enc==enc_base64)) { // switch to 1:1 binary enc=enc_binary; StringObjAppendPrintf(aString,"Content-Length: %ld\x0D\x0A", long(blobP->getStringSize())); } // - set transfer encoding from the BLOB aString+="Content-Transfer-Encoding: "; aString+=MIMEEncodingNames[enc]; aString+="\x0D\x0A"; // - end of part headers aString+="\x0D\x0A"; // - now add contents as-is (this pulls the proxy now) appendEncoded( (const uInt8 *)blobP->getCStr(), // input blobP->getStringSize(), aString, // append output here enc==hasenc ? enc_none : enc, // desired encoding if not already encoded MIME_MAXLINESIZE, // limit to standard MIME-linesize 0, // current line size false // insert CRLFs for line breaks ); } else { // Attachment isn't a BLOB, but a string. Transmit as 8bit, UTF-8 aString+="; charset=\""; aString+=MIMECharSetNames[chs_utf8]; aString+="\"\x0D\x0A"; // - content encoding is 8bit aString+="Content-Transfer-Encoding: "; aString+=MIMEEncodingNames[enc_8bit]; aString+="\x0D\x0A"; // - end of part headers aString+="\x0D\x0A"; // - simply append string if (attfldP) { attfldP->getAsString(s); appendUTF8ToString( s.c_str(), aString, chs_utf8, // always UTF8 for body lem_dos // CRLFs for email ); } else { // append attachment suppression message aString+=attachMsg; // no attachment field, append replacement text instead } } // count added bytes fGeneratedBytes+=(aString.size()-sizebefore); } // for all attachments // - closing boundary addBoundary(aString,0); } else #endif { // message consists only of a body (which might have alternatives) // - add body on level 0 (means that it must not have own headers) generateBody(0,aItem,aLineMapP,aString); } // Body does not need any folding needsfolding=false; break; #else // no EMAIL FORMAT support goto standardfield; #endif case vt822_rfc2047: // text field encoded according to RFC2047 #ifdef EMAIL_FORMAT_SUPPORT if (fieldP->isUnassigned()) return false; // field not assigned, do not even show the tag fieldP->getAsString(s); appendUTF8AsRFC2047(s.c_str(),aString); break; #else goto standardfield; #endif case vt822_timestamp: if (fieldP->isUnassigned()) return false; // field not assigned, do not even show the tag #ifdef EMAIL_FORMAT_SUPPORT if (!fieldP->isBasedOn(fty_timestamp)) break; static_cast(fieldP)->getAsRFC822date(aString,aItem.getSession()->fUserTimeContext,true); break; #endif #ifndef EMAIL_FORMAT_SUPPORT standardfield: #endif case vt822_plain: // plain text if (fieldP->isUnassigned()) return false; // field not assigned, do not even show the tag fieldP->getAsString(aString); break; case num822ValueTypes: // not handled? break; } return needsfolding; } // TTextProfileHandler::generateContent // generate Data item (includes header and footer) void TTextProfileHandler::generateText(TMultiFieldItem &aItem, string &aString) { TLineMapList::iterator pos; // reset byte counter fGeneratedBytes=0; fLimited=false; #ifdef EMAIL_ATTACHMENT_SUPPORT fExtraParts=0; #endif #ifdef EMAIL_FORMAT_SUPPORT fBodyAlternatives=0; bool multipart=false; #endif #ifdef SYDEBUG POBJDEBUGPRINTFX(fItemTypeP->getSession(),DBG_GEN+DBG_HOT,("Generating....")); aItem.debugShowItem(DBG_DATA+DBG_GEN); #endif // init attachment limit // - get from datastore if one is related if (fRelatedDatastoreP) { fItemSizeLimit = fRelatedDatastoreP->getItemSizeLimit(); fNoAttachments = fRelatedDatastoreP->getNoAttachments(); } // - if size limit is zero or attachments explicitly disabled, // attachments are not allowed for this item #ifdef EMAIL_ATTACHMENT_SUPPORT if (fItemSizeLimit==0 || fNoAttachments) fAttachmentLimit=0; // no attachments else fAttachmentLimit=fProfileCfgP->fMaxAttachments; // use limit from datatype config #endif // generate according to linemaps bool header = (*fProfileCfgP->fLineMaps.begin())->fInHeader; // we are in header if first is in header for (pos=fProfileCfgP->fLineMaps.begin();pos!=fProfileCfgP->fLineMaps.end();pos++) { // get linemap config TLineMapDefinition *linemapP = *pos; // separate body if (header && !linemapP->fInHeader) { // add special email headers #ifdef EMAIL_FORMAT_SUPPORT if (fProfileCfgP->fMIMEMail) { // basic support TItemField *cntFldP; #ifdef EMAIL_ATTACHMENT_SUPPORT // attachments allowed, get number cntFldP = aItem.getField(fProfileCfgP->fAttachmentCountFid); if (cntFldP && !cntFldP->isEmpty()) { // we have a count field, get it's value fExtraParts=cntFldP->getAsInteger(); } else { // determine exta part number by counting attachments if (fProfileCfgP->fAttachmentContentsFid) { fExtraParts=aItem.getField(fProfileCfgP->fAttachmentContentsFid)->arraySize(); } } // limit to what is allowed if (fExtraParts > fProfileCfgP->fMaxAttachments) fExtraParts=fProfileCfgP->fMaxAttachments; if (fExtraParts > fAttachmentLimit) { fExtraParts=fAttachmentLimit; fLimited=true; } // check if we have body alternatives cntFldP = aItem.getField(fProfileCfgP->fBodyCountFid); if (cntFldP && !cntFldP->isEmpty()) { // we have a count field, get it's value fBodyAlternatives=cntFldP->getAsInteger()-1; } else { fBodyAlternatives = aItem.getField(linemapP->fFid)->arraySize()-1; } if (fBodyAlternatives<0) fBodyAlternatives=0; // now add multipart content header if we have extra parts to send if (fExtraParts>0) { // we have attachments, this will be a multipart/mixed aString+="Content-Type: multipart/mixed;\x0D\x0A boundary=\""; addBoundary(aString,0,true); aString+="\"\x0D\x0A"; multipart=true; } else if (fBodyAlternatives) { // no attachments, but multiple bodies aString+="Content-Type: multipart/alternative;\x0D\x0A boundary=\""; addBoundary(aString,0,true); aString+="\"\x0D\x0A"; multipart=true; } else { // no attachments and no body alternatives, single body // - set type header for first and only part addBodyTypeHeader(fProfileCfgP->fBodyMIMETypesFid, 0,aItem,aString); } #else // only single body supported, always UTF-8 addBodyTypeHeader(fProfileCfgP->fBodyMIMETypesFid, 0,aItem,aString); #endif // now add encoding header, always 8-bit aString+="Content-Transfer-Encoding: 8BIT\x0D\x0A"; } else { // no mail format, end headers here aString.append("\x0D\x0A"); // extra empty line } #else // end headers aString.append("\x0D\x0A"); // extra empty line #endif } // generate value string fval; bool tagandfold=generateContent(aItem,linemapP,fval); // prevent empty ones if selected if (fval.empty() && !linemapP->fAllowEmpty) continue; // prefix with tag if any bool tagged=!TCFG_ISEMPTY(linemapP->fHeaderTag); // add field contents now // generate contents from field if (!tagandfold) { // no folding necessary #ifdef EMAIL_FORMAT_SUPPORT // - add updated limit header here if message is really limited if (fProfileCfgP->fMIMEMail) { if (fProfileCfgP->fSizeLimitField!=VARIDX_UNDEFINED) { TItemField *fldP = aItem.getField(fProfileCfgP->fSizeLimitField); fieldinteger_t limit = fItemSizeLimit; // now update its value if (!fLimited) limit=-1; fldP->setAsInteger(limit); // limited to specified size // now add the updated limit header (we have no linemap for it) aString+=X_LIMIT_HEADER_NAME ": "; fldP->appendToString(aString); aString+="\x0D\x0A"; // end of header } // terminate header not before here if (header && !linemapP->fInHeader) { // end headers aString.append("\x0D\x0A"); // extra empty line } } #endif // - fVal includes everything needed INCLUDING tag AND CRLF at end // or fVal is empty meaning that the value does not need to be added at all aString.append(fval); } else { // add tag if tagged line if (tagged) { aString.append(linemapP->fHeaderTag); aString+=' '; // this extra space is common usage in RFC822 mails } // add with folding const char *p = fval.c_str(); sInt16 n=(*pos)->fNumLines; sInt16 i=0; sInt16 cnt=0; // char counter sInt16 lastLWSP=-1; // no linear whitespace found yet char c; // add multi-line field contents while ((c=*p++)) { if (c=='\r') continue; // ignore CRs if (tagged) { // apply RFC822 folding (65 recommened for old terminals, 72 max) if (cnt>=65) { // check where we can fold if (lastLWSP>=0) { // this is the last LWSP // - new size of line is string beginning with lastLWSP up to end of string cnt=aString.size()-lastLWSP; // - insert a CRLF before the last LWSP aString.insert(lastLWSP,"\x0D\x0A"); // - this one is now invalid lastLWSP=-1; // invalidate again } } if (isspace(c)) { // remember possible position for folding lastLWSP=aString.size(); // index of this LWSP } } if (c=='\n') { // line break in data if (tagged) { // for tagged fields, line break in data is used as recommended folding // position, so just fold NOW aString.append("\x0D\x0A "); lastLWSP=-1; cnt=1; // the space is already here } else { // for non-tagged fields, we might cut writing data here if no more lines allowed // - check if more lines allowed if (igetSession(),DBG_GEN,("Generated:")); if (fItemTypeP->getDbgMask() & DBG_GEN) { // note, do not use debugprintf because string is too long POBJDEBUGPUTSXX(fItemTypeP->getSession(),DBG_GEN+DBG_USERDATA,aString.c_str(),0,true); } #endif } // TTextProfileHandler::generateText // parse Data item (includes header and footer) bool TTextProfileHandler::parseText(const char *aText, stringSize aTextSize, TMultiFieldItem &aItem) { TLineMapList::iterator pos; // get options from datastore if one is related if (fRelatedDatastoreP) { fItemSizeLimit = fRelatedDatastoreP->getItemSizeLimit(); fNoAttachments = fRelatedDatastoreP->getNoAttachments(); } // parse according to linemaps pos=fProfileCfgP->fLineMaps.begin(); if (pos==fProfileCfgP->fLineMaps.end()) return true; // simply return, no mappings defined // - we are in header if first is in header bool header=(*pos)->fInHeader; #ifdef EMAIL_FORMAT_SUPPORT fContentType.erase(); // no known type fBoundary.erase(); // no boundary yet fEncoding=enc_8bit; // 8 bit fContentLen=0; // not defined until we have Synthesis-style binary encoding in parts fCharSet=chs_utf8; // UFT-8 is SyncML default fContentType.erase(); // no main content type #endif // - header has tagged fields if first has a tag bool tagged=!TCFG_ISEMPTY((*pos)->fHeaderTag); const char *p = aText; const char *eot = aText+aTextSize; // if we are starting in body, simulate a preceeding EOLN bool lastwaseoln=!header; while (pos!=fProfileCfgP->fLineMaps.end()) { // check special case of this linemap eating all of the remaining body text if (!header && (*pos)->fNumLines==0) { // Optimization: this linemap will receive the entire remainder of the message parseContent(p, eot-p, aItem, *pos); // and we are done goto parsed; } // scan input data string fval; fval.erase(); char c=0; sInt16 i=0,n=0; bool assignnow=false; bool fielddone=false; while (p<=eot) { // get char, simulate a NUL if we are at end of text c = (p==eot) ? 0 : *p; p++; // make sure we're over eot now // convert all types of line ends: 0A, 0D0A and 0D are allowed // special 0D0D0A that sometimes happens (CRLF saved through a DOS // linefeed expander) is also detected correctly if (c==0x0D) { // CR, discard LF if one follows if (p=eot || c==0 || (*p!=' ' && *p!='\t')) { // end of text or next line does not begin with space or TAB -> end of header #ifdef EMAIL_FORMAT_SUPPORT if (fProfileCfgP->fMIMEMail) { // check for MIME-content relevant mail headers first if (!checkMimeHeaders(fval.c_str(),fval.size(),fContentType,fEncoding,fContentLen,fCharSet,fBoundary,NULL)) { // check for X-Sync-Limit special header const char *h = fval.c_str(); const char *e = h+fval.size(); const char *tok; stringSize toksz; h=findToken(h,e,':',tok,toksz); if (*h==':') { // header field ++h; // check name if (strucmp(tok,X_LIMIT_HEADER_NAME,toksz)==0) { // X-Sync-Limit special header h=findToken(h,e,':',tok,toksz); TItemField *limfldP = aItem.getField(fProfileCfgP->fSizeLimitField); if (limfldP) limfldP->setAsString(tok,toksz); } } } } // note that mime headers can still be mapped to fields, so fall through #endif // - search by tag for matching linemap now TLineMapList::iterator tagpos; for (tagpos=fProfileCfgP->fLineMaps.begin();tagpos!=fProfileCfgP->fLineMaps.end();tagpos++) { TCFG_STRING &s = (*tagpos)->fHeaderTag; if ((*tagpos)->fInHeader && !TCFG_ISEMPTY(s)) { if (strucmp(fval.c_str(),TCFG_CSTR(s),TCFG_SIZE(s))==0) { // tag matches, set position to matching linemap pos=tagpos; // remove tag from input data fval.erase(0,TCFG_SIZE(s)); // remove leading spaces size_t j=0; while (fval.size()>j && isspace(fval[j])) j++; if (j>0) fval.erase(0,j); // assign value now assignnow=true; break; // break for loop } } } // search for correct map // assignnow is set if we have found a map now, otherwise, header will be ignored fielddone=true; // cause loop exit, but first check for transition from header to body and set lastwaseoln } else { // process possible folding if (p ignore line end and just keep LWSP fval+=*p++; // keep the LWSP lastwaseoln=false; // last was LWSP, not EOLN :-) continue; // just check next one } } } // - check for switch from header to body if (header && lastwaseoln) { // two line ends in succession = end of header header=false; if (tagged) { // find first non-header linemap (pos can be anywhere within header linemaps here while (pos!=fProfileCfgP->fLineMaps.end() && (*pos)->fInHeader) pos++; // but no need to store, as tagged headers have stored already } else { // end of untagged headers // assign what is already accumulated assignnow=true; } tagged=false; // just stop here if no more linemaps if (pos==fProfileCfgP->fLineMaps.end()) { goto parsed; // do not spend time and memory with parsing unneeded data } // important optimization: if the last linemap does not have a line // count restriction, process rest of text without filling it into a string var if ((*pos)->fNumLines==0) { // this linemap will receive the entire remainder of the message parseContent(p, eot-p, aItem, *pos); // and we are done goto parsed; } break; } lastwaseoln=true; // end of input line if (!tagged) { i++; // count line n=(*pos)->fNumLines; if ((i>=n && n!=0) || c==0) { // line count exhausted or end of input text, assign to field now assignnow=true; // assign fval to field now break; } else if (c) fval+='\n'; // multi-line field, eoln if not eostring } } // if end of input line else { // not end of input line lastwaseoln=false; // add to value fval+=c; } if (!c || fielddone) break; } // assign accumulated value if (assignnow) { // assign according to linemap parseContent(fval.c_str(), fval.size(), aItem, *pos); // advance to next map if not in tagged header mode if (!tagged) pos++; } // all parsed, rest of definitions is not relevant, p is invalid if (c==0) break; } // while parsed: #ifdef SYDEBUG POBJDEBUGPRINTFX(fItemTypeP->getSession(),DBG_PARSE,("Successfully parsed: ")); if (fItemTypeP->getDbgMask() & DBG_PARSE) { // very detailed POBJDEBUGPUTSXX(fItemTypeP->getSession(),DBG_PARSE+DBG_USERDATA+DBG_EXOTIC,aText,0,true); } aItem.debugShowItem(DBG_DATA+DBG_PARSE); #endif return true; } // TTextProfileHandler::parseData /* end of TTextProfileHandler implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/textprofile.h0000755000373300037200000001460612424517753025375 0ustar00nightlyallusers00000000000000/* * File: textprofile.h * * Author: Lukas Zeller (luz@plan44.ch) * * TTextProfile * utility class to parse line-by-line type text including RFC822 emails * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2005-07-26 : luz : extracted from textitemtype * */ #ifndef TextProfile_H #define TextProfile_H // includes #include "syncitemtype.h" #include "multifielditemtype.h" namespace sysync { typedef enum { vt822_plain, // no conversion at all vt822_timestamp, // RFC2822 timestamp value vt822_body, // email body vt822_rfc2047, // text with RFC2047 MIME message header extensions num822ValueTypes } T822ValueType; // line map definition class TLineMapDefinition : public TConfigElement { typedef TConfigElement inherited; public: // constructor/destructor TLineMapDefinition(TConfigElement *aParentElementP, sInt16 aFid); virtual ~TLineMapDefinition(); // properties // - number of lines (0=all) sInt16 fNumLines; // - allow empty bool fAllowEmpty; // - only header lines bool fInHeader; // - tagged header TCFG_STRING fHeaderTag; // must include the separator char (for RFC822 emails, a colon) // - field id to put text into sInt16 fFid; // RFC2822 parsing properties // - type of value T822ValueType fValueType; // - list separator (0=no list) char fListSeparator; // - max number of repeats (items in list), REP_ARRAY=unlimited, for array fields sInt16 fMaxRepeat; sInt16 fRepeatInc; #ifdef OBJECT_FILTERING // - no filterkeyword TCFG_STRING fFilterKeyword; #endif #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void clear(); }; // TLineMapDefinition // line mapping definitions typedef std::list TLineMapList; // Text based datatype class TTextProfileConfig : public TProfileConfig { typedef TProfileConfig inherited; public: TTextProfileConfig(const char *aElementName, TConfigElement *aParentElementP); virtual ~TTextProfileConfig(); // handler factory virtual TProfileHandler *newProfileHandler(TMultiFieldItemType *aItemTypeP); // properties // - Note, field list is parsed here, but is a property of TMultiFieldTypeConfig // - text-line based field definitions TLineMapList fLineMaps; #ifdef EMAIL_FORMAT_SUPPORT // email-specific properties // - if set, MIME mail extra feature according to RFC 2822/2045/2046 will be used bool fMIMEMail; // - field containing body type(s) (for body alternatives, if undefined defaults to text/plain) sInt16 fBodyMIMETypesFid; // - field that contains body count sInt16 fBodyCountFid; // - overall body size limit field sInt16 fSizeLimitField; #ifdef EMAIL_ATTACHMENT_SUPPORT // - max number of attachments (for non-arrays) sInt16 fMaxAttachments; // - field that contains attachment count sInt16 fAttachmentCountFid; // - field base offsets (or array field ID) for attachment components // - attachment MIME types sInt16 fAttachmentMIMETypesFid; // - attachment contents sInt16 fAttachmentContentsFid; // - attachment sizes (in bytes) sInt16 fAttachmentSizesFid; // - attachment (file)names sInt16 fAttachmentNamesFid; #endif #endif // public functions #ifdef HARDCODED_TYPE_SUPPORT TLineMapDefinition *addLineMap( sInt16 aFid, sInt16 aNumLines, bool aAllowEmpty, bool aInHeader=false, const char* aHeaderTag=NULL, T822ValueType aValueType=vt822_plain, char aListSeparator=0, sInt16 aMaxRepeat=1, sInt16 aRepeatInc=1 ); #endif protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements public: virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); protected: virtual void localResolve(bool aLastPass); #endif virtual void clear(); }; // TTextProfileConfig class TTextProfileHandler : public TProfileHandler { typedef TProfileHandler inherited; public: // constructor TTextProfileHandler( TTextProfileConfig *aTextProfileCfgP, TMultiFieldItemType *aItemTypeP ); // destructor virtual ~TTextProfileHandler(); #ifdef OBJECT_FILTERING // filtering // - get field index of given filter expression identifier. virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); // - add keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc, TSyncItemType *aItemTypeP); #endif // generate Text Data (includes header and footer) virtual void generateText(TMultiFieldItem &aItem, string &aString); // parse Data item (includes header and footer) virtual bool parseText(const char *aText, stringSize aTextSize, TMultiFieldItem &aItem); private: // Internal routines #ifdef EMAIL_FORMAT_SUPPORT bool generateBody(sInt16 aLevel, TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP, string &aString); cAppCharP parseBody( cAppCharP aText, // body text to parse stringSize aTextSize, // max text to parse cAppCharP aType, TEncodingTypes aEncoding, uInt32 aContentLen, TCharSets aCharSet, TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP, cAppCharP aBoundary // boundary, NULL if none ); #endif bool generateContent(TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP, string &aString); bool parseContent(const char *aValue, stringSize aValSize, TMultiFieldItem &aItem, TLineMapDefinition *aLineMapP); // vars TTextProfileConfig *fProfileCfgP; // the text profile config element fieldinteger_t fGeneratedBytes; // number of bytes already generated (for limit checks) bool fLimited; // set if size was actually limited // externally set options bool fNoAttachments; fieldinteger_t fItemSizeLimit; #ifdef EMAIL_FORMAT_SUPPORT sInt16 fExtraParts; // number of extra parts in addition to body sInt16 fBodyAlternatives; // number of body alternatives string fContentType; // main content type uInt32 fContentLen; // content len for Synthesis-style binary parts string fBoundary; // main boundary TEncodingTypes fEncoding; // main encoding TCharSets fCharSet; // main charset #ifdef EMAIL_ATTACHMENT_SUPPORT sInt16 fAttachmentLimit; // limit for attachments in this message #endif #endif }; // TTextProfileHandler } // namespace sysync #endif // TextProfile_H // eof syncevolution-1.5/src/synthesis/src/sysync/timezones.cpp0000755000373300037200000012657212424517753025406 0ustar00nightlyallusers00000000000000/* * File: timezones.cpp * * Author: Beat Forster * * Timezones conversion from/to linear time scale. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-04-18 : bfo : initial version * */ /* ToDo / open issues * * 1) done 04/04/18 does not contain TZ info, how to bring it in ? -> new param * 2) 04/04/18 not yet limited to one day * 3) done 04/04/18 Is 20040101Z a valid 8601 ? (yes it is) * 4) done 04/04/20 Fill in all valid time zones * 5) done 04/04/20 Adapt straight forward conversions Enum <=> Name * 6) done 04/06/14 System time zone calculation for Linux * 7) done 04/06/14 InsertTZ / RemoveTZ implementation * 8) 06/04/12 Offset calculation for more complicated vTZ ("$") records * 9) done 07/02/26 Multi year list support */ // must be first in file, everything above is ignored by MVC compilers #include "prefix_file.h" #define TIMEZONES_INTERNAL 1 // do not import the whole thing to make life easier for standalone apps #ifdef FULLY_STANDALONE #include "sysync_globs.h" #include "sysync_debug.h" #else #include "sysync.h" #endif #include "lineartime.h" #include "timezones.h" #include "iso8601.h" #include "stringutils.h" #include "vtimezone.h" namespace sysync { static bool tzcmp ( const tz_entry &t, const tz_entry &tzi, bool olsonSupport ); static bool YearFit( const tz_entry &t, const tz_entry &tzi, GZones* g ); // ---- global structure ----------------------------------------------------------- // %%% this is now a global variable, which is BAD. Unlike a const struct array, which can be put into the // code section, this "const" is a run-time generated structure (won't work e.g. for Symbian) // We should avoid this and create that object in the app level GZones, and let further GZone objects // allow using it (without copying!) - similar mechanism as the old CopyCustomTZFrom() had // (see 8742d15b65fecf02db54ce9b7447cee09f913ad0 commit which removed it) const class tzdata : public std::vector { public: tzdata() { #ifndef NO_BUILTIN_TZ // add the global entries reserve(tctx_numtimezones); for (int i=0; i 0 && back().name == t.name) { // the previous entry wasn't really the last of its group, // fix that back().groupEnd = false; } // add new entry, assuming that it terminates its group push_back(tz_entry( t.name, t.bias, t.biasDST, t.ident, t.dynYear, tChange(t.dst.wMonth, t.dst.wDayOfWeek, t.dst.wNth, t.dst.wHour, t.dst.wMinute), tChange(t.std.wMonth, t.std.wDayOfWeek, t.std.wNth, t.std.wHour, t.std.wMinute), true // groupEnd )); // allow olson names for Android //#ifdef ANDROID -- if (t.olsonName!=NULL) back().location= t.olsonName; //#endif -- } //push_back(tz_entry("unknown", 0, 0, "x", "", tChange( 0, 0,0, 0,0), tChange( 0, 0,0, 0,0))); // 0 #endif } } tz; // --------------------------------------------------------------------------------- // GZones bool GZones::initialize() { bool ok = true; // load system wide definitions. bool nobuiltin = loadSystemZoneDefinitions(this); // %%%% later, we'll load system zones not into each GZones, but only once into // a global list. Then, the return value of loadSystemZoneDefinitions() will // determine if zones from the built-in list should be added or not // %%%% for now, we can't do that yet, built-in zones are always active if (!nobuiltin) { //%%% add entries from tz_table } return ok; } void GZones::loggingStarted() { if (!fSystemZoneDefinitionsFinalized) { finalizeSystemZoneDefinitions(this); fSystemZoneDefinitionsFinalized = true; } } bool GZones::matchTZ(const tz_entry &aTZ, TDebugLogger *aLogP, timecontext_t &aContext) { // keeps track of best match while iterating class comparison : public visitor { /** best solution so far has matching rules */ bool fRuleMatch; /** best solution has matching location */ bool fLocationMatch; /** best solution so far */ timecontext_t fContext; /** the time zone we try to match */ tz_entry fTZ; /** the TZID we try to match */ string fTZID; /** the last entry without dynYear, i.e., the main entry of a group */ timecontext_t fLeadContext; TDebugLogger *fLogP; /** time zones */ GZones *fG; public: comparison(const tz_entry &aTZ, TDebugLogger *aLogP, GZones *g) : fRuleMatch(false), fLocationMatch(false), fContext(TCTX_UNKNOWN), fTZID(aTZ.name), fLeadContext(TCTX_UNKNOWN), fLogP(aLogP), fG(g) { // prepare information for tzcmp() and YearFit() fTZ.bias = aTZ.bias; fTZ.biasDST = aTZ.biasDST; fTZ.std = aTZ.std; fTZ.dst = aTZ.dst; // setting the year here instead of 'CUR' avoids repeated calls // to MyYear() inside YearFit() int year = MyYear(g); StringObjPrintf(fTZ.dynYear, "%d", year); } bool visit(const tz_entry &aTZ, timecontext_t aContext) { if (aTZ.ident=="x") return false; // comparison with this type is not possible bool olsonSupport= false; #ifdef ANDROID olsonSupport= true; #endif bool rule_match = tzcmp( fTZ, aTZ, olsonSupport ) && YearFit(fTZ, aTZ, fG); // start of a group is an entry that has a dynYear empty or set to "CUR" (for dynamically created entries) if (aTZ.dynYear.empty() || aTZ.dynYear == "CUR") fLeadContext = aContext; if (rule_match && !fTZ.name.empty() && // empty match is NOT better !! fTZ.name == aTZ.name) { // name AND rule match => best possible match, return early PLOGDEBUGPRINTFX(fLogP, DBG_PARSE+DBG_EXOTIC, ("matchTZ: final rule and name match for %s", fTZ.name.c_str())); fContext = fLeadContext; return true; } if (!aTZ.location.empty() && fTZID.find(aTZ.location) != fTZID.npos) { // location name is part of the TZID we try to match if (!fLocationMatch || (!fRuleMatch && rule_match)) { // previous match did not match location or // not the rules and we do, so this match is better PLOGDEBUGPRINTFX(fLogP, DBG_PARSE+DBG_EXOTIC, ("matchTZ %s: location %s found, rules %s", aTZ.name.c_str(), aTZ.location.c_str(), rule_match ? "match" : "don't match")); fLocationMatch = true; fRuleMatch = rule_match; fContext = fLeadContext; return false; } } // a rule match with no better match yet? if (!fLocationMatch && rule_match && !fRuleMatch) { PLOGDEBUGPRINTFX(fLogP, DBG_PARSE+DBG_EXOTIC, ("matchTZ %s: rules match (context #%d/%d, leadcontext=#%d)", aTZ.name.c_str(), TCTX_TZENUM(aContext), tctx_numtimezones, TCTX_TZENUM(fLeadContext))); fContext = fLeadContext; fRuleMatch = true; } return false; } // visit bool result(timecontext_t &aContext) { if (fContext != TCTX_UNKNOWN) { aContext = fContext; return true; } else { return false; } } // result } c(aTZ, aLogP, this); foreachTZ(c); return c.result(aContext); } // matchTZ bool GZones::foreachTZ(visitor &v) { int i; // visit hard coded elements first for (i= 1; i<(int)tctx_numtimezones; i++) { if (v.visit(tz[i], TCTX_ENUMCONTEXT(i))) { return true; } } bool result = false; #ifdef MUTEX_SUPPORT lockMutex(muP); #endif for (TZList::iterator pos= tzP.begin(); pos!=tzP.end(); pos++, i++) { if (v.visit(*pos, TCTX_ENUMCONTEXT(i))) break; } // for #ifdef MUTEX_SUPPORT unlockMutex(muP); #endif return result; } // foreachTZ // --------------------------------------------------------------------------------- // Get signed minute offset sInt16 TCTX_MINOFFSET( timecontext_t tctx ) { return (sInt16)(tctx & TCTX_OFFSETMASK ); } // TCTX_MINOFFSET // Get time zone enum TTimeZones TCTX_TZENUM( timecontext_t tctx ) { return (TTimeZones)(tctx & TCTX_OFFSETMASK ); } // TCTX_TZENUM // Check if is a symbolic TZ info bool TCTX_IS_TZ( timecontext_t tctx ) { return (tctx & TCTX_SYMBOLIC_TZ)!=0; } // TCTX_IS_TZ // Check if is a built-in symbolic TZ info bool TCTX_IS_BUILTIN( timecontext_t tctx ) { return (tctx & TCTX_SYMBOLIC_TZ) && // is a symbolic time zone (TCTX_TZENUM(tctx) has TCTX_DATEONLY mode set (but not TIMEONLY - both set means same as both not set) bool TCTX_IS_DATEONLY( timecontext_t tctx ) { return (tctx & TCTX_DATEONLY) && !(tctx & TCTX_TIMEONLY); } // TCTX_IS_DATEONLY // Check if has TCTX_TIMEONLY mode set (but not DATEONLY - both set means same as both not set) bool TCTX_IS_TIMEONLY( timecontext_t tctx ) { return (tctx & TCTX_TIMEONLY) && !(tctx & TCTX_DATEONLY); } // TCTX_IS_TIMEONLY // Check if has TCTX_DURATION mode set bool TCTX_IS_DURATION( timecontext_t tctx ) { return ( tctx & TCTX_DURATION )!=0; } // TCTX_IS_DURATION // Check if is a unknown time zone bool TCTX_IS_UNKNOWN( timecontext_t tctx ) { return TCTX_IS_TZ( tctx ) && ( TCTX_TZENUM( tctx )==tctx_tz_unknown ); } // TCTX_IS_UNKNOWN // Check if is the system time zone bool TCTX_IS_SYSTEM ( timecontext_t tctx ) { return TCTX_IS_TZ( tctx ) && ( TCTX_TZENUM( tctx )==tctx_tz_system ); } // TCTX_IS_SYSTEM // Check if is the UTC time zone bool TCTX_IS_UTC ( timecontext_t tctx ) { return TCTX_IS_TZ( tctx ) && ( TCTX_TZENUM( tctx )==tctx_tz_UTC ); } // TCTX_IS_SYSTEM //! result is render flags from with zone info from timecontext_t TCTX_JOIN_RFLAGS_TZ ( timecontext_t aRFlagContext, timecontext_t aZoneContext ) { return (aRFlagContext & TCTX_RFLAGMASK) | (aZoneContext & ~TCTX_RFLAGMASK); } // TCTX_JOIN_RFLAGS_TZ // ---- utility functions -------------------------------------------------------------- // Specific bias string. Unit: hours string BiasStr( int bias ) { char hrs[ 80 ]; float f= (float)bias/MinsPerHour; if (bias % MinsPerHour == 0) sprintf( hrs,"%3.0f ", f ); // not with .0 else if (abs(bias % MinsPerHour)==30) sprintf( hrs,"%5.1f ", f ); else sprintf( hrs,"%6.2f ", f ); return hrs; } // BiasStr // Clear the DST info of void ClrDST( tz_entry &t ) { memset( &t.dst, 0, sizeof(t.dst) ); memset( &t.std, 0, sizeof(t.std) ); } // ClrDST // ------------------------------------------------------------------------------------- // Special cases: = 0, the one w/o dynYear // = -1, direct index bool GetTZ( timecontext_t aContext, tz_entry &t, GZones* g, int year ) { if (!TCTX_IS_TZ( aContext )) return false; int aTZ= aContext & TCTX_OFFSETMASK; if (aTZ>=0 && aTZ, it is definitely false // ----------------------- bool ok= false; //if (g==NULL) g= gz(); // either or global list #ifdef MUTEX_SUPPORT lockMutex( g->muP ); #endif int i = tctx_numtimezones; TZList::iterator pos; for (pos= g->tzP.begin(); // go thru the additional list pos!=g->tzP.end(); pos++) { if (aTZ==i && // no removed elements !! !(pos->ident=="-")) { t = *pos; ok= true; if (year<=0) break; // pass unlock now pos++; while (pos!=g->tzP.end()) { // search for the dynamic year if (t.name != pos->name) break; // no or no more t=*pos; if (year<=atoi( t.dynYear.c_str() )) break; // this is the year line we are looking for pos++; } // while break; // pass unlock now } // if i++; } // for #ifdef MUTEX_SUPPORT unlockMutex( g->muP ); #endif // ----------------------- return ok; } /* GetTZ */ void Get_tChange( lineartime_t tim, tChange &v, sInt16 &y, bool asDate ) { sInt16 day, d, sec, ms; lineartime2date( tim, &y, &v.wMonth, &day ); lineartime2time( tim, &v.wHour, &v.wMinute, &sec, &ms ); if (asDate) { v.wDayOfWeek= -1; // use it as date directly v.wNth = day; } else { v.wDayOfWeek= lineartime2weekday( tim ); v.wNth = ( day-1 ) / DaysPerWk + 1; if (v.wNth==4) { // the last one within month ? d= day + DaysPerWk; AdjustDay( d, v.wMonth, y ); if ( d==day ) v.wNth= 5; } // if } // if } // Get_tChange static bool Fill_tChange( string iso8601, int bias, int biasDST, tChange &tc, sInt16 &y, bool isDST ) { lineartime_t l; timecontext_t c; //sInt16 y, day, d, sec, ms; string::size_type rslt= ISO8601StrToTimestamp( iso8601.c_str(), l, c ); if (rslt!=iso8601.length()) return false; if (iso8601[ rslt-1 ]=='Z') { // to it for UTC only int bMins = bias; if (!isDST) bMins+= biasDST; l+= seconds2lineartime( bMins*SecsPerMin ); } // if Get_tChange( l, tc, y ); /* lineartime2date( l, &y, &tc.wMonth, &day ); lineartime2time( l, &tc.wHour, &tc.wMinute, &sec, &ms ); tc.wDayOfWeek= lineartime2weekday( l ); tc.wNth = ( day-1 ) / DaysPerWk + 1; if (tc.wNth==4) { // the last one within month ? d= day + DaysPerWk; AdjustDay( d, tc.wMonth, y ); if ( d==day ) tc.wNth= 5; } // if */ return true; } // Fill_tChange // Get int value as string static string IntStr( sInt32 i ) { const int FLen= 15; /* max length of (internal) item name */ char f[ FLen ]; // cheating: this printf format assumes that sInt32 == int sprintf ( f, "%d", int(i) ); string s= f; return s; } // IntStr bool GetTZ( string std, string dst, int bias, int biasDST, tz_entry &t, GZones* g ) { t.name = ""; t.bias = bias; t.biasDST= biasDST; t.ident = ""; t.dynYear= ""; sInt16 y; bool ok= Fill_tChange( std, bias,biasDST, t.std, y, false ) && Fill_tChange( dst, bias,biasDST, t.dst, y, true ); if (ok) t.dynYear= IntStr( y ); //printf( "tS m=%d dw=%d n=%d H=%d M=%d\n", t.std.wMonth, t.std.wDayOfWeek, t.std.wNth, // t.std.wHour, t.std.wMinute ); //printf( "tD m=%d dw=%d n=%d H=%d M=%d\n", t.dst.wMonth, t.dst.wDayOfWeek, t.dst.wNth, // t.dst.wHour, t.dst.wMinute ); //printf( "t bs=%d bd=%d\n", t.bias, t.biasDST ); // //printf( "ok=%d y=%d dyn='%s'\n", ok, y, t.dynYear.c_str() ); return ok; } // GetTZ static bool Same_tChange( const tChange &tCh1, const tChange &tCh2 ) { return tCh1.wMonth ==tCh2.wMonth && tCh1.wDayOfWeek==tCh2.wDayOfWeek && tCh1.wNth ==tCh2.wNth && tCh1.wHour ==tCh2.wHour && tCh1.wMinute ==tCh2.wMinute; } // Same_tChange /*! Compare time zone information */ static bool tzcmp( const tz_entry &t, const tz_entry &tzi, bool olsonSupport ) { bool sameName= !tzi.name.empty() && strucmp( tzi.name.c_str(), t.name.c_str() )==0; bool sameLoc = false; // by default, no olson support here //#ifdef ANDROID -- if (olsonSupport) { // allow olson names as well here sameLoc= !tzi.location.empty() && strucmp( tzi.location.c_str(), t.name.c_str() )==0; //__android_log_print( ANDROID_LOG_DEBUG, "TZ CMP", "'%s' == '%s' / '%s'\n", // t.name.c_str(), tzi.name.c_str(), tzi.location.c_str() ); } //#endif -- //printf( "name='%s' loc='%s' ident='%s' sameName=%d sameLoc=%d\n", // t.name.c_str(), t.ident.c_str(), tzi.location.c_str(), sameName, sameLoc ); if (!t.name.empty() && !sameName && !sameLoc) return false; bool idN= t.ident.empty(); if (!idN && t.ident == "?" && (sameName || sameLoc)) return true; if (!idN && t.ident == "$" && t.ident == tzi.ident && (sameName || sameLoc)) return true; /* PNCDEBUGPRINTFX( DBG_SESSION,( "tS m=%d dw=%d n=%d h=%d M=%d\n", t.std.wMonth, t.std.wDayOfWeek, t.std.wNth, t.std.wHour, t.std.wMinute ) ); PNCDEBUGPRINTFX( DBG_SESSION,( "tD m=%d dw=%d n=%d h=%d M=%d\n", t.dst.wMonth, t.dst.wDayOfWeek, t.dst.wNth, t.dst.wHour, t.dst.wMinute ) ); PNCDEBUGPRINTFX( DBG_SESSION,( "tziS m=%d dw=%d n=%d h=%d M=%d\n", tzi.std.wMonth, tzi.std.wDayOfWeek, tzi.std.wNth, tzi.std.wHour, tzi.std.wMinute ) ); PNCDEBUGPRINTFX( DBG_SESSION,( "tziD m=%d dw=%d n=%d h=%d M=%d\n", tzi.dst.wMonth, tzi.dst.wDayOfWeek, tzi.dst.wNth, tzi.dst.wHour, tzi.dst.wMinute ) ); PNCDEBUGPRINTFX( DBG_SESSION,( "t bs=%d bd=%d\n", t.bias, t.biasDST ) ); PNCDEBUGPRINTFX( DBG_SESSION,( "tzi bs=%d bd=%d\n", tzi.bias, tzi.biasDST ) ); */ if (t.bias!=tzi.bias) return false; // bias must be identical if (t.ident == "o") { // stop comparing, return result of last check return t.biasDST == tzi.biasDST; } bool tIsDst= DSTCond( t ); bool tziIsDst= DSTCond( tzi ); if (tIsDst!=tziIsDst) return false; // DST cond must be on or off for both if (tIsDst) { //if (memcmp(&t.dst, &tzi.dst, sizeof(t.dst))!=0 || // memcmp(&t.std, &tzi.std, sizeof(t.std))!=0 || if (!Same_tChange( t.dst, tzi.dst ) || !Same_tChange( t.std, tzi.std ) || t.biasDST!=tzi.biasDST) return false; } // if return !(tzi.ident=="-") && // not removed ( idN || t.ident.empty() || t.ident == tzi.ident ); /* return memcmp(&t.dst, &tzi.dst, sizeof(t.dst))==0 && memcmp(&t.std, &tzi.std, sizeof(t.std))==0 && t.bias ==tzi.bias && t.biasDST==tzi.biasDST && //%%% luz: this must be compared as well strcmp( "-", tzi.ident )!=0 && // removed ( idN || strcmp( t.ident, "" )==0 || strcmp( t.ident, tzi.ident )==0 ); */ } // tzcmp sInt16 MyYear( GZones* g ) { sInt16 y, m, d; lineartime_t t= getSystemNowAs( TCTX_UTC, g, true ); lineartime2date( t, &y,&m,&d ); return y; } // MyYear static bool YearFit( const tz_entry &t, const tz_entry &tzi, GZones* g ) { int yearS; if (t.dynYear == "CUR") yearS= MyYear( g ); else yearS= atoi( t.dynYear.c_str() ); if (yearS==0) return true; int yearI= atoi( tzi.dynYear.c_str() ); if (yearI==0) return true; if (tzi.groupEnd) return yearS>=yearI; else return yearS<=yearI; } // YearFit /* Returns true, if the given TZ is existing already * tz_entry to search for: * If == "" search for any entry with these values. * != "" name must fit * If == "" search for any entry with these values * != "" name must fit * is of the found record * is the assigned context * create an entry, if not yet existing / default: false * says, where to start searching / default: at the beginning * * supported values: * "" any (to search) * "?" name only (to search) * "o" compare offsets, but not changes (to search); name is compared if set * * "x" unknown/system * "m" military zones * "s" standard zones * "d" daylight zones * "-" removed zones * "$" not converted zones (pure text) * " " all others */ bool FoundTZ( const tz_entry &tc, string &aName, timecontext_t &aContext, GZones* g, bool createIt, timecontext_t searchOffset, bool olsonSupport ) { aName = ""; aContext = TCTX_UNKNOWN; int offs = TCTX_OFFSCONTEXT( searchOffset ); bool ok = false; tz_entry t = tc; if (!t.ident.empty() && // specific items will not contain more info !(t.ident==" ")) { ClrDST ( t ); } // if int i; // search hard coded elements first for (i= offs+1; i<(int)tctx_numtimezones; i++) { const tz_entry &tzi = tz[ i ]; if (tzcmp ( t, tzi, olsonSupport ) && YearFit( t, tzi, g )) { aName= tzi.name; //printf( "name='%s' i=%d\n", aName.c_str(), i ); ok = true; break; } // if } // for //printf( "ok=%d name='%s' i=%d olson=%d\n", ok, aName.c_str(), i, olsonSupport ); // don't go thru the mutex, if not really needed if (!ok && g!=NULL) { // ------------------------------------------- //if (g==NULL) g= gz(); #ifdef MUTEX_SUPPORT lockMutex( g->muP ); #endif TZList::iterator pos; int j= offs-(int)tctx_numtimezones; // remaining gap to be skipped // Search for all not removed elements first for (pos= g->tzP.begin(); pos!=g->tzP.end(); pos++) { if (j<0 && !(pos->ident=="-") && // element must not be removed tzcmp( t, *pos, olsonSupport )) { aName= pos->name; ok = true; break; } // if i++; j--; } // for // now check, if an already removed element can be reactivated if (createIt && !ok) { i= (int)tctx_numtimezones; j= offs-(int)tctx_numtimezones; // remaining gap to be skipped for (pos= g->tzP.begin(); pos!=g->tzP.end(); pos++) { if (j<0 && pos->ident == "-" && // removed element ? tzcmp( t, *pos, olsonSupport )) { pos->ident= t.ident; // reactivate the identifier aName = pos->name; // should be the same ok = true; break; } // if i++; j--; } // for } // if // no such element => must be created if (createIt && !ok) { // create it, if not yet ok g->tzP.push_back( t ); ok= true; } // if #ifdef MUTEX_SUPPORT unlockMutex( g->muP ); #endif // ------------------------------------------- } // if if (ok) aContext= TCTX_ENUMCONTEXT( i ); return aContext!=TCTX_UNKNOWN; } /* FoundTZ */ /* Remove a time zone definition, if already existing * NOTE: Currently only dynamic entries can be removed */ bool RemoveTZ( const tz_entry &t, GZones* g ) { //printf( "RemoveTZ '%s' %d\n", t.name, t.bias ); bool ok= false; // --------------------------- if (g==NULL) return ok; //if (g==NULL) g= gz(); #ifdef MUTEX_SUPPORT lockMutex( g->muP ); #endif bool olsonSupport= false; #ifdef ANDROID olsonSupport= true; #endif TZList::iterator pos; for (pos= g->tzP.begin(); pos!=g->tzP.end(); pos++) { if (!(pos->ident=="-") && // element must not be removed tzcmp( t, *pos, olsonSupport )) { pos->ident = "-"; //gz()->tzP.erase( pos ); // do not remove it, keep it persistent ok= true; break; } // if } // for #ifdef MUTEX_SUPPORT unlockMutex( g->muP ); #endif // --------------------------- return ok; } /* RemoveTZ */ bool TimeZoneNameToContext( cAppCharP aName, timecontext_t &aContext, GZones* g, bool olsonSupport ) { // check some special cases if (strucmp(aName,"DATE")==0) { aContext = TCTX_UNKNOWN|TCTX_DATEONLY; return true; } else if (strucmp(aName,"DURATION")==0) { aContext = TCTX_UNKNOWN|TCTX_DURATION; return true; } else if (*aName==0 || strucmp(aName,"FLOATING")==0) { aContext = TCTX_UNKNOWN; return true; } const char* GMT= "GMT"; const char* UTC= "UTC"; int v, n; char* q; tz_entry t; t.name = aName; // prepare searching t.ident = "?"; t.dynYear= ""; // luz: must be initialized! string tName; if (FoundTZ( t, tName, aContext, g, olsonSupport )) return true; /* int i; aContext= TCTX_UNKNOWN; for (i=0; i<(int)tctx_numtimezones; i++) { if (strucmp( tz[i].name,aName )==0) { aContext= TCTX_ENUMCONTEXT(i); break; } } // for if (aContext!=TCTX_UNKNOWN) return true; */ // calculate the UTC offset n= 1; q= (char *)strstr( aName,UTC ); if (q==NULL) q= (char *)strstr( aName,GMT ); if (q!=NULL && strlen( q )>strlen( UTC )) { q+= strlen( UTC ); n= MinsPerHour; } else { q= (char*)aName; } // if v= atoi( q ); if (v!=0 || strcmp( q, "0" )==0 || strcmp( q,"+0" )==0 || strcmp( q,"-0" )==0) { aContext= TCTX_OFFSCONTEXT(v*n); return true; } // if return false; } /* TimeZoneNameToContext */ bool TimeZoneContextToName( timecontext_t aContext, string &aName, GZones* g, cAppCharP aPrefIdent ) { // check some special cases if (!TCTX_IS_TZ( aContext )) { short lBias= TCTX_MINOFFSET( aContext ); aName= "OFFS" + HourMinStr( lBias ); return true; } // if if (TCTX_IS_UNKNOWN(aContext)) { aName = TCTX_IS_DURATION(aContext) ? "DURATION" : (TCTX_IS_DATEONLY(aContext) ? "DATE" : "FLOATING"); return true; } tz_entry t; aName= "UNKNOWN"; #ifdef ANDROID // setting it via param does not work currently for some reasons, switch it on permanently for Android // BUT NOT GENERALLY - IT CHANGES SEMANTICS OF THE WHOLE TIME ZONE NAMING SYSTEM! #warning "%%% overriding passed aPrefIdent argument with constant, forcing olson name output" aPrefIdent= "o"; //__android_log_print( ANDROID_LOG_DEBUG, "ContextToName", "pref='%s' / aContext=%d\n", aPrefIdent, aContext ); #endif // if aPrefIndent contains "o", this means we'd like to see olson name, if possible // %%% for now, we can return olson for the built-ins only if (TCTX_IS_BUILTIN(aContext) && aPrefIdent && strchr(aPrefIdent, 'o')!=NULL) { #ifndef NO_BUILTIN_TZ // look up in hardcoded table cAppCharP oname = tbl_tz[TCTX_TZENUM(aContext)].olsonName; if (oname) { // we have an olson name for this entry, return it aName = oname; return true; } #endif } // %%% has not yet any influence if (GetTZ( aContext, t, g )) { if (t.ident == "$") return false; // unchanged elements are not yet supported aName= t.name; } // if return true; } /* TimeZoneContextToName */ /*! Is it a DST time zone ? (both months must be defined for DST mode) */ bool DSTCond( const tz_entry &t ) { return (t.dst.wMonth!=0 && t.std.wMonth!=0); } // DSTCond /* adjust to day number within month , %% valid till year 2099 */ void AdjustDay( sInt16 &d, sInt16 m, sInt16 y ) { while (d>31) d-= DaysPerWk; if (d>30 && (m==4 || m==6 || m==9 || m==11)) d-= DaysPerWk; if (d>29 && m==2) d-= DaysPerWk; if (d>28 && m==2 && (y % 4)!=0) d-= DaysPerWk; } // AdjustDay /* Get the day where STD <=> DST switch will be done */ static sInt16 DaySwitch( lineartime_t aTime, const tChange* c ) { sInt16 y, m, d, ds; lineartime2date( aTime, &y, &m, &d ); if (c->wDayOfWeek==-1) { ds= c->wNth; } else { sInt16 wkDay= lineartime2weekday( aTime ); ds = ( wkDay + 5*DaysPerWk - ( d-1 ) ) % DaysPerWk; /* wkday of 1st */ ds = ( DaysPerWk - ds + c->wDayOfWeek ) % DaysPerWk + 1; /* 1st occurance */ ds+= ( c->wNth-1 )*DaysPerWk; AdjustDay( ds, c->wMonth, y ); } // if return ds; } // DaySwitch /*! Get lineartime_t of for a given , either from std or vice versa */ lineartime_t DST_Switch( const tz_entry &t, int bias, sInt16 aYear, bool toDST ) { sInt16 ds; const tChange* c; if (toDST) c= &t.dst; else c= &t.std; lineartime_t tim= date2lineartime( aYear, c->wMonth, 1 ); ds= DaySwitch( tim, c ); sInt32 bMins = t.bias; if (!toDST) bMins+= t.biasDST; return date2lineartime( aYear, c->wMonth, ds ) + time2lineartime( c->wHour, c->wMinute, 0,0 ) - seconds2lineartime( bMins*SecsPerMin ); } /* DST_Switch */ /* Check whether of time zone is DST based */ static bool IsDST( lineartime_t aTime, const tz_entry &t ) { bool ok; sInt16 y, m, d, h, min, ds; if (!DSTCond( t )) return false; lineartime2date( aTime, &y, &m, &d ); lineartime2time( aTime, &h, &min, NULL, NULL ); const tChange* c= NULL; if (m==t.std.wMonth) c= &t.std; if (m==t.dst.wMonth) c= &t.dst; /* calculation is a little bit more tricky within the two switching months */ if (c!=NULL) { /* if (c->wDayOfWeek==-1) { ds= c->wNth; } else { sInt16 wkDay= lineartime2weekday( aTime ); ds = ( wkDay + 5*DaysPerWk - (d-1) ) % DaysPerWk; // wkday of 1st ds = ( DaysPerWk - ds + c->wDayOfWeek ) % DaysPerWk + 1; // 1st occurance ds+= ( c->wNth-1 )*DaysPerWk; AdjustDay( ds, m, y ); } // if */ /* is the day when dst<=>std takes place */ ds= DaySwitch( aTime, c ); if (ds < d ) return c==&t.dst; if (ds > d ) return c==&t.std; /* day correct => compare hours */ if (c->wHour < h ) return c==&t.dst; if (c->wHour > h ) return c==&t.std; /* hour correct => compare minutes */ if (c->wMinute< min ) return c==&t.dst; if (c->wMinute> min ) return c==&t.std; /* decide for the margin, if identical */ return c==&t.dst; } /* if */ /* northern and southern hemnisphere supported */ if (t.dst.wMontht.dst.wMonth && mt.dst.wMonth; return ok; } /* IsDST */ static sInt32 DST_Offs( lineartime_t aValue, const tz_entry &t, bool backwards ) { if (backwards) aValue+= (lineartime_t)(t.bias*SecsPerMin)*secondToLinearTimeFactor; if (IsDST( aValue,t )) return t.bias + t.biasDST; else return t.bias; } /* DST_Offs */ /* get offset in minutes */ static bool TimeZoneToOffs( lineartime_t aValue, timecontext_t aContext, bool backwards, sInt32 &offs, GZones* g ) { tz_entry t; if (TCTX_IS_TZ( aContext )) { offs= 0; // default sInt16 year; lineartime2date( aValue, &year, NULL, NULL ); if (GetTZ( aContext, t, g, year )) { if (t.ident == "$") return false; // unchanged elements are not yet supported offs= DST_Offs( aValue, t, backwards ); } // if } else { offs= TCTX_MINOFFSET(aContext); } // if return true; } /* TimeZoneToOffs */ timecontext_t SelectTZ( TDaylightSavingZone zone, int bias, int biasDST, lineartime_t tNow, bool isDbg ) { bool dst, ok; bool withDST= zone!=EDstNone; timecontext_t t= tctx_tz_unknown; bool special= false; // possibly needed true for NGage int i; // go thru the whole list of time zones for (i=(int)tctx_tz_system+1; i<(int)tctx_numtimezones; i++) { bool tCond= DSTCond( tz[ i ] ); // are there any DST rules ? if (tCond==withDST) { if (withDST) dst= IsDST( tNow, tz[ i ] ); // check, if now in DST else dst= false; int b= bias; if (dst && special) b= bias - biasDST; if (tz[ i ].bias==b) { // the bias must fit exactly switch (zone) { case EDstEuropean : case EDstNorthern : ok= tz[ i ].dst.wMonthtz[ i ].std.wMonth; break; default : ok= true; } // switch if (isDbg) { PNCDEBUGPRINTFX( DBG_SESSION,( " %d %d dst=%d cond=%d '%s'", i, bias, dst, tCond, tz[ i ].name.c_str() )); } if (ok) { // check, if european time zone ok= (zone==EDstEuropean) == (tz[ i ].name.find("Europe") != string::npos || tz[ i ].name == "CET/CEST" || tz[ i ].name == "Romance" || tz[ i ].name == "GMT"); if (ok) { t= i; break; } } // if } // if } // if } // for if (isDbg) { PNCDEBUGPRINTFX( DBG_SESSION,( "SelectTZ: zone=%s bias=%d", tz[ t ].name.c_str(), bias ) ); } return TCTX_SYMBOLIC_TZ+t; } // SelectTZ /* get system's time zone */ static bool MyContext( timecontext_t &aContext, GZones* g ) { bool isDbg= false; // check for cached system time zone, return it if available if (g) { isDbg= g->isDbg; // luz: added safety here to avoid that incorrectly initialized GZone // (with tctx_tz_unknown instead of TCTX_UNKNOWN, as it was in timezones.h) // does not cause that system timezone is assumed known (as UTC) and returned WRONG!) // Note: rearranged to make non-locked writing to g->sysTZ is safe (for hacks needed pre-3.1.2.x!) timecontext_t curSysTZ= g->sysTZ; if (!(TCTX_IS_UNKNOWN( curSysTZ ) || TCTX_IS_SYSTEM ( curSysTZ ) )) { aContext= curSysTZ; return true; } } // if // there is no system time zone cached, we need to determine it from the operating system // - call platform specific routine bool ok = getSystemTimeZoneContext( aContext, g ); if (isDbg) { PNCDEBUGPRINTFX( DBG_SESSION, ( "MyContext: %08X ok=%d", aContext, ok )); } // update cached system context if (g && ok) g->sysTZ= aContext; // assign the system context return ok; } /* MyContext */ /* %%% luz 2009-04-02 seems of no relevance except for Symbian/Epoc -> Epoc code moved to Symbian/platform_timezones.cpp added a replacement here as it is still used from sysytest, which should return the same result (but not the debug output */ timecontext_t SystemTZ( GZones *g, bool isDbg ) { timecontext_t tctx; if (MyContext(tctx, g)) return tctx; else return TCTX_UNKNOWN; } bool ContextForEntry( timecontext_t &aContext, tz_entry &t, bool chkNameFirst, GZones* g ) { string s; string sName = t.name; bool ok = true; do { if (chkNameFirst && !sName.empty() && TimeZoneNameToContext( sName.c_str(),aContext, g )) break; // if there are no rules defined => switch it off if (t.dst.wMonth==0 || t.std.wMonth==0 || Same_tChange( t.dst, t.std )) { ClrDST( t ); } // if t.name = (char*)sName.c_str(); t.ident = ""; t.dynYear= ""; // MUST be set as this is assigned unchecked to a string // (which crashes when assigned NULL or low number) if (FoundTZ( t, s, aContext, g )) break; // with this name t.name = ""; t.dynYear= "CUR"; if (FoundTZ( t, s, aContext, g )) break; // with different name int i= 0; if (sName.empty()) sName= "unassigned"; string v; while (true) { v = sName.c_str(); if (i>0) v+= "_" + IntStr( i ); if (!TimeZoneNameToContext( v.c_str(),aContext, g )) break; // A timezone with this name must not exist i++; } // while t.name= (char*)v.c_str(); string tz_Name; FoundTZ( t, tz_Name, aContext, g, true ); // create it if (TimeZoneNameToContext( v.c_str(),aContext, g )) break; ok= false; /* t.name= (char*)sName.c_str(); string tzName; FoundTZ( t, tzName, aContext, g, true ); // create it if (TimeZoneNameToContext( sName.c_str(),aContext, g )) break; ok= false; */ } while (false); return ok; } /* ContextFromNameAndEntry */ /* returns true, if the context rules are identical */ static bool IdenticalRules( timecontext_t aSourceContext, timecontext_t aTargetContext, GZones* g ) { tz_entry ts, tt; /* only performed in TZ mode */ if (!GetTZ( aSourceContext, ts, g, 0 ) || !GetTZ( aTargetContext, tt, g, 0 )) return false; TTimeZones asTZ= TCTX_TZENUM( aSourceContext ); TTimeZones atTZ= TCTX_TZENUM( aTargetContext ); if (asTZ==atTZ) return true; // identical if (ts.ident == "$" || tt.ident == "$") return false; if (ts.bias==tt.bias && // memcmp( &ts.dst, &tt.dst, sizeof(tChange))==0 && // memcmp( &ts.std, &tt.std, sizeof(tChange))==0) return true; Same_tChange( ts.dst, tt.dst ) && Same_tChange( ts.std, tt.std )) return true; /* if (!TCTX_IS_TZ( aSourceContext ) || !TCTX_IS_TZ( aTargetContext )) return false; // get the time zones for calculation TTimeZones asTZ= TCTX_TZENUM(aSourceContext); TTimeZones atTZ= TCTX_TZENUM(aTargetContext); if (asTZ==atTZ) return true; if ( tz[ asTZ ].bias==tz[ atTZ ].bias && memcmp( &tz[ asTZ ].dst, &tz[ atTZ ].dst, sizeof(tChange))==0 && memcmp( &tz[ asTZ ].std, &tz[ atTZ ].std, sizeof(tChange))==0) { return true; } // if */ return false; } /* IdenticalRules */ /*! get system's time zone context (i.e. resolve the TCTX_SYSTEM meta-context) * @param[in,out] aContext : context will be made non-meta, that is, if input is TCTX_SYSTEM, * actual time zone will be determined. */ bool TzResolveMetaContext( timecontext_t &aContext, GZones* g ) { if (!TCTX_IS_SYSTEM(aContext)) return true; // no meta zone, just return unmodified // is meta-context TCTX_SYSTEM, determine actual symbolic context return MyContext(aContext,g); } // TzResolveMetaContext /* make time context non-symbolic (= calculate minute offset east of UTC for aRefTime) */ bool TzResolveContext( timecontext_t &aContext, lineartime_t aRefTime, bool aRefTimeUTC, GZones* g ) { sInt32 offs; // resolve possible meta context (TCTX_SYSTEM at this time) if (!TzResolveMetaContext(aContext,g)) return false; // check if already an offset (non-symbolic) if (!TCTX_IS_TZ(aContext)) return true; // yes, no conversion needed // is symbolic, needs conversion to offset bool ok = TimeZoneToOffs( aRefTime, // reference time for which we want to know the offset aContext, // context aRefTimeUTC, // "backwards" means refTime is UTC and we want know offset to go back to local offs, // here we get the offset g ); if (ok) { aContext = TCTX_JOIN_RFLAGS_TZ( aContext, // join original rendering flags... TCTX_OFFSCONTEXT(offs) // ...with new offset based context ); } return ok; } // TzResolveContext /*! calculate minute offset east of UTC for aRefTime * @param[in] aContext : time context to resolve * @param[out] aMinuteOffset : receives minute offset east of UTC * @param[in] aRefTime : reference time point for resolving the offset * @param[in] aRefTimeUTC : if set, reference time must be UTC, * otherwise, reference time must be in context of aContext */ bool TzResolveToOffset( timecontext_t aContext, sInt16 &aMinuteOffset, lineartime_t aRefTime, bool aRefTimeUTC, GZones* g ) { bool ok = TzResolveContext(aContext, aRefTime, aRefTimeUTC, g); if (ok) { aMinuteOffset = TCTX_MINOFFSET(aContext); } return ok; } // TzResolveToOffset /*! Offset between two contexts (in seconds) * Complex time zones (type "$") can't be currently resolved, they return false * @param[in] aSourceValue : reference time for which the offset should be calculated * @param[in] aSourceContext : source time zone context * @param[in] aTargetContext : source time zone context * @param[out] sDiff : receives offset east of UTC in seconds */ bool TzOffsetSeconds( lineartime_t aSourceValue, timecontext_t aSourceContext, timecontext_t aTargetContext, sInt32 &sDiff, GZones* g, timecontext_t aDefaultContext ) { bool sSys, tSys, sUnk, tUnk; sInt32 sOffs= 0, tOffs= 0; // initialize them for sure lineartime_t aTargetValue; bool ok= true; bool isDbg= false; if (g) isDbg= g->isDbg; // set default context for unknown zones if (TCTX_IS_UNKNOWN(aSourceContext)) aSourceContext=aDefaultContext; if (TCTX_IS_UNKNOWN(aTargetContext)) aTargetContext=aDefaultContext; do { sDiff= 0; if (aSourceContext==aTargetContext) break; /* no conversion, if identical context */ /* both unknown or system is still ok */ if (TCTX_IS_UNKNOWN( aSourceContext ) && TCTX_IS_UNKNOWN( aTargetContext )) break; sSys= TCTX_IS_SYSTEM ( aSourceContext ); tSys= TCTX_IS_SYSTEM ( aTargetContext ); if (sSys && tSys) break; /* calculate specifically for the system's time zone */ if (sSys) MyContext( aSourceContext, g ); if (tSys) MyContext( aTargetContext, g ); /* if both are unknown now, then it's good as well */ sUnk= TCTX_IS_UNKNOWN( aSourceContext ); tUnk= TCTX_IS_UNKNOWN( aTargetContext ); if (sUnk && tUnk) break; /* this case can't be resolved: */ if (sUnk || tUnk) { ok= false; break; } if (IdenticalRules( aSourceContext,aTargetContext, g )) break; /* now do the "hard" things */ if (!TimeZoneToOffs( aSourceValue, aSourceContext, false, sOffs, g )) return false; aTargetValue= aSourceValue - (lineartime_t)(sOffs*SecsPerMin)*secondToLinearTimeFactor; if (!TimeZoneToOffs( aTargetValue, aTargetContext, true, tOffs, g )) return false; sDiff= ( tOffs - sOffs )*SecsPerMin; } while (false); if (isDbg) { PNCDEBUGPRINTFX( DBG_SESSION,( "sSys=%d tSys=%d / sUnk=%d tUnk=%d / sOffs=%d tOffs=%d", sSys,tSys, sUnk,tUnk, sOffs,tOffs )); PNCDEBUGPRINTFX( DBG_SESSION,( "TzOffsetSeconds=%d", sDiff )); } // if return ok; } /* TzOffsetSeconds */ /*! Converts timestamp value from one zone to another * Complex time zones (type "$") can't be currently resolved, they return false * @param[in/out] aValue : will be converted from source context to target context. If==noLinearTime==0, no conversion is done * @param[in] aSourceContext : source time zone context * @param[in] aTargetContext : source time zone context * @param[in] aDefaultContext: default context to use if source or target is TCTX_UNKNOWN */ bool TzConvertTimestamp( lineartime_t &aValue, timecontext_t aSourceContext, timecontext_t aTargetContext, GZones* g, timecontext_t aDefaultContext ) { sInt32 sdiff; if (aValue==noLinearTime) return true; // no time, don't convert bool ok = TzOffsetSeconds( aValue, aSourceContext, aTargetContext, sdiff, g, aDefaultContext ); if (ok) aValue += (lineartime_t)(sdiff)*secondToLinearTimeFactor; return ok; } /* TzConvertTimestamp */ } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync/timezones.h0000755000373300037200000004500712424517753025044 0ustar00nightlyallusers00000000000000/* * File: timezones.h * * Author: Beat Forster * * Timezones conversion from/to linear time scale. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * 2004-04-18 : bfo : initial version * */ #ifndef TIMEZONES_H #define TIMEZONES_H #include #include #include #include "lineartime.h" #include "debuglogger.h" #ifdef MUTEX_SUPPORT #include "platform_mutex.h" #endif using namespace std; // for string and list namespace sysync { // include the built-in time zone table #ifndef NO_BUILTIN_TZ #include "tz_table.h" #endif /// time zone table entry definition typedef struct tChangeStruct { short wMonth; short wDayOfWeek; short wNth; // nth occurance short wHour; short wMinute; tChangeStruct() : wMonth(0), wDayOfWeek(0), wNth(0), wHour(0), wMinute(0) {} tChangeStruct(short aMonth, short aDayOfWeek, short aNth, short aHour, short aMinute) : wMonth(aMonth), wDayOfWeek(aDayOfWeek), wNth(aNth), wHour(aHour), wMinute(aMinute) {} } tChange; class tz_entry { public: std::string name; /**< name, same as TZID in VTIMEZONE, e.g. CET/CEST or /softwarestudio.org/Tzfile/Europe/Berlin; see also dst/stdName */ std::string stdName; /**< optional standard time name, e.g. CEST; must be set if "name" is not a concatenation of standard and daylight name (CET/CEST); the vCalendar 1.0 code relies on that */ std::string dstName; /**< used instead of splitting "name" if (and only if) stdName is set; may be empty in zones without daylight saving */ std::string location; /**< location string as used in Olson TZID, e.g. Europe/Berlin */ short bias; /**< minutes difference to UTC (west negative, east positive */ short biasDST; /**< minutes difference to bias (not UTC!) */ std::string ident; /**< see FoundTZ() */ std::string dynYear; /**< if this time zone rule is assigned to a specific year range */ tChange dst; /**< describes when daylight saving time will become active */ tChange std; /**< describes when standard time will become active */ bool groupEnd; /**< true if the entry which follows this one belongs to a different zone or last entry */ tz_entry() : bias(0), biasDST(0), groupEnd(true) {} tz_entry( const std::string &aName, short aBias, short aBiasDST, const std::string &aIdent, const std::string &aDynYear, const tChange &aDst, const tChange &aStd, bool aGroupEnd ) : name(aName), bias(aBias), biasDST(aBiasDST), ident(aIdent), dynYear(aDynYear), dst(aDst), std(aStd), groupEnd(aGroupEnd) {} }; //const int DST_Bias= 60; // General DST offset (in minutes) // Symbian timezone categories // visible for all other systems as well #ifndef __EPOC_OS__ enum TDaylightSavingZone { EDstHome =0x40000000, EDstNone =0, EDstEuropean=1, EDstNorthern=2, EDstSouthern=4 }; #endif // Offset mask const uInt32 TCTX_OFFSETMASK = 0x0000FFFF; // time context flags // - symbolic zone flag const uInt32 TCTX_SYMBOLIC_TZ= 0x00010000; // - rendering flags const uInt32 TCTX_DATEONLY = 0x00020000; const uInt32 TCTX_TIMEONLY = 0x00040000; const uInt32 TCTX_DURATION = 0x00080000; const uInt32 TCTX_RFLAGMASK = TCTX_DATEONLY+TCTX_TIMEONLY+TCTX_DURATION; //! Get signed minute offset sInt16 TCTX_MINOFFSET( timecontext_t tctx ); //! Get time zone enum TTimeZones TCTX_TZENUM( timecontext_t tctx ); // macro to get time zone context #define TCTX_ENUMCONTEXT( tzenum ) ((timecontext_t) ((tzenum) | TCTX_SYMBOLIC_TZ)) #define TCTX_UNKNOWN TCTX_ENUMCONTEXT( tctx_tz_unknown ) #define TCTX_SYSTEM TCTX_ENUMCONTEXT( tctx_tz_system ) #define TCTX_UTC TCTX_ENUMCONTEXT( tctx_tz_UTC ) #define TCTX_OFFSCONTEXT( offs ) ((timecontext_t)((sInt16)(offs) & TCTX_OFFSETMASK )) /* // macro to get time zone and other flags #define TCTX_IS_TZ( tctx ) ((bool)(tctx & TCTX_SYMBOLIC_TZ)) #define TCTX_IS_DATEONLY( tctx ) ((bool)(tctx & TCTX_DATEONLY )) */ //! Check if is a symbolic TZ info bool TCTX_IS_TZ ( timecontext_t tctx ); // Check if is a built-in symbolic TZ info bool TCTX_IS_BUILTIN ( timecontext_t tctx ); //! Check if has TCTX_DATEONLY mode set bool TCTX_IS_DATEONLY( timecontext_t tctx ); //! Check if has TCTX_TIMEONLY mode set bool TCTX_IS_TIMEONLY( timecontext_t tctx ); //! Check if has TCTX_DURATION mode set bool TCTX_IS_DURATION( timecontext_t tctx ); //! Check if is a unknown time zone bool TCTX_IS_UNKNOWN ( timecontext_t tctx ); //! Check if is the system time zone bool TCTX_IS_SYSTEM ( timecontext_t tctx ); //! Check if is the UTC time zone bool TCTX_IS_UTC ( timecontext_t tctx ); //! result is render flags from with zone info from timecontext_t TCTX_JOIN_RFLAGS_TZ ( timecontext_t aRFlagContext, timecontext_t aZoneContext ); // ---- utility functions ------------------------------------------------------------- /*! Specific bias string. Unit: hours */ string BiasStr( int bias ); /*! Clear the DST info of */ void ClrDST( tz_entry &t ); typedef std::list TZList; class GZones { public: GZones() { #ifdef MUTEX_SUPPORT muP= newMutex(); #endif predefinedSysTZ= TCTX_UNKNOWN; // no predefined system time zone sysTZ= predefinedSysTZ; // default to predefined zone, if none, this will be obtained from OS APIs isDbg= false; // !!! IMPORTANT: do NOT enable this except for test targets, as it leads to recursions (debugPrintf calls time routines!) fSystemZoneDefinitionsFinalized = false; #ifdef SYDEBUG getDbgMask = 0; getDbgLogger= NULL; #endif } // constructor /*! @brief populate GZones with system information * * Sets predefinedSysTZ, sysTZ and adds time zones * to tzP, if that information can be found on the * system. * * Returns false in case of a fatal error. */ bool initialize(); /*! @brief log and/or add more GZones * * Called after config was read and normal debug logging * is possible. */ void loggingStarted(); /*! @brief find a matching time zone * * This returns the best match, with "better" defined as (best * match first): * - exact name AND exact rule set match * - existing entry has a location (currently only the case for * time zones imported from libical) AND that location is part of the * name being searched for AND the rule matches * - as before, but with the rule match * - exact rule set match * * If there are multiple entries which are equally good, the first one * is returned. * * When doing rule matching, the dynYear value of an existing * entry has to match the current year as implemented by the * FitYear() function in timezone.cpp. In most (all?) cases this * has the effect that historic rules are skipped. Likewise, * VTIMEZONE information sent out is based on the current rules * for the zone, regardless of when the event itself takes place. * * This is approach is intentional: it helps avoid mismatches * when historic rules of one zone match the current rules of * another. Furthermore, it helps peers which do rule-based * matching and only know the current rules of each zone. * * @param aTZ entry with rules and name set; ident is ignored * @retval aContext the matching time zone context ID; it always * refers to the tz_entry without a dynYear * @return true if match found */ bool matchTZ(const tz_entry &aTZ, TDebugLogger *aLogP, timecontext_t &aContext); class visitor { public: /** @return true to stop iterating */ virtual bool visit(const tz_entry &aTZ, timecontext_t aContext) = 0; virtual ~visitor() {} // destructor }; /*! @brief invoke visitor once for each time zone * @return true if the visitor returned true */ bool foreachTZ(visitor &v); void ResetCache(void) { sysTZ= predefinedSysTZ; // reset cached system time zone to make sure it is re-evaluated } #ifdef MUTEX_SUPPORT #endif TZList tzP; // the list of additional time zones timecontext_t predefinedSysTZ; // can be set to a specific zone to override zone returned by OS API timecontext_t sysTZ; // the system's time zone, will be calculated, // if set to tctx_tz_unknown bool isDbg; // write debug information bool fSystemZoneDefinitionsFinalized; // finalizeSystemZoneDefinitions() already called #ifdef SYDEBUG uInt32 getDbgMask; // allow debugging in a specific context TDebugLogger* getDbgLogger; #endif }; // GZones // visible for debugging only timecontext_t SystemTZ( GZones *g, bool isDbg= false ); timecontext_t SelectTZ( TDaylightSavingZone zone, int bias, int biasDST, lineartime_t tNow, bool isDbg= false ); // visible for platform_timezones.cpp/.mm bool ContextForEntry( timecontext_t &aContext, tz_entry &t, bool chkNameFirst, GZones* g ); void Get_tChange( lineartime_t tim, tChange &v, sInt16 &y, bool asDate= false ); /*! Get from * or / */ bool GetTZ( timecontext_t aContext, tz_entry &t, GZones* g, int year= 0 ); bool GetTZ( string std, string dst, int bias, int biasDST, tz_entry &t, GZones* g ); /*! Get the current year */ sInt16 MyYear( GZones* g ); /*! Returns true, if the given TZ is existing already * tz_entry to search for: * If == "" search for any entry with these values. * != "" name must fit * If == "" search for any entry with these values * != "" ident must fit * == "?" search for the name only. * * is of the found record * is the assigned context * global list of additional time zones * create an entry, if not yet existing / default: false * says, where to start searching / default: at the beginning */ bool FoundTZ( const tz_entry &t, string &aName, timecontext_t &aContext, GZones* g, bool createIt = false, timecontext_t searchOffset= tctx_tz_unknown, bool olsonSupport= false ); /*! Remove an existing entry * Currently, elements of the hard coded list can't be removed */ bool RemoveTZ( const tz_entry &t, GZones* g ); /*! Is it a DST time zone ? (both months must be defined for DST mode) */ bool DSTCond( const tz_entry &t ); /*! Adjust to day number within month , %% valid till year 2099 */ void AdjustDay( sInt16 &d, sInt16 m, sInt16 y ); /*! Get lineartime_t of for a given , either from std or vice versa */ lineartime_t DST_Switch( const tz_entry &t, int bias, sInt16 aYear, bool toDST ); /*! Convert time zone name into context * @param[in] aName : context name to resolve * @param[out] aContext : context for this aName * @param[in] g : global list of additional time zones * */ bool TimeZoneNameToContext( cAppCharP aName, timecontext_t &aContext, GZones* g, bool olsonSupport= false ); /*! Convert context into time zone name, a preferred name can be given * @param[in] aContext : time context to resolve * @param[out] aName : context name for this aContext * @param[in] g : global list of additional time zones * @param[in] aPrefIdent : preferred name, if more than one is fitting * */ bool TimeZoneContextToName( timecontext_t aContext, string &aName, GZones* g, cAppCharP aPrefIdent= "" ); /*! get system's time zone context (i.e. resolve the TCTX_SYSTEM meta-context) * @param[in,out] aContext : context will be made non-meta, that is, if input is TCTX_SYSTEM, * actual time zone will be determined. * @param[in] g : global list of additional time zones */ bool TzResolveMetaContext( timecontext_t &aContext, GZones* g ); /*! make time context non-symbolic (= calculate minute offset east of UTC for aRefTime) * but retain other time context flags in aContext * @param[in,out] aContext : context will be made non-symbolic, that is resolved to minute offset east of UTC * @param[in] aRefTime : reference time point for resolving the offset * @param[in] aRefTimeUTC : if set, reference time must be UTC, * otherwise, reference time must be in context of aContext * @param[in] g : global list of additional time zones */ bool TzResolveContext( timecontext_t &aContext, lineartime_t aRefTime, bool aRefTimeUTC, GZones* g ); /*! calculate minute offset east of UTC for aRefTime * @param[in] aContext : time context to resolve * @param[out] aMinuteOffset : receives minute offset east of UTC * @param[in] aRefTime : reference time point for resolving the offset * @param[in] aRefTimeUTC : if set, reference time must be UTC, * otherwise, reference time must be in context of aContext * @param[in] g : global list of additional time zones */ bool TzResolveToOffset( timecontext_t aContext, sInt16 &aMinuteOffset, lineartime_t aRefTime, bool aRefTimeUTC, GZones* g ); /*! Offset between two contexts (in seconds) * Complex time zones (type "$") can't be currently resolved, they return false * @param[in] aSourceValue : reference time for which the offset should be calculated * @param[in] aSourceContext : source time zone context * @param[in] aTargetContext : source time zone context * @param[out] sDiff : receives offset east of UTC in seconds * @param[in] g : global list of additional time zones * @param[in] aDefaultContext: default context to use if source or target is TCTX_UNKNOWN */ bool TzOffsetSeconds( lineartime_t aSourceValue, timecontext_t aSourceContext, timecontext_t aTargetContext, sInt32 &sDiff, GZones* g, timecontext_t aDefaultContext= TCTX_UNKNOWN); /*! Converts timestamp value from one zone to another * Complex time zones (type "$") can't be currently resolved, they return false * @param[in/out] aValue : will be converted from source context to target context * @param[in] aSourceContext : source time zone context * @param[in] aTargetContext : source time zone context * @param[in] g : global list of additional time zones * @param[in] aDefaultContext: default context to use if source or target is TCTX_UNKNOWN */ bool TzConvertTimestamp( lineartime_t &aValue, timecontext_t aSourceContext, timecontext_t aTargetContext, GZones* g, timecontext_t aDefaultContext = TCTX_UNKNOWN); /*! Prototypes for platform-specific implementation of time-zone-related routines * which are implemented in platform_time.cpp */ /*! @brief get system real time * @return system's real time in lineartime_t scale, in specified time zone context * @param[in] aTimeContext : desired output time zone * @param[in] g : global list of additional time zones * @param[in] aNoOffset : no offset calculation, if true (to avoid recursive calls) */ lineartime_t getSystemNowAs( timecontext_t aTimeContext, GZones* g, bool aNoOffset= false ); /*! Prototypes for platform-specific implementation of time-zone-related routines * which are implemented in platform_timezones.cpp/.mm */ /*! @brief platform specific loading of time zone definitions * @return true if this list is considered complete (i.e. no built-in zones should be used additionally) * @param[in/out] aGZones : the GZones object where system zones should be loaded into * @note this is called at construction of the SyncAppBase before any logging facilities are * available. This routine should load enough time zone information such that config * can be read and conversion between UTC and system local time is possible. * Use finalizeSystemZoneDefinitions() to add time zones with full logging available. */ bool loadSystemZoneDefinitions( GZones* aGZones ); /*! @brief second opportunity to load platform specific time zone definitions with logging available (and config already parsed) * Called only once per GZones instance. * @param[in/out] aGZones : the GZones object where additional system zones should be loaded into */ void finalizeSystemZoneDefinitions( GZones* aGZones ); /*! @brief get current system time zone * @return true if successful * @param[out] aContext : the time zone context representing the current system time zone. * @param[in] aGZones : the GZones object. */ bool getSystemTimeZoneContext( timecontext_t &aContext, GZones* aGZones ); } // namespace sysync #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync/tz_table.h0000755000373300037200000014417212424517753024636 0ustar00nightlyallusers00000000000000/* * File: tz_table.h * * Author: Beat Forster * * Time zone information. * (CURRENTLY NOT) Automatically generated with 'read_tzi' * Conversion date: ??/??/?? * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #ifndef TZ_TABLE_H #define TZ_TABLE_H typedef enum { // special time zones tctx_tz_unknown, // 0 tctx_tz_system, // 0 tctx_tz_UTC, // 0 Coordinated Universal Time Europe, will be preferred // list of all Registry time zones tctx_tz_Afghanistan, // 4.5 Kabul tctx_tz_AKST_AKDT, // -9 Alaska tctx_tz_AKST_AKDT_2006, // -9 Alaska tctx_tz_AKST_AKDT_2007, // -9 Alaska tctx_tz_HNY_NAY, // -9 Alaska tctx_tz_HNY_NAY_2006, // -9 Alaska tctx_tz_HNY_NAY_2007, // -9 Alaska tctx_tz_Alaskan, // -9 Alaska tctx_tz_Alaskan_2006, // -9 Alaska tctx_tz_Alaskan_2007, // -9 Alaska tctx_tz_Arab, // 3 Kuwait, Er Riad tctx_tz_Arabian, // 4 Abu Dhabi, Muskat tctx_tz_Arabic, // 3 Bagdad tctx_tz_AST_ADT, // -4 Atlantik (Kanada) tctx_tz_AST_ADT_2006, // -4 Atlantik (Kanada) tctx_tz_AST_ADT_2007, // -4 Atlantik (Kanada) tctx_tz_HNA_HAA, // -4 Atlantik (Kanada) tctx_tz_HNA_HAA_2006, // -4 Atlantik (Kanada) tctx_tz_HNA_HAA_2007, // -4 Atlantik (Kanada) tctx_tz_Atlantic, // -4 Atlantik (Kanada) tctx_tz_Atlantic_2006, // -4 Atlantik (Kanada) tctx_tz_Atlantic_2007, // -4 Atlantik (Kanada) tctx_tz_ART_ARST, // -3 Buenos Aires tctx_tz_ART_ARST_2006, // -3 Buenos Aires tctx_tz_ART_ARST_2007, // -3 Buenos Aires tctx_tz_ART_ARST_2008, // -3 Buenos Aires tctx_tz_ART_ARST_2009, // -3 Buenos Aires tctx_tz_AUS_Central, // 9.5 Darwin tctx_tz_AUS_Eastern, // 10 Canberra, Melbourne, Sydney tctx_tz_Azerbaijan, // 4 Baku tctx_tz_Azores, // -1 Azoren tctx_tz_Canada_Central, // -6 Saskatchewan tctx_tz_Cape_Verde, // -1 Kapverdische Inseln tctx_tz_Caucasus, // 4 Eriwan tctx_tz_ACST_ACDT, // 9.5 Adelaide tctx_tz_Central_Australia, // 9.5 Adelaide tctx_tz_Central_America, // -6 Zentralamerika tctx_tz_Central_Asia, // 6 Astana, Dhaka tctx_tz_Central_Brazilian, // -4 Manaus tctx_tz_Central_Brazilian_2006, // -4 Manaus tctx_tz_Central_Brazilian_2007, // -4 Manaus tctx_tz_CET_CEST, // 1 Belgrad, Bratislava, Budapest, Ljubljana, Prag tctx_tz_MEZ_MESZ, // 1 Belgrad, Bratislava, Budapest, Ljubljana, Prag tctx_tz_Central_Europe, // 1 Belgrad, Bratislava, Budapest, Ljubljana, Prag tctx_tz_Central_European, // 1 Sarajevo, Skopje, Warschau, Zagreb tctx_tz_Central_Pacific, // 11 Magadan, Salomonen, Neukaledonien tctx_tz_CST_CDT, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_CST_CDT_2006, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_CST_CDT_2007, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_HNC_HAC, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_HNC_HAC_2006, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_HNC_HAC_2007, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_Central, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_Central_2006, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_Central_2007, // -6 Chicago, Dallas, Kansas City, Winnipeg tctx_tz_Central_Mexico, // -6 Guadalajara, Mexiko-Stadt, Monterrey - neu tctx_tz_China, // 8 Peking, Chongqing, Hongkong, Urumchi tctx_tz_Dateline, // -12 Internationale Datumsgrenze (Westen) tctx_tz_East_Africa, // 3 Nairobi tctx_tz_AEST_AEDT, // 10 Brisbane tctx_tz_East_Australia, // 10 Brisbane tctx_tz_EET_EEST, // 2 Minsk tctx_tz_East_Europe, // 2 Minsk tctx_tz_East_South_America, // -3 Brasilia tctx_tz_East_South_America_2006, // -3 Brasilia tctx_tz_East_South_America_2007, // -3 Brasilia tctx_tz_EST_EDT, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_EST_EDT_2006, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_EST_EDT_2007, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_HNE_HAE, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_HNE_HAE_2006, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_HNE_HAE_2007, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_Eastern, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_Eastern_2006, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_Eastern_2007, // -5 New York, Miami, Atlanta, Detroit, Toronto tctx_tz_Egypt, // 2 Kairo tctx_tz_Ekaterinburg, // 5 Jekaterinburg tctx_tz_Fiji, // 12 Fidschi, Kamtschatka, Marshall-Inseln tctx_tz_FLE, // 2 Helsinki, Kiew, Riga, Sofia, Tallinn, Wilna tctx_tz_Georgian, // 3 Tiflis tctx_tz_GMT, // 0 Dublin, Edinburgh, Lissabon, London tctx_tz_Greenland, // -3 Groenland tctx_tz_Greenwich, // 0 Casablanca, Monrovia, Reykjavik tctx_tz_GTB, // 2 Athen, Bukarest, Istanbul tctx_tz_HST_HPT, // -10 Hawaii tctx_tz_HAST_HADT, // -10 Hawaii tctx_tz_Hawaiian, // -10 Hawaii tctx_tz_India, // 5.5 Chennai, Kolkata, Mumbai, Neu-Delhi tctx_tz_Iran, // 3.5 Teheran tctx_tz_Iran_2005, // 3.5 Teheran tctx_tz_Iran_2006, // 3.5 Teheran tctx_tz_Israel, // 2 Jerusalem tctx_tz_Israel_2004, // 2 Jerusalem tctx_tz_Israel_2005, // 2 Jerusalem tctx_tz_Israel_2006, // 2 Jerusalem tctx_tz_Israel_2007, // 2 Jerusalem tctx_tz_Israel_2008, // 2 Jerusalem tctx_tz_Israel_2009, // 2 Jerusalem tctx_tz_Israel_2010, // 2 Jerusalem tctx_tz_Israel_2011, // 2 Jerusalem tctx_tz_Israel_2012, // 2 Jerusalem tctx_tz_Israel_2013, // 2 Jerusalem tctx_tz_Israel_2014, // 2 Jerusalem tctx_tz_Israel_2015, // 2 Jerusalem tctx_tz_Israel_2016, // 2 Jerusalem tctx_tz_Israel_2017, // 2 Jerusalem tctx_tz_Israel_2018, // 2 Jerusalem tctx_tz_Israel_2019, // 2 Jerusalem tctx_tz_Israel_2020, // 2 Jerusalem tctx_tz_Israel_2021, // 2 Jerusalem tctx_tz_Israel_2022, // 2 Jerusalem tctx_tz_Israel_2023, // 2 Jerusalem tctx_tz_Jordan, // 2 Amman tctx_tz_Korea, // 9 Seoul tctx_tz_Mexico, // -6 Guadalajara, Mexiko-Stadt, Monterrey - alt tctx_tz_Mexico_2, // -7 Chihuahua, La Paz, Mazatlan - alt tctx_tz_Mid_Atlantic, // -2 Mittelatlantik tctx_tz_Middle_East, // 2 Beirut tctx_tz_Montevideo, // -3 Montevideo tctx_tz_MST_MDT, // -7 Denver, Salt Lake City, Calgary tctx_tz_MST_MDT_2006, // -7 Denver, Salt Lake City, Calgary tctx_tz_MST_MDT_2007, // -7 Denver, Salt Lake City, Calgary tctx_tz_HNR_HAR, // -7 Denver, Salt Lake City, Calgary tctx_tz_HNR_HAR_2006, // -7 Denver, Salt Lake City, Calgary tctx_tz_HNR_HAR_2007, // -7 Denver, Salt Lake City, Calgary tctx_tz_Mountain, // -7 Denver, Salt Lake City, Calgary tctx_tz_Mountain_2006, // -7 Denver, Salt Lake City, Calgary tctx_tz_Mountain_2007, // -7 Denver, Salt Lake City, Calgary tctx_tz_Mountain_Mexico, // -7 Chihuahua, La Paz, Mazatlan - neu tctx_tz_Myanmar, // 6.5 Yangon (Rangun) tctx_tz_North_Central_Asia, // 6 Almaty, Nowosibirsk tctx_tz_Namibia, // 2 Windhuk tctx_tz_Nepal, // 5.75 Katmandu tctx_tz_New_Zealand, // 12 Auckland, Wellington tctx_tz_NST_NDT, // -3.5 Neufundland tctx_tz_NST_NDT_2006, // -3.5 Neufundland tctx_tz_NST_NDT_2007, // -3.5 Neufundland tctx_tz_HNT_HAT, // -3.5 Neufundland tctx_tz_HNT_HAT_2006, // -3.5 Neufundland tctx_tz_HNT_HAT_2007, // -3.5 Neufundland tctx_tz_Newfoundland, // -3.5 Neufundland tctx_tz_Newfoundland_2006, // -3.5 Neufundland tctx_tz_Newfoundland_2007, // -3.5 Neufundland tctx_tz_North_Asia_East, // 8 Irkutsk, Ulan Bator tctx_tz_North_Asia, // 7 Krasnojarsk tctx_tz_Pacific_SA, // -4 Santiago tctx_tz_PST_PDT, // -8 Pacific (USA, Kanada) tctx_tz_PST_PDT_2006, // -8 Pacific (USA, Kanada) tctx_tz_PST_PDT_2007, // -8 Pacific (USA, Kanada) tctx_tz_HNP_HAP, // -8 Pacific (USA, Kanada) tctx_tz_HNP_HAP_2006, // -8 Pacific (USA, Kanada) tctx_tz_HNP_HAP_2007, // -8 Pacific (USA, Kanada) tctx_tz_Pacific, // -8 Pacific (USA, Kanada) tctx_tz_Pacific_2006, // -8 Pacific (USA, Kanada) tctx_tz_Pacific_2007, // -8 Pacific (USA, Kanada) tctx_tz_Pacific_Mexico, // -8 Tijuana, Niederkalifornien (Mexiko) tctx_tz_Romance, // 1 Bruessel, Kopenhagen, Madrid, Paris tctx_tz_Russian, // 3 Moskau, St. Petersburg, Wolgograd tctx_tz_SA_Eastern, // -3 Buenos Aires, Georgetown (OLD) tctx_tz_SA_Pacific, // -5 Bogota, Lima, Quito, Rio Branco tctx_tz_SA_Western, // -4 Caracas, La Paz tctx_tz_Samoa, // -11 Midway-Inseln, Samoa tctx_tz_SE_Asia, // 7 Bangkok, Hanoi, Jakarta tctx_tz_Singapore, // 8 Kuala Lumpur, Singapur tctx_tz_South_Africa, // 2 Harare, Praetoria tctx_tz_Sri_Lanka, // 5.5 Sri Jayawardenepura tctx_tz_Taipei, // 8 Taipeh tctx_tz_Tasmania, // 10 Hobart tctx_tz_Tokyo, // 9 Osaka, Sapporo, Tokio tctx_tz_Tonga, // 13 Nuku'alofa tctx_tz_US_Eastern, // -5 Indiana (Ost) tctx_tz_US_Mountain, // -7 Arizona tctx_tz_Vladivostok, // 10 Wladiwostok tctx_tz_West_Australia, // 8 Perth tctx_tz_West_Australia_2005, // 8 Perth tctx_tz_West_Australia_2006, // 8 Perth tctx_tz_West_Australia_2007, // 8 Perth tctx_tz_West_Central_Africa, // 1 West-Zentralafrika tctx_tz_WET_WEST, // 1 Amsterdam, Berlin, Bern, Rom, Stockholm, Wien tctx_tz_West_Europe, // 1 Amsterdam, Berlin, Bern, Rom, Stockholm, Wien tctx_tz_West_Asia, // 5 Islamabad, Karatschi, Taschkent tctx_tz_West_Pacific, // 10 Guam, Port Moresby tctx_tz_Yakutsk, // 9 Jakutsk // http://www.timeanddate.com/library/abbreviations/timezones tctx_tz_A, // 1 Alpha Time Zone tctx_tz_ACDT, // 10.5 Australian Central Daylight Time Australia tctx_tz_ACST, // 9.5 Australian Central Standard Time Australia tctx_tz_ADT, // -3 Atlantic Daylight Time North America tctx_tz_AEDT, // 11 Australian Eastern Daylight Time Australia tctx_tz_AEST, // 10 Australian Eastern Standard Time Australia tctx_tz_AKDT, // -8 Alaska Daylight Time North America tctx_tz_AKST, // -9 Alaska Standard Time North America tctx_tz_AST, // -4 Atlantic Standard Time North America tctx_tz_AWST, // 8 Australian Western Standard Time Australia tctx_tz_B, // 2 Bravo Time Zone tctx_tz_BST, // 1 British Summer Time Europe tctx_tz_C, // 3 Charlie Time Zone tctx_tz_CDT, // -5 Central Daylight Time North America tctx_tz_CEST, // 2 Central European Summer Time Europe tctx_tz_CET, // 1 Central European Time Europe tctx_tz_CST, // -6 Central Standard Time North America tctx_tz_CXT, // 7 Christmas Island Time Australia tctx_tz_D, // 4 Delta Time Zone tctx_tz_E, // 5 Echo Time Zone tctx_tz_EDT, // -4 Eastern Daylight Time North America tctx_tz_EEST, // 3 Eastern European Summer Time Europe tctx_tz_EET, // 2 Eastern European Time Europe tctx_tz_EST, // -5 Eastern Standard Time North America tctx_tz_F, // 6 Foxtrot Time Zone tctx_tz_G, // 7 Golf Time Zone tctx_tz_H, // 8 Hotel Time Zone tctx_tz_HAA, // -3 Heure Avancee de l'Atlantique North America tctx_tz_HAC, // -5 Heure Avancee du Centre North America tctx_tz_HADT, // -9 Hawaii-Aleutian Daylight Time North America tctx_tz_HAE, // -4 Heure Avancee de l'Est North America tctx_tz_HAP, // -7 Heure Avancee du Pacifique North America tctx_tz_HAR, // -6 Heure Avancee des Rocheuses North America tctx_tz_HAST, // -10 Hawaii-Aleutian Standard Time North America tctx_tz_HAT, // -1.5 Heure Avancee de Terre-Neuve North America tctx_tz_HAY, // -8 Heure Avancee du Yukon North America tctx_tz_HNA, // -4 Heure Normale de l'Atlantique North America tctx_tz_HNC, // -6 Heure Normale du Centre North America tctx_tz_HNE, // -5 Heure Normale de l'Est North America tctx_tz_HNP, // -8 Heure Normale du Pacifique North America tctx_tz_HNR, // -7 Heure Normale des Rocheuses North America tctx_tz_HNT, // -2.5 Heure Normale de Terre-Neuve North America tctx_tz_HNY, // -9 Heure Normale du Yukon North America tctx_tz_I, // 9 India Time Zone tctx_tz_IST, // 1 Irish Summer Time Europe tctx_tz_K, // 10 Kilo Time Zone tctx_tz_L, // 11 Lima Time Zone tctx_tz_M, // 12 Mike Time Zone tctx_tz_MDT, // -6 Mountain Daylight Time North America tctx_tz_MESZ, // 2 Mitteleuropaeische Sommerzeit Europe tctx_tz_MEZ, // 1 Mitteleuropaeische Zeit Europe tctx_tz_MST, // -7 Mountain Standard Time North America tctx_tz_N, // -1 November Time Zone tctx_tz_NDT, // -1.5 Newfoundland Daylight Time North America tctx_tz_NFT, // 11.5 Norfolk (Island) Time Australia tctx_tz_NST, // -2.5 Newfoundland Standard Time North America tctx_tz_O, // -2 Oscar Time Zone tctx_tz_P, // -3 Papa Time Zone tctx_tz_PDT, // -7 Pacific Daylight Time North America tctx_tz_PST, // -8 Pacific Standard Time North America tctx_tz_Q, // -4 Quebec Time Zone tctx_tz_R, // -5 Romeo Time Zone tctx_tz_S, // -6 Sierra Time Zone tctx_tz_T, // -7 Tango Time Zone tctx_tz_U, // -8 Uniform Time Zone tctx_tz_V, // -9 Victor Time Zone tctx_tz_W, // -10 Whiskey Time Zone tctx_tz_WEST, // 1 Western European Summer Time Europe tctx_tz_WET, // 0 Western European Time Europe tctx_tz_WST, // 8 Western Standard Time Australia tctx_tz_X, // -11 X-ray Time Zone tctx_tz_Y, // -12 Yankee Time Zone tctx_tz_Z, // 0 Zulu Time Zone // size of enum tctx_numtimezones } TTimeZones; #ifdef TIMEZONES_INTERNAL typedef struct { short wMonth; short wDayOfWeek; short wNth; // nth occurance short wHour; short wMinute; } tbl_tChange; typedef struct { const char* name; const char* olsonName; short bias; short biasDST; const char* ident; const char* dynYear; tbl_tChange dst; tbl_tChange std; } tbl_tz_entry; const tbl_tz_entry tbl_tz[tctx_numtimezones] = { { "unknown", NULL, 0, 0, "x", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 0 { "system", NULL, 0, 0, "x", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 0 { "UTC", NULL, 0, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 0 { "Afghanistan", "Asia/Kabul", 270, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 4.5 { "AKST/AKDT", "America/Anchorage", -540, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -9 { "AKST/AKDT", "America/Anchorage", -540, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -9 { "AKST/AKDT", "America/Anchorage", -540, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -9 { "HNY/NAY", "America/Anchorage", -540, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -9 { "HNY/NAY", "America/Anchorage", -540, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -9 { "HNY/NAY", "America/Anchorage", -540, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -9 { "Alaskan", "America/Anchorage", -540, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -9 { "Alaskan", "America/Anchorage", -540, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -9 { "Alaskan", "America/Anchorage", -540, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -9 { "Arab", "Asia/Riyadh", 180, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3 { "Arabian", "Asia/Dubai", 240, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 4 { "Arabic", "Asia/Baghdad", 180, 60, " ", "", { 4, 0,1, 3,0 }, { 10, 0,1, 4,0 } }, // 3 { "AST/ADT", "America/Halifax", -240, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -4 { "AST/ADT", "America/Halifax", -240, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -4 { "AST/ADT", "America/Halifax", -240, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -4 { "HNA/HAA", "America/Halifax", -240, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -4 { "HNA/HAA", "America/Halifax", -240, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -4 { "HNA/HAA", "America/Halifax", -240, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -4 { "Atlantic", "America/Halifax", -240, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -4 { "Atlantic", "America/Halifax", -240, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -4 { "Atlantic", "America/Halifax", -240, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -4 { "ART/ARST", "America/Buenos_Aires", -180, 60, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -3 { "ART/ARST", "America/Buenos_Aires", -180, 60, " ","2006", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -3 { "ART/ARST", "America/Buenos_Aires", -180, 60, " ","2007", { 12,-1,29,23,59}, { 1,-1,1, 0,0 } }, // -3 { "ART/ARST", "America/Buenos_Aires", -180, 60, " ","2008", { 10, 6,3,23,59}, { 3, 6,3,23,59} }, // -3 { "ART/ARST", "America/Buenos_Aires", -180, 60, " ","2009", { 10, 6,3,23,59}, { 3, 6,2,23,59} }, // -3 { "AUS_Central", "Australia/Darwin", 570, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 9.5 { "AUS_Eastern", "Australia/Sydney", 600, 60, " ", "", { 10, 0,5, 2,0 }, { 3, 0,5, 3,0 } }, // 10 { "Azerbaijan", "Asia/Baku", 240, 60, " ", "", { 3, 0,5, 4,0 }, { 10, 0,5, 5,0 } }, // 4 { "Azores", "Atlantic/Azores", -60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // -1 { "Canada_Central", "America/Regina", -360, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "Cape_Verde", "Atlantic/Cape_Verde", -60, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -1 { "Caucasus", "Asia/Tbilisi", 240, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 4 { "ACST/ACDT", "Australia/Adelaide", 570, 60, " ", "", { 10, 0,5, 2,0 }, { 3, 0,5, 3,0 } }, // 9.5 { "Central_Australia", "Australia/Adelaide", 570, 60, " ", "", { 10, 0,5, 2,0 }, { 3, 0,5, 3,0 } }, // 9.5 { "Central_America", "America/Guatemala", -360, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "Central_Asia", "Asia/Dhaka", 360, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 6 { "Central_Brazilian", "America/Manaus", -240, 60, " ", "", { 11, 0,1, 0,0 }, { 2, 0,5, 0,0 } }, // -4 { "Central_Brazilian", "America/Manaus", -240, 60, " ","2006", { 11, 0,1, 0,0 }, { 2, 0,2, 2,0 } }, // -4 { "Central_Brazilian", "America/Manaus", -240, 60, " ","2007", { 11, 0,1, 0,0 }, { 2, 0,5, 0,0 } }, // -4 { "CET/CEST", "Europe/Zurich", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "MEZ/MESZ", "Europe/Berlin", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "Central_Europe", "Europe/Budapest", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "Central_European", "Europe/Warsaw", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "Central_Pacific", "Pacific/Guadalcanal", 660, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 11 { "CST/CDT", "America/Chicago", -360, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -6 { "CST/CDT", "America/Chicago", -360, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -6 { "CST/CDT", "America/Chicago", -360, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -6 { "HNC/HAC", "America/Chicago", -360, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -6 { "HNC/HAC", "America/Chicago", -360, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -6 { "HNC/HAC", "America/Chicago", -360, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -6 { "Central", "America/Chicago", -360, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -6 { "Central", "America/Chicago", -360, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -6 { "Central", "America/Chicago", -360, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -6 { "Central_Mexico", "America/Mexico_City", -360, 60, " ", "", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -6 { "China", "Asia/Shanghai", 480, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "Dateline", "Etc/GMT+12", -720, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -12 { "East_Africa", "Africa/Nairobi", 180, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3 { "AEST/AEDT", "Australia/Brisbane", 600, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 10 { "East_Australia", "Australia/Brisbane", 600, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 10 { "EET/EEST", "Europe/Minsk", 120, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 2 { "East_Europe", "Europe/Minsk", 120, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 2 { "East_South_America","America/Sao_Paulo", -180, 60, " ", "", { 11, 0,1, 0,0 }, { 2, 0,5, 0,0 } }, // -3 { "East_South_America","America/Sao_Paulo", -180, 60, " ","2006", { 11, 0,1, 0,0 }, { 2, 0,2, 2,0 } }, // -3 { "East_South_America","America/Sao_Paulo", -180, 60, " ","2007", { 11, 0,1, 0,0 }, { 2, 0,5, 0,0 } }, // -3 { "EST/EDT", "America/New_York", -300, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -5 { "EST/EDT", "America/New_York", -300, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -5 { "EST/EDT", "America/New_York", -300, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -5 { "HNE/HAE", "America/New_York", -300, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -5 { "HNE/HAE", "America/New_York", -300, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -5 { "HNE/HAE", "America/New_York", -300, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -5 { "Eastern", "America/New_York", -300, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -5 { "Eastern", "America/New_York", -300, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -5 { "Eastern", "America/New_York", -300, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -5 { "Egypt", "Africa/Cairo", 120, 60, " ", "", { 4, 4,5,23,59 }, { 9, 4,5,23,59 }}, // 2 { "Ekaterinburg", "Asia/Yekaterinburg", 300, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 5 { "Fiji", "Pacific/Fiji", 720, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 12 { "FLE", "Europe/Kiev", 120, 60, " ", "", { 3, 0,5, 3,0 }, { 10, 0,5, 4,0 } }, // 2 { "Georgian", "Etc/GMT-3", 180, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3 { "GMT", "Europe/London", 0, 60, " ", "", { 3, 0,5, 1,0 }, { 10, 0,5, 2,0 } }, // 0 { "Greenland", "America/Godthab", -180, 60, " ", "", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -3 { "Greenwich", "Africa/Casablanca", 0, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 0 { "GTB", "Europe/Istanbul", 120, 60, " ", "", { 3, 0,5, 3,0 }, { 10, 0,5, 4,0 } }, // 2 { "HST/HPT", "Pacific/Honolulu", -600, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -10 { "HAST/HADT", "Pacific/Honolulu", -600, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -10 { "Hawaiian", "Pacific/Honolulu", -600, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -10 { "India", "Asia/Calcutta", 330, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 5.5 { "Iran", "Asia/Tehran", 210, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3.5 { "Iran", "Asia/Tehran", 210, 60, " ","2005", { 3, 0,1, 2,0 }, { 9, 2,4, 2,0 } }, // 3.5 { "Iran", "Asia/Tehran", 210, 0, " ","2006", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3.5 { "Israel", "Asia/Jerusalem", 120, 60, " ", "", { 3, 5,5, 2,0 }, { 9, 0,3, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 0, " ","2004", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2005", { 4,-1,1, 2,0 }, { 10,-1,9, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2006", { 3,-1,31,2,0 }, { 10,-1,1, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2007", { 3,-1,30,2,0 }, { 9,-1,16,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2008", { 3,-1,28,2,0 }, { 10,-1,5, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2009", { 3,-1,27,2,0 }, { 9,-1,27,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2010", { 3,-1,26,2,0 }, { 9,-1,12,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2011", { 4,-1,1, 2,0 }, { 10,-1,2, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2012", { 3,-1,30,2,0 }, { 9,-1,23,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2013", { 3,-1,29,2,0 }, { 9,-1,8, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2014", { 3,-1,28,2,0 }, { 9,-1,28,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2015", { 3,-1,27,2,0 }, { 9,-1,20,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2016", { 4,-1,1, 2,0 }, { 10,-1,9, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2017", { 3,-1,31,2,0 }, { 9,-1,24,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2018", { 3,-1,30,2,0 }, { 9,-1,16,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2019", { 3,-1,29,2,0 }, { 10,-1,6, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2020", { 3,-1,27,2,0 }, { 9,-1,27,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2021", { 3,-1,26,2,0 }, { 9,-1,12,2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 60, " ","2022", { 4,-1,1, 2,0 }, { 10,-1,2, 2,0 } }, // 2 { "Israel", "Asia/Jerusalem", 120, 0, " ","2023", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "Jordan", "Asia/Amman", 120, 60, " ", "", { 3, 4,5, 0,0 }, { 9, 5,5, 1,0 } }, // 2 { "Korea", "Asia/Seoul", 540, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 9 { "Mexico", "America/Mexico_City", -360, 60, " ", "", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -6 { "Mexico_2", "America/Chihuahua", -420, 60, " ", "", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -7 { "Mid_Atlantic", "Atlantic/South_Georgia", -120, 60, " ", "", { 3, 0,5, 2,0 }, { 9, 0,5, 2,0 } }, // -2 { "Middle_East", "Asia/Beirut", 120, 60, " ", "", { 3, 0,5, 0,0 }, { 10, 6,5,23,59 }}, // 2 { "Montevideo", "America/Montevideo", -180, 60, " ", "", { 10, 0,1, 2,0 }, { 3, 0,2, 2,0 } }, // -3 { "MST/MDT", "America/Denver", -420, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -7 { "MST/MDT", "America/Denver", -420, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -7 { "MST/MDT", "America/Denver", -420, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -7 { "HNR/HAR", "America/Denver", -420, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -7 { "HNR/HAR", "America/Denver", -420, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -7 { "HNR/HAR", "America/Denver", -420, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -7 { "Mountain", "America/Denver", -420, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -7 { "Mountain", "America/Denver", -420, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -7 { "Mountain", "America/Denver", -420, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -7 { "Mountain_Mexico", "America/Chihuahua", -420, 60, " ", "", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -7 { "Myanmar", "Asia/Rangoon", 390, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 6.5 { "North_Central_Asia","Asia/Novosibirsk", 360, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 6 { "Namibia", "Africa/Windhoek", 120,-60, " ", "", { 4, 0,1, 2,0 }, { 9, 0,1, 2,0 } }, // 2 { "Nepal", "Asia/Katmandu", 345, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 5.75 { "New_Zealand", "Pacific/Auckland", 720, 60, " ", "", { 10, 0,1, 2,0 }, { 3, 0,3, 3,0 } }, // 12 { "NST/NDT", "America/St_Johns", -210, 60, " ", "", { 3, 0,2, 0,1 }, { 11, 0,1, 0,1 } }, // -3.5 { "NST/NDT", "America/St_Johns", -210, 60, " ","2006", { 4, 0,1, 0,1 }, { 10, 0,5, 0,0 } }, // -3.5 { "NST/NDT", "America/St_Johns", -210, 60, " ","2007", { 3, 0,2, 0,1 }, { 11, 0,1, 0,0 } }, // -3.5 { "HNT/HAT", "America/St_Johns", -210, 60, " ", "", { 3, 0,2, 0,1 }, { 11, 0,1, 0,1 } }, // -3.5 { "HNT/HAT", "America/St_Johns", -210, 60, " ","2006", { 4, 0,1, 0,1 }, { 10, 0,5, 0,0 } }, // -3.5 { "HNT/HAT", "America/St_Johns", -210, 60, " ","2007", { 3, 0,2, 0,1 }, { 11, 0,1, 0,0 } }, // -3.5 { "Newfoundland", "America/St_Johns", -210, 60, " ", "", { 3, 0,2, 0,1 }, { 11, 0,1, 0,1 } }, // -3.5 { "Newfoundland", "America/St_Johns", -210, 60, " ","2006", { 4, 0,1, 0,1 }, { 10, 0,5, 0,0 } }, // -3.5 { "Newfoundland", "America/St_Johns", -210, 60, " ","2007", { 3, 0,2, 0,1 }, { 11, 0,1, 0,0 } }, // -3.5 { "North_Asia_East", "Asia/Irkutsk", 480, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 8 { "North_Asia", "Asia/Krasnoyarsk", 420, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 7 { "Pacific_SA", "America/Santiago", -240, 60, " ", "", { 10, 6,2,23,59 }, { 3, 6,2,23,59 }}, // -4 { "PST/PDT", "America/Los_Angeles", -480, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -8 { "PST/PDT", "America/Los_Angeles", -480, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -8 { "PST/PDT", "America/Los_Angeles", -480, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -8 { "HNP/HAP", "America/Los_Angeles", -480, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -8 { "HNP/HAP", "America/Los_Angeles", -480, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -8 { "HNP/HAP", "America/Los_Angeles", -480, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -8 { "Pacific", "America/Los_Angeles", -480, 60, " ", "", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -8 { "Pacific", "America/Los_Angeles", -480, 60, " ","2006", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -8 { "Pacific", "America/Los_Angeles", -480, 60, " ","2007", { 3, 0,2, 2,0 }, { 11, 0,1, 2,0 } }, // -8 { "Pacific_Mexico", "America/Tijuana", -480, 60, " ", "", { 4, 0,1, 2,0 }, { 10, 0,5, 2,0 } }, // -8 { "Romance", "Europe/Paris", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "Russian", "Europe/Moscow", 180, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 3 { "SA_Eastern", "Etc/GMT+3", -180, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -3 { "SA_Pacific", "America/Bogota", -300, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "SA_Western", "America/La_Paz", -240, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -4 { "Samoa", "Pacific/Apia", -660, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -11 { "SE_Asia", "Asia/Bangkok", 420, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 7 { "Singapore", "Asia/Singapore", 480, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "South_Africa", "Africa/Johannesburg", 120, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "Sri_Lanka", "Asia/Colombo", 330, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 5.5 { "Taipei", "Asia/Taipei", 480, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "Tasmania", "Australia/Hobart", 600, 60, " ", "", { 10, 0,1, 2,0 }, { 3, 0,5, 3,0 } }, // 10 { "Tokyo", "Asia/Tokyo", 540, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 9 { "Tonga", "Pacific/Tongatapu", 780, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 13 { "US_Eastern", "Etc/GMT+5", -300, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "US_Mountain", "America/Phoenix", -420, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -7 { "Vladivostok", "Asia/Vladivostok", 600, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 10 { "West_Australia", "Australia/Perth", 480, 60, " ", "", { 10, 0,5, 2,0 }, { 3, 0,5, 3,0 } }, // 8 { "West_Australia", "Australia/Perth", 480, 0, " ","2005", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "West_Australia", "Australia/Perth", 480, 60, " ","2006", { 12,-1,1, 2,0 }, { 1,-1,1, 0,0 } }, // 8 { "West_Australia", "Australia/Perth", 480, 60, " ","2007", { 10, 0,5, 2,0 }, { 3, 0,5, 3,0 } }, // 8 { "West_Central_Africa","Africa/Lagos", 60, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "WET/WEST", "Europe/Berlin", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "West_Europe", "Europe/Berlin", 60, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 1 { "West_Asia", "Asia/Karachi", 300, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 5 { "West_Pacific", "Pacific/Port_Moresby", 600, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 10 { "Yakutsk", "Asia/Yakutsk", 540, 60, " ", "", { 3, 0,5, 2,0 }, { 10, 0,5, 3,0 } }, // 9 { "A", NULL, 60, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "ACDT", NULL, 630, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 10.5 { "ACST", NULL, 570, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 9.5 { "ADT", NULL, -180, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -3 { "AEDT", NULL, 660, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 11 { "AEST", NULL, 600, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 10 { "AKDT", NULL, -480, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -8 { "AKST", NULL, -540, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -9 { "AST", NULL, -240, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -4 { "AWST", NULL, 480, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "B", NULL, 120, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "BST", NULL, 60, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "C", NULL, 180, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3 { "CDT", NULL, -300, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "CEST", NULL, 120, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "CET", NULL, 60, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "CST", NULL, -360, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "CXT", NULL, 420, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 7 { "D", NULL, 240, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 4 { "E", NULL, 300, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 5 { "EDT", NULL, -240, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -4 { "EEST", NULL, 180, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 3 { "EET", NULL, 120, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "EST", NULL, -300, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "F", NULL, 360, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 6 { "G", NULL, 420, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 7 { "H", NULL, 480, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "HAA", NULL, -180, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -3 { "HAC", NULL, -300, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "HADT", NULL, -540, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -9 { "HAE", NULL, -240, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -4 { "HAP", NULL, -420, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -7 { "HAR", NULL, -360, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "HAST", NULL, -600, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -10 { "HAT", NULL, -90, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -1.5 { "HAY", NULL, -480, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -8 { "HNA", NULL, -240, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -4 { "HNC", NULL, -360, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "HNE", NULL, -300, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "HNP", NULL, -480, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -8 { "HNR", NULL, -420, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -7 { "HNT", NULL, -150, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -2.5 { "HNY", NULL, -540, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -9 { "I", NULL, 540, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 9 { "IST", NULL, 60, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "K", NULL, 600, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 10 { "L", NULL, 660, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 11 { "M", NULL, 720, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 12 { "MDT", NULL, -360, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "MESZ", NULL, 120, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 2 { "MEZ", NULL, 60, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "MST", NULL, -420, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -7 { "N", NULL, -60, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -1 { "NDT", NULL, -90, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -1.5 { "NFT", NULL, 690, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 11.5 { "NST", NULL, -150, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -2.5 { "O", NULL, -120, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -2 { "P", NULL, -180, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -3 { "PDT", NULL, -420, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -7 { "PST", NULL, -480, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -8 { "Q", NULL, -240, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -4 { "R", NULL, -300, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -5 { "S", NULL, -360, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -6 { "T", NULL, -420, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -7 { "U", NULL, -480, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -8 { "V", NULL, -540, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -9 { "W", NULL, -600, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -10 { "WEST", NULL, 60, 0, "d", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 1 { "WET", NULL, 0, 0, "s", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 0 { "WST", NULL, 480, 0, " ", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 8 { "X", NULL, -660, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -11 { "Y", NULL, -720, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // -12 { "Z", NULL, 0, 0, "m", "", { 0, 0,0, 0,0 }, { 0, 0,0, 0,0 } }, // 0 }; #endif // TIMEZONES_INTERNAL #endif // TZ_TABLE_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync/uiapi.cpp0000755000373300037200000000621212424517753024464 0ustar00nightlyallusers00000000000000/* * File: uiapi.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * TUI_Api class * Bridge to user programmable interface * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ /* * The "TUI_Api" class acts as a standard interface between * the SySync Server and a (user programmable) module "sync_uiapi". * * It is possible to have more than one (identical) interface module, * either packed into a DLL or directly linked to the server * (or combined). * */ #include "uiapi.h" #include "sync_uiapi.h" namespace sysync { /* ---- "DB_Api_Config" implementation ------------------------------------- */ TUI_Api:: TUI_Api() { fConnected= false; uCreated= false; } // constructor TUI_Api::~TUI_Api() { /* empty */ } // destructor /* Create a context */ TSyError TUI_Api::CreateContext( cAppCharP uiName, TDB_Api_Config &config ) { typedef TSyError (*CreateU_Func)( CContext *uContext, cAppCharP uiName, DB_Callback uCB ); if (uCreated) return DB_Forbidden; uName= uiName; // make a local copy dm= &config.m; // assign reference to the methods CreateU_Func p= (CreateU_Func)dm->ui.UI_CreateContext; DB_Callback uCB= &fCB.Callback; CContext* uc= &uCB->mContext; // store it at a temporary var *uc= 0; // set it to check later, if changed uCB->cContext= config.mContext; // inherit info uContext= 0; uCB->mContext= config.fCB.Callback.mContext; TSyError err= p( &uContext, uName.c_str(), uCB ); if (!err) { uCreated= true; if (*uc==0) *uc= uContext; // assign for datastores, but only if not assigned in plug-in module } // if return err; } // CreateContext // Run the UI API TSyError TUI_Api::RunContext() { if (!uCreated) return DB_Forbidden; Context_Func p= (Context_Func)dm->ui.UI_RunContext; TSyError err= p( uContext ); return err; } // RunContext TSyError TUI_Api::DeleteContext() { if (!uCreated) return DB_Forbidden; Context_Func p= (Context_Func)dm->ui.UI_DeleteContext; TSyError err= p( uContext ); if (!err) uCreated= false; return err; } // DeleteContext // Connect the UI API TSyError TUI_Api::Connect( cAppCharP moduleName, cAppCharP mContextName, bool aIsLib, bool allowDLL ) { m= new TDB_Api_Config; m->fCB= fCB; CContext gContext= 0; TSyError err= m->Connect( moduleName, gContext, mContextName, aIsLib,allowDLL ); if (!err) { err= CreateContext( moduleName, *m ); } // if if (err) delete m; else fConnected= true; printf( "TUI connected err=%d\n", err ); return err; } // Connect // Disconnect the UI API TSyError TUI_Api::Disconnect() { if (!fConnected) return DB_Forbidden; TSyError err= DeleteContext(); if (!err) { err= m->Disconnect(); if (!err) { delete m; fConnected= false; } } // if printf( "TUI disconnected err=%d\n", err ); return err; } // Disconnect } // namespace /* eof */ syncevolution-1.5/src/synthesis/src/sysync/uiapi.h0000644000373300037200000000332712424517753024132 0ustar00nightlyallusers00000000000000/* * File: uiapi.h * * Author: Beat Forster (bfo@synthesis.ch) * * TUI_Api class * Bridge to user programmable interface * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ /* * The "TUI_Api" class acts as a standard interface between * the SySync Server and a (user programmable) module "sync_uiapi". * * It is possible to have more than one (identical) interface module, * either packed into a DLL or directly linked to the server * (or combined). * */ #ifndef UI_API_H #define UI_API_H // access to the definitions of the interface #include "sync_dbapidef.h" #include "dbapi.h" namespace sysync { class TUI_Api { public: TUI_Api(); // constructor ~TUI_Api(); // destructor // Connect to the plug-in with TSyError Connect( const char* moduleName, const char* mContextName= "", bool aIsLib= false, bool allowDLL= true ); bool Connected() { return fConnected; } // read status of // Run the UI API TSyError RunContext(); // Disconnect the UI API TSyError Disconnect(); TDB_Api_Callback fCB; // Callback wrapper private: TSyError CreateContext( const char* uiName, TDB_Api_Config &config ); TSyError DeleteContext(); bool fConnected; // if successfully connected to module TDB_Api_Config* m; // the module behind API_Methods* dm; // local reference to the API methods CContext uContext; // The UI context bool uCreated; // if successfully connected to ui context string uName; // local copy of }; // class TUI_Api } // namespace #endif // UI_API_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync/vcalendaritemtype.cpp0000755000373300037200000001631312424517753027100 0ustar00nightlyallusers00000000000000/* * File: VCalendarItemType.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TVCalendarItemType * vCalendar item type, based on MIME-DIR Item Type, uses * TMultiFieldItem as data item. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-09-25 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "vcalendaritemtype.h" #include "rrules.h" using namespace sysync; namespace sysync { /* version info table */ const struct { sInt32 profilemode; const char* typetext; const char* versiontext; } VCalendarVersionInfo[numVCalendarVersions-1] = { // vCalendar 1.0 { PROFILEMODE_OLD, "text/x-vcalendar","1.0" }, // iCalendar 2.0 { PROFILEMODE_MIMEDIR, "text/calendar","2.0" } }; // available vCard versions const char * const vCalendarVersionNames[numVCalendarVersions] = { "1.0", "2.0", "none" }; // VCalendar config // init defaults void TVCalendarTypeConfig::clear(void) { // clear properties fVCalendarVersion=vcalendar_vers_none; // clear inherited inherited::clear(); } // TVCalendarTypeConfig::clear // create Sync Item Type of appropriate type from config TSyncItemType *TVCalendarTypeConfig::newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP) { return new TVCalendarItemType( aSessionP, this, fTypeName.c_str(), fTypeVersion.c_str(), aDatastoreP, fMIMEProfileP->fFieldListP ); } // TVCalendarTypeConfig::newSyncItemType // resolve (note: needed even if not configurable!) void TVCalendarTypeConfig::localResolve(bool aLastPass) { // pre-set profile mode if a predefined vCard mode is selected if (fVCalendarVersion!=vcalendar_vers_none) { fProfileMode = VCalendarVersionInfo[fVCalendarVersion].profilemode; // also set these, but getTypeName()/getTypeVers() do not use them (but required for syntax check) fTypeName = VCalendarVersionInfo[fVCalendarVersion].typetext; fTypeVersion = VCalendarVersionInfo[fVCalendarVersion].versiontext; } // resolve inherited inherited::localResolve(aLastPass); } // TVCalendarTypeConfig::localResolve #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TVCalendarTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"version")==0) expectEnum(sizeof(fVCalendarVersion),&fVCalendarVersion,vCalendarVersionNames,numVCalendarVersions); else return TMIMEDirTypeConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TVCalendarTypeConfig::localStartElement #endif /* * Implementation of TVCalendarItemType */ /* public TVCalendarItemType members */ // private helper TVCalendarVersion TVCalendarItemType::getVCalenderVersionByMode(sInt32 aMode) { if (aMode!=PROFILEMODE_DEFAULT) { for (int v=vcalendar_vers_1_0; v0 ? v : 0); #else return 0; // not expired #endif } // TVCalendarItemType::expiryFromData #endif // APP_CAN_EXPIRE #ifdef OBJECT_FILTERING // get field index of given filter expression identifier. sInt16 TVCalendarItemType::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // check if explicit field level identifier if (strucmp(aIdentifier,"F.",2)==0) { // explicit field identifier, skip property lookup return TMultiFieldItemType::getFilterIdentifierFieldIndex(aIdentifier+2,aIndex); } else { // translate SyncML-defined abstracts if (strucmp(aIdentifier,"START")==0) return inherited::getFilterIdentifierFieldIndex("DTSTART",0); else if (strucmp(aIdentifier,"END")==0) return inherited::getFilterIdentifierFieldIndex("DTEND",0); } // simply search for matching property names return inherited::getFilterIdentifierFieldIndex(aIdentifier,aIndex); } // TVCalendarItemType::getFilterIdentifierFieldIndex #endif // helper to create same-typed instance via base class TSyncItemType *TVCalendarItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TVCalendarItemType,DBG_OBJINST,"TVCalendarItemType",TVCalendarItemType( aSessionP, fTypeConfigP, getTypeName(), getTypeVers(), aDatastoreP, fFieldDefinitionsP )); } // TVCalendarItemType::newCopyForSameType } // namespace sysync /* end of TVCalendarItemType implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/vcalendaritemtype.h0000755000373300037200000000720712424517753026547 0ustar00nightlyallusers00000000000000/* * File: VCalendarItemType.h * * Author: Lukas Zeller (luz@plan44.ch) * * TVCalendarItemType * vCalendar item type, based on MIME-DIR Item Type, uses * TMultiFieldItem as data item. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-09-25 : luz : created * */ #ifndef VCalendarItemType_H #define VCalendarItemType_H // includes #include "mimediritemtype.h" using namespace sysync; namespace sysync { // vCalendar variants typedef enum { vcalendar_vers_1_0, vcalendar_vers_2_0, vcalendar_vers_none, numVCalendarVersions } TVCalendarVersion; // Vcalendar based datatype class TVCalendarTypeConfig : public TMIMEDirTypeConfig { typedef TMIMEDirTypeConfig inherited; public: TVCalendarTypeConfig(const char *aElementName, TConfigElement *aParentElementP) : TMIMEDirTypeConfig(aElementName,aParentElementP) {}; // properties TVCalendarVersion fVCalendarVersion; // public functions // - create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP); protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); virtual void clear(); }; // TVCalendarTypeConfig const uInt16 ity_vcalendar=103; // must be unique class TVCalendarItemType: public TMimeDirItemType { typedef TMimeDirItemType inherited; public: // constructor TVCalendarItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ) : TMimeDirItemType( aSessionP, aTypeConfigP, aCTType, aVerCT, aRelatedDatastoreP, aFieldDefinitions ) { fVCalendarVersion = static_cast(aTypeConfigP)->fVCalendarVersion; }; // destructor virtual ~TVCalendarItemType() {}; // access to type virtual uInt16 getTypeID(void) const { return ity_vcalendar; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_vcalendar ? true : TMimeDirItemType::isBasedOn(aItemTypeID); }; // get type name / vers virtual cAppCharP getTypeName(sInt32 aMode=0); virtual cAppCharP getTypeVers(sInt32 aMode=0); // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // vCard is an implemented data type // relaxed type comparison, taking into account common errors in real-world implementations virtual bool supportsType(const char *aName, const char *aVers, bool aVersMustMatch=false); // try to extract a version string from actual item data, false if none virtual bool versionFromData(SmlItemPtr_t aItemP, string &aString); #ifdef APP_CAN_EXPIRE // test if modified date of item is expired virtual sInt32 expiryFromData(SmlItemPtr_t aItemP, lineardate_t &aDat); #endif // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); #ifdef OBJECT_FILTERING // find field index for filter identifier virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); #endif private: TVCalendarVersion getVCalenderVersionByMode(sInt32 aMode); // vCard version TVCalendarVersion fVCalendarVersion; }; // TVCalendarItemType } // namespace sysync #endif // VCalendarItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/vcarditemtype.cpp0000755000373300037200000001746012424517753026244 0ustar00nightlyallusers00000000000000/* * File: VCardItemType.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TVCardItemType * vCard item type, based on MIME-DIR Item Type, uses * TMultiFieldItem as data item. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-20 : luz : created * */ // includes #include "prefix_file.h" #include "sysync.h" #include "vcarditemtype.h" using namespace sysync; /* version info table */ const struct { sInt32 profilemode; const char* typetext; const char* versiontext; } VCardVersionInfo[numVCardVersions-1] = { // vCard 2.1 { PROFILEMODE_OLD, "text/x-vcard","2.1" }, // vCard 3.0 { PROFILEMODE_MIMEDIR, "text/vcard","3.0" } }; // available vCard versions const char * const vCardVersionNames[numVCardVersions] = { "2.1", "3.0", "none" }; // VCard config // init defaults void TVCardTypeConfig::clear(void) { // clear properties fVCardVersion=vcard_vers_none; // clear inherited inherited::clear(); } // TVCardTypeConfig::clear // create Sync Item Type of appropriate type from config TSyncItemType *TVCardTypeConfig::newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP) { return new TVCardItemType( aSessionP, this, fTypeName.c_str(), fTypeVersion.c_str(), aDatastoreP, fMIMEProfileP->fFieldListP ); } // TVCardTypeConfig::newSyncItemType // resolve (note: needed even if not configurable!) void TVCardTypeConfig::localResolve(bool aLastPass) { // pre-set profile mode if a predefined vCard mode is selected if (fVCardVersion!=vcard_vers_none) { fProfileMode=VCardVersionInfo[fVCardVersion].profilemode; // also set these, but getTypeName()/getTypeVers() do not use them (but required for syntax check) fTypeName = VCardVersionInfo[fVCardVersion].typetext; fTypeVersion = VCardVersionInfo[fVCardVersion].versiontext; } // resolve inherited inherited::localResolve(aLastPass); } // TVCardTypeConfig::localResolve #ifdef CONFIGURABLE_TYPE_SUPPORT // config element parsing bool TVCardTypeConfig::localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine) { // checking the elements if (strucmp(aElementName,"version")==0) expectEnum(sizeof(fVCardVersion),&fVCardVersion,vCardVersionNames,numVCardVersions); else return TMIMEDirTypeConfig::localStartElement(aElementName,aAttributes,aLine); // ok return true; } // TVCardTypeConfig::localStartElement #endif /* * Implementation of TVCardItemType */ // private helper TVCardVersion TVCardItemType::getVCardVersionByMode(sInt32 aMode) { if (aMode!=PROFILEMODE_DEFAULT) { for (int v=vcard_vers_2_1; v0 ? v : 0); #else return 0; // not expired #endif } // TVCardItemType::expiryFromData #endif // APP_CAN_EXPIRE #ifdef OBJECT_FILTERING // get field index of given filter expression identifier. sInt16 TVCardItemType::getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex) { // check if explicit field level identifier if (strucmp(aIdentifier,"F.",2)==0) { // explicit field identifier, skip property lookup return TMultiFieldItemType::getFilterIdentifierFieldIndex(aIdentifier+2,aIndex); } else { // translate SyncML-defined abstracts if (strucmp(aIdentifier,"FAMILY")==0) { TPropertyDefinition *propP = fProfileHandlerP->getProfileDefinition()->getPropertyDef("N"); if (propP) { // value with convdef index 0 is family (last) name if (propP->numValues>0) return propP->convdefs[0].fieldid; } return VARIDX_UNDEFINED; } else if (strucmp(aIdentifier,"GIVEN")==0) { TPropertyDefinition *propP = fProfileHandlerP->getProfileDefinition()->getPropertyDef("N"); if (propP) { // value with convdef index 1 is given (first) name if (propP->numValues>1) return propP->convdefs[1].fieldid; } return VARIDX_UNDEFINED; } else if (strucmp(aIdentifier,"GROUP")==0) { return inherited::getFilterIdentifierFieldIndex("CATEGORIES",0); } } // simply search for matching property names return inherited::getFilterIdentifierFieldIndex(aIdentifier,aIndex); } // TVCardItemType::getFilterIdentifierFieldIndex void TVCardItemType::addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc) { // add my own properties addPCDataStringToList("GROUP", &aFilterKeywords); // add basics inherited::addFilterCapPropsAndKeywords(aFilterKeywords,aFilterProps,aVariantDesc); } // TVCardItemType::addFilterCapPropsAndKeywords #endif // helper to create same-typed instance via base class TSyncItemType *TVCardItemType::newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ) { // create new itemtype of appropriate derived class type that can handle // this type MP_RETURN_NEW(TVCardItemType,DBG_OBJINST,"TVCardItemType",TVCardItemType( aSessionP, fTypeConfigP, getTypeName(), getTypeVers(), aDatastoreP, fFieldDefinitionsP )); } // TVCardItemType::newCopyForSameType /* end of TVCardItemType implementation */ // eof syncevolution-1.5/src/synthesis/src/sysync/vcarditemtype.h0000755000373300037200000000742312424517753025707 0ustar00nightlyallusers00000000000000/* * File: VCardItemType.h * * Author: Lukas Zeller (luz@plan44.ch) * * TVCardItemType * vCard item type, based on MIME-DIR Item Type, uses * TMultiFieldItem as data item. * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-08-20 : luz : created * */ #ifndef VCardItemType_H #define VCardItemType_H // includes #include "mimediritemtype.h" using namespace sysync; namespace sysync { // vCard variants typedef enum { vcard_vers_2_1, vcard_vers_3_0, vcard_vers_none, // must be last as version table has no entry for that numVCardVersions } TVCardVersion; // Vcard based datatype class TVCardTypeConfig : public TMIMEDirTypeConfig { typedef TMIMEDirTypeConfig inherited; public: TVCardTypeConfig(const char *aElementName, TConfigElement *aParentElementP) : TMIMEDirTypeConfig(aElementName,aParentElementP) {}; // properties TVCardVersion fVCardVersion; // public functions // - create Sync Item Type of appropriate type from config virtual TSyncItemType *newSyncItemType(TSyncSession *aSessionP, TSyncDataStore *aDatastoreP); protected: #ifdef CONFIGURABLE_TYPE_SUPPORT // check config elements virtual bool localStartElement(const char *aElementName, const char **aAttributes, sInt32 aLine); #endif virtual void localResolve(bool aLastPass); virtual void clear(); }; // TVCardTypeConfig const uInt16 ity_vcard=104; // must be unique class TVCardItemType: public TMimeDirItemType { typedef TMimeDirItemType inherited; public: // constructor TVCardItemType( TSyncSession *aSessionP, TDataTypeConfig *aTypeConfigP, const char *aCTType, const char *aVerCT, TSyncDataStore *aRelatedDatastoreP, TFieldListConfig *aFieldDefinitions // field definitions ) : TMimeDirItemType( aSessionP, aTypeConfigP, aCTType, aVerCT, aRelatedDatastoreP, aFieldDefinitions ) { fVCardVersion = static_cast(aTypeConfigP)->fVCardVersion; }; // destructor virtual ~TVCardItemType() {}; // access to type virtual uInt16 getTypeID(void) const { return ity_vcard; }; virtual bool isBasedOn(uInt16 aItemTypeID) const { return aItemTypeID==ity_vcard ? true : TMimeDirItemType::isBasedOn(aItemTypeID); }; // get type name / vers virtual cAppCharP getTypeName(sInt32 aMode=0); virtual cAppCharP getTypeVers(sInt32 aMode=0); // differentiation between implemented and just descriptive TSyncTypeItems virtual bool isImplemented(void) { return true; }; // vCard is an implemented data type // relaxed type comparison, taking into account common errors in real-world implementations virtual bool supportsType(const char *aName, const char *aVers, bool aVersMustMatch=false); // try to extract a version string from actual item data, false if none virtual bool versionFromData(SmlItemPtr_t aItemP, string &aString); #ifdef APP_CAN_EXPIRE // test if modified date of item is expired virtual sInt32 expiryFromData(SmlItemPtr_t aItemP, lineardate_t &aDat); #endif // helper to create same-typed instance via base class // MUST BE IMPLEMENTED IN ALL DERIVED CLASSES! virtual TSyncItemType *newCopyForSameType( TSyncSession *aSessionP, // the session TSyncDataStore *aDatastoreP // the datastore ); #ifdef OBJECT_FILTERING // add extra keywords and property names to filterCap virtual void addFilterCapPropsAndKeywords(SmlPcdataListPtr_t &aFilterKeywords, SmlPcdataListPtr_t &aFilterProps, TTypeVariantDescriptor aVariantDesc); // find field index for filter identifier virtual sInt16 getFilterIdentifierFieldIndex(const char *aIdentifier, uInt16 aIndex); #endif private: TVCardVersion getVCardVersionByMode(sInt32 aMode); // vCard version TVCardVersion fVCardVersion; }; // TVCardItemType } // namespace sysync #endif // VCardItemType_H // eof syncevolution-1.5/src/synthesis/src/sysync/vtimezone.cpp0000644000373300037200000010175412424517753025401 0ustar00nightlyallusers00000000000000/* * File: vtimezone.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * Parser/Generator routines for vTimezone * * Copyright (c) 2006-2011 by Synthesis AG + plan44.ch * * 2006-03-06 : bfo : created from exctracts from rrules.cpp * */ // includes #include "prefix_file.h" // do not import the whole thing to make life easier for standalone apps #ifdef FULLY_STANDALONE #include "sysync_globs.h" #include "sysync_debug.h" #else #include "sysync.h" #endif #include "vtimezone.h" #include "rrules.h" #include "lineartime.h" #include "timezones.h" #include "iso8601.h" #include "stringutils.h" typedef unsigned long ulong; using namespace sysync; namespace sysync { struct RType { // RRule block definition char freq; char freqmod; sInt16 interval; fieldinteger_t firstmask; fieldinteger_t lastmask; lineartime_t until; }; // RType #ifdef SYSYNC_TOOL /*! Get boolean as const char string */ static cAppCharP Bo( bool b ) { if (b) return "true"; else return "false"; } // Bo #endif /*! Logging RType info */ static void RTypeInfo( RType &r, bool ok, TDebugLogger* aLogP ) { string runt; TimestampToISO8601Str( runt, r.until, TCTX_UTC); // get end time as string #ifdef SYSYNC_TOOL ulong* f1= (ulong*)&r.firstmask; // prepare for longlong disp ulong* f2= f1++; ulong* l1= (ulong*)&r.lastmask; ulong* l2= l1++; LOGDEBUGPRINTFX( aLogP, DBG_GEN,( "RType ok=%s freq=%c freqmod=%c iv=%d", Bo( ok ), r.freq, r.freqmod, r.interval ) ); LOGDEBUGPRINTFX( aLogP, DBG_GEN,( "RType 1st=%08X %08X last=%08X %08X '%s'", *f1,*f2, *l1,*l2, runt.c_str()) ); #endif } // RTypeInfo /*! VTIMEZONE keywords */ const char* VTZ_ID = "TZID"; const char* VTZ_BEGIN = "BEGIN"; const char* VTZ_END = "END"; const char* VTZ_STD = "STANDARD"; const char* VTZ_DST = "DAYLIGHT"; const char* VTZ_RR = "RRULE"; const char* VTZ_START = "DTSTART"; const char* VTZ_OFROM = "TZOFFSETFROM"; const char* VTZ_OTO = "TZOFFSETTO"; const char* VTZ_NAME = "TZNAME"; /*! * escapes newline ('\n'), comma, semicolon and backslash itself with backslash, * according to RFC 2445 "4.3.1 Text" value definition */ static string escapeText(const string &str) { string res; res.reserve(str.size() * 110 / 100); for (size_t i = 0; i < str.size(); i++) { switch (str[i]) { case '\n': res += "\\n"; break; case '\\': case ',': case ';': res += '\\'; // no break! default: res += str[i]; break; } } return res; } /*! * reverses escapeText(); in addition, accepts arbitrary characters * after backslash and replaces them with that character */ static string unescapeText(const string &str) { string res; res.reserve(str.size()); for (size_t i = 0; i < str.size(); i++) { switch (str[i]) { case '\\': i++; if (i < str.size()) { switch (str[i]) { case 'n': res += '\n'; break; default: res += str[i]; break; } } break; default: res += str[i]; break; } } return res; } /*! RRULE2toInternal, using RType * Converts vCalendar 2.0 RRULE string into internal recurrence representation */ static bool RRULE2toInternalR( const char* aText, // RRULE string to be parsed lineartime_t* dtstartP, // reference date for parsing RRULE (might be modified!) RType &r, TDebugLogger* aLogP ) { timecontext_t untilcontext = TCTX_UNKNOWN; bool ok= RRULE2toInternal( aText, *dtstartP, TCTX_UNKNOWN, r.freq,r.freqmod,r.interval,r.firstmask,r.lastmask,r.until,untilcontext, aLogP, dtstartP ); if (aLogP) RTypeInfo( r, ok, aLogP ); return ok; } // RRULE2toInternalR /*! internalToRRULE2, using RType * Converts internal recurrence into vCalendar 2.0 RRULE string */ static bool internalRToRRULE2( string &aString, // receives RRULE string RType r, bool asUTC, TDebugLogger* aLogP ) { bool ok= internalToRRULE2( aString, r.freq,r.freqmod,r.interval,r.firstmask,r.lastmask,r.until, asUTC, aLogP ); #ifdef SYSYNC_TOOL if (aLogP) LOGDEBUGPRINTFX( aLogP, DBG_GEN,( "RType ok=%s aString='%s'", Bo( ok ), aString.c_str() ) ); #endif return ok; } // internalRtoRRULE2 // ---------------------------------------------------------------------------------------- /*! Convert mask values into , */ static void R_to_WD( RType &r, short &aDayOfWeek, short &aNth ) { int i,j; aDayOfWeek= -1; aNth = -1; for (i= 0; i, into tChange */ static void Rtm_to_tChange( RType &r, lineartime_t tim, tChange &c ) { sInt16 mo, da, ho, mi; lineartime2date(tim, NULL, &mo, &da); lineartime2time(tim, &ho, &mi, NULL, NULL); c.wMonth = mo; c.wHour = ho; c.wMinute= mi; R_to_WD( r, c.wDayOfWeek, c.wNth ); if (c.wDayOfWeek==-1) c.wNth= da; } // Rtm_to_tChange // ---------------------------------------------------------------------------------------- /*! Convert , into mask values */ static void WD_to_R( int aDayOfWeek, int aNth, RType &r ) { r.firstmask = 0; // default values r.lastmask = 0; sInt16 index= aDayOfWeek % DaysOfWeek; bool last= aNth==WeeksOfMonth; // 5 is the last week if (last) r.lastmask = (uInt64)1<< index; else r.firstmask= (uInt64)1<<( index + (aNth-1)*DaysOfWeek ); } // WD_to_R static void AdaptDay( lineartime_t &tim, tChange c ) { sInt16 yr, mo, dowk; lineartime2date( tim, &yr ,&mo, NULL ); tim = date2lineartime( yr, mo, 1 ); // make calculation with the 1st of month dowk= lineartime2weekday ( tim ); // get weekday sInt16 da= c.wDayOfWeek - dowk + 1; if (da<1) da+= DaysOfWeek; // this is the 1st occurance of the given weekday da+= (c.wNth-1)*DaysOfWeek; AdjustDay( da,mo,yr ); // and ajust within the month tim= date2lineartime( yr,mo,da ); } // AdaptDay /*! Convert , into tChange */ static void tChange_to_Rtm( tChange c, int year, RType &r, lineartime_t &tim ) { bool noDOW = c.wDayOfWeek==-1; bool noCalc= c.wMonth==0; if (noCalc) c.wMonth= 1; sInt16 da= 1; if (noDOW) da= c.wNth; tim = date2lineartime( year, c.wMonth, da ); lineartime_t timT= time2lineartime( c.wHour, c.wMinute, 0,0 ); if (!(noCalc || noDOW)) { AdaptDay( tim, c ); // get wDayOfWeek/wNth, fitting for WD_to_R ( c.wDayOfWeek, c.wNth, r ); } // if tim+= timT; // don't forget time } // tChange_to_Rtm // ---------------------------------------------------------------------------------------- /*! Get the value from TZOFFSFROM/TZOFFSTO strings */ static bool Get_Bias( string of, string ot, short &bias ) { bool negative= ot.find( "-",0 )==0; bool positive= ot.find( "+",0 )==0; // needed because positive TZOFFSxxx should have it as per specs if (negative || positive) ot= ot.substr( 1,ot.length()-1); string h= ot.substr( 0,2 ); string m= ot.substr( 2,2 ); bias= atoi( h.c_str() )*MinsPerHour + atoi( m.c_str() ); if (negative) bias= -bias; return true; } // Get_Bias /*! Fill in the TZ info. * @return false if some information was found, but couldn't be extracted; * true if not found (in which case c, cBias, cName are unchanged) * or found and extracted */ static bool GetTZInfo( cAppCharP aText, cAppCharP aIdent, tChange &c, short &cBias, string &cName, sInt32 aNth, // take nth occurance, -1: take last TDebugLogger* aLogP ) { RType r; timecontext_t tctx; lineartime_t dtstart, dtH= 0; string a, st; bool success = true; if (aNth==-1) { // search for the last (in time) sInt32 i= 1; while (true) { a= VStr( aText, aIdent, i ); if (a=="") break; st= VValue( a, VTZ_START ); // - start time if (ISO8601StrToTimestamp( st.c_str(), dtstart, tctx )==0) break; if (dtH= aText.size()) { // end of string is okay return hit; } char eol = aText[hit + textlen]; switch (eol) { case '\r': case '\n': // found it return hit; } // keep searching offset = hit + 1; } } else { // normal string search return aText.find(aProperty, aOffset); } } // FindProperty /*! Find last instance of Property inside another string. If the property string ends in \n, then that character matches arbitrary line endings (\r, \n, end of string). If the property does not end in \n, a normal string search is done. */ static string::size_type RfindProperty( const string &aText, const string &aProperty, string::size_type aOffset = string::npos ) { if (!aProperty.empty() && aProperty[aProperty.size()-1] == '\n') { // ignore trailing \n, check for either \r or \n in aText instead string::size_type offset = aOffset; string::size_type textlen = aProperty.size() - 1; while (true) { string::size_type hit = aText.rfind(aProperty.c_str(), offset, textlen); if (hit == string::npos) return string::npos; // prefix match, now must check for line end if (hit + textlen >= aText.size()) { // end of string is okay return hit; } char eol = aText[hit + textlen]; switch (eol) { case '\r': case '\n': // found it return hit; } // keep searching, if possible if (hit == 0) return string::npos; offset = hit - 1; } } else { // normal reversed string search return aText.rfind(aProperty, aOffset); } } // RfindProperty /*! Check, if "BEGIN:value" is available only once */ static int PMulti( string &aText, string value ) { string p= Property( VTZ_BEGIN, value ); string::size_type n; n= FindProperty( aText, p ); if (n==string::npos) return 0; n= FindProperty( aText, p, n+1 ); if (n==string::npos) return 1; /* else */ return 2; } // PMulti /* vTimezones with more than one STANDARD or DAYLIGHT sequence can't be resolved */ static void MultipleSeq( string aText, int &s, int &d ) { s= PMulti( aText,VTZ_STD ); d= PMulti( aText,VTZ_DST ); } // MultipleSeq bool VTIMEZONEtoTZEntry( const char* aText, // VTIMEZONE string to be parsed tz_entry &t, TDebugLogger* aLogP) { short dBias; // the full bias for DST bool success = true; t.name = ""; t.ident = ""; t.dynYear= "CUR"; t.biasDST= 0; t.bias = 0; t.stdName = t.dstName = ""; if (!GetTZInfo( aText,VTZ_STD, t.std, t.bias, t.stdName, -1, aLogP )) { success = false; } // default value if not found (which is treated as success by GetTZInfo) dBias= t.bias; if (!GetTZInfo( aText,VTZ_DST, t.dst, dBias, t.dstName, -1, aLogP )) { // unknown failure, better restore default dBias= t.bias; success = false; } if (t.bias == dBias) ClrDST( t ); // no DST ? else t.biasDST= dBias - t.bias; // t.biasDST WILL be calculated here // get TZID as found in VTIMEZONE t.name = unescapeText( VValue( aText, VTZ_ID ) ); return success; } // VTIMEZONEtoTZEntry /*! Convert VTIMEZONE string ito internal context value */ bool VTIMEZONEtoInternal( const char* aText, // VTIMEZONE string to be parsed timecontext_t &aContext, GZones* g, TDebugLogger* aLogP, string* aTzidP ) ///< if not NULL, receives TZID as found in VTIMEZONE { aContext= tctx_tz_unknown; tz_entry t; string lName; timecontext_t lContext; if (!VTIMEZONEtoTZEntry( aText, t, aLogP )) { PLOGDEBUGPRINTFX(aLogP, DBG_PARSE+DBG_ERROR, ("parsing VTIMEZONE failed:\n%s", aText)); } // Telling the caller about the original TZID is necessary because this // code might match that TZID against an existing definition with a different // TZID. Previously it was also necessary when importing the VTIMEZONE, because // the original TZID was overwritten. Now imported definitions retain the // original TZID in t.name. if (aTzidP) *aTzidP = t.name; // return the original TZID as found, needed to match with TZID occurences in rest of vCalendar bool ok = true; bool okM= true; int s,d; MultipleSeq( aText, s,d ); if (s==0 && d==0) return false; okM= s<=1 && d<=1; // test if more than one section // find best match for VTIMEZONE: checks name and rules // allows multiple timezone, if last is ok ! if (!g) return false; // avoid crashes with g==NULL ok= g->matchTZ(t, aLogP, aContext); if (!ok && !okM) { // store it "as is" if both is not ok ClrDST( t ); t.name = aText; t.ident= "$"; t.bias = 0; return FoundTZ( t, lName, aContext, g, true ); } // if #ifdef SYSYNC_TOOL if (ok) { string existing_name; TimeZoneContextToName(aContext, existing_name, g); LOGDEBUGPRINTFX( aLogP, DBG_PARSE,( "found matching time zone with name='%s' tx=%08X %d", existing_name.c_str(), aContext, TCTX_OFFSCONTEXT( aContext ) ) ); } #endif // if not found, then try again with name and add // the entry; doing a full comparison again is // redundant here, but there is no other way to // add the entry string new_name; if (!ok) ok= FoundTZ( t, new_name, aContext, g, true ); if (ok && t.std.wMonth!=0 && t.dst.wMonth!=0) { tz_entry std; std.name = t.stdName; std.ident= "s"; // standard std.bias = t.bias; FoundTZ( std, lName,lContext, g, true ); tz_entry dst; dst.name = t.dstName; dst.ident= "d"; // daylight saving dst.bias = t.bias + t.biasDST; FoundTZ( dst, lName,lContext, g, true ); } // if return ok; } // VTIMEZONEtoInternal // ----------------------------------------------------------------------------------------- /*! Create a string with in-between BEGIN: .. END: */ static string Encapsuled( string value, string txt ) { return Property( VTZ_BEGIN, value ) + txt + Property( VTZ_END, value ); } // Encapsuled /*! Get the hour/minute string of */ string HourMinStr( int bias ) { const char* form; if (bias>=0) form= "%+03d%02d"; else { form= "-%02d%02d"; bias= -bias; } // for negative values char s[ 10 ]; sprintf( s, form, bias / MinsPerHour, bias % MinsPerHour ); return s; } // HourMinStr /*! Get TZOFFSETFROM/TO strings */ static string FromTo( int biasFrom, int biasTo ) { return Property( VTZ_OFROM, HourMinStr( biasFrom ) ) + Property( VTZ_OTO, HourMinStr( biasTo ) ); } // FromTo /*! Generate a TZ info: * - : the whole tz entry * - : STANDARD/DAYLIGHT * - : "s"/"d" * - : std / dst info * - : staring year * - : bias before changing * - : " after " * - : the debug logger */ static string GenerateTZInfo( tz_entry t, const char* value, const char* aIdent, tChange c, int y, int aFrom, int aTo, GZones *g, TDebugLogger* aLogP ) { string rTxt, dtStart; RType r; lineartime_t tim; string aName; timecontext_t aContext; bool withDST= strcmp( aIdent," " )!=0; r.freq = 'M'; // these are the fixed parameters for TZ r.freqmod = 'W'; r.interval = 12; r.until = noLinearTime; // last day r.firstmask= 0; // default values r.lastmask = 0; tChange_to_Rtm( c,y, r, tim ); TimestampToISO8601Str( dtStart, tim, TCTX_UNKNOWN); // with time, but no offset if (withDST) internalRToRRULE2( rTxt, r, false, aLogP ); t.name = ""; t.ident= aIdent; t.bias = aTo; // this is the bias to search for STD/DST name if (!FoundTZ( t, aName, aContext, g )) aName= ""; string s = Property( VTZ_START, dtStart ); if (withDST) s+= Property( VTZ_RR, rTxt ); s+= FromTo ( aFrom,aTo ); if (withDST && !aName.empty()) s+= Property( VTZ_NAME, escapeText( aName ) ); return Encapsuled( value, s ); } // GenerateTZInfo /*! Convert internal context value into VTIMEZONE */ bool internalToVTIMEZONE( timecontext_t aContext, string &aText, // receives VTIMEZONE string GZones* g, TDebugLogger* aLogP, sInt32 testYear, sInt32 untilYear, cAppCharP aPrefIdent ) { // %%% note: untilYear needs to be implemented, is without functionality so far sInt16 yy= testYear; if (testYear==0) yy= MyYear( g ); TzResolveMetaContext( aContext, g ); // we need actual zone, not meta-context int t_plus= 0; tz_entry t, tp; cAppCharP id; bool withDST= false; bool tzEnum= TCTX_IS_TZ( aContext ); if (tzEnum) { GetTZ( aContext, t, g, yy ); withDST= t.std.wMonth!=0 && t.dst.wMonth!=0; if (t.ident == "$") { aText= t.name; return true; } // just give it back } else { t.bias= TCTX_MINOFFSET( aContext ); //t.name= "OFFS" + HourMinStr( t.bias ); // will be done once at TimeZoneContextToName } t_plus = t.bias; id= " "; if (withDST) { t_plus+= t.biasDST; id= "s"; } // there is only an offset with DST // time zone start year int y_std= 1967; // this info gets lost in the TZ_Entry system int y_dst= 1987; // hard coded, because there is currently no field to store it // modify it, if dyn year is later if (!t.dynYear.empty()) { timecontext_t aDJ= aContext+1; GetTZ ( aDJ, tp, g, -1 ); // but only if not the first entry of dynYear if (t.name == tp.name && t.dynYear != tp.dynYear) { y_std= atoi( t.dynYear.c_str() ); y_dst= y_std; } // if } // if // make sure we get the right TZID string according to aPrefIdent string tzn = t.name; if (aPrefIdent || !tzEnum) { TimeZoneContextToName( aContext, tzn, g, aPrefIdent ); } // at least one STANDARD or DAYLIGHT info is mandatory aText= Property ( VTZ_ID, escapeText( tzn ) ) + GenerateTZInfo( t, VTZ_STD, id, t.std, y_std, t_plus,t.bias, g, aLogP ); if (withDST) aText+= GenerateTZInfo( t, VTZ_DST,"d", t.dst, y_dst, t.bias,t_plus, g, aLogP ); return false; } // internalToVTIMEZONE static bool NextStr( string &s, string &nx ) { string::size_type i= s.find( ";", 0 ); if (i==string::npos ) return false; // mismatch nx= s.substr ( 0, i ); s = s.substr ( i+1, s.length()-i-1 ); return true; } // NextStr /*! Convert TZ/DAYLIGHT string into internal context value */ bool TzDaylightToContext( const char* aText, ///< DAYLIGHT property value to be parsed timecontext_t aStdOffs, ///< Standard (non-DST) offset obtained from TZ timecontext_t &aContext, ///< receives context GZones* g, timecontext_t aPreferredCtx, // preferred context, if rule matches more than one context TDebugLogger* aLog ) { TzResolveMetaContext( aPreferredCtx, g ); // we need actual zone, not meta-context string s= aText; string hrs, dst, std, l, r, rslt; string::size_type i; tz_entry t, tCopy; timecontext_t cc, ccFirst, ccSlash; aContext= aStdOffs; // as default, convert it into a enum TZ string sSv; bool dbg= false; // currently no debugging do { if (s=="FALSE" ) { s= ""; break; } // no DST /* i= s.find( ";", 0 ); // TRUE if (i==string::npos ) return false; // mismatch l= s.substr( 0, i ); */ if (!NextStr( s, l )) return false; // mismatch if (l=="FALSE") { s= ""; break; } // no DST if (!(l=="TRUE" )) return false; // either "TRUE" or "FALSE" if (!NextStr( s, hrs )) return false; // mismatch if (!NextStr( s, dst )) return false; // mismatch if (!NextStr( s, std )) return false; // mismatch int minsDST= MinsPerHour; // %%% not yet perfect for Namibia !! /* i= s.find( ";", 0 ); // +XX i= s.find( ";", i+1 ); // DST time i= s.find( ";", i+1 ); // STD time if (i==string::npos ) return false; // parsing error s= s.substr( i+1, s.length()-i-1 ); */ ISO8601StrToContext( hrs.c_str(), cc ); int mins= TCTX_MINOFFSET( cc )-minsDST; i= s.find ( ";", 0 ); l= s.substr( 0, i ); r= s.substr( i+1, s.length()-i-1 ); if (l==r) s= l; // twice the same => take it once StringSubst( s, ";", "/" ); TimeZoneNameToContext( s.c_str(), aContext, g ); sSv= s; // make a copy for Olson name test later // if it perfectly fits to a named zone, take it if (GetTZ( std,dst, mins,minsDST, t, g )) { ccFirst= TCTX_UNKNOWN; // start with these defaults ccSlash= TCTX_UNKNOWN; cc = TCTX_SYSTEM; if (dbg) printf( "lv1 s='%s' %d pref=%d\n", s.c_str(), aContext, aPreferredCtx ); while (FoundTZ( t, rslt, cc, g, false, cc )) { if (dbg) printf( "lv1 rslt='%s'\n", rslt.c_str() ); if (s==rslt) { aContext= cc; break; } if (s.empty()) { if (ccFirst==TCTX_UNKNOWN) ccFirst= cc; if (ccSlash==TCTX_UNKNOWN) { i= rslt.find( "/",0 ); // a slash TZ would be the best choice if (i!=0 && i!=string::npos) ccSlash= cc; } // if } // if } // while if (ccSlash!=TCTX_UNKNOWN) aContext= ccSlash; else if (ccFirst!=TCTX_UNKNOWN) aContext= ccFirst; } // if } while (false); // check if it fits to bool pUnk = TCTX_IS_UNKNOWN ( aPreferredCtx ); timecontext_t t_Greenwich= TCTX_ENUMCONTEXT( tctx_tz_Greenwich ); ccFirst= TCTX_UNKNOWN; // start with these defaults cc = TCTX_SYSTEM; tCopy= t; // make the copy before if (GetTZ( aContext, t, g )) { if (dbg) printf( "lv2 s='%s' %d\n", s.c_str(), aContext ); if (FoundTZ( t, s, cc, g, false, cc )) { // search by correct name first if (dbg) printf( "lv2 s='%s' / loc='%s'\n", s.c_str(), t.location.c_str() ); if (!(cc!=aPreferredCtx && cc==t_Greenwich)) { // take UTC for this case if (pUnk || cc==aPreferredCtx) { aContext= cc; return true; } if (ccFirst==TCTX_UNKNOWN) ccFirst= cc; // keep it, just in case } // if } // if } else { t.bias = TCTX_MINOFFSET( aContext ); t.biasDST= 0; // no DST offset t.dynYear= ""; ClrDST( t ); tCopy= t; } // if //tCopy= t; tCopy.name = ""; // make more generic comparison tCopy.ident= ""; cc= TCTX_SYSTEM; while (FoundTZ( tCopy, s, cc, g, false, cc )) { if (dbg) printf( "lv3 s='%s' loc='%s' cc=%d\n", s.c_str(), tCopy.location.c_str(), cc ); if (!(cc!=aPreferredCtx && cc==t_Greenwich)) { // take UTC for this case if (pUnk || cc==aPreferredCtx) { ccFirst= cc; break; } if (ccFirst==TCTX_UNKNOWN) ccFirst= cc; // keep it, just in case } // if } // while aContext= ccFirst; bool ok= !TCTX_IS_UNKNOWN( aContext ); if (dbg) printf( "aContext=%d ok=%d\n", aContext, ok ); // if not ok, try to use Olson names if (!ok) { s= sSv; TimeZoneNameToContext( s.c_str(), aContext, g, true ); if (dbg) printf( "lv4 s='%s' aContext=%d\n", s.c_str(), aContext ); ok= !TCTX_IS_UNKNOWN( aContext ); } if (dbg) printf( "aContext=%d ok=%d\n", aContext, ok ); return ok; } // TzDaylightToContext /*! Create DAYLIGHT string from context for a given sample time(year) */ bool ContextToTzDaylight( timecontext_t aContext, lineartime_t aSampleTime, ///< specifies the time after which we search DST string &aText, ///< receives DAYLIGHT string timecontext_t &aStdOffs, ///< receives standard (non-DST) offset for TZ GZones* g, TDebugLogger* aLog ) { //#ifdef RELEASE_VERSION //#error "%%%missing actual implementation - this is just a q&d dummy for testing" //#endif TzResolveMetaContext( aContext, g ); // we need actual zone, not meta-context sInt16 year, month, day; lineartime2date( aSampleTime, &year,&month,&day ); // we need the active year aStdOffs= 0; // default tz_entry t, tCopy; bool found= false; bool dDone= false; bool sDone= false; lineartime_t dt = 0, st = 0; string s; do { bool ok= GetTZ( aContext, t, g ); if (!ok) return false; aStdOffs= TCTX_OFFSCONTEXT( t.bias ); // need this here in case of no DST ok= DSTCond( t ); if (!ok) { aText= "FALSE"; return true; } const int FLen= 15; char f[ FLen ]; sprintf ( f, "%d", year ); string yy= f; t.dynYear= yy.c_str(); // go further only in case of DST available s= t.name; if (s.find( "/",0 )==string::npos) { // search for a time zone with slash in it tCopy= t; tCopy.name = ""; // make more generic comparison tCopy.ident= ""; timecontext_t cc= TCTX_UNKNOWN; while (FoundTZ( tCopy, s, cc, g, false, cc )) { // search for a time zone with slash in it (which is // interpreted as separator between dstName and stdName) *or* // one which has dstName and stdName set explicitly; // prefer explicit names over splitting name tz_entry zone; if (GetTZ( cc, zone, g, -1 ) && !zone.stdName.empty() && !zone.dstName.empty()) { s = zone.stdName + ";" + zone.dstName; found= true; break; } else if (s.find( "/",0 )!=string::npos) { // Assumption here is that s contains exactly one slash, // otherwise s is not valid for stdName;dstName in vCalendar // 1.0. StringSubst( s, "/", ";" ); found= true; break; } // if } // while if (!found) { string stdName; if (t.stdName.empty()) { stdName = t.name; } else { stdName = t.stdName; } s = stdName; // create a ; string s+= ";"; s+= stdName; } // if } else if (!t.stdName.empty() && !t.dstName.empty()) { // use explicit zone names instead of splitting s s = t.stdName + ";" + t.dstName; } else { StringSubst( s, "/", ";" ); } if (!dDone) dt= DST_Switch( t, t.bias, year, true ); // get the switch time/date for DST if (!sDone) st= DST_Switch( t, t.bias, year, false ); // get the switch time/date for STD // search into future,

    ~{n|ž¦âHа„‹0ëÄ ”.Ê)—€ê"™é¤…í&^xy=oœf’9ŒbÞíàÌçuOBfh+¬¦å5 wŒùª¶N`á<ÚèýúžΡê¬ÈGpų{CÕ)*Æ™Ï5y åíåb²Æœ •|¾rã¢í-l‡¨Ïsï@ÕM@ 1¦²ÆU2T¿À¯?6†„;Êý×kx6Ñ@?ŽÜ[„väÞSŠQ Ž_zÈ‚RKWËDÀ<@ïFYÿ>6è~²ô7Ôsó´ü/óeóÛ¶Dñ{ÿ ¢§ea$EJb0"¡'«K_X‰v„H¢!Qvóß÷½™Y~Ètê ô"RË]r?ÞüæMÍ$wÊC¶Œß©GJ% aå_Åîq[ú ÖóÁºÏñ˜5s·*àé}±-÷kê SŒi!̯þ.Ñ¥i±‡SZÁ Ð £é"ëòøï#ÕPOî×…¼iS—;ꆷúˆåÞ÷gIqô$+“·?×…>øv YR:K^׬où‹•b>Þ䎋4Q둺'õ#öo_í1–¨7ua¾ Ça½.uÌëÚ›5ÆÙW¬ãIÚhâ:H ±1dø}Póþñ³\ß_œãaî F–,×7ZlPŒÈâ#/çbÄöL:úå‰Ü%90"†Ê‡óJüžwd¨×^²ÊRºÖáØÉŽ—µœU¼Ó†ïûÕU ©ôP>L†3sù°y@уžTÂI0’UEÙÂ4ɼš™ AŠ6éj× ®‰> ŽXÑ6¢ –»\C’+˜›&ÆdM¶zX1±¡ßó”êKÎ wÅvS“¹»*õJœÉzƒ0Çís¾ }ü` ²&èuPêàkõÜ"AÆòûS'p€ƒž­™–ÌÚ´Á¾¤a»~“]m‚ewP™Jݨ°Œ–±À¬¿]Ü|^.ˆLvdΙü6TÊË •bþÓfF¯1óG¼”Ù¼rÔç'¦D±®{²^­ÔªØ­«ŽéB€DYßxűÉ5TŽänêdº·*OäHch·Géfi9·g„Ù¤ƒ áÖjI‹,.íêX‡™_гB~âCñiÃãÖ ù\qN¼éœô-•uöeyëËlÙrM>*Î,cUíµIC±Ù“껼"3R¹•(wå¾6—C3W>•{Ÿó…‚—t.ã·ã×¼†3?Éz³CDŒÔ¾PBȆ*16MÜ-a»å\þOh€ÖÅÝK#Ç,hpuUeqcå%Ô ƒÂ­—ºE×^KJòÐóÛ´²ÖÖ> Å —:»à Í,éÚåAÇû {—¸ƒÑÁFû.ÌV Í=,¼‡îìºIwæl½Q¦‰¯3¢p7èÖpDP˜º° œ‰Zˆf–ìì+ê,s­»ª.2[‹Q«G©ú# ×·z‡Œf‚…'§mr8±NŽ†ê£´­R«4ûž$»™ጬ̩¯Å´}YÊß?ÞÄ̤cm_,!¬Ûå\-͵®w©<”¬I¾“O–ЇÞ=*Kå[x] W4ƒê’ I°‡ ª»x‚ò)a=´3õÉâXÁ–¬we\$C2` ="þ›’F×Vш©¬#èȃ8õuׯTÏŠ’D`ÂÖ&j »H/d↴!:Ñ` ™nj¤Q6ïEænËü€R°"-ßÔ±Õ"šª Ëý$NÝVT>ê)¶sÇ¥-‘Ò^q¡eƒ2(V«ê°wÂÙ¥U;Õ¸ìqòÂ6ñ…²¿—ý]k1 »Øc¯‘ÎìL$~gã$Ÿ6P %ʱO¢÷,>á2Ÿ_‹^R-9΄m鞘ÏCãAÁd¦<˜ Œù}ÈXc:™B'óÐAÆ}'’1È3$ÏtFÄO¾3œTô¦€Oð³þˆïqÒ‹wˆGãûk¹®Šâ6¼{ÁÍHð î˜04Àv§ÿÛØ^,ú{¶E  endstream endobj 1098 0 obj << /Type /Page /Parent 1719 0 R /Resources 1115 0 R /Contents 1116 0 R /Annots [ 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1099 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 435 756 451 770 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1100 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 389 735 405 749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1101 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 128 700 145 714 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1102 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 469 678 485 692 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1103 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 151 630 167 644 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1104 0 obj << /Dest [ 898 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 351 603 387 617 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1105 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 446 582 463 596 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1106 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 351 463 393 477 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1107 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 279 436 295 450 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1108 0 obj << /Dest [ 1042 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 267 366 308 380 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1109 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 419 331 460 345 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1110 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 430 283 471 297 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1111 0 obj << /Dest [ 1032 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 229 193 265 207 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1112 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 149 180 177 194 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1113 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 453 132 495 146 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1114 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 443 118 471 132 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1115 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1116 0 obj << /Length 4229 /Filter /FlateDecode >> stream H‰¤WÛnãÈ}×Wôc3°h²y$<¾Ì:ðeq°™çA–Z6‰2DÊï‡äòyÈ©ª¦HÉìÁ`¬f“Ý]uêÔ©êåè¸, U¹…Fø‡Ÿ87~©ÊŠÄOó Råjt|ÚäjÖð7jfõèøÓ$TÍ(ðƒ Ä7³Ñ¸¾ŒôçéƒÅf‰òÊ ^T¨,ð‹G¹Ÿ²/¯1¼œFIJ«¿ëÿÌŽMàÃÈOu«ûW5y­ÛGÌm=줛ªQ'ŸŽÔ·ÿzãϼKüDW^ gGjòRµ¿ÙÍ’7‰ô´ž{ãB«ó_ïŸåßFì1{c?ÅCy†9¶àååÅ÷"?Ô jéXl#} ßè™›zäÎËQ¨*52IêGi¨¢ÌÏs•†@RÁÇ8W;ZŒ>–;0¢Ÿûhô脈fô£ü0F’Yøø?€2ì ¤9RÕ­}°us{"0•Þ8¦î‡'s}JO…þÅ3˜»¦¹TŸ{cÿÆ}9¹Ów;;`MäljàÆÇÃ$w|à"ùŽ·ÛMͨEºQåße÷/ç´m¤UµPX×S7ñ锾ˆô¥Z?µÕºVwº±Ve~|ç)ļ±­¯:C4c±dú9‘˜hØ1cr^Þx‰¾=)Ë“Ó_<ÂáúÜ+üLßx±€âHøˆw¦_ÉQŒ}ägAn(& ý §D…#pôb9} èõ13Z,‘8W ´ƒHí¡jv¨šU°´ŠR¢€™Áˆ,~7WÏfëͼªT»Þv¡L}Ó¥TìÐc_ü} V±Ë—·LG±ŸެG,^„AžîQˆ‡Z]Ÿü㲤 2§·r«Ð_¼#D!á…š¿ÃDãgIo~ØUìhˆ`&PŽ1%-ɵGQo°e¦™…õvuoå’é'þÄΪä gq±så}ÈË#-ò2úúØ C½òŒžþƒ/A6Ì«ïÜ1ˆ›>Î}P€|Šv0 ܰõFA¼Ö”õZ¯°­ ëË´QÛÆÎýCÐc?3û˜¬¬Là Cs ¯½”RþöËMy·Ó‡wY?2 lŠšç–‡ÂrX5[oëö€éE$É1\ö{Lïs£´ØÅ­!1 ɵcÝr”X/VÌöLÿ bÄ"¤S"¬7…~›´„ó`,acÌìã°S±q/cºË±½KÔÉ¢7ÞU1±›Ì‘&tö©ù&ø÷‡Å²&ê/öª%ö ¹±Uv±£Œ¸ZV«ªíÓ ³ ù3ÈK!”ˆ¹1òÍ›´å2H *v^.$qÖdGˆÌ¡¬m9-§éæeœ¢§ø«8MÎ0oPLÈö PkN~¹*'—ßñ±>¿º¼æÁ%ɾÂ3úùp˜æˆpþž4Æ4ºzôI$©ç®d[‰þÂÉävÙª¦úÍ ”TV¥´È©j=dh†ò!q]VTÿ”+”Ÿ<ò «PG8€C#”Âú´g”Ø™;A iDvhé«ËNÓqÑõÞ*~~áÒˆöƒŒ¿þ\~ÅvÜ…˜%{)Ròu½|Uv:÷8퇪^¬7«)¹ñVà ÎüD<t˜'4ê:/ÁK‰¹QgÝíé—RŽDßœ] »Y"ŒžÜ~.%Aø"ðF˜‘C]î*y¸²¡ÊÇŠE9îE¨@˜‘8¹„¸t‚ù´ÞO«ªÕÓÒ®lÝ2\j¾¶ T£wmT’ï4ìjBž;­/…Hµµs4o /ÖÕ²å>/ãÚN3` Ü–9:Ü*O¥e¬q¡ÅÒé’0°áSÓm»¦XΦË嫯.<ª2{ÛÑá³­<ˆÝåŸF{õËÎÖ [¦ÏÓj ÍÕ*Ñ÷ðáöìã)ŒÍUk´Š š3XM»ÞØæÈÝ«Òtù2}mº’¨.N®&çGøý¶…bEý'- Öáš1–9‘ñ{«Üì=,Ó„øšÅ´±–áè€Õ‚]“憵½vŸ¶Õ³%&€=­Ãd'îÉþ]wrE6úöWé&_åFysúuq 0×ì.[¦ë(¯¥=2-H¶\A3Ä— ÚÖ½Sù`ô ýiÜtÓ¸y°—S6‘Jj(Ô,Ý/n§æUTRxâ²z?Í£tP.n9¡ÐæqW¹&ò•Tú[¢v¨¥DO»w_%ío¸¹ÕïÃVäƒ WÚézÞu±³iM´Ø6܃¤(ˆž.Ý…¯E–„ZÞͨäZ^T ÞSûW¾2ñR«èJ ô Õ‚[͵×/š~J¾^òúõ‹{|•½ë™²Ïø/¼0î[µä°˜<éÚË;ÚÁðúú¡âÛ\εJ«—õv9§ r¾–70£^Ã&Ü–ûë}Uò#²€î‘òâȅȽëfå1ze•%#-íLú¢nåV~¹ìQµ”Ç%ØSšÃKÍwíÊ(²§·OSØB¼ Þ·Ðj¯Sý}‰Éw”ïçå…ëJ‰šD7JRRÓý¸®é'’Ò!}oNéuú.aj<¼ìäŸGƒ+»"y7[KUFzmËé—Ÿ´¡ð{Qmšv,×€¶BP)9سó bÎÞÊY´kÔNoo<:á‚ËÇ•èûåi9A,p;’ž’[åóO_q!¢ªÛ´^TA8bT£÷[¹4 n,UQ‘ù&wm™ïÊñwlâE»ª4õ-Ï–.d‘~xí÷ä./ B¡Ëp;9v­Þ‡Ã®$5ƒfÉ5&(  ùT/cC™ŒF¾ª]éÈèj[/H~Btb`9|voÀŸW…–Iäˆù* Œž%ÈöË×®ésGt®ŽÈ R ×¥e!1,$™–9eL©ÌÁ²'ÊèLúR\x¹¯C–ë‡.Ì¢h[ÙØºå”˜n{lñ\ͬÿ¦ 5 u:dìP¸ÅgÊòù€ë}¼Ã7‘˜ª•—„zëÅ•/¡Ð¶˜"Uº÷ ¬õ’TªMÌŠñìÅ9 ÁŒÿÇxùô6ŠQü¾Ÿ‚#¬âÈ€±A­i²ÚC6#er‰´b°âÀ¬Çò·ß÷ªªùÏì\Ó4MS]õê÷˜VøS˹SÆu8áªN@ éˆ?+ )R*—#ªsÔI®7ðýúc­•~¨^Kä6É…ÖHùKVǺK9ír’r§ñ !»Bq}¾GÉ„D‘+b ]\áT,ŽÄâ(9ÆnÕ"+‹2¼ãé" Ï‘Õ õzwhêê˜\ÉWŒþýˆÑëzM#Ú™¡Ä™!µB )ä¿.òCÁ¬G$[à Þd–KÚ$ˆVßlÅKmNû®Ý¶:¶Fì#‚ë¬2oÚYñ¢òðÎ’¼ †} h¸üó.o½· \Ül>Dâœ=ÿ=•Ƕ,n½©O¹vαd5'Hwÿ|ÇCfO`äA³>#ŸÇýs{›ˆÍQ Ñ@Äæá îL¤ë´rÞc%Œ2õòÚ"?VÂpèá¨RšYK{<–m/j©€öË Þrž²¿ÑÛ"q (Î}­B—Õ-ٛ̄  ”cóNã)nwÔµ¢Úllà`Æ *”+€«–05Ag´0câ•–@“øN‡ šq¬y—/³ ”‚…ÿÞ´ä c¶/ý‹å+÷ºyÃ ÌØTµÄݨ„Qû„NÇ }ë=ò=ØŸÍÒÿIRó—ëREÃIÞ žÊ{«›ó¾,to[m%S_eÀÊZïÞ·CÓ6kjöÞÌ˯ýPÁÒ½7ˆru©j= [F4¥Ó¦ôxŸ½XD}ñØ0H,ûê ž‰yôž‹P½•,Fõ‰kÅzO@‡†m)ù%Õ hg~Ñaå´>fÑ;—^‚ãa²ÎËæ†ÞN¥R¬u’KôòMw;\‹¨Ûö«àžÖÔˆ Ã@…ÃlÐiˆ5 Ûñàkn¥Í9ë4{9¥ —.±«ëÙ]iBzÕ¶nìnqãåb h|j߬áÄB„Jûh§„pÍe]­[ ߣ x¿./þuùP’*‡ ƒÎV!m[Ö*í£E!اo³iæ>Ía“ƒ¯£ÇäCK«]½uh/bhÿVµ+98™àÁ'«ºj+§{@»Ñ +¦Ê}³·»[µ@<ç®5Þë¥ËùŽ'sÇó ‰Q0þðÚ|;U -óô68›nåQ¬Žz…Ú™íá!÷ìE2òÄ=fþýÝgäÿ sÞÛœêµô¾ih;]æ–&{ˆÑXÍ{AñÔ½¸kh Óî7_„ѸÂeDk°è»_&ËE§{Vû¸q]{ìûݸ‘g.™ØâŽW{\Ìë{ë?%¥ FôeS^% gF› ‹˜]Aš¡œR²î6HWº Ò”5ôdäã]‘‹+N<ê7º8áBpZ.K®•ø¶¼Ý“· ¯fÌßFt;°ËCÅ¢Àò¸­âÉÎ0×î–AÆa-ð¤?ã*Ý¢µþÛYæ_t²3? ºlÒ%’)“)#<8‹iWÿñµ ­Ñôž Þ¨ºQ×Ò˜ÎÕ~ïÛ  ’¦šVÈ÷sÕî¤nu!5Z‰¨+|Õ¡ôλRúPú±ùŽ|;ì#_·§Ž”.Æ’A¨L@=ªsä9œ›ÙÙ..ÖäÅ‘¹E|Ì'·™x-$<©º(2›š7Íó(8ÜÌve£Ò^Zi#dK?f?Š!2QÀ¼éÁÄ8+á’cÎê[}¹¨äBˆ”u$¤6|w¾× mîé¥HWìë…þ%,áLÐSvÇ –昈Úw[Ú&CšM€î£b—©Ø¥» eßgÇG»§èݸwššýDËÒîÜñɹ9¶`‹Þ–Zô  ã}¼?‡_ÕPþõå1˜eô~t•/$DÑãs ‰Œl_äÞîPªs}CÜX‘'ʼnÞì t 7 Ã]Gëfé m V°]Ss.²Š66:õ€.Ë,rm·Í… —‚¹ñ c=Ù•0 ]lxøî6 \*Õ&ìkV:“8Em> äõÔzµBÓXtú†M”¶°Íôò¢°‘ÜmE6 ƒö:[Gßá A¾ýùwËh§PòKcϳ•/Âa‹„êI¶°àºÈýóoÿ !Zà endstream endobj 1117 0 obj << /Type /Page /Parent 1719 0 R /Resources 1123 0 R /Contents 1124 0 R /Annots [ 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1118 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 1125 0 R >> /Type /Annot /Subtype /Link /Rect [ 398 393 483 407 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1119 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 730 259 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1120 0 obj << /Dest [ 675 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 206 517 222 531 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1121 0 obj << /Dest [ 675 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 431 441 447 455 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1122 0 obj << /Dest [ 1135 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 325 277 339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1123 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1124 0 obj << /Length 3934 /Filter /FlateDecode >> stream H‰œWÛnÛȾ×S öjX˜ 9…žþMþGÁ®­\Ëö|'’n"žâñX÷ØQR[ Ive'®ï®ÄßÿkÙ!¬[x:¡,-W›+ñx(ûé¶"!¾Ìë¥e§Rü›þ[ÿÈþº Éå:,²Ø# ‡ƒcùŽ';ÔªQ-ˆ•<ºŽ’…ÙÚ¤Ûlá‰R,T9~ä ?v’DDDR€A"Z½X-Þgc0|>qO£1E×ňHŠä(9ÏÑÉ8rAÏ,”n@o³‡Û·ùòùÓ¯O²¬{½Ö-É#)¾»‰BQÊw1Ë—dÅ(ë7Ùê•e'àjkùRw–€û›¦®Žäúd•Jbǽ(Š­z²~6™¢ÍGš:ð”ësD§ûNXž+!œ38í™ãàD0KÚêŽ-;ÑãcøC,ÑØ¨q“AÍÊ À¿ Ê*–ùÚ™9¤VA1Ù)OGs/K³Øó¯æÃûJôÔ@¼ Z!–‰¹•˜z³•¶ç`›kSüibŠ¿)Ô¸­ üP ¶P¡'76f*W¼Ùlyi>Ù6=«Á£Ï,¨.Äa£k<Ñ€'D^ôû¼ªŽ§¯~ß•½¥°áèüAù¾ý¡a݇üøJYIªSÈýìO#8ìí[l^%sü d¥yÙö]ažÊ]ÿnȼi„Ðñ¦nõÉXV7¥Û5öÂÔøIvÐÉsüÀ±RС,%|²ñKþU‹nßj0?ïűÙSý-Q7½(*·éØÄªÊÁûX®­¤™\Å”j5¦Ú¤cÆ|`Ú,‚Š|ˆAŽdpŹxÑjÊJê0+€Iô,rc­66ÙÅ‹# ©‹+ò$7úMižeU‰ªü ±ˆ¥mÙ„¯šòH[4Oê×MGìw_(6bµ–¯5¯yÁÿKŒ»'›úÆÇÖÃOYVâIu ·ØUðªuÙh@9ÑßvºèÅ2ïsr°h,È­’Û²^Á,¨ÙR´OÌá7/hhâ–ç0pb…î&£·Ñä­©¦û'SñË'(ŽR×P#M½*×û6ï˦î®D¾\–øHý…¬š BÞÖæ@†î낈j/ÉKó þ‡Àà,z®ôÏâ¬(ñd šõÖõÍMvýpw›Aúbù=¾»‡úï[Ô9á÷l¸8ºÀ¹(òq@ÍæÕ¯,Öå8FöŒ×èÒ ¥Ü?ëP€AüCgÄø„–CÌ:FNY¹‡lVÏÆ@4¢;£K:F`°u ‰š+FÅoHžhvýø!U9Dš(RrÒàjEã€21zÎì}:°)NV8ö ZÜÒ4=¹‡•/¹D¾ï›-tRAÝCe'î~ú3=ý$–º*·e?({ÖýAë1 ýd…Æ#•†ì§’Œ¨cãÄ3€  ö媦$ôÜít½¼T†$;ùãu8/C0È€Š(W¤Dqùƒ‡ã% aI+ðXFÌ«VçË#„"Ûö¢Y‰žC°!VÃþÙ¦úÂÓýçÆi:¦X)BÄÚé J‰º€4¢Øèâkö¾Hø5æD=É ¢Y‰‹þ{.±1Bãõèð¬+9•œG þ£yÔxÑY9L·îApëŠf Ǻ­„h$@vhÀr«3f>Ч3 &>þáËÃÍGš=÷Ÿ SJf·@bà#Dº”á§¢‚—õÚ²clþ‹ ­'À ÆÁ)Óö<&í«²2DЇ–DÜg´@LÂñk³&¿g<ÞwÁºä’ô1/ >A¤®ÄsÓ'ª/]-ü0þŽ•¦àHDYÕ¾+_ôéT \õ#¾™˜WPb,R5Ü%¬p XÈlœ‰¼Ç•ƒ ªhÚ¥¨ô‹®E°ˆ»ï„ÞT6'×7 P‚úÕ ?Þ<  üNLhÍDÀ­ñz3ÿýŠgC»(©F f·û™µ!7ôNÛ!) ¾BÝ W#禲 /If·¢ùF~Z¬ø%ί$ÿÇ ±Dl¢¶%ï 3Gð™ªLÎÜÉ+¼»„4”d-{¦qF<)z{jÊ;jÚ·­`ÜÊè{$•r§ß‰>_³çòÐòÇ;^Ìþ~5Ø_‰<`(ºÆI}%¸þàJÔêo³ ´Ë3Fl6?kĤƉ\ >aÜyÓó9èl$´O ~c„=áÏãWóɬg"mh4Æ7ÿv%°#¹ƒãä€@ÍqN 'DJG±*<$,” †¼Á:UòɃ’¿òÏ#ë}0»Ÿïè{pȃz(ë^›I°zä¢`IÒyQŒPËüH0Êgãõ „TU\:?ôr‡¾ƒ$Zv*k¢½“Ðèð2vú^â„ê¢`o6ÏGò½ÂäŸAd0ç}%äGœ7ž]ZÁþïõ ‚›¾jueÖ=–àÒ,Ž¢5Oõ ³m¶0à嫱k+˜¥S7Ø3g`µ]α#«m±b…Ù¬-¼ö,_Yž: }ԤβaîCFè¡=3U9©wÞ»ÞHïÂ>KœÂCö¹ï÷-ÞÎÚ‰IÌ‘<‘\øg•¸¸ªÎ¸Å`A80»áêñ,ðä èðœ½æÿ7üÑ8E\òöë©€fE<h&Ð<è7ã÷9Vа25·£¦ñþI=´øò2¶Žôy˜%¹™ ù™(„˜³ðžV· ;ˆü_;néòJúxOãú³´&Äû,2äÛs¥_-"‰úxhp½$Ä2ÂæàYà…4 ¤™i#¤­äGw{xäšìõJK¾"tâÃrï.‹Àl†™°lŸ¤ýíê8€?&€]tG÷Î`ù’+@²à ÖDàbûátBùïV­@v¾ä¯ôd…›]?ÜÝf@J3à¼ÿLïïNxhl¾ÿ1 ¡-¤ %îäãY÷ êÝCHÌÖŠŠ¡ÔØ`ØaË:ßžO?€PF—”|kán2ç‚ᓺ/5\&¡Ñ¡â¥(ª»Èýª\ïÛç2öÊaSÿ#¼Zz·¢ð>¿ÂbeKÁÛ€A£‘2IÛE­v©2æB<2ÆÅv•þû~ß9÷bÃÌ&Á¯û8÷|¯W‡nX­Ù )ì˜V‚20#ÇÎ:¥ÿ¤›D…€KünÚüÆT'Õ.ñLu(ìW‚zÜ*ùööœÿSàö,—AhJí¿ë¸1–\Â]ø:Ÿ¦–ÁÿéŒvˆx ¸ÌÜ^·X囯 ³DßîÁºKL¹c•€—“Þ–.om³Șx©í)-ÕH\ðNHF­ †%ÝŒ° .§ï5yõá£tpœ½˜ùë—ßÿ>fU—•a½Û³ ~Ù<ÄËÄyêÅKL‘x)2hŒÿô°ø²ÆŒÅ2œ3fÄËù¥¹&ò”Sk›9£E.R$Ž”Ê±TÀ†rr¬D3'AE…Òeèì€*5ê§:Bï¹;ŸÑ!èÓ¦«ëÓ¹¥m^ê9/ïˆgD µ/Ðè°{ m§#h•×: “Å`œ$uà/ŒªõÕ|ëØ_ ˜Föêb3fÅL òä{¤_>ªÔ¸º-£«&½@væ ;*‹cÑNGÞ¨ –$ \F¼<›ã HÂN~ hF¡2|ã‹Ãk ˆÓ²t¾«&P²3µ©v¤gÚ˜ßåþ¹ ÉÒž!ùB@kTA©gKC‡NUèmäç+€¸4Ô‡NŸš}W*$ØBæ-“cü£8¤º44îÝÞ‡èæ=}{*ŠM ·£P¹dÓG tAð⸠ݹ$ U^ N<Ó÷O²°³æ‚ÆAl£ú*Û–ô¨ÔBy˜qœ=êc Îʲhžq.2>«h¢À;žô;»°×tï.´eYëSVÊrfh2NXë…©Y¼…Ÿë2ô&Æöëö3¸L‚g°´QêÇd ØOÂh‚ëô9›b#¿žØãp!ÐK¹^ÓŽD¾^è_˜X’qêÿDþ7ö²ºÅ“‹¥Â§®ß“KCÜÍáÄ9¹¥v¸ˆµö%`>K5žE\Ç×'D2Î^¨ ±AÁ+‚aŠbœ½^.Ð0ÔÐh($ä¢ãž@QbT"ÂL°\ŸpªYÓ’æx½/*X%X/ml˜Òü\ ª+O~È;-«IB$Êsˆ*é×tÒh/œ™ø9-F˜Ä3 +Ét2 Mça&Û»Yž›F¬Ö,Ðd©O¹½½=±_6 õ¸v&nl[ùçSE“Æ[‰s^ô¡Êrâ<\ÌÉdP1­${§Ýd~¾]ÕX¾¿îfYÆ_þÓ¿}Vâ—Ù6 U–$ÕûKÐÅ—ÅNW¼?¿jŠûC؈6Ôyw9}NÒËx–æŸ×\k£e™}P#*NNŠþY`ï'%¹=v‹ñµt˜,ü‰&þÊ¥›ÏhpH4ê™õ‡®MÂù i*UbÍ­ðšãô]ŒÂÉpü¤Ï‰:r»Jïz*.6‰oA?”ꉇFWt.¶]kÄOe›Ó‹‡{w›b³áРD7óÞ)°kº³Ïº²ÕJ¦?;V£G#fSÄëVoºé6£Ü²xŸ£¦VÙ7¿  ›$õ9Üg†Ó̈ J¹KsO“w”òï6Kâ‘5Ú4HòuÕ$ïÕ¥Ö­1•(¯:Í ­êX]Y2¶…u±þð¹± ½5d%+õÞI¶ U‹YÀ"0t©$Û6’¿rµô±b8w`,õa(íÙ³ƒéýš(9ç endstream endobj 1125 0 obj << /Type /Filespec /F (SDK_manual.pdf) >> endobj 1126 0 obj << /Type /Page /Parent 1719 0 R /Resources 1133 0 R /Contents 1134 0 R /Annots [ 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1127 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 246 544 295 558 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1128 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 321 544 352 558 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1129 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 246 298 295 312 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1130 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 321 298 352 312 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1131 0 obj << /Dest [ 1074 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 356 94 397 108 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1132 0 obj << /Dest [ 1135 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 321 67 362 81 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1133 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1134 0 obj << /Length 2193 /Filter /FlateDecode >> stream H‰ìWÝnÛȾ×SÌ]‡€ÉpHФ‚À€§[‹Íb­^´q/ÆÔÈb#‘IÙq¤ïÐwìE¿sfø#ɉ÷¢Øf Åù;s~¿óÍÛåìÕr %–뙊DˆøIò(H’0Ùb¤y‹ånöê]›‹¢å=¡h‹jöê‡%îÛY„¡Âžbæ÷Ÿ3ù³¾7– oùÙ‚-D‹‚ãà ’…›Ú°¤÷Ë™¥˜Eó4ˆS%â,Ès‘*xRÀÆ$™­go—ƒ3b…-á±7Fï†äÉÞCŒ£$lH‚8Î3a‡½S³ù<È¢‰WÃyïÕ0¶6)ÄIÅ^$R¼Ñ«]Y5†GzõÔ—±ûp<—ûîò5TiÊ}'°e. ½ÝbC&ÍJÈË_t% ëë–ùWÜÂ2â‰_ZÔAŠ# Ò&‘”+_u‰Õa1è°°Rnlž‘æsçù”WV™ô…M‚ÄÉå*¦O“µ8qfjƒq‡Hú ŠÛœÈVÁ"šîE#«¨UiËÏвáÌb‚‡Å‰ÛU:ñÙE/‘]×”w‡Î´4Tl/ ô%{3F†ª®Œ8¶õ9O÷ÙwmÖú°í¬Kó—âkïè¿é¶ påIZ…cx9<.€pì }/7@n'°t•ØzH;óÙpá‹Ç±Êpݡ䶚·ì:cwîÊ#¦ðÙÕºnvX©« ±®·+Ó`ÎwÐ?0DÚC-'GM,ð´Ñ­¸3PkmºbcVÁs&«Q˜ry³ô¨CÁ*Ø–bøECBPÜè¾®Wb¿Õ…]-ÊÝ~kv¦êÄÚKdÍçÉ/!ô²Gö€9ŸÈtèÞ—BO…{ÜÝV ÏºƒöM0¢>ºò`™$ĹõqæÎ¯çƒJFç$Ö9©¶å'#b=ôÔ…d U ´ †|±ð•](ì„]%‹ y./ußÖÜÁŒ¤¡·ÙcîöR yNè¢à]î;ëÖÙW‹råa¿KRe£EÙØæd@<ˆ­Ð_ ¢•I‚îN««©G ˱Üsßà8Ï‘/h'ˆ3Ëðc°¤è$£Ïën}¨ Êh®µ[.¹C±šÇݦ¦vçº,¦úv@ÛîÐv bEÑÓk2k¢Ö¤@ìêÁ ºeuo­{,»ÀuRÓõ{Î}|‚®#žéþC`ý1²åOug¬rl¾G‰ùD7—½yÆÅÊF6hÑš€ú´…ˆŠ„Zv×»Q;´)œèmðŽ­u¹eƒŽ/uccÇÓÓL*cÉ}ÃàÌyϧâ`¾š|`þ É-¿‰,³ÐÝ©Ì\V¥]&¶˜Kûð+ôal·{Fºc×]´{yÛHr"Krr{“qó_&8If+õˆË(æ2Êq™Ôqõ?ç2*±¸\&J{wg]Vq™9è*úÞš¦cpà‰î$†(1%@(móÒ¼Äf?;§B‰0•ë¼)q"á0egÈ1¢lâØ1™ec S> 0ÖÁÎK(Öü4‡üþ“©- ˆcîÌ_Ô/‰>í¸a{‰SY·IR´NžHæÅ¶4U:å¥n޼#…ý;t3_ç/¶˹Ð˪íˆûàN¸ôŽÈ7.Õe}hÐ`¸·àCņÈNY7¦Ýøk*ëtæJÙùÙá±0ƒt’‡–OõÚ…§5žœ>roÞÛ§Ãò[nøG7ÌÍqéÍŸ>üôã_i9’·èQ¢oÔÍû•¶';s¤•Uè ·\ÙVyý˜æB:ñŠÅS¼‚£ú\?åFbùSÈš´k) |´o™Is6@ÍŒ´dÔ×v1̲*;;â´O¹ ^2Ýf! Ç b§~HSJc<Ö3DêÖ»ÀQÕTà^Ìôwåý|Y:ËH®ÌnªÖæ±ôºèô½!bjk >Œˆaư½xßÔà¥í3òy'I~-®ëê îÄb3d޵‡/´ÞãŒbjÞQâ··³?vO2­UÄÏœDéÀmÞ/gÿ4sÞÅ endstream endobj 1135 0 obj << /Type /Page /Parent 1719 0 R /Resources 1142 0 R /Contents 1143 0 R /Annots [ 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1136 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 377 598 385 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1137 0 obj << /Dest [ 675 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 584 88 598 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1138 0 obj << /Dest [ 1126 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 299 557 341 571 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1139 0 obj << /Dest [ 1637 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 336 261 358 275 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1140 0 obj << /Dest [ 1144 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 227 178 269 192 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1141 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 435 138 475 152 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1142 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1143 0 obj << /Length 3222 /Filter /FlateDecode >> stream H‰ìWMsÛȽóWÌmU&Œï—JU^KQ9»±·,æX9@àÐBL\”¬üü‡üÇòº{‚ Öö!µ§-U‰`¦§§ûõë7?®/W«@ùjµYøòð‡Ÿ( Ü(ò•æ±›d^¨V÷‹—oºL•ÏñTWÖ‹—W×¾úÔ-<×ó|Ì)Ëáñq¡)>Ë”³úç"çE¹J=7O`8ÌÜÄ»¼&àåô'´ú£þO€·ËÀs–~è&ÚËÔ퓺~ªû;¼ ´q`IwU§^_½Pÿ¯³Œ1nñ-vc]9ž.ï^¨ëǪÿ—i·l$ÔE½v–¹VÿæÿÎ?V^ð‰ù4ç&¬.ðŽ=x||tÐõuG»Ú¦±¥‹GÏ ti_ݱ¥ËÕÂW•Zq↉¯ÂÔÍ2•øˆ¤Â£Lµf±Yü¸ƒú˜âGã]"¢9zÈQds¹^„ ‘†Yªd85c7 &Qõ²ñQû¾Fn8™›juVlMÛïZÃÃ]W¶ÕŽûóWŠG½*ùE ûz»5kYyk6Më¤x4ª3õºª?É ¥…a –8±ç§Hq"RëÅ „³TìÃp¸lÀñD^îÙäDþ`Ë—½i꾨j³VUýŠÓ2xsÀuâ¦CbŸêG}¶.ú¢sÝãt‘›is®œ»ªVg8mF‰ïmexX÷çãÖõ%o‚£Ãùa#ñU¶xýPTŠJo‹[‡ ¸u&m^ý¶³¼ñÀÉáÔ/Þ«Óvð5ÑUSÏIÜ º„Ïuß©¦Þ>Ù`ÛpN„»õSϲ$€Ê±ÂƒKÙèRf“PÔª”DHâ¯ä€m„“Ðtˆn‚%må,# ì}=´âC>ú‹•k‹[¸a¾ôÎ2CtÅ™ä€"‘óf˜tøÜ#‰™\bˆ™Ù\oj?GeëåI´©‚fÑö“)Šˆå"Ý÷mu»ïMGCŸ‰ÿÖ1¹ uÝÔf¾ï3ð~ÔfSì·½D2ûVZ'¥žòIëf Úò°Qøî¼Yýœê 5z‡Âê©\ý³µ)… ÞG °°”ƒ x–ùbJDkMôå€1}ݰ [ë²^Jj…Ú—õš Þg*?Ö -²éÅœésÕ7 ­aºF¬>0s¸jî¸ü§ jêgV£vÛ¢4dÑÁëb½†ãKÛ£1£Ø&@ÙfÙ·…Úmqoz⅘Ъfß„Üè9÷ä/ŸÈã\ƒ·Õg£6Õ«±+ZƒLÿˆ%€©›Ú¾ÑÎ2¥æËCcTzã(l†Œj‹m¿ÙõÕdþa¦ß8®šœjRÓÁžÀ¦ûí½Dôoq Âí¾CǵÙ×%ï"Þ¿¾¸XQ=Äúõú ôÕåêÍÕÛ}ã@\®ìÛKDþ —í{ûæâOo^]ÚLŸ‡]4J<8Ä–tœeˆ /‰À½ºàú õßdl¿~ hÅÚ~{‡¤ct…¾9.ä=i2 leçÙUW2}ØÁ v‡w«·ï®ÈÂITD¹œ2廦GÛ¹hê˜.7`²Tï)EÀ0SÉ£ “Ú  9bEZ&páIE‚•wnÓPº}ß¡*dñqHüwª™ØÏÜ "ÊÔÌÏòÕ5©C¤Î Iúª7÷]_ô(×HïùC'€9ˆŽ=êìzp;Ȭ±Ópl`§’æ£.›µéP]<¹%DtCVzJªþ¾›÷°Se¥>i¿ÿ«²9ð‚Ÿ+*þ¡Y+û„€ñ#Ãû{Žƒùúå™Ð¡ä3‘òí?ä~‡sæúK?€îwÐAá<÷¬ƒ¤VD 1ÎùmŸþ1ˆ˜ßYÄJr0¸£±53mª•ü0ŸÆÌ§r¶ÓFóˆå´ÞÔæÁÈ|È™E kp™]´‘ó~³©F6}b1§\’©¦4Õ(<æ®]Eí]¢è‡VñÕP÷þN s;È’´S޽«M…ÃâzsÛ  ±”q¸ j€¾>•5[Äc Âz¬¶[VQeÑ—wj˜æÓ<šQ ý³ DÂp‰ô“¨ø!J¥Œ(',¿³ñJ[´掼-¹adêNx)+ØñhpL ò,Ñ;‘XhµÝLUMDË ªüà ª(~ü ˜äa%UaÊôEŸ¹û}×c'yßïÛÃ-Ó·u“»~<©›#žïÛ=ÂRgÕæ»A6)èƒÈˆ]U`͹S}ñÙÔ‰ÂJ=r¶5¿î«ÐZ¸‘ÌP‡^D{~¡€Ó>V¯'¬4áßh,ôÈö¨ÿ»f¿]ãà|ävHr6ŒØ&àD‚P9á× oŠmg,S€'ÞWp‚ú®€ ˆ'êÌ0N”©?APŠÝn‹Íõ“Z Ï©_R ØK ”#äá8ÃÕÀÆTÎÊóÀ[B\z]÷„è&8ù6á(nÿ„>ƒnr ÀÄ„$R‹ ÇTeª ™¶s쑟®³—0âl[1a(uXû(Ÿ­ùúÚ4q@·3GFí÷Â.~Î/ºwÈËÞ¾0_Íú}QL½ç:ÄR¾‘¦LXLF,2BÞôænc׫׫¿^“¾?Fôf8-¾˾Åò+.Þñ’åÂV‹>í$Zô ´Ã¿T¬TþÃô$\:sÏWYʽ|kÄÊÚNušÀµ}1˜†|÷iÖ®i`”f£®Ÿì&å_~VvvÛbâótâÓÇù±>±äƒËÞ6¹œH,ñ<Ô.ëqÜ{¼, Qîg‘›Päƒ(œ©òA+‘/Q1Ø‘™˜ÇTƒ,ðƒ0;µÅ8É¡ç†ñ„6¬îðÓ,RHÊ;½Íe„þ]›ÇB'ÊFÀI» ¥ëÑZv™ÆeãP)­ç´ ÖŸ°’åròe ¥mû=Súõ^ÆfM› ¶·ODÖS¥’o{‡$×­øëW jgƒž]Ò%ÏŸ¶N?°;îDHXK­ "]A„,ºflɧÂG¤SÍÂg:Ãë£ÕÕ+àÓb{l TÚçÁªt—ª.·û55!dtÑkbê'«¨JðóòYÙx•Û±&ÿ¡›P7·ƒiw.p#7 f ÷AÿáòúòŸì‚‘ïëÛ¦ÙšA‚ÍAŸ#ç€êçÀN0½Å¼E¯6< t½ž>HÜlnç{?^y“<¿"Œ.ÍÒ‘1&¾Ôm«µôz#|Q ¿ßš»â¡jö­êL¢FFp¡ƒYNÛíÙ §L½ÞÕ±—K/¿3Ф6lª#ꟑvƒœ!t‰Ú™vɲù¶8j±2pY4Е†øÖ!2#१"ðÜ4›ÞAòIf)96îŒýÑ%-øÊ%ÄT'ÛSp¨OÒ¥Rt XP¦hVöŠIìþ¾çúvhKÇ¢t.žF]é£~¿/ÚÏÈ‘>‚ wQ)ä;ºoLŠƒáæØÒ›ÚµÚœêªÔõóiX²£°p@–|§9‰KNâ’ Í1·¾"*”£X„< žbÃ^`“//ˆh›zùþ'5ÞÂbĈºÏÀ3±åBËe9µô#¼ Dê‘Z52T8w¥DÿôrçM‚pŸ_አ?eÓD" u¤Ä]*^I`> ñï3³»g,›"J>|^ßÎ~;«ŸœÒRûŽÅu°Xõ—kAW(dRB沕¹¨3Á‚+줷m­3Ž&aWhÑÔâK"‹ï6ßÒÚÑœwDÔ.¾>Æì+R¬©ÌRª,¯y·ø!Ú+´§%¢iÎZ×àrÔ…´ØZ”“Òk†!ÓžÃ`Vë[³h› —Áϧ“Ýîž4PÑqÕŠ,Cåâ²´ÕŒ–0"ù1mA´w§'ÉÞH$JçÖ"¸ðù•³ç×1ŸôÆúGåˬDýd£Ù{i s<»jL’:i<›/ù„µdè‘:NP ÂüÓžÀêao¯_Ñ:1¥dÓÜÓúT4ÙÙ{Ö\«•5Ç`ÕÀTV¦P&h]6´r[k’ÌašõŽ>ÌZÀdú¼fSk`{°B† Sù ñƒ·ãü•JÂv»e*¼…Rã§ÆgÖÛy¹Z§!¤‘®ŽE겨õZ÷­V"] o¸:›Å¹ÙܼÊY='RùF-ôgh7fùÐWÉ¿à‘*_vEÿÛÉ+´ÉË9óº8Ÿ'ê$ðůëNx4¤2šð6÷Ò½Ìð½CvrPo÷Ôþjt›—? aÜe? endstream endobj 1144 0 obj << /Type /Page /Parent 1719 0 R /Resources 1148 0 R /Contents 1149 0 R /Annots [ 1145 0 R 1146 0 R 1147 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1145 0 obj << /Dest [ 1135 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 483 412 524 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1146 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 147 162 187 176 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1147 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 210 162 245 176 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1148 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1149 0 obj << /Length 2560 /Filter /FlateDecode >> stream H‰ÔWËrãºÝë+PÞ„LD_¢È)—«æÎÜšºw13k“\gSÅ E2$eó!ù‡üc9Ý J”ìy$Y¥\e Ðhtœ>øi5{µZE*T«Í,ŒT€?ü$Yä'Iªe¾ðÓ,ˆÕj7{õ¶ÏTÑóœ@õE={õþ6Tý,ðƒ ÄœbæÍÃÌù¤ ŒåÊ]ýu–ó¢\-?Oa8Îü4»¼&âåÔZ¤´ú7çŸF½(p½0öS'ÈÔý“º}ª‡-F"Ǹ°äôe¯Þ¼Ÿ«?ÿËõèwø¶ðNéN±«ÛC9üÝt‰]¯]/wÔ?ø¿û—Õ¯3>1Ÿ& üÕ;Œ±‡ÃÁwc?tzÚÕж0-}4?r ;´eK?¯f¡*Õ,Z¤~œ†*^úY¦Ò‘T8c’©ÎÌ6³ŸVÇ`Ä!¦çÑ8E7 ˆ8=ä(»ÌÑÉe`ŸI()Zx»úøéÍ»w¿|xçܹ֊ÍôÒOr{TZÙØçy&'­n‡¦í)¦¡£ôz]Öj×tF­õ ÕÐ(ŠGê/œi× 2Þ˜á«ÕI)t­îÚ÷fMÓ‹¦ö8H^ä/—Ê }‰l.ìöQ¶í‡²Þ¥U-"çÉõ"§.”Þ¸ r8˜Î]8䀢†¡¯ìB«©?¸±ódWÈÎC­+éc‘T9ذỆ²«e˜ 4lYmíªqÝꢞÔà†˜à†~†È…iy@À´ú½EóæH´Ùw ‚f‡I«Ÿ(B$»uï‹•S¶½Ä_F­eNÑ:¿)Q‹uÎSÇ “¥êöO®—:ÞJ?~ºsè¨1áÀnpÂ" t޶ƒxDÂÉHLqŽi“}W÷|\ŠB5­é¿)kj¬r3E»)Ò´¶8Qý@Sà"÷@G³6êÞ ƒÑlÉëjÜÚÕvMazÇWŸš¾/OÀÉ8Ñ8™xå™ó}Å w)¨p—»µ’uµ7”SHÛ‰¯ÕЦ¹³^_ÍÕ•ýÖVŽ…Nah›„G>²Ç¶|4.E÷kS™AÚWb «d»†À‹¨xŒa™(65cIFÐ#,˜9²ÓÙU‰Â‘dCjÒ‘¯Š¦}ºR`6E¬ä\ítë‚•çê§Ä’Gâ Ò âl©¤;òH ZFSIF0C?Nü(séÚ¨ëÎg_—|æ…³ëic¤Yû¾/º²n^ƒÊø#õ[îÁ]¤JŽè'qÌ O‚py„bxÜÜrRÏf:½Ú4î’è^>(6 Ovø’¾¼IÏys‘G8Š%]Ù¶yÛÔƒ.kX,ë×ÌóKG]Ü_z¢Ï0=U>[»®™‘xÐ q ‚bn”m©kùb¤ûho^¯®‹ª4õp£î;Í0å ÁÔ—áÎ}FìÒùíŠCoué(*}ïR%¬º„ÀÿÕ£B0BY«O–>*øÞãâ÷ª©«§¯ûŸìe—i}‹BQHÌ%Ü‹o„›mÄ“s\^Êè"¾ñ!?ú‹•[Æ*»a¾ D•‰#ΤßɽezÖ;”ó‹bí§á'ì8Ù%Êqqa?òƒ©ýäˆ-jb—ÑË ]@Î&ñE´™#(i ê¡+ï÷ƒ±Åމ[ý½c.YRÔMm.÷}!À‚¼ßœwf£÷Õ ‘̾—VÙclh7%$Â[^ )8Å?/ÿè åR‘Ü2îËž;J~  Hš4CHH¢rR˜2Ó|1ÅžjÚ½ÙÐmÌYŒ‹ŒX°öl¯fÕ¤íà€ë—:Dab°hv;½V÷ÒVX£–ÙPB[x¨¢iâYLØöÌ C/U«7eth¦áÉWh ‹£Ä›„]$èäúÖ妄?(ô÷ͰUT¾ió£ôS•y4ˆëPVnŽJ_a18  +¶Êò÷¦é¤Pñv7¹Žð¦$!tJb‰ÂHúÌ0å€a±Ì02Eþ#}$‡ðmâByˆ%–9»¥1H'™š·YZº•FÛÔŽÜN3’ é@TÑ"ÿY̽©H‘QB,*Ä#m-z°¶1f±u¼5¡½6¨s§›9åø¡#X@_áˆÑ3^òÊ.yë ªÜYê ë¡'\ít÷y”o £rÓ=’yØWº»¹Æoh5þj·B5h>ÏI7‹xËý,¹¤áè\^8‡¦û¬»f_¯{¥Ûep-ùµŒ3 ÷—““„Þ@è›ó—NH¬x"™ð¸ih“öå©PÜXÂLî°ZÍQ"= 'ÉCê–Òí(9åŽ]³§¢¼@]•Yf7-ç@-d²]Ã’u.ľr?ÂkÞIŽ- '²ˆW*3ŒEVÊ%1*Û’¶]z•–·‚cŒüôýø²ã®êíäÝq 5gëìvZ%½—Øìk;8ØA võûÚ:Á=»OMÁÍŽ‹;¼ã³*„¦ëá9;ºÔ ¿Ûíòù6—ȃ(ÎŽ­BçÜcéÅò“œ FŒóåÙØ$²ã%ôs2Ù'ž‰ìr0e‘Ý›z½ÑÜ-+àçæ5k_°„GŸDùn4}ãI'-ÜCĪÚðð—áÛzû¤0)ɺ‹Rÿ\BÇÑÒÏX˜ì.Dû-¦£ ¡UôÒªè©èQxÿ›Êä,Nba—MSØ¡G$•dpìHÞÿ/ÆpD)Ù›¯ª®Wpzöô ‹8¸$¤+\ªiªiÂVÉ%Ž•cë2óÝëœEQèìÍ\1 _˜]SŽÃ»£¦±Ã,§¸Ök¦Úk>[;TôñèÃ: …ºA]Övè+zê„‘Àb„ë%–DÎØÁ© Û3Ô“¦ügy² yßõ}Ó s‘E€…8ÍE%wGVì]Ò3P,¤þ c)›,ØÌ12(Vf`b]šRÄQMO†ïxæ=ScÓ—’æ+Ö.”:*7TÑ`øÀôNIÕU9 ðoÆw¡Šý`®48jK U²åÓà;ô/ÒcvmÓéîIíÁu´úЕƒ÷ƒ'Å19þÃÙgu AbHjÏÎköÃCCkÍ L t7°Ô=´1fÕyëd}¥3Ø”]ÆÏyýœá Z÷ÑŸGÙJ±š+Ê> endobj 1151 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 401 625 442 639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1152 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 389 503 415 517 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1153 0 obj << /Dest [ 507 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 400 300 414 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1154 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 173 346 215 360 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1155 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 279 267 293 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1156 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 389 211 415 225 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1157 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1158 0 obj << /Length 2177 /Filter /FlateDecode >> stream H‰ìWÝnã¶¾÷S zSˆ´¢þ•v³‹ÅhO¸çlz¡ÈôF…,'}óçÏEg†”ä8ÎÏÅ¢èE€X¢Èáð›Ÿïã»ùìÍ|‚‚ùr¦Bðâ<ôã8H!+?̓æ«Ù›‹>‡ªç9ôU;{óñRÁ—~øA pN5ó†ÇÝLüR~Ñ ¢äü÷YÁ‹ È¿HÑp”ûi`íòš—ÓS’ÒêÏâ!Žza =ù©r¸¾‡ËûÖÜàH(´DK¢¯{xûñþóé%ø¾Áo‰ŸˆZ¢º9Ë]mþЛ†D¢lÒ+ü—ÿËßæ?ÎøÄ|š0ðS|™¿Ç1ö`·Ûù2ò•èiWMÛ¢iÜÒÇÇÀEå†nØÒ‡ùLA ³0Iý(Ue~žCªIÀ3Æ9lôl9{7ÁˆN ¢1¡"‚ÑÃÅ.F±Ä8!ö£(ÏÀ¾ fIâgáªAH6> ¥üW2÷3g¦^é­©Î%ž"'<€Ÿ"¡{S®ÖôéTæ̽ÄóÅb­¡[‚W—ˆ»¦¼.{íôã( ÁÃ*#üìÞ1ûO{±Õá ùa²Þ…æ{Þ«!%”ÇEך²nõêö”C¹ N9œúÙDòaJÊ ²FÎ¥ô"<”‘ÊÏ…{ée"L·Ñçp%Fx®ä"x6tÔ}”éh´—©Ð£Å[÷{.½s:û gUSëÖЄj.Îì„a·i"C†‡XÀ?(ѡép“†]h^ݵú ªnµ.Míí9H$ &æuÝÔæžN÷ "c7Õ¢–1 'BÙâFƒä…¨d‚+±6®»®Ñhç¶l¶s«y´ñÈ™htF¥ã>‹·TðE³©¯·ñÂW%È%Ìõ—Ò"ãÔl»V¿¥l½×ËrÛ{êü™-,rcöé»ä\ËEƒ…s%ºµÞ¸S·_ ¿ï^}ßCÓUÃD L²ðIlxb ï¯=6ÞSw.ç\èÑØÛ†®¢ÆVƒ»E{ðäSÕ¸¨/ôz£«ÒpíA$ ÌDì‚Ô>tí®Ü,ú±Z›Æ;x¦jN`ËuX“¦¤³þѵ”8FeÂ%¶HüokÉõ1…˜Ô-—ˆ¤JÒåBº°cC.O¥~¡öŠwˆÏä—íXÃyøi ½6`:0ÒË™_ˆ¶ú\_“•æ ›b*Ö€ôƒ[’»‘fKMßl7Ô´¾E`áÖØµ¡¸vï˜où¾×„à_ïß]ØÌÆöëfû¥nñðn‰õF#Fo¼£½JM¨»4\Sã@`)–%ö=Jå_çü{;.%¹ÞÙI+má£ô2>>/Õí®®nà'ûF±‰‘ZÁ©™ VÑGêsJØiöã•Ä€¡=$b‹ ÄnçÜ¡ öÙYo¤H0†L@û3Y &F8…)´®s<î8èÞ»° Ÿ9†Ï,ÃGŽá³‰áO`·Äα1©í˜<~[Xò#~gvO„³T6ŽB<°äL˜›ÒPÊÒt Ü5gÀ¶ îÚp k·àx«8LUSWÛ¦ÜÀ^òIJ„÷ÄeÜVRa+p°Ù• :)):Ea i¥+×1«8¾N %.A1¼ú#Þè!¡ñþ€$¿’þȯÑÁqŠñŽ÷uptHÆ“ ¦Åv4¾až iÖÆ‘8KK< Õ§ ¿ ~• Φ1¦tÿ¢ŽíÍàkja5±ºÊG-L¡M}¿9ÞΠl§!mGnÝï95ÄŒ³]Ñû$hŸ”'_UG“Žú çE úµ®êemÌ*z’Õ¨ŠQC`¡·/ЍoJ`>!Ò.ÿ}I,›ˆ? ÓJK¼·•h_¨’1ب7ù•E§•›ŒçßBsþ¬w,6}V˜HP‘8"33?+^§2#·v’ ¤mù.å.Þ¿lñ¯,H|#ÁB3êW8¶=c…ê'{ó’»´m0~óQuñåÎ'Y²,MH–j’¢ÒC*ä(ÓîÂJ‡Ê4> endobj 1160 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 471 757 487 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1161 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1162 0 obj << /Length 2659 /Filter /FlateDecode >> stream H‰äWÝnÛÈFoõßd˜4ÿEÇY.²›E­`ƽ ©‘ÅF&U‘²}¾C߫ы~眡HIÞÍ"õ(Š 9œ9sÎw¾ó÷f::™NC¨é|„ÊÇ?üÄYèűŸªñ$ñÒÌÔô~trÑdªhx¯š¢¼»Ô]3ò=ß°§¹ÝããHÿ˜ßDr¦MøÐD}o’Bp”y©/rùLÈÇé)Iéô'ý«nè;ny©ö3uûE]©ÚVBmHÒMÙ¨ówÇêÏÿrÜïk|K¼D—ޝ‹Å±º~,ÛŸÍzÉB"W3ÇhõwþëüeúÇ[ÌÖ„¾—âeúk¬Áãã£çD^ ºÕе+=<ú^¨ »´`IßMG*Õ(LR/J½,Si$lŒ3µ6£ùèÍt F`‹¿‹F®OˆhF¯÷L‡ß8õ=üïôÃ@z"õ¯æª]ŸZжqbèªÓª¶V­ãfÞ€.£n4LT33Ï7’›e{ã«¶¼7M‹µXßñL¯ÅorШ¢®̺53Ê8€PeTI“-¦…«7Y³`õs]±„Ö<µdgÏűv‰Q=·Ä6¨Û8 ô7F%^xã¨[3‡F™®z­ÙV¸ŒÜ#j¹@È”xЮ“ö‚-j³¼ÍUIÂÁ1²ÆÚZÎïßóê{'Öb@Õª9^èúDË‘{'ìyk…-ËÏF=uôaœè|i@HvN.ªÊAðËíÔ%,ïˆTE.ÒØ´H[Ñ «¥aݹ²–•ò®¬òeÇu²>ê¬÷ûõ#±ž¼ÂNÉUß¶yYÁìù* 8`aËÒ ¦Û¼1ê~Ó´Ü–ÝÇBº"¯hÕ’mž/ãméÛ|{~ 'Ç^ec%¯ÁÓ ¹kHðxŸà.¢³NFN~M*‹|Ý^hÏN?ÐZ^´²J ÂÆ J®@ ]AË™œ˜×k ˜G s&|ÆÍÝÒ‘5ÉzÒ0M».!7ÔÕ~Ÿ¶6gû9vkh{Ylƒ¿gøH%ð—Õ)ç›±Þ ³A’" ‚$ëÉlõbL'%8À‡„"öìX½–%#+ö÷ ·Ð%Øлz],Kðúlß—ïÝRÉíØÅä (ÄÑ?ùŠþƒ(ï@¨r$‰z®¬ )TR¢~ä!±Qµ°÷VºM=Ÿô9Õ‰X·ðÓí¦5 ½ú”Sdô5Çœ‘+Š›­~‘€Íù¤ß"¥"™ Ù×|˜Ê¡£ó®¯à•TQ ]Û5oP!üýÛ'?è‰,Ÿ.JN"-A™(æv¹²ïâZGª_ª¸P%§7*Û—TÛ­=±¦h¿íŽ#¢äiF§(°>¼}ƒô—â¬ú+-ŠΖ\N';nLe÷”<ÝÙ~ricSÃt¯¨ü=riS äYTõž«É9ïpbñvˆç¤H¦¯/®®ŽöÜ„Dœü*UOÕjéL |Wc÷¶lÕ9 :VäÊ“«ëTpSífY2q¢4‚0â: 4‘ŸÖ¨¬ë½‚Z,5V”k멲“È…5[²“:æo›òêK{LuÉ“ÊD ªÌet({¿Zõ Y/Óÿ¦É ]þ*¥L[x{øãj¾?ÿÇ.Ö/è8OdÉ41üô¡’`*ãÞèqçJl`#0 ©ÙËÉÜôãÄöXV³ú‘“ /sF¡ÔÚábYµ2욈ÚG ñàö—€9”p $–G»ÝÂn¸ý°nŸª+89Ò×Äà±þ0`×>$K'‘̉xÛ7A¿PPm{)²çãôÒÍöLAG8L©=sý´3åã”ëÑ%±`¢]nÁ³]S¨IÚ:0&!-_Î79ß½ £øépŸ–À=/ÎìžÄ¢ëqVÎKj0¤ý#¦-/2ÏuÕÔ8AY~Ez˜q¦àOHÚ.Ô‚3¦õÔukµí7ZÛ&ì+'Ñ窪‚Ô“6›•M0lÐn§÷nŠÅ¨UÍ9 É._.•t !ÇÞ „jÕ &È(4­k…Ô&ʺ’‡ß1½ ýwñ#Ï “(=L+Ù€ýDе™;î» iâóyÊœ°Ç虜ø“|,¥ŒP²ê™Y9ÜþäÒõßѰE­ Ôà£;(Ý7_àCvXÄm*}à®±4kY§Ý8C‡ÓæVÒ»¼+ÙÀƒögD½ûáyx“¢-Ñ»>u&âÈDwÎ5ëëEr õ]ç2éJ’g'82á”— m‚Œr|3SÜš?ŒÐ Ov*W¶Ÿ¥Ýmmg¼3™8xQYI2LµmYÝ©ºZ~Q¹ˆ¿¦hívšdÇÆáöcR^ðÕ…‘ ;âº3õà¾ÁXÕ7œƒI%îçƒ媦V%C¿ª¹%DŸÓ”·Kª7*$‘?`Â*çs³¦¨t¿XTÙ ú)+b=Øn/ë¾pú4pÕÕ\mì Ñp±Øî>7}• ºéÐ<±7¨9ã!BóØ™ñA¿g„T¨eöÌìD -ûÉ(>%ÛÄ?%­RRH„×Ô+ÅÚJ!2æEÁrìQÚ=Ä" ©œ1LìµYæ¶‘ÊÕJ¦‡œNt¢[n…Ëb³´çúl·×ûÓSªË>¿e¨"T®”Xñµ¡6 µK”~5Õ¬9;e”©Y€ŸìÃŒÄØ*;íEǪVý,+y=æ†é÷˜eÃ,ó&áÿæ,;ˆß˜e“ž2ÜlGYr¦ ç¨{†ß2Fþ7§×ƒo›^3[lgµxåhlí Ò°JHÙ˜Rýš™95DjF Úá11²º“1‰ùof§bËîlÈìþææuh„KäÙoP &£ûÞ(ˆ»Ža«:gkÉJ¨¥êí‡ë“Ÿx ±_Šú~•·”ÿ¥3üïêÚ..7Úòßrf yŠëå²~D4Ý¢°)ŸŠW(Õ2Ðþ¹Ì7t]ްåîÆºÖÈâãPÛ¼ßt!MM^r€4îóbo@Æ¢×÷[Axˆ^Bª²9(Ãê|EÓê÷ü–KQ.ʪ­eßâL`'ß@,Ž7ΡéÑä%çY)œúhS•O¶O²ýˆt»ÇCÛcÍTÿA'ïËjó4´ðý¥µ.î­;κ8{I뮡.8:RÔPŸêéa¤ñ7ºy`$¾Z¡ŠƒýÌýDË®{‡êþ+{ÔTTÜÁ.‰j3ßÔ_„Lr¡ä™€±ÝU:>;»ë©ÒÞ…ä‹ÍdlÖ6“}¢Ð<‡øÏÂ8ñù¡º‘æ…‚KRŽ>š—KsŸ6ë=š%øÔcß×¢ y.A…z˜QÙÜ®ËOÉNG²7ò‰Ó †š&ð ¼¥ :Å‚»:Úµ‘_IVÔÿ]Â7¢6í¸ƒÓ,@fÝw‡Ïý‘LÏLó¹­WªkUp°CöÆžƒRóÿ1ô=„ 8ì2q ™P£×Ï#ãçæ‘Ž;κ7l4&AwŒd0GTÑl0˜FÖ4P¡i iÐb¤`¥¿›Žþ=deê endstream endobj 1163 0 obj << /Type /Page /Parent 1720 0 R /Resources 1166 0 R /Contents 1167 0 R /Annots [ 1164 0 R 1165 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1164 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 484 382 519 396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1165 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 351 78 387 92 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1166 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1167 0 obj << /Length 2293 /Filter /FlateDecode >> stream H‰ìWÛŽãÈ }÷Wö©´4ºYV Ìm'lf“m¿$ÝA Ke[Y]¼RiçCöòyÈ!«$«Ý=— Y Á\,•ªXä!yH¾^/^¬×¡Äz»Báã~â4ôâØOÄêzé%©‰u½xñ¦OEÞó_ôy³xñþ.»~á{¾`O¾pÇÇãBþ>Û)D¡pÖ]\ó¡k±ò½ë‚£ÔK|#—Ï„|œž– ¾—ÿ±ê†¾ã‘—H?›“¸;5z•P*’d_öâÕû+ñ§:îï¾-½¥,_æû+qw,õßUW±HfMá¸×RüÂÿ;^ÿvÁ³5¡ï%xY¿Åkp<='òÙÓ­Š®…h\éáÑ÷B™Û¥=Kz·^¢‹p™xQˆh奩H )`cœŠN-¶‹×ë Œ(Àÿ1gt}BD2zgÏŒø­ßÃ?sä9øïe»ub(/nz'‘ªÃK*?Úß[Ç a€hÍ«¸É«R5úöJ8/a¬àCf—Öe³%­ˆ× ad·N×XYU‰,Ïí˜æczŸi‘™J4­öÙì©2­`! ¡[‘‰ƒÝªÿ—ùPÙ…Ñgnà r öŽº"ÓY¯ÛNy ‚;¶Á{~ c/ŠÒ•0¯š~ì­ÂY8úË1}‹fxÎ.Ô‹×pÀM*« õJVÛRñzUô""¾ââ%09f§^ðnl]Âx‚ û±ÕÓËüõJV©ç§3½‚Q­Àhõ¦mtV6pHÙ¼ä¨\ÉI¬MëbãšmÂê^Þ0Z6H@æPâ¨ÛK­\>O€G$ÃÀ“Nð¤V‘¬¹QÆè±ü‚Áò°K#cÓ¶•‚œY58ÀIþieÂI™ ™™ôŠx FÈvåfЈE¼’T‚ÿ¾ ’¿âŒkÚFÁó öŽ|«¶ÙPicuú™+fæ¥y^S²i“XƒºioLª¦ §hfà€BNaJ\^åÐf À¿Ð†‚üiößÔÙá–Ù‹ qÜ«ÆÈ$¦! ÊžÍôàl¶±šd"hóÖ<N =(DD—šxkÉYÿHóÌ÷.ýfcF+Hdû}Äb¶Ù\ðÑqÙ0ó&êr·×Fq%Ú¦:á\kYÉT‰€ƒÁ`Ÿ}TÆ<ØQý`=wùÞá Íš*¼¹ýì÷{ù¡Å-,‡ýËV™Ÿ};àŠ TV—F¥“Qv•8;²æeÖΪæ(ùIX\™²2s¾mì•êo¹:W 1!E<²16=m’ÃoleÑ*+‡ªÀ³t¾š¼Läf:ËAËÃMá;EÌV•Y$|šÇòAoJʯ)Ëp…b=/ñÄvá£b€ôaäͶkk<Ü~HU·ÄõÈ#DÇù©Hk}ûRÜ >D¯bÛvBðë7à÷Hþg·ùu²àxq„ Å~°šhK-‡©:]™¢ÓO3H¥¶f²¤AmíNDUáíöÁ¹µ²« Ó1±*ˆÚ¨‚±’y¼3_åX¥WòLôFe±G¿gž;yÔ›£¼Q(3½íLX~å£UFpKÖsEA"wå¶Ì¹(ˆ‘UìsFFß<[fÎ5tdjÝùwCGØd¬ß¾Ãèæãr-AÌñeOE÷,t.ó[¨Âïå¯ÿI·ô.<¸‘e„)ŒS=š#mçZ*kðç¡,–+P›Èµ4f¢ãzÆâ^0¦eó‰6(¼¥zÕñíhœ#_b„¡‹Ù•gÁImO'i©í®Í¨³° h;ˆ öõ4}€;ãè|è:J+v« ÒjÜõ¨ ˆ>ÓÛá .ðžø®1Ig½ºzB,6L9ë¡gPuö`zõíúÝ üm†¨MãKQ(±ÑcT¸Þá’âQFü¯¿,® ÊÞœÈYŒçX𩊠¦õ³ö@<IŸ˜ >P Ï•m>Åvçy>»ûÃ÷7hU«†²$‘º½~jC„߈š•M¤Xv5eWNÎ'µŸ£xŠ£˜”’ìJ¢!c¬ÇåâÝzñ¯¸"[ê endstream endobj 1168 0 obj << /Type /Page /Parent 1720 0 R /Resources 1172 0 R /Contents 1173 0 R /Annots [ 1169 0 R 1170 0 R 1171 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1169 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 454 499 490 513 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1170 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 228 276 264 290 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1171 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 392 119 433 133 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1172 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1173 0 obj << /Length 2417 /Filter /FlateDecode >> stream H‰ìWÛŽÛÈ}×Wtö!i#šwQ†aÀ78ÞÄ£—'(ª%u–"^f0û!ù‡ücrªª)qfd dƒûZ]U]uNõëÕìÙj©P­¶³0RþðIòÈO’ S‹eêgy«ÕaöìM—«²ã5êÊzöìýu¨vÝ,ðƒ Äšr6›w3ýûbgTÇÊ[ýe¶äMKµüeÁqîgÈå=o§VšÑîÏúïFçQàÍÃØÏt«õ½º¾¯û=F"mþe󥋸¬?z©n¼èaON¾ÓJš{ü¦ºŽêŒ4ä×zó…Ÿèš—ì°+^ÀÜ/!c\F>8à ºxK† 9ŠxŒOÏÆ-ÐðK…ÛkD\u¯ºbËM‘¢¬L8=[¦ÓêU™¹—à+K:ÜÕ’£!¥…"a˜Zjݱ¾"¶Ô[²TÈx×ÜÅÆ<ôáj„ÄüìÚ©gm½S7§£ï½y„Ýuy¥êF5˜VQœèC³±ÜØÚ²èq²Û ntm Ü<ç{ pÆyQ“ú¡Sñ)ÄFÎs=÷¡¸oj(A"Ä©¡"nSôÅÔºøl]x².ëÖ‹Íä¬D«aì·7ž:÷ª)Ë¡ý•d‚4qAšøA‚(Mü8ÎJºc¼fËÐòIê'¯îÜ0ôcìͽœ4ÑõMkw¥Ý˜šÇz»µ¦í^*ôR}£a®˜ä'qš“]Iœ- ÒÓ îÞDfUt=ËõþBC¸È}é…b7ÞsUˆfJ‚Æ›SÆÔwÒ·£œžè-¹qFÂ<Š"E"¿;+G¬P.[œåˆ2–Ï…¨˜DňkÚ“G¿˜öY”«7žoOä¾iê¾°µÙ “ž3`-ôI¬Cü Èá 0x¢Õ Š“Îà Oy„©æåc­æ¼ÿaާG_çN‘¢V¥(#z¤ßÐ#LÏ–ºHlšÊ@ÎmQ Âøÿee&!MLzE‘è¾oízèMGÝP“J·o¨,Œë¦6ù’$“>ë·f[ U/Vç_9B(ý¯›í–xdÏ„ Ã’»8×"SW{ ë¶*v„°Ç¶¹EmÔird$B„‡­²“|ßœhªß½Ú4õoz$¼Q=b½ë‹Ã±S”i)k·Wâúà‘ހ޾QÓ›ö€øT„²ˆ’н4H)ëzÎ)_}¿…rb²Ø/°„0I½—kMõ•r{1säÅíx€­®éñÕ§<ý³sçSï’—ž+vÞÆMM¬àbN—Ú£$aÍŠ[ÎAhnØ Õíê˜o»¾)ܾ߃Âß#]p%äÐÞ¾~óÄ«gD;›kœÃBYÖ(Ó×?B±\|óçÕ«Oïß­®¡Áº‚ã˸w%y}qD¸[[ÀM°À[P¨A›²á5×ø .¹JÂ~>eÈAåQDà(¢Ëj½ ·–'ƒÇÃMÜÞQ¬†sÊFƼÃ0=K­aʦ8öäìòá.7JŽ·Û Põ(/"U`tãùÿ¥%(ò‚i5‹¹Gé(mÉ„¥^ ÍdÆp•NS#oð'r`;TÊn9™xrySêã—§M€ܾ$µ}¹Gx1ÙÉa€«½oX´Õ•SŠä8¾[Íþ9ü“‹ endstream endobj 1174 0 obj << /Type /Page /Parent 1720 0 R /Resources 1188 0 R /Contents 1189 0 R /Annots [ 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1175 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 408 743 444 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1176 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 196 628 237 642 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1177 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 385 587 406 601 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1178 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 258 520 308 534 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1179 0 obj << /Dest [ 1505 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 382 520 424 534 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1180 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 340 376 381 390 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1181 0 obj << /Dest [ 1505 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 345 336 386 350 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1182 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 295 94 309 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1183 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 323 255 373 269 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1184 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 279 145 328 159 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1185 0 obj << /Dest [ 1212 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 145 381 159 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1186 0 obj << /Dest [ 1225 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 385 145 434 159 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1187 0 obj << /Dest [ 1241 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 455 145 505 159 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1188 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1189 0 obj << /Length 2597 /Filter /FlateDecode >> stream H‰¬WÛŽÛÈE^õ ¿lh6IQÔ`0€íõëÍZ/‰Õ3âZ"µ$eyöCòùÇ<äTUó2Ò¬/‰aXC²»«ëzêÔóÕäéj*£V·ªÿð'NC?ŽƒD-–s?IƒH­ö“§/šTå ï T“—“§¯Þu×L? öä“Y÷xšèŸ³;«L+oõëdɇ–jøË‚£ÔO‘ËgB>NOó„N¿ÕÿñuÞÌD~¢ƒT­ïÕ›û²ÝâK¨­Iº)õìÕTýý?ÞlŽ÷ks® /ÐùvªÞœŠöw[ïXH¤³rãÍ–Zý‹½¬þþËx Ÿ:÷ÎÙf_”j“µÙTA}õÆ[ÂófdÒO/þ¹òàªH?ûåÕËÕÕfëUûcÓªmöÁz lâcÙáPW‡ºÈZ«n »Û4 n‰ý‹jZ,Ìœ+gƇŽäAJƒpȈPTÚÛ²m< ”j+U{±¿@ g!…fÃbOò±Àem%æZ>ÜÁÕÚ¶Ý™¼’‡g'ÊóCë…XRkè¾É­…äüᢼÛyÂ{õηHÖÐG`A‡ï<_òå»òˆý Fb?ŠÒ…’×>¤‡£„ú„ŒoŒÅ~l<[«kö%?ï³ÃÍ•Úã9Ô9 !BÇ/pðýÁòãwM¸O|îÇQ’ããÀ,Èõ³îNçûÔ¥%Â:kº zœ¹½é9t†%s¨•Ž 3]άUÙfE /åÆbë%A®ºÒ¢Zg rúšÔj¹Ä´÷oêÉJ•‹2¢Çü3z˜¡fŒsÒ5Åbª®‹ÒC¸–„#R0Ò9égtqho¦×kŠˆÑ·ÈªXWžað¡e{rÛZûȱL´V>º#Pç)ßSÎÐD»£²à°.$E]gããUÑ÷7Èå×ß?ç“/Ô¨$£Þâs~««rw?U¸îA@\ Þy_ q¤‹è3BbXØÖÅúH>˜‘Žäÿg""EóVsŠî ¦nåÄpmäºÃÆ3Ô gâj‹.Ñf(({‹DmÔ¶:1~%âPf»®¨ª[•1`¢àÈ E&BUvu§ SKˆA¾‚“àž¬¶Š‰s@  .I²øX ‚Å à‚%P:c,e ö/¬ê;68ú¤ÁV=é|Ø>QY GÔö·cQ[Ûæ`ó;ÖšìÙ銉 ÈÙ„ÔJ5š)Õ¸€@V,÷ÕEøŒÞé ·«à×ÿ€šàˆ ¤ÏÒ‘²ú¶ª m~AFóÔ7K„”–í[ß» ·Û¬U…Ⱦ´ò±æ«ÏÊ‚¥îû_ߨðÖ·¶P\üɾ}KŽá\ÃÅ^Ví–À”jþKêÿ×K¡ße¶·Sí­m™[ὨÛN¡âSpQrƒÃÉ9U²•Š8Ô¿ã½­eNÁ£,c¸Xî=ìÆ‘Ž„ò ßÿ=#0›Æi%+P‡‚†Î„•T†9nbHÌvâ –'¿l–JU,CN8°_Ø/tý3צa™ù`×¼kX ²å.T4üÂ(kå™ú¹û¼uŸPx»¢|? £˜08 ”† ƒâ;aAM7\h'p1Z–2£žè¾:îÄÜ|¦Ï‡F«C»¤kojƒ¹3—&&¢<@ÝÌaEA­†Š*ÕÖA1U%‘¦„Þ‚9[ ËŒùN×éÇù(Ò0@2òåή²ÐOc_ÑE/eÅX°e®nÐoñjìx6àX&ÐTK×±.ÝsNga´Qkn1ÔÃ3çÙü>É1 ÖÞ,–Zä‘Ä2‰³Û3…IfùÉ|ϘòÀS|Uà7öâ[!#¥O©º¹À¦nBMdBË„ó爿ó‡y?åÃ_ÝùEÏ_ûÒAfð€ú6¥3—Ò9<ÇÐìÍ<'{Ìá:Ò¶­N ûÔŽ,n«#žŽìQ¯@…0–BhNž£ªæ{”SòK’áHNW‡„H\‚g”ÓW?U¨îÇ’E0Éœu˜¡®WWûªi¥Ð•ƒ´ýzÄ;5k¨”ˆôˆ¨A³F5¨[ê_öÔ.ï»áA•ǽ­‹\m\EÐQ”{æ«×d*8?üw€:QR¶¼hU#ëžHQ¹Yeµå)Œÿ·cQ“¡gŒVEWZö¶ÍËJQÀëâîÈiV;õ¥õ×]³±PšŠà˜oÉÆÛŠ©Ý0ÈÑÊšI.ö®!4DëV”U×ÅVR¼9Uà_qž¾\Mþ;G¹¡è endstream endobj 1190 0 obj << /Type /Page /Parent 1720 0 R /Resources 1194 0 R /Contents 1195 0 R /Annots [ 1191 0 R 1192 0 R 1193 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1191 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 306 446 313 460 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1192 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 436 364 443 378 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1193 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 171 112 201 126 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1194 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1195 0 obj << /Length 3977 /Filter /FlateDecode >> stream H‰¼WÛ’ÛÆ­¼ò+&|¤–.¦ä­ŠÛ唢¤JT²›R Áá0 ¸+êCòùÇ<ät÷IÉ«¤Û./ÌôLwŸ>}úÕbôb±ˆT¨ëQ©ÿâÏ4‹üé4HÕlžøiÄj±½øvŸ©|ÏkµÏ«Ñ‹Þ†êa? ü ±&MNO#ýgó`U'Ê[ü4šó¦¹šþ<…á8óÓ@ìòžˆ·ÓS’Òî;ý¯o'QàMÂØOu©åQ½=Vío"m=XÒûb¯~÷Ãú뿽I‚ß ¾%~¢ /ÐùæF½}*Ú¶)ÙH¬Mµò&s­þÉÿ÷þ¶øÃˆ=fo¢ÀOñcñ{¼ã<==ù^ì‡zO§Z:¦q¤ÇÀtî^mØÒw‹Q¨ 5Š’ÔÓPÅ3?ËT"’ >N3ÕØÑzôjÑ#±$8FÝ€"¢9z/¾¿JQ–I gÉÜ\†ô¯dñTãLç³ÒgÚ¦îËØ}ɺ=¡ räáwzßz)b;ƒÏ…7õ3]y‰?Óìwo–@Óo¾Bīߪ=Lµ^# ›Bª™êA­ñ3t?m¹òÕ_Ly°´\YjU^ï »R‡j[¯Š³ ¸\¦W^ˆgu¯í‡ÜîZg²ÆÛÔ¦Ìn'Oµû[˜v7î“·Ö­¤“‘ôN·‚ùãœì}1U•ÅÙ1]·õB€±®Ù0ı#„Ö•2¸7¼ç{¯T++UnÚ_ÛZxjk>dd{Ø:³´1R¥­Ú2bSÉŸ[³y1X»R¨„ [s°'7¢ÎiïÇÔå þSx?Ú±2-ßl®‹å¡µ7J>Y«–^âDS¨Ëú îÌõ½‡üε/Guàʼn½hæŠ,—Jûª°8-zYÖËK (É¡IïuÒ#ô¼‹ôk8ë?É@jYTÀH¢ª4 ˜­^þdóöÞcÅ ÃDpK©:a—öò6ëR-?p+J¬wæòd‘ÔlaeZs£N'ìEóç°×t²<¶s§&ÑDžxgÙô£©ÝÔl(ìÆŸFˆû4™êxÍpÖ1&ñ„â²,rãMbÀ‚1LÅèe¸‚TdÝ ðÁ’æòîCA@¯AÛÉü«×¼rA§²p Á•¼cࢬ¥²@,ð芃P†ùl€yBËM0ëOŸ¹.Z”¥Ê͸i _Q¼gšr­[³4î=Áb›¦nä]©ÎóCs£äx\«ÎÝí;îPŽUydt=JåÉ—iÙËÆró2%9Ïü!rMÝéï¶»ö(A" h%|{E~RßB?i¤~yÁ›w¯_éÿçRæ9P…½â¹ðYž£m—ìE|žhß#y£LQTõ^a1ГláÇî]•#&/±ÎέÚ„çZ±Bj‹­íß™íNÕdEnÃÉó¥"/£ jˆ~™öeVºé¥…ù³ú†v]k„’™r Y̰b‘…Nfœ>ð>¢aÑøQ§ Î"êÞ¹ˆ²„á»pLù0¤õQÍÂ_¨)Ϻ¨¢N¯1‹ÏžÅì’T<ë)n¤òg'`Í S /î³Ã!1þÆVÌuæ }Ö/¹°câGg ;H{vtSξul¢övgªŠÌ A‘**nM$@—VÆ•0qŽ77*oHU /·t©ôšBíxHú´â‹ºTßiŠÔ7cÂ]ªÙ«ˆø™tCkÇ·W3a2™´)bûyw‚­áLÐ÷‡Ðõ¾´AÞ"aòoÆŒµÇùÀuHÙ£i3·@äçVÉ'̸’©èg‹Á§*G ëµïPíd~8Äh<Deo¶Þc̸m]Ÿî:î`Fë\wºð¼\Ÿ “é[ÿÂbÜEi2HŽ{B1ª7uk¥ÑY“8ðÃ[“N Ä «ÂÒ˜qÄ#ë 3uB‘‚@daH>:Ö|Ëâì3°éà÷R^o…dv·òób; ÛŠŽj¹:g¼>xjÁr#ºæ€üú/qäc˜ .ÈH"Ü“TaÜ·Ø/æ*TÃüË¸Ê ¾RþŽUÿ•ôJže,"i¯—Lr=8œSsêÇé×Ô“ƒ[?Ö•­Ì–ÒpÌŽCTßkúLQ Ô>¯ÖÃîw91ê7ö‰°û!í º}SÊÒàPOH½÷ÀëÄeûÝqƒ³E˜2IJ3£»ã†S ¶Ú2Ã#ÖMÝ \ƒçä;ïÉwîæ%èµmì€éAmÜG§Âõh›S0 M%Ö[rP…-·Ëº$]]7[L:|; -ÆÂžµi› ¡fZoÊíª}õ®*‹¿;bZüæÓsg¬^¯i'j©}ÿÿŒqž{ñ‘Ì%šÇ’>·V%ÊÏG=ÊS¬lÕbT³b©ˆSxeG^ÒÊÊȳhÝÂË^r‡Š>–ÅæåÀd§sijà¬wR}@¦2]ZÒBôšz8t¼|´㹮ݯ“¸ÇæÓ_òiw¶ØmuïèÔ)è™åÉ7¼•Ò™LŸü”¯7Þ„µ®Ac}:´íÎÅÌs5(|fÒYÙ­(®ª®úÔk8ý>ZÓøJ]v“¸>˜Ì;…I†{ògj%b ™Ÿ#]Pcêa·ÇŽ®HûµÔ¼fðxþ—`â™SÈœ‰SÉð5º¼ŠgYW«™\êÆuˆ˜·Ï.;DÌŒ??u’ñž+ûÖ@ÁÇK(,†€0QßÔÉFÐ!Cnºæ(®þþ?ØÊ6 ¦†­ðþãf)γ×k÷À¹ÇÿÆT«’@¿£A$Õ%AŽBi¿ Ðİ|cv-“+îþŸGÀOSwØw÷+N˜0®Û÷›ú r¥qïÆ7ˆ5Y¸\¼-ªÓ*$!Ô´´frZx&aÞªÉûP7ŸžòÎÄEÆ0}^¯FW¼l-íº QŸœÈ%gáÍ@TÇÀ7R¡LÃå)d†Âs?s¨‹•4n‘EϦØU!K40C¨ƒ;O¦Yí]åŸî9÷!v?ïÄl-rHZÃýí±ÊÿøZÙꡨ Ô—‡–ïÕÝ÷í]#‰÷6ï™îêê©–)ñÓ²]¡í¤hÛª”H~8ñ™w…]Kõ|'—0Dfžâ¶íq³ÿ¹ ¥Î‡,9ˆæA<"!Ù¶IÊ"µÃ&+;*/UÒÍDCAF«ß⢉¤ø”éz¥ü¯ø…{—ôà>œc–¤¿!¾î_*L§ø:»t‡Åw÷<¾»!¾¾F-`GÍ1õQRgôÁõØE‡ï8óÏJ²z„mHµn[†ä=é¯JŒd^5µˆIÆÊÙ&fO¼ÜƲ°‡—z ¯§ÿ;AôjPùÿÓM‘= V& Fƒ<è XLŸD³Ã±eè‘iù.QWU ÿî1¾b°Z«“I,TÐC_ šx&C¾?e#2àcgmF¤a¿½=g¶c÷'þÅý%9øšâƒ E}‘Hpn—…Â> …zWÑÚ«À Æ–73ËñnžxdùÀè½É]y"é%æÎ-u·ÁXPcK)+Î):¯àôúœFtîEYäê>ΣÈDž£ð‡šhÕQª¥Óf"쟛VJäPÓþ_<*‚IRÇ©.´©Tm5¨U¤ D˜§¹àpÚ¬çiËÈoøyùcæDôáèôþ™ÓÐ ¨XÀMý9£ž‡Ñ<ôÞ(:gløœ‡NøÕ<¤˜ë Ÿpñ9n¢•q êv¯ÈµuAY1Çe,á!ÆiOƒ¶Ì踈²È—?~§¿âkû¹B½¦.ˤ$•€ï_}¸~ûÕ)‰ARœ¤ðæä„„÷'äì3„ôät{rº=9]~£¥¦ËÔ ˜š]±"js s›fñ4²wsxZŸ{áBtv™È-]¢±‹g½ F¹’CÂ{%ÖÛiTcwq,S³G…·öH:ÂZƾƒ ˜‡¨¤ú¬;]q]“& u†ð5JÖ Î"À“ìfIÒ‘ g÷Ÿ¦è<аŠ?Ç2é:Ú„õ³É8úúV¡­¤M•©=±±ûÓµú•3eÁ÷wAáOjÑÞ 'ÿ|OÂN$d@RµæWA÷.©Ü(ÉÈHlàj7³-<íb‹@aI¥HCAÑ­ƒjÆLÆ30æ§ûx ÙÐ-U¹=¨¶;{–?ò ßã„{ªs½¢öß+rµ>àqà*s(óT4ßþGXdä 9v%»•ôŒQ>™µ÷i¹V{:Àcg•RtKØôûýä­5Rò:9ZI(©Ö >c„–ª¢¬í…•œžd_¤ÊNÉ †0²ûéTYWùšž³»v«ú¤‘·§$jdMçÐZçñ–o^nÖQ0IÖQoY$–™“45½‹^«ë«ßñ”@_-·úr4êkÎÖ>xêQ†­Í? 6ßrµÿíg! endstream endobj 1196 0 obj << /Type /Page /Parent 1720 0 R /Resources 1202 0 R /Contents 1203 0 R /Annots [ 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1197 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 559 149 573 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1198 0 obj << /Dest [ 489 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 416 546 424 560 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1199 0 obj << /Dest [ 1233 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 224 490 274 504 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1200 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 418 249 448 263 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1201 0 obj << /Dest [ 1505 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 149 199 190 213 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1202 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1203 0 obj << /Length 3970 /Filter /FlateDecode >> stream H‰¼WÛŽÛÈE^õ ½¸ ŒhÞDQÎÂÀÎÚÞ\ {“Q;Õ’S¤À‹5ò‡äòyÈ©ª¦(ifì\vCª/Åî:U§NÝ.FÏ‹@ùj±ùòð( Ü(òb5›OÝ8ñBµØžÿÐ$*kx§š¬=ÿñÎW›f乞çcM6šô¯‡‘þ)Ý凱rÍyÓ\Í Óø¤‹WÏ tf‡¶léõbä«\‚i솱¯Â™›$*öáI…;F‰ªÍh=º]œœúXâ]zcð®GÑì½ço@”$âÈÙtîz!ý+YÉb|Ó^ÈZv½ÈÎŒíLrÚãÛ™ür.œX÷ÆÚâ¬ñ ©5–°ûM±RyãLÝ™Vy™ÝÊñ}mVêàÌØg>1%ædüK¾¬[‡Þór£JsP2f²J^`HŸ ·w•¶é2½°¤>€zÿÊA´ÜòÄÎ$¤]¬ëÒ¢8Jà&ñ\M|—b×Þ0®Éͽɺ–Nåø‚Iýv"ý‡ôÝë?.œÑ¢~Ðæ:mÍΔíGG¾sŸšÒ÷‚Ø\&Q÷óBØ]C8zóÓéõ Ä@Äœ?à8RêIòÂa »=üO~1À6Ò÷´3ÖvOrQa9{{«WÆa|‚ð–¾ÄÂënÒC7¯  è¹Cmî9ÅÇ%ˆú‰¯ûêû…CòÚFOÿÅÙ·Qœý’(®Qœùg‰8î:=¡H!蔮葫ʠÛ#ÿ¸"_P±”ómœ¼S=V K5îÆª­¸X»1@©v8±Æy7†7&Ži2dyO‰*Óˆ¡¬ßŠSÊSÈTÎ@ ‡J€(ùÛé¥g¡”X¡XOØç’Ÿ±nŒû B¤`÷›ö_Í´¡6zá £ÅÅk]¤µ3iÙÀi+¾ÌɃͶêð(«V-*òÖÔÄ»t¿7«µìZâNS·†32Ô*mTªöé¤wfày!_û*ëÙ*[Ãq„ÜÎÀ¾«nß¾¿•J S2S3™þ'•R8ú`›Ó!ú B,¸çŸ‘ýB$_h;THiÅgÊ3®)×Ëö=‘G¨í/8ÈI°ÛÚÞPD'ú£sÃ!M>XWu_É/"çþ.*Û9;Í9j#½‘ •Ë”Úå›mÿš~2ª1¥¬€+ìÒƒ) W½}Ì5’D!™±h3V¨oÔx?”ec'OŽ}þÄ–w›ëp¢XäL&”&gWøî¬Ûr _c#tg²mZ2'z÷kæv9m¤í’}Ñm@³Ä¿²ŒÎëJ¦ŒÝÀ1*K;ùe·Û·lòý-QIôõ+g2ÃØÄ¡¤ÜÁÜv~JyDuom…°°¯æ˜¹þ)rù†úîÕïժʚŽ{)‘þ?œ¼¾Î÷pH÷pv‚ƒ^ñé1îGüAܹó3‚x«úd0ú¤}ƒ(ŒH1ð¾È‡’áÄ–‚ôà ⪠Lל„…C©”nPöuÛ”§ª,’r8RÊÊŠ÷â„*ÛÍ…UP=¨ôc2D†d$Ýí­ ™uѤËÚ(´‹úØ·š›&¸¦¦SÐS$øI >’žõ#æüˆ?ß [6ÐÖûÚ GÛ†—¶ùN(‹éEŠ Ä· õ7œ‹C'ƒt8Wë¢móG™$$Œ`úKU´ê»‚=êz ’¦gBa"æ^¢ñsZtæ2ˆP«ƒ³˜x˜ÔJ22qÄÕ˜ž" P%» _ß“‹õJ|ÁΪ²5÷-®b3]ÉcÏtÀb`ØOEôÌDû‘Ùa“_¨ÌtÅ¥û^Þ¨ËìðU.8 ýÛ©&rlAê>¥0i/i |Ñý³“§YwnI€b³j·ÌKœ©’*bKÈŒh–,¾.Ùž)ÓS àô\Á¨yƒ_Ž{#'ŸòÉI#-ecõBâ͕Ųճ•ecJ*Ï8ÊÑNN…ÿƒçЪ (ÚSVÍä ×\;>yÝçûzmjbG°å$®¦®zWµæ…â"áf´ýƾ¹žÅ±¸{ð¶&јö:â|ÿÉžNrŽ6L€›Ø‹š3œ?³šfÍíÙXɳà“BÞpdrA»¼“„pÿÖ>•WžÃEÊT»"çýÌ5.ÑmžÙe—‹ØÉ„³¯`–¸œFÚžHƒ.ž‰ÿm7:Ÿ³fÜ?Ј?kÍø0 •@û6xÏjÇôI´©œ¼à4œq†’†3Íœ’š‚å*ÏÐÙ¹“fýŒ“3!¸;ɦJ¶žzJ®Ü¬òš1Y‹bdߥñ’…öG?3Ãß2c œÄ,»Þuç÷°b^ ^ÃHÂ-Œ1éPÆ’÷mËí%SÍ€Ò%ˆd¾ëd±¥I·|2ûÖ¶<÷QÜi+ýÑy3T¦…í…„¬%¢‚ïìº~ *õäß?¸L5YïÛ—$pT!ÓÈw!—c³,^éÀè %n9r°7q\#Å£k@¬"raq"IüS»·¥î£üÔàâíÁ@´×&«ê õ˜}вéÚ|y$(¨Û7×’-$ ÿqîõ%ü¤×ø“œHzÜä_ÌøšífÑWëë DªU¨ªÚÛsh§88¾Z0íVh«ô>ßu;Ç'á«Ên·ìKu%ˆÞm1Ïz©nw?"Ð }.Ííø«,áÎAú‹VŠóíŽS]žM¿Öm;Ï´8¤GB@£H?;Tz«|Ž’j—©ë ]Ýakˆä³"‡ú!¡©¨×rǵjÚÑÞÈ-Xªˆ–kFû¸,­ZaR›g°ñX§"¥ò1R_E빯Âï¯÷:Ê>÷8-@PLs×%7ÀYÎÂ)"—bﺧÂëô¯,í8î"+v"_ð¸¼ïITJ¨Mõ‘|`9Õ†Y-n^;Сgé0«Šn÷áˆÌKbtÄÐÝÞR·‰ Šxl,©pÛZ­°²÷‚æA¡ Ä ¥F!p„è"U’èNm)Ï~ógß‹xá³ÇõÓ|8Õ\NE_§ËJW+mh9“©M-¨MÏØº«OiBéa}nÄõÉ?Û·ÆäÖåQŸ3]g&Uk® Äuï^œ“Fóõ©nv]BÕíý±ÌŸGÿ3‰M†$Ðã¶îJ*·WL†¢˜œ…S8ø3<1ù„d–Ç=!Ó˜0»ŒRhÈìqY‘ÜX™uŠ:ëeºhád5>šf ¸óõ)k¥ãÑÖ5­"e¹ì…?N6¿ÊçkÑJQ—‹­ÜG5GÿìäÙÙ,4q[©Ù›â~4ïÿFÀ2°ÂOþW˜&íkídù~›æè°\§PQÊÒQ?†>LvÁ ê/T"¦6£§›Ä†Œdõk–™Åþü%±æŒþ„ßdË"¶yØÖ\Fc( z”{ߢBýí$µ÷í}£ÊO,¨ŽûP*Ÿx£¿°+¥Ã'êœYm¶•×.±=(玟6ÜÐÒÆÉþ§™»™ssïØ0x3òE[7I°ãG¿–ûtnLÍ.ÚõgÖ]ë,Óýh·É^Ÿûç&VWÝJS¸‡3Ý€±™ô0ãñ',üA¬Ôãiè¹ql·)k¨tþØ>|C6X×E™V/”Kìêø?2’GÅ„:ݤ¸}­,îDE‡§‡íé!‰»üŽÇ©Åj•ÙLZ1«ðí¡}îw8d@B] 7FZKàÜÅä]¶¾¬'o8˜ùÝYŸl¡°‘Þ’—éÙúyë4j­¡Ù¶gŸjÌáèçϘ۳c7 Õƒ4öí¯‡í¿ß1¯jE¼¢4”„¦aä¦R"ÊùÅäúæòêýÕür"/Ët†F¬.&ŸçNl̦Aç·Pð}ÏFì}ÏPcSöÌÇ(ë7žÕO{øSgyZÕ¨_ãP^¬ð¶4OUöOzòê(™îiØ<,ÇFì#y ûh ²ooï>½½ž@öé Pó#ü¹ûjêB÷Q“‰§Ùc³( ½nêŸðkÄ> Z’aâ!ÌÞ_}>[mÔf‰;‹ÆKmÄ<ŒYbñÏ€,Ö]ÝÛQ#Q†ÇcøãÓVsn)œtt€…½oGÌÿ(`: endstream endobj 1204 0 obj << /Type /Page /Parent 1720 0 R /Resources 1210 0 R /Contents 1211 0 R /Annots [ 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1205 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 550 334 564 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1206 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 338 399 380 413 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1207 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 400 304 441 318 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1208 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 404 250 445 264 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1209 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 102 102 116 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1210 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1211 0 obj << /Length 3034 /Filter /FlateDecode >> stream H‰¬WÛrÛÈ}çWLñiP%B¸t)®òe³ë-;öÆ|ŠJAàHBB\­}Ï/äòyÈé¥­¤TE æÒÝÓ}útÏëÅär±”¯7?Pþð/Ê7мD¥óØM2/T‹ûÉå›&SEÃ{<ÕÕäòÇϾºm&žëy>ö“Y7ÜMô§üÖ(?L•³øûd·æ*õÜyÁaæ&žÈå3§QœÐé/úßfgçÌüÐM´—©ëGõù±jï0hã@’nÊF½úñBýå?Î,Æ÷k±ëÒñtqw¡>ïÊö7³Y±PçÕҙ͵úÿ:]ü<áómÏMð±x‹9¶`·Û¹Nèúº!­†ÔB4Tºzn  ;uÇ’~XL|UªI'n˜ø*LÝ,S‰O*Ü1ÊÔÆLn&¯½3B[¼Coì½ë‘G4{ïòþ8D¾‡ ‘'Óxî†þ¢¯îóµ3ƒ0]å÷æÓÅïÿöÓTf6æÆlLU˜ÆÎüðô3= ]/óUšúø¯ØÜÑO®ÆI¿03\½Ì ¢³ÇŸXîus|xч†h|øä2¼=ð¢³Ï"À:ê|Ö>®á©¦Ý”Õ­uÕ}½ÄÔfg?›ò7|†þôòåØ_1`×ë%?ŒÌ:³~hWË0€Ôs±üôÓÇÅDZ´ó#Ã"¤ðwì:½|Æ]~æÆbÖ[„J¿‡jØe޾^Õ×´¶‡1롵/úÀ¹ë‘w} =¹Å^0’¹“Ün¶U‘·ØYÕÓCÈ"» ñÁÊÀ AæfßsÙõ?d™pVêE47\]Þ”fµDˆÆ*=ÐwÅgW9ƒdõ;túøËnx3Ⱦ“BgÖ_s‘ˆ,E®GÜ0ÌR%Ÿ«'‰G„¶§u¯§uÏRõ}7ŒÜÈw@yÚ øŸºÊ·mÍ®äBýBáÛIÝT×3̪²âm­ÙT9Àç£M‰®AöêíkÅi„Öap6¦ÌÞÊŒXéwFZßÔU›—•YBó æúT÷bm±LÜ´«t0`\÷®z`w÷–ÌøÌÌwi÷[«:¡ƒ_ô+ª_‘nAB×ÛÖ4ôékR=Kù¬Ò Ø„UÙ8TÛ Üci¾åòY9>jE¤î­ míë.¢$Ëzƒ9ŒQ¯‹†¤kq‡"Üæ·J‚Ø–E¾Z=ªûÜIœu£ðÙŦ¬*©êÌkU[«eÞæ×ycgW-°“®>×¹3£Ê=Ø òéjwoöm¡Ø†Óðf{hBÙy0lHc?ጊ†@> (Õ¼©¬y˜¥F‚âA–‰©>u§¯z[­Lƒ¾ %ÿ³\«Ç!PAv£Ãnܨ÷¶¿÷¶o½Ýn`Ø\oÍ…jà`_£®ÍªÞ}u\õŠ<õ Piòï‚ÓøœA\Ökø"·óSùoÅR¼Pi5×ß(É|]˜uk…Ö@Nªe§jKøJÎ:ê~mEîîÊâîH! ÒÒqôΠx*:Ã?uÕŸê–—·êŠù᪯IÜé̸{i`.µ€XªÌKÄCdÀS¨i®3Ç8DH"—lŠ`ÄWGy?ª­Ýjí%A>KKAg¤-UQÌŠ»¼º5§Cçï¯ci…DgìD™ªoÐ\Îb–ÿÈO2KÖû>:ŸšJUÆ,Í’òÂ×ÈÜ}ƒÞe%Ú´ÇíTåý,7æ×m¹!¤TKÕ¬MQbgÃÖ’kø˜b¼B—ÀN—ˆr&$ÍO]w8øÝv=,`·“ çöÁ.°¿£¶„»$D(Ór-Ór\ÚÄ 4§ÜÔnÚ:põ”“7»Ïÿ!äÀÄDÞNˆG¸÷ß à”ð9N!ÅIM+»•ÓBOí­Ù_'àîÍ÷á˜Ëµ*Ô†i§´©'¼-HI)2´ —ò êHh´*%¥Ià]øÁ?Ý DÑ•“çÔô(˜S8¨éQϲÁQMµò?uD´M±)×íËE3áy–¯Ðó©¼à­hbO_ž¬à‘öÿ‡ ~ ³+⮚ׂ¦žL i™“_;õH”ãàe˜éÏ _Þ³ UW«Ç A¡Áu\¼8Ü3ºï¨Oس‰}—¾zÈK‡­O*Ž+¦óâü Ï”G æÓŸ©ÕõGõ`6MYW ›yÞ¦A¹Ízy™u;ò̲x=~Âë^¼Ï‚˜)@öi·¦”ëº^È}ÈW[óŒŽJk˜WŸE$f¾µÎ,ƒ³Ä¼ä)óm¡óP;²Ýº×¶r€°4f$íL0ÜŒóHLy†T|©Ö¶Gq€ÕÁ|i";tü¤—’ ]ÕÕs<- ü¢ßš›|»jÅ¥ÙwTÌö:ºÑŽ´)tRù;ÛÑl‹ÁwœŠD„‰0¦hLÃlÄÍj)3j‰W´¼Å­TW&yÔ®ŽWA> ì¹XHõ­m-bÎg!At‰FCqs«\dòM»•“Ð>'üXîd¾™±\"5ɾ ”‰ÚBôr?A³Ñº/П«âfßó.eª[ð!÷Œ¨~N¨s:ÒÊ7˜¸0N¦åK~©²ÅÚÖtKͼ j¨+@YslçÄ«Üf/M±bÏnŽHŠKÊŠ*R~Sæ×+*q6$‘m¢º¸tP󻃖ù€ÔÓ½žTôpgœ¤!_†~|ˆM5e}ãF·iuæÉç t}Ê"oÑB{™.R~{Å’€)h:ïƒ|À'Ò-Õí”a*Þ&Ñ-ð¹R‚Ø‚÷Yâg5-´¯e jÞÓà\h0µ4X?·¢–UÁåé ¦­)Ç´-«4¼Ï‰v®…F¹í@`@3å’zÓmU³„…\p±¥ö×-Ë‘jD‹¸Òÿ;®ÖýhŠ aókQ­,aÇ\ÕÙ3!‘5)¡—ìÉpó똺ØçÂ’ÂbèeìJ-Ó g •‰òž³ñ ‹j—s›sÉN5“2•[¡$̲©üv7é̱B‰«XãhýY:Ç܆,é¸í€Ñ2f´ã†ÏhœB\ÇCtàñ¸Ç¶^½Ï‡Õ¡Ó% ¯bϹ‰pÉéð ã\›a/Ê›ºV”±ù_ÊËgAãwŸ’¢èÁ›oàÍ“ $(&j ooû}#˜x¤Y×´ëŸßB,½1D´ì'Æ©Miwl$) ¼GEIw]‘&|æ²ð f®z*ä!VÑB‚Ĭ\0£Q>¸ãÜÄ\O»~‡ ñ´‚?(å9š»¡jM¨’Þªn= ÑëË#\jTeF/‹à¤J÷ÀÍÚ´ ô×Òy0 ¤dê0ÁE;ç‚×\›ûÍ=aw3µÒNq!,hÑÙðm‹c$mPr øÍ„ÑÓ;¸Û¶¢[þZåç¥Ê5ܧJÎû1A†Mœað‡Ù‘zª²3i2 )Våê•Qu.TþÁÔ[Öb*½Üx`êýaö`6‡õ” endstream endobj 1212 0 obj << /Type /Page /Parent 1720 0 R /Resources 1223 0 R /Contents 1224 0 R /Annots [ 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1213 0 obj << /Dest [ 1241 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 386 743 435 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1214 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 248 694 277 708 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1215 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 278 660 308 674 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1216 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 272 598 302 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1217 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 494 466 523 480 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1218 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 219 430 247 444 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1219 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 316 391 330 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1220 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 362 208 384 222 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1221 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 261 181 302 195 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1222 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 131 87 181 101 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1223 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1224 0 obj << /Length 3787 /Filter /FlateDecode >> stream H‰¤WÛrÛÈ}çWÌ‹+3)Æý¢R¹J¶dÇY—íHÜò:ë<@$(a—"i²¤|Hþ!ÿ˜‡œ¾¥µ£ª”eb0˜ééé>}ºûålò|6 M`fËIÿðˆóЋc?5Y‘xiîGfv=yþªÍͼå5¾içëÉó7ç¹l'¾çûÖÌ'Ó~x;±ËËÊQnÜì·IÁ› “ù^‘Bp”{©/ryOÈÛi”¤´ûWûï³ÓÐwÓ òRëçæâޜ߯»+Ì„¶rdÛº5ÇoÌßÿ㦠Þ|K¼ÄÖηó«s~[wÿ¬š ‰l¹^¸iaÍ¿ø×ýcö× ß˜oú^Š—Ù æXƒÛÛ[ÏE^`[:µ¢c!Gzú^hç:uÅ’Ng“ÀÔf&©¥‰2/ÏMÀ’wŒsÓT“åäål0F`‰¿ou}²ˆeëÁGùCõ–ÌRçèf²¤2Èr¹E½v1tíð›°Õr{‰[É8ƒÅüšã³³ãÏoßóˉ#[þâ ¬úb]j¿8üò-Gp ¼ Vƒ‘דáàDN6NÜ4ƒŒ—.…¯Ü4ÂÃlÖ«ûCsVu78Û®]Z›9ÏÐ;´ëΔýD‰ l¾7õzQÝrTƒkñmc.Ê–àm‹/ÎÜ^UL’ÅËÓÔ‹C3…ÆQ¯/%ˆKŠPômªrQ¯/ͦ1·MÝÑÐá˜r 5šÒeöÞ3oaÆœ•,ë|´¬×uëtWò˜7õ¶{a`8€#²2Y!/н8€YSëeÐ’ö7dÖ¿•«›Š®YñٟŸá.ºT[Ú¼¾¹¾€ bòàfébK‹Ù«ôËFK`4y­æ, ~ÈŠ! ô-E€,Œ® øYw]µöLï{…áŸØžYAödÅ¢X ÒˆTlì^zSŠÕ† úñ˜ Ø3Š×Ôž:H*ìû™„ïO´!ìg?ÓÒnþâb¯ðŠh½°ç…|.à%>HéJd²ß«{rŠ T^êåÅN¢ŠаÕvHí¼\½=y ŒŽ Ôˆd+\¼qÓÜ.9öøøkFj ›P,|)$Î2f'Ñ€œ¿XÙP^W²L0¢bÌ3ý;B9&W&ü­¾M%\B" ®™  ¢¡x, PÞÉ+bΜÿíùzS5u%sF—ªV€:à ?(2EH£(©% ¼g¤ö“àå'ˆN~`ý2r/ÌFÈHõ(?‹÷°‘B&a)Äe@ˆ)ͺºý:r¢ðÿb➘?ìápÙ‚KÐ!„_®º±m»ª1‹’xQ¤OÓ.V§5‰N^3ÁW`yg¬°,Áà³_Ì€‡$ØgÄ@ýâaD¾Ã!&@ñ9G:òŽu#ˆð*$`XX× Xr&AʼngÞoº .;ÓQ¦È¢H•¶V©sÐ.e sQ™ݾ`j·Ãe)“0Ày´¹˜îQeOCi®•DW‚¢åRò +X°‚±]·Œk×2adq)¬¸ÒU8^xZëʃ!×À€î'Eé ò…MˆéË~©NȹzL‡ RzÛî-Á!ÉdËæÚ”ó©V0CTïMFl€› +J mÕprkˆk-fº’“,{„»xuOÊaï†8Üeƒ„³ÙcüÄö1Es`ÏgBûêœ"Iéw’B=Øß8PZa«‰ôJ˜£#Æö†82¶ÍZ ݑʎ€¼T“ÒžF¿’ú(囊ñS²™b60Z %4cÍ)Ç„ùÆðU¡}€ÒéŽ ]„¨d+‰ÓˆXd?L×{9|«o’ß5N‹!Nã!J3‚°_yÀÌctÛ8Tìî1¥ƒ•:j!F¶K˜F¾TJ¡E4ŒPÿtöv†Ò“Æo@¾ P#={<qÒZ$¹£L£‚ª•ÄÚ50o½4òŠz=²T™Z¿ƒ·W´e(®yÔ—~.§¬ ± ÔpJY>&QÑ©ù6 H!§r—åJ?ššËè¥ãDS¼>-Ï%ï´ŽUkUç:ª’Pºâ ŒXÑ^še‚`ÍË®E‡´þ†½iã,éý±t‚MÇ:ÀAÞäQȾÄÅÙ¡=?=›é\šR#áøñ¨‹  |TD ´Ñ³·&lŠ 5—Dʰ̱™|˜™UXžL‡Ž¸Ó½# TD‹Nyb·½ã ¨ŠŠÇEÍk%]p‘m“kÑðGßé:²¾ëïH˃۔ @J,_sÊ5Ÿ¶²À *BtÀ´yˆêl¤Éàþæf -é^Õneb ®DÆY5Ù‘Ž"¢‡ÖÐxszõ­Zëá?HNŽgNK{êãè°Òp§7ßH£F/dÎ&¨»?‰\sô¨|a2úªß½Û§[®Ë{0Y¨±æïÇYPìî¡LuYuhëˆôÞ³» »ŽÊÑjñ¤L§aç§3"YN9¯ßR&‹­¾Î$¡:íˆì‘:N…|N@õ"ÂÌÏø+Àw9ÊÍ8w„>@t=â«Cq²ÄO½¢†""?œ›8Ÿ$…(â‘$Ba9ûm¾%ÐÓ„}Osh>œPÚŽìKî@^ûq¥v(¥ëŒ§¯\hkíQ¸BG8Mµ4.¼A&¶ŽzŸZZ¥{ia‘O9=c¶=5óUy£›AνÖqñ Æ‚—j%PÝm›ªmë ƒr~…0!ˆ¯QZB“²5Û²éÌfɸvüÚ”ë…yöéµÙ®ÊyuµY-ª¦E[ 047> }ćAßžªËß}xsþóËóÙ€Õæ²«îºÇ…jõ"ß9%ŽT¢Ÿd;ŽäùÆ‘ó3jÞ8϶®°æa;&ãÆ$ßïg(Å]v䪹ïºGm g^ &s[wWÜCdÉÖƒ6ˆS5¡ZŸ>– w)”»V5qÑÀ!øùA]ÛWuG·Úbt,&­ÁWn{V/¨Ü·H‰…-Ж¶jZv!/]ÝÝPIÇ“ßË­¶8Aê–É}ÜÏ”錒͹ø;g{ vÄ-$¨âÁ>.(‰¢<3òšù^‘"&£•/19*àµdØ‹GM¢ó„¸¤†\L¬ÞΛÚåP•>v/ÍvÓvÓm³á‰9J»€z7ù]uMy€ç|T “YYËåéÀš^%9Ý,üh•”9C™¿êo©èßñÍpµ"cܵ¿ÚP&ª/_mÖÔqãsÈËvxUÀ!úÓàÒk…pD¤Î±Z-®Ëí C)®w„{’7(¡'ïNÝ\¨. ìG•Ñ QZd_1p=)’è">¸’W? {Vq?Ï£ :þV֎ܰ*/˜¦WŒ¬êðûWsGC'§ì‹ÌüñŒ²Jd?˜o(0ZËê~_§èɈíjž‹ÄüÉÌÏ2¢Ñ½Ú9e6¤çšZDTY?¶‹èP :(eœÏ¹¸%5ˆmz±eÒÿít9â“àè¥Áؘ©D•,T€#‹<`Y¯ÇëÃAQ­ÔDEÅ%(Ü£Cë°x`vl© :Pþè§¥×ÿ2^-ËiAðž¯Ð-¢Ê¦" Y(å├sñÍ\d±6¤ÄŠ"ÇŸžžÑ!Ǿ`ƒö¥Ùž~D|ßžýÞ}_ªqèk?n½©J+Ãî¹8UÍwcô0—u¯MqÁnÁ½!Ùr«1åÝVÒ7«!öæ JEÑ´«•É´K2mÒYvÚýÎÍÒéQØ8—.äÜ©‰‰és³éKúCwË1ð"þÖÌ/Û9–//'ˆ(›©—á÷{!Ó$ŽÙ8=ŠžÖ#2Öž‹LçÈôßoçmaü㎾¨HÐ_[×.ƒtáöÃ:´” _rú}?T%°µó«Ë Â_`{h |U£’Áy&YHÒ,Z·xªœ­mþçÊ/¤ó»ä'—MwKXè˜ZýI:/“iN\×ô—„AZŒk “†ÞCMH,~ ‘Ó™¢ÓnøNr7ozѾ œÙy½T¤A—Ä@áeùUœQ l#°¼‹[ÁÈ2\e×'káY·øáy´‡¥H–£Ô£†§ªbB “ªà¹T6‰-¹Ö{5Ý’«ä»~RD›±¶©öIyâPå´ÝtaÛþÉ¿:¯l5WHaDØMrc6^Çèn8Á™8e"²=•ì&š ÉˆÖÆîÀ`®¶õ©Ú¾n$›ÐæÏ$ÕhuíUè‚„D‘„úÉ#gD‚,WêW}f[š×D=Áõ}Ëê±¼µêÖ°©2 ñUŒP­#Õœ÷f%òðm=›ONÔ' Ö5?Ðón‰‹`3Å¥^þÐç‚}·…ÂÆ‚þk?àz„rÄܦY‰—vò\O.$¡öó÷iF 2ÿšÞ)æ¸$a$/iJ÷WYj/*8_ ÓÈé7A¹-ü‹´?Öœ„BÜCڢ룉ïXãÿ€ÛçÓQp=¨Ø§®ß)ŠûBç,tª…εйZ¯0cÅâNæ´&ùªÍ•¡Ê“þ&uʤqyr0æÙ†èc]HÔ‡ <¹æÕÑÖ;ÝÎÛûöíg¼VB(¥JÛnR ưEWMO½R–öíðIÀ•°–è¬ÝþP9 'ðe6ó@¡Xó2ƒMMRP–žIÃ;·‘£E-l5¹rA“¢PÝÑbojŒ þõÚ;Àpu8àÂ×!3ßt&Äæ^BÓùPDÂUµ©åXrÑ©kô­ é…8ˆÔJk,HoJ-çùr`Æâ./ÅVÕM!†̓$Áø=_Ka6Ó–fýëe­–Â’¡’Û8Òßt´·!y'–ª¦TT©:’}E1­Ô¯úL^3ÚÓ7»Q¥dä…ò¾7Í0Çb¾1ݹ¨N€ÂˆçÍŸ 5)d×0M¡£mÚ®#×¢lN¸Úµg¢w~}Ï£žþùðåߪñÿ endstream endobj 1225 0 obj << /Type /Page /Parent 1720 0 R /Resources 1231 0 R /Contents 1232 0 R /Annots [ 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1226 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 472 757 521 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1227 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 655 391 669 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1228 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 131 479 181 493 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1229 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 412 121 426 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1230 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 385 316 399 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1231 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1232 0 obj << /Length 3048 /Filter /FlateDecode >> stream H‰”WÛnÛÊ}×WÌñÓ°èÞD¥>''H6A¢‡¶öAAS£˜E $eÙçCúýÇ>t_†Ñ”ŒÂ°ÈáÌìÙ—µ×Þóa5»Z­<¡Åj3ÓžPð öÜ P‘X,C7Š•/VÛÙÕm‹´¦5JÔi1»úüC‹ŸõL¹JiX“Îæíëa&¿%?ÐþR8«Í–´i)Ê]F ØÝH±\ÚãÑv| #Ü}'ÿãÁ×¹§œ¹öÝHªX<¼ˆ/Eó_Kì}ûŽæË¯âÉT5b•Ô=­“ßË‹;y6n“‰bÀîϸŸdø»jÈ‹IÀÔÞð ë°ìtX²”i•Á^TÃ<7Î<×°2ÑXàÄà CLŽà蹪vï$ÒÈ<À”ÉÖîÒ®÷:E-U²ŠŠgd¿…|m1òýräv†l‹Œ^ ›ÈdéŠCMöjdµóö.(ýв§Þ”§‚wò£Ù$û¼a—ÆoÅ—ÏhßxTŠ9‚Õ˜âÔq ÊMWo¡[™U©†ü…:›&yLÀ„&ê&©ˆ£€“Èl"ñT&-«µ€:5Ê ×$S׸äˆ Ò¤Æ¦¯;j wËEó¡tdÄ-lIqÈ@̃Cq1ȨÔ#ë!> Rb›@j%Ís²Í0:ðŽßSàZ¬ûšš ès@™mk!*Få å$\bD†‡*h³;X,;ØÐ;¸7¢µ¢1E[m× {¢Æ>ì³6îkœ¤î#©»Î;)´ €š‚T.} Û ƒ•…£½¤`ÓÊãáy#Ò=kô@¹¥0c²=Ù%<Í‚¸6ƒ€Ó •2ÃǼ(ràØ;6¤´Ç}v1D #ʵÀòAÅㆼhì “  Æ:<}0"Ûîr³Å3Z@ÌÚ+êPJ"{±. V—¤ÝÊ[‹§´aW³FÕ4{3¦%À%ÉÉ)z‘<I^ÁrJ€"5€ÇÝRé^B_û(¦óª‡:ŠÕ“Ê=ží8\}ï¨P-àäDä%äªx‚m5 )Ú¬ @ý!7zÒìtß»ËxÀ:^×x]2"3B' %“^îÜ!ùÛJ1îö‚ðl›€ñ@îFÄ ŽôOÔ&pa[sà'öS´'µclrm¯ËýwØZ¸l‡ì±áOI¾Çp”!¢›Nå/Œ:$ Þm7© Í@DZrLéB~¯­TB: &· 0&´§×a$BŠ„+ÞÄ­žÆëL…´MsD §Ï hƒŒK[z>ʳ´Ì÷[ëk\ÁãOØr‚««Þ ¢:b]#Ž(¡â” úìŸôÿSÚëË$¤Ë– å¡Â·¨ð[T„Œ ŸQÁWŸ°¿ú„Ò~8uõ‰ÜhXxuÐõÆMî ~4Ør’ÓÁ~õ(èR‚Ò‘¤Ä8—dYïÆ—¼÷¤Ýe‡Ê¾.ŽFTØ·‚ÝÕ„îB#W÷×Ó1—¾¦ ¯Ø‚Ë[,S@™Ø×¾ÃJQˆ=±胜\ï0pceâá_⢀;{ËcDcÜÀ3_)GÉ{ç² ¯Æðâ^ /Q…ƒK# nš@¡ï »OlÝóÐ*ì9Þß§Fe»g'õ—QŸð í¨ÑÀægm 7Ïm¿Ãk„yÞåYš5ÐÜË4 ’€:Фxi;,G¸H¤Ø;AþŠ9T…ç K¦†šB›°±Pº.ò³©€¢‘ÆÙt'¡™›í®yáB;Ç:[íÎh÷'\ê¾öÉd¦ö@Yô@Yô™`¦Jf×@æyyÀ³± Ûå]' q+¬-üduYÃ#ÊaÂ|‰3P < ¢d±@ÉðÁð*þ5˜‰±åù»M$9ž‰˜A&-ÈP=Ýí?صÌ#G:@Ü&½‰¾Û h4ÐÞÄöP1#Â*cy6èyvªa & ÒkdzYiŸ4ÆfcɘŽ$P´mT†,̧Ø%ϼÀ•¯6OÍXMDEë6, \©| ËÝ0Lan;ü2á@öokíx_÷±€¾Ù¾­Í.‡í(-·[HR;j{¬z€ÅžÖP9™:=ý†¥X·–nz $(ˆcœA¶ƒ ±bŽ×Ìç7cÍ£e… ͧ§'5ï2'¤Ì!Å%“8)qsýËÝíÇ÷«÷w˜‚B8£…0Ž£ìÄü´û”²ZC \]ud¦tÙÛTƒÔÃÞ½Û ]oûþXæ}ï«.xäø·ï_¾~ÿ²ú{ èq ‚ó虞~Ã|ˆž«ï_þúy¬Ó?WŸþ¶úÓXÿ< ¦§ÏÂâ÷ßo®¯ aÁ{ 'æÛíú¼'§§Ï+¯†ŽÜßò ”¹§8¾QY;Â^oXpFáRçÃ5=}žyô²×]{_4î$|¦r’ºÊb¨ôú[oÔCWŒìÒËó@85ÿ†eñÆžmyÁ|š4u|f'¦ÏÂL/z˜ÉëÅŸbN½8üÓç‰CGÃàù­õÂýqÜýõÓ_þGz­ ÃÀñÄn]·á³8a   >*ˆúà7ÿÞÍ­kÖ&©âÛèQvI®¹dµÙÕË‚¥Šö|ª±Æ{Þ?ûï¢÷ÝÛ½/ÕËεòÀ=QFP³|=ë:âQ¾ÜŽˆC»‡Šˆ×{Ë@äoŒ³Å<Ã( ‡²ä¥„ÃÊ!”¤Üó¡§ÜÎ?®ÀT»5 ûYï*àë‡Ãú²à3‰Ã<ÿ Lä4\4ô>á3!3»$&ž’8ߪSø@¿ó ë£¬L˜ÆfÊË©“>aG&ăaÊÊGùè8T4E¨Žžë¯M)ae‡£¬êb8Æ;+åI1/扂ZÀÚéFmì,i˜¯(iVNby%ÁHiPr¬°Ž¿Ì£ÝÐ’h¢Þ%à·‡7 endstream endobj 1233 0 obj << /Type /Page /Parent 1720 0 R /Resources 1239 0 R /Contents 1240 0 R /Annots [ 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1234 0 obj << /Dest [ 1241 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 129 537 179 551 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1235 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 331 523 380 537 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1236 0 obj << /Dest [ 1225 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 427 483 476 497 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1237 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 266 334 316 348 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1238 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 199 121 213 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1239 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1240 0 obj << /Length 2691 /Filter /FlateDecode >> stream H‰ŒWínÛÊý¯§XäOHÀd¸IQ© ¹77×EÚ‰Š~\ÅŠ\Yl$Ò)˺Òwè;öGÏÌ,%YRl#µÜÏÙ3gÎ̾› ^M&±Òj2èXEø‡Ÿ$Ã$‰25§a–GC5Y^ýÔæªhyN¤Ú¢¼úðU«›v…Q¤1§}s3ð>›«t)òïÁ˜Õ( Ç6æaɾ¼&æåÔJ3Zý›÷ß½Aù†™åjºU_·u7GOìY;ymÕª·.Ô?ÿç)¾WKÃÔ«üÈ+æêë¦ê~·«o2ôL]úÁØSÿá¿þ·ÉŸ|c¾M…>&?£-Øl6¡? µ×Ò©–ŽÅÖ82D3 c¯p]sÞéýd U¥qš…ÃL«á(Ìs•i ©pÇ$W+;˜ ÞMv` 5¦DÑØ£"£÷ê-.‡ãtœÊriêÈ!:ÂI»MÑ„Öÿæ½ÿøõ½dzõKߺö>¹úôåjò7ñµß÷ö}ÿš¼ÿûä/>~úÛ‹?ôwˇa”k5iü*¾ÏÁ­žM³Ýh' Õáxåaœüpùû³Ù<¨119^|v˜Üñ¨©ÓX@}ÊËCùëÕ‡_O±LÇÀÅÙ„£³#‹Ï?aq‹³sYô—O_þüöã©MÉ8|Ĥ³£g-ÊsgÐpÏKïÛ·7—¯¦vÖ¬ìfUu¶-VÕm÷†8~`Bœï9õò™`<ø¿Î.~|´?wˆ›'ÐëãïÎ+l¯ƒ#‘úû€ŸL·$¡­"•„Ãa>RòÙ¯ÎFiÊhKÐÀa&ÚÏÑfü£.gUmUk:‡zUS~4Gù൚U~îь߭,€‹ÐÓu¶Vð÷-ý€”¯ñ„™ùn–%ùŽˆ’z…×"¯?5ugªÚ–ªª_³¢Ž¼Ý¶°,õšL ùv¬Î.cåÒܾés–¼&Ð!¥!·N *oïLå#³y 3õ),|¨³g_«w"|d@ºOr)›QÛ ÌWÈdÅ^¼“]&)útrA?ûœ1¾ ]yŸÔ]µäÕÔ‹í1¤ŒˆÜ$¦½ÄÁy"µFS«B ÓGPä=†FµÈa–ÀÓAâÝv'FÖ´‹56‚×àÁb—·ÝVÙûÂÂü™Ÿ0ñR&R'»DnX¸(ݪ²’ ¶è@×&N˜îšú™ßôEK! ïf^jÁ‡L{™ØtÁ6€2ì¶íCdɹð=QÏ‘éQªœ¨×^ö€:íÂÙ#vâÐcXÜÒsS»¯%ÉS³qC`BAÈ@€P0¿³ò ðSñާ+¦¨,:$tBÕ…ZTõwÙé‚¥"g ØHÓöÞ,oVmæ•‚²ª‹fYÕ7¿šä¡•Ù•­A^еûW$gk¸Å´ª3íwê/U»ž"¯šŽoÙËß[ótK\é¨ÒÖ]Xõ„ÿÿzõsO[¢? ÖYÍ•‚"è›d ›eº£ PT;oÖš)‚±Cè”d¦!z‚™nbgŒ@§f«fÉJ…ý€Sa2¹¿ñÙ8:M¼ÁK'ã×^/¨½2°¨‘2,ÝY/,ãA'€Bô}·[vUÑ,ÖË:<ËbìÏOz•¢’T ¬j‘촷ƇöÈ[P,ébõŠE'5& >:‘úº&àŒ3å¬|¬XÝZYà>Œ€(¥#v[š­„äïu³©AB_ó¦NêÆ%øVÏÞÿY¬#H4äAJ((ÅÜïÔý‚@×ÞÔü™S¹ÀÓw´w·YJ`•«Å™t¨ ¨²Vn«Ú'5.1¶>,¶“Ó®^têk¨´Ë½²´ÔH±rʰïî\ïJUÔ[KAI6J?ŒL¡ Mý’ÊVD¡º]57ÔŽÄnŽf´ Û¬ ¥ÞynšxÇ’º™=ÝŽÜBÀˆsŸÕDSÊj¬ïR9ÿW´$R—̤‡,Tä™é¤7Aöíø’2E²U¯Aœ¿¬Kh’ÙÎ(³½ u:+Dù^ˆÜëȉ˜Ë»)‰½©]“ÊUa W@/]÷Y¬­êçË«ÃØ»çÖЪ/rQWÓö—KÅ `\á¾­|ˇü­Ï¹µ²”.ó¤Õ› µ1¨üL·‰Â³¦ úH‰åÅÙ‚Âe>.ù™Bª¿©ªºCö`‰!¾=³Fç,/Åô‚ksÇι­œR3鞉÷†koÊ)ræb]Ò04´<2¡  WÉï`È Í¥9o…©])ãjÂܽBqÙYÇ<òD‚/Õ²ÂÃ+p n– D”á—sp¹nEˆ©®ƒñK»lV[ºaÜÌ ²Cаa}ᔊ"úmm‰ëÖ¦;¯h®Üv-TI3AA2ò5€ÇÑlIÑ ¸eeƒzÂ=Mµ{` èàçz^70bxô&Õ!jÝ ½/´+Øzºž»8* Hý‰Ð#×I’…;¨\@i—OšêwŸdË¥Q±ºS0³uå©u ã­ðÐc{:Xv|¡wíjUÝ‘b•ëÕN¸¶Ð’TèyøœZój~:Iå½¥Zv¥º<\‰<êëÇNr?]ár¶#,žle¡í¨mô5,‚{Áá#‰ø|¹¼Hê´/˜3ðžòCPå,†Ñˆ‹$j"’R £¹‘÷´¢¦ëpâÔ“eG°,LÒ=]Î9q©=., âÑÜÞÞwêˆ@å`¿“gE{k ¼…š­ë‚¯ JÛÔ©èÄ(kÒ#î„ ’‡§|Ø¿`ßOÿXÉ* endstream endobj 1241 0 obj << /Type /Page /Parent 1721 0 R /Resources 1247 0 R /Contents 1248 0 R /Annots [ 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1242 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 725 391 739 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1243 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 410 631 451 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1244 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 293 550 342 564 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1245 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 457 523 506 537 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1246 0 obj << /Dest [ 1249 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 407 238 443 252 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1247 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1248 0 obj << /Length 3107 /Filter /FlateDecode >> stream H‰¼WÛnÛH}×W4òÔ$†wRaÀIƒ,&™`l`/ö>PTËâš"‘²¬ùý‡ýÇ}ØSUMQ’í$‹Y,&cŠÍîêêªS§N¿¿½½¹ ”¯n#?PþÃ#Ê7мD¥ÓØM2/T7«ÑÛm¦Š–çxª-êÑÛŸ¯}uߎ<×ó|Ì)F“þçn¤¿æ÷Fù‘¯œ›Œ¦¼hªRÏ&0fnâ‰]^ðrú'´úVÿ+Àè$𜉺‰ö25Û«ë}Ý-1hãÀ’nËV]ýsÈBåWÚ¼{=`¦CYy¡X*kõõ7*x¬ͦ-›ºeŸ9Ŷȧ`°—ìÙ}ÈkUH&%‰ñ7’È6£sµ(!ŠÑ¦t&‘^w¯û>L>LÅÊ5·c7ÌSçL2„FœI¾‡¨`ÀAûB¾‹2> fB“o5ðoÁ æÌ6ÏŽ⨸T„ú‰”êç'&f™ž…ÝOޱ@Ù‹t×mÊÙ¶3-½ú|^ÿZ/Ÿ— A×MmÔéY_Š´@ðV4‹|[uÒì{ù="”[7ª• Ñ–g°:/Nï´ ÄØd°v«?-ØØ’–C¡Xʃ÷¸T]~¯ì5/7¦è€íâˆlx¹ã{ÇìÔ§úÅ, ©f‰))^@÷ëÈ¿sÆXÛÛ¶›:Ô®æãõ_lcÎH±Œr‰ä æÉHàÕçø†Â¨|áDDÀfƒ'z¹z _av朗‹Ïüåž§L}S©eN\ãkÐ5Ïgó»ü5䣯çlÍ2øñ…¾È)PÌ3£¶äÎañœÈÞ(ymòteŽyÆYìÐ!‹Êäõv­v (ÑLlÙ§ÁBÉ·XJÏJèY­Ï©ôâ߈Ê òå%Ñ3Ë9 hQ=œ¢9ÿ\¶ÜjW]#ýy…óòiÁ!€ZGï"ÓŒ3Ê”ogȰš€Œºr2–éÿ í' G*/€…€¢ƒ®µÉ÷—üJ+ƪÐZäUÕƒP ô16&Ÿ—õ=Z«ÚmÊŽ~¾íxˆ¡•0©Ð(µ)z̤˜ñ„ý \¨ÙÁœ¾Òÿ9!1 ~Z:ÜDìä¢Y­+ÓW}rHØu貪‡©Ì1s‚+ÚŽØ¥„dlS™§œV~e*­f‡ µÞ®f†gö>9’C?tS™•©; * `çúŠt>±\ýÆõƒÞ¢@¯þúÉñ‰·¿|üé/wúÎ÷4¾uˆaë¢C[+1&d¤g:”ê!ç†XDy6x)Îï÷¬æ—îól}~Òf‡NuÃÍjéØ!âX‘f(ò¸< ÒD¾T…0¥· µ@^ªxHXTä­ÈKÀUÜ"W†³Ýpæ©q¢mvçÝ’×?jpƒ†ëJËË×Qš)ÊEY¨ÅV",ŸP¶òƒ¹<—Ϥ„byŠnØ×4¤l¿ÔëQJw‚c±>h5ë1(1P»]› …§íÚ L„0OC¬£Lf¥ô¸>ç 9>ñô±#4<¿KBR‚ŠH‡—¦þ¾¬¢ÐÍ¢ÿ©¬,_´hÇTšÀü£}^’b ôX]Ué°Ø12Tw—?$ÿ˜x=åú®l/_•Rç î‰7áY]ç+s¦¤Âëz 衬­`&0¡”™™5 F7md)$Ö2¨r;¦y´«HŠÄ¢€R€ÇÓ=Íneˆ{oa ‰0ÆØ„Fév²¨ÕéN,J¬ ôŸ!X µúF>o'/ѱ7ˆ+ÏŠ«¡Z6æ ˆ'ïú¶AMnµÀèlϤ´1«¦3jí0\s ¬Û«¼Å©[4¾J„›sÕç¦íT3{,›m µ4™¢ðZæ@ƒVòŒv%ô)ã[)“Sò`*m\¦T–’|ö­uHbÒÖ2 =a›Úñþ­¦bUX³öuo—\Ë$ûZòüü‹jû½©3ºåƒÀxDή†+E¨Uvúéb»7>Ÿ:3'-Gz И®,ìýkdâŠ*ûÛ~Û_•|·1è÷ÇÎ/¶íóB¸Ó«Æâ®"$4=~gŽ $Ôõ@†~½«ª|0êKóP2š¦ÏíÙ«¯èűÎ(Z¡ö_„—ÈÍj°Ö¬YzÃÏ· ܺÒà_;Vàe'´r™8@ý #Ä‘¶S*t d=ïmÚ9h-ÔûìÓÖÉ‹9x®¸ÿ\vKRhP?¾fÊX3†ÂM‰e¦LÒAþ&zìð=Â*r“³<åÛ`û¢–|•oz–‘®‘Ëk—óžQo_ÉzÞT~ìeO;v/›íZöCHŸx ïo™¼r|®¯úl“Bzp¨Â¬ZF¤Ÿ­tÏe%•hßJìžû¹ ÀcÌí4÷5|ix!9/ŠÃÁùAYù¶}^±¬Ž)m¤°xÛ—!qØ3Թ̗ơۦÌâÖ 0¯¶Ç3Ñ çã<Ï”" Ý0œü½EO$æˆ7N;(–ÄçíûD¶«½˜Å:7ä±Ú-­.DH/¹aˆ'±ˆ´ŠÛ“”°äçõæm=7b’—Â`±ä¯}—Ët‰€²l¸+âjzZ,Áàp ïJÜ­ÐÆr0 no/íG< ô % ¥Î·ÒT7+Þüz_Ÿyà‡n}U ¨â^" ·p1—Ÿ¨þ´ÃH ÕÕMÐ×XíkŠöi8ÿ2Î{Ù–ÏBžàQÜT¿íìNò¸sþû›Êó¸\þù( ©îÃ=åp§î”ð¿Ú÷u†„)UW’ª¡¤¯âú±±êã'w´Ð!%Ë%ÍõÁû|õ¤ kŽC'²iÚ¿ÂäÑÉ­– óú–c}áØV•8 tÔZ5Ñ5÷9ØÐÖ‹f³Rvº’Ó…euØâ[QoÐa gæþBrˆ›ÿ0SË{ÑÃö3o~P!xnöª`q#¬^”÷ÛMNW4µ(‘„™YÐ5†æœÜ„6/ÙàÇK—R{Ó…íESUÍŽ‰ü)‡¦E:I ´ËfGB°Û¯Ëÿ^-» Â@ðž¯H9¥R Æ1ÄD$‡ª‰TUÊ õÞ6´*UQR?¿ã'l¸DÃâñ¬=ëEaQ[BV Ë2MUAç°B©n›àƒ–L~4‚Óº†É¶ç!Rå>«?ûj†©ëj%6µËÞ’š«²Mµóa'fE¦Ú73B·p)GÏg:OÕtqÝ›t”½'9•G\zÚÊÔh­Xnª‰˜ÇT`²l£šÉfvJÔ艹|Ž£YîPÎ`ƒ7xFEÌx0|vsçò³ÅéÄæëDûqÎqQå†PÝÉøcåÑ>¥ÔˆÏ`®L‹Éï±:Ÿ¯ïĉ¶OóÔ{ûàðkGê²ã‚}©#¤—­yå ipË;kòÃ6˜aÅáX/:¢ÅV¤N g³†¿[Ð*Òõ£¿ûÒ‘$p?­”iZE“£Y¹?œo—oÑ¥>­·ñËóîi¹Ú¼nvU™tPy[ìè°Ú~x˜›·ÜrûºöÇLôo]—Iëß-b(o^p8m‹&k³2±YëL*†3€Mpδw°ƒ ô †-Å<Œšy­trÁncð¿ÝG endstream endobj 1249 0 obj << /Type /Page /Parent 1721 0 R /Resources 1252 0 R /Contents 1253 0 R /Annots [ 1250 0 R 1251 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1250 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 421 259 435 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1251 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 161 259 177 273 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1252 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1253 0 obj << /Length 2374 /Filter /FlateDecode >> stream H‰ÜWÛnãÈ}×Wtü’&`Q¼6©m`gí]8— ž<ÐdÛb,‘ŠHÙÖ~ÈþCþ1©K7EÝ'@™ìê®®:u;ü<Œ&“@øbò<ðáÁü‹ÒÀ"O‰d»*õB1™Fß7©ÈÚã‰&¯£|ñÒ <×ó|Ø“†öñ} ÿ½háGp&ŒéÐX$ž;V 8L]å±^:Ðq|Šž~”`uxÎÐ]%½T<­Åúj§°Hí€&Ù”øîÇKñç8ÃÞ— ‹ÝX–Ž'óé¥xx/ÛŸõrFJB™U…3Kñ ý:™üf@“7ç*x™ÜÂYðþþî:¡ëËoÕx-¨†+]xôÜ@æfiJšî&_”bÄÊ •/ÂÄMS¡|@R€Q*–zð<ø<éÀ}Øâm£±A×CD$¡7úÁçÝq<Žù8?úžA4›:%ˆh„çåU^WmVV3TZ[dmÖ´õR__ÀÃksqcÍOC×K}‘$>üdrÏð³ÒXuÒ(ˆ oúòØKÝ :züŒ¸»›bDB6F»‡Šñ}Ü rŒ[ì»qÀ¸É«¢lY›OŸËY«—7?¸¿½ÿéöÓõäËí—«ÑŽ#ÓC-æv¸DíØvX|ƶlSÖ¶—UY,–ú¹ü¸i¯F½·C¢±{ÂŽƒÒÃft©nRK^lBíÞ‚æÈÂïa·o>"·ÇƒÓøŸ1Üßà•ð«á°_íz¡»ªhV‹E½luažÖö©–ûÅc†Ã½òñOâPjzg <"?‚÷3œ¼fgw¨Æ'#pD|:ƒUºU£w#p}ñ–g3]ÙÒ÷.¬t^ Y¾w ˜êz¹ÔÅõÅZ7£]ÔUz õÃÒ3°%[Y·ätÔŽÉíquöÃ⃶§©1=î÷˜­—]æîZ¥ý{÷¸»½‘ïöGŽŸÛ»ãñ©nDü™(Md(M„랈Ü0LÁ¯–ƒ(P”=âu$Äó™€Þ0v}æ³Ý$½ù$`%–÷U>s «B‹LÂð–HÓ èLY€‰†…a¦º‘ç'=šÑ©¥³±á'àKºKϬ± Ü í9à[ûùß³Áº;>iI6j ëSnbi²ÒÀ§¯„ÍsbÛûh©ZËš—õÍ®¥CÒ ž‚­ —±M;lSc\V ƒ(ÛŸ±mb>Ò¼v”ä©ìDÀÕh4ÃS*o.…™ŽïÐy.i¶} åÇ ÓÃÎt_õ@ù‰f$ÛvY>­Zœ€T9ãç×f†·Û«Çú¼dF°q?`c&’Þ©ã#åmèE´Ù‹°Ï+þñokH|†‰ TVp(QÖ:´FÈ©/.H£ÎK‹  PÇ{éím§¤Ãºê_ƒÀUaÏÙ¨C­75‘ÌvèàŒàœ"A—"Æ?‘9Ã4hƒà,FR˜²1Dß¼4à Lm¸Î•ßÒ"#ï(4×S×6 !pÜŽ+‹e„Ta “ÀEòn‰è°«dÁRç-7I=/+AÌZ=o˜›ê*?.åEÿÖÊ÷ýM¼6N˜ˆý‡+{“Ù¬áLÚÕ2× ~Ò˜¡‰ä_üÌ«+ñÕ¼j-’¯Î·¤ª×ª®þÅjöÆ›ÜoªYQ5\Í DÒi?_Á·+<°«Ÿ¸pnÀ…Kç0á|SÿÙlV¿Så>8Àäû¡’Uþ{Òü;:!4Œ°HV¤çˆr·ìkÇ”6s}ÚP!RXæ&Éx8Ú5 ¯J—mCûˆîçÔ„”ä_¬Û¥RòSI³AC'N^‘r–¯ G¥r¡yCvúrsØžC‡#éŠ{Œ>v¹Ùe¤¢Fè°‚rý¦«vdõ¼šº>fÖ%áã6b #ÖßÜGãT2äS¿ GRlÑ&à©_P¨æà˜k&ow¼û‰s *ƒÔ&{POWܼÅzc“ÉlöÍúßÐkxïåEËû/ Ö¬b¸–¯ürûe/àì˜êÚ„bÁ¸zÙ3 Ú:dQ‰Éiو¬X Më‹Åׯ¬|uÜ}p7=­W„Á Fñ§©ÊVQ "‚é„¡9àн”oPZÐô ©àõœ|Ú:5¯ax-2^CœS¹|¨vÐÝ¥If©ì›DN)‘CNdeÒ¸Sy‰ CÈ¡.u‚‘5/ïô(Q Þm²ÕÅ|G(‹£Dˆ®a™%”³Ül ñЄÎû´ÌéÀÔÞ¢k¼5C bY‰iV3ÈþÖÝo$£*»±Å™!Ìè0×µ¶i™iÃ˽ðÅdnLáÃÅk&æÄIhÂbPb"×iã>qU LÔ¶ÞMgßʈ“|síäsÔQD?2jž½Ây˜ ¤eHÊYˆŠ9~v²Ð;“†bxbFo]ׇfÐÁuÚ@Š=9‘[ž“ãõª}©¹ƒ!Ýá\̵n5”‹|ª´h”Ùv˜Zñ´îšíOà…šêÆ,•Õ’?Û}Wmú®²SÈvWšb¡t±ÿõ8Ù·ÉÀKà»¶G$£îžñÖ—e“)ÆÙ ùZÑ´öŒ\VÉò>6ú¤°¤ŸË-“·—ô…ÙòP ïo‘•ž¥Ž~êu$÷ÿ€:ö ÅG° ü ¤l9‡î¶uE?Ø ²e–C² K> endobj 1255 0 obj << /Dest [ 1046 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 110 535 152 549 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1256 0 obj << /Dest [ 804 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 167 521 197 535 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1257 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1258 0 obj << /Length 2475 /Filter /FlateDecode >> stream H‰ÌWËŽÛÈÅlõoR Z4I‘Õè4`Ûƒ âx0V6qgÁ¦J-&)%ÉʇäòYäÜ{‹Ô£ÛŽö h U¬ç}ž{îëùèå|©PÍ—£0Rþðg‘ÇAª¦³ÄO³`¢æëÑË»Lï TWÔ£—?}Õc7 ü ±§ûá~¤É ã‰òæÍøÐLM–ââIæ§ÜËg">N£$¥Óõ¿#ÌŽ£À‡?ÕA¦êá¶+ÌDÚx¸Iwe§^ýt¥þúoœà»ÅZâ'ºô]¬®Ô‡}iÿiÚŠ/™è¼^xã™VÿâÿÞßæ±Æ¬Mø)>æo0Çì÷{ß›ø¡îèUCÏâj<écø‘.ÜÔŠoº›BUªQ”¤þ$ Õdêg™JCXRAÇ8S­-G¯çƒ1&!¶çÖ8Z7 ‹h¶|;Å~cCìO&ÙTÉgoÔi’øÓèĪADw|Ôa‰¼ÌŸjuÓšucMëái½­ÌíµêÔîïòo³+|Já4`€'Ä TÁ°ÐÔKL…º|TÍÆ–0 ¼EGI¥TDë2R¤•»À 5èYnx·“¢pÏPÂ(h<¾´,'W|Þ° Ù*ÔÏXæ2<‡Âc–….ËXÕÙQÕ™¨º‚§SÜÎæ #ÈWÁ)È«f_™¹µrÈå¹v¹õ֥˥ƒd¬€þ‘û­nÜèÒo€ô¾ì ¢ÓÊ ·’ gBY؈†œ=¿èŸ¤öIŠº}q­æ „+hKÃ'â\`¾S2%U¿¾•_à1ûŸÆ¾À¥èL" ÖdF™lx\ÈÖ•áQ™!Bü3YŒœ,§æäE¶0¡Er"³A;’v®X™â¨,eJ…9r¡m½1¥ÃÆÊšº×¿@ÌXÿú^íŒl‘ ô¦®÷’»,VØÉj"[óšªF¤iMŽ6)´cáÚ¼°åÎi€»:¤:«1ÿýèX‡ÂL¢ÿê))î¼ñøñîýüÎÍü…ÊÓDÿéîϯÞÝÝkz}ªï=P°ƒ¶ÜжuA„AWlFoœ ü×a“æˆ×DWdLw˜Xü¹0K”ZüG±kÚŸ?CAr=Ñfcê’T-r›[Bž…µ!¨zè'ÕW@äÙ<=&øÔQuCÐ ñ‰ñ‰„øP¦Ë'ó¸ÌÆ¢²ù#‡ W!!3êp¥ª·ë¢v‘vg›%—N*ôí𔆌§¸KD¸‚™QQg½á¸É‘QmóºÂoý¾Ap""GgrŒÎD¢ó·áøá&C“MSܳ˫­Ôó›ý`*¤¢ìœ]Ð'N¢’WöJH`Ùv–j(âáÚÁÍŒá†^ó~1Ó=OÖ/{£}YUTsó͆úΠo+œø½QCgU´á‰ãŽÌ?pÌ&” 0ÊDÄ%…‘Áì4Û¼ªjßl«…âb«òNíMU£q¢À\-Ùˆ‘Ìg¸¼pnêtêÜ!?E+=_•]ß8ÚÆnŸÂÓN‰à› Ùä”±7íŽÁ„îØbgZ”¯'ÖN%Ù‰yžòÀ¢a¢À­·½¢T¿1õ(4n);le`ÄNe¿mzaÔÊìÔ/—%Ôo ½ØÉ‡ž÷ÑE¾R}Ê} ôF@*ÀÙ¯ÁËTðò["ôWáçgxàœØÊ£*sd`U%½ì@ÑTî8œÊwB€&º¬ò‡êæÖ§ÂŽƒŒbrÙµwbÚ·NE5J/ØìlÑ·ñÐÞ:3huÞІ’&Ÿ¯ª7ë¼Þ’ ¾k AZIb⼑¾¦!Õ"ô$ñMðÉ9‚bdŒ;Mÿ¤=W¤gæÑôÛèrDõpÒëÒ,LuK3—âÔÆœÇ±cDÌJqšŠØ‰þîrÉpèÈðMcÖòýÝ;ÆÎïü~v|ßåó ù-ÕeË-ÔzŸËÀ@&·âWqË^„ñ°‡Ú àµE!MPä&šRF–¹ƒl–kîßWÁ§ÉëZ8×gÙ}Ÿ¤PЭ 'Ý¢G ܰÃuy}×'»{íb·[ÖJî¾§vãcœŸ…9õ+° ”Aœ@ ìÅ^æsL™42wË_3WÀþË­n—Ú!m(ÿisÛ±Ú q3Š*ì`=<ÝÍGÿzL” endstream endobj 1259 0 obj << /Type /Page /Parent 1721 0 R /Resources 1262 0 R /Contents 1263 0 R /Annots [ 1260 0 R 1261 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1260 0 obj << /Dest [ 991 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 389 438 417 452 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1261 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 437 438 465 452 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1262 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1263 0 obj << /Length 2514 /Filter /FlateDecode >> stream H‰ÜWÛnãÈE^õ}j.,šÍ; AÁÌììb‚$vÈ84Õ’˜P¤CRÖ*’È?æ!§ª›¢$KëÅ ÈC`@nöµºêÔ©Óï“ûÅÂJ,Vå ø¦¾†^,’,rãÔ Äb;¹ÿÐ¥¢èxŽ'º¢žÜÿðY‰u7ñ\ÏS˜SL¦Cs?‘Ì×Z¨0Î⯓Œe"ñÜ,ÆÆAêÆžÙ—×ø¼œZQL«¿Èùèúž3UK/OñùP÷ôøR;ØIve'Þýp'þüogá»ÅXäF²tß¡-Øï÷®¸Jvtª¦c±5ŽtÑô\_¶kÃ;}\L”(ÅÄb7ˆ•7ME¬àI;†©hõd5y¿8:#P˜â{cô®G‘ì½ûï_…hpde®g#$e&‡f2δ²»Œ‘v½Ð^G{5éê³¥~) '†Ku¹œ?ˆ¥ƒ‡ðú”‚1->}'%¢D"ݦÙUKñ¤Å®.ÿ¾Ów¢kD¿ÁH‘×ÜÝé¥è±Íÿ¦E.Z1ÉäT²ÒbÕ´¢©µèÊzjC3U.ɘ髣™Ô$3×XÖÁÊT>;>™W”+'Ħ¥ƒ•²KíÀµlï£c~ô%6è?¶1/Là¿Ò‹* =ób äéþð¬çÜ| ¿w"´kcIÞU¸A ¾dïb¾p©¡Ó?Øl½2Ú̦-¾5ñLÆx&Æ’O+‘W•hVˆî°{¾îDþü¬ó¶¬×¢¬Y«·M¯Û]¥çbK%27ñîÉÆ»37Yµ¡DÑÔµvëi£Ö|Ð>‚/Dp qSÿè´1¦ÊÆ´e—*RBEÙÁQ©$c«R/]ñÚ»ßä½òäl›×»•C@Ê‹~gk²3´;ÍÍǘmö3l©´JÎA̽5®ÆµËõ¦§[ñc™Ã3û²Z¸VLÞðá³ï’!f­{”ßò^—¸å›ê§/ò7è#Dì¯:ÄóÇØùfÅxá¥^廪"Ê* ?’œZÝ3A¿¤ü¢‰egüåd®or6œz& e!ìû®—‚KóúÀ©u\t„}èŸÇ{ÏÂÞ >!Ô‡s×Mo­<P(v8À"Ò‚ÛÜH'½ŠF€D'ÛÌHêºç¤ˆôñ]ä}ÙÔŒp˜ïK—Ïzg>@:°…¤¶lWN}†GØY¾äžbo"üd^CKM¿°˜£þ’;•“ãë’Ž¿³Û™£Š ÒëÆãªúæ+Óa»3ˆë‚§ÐHDm¦<\Ðoí'ÿnFŽAÎŒ]O”૲†“r2)fˆÊ~ôÌÇà&’L6ìÃ.ÈÊäUEØe(pv3á œ*7ŽF{ü±bù¶b½í‰^ØõTBY˜®ŽB …²PiS€P²Ž"õ€¶ØúYkÜ+è_‚@P)G$.“:ÀØ7ak\N…ç´†Oƒˆ.s^y¾60£êòãTѲ'œÐ-_¨ÐŠâ”WLìu3»?~qzÏMZ™Ä²cÛÍ3çУì4¢åPDàßf/ºÝS§QÛë„®ž!±SÈôsÛº#@ÂagH å Á¬@êtO¥¤»è¥D¸ÙSǃlºpÁB¦ ¦¥ÄÝÐ/šºAÜoJÊD3©u¸Ò¥NY“Px2c€H¶3kb4À™ÒŽ]p‰X˜½„ÅÂFY…&˜` M„ù„]"þ‰DFßpY‹y8.€ÖdU! 6º¢-9\2ç¾- ù`_zK@F¨ƒÄ7&ÇX—~@5Ì9ÑËú•oòª&ÄnŸ¤çI™#‰¥YZp“õÅ…YSÞàEéñ¾¶°|€Ž,Œ5Æè C¼ï÷ú§~ðÿ«Sý1`ìå/ò=(À}[>ízÔ |*ùÀh Þ:–˜¬IÍÒ‰·;ö—ü?Ò¿¹ñKð¾ 3Y %Çää„´]HÓâ‚àr~š xo"®hGš™…ù6ƒô\bàˆ:ßB‰;õ†O583má…¨™´÷$5èa”˜MY®_¯Þ:¨©W5½ÁôÞLt90ÅK SAÚÐSUA,lË@RÌÁK{d'– Ë Îî²6“H€¨aên©ùÏ t ®pS¦¿-´x¸bÁ—œþÂÊl qaµfyâ?SÙ¨ð…ƒ¶n#‹ö˜¹ÖõÙx›³~††-_ÀÁ« ï OQ5k³þNØ}´ *Vˆ4Ö¤RÑm•Ì\ÞáˆÑ_Â6A6>#§ce9¥VÃ6!?¨Ä¬*·e¯—üáYÁN”Ò ×¢žu¿éèÕh0±á¾ ãWbÛ‹UÉóuµìÞf¨ ‡ÂÿO†º¢oŸš¦ÒØç%¯v×F}Û˜Kâ²wúŸ³×rü‰ä=^#–³J6€^M,©PêÍÓ³¥Gn€®ázÇ^è̃æH?,ÏøEƒõ›¼‡‚0¸– ã5¡ðNÀ`ˆ+Z冲%*÷ð³"’”¡FÞn‡ÁÙ%VÝÙ… ;Ò»ü£°Þðpiery"— +—µ=ãõvBÿ”oŸ+#“÷ûÜ µfï€r>Ù´öTVúú«ò5Í2ºâOرƒr£AHÔŠ•XAJrôìm¥6O2ÙFUHtÆ@ ®Ê5Qñm”R÷èÜ™— ÔÕ(Œì: ÇÆSsžÙá‹"ó¤Y¨Â¦^´Þ–ý†8?¤Gœn_ ÌòÚt`ƒ¬Ú! HQ¼Ë¨«Èã厺Ew¨ ÷µÛFåp‚õÑb´ØjÜ6P¤v;„ ú˜¯È_¾> endobj 1265 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 218 333 247 347 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1266 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 456 69 486 83 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1267 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1268 0 obj << /Length 2122 /Filter /FlateDecode >> stream H‰ìWÛŽÛÈ}×Wô[šÀˆæÔÂ0°k; ë Èè)v8dkÄ„"^F«|Hþ!ÿ˜‡œªjRͬ< ö ,²/u¯S‡ß¬¯Öë@ùj½Yøòð?Q¸Qä%*]Ån’y¡Zï¯Þö™*z>㩾h¯¾½õÕ}¿ð\Ïóq¦X,§ÇÃBÿ!¿7Êbå¬ÿ²Xñ¥•J=w•@p˜¹‰'rùNÀ×é)Nèö'ýÏ«ËÀs–~è&ÚËÔÝQÝ›a‹•@’t_õêëooÔŸþå,c¼wØ‹ÝXWާ‹íº=TÃßMW³PçMé,WZýƒÿwþ¼þÝ‚=foÏMð²~‡5¶àp8¸Nèúº'­†ÔB4TºxôÜ@viË’Þ¯¾ªÔ"ˆ7L|¦n–©ÄG$|Œ2Õ™ÅfñÍzFèãˆ÷8§èzÍÑCŽ"›£Èõ"ˆÜ0ÌR%¯SPÓ8vÓà,ªX³QÅ)öÉ÷a›;¢¡^7­Ùí‡ã¾sR7ÒíÞðz7T¦ó•*[Õ´¼2¨Þ¡˜7¥ÂY‚ïÁÑFÑÂ0PXŠ'ã“~g6ùXâuvE…´9'@·› «¸ðç¬â½“:¶ÍŸÃ5%ÿÃF Ûªw"ÒÚmTÅVdU~и!ÅE¢rô cA¤9íÈø Äõð6ïÊW(í’Y;+„Í^lʼSŸõÇß/ß}øãgGÝ›ÆtùÐvêPÕµU3:K„ý¾3²`°(3;ùI÷裪¹WSC S[4çÞ¸j ÇþîL‘½Q}»3ª¨+Ó =µå60tý®6NpÜ9>Á”:lM£LS´c³<Óˆ^øKj¹åÏ•s\8 .á¡6䳫~OeèëPén—×õñ†ƒ>Ç»‡Ñƒ¢¨ëÎüm¬:Sºs ¼²â4pƒˆÐé •XÈ÷e>˜¢Š$šR5¼Ó×í8]·äˆÄë«û‚ß[Jp2B]ÊKÈüy<ù¶üÊ‘ƒiÕ²5Å—!-bBü HûoLÚ~F€Ðü ùh­<«×=j%ÔvëÁþ¾¡Ø`~Öv{@Dïå™*ãú­ÜªT¥Ù Ü#;K$Š+B–[Ççé̆X‰"B^äLm„±mœeFå,¨5žóT&ØRiÇ[œ" ¨¹U¾ß£ Jå B¹_ÑgOO Ý#Mdžm> ÁŒÔu¿7Eµ9ªœ›ìI'{3ðjî[µn}ŽÎ*ÆÀ!Ðø2¤þ:V~ö±œJ(¸+«‹±"ˆ¾’±²’é^Œ•ðb¬€¯¿{|£CÉຣÚ3¼BÓ±Æá|蜔¡«íJkWñ“j|~Lö†õAC®ª ªi‡â¬zxÕo]Rñdª=¸Í{Áó¼,+ò>¯å2x·OsÀkOCò¬mx:M ómƼËbçb·… ƈ 9ÊQ"tEÑ,7U×Ceµ£¢]sA€ºŠÐ3ŠNÈåÀMÂ]8îi1Ðe.¿lÊ>Óâzp8±ööá°û…/{YµGíFáCYgË––Á¨U¹·wºÒ*5=F§Ø“üý´lê©èÓ#M ÐîECÄnÏ/sߪÍhÌ»<@wàŠ“[J{ÍÂ'CkŽ’\MÜ"ÖD9мa<å±d%A(Ë%4èAoÝ·ÓY¶oÉf=n¹ôT¢©XY5ΡC8chˆd¶Q¤>éƒÍI¸=384gÈó=·M^ DOd·¥\ c×PʹŸiuêgüqÿì+=Z­j7[õ˜:…W ¢1¦ÄÌ(jÖO\Ķr¯`s/Ës¡þÃa¢pÜtM'°í„‡Ùc`û”†–Ò< > ½úìb2s2‹$2õ®æ$2„} +…¸1æpÞQÔý­À»ÕPláBÔMì™–I Ƈ®¹‰*ºΓa$XeVt’µ ¢˜¢{>–ÓøGOç¢Øàå(*(H·Æ<l—Ñ×Rkm¶½o…OoƦ¼nTâ‚g&î4q^BEƒ–ƒ3næ­æfLÏ©hêd3Ô¬˜I6O9¨Ubšâ7à Â@ÃíŒ3¦¾þè´3ˆ«ìÿvú?%í ÿhgðãÑÎk3çg§Á/C;ߊvÏÒÎk³ä—£‡hîwÏÐMŒ®ç¿ÂNÈ›‘Á/òM™…Ì7ó’hX¨/ ç93E/€8Ì5^Â4Ã_™æ3LóÚÇæÎ4Ÿÿâ8'É5ÒYV›éL#ß…|H½^È\·e’7¥:û”Á¡HßåRçGÀ/9 ¾qÉ:çŽ;Yi$ 0RÄw$Gü@l‡:ï¨Æk¬ñÙC3ÌP8#/æÂPg-êÔÒ;‡Á‰èi¬­ 4X–ÈfjEUݘï%˜i*ŸT›ºÊx™<˜.$ÒŠf&ÉÏ¢²%žEeci`¬±KÙ}{{öŒgJ¡QçÛ7}Ni¨†#Œ'O4Rü¶›<øäÖAVóÊÙ93:Ä<êá¥wæ D?O̳êÃŒ^ˆ'íåç|Ë—(&}ß¾@’Eï׋½ ¼ endstream endobj 1269 0 obj << /Type /Page /Parent 1721 0 R /Resources 1271 0 R /Contents 1272 0 R /Annots [ 1270 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1270 0 obj << /Dest [ 1264 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 358 598 394 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1271 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1272 0 obj << /Length 2464 /Filter /FlateDecode >> stream H‰ìWÛrÛF}çWLùa3¨aÜ‚^—¶Yñz+‰]_v­}Áˆ5pq-ÈþCþ1{º{@PmW^S)©Ì`¦§o§OÏ÷ËÉóå2P¾Zæ?Pþðˆ’À"/VóÅÌ/TËíäùU›¨¬å5žj³jòüͯîÚ‰çzž5Ùd:¼î'ú}zg”ÅÊYþg²àM 5÷ÜE ÁaâÆžÈå=o§·YL»?è_ÌNÏ™ú¡k/Q«uóPuÌÚ8¤Û¢U¯Þ\¨ýæLg7ø6sgºp›¦d!¡N«µ3]hõ?þuþ½üÇ„-fkÏ1X¾Æk°ßï]'t}ÝÒ©†Ž…héâÕsÙ© Kº^N|U¨I0‹Ý0öU8w“DÅ><©`c”¨ÆLòÉ÷˃3BK¼ÇÞ½ë‘G4{1ŠlŒ"׋° rÃ0™+NÏfî<8ò*æ¬W±Šmò}èæ&No¨—Uݘ]™f<4EÕ–5¿îaqvùBUæÞ4ªß­ÓÎ(YU¦ê¬ëÜ( 5……ž?'ÇÉ¡‹Ã¡s9´1Yݬ[µîD7Eu§ ž,k>H¤ÁÆä4†y 7HŽ ó‡#|9᪮º´¨ÌZÕ ŽÎ\ÄÚôŽÝù_J8– »_6%ÙÖ‘×¾4—§jMY¬…b[“ƒ­‰Õ$­T&Úˆ"³o(âÏFàÌDƪ®K9÷iÙ;ˆ²ýËÊ„eüøÈ¦WˆHw]S¬úδ4ô5©äS迪Å ©WÕ•Òï+>ð9ôk“§}Ù‰ÕÉWŽÀstç|ĉ=G¹ïÇ ‰lÝ5äôÛ\u›¢uÈ@Uﺢ®TÁZÄÚÎÊ&8wH•\|ÍaGÄ/ ÆP‰É~úññކ`°/Ê’á,( öÃãuÕr¹~ï ,,ô(~uu„ØnQ{TWEg´” F›±‰4Ékëž!ChQ€‹Ã9•Ñ¡vÕ–+üçuc7´0#íT6ÔÍòCuü]—ÃЛ£4_çEfǤë{ÌoêåºÝ¥(HÕÀ»Î//h:»+dH˜éŠÜáÛ µ˜b‘$í¦æ={g(ÓgØö¤ŠØBˆö#m»z ó*ÝAòsùÀ{N ÙÙ³˜Ýkƈ»ûm*bü1©Ø[Œ.]œ£bº™öÇÅG=·×¨¦§¢L·†UÛ†ð*K‹èö€z,2ÏñöÆNÉûé…mÉuPä·\8í…ê%iò´ÄKÝgÓŠnS—˜o…z@5Pˆ“z¦›iS÷¨¿Äƒbͳ~>êd­GµÛ‚ÆTJ— \9")_p$yŸ/@q ¥XA©}æuYÊM&Ò/z“tàs™ëP5q]lûìüƒœ€›#Ÿ¡ÌG;jîZX‰^æé>A·Sº–q5=Ggøk,T!`å30Lŵ,¦ž tùìÖ¹PÈZ{‡qFÀÔîW¹\[©Ü Ž(=ãàÚj+äù®)îQÙŸ isƒdTÒ‚>hÿÄT¾†žWoÞ¢Ë*}ù (õѱ†§¯Ã‘ãÑõs ýjéø4¼~óî—þ¥€¹ÉðéÝÏý!ÝåtMÃ*EîÀ¯•úoošÂ Ç~‘W>Ø6íbìêéÖ@#2G1ëÔ®áÓäD ´_SîIBUL4§ý ÞŠY£å¤P€ÀC‡\ÛÏ}J‡È=çþ£^Ÿ…IþÍ9ÿfzÈjh–Z§Z'¨á¹2Ôñ;u/Õµ>Tº ,Ì Cifƒ-Ü_çið’¯ùl´ú{ŽÒ[4Ö¸)®kcwQâç=ôlÖ?õ6íP80G¨b×Ë„…8±àOµ3] ¿P¦LWuC= n¯ jÍð¬7šZd:‚Ìì:)–t©öô êÖ©!{åßYùg#õ´í“˜À?@IÅ]ªè£ž Xµî§,‚ ¹—%ìÇ4cåYoî{îQ­ «ÛfQÚ¼êŽþšÉ)CoS‰ˆK9Sê9½ž´ÝЉ¦4ërè@©âWQb÷¤ý=\œ²CÄW¨f€Š ¬øq;–_ò=õÓ˜é¼å‚N%îŽÃ`ÓýlÆüòm~Ñ…"*ÍWä“J©ƒÁXmŠ» Üd›Š0@å1-å…•ä| ;\~¸yRæSÝ «¥µ¤ÀÆ’ª>— ¸ÎØÙ\/'ÿøZÍQ endstream endobj 1273 0 obj << /Type /Page /Parent 1721 0 R /Resources 1275 0 R /Contents 1276 0 R /Annots [ 1274 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1274 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 163 102 177 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1275 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1276 0 obj << /Length 1925 /Filter /FlateDecode >> stream H‰äWÛŽãÆ}×WÔcqye °×†‘`×00ÊKvóÐCµFôRl‚¤F+Hþ!ÿ臜ªnJsóì±Æ`(²/Õu9U§ú›ÕìÍj•PL«Í,N(Â~²2 ³,*h±ÌâŒRZífoÞ%Uƒ¬‰h¨ÚÙ›ï¯cºfQE1ÖT³ùôz˜©õ­¡8[P°úi¶”MKZDᲀഠ‹ÈÉ•=‰lç·¼àÝÔ¿ŒÎ“(˜ÇiX¨¨¤›#]Ûq‹‘D™’ÔPôõ÷ô÷_‚yŽïsy˜«:ˆTµ½ ëC=þlúF„¤J·ë`¾TôOyÿXýu&‹5IøX}‹1Ñàp8„AÆjàS  Ñ82Äk&ªòC[‘ôÝjSM³$/´ˆ)]„eIE OlÌJêÍl3ûfurFcIôÐgïFì%ÞCŒ2£,Œ2,ÈÂ4-ä>'§.ò<\$÷¼Š1ïU¬›âº…q”p]ꦱ‡ÄJ†z3öµ®¾"Ý øó„™\UMmÚ‘FŒfʃi×2”ª­ñ ³4Mh»£xÁîtª,Oª,œ*ƒÞòg»#ÆC]y)°¸|ŒÊ“™Ñ2LÊ{fÆ“èØI~kÛQ×­YSÝ~%±Z¨“Xö"\LÑæÅ½—}#öfgGã^÷¹"ëÞérfå§îüïN é£òÓãX··îÊ|a—öGÒÚl‚ nÖÁ<ÎöÍèE¸aÄ‚uQÄKt"܇{"?Ûó’1ì ¶s|ì€W½ ÞVì~$ в¨‡õ¤»(XSGÊö"ì™Á:ò²q«GZ[3PkG:SÕ›#ihRœ²•H}ÒU.óÔnö†68aÜ"Á;ÝuµotO¶kÛ~ ¦¬ð™K4Oö8+ÊàJ ÝRå áP‘ ù¹“qcmc ‡U L(D{V&=)ãðåëÊ×\«25"Ónö£ø3V¬RÌ!zQ%NT…Ö¶æ>ˆ%3>¨oÍFDÎêò…#\-Nä »ÙÈì¹W–Aè |P« @uŒïD ÈSÓ¶¾Ý6GMµmëJ7@q\0ˆî’3!][ÔT€ÍœçÚQ$Œ=¡T`ɽúù9 vÉ`W\™@Õ{™~‡'’åSü/©•©[€ó°5-ð¶id!£ÀU?  2Ÿ;æML¡s7?·móHûpÏÚ]<,_àZhÄ ÀÁöŸ˜@«;ŸeÁ§ISb¾?’ep|ÏäômF…[ṀûtìG\?õ¥™¹@A¨šýÒP/Ì® l¤Ö%Jc©®Ö}È•¤}¬ÜaSËœº7~‡Z<éÓx¯Ú¸»ŠXýBçŒz÷^wWÔmõ`BZYÎø~7ÉB3Ñ®u¿¾p9i;øeÕQ÷~ée«¸ãXÿg\–&€ýƒ»gvÊÜä—¥r×£KèU™FœdÑ2©å.¾ µ3²Hèë ƒ¿hÖ;f\™ÂnÙ°ã ¨±0AÆÛ_c²û¬ªjäÌ2–8íËt•,“ßöÒ™Üó@~æ©ÜñÔ+®Ž ùªKÈ|BÛCÜýe3¡]p^‹ JÆžÌ(]7è`ïž98er$„‹ vœG~*S3„ ®¡’äò ÚùE= "Nõ_ S{¢þ“!-L*Dü“Ÿcù˜@KA­(Ò{ÝB(Qp'ßu‚…zÿî^¡M\«@7Ú'ÏÏìÏš{È–hñ‡—Â7<ܲ_¤Bûþr6¾¥éÃýÈŽñIÅO™ö°“…ö¶_ã~oé;[{†m½á¾ùvœ)ËÍíAfOE Ý9zª;t—è=@ÏD5–¨¢/‘û×snMÎnõðhY#z ®YøBñ)hgÉŸ~Ä5Ñ0UPhßuV.v° ¿­²ßÂ@>˜¯G ƒfàòÛ÷fèl»æ+ÄfßVNÙöžrÝ % âß­fÿG^€¬ endstream endobj 1277 0 obj << /Type /Page /Parent 1721 0 R /Resources 1281 0 R /Contents 1282 0 R /Annots [ 1278 0 R 1279 0 R 1280 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1278 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 196 611 226 625 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1279 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 495 427 525 441 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1280 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 196 231 226 245 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1281 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1282 0 obj << /Length 2026 /Filter /FlateDecode >> stream H‰ìWÍŽÛF¾ë) 95Í‘ ™;v”Kâ=p¨Öˆk‰THjäÙÙwØwÜÃ~UÕ¤43šMä Ev³»º~¿¯ú›åìÕrQHËõ,Œ(À?<’<ò“$ÈhQ¤~–1-w³W×}NU/kê«föê»›îúYàAˆ5Õl>¾gæÇòÎR˜ää-ÿ1+dSA‹À/2Žs? T®ì‰d;¿¥ïþÅü;Âì< ¼yû™ rº} ›‡fØ`&2Öƒ$Ó×=}ýÝýüožbÜá[ꧦöSm®èæXÿ´ÝV„ĦlVÞ¼0ô/ùõþ¾ü~&‹5Qàg,¿Åœhp<}/öCÓó©–…héã5ð#S¹©Hz³œ…TÓ,J3?ÎBŠ~žS“áˆÎÎÖ³o–“3âK‚ÇÞ8y7`ñb”¸%~`AâÇq¾ ŽN]¤©¿ˆÎ¼ŠoΫA¤6…!tóÃÄË¡7½^·]e2ª¯¾¤r{ô°$7¥¡yè©·ÍŠ†zg©ö ®iô vî°/4åP· ‰ˆ²w>õ“8ŽhÓƒp!eBQFõضU¹jl‹ DË6X™?ÍÄÉ´ ð£üÌ´p´,T×m3”ucWT7_J|fë<óc„}ñȤÎëÎã´±»v°úzØÚ¯žª50 ŠAˆº8Ÿ\œ;Mʆ*ÕFIC‘0=•Nª2nÛvk!ç¾Ü8 È÷—•‰'eÂì̦¯¹$3 ]}{lÏÃаJÈßP)XHò5mc%ŸX~–šÁœ[ÏRî횆 ê´ÝK¦Ô¢@dz/aÏôv@Äù£~Q"Rª #‘@®\î5œpnÕà±, É9ÐÐâ‹­¼‡önQ7<NÅ(1\ÿ8òè>qVïmU¯k¤‹C“m“ós+ ãOËkŸ~à3†M9¨Qø¼9gñÆãH[ZÙuyØT•½%(͘U½÷ĨwúÁ!"lÚè×w˜ô 8sÄRØu¦™ø÷³²÷ueûÇþì©i±™fkW0©ìÅ!+ë!l†·À9ûÖ“\솞Žß;ªêû} Ôd|øi©YrMPb}º±¨Ð·—ýtý@A¿j»Îöû¶YÕÍ­M¥J6ĨãgþÁ³tùQ 6âY6%WòÏRz=t¶Êè"‚b±a Y€Cv<ÌŒU +‘X¯ x¨²õ½]©¤—pìB^ \^Ù@!¶¦álñŹà#sÖYå½vi”2/|»¿0ØÉÆâ”…; ZaÖW»”)ü›™sìcòt³úâEx( R‰Ñf#S”™ƒÇ©{އrŠþÒ%;¼ŽMiÒµ:×î-ÇsÆcœ:7xhþ ƒ§jÉ¥‚òáf@'.!Á…°Ö͸ãprjö÷ü&SÓ7†+àTdH{ÌÃÀ+Baš{) Ç­¡âXóg,l?º=ãÞÇ Žã4ðŒŸ×ôÁ`þ‹Ÿ¿ ýp·éý­¾?}ð°Î'ݶ•ëñ÷.®‰ÈdV«À¥?:^WüOs`ò{(,Îs€ÉyK>]tF0w–"²…ÐsècÃd…0fd,GV²^Ê›9HFè„ê £ãæ%Óì›Ð<”;÷ïèqF†~‘žâ$òãè3=}¦§ÿzRÎÇWGO¶Ûwv†Ùãð Lb®Á>÷`` ÚdeY3®ÕÇq(䥯@¬H¹&u®IÌz]ƒ\˜Yxˆjj·SÐjŒ¼‚ö[gàÁ‰ätK ]7úCû±.u쪅€:²•áj•Ž_ õk|â,‚ Ž^ ¦—" pM)â'üRŒ+Wê¬p,F3m´‡A‰öb?ç\"ÿU§ONä³XÕ̶éø6“N`Û‚mˆù:CS …7¬´Þ®ëÖ-#_<º1yóB¾‚¸ÍxÓ9Ýaæ—Ü®—é>Üü®:aŽ!9ç‰S—ð„(0Àë¦ed³ a€œoºœm«£Ð4w¸êÀ5Hæaîu»•/+ +¾m›;•¸d÷ ;ýw”0Ký ÿLyxžGo]û”pÐAaܬ>¤Ä’ úõy,190ÖkÆÈN#ÛAp‰šCû) G‹ˆªMÙ•v¸…õþíû7óoßþ ©Ùîm7Ô£²{ÞUžUùÜç!™W’_CK» ~¿µªƒ@g=ØžáýöAd:¶ÊfUv«+ºeÄê> endobj 1284 0 obj << /Dest [ 817 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 638 102 652 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1285 0 obj << /Dest [ 974 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 598 378 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1286 0 obj << /Dest [ 1159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 301 501 342 515 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1287 0 obj << /Dest [ 1159 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 301 337 342 351 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1288 0 obj << /Dest [ 1046 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 473 71 514 85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1289 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1290 0 obj << /Length 2169 /Filter /FlateDecode >> stream H‰ÜWÛnÜÈE^ç+~j"Í;9‚ À+[-l#ˆÆ/YåCöh˜å/3V>$ÿÌCNU7ÉñhïFÖlhº›ÝÕu9uªú‡Õâõjå O¬6 Ï.þá'L}' ÝX$ËȉS7«ÝâõM—мã=®èòzñúÇ{O²é %B(û¾-×C¯:šz’T¾¢’›0äê¦V »Ë鞨`ÜjF¤ÇÝFô[dgóÔ—M-JVÀ—’g:Õ#b"³ìY‹ÄàM$GA¸…ùÔí1 KkIÁêrzkyIòø^µݰk %^éCæì`Ù öIÞ+’&d§ÔH³‰“ìqHÆà²À ,çPV•X#6àÛwRR½.T få‘ç…\FKü ¹@‰§VíËfè,þ Åe¬õMU £Ú]Ö›oUù ¬½±b™U›µÂs\GÀ•%Ü5 ˜U&•g,¹KuÓ“—/Ä«1Û‘è¯ÈyìF2C+/ÜK×e•-°ëŸ}µúÜ R÷AÒò>”Û2ߊ¡ÀÏÒ A&37eÛé½tõ9ÇzÞŒx“¿Ì§/ ɬ(­*Û"Î'a +±ÜS$Éé4©-.[UÏæQÂxy[`ªvXª=>è1.ÚX„‚†E´c,ÅÛ|÷ñ­x²l&8þÐ<)=è-;ÁöRi)–Ew8/BñRá#@ ëFZœˆ°¶Uä»1:ÕÇ(L˜ÔL¸v¶¬(Š}Y?T¦”Òjì5Ž)·‚ë¥Û'føM…$ #DZ0’ðÔ(SR–¨Èç«f蟆>ßò4k¡3‡êÆÆò’ó½P›l¨zÑðžAG”N‰éX–Ó1$yË?|ì«¥!òNz‰©èü.E"ø–EB‹°eä[ö“jE§#Ä'H‡:Û)À!ß6”â)Ê9å’ù¬÷ŽG0…~ÄÌ/wÿƒ œ­0Gwn%LXWsyÉáWÐÙXUÀk-A•Dô È ÌZªíƒÆ‰Ä!¹ˆØ¦åó”eœ…©†h¨!jxúBPØd7€Ï±7ÇË3ñB]ˆÉõPl“‚YˆFh©¢Zn"ÂçEÇÒÀÀEŸôaæÚ fHä zNÞËHТôVª¤ ‡R‹­-ÚMsþ÷½×¤Wµ>­ø÷«´ùoÊ÷;â̓šP×f.!Úâ<:ÎÑ™ëÇx­‡ÇGîàI±šgÔTùá½È«M¡(wO€ –ßašQ\©²d½Ø•ÝZm³½ ¼O«[;ÐW?"ëÁ4ã½Í¡iá ªÏªóazY‰¨©o>ÞßY7;ÊÊ"@Á™àýkh4HÑÝÆÇýxp bM£x夔«²fÍxJ,z}‰,^ʉ@ùÀ×MEPçÙÓ´fpÍóœæDЧ¿‚Gƒ(¤×È÷£ߴÙþ]yô{éÔ¿eFš2£#ÊÁ™ Aý.÷+Œåóà˧φ™‡Ú²ÝW$w -t=±”/u«îÑS%І»L¢Œ2/ûêYè/O,@奖÷Œ IØATÊ ‘ˆ&=uñq(ÍIÅ+f†çþ‚ä3£ÀÄÞ²pfföO™™nç]öYÚñg»M¥ù;¤L"L-5ÎÉQѤMAÚR7´K¦lú½µèÅdó_P¶&lfjÇLM#fj=Xëè+p~bcZÊõµG·±²bŸQHà§‘šµ.ÌÏg ÀË'I‡‡BŸ åº^rÚþŽiê µ»ô¢°©ï²:ç¹;üñ´_¥f/þÿ'5Ÿ!ƒuÓT röY5<ý±ÉøžÙ•Æ3ècÓ¥r“´åŒã÷#uLš‚õLŒL¬¿Q⑈w*nÅ”¶ÇôÜ2o›Õ[·VsR•Ues¿Tr«…L§žíÅ=êY̤HoÌ­g7Ú-û4…íÙÆ¡=ª!y”4¿4¼5þã“~2{çüÚ¼5IŒ\1栧³{ôßrößR_{·s¶jsM¦ÂXsf¬{3k¾ª~,)~Ì2U…\Ö{y¥(7Õ¿1õÏOÊH|f#‘d,‰ÞESÌþÅÙfR{ir)–›£±¿±H·ö¦êðpàáHͧA„ÓÖâÃð‡wöÛ»?SsÛäRïã/±Jù8´ÙºRB/N­ˆç?X†Dß­ÿ¼…ê¹ endstream endobj 1291 0 obj << /Type /Page /Parent 1721 0 R /Resources 1295 0 R /Contents 1296 0 R /Annots [ 1292 0 R 1293 0 R 1294 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1292 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 497 435 518 449 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1293 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 434 217 464 231 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1294 0 obj << /Dest [ 956 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 257 190 284 204 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1295 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1296 0 obj << /Length 1978 /Filter /FlateDecode >> stream H‰ÌWÛŽãÆE^õ•·&0âò&Š XÛcƒÄ6[„‘Ïúƒ›œ¹ÉØÓä­œ2F™ˆG³cêø‘Cÿ°¢›F·F·vÓÕú-™!˜!br?À"UöŠ€ §¤úë_H·¦Õđڙ¦¡{÷¼ézM¶kt_¶TéÞ–¦%»æj«½ÙnEm×N}F¦qÈ5佋OÞÅλªkW]¿a‹÷z]>šnìCz?lueʦ ÈÙ.†™º"TÀšÝ?ê~ ÝÚTAŽrZSÝaKKkÔD£©j8VL ¯±\»åT¶ÕºÃªëϽKÞÅ'ìb]Ì”®l³¿†l ¯gH2*UÌùj©®9(ƒi‚Ÿû3OduŒåµ†A‡Šºs¼ ¼ÚlK~òfº6tUTû"ˆ3—ë,LÓbNîõP óLlžU8ÊåÈ¿ì¨v-Šƒº[kº–Œ +?ê~„E±²H•?‘áXI€ýK¢å}×[ù^èQZ«7[‘ ggï쀋}ךŸ5ä@b-ä&m.HÀÊ @.JIr %q¡œ%"¤%‚‚ÒÁŽ*˜@•ccÕXS…á{Ïgöˆv‚—Û^? i}õCpº üÚŠ7Än«YãX{æÊü’šDùÉÁü u›m£­nöt§ z¤ŸJŒ ü\i2+àêŽÿØv»–‚(bFÊŽ&!u@õ~|WiíØÔT®VÌØTÆ)³1Èȕս±û»àשÉ,]„IÆE²9éõ3éör’B3 ‘“ŸF=ØM)ïOŸªÖàE¢!-›òÉÉ‹5ÀSžTÏ—µÈ0KÓ„ÑÌ¢xþœ¸B½mßUzLûðŒr/…([$|0ÿ^„(ù „ˆ‘­Ç¾òÞ)tаSwWjI Ž#Ÿ!ú,z—ôò·¬ä¢`Éî•pX¨ªôìpö÷R+bÁQ ×¨õªK\O #b6ãæyÄì3dSb—:¼SƒFk‹.³ø¥Ìð&µF’šµn´Ô˜±Œæa;±|Bi˜Ò*˜ÎU'=Àøžó8RAûq[ …þ2tР¡@—›ª—-Z'€D5³Ù²ÒÊYQ˜ÒÉ^ð—š=†£«$qH?¦ú±Ùÿ:ÑHsèTrÞ‚dÇO>ÑŒLèÍY†ª7[ûömdĽqÌZæ<éjäsšȰJ&k *Wn·9^ïOÒ Ý~~&p¿YÝcO·ÇÒ¸¹©¦¼8Sh?ñ¦¯?üxùŠRç äà»ï]åKÜ9ƒ1u-JãÿÐ.]>:|–ï°\oeoJn™k-=}Õ”Nφ?‚=¿DMG?n[·»ªŸ¤ÈÔµïl^ñT·Ò&)/4c¿X6}5ü/µó•öÒ—ÏWN]¼Å«ñž® s‰·íDü\éNž‹MæËt‹{ƒ®¹\ ¹ÌØ1-ËvkV)Tx+ÒÞ u˜ê"‡Žâ‹ÓmNƒ³3 ¤Ö·uSé§ü¥ïpn”˜õÐ^l%ã“ñwø±lF¹ÏÂC,FuÂÛ\®ph®P§þ›i}ÓÏœú0cÝ7÷×­8UΕo@± ‚•C™Õ§CN9y…Û¶“I Õ|]ŒÛð=l iÈýV['èR1¸ð;WÜæÊ¸[tñâ{áAÓiº±—f=}{éÍUYÅ©t¯ ñèžäüšÉÉ LnßßÞ~€û3õí7{÷=ݦ±SØ[m%Ì–EWÞ*á<Äq’;ÕçYJOYòÊö *äšï¸¿€ÓmgÙÙnçðã>¹Ö,$Rišå>âppcŒQêó™K6oÜ>–‚2äçá|"Æ)g8Ëgë¹t}‡ž(±åí²ªÄ4ÿ÷_kÚŒüj¡î0‡IÏSòñ·ëC‘±÷7bè`Ñm[Tk,¿Ÿ{{çö”Ö&NŽ ¾_Nþ3†Ê#J endstream endobj 1297 0 obj << /Type /Page /Parent 1722 0 R /Resources 1303 0 R /Contents 1304 0 R /Annots [ 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1298 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 689 289 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1299 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 689 345 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1300 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 368 689 382 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1301 0 obj << /Dest [ 1340 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 381 539 412 553 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1302 0 obj << /Dest [ 1393 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 293 191 320 205 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1303 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1304 0 obj << /Length 3103 /Filter /FlateDecode >> stream H‰´WíŽÛÖEÿê)npYH\~‹2\±;.R$Å (и(®HJb–"‘ZYy¾Cß±?zfæ’ÒjWYÿHaxEò~Í=3sæÌÛùèv>”¯æË‘(ÿð¥E^¢¦³ØMR/TóÍèö]›ª¬å9žj³ztûáÎW«v乞çcN6šô‡‘þѬ åǾræ?f¼h¦¦ž;K°q˜º‰'ûòš€—ÓSœÐêŸô|ž3ñC7Ñ^ªGuw¬»5¾ºp°“nËV}ýa¬þñ_gã}‡±Øuéx:[ÕÝ¡ì~-vojSçÎd¦Õ¿ù¯óÏù_F|c¾M๠^æßà8\'t}ÝÒ©‹­q¤‹GÏ tf?­y§oç#_•jĉ&¾ §nšªÄ’ wŒRµ+FËÑÛùFècŠ÷º!¢=ø(²>Š\/7ñSç4 Ýip¨7êùr˜êL‘zÝÀ)ñÜ©~p‚p˜z§ºã¶øóMë`b ©nno†é|‘ñïÍ›±z9AŒ…UÉ{u'Ëê›V–aÅÍ›WršEy<JðŠ}ñ`_(öÝýíûÛ¾yûN-L[àÀHÃY³º³öÎÄ^_;ÕìæÄú]UÊdXò®©ùqéL" ‚•ôÒËpó7HÏpó{³,jس3e]䪬_±ß§zØÖ&NâNûÈ¡P–-dùëÖIÜTíOý+kê¥á.åêÍ¥}Þ PÁ¨t*µ&™Zeb–X¿`‘r3’=:³"“|­òBÌ~vb²+Ò ¾µÊÖfÛ2`Á¾Oö¹(”©ä±q|BÇ÷Ç ™¦üDÉ÷­ãÓ@‘•tóÀîž™Š¢&Ò¿• Ê&ršÊàݺ“]>9N0Ôs˜…f8ù䂯‰"Ýu»r±ïp[¼úšó²/ Ÿ‹-r6KJØèê`4;n0ò×Wr;Daÿ®òõRÍ“&»?zÌñ²f³5]¹(û¥ÝÑIa)'œ‹Ô"0Sv—¾ùäˆýã ×þðNøðU‚Ó­¹ÕÜ!ú\³eË/ªÿ=¬Ùùp ðo!ßK¶ËÎÁ@Æy1«`oÊR~SÐ`«c ‚,¤›R ö;Çç­sÕ5êÐÈ’{ð‘u¯â¦‘#:xJÈÊNGU|¶ve½R`lxÆ6‰ 'ç\“›Î͸êcZþe_îŠV-ËÝFQFéûº9TEŽOh³hö0Vdž\“è=èÒìVE§ú­T{l»bÑl0> œÙtrÁe¹üIWæHdž¼QŒrÄ‘|õÊaÒ#ìðDS^齃¤Íxý§ðòõ¾ªŽî³(ø§å¼QÛbJ>]r*' É qÿ¶Ä´´‘²*Yehhª7Ûª¿Ò|ö,ÍE<7H†ÃAÝO^`.˜…¾ÐF[™Ûäû €–²/9¼?‘ê9’—¶Ú:“ôtjvoVà|HFÙk›É%ìÁÀ¦ùVwb7™ÌÖ"P]òr¹,v}kU³¤¼Úºg™õEI7åzþígCH½’ºþÞ·…Éiv Qé(vRù¼žuP^ßôb# ]/õUœ¤.øŽÆ™Ìxq4N†Ñ(ˆ òÎÇc/…1W—¿0<œ=¥meYžD—«Ÿ‡B:jß#5…JGÁ pÎ'Afcê£Ö̉¾‹Ê­à×–È ¤AmÙD³Buò¯ß«¢^!PYŽÙ¶¶·­U°ŽZÉ`]€’PÑúÐ>_XI¸rHµ úLQ=©Æ) è¾k6à9ȯJ4—og5©vöcqP[hë)‰ ®2¸ €¹å´Lbo*ìÂö¥@a•®bિ¯EÕ„ÄÔë’÷;þÁ¼‡¢.Ù1—…ëLÇ1)÷5UŠe‹­ ð¶Ø ¤äŠê. ¬s³ËUËLk§ŽUÙ©@©t YÒ­ª›N-+è*GEÝìWkª"_ˆ²É!‹i>ˆ £¾)•ºélΜ઻†¡¥o$›B]g CÇ_…N:†ÿÕš4N‚½@úá3Àrˆl˜©õÿ]³kLÍ@oÔº9ˆB"÷]‚,CåæÛ($¿1‚±¶¦ÚÛQHŠq5Ÿ“KGôHoé+›]ïmrñÁÁô¢bþAÊ¡Í{pˆá#ô©)„p]ž]Uö¦!Ë$˜Ð9áÙ½HKïåWD§%ÒŠ•6 å@¥mÝEKHv+í¢ !­²ßK3€¤Êö§ƒ›Mù«¡øzŒÂ¤¯ø¿Þ©Ãól‡7_–fàœæ¡DŸ§Œª÷”„¾Þ,бSÏ|~¿mèB¨x'½œjÃú‹¢¨rè :9D d׺©rz-$"tuQ¸—-Vÿ¦éh§ŒúŠÕȃš‰D¯j¨²ªj†¨á>ªÀ ›}Õ•ÛãI€½‚ ñû4PSäE“Qk[÷¢ŸbF±æ¿äñme2´bröRÚaùÂöj6è™@‚Žr&R=‰Eê¯8ÞŠÏE†Æ4wÿ¿1⟀ö-ÐpÄ9ŒÎŠ­€ £#ùÄï㾜áÆ&W ÉÕÏ~t%Ÿ®´…Ò*ò±bZ”Î’¼e#’ëL%“9ÞsírùÙÊ"4t›K>õHåú±¿_nnÏȸm•Û•ntŸFz³º+ÓÈ8:+Mõx!…¹t¥`õ¯Ð†~pˆ1~¸æÏä÷ÉùÙ)qfrÑ÷H†…ÉîTþÐmQeU¢tàþÇ1_ƺ€n ¬é¤I|Ž´f'ЈÚK§+oû o&çkUß>9Ô—ÙÊUß5‡'-Ø•T,8Ç–HÎú¢j!ôÔüŒx’|s½C™DBžeϪW _ÎZÜ~Î{ªïí§ óRft¥¤.Ô1»LtÕœû´§b/+›ÿézIµ)Wë´SûÚ<ì0+®IÐZûn¿+N‚Qhmé„}%º¢]eçÓj.®OkÃ3ônÙù±¼Gn!v¸<ØÌŸó4Ëøÿk»Úu‚`Ÿ¯ Ä’c çeËQº´©ÒÅ $BBœqî„øûÌî,o:Öë½}ÌÌöÄÑ?dY!v©çciiU;t͵·•ähAôœL®*…„Ë"‹„ŸgÜa´!d ²hÓ¯¸WÅ3 ܫ೪Y™t"XK_¾6Ô»…ÏK'<×€çÛVÝäÀÉýŽB+ª;ž7'\ÂéÇAWg*–¿Ç›Åü%k Û((å‡f:}¹0­CŒß¶h”Ò ºÝb:VghŽ¡7ØÎç¬É¸v¬Ü“^Ð-vÐÒ`zåÐÒÁÔ]ŠÉ9[…°•É«ƒó¢U< ZºPeÜnY' ó€uÛYZÙºªÚ0ü‰EÊ ¢eQg¤è`íõ–߯7U#äÍ÷€˜ó<Â5$ÝÏšn®ŠÀm‹L H¥21ÔÙ[Q1°ÊO RA†!@(+…£ #ÉÊ- ÂO-ô_ Éß?ïþ†¤¬Š endstream endobj 1305 0 obj << /Type /Page /Parent 1722 0 R /Resources 1321 0 R /Contents 1322 0 R /Annots [ 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1306 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 146 708 174 722 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1307 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 146 694 174 708 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1308 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 307 694 334 708 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1309 0 obj << /Dest [ 1371 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 195 646 222 660 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1310 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 207 632 235 646 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1311 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 368 632 395 646 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1312 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 125 597 153 611 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1313 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 286 597 313 611 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1314 0 obj << /Dest [ 615 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 442 562 472 576 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1315 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 167 508 197 522 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1316 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 399 433 421 447 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1317 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 431 406 481 420 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1318 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 195 191 230 205 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1319 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 195 142 230 156 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1320 0 obj << /Dest [ 1495 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 150 80 191 94 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1321 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1322 0 obj << /Length 3671 /Filter /FlateDecode >> stream H‰ÌWÙŽÜÆ}ﯨ ¸LSÜàe`È–-YÓ1àhƒÃfÏ0b“í&[ãQßÈ?äósï-.½h¬yè!‹µÜºË9ç>[Ì/žrÕb5s=åàÿ‚ijƒÀ‰Tœ†v”8¾Z¬gŸ·‰Ê[žã¨6¯g¿½tÕM;slÇq1'ŸÍûÇ»™~“ÝÊ =e-þ6KyQªbÇN#lì'väȾ¼ÆãåôF´úþ—‡Ñ¹çXs×·#í$êú^]Þ×Ý-F<]XØI·e«ž~{®þúokâ}‹o¡êÒrt~{®.ïÊîS±­x_gõÒš§Zý“­÷‹ïf|c¾çØ^/0ÆÜÝÝÙ–o»º¥S :[ãHŽíéÜ ÝòN‹™«J5óÂÈö#Wù±$*ráI…;‰Ú³ÕìÙbp†ïbгïÑ»yD³÷£ÀÄ(°Û÷“XÉkïÔ8 íØ›xcÆ«˜Åw‚½®íZ œ¡ÞTY^Ü6ղض C¡^5üe«²ªR—?½Rm—u­-ìé¢îZqlJóf0Ä mwjˆ²!bãüæ’ýF&;HMÈädÈ(z¤•[ ÷Fèçžëyk-Š8Æ ¡RùN>î-¨»á@ל˜Ø±+'Ê9ñÄÌ][ È-ŠûKQÑh© –zÆÏ¶ZX1RçÖ¢“‹£ƒ=Û‹:ølN‘bìºcѹ²¸$/$Z5×]VÖÅR¡nÙ'ßìä{#`×Dú…Õt/ß~«ž(yê`x¤ýuÑûJ+IÕ äAŠÇ ÅbÁ•¦] ú‘mÑ•¥Pw›­Úɇ²¾aƒ./üþ²!Ñ—o¿·PW¾øåJc•ÌÎÉÜDoËM§V»:ïʦVe­¾©š›²Æ_w4ï‰Ø»øóçòHL ÙD$¢ÃI³mŽrñšó/;)0krI&™^ŠûèÈ鞸v|eÙêǦ“}p߬ãK%‚oÓDH†D0ypo`L€p’ᘡÜMÝf­Á(•©u‘ÁC7+¶uW™0¢8“Ãè û¤ã>©ìó1«v…jêê^!*:£MbÝ¡&ÈÛØœN‰ôÎrñ›ç…¼Ê¯ÌÅìLû0æ\è0 N‡‹ï#Äòÿ!„挙ËâcÉ€D)NDšüOA":8›%˜pOÀÄôhŠs]o© Ú#Ñû`qc¥ºèøØ‹‡|-Ë~cò­žô¸Ù©?â‚ëÔc \bÍ}†—àUc & œ µEEµ´Rò˜*ÌÕŒ#pмT/^\È‚ŸÉ¸T¿|n!µmF¿—²5“‘AA–ü$œÌ"Ø/ÑwÆuèÄ!'‘ˆŽ â#t 'è’ø² ¨ô8ù¯Ëþˆ¬" Õ ½_¾yKrÊׯÕGhòáÀ×0›mѲ8…eÐX®;¦ïNóµáT_ƒ”¤´5}®înK‹RÔ`ï­Ê³š]s](SÜò¥£P‘Ãö@qaü‡·VoŸ4¼ž‰>^’9t ’åêáØ`Âcå]òDJZ-ôøåë×?ð6O_2´þÈiL2Tﳟ9 Öúš2ú5FSÔ$zÍ<Êú/ʧiµT^¡þx¥y%ë>ߎÄ#ñ'­B¤Â8µÃȨÙ2Á'[b²Q,ºð¢.à¹WÖ>éá6ÓÉÊ1dW„£ßàº~Kfº’¼ð‡w¤'iÌ£œ2‘D $õ$ I$/Æútʃ¼)?ô¥Ôƒ^ÑrýäMÝ¿wØ‘ŒC&–æáZþU¯Åa©¢Aˆ'7›,)U=æM­‹¾Yè­‹lgjœ?U™dIÌ:pÿD%<¤0í<÷=2窃TO/xJIOu×lM=¨ªüP°Å×»²êæ¨Ö‡//./%Á_ÿøóÓ·”äçj(•$a£:I3BËrQQ™†÷¡±a|rmØED3 -ð¨ýÈõ´©Ì·¾-Rm¹Þ@àER:4H[b%\‚> Úœ-_‚®ôÑlÉ÷9àT›U¡Ì»LRÿ2£ùT/Wê¾Ù©ºaw ΆN„¯K£™Ö˜v½iNŠÍ‰ø®ž&K[ÎDíR‰Ð¬ ¨ê¦ž?½|þòå<¿Í¶YåJ*rÛž‰?ñégHžóœüÔ¬z´½\¢aøá—oo›]µTÀ.¶,t¥&}Ø+Ô?aüÏ^½$.sõ₹ÉÕO…ó_qä(ƒŽ\øéC™&Y•öl_†^:ŠóG `gʤŽz‚ióÑ©ë†ð›„Nq¾*‹jùk?°ý`©ÞÑ…C}N¹žêå5Ïéî7KÎ@¿cl?Ï›ª |€_>ïßðÌHë;À–C«Æ¢xnµÔ=XÑ=蜱ópLçAtåAÌR3ÇufìÿïDcÊÛ·òFT‡¾üéÝ@»Aþ­ ´ý&5¦gJÞИmé•®›í:«P¢™zýâO`ˆUÏ3dp¢«JÙ¶ýu*=N —àN±Çs†ãû†øq‘<59G%ÁÐÎ|›*¶‰Br&Â<&È„|HpÀ²e~ËØÎÞ'It MD6GÕYy­ƒQäÈÍ®›sO7ú˜0ö¬‘¹ÛQ¡¢ŠýŒš]wr?Bž³[Ò†Wڜʓ1Ï`Ï8ýØMdÚ¤Ï›Š¾RH3ûp3•Ê‘¼uâ]…¬ªPF"L†8ùÚ^BZt?C¢qyd®½R©LX_g•ú†M"Q·Ú²³S½fÐZf]FõúeBYW˪”±î‰ ‘ÏH„òçÉP.Ç­ nYR:§Ì)ñ’òT¿r¬²»©JÑ »†P}ÕŠÂAŠáfCȈ ˆHœ½vAô\/ëÆ0)ä¸àr!àŽPËý†&Éæ$B‡E¨×»¶#nt ¹œý9g<ò€ÙéAœŽû†ël¯7P'Et?í j‚þÚQäB‘àu³”}vFKÎTÖë¯wÔ`¬³‰]((+Ô¶Úp9ŒÔžÌU¹±v'åMÜØZw¬óreQËËó£ê@;Á/þŽ‚84¢eŒÔêT€5,ê7B%ÅQ0úì3¤®–ÅŠÕJ¢w@*Õ$„uFc)+h ’g2k/¡ ñW§ÀÐëÓ€ÃNTV~*öÉÈÛ«f×ù¼·Ž‘rÁH ¹¿oDQTe^vÀ'SàPüÉBëÅõ‡hP§Fí€ÄÂÕ÷”CžÈE˜¹[׊f•,æ>Jf5-‡¯¯5~Éh} ¹ìxÀf²>]ÁÑHͤ¥¿î+2é=²¯xˆ—¡°„ÉóÈ*¨íVv,y·§$qÚr GuÛ¬Ÿ°á Y^˜wî.íÜhöÐQãÁ|§ëGÚ¼°PÉ0°>&1À2yÀ×=x=Ù0‘ª%Z5ŬJ*TZOïr´Æ ZÒ‘`Ì›5µ6PÂÕ}f¦ýé í=H­!ûz‹ÞÿDŒ/É(‚°00y ‚ °æ£’ו!r^‚¦*™?Mz 䊬8=Ô8áM•õÍF«,òÕªá/ÿa½jzۢཿ‚KT\)VÀ`@ŠrjUõÔK•Ú Å$F±!†E©ÿ}ç},,˜$—\êt—Ý}ûöÍ›™–ôì…Hèô=nÑ WtÜ':¶½¦iË»¹ŒEà` QäèôsÿêûÏ9ú6±[kÑü2ôivãßÃêAí?³­%v—_S¢S¼4|~·Ž+#óí<*]î¨Þ*—R’ÑÁáÜ忲@ëÝQïíÊS”E(Jò€b7Ý % Ès4ûˆuår.VÔÒ;~ÂúuFb”:™çŽªü,cY«/öe¬ @&Ft/¾)‰`s œtZ•Œë">ù­£8º•åûû/˺À6}[3M‚¬<ÈbÖV“Þ±dk6±ÃDWj#ç” *àºm™q”lŸõJx]áSLNÔæ‚Òu8'f® l°œ± ¤oY ètç9Æ×YäPe4jù‚©X’í¹U”—JtNzm< ‚a÷ qdþùRænÎæÊì7l’×ü5yU“X¸“!dœs®nÝŸ¬ÌYæ»ÓáÎ uÿ®1C‘…ä¬sêHµàz,:"¢® FfÁjC]g¥´wAßðœ±s»pþ>¡¦fáQ+Žo¢eŸ‹‚ä;–y–.z¨?°\¥@驺¹L~‰’h« Γ]z–CÅõ/WH+ˆ²^ŠE+ýÓu<VýmˆVCÿ‘Ò“€y°^ÓoêÏûï;xó¯Ì´ß"°øM”¡‹nnÐo?m¨…›I«ß:ïiòö‘ye4ùH”áìh:”’,A, y8VSZˆ!™/8£MRh a2® ÃZ-ÁËf’'?ÿmä““8/zs³˜ï•Y-“8^‘ú³MýŽ É/¼V8éráüšN¾-“q£$”ÂÙÊý")œ­Nj '%ðÔå‹§“E#ì„Z¬Èß}Åd_Ê}¥«™/ºê‰daèëä4™ʼîîUÙ|û†Ÿ$ÂÂ^?AÞ,¡£ÐÞSï9Ÿá7¬æ!!…>tÕ^^˜dy†¶ýN+t²ÕöBØ&m©+%%)§DOøãk³’lÜJ_¯v¹,[¨ø¯êWޏcÛxìiZF·Ÿµ6CÍÄ7aI¬éÄÞd1–ä6”CS¬Áù¡ÚÑ''ØKóøµ-O½­d'”ÃH’Ó©vÇfWÊ" ßxË&æ ×Þ¬ìƒu/«¿Ýú/À\b endstream endobj 1323 0 obj << /Type /Page /Parent 1722 0 R /Resources 1328 0 R /Contents 1329 0 R /Annots [ 1324 0 R 1325 0 R 1326 0 R 1327 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1324 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 286 592 335 606 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1325 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 478 134 499 148 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1326 0 obj << /Dest [ 537 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 266 121 290 135 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1327 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 272 67 321 81 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1328 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1329 0 obj << /Length 3738 /Filter /FlateDecode >> stream H‰ÔW]oÛÊ}ׯ˜£ËÂbø-ªHÜÜä)‚$½ÑÍC“âb-­,62)ˆ”÷‡ô?ô?ö¡gf–¤,;‰Ñ·Â€E.÷óÌ™3gŸ/&O‹„bZ¬'qBþð“•I˜eQA³ye”Òâjòä綤e+}"j—õäÉ«1]¶“(Œ¢}–“iÿx31ïí¥£8O)Xüc2—AsšEá¼ÀÄi‘Î+cÎOyÁ£?™'h&Q0Ó°0QI·ôá¶î6hIŒ 0“i«–~zuNûO0Íñ¾Ç·<ÌMDf¹9§7U÷O·ßÊ$©±õ*˜Î ýKþ_üe"'–Ó$QXàeñm²ƒ›››0HÃØ´¼ªãe15– ñ…‰Yú¦Ìôr1‰©¢I’aZĔβ¤"’„3f%íÝd=y¾ÀHct‰î¢1¢1"FÐCŒÊÓõHΊëA™æ2ðì«ÙG7LS¼‡Âõ +M“yÃ,,ï4Áwþ­ ãêŽXÐUÃ]à#1ý°%zmoéÒÕN[,O”™Î­¨Ÿ§6ËFßV6fèuãçæKMH‹M%+éY|ç–•ÝbæƒleÁ±9l©ªi i¿ÐmsÐmJP¾‚¦qȇԓGñpr~”@W݆š§²mçöˆv·"°…ZwíövK+×Ùj‹/A2òç–˜‰s¼ÙŽj‡ãu ]8ÚVõ— TSìGÚ™><°_Aö¶ø£†"C‘醚¹qŠÑ\0Ê óŸaʦ 0É,ˆpæ#œ…Q†gˆt9#}íiR”³09Î8´ùŒ‹üªà2b½#ï·vé6Ívåö-¡)7ëF¾ìéÃ_ßÐÊv–ìr)M®m©íl箄!HNŸZa–¦ £ŸEñlÀ?AGðžb*"1†WHÌÞ=NvO™†ãdQækÊ0rÅ¢O‘›1CÙÊ‹£Ýx.@‰Ô–v²úæèÚ › Vü_-3Ì¢4$׉< '—©º øhü’ýËîÀ4 â˜£É ýºi~àH~Lˆdf€Â @$xæŒætd(–9{õî³á¬¼Òp• ƒG?A-‘‡µD2­ë„h¿ ±j<82/<"§‹ÔÉ$"5Ÿƒ»Rƒl,F©r WöRÏ"Óq–³Z“þìpxÆyØSÙ·p¤æ ÏКF¿Ð™ü¼’ÆwÁ_–¶æü;èdÈG°K;ëMÝ £m}Ë<ÖЉöøX†È4V'm„ÚqÝ@Ī`ʯ³øç!x!8i6 ÎtàøüRMxOÔìüÓÞò/¶Q55¶IgoÏéLÚ ÃYM Ó7æ¦o`*”g×ä{×¼­Ô=³×ô±Õú/üö¹ÑD¹dÈÏÛâl(Žëf;ôЦ?Ñ/ûæŠÆ½ß±1ýôˆ[‰íÌ0æP½ÝYWn»ÒfÞ˜<8GOñùÙ9!3‚9ZR…i?f¨~h¥mü(º©…wU/·N+ޏäò×lìµ#ÛWxG2†#3y·wí®©WU}Ù—ÚØÓ8Ël0 9²ä÷º¹Ku`UÕSPÊd¿©rN+åÊ­íaÛ ™=®—Gëé±èѪ~Yð‘‘dÀ\)“<(T¿sÓµ­r~€ ¸j¨n:Ò¦ EVêL¬‹±¹íÙž‡Iv·¾ª³ÐͳS8“ÍtïºãäZ:=æ™22×cÚ®ÛW‡Î)Ì…ÀŒ$måçŸ3Õ}ÓºÙ“ûj¯v[ÇeÙ}u˃ê}礨]Xí)ö;®O1ËbßY¹Bø*žCQHÃ2Iö v–V•É=õÏ™èÈ#g—•­™aZZ Ø¥Ñÿ²pntvO¹”©|•*_3?±—/Góƒy䥾OCÈ{<ÿ_xx¿‹… |•[7}™åq]*€ Ì߉húºvdŠÖ¢;¨Âþ[‡ èóV½ßª é´`â{6çÉgå0yr\4¿œÐNúv{Ùº§ÃοyÚ° ¦1õÅ%}q·»mÕ_® < îµTÜb,Xå8F3o®= ;)ÇNW ¿šBœU.@`ãÂê7?pÒÛÄ–¤æjK}jpz‰ã˜¼ùCïÓì5Œ¯½àí—À™K Ôw£ï®– \±vHlŠ„Æµ»a{ãÍX›Üh_ŒÇȧÍLu]qâ»]K™æáLóàÄÏäNÀStÜtpÀÖö-ðãl áÁ›%>®O¸þ×/0—V—/usS“]³5çeq—Lzÿ¾ïhcaöílYìãç ü6Éæ#ÉŽ8¶û‚Âu’;eþ£ëXœÎq³4^Åô3ktjêËiw»s„ûÐîБ*Ðp»r¿ )=†ë[¥·©k7Üõ<åÚ¦\^ Ç,DœxwÆ÷2¦þ1,²»Ò×þâáï[JåX‡íë˜À iÚˆE©ô;õ¿6espJ4À­ù:¸¾? “±ÂÄ_55Lûª–¯ß~xù«®vN(*ªÈ±W䇒åi8Î[Ÿ§°%^#š¥[|#2 ‚êß‘’ά¥ŠéÈ¥«½Hðæ(V«;úA¶/yµ¯ P÷÷AÚ,ÍÑ,å@\%}%ú«Ëo‘º:%õ,9*îGWÌb$užD¦µê!¯ÙÞc q$S®ÕU-%ªà.Ýþ„ÏÇÆ™§ê˜¹s5ºˆ{{?KewKAš'údÎÞ21fæôþyRîkÉÞíà#9#‡Œ“pêx ^XcéÃË7/^?מrÔvíãfZ°ÚKÒ=ȺٸúLW¿ÙWLòsY[7j€ZdÑ·%r7á äV: N<3ž‰µ“>l¢öÕhP $òq‰*zmή¿iô§£" Ò‰ªË ›5ssš 55µÞàDF?þÊœJÍB;^ûtRÙ‘‘ìíT­L÷‡–>þôæ7ç«»–sàÇMÝrS%À‚lÕ ý¢Ñ¶GÞ¶kåaiÕ?0X„´3p;pkb©ö³·?"ÍXò|Ý·ÿ7@>ÆQôÊÆòŒ«ÄƒXbƒV±/p~6£–ý—ñjÙm‚÷~¡¢¨ Ø„IÉ’ Š¢‡žÛ[Óƒl1;r]§Iþ¾³»”DÉ ÐƒSâs9;;ª”œûezþ b‘™v‡vÊjŒÔ%m ­gð^ê;ÔÈ«_3²Œ'X"ô|`^Kƒ<—¬G~ë÷S;i“U"—É];‡RÏ=ZyéTòAŒÂß»”ß$4´L½Ó+ý¢®nDîDÈDÁ ÐW-èzYËh5wé–!‰ê²®1«¶…64¤Ù@‹V„ª£ƒ¤vwºü†­i„1¥.çCÖÜùgdc­^W±ŒÔø{Ò ½³òåyÙÈË]ÿïI¡Šñ¶b³ì¹3Ó'Jæu$j4/ǂԨAD† ÇÛ²Ò[ûvL$ ×ÉÖHù&[£(FCo ™–%zÞGevúl¥1?½¬÷>¶^ôDerY¯>ŸÛÇÆ½,±,å\³CŽâ?e׊W‘[È `(:1ÏK‘Ÿ’ÚÊV:ÏgÕgTþ¦Wþ@~!ÙKe/¤²W½ª«R¯hHÉu$š¶lÔÚG¾œd‚|$± "Âo¤[ÇÝŽƒÃ S~ô+Üø¡%êªêV6â”aI¶æ§6 3žsB/ÑGݽ\°{qŠ^íÕ»ƒcäïrNLvç]+D‘çuÍÀÆ×àóf”&P$ĸØf•MlIŽDßn&O2mÆáv,Ö—¿%ëµ¶rµ6²± ª• ÖîNTnJR`ÓåŒÎ‚åæ,¬ö¸Îϳ*9$JØQXV8–cvèž4Eâ¬,"kÇŠŽ¨×´~²¥Jž¢³=A`Éß½ôìÇñ:õ£l©QIþéÛç¯ýVøºa‰¯µ=±‹ÌÏ™ù’­¯ 8q-Óȳ–"ñ:íKº0c‰rÊïow£Ê4yo:žÑ2úK΄- AÙF"³{¦QyëýÞÉ_yRå“bÂÏè­ K@òY8ÓŒüu/38À´”8¾– +dc–J6uÊ؇ñ½Pª|’,í$kiÉ“]Ñ6}Õ±}çÃ] ÒÄT„8 O×I“‡È¿öOŠ$R…Twêñ¹ÕÅffx²ñª¼È#«qc¸‚ž•˜`ßÒõ™¾rÒõÐ=+ÖMß*ÞHiœ@G¯iš±øFºË5SÝ$fÜQ)[a¥"%»B¼àª!án±Ù¢è¼&ÿ„(8‘d»\„Q[˜!GºïþçvAþlI8ÀFF6Ÿ çf>6òd¹â „+’"A–HÆœHaøh%ù5‡ˆÅ%gÁ%gÕ$d7¤f6P¶~à[n6òñ" =I3¢"˜ß ê¯jDŽ&/Ó{Vìp±ÿì÷Ë÷wÿììeV endstream endobj 1330 0 obj << /Type /Page /Parent 1722 0 R /Resources 1338 0 R /Contents 1339 0 R /Annots [ 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1331 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 446 503 454 517 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1332 0 obj << /Dest [ 1466 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 146 409 182 423 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1333 0 obj << /Dest [ 1466 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 290 347 325 361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1334 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 485 220 513 234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1335 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 205 206 232 220 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1336 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 193 139 207 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1337 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 326 121 375 135 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1338 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1339 0 obj << /Length 3917 /Filter /FlateDecode >> stream H‰ŒWÛŽÛÈ}×Wt H4/I-‚|ï&°7»²ÎE¶FŒ)R&›3ž|Hþ!ÿ˜‡œªjê6rxwÄ&»«««êœSýj5y±ZE*T«Í$ŒT€ø™g‘?Ÿ‰J— ?É‚X­v“¯ûL=Ï T_4“?ޅ꾟~„˜SLfãããDÿ’ß.æÊ[ý}²äEK•þ2á8ó“@ìòšˆ—ÓÓ"¡Õ¿éEx;‹oÆ~¢ƒL­ŸÔÝSc·xiãÁ’î«^½üqªþúoo¶À¸Ã·…¿Ð•èb;Uw•ý‡éj6ë¼)½ÙR«ò_ïo«?MøÄ|š(ð VoðŽ=x||ô½ØuO»Ú¦±¥ÇÀtá^mÙÒíjªJM¢EâÇI¨âÔÏ2•„ˆ¤Âç™êÌd3yµ:#1%8Æ1ºEDsôŽ™ £¹Ÿqf’ÀÇÿ²a ÒCüé‘üÿ®v¦«ŠïÔ'ý¸­¼¥Ÿ"(jgò¦÷þ\+ëÁÿþ‡:· gTy=Õnx°©L]*/ ´,v«*·‰üLwÖ”*ügolËëî~}§øíÌExúp÷¢1ÕôD޶ƒUýÐuíДUs¯¾ ­5ý'ÏWh½Ú"ËøÖ×FínŸÛj]Þƒ7\›mþPµCGžß”ðD=˜îtû˜óJ{.qZÊötšGÄËP· asÓvFE~HÿSõˆHqìΛÓáycÞ ò‘‘@*Û ôæâš~2ͱ•G‹Sê§½ Ž6ÉØOÅcðf§ÑÛ#A(ÂܛŸéò±¦óPï©VeUª¦µêÉXe¾V½*`€BDY}Ì{LÂ4 ?š_¤*ÌÆTÑmf -Öz÷ˆS„p\UR &2,Ý,Iª9dCÿ g¾gl!Ò™Dœ—œäNu ¨÷”¢ˆ|ÜÏFõòbðè( 5Ž–—%¢m»|œ°ç yaܘ+EÊåMu´Ï»œ8Æ}}¡Ý`J…‰ó·MýÄÎ2F,~c±ÌØó‹Ô2'¾7Æ”À)mDÂÌéŽ÷Xh®Šƒ7î%ãÎc‰%XyÞ,E wtªs7íw <:Æû"Ô3ÐX²$—ÓåÑe†¦¾¹';ƒ€ÛòÏìIî&zïFcÓX‡g:qmä; ßcˆð©×OÖ-WRS¸ò7'ãK·S…D˜/áÎ}Ét­ù]󣯾ò&ƒ°n§ÖMsËÜ¥¹}®Wñâxþ…œŸÌçÌ)2EÚXy’Ü µ­ftJö%÷¸\ð4Ó¹‰ò3x¬l[•»×YñïÛYöÉ#zÍëÚM¥ZH›{7«GH0È” æ*ý‡É¡2Ò÷6[¡`†sˆ*›Q|݈yS| ·‚(H{–hµsÃ{¢ÁŒÂÓAã²~ä«Po8ÂC-óX^ªâA!S>Ë&Îdãlª’g͵u¿k·j´¬úý¹ñ}ç¾ Îäøb7žÎö¾TØþG¤põŸ%>••›´”ÀæTœ¾±c7¼Ô•Ñ®T–ÔÓüÀxs‡,³ïLO âÚ¦Ìá.ÊèÓ¸ñRò¦ÊV;~gßS•t'3é ·_KIôœSK™ÝӞτO™‰¸+ÁNµ›Ù[…:Xâu+ÅQV›ªÈ…E¹V¿ŸovÂx¶jA`&6 T`µ¢•‡]¯HðíÌ$üÅZf œÃ ¸ !4v ‚Oµq³˜AЙïyüNæ»9”„…³÷@GˆÇuSé•°¤°Ðg‹/‘ó àŸÀ½CÃGdFÔÀ¨œº$ð’ùº¯«¢²à­S†`v­„”ÂEŒÆuŽ˜.ë¬!nðJ¸2"®Yâ*S¯A,“ÁÓ ©ÿ€°ArÕ›¾§¤õÛv@㉞ÎÀu0 é¤K•7®Ý±†ÚıCd‰¼ŒÝoºÚíÛÎB`Uµ¡#`æ¾¥ªt{î$YVC°F@ÂfÇC«¼£æ’Åo›sxR}…“ìá°£¹† ê¨rþˇ¹ŒÈÅ5'rîÈÈ:QŒT¹§^ààF @ÄyÏ—ŸŽ)¬½îF¤Î‰[æK|¾M'ÙÁ©ù¼$+™~{•/‚ó^j6>2Þ( ¨4´ø…ê 2Ô 5Šúf}H ·¨AKªA4AßÕÇŸn?ÐIæúV5nU°5ú \Å ¡BŒp³~ºZoá 8Àæ/~ƒñ, !wîGÃUÏTɘL¸ñ õö 6½Ot»ãl£+T¤|©<¦¬Úº•J,1Þ¡ÖÉbF qŸŒJ¹XO|÷ßSý%hkÉ&úÄsf›ÏåxyÛÖâ2HZ‰)pT ~¡á;ÐÝ-b–‚Sˆ,oų×+™/ó,·Ì€ûŽ%þÂd˜×bÝH‡—O€£Gå…H•#müâUZ"¹ ©SÍÑ…ÄÝâŠX˜º‰_ÓoÜóÎŽÂÎå±€/·ÇĹ–‰/18eMDÁ·ÙCØP¥nˆ4sSQ¶ž©ø²  ØóæÉ¿Ýçâ8J‡S:άÜh ªOµmwã窠¼Œ\ì˜ç6*ËyÅ"Ò)׊·Ê ]#Ú§î~}§>JÇ𓼺• ¸oe+$âÜ‹Þ ç¤;”¨%µJ÷[{=ÏQMÍðcÛ}æî‘.˜ñc‰òRËÀ—VK;fEåtbDåòuUW@>ŽäÎ+-(Õ_(êüæ/Vµy0µÄ0ÑÄÍË·r=¹È ¸êã[ApL7]y`]5Hy¢4›|Ũåeý37Çõ\FEîö5ì’¸ê&ÀuRÔ=”¦]³¥”ƒ¨|ÃY|¦=c‹-º3#¥@k=îYypC³,V¢Zt÷ázÞê[ñªîŒU(×àqýö“`2•¡"Ìu©~½Oî^Ú¢«"b…Nz‰]Hz9Í…‰Î˜ÛCTÖÄÑx;r¦ÜN1›ð™íÿŸž÷\¤>Š^ÿ/‘zÞ1‘H¹VæìÚSQzWÕ9«•7¥\Ð=I8öV&/©q´LE¿81DŽo¦Ç%Ò Y"å‘kÆ)ùÿ×àýÜUï ]LÒµë}ö5DN¤Nú£¤ ¡öòöõ ò;¾p}Ù*BùuMMÚ“:íÉO%àï:’JÊ7ÌÂ!b"´OÝ;V4c)š{™À5Þp{U–Ü|¡Ë{ÜòÇæÈÝ`ÖHÿ×p>/‡£P/ ’9 …¹\w?àGLÙÄÜv7Ÿc Î¥Aµˆ@qã,U2L±0¥ÆØ:£nxçɪâ—ÀêÏ=*ouûÕ)3?Þ-ôIòx á¹;*`ºv]µ§çÀ@üÃÏèJ”âÖ‰+¼ÿ±{oPlÔ/\ÔKýgõ ¢Å»È“»½¼7öÁÀ¢&›º6;¯û½öØeã¹£;#êá¾Ëw;Ü ñ‡Ô|¥ NtAµ1׃ýßU×›¸Dßû+¬}²¥€ð·©¢JÛ”JQIW¨´ÒæÅ‡uC1 ˜nþ}Ï™™k‚V‘b®í{=wîÌù0¨r*芺Séõ\õ‡ß˜-i&ÊÈ2Y¯rxk¬{¸¦ÅܵÒë®ZÖck2Nõ_»1!ØÈdpù ÏÌæ«èä"°²ÅmÀ£2;™ùà «·iÖ5%¯JÏÑu‘w>ºrɼJ·ð²"Òæ~»·ñí½­&#Îéu£—RÈg¿¯8vÿ06Åð®›:,ƳÅ?ïØ¤‰…ÇD'L´Og¹Ù4ÿ¹ªÞ훥¤:ñõ¿@1üŽ&0áÎH!,k=´—v»tú þHdÛ©r“s”æÉàµz´[Näî2µø;¾[ù“é‰ð]ˆÞ} n®¢È•:”Ïȱ-¿’öxܯzªKUÝCwѬ0r á ßÐ@dúÌuEª›ë ”;¬£Fg‰×9Bã‹Õx=önÝî±¼-Œxn®c—¡á%A:r)Ùâ?¨žÚå¥$sŸˆü¥¹Üá(Šf/tU ´oê¯êWï7  &þü~1{üLýù“/Ì{*™ö¢ŸEˉº˜Æ'ˆjŸq0 Q €0ÌÒqšöŸÊM[1ø:£$ÅÅÍm#“Š ë©Åíæ¾[`‘ËïŽz®5‰³z~©I}¢[YR«ãÛ®ê7"Å8€ÉՀĬøOÁÏ–~£¨ô°ÓG"ö¿Pµg •C±E=1•¼åÕAÚZ ÄMȰ R&{…YÇAbÐèÞ2H²~¸ÕË)H‹~Ž*†•‰°¸÷J0t¼ÉiÄš£Hƒ>•ÊK›–@U]²Ý8›&1/z<üÅì¢Ä]9í9Š¡þÂkš¿âi誟*– †®äñŠ|ªÍGê…ØŽ¦‚á•öÞ'åìÇ=X@*KUÄV p¸®° ‹…O}´%Ô~œéh… y.ÏÞt¿lÎA'P4¡5©‚çú­­ÝÏ zïÙà»RŠå]äFäƒíô)‰;‚Î¥þ»úý~N‘žúyÐrÿQÙèÉê¦î¨  n/Þ£wÍÀeL.®Ø¹|ÃSwyþ1!¦[)4 §…íUD)æ‰û5¿t HÖgC#÷ʠðõI¥ßöÎ&mÌŸŽ"q-ç…TôtXc —©8?“÷AÚ;G|Pg ûл”]·ÿ–;ŠQ™d ,:U8”ŸÃÌöv èÚÙ©‰•µ13:¡ZWû ù×|öyv÷÷b&âðJVI§ê+‚j×à4f1Š&ñ™®ŒÓÁA¾!vÊŽs‹’DEép² È™w‰dÓdpÄ‘ëð¢èÇT”]ªÊí<‘ á$hgEbk;–§‰¶òT2w²qìýÙà5v< "wÀÁrŒ.‚Å+ÚɃƒì›+¦nE,d!ˆO+=Ѳxi«OKm;<™¯7Í3€„µà¸ß­ßè •Þ{º Ê–jçÕC¤Ê}{W¦þUà6N¦ÝŽ€{oMK{ÉœÝ}zxPáx/Ü»ðš`4EwìEàò•ÇOó910ƒ'ããÝÿ©©W^ ǵ­_y${ì¼T}ù‰-ªÙâ§ÿ‚‰ + endstream endobj 1340 0 obj << /Type /Page /Parent 1722 0 R /Resources 1345 0 R /Contents 1346 0 R /Annots [ 1341 0 R 1342 0 R 1343 0 R 1344 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1341 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 224 633 273 647 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1342 0 obj << /Dest [ 1347 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 206 391 228 405 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1343 0 obj << /Dest [ 1008 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 365 377 392 391 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1344 0 obj << /Dest [ 1347 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 202 106 223 120 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1345 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1346 0 obj << /Length 3731 /Filter /FlateDecode >> stream H‰„WÛrÛÈ}çWLíCj` ââÚJ•Ek½Êê²¶àÚ­¬ò ˆ˜4—ùüCþ19Ý=/R¼¥1Ìôôt÷9Ý}žOÞäy ŒÊ(xDiàE‘«$›zqê‡*_OÞÌúT•=¯ñU_6“7îŒzì'¾çûkʉ;·ýsñX)3*'ÿÇ$ãM™J|/‹!8L½Ø¹¼'àí4šÆ´û7ýŸ³nà;® ½Xû©zØ©»]3,1èÊ$Ý×½z÷áLýí¿Ž;Å{‡oSoªkÇ×åòLÝmëá_U·b!¡.š¹ãfZý›¿çðù6ïÅxÉßcŽ5Øn·žzF÷tjEÇB4Žô0ô½@—vjÉ’.ò‰QµšÓØ c£ÂÄKSXRáŽQªºj²˜œçÏÆ –øÇÖØ[×'‹h¶ÞÞ3&Hh)<ûþeç[£}‚`7„VækÈ[õBõC1TëªTõ»“â[Un†j®Ú/gªí”c|]¨¦m\تå×Û÷ç3Uu¾–í¼Ru£Ê¢¯œ›U»P‹¢^¹Ö€®ñ Ù îó#v$GÀ¦«<Ö1–JŒ¹‘—´#Éh‡ø~*¾SÑ5êfàK$ú‘Ÿ©îÔ;ÐñÔWŽ›`üƒC3Žéœn>£(õ< [à0}Këq\Òü^ß;oÅïaz~bOÑ’4m~p"ù6”˪‡BxQ ª©~TçL±ªuhÑV-ìëZVo»ÀЬõjPòJßø XgFÚn6Z=ÙÝeUÍëæÑÉè+_ÄM½pÊ>Ç+Æ‚)#+Óî>^A`F¦2Ó¯³Ï9ŽLÇ öyY¬VžºÄ¼Ñ ^®ÇG¸ýª{½nIXW÷Ž’‘|Úö,Mö³*¾"@ŠÙ¾Â5¡;àhÕ ‹ÆúBT˜ýøéö+­éÁaÌ“yàzþÒð9öÿLÆž0Ïtdc#©eàNu·¥ßºçUÃ]<Œï9&¾¦¾ÿ L«Ž®õá"ŸÝÒåRýÙq‰®oîµ ! íR>‡áŒèöS´ ÀÓŽ“Ì1òQ¶«dyÍØ}ÞÍdú8/:ÝU³ÄªÊ¤BrÎÔW?Ð~˜ö ™1vŽæÈs$Vÿôšža¾ªç÷¯ÅjSÓU˜ùž‰O¶ˆ«ÌhM‰ŠýÐQl㺱~ÕRQˆñ©î>ýˆó‡E]­æÃîéD›Ú¼°ogÒ"r°le©Á3UŒD¥òe-lÛ#¥#&CŸ¸ÿ”¼{Ìpu E ‘RAD#3…ºW¯Ì²cH« ®žîiÊ7û Spx)xÉî~0O#:ß–àöÕfÝ€­@TƒãR$,®«*7]‡Œ±Ú©EE¤7W]»••ÐÓo@[Ì€„)C\= K ­Ü€'¬1bÊ}Guè­¯EW«jLûë†êVÿ7¬&VÏôjC¤_R¹gLΧhïT²ïMÍ~•ÌAÃx[ùâC—Ú9TP<üÄ/“†ŽIÃRú烪¬…Љ Àr6Pî˜CñPìùŸX÷híj®(’‘¹Ÿª’‰Þ™ƒ‹í&JÍßÑŠïT1 ’&êwÌ Y|’ŸSÑÔø™T”Ñ¿_Oùº*7¤¦Ès‹Ü;žºi±tXÕDz1ñ8íÿ}¾¾QµHP”M çqR?‘{÷„½ÇDY»Mk·ñéu%]¯¨A#ƦÜÞ.!ª <²’W»ÂTFg4¿Ræù¯i¤[C¥å3ß!Êœ†FQšXŸ¯7ð H4 &x ª©ì8'Tä,öhµÙÁR+ÄZ¨ª(—l3xvXÖ´\ÉoÑ(TcÍäžÊŠt\¢jëhéêØÓÁdÿÜÔ€äÆoVdì•1šƒÄz¥v¨køàÁÖ1”¨miDeL'áx÷‘ç®.ó‹«ww”O2gÄ)—È4±~Ï¢c¼Ü;üxëЪ…™!}‰±à¸0“’KßV#x(²›Õîíq텤ϯ³¯Ä‹¨C.¹Øx¯J»£'[ç\(¡¡åL1ñ7•h"gà†A‰˜\+ÖwŸrÇHÅȾJOøð  > ÇRƒTíTž°ˆLx ˜Ý^__: Ùf&$ÀÌôx{b`”ÐÙazSrØ”¬f„»&v©[¯ëÁf(ºž*å¹!Dºëì<ÚŒ¡+hL!Ã;ûB iw T"mã©k»òË(µßŒ‚ÔNžöø ð!kW°u&¸Ÿ[=éâ¹j¹Œ¦ÂÑì«d˜39ÆÇX,š(VÉ!u”nåM~@ íÝì'àzÁ3íX2à†*sæ}n þFˆô1È´°ç†x3Õ2U ©g_¬Ç ='ÎT%둉R]ÖG²ÕNm——o©~A²{ÆwÇ!“,¢—dz¾¦€ %à¸QÜ–Ç õþÚÚáõåXLÁ)ŽzGz'šLB9ŽÒç;R;Њœû8ãÈrðRÎAõó‚<<@ ÝÀJÈwSœ~k_¯Î%bÞI‘5“·ŸäÁíà &ÐMŇuÇØ›†cG¡~®:¤¤5_“ê¾üZȱH>«Õƒ}¡`×_À@(­àá%Eq ¥áo‰kÎlM`aФÁñ1$ìÚ.ü"â,f1‚—€ðBoVÆ Œ@Å !á¹Lõâè$#›t¬dLúlÚ™”¤Ì+\ædÜöÀÚ†wuuþN²±]K8‘ƒa,;RöÉ·›jK)s]ýÄÜÂÚN…!°cÓ{qÚ…ÐÁ¯²Æžô™ÐêÜ~=sý¢;<ì8¯3¹YE¡—Q'Æ“‘°kl—)T¶°]¬-d(QQÂ{¦øSؤ²ÄB'ÖßÚvŸL×;F n%H=V#QæÕzÊö¨r½9×ʶËóÁ>ûЫހ—‰DʆçžåÀíÝnI·a۪Ŧ)c¯Š®RÅ×¢^¡†w2æ3J¹\µ¡l™©‡Í švàX°ª·DÐ/ žÿYÎa}‘CÆí ÐÍHTžÍò»õ„ÑŸ.eþÍGTXÅ{Ë/œŽ;^@º¿ÖTS$êQ£¨I_ô¨Ô”-Ã5CCE¸›Êç2r 7®ÏÂ¹Û ÃÌK^•û‡Ýæÿñƒd ´œ=2aC&à1—Y4^O]ûØëu1ÔTHîœx߃™”rýq}h©ÍO2Km}50Gß¾§NõùllOж|uø\õÝQ»]Ö(Zëg&dlÀtº"i`¸Œ3}¢MßÏhŠÉ)”dº¯&­ìY9367.«øxÛªÄܪ±Çý 4[Ѱ–5j|U¹lÄ:ê©•Iù­)|Œ¦FX[ÍÎÊ/·HèÉ~fª¢Âøu®ñǾ&Dÿ%]V¿áS×ʼn/=ÌÔôÿc¼jzÛ6‚轿bP¢>"Ë0$iPôâIŠ^|aɵD@âZÊŠÿ}ß›™%iJI Ã&¹»Þ}3óæåL´5¶Ÿî~¶uƒŸ6–<}À#.Kɱ0Çß–RԦljƒÿý‹ ƒQNæ~pN¹ *ïà˜'¼Žw"Çõ:‘#ˆ)y?ºÊ?›¾Aˆe€‰e°h¥&ý»¾iÂ4ܺ”ºŸ˜ªŸ™,k´TìÒ8®¿ÝÌ,É×V€Ê}  ŒÌò„bÙ´À*À%T#£rï_ü^(g«ZU8óq¢DT•MØœÄ]tàªtêZ¼Yjñ ×øóð€úpðUÍ=Dí_qÐm(öìíüÛÕäoÈc×7‰ÚÊ¥¾Ð„½•{–Ž‘¿g€A×V„áQt]`ÎY''È  \°ø¶ËžS,çG½ÑÜ ä’Ñ1È—8 ñßZ²8HÕ$§öÁM2­c÷Ud$‚™ü7Ô)Íò(Kªÿjcn¦£®UBèÏ÷_¾üýÇç_ýÊ;$Í1…ÏÐʰŗРï˜}‰ÂW‰ÂI;⸕'{œ™†·±÷ì(^Ýò±·FNÎæbõ†¼»Ø¨é°žÇ“÷¶0«oݹ&rxÛiä$._ 9Æ…?导 Kg—ìgñð”ØÄ3pO$4ö5”ïGÉ â ó¡‹á óVD¨¹r¡·§M \…vŽëçjª…u¶Ô‹A´oDIkÄØ¼zOÒ‰át,ý†yç&¬E’ØÒHÄ OG!æ1Yü8´zGvF .ÞT÷dƒö14mQ7ðBÝÜI*®zbNFE}×;y6ïÒ‰¯Üä>"êá?м{nTŽÿìîË}MOÎ%m)óÁêãœ#º¬íÚ¶²ëåÄV„M©öÞYùý±©ÓÞÔ©˜š jáÉ %èÎÂúžA0”hïY‹¬Er‚`}Ô@‰GwþØ*Éά ;ºüTfefLÌywÜÜ÷U°Þ‰«M„·Å֙Ɨq}SÙ{Ÿ–í,ˆ‚Κú ³ÉÈ=…H†‚lv:ŠÒ,=ÿòìz¼¹ “ÔèÃk·AÁ.uG_´7W˜^æ¦EwÆ®ÕØåÀص»TcWÌ–ÇLÇ!%Ê]ñÜzq³®)¸h*f]øÙ±Ihñ´µ(`xšú>\´JãötQûµ  3ÆâÅ?³t8ªªš¨Øƒštähσ‡¹WÀQ¨ë¯á@u åœf4EæÜ]ǰ‡ÐêDAÑãµ¼æŠ×’xýó ݤ_”þ ªe¶µÅϲØÂêV›Ç¥xE=²RÞJ·¨_ؾ-3ýÂõE½[½Ÿ èöT-¼ä¡Þî´¼ò’'ôÞý°UI\—µv0$³ù~•© ^­5ù Ö³˜pÔ•¦Ãm¢ä„ŽÀ#5a´Å‚³“eº±NoôÃbëÓןþˆZÛ endstream endobj 1347 0 obj << /Type /Page /Parent 1722 0 R /Resources 1350 0 R /Contents 1351 0 R /Annots [ 1348 0 R 1349 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1348 0 obj << /Dest [ 1347 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 202 631 223 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1349 0 obj << /Dest [ 1352 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 167 366 189 380 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1350 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1351 0 obj << /Length 2354 /Filter /FlateDecode >> stream H‰äWÛŽãÆ}×WtüÔV\6ïœ0—µáqâÉEµF4$R )+ʇäòyH]šI”f ä-`DvuwUª:U|œO>Îç®Pb¾š(W8ð?~ìÚ¾ï„"J;ŒOÌ·“Ou,²šö8¢ÎŠÉÇ^”x«'Ží8 öd“iûx˜È¯é›*…5ÿm’СDDŽ„p±Û¡Ã÷Ò—Žã€Ó¿Ê»°:ukª<;”N,Gñr,š5¬¸R[p“¬óZ<üðAüí?Ö4€÷ dÈÜrd¶þ ^yóO]mèO¦ÅÒš&Rü‹þ[ŸÿyB“7®c‡ð2†5²àp8Ø–g+Y£VjájPiãc»23KkºéË|¢D.&nÚ^¨„Ùq,BH ðÑE¥'«Éã¼ÃS°Å9E£G×AD$¡1òMŒ|Ûñaƒo{^ ~mA‚ÀŽÜªNÔ¢êìØëY1Ø.î—‹}­«Ùøëó£xO ¥X¦MºHk-`c a@hBQ¤[ÍÐUñyæt¦¸‰íÄSTk‰bCžÊ¢IóB/E^Üž‘ì®5 ÚQ‘.EºlÁKîk+’º²;–¿›ßÚéÊâ>Ûä–B›5/ÍìÜð)©)æì³-î@‹­i!2¶—M Þ1U}1à÷µ‚ h¤ÁpeAei)0šVÓ,Ó¼‹ÿCƒ¦âM@òQp‚äaø0H‚÷ñ{¼#»Mï¡Ûy¨Bò {ÀÊñeÓTùb߀ðª$úIá¾é'ç—,ÊBSžžÁ9È`§7a”-~•s+„BR€9¸%E“¾¡rGk:Ë/E @Dy àBP–,£aöXHÁ÷ñúR4e ´ì.!pZ¿‡–€ X¼+ÓvËgùâvùâ²+?•FÕx_"‹€\••¨K0vÙ®›_A ÍöØvq¸Ð`¹YZ.ó&/‹t#vf¥2¿[Ý誯Tå+q,÷â`DEƒŽC:k°âz:p¦Kv¥Ü7"mv!L<Æ„Ò Hy™óÜlnŽfóŽ6Sì<€ðhMQœCJ#⸃0‡Ê_òùï¨(üòCŠcöøúWë9¹ÍßÖ cNîY¨/¢|±\@ÞÖÅÅÛ €3GÉÍÖ«Ùþ«4eX¸ªÓ%fzL ðtè<ÒY‹ÑL@ßa¾5×ÓÅ,žñ‹ÝÚ·}¸ð:$zÿ<ÑjâoÑ9M¯ì9H¸Ž^3ÿÇL-X[˜ ´“›ž¥w /âhmß bÄ×WΠ‚Ž]dM:Úvµ[~p:üÿt‹+ÓèÓSŒbwÎÿ(“ø¤n09‰¿…Éýž2üŽÉA/ryD\NÌ lž0 &hXBB3´@ä!¢é† øŠN§ Öôýwø’ Ï”{ÞwZ]t/”’,žñ d°Œ„éÉ£þ°ÖñH¡ib9gB©O*Ç$Õ.­k±-+d•†ã5ÅšZ[8RQ‡yºxƒFr/Äo`® ˆßcn9u‰ÜÏ ]ÂÁ+¤Ù€X×mñ=P»þGº½`o°d£¹Á@n×Xå@PÔÝ0 å_Žd²D+Õ ûîùaþðøðòå;¶¿+2cúKmºÈt ‹æA½&+™èº±9ÚâgfBÊo0î^Ω‡œ!Ã6$v%¿šë`êïm$íƒÞ] {ÿEëíƒnï‹!TêPv(~ &Ší‘X=!_¸Sò;Zp£ŒL£Ì‹l³_¶N§› „óÄùõSË3~%rÇÓÍ>ðÕaÚbÄm1 ¶‰Ë §=ƒ)fhGãÅ5ß}(´3!ð9nÛ›uÎË¢ýÅö‡cË4‘¼“3-]B¡g`‹•Ähûˆ¶/+ŸÇ3Wš{ʯ€ð Ï®f>;»,³ýV4c¸H eñjÙ—áëuÀW½Ó}d¹UÊ·»²jR˜ ˜Ûhp£¿E½.B»Ô‹ý›Ø”o5 v•^éJ8#Î×ð´BB8è1ÂtÂÞó©[Ñôª³r þõä\­z²½-ÌïEIEڜѻ²¡zz{¥¦MµÙh%péVIþÒø Qðä/<7>›dó8Ù’nóðL^3v_”pÀùãaþÀü2CÝ@o¼aGZÍxòxȤOþ@»KâwXëÕïÒ!˜¹ªŸé4r rX{SJ]`þ<[C_j3C2- £ xèdÓhËû¦ÜB^f4&™]Èët·ëx*–-¦OÞ¿ÖÁ+ I½jf¾YœrÄ”¢Ö<î›O›®ñ¼JÄþ<·Üð$¹œ¤/ t….òÒå• 6÷ºNÐæ•akSÉÐMÍ 9P1]ÑNÝØöݳ!ã¢r{NîéJEý¤áC¦+ E Ï›MyÀ$jÖé‡ÐcËDÞˆ°KÖtJ¤FjNî-0ŠŒ¿­ jù’§&Cœ8³tsgàû^µpderê ›šN­) µr_c°è±oóÌL-ºê^p˜¸ã—étFš¾Ì'±g;±ʃ±Ñö¡"è¥'«÷¥AØI}×·ÃyàÀ”â_=þŽ¸Ó £tl¤€ržŸ—?ÎßqÌßžôãò·€¼ï›mýËýÇse*p;eg–Œ GÍp54ƒâ4ƒ¡ºÕür¦Öqn¨Ž«’µ˜³Zg•&ÅôzªØÅ£× ÛƒQxãà˜pÜâ è,¾–ö—ÜEë0å~S满ÃÒ1ḥ¾7´t¤Å?¿üôy˜fŸØ¢Ÿ|þŒ¡ÿtnWp#ÕF…ãvyj`W;®E¶Ý0øæž›ãßHÁQá¸9ê§ {+Ç„íAu+Ç„£«äÝ,‹ÍñZ2ú…éªvÓ&=zzµs+#Ç„ã†ÇÃŒÄ9D³FùPVFÿ!ßlZKø—æP~ÌÍ/tÖUŽÍíJ©äF²Ž ÇMŽÔÿ¶ˆT|#kG…ãvÉ»Eôõ—çϜȟ¾¥ž0[ì_kz×¥Øpôzýrüq«;Ö®¾"ÿï J×… endstream endobj 1352 0 obj << /Type /Page /Parent 1722 0 R /Resources 1355 0 R /Contents 1356 0 R /Annots [ 1353 0 R 1354 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1353 0 obj << /Dest [ 1347 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 353 658 375 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1354 0 obj << /Dest [ 1330 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 188 87 217 101 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1355 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1356 0 obj << /Length 1945 /Filter /FlateDecode >> stream H‰äWÛnãF}×WÔ[š€ÅáÔÀ ‚3Yëigö&[‰TÄ–eåCòûû°§ª›ÔÅ3ãd/Ø ûV]uºêôé›ùäÕ|QHóÅ$Œ(À~’"ò“$È(Ÿ¥~V1ÍדWoû‚ª^æÔWíäÕ·w!=ô“À‚sªÉtøÜOÔûòAS˜æäÍœÌdÑŒòÀŸe0~X»²&’åü•f¼úƒú{„ÞixÓ0ö3t »Ck–艔ö`IõMO_{Eý‡7MÑÞb,õSÕxª–Wt·oÌ/z»#±*ÛÚ›Îý*ÿ½¿Í¿›HÄMøó[ô‰ûýÞ÷b?T=ïªy[˜Æ–>>?R•ëZŠ¥o據DiæÇYHqîe!$Ę´Õ“Åäf>‚‡˜œ£qD7`D” ‡3JÜ%~`BâÇq‘“m æiêçÑ ªÁl@5ÈmLì¯W(º®ï7eß¿yMïno¼ÜÏÕ[K0R—¦¼/{M^Ð0É C ÷ûn[[ÈàMq™1£ ÑÌŠÂÁƒÐ:ð¶kMÙ´º¦¦}-8æj4ë1óóá$ÆÔ³„\÷^®ôÖKáð£û}c8“+º®V û+m»ZóæÒñ©lQÎÕ[V1‚U8_Ë–*ë¯u5ý‚«ÖÁÁDd-lJÎK ×ïù#U â¢Û’ë¯l¯ûÑö§ïo«öÁ›&pŸ$ãù Ü8N+cäjgȸ_ê»ÝöÜÜçcF¿ÃL·NÍëe̶¹ßÝs3T¯Å‰ø…ÃâÉéàèÂ'ùペ{J+Dñ7=>É”ÄéÓU³ð8†Zç³¶S–š8e3¯…œÅ”BÕžxn€%¬?ïš³vM¦£²ª´]íŒqud\1‘Ú:qag Tš@3KÎ9·jÇs´¥¶\ëkŽ@ŒÕ9*‡Ü#•m€‘ 0Æ™6\™¡’’áÂÝÙYâw¦x—„³ŸôQu¶ƒç²+˜nueš®µ Ñ´o®ÈÙSƒò?z>½÷8Ô•7êòl+Z—?¡Ÿ1ç-ìàøn Ͳ4²=öžžÄ.ÇýAÅõ@®¹ÒÔX“ÔvÆ7í7ýÓì»e·–ºqÓjͱ;jíàh½iÓèZÃg]uë3!ëæ<ØC·sk%žŽ~åu•›ê|4ÿù‰ö»8=Ehžrz2ÒT4rz&dM×›­~Ô­êÒÑjù©L‰bf²ßH›oIÅ¥e¨×Æ ¨’6g‹[†”qqøIœL'”yJ¥% ,Xãå»"MÒsð§¹+$ÆôHx©µqßu+ ;åjÇ^þÿÉÛâ1Ê·` ï%¤YU2 ·t¯9ǸèÌv§ù—!R.[™-xž‘2$»î Ÿ\NF¯7˜f1é0$æì5œGå8¸|Ŷ@§ö?IÅÇÃÜa”«Ø”ë[®íMÀßoÝ­\o¤“'ýÔØ/ã:ö˦ZâZ€‘j[ÚN´¡"sŽï³=pÑŒuW7‹ƒ Œ©ó`d=³ó%—þ‹¬’D‘;«UÂ#áH+¹ÇœÉwˆiÖº“ÖΰhôøºP82 ºC…áy¹æc<(âìOYó'E*h..t¹­z ;uEÊ"…Ø¢XšO¢úyøÏ–ÿ—áC»ã­^”»•±/ d[hÇ:Sq0A9ŸLïàòLòËÜAöô¢ üÎwxòqÆŠXÞ@Ë¿„ö’×.³óýŠ% µB ©¢½c5FãfPÝ Íé¡Íª’ô'‘‹îÛ,2·@aVh¹°:“•Byf9>wÁ^Þkoš£aÕðÃÒв||®;?ÃÖH6½X€CÁ9ÄÌ'öÖìŽ"\ó‹#³5ãÞ £0’i2"›[>»< û[()J!ί©M00MŠ».Õœ³6±\Éݦ¯¶Í†Yéò–Åe¡eì ÊÌ€KöKiêÖv[jõþËÚ&:)ØÛËÎXºˆ%¸Ë‘uX¯ŸeÔs ŒPŠEñG£ÀcÉBã±l<¾Vå=ˆñdâ×/1À³äÿ½ÿ d¬Þß©üR¡®]~ óý›´,6⓸úŠ"¹aͰùûžäÊlôÁ=äî$'Å ýd˜eÉ^¤ÈèRà—\R3¼šøå pzg°™²_ !3e…޶è1ï1k­ÞÿTMþW®“ þg"³ÁþÎÛählzz›ÌèQ#.Å" –|Ž[º¶Â¾^ëº) ë"Èv€/\%¬Ðx3T0(ºÒ©=©h>T%ô©…[PŠÕ‹H€ONA‹z~&ûƤ›žfÝÎ=GkV•ÎA0aÎLÈ/Sd}§–t÷Ã÷¨Ú|xÁ)åB‚ܽm­úÍÔJ¶t}eUiû9tì̲³FÛU =.Äz'’ÛÓÝáÆNàtgA.± â–œ÷"Š—Ÿ»ºF²Ø<==}d‹]+ÜܳëZSèò4b’ÃmÐÐÏÚO/šMoæ“Û8˜t endstream endobj 1357 0 obj << /Type /Page /Parent 1722 0 R /Resources 1363 0 R /Contents 1364 0 R /Annots [ 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1358 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 279 165 292 179 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1359 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 151 94 165 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1360 0 obj << /Dest [ 1458 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 290 124 325 138 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1361 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 117 97 139 111 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1362 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 84 115 98 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1363 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1364 0 obj << /Length 2619 /Filter /FlateDecode >> stream H‰¼WÛŽÛFžê+~j#šñ"c0€/IlÉb´//ŒÕ1¦H-IÍxò!ûûû°§ªšG3v $6 Õ·êªêSuª^­fÏW«H…jµ…‘ ðŸEù‹Eªl™øiÄjµŸ=ÝåªèxO º¢ž=ÿî:T7Ý,ðƒ Äžb6~ÞÍôÏæÆª0É•·úu¶äCK•þ2…à8÷Ó@äò™ˆÓ¯$¥Ó¿èÿF˜G7c?ÕA®Ö÷êú¾îw˜‰´õ Iwe§^~w¡þù?ož`Üb-ñ]z.vêú®ì³mÅBbmê7_jõþëýkõÃŒ-fk¢ÀO1X½Ákpwwç{±êŽnµt-DãJ??Ò…›Ú±¤oV³P•j%©§¡Š3?ÏU“ 6.rÕÚÙvöj5:#±%xè“wòˆfïáî~°À†…Çy¦d885K?‹&^ ’Á«A,6Aߥ—û ­.ûÖÔ)ú²á‰z/ß½z¡VÚ—ù™vTÙ5•ÁþZa"Ñûfà ð yCü Uós8úEK?È'ú…ƒz¡h÷º©{SÖv£Êú;9;‰u(Mýlx¦7#„HÈeçeÚ¶^âçúÖ}¯ *^¨Ë¢*½0¬LÕýÕ¹âs¾«ä7ΓùèÉÜéjjUˆ¾¢jò)Uù4‡ÅÉíS‡Â—vxêGjD£aJ‚~Ñ/ î Ý÷m¹>ö¶£a¨I2íÓ. 2VÝÔ¿ñdxÊoìÖ«^LÍïUrèÙÆnáÿHÓQ„ÒR?“ƒg¶M œîgeÃñ}¬vúÞÜÀ{êØ+}£pÁa;‚U}ÂÍØ¿¶|ÔWß÷ªÀCbÜÙ^™Nm›ªjîºÎÀo}¬V”ž½å_ØߺØDŒ;ŒQ;dV ZZyöÐå8ÊŠx{9¾ÍC ‘,'O˜œ¼’°&ÏÔ U7Oj0a¾`²/mƒ„ òæÜŒe41#:™‰/è]”;{nN³å§ýéÍ«×jÓ–îs ý<þ:F†á­5›ù±.š½7Ï@Sû²ïÇÁ,Ÿ¬–££‚4Ìn`Yë-¾ò~½Qm¼y„ f(ËŒ’µÊT•*v”Ð2쿱n}üøjŬb±t+×üXYÃé]¦z%×Zº.&ɪPË H9zÜZŹågñšŸœNo查˜ÈO³)VN•ˆ+¾ßªûæ¨ì‡ƒmK[P³)ÞS”›ueÕ¡mÖîue÷Ý…‚‚9Ô#r¿tÊú¦!1€Ì  Ð?{Œ(!œgå3 Å“xÿà 'àt²)…»CâÓsü YNñsJ‰aø?”¡C´ÇÐIèÐŒ’ #÷¬ &wo¿Ðnëà H æ_)ƒCµö` ?ûC9¨}ò ל €ÑDú‰0|¢Í†°ŒB¸éq™ŠºðÁ6‚—%#Oì< ;%‡ ÉÊôÞ>”-‹G±J޹Ëν—úÑò+yñ¡;Ä©Êßžò߃r ?%á|ôàöˆÌÒ ¦F°H¤y¹8ª”µ±|TA!ÌÏ*¨åêK¹æg$ T. )!#*!ë¦?ïL_Bæ=ç¸IÊw'”û‡¦í•%šv" ™LnàSšjumûI‚dC†q]X‚O7»áa ¤£®SéDDk±7÷¨ô;毚â2·Àq¥lÛ6m§2ÙroaomMÉYÎ’³S€Æ£@aÒÓmÛf¯ît8)”{OG ;ǽÿ9=Â"GBO]¯AF,ÆÆ íýï7‹¸ þÔf ǰ’6€2]‹xL¹ ï)¸xÔ« ÿ±¾ OýfèúÍâ¸GÎ×½A±B?.Ô$ꆃ˜9—z˲þ«ƒ÷ÊbÍyöÆÖn’©;Ñ”UÖ÷HT× &*r$QÖÅßx×|“BS‹,{ä2å2ªÌÜzvr/X8‡G´s8ÅA<^½pGÝ…\8êG‘çä’À¹^E ü÷±l¡¾©á麺'ãÈÖ-&Ý °«„æ…=^î-v‘šëGöâ¤Ác·Ð@~H„ÎÈx‚`(“!¼ŽÄûžŠÏÄ%q%aTÞÁŸ”¸A’ƒp<É¥Û|?\}'f[7a™l´)›À²Úl·"&b à¡RÈŒP„|T·Ê º ¤l7CÕ%Šeê$DÖvgnËX˜gúÂeFª¾÷åÍ®Ww†é+q)ؘŸUTn³c¸x”²[6—î6õ(|¸ÜÙVæÆ?÷IøL‹Ò¥§D^ûi² =z uÙÛýÞ®u ¼òŸ¾7Ç~w…YYîÉ~ðŇþÀ›ŒlÚ›cÏÒÆ0É“•s ÐáŒôq‘9‹ ÌNo¸8Ï_Uß·ÊÜš’É©ââ,ŸòÈGù2Š"ý©|M鯩]ûÆÕ¸W¿C“S†xI6ªa·c•ô2/ÎUÙ°®¨Ÿ$¦ùòðïÄc•·”B<Ö\Ö*ö®Ø)hQ…:À â„,yºÑ›‡è Ã4ñÏGú¬7F;±ÌuRÄG®aº³Ò~½È"3• ²ÐðI©@Ù^Jõ—º„=kãÎHr@ÞÜì˺”ÉÞ‹—¤CSÇu7wGîväÙçlQGÊ ‘käœVŠðî«© NºÚ™iËwFyO4kkkERã¡;8T¦à PøŠ8æ@ÕH7”‰pÞOÈŒµ·”8\±Woµë5,âü­G¶xRi¤õ±¬Ø_1„@ðŸº~ó×wäÆÍš.B¢Rþ?ND=b+FIüÖ›æ øiwÕP­ ®ÿþ£Ú6U`FÖjc$›÷üE?èI. t¿Ê–[Ë]Œ[ß è%ùuCÊ<çeYíÁANvâdS·ƒ äÈfì¨-ÓÁT·Ü©’hØ>MÑËÓ:Š´ÌþPY~EÇ’©&ÆžŽ7Šð™1n¥–€*pOòS CÐMO§ ûãAÆÃ<œp<ûB;é[ïBýz” ='åF–½ýø½Ëúi¸¦'[]ƒv)'Þ B®8gPU"õÈR:ZÞäå TV©~·±·%¡:S°! ­S]_=WƒÔÎv”}˜M¨%#mÝÜ“1I+ŽÐV·™„€Ï¾ ìâŽìS®‰>xÔL-~Ç©ÄÙÍQJN´ƒqoD²LgJ4:÷î/úíQXLj£ˆ6}³šýpô endstream endobj 1365 0 obj << /Type /Page /Parent 1722 0 R /Resources 1369 0 R /Contents 1370 0 R /Annots [ 1366 0 R 1367 0 R 1368 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1366 0 obj << /Dest [ 952 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 602 112 616 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1367 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 448 259 475 273 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1368 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 403 232 411 246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1369 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1370 0 obj << /Length 2627 /Filter /FlateDecode >> stream H‰ìWÛnãÈE^õyÙ&`qxe ÌŒg»ÈlXOñä¢Z³©”5·äòyÈ©ª&©[<‹ä!@0Åf_ª«NSõa1y»XÊW‹õÄ”‡?<¢4p£ÈKÔl»Iê…j±¼ýئ*oyŽ§Ú¼š¼ýáÁWOíÄs=ÏÇœ|2í&úÙ“Q~-&¾*Ô$ˆ7L|ÎÜ4U‰O*Ü1JUc&ëɇÅàŒÐÇïÔ£w=òˆfï!F‘Qäz&Dn¦3%¯½Sgqì΂#¯â›õªÈ`¯8)ŒVïòÒdMg¾òk‡»èÝáîVñë®ÌŠJ|T»¬mÚ@òfݬ&­2™“-åGkij0:=Ö`i0w½ôÈR¿7Ô;?ÖU pËîžéa[‹×ÄõÃÂP¶åïZ®Õ¦q`çÙ>>7oÊM}—€{o=—žK­EY¥r±J Š¿aË˺†Ï+õœ•{Ç÷¡ _ƃ1~rtµ÷„ôHw]S,÷iéÕ×d’˜¼n’7cLUuez\½âŸ=ú¨ïÍ:Û—Ü:}åñg²®+>áì:G˜öÆÓõbƒD®w]e_tW?$\£½Î4å óèrï¶«xßš†x§ZSš¼kÕ¦>1¢üÊÕƒiž bƒBŠT¶Ççª+ò .£}7}ú¶Ù4±1ë3ëâS"¡ŽŸ±^Úgkn­7¾·Îàý‚ÙpWšþ ;û{›ÃÀ uØÝ=Kr÷ñ­1?:1@³v¢>}‰Ñ9þ›¯òW­CL¨äÖ à¹îF7XÓm(WO¾«í^Þe+µ4*[–³\?¥«•×ï¹—×Ê¡mùigw•ÿ™WË´•"³k‰§ ©LÙcŒ×:ŽP8D(#Ùáæ®Zàü1ö ÙS9€L‹÷¬c ;€·àÂã3¸p«F`ô4πʞû:+Ò%–`¥j‘uÕ Ús@éhž%x}öÅ!÷åY™ïKgŽ$ ÙcŸï)*©ŽÕªx2䌘c þÎëí.kŒÖ÷†°çÁ”¼,`åw²dÀ7oS"e Ñ™íÞ9E)LŽÿë@…I‘Ôt±@SjƒáLw…=¼«ºSDHú Îbÿ ÎóÉ!ÿh÷\hw§Wñè·ÚÅ,#LF÷Û™f]7[ 5 ›#ÔŒðJIÓ[ÔÙY-Xìx*€DBÁ²¨dËzÍ~#¬²­¹Á®ñu žç‰f€uŠL"D÷`v…§-"Æ‹]tÔó='ëÖIØ„<£ö` éç °1ò©g#O6õ¾\‘ÿ8+‡™FGâr^&|"ÿk&žiDŒ,¦ž˜*; (º&«ìûÚaõmP0ÎÆØ¯¢Ò§k¦bÄ©$_ÖKÓŒ©Ôá˜÷Õìr;ðB ©£ïÈf",B®ya;þ=êS|]Œ‡lqDSMDߎ¬7˜«Q_ÃîÚ ªLçžÉu˜¸~zTœ+žVµ@Bfž‚bD»oCP¬¡°HÈ—šõÈó.• Fâ‚ò)éG–êd‚,}¦ÍHl®];y¯wöCéЬ—~‡Ül·¹ðø°Œ†»;a01xtz§Vµ±‡UDÈ$T> ¶Çóȶ8½Ø¯¬"Z²²è^\ÈSב†ØZÂ2ã"… UÍ®aùiqØËVKäÄ9ÃEËjFD%l(Õ ûä€Êè:i%£¶Ý2™ÕÞÐ ™Z±7BôQ\1?U0«^’tÁ[:¤öóï„4G/ð·¯?ÃS¾¦a_m2ÙCÉ£f-Ÿa,Iñ€§ä›³þÎuagŠ²ì ¢}ÍÅW$GÑÊCïåD„–5åÞ!žØJõ6ÿEwM襔ÄK&_’º¶rŠv²õþ©kË Qf ãš[DŽPÐÖ3Žª¶#‚ûµ)¸ôeù/Ò©ÜC„'ËUlÓY/“ \eƒýŽ(ÅçþûÛ6ÒBÆoì K“gûVÆP„lH‹¬“yŒ¼L:Ls|™ôY¾ÜãÎ ü<øR$q¤-dw×e^F€žk5žyzЬP«Ä.ÖùÙtBDÍÇÙ0àr Ê7jk,—ZÙ'Q&¬Vä@Ö?b㯇^>ˆÂKÒ;þMF¦ú(=IÖ1å Ž-_ÔøÿJ­pU¾òzeV¿…܄͚'Aä…ÕC>5Ö®@hk4Ì¥$"LgJ^gH¨Áçs7N¨#Û^È–…IFèP|Ú]1\o¹¼°…ƒCUÕ.ã¹LGñ“ q.2$€ežÂc°hD{G»äc]uYQ1¥IÇ9ûFSúCý d·à¡”$!=±Ï;¡±sóΚÓ!ì3*ÁØ*1(þ†AÂÓc"XÖ5àR©ç¬Ü õ\øj4æ/ÉÑÕÞéC’Pµ-÷èbEÈ$Ÿ’õU“¼m¤Q÷™¾’Å¢òúÞ¬³}ÙÉ­ÓWŽÏqÁH¹ÇÕÃéu¸Ç.â$›¢UõŽk[)çMir¨_bÙ )¶H¢GHiÆZ¬8nô¨7‹¥’Fâ |p2 wÙ&ÊêãuYäØŘ[qSß0ñÄ oòï5JWš…×§yqèѱB¦®HH4v4†³³Í‹¡ÆÐçú„1Þ˜nßT$'Ò«6D~ý®¦`¯’ˆ¨®zá²z1˜Š6C ¤keVp¸ I˜:úô†nqÛ+oÀˆŸ¾ã†óU—é¨ÀXg%•'­1ÜÍEÄ‚Ôó„Áôªà_¶#ùÆ6 {«±‘AÒ4+Oj0¾£>3eEH´T)W¡¶$7640]lf¼;éRè²7Ô«qÑSó¶Ö “Áç{^$#®ZPÓcføžûþQ?ðä9Ê`îGå…Î:Ÿ"ÊCꢢ¢“>5äV:D÷l—Œ™ô"†ðïì>yãø4Ó¬(ev¹¾F~93®ŸÞxoÔÉQb˜5)gFóõñ™Ý Q¦L(VÖœì"°²x 9M7hÝ>‡~Äù)öH%.<%.bõR6¨w62šÂÏ¥N,Ÿ­ÒµÕÔ2”ñ£EžXœIZ¬3•4,6–n†Ý.òüÙyùÅ÷ø”„/uÒq`Dwù¿Nþédʪ5´ ½,ZÀi|¼êµ{^t?º¸•øœö Ÿ‡#C#.zª×Á™^ZLþ9¦À÷6 endstream endobj 1371 0 obj << /Type /Page /Parent 1722 0 R /Resources 1377 0 R /Contents 1378 0 R /Annots [ 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1372 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 456 757 484 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1373 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 262 256 276 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1374 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 155 185 175 199 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1375 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 294 135 324 149 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1376 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 234 71 265 85 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1377 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1378 0 obj << /Length 3734 /Filter /FlateDecode >> stream H‰ÌWÛŽÛÈE^õ‡Eš€ÄåýbvíÙìx X ž$ÿÌCNU5/Òhf×@†Gd³/U§Nªþz9ûr¹ ”¯–·3?Pþá'Ê7мD¥yì&™ªåvöåë}¦Ê=ÏñÔ¾lf_~ûÁWëýÌs=ÏÇœr¶è3ýc±6ÊO<å,ÿ1ËyQ®RÏÍlfnâɾ¼&àåô'´ú£þw€ÑEà9 ?tíeêæA}xhº Fmì¤÷Õ^}õí\ýí?Î"Æûßb7Ö•ãér3WŽU÷O³«y“PÍÊYäZý‹ÿ:_þ0cÙ›Às¼,ß`Œ-8®º¾ÞÓ©†ŽÅÖ8Òţ纴CÞéj9óU¥fAœ¸aâ«0u³L%>Tð1ÊÔÎÌng_/0BS¼S4Ft=BD3zcdzüÒÄsñ_–5/à§G2éÄnÛ|]íùQµw]Õ6Ь×2§7Óµ);;ŽªÛvGpfzëønª‹Nµ·üáÝ›X­ªµ‘¹uܘFMGÚY©ªá«¢+nŠþ°”æ_÷gƒë‡×Ž«~ªºM…ïÂQ 9“~åâ×vo̯|b"$ºS]«ºa߃™‹ˆ]ª[¸hùBîääN%‹U¡Â`iÈRÈ»/yÙe•ƒó}ݬï)ˆbE>auµ-jB¦êìÎ×ÚowÅÜí]mTÙnº©¦Xë§ž‡ƒçÙèyf I(‘k€àZ_;ìb¢H…X7%¸ÿè׿ƒ³¾–çkî„ÚUﱚ, õ‘ŽN…±¶Mã3¡VÛÃÉëQÓ÷V¶£ˆÛ¬hø`õ5OJ"eš²]UÍÚ7¡7‘Õ›Èõ"ÐëÃ,UòÚ<É·l¢„)Á‰=±“iõrmº•¹¯J³ÿ¥~5GH`çËÆ‡Az5W/÷ŽiÚƒŽï;šoáw£0Î(‘ïqäØdCæË¹¼IÕܶtÚ õ†'2ø»-'#¥YþÝš¦üÎÎuvp6ŠÜ,š8ë÷¾Ú#_·MWT çÕ Æ9ÕöV¾‚Õ/T°;èí.ë æ¼‚a‰ž³~'A¢ƒDÛ{ûûÊ!ô¹á >b`éb¤é”¥¯‹4g{ÅÔø7Lõâ‘é±ìñá/o™¸Lµ€¨†´5¦ µ`ÒMd]‡¨E Éô;^ñ–gBÝÖÈKFµ¨‘L\p éÇV6þˆrP.H¼ÛCwË tãp‚å¨8~2 I}È=Ü Ù8˜"COaû|zÍ’@Ub¤¥âöjƒú WDß☺~~ƺ±*û¶*o ‰ðmE@qa#$úºH4”iXëª%D'E©[0×7ÄŸ@×,SF« âQÔNZˆÒT÷4žô«až7¯dz³FÑ3dþƒ¢øRSpSÀÕ£¯T/d] ‘Œ†M» š†M!; Hæ—º– YÙ ÅT‰Q6-‰ã!w)‚Ë]†‘7÷qO0¨ÙTž£6PfH´MA%ì† =•”HJt¡xŠÇzÍéÄ¥_z!Ì”wª6œ²Ö¸m]·G{5M$S¯hò Ëüo,MÙƒ =sî,±ßØUÙRY÷ÚÛ+4ÖýË.ΚK-ú0/ ¨Þæ¨uêm”GcÃMy1ÆËãxi ËÏæáìÔ¡vû:¸àÂfòW1uBbçÝŽõ £<<€hHcÔs£'!å¸]ÆÑsÏàC~åó@˜æ¸åLû³¡g‘ÐCX­žFYíu1@ð¶‹æ¸lTåéƒf5®= ŽÝîìQعA†ûNÅž¢®¾@Þíö®ú¦Ýaj‡ugv¸â€ò¥±Íß"â[ZŸkºÛàbÉGªýpJ]üÕ¬\hê,G!ùQˆÁ““.9¢`µ¾÷|5ÓŠ;ß³b1Gfã1Ù•·µÅ /ŃêÛþùh§ÑÔ“Ô?]áÞ󅶨ë‡ù“BD¶]#5~û;V¾ÿ•òPƒ¦·¹‹ôOcŠ5ÅÖ<™d‰G¹uºÛØr.¦ªiP¡ñÞp¡ŠN:) }o¨±I¦æYSz €×¼ƒ|’¿Õ¼P¯›utåy|ÚkÈc¸k¢’ûrW!þ÷â?ÙÑm¨†ùZ4´äKŸ‘{î#ñüœYBïÒäw–.™O6\ï|·';ÉVÁˆŸG6æÈ†g‘õƒ³ÐÆZ'Gâ”ðFD8Öò—#œF8HÎ"üXî÷-"Z¬V•ä7Á¦7kS_)KTÈ”¢Ì×ÅkÝ=Ü™9j*zD´i{,˜«÷Wï¨Á9ÜÂÃÎì®^€, ~—þL.9ý-gIšÓvt—RtÑÓû®¿ŠÈûÎÔ…íûzk±í#Ý®0¡Ýâñ¾çÂEDZÛÖªØÅÖ)ñ?•»Ù%î üúåÚtB»ý/õ«SÖ¡Ó°—½¡§-‡F— ÆVßÀ1j^UA¿ˆÀ‡+yxk_;”àhLqã;;¯a–Å[aŒ}kè 3ÔÎt7Ö»¨XAáD;V)}ßïòøÎ…§w®h¬-ÑpçÂ’ï\R:"ºsÑZuVD1œN ò À^ v€b½?Ôd#yÂü½ýЩ£©u ùêÚWªMD±âî®~P›~ÅÎüñq‹±nåÑÿ¤Nù¬#õˆuÊWòËÅCê x:ì‘QÎÇÒÅÕ·û/íåÒœ(Dáýü 6S¥UÑâru?Yd“E&Ëlˆ‡ª1™üû9ýàr45“É*¨ä>ºOŸþzÊÝdS‹ˆQ!€"hŸ # ôëM%¬u=á‰c …3K™U½±óÐ·Ž¾èY¹–›Mĺ]níåV3Ú Þ ô œ;þ‚ÓÔÛeñ¢¶ŸK>gÄëñçm»w B²ÇwQ¥µ'ª¦²:‡®dUlÃ$èElOúoïr€ðŒCö(¶“V¨Ò*ÙyÁu¢ù@f™L0¥òÉÚæe^§MU_é;¼[2y9æhB8aÐÔÅv+àzK ¬¯®n)y`ê6“Ý$psûóúî^~—_Éë㶨ëx¬+cÁ´¬[ &†˜ŒìŒ¸…–«Æåy *èÙ~‘cÍ9E Ðfð¦tû` ×%¶XüÇ”® ̃b 1bÄ&þˆ{NL'€úƯ_--Õc&¬ˆQñ9=Í\%y•­v½»¶l×Χť­¸´óhŽDkÔ_ëÐn.b‹&¡$ þ“’^ `¼¬ gý’f ~èûÛrÅuI¶]’-'ã>K›QDÀ¨âéís„uSA¤S¼…þ³â^‹MQÕ-qÁ=™oŠ'µqÃ}}¤&Ö«ÿ`´C`!àJ¸"*…ø¨ùL M+éQº Ù#¶j…˜ÌÍǘü0!‹m3ÿ²Ó¨É QëaZ9Ї`É<ôŠ2ìôFnv¡6_í›Ay•ésphÚ!…U­šâÁaàôtŽ!ka…‹5L¨ý¼b-£Uº‘¯‚2ÝéSï qÇo.È87åÇ¢!‚ á6Í(àî·ô&ÀHºß’dþT ä¹HÆ3=³hŸQ¯n»›½9Öäé*iÉ•³œ @–âFV1RhF_§B£ð´=ÖC/â­÷€½ö÷;0†Ñ[1“›+ÌâŽmªµ‰X§&·­ÚVÌ8U's“éÚuØkŸ_C0ÿ §~WñÅA ø^ÞÜQÍ®Hí’ˆC~N ¢85` Æ™‘Z€C®¼íºnj¬Ç_+š> endobj 1380 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 208 430 238 444 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1381 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 284 241 311 255 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1382 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 171 170 206 184 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1383 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1384 0 obj << /Length 2647 /Filter /FlateDecode >> stream H‰ìWÝnÛÊFoõ‹A–€EsùÏÀÇ€c+§nçÔRR¤vq@Kk‹D*"eE}¾Cß±ÙÙ%%™TšÂíÕA‹»³;;ÿóÍ›Qïx4r™`£ûžp™ÿàÇ]Û÷EI`‡±ã±Ñ¼w|^Æl\ª3+Çyïøç¡`eϱGÀ™q¯o>×=þKú ™³Fë%êRÂ"ÇNB`ìÅvè_uÇU×ñ+ñö ÿ§ »}×±ú³CîÄìnÆ›¼šÂŽË¥œx™•ììç#ö—YýÖK vÀ3Ëáã鮳êïr9SL<žæ«Ÿpöõ×úëè=¥±ÒÆuì£ ØS¬×kÛòlÁK|Uâ³Àž´áÓ±]>Ö[SÅi0ê –±ž„¶j{‘Ç,`I:ú1[ÊÞ}ïͨ6†'àˆ³kƺZ„+ë5ž1ö‹Bdžÿê qX_ØpåG'¸?\Ògd¡‰¦–‘%»·|^¨ïÙ¬Xgù“ßÒùbf)Õ$+ét±¦–²qdYÄ›V¬@Vlø§wøC´Êr툧•œË¼Ò ª‚ÍÓƒb"³±ÔÛY¬«ôÎJ‹^×¾A•¼Z%¿QÉ'•Æél&'lˆBûü3ItuþëÅÀŠ h>ƒ`ÿò|0|Mzm3vµ¯Çäp2ãñ[AÙÛŽ¯¬®>âXÛÝIln®Š[~ò +­Õ×Ù)òhˆ=Û‰‹À˽*¶âà»Ô ¬©¾ëCnÓ'¶]¿óúwÈõÛ!†¼"&ûŸ p»l"àÙä†ïç#HÇ$âƒO`û_ÿ8ø|ôîl8ºúpu> ÊÛëïékøYù içÏ¿\¶\^üôêåÅ+“eFz'ªETòì*ÐJíÔ!L<ÛÕ)ÈOޏ3LpæÙ‰»ûn¹¾,ìÐﺃÜ-uÕ–ç'¹\w ¿Ý¶j§v¿&µ­nøåÕpp­ý}y5úÐåÕÛÚ™·í|:{÷±¡¢‡²ëã0 »|@rˆÔ¸öò!ƒ…ÑAGµ“Íå 9díVj·Ì~°™eú(ó"o9mÕNî~ú—±Õ ÿøËÅÙhÐåÛá@@å°W¯:ÒëÁO/'û®ö½ƒo'w‹ï&[©q|Èn^pÈ[­TsÕš¼Ü-3€”&™Å·=/Ž- | ߎÜ-ã;A+@¶"´b€OìdUÊå¹AÛ½f_ÕæJ.7ì¾X2X°t¥(•ó*§´@&xV䄼@¾xÚ¨…rãÚc„òŒL‚D:/ò*Ír|YþZaðˆ×lõ,Ö(Ç QCFW39Ï2ðÄ ù‘š"ØIi…vÌå iÈõï)¡Ç}Áûꉙ’ùâÚ|±–5Í0+yIÔà;¢‚Œ¨ŽR{(ÁW°¶åƒ7ˆpBÙžBÙ ìn1ÝZLÖh÷†ŸáȪ–Ùݪ8KÁQX¼¿#l¤`/TT©PóžM¶F—K23+¤z’Xи2ÎpÈÈh:0‡¦§Ž¶‘hiÅ ·•X&8ƒ 3`6”ã/ Fž®ªiÆÌãi…ÑJCMZߥ#8­à³“&–tg²ŸÎ,{£Åž)œÆŽ1…Ñ|™µ\ ò?nBŠÁœý§c9-f=³Y}r—%ª™å’{Lg+Y ¶PpŒ¤Í.aèšL2¥)Ú¤mÚjâQèxD2Wéq‡z >c43†0P§QÆ¡£˜^R·¼”’aa±Å­uáÙ„†Q›ÆÑ¤GKKà­…Ú¤?ðRJ+ÉÒG¼áñ4›¥w3‰þ{2bqð¶Ê[W±ù ˜mp[•À½TSÌü¨I³DÅÿË4QÖ9:&M‰¦6 ]›0ÈB (Ÿ/ôªT@PÓ‡rcA´ì!ËÁ,+}„6YžÎAq}Z“ˆ%$ÆÝF1Øyi^TÒ [€kM(oÕ%9(ŵ’n²e²—“`._ß«ϧs›–*ͧF×;)ó]…+¶Îª©ºŽÉŽè© ,4NX^€Qì·üÖ‚0ô ’VPebž+Ki„EGpH”ÝØ©E·N;³|ÿ”ä.CNòe¶¨N5iŒêSä\tFNßôèÝn½”‹¥,Ñ`JÙVßçÔÒãÅ<ÅU†ñìñ\‘ .àÔ4!~‚² .S Ì#mL¹eÁá€h£‹ïÏ.¯Èb«TÜsULþg6jÏS¼ æÞ[ý§ý7Þœ&ÞDìj¼”„+EºèÞòÅ +l%¿Ul‘–åºXN áØû‹€M²YVG, ™Oð8›º¶ïé[#+xWé̪ÍB‚Õ´s÷•Ü×Ñ$וÕOZ Îó¥–šŒtæ` õU ýÜê#Vz (§}T íݽ®±GÜØC¤‹mN‹5;Úãa0`ŸIµJ¡â¢(€uÀ‹õ)õô€êZ@ºEæÐZhƒú‹KíÅ& š[¨¢WC…ùÊìÂŒVžP§¼W7°% Ó’LáënÕ}7ÜÓÿwÊ»o5 ‡:£qßËiAøÜ¸¯‰….•X÷J}°UbW1=ÞØ"Ĥ¥´¯LWë}¼°­«ÙcÈ.­ð3·ð@;p§P;kF"Ð ÷™T™o˜f§VT(Rö=BåPå¹µì§ä Ÿ¦Êê…iÿ¥+9B•&ðݸ˜­æy ®V ?$¦\ÞZín‰žÇ-WHÖ”½PñQì|É`2z¡¢õ5) bYà$BFý›ùób9Og³ l-–Ù<…Iê Æ;ZÛTÖÌKKÄ€^ r(½Wy8î·A™„©× ÷ðmšOØzš§ mÞÉ-ì VG+52ÑqÂÜSsY)Ñþ3…†ètõNsœÉqerA:9ÁwÄy¥i·Ûƒé)††¨à%Xë–céò€©LUmpŸ6Á˪ z`wô ,«¥Ô(¬?é²Yé6qÄ`fѦ²TqoÎä–š÷6 ·æf.W˜šŽqˆÔºûª#–¨K¼³7¶‘–’0%Ž&cwÙêX•¦yÕÝM 16…¶É `> endobj 1386 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 171 757 206 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1387 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 171 631 206 645 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1388 0 obj << /Dest [ 1385 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 563 302 577 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1389 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 389 174 415 188 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1390 0 obj << /Dest [ 1365 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 455 147 482 161 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1391 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1392 0 obj << /Length 2995 /Filter /FlateDecode >> stream H‰ÌWmoÛÈF¿êW ²,L†ï¤ ×@ûÒ´—\é\ãâ@Q+‹ŠÔñÅŠúCúúû¡3;KQ²Eù®—E‹»³3;ûÌûËéèùtê‚ÓÅÈqÁÆøãÇ®åûvÑ8°ÂØö`º=UÇÖêŒ uZŒž¿ž8pWl˶<“ŽÌîs3ï“; Nè‚1ýy4VLcˆlk¢`/¶B›å*W±ÓW÷'ñowM×6LdzBaÇ0ÛÂd[4KÜq…4P’¨³^¼>‡¿ÿÇ0\WH ¬@d†-Òå9L6YóOYåJˆ'’bn˜cÿRLÿ2R/V¯qm+ÄÅô÷”›ÍÆ2<Ë5Ý*éZWZøi[®HõÖRIº™ŽÈ`ä¡å…x‘Ç:ˆ$àý*9ZŒ^Nw`x±Ñèѵ ¡Ðë-ãØ!…¶…ÿ™a³ÝþôIú/Ê|.«[Qßp+ 3FjÃG˜$ƵðÁέaÁt‰(Þ'†éá[òV.›JêFÎA2s·‚º©²âîfm©Þ,`&¡\tg  Äæ´Ž¹1ÇŠÄ––žXKh–݃uLÇÂg£QÌþ•ý#Å2©!¶HV³ì®-ÛZk…X¯+YË¢Iš¬,,ãóoµ§£Ð€$»‘6wÊ6àc>C£i`3ì…ŠeûLawjÑa¯ü%°|/Cz–+|úq„‰~ M,Ðp•òªäÕ\çðö:`^fšg†é¢î ÓGIúXÝÞý}ô~>WèƒpF¤H´´íŠZŸ¬.X£u¢‚&u½ÑŠTsÅ ‹°1:Ô(¾¯ÙQït?ü úH$†2rQB[$RV¸ï Àx\’²p—ÝËÐnä—Œ5ç Wëf |^’ʱ`rKÎ䋼-“‰ :7^Ä ¥áˆ “ÑëWøä1>C‹7èùä ;áŽÐòUȹÅ}ì+áïö•£y’ 0†²U!!…V,à2ÍeÂߤ|,ä—f½10kˆ+6& &øúîüj à¡ÐÖ -èw\K“PKD› ATž4r…ƒ¨õ{ Ï3;#Rˆ*.I›| e!÷ÃuçNп5à·VF@6B å”N@»t…à44þE;o–è# ¤cZêηü¥ö)q ÎI“.¥>Ðû×þAòµsx‹_×eíÀ40Ȳ;ÍÕŠ.æè´Eªß3ý#»yØ»¹®Nµ²aä΂Ëäžò݉7/7™J~*\Z˜ŽS‹ÁìÑëÒ2oWÅų¿¦³õø³Ú œ©€ŒØ¢¨à³Üž¡Gy⦊²Dô=‘ñ1è~¬T(ÖªU’£ÙXWÙ*©¶(%Pš'oÌŠ¦T0t7UÐ$³\b<*SµEöK+‘ÿ¨ËôeÌÑe,›£SfTÕɘ$v,ú+Æìî›o³ÌÒ%Ö#U‰:ú²HD«Ú>NÖÃçv̨=¸¦þbÖ™–˜Ë´A2}J%G¨óLÓæI“<*gÿ¯5;üJ5ÛûJ5{WtzÔü5_gÐÅ^̧%Ê-”åø²¶–•ÿëTÌ7{±žT¿¸7Æhø„Ÿ—gós~ñCÂ&GV.²¥üØ*'¼ƒ|GÅ–òfAðªÊP|cò$ÂÊ0 k,x´>]·T☨Õ\àÊ¢Ô]B×GW£¡{W6ò>.»dé²Äe^ÞQþ"«b^M?3)¥¤á¨ð«0ñQõ+tT&³‹:ä?Žˆn .0œæø0«d9\NƪœD¤Øá_b&« àtR÷/ý̱¹eÒ/ùW4y4œ½ Ø¥@ŠJn)bõGÜx·NZy™&9FI ‘®Þ’¨9C¥°ýÌŠƒ–ÐyHÁ¥"¢ÊBÖ %!:]òþ\òᄂLoÍå"+2ƒ©¹T·kÉZúõCwT(\¶¬ŽÜWç3ùcH4Âp•laFÖö»£*r6Zÿ¦AïàÓ”ñyKNåYZæbƒR ÁÄjŒaUÚ9„"¢¥¬%¾ù(x„݌ڬ¼§:£ºR{וîYü“8VÁ*Æú›`‹»Ú‡ù:öTtU ’¾b©5'îBÊ9»Çœ«\šÍªN©…¹T9@gß]ðxøbé#â·‚/ )uÝXð¸>ˆä‡^÷^³Wß|IVë\²Ù¨ÇÆÖ‘Ü‹®Ì½ e5j R±¹¢ÖÏR…_³kDœ®•à¾78Ô蓸¤tŠmC®3¹ùîæÕÔ0q|?Ln>üô×›Ïß¿˜L>^óæ·¾Ë_“ß½ú‰ÎLxýñÏ7nÔ•7ÓQìYvì€?ÆŠ‰Ã®åÇ`ª¿•-ž¦áŽê»è6ôÀŽ-×d‚¼w·ïkªƒWø¹Ñ_NGh8ÿáO[ã[H?¢s6Úz5R°½¹þÓ³o~xvù|Z2ü2!6©ñ vƒT… SO sœý rwwŒnÖ?Æxж»/¢”<˜½‡èGcÜóÑŸbÊÐeê[A­;‚ógß¼{vk`¬¿=Uê<Ê+á ÆƒTSOàtœý rwwà ÇùQ"¹¯ÌWi| ¯‰€—]¼»ïËà™ýœ»ïìÔ·EFL]çe7q¨%v—i•a°bãÞ¸¹º€çÔrêW¿‘#Q€V˜{àž]O¶¨t<”™ÜûEÊ9ýì¦^ÖóUY4IFCUV\PðSëÝ‰Õ /D(VG¶çì‡\­TÁ´bB¸×¿W¤¹/ªg*AG†¾OâÅ}’”—òd¦šßœG¨‹a]xo¼î,°¯ÿÁ0©þP¡“I e‘o‡ÕñzyñNžîÖ_áÌ“2HŒOð>vÐg¾@Íd14V%qæ*hŒ™•e.Qî}’·RÕ‹AXÎx§Õ˜µš°HR kp¾`õÂ߬ÏCZÔ 6=FN¸ç/j,'M•ÍÚ+.¥ TO¨‘ ,Ců¡s•k¹HÚ¼áׯ'®0û;º¯ ÝÚtåƒ÷=1̱0³—ÆS¬OS,ϰºÌú<<ÆB]”)U=¡È/2E¨æ°(+è¢[¨ÊvÜžmá²¥êïk©eQV˜†±|k¢ü/ÛU°Ú0 CÅGæB’­0vÛa°c÷n˜Á[Gcìë÷d=›Ôëɶ,É’"=)F°f”>ùv–¿ÝSHȬK Ç„ÖúPÅù:0»}-ÐnVÑdsëlîQ]Õ¥Ÿ˜’9ΘcHñˆ…aeÂÞÜ[Ì3%¹U²óM‰3ÕÑ«Q¼Ú˜~–(vø†Zž°ušº¢z9é èØã>‚à±á†,\(¹,&Ÿ‹’ª¶é£Ìg#|ÏWâ|‡lIO·ÌQF‰1ÙUA£j`êÌ“rQÐß¡ëTö/ØÖ›§,8 Oþ½ýLÛ‘$ó•Óf+,;ëuÙÈ2X]J^Np}ЬI¿Eb0“–6¬­ §y?kI·âܲœ^5;u U¿¼%zêA©|2T‡9éQÁö”—/ŠF÷Fz(œÙK¤|i¢PJÒåNB”µøEííÇ„ó'ÀŸpýX endstream endobj 1393 0 obj << /Type /Page /Parent 1723 0 R /Resources 1398 0 R /Contents 1399 0 R /Annots [ 1394 0 R 1395 0 R 1396 0 R 1397 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1394 0 obj << /Dest [ 1150 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 221 536 263 550 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1395 0 obj << /Dest [ 943 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 348 282 370 296 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1396 0 obj << /Dest [ 991 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 464 241 492 255 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1397 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 196 76 232 90 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1398 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1399 0 obj << /Length 2417 /Filter /FlateDecode >> stream H‰äWÙŽÛÈ}×WÔK"`ÑÜI¼t 3FÆ­y‰{(²ÔbB‘m’jYþüCþ19÷Vq‘ZêžyM`¸ÅZîRw=÷Ýröz¹ô„+–ë™ë ÿð$žN$âEhG‰ã‹åvöú}›ˆ¬å;Žh³jöúã­+îÛ™c;Ž‹;ÙlÞîgòoé½nä kùÙ‚‰"vìEÆ~bGŽæË4“ÓWõWùo»sϱæ®oGÒIÄê nU·ÁŽ'•N²-Zñöã+ñ÷ÿXóëg¡ÊÂrd¶y%n÷E÷C5%3ñeZåÖ|!Å¿ø¯õÛò¯3~1¿Æsì‹åì±ûýÞ¶|Û•-IU$¬!ÒÆ§c{23[æt³œ¹¢3/Œl?r…ÛI""–xcˆFÍÖ³wËÁ¾‹+α5Fë:dÉÖƒã£Àv\lßOb¡—½Qã0´cobUì«â¿ úº‰•Àâª+¶ªíÒíCûwÊë7âÛN5±®q¯:+ÆnWà'’Õ½ÈÓ.]ñÍ´UÂìo•¶#TLNÃhÐË[ØN2ÑËíÕrµVïëªK‹J墨ްqc9°5ÑÙqï"\Œá¶ÐL®Z+‚Bª±B;æ÷ì°+j½WYY¨ª»>ÕzÎüq—¢÷ƒ1_2˜/1Ц•È´²ZÏð=µgÛ_~BTA²µ ¾ÖÜCðŠ*Âà|$ÓNm¡çe5½AMW{YsK‰È®kŠÕ®S--]Iʺäôç•9䪺R}Ø=c—½øU~PëtWvÚÉK~ݦõ­êŽßË‹4TY±†yNas;yµ3¼W§‡3jÆœ½Qˆ§¥,-ªH@mhy!ºô^èÏÞgÉÉEj«þÒF 8Ì\$×ăkºMÚ‰žÛNÿBã®d ‰©à$›oDMr˜5RÊry›B ’«Ô°¡¥/ÅÑŠ‚%–^æJ¥W6â³^ÏMQ;ާ܀'jˆ¤g@C½°Å„Ú?ŽŠyÿIÔŸÖО_h;ößäM~¼^ðlÖBå¯tíVú  GøædâV5ÈYmÇOŽá…^,UÖYZ²®0ïlÓŒ/Á«µCÝ F³«Dj¾Ïä´ed€Pî¨XÀÐÚ:áÔ:ao1)œËÅ'¢Lày— ´c3£dõ!”#Zª½ˆîˆÎšSm­9þD©ÒG¥­¬‰v•ùzè-Ú •ÊÒ9TÚDy±^«FU™î•=•êöJU\ÉŸDÊWŽ>Í…ΕýR˜­ƒÞ‚£Žï°Ó²mÁ“iÍ @¨Pš»ý#:UÑ##™ÄCS¯JµmBo,§A8æ´Óç4b@·«í®í`Ôn×Àí¢-L%ªîK%šz/6|À;Â3«Kkw:™¶•NæF=4ªEn·:sIÙ„^Jà[¥¸ívŽêÔ€¬ÜXàúØÊS¢ñxÁ_è¥pq svÕ%Ór§ÎäÞÙ*ç=“–ŸëNé‡\‘ˆýº²\פÓ5¹ úÎ$–>C¼Ãþ.ÔÈ-î»J_ê¸Àxr˱‹÷št**±' f?¸S°=«N}ï8/5a£©vüಣÊçSÈŽÕãlű¤£±¤ö3Àbk…76 E8·ŸØårcÐÜÂ!CCm²›ïp*‚‚ÏÏEÖÔm½îÄ-·ËPþbQ‚¡úsmzcbô/®:vHü½àX4ÈY•×·7?ݼ_Zs <ùñfùáíòæNÞYzãímÉÁ"²ð.N@ãK‡aÔ^Ä>=äfp‰øùÓA.šŒgN9£à”øü9°îˆ“D£Á@ÃBFƒòý¯_¾Ü|f£,?ý|sõúÈtäÉi¢ˆ8_Òñâ)GŸ>cóä/÷²„AòŒ}.œ¿;?~õ¸9žOc©?24íDÓA` |¨Ú‰÷MÑ©²¾'“#ÈĆ™OMàÃî ïÿstÇ*NGƒ =B”ÿ‹sSy¾¦Z£gF²l)ØS›ÎW|oˆÏíaCA]ØEk"ÄMp&&CP8G„ÃCFl¼b¡˜q)Ü~UÑŠÛ1sú]·x³ÊôÏŽš!d˜ÝݘzŽÙ1bÍõ– ò^óÛvuczáF™GZÀ޼*õÙ£ê^¦†tÇt‚9Óèy03*ˆÖе­¡¨+aÔX[Ã}¡¡¦ßý.›þ5ç¡ù˜á}Š+À7™5uj´}àFt0aú®wPMS7-€ŒAÔåóð€†’÷{Œ÷à‚@ýxb„ˆÚÖb\k…ŠD–wÖ…‰h¬ Ž© ¿RFÂÑiY^õð&’¢ÿEòSIýô™ ¥+oo¾,õ>§Ù0r¹¨ O*î £.d½ÂàC•µK˜í§°ó2è æ|R1?Yl,Îr‚kcõ‡&±üÆÎ-¯…^’b!)† ‘ÕíWÏJßÈRLyn?„Òš€[•1­æ EÞë[¨A\ÀÅô@ZlSTÙ;sÙ T‚¨åÎ08‡½Ý6º¦ËÑ×À£<‹jyYÖ{LÐ1¢á”Ò#+`^Š#E›˜dbì>(¾Âðô#ø“N%VôÞá&V,ræ¿Õ„’°pÂFL:OUÑG°(L¨Ž¨[ë­šB$0'ì¢l§Oô_Ãq2DŸô¿€û|ʲ³qqqÀp¤‘ØýÍI-gâ KébÒ>þ”/u9-ã,&½vìa.÷0y{À‰éäIç`B*Jƒ@*¯cyO{扼I´»£<V.È‹'éD‚ì/ˆ;3í òúq±QkÕP˜b<%®ÿTÔÒ¦h몥á­5:Û¤Õ½Ê_ï*Éjv — ”¨è>…&}âð©ÏÌéǽaA ‡8µ—h@ÿ¾D£ÞTÈ´S81XkÑ¿ýØXV K5/[l莑([ Öjº#»í7ªâBŠ®‚ i‡âø€ÒÓî2äb»Þ•Ü&D°¿I[ÍEåÏ蟜À’^ €€,»Ôíû·kXÂJ«*?UþAuý£zƒÑ³Zk«Ob¯/@µˆ UÄç"¤Ö•âŸêÀõ6B)¡z‹’âØ|¾t-‚ù½r˜Æþ;vX' endstream endobj 1400 0 obj << /Type /Page /Parent 1723 0 R /Resources 1409 0 R /Contents 1410 0 R /Annots [ 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1401 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 194 756 230 770 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1402 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 188 735 215 749 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1403 0 obj << /Dest [ 1371 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 197 714 225 728 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1404 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 240 607 268 621 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1405 0 obj << /Dest [ 1016 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 458 553 486 567 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1406 0 obj << /Dest [ 1458 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 323 472 358 486 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1407 0 obj << /Dest [ 1357 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 177 133 205 147 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1408 0 obj << /Dest [ 956 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 418 133 445 147 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1409 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1410 0 obj << /Length 2741 /Filter /FlateDecode >> stream H‰´WënÛÈþ¯§:,š7Q”ápìl°‹l.µP MŠ€"G7©ˆ#kÕé;ôû£ß93%[¶³ÀA,r8sîç;ß¼šôÎ'“@øb2ëùðð?Q¸QäÅb4ºqâ…b²ì_7‰ÈÞã‰&«zçon}1ozžëy>öd½Aû¸íÉé\ ?Ž„3ù­7æCc1òÜq ÁaâÆž‘Ëg>NOØN–ÿ °:")àc”ˆµêÍz¯&û`„>¶xÇÑè¢ëQD$G9Jîç¨ä(ö\üïBéàgùBÃ<ߺÙe9r£±u“rui‹ŒÛ:];b9w°œH¥Å7µ_dãĈ…BN‡Ýw±à‹³W`M°†ï&¤äÀ$Ö² ÙxƲ¸³Ì–ĆL¥Z;CXr`VhÌrýø sFãGìÉÌžqgÏØœÌÕ]‘)ñÂ˽5±µ†–GÒwèct`XdS¹^ù‘†ÉH˜×6«ñÈwƒè «^Ü6ˆgó 莄 ¿ÌS6º^+…¡Ô»•â/í7ßËþy¿Î§/ô_^˜-·ß ´ƒxóêÚv‚…Ä"ù¤ø:nör›ŸWYáŒàϬÈD£´6oÕ¼¹ö‡…U{ç’ßz䇮ëJ§E¥rQTÜb£9‰Që]N¼.'žÍÉe£Öwj-(Ö{ÊÃXöA€DÂA¶¹y˜Þ)굸ÌJgŒ¯…ª4…[‘iBˆÍ÷«‹ BÌüp_]€ª6U‰õ,­Df¼3Ž Ÿs,é³2®ÊRètÞ8„oˆÈéJÃSª?”5l$71Ø›hšË6Àag$µ^ÓV ½úòâ‘®xÖÐ*]ª³6ˆ\‚lòw‡Ü.ûh<µ~¤ØãËÊñ©¡Ó²h×gØ3M³oÛt#tË%Í—©.¦EYèÝÅ¡®nzìŸhÿ òýïoÔ,Ý”Úä%yÆ]¿Ãël­™<’°ÐôÇ 3#á „Jfi÷2àíµt÷:óXò°S24Z&@•cÆ'Á ¿´éw¬\™5*iI+Çzj—†—)û–j‘Ò6t5/­X0›0²§3¡kqëp±~th̽å¯-jðÉkg’LÆ^ÑNˆü’ðÆ·„‹™‘C…QR³N6?m'q¡=àí±Ïàm“­‹•.êJÔ3v«C¾—ä"õÅ\U¦ã•éøuZº‡ÂS9è Æ»ß*œsù®Öê¢Ýjkø1|²nÍ, ¥.ª¹Y`¯˜:/jgÀÆJ„®çâÿ{EàlBJ›4¢Ï£0§—?Æì¨Mÿ˜— §oµª­jÛQyaRTF–»Œ¬p‘f™2ívJþÇ·…V¶„Ù×£:õ‚Î߀#I&OÓF‰YQª¹h´JsJÕ¦¡ð¬¡Îfm¼DÞnÙì®+®ò%2HÏ<á/òöÓ»ë¯6úŠêÿoo^›·[пOï(j‰©Ó±üúëÕ³|ýõæ5CÏßéÌÏׯi(šÈO¦j°ãíû7·TPd£‰Jj¾-W¥"<ŸópîõðP´H±¨·Š+ƒÆ†2¤ "<’¢bãîÔ ìÒÅRÙ¢IrJ›r…)R6"ÖMÎŲ=¸Veª[̹ºQWðÆr÷^ÝÃ1ß³)û`?ãÀ‡R¡ A§F¦†¨sK»PÓèAoÃ3e6JN@¨)€¼Ñxm|^¦;K 9"S…`gå&7L;’Äı‚¥3 ÁÜê_­ë|“i»Ç½Ýaàzã=£?j÷AxPÌ{øb†[Ñ1ݶ‘¥§á1s}ð%DärV—9zžÆ+EËÀæ`Ö\é͆·NUb3c„ûÆ«Ê õÝóü*L؈?“_sò²Åx`<ú þ,:´¿Rfû{&C+ òûFQæ1FvæW4à0Õœš}ø: j«Ž÷d¼_ÞQ…oe:E³£ó.ž1± ·‰·d´««’®TߦK 0ŽúîÿKϸ8¡¾Rª½Ï‹þ(%âÔHµ\éé­lç4ÑéH‹1„Üc&:C":ôÂcÝ<®xÝðf)hv“𿕆ÚdQ-™ÏµÒ6æM€ Ç0TO©ÁBè> æ ïÒrC(Fè Ì×"Kù:PDuçœè™îík> NÂïÃy€â­´±Y[K›½MÍf: D°}M=ÈÒ’.*>ÁBÈiàåÁ95¡?ËŸx;Æ]é6Ó¼¸+€M#°t‡y%BF#ù/Ê?aì¨ßSšzgö›Xó…‹ôÚÖPrl¬ å*]Ã#>=52¥±lÔÃáÔ!3·m½þÆ sµ.îH´¡‰ ÄÛ]•ýúv *jÉ\|¸¹rŤÆ*ë­™µÖæ Ø9]DèÛ|¢ìûE&BYÊyžw] qC1n*ë•Iß„¾éSÖ˜‚>´žQª=I%5ne"yëz)Tš-D »³øCW…‡ôÞ„€cåÐTkÇe¡¤›íÙ¾¨±p¦¸’åLI1 èæ¶o”Ç[.g÷-12 w$º–)×ij{@õ´²d¦¶^ ¤pGYýVù¾ÂXÕ$f?uÉ]2¡Si™ k•‚kSAQšÈ’òÀ{Œ‹øí»çm‚x¡Ï컢K©´Å1ÉEß&8ȾØòoQ–T)iž¯•pdC.¬Mzó³<Ð|nE÷1ZÇà0ˤ]¯¶ú„I$ÀÓVt½,4ÑC¥T3- b³Ã–ÉkuDO-QÃ0(V< z¬°•ZÊ?W§35î25n3Åa]ÍRóÀqŠå™ ^¼3ÈŠU€E–ï;Ä]1Dk¨ðRa6*tæ|o›ó„sÙhµÜÁ]õ`‰`K%p NýÄ} â|4‘t“¹Ôêwnôâ%¤šeCÝùVáûü|#ƒa—öÕ;°RØÎHšM/ÍËكͫí±ò©nè¯ï}q §0_E+×Vbrº«ü}‹è@ÚsÔÂ;c´¥ÌŒä–ïo5.–3BÿÀž²»7! }ËjóC&õIL÷U !<á4󬩽3ì‹ Vä‰!w²)‚'6á8,Ø f NØ‚]´!¶ñ'¬£â²ó˜¿¯Ì1ÃÐÜlȸœÌòY±*iâ9fj¢$üãÌÚT rEu"ñÆŒQS³Vrp"'Ó2eDÑv0 #bgä]ÜgÀž(Þc.AÍ|ñ“3HN°=°áñ}¶·çättZ¹²oH•ýXW"Ä\‰ÛŠJxàÐ…nÔžFçPšÝGƒ,¡AF‹f” ’¼bqf8áå#4ªa«Tè5w KÄoÿ(‰ÃWîÀLC¨Õ†…†RŒ¦f|¥@#C!”L µŸ™¬†ZL52wêƒ&y×.Ð5ä! endstream endobj 1411 0 obj << /Type /Page /Parent 1723 0 R /Resources 1416 0 R /Contents 1417 0 R /Annots [ 1412 0 R 1413 0 R 1414 0 R 1415 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1412 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 262 743 289 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1413 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 228 286 258 300 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1414 0 obj << /Dest [ 1400 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 257 256 292 270 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1415 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 262 220 289 234 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1416 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1417 0 obj << /Length 2904 /Filter /FlateDecode >> stream H‰´WÛnÉE^ùýb¸ÇsçPð°%yã×r,.‚,†dKœ˜r9CÑ̇äòyÈ©ªž )R^$2§ïU§n§ÞŒz/F£@ùjt×óåá~¢4p£ÈKÔ`»Iê…j´è½¸(S5)y§ÊIÑ{ñý¯îËžçzž=“^¿þÜöôÇìÞ(?‰•3ú{oȇ†jà¹Ã‡©›xr/Ÿ ø8}Å þ¬ÿ`¶xNßÝD{©ïÔÍ®¨f˜ ´qp“.óR½þþLýõßN?ÆxµØuîxz2;S7Û¼ú‡YÏù’PgÅÔéµú'ÿïümôC5fmÏM0]bŽ%Øn·®º¾.éUCÏâj<éâÓs=±S3¾éjÔóU®zAœ¸aâ«p঩J| © c”ªµéÝõÞŒ0B[¼}4Zt=BD3z°Qzh£ÉAâá”aL?ëgˆçCkQ´µsäFC«(Y+j ‰âk'–P8€ò+;*#STò¡€ˆÚØIÙ¢¾˜«FGçUÞ9öÍ7_Äè¬RÛÌ®î½\mdX8´ÍLÉ踵[ßwÉÓ¬I«…u —,EH·ùì1îü·‰´ÙÉÒ¯óWJ¾*6tV™4T·ÚñÙðrÜò$·Ž«äñ>Cˆk£ÄúËDœFÌÕ‘­ßÆFŸõˆÜ)rS­~ÝØ¯õÎÎ,6eW‘0(έßZûÁõbz!8|üì+o£z[dý¹q¢:Ð]/jÀ6ÐÑ'‰÷ºPf±ªvlHì‘ $½‚‰žWJ†v 6œ™‚Ís(z £z>5r…š.PŲRæk.£J-~JêË6ëU|³Ê;ç²ù|¹…'TK•M&öF»žW8"Áið»à„˜k\,°8Ujn2zHš†åc½UÈ>3šv˜T²© À÷s£&ËùfQ২²¼È‹{åøž #{‰EpPGß1ã¥\.´áDGë™JŽøóTYùTv4p<¿µ¾/Z•Õ²œ©ñ¦R“¬Pc£–w*+vjŠG(Lœ>™¸ÊTµ[Q #„gY‰6íˆt¶çÎ[ï7ËM©äF8õjmJXVå0ûV+8]Vˆs¶áûdX±âÖ±H~õ5[¬ì­æØì`C´y^P¾IõUeã9Ék媭qRöc]ðˆx‚>èc-7Aÿ©²·v§ÉÉ)­Q™°ß3¾1£EBân¹wù­ã„º s¿ö>ñÞh $69 (‘Àn®Þ_]Œœ> ˆ~{ýþòêÓ/ºúÙŽ?]ÿ(_7?¸øE–oìšüüpýîC]¾ÒÐõR_%Qà¢ÌPÅêÔ­o-ÆI½HCw9öRèqêðÓ«Í»pŽzÕÇÑááãë(·mÍLS©™‰Ÿ¸¨›\3? 6¯>Y¨>ÊÏ5(Ä;ã rÀõ»·î!ȯ?\ÖÛ~º‘M(½üÖÒXÒŸX?.½ºWKÿ—?^}º²&µ²½»üîù³·Ï_¾Øs”‘âaJüäܧWÉÎvõ´¡OÿÆr ð”©O¬¿9Nfk¢?Ï¥&ÓÛ€[8Õ#øÃt dØŒb<ÕaX°”­çžåà “‰y ¾8©²õ½©î OU(Ä&`7âgí^Fî¡dTf[ò²$j7 ÀY†ç2!åY }e³B›â/£‹PTMÙy…ßæ}S3Ç„F6 Aô9±#ä*0ëIûnœò»¾6ɇ6¬¯¼«Y‘±ŠCͼ©&š'Éj4‚w ôf$_H-DÙÊ‹s¦ÙƒGü•b·-ËA73N³Š©$ŠÓ’2ü«C©ú|~Ÿ¡u,šZA²¦0‹ñrˆ*ƒF‹ÒÍŸß ¿‹0ñ;úµÅJ(ú—Ó­pÉ¡»½&réáÉY>GAiX®Ï¿!c‹·®¯/ß\€¡Ìw¨™D° r^™[ç í8†™Pn¯‘A¢+èÚbÖ'¶}~¢Ù· ÇÀáyð'zöƒNtÈ{Nk'áZ›pâ™IA%Oq?† %y¶)ÐЀʳКP™ì•^F åwo”ñëTƒî-è:ÂOS‚sÍšâæ t¦ÃÎñ >nI¦Êá+ JÄŽ4l¼È\x¸d ^].9¼‹; r|UÂá|ú*&õŒ]Z?ÐfîŒxÈlRvh¦DˆJR[¸Y¸P¨µÊqü-jä˜rÂbl,æ„¢XaaÛ]³ÈŽLÂ9CPèB=ޣ̃½o§&óœREü˜ˆ]BÙ/€²½D8õì Ö;´Y›þ6›¥ÿ…Í@lk#ê~ÕZ"£Y²Žš¨,­]kô‘ÄÌ}Øòcj4ÜNˆO4-ÇZ6ˆí8à` ç…ª×l{Âs³kÛ^P’/VÙæk>ωQ:“µ“léJ¶³|ÂÐŒÛ ÛûIÇ4éö:¶Ñ¡HZ¦‚§«Ü¾GF kìH–g_×­Ò­ÎÅøºßØù áßå÷ªä.¢<£žvmÐ;”ŽoÝ:„ƒ­²52…ºËÍ|ª.o¸Ï¹¸¾¼bÈ’*JcwI¥,ÕÝ ‡— 5Íïîp¯u޲߮µ[ÔÚ-²5wIÚYÅ}î|}ÆÝ¤’n¶›ù’¢b ·ðE{’ÍUï•[V™,e‚& ̵³›e ía2ÉH7@aåºàúì C]ËØ+êÓV°\¦Ñ´Ú+DjŠ&›½›¬&¶ ›fsΔÃçè—ò˜™rÞ›Úü0¨±Ñìk¨WR­T†÷OfŠ/ÐõzE¸$X›¯Èƒ|ß:®zd¬§›Ô#N† M¨á>[S•+3ÉáSSK=Xz°x2&xâ'•´=›«Õ—xªÿŒnÇÓ @qWôL®ñ®/=±‘2esÝC6ßH¤`˜UjkÃCí TmdXÈÝS5ÞÍS ´öÙæÅ/€»Wª-–ºÀøÈU6HS"iÙ'ß}D6Eâi[Ɇ]ø7çìŸÉÿôûÀŒ3¾$ÉýÏ@·„¶á¶ÜP°Ì”|ÜB-…ψ`YB#¥ä«Bçw,áø¡ÍÓ¡5‡Ÿã|«¹# Ï ÙáS¾ ý$Ÿ“¾“NQë‰ EëËF“%9Ú°u´¨«ãå¹M„ßÐñ1Ùã+;²4% ÒÔCºñΡ.ìÒa~¸$òÁ«7ÐêG>üž¦,»ćp‘JýôIß:L†~“š‘ßUó#©I¥ä´šGû4¨iVkS’F,®È÷¼Tk³X¢jS £{+û;¶¿¥Q«ziÆê8)ÉÉŸ9Õü…ë?õ£õñdÃ@_iãÞ=eÒÖiý½ÔñžøN¢u¤¿ŸA«|aºäC::±ê<ë.ZÖ¸“kAî['ßgŸ/íÆÿT^Æ8‚0ݽ #‰®ÞÀ#8«‹·—ß_Rq!ŽRÈã¥é?8êªêØh²Û•?Dï°ì•K> endobj 1419 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 470 743 511 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1420 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 238 638 279 652 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1421 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 377 560 418 574 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1422 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 470 525 511 539 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1423 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 383 447 425 461 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1424 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 255 326 296 340 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1425 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 404 305 445 319 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1426 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1427 0 obj << /Length 2218 /Filter /FlateDecode >> stream H‰ìWÛŽÛÈ}×Wô‹2°h²Ùl6†;^,xs±8yÈN8g†D*eEþý‡ücRÕÕÍ&)ÍH³Î`±H0Àˆ—îêªSU§?ä“7yÎYÄò»IÄYð#„%K³$*ŒY¾š¼ùíV±ùV¯ Ùv^OÞ|?‹ØývaÁšùdj/÷ïOÅ}É")™Ÿÿ}’éMKà “`8V É®ÞÃõv¼J$îþÑû‡§SúÓ(¤*v{`³CÝ>Àî•>Xò¶Õ–½ÿþ5ûë¿ýi÷x—‰Wù¡7xÍfûªýZn–ÚHìõŸfûIÿ÷ÿ–ÿ~¢#ÖÑð0p“„gÚƒý~øqy[<µÄcÁ4Àepon=hKß哈UlÂÄ2bq(ÅdH2ˆQ(¶)'w“yFÁ’pˆ†C7DD<äHsd‘Leçô Œ"½ñÕìÊî5ùÈL€¸Œ»„q xã‹ d§°Z›»­À–uK `mµ2Ï[ŸÃ¢bµfˆ‰×ÜùÂcË¢ÿ’ d–¬~ñáàÈ+éŽõü¡1×7^S/ 5~èšçoÉÌ¡ž·=º/ÛÝzQ´Æ•,ßÝøËõ̓ÞZŸM¦§Q€µùB½ÁZб¸ƒ–Ëf_Õ÷¬Ý77>³{ë²\” ¦ò!ÄýCY;güwÎ{€àR½x‘˜È¡ ¢ ö3¸AœöŒkÇòßPb8S|[ÀKBÝ·Pl8³ÔÂTg"R¥Qâþ½W‹ÙdŽt»N—À¸g©åŠS (,I )ýˆ9ÃTC u²¥Nµò¨Oô^2GÖ¾ø]æU/óªŸyX€)‘f Â-]æU?óÒäRƒÞ<†Rš9˜Ò̯Zƒ•8‡Õ7¶ ·Æ4Åüüb­â§ðøÆ×ÇÃæª+Nú°}F¾M½OþTAfÂ~^ÁçÎÌÖs-kl³Á‰«êxm ¢½¶7¶¶p(G#˜Yå\";ER““Dr’˜Ãuuo©ˆžÁ4o¿”3å{È!1U¦ßÒ/N¦V¦‰§=w¹ÍIu9ÁK˜Úˆ šÜîÖëfÓj3Ü%õél[¶Áh0=ÊG¶bŸ±H– ÌGïê¡&²uñ,Âñ#4³ó#oÄÔØñÒëï´€wnÑK\œ\ ZÀÅÏÅÛ•17 n=k*Xô±Ç®Þ4%xM=$oBð¦Þ” Yô!€ÒbI Ñ zX´;³Á¨¹:švUóS}©}›iÙéá8 œ¼§D!•k LôÞäy9õ6me®ŒŸmÓv¶Õ×ÎçÇÜU㯢Hpôzö4;ž†ß²ãEð?‚õ®ž75öeêU´Û‹öUômùõ²ddüép¢Lφ˜¤ß"­ ‡Ù~>Ä× ªùC÷©éf·º5KˆÌ omÙ-:³"ƒDÆ1ÿî«å‰®O| ;ÜÚÆÔva€@,(‘åçvJb(ñ.‘Ï|Ðßc[¤^Ž:#917Ò~^œ„y—‘žè’¡¯ˆ¨Eìç?~@̦†ìt¿Tõ¢šÃÒ»%-rÀv‚y å⣠œaŒÊÂËÀI¡ ƒ+“’œüR,w%%ìÕMË–àÙ¦X‚0ªjz¬K*ƒ¾öAÁF^ùÙŸ?1Z„y‰€xË„úšÝîZV«]¬J°0òm8@B×zÐ|—Oþ3£òMY endstream endobj 1428 0 obj << /Type /Page /Parent 1723 0 R /Resources 1439 0 R /Contents 1440 0 R /Annots [ 1429 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1429 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 107 577 143 591 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1430 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 278 563 319 577 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1431 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 296 493 337 507 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1432 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 352 451 388 465 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1433 0 obj << /Dest [ 1163 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 429 424 471 438 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1434 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 273 342 314 356 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1435 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 283 245 324 259 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1436 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 461 188 496 202 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1437 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 273 161 314 175 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1438 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 463 78 505 92 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1439 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1440 0 obj << /Length 3412 /Filter /FlateDecode >> stream H‰´WÛŽãÆE^õ— Œ¸$%QÔb±@œÍç2zÊn8dkÄX"i^f Hþ!ÿ˜‡œªê&©ËìØHŒ½HêKuuÕ©S§¿ÚÎÞl·‘ Õv7 #à>–Iä/—A¬Ö›•'ÁBm³7¿o•µ¼&PmVÎÞ|}ªÇvøAbM6›»¯Ï3ý—ôѨ0^+oûÏÙ†7mÔ:ð71 /?Ä.ï‰x;}[Å´û“þw„ÑyxópáÇ:HÔÃIÝŸÊn‘H–t[´êw_ß©¿ÿÇ›¯ð»ÁÜÊ_é t¶¿S÷ÏE÷£ild¡Ó2÷æ­þÅÿ{ÿØþqÆ7æÛDãÇöÆØƒççgß[ø¡néTCÇÂ4Žôñ5ð#Ù¡=[úÃvªBÍ¢Uì/âP-Ö~’¨8D$î¸LTcf»ÙWÛ!‹K‚óhŒÑ ("š£7fÆÅo>þÉŠù}q~ë­ü5< qm£v¸G¢+þÕ7ÞN«û¿~Ë£Šn£[^ßytŸ´3GSv2$Ó©l2ª—Q“«®R‡ªú^õõÊì4vzk|¹SÇ*/äÔ“7'£ ÁW¹9˜Î(±a'J/$·2»¬³G=â\ÄØtÊÚÎ*ù’{¡õy 4¸Db="$ùË$‰>™ZðÔ-¨~Ò¡k®âa‹9h±&/cHâÂ#µÌf¸ÝØÒ(¹*Jñõ”Øz ýÍJ%‡Eƒ_Ÿô;o¾ÄZùàP,u™áö¦Ã_;ñÃá½³j«4ñ#kt´9˜'ËêÈ9Ú°ïÈŸM’"‡Þ½¡0"ƒªe*=ØrE’ŸTªdî$CefÓ²æ´PRØ«y˜øëIÜáE°¢¯äPC©ËÕ1í²}Q>B¦¹S»êÓgnžŠÌ|óáåq¬Ž<íz1"ý¶FÕi·g;u2-­íú¦$?añ`TS=Oa0äzR®2@ { yp¨žÉ£¬:ôG:4QªºUŸ5ÚíSoNìÓqÒ®aš_öÞÚT´9áC£ø{¿"ì½ù¸´kü¥¥å'>"5Â$Ø8*¤o°#˜Pß›“ÝgOüÖ#dÛ|Ü÷I¿Å8Ép½`Î’ÊÁÏT=¥‡Þ(µÝ—Ž9œT‘äÅîTpIFú‘ÃÔ¥(éH“¾ú®jŽék'–í'­­›â˜6'òÕ"„RòIWD kY-cñˆ±¥”þ‚PÖ¥ã«o0,x‚Éewf/ŸÂFò½Gož píôÁdðW+b§%1.ÔÉa…±¶>»ÕF=ã³§†wZOøRÛßJÄÇÚ límY|é"Ä\¥-µkµ;õÐw*KKœ¡ª0}àôÒ¬ºSmtÚóž¾L…·¡\x ®6§V}k­}‰ùS7¦EBÓ®¨J_0ç‹ +Æìšùó‘Ê—NÆû'rtJ©<Ƨ{üê>g±•L±{M‚]Ea¤ØQ:CÝŠ–Gåg5:¡.²=-m™‡“€ëDižLã«ížy%™x!quvI«…*û4²Ç„¬Û}Õrpͱôë¦zB© ~­4çbW¬AN—ÊöioŠ™ ®Bÿ¡GM ´¿; 9B;Zè#`¼d"“áTÆjÔŸkŸ‡ÔN«¶ç‘,C\6$rZY"ÖPjiÍE&Ãå9}…‰£¯Ð‚â­5²PP­SYFtþù¯Ö†[hÊ |éÁÒ‹¶v¼ÌÜ€ižä÷õÍê€ÝûQhóWš|>ØOgF ñÌÛfÇ7=—×í÷¢ûÖÒ6b¸Ó”RãÄ{tAÕG3Ý”k‚·Ç"³g¡kçwSªw¶9C.Œ;‘bˆÑˆõÉJ¿·t¶!:»b‰ÛÅKÛ!fˆ÷h+ X>X@Þ)j¿ïdpr8ôX¿v•Uwµ³ÿR­È}VÚîóH]L 5j¸Ïƒ ‰÷}46fŸ=ÿ¥JZÿÜÆݬ©ë\þ¹¤®Èºé…˜×$V莦ÌÏbNšvéã ½X»n´ÕUVj!0é¥jŒàÕâZ5N¼²ÒЈf¬Ó†‚&^ñDÇ2Ÿ@ÔÓ;Ç-Ï!xªùé* m9t€¶Àbx’ò 2Ez²=øü,’è›ñ„ίEé)ÂÇI|ž"ÁeZ #Îè1ˆÌÙq â+áuºíܱ6Ž>ƒöD^T—¾ƒfá“¥>†ÕÀ+ªŒM[*Rå 3gy¬­%;ï !“‡AwËë÷\œ¶É1vÏ™=Û–lE ¼Ì*·to8yÚ¼H> CuÂ'ÄŽ‚z;8ázЭ©ã*K=TC2%Dpž8Œ uHÓqF¤æ7¹éZ´Îúˆ¢”žÁ¼a0ol¿¸Á&$S u„¢~aF¹ªG(êÝ®©ŽòÞ©0Ôöu]5ÈÀ‹˜iC.›^È(ò§¯À‘Ì]ӥƾ 9@©µdÌÄ+©ŒÕDmœ®ëB,IXjúÁ*ÀÒE$qš²Åz`‹õ„¦"–÷$îAö‰÷œÚI¼K)Iù¥¦XøQ8‰ãbŒãBŒûVM°ø¢4C%+E›ÒËNU¥™?‹¸>‘Àywç3‰mí|à„ŒÓ mk•KUÂ*âööA(4O¥A@Òùëç§j›Ÿ¦lâ—• Áþ%uƒ*긋YëtN—ٽʺWÉ­¥Œ>gj±ŽÐ`1,w¹ÍU×|ý%YÔZÈõ‹Š¨ž¶døæ¼97:ò rnÚ»ÉW«Ÿ+¹Àm¢bv½©w& åØ ä¯q†º®¬×(мµ}üxÖ»î‚è 5ØÚÛès;—:ÁeÅ}Qꬾ,uÆ¥!µœÜCÜ<çêi”Ì%‘¾|¨†xM^ª7ú*K›[½ml‹!n›Cƒt*yÚ$-ñ‘g%r«#¾"85-4ÎTÞ0ÌH✋›”SnlE´Ü{8B&´Ùz1+›Ø)„<–kEƒ–éiŒ w¯©pcM"&¹ý4B¬‘FKb ¸=¡ggB±£ƒØÒALY˜ß¢›˜âõ~«åêt»×kùZáŒE;¨®Ý›%þÿ’“Ân»ª1t5ÁÅ®0M{!=’iÙR[ˆõÕ;%ðãhúN‰‡â‡â] :–¯MQ>Z îN\£‰¦!t@+Ûª¢ìTQ:‰Áæ/4ÆfЛ1qÐ/lÅú’ =¶…¾dý/P;Ô8½Ç9öZÏvUT.x©®Üú`ަ¤W+È#튪D¼9 sÉ¡,ì<èúœ7¢ØV“ð\¾¦H E‘I_Á·q`;çífì—ãÉNâÛª|Ga-ˆâŽÄÞ*75É|RÈ&dFÞbB 1èäâre{ÙBæk¾¦Ï°Þ’cη×Ûxo{k.êo´¦ÜŒ{‰¹MñDU”U=°PÉÐM@¢´âÇ”]”›Î V„lŸ–Î09-_ è½Ì(“·Ôe}ò ¢ÕP¥ˆ.0³2‹E{¹]®Tmh‹”%‰×@µYy%®s÷yæF6o=zÌPì~ðÖyæL%~´˜"jè–ÎÒÇÊBÛ’°AKÛ¦¸Ü£âÿô­úp¯À-ê¾ok4%õõ7*ÓHûCÚö(¨Ï¨ªµË9û*ƒkïÑGÔ;pËÙ/ƒ†a ˆÞùŠQ7é?àÈ¥ *µ…ðÿìήâZ$Nˆ[Ü:îÖöμ¡E2/Äžõ¿»!·KCpÐ2%2#\  ¢ݹÞM×mùªm=âí:Å`Ø(ÞDâü*KHuCTxz}ÞÖf]ðÕ²€«ÓòÛ”ò+û’ÃòI5@hÁ²%¹¡mÞìâ@V÷ÒÅu!Dªõ·'Í èQ¾37ÚÒŽdûÄ;»ˆ‘LEÍ©1l¸~زގñ)U!î–™Vp`W…OÕ®òþ'Nu´U¿Ÿ][ßø«ÈbOðpÉ,X0U­+ûŠU_Yç„…4Ô"¸lá\y(ñÊçDçs¢ó)ÑyMt~šD‡Ž“!Œ§Èt>eº•ƶ ™.˜´ÌbÔ Ô^úI"’kU'üÏS"=ƒ_è·M¿ *FÂ:+Œ‘UbòYalaù7޲Ølºšcß³ {®E/´ç/ž\¶„#ûhNµ„³Õªù‡· ÞÙæŸ°_Â[ÀIy…·­´F¯i1rµ’î>A\z[²œ¥Îª‘IÀ5(Û‘žà³Ä8¨þÞ0•°^„„ Ç`öéAQŠoÄá·Û1î?Ïu&ªOEq/U¿$e€à Gp7݇é:H]à€gdÊ ŽâÏöàŒâ LF6S®f_ÂÊAy7ŒeöX6vºw·w øvB endstream endobj 1441 0 obj << /Type /Page /Parent 1723 0 R /Resources 1444 0 R /Contents 1445 0 R /Annots [ 1442 0 R 1443 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1442 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 134 460 169 474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1443 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 266 433 295 447 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1444 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /F5 1671 0 R /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1445 0 obj << /Length 2981 /Filter /FlateDecode >> stream H‰¼WënÛÈFÿê) ! ‰áðÎE²€l)‰[Ç2,z‹]»]ÐÔÈâF¢l‘Š£}¾Cß±?ú™¡®”³M³Ek8g.ç|ç;—9IZ¯’Äaœ%ãw˜øñ"Çò<;`aì[Ad»,™µ^–ËJ¹ÆfeV´^½rv_¶l˶9Öd­N=|j—é½`<ˆ˜™üڊ妘…¶8جÀVçÊ=ŽÜN#? Ý7Æ¿ÌvÛìp× ;bw+6\Õ3Ž!Lœd”yɺïÚìç›ß È|Ë7rÓ6²I› Ÿòê7±˜ÊC\#-Ff'6Ø?å_óïÉ_ZÒbic[>’æ¤OOO–éZÜ(éVA×âh\iah[ޑ驉<©Ÿ´8ËYËñË 8sC+ŠXÀ$ƒ^Ä¢5n$k0\Ž%ö.tmBÄè½z{à¢(R@†~lÙÚCÆŸÔbO-ÆÚ }J’DúËö´©ä¯`ã: þ4-+Ӄ鬜/Ad}˜ v}uö½´wCœÀŠ6Èe >ƒ¥¬¬yqÏ–¥‘ó€!”+Åâ“X°ñ|HÊåŒ=¤‹*O§,¯Ä¬´v­îD”u¸å„Òš¯3ÓvÖfÒ*’•¬J÷¢Rf©Ýk«|ï¶ êý/V)[ü:rhT[E²a•VËòÀ¬o²ñ½­}‹òRz›ÏÙR}U¦C„¸,­ØT¤zˆð s—ã΢÷fdyÎŽCÑh©Û6ÙáÒä`ׯ5>Z)í·gC¨>TçVh¤•Øgnhyþöqë,d»[`°òl]šX€—@0;ž<Ø1 ú*2!B,Ú%„ER(±¿áÁ7%\[*+ªyUCRB7¨Œ •~;$°xô{Ù1[,¡QÓ£ÂçMüpßËÕæ›BqÀe‘Í‹q¾ m¹13I2°‘eEM(”Ü£(Áê[øú¾C›åš*.N%²xš,ôMt ]ˆ;0‰Cl8`ñ¾)8ÎZmG©]Vó…IÕV!¶äM‰uÙØ©ãìÀ\w'6üÚØx×X„G Â#4m> çÆ©ôÙTU©2-bó±ê‹ê3¥¢©`¢6D¸Mæçµ¥¦/Utp%löðC6òàïDäÔ:“˜¨óŽñËæÓå¬`·z¿°w:º5½eùß2Ññµ¯”;yn/ÃûçÏ”½×·]Çk×±“óÁImf5A$giÁ&óéˆá7]Àg‹t±bwÓyöŽ09\|—4§à—·ïÀoÇ b¥Á(­Ò6Cs6aó Þ…)f D§+æüÃuLÊ+¨®•  ƒ\®F9å`Ž˜´ØYv¤Ó¼Zµë¬„•J³§|:e…ø$’é&0L|ÎÈæ‘¯M `³ôsÞ‘ª'ÞrÔ êÞlM7Ò—Íï~xX.æ‹JŒ,v²¬Ø˜R‰cÌAXWޑΦBöb–æÓRÙ™VUšMÀ$®¨îàt[òM7¢šóLêÝ)mä–dZ±Ç%$Œp Ü@k£™Ùq·œ²ÕÏuö®>håo §tüÀ63@»Ë)^á@FPD•u'Ê™%Íò±l s ‹Š­:‘ÔçTøê–ºñµªSº\­ÀRØXdª[+ēх"cŽŸôK;GâSž‰³òhAés†øbPÙÞ°÷¤¥@sZMjvèt¥IÐÈ÷~¸ÿ~ð}zøŠ¾ÆYÓcù€xZö([´šÄVä=ßèÈê­Žb)²É§tº%‹Šª§×yc¢¡`ÄÒ‰÷¢i“ý¸Î~¯¹Sê òxä}üWÓ él,kÐÜ$ÓÔ2z}È5rRƒJe³>²$`­>’ã‘Wc{®þÊTàýÁ®–wíd¼®Lªï™©zyŠûÔ$³jc]C Fr©€Ø3¦zNÈå£50Á ž/—’ #ãUA¤ø¼¬èyW®àPÇíO«ct{}¹»º½².£ÊúyÛ‚ ÆáÆýöQ—¢¯€&yAå7›.Gä½ÙÊ«6êÍ ±ÖÅ#](SÊÜîIj;Dm“*ýL¾&‰äºäj“ÁUÿà éÓô\nEúÕÖxo]ÛB§ÖŸݳïˆö5˜å#meÖFãª?¼þÐïž÷¯’mC®‡—ý‹^=s6\_öן ‰4é&×ö4±Ñ‰=Ø(ì»ùˆ¼Ù‰ÜÁ[sÏK©F­ãåY2Hºçß×ß×§ƒ‹·[CrOok¢×Mº{!ç"Qh7½½|Ø‹ _j|Ü?GäÍf9 jÚ1¿(”‡J½¿½ï_õÕ°7<ôúo^ó—5{jp=ì_žo^,7í”Zg×<Ç©#òf±À³kßÎ{úúñž^½þg§})5Šz'—Ýäý›—/._î+ì¸[AÜ ð¹ r~,ÈMT¤47^¿úR ´c+z†¾Íb½Ù‰ªJG 8&oDÜ Q×=EþíÌMï˵ȡӎß|Dþ|~tüز½Úég œÎgÉ@é{«YÛÞ!ªþZ3§½ç|'ˆŸQ¿IØŒšç¯½}³!cû·¦šû±{~Ý_«N‘¦¿|±¬‡/Æõ`t · ½ãŒ9&oÖžj…Ž2ƒ"JîúÙCOõœŸÈ¿"<´¢¦i暃»žQ¡Y\oVÅù8\Gäpñø?œ—½Žƒ@ „Ÿå*Äò((P”.'n—*m yÿ› –]‹«<Ç^Æ™]o¾wÛ¯ç<,8/]Zöˆ®w‰Ál®?]2ý`¶\ƒÞÀ(rãÅÙc“Ø« ÁÇáxŠèbÈnQ­™oâö‰,§®­>ù=œ8;ùÀÓÑæ\í”&Y ºìC³*iâþ‘¯¸9M[ä¥rœ3]¶‹yÙnrÌ|Cö{óŶcÊû ‰û×ê3À¯!³Ó˜2˜s´2u›+ÅKdùSJÿÈ”7úCzŸv:Eè£.ˆ.,8à§³âºÂU«¢Ë¾1~›2õ½!¬|ÇPˆ˜³ "ªQ¬1ýç’º!ºhºoвç…J}íMÁ%Þ »­ ävÍæ¸ú‹&W˜•Èú¨è ˜Q˜ìÈíË÷"Ë<y½»BAWB*úmtù2*߬«ë{Ï&ÝD‰ü'Àc4¡ endstream endobj 1446 0 obj << /Type /Page /Parent 1723 0 R /Resources 1450 0 R /Contents 1451 0 R /Annots [ 1447 0 R 1448 0 R 1449 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1447 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 455 516 491 530 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1448 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 325 324 339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1449 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 293 74 328 88 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1450 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F5 1671 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1451 0 obj << /Length 2579 /Filter /FlateDecode >> stream H‰ÜWënÛØþ¯§8]`ÑCÀ¢yxWpb'ë6—m¬¢Ý:Å‚’Ž-n(’+R6´²ï°ïØýfÎ!ÅÈRœº(X<÷™of¾™y>N§¾Pbz3R¾ðð?aê»aèÅ"™Dnœz˜®F§/šTÌÞã‰f^ŽN_])qÛŒ<×óöÌGãîó~$¿ÏnµPñD8ÓŸF>4‰çNb\¤nì™{ùŒÏÇé+ŠéôµüÍÇìØ÷œ± ÜXz©˜mÅÕ¶l—˜ñ¥vp“lòFœ½:ÿü·3Ž0^c-r#™;žœ/OÄÕ}Þþ¢×_Ȭ\8㉿ò_ç_Ó?XcÖÆ÷܃é9æX‚ûû{× \%zUÓ³¸Oºøô\_ÎíÔ’oº˜Ž”ÈÅÈb7ˆ•7ME¬€¤€Ža*Özt3z>íÁ¶xŸ¢±C×#D$£wúRí›(M I4qßœ•O!é¼ÍÖ·º]èB·ºù¹xF@¶4p½T‰$Qø,Ï@ªGW£¸_ ýN1\¼ÔõãÇYîßfð¢Â áþáƒË€óôet0†Kt®åùÅë‹é…3ÖòåûwoÌ×Õo_ü8={ÿêbzefþþÝÅ{»ÍÌÿø—‹þômÛ™¹8‚Ëõ"D{Y‡È$ 8䬤߾zgÞÿŒÈoξÿJyC<ñq/3ÀÇÝO¥nÔ»ßéølçuc‹ì}¼øç;xøó«Ý»~ê¦ág|ïÈúóÃôÙ‘\ânh½ÏòtÚÝ¡ëáFºA& »ƒqŒ@^Ož2äâa˜C ÷ùJ7m¶Â”/kà³'â¦Z; v¬\þkV#‰iÑb!Q& Ms°nD^š mÆ“!-Mºa‘òn¨H˜s+—b¹˜ïÛlVèNËô&14 ÓjªÓÌ*ö¢*Û,/õÂRøH¥«„9^qÖ6ûE]™Í_zŠ*¨a†Û eÔü(÷w‘¡z°•›ü€K޲OA\X™01ç÷brLv2xÄ~ÈYwL>Htüµèh†ž¡`±»Å*ûØÛ_N›,»¡@Ö×øªŒä'Ô 3R¼L&7Ep΀´yóv•ÕOu|'âi^6zÝ®¸»Èj^3+}7øÜMx*9¹á§›šŠêiÎk\SI/˜“Ów7!­S^ô%z"Þd5ègÆ ÚPíÂÛ³2»µ'Q<ž}?FË÷ÿ™w=‹g{b5N~|}!Å_ÔMýžÿ“‰÷û¦¯l™öŸø¢f‰_ vÄU§N,—à—XBMü?RŽ©xjC iÈL…}Ä»éÎø±mRI)›îYP61áÔ+£¬6*ucHŸ{1SÍÈ#RùøC\ž q,9ù%²6K5×çyijîÛ‡x…jð€ß¿àÛ'r:¨dIÙ²iæ"j”Lë`׫ҵåÞt©im¶æ£œwve}G{9/óСÄß1~ä‚$>môv‘²‘Pj½ hÇ{@oN¯¤æVGP3æÆ¦ŸS(¸€»Yß²ÉB6uŸ4'ôîV«ãhîÝ’ÂȾ4Ë5óÙü˜m¦Û{æT­K®ÌAmšSwÕböËìÖš/£ÊŽåB>…ÜsäõñÁZ`WzwÉó.ŸkWœ•}£rÔ©LN°E^~$ÎAùC2nÊüçÍGƒ9&ƒ¸ÆxQá*È•—ç{Þƒ×üÝ)î´‰Nˆ±Ã¥WY‘@䢠5„hhbÍd¾ÊÌÇV|Ôœî¶T½„D”¶Þ%'FA²9_n`/Ø4 h}HÅ."äzз š\Ãô»ZzlúP î_¯uSW%7§`† z¼ d8 Ì`ØZSBÎ ±|¤/© Œä>zˆ›d€ùd'áÄ¢G%XÂþês JëhQçàêR­ãZ<ÌF.db¹¢ªêj[Îßðìk¾° 5¤ö|l—Ê”Meó"‡;ý‘<æ°pñ€ž.{õ™]Æûðup[f~kž²„P¨wlhÊ\Ûã7Ž 7âZ:£rŸ%#§æ¼/÷"™]$ÇBSHPÁn¶›g×ý{9ñšû "Iò-’ŒÚ­Õ¦i©ê§JÒt­al»W %/æÞIÿŽ5ksˆÖÒôúV·û¤ R„Õøÿ MH£ 0¥¤O=ßr1ýg‰Vèb endstream endobj 1452 0 obj << /Type /Page /Parent 1723 0 R /Resources 1456 0 R /Contents 1457 0 R /Annots [ 1453 0 R 1454 0 R 1455 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1453 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 318 662 348 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1454 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 384 534 425 548 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1455 0 obj << /Dest [ 1168 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 206 373 220 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1456 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /F6 1675 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1457 0 obj << /Length 3661 /Filter /FlateDecode >> stream H‰ÄWÛnäÆ}Ÿ¯èÍiÊIg!ɬU£—×Ã5Šav|hÕ§¾hœÝž8‚vòDŽeÛ{ã࢒l¬U®òùb±ŠÌ}ŽmsÌ@´5J4ˆˆï–JÕfpR‚Øqk6˜qæ,ÎJ&“š³“Ù{ÁDƒ9yç3 ؽþñƒ u<¨AkJPœ\à0OÛ¯Žfi^Üa¥ùLQêÔ„1سÏh²á/ËéápηªŽeæ$xËÕ}SÀz#ÕS®0Ø%Ún L8JxXÌÊÒ *oœ3LMAXÏ£@¬°ßœ×Ì)ˆµF³vO6s+gqoÛ!`]Þ·¸3–iã›1Bé,BQ< ˆ¦8½úy QN¤ÇÖ2ý˜×ëyb“?lÆ@Žy£ÛƼcØøÁ ßd¶s<ñQ"(–G^.à…L«^€+žÈæÛÙéü7N”­ º1H©|“©G Þ*3'ñ³:!N6¸{b 3ãIÝ‚bý–†JëFºÔ6}žNÞd ÄĘ'v£2'FprK(ulƒ•èÔ„N%å €'iËñ½az“;à® E3ß´B=PŒoW\ª£"Ò;ÀõE„'“y¶Ö’MútTT¶àŠ A¤'ªâp«*.¨­Pßò¾-žë¾R-ÊÞCVöÊ]"{ÍhűÉvDw8í«ö•7KÚú_àÜ %ÙƒzD.MÁFt_­Î‡¼Žgvù“]þ€w®;ª©Tö‰È‹}Î/¡*:ò¢n)¢ _RHG·® ©¤…zÍv$l ÒPJÂÐfÆWMËR‰ “È'í¡'òaz )h_v© Ý*óÆO•ª>h(ÐÛôÙTJäeA>«¦Óœ>M7;Kb^Sù`ëœ%+_Äà™ð¶ºä=¢™r¹eÞòKÓ9±lP(à/-®žp©ú nf*EOÓJ<(ó5W_àµlàÑ·ÀB(/JZúLðVFÇ<*V[U…df­2kyCóhÆ (@q$¸FÅvœ“ó&Ôúµ~Rî÷e>í ‚ôRÀ$aºq“Ê'J·nŠB)v•µ{*™„YÀ W&CyG!$qüÒb›?j" Ù(sŽ-  “E»ØäךGÒID+Ì'94!û¼\N|ï…¯d¬6\7ÌØÀ7“Í27o–,5bb4âÒô)É’"$·_&ÖþH%Ï…§³ö ôÔé9í€Cg|éOó-ï Çœ@MAý/uqõb0°÷¬µš 2J|â« ¬\¹õ°SÕ9e´á¤¥_$)iôrðNqÞ-¼·yN”Á’(‰&‰%¹cšüIþ‚K¹mTO…q©W„–U"&«÷Ì´•ísÉ Ù£ó®¤½™ßy3%š üšn¹=7^fEÀn•gÈøsñ–€ƒËŸ}ÛžÏÝ øáyö&-„ù5ëƒÈ¤ úúÉnçf«fÅ3¦³Å“?|õôæÿÔG†›Àß9Ô±”Ùÿvç˜eø ò e̽dŒ*IbÎüf" ¨ Ò(3NrP}¢ŠÕx¼H=ióš #,KVœÙgÍPC˜F©—¡£™õl݆‹Æïœå ­ª±È0uR |ÿn({×}GíÚoR]_‘¸ "ÌøÝÖþ!«©c@þÒ.Ê4‹©ì!Ŭ>\¨Â Î?˜‰6_0t‡€Þ5=ìûñ¡õN£Q©Xþó;•˾Ãù¨hböŒLãfuN\L- ÓñU¶ç>'”ÜôGt¹fr¯Jg;ÝU«eô™®•tx©æUÜîç/]Òc!vÎ Æ§Þ UÍQÈ=3Ë@(„ŸXZ_ر£ù"/ ,µH×â+Kü¥Ê5ìÌ w"83ú©üšÂپ˜å)£|bh7Úà~6kÖõ8,•å`ʰRäM­³¢¦NÅDfmý°`¦á‰ÅÅL-¨î²¥@š'„“glÕççœ~{jORÙš•µ>¯FþÈ4!Ù:´C"ð1T¿‰rÏ(!Ü~¹,ÜȺi«¬ä¾µIØ ¿ýù‡+vüOF _¡“%(úr,̶05¥R$ó²ß“ë^Ù‹¬}ä}ºD£ Ò†s¡sÍ^¿¾"YþŽ¿%Çü‹õ²ùm¢¸zí_±½TD²­°@«ê©Í±‡*·æBìMŒD 5þÿû¾™Ù5˜uPûùƒàeæÍ¼ß{àý©,s±¯÷\DÚÔgŒ³‘ü_é²ñÒõÝ;²©nö TSm_뵤V|OMT¨f=µÌŠpÝ‹fK³þòxc}æÞ~˜…§Óζ>É%±³ÂØîü¡Ÿ…³Û¸çQÿsÕ¼ p,ì‡üs<•<%ÞqNÄ ¨éД…¸‰Ú¯JÊ;:X1Â/kºÂ&EBtzûÀcÙÜÝ·î*ù†…jƒäÂ&JDÜ›ô)ˆçB"[éDù ~:‡vôl½¤È¦ÂÓH†ò‘Îò§º;Âád$CÆÂ+Ec;A§•b«ž=‡|È®„GòkCþšåúj&Ì ¬ðt£¼®7~Òˆ®™·oKº˜tÇ‘P✗ å²³+Aƒ ¢kÔIú×pl·1ƒMê¥Ü Qµwtü"\îµaÅ´«N‰FwÕî骂N“n>èÊå-é?ä…á³—vDP?>ÿ`Ì™òS endstream endobj 1458 0 obj << /Type /Page /Parent 1724 0 R /Resources 1464 0 R /Contents 1465 0 R /Annots [ 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1459 0 obj << /Dest [ 1411 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 420 127 455 141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1460 0 obj << /Dest [ 1446 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 459 127 494 141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1461 0 obj << /Dest [ 1371 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 113 99 127 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1462 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 103 113 130 127 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1463 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 318 73 332 87 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1464 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F5 1671 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1465 0 obj << /Length 2797 /Filter /FlateDecode >> stream H‰”WÙrÛÈ}çWô‹jUd €Ëv-ÑMhÉCÂI9bj "A 1jH²ò!ù‡ücrzÁB€ârYD÷íåÞsÏ]úC88 C‹pnÜ"&þáÇñ-æ8¦GÆË<ß´Ix?8=Ë|²Êä“d«tpúiÁÉm60™ir¬Y FÅçó€~‰ncÂÇœá?ܱÉÛ>óLu®ÜcÉíâËõÄîkú ³#Ë4FÜf5}róB/i~‡‹ÆN¢Y’‘ɧ!ùû‘‹ñ2—¹41Lºº’Ås’ÿ+Þoå!6Òµ1 (ù·ükü#üm -–ÖX&ó0Ï1'5x~~f†Í8ÍÄ­±¸GãJ†O“Yt¥§îäIÓpÀIB–ë1ÛãÄ3ß'’6:>ÙǃÍàCX‚as,1ѨÐ5"T¢Wy¦Àoì™ ÿ彆¹dÄÖ Ú³œÎí¯ˆkwsOK¹˜;ÞÝ&G¶©’‡ï«äŒŽu:y,©À³ÂÀ L±[Ÿd^Ó*<¸ƒC[^âùå%×tvu6™!GÒ:½¸ §Ÿ¦så”Ë«P|͆ xc¿G›6a‡6HÊ•6óéç«p*Ô±ÅÅÌÏ~Ì—Ô³—Æ‘ž×£A›°CÇ©iN柦á_¦ß ‚ùsˆ¸N>mÂ}3 }ªGÚ¸ çßÂo_¦mšO?N¾Î´v¼T­ŠÝBIÇêQ²MØ¡¤e¶*ùq6ù´@)sz4{´ûXÞ&ìPЬ³üËüâódþMÝ.ËQßbýù‰Nå9:¬`—ɽXâò’0K£¯¼/BÚ„­9Á ¼ZNhÜᶨ@¹©[*ò¢–vçÅŽí¯ˆ ë̓„- :äÚߢ½r}ÑPÔÛ«f½õ«zëÖ[Q`W»t“ÜÊÎaµB³ƒÖÉYlL³¬ì‡Tí••Ùࢠê%kÝìÔÌ“!,¦¢B7¨c¡Ýóë5Ò/Js¡N*««MŸÕO­>Ûõúœê2l•á€ÁÏTaô€ÈrªFåm†p•ÃØh»Íþܾo°Ês{*^·T²JI{XÕ¾ýqí:båÑî6¹`ÕG·Iª2ĺ¹b1MÏt¢Òéa¨Feujd ÔåkªW–ICUZltS¼Úöq~õ¹Ö ¡Z4ª‹ëBG«ê#ÜF¬£¶Ù¸Ç]òvO8ó‹ýí¬KiOâÛyi»¸Ÿè6ª®ç›Ž"ú9Z—‚èm-…ÖÊ}7 ÆÛã»™ÓV lÇ«ú·6ÏtÈÛ¡…UŸòÿPÒ¶­ƒ.ääù+ÄDg`j”AÌ>#ñ”Ì9j_»¥¢uÖÒîÖ¹cû+âân°÷ãιC¬žcŽÆAÊ2x” Àˆ/3ËsPÛ”¯Ô»ÄokŠ Ô3|<¡È[@–äxZm ŸÆïßÅï3Œ "¯1ŸF7Q†—šÏ\ºI°±4ºÇŒp34ñ»†– ;üÚõ¼xwqõì:Û¥y”¤ñO«7ƹêÇê÷¦'ñ+ž’Vù®ºF\Gy”X@óÝÞp¡_ü¾©ÕHî/Ÿ£￳(%+¥ŒÒÃíÑCá–g¸êŒ‡H< -šß‰§¬ÆÐŠz:R/Ç=¤@\¼V³G-Ûn_ÈþÎHü#Sñø4Ì(aÙúfitÛg•º¡u­Pš#—94Ï÷ÉÍcgbÈ©°’‹—n/Úx¥Š§iºKcõ„í…•sE®óx=ns¤ÿ“W4ì1¥TJ̦­Ò–2õbCò»$#j›ôVùT ¨ØÓŒè ÿƒåwClŽ¥»äXÿf VL³8“âì!^%›Œ=pp±Ã¡2VäÉ –¬Vq–]Ø+ÓdÒ†Qñ)ŒxÌÀ䀯{ÃÑ 8NÔ7NÚ²ü´Õë“ô–\ßgâZ0Xh î–“ê/‰„â†C‰¾FœiSuà“a÷²ººvé,»TW| u/wŠäµ¬!†Á]q¸-˜NVÐs—‚Ü7Ê5Ùìöâc¯Ì[Ré§Už ±í!Ǥëho øtHR\‚xÈWli h,fŽUz%+¥¡¸kñ"‚Ê¡éJý~žf]ØÐû$M²|¯'óä l±'±Z¯£ØÓQ ì·Éw$Ç \Pœ[U^vëùÂ+õò GÇ{¼VáB§îžíZ+—¨Kº¿ó¬M³­f4ŠÏg„N”®‹Ø-u“žbÃkÙBPÃ;ŠZì ª=-¼]j†Å1J2V@E‰±†DÕ9ã °9*Yc”‡C†©R¦ ÜàÊS¸·4X-T B+‘ªˆƒ{4oôXp.‹óLJa±b ®WN3pzþ¾„t'"äH¹0…«Ÿôpoˆ`‹Ó\'o¹d½Å7/Äà¦X0]tq:j+·r›®&·(‹$ɦ– $ºÝ PD~“S¤ø§¯¢Ú:\«G5“ÿošFù¹ É9™@Bu$•fæ”(”g‚**ˆÓ€D.A¦P…PGC4S|RQbQ¥‚>FÆ‹ÖvñVM@{sK‹K@¹¼”b- Öƒ¢TST‰Am–U‰°‚Xç”} ô\qjª&0È M¦)(Ù³G(Ø+ RmÂJ¤Ø1¢d§£`”I‡ذ–'.³§¶ endstream endobj 1466 0 obj << /Type /Page /Parent 1724 0 R /Resources 1470 0 R /Contents 1471 0 R /Annots [ 1467 0 R 1468 0 R 1469 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1467 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 0 72 73 86 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1468 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 757 325 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1469 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 274 743 295 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1470 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1471 0 obj << /Length 2559 /Filter /FlateDecode >> stream H‰¼WënÛØFÿê)ŠCR¼ÉH ÄŽ³Ù"{i, @ãþ ¨#‹ MjEÒŽû }‡¾cô›9‡ºo²Á‹ÝX<·9s¾™ùfær:x1äÓt1ðòð~Â4pÃЋ)™DnœzcšÞ^\5)åìñ¨É«Á‹ïn|ºkžëy>öäƒQÿù8P?gwšü$ gú¯ÁDM(ñÜI ÁãÔ=#WÎrœ¿¢˜OTÿ 0; Q]V–Od¿ÅN(ÿ`z6¨ {SžU„·ª™&{VÏ)3_#èŸØf†n퇆ï†î˜&š!LB&¡ë…°VÇiBf¸±‹ºI°ãØX³ŽíÙÀeàj‰“:zÙüR­žuÍS[Ük™¬»&ºùû;,Ð<“¹6~š…—Q€³2ó÷øë3¦~6š¦‡Ý«'©ë¥;êù½v¾Q†m³¢DEu.nžlÅZžˆáy6P\yUÞGÌËyÖZlPm½v8õÅ¡V#9Ïv³ ƒRºA)µŠÀl¹QÆè}A#cC!ÞØÈ°2°À”—ºbÞ&´(*ZÚ›⥠ݠXmqh *b׈€±ªLîÀåp݌β‡#Y&™&Í×Ço¢ÎH¯ŸÏ µH0ß®èúM\E!²Î.Å› w¹(‰ÀU_þÒÕ-@•Ñ=««z®/Ρ#®^ÖôÓëË+jàê2UÝ5tß5-µôí†ãqÀX…žŸl¼<2—é&ÏV`–ò²xêrç¿Ä´!üöU‹<Xø¬æoé§<YƒS_ AÖ2¥Í̃ý½àŠK°ÑÇ\’äˆ/x.âÛòÞhK|ªÊvõ‚¬=éVü-üòGÒZð;imb±IÀHÕ]©ù¹ˆ)18XÎŒˆƒ§qžh¢¦K䃹^Àuqõ’ùI#'jÈ%§@ÁŸ­y>¦ósó¼7VE‘ˆß«?™§ «¼:@Ä7¼c¼y׈Yhó0}v„‡ìf¿M ô‘値yþ—Ï&7~*£=”©å=YÃ\ ªÍ4s‰|´`QŸišæÝª,òŒo¿Uõ'¡Žû *¦ªzâ¬B¯/刕PŸ4ý´ÎòRé{Ð-HJªÃV¯MŠHÒ7'iÝ`8ÚW &`ëKRhMÆà â²m•ÍA§ìÞÆÑ$šÔ¾›ÀIò ®ZW™×ÝLœD"1{ÂWB'<Ÿ W12¬56¤¾ÿ&¶ßWnâÆ“¯=<@Öøý7†‡Ï²ü“ĉ¯Jv)äV;\"¹Án­¸m7[Ýœs㪽D‘sgÁÜŸÌdSòïXÉRãp­²¤ÂÌ™!ÉR…’A‘6gÍ‚$Ë+»BvrÉÛe™iphUàn…§ñ‘8§«÷Î(ÁeÃwodS¬¦¯ !_ÚñåQÇoo¹zÙ ÏøÚ—ù#@lÝSî¬×pv„B|F#Aw?”¶IµOlå‘25À­úAŠ¡'® Yº º­ƒp‚Wù_ó*d$äg¢^uÆiëÌî´W  ›ìÄ϶+í{ºsú±îÓí}f'ˆúŒ›”{ÕªFeÉeë=’ +7}Pٌϟ\/7Å–û-jQeŸo¡žë²¸ç0Œ)GIÁ×#¢;c{?®ªš“ø4ä#Ì`n“&íÃtØClë*£Öx͹iÃDDbáÇk)„?s£èBõ¯àâl-Ùž2”žr()K&ÉJ²½<’½2#ÂüÕyk·3¼YÞvŽ”†YiúƒHúÞ°'®?SïÜw˜9F}›ïU»¢vË sDMÍ}rìÊpt š¦ßbŠôeö¶- ½Få¸W¸5’ô¶kF.Ò¸‚ìÆ¥ïÔÙøåXLw´Üd븾u\þ³à M^ò'Jü&‘—/ —Pm†›úvh\Õ1{ ü…™3FÆÚÜñ™ß¸9“ž+RVRV2üù‰Ú“dE´Ë¬EÅ%Û5U,(²2L£–ôJISÀ2£•=p”ä» [ž´EÞ•gt^Ø|µöWŒè~Sç ˆ=Ó¥·[ÛnÍgÌEQ"Nû«“¥ÆT±dÖ°*VMñ𘙨·“ñõûkÊˬû-½“Ÿ¦üñœ½S°Ó1lš¦Ä6M¨¿ÞmûŽgèühëÙ6þfu]jÈyÈÊÎøßD'»‘?² Úé½¾µ Ú)c>ª…ää²éÓ÷Aßœì{v n `¤"=A½j¹Ô/äÅ¡ ÞÝèV(ÑÁ¡ËÈIªÓ–ô¼A@ Ì…M0#Æ-e¦0Ë9!¢/z÷FsRqÔšõŠª.í?¸ßš©k³á½1‰IËK{¸ã`p}ÄÑ'Ó‘p çFäÅ¢2Y t<ÕÍ …Þ\;\t½“rÍ,“¨«énÒáF%R äô>¿ØÌf29#ÄÄõg‘ñŠûÒT½q¤ÌãÆËÌ`P’~~Uf¹^ÖŽøë3×&íÁ.–¯÷I©öÎônæ+ at*œ(cræuBU‚lµZë~•X¡Íú$}Aƒ^ ö[×÷´Ðm¾äÇrô“ݵt<Á…S•ÖŒ)'²Œš§*‡›4ÜDiY?jv˜“ýØqeÃÒ8kß!ýjФ¦·¤u¸>°ƒ|xËjÁ…Þ³ŸêºwЦ%öëéàÿRh— endstream endobj 1472 0 obj << /Type /Page /Parent 1724 0 R /Resources 1474 0 R /Contents 1475 0 R /Annots [ 1473 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1473 0 obj << /Dest [ 1476 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 87 130 101 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1474 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1475 0 obj << /Length 1798 /Filter /FlateDecode >> stream H‰ìWËŽãÆÝë+î²´8¬âSƒFó ;­ÒãE•Z´%R!K£é|HþÁÿ˜Eέ*RR·fº ØÉÀ0h±^·îóÜS¯ç“ó¹"IóÕD*Šð‡Ÿ¤Pa’Då³4ÌŠ(¦ùvòâM_PÕÛ=õU3yñþƒ¤»~…Q$±§šL‡ÏÃDüPÞi’yLÁü§ÉÌšQ…³ ‚ã"Ì"'מQö8¥Ÿ¾¿(ÌNULef"*hqOî³ÆŒ:€$Ñ×=½zEÿøO0M1î°–†©¨ƒHTë+úp¨Í¿t·±BbQ6Ë`:ôoû?øqþ׉µØZ£¢0Ã`þsVƒÃáq(EÏ·j¾¢qeˆÏ(T¢òSk+éÝ|"©¦‰J³0Î$ÅyX”Ix’`cRP§'«ÉëùèŒXbKtî£w#öˆ°ÞCŒ£$ŒlHÂ8.rrÃÁ©yš†¹:ñj”^bgô…2 Š0t­Ëns_µÛmPÀg8Ssó2ÈÃ\O×ß© Ònì™%á'íŠcQýí;ïÅ0‰cESÉœ}èîÏÇûSwÿV÷=ç…þ\­KHR¢ÁÈÊ€‘ÅÃD-‹f¡*N,“ƒ`éä¾iSÖ^Rݼ´áÉÅ(ÖçwæC€9ã¬wúzYš²°A˜¶ 8ƒôÍC­¦öÙŸTWÔ´V$\¸öP#1š~f\çNÞÎ< î­(qà“¦U‹ÄƒžÀÍŽvº«Û¥ ÂÔ[Žu÷œŽ‘¦w “Ž‘ŒU¢Î:†´°O×[”x]íí¨ëÛîæ¥k°Óêä¨ßïv­û6”}%»½îHFO#+(ü'òÿ!ÿ„êÝéƒi&€ö¬àpê¨_Æóó<óS$ïí 9R)Xù•Þs+l}f€©ˆ1Ö—õœ{†E%Ïç©Ü8I¤»‰¹ªYäYCzfI&Jy¾6”¤rþò…¨P;ÈðkGÏÐeÐL¶ý w„£lóÎ7 ÚVVkWnvì8žÞr/²‚Jó úãgßJÆßRªÿOÆÿ›"T‹0þ=IU¯wžût#YÚÜ#¨ŽqÒ{N5{>§ò¿›š ú`ó=yɯdâ2£ÈŽáß§Õ¾ bS·õÝÚpo´^ê%Kƒè¥Þ§1)€œR pjèÿJA¥îë»æ×5m•KÄçBDgý:ö0±m— ÄB÷¦t_;àœhÝÀ‰ãW®Ç»d´%ÜüúóÃO7‡# vúë/¿øab@‘zUW¥±$  xåÅÖêµ{…” ©o…~S*p±ž£Å>Àþ|LÛnø5ôˆ+®j 2Û”Øtrj»rs5 YÕ3Sžü0Ú"„ÊâY†g£áÙ{ Júóx$z½)KY_>GD|ÿöõT*ÿ#ÐЇ¿WíŸ~ 6ä E˜n¯¿øªýƒV=¤êóqGýNW(8$@½²ø³eŽ£,Ç‘ÂÕ¢NjŸPnf°æ;æ:G8 'š†]‹ d‚S½¯{À2Þ n Û.z€¢Qò¥·ë…"àäç´?OyûÞa!Ú°¯6^ Î?(êTqjpÖ“+Æ4>[Z¥ü$O<¾áR˜õ›9ýVè`Œ™H÷] ‘ h…Æ`?׳‡ÚÍ“_æÍ™pïÅaiϱI„ß±tŠãÙÛ?|“áPiû‰ER{±Ef‰Î•cׂñÕ’–Æ^îÜoåš@ñ¶íÎ_z¨Íš®ýçå:‘®—nñŸÆ¥ˆÉâHž<ô1€85ù>”øÞön>ùï.ˆzê endstream endobj 1476 0 obj << /Type /Page /Parent 1724 0 R /Resources 1483 0 R /Contents 1484 0 R /Annots [ 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1477 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 263 484 292 498 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1478 0 obj << /Dest [ 1305 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 260 471 291 485 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1479 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 315 457 345 471 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1480 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 189 403 197 417 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1481 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 444 175 493 189 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1482 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 241 135 271 149 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1483 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1484 0 obj << /Length 3219 /Filter /FlateDecode >> stream H‰¬WënÛÈFÿê)¦? ‹áðNà àXò®ÛlÜ,¶v± ¨QÌ–"½$Ç}¾Cß±?z.ËhÙé…aRœë9ß¹}çýjövµr…«íL¹Â?xù±kû¾Š( ì0v<±ÚÍÞ^4±ÈZãˆ&+go¿»Qâs3slÇQ°&›Í»Ÿ3ùçô³*ò…µúÛ,¡M‰ˆ; á`/¶C‡Ï¥=.mÇ_Aˆ»oå¿\»Ž5WžJ'ë'qóT¶÷0âJmÁI²Éqþ݉øË¿­yß5Ìv sË‘Ùý‰¸yÌÛ躠C<™–kžHñOzZ]ýqF“6®c‡ð±ZÀIðøøh[ž­dƒ·j¼ކ+møéØ®ÌÌÐ=´\Í”ÈÅÌ BÛ •ð";ŽE¨I:ú±¨õl;{¿êÁð,qÑÐuIè|c#ßv|XàÛžG‚?;P£ °#w„ªÓ£ê(Ö ä=•oÁRœ5ºÐY›oÙUôÚäÛ\oš_‹w(êÉS ŽƒõµNy€g ¯€HÛ÷&|–¼_¤EÁvö<;ˆG†F;ºCsYˆ4¤Î*þ±±D$Æ%˜7QîµÀl²NyL#¦ÿÖòee¡à¼f{þ0gòÒ²}=1')2Í~P‘2Ö¤Ã>ëv‚•ŒqPÓ: Ò$œGèÖ²¢¨q'I£´U½Ñõïï¬.W\š“ç*¶ýAs£>:8½ÿŽÌ{i*Ô£œf{.a½pC‘bâPTàV"ߘ]½JàI“˜9Ø­<ÁdU±ß•5ˆNˆÉ3¨IÑd¾àjq"!\€0ã@¸dó5¤ˆ¶T4°ÊÏ]F”û®óL|I‹½¶§ øvý?1Q=&L¦úPHÁý)©a‚@Ä¡€ªbä£k¦ÄJ0‰“@u ÙN3 œà«ñ…É 3èûL¸oJzƒ%#á¬y Hó‚[IÎãB?+6‘D¯›[‰ /˳=°à’ÏŸ«Äö£iMœ¸ÖmGA0ßí,ä èó[q'òªËñŠw$ië½¾³ÐÆ÷ã*£)š@I(Žãó,â%3W,ï¥S ÔÎ1SÙÒÁ‰,0c´ßYZÿ™ B¦™xàÿì|=“Páqç ÉùBv¾gæ üWÍKqJÇ·ÐoîFßÉëÍÝ!k %Ï‚ºìÓžÚW•Å“8°\jáÀìÀðnS€ÍøÉuë¹:ÌGåáN8V_eÐ÷€÷·” ¶ бpäbCu-¥¥6yüâ ì/–goÿ+ñ~Áˆ/Ϣߘٗ]ç…íߘîîñޠâd÷ ó ðMCk•ÏìBÜ‹#ÁŸ‘cð· Ñ…¯Q€ßbUtx†±0¡¬.%üˆ+œ"5dQëtZ ‰e ÃÛš2oµC.˜Òä:íÈæˆZ÷&ìDrc0aÌ&äÄÚ³mÎ8Üç@ÞÊËSâÉѳö-´£p Ùã~ጔ€LÉ–ª%ä§wS©æ´ÿ°ë€èìR_lIË®éb9‚oÈá ÕÂ1Õ‚«'©¨¹HK;ªÊ/K6JÊ}?âŠpŽ­/¿0 ƒœ›®¡ÚB ~ÖlNœv#òzñþ‚J%šC©>lŒŽádº£^iÛ:_ï[(cs¤'ˆ–B¥_&¢&­¬Ê—¯@PŠw¡·é¾hÙ ño¼b¢w‰Ç8ͳֈûE-ZÄýˆ¢~dhEXéU׊t‹öüFò…lmC\ yVZÜ7™ÕÔ^Õ:N dãmrùN¤ü†L(oÍâNye´wcì:¨?6UQA±e–W‹ h.•©~—7èî1ëÛÖçH0¸æ„¤áàM\£'†;¬Sô  ß´‘¯‚[¬îÍ€À¦•–´œlÌø°ê~—Èß`¶v-£]›)hãþÃx•å& Ñ«XHH©Ô¢’´T”#p~R ŠÕ,(!nß7‹“lÔŸ@<žÅñ,ïÕF ·x:—pã ç»3ùcYZˆèdéb€þ©¦âˆ•]xm£Jf'¿Ô DÍÔòTU|›áG¯*ç(ÏU}€ú¶#G¼qOà’•í~Vx¸érV„})•ªü¸Æu×0íd-h¹fM-c?ÕŠ¨LgðüÜ*<È›`Æ’M Ñ‰ÉQó¼• i CfÅž[™x¡ KÍ™O*9ñaì×lÈ·LNƒ)shMNžSF«W“‡¼;¬§•…5F3³iÚ uu}æ8ºÂª!4sù§ È‘Å,TÊ•§À‹ܦõêŠúRØ]á½™/ã•ÏèžshŠIF†ár8…⥕—Î4„«3˜DâålÑùnô.׳pÜh©e“Ÿ»¦Ê;‹"/Ÿ2¸¹º6xC )G.Õ5¢–‰‚ZÏ÷/^J4´‡y"ç<Ô}2¡+ï€êhiÏJWNÆ|“=P­ñ±@‹¥ýÝšÙ)sÓØCH“0!"”®¯$ôC†Ë-ûȆp‹~þ Ç9a±€ ;Š0 ýÊ¥½_ÔqŽ!¹S/1JRñ˜nþÍ2îˆÊçôç†do<š½À'óƺHúX{øï¿·4£Ïø~A!Ý›Ã÷æW~,U¿ËxtÎ{Âÿ 0†8C endstream endobj 1485 0 obj << /Type /Page /Parent 1724 0 R /Resources 1493 0 R /Contents 1494 0 R /Annots [ 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1486 0 obj << /Dest [ 1495 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 215 584 256 598 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1487 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 320 557 350 571 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1488 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 463 380 477 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1489 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 196 382 245 396 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1490 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 341 380 355 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1491 0 obj << /Dest [ 1476 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 301 277 315 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1492 0 obj << /Dest [ 1476 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 158 247 199 261 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1493 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1494 0 obj << /Length 3051 /Filter /FlateDecode >> stream H‰¼WÛnÛÚ}×Wl° H /I†$R¤iZ뜇&} Å-‹-E*eçCúýÇ>tÍÌæE—Ø8§ha@æ¾ÏeÍš™·‹Ñ«Å"P¾Z¬F~ <üáß4 ÜéÔ‹T<Ÿ¹Qâ…j±½z·KÔrÇ{<µ[–£W?Ýúê~7ò\Ïó±g9š´Ÿ‡‘þœÞåÇ3å,þ>šó¡¹Š=wáâ0q#Oîå3§¯YD§¿è˜ž3ñC7Ò^¢îÕícÙ¬1hãà&½ËwêÍOcõ×;“Æ5ÖfîL玧—뱺=äÍwS|I¨Ó2s&s­þÉ¿Î߱ƬM๋̱‡ÃÁuB××;zÕг¸OºøôÜ@/íÔšoz¿ù*W£`¹aä«0v“DE>,© ã4Qµ­Fo1B[¼ckôÖõÈ"š­M­¦®7ņ©†I¬dØ5žÍÜ8XkÖª^ :A^èéGN¹ÕU^îLÝdi“î¾×k5vp6Æâ~‹“ñVÚáÐa}ck:w†š@CÏÉpòè¬{4”G¯2Sܔ⪩淜OàA\=VWßÓíP_¿&­uÞØ.«:Û)§©¸ãùtgD ˜)9…rgoîÉÀ6~+¥/B¾«Ê&ÍK“©¼|ÍŽuw­È[ˆ¸lÒe‹•+–ßÁÈV;„As}*Õ„ÏÃ^«³VÒY+±‚¤¥ZŠ0"Çì9ÄàíéŽÛ?tðjQÝ8Jó"½+ŒZUõëgô{ÙÚúO7oß)D£‚ äa ò'ìäGk¿¡h’š:¿Û7fGCï“ÒO s\•Uùãg{#ø,ú}cVé¾hÄ!Éo|âDŸA`{ýsýkÝäêþJÀ02mv<€Éáܹ®xr_;S𣗭AD-;áw, <ÉSÙoÔÞÞ–)DÓ¦Êr¹õ‘¼;Õ ŒÇ1¦ò²Û²å±ì˪œæp.™Ì":E¬I˜a1“VLžÙÊê2MáYÐ9üÊ¡yé¾;Ÿ‰é'-ѵrÒ›xû¢Ë.X^möC+âmgž¶¦5b&1¦Ý‘ªÒ”µ/ØŠ?2¨âÓiXùÔ¦ÂíÊú› %þÀÊEL†qUÝ?äYºjL 5…qH¦X×͵úªíR°P~òÕQ¹LªUZØå1Ëôᆢ˜?Y>S‡¼(ÔU#¦6ifTú:±¶qß:·=@0 XÜB~\U`ȈF<Ž!ßM† z‡ØÜÅò™_ÍrßäU©*`ƒS˜ãS!…æÚÐÝà`¡cšãa ÔödyïÀØÖ€EµL I{yf÷saQ\Ã\DPXÔK0ò —œ¶ ‡öï3àÑúŒ$ï\öE¥Wâ“ ´—OÃJ½„&ÿ ” l‹tiÖU‘‘Zø4Ôr‹uë\ÜJ¢¹ ¼¯Ž )Ðb‘4ãVŠN¨á¥²ãZÀÓ42½·ØÄ}ܽoÄ5G^ ‰f¬ìÓ³Ö>M‘$¸äu 2Ý7Õ&mr¸£xd£ßðfº´çSÁ6rœmõ rÚXÖùr-¢Ç 9äpCBr³>'°Ë©“tîѸ§ A"ïš–¢N¡âÆéùÞsè1ó€µãçþ„¯\µà¥5×OŸOg Y> ~JÖÙÚ=¢Á\½Ë¿P½e¨¼Aì?R@?¤¤{‰Ä‹œiœC’0¼¬Šý¦Teº1´ÀR=¤ÅûµÌ4ë´a ´ìORˆCÖ$Ô·ïÿBiÂd®º5öΜrÄf[˜‹žôg½ÍïLQ\I½°Ð»§™7x"]ÿ—t5‘R_Ùº›ã…'¾1œ‘ÀŽ ¼<€Ñ¹Çöå²@®F¢²,I*á$…€É3htª#è3=Gý”Z›“ªÇªRTŒ2„󇛱ïA×gµî˜„Øî?[ }Õð [Bß´MÄ6^.&fö„M¿ £¶"6~ɹØrñØî–$j™ö¨ ³ûq‰pàt*øÅ³zÆ–g6ÐN¡ûE•a&µ¢ ÂŒìŸrˆ±ä°ó£ S¯lxy\Ò‰mšË˶ì–ŒV$HôógLGúæhõžléc#q“Û™’ æZµ)R}}9Cœ³ZOM’èÎ¨ÇæGuà,k$×cEi¬bª³YÐü*áÒªÆË[¹¸Zšl/Ÿ—I&ð{’¡Lå^ª|%¤»è&Õ?UÊ{Ér1^æG†ŸYî¦ 60]•Gt+ž%¿“¾‘Þ0ä[6-`6]®ÓR8ÿÞdcµ/ #;íþ«ývr1žWšÄÐt•›"“šñZ2qWLÕž IÐÔ{#2cÇqù+Jà* \{ºq|¢û5oƒi ¿Öè '¦D™É¬oïΆU-YâºóB¥ÜN.ÂðœBÐ/v!tµI·×ÄÒÔ7òS 4Ÿ?\ ™ü(‰úÇôbcK¢ÁV(¿Œ‡ãHêüÚM=\⯎Ü®ªœý7ÝVø?N_‰®2S›±.ôYó`$¦=¦}šj”\A™É G˜kî@l>Ê!ËA>¦î4$<]ÌFÀlÿPtš¢ß’à­øÙØ8ËF~ UuÚ’áý-že£™?ÊF³.E’¦6ÍŽ³QÏ,ͺ H"‚ö³"^XžÅ† E¶ýâ2ˆiìv)}幈_È¿GY¦žP>ì6µ]Û¥=°”!¯ÏÚãê‘Ó¡ïeqaÇT^ËWCú­0Åí¨$æÄ–1p ™ÎíS•,ìí[™“PAco´“»êLt{Ÿú™pèÏeЛ7Twý^ÑÈG»ÕØöBŽ$¶µY0å¼'½fzO±H€±ÙI궘붠­å‰åsÏ=,ÉÈÈ]¶¹cšéíÖ¤Gm=es 3I°c#í=YسRÞë§E "Ónn£Ù×Ô¡€äÆÊ&û‹d}! ³lÐÈ–˜žy@pMÝX— P'„]Ü!2TSŠßA£çébÚÓè°î«¶Ôí¦ÅÅzRæ¶²•X•¸ŸXÕÿ«,=s Š ´ߥ´I·Ì ÿ¦œ,æ4ùÞ}ã…³r 9±œˆޏ¹¹&¿f;åâmZ“ã¥úà†jîÆÉ³@?? ÊåÚ‚«Ì¿Ã”(ÔQwÛÀ6±eö¼ ‰ÅzsVT[¶‚‡%Wç0xI¥ɇ@Ÿð´[ÈÍr§ %5Oò阪PtD˜…sÚA”bÑ"cnÕ©ÜA*Zú³ ¤îMÕí#y±-mý#¯~ä®–EN—Û>O6|Û›^`~õbØ×ž­%^ÔfU›ÝZ­êjÓ^MÅé µ{,—ªªEn»rXK} )_ÔŽ’ƒóL;S?˜Úž§:v€ºòç42{„‰HVÄk ’Xòœ\Ëã-·³z9Õ¿m¦µ¸@§Õ!g¼ƒ Qºä£GY• L`ºb@º-p¨ZéT6&ÈmøpŸÆ÷BÕJ"à©¡ †ÐˆÒD f§}!Ct€€“XÉ0 D¨iü(vƒ)ùeÓWQÖ2‰õ–…^ì‘+áó«ü¾D«“òÜê?„WË‚0¼û{‘ð*&=˜7Oˆ%1!­‰ ñïÝí(ˉ’¦e:vfKн¸éq¡Y/Sg‹óÔ¶:§Ãî¨Ú g~J†%Ô= Šàª=‘ß§ ‚“)Yçw©µâ%õ|˜!1‰ ˜˜Yð¥Çû! F؆ Wœë­ÆA‡ŒÅô• [A¸Ÿ€äóA€œö¸*U Øç•c?†•Cü ©Ë ¦«.(`Ó õëÏ ØÉÓ,1‰JêdာíÂ̛֢ª¦S/,ŸÐ«‚V•bV=uÔ±‘nœ“÷:èÛ‹V§6â ›à<Ü:t!¹YÐøxFnßœgܨ© endstream endobj 1495 0 obj << /Type /Page /Parent 1724 0 R /Resources 1499 0 R /Contents 1500 0 R /Annots [ 1496 0 R 1497 0 R 1498 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1496 0 obj << /Dest [ 1485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 448 743 489 757 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1497 0 obj << /Dest [ 1485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 236 141 277 155 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1498 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 410 127 439 141 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1499 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1500 0 obj << /Length 2796 /Filter /FlateDecode >> stream H‰”WÛŽÛÈE^õAšÁˆf“¥1Œ¼ëõÂAÖëìh_â ŠêqM‘Z^,+’È?æ!§ªš’F3;»ðˆlvWUw:uú»Åèùb“¥ÅíÈÆáüLæq8™D)Í.§a:ZlFÏ¿oç”·2'¢6¯Fϼ¶t׎¢0Š,æä£ñð¸™÷Ù#;K)Xü6º”E—4‹Âˆ“y˜FjWÖIJœŸ¦)¯þ`þctGÁØ&aj¢9-÷t½¯º5FbãX2mÑÒ«/èïÿ ÆS¼7ø6 §¦"“¯/èzWtÿrM)F“U«`|ièßò7øÇâ/#Ù±ì&ŽÂ/‹×“v»]$¡5-{uì¦á2ÄcÆ&÷Ck±ôÃbd© Q#§wÌÌp~³4 ñO—ð™ÇÇã5ü·Á1ÞC/©¸«ê&˜„3ã2â.ïÜ*¯ûª °™¹ Æ1‰Š6à³$ýq:Ú]΀®ÿöW¬ü%'áÜÔ»ïë>°œˆ*°8ˆŽnLÕo–N]Q-Þõ¥–;oû~œÚ¬¢_ßã¸gæõ«…Lú=OyÛ·ö[“­Ì ñó.à¯øe¤uj:ŒÌMÖ¹«º›€w„/²ówÁX"öFàq Ë`j¼å—EÅkœ¾v«¬Ëøý÷Rm\!Ü½ì·øÀ‡ÇfS®p m`±øCàŠÏÈ›Þ!qkq¥Qì.ð!…Ñå!›üÈÙÜw뎖Ž*çVˆ&Íní*ê·µH4ü;I™n2l_‡(ãษØlKÌð¼AÈoÅ Èü´Sµ_²¢­>Õ¹[õƒÝºÈפaUu÷ Kýd(k~â}´®cýÂõ:añþ˜X¤¼n ¢Ü‡j5ñ5 a&¢I˜$óéëPélÎâJ‰ìñ­:×lØy0—×Ë.+ªb%¯YÀ%}Ûáhͦ¨d´uMwuá§bÄšª¬åKž•ŪE¶/üÖÃI’ļÿIdgÇ8ÛÄË•ë\³)à(tŪfW©É;Ú•¾ºÏD–n·./Ø£ŒljùY¹SçÓ¹8·Q¢EÂFôëz™ÝTí`‰ŸX-kÝEÞ ’“š­Lê´L®^Ì" NM½ü ©‘É:ðöõÓ»Zò|ºÉ*´,›&Ò;?ï?CN§—– ò˜S;¦?ËïëŠSˆÕ aå™9˜õm-Qz^ïôÒ×,u;7wuÕXÖŸÁz~HêÜúÊ5cú•8°»:}Ç[Öué`çSV «&¨²s[74@FÑ  Ö\œ Ørâ2¦e 3|¹7ÁÅãsl‘´ ƒš¤ß{×ì—jz@p.¶ÐŒNjüXâãÓ/@)w®‘¶ÀÀv8ëKÃÀþrdÏ¥®: =«ððŒ`ëY_Ÿ7 XfÿFÈ»Z¥ÏO‡ZÙÔ¨3Gñ96GnÊ›bÛ‘9–†˜Ñ‹ŠÞ kÅægúäš¶¨+ª«rþòEÈ$o6=Þ+e¿®kŠeß¹V9c¹? œ™è> IÇW*äƒyín³¾D33{¿xÚ…ÅÄÔ—Ê€4nÜ,‚„›#”÷É0™`x€¿€4tZÆ-<6¥ŸóhÆ‘.§à Dj)_Ûl½ZÙ?¢ ´NDnŠ¥Ñ£iº=ú@W‹R}lûöÈUÖs·³,êx·f-¸T¤¸¶*­°Ì¥è¢K@þN"‘¥úÁI3Ïk}#º>Yñ0_>Ñ/ÔÄwY`Åo!¶‘¾rA+'Bp:öjÅq‚£ºµ—€—Ù=YO½]©¾¯îÙøÜ‘Þ"^\ÆRBªã½ÀG·Ò ïd‚h𓻟×L„h0Y…®¿éO¿±¢u<{ƒßÔ¬>xHðÅÁ­±³š7Ë—4næ¤ÝÀpá]ˆ7z‹ŽÔ`ëîù›¢qË¢Yqù¹ÉòÒñå£oy}Fw®rM1pÁß—9æHåVçxzNvbÔ+ ;P_µª7jötTå†57\0É¿J †,±A¾tòqž°8=›(:ù»N†k®.™¬ïêMÖž?ÁAÿÝ{„³ê_oEîsòRb;u>þ2^?˜¼oÚ ¹uk”+ûDRårrÈKÆ"d—5«vÈ‚\Xiúéš/ .ð?µT¬‹¢ÛC?•ýuŽ“¼aÛs)ýÓž-ezíY°¢©Öÿ,ª¼ñW¿þŸÒ;W쉺ùµȺ¾¹ÒÚzƒ,¹öcWo‡l¹–Ê⣣7Eé6ÙGˆÜ '‡ãjè}S¡rKÚ6õ'l˜Y&BkGè'ÔöÛ-\@zÈhóxOJޏKNëÀc_²™H­rõV«¬)—ò^¥©¹ÐTÂØ1AäQÈãzW䆥Ítnô/ÓMb–åžxM)oˆ—·ºSXs©i)òŒZn¹!½ øôÍ{`¦Ç §¤óÉ»Ù{+üi+Ó¹·!ö©÷öxO{ØhÎôrÀ@Ë <é¹To;ȸ–ò¬â:AdC‚2¤¹ìù+BÌ:Ðû–ÛÄA²I.o{ï·6ê ÔW1ÆILŒ`ª2bÂå·®Y402nŒŸzüœm¶ÜžÂ‡ÛÊÉD¥`¶ïÙC Æ‘'3®bÿé¶.Ëz§/ƒv|㥣øŒÓ³pþ ÒôÍÄÏ '^^š3ÍjC\¢£JNT®¾dʘ äéÉx3¸;Ë § W3E{ÚÉ“·-Ú(t{A–ÒWë:‚|ÀMã˜Òs$óÛ'(³d¸_ñ¥æáá#äß±I(c‰àkJW«å›Û(7Pϧº ’n<ˆÞ¥¼ þù”ªàû: ¼2ľõWšb~_'0úÔ#k—J­a¯Ž/¥Ó²øó±2óÑi®2Î nòÖ÷ÔoèofØn‹"°`ÔÄÄÜîæ&ŒAW)ôšd!¯«aUÁß§¦"o{°—ܳ׷½ŸÏõëéí;>vE¹c`H´‡9ÒÏÃZ×{/_#üܪÍK´5+DQÕ͆•y:Hüi[f¹Î_×åÊAŒÈWö$OèÛû·ØKX§Bõ ‘{%B-©ÁïR§“µRöNŸQ¡öý–E£nä$ Ã*ÆëëS¢hз™oX¶ðõÎßÔ7–0¢a&0Aö%i/lƒ:Z3¾5»‡¾?ʵ.ÝzbN¤ [ððÿ®±b4‚s2K€Å?´ýŒ]_`…eÒâ3 ¸ŒöLÖ:Ø«ôÞW´RÖ:¡¨äfœÀ¬p¡Ëþ±ŒüÒœp-T^t(.J mì PJ‡%: PmU”šîZ‚+X gòóPZš¦€¥eæäWÓjd–($«Ì‚¢LpãH\¼»†p(@¹ endstream endobj 1501 0 obj << /Type /Page /Parent 1724 0 R /Resources 1503 0 R /Contents 1504 0 R /Annots [ 1502 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1502 0 obj << /Dest [ 1485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 449 757 490 771 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1503 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1504 0 obj << /Length 4104 /Filter /FlateDecode >> stream H‰¬WÛŽÛÈE^õ ?5ƒMRI†{Ç^Lb¯€ â ŠjIŒ©æ˜—+²ÿÌCNU5EÍŒv,b#²Ù]]—S§ª^/'Ï—ËH…j¹™„‘ ð?qùq$*]Ìý$ fj¹Ÿ<ÿ¡ÍTÑòž@µ…<ÿñ:TÛvøAbO1™÷ý1ߦ©ò–ÿ˜,øÐB¥¿H x–ùI rùLÄÇéižÐéÏú_V§QàMÙŸè S«ƒº>Øn‡•H’t[¶êÕêoÿö¦s¼7ø6÷çºô]ì.Ôõ}ÙýÓ4 ™éÜ®½éB«_ø¯÷÷åŸ&l1[~‚—å%ÖXƒûû{ß›ù¡néVC×B4®ôñø‘.ÜÒŽ%½YNBUªI4OüYªYêg™JBxRÁÆ8S™l&¯—GgÌBl zcôn@Ñì½çoŸ„hpd:_ø‹þƒlŽe3ît9)ËeæÄøA,_$` ºê³~ANŒá<¬&Ú¶òjš®1]×fðŰZ®_²Õ#|R>sþ#™áˆ‡Pü©ŠÜª•Q­7÷3p éNuµzv0²øL•_«¥uÛ/Œ¡M·Î»\–¾U/ŒÎ‹ð)ïÌÞØN©íÎw‘x†É¯OYÓ)+8 }§(DG%é‘”„¡¸9–XkîÕÕ¥*­Ê!H>ôþPW’˜BèêXZ(í¶2ª©ï/Ô¦ld­SE]ñÉŒ$€½½ñ|µäÏ;à¸uW;OõNþ¦¯È1¥}p_Ó©a¹Ÿ:4“}Ñoá¶bg™5 'gAWØvêϺñÈãØr+OuaÖ½[Tî×EÏ-[/$L@Ôà´ª.r/Åb¥® ;Ô—jß½mXìâRnVÃ/yH?EH'÷ôæBàQ¯N ººpÍKKÊTåšÄ&ú›Gè†JyW¶î”ùnXÛ‚ÿö¼NòŒ‰ú‹Å‘$ aŠG9JT/H¯(áäûY Ʋ2F´k(gõÀþð}_=NÇ ´0¦c0Òs0sé¸ï)—ô¸t×y§¾õ¦9ÀÍy§8ñmK9bZSwã PÝï­é”/}‘t¼8•‹‹Ú’Z` œéœP^.‘H”îªËW¸á«·@j˜ƒºã‡a_o({.Í­†Ú°»&¡µe¹­é:~Ý\øÆu¾éLSZÁÎòN¯p¨=K’œ÷ò‚Ñyâ¼W¾ã—² è)“VfS7FÕbùj]{\8µ¬ºúéúͧ¥¯~ª;Cnõ|ë8j 醲°Ïeð9@ïàž8¿ËËŠÝõ [ ô§?×µ0j•ËnÊq\,üê9!.áÌDæÕ}~pÏâ¼16ëIò³á3s` XBë™®`Úì ]N‹Ýá°T8lŽ{¿RåúFSy™ë~™kçõêã•Úô¶èÊÚúréIžùóÿC–E.ËÖ¡ó(¸{["†ÓAÊC7O“+NO„D€\QíÇA)Q}Dn€¹ÍG„hª s}G F†ß Hž\y½Ó)KXK)]YHG~¥ÏS.ýp ß¹7wÎ]Ãû›Úî~í¨™¡b¢®6Ž{‡Û/܇ދu9|â¨åÁ *©ÝÜÉÁ‡J ü¿=ä‡lx&ÞS^µÓ#UÈ…Žøè!¹“ „Á­TS[j j[ð§—u||rð…fz[Zë â` hݶ×*À­)˜0(uò³Ù&c=umªí÷€ •´’‹$"¿)LDR¹|b±w9(Km€þdr·JÕWs3¾úóðxn•Uy4E-k2/ÑHÆXµ5Öi–CÍTu`óJ[¸½Ô —NÊo¥6¬]™= 1ã±Iáþ„˜,/ r'Ä­Mûµ«oÑø*‡“Õý®,v Ff«]~çeRâ‰PMn›úÔyÖëG‹ÏzoŠ]nIc½gW…ì*ðžQÌÄvzÌ]¥x±·%èÜ9]Sû•ÚÌæŠH€ÀÆm'vT@½$Jâ‹Pñz*9•Gü¶frW›8öÎ<Ç‘çËaU~5êÙõ›w^H¾xóÃÒ£[½õ×}u‰öí§ïÕå+Y%ÁüâÞ^óÏ»7Ï|õaCª5-¯0¯gúbh± ð¾¬*öþ}Ý|E<ŒÔɳe'ÕŒEÍ!’Tg`Å5¢˜ZAÖžª œE "oo«RöåÄßh@a]nMÝ·ÕáWé<}Ô]ýÞ¡fvÒ>!’\ö@æ{÷tvAYKOf—ÑúÐY¯8;|f˜fhÃ)•¹Ë1}°?_pBÂû‘=C-áZ@]rJÕä(M~œ Nšã˜Kôƒ!€79ÑÔ ËÊ-‹3EI éƒHQŽº¦lÓ뎡¢²G;Й-댄©pƒ¶«û2µí)Ã<Òn³4üßQ¬Ö¤?-»ø‹lrM†ˆ‘æÃÓƒo2IÄì£H žÆ¦œ·ôÝÐ2>†,¢\1ò#Øãnÿ´û&ÆcE$^â(b[YtŸ¨_ãÖ’õR/öGÉ$B=i*,“QOÊ>Û4õž·žRÆ* UDDJŠ®¨{tð Øû3rI.OJ~:¨òæ´¸€ƒ™úòc!»º”Ý>ULسä7š6Ôà¦X;±¥ûí©óIÝê‘Û1º|ݹ³D¶FCÿšseÖ{ÐDßÕSªG N5Çecràá‘=w![î¡`Õ…ZõèL¡Q%¬J¡òÏHxŒ“£÷ÃQ£ÐiDYñ€ Ñwe®>\­.ô®<Ýè· é²2ûü+§ ðý‘×ä¥Vs? JÄÉ1w«@p¾¿­xPù¹äÒ’r±™KœÃs—Ã’Á3Ô®Üî8‚ 9Êý¹ø{¦üˆdiñÄÓŒØö¹(r2`mëú¹·äi’¸^V«Œ½+M–ƒÁñ:u‘ì?ÖX‡þùÐ_ã‰Nä›eóJnG¬Ån@x€{ñ`\~>gžÎ¯ŒÜ®qa²äpb\A>Œ-ž±[AO" Avm&Ñ j¯¥™¯Å8•Ó8qžPc0‚zåO«ú$ÇJ¬ÊîÁ{µ‘l§Vh1ÄÛœØCâIá˜`(|{,‘Pr–rƒ¡…x…7Þ;ge˜¾Š¼w·S÷ tñ2¢gŽÖž¸v-\üÄËy4¨qö>¤ðÒAvP»ýàÄu|ˆ;bk:®)`:þ‰õSK·lŸ¨Áiµ;ß5ŽƒEè n²b”z¬„<õž™ -U¨Ñly4¶Ò3FzFÓ(@oqj¦? x>È!nÈHŸþâž_» ( ýŒ(›/â1f6N1á1ã*Eß¿q–TTSx׎¹›J¬Ð+ÏÄ{‰ %dâ!5îx4Í‘Âùº|Uý û…£WB‡TâNÖš”¨µ õòGa‘¾Ÿ¿Qh)QC[öÕÁ:|6ËM '•"“ˆÇCß+j†‡UùQòCL£ Ù$a6‰™Mþ·9ý°;›éss©I çè(éÈ t¨qÕÚÍ.ù–'MHH¸Ž#þ;‘jʃj{]8ª@ï#[ˆÑ¤k«,Ñט–þ$y¶‰ükzfÙÞæj¥Ã ô›v2ÈG˜5‡¹¶ |Ô1{5SzR£UºFòr˜—Æ·»ÛïCy(hâ"NÔ€(îÔM3DŒÉBÄFó!ØðÐð‡Qü+†Ç¤K ÖÑ]iåj»pÛÉè8ÙªM¤¢;¨€Uó„nØ_ñcÙ»¡V;0­±„×,ÂE¼Ž‹ƒH)\&xÎöP› ór*zd Lö6a&2/ƒ+¤je¼’ðVukå©Is$i$j@ àõ\Í_]‹­|4éÃRhš–æ¿a¡ãÁ´æå²«lÝVŽ5šØu:AÕá°·)h)‰w":zÜèè:å–N9hA±LdLááqA– šïf8Úe ùh¾Ó6F)É™.`ÕШW0ÜÚhSiiø«áN`WY|`,&ÇÈ4‚€ñ0˜–43…Ç‚Ã]îòÈKœODz.EßÈõ´Í½† Ÿ,5m¯6Àw£'49fš HcLÞsoПj™ÒGÄH"$øì‘è—h¨œ©ix]ÌÊ´-D”2Ãj¹c“¨Úg(võGC»}ÑG‡õÑ¡)®¹× 0i»‘!×—=¡0`)ý«°{&9ÅG¦à&72E=§-bÝå¥kÒמwù†h>nKs)3\=Ô4ŒÀÏÝFFI·D {›}Œ~IR]R]z=ÂyÜØeùÖTÀtÄsÄXÛ{»º5‰ë<˜<•ä²$%sÍ#A±Õ_I|7 ]h7‘ìf±ä=~€Þc_:qFú¨\{þ6b›Àjz|"jÑP{=Û–çvVôTU˜Ì—ãÆ›Y¼-^CíMí£ï|]Z|ŽI®t¡$ÇT«ÝšÆ¨e¨ŸiþuÊ/«²ÍÔ6¤q5ÝT“©ß»8ã¾*_£¯”Æ ¡ºÝ9ÌØ%-Ópù-ßAVÆ¿éžcêQXòè ¨dÝô Ve.¬(z´Mǰükê/%µz¹]ÓŸÝ ?·>-m„AËk³nƒ2 7¤…CZä¶DÛ­Ñájá“úûh7â»Ñœ.7'úKJì3`´œ”fM©¾5¿_£ûª‰tY©øÕìOH$ÎôðùÞ¸ÿç“q¯xÚy0Á ø›N•"”® ²$<ƒ> ^Joì²â½ÖUt>âˆWËâו¿zÑ -gó«`<²l<&?ögü¦®V—£ž_E]=Š{Véí]~!Ü8ÞA¢6ŽpOWwÅßͯP ÿ𣩾±} N%!?f,@ó ‚Cß²Ì7on?Ìîæ·óòüöž;¡‘³I@§é“)­›õÄ»oæaÐõåfh‰²f»µ æa_·7i½Q.˜DϬ{ù…py¶ïáóLÁzâHKƒfªM, 1\K„‘œ¢Ž¡æÔ áØ›°»¥¹Ó§2^7`ßE }Öè£q…|7ƒ°¶Ý°%D».P‹uÌ£;+˜.bqúe‘×ÀŒv™êE±Ë޳»›ôIе¦#Ïé­Fo”;A¢g:¡{ù…pãlË=Ó =ñN€.ö|rŸÉÇÍ×/Ÿ[º£3€íŽvÞ]éi1ïfßç?ß¹›¿}?ÿùqöã"v}xѾœõŨZë¯UçÒ³A}fñ?S¦žð{UŸ¿ endstream endobj 1505 0 obj << /Type /Page /Parent 1724 0 R /Resources 1511 0 R /Contents 1512 0 R /Annots [ 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1506 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 152 563 202 577 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1507 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 523 94 537 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1508 0 obj << /Dest [ 1174 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 260 482 309 496 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1509 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 421 262 462 276 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1510 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 138 130 152 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1511 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1512 0 obj << /Length 3971 /Filter /FlateDecode >> stream H‰¬WmoÛÈF¿êW ·D-š¤(Š2 I.9\›K®µ ôŠZ[¬ù¢ˆTÝéèì‡>3³”dENú¡œÅÙ×gf_γYD!ÍîaDþá'N#?Žƒ„&Ó±Ÿ¤ÁˆfÕàâU›RÞÊž€Ú¼\üpÒ};ü ±' ûÏÇù9»·NRòfÿLåД&?M x”úI råL$Çùkœðéæß¨Ã(ð†áÈOLÒ|K7Ûº[‚ëA’i‹–^üpNÿ7c½oìMá&_žÓÍcÑýf×¥™¬^xé¡É_ï³?Äb±& ü‹Ù÷ ‰¾7òCÓò­–¯…h\éã3ð#“;ÒR$½ž B*h”„4šøiJIOlŒSZÛÁÝàålçŒQˆ-ÁSoì½°GŒxo™Þ“$ðñ¿Ñ= C; ¿x4Øy4©=¯?gÕª´t׬éMQÚ*{ðR?†+‡#?5kúyÝЭ©›zXmʮشv}Ne–?´´‚gljVvM?~O•Í—Y]´U{ë©#/Þ„.ü1«+sõ§¹ZØÎ®«¢¶Å¢©s{½µíÕÅ1‘M'Ó‘¤!Mâ¿$Þ;ðá7¹ãdÇ£)|È©ÅÏÿ{w÷ˆÓE˜!nˆŸd#øûX¦©‹eˆðÇË檙wYQ—Mž•Å¢ýX^ß¼~ûúÕ þóÓ‹¿ÝšWïßÍ^¼šýú§×¿Üz•óæ/ïêó°×1âz-Ø+GJ>Ã?­e0†P—q7¿¼{õ«Sãæêâ •¢ˆšŒ¿¢ÆiöI-’)Ò+rZ\!ojû¹+×a ÿ]]ìIOuHÒ‰=Ìg™œGÊ|>Nþ:·wLúiü•,z†ÿR`;võ†4ÅŠýÑ(.{œHâ À„hAëa!VX„úÂ)°`dèªÊV×—tóç·Ô®„dóâ®È•{WXù 2ü.¨Êd½rA™¢¾§;›u›µ7áó­ˆÙ,=n4;5¡Á$:èa¯e¨J¾jjN1» ¢¾ø˜X׿ ¢ð]GaaaäðêÎÎ [.ØÊsºÊÖ úäo¹€Ãíõ±¾C‘Ìð:ÚÃkºócêTÌjÊUMÕpü ‘ŽuÓ-Ùoœ´§.Þãz(ü`^pÇ‹M×­‹ù¦³-/CsytcìÇ“ýa¼oÒ.úä¡ÇÆAÀ½=Z/œ•ÂÃz¡¢Ÿâ®ü’ÖXN¹cDØ”-æe3×Ësz°[·>ŽùÞµ×ÞìÞ^§-—<Ú{Z¼ítæOÖyUnZj»ŒûÖØÔ»záV빯g.©F¿Å1*{Ž2º³k‹†ÓžS·…µ,CáÈœSÕ(amñþvëMËùÄt]²µ¶ vñ9È ±. ý67IXz”HþHJ8Þj¬FÏàæ£Á­,¨ËîÉêw—ÍKG^:eTõÍm÷hmM°  ×c¿±¨¬$ŽÙHB ”ì?Œ%ÆÉXØC¶ _9*ö÷×v×ßµ^(‡¸×¢ä­÷ÔiûïÍ œ¹<`Ák˜ØpÛKâ‹1ü‘K‹¬ó0JH"ÓvÍÚ~×,ÌʈýÁqb cÂ"ÙCSž}ÈÈ·=<î¡&tPsI å(>~]pñ¹øxAYY6Þ0åÑQôg%»:Í–‘R[bF‚±ý6öèÄd⾉©°ByÔW£iDc-º¬ŠériM]n%„ˆÃ ®æ\Ÿ‘”¯˜8ËŽZÖxײ\‘Ý­›J1zÆ‚"ú;w¿­õéÇŽª´—J‡F›œò n™€rk”;’ݶb£nͦݸ=%”wèæµ~`Àå "8š· ð»åÀ5¦‰ºEz9!xz¡÷AÒÉ,žî³xª–6µ•Þ¥¾Ì#áe¸yqB ïd¤Ì›rSÕ>qè }¤¡G™õ¯YUÔ“Yë‚ ÓˬÊÍxF)åž=†¡ˆ$ð±ùÜ Æ½ o=®Þ÷º8‰”ájB5w84•ø‡ÿVfR*ß™˜]…/Š!%•—è5ë“ ý}úk]ŠMêªÑsœµ‰¦p*I ô*Kê™C6I/U…ê{§‰‡ &éo×tÚ$\£[NƒU8ÚûÂMxYùÈ›-ú‘ 8[#óqS⊠rHùŽ÷/EvB¼v7rLþN¸\W(ÝéT¥F·“áÆZÃW[‹FÂù‰Ô“XJ§Ï¹A"6«”qÙu )Y­¤ Stƒ 2¤ê[ƒns S5xÔ‡Z[Ÿnš#¸SÌcqgNF¶žŒÝ—y¬hͱÿXžÑÊEþ“xD2bS³¥°Ñ±ÔñÙB Q“È•Y¢eòœÀž 5JP?£|É”ØlꇃÔì–·*êÜÉZ*Ž]qŽO{bÕèÞ­+'«jfô‘›'»Ç ²ùyqt+ÊHËYñ†ðpüǦÑE•adõß'SrØþÑï‡P JDsˆ]ƒ”‡ ’zÎ…91Ò-cé–xä$QÜGÝH᥂‰RÙÏ6ÇÐg4Qæèɲ͹Xóå6¨IR@:~¹~}Nó «Ä}R  ÑÌ1¾m5ÐF:z¾DÈ1ÏRÁ#~*CmhöfâTnL÷ƒ\‘$wKסQ鎰‹÷á!eSûOgî~ÿÏñEç/sÆ/)öÆÙÓ÷Q̯£à+„KXÖ?*q`?ÈwÚm7%­äàÞx»&7]“¦ ^ »QJ¦{®N.ÄÝ#ãHš>ð®x°^j¶ô)+•´‘jdæŒ1òàŠ\ ã/^~¡Ö |a(ð|¹°+n·uÇòqW]jtkyfQRŠÍý"L5¸^¼­=ƒßSá Fæ3mîmy±r¤>ÛíZœË]¿÷B&½óà”Òê˜\?ÞIu"OÎ.É~vIÔl)®;ë†?1‹!,é?l"[€jh0KÍÊŒ&&K5»ª»CãÎJ–OwÅÐ'œ<X= ^»t·¥Î*nGÿëXÂG\G;îðTtO µT>¿¼fBçi Ã§ÎÆ>…{̲¬uËâÔ ó_Ϋ­7m$ ¿çWŒ*9+BmÇ»J"¢bºÅRUm¥È³AÌ·]ö}ÿ÷žÛ_ÆÐÝ.>ž93çò}ßÁ˰GÒÃ(æb ÅV=1økù# ŸÈp™0mù´e˜ô¨3°'@öf¬v¿½êD½¹‡3ž'ÏéZf½³h×QGP^¦{5˜ ¬‘RÐèEú'Ñ©<žÑ˜€ºÊk?е`íCfÛRò—ã€ÞšÐ’g¸&–0Ô±Z$ø5Ý ”ó:æà÷’DÝÈ«üIp œ|Þ¡ö€ÖZsí¦Ý³\þ²)Ä_/1æÍòà¬ÊoÑ ÂÅ,“H '1›]ºÏb¨Ecú”CÁ\ôŠTù<£|ðÞ)u”hr@×Õ÷Õ‚³®°G£ÌjËnÿ0¢Ã í0å?r†jöø:¹6qôd¶Äi°K-}…ÈÄ{Ö~/ÏøåYL½šq%XGÆ%b­‹wŒ£ÇîFÅ›¤ÒAªÄ‹€FUéøãKü7 ÅЇ,GXÍ}‚Ä3F#´)1vĶ— JºôC]ú!•¾G¥ßVüzJ®@KA `e-ØÑJ“í*quÉ“ÿ_¼!øÞÚÀV¡ @7ùÀ® ÕæÛ©M!R¿[7›xwyåÛ¶…˜~Ûú8žFÓ?Ù'ËdJ4y-?Ï;xs0™Zät]×;pÀ øíxº¢Ï}r±Dýa4ãGŸÇ£O#þ© ÷£/·o^Zoï*isz!®!’ÍVLžX›ó×°üŒYûÂcì 9ìêê;Ä÷(•0ÔðÕ³¹æˆ@rJhýÒ¤£5J¸%€È†”¤îˆH „Ð#?™‘vV,œSR¨o‘@úYÏŸAðN(ÅY3·‰`zZÁ“"ΙÔ$Ó `ÂZeHÆ=‹Iˆ¸‡È ‡;”„xy°kÿ¬J ¶M„«\5Ø8êæ½˜Û¨¦èî5Á°"î/­¸ÊÿƒL>*„QCÅ[a̘–Kɲ‚ìe9Éú5£­ØíÔG¨¤?Œê¡žjŠ:"5M˜EÂé§o™hIbp?)9u°d» <”Ï 5õŽ‹Kú\!Å:Ážüzy½˜¶¼zÇÀŒîò×ÕßÉrŸnn[ý("0=D³V­×Ýnc³™MÔå`:Ñↅ§l¹?ïD7˜K­] ”íwiìŠÈ€­(fJý£Ò ¥w³Ýr…d“úÛ½‚µ1Ç+aŒ[9¦ÙŒÇ¬¦3 ;=ôÈÛÿÉ­çÖ73»õC|0 5@ÿG <7¬¹0Æ»ÆF¨¼I’ã%G©"ر±" ¦‚ÝèÀä¹›·ƒ>Ð@ò4ÙêÈÖŒuÆ¥'â³×+Ü«vf뿆$ö˜ endstream endobj 1513 0 obj << /Type /Page /Parent 1724 0 R /Resources 1522 0 R /Contents 1523 0 R /Annots [ 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1514 0 obj << /Dest [ 779 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 116 502 138 516 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1515 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 483 421 525 435 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1516 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 407 133 421 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1517 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 480 407 521 421 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1518 0 obj << /Dest [ 1476 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 402 259 444 273 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1519 0 obj << /Dest [ 1524 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 149 232 163 246 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1520 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 260 218 302 232 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1521 0 obj << /Dest [ 1524 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 387 178 400 192 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1522 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1523 0 obj << /Length 3479 /Filter /FlateDecode >> stream H‰¼WÛŽÛÈE^õ} i^Ä‹Œ€±7^l`7±€±óÐCµ,fyÑ’ÔÈò‡äòyÈ©ª&Å‘Æö[0€†lö¥.§N~³Y¼Úl"ªÍnF*Àþ-óÈ_.ƒTe«ÄOó V›zñêmŸ«¢ç9ê‹fñê§÷¡úÔ/?BÌ)ÞøxZ8¿êOF…ÙJ¹›-V¼h¥²À_¥Ø8Îý4}yMÄËé)Iiõç?F½(p½0öS'ÈÕãY½?7Ã#‘c\ìäôe¯~ºSÿø¯ë%xïð-ñ§t§Øß©÷§røbºŠ7‰Ýl]oå¨ó¯ûÏÍŸì1{~Š—Íc N§“ïÆ~èôtª¡c±5Žôñø‘SØ¡=ïô§Í"T¥ZDIêÇi¨âÌÏs•†ˆ¤‚Ë\uf±[¼ÙLÁˆCL žGãÝ€"âpô£¥ÍÑÒ–˜°ôã8Ï”¼ŽAÍ’ÄÏ¢YTƒH<•ð±Ì#u¯»NŸ×¯ÕÖðÀ®lÊ¡Äcä´jw ‰Së~0òämË3)è±3貂/s%ñŠKoÛv4f«Êæ5ç#³½:õ³1£´0ºXr¿+Mµ­õa}e‰ÇkàͶëøèÎÓ.]Ô…SéG—ÐT¹ðÕ1¯¿~¬D`‚v‹íe£~ý6v~QO¦ë˶éUÛTçi«sâË~ù´_nc¡UH<$ Bá…a8÷W¶eÈÒ%$ÑT³(µþܹT@æ`ôà¢hg­ðïNÝOŸšÆ3g(›‚ßטѻ) µv¦©Ãù2n±Ð1…ÝXË,ùµ»eæï­ÚÚƒùæTšƒéì)œI³çù›y9ºy_6½éS™Ú4C/§5métÎ`ê~WVÿú*!UÝmfQw#l ‘„p†½ôÂŽédC9 ±S_¡S²ãÑìÜ%€Õʨ9Ù¯ƒyi¶–Éžx óå/|^v9:“£á¶ˆù%bósGoiû%“^åx!–“è 0kSʼ½>NôV°íà"~lVubBÑçg»VFF›õבMñ•¨Y6~ ‚Y:ÃЕGŠ…GQ ¼‡8ø;5åRÃ=ìŒaÇZ’ëÑ]×Ö>ÏëmFÁÁ)\·»ÎÆMÑ BÚ–(Ñ¢(Ò/Kmâ¼Vƒþ¤0‡&ÙA„ÇQè.ŠÂ:-oPUí©l>©ö0€t¥4Üæ­Èwtž_xç݈8²0Ê&»—`X¾[ލ\Ú°8×,}e }&ûãŒü~1¥®Â¼ô³å5Ãzã#å5|cläð”:´*@VFåü=´Jž.ñŒ)J„Â9SxWS"8ä;è+µ<Ê/‡0uÎ;†*À\mÕGÇn~d +ðjÛPÔ±;ú&sÄ·†;Ù³ÅÖH{7%K ƒ;¯wCðëm¢ÉvôuâM´]磫Nû²Ø«’S}¤_ñçYW»ä+ºïK3Jî´_Ä\à‚?¼xv@>µa©“…Ë@0GaîT(Wh––âÍ{Jg¨µ÷L¸Ð;Ž£ˆ=”O¦:ßQf{—å'UæRCNâ™òU6 טJ-BÊ>ARPïu Û»Khx8Ù2Š‘¶Ã¬Wìþ%ÙQdÓaLÌÏc•žý?RôÁ  QÒ€ücS•5P¿e²ÁÆ@9š¹.öf{&\ƒpni:YšN™K„Lçñ"&I£ñ’6» ¼ñ‘0Ei10Fö„+k#Å€„^ðœn=î ¡ŸtÃÕ1ìõ0fÍç<€ø2E‡>B¬!Ñ)teš­Ë×ÝMPéeÁ®tW`Ú%Ì7õ?#À«7sqToö­³ÿ@‘ÔÁ¤Ö"±%Љ|˜–º _ÿ†gçÔC >4_iÕÔ&Ùu¹¬q§7"ž¤}?[P‘^´цV¾[•¨ˆì¥¹HÛUZ¹0kaùØÂrnA±HNk B\|²µƒ>ÎÌ"5ů P¼£õ†/*ˆ ´,ÇPG³+"¯”údE 4cЊÖeù.á`oé+ãòý_ÿ¢äup©Qj\Ì\† Ú²#K;Þºà(FØ]f"تvÖ¨ø£ëG/‹þ™—áóT§ŽüN’´f“³íîJ^É北F°¢ýÎmž©i–¬WGI‘r~—²P«1´ÉÃpÔ«95R nÕ¢¦Ô´Õj4DVËt ßÊ6"c¯X(Nü š‰úÕ¬¸~ùñ _7ßR¡„£N–S¿Å]Ka٘˔þ?Úÿ½¾ù<\qX2]Y¾¢T.&Ú :Öìbz _=Œªu¼OÄŽürÌV”¼òÓžy¡LF銔VCÉÂUD.ö«G9òΆƒ-~œ[1*™¯íM…P’=¿ì°tbTß\y¢’ÉWJcûÂÅ(¹¾ÙÉVÎ’zf=HÙ^¦wÖ.È.ÃêõW¨—2qq/°î=‹¿Q³9q;ìUO}|8 ‘Ê]‡áÎWP<²ÄîØqË9y¼:rkØN‚`Nг½æûܳë^nn8“Íc¸"ôïÀEö„Völ ICW0’û@Ö5ôVUí‰[Ï3(Ãh* ï‘gœ¯¾§2PPþBN¦ÔúÒ9p÷“Ï }yààzÓ=te—h¹wœ×êÔÊÈoœU»jn¥|VòÏȹzKvóÄš@ÝWßåKTm.U\IP©ÛyÙþ]D螉Í4|MÃÓ]Уb„°Á½jÆgó2f·• 2ÏÚ|gÌÓ[ö¶¢È  *RK‰#ÙØëÃÁ4víkuE6×½ý–ðC`ÆKÒ‰O.棈æt? H¹ÙæÖΔí d Y|/¯Àx1_òú»K÷jÍ1ß™š 5ÀvtêËaB]ö¥Î|«O¢Ñ‡Ÿ]¢ÞI2Èá Ùl%¤÷eS$ Q åaX¹òžð¢ÖY“ë _ó™ÓG44´³­¯ž:ìeŸ šÃžÃf(¡Kvþ|—O›@ Åïý‰ÔH¡ù·H«H=ôÚSo=Ñ%t‘²h’~ú¾g{˜™…ì…(c<Æ~þù)u8£õƒþmô±R±Ï"þŸ“³‘‘@‰ÆÎõ[£ͼ³"&”V7ˆŠE¹ØmüHÖ>IBuxÖú“o=[¯zÿ¾{( E¿ÈD Æ//VF"ÊH°N wÎps怬k­[‘ôÐÜâDä&\ŒÈÒßãúbrQJZ›ÍHN…žFñ§ÈïËžÌv5½TH v±îÄï50‹C½ô4ì£ê¯(iæÂŠfk„α—FæÛœ*À¬IÈéåb«w} Êã QD¡êJg¿ÂšÿhÛl§Ü¸ô 6ÁíXg•TÊåØ!Tºcï(n›¼qܹ@Ø™ºÌÚŽ ŠÈ8‘D™˜M'“…¾ƒ“„ƒÃ5Ñâ³5Õ¨¶X/(ØÞÀ¹þ  i©ñëîtm§™Îä….̉Ÿ±l·wúæEA×m€Ñ¶o¨2j•° ![®óå­<ºŒ€TO‰gGÁSJïßè5äö|`Ö®SU¼W¼­Ä×BSü~PeÛ¥ödA²:ãsú¾ kÅ®„Nͽß5^dkSX”×-¬ýç Í%ËÊ‹ÖÊDk,¡ƒ»EgôÅexš§7™Ê$ö¤)œV³š§´5î.ÍÍR÷rz´I­—ˆË ¥È½wioCäèÁM;)Â:诸¨+ˆ ÇÈ´ªìVŸ\_kHݵ>ŒEYRóöš³Oiéx÷ÜêŽZઠÎSº5~Fz­÷wkP/›Nâ*Jã±&8´$]…kt:Öt ©Á,ñ%uÎhÜAÌîðF&˜ƒŽpuólxsïn®îV­cÔàÜ4jÖo\»ŠÎ”ÍÃ)š¶ÄïmTö®µ%!Qtâ Yxµ0à È MDí¤ZdAW‹; ~&}«H@ùH¶˜:ù[„ ˜µ9š±$ò¢e1ïÇÞ…Óp"Ò㨦ŒäÛOÿ“Úïà endstream endobj 1524 0 obj << /Type /Page /Parent 1724 0 R /Resources 1537 0 R /Contents 1538 0 R /Annots [ 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1525 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 428 689 436 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1526 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 419 649 461 663 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1527 0 obj << /Dest [ 662 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 254 635 271 649 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1528 0 obj << /Dest [ 1485 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 163 527 205 541 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1529 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 149 500 163 514 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1530 0 obj << /Dest [ 1524 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 267 487 274 501 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1531 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 419 131 433 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1532 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 89 365 103 379 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1533 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 201 325 214 339 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1534 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 234 284 247 298 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1535 0 obj << /Dest [ 1539 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 278 257 291 271 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1536 0 obj << /Dest [ 1546 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 275 244 316 258 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1537 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1538 0 obj << /Length 3752 /Filter /FlateDecode >> stream H‰ÔWÛŽã¸}÷WóD¶FÔÍrÐi`7—Eöa`ŒÈtÔ6Ý­D–´²<îžÉ?äóSUÔÅ—îÁä-L[¢Èb±êÔ©Ã׳ëu¨ŒZïf&Tþá'ÎB?ŽƒT-W‰ŸfA¤ÖûÙÇß2µ9ðœ@6ÕìãOŸŒz:Ì? ælf‹þñ4ÓΟ¬2Y ¼õ?f+^´RËÀ_¥0e~ˆ]^òrzJRZýYÿ;Äè" ¼…‰üT™z|UŸ^«î#¡¶,éCqP?ü4Wû·HðÞâ[â'ºð½yž«O§¢ûjÛ’D:¯¶Þb¥Õ¿ø¯÷÷õÏ3>1Ÿ& ü/ëßcŒ=8N¾ùFhWKÛÂ4¶ôñø¡Þ¸¡g¶ô‡ǫ̃BÍÂ$õ£Ô¨hég™J "©pÆ8S­íf?®‡`DS‚óhŒÑ ("š£7f&Ë$~Ë4ðñ_– jêøîÚz¯à·ºÛ¶Ü–ÅÁKƒî~Σ¹—RÀÚüUÕÖ¾(÷]mkKû%¯:UìxjYoòR}ñVBoA!i‹ü±´8Ñζ¶ò %áñc½%&l‘ŸTF«ºSy¥òvᢾ0>Žƒ` dÒ>ýÆyßæ”ÑH¿ÒÑê‹{ÇÆòðˆàã§´>[Œ3qì§ÑÇ$SÂ8BÙKdŽ|Y eûñBr$ˆOK_aï4Ðòd;/¦£m­<s¬ìVâ{—ËpçEÚ¶^¢é?@ê|{@ì>!Êʦ»Wµ³)úU96Ô¯÷NZ©¬—é`ÜnŽÝªË˜²Óñè,þg½ÿkX1€­ñ—Ú"ýŒ‘ºŠGë\Þå/oLŒ81´¯™`÷¶"7P äø‚ƒé—•G«0 %L!6¦0)Ôæ³ºs&‚ͰWÛ÷¼ìaX˜ËNýV™ÏŸxL˜läÀ«i a ö±:îùÐÀhíÆsy—¿ìHŠC£èx„ãL«F¾Ö+ò—ÒŠCmî˜VÚƒ{"ºÊÈ^uµ/Œ6¦ˆ ÅeŸ¿ÈvJbqX:}xÁ ×Tˆpõ9ƒ3ZF]q”K­˜~AœòãØ¯€Dºaîì9<9üšHƒBí 2&-ÓõO£o2:<޾Çã\†;;òÔ +»H2ý¦ýQÈJsy·*oŸ7BËã®[лµ»SüRŸæ\šD0´‹ Сvƒ€ÄºFHC½oJÛYÿºÉ]ww§&n,F?¦nü•д⮩Hšôûã{j‹®ƒ°wS-ת¯”ÇÜMqq”xïê²dQˆÖp¢=£îlå¦þF]àÿÛ­ÚL;×7³ýèÆk—âSŸNCóÎAûn’ý¥n¦0}'Ëf¤ý^¼…S¡q˜á€Úç~ïXU“("ãòc7µ3…s|±\÷,|·µÄ¶7‘As%0”œ‘ iú‘LÛFŤ!i¤–J~#÷ô­pxRª\,Ppcû·1-ód7&>?6WWÍÏšj[ååiz×xu1ÝäGyB·ÄÇ#"ðÔP’ÄÂF‰$8~ì(zÐ(ž G³E©o-³1Ü 1ïÅÕ9ZN…‘ÜA§WÐ?B6å* ‡ŒÉŠ úæù['oõél·¼r.ŸÑŠN–áE+D¼ ±*¹Ë(wT»¨ˆ„rFþQ'ÔN»ÒpÁ‡åÌñû¦¥¼É³„]V»_¾œtd=AV}Ü<÷ðdˤ‹~K8¾©y˜ÄC(\äÇ¿¨½²¼¯½ é°ˆºçMy¤ʱã)ý†D„B¤Ün—èQVÕ•åŽ2êfåPIœ÷µÆ¶äð êøÍ]<ÅÊÄî¢ü]lQ[’'ª»eßm˜ß§ì~iâ~pF(d)ÜMTçu#ºf©‡s]r‡’Ê_Ïe)•W£ŠpÕ%ßùf×IaÇ€”†¡Š®äsÜ×+E ·ÌÍÃqÀr"Wœ*âQG†"Œ“Ü2(IÆçHÆè«½V}9,&õ -=Œé26Î5qW€vô¶|s7l)!K:ĉ„Õ¦KYZNožW7ƒÎ:@`Oü¹z"V¥N\pÊû·ØA¯Òµ¿ÂòMbj7^{žp8@±8b—ß”ƒ|óéWJ·ÏX?ˆ0ÛÛ¼âcUð~,¹Ï8÷‘ˆ0×õ­ª¬ÝŠFÜ7×lû™ï¨µA…±éîÖý üÛ˳sý»;ÅkÚããŠWE½˜Kœ±`®«r¹Ø•¢6TN-®mÝè«Ì‚­}\¨yäà~™”¾’íÞ`}ãÞy;ËïÒæ<õÚÙ|Ab-õ?‰w±à$¼ðàw*÷n”læZ³‰\¿–kó[Ýcì³MK9S`°<.ò?Æxä‡^ýdÓ'|žH´˜<Ò@Qå–è;tÈG ¾|6õ€wa­;¼ß»eÔ (’‰\7¹‘s>s6F<áY½p¼.ûvßtÐÞ`ðÌ­â²QÕqÿhÙöíîŒÝ5pݵÞTÎ ‚°ZÙ‚ªP9ÆSØŒ÷ÿp(¾ZÒ]Ô®ÀÙ‰÷œ¿mþŠ@¬4´‘H ¥ÓSi¯ô3‚Em‡BñrÞ3Þ¾[}Ö úÁ=]Ó.ó Ö\f"‚§Ö\rôNnWÿg¹½?ºš§`•^ܾŸš‰\pzíý—ñªéM¢÷üŠU¥¨¶R¨©Ê­×žP/ÍeCÖÅbmSƒ‰Ò_ß7»ØàT¹x?fggß¼y£•lIÙ4 ò&§l¢Aw'Üš ·Òü–,PüÊF4àïFüš±„|5MÖÈß-'7wXœÎ’òGˆÒ•Úú%¬:C¯4glUQàfìåSjÊ¿ê}â{$,L¤µ,ò$Ÿq^xO¼7}߉ú¥F£cI)9mRjè௉Q ÅáVU×Äv$8‚À‰›:Î"±fš}­'³Tq3úµ5 ¢OçÔZßrÛæÕ lz«Ñ#³•í»ædápý¸¼ÆÀPÜ)±7Z™ÁÛÙjïŽ/ëQ³•$\p* CÑ3.5>3"vî À¹åãvfï톳 7÷Azôò”²áwªñå[¯9<[>αq¶ëZúí‰U õö'®’¡l²`ÎhLq·L|Ô·Fœ·ŽWÿVAå'à]ÔTÆŸ!?û›‹ÃàPO3pìœIpNÍ'ýÌœ O˜é‰ƒfâšK+f†Æ.7‰fJ³™´c7B´‡¸ Dä#÷][ ÚIîä/©Dùß.ñ¤Iϲ/£…çº*rq‹º9DD*mÎ)EÍ Ê\=áâ'ÓñÆúЙ‰°;÷p~ ÔxÁâà’õ\¯Ï¯7Õ×{Ý–›­À虲c%Ø¥^êå%¦-ð ãûæÀZ¬<–M2¼Œ–oþò¥,‡ú{JX…g”1®hZT™C~˜/¢ø+!ˆ]˪!ò8mcAýdIã1æ½>°Pu®=ª±¢ñ¾y-µ½%äèu>Ø„ªµ`œ ôï¾ÂÝïip<õÏ8É'?”x¦à’÷ g/’'áEA¯ù •æÑÈ·èï‡ð5˜ª©.g¹@Î7@‹r MSÞÍISŸlÀ>sA›cfà¸]qAËF®#)„'iÃQHIbX–ˆƒ¤‡-Û°9Ùš"ÉKå–'Î6+š²-q¡Z¸ÖÕ‚ŸàGÿÂÄÖÍÑ0U]éÍI¤ò“Kë¶Ö Eî¤ß8Vþy¦&p‘x§¥áËz½4Ø\Ü l,Í4Z–ÀôãBM$·J“¹<"òèàþt/{Ç9I oKÕ?Á#Ê}B²Õ‡æÂG5Æ«+gë`=jÑgìܰÝ΢ƒZœ%3·â¿1Ÿj{ìÒÉ’bný'`m=¸Jþ:ðÚúm@pìç6Ž÷ÎŽæ7ˆÍ"(n&BCïH¾}_ßü`GÆL endstream endobj 1539 0 obj << /Type /Page /Parent 1725 0 R /Resources 1544 0 R /Contents 1545 0 R /Annots [ 1540 0 R 1541 0 R 1542 0 R 1543 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1540 0 obj << /Dest [ 1524 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 425 703 433 717 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1541 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 273 451 314 465 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1542 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 251 270 259 284 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1543 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 189 113 203 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1544 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1545 0 obj << /Length 2552 /Filter /FlateDecode >> stream H‰ìWÛŽÛÈE^õ?5ƒÍ;)c,Àkï.v‘Ë" žuÚËâΛFðª¥Ûµ—Àûå§­üElÌFvÀiXêá9uºÁ [ézq*­þÅ>È;ëÜyS¸È¨xÝFNX¯¢ê{Ö%uŠZªUoº-u]Kãu˜1Ÿ†>;çóS8$?±ÇúŽšz]÷Ä‘6>µû5ë’˜{»¥îJ‰}h¶Ûò@¶±kÛö° AªÒÓ¾œ"¦¦·-õ¤K«!gYöå}évZ691¿VµŽ•e>ò}ÈÅJRSaå~Zˆ±¬³ÖÉ1䉆>tŸfáe¸z…(«wz«iå âzá'‰Á—öRÁ ù8^+Z¶Ó.¹ÙšGO,sÇš½%|0KD0¿Q…°®Åv”áŠnˆõòã]=dÏåØÝx°Ü7=½¦ðÎó¯"ö™G0Ôà$­!Gý¸Ý‹ÉÈìN¾–ú¦¿¢DjNBÈ0B]í*«ôתÆKö‹lkP(úĨTpyµW·ŠQâ‹H|q€ù¹j÷BKÎ'N¥N*rýB-ÇóE°Ã£í.[¹^frChl³$À«Ñ…Ñ_\Íôyù¨ºª>;2³Ä¢­ÑZk9YºÑ=e?¿Qÿd¬*˪ÎîRíGªºÁÝ»EÔ-å.œÓÁªèK)ŸD41št•[7âÈ[÷µEh$áõËÚr îFr¾ŸK"°09ùlÌÉ "ûÉ›Iì9g+^ÍžKà$1Çà j3øQÌHœ¿ïžnjø†o®{»ÖTWKìC³Þ4¶·þˆ ‰ÃþÄ BâÇq‘“¾ 5C»‰Š“Ž$¨ÇA‹BUã˵(iËA½õ¤«qå"-¡¨,V¼¶ë¡ 2GwkízÓæ¯Hv,m¯¹Q7Î-~+J%a@¤£N±ê´µU·]Ò Yæ³; 3Ümúºkw£'®ºà`~: ü"91ÿézÑ[$cYsýÕí+äÜ\Ân†FêPãl„Þ†³$gÃå·T/ ý䍨TDp¿R×_¹"L8—ªÆ‚³©VÜëk0+ãJ$ùÈ1΃^a^ã(«7Ä1ó1쟽flÕmtUŽ;Ô½HÎ fqÙc¯5]ˆDæ…±N<õåG}”RÒÆZuO‚®©P9AVá`—j»ãÌŒPœ@xd¢'iØx’Œ`LÛ5TËwλ¢t”_Øó+‰Þw7F.WlZu, Ls;æïÜmw—¥~^œdËìX3ut'!Ì ­ô¾L ¤ÖëýúÈ a$±r¹eϪKŒ‹ò°ÔAGå<8 N‹ˆcKÜ'ñô žöéijî’~U;1Ã_a·ú,M„Õ¥Š˜zÞÚŽ¼#8²äàFÄÒÚ–À °Œþ„ÿð(Ñv==ÔŸ¸O£i[ 3NEÜ¿±g O·Kî‰]+)³.i´öζSÉéçIàåÄùÁHꨋÁƒ…°šfÂà Pw¯$õIëž9ºÛÉ*8Z–9R&˜ÏkìôŒiYÙ÷î( g¬º¿pK¥Kì~¾çOvÐG €ý( ”óšH|0J=”®Qc¶rPî1°‡ºÉi9þÒÉ&¸Úi:sšÞ9¹Ö’£öiÅ$÷´´w"qÃÀþé Í@ÚûùëÀWÖQŠ©‹²»9¦‘¢+††”µÛˆ‘¨IüåY6f6-ß*aw~»)ë|a`¸àå#·Ã°“ë°C¼K9¹#ô¼çù!B§&7Çè3Œ 2Ë,äy%†…uùópùٔѺ7ªÇYf(Íè’b\C5â·™ƒìh3¨GAõ¢.ä 8[©Ñ+œ>?ÚŒG°ÐEêñÁ+BÆ9Rï]ÓÀˆ2ˆ#™! £²ô×íê¹¶F»¿™)äÈ&eü©yèiÄ¡è+þ6/•mÀû^Ð͇Îh¾òwƒÌ,Œ.<îå—™™‹»ç”Ò¹ÉM_½FÒI:êuøÚ[~Y•–ì#ª÷V)¸â¸nÑ_÷ W'¸F'¾aÜ-ÜÀW6 Æ1uΦJ·u`°á<¯+L¡[Ó¸õÍMçêJâ/)ÿ|Ù†5ŽyœE\„.À3!ÐaÅrã°K‘ܺˆ{tHkð¬¾zöž”©ÞÚ¸ÕqÄçÛÎ3#Ôœ™²3qžKÊ…0ã¹NdøP;ÀuîK]}rãÓ¿4ïÅQî3–µæôwøaˆ‚Ý·mdzæŽS(E¹4½ÝÎÙˆq!ÜkhœŒñÃH¸è¶ã(&ÇDÞ–ÉMf¾>”ÅŠêÿCÙg(;Á‹‚Dlé™d?môIúMnôn@{îÜ+ÈAþ¿7v]^ñÜ(ôì¤#Á8èĦ1͵‰ƒ iMQ-ÊdÆ}-7›¦Ö¢´ z¨£ø4Ÿ²1þ™ãÖv×Ӛݘ}Ä2L¹9Ú Cc¾@Š窕­~&!zµ ô´5×&á²Nør Î[á=b#8—…]mØ¡1g\@ägÉ)«Ý”Ê/ U^©/:›È“Ì$Ji‡Ü™¹áý¡­~'ï¿•u²íG ÉÝ£‚C³¶£`«J­Ü.@³v™£Ì¥öé: ã¼Í×þBïQ·J}ußÕQ¦úcˆ/Óçš­ Ô›º­Ã]%.h®|»˜üsü±®Þ endstream endobj 1546 0 obj << /Type /Page /Parent 1725 0 R /Resources 1550 0 R /Contents 1551 0 R /Annots [ 1547 0 R 1548 0 R 1549 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1547 0 obj << /Dest [ 1513 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 452 625 493 639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1548 0 obj << /Dest [ 1323 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 471 196 501 210 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1549 0 obj << /Dest [ 1204 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 129 121 143 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1550 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT12 1672 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1551 0 obj << /Length 2063 /Filter /FlateDecode >> stream H‰ÜWÝŽÛÆ¾×SÌM€`EóOe,ØØrâbë$ƒ]÷bDVl(R!)ËÛé;äsÑïœI”v×Þ´Eÿ @ä3çÿ|ßá×ÙàE–…"Ùr„ÂÇ—8 ½8ö1žŒ¼$õ#‘­/^µ©È[Þã‹6¯/¾™â®øžïØ“†ûÛÝ@~¯ïŒÒP¨ì/ƒ šˆ±ïMŽR/ñ­\>òqº%túVþâé0ôÕ0ˆ¼Dú©˜ß‹Ù}Õ­ð$”FA’l‹V\s!þô›ްnðnäd¡|™¯.ÄlWt5MÉB"©«…N¤øÿ«?g°ÇìMè{ ÙkØ›X ^Õ”Tf!Šê%§p,b]$Þx_8Y/œºÁ´ÿšŒ äýÕ¹aCxÀ4'&`KnåõG](t–,õ\Q=–ˆu,Í˧­°Á<4‡Y[ŠJ|ÿžJ>’߉¦i‹ºjE]•÷O›å¥y© ®DnÃc#3úBdüÑ¡Ýé–d Iì”hÕÍÑ©Pêά‘gûà ²)ëüšŒe×5Å|Û™––$ûRóyûÆÜ=U]™}}& û½6K½-;‚ôwª8Oü±}ý£ºcø‡ýøgjÄ8‚mÒ´¼0Â^GB®c$‘ݱuÛÑ(º] |Ñ‹ aûVÔ ÊÜíQõÞt‚;]P„ybf¸¸ä×¼¸âH1|±„D™§Õõrfû¸U äî£÷è¡&&¬X? Θ±¶–;€V^]]½„µ‰¼€ÿ¼ƒñ„z ÆòºYP"ö¯ã×_†–Q<:¥«ÿ4´Dÿ]Ðþ+¡%8BKà e^לںÜ*t?èÿ98÷oE“ðG“Þt+—H"ËÖûSç™?Ç–c3cgÝ~»ݪ VGEdŠt {alÊ~tj8&þU1þ·æ'Íaà€°…‚œ]Q–bnøÞ|RBš¡]ó«/ô²3{ :(kº¢ºZTf'ÖÚ¾"˜Ãù 6ì¡LtŠ2½ùò––¦r¡(ƒžø‘`g«ËòþBìVPN†iÖ$¬&Ù#Â^Ì©Q¶6±¶†Ò¾w‡®U-òUQ.—ÀçÝ{¾Ô·ú¢)y¢éoÐ ò'ÖŒÕâqŒMŽÞ»ù¹i•°YB\,k·‚0ÊE˜üçôÿø@³,Éûì¿&5л(±hH¶k#ríîP84nó‚å;ä1w'ì¿Þ‡ŽTÜÛ£âƒDÛ‰(,|ÛûóäÄ‘µ9 Å‘=ã#{:f˜p“a°â£@,_½ü ~Eià’þ ö@ÄqÐE]Ö›ºx±TÃ>egx݈§²Í›B¥rÓaÆÝ4fÃg?Ð<ɱмQü:Ïy¨ª°rïqÁqÖ¥ í×YA4ÊšXY£ß!jÞûö#ºÖ\>?};}¯h`œâ3HówÄV4|‚…ÝÚˆ¯®ß°'_ýô†«Ä¬êr¡¸¡öŒîsÓ~¢™)8”ûfñêÎ{®ÇgùÏAÙO5Ø0îÛ'ÑçJ¬4C† Æ^ÐØ¿:~MBPÔ¤Óë“XƒËÌR}–¥/ÒèXä”1ä÷ä…Gy\Ò&ºÈÅr[åP†;·UÎH«Écxlñšø$þ=Þ?ÍÆ‘® endstream endobj 1552 0 obj << /Type /Page /Parent 1725 0 R /Resources 1554 0 R /Contents 1555 0 R /Annots [ 1553 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1553 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 482 689 496 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1554 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1555 0 obj << /Length 772 /Filter /FlateDecode >> stream H‰l”ÝnÓ0ÇïóG»²¥Æ³ã|NeÒ6`‚+¤E\0!”¦i”¦U“­”kÞ‰wà¹ào;éº*5ɱÏÇÿwŽ}{çy¢|á©€$~x„i ÂPÆ”d‘ˆS©)_{ç7]Jeg÷HêÊÖ;¿½S´ì<)¤TØSzþøº÷؇bY‘J5ñü«—Y§Œ)²u*béâZŸÀº›·(6Þ÷ìw«Hî+-b&SšèîÐö+XVqDb]ÝÑÕí„>ýá~„ïÖ"±šKV®&t·¯ûïÕ®±A4+Ú9÷3F¿ì?ÿœ¿÷¬b«&"ÆGþ6[Á~¿\ Å:“µ2i)^¥X9˜V6Ò›ÜST“D±Ð±"ˆ4¥X$Ac˜Ò®òÞu~„¡¶Èç4žèJC„YzèQ8ô(2tm²o#Ï$Ô" N€Êd*#'x‚jiÚUà„Â{äA lІÙŽúözuÖcŸ†1ˆðøæÖúùŒ§Ð|ÐìrBÓÒ-7ueí­s#T\k‘þß™gHyvŒrë“TýØÔ¤JL3üQàF;5o릢뢫ætg*Mïc3ДAZµ£ÍŽnšu%¬j{rÁÁ2}9ïGŠ2AzBQi•Ëz³iû¢n‘´n/ì$ìv8F±HÆ92ƒíB8÷iÇcP9 ¶üRnÚQu½¼|YŸo#*¢)íž]=5ÇeM1ã†`ÃAŒU/‹QÇqz^ÄŽÇUî]G톚M»º Œë–ѱРI`ŽXWoZú¨…œ` ·MQ‚ÆŒ+ƒþà¶ÐÛ¢ßÐýŸ´m–u{XE endstream endobj 1556 0 obj << /Type /Page /Parent 1725 0 R /Resources 1560 0 R /Contents 1561 0 R /Annots [ 1557 0 R 1558 0 R 1559 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1557 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 689 346 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1558 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 369 689 383 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1559 0 obj << /Dest [ 1574 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 111 154 133 168 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1560 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F2 1668 0 R /F4 1669 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R /TT10 1667 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1561 0 obj << /Length 2455 /Filter /FlateDecode >> stream H‰´WÛŽÛÈE^õ ?5‰ÃæMÔ¬3€íñkïf €±ŠliS” RkŸýòùÇ<äTWS¤.kgƒ ñÒìË©S§N=Ÿ®¦S_(1”/<üá'L|7 ½XŒ'‘'^ ¦ËÁÕ‹:YmÆx¢ÎªÁÕ«;%õÀs=OaL6µ—ù6]h¡’P8Ó &棉{î$ÆÄAâÆÏk¾ñÍçtÅôõ{ù/OG¾çŒTàÆÒKÄl/îöUó€'¾Ôf’uQ‹g¯†âïÿvFî7x¹‘,OfCq÷X4¿êMi& dZåÎh"Å?Íç—éë9±9ï¹1n¦·xfvðøøè:«dM«jZScI—žëËÌ>z03½œ”(ÄÀb7ˆ•Æn’ˆXI3†‰ØèÁ|ð|z#Pâ£Ñ¡ë"Ò ‡…6F¡ë…&sÕâ9wì÷õ¢P/àãàg쎥xZkà~;ÇŸà€8g#šýZÿùÉÚIÜP–ÛEQ=¹qpT%‡4"Á·™ãÀe¡Í ªø¤ý°Üš§øÐü>qF!¾º¹æAoÍ”-î# ã©1Î;ŽiÇïåó´Ö¹¸3{Tf‡RoÄ 3ˆïÿÅ ,ß®übUÍ‹O œ’S.òb×Oz© Åø`¢&-*¬]T×&Âcy˜Ö¦HìŽ[Žiy þüiíÄ8ëÞþTÙ}†9!P.7§û™™vx 9„,±[J+‘ñ¶xGÑ7vt–…ïe“.°%)rM? ¬O‘v(.È 93'ÍCaÆeéºÑ<@|ôLk‘–t±rRQ(5H%¡bAO׿©Î :­²³fiIÌ din÷‚_ò vöÌ„‘¦øà8>=ùM”‚J*îþŒÒ>”M³)fÛ'Ä­’„•"ž|«„ùÖQErAL%¨ÏŸŸDª—•^·34uÀ¾¥Ô˜¶€R2lS×€Z ‹HwiQ¦³Ò1I(æ«y—Jo7iS¬*±š‹T¬9ufÈ ð+–¹@ï(/6F·—Wv«— ÁYhbr ÞÂÒ^·ÛJÄX1MúiÉàÝÝ«Cùæ~™VÛ´t×ùü„ecÈLO#üÃé’æ@V½Ós'‚¬9DFWØØOæ2s&ÍlÙµM&Ç1õº˜¶ÚN̹[Í›G:ß­Þérµ^êŠö ÌÅ›¢1 kø‡ ÍeUS1ÅU&^V H+eòˆD°ÒWœÃ€¥Ÿó:âñ®´XêåÌh „l5GqEÎÓ ½±[Y>~•ÆrY”{q"€ÌèÏþÔä³/Cñh¸÷À$?û£xC¦H®Kwéq@áàéWæ3»ú¢X®K ØšttzØQOïí•W@Dij¯*Š ŸŠÄIæÓ‹@ºôJÅ?.?üHœ·¶ƒ7;~ÝÞb‡¡¬¯2¾-y »’µ“ ÀÅÇ8j/68¡•ld-«“Qè„.p.¾uU\‰Ì “bA·ƒQ›f­Ût£.KÎÓx¶-Êf²~Ú]¸×âóq–„Œ{IªÂn%fÇñj¾OzÒß#§ä—ï a¬z…–0-Y&†,¡ä!†,ç—Ð6%µCLLÚÙøÙŽmV;‚ ÏËœ3×^\núÝ*ªê'³%”-˜žk‹Á÷Š!@ik=ì1E©;ðLopͼçâõôê85Nð„ðF“¾ð‡Ýßú˜´>c±yä'TëmØ ämkˆ ©Ì³MÊÕ"ãêðQ7¢Z5ö!š @…´tXØ,ôê—íÔ‰¼ï°øå Œc‚²y…$ÍG¥×Çû¢¹ö:ëÖjÛ_ †=nl<ÆÒª­$¦³S¶³‹(I2ðnfÚ?Lj€ýŠ”?/v…©o9šðÙž{%„?ÛòçÔÌ¡4-õfÈÀGÏ®q±më*j›»Ô¹PŸ¶@Û vc¹;,ïË=džó¤Ï^‰UUî/´¼_w¼hó›TPJœ³ÝSÛºé(á÷(áÇ'ëýÉúû°õ¡UOyæÓŒÄµIÙõrÊör„$kkŽ.ŠÆÚÙ*ÑÅåÃ@¦ëÆØHÒmDäóiÕ÷ŽS®o[Q>ÞV/ã]«üÂ{o>R±ë™LôÇ?ÿ·ƒCU¡ˆÙ¶ãÜ”C"ŸµŒ=ñüèõâ~ò„=A£ ;âÖýKB}emØ1é.-ÊtV…IÛ Àn²Y&yu7½½zûîgد ŒÍU®ë¦ˆbñÕZ°ƒâ­fâk«“Òß1QY&¦%Y&eZ èjYpB¼yüÿ;÷^Z¥Ü¸ìÒ+¾ÿËÜõQŠ2ñ,73ô0'웸AØ‹SØ#ßkÌs²¥Xõ"Ó5f­ý…oßQŸÈ#Ì;°£¢´“—ÓÁe endstream endobj 1562 0 obj << /Type /Page /Parent 1725 0 R /Resources 1565 0 R /Contents 1566 0 R /Annots [ 1563 0 R 1564 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1563 0 obj << /Dest [ 1379 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 269 712 297 726 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1564 0 obj << /Dest [ 1016 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 438 159 466 173 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1565 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1566 0 obj << /Length 2095 /Filter /FlateDecode >> stream H‰”WÛnã8}÷WýD±,R÷F6@'ž`€A?íd1P,ÆÑ‘ KNÆó!ûûû°u¡.–å8ƒ±Èâ¥ê°êððv1™-Z(±xž(-<øƒŸ Ñnx‘ˆÓÐÏ‹×Éì®JIJ¢1ž¨–ådö˃«j⹞§`Ìr2m>ß'ò>[¡’P8‹ORš”ŠØsÓö7òx]š£i:~…Îþ]þWCïT{ÎTùn$½D<Äá¬_ GKãÀJ²**ñí—+ñÏÿ9ÓÚ;°…n( Ǔ˗+ñð^ԙݚñeVæÎ4•â?ôßù×â× ELÑhÏ ±˜Cyðþþî:¾«d…»Ü–†-]øô\-—¶ë…Vúi1Q¢F®)áÇn’ˆH’b ±3“çÉí¢ÃW0Ä;F£C×CD$¡gØ3 \/€ëûI,¸Ù€‡¡ëªšEÕ³¨Âåj'¨Äõv½_%5þ@ü RSUņ»²}ýrà åH»©N]ϦH³“M„fÓ['ðÎTÉÜÇ`by'ž!5ØWÁ²;'€4 dŸ È5y"ïa`(8Ó@~§xcŽ7´ÓÞ0RHhn]5C v´«¢GǼå'/Qׇ=É?ŽLÜàÿX›’O´Þˆƒán>ƒ^èº Ý‹»SŒ9x>‡Þ1lži:ìàrábí•âu“ïׯ„£»”H‘-ëâÍIaTæL±´j¢Ô=ÿzz”ÁD(\ ?+›‰nH£R%[8)Rˆòz6ÒË@±&>ä­QºPQXŸ½*½d £Æè(²o½ÄÕÁ¹É[›}¡º€<þ¶•Übë~O¿`n ÜT[+ÓÏ ¬qûíâ³,ù š} [ó{,æSá÷X,@ 0Ì[±4Ô“å¯Eù ‹¼ÀÕ}KºüO: ¹ ã‹Ñ†NÜ0˜³k"‘°{QÑÄÚÑÈ ƒ•›riÄ °Ä*øJ¬ —òœ·uñj˜ ¨Vß JÏ…HÞêH¦(Ÿ7 õÖ³îâÑÏ!K¤E¨M-‘¨Öu†Ìl ¬„·ÙY†cr»ÿtfvo8IêÞÒ%b°´}KM8£ÎV£üê¥S);ÕÔ1†¾¤riè1p-{äÉcè†>BèÐ#=Ða€–ÒZ ‰Ê§ðZÇ…€©²ÚS’þ %é#FâCâ<ì3R¿ÿ˜‘ˆ”Èxý5bé³ñ|åOþØÚìDðû÷­ä[?ðk|úsõ#³ž‘B/‚•.3Rp–‘¶ä ¶_ñ²‡»ù”Äi§ Qƒ„]Þ}Ã2ga˜4¹ç§¬^§­té)›ïºÊ­ƒÕd–x—ü€HµUÁã*0–WS›—˜xÝ÷k Ëh›qÿ·u™ Û˪„ù 8ÔT -Êö—mAöôЖ虵)ŠiìB¶SÌ)ïe•ÈDUïˆ6§làŠ_Äߺá²j¹+¶}þØW&Hù©³b]áÈ1&V>VVì „(Ü®ƒJ”¯%áL<À½¨†»‘Ž“?ý™½n׿koH7ûŒ°JŽhŒhÀT”X{ÙŸæy+’‚µž'…3Ó/˜{{¼RØw:{̤ÐU¢‚÷Y̯Õ?¨åužÕÙs±6Û Ääì-ÛÍà2«ðL\^ÏŽ¬Çpù)¼l†…õ<5¹“Fð@ob¿çÍì£òLΊ̳Æ0jŒçOg|òÇÖf_øíE l7˜|ÆþyÂö} Yta-aë–°502(-:ϪÞì@IaG}ØúøÇ‚4A"Ë/7_éCÜC™¡òç<“š; 5(àjK-Ë­´—¬ø!ÆãÊó[žf‚åú­XVCf?¹4hl¥{á ÙþnS•@QEùé%é ÑÇQGôºãImºFÊI%ñO,ßì¯@x”d)hQŸ_ºûÌz=¥õ[¢™vÔçñòßP, wÅÓ¾6V;¢·p•]ðV‡„]™¡\Fßèu~èô¤Í«íï²R,4Æ+¼äêέ¡H¾nN8¶ =yÛ¤œÕÍñ U;9:äàá¿1²­Ò–ô =ÈÀ©IRïËÒì²µÛ"þšU ‹CÝ×Å£4ë*K´­.YäDJË¢¦ÉÀKòÔq’tê˜+¬Uç¸÷-à YPpà£4µoF‹½FìyxøEpR¹ƒ…ß¼ÙºËÊG)¾Í3ñ›3»ðÌîȧµáÁâÑiEj¾)xr¨"xÒŒenvëê·nÇ]1G°Î@»­.Å÷9FÈ;ÀN ¬DMI;·xXЈ¹ÈÊ\ÜÃ- Ò¾üNIjO;±sÞø5ÒîḂ]ñÿ‹Èµ endstream endobj 1567 0 obj << /Type /Page /Parent 1725 0 R /Resources 1572 0 R /Contents 1573 0 R /Annots [ 1568 0 R 1569 0 R 1570 0 R 1571 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1568 0 obj << /Dest [ 1567 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 261 730 291 744 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1569 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 141 661 172 675 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1570 0 obj << /Dest [ 1562 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 141 578 171 592 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1571 0 obj << /Dest [ 706 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 130 346 151 360 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1572 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 1670 0 R /F7 1676 0 R /TT2 2104 0 R /TT4 2109 0 R /TT6 1665 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1573 0 obj << /Length 2493 /Filter /FlateDecode >> stream H‰¬WÛŽÛÈE^õ}jR¯-r00^Û‹ ¼ëE¬§¬ƒG¤4 $j R#O>$ÿÌCNU5)ŽFZÛHlØ"Y}©ë©So棫ùz¹#gL)Êüº÷&”<ë’ߎ~…OýÕ66I8¨‚ôè·T®~¿Ý©¢lójM&â¨D—%Yx}Ÿ©aˆ×¡©Ioj405‚ñÐÔXLM5Ńß7d+Ðä¬Lƒ¹8’>±ô-qLÃÀD.“¤’:*¸úkHD?z”ñå¢ZV‹=¬ Ãû<–„*Ûrר%\‹”D®"¹<¤ð87û†óë1oš²@ÚayݹåNrsf”¸`25@͈àgÇxfçâi%ž¶gü}¹›D™ cJØ?ÎÝøbîåýžßWË5°!Õùê›b øê!¿¿·W/¶X6!Eߨ…gK9þ·º&÷岪á_ ˆÛR”¼è~¿Rëí _Vfˆ¹Qïᩳ7Ì\ÏáÏXS½h Ât€IÃ’RÝW­<ªÏ/Ü :0ý•¤0ú³§r‚L$—ztP“Ïb]sÖ`¬ åär¥»E^DòDµ‚æét_@÷ïÝâÂ"¿Å™²Oå¨çªFÎò×ÉÙÞÓñ‹a?,=Âin±^”aóá…%’»¤ŽåÊð¨Ä©a¤„¶|7=ЖÅ/,ü Ëg•Ÿ½±s—œ×j_Ó•¥å²äåî"õö ­r¦’`Í‚|5V‡‡ Š×=†œ’¯"ÿ¢Çî¥ÏÁ‰pylЦiÿT!ÿãî}˜F\û4jοð Áª‚b|{H…ÀµÙ;)÷q2Ò!fÛB]Ëíå—Üua¿¡ qšr½—uyt/NéºÍ‰]˜×„∑ 'yäAç‡w_ò ̺îñ‰K; š¹âÂãgþ?ñ¦B>®úå¬ Jn°z¨—¥Ëá‚f‚Ýï§Ø WÿÉ!{‡"ÕzäG¶$P¥Õ¦òÇ*åB Pbp@¾e‚zKN8런ÏÞ!ò‚€ÜæÅHO®ÇÞlþ(vÓ³Õ€@ùˆÄVÄ1ºE„SòTŒÕ­Ì8'Â…ü´À‰Ô›ä4wH,mE×QîÂRËj·&ËCKåYâé ^öAß:'ƒÞ ÷îZÍ·ÊqPÞúÊS2°#Æ\BôuµÞÞçkøY#€ )µš1޳ü±ü®L.S.’„‹3ª_p¼'Ý#Ï,Ž) ¼.EEÙBèóZ0“PÌ~UBÕwfulˆnî¨ÙŒÝvÿ(b£^vàX»}èÀÝĹ)ÄÒ‚ húÛV»êñ,ûÇIRH•ÌŸuj‚à³wýªœO¢xõ>zÉLê$³–<¦©›>Èúîr÷ÕNi:Ã\?ÅE4Áñ7ã¾*Ml/Cäè yâ§à·EÜß 'h‚8œì>/§ ô•kß1“(ˆ0·Šo´1æÄ!*2tgftüË+Ï‹/ÜhMÄ7úˆ†cñ¿ë›²Îï1L¬O•°}¤èÿ¹«ƒ«§Ì@!v4Ánd`ZÁG-:²½ÁéöͯFæ ܇ÕàÈpœ ;}8 Ç^ùÐöÐ÷ZþÈð>lècF‘Éxñä0ÈÛc Sqä\>'sŒµIª˜e`Ò‚ØköY”§Ei ºçÐ,+ˆCb!^<åŸ#>"ÁÂLŸš¾OßÅŸ¢a>¥ÁटHø¢ƒMdJ7DâÕæÓ£ÔtÌèÉ–zbu×RÍðé–zb}×R{ë§[ê‰õ]K5çZê‰Õ]KíVŸj©§–›–zX>ÝRODm?<½û#Ã,²#à‚Ý1,úµSÅø–Ý“ÅØ´SÕôHtÄ ßÒRÜmv7E)¶x d•ï6ÄJô¡/o/ºnÕÇ6çyK‹´ê?5A§Ô~wzO Éy÷H‡/ô®‹•XîŠMKª2€àÆú«xBÙ ýJÆòÌïÁIßÔõógÆ2Ÿ›˜qWþŽ/@Ï lˆ…¹¤íoF‰ñKãÙŞ˸\\^˜Yæ φK< $LÓ@»w½Ûí®ó¬Íš¶ªU™m-×)•Ý~lÑJ]R&¤Wðƒ™æÖôƒùÝ!ú?©O#g渴†¿¡CZSË‹—×cžÛºwÒø 3X Þp'm-Oj•ËkD!”E«¶E~½.Ô&/ò±ûí}øÖx0åå=ŠGԛŇ#cö:Ïs‡à×Aè‚ÁQ0rõ¡XùÈX]g¦#ý–‘I4æOH³¸òÕ(ß<|#È­#Òº± [“±­ßj¦ÎˆWOÞE ý_í#S.¶þÁ,Y|×o\ýÒ»@mÚV êìö®ª­9é¨6Ci¨JEµ—jW]ç€ÇØ¡m:THìëïÈž¡3É‚ý×;2£D©Q:÷·ÅêV¬ª²Íвá[’nBð˜gQà ¹á ÎªŒI…ŒOG2Q_Ò3”­­Ÿ»p¬×‡zu›Xãl±®êmÖŠÛL{Ý EIkÈ-žÛz·jwµfæ*'[è¯ÐÕ׊ý¾ïw?¿Ç„aaå~œ<Þdú>&t6*@7iÝØ[@¼ÙmK„X7zÎ\òìùÏ/,jŸ—ØØ_Éjù‹Z9F1ØÐHPEÆ;™×ChbÐM¼²ºøv§f%K‹›n§r·]vÏhócOp˜?(bòFma-רD¶ ¼’~OeÝåèá&s±›seÙ㢮*íWÖ¤o‹—ôÏÇj9QóaV;×[eâ ò2ÛÞ|:oõÔ×I¼ŽEÛ–ãœAný¬my ¬>U;q_í6¹(•ÊâÐOŸ¶»;çõÇVu®jïÌ©mV¿$÷ ßµ…Ê€:þÂ?ìkûžl6ÈÖͦº§¨kPü’€Œ$—™^¡nÛh…© ‰ çµ7Hû\­‹`˜ùÝu­š;Ä‹v?ÂÉî«]ÃÖ?ð!Žk,Û?5ùQ)ÐÐv÷ÐtˆŒKÖ¸¡ŒÄÓÍ}b UÔÓ$Gv c{·3&GBêÖgB?rz‡Æâ”J,7mÁ‘.Á$_Þ0Ç©§W[ñ’_+=X”Wr´9µ°3Ú”¼ãY™×ïõ•žœ ‚çä+1Uw»³æ¸™Éæã”Ú¨_wʤ-ÐÛ q  í8 õ`׈†Ã~6)º¢›†ÝöCAw÷|5¢WÜeuKW‡Öš'ÈÛ[ÆX ‚‰2ØX| ×5°e"òMæ÷h„£àJqIrK½¸µt½mn9™—h°š¾UˆjqO ¦R[B Gx¿¬tàpÃhÚ/g_ø‘ {n³:¿/ê.1H2è2Lw1äÆnÓrBŽ?è…6ó·w+”½þô¯À{(dOè| ™wZ¸­üty4IÀªU‘Æ•E©ÕªíÙ‘%>.‹½ÄJ{dú$™ÿЬârû‘Ëm;R£8²ÛA‹¶ó±hìío„-IƼ½æëŸÞßçý“‰ýþÚM$N#»Øù,ße1×ñR; zµhºÔB%é~¤kiUë4#-ÊQ`I¤ ›?ìU,C|%‹uïŸOkî N2,«JbäŸ)›Í§É’;ÑfËJèvgäI¦Û%lUM‡m»F[ •-@ Si:ë^LmÌ›úªà¥iUn ;‚á'±Ð¯±c§ÈæÈ„ñÚ¸šõó À+¡­ßlvH¼7YmQñ·5ñÓÈ|@ÔÙ6 ¸KzÛÁy‡£–è£Ç½Ä†Ö=„Ö5¡}Ã%tc‘Çd”JÄÕšÔ 4I€²SðèŠ Þºâ’ÙÒTa¾á~KM½´·„ºª~¯xG=•]äæýwàªÑDÏHTåjkS‹&´}íÂ/@; endstream endobj 1579 0 obj << /Type /Page /Parent 1725 0 R /Resources 1581 0 R /Contents 1582 0 R /Annots [ 1580 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1580 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 456 541 464 555 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1581 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1582 0 obj << /Length 2015 /Filter /FlateDecode >> stream H‰¤WÛnãF}×WòÔ ,ŠÍ» g+v‚ ìõV’ÅŽJj[P¤"R£ÑþF‚ý‡ýÇ}غ4/²™ Ãb_«ërêtõl>šÌç>h˜?Ž´þá'L}7 ½’i䯩À|3š|_§°¬yõ²M~¼×ðT<×ó4®YŽÆmó0Rï²':MÁ™MyÓÏÆ(8HÝØ¹¼ÇçíÔŠbÚý^ýÇÇѱï9c¸±òRXáþX6kñ•qP’ªó.<ƒü×GØßá\äF*w<µ\ŸÁý!oþev TV®œñTÁ¿ù×ùçü§[ÌÖøžcg~…c¬ÁáppÀÕª¦S ‹¢ñH›žë«¥Z³¤ëùHC#?ŠÝ Ö$.kô$ a ;3zÍæ3K¼SoôÞõÈ#н‡1JŸÇ¨õd{.þ÷®ôÞx±Êšì1/Ì6kÖo¬iRКJúÐyºs˜¯ 5®œ}ø–Y ËuU›ê­Yæù2+Š£ o¡Yc4šì ðSV ¬Ìc^šÕ™" PÓÆÚEõÛ³ãþlx>щ0\pÈ‹‚N”nãøŒjgV5xjâ$8²G(j·3ed,T<‹`YÞÞ€)ŸP æ,d͸ÉíÛb“¸klÁ@Ê­rZ÷˜Ö¢ÜÎ Œ™3öñ³éê†j[dKÖ7«…+€'®78‘ó†£ö *cƽ5ïÕ…3¦ã¨—VEµè1B⇠ý$º”¶B”81»T£Êf7w3@ËC´™ãÈýÙ Èì\«šMû+YKÀâÆV¤"ÄDÆ-V-ØÐɱ’ †#Ø“¶à`/CQÂìÆÉ3¦= S±næ‘Ü8D>wÒÊûŸÑ)>#ÆgÐá³Ï?²O f¦ ý,PŒØoZ   ¸Ë6pÈì(™‘}Êœ½ù£ã>{ûä}¯²Eà«v~àA- :‡y+@fûZ‚VÃÁì ŸUï™ÛbµÝV»-A;óàüßà`/â³Éí%WTZ½›\ÒYZ]Q*êvruM›‘QD¡œ]ÈLjb5’ÜØ©’ 7««ÕñŒ>Ès·¬ÉRvÝÑZÝ˶¿ gÀƒóŽâ¿óŠ?ðJ¢òáÓ}U’±‘00e–—â‡Hü S§žð­'ÂÎÖâÿÄ ­|ñ/>HÄ¿â*ºç­.«êÐM:/‚ý5¿ä÷œµB>˜»Y#ÍŠiiÇ$GYÚ+ìK¤ÅÕÚDP.{²mϪ\`YjÍD0^Ƭd2“Ã¥1%3$'î5ÊšFúùbßt–Ýi |p^fÂ)é–‚®?g›maÎOøƒ”Š$‹# .o•y…‚¾ûæ—ÿ Ò@¤Þ\?å=²¤¾]Ê0>¸ºŠ¶’†ü²Í>ÙìÂWï …d$•äßîæx/¨kªaΟ#I=”úQötp×öÞü¹ÎË'KþwÄì!cÉgðŸéÆÇ²‹‰cgh]ª~Ûçm©OKùØ^]Ó…¢vyq´ë¸"™"!äå!À®$üžÈlò›Í²1›ö'dØÕcô´ÊŠÆ–T%–Ÿ0O¯‹£´Q[ PYÃUyek7›X³ÍøƒO8ÔÛªFxÌÞ„ j)‹¾·>åÂt(U„îBî²ÙÛ3\¸þ„ÉÑ8šÖ¬YOÓ>Wrâóožž¾:&CÐlLÙpý„àëX¢n0•ɳøÌRƒË»žþ7¯(¥F endstream endobj 1583 0 obj << /Type /Page /Parent 1725 0 R /Resources 1591 0 R /Contents 1592 0 R /Annots [ 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1584 0 obj << /A << /S /GoToR /D [ 0 /XYZ null null null ] /F 1125 0 R >> /Type /Annot /Subtype /Link /Rect [ 75 465 160 479 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1585 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 689 346 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1586 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 689 363 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1587 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 383 689 397 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1588 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 197 662 210 676 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1589 0 obj << /Dest [ 479 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 384 88 398 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1590 0 obj << /Dest [ 1596 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 125 207 139 221 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1591 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1592 0 obj << /Length 2325 /Filter /FlateDecode >> stream H‰ÌWoã¸ýߟ‚X(ØZQ¿½Üím·ÀõÖŠnŠ-Ó¶ZY2,:¹Üéw¸ïxôͲ'ÙMÑ®S9â¼™yoøíbòz±ˆ…‹õDÅ"Â~Ò2Ó4ÊE1ϼŒ±ØM^¿íKQõ¼&}ÕN^ÿA‰M?‰Â(RXSMfÃðn"Ð#T9Á⟓9oš‹" ç9 'e˜GÎ.ï‰y;²œv”¿Ä˜ÅQ0SI˜Ë¨Ë{ñá¾µ[ÌÄÒ°$ûºß|?ÿ5˜ex>à]f²"Ym§âÃ]m6‡†$R·«`6—âßü?øÇâö˜½‰£0ÇÃâæøwwwa„JöôUCŸ…i|2Ä0 cYù©-[ún1Q¢“8ËÃ$W")²¹’>¦¥8˜ÉzòíâF¢°$zˆÆˆnDˆHF1J}ŒÒ0J]˜x4àY¤IXÄg€*5Í;&(ส‚8XMmZ{=W½Á‹’ÀÃi3yÄ%~àpD³×oì†Àƨúó{ñ]»©[#šš-.‡íªÄ¯ìÜÏ€A¤ ‚v6œÈŸ­pgëÚ†w'ØTuíºÞ¹\ê Îð ‹GlE]+¬ÆDrӻϣò2OèDy—çè Pîûo»Öjx´uû†£[È“Y_yX ùA'ó=Jœ‘«þ™R}r\‹n-´øÌÉ«`– aÚ–sø¢€ÓÓ€.úp/–ºÇY*Žè¢7‡[saKÉKwg|0 ‡O—'„Kï¡n YòÒ9˜}ÆAg#>Ùˆ ÂÓv¨T,²¢ß›ª^ו°ÝYZÕ¼;eÒŸTZsm ’ª}…)eyŒ` `»É› ˆqÖ— ­rFÉ}ñb¡TZ hŽÖôô¨$á­_Â{¬XŸ•ö~o<ˆ(gfe\ JY7ýMà,ŽÇJ<{ù=Gi˜$eqÁ y4'2k$J.ÏQ.HWË9Þ çÄIJßk»QD?`̧姽9 Ï-–æ’²¹·ÝAoØŒ¡áE?»twÑ Ó$+™9T”Œe§3ù¢;¥ ¸)Uþÿß}0Z±ÒV™#² ‘¯Çñ‰+—^×CDeTòµj÷I1þ()@€;H‰A´XÕ Ki*„ƒG÷ânkü¤OIÏ>\>¨ŠÕ Ê‚J‰jšÈ¤7àßV¬þU+¼I7¹â0ݹ¹ÚšU˜:«°wf­u0”_âh5r‚â¾Ñ©¹û=Q›MWi[CR˜y,3NŸ¨ë@f ½ß7µ_²ÒAN®_TyÑèÉ3ÇYlÍcq}ë€÷’ðÞóÖ±?ꦹÇ÷QU·3½@s³ËcÝØÒ|§[:]"7fGûÉW|³' ó±€Yl›Â ÅÇ@ß`ôvcô²a 3NÂ85†¢›B›6º­v:Ðw³ gÄëý¡?˜þœö¼²ú°18`)-¦oäÀg`²sFáŠÇzÒˇ³@ƒÕB>‡¿œ"a¤Ø7Š>l ÷ $léݟΫބ™ ò#´Æ°ÞHסgD8?Ë7Ö ‹Ÿ „+ܯִ­a‘¢T"ÍQ©@ÄÔ槦pd$•QZÁXš—'JûÂgÄâ&Å‚„˜Jcˆ¢BÙÎ~M…n:LqÖôH ¼„J·º0L C½ÚÕ-ûpÆ ]^ö0:jLfåOÀ<ÛÔÿòôÁÙôßtÒU”kíÝ…ÊæWrÁ¥D1œHPJyÎ ^™+ù¤ò«lhô¸ÎÐS•1ÆÐ˜mÙ¯ë׎Z?£L]Àˆ[äqûÃzPvÆ=æ^ÎãT»´dpä'¢ÄÚ6÷ÂÍ9Hp¹=R¬Û0ðì~h Ü<‚™`ÛsŽ=m;©ö…÷jt_yÿYÂàæÞý€ ·û2÷ɇߣûE„oäp¯K\NÎÝBuðyµßãÑËDŸñvPE+ºœ’ó¿»‘ð…ÎþiO¢™ ííZÕ¹9JGYoÄ­v–p]…Ë`Z3õÇ0æe1“ þo½$Í@>ç^zÙè£Ñ‹¹/;kôJw!T²×•­oÍ5%p,ß «éà®óÉãøC|ÂÛÛóþ\'–àÞ—ývØW»E=CNË®ƒ µ~s¤tˆågÚ älƒÜÖ“ÊûaGC—“ÄÝ·*70n€{ ´¦§ŒnntEêÏw8‘ H¤ŸÇ Õ@—…||;‰Ÿï‘’‡:†®G¢Û%[º-¯uÇ`U÷œ|TzCî±€1É2…@†V hfÊSÔ ¹Á"Jß\ÒRw#îÐÌž¤œÇb·se¯½ }øËû€n³“å Z¢sšFЦA‹G°?`e…´N²«% 7o Á/øÝäòNc­{fîIeëŸHjÚA°h†˜”`ð"3ìIÅLGwRçŽoö å>§X•çò6 Ê5î%ÜÍQöSôa·O;ŠúKJðÂM¦òåP¼«lY6ìB6ž3$g^ºãAÑÀ¾Nx(Œ'›~Å K³}p„[CŠ£®§Åõ‰ d1ïv;B§!«tÅQþºº'csBÉnu¬,!2¹‘Ô P·¹ë¬‹bâJ«gã:#îB3ú×ßOq¡ 1Ö™ÝK'[°‡ÎZø¬õVÖžÙá¿¡w{2Øc¬}¨;@šPÆlpF2^ܨœq ’—‰B{•çB’\6¥’$ îN\U‡Š[B~4hü¹Ð=Aó¯¡"<ÏRâ6¼ýñ­p Âb‚½nÅf[˜&YI¾¦*ºèÓÑ‹˦±g.Û/kŽŠqÁM3ÍIþŸ4'þšs.|dÁ À‰Ç°ëÂqœ“Ü”þ3Í[(× endstream endobj 1593 0 obj << /Type /Page /Parent 1725 0 R /Resources 1594 0 R /Contents 1595 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1594 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1595 0 obj << /Length 735 /Filter /FlateDecode >> stream H‰lTÍrÓ0¾û)ö(ÍĪäÿi`:0eˆO´Y±M»Øžð ¼ïÈ]Ùi t2IV«ýù¾o׾ν«<@A¾÷T?øeˆ"™@ºŽE’Éòƒwµ20ƒ‹‘0˜Ö»ºÙ*(O )ÆÏ?›“Ç>èÒ‚ZKàùWoí’ÖJ±N°p˜‰DÎu]NàÒÉŠʾc¿ôúä¾ EÂd»lOíX¡'`–c%6Ô¼ºYÁçßÜñÜã],bVsÉLµ‚íT?l߸"!ÓmÁý5ƒŸî—ÉßyޱcH‘à!>‡`š&ÁC¡Ø@]-µÅÒØR )EÀÌâª\¥7¹§ /ˆ& ÂTd$ •äeÐ[oï]çOb„ Cäßj\Ô•¤sê]&sÖ/M¤Àïœò’üw,ç "S¨]=  F·°³@6r ÿccÏ#‘±£¥cý€‡Ê’Ú\Q3Ç¿w‘·ø«ض¬[  ;Z3‚©ô_Z×f8Rdšò#Ö˜c£ÇSp­ƒVÂæG½ØÓ­ ^š=P‰ãÁZ&å+Ѐ¦TOŒÉ$ÆÝtӠ̦ë‹AÀÛ=ÒÀ éqÞØl¬»Ùhqy"xe[½kl±r|m»rª[B±’€ ÓBz§ ÷lûñº›cyŽºçPtv€¶¡µ¶p2^ð†g¼„ü<¡`Æ[éï4âmœ&#,Ð,6uÇuã´×#DÊ|R¸$•R‡Ê ÈÝ59föùL¦•г†S½i>œæ‚ðíhûÓs¹f÷¾ï0r?Å‘œ«.ü]€ÛœGk÷]o_ŒŠ/D㙨զ¢ÅC',ÀZC*¾lFà6ƒhÇ YÁ#3F{³Íœ¶‚©ª±Ž©ÝsÂE4MwxÔnmœ¯|àÏ­F²nqo>-…¨ñ?ûšÍûŠ—‚Ófþ?>÷nr/5÷8â“þG€ï×LÞ endstream endobj 1596 0 obj << /Type /Page /Parent 1726 0 R /Resources 1602 0 R /Contents 1603 0 R /Annots [ 1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1597 0 obj << /Dest [ 1583 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 437 709 458 723 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1598 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 332 695 346 709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1599 0 obj << /Dest [ 1297 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 350 695 363 709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1600 0 obj << /Dest [ 1556 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 383 695 397 709 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1601 0 obj << /Dest [ 931 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 197 668 210 682 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1602 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1603 0 obj << /Length 2208 /Filter /FlateDecode >> stream H‰ÜWÛŽÛÈ}×W4æ© H4›¤(Ê0 ØÞÅ& `!b‡jIL(R![ž(’È?îÞªj‘ÆÞ ²  0bߪ«OUŸSýv5y±ZÅʨÕfbbá?i‡iej±œ‡Y%jµŸ¼x×çªìyN¤ú²™¼øîƒQÛ~…Qd0§œÌΟý»bk•Y¬þ2Yò¢¥ZDá2ƒá$³Hìòš˜—Ó×<£Õõ¿bôÎâ(˜™$Ìt”«û“úpjÜ=±¶,é¾êÕ›ï¦ê?³9ÚÆæá\WA¤ËÝT}x¨Ü?lW³‘DÍ:˜-µú'ÿþ´úÍ„O̧‰£0Ccõ ú؃‡‡‡0HB£{ÚÕÒ¶0-C|Fa¬KßµcKß®&FUjϳ0ÉŒJaž«ÌI…3¦¹êìd3y»ÀH ¦DÑÑÍè!F©QF©„‰¿Îx.Ò$\Ä€F ‘‘ã˜, ÀH½*ƒx.t]ÙÆ½~©Þ9°iÙ~Ϙ`RuÕX…Ö\_ΆLÏZôgº!T9©²m6ß)¹. - *¿@¹‚—½í},¿N¾áHqFùÅ‘ÌùDþ@ïÚÆps­ªæ%‡d¡³>§³pqêÊ€yÕŸÞòÏ|„íkÕnTó°– Î0óü^Vø…i’Ä„c™ÅˆäÀs†Ï¯ÓÞÃ5îm/ë…BŸešyžàÈ×LóïL<„U¿Rx}µû/pÃxá|LÙù#fùìAì‘^ÍvªÊc×Á¯ú¤îLÝM™kðiðÔNtÌÿï„ážÏèdŒƒ¹Èèo8 œ¸žÍu3ºîSøWÕÖöntýx8´CÈ F Ø~¾¢1ç(x¢+ï)•'õŠxÈ…íAKÖ§f0£Œ|sDU)K³4Vû3•Y®; ¹›ªÃyÎ3ݘ›9ÄÔ‹˜9ùIç‹ÐÛ[…êíé’ª®Ž÷QËÅsSáÏJÞUÛÝm!M`8½x}Ò TU8±àª½%}øÃÎ6Ã=ªšÊUE]Ín‘¦Ãh|‰©`–tdaÐ!}OUË¥Ûáºò‰ƒ#ïyùÍM™†õSöÚ;\]»'…4ãeQ×$ÎE‰¬eŽNõ, "Ò4M*Ö {éo,3ÖߪÛ¿ÿSϾ v¨~Ûà’UujʆÛP=xn8ø‡Î~æsH§dEÏ„ícOA › Sö‡Ú:[Ÿ|ˆK^¶@QuOf*Mš¸´§uÎ-Kb)hÞ+š¢N¥QÒÞL‡êgÉEš  ÎÎ¥ì°i<(E f_ŽJAå¦C$w¯¥¦z)ÌÏ <ùÐùjŠ8·Wš;îU{ëv-w¯¥ã«ueÍ©êþOÖ•ÿ3Ú—:b()Ú¨‚xŒE9tùCeä’“f»~©îPÊRoÛX(ÁÝ}Ñx¼èª¢FS×~=§È¤úî—U9‰¾kÈ•ðËè=~=GéOJÎ/R:%|¤šd®Áœ[kOñLðÉ5ÁÌÎì=0{Ýn+.àbÜPá7™28× rûyð¨ž%`J&û Ó¢òÅ=Xáò±`Õ“…ð¢®qµÝ±k艳+jh|®k<=,³§³;VŽGYsùú,¦ŠŠ`–Ž+šùxÖÞ¦n)¯ð΃“EÉ•]Ùvk \n €êØ ÚŸ«uª7M Û]NI®ß2TÄÓªFIŽøá]{”sÐõG’Ý[„G®UK LG»…6‘绳8£!A¬‘$E­è¦Ääi”.òEÚ$# ß{T©.ü”¶‘¡ú5üSì:ñÙLy¬}Ç”Üfƒ0í/"åFô/ód?}äÕ»Ò‹ ïbªìt’©ê©‘¿L3~Cä|­|ÏÞÍ“Á§ ðÜÃé"+ä™t~5­ådH6L¨è•jh˜.ÖÚ–íº¸¯å•E܇?K†âùø¢ScO]Òc'Æ=o`9JXÞÔ7P@¦krFÜHô” 9õ“å7T®f~Žw`Kt˜éºw“Öžê²\v“)3ÙYqßX¼p’H'â‰åY —ÉÛj¸cý­DÓni⨃kR¿›RRç‹!lÝg‰$H |Êy5ç¨/d³%çæ|DCóþ‰–qzT-ôÙ“%‹ îX8–@êò÷éÛÕäÇ }q endstream endobj 1604 0 obj << /Type /Page /Parent 1726 0 R /Resources 1608 0 R /Contents 1609 0 R /Annots [ 1605 0 R 1606 0 R 1607 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1605 0 obj << /Dest [ 1613 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 152 343 180 357 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1606 0 obj << /Dest [ 1604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 193 94 207 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1607 0 obj << /Dest [ 1604 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 241 193 262 207 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1608 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1609 0 obj << /Length 2095 /Filter /FlateDecode >> stream H‰ìWÍŽãÆ¾ë){j#.I‘i ˆ=Ž1A6 <ÚKvràH­Qg)RáÏòƒäòŽ9䫪&¥ÑjwlØ0 Ä ²›Õõ__U½˜¼],"ªÅzF*À8‹ü8R5Ï?Í‚™Zl'o¿i3µl™&Pí²š¼ýî>TOí$ðƒ Ír2^÷ý·âɨ0”·øç$çC¹š~ž‚ñ,óÓ@øò™ˆÓ[’Òéú?v§QàMÙŸê Su¨º v"m^?ÒK·µaNß.&¡²j%©?KC5›ûY¦ÒžT°1ÎTc&ëÉ׋ѳ$ÁKo½G4{1Š]Œb?ˆAû³Y6W²œ:Ox5Ç Ð+¦~ìe~¦Õõʬ‹¾Ä"Ô]Ñï´]ydY-ïKsó•º7ZÞ=?áO¤;UÕ GBÇì}³]%ÐûTˆ©êÑÑîdki×é#{GÇ[=©½-Kõhá¼RÅ š”ÿhûÇ5j>CÛÆ‹)!HÚ;~½õ¢c$%†¾ºóÔ Ñ£ äȶ(G‘W|^˜våÞ›ƒ® K3}¸d>È;Zê¶EÀ3• ìvZqɉMÇxEÇ€E±å¦(KS=y9iT½rÒ¿S+‚ëžÎtEÜ‹"(ÛK#áÈ9‰èõÖ^¬ky'“–ò0«ë((çÞ}£“})é±v,ܹˆXZ8´3²GákbtÃÓelhm×­«Öÿ)Hšä–—kÀ àh‚ˆëÊì[Ó¶Bº§Ô†L×ï…ª î•£º»U¡"JkÚ×!4I?rú«gôK'kœó0u]ðy.Êžr mý€úˆ(v𜡻¦7_¶ú Hx’iÇ´pñ¸[sæ+ uBË)rÙtWc¬ô Ò;oŠ®œ¡~K]P§wu£Ö¼“k[öyð‚àÃK«º2À6t㜨1²Ý•¦3¨#+q6{uÏT"IÑÓßý™‘ÚSìÔCN’Rv½F)éžžÉg:²gÈjuç݃Dd7°DÈŒZ‚tרÌ_Õ‚‘\7Dè̃e Ü3#½5'„™ë¦NÛÊvÖ(ÇnëQ0¦çpkAÚñƒnke;|ý±U¥ýh8ÇmÕÚ°.¢ùW‚«¶&­v#@1¾uÈëVm‹,úWoÃIñ“(ŽCš Of¹Ùy®‚RrH]×EG*Jš¾±À—ï)ÉúˆELÆ4 Uï¿¿S8ŸhYø…üÏs}xb Ú—!òwhú?„¦ü%4uµÀ׌ËNáCw1HGö„ún8?èCµ´öBnñBË)ôùùæ|½vã’”ܳ÷(å½DUÜP± !®©)2pa”“p˜`·ÙO'Ô½˜÷ðEVwEy¼D6” žìe)%lÿÑCà'ðF>‰îq í|yý=ºìÖ»÷^ÿ“*à´¾%ÿ#˜‚P3õx|¦æ=‚>aÁËã”–2æF”$òž`"´ua¨ O×âv¢=ÞU~ ^F9æÄ”úÒ€—éy³Bç€9ô‰ëv[4צü)8ƒ_Œ˜Q";ÈdJ%Œ¸›zÍþ|–ºÆs!l¬Lš¯cg”ÆîñïØù[ÃÎÏ\˜¨4"M×”“‹¥y'Ó¯9¸UuçîF({ YQéÊ]™„ú©/ G÷b¿“•5ƒ@)Ü}qà&Mq"!ö©wÇV‚,×|ã˜÷·šÉBþ-¼0q·®KòTæ•!øƒÃIB½wËk沸PËœÒ+Ar¦O?ôæ .±ÛodP5,G]2Ûéƒ'è –ZŸ° ¤(…N¸!FÖêt¶uê±Ñ±„`\ µŽ2w§Ù×ö¤ eü\ «Àͦx¶uß ¿Tj@±@ÜP/©ñÑÍ·h®8h4zïeóx£Do¦¬!‡ ™cruñ ­sÞÈþbµ®„A€a×Ò¯8—‚ 7p…;Αn„äk,,.Kvï£4¡ˆgwé}CcŠ4wñ9ôAÊ!0¬É¾½;-ù·„©‰,…<_ý±G4Ÿ8ù| ž9'›¦eØÝÚ§MÇ¿^­(¬F:¶)yï±nNn„IrÝà.Äj¿1·ÚD‹<û¤˜}œGà¾Å¤r‹É¨9þ¥îhÌn,@Æ­Ë7©O¦³)w-yôÉÀt&„â.èáŽ×š†L%BBµkêÇÒMsf+™iðg‡{]L¤ˆL‡« û—<ÍOàwÝÊ6ŠR¤7SFa,†ÍÖ’ÝsÍ!w÷d¦ß.&ÿWâî endstream endobj 1610 0 obj << /Type /Page /Parent 1726 0 R /Resources 1611 0 R /Contents 1612 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1611 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1612 0 obj << /Length 1909 /Filter /FlateDecode >> stream H‰ìWÉŽÛF½ë+ ¾˜ i."EÛ Œ#ÀFì(²)1 š2—‘åÉ?äsHUus™Íã ð%ŒØkm]õúõÙjöhµòÁƒU>ó|pñ?óØwæs7‚Å2t¢Ø `µ›=zÖÄ6¼Æ…&U³G¿^x°if®ãº®Igvß<̬×ÉF‚· @¬þš-yÓ®³ŒPp;‘«åòŸ·S+Œh÷;ëGmß¶8‘寰>ÂÅQµ[ñ-)P’Õ <ýõþøWØ!ökœ Ð*„k¥Û¸8í'Y—,$°• {iÁßü+þ\ý6cÙßu"쬞ã[p88žÕVIjQ4ªt°é:¾•š¡-Kz±šyPÀÌ#'ˆ<NCäa$}œÇPËY>;[ Á<\â^Æ]—"bqôðŒææŒæŽ;Çs'âènÔE: U3QÅUì“9±ˆ1pºïÚL^Š»yÒ6eÅͺ›>y OËCrl ‘*ƒç¸0•€ó¡õÒì¨ iM yø`£«®· êeææLî”ì ™ý%àÆ!é=à·4àWViRf뮑õŠë E†îB¸~vÏ‹“¦9Tu†ˆx^m L×ÈRt„%7i刂aÌ(è¹ÁpXYÒ&뤹^}7¡/ 0 "2ö§@_ð£ OË …úö&š_À߆y¬qÁP¦*u7ä÷@ÞPåž?–ƒ¯Y â[Ä™+ž§Pˆ8ŒF¡Uï’¶À"ëç:ýÅs£´Á$RS<Äk×£]˜H¥`^q„æÖ‚X áÅ–W›4Ò’¨b,[-1_%eF…&YVšôVh,¹¥ðõ±ÛÓsG¾•¾:ï-MQÖ)_ZœJê1*k ´ ì𜠛µ!Õöh8vO`Ý€3+:tûºMh‹¶ªt[WŠP1¶>I vt–ƒÌ‡ºq•§´Ã´È‹,!v¸°ZþF"ãfuûá°çH÷Ì쥤á9:ÚM+Õ_äDºÑ4fm¥´°ÚöséÌŽ^µQ¡'{ň”N4,­MãCg„÷œ>ÍÞôŒ-fMnLÄÌáïV»ffÍÚ-FÐìÖ*’5‹ÞšÌ˜3„©í}ù¢ÜÈ© ýïH«ÂÛ1ieƒ'ê| ¹»˜b†Ü²8ouÏE F{OU¥‘›»k¼I¸Ø¸‡(ž>†×µ¼ÔU—&g߆Ѐ+k;¢Ú >R4Äz µ)¥M·sÅH~¯Zº'ðÇ$-ÙíKÍ?2SjAǪk›ÛiähžgÌËdY\2¹ãË9hOlñ¦Áf#¨œùâ#¥6ðÄ{Îñ!ÖœNbA&õJ½kƒ×†Ï€)ÉyOÅ]½A_PäP§÷‹ŒºDeÂŽ üFH¯nÖ[äW°t*pÎ|ÚùQÊfë8ªÏCC4>m0F»Rª´Ê ¾îÕùª¹½¥âU4§6šáR6‹ØÂó½î|Ä€8þip÷ÃXép÷àã®|@oÜûà°Æž~>¸~¾“¢ú¼ÓhÿnŽz s[1C"fèi` ¯Khè¨ikâUÊ´Y˜Ä¸`_&DXåÇÞ[ÄÞÖt-xÌE†…|0OSAÌ´÷Þ¾b1ç" zÊùS±IZþN,aV}».ÝÞÎOÇêr ßUµ™çøäÄ,Òä’{Ûíe×2É’5úZa¨ úÞœÑóti½Å¡jHZ~©j,ÿ#${zÄjO¶nVüäð3¹î6Xäº@X›mÕ•D¾ÜÉ×Ì›3Ôf^µ/V³ÿwÓEë endstream endobj 1613 0 obj << /Type /Page /Parent 1726 0 R /Resources 1614 0 R /Contents 1615 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1614 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F9 1677 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1615 0 obj << /Length 1800 /Filter /FlateDecode >> stream H‰ìWÉnãFE®úŠ‚/ib›;)a``Òšã–J»Rì?¢x¨™@©Ó)µÙÛwâeºŠ·y£ÔD© 9ÖEY¤î×>'´,«7-ðúLô”ß ÃŽ4¥xf5/ ýDfCex˜<igŸ¸íPõ¯êè5fn©ÅçZ¤.¬ø£duêl 3¢|U¢Ór‘¸ºÂŒ„¹V‘òZ=E£¥îÖÙr­mذÈt™) ·ê(» “¹GŠ`µ;$Zî)ÎC’"ò È—‘«ìr[ÅMV^—(šÕp×HÔ²P¥'¥‚£óƒN Uš iq‰NŒYØ9fR Þ&9>Ö…Èò{Ã|eQâõ ]õ%Õ7ÓM“—j q•êŸ61ŠPÈ8‡`S•«,O¸9¦Fe3p膄y“å9Ùi5M| KL“‹¶Z^My/¾vØ3-Tn­ãŠo%&‡hY&é«¥rtm4F!yÄ"Ö|npQEà¨T•|¡o•†£¢¬¢Â–Enpé¸üÊ^V‘0}¾¥eÇZз4}¸Iàõ壖ɻ1ì«ç¢uXyº’×òîyžw”ª·›MY5°nš zmb™e¾øÈåY=†º¼J»Ãq^—t;ZÇ÷ˆU™çåc õŠsἕ2Ÿê‚óÚÙïÖAËð'6+ÜàÖÓyõW˜×]`¤ؾ*W‡Å§¯ÿQtWä;1ŸÏÌ´ˆ/r å8—Ñï#›]±%šºBAÃŽ HCL¬‚üÜa”(f¦-°vxõôøø nÒ³g¥vyó‰Þ‡nתþžÏA}ß0ۯĀ7§¯¾3K,>fV¬*Ìæ¸ìƒÓ…#î‹>¸GåEz3ͪ$f¾1H’b&Ÿê.ÎQ7g|œ`Ev=×6Ý7§d­÷ ^½ LÄÙ!ü#¨­A z ïR°5, ’››c‚Ô¹AHø ãâˆÙ›GZ¥Fˆ{€§ ÓòFß½-¯K\Ý:‹“ûÁWg'I•Ö5ºº )UPMEv=þ)³š7™`gÎja§Úïg5›‰ÓÏjøq2†gè%õRª“¼¿‰ëzWV >A€\1…YyIí ½§^L¨À ô ×Q»nZ¤çºaáq%og™ ›Ü ÑN†ª‰îO*wAÏGmt>Ö hö-» XŒ¡Eþ 㨚 õÛ⣇΃Cx~³eÁ|ÑûŠì¾lÙºlí i8 ~;)º"áºÄq ·‚/ÃÁª3‡…û&ÙA }pœ½gVZp[^óÔÎ-XTK|ýâÊ Kx’ƒöÇÁ$ƒs(²Ÿ1ÏU‚ôcyÓ)×\`ºì=ˆºñêÃóÝõ\é콊º¯m÷ùîaz”ïåò§z]Ö ¥;Îw7·¼˜ÂYUò‘j„·:ëÇ_e.J<Õ•ûdüdc,Ãéd8Z!CÅÞ¥·@@e¾NÕ—ê÷E»àIbZù‚ʸگÛÓw|øi÷O%ðï–ÿ\ß;&°ûÄ÷hÚ¾ ûW¯ùÕ±ÿìCâODûöÙ~þæÅ7slÎê‰ù¥’ªþŸ4^gΣXÒ4Ôüa™íX˜YÖ}m®e:%¶ÏÆë\nûø†7i§í#'Sî×”æhx¼ÅbôhjÛ!> ¼~û´ºkŸYæ°n(4Páóé½Káó„Ú¾¦ùEÇ/Ðõ=ê–D÷M¬öj5 îJõ[ÂÓ#¼'1CÔ¶þó6Û['ïGÚØÿý¯wöO¶0¼ZŒþxšé endstream endobj 1616 0 obj << /Type /Page /Parent 1726 0 R /Resources 1619 0 R /Contents 1620 0 R /Annots [ 1617 0 R 1618 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1617 0 obj << /Dest [ 1016 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 378 460 406 474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1618 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 149 202 165 216 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1619 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1620 0 obj << /Length 2103 /Filter /FlateDecode >> stream H‰ìWÛnãÈ}×Wü’&`ѼK( ff“ f€E¬¼$“šjYL(’![V´’Ø܇œªnêâ±g¼›A€,»»ººªºêœê7ËÑÍrQHËõ(Œ(À~’iä'IÑd–úÙ4ˆi¹ݼí§Tô"P_Ô£›w·!Ý÷£À‚2Åh<|îGêûü^S8KÉ[þm4“M3šþ,ƒâxêgÕ+{"ÙÎ_iÆ»ÿ¢~Œ0;ŽoÆ~¦‚)ÝèöP› f"¥=hR}ÙÓëw×ô矼qŠq‡µÔOUéªØ\Óí¾4?è®%±Êë•7ž)ú—ü÷þºüÃH<o¢ÀÏ0X~ƒ9±`¿ßû^쇪çS5 Õ8ÒÇgàGªpSÑôírRI£(Íü8 )žøÓ)e!"Ið1™R§GëÑ›å1q‘à2§è%ÑÃ%îŽ?H øq<A¤©?‰Î¢Š9UH‰Oa懙7E,hnº¼îÛ¦3»^ËT·ðÂ@]ŸV¼ fM›÷^r´÷M·Z¼¢÷Í}Y¶¤ÊˆHãá¸xˆ¨ŸÄqDc8„Ž§ÍŠðhËÌÚÒémc4ßiñá=ôLõº{ÐÕ§§óèi0ó#——¢Üj|ÛÔ&/k½¢²~%—4QGe.Ë32\3ç%ù:/ªR×f1DÜ>– ðǾ _¦î伦žnN?s°Õ‘u¤r>n¡»&[Âü¬ñãˆZ¾Ñë|W{øô ^É­º©õç½áðXÙ6ÎêõC^Vù]¥9̃‚' £*DÖТÙnQ‡Tážè©Åu‹âŠ@ð (÷ÀÇéá ­Ìã¬x’àt“L .ý ““M®*–Êeâ°²—\[{ м‘Ùn››²©iXÝÙ_dÚe’°y¿·Z–ß30ÌwÀŒÚ”V ÉOTá”Ø9‚9=쨬¦ÁE;µùje¿´½Ø°bPœ»)·Ûýî`÷ ±’ÓTk½r8ð»Ì(—“D³ÐI$Ïã÷³1)D~”0ül?©ì„I  ¬šj‹Nÿc§{ ˆù£’i«"WPN«Üä½idÜé/CF𤗔sÄ£ÿ xÄ_ <Äâì”Â.ˆóª)òªµ@Ûì@~ýÓèšos?º,œñð‰X—÷»ÎÒϺ¬´OgÐ~ŒwfÃ6פ}@•-Â?g[3uÄg±aL,Æ ùCnk¦îí"卨¼| ¹saÊÓ äV—©‹M×Ôåiwbu¦qªÎOCæ8ýBîT•܆ª¾¯´›qÇÙÁ…BðTÌžè >ªM³×£^“ÎáI†—…eaR6j¦\ ¥`·ù—_ènà÷ƒäºÀþw '˶Ï_ðú9ÕÛÖ¡©?zþ±ä_¼q6u×?0otËBº~ÄGBÍW–^Q+¹}XFõvZæ¥_—]†Çsª~ÓŸ‘ñäEd'(ôì¬+ø d<9óÉÊ)ÇÉŠ¢™’Œå)#­×ghì«õ“]þñÕã^:«;âÈSzJ¤Ý¿ˆcqóZRÕÛÖ>O¨ÿl½„íÎn59ÞÈÐý£ÓÁycÎ Ð\ëÈM¶uó¸#³¾¥µÆ[Ï-xæЪëž÷ÉE šéâ¶¥PXµå~¹­ñà C‡ÓúûM³«V "OÂÕ§Áµ‘: ´±t!к¢}).hB£ˆJ˜XhMUEgÄ$؉ÊZZa&- ÁäÉ/¡ÐÒݨ ë¢jì¾É>wf_0™ÜÒåÈ5ƒq ŸþdÇ;PËášøb3døµœ0s|ºm% :>´*ÿ¤–ŒTÖpsuMWZÂóßí¶+Ë$¼²åDCèÊÊ 6…ïÍøð7Ö6!oãÎm$`ÛÁŒ¡_àú’¼O7 7»kÛ¦3Äy…œév…Ùu¸ÆŽθÂ?ù”YŸbö©¿i»ò!7š“ÿ@sÔqÓ¬×e¡¯­˜®¦·ïøª"õݸ7„݂ѧ˜=ÕlYŸ£œ5£Fêwòÿ½Çæ¼¾]Êè·°N}(«JwW>}g;D+®yI³ÉÛ–0<Ëuvçgƒ€m;±Ë. ¹§ÊÉrCúáýc}×thvTÅ;½†zh|Y÷æ¶-ê~“jZî¤zépÚ¦ïË;n©𼄜Ã,~“sö–,CGàTø:ïÝ }k“ð€p&CóÔsk'¢5ÇVLݼãËlÆè¢3c~…l,ÞLOét\™}³ÏåÝ{àòÚ¡Ô;¤MŒ²åVlk¨.—‰¬=)ÙÛâ²sîè~™¿þCNRûê=º3…;_z þÊØýϾ!@«î]§O’£±•. $Ì^k~h9rƒOÖt‡ÿç4SÐ#öµ/ÔŸåÎËo—£Ò8 endstream endobj 1621 0 obj << /Type /Page /Parent 1726 0 R /Resources 1625 0 R /Contents 1626 0 R /Annots [ 1622 0 R 1623 0 R 1624 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1622 0 obj << /Dest [ 1621 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 338 652 373 666 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1623 0 obj << /Dest [ 1616 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 452 420 487 434 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1624 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 71 202 88 216 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1625 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 1668 0 R /F9 1677 0 R /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1626 0 obj << /Length 2450 /Filter /FlateDecode >> stream H‰äWÛŽÛÈE^õyIÑ$Å› ÃÀÚÞ]ìÂYå%;yà­×¼("5ZåCòùÇ<äTUS¤.^Hò’À€‡êKuuS§ªß­f¯V«@ùjµžùòðÂ4pÃЋU²ŒÜ8õjUÏ^½ïR•w¼ÆS]ÞÌ^}ÿà«çn湞çcM>›Ÿ‡™þcöl”¿Œ•³úe¶äMK•xî2†áEêÆžØå=o§¯(¦Ý?ëž3÷n¬½T=Õñé7 ´q`Iwe§¾ùþ^ýùŸÎ<Âïæ"7Ò¥ãé|s¯eÿ7³«ØÈBgMáÌ—Zýÿwþ²úqÆ7æÛžãÇêÆØƒÃáà: ××jèX˜Æ‘.>=7йÚ°¥oW3_•jD±»ˆ}µHÜ4U±H*Ü1LÕÎÌÖ³w«S0>–xçÑ£ëQD4GïÕwD¡ë…‚ áL¢?Å‚þlYÊœû‘\ÌZ»xš^b,ƒÖ@Âr×ÚCæ$¸øñNÕ_ "Û9€ê7Y¯òÌ7ŽÿŸ«³Â¨¶Á£òªt8ˆˆkhš^e;'„)£dù8Ñ·¼ålXÖ¾g#Ÿ àÒÁÍùqØkqžû.]á® Öb±°­t´•jq%Õg«FGà»izW ›|t‰åœÿJ“ŒçéC_Œ’3_ k'@lvm->ó(îW›L¾‡0è6ÙвP«VÀ‘éêȈN6<3膆bì®í¤Ä{ ‘²ã;¤QHÑ44ÍîÅì\õÞ™S¨7l÷ü3X^êÂY ötàÑ',]|yb*}R ,ÕˆÅXÓ¡êPV•z2ª|nÚ¸à\᪇¶6}YÙ ò¬ªäØBÝí·Žïé‚u'ëo™m›Š2¢-Ì×r#&}õþ£Ü83IiŽZn¬Án¡ýRi@YƒèP:#c/öïäÑ¥‘’ßtQÉ5ÄǦ0dRV iG¡‹ì°]cí3¾öI¶¥$Û¸ò"Ý(ú Ø`%Hcóœ¼Åßom3â†úØÃB:là¹Ì¼¸dDj!û r‡ƒ±á†Åd©°Ô€·Ñ(IìàËÛ\«ðOmo^+BÒJaËZ;ä¹*•·Í/’Æû&ïK\Õp£ÞˆŽMþ–oý¨­Â¢l#°‰»xtÎEW ‘óöæÄ<—g{»òóR=÷†%úJ”G›Oe¬àüð™¤þ“ýÛ1ÅWÞÖ[ÊR_Ä!Ô½7[0ø°+ûÞØK3èmÓHÚ¦ïT»ž*Õoô¨íwÕµ¸¨ý®Hä›ä Fç7‰ÐEr'Ê>ŠJ¤™ÁÞ¨q¨uæ)†j‡ 5 ÙÒ”ºã=UK—HÉ)Šn¡Ä›-œ’+ÒwŽ«>²mtD0øÉÊÉò{&Ðéd6[Ûy6%V¤þ ”ÈD”E;˜Pô!„º…o2â›H,ˆ(¡%èÅÌ9ZNås¢-Z}ö”m¶| ¯˜æŠ'‡e"BØÌÀ‡› ŽŽû'Çc9ÛçúáÞøGÑ\œ,#&U2Ò²–‡°.XŠ9Ykv,ß8°8mkEMèÝ êœÌWmV B• ›@¯WãÇ„X>Ü*Dtí—2™URßV«ð¼ÀL‹4¹¨rQ”ºQ˜u¶¯zñ!ý‚rùôÌœ¥Þ³Öômm÷%«¦æv*ÕGU 9w5ÃðÛñºYô7/YYeO•!/¢‹8]NˆCMO… Ç+ÑS¥*D†~#â~#±eñ Ѽ,á£K—*8bçYìV¼cs€Ûwˆ ´Ìüº­J°]—=tlÇL막€î„â á–ßÒ¥Iƒm¡ì%¸^¨k“Þ‡$”nJq¸©w×a»®êÔñf;G©”x=SÓD–hà*ŠóCv´û*®K䬴öy—ß+Te ó†;ƒ»ÊŠ=·ÚÕØš‘ûµG#Ŧ‹oF࣡¯ì.ä ÂRí*v¹m »ü¨¥SXsÉ÷“}¯àa4_žJ¾ZÓŒœOu;ÔÔ1ùN¾²I•ƒÚ ]YPOa½†<ß|Í\“¤Ê‚Ä'•2¶ô¸ôgººœø9”½VÜà½%ue‘¦Ëú¾72ŠpÛJSæ-œypæúÜቪ-/5½FM»Zì#9µ¸Æ0º×W¿N¢¯)0‹ÃÁ¤ÀÐg>›B-7QÀÛ›ªEùÝf=¤;ÖókoxïNÝÁ1Ô^é%Uržì³®ÇT»•ŸX×qƒ¯¨F‹ ¡ Žpðï«.Ý -RO áÞ@,(Ù…ÅMÇmä³FùÌmêmõÿSinø´âDiK{ZŸ=[MÞŠç%=+KyGØEN^n%3¦å½)côZAßÈÏ‚Ë9•…|YSò¿XožY•,G¤má¦ÓJ`ZkÂU²Å O4iíp•á/îªw“:Ò_‰Í|Ä|ªåZÛýnpŠÚxyær%MéEXgŸXŒ}#RѦjTƒ˜%žPɪ0»Nzô-Ô vÐÑ[˜.ß•[W“%WDŠNízP&Û¡ùÎæ7«Øu† O!›VªÊàÏJýEøÃGæZyVýÛ¡œê `•œj¨  ï3HJŠòÍ•îWå úŽž¦8T‰Ö¡Ä\÷tÎýíúŽ×åpš{ nK< }§Øh*T-àÿ±äG¬¹W àáRðA—ɘ±VwªÛo·íÁ(+´œ2ÉG$ž-HrN¾]Ӯȑ[LÝ4Ü•C4Þÿõova.éË;ÐK#uöR?µ<<,Aú hrDíPmÔ§œ[j ˜Ö2ºÛÝÛ(c¾u».Ÿ7=µP ÅÕòŒÄÛ¦^®â„Bì.Ôäš#2ýB\ðéI¿~/+ìBJl<ÏÓžM21Ò×>Q–‡ƒ=»iË7fáY°8°‡ØYÛÛLÎ"5ˆ©óãu×}«â›â‰ŠÍ[—åñ²½Ñüv5û×ôkÅ· endstream endobj 1627 0 obj << /Type /Page /Parent 1726 0 R /Resources 1632 0 R /Contents 1633 0 R /Annots [ 1628 0 R 1629 0 R 1630 0 R 1631 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1628 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 445 658 461 672 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1629 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 644 100 658 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1630 0 obj << /Dest [ 672 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 443 474 460 488 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1631 0 obj << /Dest [ 656 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 92 460 100 474 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1632 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1633 0 obj << /Length 1026 /Filter /FlateDecode >> stream H‰ìVMÛ6½ëWÌ‘b.?DŠ ‚I¶ P¤@ëÔ¦Y¦×*´ÒV’×»ý!ýý=tHJ²½I°9õ´XÀ+RÃá›7ožý¾H®ŠB‚€b— ÿð_j%KSn Ë53–+(n“«ƒ…j1†ªM®>®Ü gœ Œ©’ÕüxLÈ/å‘g@‹?’<Ê!ã,7˜XYfxÌÎÈpÜ?iãOÿFþ‘¸»’œ®„b†p ›GX?¶ãw$q3‘¡àÝÇWðë¿t¥qÝã;Í4©)'Õþ¬õø—ë›D‘²ÝÒUNàïðI/~JBšəÁEq{ÁñxdT1A«ó×bj¼’á#g’TÓÖ>dú¡HÔHm˜2TƬ#IÀS ½KvÉûb!C á—lœØåžØÃ¥SRÆS H™R6ƒ¸œIÍ´f™UØYæŒÛ3ÈbF,"à];–xõêöuà=#KÚI¸†esç¼”²"3 ˜” âžl™ûóàâÖHS\¿} q’ùÚ•Oi´ vBU¶PEd”~”8MGÌð#*+ÒÝSO<¸‡»ø„ø°$~z!wí·Aʤge_»]yhƈÍ>ƒÂHÛµnVÛ×ÉÁ§Jb)äÝ}Y7å¦q¾Cs‚¯“ O,È´ênoq*¡ÁæôEç8Û+‰Óº*pŒ›ÚµTdf¤r"&'ÏPÂ2ÈHü²‘ž0¥SJ8ÔÂó?„Œå TØôƒCÜBEŽÄç»ëªzDõèñã¡ÖX—_ÜÀ±Á÷9ù¢`š÷@sܬš)q}ï æ™Õ‘/êȽ:|ÐJ}vÔÇg28(ëédMgcìŒa,fç»—‹Ê§æøÆd°ëz¸q­ëË;Œ«Ûr¬ñÎrÓFœvrøL{tã%‡U!À j´ã©¡+å=ÁÝ—í]Û<†´h¬ n0ßèÕûÅ\NÕ7gh"°*ïP~^+âÔiÒß#²°Ží {Í÷¸©Î%.ÏÝÔ,¥çnjÐùÔ¹›ªè¦fvSÝÚVaÙx899 ØktXo®èI†à L^ ^t°Tië9I? ¤¾ crb¹8±þN'Ö©¾üJ~qâ'þ_øé/ÈàÄÁ‡Mðá/\øäÁÁÍìÀ“ÙÉÅռ؋ס*3YðbÀb…]Daƒ“F}â/ÌWó5d:ç#çË_¬#ÿ'ÀŽžÿ endstream endobj 1634 0 obj << /Type /Page /Parent 1726 0 R /Resources 1635 0 R /Contents 1636 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1635 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1636 0 obj << /Length 4437 /Filter /FlateDecode >> stream H‰œWÛnÛH}×Wð±¹Ñì{óQ±5vf&šE¤,,-Ó1gd)äu’ÙØ܇­K7EݲÀ"@LRdu]N:õf6¸šÍT&³Ùã@ª¬„ðÇUSºÌW¶p¡ÔÙìypu½ ÙbKï”Ùv±\ÝNeöy;(‹²”ðÎb0L—¯ñ×ús“É*dùìAEU™/‹Êa W²]úFÑçxe~ýwñoO‡ªÌ‡RN”!»ÿ–M¿­vOðD‰&KbÛn³ÑíOÙ§ÿäC ÷øÍV´y)O?eÓ×v÷½Ù,Ɉõê!V"ûýŸÿcöË€"¦hTY8¸™ÝÀ3òàõõµÈu!ÅOmðX0 GpYJ,â£'²4ž dÖfe]¡Ì´/BÈœ„Lf£ Ù¦<Þ̺dh ¯”‡ÙØg·ÄŒÊÔÈÄ™¢4\&ºJùôF^õ ¿Å„–ŠÃÃr8Od¿µÛ]¶~̇Î@Y „û—v¹Òïm¼Xe»–ïðŠëU³åœƒLçˆrER,è!…ø»c8x¨št?ÄÃôK³hk¨$ú’­êçäM™ epᎌŽòKZk|QJ »§³ñ»|è‹=$ö1Ž_¼ÍÆßšý…~UT¥Ÿû}4{;¹¥SÏœeÙćéøýì-žeÄøÓïP8y’5äzœ\D—åÐw~!°ñªKU¬ô’CˆÇêõŒ6uª:4Böa†^xq ¿c>{GÇÿW.U’øª+¬²†=~fóO…¶ÄÕÐsàÐ “ˆBSØs§vÙ²…w2D{¿æXžéì*^Ý Fƒ˜eY-ª)â|õ;çCÝM>^a¬˜Œ>æ/ÀŒ# 3sP\C”^GO–9ÄýÜGñg y´€mTåc;«×“UQÙ2%jSçÈ[÷Ä(Rdú$ˆPéåñëXÛ’[ |(­dÀtT…–§çì?\Ð'îèÌ^¹ë eÊ*šÁ ÜÌr É!+a d{>÷ÒÇÜ› SîG{+îF£\Rº±€ŒèäMU± ÊE„î½Ø1z—õj×.ñè–9q¦×„ÀN2$+¦sä…mà *™o·©—Y•ðÙõ™‰ß{i¿—b ÍÕlÛà‚,/BÀrN½öɉï Ïãè*!!÷4q°ZžêÄdÕZu…>N¹äT£:ûëÜ} æ¸Ö]¢ „=AæÌ=àÏ-¨ƒ•»®s)áô€c/àÁóë†Z’Úmà€ŠßXF®â‹V88ìl‰ºbr½õUï@ðûK^×0 Åüoüw‰pâoк÷%áèlN`òRNtGl[Š—EØ×mõ/ÛÌPJ.–/p^\iRK^#-r'u–‚ˆOoÖ¥€ŽÑhµ:ä¼…Rø¦0¶Šv¯Ñš$™‘s$PÉÐWâ’+¶ø¼%fµâ±sz¦X1ùž)Ŧ´xÆ. ¢Ù´ 2…Iu{1òiÖvæ1eÐ;q¤G4iE}ÄÜ…è+Ž>xUõ\vä²î¹ìÄ›Mý½]¶Ôë³)0·oúˆ_Û¬¬t*ù k Ï+,‹JϦP$L°.E.GS)öÄ»ØüŸ®ðBw÷ÔiÓO¹¤Ñ*/ d\¿ä–‚64VÀC·bŒ%‡_6ë/4Ý,GWáHõ¤ UbíE§;m¥r½34áz•Ò ÿícT!-sëeà)«¥¸ZZ•Éó)Êq¡¬¸æ™Sa·W@$¶Ô§â!D|iÓ̹¾ÂÐ+˜:8t ø,1#4{˜Ó—¤«PœÆûèX“c_¯hšîräµMM£?)SœŠŒšNÈ¥(;Nuº3æ(é˜Á e0†uX‚<¤ø•¯¤8Zxº û5v?&ƒxÕþ€W+–6$º~¢¯ZÞ+º®³‡Ó ô„8ì& ñ›z×,ÛUÚ‡à}u‘,bª¸å!û<öhçTý0ëVIš4ÔÆ‘ošÕGŒofÝØM›}‡ïÒLI§óÙIÔ’’CTì¹Ôüh‚G¬–&MÆñxvŵƒW‘™2u>$‘Õ~ï‹9vüAâö…;kÃ-›¾g:ÁŠ’Û­¬¢,Ó ¥ñŒƒ §ä"”b>…?d…âÖÝÝÌGÏ8Å¥Àñ-h´Þz’"Ä•6/t~™ y j'O¦œXln° *ö #‹ ™©’Ú¼›ŒcïFc8[Øæ²Ó*—…"¬”jŸ]f<&.ÎJzÁEÒæìû²ëåû`Ýñ•Š-5þZbÓ¦Õæþ…Õé&.AÙ¹E§7L±N.MÓŸÛ?Ú´»É J_•U Áú9F/y)Üï¬Ðá6͂ۆ$6jAUF€}´;–”ÕÉîѧTÅÉq.Ä.¾}|Œ“•`YÃYãsâÍ kšÕ²Žp_=àÔæÜù4âd¥:k(YÀ.`íµ]QÀQÐkŸq2ƒiŽ™.³áÑÐè•ɪK=2Yç°Ä$m‹(mÉU€F=SØ|ÿì¨TÀ.á@äJ•¤eÒ\“5±Z7LW(¡Á>Ê’¶ÎΑA! ítÒË´©¶#‹9“Ótijá)¯–Þ¶ |ï¯Ð‘<Èྸ»GEaê ±ªZJ”ä®R¨n¬ R ôßwfvfE‰\½ùÁ}Í|ó=lÁN°Æ[/H]²ÛÕÕÂÈ4\"­aJŒÞgZ’·ÀF.¡‰˜HŒØ3cýŠQô+ß©ðAp.g$”[Ôsýv4çó»D2 æ˜$+¡€øì8µ”õ>yͯb2-E lîŽI@¼?²ïqŸÐù#…ãqÏÊgÏ*¶Wtô|‰Õìsš•®6ä[Z‚š«R* ¬×ŸŸYP@–¤™æ–H«XË¢c_Î p½é]ÓÆ¦F!߉ã8· ¬8teîÚ0&Læhµýz †ªô ÅPr>ȃºÏ ½³DáGªØž¢Â6IþP`Ò¸÷ ¸ÞkÿôgÚlûíð}G%9õÈm¸q^[æŽÕáÇ \Ηïû‡d‹¬/ôƒ\àûž^«·Û§Gª‡©F’>Õ0ësüý îV“1u$ïøyö…t ÿ¼§¿<Ô˜ËTMŠ_ªû}57vÓ‘»…6ÙÝX­‰ŸC‘0 K‹SÆŸëô+Q:òßùG"ÊM®:|ÛQcÞú2<Äi/·´¼¥Á#³÷9w¥É‹g¯:ï\rz{Øóe¾¤ìq3EðXxy?n ƒº:3~Fã ®lpôfý×ÀuÑxÂ<è&5¦ša‰àìçVHOŠ>›'СË#;E)V¤aþ ýåºZÑrHž±`´’€À‘Úú›*v)öÔ 8 îY žÑqJ>_­Çz@ßJ ¼“¯ßîéBhmBm®Râ ™E´Œ>/ÐA 8‘År"òbŒg«5k¹íi¹X¾"õÞÔ8 °¨,KAPà­ª^ ]Âez6¨HÞ'¼¼Àš bˆc¼lfÄ Ï'†ÌQ¡<ÉîA£­d¸9`˦‚æà-¯V’šÖO|.P:`»(›w° Ÿºv…°ëÓÊèu^ˆÜ¶NQV=wi95؆Ñ9—ó õ@oÛŸž*ò2ÿ¯Trªï*MU\RÕÄTõ—ÛëÏPo¨üšªYuÈW#½ÔËn"—½{™&{Ӏ̖òâ xOSºntšÐuköîEk£¸œ&%Ÿ ˜ºÒ † o¤#ªW“v”ß•ûÝ]ßѸ(eØêåúX:•kà,OñílFó›B®o· ¿kB^6¯cB7ξë;4<2ÛXá¦[á>\QÔÙ&HŸl^Ø¡­&Sm†7œ^0­«.IMW¾gÆ‡ÄæòÛœ,¼§gÀ¿ÉC; qó>È2l·poftfè`%ÇÝÎÖt/_©ZW7µ#vÐÿ«©a¼t»(žUå›í¡ŒW­ÊìÓ4ùãyâgä/°OhÜlK¥÷,–…÷ôûÄ.Ü*' ^¤>aƒÍÍSMÏjOq–u©m¥ktÑ7G?_QÆàùqðÀÞU[G§‹¯'ªY˜®¤hý´ˆÇ닇êÉF6|¿)NDó†$”f¬¥»ToÉMŒq©| ˆfHßaò€ã•.¼ÔJ4r’æîÐR¡@¡`/ jÇzCuâÑÓ¹5w]–Erÿ‰~é ƒ=ŸÝ$ÅUuŸ&c^©ZkZy^:g "&ƒ778úXG?GLX4ªÄý‹Whorxæðh:r7«õP×7‰mðH=~$nâ,?ÒËÿ kj ›øâœ!¸sº* µ¹Ô© `‹¶ÄŠø’@²ë4ïÕ߯Þ=ìËïÜ;ÒÏG;‰FR+ŠfIT¸‰Ž5pEÝ ¤%²Óù´6‰üsŽò ÏAæÝȃ§}z‡âðä¼[Ï1Lr›Kn²Ñ0(ÞSqZà0ûLÜÍ,£Mò¤Õ&©ÛÈu OÛ–dÓ­ê©%G8U®ŸYahõù+þwSº…HSTšo¿1y^eÞeÎtšh¥ú_¨BÑ:ÖEjk ¯Æƒ÷‡liêϧIƒvë_þ •— endstream endobj 1637 0 obj << /Type /Page /Parent 1726 0 R /Resources 1641 0 R /Contents 1642 0 R /Annots [ 1638 0 R 1639 0 R 1640 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1638 0 obj << /A << /URI (http://www.openmobilealliance.org/release_program/ds_v12.html) /S /URI >> /Type /Annot /Subtype /Link /Rect [ 378 653 758 667 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1639 0 obj << /A << /URI (http://www.openmobilealliance.org/release_program/ds_v12.html) /S /URI >> /Type /Annot /Subtype /Link /Rect [ 71 640 388 654 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1640 0 obj << /Dest [ 686 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 339 598 355 612 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1641 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1642 0 obj << /Length 1980 /Filter /FlateDecode >> stream H‰œWI“«F¾ëW䱈x¢ÙAsó[ì°ý<>´<—ׂR«l(dõôüúɬd‘Ô‡”  ×ïû²>®ëu.¬· 7°üñ*vìUäD¾{Žërñð©I kÌ.šL/~xtá¹Y,Ûqð;Ù‚Në—Å7á&¶Ûž€/µµ ÛxÅ›±¨,|#5dUŽ[VB6`ý¾þ‰òz‡<öÆ›\ñ"ÛIØcÆ\K²¸Þ©™µªÒP¨¦µ–‰ˆÆ ìD@»“ ëºB/"¼KÆÑn»K[ÈR UfEv$²®†'¡«ºL‹âªQ›B‚Òæý¢²\_~n ª¡â›Y¥›ªO–=Fq–V ÞOâ³ÜF‰o}@œAoH¡;fÐÅüÄ_uöËWxlÓ¶kà“ñüjÆ¢0²“`ʘ»3FK“1óÎò°N²1$'Ƭ!­­ÕË-f1Ê -sØX.½õŠ5¥”ã¥yá«Ù ü•ÖÂ@Eªóþk¹åâ7lø7Ø ô~‚fÚTüÚ‡þu)9Té;/´Cü³þŒ÷(c‹kýçbi¡G®o÷í˜a¨»¶ÝÿëááååÅ®öR—ÕFÖ CZKM1Ó®( •êLÚØ%Ô±Ï|í÷œ¾Ð Ï¡ìyOõÌWü(r~údz´kË„ðe½pAÁÂTÈ…(ðlßûÂK A-ÛÅÇõQ5ý$´½€Ê‰XôŒd„#øB.¬ ÿ®ZIÝØÃü¶–K5B|.@aÕ\t ÕUË9^"Ȱ7(Þ˜À`ZÀ_Ϫr_ÈV~€M×" (ˆ ¼­±|˜£@覇ƈ±´F•ûªnSÝÂá3¶ÌWúYii…ž xV_l÷„ÛÝlòÜÁI/â*»Žk%ÔgèˆÆŽ[byLV²>ÈW ÃâÅ+—¡/vÃWE æ C3¥j±li¶“9µ¬Ù&!Á4„¦}ðž¬Ñ¡ÞÿeÄ:ö)<Äê9Îî¹ÿˉû&ê¿þŒ¦»,Cÿ¶]ØàujXð4iƒQoõŽÕoh–èÆ¿’¼óv?¶²„4Ï‘î0‡Öâ¹ ÍÇ'¶rz¶úTé-r âPe˜sCŒ‘)O„\‚ÆDq@O^T»ƒRb<àÏÄTå¹JÌy™\ô2š¼Œ&/ÙAI^!1Î4^-!+”Äþ'¸¼(ÍîõhuÑ£xò(~×#â\—ýÙ¼BÞí Âl,2Je"°qô3(*êU¿¼ø¸}\ÇBV .÷«Ü(xôâgIdÂ5«:¢ #ÙN‘Úzâ@(rç+çϸCT_éfÊ–?u3bÞ{u­§ÏŒz7äàú®C:Ô­Ê·¬Fè}K:;*P„îtW°à½w¢S ñ?þsN\sµMÞ‰ ÃòO[“î_D î¬ £yörH{¢ADêV"Ôqt$‹M·§ùq–“ý7ñ]ž0Þ*å ×f<–¬‹wêä?u/ŸtÅ-Œò©yùÄÕ¡Q[¬Êü 8—£ÙɃQÕlÖŠý) ˆqÜènF1Ú¸lÕZÈÓ[&Õ¯PVõ ß™k7Iø›Ôü¨‡c{&w¦$¼f— þ›ž€PÊ\¥Ð¾î¥)ñT…’W¦³p6*‘Õä–¡mŠÖí© '´¨-ž4DjøM ÿ‹ªѱ“/wW`u‹O¡»îÉa5"F+‹mbƦàè€Àwû-¼ÿÀ’ä<܇[oV'ØŽæù÷ 2‰lA;‹rX÷ 燀¹c Š*#†Ûuò]#@xÓ¡ñ²”(ÂM‰Ô‰|úô$ÄáýRΧ³¤ÛŸ%em’Þéô@Ü >ÝÌ#×§Ögu”mXߦŸ×Ÿá ë†È“ÂçÑ•1m-W<¹x¹; Wc‡‰ì‘$|˜#Ã+/tÖߨ%/H÷úåÝþܧ.ÇúKÓò‡Qai\¸Áø ‹„W%†Çã±:ÞP3 '¢í¯s]áèFWä„þZ×H·÷útåLºœØö˜lɤ¨|±<öáŸyp“ºSiSK:»ìêJ«æÑ÷gLû·Äñ‡èie¢çsÓŽ Ch1°éçAúà—õâÿ¦’ë endstream endobj 1643 0 obj << /Type /Page /Parent 1726 0 R /Resources 1645 0 R /Contents 1646 0 R /Annots [ 1644 0 R ] /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1644 0 obj << /Dest [ 1637 0 R /XYZ null null null ] /Type /Annot /Subtype /Link /Rect [ 447 670 469 684 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /I >> endobj 1645 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1646 0 obj << /Length 2310 /Filter /FlateDecode >> stream H‰œWÉrÛÊÝó+zÙH‰æaÛÊ‹;ϲ*¯beM±c Ñ̇äòYäÜn $%’ Êeht÷=w>÷Ãrv¿\:ÌfËõÌv˜…øñ"Çô<+`aì›Ad¹l™Ïî?ÖKkµÇbuZÌîYØì¹žY¦eÙØ“ÎæýãnÆ¿%Ï‚9–ÅŒå?g±:³Ð2㻑Xú^uÆQÇéÉèôwþ_uæŽeÌm× ¸±§=[ì‹fƒ‡ 7ñZÖì÷¿Ü±¿ÿϘûx¯ðÍ7}. ‹§›;¶ØÉæß¢ÊÔ%.OŠ•19ûúkücù§™ÒXiãXf€—å'¬)»ÝÎ4\Óæ5I$WC¤‰GËtxÚ-mÔMË™Í$›9~`ºÍÜÐŒ"ذ$ƒŽ^Ä*1[Ï>,c¸6¶XÇÖ­k‘E¸²|ú¨·dX&þëÃdÉÎ}ç¾í6„wzŽnL¿S“|Õíþ˜©A'‘eb5ñ:©žiy8ä™®…L¿ …sèKËBÉ”6®ÆõgŸ‹FTôæE’±‡ª*ÕzÅ>â×çåJÔƒô³:Q {Ž:ëàSnãVo±Suuœõaæh`)™ Ðñ9T§’çtxn›N4ØË$A+(h™¦mņЇXýºW,î‰âé{–F€(Û¶rQ«Á6É‹`;¦cŽœä¹`¹H`¿j¿,žY¢·¨ÝÈô«á!¾à¯ÃÙ¢Iš–"q¬·}$#ëÇÇnMÙÆ{jºhß§Ô'ójð°ýàÚ.O“J°r½®EC ªLš’åÉÁÒLªOyTá⤻}§>Ò i+سÞYˆ*i€’Â’íïŒJ™Ëв1ovgßåï´=ÑžSkƒjºÛåEÃÊ ¦9Ó?"ò"^dÂÚqûnkª ûUmƒù¸y. ܃2áP˜ãà¿kƒy}ìYß?$+`cmñ£(wkª¤¨· )1oض*›2-³³Q1åD%áqH/ûr ZñèËXýʧC-â òsK&óxù”‰œ¡–nT|AYOYɃ•\²¬(R•Þ|¿ãË;°»S°IÔ ÂÊ­(XZæy[ÈÔ CªàóxC9£3àTÀËâȼ)ÈÂY¨ R¬áUÒ$'}‚\‚\{”k‡G© ŽŠzº&ä(+ÆÍúSôFý£.Ì ª¯‰NõœƒÜFV6û­@ÊE­¾×‡»À(~\¬F ©tq^ÇaRè¼Ñ•m§?ì«:õ#®Ÿôsƒ@cPžCð£ñýÃkúë^ú Z ²7uMõY";rY€tã3᡺L…ú ªy]Qzäk?“|› œxI2¹R¥ï7ìê[“.ÇÎPS졟õµïoš}€º¾:ŠksX•:BÓÍyÍݳŠGSÿº5t˜fe-Æœ‚ûz®rÒ{_NÆW 0’CB²<¨µjm–ìEÅ’¶Ù”•¬“FÌ#æ³Éþ¸\~S_`¹u"éÑ9:Ç mKgÞeµèžèèùÒÑÌd›t/Qd=\÷›þýj8ü }*Ö²#¥ý¦5Ó§ë¶=EmÑ5ȃ]m{€L©§ W‚^žè5PoJÕ>ºeª?æ~Iƒ¥ÕÛá:WŒ|†š‚¦ B[i·¯Ë•<ìãŽ2bXeû¼¡d‚ZÿjEM$½¦êC%Í$ŠÚ£Aõè=èÝ)èßèz º²Ôh3Å’Ø“`kæ + º•º‘7ÑH¾zFýE¦¢@¾‹Ÿ[Y‰•6 ˰ŠnL¬Õ¢b/:3ߌʟ”JÑ—]¢±ƒÈå`•šðgšæ §õ{Ó¯³~ç…‰àlªS¬öŠ#Ü€ãÂ‹×ØÁ©ÀpŠAƹG»‰/¨5!p“§²¢PuokTÀ[¥GSÔ}M4?wý-SÁ‚Îßõ÷÷dN| ‚îÊ_d.IÓ¦’ ¶/¢ªÍ—Ó»ŽçXï¡§”§…HU­hd.J Y·Ò@çÊq†}H^,¨MÐ%™ª¹–i¢Ú0‡œ½• 8ïœ7ÞÀæõpˆ ‹#%º•"8“Š×…L±6±F°\ ^§Ì#¨*êƒÍË\3éº)+QwÜàŽÕ´Þ]ÝH4`¿ (|ã]œ#ºg ¦ø+¢ª\ƒRæeµ%V]sQnpNî™Ðêå¸QæÛf¼¨è˜»b"6\hR(D³+«,yI$>F> endobj 1648 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT8 1666 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1649 0 obj << /Length 923 /Filter /FlateDecode >> stream H‰œUÛ’Ó8}÷Wô£Ä$_b?CMí[µUc^(ÊãȃGÎÊ6 |ÿÀ?îÃvKN²d¹d¨TìÖµÏ9}ñÓ2º(K Ê&R$þð•äZ$‰Ì`Y¤"Ëe å}tñlÈ¡ü Cm£‹«kë!’BJ…{êh±7·û«ZÐR/ßE…?TÀRŠ"Ëã\d2ÜëÏhœ¬4£Ó7ì‹ÆÙ…–|¡b‘1™ÃíG¸þhÇ;œÑÌp¼‰ íO®ëø"űõT¤¬å’ÕwázÛŽŸŒëü%1«ìŠ/ Ÿý“¿)ÿˆõ9rè£SNÖO#ô ¸Êb=>Øg|ŽOuô©ÂQ³C†¶êPÿÊ›ÞÐTm79¯™íaeFðÞö[‹Ñc×­%_ –¶Ökþ aI΀«Òc«JÃѺ«žaÖ†'Ø~ÇS‚¢Ùº ³#™ñ³sœà9@9-ÚòQðë ZËTJ!ðUó¶d*´ú¨ùQÔ< ô•—HVòÔw…LÍà›ËÆív„ëßy"rvõv·Û…Š­ûÕ¼Nz¿hí´ƒÆ…©¶·óZÏ9Vméëö=jºõŸ/B„ŒÔ=i¤N-ãòÈn1[„ö¥5»©©è¨ÐP:ÃÙ¶ØIhnm¬qÕh òCã¶ÂI ë…úP-}?_c:½ÅE®µø:ñ ¿•5”0E‘ŸÛ"‰RÀ<À4E¡0¿9uµ0ÂLŸì{Êe³«Ífl{„‰óaõÇoŸ½EqV¿–ɾ_“…d_ÚPEA>bþÐÄLg=”¤ÔÄ4ô@4 €~Òæþ÷å¿a—ÕXÝREù¢‚ÚtfÀ}¿š:ã£MË”7ÕmƒZ* 3z«ÁK›³ðìýž`CHâŒà·hâ÷ø_‹†- endstream endobj 1650 0 obj << /Type /Page /Parent 1727 0 R /Resources 1651 0 R /Contents 1652 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1651 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R /TT4 2109 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1652 0 obj << /Length 2828 /Filter /FlateDecode >> stream H‰ŒW͎㸾û)t¤€±GÔ¿sØM‹]$@€éCA´DÛÊèo%ªÝžÉ;ì;æ*-¹Mºa4`ý´ªX,~õÕW?¿l>¿¼„÷^züÁ%ÎÃ]©—É.̓È{i7Ÿÿ2å^9éoo*»Íç_¿rï8m‚]pø¦Ül¯·ç û‡8J/ BÏùϦÐF…—»"ÇQ¾Kò«mBmŽwIŠÖߨŸ!¼Ý†¿åÑ.eAîí/Þ×K§Nð&dÒOlª'ï§_?yÿúŸ¿Mày„ÿ%»„Õ~ÀÊÓ'ïë¹V?äØh']åo æýWÿúÿ~ù}£w¬w»^þ ïtçóyçG;Î&\Uâ²à–ÜÁm° Yi^´§_^6Ü«½M˜¤»(å^”íòÜK9dÒƒ=ƹ7ÊÍaóóË’ŒˆÃ'Áûl¬Ù 0#LgÎ(6gŽIß]ó™ÅÑ. ÈbÀ—ã"Ú/v~Ið~ë*é‡)lìrpuï¢(Ïî<§EäY;á>äî§f8‰½T~ÎêÒ¿ Ón ðÙ<Ñ襯ì;xw¨Þ?áMÆþ ÍÙß<%Ž-îÂß²6Ü„ù51,“ÀÛò|‹ç…»ÌÖ g´a±ïGÕw¢ij%ÛÉOv1;Àú u#+Ïã<ð x¼"FW‡ ÁaYÊAüRW7JŽp—3ðò[KL|‰g·.&?…XÀ>½š«ð·!k|@VÆlàšþ¡ f¼˜;c ’uó‰N‘¨Úº¥¨.S9փ 3gÞ¢; 0q€Á¹u²T‹qrk¬×Ý®Iz—#,DyæXûÀ£¹Áÿ² 7±©4ÿ¤¢ÜÃ5…fFçœt×X„pÆJzi¶œ[éZ¤L¡EN)[“äŠ"^ȯq4ýY¶ƒºx^ާÆYá#+¸Ñt³~ã •ý" ”£¥kó/ˆ*vG.>ë˳€2 ÙÉh¤èÀ>'T…îÐVððäÆOÚOÈèͺªéKÑÔ…3,‡Av•êå[=©º;z@‹÷xrf‰‰q`žOWã+\)}Che§Ê~îÔ¡– „]ÏÕø/dßÖ­T—Ó˜c½ÆèZ¢•«p5|ËïVK×ÕÒûÕ:°X¢ŠŠ™;ÑÅꤸw‚àI5ßeìáÆ)ÕÅRÄÅMg”DôRâ%fØyá©•ôkÔØ‚ýÀJÖ¬…ï!tzmžzÒe­Ã+ðd8 èâ®7ù΀Ÿ®ª„’uçs ¤lf@&«_% $(>QÞI´´sÆãâö$7½R+ä$‹õ ,º¾+u± ©Ž"ÛKì$ë}CõLžñšÕ[©Ÿˆ wé¾'G¶¯¢k¾°ÂØ®sÃöûºãe£šÀ(zj¿ßÐê=ô†µ€lDþ€¬Fsu2u2vöâ6™ìûêr_ÏŽ„;‚CSÈ&r¬ŽÅ"ÀæQ‰€ÝLßѯn71£¦A¿æ•¢§‹èÈûÙô`;wJx¾Æ˜SŒÈØØõ#Ýõ#&ßÔp†ä ´–<€½×²©ŽüòñpW^>*Ždv“Ѓ]t}´u‡ç‡Ïž?vYžDw„%‰0¨à4NûÎT~ÈrÍQîò·‚Ï3f‰`ËíATìè]I}w4Üv)ÓM„ȳµ9“ºP>ò^ߥ‚-T$¬cFÿ,IÌÒ+½×ë8K7¼ÁeY¥»pd¹§ŽFÄfÊÚmûJ„t0(nÙ|2jI’ÓFWýÁR[„Dï7¸· ¾ig’ÞÏ;ü6­h#‰Î"w׿}}c•º˜¹˜è8e“ÔúáíZ¥E⾓˜ÉØ9êÏVgh‡Z Å $cÔµƒÕëj6v» slš˜_p3¢=OžXÌòP(Ð6ÁÅ”ftìZiüìLwuÃu:ÒäL®L Kc*Iwlv#½î­ÐN3rš].] g4f'lQ>å"‡®§ãvͰ?‚.®ð£™d£]ò¶ÔÂÔÝ%íYˆ`˜Á„Ô¾ÃcÒ̹§*[+c:pçÐà¸[¢ÆËfãÛÍr³Y¸¢€ó¼ìÁ<ë€×¾{Zdïá© ú®#N¾v4ž¤ÎÖ`Óeµý¢mæ^ÙR»h«åqál…ÁŠ· 4x4ý¬Ì*Žfm5=°”ÖÖœ½©/Õ~žäx¿õÇ*Ù~ÆæïÌ”ÕÆõ×åiî¾·âmªø9¶D=Û=Ù½+yÀÄ0锹ÙË^v1’]ÙW4^Fì¨]hél-ÿÎêª ý­•.XH„dFóS„àqéʶy}×HLûÔ‚@‡”Ù!= ty:_«5µŽ>Aõ(ÆQ\¦?¤"·€±ó†vPÏ>4¹ä:’‹ÌMÝ®øÐI+²K 'bï“gÌÎ$¸xöäØª­ xŠ9fß1³!{ 2W³CµNú&Ô½=×3d­»~•h qì%QØ‘A ½ bp4ueГa[áÌahöZ—TŸØ%®®AL§ï´4_óÄ¡)”7U“#2Çù²ªžÄ¾ƒ,âè5¢5d$#é]žšn&v­™®‹¦«“s©¥k#.&ŸücÞs5x€( µÑÚxÝÐ=¹:øv*uÝaÚºîd:íNÈÓ ?˜Þ ðš ÏÏŽ PfŸÍºÊšÖ 5ßÏ­çåVǽ!wüÄÚ0öL¦ÇÙuм“ŒsîVößà$:ÑÌ#ÖxYt¨eèvïÞ4ý}cà¦ÈÐu¼V$ÚØµmì\ÌÒã€#9Œ@£oÀžá}è‹/N6’dø4S«° £Z·iMRé®%\asèv…ü-â¯Pdž¡]äN7‰.à|jš…–94,5»åÍçÚÏ87šhìã¼™¨àËzÒRø¤É“îuø ».k—ív=Øõ\ÑÛØžI k•³QÒ£ Ä©«™'…Ýr¹Ç=Ž.™’Ç Qñlƒ?ôM%ÇïòBMœœ{±‰µÎL g‰Û™ïaêjúR4?îÚÍÛ7hÃYálçn|ߥ›ƾeÛ+ÙwÍeš‡¡Õ-WÜiB3nD¡{ªµØô0wZkÃî“§ñ;J¥{ŸáÄFSeüÉÉ\4ý^4M¤QjöAùX‡uœëêʺ׹’h q'3¼"—]Ÿ·PëVÙ')gJXr ,î<)eÎ, ž{õ±Óƒk ekÎè÷ÿö‰RS’óKóJp·ú°4¡`Æ €Ô˜š Ž¤QlûkšA[TUà„ mA(ìQ‚‘„2Mù\`*NF…8;6 z;¯Ö³3Ã^ aä¸Ì> endobj 1654 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1655 0 obj << /Length 3379 /Filter /FlateDecode >> stream H‰”WËnãÊÝë+¸l¶†Ý|/²ÈM‚ d`¼Êà" É–ľ̇ó!ù‡üc9ÕE‘²Øö(0¬¦¨®êêzœ:õÛÃîËÃr¤ópØIåxøÃ$j^äÄi¸ÏwêÝ—¿ ‰“fç y³ûòûW釷÷<‰=ùîþüø²ÿÈŽÚQu¾ïR#”:±·O#(ö“}ä±^#£Œ8=…IÿQx{¯<÷^úûHx‰óøæ|}kÆÞ(¡]hC98þýÎùçÝûß{üîCQºžÈOwÎ×—rü©ûÊ(ñEÖî}*œ›O÷‡¿ïÌÍm”·ðåá¯xg,xyyÙ»þ^ŠNÕt,TãÈ=½½ùüêd4ýía'ÒÙ©0Úû‘tüxŸ$N$áIw §×»ÃžÄï½7Vïzäa¼·Fæì¿8òöø¿pàÙŠ/Ý{_40p‹A“wBÑEFO±çuxªhŸãH,pPL‹!/gA Ž&Ç@?q4=š³šÁ%ý8FAiïP5º ŸºÒµnFþý©ÂA‰ºTë/j×üñü µ¤”léÇ:ëè»Q¥Û8õ‚³èiV 寨ÏOãÔ“g$…¶, .Žì6…«MáYÝsI—Qä`wz¬ô¡¬FÝCRv«¼Å*ÏX%Ê.+Š^ƒƒ€š_Ÿ¼uò­»¼míÆðk>–mã8Q²9ñ›¨2v7G n‹C©«b|ëôÆsË›ò…}Ìr–ˆ7Š«"M¤!ØúÞˆ­ Ì+Ý”ˆü…Ðöš2Z…沯Ê\#îåNnd]é‰Ð·Ÿi±z–çdT¢ÉjèI‰ÈÂé­¿«².G]\Bl€NUàZÇñĦ{ö"IW})»£l42Øq€ ¶€¯žð"hó¬*ß%×"·¬rÁ¥\— ÃKÛSv§¾õÄmrÏ¢'8žègyÛ¯Mž”Éû„ŽŠÊ®ìÆÿ«ÄŒ’.#ÄÅëˆhšT—its´GÝd¨Ì‚³GÊ0ç:ê$ ‡SÂJiu·ÍÜ㡚]vB†%s Ü„sFAÛ×¼¦wŽ1Ör²%AŽe“ŸtþcÈg'GÊiµŠªÅè²9” °ŒñÄËYü ©×?×8©Áß8\ŠZêÜ£*{Ô•ê'GÚnM¹_Å×'ݯF¾·qÒ"‡†g¶HZ}|í(·ÝXÖº(:ÑMu$ê,ïÛ«í-*ZZÔ\5µiƾøÁcšµÝüv%ý‰Š—‘°Hž·õ®„Œià$¬hIuf¹ëêì‡æ¾ž¡î]_» §™YŽþJra€l¬àsÝ, 2JŸâä6œ«³×l³üdø…㤛Fjí½tÙWôÑ|ê{œSƒZ1‚˜\'áeû·$ÚÐ&ê¡Ó} ]Äy‘͉›nÏû¬}ü>”?©%Ú+u-©–£‹…î4”L¤æ¬^ùW£‹‘èHÀi‹/|/_´M?‘ûc¾¦á¡¡=qí¶QÖ¦â­ÉëêY³¡ü 3òØ´ok±‹¡o<õ:+È"y3užô+N SkÁ«dq˹܊c=Ñm¥áç”}gR3Æ` :󾔞oåmµñB"ŽTÈ€BØœ_ŒNíüÍ‚c¾¢ì¹¥V·å9$TgeuUŸ`,It}Ë}7ocGu &ü:.ìÝrеißHˆR#ºÌ–@ð«’Qõ]º`fDLCð혴šÆ^Ùpí“ j ØÕqñïW¯\:e8ID5©®Û.7Uc T£V‰Ö$?Ÿhë[@%œýä{‡Ü$I£áÇn 4æ{­MR®P$c¶·Ñ/$~†ŠÍ)K îrfCAž¦vê1O•ñíÅJ<§m*‚RßH ™0jtÈg0ãÑ•óD£€y5w8däÄOü™ó¯,9“LʯÅøH•ZE®©%ƒÕ@Pþ¼å‡|(<+ayK¶g·…Vr@ÚB£ÍŸµ¡„š¼š˜$À'ÍŸ:SGÏ^3³áâ:*cÏÞŒ8ükôIMGukšè¥fZâ¶l1e3FBM¶¥I½d;õ­Õ‚m?N]‘†ÊÉ ´—|¯Ÿ&Œº˜1Òc€ù"ZÇ k|›e k%/EfFÅDAjÔ9 µ’~P+Yˆ_tX1hSd$Xö×7¸>ïšF‘ùƒ!ošë½)™D«-ßà VçÝ,Ú¹RLü¾¤Š}9é¦( F(ésÞþN¶y_dWá÷æò .+ë"Ëü%ËüùúÃTkÃÍ§Ž’öû,Ý=_Zþ"ûÜùÚœ¶0Èy™bøÝÝzšE¼N<ƒÂZ~ñ„I0Û¹Š)ã¡™¶ úâ2zY®¤–+©™º• ¬/™G‚äòCCÞ÷Å‘‰¡ã„ô:fIí¬F®ÌHžÕQ|žÙRQQŸïÍHÇŸ¦wHñÆ»Œáº¹ ù2aÕÐJ~©HI*æo9/#t ŠŒ¾˜ÓŠÙòiÞ“è"RÄ´(ðb§ [ÂG™9*_ ÓIS q•‡Rü+]ç—y· h|PÊùæ :벪â×éÔî0µd¾ò/F¥ÛÏOC7qÜý³CBáqø^ìØ­âEw¼ê¦ÞÑpúÄÉ5L¯kú÷S"ý: œ~jN¿qozñ¼ÁX°M)V³Ü™¶ðKתdãÚ[¢Ù?.äIbÞ[ßšcÖš•ñšççyb’[‰gÔkÈ#/.2¾uúOòÖ†ý¿Ö«-ÉMþçù$UùØåi 7È0Öîª"[ä"ÞÓgF=`‚$6UÉ—ÀÍ0š™îsTž»®ðpfϧ.L“㦖xÄ6 š)\NÀÛ¦xœ!¯ÒôÛ`DÿŸ#¿É)€-ôª›ÑŸçëN¥~5æ’½Êżr<ñR†^ÃÉaE‡=f®û³±+ ð2!3B«CåO·É"ž‹xܾΞ­.¿~®«øJ'W—ezð‹O¹m¾¥Ìò½o Ü×øf§Îum/ÆMCú=EuÓ£}ĉñÓî͆¦z ù55[ø1ªÿQ¿—Óë¿4 >&Ÿž^7ëA&n]C$D²¯WwÖc×úžÈã’0Tðëbj.½Q,û‰Ç`OnjˆjðîŒq“Ñ:P»á¬4êÕØQ%…Y“2n²gÆ.ÂÓN•×Ü2^ÂxP> endobj 1657 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1658 0 obj << /Length 1397 /Filter /FlateDecode >> stream H‰”WÍ’£6¾ó:Šª‘Äÿ1›¤¶*§TOÙÊ1 Äx=’wÈ;ænIä­ÙšÀVÝúÔýuóiç=îv‚p²{ñ¸ ~àç"Œc–’¬HÂ4gٽǟǜìG½†‘qßzŸŸ89Œ ã°fïóíÉ£¿—I‹‰¿ûË+´QA2)Gy˜2ƒ«m„6Ç»$Eë/ô_Ÿ‚ù”²œ<ŸÉÓ¹U¯ð‰ Ò$:Ö#ùéóùã??Hày€ï’0¡µÏèþõÓœN§ÐBNGô*Ñ-@ƒËnY(èÞ~ôª‘~ÝyœÔÄIF)'Qæ9I90I`qNé½xŸv2"KØ- » ¡š½ådfþ²”…ð·ÈÄL ÞýãôÜÝKÝH«5 #·ˆ —#cÑl£^YVÇ®³T\™EhfW…ajœz 'c:T%Þ¤TÁù¤T?dtsªºÁ®"„Ç|æÿ&&¾d‘…ö8ûÝîl÷]U·À(¢kŒè²¯lÙWföuK½%^$k*Œ·lÞϬã3¦”ŸæŠ±ãõëdoFp~у+h‚÷î€Ä˜ÑÛ½v0µ‡ƒTð;~m0Mܼ¬Ë ™I /£*?Ž~€u!U+O¸Àù#aM}¥ŸªäÝø>H ª1ØŒ/ü•xÓ#ÆœÑÞÒ™:-«îÈã%òø*òú(õØ—J¶ÀEÂ/ÀÓF<*¢lù;fqB»Ö>C¥\þш•üf¨ŽèÅ©z…“ÜyþÛœFócÙ[“Û2uV·ñØÏçù=gëÄ0–³šäÁâðJMð8ªQŽcݵMwhK8 Š9µ(]\Ú Oª?-@œ«±vл‘Ù8ÓÆ —M³ØC;H èN¡HîR¼ ÄE Šy4¥¹Ù+œâ'Õ81âLj ÊÖ8÷ö¤Af+'…Éâ71CÙŽ%”E×ZõÛ¦J°¨Ëµ¸€)æ6§-ô8:öÝj—nÓÅÙ{¾ÏhÔ—#â@Û7·Ò¢ãÃi ¬à&Ó\CÎÒxº˜aìƒbô·<›gCÿX«9`¶¾CÇ;V8åsSQh†&ݤ@®×ºÝÍrúV6NÝ?_ÌWXv@)g4/¶[¸ «å0ú8@ƒ‚›ªvÊïºñ¢X8Õ` ûª¬l½Í$$6 ´–ã™au¯ÃÛQY«=×wQE)K츮J5™;óY‡/e­’ƒY‰3 }Zð®²Ë]y,wWÞvjøvltóуCÕmëN]ò„Û‘ì½ìuÑBŽqz©\—¦lrì½î÷ݱì¸#ß$˜ã Š£î·¬{Y=×-ºGMÄaˆ­&" yA°’³Û41¯ˆðöùÿYñºà endstream endobj 1659 0 obj << /Type /Page /Parent 1727 0 R /Resources 1660 0 R /Contents 1661 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1660 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1661 0 obj << /Length 2701 /Filter /FlateDecode >> stream H‰”WÛrÛF}çWàq¦Ê¤1¸ã"†$"\¸(‹Nm©lY޵å(.K)%û!ûûyH_MZm¹,\ˆééé>}úôE»xÛ¶Ž¥¬öóB9– ÿàâEÎÊóìÀ cD¶kµ¿.Þ®#ëö‘¾±­ÇÛ‡ÅÛm£¬_öʶ|s»Xv·Ï ±ÿðË娾%Û-bZ[¡½Š0ìF«Àf»´Æ¡åxç¸úgñ_Þ.[.•» „Yÿ´š?ž¾ÀGÜI°$ï­dûÆzÿ—\úðü~óW¾¸—¶¸ýòÆjžïŸþ}÷ý+q҇Or ë?ôWþ³ýiA'¦Ó8ö*€‡6…wäÁóóóJº+%q×;ÜLÖ+¸µWޏ5¯¾%Ý.”uo-?X¹²ÜpEV  ’œÑ‹¬ïw‹Ï‹‹¶†«àûÇh ѵ1"‚¢7d¦‹_Ø+øÏK j¶ê÷è~òõÛ—ïžîo­ìáÓÝÖoŸ­2XyâëWëãï2^EâþëÓòþ¶û~ÿíÉúüûÃíÓýo]h–j{bD0EýŽÙଅ¢ª[º¦Ò ß& _+‰Q¯µ®G§FÝÎ(¤µ÷;êÍb Ñ,^¹ÄXë¦ÉªÒ²ÂøÕ 4eŽŽuŒKròP¤¤'@™a ÈØ¾æþ‡ ¬¿§÷æÝ‰ih;ƒ}½§Tç’Y[DJzœvÇÙš,L±ÉPïàçeìôbÉ1Íw“ÕH"!ªfì/-Ô%ÌPÔܽîý‘ŸJR§^×òc’ŸÂÇ?Óþõ15!ÝT¸i;ÔXýSUnòÌÜ·“jF$ѵΫu’³XÊ(ŽÈgÞ«µÙ ½´Æ“á'R7Ó)AB›f¹ÍŒ®ö ï" ¸6<Í§ÕæwDâD3%Û”J°Ê|—4—gd78Ó7·sÅpcFÇŒ!ÝààòààòààL“ՄП@[`ÛÅ¿ ×Fݽ=<9¿"=7Áï3‘̶ee⣙_{.Û9©4.¤Œ$A#Qï$W ?rU‘þ¸¡yq¢ò ߨò¡zýÁAÕ;È2kЛALõÊó z\ƒ,˜uÜ7Õ²Æh6y•ÈdD(Û=õ:Ú‡õµÎaÓ+<¡=¹©÷ÅiØ:ë RvÓ„·o»ë‘ ìG=þD/Å:o{Ük–žî•åp ÕE„¤sK Ðõˆ§ lØÖ™ ?‹"4@rû67¤‹6›Æ<·4 1®_'ïójÛ.¨âú#$¼ÄJyU5Y¹5Â}«1 Ó:ÆtŒÓŸð®×;gÒŒºù0ꌇ¨‚4 ޶ߛº>äRyÝ8OÇ`ž…Áâ¥a‡Ò<5wÇž?Ú4Ëx*…—9Õ³šžx"åé9Ø{˜VÉ_G¬'• x0®Œñ_?|ûKï>Ý}–تîî0ks¨ò{XùÃqÝ5WN5è›aÉÅÚˆ·CÙZçrúDöýµ …fÐs¡ËÓéÍËÄSfæ)O›s”œ ¬÷×îüÍòœÅXÖè5»Y•i3«˜í¡÷uí¿¨JÀ·ØÁD:Z÷ÎJýŽèQÂ|ñjŠ„eТڤ« …‚•4ÑÒ@ˆ¹AåÜw°U 0”>ׯós+:@ƒM0BO€Ñ‹^eDoy(H‡R§Kõí<2¤Œ Ú'5’tÅTSy ”{JÚÞGy¨$À¸â«Äµùñ°Î—ù9—î ‡¢2ÎM'ê.ùˆZäÍÞüdHãLÍtósA¿¯2ˆÄ2¤ÙÒý=— ¶7sDÌ—i ‹Ãuª+ˆt’¦çð¤úüÚ&¿õI;.­ŠAå“õ0²v"¨Öëƒèz˜‡](%Ž:k­(œ6ëf]I”<ð%ŽERá-wÏ9þìßQI·e<Â}<ÚÅå]Bq“›͆¨TQÏ‹YµgÓŽ5Oj[}}c†Ãq AC(TŠ-à%föŽÄõMAŒ?&)Fã’¿íàCgT…/ÇyKq5½¾‘ ÷ªõž6Á94QŸ÷:¼O½&¹å€ÙfO™Ê¥G£! YÐ6á,.ÿI¯ù‹Ó¯u1;’N4Fß]ç¶Í¸änW:ÍE/Öç‚þ$}ã騽fŽÀjšo5ªKÐSÓÕÉYkü¸ScRt;yE2Ž%iøT¦›c]øÝq‰yÏmdNþñTy:TÖÈ´õüÌcÃâ¤- ¯™­Zbü€¦’¹L¥ôU‘ýhTa&¬žpO;8ÉR@B \nÓmÅ€Ûñu}khüº]ü=þ(™A endstream endobj 1662 0 obj << /Type /Page /Parent 1727 0 R /Resources 1663 0 R /Contents 1664 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 >> endobj 1663 0 obj << /ProcSet [ /PDF /Text ] /Font << /TT2 2104 0 R >> /ExtGState << /GS1 2110 0 R >> /ColorSpace << /Cs8 2103 0 R >> >> endobj 1664 0 obj << /Length 2093 /Filter /FlateDecode >> stream H‰œWÍrã6¾ë)x«Fà ™kŠÔ”5öÖÇÉL*;‡qª\ÙÙwØwÜCú"i tfR.‹H4ºÝ_}5¬Þƒò¤7ü¼’Ê áQ¦‚( /Íã ÉBí ÿ^½/Ÿ2ïቾ ½§‡/«÷»^z¿<­Â %|ó°ZŸ‡Ï+qøá—GOøu•Ó¦ÜKà O`MgA²\Ú£h;ŽâwÿSüOÁêZ…þZê aæýø‡×ÿñå÷O°¢Ä£’ÄÓç'¯Ø½óîÿï¯c˜…wq‹Ï~(>½óúçÏ¿ÿçñëo$D‹¾üä¯sáý—~ý ÿX‘Åd ƒ&ÃÖHƒçççÀ×Oxê# ¢áȆa Äƒ]úD’̰’Þgo¥â$Љôtd™—Hð¤6F™÷õqõóêj¡%|¾ôÆäÝ="È{ÓÍœý—&aÿ¼}>yŸœß›¾¯Úæ¶è<ÎG!¡·–ˆ@ñ»tÚ’²Á½ü$ˆDáã—¢6ÏËvc<8=>» _ëQš©I^Gé¯5ø§m¶u ê¼Ào{Èã_d¢Ìîîâ(Ò™Ëm˜„ÉxÔæªÄÛ×pNcìpð#° :œ&¢‚{ŒD³Ññ‚ÑdE4w‡²A\Ñø‚rQôý©í6(͇HâR]Òqrq˜Î=L¤Â\Ñ丫Ûß“K³ÙÝʹ”Œ4“,%)û¢¿1Úí;5úN}‡NO„ñ× ºlcW$õè¯Ñ…;Œ…D´‡¡ò׎»Íó0 D„³\h¾@§áäÛ0š[ É‘0ÛâXóB_Ý›ºÚ£&®-‚·üÂÉè pó-F_JÑ'Ìñ3qç¯ •îxàH[¿ 5c u?ì T/ ‰ÜOBb›—ƒi6ˆs´gž˜z¼(=b¡ÖãEEp0ÜO*†mU8õ;¼Và‰Püˆð wh5JW3éŠÃ Ÿä³t…hˆºö¼œÅ&øˆ.ošÍ”c‚Îb•ÚRÕmÁÓª Æø‚€Ušâ®º-‹º‚$ËÓ×nú‹äª}B‹”šáÈèâP{ë¶í«f‡"®‹f‡ ‚ÓQƒÜm­Î¬‰£Ñ—ÝâÜÖ~DVƒ]†èAr‰þ=1cÌ7 ®g™ » ¹$.J¼×XÄøó7S»i ”¹4ØA‰ªhqÇi±§!\ÎŘâ’ÓZq’ÇßäG¤)6mSß9/„ÔžEÅÓe¦~»ÇÔ”{/Vݱ¸e?B*E¡:_“‹ \nö>ÞV‹K¦âäæx{¥ãTÒ¸h½ª®Ž£U6Y”Í-ŠA„„CÑ„LÜ“]‰í}¼­Š?E’ï-+={äC½ElJ!Ö‰­·€² -ªÓS“º2›chLC@Ò™èx FOƒ"Ï\á£3ƒ3æ8£É@y§PÄüE²Å©‘ñì{‹$ÿ§LÛÙÕmEU¥æ¹fI}5ꯢYvEœ]rªÚÛá=?ZI›VN ¦‚#“ù h€ä½é tavRñR—Åë[*â‘âd5Åkò—Ãßþ1妌ç CQ<'Ü·aàr`ú2;ñýVMcá øMèéd½ Ç@ÞG”)U—ÂB:/9]cÂdçwƒ¼×J [‹˜ÚD¯Poòô2ù½çƒÀ%íÖG´á_ ü œ!ÝöɱLr¯ ëS×vðÑ>Kn~Žx d”]EýG"\>×khrtpÄ#PM©ÎyÝú§§H”ÅP’;>¤¥ËKÀ§`ÜùävØPQКþò;fC°¾]ÃÌÕQèó îrûõ=„™N]mÍE}mÌaÚ€áñÈÚS×”–q¾l”É¢ÎÝ¡véèsÎξn¸¿«¸É¨c³î·n×"_hd,C³˜#2k´Õî%€¿©¤½w«iÁ¨=اծf×??²«“™¶8EHɱÃ:Œa¬ã¹–}qo‡rí³çïH”¬äöÏž”ñI©» :()sN *Z “È‘ð¤ ï8674|J³1·UÉcÃdÉJzH$WZ,ÁÐEgw<S5ÔÕÕ>¶•i†ªéknÆðĘ‚9§KIwȲ`à?ìŸ[Aß d¶"f:ž ’¥Àê£äB+çÒÿ`86:¦F¤(Á)BGÂj¡Sw,O©-s+“É$FãÝwÑÈ£¥{¥B ©€✠ê[ýÈØ]}gj äU-êéáN¬…Nå–‘ЍüžRÔ™œ“F—íæÉ˜› ‘šÂÏÁ°7à'©Ù9N̸*ØŸ‰3‹Å•7Xì{]ךI!öñËœúfXý9K ’ endstream endobj 1665 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 122 /Widths [ 278 0 355 0 0 0 0 0 333 333 0 0 0 333 278 278 0 0 0 0 0 0 0 0 0 0 278 0 584 0 584 0 0 667 667 722 722 667 0 0 0 278 0 667 556 833 722 778 0 0 722 0 611 0 667 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 ] /Encoding /WinAnsiEncoding /BaseFont /LGMABL+ArialMT /FontDescriptor 1692 0 R >> endobj 1666 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 250 260 552 667 469 833 802 281 354 354 490 0 260 333 260 552 469 396 469 469 469 469 469 469 469 469 260 260 667 667 667 417 0 656 677 677 781 708 615 729 865 396 375 677 635 917 844 792 615 792 698 510 688 760 667 896 688 656 667 365 552 365 583 500 0 479 552 469 552 469 302 542 552 281 260 531 260 844 552 521 552 552 344 417 313 552 458 708 500 469 469 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 490 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /LGMAFJ+Garamond-Bold /FontDescriptor 1694 0 R >> endobj 1667 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 46 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 333 250 ] /Encoding /WinAnsiEncoding /BaseFont /LGMALP+TimesNewRomanPSMT /FontDescriptor 1696 0 R >> endobj 1668 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 1 /Widths [ 460 ] /Encoding 1700 0 R /BaseFont /LGMCIO+Symbol /FontDescriptor 1680 0 R /ToUnicode 1701 0 R >> endobj 1669 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 32 /Widths [ 250 ] /Encoding /WinAnsiEncoding /BaseFont /LGMCJA+TT127o00 /FontDescriptor 1682 0 R >> endobj 1670 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 181 /Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] /Encoding /WinAnsiEncoding /BaseFont /LGMCME+Courier /FontDescriptor 1678 0 R >> endobj 1671 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 181 /Widths [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] /Encoding /WinAnsiEncoding /BaseFont /LGMCPI+Courier-Bold /FontDescriptor 1684 0 R >> endobj 1672 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 122 /Widths [ 250 0 417 0 438 750 0 219 271 271 0 0 219 260 219 500 0 469 469 0 0 0 0 0 0 0 0 0 667 667 667 0 0 760 563 625 729 688 573 0 771 323 0 594 635 823 781 677 531 0 625 500 583 719 802 0 0 0 0 0 0 0 0 500 0 406 406 271 406 292 219 323 417 229 208 521 219 625 427 354 406 427 302 292 250 427 344 531 500 333 417 ] /Encoding /WinAnsiEncoding /BaseFont /LGMDDG+Garamond-Italic /FontDescriptor 1698 0 R >> endobj 1673 0 obj [ /Indexed 2103 0 R 70 1674 0 R ] endobj 1674 0 obj << /Length 228 /Filter /FlateDecode >> stream H‰Õ*ÿÿÿÿÿÇÅÿŽ‹ÿwqÿUQÝ&!º/,uBBÿ½½ÿááÿ§§ÿhhÿ||ÿÙÙÿššÿééÿŒŒÿ²²ÿMMÿððÿØ9ë|™]‚º€‹úPQÐÐÿÇÇÿô½ÌÕÅÀQüðóãMuÿQNêA^ÀÓ)Q¥,ñ§ºïš±÷ÐÚó²ÃûéîçhŠâ1팦öÇÓúáèùÙáö×6?@ņi‘™f3ʰ–ïèआѺ£öñíùöóóíçÛʸä×ÊìãÙ@èÝÒ¸”qÖ®àÑ x©ŠŒ endstream endobj 1675 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 32 /Widths [ 260 ] /Encoding /WinAnsiEncoding /BaseFont /LGMKMF+TT132o00 /FontDescriptor 1686 0 R >> endobj 1676 0 obj << /Type /Font /Subtype /Type1 /FirstChar 1 /LastChar 1 /Widths [ 1070 ] /Encoding 1702 0 R /BaseFont /LGMLGH+TT134o00 /FontDescriptor 1688 0 R >> endobj 1677 0 obj << /Type /Font /Subtype /Type1 /FirstChar 32 /LastChar 32 /Widths [ 248 ] /Encoding /WinAnsiEncoding /BaseFont /LGMLKP+TT136o00 /FontDescriptor 1690 0 R >> endobj 1678 0 obj << /Type /FontDescriptor /Ascent 629 /CapHeight 562 /Descent -157 /Flags 35 /FontBBox [ -28 -250 628 805 ] /FontName /LGMCME+Courier /ItalicAngle 0 /StemV 51 /XHeight 426 /CharSet (/Z/at/slash/P/bracketleft/q/B/T/zero/r/backslash/C/A/one/s/exclam/bracke\ tright/D/two/t/a/quotedbl/G/asciicircum/three/u/quotesingle/x/I/N/H/unde\ rscore/v/four/E/dollar/J/w/F/five/L/percent/y/six/d/M/b/ampersand/z/seve\ n/O/c/braceleft/eight/e/Q/parenleft/bar/R/f/nine/braceright/colon/S/pare\ nright/h/semicolon/i/U/asterisk/V/less/j/g/plus/k/equal/W/comma/K/m/X/gr\ eater/l/hyphen/o/n/Y/question/period/p) /FontFile3 1679 0 R >> endobj 1679 0 obj << /Filter /FlateDecode /Length 6510 /Subtype /Type1C >> stream H‰lUyPùžž¡§‡k8šFèÁ\-¼@ð"jPÁUq¹o.A9äÔõ "qDäX9t9™n@YDT4º“¨›u¡¢ÆòzÍþ°6 [ûW¶ªë«ê×ß÷ê}ïýÞ¯1‘X„a˜™÷zŸu =’Ó5±‘š©;¯ñv?SÌÏ”ð3 ÊM0”f"é51àgšX'£#²‰.œÑb?—•ý‚&¤šA¡gg—k)’`˜,#ÇÙy±“³³³GrJ–&6:&Í~^ø|{·ånŽº9O£Ë4þ~]§qé4.›Æåök"’wEÚoÉJM‹LLµ÷J OÖ¤$kÂÒ"#œìí×$$ØLeNµˆLÔdÑ_]ˆ0‘áb‘á2ÑZ;QŒH¤OÅDKE;1+›‹×ˆÓÅÍâñKñO[‰‹¤JÒk`apÀ 7ÄOàW¤¿“ÖJŸ†Ä¥×ÒAt}_ž&|D¦%ÀÌyƒä]xÍߥVI«'x‡”|Ö…l¨ ±uñaI‰‰‰‰º¶úú&FMÐY&hV@ ¹“÷‹¤¤¶uâפÈ:©…Ò©—©ü8¸"G^Ã/½å{v»0î5§'CEäÖ|þ¬ ÚçžgÎã§Ôµ½4w¿~€>wuïK×)Éx‘š…*‚ m'ªâ+cŽÊÞ~Al*9›.%ÒËý_Æ0ä¶ü!ͽ’o“dõ¹Ú=‘ô*—l¯mÛ*¾‰fÈ*QŸ ¹²„ò2Ñšy1ïÊ!ZÈ#!'oÞþŽ–çõÃÝZ~äûÎrß²ägògþ5~cÉêÐͽ®ù?Õ÷ßaK©¸Ô˜á ç/_®kì¸RÅŸÁ}ÒŠŽ¸ÛnÀí¸ªßà~„rjŸ~Ò¹Tãòêß0¿*9 Üõ6×ƨ¤õA¸~^Û,$§ÑĨ— Ò†ÀæÒrøs¼ÈÄ ê¶„ßËϦ²GÑœ cà„{H!'äл×fE-F惱Áè!2l^æ¸X êX _‹|ÁO…ü¿ ü‘ ~„Qp/X%w`J9J× #ø°T»9 ”ð@Âï€Ý‡¹7Æ  /뢾In ŒO‰KlHj¿Ðr®™‘£Ùϰyg _>±’Rk'±Ï·º3¦¦Åg É 8¨ )‚ëTWÉ÷Ã̘õ™™d)—k¢óÝd% ¿Ê¥žAa°|ŽCÂ8£*¡ ‡l4 ¹¦<¾ÕÚ@e~ ž9x{ψÜ;A6¢”çrPÀªÏò gïèÉ$Ïçòç¨~Ob½ïÞØ`åò-~‹Ñ©ÀÌ÷C~xÿðoÿó~ŠÄKÔêÈ$e9`Ý/ŸvÈH^«»^Ùy¸üÐaE™¶\Ëü©¢¬ô¸’ü0)¡T±›æ„4]Ë`Š+÷׬‘]¯»Ñ6¬èèÈŠ®QVdפÑrm_ÉaoYh¿!áËø j`ÒÍdÿí ž¬Ä¥òÜ>H部>áFà ”fÉw|>8Sÿöm‰®dÈW-Õÿ¤GÂÇ=ûþ³}êîjò]zÞ—á.ôÒ»+À‚³ÑGcJò•h)ï 0X׊ߌhxtUí/P«Q-å¶*ÅO½ðÔ¯ÿsºý»á]ëyn?xõA¹ÐwCš…¾'Ôƒ½/ü{™Æ¸ÐªP’¬^¶ÈyÀLoܪÓ7)÷£ek½5²Â¤¸’¸¢âÃEŠ €é%Ý×'uJ0jøÑ[tTTÎfµ§b±š½Ïõ<Öuì‹­Uj“ª¶—‡Ëä9` s¦¶u?(%¼ Q§³/oÖ5¾)åRë…ÚVUü_L‡§DG¦D¶¿%JDþÂÊC¸"nIåg2°±. ŸWJqúsÿÇvµFEu]aPï½$5ÒÎí kî]@5j¥E!QƒÄ ^_0 B”aðA#>P”j—Jˆ AAä)(èÄ@5,¨ÕªMcšhÚ%ºÏʾ?zWt­{ÿý}¾³¿oïìçÚÍ ¹ a sü‡¸þ;ͧDO´`U Áè«whÁKvg®ÔÊÂK @?À‚ À©ÓA|ÙϽrðI‡F¢ƒ·å O"àqY|I7Q}ùÎòmÇäîäÙ§B¤ÈÈ-› st Ågë ê$Q’0G¤‡d)^äªÐW ®50Ò þˆžÿŒ+«æA5XjÀ¥Æµ¶z°ÆTÁ„šá´ Zõý›Íõò•èÐσ% ›„îè£zXÃ^ôàáéÚkJf5·bjXÆ­:e¨`Ì—û’Þ;ø„‡ÔͤÂ5^ìüâpSRvòˆÝnéï™D,Û,é›e‹9vQ· þ_qvon“Ò’[›°Â žÃ2}Ê–uk3åŒÄÄ?­–Тa<ßÜ’³¡V9‘Y”šb`C3®=íÔ)ÇÑ©ßЭY6×:GBݤo` DÀÛ—ow_]glRÞw€yéB!¥„+_U´LB?o4 ¾÷OáwúOïtÚ&59{‘¾f¾Ià’ƒîx—¦$ïûXÂÜŸN”Ì75ü9¿NyQ2ð jŽ~qöbk¬¼ aV«„aÔôŒ\·'®U©J­˜ïop’¸Š@#q¬üI‰"¢&þHk<`‰Šcñ¬ÿ±j0úCœ jЀc ,Ñ6¨÷4ÓL• á >lº!·Y‚mT§‡ÅÚzµ_3} BÁÑ gÚO8Ó šPòö@¥ÄÕN¨ÈÂþ ñ¬e¨0G éáoU%œ>Ö1gÃð›Ïnt&E7)³˜ÕyB}ôœÏŸÁ1ð„à êÍÍŽKRÓ!Æk#¹¼éH®@3-ºq'Æ¿t0ŒûNp‡úR[(à9º‹C_ge°wt¡á<Ôi;¸^jãÕâZKè»,î Ôé¿]qhÂýÑ Jƒ(1mLÿ$”Õ<=гQÀÑè1“Õ€øø‚̨Á™ò’‰ ا°3¼V:ZÿhåSœ,㱟ÔPK˜6'ÂhþÚu[{RVYX_oP=Òv®ßúGyùºˆÜÅrPÀ8Ú²¢N³¶| µeÔ‘lÇQbI§gˆ®¡e+Úi'œÑweuZ[åë‰!Ýè"ùM_`TÒŒ™KæÄô¾‰.OSåŠN´X­«9£(v̉æÊ¢©¹vcv½"Úw±åÙ¤jû‘²reS—•ž¶=MÚ¾}ßþŠh)Ž/‘23só2ÙR[~a~a[1c\žC¤Â"o'†úáˆ6ˆh/l.­–ûúìR{êÔóJiB~tôž# °ò„Q¯FÅ~2^H&‹®¹èv­àq¼axhü !cóÿ$pü¹è‡¨;涇úéqŽÈýH~RÁ‹oº¸;®L9”qð“tö~"«`nyÌ4n‹.:ÌD<ë"Vn£¥0UO’M%rXå»Ya§ÝV]ò‚¡ûZë×2[réòæ¤jElp™â€öЫrI*Ö,³-—Ð{ÁÄ€Ékæ(â™m÷’À¥¢Gu³eHO7Ì_¸Ú{AøÑº(YLqPq.V×ÕŸÓ,±maÄ3¼ñ³I¶u~¿¤W© ‡­cã1”É—éÔAÐi"Ç; ˆZˆ+‹¾Î˜ú~¨sÔø•€î³’ßOLøô˜EŽ9“Óá0€ó9‹{Ô{Ø(„ìî0Êkë®d;¤Ö.›½V©¯þ¬³Û·˜¼.Ò$¢; V´Ò‡h³x“MÖß A›Õo Ò’0˜&qß´ª_òÌHmÜ]>býoÔÞgAΉPWÊÊt0ŠŸÐ¡@£úƒ`ÒüñMxÁÅóâytCˆ¥Ó¹§£Õf¾ƒAtóÀ±AæMdScû˜“ ]¬ÇXæ·$bHY¢à4 ÆjóTŠBQデ «²øˆ¢ø‚QcTD¥Dð¢NçºbP * "jtÕ”Z®“Óx&[{zŒ©ò/ª†{î½}Îw¾û; 0J?á>„À9îeéìà Þï  ŽÀ&^åÔyœÍ釳íÄgÇxgg2Gðå˺ ´¾åKg» `dñûJš?îºGcœ‘4z˜œn]?ÌZ®Ò(ǽ‹ZE£ë_S×JŒPÀø»d‡j6ìq{©z»«ëÔÓ~pKbݼúX]ÚÐxeèxý,¾¥üÇsÇÅÈk³[é=pãy· êsR n4w>ÕD”È`˜<Æ‹`v!Oµz²@(àË×Ê+—N,‹;2B [¾dš\ÅY*n”7‰•G×f–æ/H3§óÅsfQD”ëÄúO_µ^¯½À$!o$¿žF°N›0Jœ’xêxù®}{KåƒÕögÅÓ5kjä·7ø#Ÿ7þf‡§LȬêÈ0/rw¼ûOŸ¼8G‚½è¥tòBž³4@/^°^çsKj&B/z߃žà&+žÞ£ÆãgÃë×îƒÎ6d”Dϼr¸Ý`ð„Ò~øši)ã–.;m”ˆŸ®ݸ ºú +ç×ÊaÔwJ<_1+~÷4C°Ï'ø7pƧÍGÏ\zï¢ô|>ÓRuÇ“V¯ãtúâ¾afø®(E?4Q&P߆dÍG.ž dóÿ‚Å”Œþa¡>Ø=òáOO®ß}I¿ƒX90LÖ.:†Ñáv¥~¡‰êèySÎnÎØ±Ù bÂì-æÉó÷gØ/˜·ªC )&€;úcŸþ~(á×ÑÆut–W5J!Í„¯t—¶^ºœRÅÀÅšµ@/RQ¢Ã]Ý¥v™6§…nMS°ûú€l¹0oÃÒæ˜þämýÕƒa:´A:ý±ñg¾9ºã¬ €æŒ¶kæTÃ>gÆc ÐNüÛ HÉz^è˜ÆOpt4åhäûÞêî¶°ž’±?46{†GìÙ-åGq_ÛîgwŠÐ붃ªF{ ¦èé(™üÇNôñnêx|¯áô«¤¸ÞIWÂ]Â~²¹vM›Åü•e-¨ÿ4"ev¬”•û.Yd±ØÄמ½|ºQ¼k‰SdÌ tA}þs0ÁÒ¬0á©ð_x 2a<xXë|ðÜ]óňY?´ƒ'¤c, öÿÁ“ áçžM:›x2´é#A?ðàžQ È"q™vwŒu²^ykg¥”¦2Rù:¢±PRåR‚œ¥8î] ÆkL#¬aìþB‡úܓŀ…Z©ökëÜÒŽììMËÅØ¹ æ/”«W¦VÆŠs2f,”…Žº~ŠÍiø•ÅÒZ8ÈÞ{ ²N¼º)øŸ2^ü͵Çö¢cLܱc]Á6ùè—Ræšñ¸ëÔV‰ôZñÈ»ojÕÛÆ uÕkNg”I»—¥—Ä‹a2fÅÊBÛôšÑ‰­oëHk`+¦¦©ê²Xëø*LÆ­Z)‰¹i¼µ1µ¯‰ä§ÃǨ~õŽ°Ï‹ADYƒŸ½€Þ1‡ÏèPÔ¡8éIÇÓ›ðð¯D(MÇ 4¿´ÃÏŒ4x™ªWWçUHBGgrÈñ Ñêü„ù$Ï5ãqZèZµÍå“+XÒc<ž¿‘’£±ûˆˆÀ¡c›_?n¼ Ý w%ꦽŒ•ÁÏZ»´c´‰¨–N†äaá|MFĉ@1hì¼€d9/}uJŠÅ熦²ú³¡þ…‡!Óèü&ޏ î+A½¡[Óè¡ÒÛÂ&ÙÏè­®VáiíÞÂ=ù»õe¹‹¶¥‹ƒ'…(eá:èq‚½Hܽõ†Ñ0‹ªnuGmbÙþ‚ÔbùmvOY‚ªìéšäoª%ÐÛÔù]Øf)l³ßÚY‡õyÛó÷ì17<,©•„6Ær²jäH; ‹JæËgG•Ì 1m\´ÿââ¬osä ñmE· ô£Ӆ¶âòyúÍk6æ˜C°ûê”IÊ·ÕñÒ%ƒXÿ¥ÕºôŽHϹ{{ý×5‘”P»ï.9fÎgbVæË29cßšª*3Ñþ‹ù¤IDz¤%'VOضÜl•…HËö´eª-  …öìtY_ŠrSÛÒoÓÀ{›»Å0Sy ƒ`§A£š`Õ@œÐª¸BË`$Â0 }à ¦4SèHtøC9— ‰eþ`×f¦‘J¥ºÑWtíPÔŽEDE¯];¹¾j$a$ÄÁG0?ƒd¡ÊÔêÉ‚y ‚Nhoĵ1œ¢œÒ¡;Í =€ç¾g§´ëÀ}9áa(¢@£ §/H`F‰›¬¹^4#×3~3p ?†p⿟\· W<ŽBõ€Mc®Ê5LÂ_}1ÎD7ŠÙÔ©–?î馵}%õé&OðQüðíÐÁwšñ¯öG°'-Þábˆ}r˜±ŒÈÓ öÓòÌ!Cž^4ÏrÕ A¼uýÃàï¥VÇ7·­f寷ÔIŒŸ¹.2ÉLýÊÌÂ/ÒÌØ“­ãS¥þfêî ì­ý”VôEi¦t`æ¥|ë:}ÞäºÁ¡óîÐNðó&7ö¹ï}H; L6þÿsY[±ò»¸Ôwö5í«kWÈï ˜ÕËÂ~¤}c§Ôo'ö¨ÛëÁrö‘]ÆQR¿íØ=Sk‚ÚåBØ÷ô›¶xÇÌý«×€´Ÿ³òÊZ9¾Ê¿OxÅüýý ¢:l ï`ÝÇÆW;óÇ…¿µg~´à·k7Û÷†Iºÿ¬ïeG瀉sâ:ÄýãŸeq5 endstream endobj 1680 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ -180 -293 1090 1010 ] /FontName /LGMCIO+Symbol /ItalicAngle 0 /StemV 85 /CharSet (/bullet) /FontFile3 1681 0 R >> endobj 1681 0 obj << /Filter /FlateDecode /Length 251 /Subtype /Type1C >> stream H‰bd`ab`ddäóq÷uöô×®ÌMÊωXüfø!ÃøC–é‡,óq–²> endobj 1683 0 obj << /Filter /FlateDecode /Length 81 /Subtype /Type1C >> stream H‰bd`ad`ddðq÷uörÔ 142Ï70‰)ÿæëV¹ Mÿ»»á ö›‚ÝO„@Ê8áz˜™Ùºù~Lá0¼Ó§ endstream endobj 1684 0 obj << /Type /FontDescriptor /Ascent 626 /CapHeight 562 /Descent -142 /Flags 262179 /FontBBox [ -113 -250 749 801 ] /FontName /LGMCPI+Courier-Bold /ItalicAngle 0 /StemV 106 /XHeight 439 /CharSet (/F/W/L/K/parenleft/t/underscore/M/parenright/u/T/Y/O/A/H/B/k/Z/C/x/quote\ single/o/R/D/comma/percent/n/d/p/S/N/G/E/z/e/U/equal/I/f/r/V/P) /FontFile3 1685 0 R >> endobj 1685 0 obj << /Filter /FlateDecode /Length 3026 /Subtype /Type1C >> stream H‰TU Pgîž¡»Qašî3Ú3WIÈ]Eɲlð$YT@a@@#^$1ˆGE£îŠ#DÁhÔ 4вBDTtÉ–Qé_+±Ð׿M’ýgÄTmÕÔ«þÿúþï½÷½cXÆÃÀ°,ë5iâÔèaÓ—g&'f¾1!=5Áu?^·0z?VïoУîç±É‹Ål/c½—‡nõ’‘Ã-/Ö½¨á”}ìïEE/­—›{CƒÏ¹~Þ’/ñ¬gƪ‚­AA£Ô   ‰éy™ÉK’²mCâÿlHmXÛwÛ‘n;ÚmCÜ6Ô‘¾(Ñ›—•˜–e‹vħgf¤g.ÌNLPm¶ˆÔTÛtg–mzbVbf½íÎÃæÊ£ûûÿRcX†g˜,ãÍ0 à ôd9f$Ç„³Ìx†yËÀÄ0ÌË03Xæ]†™Ã0I 3ŒjŘuL-óˆØÁl ÛafXa¨3ŒéÆ ã·=þæñ±Ç%·Kæù(>?Ï¿Æ  5Â%Ïažžß÷°öÈèQÓÓ¯gBϽ=ï÷šÐ+½×SJ+ØZ;\Æ÷L+˜Zã]FDx¢§KW§¶Œ5>âBô½JGsc‡u¢<'~yÂÜôÃG+9]W‘²X…½Nƒtu¿MÁÝàË/Á ì àƒ\îã%(”MÎ71¦bg ~‘ÆBñ#£ž,; 2 2ß>ø¤ü¼RV÷ɾC ž#øˆÓÐ†Þæ©%hC”— ¡ŽHW€ QTþìˆ+(ã spº¿#VÉœ³>'u†ç]¾íÙ°·ÙÅ,¼«Œº!æGa1Þô_ÒBØÛz„Qß%âŒP=G¿ü2‘fË »Öƒ7äu"“XgëY~ BoCœ27U…õ$˜/oæ`_Å…ªüØ&aß4Ñ"Aú_à5È‰]z=Œ–Nå}µ¨Lõ¥%\UÅÞê“æËóîâO¨íNy¬ ¼Ø½/·Ý±Š:úÀV)f|AŽ‚~ÐúòÍû—¤YÅ®ÃX(M~;ß¡`(˜¢p«i¦u²õniF½é†ÛÌ-_¹àM Ê3ŸvQ! g¯ÔŸ]‘Qk Ô ß¾Pرzö¡öÁ¿ ðN†”cà]ÒrÝJÐeÂvip€²5ÂéAJWài¥$aþÇq<¢ÞtÊcTØÁÃx­ò¬ö RTîÄi‹•œäÄ–0]އ'B»¸nWTjûk¯S9Dí9NÄÇz ‰*zb>‹&‚ø;d«‚ø8z „zÄ^’œ…ê —#WU`()«¾A)í¹VIÄÄßôsð«KœëÕ6§<^…Z‚½ñúüïš þÙvzжÁë°†±§@EzF ¹Ó·ú>\î %´*0Y"xˆúÖaà>¹€{ßá(L³¼3ó_µ‰Ö”ªÕ _›Áöã÷š"v5ÉI;mµX­ÎÊ’ö½eÁ@ôBoŒÁiÐ߆Ҳik·—X!À3Å*„}¢ƒÊx]&ãtù:Áj;*èå&Á"õºS§Bvp }¬;[—ú°ýQÿD&8šª9š8ÃUsÊöRŽ)9A1¬^kÔ[eâ/dŸÈ¬rÔæ–ÏoÈßáüZÁ\µšÇ`´s`o'¸¹»r›ÉXðÎ7”fLütYߣ3*'•Îò|åØ_ƒĨŸ“á3#qõïE°Q}à”ÿ¯À—4+]Ï¢ÎÁªAPÅáõÿ‘wTØ@ùbh}‚UtKuÁ—»±…S]“3“Ï×e®›èžÛ(ÑÏn¢Ý*ÁoÜ à0ª[›OÉPhæa§3»£gñ¦5º°•÷áa§Qÿª$0†Ó@Ãp0Úq.(à÷ÂZa¹´U "ú¡0ýùãûÀ<ü©åH…úÿ™@,MتA& ¡Fï-Õ­>™Z©œ^¹;Ú‚ÿtÍ%•ëAÓÏЃ‡^íÿyjµo‘æefæ®WòÓ’Š’-c ö_v裵¥Ö/V•,]bv•ÇL`$%öÑh»õk2/ ÇvqõÅ5WÌ—ŸY¡”$ÅmYdÁ2õšÛM!‰ó þšJS>[\œÔ7_ƌ٧ ‡‘Ї/kúh‚Õ´šNºæÛ¦#°N‹ì‰xU/‡P©¼ bÕ~eV»ÿÚð]žË¶Fïl4מªëPÄUUkß;l¦ÁR{¶°;%~{¼_ð›»/îxªU¼ûM\û¦¶<Ïl8´2Îü„%Cß[\¶P¹nÇD­RX_r2£Í"^…>O/ƒáÕn8NÀäúù…Òýð\‡³|ÀD{ÔK… zÓ¾1¡;¢$ìC Þ§"?è®ó}Ü#ŒÊž€lAÓ× Ñ\—íX&LÜö×–8ÅqªúÃ:KmõŽ=UÖ¦òmÍf8%˜öåèY„Ý…"£þÐÍU¤Þ°þBÿ1~án¸æ«‡)Î,ŽðM÷v÷«Bȃa®Yyê~•«!úC)ÍàçIpŒ£1ä©_ñMôíM8h¸vþ;‹;oßÏaå&²VŠ-"Ño¹™Vª Â`ëc¹z×é/¶@îähÓy«p›`/ðÄKt]ï|Õô·4(¦b”ʰڎpôáÜ¿c1]_XHýÒvL¸ù,[¤ÿdÔú_‹åSUÆñÐÎ9…yßÁ=ã\rnm(‡5[¡\~Œ.,±!&sBÂ!§˜ÜZ`:÷‚ñCP~xEÒ»¥@cÌ"µ ‹q)#G®óJlèZ{ÎöðGÏÉþ}Ï»÷xÐJ ü‹?äw9x)ʱïå½3‚c[JE²‚A%?\;a3Öˆ®/Ý}VY;‡2‘WâQàß1bçÿèœR#¡@ÆâxûD÷¸2vǹ㒩pë zm¥òuR®ßè7–dÆ…úŽ:‡’“{ìP±-·ìdV–õÀ†˜toÐŒpŽÙà†l³û¤¯ÝSCÞêcƒê¯qNž°F÷AæÀçDô“„y·íÓyWá%=ŒO86hÄÛàh'¦l!¯ˆƒT‰¼´ëzÉ`ᵂð M4_sq»nyJs¢Sd?ÓÐÂ~‰y{ª¯8=ê cwËJfÆÇåy6æïÅDít%˜äާ;/ݼõcÓåþG w$jfŸ › =?ÁtÊd6Á*L¢µ…Ù1ã!z;éXëO𦪹娸½ñÛ#/ÁЇS£ Ø›”®†àV>«C3·s ’º½H¶W!³D<«/jgæÑ’}*[ìÃbU2Ñr‚ãZ’›³}äC¿a ƒlcbNɱ[2’sÖuÃóôÇçÚoLßÛý†úÒTÂÎ|Æ=˜—ÙÀ…ãmÇ[UOMé@ª’šž“Ÿec¾IÜ£Ñ>æŠÔ Ç4Ø(±þ¯ú/ÓØØ~±±SñÔWTg®!ÐBÜ{2úV®Ò…ª¢×rÒ”¤C7mLèÇ×0ü]mwIñ´rrÆß{ù®JT·›±X–þ„ý:;bL†òxl6ŒÊ‹{$Gqaiºwò».ô`<¡b«´¯þЙ£ê;]3åÊmïyÏ€qHÏ’²œ'™ìá9(Á|p2?ar6”ÇIT«Àü¢@\¢µ‰ïg¼7&´s<¬ý&²öˆ€&lÒÀÉËDÿÌl¢PþL"n=à4u¡ðvL,¦JÐÝÂýåu¸YŸ†·$ìÄ‹æä‚FM¡×Àj–k¬4|2*"ëhÂQVŠ!Ÿ6¾&Œjè¦ÓçDhøb9Ã%}Òbøšq} Ìw`Jm |vöIír¿{âÁ®BŒÅ—ÿ%°¬Ž endstream endobj 1686 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 32 /FontBBox [ 0 0 0 0 ] /FontName /LGMKMF+TT132o00 /ItalicAngle 0 /StemV 0 /CharSet (/space) /FontFile3 1687 0 R >> endobj 1687 0 obj << /Filter /FlateDecode /Length 81 /Subtype /Type1C >> stream H‰bd`ad`ddðq÷õöuÓ 146Ê70‰)ÿæëV¹ Mÿ»»á ö›‚ÝO„@Ê8áz˜™Ùºù~¬ä0ÀjÄ endstream endobj 1688 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 4 /FontBBox [ 0 0 990 730 ] /FontName /LGMLGH+TT134o00 /ItalicAngle 0 /StemV 0 /CharSet (/barb4right) /FontFile3 1689 0 R >> endobj 1689 0 obj << /Filter /FlateDecode /Length 143 /Subtype /Type1C >> stream H‰bd`ad`ddðq÷õq÷Ð 146É70‰iýáëî–a#ÃzUnƒGSãÿîn8ƒ‡ý5ÿ;ÁîïZB LŒŒÜÂI‰EI&E™é%pSÛA’ÌzÝ|2ý@£~Ö‹þ-úÙÀúg Ûö²þ»õGò×-¶? ö5l?‹~Ö³òsÂ4- endstream endobj 1690 0 obj << /Type /FontDescriptor /Ascent 0 /CapHeight 0 /Descent 0 /Flags 32 /FontBBox [ 0 0 0 0 ] /FontName /LGMLKP+TT136o00 /ItalicAngle 0 /StemV 0 /CharSet (/space) /FontFile3 1691 0 R >> endobj 1691 0 obj << /Filter /FlateDecode /Length 81 /Subtype /Type1C >> stream H‰bd`ad`ddðq÷õñÐ 146Ë70‰)ÿæëV¹ Mÿ»»á ö›‚ÝO„@Ê8áz˜™Ùºù~Là0Ä3¼ endstream endobj 1692 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2000 1006 ] /FontName /LGMABL+ArialMT /ItalicAngle 0 /StemV 0 /FontFile2 1693 0 R >> endobj 1693 0 obj << /Filter /FlateDecode /Length 21070 /Length1 39816 >> stream H‰\T xTÕþçœswC^’lPîrI„<‚È+ d’º¡ Ù¤UÙÛÙ)ôÎwï™3gÿ™3 aX ‰œqãû&V¹g¯°ÙEžª‰fãX`³èí¢ùsõMñ§æóÚ€­ß´ªÒŠ5ù €=”噥3j¦u[÷q&| QVâ)nÛ·žýåðž'ÊXÑy@g‹ֲܫ¬bnuøãî4–_½gTyèôÍl`Á–+<ÕU!£B† l¯ÏôT”tŒÚXÔŸä|«*çÌå¼ù©7ýëU³Kªò|G¯rü`K;ˆh~ÚND«8DÖe~¯øÿ¾rëŠÝÿßðî–»/Јw¨ïàOxŸnð®wqÍ8†Hd` j±u°ak~<&õ(ÚjF_lã|¶¡•mŸÆBD7в®b–ÉOx×2Fº'F •XMc­y˜Œój)a,f¢Š[nkµÞz;p@³n#1µZßig¬/Ä;6¢çi}‡}Hã(‹ÙòUÌFƒœ¢È*µ~à œxŽsPÈB+ ì½—)Šje:{Ùn™ÖQ¶êŽ)(CÒ@%œÚd+ËjE7ŽQÍ^ë±û™ZpŸS¨vÃzúh$âI®§mtDún/ñ gÄ4F©†ðJ%þˆq’ zOTj¡Z²–¦=o}Š.艜íNÞùº%2-’©Lk$—u~´ñ!.’ƒúÒ8zJô•b«œ ŽØŸ©åŒ÷fö~Žh¿ír»Ú­~´=ì»`…ó‰ÄqÛ¾Š÷(Œ+Õi½H§éK‘.¦ŠWÄ%¹AíR§ì®úT`5vãu¦Á”K¿¢2ª¥:ZGõÔJ'éŠ!&ˆgÅuY&gÉÃj$Óx5G-Õ–k+mW|nßQß_|·¬dk9r¹–pö±•+;€vœe:K¤Q…3é䤉ôÓBZM¿¥FÚEÍå$]¢«ô/ºI? 0ÙDŒpŠžL†˜-žÄÑÎtR|+þ##eO™ Ê™/+9«:¹–iŸ¼¨ª]YŒs²¶I{MkÔvkïk7l¡öƒtâ§í·ãoŸóÁ·Â·É·××l]DW>C£Ð)œ½‡i:Ÿ÷&î¸wñ …2vЧTËÈL¥é4‹ªÉ—¨vrßC‡¥Ïè:ç&ºr~L #Å8¦gD‰˜%ÖŠõ¢Yœ?H» ‘eW/GÉ)²DΕ5r“4å ùwyI~/b²T°ê¡zª8• F©©jžÚª.«ËÚdí¸öµ-ØVa[nk±ýÓþ„=ÕžcϵO±¿lßoÿ4¨€»óìÃïqßCäé’û°F PÑ¢M´q?OE±ÌÜ©¢‘VˆÔ,ziÕ¶abeㆊc¬?¯‰ïÅ0™Ech<¦‹þw¼Ùº¨·ø—¢>À5uˆkkcÏÕ¶PZ(®ÛB±— †pÌe?• ãsyžìjþ¦‚)’®‰2‡»à°JÕÜpÊ-Ø#gÑì.žN?­â>Φ·x.L dú·´ E6wÑ ù%–âYq×ø¯Ào¨X•b P-.ãM¾}´™¶x[Wú³(W^ñ5C¨]\ÝêERë‚—hŠl°]g1í*çäÛœ}»Ø#³Ô -Êø,Àr̲– Fs«ST IO!V]àéV+“•“ÿ‹xªLæ™¶Ÿo÷Až#dk¢¸sÆr_Lä ÑÀ´™ç„â*ç;þ4O±64Û&ˆ”jáÄSPÇ}y˜d½‰z«3­õHâyPgÕ²ÇF|—ÑHË|/  ðÍ9GcµLÑ®eZIÂ+ΊñbÓƒçËhÇR¾aÚÃBªöxÕgáÖ*ë¯ÜݽyÂÖ£¿ÄW\åwa´<‚¾lÑdeÊ*®÷–”˜ß§÷£q±½ŒžN½Ç#wqDGEvëÚå¡Î":†‡…†w²Û4%!Ñedèf\©âŒÑ£“ü²áa…ç>E©³*óAS/˜éZ¦±å´ÿ³L»c™vÏ’"ô¤$%ê.C7[3 ½…&庙_aäëæµŸà×ø0æNÞ »¢Ê2t“ t—™9¿Ìë*È`wM!ÁéFzIpR"š‚C˜ aÎŒ4ªš(2•Œˆt m ã¤L‡‘á2£ ¦ŒuyŠÍœ\·+#ÆéÌOJ4)½È(4aŒ4;&LcÚÒM{ Œ^î¯+õ¦Ä#ÞU-(,H-6Š=“ݦôäûctJà¸fäó_EýOdçÓÝu÷¯ÆH¯+ª\÷‹^on¾žë¾Õéÿæç³Þ+b3 ¼™zƒ8f¼ÎÑIJ|·IË8¤î¯Ä_ÕúJ —_S0]7;#2ïô>‡×D^s¯Ã‘vÀº‡K÷NpNsxŒ‘ïÉèÞÔÞ¼šßE§éÑ®$%6EtºlSxÇ»LhØýLɽµ0÷scòî!KþŒŒ'¹!L½HçLÜ×4Øÿ) oÑ`6ã'Ÿx—YÌ'RnvH/ðF õëýûM-6Âн7Á`\ûöAç®Æq~Öß'÷Z×æÍ„3>Þß"öt>SÎ15 LJœß" £*BçÇÆÖ“?´/ÃïtúxeK Y0çºïÈ: cöâ¿ÜW}PT×?ï½ûÞ®Fë*®2FøEQ?¨Ñ"Täk!¶âGSbcC“¦×!®ÐiÓê5¨©ì¸Ò“6èLBM'qš)¦mìG>˜iB§M2&Häõwî{oÝ}8Á¦í?eöÇïžs¿Î=÷œ{ï ,œWQ+¹¦×©ñ—pMÈ©‰v¯LA$w?eýï¬èo‚oJBÎŽ¬ˆ2åSª¿bÕ¥V“r•¶o Šã$«~Y´Î.E²ƒZ¢j—ÔDMÖ"(7E³3ñ3dPoïòx•R£$åF|•yÖÿò±ÉÉ7Ø©Ë|{IºÖÍ63’5/^þBœgÞ¸°ƒq W„ÃcãêjÖ„ëlBÄSq09);B%ÈÌ™øu™½Ë剑\–Í –Êã&Úårüqt¦ÍÏÅAç¦$å†+Ã[ºÌÐÖ”$_J¸[=§ž ïÊ©t§Ëì9Ém(‡¯v(YH •Vw¤(õ…¥¾¨"ØíÃw@}qðŒª¨Ù•«Ë;RQìN" H­ÊZV²Ä(XäÕ+Û'vãk$$k…THy[—BRçut mëR-ÏѩРK:þã3&»8=2%ËÓø*×ÓÊá ”í£+§‡gù¤&ö϶Šß6"êkôeQM~`g:}K/¥ RGjífhÓ) NÑhÛùp÷EûàÏÀ  ˜fëÖ[€"–Ѷ›ûbŒ]<ŽäjªðΠûõRó*æ;¤÷Ñ=À1”[Å[tÒXN;!G¿çñ±¸”Û Ï!£š ?ŠúmÐ!· ¼ ýÒíòO#¾ÕÀ€ý\ŒsÀ^ïlí,-ÕæXK9ÆÌj1Ç]à\ mÀ«:¥ê•>³õ`ªÁüu¬ÖØœ‡qö¡~ú¥B®Ayì0À€d`ŽzŠ–«“é9ðB¬¿ÌZ7ÐG;xÍÑ5Á~Û¦‘°l,ˆæü¢.7Àcbls£Æ…uZ…ÀU@"P¨¾L;ÅI¿žÐHcx‰ØOnÛidvét˜e`½DµyU¥fí2-CÝwŒCXÇvø/_õ#Z¨þÒŒ™´ñµãïŽaÌ¿ÊxØNŘ8C Ȫ0×??±o ïžnÄ\Ÿx9†Û¨X‹} ÷±=˜!ûœ÷])^޶o£Í&ôŸ—ÀÚ9&¹÷ÇX3í8l½ÆÔŠ6ðë_Àð³ dœÙ@Ý‹g*`ÓÀÐ TYÀ³ÀÌM˜W“ñŠ˜áØ”ñØÐûàCØ&cÖZÃ1¹ŸVδØcñ<ÉÆ)ª²‘Ìcr¾pÌ–glÎ)އe|WqÜ+ïó:9¦¢ŒÜƒ´–m9ˆØr˜ó6s>RK¨|q\Ã1Ëö9Ì~áX“>ANؼ"f­é2GÀQŠë5;¾ˆò:Ž1+­8Sš)O|oïïÓVñ­ÑæÒ=:¬m#ê môâ]޽¼ò.nbxú•{õ^¬³þì§'áÓoˆ~õVѯèz»ùŽNÊy½]}T–G°J¯UÇ̈­ûwõŸêE½gf»ù®ÞošXÏ㜞A%Hrú3@¸Í;OiòV)]žòD—ûE€²ô-½Ø?Îyäô%úô¼ÖHûE¿ù{%D!µŸj=~Ú‚ï§ <—z‘j<>xWLÅÅœ;–vâÕÍ|æÛ15l ÿ^±ñ¶€G?V¬9–òù,ïœÑ@­¯æ•h|ž§§ÀœøtÅi•+>ǹãÒÍònÁùîä)ìØï¬ŸÏG>ãøŒäsŽÏ§½›cú‡Õ6Ä1ŸÃ/S…×·ÚȇoÚ¹sû]fšF®yÂè4Oj“Ì“Æb”èæ ¬ûáè4‡íût®s—ZzºÉ¹Gõ ÚiŸgÇåyóýPÞ£¥Ò¾1ÆiÚ£aßqJ{›í„?aw•¨„ÏSÖ1U«C>BlbŸÈ½ º™ï¾µƒð3ßET£½Ž÷÷Í ‰ò¾XEe°ý¼ÔáNef^F­Æ -%8k{i;﯃íá½÷>Hã½~œý´Hümü4횥tBÆ÷­"b_x¶‘1»mx¼Ù'@“l—¾ýñáøb_`LÃOå{b~¤—Pr¨Å¢£9ç§“ã)ô+a[Ðoš¼¯ÒÝȯzœMõ8sHÆ…9¤µc=ã\´|ÔN7ë!ø°J®}°ÎØ:έfqŒqó{â …Å<Ê1ª¨ºFç$æ=ÝcÈßtäî~ôŸaŸÛ„¹÷CÏ}Wñ[†ßœ/ž%!ù i¿S0¿öµhùT8¾Ã{~ØGi¸/ÄÞ-À" R~ÔFƒ©óY¬$k>zDê3èUµM» qËwh·ØK_¥´X[DSÅDJ¿A®~LG´ ´Y¼DGD5°,hކWºÖ‰·%ë/Ð]¬W_…ÜDbú×Ó×ÅfªÖ:{¿¥±âì5úéßEœ¤¢ÿ׆òUh¥È­Z”?6Oq;9G§YÆy”&ûÅ@ÚêÀe³Z¿åcOa/—ãì…­Q;¯cŸ\'‹~ÜF¡Dæ%`¦ÅÃ…j#µÍê([[OßVNš=ÊQÊU€£6~Fy’;€BÜñ™Ên`Ȥg½(Ïÿ8mÉx»eÒëÀ>Œ}ü40ÔÕ´„ºc@ðk§.<×õô±ÐÍž8ùÜ5€rk¸_'çÜ‹wy&p»ÙÃ@,æ3Œ=4ÙóMÖfC ú¹d=ùô ¥ŽfÏhP.Pºô¡…@ìýO¹\Šá$fûnøìû,Àþî¾$ýûwò[1DŸS.š—À¥ÊEòi"Èi:ûý¤ÞµˆÒÈü§[ï–Ýû:š¬>M›cáÄA4§• ± í·ì=O+Æ ¨{a¤,NŒ‚ ºM;Ì6!g”;i6CM…­Ó¸rˆÊpFÜVöOk2wµßk@´>“r1~]Â~Õ[õÎþ8ûâÞØ¯Ð:ð,ðrp8ßáh|ÛçE\ÌZñ•ù,pµ¹–×rãß5×óÿ È—€>àÅÿõ\ !V`\Â;dÞ‘ýxŸÜM5DWq–|²ø ΡbðkÐáöž ŒGy"t_?I4ô!Ê@ßoÁTE"5ÛïÊ©ÐýÜîëµÇ+²úýŠèÊeà´Õ¨ ¸å÷GPþ#ø,¸ íßE¿ÇÀç¬ú«›!?<yò}@åïýàù@0 ý1ø=2â;ô¿Î×ÿþ¸QÆ›eìœîïvCÜ0;û9 »¿5œýuû[b$[~À7Ó›x÷Eb¿}>íÇaìçp,þÅzÕÆ6uásÎuìë„àB’Ç×NbSb Á„…€¯ƒ½@­.‹³”„H :Aå„HÓ—ihC-1‰mLjš¶iê½fN¨”LÙº5+P­Œi´PÚíÇúƒªÒ‚Fðžsl Œn¾~Þó>÷œããsÏû^ÃÆÔ$jÊY¼Žæµ,¯ŸEý˜ÑâýMÔ±—9Yù˜yýÊkg^¿Bóþ`ÌóÙˆyuŠyeòÆýg+ýŒ¼XâŒÞÎm6?u¹É‚3õ&jÍŸsˆÜÆó€}^Ä/¦F8ú,üè›Ùœ–=[:cgÈiÿoÿIsä—È©þ :¦áqíY,Ï`-Çô\ü¤˜)wé\þ˜}žþ_ýlžÏb¦ºô¡:`¦þžÔŸ^w<±?­.ÉúÓñP|úÞËÖ3óȼ)L{îžüÝÂðú½Ú?;‡éÏñÔó–}GØOÂ÷çÀ3™z çEP G¥Ž¡mŸ|‡øåÓÄÿuyóî5èí<ÝOÂ>OMÂÿ|«á¬à¶f°}¦ý<}ßòú\Ô‡X3qåó'•@`€oeÿkþ‰±ÿÎuù{®¡-uÓp˜VΨ—‘Óð-ð--–`©TH&€ ²h:€> 0K¦e7°®‹ˆ*Æ-U“P/ •Øù‚_¸[ÒnûóÂM|=šÖÏ­KëÐÚ4mEš¶¤:ݼ¸!­ç/Lk»Ç¯q›ï H䀑=”ý'?% 9)Í%:À$c¦E•ì‰r¯¿D2*1‰’íDIJ4žoósYŠM;rþ'ìZ:®%fÛüýÁgÙGä5`ØG¸>dâë*j7+dèF€óÀ`dWq}€ë »B,ì2©@ÐŒ€‰]†´²÷ùû¦ÜŒ½ieïág½ia—`]b—0µwã5µþ!aø*3†âÉ…ÅÃ^àO²¿Äo/P’ì —O9¬bˆ0 v_ . èöFXa]$p8 è€÷àÍp±qàmà"©T Ù;q “dçãÞ%XÀα?’B,êYö'¡ßfo ýgö¡ß‚vB³7ãN…ó'¸Ç m…®D<‡ý.QnWRAÁò(•@h:€>ÀÈFXi|»bG'gÈ8Š\…ÅÉÇBÿ‚œ’‰ºSQ½«±Ç\\xW¬„Ñïê÷2Õ{ü§p¹ð9‹ ï÷_†Å…÷Û`qá}a/,.¼ÛwÂâÂÛÖ‹ oS ,ˆ${å·å󕚦]Ô´°^¬R/V©«ÔK ¬—_ä¶ÏígñŠ ¬Ø Õ· Bц©öÕÖSíÕº¨¶j¨VOµÍTóQÍA5'ÕTª¡Ë±Uó€[«Qmœj§©£š—jª•SÍEkÔ$sÇ×.*,T"ÈŸ+è•«üÌÑuc[»ñØ@žRÂSAr•¦ÉO;¹.MTÒþâþÝÁ5l 7Žáo#üAcØFcèd X @0 L)Àv)&Þ'¤²À~`0ŠéLŒìÎLñ51±Ê̤›¸ÇÆp•âr3·ZbuX}Ö5RŸƒZœ´É™r²RP@±Ûd[’æ~‘ë‹|bšÙÖGJðGÍè¾øí%I÷žQ‚sé‰Ó€]Gk‰—z —“˜ð—‡Ìu5q°W¡ýqÇ&Üf‰{*Ãt6¿kP¹íø§ò±#É`þËqFù›+i qå¯hyuP¹à8¤¼U™”Ñò†7I¡†]‚:äX®œÔœˆ+û¸T¾ëhTv9D +؃§Z”õÞ6e ú 9¶*j }*Çf¥>ÍZÆïTª0_Ú¬Àd8Ä eNÑáÆš$Ý¡.47µššL_1ùM Mn“b*1›æÈvÙ*Ï–gɹ²,eƒÌd"ÏI¦®ª>‚¿nŽÑÊù Ä l+ãBœkTfäY¢?%EXdCè£ÛHd«Kÿ|CY’æ®kÓsʨnHKƒ¾ÜIšRëõ_D75£u€Ò#Q´êì‡IJZZ“4Å›ëöÕ­C„RÛÁÃÅ\?sðp4JŠ öŠöU¶Ú¯†!:3ÒwïSô€]¢lhÕ]ÕýÜH•D#ú6¸Ú[‡è§ôz84Dopm’VÑOÃëy»´*F’t“à½vÌ Á“ÄÅyÄ%;Ó¼iž÷ƒWÎxf3ñžÇl<å¼Xy84P^.8….œX¡ë~θGp 42.8ãçè«ÅáÅé:8ÅAç ʦ{”Ê åÐåI¢÷8Ž4'ÿj–“ßûéjðùh¢.º­=ÜUî, wúK{wéÚV—k`[”\ºäíܺm×[ºôhYWHßVr Ôµ?"ÜÎÃue¡ÒnihW»Bñ:µ.\¶%M46W×<0Ö¡©±ª›ÑY3﬚ÕXóˆp 7ò±jøX5|¬FµQŒEÄonICtu{Z'X^.ökg±;ÚP`ݳJlÞ:wѾâa$¿"y¾¨>«¬AÏxhQpQ‡ðLñÐl4[2¡¢}uîbTë™Ͷ²âëî‰õ¢ð7Céo 4u÷ðOK_ìqĺº%ë&$¢Wlˆèum­&Z;ùOÒWdÛòòÂÉÔhºq1WðFIš"ò¶zÞf6gˆÿÿ=½š?;“ ª“v“XTÒ‘†£ ¥ ¿µ½­uåO±(~`Œúh,Û‡˜6IÛ„ÿÞ,º{2Vfº3:}n‰e—cêÃW‰ŸS8¯rp!¹˜qÛÜ6Î4rÇ%ÞQsÈ¿‰Ë0 &Ù,%XoÎ0Èy¤geÿ­D©§:'™º¥–zTçsM9™"'ǘ÷‰Y–%‰“\Ÿk1kffƺ¨só-Õæ+T2Ô3ªæÛªéÓ³^üe‘ïkÖÏ|õÏMÖ['}Ï×OÖ“@½×d=µÙkk9–TQŸï)iÙÒ¹ÒR!úÏ.º¼äl•” …ׯßý8-ùáû»ëXgλÄJVª¹ó-8™íÿ!½Úc£8Îø<÷u{w{ç»óùàÎk gcCü8c0œëh@%=äP±Ë‘¤ˆG“ÒH¨ jc7 D„Siˆ †6 Ô 6•m\ñ¨Õª".iª€H[ )¨8Br(Øë~³gÔõVÝÛïÛÙ¹™o~óû¾oFV £ ':Ð.ÒòÉ»<‹5¨I)Ýïûñ¦p©1Ⱦ. Ã¥qœøª&WONH2ü‚Æ·ý6ÕØÛ²¶¨¶°—ÚOôâ»Øsóã¡û4lÜ~ìv¾mþÛøK,½˜DÕ Œüª°@ÛE1ÈN8T,òt ßê4 2”»^¯£\ît»å†åÕ42ÏëÉ÷Ï~ÿˆbé²3§ùªŠâðK„rCAƒ µVcj‹Öµô6¦ÎØOàKøÏ½ÝÛ76~xèã›öç¶V>Š»È³d¬û+¯‰4Q’Â)Bp!"Þ òXÓbm.§«¨,•©(G+a°IÁGÉxÜuô¨ÀºŠ ¨zg…Ii$ùz½„"ÖßÛØî9v§Á^è"K×Óßßï$ÉáOI àDÑ׺¾p$PCº†/Xf æMŠ ÝE©e Âh D¥H£×¹øíƒÁYÇ:è9iÜÉY,6ðGJÓß3ú&¥¥AœÀx_«ýd¿q/ ø ”ÅëYÜaúËdI²J¤$£I,1°¼ Õ!"Vp·âX}'½z®ƒþ:,Ì܃§&Aúû߃É`Ô„>aÓ˜Øà5ZúfÚÌ åU?F¡’’Æ#Ä’zp=x\½Dí¸Ýd$¢°$¾(/ht`Jff(¯,’ÊÀŽÙÁsadØã ÆÁ&zzЦ„´ìÅ;:ì>ûdzØ‚f²™F0•9€?ƒÜžµ@jò'%QLŽùˆWÓ0~2•&ü 0ž$n6mpŃÃô4i±ŸéÀu8Ùa/Œ‡‡ š4@Œ‘/û9öxݰ¨ŸwŽ(wÝ’PîX º.ÍSuQr§,3ÊeÊrõiã5Újü†ÿJ:aÜ2\ oÀóI½±Üuȸ­ßvßö¨Lgnæ¡.MåŒén"ɲº"é2ðJD$¯®“yÈ”õ|"”Šº ¨£&Óð/5ƹ“¨ÔEš,)úu‹`Bz° öU.˯›h‰LçÔ³3ì"£­ 3Ø;Z®zý„|Q§­:ÖÅ»á•ÏÈä%¹Y&òVïÙsYÖäÁw ‹ä™ ×%#™ºËI#·ài)ðtÃ#aGfc\MÍ£¯ÏÓ×·g%ÐøñC.È,1È,ÌK¹gø–»SàjÀ«V¦³‘¼˜^H hNI2%‰ß‘'ÿÔ>ôöîóøooÍ3:Á{îÍÀ½ö—I#ÞÞý7^Ñ~;xÐuX)JpN7b°&3].ic3 ç.-\­¾¢Jߌ¼È›ÔÕ®—ùË.©(¤ÒpQI,UÕ¬¤düx4:Üòc1RÂqIñLê¾j%D@“ü"šI’@^RDï’³ÖR@ð@š;.®ÿÐ5ÑN¼ŠVzdB4f:¾aŠï°¦N„tÑ”{Î"gI(·,Mô‹Ò¥Ó Ê$’Êlç%•¹3’þDÈJŠÇ_S™'YSæ‰;LÇiè"á+¨ …‚I¥‡â‚ÊÉÕÕ“ªâñBÈ‘•“¿D²úvß{zõÒe¯n^Ð|r“½×¶L™õøŒì´ÿ€W,ŠOoœ:wÛ&ûïiè^²èÝDQoó²ÃOWÐ9¾ÐÒÔWž¿MÖ§<7cÎÚ áÇK‡?åk *FÑï.&ÏF î¾Ö)0ù]³žš‰*Ý‹Áã_ˆ6£W¢­ho§ï¸»i§û×îÐåèí¨Ïãú¢QZ"ûJF›ù3Ýó ‚óó–óç¢ßõ¿îßAßòì½ÿ”ìõ}äÉA1F„‰|¤¸‹l=±¸Æð"ÌFåÄt:*ÆT#î…â&Æ8’Ÿ7¬èÂ%/¶xa6‹§S"~AyG„ûºŒ/7›¸Óé•h)^…s%V8f,盨d¹2à7F"Á€?”¨¬f§jí_^ÉØçÞ>ˆ§Ÿú#ž0íxâÔÖ}Y¸âêúŸ|BHÅg÷OâoxÏ;|éôĶî±?Ûr̾¾±WÄ÷{Ñ^ÀîŠUfæãéJ–>#æE ˜¬â|KGuH¥j‚QjØ©q¨ç„¤H~Ôø¯©÷ÅêÝ}@½ØÃÔÑÓÿ¤\EùôµV5%ÃÉ’ÃÙ’IyáH˜H. ü@£R0儨4Šæ`¿а2º‡4_ìþϸZpZ04r¾? ÀÏq•ÕY‚+wâ¿·7~¿á…Õ³×méÕ>Œk¶¼SñXêÍoÍ>`¿Ï{‚ѯ~Ã>Ó÷žmï{¦ò@uÅc×ß½úEI f½"Ã5ÀÑ…¶YA‰ÇE–eHM¹" vD •<—Î25ÓM´ˆ›©ÿ‡»êÓ¾ž%Ðh)ÇaÓ©;—KöSØCø ‚#Ï6vp'-üˆ¾Â{Øuûm÷áEÇ¡h9PôþQL$b°¹cJm•#UY9±<+‹ÇgeḬŒÆ²2q¤Uâ6ªLÞÊrJMH0›Q:„X²P=ºˆn!î7¡²Q§¹Ë™pxˆ€¸ùˆËÈf'Ç«÷°³ ÿB8i†”nX¹*9”~°]‡]q˜zÂwü”ç0Gˆà|ŽX'l[1:fr¢N-Ò&IÕÚLm]OÏQyvžžB r;4/æ›ØFþ3öW…k Obg™Ø™_²TA5E C¯ñ‹ÚxWF$2êÈþ¨¿`ÕæÁ˜ãÆÕ*j^^­»)MU4N3¹àÞS– Kš†8a˜È.)%.Ø‘t‘©–·œã6~ˆŸà—8ã³Qç*—± õLå.²ÞÒ]æÿJ¬0^-°Q\WtޛϾÙù¯×Þ¯í]{mÖ^ƒ½`†Xñ¤Ii€PZ †®p%*•h!UTB¸¨á“F QT EU“Ц`0–Q[ E %¥D4¤†6‰\š¤¢u‰•’Ø^÷Þ7»` UéÚóæÌÌî̼ûî=÷œ[wk[r)¶7§AÑ¡ªCÑ…F£« 7H-lÊ&6eº²,Cë‚…œ€ŒòÚ¢Þ }ðëü`|Pw0^ã^€b›NžÙ¦WmÈ™’UëåXvž£ÖAÜZb®„[]Â…¤ùËPÀ*WÁ°j!—Õ…]É »æÓ +ÝYÞ­oL¶Êâ—aÀj5ÊDOCy‹². ÄzeÀ³8q¼ü&gi‚Xõx†À$(åðóÛ ç2Ñ ¹ÎÝP—?™ÂÝÜËùé˜ðv Ôbaš`ÒV}·~B©/Õ—Zb“Ô`´˜kÅõÒVc›¹Ç`•™k,4WÒåâC­0¾dÒCâÀ6 ¾PBÔ2Í6™BµS¦F›Ì2ýQëQâœfL jÀ‡¦iã:õ…úC44BƒÌ?)§Ø0™ïu5˜òôÑF`’&Ñà ®ZˆÖf›ØÃ´çLJî“ûe X:0èÜœ­=QèŠBžq 8~ç`¬ªÂ`Ïú3ÃÕ÷ž\|ÃLÍ]‘ýAŸ™„¼Fæ ר˭õ,¯~cæö 3ˆg¡ˆñð¡´k¶¤]c`§k¶wrxz.œ[*×^PéP£Àæ½þ¤*²°“¤z‡Ôç ÉõmU±d‘Ï{^+®•G&o½ððª—ũϗHoM.Þ›Äb< L_ •¢’'B¶˜`EežEõ*ð3¨ ӈ؜T€Ý2E¦J”ª&‰)E‘Ë}HÆtå Jö+ $Œçé\Hi$¥­Òú´ÍZ¿&k :º€3àa_À ~Õ RI§Þ«Š‚÷Íjr¹BÉLomÐÕyÊ‚ "èƒ$¾Be¢gÞ;üÊR0œLQÁœbÞ¦?:´Äe^»Ûݰ+ÊØ¡ÀvâÙz=­Þ ˜aØ*ðxb¨`µ«V"¼}âÝ’Y¥KØA€Æ`í¿)Ò‘7§Š°`ß—vÂbõOö£}ÔûuùÁÂoUÜ"a;ND I²¥°ÑÒ±Èù†)F"ÑMU{ÎÊŠ•/¾V^«®±W;*ÖE6D{âk?Œ¢v¬FC5šZÙ˜ Z\„@YMç| àcÎ&8!pYÒœzâýÕ¤ÚjÄ5TfQG,YÖí¾p/”™{…¯ÞÑnñ^a év e&Wï¶ÐÑ.8y â]xœì% ß"K~yª8ô»KÅ‘ó¤úêŸIbûG/ü±x•^ ›ÈOÎþî_‹?=}ž¬ûmñ?ÅK$OƒD{±ø7ˆÙQÈn0GBT¨#S^:¤™$´0¹®öI¶©LçL>ø˜eæS6p¦ô2ÐÊ 4<óÁ`(ž‡ýø`Ýœ¼ƒÇÕsòvio•öpýÚ`u£¾o—öxÝ[  Á\–\–úšöä¦äSê6s»õLp¯õ’q̶>4ÿnÙÀó)Ç ;ŽåXºJÐt¼*¨„ÛÐ娪VEⱚQ ‰é:ÒB4jY&«i4+¸¨XPJ¹ Tdu8EÁ+…Tfs¦?#fê¢_ØK•¨üÏJ¬GItGkûb»´ô±±(š¤Ê’âÎÁµ.·Z /·Çœ—“Aabäf„’rõ‚̳\Ë^ì„cÁ-œ+M¨»xÌu 2C°™^ÒµAàØuµ°Ý)5dÈöªªÊ°O©¨çQ02õœæ®¦>}”>ûú¾wáO+²«¿:3qnõ·×ÌM/Ÿ}æÀ#/ý¬Ø&¬<¿ýð•ê†Ì#O·ù?xn‘˜~ZìèÜþ•oîF_Ðêgr- ìó ™ÖH"˜ƒ€"Kê0ýî —A„œQR„¶ŠD|šð€#Éj<è¬ñ[eôA9ôSåPý†ŒwdC‡f+"hXÀvc…bÜ ‚Y€n†V«¥g‹ Ù8~üóOðmU¨Œ%ð¶Ar¿¯¼LÀÌ £A­2™P¹õúEûúE§£î×í„Üùm /Ó*“f!+6[õ6½OßÇö©ûõQ}´´¾J§Õõ öŒJtpËîn?wá×AUM19̘ F$Eå0¥² ú(„.þ#OPÆNÖ]ÅH?ÛÏà˜Ï ^ÖÝ@Éóô¥Ï8)y•LÛ sï?.Ëн÷j}~÷Þ2VØ’Ã-jß´1õâ±›Ñî.ìѨšGÃŽø: ]ø¤`"ú÷I5Dp"ˆpÿ`³ÎÂ×òf-ÌŒ.êíåV ½iÒá÷ÞB˜>™ì˜W[7—<÷Æ4˜©É«ý›·m“šÀT dæýâFX„€sŒƒ>îh\bÒƒ`ÍŒÙ7„ÖÀ‹",X­t¬¸q×.dýe3JIé~!+tÒ¹^‹j¨Í1#ÞÜd47ƒ|ªìL,n^Ú\0 Íß266÷µ=kìnúqÕËñcFe‹Kufçˆ_Ä^ÍÅÎf_]Ê^®¼žeU‘4p¦W(„£Ì%åä‰Õˆj#µÑ\KsÞ•Ü–¥ÒÃ-=¬7÷$Û˜Ûªïѯf|–s:ó&‘ìÖL>ÒžG74}§‰6%[Ínóyóˆ9cÊGÌ×Ì™¢©c~›ØM0ÝM|p¥m+«M“ÚT, F3)F†é«CÑ…“É€€_Šóäÿòœ`{RÔš³^ é j¼_{d$,8ƒÉs0Á£à]¬3@üA™rUe†ézÏœã vã¹®þভ;®'YRbY–dË’åÈQâ_ Ø%$¶CÂ"  ”?”áÎü†ÐN…®=ÂQ ¶f»k¯+ëHe”Ò%ÚBŽlpüÑÁ%½wMapk²QÖ®ÙFq²÷žÃÈíbÇOŠbýø|?¿ BãCí!ºù€ÝN6„N_û/J+q\É÷ÇÆWvU’m• RE×6}£tûJç˜n†4˜*†dìXtmXqÝXmmèbœ®;V^œ)­x’\`ÃèD…ò±ŠÂ<îïG®Ù®ÈôIH;GŽOà g(£0pb騸é Ãø}¡x¬¼|þ‰Ç âù¶h2…Z¨*.—¬¨þŰv.£eè *±òLcûÙé/Έ¯ï]¢Õ{¶oóv¸7ôìÝs¬^ÌU}guuù…KË^X·ö·!ïΆš÷wÍÞ1[¶óž@кá©IϦÝé}µæ²™ãšï}¿kR¸Q¬‹Å³Jf¤~0gÒàDHxA‹yÐ6!@Çéjš®2: Ò0|zTŸªo2Z f¢3¡$°<m¢ËnaH"OgX`uévÎèá€È™0•¶pÃÄÏ(ç){ƒ½ÿž!ÐðÀÅ-<×±T›§/s¼àY¦73Í®ArÐ- xU­WRÊ&…Rt¡UlIQ´äéV–è$¡‰}¬f] 𹋯;!{T©ë8ÄòÙZÉ Å ŽÏ-ëàï1àÖÉ`(†>Í)Èf `(Q1Àš±±ÇHŒBJÇHe ¦cŒŒDj´&&ó2}³Åt8<˜FÛ¸€f Cöar%™t‡SHb é¦ÇËÖQ™-T^ 0„M”z®3ò홯‡îùúU`n[?ܵb¦—œk«X¸÷å÷ÀBõÐ)`@±·â¡¿ýG,hï\ ^ß=mí¨"Na ý9¡ÞÌ—s •hã5SÛ¤°ýšÏñðÅ|‡Ö¥Y4ô<Š=FÌ›ÃS6A·–Š!¬e ;M‹´ùK€ºD×ÉÒŠú4úk%€f"šh&iBȸgãžáCÄ!"# 㻑r'”»;ØvàâïØðPýûǰCní,è$ ‰A`%Üáð`x `XïÃþ÷@•¬!U•|¶Ó¶™²(1¹,“’ -!1BƒðØ;@ò¤)*ùãÑxlB9¤ ”5¤j®¨Ë/}xð Ó³skÝÒ¼Š²yOwwSoíO¯Õ,r¼m­I-ßÿh5dÄÔ¡¹ÔȈ|b,Øh¦8Ž–#\P®ãªe&׫y#\HŽø+¹ry&W#/dsk¹‡Ö.û8¤h²rQ]Qk¤-––©ŠÔp5…Õc.³Ž]Q¸bL*Òé-º]ø­ÿn‘¤*Œë4yâT±îd±“ˆ°þ!i!ºˆXO“¯˜e´® ÖjŸn³*®h0j ºÝ=*USM©-ª%9ÙÁ²¦bYSÿ'k*–5UÁƒhde Å í¬¬©(ÌDC¯n@ðsB·pS,†P%ÌF‡#x¶‚}› £o°¶ XÛ-Ù\ˆä-<{”¼ÝÿOá2}ƒ°Yô!þô¡ÏnAДTUQ³²²†ÌêœJ2¡ÎQb·º+›¶ù•=n;ØÚñå½ ŸýììKGV}ÙöÇ;¿:òÊËG?x©ùèbÏÜ`ÙÊ%:öÄ7ØÿfË£Æw7¿Oý¬ëÜ¥óÏ£û‚ nC×’Á²3„ߥÆ(T[p¼ZâT5ÕÉ[𮉪Ss$›$S°å :ÍÊœÕÌý/ÛÕÅq‡gvg³{wÞ{í­}¶ïÌùL›k*À‡»n}i!Pl’_I´åáʆòH”4)NU¹¨MÕ¡´ŠÔÆ Tÿ‘´RBhšªMÅK84ˆY-rÃÃv¿ßž¡å±3;·;w3ß|ßïû õ ù)ÉG$w©Æ¸„A~Š®1„@b°ãÆIòv²ŸƒÑqCH$¿WZHüü8î­lw‘‹‰|C~Ðs•wÀt§\á*±,ñµàÀoƒõ°4œœ‹L ÕHP±SHK}[iâW3Qbè-ß2…h©ål·­(™‹jZ0RÌrˆ4 *ØâÛÁ&ñÙÒCF6¤’×g°w _• ¸‚Ù/ä ‘ä˜4˜LɹW* ]”SÒJIðX†PT©«{8Ó5]Xº‘Õ˜8$Ä …>"Æ„ÂDZœ;!|¯¬®Â®¼0<<,®½ûîí¸¨»ýÈúÔË“_áÍ´æ{¿°XhYís¢^Û§i SÓ !¡EÚŠ ˆ°f¸B[7*Ãeý è‰°2˜µ¬~›§ìV»ÃVm\Q#®Èv(™PP°)SÚÕ”L¸(Û¤LBܶˣ±ßÔ´Íf5±²AK»³xý¢+½¬u9fXU¤if}áúú>ÇlñO„é”ՙޕä2d$™"x×ΉҰ1(¾oxò›sR Ãõ\"®ž={s×K¡%D×í7–¯C¾ÂYP?}±•¯’ºï­ô'õ§¤Zü·6®«2€è阱pyÖtGNw€Ê|ñ u‡¥Dôt´&oB8;™›—Ò h4PC…çaDBz£l(ô­UÖu›õzY7^ÑyF¯3²f“þl v;E§¾Êè”»Å3ÚKòúŸÄ_ôQýªñý¦X–¦ªBÑuCJn¤if =fº*DV³bšfYp`…ÉáXjºac™%Nð²‚Ôb£Í1ñ®&MéÀ!ÛRÑÈÎ2% Y‘ñVÖÌãY˜OÜ'Ä!Îè$³)Å FÑ„•‚—jÚ¾>k‚ê0XŸñ\äœ(ïÀ_8Î-áDSŸöÙœØí¼­— AÇØÍ•®GuÊnÁe’§äóª"½`8ZÐÛ çÿK]« –üLU“4«ªZ°óCUMÐüy(MÍÑš&ú à|Áÿ²\Þ8Éô©‘¡š&qdÈÅæüÓ¤û ݨ9jû/ç:á°á‹…È9Á͘ ß‹µÐÞòðåMúób'Y7ìõ’^ñzÎ3܆òW¯Nnä¿??yø»Ú©;¯óÁÉíë”Ôw&Wã¹|.Ä×ËÇ5( mTãCyjó ývÞ|¿“¥¶…rS¦¥´CÚMtÀeLSSZ¶W›Ò¨¹¥¨¾ÀãL$ôqp6‡˜©ÌVûOîª}Õ,µ÷±öý˜Y2c¾dAgŠ ›Ñ.Ö.îÕ.¯\Η/ªÒ[üaܙ熵S·)ÕP½ûÌûÿ†ËºÏp…g.QbâH!r¿kO8ãÅÞ»˜ o »gþ\5F5xÆ…¹zXZ¦eXªîÔ…õP’—Y‘È<‹vŽ¡Œ~,qÄ}/o;÷ôáŽ5üÀ¦G·þJÔ|mqÏò»'¶*û¾ÕýðÓ¯ƒCa‹¦>sÅ +盎Ç=\I˜H$+CJnÅ^9}1¬ò@›þ¨ù¤Þi~Cß`šy§9Òì.ô;Ë"ËÜÅ^—Ö%sŠ‘¢û˜×­uËuNw¤Û]çíàq©kÁÕêãÚãÖêÀfu½¶ÞÚ°•ƒdÄj“”}’t L9”} G §4:6ŒûOò ØA¨CAˆÖfóó Î ÇHª1ÿhŽ/©ÎäçA?TË!Œ½¢s€ð­$|C„¯ÏZÒæÂ˜å@aó+ò(®Å»È9½¹âx±8 KHF­×Aj!ÇöbÙ’+µ•r­¶V ¬MøHÔiÐXœB›ŠùÁ›çî®k?¼0yýäPß¾¡cßïR¢|îþí“—&Þ¹ö=^̓§ß>}öÍ·ß‚Ô7¹AÔ‚VÍ×öœÏ;ËÑšL+©ô§™ªñU_¬êI÷§ÍæDsribi²Ó\èJt%7š›œîĦäHú½Ø9ï\Å{Õ£±Ñê‹é©´›9'_(šGÄRç)çCûZÕ¤c‡Cª[Y‰*ïV†l*¯=cqÇ*XO[{-‘&Ó'ø¶+´¼Òý­iC÷1aIÎ!´ð¬ep³­oóh½RÉ26.ˆðA>ÆEŠ·ò®r¬s¤ÆœÔ˜“s:!<€Sr$3bGR0âœ$påå©¶FçÚû„Ø™¸1z7æ{ÅVòĤµ¬ˆ…“õF§EÕÇ ´sÿKvõÇ6qÝñ÷žï×;Ÿsw¶ãóÙ‰ãø7všÐÄIBñQè ¥$¢´¬„„¡Qè’±Ò„”ª Ò†v(h¢•:•¢ZËVR€I¬h*VED°– T„(j´ªêSY’½ïs‚ÒV²ï¾ç»ç»ûþøü0]Sª×xÆÞ_îîzáÆæ¶ÝÕæ‘õ?x¯wÝÀX§xæµE‹vŽ¿yhìÞoŸ1zÏuxèܧW>ýû¿` çuºn²¨ 78»Ü$G²Áf²€lÒ¤BiÁ^`ˆy_>\ˆÌõÍ /ö-¯ô­ ¯ˆôE.KW¼·¥/µ»Ac‰i¹Ò&R¯=J~ªµ‘Nò¹öïà/íÛáÿ ¨Ì-—Hþ2Î*©CIÃÖ±¡;ú ½O"Ž›¥3«§{ u@\>Œºi×ü'RH½€\Tð ä—8zôš‰åKò y\*˜ÈmeØà“‚…rŒÏv (|ù<Ûå‘ÞÊü–ìè^82š›R§™¬J3\ÔM>IfŠcÕ3Í7¥*®ªìþ§ÎŒýgí?_<ß}p´òèÆuG>\ÿ¡±N¢4·àj,{éÈ®ïæ¸þ04ô·O._ýîeVš ¬*&ºè4×ø°!à¸æ‹…ÕB¯ QS¡ õøLêA.»ùH •fö(X‰E}ØGbfQø9ƉaŠÖû¯cN!‰Ñ÷ïa$Mù-Þyç¾oO³Ü2:¾í¹Å’©ibnäq±¿dë9HTî˜Ô– y‘Q¼|pVgaÙòY?ܼÜRïvÏŸñ^z^aEÏèeÈBaüŽk€eaºËr6 1l}ŒÎM,‰­Šm¡»èöÄßUuy¨ ZÓT]µÄ0yŠ£«Áv¥¶«íîv­ÝÓ¥tÑ.µËÝ¥uySƒi=J¤ÓmêR÷3©g2½ñÞD_bŸú¶¶7³¿ê·Ó«¿×¥gŽ§Î§™I%› â“Ab2ÈÝáÄ5Ä'ƒÄdPÎ|…ã4µ)餦 ¡hªTpW—‡N‘÷˜]ɯ° v«ýsûCû’-év…½Ö¾a ön›ØgXmJY_¼0«ª.7°ƒ‰‡™ÑÃ&t¾?Ǽì%fãêöò5夼¬Tà1` nóCàø ÀBYµ»"„C Ûñóµ°¼ÆÎ·0-vzÄŽÂJ; «lnígéSdÙGr"Ë–ž(kÎâ,ÜVda<áo²“sÊ‚»‚EÙ¿Ue:›_Q{¶–jûjI­1N `Qïò–‹³Ì x"šÐ9ëüñôèB|çD9n”p`Ð8(ÄnLÚZûA`RÃlÈ' x„} ¶ëiá ~êÎ-œ¢‰G˜†‹ #ÝÞ¦š¢³a Íw¬ÙÙ‡õ¼UTONúH\ôW¥LÃkø —óDÈfä0`›ˆŸV–ÄÃ(÷hÊ45Œ3iªJ9!Œ*ŒrÐY9ƒ©²âh.›Û¶mšG¸£§»Ã×(BM:•®&õù†Æ"A°ãZÌo1mfEH‘ìS…ôW7oÙXŸÜwá­ÖÙ?ɾ±xë™6󘶮sKW PÞþñþ%¶^ú?Tö«žUsŠ“µnk™·)S‘›¿ùÙàíO4ÆËÊ}j¢nö–ö¶w~væ41þ ÉŠo! }v©¬ã©<…ÊÎfAŸÖ<*v¡€AsºÊ¨ÛåÖŠa7©áqYy„>²B~^î“÷ÈbÊé€|L>+Ë’ d X%Éšß fÉE?6pT/*è¢&îg‘4!ÍŠªRþ3éBAÜ0°ú&•ÑïÓÇÆ-@ø‘ áͺ:ã"ØÖ\.iAþRõfœá{#C²¸é‡Ô#ôøÌ_¬©Ú¾ýø‰¾\&òî;ƬUÉÊX^3öúÎÑ} «B£—–ÝRìî­§Qˆå†–Zyõò:qPŒh”Ó›T “ÄAïåw¦*Ü•Âÿs¾ Ü›P÷¦-6xÏûÙfÃ5òcÂò^˜Yd>D!Á(ñè"ÉŠ¤ˆ 3"‚FÅ #°!Ùì6Æ¿lme=/Mš§Îd ѱ«°åÊòC­†{Ðm>·hÑ®æÁ·çÿºµ~Ù;züõç-Z¼{iºwU‡•Èu‡UGÅw™óäÓŽ%*HU$,©H¤Šˆ‰˜€ökrׇŒëC¬5€íàQÃ'ëEŒbf“ øî1›(³™y6„!Ýq¶Ç{vÅgTæQ†m¸î¤±d؆]s^ÌTçQ”mtmÊДڄêÕùhžº/!K•§éj¼št*t#Ú€7MÊFºAíÇýä׫òå5ú;ô&}C=ŠªgÐIy@½ˆÎ«×Ðõ+ô…z}«V±×Qƒ( fPJmT[‘£RÑñò"k•ü€Äß²÷WG ‘ʨ"Ž¡ øËYÈ ÿ•ˆ¢æfe«¹žc¹aß¡ÜPÕ ¼”a§Q•%IU?¥*r„‰cö *“,ŠB–d•ºk4¬ÅÇqh%ôŸpÄ>‘ˆ,rh”88æ¾û覑=Ú1Ú ŽÜê©j£0à²ÀF·_¬Îõo=×_„ÝR&@r9戦š^Ô±´×ùVC£¯ã?Ž­ùË­dE0÷Õé±ç„Ôèög×>¹žì`ÍÁºCBH<ɺÃ+”»ã4ò‚2åè#q¢’&<ÆåAÍÃ)ö“¨,2£ZñÄÙÁƒŸ`Ô ‘éðcÕta¤15„%eãI0Pš‰‰  ¦ æ$ЙŒu††Œ«CÆåÜt$g‚`Âlý8+LSÉcæ2s—é2£¼~§Æor&`‡VTæ²ò4Àõ×ÎÉŠD^4ê“ÂÔöŠ$7u—(^ù\~¹L »Ë™ƒMÊY%W’Gõò ¥¹dîÿÙ¯ÖØ(®+|îÝyÏܙٱ½k¯ÃÚø±dIìÄ3Ä oã‚y8›@H-M¸@¢$(Um~$¦©ÔªMH•xÙÆ1‘B)B”4)­(¨´TT„¦r”J-¥Þí¹ãµ¤(äWûgfö»™;wgÎýÎwÎ抾´@nÕf²¹ö|g%[⬗‘u¶ˆ[¥ÍòÛb?ëu>o(iÍNCÚ¨5Ó¬Ö©s§@“ó´ü‚Ü%¼®ï!{é^í-½zÅ~óTäœøGåjä*ûØÿ­$5‘¿±”VPšAÉ‚Ò)жL5YÄ[–äj‰U›|gJ‚Aôj£/Îoâ*e ûnöjqc¢ªÙ5jÆn,QWÙìNû%[µÕr‘/ÇðÂŒ™:¤µu™Aüñ¾u™ŸÃÑe¾+D£(XRTQU÷(ªeۨקּ£à`ÎÒâ¯U™™ú•-É)ÉvœLTr£QÉÄu®6L×0L·;UvñqˆŽz P"9™Ùºi¯ç ŽË²$q×q3MPÝk–AVO; Áè#{|5Õ¦’ꕪ}ô~_i³ÉF{‡MmÞÓ¬(Y}K@çÚÓC®Å®­ R¢Ä‚Ál6Žy þ¸“eãz–U8ñÓIÁëì Üµà‹ws…¬ÜeZ'$ÓjæàmŽÖã–.ï6Rzо“¿„9í%0ógº¡ž¥ä(™R8:ZLZŠ'çÏ”êIp¡bië†Å+‚«—J©á«^½-¸Šõb*ˆs£Z9$ÕóÁÚ?üO£“>WºoÂy˜7.Û§éC]ï½O×Þ¸@;{þó[T†qè¨4ùs!1¢‰ªˆT4‘,ÈÈY]& ¥]ÄæV™ðD%¼ìµÈkònó‡ìXô˜xLz)Ì/öJ…˜Rd”Zdªö ùž&×9D:¤m¹ù:éR»´#´O?¥6c]þ üÎø“uEuFœKÓÁ±YÜÀÄBäêfò ª}„ /2eˆWeþZQ$YQˆ(*ш€)ÃxnÆ K䂚 [ªÈ(S­“pR¡V5(.€"Pã¤AŒj]pu]PE¨ˆ;]µÍ!N‹±]¯TÙQÙøâ"q§(ˆ}t¦o¦„í´² mÙbwÕìàp°ÀXa]±>ÊÞÄg+²¶f¿kþúŒí’–—Xqê6ËÍRt›ñrOãöÖÊ=½²Ä¼¨Â³¸Æ«E©¬ð?éDœŽì&È` B¢`Ài(á¡§ [HÂÈs¹ÝýÙɉՇÏç~@^¾xajîo4Mr×çÖÏh¸‘Ó‡> ó;rYü®ŠÜbáSäH)ùg#åªËMH&˜#jbÌwXJóõT+‰ºLéÅÒøû¥ ‹Wœ8AØ(;Ì’„ñx<é¥Ýel¿*ø† ’J×O²x!éŠSlÄZ­V¯5&ë“Fs·­¥tl^q‡Óë(Z笋­+Ú">el±·º[‹ž7^²_q^‰½èv©{µw¬£v¿û‰ú±û¹1d]wóÉÛFUÓ’e6‹=Ç–}ýàýp ²51¦[¨•˜9$ÜX¬ÚQ]ì0ŰZS]MScŽ£ëšÈ'€¤•¤uÉw“4ÙG§÷0´…ïöÑv_›îø}ÈyסN™ÑËH%Ì.Sù­ÀZ~J¯×Ûta‘ž×©Ž#×1´ Þ]–êDaDã mÂí"’›qkðrºœÝ4P·‚ÄùÆa„Q22 ëxÆ,PjWÀT=Õ&ŽjsôüUÐòWɵÆÍÿ¥·ÉS+›<½¬§È³+‹¼{Pi0‡AúÄjyŽÛÄϱCæÁ;Ü{&6Ï+±k¢Zîñã3•ã2vç6ÜWUß¹lRîÑ}Vºªl=+¤‡vç™Î§èú§öÏèXʳœ4jÏYä•Iöû†ÓG-S‡Üí”LB ýÀW°A¦aÖŠ½ãþ|lL i¥Îòˆ§¶9tŽÜ¢´Y«H;m—W(‹¬ äaú°ü˜²l–·)/“çå•ëd–%ä2AÎ(žüsù<‘¸·±Š&Q”WLBÎúãЩŠJeU­&Ã%Eº&šÁOT×`ðT ¢yÆTiaÝ £âQº$¼YÌoJ•ÆOL¦o®6wšŸ™Q“?WÅo™›AÝNÈ~ m°ò @œ_†³6WpÙÈ,Duo^` XC¼q9c òÅÂmJ¦Ùº‚[Ä+6ù…TÓ2Odp ƒH¤c¸š=HLɈõdnKì?­ÈM $›:H6X{åƒq#ª«GÊ„9œFdá¢8§ô}ù4€ê ÎÝ ­Æg˜ÑáÿÚoÄð9÷Ù1:Œ’ #a} ÌF² |`Ü^€ŠUãq?Xõ@̓iЏ†&2&¾pÇOêÐ.wu4¬h¼ `r7@¾ß=ßh~`Z€?`Ö/æœhAßjµB„"Dˆ!B„"Dˆ!B„"Dˆ!þÿ øá‚À[¤!Â-¢A­éXX¶3v§ÆA@UuMm»áκú»îh„&ðFÍ€Y³çÌ×2¿õ ¶-Z¼diûýËXÞ±båªì­ÿüqD  Ëž‘ ®„ PS¡¦Álh6Xí° ‚­ù|aDî(Œ¸G´ŽŽX“Ïç?üª³°_}·!ÃÚÂL˜X’—˜xþw6%ŠiN ˆ ƒ”Íwƒ²™â!P6 ]e³Ù=>N>ÚŽE™‰9¾!øx > î ¾Àp²´tC&C"CP,2© é ¥@^"PŸJråÀ¾gëö e ì@ ã/ ¼\ÿ>b ã`2æ`G1 ŒfHc¦gF8@f{ `pÆxȘ3<Ì3 ¡ Œ£P‰Ò[ñü6_9¤9Àª=V×Ñ;¯nùökýßtPž…?Ødì£ÄG endstream endobj 1694 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 34 /FontBBox [ -147 -372 1168 996 ] /FontName /LGMAFJ+Garamond-Bold /ItalicAngle 0 /StemV 133 /FontFile2 1695 0 R >> endobj 1695 0 obj << /Filter /FlateDecode /Length 35777 /Length1 48848 >> stream H‰|V pTÕþÎ9÷îæi6@ °<îr“³bÂà ,ìƒ<ä‘w!Ñݼ! )E 4¥)”B/al)–âŒe´ZÒÊ]Dã¤SqJ[¬4ÅVam‹m±–lÿ{CÒ€Ú{òíùÿó?Î÷ÿçÜÉŠ,]²,¯ ö|hðJ ­.®[m†Ž–§|k¯Û°^ùÚɦï’í [›Ö¼üXþd@Î"ý[M«76®]ñ”°“ÿÞCÍ Ñú_¾L¦|? ˜YÍ´62Q_ =«yÍú¶¢þ#·IÿTµzm]”Õ®%›þéÕk¢m­–W¥ë?•ü•Ç£kloŒÚœ~—øZ×~u=ñ¦çtao]×Ðzùøow£Àê§AÈ-[‘-f"ˆ_DBü9Ëûg‚,r>ÿT¦ˆñ/y¾ êžg˜ß/uâø~L¿‰„ÅÌ/|€j–…›8ÇÎÒú%áiì¡ŠËØ(T“}%Va~Žñ2z™`ÌC9êЊ Øy®âܧ ,a s²¹ÌǾޱ3ì,{ƒ¿#&‹yâ x]rHRôyåSh`>ü¨@%‚XŽh¤ [ˆÿ~³‚gp‡Ñ…#8AüÎÒ8‡·ð!®ánÑn‚YX ÍT6›Íg+X„EYkf+Ù:ö$ÛOãyvž§ð‰ÜÉËø2^Íëy ßÄ·ðü Ÿáoòwø_D¾(uâ›â¦ ^̬u,u|:õ´zUL,PÿƒxÄdù(unu®F;õo3¶`¶ã{ØMã‡4ÿƒ4Ž †£8Ž3x ¿¦ñ{üÆeº;ÿÀÇøÿaV–Ný*a¥ìa‹ØR¦*ZX+ë`[Ø.ö}vˆd½ì_¬Ÿ[¨–b>‡Ïåó¸‡7ñõ¼oå»ù>~˜£qŠ_â}ü#ÁD²!Æ EL¹¢Z¬¢Ñ.6‹WE¯¸"ú%H) µKÏIG¤cÒ9©Wº*õËvÙ'—Ê‹ä%²&ï”*Ÿ¶¤ZÆ[œ–}–ç-—,ÿ´Ž±f[§'¨Té!ª÷s³JQl‡ÑÈ.I^xøëø{~³ãÂMÿ^<„+(–5ü̸Õx›Þ„[x‰ÞŠ×Èg,jÑ$¶Qª|”Pÿ;1N6ÆV£:–„¿Óm[Fã½mÛèf¼H=‡göìÂg͘^ÿ@Þ´\·+çþ©SœÙYêd‡2iâ„ñöqc3ÇŒÎ5rDº-í¾Ô”ä¤Ä«E–gpûÕ@DÑ]rª%%¹†®Fi!:l!¢+´¸ÛGW"¦›r·§‡<ïñô xz†<™M™ƒ9¹nů*ú9Ÿªt³å!’wùÔ°¢_3åE¦,9M%•‡ƒ"f³OÑYDñë Íš?â£|±ä$¯êmHÊu#–”Lb2Iz@m±À\f <à/Šq$¤+½LõùõRÕgPÐE¶?Z¯/­ù}v‡#œëÖ™·N­Õ¡.ÐÓ\¦ ¼æ6ºÅ«[Ím”•F9Ø©ÄÜ=Zg· µWJ½Z­é"6öHwé UŸ¾pÓß2sÝÝì'U!=ÑÛÍP:²xG¬´Ãç »ð†¶w· ÍŸ¹R1TMÛ®èÏT„†[Æo8LIsÝå•!±VýŠQFeȬ€’²Ì<"i¬eÜ ú•È*EOT¨ÍÚªÖ8MGåFÇÑqežñwQæW´ªêÐçÙÕpÔ7>6 Z寗J=JéÝ–\wÌ–>ÐéØ}iw„”ÔáBÃÍ”LwC"Öƒ­f#µ”®ˆ®Ô)Ä$¤ê<»Ðøi(„VWHnô„ut%õ/¢ÙŠŒƒ³mª¢Ý]õÚÕ»W¢wV,Ù¶›0D㺠]9²ʺ˥çä7Åꥣ%fsM}f®{ƒ^®¶Ú½œZ†¥! åQËã”wv{PKŠÞQÐÔÚ“ç ë} !åËÔòŠå!ůE_‰‘Þ°ó;·‹ðW¡éa0µ\¾}™¾•bý½ýo%†LîÃ?!öX†>&î ›¥èrAу Kæ[ZPÃ=èäLdŠ>, û·É·†waá˜'ȶpaÍSù„ù„‡Â#„¹äÿ¡Žrì„¢ÎÚ‚jÙ_nA)¡ÆâAÜ…,©sä xÔÒ寈‡ì³ä L±q¿¥V ý§&¿ŒYÞ‹ )rG¼ß’,9¿buÅûå$Qþ·i¿\އψsÍ9RöIˆLµlPOë9Äs Í‹i.á´—DéNêÃDâî–<˜D³•öΡõ©’ åRKü6ÉKx²¨žå¼³Í\]ñërWü}ÄŽ=ñÌ~¸ðœdi^A|4³îÚkŒšk2øœ¾ÄÑà7ÄÏq)„´!n÷¢Åäý?‰K±q†Ä!Bzõ"ª›²èžH@ü6õ©à7ÎÍŒ?kö¼ ùÆ l7A}]˜Ay‚ò1¸,{1M2úî¢øü—óòŠâ<ãøó¾»w»(ÊAÙm%zø‹“HdA°èÙ@ôâiü‘8bA$-Mb'Œ£ží0­“ÌÈ´$3¶q=;pª¹±±ÍL“‘™V›fÆê´j¨Qc[ëL§©×ï³{‡vú‹á³ßÝ÷Ý÷×ó>Ïóî$¯q5Æ FÌg9ìÕ{vq[Ìg-ú¸ß=†~\ X':Ç>š²«}FÛàËyÿ0·{ðÍVPƒ÷6‚¥ÜŸrlwž“xð+øÁÛ°M.˜­`o°N¢§ÙÑf%Ú¯ÓM2íq0Ï1¶ÿ=‚½G)°W)ì=8NÕÀ^/àX¾›,7]DOÈÄoÙgÙoØ?ÙGØ?8`ŸZÛžXû8ûYÒÎ|¬”‚™ˆÕVÐJa“…3ì·<ϱ¾á_ì7)eçvü_.@?e¼^ö¯Çt\[ž|bE*NÙÿþ£&ç4^9¶9¾RŠ9?'ÍÄuž;Ûrœ¸yMðYä™ƒØæELª‚j8/pl>ªðGM;f5Ž‹ÇÔ¤{¥£ßMv>AœŒWÎ-ßã5eß1;#÷pü³Â·ÊRÏìoÿ­Úy ¹#µÿ)ßH)ç¦Ôþp,r<%çºûú±<žø«21Â9×ýfbD;›Q>MŒ¸-°|œ×ßJå]õ#šáÚcǼÜÛÝ鉩œëz¾jû=ïüÒ…_’¼N×"-H/p¾ÕTÊpŸ§F»=Ê•T«4cï2iª¸FJUÚe£~å”ý q½² 1‰w”w©Á~ï6MQQ¾úäèzÊVVPƒš‹<¶‚*X•bjPþ€|胟õ nêò+´ûÂïØåü.”ËìMÜÐ÷aýç°¦·m;Âk}äŒZÆmÝi޽ôÅDê%ª°mÆï9m{%í8f+Îól+ô©M¢]l+»Í_)Ãó2™žF¼oéEÎ8 ÊEýáĨ}FÍÇú{.Ê"õ¢pa>t—=©ûGu<"îÔ±2Öý¯åÿò|RÀ/¿ÍÈßP˜ÁºIûL”JQKÒfâ½çt¯2ðY/rû=°ËeÒi½à"l÷ÊW§ÎNä™AòÛlª£ÃdJ#69§l8—y1OZÙ$2Õ’Sb¿Q•#3emÆT6t%4+©“:!©ÓÓ½Ù¸Úv·M^=-nÒ]qó'’Ú¼m’ÎàÑ ¤LCá.ÃØitCÂof*Æ#lDŒ~5sgfg&—å(™k2Ù‘Ì~µ×ݫɻrŒ uFÌÆ±—¯b¶™.0¶®)0ºÂs1SÅ,îü’<;“•±úXKLé]?ÓXHÃ#ÃÒ4–™UÏŠ[ä¥À  Df?µ‚¶GJAÜ®%\½@¢õ(ZâýQüXEý(¹ÆJ“¥*FµKaqóT–PUÄÁ¸êXM)i?(¦]Ú ]øbp¡ù\öWºb³ë4NàV–S•!1°€‚½TÑP¥6Т`¸ÑT¥Þä{q0®J5æöÐÜ »“»(àN‹$%Q†å4€Vˆƒ4û-.•T‰ PZ€"I$NeAU–H`Q jï à ø$€.æ¬Î F°ô²y¹árëeµaŸx¿û×ݲ{Cž±¡ež±Ð<Òz$zdäˆ:r$qDªòÄ}êQ0T:†k|të©~ª-@WÖÌ3‚‡c¢3²ÅX‚ ‘ ˆTFÞ‹(»[JŒõ ååãüú¿??ç¿û.ø!o‚p¼öƒNÐÚÁ×@ظÿ5öXûœ!¿îÈ+Žt9ÒáH»#mŽlwd›#[iuÄçÈdG&9’íH–#éfz¼N“À'ÀÀ[à;àUÐ v×Íà™à‰žuˆÐ¨¨±¯æ3ZôÝ¢E7iÑV-ºQ‹®ÕžÔ‹t¿^ OÕóô\ݧOÖ³u¯>QÏÐÓt]wëª.uB2µ&)!ZU²â mò[÷W‰´ç×Y®âjae‡(ÔXm-, Á?VZÁ’åiXßtRˆCÍ(µäC‚›°a\´?ßÊ^Ò4ŒŒµ`ÿÁ|Ö­û67“¯äñ¿Ü±;jx'ºØ|J3^ÓJJB«ðåÇ(?æŠX †^8Ð:þE?ÿÄ¿­{«vûªj ÙtR§êæ%aGOÉô4L½5¿°¹Úçm[l¯cQanOþi$‹w(½¤ÙÊ(®¶&®šU5«Š«pÜpÕDg&«r{æŸï$«¼(΂)©]´w”œ4õ­Ví«¿¸Æ™OÇžÔÌPÏÏvYG{G;ž¨Cì¡v®³ëÛ7âuí+¿! øܬýaGíüG–R»Íòó@«å/®±4Ü%Ÿ‹ŠkDÉž=Tòвeâ²XRµ›õSR…à3Zˆ dAõ,?‘ WEœ! <¸î½N••¸Î)“U˜õTaV¡J_ø•øøùwò«qôÙ“¸#޹æRÑóæœ4×&§§•¥á8(dwÞa:Æ2«KÓ¦uù}¥>ÓwÌwÂçºà>ß“ÅYÙåÝn—nï+tg•r©òw*ËËç”ÒîÝ­)ÓgL_0?¸XËæÍõåLÖ·2?yï..š.æäË Ò\ªº 4_†¼%Þf,([ÔXÿ¬¹Z¼&…èø$²¸@›VñŒËýO¾«>¶©ëŠßûÞóGží÷ží÷üüÅ_81þı Žý I !Áâ” á+!0 cíšJe@›ÐZA騲ÑvšÖ¤K·¡E+“ªµ°þS­ýc«Ò®š”îT©[mvžºVšª«ûñÎ=×>ïžßùó¶nê¸R»õ\í'i_| ÛV,#9Ü# ÕYPïuΆUü<ÎIvÌ ùŠèãÔ½N§gñ¸KßÑc½Þf]1l6׿îÿo"Ùj6Åì!Áô³¿ö@JñÝæá\çfkõVlœlË•ÍÄ=<=˜È ŽF={kÓø©Í벃´…•=Wzð®)Æ‘ 9Ñ{ÒAµFËrœJátôz%Õh7ò<‰­“ *Ž;¬Wò 'yþ°@ð ÔBÝ@kœVÚv…¼‚Ád4°ŒNë°[hó5F NÏ *%IppçœÞ¥êI½^ ™yüGI/òI ‚MûEBÝ.ù*ÙDDLpÕ,¼uELÀ{g³r‡­ì’˜©«À|Jny‚»}*l®Oh|9Þ†©>ÞŽEnc‚”{BðnÁMzŒr÷$Æ †–ʳe|~`¶të½n쮽9p®T;X<÷È­÷»kà_wãóÝä_ñÙÚa¹ÏÖ~6[;ŠŸ•û,­½ŒGù[äÉ'á[,‹6¢~ô¡d%ÔûÚz©´Í–N: Ã÷paŠÓ`Í<®Haí°.:‹G:‡ÑTDËêœ:¨cnæ^×ïé+´ib8¦ÉwF´“šÇ›%6Þ>§T&ãC±ÈP´o2&Ë´ùèç™Ì›Í›æšçqä7 ¹=?›%VJö'w$%§“Š»IœXݯTïW3n‰[ä>“‡E}"²Ä} ‚¬ÜàbåËÕg2°@‘|%_]”µ¸ûpRÖ†‹ÏD ¢CŸÑc@^ª5O˜ì˜Mr«Oü¥À;±ƒJÉ˺‰¸ƒ0¶&×,ð&cd²¢ˆ_#8ÓËOÏ͈,Þ† Öt¦,E›\!ÑÙLà ]c±ß\4qÄ6|åˆÏ—lêYOâ®Ñ ½&:I<Šï¨Ú/O|÷u#Iöa›ÆLÓÉmÉöøÍÇİÂùÂEk‡ÇÑ®™{VRq ÿymxU<6ÓIü©xGaS•Ö¶•ªMªïôôM ~fØ |¤Ü£X‡¥PÚ~*i …Rù""xÀyð÷x+²Ù'ðVIc$(i$±ÉòÈA.B¹Yƒ(ÅIôŸ”Ò8ýÊÂö“íóø]ÉA7 ¯2|R’ ë•ïÉCô4}Žž£ïÒ£•4 ÜZ­X«²7¸j}½”‘À/à¥êR>žà`!ÇÁ©'è N‰)¬Œ` L-‡—éLÍÓ.H™“›q¸ù¸Áïi‚­oÐæÿvå}âGºíô§ù†¶ÚŸiQÛh ô­Þ÷bh•Ó÷–C¹á«$Öº£m5OØù¦Æ EN<ÔÛ{)tøã¾R(?t•ÔÉj!Ëj! eÅe )üï«“äbÖW“¢·éæÜ¶g">Þ&6½úÒFëESn9Û³¡k2äh.X¾ø8ë-Ëjîߤ1ZyðO¥…ú ¢=è8Pñ·Ð ,˜D³ÅjkL¶¦4_]§‡Æ÷îÛààR¹À½Céô±^Ì÷öâ¡Ð‚Øèñ&Óû'4ÁñBïºcÑA¿¿ÀA"+ÆÖA5(5t7të{Ts ªA©«/Ð× µ§“.o£GìßO1CÂÂä®)—«Ýëñ0¬{½íŒsÞõ!¢8Š ¨©âÈô³SÎ)bê-Ñ]Ië*F‹R±¿x®¨(dª Ì¥e‚¬Ô'èúzëq-õ0 å#ˆ|Y;_…c+Úu~Yó!Å"ù83çz õà˜> ¸Àˆ ”[Þ̨R fñò>0‚,xxji@p“kä\œªŸðÖàÆì¯ó…è qüfg³ýÄ=-ö}Õl|< SÛ­«ŽèÙu¾Æ¦ f:F»ãšVðÓU(Æ'k²°²îfË7öö$·¬/ï¹óéÛwŠ—7ø>osðFUG4Þcó`ƒÚB?¶}´»¬wuÊ!ŠkK-ÛŸwP”ꇕtÜ?ÀPjkÁ›¹µ>Èæi¬VPJ@±¡iõàšëx{6«æ[ì6cà{ÍŽ@åÊÍçÊ—&ÙgmwÁ%™‚¹Ö@sªº…µ1g'v;öv„}mð™‹fˆ¿àëõz¡õ ¨žr’× Ds4AwQQŠx‡ÂÅèVª„ÊWJƒ%ðÉ×Ê‚Lt/_nË šág¿ß™ËäB#õÿ©Ùˆ·a$¢ÉH+´Z‚`8„8–(1ªþy|YâÕ;ïâ£|?O!^â ž·˜WþuIf¤E¨à ™e ˜D%xˆÞ :0¬ýa@Ä Në¶à¦ŽhÌß9.Xw×>}é6+Â6[¥íÐ/kÕ߯ý«åÈÙq«5ŠýøÛoý—±[¶Ð Ž€…v´QÒqˆ%Ë’¬€Jœl›Þ‰—HIØ!\Ô´pNX Ž uÐW*ÕꢜÃVŒ„D“2ÉÆÁÍ0„*# 2>ëͬ¶êöuŸšµG gþQZ[|¬;âô( ­O»©ÿ0—ßôƒÏF.<ÿÌçŸ|”jÝúúuLýüèO™ÜgN7¥ëñ òŠÊ£Rx<~<~:Næ"¨%ž!½J7kQ;ë‹Îˆ;™‰³ʜΩÔRrÏãÐÍdÉ\N—XJe !Ú¡iô+´€T<.kÁ/Þ_¬B_ÎÏõÒDër$[})·¦äü/ÓUÛÄyÇŸçž;;>ûìóËÙNlÇŽ/öå•ókŒƒŸ§&’,á%!8„ÑBBD!¡]ƒ¶(-­ZB·Š¢~€í-êØP ´}@Ú¤iÖJ›4iU•ñ)-›²Iý°ÿs >û^ž{N¾çÿÿÿ~ÿß¶õ…µ%=DG¬°·LJîÐnàΩc2Z4`Ò ? moÚ|ÕJ ÚXÆ‘¨mÛ§w;„H»ïŸ»lÞø¡­a^Šº«Ïˆr¢©EiLÕžÚÌý_Á6dCaMBŒfr2ÄÇx¿Âÿ†çxÞ.®³;ÊSÄëP_'OºblÊïñÅJÚ ËÖêÀ¶dW]v0ßXWS+Ð5¼ºö/ò?î}ZSš€àÞ%ÈEÜZÄ_-0„Aø¾‹ˆºLë ÌÆÊ'\®­F®qï?BCöécò:× Î!‰†5߈yÒüjø-ˇ®õŒ)tF2q’ *XYÄ¡[B|ÊGÍ‹tî—óèª^äÑd¸¯¦ÎÆ\­Pf¡m‰jLgJ—%z³p¬÷+4†MŒ¸h#¡÷¨4ÙÄÈahwV¨õ·ÌömÚ^¹ùvÔ;HœŒ™rTcâïoiÕZM6âW µ‘ÝQXïù—;?èšx­ÎõúÚWß|ü³‘Kx{óñ_ÿhZüûG;b‡Ýî;÷î‹¿ê ô|þ¸|˜F0–ó?\(üÇ÷P/þ^ëìéaºË=½,ò;G›F£ˆ%a9–ñŒDGü ç·xœk¶²¶wå»3ñl.mе!ŸÑr/~„º@C>BqÔ{`oEý\Â^p»!‡«^8oÀ^­©¢Rcª¦WϪóêMõ¡úµúDµÐ¡x¢rt΀JTu ±´´!ãu)¯ë|C6¾­ž†} H3ŸÍƒ–‡a¨4½Ê2@´ÐlØC@·¯ë|#íÜrØhhÆŠQ ×kJÅŒJ%À/cy¬èç”y€•ô2ýˆË‡òÐÚF‡w+Ã4·ìL:½—ífGÀ—àƒ Ó@‘ð¸ÁåQ~ d:Í÷¹((dãj¬•KûW+ÙÚx“9á§À"n‹Ùm6ÛÞÒ¶•ª”OJÙ‚Åf«.%9O§ rÌ›©i) « "ä2W4ô'­YPù8Ã8³%™MÙ&+'шuu©x{»/kšã,\BDYœ]ÄÖÏâs‰E|rA´ˆß"žÐ¬ g° ö-¤£)î Á”‘»¢(Û<ØCÐÔÔZÄÃZ¨n uàŽ/c²&Èãòqù¬&_‘Î@|§W§+«Óßi;Àí¬»ÜÊrRMÂQ×7zÕ‚^€0*dD•ëF[¡A^o2ºW¢Sq­óNGþ-§^ÌÇ*» Þxïǧ¥¹ëû×îÝ˵·FµŒ¿f“”>Qš-§˜ñ¨ûÜPºSû <9ñ¿q°ï®?Ÿ:üõå|C[tsà õ¼sëÇÇfÏSæó^zÄoiÃEÎ`¬2ñf‹`µ*ûF÷Ž ïÙ½kçùùóÁ±±ëJÜ¥(ñƦxºmpx´*9>v°(GR qÕa‚ýVQ%§à$Rœºv}v`nš)TšC¡92MÏ®õa,%Ý7§ÛÚ³yRи*S‘åñþAbèÛÑãÞ^®–›†GÇ8O4QH½Ìó9c[nÏd íí8×Ù© ôhS…íS=‹øÑ‚T(`#œÜµz¦¤ ðdëvtª~J–hFƒÖ‡Vtéõ»÷å‡ò™Èj…¸²²\Jû/€D\¡ä–£›C·2öçφù¡»®Ÿé(*ÕeýñÕ•å%EyJƒÏÍ¢Ú YðBÔÁ•UÌ=xð .—ƒ2‘¨‘1H£xÒ¨Èa‡%•1<ãI%[[ÆùÌå$ `>*=žd"Bë,M'Ò ”q©¶6‚˜9w±-h% °!ƒw§%³Ýh ÅöwMÔñ¶ Fþ¹cÔá—‚¦-6g n¨’~ˆœòŠk× ¦a¦Êe5)±½‚èë­®5ÇÆçðÒ'„x¹œÖb‰ùÚ€xÙÏOsVx 3B·»±jĉÇgf­5ŠHˆe[McãÁæÍ©r©pœ¨æ3U}]7úùˆÅë1ÇÊó._ËL< ¨.@½åÂh/ú«Ö2T.*Ù]’d'ï±Ù‡È0/y ]e’SÍsüÖÆãðßñOyÂ/b¿ffÿÏw¹Æ6užqü}ÏÍŽ/9>>çøÛqâ[|9ŽïŽíäfœåB‚´„ PØH+–¤J4 ëÖ°n£í¥û´©û@Di”­ôí†@”VhR5©HŒ±/K¡Rˈ³÷=6¨•¦IqÛRü>ïÿÿüŸß³²x§ð °^ +pnyÐ-(­@Qv¤æèIÐÌå6ˆüp¹îéŒ fܱüp „s8 XÐ ›IáùðéðR˜ c¡(E½ž“j^©YOÄÚ8\ûZùxl ÙýîÂÙ€ôÔ;ØÈH}„{Š\!¨ªE‘…° µ4U}++¾ŠÊÊG|R1‡Â‹8™Q÷½ª¦6^§›QÙeƒ{«OkBxOô-¦>;©k>ùÞù—žOwE˽!“'”;\ZÜ›ðñÉNËjT:JÑKnñ~ÆE7CxÍ-hL¢ž×ýd—(v¤c–ítÿÜYgÔ»ÁŸu>ŸÑñ¥_'^×1-Z­ÒÁ¢è^h 9^ÏxÍšd‘²E¤ìqºdÑöÓªÖr„ÛN©A$3§VÛ#svºQïvR€ ’§S› . .åX& •´µ¤A µ·ç…ÓÂÛÂ’ð¡pK`Î P@óo ¯¸ÊàSÔÉÕCZ™‰œ¢fDXgßZ*#8„øŽÏ‚Z¥4C(Ü’ˆ×EIè× T7•J§.ÿóoÏýüPStø··œb9ZÌÎ}íŠù%wÞÇøó }ÍÄÄfBﺱtåîæ…Þ™W¦¡îúqgNMú½û׃‡«_?s%hÓ˜lí?íyï$æÅMè†^¤Uh?¼)›ôVk58-bÐâÂ*‡ÃêÕ™Ñt›”[½’àõJ$­ÖQ —Ú›ÍY/ÚB)† \zWK{‚¢²ˆ6d$܉XBNÜI¶7>ŽvžmH‹Y”Cm ô ,ŠY[`°åàùåž“ðDøÏåkåÏ ßd5L®ÔA@® ò=å2ì…Y—ëข”÷”¡€Þœ…³eBS†å<€l¸CÕœSwÏ9Õ4Z´Ây–ý®Œ”éÊ f¨ÌE’tuÁ®‹þö‹Z­»+É%²tˆ’8/’çE(>Šùeÿnÿiÿ’ÿS?ã—°ñÓJˆFÆÿj a:A¤25¶ h±Ðˆ¦ÏUôd¸Z¸ £Ñ(j†©1„+QdïN¢Ö,D®wÂgá”ñ×:$“6š3OÁËfæpl ¨GÒáÈÑÃþñ7¶¾õ×J¤÷ðF©É¨-Y; ½£}i_GÜh©¤þ>/XÓÁÁC颡½ûØŽ]“åëđ⻛ò‹“åKÇ7¼b Óù‘°¼[rLŠm³QïuǺ7Úž…ÌF!àËL™èK¶Uÿ•íŸzùÔÁ›ÎáÎé\¿Kþ QÎpPv2I¨)B”='\sÁ ÌÏ¥iYOæ¸×kfqªä 5À–m%ÅÃi@|~{>~:þv|)þaüVœ‰#Ï×¥(5”–Ö0ñaOƒ1s}‡!kSOrÁ\G».X ”oÝ"Îx#‡®—lñ¼gÐЩgö…¨f:¥’)êÔ£Áï·ÚYà”û$Ý.sG‘å'/O~°–ÔÏܸۣwðFN£S¿¿œ6–=ëãåâÈoÇG2Qg¯&Í&ŸÖBy¸¶mÙÍ}Ó×÷U¿¨~¹ð¦ïÓ? a<ºþ¾Aîà½rRÔ‹"[ÑW+,£Y”(H©¸E»VUo€ŠÛsÊN8 Nüç'ít¶¶à›@¿vt­v¡u¼È+eÕâT©”¯õ¹b <À2飞ÞPfd¸¬¦ «c±7f×[}ödz‹¿'>sô†G‹û GƒP¬Žæœ‰¤0±#…H§M‹N½·ú+xƒÜ‡Ný²Ž Y¿ÜæÚïšv‘®X”CÚERÅÌóK<+0*빊ÛsÈÒᢠ¡ß[=–“,¸)ÐÁ%e”·Çøä³uœL×¥Ä]ñ”Ü™z% CåXŨï« œ«ÇM™JÁ˞Ì"½­}&â©ÑJÌiލ!Qy’Ôkš“É´ã¶|¿ÐÿË©ÜqW¢L1"òìI0KݤÎl—–0Ì€23ASÔIˆ¼-Ó¡—Ý€d(Щ7/#Lr£-þƒŒ\’ͺšCÙŒ#j -»Zjya Š ºùø}jÓ“Erj^^§úfõut³'áu“ü¥ xdž¼¨ *‚yŒ^»UÄ'*¨BZÖÐ7¬JHj¾YlæÐã$µ ÿ¿Çï“«~üøN-;dïÿ®…`™&(T Šdš@…È 0$ Ý9¤13®æÿÃC¦ òíäÔ“Eê\5õj5õÜ`wï]_%!?’Ø€+@\h…­+°UîÔQÄsº‡…?šÿÝ\”š ¤?¦þÒÐŽswÜlØ&Â3ñ¸í‚ûŠ›p»Ó¬Íe;o»`»b£mÒö&ÿ:a|½Z‹Øµ{Ê:€Î;¦,-èü> &Óy—µ6HÄv aÔû¿{m1†‡f- }ÙÃgrÙÙ>ßÙö\çðÎÏ¡yàÄQWl\Þ²µXØ:  dnì1h8[$²ed&—KuöU¿º¶ÿwý&-£q^îÌò#€X¿þËt¹7qqüœ³÷•,­¤•äµbËÖÅk IkK¶%°e[Øb±aá­$Ë@ Øø¡P0:¸´™^€¤M§¤3½¤¤-4„Æ!Ó–¦í0…Ìô!“¦MTè¤õL2ahŠÝ³kÓV»’Žö¢‡ýþßÿûýj}@…Áì-ÊD™%V²ž1}ÅL›Ò°=NçZãª2 ªQ–?©²¦F“(NEU1UYšž‰«b<®Ò¦Ü€Jñýb4ž%•ÆõÍALÌÛlÔk­‘mmí¯Ì(óÊUå¦B* `‰,ËG¿E¢Tß¼.ª °“zN}Uý»JòjXUÕ¢º_¥X“J qH·ÆÛ×wes, <™¯Bhõl÷ Ïb#˜WÁMÌ+ ‹K¬Ì ¢3žmec¾áqW^e³:›wW«FnKcôsÇŸ¤2H,ú¤°šð÷: dJÈd˜LÚÖа,¸—ô@×èv4ÀU'wë l>\J+jE((HÿÏíõÓ2v èJ$±Õ×!GëPSíí¥¦†(÷‹ ã>Ñoм}›BAõ­aÿå6b:ÎòTËðò)g¯ÃâîẠêú$¤öÁ[Ÿ„¥†‰&GsÖÚ²¡оüìénUÆCaÆÊÛ›ÆjAò7ÖÖ0|Me×-Øú^‡£Îä`°˜Ì6ÆŒâÔ–ºîîÍ+ËM5€4PA |šÝs¦í¢ïǾ?4‘Læz׋{B/„.†~"CjpŒ( EÐ[©‹ÎL¥±0R˜/\-Ü,PBrø.œC•­³^s" u²Ê8 mìÖ¾°9‡›„è¯qc›KZ)WÂíþÛfÓÍ"³5¿Å½ض0#Š,Âß\›7Có»ðo ,<š}\~¬‡©YááÒÒRUÈUáaZÁ¸™Ð‡±A›¸êÕn|ØhÈñòø\yI0¶ÕØ…ÛÕ¨ëlÙÃØ‰v¢Yn^íÐdPG~w¢ÓÝ@¬Ú¼A>«üï—ñ(‡«p£u\f'#:ÖRø˜“q»6£Z_OÈB²ˆA,ÁÇ0ñ1Íf~]v‹æÝ3èL>µû•ïKöué3©¹Ë“ÂÐÞÒyñ»ßúv¸窚žÔÜ7zñ—_î®Å@ŠFhг¹©)øÓ^è´Ó¤ A~€2Aüªeû’w†Ä˜ïúto¾3¶±KäI¡Oéé³ó&÷º§¿3êz¼Ã³éXybýH’;zþ¾€ý¹¼ò9¦â ^ÌöIüýšü¦Lòü ë"¬[òоs¤îF¤»>¶+¾ñ¡ú8@¹½$IJæAš‘nJÄU J‹ðÖµ÷C0ô.üPp¹ª˜AqSêäYîÖê0k”i­»ÊPo¿ñähÛ!I¯‹žÐÚFhŠ»È;5-vXœøãñ×*']d87öì;ãÁ É"gÙøç½·uîT7\€mÇîQ áëÙüÙÃG~¸|ïrþšjŠ.œe`sH˜nP%Ï¿ñ»£0 _’ô9ǾX¥ÂxJ Ù¬äkК4õºD¥~ …Z"rÇî¢K@¢·"k‘-áç"¡ý+#ìÆü†ŽT†èJ³ßY¹´k¡­ßÑ|üÁÑÛœÄ𠬬P㔇[³¦=Åݸò–ÊΦððÀïx+¤ Ø¡}žË9kÚ›žNŸH“éó= &Ä&b312v^>Vä4rônhdß"|µÈ•ž²¬íÖv²$*.ÂB–ß>]°Y%“%%öðp°‚x‡¾(^·4Ü‘­O5åû‚›fL>?óŹ8¸ÛbIY­Ðj-¤Únà«Ûq­- 5“B©T!¿ûøôäA\þkÇÍåu×Û499Ä‹w6•ff¦ü¥9¼~«ðï)] '„G† 0LC ºße l}Xµ­‘‡þ»Iï¨Uû3z¬jhÂø…‰Ï>Gªúa¡Š÷²¾ãpˆÿzõJEÐ9Îè<ì~I¬“zè­Ð§;âš5)Æí4¼.ÙÙm ?=éÕCÿÿ_!>Ñ¡B줴•0>ëg:ž4§œ”Ûåµ[åP:<¼7p᣷¯oâHïmÁ‰ rˆMŽt‡C¢œm¢9d}wC´!Qˆ* 9KJ?{ã8a‘¼®/C¨ÅöelžÃõ.!^vÛ9†­cØlq:­í}G(Ù~=Gð On¢h³X±…¼ðÈìë³Ç(« cºA+6³²B^¡<à0¬Ë¶Ú]5Á“Õt.³½0N”FmEÇ3{‹¨b—uÔ;ŠF/•òÈ 9”»”ÑÅ몔J®9 òŒLÈKšCs¡i hs¬ôm/#¹Dz|ßµ¢S7˜Ö$Ç“”©†4ë“×n?dMûƬ~¯ÿ„ÿŠŸôû;’ûM0ìD‰çYìFº,ÙÜô ~3F„‘ÊÈû#äÈ{ð—€Åj|{Ó˜.ߨ&Î;ŽßsÿÏöùlßùÎvb;1vœÿŽíØÆÁÁ–@Cþ°%wØ&… …Õ„¢”$„ÐÑE¬#j”UËVX7ŠhÕ¡•®Ú‹U›Pµ½ØxmÚ ¶½Èª©RÌžçìPrö)öcç¹?ßï/¿†œcCˆ¡àE¡ (ËZ( 7Xºlº¥” MAO­Â$^{šG„­¯®åWwÏõH9£z*‡[¢°bÁÕ  Bââ‚–€DƲHÌÆ,¹©4~Ùuؼ *—*ZD')MšúÉ`"¼½Ýà!¨>ýÙM¾.ŽŠ8äâ&a@ªqÌœþgaR Kõ¿6­4.Ð~«d¢­õ[.\T£F;O Gï<]»7É;ì%›)c5 (-ÑÈz9£RÑR „ X©ÉWA¢÷Šã‹D¤—ÙÖEI¼©¶žþÇ«+ ×l&Mt'e‚v4 <ž=Š£ƒ‡$„•Uücoq ƒ†³„‡!ŋрl¸ÈÙIZô÷ò¦>Q|¼W4™pÂ@»Ì‚hM^ûŸý‹új†°w3]†!g¿khÈvÃJ1O%=>)ž û²õa­^kn–¨?ðÃ{¥á޽D´¦<þZ¢²†9N•™LJ¨ñÖà5…Ê\ë}p cMYæ,©ß¤ð')úêËЃÂ^…aÿmËêúª®%è›o1УåÒMYM¥¼Ê½]=n•lÏå¡7*Ý?±VýÂÊQHˆ~ia3ëµ ÝI½"ý´­ÀOŒÈ”™±1 ž—¼mÙCïG>ŸÝÖP,lc¼Os38<|¬¯²ú';L ÀX(–¤¡²ø×‡~×¹¶ºù;‘€eQj:ó˜|èþyPSðlº‹‹¾Tüæ+ë°Tµ œÁÛ6mvÒ,Š/Âe3š Šõ>¥ì2¸Ê õ›ó3Ó×çÝ9BµÃ«“Á8ú]ؼ ~”ñ[foãÁå…›#ÙÆW³ƒÙ}ײ—o##Lgg¼äÈVß|Ãm Û ] u K“KO–ˆ'K`iéÓFXRj‘$Œ‡µ}Ú0>«]Ö.¢Ç—0í¾ö)‹=¯Î›žxíìéãcgú^Ÿïí¹Ñ?°ïmbášz¥9ýàö¯î1-¿H¤—;Rím+f¹4¨‰A¡Œb­Á]/˜!bÑ’m ŽìO^ ;¬Pr‰JÝJ RlD(ÊÃ’ÒÊɆ/‚¾r¸ ­Ø‰Ñ=µ™¾`<Çúç© BJ«øô÷²J^|cÌDçûàébÌÐJOB)ဠ+‚B…™ %¿ß|fKEÂ^ý†Ýpò—2T¼•âÛ]wïøjp€Ó aÜtT´â´LÈ¿,óS6«¿Æ]È\ÒMë¯À¡0q»m QË´l¸70e–ÙÓoaÜÒ†b Ç0œËV):H¨§ëFšçÒï”EŽýadŸ½žÙjðÔÉ”ñ› ;uËîï5´ía¬ð#3IPnÖd'EÚ9‹Ri–Fkd'mUa± ›)”êŒï|ÓJ'CKN’Þ$`‚E°D°J´ ’ÕÅÛÎ&jòåÉÆ7¯œªѤdäéfÑÆtÿÇß‹íBÝþ0»ù ¶ø{W­À•£–W—)øŸ²È¨‰ÿ‘rcØ™X}.™²¤Ñí’&g•h6éÑÍ…cZ»¶ íìÛ‰ûÉüç£6€%±6LòäÔÔsš#„95 m‚&d…aR:w>‡Ÿ›º~~fš˜›ÓF$MI¦Ó¯ jÒà öÞâÒ²”LoÛ>¨Ìνeìù~gƒèÏöaG‰ëÙå>­[ë hNÍ3¦ÓNÞÔ–µÅ܃ŸdÙcGGû„A_ÜÙ=825ËõOü +¤ÝÓpm¼.|ëbþêµ¹h2ž0_²qFÁ 9œ$³,06 ‚`p|>”èëí_^f°ªy0_¸„.嘨gc\MÕ«¹DŽ¢H¡ \ízÒ…ÃÁëVFîïÆÓãÇÇoß§®Ž?Çoƒñûའ÷åè¿Gqï(}b$„ä§°ûžÈ¯Ÿ<‘‡­æDfÒS4L• ý¦Üÿ3]ö±Mœw¿çÞÏ>Ÿïüv>¿¿‡Ä& 1BRîIì,%¤%!¹Å"!€ÓȨ )EqGK`*­«i•¨&Õí?lÓ˜ mÿ˲J ­Ë¤¬ÒX5þ LÝÚ?¦Ñj“Fºç¹K²ž}­ç~§“ìï÷÷ùþŒ1ÊÏ6(µ.(i=çBÇÐ*·Ö¢ G++ëïGâ¹FuZJÏ7$Ï‹‹ó Þ$?ÜŒI¤¦  žFê…bÜ33$S­¡Läo¤COzm[·x¸ŒïnèñŒ±v˜Ákû޵r¤R.FRÆÑºÑ ęڵž€0h>ÝOÀƒ2ÿ‹b¨>stŸ‹G”}·×hTÉñÌ«/í© ñ6‘ ÔçYŽ’SîìΨ­\G°»ÃîF¤"ÅÀ?[:´õlÿôÕÓålË7B°—0\DêÀÉÎúQ÷÷\ÃM"+RdjKÌCpöâ*I'¹ú7úÎׂ`êÖþŽm¾î’s»wùÍÔf{(e•䉴ßÍÛwã P°ð!Av±¼·WL´ÊömOç(n÷ùÖ°m~'ÇXq`“6ޤ©ý¤%Q¿·øZÔŒYì_þ%asxHš#à ¯À¦;$CÑÂ{íÚcãh9À]ÁM[Ô÷Âð˜â´º]V2º)¡#k1’²SQlû·?=paàû×Þ ºº°Õ•;@öe±îcCã`øpÊ5Ê¢„×Ú}èpßÇù„Ò£ø¸ž×³§†ÊC•¡êÐ!ª{(Oôç¶Öw¥ÕÃVç(Ö lüá+îmGm±ãàÊ`pU1®¦‚G73¾’° „™úRú¸Ý“kÍ }'û‹%‘é9Ø8!l?6SÛÆËP.š¥–ué#µ›³ É'ÍŽ z9Z€ ªÝ m‚ ÊYÛQæZ“§ÿwÈßè¯0sÁGÉPŸ»WUh„•hå%£›P42µÛž¶ÔÚhœ8 [šŠ*®¸³’Åûæë“ÊN³V:ñ"Å“fƒÆ!ÜHË¡VõGùNw,éxC†‘éšmÜ ×êõw~w昶á:'Þ+–¿{`ôøƒq¡èq›…äxŸÊœ#XkPæ*#PVªÙfm[¶íU6¯&BTnM êzÊ÷fN$ xš`•­‡*©Ã0¦–R°—ñok(ÇA¾åª·ªT}U5P VCÕp5RZ«±kñ;òïåŽoÑ¿`}Kò’wIYò-û—Œ¥žLZ&èÊŠ ú&ꃹâ­(ö1_Å_ T‚•P%\‰T¢ìÒÑåcËÇ—ŠœXzniò¯SìÝÒ½3ÍÜ=»|dyœ^,Ë‘Åè½iúò‰ׂgA^ðþ>wÁÏj²æÕ”NßÅÈ+1º,—½e¥ì+ûËr°*‡Ë‘r´+ÇmÜ”íö×W´ÑøÔd$.LÍ)„CÁ€ß§xe9ÞVÒ&§æ´\n*?æÊçǔ٩©Ïãðo‹+³çf§Î¢8Eq¿š}0‹ÇgÇ”Õt¡GÔçt0Œí×êÏNBö”õg‘qR˜~mÓ…agFoºŒßƒ©ÉxŠ›m¼¨^Ä{J9û`x,åµÁA,‡G·rùŸçAþ6øLsSØœ8÷é1W:J”PâîÏ‚Y”6Ζ:þ®‰ÕGÝ¡–(ò*°½ÀÑ£`ÐÂ4JA|\øâ‘ù Ä4‰Š rÈW0Î!—æ…†$‹P@AÌ çá†7) (ôÜHô iÖÔØääOã)ø‹¤6Štà€.óŠ+ó¨mÆ™XJîÄLŒ£`XaÚOvød‰á¾§@&M™(§Gá&=œÐc™´i6Ռᶠ¬q" „€™"hæÿ¼ 0óµ‘Fá^­¸àÜ 0&ÕçcÞfÇ£§"^Ó j,ŽIªyÊúCÊjÄEÁ¶9±gÚq€äü÷¶îâk`:i­“aÁó:þû‡Þ¸ìðºŽ& ùAþ‡sÈì¾+îËxwÅœÉüÃ,Ó2Ò´ë•2Ó!ƽãà˜ˆ2WRnšT¤0aìrE»¯øWÆË›Ú{CÞ`~ß%àÝr Z&^+.°!Î!\!ûêÇõ«—û_9¯Y·[æqÐ)ZÙÄ`T)~÷Ÿ,º[ï*›ÁÕ¶²)§Ð$hÿÍjíêïŸn—ùn`G<`¾~H¿LÉX \ÒJ~QœIŠÚrÙ¯j?ñ߬';µ‡ÚKwPt‘Z²]ÒA‰Ìvtgõ,–Ä.1û•ôß,ußÿEòY¢(½uú‰p‰²Ô&‚„uaYBÊU¤oõôj’ |žÕ\Ù¬6 ¨ºvìÿåÁèM|þ†…¡qØ0¨Ñ¡5u!†]Лy}æí"Qj —”Rïh©¨@tÜâÂh‘nC#Ô¨¢Q;Õƒê»êmõO*£©Õ[êC•T?)b¥“œØ ZzQ%rè³"ø¤vskPÑBíÿÇ™GöM>]ù¦ÛÛsdd£ÍÄëH*(‹Am¥¡µí”§ t}°·ÑbðÕ‰‰Û7éÑaG±c}61aÚâ|ž&p†9ðVàçÔÏ”—´ª 8aý8IÖ”R(³Êhj.ãKz XÖÍ÷Ò¤’ àÑ¡ÿr~õÀ*ªïjf“QâšÛÒd¡«ýìhrð¾H¶Ð_§ pWXõSжjk_ßy`¤ ˜‰ 1j†bÜuÔ/XÀÐ:~ü¥îïþ¾¦Æ‡P—fšf­¦ „tö‘#']íÖjk§X= :%ÇsvGµJ[Û¬@üÔèp1:©—+/V:Š^$Êö¡’ H5¥fèOÛl´ªj^ã2Œ±rM`Þ¨¬!5ÑÌ\ªªîg‰WÐa…ÂX²„—ôn°ìî W,À‚›;š÷6Ú´ùrh,B&ƒWP–Ô¯JC ”|æ{×ÜëØÒlÄÛï$‘*QôIŽïI;Œeà„Tƒ`9>/LChu<¾¹ûó‹Ó½'~±ï{—»üÒ_Ü™yt¼¥rrÍ»öŒw§7´Ž ù Pú–ÉÉíMTÞD™Ømû;jógÿóÌ@Ïl×ÐÑ–·ïÿø”èÑ”nÿùÌïöÖ7Ù³“«Û¾zó©õxdž ’~“®#6"wëÍ~`öýpªƒÆœ¾@æ½y_¾>ïÏh£×è3ÖýÆäC|ƒÂWïPÞ`ð†˜çE1ïÝæ{èî±Hê'Í;Ê689¥Ÿ´m.+õÝ ÑÝm‹Åb»ÂŒ2’ NGŠcŠE/ˆÄšÉ¨7)W~v¤0×?¿gwï®M}J-«"<ÉKWf£‘ãTåM}»æÇ÷Liµ}ªÙ%Öõ¤ë”ëG.ªÖ5ä‚.WTUXè›RE+åÕϺ‰SVªœ,¢”>…OðK(éGÊHòUB¾²Ü•п‚ ÕZ> ñ¸ü&ö*Œ~œC¢‰‡œžüX3hš 2ž™ãHFñêŒ*F²$Ù}P£x¿§ÞãÇ­ð?ËÁ}a²HÏñL½}Ü(h5$F€}ïâU Š?ÌzÛlFÜEAHÒÃvHÅB–îÞª–ƒ ‹~qäë>d;ò%««€oÖ _QwØõî!¼=Æ;×ðQ’¢k×¶SümÀ¦þF¦¹‚‹Qó™'<6_*¼)âBrFG§NËòJÝÈŸö•Zw”¯&54R+ÁUi>:¶å•©&ªÜÚê1 ­u; æû}›~5£5AGàÚ{¥ÞÜdJÆÊ¨á øðlfÎîçYš;6²#²‰töö?É«ta™=¡ª¦Óµfsº%ý›º*–gM¬™µP>cWš9îFZäÓiˆz±N$Mé.qTÜ"nOÓ{ÅçÓgÒïˆÒ´J´‰¿ÿ–¦|b›Ø%ö¥©š4Óf’kõûµn–¨%"CPCÄq˜x’ ¢S½ìf.kËdkÙ­\^Òœh¦l¹èœ œ£¨äiÂlçÁÛY[.8.úÓÇsgsWr$‘Óçv¡Óåó£Wÿei~5!`Bºu !TK3Cj0ä“òJx¤Hc}·”pÎÀYMt ¤Fa„é·Ä5˜^œÏF=n™àñA²›úë½ô#ñ9¨Rh(U¯&Ø:³'ÑþŽøFcªÑÃ…œ‡ŽmëÞ´/¦¥)NEuµý÷‹­‹C]¡Êñ'FV®E§Ô¿Ý][FIãBaë@¶££ÕXÒ{6LOFœÃ^Þ£SS¬Z}(g¯‡s–xÆy Õ—ñ/ξ6têšAE€Û4oòtØYïÞñÏœP( ¥$i2r:5A«4¥z¯}ÒÑ.öÄ&“ÞÑI”ßrEŽÁÜ«=7ZÖ8΃X6TàÇi`²˜+Š ýÌ'3Pg4Ù)S}C¤¹n ¯Y›#Mv–Œ8 :Àa"&ÀXVWÊåÖv¶®Âã¡Î»×¿? Ι€é-Z–bÂ*@km¢B£¯~¯&T…S£oPäš4ë¶ÿ¡ó©„=dï¨ CWA•²öµéº† VMD[Û¦§Õô¹.û˜6Î;Žßs¯öùì³}gßùŒ± ó0ǾÄ3.0 ˜ ¸Ø.$!)á%1ÉHh@ÍË’ð’Œ4$ëV6T)ª¦­Z•Jk;Ö,ª¢f[§fê´?+mÚ¦´Ú&mL‘öÇØswfjÆùžÇ~î8Œ~Ï÷÷ý|›X`5«VÒו‰3cÕw fœÀ«]×¶?ßþør:@‘€¥ŒAƒÑXg ‚ÁcqñœwàüüF#Àí®S>‘ÝÿqL¥°àÎÄG]é±<’®Ê~ýU·9?Œîk¡K3¶ÇªŒæ€b‚©‡jK*{rmþу¥]iC€öØ>,ÞÛ\11.Ì"AòâEAÊô¦¹œ4b™ópg}ùÞ¡ÈHKý}¸=ÂH Ò—©·e.|*>7ªí€~мvj<]x“Ïnzyúì‰^z«j%Ï,¼šeTϱǒ_Â;5ˆ•H¸º”Y ?P‚ƒÔÊ Y‹(¡´v­#‚iu§ª£-BsT¯÷ÿÒ ¯%^½ZîVмº¢³sÍÑ+BÿçmO´Û•¿p3QëÛ{p`lpϰ-há$ã|¡—ÌhßGcÃ6¯¬IQ ¢†ÒebåòãåïÿqÖÁ«óŒ Ø0 ¦&n08-'||ð¥þwþ3óBkyØeIJѦ×ÿ[㼞n0¢~³ÉjB0 Ø+\ã…îO¯†ÇâƒKÓÝ«à?vzag;Ûù7ñ2$AäÙhýƇ¦R‰ôÖÎ%¹GêJûúººf$2ÏÔ´aÂKþD*ÝÕgÈ ärò6Våê[”z¥ Íý5õm 2"¥ÒXíh;ßÕG0÷Á©™lù~ä"‚á€"žAyšé^_ªœ:èUƒç®·÷¼ê‘É/ñþb"Í'饱֯)µj<Z…±V½†mѧ£T.HÒ0y Q®êÍX(L™Íª‰Gw Ka*BƒßeÆf ÓÂ'åùþ.tÜVç0¡þÀÀi¿{ï¹2 8ÏKƒÄío ž­—œsÕ‹íµ"¦ëœ!š«09»Ìláøo† ™Ñe4ã o‚zøø½íížÔèîdÝJÞÃYœ$.O›ýVø±ÑF ©ÇÛï7MÉì û·ÛP´¼ãCð#`ûÐìr’j?ßù µ‡°!·Ðœü24åÓ`¿î$7áCj–Î'ξºš`®ÅnoÎÞ+Þ›%*…°»¶¬Î.ŸLÝ®ÎÜh`48”›\&1 ÙÛ¿*ârB‘˜—â I÷ÇGâ#Ñ‚tUºZ¶(Šñ•­Û?W–}[;Wäã…Å_Ùââ¹B”/¢7VVΉ/ŠÜüÂÂáÂ\;D®£8´Ì -ƒÉ™“x°a̦ô@vpè¸)ĉRY4žèØ?R;rtþê ÛÂʲqyŸ²Øœ£g”)eººléRzhS¨ VBÓ¿€~‚'/ëA3'ç±bvl| ýý;z|?2Ñ?0\˜,\/Ü/à0 ðl¢#Ý5²HÊñLLbˆÂ/®kj^]^15n’CiÆlãnÁ`C```"Û°w±— L~Ày(Ë@Î7fœý]ÍfÁÄÃ#[à¬l–‹cÅ‹Å7‹x_·ÀçÐÉ€T×.ƒ‹àÔ½_Ol1í:ët¼{ªª€û¶`‹éŽ6[ÐܬªM*°j¯§Ú3i2–´&´›w¥£ê΢ª¡¥ç¦Ú’jÔNÏÍêªöAKS ©S·H¨¦Ý6˜I±*-]UGÕÆ /·:Ò-j7ݧq‘¦9õ!m- Tµa^¥é*ªë¢Lá+Í–"QŒRUû#$ÊÂç膬 ƒM—)ÔÀÙC4IÛ`§l™¾]SNS$îÃ}íÂwèm¶JÉá0²ÍîÎ&chWÅü9—ÃgG1t:Ì5/áòŒzõÝ2«¨µb”õõ£Œ"ØÖÄÿügÇhÆCœrÛ x}ÖtÏxöµ>±1“L=k¼Ç³¶111“xx{ÜJ‡6‚Ûã¯H¦2‡NLÍœ>³¶¾ÁUõŒž½†/g•< ˜›9FAº*Q”ft9wIYP.ÐèCO_?Ö'3xì ¨ðøC Mð)äx;5Š…-ùõ)«pöl>s¼½öþÚ/×°o][ÛÀg7‘+w‘yë<:?7»jß»reó®u LËVÇêæfþnÝö†Ñðœ^•]±XïÍü›ù{y,?7¾úY/°öÎõ¢½[wŸfuœ|ö´ðDO§úXØå Ý›4Z, ¾/èš„2´>yª:Ö? ÕY_×è²d]%½=¯¯%Ëÿ¯ÀA]|ôÈ œõOúOâ‘jnd/ÐÃéÐÌJ%†ZUB¥Ü eªsú›5ÚQ3‹h‚4+ÔéU *Q5Ç@·kèØ«š#„YÝ9½ xC³C¸o‘hÛWuµJ·SÕV[™ SdÛ\„·ýÄåoZ9”%2€uɇM±ÅzÇx†òFj0˜Œ‡€l'iž\ñ[.¿™Æ~ÝWå>‰XFH-˜†äOBRí=h²@‰9ëzÎ «uåÿeºêcÚ8ïðûq¾;|¾ó'¶1þcÎ`càŒÁÇ@bB ‰!Œ:$4Ê’’4ÀJǦ¥ˆ®ÕöÏ¥™–uÊúǾþJÕ4é*-[öß´UÚÖN«´UK+¶©e›4¦©Ê0û’èõ½~}ïéN¾çù=¿ç±csÓ³ G|¢RôHü‰oa¨êoUÛf‚¶îgúrᾔ̻Çc†u€ÇÆ,Xc òD¥&«éÒѯ+nEA‘ÀraÞ.²6^Á ™]A>¶öN(¦8Ž+,{m;Çš–‰Çj³›y^[äÀÓ7¼÷R½M¢Éª†¹vVbLp?· *¨–Cè;G^™>Ò5Ù#ï;Ûa-k3zöˆeç >¿Š‡ro)…ÑøèÁ™8£ô(%¯ 2~ÕåUZ©Eå¼t„FÝѸûÂêŠ}Õ½ºFOì£Q÷hÁš\cDW=ì' £cGVVÍS]3™©™Ùütf:Käi2-’sÓ³Ós¦ÙW^*x{2[`gfÓåÑÌÑñbtÂjQ–àç.¬pË„[]cæÑà`~f| iÕy«üd“SŸ(—‡ÑÌšÙ³ñߌÏ&xù-µzÝ˦v5JJ{hýªé­\¦ÐOœé‡ÖÖŽª³§ëÉ'zÕÿÕ`ÎuV‰\5}Õ‰wðÎa{œñì|‚ðáf(‚ZwªFƒæþj¥Ðǧ‡½s¢[-ƒ/Œ!–™Xì ´¹[9œoh0u°œ ¨¬]>Û9Á”ìÔ"2ÍŽæ:ÂüZP’j Ó"có1ÛáµåÀaÊ0¼œ:)ã¾8èâQÙŸrc¼Q'a&ßÀÿò)6cUÅϱ„•M„Á„$‚Í|—…¬qðZ²UšÙì6Ô+ùUö[>™­ ! GÍýFh9d”‘]¡µ{7ze‡ Ð.2Q†¡ë ÁF*Ç„’älf¸véÛ×ÀDX­WM‡ŽQž³ݦ 1ÌÙ*¡û¹ƒ&íYè¡gèéÌBšô@:ÐC9Êõ )*wd2ˆl'DND«»}ÔâÍg†úHÿ˜ßІ†¼}Óý3c·ñ?Q„Xr’<£4=2=fªMÝyg8ðS<…üȧršÿç>’Û:2ýù‘CGD’H ïÌ’äCBß%øK ~r‘Ü$4C'Ê'Ê‹K[™Ð+•ņ±U¥ÙÖ ×CæØV1SÝ£¡!Ë ã/_ÚãZº¹[¯%‰*sÂѳgU@&a«ÆÂN½ ˆh¨4‹€|ñÎ>ìJí#i½óÀ«¦f GÃlU[“tÿ{ýª¿ýÕç:5Õ=µP¹§Ç|§‰‚tqÙ€äÐE_Ä©{çG/`A»·Vþþ‡ÏïÛwbHûòµ/” A³Û*W.vúž[tTþÑä­÷µˆ‘x;Æmñü×£ºûìoW¨Nb™(Ö™ƒ& ¼,ì´™÷GóLåJå/ÏOK¤^?v¾/Ø_„ð ’F㕹Ãʨ ½˜o<†¶qžP¨1`ó¨V‡³EêhÖbÑXSGXšL&›S |äÐ&%µä(yJÊdS)\  $ÊA< ùï.âü¨ÆÀíí°³ÉvM$”¬’ÍÖ`xø6™Ø2ö:’6=ØY w>ìôc£“¹ ní®ÇUÛÔÜŽ¦£Ý¶j_JÃô ÏEXî–ÝL1Ãgƒÿ…qã|·¡•ð¤F/€‰•耄cŠF>y½þû÷]¹Ô(FÌn³MdC²Y!!þôŸ}¦“lεxZÙ£lÆoh¥ò Ýf¯ Šâ93F”ž#˜Ž1ÚÀïý„Ïû&Jl$û¿ì#RÙ:qxåäý²W>›6ª©µÒ?…<ׇÞÎ¥êLAr^Œžƒ!‘„ꜾzËݤjo7êèJèZcj§qή:ý.UoëØÀ›oõr¥ˆ îpÙàPQ̽pÄ‘q΃ü0ûPoæ¬qo2*Å?ºÁ(òa„DH;YC·•½paŒlmÔP “êº  ch<””Õˆ ì¾Þ@(Ϲ €¨WEˆ5D³æ"`D œŽv⊅ös-vŠÓ1ìí¥ð&/-¦rK_ó118÷ꌙ«6+ÇÕÛÌ6LClå÷#ÊFÃý†Ã•+É¡©"—µ˜­Üಈœ×n²½ö‹Ùý?º&OýJ;Ô¢˜á_#×{qèT.BX†Y¢ÄNáî,Ç-!lT`ÿ“ãJCè~õ‹9¾sB@A 4E‰²Ç ð*Äõ WÖóiFÙÃÙ05¸1à-àkø;øêÊ+&×ÉovRU¡Âªö%°âÁ´BÕJ+‘†ÿ{ƒl¾‘Ç~øÏ9ß9Gì¼¥VÖf.F ÜaaõžWO”.[¿?#%-¿ãhƒnntijúh¾cl4L¹N†¤ë}žGê¡­^ÚÙ&(]ç×à¥ïß¿âíöRòsë\´#Éø"‰7z ®Ý»ÏI¿.Š%±IìA®@º~`ê„jIÖ±gD§µ¤&%Vò…'Ö,ô`ÕÇX˜M¥ Šé”t¬Ü‰„“벡̦+lEæÆ¼cøXM¼FHº0Ù'ß•‰å‡2~S¾'oÊÄš9ÈM@^î4ªÐ‘ꡨ¿R9DAm¨ 8©ž„9Á¿Dw‹*rD­jÐV:µwÔHè- ËI¨ƒôÖEnîG м$â­:‘ìï…(RÝeßõ³@Źc†ùöX°¶¾¥ß婸••w:y[×§qö˜ûêÙžYGÀÜN3£Wò=ß ?òµåq7Ûõê훾¡ØøÙ¥¡YåÆXߢËZôî’ˆqaÒɇñ¿/ÃÐùнójçt¡SèÄF¤ÒûÅ8Ü ÅÝÄ÷ˆ,‚ÎÅßbþÊàÿd¾ìÀŸbÿÀp Š7¼UKp¶À:€ÙýµM;Àìvüžý…·?0þ×a=ü*¬˜f­*¢ÀÊ#:±*@^Õdo/dß0žˆ£ãB÷!¾Mf¢Ó$fy½ÃÔ¾u÷ä§Ñhæ[ºúÁÛéX׸ÃârI‹ïþê¢Þa‡`«" ÜÉÛGÆ“ï¥öß¿]©§’C©\¯Ýöþw~ò{#ãÑ€ì:´û/r^—Á*XûOî¿ žž¦:÷L ˆ…tM)ÌåÇçÖfju’ža•úŒº¤žW7Tò¡º©n©„ªŽ“´ÆYzP%‡’¾h8쉮Bþࢢít]ÞŽŽp°»; —“¦«´ë·Ðp’ ¯±ä {±r°2t5‰áÏàgjÉ[Þ2PËÅòñòÝ2YFwŽÿ¢z¡i¸Ýhl·¬h;ûÒRZ«.ìÅmS ªVÚʰ(­(§@ª¢SUÉ ™ =G£`rÀRФ®Ýæ°k…í¢‚Øö‚Å^Ѓ;QŽ= h4Nò’Æaô„èûŽΜ; -ÌÉÖìQÍCëX˜ðaÔ@Ù†hm–‚YGwE¿=àbQ×å„ÑåüÕÂJüÛÎuºÓVŸî)î Zï:¿G_GÏþ,ÚN²1J‹?¸ÝÀY\WRîø×†Âäõœ+mw'ú»Í¦BgœÕ’£‹Agöò¸E7fÕ!j>½üdçKÜÕÞ¡Cû.ú<=™Cc?þ²db÷9±FÌa}Ð]nþ’ãMÂðÇ»/° ØÝÌM2F%ðÌcæL„ŽÖy»]¨Ì+˜Ú³NUi:ÌLqAå8ˆ×L¦ RkXp#x/¸$W‚σxðA aƒ"Y­6vÌ­zØÜ5|«ò6J"fG¾ùÿFâ™LÀÖŠÜ!ù‘\èUÁýÓ]ÓÎØÁþNqö7—‹ñÑú!ë>ü0螎Öém!ìncp±ì*-pVw»4SŸÆ˜ ÉËs9“UgðöGM–Éå©Þ£«™ÓÊ×OÁ< ÷H #‰ ®«1ç=ãOz+$•ýΉIaÜ6 *KcæyÛø¼ícð969¡?Ll(T¥¾ÐýùÝ>з sØÜ’áü)0¸ÿµÙÝ|if²XH¥I¦ÍH™y§à×ÁºÑÈPÉBq~½D}Ç@¹øR¹ –‡~Xp!0*<ÏI7¥-‰ÈIŸI¸ôü<çÅDŸøP|!’<b"‰⦸…î·D\Ô¬âAj¦BíÒã6ìNÊž ÷Ú“Ö®ÖD¦Úh%Élókícv(š•§%è²n˜“2î—͉àT¡h5ëFë©âm‚Fîé–pi*hø?‡´jo¦Ì–d~øi* øŠ%ad¤ â*Å“g–ȧœ#+S“'‚#aÛ¦ð¼ÓÛkÀúc5‚ic¦¬Æ`ƒA¾›{Ál"É ¦ž:qè½—fmB•eø6#ó‹M+|¤w™é7þ¬º3ÑXÁµqÇm±ùëËnȆ6½µ2ë ûhN±÷lå˜Õm”ÿ†&Iæ¾øÎ.ùLu‡°Øel7×2^;yßHÈT1‚eë \ø©oÍéäò\½X_ªß¨“7ê þ¹òFöqÏe7²x6›/V#îR5_®rtžëBr‰Âó5Ì †qþâÔ!p%o /Õ¸z"r! þ6âÁGFÜ\›Àp*ȹÁ†¸Ÿ2^(*Q$Ž+ÄCA)/ñÏ`©’W/T«‹HÎU´‡w0+È(*ÈUäpa'_)\FôÌêz@l¼¬6š;@ :´]Sé& Pæ)MýM>„$-f4ÇæâEÈ'4¹#˜pÍTáÿ€8$Z=h§{pk+x@JIÈrQ×çcŸÔ‚1gæ“÷†£ö¾P"TIÛm¢‡§Üc]byòõ×GÄ€Zö›]zSr–ÍšÛž/½ð·7¯ý%Û; îŒ/O"±"M´™Ã£ÇÞ-õ JgâÈ›?Z¾}DÜðƒìXLOPó§OéI‹Éç7[X¿šŽ˜¼øøðÁkRš Mr/Ø|Ð.HLM-®æ3ýƒ=ñ¾iðÇ‹ÿ£ºÜbÚH¯8>ßÜgÌx|/˜q0ØØÆ 6·€`ÀHb&ırÁ)a¥Ò6‹7]mÔD4ÝM¶Û4iUe¥íEÝTÊJÛKÚUµ<¤}ØVÊö¡/•¢îCÔH+E[©t_VÐ~ß IS1àcàœ3¿ÿï|ã¯PÜúIï\«;õîtY³ág$ÌòøÜh`¼r'ˆaäª;‡}¦NØëÎG¾#Ê\e¼‹ÀëË™“½-¾¹VƇÑNjË|VëÕù®H&œŸ9V9IÔZ| ¼`bÏ8i{&Ó>wÎ.|‰Bc-"–{ƒ.”Xvîn„ÇŠ#÷q\m™ ‡£þZ²¦ÖˆZc¡D‹3Ê >Sº£ z|ñÁ èßB}Z±|±¶ƒúnÙy\†ã¡ÓMÀS#ëá¯^Lyë `ûâ <²OõI±<•‘èo¸ä„Œx{Úù¸èd u™qî1Î c„¢tÈX²`ÏHu¾ó¢+-ßÊ I³LùYF9Nòtì^pË}EQÈà‹7½´6,p€"©¦„Wd.‹…þöáÎ&§ä!/ (W>“ýZ„€)bkïqr5›ºv‚7“,É‹}“3‡)+Xiþ]§§ED§¡š‚Mî¼—Ûß{h ´ª~çÏAq)r¬É àÇpÂ%°fCÚ©·þ}þ¥®ÁŽ{×sQÓ¸§ þ•¤›7;(Šæ6˜ï-©Ö„õa·ÔHÂì¯ï{ÔÎðOs] °¤&hÈ\ ¢ÁŽö°Óeóû1Á‹&À‰uÀ ÂØIš'‹ ¡h¶¡`‘œ‰F¸dnp÷œ Ë ¶œŸBR¡n÷C[ƒ`x¼³§rÖ½F£?[÷Œ¸@–œ…‹Üñì=ÆS®[2‚]B DOè¹½¡žv;%Â4ƒ°c¿˜è<¨Œ’‡®ákn;zD›r§¦‡ÇH†T&¼àDeùn×1ò^f|*Þz |øËë#"ãM˜š².{&•xWÙ':©>ºÝ5´ñÇÝ3‘V“‰„1‚S +ع·©(fÂ’ØU5k 4Õ…G†{B`s65›ú(Ex§W¶Há¶Öäõ*r´ni¡%³Œj(¡J¥XSQx5 køë­€G ­ í1|.vR°XÛÛ X4£bÏÒ•­ŒHŠ †€ù¬b´^08Å2D ”Z‡ª\ÆBÈžÒ &àßšŠÏLõî_˳_w™hGrJ±Že8yR¡EsAòn_Nî›™Ü-e„ÀQlcýç2¾µIÿîõ©o¯=)´]úà'“ÀWÂŒAú(pI:D%°ø¹úWeB©(U_íoÕϪÿª0ÑÀæÈF>!MqŸhš6ç)¾:_ŅЭНŒŽæªÕJm½Öà‰:ZUk­ÁàEµæPÑYÔ£r¥Z;eêÁmšX©_mp/æõtuÕ{µ¤ÖsP+h‡‰£g/hµõz÷`‡ù`Gg²pHÍM,W„¼/FçÏWW/uo³¿æ9ÁS¢ÍI²± ‡c#/Äù‡óŸÿ|þ?ó”8æçóçO—Z‹Í¿‡MôÃï%˜¦ÿPÛ˜óE¬n©ûëÉ:Yo,½“ßÊ’ÿ4ÿÏ<…åAþËÆR‰Am}êî6LHËvÙ°¨½Ç©lmw6÷¬³ÊF›õ3´Þd ‹B?¶wRðZÖ_-;r òJ<Ú°<3ï·Í-¨|µRYÏ:r¹Ñ+TÜ5ÃK†n|…µ<`\a÷³zÒ°ò(—Ë:÷à—=Ýkí uÕ‚¹«“ÓŽ ÈHGõa5…#fE€ö§BÚeê\ÏÞ'ä¨ æJ2|{Ððv&ÄÀ[ùmmìÇà4`í<ô«T¨‡RêG™±fÁ"Ó€˜æŠÑÀ%ÑâäìHë‘?¸<žéwKØ2ŠüÉwq@¹#V‡èÜÝÉà0Y‚ à̱ŒÏÊúKžA2ËÑ8MJ1ð³þ(P–c&§U`Æ$ I³ß=@ JÃ7ßl9Ó–qš’“Ì /ŠÅMosÛí‰o¹Ý®é››)Ö/²"#ÂM€ðÊÀáû çj7“4·2‰V³ > FàÇÒØe5Gêqk]zäÆâZZKñÙÞÙÞz?ï%ã‘Î6¯ËO V‰àívÞך.bþb+_¤ÛŠ­t‘íl´–°Æ 8ŒYøÊ¢©ÊÀ<…€-?'¬ÅpíþÄ ¹ivû)$ʳ¤L[aàA¤:uÇ‚M•m°’l•%ÇsÖ vËÙ6u˜.‰Àgß‹5sHh¹)$ SøìèR{}*%’¬à™ž±ŸtI”»‰å¹ì>vúÍ LÛwÇßrEm³’ÀÛH þ7‹` }—¸ˆ}üRÍG”iåîÔ‡Sš¢<þÄèìÊ¥×/sëg±î´ª¾Êà7Ìuñ‘”ßhgðú}Ú6x\;¥xC{[»±pôlýÆú†o¿Á·3Né>nUs>¦|ô_½ýþí­ÛDw"RG‰‰ìì¡­L-ú k§V.«Ë¯_¾zÜlx\¯¸9é!óoc„¢OÔ°®^P³t†ù óGFÚ…´ÝPx€ãµ7Zzj#Ó{IÄ ˜á"4‰qè¾Æ/ ¢=.±grÿ%»ÚcÛºÊø=çÜ÷þö¹¶ãı“8¶óò£IìÄÄ^ópžNœÄnÎ}$¡]”lY¡…º?ªe°n¬l´Ò4©ÄhcU‡@-`Hc$@LhRaRTQ‘@M9ç:iADÎçë«{è~¿g"^Ë4ŸñT»ä…æµZë#2Õ-i¿€Hóë<†ëÏDÂ}DTN\œ›yùP>Öü©žç‹E¤†<†ˆG‹ƒ×*ÐÆ5ÈqÀní?Í(øD¶±Í‘ŸZ ´oȨX*ƒÅM‰¸&ù^Îc0uA©žñàÆ…Ò•ë‡6§ lãbW N’ÝV‹àÑd÷¨ÏWã-Ù\ã3«+•Ã*—&ØI(¡´Dª&ï&^ Ħ½*/ËÞûèªh'’$Ê6A«P€î¨'“VÀ΢mæ 笿Nýk ±F½u {OPøï&qŸ¸én ÷ä`×ÿA‡#¼6{Mª¬ÄKš1|$¿šÍ¶Y­ޱÈnˆˆ ÅÑËžµÉbp̨~î½ï»¬¢ iXuX ¬ v 'жØBøÜ¯{'“)[vèu÷×;Ü6Qu ²"’,<ùà.ú-2AعÜüUéªí é +ȼ/èí l¸óüyùŸò=ÛZÅžªøXØ&;T˪µÙ× ›—sè$z=ƒ^G¿B<}»MXôͨï@Ži'y¸Vw˜ìÙìYÚjÑå, ÏÝhOˆÖFVCuÆ/90}ÐT ´”˶~ðük¿¯vMG†¶O¾¿7'±š_qZ6—¦?ahðOƒ_Í?;wáÓ—¿{ih{¥%Ö¾×yÅ|±êòc¯Ü¸V^HðàþžÈúÐ+L‘yXr½ÚòÇèjX;Yì‡×óÚº%_)V&,Ú%ƒ"³tÌÐQ cšŽ):&ñMhÉ5¹Ð ,V;”ËÙãìp"鉭έ»Œ5lw2å‘ÎlIš&Yz’Ã[ A”-kŒê¹z)QJ®—ÖÊRIŒ•’eѺì[†ËË+&[žÒïÝ'ÏÈøî513(P3¸sÇä ÉŸÉGŽ@èA¤~k·ŽøÈÿ¿vïDMʘQÔ¼“®Å +Èc) LÉÎÄïsd_÷i±ƒ4u„ˆ~S¸š‚˜'(/ü!+ {ÝÏNs™û\¢¦An5]œŽñ:#j+ƒ¥¡C =$éŸ[>=Ã+Ý®n§-qéÚüœè0i‚Dä9V“%_´^ö”ëZÀïOxÇt𠛯-î]ö²¢À¶úüx¡=9¬°¬x§À‹àn"âîÅ£xÖùº¸­®—Z›ó#½…'^úò Œ:ß èÂØ ¾E Ød•åx•UìŠj€üqþRå#¸Uµu8I G¿¶1 }ïGaÑÌb«è&Ïœ`nåâ¯&ÁÏN€SîžH´¹×CÍÈC4¨4VšËÕበeX@|³E?Ý „ˆ±(…‡‘Q1Ò°¥r? ¸€€äNrVUc¥H¡¬†¶"eL/3T¦ªWauY½’ÍÌdNd®gØ åÙI³‚ ª§÷vÌ(¹Ÿö3ùÙ1“6òûtý  ¨*#j#q|$<Ê’µäOt/ÔgrÕôrÞ<&÷‚èLôÅIè¥^O †…0݉6¡ ±e¢{9¬É€ajpuìø"– «w)@Ðb;·O<;•>ïYêÍ.¦îÔ½?<§¦}©P‡·ãexÇsàrúüÓ#K½Þ¦¦®ŽæÌë쪮ˆš"»IüWÈ@Éí«Ÿ½Ü<*ªE«{ã;§&_údÐS¯zñýyòo„Œ€gìï_ÃZ‡÷bå¹7©ã¶2"¼žaƘ÷sîF&×5’[ÁÊH%×þqø-¿±Hâ©=çñ 99;13#}ƒ(o$™¦å-#Œ5ßM gÀ_ÞvY­–¼‹î¯?n±ðùÌ–ñr4˜ Î/¿ä6ÈÛõà­à{AN²}Áà›A6©Aðù­Û<ੌ›¶I£éœ5öצ~ç z&“5§¤ëÞ­…Jê±µU?,¦8bÖ4¾};¤;$éZƒ~ÁÌiNLØ(·i™0M/¤9z"’-îNƒE›^]¥…¢K]-ñBúPgÔc6d!ÒíÇ þø­±´M8…úNi¬ûâýŠ®j2g ÈÅ—Š\VE÷»”±Ñ:%è‹F'[@ðu'&öîºÝU´aÅ.óœ.ŠtG‹îÂ=t„™ïævšpÔ»Y‡ôtÈ2šRM馞s0i‡COê)NJ&¼=éžÌW¸†dS&†{SÓýHñç.ñ/D/¥?HsŽtÜoDÖ`RÝ©žÜ¤w$Ç%SDxË´6ClÇ x³ŸÁßrþ‰x¿…çü·“û þ­óÏøcç?0wÃùcüS'jÇíÿ¡ºìc›¸ï0~¿ûݫϱ}>ûìËårvürqbûüÛۉń„€H¨=œ0‚G)‘©£.b,ÑÆÆ¤I#Ú {é$˜ÚU­6‰Lt]¦Á«´þ1 Eš´n ­Q§¢¡I…Ic-d¿³“À|~;}gß=ßÏó<â€Ñ)”„". þ"ª¨‹G„ï{R8'ÞaÿîQ Ú‘Ê¡ȇ…ðPhÈKTbX»Ž­`Äú§ØP¢ê¥ÛªCÜòlä-Ä ‹º Ç´‚6®½¢KÚ²v]»«w4 imÀ¶ žÞ¼f¿ùJ¤Ñz¡Wž`u ôÇ0 byì ¶ŒŽA–°{4Ž9ŽÁhmƒØoÀql1¥ÚhÌM5¦=h<™{ÒXè×îFA„OV›ƒÔ×hI±ÚØ0t‡Ô9×h4ªÆ­•ÔÀÈJ`üÅ‚i`÷îyQpˆ¢pÙíµ,Ú~_æ“ñ¨6°ÖÇAU@âSŸ³ £‘DqGškÃhZùK j-¼ìЖl›´`¥ÓB[Ø4ïërŽ|¥+)½ïÔKB{¸[ùbqz9A‰°7 ¬5VÚ«wù}Ǿ–«”n¼%V{ú-YŽem “¦iGH²ñæÃº'"r Æ^èîü| #ÚÞîzÓJ3 né(—º•„·ËgW”ž¹‘W_3‘VB¢ø‘ †Vû7?Ã_†ÿÅ2Ø÷ 혣½à$5Ø'Ä7,&ådEª$–¸5ðŒ ÅFyœÍ„vŽ"XY1,ÙõtÇ»†¨B~mÿÐ&y2†¨ò«ôâè"vˆx„à°±±ñ¬" ÚÕŒhÛÆÆ@39ðÛP@ H¢‘·ÔÅ™Df+ߢö†œjÇ¿Q>6²j|¼F×#;f` p‘ez˜¢½<ãî³ÇpÀÙ]r»Jµ¹­„ïâþê«„º¿Â?Kœ˜mWú”,iGiWvºT™ÁÓ¯žËHœÉM²‚`ÎäçV€‚¸Ì2:s=›ÿ"F`;Žý½°pFxÝdêèHgŽ’)œR+³=–…}\ê¥ñì‰ì+Ù¥,‘Íæ{¨<—O¸Toúh‚bÇâ6Z!'ˆÉqƒÃNŒµ±8;9ªûò¾C>è[tíZL šÐÉíAp³ÙгËðfÇsE¦Ð†16g&+‹wFÁ¨qÒ«-.}æ‘QFŒF‚ònëf‘i]­Ë°l ”èò; ‚ÎxUÀ‘žÜB³1©Œê Ö¬%IW"ƒLµ$|1™iÕ´è€j¦é&ÙSÏ ßœ£AˆÜpÖb,²«dR8Å*ÜÝ[¤HzÝ?ÎUpˆ. ìÌq3„)×Ù‹ÝÀìzñ+{œïpÒ8 !`-BÁFB#p¼x2ùƒÓµÝáˆ=ÁyäÇšÔ~ˆ ˆV‚„„ÃdI9qþ£}}´ä†¸¤­8éÖñ×MαÌpB+ ¿ôœÔÇå6ž‚œ š(š•ÍO6?¿…»°`¨í éÅ·ó«ÎµÜZ~­°:ÈZ­CÖ¢_$Öׇ֋ë{‰+ÖõÜz~½@¬n^.¼!åöx¬þ-ѬÔ.}NúºôžôOéS‰–¤’ïªN?tê}BŸ×—õUýcý±Î\G3úx©JzãjD¶Ržh«sm!4ª˜Å´V;`ŒéCÅ\n^â’ÄïI¥.È’C–¥Ëd´ÁôrÔm¼”ŸìET5 3jk´›úØæ¤±ìmb…ü$’Qb[GV$#h|ÞÔàŽ€X×ÝÜ%ERÜ̶Q"ëñæ}‡0›4ÛpÆw,‰›ì|A£q¢ûجӄ˜©õ|3Q`ÈÃf¦ HÁd– ¤YŠæ%SÆ{m2éþéãÁn·ÛÜfØ9Žw;-${þ½§Ÿ&„.©xľô žÍf«`häáæCòw0…· Õ¯V:j÷=„Ú¥úÔ€T5Rõ¨ÞŽÛÂãW¦”©ÎÊêæwoʵÏêæ· ×Ò•²Ç!ŽG‡GCq–(9DYéôÄÓÙ£S§Íљکr%:>Å–÷•Kár brÈ IÕ¸ 'd“Y<»gü(16lO§Òo¤ßMåt1’ŒOÔ>¨}R£ˆøÙ8ÞÜsej†‰ú1“Å!ÖNÏ2æzqb82U‡oãÃWÇÌëž±wÆð±»ïDAt\-DŽû¯ùñ[þ?úÿæ‡V?˜öÿ]²¨×êp¾þ£úûux½¾R¿W‡KuP× û|4‡žøxzZ‰p[RÍø¿ Ÿ©kc#ßTXÓ Ztâ“[J -—/¤³Žt:ÛY©Ì§ãè]\”åùÚiGMVj§eE• S3Ž©©CŒ!Ai|¦Åç%Ù‹¿MÕð|CœÈÌ‘µ$w”‡±åþé̺R-ûÉD6´þ_|mFÕd½l}¿%[ˆ6ýÓ P“ n…Îne¾Ü×½lksã„ÕæIȰ'c~=‹ttÚõ€)‡—,qÈu&læ³-Æ*¤î¤†cשè$z©hz¾k™Ï*†5×(ÝOtÆþŒ®L„ ¿RE÷㘠aôjãX´q޶¨.þTdŸ“nç–:.a–ðñs²Ù/eûç¾Dq »IøÞËŠV2Ùí͛Ӓ·³'XÙ·ÉcÉɼ{$ànb]ʹ‚ mK‰ñÖIvÚlX‹îàÉ€Có9D‘2K¾d®{›‡d‡èk¿#1³Žæ:û JçâÝœ eE›%^TmXiÂÛoy¬øKUdF/") çÙüL×ïδ:Ñî'͇Å,Ê'¸¬JIJÍ8ÚT‡–“gY†g¬NÃÒÄnÁãÃeý+: àÓR…ÝC¤ ©¼ã¾ †/KãÒ^Úê’JÖ=hö$^RiOÙS®›(—OxT§§<æQ‹==óc~çØ˜ß¡züáöbyÂ2”kH û«B•ë£O]¢†È©ÒÖ­måd9E•¹2›bYv«-ë'~£ñ¶\{Ñ’-{bÍjflËÍ µglÂÌصì'·€6 Òh¼*õ,Æ<^I\#‰ _•­ ëéZÐ)|5%W‰x•tk”[ mðmÉ»4=wUk¤$«Ìš"iª&4õ4ÌåÿKΘVb|©¹,cP›fPpž®1mã:)ª ÒÞBö2ÇÒ”Äi.Q¢X¶¥PÜÀnA-îòeB4¡âP.²;륈ÝU_'1J¶÷ûsë2OS–ik ¨é¸³¹èS~Ìsw:ïÓÜ"Rv’%,Çš“¨h†2ñnùÀ¥sÂÝ?ù$+¯É–³ñ g§Šg‰Gd cánÝ™_,[þ¸?¯Ze3v×åÓÞ´æxk+ùÖß´ÙÍ´EÓ9µ8ú0ý á/¥Î¦ŽD‘bÖöP(Nw¤‹l¢ƒ€/9‘g>ŠÍ¥ê6ÇcrÅE’¡<ÉG³Éd4„»@êKJ†7Ûþ즪Z´š)粚nðÌälIs³Y>‘ô¹½ º"¦V³M¡yéî’/yÃqÜ{ãtîõÜ­}&‡©à"…}9r?GréçŽaJ vÄ£X´k«´–Á|x¸(‘ºô_~\QŒ”©(…ÏÈÏn$ÇÅS÷Œ\€ 1X7IãÁç nq©†UHéLc¼4³ÂS Lãú\7•£6e_jÞÔäßD,®”dSE/Cx!C¥r©îò›ÎH´çzÉáî·YJ¼ÉdÅâ^ž\þyƒj{ï»Ô"¥EúQšç_Ë…‰ÓRÚêÛ͆{Ðb”ʉò)·Hv×Ç»bŠ„†¥à·?øíA¬â%rÝ$P ÁqŸ—ë6MѧÒ_K»!ý°µ…«aÁäþת‚½LQ¯Ò?bBàV˜-ùƒ–  §-i>f¯©7T*Ȉ°îQâøÈ¹@:K¼÷PÁ ŒÄHêvd•ØG?A“JL# ž)Y­s-ZI£4-Ó¦î1ª­%½…îÅÇ—Œ"D†¯Š®bÔ'U·êÄ¢ÑXƒÑc#OŸî"äš`vQ|}—;²#«ú÷‡/¼Gír*šéÙ.Aé,÷ì<Ûw™ ™„FgvÇ"©dwDóDâícW½üB«~‡mÓ®¶€¤SƒÙÝWÞ˜Ó×a3õúU&^(Àþ’õ¦|3E€[HÓ£¤è£æCÜ#‰ ϵ`”wd¤‹Üï>ú±ÀÎÙõ¸Ekc$( ²éhÒFè‹ÈKò’ÞB7ŽVÖ^#Ç £E†!Ö£áIí–"Ÿë]¿ÃêÛP_ŸpzG»v^˜ìŒÈ‚DŽX£¬tÔ³N÷hiøâ3•-ApSd›¿µ5™óÇ<áda×Õ™£ ¹¨Ížøp:ÝQÕ€µ·øs»®­¼]jQB.X=v? ‚=ägHþ`ú=û&€å ˆwøˆ›W° ö#pŒ¸`û+€ü>€½À1à hx¼Þ>œß?hrˆ—ø¡=áé¢Çެ;‹Äÿм õ7€¶×²8çú*À†e€Žz€n€=Ø·ïkóÀ¼‡ÞúÆúqŽvÆ1´.€±Æ0ñu€Êm^³çÚ‡÷8U_Ãþ†((›¨"Êf²'@Ùl@öw_G7/m÷Ä¢ÄÜü¼]§üœbÅ|Ü|!àÆàÅ  d'2q.C>CC CC*C:C)CX¿Z]' +‡™¤«‡Ó4†À°¹ÈÀ }+`ÎgúIó, Œ€2,@ˆ£Ò˜„€Úá=zì€Á˜ ¦qe8Ãþƒù'4–˜$gNÝ 5'žßæ+ƒ4XõZ¾uÁt¹SÅ¿ËÙ8#ØýP¼MF˜> endstream endobj 1696 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 34 /FontBBox [ -568 -307 2000 1007 ] /FontName /LGMALP+TimesNewRomanPSMT /ItalicAngle 0 /StemV 0 /FontFile2 1697 0 R >> endobj 1697 0 obj << /Filter /FlateDecode /Length 8290 /Length1 22292 >> stream H‰\U tWþö9ÿ/I½åQ¯Ü¸òÀ ž¡¤’!ÞÏD«rƒ$H¸UŒ×¯Zê±Zc4TGot(j¦aÊ ª¡ÞF…Uê1Cªe–¸g¾d¦³Ú¹ßúïÚçœ}ÎþÎ>û| æCcÐÀ¡‰ís22ãËÙ;`l¡Ï_o´½ʶ¤Ž9Ãõ£çÊŽ]œÇrýy…þ°)W¨ñ;ÀÑ.¯`vîÎŒ&ã€.]èŸ?Þ7®üÕ¦E\þè”ÏŽú?ÔÔ¾Äv‹ü³J{…Ÿ`»h_0e¬Î…‘@×l¶=…¾YþZRw7çÐß5ÙW8>úPæ`ØC®?×?eú òæoØéªqÿ´ñþ›]Ö’KË@öJÀî‡(~MôZ4Ì ~7ùÝ ö5•ö$¸ƒÍuÝ€³ÿ߈Á:¼x(ípeè‹ñ a-z£Ÿ 6fËIXp#;#QPHC„ØØˆËx Óp × \“ú\Ç ?ÂÑÕÜå–šô A vã ÈP$ÒNWiÍÈ«L"oN™KlmÆ-iaJ‘Në{ÔCæá]ÔÇDœ0•UDJd®ÜE4²Qlu°–™I膽8/´úc¶}©æ^pÖ6‰2SanãO–`}Ù‚eYÆnO¤ÛÅv‰ã¤3Þ™îÌ©ñUåýç­žg=¿D°QðÕàºàáàm3ÂÌ&ÿ$  ™.!ˬÁíÄG¬Ä}8†¯p±šë#Qb³â#ÅÍjððÔzJoéCô—ÁÄpb¤Œ"|’#ùÄ<™/ïH‘,”ò^56poÛe§ì#>“ƒÄy©ïåžUÔÝ@ÇèíÓSõF½[Ñçô¿,ey¬D«»5ÂÊ³Š¬rëŒuÉzfGÙ^;ßÞbq4vtp wLtlp|â¸ã¨t:œƒœ9ιÎsNS#†jõî{/~ùKt”Ët»¡5KUð^Dj¿½D†3c5Lè•ú;Wj—\‘ez‚žd¶é4õTO‘ê i®£ì$‹å0²KÝPÕm+L†©»o½+Ÿ©):E9ª‚Øg­0«È¾¨‹HRoI™:ª‹t‘ù#’ì-RaoQgಮ«¨à­^¢ÖsÒ×j‚*F¦ÕÁ~† ÌûN{óÝC-•Vúœµ·´[ý(eUã”ôµZ¨×UWÙEÅ}.Íp_¦Â/ï!Y>—oe?Dvèé§^àiT-éÌG蔎–s:YU%V…É õP ׇ§uGªÄ7˜#ZÚ²v~þ1™7`­Š£¦y©&g¥="±žzÿ8x¨J±íKv1ël«ö`Úb´:‰$Þ[D&£=²—¢­Ú€¹f¾Œ£î÷§~*ì—‰H”Pªe¹Íã{®šS Ç0êSêÿ ª~†<À›ââÍ*C¼U5²ÜòR™²©¿ÅÄ8ŒfkÖ8öÚg1P"ËÜÂ*¿Š×ùæ|ÇøÐüFa«å!k•y*gl ¦#™XŒ“¢ð9÷à=d¥Sy×™‰Üá¾Qýø&dz)<»!¦ÈcŒÙj^C†šÔß™f:a‰¥FØ­­ÔØãò%ߣ¿I1u;W¨G1‰{ßiô°?Ç2ë"µ³§YnÎ#ŒùhÎ åð½‰B<`ÞÒu^ P¥&MûùBU`°)1Q‚|S@å=„íN›Ú3Íìí¬]$÷>,¹g—»wKêÚ¥s§Ž^jß®mb›OëV-ããbcZ¸›G»¢š5mҸы‘á Ô¯W·NíZ/„†Ô¬átØ–V×–í Äf¬XwzzBUÛíc‡ïÙ»Ò~ípeW»¹~í™LÏÜÿóLþgòÿ<¥®«;º'x\^·+p*ÕíÚ/£gÒ^‘êÎrîWÛý«íÕÕv-ÚÑÑœàòF槺’íòÒfæ/óf§r¹ÒÐwÊøJCBi†Ò D¸ý¥ÑCª áM*U¨Q‹¤Ü©ÞÀ‹îÔ*ãõ œéMm•à HÊXwNî^:­«]R&ðoÖ«6ªãÏÛ÷î'ÄÆçþ|†Üñ8#ûlÌOù9Sœ+ö] ¦IŒ¹sæ &Ü&TüD´Q0ŠøÉÚ’¶A!ÔF·áÙ$­M%dTE(­hZU%¡mJB[Ú"­ ’_¿Ùwï8_h¡U-7»3;»³³3;ûÜõ¦G.XÇ»¡=¾ª!cï€V¥Ây]zWgGÂT;“¼Faë6˜¾ùÑÄ;]L^TŸØ•-õ«Flâºw cWÀ<ҜȖù7™Ä¦ÅSF ï… ›ZXKìH&Le ð>xOöîÖè1æ¤ÖÌôÅúZc} Sj˜´|k°¿´4:h}@¥±€ÑšÐƒæÃ~=ÙÙPÖWBÆò­''E“FKª«ú|…¶[ûƤyùÙ5™lÉáÜjZžñ«ÂéKf`u–$tìiÿ¬Y@Æê†¿¤-³ ç±Î| >eøjÁ÷±¾é ùô€q“pþú'æt¦9îï&q“£$h;m36++9@<õ8QØX'ûs««¶ Sßà €À}ô8|Û™¬­óƒA>Þ=QZ…ŽÙÓœ°ûZåï§hM8iŠK†ɸ,éq$õ”Ž8~ƒøûbœé-ÏüøÆÇÖÖšÊøÿ ^cË›Zô¦æöD f¤Ò¾mjÕ³å 2²tK±p¸©…à©%:Boy{‚øw…âzl]ª©Íâú„êI»%üªœ ñÛ‘™™;‰<žK ¹eüw x¼`ÉQqÓ—j´“c‚ÁûT°>e-I÷dÖ†G÷Žê2/ÏPa°V.šZÛ cÌ(Y—•aÄõ@ÜHVÏ*=àÓA5¡&Œ ±”süÖ©=~3¾7‰M¬UjÚ‚÷éÊîæ¾¨²»¥=1èÃ'ÖîÖD¿PD}jq²od‰ÁîgÉÌe&wÜA}CVô ¯ïŒõH©&²¿z@!Éó:<…V›çsx<ÍæE%ÿø¦¨oMdÇ€L¬dµ|à 58£•>úlÓH¹Or²ÿ܆;¢”qK8À [m ¾¯¹S£;‚]|ƒš!kf€¿_{Bÿ4ú- ûE„Tð—ŸU@ V `ðÐŒ±&ðmžÃº:<_¥N×Yò¹Úh*°m]û*µD»‘ûXoŽ:™*Ñž Y…g2Æžµ.³ã¦ÊqmÐÛH=סÿ PäÙG~РüRÌsŒmmRÏð^­khoKÐþ 4[@—ÿÚ‹€|è|QD¬Õh¢½¾)D;ˆAïë`|>l삼}Ác±n>¨ŸÇbÎ õ‚âWâMuú´V*|¬öÍ{vöÄö³Mÿq¶/¶}l«¸cÛç r°F#Ïj{z¯‡Ä9Ú ±®£­»K(Æð\ )ØßÇ@Dë¢IžÉÖ_aã×4}/0Q‚ç:þ?.1˜ÌxÝ—Ÿßç1˜w<ÆOÏsÌplr|plÈøG<ɘåsÜßpŒÙ9ó#ñíJ€*|”ìL£ce¾ð9²Íœ <7ÇÇŒC!/·ã^¹Æûä˜Ê¢º«J®-sc+‹Vpì3U£rbˆæqÌÚ¾v¨´!ÆùÈ9áPÇÎO™# j7³ïøÜêø"CP²e®wém­TßBüw ý8è|øç°ÌÁkÚè#±ƒ„gˆªp–œ»¯äÐ ϰ²ó Á—åÚ9zEÒa1UV\®^늫WÄÍ à-Šï×(Í׆èamœÌ»ø+0wÖM ¡§âKíEuu÷ÒÔaœ#ÖçéϺ!G¹1÷ùX’ԉ׻PÎ|‡ÊœŠXy±þ(s2bØ”"\ø~–õäÝ\èÄk&._¥rõfV|æÄiV|.„ž/7.³èX¦éÚ’ïä)tÆs­áýËû±M擼ç ëwÆçÒŒþqÇ­÷å=|ŽÚ¼f!È‘¾Gpã¼¹fî³:ÜÏZêR«ûü©{èu뤘nõejjˆf§ï²R§–²Ÿ\ç¨,SGCôXú> q=ÕŽ¡†Ûu´XÖÏ¿ÐD×uy·Í–örrÖàÞ›Ž:þë¶VDO«/©ÈKæ#FšY¦yiœú'ܹKi“zØúº_ÞA1u„’j9 ]øl¢KP™«š Cr>Ê<¶ß­!>ù.hDgåÜË|öîÛ”Lw]Å}Ô†1Çå^Cò?@ÓØRw3ê æò„©HN I¯ã½ ý;0ËéÚ\Çsº—˘-:s¬ÛÞ"Š0\¯Ñ<¬’k5R­7Bå®6ëª|WÑ£êYš©6ÒCh—ʸ߅UzÙˆú¨#ˆMŸÝ—µZRë–¬÷Ûd=ÏsÕÐJùž`™›¦¸+hCÓ!KQµúæyquí×-K¾~O…¼6øñôû„ß BæËo¡÷6Usޱ ²Þ°=oïÐC\=GáÃ1œƒŠ—¥ë`úô;YønšWfS%(Þ¥6)k¥ÄiqBœ¶ºù¨¾GOª?Äù  ÚŽúýjãBÔð¥ðÕo(¡þí©à¶àí·‰ ´êR/aÜlÈ6@ïæ8 9c't.‚¾N‹Ô_Ò:uïƒKüF  ¶ô  ê•S·¸EÝîy¨É ­WåüŒMÖW$Ž¢n^Jë¦!mup7›·âmw{¥­Ùv²w±çày¥ÆhYMGšÅ>ꎈ÷0öË´U9fRQ\¹ Jã'Ô(iÐŒ›«<ÌÐæÒÏ€íhWžNØ}:¼ìÀÜg@Oºñ©À‹Ï à¿rdÙàµîÆÏ†ËoÕµPn`7FËäšÛiÖ›§-²N1Ô+¨!€{•x¶P‰:ü)ÐËé»ü¸çÞ¤i÷²ç^PÞ¡™Ò‡6¢÷³Çûç.×çÿ×|÷ œï6à iÃUÜÇ2†h¬rÞºÚ¦œGÝÞŒ»@¿ýbÇŸÎ9ÿ=ÉÏ9?Ä ©dý3—ŸÛÏ=×{õÅIz2Ndâá%ªchc<Û÷¾MuŒq_­±QWxæÎõÝ]–ë]C„›õb/±YJL`[ß%&ÄÅNC¸R–òÙÚ¨ªC[ZH“Ú 4H°CpÕv½ÜÅdy´XªH”(WªÚªRÁ´TýQUuPÑÚ¸ßÌÞkÌ:Èqšþ©Vßùæœ3¯;3çŒv¾‹ãuõõ P‡刘ö`þx]«!ùJæš)ÚàÌ£úeÜ«€¨+Û눗€<»€r ±õ/ÆŒY×ĺ²#I¿ý}ìï’ú}0?C½Ô!Ÿ½DJÀƒ#6îo뾸kÏ?–Ü¸Kþ’RçΙ¸s6pVîÕçÿpvÞÞÞú_E ö*àdŽºŒ¬Ð#÷\Mð\~¡ ðtÄœ¼¡”ƒòz å7a; ÞÆU3töÄ>¦f"'d€>n7$ÛßžNö1|ŽÿÞ®dû¡ç€‡áCf6t xø9PŽ6v??†¾ü+è+“} ¡<| øPJòг€ð»0ÆïD>ò ïÐÏ•ïõþø´l½3Â6{CL†—}*¾ëÍaÿ‰Ø~K|Ëu°æ¯™Ï½Þ8w1ök,KûEN)òh‘˦!ùã(‹wÛ#’§[ýØì1PäÎ"M[„œ9ùÎ+ó\aDZw+ý˜¼@–Å[QçÞ:—›<¸Soàÿ±MÄ5ó½,ý¿¹ ê€ß‡ž ¾aÇ4ûnwÇNÓ>o}²1ò3ÄÔ…h îe·±ÄB…@j,ž,&ŠÝŸ9–ß#FÓÿ­nÇyå¥ãò€ ô‰ú›¬žšwLZOÉKl=ãü©{ÏÎg2Iæ(RÎÝd!ÞjïÜßžCê9=oö¡1u p fÇq_”Ù€x¶gœC$äì&!è½ÀiØþÞ(|à6ú<.·›#ÃпÝ«¾/뮵°q¢ýœºoE~.óC¬™¼[ÅüI1° ð'íö·oOŒýWå·}øUè‚Û,ý(XøXö— Ï¶øìYà¡ þ‰¥ÛZ´Ûeq;ÛiÎáÞÈøs€€¡t¥ƒXºƒÐ$eßeÛäH'Á!ðö$c¹šÌ\¿üFMñûf…Ú±¤MXú&¬\V®‰¨p5Úu“u°FÔiDFÔiĪ”°o§H ½@À°î;±îƒìú¥ý{­@»ÐØÓXÇBÌj?Ûbpl²ÍñPÙ9ö–Ú`OÅge‡Zîh®)b#‚Ó-öˆº›¤wSÜ5UX7Å3³“ŒZ[#élù6 àjÜ@ò€/å€Ê6˜yÅü,{”lw#7+ͬYmNSKÊ©ï ‘ZdÒœøØF…B ÓÒu®×nóºr\%.ÃUëJ«gͬ…1ΊY«aQ––é3KŒ•ÚÒE­îvwÌÝçîw§Å´>­_е´­D3´ZmÖ íÖZµvÍÕªµ:”uî÷n7óºsÜ%nÃ]ëNãÚÙËÖãoH/д*Ö8 {{ˆâkD±OÂN 4/Ðò8 šõ<¨çÕ«V)<µÀ: Áòj£»¨?(<ž,Öt¬íä (•Ðth:4µú•!ÌÐ ™ÔLÚìHÛWbùךôÊ:¶Ïm•!ãkù}…4VHÛ ik!5Âe‘1ÂçóEýÑ@´ Ú¡Öûëõõj¿&PSPÓ¡–ùËeej±¿8P\PÜ¡r?ðÞ¡¶T÷T_¨¾\­F«ë«›«Y)>]Ü,* IžÜkÎÊ •z"Ë”ü(dp`„Ce@= *=\醵ÖnRD4´è× $·|ÂÞ&}¢$üÊ]~†?Þe.]T©Ä•Ú†¾»àï’µ“¥iAH{U¿]Ú9¤Ý†á‚«“×\Ž_)¢@F.³5ä*€ž!9Ðô*«Ão [£tã×¥t± ¡/œÁÉÌ™„ß4§7âU¦bè®B–r¿”eRæé•úÍJý—•ú÷+õ|”ã ”¹†;¢ŸŠè5½0¢£·ûH.Ñ•RjBÒ¿Iù¨”A##W¿•«”««¿’«ïÈÕ¿˜+ÚÍÆÙÕ• )ÝBÒ¥¬”ržáæú[\_ÃõR®GtzŒbt²\Ê9Rf I?<å)÷×9ú!)GOÔ ò„B$Ñ3Ý6Ã+AÃføè_fø?OoQÒèM3ï:Ì Ó UèYü­ àAðfðOI˜À'ÌðQÿ5´?ý8™ëõ_%µ²]­öW¬v/›Áõõ¨üF=B‚rÔCfð:¬Ìà~Ð fp¨Å ˆ n1ÃóydÝLòQw (b&ÕÖˆ çmà•ÉÆ+Ì hU.HЇLÿBP¾˜åyê'µr8núåŸÌ&~ÙÅlâ—“Î"ÉéÔ#'¯“¹’¦zÑN®ó†Ï‰?NnPyŒÿù<þßj¨¢f'ÿõ±\&¿LÐÀi~ÉŽ_ÌKÐÕ&ï &œp\&ÚËOb‘c¨«ÐÓ¼'¸™wû¥·Ã/>u[x?ê¯ã/ ›|Oð¼˜Ù޼î'‚_âÕáNþp Aá6Â̘—ú¿Î„yI‚VÄ;ù¼„˜J úè<ÍçcÄy~9•¯”žUý†tìr¬w¬v<æXæXäXàÈqd;f;2œ>§×™îœêœât:5§êTœÄ™‘0ŠNa†æ¤©Bª²ìU„„·¾B ÎNl:«Rª_Nc¾*Rµjy¬´¨*áùrlIQUÌYûÕµ')ýÑÐbʾ%«Öbƒ ÓÞ¬˜ï¡µg¥Å{ŸÏúûÕÚÔÅÏwo’&mפþÛu¶’ÜqܵÑê6/æ&½Ñ´¥6eä‰iÔnÓª7·¦0ì*ÂöرAÛƒ7fŠu`¥{“ÂØË½tìa ƒýñaZ²snîZ"Û„{’ß9ç;çwϹù¾ï&_Ⱦqê}McióZÒû‚æ ~ŽÆ]æ;œ`Õx\ˆ/ÛÞúÜu •³µ´(‚t¿íæéLÖü¬]3cäÔÚµ´¹3ÜæŽrc)uš;BFËN³ÜÑÔ ÅÙ U[ ÈAÈdˆV‘h ²ªEëµh¸MÅ”ZÅ:i–½H$Ü>³é@½Ö:lµÈ [ ë¬Z븵DÃýP/æ¿¿X30¿UÌß V±6"U"¤<!Jek •ÈV+ýùb:©ßŽ«O„iVÆ9êÜ6‡ó"Gú/¥˜|2«æoRÅp*N9óÝñƒ‚9±/¬ŒÜ¢DÐä×çö’ÍÍ[á¢jŽ„Õ`%_X"] t>¬V ÊV JQ½Wò©p^ÕªSåžô½Þ^èÕS^¢X™ŠõP¯©ôé4¥§¨Wšz¥©×”2eõJ&Yz [ñBRëÙ]·U®©Ÿ‡Üš–\8²Ýz8¶…„“k®¸¶š$Íl'Í'”êHt$(…O'¥Z0ì·SÂÉm¡5Wاv*€áÖp$R£êÂ[×õÁ0$Ô%C°b%|hC™´¹c×pÖ”M9e*9Uc´†-=Y%0#ß¹1¹,Ÿ–'åó²Û04 /›oˆÜ^qL,‹§ÅIñ¼è¡Äîì%Ežyw+¡¤T«§ß4,: `Qo'RO6!BO» Oæ°FlBdnø õ7ˆ9ἉúâD•"|ß‘FUê¨Iô¥#ð±j´;öìe´ùýu›®ÛTÝʉ˜€öB|ScÂoWP_G|‡ø ñÂÍÇø˜UܨïZM]bxû€ƒ)]*1 FÓ]Ò% ´Áq*±÷=0Ýœ \4H²¢:]f]$âwp€»NËÐ}Ž}É]Åcj7sÜ®ËÜÕ/xhl ç"ƒÕ^{óðìið±WÙË H;ò¼ÜøMî›—!Ž~àªÑPk¨5‚е¹à^¿vOqÃ]º®áLdØ—ÅCq%ȹ'ÚG¶”ÝŒY¬xàl€åØö»É<ì2Û|&\CÃÔk~¡ë6êQ¶GZZÊpîù»Ü“ÒÏÊÙÚl f¡ $¥ O¯ø”ç»}J¼{¯MúÎû8ß©æWNP­£Ç$é6ÄooŒFb«V®ð„ÅõÝ›·0èR‰Ä¬¥;»°eü_â&Þà8pàÀ8pàÀ8pàÀ€$+€'=…ðÀC…¿h}ø›¸ ŠÚƒ–ᡳVÃq:jµÚ\mΞ5þŸJ,ˆöÛ|ÔÌî à«î{Ð‹Ò ¸|‰Â ¶ÏA ¼nû<Æß²}º»K¶ïAÿÇÞ}‰ÞihôPQï/;”?<ézÔ8ôÂNèƒÚ`FáA‡~ÔÇaÆpœ‡Ã˜Í o#E8¼†Ñc|õÿÍÇÙõ¼¿€ ãЀ³€.x À}Ý¿g£E`gÀ ^z4úËÂ~n.Ô‚ü}Iã( Ð¾ðR™¯½-¼n¯,î‡òÙï‹{ýòïÞÕ^‹ýñ\û,Ùéo/n¸[š/ÞÒZ[•ÿÀ­Ï endstream endobj 1698 0 obj << /Type /FontDescriptor /Ascent 861 /CapHeight 0 /Descent -263 /Flags 98 /FontBBox [ -217 -315 1129 993 ] /FontName /LGMDDG+Garamond-Italic /ItalicAngle -15 /StemV 0 /FontFile2 1699 0 R >> endobj 1699 0 obj << /Filter /FlateDecode /Length 28515 /Length1 39628 >> stream H‰|V tTÕÝçÞ÷fò…ðI˜Ð¼ñ%á3HÌ $H,féLBH‰ŒÈJÁoÑòH¨õGЮâ* ¨´¾PÐ( „¢Ö*(Ö¶¬Rl@UÀ…UòzÞ„° ­M†sî9÷Þ}ö9ï­HF+$*gÍÎ/¬Yœ<îãÕ™µÍ‘hKaf°1 _Ô¶¬Ð\YbÇÞ…‹£õÍg'ž*œWV×7­Zœ¾áÛ…@Ö 9®¡.²è€œ%ù¼GxÏõ ¼ÐgBœ H´ýì†æ+­æã-ìw sš–ÕFˆž{hÛÅþ‚æÈʨ³]y÷gs¾vK¤¹®nÃiö;1Ÿ`tÙm+¬óAÇ;]^}ÿãüw€Ì9~³Z¨C )Ÿa˜mçY'¬Ocÿzé;ŽÚ»=€äÓUþûå¿»{Lë>½©Öºÿ±ÿªhb³é‡r ÕP/nÄ|Ô’ð ø»Ž÷]‡â~LG½ahGÌÃÃôžÀ1dcnâ&¡/ ðvã¨õ"û Èeý‹OFìQ y5 ™ðð-”(<¼7#1pʱG•8ø¤¡œ¿bã:ö 0šãÕˆÒi±Üºßú;g¥ðjóXƒ½†C8Ê7Ÿç:â fT¹Ü¹z,åš×`]L‡± ¿ÄìÄ Ø‹7ñüo9Í÷|͸D’Ì9•†Ð(Vh:ͤY´˜ÖÐfÚMgé¼ n EØ"vŠÝâM9Tv(~åy¥ËdµY¯XïZ'¸F[ù ¸Xu{3–QÄœJQƽ+çžWóœÜÌuÿ˜+oàIjÂ-¸•Y®Ä<é÷°kc|Ûð+ò83ÞÃ3xޱ&cö1àUüoà-üâj>Ä)üçð kqS6 cŒ¤®g 5R-'ƒÚi=EÏ’I¯ÐzÞ¦÷èÏŒèô]¤nÑOdˆLF#_Lå¢JÌóD½¸M´põ_ˆsršœ!o—kå¹Uî‘G•te¶U>SêLu‘ºF}H}ÖÑèät}ÿF7ºoè~µû#«Àšo­±~f½h´±RÄÝëÏs—ÍÓ?†gi&£‚§b.B¬‘­P j±˜QÏÏá4óÛàV~"ncµZX«Õ±Î¶ãçŒÍøU [ÛY¥çY›×q''ñ ¾À|É]>‡ï(Ž»œÄ“•Jh ¥ÓPÎMˆa*£”1ÊèFª¤y4Ÿn¢…ŒEŒ(­¢;è®î¥ûh=HÒFêàÙÊØF;éÚGûé ½E‡èëz”>¤ô£o„SÄ‹41X¸Ù"Gä‰ëù9 ‰b1ãV±Z¬ÄFÑÁ*?%öŠãâ3™ ]Ò-‡Éár¤#‹å ²QÞ#[cè’äaù¶<.?—(iÊ@e÷"])Vê•&å'ÊÊ&žPK%5‘¡æ«ej¥ú´úºú‡×1αÎñ cã-Ç)ÇEgª³¿s¤3à|".=NgÕÛYÿk>ôˆøDb¿ºCÞÎÏÑv“™²]ÙÇïJº(R¦Š;à‘¿QÖÒWò²ä|ñ°ðâ¼ÊºxY‘»Õ™ÂdNùâ–ʃÔBß‹XCÃEOü^e P2¾x|Ѹ1£ GäôæyF 647'[¿Î­eýhH¦kpFú ú§¥öKéÛ'9)1!>ÎéP)y~=ÖÌܰ©äêÓ§{m_ðB䪅°©ñRàÚS ÇÒ´k3K8sñd–ôd–\ɤm"&zó4¿®™‡}ºÖEó«‚l·ûôfž‰Ù3b¶’s’Ùq»y‡æOoði&…5¿hi0üaŸ×™˜Pª—Ö%xóЙÈf"[f@vR`Å ðw Ä%3+³\÷ùÍ2ÝgS0eŽ?²È¬¬ ú}.·;äÍ3©´V¯1¡O5ûzb)(]c:JMgìm‰]Ökyû¶®Ô„=I‹ôE‘ASFBöý<æ4ÝgN»ýãto^m4ãK»s‚/¡Üjí,kõùBöm©¥Á®NwIß¾D³]Ãx@3Ÿ¬ ^uÛß¡êÍ«¨º™µîoÓì2ªƒ± øPJÏg’öš]fOÁuºß^ 7jf¼>Uo0ÃܬÁ†‰êUîƒËK^â×q¹_3æu·9Ù¥‡"¾ÌÎþ0ªWý¶¬D+»6âÍëLé×£tgŸ¾—¤ä«º+±˜K·-fÝ+5ÙŒô2S«Õ˜IP7EN‘ýUW£¶ˆÓø"Vt ë6RŠíF¨9)ºf\‚~æôµ+‘Ë+Žœ” °M{\®ŒÇ{mÓã1GŒ°'ÅYÊ­ef“bþXo^‹Y¡GS4³‚%Ce7…ŠóYr·Ûîòú®Ô°c¶V{| 5®(É÷„L¶#û{#æÚ‘ÖÞÈ•íaÇy쟲̸Ü+ÿú¦ Ló7›4ðÿ„ëzâüøøµNEÍ1*ƒ¹c½+7l´…¸5~ # k#lDº¬Ö]KÑΊ #ê÷–Ôe½¼ÞeÚB Ä¢š£{Ô0ÓJƒÒ%B=–pI¶*fëUóƒšß_nÜå•¢˜{Ññ¯ë“—NòoØân_÷´ø8þõóoN«=8ªêŒçœ{ïY¹An  ÉPLyTÝDòJÚJŠFcåঠÓáa!‘VŠmxIŠ ™)#H ÛÊô&Å MÌÎP:J%8(P˜¶c§ºF“ mÇÜþ¾»Ù4ÆÎôñÇogÏ9ßw¾ó½îñ|湸ßè8& ¢´RQ¯^DªŠ¾„õ—<jÃ× ¯¼Ó2Ë)Uåôk¬ÿND+2ƒÖBf©F´AEÑ £"<˜ Œ,`=px ˜…ýË‚ŽËIÈ8ýÑSDeF†³[«¢á:Ñ=Fãô*çïZ-¥éaÚkdÑhYK~Yëøµ(Ý«gfÔ:ïç#½œµÝƒý3 û ì™­…i—¥n£œny2è’wâxŸïÓbT$Ë© {¾#ËIàiäôȰحTìÄ]Ÿ?!‹hµˆö¾ˆ3óá—GDŒ‹pï-‹òq‡8küQ"cRÞk@wr÷ß…îÿ(UÀ¶GpNº ÷·ž*&Fh$G‚Óqÿk|o†{oÜ9y'¶¿Ï¦Ï±¸Áö ì+ˆ¤mƒÁv}UôšÊ¢üq6ä©*ç6öuªZç–*êí22è(ã­ðÓM v_ôd8í®aÚÄ9\rATŸV«8Uè-”eÔÒTø 6ŠœÁk>‚¾õXÏÅ9Å2î|ÂùIJÚräSÜἬ½O÷¨ ªPΟ½DrŽöû çž#* ÿ"~^@‰íÀäk0“õ©ÚÈ~çØ‹*ÇÐËñjŠÓVw.â~¤²z?UEÎeË9JiˆO*r~¯{Ç¢‰üûÜ»'X%Á¾‡ ¹Ààˆ ãí¿•aÊŸÃ.Ñ«“ó7YEÇ8g9o8?9G8?ࣹˆËF¶ï •S6çYÂϨɀ0d€Vz\ `LŽÍ5ÃyËvöéÖ9¿8·“ìæ8jëlßèYÉ÷åü̃e¹>QÏO°®oÿ‘ûlÌ\Û\_If›]þ{ž£O"?â^À½À­Gô®Iu}}Á­M—SÌ8Ûýù\[\ƒYÏB¾,vñä:ù£·p}÷±Hþï]’Ñ{$9qf…> 5Q ÷·žQoÿ-sßâÞÑÿdnô1÷¦d|¸¹žúl-F<³‘_y¼ŽZ0ºà1èê÷BÝÖÇÑ»ÆqzWÔѺdßÅ+ØÐcÎ9·ïâ Ž‡¾–޹9Ä=7æ<Ößs7Ñ·ø,#Hã¹÷jß )î}/P~‡ÞvûíLÔQÍayžW…è?—i¡šO%|®²è<§V:W”Ÿ¾©F%ÖåYÌa* vwß<*S~ç/ê9çuy“6¹ëØ«¶ÑX5‘2åyŒÇ@öTË:5íV Z zÉ«ê?‹exsnMÿ‰j´|çêé-7výµíø=;œÇ<Õ¸ÿ°§µžE-Æhç–ë«&ç×_,»ÉÙº< Îí>ZmP:ÕIú‹ý8ÀW\Cî÷ :õû©}eL$©£Ÿxwy_Æø(5?Ã98KÏ£bo>¥hÎ+nïQ¾™ä|Ô~Œ*ÜÚšàÜ”¹4y󼋹ðß)ç=í–ó^ÿ7 Ìý£¯Ž§¹}ÑCþ6am;bQ…ù… •‰oÖ[Tsêå*Üõ0Î{ßÙÁg¹5Êg/K|ëÜï"s¸/âÌRœó$ê6¸ß¼r¥N£¼F+’9=˜“9n £Ÿ_GÎ.âwúy*jh¥Š:]ܿѣºø…§ÌƒÄdØ2Ê7 5x–ŠÑûŽi@ °Ì˵GT7ˆ_fxbb-ê,ŠØ¿ Ù:÷Û“c´˜Ðõ°ó–[HŽò`ˆhb™1píÿ »ÐKWbü!rÎAíò;gŸì¢í /‰¥ž¸È2“Œu»UÀ$ì«Ä¾çx‹ùñöë‚z€N_¶1ønæ‹’ßNô˜ãø–•#.ÏÒ :˜t͸æ‘ÛŒméOñ‘~_¦/Çð}ÝWê3,•­R…êÛ*¨ ^Šìáw*~ý@&#{Z´ï•޲"JÚ•Ë­ˆh ?]»ÜzÊý¿3‰ñ:ŒW>ª¤¿ÒÒfÞ¨¼’µŸ±üíb/eè¹bþIQR¶ÜÚUñ’m5•iVY鈮caª£SbvÖ¾`<úùÉ£09Á_¿¶È—V’˜HÛ5`ß8ï|×9Ç—\MiÒNÌåT1T{è§!0™md{Îç?ÕÚ|~ÄT3Ï/ΊßÐx(‹ ™¢[Œ§»1–#ÖÝæ¡5™Ö¡5ó2MABOHòÒ¼yx{¥ßå ´Ê«2=à¥žŽ¥î‹¥nˆ¥®ˆ¥’/"¿f‡¶"r¶*ͲC«@¹v¨—’_©&Nëã‘Ò’ó¨ƒLiJË~v.õs;4žÃm‡–‚ޏòâ0SÞ(qˆBóõé°¶A[b¿œìÛ/ë1󒜌‡ôŒöP©hÃZ´ô%™b'´÷.5[Å ŽÍÀ1[›«O¼^`‡­7D>Õ¥¼ãª™ Ó±uf¢V1#9ÈÅàÑ‘fÞp1ª±ÙÓ¨ZŒ¡«ËÍ|ײah"lYš´ÄzÚŒ™Tiµ\/4{JÅ tSZÍ{rÌLo™hÆ‹[U§¬·Íª#²þ—ÖÕÐ$ëJ+„Ø/˜'ÛÅA±BM¸]öëWÍ#Õ—Ím.kÖ²Š'-sq›ç0Ž÷†ÕyÀ¬©ŽèÓOZ?„ª-¡vÝËn¡ï²³›;ÌÊPDµÍu­¬Û¶*ª[Õ6`u]ÂÀUP‚{./mc7Ò3°¥Í¶ž®nçmPTE¯ÚWÍ’68˜–%Ü‘3ìà]wŽʶƒhŠü2è>;øh´|ÜBÅ  »P?ɦ!ÖÇtÔúAõvð^ÐW‡ø±ì°ÚÄ‹d§ˆïÛÝAÌn·»;@‹íàA‹òsíàpÐ,»{•Õû»)X‹XbÞ¦[ šÖõî;áãnx̶ºŽ{󟌗}lçÀß÷^Ÿïüyw‰c›¸þˆØI|çÃNìÅã;’4Ä—%›Ò¥ƒ©c£-Ѻ¢“J‘&­*“&ÕDÔü‘˜ªIûg0†ö¡yÚ´i*IöÞ9¬ÚÆ4ξ÷ãy~÷¼wïû¼Ï=7=â¾:]&ò×¾°.TÍG•»|j‘Háé°þäiã©ÅM“ïL×¹ç§3î3¼WÝsÓexäÚë‘iÕÀ71'CÃUëdu¾%“5ͤ©tMÚ­sëŠ}&â}@"ü›ZþE-?WËF©Ÿ*þŠ*~NAߥŠoPÅשâkTq†*NPŽTqœÚJ{ií¢_ ëi;m¥-t ÍÒfÚHëišÖÒš ñ†ÙÒòË {ÀSz<Ì—¡þÅB‰ä°T“Ù‘„ÝZªEY";œ(EY#w—ÂlI74>¶áÛùq¶ ÁÈXnQú§¥šíc‹8<|çôy‡Roœ>ŸÏƒÀöÿÀìЉÏðúŸÄè†o«%¼A¹¯SîŸS*‘Æ@QŠ*PT€âuª¸ Ø¥ãÙá±Òqg¾RÎ|¶äöì[$_¤’‹Ä}¥Êã{Æp¿¯b0/)Þ@ û¬jÍ­Zû6­9­Zs9ärà"¾<©\}IåÈóà¢ÂáÈqs [ò*ÜB¡J.LfA,`b¡ ªÃ}ôµºRU¯VÕ«Õa _ëOªw< ê8™W0ô÷ᱫé†tê\_‚~¯ôö«½%œ*_éÔ!>µ/ùÈ}„û9É‹xN7Ég9Èÿ8àó£Ï:¦U+©Ãà ìqc 4Hä·ï­Ö׃ûï>GC>ae_éUÙøãÞeǸþ |IÏ'J>âq{€AAk,i±ˆÂ§BGì'K¯¨´‹M›ªm}ÛúΔ•‹™M•ýd´Á±¯lªX,æð&|Ö³Î~ÎMÌN<ó¯êgs›Í*>77JDêPɃOéܾ’‡OÎΖ´¸çÝ”xù$P’"€ï çÐo­í’YK]& Aj.# '~CÞÐ’$­Ã9 &u ²à%° îHtÞkæ™ #0"ÓÆ„˜°$Íi}†eö023ÁÝÍÞÍß- <½ ™fd‰ÉNå(¡‘0"“p §iȃaz˜¨)Æä˜Á³£·ÅÛm–†)ã”éhèP†ì4vš2ô=¥#;éN]§¾Ó 9*¶¡‚P ¡£AM¿Ð/ö‡ AMO(eL™úƒš–PO°Gè5-Á¡EDd åÀKISŸ9ÉÜk¼ã»'ëX³Ç,šã„qç.'Á8ÝNÁ‰6œÐéôNÛ Íæ­óò|N–ÑDP8&“Þ3Ú!ЬIòõÆ»Âa#=˜ËñÉ ‰èä=”Hó4äØ›Æ›º2l—z0ãEý&¦Ñúúú~ü®¹AGn†Å›BÙ$Kpt ‰®Ž( êÅ>©èë›ÀŒÔ4é#aQˆvuÁøè*ì‘・2^[ÓYÎÓLê¸2ì¸Î K8cQÝ5 Bñ²‚0žë Ã& ÓÜLF"doóª°îYý %rˆ$XÒCŠ$"ËÈrí¯I˜üÕ‚^b¼Ì>®È«²ï{Ÿ>ßù|þLbâÄù4&qˆIŒ!J…-ƒABŠl|´ …’ ¡ˆ-lHm#Ä´Úøh¦šmZÛU[éFIH Ú`“ª©.š6QiÕšÑ-¬«({Î@×ý±élÙ¾×wÏó»çy~¿ß[¿¬oK42'ÚÖŠËó¾ÙXµà`Û¼M°žšŒåW­W WÑÃM^Ý:IÙ¡-Ÿ>¶uךs7V¥êvÇnª[pÚ\ž ûödóû½ùøÿZDª² @µÑHd uîÙÓ li¨+¯¢»ìyžž¶¥dúž|A7@µubq¬r¦Cm5Q'îéB8PR³×Ö ¿Î¶óI¢’ÙiÿyŸŒ¶ZÖUÔ K.a—2EDÓóváq —h7Rv• €Ï’º½‘ºuÂÖø_Ýzøå3Á2>Ytlôíü¿¬¿N[–3a)l 1ÞÝ ù[Ôŧˆ—4¦‹A%jX…1 ±jªOßåpø}PØ%qŒ×ÛÞ›pÛ!YM <Ã.euMÒp{EJž mÿž‡_~¤¶1|h¥u>Ëßûj¹¼æþèí«;.žÒ­ßY®¾kYÖVÌà=ë h%70ƒ…iÏEãÆ_ŒO Ž7t¦á§Ë‰ «Oñ‚÷ ~“{(-ƒ£ÞQâÝœ,…MÚ,MP€¥ö ÚÊpx^ÄœVÝý*É9¢ò´=/;„¡N’!"X¡õè|Ž9õ›ýÓ…VKÚDyŸUW-ˆÍœ×›Ù¶bÖ¶x<½ïµÓú;æŸÃNЦ}„±¯Sðb@Œ2üàxΞ{o‰·ügòPÁæ¬É·wóÏÝêÁ~4t‹x ·zŸ% 5$-ðÚKg l%cHR¼DœˆÌdÙE: Íbd>Ébä ]õš,Çv놢xï@,ˆý…øíh÷î5ÛçY”#ßÔT&Ë éÄO9h]h=Ë}iç’¹‡Ç>ûïÁ¬>à]$D^NW¹X˜ÅY;ká:Ùzö$û˰,û;Ç> i,DYQ¨¸ø ¤ÒNžyyž1ʇôqÚƒÂnžöðDAè M+€–*Äs~ê:Cý§uŸ‘Çq÷â§VZù.}‡R~•R:†²>îE~:O¸1ÿû`ò-íh/S)Ä£ÕÇöņ.ÂìÞ*±”‹o¤C£´›ç&¼ t?(¡§Ož>v”8™`Nì* íDÔo¶ÜiI¥ZZÜØÅEùiBʶû†.Üÿ˜ÝPMà“wܾÄÅï,fg3ðÛN¸¸ÁÚiõã®Àc¼Âö5-„_ ½N*ØÁpƒI,^:Ž}ì)÷¡Ë÷•_án¿c¿Ùá5ÖžÿB¶:]% Œn^@dî*¸nF½XI„…à^á_)c<ÎÓæü¥Àvdžӂ€ŒÿÆ>h’á ¿}‰½³˜ë³RÖü 0 #˜õÝÌÝò·øù6ÉÂôÝ㸆a£{£±eä¸óˆ>ztôØKÊ cŒ;+NHò›Ê9çωÕ]cÝg{&¿?yìÜñs£ïï{® _;tmä#÷GF¸Ë½¦´§¬ç™žýXk®Þ¬mvmÖ•,ËrY>+dŬ”•³Ž¬’ufÕIn’ŸÆÅ7¥IyÒ1©Lªãú¸‘c9.ÇçÄœ”“sŽœ’sæÔœ–såôœ;gœ/:_|¾¤6ÃeøŒ3RFÎ82JÆ™Q3ZÆíÔ ÝSf”yzƒÑàiðJ+GGB#ë–.{ê™ý³£¾>Ú×·Îo@ÐìèØ z£Ñຎ¨9’^dEÿ¶ÑÁ§_øòà ×Wî¾¾sÓõ'ê¶4´o™·r¥Þ`Ã`bçàƒ‰ÕÛüt›´Îa'‚Ñ;L–i…ÎVhï<é(k2;Ìnó7æM“¯6—š=æóÇæ¸yÙü›)L0ÍåË îÛ_;aÓÆÇŒÄpÌú{AŸÒ§ú{q¨ì)³‡®]ŸšÂsSH#úôƒO\µg²0…üÐ4ÃÕè›Ì0vŒ¬óŽŒ¬Ã•`L+å‚©E²/\Cß;TðAýý¶¥íEΧmÌÝv°Íj³­5a|kÄ¢ýŶºþ0xÅê8ˆBJBE¤æÞŸçÛW¶Ë­ˆð¨8ðŸÛ*Ûã……iWD\AEk§ÍÐH<éIÚ×Ђ«ºw"Ù¼Ñév]«-.튪‡>¼4Ú*•¨êtúAA¥\%P”`REO øJé[=ÝÉàŒY’ËGgTµ6ª<Ϋ0œõ)ëo‰š ÇÖT-ÓIEZRï –ëNÄ13ìrH% N9·?$2æW‚C'ý^Fð¸Ô:_ҵ:¯£\ÓJ=j‰>?Q9ß¡©×j}‘z½Êµwê÷Å®%ÕŽ:J•¯UF—ý·ڊù縜|—Z«q²®Jºu r!‰qSdø—VºA¤™ú¯”•¬Pœ¢ 8ÍÅQ&åtCmŒœËàNW@PU5TœjÕò÷ª‹ª}J‰K‰j鿹®úØ&®~ïïÓ>ûüíøâÄ_±°Ç6q¾.uã$8˜¦Œ™@¯n›CY3\ÂeeP”B˜FµJëPª24ihµòOÙÊ*µû#S[Mi¤S˜˜hE#ì´Ýôl¿ç»{ç“õûdDÖ•=½/ÛJر°£Ø» !þ¶L§ÇZŽÎÎMÍ&þz˜f[ˆ è>9»[œ<3½ÿòеý7†nîÿ<6÷ý¹É¹s±‡}«ã%\p¹„Ÿ½:ñîO~…>ác[æ@8מƒ¹ìtý(Í+²UÄböíSNÁÈ)p*»õÓi0=íËŽléVõúúiß„pA¸"Ì w„Gé¢B»ð™ ;!Œáyöb•Àòùáhô—Ã]Æ^dºl] kþKT1Q6Ángñ(û YvÞ¿|‘aìEؿš|Æÿò|-üR¤üdUÒiþ:Pëó,ÐÂ/5–È“çò™{ŠËÐ*gÆNœBñ…e‰M%ʨCh¿Älm1‰D)•>J㛥TúÖD w¸”Ó¤FPLO+5P¢ƒ¡øU"‘tPViRIITB´B]±¸Å[—‚_qPžÊâ¥]­+’ŠÔ¯¶ŽÒ+jÅË?T¹ÚÎ)¨„‹5SÈF p-ƒÆ£!ÕPaÜeQ¨h¢&:C#Ö]ݰUÊŸU·¬¯U©”f¹ ç)-ÔW×ÅqË6%¶j«„^…ÏÞàhÜÛçJí®6»´àâíiMw…Ž#ä:‚.ÐVFUØßŸàkË×™ªdj¥Ê\4h9ÒÊ6ªž× ¨¡3ÄÝZ¡õ³ÂŽf3{ÐYß_«–ëÑߣ 彡Rã‰íL¸»\ŠÃùU6†Th»É¦Üå±+ZÓ‹YÎNCÔIHHÑÎAQÔ:äõ9M^/£Ö¨æÜ{z§ëŒšÃã®ü¥Ú £Œ"tæpp³zc¬¬Éi3Ú)GqBJÊ'ŸÞ&ÎÕXöޏn¿´ÀY Æj:‚5ÏEXŽD'ËO[&+'ÃÓ5éf­sÖ%«š´,>Û" "Úöâï«X#æ‚=bÝškôMú1Ó‹îFЈcð²ý†Ú k˜“nðs7p»±2Ù<>Û±ÛÜŽža~ø»²áÐUÐŽ5£¦û$Ÿ~² =?ŒF¦¥%³ úÉÌ*N%`y¤FúA©–„AÆh…¡Z 0ÆŠP¶F°AåB‚²3­%ÎË K Ë¦v tâÒh}¾z°ÒÏsÖ²ð_ds!uwEDI·¶¼rc[¼Ý½ñ“ײ@uò’H˜gÜÀ< Úå|Ñ7Õ¸'<zvÄþL_°1ªe§«u&¹¾½¯ùƒM?î›ù|sSiÄ\O· +Æ6MâȆ_{®4à–ˆ$ڻצFS¯¥N'Ïmx35Ýý~÷ÇÝ_¶ßÝðÏÔCÏÃÄW)¬“IÖ¯I…ádlC›‡žu­–Ã0*’æšêe”ÈEd¶¸ˆÍÆ×ÇÝñ¶¸,ž òY}ïé»éÇiœM›Ó¾t,Ý‘&ÒY†œ¾ÆkèÜï¹Ü,÷wîGê8Wǵq/q‡9’#xÕSÅQ|×p‹w£÷÷S¯Ìëï‹FÆDE©ÕGm§~CÍP·(:J!»’¬‡¡ŒTÏÿ ØWhÎü¯lM_©¥…’jIν¢Wòˆ(ˆC§£(N,Q°PR@¨X5z„…á"Œ+ !€•@òP5|­P¨éÕ"Q’ "@ÈE *iþµÎHé \·8•.pFÍr~ý ’qøHñ¡¸J¯QÏ禃}çG#NOîÃc;—ÿ2vu›q_=´A %³—ÑZš&äé\ûÕÁòº}o,?ÜÙ*whh­J °<¨”¼žrJ©:¢‡ƒhfcødþåßémÚ€œX¶¤ ØßZöy»†Öù½œvó«×Ó¯øó÷xú%Ú]„ ; ®Š¹ðPÛÐtòµä…Ä›ÉO _$oî&ïþ“|ZP)’²œªPž´|É@!–l)t$» ßI*ôW!\h+ôŽHæËàØ=ðö^ÏólLeÌÅ[[𛏗ɴÇ;߃KXë…Kbub±¿?¾hÏmÌÊ]Ê]ÏÝÎÝÏQ|ΞÑY.w\•ÕÚ­A«hÅ­3ಸٛ5„³¢aD+ŽƒñÛÇX<“}}丧û'Áää‹ìØ ö{½Âþ‘c±Œä.dã,ÁîápªŠ…¼ Ø2ïêíï…½3€»Ò1ßÙ ÇçÍ…èÉ/ä¿ ÏÚ@¡K fÉKï˜H%’T)³p°>`’òé d«$‹Ý‹ ±Y,üÆb¿…X×mù̶¼ä²‘¨&ª-%Q„ךCQ£KòTI²$‡[1:ù"r:éí(É™JB,‰:‘žµ¬ÄÏâ&‡§n¥—JRX¹rGè–Yºw šV¨‚XA⤣xëâ@ÏrKFD4͸¢‚!@å€È—'{àu“^i„Z¹JÅÊ\‘#)´ÞloK­Ó¹yWÙ.³Ž5AʤÇM(Ê…þÌ?êf*P}U 5j€¾DûŽŽ‰vm¹ŠVó´žnÄ)½;ʹää›sC‡ÖrhWÇ%ÍÈ»?>íÿÉÖ«y®dšÍ~µ°yУè»àkå8£‘”i´Ò˜:YiJ¼‘x$¡#:E;%g©‰b*ç¾V8Q:W:ÍÏÈgä+ò’|G¾/ÿUþRærƒÜ&÷Ê{åÏe¤‡Àmžo•‰4üø †4`&Ó±çqfhr¨8D …HçãÈãPèu'9&ô>yHþD8B>9¯ãw~—GºrƒÜþ³Ú‘ÇWŸ_—ñîX]ÈWt×ã«u@Î>uÖB0"­nˆú‘#E"Ûˆ›È:¢l‘š˜ëwèF“ªÖ¨R7}@A?„(°”¡”#áPêÁ«æ,T;­ûÎD*Rß]íó[¦Á T'Téñod¶jTƒõìó5_ê¯,, ö¥[YA`Í;\Ø-1~ûwÑ^Õ<øN Ý‘¬£ºdöQoõX[,v3Žc‡ïnŠ…»mÁ£bÁ"ÐD0JCÓÁ±Sý’`ñ f†Y#7Uж‰¼K1Û·»Óâë;:e§à0Cs«8³hù‡¹ïí!ó~¸ˆ —6câ$ék§£­°‡ˆü‹µÇÐBø9$¼ Péµe,Û7c,%M=÷d ¿)>àiä(‰B"‹M@ ¡9*Ù÷ì ÷¶ÉðEg¾*ìœ:2=u1}³÷vïƒé‡Ó‚'Ïer#¹ÉÜBî;¹Os¼!‡ÞÌ¡\îàä,š9pàöíåLt$:]ˆ2Ñh²¹Yýæ·.îÙ;Èiå÷ß»µtóÆõ­[Ò›Åä2Y.ϨIm’ß½XÙu½Ò¿µ²½Ò_ØU¹|9|w¼’-¼àªx•h®ôBéE*Zò–ÂT±rb¡ræDéLé$W1|X¹c(Ý)^;9v—/h§´KÚOµ‡ÚŠö…†-¨%µ!í„Æ^Ó~­Q‚¤MkßÓi̤†ÒÚÌ$ýñ«ê)õ¦J-«Iš”ɽV­¬éä»3÷QãËÂ#øM 0ÌØˆà,§Ê»Ë“埗Ùýå…2U.ß§þ‘q SÈß }ž  äžPv,¥ƒ¤lt–ŽÓêç;g©¯ÊM½ÁÀAï³U€Vt'¤ãR=Áëþú…U©ŠÝ*üÕÆIœ™)–5[Ù]Ö’Ë®åcD…Þ£®»%̹žóà¦ê³†šs÷ú>^ÏQ÷ǵ —Tjc¾@ÀM%tht¼ª™²UÇú{‹§~jÚŠÂ-õZÀ€‡lÕ)ÕYDë{-êÞ<¦§BܸW!ð¬Vƒ]­/ÕW¯GA¸Íƒ Qê1ÑǸ4Ù$ÙelkvY Ü,«6uª–.Ž'áæ”o¤gN +0üôóc¦ØxöÜÄ–·¿án>é±4ø:,Œ± ›º“÷{äå-îýÍ fž19:Ú(шU»ý(Eqê—‹íö= 9×ÚÄêsà¨6a´ºSç2ϵƷG9ª·p†¯Ç0¢)všûcïÙl#˜å ÁМsö/ûÐÙ——¢ï±‚˜ŠU‡Ž'Ec„Œœ a‘bUû“m‡;SHÇôí•ý­Ť£¯Zƪ0ny³Õìô¼´6=ÿäwFb¤àMÊ"˜xšeiÆnfL4½YyîÁU¹ á#<Í‹ñ‰>§ên´^€¯¨H 2JïfÒ³ ‚n–2<ÈEÑÄù—Ä%Ó’…û,üÛðŸÃ_xŸúYö½é$N³8ŽoŽØ--¸ÁÈhæ}¦.lvӒ϶Å–ÒÙS8öE‰´L¶¿ULØBcS4¡üírmâ>àøýî|oûîì;ûlÇÆÎãìÄ!É…Û`;’’âB€Aph  žCK’Ö†d hSØh·†¨Û¨Uª­ƒNUUªJ+tÛT!„¦m*lÒ*`ö»sTšlŸå·eŸ¯Ñb¶‹<o›Þç8ÞfÉç¢å8'3$“4NP aØ ÜM M|Å7c¬¦pÃãûxç‘nÀÆÞ:ÏÖ ø¼ÌÁ^Ïêñì51£f3o[µ@B «XÌ×áIºÌIÑ•Ó2Z—ì@¦×5ÞjI¯KwPEì l†bϲï³×Ù,ŲíìßXÌÁnfϳ[åÃÖ“=å,)tw÷ÐBÄ"Ý‘m‘}‘±È©È;‘Ë‘k:Yï!Á6ržDIrýχ=4)“=‹T{[kä­G*á|ºüFž­ÞÃÏ”®>ò|UUûHV"IöI!æº:è$}äi‘sidIè­¦`2-×]0å§k3¤)mIa3r@“`¦ò…¦k>£T#,E¢´~95)xœF3a_ëܲÝK:Çm’Ëý*ÊÛb›ÇB`žf›³V¿üÕž:—U™CZä D+Å65><óûN™6ºYŒæÌ²÷ø)¸É”‰œ ‹ ȶ"ÍBU™éP"hÿ$?šúœ*6ZZp©â&Ò„•Yþê´ÁfÝeBÀã/ß$-øRä7heìKDžÓ€31A&dú!¿ßÁò;ù$?Äïâ_à_ä_B&¸w”;ÆMòS¦ãÈ/÷Yä2ç\í±Y˜šœ)?ûæ/ßü "´óÕ†ºÖØÊbÓx†ý >ƒŸ+­n=7•›::ulꜥ?×´ÿØæÉÍÇñh4žHtz†ÀÐPÊnç…Y0;;“›Š©@RsY/5Ó™R§y%gBs|Ö“­ÉF³]Y<›½Xärgs¥¤»ùÞªt¨¯--¶Ï2¶Ãö Xy÷Þ܆dÿK0iûÓ[)$=—¾Hu!àªÆ—>Î\Ï ë2 Šw._áÁ ?S²„J¥.•gR‚WUÕ¸úºjX¡nWSê;êeõ–J¨*EO¦@*5>ˆ™ižê¢Ð­Ôê$u•2PÔ<?¼D§äÔ¥EÕj€9*æ@¥6ÇR‹Ê…(p%Ôt Ñò»‚ŒÞù{]]ᦦUí\“j|†%¡L6{Z IªêŒÇ÷dRR&“R¦s¹y0³¨ |@™ž™ÎÍœ¦x‰¢xMüzšã0Ír¯<ëú=¯|º±IAK˜ ñ¾ˆ›zÈÍc)R ëP AòuÚôùa?ûƒuÐ Ë YíOc†±_ ý£¤æv¡¤…g-Døâ´óé°Ðb!ÑCh¡@àYZè º¢.W#j¸¹ø¡’Ž©ðÝ–3ñb[Y¬n“HŽ:$VíÜD™2ÒÍ$Ö‡må8Ê0Ks±ÑC×Ä7|½´ggK„² H#æ¨W‘žº~H}bŸÄËë ^)ªMµíM?ðМÕ@:ý%&Æd®¨1BoÂo÷~%“©”¸_µ›M>Í Ž•´6Yþb“»·”v†í|ƒDâx[ÁnÜB ”•%y¢øðY€F%ÐÕ¹ÌŹe +ÇP GN8ß+üxûÉÕôá ùg`¤óíw5Ë/Ms.ùzþÖ£¿ÔÌ08dZŠÅaaQ7”…÷  iqìþk;ÚǽUŽüŸ›„?õ9ò7NxmË*w·_-j½?|hÂ,æoü¡=ÿͧÙâ5B) Ç*óâÛÇ!îBî+c‡¯µ€––††Z«U8xp˜VµƒŒŽ&úzz±Ñ¶{-éh}rE:zàÞ!$9ž>”•û¬I[µ¡£‚L|¦F½jöÚ¤²åN*äD¹ª¤€(ÍJ·2¦œR®)¯¨JLÁN)@QæÑßÅhúÇ$p’°>µõÇLЊLÊð¥ßŸu#ÐuÿÔ¯ÿÏŽÓM§á$اuÿ®ÆWwž±™³£·÷´¢JŠ¢&YÞ3˜ƒÃƒ‰aOWHöŠð}kAg=Ýq…ý¦Ï7Ø2þ…Á&jÊŽ€(ªI9¤è®Ñ`F·Nð #YêjÐÜ¥×ÐBéL)Y#gŸ@#`z_A?jó -Ô“~"}O¬%I {t‰H¬äi¬u‘¼Éäþ5 R,i 4”¬ñØ€'hõWš¨i pˆ?Õ´{¤\ÆLâm?×ÜTí0P'|V^°qƒùÛ¬ÀÎX¥¢üm‘[s§¦˜’8œ¦L²e©l§]&{…è'i{ãñ°³|¿×ì+1Üiö©Ãã¨}Û`Ç )ؽÀÄI«z»CJ>Üç[´~Ò¢ÛVîA}Xp‹ç)@]d«ÉHJ=v+uæü¿ó»r2ðU€knÇn0´¦‚/’I~IרÞÛéž{µÜÈ1,A;dÅaè£ÈÜã;øN¼q" ȱñ²†É²ÓèüŒi½€_0Qðç5Ñ2í2øˆ&¼ÖÕž*aêMAn•½±,\¬Ûäߺ’bÂà sFÚ†þ¨v²ö£Ú‡µ†öZP;nÄzsÞ+Þû^C›x“6úXàzàac40â¶ G <Â^aL0óèc.<¢÷ƒ 8r¹„\E°.ä$rÁ¢°¨>mÈ á>ñÝÔ#xÔ`´ËÀB0§Ä勺!sXi üãuY°& ]––pÕô1·¾Å68~^Ž;þxvû‰ß~54ñuófà/^ÖcóU +‘ðÚ²·’+ëÛÛuõh¦ÆŽ¶ ÝÜ_>ˆÁ|øôGÏÿë‹Ùçr{ÞÎçq8!l:e¥mÛ?z÷ÿìrMã¾ã8ÿ{q/îà8À6ü8sà8`ƒq0`ÇØg;Vê÷ƒ¤ÉˆSÇà8"Y¤%Kšu‰’¬Ù%•ºNÚ–¬4-šª9Ù¦uR[)›´jÒÒmÒº­Z4)ÕleéZ©Ucï‡t‡>ú}ßï÷³wâ5{ßh`îÖú÷_º~4 JÍÆGØ5¼Q·¤ûGâ83BÏ SæÙôÔ4Š¥û3C£èÛ_.—x(™Ìíß“›ÆÉ¼8‰“Jr¼=†Özz¤â¶µº»ã`ü”§\W–$¿tpm±¼T.’Vñ²øžˆžÁ;"€W¢YŽ<âIc¶,“ä#i#l³Èp/W7Ó8⇮0S,m6Iõ<£öȈÿñL1ù‚%ÐùÉÉ‚HŠ¢HÂ…ß\t[D]õÀ&J¹Á­™Tö UÖÙx âîóT"Ó ¶‚H›‡¶Ø0 +†Pž::í]TÏi™§ Ïúz5ñj(zo“Ã@˜‰€Þ€‹ k!x‰6#mŒé·Êlƒé¹ ÁôG„ºV}ï0ԘΔ'°×ÀÉÉjÜÑÏÕõ7({b,U: 5H Ÿ Q M0u+@kfÞšÎ;0’§ÍT¦å}¿bž7ÍŸ’&Æ$3ÏŸ^Îô6QØ`nÉ300¼|spЙK¬uùÖ¶—»Ê§óµe§yÍ^vŽä'XO'Ê9'¬‘äÉ907÷BÓ1þÿ2ÿ:›¿Ëÿ™×ÛyÀgæ¼§z{O–\jž¥¨°rë jù‘ªeX-GüP§¥™ úBK·'Ñï•6 ½j ¨’†¯¶d-6y< ½âÀ@of~¾ÀS"ÏS[Äô¤+Nhµõi¬m–DUô¡àí‰ …Í‚b› ¦u:¨øÆpÈ ­‡Ð[ÍND 'µ÷ñ@†… ®ü—°ÖíTõ£p I©ö´!ÂxI¨#¤æŸ¶0•\ÜüRèo õ;«-F_§‹Á«$H‚5Ù[õËô^äA«wìØ¬tùfÍ_-»£ŽfLŽîz)N3z ¹m©új¶‡™ýÕÀnÎ] ¥Šyøà4pííÅ !£g#Ì@F55Š¿³IÛN_«†€ÅV=û/ðUvU»'xÖ¨'1A0F´q|¡aß­±–õÖ]Žè1ª #!Áa´…Fõf÷¸ñ"pñÈú~æ­ÂõF³‰¥‚‚ŒÿhœÁÞÚw“ä÷~â(µÍÒ£ý‹M³Ë:è­;6>ÀÚp¯®O÷ïÄÒêß÷Þk»·ý^à^qz•¹Æ¾bx…»Î¿jüŽézõ·}ßò_í¸º¹ÜÅ‹SÂT{ž>JŸ¤¿É\éú.ó£Öt1KèØP ³wƒ¶`° XDA°\Þ^p >!.¤<Øf0©~ÿÏ‘¬.ª“ÀxÂÚ|ʉ°œåmQ¥t‡1é{|­Eh bU\)Ýùn'Ò¹‚L|¥7«@UU¬öR Äü3~‘VϬB™¯Â».^Z-ÆWáÓJqÛÒ$Ô ?€æÀ&wh*€&ë~ iNuMh°ªcªnêP@Pø‚ª4¦ ÍFr kŒr46ðÙ\¿§ÚÎöžð÷ Ÿ¿„²&ÁÌ›a|Gá¬4ÖlÅýþåoüýâ%caAÆÎ§ëp€6os׆ë¬î¥þ»ícž®ô‰^ÜÑÕšhEC»šcg‹±åt1—éâ³ÅVÂófuz7>Ä—ñNÝ$ü_¼Ÿ{¿(þ”ë¶ß·uYpû :=R›×ÝA>Ó™‘Ïa ®u•»w®ÅËÝ$•r§B)%u>õ§aKçSÇS/¦þ˜ÂàG Ógâ ~GÉ>ÙöÀ¾Øo™øhD™ò¤ãC °XVOªP##+È…„P¬Š[ )ýÊY…•0|2ªä•¯+W•Ê{Ê?•OFQ¦§(ŦLU²Ô¤Q­F¸Ð‹h [ Uã}£æ?÷‹*ë– ã~¢:$ÝÇ÷««O3•‰¸ýþ%%*Jjk¾ 8G ' ç Û´CkÁpª¶`%%+3ÝŠLµZï­°¨^{ó‰!iÌêVËOÅlÂA`ÁÍUÛGåg î{–3ï`¹è/ÚŒVÁLc(i5Ñãóãv#†äÎ! !K7— Åûž©¾ñ ;8[½ wÖO·`Ά_M &’n©uàaÃO£ B¢º¯×]%4¬4JcC>X¿°~ÕNXiNϦ"Q hÊ*è!yéyÓÐçúi wÄ À^uHÛòÕˆ~¼^7j/ÓÞ”«ß¨C¼Ç|>™¦uº¬Y ™¬˜Édc==ÏI²(IrF”z²f9FbNÝ`ódóZ[d-Tn+² Ê⼩PírB.Ë+ò¯å{òDzž–ûe¤GŽ¡S“Ùç³Ç³/f¯gq*;E²¢mÌH“žlF6š¥„tRzSú½ôH"ÎI@’VP>ÁQ™df*s)óNÏdV@‚ž¤26ɯ{ j4µhÚ˜ö?”&¨'Øu¡Z*̨ŗ-ò¡¤aV`3Ž`'.Âf[ƒ65Ô5×h ¶&â¿L—{l÷Çï÷ûùî|ûü¸ó9öů‹s~ÅvÇÆ ‰//§Ø„5žoOIØ=rn×_}XÉjY;åãµ?Ðs¤BL?×ç\WÜ/Í÷îïGo†~ÚO÷.Á[xpä:‰pˆ¦‚$é`yL,K¡òXY:BT¦Ÿ‰Î&ŽeÚ°U2½G3í¸±[„PÊ•ÇFÇ m ”ûÇÐd.·Kº¿NLÚÞ7tÀr¿Å*z¬¿Ú™×îu–îï踒ÄPHªªIÖc/j|a(:eHšÍûŽúS‘ê-2Ql„û¿ Z+nƒÌß8û%ãVV¿(ÁԙdžœÀTû˜|÷ÈO^GÁÓŸd-ÐÅÃ#{Õ · mn‘6_IÎéë­óµ7—mîL!èËÚ²b§«ý£:ùr¯¼ªyÙo‰ŒA„€ä9é"E š Q Ù.÷¯\½¿ßžçŸkôƒH‹¥m|ܽùe‰e8’A€ b€ R±çÜ|êï’ûZ§{µÞo~€ß”Àÿ¢3%5’aÑE1ˆkÖ¿6KàùCb?‚èG&Û)"µÒœ¦ƒR7¹?ùðåYcën[»æQQ"žfýó )6v˜a·“=YßÍ­7Й4¦Rûr¶­B%\i¬h•H9º%=02°G6Ë&KAÅ™òŸoŸ&p‚Õ™g$Þ4ŠfvLüºôöRÔÌR+›V€² ïé ×’Êbƒ#QkÐÒZ6¬Íh_ÒNi/j¯iß×ÞÔÞÁYcµi'5¨iË`¯î`öL3D;èñ·§Ú‹í¨ý³¶‡SM=v7~ü~5'䢸òþކ…ÔQ÷]ûg™PÃSürÜÕ^rˆdÍ@¸Ið€j´dü@4|a…åZE¸dÃ+jÈ€Õj]ll±O 6_ ølÕꪫvñmL-øoñ¼b±Û‰Xsw¬˜tš¸&ÿÀ±<«œn6È2['ÚY¿Sžwï %5‹[à”tóèk}“=®ÈjÎíàzŽÛÔ¯y¬²Ò”b¶tÊöÉføŽõ1ˆæñ  ˆ×ž~áR€¥ØºúŠÃ±œvV‘D›µ±;–ðö8ó“RÒb´E‘ú¶3úáS¾ˆyeŽâ¨ægZ¯} ¯ƒQê‹/Y|«{²)Ü€}s~í=t„Lq¢›ø^ša§Î§Î§MA¶â©¤*ÍChˆ™FÓŒÙêáS\škæ2\‹Í@æˆÕ¬›LjĬë—Õˆ¨ªÕª£Mþˆˆn†À¹¡ÛÍĦÃ"•˜ð³­Ón?F¿e0¯ÛRu¨!UWï«$Pª.ƒÅ«=ÛWÃñÿNá‹»FÜÅa/l4 ª5~Rãã†~™ãe,ö ¨á¢Í¼}_9l¶R½ovï¡A] ÏÓ—òñ ku(Òºçõ¾Œžo žëŽÃ·ÁNW†¥ºqêH¥ÈÀäã¨ÿ¬ÞÑÚ2«ãõmš{v obhß»Íum‡É*ñm{ößþF—hY ÷þõ/R -[Tÿôj<–ÆÚÏ­ý. (NÍÄõ[gÍÀ‰ôDó|úDúkéß6<Ôþùgì_–Hd!ÏSÄ2àt¯ð'`"áÌO„(jÉÉòwf/a^³KpZ6é°=Ä“r儽r×\oTÃʳÆgãÄ ÆquRë¦Ç.¯­Æ³5bþd—}lwÆïwç·³}/¶Ïwö]|gÇ>¿$NαcçlǾˋ›4ïY²”¸õÖºÒ6¨M;Úµb[§î¥£e¢ !1ÔÔj“Ú”m¡¼lB&  t*Ú"/uùÝ9nAØ–ïÎ>YÖ÷åy>)!ÆäS€ Öд-¶#aŒõÈù’—tSⱉټÜò‰òô$‹÷M# äÉÙð¨\I·Ó/ÈÕÑØ¿³1šêÀ}ý‹ýèáÕ‘Œv(ó|϶êá9‡(=T8,Øe ðdŠž^H‡âRáé¨Í/ßývÂEF.êJM­gw`¡jµ” BÄö±Ú舵4AÒŸ%D”&&Dˆ!ˆÐˆ/0|µz¥J½ \å—C6tœÿ¾£>Ov'ÙºŒôn€ákÉä <êøââ @;–Œ±<’S åØ4Ì×xA¨û»¡Äÿo¾m9VÌ9‡mA7€ mÓÊèVa·¹¥*¦×né°Ý |~¦5òFÝï«wó"ãìä]®`¨«Ú¿3ºLJÒ‹Û³ óΧÕèP¶é×g ŸÂ¡HÁ_‘d¾\³Ø‚Àv1²h·z-}+ãùr¼²8Ô<…÷2D03ðËc`^’ÿR—ÖÁ¢Àúò3Ó3嘷&¢1ÞåtÐ=‘S›(ŠB bm‡›¿Ppª^\Ëè¼EìÞpÓŽ¹¡‚O"»'Ÿè¶:{-æó d•AÕüj½x ü(ÔúüáÕ¢u¯c ó›ŠÂèŠcÍS‚$ ‚°Tçl{ëCÔñÝÔ8?qmñët.G*Ž…ún„¤É9#7ÀÞõ®…Î 4¬»v§Ó'Nx©\>qÒhÁ¦ùö¡·ö Žü]ø±ºµÆÍ[аq cþ«£Fû8~`ç õ‚6™=Íe -[m­J¢m°í˜;º•¡@  @ ¡Z¢dú,Ûd[:Ÿm’úáëðÏïrÉa7ãfSÉjw.éö(¸ƒÆì´S|TÇû§Ç’t¿^xef0Sˆ]˜42j©iDžr:`IU«µQÓ˜ZMS«•·úÊÈ»àŠÉÔ}¶¯v¾Ú‰vÞHÔË‚³g…b%VagYCXvý³.á)M×µÝÚ7´«Úo´O4¢ÝÔÐ9 hÚ­©6c1!Ëp,8ƒ-¼6ÜŠ3ÝÊ\ï­å†#ó%cb[>e21·•±,3چ㲠-Å4ú‹š“a‚Xa 5‰8ø¦å˜ËoÊd°woš¾´{HËm?ò­C= F óL èqù"CóC"Oz OωÃúèq›)ÚíIZ~ð|/>÷µÍ³LìçÙ¥å#ÍŸýTõKJðÈt÷Òwöâ¸ð컚¿«„½4å‰_#,ùxšv˜ºÑԽЇ-ÿ@܈†\Ò40>š¡ý‚(•¬%xéË0W˜wŒaJjoLQ†:b±†ZbTµäüTÂÀ) `Ì{›Xçlt/€º:¦©õ~§Z±R¦Ú6вîE!Ý¢òêAõ5Õ¢ªéF?þd´¡µ¼&>ݸû¡ÒhlÞ—ÚüÖk.n£Ø@Ú¼Ðß*½)’˜éLØò-{;Í´2б‡¹y§ÅÂàR!Ö™½™p:áw*lO²4ý£Ç©v~p”åI—är¸üÑ9Z/t…ŵï6Ë·£)ñ¥›ŸÃ‚Þ¨B|þçí;B–N1ÞßáëÚ]n¦1X8רéß‚Œ"xlVmŽ6qtÌòÄ…Œ"/êâ$.s——ƒ?Í^yFyüS “`ÌMDCã늼Î#^¨“d…ȉ¼e[­«+½† Û<†u¹µ‘Ùtd¤ÆóÛj¦’gØWË›¸â–)ŠÚ*ãZ»ŠFi ïg–ËÔ=<´m?ž0ó ¼ÕD2´UÎVXofl4)Kñ_ãœÙÅtçcI>§9·LHwúìXº—:C’]s×÷«Y6êw[ÎIJB 'ãÿLØ#C8Nf‡²·j‰Y“$„ßg'´3~‚ÜÛ¼Ž½Öü×W>KqNJ Iß»i ZSЂ¨þõ çÏÒ9ºŸÎ{ 7{~,;–ñº³¾p¥ôNå}âFéúƒ·+¿¯Þ[¹³Ÿ…ŠP4q™_ óÊ RQªÝ+Ú VѪš¦óº wè¡aQ—f–õýÂa<&ÀôBDDBÂŽ¥™Ú°î¡p5xç˜Åryi†YZši¸p²Oç­Qb0· \Á,`ß!-ÕÃü2öV´^vnwö]o q}KU¿ðØ¿ÝÔ=«8Ôπϼ:ƒÎÌÜZ½¿,kJžÀm Ý&”0ÈÜ›r~²ù¤©V›ÐöþGÌZòµ“ÏÔ°ì@Rµ‘!”´ã¢ÑΖC‰ð“vDlc!Ë=`––i= p:[z—ˆc­}kkøú€Œ{¯ïËY1ÑwnÏóÚ*¿·¾­áëâÔPRŠÆ;/¶cÇy—„¼8â$@5BÂ{¼54%„Ôt´ªuÐ6¡T¬Ù¾”O]¥MM7µEl"´ÁÔi ¶Àžs^ëÑsÏóœ¸ÿïÿ{iŸÿ´Íj`IâÇïioiŸÛPÄz¦à×O=»ƒþ!~äý˜{%àÿ¡zà]`P T0”ÅÄ)ê²Pa„ŠB¡IЯ@ôœ&U™ †EIUà'” !&t ;„Âqá¬ð+áŠð­ð C„¯T/Aø{à•âB«„øð9 ª@†rC"œ„)FJ„\S‚áª×Ã,±á"Mëv*ÏçØtÔˣɂTêbJ¥U™³Fëy%Y¼¥Æå4/ÃÙ‡RFœ²©©ÅÕ§w.÷m/­.Òcâ¤|­&/G)?Ø;±ðý×=j‚ÖéeÅßüì6¼ÈIp?ö,îiªmŠÄêãƒñ¡Ô¼Ò•ŒhÂɦä)Ý[õsÍs‰¹¤º'9–Ü5´ûðÙ$~Šw:qyøòØç _tþ1û­x7ò®û?¹7wož?<ŸIÌ$ó™|{¾#??žŸ›žŸ7këÜuž@$¯êŒìîlëì÷ŒewkõL9ëû¾¤/ãk÷u¸ËT›EAK§è4ÝFgèvºƒÎÑ£ô˜êæw"3ÃŒ2¦jõ‰Ù@â³øg‰åæå–åørb¥y¥e%¾’ÐÀÈ%ÄHgwõÖp•ª>ãö aÂð {HÁä39þU²;“ÉÖ‡Íõõá˜7·Ç¶ç²0 ¡1|bvv$Ϙóy†µ‚·ˆ”¡wÂOì›à‰¨²S‰*—ÐÅ `Ñ@$ñ@<Çã2‚˜ÆÅ¶+)r†Ì]#_%ÅÌBæLË,aªOÅÜ`n!‡åà:f¨mÝ6;:;7‹Ÿ›³÷Née³³·¡ªVÞ,qûÉÃl]tÕ5PÁ§¥²r}!ŸTÊIq#ã¬ʳ »É:ŸÒIA? ?$+cÐS`¨/†x oÖ)†FkÖ·*½ŠX3'[&®`£ Û˜6ìÓ†’Ãðиf7Þ¬3‘@Ë] ªÁÊèŽo&I“‰ç[mµA«•-9XJÖôÖ—•›uû}Ęßà z®V±N…Ê‚ö‹6—™"JÜѸÜèch•íÒ|‘›")6Òþ^×ÌSÄ2³¾nRc$¡Öó¾­oó[°$´ÓEFNA,bè—Š’ª˜Nƒb!Gš©d4E´ëN“%2Ú:ärµ\ï7ÛôG«Œ¼al¯Ën6–Öâú+;c¦ˆ€ãæò>U÷‚^gðÝ ±ÖÐZG÷GÛÏ}ì±`„qS;8~ºT£5hÕFKÿ9îƒâ(ga0M[I ¡„—}v ;ЉH?èŠÅMÍÚ¸)iI¥ìémé~U ÂÚ‹y½Ã¶‰÷ñ>ÈoæC¶z¾¡,U¥ ¥âÚ¸c«c„Mߨô·–µóƒ‰tozΟGÞ±¾#bM¢mDð+êkjT­F¤€—úƒÑ y1ô—X-lš0e<^ïe±Ñ,ЦLfDBÌ’„·ÔðJ üH"êŽÑ4Ñ2á$ºÈ¿@OdŒ;}‹5d£w0ƒ˜°b±RżxJ<'~!*-¢.1q ½sé%‡”bR·4"í“Þ”ÎH¥o¤ÿJZBb¥cÒW’Bú=X@ô&³·!ƒÊO&Ñ©I(“2ø!†_Âý*«Ê/ ;»î4 ’‰L‚©,´I>°&† hÍZ\Ãî*­®š4j†äË=§Ý—LÔs(b€=¨¯Ú«Á ŠÙþZ@¯ÃI#®²Suf“ŠÈ^Ol~ÅéV(c9…²vß&>Yu•[,¡_ÔšT”FϤûUìîЮXA²½zUE| @űF Œ&­ÅÚë:ª#Õ'Wðe%Fƒûä­»:B«½j·5—1fmxÔÏy­ó¾v¾ùÒol: Wá*[ã_ª¡·š‚Ùà:BôH)òïØÂÜcË£’ÿØ¿ãñyûyîC×}öwÓ~“¿éPmãzù]Ü8ý9{Ð~šUµ ­l†ká[8É©-„àmœÕb¶›yÕî‚å Æ¡HÙ€m€"0t `dÚ ¬o©i$å©Yž"òT@:‘‘gˆ‚Fö!(L W Šíî˜3n†~"J jšïòmB¾H€êNÈ…ÃÙá1ù`ò ØL"Ñ“p@f›‚V Òš)qƒ´@!NT7 Š^z÷Ýî\Ge ÿ2“Øñä• ÷×Åbì§1´öÞÓ÷޾Ñw«Í`‰|ò‰Ïë“ÀùCÁø?_‚©`åÉXBáDF‘7åX½cÊq`YÈ-Œ^kþr\év;n25}d8DøÚ4:½ÑÄp‚Šìéq·år¤¯­-KºÍ$é./¯)Y‚)q:¹ýG¦†¿.„'kˆÔë ÍVhJ>è.˜jgÿ0½{ÇL Q.¡ÿŒÑ+$øù‰jÈ6%Õ•° ¦¦C 2™…îòáýC(Ð`\¥œÔBþ—üH!f¬KEß·.ÀšÔø|5QÈâÆ^× ØPkÝ!oà°ÆL¡…&òÀlÂòÀ¬„Ÿž–åÆ] ¶»ã÷»Wû|w¾;Ÿ}ŽcŸÏNûlÇvÎN®¾¸ö%iÞ§N“vRÒfMé‹”uQÚ”—u- mC¨E-P:X@ˆjPuí ¡üÑýhcb¼T˜ÊÄ?aÑJHmÂïÎ$ÕâœÏ¶dùû{¾Ÿçyæ}·ZexÒ(GG“Ÿí¬È(*z8B“ã2††S/N\|õ¨˜æù]뺋œÛí ã ÐèPÊž>òþD±¨¬ûÕÒG‘VŽ{eŸÛºªé¬Œ #{‘÷-ã‰nkv¦„…à !šÉd®:49B1˜/±FÂÂr )—kt»øÈäL?‰A¨’kÊ´f‹EIL«Þ‘Å^Zh`X 7”›ËÈ-çÞΑË9Ë­‚ƒVÊ==—¯‚ýÕÅêç«g«+Õ7ª·ªïUïV?ªÒ+ð‚º£UP®ÞÙÇ?€;Wn-óÜ?iÙáv­vvHf¡™F2›0¶óÿ‡ÊNðp4¥!mņæEŠ‚@Ñî'^Ь,Œ 5гYL`H@7i,ÚR“{€ßE-†ªK `Ï»HÝN2ÙÑÞ6²5ÁúX?ßOQ"ƒ¢Ù«ŒÏß§ ±^ÀûÛä¨y²Ã‡ÑÉ #åX¬8xûá—ÂÉî”úèxeªzy4ÕÚúäëå½f+“-¡RçòŸ/=+ŽÎô·?É{H€Ò.‚Á€¡œ†vÙ;|L.w‰lø™o”ìäSïþP^8ù(о«òÁk&dÊwÆO]ÜfvAŸ‡LÆòX éÖ­«>àÆ9ˆEp÷yÔ@A(ˆý‚%â“Âqo`_ú¼÷<^¸ ~-pQþVúRæšp]ü©ß[&kGÒØ{ˆ›óâŸ,ÊóÁm!}ß{Ÿß7´ûŽX™Mò;„±.GµÑôPfGvÜXf—¹eïþŒp›½í½ÍÿZ‚ Nò"®Ûʘ’ò‰’¦4BÑq‚0ôNžŸ5tÉ0ô(Q#VŒ€™÷:rޝ‚7-fŠt1DæišL¬‚~+rLYVPD¹­ Ç (Û{ô#ú}CÇYè6Õ+ü‡Çg!–PA-­ñÐâ·àäˆÇᔓ}qÈ?mצ%¨Gè:ÙÌq<¼Ç7]¾I GWÈ–§÷øló.‘XÄ5¥µ|QWS->ÜÓ*á\æ»#Ýé¶PDJD[0–çÅÂúƒ¿Gi•éÌþ!xÜèÝ ê^D{^ø0*gfü²÷”œÝ£%µEËÅäˆ2ëùqÁç•Bó ôÛˆËKÛíª{ãèeLG2ÈÏ­âBÚëL=öóRŒÌ1¹Ø>f_lž™‘1U]ß´B¬GbYGec¸ÐSã–æjrÃ)¦_±¸ðŒ@òˆŠ Á¡; ¿EÎtxZVQÓR%‰‹ÏÑttî¾Ïý„{‡û‡ÓœÆ•9Œã:Qû€è дά“–Öœµ´Öôˆµfy…`¯³àlôãÖaïóqÃÞG‡Ö6Æ¡Õ:Ijsèå"ôÐtáºÊ{99“Tâ…Ó/”wÄüÙ!†i gæjÏ힊_ï`Ø”R-̽Ü8q­šU{(²ßµ~w¢8?:¢+ 8ÁœàU“2–ã²PÉmIªí±×Â_b»$Izl8†7˜ÃI»dä-Ö€¯7Ã},ê=×*qŠJ3H0€ÎÐT„ðÇç˜TŸê.º.‡úI¶55ÝØÃ“Ÿcå`K°+óõú;€"8VˆôMG‚ÁûÞ‘ƒ@c~Äúéò·I;äfNŽOn¿yz´u¼sãClëF¦`fYÚ¢{nË=è”ÆýÖF¸¡4Æžè@>šÀ¶W-WH•*P(EMÔu-ZÅâž-¢ÍVâR¥üþÙú„T¯OÔý‚V‰wlw3†UUû•0‰dÛÉTÔΈ¤Ý5häCªzAGuxû£ìtvà*l&áa:Þ¡a• Áí¡*­•|¥·²³r´ò°BUl»ãÉúîú\ý“õçë¿©“õ;»a®¼7k<§`4Ÿ©!M“?Þ6ƒ Ú–¶Ù3ìØiŸd3%7 ç¿ü±Ó•Ó”uç^~Ü'|ŽÕ-HÙæ×]/Ç*ɸìQùKIÕ0¦óÌ1Ê~aÀXëœ ûdÆoÞŠ ™I‘U KµvÖ/j_&Qqû¹÷> s>Š×® ùÐ?qµX{ˆ¦”ïåä0ïo'Ãó!ñŽÅ1wòÓ }W0¾vv½Ð£Z©§…#ö5IŸ ÏQš–†^{{—D>Xl€]_U8êà™¿bn¬òçE+J§ÓÐ3 E ½¢dH¥’‘ !l®¾µýg$°7-Oó•b6>¼©hª‘ÂR©UpÄ¢Ýh‰/Y%¬TZgßì³—ì_pÉf3N =“F±yPµÿ³‰fjõ9»Ô¤Lðω“›ã‡”*mº5{±É/{Õ^WÝæ'ò­Y©c&EqÊCô=«V¯%¿6¢ÿåT¥_ ‡‚ S^7å´ê¨Œ¾r Ÿ×²{þí)ÊH‰ˆÎ¶Y ¥þÎléd>,u-_<ºþà‰„'Ôzý÷lDdÜm}p†#ÄW°d?`­áŒ¡•{ry4=š3ƶY~ø_ö«>¶‰óŒ?wgûÎöùîì‹íØñgÛ‰Øù²'!¾ÄùÄ!&!äÛÄV€É` ¶j«}uˆjeÿT*ª´ªÚºjê ¥l„¬*L¢ýcb›P·©Ò˜4¦VZ¡¥‚RMJ²çl'°U-ÛþØSÞ»ßÝsï×ݽÏó¼ÏïÎØÎØÏ8Nw- mí¿p\¨¸Ð±Üu%q­Ç¬1h|áJ+*;”[©.}k©HÛÆ0 HÚôÛ •ùíRU­ªb™ô†ôëkÕ„qáßPDˆÈÅH‚ÏÆÛö°=nOÙ§ì*ûù±¤3ßU©õ >Ò·DîùÙkÒ%‰”–ˆË’žpa"N¤ˆ)BEäŒe2ô%ú*M 4A㉧â©C)j*5Ÿ"Sïg„ÏÒ+xÞIÇ„;÷¥…\~"ÈøÍ•¹ Co°¾ý¹œÍXDÒù0ÈgtæõfY¯­Ó…+äA…§¼K­Û€›^·Z÷Gü‘Ñ# ÉG¶–eµ¢y½ÎPTo÷ºCQ±Âä90öæ _'f«+{xàñ乘’6(…‰½üŽDöÍ~5« ½ gÌ^Ä2¼PIöh'žî›Z½÷AQtÛhàÇÎæ+¯aØ’ü`•ä´–OM¬¾úÂàÏOœ¦ÛJã.ÇÔ‡'²5C"rñékÍß‘&¿VÇ2œVÑñxòø|ªÖ!h*Ñ> k)Sa˜»’´ìþ»›O³¬†ãù‘2V£ñ¶ONJme¥nwBšœœÓx1¥ô&Üî4?R„}x÷HB3)y™Œ£v™ø>4‘¾³A•YEâÔY‡*)‹(i÷ÊÄ"BÏg´£Jzÿ–J…Œ·•%%¡éúßG¿w=D@ȪQ¡Ð,\Td®OÓáÅ•ÈÒòMæ2™¸)s6ÙW×Ï/l¨yA¸|ù2Í --9Q¾0xp-²G7äRB™c 6}a¢@çh_oÈļ¾¹(ŸÃTdcYg(þ†<'Ì?Nuß6pèKJJ4ñ¼ÑjqÎõ,«×ê•Zhñø+âOÕ¿<ÞVâà8£³Ù¬åŒå,«Ô˜¸ú­ÇŸ°Š¢ž3+Hc´µK8ÊìòòçS±Šòúd{£ÃèØ‘÷ez4Ê}Wÿjtz#Ï–JCUmN¥Ò¨Wsf½§”ÑðÞiæ\‚ºÉSmÖéI¥J •5ë5)ª­VK¬Ç?:t{ìØ¨£ÈæäW³f]³+˜©éÞXý‰©.ž) #µßtIž'“ûÞø$6 *5™Ñö¥lS§ÅP¬¬±p6WõÅÕÏO¾ÿÊâìg‘gdþslåsêUGà–dO%*#‘¹(ZX¤Ü¦°)n¢L÷aV‰;±úüE×o\×]”Kæ.Z¿_9oSŦg#{0ž[¸;«í]&NÁ6Zãc\da5¢ ºÄjQ·‹‘qÏ>«ûY"j%x,–ÀÜTÿ|ÿ“ýÏöÿ _‰*ýö¹ÞÛÃÃ9¦–¸ÕK«?”®€„uÍ]#ç ¨6L¶êÂÈqòŠ\ùl%#?+w0ªÞ”i~€;yE¯¤cá ?A—ˆ½“ÈoÁÈG7T%+>NDÿ‰ý`¦eu`Ô0=,Èv‘ׯœ·É>‹5reÞ\Ö§D!¢TÓÜî';c[õ:µBí6—*4õ¥•mÏïMÿ¶Š3è–mŸh4·ú‚û¦²ªaµ±ÙQ«6rle£‘WÐQ[nW³&×àX;²Ë¥Khm.ƒÙèoª)öõô4ŽA¢„WÄ;ÆQóJJìåáþÀ3œ‡¯ Q¹ \ Pãjÿ”G£á€Ø-€–b€-Ÿ>­¶<¤!€¶kíïtü  ¿¥û9€ÞsIü¦¾·úqÎ틸;]#‡FqÌ~kß=…ÿ•éÈ^˜Æú=Ø¿uÿu?Ö`6±‰Mlb›ØÄ&þÿ$æ&r)J–+B-(f@£exAo€"ãF›Óå(óúü嬄P¸º¦¶"Ñ†ÆØz—vèèìêîéÝšìÛÖŸÚ>0¸chçðÈèØøÄdúá/ÿ_|¯6ðWYpA)x¡ÂP ­Ð½°†a ][Ã^rkø¡j Ú ’0ˆ­Ùµµµ¿|ÙQX÷//ÀÚí¯ìÁÀÞÂ,˜ ²eSAV¡T)kV¡Æ®{^&ƒLA¦°ÇÁ‚¬@ùTAV¡üN_÷¶ŽŽî`wv1{`þàîªÞÃÙ¹Ùéÿ¤ú ¶AÝDdaqæñ­»qöÀ ¹\ýW÷­Âu?ŒÏs0 ›÷¿ï‹+G>Ÿ¢&ßC#'ÑÂÐŒË:Cþ1ï# Nb £@I~Z¿Ã^Ò€JØ(ÿª®8ÐZepZ¸Bߦ¾UÐiy>¹ö²zŠo¹ %L®÷O¹WÚr÷£ío­v¬<¦fhÙd=æfþÇnäÄF endstream endobj 1700 0 obj << /Type /Encoding /Differences [ 1 /bullet ] >> endobj 1701 0 obj << /Filter /FlateDecode /Length 208 >> stream H‰T½Â0 „÷>…GCÚÎUX:ð# ìiâV‘ˆ¹éз')ÄKöåÓ-öÍ¡!@\Ø©ô†4ãè&V† (AÖn©ÊJ"Âí<´ õª*×(ŽgØ´³íÜs—oAœY#`s+î8h'ïŸh‘äP× ±ÏÄþ(ýIZŒòŠ.ób5tG/²¤¡Ê‹ú]ô¿ö!ºþÝþ¾Ve^–u‰–à´É×[MÌ1Ö²î’(e0„ß‹xç“ezÙK€CÈi? endstream endobj 1702 0 obj << /Type /Encoding /Differences [ 1 /barb4right ] >> endobj 1703 0 obj << /Producer (Acrobat Distiller 4.0 for Windows) /Creator () /ModDate (D:20091130164416+01'00') /Title (XML Configuration Reference for \013Synthesis SyncML\013Server & Client \ 3.4 Products\n) /CreationDate (D:20091130164308) >> endobj 1704 0 obj << /Type /Pages /Kids [ 1740 0 R 1 0 R 10 0 R 15 0 R 66 0 R 121 0 R 173 0 R 219 0 R 269 0 R 317 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1705 0 obj << /Type /Pages /Kids [ 1704 0 R 1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R ] /Count 100 /Parent 1715 0 R >> endobj 1706 0 obj << /Type /Pages /Kids [ 361 0 R 399 0 R 411 0 R 425 0 R 442 0 R 447 0 R 450 0 R 456 0 R 463 0 R 466 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1707 0 obj << /Type /Pages /Kids [ 469 0 R 479 0 R 485 0 R 489 0 R 492 0 R 507 0 R 519 0 R 525 0 R 529 0 R 537 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1708 0 obj << /Type /Pages /Kids [ 543 0 R 547 0 R 554 0 R 559 0 R 563 0 R 567 0 R 573 0 R 576 0 R 580 0 R 584 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1709 0 obj << /Type /Pages /Kids [ 595 0 R 604 0 R 615 0 R 624 0 R 638 0 R 652 0 R 656 0 R 662 0 R 669 0 R 672 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1710 0 obj << /Type /Pages /Kids [ 675 0 R 682 0 R 686 0 R 691 0 R 697 0 R 706 0 R 713 0 R 717 0 R 721 0 R 724 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1711 0 obj << /Type /Pages /Kids [ 728 0 R 733 0 R 737 0 R 742 0 R 748 0 R 754 0 R 760 0 R 763 0 R 766 0 R 769 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1712 0 obj << /Type /Pages /Kids [ 772 0 R 775 0 R 779 0 R 787 0 R 792 0 R 795 0 R 804 0 R 810 0 R 817 0 R 821 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1713 0 obj << /Type /Pages /Kids [ 827 0 R 831 0 R 836 0 R 842 0 R 845 0 R 851 0 R 854 0 R 858 0 R 865 0 R 868 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1714 0 obj << /Type /Pages /Kids [ 874 0 R 882 0 R 885 0 R 890 0 R 898 0 R 904 0 R 910 0 R 917 0 R 922 0 R 927 0 R ] /Count 10 /Parent 1705 0 R >> endobj 1715 0 obj << /Type /Pages /Kids [ 1705 0 R 1717 0 R 1727 0 R ] /Count 206 >> endobj 1716 0 obj << /Type /Pages /Kids [ 931 0 R 943 0 R 948 0 R 952 0 R 956 0 R 961 0 R 966 0 R 970 0 R 974 0 R 979 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1717 0 obj << /Type /Pages /Kids [ 1716 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R ] /Count 100 /Parent 1715 0 R >> endobj 1718 0 obj << /Type /Pages /Kids [ 986 0 R 991 0 R 1004 0 R 1008 0 R 1016 0 R 1026 0 R 1032 0 R 1038 0 R 1042 0 R 1046 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1719 0 obj << /Type /Pages /Kids [ 1054 0 R 1066 0 R 1074 0 R 1085 0 R 1098 0 R 1117 0 R 1126 0 R 1135 0 R 1144 0 R 1150 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1720 0 obj << /Type /Pages /Kids [ 1159 0 R 1163 0 R 1168 0 R 1174 0 R 1190 0 R 1196 0 R 1204 0 R 1212 0 R 1225 0 R 1233 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1721 0 obj << /Type /Pages /Kids [ 1241 0 R 1249 0 R 1254 0 R 1259 0 R 1264 0 R 1269 0 R 1273 0 R 1277 0 R 1283 0 R 1291 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1722 0 obj << /Type /Pages /Kids [ 1297 0 R 1305 0 R 1323 0 R 1330 0 R 1340 0 R 1347 0 R 1352 0 R 1357 0 R 1365 0 R 1371 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1723 0 obj << /Type /Pages /Kids [ 1379 0 R 1385 0 R 1393 0 R 1400 0 R 1411 0 R 1418 0 R 1428 0 R 1441 0 R 1446 0 R 1452 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1724 0 obj << /Type /Pages /Kids [ 1458 0 R 1466 0 R 1472 0 R 1476 0 R 1485 0 R 1495 0 R 1501 0 R 1505 0 R 1513 0 R 1524 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1725 0 obj << /Type /Pages /Kids [ 1539 0 R 1546 0 R 1552 0 R 1556 0 R 1562 0 R 1567 0 R 1574 0 R 1579 0 R 1583 0 R 1593 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1726 0 obj << /Type /Pages /Kids [ 1596 0 R 1604 0 R 1610 0 R 1613 0 R 1616 0 R 1621 0 R 1627 0 R 1634 0 R 1637 0 R 1643 0 R ] /Count 10 /Parent 1717 0 R >> endobj 1727 0 obj << /Type /Pages /Kids [ 1647 0 R 1650 0 R 1653 0 R 1656 0 R 1659 0 R 1662 0 R ] /Count 6 /Parent 1715 0 R >> endobj 1728 0 obj << /Dt (D:20091130164416) /JTM (Distiller) >> endobj 1729 0 obj /This endobj 1730 0 obj << /CP (Distiller) /Fi 1729 0 R >> endobj 1731 0 obj << /R [ 600 600 ] >> endobj 1732 0 obj << /JTF 0 /MB [ 0 0 595 842 ] /R 1731 0 R /W [ 0 205 ] >> endobj 1733 0 obj << /Fi [ 1730 0 R ] /P [ 1732 0 R ] >> endobj 1734 0 obj << /Dm [ 595 842 595 842 ] >> endobj 1735 0 obj << /Me 1734 0 R >> endobj 1736 0 obj << /D [ 1733 0 R ] /MS 1735 0 R /Type /JobTicketContents >> endobj 1737 0 obj << /A [ 1728 0 R ] /Cn [ 1736 0 R ] /V 1.10001 >> endobj xref 0 1738 0000000000 65535 f 0000780552 00000 n 0000780754 00000 n 0000780923 00000 n 0000781105 00000 n 0000781298 00000 n 0000781463 00000 n 0000781630 00000 n 0000781806 00000 n 0000781988 00000 n 0000785462 00000 n 0000785645 00000 n 0000785805 00000 n 0000785965 00000 n 0000786134 00000 n 0000788417 00000 n 0000788926 00000 n 0000789084 00000 n 0000789242 00000 n 0000789401 00000 n 0000789560 00000 n 0000789719 00000 n 0000789878 00000 n 0000790037 00000 n 0000790196 00000 n 0000790355 00000 n 0000790514 00000 n 0000790673 00000 n 0000790832 00000 n 0000790991 00000 n 0000791150 00000 n 0000791309 00000 n 0000791468 00000 n 0000791627 00000 n 0000791786 00000 n 0000791945 00000 n 0000792104 00000 n 0000792263 00000 n 0000792422 00000 n 0000792581 00000 n 0000792740 00000 n 0000792899 00000 n 0000793058 00000 n 0000793217 00000 n 0000793376 00000 n 0000793535 00000 n 0000793694 00000 n 0000793853 00000 n 0000794012 00000 n 0000794171 00000 n 0000794330 00000 n 0000794489 00000 n 0000794648 00000 n 0000794807 00000 n 0000794966 00000 n 0000795125 00000 n 0000795284 00000 n 0000795443 00000 n 0000795602 00000 n 0000795761 00000 n 0000795920 00000 n 0000796079 00000 n 0000796237 00000 n 0000796394 00000 n 0000796551 00000 n 0000796735 00000 n 0000799129 00000 n 0000799688 00000 n 0000799847 00000 n 0000800006 00000 n 0000800165 00000 n 0000800324 00000 n 0000800483 00000 n 0000800642 00000 n 0000800801 00000 n 0000800960 00000 n 0000801119 00000 n 0000801278 00000 n 0000801437 00000 n 0000801596 00000 n 0000801755 00000 n 0000801914 00000 n 0000802073 00000 n 0000802232 00000 n 0000802391 00000 n 0000802550 00000 n 0000802709 00000 n 0000802868 00000 n 0000803027 00000 n 0000803186 00000 n 0000803345 00000 n 0000803504 00000 n 0000803663 00000 n 0000803822 00000 n 0000803981 00000 n 0000804140 00000 n 0000804299 00000 n 0000804458 00000 n 0000804617 00000 n 0000804776 00000 n 0000804935 00000 n 0000805095 00000 n 0000805255 00000 n 0000805415 00000 n 0000805575 00000 n 0000805735 00000 n 0000805895 00000 n 0000806055 00000 n 0000806215 00000 n 0000806375 00000 n 0000806535 00000 n 0000806695 00000 n 0000806855 00000 n 0000807015 00000 n 0000807175 00000 n 0000807335 00000 n 0000807495 00000 n 0000807654 00000 n 0000807812 00000 n 0000807970 00000 n 0000808155 00000 n 0000811289 00000 n 0000811859 00000 n 0000812019 00000 n 0000812179 00000 n 0000812339 00000 n 0000812499 00000 n 0000812659 00000 n 0000812819 00000 n 0000812979 00000 n 0000813139 00000 n 0000813299 00000 n 0000813459 00000 n 0000813619 00000 n 0000813779 00000 n 0000813939 00000 n 0000814099 00000 n 0000814259 00000 n 0000814419 00000 n 0000814579 00000 n 0000814739 00000 n 0000814899 00000 n 0000815059 00000 n 0000815219 00000 n 0000815379 00000 n 0000815539 00000 n 0000815699 00000 n 0000815859 00000 n 0000816019 00000 n 0000816179 00000 n 0000816339 00000 n 0000816499 00000 n 0000816659 00000 n 0000816819 00000 n 0000816979 00000 n 0000817139 00000 n 0000817299 00000 n 0000817459 00000 n 0000817619 00000 n 0000817779 00000 n 0000817939 00000 n 0000818099 00000 n 0000818259 00000 n 0000818419 00000 n 0000818579 00000 n 0000818739 00000 n 0000818899 00000 n 0000819059 00000 n 0000819219 00000 n 0000819378 00000 n 0000819536 00000 n 0000819694 00000 n 0000819879 00000 n 0000823286 00000 n 0000823807 00000 n 0000823967 00000 n 0000824127 00000 n 0000824287 00000 n 0000824447 00000 n 0000824607 00000 n 0000824767 00000 n 0000824927 00000 n 0000825087 00000 n 0000825247 00000 n 0000825407 00000 n 0000825567 00000 n 0000825727 00000 n 0000825887 00000 n 0000826047 00000 n 0000826207 00000 n 0000826367 00000 n 0000826527 00000 n 0000826687 00000 n 0000826847 00000 n 0000827007 00000 n 0000827167 00000 n 0000827327 00000 n 0000827487 00000 n 0000827647 00000 n 0000827807 00000 n 0000827967 00000 n 0000828127 00000 n 0000828287 00000 n 0000828447 00000 n 0000828608 00000 n 0000828769 00000 n 0000828930 00000 n 0000829091 00000 n 0000829252 00000 n 0000829413 00000 n 0000829574 00000 n 0000829735 00000 n 0000829896 00000 n 0000830057 00000 n 0000830218 00000 n 0000830379 00000 n 0000830538 00000 n 0000830697 00000 n 0000830868 00000 n 0000834248 00000 n 0000834801 00000 n 0000834962 00000 n 0000835123 00000 n 0000835284 00000 n 0000835445 00000 n 0000835606 00000 n 0000835767 00000 n 0000835928 00000 n 0000836089 00000 n 0000836250 00000 n 0000836411 00000 n 0000836572 00000 n 0000836733 00000 n 0000836894 00000 n 0000837055 00000 n 0000837216 00000 n 0000837377 00000 n 0000837538 00000 n 0000837699 00000 n 0000837860 00000 n 0000838021 00000 n 0000838182 00000 n 0000838343 00000 n 0000838504 00000 n 0000838665 00000 n 0000838826 00000 n 0000838987 00000 n 0000839148 00000 n 0000839309 00000 n 0000839470 00000 n 0000839631 00000 n 0000839793 00000 n 0000839955 00000 n 0000840117 00000 n 0000840279 00000 n 0000840441 00000 n 0000840603 00000 n 0000840765 00000 n 0000840926 00000 n 0000841087 00000 n 0000841248 00000 n 0000841409 00000 n 0000841570 00000 n 0000841731 00000 n 0000841892 00000 n 0000842052 00000 n 0000842211 00000 n 0000842370 00000 n 0000842541 00000 n 0000846028 00000 n 0000846565 00000 n 0000846726 00000 n 0000846887 00000 n 0000847048 00000 n 0000847209 00000 n 0000847370 00000 n 0000847531 00000 n 0000847692 00000 n 0000847853 00000 n 0000848014 00000 n 0000848175 00000 n 0000848336 00000 n 0000848497 00000 n 0000848658 00000 n 0000848819 00000 n 0000848980 00000 n 0000849141 00000 n 0000849302 00000 n 0000849463 00000 n 0000849624 00000 n 0000849785 00000 n 0000849946 00000 n 0000850107 00000 n 0000850268 00000 n 0000850429 00000 n 0000850590 00000 n 0000850751 00000 n 0000850912 00000 n 0000851073 00000 n 0000851234 00000 n 0000851395 00000 n 0000851556 00000 n 0000851717 00000 n 0000851878 00000 n 0000852039 00000 n 0000852200 00000 n 0000852361 00000 n 0000852522 00000 n 0000852683 00000 n 0000852844 00000 n 0000853005 00000 n 0000853166 00000 n 0000853327 00000 n 0000853488 00000 n 0000853647 00000 n 0000853806 00000 n 0000853991 00000 n 0000857394 00000 n 0000857899 00000 n 0000858060 00000 n 0000858221 00000 n 0000858382 00000 n 0000858543 00000 n 0000858704 00000 n 0000858865 00000 n 0000859026 00000 n 0000859187 00000 n 0000859348 00000 n 0000859509 00000 n 0000859670 00000 n 0000859831 00000 n 0000859992 00000 n 0000860153 00000 n 0000860314 00000 n 0000860475 00000 n 0000860636 00000 n 0000860797 00000 n 0000860958 00000 n 0000861119 00000 n 0000861280 00000 n 0000861441 00000 n 0000861602 00000 n 0000861763 00000 n 0000861924 00000 n 0000862085 00000 n 0000862246 00000 n 0000862407 00000 n 0000862568 00000 n 0000862729 00000 n 0000862890 00000 n 0000863051 00000 n 0000863212 00000 n 0000863373 00000 n 0000863534 00000 n 0000863695 00000 n 0000863856 00000 n 0000864017 00000 n 0000864177 00000 n 0000864336 00000 n 0000864495 00000 n 0000864680 00000 n 0000867853 00000 n 0000868309 00000 n 0000868470 00000 n 0000868631 00000 n 0000868792 00000 n 0000868953 00000 n 0000869114 00000 n 0000869275 00000 n 0000869436 00000 n 0000869597 00000 n 0000869758 00000 n 0000869919 00000 n 0000870080 00000 n 0000870241 00000 n 0000870402 00000 n 0000870563 00000 n 0000870724 00000 n 0000870885 00000 n 0000871046 00000 n 0000871207 00000 n 0000871368 00000 n 0000871529 00000 n 0000871690 00000 n 0000871851 00000 n 0000872012 00000 n 0000872173 00000 n 0000872334 00000 n 0000872495 00000 n 0000872656 00000 n 0000872817 00000 n 0000872978 00000 n 0000873139 00000 n 0000873300 00000 n 0000873461 00000 n 0000873622 00000 n 0000873783 00000 n 0000873944 00000 n 0000874129 00000 n 0000876617 00000 n 0000876853 00000 n 0000877035 00000 n 0000877196 00000 n 0000877357 00000 n 0000877518 00000 n 0000877679 00000 n 0000877839 00000 n 0000877999 00000 n 0000878157 00000 n 0000878353 00000 n 0000881791 00000 n 0000881866 00000 n 0000882127 00000 n 0000882288 00000 n 0000882449 00000 n 0000882610 00000 n 0000882770 00000 n 0000882932 00000 n 0000883094 00000 n 0000883255 00000 n 0000883416 00000 n 0000883578 00000 n 0000883738 00000 n 0000883898 00000 n 0000884094 00000 n 0000887623 00000 n 0000887908 00000 n 0000888069 00000 n 0000888229 00000 n 0000888390 00000 n 0000888551 00000 n 0000888712 00000 n 0000888872 00000 n 0000889032 00000 n 0000889193 00000 n 0000889354 00000 n 0000889515 00000 n 0000889676 00000 n 0000889837 00000 n 0000889998 00000 n 0000890157 00000 n 0000890353 00000 n 0000893866 00000 n 0000894054 00000 n 0000894216 00000 n 0000894378 00000 n 0000894587 00000 n 0000897992 00000 n 0000898151 00000 n 0000898306 00000 n 0000899290 00000 n 0000899486 00000 n 0000899647 00000 n 0000899808 00000 n 0000899969 00000 n 0000900165 00000 n 0000903410 00000 n 0000903614 00000 n 0000903775 00000 n 0000903937 00000 n 0000904098 00000 n 0000904260 00000 n 0000904455 00000 n 0000907548 00000 n 0000907707 00000 n 0000907917 00000 n 0000910578 00000 n 0000910737 00000 n 0000910919 00000 n 0000912377 00000 n 0000912605 00000 n 0000912766 00000 n 0000912927 00000 n 0000913088 00000 n 0000913249 00000 n 0000913410 00000 n 0000913571 00000 n 0000913732 00000 n 0000913944 00000 n 0000916962 00000 n 0000917158 00000 n 0000917319 00000 n 0000917480 00000 n 0000917641 00000 n 0000917853 00000 n 0000920503 00000 n 0000920683 00000 n 0000920844 00000 n 0000921069 00000 n 0000923480 00000 n 0000923639 00000 n 0000923835 00000 n 0000927267 00000 n 0000927536 00000 n 0000927697 00000 n 0000927859 00000 n 0000928021 00000 n 0000928183 00000 n 0000928345 00000 n 0000928506 00000 n 0000928667 00000 n 0000928829 00000 n 0000928991 00000 n 0000929152 00000 n 0000929314 00000 n 0000929474 00000 n 0000929671 00000 n 0000934017 00000 n 0000934262 00000 n 0000934422 00000 n 0000934584 00000 n 0000934745 00000 n 0000934906 00000 n 0000935067 00000 n 0000935228 00000 n 0000935389 00000 n 0000935550 00000 n 0000935710 00000 n 0000935922 00000 n 0000939068 00000 n 0000939264 00000 n 0000939445 00000 n 0000939605 00000 n 0000939766 00000 n 0000939950 00000 n 0000942809 00000 n 0000942989 00000 n 0000943150 00000 n 0000943360 00000 n 0000945928 00000 n 0000946140 00000 n 0000946301 00000 n 0000946462 00000 n 0000946623 00000 n 0000946784 00000 n 0000946945 00000 n 0000947157 00000 n 0000950723 00000 n 0000950919 00000 n 0000951080 00000 n 0000951241 00000 n 0000951402 00000 n 0000951600 00000 n 0000954486 00000 n 0000954666 00000 n 0000954826 00000 n 0000955051 00000 n 0000957762 00000 n 0000957966 00000 n 0000958127 00000 n 0000958287 00000 n 0000958448 00000 n 0000958609 00000 n 0000958834 00000 n 0000962536 00000 n 0000962724 00000 n 0000962885 00000 n 0000963046 00000 n 0000963271 00000 n 0000966291 00000 n 0000966471 00000 n 0000966632 00000 n 0000966801 00000 n 0000968708 00000 n 0000968888 00000 n 0000969049 00000 n 0000969233 00000 n 0000972047 00000 n 0000972243 00000 n 0000972404 00000 n 0000972564 00000 n 0000972726 00000 n 0000972936 00000 n 0000975146 00000 n 0000975305 00000 n 0000975490 00000 n 0000980736 00000 n 0000980916 00000 n 0000981083 00000 n 0000981268 00000 n 0000985985 00000 n 0000986165 00000 n 0000986326 00000 n 0000986497 00000 n 0000990967 00000 n 0000991203 00000 n 0000991364 00000 n 0000991525 00000 n 0000991686 00000 n 0000991847 00000 n 0000992008 00000 n 0000992169 00000 n 0000992330 00000 n 0000992491 00000 n 0000992662 00000 n 0000998240 00000 n 0000998460 00000 n 0000998621 00000 n 0000998782 00000 n 0000998943 00000 n 0000999104 00000 n 0000999266 00000 n 0000999428 00000 n 0000999640 00000 n 0001002886 00000 n 0001003122 00000 n 0001003283 00000 n 0001003444 00000 n 0001003605 00000 n 0001003766 00000 n 0001003927 00000 n 0001004088 00000 n 0001004249 00000 n 0001004410 00000 n 0001004595 00000 n 0001008710 00000 n 0001008930 00000 n 0001009091 00000 n 0001009253 00000 n 0001009414 00000 n 0001009576 00000 n 0001009737 00000 n 0001009898 00000 n 0001010083 00000 n 0001015020 00000 n 0001015281 00000 n 0001015442 00000 n 0001015603 00000 n 0001015764 00000 n 0001015926 00000 n 0001016088 00000 n 0001016249 00000 n 0001016411 00000 n 0001016573 00000 n 0001016735 00000 n 0001016896 00000 n 0001017057 00000 n 0001017228 00000 n 0001021590 00000 n 0001021851 00000 n 0001022012 00000 n 0001022174 00000 n 0001022336 00000 n 0001022498 00000 n 0001022660 00000 n 0001022821 00000 n 0001022982 00000 n 0001023143 00000 n 0001023304 00000 n 0001023465 00000 n 0001023625 00000 n 0001023810 00000 n 0001027710 00000 n 0001027890 00000 n 0001028052 00000 n 0001028208 00000 n 0001029373 00000 n 0001029569 00000 n 0001029730 00000 n 0001029891 00000 n 0001030053 00000 n 0001030265 00000 n 0001034773 00000 n 0001034977 00000 n 0001035138 00000 n 0001035299 00000 n 0001035460 00000 n 0001035621 00000 n 0001035833 00000 n 0001040380 00000 n 0001040539 00000 n 0001040764 00000 n 0001044684 00000 n 0001044843 00000 n 0001045068 00000 n 0001048109 00000 n 0001048313 00000 n 0001048474 00000 n 0001048635 00000 n 0001048796 00000 n 0001048958 00000 n 0001049156 00000 n 0001052563 00000 n 0001052743 00000 n 0001052904 00000 n 0001053060 00000 n 0001053964 00000 n 0001054152 00000 n 0001054311 00000 n 0001054472 00000 n 0001054655 00000 n 0001057025 00000 n 0001057221 00000 n 0001057382 00000 n 0001057543 00000 n 0001057701 00000 n 0001057871 00000 n 0001059972 00000 n 0001060192 00000 n 0001060353 00000 n 0001060513 00000 n 0001060674 00000 n 0001060835 00000 n 0001060996 00000 n 0001061155 00000 n 0001061367 00000 n 0001063699 00000 n 0001063903 00000 n 0001064064 00000 n 0001064225 00000 n 0001064386 00000 n 0001064547 00000 n 0001064759 00000 n 0001066994 00000 n 0001067174 00000 n 0001067335 00000 n 0001067545 00000 n 0001070637 00000 n 0001070817 00000 n 0001070978 00000 n 0001071160 00000 n 0001075357 00000 n 0001075516 00000 n 0001075726 00000 n 0001078343 00000 n 0001078502 00000 n 0001078732 00000 n 0001080783 00000 n 0001087523 00000 n 0001087711 00000 n 0001087872 00000 n 0001088033 00000 n 0001088229 00000 n 0001090458 00000 n 0001090638 00000 n 0001090799 00000 n 0001090995 00000 n 0001093520 00000 n 0001093708 00000 n 0001093868 00000 n 0001094030 00000 n 0001094240 00000 n 0001096968 00000 n 0001097164 00000 n 0001097325 00000 n 0001097485 00000 n 0001097647 00000 n 0001097843 00000 n 0001100690 00000 n 0001100886 00000 n 0001101047 00000 n 0001101208 00000 n 0001101369 00000 n 0001101539 00000 n 0001103616 00000 n 0001103812 00000 n 0001103973 00000 n 0001104135 00000 n 0001104296 00000 n 0001104479 00000 n 0001106733 00000 n 0001106892 00000 n 0001107047 00000 n 0001107638 00000 n 0001107797 00000 n 0001108022 00000 n 0001110735 00000 n 0001110894 00000 n 0001111090 00000 n 0001113703 00000 n 0001113862 00000 n 0001114032 00000 n 0001115820 00000 n 0001115979 00000 n 0001116175 00000 n 0001118362 00000 n 0001118542 00000 n 0001118703 00000 n 0001118899 00000 n 0001122069 00000 n 0001122281 00000 n 0001122443 00000 n 0001122602 00000 n 0001122764 00000 n 0001122926 00000 n 0001123085 00000 n 0001123281 00000 n 0001126457 00000 n 0001126645 00000 n 0001126806 00000 n 0001126967 00000 n 0001127149 00000 n 0001131299 00000 n 0001131458 00000 n 0001131683 00000 n 0001134792 00000 n 0001135012 00000 n 0001135173 00000 n 0001135334 00000 n 0001135495 00000 n 0001135656 00000 n 0001135817 00000 n 0001135976 00000 n 0001136188 00000 n 0001138913 00000 n 0001139109 00000 n 0001139270 00000 n 0001139431 00000 n 0001139592 00000 n 0001139831 00000 n 0001143391 00000 n 0001143595 00000 n 0001143756 00000 n 0001143917 00000 n 0001144079 00000 n 0001144240 00000 n 0001144451 00000 n 0001148537 00000 n 0001148717 00000 n 0001148878 00000 n 0001149103 00000 n 0001152439 00000 n 0001152635 00000 n 0001152797 00000 n 0001152958 00000 n 0001153119 00000 n 0001153316 00000 n 0001157492 00000 n 0001157672 00000 n 0001157833 00000 n 0001158058 00000 n 0001161362 00000 n 0001161550 00000 n 0001161711 00000 n 0001161872 00000 n 0001162097 00000 n 0001165094 00000 n 0001165290 00000 n 0001165451 00000 n 0001165612 00000 n 0001165773 00000 n 0001165984 00000 n 0001169390 00000 n 0001169549 00000 n 0001169774 00000 n 0001173476 00000 n 0001173672 00000 n 0001173833 00000 n 0001173994 00000 n 0001174156 00000 n 0001174367 00000 n 0001178268 00000 n 0001178427 00000 n 0001178582 00000 n 0001180557 00000 n 0001180737 00000 n 0001180898 00000 n 0001181108 00000 n 0001183221 00000 n 0001183425 00000 n 0001183586 00000 n 0001183747 00000 n 0001183908 00000 n 0001184067 00000 n 0001184263 00000 n 0001187008 00000 n 0001187167 00000 n 0001187392 00000 n 0001189743 00000 n 0001189939 00000 n 0001190100 00000 n 0001190261 00000 n 0001190422 00000 n 0001190634 00000 n 0001194842 00000 n 0001195054 00000 n 0001195215 00000 n 0001195376 00000 n 0001195537 00000 n 0001195698 00000 n 0001195859 00000 n 0001196069 00000 n 0001199224 00000 n 0001199383 00000 n 0001199566 00000 n 0001201759 00000 n 0001201947 00000 n 0001202108 00000 n 0001202269 00000 n 0001202439 00000 n 0001204913 00000 n 0001205125 00000 n 0001205286 00000 n 0001205447 00000 n 0001205608 00000 n 0001205769 00000 n 0001205930 00000 n 0001206100 00000 n 0001208448 00000 n 0001208644 00000 n 0001208806 00000 n 0001208967 00000 n 0001209128 00000 n 0001209313 00000 n 0001212321 00000 n 0001212517 00000 n 0001212679 00000 n 0001212840 00000 n 0001213002 00000 n 0001213186 00000 n 0001216190 00000 n 0001216394 00000 n 0001216555 00000 n 0001216717 00000 n 0001216879 00000 n 0001217040 00000 n 0001217225 00000 n 0001220947 00000 n 0001221135 00000 n 0001221296 00000 n 0001221457 00000 n 0001221655 00000 n 0001224982 00000 n 0001225170 00000 n 0001225331 00000 n 0001225492 00000 n 0001225690 00000 n 0001228930 00000 n 0001229110 00000 n 0001229271 00000 n 0001229467 00000 n 0001232203 00000 n 0001232448 00000 n 0001232610 00000 n 0001232772 00000 n 0001232934 00000 n 0001233096 00000 n 0001233258 00000 n 0001233420 00000 n 0001233582 00000 n 0001233744 00000 n 0001233906 00000 n 0001234102 00000 n 0001236880 00000 n 0001237068 00000 n 0001237230 00000 n 0001237391 00000 n 0001237561 00000 n 0001240408 00000 n 0001240588 00000 n 0001240749 00000 n 0001240945 00000 n 0001243787 00000 n 0001243967 00000 n 0001244129 00000 n 0001244299 00000 n 0001246907 00000 n 0001247095 00000 n 0001247257 00000 n 0001247418 00000 n 0001247601 00000 n 0001250139 00000 n 0001250327 00000 n 0001250489 00000 n 0001250650 00000 n 0001250820 00000 n 0001252754 00000 n 0001252934 00000 n 0001253094 00000 n 0001253279 00000 n 0001256664 00000 n 0001256844 00000 n 0001257005 00000 n 0001257175 00000 n 0001259386 00000 n 0001259574 00000 n 0001259736 00000 n 0001259897 00000 n 0001260067 00000 n 0001262162 00000 n 0001262366 00000 n 0001262527 00000 n 0001262689 00000 n 0001262850 00000 n 0001263012 00000 n 0001263197 00000 n 0001265701 00000 n 0001265889 00000 n 0001266050 00000 n 0001266212 00000 n 0001266397 00000 n 0001268935 00000 n 0001269192 00000 n 0001269353 00000 n 0001269515 00000 n 0001269674 00000 n 0001269836 00000 n 0001269998 00000 n 0001270160 00000 n 0001270322 00000 n 0001270483 00000 n 0001270646 00000 n 0001270809 00000 n 0001270995 00000 n 0001273773 00000 n 0001273957 00000 n 0001274119 00000 n 0001274276 00000 n 0001276440 00000 n 0001276660 00000 n 0001276822 00000 n 0001276985 00000 n 0001277148 00000 n 0001277310 00000 n 0001277473 00000 n 0001277659 00000 n 0001280909 00000 n 0001281147 00000 n 0001281310 00000 n 0001281473 00000 n 0001281636 00000 n 0001281799 00000 n 0001281962 00000 n 0001282125 00000 n 0001282288 00000 n 0001282474 00000 n 0001286695 00000 n 0001286897 00000 n 0001287060 00000 n 0001287223 00000 n 0001287386 00000 n 0001287585 00000 n 0001290184 00000 n 0001290386 00000 n 0001290549 00000 n 0001290712 00000 n 0001290874 00000 n 0001291060 00000 n 0001293390 00000 n 0001293574 00000 n 0001293737 00000 n 0001293908 00000 n 0001296058 00000 n 0001296242 00000 n 0001296404 00000 n 0001296601 00000 n 0001299674 00000 n 0001299894 00000 n 0001300057 00000 n 0001300218 00000 n 0001300380 00000 n 0001300543 00000 n 0001300706 00000 n 0001300917 00000 n 0001304105 00000 n 0001304362 00000 n 0001304524 00000 n 0001304686 00000 n 0001304848 00000 n 0001305010 00000 n 0001305172 00000 n 0001305334 00000 n 0001305496 00000 n 0001305658 00000 n 0001305821 00000 n 0001306020 00000 n 0001308431 00000 n 0001308651 00000 n 0001308814 00000 n 0001308976 00000 n 0001309138 00000 n 0001309300 00000 n 0001309462 00000 n 0001309648 00000 n 0001312066 00000 n 0001312314 00000 n 0001312476 00000 n 0001312638 00000 n 0001312800 00000 n 0001312962 00000 n 0001313125 00000 n 0001313287 00000 n 0001313450 00000 n 0001313612 00000 n 0001313798 00000 n 0001316670 00000 n 0001316936 00000 n 0001317098 00000 n 0001317260 00000 n 0001317422 00000 n 0001317585 00000 n 0001317747 00000 n 0001317910 00000 n 0001318072 00000 n 0001318234 00000 n 0001318396 00000 n 0001318556 00000 n 0001318728 00000 n 0001322977 00000 n 0001323298 00000 n 0001323460 00000 n 0001323622 00000 n 0001323784 00000 n 0001323946 00000 n 0001324108 00000 n 0001324270 00000 n 0001324432 00000 n 0001324595 00000 n 0001324757 00000 n 0001324920 00000 n 0001325083 00000 n 0001325246 00000 n 0001325409 00000 n 0001325572 00000 n 0001325735 00000 n 0001325898 00000 n 0001326070 00000 n 0001330376 00000 n 0001330596 00000 n 0001330780 00000 n 0001330943 00000 n 0001331105 00000 n 0001331267 00000 n 0001331430 00000 n 0001331616 00000 n 0001335627 00000 n 0001335690 00000 n 0001335919 00000 n 0001336082 00000 n 0001336245 00000 n 0001336408 00000 n 0001336571 00000 n 0001336733 00000 n 0001336894 00000 n 0001337080 00000 n 0001339350 00000 n 0001339579 00000 n 0001339741 00000 n 0001339901 00000 n 0001340064 00000 n 0001340227 00000 n 0001340390 00000 n 0001340553 00000 n 0001340739 00000 n 0001344038 00000 n 0001344240 00000 n 0001344403 00000 n 0001344566 00000 n 0001344729 00000 n 0001344915 00000 n 0001347552 00000 n 0001347781 00000 n 0001347944 00000 n 0001348107 00000 n 0001348269 00000 n 0001348432 00000 n 0001348595 00000 n 0001348758 00000 n 0001348929 00000 n 0001351183 00000 n 0001351367 00000 n 0001351529 00000 n 0001351742 00000 n 0001354478 00000 n 0001354671 00000 n 0001354834 00000 n 0001354995 00000 n 0001355181 00000 n 0001357551 00000 n 0001357753 00000 n 0001357916 00000 n 0001358079 00000 n 0001358242 00000 n 0001358413 00000 n 0001360907 00000 n 0001361200 00000 n 0001361363 00000 n 0001361526 00000 n 0001361688 00000 n 0001361851 00000 n 0001362014 00000 n 0001362177 00000 n 0001362340 00000 n 0001362500 00000 n 0001362663 00000 n 0001362826 00000 n 0001362989 00000 n 0001363152 00000 n 0001363315 00000 n 0001363528 00000 n 0001366202 00000 n 0001366404 00000 n 0001366566 00000 n 0001366728 00000 n 0001366891 00000 n 0001367089 00000 n 0001371143 00000 n 0001371363 00000 n 0001371526 00000 n 0001371688 00000 n 0001371851 00000 n 0001372014 00000 n 0001372177 00000 n 0001372389 00000 n 0001376436 00000 n 0001376656 00000 n 0001376819 00000 n 0001376982 00000 n 0001377145 00000 n 0001377308 00000 n 0001377470 00000 n 0001377669 00000 n 0001380780 00000 n 0001381046 00000 n 0001381209 00000 n 0001381372 00000 n 0001381535 00000 n 0001381698 00000 n 0001381861 00000 n 0001382024 00000 n 0001382187 00000 n 0001382349 00000 n 0001382512 00000 n 0001382674 00000 n 0001382860 00000 n 0001386724 00000 n 0001386944 00000 n 0001387107 00000 n 0001387270 00000 n 0001387433 00000 n 0001387595 00000 n 0001387758 00000 n 0001387957 00000 n 0001391082 00000 n 0001391302 00000 n 0001391465 00000 n 0001391628 00000 n 0001391791 00000 n 0001391954 00000 n 0001392116 00000 n 0001392315 00000 n 0001395083 00000 n 0001395303 00000 n 0001395466 00000 n 0001395629 00000 n 0001395792 00000 n 0001395955 00000 n 0001396118 00000 n 0001396317 00000 n 0001399501 00000 n 0001399694 00000 n 0001399856 00000 n 0001400018 00000 n 0001400217 00000 n 0001402668 00000 n 0001402861 00000 n 0001403024 00000 n 0001403186 00000 n 0001403399 00000 n 0001405951 00000 n 0001406144 00000 n 0001406306 00000 n 0001406469 00000 n 0001406695 00000 n 0001409286 00000 n 0001409479 00000 n 0001409641 00000 n 0001409801 00000 n 0001409987 00000 n 0001412186 00000 n 0001412370 00000 n 0001412533 00000 n 0001412719 00000 n 0001415260 00000 n 0001415444 00000 n 0001415605 00000 n 0001415776 00000 n 0001417778 00000 n 0001417980 00000 n 0001418142 00000 n 0001418304 00000 n 0001418466 00000 n 0001418637 00000 n 0001420740 00000 n 0001420960 00000 n 0001421121 00000 n 0001421283 00000 n 0001421446 00000 n 0001421609 00000 n 0001421770 00000 n 0001421967 00000 n 0001424213 00000 n 0001424415 00000 n 0001424577 00000 n 0001424739 00000 n 0001424901 00000 n 0001425098 00000 n 0001427153 00000 n 0001427373 00000 n 0001427536 00000 n 0001427698 00000 n 0001427861 00000 n 0001428024 00000 n 0001428187 00000 n 0001428413 00000 n 0001431593 00000 n 0001431904 00000 n 0001432067 00000 n 0001432230 00000 n 0001432393 00000 n 0001432556 00000 n 0001432719 00000 n 0001432882 00000 n 0001433045 00000 n 0001433208 00000 n 0001433370 00000 n 0001433533 00000 n 0001433695 00000 n 0001433858 00000 n 0001434021 00000 n 0001434184 00000 n 0001434345 00000 n 0001434531 00000 n 0001438279 00000 n 0001438490 00000 n 0001438653 00000 n 0001438815 00000 n 0001438977 00000 n 0001439138 00000 n 0001439324 00000 n 0001443139 00000 n 0001443377 00000 n 0001443539 00000 n 0001443702 00000 n 0001443865 00000 n 0001444028 00000 n 0001444191 00000 n 0001444353 00000 n 0001444516 00000 n 0001444702 00000 n 0001448696 00000 n 0001448907 00000 n 0001449070 00000 n 0001449233 00000 n 0001449396 00000 n 0001449559 00000 n 0001449745 00000 n 0001453553 00000 n 0001453746 00000 n 0001453909 00000 n 0001454072 00000 n 0001454271 00000 n 0001456702 00000 n 0001456895 00000 n 0001457058 00000 n 0001457220 00000 n 0001457391 00000 n 0001459413 00000 n 0001459633 00000 n 0001459796 00000 n 0001459957 00000 n 0001460120 00000 n 0001460282 00000 n 0001460442 00000 n 0001460639 00000 n 0001463335 00000 n 0001463537 00000 n 0001463698 00000 n 0001463861 00000 n 0001464024 00000 n 0001464221 00000 n 0001466925 00000 n 0001467145 00000 n 0001467308 00000 n 0001467471 00000 n 0001467634 00000 n 0001467797 00000 n 0001467958 00000 n 0001468171 00000 n 0001471982 00000 n 0001472184 00000 n 0001472347 00000 n 0001472510 00000 n 0001472673 00000 n 0001472884 00000 n 0001475608 00000 n 0001475828 00000 n 0001475991 00000 n 0001476154 00000 n 0001476317 00000 n 0001476480 00000 n 0001476643 00000 n 0001476854 00000 n 0001479926 00000 n 0001480137 00000 n 0001480300 00000 n 0001480462 00000 n 0001480624 00000 n 0001480785 00000 n 0001480969 00000 n 0001483463 00000 n 0001483711 00000 n 0001483874 00000 n 0001484037 00000 n 0001484200 00000 n 0001484363 00000 n 0001484526 00000 n 0001484689 00000 n 0001484852 00000 n 0001485014 00000 n 0001485185 00000 n 0001488003 00000 n 0001488214 00000 n 0001488377 00000 n 0001488540 00000 n 0001488703 00000 n 0001488866 00000 n 0001489092 00000 n 0001492073 00000 n 0001492311 00000 n 0001492474 00000 n 0001492637 00000 n 0001492800 00000 n 0001492963 00000 n 0001493126 00000 n 0001493289 00000 n 0001493452 00000 n 0001493609 00000 n 0001495904 00000 n 0001496170 00000 n 0001496333 00000 n 0001496496 00000 n 0001496659 00000 n 0001496822 00000 n 0001496985 00000 n 0001497148 00000 n 0001497311 00000 n 0001497474 00000 n 0001497637 00000 n 0001497798 00000 n 0001497981 00000 n 0001501470 00000 n 0001501663 00000 n 0001501826 00000 n 0001501989 00000 n 0001502199 00000 n 0001505257 00000 n 0001505459 00000 n 0001505622 00000 n 0001505785 00000 n 0001505946 00000 n 0001506159 00000 n 0001508815 00000 n 0001509017 00000 n 0001509180 00000 n 0001509343 00000 n 0001509506 00000 n 0001509718 00000 n 0001513456 00000 n 0001513676 00000 n 0001513839 00000 n 0001514002 00000 n 0001514163 00000 n 0001514326 00000 n 0001514487 00000 n 0001514700 00000 n 0001517574 00000 n 0001517776 00000 n 0001517934 00000 n 0001518096 00000 n 0001518259 00000 n 0001518456 00000 n 0001521092 00000 n 0001521276 00000 n 0001521437 00000 n 0001521608 00000 n 0001523483 00000 n 0001523712 00000 n 0001523875 00000 n 0001524038 00000 n 0001524201 00000 n 0001524363 00000 n 0001524526 00000 n 0001524689 00000 n 0001524915 00000 n 0001528211 00000 n 0001528449 00000 n 0001528612 00000 n 0001528775 00000 n 0001528938 00000 n 0001529101 00000 n 0001529264 00000 n 0001529427 00000 n 0001529590 00000 n 0001529776 00000 n 0001532904 00000 n 0001533106 00000 n 0001533269 00000 n 0001533432 00000 n 0001533595 00000 n 0001533792 00000 n 0001536665 00000 n 0001536849 00000 n 0001537012 00000 n 0001537224 00000 n 0001541405 00000 n 0001541625 00000 n 0001541788 00000 n 0001541948 00000 n 0001542111 00000 n 0001542274 00000 n 0001542436 00000 n 0001542647 00000 n 0001546695 00000 n 0001546943 00000 n 0001547105 00000 n 0001547268 00000 n 0001547430 00000 n 0001547593 00000 n 0001547756 00000 n 0001547919 00000 n 0001548082 00000 n 0001548245 00000 n 0001548458 00000 n 0001552014 00000 n 0001552298 00000 n 0001552461 00000 n 0001552624 00000 n 0001552786 00000 n 0001552949 00000 n 0001553112 00000 n 0001553275 00000 n 0001553437 00000 n 0001553599 00000 n 0001553762 00000 n 0001553925 00000 n 0001554088 00000 n 0001554251 00000 n 0001554423 00000 n 0001558252 00000 n 0001558463 00000 n 0001558626 00000 n 0001558789 00000 n 0001558951 00000 n 0001559113 00000 n 0001559326 00000 n 0001561955 00000 n 0001562157 00000 n 0001562320 00000 n 0001562483 00000 n 0001562645 00000 n 0001562831 00000 n 0001564971 00000 n 0001565155 00000 n 0001565318 00000 n 0001565489 00000 n 0001566337 00000 n 0001566539 00000 n 0001566701 00000 n 0001566864 00000 n 0001567027 00000 n 0001567253 00000 n 0001569785 00000 n 0001569978 00000 n 0001570141 00000 n 0001570304 00000 n 0001570488 00000 n 0001572660 00000 n 0001572871 00000 n 0001573034 00000 n 0001573197 00000 n 0001573360 00000 n 0001573522 00000 n 0001573734 00000 n 0001576304 00000 n 0001576497 00000 n 0001576659 00000 n 0001576821 00000 n 0001577033 00000 n 0001579840 00000 n 0001580024 00000 n 0001580186 00000 n 0001580357 00000 n 0001582449 00000 n 0001582687 00000 n 0001582870 00000 n 0001583032 00000 n 0001583195 00000 n 0001583358 00000 n 0001583520 00000 n 0001583680 00000 n 0001583843 00000 n 0001584014 00000 n 0001586416 00000 n 0001586578 00000 n 0001586721 00000 n 0001587532 00000 n 0001587752 00000 n 0001587915 00000 n 0001588077 00000 n 0001588240 00000 n 0001588403 00000 n 0001588565 00000 n 0001588736 00000 n 0001591021 00000 n 0001591223 00000 n 0001591386 00000 n 0001591547 00000 n 0001591710 00000 n 0001591881 00000 n 0001594053 00000 n 0001594215 00000 n 0001594386 00000 n 0001596372 00000 n 0001596534 00000 n 0001596731 00000 n 0001598608 00000 n 0001598801 00000 n 0001598964 00000 n 0001599126 00000 n 0001599297 00000 n 0001601477 00000 n 0001601679 00000 n 0001601842 00000 n 0001602005 00000 n 0001602165 00000 n 0001602362 00000 n 0001604889 00000 n 0001605100 00000 n 0001605262 00000 n 0001605423 00000 n 0001605585 00000 n 0001605746 00000 n 0001605917 00000 n 0001607020 00000 n 0001607182 00000 n 0001607353 00000 n 0001611867 00000 n 0001612069 00000 n 0001612279 00000 n 0001612488 00000 n 0001612650 00000 n 0001612821 00000 n 0001614878 00000 n 0001615062 00000 n 0001615225 00000 n 0001615396 00000 n 0001617783 00000 n 0001617945 00000 n 0001618102 00000 n 0001619101 00000 n 0001619263 00000 n 0001619420 00000 n 0001622325 00000 n 0001622487 00000 n 0001622630 00000 n 0001626086 00000 n 0001626248 00000 n 0001626391 00000 n 0001627865 00000 n 0001628027 00000 n 0001628170 00000 n 0001630948 00000 n 0001631110 00000 n 0001631253 00000 n 0001633423 00000 n 0001633894 00000 n 0001634509 00000 n 0001634737 00000 n 0001634930 00000 n 0001635114 00000 n 0001635903 00000 n 0001636697 00000 n 0001637198 00000 n 0001637252 00000 n 0001637556 00000 n 0001637740 00000 n 0001637915 00000 n 0001638099 00000 n 0001638744 00000 n 0001645348 00000 n 0001645572 00000 n 0001645916 00000 n 0001646129 00000 n 0001646302 00000 n 0001646686 00000 n 0001649806 00000 n 0001650019 00000 n 0001650192 00000 n 0001650413 00000 n 0001650649 00000 n 0001650862 00000 n 0001651035 00000 n 0001651246 00000 n 0001672409 00000 n 0001672627 00000 n 0001708497 00000 n 0001708718 00000 n 0001717100 00000 n 0001717320 00000 n 0001745928 00000 n 0001745999 00000 n 0001746283 00000 n 0001746358 00000 n 0001746608 00000 n 0001746765 00000 n 0001746937 00000 n 0001747098 00000 n 0001747259 00000 n 0001747420 00000 n 0001747581 00000 n 0001747742 00000 n 0001747903 00000 n 0001748064 00000 n 0001748225 00000 n 0001748386 00000 n 0001748476 00000 n 0001748637 00000 n 0001748809 00000 n 0001748978 00000 n 0001749149 00000 n 0001749320 00000 n 0001749491 00000 n 0001749662 00000 n 0001749833 00000 n 0001750004 00000 n 0001750175 00000 n 0001750346 00000 n 0001750479 00000 n 0001750545 00000 n 0001750570 00000 n 0001750626 00000 n 0001750668 00000 n 0001750750 00000 n 0001750811 00000 n 0001750862 00000 n 0001750902 00000 n 0001750985 00000 n trailer << /Size 1738 /ID[] >> startxref 173 %%EOF syncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/0000755000373300037200000000000012424517753027603 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/Contents/0000755000373300037200000000000012424517753031400 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/Contents/PkgInfo0000644000373300037200000000001012424517753032647 0ustar00nightlyallusers00000000000000????????syncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/QuickLook/0000755000373300037200000000000012424517753031504 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/QuickLook/Thumbnail.jpg0000644000373300037200000014251512424517753034141 0ustar00nightlyallusers00000000000000ÿØÿàJFIFÿâICC_PROFILEðapplmntrRGB XYZ Ø acspAPPLöÖÓ-applÆwÎ×–ž¿LmfõhŠúirXYZ,gXYZ@bXYZTwtpthchad|,rTRC¨gTRC¸bTRCÈvcgtØ0ndin8desc@edscm¨ümmod¤(cprtÌ$XYZ w0?D—XYZ Y¬ö›XYZ &–ܹóXYZ óØsf32 ·–ÿÿóW)ý×ÿÿû·ÿÿý¦ÚÀöcurvÍcurvÍcurvÍvcgtÑtÑtÑtndin0£@W€Kœ&·›P@T@333333desc LCD2080UX+mluc nbNOèptPTèsvSEèfiFIèdaDKèzhCNèfrFRèjaJPèenUSèplPLèptBRèesESèzhTWèruRUèkoKRèdeDEènlNLèitITèLCD2080UX+mmod8£f+¼ÈktextCopyright Apple, Inc., 2008ÿá@ExifMM*‡i  jÿÛC    ÿÛCÿÀj"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þþ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯Ãø*oü[â‡ìñ‹áOÃ?|>ø%áÏkþ¼××âÅ]gUÒ<1©jpÜ—Ã°ÞØÙ\Egzéûß6õ¢€#§$澘?ðT߀gÅ_†ŸußüSÖ>)êÚO…ï¼K'ƒ~Ñ?¼1ñsJÿ„âãHÒ¼3à»? \]x«YÖuŒiPééûÃsµ%fB@UŠFfI¯Ÿ¾*ÁceƒŸ¾ü\ñ·„?j†¾(¶kÛÍeþjp[x&Ôœí«™Ñ ›-Ñ1ù`<„)!Œ«Õº+ðGRÿ‚Ãø÷OøÕâ/…×¼ g£Xü]ø³ðݵI5K—)gá_E¯C|ѤD–ä1Içj.å,ÇÞx{þ û)é~ø^ßtâ{ÿü>ñ_‹5? ø;P¿ðç„m¼S gNº¹¼dSolóH"Ue†S‡*ûeE~`ißðW_ÙWý¥ôÿÙwIã6£â»ßˆwŸ ´ïÇàû¿øFu/ÙÛKq}¦Ã¨!ymV&YGgáwáŠ÷ßॳÏÂÚÿ±ž©¤|cñÆMBÓI¿¿_ øVãS³ðÕ®£s%µœ÷²EóÇ’E /H±ªï”Ƹjý¢¿,4¯ø,§ì'¨|Kø½ðæÿǾ-ðÅŸƒì|U?Šu_ÜÛø{^_®uØôëÍ¥o$°çÍT;XÇæ$r~ÿ‚ÚþÆÞ5·ÖZ} öð©a/‚’çMñO€îô«Á‰õ&ÓôiÖ9°^)ä÷®BÆÀžC(ý{¢¿+~+Áb¿c¯„‰âËMPüañw‹tˆzÿÃi|;áÏ \jZ­Þ££YC{ªÜÃg/gkoq¼äóPÌBžoÆ_ð[¯Ø[Áþ%°Ñ£Õ¾/øÇÃo¥x/Ä7¾+Ð<y} èº7‰Š®‘¨Þ] ÛoÎèŸ8Þñ°áÊ€~»Q_šcþ Éû!Gñ[âÿÃKûÿ‹W‡¼'ˆ-5ÿÏàÍCþØoô[f¹ÕìWUXÌ&{HÑüÅ8RèÑ£;µè_²ü?öý¶t/‰ZŸÁû/ŠZWˆ<' …î¯á¿xn}+Y[ëf¹Óïc¶—™ »‰¡p~bŒ¤+ îª+ùßý›à¾~ ñÇÁíSãíð/âç‚nuÿx³Bøqàoø;UÖ¼M«è ­£«\@# åÛ` Þ3²)KCóȤÐO†ðTÏÙcãgÇ³ÇÁ†ø­ñcÄž)ð~“ãû-sBðµÍƃa j÷3Z^Þ^à%¢Éöi" 沦ÜîÚú9E?ßµüâçÀoø(%Ïì‚¿ ¾xÂðj´Ñ®>&x¯PðÝ÷Å85/í7ãY>’ÍhÒŒ7),²Dê dW׿ðXØ®Ãã/ů‚·÷Äa¬xF?G>µÿÕÀÑ5ÍK@±kígI°¼?%Íí¤ #IÀýÜYŠ6?Rh¯È/Áo?box/ÅŸ5X>;ü3ðnŸðÏPø½§Þø·ÁWZJø¯Âö’A—zbËó]î{«uTþ|erï4¿ø+Ïì}©üyÙåî¾*i^/YL}JóÃÅ£ÇâÒ?µåðñ¼ÿWý§–dh:­òãe~ Ñ_ž?ࢾý¨¿cÿжìÑðgãÿÄ/ hÚö¯áUðÌú-ïĆÃíQG¦¬à™Òg"•T©”8]Øçó{ö9ÿ‚íiÿ>|aø»ûIÙþÏÚGß Øxzó[o‡Zî§y®øëRÔÁ¬5ÍT³µ½µû4²Æd¼^ÛhƒòÐô_E~[|Kÿ‚½þÊ_ ¼k¬ü;]ã×Äo[øïZøke§xGÁ—:¼Ú½* NúÎÍa9˜Ã«¿²$ªÌ61òÿÁh?b«3àV±á)>9|MÓüuá+?#xWÀZ–¬þðýÍãXŨjñÁ=”mv’Á‚¬ûà—åÚ…¨õ†Šü˜ÿ‚«ÿÁC¼ûxcàNµá/xO ø»\¼Òµ¿ˆ>6mY<'àŠÛ΄ê-¥Z\Ý!ºÝDû%(åØ\_ð[/Ù»á·ÁÏÙׯ¿´y‡Lñ׌¼!/Žu¨>ÎÞ8Ð|)áè¯EœšõÆ¥hŠ‹§Š!_1Iuhó„~ÑÑ_š^ÿ‚°þÉÞ,ø÷ñ‡à6‚ßu9<ý«Š<_oá[™ü3¥Üéö"úòÚKÈ÷xàmÀº,r’7‘°§Äí¿à²¾'þÏ6´ÀÏ|BÓü57Ž< á‹[¿xfûM²×,¼A©Ãioyc-ºÊ·–B@È1¾Á:Äý™¢¿,´Ïø,_ìYªü\ñ—Â;}câ”2éŸð”[éÞ%ŸÂW‘xwÅÚŽ“ën—¨2ˆon­c†bñ©ù2lgÚqß~Ç?ðS¯Ù§öâñ†¡ào„_|?âðn“ñLÅÞºÑWÄ~¿vŽ NŦéy¨Ñù‡Ë¹HbúEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPæGí­ÿëñ7íaã]CÆžý±~;þÍÉ­ø&ãáçŒ4-"ÓNÖt?è²Êòn6:œ3Amx†Io"Q(V rqå^ÿ‚>øsà_Ä¿ø£öbý¬?hßÙïá¼:<9ã hïa:øâÓÂÐ-¶˜&½šºµ/n¢ Ÿ³² ãʹ&¿c( Èmþ -à/üý™¾xkâŽu™¾üEñgÅ K¨-c:Þ£¬G¬³¸Ú $(uy6²a¿t™'-Ÿÿeø v¿¨~ÅÞ øKûhþПµÇð Sø-¦èVCJ{/†6ÚÄ7:ƒYÜA½û™mm‚=Ã>Ø£òÆs‘ý8Ñ@Ÿ?´ì#{ûBüý>x‹öƒñï‡~:|-ñã |NÓ49oa×ìm¥¶û\¶YÉÐÜ\$–û/ øö–ÿ‚ xö­Ñ¼9iñ“öÝý£¾ x’ËàíW\ñ&™£kwR¾«.§ý£f.-JiSù²y m ZEwèŠüuÕàŽ_ µˆ> ø‰uñŸâBêzÄˆßæ--Iwâ¿ Ç ][¯ÉŸ.£FIÜ\įÇAÿ?øCÁ¯‹ÿ“ã—Å#¥øÃáç‡wWßd³ó¬í¼êÖ—1›L—;Gš\ü€WíÝüÀøWþ û`ØÁH¾x³NÐüCàØãŸ´/‰þ:[Cuã}+RÐä“SÓ¯RW³´ŽÎ=R;»‹«²í Ämn­?—$›À¡ÿ¶÷üGáßíÉû@|/øéãŒ>0ð„žŸF¸¶³Ót !õ 4ûãx­§jÏlu4ÎØŽqÅ$@El±ýo¢€? <7ÿý–t_~Ò7º‡Šõ}gá§Ä-?ÆÖ_ð è0_è'ÄÛÿ´=e,ÿ´æXüÙ…ºI6Ø–VR$@ð­#þ­ñ»Å?imãWíIñ#Ç~ Ö|ð¦ÏÁ?¥³ÑâÖ´­{ºÕåý²gÃÛ´Q¢–2£yÍ4äœôþ”( çóÆßð@…>>Ó_[ñ?íãÿ|i‰^*ø•/‹|AàÿkOs¯ØYÚj6¯¦]YµLÙC, "¨ÚH>Ñâø"ÏÁm{Á´_€4ïŠÞ>ðÖñÁÿ üp–Zn èöÞ¸óíe‚8¡HC\¶|Õ±®O–¨8¯Ùº(ñÎãþùákísöˆð…ïíSûCÅû"|IÔÕ|]ð{Äž0¸Ñeøcàÿ…ÖºF¤ÑJ¶¶:½h®Œª¡äžv¾•¥' ¸ ª â¿Fh ÇÚ»þ iûWüAø­7‰¿loÚ7ÿ³Ä[C×/øWûø#áìáØÛÇ_.<¤ü&ø¿âWůø)íâ‚Wt /ÅRè^Ýỉњ9î ·..Cˆæ{»’ò‘o…›÷úŠüSý‹à’–ÿ¾ÿÁ7âÄsQøñði¼QâÝÙº]AãøŽÂh5I®'•|Ù=Ëùn6³“wÏxþ“§üÓ¾[þÏß¶×í+ð+WÑ| mð×Åš®o¥‹Ïx~ßZºÕ­ã2KnçO¸Ž[Û¨ÅŶ×1LTކ¿sh †ÿkïØïÆ´Ž§ð‡Æ¿ jŒÿ²ÇÄÿ¾£ž§áèí5=;Z²½a¹´ÔtËøä´¾\"4m"n‰Áe?1Ïæ&£ÿä~ˉáÏ?†~*xÒÃV𧆵? ëzž¹á_x‰üWe­K¬ÝKäj62Ûi÷&îâçd¶±¦È§h‚¯è~ŠümÔÿà_ õ_ÛƒNýµßãOŽtéí¨¾™c¤x{DÓ¯m’ëJ:p²—S‚Ñn¯,`ŒÚÝU% K2®Êñ¿…¿ð@ŸƒŸ 4Ÿ‰¶QüyñÅÍ÷‰üWà?Þ6“á}A³iü5« JÞY,´ûx­e»ºl¹»òÕÝq…R9ýö¢€?,?à‰ í¼iq5ïíñ¯Vø¥j~:ñ€~Mo§ ;ÀšïŠ-¯ Ôoc¸XÕÚ Ô/ZÞÝ’&ÍÅ}?û0ÿÁ:< û0|PøCñGÿügâGÁÿ´€¶·ð[¤Wšn›uöˆõ1¨apç†UÄ`t¿E( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¼³ã—Å?‚þ-|fÔ4‹¿XxOÃz—ˆæ°‚EŽ[Ôµ¶yÚ%fùU˜!ž5êuæß>èßþ|Oø;â+ýSKМ–VWº-ûÁ¾DI%-l’FÑ9‘¶H¬…P–ÚåÒÃñ=îª?º—oó·â}ÑÎ<Tù*a"Þ¾÷>=}¥gmmîóiwªŽ¶lûÙ?àë_ÙºIàµöuñ¤—2ÎmcAâÍ<´’‚@6òrÊ1þÐõ¦ÇÿZþÎosse'ìÓñÒò+‰-ž+ØÆåÑ‚6.HÜ@ÏBkâ3ÿuÿ‚NøKÔ¼A}}û{hòZAkxÖóÞhtÑÍqjÖ‚(”3ȇ6ò7– [¨o+pVõVÿ‚ Á.uŸŽ~øa©ø·öÅOx³H’ö×QšçJŽ#ŸMk÷Šeka$r˜Œ˜ ‡i 2µ’ÃñUÿ‰§¥#ÑyÏÑç‘5ƒWºÓŸkuÖûßm-¯–¿Cø:×ös’êÆÆÛöiø‡}ws4pE¿‰lemάÊNÕùAy)ÿáCeÿÄWÁºWü¯þ Qkâ Üiú‡íÑeã[¯²]\X%ï‡ ú¨·ŒÅupª ªýžHÜ*ovf¯]ñÇüWþ Ñà_øŸÀמ;ýº5»ýìA©M¦Ëáé’Ò´‹_=“Ê粪dzÎue•£`çCŒ®½„ÖÚßÙïòGÔpÖkô_p¨óŒ-E.gËìåŒk—§74“æ{´´[]ŸJÿÄO¿?èÓ>)ÿáCeÿÄQÿ>ü ÿ£Lø§ÿ… —ÿ_0h¿ðJ/ø&ÞµcñFò/‰?¶Å³xGÂgÅÚ¦ûÏ=¼–ãi1Et‘5«¸Þ¿7š"x. rÃ?ø$ßü£âÏÄmᇄ|kûyKâËØ¬žk ÇglZÆk×—Î0l–%ŽÂdSõËOaÇ_Ïü“ü¥þÔú#ÿÐ6#ïÅòÃéÏø‰÷áýgÅ?ü(l¿øŠ?â'ß„ôiŸÿð¡²ÿâ+ã»ø&/üP°‚m#Ä¿ðP _W–K•Nˆøq$1ÁröóHdxÖ "  ¾ï߯@a¸¯o{ÿÿ‚oØ|8Ѿ*\|Nýµ…/¼[„£1]xz[ˆ&‘w$óB—…OÊp.eÝä=‡<òOòíO¢?ýb>üWÿ,>ÿˆŸ~Ѧ|Sÿ†Ëÿˆ£þ"}øAÿF™ñOÿ /þ"¾ƒþ Ùÿ¾šßM¼þß6V·VVú„orš8‚KÓhÌUá ˆØ~8VÉÈO†¿à•ÿðOßø_BÒ¼eûo]kšöh¥ß‡~Ϧ­Üñ[$³æ64¢m1ù­ ’6Œ‡'°ã¯çþIþAý©ôGÿ lGߊÿå‡×ñïÂú4ÏŠøPÙñÄO¿?èÓ>)ÿáCeÿÄVÿïø77ö/øðÿÀßl>2þÔz}Ž»£ÙëÁ5î’^ž”#bÇ€ØÈãŽ+²ÿˆfÿc¯ú.?´×þé_üƒG°ã¯çþIþAý§ôHÿ |Gߊÿ凗ÄO¿?èÓ>)ÿáCeÿÄQÿ>ü ÿ£Lø§ÿ… —ÿ^£ÿÍþÇ_ô\i¯ü Ò¿ùø†oö:ÿ¢ãûMàn•ÿÈ4{:þxÿäŸä?í?¢Gýâ>üWÿ,<»þ"}øAÿF™ñOÿ /þ"ø‰÷áýgÅ?ü(l¿øŠõø†oö:ÿ¢ãûMàn•ÿÈ4Ä3±×ýÚkÿt¯þA£Øq×óÇÿ$ÿ þÓú$Ð>#ïÅòÃË¿â'ß„ôiŸÿð¡²ÿâ(ÿˆŸ~Ѧ|Sÿ†Ëÿˆ¯Qÿˆfÿc¯ú.?´×þé_üƒGüC7ûÑqý¦¿ð7Jÿä=‡<òOòí?¢Gýâ>üWÿ,<»þ"}øAÿF™ñOÿ /þ"™'üðz4yöLø§…Ÿø¨lÿøŠõOø†oö:ÿ¢ãûMàn•ÿÈ4É?àÙØâHä¾8þÓx`Tÿ¦é]ÿíÆ“¡Ç_Ïü“üfD~¸|Gߊÿå‡ô=áMz?x_Ã~(†ÚK8u+ {õ…Ø3D%\)#‚FìVýbxkB¶ð¿‡üQ“Xð¾½} ]j‡P·‹Oš{s)âV]ª^8^@¤çŽ¢¸«Oø:/ö_¾¸¸¶·ø1âv’9c‡sxšÅRGxVdÄaó+d9¯›kßø%Çüöãö£ý®¼gñŸTøÿ+ÛJ¾(ÕF“â½8\êWš€IÚXÉ…Ø·mÈNíªÃy$ƒÅü9ÿ‚*ÿÁ/þ%|Aøá Gûa Ý•Z¤¾"Ò6i÷ „·óíP4Ñy‹ÐJ6!tÊÇÓN‡õsõ*UøYEsA?WWo–—>Ńþý—înfµ‹àÇŠ $vÒï>&±XÝg2¶¹X·•'Ÿºs[Zü×ûÕµ&†âb-µû9/H¬Ê¸V *|§ž}«â‡¿ðFÏø%Šn#ûS:¥Ñ£(‰Z)C ù€¦vAªÞÿ‚uþÀ¾7Ñ> x«KñWí‘aá}O¶¼iõ;½Æ[Ù&¿’ÌF©<*!Eeži™#ŒHC²` ᫇·àäŸþTÿ3êïøˆÇágýÄ¿üÙÿñ4ÄF? ?èØ>%ÿàöÏÿ‰¯‹/?ಯ†¼ âø,?kmSHñ/ˆuM+I†=@†í¬­%¶ApÑÍn£Ì•f’E‹wÊ°Ì ¬©¿cø&ŒQ=ßü&?·yÓ¼íVÝ'm?IO6K(–FUF€HL›Žß—)g(¸$¾ú¸{~þIÿåOó>èÿˆŒ~Ѱ|KÿÁíŸÿGüDcð³þƒâ_þlÿøšùÅ¿ðN?ø'׃î¾Yê>8ý²šoxV×Åš[I>k‚iÄ"¤¸Ž4×%Ùä+P1#yn»ûþÁ:%Õ݃^þÙòj/m%ö›o6±áˆöÕvârK*6KUaÓyY_ ý\~߀?’ùSüϼ¿â#…Ÿôlÿð{gÿÄÑÿü,ÿ£`ø—ÿƒÛ?þ&¾y‹þ —ÿõ—ö~ñ·í>)þÕé hϧj;]ègSIþØ-l˜ÀyÊKà€q’1^a ~Áß°?Œ5¿†Ú†uŸÛB;¿êº}¶›6­}áÛH¤Óîu1§‹Õ6‘È”HD ¦m±™<¸/…þ®/oÀÉ?ü©þgÚ¿ñÂÏú6‰ø=³ÿâhÿˆŒ~Ѱ|KÿÁíŸÿ_$ÙÁ5¿d_øF5¯j+ûbÞéãÆ¿ð†éÚV§áù.u°L×n'Š$†=óyaKùCcŽÄÿ±OüûO>ÿ„WÄÿµ·‰MôÜj >©¡ZÉ¢$’¼QyªmØ&6m™ Êñݼ WÂöüÃÛðòOÿ*™÷üDcð³þƒâ_þlÿøš?â#…Ÿôlÿð{gÿÄ×Ã^ý‰¿àþ+ñ…tKOþÚKk¬ßYivw0É¢^*ÜÜHÊ<ƶ‚HÐ*…,…üå%”ÄH¯Òßø‡—öRÿ¢ÉûCÿà^™ÿÈtï…þ®߀?’ùSüÍ/€¿ð]‡?>5ü-ø/¦þÏ>?ðî¡ânÛE†þãXµ’+G•°$eUËè9¯Þ:üYø)ÿ:ý›¾|]øoñ“Ã_>9j¾ ðίo¬ÙÛ_Üéío<±6Ud j¬T÷ÚÀû×í5qb];þìüÛç’ºðþÄMBÞõù·¿÷›èQEsQEQEQEQEQEQEQEQEU6JÅ–ÎÔ1v”‘Ér0[êGÖn•áŸèV+¦hÚ‘¥iÊï"Áon‰f‘¤c€1’ìÍõ$Öå^KKIr%¶·*w ?)ÆGÐà~Tão‘&0BePB¶Ñ•®jšŠ€[[i¼CŒ¶Á“Ž8AwC‘ˆ,ÛFXŽ„úô•KEbê¾ðþ¹¥ßhšÎ‰¥jš=ÔÚæÖxâž/î2‘‚¼žÖ¢[[Æûã·†7À\ªp8𩨠 ¼qWh  ÖVVzm¦§ÚÛØØ[İÁ H!@ ª£€:Vh¢€ (¢€ (¢€ (¢€ (¢€ (¢€?:~?xßöæÐ>*x¾ |ð—|œ0éÂî P·ÎÆÙÚY'{ØåܺˆF"U@#´»±›iÿ?à§÷GE?³÷€î-Ò[$Ö&·µŠ[†t‘n'XÓQ(7”À¶>T`A,1ïf¿¾8ø¯«xãÁ?µG~x:æçI¸¨‘ãO³G*HŠYÊF’IU>vCq|KÁ?±‡íh$øW}ã¯Û#ÆpÙXçÉâÃPÕd[æO)® Oyç8™ã-æåY|ÉŒª(ëˆ_ðQÕðì×|øau¬ÙiBY?´-¢‚MJõ®í¢h£ê£ýæ»,B†‘ÜÚ&“ª¾ø•ûvX|)ñ¾¯mû7ü?»ø¯mâˆìôm: awš9„Êd,÷jÛ„ª"ÞJó qcÎ4¿Ø3öŠ+¦Ö?mïj×¾TZŒ€]ºÜ[¡»"³\¸1ÿ¥7Ë€HÀfm‘•õ?d¯‹^#øaáß xÃãGˆŠô/ÜëÚ%Ü—×mäi±ÚÏegfÍñ¾LRw \3³$ ê?‡¼eûxÜiÞ?´ñGÁ¯†v7Öž´Ô<7>™"ÄgÕä[v’̬—*ˆ÷ÜÄ[p[£ƒ‰v¦mÏŽ¿à šd‘ê_¾k—Éd·&úÊÝ2Ò3F¯h–²j#s çç3*•ŠF뵩oÙoãÔ <+á{?ÚÓâ:·ñLZö«¯4ŸÚV©l„rÌþ\Kµ[b²0%Ã332ÓaïÚ÷L]/Ç¿µßüV‹{öè.ïT·›Oe™åHâ1Þ¨#{Þá¤UcVX §ÇÿðQÍ>ÃB´Ùïá7Š/¥¸šïTŽ"måiŸ`òä!\q´»D±°F*â®Eâ¿ø(7ü ÞÖ,¾ø2÷Ç÷W^"“S‡TÓ­¡†ÚÞ&‰ôȼˆµA” ¢ ö‰6ïÞÿÜ«ŸdÚâŽ/éž'¼³¿-³h¡K Ü¡e¶’ÖùNÒq&ÀÌJ’¥£lãÑí¼wûsMà_^]|)ømeã»/ÝÛZA¡Õ4m%’9UMÒl–y’(”™_;,˜Rkîj(åO^1ý©«¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+Åi/ŠŸÁ/ÙëãŸÆML°Öõ xGWñ­Ó²Ãw5­¤“¬nWæ Å$s‚q^Õ\wÄOø[⯀|mðÇÇ|š·ƒ‡±ÃØŒ%,Â…\|\èÆqsŠÝÁI9%ªÕ«­×ª?ˆý?þàøÃ=õÞ›«þÌ¿<;|—¿c†+Jýžçæ*$ !IOŒÎ.?üµñHÙÃwkû=üº2ÛËq nÔȱ’e† §ÿþ¶ø“£ _X·Z]爬.àxnä†Îà(¸™n|Ø×{>èð$ »Á·¨Á)¿` ‡Ÿ ¼umÿ§ñÔ÷÷·Z¥–­¡Eâ/´º8P´·ÆÁwH%Šy¥PcA'”Ø8¿/—ñwúͼ¹•¶ÿ¯Mïæ}Ðñ“ÁSörÈÜ·÷sk%kÛ£ueð¥~[ß[ü[üŸñRêîÖÊÙ÷àijÍ"Ƙ¸Õqó DÐÜ=«°ºÕ|ÄVi0À`„ ňáqÍ}ãø$Ïì_ðëÇŸm4ßø%Ö­ãïh×¢*}Å$ŠòþGAp·,_1Iè”ÈÑ9(V<‘zŸÿÁ#¿a+]ÐotÏø%OŠüc£^èzGˆ5iÿá8׿´ ¿e-h‘…x¥–Ü*‚Ï4|ÉÈQÉÃý\âno÷½?Ä¿ùQë/|Tø~óºÿ—5,•ÿæ`Ûwµ¶ÒþóÆãþâø£mr°Éû:ü âRó›PGÆTFNæmªFA Ö¥¿ü“ñ†ûXÓô=7önø?©_Ü\[ÛþêëSÛϳ6ÖŽ6#þuöß‚à“ß°'ÄŠ~ð&­ÿ½×ü/á뚈ïø—P[w j4×Lö-İ‚KÎŒVA‘IA”‘~´«Ú= ’ÛQÔü@òK,𥽬°µüWR[ÜO6<— DÇwcJ\3Æ7ýæ26ò~kþöºùÜü;Ç_< Ìp)ðNIW Z3¼Ü㣇+Vÿy©ö¬ö[o©ù¥?ü«ñV<g¯‚·2oDeš¢ì&H‘%p<èË/QššçþÃøë&‘¥jšì·ðÄ/{zl-àõ«v,g*yCpÏ\€:×Úÿ‚DÁ<õÝK⧈5Ÿø%¿Ä½TÑü9öý.üYâE‡SŒ^˜–ÔÄ2#x㎔%‘•‘ ùi¾ ÿ‚\~Ä—–šï‡¼=ÿ¤ñ&¿alŸkcwâïEhÎ¥!‹Él¦Y)*ªô¶ÆöŽPЯt¸oŠ/&.ýï%÷iM==Uüº-Gˆ¸iߟ nÖOïÖ£ü¼úüesÿg|V³‹¯ÙëàÄrÄÅdEºÕ$ …v|8O.@ÅI©ç¥P‹þßøžmîî/?g¿ƒ:o‘ÅÄ©5Þ§¹ †Y#iHP~_Ý»ûTžÕõ´ÿðMغóCÔ®tÿø$gŽí;ñï„|=ÿ¥ø‹â;OÔm´ûMv/ë’A} ðIr÷"ó D“*)Pw´†Â ñEµÅäËçÿ.J—pÕî°¿ù+ÿå§Ç~ÿƒ¦ÿhAª\é³Áø­ínÍ›5Åö£˜Â4}Ê8ă¯>ÕÔÄMÿ´—ý7Àÿü_ÿ{Ÿ„?à›±½§‰4m$ÿÁ+~ xgÃwzü. öÞ)ñJË™–~»PE$i”J’¤|Ãqšî¾%ÿÁ4?d]Wø øþ «ñÄ‹£%÷‘©ÉãO¸1Ý¥¤8•vÜHæD»Ù¥>ËŸÞùãO'Ãlæý–2 >o_ý6zØn&àŪàäåä¿û¡ò—üDßûIѳ|ÿÁ¥ÿøÔSÿÁÎ_´œPM(ý™~¨[Ú—üà}kõ3àüãþ ·ñŸÁú¿Š5Ù;Äž’ÓZ½Ðü—ñö³p·sZIä\K …/´$ÈŒ3¹c Æp=½ÿàƒ?ðL〚ñVÿ ¦µÈÿÀªÃýWã¯ú ‡ßÿÜÍ×ðGýÏîÿî‡êÿ‚5éüSàÏøžê­nu.ÖþH£$¬m,JåA<àÅtõ›¢éÑôJ…­ô»+h­-£.X¤Q¨E<œ9<Ö•~ûIIE)n~Q§&ã±üþПðrïÅ_´wÆ‚w³wÛ xWÅz‡†“^—T¸>{Ãç¼{¢Vß–ŠIQ´7ÅyeŸügâëÆ~ü.¶²–â{K‰%Ô¶^4G2”À'•ä¸ãÒ¿G?j¿ø$¿ì×{ûC|Iø¥kûxwãM¶µ¦±ª ŸZŠïSžòMFKøÅì3ȹ_³DR!Ðo#CµJšòÿÿÁ.¿`­gAø¡«kŸðKoÃÚï†[FþÆz¶¾‰©Ãsp°¼¿»‰äŒZ'ï Ißdy$ ôÕj?Ëý}çêô¸ƒ†£žþ±v•ùùŸ[ÁÖ>1ºy]>|/]xöñuÖ¹ øF-_Cñ ׊¼G.“«ê®`V´]¤yûF,ÞL€ªàâã_mcý}祃â~ PýþMù+/Æ¡ò§üDMû@ÿÑ»üÿÁíñ7íÿFïðsÿwµîþý‡?eÏxÇáÿ…5ßø%ïÇ_Økz¤ºtÚľ3ÖZßHHç´×8lF6ãæÚÞ[…b6tß°ìÃq¬x@Ò¿à›ÿP´×.tk9¯¼gâ˜íµ[˜âŽé%ŽÝÐD#6Fr }ØÌ¤>×íðßËý}çWúÓÀßô?»ÿº ÿ~Ð?ônÿ?ðg{YšßüuñëBÑ5½vëösøC5µœ÷²$zîçXã.@ÉÆH\s]•§ì©û8ßéskZOüGÇúîŸa=ÍŽ¤x³Åfᮢ¸Ž…‡h‘@žFU2&<´ù›ÕT/¿àŠðNý_A½‚×ধeswfñ§Ûø{_·Y›û/ûBîæY¶Y­Øñ„´NÉ‚§V´ßðuOŒ¢×ì¼?ÿ 'áƒ\´ ÛùúŽÝ9ÀR<Î3‚X®á¥v+Þì?à–³oƒ|)£ÉâŸø&>™ãûÕÑྶm"mwMû<òØÃ=Õœ˜B»ç1 ³¡£¯\ñ7üóþ ïá›kz/üTº–ûÃZg‰œÉ©x‰eÓ/æyD–ì¶öÓ2µ·–»ÉÄÅ®aÛ_1Ò–' ü¿‡üÞxz¬¿³®®·¦ïe½íˆI·³iE[d›ÓãÿSë»çI>ü‡ÊûW˜Ò\êJ«ä y>m¸'i’Aâºi?àçˆiú¨ÿ>}ƒP³ŸP‚Qq©0KhˆY%“ ûµV!Ilrq^©¨ÿÁ;dmëL¹ðGOI¤\¥Ó¥§ˆµ©/!ó(ÔÌÆ5†&hüÔ‘?-×dõM3þ ©ûxƒKñÅýÇüO\Ò-¼)ºx_L¹ÖüD÷:ƒ6¦ö“<%ÑR(^ØEpH©/ïdZXœ/X_yèá¼DðÙ){l®ïKZî¯ö­tæí­¼Ï‰õOø:³ÅšmýÚü øu}qol÷kÕ ªLþY  #•‚RˆÈB}3r_ø:‹Å(Ž`ø/ð®úãíW jŽó]CHñ/ËÁQÏ$Ý¿<ú¦ÿþ •ûÚxsàçŠ4ïø&%èðf³áËùuÏÿix„ßiz‚NñEj6FØI#k•Mñ¨v¼FfŽ/2Jè4øK¬Øk—ZRY^x«^Åô„)wârŽû¼eÉ ã¡b°ÖúùŸc‡ñ#ÁŪ™EW++Ùi~¿òüùÏöfÿ‚ã|jøéûBüø7­üø]¡i&ñ ¦sykvó[G+`ºùKÙâ¿¥ºüåøoÿ ý†~xûÁÿ¼ ð›UÒ"ñ^ ’ÚkZ>‘/Ùç·¸³y$0Î7Co;˜Œ‘Sw!Ñ(®roþÇz½…¾¯¨ø³ö¦°¶Ô›Ä÷—/©ÅiºÛ:ys«¾"™£!–ÝÏ„J¢ 4ú£Ø~Ð#à·ˆüâŒþñ'Ç}6óN¹Ò5vÕ"¶ŽóSO*s§^%­¼B8eš)¢ÂÆY —î–ROŒ·ÃÛÎÓÇWþ ‡öðü#0é¶Wú=”·qOU’©s,ÅìÞd¶’i¶×fb‡Ûßj¿b-æÒëÅßÿiM" sO’};^{+^þÆ {¥ûoÚ­ãÅlÍlñ*Må:HÕÞ{ˆtߨfúÓàm§‹|aã«-^ÆÒËáÖ“sª[Zyöw—3jPÇæpħûV|=ŸÅ±‰-í¬¯Æ^co^}ê›Vk¢HÀÊ¡ZV/·k„_EñGÂø)F£Š4+/ÚÀsxvHâµÓî Hlu6Œ–K…²dYci|¸”:å#00óÉ~)ø;ûxcÁö~:Ô5ßÖÖ0þÕ™5Ûm×IŸN6½•Õ»ïŠ YŒaÏï²F±„¥G}¦Y~ϱüð?‡ôþÓ'ÃrÿküEX·´Òﯯ­´Z|ÅÇšîÓ"]Ûˆ+Iyn®¾Q*õwÄo‡ÿ¶ö™ã½g[ø]ñßÀºO‚5_Åtšv¾‘Ü}ŠÐ¢Æ¶ÖäÁ¹w°Ë!w$ŸÝ”ÉÌz_ƒ¿oMÀ¿tMwãÃxâÿKÒ-<4öòA¨,J×ò¾ÛQ“‰™Ê*B©Â ãó½¼ ûøCñåå­Çí ¬ÝhÖÚ}íØhâK$¸6²Ý!ûJHΛc†O6]ᔵK¬ü0ýЦ‡Uѵ¿ü’Hà°Òm>×eap·†}>ýà’È6éTH·Eö…eG"Ö1!ŽØúiðSÁ_·.‡ãÿjŸ>/xžm&é¼A§ÙYD¬š‹;ˆ–ÝÒÞ&ò•$9Ïœàɳí«[ÛKè#º²º·»¶~RHÜ2·núWáÅmWöWø…¨Ïà?|Gý£ü9âéšV‡}¤¶™fҥ倸ó.·¢˜åšÞ+6–e‰™É„`ÛkÌ~'øcö?ð^¡—„>.øÁüccugâ]ZMFÚÆæ]oO]ytñ.ø-ãß Øü>±Ó i¢_j m ÝÄ„+ù©ö)]œ}å“ÌØØ" L‡ÖþþÓŸ >2ÏáÛË®G.«`÷öbò×Êó-ìî]8cóoí\•e”fšø£öÇð/ì“®|VñO‰~4|wø…ð¿_·ðÍŒZ®™ÒZÉkÉšib¼É$a >ð¡¥*BP ³ðóþ g¥Þx¯Ný¡ü1âiþÀ×Mig”ÑßÜîpð ˆ ©à‚e eóm·ðÿíÛ}àÿ†ž5µøƒáÿø‡ûüCe®][–‚è]ÜH¯2GiäHE»Â’,BÝäe<@ü¿ñEÿ‚~ë^øyá‹¿ÚCâ…,´ ë6pÒ4k¸dÕt¹µflEgþ‘̸fˆ~ñQ˜±RìÜ]ÿÃßø'¶¯Ú·ü5oÅ;Káy<×1C¢ãIMt¹k–’ÔËo˜íGšdùÐù#\3}…ðCÂÿðPGTÒüsñǶºn‡ÌŒÞÕ$²Zœ)w…¸xlÄ ¿Ú >[hwï sè_ü1ñûÁ¾=øýñ‡Dø¤‡OO ]ÏàÏ Í©+ÚÁxé‡Ìš c¨Ó[L'™òGtÌ»YÉ4üøqû ê_´xü-ñÓÆÞ,ñeõµÃZIw:D70Y´·ñÝ[[À«—p“\"J<É”´ ¹u¯ ³øûêžÖ¦¼ý¢h Zuk%“\Ò$¼º½–ö4`°ÚËb]ƒ8šx$‚’JdBb ô#Þý¿´ïië_~xÁföÅ55¢†o jIq,IËþ…¶þSHÄÍ+J%EØ‰Çø¿ÀðSy5ïIá/Œÿ‡‰!›AI­R9£ÑÄ’Šç6lÊG;æâPоì¡ñgöNøWá7áGïŒ>3ñί®™`:ÕŽ¡=Ã\NÑ[®éZ‚6•V??w”ó™rå…{~ÜŸ³:ÙýªûÇ×:dÂy-šÞ]"ñäï7ýTL¬±€FRV èd)¹räÁŸÛMð¿¬õŽºn«â©bðœšÒËooom5­ñ¸ÕH °D p®ñüªKÆ‘¡ØÙý{ðONø­¥|=Òì¾3êú~¹ãµšàÍ=¼©.a2±ˆ<‘ÁHá6å’ÆxÛÆãGà÷Çÿ…,µ+߆~"Ÿ[i —i-ŹˆHÒ¢•2¢¬«æA<{â.›à‘weHÍ@Q@Ÿ~þ×ú¯ÆOŠ2ø/ñÇH²ðòZCi¥øz÷R†K[YÞÒÜH²Âl¤hX2™‘·±&aŸí8~ðoíãáÿ†öšˆ~4x[øãyâA«Ìò]ÃäɤǦÛÃ$PÆl†#K½²I ,&;g„¸Ì¿i?þÇ'ö‡ñn·ñ/öŠø‹ðëâ»é†æ[9®BiìV(µ¶@ñ«B YÙßz©Š6—ª++Âþý‰>KwâÝ#ãßÄiô¯ˆ>Ömt–+y{ v2D²lo³¿•"Él!Š96»í쪨¹áGöëÓ¬¼-wñwö ø1ðóL‚ÓD‡ÄÖ—·zhÕt›é§Š{‹ygkn%–ÜJ"  „œ=v þÁLtÏø_^øñÇá–« Ë©Ø>·eŽhÿ³cžå¥ŽqvŽXÔ¸ ±H˱·ùKx7ö6¶ø®è–_h|_®ø‡Äòèú¹¼Õ´‡ÅêÝ£%¬¯u º¬®ä¢<Ó¶íòÀŽÁž5o¶~'A¢Ýü7ñý¯‰ÁHÚ5oþÒ_ ­ü{zt»¬­Ô&éo%üóJ›A+Lßè­…`%š7Ü^½;Âþý±¼9ij¬|fÐ5ëº-ÚxkKÔõ;Yÿ³õ(á´XfGN„å¥ -‚]Äþø7ûxSÞºß~,h>ð&¿§E‰õ¿ GæYê³ÛÜ,v±¼ÖfåRœ«BʱÀáÃašZèÿá]þÆ_¾-üP²ñ¯íñŸþ{Ÿ7…u;»›&¶Ïwlm•bž ]t‘Χ(HŒüÌ2õÁ¿~ÜÚw‰~jÿh/„þ-ð»Í}gâ‹HmŠÏs¯“6¯¼M¼\E+Ȥ–VYÝùƒÔ¾ÿÁGï¥Ö#ðÿíðÃ]žÂ hmÜù0Ko¨=‰Q¡öË1tI#ÁO áJ’ß¿Âßø'•«CâÖý¤þ)iúͦ•sª[høI ’ÄjO©b+%ÓÂFÞSÜùJ ÚI6ìÑÝüÿ‚ø7C›BÕ¿j¿Š†+›]B[™t†¶˜¬ 0™%ûi:Æ-ÙÙ€Ù8ˆ²‰€ú–O…ŸðSk]ÄÖºŸíðìYÏ¥Í$³Eq70]I>ùZ™,m‘•0ÈPŒn!×ÞtþÖGÆo Ïů j¿ ÞÛK—TÓnuä—lV–ðÝñ6Ÿö½>âÒ{#KX®/®]"ó‹$Nìc³*òNy]—Àïø'n¥â=+Kð÷í#âíÄÚd±%Õ´ogy5Ò¨Ýûm’apÌ¥š"Cý¡¡%<Ï(¢¼'ðÏöôѵ=OOðïí5àO_Aâxä×mu‹ˆu9ôÝ;ìöÞ\(VÒ6åÃÌñ±#c&Í¥‹ŸÔ‹kËKÄym.`¹dx™‘ÃêÅxîGb¯ÃþϰÃcD·Ç_ü;M3P¹ÒÌpè[lõJÛL‡OººXùw»…˜©.’L²DÜ–ŒúÖ§ÿùøMñ§á^¥âƒŸõéø…u8×UÖ4˜Ò1 Ì¡%…íÞ6Am$r´0:¨†bÄ`@?]èªö–ÿd´µµÞÒùQ¬{VÀÆjÅQEQEQEQEQEQEQEQEQE~,xsâ'…a¿ÒäÕÿ`X'ø£o«jw:£é1]Á…nÕã’KlÍæÆ¢5€í片îÃq˜~&|8ÓµHá¹ý€´I<4ºêIäÁ{;‰dÛÚܱ ½S÷ 8òÕ‘›_·TPäÇÃß|#ñ‡Ä…ø{ã¯Ø:ÏÀ:7ŒaÕTÕ/¬ Ý»A%š¸†xͨ'ŽöxäLˆ’V•wHÏ“ú?À_‚·?ð}£á_€æ:¯ÚN¥»Lˆý¸Ï ¼34œ|ÌñZZ¡'’°F3òŠõª(ÃuÙ»à½ö©¤kxJÒ/lâ´¶Á~Ì·öÒ[Io ¡0$HÚÎÛh=(: Q'ìËû=ͪx§ZŸà×ûW\‘¥Õç“K‰ÛPf—Îc&GÍ™ÿ÷¹ëÍ{•á÷ÿ³WÀ=SBð߆5/„¾ ¿ðö‘ÄZu”ÖJðÛ¤Òy²®ÓÓÙùÀ¼­+_€-<=…"ø{áçÐÖæÆ;yc2ùVó¼/,jÎK*³[ÀØ`Ã*+ר Ÿ¡ý•gkhµ-~xFÖ ´‰nR(YÍÍ’¤~ðyiûÏ¿òš¬Åû/~ÎÐý¬GðcáØŽx~Îñ23Çä¼QHÚ€Ç#©Úwry¯x¢€hðèðéß <°¸kË7:lm$ Ä 0vŒÝÒ3’X­Ä “¸Õ«€_´È<5m§|)ðŒ5Õ•æ’±i‘(Ó¦µ¶ŽÚÙâÀù PÅiº±¨zíãÞø ð¯À>'>*ðo…­<;zá!·µ&;[S:Û¤Í#äBëin ¤C§5ð—íoâƒø™ãMOÅß²&­ñóÅ÷:>ö«™-åšÓ’FÁŒù2*23H §ïü¸ ×êu|IñÂ×öܹø»jßoü'að\hñ¥ÚÉ%§öƒÞùêÌðyð°GØ ~ó|[X¡ð@ÈÞ&ñ/ûŸ„Ú§Æ ~ÃÞðw‰ô?Kà¸l|K 4³Ï¤¥»ÈÒAB»îäx×qeí±¯ƒÚ÷â­ÅÖ­ÿ Ëð/Gžïâ Þ‡ªÙj »{¨´ÿø™8¼”Gq¹&“È ÎñŒ›6°ÚؼIüž8õ_ì_ü%±Ž Å–IÅ“²j- hU2бÄTÆ"‡p¬æ]ìS…‚ÿÁ@®¾øŒ&¹ðÆãâ<8´’ÐG=«Û6…åƒqe#vUÈaV™”1 „¨ü9ø×¯¿‹<%²÷Â_ ßhz­¨é÷ãÃwëo.¢Ö“DÐZI½¥pbHâ‘Ö';äV†6ÊVw…¼qa¦kÔ4¯Ø«áž£©IjiÞ»IÍàÔe‰çGgxÒÛËBb™Ze-"†hATo¤¥ÒÿàªbÁXø—áDÚ‰±rËV‘"]-ül/îoæ bDØÅ^L×Y¢ø{þ 9ý©¦E¨xÃáÛÏÍÐÞà^ª¶E²3Áæ*:’&v;÷òŠ.hãKÿjsøƒá§‹ôoÙIÕlü-nš¤žÑ5-94mYä¶û=„öÍû±eutLå@Þe <©YøÁ{¦jš2êRþÂ’Gi{yu¯Ë£é½°€@öm’k[RIaJ³=½»LØR®>ãø¦ÿÁ@%×¼P¿5ÿÛi’jwÿÙr]}ŒÛÛÚ³‘m¹ &b© ÅÍ×9ò>Jàeð¿üïJ×5ht¯ˆ?™ý¿i?üe×uO x³á±ðóT²ÓÅÜó4—B%*4dËoÝÅ–ArÞLù ±Kù‡ÃßþÙúo~ø§ÇÞ'Ñ|UjÚ¶ ¾/·º{†ÆÁ­TÛ›–ë$XåR£ê‘ï|/? ôQEù…ñÿâÂ?üm×§Ô?c{ŸŠ~9’â×KÔõèôÆv—O¹†Ò0o!Ä ¤ï–¤³ WS€0¼ñ_Â_¾xÏUÔ¿aKÏ x[ÂzŒvn¼¸–cq}ñΧ¬hâ½&ßH¼žçKX ÇQ‰abÐUbûÀ+´+ž‡¥vuÃüN²ñ¥ðßâá q¼1âÉôKèt½H:!ÓîÚMºEd]ŽU²ÊÀcGù?áŸŒß ümðãJðÞ§ûÉ£øNëQ‚{öÚg´¬ Üí["³yÞf 4³q 1¹|{øWã½V/øÛþ »­j~"Ô!±Õîn¯í÷ Ë~¶ O—lùhã(áNM¬NÍÕïš’ÁA<+¢ZϬ|MøUá /M´M"ÚmZòÍÿ·î›-ijKVB¿4k‘º_¾r§Ÿ¶›þ ÚïÄ üXøgâ-AîE¾™k©jšdói·[O"â(-Ô*¬;ÉXÀ•¦Ž6Üa”ü_ñWÁÏ„ß4ü×­ì´ ¾½¸Õt»)­/Zõã¶žåV ŠÒÀѱ.«š*I…—ˆ¿mWáÅí3ÆŸ~h_l…n,¯´­gLtÅo+ûF)‹DËÊ7y0[ÌÄaV ’~ÛÖ~0Ðô­?Ä?°7ÄRÐÁ4Ú<hŽ®æ¹µ»]ÒÛª¤r"í]Äy¿hE «¹†ŸÆŸøSÁ.t}öÖ5 ˆüQýµˆ4¨ÁªÝXI ÊÜÏ p‡r.%2€ŒÌZÞ'%±±}çÁÚ7íÀ—¾=ðç~!ø#XðµÏƒõ? ê6[Zê—š©-ö{–‘a(’l³^ga!÷|ùªü3ÿ‚§…4û? ø’Kÿ5¤ÖÖÚ‘ñ‰4ÈP^†K˜$ ‹™™­q(šO#k…dòËŸÚ#áï|Iÿ O‹à™¾!ñÍåì—Ζ{·¸Ü e"khѼÏ*QAÜÌgf•LŸªŸ²ïŒ®ü}ðsKñEç€tŸ†o>¯­Ç“cçy z¥Ôi:™¢‰ßÎU1¦ã) `ŠùÿÅ2þßúçŒoµ¿ÇàO |7¹ºÓ§´Ó'¼³šþÚËì² ÈľSÄÓ5Á·hX–A܇Ë4;|úîßþ =g¤»xçPð¾¦N”ñ ð ŒKý´4Ëáæå« F½60ä²¢Ê&Ý‘€ÔZ*­—ÚþÅiöó¾ò“ÎÙ÷|Ì ØöÎjÕQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEñ_í#ûYþÐ÷þ"¿?>!|>:†•œmôÖG·¶™%f7¨ÒvQ nÏÊ Œ’Û¾Ô¢€?+|Wÿ¶ð¯‰%ÓD?¾ Xi±M5ÝÕ”¶°ÜCª\Kf–ò´ûˆ2,¬‹,ŠOÎÀr½jÅçüÿÃÓA®ÁkñûâݤWÚ|V~Wš Ò%Ìs‰R0ÁH&5p;#ÎBá¿R¨  ½ÎÿOÒììµ-L뱩G¹0ˆŒÃ'¨à`pH'8­J( Š( Š( Š( Š( Š( Š( Š( Š( ¹ox^?ø3ž ›P»Ò¡Õ´Û9®­ñæÛ‰cd.™ãrîÈ÷ÔÑ@^~Á>?ÿáQé_:ÿÁPüðö‡ø‡ð#ǯ¬h—:L:eå­õ¶%üWݼêZO+&€Ä›ä~œ¤”×Íþÿ‚æü)½Ñ|OâG­xºFöû«ë-§ûHòôÉ?Ñ‘@iÓn§Üv?î˜ùdÙß~Î?DøwÿLøWñGÆïðû¾3¾_%•ýäÆûÂ÷6¶öÍgËwlò¿Ê³Â—¨ ØÎ+ˆðüÇÂ_üyyá¿ZøƒYðvà]GǺ4)í“J´·²G¶e2Ï$ð]Å:mÇîÝ8fm£ó—Aý±¼+á?xoAðçì¥ñ_ÃЧî~YêúF¥ÅŸkÛÛý´:Ù EhÝ@·FÏ•nãvUc1|(ý­¼#v¿4_ ~Ë~)øeaâ¦ñF›rE†›ki¦ZZÇö‡7N›‡†éÿÖm5ebÍ#öŒ;3ëWâ›·4~ùywÌý²ÿ‚Ì~Ïúž¤_é^=Ö5‹‹û+=FÎÆÏÂ7SÝÜ[ÜßGa ˆÓ<ÉRØœáf܇[‘á_ø*Ã?x#âÄ x¿PÕ|á}/ê·éák­¢Õíb¹)ýéfH§„¼j7)•G®?4Ž ¼/qáˆ~ý˜ü[«ø³Yøw¢;Af°A¦iž]ì— §[[I`ÐÛA÷˜òÜ$hÂå ,ŒÄ:úŸ´—„t;OËáÏÙöÖãP¿ðï„í&Ñmìì-.5k{ˉlæ±»“û,ÆÐXâ2†_%Ãm@BÒþÒ‡gý|Çþ£bÿš?|¿ùï¹ÿൟ³,:n¿«'ÅÈïl´Í;LÕožÛÃsʶÐ^ýŸÊÜê|°T][™2À ““ÃbÞ¡ÿŽø3iâk¯Zx¾}V[]^÷Ã÷‹pn¿´ášÒ­à·´ây/#Xß(§eù‡çÞ¡ñkáÌúŽï4/ÙïÀºÎ‰i¬xGC½´¿Ó4û$Ã÷vpÏÍ×üJd\ZNí•̦ ²øóðÓÅZ§tøe)E×/<%yu«i:Lšì@ÃæÞ»¶˜VI%mØ–uƒæue KûNŸf7À˜ËÛš?|¿ùõ£à¯ü£á÷í âûÏ|*ñ”šö©™ý¯òørâÚÖòØEe+˜e“ #"j6EÔr¾zŽ¡±õ'ü-ÿÏö“ÿ€ý•?Úwí‡gá x⥧ÁµðDwº?ŒïV ;«Ô$]&Ö)$zj,ìZª0ð µàðÝ~ ~ÖÞ>ø³ãŸ†~¿ðw<áhWš•®©¨j‘—šò Ý xŽš¢â3I¬Ñpçä8›Ìé­u | Œ””T£wç.¶òó?c?áoøóþ´Ÿüÿì¨ÿ…¿ãÏùþÒðÿ²¯•~Çâú[Q<<÷„1yu8ÔÄZÍÛFߟdgÂßñçüÿi?øÿÙQÿ ÇŸóý¤ÿàÿe]·ü3‡èwøÿVßübøgÿÐïñÿ­¿øÅv/c‰ÿ…¿ãÏùþÒðÿ²£þÿ?çûIÿÀ?þÊ»oøgÿÐïñÿ­¿øÅðÎ>ÿ¡ßâ7þ[ñŠÇÿ ÇŸóý¤ÿàÿeGü-ÿÏö“ÿ€ý•vßðÎ>ÿ¡ßâ7þ[ñŠ?áœ|;ÿC¿Äoü ¶ÿãŽ'þÿ?çûIÿÀ?þÊø[þ<ÿŸí'ÿÿû*í¿áœ|;ÿC¿Äoü ¶ÿãÃ8øwþ‡ˆßømÿÆ( Oü-ÿÏö“ÿ€ý•ð·üyÿ?ÚOþÿöUÛÃ8øwþ‡ˆßømÿÆ(ÿ†qðïýÿ¿ð*ÛÿŒP8Ÿø[þ<ÿŸí'ÿÿû*?áoøóþ´Ÿüÿì«¶ÿ†qðïýÿ¿ð*ÛÿŒQÿ ãáßúþ#àU·ÿ ,q?ð·üyÿ?ÚOþÿöTÂßñçüÿi?øÿÙWmÿ ãáßúþ#àU·ÿ£þÇÿô;üFÿÀ«oþ1@Xâáoøóþ´Ÿüÿì¨ÿ…¿ãÏùþÒðÿ²®ÛþÇÿô;üFÿÀ«oþ1Gü3‡èwøÿVßüb€±ÄÿÂßñçüÿi?øÿÙQÿ ÇŸóý¤ÿàÿe]·ü3‡èwøÿVßübøgÿÐïñÿ­¿øÅc‰ÿ…¿ãÏùþÒðÿ²£þÿ?çûIÿÀ?þÊ»oøgÿÐïñÿ­¿øÅðÎ>ÿ¡ßâ7þ[ñŠÇÿ ÇŸóý¤ÿàÿeGü-ÿÏö“ÿ€ý•vßðÎ>ÿ¡ßâ7þ[ñŠ?áœ|;ÿC¿Äoü ¶ÿãŽ'þÿ?çûIÿÀ?þÊø[þ<ÿŸí'ÿÿû*í¿áœ|;ÿC¿Äoü ¶ÿãÃ8øwþ‡ˆßømÿÆ( Oü-ÿÏö“ÿ€ý•ð·üyÿ?ÚOþÿöUÛÃ8øwþ‡ˆßømÿÆ(ÿ†qðïýÿ¿ð*ÛÿŒP8Ÿø[þ<ÿŸí'ÿÿû*?áoøóþ´Ÿüÿì«¶ÿ†qðïýÿ¿ð*ÛÿŒQÿ ãáßúþ#àU·ÿ ,q?ð·üyÿ?ÚOþÿöTÂßñçüÿi?øÿÙWmÿ ãáßúþ#àU·ÿ£þÇÿô;üFÿÀ«oþ1@XÇð¿Åêž#Ñ4ÛÛÍ5í'¹Hä k´•'œÜWÓÕáÚÀ AÖtÍjxîòkY–uŠââÝ£ŽÌ ‘ô"½Æ…Q@Q@Q@Q@Q@Q@Q@Q@q_~Éÿ ÷Ç?ohRËû"ïÎ26Õ å6r{ w®Ö¸ïˆr¬>ñ¬Î’È«¥]1TBìÀDÜ“ì9¨«ð³¯üxz¯Ìü˜ó>uþ×ðÏM¿ò=?ÖR™>œ“¬xh“ŒÿÄÔsÿ‘+cþM?þ€þ'ÿÁ5×ÿ£þM?þ'ÿÁ5×ÿ¯Š¼¼Ïê[Sï»þ eøjI'XðÙ$äŸíQÉéÿ=(ó¾cÛ>Çý…Gÿ­øI4ÿúxŸÿ×_ünøI4ÿúxŸÿ×_ün‹ËÌ\´»Ãîÿ‚d~’¤ë%s·þ&£ü‰Iæ|4εü5œmÿ ééþ²¶?á$Óÿèâü]ñº?á$Óÿèâü]ñºw—˜Z—x}ßðN_XÓ~ø‹JÕ4/¿‚5ý úµ½²¾½ŽâÞöZ)cw+"H*À‚ TÖ–¿ ì,íôë ¿XéñDÅo ‘Åh¢*«áU@0WEÿ &Ÿÿ@ÿàšëÿÑÿ &Ÿÿ@ÿàšëÿÑyyýâä¥{ÞøüËø[ÿA àÉøº<¿…¿ôð§þ —ÿ‹­ïøI4ÿúxŸÿ×_ünøI4ÿúxŸÿ×_ün‹ËÌ|´»Ãÿÿ‚`ù è#áOü/ÿG—ð·þ‚>ÿÁ’ÿñu½ÿ &Ÿÿ@ÿàšëÿÑÿ &Ÿÿ@ÿàšëÿÑyy‡-.ðÿÀà˜>_ÂßúøSÿKÿÅן¾)üiðĽbÓàÐñ7‰ü*ž¼6®«oý“¬·qyû\S³ýŸíºcb±.ô,\~„ÿÂI§ÿÐ#Äÿø&ºÿãuùÃñóMø½â/ŒÚí×Â=oLðÄÒøBóMQu}}ìwOy‘\-Øå…@Xåˆ\ΦàŽ#ÞV¤cïÝöò<ŒæS_ פUÿ3æ;ÿÚÃöܽñ7ˆ<‡—Kñ }r´÷’æYoEÍŒp¯&ª-âi–kÂÖï¸Â-ÁÏÍzÞ³ñ÷ö¸׋M¦® §‰4ÇÐþÇw½—FÈ.ãŸÌÕŠZØ»‰WiR»°+âšÏ‚¿okoÄžÕ~ ksxa|é°÷§NÒãÖMÍ“´zs\´±Gé’pˆ“y¨<¸xǦx¯Â¶ w¾:×Å«O xOQÔÖþ c{$'D´Õ`·º—He‰Ax™Œ‰/™ålÊ$|ìñU´³ÿÉ¥åä|¬0´µºÿÉWŸ™Ôh?¿kY¼E¡ÁâýV³Ðá7Ï&•x€Éá¶kø•¥ó5W+"ìgg@K Ù5(ƹ?ã×íÙ¦Üx H¼ðæ•ã+“ªëÑx’øêMmb,tï³0Õ$dwJë“ÐD$ðZWÂoÛ»L:=—ƒ>?hør×Åï¬j_Cw«Mý%äó=‚Êö*ËBð ËKbHÀJÓ²øqûbÚx³Á¯>6Ú\hÚE¾±‰aŸP¸k]HIK®Ý)b¶ŠÞx¤›Ê`î7˜ŒåAÊxª¿Íÿ“KÏ˯®ö)a©Y{¿ù,|¼ÿNçsiñËöÒ¾Šh.ŒZdgÂ:µ÷Ú£³u™µ¥.¶vˆ®²¡ÁF;·#”ûчù8XjÛ_ÅZ·Å_ ø6ÊÓK»Ð´&h®56Ü[êrYÚO<j¬W®Ì×h©Ž5 „ÌX74o†·|>ÓtýgãZêþ0‹Ãš Ô-ZkhµfkϳÏ0:D†áUe²*Ëål6Ì<¹CœÁñG¶W‡ü9=ï„Oþ;]…ñÃÑèz27‡Oþ;G•û7ÿÐÅðïÿÉÿÇk·ÿ…‡áßú<{ÿ„µÿÿ£þ‡è\ñïþ×ÿüf€8+öoÿ¡‹áßþ“ÿŽÑå~Íÿô1|;ÿÁòñÚíÿáaøwþ…Ïÿá-ÿÆhÿ…‡áßú<{ÿ„µÿÿ #Êý›ÿèbøwÿƒäÿã´y_³ý _ÿð|Ÿüv»øX~ÿ¡sÇ¿øK_ÿñš?áaøwþ…Ïÿá-ÿÆhˆò¿fÿú¾ÿàù?øíWìßÿCÿü'ÿ®ßþ‡è\ñïþ×ÿüføX~ÿ¡sÇ¿øK_ÿñšâ<¯Ù¿þ†/‡ø>Oþ;G•û7ÿÐÅðïÿÉÿÇk·ÿ…‡áßú<{ÿ„µÿÿ£þ‡è\ñïþ×ÿüf€8+öoÿ¡‹áßþ“ÿŽÑå~Íÿô1|;ÿÁòñÚíÿáaøwþ…Ïÿá-ÿÆhÿ…‡áßú<{ÿ„µÿÿ sDà(Ö4Ó k¾¸Öüåû*A¬¤’4‚¨î>Ø5í•ÀØxçB¾¾´³ƒAñ¤K Ey¼9{ hOvwˆ*r@®ú€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ ãþ!ÈÑx Æ’¤2Ü2éWL#Lnså7q'Üï]…r~<ÿ‘#Åÿö ¹ÿÑMYÕøYÙ—ÿ¼CÕ~gå‡öõ÷ý 'ÿ¾­øýÛ×ßô(øŸþúµÿãõÑÑ_ ̻־Æ_Îÿò9Ïíëïú|Oÿ}Zÿñú?·¯¿èQñ?ýõkÿÇ룢ŽeØ=Œ¿þäsŸÛ×ßô(øŸþúµÿãôo_Уâûê×ÿ×GE˰{;ü?Èç?·¯¿èQñ?ýõkÿÇèþÞ¾ÿ¡GÄÿ÷Õ¯ÿ®ŽŠ9—`ö2þwø‘Îo_Уâûê×ÿÑý½}ÿB‰ÿï«_þ?]s.Áìeüïðÿ#œþÞ¾ÿ¡GÄÿ÷Õ¯ÿ£ûzûþ…ÿßV¿ü~º:(æ]ƒØËùßáþG9ý½}ÿB‰ÿï«_þ?_2|aý‚~9~Ð)½øƒ£Gâ/ 蟅®ü<ÛE¦yóÛÜ\EpdiÍâÈt©‹iWp/¹~¾¯Ñï†?òO|ÿ`øôÖŽQKùjÝrë§üŸâe[†„©»ÞV×ÓÊÇòésÿdý¥ï<_¬‹CY¹ð\þ oAwye{Û\ØÈ8íaŽÞ³aÜ?'Þƒã/ø#¿Å¿]xÚçÅ6º–½oâ/i¾'Õ¬/ìt»›««;ŹL¨mØv˜ÈòÍØu濨J+µðvGÍ-<×ùy‘®,ÄëîÇ_'þgó5¬Á'¾;ëêk‹yâm­ük{ã:-: 2ÜX]Ü5±doþufÆXsçJp2ç5ø#ïÇmrÃÀº]æ¹ã ]/@»ñ=Í­¥•¾—¼««™ ‘¼Fý‘–&–M¥%[nW’¨Š*#ÁxUkJZy¯òóe¾/Å=Ô~çåçä,šoü›ãf“sá³§x§â–¥i¯áí6ÆÖçNŽ+Kk×Ê€o›åO<¨*ˆ»Ô Úºÿ‚=üZºÓümfº}õ«ë´ð¬-¬Z-8n^s5¼o©²‚ÆM»[;DP|ÄFþ h¦ø7 õæ—Þ½{¸·¾Ì~çéÜþV ÿ‚<þО&Õ>3ë4û›»íÅöþ"Ó"¶º°¹±O³ÏoÕÛÑEQEQEQEQEQEQEQEQEÇ|CˆOà/ÂÏ4júUÒ–Ê2æ&ä0äq]qþÇÿ ûÇÚ"&Óÿ²nüñ"†S”Û²QŒÔUøY×€þ<=Wæ~[Â3gÿAÿàÞãÿ‹£þ›?ú x¯ÿ÷ü]~kK­þ×6ºþŸw~k¾"6÷¶+¦è°¥ž›öûCçA3\ù“Bl–ñs"%Ç$_ºÚ29ß ^þÛ­¡øG]ñg‡¾ …ñ-µþ‰k¦hÉe$¬¶Í¤\\Iæ—Ž%at®¶òI!ýÞáó_ö2îIÿiÒ½½Ÿõ§‘ú—ÿÍŸýV’ô &mWh DË ½Ãù—A@Äî…¤ *Ix'Ä?ðPOøRûQ×ü5ð[Á–÷^Ò5]&h|9¦E«®¬f³–êÒ[k™|¸f1ØŠHÙØx#¿nÑþ=çØbó éP–-·œ“&½|žüîýͼK”Ÿ//ÅÑߣò=—þ¦ÿC?Ä_ü)¯øåð­4oúþ"ÿáM{ÿÇ+Šó?fÏúü/ÿÁD?ün3ölÿ /ÂÿüCÿÆëèOÆN×þ¦ÿC?Ä_ü)¯øåð­4oúþ"ÿáM{ÿÇ+Šó?fÏúü/ÿÁD?ün3ölÿ /ÂÿüCÿÆèµÿ…i£ÐÏñÿ kßþ9Gü+Mþ†ˆ¿øS^ÿñÊâ¼ÏÙ³þ€¿ ÿðQÿ£Ìý›?è ð¿ÿÿñºíáZhßô3üEÿš÷ÿŽQÿ ÓFÿ¡Ÿâ/þ׿ür¸¯3ölÿ /ÂÿüCÿÆèó?fÏúü/ÿÁD?ün€;_øVš7ý ÿð¦½ÿã”´ѿègø‹ÿ…5ïÿ®+Ìý›?è ð¿ÿÿñº<ÏÙ³þ€¿ ÿðQÿ ÊÏhÑxçÆ± WÄnW¼PÏ©ÌÌØ™ÆI-’}ÍrŸØ–ÿô׿ða7ÿZ^7‡ðšøÇì–¾[Oí[Ï(%¢ ç>06ð1Šæ7øþ}ü9ÿ€ÉÿÄ×j±ú…E¶ÝÍ_ìKú kßø0›ÿŠ£ûßþ‚Z÷þ &ÿâ«+€ÿçßßø ŸüMüÿ>þÿÀdÿâièiîy}æ¯ö%¿ýµïüMÿÅQý‰oÿA-{ÿñU•¿ÀóïáÏüOþ&þÿŸà2ñ4hç—Þjÿb[ÿÐK^ÿÁ„ßüUØ–ÿô׿ða7ÿY[üÿ>þÿÀdÿâhßà?ù÷ðçþ'ÿFîy}æ¯ö%¿ýµïüMÿÅQý‰oÿA-{ÿñU•¿ÀóïáÏüOþ&þÿŸà2ñ4hç—Þjÿb[ÿÐK^ÿÁ„ßüUCy¬k4ÝcÆ~Õ¼jºæŸcqqX^Î÷•”Š ,Ï I'Š¡¿ÀóïáÏüOþ&«Ý?|–ÛmáÜñÒÙ?øš°Ñ§*‘Œ”Zmuÿ€~|k_ðTÛÙü;ðËÄ>øñöÖúþKˆõQóÎ^ò(ÌrAbë [¡·É/ÌV顤_SѿࢶV©£ÜÞÍàoŒÚ_‰ŸJѦ·Ñ®‡ˆ(o'Õ¤³¼Y.ÆžWd0n€T.cÞH¾ ßàŸù÷Ð?ðøš7ø'þ}ôü_þ&š¦¼r;µMü£þGÉž&ÿ‚”~ÚzO‡¼Mâ]à—ÇÿÃg>‰tz†­o'Û,æi&±D)¥íXÂò‘*‚êŠk;Å_ðRÏÛY`øƒeá…´“¥x–ßK±¿ÕbÖg·Ô¬@dŽÚÕÙ¤Ú²c‘3H2ŠÿboðOüûèø ¿üMüAß@#ÿeéÿ|ÓökÈC‡})ýÑÿäO–|3ÿ)ý¬üP|{¤|=ø¯âMV×uêóCñ5ÍüVm§"G<‹*[ù%ð\C³ªº@$…ßÒ¿oÏÛWšÎÙ¼=ñJŠ_ ëô—²\x™ã¶¹·âÞÈ#i(Ï,„ä¡Úߺ“ËnMß@[Aðþʶ²Ó|/gl¿v8l£D_  SïðO{}ÿ—ÿ‰¡S^EG#Ãu?º>_Ýþ®|‹ü§öÁ×ïþ øsÁø…¯kÚ…t½jw¸ÔuˆZÚò{(.d¶º¶û'™ ó¢D…îƬ"ÚÛ‡èG†~8|^ñ‡t-rO‰ÿ­d»´ŠáãkÛ¸LlÊ 'Hæ^sÄˆŽª§Šò¸áðSOqሮ%Úe‘l4¸ˆ\œ™©·ø'þ}ôü_þ&š„|°ù6.ó…7òùXüø—ñ7Sø©ðÿOÕ>$xãSÓ¦Õ`ŽkyõxæBÜ«ÔJý|¯Â¯ áñ£á‡ØàÑVëûjßË)n¡ƒnìq_ºµÍˆJúqÖ:ðTc«}›wòH(¢Šç>(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+”ñßü‰^.çñ-¹çþÙµuuÇüBó¿áñ§ÙÌBãû*ëg˜ ]ÞSc8çJίÂÎ̽ÿ´CÕ~gó©íOûJÁ«Y¶©û3ëøfçÆw¾ŽK+^{»{(uKKxõ c’ÉBÅ5”×Wk"–„}—Ë2nlb?Úëö¢Òfø]¤Ãû)üMøk¨Çâ®ëí j:*ØËi5ÏØZIÊž|Ilû˜o8ˆË:”¯Ð|xÇþzøSþýOÿÅQÿÏ_ ß©ÿøªø¾höGõ%oç—ܼÏ?ö¿ý¬o<kâkÏÙ^ѼMÿ…îºú4öä’ÞjQÉv°ÙB`²G»È·Ü³”˜ý±Y• 5¾*þÚþÛOwª|%Ó¯'»ÿ„6ÏJYt}~ÖÆâÿS¹–»xç–Í^âxCZ²Û* pe ¡•ÂþˆcÆ?óן÷êþ*£’Leÿ„BP0 Çt<·Z/È—N¿-”åDxŸÀÿŠŸüoã‰:ņð­ì¬—N»Ð£[[æim§²·–TšéÓì’ËòMH°òX²¨Áo¥¼É?ç£þuÌãÆ?óÓŸ÷êþ*ŒxÇþzxSþýOÿÅVm\ï£VQV•ßÈé¼É?ç£þty’ÏGüë™ÇŒç§…?ïÔÿüUñüôð§ýúŸÿŠ¥Ëækõ—ü¬é¼É?ç£þty’ÏGüë™ÇŒç§…?ïÔÿüUñüôð§ýúŸÿŠ£—Ì>²ÿ•7™'üôÎ2Oùèÿs8ñüôð§ýúŸÿŠ£1ÿžžÿ¿SÿñTrù‡Ö_ò³¦ó$ÿžù×èçÃ"OÃïI?Ùðõÿv¿/qãùéáOûõ?ÿ_ Ÿcø¢| á#mwà·û[ÛÜ–ÆÞÿ={9*÷ß¡ùŠuy°”ôkÞýîôWžy?çóáçþ\ÿñÊ<¿‹óùðóÿ®øå}!øqètWžy?çóáçþ\ÿñÊ<¿‹óùðóÿ®øåzçž_Åùüøyÿ€×?ür/âÇüþ|<ÿÀkŸþ9@‡Eyç—ñcþ>à5Ïÿ£Ëø±ÿ?Ÿ?ðçÿŽP¡Ñ^yåüXÿŸÏ‡Ÿø sÿÇ(òþ,ÏçÃÏü¹ÿã”ù%ñÜøûÇ$»ý³}ßþ›½r;ßûÍùÖ‡Š?á9ñ¯'‡ ßÚ÷›öG.ÝÞ{çlã5ÊcÄóÓ@ÿ¿rÿñUÜ™ú½žâÑìmïï7çF÷þó~u‰ÿÏMþýËÿÅQÿÏMþýËÿÅS¹¯´òfÞ÷þó~toï7çX˜ñüôÐ?ïÜ¿üUñüôÐ?ïÜ¿üUiäͽïýæüèÞÿÞoα1â?ùé ß¹øª1â?ùé ß¹øª.ÓÉ›{ßûÍùѽÿ¼ßbcÄóÓ@ÿ¿rÿñTcÄóÓ@ÿ¿rÿñT\=§“6÷¿÷›óª×nþC|ÍÔw¬Üxþzh÷î_þ*«Ýù-ºMtŽ_þ*œ^§N §ï¡£Ý~c÷¿÷›ó£{ÿy¿:ÈÆ½ÿ=4Oû÷'ÿF5ïùé¢ß¹?øªÞçß{gÙšûßûÍùѽÿ¼ßdc^ÿžš'ýû“ÿŠ£÷üôÑ?ïÜŸüUlû3_{ÿy¿:7¿÷›ó¬ŒkßóÓDÿ¿rñTc^ÿžš'ýû“ÿŠ¢áíŸfkïï7çF÷þó~u‘{þzhŸ÷îOþ*ŒkßóÓDÿ¿rñT\=³ìÏhø$Ì~/ü7Ë7ü…íûÿµ_µµø}ð4k?ð¸þùϤ¶m÷lIcwlœWî qbž¨ü‡ÄißOü?¨QEÊ~tQEQEQEQEQEQEQEÇüCG—À^4Ž9¤¶vÒ®€‘,‡ÊnFàFG¸"» ã¾!ÃÇ€¼k»ÌO¥]#mr§&H#êk:¿ :ðLJªüÏËOìM[þ‡/ß‹Oþ1Gö&­ÿC—ˆ?ïŧÿ¤ÿ„GBþæ¯ÿƒK¿þ;Gü":÷5üÝÿñÚøŽeý$V{ ¿òy¿Øš·ý^ ÿ¿ŸübìM[þ‡/ß‹Oþ1IÿŽ…ýÍ_ÿ·üvøDt/îjÿø5»ÿã´s/é ö;äòÿ!±5oú¼Aÿ~-?øÅØš·ý^ ÿ¿Ÿüb“þ ûš¿þ nÿøíðˆè_ÜÕÿðkwÿÇhæ_ÒAì*vÿÉåþBÿbjßô9xƒþüZñŠ?±5oú¼Aÿ~-?øÅ'ü":÷5üÝÿñÚ?áп¹«ÿàÖïÿŽÑÌ¿¤ƒØTíÿ“Ëü…þÄÕ¿èrñýø´ÿãbjßô9xƒþüZñŠOøDt/îjÿø5»ÿã´Â#¡sWÿÁ­ßÿ£™I°©Ûÿ'—ù ý‰«ÐåâûñiÿÆ(þÄÕ¿èrñýø´ÿãŸðˆè_ÜÕÿðkwÿÇhÿ„GBþæ¯ÿƒ[¿þ;G2þ’aS·þO/òûVÿ¡ËÄ÷âÓÿŒWèGà øŠ_øJDøŸã[dkˆ-tݨ6ôµ'ó&¿=¿áп¹«ÿàÖïÿŽ×è߆>¹ð'„§“þ#ØDÇoˆ5ÛØ ð? örfœß¡ùŸ‰ôä°´ù—Úþfú>èîÿáñ/ýoÿà.™ÿÈ”Ââ_ú*Þ9ÿÀ]3ÿ‘*øU^õñgþZÿ£þWƒý|Yÿ…£ÿÇëèÅ ÿáñ/ýoÿà.™ÿÈ”Ââ_ú*Þ9ÿÀ]3ÿ‘*øU^õñgþZÿ£þWƒý|Yÿ…£ÿÇèøCüKÿE[Ç?ø ¦ò%ð‡ø—þŠ·ŽðLÿäJƒþWƒý|Yÿ…£ÿÇèÿ…Uàÿ_áE¨ÿñúŸþÿÿÑVñÏþéŸü‰Gü!þ%ÿ¢­ãŸüÓ?ù ÿ…Uàÿ_áE¨ÿñú?áUx?×ÅŸøQj?ü~€'ÿ„?Ä¿ôU¼sÿ€ºgÿ"Qÿ‰è«xçÿtÏþD¨?áUx?×ÅŸøQj?ü~øU^õñgþZÿ åßöÁý¹tŸÙßö‰øðó]Ò|]â+]:_U¼¼[›®¯gImÚ(`·ò·ºÈ.3X·E"J6<ãÆðQxž.ñÞ½ xäøfÆÃ@Õ´¸íïtéu-rÇR´†çÏKA™„JÈÅÎÖ’'@Û¸¨þ;ðæ•Žf Q韷—†uOúV›á?‰³Ýê:–¥`‘›½eD´µŽéÙc-¾Y¼¹6XÃN“/”ȃ_~ÿ`é¿õÿÀûþ.ý…§sΧÏ_ôûþ.™¯Õë7âÏͯÿÁEüâo i¾8·Ò|i¤iwñ¾šn¥y¦[j—2éû4P¸ŒÈò237DÉÕ[]×í»dúgŽo4=TÖ5­Ásø°hÛšZÞÜÉm©Ocym•FEX¼4MÊf2#c_rÿ`i½?âcúÿ¸ÿâéN…§0 L‚6ÿÇýÇOO¿E˜ý…nÿ‹>øyûrØ|FŸáÄ–^ ñ¿†ô]wÄ2øvêÿVÕ´˜ Òî>dj)K‰\‡_³£yªÊÒX ûôé·à|C«ÿ\­ÿøÕ`øgáÇ‚< é¾ð‡íü-á›$1Ùéú|ÒÛÛZ¡bÅR4`ª73ÔšÜÿ„Kþî¡ÿ×ü]4™t¨ÔKÞ׿ÇfßÿÐū߻þ5Uî´ëÿ%ü$:±éÿ,íÿøÕMÿþ—ýÝCÿ®?øº¯uáý,BÇmÿoù~Ÿÿ‹¦¯s» {hiÕu}ý ¿ìûïúêŸ÷îþ7Gö}÷ýõOû÷ÿ¦ÿ`éŸÜ¾ÿÀÙÿøº?°tÏî_àlÿü]ocï=œûäÒÿ!ßÙ÷ßôÕ?ïÜünìûïúêŸ÷îþ7MþÁÓ?¹}ÿ³ÿñt`éŸÜ¾ÿÀÙÿøº,Î}¿òiïìûïúêŸ÷îþ7Gö}÷ýõOû÷ÿ¦ÿ`éŸÜ¾ÿÀÙÿøº?°tÏî_àlÿü]g>ßù4¿Èwö}÷ýõOû÷ÿ£û>ûþƒú§ýûƒÿÓ°tÏî_àlÿü]Ø:g÷/¿ð6þ.‹³Ÿoüš_äz¿ÀÛÈþ1ü3wÖµÐkä£G ót8ŒÈ×î ~| Ñ´ø>2|3š5¼óY·#uÜÌ3»Ð¶ã_¸uÅŠÝ’x‰±ïü½ÛëæQEsž…Q@Q@Q@Q@Q@Q@Q@qÿÝâð$Ž.]t«¢#B9ò›¸“î@®Â¹?È‘âÿû\ÿ覬êü,ìËÿÞ!ê¿3ò¿ûoVÿ¡7Ä÷þÓÿÑý·«ЛâûÿiÿÇ뤢¾™v?­=Œ¿þäsÛz·ý ¾ ÿ¿öŸü~í½[þ„ßßûOþ?]%s.Áìeüïðÿ#›þÛÕ¿èMñýÿ´ÿãômêßô&øƒþÿÚñúé(£™vc/ç‡ùßöÞ­ÿBoˆ?ïý§ÿ£ûoVÿ¡7Ä÷þÓÿ×IE˰{;ü?Èæÿ¶õoú|Aÿí?øýÛz·ý ¾ ÿ¿öŸü~ºJ(æ]ƒØËùßáþG7ý·«ЛâûÿiÿÇèþÛÕ¿èMñýÿ´ÿãõÒQG2ìÆ_Îÿò9¿í½[þ„ßßûOþ?_¡9ÿÀ­3ÿ’ë¿¢¾ü<à?á0ñ/ýŸÿàV™ÿÉtÂaâ_ú%>9ÿÀ­3ÿ’ë¿¢€8øL{ðq)ÄŠå´¯ÿè^Õ¿ïí¿ÿ¯Føÿ#÷Žì3}ÿ£Þ¹ï[«ÐƒäZôòÿ#ûJÿþ…í[þþÛÿñÚ?´¯ÿè^Õ¿ïí¿ÿ­Š)šò>ïðÿ#ûJÿþ…í[þþÛÿñÚ?´¯ÿè^Õ¿ïí¿ÿ­Š(GÝþäcÿi_ÿн«ßÛþ;Gö•ÿý Ú·ýý·ÿãµ±EÈû¿ÃüŒí+ÿúµoûûoÿÇhþÒ¿ÿ¡{Vÿ¿¶ÿüv¶( 9wø‘ý¥ÿBö­ÿmÿøíWºÔoÌ-ÿö¬9òÖßÿŽ×A\ߌa×î|)â; ^éúoŠd²4Ë‹¸ÌAvPˆžE²‡ÚHî¡ntààý¬u{®Ýý ßí ïújŸ÷òþ9Gö…÷ý5Oûùÿ¯ÍÀÿðPÝ_ÅÞ,ð–½ña´ŸÊ–Ú¸k"‡Q˜j ŠXôèÞk˜›ìÒí†4U`!˜’ÃÔ'ð_í£öMgû+ĺ5…õÇ…´{în¼U ÍÄz…½äw$ñ(X#’âÞM¾{E"«Æ¿¹ÆÓ˜úøâdÕí/¹‘ö·ö…÷ý5Oûùÿ¥þоÿ¡Uÿ¿ñÊüòñÂÛËľñ7‡uߌZtŸÚ7º<ŸhмAqemͳ^Em2iNñ ˆVå~bìãÃ*†SêËàŸÚbßYWÙ¦“kñ:-~ÊKÜ$§Ã_gò¤³‘#° !È,°¹uù2–]äæe*òoi}Ëü­¿´/¿èªßÈ?øåÚßôÕ?ïäür¾ ´øqû|èºÿmtόּcâ b}uõ‹˜g¿×4égÝh±ºX"Ûâ&1$e|9’DÄb-;á÷ü*ÖÛáâ¿Æ/ÜÞ[øOQƒÄFþkiÖó_xæX%ˆÃ¦EˆQ¼†Q´mù·¬»q#æd¬LûKî^_çø3ïí ïújŸ÷òþ9Gö…÷ý5Oûùÿ¯†5†ÿ¶µö•ã›Eø–ß¿ðtVRxŽÆ7[7™..&‡EVÀ… Pñ ŠOÝ):s±x[öíñ®§ñÂi|q¨xHƒÄÖOá‹}e —±Ie,ÐÛÜÿf¾Ûg_·D%&y3cˆ+o.%Ò_rÿ#õ{àmõäŸþ£èºŒu‹p]¤„…ùºœHOä+÷¿þ›£ñOáQ¾Hã¾þÒ´ó•z¬œn°»†sÎzàt¯ÛŠäÅnÌôû¥,Ã>7u·wÇþC§õzßÊþàþÙË?çü?ð5þfößô3ø§þÿEÿÆèþÀ›þ†ÿßè¿øÝ2ÓÅ6÷ºÞ™acâ+íKL’8u+xt»‡—N‘ãY&P™‰š7W€%YXpA­/·Ý|§þ¯`Œø‘Ýò?ïß±£êõ¿•ýÁý³–ÏøàküÊØÐÏâŸûýÿ£ûoúüSÿ¢ÿãu}ïî“q xÙãvt;±Œôÿ–uήöv÷wšŒ--!ŒÍ,²è×H‘FK³ðª''Ž(ú½oåplåŸóþøÿ2¯ößô3ø§þÿEÿÆèþÀ›þ†ÿßè¿øÝO´&Ž9¢Ñ<],N¡Ñ×Gº*êFAGÈ#½?û]ÿèãüÝñº_W­ü¯î휳þÃÿ_æUþÀ›þ†ÿßè¿øÝ~‚ü9ðUäÞð”«ãÿÀ­a³Ûá~^ƒ0×ÀŸÚïÿ@ÿà–ëÿ×Û>øßà-Á¾Òõ#âûkû{8âš?øGuØÀr2! þëåªFo5§cóŸ1ØJ¸jkR2j]$ŸGæÏVÿ„ûþŠ'ÄûÿoÿÆhÿ„ûþŠ'ÄûÿoÿÆk•ÿ†økÿ?.ÿÂoQÿãÃ@ü5ÿŸá7¨ÿñŠ÷ÏÇN«þkïú(Ÿ?ïý¿ÿ£þkïú(Ÿ?ïý¿ÿ®Wþá¯üüx»ÿ ½GÿŒQÿ ð×þ~<]ÿ„Þ£ÿÆ(ªÿ„ûþŠ'ÄûÿoÿÆhÿ„ûþŠ'ÄûÿoÿÆk•ÿ†økÿ?.ÿÂoQÿãÃ@ü5ÿŸá7¨ÿñŠê¿á¾ÿ¢‰ñþÿÛÿñš?á¾ÿ¢‰ñþÿÛÿñšåá ~ÿÏÇ‹¿ð›ÔøÅðÐ? çãÅßøMê?üb€:¯øA¯¿è¢|@ÿ¿öÿüføA¯¿è¢|@ÿ¿öÿüf¹_øh†¿óñâïü&õþ1Gü4Ã_ùøñwþzÿ ÉßhòÇã¯ÆuÿÊWW¼]Ï,e›¿' Ö¹Oì™?è7®ÿßÔÿâ+Ѽa¯ªx»Åz¥…üa=Χuq ÿdÜ ñ¼¬ÊpS# ޵Îdø‹þ…/àªþ&»T—sôÊ8¼7"¼×ßÿç?²dÿ Þ»ÿSÿˆ£û&Oú ë¿÷õ?øŠèÿ²|EÿB—Œ?ðU?ÿGöOˆ¿èRñ‡þ §ÿâió.æŸ\Ã:ûÿàœçöLŸô×ïêñdÉÿA½wþþ§ÿ]öOˆ¿èRñ‡þ §ÿâhþÉñý ^0ÿÁTÿüM˸}s üëïÿ‚sŸÙ2Ðo]ÿ¿©ÿÄQý“'ýõßûúŸüEtÙ>"ÿ¡KÆø*Ÿÿ‰£û'Ä_ô)xÃÿSÿñ4s.áõÌ7ó¯¿þ ÎdÉÿA½wþþ§ÿGöLŸô×ïêñÑÿdø‹þ…/àªþ&ìŸÐ¥ãüOÿÄÑÌ»‡×0ßξÿø'9ý“'ýõßûúŸüESÔ,µÅÌúî¶F¦Gf‘0ª9'îvºÿìŸÐ¥ãüOÿÄÕKÃþ ¾±º² øà$¨ccŸu€F W@£)A…%}ÎŒ&7 ªÅ¹­×_ø'Ë~Ðÿf°°¿í#k¯ 7‹í­^áVê}c–Ct°˜÷•ÙÇÜ|§ãå8žÿãÿÀÍ"ã[´Ö¾4Yh—n…câ]@^N![M2ì…¶¸fhöâF!@¶X dŒËiûü/²µÓìí¾üXHí,³-µ}¥‚ØG{dk‚ã ¨Þ¨9È ‚0¸³®þÆß ¼M¡ kŸ þ(jÑ-<;-«j:ØK« i –ñ͉¿~Ñm’Iº@¨m§|˺>¥fÔ-üZwÿü3Wý¢gÍÞgö€ð¾›öd²’7Tˆ–ëoÙ³òu—zmItË Ï'ÇÏÖ×ÖºmÿÆ?I¾¸Ö®<=kåÚ@nõR'–÷ ÜUgˆ’8ÃŽkCþïáÒÛ%•¯Â¯Šzfž—v:„V¶Zž¹k½Í©ŒÁ4qÅ:¬n™™@.Ñ«>â3\÷‰ÿbø¯Æú/uüaq³}¯j:\·•Å–¹yqn1™&f)¤h0˜â`ª®ŽªªeÝÍèÏÚøüоxïÀ¿4;ü9ñýß‹4(¯n4énmÛj¥Ì.c–20r¬¥4ÇsSÊí$žRLY`Fvfòâ›™ˆ\“]öŠèNñþ çÿâj”£Üê§›`¹W=h_ÊküÎcû2Oú k_÷ñ?øŠ?³$ÿ Æµÿÿˆ®ŸûÅ?ô'xÇÿsÿñ4`x§þ„ïÿà®þ&Ÿ4;—ý­€ÿŸÑÿÀ×ùoÀÝ=ãøÇðÎCªjÒ…ÖmÎב ·ÍÐüµû_Œ´_AñsáÌ×>ñM¬ «Û—–]:dDº–+€=Í~Ï×!«è~[Ǹš5kÓt$¤­ÑߨQEÎ|QEQEQEQEQEQEøëûKÿÁ)¼9ûG|føÓñ·Vñˆ´/x‹AµÑ |;ø“'ÄÿŒÞ"ñ‡µ 2þ3w«!K¡h4Å0iÛºióǃ¸„Ô®FOVôÿþÉmào–ÿ¢ñ‡Äí_Y‹TÔïÓMŸRmD—ÕÄ–˜cË«¡ÎÜŸìÛSÛåûÐуèhþÙ­äñ ²Ïï}ÿðÉk/ø&¶·kci¦?íûBI¦Å¥øŸKH#Ô¡‰bMZc2!î2Eæ³–‘¤22§1ì\z©û[?Œ4x_âÇOèšwŒ4ÿiš ®½Yiv6èÌt¨Gš¬±5Ì·7F,Ên=¬Š€~“àú0} Û5¼…ÿË,þ÷ßÿø'Ÿ±ž•à]köP×<«xËÃ÷¿ ÒêrÅqlÒüAžXcŽIïݤ Èþ_.DŽŠ# ¯*Õ¿a_ˆG⟉t_ŠG‚u?êÞ0ñ5¤ºè†cg<"H´¨QKùñýº†’IcÚ–b$l² ýKÁô4`ú?¶kyþ!–Yýï¿þùÿð+ö3¹ø ñáï´OüLñF— Bñ¦«]Á<.íc ¼²Äí)0<ÒFóÌ@1åÇË·-ãzÇüVçÄgö·ñÏ㎡á‡Ô|Uy>˜×Ð y¡Ö-â‰á`f,æ?-‰iLÖiSb)ýdÁô4`ú?¶kyüC,³ûßüžð Þ¯à_x'ÀñøY¯ãÑt{-%gŽæ uœA DF„`ìÎÝÇÆMuŸðšë_ô&\àÆ©ƒèhÁô4lÖòø†Yg÷¾ÿø¿øMu¯ú.?ðc zîàŸ‰úî•§ë6> °ûÌK4[õˆƒm###i¯Áô5ú;ðËþIìþƒ^–[Ž©VMLø~9á,&]B0÷»vÕß§¡òçü+?‹_ô%éŸø9ÿˆ£þŸÅ¯úôÏüÇÿÄWÛ´W²~b|Eÿ Ïâ×ý zgþcÿâ(ÿ…gñkþ„½3ÿ1ÿñöíñü+?‹_ô%éŸø9ÿˆ£þŸÅ¯úôÏüÇÿÄWÛ´PÄ_ð¬þ-З¦àæ?þ"øV¿èKÓ?ðsÿ_nÑ@³øµÿB^™ÿƒ˜ÿøŠ?áYüZÿ¡/LÿÁÌüE}»E~Jêߧѵ]OG½ð^§öËK‰-fÙ{.ôb­ƒžFA¬ÿø]‹ÿB^±ÿpqÿÂ}ãžü†o¿ô{×#ƒèk©QGÞÒáÌ;Šnÿyì¿ð»þ„½cÿàÿ?áv/ý zÇþÁþ5ãX>†ŒCOØ¢ÿÕ¬7ŸÞ{/ü.Åÿ¡/XÿÀ¸?Æø]‹ÿB^±ÿpxÖ¡£ÐÑìP«Xo?¼ö_ø]‹ÿB^±ÿpð»þ„½cÿàÿñ¬CF¡£Ø ÿV°Þyì¿ð»þ„½cÿàÿ?áv/ý zÇþÁþ5ãX>†ŒCG±Aþ­a¼þóÙáv/ý zÇþÁþ4ÇøßjY¼¬cþ¿ ÿñÜC\ÿŠíõ›¯ ëöÞ¹µ±ñ¶sGa=Àc7%ßoÍ´1ãœ(TQ¶…𲩻ê×Sß?á{BrG‚õ“ÿop'ü/x?èLÖ?ð2ñ¯Åíö]ý¬u« ·Å¿ÒêÞ)Ó<â] cEñV¥jcÕ/e—ìZƒ[%´qÜIo G’F ïPHæÞ©ð+öòºº×ŸJý¤4=#FŸÂÖº^Ÿ§.«pò麔rÀ^èÞ>žÏ3²G12˜Á>~ÃUVì#Ø÷àíwNzÿ/ó?e¿á{ÁÿBf±ÿ(øí 8 ÖIÿ¯¸?Æ¿þ |ýµ5h<|>~Òï໋­GJ“B7š´—ÂÏOŠÍcº…÷X.W¸_;Íhu-$`œó~'ýžÿnÿEãí?Qý¡ü>‰}â{m_G¶¶Ôol œr‡6ï$v'•„Oôum¬]ÿx cØG³ pN ˹ýëúÿ‡?iÿá{ÁÿBf±ÿð½¡ëÿ^±úüƒükò;Â??m 9ô©|+øõá/ˆoо |T¸ñÞ…?†¢ÓoìeÕ®vW±Ü\ȲEoäùs¹ŠX#{†xܘŠ6ñ·êÌCT°ñ:©pJíI|×ù\ü,øÉ³ñ#ÁHð¦«hnu(bµÔ,#Éê@9?…~£WâÁ áoü6àÿÈbßÿB¯Úêç¯MEè|ät05¡ ³W×Ô(¢ŠÀøð¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢¿jOÙÿþ 1­þÕ¾6~ÏŸõ­+ÀZG†í¿áðmíÌÒi>.Ö :šOðù« ¾k|çBìÖñªº'›?h_ðSË…~?ñ|áMSâ´wÞðîŸk 1\X*Y>ªÏ9œÆ.$/jα#E UƒPî}qßáŽãÀ^4‚`Z'Ò®•€b¤ƒg‘Èü+ùñž×þ t¶w_føCð…ïd´ðôˆd{p¶“´ñ3‰TOûí³ãçgŒƒƒ¶ÒzÏ~ÿ‚ j²sXh6¶øÓ©_ë‰âIìÒÞÊ/è§í"ËìòÍ/–v¢Û´Ò’ÒâGÚ„‚Í]4m‡©ÉR3µìÓ>˜ÿ„WÃÿóíwÿ×ürøEtù÷»ÿÀûþ9_‘šŽ¯ÿ&—Pñ§‰-<û9ÛÜ%ž¯aá­&КÑ]î´Æ´ººf`ehâ’.6åBo ì zgÆ+OÛ¼wàïü±øŸ‚í­áû‰lŸqâFÒµ=Y&o–ïÌ+DArP¹dF)àÿd?ùùý}çëßñãÿ@ÿj~“ÿÂ+ ϽßþÜñÊ?áÐ?çÞïÿî?øå~vxQý¸&ñç€/<¤þÉ–Ÿ~ß§/ˆlm4›<ÙìÅ»dJ̲.¬à&áºÖÝW*ùi¼S«~Û¶~)¸ÿ„?Ãÿ²&·áYÿá,š!y§YÂö!..“Dˆ3³À¶r3à2YÒQªd?ùùý}áÿ?ôøÿö§èoü"ºüûÝÿà}Çÿ£þ]þ}îÿð>ãÿŽWæ³Mûnø›ÄW}Ö‰û4x7Âqÿc\išƒÁbnÖP©ö£w´ÛeÚÆo2Ì,¢!·ÏTÄ¿ðP‰üëGá×ìy§ÁqáëkÆ´ÓÆy´íFMDyöqI<ˆ³M ™`’HÞGPÅ”ü´d?ùùý}áÿ?ôøÿö§éÇü"ºüûÝÿà}Çÿ£þ]þ}îÿð>ãÿŽWæ¶™ðûöª±Õ¿eVÓÇ¿ M7áÖ•¡üB·Õ…í­Æ¼d¨^²©Ss)Xc%¬Ҳ “ži5_ø(þ£¡4§Cý¼7­GhÌ‘>•¦N×7_f””|LQ#+ÆÊK$V“lÔÙþ~_xÄGýþ?ý©úÿ®ÿ>÷øqÿÇ(ÿ„W@ÿŸ{¿ü¸ÿã•ð_íí!â[VÐ>é~ÊpkúOã¤~ÒòøZñå´ó§ÛÞËK+z¦îä«¡´ÎWÉ6ø*0Èl};çüÿŸO‡ßøÿGöCÿŸŸ×Þñãÿ@ÿjbÿÂ+ ϽßþÜñÊýøsð×Â>ð•Ä–š·˜ö1Û«]¾‚\ øSÏø'ÿ>Ÿ¿ð þ"¶ ²øi41Ëm¡xn[v£G¥‚¬=ˆLb»p8'JM¹\ù^+⥣j‡³³½ï¾žˆýÿ…]àßùôÖðoyÿÇhÿ…]àßùôÖðoyÿÇkóóû;áßý úþ ¿û ?³¾ÿп ÿà«ÿ°¯LøSôþwƒçÓYÿÁ½çÿ£þwƒçÓYÿÁ½çÿ¯ÏÏìï‡ô/è?ø*ÿì(þÎøwÿBþƒÿ‚¯þ€?@ÿáWx7þ}5ŸüÞñÚ?áWx7þ}5ŸüÞñÚüüþÎøwÿBþƒÿ‚¯þÂìï‡ô/è?ø*ÿì(ôþwƒçÓYÿÁ½çÿ£þwƒçÓYÿÁ½çÿ¯ÏÏìï‡ô/è?ø*ÿì(þÎøwÿBþƒÿ‚¯þ€?@ÿáWx7þ}5ŸüÞñÚ?áWx7þ}5ŸüÞñÚüüþÎøwÿBþƒÿ‚¯þÂìï‡ô/è?ø*ÿì(ç_x{F‡Ç^5†8.4ÕïA»˜î%òå?°´Ÿùã?þKÿÅWÑó^|ŽYc¸‡á¤w Å]d´€2°<‚ äúÔnøÿ<þÿà-¿ÿ[ª¾GÖÈ"¢—²þ¾ãçOì-'þxÏÿRÿñTai?óÆü —ÿН¢þÝðþyü/ÿÀ[þ&·|ÿž ÿðßÿ‰§í|ŠÿX£ÿ>¯¸ùÓû Iÿž3ÿàT¿üUØZOüñŸÿ¥ÿâ«è¿·|ÿž ÿðßÿ‰£íßçŸÂÿü·ÿâhö¾Aþ±Gþ|ÿ_qó§ö“ÿûu·ÿâhU¼hq,c5/c{?ë¡ò¿ö6—ÿ<¦ÿÀ™øª?±´¿ùå7þËÿÅWÔÿÚ³ÿ§ÂÏü¶ÿâhþÓýŸý>à-·ÿZ{uØú/õò?ô øÿö§ËØÚ_üò›ÿeÿâ¨þÆÒÿç”ßø/ÿ_SÿiþÏþŸ ?ðÛÿ‰£ûOöôøYÿ€¶ßüMÝvõò?ô øÿö§ËØÚ_üò›ÿeÿâ¨þÆÒÿç”ßø/ÿ_SÿiþÏþŸ ?ðÛÿ‰£ûOöôøYÿ€¶ßüMÝvõò?ô øÿö§ËØÚ_üò›ÿeÿâ¨þÆÒÿç”ßø/ÿ_SÿiþÏþŸ ?ðÛÿ‰£ûOöôøYÿ€¶ßüMÝvõò?ô øÿö§–| Ò´è¾1ü3–8å.³nW7wzÁ¯Ü*üÊøaðNOˆž M|9þØ:Œ"ÛìÖÐ,¾fxÚBä¥~šÖgÌö±ñÜKœ¬mHÍSä²·¯à‚Š(¬š (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ äüxHðG‹È8?Ù—?ú)«¬®?âÊþñ¢Á*C9Ò®‚;&ð­å6 úd}k:¿ ;2ÿ÷ˆz¯ÌüÚó$ÿžùÑæIÿ=ó®cì>+ÿ¡“EÿÁKÿòEañ_ý š/þ _ÿ’+á¹WÌþ´öóþGÿ’ÿ™Óù’ÏGüèó$ÿžù×1öÿÐÉ¢ÿà¥ÿù"°ø¯þ†Mÿ/ÿÉr®ÿ˜{yÿ#ÿÉÌéüÉ?ç£þty’ÏGüë˜ûŠÿèdÑðRÿü‘GØ|WÿC&‹ÿ‚—ÿäŠ9WÌ=¼ÿ‘ÿä¿ætþdŸóÑÿ:<É?ç£þuÌ}‡Åô2h¿ø)þH£ì>+ÿ¡“EÿÁKÿòE«¿æÞÈÿò_ó:2OùèÿdŸóÑÿ:æ>Ãâ¿ú4_ü¿ÿ$QöÿÐÉ¢ÿà¥ÿù"ŽUßóo?äù/ù?™'üôÎ2Oùèÿsañ_ý š/þ _ÿ’(ûŠÿèdÑðRÿü‘G*ïù‡·Ÿò?ü—üὈþz?ç_£Ÿ ‰?¼I$ÿgÃ×ýÚü¼ûŠÿèdÑðRÿü‘_ ŸtŸ‰mà? 5·Ž<'Â-Šþ‘™FÞ„ý¬gò¯k%^ûסùŠu%,%;ů{˳ìÙïWÿcüQÿ¡ïÁÿøNKÿÉ”cüQÿ¡ïÁÿøNKÿÉ•ôgáç¢Q^wýñGþ‡¿ÿá9/ÿ&QýñGþ‡¿ÿá9/ÿ&P¢Q^wýñGþ‡¿ÿá9/ÿ&QýñGþ‡¿ÿá9/ÿ&P¢Q^wýñGþ‡¿ÿá9/ÿ&QýñGþ‡¿ÿá9/ÿ&P¢Q^wýñGþ‡¿ÿá9/ÿ&QýñGþ‡¿ÿá9/ÿ&PäŸÄsãïìOöÍ÷únõÈïï7çZ<´ññÏDÚî—,ÃW¼˦²†o=ò@óŽ>™?Zå>˯ÐkNÿÀÿãµÞ¶?W¡7È´éåþfÞ÷þó~toï7çXŸe׿è5§àñÚ>˯ÐkNÿÀÿã´Íyßgø™·½ÿ¼ßßûÍùÖ'Ùuïú ißøßüv²ëßôÓ¿ð¿øíÎû?ÃüͽïýæüèÞÿÞoα>˯ÐkNÿÀÿã´}—^ÿ Öÿ€ ÿÇhwÙþæmïï7çF÷þó~u‰ö]{þƒZwþ7ÿ£ìº÷ý´ïüoþ;@s¾Ïðÿ3o{ÿy¿:­vïä7ÌÝGzÍû.½ÿA­;ÿÿŽÕ{«]wÉlë:qòàßüv„õ:pU¶†uÛ¿¨ýïýæüèÞÿÞoαþÏ­Ð[OÿÀÿã´}ŸZÿ ¶Ÿÿ€-ÿÇk{Ÿ{í¥ü¯ðÿ3c{ÿy¿:7¿÷›ó¬³ë_ôÓÿð¿øígÖ¿è-§ÿà ñÚ.Ú_Êÿó67¿÷›ó£{ÿy¿:Çû>µÿAm?ÿ[ÿŽÑö}kþ‚Úþ·ÿ¢áí¥ü¯ðÿ3c{ÿy¿:7¿÷›ó¬³ë_ôÓÿð¿øígÖ¿è-§ÿà ñÚ.Ú_Êÿó=§à“1ø¿ðß,ßò·ïþÕ~Ö×áïÀØ5eøÇðͦÔ줈k6å•lÊ–ºgÌ8ü~áW+t~Eâ4›ÄSº·»åßÈ(¢Šå?: (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ äüyÿ"G‹ÿìsÿ¢šºÊæ¼eiy¨xGÅ:u¬—×ói÷C ²«K!‚¨,B‚O$R**«Å£«5ð”¶M~gæeÝÿ¦ø½ÿDË[ÿÁŽÿÉ4¦ø½ÿDÏ[ÿÁŽÿÉ5ñ¿Q­ü¬þœÿ[²Ïùÿ¼á(®ïþ7Åïú&zßþ tïþI£þ7Åïú&zßþ tïþI£ê5¿•‡úÝ–Ïøýç Ewð©¾/Ñ3Öÿðc§òMð©¾/Ñ3Öÿðc§òMQ­ü¬?Öì³þÇï8J+»ÿ…Mñ{þ‰ž·ÿƒ;ÿ’hÿ…Mñ{þ‰ž·ÿƒ;ÿ’húoåaþ·eŸóþ?yÂQ]ßü*o‹ßôLõ¿üéßü“Gü*o‹ßôLõ¿üéßü“GÔk+õ»,ÿŸñûΊîÿáS|^ÿ¢g­ÿàÇNÿäš?áS|^ÿ¢g­ÿàÇNÿäš>£[ùX­ÙgüÿÞp•ú=ðÇþIìþƒ_¦ø½ÿDÏ[ÿÁŽÿÉ5õσu¿hðþ‰}ð¯Ç-ykk2˜îtÂ¥€ÁÁû_"½l£8M¹«h~uâ>w„Åa©ÃQI©_GäÏd¢¸øL¼AÿD«Çÿ÷ÿLÿäÊ?á2ñý¯ÿßý3ÿ“+ß?;ú+€ÿ„ËÄôJ¼ÿôÏþL£þ/Ñ*ñÿýÿÓ?ù2€;ú+€ÿ„ËÄôJ¼ÿôÏþL£þ/Ñ*ñÿýÿÓ?ù2€;ú+€ÿ„ËÄôJ¼ÿôÏþL£þ/Ñ*ñÿýÿÓ?ù2€;ú+€ÿ„ËÄôJ¼ÿôÏþL£þ/Ñ*ñÿýÿÓ?ù2€?#> ÈýãŸû ßè÷®F¾†ñWÀOúÏŠ|K¬Ùü3ÔÅÞ¡suýON åfhààŠÁÿ†qøñÿDÒûÿºÿ$Wb¨¬~—G5Ã($æ¶<^ŠöøgôM/¿ðk§ÿòEðÎ??èš_à×OÿäŠ~Ñw5þÖÃ:<^ŠöøgôM/¿ðk§ÿòEðÎ??èš_à×OÿäŠ=¢îÚØoçG‹Ñ^Ñÿ ãñãþ‰¥÷þ tÿþH£þÇãÇýKïüéÿü‘G´]Ãû[ üèñz+Ú?áœ~<Ñ4¾ÿÁ®ŸÿÉÃ8üxÿ¢i}ÿƒ]?ÿ’(ö‹¸ka¿/U®ÿÔ7ÔW¸ÿÃ8üxÿ¢i}ÿƒ]?ÿ’*ÿfïRDÈ¿ /sïªéÿü‘MT÷7ÂgUV-Ô[£çÚ+Üÿá™~?Ñ4»ÿÁ®ŸÿÉÃ2ü~ÿ¢iwÿƒ]?ÿ’+omçÚ¬ùüþÞxeîðÌ¿¿èš]ÿà×OÿäŠ?á™~?Ñ4»ÿÁ®ŸÿÉ{h÷õŸ/ÿŸÑûÏ ¢½Ïþ—ã÷ýK¿üéÿü‘Gü3/Çïú&—ø5Óÿù"máþ³åÿóú?yá”W¹ÿÃ2ü~ÿ¢iwÿƒ]?ÿ’(ÿ†eøýÿDÒïÿºÿ$Qí£Ü?Ö|¿þGï9ß‚_òWþØbßÿB¯Úúü±øUû>üjð÷įëºß€.tý"ÓR†{™Î¥dâ(Á嶤ÅÐkõ:¸ñ2Mè~_Ç™… ExJ„”’]=BŠ(®sáŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÿÙsyncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/SySync diagram_plugin_small.jpg0000644000373300037200000033245712424517753035706 0ustar00nightlyallusers00000000000000ÿØÿàJFIF––ÿá6ŠExifMM*bj(1r2‡i¤Ð––Adobe Photoshop CS Macintosh2007:07:13 13:02:02  ' ,&(.5THHÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I)$²2qñh~FM¬¢ŠÆë-±Á­hñsÝíjJJ¨õ·Ó:ac2ï ºßæqØ×[}Ÿñ8´6Ì‹vþvʽ‹¨uN¿ÔñmwF¬àÐãSîhnVAiµâÕxôºuy-k««/>«ný'ô ÿMÓOFÅé®ê˜Cn=Õ‹ò]ºÛÞÖ‡XÿµZóv]÷ÓúJý+ÿMÿ¡T¹ˆcÆ*Ý•ðú~XËÆI´þ¯×òÏêxUôúŒEÙîõ-ˆ—“ðŸ·þÞê8öÀ žŸÔ2#íý[.î¿ì}‘ŸnÛý|û;~°ÝxôŒ+2²‹CÝ¿o£^æ—µ—dÓcè{Üæú? ½þŸñOS8?YsNìœÚ°j1ñªõ$n­Ößiß¿nÏæmÿÒk?/7ÍKæÈ0ÝŽ‡þoEÔ» t§‘AÉ’ì»mÈÔ­læ]wÒwµfgô¯«x½oÕÀÀª§âf–UKûüGùÆµŽ±»­Ùÿ]Væíº›ºRÊÈv3ªÈ½ÁµîÅý'«èÙ»Ûþ÷îÿ®Ö£×*¦îµÓ[mlµŸfÍ!¯k^ߥÓáÀ<9ªvBVrO'¦w¬¿súË¡)ínm?-´Vѱ2Ö±÷eôëYF¿¡vE5U‰f5Ž»)”Ûêƒúÿ„°Ì³„ÌwåeõNvKò=WeÔÓk­f>1ýªÌÛ}}•~—Ò¦­}_Ízõ1C'¦}^cE™XxUµÇh±õVÏtǪ;Ö;ó’§Ö¹Ý#7.†ÔvŸFÛ_WýnޤܬK©ÓùÌzý/øDèó¤ $üÑâàÿ ×8ÿãlÇ•–ÀÄ—W§}bê·4œK°úíM–×» & j¿s+¼äce~ƒ&ÏÀ§{Ö¶Ö>›“Ü;‹ðsŸ;pòÛéXèŸèî—cæ}ûE~Jãò:m–rñ1ú‹víõqç( ú@»§äÚßåY‚šœœ›v ëTwIêM5æ5¬aÛk«¹—ý¯ôŸf«íx¾­¡õ™ëåZûUÜ?‘ê3¿èOíÿÕ˜±°O£ó?'Ñ’\gEêùË:]ç6ºœ[‘Ѳì?j¤4þ—ìyy[-µÌõ+kñóm¯êÿ´q½5ÓôΫ‡Õ1ý|WiÙm64²Úž>•9Y¶Êmþ¿üe¢Z8³Ã-ðGÍ i8ýMÄ’IH…$’I)ÿÐõT’CÉȣܜ‡Šè¡Ž²ÛÃZѽïwõZR£Ôqzf+²²œC c ž÷¸íªŠ*o¾Û­²ºØ±N-ýFúsº»@}õ10$:¬w~eÖÇèòºƒÓ1‡üÞø\¼…Šr:•ìêÙÔº‡Á–}*+pÛêÚÏÍê9Lþ{þâQú•ö®Ü‘uLž¡c†Kim·KmΟe¶ö‡5·5™¬­ûê®ö³þÕý*ÈçyÓ’GÃóä¿›¿øô×¾gZ®Œúº~5/ÎË{¿O]%¿¡g´ºÜ‡¼íc¶Ùú*¿ÂÿÁ¨Õ=7«œy?cêu¸ṵ̈ ™T7Ûµ•çTÇgUÿvªÏÿOZ®çáý]Ç«§ã ®£‘±­Ço±öÀw¾çµ¶ý—­eßdgôZš¯ÑÅ®ÛiÒÏÂgQÁ~=…Ô9ᯮÏϦÖݱÛ}\kØË>Ÿ¦ÿæÿ›T=1¡U iÄ~i¬àþªZ™¶u6Y^HÅWYe–Xöµ”œãëU‰uný_·óñlþwÿBfôwc×öϬL\ÏJÚ/õHª‹+ÈÜmmÆÇWSm¯sh§#¬?ÐUüßé=*j[Ö:þc,©¾ŸN·šrHß{ï¬MŒ¥ÙLû6=Îs‹cêͶÜ[©»ô ÆvPxËÄÂý)5šòóÈ·Šl±®¿1ïö{rhýOÒÞÌœKѲ›”‘‰Ž(LJæ®-{$¿{ý_<9yʉÐKXþ‘“¶Ú>£—ŸR×õ]­uqU7d׵쪻ð©u.{>Ïê1Þ§ôŒ¬«ö~“Ø\î«E½Kì|,Ñ‹‘IÆÁ´âz eN v͘¶,v³/öYÕºµ5ŸDÔöYw¸=öï­—ìfí–3ÔÙüÕöÞqÁèÄ®ë5·ôMŠÁ ­­{_nÍï§×Èý/鯲ÛYè'ðÆ{ÊrÂË—¦\<0‹,y~>¡Ð˜CW¨³­t‚Ð2½ZZ×µbÞÆ‡0‹+~û)ôGcw·Þ¡_JèÝ@SnM«»cq2‹ëc_êXÖ¾×b×e¢ÙG¡èÿ‚YßkÌÊ˽Ý/«a–¿cqñ½FØC@«Õ²ëföÞÏÏõoæ~C,d²æÙÕ:[o °œüY®Êý¯·%þ­v}·ÓÅÚÚëþkí_Û®•Ãä'(H‹áâõj?ÍÊ8{÷ÙŒoļ:7w¦áåb²Ó—”ìÛ­x"×H¶´2ºÛ[œö³ÝêÛfÏôŸðh}B¦gåctè‘C›™}­%¶TƸýš¼k™úL|Œëëþr›+·ìxù?é+TpºŽ`vÌ{šÆ‰8™¥µä‚?ž§5’ÛîÆšëÈfUWzV?Ò·¨2ßSÓ?O®ž¡Óò±îµõgd¸YÕceÕXí›+c.õ?V¦Š«ÃÅ»ô¸×U_©ôí±Fa8Hä‘ÔUJ#äâôñðzxx?ô¢Ò4­Òþ¯l¯´cWeٹᔚéë5ÔÛ3±Zï¦üšZÝ™Ô6¿ûWElËǯÕý¾ì´j-Ï¿6›®s1º†;X1úÝD Lšmþ‰sý½A¹v¿ÛEvo®ÏS'ì6ú>½u,ž•“éu7dÞëËÝE£cªö¹ßgeþ†Ö_m[}96~‡gÛ-·ÑûFJ¹™ƒ@Ƕ‡SëôÛK•†Á%…Ó¿¨tÆÃ¶\Ýï~F#éæ3Ô²šýVœÉñæ”%"?Íæ‡ãû¿ú­¯“ ˜tù ö7ª ÃeWölìxûF1; :};¨²ëâݵÞû?à®®œš®¢«Ë€Âêy/{0òri¯«b±×ôž¤H5ߎíîjmO»ÓÁÊǦ½Ì»#Öº¿Ö§âz˱éLu,1sê8Ù5¸Õ—Šâênh¥.s~ŸÒm”ÛþÊrú;Vß-Ì{ ‰PÉëå˜ÿ9êÿÐj‘Mä’IXCÿÑõUÍuÊ:¿\wHmu'ÓÉˤ>fAý&%o«óñ1³.×7f_Øëÿ´ù5­n¹Ôÿet¬ŒàÏVÚÚE_¿u…´âÓÿ]Ȳº÷.tê} ë¼›o¨ºÃ˜Âk»Ö°ú¹YTßQÐü‹œ÷û³üój—Ä3Œxø"YlXÞ0ý"Û˜Ž eÄz~ïï;X/ʲ¯Ù8Øî}ÝF«VKœY@{aî¢Ûª=–¾ŸVÍ–7Ó¿ù¯Ò~—ÓŸgúµ‚+Ãk²³óÑ]n;}{ÚÖVûöËYêú{_c?ŸÊôýïþvä^·Ô°Èfs]Ô1‰´ÒÐ2X ?Ò1+ÛVcßð¸^žGýѱnaæâgc·+ædPÿ£c ‰ZïήÖî÷ÖÿÒ1b’c+‹ܸO¦réÅû¿ÝfÇ–Àßæ<ÑV>/Õìggå»íW$zn{cÔºÇ]ؘM>ïMöï·Ñ¯þ±E¢ÆZ##;+ ¹Y­©§!Þ®3)ÜcÀ×ã2ýßK%¬wé}?Ñ©ät¾Ÿ•Ü›è^ÖŠÃ¥ÂZ×ŒŠ˜ö±Ím¾•íõ¨õ?™·ù¥Ö:ÍùÙ…ƒaªŠœY•–ÃsÆ–bâ=¿ÍúC+-¿Í?õ|oÓú¶ÐGëtý-ç9~ˆýسcÇ,’€²ÕëÙ4·«ïéa¹YNg¡Ôke,5ëvF[Ygë”î}Ä©¶äYgé=³Ò¨;#'ú~M—Í—cÓý]µ?í7èFUŸñi[~MÇe{[]u€*ǯkL5žÆ=ÌkYêYú[¬w§þšÅLÓÖsÚÖÙkq±ÞǶÑ[\Ç8º_mAÇí öúUäSe˜õ>Ñ_øEfÀè+N9|燳¯‹ qDc7šCôB<_ËôÛ$ôΙuôÒÊ٥㶹í¸ú«ßío¹þ¢!êØch~HcœCKLµÄ¹¾›w6·±Ì{,÷~Us:?Meøù9 ¦†ÝE¯îM[½*ÇÚ7¾”Ùgø_OÔþ{Ô±á6ô'ÛëYëÚïU÷˱ïØ^ñ]ræ³{k®ŠÛ^ïúïªõ ‡µ9X ¶^)#íŠÞòê߾Žûr]~=.,±öl±­p!¾›·oý&ç7Ú£Vic_Ó2,ÅiÌkêã}Í?e¼¾½Žÿº¯ÆÿŒUkoAÉÇwNĽ¸â×ïu5ŸNÒïäÕ–Íÿñ{+ýÊýOÓJÿÚ¸ºÁi»<ÛsíF:ÇŸA­už»îÙc›ú¦ÿÙÔWOô¤¸FÈ×äÈ7ÿ ë(‰ Öxõ1—÷¾eò¨ªË½JË:}ž˜ª¬ÜgÆ3}Ú?ÜvEžµõ~±oÙÿYÈô²½k‘l·"œª±º®úî­ÓƒÕhX\6·ßM׾Ͷý¢›*ô.Æý6e?ÎY<¥^Òw8;~+Ü×8´{à?ÃQù›ö~úV´bRêlÜî‘cK-k\Cñštõh{IöôµÿÚ/ç+ýSÕ¡‘NjÛôõT¿õóygŠ<&pïëãÔ±²3±±­ª›œàû, kŸ¥­/°TúëÜÿçvz?ðˆù}««õL½HvOÙë'³1XÜg4'íŸmrÆÞÌŸ¬õš¬¥Ã«7šœÿ\¢ül¦z¬£Ñõ¯³cþÏwýkÕõ–7!—™ÉwÊ&:S§þåsdÏ;ùq‚?ÄÿÐÝkm¦’ÁuŒ¨Øí•‡¸7sÿÑ׸ûßü–¨?·!Ùx¶¿4ˆvM1/±­Ë¡ÿ Í­¿÷až£?ÀÝJÎËõ,úʼn[+õ[C– Ûv‡ŸNËaÿ™Oê϶ªžÿµ3Z׸€9&>õTƒ²Ÿ¯è°\±˜Ê2"D^~©õ«6¬ÙÙ,™92ÔñœEUãÎËrv?~FKœæãQë~«U×zßm³ÑØè†âýŸŒvúE˜ïhÜ6í¦ÆðžŸÓÿ„QÀ´ÝëutËyŸ j‹©Æþmß§ÌwþLzs¨3ÓÜ1œïwÙ\ Æ|έ¥žüG?ý6èÿîµÊÔ`#–òýÞ?ýÜøwÅñá'1›Cš Cþñ©^+1ÇÛú§¥WÙkkXûl`kZúýKw»&û“‘è7Ñõ?Oé~±jÙ™yº’üŽÅ&íßL@Dl:U•Œe¬ÙsE¬<±à8šùJ‹r°¢¸ÙKGôK\Kô÷î~3¿ÿSù8¥& (ïo­èkê–ú›`ýÙ»tlú_šŠ"Çe¹1Â_6‡hËiÿƒ&ÓêÄê5ž£Š,ûKA­y¦ÓcòíìÆ»è1÷íõ>Ïú?ZÌ+I{¹-©È{nȽìnÆ’Iµû¿7رM§ãžÆ¹ÁŒª›Í•7]Û]íûF/ó”#ÕÇÿ®¹™œ§ŠñÞ$bÐùÜ×ûS˜Í®·wú,OJøl…ÝrN\1ùéKôªçå”yy xÎÜ:G ýÿûå¨ê­Á²Î™ŒÓ–OÙ@xmu>¾÷û¿¡ÿ9MT³#'ìÖz›=ñîË{®¾Ö¿1Í ©ûbšÜÏPÐæc;Ôõ=Ýgé²¾Ñw¿ô~ŸÐE̤œ-¸Ì ³.Å­£kCë—úMc6µ­¾¿Wþ¼“]Œmµ®Æ‡Ö|ZὟô\¯`äð⑘C¼ÏýÏî°òæ98¸‡Ê}1ýÆ_»ý×?¦=ùxvâ]cÞø Þâ^Fòæúvk¿Ö¥Íßv-¶½þ¿èÿCTº3î4[U­ƒUŽíA1±Þêͱ»š¡ÿ£ýÏô„˾ÚsðÜûcàêMd˜ÞHÚývïQŒ÷ÿà¤HŒL\ðZâróì“Q°ÄAõ.m-=›>•¿ñU[þ Yd„Ç_æÿW+ý(ËäÿÐ]¿«¹¿`úÃ…q1VQv äÏø_Òâ;OÝË«Ðgþ^”¼ƒ-Ö·Û(%·RßZ’9RFUø-,^­ûCöwí=ߪú?ißÿ·ÖÝþbi Òæ±ðó˜f?ÊJãB\?ôxÿÓ¿€óf#/:œ—[’ëöÛ•ÿ£“Ó‰M9d°¼Ùl—oqxÅ®y¯|º½þMú{=:«gø5G¥egŽ•‚ÓÜöŒjC_ëÒÝÃÓg¿kŽæîV~ÕÔòµßûJæò œ“7T¥~¸u—÷œI‰qÌØõ~¨÷EÓðòqº†u–ÖWÇ¡p°Øís¶Õg¬çä}[ÿÑ9_ó~‚±Ôï~7LÌȬŕÐóYþY_ø+Ø¡ö®¥ÿ•§ÿbiU:­ùÏÁs.Âôj}¸í}ž½v@9ƒ¬nr"2žHñpêcë‰Óåýä€e8“üGÍûäÙ›zN{+®Ë[(c)fÑ·s%—7ØÏÒ{©µR®–ô®~Mf]õ×`¦,yû>.Üf{1½7äúÖÒÏgÚ=e?¬ÖUöQk«!ðc¶‚Öî6Ñ.g»óþƒ=êôuôå¯õ€gå±û™0ã–ÙòÂþ´e8Gþé¥Ul¥¬ª½+¨3àѵ«"ÌL¬lg¼Ã==ÄÆ£Õ½ƒ!Žu¡ìcÛºŠíoè]_ó^ÿê-uKªdߎöZi¤5î¸×é›t۵ͫ'ùÊ›?¤ôýêÔIºîú3{|RÐ=8ý?Ôù¾‰Ì5<¹®¶¡I.tú±÷æ¿Ûíý7¨úØ‚î,ôšÚšÆ}¤°‡>I´²=ÍÛíô6·wþŒV2:Ëiuí4ümîµ»À†7Óô-ÇIõÙµ¿àýêMê66ƒŽ‘êÙSØëšÖHVç¹·þ“w¬ÏѶ´ï^ì$}§§å—ïmò|ÜQÿ˜‹ö^[²Ÿ}—n/­ÌÜZïuBŸEß¡s½&[úMþ§ü'£ê¡·£åú“Ÿ^ÑI¨Vlj77!»Ï¢êŸìk½Gú¤ÿFƒoTêM§"¶¸ˬ·݃ÛMFæÜ×7o§¹®Çc=ÿ÷!jãdï¿&›,i{- ª¹hvßN» ún÷9é!Ûýåc-Ç£ÅûÙ}Uÿ%Åe”ãÓ]›M•±­vÁ ‘û€þj±ÒŒb»ÿÚKC{þŽv7ù¸÷WWýi K¦i™šŽ;¾eoýK€úψGÄ`d~„¸G÷Lô7Ææ8: ƒ"|–~ Et;q‹uÔ7ú¬{OþeJÐ]4†ÍVíuÖ9ÏÖ²§Zr öìØú¶3÷=OOôµúŒÛof^sjÆuíûDïVÁ&œmÍÛsšåh49YÔÁîÓÕÿGû¬zÌ·×-û;ÃÈÜZÒèÎý›,vÝþÆ2ÚPúŤ[†}Jª8–:è U•¾ÂúmýZç³Òý_ô¶³ôžÏÑ— çÜÖŠñ¬¡í$‡‹hx÷5Õ9¯­Ö5¯ö?ÙþŽßÒ$á{«®·`ÚEM k¾Õ[]¾ŸºÊìc½¿MÔÁ—CˆG^þ‰o€=P†—AÂ{®‡í¿úê7~wìÿ±kþLÿª\£.ËnÐÜØzô蜷w?ÿ™ôýßiKpÿË8ôýOæÿ“¿è!-Ç›8AÉËš:d£!¹õªÿÿÔ½ÒÚ[Ó±jüêkçIv3¿éT§‹™‰–\1nmþ™û&íÁ¾è÷{«±¾ÏÜSôÝFoQÄtnÇμéû¹u:¿ègmY”:–}cʯx¹Íc¡°2mfC}v·Ö¶ºîüÏÖkõ=OÑó¹q—½{,põÖjkXÝÆÝ[þvMìý®õúRÏWý*Õö74èæøƒ£›þjdÏ ã04ôÎ?ËûÈ—¦qzdÞµXÈéùm;lh2e»ƒ·Uµ¯ý7¢çú?£±Ÿé?F«ç—ÝÐ}x¥,« µs»ÍvK+ªÀÛ+k[VEm­íV:s^Ì!ˆ÷8[†]†÷ú1·æÞ³ øÙ z¯Ól®œ»ðq°lf5vYëdZýæËãôε¯sÞêï­¿OÕõ?OgÙê¢õ~&†šð1ýÖLr–9 GæÃ1’'§£ÿEj˜5’WØÙXÈËcÊH‡¹ž¡iq nÏkŸî~ß ‹è;]‚é";/ ´»úôÿE¿þ¿øT£Šü¼+q˜Z×?ió·ÚöÙîÙïüÏÍVbA£z¾¢cæ#ÌrÃ6&'8Dëë­!/îäôÉz(¦ã}Ðû½r`Èfßk>…-ªÆWú&ïýßz%´Pks­¥`&×K¥À;·iÝnÑýugH²ú6^)ÜÊîe@\Ö¾Ã[ª·uþ¥¾ÍÜn÷u ZÚϽÙ%ÙV1í YS¨­¦ç;Ò¶–½íôO¿þ)>ý&3–qˆ&F#}å“Õ?OèÊNȪ§Ö©»Ó¡`Û=ö5ÌsÂ;ùÖ~ÿó‰¾Í@»×ôk¥ØÝülþr7ýb ÞŽàÿP=¬¸—{7o v?Ù·èý ¿LÒ°ƒKØòÒç–˜¯è ­î ÙV×Ùùÿú1hYa)Ê@Kˆ³ë»®–UÂÝSé{Cr²ôs¾uãµ´8éÿ VBϰmªˆûMçeðŸs¿à±™úkõ"&p·¸Øxï»”º²öÁsvúa›™-sŸ×[üßé=oæýéËËÇy}Ì*8Ƽ'Ž^£ÿ9B²ëè¶ãxÈ®ë ÿ8,†ïß¶ÌŠvØÃ[¿Ew³ù¯N¯ ‰Šw}¦Ñ¨»*ç4ÿ%„b7ÿm‘LtÌ'دu,iû­££Ôî{ì¹õÔÝï·ÙþG³cÕ;½x¸Ò?ûvoz²¼”'ôc_áKÿEG—•öPÇÝ`~ð'{Fêª c^íÙý_üÝž¡Õ.¾ŒVº‡zw:Æ0‚ÞeÏadÿ'éäÕ\úêÌê¸øÎg©è—ìpÜã¾çYúOж´Ú{=_WùÚ?D‹Ôîê8Xö5Ž©Î7Íq2ÏsÿI·c=¬vÍ–³þô_¢¸–ħ"2yŒpéê>™ÎtšªÛpŠÛû5ŸøÓÌ{½·g×ý¥ÿP¹Ü»·Þ>•u½íópiôÿγjôŸØ£þkþÁݧØ~ÿþ³ömèKpÁÎKõÜ´¯Åÿ:ÿÿÕèþ²ãý—ë n úž7iþ{Û¿7uØ™_æ`¬Lîš/ËÇˤVËXñö—ʆßcö7}ÎkY²–¹ÌÙþ“ô~§Ö¾ŸvoIu˜­/ÌÁ{rñX&^êýLý Å~F'ý}sY]õ²Úú­h²·x±Ã{þaXß„±æc¶A¯÷£é—üÞ7‰†Q~˜üG¥f%™âßUÞ…˜¶ï.Ø\Â6ÙO¸í¯Ôo·Õúh×ßF=.¿"ÆÓK>•0Ñàßå;÷Xßzª3Ý“íénCf–òF3~;ÏÒgXÇæñ?Eþ“.¥WÔ«ª×öÿÒÚ@mY÷¡®{xçgرi{ÛöoÑd~ÐõžõqÿXTÄ$t—èƒè=5„ Ò_¢>_ÓeeöW˜sÝC±ð. ¢ûn"·îkœÜL×ãmõ(Çý'Ùl³!ì»Óº›,Ǫ¼tÝOûëΡûf)^vXÝëÌW}¾Ês~ÏS?Jû}KjÉû=-W5®k™cCÚàZö›½ßàžúè­ÿ®ÿ=K*±›Õ02›v'P¨RÖ Ö7$KÃ}1ê·Ö÷RýÙlªý™5úôÿ…Vá*ù}QýßÒƒ©ðߊæäcî )à'ÕûЗèµRW,èmv.EÔ7³E`'ÖÛ‘ÿ³jø}B¬šqÆF;½jí³y¦Á‘¥»v} ý?´~ÿæ)a(̈ÄúBôœ¿üaäsÇ ’ý Cü/šPR–íx¥7d¸K1ÙÈã{÷{i§÷¯»ôh®ÀsXëró^*`.¢ÁCCZ78ºÏÖrí»+Qûn¬ ¶ç–׎Cêu–ŽÙ‘nC}oYõÚßA÷úž«ì§ý*±ôxL߈c‰¿ÞŸýÌ#ó'ª†aUffQÜý¿¦¶¶¹Á•ƒüÆ;c{™¿é»éä[úK6~ÓN997¿©X÷WMŒÓC]¾§7é šÝìs?–ÇUêúþ·é?í; ΟfNc³2Àkæ¦í6×YöºŸ»Òýèmÿ‘êâe~‡ÒV2òŸ[¾Ç†Z2Ã[.‰f;ö[c>«·ú'øOç,ý[ùË1Ôb<ƒ™)JDÎdï~2(srü¦WUFú°žÖnÛúê~Žçâ1þ½µzµ~šÊ?ÂÕé£S}9 /¥ûÃ׈-sOî[SöÙSÿã­âtì|.’쌬{×µŸdÞømŒ±Íu·3.¿Sü¥üí먒ٿ["Ÿ[Ñ¥‰Ó,êOÞ–mΆå ]5–Ù”÷mþy¯ôuã[ú/º¯ð~¢±,1'‹åùèÈÿU~lâ» ³ßü¾ÍEw?,ÂÙ.k\æ^Ú©w­s+ÛÿžÿœU:c™•—“ÔY¯ ¬0ⱎ÷YKM®ô][ÓSg«O³ü/AÕúVèÅÖd³í8M×íøí'k@Ü]›ˆÝöãíçèõñ¿Ò}‘Pì!í³Ü×´‚?œ×7Úÿë(4-ÜsÇ—†Xä bxŒkÕÆzɱÓ0ÎWéø Kl½·]¤GŒ»7ÿ&ËÙ‹ÿ¡ Ô—õ§‡¿+­³=WÓÉôÔ1lÏŶæf²:uM}£,Ù¸ÔÆ Í£ßúÆc[H÷dXÏSÖõ)ý/¥½ DHôÌ|Ð:z¿©ÿz¢,’=2ÇúßÕb󕇒Ìj[gQ©í}¢ Aɦ¦mgÓµÌnu£ýYsÙÿ —é§#¦õf?Á™[õip-¹› sE´»Ò˧k÷}&ìRÈ¡´Ùx¶Œ®­ÆXÚØ-ºªÅvÙ…Ó±ë¿õve9Úûr¿U£#';"ïæëS¾Š²2êÂêXÖäo­ïƳ2ºEí5ú_¢£;¥Yèdzž¥c1þË—G¡újí®ÏQhÃý¯pþÍ!½ÿ/ë6H—«ûÜ-VtlZ²Ù•SœÇ6ï]ì1µÎÛ{?3ÒÛý+þôuUüÒ|ÏùKÿ åÕa-7ý[Í­Ö6ŒŒÊ½"ö+ÉkKƒ^ g×}ßFÆÿ†X]RŒús°¶gz޲œ×;¡;pÚÇ1Žßì÷)¹hN\Æ0M@CòÉ›”„Ç3ŽR7\_ÞùdÛpkšZà××4ðC†×4ÿYª¿§ƒÓikîx©£‹òºÂv¶¯m¶îµîôke^àÙ³ÓUÆ?V·Ù®~{ð7?2šk¢íõk¬e?¿“Fúv~“ÕôÕÜ^ˆÊkÍûE4ääµÏ¬Ú\ë6×gÙï6åÞç=›]û®ôÿë~§§­7©”jëO^¿à»>à;/ñZ–fä]íÆ­'&Öiÿi±¬þkwýÈËÿ­ã-«ßSîê½.ÌÜl‘‡SŸhÆa`´Ûki»'>ÛfݶÛUµþ‹ÓÉÙú__þÓÖÆî™Ó¨k°œÌì²÷°ºÀ@ôþÐÚËú ~u9ߤÿØ•›‡Õ:§KvCú5卑õ».üF:×¶ªßž.mŸcõ^vÛö{jͶ¿Òþ“ùõ$áÁŒœgƒ]e/L¥àædF†˜Vì¬èØìçÑFP[½Ç+Ž;šÈe¾µÖ~ŠšÿX³eJÿ^ú­“Ññp¯Ïµ¹mÉqnIh ¯'éâý’ÏfCi{=\_Z×úÏÈô?šûO¢µ0.=#®þÖÊuv»¨ZÜ~£w£]^Ÿªí”[C™ÕCr¾ÏÌ‹r_e~ŽE×z˜ËSë7U¢Þ‰‚湤ìêYZöÖߤì*›kl©ù··÷™gØéý=¿¥û5vG.fdÇACæïþõªPÊ2G¨ë_½o5õ{¨uâü°õK>-‚¶c\FX6´7í·¬~Ý^#YéÕUUæWú^êÿÑÙnìNÔ®Ùi?Vz¶S¶úµE˜Y6<Æê\öÕOÛœÖþ{0z‡¬ÿûWS¾šÏªŽé·`ýa§«ºH,fE¬®›+©‰•mL¡õ»ôž…¿dÿµõ]þ‘SÂÌO³äî·©¶œ®¹øÆÇ· æRï§k±½_ÔgóßÎþŸÔP“r$G£. ÈÆ áËŽýq:oò—¾ÃÃÇÁħ žž>3UL’a¬7;ÜïhF\·Ô¶æN[ª½î赇M„ÙÔK2Ý‹uŸ¥û nÛ‹]O¶ÿÓÓ‘èz4z~§R›M_o×íØß‚ÿEÿ×õT’I8ßXºíJÙ‘‹`ÇêxÀýš÷ cšu³-÷Y‰vßøÊlýbŸÒV¹zì³{ê¾§ceÑ#æ\Â~‹Úñí»ÈýM£·þïR¦z Íë] «ÔÁkFM».¨ÖOÓhÜË)·ü>=Ͳ‹¿sÙZ«Íò‘Î,zr ¥ÿs6c—ŽaÚciÜÉâk鸵æ;2°[kÉu‚IyklvâïæÙcÙ]LÙWý·O¦<ÐrïfÛsCšñ¹Ž´Z–Úߣm85Ý_7ÿÏú]; þôUìÜn­Ó­ô2°Ý‘mŽ-ij®4ÞïðU¼þ‘Ý6Û7~“í«UúK+Ì»ÒzCn8{Üne_I¶²ÝÌ{ñì麛tö~Ð˯ô;?˜éؽŸð*·!Éd—1ŘÅUÅúGôxOõZPÅ8HÏ 7 !zÜ¿Gü!³¥u,kñU¼¶Œªnci{>Êöä:ÌL×;7¥ìöÖ2žŸ•ƒ¿ùºqÿšE»'&þ­cÙ‘n7Iqª«1›ê¼dZßÓdßCÎulm Â{1_]›ò2}_})ëÁêý.G¥œlœv3ÛE¬ôž^ÚÜßUÏ©í­ößs(õþ}öÿ8™ù=?;*Œ~§Òî«-î5cÝe\Hg¥ŸI¯&ÿI›?Gÿ þlÏ L%pã:ÿè̼`›EÃÑ/ïp§¯©µÍq£}VÜQ¨ì›êÌm6TßI¿£²æÅ.­çôË2ðvåãÙX§)¯-º²!ÇmsÚÿnöµûU¾£SGTêVÜêqë¯Ò¶ë’_oO¹ù—]KóÝêØÏõqª©Îû>NG¯fÏô¸uì ­Ë=C8_½¹bê[/¢ÖY‹‹gçþr©Ëâöó‚\~Ī¿½™— ŒrÆVw<1?Ýý' §õvu\L.›–Y‘ÒØ1nuNÝc¬ôëè÷g6·º¿ÒW—ˆú2?Wû¥ÿr±6BY¿¢`RÚ±ßkæSEV¼Ü×½ÛÏèeÑê7ß¡ê=Šå9™™½O«e:¾¥Š ØÌ¯µšß[Nfï³àú¸ø•²ßÒä>ÚýSùõ üï«6ZN[Û{šÐËMa ,ÛVK+w¥‘éý«}mÈõ¿ÃÂ(þõÁÌ ¸Äö”x?Dy:ðÄF2 ‰zÔœrqqzÏìî²íõbÞ*ϯö;sl­¯«ÓÈ®ºnnÛ-ôïÇýNG§mXÞ«ÿV»¥¯«Y“ÓË~¯ãá×Ñh{ØÎ[aËc\ædQçщöìgz´Uèßu·ìŒFëiY}C!÷ôK*ÂÁ~>6F3Ãn`¦£[.m·]éb‹_UT:¿W#ô>«)ý*»‰GIÆwN£¤f¡“SloUÊǃŽjp¿"†¾Æï§ÖÇͲªz}LµùaúÿàT¹y©æÄrX„ñšáù¸£%þ ¦°ãä#+Ÿ­=;þ’6·ü€þ‘ë~À};6f9Ö2íãec£7v]íúûE¾–GóTaú¬ª¯µ÷—tŽŒÖcãS ¿&¿cjk‹ýjñšÀÝ·þuW·ÔeÖzÿÍ[W¨•‚Æç7Ï}4ßcó0l¯oèò6¼u _Ó¶ê¿M]ögc~‹ô®z?ÑÔ®¾¬ o²tÚ[¾§²¦ÒÑìc­»óSn½Õ1öýŸí­»èõ,«×õ˜æ'ÈlGò Ìqá…j:JDñN_Ôƒ+kÂé˜t ñ…Å$b´€\׺ë=^×ú7Ù]vú;6z·~¯ú4>‘Òòú¯PuV<³¨ÚÉËɨAÂijùº1ÜẬÜêØßF«}Kq?O—ÿ‘,LÞ¡ÔK1Yêu;¯½ƒÓéøïs/®œ–T÷Q•œÇ±·cQ»íÿ¤[F/ó½çIé8}# bbAq²ëžw[m®þw'"Ïð—[ÿ¨ëôꮺӉ`æy€=0Ó¥ÐÿÐÛØôbãÕ‹ŽÁ]1µÕXá¬hØÆê´"¤’kAÿÐõT’I)$’IM^©Ó©ê;'§^÷×N]nªÇTí¯ pÚ펇Ô®;ªý^ê¸äÝk憆uNš6ä±­ géú[±ÿ£«Õé–zÞ—«]tz÷zÚH‰²ÙÀK~œbuN¨l}u6¾µUaζÌx§&¶·vöe`¼Têò}Íe8ÿffÿFÏÏV›õ‹ší¶ú²q~ÍWÚ,mµ ±¸Þ›¿u–}¤ú5îe^¦Å×õ‰Òz oÄ®÷°Ev¹±k5Ýú†m¾ŸúÕŒY¶ýT{dàõLª@!Ì«#fem îæ²ÌߤÝßÓT£1þZµåÊö£ÿ7þùä*éÝ6ÊK°‚Ú sì¦Û]Õ½®s÷äôÿQ¸_"‰ý[íøÔ_ú:}{2VçOe5õ®ƒV;·SK2k¬îÜv²Š*f÷~þÁïPÎú‹Ÿ}‚ç“föØ÷ nÄuŽnã¶û*¿7Ô­Î~뱞¯ç«]êÇQÁêx¹ÆÂÃÅÆ7½íźÛ\û.eTnÙ~=;=´{ßê¦ÜjT¿5цN8Y¿Ýìãô|\lž…Ò}z›i«‡W¼NÓé´iýoÎJ®«Ðñr¨Á  ,ºß³VI­¡Ísñ›ïsjý¬Ûq«¶¿Qž§«ZÒÁú¯õ›]€S)m…·¼Á±¯s”{·÷Ѫú—š-6?;özÖ;Œ°Ød:ï[6î¡ú_s¿Ié,ÁÊä$ñ /OS®y¬`úú\JzænCwQÒ²‹Ý>Žâ í6V÷^önô×Òïëÿì?®Ý7ªgåZ}w«žÀYÒñk6äR\gõÛ[¶Œ7û½'³2Úü×óvúÞ¯U_ÔÞ”ísìÈêfwmË´šôìì,³à¿ûx«g–ãâÔÊ(fŒª¦†1£ù,`kZ¥'Ò¡ýÝçOþõŠ\Ü¿Fôýïûؼ_PèXrp>ÛeuÑöK+ʯ§Uúl‹=' ÇfG¥FCªõk®Œ:Ÿê?ô/Î}XŸ êî_WÉûa¤ôÜrÃ_Û^ÀÌë?G·‚ì ]îýc'õÏôXØÿÏ®á%fŒ#ÃAïjC‹æ6Oé}ø8?˜˜U h¬CXßôž÷:_ew¾Ëlý%¯÷ج$’,*I$’SÿÙÿí^¸Photoshop 3.08BIM8BIM%F ò‰&¸VÚ°œ¡°§w8BIMê"× com.apple.print.PageFormat.FormattingPrinter com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.FormattingPrinter i865 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 819.21260515348172 575.9999831792876 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2007-07-13T10:56:58Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -8.5039370078740166 -9.6377952755905518 833.38583349993849 585.63777845487823 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2007-07-13T10:56:58Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMCustomPaper com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMCustomPaper com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 819.21260515348172 575.9999831792876 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -8.5039370078740166 -9.6377952755905518 833.38583349993849 585.63777845487823 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMéxHH4@ÿøÿ÷BJg{àHHØ(dÿh 8BIMí––8BIM&?€8BIM 8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM@@8BIM8BIM_,'SySync diagram_plugin',nullboundsObjcRct1Top longLeftlongBtomlong,Rghtlong'slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong,Rghtlong'urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?ð8BIM8BIM 5p Ø'5TÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I)$²2qñh~FM¬¢ŠÆë-±Á­hñsÝíjJJ¨õ·Ó:ac2ï ºßæqØ×[}Ÿñ8´6Ì‹vþvʽ‹¨uN¿ÔñmwF¬àÐãSîhnVAiµâÕxôºuy-k««/>«ný'ô ÿMÓOFÅé®ê˜Cn=Õ‹ò]ºÛÞÖ‡XÿµZóv]÷ÓúJý+ÿMÿ¡T¹ˆcÆ*Ý•ðú~XËÆI´þ¯×òÏêxUôúŒEÙîõ-ˆ—“ðŸ·þÞê8öÀ žŸÔ2#íý[.î¿ì}‘ŸnÛý|û;~°ÝxôŒ+2²‹CÝ¿o£^æ—µ—dÓcè{Üæú? ½þŸñOS8?YsNìœÚ°j1ñªõ$n­Ößiß¿nÏæmÿÒk?/7ÍKæÈ0ÝŽ‡þoEÔ» t§‘AÉ’ì»mÈÔ­læ]wÒwµfgô¯«x½oÕÀÀª§âf–UKûüGùÆµŽ±»­Ùÿ]Væíº›ºRÊÈv3ªÈ½ÁµîÅý'«èÙ»Ûþ÷îÿ®Ö£×*¦îµÓ[mlµŸfÍ!¯k^ߥÓáÀ<9ªvBVrO'¦w¬¿súË¡)ínm?-´Vѱ2Ö±÷eôëYF¿¡vE5U‰f5Ž»)”Ûêƒúÿ„°Ì³„ÌwåeõNvKò=WeÔÓk­f>1ýªÌÛ}}•~—Ò¦­}_Ízõ1C'¦}^cE™XxUµÇh±õVÏtǪ;Ö;ó’§Ö¹Ý#7.†ÔvŸFÛ_WýnޤܬK©ÓùÌzý/øDèó¤ $üÑâàÿ ×8ÿãlÇ•–ÀÄ—W§}bê·4œK°úíM–×» & j¿s+¼äce~ƒ&ÏÀ§{Ö¶Ö>›“Ü;‹ðsŸ;pòÛéXèŸèî—cæ}ûE~Jãò:m–rñ1ú‹víõqç( ú@»§äÚßåY‚šœœ›v ëTwIêM5æ5¬aÛk«¹—ý¯ôŸf«íx¾­¡õ™ëåZûUÜ?‘ê3¿èOíÿÕ˜±°O£ó?'Ñ’\gEêùË:]ç6ºœ[‘Ѳì?j¤4þ—ìyy[-µÌõ+kñóm¯êÿ´q½5ÓôΫ‡Õ1ý|WiÙm64²Úž>•9Y¶Êmþ¿üe¢Z8³Ã-ðGÍ i8ýMÄ’IH…$’I)ÿÐõT’CÉȣܜ‡Šè¡Ž²ÛÃZѽïwõZR£Ôqzf+²²œC c ž÷¸íªŠ*o¾Û­²ºØ±N-ýFúsº»@}õ10$:¬w~eÖÇèòºƒÓ1‡üÞø\¼…Šr:•ìêÙÔº‡Á–}*+pÛêÚÏÍê9Lþ{þâQú•ö®Ü‘uLž¡c†Kim·KmΟe¶ö‡5·5™¬­ûê®ö³þÕý*ÈçyÓ’GÃóä¿›¿øô×¾gZ®Œúº~5/ÎË{¿O]%¿¡g´ºÜ‡¼íc¶Ùú*¿ÂÿÁ¨Õ=7«œy?cêu¸ṵ̈ ™T7Ûµ•çTÇgUÿvªÏÿOZ®çáý]Ç«§ã ®£‘±­Ço±öÀw¾çµ¶ý—­eßdgôZš¯ÑÅ®ÛiÒÏÂgQÁ~=…Ô9ᯮÏϦÖݱÛ}\kØË>Ÿ¦ÿæÿ›T=1¡U iÄ~i¬àþªZ™¶u6Y^HÅWYe–Xöµ”œãëU‰uný_·óñlþwÿBfôwc×öϬL\ÏJÚ/õHª‹+ÈÜmmÆÇWSm¯sh§#¬?ÐUüßé=*j[Ö:þc,©¾ŸN·šrHß{ï¬MŒ¥ÙLû6=Îs‹cêͶÜ[©»ô ÆvPxËÄÂý)5šòóÈ·Šl±®¿1ïö{rhýOÒÞÌœKѲ›”‘‰Ž(LJæ®-{$¿{ý_<9yʉÐKXþ‘“¶Ú>£—ŸR×õ]­uqU7d׵쪻ð©u.{>Ïê1Þ§ôŒ¬«ö~“Ø\î«E½Kì|,Ñ‹‘IÆÁ´âz eN v͘¶,v³/öYÕºµ5ŸDÔöYw¸=öï­—ìfí–3ÔÙüÕöÞqÁèÄ®ë5·ôMŠÁ ­­{_nÍï§×Èý/鯲ÛYè'ðÆ{ÊrÂË—¦\<0‹,y~>¡Ð˜CW¨³­t‚Ð2½ZZ×µbÞÆ‡0‹+~û)ôGcw·Þ¡_JèÝ@SnM«»cq2‹ëc_êXÖ¾×b×e¢ÙG¡èÿ‚YßkÌÊ˽Ý/«a–¿cqñ½FØC@«Õ²ëföÞÏÏõoæ~C,d²æÙÕ:[o °œüY®Êý¯·%þ­v}·ÓÅÚÚëþkí_Û®•Ãä'(H‹áâõj?ÍÊ8{÷ÙŒoļ:7w¦áåb²Ó—”ìÛ­x"×H¶´2ºÛ[œö³ÝêÛfÏôŸðh}B¦gåctè‘C›™}­%¶TƸýš¼k™úL|Œëëþr›+·ìxù?é+TpºŽ`vÌ{šÆ‰8™¥µä‚?ž§5’ÛîÆšëÈfUWzV?Ò·¨2ßSÓ?O®ž¡Óò±îµõgd¸YÕceÕXí›+c.õ?V¦Š«ÃÅ»ô¸×U_©ôí±Fa8Hä‘ÔUJ#äâôñðzxx?ô¢Ò4­Òþ¯l¯´cWeٹᔚéë5ÔÛ3±Zï¦üšZÝ™Ô6¿ûWElËǯÕý¾ì´j-Ï¿6›®s1º†;X1úÝD Lšmþ‰sý½A¹v¿ÛEvo®ÏS'ì6ú>½u,ž•“éu7dÞëËÝE£cªö¹ßgeþ†Ö_m[}96~‡gÛ-·ÑûFJ¹™ƒ@Ƕ‡SëôÛK•†Á%…Ó¿¨tÆÃ¶\Ýï~F#éæ3Ô²šýVœÉñæ”%"?Íæ‡ãû¿ú­¯“ ˜tù ö7ª ÃeWölìxûF1; :};¨²ëâݵÞû?à®®œš®¢«Ë€Âêy/{0òri¯«b±×ôž¤H5ߎíîjmO»ÓÁÊǦ½Ì»#Öº¿Ö§âz˱éLu,1sê8Ù5¸Õ—Šâênh¥.s~ŸÒm”ÛþÊrú;Vß-Ì{ ‰PÉëå˜ÿ9êÿÐj‘Mä’IXCÿÑõUÍuÊ:¿\wHmu'ÓÉˤ>fAý&%o«óñ1³.×7f_Øëÿ´ù5­n¹Ôÿet¬ŒàÏVÚÚE_¿u…´âÓÿ]Ȳº÷.tê} ë¼›o¨ºÃ˜Âk»Ö°ú¹YTßQÐü‹œ÷û³üój—Ä3Œxø"YlXÞ0ý"Û˜Ž eÄz~ïï;X/ʲ¯Ù8Øî}ÝF«VKœY@{aî¢Ûª=–¾ŸVÍ–7Ó¿ù¯Ò~—ÓŸgúµ‚+Ãk²³óÑ]n;}{ÚÖVûöËYêú{_c?ŸÊôýïþvä^·Ô°Èfs]Ô1‰´ÒÐ2X ?Ò1+ÛVcßð¸^žGýѱnaæâgc·+ædPÿ£c ‰ZïήÖî÷ÖÿÒ1b’c+‹ܸO¦réÅû¿ÝfÇ–Àßæ<ÑV>/Õìggå»íW$zn{cÔºÇ]ؘM>ïMöï·Ñ¯þ±E¢ÆZ##;+ ¹Y­©§!Þ®3)ÜcÀ×ã2ýßK%¬wé}?Ñ©ät¾Ÿ•Ü›è^ÖŠÃ¥ÂZ×ŒŠ˜ö±Ím¾•íõ¨õ?™·ù¥Ö:ÍùÙ…ƒaªŠœY•–ÃsÆ–bâ=¿ÍúC+-¿Í?õ|oÓú¶ÐGëtý-ç9~ˆýسcÇ,’€²ÕëÙ4·«ïéa¹YNg¡Ôke,5ëvF[Ygë”î}Ä©¶äYgé=³Ò¨;#'ú~M—Í—cÓý]µ?í7èFUŸñi[~MÇe{[]u€*ǯkL5žÆ=ÌkYêYú[¬w§þšÅLÓÖsÚÖÙkq±ÞǶÑ[\Ç8º_mAÇí öúUäSe˜õ>Ñ_øEfÀè+N9|燳¯‹ qDc7šCôB<_ËôÛ$ôΙuôÒÊ٥㶹í¸ú«ßío¹þ¢!êØch~HcœCKLµÄ¹¾›w6·±Ì{,÷~Us:?Meøù9 ¦†ÝE¯îM[½*ÇÚ7¾”Ùgø_OÔþ{Ô±á6ô'ÛëYëÚïU÷˱ïØ^ñ]ræ³{k®ŠÛ^ïúïªõ ‡µ9X ¶^)#íŠÞòê߾Žûr]~=.,±öl±­p!¾›·oý&ç7Ú£Vic_Ó2,ÅiÌkêã}Í?e¼¾½Žÿº¯ÆÿŒUkoAÉÇwNĽ¸â×ïu5ŸNÒïäÕ–Íÿñ{+ýÊýOÓJÿÚ¸ºÁi»<ÛsíF:ÇŸA­už»îÙc›ú¦ÿÙÔWOô¤¸FÈ×äÈ7ÿ ë(‰ Öxõ1—÷¾eò¨ªË½JË:}ž˜ª¬ÜgÆ3}Ú?ÜvEžµõ~±oÙÿYÈô²½k‘l·"œª±º®úî­ÓƒÕhX\6·ßM׾Ͷý¢›*ô.Æý6e?ÎY<¥^Òw8;~+Ü×8´{à?ÃQù›ö~úV´bRêlÜî‘cK-k\Cñštõh{IöôµÿÚ/ç+ýSÕ¡‘NjÛôõT¿õóygŠ<&pïëãÔ±²3±±­ª›œàû, kŸ¥­/°TúëÜÿçvz?ðˆù}««õL½HvOÙë'³1XÜg4'íŸmrÆÞÌŸ¬õš¬¥Ã«7šœÿ\¢ül¦z¬£Ñõ¯³cþÏwýkÕõ–7!—™ÉwÊ&:S§þåsdÏ;ùq‚?ÄÿÐÝkm¦’ÁuŒ¨Øí•‡¸7sÿÑ׸ûßü–¨?·!Ùx¶¿4ˆvM1/±­Ë¡ÿ Í­¿÷až£?ÀÝJÎËõ,úʼn[+õ[C– Ûv‡ŸNËaÿ™Oê϶ªžÿµ3Z׸€9&>õTƒ²Ÿ¯è°\±˜Ê2"D^~©õ«6¬ÙÙ,™92ÔñœEUãÎËrv?~FKœæãQë~«U×zßm³ÑØè†âýŸŒvúE˜ïhÜ6í¦ÆðžŸÓÿ„QÀ´ÝëutËyŸ j‹©Æþmß§ÌwþLzs¨3ÓÜ1œïwÙ\ Æ|έ¥žüG?ý6èÿîµÊÔ`#–òýÞ?ýÜøwÅñá'1›Cš Cþñ©^+1ÇÛú§¥WÙkkXûl`kZúýKw»&û“‘è7Ñõ?Oé~±jÙ™yº’üŽÅ&íßL@Dl:U•Œe¬ÙsE¬<±à8šùJ‹r°¢¸ÙKGôK\Kô÷î~3¿ÿSù8¥& (ïo­èkê–ú›`ýÙ»tlú_šŠ"Çe¹1Â_6‡hËiÿƒ&ÓêÄê5ž£Š,ûKA­y¦ÓcòíìÆ»è1÷íõ>Ïú?ZÌ+I{¹-©È{nȽìnÆ’Iµû¿7رM§ãžÆ¹ÁŒª›Í•7]Û]íûF/ó”#ÕÇÿ®¹™œ§ŠñÞ$bÐùÜ×ûS˜Í®·wú,OJøl…ÝrN\1ùéKôªçå”yy xÎÜ:G ýÿûå¨ê­Á²Î™ŒÓ–OÙ@xmu>¾÷û¿¡ÿ9MT³#'ìÖz›=ñîË{®¾Ö¿1Í ©ûbšÜÏPÐæc;Ôõ=Ýgé²¾Ñw¿ô~ŸÐE̤œ-¸Ì ³.Å­£kCë—úMc6µ­¾¿Wþ¼“]Œmµ®Æ‡Ö|ZὟô\¯`äð⑘C¼ÏýÏî°òæ98¸‡Ê}1ýÆ_»ý×?¦=ùxvâ]cÞø Þâ^Fòæúvk¿Ö¥Íßv-¶½þ¿èÿCTº3î4[U­ƒUŽíA1±Þêͱ»š¡ÿ£ýÏô„˾ÚsðÜûcàêMd˜ÞHÚývïQŒ÷ÿà¤HŒL\ðZâróì“Q°ÄAõ.m-=›>•¿ñU[þ Yd„Ç_æÿW+ý(ËäÿÐ]¿«¹¿`úÃ…q1VQv äÏø_Òâ;OÝË«Ðgþ^”¼ƒ-Ö·Û(%·RßZ’9RFUø-,^­ûCöwí=ߪú?ißÿ·ÖÝþbi Òæ±ðó˜f?ÊJãB\?ôxÿÓ¿€óf#/:œ—[’ëöÛ•ÿ£“Ó‰M9d°¼Ùl—oqxÅ®y¯|º½þMú{=:«gø5G¥egŽ•‚ÓÜöŒjC_ëÒÝÃÓg¿kŽæîV~ÕÔòµßûJæò œ“7T¥~¸u—÷œI‰qÌØõ~¨÷EÓðòqº†u–ÖWÇ¡p°Øís¶Õg¬çä}[ÿÑ9_ó~‚±Ôï~7LÌȬŕÐóYþY_ø+Ø¡ö®¥ÿ•§ÿbiU:­ùÏÁs.Âôj}¸í}ž½v@9ƒ¬nr"2žHñpêcë‰Óåýä€e8“üGÍûäÙ›zN{+®Ë[(c)fÑ·s%—7ØÏÒ{©µR®–ô®~Mf]õ×`¦,yû>.Üf{1½7äúÖÒÏgÚ=e?¬ÖUöQk«!ðc¶‚Öî6Ñ.g»óþƒ=êôuôå¯õ€gå±û™0ã–ÙòÂþ´e8Gþé¥Ul¥¬ª½+¨3àѵ«"ÌL¬lg¼Ã==ÄÆ£Õ½ƒ!Žu¡ìcÛºŠíoè]_ó^ÿê-uKªdߎöZi¤5î¸×é›t۵ͫ'ùÊ›?¤ôýêÔIºîú3{|RÐ=8ý?Ôù¾‰Ì5<¹®¶¡I.tú±÷æ¿Ûíý7¨úØ‚î,ôšÚšÆ}¤°‡>I´²=ÍÛíô6·wþŒV2:Ëiuí4ümîµ»À†7Óô-ÇIõÙµ¿àýêMê66ƒŽ‘êÙSØëšÖHVç¹·þ“w¬ÏѶ´ï^ì$}§§å—ïmò|ÜQÿ˜‹ö^[²Ÿ}—n/­ÌÜZïuBŸEß¡s½&[úMþ§ü'£ê¡·£åú“Ÿ^ÑI¨Vlj77!»Ï¢êŸìk½Gú¤ÿFƒoTêM§"¶¸ˬ·݃ÛMFæÜ×7o§¹®Çc=ÿ÷!jãdï¿&›,i{- ª¹hvßN» ún÷9é!Ûýåc-Ç£ÅûÙ}Uÿ%Åe”ãÓ]›M•±­vÁ ‘û€þj±ÒŒb»ÿÚKC{þŽv7ù¸÷WWýi K¦i™šŽ;¾eoýK€úψGÄ`d~„¸G÷Lô7Ææ8: ƒ"|–~ Et;q‹uÔ7ú¬{OþeJÐ]4†ÍVíuÖ9ÏÖ²§Zr öìØú¶3÷=OOôµúŒÛof^sjÆuíûDïVÁ&œmÍÛsšåh49YÔÁîÓÕÿGû¬zÌ·×-û;ÃÈÜZÒèÎý›,vÝþÆ2ÚPúŤ[†}Jª8–:è U•¾ÂúmýZç³Òý_ô¶³ôžÏÑ— çÜÖŠñ¬¡í$‡‹hx÷5Õ9¯­Ö5¯ö?ÙþŽßÒ$á{«®·`ÚEM k¾Õ[]¾ŸºÊìc½¿MÔÁ—CˆG^þ‰o€=P†—AÂ{®‡í¿úê7~wìÿ±kþLÿª\£.ËnÐÜØzô蜷w?ÿ™ôýßiKpÿË8ôýOæÿ“¿è!-Ç›8AÉËš:d£!¹õªÿÿÔ½ÒÚ[Ó±jüêkçIv3¿éT§‹™‰–\1nmþ™û&íÁ¾è÷{«±¾ÏÜSôÝFoQÄtnÇμéû¹u:¿ègmY”:–}cʯx¹Íc¡°2mfC}v·Ö¶ºîüÏÖkõ=OÑó¹q—½{,põÖjkXÝÆÝ[þvMìý®õúRÏWý*Õö74èæøƒ£›þjdÏ ã04ôÎ?ËûÈ—¦qzdÞµXÈéùm;lh2e»ƒ·Uµ¯ý7¢çú?£±Ÿé?F«ç—ÝÐ}x¥,« µs»ÍvK+ªÀÛ+k[VEm­íV:s^Ì!ˆ÷8[†]†÷ú1·æÞ³ øÙ z¯Ól®œ»ðq°lf5vYëdZýæËãôε¯sÞêï­¿OÕõ?OgÙê¢õ~&†šð1ýÖLr–9 GæÃ1’'§£ÿEj˜5’WØÙXÈËcÊH‡¹ž¡iq nÏkŸî~ß ‹è;]‚é";/ ´»úôÿE¿þ¿øT£Šü¼+q˜Z×?ió·ÚöÙîÙïüÏÍVbA£z¾¢cæ#ÌrÃ6&'8Dëë­!/îäôÉz(¦ã}Ðû½r`Èfßk>…-ªÆWú&ïýßz%´Pks­¥`&×K¥À;·iÝnÑýugH²ú6^)ÜÊîe@\Ö¾Ã[ª·uþ¥¾ÍÜn÷u ZÚϽÙ%ÙV1í YS¨­¦ç;Ò¶–½íôO¿þ)>ý&3–qˆ&F#}å“Õ?OèÊNȪ§Ö©»Ó¡`Û=ö5ÌsÂ;ùÖ~ÿó‰¾Í@»×ôk¥ØÝülþr7ýb ÞŽàÿP=¬¸—{7o v?Ù·èý ¿LÒ°ƒKØòÒç–˜¯è ­î ÙV×Ùùÿú1hYa)Ê@Kˆ³ë»®–UÂÝSé{Cr²ôs¾uãµ´8éÿ VBϰmªˆûMçeðŸs¿à±™úkõ"&p·¸Øxï»”º²öÁsvúa›™-sŸ×[üßé=oæýéËËÇy}Ì*8Ƽ'Ž^£ÿ9B²ëè¶ãxÈ®ë ÿ8,†ïß¶ÌŠvØÃ[¿Ew³ù¯N¯ ‰Šw}¦Ñ¨»*ç4ÿ%„b7ÿm‘LtÌ'دu,iû­££Ôî{ì¹õÔÝï·ÙþG³cÕ;½x¸Ò?ûvoz²¼”'ôc_áKÿEG—•öPÇÝ`~ð'{Fêª c^íÙý_üÝž¡Õ.¾ŒVº‡zw:Æ0‚ÞeÏadÿ'éäÕ\úêÌê¸øÎg©è—ìpÜã¾çYúOж´Ú{=_WùÚ?D‹Ôîê8Xö5Ž©Î7Íq2ÏsÿI·c=¬vÍ–³þô_¢¸–ħ"2yŒpéê>™ÎtšªÛpŠÛû5ŸøÓÌ{½·g×ý¥ÿP¹Ü»·Þ>•u½íópiôÿγjôŸØ£þkþÁݧØ~ÿþ³ömèKpÁÎKõÜ´¯Åÿ:ÿÿÕèþ²ãý—ë n úž7iþ{Û¿7uØ™_æ`¬Lîš/ËÇˤVËXñö—ʆßcö7}ÎkY²–¹ÌÙþ“ô~§Ö¾ŸvoIu˜­/ÌÁ{rñX&^êýLý Å~F'ý}sY]õ²Úú­h²·x±Ã{þaXß„±æc¶A¯÷£é—üÞ7‰†Q~˜üG¥f%™âßUÞ…˜¶ï.Ø\Â6ÙO¸í¯Ôo·Õúh×ßF=.¿"ÆÓK>•0Ñàßå;÷Xßzª3Ý“íénCf–òF3~;ÏÒgXÇæñ?Eþ“.¥WÔ«ª×öÿÒÚ@mY÷¡®{xçgرi{ÛöoÑd~ÐõžõqÿXTÄ$t—èƒè=5„ Ò_¢>_ÓeeöW˜sÝC±ð. ¢ûn"·îkœÜL×ãmõ(Çý'Ùl³!ì»Óº›,Ǫ¼tÝOûëΡûf)^vXÝëÌW}¾Ês~ÏS?Jû}KjÉû=-W5®k™cCÚàZö›½ßàžúè­ÿ®ÿ=K*±›Õ02›v'P¨RÖ Ö7$KÃ}1ê·Ö÷RýÙlªý™5úôÿ…Vá*ù}QýßÒƒ©ðߊæäcî )à'ÕûЗèµRW,èmv.EÔ7³E`'ÖÛ‘ÿ³jø}B¬šqÆF;½jí³y¦Á‘¥»v} ý?´~ÿæ)a(̈ÄúBôœ¿üaäsÇ ’ý Cü/šPR–íx¥7d¸K1ÙÈã{÷{i§÷¯»ôh®ÀsXëró^*`.¢ÁCCZ78ºÏÖrí»+Qûn¬ ¶ç–׎Cêu–ŽÙ‘nC}oYõÚßA÷úž«ì§ý*±ôxL߈c‰¿ÞŸýÌ#ó'ª†aUffQÜý¿¦¶¶¹Á•ƒüÆ;c{™¿é»éä[úK6~ÓN997¿©X÷WMŒÓC]¾§7é šÝìs?–ÇUêúþ·é?í; ΟfNc³2Àkæ¦í6×YöºŸ»Òýèmÿ‘êâe~‡ÒV2òŸ[¾Ç†Z2Ã[.‰f;ö[c>«·ú'øOç,ý[ùË1Ôb<ƒ™)JDÎdï~2(srü¦WUFú°žÖnÛúê~Žçâ1þ½µzµ~šÊ?ÂÕé£S}9 /¥ûÃ׈-sOî[SöÙSÿã­âtì|.’쌬{×µŸdÞømŒ±Íu·3.¿Sü¥üí먒ٿ["Ÿ[Ñ¥‰Ó,êOÞ–mΆå ]5–Ù”÷mþy¯ôuã[ú/º¯ð~¢±,1'‹åùèÈÿU~lâ» ³ßü¾ÍEw?,ÂÙ.k\æ^Ú©w­s+ÛÿžÿœU:c™•—“ÔY¯ ¬0ⱎ÷YKM®ô][ÓSg«O³ü/AÕúVèÅÖd³í8M×íøí'k@Ü]›ˆÝöãíçèõñ¿Ò}‘Pì!í³Ü×´‚?œ×7Úÿë(4-ÜsÇ—†Xä bxŒkÕÆzɱÓ0ÎWéø Kl½·]¤GŒ»7ÿ&ËÙ‹ÿ¡ Ô—õ§‡¿+­³=WÓÉôÔ1lÏŶæf²:uM}£,Ù¸ÔÆ Í£ßúÆc[H÷dXÏSÖõ)ý/¥½ DHôÌ|Ð:z¿©ÿz¢,’=2ÇúßÕb󕇒Ìj[gQ©í}¢ Aɦ¦mgÓµÌnu£ýYsÙÿ —é§#¦õf?Á™[õip-¹› sE´»Ò˧k÷}&ìRÈ¡´Ùx¶Œ®­ÆXÚØ-ºªÅvÙ…Ó±ë¿õve9Úûr¿U£#';"ïæëS¾Š²2êÂêXÖäo­ïƳ2ºEí5ú_¢£;¥Yèdzž¥c1þË—G¡újí®ÏQhÃý¯pþÍ!½ÿ/ë6H—«ûÜ-VtlZ²Ù•SœÇ6ï]ì1µÎÛ{?3ÒÛý+þôuUüÒ|ÏùKÿ åÕa-7ý[Í­Ö6ŒŒÊ½"ö+ÉkKƒ^ g×}ßFÆÿ†X]RŒús°¶gz޲œ×;¡;pÚÇ1Žßì÷)¹hN\Æ0M@CòÉ›”„Ç3ŽR7\_ÞùdÛpkšZà××4ðC†×4ÿYª¿§ƒÓikîx©£‹òºÂv¶¯m¶îµîôke^àÙ³ÓUÆ?V·Ù®~{ð7?2šk¢íõk¬e?¿“Fúv~“ÕôÕÜ^ˆÊkÍûE4ääµÏ¬Ú\ë6×gÙï6åÞç=›]û®ôÿë~§§­7©”jëO^¿à»>à;/ñZ–fä]íÆ­'&Öiÿi±¬þkwýÈËÿ­ã-«ßSîê½.ÌÜl‘‡SŸhÆa`´Ûki»'>ÛfݶÛUµþ‹ÓÉÙú__þÓÖÆî™Ó¨k°œÌì²÷°ºÀ@ôþÐÚËú ~u9ߤÿØ•›‡Õ:§KvCú5卑õ».üF:×¶ªßž.mŸcõ^vÛö{jͶ¿Òþ“ùõ$áÁŒœgƒ]e/L¥àædF†˜Vì¬èØìçÑFP[½Ç+Ž;šÈe¾µÖ~ŠšÿX³eJÿ^ú­“Ññp¯Ïµ¹mÉqnIh ¯'éâý’ÏfCi{=\_Z×úÏÈô?šûO¢µ0.=#®þÖÊuv»¨ZÜ~£w£]^Ÿªí”[C™ÕCr¾ÏÌ‹r_e~ŽE×z˜ËSë7U¢Þ‰‚湤ìêYZöÖߤì*›kl©ù··÷™gØéý=¿¥û5vG.fdÇACæïþõªPÊ2G¨ë_½o5õ{¨uâü°õK>-‚¶c\FX6´7í·¬~Ý^#YéÕUUæWú^êÿÑÙnìNÔ®Ùi?Vz¶S¶úµE˜Y6<Æê\öÕOÛœÖþ{0z‡¬ÿûWS¾šÏªŽé·`ýa§«ºH,fE¬®›+©‰•mL¡õ»ôž…¿dÿµõ]þ‘SÂÌO³äî·©¶œ®¹øÆÇ· æRï§k±½_ÔgóßÎþŸÔP“r$G£. ÈÆ áËŽýq:oò—¾ÃÃÇÁħ žž>3UL’a¬7;ÜïhF\·Ô¶æN[ª½î赇M„ÙÔK2Ý‹uŸ¥û nÛ‹]O¶ÿÓÓ‘èz4z~§R›M_o×íØß‚ÿEÿ×õT’I8ßXºíJÙ‘‹`ÇêxÀýš÷ cšu³-÷Y‰vßøÊlýbŸÒV¹zì³{ê¾§ceÑ#æ\Â~‹Úñí»ÈýM£·þïR¦z Íë] «ÔÁkFM».¨ÖOÓhÜË)·ü>=Ͳ‹¿sÙZ«Íò‘Î,zr ¥ÿs6c—ŽaÚciÜÉâk鸵æ;2°[kÉu‚IyklvâïæÙcÙ]LÙWý·O¦<ÐrïfÛsCšñ¹Ž´Z–Úߣm85Ý_7ÿÏú]; þôUìÜn­Ó­ô2°Ý‘mŽ-ij®4ÞïðU¼þ‘Ý6Û7~“í«UúK+Ì»ÒzCn8{Üne_I¶²ÝÌ{ñì麛tö~Ð˯ô;?˜éؽŸð*·!Éd—1ŘÅUÅúGôxOõZPÅ8HÏ 7 !zÜ¿Gü!³¥u,kñU¼¶Œªnci{>Êöä:ÌL×;7¥ìöÖ2žŸ•ƒ¿ùºqÿšE»'&þ­cÙ‘n7Iqª«1›ê¼dZßÓdßCÎulm Â{1_]›ò2}_})ëÁêý.G¥œlœv3ÛE¬ôž^ÚÜßUÏ©í­ößs(õþ}öÿ8™ù=?;*Œ~§Òî«-î5cÝe\Hg¥ŸI¯&ÿI›?Gÿ þlÏ L%pã:ÿè̼`›EÃÑ/ïp§¯©µÍq£}VÜQ¨ì›êÌm6TßI¿£²æÅ.­çôË2ðvåãÙX§)¯-º²!ÇmsÚÿnöµûU¾£SGTêVÜêqë¯Ò¶ë’_oO¹ù—]KóÝêØÏõqª©Îû>NG¯fÏô¸uì ­Ë=C8_½¹bê[/¢ÖY‹‹gçþr©Ëâöó‚\~Ī¿½™— ŒrÆVw<1?Ýý' §õvu\L.›–Y‘ÒØ1nuNÝc¬ôëè÷g6·º¿ÒW—ˆú2?Wû¥ÿr±6BY¿¢`RÚ±ßkæSEV¼Ü×½ÛÏèeÑê7ß¡ê=Šå9™™½O«e:¾¥Š ØÌ¯µšß[Nfï³àú¸ø•²ßÒä>ÚýSùõ üï«6ZN[Û{šÐËMa ,ÛVK+w¥‘éý«}mÈõ¿ÃÂ(þõÁÌ ¸Äö”x?Dy:ðÄF2 ‰zÔœrqqzÏìî²íõbÞ*ϯö;sl­¯«ÓÈ®ºnnÛ-ôïÇýNG§mXÞ«ÿV»¥¯«Y“ÓË~¯ãá×Ñh{ØÎ[aËc\ædQçщöìgz´Uèßu·ìŒFëiY}C!÷ôK*ÂÁ~>6F3Ãn`¦£[.m·]éb‹_UT:¿W#ô>«)ý*»‰GIÆwN£¤f¡“SloUÊǃŽjp¿"†¾Æï§ÖÇͲªz}LµùaúÿàT¹y©æÄrX„ñšáù¸£%þ ¦°ãä#+Ÿ­=;þ’6·ü€þ‘ë~À};6f9Ö2íãec£7v]íúûE¾–GóTaú¬ª¯µ÷—tŽŒÖcãS ¿&¿cjk‹ýjñšÀÝ·þuW·ÔeÖzÿÍ[W¨•‚Æç7Ï}4ßcó0l¯oèò6¼u _Ó¶ê¿M]ögc~‹ô®z?ÑÔ®¾¬ o²tÚ[¾§²¦ÒÑìc­»óSn½Õ1öýŸí­»èõ,«×õ˜æ'ÈlGò Ìqá…j:JDñN_Ôƒ+kÂé˜t ñ…Å$b´€\׺ë=^×ú7Ù]vú;6z·~¯ú4>‘Òòú¯PuV<³¨ÚÉËɨAÂijùº1ÜẬÜêØßF«}Kq?O—ÿ‘,LÞ¡ÔK1Yêu;¯½ƒÓéøïs/®œ–T÷Q•œÇ±·cQ»íÿ¤[F/ó½çIé8}# bbAq²ëžw[m®þw'"Ïð—[ÿ¨ëôꮺӉ`æy€=0Ó¥ÐÿÐÛØôbãÕ‹ŽÁ]1µÕXá¬hØÆê´"¤’kAÿÐõT’I)$’IM^©Ó©ê;'§^÷×N]nªÇTí¯ pÚ펇Ô®;ªý^ê¸äÝk憆uNš6ä±­ géú[±ÿ£«Õé–zÞ—«]tz÷zÚH‰²ÙÀK~œbuN¨l}u6¾µUaζÌx§&¶·vöe`¼Têò}Íe8ÿffÿFÏÏV›õ‹ší¶ú²q~ÍWÚ,mµ ±¸Þ›¿u–}¤ú5îe^¦Å×õ‰Òz oÄ®÷°Ev¹±k5Ýú†m¾ŸúÕŒY¶ýT{dàõLª@!Ì«#fem îæ²ÌߤÝßÓT£1þZµåÊö£ÿ7þùä*éÝ6ÊK°‚Ú sì¦Û]Õ½®s÷äôÿQ¸_"‰ý[íøÔ_ú:}{2VçOe5õ®ƒV;·SK2k¬îÜv²Š*f÷~þÁïPÎú‹Ÿ}‚ç“föØ÷ nÄuŽnã¶û*¿7Ô­Î~뱞¯ç«]êÇQÁêx¹ÆÂÃÅÆ7½íźÛ\û.eTnÙ~=;=´{ßê¦ÜjT¿5цN8Y¿Ýìãô|\lž…Ò}z›i«‡W¼NÓé´iýoÎJ®«Ðñr¨Á  ,ºß³VI­¡Ísñ›ïsjý¬Ûq«¶¿Qž§«ZÒÁú¯õ›]€S)m…·¼Á±¯s”{·÷Ѫú—š-6?;özÖ;Œ°Ød:ï[6î¡ú_s¿Ié,ÁÊä$ñ /OS®y¬`úú\JzænCwQÒ²‹Ý>Žâ í6V÷^önô×Òïëÿì?®Ý7ªgåZ}w«žÀYÒñk6äR\gõÛ[¶Œ7û½'³2Úü×óvúÞ¯U_ÔÞ”ísìÈêfwmË´šôìì,³à¿ûx«g–ãâÔÊ(fŒª¦†1£ù,`kZ¥'Ò¡ýÝçOþõŠ\Ü¿Fôýïûؼ_PèXrp>ÛeuÑöK+ʯ§Uúl‹=' ÇfG¥FCªõk®Œ:Ÿê?ô/Î}XŸ êî_WÉûa¤ôÜrÃ_Û^ÀÌë?G·‚ì ]îýc'õÏôXØÿÏ®á%fŒ#ÃAïjC‹æ6Oé}ø8?˜˜U h¬CXßôž÷:_ew¾Ëlý%¯÷ج$’,*I$’SÿÙ8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMÿá8http://ns.adobe.com/xap/1.0/ 1 295 300 1 150/1 150/1 2 2007-07-13T13:02:02+02:00 2007-07-13T13:02:02+02:00 2007-07-13T13:02:02+02:00 Adobe Photoshop CS Macintosh uuid:d747b9af-32d2-11dc-84a7-c4efaea405a2 adobe:docid:photoshop:60020505-1ffd-11db-9d58-ef56d46c77e0 adobe:docid:photoshop:7582ff4d-32d3-11dc-84a7-c4efaea405a2 image/jpeg ÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿî!Adobed@ÿÛ„      ÿÂ,'ÿÄ    !10 @A24"PB3$%7#56 !1AQ"aq2#BR3 ‘0¡Ñbr‚ÒCS“$4´7@±’cD„”%•&vP¢sƒ³Ótu'ÁÂâTEµ6fg !1AQ"aq2‘¡±BR ðÁÑbr‚’#0²3@á¢CSs4ñÂÒc$P³â“ÿÚ ÷ïÀ"’ê2¯ïGQõ©¯zÁˆô²Xƒ½ä…BlóŒ©^H­^VÏA^ж Ü-U“žûgÇw€ä#nK¾S»Ou yØx,l¥\—3ü“Yß =+¡fó»8LŒõRr…®ÖR¦g‘lüCMñlÿÑCJ8¯ð¬¥’ê©ÆXo£d®aàV-ŸP•56²þl.¸Öð  Ò®<9zï;Ë}Ví¹ó|`໹L‚¼âÂHmÅñ «0"ÜÓ-Ï_|؃{ÓèMZ`vsU=D„s¾ïÑ’½:ºSÞð\yíÄ×´yZ‘‡}~.$ Úiä ðä‰0ý“ö&å.WèZyçPºuþÓ‘jÞ‚~ï­È׫T_sȶ»úræI&4—›¹¸7v/À{KðWO9ö›•*E£ž€R;Z,<³îÀ˜û_¤gÔî¦! H*%Éní×^•ÊM¾Í­8>4!žj—ð²G8 h·ŽÜóùO¨ù»¿6Óè&îõøhCÏ|EÅ¢ÊÔRJžÁË©QêÂKŽ˜ŽùówV6ÆùQl®þ¹Øû”,eVÁ t†áº°É˜Jxµ^LÍÎÍ» r×O<¢úMqéZ‘fC¼…^3å¤ôM¿gË›ô#v7®œYʶg^³ØHòü~Bv“Ûù|)}’·+\ëŠîËt[ËGkWæ#÷xÎÖëU@;O%¢lì‘ê>à é¯ÌlÛÃÛ:#ªQ¢WÚÏÉö‹›à?°Ö$ý&×Ðì •ëçå×0—E|.}K¾{ÞyèM´BéËûHîƒÇó«u¢6ZYvi¬¿}6g#—ãØjARêµ÷‰å¾zJIY6¶ô>Õ‹¤4É‚Í(wIm+3¹õd³þ„ozl¾ 3¾ãÔ'Õ&Ópksù#k›ÄJ³dã ˆæ‰ïšš‡“ç_Ú¦²ŠR #3\tDXSÒ°§‘ï(["†VÎ×n,˜ù}ÍÕ¨1ë>¶8VÌ»“ž©HôZíÍÏçÔ¶š÷vƒ Pv«·è_Ö?7óþ1óF²Áu³ñú]¨¯IpFœ]húÌñ–ŸyY,Tùã)+lÕ(‚ÎF'¿ž™Ò½üõTlô"Í­ýRù#AÚ)í6sXgxÚmoè/+ñaú2veq¶}¶qx/¬IT€Åìg2—æt@9q˜ÐnD„èŠså^•¤IÛl ™8Jù=W¹5+òBz)eb“ê{93JsŽr´KF…r6{½a±ÓŸvvô\ê1Å&ÇÐÞ*gcQ; L_Hœœû”‹ødä^ÃmNýÇáY€ñÏ6~^Á6I'zå“Ã×s“𾓒I\5Ö°%mž¡¦«.©êŸxe$}¡eq`0½7ÑGg¶Þ&¥”ƒtDX"NXÕ»®w>Ôn[÷/j<úß¼ÐiË,òì>ÒqùãÓ¨š/yÉVTüíŠ×‹4îÉõ++,fÙ½ ÓëÕjÓ¬=êÎèQúÛ¬S‹ìdÉæÀ„I†kq¨’è{u/U¦Ñ4²^˜o5ÿ£°ïÚî"¿N%æ½£?ªÙ(ìSØ6ô?$2ÚÆ?šQûõÂßRªõnÝc|×aY±QÈK<ÛÀϳ†7}R{GÐó7ßi¥^Ñ›ìî{O.À/^Øùs+J`‚°²ô¦°½7^N|íilÑy}õ…Ï)%t‚ÖNƒÅmkM}¸µ.Òˆq/b۳νþeŽø¥‡eSÌú™[-3öµ Iï–ëÍŸÓ@®WËqÌm@±ZPÕš×÷Dß›UA—Æ2¸´)x)’Pî®ùËâ²$¤³8â>¤máƒÞ—ó}¢¶å¼~ØÎt *ëJE‚slG¡Y²n+öõÒ|váoÏ8Óš§\JÎ˺ ¢8;Z´« cW'¬Oh˜t·õ wáüx‚°ŒöM——:lòü­é?“™¾WÖ{k2Fn*¬CrýólŸ«<|Äwª^[T^®-a­Ü;¿À|Eû›óg’_:bô7>CŽ÷€»i“ó_ SrR»ß‘yïÒ߃ŸAV%2[!¦ë=µÍò¾£Û$ÛÚV/Qb¶³6Ú\€ûçq/ÿ+/ˆû´ŠÛŽ'O5Þ8"«9–±ÃcU ëieEGõw»ü9à¢5ª©_´Ùéw†ÕþZjÕÀ×)]Ïíɧ¯ øC€[¹«Ï[س8· ¹È-Ÿ;Zxk.ö²ëϹ³Ý‡¼ö™F¹ötá¶ô»5Y·ü~5ì³lö°%â…ü·€ìSð’ž—lÃFDºiÄFÄÞ:ª7Û-¦ñ_FJLc÷Ó]Œ}J¶ý­2õôS™%Š´fªÄÚkÅdi«þXt5‰§˜kôÌoân!•°sÊXc{ô„±MÊ™¶jDFÕý*ÈöB´MÏî’IåY,[rö_ê)§+/Š…Ô`²y-ƒ1}ÉÄV´c;‚ʯ'Xä"\z…%¾j·S[ηˆÂÓŽe+3B­ú'Àw€œu¸UOÎ8—'³²úµ”„¿ykiõ®ï>aï¦ô whºõ18¯}!k k’d§d§ò=&—ºÌ1”úõ§ç„*Qó¯KØU¤P#¤z KŸÖ¥ØoêQ—6œæ…¾×¤ ÙÀ²Q¸°hR>wÂlK, !P1;Öè«eäk-®Ãzsêoß9~í~šx¡¦QZ¯=bù:Îc1lÎ1·ý]%ê‰Øè|¤ìQöóÒ•¥ôV¾êÚǯë?‚G¤ª­Ï¬ÇX(VÕQÅÚš¹¾þcð¦Ñä P‘uçæÜ?b’u¢Õ`uÀΦ$¾;Û Z‚à1ýz¥šÕé‘â%ÇÀj”VáÄcoúºKÕ8˜®íLfR©û½˜×<‹·J§-2>ÄeõÏ/mÒª‡S·†‰¥ÉÒͯšE„ïÆü¶… ÇóL§wkM®§Ö—2oÖ’²‚§]€ÊÈ|i7{÷Ѷ1Øè±èðÞáhn»ô>Õ×ur i&QbÏ©f¢Û-|òÃÔ"ûb;'÷çÔæì¨g]V?nɾD«¬à ?ʽ" Ü<Áò9õ§væ¦\¬×2TÒ®ªŽjSêÛ=•w°Ù]:ç”4»­»¥nrlÞš}e¹XZ¬jÊaÕÕh”eqeýÖ¹‡_ËP×w BzHžSçb»!È›áã/óåM«îɹGõ•p(§æ6ÏjU¸ó—öÉ9i*UµMÞÙÛtœ¤¡îv—L«8„å‘…ó‡ãÂ3…ú‹köÃ+‚¨y†¥VvÊïÆœ×[¨yÅ ¦…ãúóïJçÔÄ3v¬O«Zuæùí/œÏl…A?2p¬š}Iª®UD'ÓºýÉÑiJ8ùW{\òË‘ ”’­CjΪœu½Ã4µ…ê§cl5?#Z-b=Ã5Êù©Q¥ö Iâ:YéËÓÜÕgJ»"úßç%s €-¸y[”çÛüŸ;Li×ÇïÑœP§ïqßwlu\÷ZágwÒÖƒEpɆµ'©Wx”,ÞTL¾bjvs´é<—ÐüºY{K¿,6,¿ØõHG–XÜŒôïÆGdàÖ{×!ª5¢6Ie¯Y¹¨¢k YHl{Ľ þ5][ñ¹ÖÔ]ƒ7ÚÐÒ‘X]óÇFÛ µÚ‹…`eTíµCLœÛæRž!§õ;Î^ÿÌGеÒV¯àÎrÕæî>D¢H(|aŒ½šµgiÚ.ÀÇÃwn;Ìß>£ #pÝLù„é³™ Õ ú’ÞµkXéf^ ò‰>8+¾…¨ï!Çqy=ä?i¸Ý2Ϩj,,7vÕ¨Ÿžöª“Ú6SOí?¹¸+—5 r§àå*ã›ÃÖÀÓ‚IÔtQÔj©ïWfÚ‚º,i7²¨ïß2—ÉÅX ÷—xÿÚýC®Bû´[Lw´‘ q²ßŸ½K"í’‹= é—RkYg› Ù”Å¶Ó äK¬ItÕ/ðÂ=²^ÆÆ,²Û9uqü»ÇãÔ((Â~´º ‹>À¨Y\24RŒkíMx·Ñ Æì—Í n•ÀÿÁÊL5ŒJáv~šÇ9ŽlŽYò­*Ê(PmÌ 3ÙWóåtÊûù°ÿÈ$åd…µ¶]¾ÅEp Ýâ É `EØ¿­ç‹¶ËÃd-œ±?€´ßQŽò*×ÿ)‚f`“Û!}7ž˜ŒW9Âð‹ÅO Y ¿þæ"¢ª3m"¢ˆ¨Undmʬ É *ÕùßÅ­5}ˆEÄ ¨cBÝ~3ŽZ*éDqî}’i¨R †"')¸]² gf“~º–C'³®Ü¸„0}ÂlCî‹¥Q;+¼‚ 3¶&àÖ©ž>ÊËtÑ­Dгxú)´¡k–—°XÙÊnSý#˜K¡¤M‘Ñ ¾#©ÐÄ]‹žåx˜ Ô0åè°‚zø>ÌÁ¶6$yïW# RhŠÄ¡Ûšm0~ÆãXfã$«ÏãC6QʶG £Ø¬Åh‰·‡n ¨T„é«vG5×-\¦å?Ñ¿[…Á²:4]d´ºm’J8R^ñç EÌqfÉïã£ðП¹`Í“t—`ݳ PxÊ©g1ØÆË3cPƒQÅ=ÓpFZE‰"Db¯4MALìlîäSœ`ýlAwQN“P’$R-9–”»Y¢V!€Áñß­#ŽG×Uv”‘Ô‹\LÞ³§J9S _¦Ýi 1pk3£6N»*ÿ­G¥„ežÇ†Ç›Ê!\R²Á\RV8P°@‘‰Èµdà ¼3I€U3&h R޲@e¾Y’èºn¡dZ’awi|s2©F4~ùWËÄC«$e$›Ç²Us.R@´UU;–ñdSÇË ïØ á»Uc¬lkéÑNA!º¢ºˆ™u›?É(¹š±³™Â’õá*g23ÅxÍfkUeÌ°Ø šÆ’YHÇmjîTíÑwUŸ,Ã/†ãh!Ý«_Mà$ªÍUp¹×R=ñ™ªåÀ®¤B¬›#5" ³e\ªÆ1´>,±Ö>7ˆ]EŠD‰rD޲€ %ß5§6TNÑR°sª#Ü(ÞÅ·˜ÆÒ¯#T‘­ÓeœIDΉâæ¼zZ®ä®‚¹¬»PMcÛ€÷ø,2ÁÄÆ L%»¢øW•I>­ZªéTJ!,bÄîÎtÐE³æTÇPÇZ,¶ ðÐË‹6UI‰™œÉL 2Eø:nfêã†ȩ́ìÑëÍÄy'.€L´Êƽ‘›Õ:½OÀývL§ª¿VoVf¡Õ”É8W1ãŒ}™¾;bVå{$ƒrCYW•T²hÛ áSB¸T áƒG8ú¾² I'$ƯHñ1‚QÉ6xng˘µF ¼„ÖqË$r÷PÂPDýÇÈ8²oŒùÓ6Âågðʳ!J'R:FÈùw ‚"=â\Šâ3Ф"‹©› 0‰‡â)„£!›ì9 ™(%kŒ½oY®·jéãFH³LÀü@ ÷)°C¾ |G.o½¤^VL²jÙÓZHž´ó±]Ɔ8¸@­Mø‰‡€@@c#Â=0Ò–Ž÷éäEEÃ¼ŽˆlÀ‚>#ÐÝŠ ÈCù‡~Øä½›9×dr¸ÙûQz .+*ûvóR~ã*MÀïÂaÀc °DDRb')ÃÄÝ󾮟¤§|ï„KÈð¦ŒDK!8n‚Áw.wÄØÆ0!ÇòÍ¿œŽ5›l’i(<’ÆB7¤^Œf4\ÚEÈ8\ˆûtGòT‰¢_$Ê@\UºPÂs:$"i·€ÆGÀŠ”K!—ðWª#ØýÂSœ@/‘±ÐwO¾]Ôó—ꥑê¨ôH¾œzóRpéˆF  9Pþg¹X ÍT“Xþ`s}uYÛ;g`ê™<Î@ì ˆD@>géê¶yÔÅ?§þ]ŒßÓ’'’ì£NÁ"jÏ‘šºB+ëEcD ù”EP\#S)Ìì‡ñ4j  2QB"Øé¨”z‡)(c.ÜÈH„E°C¸€÷ă¹ú@Év1ÈöO¶læ¿éÊÚÊ%•:§Œ0¼‹éQ_»Œoî\cØ“µN ǘtb¹ €a^'î )¬Šë‘'pA)_Ôx¿¨=#ú ý„…î=ûbظ©¼J™ æ ˜ýúròËÜÅeef K R‘Ô‚ìjù<Ä: <1Æn…²§ne›”ÂQAÑ^§ð&ñdÊaÁÀL?LÂR€ƒË;v詾hýD¾%ÇFî|]¬›Ö†hº*ŠGž”AáXº3Eæ%Ï$|cáò‘Ù4Ä29É@îA³•¨ÙtÞô#âDâR@çÄÈ#ÛŒr)Àn‚8"‡¨n†7‘ºlX¿n÷ªi™C: ôÚ®!Ä‚‹²Ê7Æ’jˆ¿€‡ yŸ ,(ô( …µÕÆ‘i¡ŸL0‰üò.8_*uÒDÏáÐu.ÌpÅSì8àþ$íÖ×÷6ASRpJÆÐ1 AÈé˜.‹´q¬ª e¤øî¹€D)—iƒ9µ”X‘èÀ\L#„OåŒÙ¨ñDˆÞ9[îRH%¢O°&©“Äœý\ŸÈÿ¢ ¹d=ãÌtígjd3ôÚ-b` 9$¼zÍBP¸šÇOÌÍ$š.I袔÷%úaÃæ ÷”#ã|dÎÎ4[ƒ¤±M©È Ì$ S3èM ÜpbaÜÃá°ÃUšè2’NHùŸ´RI pú9W&èC˜†`otÉx•ˆ^†Tç,÷%úuE%3ÐK¼ö T0œÕWÂI’o¨éZ£ÐY_„ 8$Àì?þ´*—XéÈ'8Ýë_j´DÀ4 ‘|g Ôn¥~,$d4#Ö¢w¥TE«%3í>XÊ!r®BA6.”ÄkÏÆõ” ‰¤šVTS@®¼@SQTtñgJaNbeÕXÝÄ0¦ò Ü¿€.uaŒW½UšÉ¤Y¶Ê¢t…«Ã· Y´6dÇíŒê z¸xQíeft^-d̼aÒ+ ÿ¸Eb¤ÙŸ{ÃMƒü2.)휺3(õTç„¥ ¤0œT—|!{bð¡âaî?†É¸NÓVR\fà¨*îtŽ“Ê4¿vþ%7®Æ9ÙŽ-š[Ý>FAdð®Ì ±þáãc9Žr· ’ÖgÊYN­ Ô*a+!웽‘pìW|‚ÂË ca Û;`ž{è9l›”í4åbÇ¢u*•ò³@åL@bó™)Ì’õÖªcªÒ‰£ hWi¬Ú}‰°*ÉÙ¦áŒÁJ3ÅZ3Yc,#{nÖ~)dPrEH¤¿oò.ØRvϦÏ@€úF(,´!Q3&mwæx澂k b‰$º.©Uhй%؈TCÔ\ÐʆwÃs dµŒÏÒi&å 8~áÆ3LN¼¼‚ei"­ ä…‹,öÁØ=ÄD@¸ú³Õ†’Ä­E•$Û¼ò6(‰‡íÐU3Ý^¸W+%TŽü¼‹üš"Uœ+×P¦AxÑ y$g !mj)ÍÙ=âyS”õÑ0öÀ"&Îß®ÑùÛN‹’€.Ø~Sbj‘@ÇÑF1ÒŒXæ(ý õ1„È7Qs9r™¼I„² ¶.1ˆró!ëɰ7|÷Àà‘Y,MãS‰¢ ™©Á:­L¤‰ƒwêò7Õ()ê¶n²’ ¦é«·Ë⯜"ʴѶ@:vþ·lMâäÂË®I"”ßy/oåøaDILG©²&!Ñ€ÄÿÿÚýPLG,Ã<¡‹ÛÄ£‚™pRÁLpC·ñAÀ0áñÆ€àç|¢8RQùg|ùŽvÀ3}Ð2D6+ÑLZ²ØØ½eÁ1vª =»`€l1D?"}ð¶}§o˜Ná‚=°ßF_ô1Iƒ”¥YFå)Êlåqº¸ö1v˜Û;÷Ã'úäO·_®AÙüʰ0 ôeý¾"«B·9Š1-¹‘G$”1ñým3È#ý0Ä`‡oÔ!~6°çãk ,‘0ÿtCI“ŒV€&~vNì&Já'¸SüYS,sÿP« EÉ#vJwíŠã){ˆlíŸÏçÓ¿~´çO±Яۦܘöm“#&¡T/W-’rEkfm‰Ü»I2;ØÃ°V"Ä”fÈ÷ʹìˆñ'¾#ðËÛ”fú&ÆÒD>¡ñVèçv Û$ÝŽl§¨ˆ€„2žœŸK*ú‹•]tJ|œOÔaß,E9¤}#碦z*g¢¦z g ¦K‡‰˜N¼àœ ®›‚ö}z0´OÎ(ƒôWïñÝ£å™ÈäLáÔÓˆ+ÛÉ)ÚmÄÁ:wIéãÔÒQ‰›Åç‘s̸ù³Ï$©&1-Ç=BcÓÍÿ”ì»Ô_}õþ}ñþ}ñþ}ñþ}íþ}íþMTV4Îâi/ÖËV}zXW`ñk—»ƒVR¶-c”„T’Õ'Q¥@‘ÏZÁFB2~­f,¤§¨L/Õ3ù‹ßmÑÏ4*eƒt-_2tWhtî9)R7½Ç§qÎãóÈz˽LšH‹ôŽs·1ŒH”ýI.Ÿsoég¹ûžL©é±íò»%âü¼•jÄÍIr¶Q‰«ŒÐ3ô Ci›!fký6t‚ìЪ=hUÛìÈÕ)zbÁ䍛-†Å’î® ‘oao.^›*De‡(ª¡G¸TÑõጫ&ío¨ÃKÊe½oJ+/ˆw.Aªpjª‡9ؘ\°éoPøØ]9ÇÐÇh–“»°eú ì¢l›W¨Hš¾å7ðÒÐPNå ×Ú+ã1¦@80Æä¸Ì?pð;$üÌ"•¢›,š~ šB²lW²® p«MŠçÁŽ[úñÙ«” UáÖ'”ÚžNq%L‘åS(¨ÉصT팻rœJ:Wf’]·Á!Lˆ]»d›'ð_làà@;k$¹‘H©­ŒíR©—&\˜VÈAByÀe}™[3ÍŠóÔ{ЦUHé¹›ª’ž™åߤä­ u¤¤ŒøØÑ’ÎŽÝ ˆ€€Å»/›–$02z³%µŽèm2Ÿ~ÿˆZob°&™S+—"\bØ¥(ˆ@Γ–OÐzž,ŠkeSl“Ô,ç@2að¾yÒìÃÑuÔ„1̨´rª,B˜J.{?KË,a‘Œ€‡1‘¼% ‚··kóEAt×/l펤ز[5¾MXd&pz¡»@ãŽcå ¢ªÔ‹¹”ØSÓTÝ$έ—ËŒ—²Žëa÷ìú7‰0ò¥nV‘©*‘Š%dñFŠºjš©ã9u@ÊÇ£ wMTlbˆ€±³I±Í«dõ~äýRªg2«¦ˆÚe ¬u³ )qÛ±î_ DÄT)@¡"ã°BÙÞEŒ%­œ§[Ü·»}ðOÖÕ+ÏrÕŽ8r£ƒäc²7Vi§¹(‡aÆoUh§¶IðvÄ—:`Æp€t‘fà’mPA(ßî’þŒvCÓf&"I"ˆöÅž™\$€,Ÿ¨DQ*@ªäK2*â³&tòôé–H[Ú<ÆÁ3Yʤd‘MS\®Û{e"ž¦ ;du‡¡$Ñ#¶®¡D:cœ±¿Ý%ýV~™à¢øé_E3L1‹,±R*Ê™SF­Ü¬Y{×.ã:Jb–²`Åqƒõ ‰ªdÅp$ª.ôŽ“à³T™dN‰áصȚ¯Ö4;Æøª©®'Šd¦ãŒ`ÂrHFH£†v¹ðÉL)J@3žøR ÄV=RcN\(ý' +ŒÛ*ågè9dᥞA¸ÂKI¼µy¬ˆL×\FÂ!ß,õñ`¦4tvª‘0”AD̘·rdBBU' Ûض†r›féZÿÕ,%YebÌC/tÁ˜ó”àRSæÑØ/‚UT7¦¢‚Š)„{™.@µE—XßpÕ¹ë•òÆ'v‰2频Ö<yaÙ€BÓ5÷È‘bX+êF©–Tq,WÊ”O¼r³v¯…xc ‚i™C.C|ªxW&ðgÿ]TÅD +*Þ²ÅÈ3#7" åoD‹8:¢ƒ×,eäxWlC-Œ¡™²4¬ §ñâÕ26nÜV\eU´K‘Š ²$X– Ê‘ãÑ$Œ©üI ™•(…Ï¥[2 ºÐ ŽkÇL­Yªä[ú"¤xˆÒÉ‰àæ‹ ­ÉÓzc˜âÚ=Ò­ÑM$ltŽ—âÅVE³v‘iÊIŠ D0ÇÐ;ƒKI#‚ŠC~ˆ€NS»áÈb•äi©v»w%9TŠÎ7p†0štäñ/JÔ…µ¤8< QÄ"+E`«È¶Ï»íñêž-Ü®OF« t\È·:„'àÎ<ˆ ǤlW&p²Òrm ›ºt£•?R^ ´‰e\nãÁ2bNK•+·(,‘Z*ƒHv‡]A(”Á2 Ï-íÓ;Çjœù³ù5¡´âÎ9y°m¸âKœVü[Dl‰üW‡ºyøn>qª¿¨Aq3]ñ¶›ª¸É.Õµ(°©Ç¹æy³~Sk®\qãgÈÿ ùó(ÆsÜЊ²¾}¬·¾ÙÍw¥õ>§DDDpL'¶A%pßeh¸NGñ&Ý¢okpSp<Ÿâg²Ü1{Ùµº/’ÛNv½·4‡"êðznéCiÌ ¹=rÍ]¸Bÿµy]U²k*ÛÞ\ר0cǰöÙ»Z©ë—^AÄh[¤£Fqf:ÍCã¾§£Ð·Ò ‰Ôé(¨@C$ `æc­PÔ¶ õ›ŽRUö¼z¤ÎRµ¶o™¹I„bµ]£K)TÙÐÛ…†¾ÛûCI¨Å’÷]½ª;λú[ckS4½‘Gºì»¦m×[Õr• q±y97^®AU#9 Áî³°ª•zã_×:C^k»+‘:_R¯%ËMcNÜä8G:UYšK—:V¤‹elKOÏÇ‚hrZ¼ï}‹ZÊ&çÕÛ-AÃ97Z…Ñp²“YP¶ÀÞ«û YVö3FWÇ3c²-ÄØÛ=Xv4>ò¯ï*¯èZ-êUr’ÊÅÈ[Þlí¦• ºcKNl)y‰ší.Jnè­Ã»vîЄ۟í"F~c€QÝ:Ï_ÔnVfž†ÓûRÅUÖ7Iý|ûÖkT>²ÚÍo°/Û‰e9:ÂÂnEþ#nROBo8˜ómílúWcÆr6ôýš2,mº­åuEËXCä¤U#lRªvåé‹Eí«v¦Ò¦[`¬ÚŸiÔ7= ãØsÊݳ›'“•}yiÕÌà÷Ü>ÏØqº²’F÷þRlZB“œŸÕ»‹I¸E_j­ô‚››KÒN}‹¼§ðñ‚”Á×›lÿìt@‘|„ŠÂlÛ‰mÝ%°_KŤ»Í1¬nÁ%¥¹Ö7f^ô©Ø?g"Ïrqæ¹£·ìñvª­zï]‚^á2–³·Íq¾á7$¯vš*¤á/‡•ÛNË[ƒ×”*Þ¯¥n­ÝXÒ1‘ÚÂý¹7ƬԘ×ÌrçjECÖê[qìù-YF—{íÅ­3})«'n懅‡®°ËfÖÖôWl^7‘d â=§ ìñèë;= j–ín{õ»­k°úÓv¢êY&6>;¬Ù n0<†ÖŒáÛé¿xÙ²;'_ÇìŠÎÇÙ6]³¦u }êÉ«x§k•×V?‚BA”K/®»öýQå»úŠòÐõ=X­WbêUý•¯cö]n¥[B£]Ý1;žõmÐÚÍår2Ùl­Qk—Ý©°ù$0PÕ¨¯¦Y÷M6KnÛ[7%NRÁ ºû·Mkýšz¦€®ìHF¬®u‡»Ê«´kVVâb­ÀÛbK]4@Në­w´bhÛéJ' »Ð³,_GLÇlg°©{b³*öri/%ªì;›JرÙöVÑ­v skP:óâîéÍU»vÌÛ®‚›ÂÔoZyæ¯åu.ã2 =.úÕ¯?=häm—æ#°¯Ñšî”¥ÆÍr¢ñÅ”k¨èõ§.5¹ÈM Àí¹£\ÙU³Z·4Êí¤$Ù9ƒ¾[µBÕ;++ms1–Ò»¶×cUõ.ͲšîHÚ>ø#›’5:„”äU¿haXׂrí›2AH*׸GÛèW_t t\~ÖQ/¯Mx!'²¬ïK[㸊ÀCˆv½ìàÛy³Ýûmø¢ÃJ›Wö»3H[~îcµå“”€Ñï6TU×£Ò~;ÉÃz²Fi«ÃU’~ÊŽÅJº½9#=+«f+©Ê°ämû›6ëªVlÖÝ‘^·Ôì[ö¥_–“ÛF”«ä5å—–Ãf‘þ¡›Œ{p»0r«Ö+Ÿï{ÓY6ÈÁÉFÛgýGÖÁ9¸3k´VV‘öæ¿lÛ‘fªs+9¾ÌˆŽ‹ˆ‹ØÉDÞÿË9‘á"€J`¶¥«h¹®·Ü&dzoˆcÖ&û”Á›Ê•i¹2ƒgµžãÍQuWMÈ7·Ð6-*“c¹iÖ:þ΄̎“¶)TÔ4WT±EE-9­…ýïnEÖmZz¸Y¹eVE²:Œ“„Í™kN—IÖ5Šªù/g„Ó Y6R †çÈçã§ÐÔîGéÈÞ;ò^aF ðï‹¢ ·Vµ&ˆä+ø';éhÖ´[„zïýšºåÇ^@;øDÁ³5Á¸»µ¾™#2Öº´Ï­õ åÕͧªº¯o²ë¦Ps‘6X½w’¦UâS«èJæÝX´øþœ2IÖñM»3›?yR$µµ_ZÕ\ûí»¡Zõ¼'ƹ”µ ~>-(=³fÛúDQÖºýÆ6U'ù Æ>NëÛ⤛Kç=žégT.)ñ³Œv.ÃÁ,J%®JÈÒÇ­#e,¿˜·š•‹áÚz¹(QÉ\µß.uKåm䋾?]£¥#&²ÕclÎ5ž´ÓîzÌŸå;ý§aÚõß&T“åìbv4ŠLeõ3ÈÇózÞ^¶èY_ðä$Ë(-uFã,ö|M²±°õuñ´æ¢Öu³\5F·c²vÕvvœåË8æ´]ݸé\z«Õëz–í>¾§ºïIд¥6¹l™µ;¶8Ñ»bs/@QjÇO«MHª'Kˆ´î]‰ñr BÖ7ý* rÓ iË\#«cLIÓ¦Ä{ŽÃ+Û”¥`4m†GaÅîÚ&ÍŸ‡ªBi7VG“Û,A[Úd º¾Zqôt„¦ Û|±BC‹/¸Ë­¬ïmUtõfØ}%Œ»é0[U~ÞÚª}“Ïí[NJc‡L¦ Â^ç²)š{ZëÉ¿µ^B'£µ«½{O SœÍXäš³¬TÛ((zÄ'Ç¿¸÷Läd²—={sé//_‰…¯M\Ò°1×óMqÙ·Ûy9 d%OY\îî+o=:Òá°k4eöÎê¦JkJ¦Ài\ÒÚ»bmk½ßg ÆœväŸ*ÕÒ¿·7’¨Svu‹T»ä–ÌØÚÚ•%Kœ¨B^·¶°…ŠÖÚn?oíeeÚk=P;ÇŒãšßÑ—ºHF×ÕåtF‘ªè-ú;[Qëý×OØ´£Åµ˜?c*Æ÷%\²Y5rÊÞ>õ®§ëóµþMÇ­#¯¶uOc@Ü´v¡¾ºäN¨Š£jKŸgP7'ù_œ,J<š¾=à"[C›.Û£³m[ó§µÞÇOÔz„}8HeÄšŒ¾Ù¿o­m¡wžó¡Jܪ©ýÏl6¥khJš÷kÄm&:ÒµþÃolÑ ñÃŽš½új¢“„¶'~Ï7[ÖEæ¬ÞÎmq±Ñ©öì±ñ£™=]­ö• ñ#²iwîFrŽèÒ¨ÚA¼´3íû9lKL­#TÉò”*³ý»¬Óíõ–ù¾YhèRÕ»s’z.†õ¾ÝÚ÷¯ž*Ü4æéÛ6yªf»B.«¸lôèyÉ ã­3@Àþµ‹‹Û“E¹1µŽÊ™oÝ Mä½rlõ[•JóЉ¹#ʳ_ÉL6‚²ÑŠÕ»¶aãû9±ù0dÁ„b_ë>Z®5J<{-Ù¬GÜù„®˜˜ÜrùnÜTª”Ç!õO$&uDíº±X¯kE¶¹(ž³Õô-=Pþji-Q»!æø“ºõÐØàª4™*n Ò×o´eÉ—Ҝټs”´ržv9ív!±'ÙÕö”dÜU·v KÜ,:Bÿ­¸ÑKZŸDwnØ8Û·ÁÕšGSé8‰æ2ñúw{VÌÿ ‰xœ‡}×”ËÆÃ+þ!DY´íÚU£Œúë‚Ú/n¦ö°ªþ"¯b'Ò YG¼JµÄB‰€#OÊÙæ ñ¸.£±IÈn5 x]$‘…¹< E8jíõU¥{vÜÞð*OM„°ŒEiæ9vR0:X7¨…ýêÍÐw8)ë2¿â ÈÀƒ´‘‡ö‰¿pðæÇ±F>˜tW”¶|OÄ{”pŽýU<ÅÖ~¢xGbøG£äÑÀ,ý¢ ˆì¹÷S÷…^¿bØ$µÈ:“'Ô'Å ÁÃh4å]ÀÕŒ'QV@œŠ,ua@óYc éÖHmKá,ú´ˆ‚3¢œÄkk‹,Áé˜L+ XêDE\{7gBƒÂC¬³4,’§…tNÖ$ÆQW’ºÅ-È,§I%cÌà™`„Ã@‰5åó–ÅÀ3ÃCŽèÒ(í -\‡>ãp·p÷¿ ?Ù<Þa›ÏR‹Îø£Ëòÿ¦„bά$2œ”®/µE˜’NdâOiè[vlj‚ê8(c-ó4¯vâ¢êÆ%¡C‹LÚ¼1ðê’1¢ÆÔTƒ¨ƒâ¥t À¥ÄSŸ5jKAÇ– ÀËHvÄ<陕x±¥å…²±£ÞF€W`F¹––8×/þê~ð®cý×ýãRŽËØHö„ænFâÚÇ¡õ Žk—±{¯G–ßšÞŸa¬EÞU·ázßý·®‹r·Sœ·2tïj ¬å8зÏ,:e†:”»™hԺݕtž¶Ú/˾²³Ÿp´k>S€5%§J…Êh'6rØ x¼j¯áãÇ8Á^{«U‡’3Sƒ/jý"W¯û ±ËEËÛ~ûÛÏÙˆì£{˜rîvŸ`Ô0£Ëç{–­ïkYÜN²ž5êÔ:,\ hÙ¶ªZÙ¬÷2¸§ XâU‰Ðm£c—N *%ãV¥æ¸+ª&O†s4C»6³%FE·è^늶«± |R`Õ;kA¶A’1€$0C‰ûL£¾r­:'V©YÕ£L˜lÁœÅXeÔýá\Çû¯ûÇ¢ÄÞ!/€È dü˧8Hò×&=F•?¦Û¸ ­ÆC´iÒÜ™Åc<¦¡ÔŒód`ú®–âêCš‘*{Táéú…µæWâ<7‡eщìpÔßÿ“|¶¡ÅaánÆÐ‚èŒ Sª0Šk|ú l£¨¸H×B <:‰‚—˜³w&€A!Ñ£PS°jÒHé4¶9èVÈ>Jß{á=~·MHý©,` n[‘hLšàͺ“rý¬ÎÈзiu1ùâNuœ(8.ÚlŽñ˜=G#¼Ró<¸‹Æ¥û'ß·Úþ¨Q$ìÓ5Æ‹5hUm|6ˆ¹0%Î*Úg~um'ùnd6¶Ð Å ¶µ·‰xð“ºh_¶…L%Á+î¸÷´'tÕÐK]¸®cÀ c : ·`0¦¿æ2“0#J±Õ¤Da?]rÿî§ï æ?ÝÞ= q«&*A2½›¨Ýr· Óâ|°þŒ$™Cm¼¾bÚÚ„ ¾m±{V¦ºöýâÚŸaÓ#8£äG“mVݸºTfÈ3hëèêWÄÚå þ¥ãü4ôñ¶åuåÿU_2rº  ©>«ˆ>Ä Z½pÿ3É‚t²“§‹0F`²˜˜‰ÛO“'_\ÝÒc+­ p*¨8ŒãKgžFò O‰4˜hÚÈcò”·-°ea ŒA_³,LG•åLXŸõ?þ‡½™Ø:Ѐ-€NzŠíÐâ+´SYå!‹“”a\|µË'}»š‡å¸ïWÿ'8³ðÞSi¿7H­\ŦU90âCØë+ëè[V†§rÉÀU¿é¼¹Õo—D™xÿûàN¡×Mfð†ChœârÛE­Q°tlmÜ™}‡1°Ñ翦 ›a¸™†–¯h‚F¡Ä»jåë×B2¬"´A†²O !Ìç#Œ·-ÌåÌ:æPüK³´dî -ÛLXH#"Ïè?²nG–nƒ°÷À>È÷¾#†CÔÌØ`¥ŽÚýd¡Ýu0üé?»Bý¡­WöϘ£~)ê\Fuåß- ¹wÐt3:U PŽןÌêBŽ*Ø´ yAm]näNÒfƒ°Ð¦[ Ñq1&Æ2¢üˆ¹¶IàöXäõ·á4QÁ p î#a«|¿2ПnaÂÌ Ý`p{Ú@KLØ,êi8Ó]å‹Ü´#YQäÚÚݲ˜88{ц*PpÎýSFçô×76›MòýÝ—ZãÕA²\Cž*Êi®û ÇØ\ và½u6SUͮرïØ:–ùéê?"ß(§›ï7‡Ð¸þ/.ÙrŒ6aÞ:Žúàr÷ùˆ?IþËcÂ~Òa´ŠêÊ7…Ôê¶ßu†ÆWDù7GÿIH>Ófû„‹k%®¸ T ·„NÖ>Š›u+ .–¶‡[†­YŽúǸlr`ê ÷–‡x—=‹ô˜¯Ó¶ øŸˆú<#ÑPXÆì‡ taQ¨ÆãˆôýKzOÄœ'Ñá>ª7-1qâysï(i¸ÃJéc‡v9eE4è y`ƒ&ñlðÌíš-a¼Û`I`ž­Ý[Æ=ÔôÚ^û¶ÆÎ·A–Ö\)T»B‚ I€§5GhÛJü½ZOàšN ®r†F'ª›˜¸¦áÔJ«b¨'Ò2ÔÓØ+HXQÄžÞ‰Ž’Ì`fÚ¹Ì}‰îØ;„ [@Æ££¯JËá^f¤t&5#Žâ¸2ž¢´D“š*êU†Â>ƒÐUkmâF­·jŸhƒ×_ÏYClÛ0-1Ó]‰Mq™VêÆ)¼ðC“&sÇoÏ„”F{bÈâQ³lÙ9TYØ÷’h3CÞßš§föëÙ²¤™'åêS‹[/zÿñoQÛEXFm¥åí ƒ¯Æg9åèÙЦÀ&à2#ÿMôy›ü*ÐÆÐÈ1ñ C5œ€ŽÚì¨U" Ñ‡-ý·pDnèºÀÁa ~žÔ+ʼ¢å½Ç5û­šû:¨¿(ÚÆÔ8\Ù8ë_EFÚ“üfý€}Ñö¼{¿g­Gë(üê6}á³xà=ïÓOñíþŠÓi@ÞvžÓ·ÙAºKF=µDï,ƒâbÇðˆ¶=Ù 5›\«’©«Q[`4ŠðÇâ®1¨ø¼YûÑ„ï§pT°>`]miÿH{IW·Ž)3"¼à…A&%ˆ±Œ$ŸTtì%l)Å’ÌAî©9ž€DƒFýô ÖÈÒÙ1m£Ž8åRs4˜(9NÚ+ Æî•VÃTGa¢“1ÒÍ iÙ¿³¢Fb2¨5±ŸºvéÝ¿¿ävaÓÙîê©4O@=}Ÿ±þ"O²:t]F·Š•¹*šP]•äi*}sýóVÞ\êÕƒÀ`gÃFõaþò˜êÖãm5“”ꚺÀÇ ê´Îfûh¹pP‘~Žªtb4x«¦sl;0¤*Ê!@ÄÔt¨ê­½Õ×YVU•eYVTpè½×¤úTtX‰Ç³mfÝÖ@ʬ©p M¨L)S'NÒP¾žRçþ½?‘ŠýT ˜Äc»û¨9ÔQQ©µ—P0q¸zªÛµ{M;È*ª5¶þÅWy:1¥$ì³ öWuøíð’¿@¡ªbqŒãluÓ]°°JH-sUÁsTy~X5ÇTE}[H<@p·v¡íç¡ئ–7|ËŽ jˆBvtéÛféü·ñ)èd·aTF‰viÀã€Ê£wÏ KÃßýáƒzúZT4 &€6‚IÌQÄHÙ8Ö¹¤çL¤):gžt­ ÊM2˜s'!B`ƒ‘™Ø¾ÞŒ1è'péŒ@'£ÓÐj*Åð6²žð{¢æ‹…J´F´²a:Úãíˆ*}´Zãbq$ÌõÎÚ6ÚëmK2 ,ÒЂ5= Á J¬uô?*r¾„¾¼Iì#¿¡lÚ“¦HŒ"s3õÖ¢Áˆ 0î¡+ŽÙê›–m¼K÷¶Ä=c¥µ˜E®Ä‚3§yÀˆª@á\ éõmHï«#àÏÕWÀc Äú¨Ú€êGF'3EODïè&¶¸TŠ$ô¼ô\ŒÒ~øKth¼ÉÔªU<Æ2UYáB²QÂfjåÅÒº›Á*YdI'D 8 ám\ÒVC nÈ— „™ Â¨‰¦PšpA£ËàÌpÀ;ñlOBÜC ¤Ú Š^fß‚ðÔ:¾¿…¦…À&3ÁÀŽúb.êe@tAˆVm¬'h00F"¼Ñã1ÿpê;w“¥ZIÄŸ’.¾[>¿«ÓÓmé`TüÍ Áépèdo a}Tö4b§¸Ò¸ÁGxÚ7µi-Ë™m+lAˆUDÀ*™‚x±¤¼¢J01ÙóÏft¬ÊHŒÉ&L’Äí=ÃÓÑåØBÇnà7±8(ë&ôß8\ºÄ²éþ¼cl9ñ†@T[wž-)- l˜Ä‰£|1ÐÓ‰]:Ÿ8U™Óö².[0GÎñZ­`ûSojï±ûwF¾¿ª V=Ì•;=èßaÑNÁCgoI;úW˜QÃtc÷×ZÁôü€¨ c“Ø+Wõ†Ùe7ßo ±énªòmjÏúi€=n|NzÛÑA”Á‚6¶¿™_â®W¯eÀ>Û¹ºØ»º›-dÄs5®Ù,5#Nž!ÆWÙ¶ƒ)‚2"£™ükŸâ\hƒSeƒŽ¬ûÔãPDtÀYiUIÅ·üþ}}S³¢|Gè´¨N™Áwa²rì¨ð¿Ä>‘·Û×_¨%~!—~îˆ52OAÞ~CÛQƼK÷—gâ½ã¤_æ˜X²r,8Ÿý´ñ7n ×FßôôòÀÜ8ÞoÅ’¤ôÕ²m»yŠÌ÷µpÚ+80˵:¸jzðÏ ^´qƒ“š°Ú 3Ëx=å÷­6ã½OºÛr8ôq¹Õ‚‡&|°|D dÆÚ7èÖNiAÄïðÉÛê ¯€D Š‘¨ pÞÙ¤GT!˜üõTéX‰¨;r¬z<»}çbŠT$*å'iÞh‹üjàâ%‘÷ É eí ‚`o2}5üªñn̓¿:ú·˜Ø=¿%žÀ eøË-Ÿ{Q9cÄ bA•ó~ðÿ1Çé©ÿ×lçÔÏÜ(ݼåØí&è:†®‰BÍA[Ý}ôŸt÷cüË0WŽ'S2™uóN—pE1á]:¦AÏ ]²`äFjÃj°Úý+W+Ãpx­ûmŸyz¼C …1¨Aë©Þè‚ÚbÁWÜd†þ±D²€Ì.9ƒà±‘«:$3 c;g¯èŒª×ß_héV8cP:8xSk}[Í Z•{N'¬üû(…"sS˜‘ˆê¨U‚@ÕŒÉöz o4N[ëù‹W °`õõQv”fWgucPq*qùO`àsS¹†Gè=DÓ[¸!”Fâ: ¤‘,Y º›Bª[üOpÎpëò‹«°ÏI§áœ‰c ›*ÊóCZ£ $’4uD/‹‹ÂÔ÷t%·PXÛ Y¢dµÂIqɘ`žÊH#Fv·sŸÂëÉVQÅ£%kƒ&Ôf21kH¸ŸãéŽþ¬I œ»*×ß_hù:m)cÕA¹“?deÞv÷zhµ°ÁWpŸª‹1’s&›—c„Jý#é¢÷`ÚM·'Ô7 n]Ž#ì9Žï®…•ÀÜÌý‘³¿£ k¯åÿ=`q(ãjŒ›µvýœvtjBTâ$ÀàFƼÄPŽ„**ÁffˆB¸Bá"p%š!©­j W2&'lNppœŽc 6® ²dº€?TÄ*¹>ìäF+‰ÒY0¼Û‚Üô€"VÛÄéeOyxT@|e¨Û¸!‡Ï1c øZA©ÏÙ;XðŽÚ>Xú¨ÀÀ0®Ù“öIÐbj9‹Jçý#éÂïo©†¡éX>ªà½m»Êþðm¸H §om`¤÷á´Þˆö×”fOª¦ë>…úýu ¨î|’†ãPîa‚ì´Öïâ¬V'šv8uŠ:WÌ×?Ft%]O Ö»¦[Ô;:S 2#1Su‹³Xœ~TóìÑsùìû§Ýü½ zц±µOQÈõV…n0Ag*Yõ¶³ Þí„ca¸R¤€qÈö†TÀ¸4±‹Lñ;'#¼a•^Õ*„$ƒ¥r!žfçä)ysüG‡¹Õð'៴iÕ|E‡¢÷× ÉëV’¸°ç*´“ÄæÃ-⪋H*­ Äéȉέýáí¥v0¡>_¥nFö?@¢¬º]q‰ÀŽª»l±…$De6ô¨3’iMÁÀq2`€Ë¥ÓOn*ižé‘ “¤ð±À-½tYŒ´ÑN[µ¶Íõ¨™'jzg£ص»€2°‚DV¤–°Ç…¾ð·^ãï¹Ùuî’@n£‰Ìmʼۀkô¬–:îάÚáÛYâêèóœ~˜=EóQÝâ=€m n¬HÁ¶ú~¹«T£@ëúª[+]£0¯«Ù@Lé$‰Æ óë§S$¼ ' ¦jßÞÚò×2‚;€4ÎG„G`š•}r§3髉xË.Ýù}~®º– ³n¨Èv;úªn´Ã¨ì1€7÷}9V¢OU@ý‹[º¡•„r#çýÔoY—±é)÷¾ÎæôãÒ¶í‰f ¼œªß,¸éÅŽö9žó€ê´4vPe$FÊ€0œk†Tõ¡¾º,1ŒIE¡1žÏm#2àÆþÚE7…#»²µØÄŸŒ_nú‘³‘ÝöO_¶™¬¶’ÌdÆ8Ej¸ÅŽòf“”»ú†4´8b'*ÕË· Å”c˜;^Éïì"ì‡Î~{hx×úûó히# ÿgH4oòÛ{?ïºpÜvQG0Àƒ¢=p`%S·Þnïë'uc™ÄýTí¤4â7‚2ºwP 3êÛïÃu{6׃NÄ•vüöSÙSœ{$}5ƒŠùï¯áHú«ÊÐLç'áDZxf¿µú—»NŒªÚïeöеË[:˜i&=Ø÷Ѽ2mê˜#×"ƒŸ Á»7÷gA…uôFÊÃöÄÜX¸ 0n N2:ˆ=QVÐ.•¶ŒñÝ0'y;Lµ¥ˆƒ:NSwGë©Vƒ³¶#<û«tã¶wG__ª¼«jM±â#ãóúh]…Q‰öMNñ]ÿM-¶0 šÐƒbH%¤Ç‡ Ù\DèbLiq 01ƃY^( a–Lê[P2W4®&1œ'P‹ê \m¢'£>Ú6m) s'3Õ='£ÈsÄ™u®ÏF^Žœ3þÁ¦%}tE³¥Œê#we e@îËÒ$Ÿ@ DÆ;8Ç¢¥H=íã;:úª`m& n®ÿ¦mI3Ѧږ=T«¤Ë}e`î2"*\Œ@ß+¨„ä8£Nf'É˪›‹+ñ GÖ;ëŒ?o'åï öU¿º¾ÁÐU€ ç×ÛZD¨Ç#9áïMj·‹“Khˆ Ⱥhkñ±,Óœý‚BòöüW3û)ï uÖ®_„î>õ(à« ‡çA¬?k;zqèž#v O¢¤[Ð7¹ÓêŽT_™æU@ÎGt±ú(óã½° ™Œx)˜¥Á !µ«i&$1Ù^@T†Ñ:ŸN¨3'® ×Wñýàkôï«õ:Ç­OÑ_­`‘¾ÙÖ=7ª¡Nãƒ~SAv0“MÌ8†¹øPxGÒzè:œšÓpc°íŸUi|AɆGê=_µŸ–-ZRÌr粃sme~–ú½5«‘´ ‡Ò%·œÆ9õáJ-Ü:’èˆð²\]VµšÏ =µxè*oCÁ1¦âÜ&:¸#¦µuŠÈa¼Àu ÝŠƒÈÂýÐ[ËòÖ‰œå‰Ò6Šþh[Yc#Ý ÏXÝdS² !|°–ÌT á3NÀª÷•Ip 3áÏ*¹jö’-ŒÖu1<9#Hß$R›¡d’¨ +œ0;0ÈѵÁt.hçˆNPþÍC¾—–e)N­1’àœI(â­,ÖòlÉ' :£#¤}Q$Iœ6€ßg¯††F2+Pä~ƒ×í¯ŸÏººÿc'§šêé[ÖüJg·xì# [Öü,'³xí 7›"ÃfBu«g#^W. Æ4Ú]d$`#¬×éØ[c}ÇÇò¤ûkšUû–ǵÉöW9w¸ ÿ¶¸y˽áýµÁÌ«}ûqëB=•úœºÜí¶?•ôŸ]7††lÖà(Çv&&P{+]¨Ô*êâUÆK Én²qyV! b kÎ|dÜ)M Œ¶DQOœAÄ0Æ5#g´a¾¿T›–~8â_÷Ùö‡} ƒMrØÂ1\qÝ’q`3ÈPK¬rj @ݰo¢Ž%Mh8ƒá;ÇÖ6ôOì±ùüöô|þsчKÙåíyŠq’a¶êmÄcÕÏÜ7~ÂÊZÉûX÷PKJFÀ®îª4L cA×"‡/‘¢ê‡S±€#×Z¹ †ßþ·—´{=äü'º¿ú¬‹<Ã` ‚¯³ò3¸Ãl¢yppÄ€aÚ?†ö"œNÜ3¡ÊÞ’À\Ä1AÆcáÌO¦$Q½Ë V³kcÝÞÖþ•ôPt2Fõ1’DiÇb.d ‚£H™`pcöѼ庶î;Žú(ã‰L¯°ì¬~_—dDÁ†öÛdeÛ5t¿ÂsþþÑêù1²§ _æå-ì\™û~ÿê¡nÒ…QƒrÙa‚Ba›Ã¨Ì(' «7Ù¼›AšÕÔzn qŠV «oeu\K¶ßd¶8ž¢jê#ë³d=ÁŒé¹pi(~ì3²ioÙYkj.[Ìvð1SáÓêÈaW2Z˜WÄÈL»˜1ëD€)®ÌËÄãK2ùbÐâ·vÑÃIÌ4I4³ÀÅ­î«]G N鞃jò‡C˜?<úó­CUÞXwÜ´=®ƒó/X¯1`«Ã6˜ýP2 woìƒMç¡·i mb®}É8¶‹„¤Qæ¬Òln(÷ö(ýñß@ƒ úé^Ø,&B†2œ‘;3Ê(1IØvWž¾$Ï­º¦Úé·µÛîÚdzÓN,Ë_^ ÇÞŒÔ €#-³ü—½´_¼rúè’dš`Eæ%×¼;~/Që­v˜óÏhïù+ÍókŽh‡fæa¿pÙ™Ç*à’Ä*ï9Ég%ç {ê·ÝÉ·rÐ0Ö^ËI‚"Ha#Oo˜qqYUpIeIi&DéQM1E±“3”箿Zâ'Þ`=¦Œ^N½ ŸÝ£ÏQÛ+í¦ÍźÀû ::‚Ca˜; Î…žU £÷5±†[PƬX‰Æc²¿•5wYømÚ÷m+™–÷²€:ŒÒ]\5¨h9€FÞ†æye›'–Ç»¾å±ûË·1C˜åáU´dTꎻ¯…_˜c©p•:Âà1³‹ Çðn°Ù”ì9¯££ÉåÔݹ´ —ï¶Kíê¡saq¶ ÂÒ÷fç­°ê¨ÐÅD%Þ%êŸî>¢>BrË’ Gï6^íùå¦*Ãhùâ:æD}¡áï¯tŽ¡@¡rëì9îÎ_mO>óxý•Ù½»:/0P¶m’¡‰Å™£ë¨P`Іް MÎ]'z ù“IõÔòËGúw¿Q;ˆ¸¿â¡cž¶y{‡“6ßî\?…¡©¼ËJÚ›Y‘2ÑWuqôèuù€“u”+Ë„ˆ‚aF:cdÒ§4¾EÖ0ˆâœ´{qÜØtk\9k­ˆÙjáÛÔŽ+u- K&$d{FÊ6o©ü*¢\¶Âª1vå×^õ6­¨©‹¶Î"<2}ÕǬQåmÚWˆ ž# émkâWÛ 26áZÃ* âvÄ ÞÞbpQ¼Éžãnï*‹ £,ÇA¸£¨}ßxz1îé,rÓÞ>óݳÕKnbNpLw 'ºµêVI‰R;ˆÁíMipAƒÑ6› ªqSÝ¿¬Aë¥<ÓVõbqϤûØo7šCÊ•6€täÙÕßE·n%»¦^Ú‘¡ÉÏd®¯z4YˆDAØæó­r‡Âž—‡Äç4¶v(âaœ ­(D\•DÜ>[Z¼Ñ³R$žüÅy–õ^äÆ`ñ]°7ƒËCo¼ƒx èC)İŠ~k˜:È ÚÄ-cŒ±9ç«oCŽhh‚Qéݶr£ÊØp¿óXmnHFT1ŒfÍ…@KŸ±ÔíÚß@MiÄ«a«ÏeÕYH´W]ÛÑ’øÜ–V8FÚ†Y 2aß.ú Òa’Êk O„¶ iFf%Ìq—AVİàjå†ÍFG¼cÑpŒØi‹dô3%§¹#L¤†Yƒƒè¦h`ÏÄC “³g¶…Ñ:Ï„²NŽ!Œã0¨ YW,_¶€HÝ8ô1'*NUr´1ë¸|gþÑÙA¬\%v©Ê7Öz¢…»çÉ»×á?W¬uÔƒ†ýžšÕÑÿÉlþšì¼ëþk ¶Ôàƒ&#žyí´ì uÆ£m¿NvÄ2oY¯0N@bI1´žƒ}²²¥ÿH?1IÄššH9†›úk]?ËGÚ @n,8dG‹¥·lU2`\åy~^ï0Ö¿ˆP`ž£–Ü„á4—´2kéa ³±†8ôó<Ï,|ÏåÃjW‰:dXšµÍ”Ñæ ‰˜ÄŒðÝÓc–ò]üéãQÁn>/˜Ãji¬ÝPÈà†h4ßÓ¹‹¤Û´‘—™løÎm𑔊€ t9Uc-h”?‡Â{Ö: °DÃG—–aÄŠZæ¦Vû@m~‰8Ntׯ6”\ϰu“²¯^‚ ´,XˆÉY*“"÷ôZ½µ;˜}j:>²OÕЋ¦â”Äiy]QâÐÀ=T†¨2Aœ{vÑTàH*· *kâ•„Cálóéc¶íÈü6Äþózº Kº‘#]·MCˆÁÒ};©D.J7(Á}T·Ø~¥ó'î­§Ð:9®wúoõ³|crÓAÃ"s$ì†ÒĉZþý}åVB_PN’ŒH¦cy«\×õSqÔóÂù|Di´¬@8IÏ~‘Vy!Ì^{|Õ†7 ?¢YOºeepá¯êlo7›oÎUBþ%ÐF¦LÙ³âÙ_Ò¹ûWîk»p!RߦQá º&fff¹õºH6X‹ýÀ´¢t¸CüIÀžÞ±\•Îbàp-rÚß[Mp‰ýU`aøtœ5c8bkú)åÚà¶ÞbìY˜©ƒ¬äøå†X@Ê­·>ïy®^*·mß „“§KÚéS³‡t#¢×<£M¡¿Û¹—åxüÇä^³±Ô8íS¤úˆé-~â .¾&ã$øBa-:½W.\]JŠXŒçH˜Æ”=»(×БåH"!´¸Èáˆ` Ž‹ßfÐÃèè»ÕÔ>A¶åYHÚªNP12GgO-oìüì~€)V ’0“Ž@m¡ÀÁÉÍ“FpÜsðÕ«YêaV¹uÊÚ*ú>¾:ï-mœâIä x5ü&–‡/q@fc frˆ vE'%rØ{Ha#‡#ö÷ÒóÚ›¨4«G®àwbiïù æ8!š1`Ø4ìâï«v”)hÊ,`‡zî4.s6ã¬$úvŽ£4¿ÌXGÐ!er„FYU¦P8[ÀpOú¿˜µËÛ[“:‚‰xØXùsïÛ`;bWü@R¶ð:$Uƒñj_JÏ´t­Ë*Zæ’Z6äÎÆ{ŽÓLL©‘¿ ¾ŠÒÖs§K-’u%f#$8jž.‹ë¾Û{EãŸîá>ƒ^è5á>ƒ^è5á>ƒ^ô´»­[öM(VØ9|[2έ#!P"_Ì8Ä‚vFí•Ê!ÈÜÐ>š=7nÿMKÕ·Ó¥ÏêñdaŽ´ "..)¼€@q\±ŒÀÇ ê©þbÜjÑâ1šýẘò×R朒 vÓÚ³~ÛÝUc¤0&TÎ#§±Î*))­ ‚:_2rú P"YÙô4L¨ ˜Ä®êæMð£Ê¼Qt‚8Fù'˜¦O…ÜzŠV¸Z#z¶ rŒ;+–m×W×"³šÌzk˜·mRâsYôùr¡+Ž #PÓt¨X œàDÔ5Çdø Æ)èœGQ1YH«‚F(ÛFãÑuë €€¯ã¿¦¿Žþšþ;úkøïé5üwüÆ¿Žÿ˜Õ·c%­!øcë¥ÙF’ gŽsýóVÞnZ°¹œprŒÔ_hùyS˜±Ïùœ:APØø˜O #Ç2F5ËXA7M¿&ôdX§ w7î­Jå] ¼îãsIm]@p÷Wõ^_‘·å‡åÀ@£J: ²OÃi¥åW“{|ÚYpÎmûÚN©|øöHÜyN{–F­½ÛdAբ쌳Ãëjþ›d)‹|¹ `Ƴæ“—ˆû+šµ—¼Åﳉ"2ÚE+€8爜zú; ™Üú\ÒéÕ§Óœìî¥×âŒ{jŧ­qAÆ3_ñÓÑýõÿ=ß_ñÓÑýõÿ=ÿ=ÿ=ì9t¬rÜEÞ¸>:Dâ6о— †ª¸šqpÛ*_O,ûíéüŒE('H‘Žìsî¡pë ¨¨ÖÚ˨8Ü:²«7F\}Unúäê­ù€?!osõ„`âÌ ”Fs‘Ìá´ü‰èϦ÷0ËFo@1ë¥Sœ Áup˜âˆmñ¶† Aý¸W.»‹7åSôž—ºZ©0bAÒ{Dá9tq6Ll]!@ÄêZçìÙEöÝm½‡ 7ăÕ"†¬¶öQ¹i`•Â_SëÕ4ÍqÕ@]``Þ¼»ëÍR ’°Këvu_wAêÒ7Ú¸Gá¸'÷”ô5»vD`øø—afœ8 ¨‰ÄŸEZËÙà=™¯Ò;ºySjóÙ v”tÀœ³Œâ®Ý·ýJï6-Úfde`ˆ:†£°vÕ¡¢ê¥Ó¤9X@ÓIœzôÌM7(RåÇA.m®¡l}¬g °0í®[™µvõ”<ÀA  LFÆâ´õ©«öM«®öJ‚ÚÓ0}¨«=ÃÌÓDY¸ûøviÈÉÏ}?–¬létq¥ÐõŒséNMOöþÚC7¤é^‚饎 p<` ˜ï Hйse´ øœÏ±z 8 ª–.¸%%5?ê/ŒÒYxvçÐÏ¥•†·ÀÀmš`2‚_Vg$éè¾w€¿˜Ñfïjý#éè}/4F¤´r5}Ðh³Ls$Ì÷×”¨5b€’ª 2иjgˆ0H¿¢ç,ÍBß^$õˆïèK6¤é’#Ÿݵ¬°b »¨Jã¶z°¡fóE‹ü-¸u÷gØú‘—G-ü¢+µ«šÈb€Lă¶®ÛæyN^Ê=§]Và6¢§HÁŽç\Ÿ$y¶¯ka¨@YsžGÄ2®v÷$ü»¥øgó+Y0L°JâHdF×+ä(%y³pÉ À0$LmØ+ú»•Í-â8¤6ˆg\‹w–VWµ¯F¥ffḧŽÿ¨Ý½vÀ³ré ték,HÕ$â3Af0$€fjç5þ_‚ØÿÖ»{\ËvE8aß'm¯4¶¬#ã;ÍI¯5¼W˜¿áÉ?Â'¿¡î@O†Xé¾Î2ÝUiÙP\W´4ŒIB †+÷NqE¬*±ƒ%˜&œ0n,; ´ïwQ(ʳY™¤øDáÕЖ¶»ú”í#¡ã4†ôgê'£H•¿ˆW[‚ Ï c3NâSxd'2£¼(Û}$Ha©™T0Âxx™ À˜Ò£tpìÂï8ž…t0ÊA¢…û~ ÃPê>ú÷5 €Lf> p#¼SwS"¤x±ˆVy„àê ¦ÄRÿMæØ öÄ!>òü=¿W`OÈ7ïòáœæe†®Ý$KjÒ…Eù-ý3–nó˜úÞ}ýÇ}aXf6ÆýÇê «¤å“;†R \ú=f‚¨€Á€èµa¯yÝX—áĬBÀ¨Ì±ßMt*’Y—Z¨_5T®@cQÎ’ÃÚw¶æYjÓ§’qŒ"ì¥F®#*ã½FX׿¡,Œ­§­Ìûè(Ù0 ÷ÓZlÔ‘è Ø;qãh¤T’Rx´„rUEȼq¤º• Ò³Ò#2IÆI$ÿÓ£E¥,}C¬œ€í£Èù¡î’YcÀ­ mºÇV™¨4¶ï¼YRZ6ÌjŒHžÚ7à 0JéÔù¬Οµ¥½eŠº™RòŸÔX[æ€ÇÂÿxì?k#ïAÄü¹8MÊÿMl2{Ã!½mo?o!îÉÆ´®_?]pCAâÇ!×»¬ì¡sHÈ쟞ݕ&šýËe•†G‰s ´6gnæXpëÕ³¨ŒÁíèÓqC Ä=‹´* “¸óÊ­‚¯eâW^‚u22‰IVŒ„ôIÊ®ßø˜‘Ù’ú£¤_\ýåúÄ|€ª$œ€ÌÖ®q¸¿Ó_â9 ÿUyH»_åøŽl{}0FUüÒxÇñW¯eÁÔÞöæè[`ìBjl@L€¹}ã™­v‰a¬©JC¤c+»vÚ ¦ÈŠ[ÇëØc°æ;°û4"ð´ÿ ÿå—æÓZ­0q½HaêžwQw± =tW—žaþÆ ßq¸.ªÓÌ0K_餅ümâ~þª€¢ºD‰30 õuлŒÜFGÛÖz<¥Èxý¿]pœ«Í²ÅxÛ÷†L: |èÐ~1à?xfž±ÙAr;é­]‘³ô¡wÌw ¥T9Õ£Q¡³3c1¿¡àñ\à‹Ä{–~C ñ%í;Æ"íö­ì'Äßqsnܺè§&¾X9¹Æãwûƒ©}4„£6µb×g†Ùa¶£&p¨"@¹o1°äAÍHÚ 3ËÞ]¶Îã½~î8ô~£F\^ZŸ1¶Õo/Ì'@Œ  âwˆÓ¨íõPWŒ@" ‚DR056/º÷ÒZþmô³x›"{hk毙üÆÈ­O.w±,ÄMq+\È;±¦F2Jn=DXôÐ0d ôïǯ8ÈtyV¼[NÅ]L½õLj3Ž`ýQP6W–;þªÛj·µîÚ§³¼ ‹ŸÚrooWO’§‚έïz0^ãòY­-?baS⓳@ë¯Ðmχû‰·ï7¢‹ÝbÌvž‰¸%} 6ÆÑ 6ÇÛç Þè8³Ä5™:Yý5Ǧg ƒÑ®Ùƒ‘m 6Š/Êàþõ­£®ßĽ^!ÐB˜ õ݆®=Ѥ¶˜€`*û‚ éÅe˜\¸a¿†…c#Ù×Vtȧn®¹Ù¸ ¢q«_}}¢—°{:⮢ Ô~£G_ -ªέÇë «èÓg-­ÿŽþÚÒH¹ž³P;E` í®#ZÔçè©ÌuP$8’7®…¾bnÛëú‡ÂÚñ9û#gkd(èR¨ËÑZí™?dãôTs•ŽÿúGÒ+‚ã'S CÒ°}UÁvÛw•öжÇIÁ×mŽCa®cÝÚáP½¦}•úŒ[«!è€\vÜý{(«â åóŠÀHê­6³ Û;vú)|a°üòè[vD¹ÊŠ]$:íÐA¡K ÍÄ=xúè]Qa†ãõm.°ÿÏ¿}jhd&aƒêëùQ^u¡úL!ÝÙ»ÑÐ.!‚=ch=GmiˆYˆ,Ú›V }ÛJ2lb¡'Ç#Øi•p4“·Lã§nü¨Y·oHR4ɘQ9À´ËâA4,{ï ÿö¯áž³Wn·»Ü=5Ço£®–å±+pë9ú¶“‹˜=G ·Ñi9¶24Ÿx{hEp¯¦ˆˆ"™IÊ~µCVGØDeØúòÈÔš‹xÿU'•Ž ¬HÄŸžç¨â·û§?F~ší‚Ìrµ67[3»ì¤í¥æm‰)ƒGÿðŸQ ˆ 1È ê/°RÆX“€''çLáZPþš`½gkwìêíùeJ°‚ j\m1Àîû-׸ííè WP&íêœÆÜ«Ìp5 P²[‰ÀŒà¨ãÑæ¸à·k{£é4ÊH,¸ñ ¼jR³×*f‚¨’r¤·lãlf>"e£³*ÌDã‰óë§S'TbNã4Ÿx{kHÎ-¼‹=&* j;É?D 6ÓÂÊucoÕ‰ŠÕ\Gê¦tBUD“³çë­6›‡á8îî4öî[‚£ÅH8m˳¦{6“™ÇÐ'!Ô(Ù³>i˜ Ù9"tÎD’Û?î Ì9÷àé$MTU'2“^]±6„‚À‰S1V†Õ‚ ²µC—0bì®îÖÛ¸vþÄÛ¸)ÀƒFí©k[ö¯SuuúzB –cuš×Çís™îúy‹ xO¶¶¤Díú7˜@1 >¾ø©Y^ÌG®‹#†‘E±1HÅpÆþÚÛ:è=³Å?3ÛPp¸¹¤u{+‡=dÖ&M•áôN&­Ü¸5Z&{¿»×@Ú‚„aQ³¯E²5 ämQ²WÙ–ÒB07³{IövW“euÈ2>%¬©Ä Â@3Ö¿ ŒTn$xˆ’5h–0ÓNˆA¸¼V˜>˰…889‚6Ñ[po>;Lu™ÇH÷Wûè»$É=²ƒ•¼˜íOüñôn¢¬#0sy·,…í÷›»/M<+€úO}[·æŽ=ÒâÓ¾0ÄQea„aÖÙ C$à$ÑV“Û_¦äwáèÊ…§†Vñ‚i‘º¯4¯8úEcm½#¢|Ñè?]y¥ËŒ cé o b2Ì{+ôíªö }9ÕÆ½”¶Á“‡²…™à}›Œ`~ƒAíÙÔ½£5ìa…Zç9f‚‘ Ѩa2‘ôV³ tŽ&ˆ,{ç3RAbHFdœ‡·†¼?¢Ë ÛA áŸf1‡\Èí‰x:8yÌ/¬úé®Ý:™³?=›¿juˆxÁ†¿xí¤å­,V c ·³·n&ƒ ij!IâöˆÂsèX ÆÉa•uN;0Õ¨>¹Å` >õe„dÜ&”¢“æ b7l^ͦ™`é*Aïþüjà qD•Yº¤ºÝ&q\ H\'ÅŒm® #‰:ÈÌœHÌáEo7 ‰ÇןeIþÄHõú² ->¥X€0ÈÈp8çŽ4UÓFY0’HÆ|Dã=öÊ‘8 â@Úg*I˜Ãi Ž^è-i¥mR 038j08R¾ dá 7~ vSÀÁŽØÂ¸u‘HŽx‚ÌHÓ2<;©-? #1ÇH;ÆD©#…~£„X&2{x”Á¡vÊ—` d«”I1¨˜ß5´.åÃ×cШìJ €':¿³AÄW±=X{+„°ïÚ( ½Â6iÑ_Ÿô@²?7÷W µäýUUì\×Ö=ñ슟ÿ'ÿÚ?þ‰ð<…Ê”·f»1‹2òϹt—À[¬„/Ê%_Ù½vð·ÊÞo’ÄqTcåYËÑpš¢O'@f«Óœ>‘‘W[Îä..ᘆ½#c”“ò›üM£ñ#)mæŒm®ìëæë—ïÿ}†]f+·ñD ¸Bâ'þ³_÷ŽÇs#/Þ9}är»×ÚB3›þmr­ýgDº,:ò¦ÖE…¤—˜•βè“ór$Ý®±_Ì8i›CgƦݻ[>dY²æ[7 ŽôpçÇdTß’„JF"‰ºî‰©!3›ðÓP«¡Y¿9y"dí „©Qcȇ}-…3(„B¨½¤*¤¤„#ÈópßœiÄ ñªÖi2êÚ6I[ R½«B!KxRUàn3ÂeÚ}<{#F¿n†ƒäºúì·t0Œˆ »Ä?/´Ï¢þÀ’}îy6S¯ ¢zdé. L²Ø&än8j‚"‰ÕUWdÔÜs売ù„¼†áG›•Âtjð¸¢ì_Éiå÷ìˆ*§MÑt¯ó×:Í©¥½ÎqO«ØíRø³*äÔ­%ЧBØÙòÒ·Ç|}KоçùͬXÂvªø“óÞõ$ºKâªn.”•UU|UuÑzn»{4¨(ª¨›ª"oÓQ°G%dó)]ÈbÀV´ëØ’ÜGGvìÜ]tG~í—}¶×4Šx–‘¢~šÉã><ä.Cr,JÚ,MËxTÛ´ .Œ!É\p n5ëÇD4MÄÇtßeßS¥Eù„Æñ ÏUHqæF­…jãXC[ƒ%¨À‚ëvo©"–èj„;uB›9—Èj.Å­÷RÙ¨LÎ ÈÍ;\uöA)ˆu‰x\BlÉ|wqÇfö%IˆX3S2¶ »“G܈ݻ ’¢Èe–Æ;€ }Ä] 0|9ã¿Ë“.·~¹§ï“MdÜ:ʸg"{±ÙjS(’füY !#m6êv‰ú‰„Só·TÅÉóƣɩů+ÿ65±ºTd· ´ãQ^°Žß{ n´éýÝãÜ|®óõ¾7HH%Ê,× |Á–÷Vl0/ ãIéû:j»æŸŠæqœd$kýnbäîC…º]¾CÍ6“k»•vD’Ïjy¹¨'}_“cö£Õ·urZ—ö×À›y’ $ûýÇ3‹ø›—Î\×v—ƒÐ¼ÛPi»¾ë¹³›Ç¯ëIIÕòoª.£rgÌV]+5–Ókå|¼Å*q\fÖ®B²üé=e!“^ùn*(‡j¦¢UÕÁYY^Ú3¶@ÄvÙ¦›Aö"k»eÛ}·òßWÙQ;Ôs©zíürƒÖ¯ÁŽ`½x™€)§q}Ôó][ÓâX5ÆQlÅ_¯F²\bÊ´~…ÌŽyÁ3[á5ûôŒ­‰ª®ûí÷°Š—êêîàZP~SD@iÊ×ê,Y˜ÔÛ9ëúÛM"h>§D(7|•g‹Ï˜XZ¶Ôüœ¥ºõ\†’=xµ*®úÒ]qÇf»CW­/2‡v¶!´iùk­ÛÎjþ\i¨6sÎ[ºN:7`è¾æ¯ü‘ÿûdqz)*§ð…E]ÿý=v”U¶mšlM̆Ãè¿j8¥zÉ1¦å*÷$êøC[ WÚ/AV ëEÒów%qǦŸƒZ7e}V›x"Á»b¨žÄ4Ñ5açêAšw¼p< 6ÿ+®qTzl¨º[ÈØ†Cò³š”$­¥–¦¦nC-¾¥Å“ Çhä¿ e8q\}7l‹qDÙ6Ÿ‘pÓ2±l’,èÕRÈ Š•³š¬¬`™®–³ƒ]Cþ°/¯"[ƒà;ê7%cKŒ@°´bƒ£l o¨) ZÁd52|⸓q”E÷Òî4m R³O”^_‹Ãùŵœ4µ ñ–GaL•‹Sq×½6œVQÁC‘ 0BîBUÕ_|ÎbÌð¶whèÄÇræä,œ'#}z V[ü~? -Äè‚F«¤T]Ñ|ú=¶U–ÝÂÇ1ºÇ.æòÅà3÷Ç Q<“Ú½®Ž7̸àï—9;ƒÜ€­”<Ë0cÁ'iÔâxIp}welAuãür.3C•Üñ}ùŸ5'd<~$ã„D¾ÝWr3KðÜOó.&;É£Õ©ËÀ}*k’Oº ÎøIÑ;Ñ£%ë­6]‰<úxë–ñy\–³{«HŸ*G}Ïàº,h\YTs"!<‘FÛfC ×Å:jæê¢»ê·93#oø©›[ió1üié_—¹_lN¼´RåË/V\&•(„  E{ÝÕdª\vŸgƒù]vI8…Ù‘ ™©$_Í'’®âØ@íDØE6Mgó2H‰SÆÅ$3™‚DcZìHã-öžÙw§”Gu÷‘>òí¡»žBµ„äfe´ ô·‰%Ù´à´Ð(”X2 îîÙ ¯rm¦'•6].ÊDäŠÖ,U̘:ôµnh1!ÀBi脎4ˆ]ç÷{¶æ)L÷z2¸÷ yžñP.Ç*Ÿ!îÙEv^¨½S\aÿ„hÿÐÒ!.ÿUOf¹À˜!ãi’©òi.Iqš¸–R.†ª‘³"# -ż¨Ié¶ž>òmiiÎÙF3&¬^ŽÝUö7We‰³9.:”ÎÖÛìÜ^BDíÝMHåmŒ[VÚwxϾãí‹­ *ª!¶Bc¿ˆª*t]YS˰›5‰sRò3-¡5%fC%Þ(J$‹Úi¾Ê‹ç§®x8´áK7\W¤c°¿ëRaª¢ªI¢”JÈwm²”uh“ËXø|ÝñE~7gA%¢Å9î·,±ÆdnËÆú‚Í©1qPÄ_i »ú"êƒ&ùxÉdg•3*Û¨ª›A–TÅ…¯D’òJ}˜SÊÈÅl&ŠúÞ€6¶ÆZ¹âüëŽÉä—@Ý´Ø–QÚ—Gy\2?/ztQ2'™lç4ðÆGÀ Ûy²TðGp`¹æÿ—˜{­‡Jx¦eجqêNPKx»ìb´?ò7‹ÕDFz¦«s®:ÈâäØÕ¢*36:ªN‡G#ÈdÐ\aæ×¡¶à‰Šø§ô[ï.ª–1Ùlés¦<½±áAŒûò/tÝW¯AET¬äϘÚå¦Ãê¤ þ/ùn#GaW(õfÏ&í÷&ØmÔY]Ùá±rëôlŸbx&¦å…Ë4tp=in¡™*¢ L²Ð›¯8J¨‚ÛbFKàš±¥“%Œ›¹.•A›(f„Å”(lÊŽªãF‚à/ˆ˜¦û*jÿ‹yZHå¾–Ö=™J/um¡wÔ^¶ža>2!ù:.&Ÿ›a-ˆ¢‚¹&l—–Zñ#pÔDQ=ªºÇ cì[a¶9[tW¹8=iiVTGñ™Dy«pZ€ üuw·ª¨ïÛ¬Úå 9óÁ5%ˆc.årŒi ù†o”ó-1i&â›$€AQ[-LÀòœ¦&gŠä5Á&ë—^v5Üæûn«$)0]½!}µt6ýâŽÂœw5ü…ë¼{Œ°›¬:€íG®ÞbÝ¢ˆÛR¥´Œ0qàÅ3⬫ˆ¦jN/rïMÇá…SäUõÃë¶•ìIvÆÂ `ˆÝ„uDu[ “µvUDšæ­™!À²=½ÕDDJ¹ïkŒ? ¶þ£ë²ÿù5Õ6Õµ=µ4+«æÉ›Êé ³0 { MœÜQrëüÚg¬‹cˆÃŒ–^WIY[« Æji0{‘¶A!í ÛÜ!ÝtWX@¿y‘Úå£70•W=1Ë·ñVâ„XÔuö}ÅètKÞUºŽûjeã!s¼²ÂnI›»5Б/ãç¹îµ!ð÷\6XšRŠ¢ª>Š.Ä%”\»—‘øÖ¶-ûÅQŒ1²[Ø—ED"ôßÅÃé÷t–ÿ-áŒÆmmø‚ýç¥â·Ø ‘äN×Jq«ì/iSMõÈxÖÀ_3¶a®UGw;–¨ÜFÛ~;Ê5>'£ê4Ô†„Ñ´>õouqÎ:çð›ÆœrÉɹœë7NT[E˜äÈêà;Q Ö^t›uéNv°ßb#iyÌŸ'™Å¼’ÄZû.Jãöd*âùœ)í›ÑÇÓON-ƒ‰+2ƒgÁñP-M±¥f^?•cR?-ä;·fã³÷âÌgÍeVÁÁ÷…|Q?¡[òubPijb3¯LŸ1åìq÷žùì €õUê» *¤.~çøC.Š&¼MÄÊhý~ôèfŸqûgÃo]õOÃýÛ{"}}Ìrìs¹@¢”Ñ0ÔóQ#7g)ç[HÉ3í P‘7-‘js¾anV7ªGªUíHœÐÎuÚFÞ—'Ñ—O=†Q‹VýÙL›m¡¦Ç*£SUŒ‰þ#bÓ^¼ÇŽD‡{PuÂ2Ù7UèšÆ>i1˜nÊwã-'2ÓÅW-0yN¡È{°QTÞªu~)¿>ÏP|4M>Ì £Ê+ÑI§€%A°1¤$îEu²Eê›*. CÅê_|êl¬ìè§ÚÉvÆdmÁ¦¥7CêF «L¶Ð¦ê¨ƒÜ½wüë?¯…~â"EÄ`÷Ù]<«à-×B¤uòîO¯DQòõh0ÑÉùŬz:§‘tt—4‘®@]M·Íþað^!¥†è3b˜½,WêÛG:í÷Õ ¿Wð‘WÉ5cÉ¿4œ±–áõñ%XK´¬»ZÖ ˆÈù5¶,bTNÅèž>ZÊeä/,Èj’¥«+Ì#½ÉcÌ•U5ÁŒ2*Kc!ƒ'PIEU:ûÞ:L—(ã²aÝ) Ö=ýëUš aÜ¥ £lOÒTQO-)c\ñÊ4ªP¹jÙ”þÉ»ÏnŸ§[ÔrÎ1ž²v[| ¦‰ä³* •}ªÒýšÛ’¸*Ù!··­’`“ZÈ¢¢y™B44ì]\73glÏùÖ8ú”;V¸œeâŒf@.“'±ˆ‘쪛.Ýu.UNA@÷Åb9­K«æ–Z}×áJx¼ ¸t!]Vp?Í¡¬ÈmgÃw‰yò¾Íl€•^¦ª„Ü F^lôv_T÷wí\' Áøâ^eSqiñ¹ÖS)Ô Œ–îáóGÛ¬b3fsm]49n‰0ÌfÔ{…;;q?™–Ü–%O)3X.ãY  ë5Ym7våI|Á 2j*-¸HŽGsÞÙ6Ô«XuòqlÖµ‘Çvj‰eÛ´Ÿ‰@¦ÝÀ_y—E; ˆ|Ñ? ]åÙ]¼jk„õ…å̳ìf4fMÇ }ˆ‰àUz']W|ÆrudЬN\/–þ.ž«YÔíþ$²ewOÌ'ÊÈ®ÿʦÞù)}QSG#-ÍfTN¾®Æ#º«*Í‘!Ù¯§Ã°£ëˆ2Žª#®¨·¸î¤7<«Ë_›9.r|,ƒ¿ˆqaåñm¸u–VØô’&à+l´„‘Oµáõš6Û?M]³·°­Æh*i†äM}˜™ßf£0Ž8 Øwk`)ç²"yjÔ¥{Îñ©NDËøÊÒ@9qT H-»)‘ mÿ¼Ñ(ûá±'ŽÈüYl7*$¦Í™Q^6ÝiÁP6ÌW¢‰ ª*/ŠjÿåîÿÉs¶x­~YàRÇY2,±é†fåSò!j?å¡6N:[#$Ú¢.ÛiÏãìÕx““÷xÓ¤ÏuµÛfì²xÕS¡QlÛ¤¸à®>ˆÅ¬L”ë3JËhÎ3xP"5*L¹ž©8ãòÂÂn!‰!'rvê²69™L |C‘X:ip÷n…Q\³±×'°Â ;]mc8D‹°©¯v¹6Bcqë^SøLÁ¨Rå„s®É«2I QÍÈà(¹ÙÛÑÏe¹Å²»Ë }Éõ×5lÕ%Ùd,ÊnÖ96,¥É†ÃÆlª€2¢ˆž>³žgðì¯Wo ÆdUÕ”XUðQøòyÆÜã²t£*©ˆ¢}Ñ릹U›8’¯O'±¹žÜ¨ŠàðÚŒÜv÷qPŒm)¶ú&û ¦Ë¬žÆš+tµµ,â°©³IsgÃzFuÙódÖ1}dHjÁ‹ŠˆŠ¾;nšÉç5ø‘»SÃmWL«¶ÛYl¶rŸ!eŠá2?q‘U$NÄTBÖk‹æÏÕÙ×`5ͽ*ú ]K Fó»[€*ãL*È-zN:*‰³ˆF*½µòXu%ac6m}2ÙºÄ+–æÖ˜ ‡63ÝêM©‚¡2ñ ÷ÛêevœÇæ*jPeË.2̦^Beä"e"Ý)¢š úc0ïùëáG*¬ðººýòŽ_ÄòFÂù¡\ðü,vÔ•%´óû<󌩴 Ầ§W>¦Ü{ÎÅyY/LÅ·[/L“îª"ôTð××?dùW¤y0sùŽe•¤Ë&E–¨–Ýb(H*øÁêˆ6Ê#MÄA×}OãL_¤eLc¡>ÆºÊÆXMaªö‘=’z­×z‚Ž—¨£ºìZ:û(ð3,.†¶¢HìiL8í>㲉'BP…z¢¢ê?ËÇÌDùwg"t\[ËÓq‰.ŒV¿‡of2M›2‰µVØ”$>¸n½ûï—âùVPÏ!ãôbÕQCq«êá+& ;ÇŒå¨3-–˜ª‡Ü~‚+Žº[² _óÁL¶ÿ+bñR&Q‰!úQ³Œ}•Ýêy~C-•bºª·¼«¢ôJ t™=[yài\m…0ïFûû‰wíE]ºjSW ¯ c ÝñæHÌzûzse¾èÓ{%:ÔõKŒ?Ǿ3ŸŠß`zµ˜î; ã×TCb7$:ä©E(zqÛzSÊO=é¸*dª‚›'O¢öÐ+ñlÅÉxÝï’óAÛ2©Åé»Vû™T^ý…åªL¾•L`ÝGGR3Œð*ƒñžÕq‡D›4_MXfÓ›YrúVGKPZn½Éñ>É’4UõcÉ-Þ $DUTñ-ÛÅp ,ªÞ²+Uìã8,¶}¦#"ƒ1Ý}ÁouDGNÞ¿^—øg‰ª0è§û» ÒãÔ·ö– X:¢¿Q;­ì¹’“ñŽã ÔXÈyOn‘eüÄæÆ~k-·­åú GîÇÈqeKêW«¤4©ööi?Џ‚»,н±Ân^ÛÚ,Áƒ_°]]Kò²LjÞäfn)™Cr’kÊÙ!4€ëý‚dˆ@M:ª$ˆ¢¨º ¬Iˆ  ž=&$™Ki¥µ™ñRl˜PÝzYª¡w¸â÷) ï¥Ä0ËòRlàB2°eù–9•ô× .•zÊ“0Þ­ABq·ÝÙC·gê¢ÈL†M¬º›¨ÍÉ>'cÄÊO©œ Û‚ój=í*Žé±'Tݪî\”þ{Æ=ÈÔaŽÆöU"«°C”üFÓ¢|[#õ¸;®ú‡iW5™õóÙ ö1\Y}—pq·THI¢¢ìºÊsl&¸ß©b¤×$ÀD¤¸³áDp_bž+©9°Ÿ3•5–QMÔl;CÝÕV=5OŠeÓœu¬2¦|7U‘#0áL­ˆN½´p' ¦ÌMEÄàÛÞ·Äòª¶nqûØåʹäèb½P„“¨!Q$EN©¨Ÿ*¼ƒÈ.ãÙ)8Sø_œŽ¾4ë[ªxŒ˜; §ä§d[¸@ + Q\6SÔ ÞG8o.µ«Å(ç]@²r͘ÓäT³›RÖÅ•!ùQâÌ}IÙ–rm€–ç¦Ð<^¡jW3Ö6Mpo)ØG‰óFÚ/£ElòŒx™s A%gö§TíyQTWM>àû¸ËÍ’n$$›¢¢¢îŠŸÊÆø‡‹fü/3ó„‡é±+NÿÈ«;|…áò,áï÷ž&Ñ7êšÇ0 F*Ä Æb X}ëÜóÆª¦ô—ÏÄÝ}Â'%ê¤JºÅ¬r_L[ʯ©bD—Ò8̃e&l©ŒHÑŽÙ«míÞó6ŠEÒ¿;äÌajøú-J̨uÙ__¦°áFˆàµ: r"ª¼ ¢ìg ›D5î¶2³®qÖJ|ÕFa´o7„2÷Œ‘h7]×ÝòM@ÉÇðú>6‚Ù5¶âIM£~t™”†f3 þ9ÂåÄ2(®öª§^õƒKWW‹Ò°nÉv46xÔÞx…¡m±#5R"Ûª®ë¨¼wòû"~#2¾}‰ä.Z3Vý½u$¯Êçv£büªã9À!fk’B.ÒAôÊ´.aûpˆÀÛ?HX9HØ£ÄК© )]¼t»÷'QÛÇ\›ü½A‡Ê´Ù‰ æE] JÇ¥År·ô¬ûl™&åŠ#æÓN ¨I²whfsNg'1T1Ájʬi…è½…²G¥íûOšïû:jª‚ª%c‚Í|ŽÈ¢{´ú¿.Ìë(쉡}º·ÜR”Mª‹ ‰¸¨J*‰²uÔ;f®ÃžÃRb<¢AÞÓ†Ùvš!&註*o­Õ6Onº¦ßn»¶^ßÚòÓ•Y<+êÇSg Ø0܆—ìv_­:édð¾k#Š ¦¼{¶¸ë¾>ãHd²aïídÕötr7×ño2[6äF-¦¶Ó°nÁôœZûQAiÒp=Õ^í÷W»Rã˜ö ÜfÎLú*ù_ sfpÄVš­‹5VýqŸ_Tû»œTåDAÔ*ÌÛ—?!¬‰6²ß:šŒµÖm3+ù«ÊÁöÇTº¾!Þ;ÊÈøò¾NEÄ2Ý)™FÝÇêQÅîvË^‚Ÿ}؈½¤›“{/…NUŠÛ1wAvÀɪµŠ[¶à/ó(®èB¨Š*ŠŠˆ©©ÜµGTÌé5v•ÙQ\­<ìËÕïGb¬ÞžŠëÐëkÑNL†b‚) ¯†å©¥ã4Ò±ºGl"Zr•L§‚žòK 0xüwОy¤Büs2ì÷D‹GG*cÔÖ°¤³iˆå0×¶e5¼Eï‰>1¦Ê„ÙýäßÞ!^‹©5WXë>kã[féùJž…§¦2Ôö[Yö®TGeÒ²¯ž¨NED˜bI<Z›KÍôÏÍüéÛL×dG ûy¸ìµ$ŒÝûPnrÕ“VÝ7ˆª¨jH™Ênobý„œçœ’Í%'.p—ôšŠNï$T8©ß5oÒ-¶Ý“:ÒÎSPkkc».ÂsÄ€Ó,2 n8d½DQUU|µ{óGMž_q®Ipá×pƒñ;] Šj1Z°­}©dâ,·[-•;ƒ´“dÔ\{ægƒ:ëƒ0Q£²q ÆJ‚ )I ú· Wî½»{ø8‰©57P*ó,7(ˆ‰"âÔêùÑœMÄ‘S¼ WÄHW¢õßTøÅ È Š¬ r^˜ø°Òlr$›Ž¸¨72UÛÏMPN¶° ‘Ò¾òŽú­YYP¬ªßIdIiöí4ê¶BIâž •˜óV?—¶I"êÝÿŠŸ5÷ MÙ2žØ{Üp‰UvDDM„Q׋쫭k8{5e+q¼Ï…ÉÀ9Q©ÍeqlÞQ`&é¶l ˜i  w@ä ¾±Ún]Êñè :Å¬Šƒq¨v“#´NMv: ¸BámÜ ª]¨Z·Ë³ ¸˜æ3BÂÉ·¹œ~›,¶žÕñ"%è"(¤K² *®Ú‘!ÚñO¾½¬Õ4e&Ë_ï“ï ÄðdÔpWß$EÙ!ÑãÕq©iàd:Øm£Myªøªøª¯U^ªºëÑ=«á§®hæ56ñh\…G*3¾„Ò Œ]'4íï]Ñ|õ€fì\À°È¶ö8_&âÆÁÚ ˆ¤¯">­'j‹èÛ/n(j».é¬^Ç© “ËhncúhÓox’“×OUÅtZp—mþκ̪«2$¿Àøå‹Œ¶+-¾o•}ÕÓ ë^5%OÀ&ŸxWpïÕV[ŠÂk—aÇs"±tíËÓŠöÚ`‰×Év+¨£cl»*§E]“qÖFy¼«p/à›¯¦º%yà”ËJ’å6ñO°Uˆ“tCUáEÛWr3Û{zÄnÂê õvR¡¥\}…µw4ï0ꊓnö¢™}º¯õ‰ÌzÒ^='™Oc³e ¾{ŠÜrÿî@QK»eEÛ[*lº—C“TE¼¦œ=²k¥‚kì$óO!T$ò]"ÌzË‘¸i•ÙÇœî—c þÒª{óá¶ž;þ+cûBšfú±cÍ¢ÉÞbÞùÊBi–²†c¶HÄY²AÕ¥>ÞýˆT»P\è›%øgØÔœ'ÃY‰\ÜtIs¤W]I/Qº†ß’€ü³ôÕLýÞÖv £|™ŠÂ‘'‰2ww+`ÑÛU:·_DRÈ+£ÝQEE–Èô!÷Ñ;“¤K*ÙlZTÛF f°Hëc>À`Iº—éMcy† Ï0©+›‰a0 ˜j$°ŠŒ%sÒT…STÓ@¤DÈ¡¿ß計¸5ÖT’ñ»Ñ…Ë È(üGþëaª!"öª/¼;/ž©>dñV ɸËùN™•@[¼5ç¥6»ì„ü_‰¿]ÐÃõ¶ÓÔ-tmdâ~äž_ÈYz6=ŠH,©¤_$ÕO=BËî³înÁ§7tÅÕ¬’°ˆÊÎ¥f#[1,¨æãhÛ@›Šî«×X‡$b2¾3Í*ãÚÕ:¿|[|•·õ\l·"EO/äaß.øüÃwÏ•I`•‡‡Ö ?tîãÔVBqT¶ðÔxpذᴠCŠÚl 4Р6‰à‚(ˆš~$¦•SdÔ¨¯€¸Ó­’l@`H¢H©âŠ›ië—|¡œf ά‹>¾õeâ3‰UTþ±Uz±ÓßïÇ^ÝüCmDÁ9²O r¬…Œ7!t>È“mÊšÔ{cÍUè(¢çõšT$QT訽é¼Ìó†(1Œn!͹¶»M’"u#%T÷ˆ•uÔ@äJ÷èøö•ÿ‹â~!•àÒ'î®nÛû®Ìp}æÚ-Å]¾þë¥Uê«âº‰gcM„»‰¬Õc•1‡cc%vb?¬{4Ïzþ»„‚ŸoM\åõÐr{¼o* ¸žuÅPåyx­¸Fˆì”yïIÆÉµ3°Sq$-d¹Ó}]ÌuD Fv#î±\ø½×ä›îº.5ØʶØ"n‚¤»ê{õõìD“lÿÅZ>ÃbJ‚!ê¼B›™öŠ'quÙ4§’å5ú'UK¬G/ø./ô´è5È”Šnš›ë{¼×Ĉ£²HKõªèZo’éãªô’¯EOçy DÒ9äµWà½Qk¦1%™£%þ–®k­j#IDr Ø«hIŽà¨“n8&©²ôëÓËMbÜ}E&û¾~%îvöGfé³:- 6Õ~83 ½ðmÍÈýíÐvN½½Þ?˸Çq›äXÑ$J*(´°ìBï«ø©¸¨ˆù ®éäPÛ8ÖFµf¶BŠIe™M¡Š8»ôßmüË蟛a^²ã{'ŠW"ñÌTî(jK»¶ôí'A!OyöÝ1÷‡eN•ܕǯEÈòjj 78ÜÍ“])m˜Ìɉ"M+¨¨Ú—j¡{‡î©&¤ñ×!_ÎnòÖiTe¬ÄH¬«Éez !?êt>Òt –Ú‡ÅÓ\PâŽD–ëœS-Å^ÊK“îvE ôduv.ëл›O-v¢*ªôíOÔ¬C‚÷'ò3ëØ½3 ‘ ï±Zدs1EÄ}ç?¬Ó6¼Ó~Þ@ãõœqTŽGÆ ’l¢¦É/©9Áÿúª{M´Ø M4( 4‚ )ÑE6DDö&‘S¢§T]r'Ë›þDÄw8˜ v-änî¹­úlÄ£ÀSõ]%ðOäs71«&޲rñ¯š®à5ëÄ–2Y_d»"uwóÇÙü‡ñ쾊EM#©ÁšÚ ù8Ùt&Í<Œ <—M3ˆØ¿Î|_d^:Èå d•¬"ýÚ‹—7I" ÷X•×dAÔ¶°û—"äÕ)ÿxð ––¾þ°üÆT}ý‘\;|‹JªH(‰º’ª""'Šª¯DDÐÍŒ÷­À\ida†ÂOÜå7ñ [záäTØâD$PŠ+Ð˹ÏbkÇr%ñöªë7±n¾F‹Ë—Q[’K‘øò§WdÇÜiQ¨Íª*"‘w.ʽGaÜ9]SÏk‘.fÝ……~A5÷Åê©Ôm6f‘‘„Dp D;S`ÙzïÙ¤õ Is dH&[…Ùì„áö"‘uÔ¼i‘òf­O™äIÄè©*ÅP„‰<Á”"û4Gžr,ØðÝ]ËÄTª ~ÁÉE)o'µHÇf½hgÅ*îS¤²’äûI顪þv2ÃL¶ üȉ¥ã´ø¯ˆ¸h¿ ‘uññ*楢î›ø)"^D/ÅVôéä96Zê8žeÝg‡öš=²Ùú½ãDöj5ŸÔ=ÆùLÂF „çEê™çá´+!Dl•|ÎÃòÙugù¶Sl·‰uf“£¤…vz6#ê®÷*/bvì›Ûô꺕ɶׅ,,·óõÎb?!Ì‚\ $hø«À™ †¢Ð{Ý».ÈIªÚÎB©^1ͬäx8¥«í‘ÌW×vJ‚Kë&Ê‚}°÷ðÖþ ¦ö5g†9ÉÇ÷œbþYl.‡“pçBOºÛ½z!jÆsxíksí§5ek3áZW_›Yᨪ« §io¸ùjÃÎíÞ?"iª©“zV ’9M|V¿ÔeÑC^ÑO$EÔi¼¹âu5‘Ã*ªÅ»Ööíßq£9rÛRXÂùªnÄ~»’¡žÁª18øT$I¯ãAÑø©_!cJøøÊ"ëP¶=œRRß»t]-¤{40Ñðnß'ž*óu±Éw‚0ûϺE°6ŹtM–ßйȭã›m ™#õí¹%KÔr-|a™ÜwWwM¶ó×ó}H¸Sø~õ›{6šûòhe'Â]Åéâ‡Â4OÚ_-A´­’k¬£µ*Æ—pu— ·|Ð…QSèå@€_õí]+‘1F‘}ç.lˆ`Ö€§š¬§ÛèžZİÆKÔ\v±ˆ²ä/‹Ò»{å·9…³Ë2Òa/© úˆûE=𲤴e$W[Fr,ÖW§snjì¾Jž(¾K×Yœüv⪪Ίõj¡à!­îH .8óó‰\˜®HTšPDhznž:VfW7.‹g[bÊ*!ˆ>Ñ¢ø.Û¢¦è©©Ö¡ì­Ù¿ yá4¥dóÐÔ²„Z‰èF‚¤é*{ä¾Tß}¼ÓR«æ´BžË‘¦2IºNŠŠ§Ö*©ªLRâYKÉ8bÎwÝ8âîá·PiùsŠ‹×c€ë ‹ç×èùpáæË½Œƒ+•›ä¬ ø×â1½fEÄý“›)·ñQÒªõUñ]QW^rV)‚;WfÝÛ¹klJ¯³Vu¦š“ Çš7s½P“¼G¢í¬~©eRÚUb£ùõ¹2áØ± J|S d¦¤Š„)·º[j~%'òô¢Î#5[¦-¡VÝ¿ ]õe`¶„ø#BÚzJhgÜIºt]5=úH4·y;«ar0éš qÕMÛd¥WÇyöy=õh» }Ñ>‰3f¾1aBdäL”k°¶ËB¦á’ûQUu’s-³Fͯ)Ê4l9ºÍ‹Bmš8Ûˆ„Û‚»‰ &èH¾ÅN¿FMžAÅÙ´È"@õd¹¶Âl¦ãŽÂÙHíRAê¾; /EÔٮ˪—.¥iâ¤)OA1BlL–šG~òm;w×ñ ¬N±"}‘Æ©i´mö§E~¹"|Þ2QÄD$TûÚ‚Æ•n-"XɄٵÝóVÂ"ö"ª¯ÑË~ëž(buÙ…[d¾ïæ4O~Y9?hØÁÔ?Ft~/ñí5?T&ßÉ~ÚR§Ö¬·êÛèËkmãÞUgxL› z»#Ç£5:͸aZ-d?Ô*摳ªæÊ«Õ•îÖ,Ì£‚ãíSÁ\«nlÀ"`wßÕ6QBê‰ã¬f¢C0ë'Å,>VAùDЬ$u¡íÅ-·àÍLQ¹Úi{48¼§Ø4jÒÊ\(Q ×"Á‹&IœxqÉäCìi½¼Q¹KdDÛè©ãÊlj‹^^»‹Š‹¡÷Û¯sy®§Ô11þÙ5&F<(MxqÁ6ÚhPDòDM8Ð8&ë(„óBH¦_uHSª"ùoã©PßÖp$!ÆÄÙ4OtÚt¸WoO·TÜgÆ95¦3OȌʓ›á ¸ÖÁ¥h‘$I…ê÷9 ä8¾‚ eØ[—DÛQ`@Ž Âd#ÊÒl ´Úv€ '’"m«\n»Ífãé¾@õ[{µ|ÅK´ÕT|ú"oÓ~‹ªÛËåÖ Œp&‚†PÓtDT‘o-ô›.þöûê5md&+«¡7VÅ–ZðlìO¢}M‹)"¾Ò;°ç°Iº/‚¶à¯Ú$º=\û‚¢?ü+ùBÛ…åÞLTU­íÓ騈».-žž£âƒe’Iô~Ô‹¶ú‹è ûŽÝ Éò”±gå\G&rÒn²:¼ÈX°@;l©Úh›ôÝXæ9løÉ¿@rvU`®zž½¤çJDÇIÅûÿˆjÞh‰¬ë“%q¼¢Ìëq…^¾%AhÝžÄyÄqÕöªýÞeÇ\½Ê%‘“âU·Z— SÔô›BEî"%^ˆ%ÚJ©¸ùp÷:JõáF#ÕKâFr+î8ØIFT•:§r§Ö¡×Y×'9m>#ùŽUø|÷A#×GyÀlP‘·EÛǵ5A‡†]aWÈX¼‡2eL"{Öq§”d‘6BmmÇÃÃ\× ò cyN7° Ñ95dÇøW_v2§s¦›.æžu×ç¹EºØ_\3_.¹É °‚!ÕÒŠø¢ì¿N[^)Ù;Ç`_°>K2µÅ%SëVÉ¥_£¯‡ž¤Ìʲ::’¯+ÝiŠ*£~ÖT4i‰ó? [»JN©!õð^ÔdvÖÕÍÛ@¦®“:]c€ òw³µÄ!ëÛ¶ê5QËÃ)¬ù¢D˜â$ãNGøqnICšÉªw ¢)ï '‡Ñ-ct‘‚ä44sOZ»XÏ’§öˆZø¿Q>Óõ½_.Í»»¿›Ròêy^]–Þ¯U%›}4ÑU|÷O¥eN¨º‡”ãð®1«ˆr@]Õ‹,9ê¾’iØäù¶M¼â!8¨…ç­þ˜LW½\ÊácñØÕ%c¢ŸR8ùþd3ÊÂ5JD­”âZL{áãÆ$h»uí‹Ó-•KeÛÇmX¶y.;iŠTGucWÐä_Ä s§$T)*¦ŠätUŒñûå¹+Ĉ›¹!Œ]“+èå yyüL€øv6úýGmcÔ,¦ÁO]'ÚM¶(kúKuúâ× «fgÞô³gep¿iÁA5úÉ}‰×ÒGÅmã0Ŭ·é»Ü¢Ë#Óµm‡¶Õ^:ª=­ Txì3P!¶KviWrûWP¯\©ŒåÕk ¾ÐöYTTVÀüPv%éõê}ÑbµËkhÓÌYNôQ öä ƒÂâ&Ⱦ ª¡.Û®ªjÝÇ`9[Bê?IšEn+¨ª¨mêª*怜2,^ºæ{‚ÜÉL‰9Ú>EÑIØ[¦¡ î+[f•Í£0=V–‡ª6 »~χժGÀ۸Øcæ ˆü—ÞFQ|öÒ^VaõPmÄÕÆçµPÀËÄ>è/_Dú2ªM¿®HF_1x\d“ëGWXvHkÜíÝ4)Rþ8ÙWÿ= FIi§`ä›db„Œ7÷ÝQUß°|ËÁ5t) Ë…1 ~$¶I ·Zq€À‡t!$]ÑS\/t=\»ª +í ~!´_íã}5×8å[ÓïÖ­èÑ>8Ū8‚ê§&ÂK‚ÜVÕUò¶¾ú ©&ʾJšþ,ª@)e^.,¦ÐVP")1Ü«·x¢¢ªyjK˜åôÀ„HÊÂï¦K¾ÝÈžì»/‚êκ›*©²¼ƒKÁXÌqÅ6#TA÷¶íꂺ›M–Dƒ÷ ~aBôFxuZ…ÞáïÚ½zxlºŠ -a–R,¢j4ëÅÔÏQE{‰¾¾ïÕ¬ÉÛ–¢´XýóÕ¾²m –ÓtSî3ܾ´ÛìúDU7BTEO©uŽEUÝ*åZ×·ý„[)-Š~„DÖ-‘g³òU¥Èk,k&1_2oóè rm´ÑmÕß¿bíRÙI=”c-+ïÀ2l+N2¡±@hU·‘„vØ“n¸¦rª Âä ”ïUÛd}©,–ëìØõþrÏøÀþ®¿Î™ÿÕ×#SRWSd´<˜›¥²Fü¥\†Ý#*ºØ zé**¯EÕe[–Í*øLDr[އ{ÊËBÚ¸^÷‰vï¡3 »°§Breü—«ú.è$Ñ;Ü`‹ú†j?V¿Ïc"y~3Ýk)޳¢—¯M`ßo¬ß^èÎ&ß{Gfª¾ ü¶Ès=ÛÄÏúšã{«þ1Ç­nçTïkc* ›Ï>Ûî¶Dá*õ_sm²[þ€ÿd¯ýžÞ¿Ù)ÿg5ýM² OþÍgúšÿd—ý˜Çõ4?ý ÄvÝ7Þ­îu›Ñ@ŠÔt\‰•A‰‘@m†Br“M€§ADO-^̃‰ã¹n$Åt‡3Xòe4ªÀ“hذÜPU5UU%U1ìÙ=gXòWa±‹ü‘†gàäóõÏÆr ú œ§ŒÕÇìT袞;ï¨óîVexÜ·WØdÈ*¯ÙߣOa/ûÿFé¿N½<F§»ƒ`yf'ÊÿšvÁHm9·¿ÞyÖĽÅ4Ý}ÑM—ÅU7]aÜ·±~íÊuÇ34o ¹%誌¼»&ÝE_í\ ʬv{²ò ›–6-“›¹9Y'‘å]APWÉ5δ8MRÒ³k‰6Ý31[XñóÄm´H‚G¹Šl½WP±ˆüy>“>¯Ççǵ¶~­EF@°^¯|ž¤ž¶Þê’&ßwÏ®šcÐ%ÇÈé¬nj%°,­ð–h`*­ì…²*’"ù)"ë†j†ïÃÔbN7e4/I%º3{¸Ñ;QUÃ_ök<­¹Ä²9îÚdr¦Æz%6ý=Ô:©uUO.š‹(› L¶ð¶i±Š8(H„žJ›ì¿@*ø!"ÿOT’?VÂÂæcKíìä¯éMbÿ”Zæ,‹;ø¼Ä-ÖZ´?—nª¨¾‚~Þ{wtÖ/üf]ùbVGL„·U•ØýÊïwímÓ»}µÇ6QBt ¬ò¦<ÈN¢¨:з!ǶTè¢+¾—ÿ§TÛèÏû½³ªoñGýÞ¿ÙÕ/ø¢þï_ìæ“üIu¯ösIþ!º×û9£ÿ£ÿøµÍkhÚv\×Útcì MÇ2EßÅ7Ó•Ö_–¹#õîx›ŠŸïê=ôsȲzWذo&´‰úé”n<ÓeÁ…!ÐWmåFÌÁ„KeTEMÓ¦ú—Ç·Xeuüš[)õ™i‰¿!kà, ¡‘-¹M«`2{›ä™íâ)·ÓóޝºPó”¸h?â®ë¢ÉûĵtüzѺÅ|§#Ó’! ³H†:¢¢¢£ªˆ;mç« r)ãvŸ‘EÈ,£*6(í¥<­½O(6AuÑîî_Ý^î›k‘j₹5)žª¬Šõmõ÷2‰ª{¨ä„żó$ö>عÿÞú~ò¯M—¯—³Pî/²ëxÕ|Æ'űˆû‚;Ÿvꊨª¨£æ©ç¢T%Nï½·Mv÷/jx&ý5·q*'–ëå®îõîöï×J=ËÚ¾)¿M~ð¿uׯђ^¸» Md©Cõ˜4J úKdÖ BðöI®£†2ÇØû£®ÿçšêUãOeÑ£crÛ£¬‹7S"Ë®îÕˆGW7½ Mú§ôõX¹ %¥ÄZƒ=»GâdºÃ@'+v ÀQt·T]üw× R¼¡qivøûº¸ÀKþ„O£on®2,½ Z«,¬\iÁld0ðÇs±{ULQÒAîN›ïì]lºrœ"¸îó€­;èÆXMÂh^q$!úë#½{TUvM¶÷¾ŽA—¾ÊÆ9f£ö”W?¦ºþFËÖÿS‘ú[{ÝÿÃß ¶ÞÝõó)‡úiŽòöC&3+Ó¶5â1nÆÉìT”»jXÀq¦g“.$d  òŠúdà ‰¡l¤ˆ¨ªž ªÜk0¸; ø·nG¶‹[‹•u´gZO ·ç/¸ú§)Q¯GÔCUNº–îiT6“ÿ©m¦ Í®BRDSpc8àö÷'¸i×ÏMáVð_‡ÔF¼bòŠ,5F–ÚVK‡1=EšSšî%Dp”wÜ•vúg ¢NPÁØÉx!Øcr‰§íøib¿biStEÝSXæI’ó]ÖMbõ££sƨ þ[d6ÛÌÖÁ¿“Píqå%4ðNåÔiÐb|ppâIm[uàEVÝlº‰".Ä+à½5•q¬¥_‰ã»w¡@î]ÉÊ™j²«]Oj+'ÙöЧӄvE;b}Ù1kcÃþ˜÷£jŠ}ˆªHš¿³¯æ;îFn–šL¹´“ØØ-¨’¼¹v©§oj'ת JËØ°/ŸHŒÝȆ!©$]¾‘¸†½Ê›¢—gvȺ“Š}ÅÔêÀG/äUEø–«ÅQUåBB÷QQKµo·¦°ì޲÷"Æk¤åÍ×0å{m£Òi7Px}aDh‘wEÝ~°]dÔîR_XÏÅd«6Á(8Ø®Æú¹ê" b»&å²îºÆ."„ûdz0îÆ(kcúÓåí÷ÑÝ{¡*¯·Vk_m]•…¼¢²kЗÕßdpI6]—eEò_§ ㆽïâûfäÞ oîSÕ˘E·‘ƒi¿Š–½ÔDî_tSï–²,³ ‹Œò¶rzë&§UÚ¬L¢ª%GcN@i‰ˆØˆ»é/r¢ö¯qt]Óhs‚ícòØmç«_QWc™Š4â‚÷®Ë²ªo«7E{âñþ$ÄPfÝÈYŸj0ÀoöýIxѦc6O<êø6*D_¡Qê¼®—̯#̱Æ~ºMYI´±†&ø•6ýqÖî/BTBÒx"’þŽº°³ ™Õ³Ø;;xbÃæÛ„P›(¨Ão2Ås©)'orúi¶¦ã‘‘JVaaSŽEñ#¶±dO?uÅ×åš|Âü¥åévz}¿ðuËð=8Ü›‡c¤Ûd7«ýz9ŠžÕDe•_µ>Œ`mqFm¢[Ô|QMvšã,zS°d G%DY ÃŽJÑ¡+ïÅ¿´u¶’©š:˜Œˆ×ÓÇdc7µ÷‘¡dP;wêˆ}1—Úå6 c¯»+º¯ªƒ>ÒTHPÁ¸*üóõB,(@â˜!¨8ê**l¢$DÑ <WÁQ|Ñ~Œ'•'8§#>ÝAIi,“òûDé×amÑq°ÒfŽ6H„ÛƒÕWª*/±S®²|÷2Á”Wó'ÈI« àØn?kŠg².¹lŠ¿wEI³£¯²‡*fwkØßç—Hø{mR&‰‚QU^åMÕE6Õ1Âhо #òCm¢ªþTû»Åž¨ž?ù{Ëþ ×É4$†ˆ@b»¡"õEEOTú0åÅkâÙËÇî?0“[­´Ñˆö‰zŠ=ÈJ;*'–¯ëïðWiKa&Ó«@ùHu’UKÜ#^»¦Éã®<Ã[€Âßc¹XÚFø–VA) ݤ»8=w×$Úá¶8µ” §²mãwÛ"¨ÈIÄ7›S Nò$DBBM“d]`ãK¹@ÎÞ·”N8 Åm ÀïÛ{tÙ5ó5ÈŒ£‚íãë6ªò“oŠ#‰¿¸›˜ýíql¯fÆ÷ ‰&æ/ñëâzC®§¡1’DNþ¾÷_¯eE¿µ²ÆÆ-o_X­Ù¿fáFkuo×qÒ!ïE%ê+Õ‡_}Ðe†œ}ã^Ñî"%_DM×W¼³`É6cWƒGu ª(Ƥì½Ef=»ŸØ jà ±qÚö‡R`M†]öòfØ„۬º*6b¾(Bª‹¦8âíçÆ,”ËŠòW•I`}â©âøHŒ‹³{þñ½¶ê›%Û»¼R<»I‡*PºóJñ'MÜFœ%ÛÏmE­¬ˆÕ}|&Ѩp˜ÛððþFÉ⾑‚V8c…R< ÉW¬ªˆ¾B¨cMÄñ76E}Sî»â»i¦i¸Ñ£6-°È"m¶Ú ˆŠx Š&ÉìMLtטëJ1-$A8òf`’#õò^lI@ÅÚ_ ‹ÁQu£iÆëàw›Æ®¼ë®š¸ëÏ8]MÇ ”‰WÏU-iˆ^]c·n|M­å;?ðc }TîŒØ¸ã›6ªŠ=ª*½wµTà ¸ÁÚÙHmè-Öº„þÂ=ñZ#F×ÓÝ•|×eèšÌòçõkxwb¦;ªÛ)•ë–ËûCËõÑÉttmz™]$òŒ,…\K|}ೈ-íúÎOì%Ö7˜V.ðrzȶqÓöRKbâ‚ý`J¢¿ZjƭǤF ÎGY1ôd5Þ*ˆlºˆª+ÔI¢õÖcg|‘j¡e% ÈØ»6³o¤5"(¸Í™i?cuçÀ€H[m;Sn»ë#ĦÈr$\’½ú÷å2ˆ¦Ú<;w —BÙvÜW¡'E躻]hõ—糂c¢LµÎó+Øôp ½8‚ê©¿)ß&bÇm ×Ü_ÅWQ~a‹dáœmþkÉÕKÛ w^îbâEsHC`8h¨&jï¦Eº §FŸaÐ}‡À\aöÕ „Ä“¢¡"¢¢ë"ʸëbÓ”ïâÅ \€\i¹Ñ*Ü%nKÎI‹m˜´Dˆ¢£¾ýʫ۶«øÙübñeåíM¡‹vVYD¨ ›;Ž-,Ï{N¢¾ÙØÎM ãªçl[Ѝ<ÃÀ»µ";©Õ·[.¢Iáönšcä‡ÊÃ’ê1‹ò’liôn5ª'HÒQ:w¯¸çŠ*.úEEED!$]ÑQ|Íùfã„¶Ø©¸á*ˆ§URU舞ÕÓÔØ§*±ÜV2>MèH+³‘iГg]_{î–ë¶ c¸ô®©®ñÅTˆˆ—sqÃ^¦á—¼D½UtÃ8CÙkt’ÞÿY1š•ж#L©Kîp~· tqåBVÑ•TÙÓn+ç\ÁqêìrÖ@È †¦zhãl4Ó††Û “»’6‚=:êDÉ„X‘7åÊu{A¶›#2UðAU][ó;ød‹ü.â?äø¸B%[zêhΩ,¶á :2ÜüC@.ý‘6ÜvÝ-±›f-¡oÚé4ªŽ2~m¾Ñ"Fžbh‹ô+jè¶°ÍPŠ$ÆAö•SÁ{BMÓÛ¶¦ÙÎqªÚjH†ü“Am˜ìëÚž‰²"'ÔšÇÚz¦ã»8c2…«Ò6EÚ¶Tþ&L+ÞïjP¬†Ìšwn‚®É­‡~Ôè;ªªìžªõUѺñ£l´*o8]@Sr%û7ÔîL±ŒL[ó¦Ia—§¨›85[¤†×ÕøHÀàÿé>…EMÑ|S\ÇÀ΂± ½ÍLª¶€ÅtæÉ‰õÒÚYu²è ãfŠ„‹õ¦œ—Ã×LB*™q¦Dë‡7ê£]?ßv7ÔÞf‚¿‘(m8ÖÈ•Vé•Z÷Kþ"ÉŽøÎ'Ö¤?f‚M\èöQ7 ÁSê&Ô“[*m®ˆ«¾ŠUµ„Z¸À›œ‰‰ý“Š)£…Ç´6|‹=A_¬iY¬h½¯YH@`Sû%ú´ÔÎY¹fMp’8ÏQ›V"¢î):Jö½-SÌ}Ö÷òTÔxq#µ FѸñXm¦›è ˆ"ˆžH›jó Z(Ó²¶›f°ë,±øê*ÉWº½är‰ @Å}Ñ!ßÍ+9-§A*sq vÒCV E°ŒÑ,"2Pu¦‰MͶUqÃS5良j®žâ\~AŽ1Nm½Ê·¬jj÷µNɧ‰¸©»Û}ÔM½©«›,f§Ua¬±ù´x=„ä8ÄŠ-¸‘…}Uh6"QÊšþ%¡Ÿ'ËÄ(©Qy<‚[ øRA|ÑÄߨI¦àrµ[p")#q¹ ¤ ʇUWaø¶º¹ ×Ï»pßÀ‘4ĨψÒ[cIhÛp 7БSÁSSèoa…M›~”ØdFb„„žð’l¨Š›.š¾,žêýšè×ãõ·¤¯ËÂS›þ”…DpБ¡õU<~Œo‹1§ ¼›˜.âbO*“ Í%[ k·€Ç†.¸KåÓT¥ d…GŒ×Eª§ˆ> E†Ð°È'ö ŸO|ÌÖ°^H\S•U´ÝO½x$Ÿµ+çzO}Bn.º/T!]ÑQ|)Zâu¢’÷ÎpÂIÝ=€šËX‰”RR[TÔb|2ärÇ'‹4#¯­Ô4x}EtÁ‡m@¥õ|öøˆ2™›LÀ$ÇpmI£VÌPÁTUD…ES~ŠŠŸDÜ_"iÏ„’@ü9ñ‹Ó—c+ÝdGS«o2^ðª}‹ÑWMñW*8ÛyËM˜¾RéAÊ µÿ)¿@” ûö7ÝÞÅt¨¨„„Š„*›¢¢ø¢¢ût¡Œâp Šó÷™'Ô°ÜÊl#6¥]DÄ6ý6AåRPûª«Ómµ±©þ;A€œ‘b³IL[dRûàÓÔ“¨êÊ(ÌŸÜ.¤(žðí²Ë´ vO£]a"¦Î$èÎC•tRAv;ì:ˆ@bª>½;[ ÊŒòv½ð4óBEý)£˜x,:‰î*©O£qú—w_=á8Ȫý©¬Û#Çólîºf?Eac7çï>Ç«9ºÚ¼J=›¢tóÖ=gqšgNÙÖC—*9ß<Ó^£ì†ˆŒ‹k¶ä»uÐÌk ‡e<qŸnOZ<Šž}Ó\y~ÄÔaɲ:¼j1'ùG܈…:~ pÜÕúÑÛP²ÆíŠò’Å(Ó4SIÑŒ*r 6AFEMMG·ÃÅQ5“âWÖqì¨ù Ùðq1ã‹`.=ÜÌYòâ€(6Ú£Í8ŠHá®Ú‡<­‡dÝu¢\bØÌN`R>möHضۀùþ*´-£@» ¢í¾‘?B&žã1|Ìžþ&ÉQ;ãc±¡8j I'FÛñEêº\KŽñË …ú¸ÎXY$VÖLÇ•HQùöîFfd›í¿’"lš…+Œ 0ÌŸ²«YXüÖ£Öä4* 2ßmòzÈl_4õ{½ÑAV‘<,ï§³‰¶¯,‰LÁŽc£Šˆ„­²Ú ‡r¦ë²xª®£`2Ø5â¾>XwÜÍ/oÛÜ^­m/ŸÅz¯§“#·‰&§e?+·ñ°iŽ™ÈÃ÷ŠëجÃUR4‚cÜý[„ª»z]Ío²zbuüÉØµò"«XÅâ 58G¢»W<cÎoh·öŠkeM•ó1¼ºê.=‰ÑÃÇ©!§àVÁio3-º™¯™©/šý|b_0óJªÛƒ DèßåUf-8ô$’ ©ê5à»!"Š–‡‰PýÕÏ“Ù=ìV‚ ùq…ºùeSZi$D†ó"–}Åõ\õ½>ÎâVÞeÀy—„M—›$ 0$ÜHI7EEEÝ>‡1ì¢?5Óãš³2¶úµ.÷™uµê„Ÿbî5æWÒÃyÁsK-öC¹{[xØîäyz¿ºsÇt]ôÛ­ºÓ¢†Ó ¨@bIº’nŠŠQSUOÚ×32Mà´¥c¹FœÐmIðS5íîEDök¤Â¦»uS-±ÞB²’ÃoL³¶q ®dzÍOºšvû„>ê´b©¨µÕÙ ¹tx펄TÅ´«G$—,7³°Iøˆ‡‰‰wÛï¾ü¼9Š™xÆ;“È¤Ç „/0P°p‚o½AÎîåpÜUïBAµÊ?øNãý Ýaßü†·ý¯£Ž¹ÆË-1¹rjî)"£^¼ŠËI„žØYx•QuòßW­dÏ–;$Ì¿Œ£ÑRX¬1ã<ÑÇyWnó÷;PöQûº‡Žcì9¦¨¬0ã¦ñwÖ…œýØC3T]úHN³>ÎÒso?–¢ ‹)Ç0©È‘ðÑAÃFšU3TíDóÕ¾mÀ¹ÝLzžBH–9{]ù=“ÑÙFX”Ù´ãcŸ¤ˆéžË·¼;¦¡Gù…âúÊœRC€Õ‡%a$L[ÞH>¼ê¹müH°›în6㊠ú««.*ÈbļvS¯¹IˆfŠºe”Vœ6Ù·¡uÅu·Ûv3ˆèÞ@Ô›¾²“Í\|Æî9ÇoƒyMsIÕF¶ÄûZž›ìÓý®m°‰šé¼C ¹o ¶ŠÑ`v‘Ý…k êqzañОuŽÎ¸J½ ¾öÚÂx²€–DlV¼YfI³“纪ôé®ù©ÈfâïíÛËù8÷ÌžTvY× ÆÖYM;¤^á²U²†IتŸÇÖ&={õY}I5»{˜­M«žÒî0ð¡¶iö¢õO%éôEŸnS¢âÅ(˜Çê«nX¡jb†³æK´µpH›EAVcEt…TÕP“µ¼‰¬z×®œâ­8\²1¤KŠ¢$’:@jª‚Ž"¢wm²¦¹wX¹Ai”WJ,–¦ 8ϼ‡Øž¡=%U#lÎêñ4(F#º¯r"ëÇ¿<½Íh¬ç1MMžNƒyZF£Áªe†Xv[iéïÜÓF †ænö¦•6Tòú%WØDf| Í`Él]eæ6 q³EOT× W|»,YÜs‚xw>E5­~õÞç¦A¢”¢gáÚPïB"i.ݓɼ_2‹7‹sr÷WÊA"+Åá¼)»ü4 UûªºþΑvèI¸¯’¢ù§Ñki[O ¾ÊôÁ˹ñ˜m§¦H¨ù‚"¸¢„»)uë®QÿÂwèNëÿä5¿è}$KÐA72^ˆˆžj¾I§hqV¤ò6Xä8þÏ6Ñxo*oî_RUOf›•ÊÖ­3FŽÅãJG +ÅEw“ÑÉD:t ü:k Á°–áÕ_çY V‰ºãb0à?hò22 ¡ÙãíO¼¨‰ç¢Åñ¼~=Í£_÷Ó4¸e¹V×ÒMžvsî ) *¯kIø`}²±l^Ôqo-V»“ñýK[¤ZÛH†ÝVEè ¯{rA±÷E Q6ÕUU]\¼“+Ée v!ˆW©:ÒkŸq–A7ÙÄÍ}ÐÔ—VYžxä[ÎqÏ™ms†=øõpÅ{ؤ­%ê‘Ø^¦Iû×72胷 ñ¬xÉÌ]s;⦑;YHvF«i^Âx'ÂLï$]ѳÛmb&$eEEWd‘‹k·ÝâÕ~1E‘QJ->ÛHQß«Xâ‚ÉÀÒƒ±´í&ɦ™~–2œIQÓ&Ç>§`d˱›ò5×ö‹P9w›Æ²Ü³Bˆwî@e¬’•ÃlÚr$±}°›» Á@ÑQWmÑwþR‰"’l¨½QQt˜ìv~y†Ñéëñ·Ù¨e/UÈäJiÕ6Ú<-«Ì½,öF/QÂî&6ÖÖåÁŸW<ÈÒMµúÄÛqÛ$TTQ1EEñM4Æ0ÈÍÏóãü{Z]QË9h¨/š'÷¨¡Üó‹àˆ;/ޱ,HFË"³—! UVUÅrÂï#½–¤ü“½Í×^qIÂUTA»•CSó‡âóŒA»óGèÐÍvû…1ˆÇºø™§µ4ÌþåK܆Ÿ4n::ãfÀ­F˜D@‹ÑZ{m¼4£a„b<™µé7´v–aµbصÝõ »klŸƒ¹&ˆ“ﻥ«vÛ³µï»ºk®A¨ü²ûu‡NP»ë?E(Øq§=ãF]1ß~ÁDÙ5cX[Ù–wÉq&þ{‡3…Uˆ^â³£)0n[©E§7&œeóüQê¾é¦at³2 ™z¨á1‹À‹[mQVòìÐÓˆëñ‚ Åâôw\S.Ž{£ôc8‡!ár¹‘²["Åhç~Wz-Š+ó£Ù‚)AŒÃ{,‡‰6íU×!bÜÇ9 nmÁ¦Ck(z÷+™ie,‘'«l(m¢$Ï¢¼Û@]â@ïvÉ»ó8Wæ'0­²Œ*ä _?&2ŠGÈwQa×M–§²à¦Š!xjö¿$£\[:Áî$ãyö1êzÁÒ  ò~õ‡›0u“ý`$Ô|︲ã^P¯ÊÞJÆH¶©²ú3QYœÂìˆMHEN5ˆq¯Ìž6ÔéY•´l{æL>9¹_kc)TcƲ¨9_qUI¯Q•]×ðÅùYg•‰iä±½@+ØóŠ¡±&3ž-¼Ã‚.6iÔIuaÁ<·#â³ZHå/ ÌÔ=8ù}/ksÙòIL¦Á-¤]ĽôÜ ¢ËÈc$šë˵TDŠ;ý„ Ii QÆ”»Ueë§lfÖˆã³âÊŒb'5_R• ½±‘2‰|MÔ· ˆÙA4BغnO¿SaјÒ‡%Ø®‹¨Üˆä ó'Ø«Úm’*¯T_PXX²SåbsÚ†½÷Œ`ˆ2MÆvSb‹êz$]À»{…ï"n‰©¹ÎEž·ucÄ’ö[¤çž&ûÎÔdWÄ•vEÃåc ‚啱o² ‹Ô‘ic1¡rD‰®äD&¤*¾â'oM—\có^Û›qu¯Ár°*G' ¹Tj&#ÔÒ!+rÁÁ[Ué×TùΖeæ¢-qv Hà=?#’óhãInäI Ùøm‡¼ªª¢%}Ëüµaï–óF4µˆªUøýP›•([¨²Ò®î9÷žss-úkù…f¹x½|8‡4ƀѾÿðÔÃGãØ£-¢“Ÿ–ËpQKÒ'6M@ÉksÚ¾FµÉBÁ0|F[·¸;´ÔXÑÌÈWï¸çh7×½Qzk=å>a¶©ÆržRÈÏ&Ì¥uÕFûmCXÔ—QφŽËm©þ¹÷/††@<ÙG6ÑÑ’†*Ú¶©Ü††‹ÛÛ·]÷Ûnº{æbú1á_Còù á÷&¼j¬[dÝ«äâŠÆŠ¿àÐϧr/òÇ·”ö?“QÈKN=Ï Š~aClÚ~¨ê»w}ךUíp7ë± ¯òÝ[8Ï/c úò£1ºW_×n¢ÝÕ3„‰ê0î߈}“Ü o¢Âž»”f kÖmé7$Cv29ÐôÔ„N «ÜSKÑK˜xìÇ)»É‰˜µ­ eîH‰^Ëq Õ™:CŠƒ*[¢;µã¹.ÚUöõÖ?”WXr2åæùRc¸Uhú—¶î8¾ëké~*J›¸~=5VçÞ]ü›Ýåh®qæ9ŸF9œuÀVáËdÍÁH2ä¶f-¸Û¾öþ›Ê½ËÀyG,ðÓ¸¼?3ü¢Ó‘)¬¢ÚãRceŠ¥£ŽïssS}ÆÕÖQG̼7·Èò;iè¨"»6âÎBìÛ 2ÆEíö"'U]‘:®³®n™N-oÊ—1­qš·=Ù•ô•ñW¯û/:ÒÄ?«Þ‰¨2†Áº¹oN¯I½ïO¼ÁG%RîDí=ÑvîÙu‘UËqû'²¡°v2Ÿ7i¨o+݉ßݺíæ›m®X_ÿ§Ýÿ¡;ªFªc ëHU–uõÇ·d§k–4ÁŒ[ôÙßG³¯·T<ÃÁ–pÞ»äëj:íøÐ¹¢è®︯QºåWo¹§,ôɹNio6kËܽÆ1ã¶ëQã6¥ÕhôjwRXÏ‘€ÊÇÊpʲޘ4¤ì£‹:$r|Ì…—tQW¢ï×C"ÒÂ-drT~[Ͱ «àˆN¢®±Š|u¸ßæ÷õ˜Ö8õœ†­je«ÈË/Ì(J,Š®ê¢›—Aªš‰™óöF\Ó“Õÿ–¥u B´ÛNõ&j{”ôúþ$³stëÚ+©ð¸‡¶çH˜_if÷8‹`8ýlR‹$³$ô$ºË;1ÔRÛe ñ×úËùSåðãܦÈI¼—&YÍzEòòkŸ' —¸†l¨Ž“¿`ð ÄiÅhŒ{…UuiSâ¸þ-2Knȸº‡,'M E7M×›.ÔOx·]¼×Mcìfñ¤G%×ÝäÑ_„R+&z(ì[kç¶Y2ír7¦ã.4ó.ª¢îŠš¦ùWãb~£ñ(1OrØ…ÚU´ŽnMÓ0è¢ ÎµØ»‘?vÊ™öõDÕN7W1OCC šúj¨ €Ìh±i¦Å<Qú:Ë×dcÙf8ñOãþD«í Z+ ¶G£šýöÏd™?qÑè]{H[âq­cäËÉ¢ _¯UN—@}ez!¯x/QEO¦Îúê`WÓÒÅzu¤çaf;¦á¯Ø)áçá¨ø¥¤wë3™è‘rÞ_ÔdbüG\òþEŽw'Vdݽø"**‚¹Ü=LñÞO°…o f±M$Ga;GЄê÷¶ƒ²(»·EMCÃiùK5¨â&­«n&póÓ³¨Wª¥·6+pŸžÛÒà´4@Ëݪ‰¶É®3®äI9%w9É•ÌWX“&ʳ ΞA²Û2Mc7;´ÝQdöíQÑNùoù¹ão˜:ÄÜÇÌcŒK†CÅét†Ž!mæô!_n£]sw ơœ°‡W3q|‚5ÌØ>cˆn·`6o8#Ü€]»¦ú©…xìé6÷Î<Ý=O_.ÖÊZÇ'ɘpšuÒÑQH»{StÝuȘëUÙ|+«¬jÒd ø•ôRrDˆ®6Øw9w"DÜ•<×XÕc‘oŽÂ%\(ÏDf‚Ý×=V˜1ÈŠ„¨H©ÑvÕÇb¸Vwqo.EuÎN¼´¡›SSSmX߯Ñä°]ž,'ÇGšÃB@Ònûj¢_´—œUÊõMã<у´Ùäu­oðWM}6/j$OV,•N©÷š=Û4EMr%wúЛÆpLB¶iv1l¥X:çÃ=-T#£n5±6}TS§œ‰\¥s‹e9[Œ›2ì9ͼžöB(±Zç«Ú«º¢$x¢ºvª/]Ûb•ç="Uô¶¨Ð °û²# “¼‡i”LGbصÄÜCÈáqÊøÛEÉ—Œ-ò¼f']z–ݦ”JT¸„¤-¥ƒD„ŠàûÔ“°*åàÓb'äATÛacªv«bȈmÔLQQwMõ#åÌàñÿØ…†OǼ†m9/ >ð”¼~ÿ'mØO8çk®wl˜(ºŠ•ÔÌKb’F]j,Œë&ÖúÞJûÎÈç{òŸ5]È—tý‘ÓØFLÎmùÄYÃy&ÊÚrvŒ ·â£ÈVÁôVûšGDTw1«¹ºi«ÛªfYkzlf†mMŒZÆvèm¯»e„cÖ…FÒ¤™ÏÖÊ6¥°¯ºÄ“f8¹è·ß²ûÛc×øí’Gs$¯üÎÓm‹PÞM«ŽDïWwO¼ˆ£õégåœuMap‹¸_´ÇÀÙ' èjÌ„Tö÷êÖê³–¹;Xäêû #ír9 5†DÃâµÿ.³ø‚s½ý½Ñ>‰¹þ®¸6À“‹Ÿå°n0 ¿ÄMI‘W Ë8ìYºÿdgpÉ£‚b†ê¨Š»o£4Ê8Vì%øŠ‚/joýêÅÔÔ¯š&ki òá2&kA—Ü« mGéQ«hgExc¸ÛÌÉ‹"2â¾öÄ%ÑwÓ™¦c]r ´p ³:øVãH±}ßuoðÙî芀ˆ¤"=äj›é‰/D“ymc6-]1Z­éÓ¦©¤v[GL‘³%7EIUzh0rÇU¾-É*.U’5éül'䯒®ÅhÆBô=›yZÙµ÷QÔB Kƒ8;LÓ¬Y’8&+!ÅqªZÙzOµ™Ú§½‚Têj¦êˆ€÷—]Y=*̳.QÍ] ü›É2›@“i0G`iëèDŽŠ Ã½ =z’’¯ô7X} y‡À›y— 6!!]ÑQS¢¢éüÃå—"ƒÆrìæ$Œ›ŠíšvFcÞIë=; ŽÖ¾¨ª½Ñ¿ •´ÝKMq›†rê®$É <ù†ËÙN6KÉ3‡º®¨;»·‰G @ý5-…ÎÄ$BEÔÜ{,°ÆÛ¯¾™lçä,ÊXSr úé«^J·•ßuLMxTt[#ôÅ[*l©©g‘ãuö²æVʧvÑÖㆠ֙ 5-lL ‘{ û&_Ð ©6›–Ȥ‹¬qÌeBÿ‘q»øY–3QÀzCqÔ9ÖSž@UPŽÁÐ2-‘{¶ê½4ż=þÚ¸'DßÇÒ’Â:ÿjI§~¾(”¿Ï)ÅÖM—ÑÕ¥ÕÆ7,úúÂC qÆ™¦-ûä›™ õQDë œîsEÍòæ5hãWÔm7 ,yñ뛟¤Ù„RûŽbzˆÒ©!ôATUßO¥%En˜Ö½kŠ­f%¾79`Ûæ>Ø<û( ûƒcÚŠ¤½»¬š®JÈäE¢nÖ¾U”³l°A‘-» -@2ó0ެ«MI"?\K¦ê¹'2ÇóÚüʺ$L¢0‘£½%ºô®›0¸Éœ&ò’®în^*º¢âJ®#ĹV—Œ5x–{üL˜ó®×0‘3¯(_m´pÚ5CÛ»ÅWXÏ"ó­Í?Ài)Î=ãLH$-Ul¹­+XL™/g¦IôU[ìÛE%Ü•uÑv_%Ó?sÜÇ%ÕmÑšÌɶû¤°ž@6m¨>×@‘(*¤‚*‹Ý×U|òýòùšf«!³‹#½ ÅÚVáüƹce»+øuQUQwÇtNî¨y‚™Ý•þ4â r­ƒN]ü¤)ï §BF…ü—GKŸ%Vþ³äÃkºdÂñï™5Õ9ÖuÂ]N©´ˆÕ…eœwbXÀ|PÚ}‡Á[u§z˜’¢¢ø¦ ßÝ̶åyø»îDËIUØÅz:E5tÝŸQTˆu ÕíEéþåTTÝÅ4Vy‡cïÞ©V°U¨~Gù…iFª›ôÜôKÅŸ2\ƒû³Qq.&[ZÚoÐE›v}ËoˆÒ¥)q_!°Ú/i^ÑZc²M<޶TÆÑõ{j×0– (ÈíÁæì.)ùJ¡ —çÒà î¨ÕR¯–“º¿…±P_~Ï µp~´áÅÿ„šEÊ~eñ¼Q²Oňa@ó»ù I¶#oµZ] òg/rŸ)ïþqY;!*zÓö§ÂQµ§Ô¦º yÄ8¾7` ¿çm@mû_Ê|„vI.þ×?òŸÿÙsyncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/document-thumbnail.tiff0000644000373300037200000002570412424517753034264 0ustar00nightlyallusers00000000000000MM*(îÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿãÿþŸþÏÑÿþoÿŽÿãÿþþ¿þÿþ¿þ_þ¿þoþþ¿þoþþŸþþ_þŸþûÿþ?þÏû_þïþþþÏûŸþÏþoþŸþoþþ¯ÿ»ÿãÿþþ¿þÿþ?þÿû?þïþþ_þOþþ¿þ?þÿþ?ûÿþ?þ¿ûþ¿þþ_þ¯ûþ¿þ?þÿþ?þ¿þÿ»ÿãÿþþ_þþþ_þþ?þÿþ¿þ_ûþ¿þ?þÿþ?ûÿþ?þ¿û?þßþŸþOþ¯û?þ¿þ?þÿþ?þ¿þÿ»ÿªÿþ¿þÿ”ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿãÿ óô÷Üßèóô÷èêïõÿÜßèóô÷ÿâÿÜßèÜßè˜ÿãÿŠ©ÅÊØÜß蹿Ð\j’ÐÔàûÿs¢¹¿Ðþÿ­´É¢ªÁ¹¿ÐÅÊØÜß袪ÁÜßè\j’¢ªÁs¢†ÿS¢ªÁ­´ÉÅÊØóô÷¢ªÁÜß蹿Э´ÉÜßèÐÔࢪÁóô÷­´ÉÅÊØóô÷­´É¹¿ÐÐÔàèêﹿÐóô÷¢ªÁÜßè­´É¢ªÁÜßè\j’èêïãÿãÿÜß芩ÅÊØ¢ªÁs¢ûÿÜßè–Ÿ¹Š©þÿgtš¢ªÁÅÊØs¢s¢Š©¢ªÁs¢ÐÔࢪÁ†ÿs¢ûÿG¢ªÁ¹¿Ðs¢s¢ÅÊØ¢ªÁ–Ÿ¹–Ÿ¹ÅÊØgtš\j’¢ªÁ¹¿Ðs¢¢ªÁÐÔàs¢¢ªÁŠ©s¢gtš¢ªÁÐÔàs¢àÿãÿ¹¿ÐŠ©¹¿Ð¢ªÁŠ©ÐÔàþÿ)¢ªÁÐÔàŠ©óô÷s¢¢ªÁÐÔàs¢–Ÿ¹–Ÿ¹ÐÔàgtšÅÊØs¢†ÿSÅÊØŠ”±¢ªÁÅÊØs¢–Ÿ¹s¢ÐÔࢪÁ¹¿Ðs¢ÐÔàs¢¢ªÁÅÊØŠ”±s¢­´ÉŠ”±s¢ÅÊØŠ©¹¿Ðs¢¢ªÁÐÔàgtšèêïãÿÿÿùÿ–Ÿ¹Âÿÿÿ·ÿãÿ§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§ ¹Ô§¹Ô§¹Ô§¹Ô§¹Ôãÿãÿêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ—£»êñóêñóÁÊ×êñóÕÝåÕÝåÕÝåÕÝåÕÝåÁÊ×ÕÝåÕÝåêñó—£»êñóÁÊ×ÕÝåËÔÞËÔÞàçìàçìÕÝåÕÝåÁÊ×ÕÝåÕÝåêñó¬¶É—£»¶ÀÐËÔÞ—£»àçìêñó¬¶É—£»êñóËÔÞËÔÞËÔÞàçìÕÝåÕÝå—£»àçìêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ—£»êñó¢¬Â¬¶É¢¬Â‚­ÁÊ×n|Ÿ‚­‚­¢¬Â—£»™´êñó—£»ËÔÞn|ŸËÔÞx…¦—£»¢¬ÂÁÊ×—£»‚­¢¬Â—£»™´êñóËÔÞ™´¢¬ÂÁÊׂ­àçìêñó™´‚­êñóx…¦‚­¶ÀЗ£»n|Ÿ‚­‚­àçìêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ‚­—£»¢¬Â‚­¶ÀЗ£»êñó‚­¬¶É—£»ÁÊ×ÁÊ×—£»êñó—£»ÕÝå™´¢¬Ân|Ÿ‚­¶ÀЂ­n|Ÿ—£»ÁÊ×ÁÊ×—£»êñóÁÊ×™´™´ÁÊ×™´ÕÝåàçì™´¬¶É¶ÀЗ£»—£»êñó—£»‚­¬¶É™´ÕÝåêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñó¬¶Éêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿÿÿ·ÿãÿ Š”±¢ªÁ–Ÿ¹èêïþÿ èêﹿÐèêïÐÔàûÿ èêïóô÷¢ªÁèêïþÿèêïþÿÅÊØÜß袪Áóô÷Üßèóô÷èêïÐÔàèêïèêïþÿóô÷Üßèóô÷ÜßèèêïÐÔàþÿÐÔàþÿèêïÜßèèêïóô÷ÐÔàóô÷¢ªÁþÿÐÔàÅÊØèêïþÿèêïÜßèÜßèÿôÿãÿ¢ªÁþÿ¢ªÁ¢ªÁþÿ ¢ªÁ¢ªÁŠ”±¢ªÁûÿ ¢ªÁÐÔàgtšèêïþÿ#­´É¹¿Ð­´ÉÐÔàŠ”±ÐÔàŠ©¢ªÁŠ”±­´É¢ªÁ–Ÿ¹þÿ/ÅÊØs¢ÐÔࢪÁŠ©­´ÉЩЩÐÔàs¢¹¿Ð–Ÿ¹¢ªÁŠ©ÅÊØŠ”±þÿÅÊØ¹¿Ð¢ªÁþÿ¢ªÁgtšÅÊØÿôÿãÿŠ”±¢ªÁ–Ÿ¹­´É¢ªÁŠ”±¢ªÁ¹¿Ðs¢ûÿ ЩД±Š©ÐÔàþÿ#èêïs¢ÐÔàÐÔà–Ÿ¹ÐÔàŠ”±ÐÔࢪÁÐÔàÐÔࢪÁþÿ/–Ÿ¹Š”±¹¿ÐÐÔࢪÁÐÔà–Ÿ¹–Ÿ¹èêÁÐÔàÐÔàÅÊØ–Ÿ¹èêþÿÜß袪Á­´É¢ªÁŠ”±¢ªÁŠ”±ÿôÿÿÿ·ÿÿÿ·ÿãÿêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ—£»êñóêñóÁÊ×êñóÕÝåÕÝåÕÝåÕÝåÕÝåÁÊ×ÕÝåÕÝåêñó—£»êñóÁÊ×ÕÝåËÔÞËÔÞàçìàçìÕÝåÕÝåÁÊ×ÕÝåÕÝåêñó¬¶É—£»¶ÀÐËÔÞ—£»àçìêñó¬¶É—£»êñóËÔÞËÔÞËÔÞàçìÕÝåÕÝå—£»àçìêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ—£»êñó¢¬Â¬¶É¢¬Â‚­ÁÊ×n|Ÿ‚­‚­¢¬Â—£»™´êñó—£»ËÔÞn|ŸËÔÞx…¦—£»¢¬ÂÁÊ×—£»‚­¢¬Â—£»™´êñóËÔÞ™´¢¬ÂÁÊׂ­àçìêñó™´‚­êñóx…¦‚­¶ÀЗ£»n|Ÿ‚­‚­àçìêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ‚­—£»¢¬Â‚­¶ÀЗ£»êñó‚­¬¶É—£»ÁÊ×ÁÊ×—£»êñó—£»ÕÝå™´¢¬Ân|Ÿ‚­¶ÀЂ­n|Ÿ—£»ÁÊ×ÁÊ×—£»êñóÁÊ×™´™´ÁÊ×™´ÕÝåàçì™´¬¶É¶ÀЗ£»—£»êñó—£»‚­¬¶É™´ÕÝåêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñó¬¶Éêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóêñóê ñóêñóêñóêñóêñóãÿãÿ§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§¹Ô§ ¹Ô§¹Ô§¹Ô§¹Ô§¹Ôãÿÿÿ·ÿÿÿùÿèêïÂÿãÿ ¹¿ÐÜßèÜßèÜßèæÿÜß蹿ÐÐÔàÅÊØ¹¿ÐæÿÜßèÿîÿ¹¿Ðs¢¹¿ÐèêÁ–Ÿ¹þÿŠ”±¢ªÁèêïÜßè–Ÿ¹¹¿Ðãÿãÿ#¢ªÁŠ©ÐÔàÐÔ๿Њ”±èê±¢ªÁ­´ÉŠ”±èêïþÿ#ÐÔࢪÁ¹¿Ð­´És¢Š”±óô÷­´É–Ÿ¹èê±¢ªÁþÿ;èêï\j’èêï­´É–Ÿ¹èê±¢ªÁ­´ÉŠ”±ÅÊØŠ”±Š”±óô÷­´É–Ÿ¹èêï–Ÿ¹­´Éèêï¤ÿЩД±ûÿÐÔàŠ©þÿs¢ÐÔàþÿŠ©óô÷s¢ãÿãÿ#¢ªÁÐÔàs¢ÐÔà–Ÿ¹s¢ÐÔàs¢ÐÔࢪÁ¢ªÁÐÔàþÿ ÐÔࢪÁ¢ªÁ¢ªÁ¢ªÁ¢ªÁÐÔà\j’–Ÿ¹¹¿Ðgtšøÿs¢þÿ/\j’–Ÿ¹¹¿Ðs¢ÐÔࢪÁ¢ªÁ¢ªÁ¢ªÁ¢ªÁÐÔàs¢ÐÔࢪÁs¢óô÷žÿs¢–Ÿ¹þÿÐÔàŠ©ûÿŠ©Üßès¢þÿs¢ãÿãÿ¢ªÁþÿ–Ÿ¹ÐÔàgtšŠ©¹¿Ðs¢ÐÔࢪÁ¢ªÁÐÔàþÿ ÐÔࢪÁ¢ªÁ¢ªÁs¢s¢èê±¢ªÁÐÔàs¢øÿ2Š©ÐÔàŠ”±¢ªÁÐÔàs¢ÐÔࢪÁ¢ªÁ¢ªÁs¢s¢èê±Š”±ÐÔàs¢žÿ¹¿Ðs¢–Ÿ¹èêÁŠ©þÿ¢ªÁŠ©óô÷ÅÊØŠ”±–Ÿ¹ãÿÿ÷ÿÐÔࢪÁ‰ÿÐÔàÂÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿãÿÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÝÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿŽÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿµÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÿµÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿãÿÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÝÿÿµÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿãÿÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÊÕåÝÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿƒÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿªÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿªÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿªÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿÑÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©øÿMr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©Mr©ÈÿãÿNs©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ns©Ýÿÿÿ·ÿÿÿ·ÿÿÿ·ÿËÿ¹¿Ð¢ªÁÐÔࢪÁ¢ªÁéÿ¹¿Ð¢ªÁÐÔ๿Њ©Üßèìÿ¹¿Ð¢ªÁÐÔà–Ÿ¹Š©éÿ¹¿Ð¢ªÁÐÔàŠ”±–Ÿ¹óô÷ìÿèê±þÿ¢ªÁ–Ÿ¹óô÷ìÿèê±þÿÐÔࢪÁ¿ÿËÿ¢ªÁþÿ ¢ªÁs¢Š”±èêïìÿ¢ªÁþÿ¢ªÁþÿ¢ªÁéÿ¢ªÁþÿ ¢ªÁ–Ÿ¹Š”±óô÷ìÿ¢ªÁþÿ ¢ªÁŠ”±Š”±ÐÔàéÿ¢ªÁþÿ¢ªÁÐÔàÐÔàéÿ¢ªÁûÿ¢ªÁ¿ÿËÿ¹¿Ð¢ªÁÐÔࢪÁŠ”±èêïìÿ¹¿Ð¢ªÁÐÔ๿Ðèêïéÿ¹¿Ð¢ªÁÐÔàŠ”±Š”±èêïìÿ¹¿Ð¢ªÁÐÔ๿ЖŸ¹óô÷ìÿèêïs¢èêÁ–Ÿ¹óô÷ìÿèêïs¢èêïÐÔàs¢¿ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿÿÿ·ÿ nn)€(æS)–‡s()œ(ADBEmntrRGB XYZ ÏacspAPPLnoneöÖÓ-ADBE cprtü2desc0dwtpt”bkpt¨rTRC¼gTRCÌbTRCÜrXYZìgXYZbXYZtextCopyright 1999 Adobe Systems Incorporateddesc Apple RGBXYZ óQÌXYZ curvÍcurvÍcurvÍXYZ y½AR¹XYZ Vø¬/XYZ &"±psyncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.numbers/index.xml.gz0000644000373300037200000022104612424517753032060 0ustar00nightlyallusers00000000000000‹ì}ksÛ¸–í÷û+RΗ™ª‘Ã÷#3ž[qÝ©J§S±Oç~ë¢%Úâ‰$ª(*‰û×ß lI€‰²( ™©>–H û±öZÿó-/~„É&ŠWWú¥vñÿ÷ÿüÏbózO·Ëp•¾€V›×›ûàêbž¦ëׯ^ÍÂá"^‡Ée°^/ÂËi¼|µ –áfLÃÍ+8õ"ÿU÷e¿ùµ‰òýüùóò§y'¯ MÓ_ý¿?>ÝLçá2˜D«M¬¦aö«Å¦ë•›‹0¾|Ì.´ìjŽniÚÅ èûëï®.>ݼcãÿ#ž…‹ ‚ßÓ4ú^]¼÷ß_ðßZ׎ ?ÓmïÚþ`zïß¿û`¿ñá+zòÏh5‹Â=µ^è®þB·\÷…¯/4ø?ÝÑà?ºë½ §n~L~F³t'ûøcøfFóôêÂÐmúÕ¯« [×/Møg™¶f{¶ozôÈãÕ…i¸¢#ð'Ó)v±iNÖI ×Ñ,×Ðý‹ÿ%z“>.ÂÍ< Ó|ü7nnòoaôÿû?›{výóG8MãdBÉýèö/ú=ý)¹gpf4ƒItu‘wÛEL®aTáä>ŽÓ0™ÜÅ³Ç ßÔ$šá¥ “0¿ÒÇÉ2XÓ/b˜[QúHÿ^m—waB/‹ÂxðÑ¥kx<÷¯þ÷`–~tóáö&MâïáÖ4ùŠÁW<‰u~‘n."øß« x2Ðfö è‡i°¾º¸Û¦)ýôï8‚wˆþG1qò&4ëéâ4XDwI†³Iòp7¡§LH¿q0íÒõ,S7]Ó3-Gó}9ö@Áö5øo:ž‡îÈ![wËÕ<×va2Ûº‰ÇàÅÕÉ!·5H¡s«úx¿à6ìõ<ØÀ}Ĉ÷4\®ÓGölð\vY“xÃ7ôæáßâß^ÓïI¼]ÍJBðTÙ ‰=˜fOUÒ¹fyÚoøÙÕyæÒÙT›¹‹møâ÷0˜Áb™MàM¸àYÂç,ÆÈg1!‡šÅ†áZ¶æ{ºk:ºgê.7‹MX¿<Ãt,XÒ,Ï÷Ø1:-ß‚¥f²¥ù–éklŠ÷™Æ8nÁ4ÞÄ‹|‰yöÓØMãOáìÖ´9È“±O`‘–aßò5ÝwtÍótO³-Ú¶ û¸Ö:°J°µìÀN|_s\Çs}vé¾ë0ŽûÜ×a\žªY‡?D‹Å©,Â8ŠÃ.Â?ç`uÔŒ b}öŸ{Øßs_<ÑÚ“Î=¶~ÞÅ YFǹûã޳xKea öŸŠ8‚s_©ù_›ŠÁ&š¾øÏñ‹ß’höŸcö¥°ÿòy¨]xÊ~î”t „Y3}ð£átË1cÏ{xîSÑ‘NÅÌ¢õŠˆÝ?ñ™ˆƒËþ\м<¡N=ƶE‘Å™ÆîåàXŽd!²:âÆ2'7¢Ž^—¸ÑˆŸ8†ã—G á¸Ï}§±¶Æœ;>£ ÝãÎoã¸Ï} Ö…i§ß’àñTâEl‡5¤¹'Ã4!dé®é›º­™ÌU¢¹'ÃÒ! éX u]Û éÇ<ùd˜.Ä=uÃ0 ¢o;;xXlÜg?ÅÙ§š»?âÀ“Þ–w: ŸâÜM]˜FÂ<þ¨}Öñ#ÇËá³qŸý:*ÏeYüSâ#Šã ÍY6ð³ŸÆÂD±g«`”$øx&­J`$ A0Öà tÓDþI¬ÃmY,´y÷Kaɼ²a²©ì1œ½AÛÄ:‘„Þ–ÈØwØ|*ÂÙoï X “@v ±¨âßõSKScGAS pÕ22ÄÁÉLó¶ÔØ>Óœ+l9°å0®D×±æ£!®¯ttáO6GË:¤Ø¬C‹OlËw¡ÈÄq5ê¥gõUú7 Oƒ˜UÊqA -¾òa¶=MØ~VlàçîƒÂ$Wf5Œ¿<õÿHó×µÁÐ- ¤t×w²¬£Æ€äXc€ üìç¯0)VŠÊŽÚkÃz¥£eLÛ E~`lßuùÂ*ƒ–¾Â"kêºp¾2Р(nÇs`Ú›šåïPÈ~îaDÀW^Ùú;âLëøa ܧ›3–É}4ËX˜2c1µ‰ðm³!"¼R!™ <†ã‚•Áp^Ô¾°üJ1 ‡«,ëYÅw/ûBš1;J°áXHrVU-?¬€Àr;yÄX06’Ã,ØOs`£8{³W˜:c+ë¸ Þ¶ŒÙsMSã*;Ú‚*̳UÒãžÁm‰¶}‚·'oùŽ+w4ËW\F̆àÜ2™…{:SA¥ËæËh/%s˜¡-SvPsá˜ù‰q%׎e.˜âäšÌÿmžãĽ/6Šs÷¾LaÒ¬£;ÛÆasgƒb):A²£›M|‚ãOÙ²îvÚI#ªG*²%+p´-]˜òÊcWãÝÂZvÌyûü‰ÆÉwÊš^aÒþtó-;ÂqiÀÂ>] :§Ù[D‹ægòÝJÃè’ks—»ŽÓ4^þ$ѪžÙf¸© ëv—Ö¸s°óãj¦mDðTæ»CcÜ)_ZðîÈ>ÝÚwÂÛ`õ#ØÜ@è¡Ì:Þ™À¼C[ü)ñ*²õ®'kŒ»à¿6áM$)ÜÒð3ebo{‚âÅ¿{“Ü™ŸÂû´Û<5NO>O%m•Ÿ5âŸI79HA0¡×h£Œ¿¼W«å[ó%‰à'8ìM¯ËçÔl[äNü@ùúzGeq×ûJ¤†z¸²Æ*Ïaèç*k»ìm¼î6Èö•VÜTiéõ¢–"Ø¢©+}ñÅ<ü• ©3¿)æá¥ì'ÂaΆp$Çãx<lÜgïwt¢ï=•¹ÜV½OòÉR4¦"ó¥†BèQ§ÂYÇO=ª=.dƱrÖ¦˜É7Wyq–uý°;û ‘ìqÁ$Ž l¬Y>T%–¥«~ãˆõGlàgoTŠÑŒ”o¼±ì£Â*Žè )T18-9ªbÌú%¬Û'nn²QŒeå<–¹iIÅO‚†Œuÿ°&§œÔ=ØŸ}ÇõuÍå%- ¤ImÝM<Íp,s2eRÇq4à„6¡âX£u{‡ÂM6ðsÇ¡aµpSD9vÉÑhÎV‚Ì>–…øXN˜ÕÎÏ{ žƱäãi첟ý4'¨*HáS`8µÚJŽO"¶ÏFqöv‚8ë”GUO$ßdµå›†¨Ã2ÂÊ:|ö«bS¡ðIlëçZ/ŒÌ’gOkj ³RÊòÑÆZÙk˜ºtJ“Sár>2ìjmõêÿ‡âŒð~ؤIü=Ä¿o>ÜÞÐ%Œ|{L¿?$ñvµ#üSÒ„ôÄË‚wFž‚ßͺœse6„swºminÁ¾1bª.Öý“žˆÒRݳ²!mi–èT@ólÇ™‹—ÇÁeã>w+Ò&‡ +òDX<Ù0›ãÒ¢d>ûé']<m,;6ÔCXÈKÄ·0KÈ´$ÇP¨Fü»>ܱlàgo… S?5ªÃÑ.í¶œÏ>yÈS':d7g, ô±P|¶0¿T³F(ec8މ;ß/M—»%Më¦ÝÆ+;DŠ]¯?¦¹ òM4zÚ¥jì`R6ùZŠ‘ýÔ™å²výuÀX‡Ç² ŠHð*œùšˆØJ„uÿ8[ø¥q<4>ø¹»ZŽ4óôi­6'1Ù0Ž5§Æ~î«°#'–ͦñ‰àEÙHÎp&+ŽZbÌ:Âı'^|ˆ‹pÇØ;ƒ‡L°Ÿ½) .g*KoŒ8ùï´ÑÌîu}2f'6бlèÇ :â¢$âV:$Êú}ØÅoŒÕÍlàg¿ˆŠ«–(öùâN[êê ±ÔãaŸÙ¸Ç²ì+šå´d¥Æ½ö³âi˜t»ÿg¿Š¶0êå èÑBœ§ÈI ê©\u¿ÅµK¥pþx'ÝQ9õލùÆžÚÙ/›ÒÊ¥1““9OQ´4Æô=ø¹Ûœ®˜S¯\.:Ú5—õþHÿñ&6¼-ІãW•sq‡ÀCZª¬Ãç¾Ù»âD ×ß?b½?qFR6б,‚Ç Ö»âÌô;üŽ á°uNR#Ô´Ýÿ7ÏðM’¬äD7|ϾRË´¡ÅsyVR]ó<à+õótGCì@ðºOÉ øX¦ð±Ÿ®4ß”ã Fûdý?ì..Ï;Ä‘ üìço [Þ¸'ï1“NÃî]%ÈD§®X‰ —N ‡ÇFr† ª¢Ï£3Y^5îµô)O2C` µT¥¢è §¢d¼Ìã¶e¥N—ÇžÆÙGääx• ~Ü«äQsNÆñêE\E¸GÖV¯½ìiÄ4¬÷G²M=Ót4Í´ Ã5]ÝЙ6ýr 1~á±>Á*6ðswö=¹Ô˜gíS$š¤!ª#¢SØã:ûYÛ.ü4þ¼•‡ƒ8ÒÒ{Dà üì'±0Õ•QSÚæõYuê¬TìæŒez+“ëÉÓ`åêÓײ1g‰&ƆpîÁOšÔ:`6‚ãÌEB¯¢ûŽ$+&Ñ/­Šj¶çŽãY¾­—`p2ùç9¶iÀ`±S6𱬧ǂxM*R'`í³¢êÒ·èü¥ O³Qu”¡b|Ýu,”z]ÓÐ-×`Ç0Ѐh_s\Çs=ÓÞÛÙ/ÀÒ:¬¬˜uì¸.¯-†Fñ~´jÒ ƒ¥®£{.L˜&¯6mÃìu @]†c» =Í©MCXÍ·\ø‰¦»º§S£¬¬‹û9¯¿ÓèP6)„séÝùøîê´­Þ·7äˉ<ÄKMY)+Ú˜D3¦Ï•Äë0I'Ë`M%¯âu0ÒGú÷j»¼ z=üóê¢dªß_0]/þG|¯25¯wAÞFËðCœ,ƒ”¶ ê_Ñê¶^]üñjöêññÅüõrù"ÈšîØœè4¼ÚíãDÆÄ£1ž7xÂIWQÓE+­‰.ø%H‚‡$XÏé#¡]g_UÝ·/å³»?À¼IœäQRÀ W)|‚ÿ^]TOb>»ä¡ÿŒ“Ùßä1|Ó9¨­=ÌáÁB›ßÃpý)Z…›ÛøŽ„ ~½9¾¹)7ü,¢‡Õ®+»Ïì•®ÜåòÏîãUzý#}Vºxê•~¶ˆ6iqïWÛÅ‚MÐòLú·Á;%›ô6^GÓÏtŽã· 8& :~d·ï6¸»Iãõ¿Lã©ðb¥ïãmJšùþIgø¦¿E³”Ýh2ŠÏÁ/x5~?Â4šŸÃm˜ÍÒÚèÓÛâUî‚MH.|3îSüŠ~$¯÷ê ü•Þ̃Yü³Ò³·ñ"NØÃÌïa~KŠ£›yüóãêöÏ·ÙtIVyãùtÚVÆYü|J.óâ×&bïy9ê9Ó4ÁÐq!#㛺­™F3¸ þ½†{{„Á÷ëð>NØ yCdk•>Ìü ].ùß“eõ[”Î?ÃüÂ˰Û+¼…µc¥Yöçýý&d­€]GÍ?AÅl‹ð¾t×èrGÖôüVе0ËW®Ò™ÙÖ.˜Rlk¼…Ñ}ƒÝ°$éÙfRL+[°°ÑÞûq¹†9¥Ãnú’VEÀ݃³pp¨à:+„7Úø3Ù¶'MpƒDSŽ}•G/ÿëåKíòåË—ÿ=ÉÿäÏ›…ôš¬0Ù6•F¦ÛŒƒ)X€ñ .ð¯›wüOW!,)Ñí‰êõa‰Ÿ¤óx» V³Í$÷€®.îƒÅ&äÛ¹‡…ŠL¼I0… ÓÇ«‹ :l,ÛMHŽšk ‹Qv9l‡mÔî¬è¤OÁ#¼(Å~¼ ŸëVw^w“ k²·Jg4[?ÀÞ†|ñ&³šp XF«h¹]þ'Ñ?°ª‹+x±¥–+o·ævxCØÁV u’„÷l®~}ÿøC53ªdM¾¾]®Ø2¼f3xÚl5¥s/i~ÇXWW˜u$+Wö÷]œ¦ñ2ûD·ò!—..ãü#H¢¬ù¾V#¢½¯zNö´ÈBÄÌ(z²7E«-¼Y'JžYT¹)(_?«×»l)øx.|:z‡ÛÜÄvæXVÛÀk¯üÅŠ÷;&±ó“¤OQ9°±åë¤r OS9€È~FNc§È]nf7ƒÊË$·Ay™YäGy™\x=óaOÕËDcAy™Çð2ûjÊÕ,2(=óð¤ÞëN®&>åjîçjB¤u»’zR‚¸‹ÏJ’3³';9‰Vr°úËhe—+D#óôƪ™LˆÑž¼ íM¶ˆï*’£¹iz:™8:´ê ,îܨƒ@•ø ŸÔœt¿—S|/}dh™ý²,Y„ çHæi.[tÀÜ£8Ù©²ä¡ªìc‘œÌÝÂÎùåHªt% Q']9¬Ñˆßs7»YL`Z½ ïƒí‚€% Õó–¤ôÚò¼¥”‡Zµ4‰j+f©àjÂ]x¼è!ê³~fp¹R_Ûr&-&6£'¢r&UÄà˜r&Âr¶Â¡(ž$>Æ'MvMaæf®„™ëJ=<>°›Ê[ âR¡ã:N¸®è¸:êè¶’;Fྦྷµ "÷\äÞ„³WˆäKI ;“Ü»L£û{:ggÑ~òˆø@zâ¦Ã¯HO¡cž…¤üP5o“)\‰¢¸:¿ßdŸ-Ýö%É^Oçáôûf U‡3ý»C6T€îm Ê•üž-©x×ò¿ÿ(¸ÃÅ”¸J–¦‚å×§BSÓEH¥KâžQ^×9RØÄ¶Ãs IïÐ V~[§;ë#¾¨7!q,à%à¾Ûyˆ³šj½Jö^CIu8ƒÛ·iÃNHÝè\“´S_}†™p®|í‘_ Ú™Ö›Ôc54ó7±÷Uà¸nÂSø®J¢õYHÙJ‚WéÍ6¿†dQk›/Ò>JšEW», ¥ë0=ÅþXk­ú¨vè¶Ø˜ Ô¡ê™PÎ1as„ì§5lNþGŒÍéÄÙ¿,ŠK±`5±`)D⻢+Šâ»"¬jŠï ;G^‰Wɉ·v}RŠ£HílvNóÇ¡sý-Œ—aš<–âìK.ûîÍý=w:‹Æ’HÂæS<ýÎ ¨š³,º.Äà „Œ7 óZãQ…è­£±8/ž°Ž7!¤­übÄ‚Ákà¤M‘e}­Æõ†—‡l°¦g˜¨¼­ %ÈÅÀ7ý“Ž#{nF$¸™F9v+Ù¹Ÿ—C¿mè5Áʳ} "¡³Gq›åp#9‡Ô¬—K š™x¥>ˆvé;†iù9÷ Û2}‹jg:‡,ZË…)…ׇ.þ¼Ók „%£S÷fáBùR’`HåuPúÐ<ÓÒ}6}Q¶Q·AíÃðlqmOcñmª¦àë¦ ñmÓô`8~…Œž §©¯ÕPÚ@a~`̯=rŒ®u ögç‹·±ø.—Èçb8~DqÒÈ,¾ù#Î(Q+TéáÌR-aCD3¯¢ü¸y‡‰«pÖk¤÷ &3BÑÜà¸í™¶khPg .<8½‡¶zÁ;&-Ø&x‡@âMUóŽÿZ${ÇŽ3Š h†õ‡U¾óE>­ËÏzs>âw½î…Ò¿[°m°øYѺÉ᱌/àßo`%ݰůÒ9kUÄZá$ð˜G³Y¸Â¿×D5/ ƒï|Ĺ”æ2*bÍrâÂrj¤Tãê9Õd·1Pñ:µHÖgjÌbˆ›ÎJuñÑ~¢AÃL‡±UªÈX rçMv°3TÈ–ÙæþÖ°"ö\TÈvoÀù8C¶Ç‘Sà¦bø– åÐUN¡WäN2õ%´®†P ‹X >ž¯¹ Á¾¢b6µº;³E0jùJk†ÐÁ¬mt 0ÞFËÛêˆÃ[øçÕůf¯_Ì_/—/.Ú¥9ÑΉW»-a©âŸÍäêÚ¹µ‹VZ]°U¥’ÇK~ÏA¶•¦Ø@ñO0*À”*wZ©+*uÅ&uEiÉ™aš®ï¹†kú¦yY–˜¥%g†¥CÆÖ±ËumÃd‰YZrf˜®g¸ºaº~ ôÖ¬$ ¦ßa‘ÌB;JsQi.ÒÍCi..rµí‘k.J«ò‘ W¡ÛŽ‚nëcv© IÙ`= ® Ÿˆ ’ìÁØ]Æ“²CIÏI 4ßF7ßpm[7(é£𩾛k¹ž3tßgÇPàMø3%W·HÛÕäz ìtÊÔ^ž&í¨kç $W‡š•âî4]BÉÕÉBRFܧ“«Ãu|G¹:DM7ÉÕågTåê‹ÈÕv«éIÉÕåaŸzú§{šèÈ \‰&} ga2áA F E¸ Â}i¾•Zº©»º ˜|`ý˜!œù¡ûŽr¸šf9@÷3¶"j~è ‘ „E–mê@Y´Dø»¦_Ñ<’'Ó„*Q$€6y\ÏCêfÕŒ |BQ7,åA÷/ú‚w!íbai宓vÕ¾Qƒ´K¼=óÝå7éjØAÌ*ei4 oÑÃj®p­¢åvù{œDÿÀÊ,>®6!ÂMDº­¸Þa–&‡]6´!Hô°U•²éÙ(‹EÀ¥¥h»FsU´]ж‹Ûä®cº ø†?UA¯a—zœ,ƒ5†{ªùn`ÌzÂÏ=œ¬x»ê¼]blÉÊRÄ]§B&3±xšŠ¸Kw©2(EÜ¥"Q*Ue`—Ù!½ª Š Mj) ï¼éëû”>•/nšðéÝ',ƒj,U-…ðá>yõÚÀ.>—çî’=sÕñu7ž€¹JRô"»û8N!ÝÄ?Ué š–TŒ1•¾ ¶É³c’V0©âE‰Aƒ‡§L‰¡r*W rÔ“ ðªOÀ^óqü$mM=´N¹å³±êVѨñK`ÂÜ>[{”—·”¿ÆûkΘ†ñ™(m°Š „Ú?=¹.àŽj8ûÓë{뢗×\—wþz‘늘‘ë:؇$ÜÄÛdN…T~óûMöÙÒ-Í󀚘ÎÃé÷Ívyuá:¦ãyÚ="«FF®kØ–I¹Ð_á4Ê:”e E¬€€LÞx»JK‡ˆ2Ʀ]gXhj‡gú¨ÄÄT¼ B£}¬ioûÔßÈê]nBâÞ½oèÍõ_`-Íà)lÚž€´¤©â ´Sßöw¹w—I‡}i½G=:äæ{fuÄ­W`à!| ×a¶> )'ZcCCp²Hxqûð¶=CjÝ8\Å­{"ü9´Ä£ <$Ÿ` ‘Õ£(8©×b‚’©ßÃÅàä?‡Û0Û„O9Ø¥Lª‰›*oRåMÑšUäK¤3«e^5±óIXxžM€²=YY5U’Rº RâsQAʽ¹uÇ *9·n‰'E‘ë†r U¼¥’…Ä=ämmæP ýóäºí BE®+,%ˆR€6¹n)8©$w¾h1wÅ^»J“˜P ‘bô0OsŒ | ƒí·|€ÔÁÒ‹ìnwì¯Íªe7ÓDyãü]Sp¡>ØÝçî·Gý‹]ùá¼îÈÇ'¢üðÁÀBÇ¡o5m×ömË2]Xn<›Šæü­–Äi†îÙ¦cºeúV_smÓ$üÀüj0} Åß:0kþòÖ)Y»à(2ª×°5–VÖåоuÄô­È›òôô­¦Å cÏÀµ“xŸ4VqNœpBÑk‚ÓTìµ9w"Gn ¸àFÆ×–!72\Mó,G6|Có-ž½ÖÔlਅÿX¶¯;®Å‹Y¾£¹š§q#×ѳß)öZ¤[=lAökŽâ…ª?Sõg{ן LŒ€[ÿ³õal4MQ†’«ì÷ %ÀÂ¥k¾ƒ›ð>Iâä[¬@íz{øwzâÇwXZR.$f+„]¿ã«Žr—úzC¿™xx·—! XDð¿W˜ìû*_Vâ1 ÖWwÛ4¥‡þG«« ú¼ô® å LçkðÏ2=Ç×t½TÀNrŒ2”KŽek<Ë@ïVõÁÙÀ×ó`…,x¯Qº‰¹2(žœUcâ',ÍÌn.ÿ7-¹_@ÙHÃið‘³N*Gð¥é)i]2«S‚¿†)C Ô’‚Î)ü÷ê¢ù›…÷Áv‘JfNF¹:ñ ë`6+úè÷’5_rÓÂ!WÁÍÍ£þ†kR‚»¹Ât&2ÇT\Á þy.6hî§í4š°@a‹™K¸‰þ‘ʹ"ßc½ºô3òðq’I)nø‰mDÊêðm‡eéSvšxÂQ¦½+}™œVÖ |Û8Ó¾{]´x_ÿžsJÙ+ïg® ,ΰ„Ï"x­øæ 9Ž`Ë7+[ÉÖQ\a0É‚„¾¢´µ«‹‰~i»š ŠÞ®fkŽAØÂ¯7ùE>ßü±¥4ào’$x„KÐs²¾À­×|‡²¾ÜÀ÷¬?÷ ¢IV'²äíµtûÄCA¶ÊÖ5_×4“IÛÒ¥[r µ­Ä¿ƒ¥›è^A‹Ð¦g[†i€nEö”FØcÌXŸXŒYßoÌø"Ð? Ç´-Ÿ¹tÌ’ctÌ’c½ÆŒû LœžåYˆßåStïZ©䨴" ï-›¿>®Ôñý=ðêƒæ‹Â›°ÝdŸò7A»4Éž¯iºîƒcgx>›ë-V„ÀÏjûx/½k ?%~ñK¶ÚQ%näß¾T† ¼"ΞùPQš]£4è"¯oÁ½Ší€B$‹Z†ˆÑd®Z))ÿ=#dÝýþA,iÔ¶CŸeñŒŠÒô³ïâÅ ¥]”hµ‚ý¬Bjm—w—§­&.úW\áäB“à|âêÓÉ"œ¡âd¤>MßÔ5C Є:È´+Éí—Âë¶&ñ£V|“éótDÑãfŠàèœá«Û?ßf/…ï°W!{i¶\Â#OÎwIÏö1»Ë “q]ÓïðÆ®0V­”Ò”RšRJëκß}/‡­ø&…—-œ BîÜ(µlN*’,í.µáà6öPHS˜òyQJÒWú<`½"¸‰žN¨Ïg¼åuˆåŽ¡>ñ Ë‚¸‚a¥;{4š,j„Ò½¢Ú2’cºfÈ[Ê#šû: ô2µÀx1ô>C’“Y»éÙpšš#χ¸CC{=X›ÇÀ7¼×Óéj£q{ \h#¬Su8CæÉ}œgߥäªà™ÐÍî„7ìš^©‚َ皌C¸Kë(bxÝ×wd„ ³ö:m=ÔÙ¦;ý¾&‹¸¶áö‡ªèÒÐ6WK{h[ìpQЩ‰£th.3-z™fÒè9m¥Ø…z¾ ¯ Ò'ZÓáj…WI¢þ;Üyéãf~e‡fónîdGäˆÈdÍSBëpº]„vs˜ Å¥Gë +¦Ûžn½ˆÊŽ! _ü;I^ãFÚo>Ù3 ÅÊ¡ëoMWhMDwj_?CÜŒ‹Úâ/±ò—‹šÁß¡Žë<2Onðã4S?V+†Õ®õ9l&—A9Ê‘™#ÑeG+ü†¨‘c©|u…6‹Qx:QzŒ ‚Ú7ƒÀ™›[*ìè>4 8PF;<ø—: BYßET` u‰:´G³=âÀ;" ÀÄ:0[C70c’•ÑbÙM„@ï¼^´Ÿ²Ž¶ax<®ªŠ[´7A­ TºÍ)0]yU„þí=”Dµyï¡ÓÕNÍ}Pù‚ÃéÛ5cPƒG¹œû òé4<,h÷%J9­B„³f¹-Süe­L~-ƒ”Éc³@æD¤ª•™?23¿ÓÖSØùYÅâA ã=§{>ùMß(øÑ€8ÂÎbÚâ[8{ßÿZ/ ¨·gI/.ohIÌ>R¯Ê¦» En™ XHh|rl€XŽrMH ÷¤Ê÷Eè î1YkúEÏ —%Ô`,·Ëßã$ú`ñqü.€ÚùmihCJØû.V"¬ÞʱøFŒ Ì.bçê KWD*#lË¿nÀtá¦o­"®-S‰(]âÝt‰&®ÅÊöçL\›YUâÚ[ª Šô1â#g‚9BODC(>€<5X\]dÜä<¤™yÇØHljìdÖRNÌZ5`2 ‚h¥ýÈBJ+jwÓJÈë–õ䌌+¡°”à>ŒÆ¼*•ùåµ¹åÃVÕ i8 ÈÜQFÙeã=)ö8d?S±*à˜þ¥óÏP~‰S³†_å\¼ñ`[‡5•XìâÙšJˆF«¨Õ")Ô˰@ï-ä¦m9%Î Ž„â–™R²¦`ÚQ+Œ)|µjá¯ðxÑC^÷üm¸X”L-,X†okü‚·ù¹½”†Ë Ê̦˜S]õ ÀàFLж€Ã^BU¿7×1 ®6RÏÄ2bŽe€ñ.L_–2™¼š½z||1½\¾Š´f§æDWÅ«ÝE¸4Â6"9qC(ÑUø"E” ÆÅ;1ˆ-y §˜ºø€\É"ãU1%S¹À6LÁøK`јMú`üU8O…ó”°yI~|Âæ²r!ºÍgfTÀT7$äÚQ„Í9dÚíçíò.$œd`ŒL0t°Øahì« Õõò¿^¾Ô._¾|ùß“üOþ¼YH “õØŸrMÖÈt›€PÑôì¾\à_7(_ÄŽ®Â‡ b2´*«×pæ$ÇÛ (æ±uHlˆ4N®.îƒÅ&äÛÉd@&Á.LAZ•‰X° m7!9FÌo0õ²Ëa;L–Fd¶ñ÷‹¥êëϧ0d‰×Kn*£…¥„Ý9aw0N3!!™ úLA‚)W±´ U±â^ "üA¿›0Åçî¸Ö¢êôÍ¥fvfpwtÏ÷ Xì,ÛóL—Ò±tËÑ ÏE$dÔV•‡ î6·ƒº§ëÀ1(ÚÕ–PÑy Þ"÷NñŒ>žmUeü+ ªZ\à ˆ¾±yôõý Óç|͉Ã-*ÌkG½piÃÕÞbÞï/Л‹I†Kz0Lùž%Nêá~61Üz_ÐÕo¾DÑ¡ëX.¹þƒv°[G"êMM 7­KàDZãœEN„ ñèž{¡65^€7Ùf7À °ó³÷Ur{¢Y7ƒÛ×NÙŠh4'¦ÜÔ£³kq;õÉ?ÈŒƒˆJ±·³×0›úò T;3䣀µPÒ£Ö«@·°ïð¾†ë0H[Ÿ…Œ¨¨¹¡!¢no¶iü5Ü€–a[°SÚGI¢•ºËÚ +þÈ–†by®µV6Þææâ£B@[%¬–€Ñ«‚£aBo!úP 37¦àhI©UbºçOQGa.Ñ®‚£öÇäâ&Ú]maÊ(ù7UlBýËñ$ðE‘+87;M×+Ï;8ŠP=Jp´DÿÙfa©à(õÅxµ ŽÒ$Á¢²¿6 uTRÅòB¸qG›â’b¨“`ƒ)—vÕ¤u‘m>6Ùù2y€š§ôÏžKá¬\îÈßÂx¦I™:ú}ɹéïÞÜßs§O(ŠD06ŸbÂî~u‘&Û‘J«Ôj‚!õ¥Mü¼º°æž_]8y ÙÏOX3¡QzUY¥AúŠ6AÌŒ¬¯Õ vÃðòP"ņ‰ÉÛª)ÊןüW$£›ä£â~S4·…Ý%‘•F4û°UL)£©˜%âêŽ_<¿s¦”lñá¢)P™8¸Ââ“°<ßÀöÏ’ªi<¥Y©*Æ´ô}ˆìM‹?n@8ÊÉsªU´zŠoC…@(ÌþÙâÃ0Ï¡B G ”øåÑaƒØ@ò •ÑȈxF:8£`ƒî‚+cLŠöGu_°ôˆ¸2˜„œÓ‰^hþˆ¦áDQñ ÝeIÓÐ Û³-‹'z÷MüçššTð&Ó¥p3ßÒu×±\Kó-Ó×<ƺ^&zÇ:/„­{ ƒú d×€ „Ê r Ú5OóLK÷yôœGGjÀ(}Ûµ=â ‚×8Ýt rÀ4=ÏJ\*ÃiêkZ1îK—ạ¿™1Δ¢¡Zñp8Âyð#ªˆ´¥Oø*>y+Äâð–Rq_Âe×pVþu—™#£sÂe†&Š—‰ÏØ#`&šÛ3Üý®ã Å«i‰{£[©¥°Bï:Œ‰ w1ÜÐxÃ]B’êÓ;×`—ª«<½íIÆ. Ã"¢áP>.Tp>ºé{P@àš`%yšæò¦f˜† üÙ`ÕÙ6l$£}Q2ÌkhbYSüµ!ÄÔoZ„÷iö÷]œ¦ñ2û”Dsz( ÷`±"Gwwž1§rœKô0¹ˆÚ„Þ¾.6Bh?ò.ßÓ0ÄD•gìY×^aÂé¸ÑtgÆ_¦^æÎfÏðP¬5½$Ն̗I¨ ßMliç«úò_´%ú?´ɫi%nlC@ˆ+åi#‡ï–> ÓFJ%Áô‹†Ï–)Â%AQ}\¢óô¨$hòùoPÛîÀê90MJaÉSCS ÿÎL)üÄL©Ü¨ã¯±W®®£ÔA‹3·óÄmйý~»ÊBÆIÓ}GsálXt)Y:ò5œ+@)æ`gUù§ßý†º8ýÎŒ‡·ñr®RzÆÇw2A`³‰¿#^ ÿ䳯¨37Á¤ÙE÷¤‰L—d#5n§í9žÍbV «¦]õƒøpjXdø²'IüáÎ 7]»Ô©dœ¦é<Ý’1R Yð—€ÈÆ-ÐîÛÄ‹œžOÎú ·ÔìÞò“7.¼_?¨®T#'•#8ƒ @a'”ä·28ã&y¦e6ÂÒZ˜q–‹UCĨ.M.>­.|î¾1Ï= TÞ,ÕÄT†[nY8â~ü‹$lE$u6·ñC˜ÎCdøílŠž[©xSÚŒÆOÛi4 àí‡Ü»"Új3vH$ä&»H…hpW—£o_>Á·í‹Q~–xþAŒ4E:û20JÖ |Õ8]ðî&ï^»IõåÌË/¨ ÞÖíY«/¿º¼!GàÉÑlÍf´ÙÞŒ!¤B#HxQ=ý¨\ß1]ÍÖêà8¸žoö8¿Æç›?¶”«ÿM’pzNÖ¸³ñšïOÖ`†`µö€%Œ¬LdÝ« Ç÷<ô²áéžçz:ƒ‘ÐeÛG$‡ã8Ãp|¹a¯aVƒl ¦å¦ãàûÍrßöÉ?€$“áå…Ò{ŒbÌì†íZÄÔ8f‚P!{•gk€_a):d!°…î\]Œ Ì|Ê3¿Ë§çÞ<&µº–ÒŠ-¸ ‰!q¢e¯LþQJê{.M¶Y뾡ù†ç³‰¾³=–ÏŸÜÂÍ@ïí¯Œ;«d|•(óQ㘪mP´ðϘÔWÎò651ÑÚB™I¾ ±!>zÓoÓJ߫؞H×îJ]£âª`iÀtý6ôd‹Ÿï‚MHÖà›ytŸá ÉG2KW äD,ßzòäqÑë`úýpv«Y­âºW9šO›¯ÛEÈ)räߣ¹/Mçq‡IˆKÕ:¨Z‡±Ô:ÔØ+3ç&]é»®éÖ뽨—òŒÙ¾’ÂKzÿªQÅórQûðÅ-òNO\-1'Gœ&ü\òæˆ3Å΃"Xj3,IœêÀäŸF¢éêˆpy½¤\¹I¸ ä¸9,½r­¡ü¢b‘ÅEª:-‘ûn.H?« ÎdZîæß åJïa›r¼ÀÙïgE©ŠÛÞú§ÀòÃ'5~)ðÖYÒAM¾ÍU?Â,|_/¶<üU(÷ú„P5SZåNÈÞ+8a¤g9º±c¨sღf›¾ÿ±l_w\‹÷Ô-Ø*fà á =ûÂO*üäzý s‹çÑl’”ÝâÂë$ ¾óøÇsÄOö3wÄ…d#+³F¯³T™H“ò\|›f .^dˆf û6X³ëFÉ&½×Ñ–•8~ÜÆ‚¢?…?BÒhK)&ù•Ú˜øé)Š-í¨J!=ñ=Á-"IÙ&!#_Y€×±…Õ¶À*}¯„ÔËáh%¤Þ_H}—h“IÓýö@1ìöÀ¤ì"ÛO™S›ac0빫xµÚ>Ϭ0N ªm®¥ ö±ýAŒ ûQØ€€`Áf»“ÍT "8Økó²„Ô…XX¥<8åÁ8½¾§w.µÙ°¹M§ô!”>Ĉô!úíe%x=˽ê$÷z$‡O½ÀõÔÑÈ ©®(V8d,RŒ2Û3cKa–û@Åšsçèï?w®$–æ BÇòÅûLø,úM¬ÊûÎÔ°å Ã`?#ÀÚÆ$fÙZˆöªV r©¼;2Ëþ¼¿ß„ìŽLƒu”B½È?€ŠY~‘TöñwmW9ù]‚š EÜ7¨i•êÐÙ^jÇÄJwÇ¿Ÿ.©F“ ¡ô³ÕJaüüú=Ln([Mf 0/ÑL6á,¼É5àØ ³Ðlæ¡‚»Ìλø‘©k†…Q„å Ã’r™ý – Ú¸‚0·¹\¦‚U†à@†`§XJ.®b)Êr<ÙXJ‰ÁŸíÏÆí?´S•ý·‚’ÝÃÙ;Ø´ÂC¡üÎsíò†8ÛDÊ^üÇçøÅoI4ûOÅ-ä*“ˆ¼%¦c”>Çs-eh£ý¢%WŒ¡‡+PˆÑ£—óî“oìf—뉯 ‡é]W¤ÎŠÔùuG®M¥Ïy©Àûš,žÝæ¶ÄæÌbŠùPN®Éß/zgEó°*€Õ‰L\;#5¢e@¬Ñ~áöz`bÄá¸ÁÍ*k(ûš€ ¨h@>šA ;S2¢e»7%#ŽôlÙ­ûk©;]]H±øLå­aÐEEw=rºkKÎþʪOóÝÉABÊ<³ Š!YÖíNªÜ Öœ*Ô¦LܘŸhðKëòÔa“+ò?>.׋¨+ò{îþ’V;)ÿà¥[ýOFgJ½Ô Þ„i>Á­‘ÔÆËÿzùR»|ùòåOò?yÞ{†[›¬ aµ©4¢˜÷?¾»º¸ùì¿UõÄËÅ4Ø^Ê ¥¬pH¡ æëa¼P4‹•šÉÖíL+;0Íw!$Ê„|x€Û`™9|5BW"8x*>d½5.VyÊ)”òØ5‘o¬¦Ó%x‚'¬è¢·ÕŠgVt*XñQ4~ŠüH±@¬)ù©ê„qèa2æg¡Ø&ƒleŽ_§`ÈP)cSŒŸXÊMçÝô\f`)dôñ¨›®¤Ë„—(d#fX/Ü£¾UcÂè#=r aep+Þì3çÍ6M×÷\Ã%%j cUÒb´tÇ©FͶ\×6Lž7Û0]Ïpuƒðf[¶ShzåšL ¡úÒ°‘B¨ž9B•@ùirE ¹È%]€_T7¢|kTpBÅ&Uó ÷I`“ôq² Öô‹Qƒøšä@íÖ9î.vrñS9÷3Q\ÃÚhš}¥O2KĶԘíM½óä*mû”u@hKÑÈÑéQÁ/¨ÒgUú<¢Òg*=<,Nó?ÏÖõïjδ$2Ÿ—IÓ¡ÚÈ]¥çF>žó|뎭°ED”œàIˆ‡H}îÏpØàL§ð(ÈévEü°ì„D뫳âc+‚£Ä_ËÜv$“Oáì‚ãþGUŸì‰?­ Y;¦³z¬#ÂÝ«üéDP!eR>ëò)ò¨‚UpBçÀwUp¢ NЖ˜0¸³"<8áæ!«˜Y¹¥À+xÅ6Sc°DÏ6¢ ÀU©:¨BÈë1ú‹_›ˆ³IX{ ,Þw Ï&½ÔÌv¿tˆ0á|èE¶l7½xE­òr”—sò^NA§¸Ówštl6Ýï¿Éˆƒm”YÁ#2Uç®F—Ó±Ä]͇ÙëuFŸCþ:㻽ßëüÄ6U§UÇ-X6ñ"šõ_h•^}-- }–YÌ8ŸßsÁq÷\²%YøhÌwÌ ™G+x~›MÛf«]2³wÅHצ¶òu»çî.5åqemj­dÓáÓìy_ ¸Áä̬ëŽs7éý2Úl¢Ø£!ܳnDlz@Oº ¥Û$¼DעŢ®µ´S,×ûÙ“èULŽŽª¾(ç’ÔPæ—+´_€®ÐZÇEk! P¡µ€á/}í£ºD©â{˜Î…Ö*¸"„•fJ¥A©4ŒL¥¡ÏfçÞ¤Áô{86zܹQjÚœRYÚ[jÃÁ]ìžxbZ’®Ò§Aú¸Ÿ¸…žP”;<\”O|òðŸë`¥;;4,j„½ç½ÚÒ‰T6Ƴ1˜¹¯ÿ!n£ : Ÿ!¹‡Y¬]ãól8MÍ‘çÓ….iGl^äÛë:ôÜwƈ[`ýèŸ"Ô¥rÿZÚÃG»ÃEY½Oø\E{sÙïõfHcè2K³FõhMß  w|ºÍÌÙîKÎÛáÎKw÷fó›²÷‚‰¶Z¢­Ã)Q,>téùôŸëè¶§[‹çÒ÷’cˆíÿŽÇöuê7îdpÂú[“'ŠZÀd7Ûw™·ãê".Ô3Ê䔄0ù(S—‹¡)$á*DPý)Ê*§Ö,¤áðȉ)aHî4(ùÆ¡dÄ æ.“‰¡þ‹ì®?²kV[† b¹ ù3Ó¾ïît÷„z!¢­®,ƒ@8š[*v°>®¾]'ä a‡‡s…èv-ÌŸ mŒthn¶M^K ‚ðw¶@‚Ž;ýßßoBØð`Ì¢íà+ø1FX¶ ”š¦ëPàžï a¡ÚÍb"ŸPª‚uªrÄEÝV‘Ì*ýëÄ?ÜwãIšãc;=ÊÓÙ3O‚í˜m©Ý'Už%ˆÈŽ)ä>p¾nÙ±qú~Ïð4¶SI_Ñ9ÿFßÿZ/2Ü0̃Zs`×!߈÷ëŒǵ¹„2cÓÓJHpû©à–çÛ†åø†á;¾§{Ì|£ôE°W†nÀqK·4Ç`pêJZ¾«{–k˜àƒ:–c ÊÄè;!¡¡›Õßñü°·NaÁi /Μ®{ƒbÁý˜œ,ªmå ‡ƒëZ˧ãe=Î;zfpðþºg‹?ìm®kè y| ûÔž|8ìñÀ˜p]Cãø Ž|¸G£`á´.²£gÜÏíV°pÂhÏ*áj„Ç|O/Ïí÷½óuO wðeÙ6^¾J‘x*Ï«‹ßÃÅ0=*,œ…ý,\Á‰÷œƒ¼ÛÜè¼D\ÁÂ,\ÁÂkؽ£ÂÂä/²dÖÓáÂ;1†}`¸Žš 'ñÃñSÐðŽT'2xù3„†TΔÛ‚® á™s¤ á2 ‚†cqãWPÐðBë¼ÄFQÎ÷UÁ£6©Ü8)h¸ˆ ¥wAóž4ÜÀ›¥ á1èP‰Kye%¨ÌA˜]&ÓYAÃ로&6\×ë”ðØãἡÓG‡ãQèðx&éc¶¨uò–WÐæ6WU€á8™¢>¬D„„!@D -=%ÄpïIELŸ°ÆÁh8«ŒÓß¾¼Í!ë4‚×kü9^Ñ‘¥0 b™¶‚ÄÕ"­U³iœŸÌlh&Óÿ­vâ4hx'mâÂCÎ òË@g&ÀM Ä=Áâê⨟_8:×Óòw,ãšË g?`ÝΩ YÑýd¬3ÚR–O{“U‡| Aó¶ÆEfu¼ IxÏÊk¾¾ÿLݾ}áNŸ€I!Ô­uà˜Èò6Þ®Ò6†Y¬ ­)àt£÷•»}KØà4Ó„Ç‹þ³”$“~‚6Né¶!Ì(æHnÕmþ“ /áÀFßÞvÑq ãøÿlëW Å]ÝëTç‡iU+®htqOðÛ—²àßÄÁåCº(Íñ ]ÌÌX*ï^DnµãVƒò, oƒ5Ó¸Œ`s¹×Ñ¥¿ð[¥9ŽbÏÜ=ÌoIQö½Jß«Û?ßâM˜¢NZÙlåpÏrt¨Ý:N‹.‚L¾ÁÔlÓ·à?–íëh9à1V´ãh®Fä@ÜÁѳߕ´”0) ¿ÊG•0éýëùãz®‚4ĉ¯„I)(; À›—‚o…±’Y‚­[¦ú”Ùrm6£Œ$‹^K؈HVêãr½ˆ 0H”—œ(äž–‚¤Õáu­8¿»~k*–¢ë7x%[¥ät38Ÿ@nòÄä­ÀÂcþÔÀòVÌñŒA£q»‹ð˜ðï»8Mãeö)‰æôP®1›Ù]°WÉC´Údêßl¨NÑP='Ó÷$¯#6‡Wx l´ÚÆ[rqŸóR債ÕëÝï!oÅDq™ûÖâ’U}Èë8Oò¯pšÆ@ËÈ9ßtÐ?è÷R?’ûD ‡»äI6_úS„!nç`î‚hñq< Èí]´ ’GžIƒ»¦_O˜äÖ&úb~Âô`’WDÿ…’äA#3ÐYâšxOhlà·4ú¥˜[`YÀ~¸yX÷$œ½BÏ9%ýîLò@ÇeÝßÓ΢ üäC6ôÄM‡_‘žBÇ<ROÂM¼M¦p%ŠeÃz§ùý&ûL*·Aµ‹=‡Óï›-¼¾?óì»{f9Âd%¥õä÷ìà]˧_ã.fÄu<{`&”t!ÙThjºè $t‰ºÈhȲ¨‹°~œÍy—ƒÚd×nî¥÷ô&$v¼cCÜ÷úˆ‹AëE²—ð:%»ܽvõ ôKpÚrÊUø2KÚ©¯=ƒÌ7GÄê6ë0àÕz“ú¬…‚yÑñ*pðLx _Ãu¤­ÏBjO66Äh…:É^ç<ü §o¶iü5$kÚÎ6¯¤ Qˆ±ËÊ “ ËÞÎbw¬µV»G5‘X ›Óç;QQÍ=}•Šç#òÎZïlŽésëj-έÜA–Ωùl½dŽäö|S•â1`ʰx/v ‘dI)g.a —§4Îlºši:Àòä{žnx³š‘Êt|Íôu×õ|5#8Å™bЄ6m×Ð< Âc¥83후w+Ï<æþGɔZ˱ŠË^[BXp™Ü-ßõx Á¬YŽg»ži‚×Çî3}ž«é– bκaW¦Ç̸žu¸~&ðw9㈮?xS Ãåã 4ÂÂßÂx¦IYà}ɹÁïÞÜßs§OP‡Xs›O1Ñì¿6Ù†5€hñ6 „ÿ/ó´aX83À–d&íÓvš)GÓ_‚j6£#ü–ÙÊúZ? ÃËÍf̉c9ËÛÊh2Éýê*¸Ëý¦ìr·åÎëX>…Î8g[ÜhÙÑ#ç F0èÃraû¶e™®a۞ͳšÃ×>ÌqCirÇtYØ‚Ntßö5×6MÝñ\߀ŸÖ›†S~Kâí°¼tÓ,üAàEÎ?løäÙ<Í3-Ýg3ß[à̃WÔ}²§±u‡£“áÃxÛ-²Š ‡ÓÔתç3PPBHµø:CÝœäìÜ"'ž \Øåù\çÁ¨"ØØÆ ÂU%°8…¨ Êfï³­ip@sÀÒÇÍ; 3†³6[&0‘y¾­mãÞuÁäJ÷ Ä€m¶è ƒPßAÄgT·Ód«l"0±‰.ÛF„ÃyÿÃ=òz@Rl;• z}p\:8ÕÒ˜ ™©¥ªWâŸ|¶¹o&¸/©êÐÈíZ½·‹z‹ÑóG¼åù@G²Äדý„²,ïÔ,±w¤ HsA¥ ª!q;Âdô~5«žY=´¼ÝèîÊÀ*‡@@D”3-Mø³4eéÁ‰®áœ=¥Šìñ ÜjÜ-’'Wsûoå¦| éAɤ(¯÷¥¤ïúþZ™çJ'ëw'Ý1–ýÜ]™æ'dŽÿΕ\ãíÃ<ƒÑ…kÒƒÍmü¯$q2á›{08ñ´`=¬– ˆ“eëWé¾äò»à'+HÉüã·h–²±õ ¨J1tAãêU] JßÃëLÖ±OápÑ×$(PõÈÅqWô…&ww>G‰²*3oj?BE]¼Î]° É¥oæÑ}` ‰–D¦Â›Â*…Û7ûE{N´ñWn ž‡€â]&wðäMÀ÷¬o ‚£yòáëvrS,ÿi«“Jt˜P@±^@uÈ÷ü©ÂkEB5e`°•ÕÃ6S”vî{…—,¯½˜Ã¿…ä6H*¼d©h‡nf¼d‘êTŸƒáØZ3*öÍŠ«ò83·fñ‘1¤a'*»ÎÖR3@ïO?ü1¶ƒ™ÔbŠCd`]T)\³ö«ªzPm†ð®ã82ˆË«TÄs»ˆþlù¿]Ì¢{UVÿ¬ÔÒ…#‡²*0⃓ýâ×&bè*òrNaVÜN,œÉÖª¬DˆIST™Š*stT™ª¬„.uוä9äNMVVÒÝÔT"BT w†aÄBAˆö¨*é—Ké‚M4}ñŸã¿%Ñì?'ª œiºÖ”TxûÜ=ŒyRözQô]@ï@;UЭ º£5 áçA „dÆG(V¢é£nlŠÄ ~£EFpÄG 9&$†>nbB"Û50°øï:ÿ\5’Ç`?B*Vz@ö#i¤°…Hi§ô¸—ÕÂ~$Ž ›È·%|^,8 a’N8%)ÕÞ‘5ªám´ 1Æ*Ë þñjöêññÅüõrù"hªS4'ºê°l‹ý.úÚŸáÄÄj+‚‚;Æív±öŒi (—p„yá_ég{¦«»-×lõRW»Jøu/ÍšèȸpO—VgŽ«!û*¼ü¯—/µË—/_þ÷$ÿ“?oN£e/Ö€äÏ™nH¼L'Óx[ä¿nÞñ?]…£Ž~0€Wå§„• *ïbª‘7“MV!ͪ¸žÞZDÀmM‚)\/˜üs‚%ôl(ÛMHŽ'äÇq'¾º¸›°i­<ýˆÕiÛÁõjÐ@Ñ2ZEËíò÷8‰þE+X|\mBÜTDE˜| =_ÚXû»’Ö£Ç'À ÇeðA!Ûþ±}à'Æö‘—íð×Èñ »P{HCM½+C¼2TÜæ!øAZv™Ÿó( ᥃Gè ´Pš é>ˆÁÿ@Í‘EGos²®&2JQ5÷>¬•:_’{dÞÊ1R¦`A˜+ļ'eíÄ{ÂX·»ñžSªçIù߉+ß®|'z†;e¶ÉÈøN`U¯MnE5]ùNÊä‘<$ƒMþ§"<1³½užŒðù}DôG­d§Íxâ Š¹²EGN©Ru [oRÆÑЬO„ 9ÏñÄD“­)œ¢ØNFÀvÒ„µsÛ}“ü>§XJo׿ å{oùg{döÃþïÒQ9Qã`„¨ò€ fT@Fþé±q=Ë€ â6(Pæd`kd©=«€Ì‘xvxŸLœz܃gGÞ–æUŸCñãà»ÒÞ@ñãìZTÛG’â-••ç¢D47xD·*³;æÊ·ac.žÞüýÌñV‡‚qµÖý%µ|ò΄”ç9©+È D>+gâÎD§çYºˆÃy6nDžt~º¼./J±S–dœEú×”UNK ˜ò€ÝÏÂ;Kñ÷å2’íôz=,-{庺¥»ëõèŽcÊ»ÓD¨øûd ›ð÷á*ÞÝÁ5õ•Z"Tk…Úf,t<0A~–œ 6_€Ÿ‡hʤdK¢ðl.´·7ô{Æ©ÍÁÊñû¿KÒš¥ï°A‚‚]†Y×Åußï¾Da'NÔ.eæ– ì®@íY€&Ò]‹g•6L×´A±èŒ ,OŒ üƦá8¾ï»†nèß•I¥¹JÜU8p$  û)¸ _…p/JL5Ñ¡5¸¤ù!M§q礽¥w•(¨ÿkâô!d6AúƒÀsm€‚$˜Lc¤wÛ´;„l¯îÈËÞmÓçLîΩAòùyó¸„üjÛË.S~aS¢©µláAò­òˆèWœ»ýOvEô´O‰]{,`Wõ³ô‘IÊ)Q&Ϫªðž£"¡¸V n=t3¥¿ÜsŽ4µ“¯k§ñæâ\ëk}¶÷NŸ”H‡«ÑñdìqWóaö{¡œ.¡Ñ›+½Û¦)ýôoØ@¯.èoðýÙ± èò0f-⧯p} û‚`%úÚtëK C¯¥3ogødpàÃ=™lY®ß}úÞ3WdÕ"ÀßÚ*<22ÂJ‘Ö¶òµ»ç_2ûxƒW×Ö=>3ƒéðiz¥¯Ü`xölœ»Iï—ÑfåP´G%ócÇÕ¤[Ma§Гˆ .PŠÞF@)ûÐËË«‡ZÚ)Öý¬Jô-f\€˜+Ô¢6r…PTïB ‹‹†u¿ té&êÖp6¬wÛ¹QzÓOÉÉ•ö–Î.¸‹}'©úËa¶cf9‹»JŸŒ¡ŸÑ‚1»SòB°ÇÃy!â[–y˜Æë´¬…Õßà-êêŠa J/—[E!K“¼¥ÜÙÚwm¤—©yíÅHpy$ðŒ³íA`ÃijŽ<²RhAæ dz\‡Þè}gŒ¸6ÞþAL]jôû×Ò>Ú.Êtê*•NÍeO¶×›!µ«p;—Ƶê–dß- ·ÿ\²4E=ÛÉy;ÜyéãîÞl~Sö¿`TQ´bäÎÂ:œNÁl×Kr$Màè¶§[èBQߥ×Äǘd¢ðw¼d"ï˜HûÍ»©=ý1£s×s`ßežìˆÂ‡FfÁu8Ås’^évá9ø Ìœ`yþ#{}{rk’¢uˆNƒA2Í-ËMŸ îk§d¹²g¹ÒÕUŠzïèÐ]Å"¦uJD¦Š†‘C¦ £€‹ïï\$cuI‚Y´zv÷WÕ ¶5òO×}Xä Ïw:EPåX¤zF9“\Íý.©œÇ8ªÙxÐg¬8쥈‹”~÷‘>×ì³–Ëu ûuòð ɺ$ú•¥t;6NgùÍi¬±’¾¢=ü-œ=„ï­KˆW½œ&ÞÓlhI"´]ƒ•즨B}%’ºhT1©SP­òþDFŸ¨’ 1“Ò‹©tÐϱyäžbWš] wD…¿?þ¾Ûú4(¨ˆÒ`soÊj†æ[ŽÂ¬X †eàgLwŠHþ«»ž©£u¡:f* MTÇaôr˜Ôëüs•ë…8Õ1PÏ< Õ±, šÉ«3ú»šdøñ©ŽKâ¼–>/Euœ‘G)æø¬·ל²Þv³Þêëèm‰"÷8"BV§õä°§nÃïÄÀ6 Ö +&³avD#]ú ¥mˆñižãúºÏgt|Íu4‡T’è¶æ¹;†(k]Ç4LÝp¡Ò„Õ“ð$ùÄGòx†˜ õ)k .?’™ X’×DÓ˜3»ðÉö¨ÝCݧ¦¬µ÷ ¬E†,@²B¡Ù-€Õ °y9®$œ½B½átúµA´˜PµemùŒ²Ö±|¹+e­˜^hÁ½¦áã‘QÖšånu¤])kÙ»Zd“ÿ©kæZ@ÎÛR¢z0ÆZWZ6ÛJÆz⌵Žäã2Öš–lìò(°ï0‰¿†ë0H[¡Ò2ä×mcCCËHèfÛ0pSîîÌ1ö= ×$³¹¹àH˜à×¢†oîÁâÃÏ­4QJþSø#\TD¿E³”Ýè^2D“ëx1ËÖ´Ú/ÏDsòÒ0,ÓñGwXçZhâ2lnúži:®é™–§iøv¯©'¦¦áVÃ×<ÛB…CK®˜’ªTR•Jª2W¥$ià(Ù¤d/è)U©´Ï‚"0ßIÉÍYP˜¦ªfIxÏ ‡¯ï?\]@ cˆïö09›£–å;Ä µð0ýùÉd¸ ­”£Ãh}ªèð¾Ña׳LˆƒÀìp4ß÷XM1Åû»pÀœ(üÇÃ…ÛºëX.„Œm×Ò4[Y${‡Ãž 2YmÙìSeÏføßîìbŠ>ûiè³»ežXž ž¤œ+8$Ó¤¤„‚íLtMð=È Y¦©y2œLÇú)\‚,’cÚP?äºÒ«,c·”–þÔEé vâö7pè×€ý†e Byþˆ¦áDZâÀ‘©»ž«œîón—§Ûà‘žmù¶k{H+ÄÜ.Ÿ.pÀº5F-NS_«Ê‹MAþ)$A4·í²Þ—¦0|ÞðÅGåäZ«6N…püˆ*Ô ‚©¬4M(Q+ÑòL¨-+ÐüÃȱ wT\8aø¸ym wöÎÚ@êÒp5ËŒ´¶Y\þ·0^†iR®ÀÎh¹ðÞ»7÷÷à)e§OPó°¥r€´=ÂF » »Eÿ }h ŠÏ¨²Pæ¼… ' œ…Ùú÷<˜(ó”x㪹šrM‚‡$XÏ«¬•õ`lø¶QWÑX"CÍG#o`šÒ;¾ˆ6)åeNÚ‚@Éþ[>0ƒÒü·ÁŸ 3ÜÆëhŠnn%dŠgá}°]¤ðæÞ€Ï²Á/Óx*¼Xéûx›ïK¨¢±åÐsgy†>æ$2]4œzôbÀYͪ3Bp4±¾n!*Ï¿Çâ¯jK¢Ã{HÚ¥ ÅþŒ'œc€Œ{›r ¨ÜõùÍŸ | ¼ž)=^,⟄“([§ŠÙÌf-ö!ÉóhÊv„,e³-n4×fžÑáÓT<0!/Bö>M£e°€÷ ?ÿŒ Fò-<¾$f9 ª`·!O¼ýg|€ŒqqC’ËnÍf»“Í4QAÔ!‚¨dyh;pÔ8—Ñ`CÊe&Iß‚'šA/þãsüâ·$šý'‡‰ ?>D¾”#ý<ÂÌÇ¡!7³P–•ëÜ$8w¤/“jØm€*¥ô¨ñ¢ c1¶ü'ÜýØ)â[2¦\p¶êžƒqî ÝnDʨ@3¹ÁZPFÅýëùãz®Z‹+È<šÍBBMýÀ‡ðX ¾_‡bc'ä«#‰IMÊü Àð¿'@™oQ:ÿ V.^†ÙlB»¬v¬dëþI9'X{°¦öÞ?A õøl9 ïK¦Ø>™ÙóHè8?÷<’X ”³Vè(ÂF²¸– PV"¡ÊÆ[š×É>SEz£*Òk40Å)þŠYÒ¸jå„›­Ö“ª j™Hí±'¬ DÎ…î5ä@UTÔÚè•׫eçTëYKP˜ïºÏ¢&°÷.÷”-»UêT³ªVMØAÍÀɤ‰z÷ë6áš4~Mk% ï~ÃÚB &©¸ºÈ1Ö™¤+žãÇM§‰‹öNlÀn¾W@­U´måÈN¢ÉJÃðO>:‚ucP”‹U¹'¤7Íz,PíÛÄ‹< ¤àĬ0Mâ'üÝþoRÕVÔÙ`•[‘F”×ã`ìŸÅŸË¨iæ§Lýp•Bº þ{u!<­c™Î´?ë`6ƒ¬{éß@$ý.+=¢1]Ì/ý}§i¼Ì>Ñ:9ò!¿ýÅ5öÊ w”ÉiDt– ºåGVÅmÊŸšìLñƒ+Ããv$]ߥ2dJÊ=êF{: ¡–¤…½ªbŒ@yûaõØô…¯zÍ1ÕÕco¨OLª¦©>0&¹˜š/SŸäWÙÇQ°´Í 6ûÆw¬„"˜RUÃ~oÌPåwe¸3«óå+í+5ÀùG®Ôz÷:ûlúWË”ñó]° IãfÝgòªjòRkRŽ~…@XQ“÷¾8º½à«Û?ßâï¿Ã.˜7^FW8XéÏŸÀ‘ ÖY/ö®?çëÅK…äÔ‰ ÌUý9±ÆŸW©XÍái\KÐЕý+XlÃ7¿¢My‡Éò ,ÉÈ›†ãY8¥†f)©&®)›<Ér+ƒý.~„DÜñs¸ ŸCa‡Z¢_w,óUK4Ùý¹›U/õ}Õ¼ý–è’÷Î/Ñ·Q ™ßZ§‰­:¨Y¬Öiî…<<÷“2¥•“€‘á(¬ ½Öi&j²(+¬ÓŸÂ‡p5{NësIŒXÙÑÄX3¸åR…:xk®DÁ§Båp%ÂHÍ£ÁQ¬8¥ -Lñ´°=ý¦YB Öç·P›õ'$Ú¡Lé2Ëäa"ÌÊ”V¦tQØ“ÏTAS¬¨ ÀÖ¸g•áhrfFŸŠ ¡ÑŠ #‚ÅÕŧpö&n†û¢Ra‡GÚê~3ÛÏp–¾Z|ÝjB*‚R?Ö‘çÅxÚGâ8 [1på#Ï%(„æ!ÊÿÎPø‰¡}I2r:Å]÷úã;*£Æ•þ kiÙ ¦(ëFUôß”xô„"ºµçø\˜ê:d ÏCá9$4»0°H™t*\mÏõ<Ë))ÓׄJL3‹õ"šfN®z¹›Ý%È䂆.Ô‘˜º¯ƒøœ@bêùírÚÔ¾§DèôR"î*Gxˆ¶ÈSò-+~»5ª¥ôW•ÒÐè)š#ÐÐØ¥hæKL.Å@Ã1Ѐ±z?–…;ž¹[«ß•ÖNjTùðÙùŽÚœº§Ù3ŽP·{ú5t Ä99£Ê3\Ëñ_ÍqÏõ=&9R2¼Fí<#µTõ.›$…Y %ï7W¨ö¨ÉÅÊ»²zk—Kd¡¸ÝØs\$öÛ‰=JP€<;·áÔ*SL{Î^!q`JØ|€ÌgÂVL½mNýGÈ—£;6.»òåÜÍì»À³ØÌBÊ Ôéqµ¢È8”?BJÀNT®Ä—Ñ‹ô˜¦`R>Sƒ²3U‹›”f«ïé4-†€¿ê,s<ÁcÈ–žã0æä¶C•…¥õy+œŠ8˘ sx—‡ W—À»b›[Ô ´= –PÆ„V3'+t·ýöÞµý.¿™)‚Ú¡#èªÈÀ1"’1ù*¥"\d XÎpã¾ñÜÕÙ0ñŸeŽ Ô¤ÌM¢Ë÷4Ó7 £™ºå˜|¶Å´ àîÒ=Û0mßu³,ÍP&—¼3]ï ¬€cH1/6¾½9£ÉãL¬*? ­C“¬Ò´=pøsb!>t Šäo´$ȵÉ`6Z(þŠ3ª›Ûà¯u²ÈŠØ}‡ .}Ë­‰™xJèÞÝh÷0…Ï #Û+rQ×êB:S]J¥ØýJFF%رg@þ¶cÏr’ÿâJâÈ£Ù¯ŠŠ{ÇDÁ Gƒì0M¥}”vˆâñŠFÙË„ê”å% $ž(¸faÖšEwª@Ϥù=E˜«Š¬p‘•â•6²Â*4Td%Sýá¹ièwâý½Øpã¤ty›0‰ÂMäöí ý9nѬBŽ[üþïr%&ÿ6ø¼_$‡-&ª„ÚMãÝ—(ìä)M]ò.tþLî-™Ž <í¦Aß×u–y A"Û<®åi-!hÝ,€tGŽžć¾fšŽëûN†,)S¼Kº c¸ʶõ)¸ _âMDvÛäqKlØ9z¶Skp’ùYüOãÎI{K'À›$ þµ qJ‘ÁB”¾ÄP,V H>žO0M ®wÛ´;Ÿ€wf¯îÈxÎ{·MŸ3¹;§ò”…}…Qïo€’{KXI¸ŒéMz[š"lä-DËÒ;ØYÑ¢¡|‚äóóæq ˆ÷¶—]&ŦDSkÙ‰ÚåÉY¶1tJ,ÛØcË6€¸ÒG¶tcÙn¸eôÐÍ”¶³çij'_×NãÍÅ5¸Ö×úlï;©¬Š •ÐájtA<{AÜÕ|˜ý^ht>ä/4gÓ iï¶iJ?ý6Ы ú|vªƬBœ&)ç#_ÙmÁ €„}¿éÖ—†^K-Þù3|28ðážL¶,×ï>}ï™+2€Q:Ü´«ÿV W¨À˜“\µ¶•¯Ý=÷x©A«k럙Átø”C£¯Ü`xölœ»Iï—ÑfýÀ ‘£+Ê$ ü¾(=•?ryh7o2|›€8;F>ô2ÄÊsBÞN±nìgU¢o!0;à°«á§6²˜kn·9ÀÒóW÷Ë@—nÒ`ú=œ ëÝvn”ÞôSrr¥½¥³îb_ãIš>ÌvŒIYIWéÓ€1ô3ZP—û”¼ìñp^ˆø–eæŸD{!}ÜyÑ¢®®¨¶ ôr¹K>*E!K“¼¥ÜÙÚwm¤—©yíÅHpy$ä>gÛ5‚À†ÓÔy>d¥>Ì‚ lÅ‚Üý:ôFï;cÄ-°ñöbêR£‡Œ«¥=|´;\´Ä^ʇNۛ˞l¯7CjWáv.kÕ-ɾ[@oÿ¹diŠz¶ÿ’óv¸óÒÇݽÙü¦ì~ÁP hÅÈ…u8Ý.‚d0ÛõÒƒ¼üs›ê–¡Qt/#ý£ɱJ†¡½ß¼›ÚÓ?iˆA2Ï«ÕE!»Ù¾Ë¼¸ 9p˜×âT®»_Fx«þW…8(w2Ö$5Ec Ó`Œ@sKÅrÓ+¨ƒª}§d¹b‡³\éê* Å ½wth/ üJWŸRÊ ,ÇV RžIÝ×ñýý&†A¤/I‚Y´ÝÀQüÈViºØ¦bxºîÃ"ox¾Ó)‚*—¯G82 ½Üï’ÀyŒ£šýÉÄ3‰ÜÌ ²Üœ])þ ÜGú\wXg¹;üíK9>1ñJИ ðw׫áÌ-É”ŽA¾OªB%¶‚JÒ‘»pÀT¬Š‰Ð} „ ¦R%›ô6^GS„LÚ…ÄÇ:Ã3^—¾Á¢w«©Ø;í³·–½ÒFÉ^iœ’ü}Ð7¸PN¤#PjpÑC@B³œZ%Õ¬Tú~}Ä’Þ"¯N T¹ÎC•‹í¨Ýwº<ÀOp?É¿d ¢ŽS{‡ü¦¯¿q¬˜±°¯àùFÈ»ßÿZ/×Ç'hZ’àkÀÆÝò'4Z׽ +}è]Ôiûý.ö­¨4¡ÑNÔ­X9ã9éu`éU:¡¼¢Ò7RúF°2@í3Ö6Û50M“hÍ´ÂóõLéÁ¾L€í+rgÄ{O«¾Q‡R";ÛxÊ5®ï˜¾ÌÖwÄãÄï/.s¼á#zò¼”<¬–ð4èÏJ^¸+ÎJ¡+¨ 3tÞ'×ñbv÷fÞDŸ]âÁ_Ú¦oêš¡;PŒÕí8Ÿ3—žEð0ižW•ìjìCâƒtÇsñ»€7û¤ O_>$(~ùŸoc¥,;ZeÙ;»›•»Ó*ÉhZ+»{÷¨×Ýe¿ˆ–ÁCȱfá}°] ä›mýM§‰KñX TóbiùAÍî"œ’Ê7ÖÆ‚Ä™‰yT9pMªFð–ß`œÕÓ…Ç!t¨Ø,( Ö!ã€GòßSÊÚ1ºây°“·F´LúW½p· méì©ÞÝꡜªV=šÇá¹ ½>¹¿bJn’×dó;æº&üYšñ»Åc î·W@ɲ0ÃÐëSèF;“©¢Rï{JV3z5#Ù{\²~w5¡;DWvÉÝ R•¬[ì€}ç*¿™³šÆ¸TV'{éûzL¤JL£cæ¿pª>aú¨‹m)*†«ižåèPq yr‹×@250æ-øeû:pö1î* ‡²|Gs5O3 X´ ó¯§Ç•ÊüÙÅ"þI*²ÕK8Ó›Òf*¯SãÎ7\••Ûøê7àl†×Üᅦáú[”Î?ƒ™‚ï*»½BÕÛÚ±ü O©TJ^pû§Æ9ÁŽfèãä.ž=â~‡ò ÑLÂæ°· )bjL"”ö,C$•‘¡þx5{õøøbþz¹|p”n5vAs¢«V(lNƒÖÚ¢ $Æ­§h­w£µH³Œ{¨”¸ËÚ*¯§bâX‡Š—a`Ö!\(ëÐ~¬C½³ãNFÄ×-f‚cä*Ê~±ŒDb&¢ÓžqÌQ²§3Á‚t~1“ÆH˜*‘ ºq¨Hư{Ò›7t2PE2 $xb‘ ÓÙ@×pIÒ&8®°Ë°tt –a¹. ð‘ ÃtA{ª ’aÙûYI^"J…sH’ˆ×PWÿ<á«Y-`U?Zò¿E³t^‰f"`±ÚRþ3îpž:ëÌ¡¦’m*ÙF=ÊÑ2zñÑNàÀŽz¥ ½†ÿ‚䘣.F)Cç€Ùže¤PÇCPž|ãÁ žíÊΗX”bÍÔr¨’ó(Ù¨¥g;À(r.ÿÞÁ„,ƒÜû‡N†Ñï…À4r9 A–‰»øW;vC|â3ŽD`mß)E"°Ç‡ŽD`³ZàHì'(²Y…ÿdS¨æáBå¢[áiâ —/íU&}F³Ôeõœu0›AF“2èß•ýnb#à“ÆZ1¾ï¡vÿ¾‹Ó4^fŸ’èaNe˜lîÒpï÷…JˆA,nSŒç ÿã"‘{tk&|‹4|¸}ŽW!?ÙÈo+«™xÎ è ±ózR@(*øŸoÞÏ&’áWJ¥×ÔÚ%ý¢õË´üóê"Óä";âݨ¼¡Åœ1¾µIݪcÌÅ×½®ãDt-T%nÓÀ·¦Ô’œé±@F%üEŸ ›¨‚GF#eàbFPcÐð(õ?$ ò«I¦«Wzå?U%s€âÄ ¸ÿꂼ÷ôóT›ýPær ‡&?!7?!ëÞÕEšlC6Cú_¯p´Ëã w´ËcñüÑ. üÑ.{éÑ.VãÑ.ƒ£]ž±¶ ðޓ͸²–‰Ö­|=kß—Œ½÷¥®ë½:Oöôø§”?º[ÀL7íB&>8n {^´ºÅ»iï#e»n+bø0*‹b;ëØƒ ìß³‰÷o×ø††«õ áº;@C¸‚Ю…4„«Z¹!Ù g“YâKd–z>¡•W“Lûö…ØTh¾gñŽÜÌo>]¬yXqÑ–/à¡',(<íDÂ!ˆ¼÷‹¹WJó¤üA&3ëlÄüA­e¬8¨ö„²ïXÙÜ4MØ ¡Óóˆx˜µt‹pú3NfçâxûÀR££KI6·ñC˜Î3j+Šå}s师— ‡EOÞ‘ÚµX¢C~f—b E¦ 9­©ª•PµŠ©ƒ9vC² ôgêèoVR\·“UÙâ¸è0I#^½Éˆ,pKºYn—¿ÇIô@ˆ‚ÅÇ0—Êžõ Ù¿Ú.(»zcPú Vɪõ:‡ÿ™‡BÂÿèõ`øÿÎÂÿø‰…ÿ yøÿ yˆ².앾Ȟ‰eğ$CCÊò£Õ6Þ’qvÈ@·û' vO]öÔd×é½$Ï®(ý©ë2çe&3Kö“K“6=®Ô³Œþ5Ü-1O‡Ü´×÷îednïvÖ|ï›í¸µ›ÍYì|E¾X ÈáʾU]X%ñd`&6K¿pêŽÍhœ;¥ ª>{?r>rU¤$²BWQÍßIjÒwƒ÷«Ê0®2¬x® cqÐçj®È*ºCfè¤Gß{ysw6‰Ü·÷¾¶Tv!ε†` Þ–IO6X=3¢:y/ŽÎðPY½(!:h7:a:$¾‹ôÍ*Ñ~“«78 ÿA›MflgΗ|ìø–|'+zTm³ÁÊCø¬õ7™MÙ£o‚YÔz™Ìís™Ì íñ0¬xoKžöà^"`ìý{‡{ ïÐ7k‡ßÙÂÓã¾A)Sï{°Ãm3vX〰«w×rÔo[€P$€ÐýíÙáéìð¾å^vžåÄß=~5kýïÀwM϶­}³w˜P¹Ù{p|éPLëùP@ 5µ¼X¢cjŽay¦æ†§yƒÌRv0¨°52Ìw-Íq ¥ZÑJ4Þ§µDY®¿²¥Tز]ýšju ,T}Ð;'ím®•GdPèŒ!÷·¯ ½TGØx—©Ðwk»¤ÊÒí'‚$¾T¼ÕØ»•>g2‚Óx?$}Í4Ù†Ñ^D Ö&\ЏÜS4TÖF>A†SB%S¢U•é÷Q“4Ë~B•M¬ÇƒT6åáB1IãS<ÝsŽ4µ“¯k§ñæâ:)~-ÍϾÃéC_·D2…›ðŽŒü—Þõ$öîý^h„Ê_h OÈ\ßmS,]ùwA% ýM'%B)éêanÍF§„š›³8¿²Û‚&º¬ ›x‘ãôðì¼~ÂTÆ·ÄÚ¤·ž×^î÷dÐ>Ã'ƒîÉd˲pÕÎ…ÊçR å¦¤L+²Â.KiQ^Ø­¹­|íî¹ÇK z\][÷øÌTí(Ø×ÏðìÙ8µ<Ñ ¿Œ6›èG8˜¢=&«A;˜Ý0â€áwmzyh7 ($?o£á,füï2Ð’˜~«¥|gÚÛb ë~]Ͼ£\+_æ9å»Cò â>—soR` gíþhÛTä Ý¥7ý”œ\ioéì‰ÒÔju•> ¢{ßË A8Ý)y!Øãá¼ñ-ƒ»I=Ì?QXjçEKÚ{Ó{¹ÜÒ( U‰oò¸i`lïµQ*FÏ®ÛQJ Ãn»iÒ(L‡æÈó!+õ¢õdŒ¢3ƒ´ûuè+¸ïŒ·ÀÆÛ?ˆ©K2®–öp’îpÑR ¿¹´7—=Ù^o†t*ávÞüj”l¿ƒûÏÍW+6urÞw^ú¸™­Ð¡ÙܼÞ{ÁÀP Ñ*­œíz³§ÛE f»^z>ý "¶§[ @RX³²c4Á ùÄâ•÷›wS{ú'b!ž® æ@ý†cíc¡¦†6àÙ*³àÚyÙRŸËïÌÁ_`æçÏV”;k’’œYÃÊÙæQäÚŒìvXƒûY®N;%Ë{<œåJWWa(¦Ã"/¢û•îÚ£kz“‘YŠ âzd2F¬¼¾dzƒÊ >™Î+Ú1¯™ž Y°m[#ÿt݇EÞð|§SUïD8xÙº†ññ±‰Ò>GÊþyuÁÙ•y\¤º7v*ß1ÒÀÉÁ¼í~<¼B2£‰~ei׎Ó[N~Ówµâ:s!$}Eóú[8{ßÿZ/â eöršøiCKŒu V²ÛœÊ@q½AÚ;@•ŒxfvÞtvþåÎÕe» ¤r1ËŽub}qH°ô2ÜΘŠRæÛ·äëŒT„«C¢lÄäf“R”uuør››<¯4Nz½¼ÙѱIx é™o~E›/a2BÐÑÝïª m¡óæÐ×\·=S—ñCln‰.Û·ñú81ÂdÿÀDcSp±· Ëö'dô4´y®ÓyÛ­”Fü»´—ÅYóçý»ðv„ˆk½±%E>NѵM†¨Ó±Vµ¶¢Ö]®^¯3Q·êol†>6:%ßE Ê'ÿ–D³þi„ËD¾tðŸç€Ü§çé6óÄ3º[rÇ0\ ³ó}Å÷Vƒp¨ôUKc̦ÊZªì9ý^]…æ$Ly*ó]D+‰©!o"_|ˆÜÈ·`±{ŒWa3ô"¤ñc&&›¯],©?á݃5Ÿ¼gmK•ÜCÊ—,â89æShé@ñŽ‘ÉÄÞ³^·¤²’×UÖT¶ÏóFÆ»pA¡Û—°@µnÒ‡_34äÍb€²T㮼wŒµ¥±ÜSB+ðá–nðØ`âÄœñróÝ_ô[ÆtðpPgP¶,ƆnÛžéiúy¤‡,×¥gW³}Ïùfä}û‡¢¶}pÍÿÏÞ›.·d뢯ÂPEœÛ§(s¼¯w„Ç*ǵÝ>–zWwÿq@$$¢M<¬R?ýýV®ÌDH I€–d¡ê‡E ‘s®\ã·£’>®¸#<àcBQF·Ügh€”:¤ß鞤kÓ{¾3Õ^ŒƒzÌ,uPµ)‹ÊæMæ"»úD?ho} Öáö2˜}C¸á7·McîV³ý‚jŦe‰r|ýüŠÚãE\Þå“QÎá§ Î@Bˆ»üäTf›êülbˆ¶ ë¯×ÞMWÉÀ@›ã1Ôň™»?oRó Ž2géá%12û“ÓˆÒ’Û¢ÐaÚ´š(Û®ÕdºùP´šÆxÄy†) }´p ýypXµ>»IÛ jBkDôÒ^ÑíŸéQ¢:1Ä÷k¸ž^ø{!šþæmœŒ¬ÜªÉz ô'@Jz;°ôÃy!»—'“WUŠ­¨NM¾"ƒ2¿žô$oÐ}xü]˜[‘”Yè´½†kÉÖûgÑ’uλÃîÔ’ó@sÌuÙª3©í^)¼pŒ9+X¶VS!ÚH€o‚ÃL {¹ŒÎ›V`e–G¥ü=w»¹Kæ¾n®¸Ói9…÷¸.+[æœIÅOç8ÅæIcÕè½§È¢ûöˉl3 dAÅ’:C^<ÙK½h.}.¬>Ö#$Û²W¤‰’d¡À§CÐ9)´9ùX>ºlÚ¨“×ë½ÉŸ: /ÀY§xæ^O²éÚÐd„¡Iš ÞŸeèlÉP½ÔÌ1ýxEy}ãW‡!·’Ž7-¶NÇÝóñn¸2 GJnºE#XºEñlæZ Ž ·E­ Jc®JUŸ¡üºÄnØ;>øßK¸‡žç„äV¦6T”ÛÕ%æÀÒÅN²W#ÆÄAÈ9mVÓÒY‰bÈ35D6ÙCfÉy4äRfu4ffÀª­¢Ì'0”¨ ÷¯2ÆÐÖJÂöC8ûV´Ì™×_f%b™q1£Ÿca’à ifB·?™öú£Á°Ã®4Ð~áM§7ì"‰y·3èN¾ ´sÝóQÜ À7í÷¦¶“k9»K¼óiò¾„µy®F‘û…w'ýE}lã‡Ô µa¬Ù ™|rб¹I"Ópö6L()ØôYUK‹ÆR˜¤õ¬Ì*}ÑÑJ)HÇ*1.—Þdr>Áov8žhe.¨}ÏG“áp€¤÷:ZÉzçdõC+¢è™L»Åô¬7bÆDyˆ±¢EéR˜ô™b§wËŽ3W¥ÌýÃê6ï‡ÜŠä%´¡ð:¨ófûØô\Ç6\}Þúß`P³´Q*ò.nXyíÑ„ºÀŽ¡l¼´Âò0†áa<O`}è:8åhÒsÃhÜ‚ÂõûÝá€?霌F]XºØ¯£B”º©l³cdÓgîѶsÕ8/ãNoÌ–o¢tÝóÉæ“ñgk8v¦ºËÝó0q@©§x<1$³&Æ9]ÌNõˆ[{ŠÄš63l¦ëàÏ"GG‘4¡ (¨Eì»}þbg²Ê×+xcÒg#ë=º|ÅÒZW—^¿`æª-¶£}ð×7Å^B™Á¦î+³B©D o…Eºˆ‹Ë”,Ùë!]q7Y¯2¿^¾D*GͽÍw¤¸¢”6ö…“y>˜ &9²œ©Œ×fn—z¸*½Y²«C£J±_Æ<ÐÉt ȪE«ùXÅ^Ju^ VΪI¬¹Â¸š‹3ý¤»#ˆ ñ¤ÓôGÜVÌFXÀy¯ÛíMÃî¤IcÒc÷~﹯êFÓ)ÞA>é;ý‘P*¼ÊÚÙô>°úØr>›æfóFHlk}f³Êà!°”§PlÁ¬ çÖh6]£Óu±Ç‘ºTä^¶ÑS&¨}4Ї¬°Dâ´j ¤EÕ©æw²ÑÏø>m4EÊõRV9†ú¸—©ks£rQïËô‘ÈD&{\ßdÌ]ŒéóþíÂôeúgGL_N…ú¢ÕŽë…¼Šy]˜"0Û„íõ$Ô?Ú¥"_ku‘±Ô‰æãf‰z£(\ë– éš@ú/CåÓiqg¶E fM?±¸Å5&¢¦½[ˆüí³»Tsð-¨ c=Ú±·²¥4ïÉâÓcˆŠ–ßä™JV™©£C0ý}rîë ͬtÀ.cÏÕ'“7Ó•’ß1Ú*Ö¬Jmùï{P²§iý¶ƒ‚lûãÁt2“À°À.9ô{kžt;PsÅuöBÍÖ±QIn¬N’w°ÆbÙárŒMÝ|ú ²G~ SR ükA-Òm¥œ÷K¤å°'®&uI%Ë.OA_B¾dJåjÖí¿Âr«M(ÿªÓŒH‘˜A$ N¦” Bqù †ào×{SèÀ–©g³1¶:™.ÉPÀjlHS’/ÚðéªvÞ3U°‰Ÿ¾×ƒÑC¥Î`U‡ýPuÓþb=Ô Cèúµ¾ãwú â¡fUÎE]\»ÛÉó><î¼ë ¬±jâÚò÷©ÑÐ?6ô‘aG \CîE1MG(®k°­\¤kÁdk÷Sòwªî`•˜TÓÃ&Á‡ ‚«øæšƒf²«”<º-«:8åÕ”Oñ޹C’BW"¦Ö+…ïÔÞqG5B"5«‘»'²$Þ³ýh©:é¨ÇôÁRibGÕ¦ŒqH—UëéG»§f^3y% §£Î`4©QÏx'®™ŒwVzkkyãh‘Ô˜Ê×›°‰°éµh_•2ŠXªBcì—Yç31Ý– «û‰¼GjàÕ‹ªm±£]%?EkiÓL)q7Ó˜°Ëdˆ½B$~|G± Û€É*¾·$¥Ù[o#ut ‡õ}–ÒËM°¾_4µzl™øjGå!°jý²„îÒ¨œì æ¹+ž´»ý"´Ž:dã5å´õ¢udye­BÜh¶Ñ’c…<6ZN%ÂÜõõÎßKm½:f£§ñrånÊ‚° Ã{? F·×ÃÅ—­3¡Œ© •`8uY}ÎËÝ\ç}••~{¸þ¿83¹땉çSU,É <ÖáEWkxãmƒýbÌŠX¬ÌSXO8À€k(åFc*ïÌù̪Dsä;÷GÉ[§W½d2ª’j‹Áq"•È)<9Y¤âjL¾IMUÓÏéÉ®Î4ˆ–r;* ŠÓÕ°4|Ú»‹D?â¬ÁFð>Dc@ 0XÀËVG3¤ƒÒ`')1²f­¼ÜìEŠ'éµ^Ê3[ó£|ÓWeÊ™­Îͧ4ZíãÆÞ/^†V×F(ŽE9°8‚¢6tŒ´wƒåI»¾ºÍó£‹îîgFwÅã—š¿H[PÕŒ-µ¶jÑqÄO˜ø¬b2 ’#<9mïßþ.‰_Ôq=‡U•¡<…™övWjŽ'’Àc ŽEó3ÉqÅ!db¼WW¤Àòîüíñ*`ÊÉ”UÉ#Õf NºÀÚÍËâ<~„s ü– `ŒyUèCQ—sv¤8ޝ#Û£™ÒFœ"{âšh”êàíõ`ÜfP[-nR‚ßL×”¶1&ˆ¯'X.#ß D.a³V®™îHü¡>Dƒ<ßú»ð`þ6ëíX´¸Þ©ßƒî ƒx³‘´,|`ÑVÞxz5{W|ùÀ!lÐ÷RIÃó¥Â¬ Úd™Ûh3¼ çw5l‚‘ᡤ6A^ÕQè(”¡YÁª5k=æ8kÚîcÃ98i^åÉïsAÔ0ï|÷rd½ê ‚ÂVÔù{åfŽé+{²<x¯eÔ“¦;µl8¦ÔÀaËn Ù™ÂIr¡ƒšÌ=*lÝâ’X…/þÆ÷öǯEnE5hf/_öៈZÑUŸ¹_2ª°Ý’eHCVtjü@=o•.fvŸÇ‚š3™¹¸?ÏqRÄ ìQПC*Ú|–ÎÖ ¼¼å…)¤Mä¹") éŒY—ã¬%6R)úˈ1ÕÛ\]É Ø:¸äš—•CŠ˜è¶¯¶]S-%U6Ƽ'´t¬mJhŽ^U»}-x[(3Xï)“XêÝBÝÔ–ŸÆJägµ£èwÿËep³^¡^¹CzGáTï×p8Ë2ýÛãBsêàÖÁ M´~+³Np;à vJ½8Ÿãn‘l—ø;¶Ÿ=ñ¬=ä°7ÑÅŸKØÔßWGýÚè2ý,ˆë0Ö.û7êÂu¸\†·(Të­Ú‹6³ŒZ/r¿5Uº¬¬ÀÏSˆii›úâã¸ÎÉÑ:Z0I·1ë†.\Âãå-rò:½Lej2QŠ5ƒžÉ¿ Vþ»p»òø8ØÒM<›?»»k-ž¯V-ÏàcËTgZÔEÁ­@cæäíêI~ވ̉æ6£6[ƒõÌ’-Èbʯ¼è–Ì”Bi–­•ØúñjÂ`ìëâŒZm0q0ŒÕÁ§5OË—æ1))µ»RUÛÚ¯bZ0•ƒ©Ö“kAѤrB Í0¦ic˜³ÉC‘)™Jël~êî¹Gš¼Àžñ—eLX2)yž ‹X Æ¥ÚÈ0+Ò¨ «k`ŸÒ†%¹m4´ÀöPlXƒL“Mž¬v#VäK|ïF,›z¤Œ¬škZÁˆÅ"@9#– ÜŒXÉO´‹}C5bGWWs¿?{F,Óáùç6bq.ø¸šºP #‰[Ió’ƒåd’©¨*c9É3>ø h÷aÄêå˜ÎïLj5Éto(³+m‡­K¯¹wähk2bYŒù÷iÄêšýiŒXdê7ÕÊOLjÕ3}ÔäuD¶ »e¬º+ÓR4íà 4EØ™~†N‰ Q.ðxÚƒm ?}ä¤1Ò‘t:Ø4ìD”ÇaÚçå+i ªÅ9™U2¼bîÇòe¡§eŒkz7–¯8ÞC°|± ä`ùBz;A ²-_ÖIËbF¹`ZÂH-7úÏfû*rTˆ«À͹ r¶„nŠSyëpÍ&2þ™ 2 ˜#fGSê5iBk/„7W»„ Bv(jUtBdˆ f)ó7pG¥ìs.Ãc=Q_ä++M™†=µwÌÖRî¿æ4˜~¿l¦M“q…Û¹ó‚nñžE™HOȶ¹jˆŠõ"¨f&#…òþŽõA>Q E¼.‹ëŒ¸¢Ewk íetYdɤ£¶*ìêwsqË ¹(Q ‹:5ä †£ÃFR Ï·W[·W#Ÿ»EÅÜö1S »™?—vö‹c°ùˆ }/Î~ùõ—_:ç¿üò˵õŸf¹¹?Ã)]¶áì1ów/ÎFá„Í‘Í[ëgwí’­¿8{ýû;óóµƒÜßå!OöUpb‡•Þ½»öÎ's<úîá-w¬Ã—­\o‘g ®ämo†½™Hah8ì|zGb'¼­TõDlÖqV¥BbÂæn&Ïl3i $¶ˆ¶Ø…×\…Ëy)ð­>Ò_\úNQ9Y_¸º6cûÉ¿ý|Ñ~…v>^ª;)úÔ~Ðâ'MRóîêÏYä7÷Œ0†ÛÛtLÿKÿ657î#Ïrqv”ÿ­ß5…äÓ!7D!`ÃN'œí05gú„Ú #]¦c̈bY¢‘taꛌ¶Jy¾”ÚÚ´nÿü”~3öýóêªßüI/eooËÜã*ÑÃs9'Á0üÐãJÞi™+ƒØù¿æQåÏÊÕ8›š½{ÝèYͻמ³óAîÞ²óé¶áŽœÏÓûÁ•8Ïn‚ÈdI/+r ë‘ñj ¹ÞðjÄóÝ/¯Æ+Qöf>9¯VŽpg]“«fŸ)„æ¬W¦Ï”-`§ˆÁC^a€5#WJw8îw‘(ÛPfƒƒ…7 øÐ &ƒ‡¬¿$Xé ˜|á€s±Û¼R|„)Gfª”ÓƒéÃ|œÊANnJz½ ·ßvd ݡ‹?ÔV¾ÈÑî®gKoéͲ½uµó¬8û‰ð½ e£„:ÌpIÒð7eê4ʰUIxp×ÕlV•F«Ÿ= Úª#ã k2 ¼öÖß½]JÏæ'pó”µMiVmfƒá+_ªÅι²#%ËÔg”ùû Á¼ú¬¹(ZL»‹lù*’„æRïÆÍ¨1¾ìr ƒp¼ñ¤Î(³=LÈ©V£0›sj=9YU­ `«zg;«ÊÄÄ8L´=`¦d}F1ÀsÖ;T{…1Bü)Òâ™úìdâú(§\µÙjÕšV𯑧)„ Ä?»êÊ ÍdTmŠ„Ý.bs)¤òTf摲3¸V1‹ìÉêhD… ¸f:CÚ[†P^ÜíöþŠ2BÊÍ6˜ äG~ý3ã0v‡½qgÜ0nW±.B¡˜ñNã7Z¾S«N öñ‹´x†\zÉA.¼VÛóm[‹ý¥¤‰¤ ¯[^¹}ó|ÄO·Êß%,ë‘´¬?Žm=.`”Zp9 K¢±Z}€à÷À nls¼%N¡±ÇfôD6Ÿ¹8ÙB)º^hñgšqÿóWåê5= M-%ñœC Üwy@$ùz ÜqÚ댺Ý^§7†ç]oÌ—€ôÉ÷áË7"Û+àÇ «Z‹1-£––$Úp[Ì-di4ж7ðÛÆö®áØ3£‰NdŒ.CŸr»ñSé ‡€;öɰӃ–À©æ‰ëáD¶:ìâÁT9Õô†Ðâ ªô&‹¬W^¸½ÝŒjÅQ‹…ÔÓ!šÔM":Y®cÏþÐÓ[ *Û»ÓÇ•€àÀ 鎺}ì'ºŠNƒ^Šm)%D”¶ºœHˆàÃwaô ’†¤¥Æc5\&½öJJ…”N"†>ZÇ:ö¬mŒµ?ÄX[†—q’µŠØuã¸f“e$'ïvÎŽœdƒÉf‚g_³q¬úÎf°Q‚|Ë |ÁRŒÇ(=é¦à*p“ïÒŠ>–×k½ÂËKV¥Èzá)g’~ÿÒhŠߌ@>Ž]¯"çîìdÅ'㻜ÎW=»‡il³{îªìžòG>ƒÞbGÒ‘SpÔä{5zì fÜÿÆ÷êÁø^¹úäþHÅ×½Ú‰KñH…Z·ÇlS”Ö)–nø8/ªZ˜\'G¦ª†þÉýa¿+’ÈvX9#G„# 'ãŽ$ô¥a”G(ß¡˜ ü X‘%¸$…$ðc„Åz¶w9ö_)NËi¢N¤Q¸WbR´K9­V‰%¨g¹J„gEýd®µ¡T–ºGHÍz“â§¢ ûhˆl¶†Ës^Í“î¤3ŒFpl6ÓNÇãé›Ýþ°×I”ßýŒ.Ï£lBVúŽâ •qƒJæ`pðÉ!ØÊ¨ àe]{î .‹òf‰R´º”v®ŽY9”ã´s¬cmto€Zò.‰"52§Ò9<Јqɨð“+á+²ÕÝXª°ý§wŸ(CðL…=¿_ŠŠÉïcöš)ò²êܹ¦âöÌ]šRïãßž¹‡ä(DïH•G¦pÇ=”èÚ* ^ž×y0KEzQXÈɵEŽôÌ¢Ò3éU¦ïÂÝXÒƒâäô¯Ù»à9;÷²p7žZÚwÜöPÎñQx»ž$Eω¸ŽŽå™»R‹âަ%âŠbë”±œÃ8YhìhxùöÔÉ,x¢}'ú€}WFÕÑí”–OAÛ¿ÑtØ5ÒÃþDx¨AÓáNW…‚´ ]ýIŒÈÕéj-f'Òv¯÷yU™dŒtÏë§Ø¢cì.!ÞŽ&#d&kªr@©8Èð×qT-á†û¹(.Á9¯‹ÙÇÒ7ƒ¡æÉKZkäÓÕTÝÅü~¨Šê~ÜN$4”⟌͹õ¯%þåí;2,DHSí¡HÕ\æV)íŽúàÅÜ Žk•!)=KóS«Ô²x“’&«F'– R|®²^Ä •ò¡:5ðŸãË×ÒŽK’r†D¾FèDWâ}óÝGŘ×n$-µ›Ê©GÊQ£Sº‚°{ÉÄè•ñ½£wRÒŠxrѨ¢PP]eP…Ã)¯y?¥ÓI6+E1Ь~“‡bõ«¸{ª{=Ü‹ÂéGŠ3'¸gËk4JmV' e©*w%–ÉrÚØeV`Ýã•xL¦+ ov"U~M’7HŸr‘)µ…é<Œ‹¥ExE ív¿—%Œ™¸ïC"Bz>$„v\â· Ü÷À‡Ñáà*Í4…tpH *&TÂ[‡k¢ß!Åär÷œÿ^øþþ¿ÿ_üŒ|zÛ­w§URŸ.>€#»ô_ÒãvÑ÷fi]ÎH-ÚÆ\Äjäô‹³m°Ù·À…/ƒõMkçÿ߃¿ž!m#ÊŠÚT HSŒäŒFð†âè÷©7¢änëëÐèå~GèƒPpÞøáÊßo£ñ\¼{óòú:Xû¿É7í.Ø]ð÷!œ}óç/ÎöۃϬ½ýaë- UG4sûâ¬N{=dºÁb‚dC#ÿ«¤-‹Ì׬p¥Vê¨gîÊ,,êúSo¿;úKv¨¡‹v‘ Y«Ú籊B†2ò øbJ$M'9•ðžð×£ëŠñŸ/ÎbI‰·þÍk;•ªNR…âëùÖ»¥MÙGÙŠÂ4Ž­;q.ëºò¬Ý.¿òݾÂÃ:Oúc¤åN/kf!×5‹#b@Îu¼DÑÐ5éÏWáÜ_šÊfñÝGzJgVìv:©âq‹•NÃëé›áëÞ«A·ÿ²?xû²?AôbÄ^½é »ýÑ+¾ë~Ô–€¥@dEzY#G@­±Ç1Þè `×þìtãÅÙµGqðÔíŸ 6VÛ_SÑ3~Ç'Ù]Scû åÐÂÙzÃ9fѽø/å-€ŸÜi]{¾æs­ ñPôC5>6¡ aÚ¶ø¤‹ªÔ¢ô´xK/oƒù»f Ãm`žñ·[$°?¿ö{¡zÚœwGCäEh±Úl4ÒtÅ]9²M²fõ"Quw<8G,ßyL¦4+¼‘3ê–42]·|‘¬»;:öû½N¿[ÐëÞø|„èhä¿êô‡”‚MjN’ƒÈ(—hW™µ2F1ìÓ¥>íO¦H7`šý<=({¹äÓsd“ëwGö]4ÓsjAߓޠ×dµÜµ–K¶ŒH‚¼ÕBýö©‰úzÝñyg‚klÜl€/Ú«V/’ûw¨É‘<'ÒYk»À´i¡À ø’3¡åìG›hò‹³©ºYÀª´·qŽô'Ázî«›O½î¿p‘ù@îöÄgÄêÜíÃz¢Öסb¤ÿI×ÌÛÛ¬Yùü;Ô<µt™‰°Y1R§]ã P(­}æ\DZº{‚˨>Ѩ'Uµ{ܪ¶v!®©ºmÞ‚EÀœ–ÉF~ÏdÕýººŠRu×Ôí¾¥Û6mÈ1›¤Ï²´¹ûGÛÖF=©ª•ÕËáÔX7I_2ÿÆQǵ༭ݖܥQ5g_¨ao£¢ä” jšmÔ“ªZÌ6I‘¬%–]–æFf‰Ž ËÊY·~Â,oßXŵÐek—ë!̶>×D—­½®‰0Ûº]]¶w»ÂlëvMtÙÚíš³µÛõÐe{·ë!ÌÖn×C—íÝ®‡0Ûº]]¶v».Â,­¾’0œæ’„YÉ(N7´b ^<}¢¸èNFò%^gì.yðßÖé‡Oð­½~ðôÞÖë‡Oî­½~ðÔÞÚëOìm½®‹ÖK§Ä„7ùÝ¥™Xä„,xC‘ax*šëº#ŠŽ™¬QC‘ãzÛšØïSRd‰fÐPä:ÔÕ'ÔŠ4 ENR‰†ûŽßÙuù‰Ø$'­¡–ð< En(rC‘e&ÌÆfX†³¯ÇC¤±&ªeþ¦£õ!6_È´›ïN't¨¶øX´59†J÷üí«m™šÚ¼Þö3Ï ¿9ÅYy\s{3tüN8þËǵ*Çóø/ïc'¿*÷ñåñsû@¿$&›øhÁK.ÂmðŸp½/ŽqH¸ZYäî²SN%#Ô•¢<;V2–蘞ÅÜRÏâNù©gqçÔ‡Ô³¸“–sÏtÀ~.ÈÃ1Û,æQ@èXnÑÝS–ž ‚œˆ¥Cr¦TŪ­Öâ˜Ç,vObÄ1ø“±L=À6€'1â®ìJCŽA4ÆT!ÖžÔŸ÷%ñ¡ŸÔ*?nîë(òõô¸/«ÿ¤6öÓ㾤[úSZåÁÓÓ} žžåqðôt_2ÖçIå§gy<=îKæE;~c«hí\¼#üܺœƒ3îAWÎÑ\]³ýt9+¡·÷váa;‹²"4ýu¸žmý½/òä½A‘ QDåœÜûîÛ”>[“,½ä•S‡d©òâÁS˜þär(˰,™w^ã%§ö«é™Á±Ø_ïE¨ÚI)HâedŠ‘nN§ mPÏÄ• 1#'gë:ܶ.ü-b[wëþÞímRgmT#ÝQlémô9 ¯¯w>\ÈÚêÂÇøùÏ#Æ?Ô©ºÍKwA]ÀèÿyD8=mœ£º .Dtÿ<¢ gA©Ðþ³Þ.ÜøkÌô^@Ö7µùh(šn³^™ØÕÒÓåÐS³#é¬Î©ÙȆ^­önã­ÕÆ“j£®©ÜY622Ÿ÷GÓ.§4TDDGÕj"b’­p‹œ»Q>(‘R8MÇ. ã—*àVŒø*œß‰¯7\ÆÉôÅ‘4øÝŸ_#°7CN`™áôì¿%9j-ýïþ’CðLTCÿuÓOIbe_õ*e”§RºyôŒ'_‡T+2§ôèq£c’mgànË8¹Äh$Uw’Aܺ0T¹ m;i<<ïƃQGd}°[‰®o qlý‡¼™˜{äFm¦\jñâÌ „nk:Êc2Æ#;œpÂØì%±4Á"m´8¬vÂzk4ÖqÙ4ÖÚŸZ1»Ò¥®$C6ªíÄÜ­ “¼åêŽúçÃÉÙÊûƒØŠ)œÁÊÌì­`×¢¤«àvýÖ†2ƒ+¸cVð¯ö•$:\áT)5­«fÎc¦¬4áì+a,zò6(ç1} {ÉÂÊ÷ƶ<Å‚‡¥–£¬í+÷Ö›-ZBfmáíZÁ~× oq¥úûVxÝÚ/üd†Ù6Øìw¿¶¼õ¼\·V‡å>Ø ç·þv×òPA°þ.¿û(³ny±åÿUÕ$÷ —)zý ®ë½¿¼R„ëÒ©6A Õ¦±Èh-c²ÎµëÎG½nüÒÓ#«&ÈdÑ¢·þ¾H)¿â`b’Ã5/›ø'V¯X½ž¿¶®{l*<ôH­îc=HƒþzŽ„ãb'lý™|§_ª²yp4å5Ï#Ün3›Ãî¾ œ#WÜ«¡vk’agœøIç|4X:¹\w\tg:ÜäϽ}} FcÈÁn£™¨D¶VÎ\B·[,DĆó!¼‘f%{0E×€ÛŽßÕwkÉÓsöÀä|0lj«Zo«þ&â^«lƒzº hœ'LFç Du9«¼·xåኪ2ƒùu»9 483AKs‡SÄþº b$²…[ù›"*:p¢¢7]†yùdÔ­ÍqÞêŽûçÁ`ÐïÇ%”èÜ©C$Õ[Üuÿ}¹ [sG Mkîö­³›exå-ÏÔ¢ >ìÜóÖÿxÛ€4¿»ÖÜ¿Ö`¸#äÍfT /[×ÛpÕÂ=Ý QñVÕµkvtÁ^¼½¸xÿ·OÿóòË_þ*îÞ‹·—±gׇõlævç’AôUümha´¦Ck.ŠØƒä×9óÝáù°ßïub7X´XVâ%&^Œ–ÿg°#V•XšùÛZÒ•pÞzݺ ­[o½oíCÁÈÊ¥hßsH&`7WÐÆo±Ƈ¿b¦ýÔ´¢^#U‡êÀÿ³k}WëêÂìbˆÛ|V8=ÆäÖfþéL·ƒi¿;ŠkÿJœµˆXO±€|`®}²¤Á¼f–’ʈÃví[ö®`€~$¤Éáã‡ÖY$œ±¨BGl‚‰5å’Ùì°ZU¬/–ßšOŽqKÖ9ë:ãA/vIºÌ9M·šèÛEPcþ“=§3C³¦y¢‰lNk{íÍè¤aνHV8o].ü»Ö ŠXyVôGªNMZ1©ö‹ÿóáOüb.?žýíͫ׆8™q¤Š¨•q“×8ç½îè¼3™LFqÖ$=ë©kÂØèæ¤Ûvwr7+ R÷î@K‚óÚÛÎ[X¼/ï^Oz½–¿ò‚¥œ}󰈥ZËÅk]þr¾ký¨ûsþ¿–ûÿo– £ÿëfÿ_e‘«H'F.$-•ZÌóÖçm°ò¶w‚Pb h)RRí)¹Å‚T+ƒ´ev KWþÂûÀþÙú‹ÖÊß‚pßü Òºq^KŒþUìVj Ò¨¿Á ½78©‡Q¯äxl‹˜'·}“Ã<•7ëبQ.K3øg5zL˜z¿öXœ`ç ASlªîê¶âº žY&TëR ‹[C#m«-g<4nòÓ6d\ß§mȸ±NÛA¦OÛapkh¬w]¹Í`ØFN§y˜-}•W-96©Tž6eL·ƒ»®;uºÃ|“nŒ€H;áKÀAýgX·qŒ§n‚«q`OÛq`OÛq`OÛq`kk¨`{G×­I¾’³l%ýÁy·Û™ô§×u°… Ï[¢§?;€S>o½ò¼/YÉ…BÎw *"ÕKZ é¤Ã1ô)n MóQÚfxÇÜ­I€Ög¯' Ñ;ÝÁhXÍ|-¨PE« â6ˆa¶é×ÊÅ$ä´ $Ä­!WêkÚ*OBÜšÌ%!ýñô|Ü…Þp—gkA·éúʇ<£Œ´¬LrŽTa½†( ƒä,!ŽkAªu}€!¯5;À^»â­ÙŸ}s¸n #‘dOOcܪ…Ƹ5™Kc: "㉕ ãÌ Æm®çÑ 0§mÈ 0§mÈ 0µ5TžÂ¸5™Ka½Ñù¸ß&íå( Æ<“%)hÜX‹½Ù?›ûkhP%逊ôˆ)É…ÿiBá´EÍu0ƒBIØHñGZt¶k÷qgê$Uàjܪ…â¸5Y@qŽÂÕCìUÈŽÛ8*Ó6dÓ6dÚ*OvÜšÌglzHD·ÈPò=†ƒÌ³óÈ0B 6'¼5ÌqÄËøç7ç&CƒJjl$iŒ;ËÃÖß).¡£.¡1(‹cK9¤¥H}騒ëI4=ÉÝf/G˜)ظ¦ë¸[›#•LÑêAD ZÊ*–Cˆé¬¼%Œ΄Òt­vëú˜.ÙµµTd@3¨ÝÍçhÈLƒþp8™Þ=Àq,!3Ý.|˜i¹ÈD„œfp0…«±ð>$5LB\ˆè‹`v”©HX4Vá܇A ï mQžzˆ²éÙ.|…²íÈ]@˜‡áD@V¬£©“›CzêäÖRêäÖ’ëî7©Ói[2i’cKGëîM*âÖæ(ÏåÌ]Rõæ«`½õ½ù3%4é“ÛröByÆÔÝåÆ/à||4¤\YÊ \Lžh"aJ‡Ã ˆ¬‰=ºòñ’&¸õÁá…0ž/ásO†}ò-‚VGP¢Œ‰"/¼®›×t-'×6sMNÝ®ïñpXù)Å2´ÇÁ5¢•Dl‚ŒQâ ñ¥ô™wñ}5E/7/Ç*ôÇ­¥*ôÇ­¥*ôç´-™¬‹cKXÇ–ja]ÜÚÌe]ܵÑ*ê'ß‹Üņå8œ<þ <ùÖ«ÓàœI×A¨w„?!° ZRP!哼‚Jˆ,섨"`TÀ*݉ˆ)Ò áp;D8¬îXEÔzOjë9BÂ5Ix"‚oK-D)³4ÀdÁVMjý…âÈDx'GJƒvþüZµ ɧì5…çš ]zœ¦rW-Xm…êt7_Ñ*„Ø­¥*„Ø­¥*„ø´-™„ر¥ZŒunmæëŽ1{°Sžä@\•–¦ˆê6G60KæÖhØjLÚ »œGÀ«ý?´óµÐƒÌÎ êúÇïo¿¼¡ô(Ö•Jë€TH¢Á5øP–‘›É„nuصüu¸]…‡HÜaôÐ bGðZ€ÎM˜ ‰O!±+‚{Ø®„ªLØ·7ÒtHŽdÝíº¢¥}kžMö ôK¾¨<À¹ãÀÇ:ì//^è\ê6ÅG1Ö´*œ¶%“¢ž¶%Óïá´-™ï´-™Z:·–*Dȃعï ŠcK8Ç–*p('nÉĨu[§qŠãèr9”£‚ƒ½kèèBsö 1N­ã(êáSeôÔ ³ã gS³—ãRÄ ž€bY %ðíâìÈßSñ­Ò³IÒn[ ;Û·þ ɉ]ì ᯈ-áè|+ .H©Ÿ%ÖöÙ‘ÁR&¸›jRæÖRRæÖRRvÚ–LRæØ’#»câI;¶T‡ÖY{\.Ô\­ý˜BÝ@X‹ÕQå=\‡’§±ïRv4˜:»\ c!BRs£ü-µ è¼õ‰¼©„Šºø¤Õ¤oØ"röÝËo¥tµ›td%ÒŠ³œU‚Ù.%õÝSs¥¤)@˜§)Hƒ| ‹¤‚r˜Ü³¡áyÝbޝ %9¶TAJ:qK&)tÛ6®c2Iái[2ù­Ó¶dHIŽëTEJrs­ÂZ¸µT…µpk© kqÚ–ÌóäØRÖ±¥ZX ·6sY‹ ùXõ(ª.V0¤„°ßäIc=Çáä;@FJç7r’à-D.f»; ÝLƒD#½ ÄÞ<.Õ0ù¯ ²Ö§-rª[‚=¨çœkÿË2øæs!²v…€S¦B$ÛP0¹`\àí½ €önQ¨­hòy"Ù#Ôzn^¤U(™[KU(™[KU(Ùi[2)™cK(™cKµP2·6 \›ŽhÙlC÷O8Æ9¶{ræ8¦|r6„i*ÊŸÎ!eÂ\ÇaÍÔ¥ÞGÒn&@*tŸ Ü€€¸¿¡pØ_áó³„×Ï_S—ðY>ZÔÜÀä.Ma[ÿß>R  iŠ&Ôrr4bÄ~òwR™> ¨A&…ó¸ˆÊ%º×íÝÝ ©ÔÌlÅ„“°¶½ÜymM_7nùмÐÇE”¯B+ÝZªB+ÝZªB+OÛ’I+[ª@+[ª…Vºµ™ÏõQtwo4uÊVÅPð¹q™:%ÇÑ)ÆG“ÑÐ-E¢&dˆ›ãà]‰u¿}ºò÷·„°¿…÷ctßÖfùµï“Ï$˜µ!›ã³€OZ_/$˜Q~ò´<”­çæ$[…丵T…丵T…䜶%“ä8¶Tä8¶T Éqk3_‡} ¥¡p&8žŽŽG*ß×–mÐM@ˆ™iŠ#Ól¨Ì1²ÃÓ_œ)’tßß|ÓÚP ŠÄÉ©¤%Oè½—aLHÂPTHàD’4É^çT8p2œX:V€ts­B¡ÜZªB¡ÜZªB¡NÛ’I¡[ªÅaÀ­Í\‡É1¬Ê2„ Tspƒ£»€=(¯çÖf.‰êOXÛ¥øJ…ål„WœÎ‡¨ ö*‚ A,)¶ ÒÖFfúæßqR Š]!A³µFâ0Í81^­éhp$WäæõY…渵T…渵T…朶%“æ8¶T Íqk³³íU{“÷¯;vi7sH=„Ç­Í|à¶,ü“ag8‰gð,Ü&Ý©•µæoâäƒ N’8üÙ~JG7ßË*ÄÆ­¥*ÄÆ­¥*Äæ´-™ÄƱ¥Zˆ[›uD’3_u:ã6G:“%„¹5š/„!Xo4é%³SgèÆeFpëÝøB›+tUWáüNüÚü·Ôš³§d!ýIàÛ2X¿J­‰xYÒLsST¾\_mŸýw-î’©K†(Ý ¦å ÓÅÔÿ E¹cKH¦cKH¦cKµàµ8¶™×‚ää6ß[M™×…®cïí;go3ñ½Ûö«€Øâ8mÇÑÎmx‹ÌÞúÅc£ÎÂå‹3Ãíɱù1pÈ-Øh-_BL¦i„„¿ƒf ,be¡•t·ó€aæHr‚„˜yW\ã·½P&—EkÙ"!º€[8l60Kˆ¿e«ªÅÏ[*EœÈN¾¿% ½6!5T ™*ŠHú{l oßÍë·°N×6sqïå Ø¿Žƒ©Bnݖʵ%ƒCuÓñF×–ŽÇ¬rl)‡‰kwF4n×ÿÀ7À[¶ÃëkDÜ¿8ãÈDì°hú1§KLÑDuß”ÏôÜwóSÍOõÜ#°Õ1Q+¹l ý¼¢ì¢]·‡¶ã8+xh;¶äêÍlıž¸%ó »í×1™\Ìi[24M'ž=“UqSí¾›3i­cKUD·1¹ÞTæy:mKæyrl©ÂèØR†sǽQ»‡6’~Ý„õyh»'ߥqtÞöR ûå\´¥zXxì!«¡lŽÏ©Ÿ¥KµðôZß_{[¸çàZýkmM!­%48„›áìçW˜¶Âï$ŽLÒ;, HX·¸•ÈQâQFe{÷‰>F Úž0‡¸'­Œ¿Ñwt+ÍÇߘžwFý(?ñ)R”‹Üâ1+Q(ñ‰·‘Wa\ÜZr½äMB{Ú–LB{Ú–LÆå´-™ŒËi[2·–ª0.n‘U·–ª0.n-Ua\ÜZªGwêÖf¾îy>;]7\kRœº¤ŠâÔ±%7¨kit*Tœºu¢ ‹"<û½A<ïüIU¨ñ˜´xlR‘l)ŽÈZ3 ÷AN• Â6г2X¿YÍU˜º¹˜Ö£0ul3Waú㮩-uI{Ú–L†Å±¥ ’¡cK´¥Ž-e“½zµ¥*q¥ƒ¶ÔÑE1O ™ŽÏûƒé¨3í)¬O±Çï(µu°ƒì‰ ø¬xQ»¦ÔmŒU·–ª§mÉ<¿§mÉ8NÛ’)pœ¶%Sàpk©ŠÀáæóWEàpk©ŠÀáÖR•ûð´-™çɱ¥:üÛúnmÖ©ÿ%Mæ]B̃ë6Ç,ÈNn®³—¯.ž÷q¯O ™nTè¼€py€çC2…ˆ BRd„AcIÑÙ@Ù1à"ºÑtÚGBŠkñ€Ðþú Šd1…s#X±GˆBÆ:%™àbªÄm°_ˆTï­³?Ïâè ¢¾)á2\?ç‘ÁnA1þ¶-”‹¤s%•+;Ø ¿vÓ#°vŽ“B`*~‰¬Ù‚'XlÃ5”¹sNRÐÐÿ·ø[8ÃÃ?5ë#<׊BÁûnþ‹Uˆ¦[KUˆ¦[KUˆæi[2‰¦cKµM·6s‰æQˆÈu¾¨D,ÝàH,í!OŽ*?ò ß9ƃIgËÆZ.ò ¢(ȸÌD†0Ì+$u&˜ÀµOp!Þ–°*D~y•­ ©sˆÍAøŽL1ps_¬@[[ª@[[ª@[NÜ’A[\[ªƒ¶8¶YD%Ý©HM\…¼8ŽÁ‘¼dðbŽèz‘m¬7öã‰ËY®#ò‚…ÚF<¦1Š|À9•˜´ÝA¤A$¾ìÙ-9Èáßk€3£å€kk†-¢€¶¼ßrîU•\LñO¿2÷÷'Cåì«•1Ž&—©‰öK¿Ü*«Ð/·–ªÐ/·–ªÐ/·–j±` ÜÚÌ·`áòíô:ÃÎ8–D¥l¶Ö#a¿ mã`\—Ê*ëkÉV̱тD]“óqj© èØ’ÄºÙBäÌ¢œ€!AQøˆ€Ž |QÞç"Ïz"Tç-Jr#ÉÆ È]üþöÇ·ÿxûúï—oÿ"©õ"Ç6ó Ñ1©Ùe„Õ‘W½IŠÜ†âzlMRtÚ–LRtÚ–LRtÚ–LRT[KåV.%êõ¦çÝ^ßMäÂ'ÉœuÀŸ «gè¸ù*æ2õ'ÓópOKZå_‹äœJõÆßÃ{¤”a™ðÖ0³ÂpXÃ)¼ÚyÀàmÿ÷/ï9eá̾ãiÝ}Ç™É1è—I#hDëš4Ëmu"S*`™>0 Ñq&5sëCÅy0¾&«­V[IçÜZru®0éÜi[2Ü\wòX%s²JYºnN’õ°(Žmæ²(cÇõÆýƒsó ]L· ëΗÈvæšÓÛ<õn#ªÂ©œ¶%óŸ¶%óŸ¶%ó×ÖRŽÐTä—ìxä tÕ¸À§ý~ƒ«œªZ\ã^몛ZŸÿ~ùkëËÛ‹¿¸¤+ý··—Î÷y[à;Y2ødÅ„.Òû¬9±àqx]7Ëz–c›¹«й^w0q§X`¡ê Unƒ©B«NÛ’I«NÛ’I«NÛ’I«jk©Vgbœ?ä.%—¡i Û€¶è÷Í6˜s~ ‚u!?ß÷o^œ}ºxI9ËÛ’òÒ;ÀÝø3]àâÝå%¡Œ^àÍ^´ Bœ-C@ˆßávîo_œí·_õ‚ž‹Ve*D?jZÕü.XBÙ|áïeÕû»¯'ü5µ=qví-w>·D˜…‡5P)¤åDÖm붬<ê8—5»Øš9@-öh”ÇÕáºøÝ}q¦F¤lQ„µáfµ!E|4¹¢õ ÀèAT¡ÖÂ9·¬ˆþøzëm×øâk™/¨†p–ò®KoÛ&G®eü)ÉDõ+ŒÉ3ñÍû ×Þãõ›ðv •>VJÎ÷féÍüE¸ŒÖN|'3ÌêI¾ñÉÐÅœÝÅ»7/¯¡Fò“oÚHÒNóçÑí¿ªîC8ûFË'¶„èØ(D[oyA†ªéPGÓHÄíwÔíŒÝ â{ã1ðº£ñt4™D2ñ´sޏŸag2ž°E˜çw" é ©‘?É£½×=Ÿàëqo`:»ßA6;ô'“Ád܇M¹;Ã^δ³Ìër·dÐ:LßfÌÚ»=ž´·>àÅqúòöÝ‹3LËoüþB¼ÖÌ¿(Í}‹f¼]q˜+o÷ ¨½[x¿½ñö‹¶:ôhèÊÿà‚ÅcsÙ^‰ÇŸñôBlÑ/.nlߨ ïï9Uõâìc«ƒÿ?´äº {“ÎX N²w§=”ï´èßµÄ÷\¡ÞfˆFWÓnt›·wþ(gзKlOð]‚€`cíbó˜M›º±%‡aY\c®,Xvmï|œ ÔÇžížZ¸‹ãþ´7dc¯Ü³±Ù0ÓX‹¿"m;uøH4Cí&sþ¼-¾0vÏ&©þ\PUü€„?üØ,*м‚Ý„þ_|Œ O¾p…ˆ¨ÌÛ7øMŸÓ2ñþ»¸#¶¸…î’qòëfy¸ Ö_w€Xžÿ{s#J΃ÎÙÝÚ[—ù€:Ft¢;•tlq½kóeÔÍÃ)8‘^Ž/ή&^¿suå%ö²&ÕÑ´0Ñ'öZ܇ÞsèÙø.q’gë*ÿ²SE: ª ú;¾F|TŒ–ž¶œäI$ZbÉl½[º›vLÒ€Y@:=ÍÈ›‹¯e¹µ0þV™$å= ë¥-ïdš¸—!y&voùÏg.þ·ßÀ Íü×|›Šõ•‡ÚDÃsÕëtW#Ãô?o@zyä€hÞÄŸ˜‹gË666_¥øu«:f§÷FÏ™à‹Úñ’iÑ%K ¤ñôÇç ~&/`p\‘\\ì/ÿÏ+`1Î\\ˆt*—[ßÿnTÜ4QøÝ^ÓƒÙ"XηÐd¤( W ´2?ÐåRU]‰UM”=FC~'h'ç>êCxEùïìc1ÚË÷Y R1Çú7fÔiá³£¹Z¢ºØ ‘Þí‚®E¥ ŠvÄÑ6h­yà%±år‚î}ÇPC:Ÿxb|tù?⹤P6GˆŒ†”'^y;0µòtü“¨—Yö“#¬Cx‚n{Æp^VWò$ñŸR¬òžó]z­hùdÁ‹ý6üFó/0{T&E<2 .Ô†~F `OËm{àßg¬p¸ æÄ!H`Boƒ;ú°ß‹WÿÈ*}#’Ã%tiîÙ5Ú£”²ä ¨Fà|¶7W$'b6©ç|Åc4óIˆ”ðÝÞx0à;Å;»ÌwW9ï<ê®”ZDi–‹w_ä¼ð Œœí›"q””Ì» ‘lE.—–×6x&úÅ×>fÿ¶Ï:ž¾òfßn¶±ç±õ°,­äW¸:8£ j3¾w艹Ŷ0/·u ?ð½ËLäSÜ»|j›½ËË<ò»C¢jP!ОJª:gKã÷OHùü6»˜µáÖ],‡‡Mˆ‡Ì$~ЋÞ,x&(üxÀì.Còþó‘_P˜¸ÉŒù’°‘ø7TÊ<¥æ(P òøg×°ã’× W p&^qYår©l´±s¨Ó_{þê\»Dw?ÿ •9?“æ@˜B`¢Üìøá>dW–dS±çX2ªúåíâÏ®ƒínn‚Ù'aO1ŒOØ‚JÁŸ4ÿî/¿û”dè“y‘ÑØc‰u8p„IEM_,‚k¹CÅO²I¬oä`6¿Xxóð61öפßOLOTôv·o߯/ÿöZ-¼ðÛ’Ë­6ÆÁ˜Iêrô¹0#¸["»ÿEVþKÙ „@¬)²ýFúûÔš¥ßêSðå°ôèçlHÖd{}/²RF m)Ð_-cFžLj{ߟ˜/wàÒ[ßTÊÐõ!Úìæóëp¹ oQ……tßä“›˜û ÿU0K.±uÃhÒpˆ^ š‘8r”\N*8^\-ŒUáík,ß6”‡fÜ,öïqP±õö»Ã;”xç›"&§y÷Tp„2!I ÿ+aÁ»„e†_,î6p)‡eKþ æhE}7À¶}{%²g'*‚ÃÜ u×3¯W_¿DÏüžˆãˆ5û„-Ç5ÊéµNaê]l[þM¤!ãZfÞF,ÍD,°Ü/þulÖí!ʬ§Òn{Š_)l˼pˆ«µœ÷ Ò4;q1‰¿ CåŸ?ó³ö¯"PS•Ar‰¾ª¿¯Â=b]Ô/±øôCî¢6¸W©„?EJå†7€ä:éÝž,£îöK½:ÜíÆ`}Ôˆ}Ò >„„°üRç×xÊ<ɤØÜAAQ5§54ëŽ)Û&üËüË`åñåYÓÇgógww­Åóժ婂¡³Lu¶bÜÏL®`(ýbÙºªù‚µÙŠTã¨r4¥Òc@¬Ÿ…¥‚"‚ýá -å¤,'$>LÒ@;œšùB¼bP ˜¯ÌË-f×.ŠgkX6É:7,Õ†ec¡aÙb‚mòDz•¼îd1byþ€l‘o“05©‹Áôm¢+ßZ‰­ïá À;®Þû>£V[Xú6˜VÒÀуi½4K¶{̸r)éÏ>ò‘r5ýå×_~éœÿòË/ÿÕÖšå¤ÐÓQ/;å³&+™¶à fwp´›ƒÇyýû;óÓµ1`Êá2Þ>Dòö~Nq¬»¶6w™Áb²•k—$,´óˆè£íÛ¬(“ȹï(ªLDÓ°'I>¸ÔÔÚ %9ïRj¼ï6“ÝJêñÒ¼V¬„òö¶3ZZÝ—Öå’Œ%E]–3¦:ÔÊI„“䕯¤ŸfJÊHî*Ä‚°^ jº]Àÿ5åÖŠx“ÎùÁwô߸;ì ‡ã¾`ùª&ÑŠ],Œä7)ËÅ)ÖÖ²-›#uÞÁuœ W¦û~†Haùé]“ú¬G¡C”¸÷©Ù”½h•DfE¥2Ü‹¢ÒÍ–ãf!=5µî*pbÆFÓØÜØ ×ØÜ8 *%Á66·Ææ&xø‡assºÊºÀ)r|ÅÁgcÒ¾Ëâ²EcV°@4ž FÌiã ¢Ô4'Hã òØ“ŸŠ‘‹15„‡¥Hœˆ„/ÎDX½¡áŠ~[݆¹ŽLWD…šFîp¢ ÊŠ‘£f¶éNN£‘’[ ®°vtãíŸÞ<ðŠyMªó"ƒJ¦;CAU*‰²¹ˆëR=Y$Û·°çÄüoÞÊ &ê‰ç@å4|¹Û°`ÂÎÅ¿x­Açj½Ÿ„ÖÐ8J™0YBÚʨ'}êÙsœ‰ÛF~òvu²7õ.Æ$«K…Í _L;±_ü ”#…«‘騗[Q w/ûð‹OH³E;&³UØn‡2ä!ÖŽbºRµ%wD‰ Éô64n¢œà‚¤}º@=RÇ"•‰è°è«þ‘R'’¡3ÙSÊq´¤O.{ÊÕ/t²ö©ñɃ¦&Bë‹ÕcÚ‹¦: ¡3¢ _n&Øìñ˵1}™×v¦©¡0’°ÌEa |v›ƒ¥™Ê^Β݉…Ï+Ï鈟y¿&•×$ƪ•É3!Sâ¤òL°z1e0Šò™è„ fžkd®3‰€¼ƒ£ü%ñ…ÏŸf§Ù’PG]ò– žcnÅŸ6Ì~¡¥㛸Ð\¤Éà>s Ô ¿±vÜ·µ#X úèvø´ec8>tW ,çŸ&.¹’‘Q²OJ¦ ¸haŠ—jV^u;z¦nøg 3¶X¢âÑÆ¦$ÅÇ¥B˜k‹³-€ÌC#ÍÇLÈfú¬'kB6ÅJÅÆe0²µØ–¸y‰ÊÈVÜ•+O.O™0êõH^3˜ô†ƒþÙ®SA¾%ÚG‘߀ƒHÙN¡>(Õ½¹ÿ=@ªÉ̤:cJ©ÓO:“þ ;•1§ÔéG“Qo2L‡ãá¤#ôp †w>íöÇÈtØï#eót*™fS¾/èkÒpR›e×Ô„ÇŒ)å¬llНÑÂÞO›ØÊ´¡wƒ¿ð¾á¶Èp»ÎLƒ›:mµ$ I.¥E櫘[EŽKk ÞïÞpâHÿøÜGrµ ëŒÆ}´ª‰÷锦Yª¦>ôKâôPŽ,ä¹”áàFNN{‰ Ê&ëØl¶Ã:̕ڂ›ð°CÄ<¼5H—aWªJÔ†*ø®Ù=Xê“5‘VÑ´AÉ/™Á 9o›È·§*-7¥Ç#a:§ZpÌ^®/©¥‘|Í^pœêµìv$q.¬²;ˆé0,ZF“²ãAhÓ¡%§ÎÞ°ìˆz*Ÿt"CÌ(@!-KFÏ>xWþRîð@¦à³/å„—Rl’%}eKY ‹S¢Ò»¶LªMŽå/Î<’ñþÚWžù÷5~*º¿ñ3ÑýµÏ¾¾÷×>›}ï¯}QëhŸY‚¦Ùè—¦kÅ÷Ó´òýT–î7å²VÏ\%½t„+›ÇX¨lìÆuD—e6ŽY[ôuDŠÜÆ|ñM¹&Hú†G÷ZÉŠäÅRGM|EÔQ“ ç«atL¶ëèà:jbRZGMÕº†ybòïSÖV—»:–;P°î Pê|'xáxŠÄ‘ÀK;0KU&-‡ qö‰üÃ8üOIf:Ž£@ú2=kbhù‰5bYÀàõAK¸t3¦äÔqcÚ ã[…çy|© ¿îáŽß%öQ›I}i€ §#& Yá=ƒ–Ê–Wõ»ÌšjÃùhM^z ™É=Ü,óÅT*¼Z晊Á‡Çó•g;Ë.$„|A[Ì®géJ b¹jÆc& Í7?ÙÐÞ¢ý!Vw¡“¬•ÝZsoïíÂÃv曄 Ölë#Ï Ñ\$<ñ.DqQƒÑWü›vß;á6ÂWj鮼þèe{·ñg)šx7x!é¢(ˆ£è¯ø-‚G#í$5KÏÙç)XÂú¥fªfñæÂß˪Yr`ò©‘;˜d‹{—:!©¦ìµ¬ÛÖmYyÔq.kvduŽôd{­|ýæßIe,w¿»/Τ±k³p%`CVÞ†.=ÂOo2B«Š,ƒ‚‡Û¯·žÈ7ö5ýÉǃHhg|©Ó©k]ÜËXVð9ê16Ìé¨Ycžc±±z©M‘T¬ãöè‹Öä2êxK{¬ÅMäÑEsé ó¶{öþë_ÿüúõåföÀ» f_¿ŠGçëÕÕ^–z&z¶{†t0ûˆ(øÀÞ6ÛwvçûàúZÔ=gks%¿aZÜË4[áÃÀ[‰û¼¸Þ©ß0–w&“Þˆ¯ÕÙŸ}Û´i0ÏÆ=£GWÀN Ä0ïkÎm|îň¨)ù€×í5–¨^ý(3¼,úál,ç€È7v‰\ò—â^áÀIó“xú»À¿DÕŸ¨¹Ž~¬)šCQ\!û3Rê3»)’ôŒÖ¥±˜Ç*«.Ø&Ä})éj<‚ÛEÅfHG&•2;•Í-qøÆ.½¨»…jBÓ¡¸b¦½füºI†Œècìð÷cÉ’^ B÷`sɳ*çgÍkÒ5NdøÈM€æjw‡¬Xk’3aËð Ð{—•‡Oqï²PÙìÝœ|Ç’üêÄ0–³r8{ó‘÷ðs‡=Ûÿÿlœø†/®#á®Ï'ý!yÞõƃÑ DcÞsö¼³¿žwï”ç³}Dhó(0ß=Í.ÎI÷#Õ]œ‰`«àS$Ä|5[8’MDQÆÐ 2áMëÀïlžÌ#*¹zâüÒ”¨ÝeÈ'¹sùÚivn1®Ãƒg!F,…>EúË7O³‹‹4?h2Ì2èÜÀòj6p ƒæ0ÁBÚϺm°qm—#Žx¡-ì¢?¢D~NEf^[v×0“÷L:õLaï)'kš°¹0Ð28Ôòñ s«Æ¦ ‘TµÛÉÑÓ`ɵcŸ‰[hÿ’…ᛜûðp³`Ò7ßß|€å|wÞà¿•~/d ~y Eÿ~Ðd>Ë %qɹ® C€¬r¹”™œc£s¯½ s@èΖ ý‰ŸS…´ˆq~ØA.öáf'Á ™µ©½ù\æeúà7l Ÿ(FÖoòºÁðëϸÑâxñÉ‚;!"7ˆ 1à ðOºÎÎç¦SÄÅ;Êó-žµ‡ÒW<„"œo% ‡S#3Ë>„Yžßˆü´ôCÒrétlÜþõ94g¹LáÕ\˜£%‡)‰< Ȳ‡ YVl´j@Ëd½ˆð%¶ž¸JÄÎG8Æš™A ÏF³³ö/À8ƒhJ¶qÀF1Á¯j!ät¹Æjæ6z‹tT·ï×—{­˜uá&YtÅÌ î·áÙü­«8v_º•5¹xžÍ·ž¹‡‘‹÷t(g™ù ~&”3ÓK0oÆl[ýÀíl½l€Ûó€ÛÇ9)£%ÏÜÀ¼AÈJàêêH/'!Î š|xV}K&O­Œ3^k¦0áK%W' N”Z8v&bøwðön½CÀ±éâ™ÔÕæG×¥°å¡¸øŸDõšä€ù÷•·ó¾®e®â‡Ä’G2AdBIÊ„”x«·Í—ÃÒ7X}ýœ-=Éšl¯¯ÜVöbë;iQÊ}‚ÇGŒˆTÔ4Ù¾›lß?&Û· …-N?ª3ÁXìbÂ_%Ñ~?¹ Z¦…"×Óèpö”V]ù#²ýóð(.Œ*æ‘;9ÿEÎãüW, KÌÄg¹| õÔ鯦ÆîÆ:AÁú%LÝÝX¹¬Ãq”н_u*í|—Å…‹æV²ä§üÝ_~÷÷]ÿä#ÎÖ0ª4·Rs+¥\Ÿ Óm­Çì *Õ2TíÛ^¶ö䎿ðI£·ëéNf~±Âfâ ç0»£c9ɘ‡è¬yªž$o_W¦·.cðát¸´,[8KNÇÀäUc$¦°óWOö÷ŒŠê€úxy؇_|Âs,Ú1™ÜuF¶Û¡ y(JHÇ)÷ ˆD”Åì8Á³˜ÓöéõH‹”Êr lPÿ2Xùä—äq §E_ýñÙüÙÝ]kñ|µjyyl±¥:›„Æ­Q ‰LÃ÷0S£’C¢¶’"áPúæ…–êE#uJ”Ÿ”hÄn÷@…§EÏôËíóI©ß/—ÕO_n®_nNdyòßH™ðÍÕD¡‘: Ô™'ïÙÍ:~ÄUa ¥Û©ìê,9ž˜7Ȉcˆß¯Émâè<·l*ŸDe0’IJ<ÎÈ$òsq ‡Šµ@…,·9ãÓ5k#êaª³ëÚ‰8?°øÓ†ÝÂ/"Ȗ蛸ÜlÏP^¥<ÍEˆ¡R9)`Ãzj\ÿÖ,1"ÖD'7ÑÉÑcôlm‚.€˜‡SRo"‹)‡•"e_,øÀ„Œû™‚-‰úb1Çœ0+âñt¶äp“ˆyh¬È1+²HÏIKõ”åyÓ•Tv0ÇHvH]È cXâ&*ƒL_˸7!¡´ŽÒ&ŒzýR( &½á ?H%²)—hE~“©'¡?(Õ½¹ÿ=@ÚªíÍ%( ·Âg޹ŽtÎǔء;žt&}$Ô”1'vèG“Qo2L‡ãá®M:6ç|Úí1é°ßŸ`8S!zÇ£u úš´ÔfhÓÇÄ¥…tÙÚ,°:Í­[z7ø ï{n®3ÓäÌÖN[-~ŒuX°Ø8•å[5¬5Pïwo8I›?w©yqKfaQóG«š8¸³¼ª)–·+œ@º&{‰ Ê&ëØ’K^Ö¡¡Èb#ã»ÇNÙ–%TWµàƒÂéj›pŸÂµÊ Gàgó%½ÀóA ¨ q‡ïaù_ï9›H¼ªM?:w¥LôÆ¢DS:fUàb¥Êõ%¹ddPf/È™xcº{ÁnGRçÂ*»I‹KNÊŽ§×-; Þ°ìˆz“ôˆDêmZÉëXÖŒÖñƒwå/åd²ðŒµìsî#±M–ôYÛ’‘°Î‰ZïÚðÙNçä^ŽmI>õ3²A³U0¼¾FR•[T¼BÒäýBxÈGyKkŸî­ý»ÛÞ_û<Å÷׾Џ§õï±”tãgª{íó-{ísØkí[¨š‚iÊVâŠ0Y«pE•%ýM¹¬å3—I¯yå2ÃÔ…D÷4¥[ŽESé ‰*|·êBâ[}MlP„$¯¶²5ñÕRCMò’¨£&&÷uÔÄ„»Žš˜×Q“ Z¬¾v=&‹uô‰ \¼¦¬½.·µ£§Í/øwFÑAoý£û¦ò‚ëÆ uaÑÁ»CL«ðPoãÒœ½–bÜ24¦fÌ— 22td*äLÌaÑ!‹‡÷I0«,”ðúPò$ƹ Áw¹C +ÍÆØ—4å¡O«‚X#÷o„o9–õˆÝ¤>-»qÕÊ–?f8‡VqBstq_°”Ì¿KZËÂ1*õ¡©–r·Í?C*«²¾ .fW(-}”wÓÈËŒñ‰ñR(vÄE(Ås‹÷æåõµáCÔî1‰+¯©Ñ2)œ‚ºl‘ß+¯ {‰lMMw¤c]T‡¥;³¢—±9²Ì(> É£ JÉÏWáÜ_šn¬â»ô3FÓÀx_Ó¿ó–x-)ዳiÿõ«Qò¶ójÚë º¯:^ÿíÛ×o;ò?®à°jGn—;%Óã(³³äh”–TN¿áú»ö÷` Px×HÝHwÎïÄœÝlƒyj„¿á¡`8#n­¢3’üVph§.óëE0‡]äB‰‡\´£Ó&‰¦¯f¤ß¢*uwH­Ž·ôéEöØ6¬Ñy¾‘ó·[…€ùü:ØsÜ;?U[Œ†öS×EG_n1yê®kÓÈÉñO’'!s‘¨M§6š Zc °ŒÑàXSŸ3zt™mS3m<æã,æºùæç™Ú[´?Äê.Âmð`ÅyÐô•ÛZsoïíÂÃvf¦ÿ½_4ÛúC!:‰ïB·5}Å¿©1¦ìá6 'Ð:åïWzÙÞmüYŠŽ]àÍ^HZ& âÀhå"ýØ% (ò†¥r¢fxé"lêÈTͰâÍ…¿—U3ÇÏ$O#oD$˜z‡–¥ër¯eݶnËÊ£ŽsY³ë …s€JíµÚô›'Õ¨Ü üî¾8Ó€Sj ‘41 Wöcåm6fêŸOoB§ŠÍÕ ·_o=‘âkú“‘”ÎøRÇ%ª«XÜ¥XÖ;Âü‰ y5æ9Û `‘´}G*ÅAñûе£ dÔñ–öX[¢’l<º.ýŒb{`ÝþãŸÿú×?¿~}¹ÙàJ÷n‚ÙׯâÑùzuµ—¥ž‰žížm¶á>¢ ~xÁ²-8µó}p}-æzΆ6æJ}Át¸7ž23 >¼Xl_\ïÔoX¹;“IoÄ×àláϾíHº4˜M;WáG="ÿ;îÂRs^ãó.FCMÉÇ@«n¯±<íðêß@ˆá%Ñg‹`9ßút{Ïß¿yqöéB.÷Kq§p¶ùI¼ý݇‹‹“ï_¢êOÔÙbMÑ Šâ˜öâìâ°ÚQõ±Rf/%c«Gd4&ˆ LŸÉ¸³ ¿$Ï{2û°Õv¬ƒÕaõ»6ï½_ÃØ• ÔÆ¢¹AÃÍ©#Ӌ˃d+{dLƒ%IŽ}&êÊ«Yj’tÔ˜ðx¦ygÓL©°E¾¦Â «\.UTª Ö/æXÓ×Þ†¿Id‡Ò?üÒ¶+ÈÅ>ÜHo¸}8³6{.SW|ð¿ûÔa«Ü"Ð'Ü3`–O1ŒX›õMÌHÒ¤¾1ÂB#µÿÕ$dþŠys6©oXpgÛ`#ɳ&jŒMþÂ|òw›¼ öê§p¼R¾š7þ«­ï}{åQÐQ€s’̤_î6Þ ®Ñ÷ßaêç¸~éê:Ÿ›ÞïP ÔX5Ö@5<›ŠiÂ7 á@Bø,جp½"àz ÝôU–XéÊßò—_ù¥sþË/¿üW[ÿÉŽÿÑ“³Á~m¸»Î|ãÑ®ç®çh–%ÏܤøJƒ­ë¼NOœMŒÖç(³qwØÇ}aæ‰ã‰1y1Ü›ð¥’Pøiu%_ƒ±3ü;¸z·(i‡©ÄMêjó#„ëRØF:ËŸHõ*c)á-ÿÍG¾Õÿ¾‚W&…],‚kyk‹ŸPë@!Áh¦s!ðÇekBh­`ŽÞ"µëíûõåß^ó÷ßàj§+òG iÒz‹Ï£D&”¤RŠÀ~oõ¶ùrXúF½ú9[z2Õ[Æë+d¥•½Øz³oºßÐÒ{û¢1¾w¿;¼Ã‚½køÞÀ÷:RX‡DS»˜0÷ÇÐï‡ ×aA˪ƒ/¡F‡ÓèpNs—5w8¦¿ \EÞ ˆåÌüÇ£@_¹A`Ëbô-Ãæÿl£~h—â¢4¢•—ŠC =øÔ'qᢹ•,‰%oÆ„0c ‹‰…×ÜJ?öV*…Ï%ñû+àm%—p³ ÖKè:D`?u«¸¢ßVÅ‚L¿ ”žüè„gžrGýÁí%]F ±ÞÌäµöŒ„ÉÚ#ó,„y *jfÚ^ ŸUT;b.U^1>õPÀ<·o·Þ&æÃð6ñ„s r½\nØX± ÁØ ½Öp,â…Þσ-`.T¼vâüˆ½ÙB ¢ˆ¯ØH"ü6ý¹¥V~¯k’ˆ+o{C±rÄ[¯°!Ð(- r¢¸U½6ÖYÈH p\>êâÀ"jÜuîÛ]Çv¢Szu3Ïh“’šh†-Õ±)©%¾›9 i©©µʹ·bÝ(×çd¾”!ZlRX™)¬pϨ`Rh¸¬Ú‡ç‡šå’ÜZ•s(wΧõYIe¯%ïK×c½¾“É‹2ÓW—…ÄÕˆk¥kNrìfnàKÅb£b¡›)¸áË,Uϼ¬bS’߆b‡+|©PáÞ¯¼¶ë]–.Õz ,NƒÃÕOº\˸-‹—‡+êAÙ¼AÂwW6̬Tr–­õ˜­m‰ÍD‡²ñÂÅ•åÞ…¡@O$Ýá>¬gÇef+l&ž&¸;:&SƒyP£ÎSõ¤OÛü®–=722N&ÎZv ÉÞÎ’Óñ7`¬K…Í _:õU=9Û±¶ŠBò†Ø#)’ˆCJe›ŠåçɦˆÀ›¡§/ûð‹O`ŽE;&V™b-£  ¯#Ÿ¼"å;Nð̉\ ®©óQH&Ym¤Îº¥NVÑHÿ٥Θ¿ïìÌôõìøÁsè¬^ÿþÎluíC#|—Xá ÌOùÃÉ ú«ð°Ã¶kk ^^½†'éÔÚÞ z³»g55†G€«xGTŒtsB1ªê‘äõÇJ9‘åI2ÕH1©S…Æ7÷¨Ôŧ•:3%ÉLcƒ%¾âˆœ/ƒµ›,íTâ%geæ}ÖuF\Ôû5yÀ–Tåsž ×Í{Äñ‘-創@…Ü´9ãÓ5Ûcêaª³ëÚ §b†½Ú°[ø…– oâ2¹=¯xa”rNÄ…ñ1T*'…Luxôþe°òÉ%Þc0‹«ÄÇgógww­Åóժ凪Lu¶+”[#ø€LŸËa¦1/Õh¢6[ƒ…ô$7>YæÉ„VË÷=[c9„ °a¢Æ‡Ê1ä:Ê‚N~Œž­MÐÅA*UI`„˜.—K…öü(GÕÓÇ‚LeÝ¥Êë%¦1´]¢ï‘+%€Š²ÞÛ;£ÖR’7«I‘—NÉÓ& ÓöÞ‘2Ó×fKÎ7‰x¿FžÉóz©ž²•H=î~¦°UÛl¬d_îOáZ¥ï…#ð‹3úVzçƒPAb옛—ù¡);žnT'­s¾‹É9³j/×—äÒâµä´¹±(Ø cwGRçÂ*»ƒ˜CÆ3꜔O¯[v@½aÙé”Ò ´b‘—mù¶5£g¼+)·x r}Û×rÂk)¶É’>k[h#{¢Ö»vʽÛ ¡w|êgÙÄ8¾;{:W)½B†ãýBxÈG KkŸ©ÌýµÏ\ú½µ4ä÷Û>/ñýŸ Ä÷×>[†ï¯}6¼ß_û|ëÔÑ>‘²U³Q0MÙJ\QÓÊWTYÒß”ËZ>s™ôÚ‘ '¹@*Íä…D÷_°¾SÜØ$Tá{¼Uß–kbƒ"pzyµ•­I¢$×P_5ôI’û:jbÂ]GML‚먉‰i51Y¬£&&pñš²öºÜÖvŽ^óïŒ\݉äÈÓúG­|i#¯¶‚C7¡ÊÄYVˆÅI:˜ÇÕÒô¢Kñ@Ú.cjÆ| Bx'2td*äbÐùÔQ‹Í•Ãû$˜UJx}ñ–à’# ÈÜ(…®j•]¾ybˆiŽr°¶£¤ê#œbÔ§e7®ðœvØèB'å8µÃ݇Ó¼tÕ3•{¸/øLòÝT*ÐZ¦ŠáP©EHµ<å6ÿ Ù…´¬_èRܪ#Š}UÃMLò5µ])E²ÍpSŒÝ(H®¹>ÏÝ>JF/’Ý«yL° —BÛ%¸™œÞ"ܾyy}m8Vµ{|g—W_iAžRÝ:Ðô½R_ÙK$ÕWR1¯Ó~_»'ªKG•c'¶q,v,1p‚Ôîi¥’Ÿ¯àN»4ø*ž°ôTz¾²VéïkúwÞ¯åõðâlúº7}ûæÕÛΫ—“i÷õ¨Óé½|ùöõ;†íìÈ‹å°jG¾¨ÜeöÊ#XáH›ÜÞ"\Å|ÅKéWÚÆ0ص¿»0Ýwo¤Ö?Š“¿ö–;ŸÉ›m0Oð7<” g¤&c®Â…ƒ&õOÙ7îóB$)Ñ…x|ú!•쫼·¨€p¦*uwàÅL·½¼ æ{lVs!é•íÃÓy-‰ùü:Ø3?ívχÃét:'Ãi¬( µ©Û˜"r%Ää+¢M3EÞ”’æ A–ôcm:µ´ˆ|#Ñ’KØíkˆwbù}N“"=¾ÔJ¹*±6Í7kdlƒ<}zMƒc]S–Rû@ÞhO‰±Ð)ëÊnǹ·÷váa;3ó0_‚Am}8em†w¦w!Ѝ\KO8Œò^ “.tWQ¬’b‰b>e½&i%7jJÖ¨Z¶xÁ½¸øûÇ¿¼ü«tûŸ.>D6½7â  [Vn{À ¶ü×7Ÿí -ÌìõGYáž@Þýþ›fKoÂÎ_p½çß½å!ZÝö…¿gXýÙŠ;…¸“½ìÌ-7`¹´eÓ¨ÙCÙŒü›A$-9r;a¹-1‹Ñ ¯iÉŒÊj™òù»Ã’Åü-Ýgä^òž¿óâ SˆB”f‡âú°Ä!Xz7˜98’³<0^§19£iò&=§;N‡_Ë®Mó,ĺhN‹î´uëóU~ª­/oˆ¢­ÿÊeë ^вì¹[Ÿ ?xë -N¥­¯øÞÇ»õy=È­/óºˆê÷ø”mý×.[_×­/o´¼÷¥QYÞÇ}Kòx÷¾ŒÙ|ˆdŸ̧"ûR»P´÷߸ì}¡§rÞû|ýà½/ýõ*ì}¥”{¼{_ ßçÞ'&(’˜K"…uGávop /…¸Û“ü ½lï6þ,¥)¹À› ¼ÚQÐ!Äo¹¹sP³ôœwo°„ŽÜoªf8h •½¬ÚŒ×€‡¬È¡£K½CËB—¢¸,®ÛÖmYyÔqî‡Ùu([æÁ ñ)J÷Ù@z¯0ûŠßÝgJ[¬é¶gáJ -"EùÆÌ¸úéÂAÔ½N¸ý*™ÿ¯éOÒÒ kŒlGY²Ý¯CÌ<à„öþÒ!@ÞgÎ[³`3]‚Ä ."™qbÓ£×BÍ¡¨£)wE²¦Ã&û€ýKC“ ëã½ZFnVŽŸšcéA9•nÉ,`î%I±RÉOX<)ç•Ï4¹€”së‘‚¸¬¸ÇbˆÜ2Ê/M€©êIç"Z†‹„Ï\1TŽ’ ‰eûb±¯–Þú›ÚØ‹²¶ VÈ–%ûuqØl–>íso)kE…ËHǪ‹¯kè‰lý5ÉãGLÑ'aVRÜ'"eéýÆ”U>ý€f'Cnw>ÈÒ©TÞ©Õr$Y¹äx/JdÉ Éé±dI¾Ëäl:h€æ ‘ºzò«âCSHtŸÖAŽë«äHLt9È ­d™YZ¬rrüÎnÝÈÃæFκ5üü²9ÈŽ¬u\»Yý G2¯ËANèXËd>wŠa±ÝÈñ;»ð šƒüpò›§~‰·J×Ìš+WÁ¼âQÂ]ˆý‡N¯q8b€¼0ï³ÅðêéË;Ö*üÉʺ˜IòâÝ[²Ç¶¥oÀÆ#çKAñÙwÏþñÏýëŸ_¿¾$ùê£w̾~Î׫«½,õLôl÷l³ ÷!`ìðà –í‹Ãjw¾®¯…¢bÎÁìªSæörè9fŠ,il2fŒtv¹Þ©ßÌíL&½«wg ömwXaÔƒÞ|0Iíœ+v"!Kæ¬Æg]Œ…š’‘`·½Æâ´Ã«#©/ˆ~8[Ë9ik«° íWÍ©oâ5è?\\˜{ÿå>Q{ÄàÄÚ¢Œ™N?/½`MõÇŠ™ýDš•%ò¬è1­ ƒ<â5y°RË¥ ¶ LP:Ôêü”ÞC4›…[LO^Ç¢²¹Å"—9c“_±Ý‡Nò{†¤Zl^q ìè{éáu%4„íX¤òIQ«8Qn,V²"™ç› Á?Ž÷õ* á2À¿ÊLù[ñ¾÷6H¶rØsœÛ¿CJ’"¾QÖíÜ<×™!æ“þ‚Ì{ãÁh€?ò~ç sû;džñN™£‹ 7”¥&=äÏü¢Ýeˆ·çÈð²^OôƒiÀ.\êâÒÒI@Vʤ•ç”ÿ†Ð2ëxå@>:vÙV…ÝqÔÜbÒåkxn>`Ù[8Góï]6;<ŽËnºÍÞÍA‹‘äWcÞ>X ÌŽvÙ»˜wùOHÇLtŸü.–ámVÀDéþÀ 1û}>AB,+:Î-ñ‘X‡×xU85}±®÷jvð“Rí­oø¡×]ˆü‰±#4†Ø»zõDEo‘Jýöýúòo¯Õ‹ˆ@¹ÜjcŒ™¼Fè\ôyÐîÏ„¶ŸµÇíɯ¡žWÙ»¾é)ÅñöX9ÎÈúæ Ò±Æ@hŒç×árÞ¢ ( ³œSLnbn4€ûl0K.±uÃhÒpˆ^ š‘8rs­Ç‹«…µ*¼%¸šž_N}4š8ÿhx~'8r¾/¼9œú™Ž±£ÿŸ?ó³öP≅0E²ÐNÀ›êï«p¿a——q~ L ãhe½¢ îU}¸IYÈLG€'àäØê‘oêÈŸZ&¡Q“)ÅRåäW•‹(öA“!‰€nLÆå®;|„üsó5<[Œ=$ö4ò˜HnËÛØåhpú9;v$k²½ÖXQ>j Mßðl ÏÆ‰ÉYæ{<[É|€²˜5RéíŸWIUd¾ò kK©dºXÅs)I\$N¼Tcžh 5Ãõ6y¢µÈSäåøLv«É)Ë)¥1»œ„8¥dx˜VVÊ8c»ˆ{¾rRc¤Aª/G´‹Mä|…-{4°?ü;x{·ãË´&åŠ|`㺶‘Î’¸øŸDõšTi= 5j¤Ç½OFYö¢ÑU Ĺ&•¨´Ü‹®Ò‘ÂæÄ|D`¿Œéøu813c“庱»±Q¯±»ql`{#-ª§Ñá< Žã]–cPŠ èü].2íæétU »Þ7–v!i¼AT·Ü‘F¶±,4Þ BCÆ  «ŽÉÎân³fã^ý‰2øÕž6¯¶¾÷í•xTY@Ë”¥;Ó®¤_îÈÎüž\åþ@"ÑO0uq3)ëá¤ó0, ä–$ÑRÑÈfº™|E+ J²›eôôíÚz¿H.d¨¸¢ßVçw®#3Þ^åÒ&?:ᙧ´“*A‡tSð•¬aéÚ£äË™¶3-2ÛuVUØ6b.•íFl!õPd§mßbŸÇ´Œ@˜‹}#¨œÆo †X˜ëe¸AJÙB¯5œéžèý<ØêBÀeÀkg!žÁØ›-¢¨øŠ$ÂÝÓŸ[jå÷º&™·måmošú¢Ò%üêï·¼ã9@«µ­³‘÷’|ls°@¤sF˜v#‡]Nlr,ËsWµq×Á”Ûl‚¤ÝööDŪ”4_‘:Md]˲ X®ÆÆBjðáHwEË”m!e«—j,¤Ömlš”3÷zν•ê<–+iÌJª‰Bc%ýs(ü‚ƒÆÕ}µSŒtn ø8 hèÚf-²/Õj%•”Yò>¿ûxtÉY¯ïèª'2ñ}ûxÁ=oÉZd\÷æý {QPs’Û`ÁÂÀ—ŠaÅ"èÓÉsc°T@”ˆ.«Ø”ä·¡VÁí\*\¸÷+0pÀu¤–Jµƒ‹Ó‘`EµE㈀ZÆm²ÞrÜyuG= å'|ý"˜&ÁÔ)°™ðS¶f­Çh]Kܳì·ÂÅíË Ÿ¸ DÕ1óHšÚq¼ý ›QÛ䕇¨ª9&pW´1=žv¦,¨'}ÚjÚsæ~Oœµì’½)œ%§ã¯ãœ›ÁL;±_üïí WÃn)ª¨æåa"ýüIŠvLf3ª°ÝeÈC¬ yˆn„TmÉ¥*q!ÙÏ®L>›‡'„l؉HJ1ƒ*­EoXÞiô‡‰:qIɶ;]ÄNvå¨_ì”ÉÀÇÜðd"¾òA“©F쌉š(4bç;3oîL{€E}x„†2%x¥¬–v*û:K–Gaïþÿí]YsÛÆš}Ÿ_¡r^fª.m‚;=婲,ÙÑ”ìë1•ÉM^T ŠˆIBEv4¿~¾­Ý@c!„Z‡{-¢Ñ;º¿õò¨+ÇV"Ó\¬1¿åCwñæÞ×nåGCš9{;ŸÅ[‚ˆ’^|M¿`Ë'wŸõ˜àî/ч¯L =F÷%6Ýb47ñËî¢8D¿½ù§€û¯ï…™(夳Ú,Áø´$Ìæˆz¤êüºbg`Pú§ ¼…h+ñŽ­”—™Dò$Ð28ÀÆåqdÙ³8‡ ÀuE(L5¶UxjÙyØÄ¶6±­Ï.¶µI»h bž~ºq®ågÎò#L7v¸£ì¬ãAQÄÂ_çM.€7I„‡F¡·zí=yÎ ½ -F¤›æ$ÑÒJºúÜ‹íÂ2_i©¡% .E^ìA§Û›Þ¨ÓïuÇ=±"›q…ö¡ÈDD2m0 TêÞ,øsU.½ÎÉu¼á¨=êö¼±hÄL®ãõ£AgÔïûÃþ¨Má7þk"×{Ý! dÜïvG0œ±Í©áõ5í=©Í½«X1>ÆòeVsò²÷¥>7{Ç4ΧúSäçÕ»!XøßÂhSæ½²®3Ó«D¡³§®ZÒÞ¤=âJË|XVlE‹:‡&¨‹øŒIÚ‚Ù^#5=»2»¥u&ã>ØÖĶ‹ê¶¦.˜”­Éóè$—÷•5Ê]â¬Mα¹ˆuø,µ?8 á>­0o Ö•úO€‚ðj™€Ÿ¢5Ç‹ó¾$4¶¦ ¢`w1ë-P‘cø/räiCǧ sæu˜ÀÓ…°›Ír—ëÊqÉv‚(sdv5.RPÐc6Â*%{–£¨ÎQÕñt¼ªêô«Ž¨3ÊŽw -J°›^3\ÇKÿ&XʃµòZÒ6Yâk-‡5™7›Yë}‹—ñ„ß¼@ Iþê!nM³@Fó9À1+n8zÔú‰#/èÈbÏöÙóx¼ö9Óâxí³‰ñhí÷:éxíó-s¼öU†Ä‘ö?S=qüì|®cþ§šëÓ'[…+jôÃWTÕ£¿)—·|æ2éµÃ<“ iœ¹PH×óÈ¿WVxOÕ…Ä"ÅÅ ÌÕRµ&¾Zê¨IÒñjè“`7ÿxMrp×0ºÁuÔći5ñ±XGM|ÀÙ5åíuÙÖn‰7?Éï©´·Âpx¯M¡ØÐƒCP¬#¤n‡î`òtØêä--‚ŠVR!ŽwФ#×"g¡çc+Žè 0*Ë_°÷ó€Âëƒ"˜s…ïò}r]÷û>ïÇ^Þì^JÅŠQÞæa»I½jÄdÓ'¬¼Mnªby ·Ý<«sØx´­Ø +÷áÆàMηS¥dk!ö`~ )Òð¿ ÔH–6¥U$¥J°JÛ§óÅìÊ+ sO¸×™J^ZH݉WdÚ¡«P¸Ø«ÄñÁ[ÝV£µRˆ ˨ÃVã.‘o«é·µQ2‰ Â>éÓš#Ç¡iæ¿Ûkk-å*šK3Þ†Þûˆ¿ÂŒá40æã/küÿÙ =–£ðÍ‹q÷Ýé ;´OÇN¯Ói·;Ýóówçmù+Ø­Z ‚Y¬4_ü9a°~¶™“'”²·¾…q‰¿Œ¹/·bâNÒÂù õvÎ2#ü?Ê£)nQÖÜ Sp¸B“2öÝ ‚EáOÞÔ aÐeøý#—lkîz<¢±ÀÍeX£î ¦­ÁS| #[Ø5lÒЧ`l6˜Þfý>·œú画Gö¤ëÂ/_.;šy9eÑ x•ç]aO–ŸÕ<à˜¯&!få¥k†ÙNäTsøÞåƒû©r í]^³fï Ž‹b+0‡{³”‘¿‹Y­›úÀîx³Û²;þÑÜè­¬G›“Üœ¿ÜH¸Q·±paoЃ°÷Ñͱpîg —óLűü‡ÐxE»˜W¯ÙÅåXÃü æ-úb^ºf —%ÆY(-¹¨£u`Ÿˆ˜'Ló"Õ£ä—=‰ZÞˆuÕç¸sÅɱjse au8Ž–zø Ÿ†œèl+‘Ø^Ì1ë`€JxtŽouUávÇš[¬º'nó"L˜‡/B°*ó w±¨¯Ïþü• ç.A˜RŒê1ÌúÌsÜÀ¬Ã6¸€ŒR|©z³*óT7° )ö¦%Øî@0¨>U`Z ç ãï§Ó59vE„OtöXNßTÕ*\‡«Ýêgíî»Xƒó+/g"›`€rPA¹Z{°fvØ>ì¼XŒipй¹g¢.ÖÌJ“TdñD¸6•Š£¼ŠÊ—ós°ülÁkù)‹ÈðÈ郩gú¥†Ø¦!¶|é¯ow Íx-—ÑwØO ±MCln E â”8ì_™¬Žôq‹‰YòØ(Ƹ,úWbs%ês63£#&ïýüÙ§ßZœMúz!œ¥EÌNSÿ”m>z~B¼±ø‡6]PFtm}±ÅyÑË—Q§xírÎöÁ–akÉÜw,[ÃÖˆXHÊ)Þ åu @àDYopĬŒß†°Ú…ƒý“¨&ˆ´ !`57B›)‡4l„‡ m œzcZŒŒR/v×§Î"±Ô;ÝAÞÅz (¤ì ±œ?¿7Ÿ®ƒ[ ü&ùÊå'¯ àwˆ·v1pÄ-íñ23T¤è|ãS¼rËŸBƒþ@€…ôP `Œ'<ÃèkÛ)ôRÕSÀ÷×ᮄW˜âVƒ¼f"¯*‹õœ‘×~û¬Ë dC¯ôÃ.™“S‚KE,·Œv]¬]°ŠÈÑñï!ôû)9L+nÚX[ T—ÅÖ¦""¶W´z\áu X=Ip…ØÓ—K•¿š}ª·Í—Ý2øÓøR™º’®I¿f<¾ÒÙp·Ü}(€»{ž°å´ ÚçpŒ‘¿ßÊ-?Î\‡ -¯/ ŸÓØpNcÃÉ\ãíu¼»ƒTÊé&¼C÷RcÃIù@ÇÛžwY9×è@ž×ÄV.š[‰c@HOlÂARÛ€> Ò f9±ZŽ9Mga§Õ¿æVjn%–€ ù¦æÃo¥*Ð[nˆEý lQœe¸ÆD°D€Ë0q%ï‰ÔEãËe¼L ôŒ¨2f—b²™è÷˜œÿ* &]{Q¾}.)¯`ÂçU¦šKÅ÷BãS?†sëûÆ¿³¬Œç©wÙËi Œ¹aÃ2W‚=ácÏBÄ„ø|n÷‚°3 lgA¿A¦‘?]D ½Å¹HC̵òs]“€®üÍ-fÆz ÅëÁ¯€ 09aâªJqÎB;ÐbXË—Àº¤1¯¼<Ðrcg-|°†qúØñ:®O:¶cÒˆfØTQn ã´!ˆ—ºH9±q‘ÅEZ¾›œT|L5nRËMª…ÆMú§ErÞßiª¤\vêÊx·:ܸrÕiy£> ¦îÈ ¹ kŠÛP1É;W (îb¥rnBBªË[øqÂí¼ÚlReZËÊ·²V³Å6"—FŠ­VwR ׿ -À¿¥¸rKê1;SÄ€µ×PMCYâÒŵظ& §–™Ï%ý*mÆfƒ…ˆÆ `æ/ˆb f™z²_Û쾎‘÷¾úÖò[H÷¦t–öÙkÖç_ÚŒ¦e‡ù«‡“=§¢:Ð>Þî¶Ñ—ñËvŒÅÞf2¨åTá:ëe,q̵ç@½3W—Ìõ78ì‡ûû$‘úÜžG;wHápXí,"•”¥êLdš‹5ÒÌ>ËÆôêŒ&½ðl 9¤K¤.Št}6 Wàž-Ÿ©ÙQT_W¼ðgÑw†x ºð[øÞ0Æ;¶âìæ /ÏT®ÄvÏþ´¿0Ó©®ÂU€añ>£­8Â%>¾š½º¿?Y¼^­N|㫪R+…Š[C>±Ü¸Ë~®C/Óhª¶Š9[ûà¾TZ¾GÝj‘—Ä4qDMÑN  Ú¹½A:hC~iŽz¬qDMâE“xñP/=ö/°jX ¦¹ÛR‘/–ÍÐu‰^J8 ·õÞÞ9µº:PlÕpæ™/´º¦3¤Übâê@AT¾Z_pB(Ž#9 £“ž³BoPDzVê†zN´ @­ý_³{·Æbû˜° ð~-­àPý·ýr<èt{À£Ðuú½î¸'’¼©WhŠ|H0 TêÞ,ø‘U.¿ÃÙ¼á¨=êö¼±hÄÌîàõ£AgÔïûÃþ¨M¼ ýrìu‡0q¿ÛÁpÆ"4§†SÔ×´÷ä>ûZ\m:-}Ÿ²ekóÁêÏv¿6ônþ·0Ú”y¯¬ëL«-…µ¤½I{D––ù°Ø¹™WaÒ°6A]ÄgLÚÌö©yqË^ZgÒüÁ¶&öžU·5u›ŽÈñ<.]y_›Ü%~ÀÚä›ËX‡Ï’×;ë³tŸÎ)îcŒ"WLé¶È¿2$cí2dÁ§h­Øy‰xß­DSŽQ°ãpu&q#FUݨf²NH‡0›·ŠËÊuå¸ä(¹¬¸£ ÓâZhfî=&'¬R²g1 ÷¿B¯ê€:ýª#ÒŒÑÆ$6.Š D:Ö ×ñÒ¿ –²ÅC¡îÎYË Ñ6Yâk-?6¦§j½oñ%ýšBÌa›A¢õSñjX„æs@dÖ¦øŒ· Š’OXLkŸAï×>uÇkŸqyŽ×>½­ý>;?×>oñ㵯r4ŽôýõÙ£TÇø§šëÓ'[…+ªËÇÚ\QUþ¦\Þò™Ë¤×]8…Â…p'Þáze¤Ú$XáËÿ[ÆÙÛùܤkuÙŽ±‡µ²?~9îx£¡x)ÐhÙuEÈu‹ æÛ. VÉÙ º/QVꀰŽ&‡AÓÀ¦Á‡69_Ôë+À9^š_3½÷…ùKLŠ¿¬Ñ´8;¡Ç"¼y1î¾;tÇoÛ§ãN§×é·Ûîùù»sÆmm³vúW+‰DŽ•]ì`È£€Ÿ3¥Á—‘~ɱˆ[ßÂ8„N˜¸Ê·âòI€æþ2dý7á,3Âð£ 0š¢”bè´ MŠ<´[qߌïõ"œaTJý¨†¡A±óøá8c•¼±e>üŽ( o^tG/Gmo4è :=˜ÄäâÓ;HÕ ’z&³¢rópËhRª¾©ñh¸¹Ýq{ÐQRdNÛï%˜ÜÇã>¸¹Ôžv4í,–jYo[Y<²ÙZØ>F°ÊK¶´d¶ðËÃÀ·9N¤1q0ùÉÌÁ3Z‰€éi<ÐU/ŒŸ¹*qóÎÓ™¼%âh©ˆK‹L*å«”çTÇ,;f¬Ù )ËÁ¡’®*܆Ks‹‰¹cº…4§ ®¥½“Ýð"æN~à[˜-fÏq ó!Ôlaw‚«¹…ÅÀ«Éðêy,(ù›™—|êqöÍnËaŽDˆ“KïˆÊé'¹X ¹G=ùj63ûSÓØÉâáof–·ŸãÉ,Ò³.8ä¬h3ËÉL1TH– ¤ç¸%¸#»AŸßÞóm#bñ“’ݼ³Nuïïcžã>æs¨.ÜààIùaë|œÅú,w²Äc–Ëè;Tá@j5áq ŠAΪr£á2\§‚H´ _àCÛ%mÔ‰~ÞôãïàŠ¼Þ¤Â&©rLCH²G.W »ÈÑÀª=}Xµ\…§«fzðí! ÔÝ 7’¤)ñÓ?~ú©ýò§Ÿ~úÏ–þ'Çz ,8ÐÔ‚h•i “°øB°øÊáZbj¸Ê,®2V-YURIÅ^;›™j“÷ˆIO¿µ’û‘?SQÿ†ÏmáQ\Å™:þÛlƒ{U_*l^²í¾ù°y •ihĪ8ê¹®Ôî°Ý…àÀl¼Îh <¤b÷»ƒq»;ö†ÃÀË;’½F¡-j¶v·?ì´Nbò²xìåÉk¸xUR®Ë@(‘"´2”¼£6Ñ]°ÙÞc죕h“J¾^…ëpµ[ý¬³%.Ö š'že±‰pÌuä~ û€e—«æÆl8@³ÝB¢—–É¢Ýí‚Å­¯Apw ò]|Ý‚0lD¸»ƒ»äíúü7›`ti¥¹: ÛÊ¢¬O¥#žé«è.œòÌCÊÈ¡s·Ü‚:ÙFw"do£)…êɨ5¥¹õ»HÈ—Á·`™ªúWÌBãßæ Ò~‚ ,Ñ~uª[þç`ù-ØBð§ mÖz‰%j®ñÇPŽž,ÂùVéð',VPó™:ªgN™]OIò¸Ž¿_¬¯þùNm Nk©qÒë\¦Q½Õ‹ä&DdÞ‹û»ÄÕoÕŸ”Pª0 nƒÓMà= @Š•ú¤C(Óô÷˜}ãf¾ݯ€¶ö ¾nF¾[ç—y¦[ø²[ÿ$$7IVóïH+þ?`)duÝãuS³x%€0OU¼¢h€O;. ô’aáf_‡ø¿‡ØõÌõ7#FÒ÷k1äK]—lrcL @íp™Þû˜µ\R3„ÞùwÎ+NïÆq-ªåÚsß³êâKßÍ%–+ônã`n¾åÁ(Wic¤œxÔúMMdÓm¼{ÒÕûÀ´‚,B\¼Ý žnÂ;yAOss'ø¨§Ò­ÐÙÇ©èïÕOØÊñä³|®@/«Q|, Ó¸¡]—‚ágÉ»3ŸûþŸÓ#T|öãoª,È;Mû/Ëy¨…­¹hžÐEéÿÅ©VMÐD4ÁüFKú-wh¸+á)1mOO‰ ü|ÃS"ø×,)O‰ 'íÏSÒg_k<²Å÷ãIaZâ#¶dž”þ‘yRúGæIé™'…¹µŽ·ÿ$¼åhߟ ÕÑþ_ÀS"k?pE5ü#èÏÊRŒeç¥^žšÛŸ§D.¤:*øj©£¦ÚO丯£Oµ1žÈ\CŸä0­£¦ÚO䀫§d¯r×ÍXl)ââGhˆ²CT6²¬ õ‚HƒLÈ\6§fGã%o’fJÒ fÑ¡¾3)­Ê1=Z¦¹/¡¯‰0ôs t¨n!Ðmü7_rñßâjp®¦AÉ _ýøjöêþþdñzµ:ñUøjÅê\Å*®°-AñÑš<Ö…¤+07®ašPU^Œ¿£ é R ÿ 1ke Ï"cÊÁá’Nœ*˜d³(mV×b§³-*¥)Tù£OµI²Ò…ô‡Qs<«Ð>ÕxֽӅ̬^ ”®”¦sÀI7̰ڙ™Žæ5WV™Ÿ­¹àr´Ôuù—]p Û6 B˜É{¿d.!6ÉÍeì—•|,_Îß¿y«õ .¸r‘äCm®7ózK>‹š¯7v×ABZ“ ›6(p†l¥ë­’xÇž9Îiˆ)[!üõÄ¿cE’»‰¯âßÚç ‘VÍUâ•<+ ®ðŸÓ—C 6Û¬}`¬95 ÂÆÖËü\„0WNgK˜BJ)BJ¿,ÐÊè–ù0‘ªÕ÷ÛY@Ùµklï²LÕÍeT-© 4iš`¥RÓ±¡~la:jë;hÚ†°úëçóÔ;Â#‚å4mf0êÆ2‚T?¤˜ÄÇšh‹¼"ø|n€j…èZ®`ÁþæíÖŸ.ˆ‡Þb÷yaƒ™£V~®kò•¿¹E uàea'6`Ø… @- IˆûÕÚ8g!Y¦‘ÕmÕÚV˜˜›²ÒŠ)Ý“ jŠ,MyíIOÞG¬×€üù±n¯‘Ý’ªÓ³ÁÉ@5…µC-dè쌤¹Yr椸 èQBV{¥”.V åé&$ §Lë±’FÃ(«-ÿ)@_×1·ZÝI)\ÿ*‡‚€Xdi–eç9ë1;SÛ›§ 4^º¸RŽ÷å$@¥èQê˜ùžþðÓ_Vi3j›œúR7ƒ ŒËNf+–`š¾ rêÉ~mõ칞ãÃçó§hW§{S:K{}þgïfàî<¬Ã—àKW#×$\XQ†”·»mô%@³²“ÛÇœ*\×C•ãÁjÇtX_^É!¡ç­ìFʱw Cvþ ÉmÜ:`¡‰d ¨¹ЭÄö[çIZ½Ê½°é䱯öeÙ¾ôÇq°íË¥s€pòí5ðnìï†CØ ïæRúr9%ffLõøÝM-Ôm”p´Sco¯:…N”È0kDéúD«`»¹·d¥[ùÑ%ÎÞÎçFñ'ݼF1+¾Œ¦_PôÉÖÀöPÌnó—Curo@'šÿ¸q!BS`WÊ ÜEqˆF zóO!>ö_ßã¿äûSMëÙãÓò,›êióëŠ éŒCTèŸ]™ÑÐZzTÆ;¶ÖZ&þ9¼8¶×3c@Ä]«­„aD¹²¶JIžg.ä€ûã~¯GÄ #Žþõ_$ü<îôFoˆÝ¡Ép:FŽ…~·ë FÃq^ÍblWè4ù°‰vHG 'C¥1Í‚o!ð%çŽ-‘{uÔu{ÞX¶:fäõ£Agƒ‚!Úb, TË1ñFÀƒnw„­LßbC†—ô5­“Ôe4é9 hl!¨¦Àª²µY6Ì&Ko*µoÐÁ{,üoa´)Ó -+‚©«å×’c¿¬C3´L–™ “†õÝrŸ1?x0Ûk¤¦½Df·´Î¤ùƒ/vnU¿D:ŠZ.4Úì-â.‘¾Fº=ù á"é$öÁ¼«Ä9¾ô²W5–YEß^p·KÑòúгۉ¬T{˜ÕyÊ™æ©Â9…{­ÙÁ—F˜zœ‰†Fô<”RU 1uE–G;ä sì–ÄDÔ€n«Owýôˆ#fàSy÷ó{³Õu¤ á·@¹y8=P°ö)øW¢] ¶Ñ¸¥éNß¼˜û˘½=RtØl(>µü)4èOa»·xò¥2ÑÃ3Üiè;¢UTõüh4c…XÙA®;­0V¶’w½| Óyù6Ü3Þ¹ÎÍÈ‘õoFkG=ƒÍx±ºŠp[aSösÝ9™MéªµÒæ¬ä¬óòý™ïo—o8uKP’¥yj¿ZÆr¢/‡?Õ+áz™g%‰ðcKª(‹l̪~Ïwûã—cÿ‡"ßãul³Ùë¾°`¾ò8J.²äÎW·DCˆÄRÇHd=«‰G´8õæ¥h½¾‚Ó}™™¾ø+Ì_ÙóËÃ0f'T­ÀF½y1î¾;tÇçíÓq§Óæ¹v§{~þî¼-ÿq»U+1ÑðøsrnY?[jš™ƒã@âÖ·0¡æmr+ÊRVÀ7 õvÎ2#ü?Ê£éØÄý½Úä½ ‚·;Ç^ܲ.ć”þ‘‹¶5—;¨î1 ë «ÔýA:&xЏg Û§;z9j{£AoÐéÁ,öºÂ +ÀM€TkêAªz%غkŒ_zÞx<©>‘lÕÎR©v¼ÔÔ‡]¯×ëw=P§e'óü±<§8&ZØ´‰°GÁ›ßÂ[,2ð.“±,°´ÉÔÀ3ZÒ€92<^Õ-ãgc:Óï°ÒyGE~Ó¤5ïoXÓŽˆ#ò•©}?Ë~Ä=Åøìš#£êvœù[?Žv›)›"/Î(²R¦›RÈðÀ…\2BEÔ¥6]Ó¯7ÑŸä¥í¶ôoáðaq ¾1EâfÇw?-Š¢Õ©»¿êÔÕ¸*2›‚ò«>O³{\Õ^î<¶ËÙ^5ü Μ#Ïpï±Ípÿ±uXÄÏdz%ëñtXpoO‡îå˜FM}oÐU!¼`tU(ñµb +ÕòI&›wê²Ø–œ5ªi¦î¡‚ŠÅçÍä—ïÿýí?®¾ürþwÿ!u.¢xË¡>gx¯ñeÆw1K€BcF/”eŠ'*œT^ª¥È¥%ý£Ñ@p0Ä]SÛæß’$—®¾¬!œ J³=up±q'ÔYë¸M½vFÂ¥¾ãmª=Ò£q¶qZdßdq¹H"\ðß(|²£/ÚlõZ}š¼%9¹'‹[ñ]0ÍèMx2¢;QACÚ ¿) X¼­Jñ„ßy—„KpÑ L¦fðrQxçVª6 ›:Z<1 bï eR¬D¼‘º]Ý–Ê“ŽsY³ë ûÌäv Šëz_ƒûx꣢ÉþöÞ¼ÐSj ‰d5Vªdjè¹3f÷,$+'F!“›j¥.Ú\÷‰ê:ûÊÇíeãM½”êOº;,kÊÂÖm̳ï ²ïS´¬dTGÕgȨãEÑ{9À@ŽšëU¦+˜·øÕ¿~ûý÷ß®¯ßÞÝ-ƒþm8½¾¦Ÿ^®W7[)õŠz¿ê¹mVbøÃ—­ÉnŸ¼C±°^nÃùœš˜±·ˆÓ‹ö{••¾hŽT|,,AóÆ}~«¿{^¯=u‰ÄÕxœ‰ãÁM;˜Ýܰçt͘r8¡Óœi{%h|Ø”ü ,9­5,X+ºùòx‘ôÓE¸œ½ÝØ3²øÃôØ„c¾“®WU‘Ó ÐNІÎŒ°M!­"Q7>MìÆð¼‚Âw~È1†¬’üòþ†Ú6ø¬EÄ5iþåä×hó•x¤ 0ÄóéÒA;Py~"Õ f˜š_¤7Òž]Å ßI÷ЍHÈ”ÿÊ~ 4Ÿž 1ðé!¬ø»l‘aûaZ"Ñ ‰ARk‹Æ¸%/™^?,Áÿ²–Œ ­T9á³-x—“IŸcp[ën7êöÛjx0˜oè-©å/«nüL­«—²²0~gÜ*j~ÕM™œ>[Qõï‰Sû{ª6h”áŠ-þ隆œýò6þúçã5¾£,šœ¿ž‚Ϫ¬ˆÀÛNa)ŠºSíh-Ô\ Z Y44‡yD\N΢é­&ȼ‰ÿ—}ûIh(”)ƒåæÐЊ•% N0’Ó*(ƒ:mËÝ–¶×jËY¨Jþ·àváôëe}ý¼èìàû¡Ã*­ërò.º»W†˜·1Ø×ŒØýæ°¤¦Ë G(a´ÁgB/άa9Œ»aµ|}u•U¬Ð;ÍŸì$¸Å-R:$G¾¬µTÅò$~Œ`¥n)§ØÉè!ow Ét•/Dÿ´3œzçïߟAÀÛÞøôÔ{{æy£Þéø}¿£EÉÜ:­µ#>|6å­þüùúÒKÅÛëŽ×n_Oî×Û$@“ÚÄ®±§²Õb‘äÔ€S‚|´KrtïBM7ì|wl¾ËÝW?>ùŽs¾å)´Ìxen— HæxY½#02#æ6§Þ°Ê‰a¸¬] ûhÌÐSˆm;F~ÿ ^çôP.¶˜n„ŸýçÜ·{êâaCuRTã‚Ížgtìˆmß› »ïj‡'ßx«KK7ÀýÛÿ-~YÚ3í syncevolution-1.5/src/synthesis/doc/SySync_script_call_flow.pdf0000644000373300037200000054237012424517753026637 0ustar00nightlyallusers00000000000000%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xÍ][“[7Ž~ׯ`åeí*»-Ý·¦¦jÆqv²›KìL¶j½²ú´[3ºtt±ãýõû$€ï\Ô}º£ìLü }ø©ŸÂ_ÂO¡˜] G“Ñ$¼ñÓ( †óáÕd> óÑÿ/æa_†Ã6¼z}„å! â¿ÃÒãA ŒÑt8 ³ñ¬‡7¡5éÇÿ ŸçÓb4Lñi:-†Ãñ(~Í&³Q¬é8aL¦C<;‡Môû‘Ö3ÚÚha2)Òskjë´Û*uZÔñd¤1âx 4çÆiŒê¨Î£ÒqÔOÏ1NcDP‹:JcÄbžžcD§1"¦¶1ŽJcÄ~~Žƈ 6ÆQi„8žOãH4Bj}ƈ³IcÇNcDPëã(OF#NŒfs=v#NÆq+Ç£†<ŽÆˆ ÖÇQž¬Ëãx4Tšóè4Fµ1ŽJc‹üÍõØiŒjc•ƈýü#:ûy½Òº+G³æº&!¢Ç^}eÚ8ŽœÆˆ Ö{-OÖ¥gä+ÓƈXqõ¹)yôuäˆNcDPës=R!§ù9š¢¢Pë½6#N¦:ÆãÐiŒˆ•T×=C¥1" G|Žyt#‚ZG˜]j) ‹ÒœG§1"¨õq”Ö‘Æ<#¥9¢ÓÔÆ8*‹y~ŽzM4B,`‰ëãh4FlY3…ÓÔú8Ê“uÝS`mešõšhŒ8iZ®BiÌ£¯Gt#êú MQ(M;S8A­Ïµ3F#“¦U #âÉúÌÈ“õ™Œ›VhŒˆ'ë½–'뽆צ4›¢1"ž¬K¸ˆJ"´YS¸DhÓ¦h+‰ÐÆM—ÌI„6n:dJ"´Ñ´¡ÔŠv=ó<óþÕx6†3|*&84c|c¬xÙp磗f£ÁÕxŽ?oÂh0¿‚«?6ZoM´!0å¹5µuÚmO3âtžŸ$D¥1ât:WDoë´vÄl9°…ÀZ„pô°…€¦žN¦Ò¥ù nFÁœ²³j4bŸœ2mÛ#Ú-!ªSƈJcDwÊÑiŒ¨N#*Ý)sD§1¢:eŒ¨4Ft§Ìƈê”1¢Ò‘œ2C$!Bá¨"24#ºSæˆNcDuʈGrÔü-n`ÑiŒ¨†•Æ<ºSæˆNcDuÊQi„HN™!Í)#D£1¢;eŽè4FT§Œ•ƈî”9¢ÓQ2FT#ºSæˆNcDuÊQiŒèN™#:Õ)cD¥"9e†H4B4§Œƈî”9¢ÓQ2FT#º£æˆNcDuÊQiŒèëÃÖŽ(Ñžé¤?…ùÁ§Á¡ŒÉ\lÏx6+†cQÔMm?(úa0Ð`ÑlZ“BL×tØïϦ¢ñ'ýÁdÚJóa2]ãøÉ6Þœ  †ÆiÐÙyò¶N»%DÕ1›jkq”*ˆ…ì<9¢ÓQÇ‹3­‚è¡GtZ;b´÷"q0„:h ÛMfcõÒбÞ3Ú:8m:ºê'Û®mi3ùÖÚ=ò`4ò]¤uöu"b¦qwœG}’æˆ:@UDó^ŒŸ M¬¾eM4GÔ¶UD“SBÔ'™G§9¢¶­"š9"D}’æˆÚ¶Š¨ Ó[Ó¢¶·Ð¢¦™Ñ¶UÄÁª²Âˆú¤ÓÖ­!æèm§`&æÆeÏh$âd_Óä‘h$ÒºææÇ·äå®­ƒ´Î4•¨ÑH QŸdD§9¢ÉcѤ‚õIFtš#jÛ*&„¨O2¢ÓQÛVU¦¼5fFýx{ fÆhލm«ˆ&)ÖšäÑh$4fÚ¶Š¨2Å<ê“N#y$Dm[C4y„"ŽzåQi,pÿ¢Üº†ëIì.ÓX‡ØBUóa¤4o¤u-Þ3åQ[“!D—GGT‰ª"ºT8¢>É<:͵mÑ¥ÂõIFtš#jÛ*¢Ê”·fyÔ·°<:¢¶­"º¤hk–G¥±<:¢¶­"ªL1ú¤ÓXQÛÖU%®–÷âf›Fò(Qµ˜fs‰êäQZc=p žM¦yë ­ãsî6EÄL#y´Ö$FóÖŒ¨UE4©°Öd¯FöšxÔ¶UD•)ï!E Q[3Ú¶Š¨2ňú¤ÓH‰Gm[E4I1~HFòHˆÚ¶Š¨2åülÜ6¢¶æ^kۢɣêBÒ…ÒX!áuý(qÚ¦~,tÅ‘ÿh4–G_3ªáz‚ØÔÖšåQßÂòè­]vë‘.BÔ'ƒÑX½µJT•G—å‡åQic£jÛ*¢Ê”óCú‘xÔÖµmÑ¥BùayTË£÷ZÛVU¦˜G}Òi¤‰Gm[C4yDT>ê=–G¥‘<æãÆ~†h¬ѺÇçoıXßÏbs?c­YQ¥9Pk•²ÑXµ5ëG¥‘éÇLϸ?ŸõQO%a2Ó4–g‘¢+²ÍûC$Q <×ù·ä•]9q–“?ˆby[N9ž² ¹&„NrZNþp\̘_Z*Özƒê2­FC l.C!áÂÑx2œû½Ø5ð ,‡b0ÃHH9›„+g•eœ¨B›aLPš6RÌ+™ô!&©›;•ï`4\L†:*Ú6ÍBO¨9|áˆJ#D*š2D¢¢MÑÚ2#zÑ”#:µhŠ•ƈÈdsèˆNcD-šbD¥1"2lÙásD§1¢æâQiŒè¹8Gt#j.Ž•ƈž‹sD§1¢æâQiŒè¹8Gt#j.Ž•Fˆv©#Ñ–EmÉ£ÑQãä¤`+…TÊyÏrqÄ£ÑÛŠºôPqóˆUX_3THå|û:Rn‚”Gå0 #‚š-o¥u¶³F£\œ!-G½6õšŠ¦‘ósJíYÑ#z~Îyô\œ¶ ð>tþ™GÍÅ1¢Ò˜GÏÅ9¢ÓQsqŒ¨4Fô\œ#:5LjJ#DÊÅ"ÑÑrq„h4FlY3•B*}OÏŠ¦QÃÒŒˆµ•eOÛÆ-{SeË×#*[ÖŒlÏmS¢ï‰Û©úš‘mW~·IMi[ØJ+®âqÔ¢)æQiÌ#\ö¼ŽÑi„hES„h4B¤¢)C$#jÑ#*½ÊƈZ4ňJcD/¤rD§1¢M1¢ÒÑ‹¦ÑiíˆâÜD—(z‡ÈŸ"³²¨š÷ ñÍ72GË|£^ô&£ùi[d`g(ÒK*w:™p3¹9y2ÆŸÑÖ=£‘×b¯&Ú­3d^ ùõJƒ‡èˆîµ8¢ÓQ½FÌ´ ¢{-Žè4FT¯…3­‚è^‹#:ÕkaÄL« º×âˆNcDõZ1Ó*ˆîµ8¢ÓQ½FÌ´ ¢{-Žè4FT¯…3Ék1D¢¢y-„¨´ ¢{2Žè4F5ke“=õd*ˆ®ÑiŒ¨˜yÌ´ ¢{-Žè4FtOÆyÌ4F$¯Å‰FˆæµJ« º×âˆNcDõZ1Ó*ˆîµ8¢ÓQ½FÌ´ ¢{-Žè4FT¯…3­‚è^‹#:ÕkaÄLcDòZ ‘h„h^ !*­‚螌#:ÕkaÄL« º'ãˆNcDõZ1Ó*ˆ¾>ÑiŒØ²fÔ“© º×âˆNcDõZ˜ÇL« º×âˆN#DóZQiŒH^‹!ÕkaÄL« º×âˆNcDõZ1Ó*ˆîµ8¢ÓÚÅq(ÆñÄ_ï3ÂK+‰Ñáõ[q#úˆ &áík:D¨ÿ^¼d†B-]Â!š#b3½ŠÉËaÞK_$ô6Y|¸u„4ŸÁo™¥/±yON<>Ü<åMñjí¤ðùá÷2Û°rSå;ÌÒ·.íCj?E‰Û¸‡™¼;~éôvmjØíÔ<~Ü>̽¶ü‹ïÆÇ.-s¿§Cìq¬ßù[—öúæáLë·|éôöÜz‚8£÷;}{L¿'Ó¹ö[>vá;÷{Kû-‚–¿ti®Œ'Þmë?²Û#ä¡lÐ'ñÛ£ºMñ± ßÚml@|º'é[—öÚo¸x2ÝqÔäs§—çÆã9ü1ëvúö˜n(ÎR.»°»Íu;ëÒ^9Î|ºÇò¥ÓÛµõ‡ô¼ßñÛ£úÝŸZ¿ñ± ߹ߣ)ŽÙÙ›ó·.í3çÊ{¿ã—No×Ö1=ZÌGÑö[>vá[û]óÑ£Å|”Å>¢ßC òùÎߺ´WÎ%¤Ú|(_:½][ã4õ;~{L¿‹¹isùØ…ï<ßÅ,kó8aù[—ö™óëÄú¿tz»¶Æ*ñ~ñÛ£ú=²%Zàc¾µßðë|¾q5ƒ|ëÒ^9/Èk)äË£ZXŸñ›õ' †³~¿˜ÀƒDŽs>†ö‘Ó9œÅ¹xrÿñG‡\`Ñï« Ú5q±¹ªží<¼O‰§Œë—^ÀcMiŇ<Èß¿ H3&wЧ÷Ý&¼úfp…ÃáÝMxöv¹_ÝÃr±^¯¶áüéTn—HJîöám¹ÿTâ_¶K|>V»íóÞ»¿…7ïàûF÷ÕªôßÌžc| \wË"¿2Ë–¶A–”ô?5ËžÚÖQ.¦ñ6“Á?7ßÒ÷¡W£n¦­Àõs¬›˜¨ç{gdMÕåÙÛæ‰RyN¿`ù‡yc¦•Öå§rý<ðúòÔ¢†;)ÜŠÏ)=ÄŽ·V¹ÉË«ÂN¯¦¾^‡ãu - ÙþÛGÇÊ~ìù­É7e«UT;¼×¨Lä×_¯nnÊ}¹=^9fÅé±t¥8=Ý,DCÙ4-ÔÍ ëjŠ9{`a¹ÛËŸ>Ï”¹5ΔUÚ=¤RLåÉ!Ō𙫺Zþn÷+÷uO¦ œ§hÿóPýrs1DÑâ9¾ÜŒµŽ—¥¦œ·xþÕ»Àxá«3ã%|}X@Ù¶²e‚jlY*<\Ⱦ&áªO£°—P+[f_å4g,¥‘Ç­3ƒbÜÅhY{ëVcù7ŒÖ»[Q21a³;ÃW×»‹õW:rQS/Úõ]ã…]ô]¶×Wᯋýjña]Âuy³ÚÂ8ÝBDs%«®÷?¤]oë¢ÝË¥øxM¸Ùï6ª6ìÐÙ½öïNÑl®}÷ʦF{ûæíÛoÿôÇ¿þîû÷ÏÞ? ôí›w5êS_7j(ЛÓvyÄžñPS ¦«\š «’4µìtn¶µWijNnƒ—(MY¶Cùóê þ˜5W£4ºÞÐ4—×§½L×ZâUøö&|ÙÂçÅöŽ;Mï¾×t‘ñز¤¾ü¼º>ãœ5zЄnʇø@›òXî!øÔ™36½Ã+š2q‚ækÊœ 7@ãÆT§…¥c¤«é_O~ŤñŠOª j’mÏ%;Z¼î²mO•mhÌ(׿Y„›ò³zõíÝo¼¯)'MInØ~ß®°•aÞ—kˆÏµ(G1ñ­sØáMyôÉ|‰”DGkwy³Xžµ¥ÞÒ”Èã·=WáÝmùQÔí“;Ò”Ž,qÖ±§USUš… È,¼ýËw?ã¿è<õ5Mu‰ €_ýéëß¿ö!«{æúšÌ‹ëÛ]æ­½Šãc½hN–ù6%gª¨ultYY©É$‹ÿàËá$+ä>½^ì¯Vá÷ß¼žE(7‹Õûû6CÙáÕÍ…E6+e›×N¸Y•ëëCxÿ ¼¨Œ™|êû›Kè7ñ køb¿}ÿüEí>¨_ÕµH•þ«ðçýj³ØÃc{â4˜8#XÇ:öê*˜ÚË±Ú ¶A à¬é0üÍÅw¸+—+ ö‡òvñiµ;í1Ô:÷›r/òã °´W?>µßÍõx³ZC%›yDZÊ |QkËr\`ªE ë–IsTv7rTÈ“a#ØÅuo„šñ)²yÄ«Å?¾Ý®Ž¯Õa!› ᔣ¬>:•] tÑÍ…yÔ‹â/Ê#âHÖClÔã@-jw+Œg2ð¾ÂØõ씨]j?ËÕh¿d~-Î7C™K¢*cËBÃÏnV{ìòGØ¢•Ë܃«ðuÜ‚«;ÿ2‚yàqk^RÛ™L oñ|I:vúKzP †ˆyO 󵡛¿3ë7b[i`»DP §n[âÀ¢ô L¥ØŽ¬äváh}(±ÖÅHqìTUµF·­¯áÁ Ð Í=3S}áæ„PpXžÚ¤=nXÞ–Ë¿W×<*gS (†!/9òHfÍšBùÝ/ÓÊ×¥e¿Xa\5†>îõ2­Q5x[»8wÇW×åû¦<¦j¿‚FÆ_S±-ÅÍj [ã)ØžÈ9ohKáÜTè~—_(ÖÅß¶7[nïŸ eìÒs³*Æ–Ï…¤NÀ,îa!Õü ¬ŒÝg1ë$þåÕÇ+^ø“xaËÝ ¡œø\Àfw}Ú—uÖö€vÒz·ÿØ»aá=:¬Ü´)à]Lð;)ͰXÃl· 8éȇpeÀ‹NéF7(zmŽÜf}óù¶DJO˜/fsŠH“ÆŒ(öšª‰S!׃º ÑÄov×âãoÐ`Ȱ±ÝìÀs3¦q]Þå¼| ,:)|9HxMV Gñþên;G;>–n½ÐtK÷´šÅõfµÝ—‹ë/-3î&ÜøºôCÀÌŸ/±ÊÌ ‡ðí$Z}J~|%ø¡„XçpwãRƒŠnøe²ù‘°8¬MœeäÎÍÛ¯øuöƒ+÷™p£Ž)r÷™’áûXïNmkŒF\ý]zÄçç‹G¼j¯‡RKÉJƒÛW`WW_²9a¹^ݓӴŸ‘q½˜Þ‚/:Ì›„š­ØŸf‰e'Ôu–1ôe¿µó°ÎB¸~©Üì ‹Â„óºü´‚²IŠ5q_â°eÚ,Žp4RÀdyÚKŠOÉÃ/b]…÷IòWiM\˦Ÿv™Þ:ÏwSoÑË ¤æd?ùf½øˆÂ ¤Ê)¸ŸòJ0|Í‹¶M­ÝGO¹Hú®Nµ>M[&µ>C²µX²hã(-²‹9ÐC9ðsƃ†-‰«[È}åâ 5ºmW&Ìñ”ùö#JÉ/øe{*Ú‘$¿`ˆ2~SÊ®ºŒ«–aì¹ÜI¤üî×…u×w¸c¬»x_í¬ð*‹&mR°‘ð„,˜´9<®6eÃq€w°ºAÝN jȪDHŠWÅ–9Hp¬n=^,Â}1……Þq‹%ÑàË›oû%¬¤÷ºx•y”ÍW‡h¶ØØNĽ“T}!k‡R·âXñ‡¥ÀM¦C–À—.’m þ€‚œ˜ã”yÊÖ%| ×ïú›ÝV”bŒŒï¥ Xq†|:(ß×èA}—‹JÌœŒó f8ŽOÃ/»ôûr±€bFÑìIUtކ½&ÑȘO“ÎEI[•ׯÐ5È&*¢bòø¤QKûækÉ¢Âÿ‘’¥ì¯B;׬{z ]¼Ç‹É xCÜÝm[!W i™WLÝú"Cíó œ=E õ8~«õEzCˆt!Q`‰è±@B—'IA0üÛïß@ÆPQu1} H,I%E Ó,û9Q$R@x:„r»Ûov§ƒ$ûÍ™l:½S ÁpE@bÙüj»„ë3ãØßÀYˆ{Ñ8ÂÃaÑ„Gû!fÄ+׋ýÇì éœ8Øm—¤Sžbo£$]ì-‰P¾ù©1ª²’+å´Yå@•ìd!Ÿ÷Ð$ø˜¬Y Ĭ¥pT™Ì¸äû®Â7hñ›Å~¿øò[øjwØ9s-Q~•é> ùö‡óJÈ%8¾Ê’Ö|b5‘Ë”>Ã7>¹GÇr[®Ë5ñZÇ]¿`p?{Š31Ñ wúg85ÍQM»`N´›P«zfS”{†‹ù4¨ß¾«¦ií‚°‹/-ü®U›µ_ÜÀȤ߻É1¶ž°¾dôÅØ7¥ôÜúŠß?[¯þ^¦÷‰G¼CúA^½ž; š‚£›VâO›jŠ¡Õ%ܾÀ).ÙKG=jÂaW.‰p /•¨ýï¿Û²ÿ½Ûïbá³”Ô·œ}6ÆD>º1æÊSï›jŒq£”³ês*sÙ.f9޾¥†QŒó=à‹pºÃ(cدáâË÷ÏÁ O º&iÛ{Ø&78nJE³p$2´úˆŽÌ=Äa_þ­Dí5¾¤²qŒeÃ*6nç1Ë9Dý¶Dñ dîdZR_"àÛÝöåáËÅÀ{¤ŸÊz³äH:FÈ! µÔ4©,Rh#,Þ¬>ú;+¦Ún+½¸©Æm¦:àÜ£6¦.l«ÇƒI›­6™Bp9Eús•Ðü¡<~– Ëñ3rÎ1šëz^Úh[–¼€þ8 ÷™|{̸Œúz…ÂÝ¥N‘ǹÐûÏ.nMƨ©hÙJ-Ôã¯,=Á”Ø¥¶…×pŸ›ãžË´´ˆ¬2øiá½vJ§è$Vö÷²¼ ÔOĉI§>²÷ݪõn‡¤>â>ômºâ<ËM]aÓKĽÎ~|ß9‰‘ç¾n$lÛd?d~ñôæS×âA¬wÐË«û7MÆÔ¥W~á,÷wRuœ &’ÕÇL¬ï%³†€»ËÕŠ/¿ä*;‰‡Š] [åÛÒÄB„dð¾Ë'?zÈZe=Ô;ý.?ãi›¡NÁ ½´­>Ïxci`{ž\êP)ã÷¨ÍðHKÕ`kdHw±µ±”´[ŠÈÚâUÙ²‡=3òv÷¡Œ|7OÄö5z—\3ÿ%áÙñtÖfs¢³úðÀ_2ðÝø2I&Mníž"Hôƒã]«êHULZ¹Ž°¸Ø{~Š|µê8½«²¡–›:ŽBO 4ä<…hü£¿ïÂñ8~›NÐùˆ„% íšï_%Q8ž·Ö…ê†(Z.”£Ÿî §3¢L„äw½,[ˆ›vº)½9¶RPÔ”À|C†-y\P àb•§ÍXm#–S¢M±pkPÂÓš J9©kÔ`ã ¢ •J±©\Þ Wݼ,¦çïht¤€xOò=ZÖ„˜`ò¹RŠ uר1:ÝÝ¡¦,~ÎÑÇPþtÞÆÝ’^<~–â„—âÓËrJëL†CËãY…zŽÁ6y `ÈUƒÖÂØûd W8 ] Éõóñ ΋‡ƒ&T­«†ƒ¢c¤¢’Â?Õ4¾¸‹!׋^kFžÌ›íçíòý‹»ç܃ÚËDåÇ×~?”¯Žf>²òÐ~Š a zÕ7øˆr ©>ƒÓ…=-ªvä¸Yt¼råÙ"Ÿ±‘™‡“%@ÙlÍd× š$ášþoJ89ëýÖˇ¼7ÍbŸD¡va‹W¢€Ï˜8ö |N‡Ês9¿ù#üM9ÈsDb~›z…`„›¬êâBô,þ,âå×ÙðeVǪb!.¸¸ Ê«­÷Õö+ÅZ'dÖ ·Þïü«î î[nÙ-‰Òj3Ú®X] õ¶è¸U~¼ÑÎׇö/4Ù.(r7‚Xe]ßÖ ÷j//Ä,öì›õŽî{ u¾ü%`lÖyc-©Û;xP!¨õb†.k—u~.jZÄ.O[ó“÷ˆŽÜñ‡ZÛÊÈoÆ_ª¾¼Ú˜å°¬äo¤P¿vÔˬqõîAû­Ä4d]ЬOº=Ë"A%u°Æ³YŠ<†+ ™Ø%êiÓx!®dÓ8íÇ¢ÉÄ›']âц¯Ž·RV†¯~þªš'B÷>—šu¸¨pCg_$²ƒÃ;ÑÊ)ûP"(e’ŒyHûi©ŠªûÝu~à›ûK9]¿XKÑÁ—Þ½Ýï¶pX®ëþ€F–(TLõˆo\¬~#Š*ÌE‹½ªl€íº²ÊæÒxJA¥_²|*A¥)Îîùœ`>ó¹Ø\Š*¡å„²d²·8Ãr8àX.ò&ñ †Ö«J9 Œþ5Äæìhë/ˆb¸h±ß©} ˜¹bêm¹_'(SÑ-xÜÉ ™ª§ ˆè§ luØXë bƒ+Ê‚N…@M|.ÑRs!–e!ýÃö¸æ§ÇðÍC‹ê,çMïÅÝyU%E}ösÊ^N8ê„´k|Rþ Š4ÕäÁ<ÆîòŽ¿é󫜛ÂclÙ´ w1dвó^Üõ¦2˜d£K|×ÛB®:†ãñŸåm,£Ä㼤8_ü`û¦ñÃ8òжÆ~œüTñW¦ @Nù«·xóÝwoþëÍëÞ½‰—Y ¥X ©vò]Q[ o9nZ¸V™(÷r ›¯¸:IÔ2ÃØʼ‹hÖæÝ¶5øyxžN¼–Ë©A˜âÀXK-e ¡:À¤|=e¶QQÝÒsï ù×é-k'ãÉ%MM9·äÚØæfê5 -–~ÞÇËÞw¿Blëº".ÀWyǹÚbb€Þ°èÐänÜ+ÙË‘N»ú]¯6Ûøýæó%’¸Ë[þ=p9vÓG…[ É+6³•ƒ€-«[¼zŽâ*cÉÎòâîÉ/;?‚±ŠõãQôThŠHnæë1‹> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs2 8 0 R /Cs1 7 0 R >> /Font << /F1.0 9 0 R /F3.0 11 0 R /F2.0 10 0 R >> /XObject << /Im1 12 0 R >> >> endobj 12 0 obj << /Length 13 0 R /Type /XObject /Subtype /Image /Width 295 /Height 300 /ColorSpace 14 0 R /Interpolate true /Intent /RelativeColorimetric /BitsPerComponent 8 /Filter /DCTDecode >> stream ÿØÿàJFIF––ÿá6ŠExifMM*bj(1r2‡i¤Ð––Adobe Photoshop CS Macintosh2007:07:13 13:02:02  ' ,&(.5THHÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I)$²2qñh~FM¬¢ŠÆë-±Á­hñsÝíjJJ¨õ·Ó:ac2ï ºßæqØ×[}Ÿñ8´6Ì‹vþvʽ‹¨uN¿ÔñmwF¬àÐãSîhnVAiµâÕxôºuy-k««/>«ný'ô ÿMÓOFÅé®ê˜Cn=Õ‹ò]ºÛÞÖ‡XÿµZóv]÷ÓúJý+ÿMÿ¡T¹ˆcÆ*Ý•ðú~XËÆI´þ¯×òÏêxUôúŒEÙîõ-ˆ—“ðŸ·þÞê8öÀ žŸÔ2#íý[.î¿ì}‘ŸnÛý|û;~°ÝxôŒ+2²‹CÝ¿o£^æ—µ—dÓcè{Üæú? ½þŸñOS8?YsNìœÚ°j1ñªõ$n­Ößiß¿nÏæmÿÒk?/7ÍKæÈ0ÝŽ‡þoEÔ» t§‘AÉ’ì»mÈÔ­læ]wÒwµfgô¯«x½oÕÀÀª§âf–UKûüGùÆµŽ±»­Ùÿ]Væíº›ºRÊÈv3ªÈ½ÁµîÅý'«èÙ»Ûþ÷îÿ®Ö£×*¦îµÓ[mlµŸfÍ!¯k^ߥÓáÀ<9ªvBVrO'¦w¬¿súË¡)ínm?-´Vѱ2Ö±÷eôëYF¿¡vE5U‰f5Ž»)”Ûêƒúÿ„°Ì³„ÌwåeõNvKò=WeÔÓk­f>1ýªÌÛ}}•~—Ò¦­}_Ízõ1C'¦}^cE™XxUµÇh±õVÏtǪ;Ö;ó’§Ö¹Ý#7.†ÔvŸFÛ_WýnޤܬK©ÓùÌzý/øDèó¤ $üÑâàÿ ×8ÿãlÇ•–ÀÄ—W§}bê·4œK°úíM–×» & j¿s+¼äce~ƒ&ÏÀ§{Ö¶Ö>›“Ü;‹ðsŸ;pòÛéXèŸèî—cæ}ûE~Jãò:m–rñ1ú‹víõqç( ú@»§äÚßåY‚šœœ›v ëTwIêM5æ5¬aÛk«¹—ý¯ôŸf«íx¾­¡õ™ëåZûUÜ?‘ê3¿èOíÿÕ˜±°O£ó?'Ñ’\gEêùË:]ç6ºœ[‘Ѳì?j¤4þ—ìyy[-µÌõ+kñóm¯êÿ´q½5ÓôΫ‡Õ1ý|WiÙm64²Úž>•9Y¶Êmþ¿üe¢Z8³Ã-ðGÍ i8ýMÄ’IH…$’I)ÿÐõT’CÉȣܜ‡Šè¡Ž²ÛÃZѽïwõZR£Ôqzf+²²œC c ž÷¸íªŠ*o¾Û­²ºØ±N-ýFúsº»@}õ10$:¬w~eÖÇèòºƒÓ1‡üÞø\¼…Šr:•ìêÙÔº‡Á–}*+pÛêÚÏÍê9Lþ{þâQú•ö®Ü‘uLž¡c†Kim·KmΟe¶ö‡5·5™¬­ûê®ö³þÕý*ÈçyÓ’GÃóä¿›¿øô×¾gZ®Œúº~5/ÎË{¿O]%¿¡g´ºÜ‡¼íc¶Ùú*¿ÂÿÁ¨Õ=7«œy?cêu¸ṵ̈ ™T7Ûµ•çTÇgUÿvªÏÿOZ®çáý]Ç«§ã ®£‘±­Ço±öÀw¾çµ¶ý—­eßdgôZš¯ÑÅ®ÛiÒÏÂgQÁ~=…Ô9ᯮÏϦÖݱÛ}\kØË>Ÿ¦ÿæÿ›T=1¡U iÄ~i¬àþªZ™¶u6Y^HÅWYe–Xöµ”œãëU‰uný_·óñlþwÿBfôwc×öϬL\ÏJÚ/õHª‹+ÈÜmmÆÇWSm¯sh§#¬?ÐUüßé=*j[Ö:þc,©¾ŸN·šrHß{ï¬MŒ¥ÙLû6=Îs‹cêͶÜ[©»ô ÆvPxËÄÂý)5šòóÈ·Šl±®¿1ïö{rhýOÒÞÌœKѲ›”‘‰Ž(LJæ®-{$¿{ý_<9yʉÐKXþ‘“¶Ú>£—ŸR×õ]­uqU7d׵쪻ð©u.{>Ïê1Þ§ôŒ¬«ö~“Ø\î«E½Kì|,Ñ‹‘IÆÁ´âz eN v͘¶,v³/öYÕºµ5ŸDÔöYw¸=öï­—ìfí–3ÔÙüÕöÞqÁèÄ®ë5·ôMŠÁ ­­{_nÍï§×Èý/鯲ÛYè'ðÆ{ÊrÂË—¦\<0‹,y~>¡Ð˜CW¨³­t‚Ð2½ZZ×µbÞÆ‡0‹+~û)ôGcw·Þ¡_JèÝ@SnM«»cq2‹ëc_êXÖ¾×b×e¢ÙG¡èÿ‚YßkÌÊ˽Ý/«a–¿cqñ½FØC@«Õ²ëföÞÏÏõoæ~C,d²æÙÕ:[o °œüY®Êý¯·%þ­v}·ÓÅÚÚëþkí_Û®•Ãä'(H‹áâõj?ÍÊ8{÷ÙŒoļ:7w¦áåb²Ó—”ìÛ­x"×H¶´2ºÛ[œö³ÝêÛfÏôŸðh}B¦gåctè‘C›™}­%¶TƸýš¼k™úL|Œëëþr›+·ìxù?é+TpºŽ`vÌ{šÆ‰8™¥µä‚?ž§5’ÛîÆšëÈfUWzV?Ò·¨2ßSÓ?O®ž¡Óò±îµõgd¸YÕceÕXí›+c.õ?V¦Š«ÃÅ»ô¸×U_©ôí±Fa8Hä‘ÔUJ#äâôñðzxx?ô¢Ò4­Òþ¯l¯´cWeٹᔚéë5ÔÛ3±Zï¦üšZÝ™Ô6¿ûWElËǯÕý¾ì´j-Ï¿6›®s1º†;X1úÝD Lšmþ‰sý½A¹v¿ÛEvo®ÏS'ì6ú>½u,ž•“éu7dÞëËÝE£cªö¹ßgeþ†Ö_m[}96~‡gÛ-·ÑûFJ¹™ƒ@Ƕ‡SëôÛK•†Á%…Ó¿¨tÆÃ¶\Ýï~F#éæ3Ô²šýVœÉñæ”%"?Íæ‡ãû¿ú­¯“ ˜tù ö7ª ÃeWölìxûF1; :};¨²ëâݵÞû?à®®œš®¢«Ë€Âêy/{0òri¯«b±×ôž¤H5ߎíîjmO»ÓÁÊǦ½Ì»#Öº¿Ö§âz˱éLu,1sê8Ù5¸Õ—Šâênh¥.s~ŸÒm”ÛþÊrú;Vß-Ì{ ‰PÉëå˜ÿ9êÿÐj‘Mä’IXCÿÑõUÍuÊ:¿\wHmu'ÓÉˤ>fAý&%o«óñ1³.×7f_Øëÿ´ù5­n¹Ôÿet¬ŒàÏVÚÚE_¿u…´âÓÿ]Ȳº÷.tê} ë¼›o¨ºÃ˜Âk»Ö°ú¹YTßQÐü‹œ÷û³üój—Ä3Œxø"YlXÞ0ý"Û˜Ž eÄz~ïï;X/ʲ¯Ù8Øî}ÝF«VKœY@{aî¢Ûª=–¾ŸVÍ–7Ó¿ù¯Ò~—ÓŸgúµ‚+Ãk²³óÑ]n;}{ÚÖVûöËYêú{_c?ŸÊôýïþvä^·Ô°Èfs]Ô1‰´ÒÐ2X ?Ò1+ÛVcßð¸^žGýѱnaæâgc·+ædPÿ£c ‰ZïήÖî÷ÖÿÒ1b’c+‹ܸO¦réÅû¿ÝfÇ–Àßæ<ÑV>/Õìggå»íW$zn{cÔºÇ]ؘM>ïMöï·Ñ¯þ±E¢ÆZ##;+ ¹Y­©§!Þ®3)ÜcÀ×ã2ýßK%¬wé}?Ñ©ät¾Ÿ•Ü›è^ÖŠÃ¥ÂZ×ŒŠ˜ö±Ím¾•íõ¨õ?™·ù¥Ö:ÍùÙ…ƒaªŠœY•–ÃsÆ–bâ=¿ÍúC+-¿Í?õ|oÓú¶ÐGëtý-ç9~ˆýسcÇ,’€²ÕëÙ4·«ïéa¹YNg¡Ôke,5ëvF[Ygë”î}Ä©¶äYgé=³Ò¨;#'ú~M—Í—cÓý]µ?í7èFUŸñi[~MÇe{[]u€*ǯkL5žÆ=ÌkYêYú[¬w§þšÅLÓÖsÚÖÙkq±ÞǶÑ[\Ç8º_mAÇí öúUäSe˜õ>Ñ_øEfÀè+N9|燳¯‹ qDc7šCôB<_ËôÛ$ôΙuôÒÊ٥㶹í¸ú«ßío¹þ¢!êØch~HcœCKLµÄ¹¾›w6·±Ì{,÷~Us:?Meøù9 ¦†ÝE¯îM[½*ÇÚ7¾”Ùgø_OÔþ{Ô±á6ô'ÛëYëÚïU÷˱ïØ^ñ]ræ³{k®ŠÛ^ïúïªõ ‡µ9X ¶^)#íŠÞòê߾Žûr]~=.,±öl±­p!¾›·oý&ç7Ú£Vic_Ó2,ÅiÌkêã}Í?e¼¾½Žÿº¯ÆÿŒUkoAÉÇwNĽ¸â×ïu5ŸNÒïäÕ–Íÿñ{+ýÊýOÓJÿÚ¸ºÁi»<ÛsíF:ÇŸA­už»îÙc›ú¦ÿÙÔWOô¤¸FÈ×äÈ7ÿ ë(‰ Öxõ1—÷¾eò¨ªË½JË:}ž˜ª¬ÜgÆ3}Ú?ÜvEžµõ~±oÙÿYÈô²½k‘l·"œª±º®úî­ÓƒÕhX\6·ßM׾Ͷý¢›*ô.Æý6e?ÎY<¥^Òw8;~+Ü×8´{à?ÃQù›ö~úV´bRêlÜî‘cK-k\Cñštõh{IöôµÿÚ/ç+ýSÕ¡‘NjÛôõT¿õóygŠ<&pïëãÔ±²3±±­ª›œàû, kŸ¥­/°TúëÜÿçvz?ðˆù}««õL½HvOÙë'³1XÜg4'íŸmrÆÞÌŸ¬õš¬¥Ã«7šœÿ\¢ül¦z¬£Ñõ¯³cþÏwýkÕõ–7!—™ÉwÊ&:S§þåsdÏ;ùq‚?ÄÿÐÝkm¦’ÁuŒ¨Øí•‡¸7sÿÑ׸ûßü–¨?·!Ùx¶¿4ˆvM1/±­Ë¡ÿ Í­¿÷až£?ÀÝJÎËõ,úʼn[+õ[C– Ûv‡ŸNËaÿ™Oê϶ªžÿµ3Z׸€9&>õTƒ²Ÿ¯è°\±˜Ê2"D^~©õ«6¬ÙÙ,™92ÔñœEUãÎËrv?~FKœæãQë~«U×zßm³ÑØè†âýŸŒvúE˜ïhÜ6í¦ÆðžŸÓÿ„QÀ´ÝëutËyŸ j‹©Æþmß§ÌwþLzs¨3ÓÜ1œïwÙ\ Æ|έ¥žüG?ý6èÿîµÊÔ`#–òýÞ?ýÜøwÅñá'1›Cš Cþñ©^+1ÇÛú§¥WÙkkXûl`kZúýKw»&û“‘è7Ñõ?Oé~±jÙ™yº’üŽÅ&íßL@Dl:U•Œe¬ÙsE¬<±à8šùJ‹r°¢¸ÙKGôK\Kô÷î~3¿ÿSù8¥& (ïo­èkê–ú›`ýÙ»tlú_šŠ"Çe¹1Â_6‡hËiÿƒ&ÓêÄê5ž£Š,ûKA­y¦ÓcòíìÆ»è1÷íõ>Ïú?ZÌ+I{¹-©È{nȽìnÆ’Iµû¿7رM§ãžÆ¹ÁŒª›Í•7]Û]íûF/ó”#ÕÇÿ®¹™œ§ŠñÞ$bÐùÜ×ûS˜Í®·wú,OJøl…ÝrN\1ùéKôªçå”yy xÎÜ:G ýÿûå¨ê­Á²Î™ŒÓ–OÙ@xmu>¾÷û¿¡ÿ9MT³#'ìÖz›=ñîË{®¾Ö¿1Í ©ûbšÜÏPÐæc;Ôõ=Ýgé²¾Ñw¿ô~ŸÐE̤œ-¸Ì ³.Å­£kCë—úMc6µ­¾¿Wþ¼“]Œmµ®Æ‡Ö|ZὟô\¯`äð⑘C¼ÏýÏî°òæ98¸‡Ê}1ýÆ_»ý×?¦=ùxvâ]cÞø Þâ^Fòæúvk¿Ö¥Íßv-¶½þ¿èÿCTº3î4[U­ƒUŽíA1±Þêͱ»š¡ÿ£ýÏô„˾ÚsðÜûcàêMd˜ÞHÚývïQŒ÷ÿà¤HŒL\ðZâróì“Q°ÄAõ.m-=›>•¿ñU[þ Yd„Ç_æÿW+ý(ËäÿÐ]¿«¹¿`úÃ…q1VQv äÏø_Òâ;OÝË«Ðgþ^”¼ƒ-Ö·Û(%·RßZ’9RFUø-,^­ûCöwí=ߪú?ißÿ·ÖÝþbi Òæ±ðó˜f?ÊJãB\?ôxÿÓ¿€óf#/:œ—[’ëöÛ•ÿ£“Ó‰M9d°¼Ùl—oqxÅ®y¯|º½þMú{=:«gø5G¥egŽ•‚ÓÜöŒjC_ëÒÝÃÓg¿kŽæîV~ÕÔòµßûJæò œ“7T¥~¸u—÷œI‰qÌØõ~¨÷EÓðòqº†u–ÖWÇ¡p°Øís¶Õg¬çä}[ÿÑ9_ó~‚±Ôï~7LÌȬŕÐóYþY_ø+Ø¡ö®¥ÿ•§ÿbiU:­ùÏÁs.Âôj}¸í}ž½v@9ƒ¬nr"2žHñpêcë‰Óåýä€e8“üGÍûäÙ›zN{+®Ë[(c)fÑ·s%—7ØÏÒ{©µR®–ô®~Mf]õ×`¦,yû>.Üf{1½7äúÖÒÏgÚ=e?¬ÖUöQk«!ðc¶‚Öî6Ñ.g»óþƒ=êôuôå¯õ€gå±û™0ã–ÙòÂþ´e8Gþé¥Ul¥¬ª½+¨3àѵ«"ÌL¬lg¼Ã==ÄÆ£Õ½ƒ!Žu¡ìcÛºŠíoè]_ó^ÿê-uKªdߎöZi¤5î¸×é›t۵ͫ'ùÊ›?¤ôýêÔIºîú3{|RÐ=8ý?Ôù¾‰Ì5<¹®¶¡I.tú±÷æ¿Ûíý7¨úØ‚î,ôšÚšÆ}¤°‡>I´²=ÍÛíô6·wþŒV2:Ëiuí4ümîµ»À†7Óô-ÇIõÙµ¿àýêMê66ƒŽ‘êÙSØëšÖHVç¹·þ“w¬ÏѶ´ï^ì$}§§å—ïmò|ÜQÿ˜‹ö^[²Ÿ}—n/­ÌÜZïuBŸEß¡s½&[úMþ§ü'£ê¡·£åú“Ÿ^ÑI¨Vlj77!»Ï¢êŸìk½Gú¤ÿFƒoTêM§"¶¸ˬ·݃ÛMFæÜ×7o§¹®Çc=ÿ÷!jãdï¿&›,i{- ª¹hvßN» ún÷9é!Ûýåc-Ç£ÅûÙ}Uÿ%Åe”ãÓ]›M•±­vÁ ‘û€þj±ÒŒb»ÿÚKC{þŽv7ù¸÷WWýi K¦i™šŽ;¾eoýK€úψGÄ`d~„¸G÷Lô7Ææ8: ƒ"|–~ Et;q‹uÔ7ú¬{OþeJÐ]4†ÍVíuÖ9ÏÖ²§Zr öìØú¶3÷=OOôµúŒÛof^sjÆuíûDïVÁ&œmÍÛsšåh49YÔÁîÓÕÿGû¬zÌ·×-û;ÃÈÜZÒèÎý›,vÝþÆ2ÚPúŤ[†}Jª8–:è U•¾ÂúmýZç³Òý_ô¶³ôžÏÑ— çÜÖŠñ¬¡í$‡‹hx÷5Õ9¯­Ö5¯ö?ÙþŽßÒ$á{«®·`ÚEM k¾Õ[]¾ŸºÊìc½¿MÔÁ—CˆG^þ‰o€=P†—AÂ{®‡í¿úê7~wìÿ±kþLÿª\£.ËnÐÜØzô蜷w?ÿ™ôýßiKpÿË8ôýOæÿ“¿è!-Ç›8AÉËš:d£!¹õªÿÿÔ½ÒÚ[Ó±jüêkçIv3¿éT§‹™‰–\1nmþ™û&íÁ¾è÷{«±¾ÏÜSôÝFoQÄtnÇμéû¹u:¿ègmY”:–}cʯx¹Íc¡°2mfC}v·Ö¶ºîüÏÖkõ=OÑó¹q—½{,põÖjkXÝÆÝ[þvMìý®õúRÏWý*Õö74èæøƒ£›þjdÏ ã04ôÎ?ËûÈ—¦qzdÞµXÈéùm;lh2e»ƒ·Uµ¯ý7¢çú?£±Ÿé?F«ç—ÝÐ}x¥,« µs»ÍvK+ªÀÛ+k[VEm­íV:s^Ì!ˆ÷8[†]†÷ú1·æÞ³ øÙ z¯Ól®œ»ðq°lf5vYëdZýæËãôε¯sÞêï­¿OÕõ?OgÙê¢õ~&†šð1ýÖLr–9 GæÃ1’'§£ÿEj˜5’WØÙXÈËcÊH‡¹ž¡iq nÏkŸî~ß ‹è;]‚é";/ ´»úôÿE¿þ¿øT£Šü¼+q˜Z×?ió·ÚöÙîÙïüÏÍVbA£z¾¢cæ#ÌrÃ6&'8Dëë­!/îäôÉz(¦ã}Ðû½r`Èfßk>…-ªÆWú&ïýßz%´Pks­¥`&×K¥À;·iÝnÑýugH²ú6^)ÜÊîe@\Ö¾Ã[ª·uþ¥¾ÍÜn÷u ZÚϽÙ%ÙV1í YS¨­¦ç;Ò¶–½íôO¿þ)>ý&3–qˆ&F#}å“Õ?OèÊNȪ§Ö©»Ó¡`Û=ö5ÌsÂ;ùÖ~ÿó‰¾Í@»×ôk¥ØÝülþr7ýb ÞŽàÿP=¬¸—{7o v?Ù·èý ¿LÒ°ƒKØòÒç–˜¯è ­î ÙV×Ùùÿú1hYa)Ê@Kˆ³ë»®–UÂÝSé{Cr²ôs¾uãµ´8éÿ VBϰmªˆûMçeðŸs¿à±™úkõ"&p·¸Øxï»”º²öÁsvúa›™-sŸ×[üßé=oæýéËËÇy}Ì*8Ƽ'Ž^£ÿ9B²ëè¶ãxÈ®ë ÿ8,†ïß¶ÌŠvØÃ[¿Ew³ù¯N¯ ‰Šw}¦Ñ¨»*ç4ÿ%„b7ÿm‘LtÌ'دu,iû­££Ôî{ì¹õÔÝï·ÙþG³cÕ;½x¸Ò?ûvoz²¼”'ôc_áKÿEG—•öPÇÝ`~ð'{Fêª c^íÙý_üÝž¡Õ.¾ŒVº‡zw:Æ0‚ÞeÏadÿ'éäÕ\úêÌê¸øÎg©è—ìpÜã¾çYúOж´Ú{=_WùÚ?D‹Ôîê8Xö5Ž©Î7Íq2ÏsÿI·c=¬vÍ–³þô_¢¸–ħ"2yŒpéê>™ÎtšªÛpŠÛû5ŸøÓÌ{½·g×ý¥ÿP¹Ü»·Þ>•u½íópiôÿγjôŸØ£þkþÁݧØ~ÿþ³ömèKpÁÎKõÜ´¯Åÿ:ÿÿÕèþ²ãý—ë n úž7iþ{Û¿7uØ™_æ`¬Lîš/ËÇˤVËXñö—ʆßcö7}ÎkY²–¹ÌÙþ“ô~§Ö¾ŸvoIu˜­/ÌÁ{rñX&^êýLý Å~F'ý}sY]õ²Úú­h²·x±Ã{þaXß„±æc¶A¯÷£é—üÞ7‰†Q~˜üG¥f%™âßUÞ…˜¶ï.Ø\Â6ÙO¸í¯Ôo·Õúh×ßF=.¿"ÆÓK>•0Ñàßå;÷Xßzª3Ý“íénCf–òF3~;ÏÒgXÇæñ?Eþ“.¥WÔ«ª×öÿÒÚ@mY÷¡®{xçgرi{ÛöoÑd~ÐõžõqÿXTÄ$t—èƒè=5„ Ò_¢>_ÓeeöW˜sÝC±ð. ¢ûn"·îkœÜL×ãmõ(Çý'Ùl³!ì»Óº›,Ǫ¼tÝOûëΡûf)^vXÝëÌW}¾Ês~ÏS?Jû}KjÉû=-W5®k™cCÚàZö›½ßàžúè­ÿ®ÿ=K*±›Õ02›v'P¨RÖ Ö7$KÃ}1ê·Ö÷RýÙlªý™5úôÿ…Vá*ù}QýßÒƒ©ðߊæäcî )à'ÕûЗèµRW,èmv.EÔ7³E`'ÖÛ‘ÿ³jø}B¬šqÆF;½jí³y¦Á‘¥»v} ý?´~ÿæ)a(̈ÄúBôœ¿üaäsÇ ’ý Cü/šPR–íx¥7d¸K1ÙÈã{÷{i§÷¯»ôh®ÀsXëró^*`.¢ÁCCZ78ºÏÖrí»+Qûn¬ ¶ç–׎Cêu–ŽÙ‘nC}oYõÚßA÷úž«ì§ý*±ôxL߈c‰¿ÞŸýÌ#ó'ª†aUffQÜý¿¦¶¶¹Á•ƒüÆ;c{™¿é»éä[úK6~ÓN997¿©X÷WMŒÓC]¾§7é šÝìs?–ÇUêúþ·é?í; ΟfNc³2Àkæ¦í6×YöºŸ»Òýèmÿ‘êâe~‡ÒV2òŸ[¾Ç†Z2Ã[.‰f;ö[c>«·ú'øOç,ý[ùË1Ôb<ƒ™)JDÎdï~2(srü¦WUFú°žÖnÛúê~Žçâ1þ½µzµ~šÊ?ÂÕé£S}9 /¥ûÃ׈-sOî[SöÙSÿã­âtì|.’쌬{×µŸdÞømŒ±Íu·3.¿Sü¥üí먒ٿ["Ÿ[Ñ¥‰Ó,êOÞ–mΆå ]5–Ù”÷mþy¯ôuã[ú/º¯ð~¢±,1'‹åùèÈÿU~lâ» ³ßü¾ÍEw?,ÂÙ.k\æ^Ú©w­s+ÛÿžÿœU:c™•—“ÔY¯ ¬0ⱎ÷YKM®ô][ÓSg«O³ü/AÕúVèÅÖd³í8M×íøí'k@Ü]›ˆÝöãíçèõñ¿Ò}‘Pì!í³Ü×´‚?œ×7Úÿë(4-ÜsÇ—†Xä bxŒkÕÆzɱÓ0ÎWéø Kl½·]¤GŒ»7ÿ&ËÙ‹ÿ¡ Ô—õ§‡¿+­³=WÓÉôÔ1lÏŶæf²:uM}£,Ù¸ÔÆ Í£ßúÆc[H÷dXÏSÖõ)ý/¥½ DHôÌ|Ð:z¿©ÿz¢,’=2ÇúßÕb󕇒Ìj[gQ©í}¢ Aɦ¦mgÓµÌnu£ýYsÙÿ —é§#¦õf?Á™[õip-¹› sE´»Ò˧k÷}&ìRÈ¡´Ùx¶Œ®­ÆXÚØ-ºªÅvÙ…Ó±ë¿õve9Úûr¿U£#';"ïæëS¾Š²2êÂêXÖäo­ïƳ2ºEí5ú_¢£;¥Yèdzž¥c1þË—G¡újí®ÏQhÃý¯pþÍ!½ÿ/ë6H—«ûÜ-VtlZ²Ù•SœÇ6ï]ì1µÎÛ{?3ÒÛý+þôuUüÒ|ÏùKÿ åÕa-7ý[Í­Ö6ŒŒÊ½"ö+ÉkKƒ^ g×}ßFÆÿ†X]RŒús°¶gz޲œ×;¡;pÚÇ1Žßì÷)¹hN\Æ0M@CòÉ›”„Ç3ŽR7\_ÞùdÛpkšZà××4ðC†×4ÿYª¿§ƒÓikîx©£‹òºÂv¶¯m¶îµîôke^àÙ³ÓUÆ?V·Ù®~{ð7?2šk¢íõk¬e?¿“Fúv~“ÕôÕÜ^ˆÊkÍûE4ääµÏ¬Ú\ë6×gÙï6åÞç=›]û®ôÿë~§§­7©”jëO^¿à»>à;/ñZ–fä]íÆ­'&Öiÿi±¬þkwýÈËÿ­ã-«ßSîê½.ÌÜl‘‡SŸhÆa`´Ûki»'>ÛfݶÛUµþ‹ÓÉÙú__þÓÖÆî™Ó¨k°œÌì²÷°ºÀ@ôþÐÚËú ~u9ߤÿØ•›‡Õ:§KvCú5卑õ».üF:×¶ªßž.mŸcõ^vÛö{jͶ¿Òþ“ùõ$áÁŒœgƒ]e/L¥àædF†˜Vì¬èØìçÑFP[½Ç+Ž;šÈe¾µÖ~ŠšÿX³eJÿ^ú­“Ññp¯Ïµ¹mÉqnIh ¯'éâý’ÏfCi{=\_Z×úÏÈô?šûO¢µ0.=#®þÖÊuv»¨ZÜ~£w£]^Ÿªí”[C™ÕCr¾ÏÌ‹r_e~ŽE×z˜ËSë7U¢Þ‰‚湤ìêYZöÖߤì*›kl©ù··÷™gØéý=¿¥û5vG.fdÇACæïþõªPÊ2G¨ë_½o5õ{¨uâü°õK>-‚¶c\FX6´7í·¬~Ý^#YéÕUUæWú^êÿÑÙnìNÔ®Ùi?Vz¶S¶úµE˜Y6<Æê\öÕOÛœÖþ{0z‡¬ÿûWS¾šÏªŽé·`ýa§«ºH,fE¬®›+©‰•mL¡õ»ôž…¿dÿµõ]þ‘SÂÌO³äî·©¶œ®¹øÆÇ· æRï§k±½_ÔgóßÎþŸÔP“r$G£. ÈÆ áËŽýq:oò—¾ÃÃÇÁħ žž>3UL’a¬7;ÜïhF\·Ô¶æN[ª½î赇M„ÙÔK2Ý‹uŸ¥û nÛ‹]O¶ÿÓÓ‘èz4z~§R›M_o×íØß‚ÿEÿ×õT’I8ßXºíJÙ‘‹`ÇêxÀýš÷ cšu³-÷Y‰vßøÊlýbŸÒV¹zì³{ê¾§ceÑ#æ\Â~‹Úñí»ÈýM£·þïR¦z Íë] «ÔÁkFM».¨ÖOÓhÜË)·ü>=Ͳ‹¿sÙZ«Íò‘Î,zr ¥ÿs6c—ŽaÚciÜÉâk鸵æ;2°[kÉu‚IyklvâïæÙcÙ]LÙWý·O¦<ÐrïfÛsCšñ¹Ž´Z–Úߣm85Ý_7ÿÏú]; þôUìÜn­Ó­ô2°Ý‘mŽ-ij®4ÞïðU¼þ‘Ý6Û7~“í«UúK+Ì»ÒzCn8{Üne_I¶²ÝÌ{ñì麛tö~Ð˯ô;?˜éؽŸð*·!Éd—1ŘÅUÅúGôxOõZPÅ8HÏ 7 !zÜ¿Gü!³¥u,kñU¼¶Œªnci{>Êöä:ÌL×;7¥ìöÖ2žŸ•ƒ¿ùºqÿšE»'&þ­cÙ‘n7Iqª«1›ê¼dZßÓdßCÎulm Â{1_]›ò2}_})ëÁêý.G¥œlœv3ÛE¬ôž^ÚÜßUÏ©í­ößs(õþ}öÿ8™ù=?;*Œ~§Òî«-î5cÝe\Hg¥ŸI¯&ÿI›?Gÿ þlÏ L%pã:ÿè̼`›EÃÑ/ïp§¯©µÍq£}VÜQ¨ì›êÌm6TßI¿£²æÅ.­çôË2ðvåãÙX§)¯-º²!ÇmsÚÿnöµûU¾£SGTêVÜêqë¯Ò¶ë’_oO¹ù—]KóÝêØÏõqª©Îû>NG¯fÏô¸uì ­Ë=C8_½¹bê[/¢ÖY‹‹gçþr©Ëâöó‚\~Ī¿½™— ŒrÆVw<1?Ýý' §õvu\L.›–Y‘ÒØ1nuNÝc¬ôëè÷g6·º¿ÒW—ˆú2?Wû¥ÿr±6BY¿¢`RÚ±ßkæSEV¼Ü×½ÛÏèeÑê7ß¡ê=Šå9™™½O«e:¾¥Š ØÌ¯µšß[Nfï³àú¸ø•²ßÒä>ÚýSùõ üï«6ZN[Û{šÐËMa ,ÛVK+w¥‘éý«}mÈõ¿ÃÂ(þõÁÌ ¸Äö”x?Dy:ðÄF2 ‰zÔœrqqzÏìî²íõbÞ*ϯö;sl­¯«ÓÈ®ºnnÛ-ôïÇýNG§mXÞ«ÿV»¥¯«Y“ÓË~¯ãá×Ñh{ØÎ[aËc\ædQçщöìgz´Uèßu·ìŒFëiY}C!÷ôK*ÂÁ~>6F3Ãn`¦£[.m·]éb‹_UT:¿W#ô>«)ý*»‰GIÆwN£¤f¡“SloUÊǃŽjp¿"†¾Æï§ÖÇͲªz}LµùaúÿàT¹y©æÄrX„ñšáù¸£%þ ¦°ãä#+Ÿ­=;þ’6·ü€þ‘ë~À};6f9Ö2íãec£7v]íúûE¾–GóTaú¬ª¯µ÷—tŽŒÖcãS ¿&¿cjk‹ýjñšÀÝ·þuW·ÔeÖzÿÍ[W¨•‚Æç7Ï}4ßcó0l¯oèò6¼u _Ó¶ê¿M]ögc~‹ô®z?ÑÔ®¾¬ o²tÚ[¾§²¦ÒÑìc­»óSn½Õ1öýŸí­»èõ,«×õ˜æ'ÈlGò Ìqá…j:JDñN_Ôƒ+kÂé˜t ñ…Å$b´€\׺ë=^×ú7Ù]vú;6z·~¯ú4>‘Òòú¯PuV<³¨ÚÉËɨAÂijùº1ÜẬÜêØßF«}Kq?O—ÿ‘,LÞ¡ÔK1Yêu;¯½ƒÓéøïs/®œ–T÷Q•œÇ±·cQ»íÿ¤[F/ó½çIé8}# bbAq²ëžw[m®þw'"Ïð—[ÿ¨ëôꮺӉ`æy€=0Ó¥ÐÿÐÛØôbãÕ‹ŽÁ]1µÕXá¬hØÆê´"¤’kAÿÐõT’I)$’IM^©Ó©ê;'§^÷×N]nªÇTí¯ pÚ펇Ô®;ªý^ê¸äÝk憆uNš6ä±­ géú[±ÿ£«Õé–zÞ—«]tz÷zÚH‰²ÙÀK~œbuN¨l}u6¾µUaζÌx§&¶·vöe`¼Têò}Íe8ÿffÿFÏÏV›õ‹ší¶ú²q~ÍWÚ,mµ ±¸Þ›¿u–}¤ú5îe^¦Å×õ‰Òz oÄ®÷°Ev¹±k5Ýú†m¾ŸúÕŒY¶ýT{dàõLª@!Ì«#fem îæ²ÌߤÝßÓT£1þZµåÊö£ÿ7þùä*éÝ6ÊK°‚Ú sì¦Û]Õ½®s÷äôÿQ¸_"‰ý[íøÔ_ú:}{2VçOe5õ®ƒV;·SK2k¬îÜv²Š*f÷~þÁïPÎú‹Ÿ}‚ç“föØ÷ nÄuŽnã¶û*¿7Ô­Î~뱞¯ç«]êÇQÁêx¹ÆÂÃÅÆ7½íźÛ\û.eTnÙ~=;=´{ßê¦ÜjT¿5цN8Y¿Ýìãô|\lž…Ò}z›i«‡W¼NÓé´iýoÎJ®«Ðñr¨Á  ,ºß³VI­¡Ísñ›ïsjý¬Ûq«¶¿Qž§«ZÒÁú¯õ›]€S)m…·¼Á±¯s”{·÷Ѫú—š-6?;özÖ;Œ°Ød:ï[6î¡ú_s¿Ié,ÁÊä$ñ /OS®y¬`úú\JzænCwQÒ²‹Ý>Žâ í6V÷^önô×Òïëÿì?®Ý7ªgåZ}w«žÀYÒñk6äR\gõÛ[¶Œ7û½'³2Úü×óvúÞ¯U_ÔÞ”ísìÈêfwmË´šôìì,³à¿ûx«g–ãâÔÊ(fŒª¦†1£ù,`kZ¥'Ò¡ýÝçOþõŠ\Ü¿Fôýïûؼ_PèXrp>ÛeuÑöK+ʯ§Uúl‹=' ÇfG¥FCªõk®Œ:Ÿê?ô/Î}XŸ êî_WÉûa¤ôÜrÃ_Û^ÀÌë?G·‚ì ]îýc'õÏôXØÿÏ®á%fŒ#ÃAïjC‹æ6Oé}ø8?˜˜U h¬CXßôž÷:_ew¾Ëlý%¯÷ج$’,*I$’SÿÙÿí^¸Photoshop 3.08BIM8BIM%F ò‰&¸VÚ°œ¡°§w8BIMê"× com.apple.print.PageFormat.FormattingPrinter com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.FormattingPrinter i865 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 819.21260515348172 575.9999831792876 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2007-07-13T10:56:58Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -8.5039370078740166 -9.6377952755905518 833.38583349993849 585.63777845487823 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2007-07-13T10:56:58Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMCustomPaper com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMCustomPaper com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 819.21260515348172 575.9999831792876 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -8.5039370078740166 -9.6377952755905518 833.38583349993849 585.63777845487823 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName iso-a4 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-10-11T08:11:41Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMéxHH4@ÿøÿ÷BJg{àHHØ(dÿh 8BIMí––8BIM&?€8BIM 8BIM8BIMó 8BIM 8BIM' 8BIMõH/fflff/ff¡™š2Z5-8BIMøpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè8BIM@@8BIM8BIM_,'SySync diagram_plugin',nullboundsObjcRct1Top longLeftlongBtomlong,Rghtlong'slicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong,Rghtlong'urlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?ð8BIM8BIM 5p Ø'5TÿØÿàJFIFHHÿí Adobe_CMÿîAdobed€ÿÛ„            ÿÀ "ÿÝ ÿÄ?   3!1AQa"q2‘¡±B#$RÁb34r‚ÑC%’Sðáñcs5¢²ƒ&D“TdE£t6ÒUâeò³„ÃÓuãóF'”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö7GWgw‡—§·Ç×ç÷5!1AQaq"2‘¡±B#ÁRÑð3$bár‚’CScs4ñ%¢²ƒ&5ÂÒD“T£dEU6teâò³„ÃÓuãóF”¤…´•ÄÔäô¥µÅÕåõVfv†–¦¶ÆÖæö'7GWgw‡—§·ÇÿÚ ?õT’I)$²2qñh~FM¬¢ŠÆë-±Á­hñsÝíjJJ¨õ·Ó:ac2ï ºßæqØ×[}Ÿñ8´6Ì‹vþvʽ‹¨uN¿ÔñmwF¬àÐãSîhnVAiµâÕxôºuy-k««/>«ný'ô ÿMÓOFÅé®ê˜Cn=Õ‹ò]ºÛÞÖ‡XÿµZóv]÷ÓúJý+ÿMÿ¡T¹ˆcÆ*Ý•ðú~XËÆI´þ¯×òÏêxUôúŒEÙîõ-ˆ—“ðŸ·þÞê8öÀ žŸÔ2#íý[.î¿ì}‘ŸnÛý|û;~°ÝxôŒ+2²‹CÝ¿o£^æ—µ—dÓcè{Üæú? ½þŸñOS8?YsNìœÚ°j1ñªõ$n­Ößiß¿nÏæmÿÒk?/7ÍKæÈ0ÝŽ‡þoEÔ» t§‘AÉ’ì»mÈÔ­læ]wÒwµfgô¯«x½oÕÀÀª§âf–UKûüGùÆµŽ±»­Ùÿ]Væíº›ºRÊÈv3ªÈ½ÁµîÅý'«èÙ»Ûþ÷îÿ®Ö£×*¦îµÓ[mlµŸfÍ!¯k^ߥÓáÀ<9ªvBVrO'¦w¬¿súË¡)ínm?-´Vѱ2Ö±÷eôëYF¿¡vE5U‰f5Ž»)”Ûêƒúÿ„°Ì³„ÌwåeõNvKò=WeÔÓk­f>1ýªÌÛ}}•~—Ò¦­}_Ízõ1C'¦}^cE™XxUµÇh±õVÏtǪ;Ö;ó’§Ö¹Ý#7.†ÔvŸFÛ_WýnޤܬK©ÓùÌzý/øDèó¤ $üÑâàÿ ×8ÿãlÇ•–ÀÄ—W§}bê·4œK°úíM–×» & j¿s+¼äce~ƒ&ÏÀ§{Ö¶Ö>›“Ü;‹ðsŸ;pòÛéXèŸèî—cæ}ûE~Jãò:m–rñ1ú‹víõqç( ú@»§äÚßåY‚šœœ›v ëTwIêM5æ5¬aÛk«¹—ý¯ôŸf«íx¾­¡õ™ëåZûUÜ?‘ê3¿èOíÿÕ˜±°O£ó?'Ñ’\gEêùË:]ç6ºœ[‘Ѳì?j¤4þ—ìyy[-µÌõ+kñóm¯êÿ´q½5ÓôΫ‡Õ1ý|WiÙm64²Úž>•9Y¶Êmþ¿üe¢Z8³Ã-ðGÍ i8ýMÄ’IH…$’I)ÿÐõT’CÉȣܜ‡Šè¡Ž²ÛÃZѽïwõZR£Ôqzf+²²œC c ž÷¸íªŠ*o¾Û­²ºØ±N-ýFúsº»@}õ10$:¬w~eÖÇèòºƒÓ1‡üÞø\¼…Šr:•ìêÙÔº‡Á–}*+pÛêÚÏÍê9Lþ{þâQú•ö®Ü‘uLž¡c†Kim·KmΟe¶ö‡5·5™¬­ûê®ö³þÕý*ÈçyÓ’GÃóä¿›¿øô×¾gZ®Œúº~5/ÎË{¿O]%¿¡g´ºÜ‡¼íc¶Ùú*¿ÂÿÁ¨Õ=7«œy?cêu¸ṵ̈ ™T7Ûµ•çTÇgUÿvªÏÿOZ®çáý]Ç«§ã ®£‘±­Ço±öÀw¾çµ¶ý—­eßdgôZš¯ÑÅ®ÛiÒÏÂgQÁ~=…Ô9ᯮÏϦÖݱÛ}\kØË>Ÿ¦ÿæÿ›T=1¡U iÄ~i¬àþªZ™¶u6Y^HÅWYe–Xöµ”œãëU‰uný_·óñlþwÿBfôwc×öϬL\ÏJÚ/õHª‹+ÈÜmmÆÇWSm¯sh§#¬?ÐUüßé=*j[Ö:þc,©¾ŸN·šrHß{ï¬MŒ¥ÙLû6=Îs‹cêͶÜ[©»ô ÆvPxËÄÂý)5šòóÈ·Šl±®¿1ïö{rhýOÒÞÌœKѲ›”‘‰Ž(LJæ®-{$¿{ý_<9yʉÐKXþ‘“¶Ú>£—ŸR×õ]­uqU7d׵쪻ð©u.{>Ïê1Þ§ôŒ¬«ö~“Ø\î«E½Kì|,Ñ‹‘IÆÁ´âz eN v͘¶,v³/öYÕºµ5ŸDÔöYw¸=öï­—ìfí–3ÔÙüÕöÞqÁèÄ®ë5·ôMŠÁ ­­{_nÍï§×Èý/鯲ÛYè'ðÆ{ÊrÂË—¦\<0‹,y~>¡Ð˜CW¨³­t‚Ð2½ZZ×µbÞÆ‡0‹+~û)ôGcw·Þ¡_JèÝ@SnM«»cq2‹ëc_êXÖ¾×b×e¢ÙG¡èÿ‚YßkÌÊ˽Ý/«a–¿cqñ½FØC@«Õ²ëföÞÏÏõoæ~C,d²æÙÕ:[o °œüY®Êý¯·%þ­v}·ÓÅÚÚëþkí_Û®•Ãä'(H‹áâõj?ÍÊ8{÷ÙŒoļ:7w¦áåb²Ó—”ìÛ­x"×H¶´2ºÛ[œö³ÝêÛfÏôŸðh}B¦gåctè‘C›™}­%¶TƸýš¼k™úL|Œëëþr›+·ìxù?é+TpºŽ`vÌ{šÆ‰8™¥µä‚?ž§5’ÛîÆšëÈfUWzV?Ò·¨2ßSÓ?O®ž¡Óò±îµõgd¸YÕceÕXí›+c.õ?V¦Š«ÃÅ»ô¸×U_©ôí±Fa8Hä‘ÔUJ#äâôñðzxx?ô¢Ò4­Òþ¯l¯´cWeٹᔚéë5ÔÛ3±Zï¦üšZÝ™Ô6¿ûWElËǯÕý¾ì´j-Ï¿6›®s1º†;X1úÝD Lšmþ‰sý½A¹v¿ÛEvo®ÏS'ì6ú>½u,ž•“éu7dÞëËÝE£cªö¹ßgeþ†Ö_m[}96~‡gÛ-·ÑûFJ¹™ƒ@Ƕ‡SëôÛK•†Á%…Ó¿¨tÆÃ¶\Ýï~F#éæ3Ô²šýVœÉñæ”%"?Íæ‡ãû¿ú­¯“ ˜tù ö7ª ÃeWölìxûF1; :};¨²ëâݵÞû?à®®œš®¢«Ë€Âêy/{0òri¯«b±×ôž¤H5ߎíîjmO»ÓÁÊǦ½Ì»#Öº¿Ö§âz˱éLu,1sê8Ù5¸Õ—Šâênh¥.s~ŸÒm”ÛþÊrú;Vß-Ì{ ‰PÉëå˜ÿ9êÿÐj‘Mä’IXCÿÑõUÍuÊ:¿\wHmu'ÓÉˤ>fAý&%o«óñ1³.×7f_Øëÿ´ù5­n¹Ôÿet¬ŒàÏVÚÚE_¿u…´âÓÿ]Ȳº÷.tê} ë¼›o¨ºÃ˜Âk»Ö°ú¹YTßQÐü‹œ÷û³üój—Ä3Œxø"YlXÞ0ý"Û˜Ž eÄz~ïï;X/ʲ¯Ù8Øî}ÝF«VKœY@{aî¢Ûª=–¾ŸVÍ–7Ó¿ù¯Ò~—ÓŸgúµ‚+Ãk²³óÑ]n;}{ÚÖVûöËYêú{_c?ŸÊôýïþvä^·Ô°Èfs]Ô1‰´ÒÐ2X ?Ò1+ÛVcßð¸^žGýѱnaæâgc·+ædPÿ£c ‰ZïήÖî÷ÖÿÒ1b’c+‹ܸO¦réÅû¿ÝfÇ–Àßæ<ÑV>/Õìggå»íW$zn{cÔºÇ]ؘM>ïMöï·Ñ¯þ±E¢ÆZ##;+ ¹Y­©§!Þ®3)ÜcÀ×ã2ýßK%¬wé}?Ñ©ät¾Ÿ•Ü›è^ÖŠÃ¥ÂZ×ŒŠ˜ö±Ím¾•íõ¨õ?™·ù¥Ö:ÍùÙ…ƒaªŠœY•–ÃsÆ–bâ=¿ÍúC+-¿Í?õ|oÓú¶ÐGëtý-ç9~ˆýسcÇ,’€²ÕëÙ4·«ïéa¹YNg¡Ôke,5ëvF[Ygë”î}Ä©¶äYgé=³Ò¨;#'ú~M—Í—cÓý]µ?í7èFUŸñi[~MÇe{[]u€*ǯkL5žÆ=ÌkYêYú[¬w§þšÅLÓÖsÚÖÙkq±ÞǶÑ[\Ç8º_mAÇí öúUäSe˜õ>Ñ_øEfÀè+N9|燳¯‹ qDc7šCôB<_ËôÛ$ôΙuôÒÊ٥㶹í¸ú«ßío¹þ¢!êØch~HcœCKLµÄ¹¾›w6·±Ì{,÷~Us:?Meøù9 ¦†ÝE¯îM[½*ÇÚ7¾”Ùgø_OÔþ{Ô±á6ô'ÛëYëÚïU÷˱ïØ^ñ]ræ³{k®ŠÛ^ïúïªõ ‡µ9X ¶^)#íŠÞòê߾Žûr]~=.,±öl±­p!¾›·oý&ç7Ú£Vic_Ó2,ÅiÌkêã}Í?e¼¾½Žÿº¯ÆÿŒUkoAÉÇwNĽ¸â×ïu5ŸNÒïäÕ–Íÿñ{+ýÊýOÓJÿÚ¸ºÁi»<ÛsíF:ÇŸA­už»îÙc›ú¦ÿÙÔWOô¤¸FÈ×äÈ7ÿ ë(‰ Öxõ1—÷¾eò¨ªË½JË:}ž˜ª¬ÜgÆ3}Ú?ÜvEžµõ~±oÙÿYÈô²½k‘l·"œª±º®úî­ÓƒÕhX\6·ßM׾Ͷý¢›*ô.Æý6e?ÎY<¥^Òw8;~+Ü×8´{à?ÃQù›ö~úV´bRêlÜî‘cK-k\Cñštõh{IöôµÿÚ/ç+ýSÕ¡‘NjÛôõT¿õóygŠ<&pïëãÔ±²3±±­ª›œàû, kŸ¥­/°TúëÜÿçvz?ðˆù}««õL½HvOÙë'³1XÜg4'íŸmrÆÞÌŸ¬õš¬¥Ã«7šœÿ\¢ül¦z¬£Ñõ¯³cþÏwýkÕõ–7!—™ÉwÊ&:S§þåsdÏ;ùq‚?ÄÿÐÝkm¦’ÁuŒ¨Øí•‡¸7sÿÑ׸ûßü–¨?·!Ùx¶¿4ˆvM1/±­Ë¡ÿ Í­¿÷až£?ÀÝJÎËõ,úʼn[+õ[C– Ûv‡ŸNËaÿ™Oê϶ªžÿµ3Z׸€9&>õTƒ²Ÿ¯è°\±˜Ê2"D^~©õ«6¬ÙÙ,™92ÔñœEUãÎËrv?~FKœæãQë~«U×zßm³ÑØè†âýŸŒvúE˜ïhÜ6í¦ÆðžŸÓÿ„QÀ´ÝëutËyŸ j‹©Æþmß§ÌwþLzs¨3ÓÜ1œïwÙ\ Æ|έ¥žüG?ý6èÿîµÊÔ`#–òýÞ?ýÜøwÅñá'1›Cš Cþñ©^+1ÇÛú§¥WÙkkXûl`kZúýKw»&û“‘è7Ñõ?Oé~±jÙ™yº’üŽÅ&íßL@Dl:U•Œe¬ÙsE¬<±à8šùJ‹r°¢¸ÙKGôK\Kô÷î~3¿ÿSù8¥& (ïo­èkê–ú›`ýÙ»tlú_šŠ"Çe¹1Â_6‡hËiÿƒ&ÓêÄê5ž£Š,ûKA­y¦ÓcòíìÆ»è1÷íõ>Ïú?ZÌ+I{¹-©È{nȽìnÆ’Iµû¿7رM§ãžÆ¹ÁŒª›Í•7]Û]íûF/ó”#ÕÇÿ®¹™œ§ŠñÞ$bÐùÜ×ûS˜Í®·wú,OJøl…ÝrN\1ùéKôªçå”yy xÎÜ:G ýÿûå¨ê­Á²Î™ŒÓ–OÙ@xmu>¾÷û¿¡ÿ9MT³#'ìÖz›=ñîË{®¾Ö¿1Í ©ûbšÜÏPÐæc;Ôõ=Ýgé²¾Ñw¿ô~ŸÐE̤œ-¸Ì ³.Å­£kCë—úMc6µ­¾¿Wþ¼“]Œmµ®Æ‡Ö|ZὟô\¯`äð⑘C¼ÏýÏî°òæ98¸‡Ê}1ýÆ_»ý×?¦=ùxvâ]cÞø Þâ^Fòæúvk¿Ö¥Íßv-¶½þ¿èÿCTº3î4[U­ƒUŽíA1±Þêͱ»š¡ÿ£ýÏô„˾ÚsðÜûcàêMd˜ÞHÚývïQŒ÷ÿà¤HŒL\ðZâróì“Q°ÄAõ.m-=›>•¿ñU[þ Yd„Ç_æÿW+ý(ËäÿÐ]¿«¹¿`úÃ…q1VQv äÏø_Òâ;OÝË«Ðgþ^”¼ƒ-Ö·Û(%·RßZ’9RFUø-,^­ûCöwí=ߪú?ißÿ·ÖÝþbi Òæ±ðó˜f?ÊJãB\?ôxÿÓ¿€óf#/:œ—[’ëöÛ•ÿ£“Ó‰M9d°¼Ùl—oqxÅ®y¯|º½þMú{=:«gø5G¥egŽ•‚ÓÜöŒjC_ëÒÝÃÓg¿kŽæîV~ÕÔòµßûJæò œ“7T¥~¸u—÷œI‰qÌØõ~¨÷EÓðòqº†u–ÖWÇ¡p°Øís¶Õg¬çä}[ÿÑ9_ó~‚±Ôï~7LÌȬŕÐóYþY_ø+Ø¡ö®¥ÿ•§ÿbiU:­ùÏÁs.Âôj}¸í}ž½v@9ƒ¬nr"2žHñpêcë‰Óåýä€e8“üGÍûäÙ›zN{+®Ë[(c)fÑ·s%—7ØÏÒ{©µR®–ô®~Mf]õ×`¦,yû>.Üf{1½7äúÖÒÏgÚ=e?¬ÖUöQk«!ðc¶‚Öî6Ñ.g»óþƒ=êôuôå¯õ€gå±û™0ã–ÙòÂþ´e8Gþé¥Ul¥¬ª½+¨3àѵ«"ÌL¬lg¼Ã==ÄÆ£Õ½ƒ!Žu¡ìcÛºŠíoè]_ó^ÿê-uKªdߎöZi¤5î¸×é›t۵ͫ'ùÊ›?¤ôýêÔIºîú3{|RÐ=8ý?Ôù¾‰Ì5<¹®¶¡I.tú±÷æ¿Ûíý7¨úØ‚î,ôšÚšÆ}¤°‡>I´²=ÍÛíô6·wþŒV2:Ëiuí4ümîµ»À†7Óô-ÇIõÙµ¿àýêMê66ƒŽ‘êÙSØëšÖHVç¹·þ“w¬ÏѶ´ï^ì$}§§å—ïmò|ÜQÿ˜‹ö^[²Ÿ}—n/­ÌÜZïuBŸEß¡s½&[úMþ§ü'£ê¡·£åú“Ÿ^ÑI¨Vlj77!»Ï¢êŸìk½Gú¤ÿFƒoTêM§"¶¸ˬ·݃ÛMFæÜ×7o§¹®Çc=ÿ÷!jãdï¿&›,i{- ª¹hvßN» ún÷9é!Ûýåc-Ç£ÅûÙ}Uÿ%Åe”ãÓ]›M•±­vÁ ‘û€þj±ÒŒb»ÿÚKC{þŽv7ù¸÷WWýi K¦i™šŽ;¾eoýK€úψGÄ`d~„¸G÷Lô7Ææ8: ƒ"|–~ Et;q‹uÔ7ú¬{OþeJÐ]4†ÍVíuÖ9ÏÖ²§Zr öìØú¶3÷=OOôµúŒÛof^sjÆuíûDïVÁ&œmÍÛsšåh49YÔÁîÓÕÿGû¬zÌ·×-û;ÃÈÜZÒèÎý›,vÝþÆ2ÚPúŤ[†}Jª8–:è U•¾ÂúmýZç³Òý_ô¶³ôžÏÑ— çÜÖŠñ¬¡í$‡‹hx÷5Õ9¯­Ö5¯ö?ÙþŽßÒ$á{«®·`ÚEM k¾Õ[]¾ŸºÊìc½¿MÔÁ—CˆG^þ‰o€=P†—AÂ{®‡í¿úê7~wìÿ±kþLÿª\£.ËnÐÜØzô蜷w?ÿ™ôýßiKpÿË8ôýOæÿ“¿è!-Ç›8AÉËš:d£!¹õªÿÿÔ½ÒÚ[Ó±jüêkçIv3¿éT§‹™‰–\1nmþ™û&íÁ¾è÷{«±¾ÏÜSôÝFoQÄtnÇμéû¹u:¿ègmY”:–}cʯx¹Íc¡°2mfC}v·Ö¶ºîüÏÖkõ=OÑó¹q—½{,põÖjkXÝÆÝ[þvMìý®õúRÏWý*Õö74èæøƒ£›þjdÏ ã04ôÎ?ËûÈ—¦qzdÞµXÈéùm;lh2e»ƒ·Uµ¯ý7¢çú?£±Ÿé?F«ç—ÝÐ}x¥,« µs»ÍvK+ªÀÛ+k[VEm­íV:s^Ì!ˆ÷8[†]†÷ú1·æÞ³ øÙ z¯Ól®œ»ðq°lf5vYëdZýæËãôε¯sÞêï­¿OÕõ?OgÙê¢õ~&†šð1ýÖLr–9 GæÃ1’'§£ÿEj˜5’WØÙXÈËcÊH‡¹ž¡iq nÏkŸî~ß ‹è;]‚é";/ ´»úôÿE¿þ¿øT£Šü¼+q˜Z×?ió·ÚöÙîÙïüÏÍVbA£z¾¢cæ#ÌrÃ6&'8Dëë­!/îäôÉz(¦ã}Ðû½r`Èfßk>…-ªÆWú&ïýßz%´Pks­¥`&×K¥À;·iÝnÑýugH²ú6^)ÜÊîe@\Ö¾Ã[ª·uþ¥¾ÍÜn÷u ZÚϽÙ%ÙV1í YS¨­¦ç;Ò¶–½íôO¿þ)>ý&3–qˆ&F#}å“Õ?OèÊNȪ§Ö©»Ó¡`Û=ö5ÌsÂ;ùÖ~ÿó‰¾Í@»×ôk¥ØÝülþr7ýb ÞŽàÿP=¬¸—{7o v?Ù·èý ¿LÒ°ƒKØòÒç–˜¯è ­î ÙV×Ùùÿú1hYa)Ê@Kˆ³ë»®–UÂÝSé{Cr²ôs¾uãµ´8éÿ VBϰmªˆûMçeðŸs¿à±™úkõ"&p·¸Øxï»”º²öÁsvúa›™-sŸ×[üßé=oæýéËËÇy}Ì*8Ƽ'Ž^£ÿ9B²ëè¶ãxÈ®ë ÿ8,†ïß¶ÌŠvØÃ[¿Ew³ù¯N¯ ‰Šw}¦Ñ¨»*ç4ÿ%„b7ÿm‘LtÌ'دu,iû­££Ôî{ì¹õÔÝï·ÙþG³cÕ;½x¸Ò?ûvoz²¼”'ôc_áKÿEG—•öPÇÝ`~ð'{Fêª c^íÙý_üÝž¡Õ.¾ŒVº‡zw:Æ0‚ÞeÏadÿ'éäÕ\úêÌê¸øÎg©è—ìpÜã¾çYúOж´Ú{=_WùÚ?D‹Ôîê8Xö5Ž©Î7Íq2ÏsÿI·c=¬vÍ–³þô_¢¸–ħ"2yŒpéê>™ÎtšªÛpŠÛû5ŸøÓÌ{½·g×ý¥ÿP¹Ü»·Þ>•u½íópiôÿγjôŸØ£þkþÁݧØ~ÿþ³ömèKpÁÎKõÜ´¯Åÿ:ÿÿÕèþ²ãý—ë n úž7iþ{Û¿7uØ™_æ`¬Lîš/ËÇˤVËXñö—ʆßcö7}ÎkY²–¹ÌÙþ“ô~§Ö¾ŸvoIu˜­/ÌÁ{rñX&^êýLý Å~F'ý}sY]õ²Úú­h²·x±Ã{þaXß„±æc¶A¯÷£é—üÞ7‰†Q~˜üG¥f%™âßUÞ…˜¶ï.Ø\Â6ÙO¸í¯Ôo·Õúh×ßF=.¿"ÆÓK>•0Ñàßå;÷Xßzª3Ý“íénCf–òF3~;ÏÒgXÇæñ?Eþ“.¥WÔ«ª×öÿÒÚ@mY÷¡®{xçgرi{ÛöoÑd~ÐõžõqÿXTÄ$t—èƒè=5„ Ò_¢>_ÓeeöW˜sÝC±ð. ¢ûn"·îkœÜL×ãmõ(Çý'Ùl³!ì»Óº›,Ǫ¼tÝOûëΡûf)^vXÝëÌW}¾Ês~ÏS?Jû}KjÉû=-W5®k™cCÚàZö›½ßàžúè­ÿ®ÿ=K*±›Õ02›v'P¨RÖ Ö7$KÃ}1ê·Ö÷RýÙlªý™5úôÿ…Vá*ù}QýßÒƒ©ðߊæäcî )à'ÕûЗèµRW,èmv.EÔ7³E`'ÖÛ‘ÿ³jø}B¬šqÆF;½jí³y¦Á‘¥»v} ý?´~ÿæ)a(̈ÄúBôœ¿üaäsÇ ’ý Cü/šPR–íx¥7d¸K1ÙÈã{÷{i§÷¯»ôh®ÀsXëró^*`.¢ÁCCZ78ºÏÖrí»+Qûn¬ ¶ç–׎Cêu–ŽÙ‘nC}oYõÚßA÷úž«ì§ý*±ôxL߈c‰¿ÞŸýÌ#ó'ª†aUffQÜý¿¦¶¶¹Á•ƒüÆ;c{™¿é»éä[úK6~ÓN997¿©X÷WMŒÓC]¾§7é šÝìs?–ÇUêúþ·é?í; ΟfNc³2Àkæ¦í6×YöºŸ»Òýèmÿ‘êâe~‡ÒV2òŸ[¾Ç†Z2Ã[.‰f;ö[c>«·ú'øOç,ý[ùË1Ôb<ƒ™)JDÎdï~2(srü¦WUFú°žÖnÛúê~Žçâ1þ½µzµ~šÊ?ÂÕé£S}9 /¥ûÃ׈-sOî[SöÙSÿã­âtì|.’쌬{×µŸdÞømŒ±Íu·3.¿Sü¥üí먒ٿ["Ÿ[Ñ¥‰Ó,êOÞ–mΆå ]5–Ù”÷mþy¯ôuã[ú/º¯ð~¢±,1'‹åùèÈÿU~lâ» ³ßü¾ÍEw?,ÂÙ.k\æ^Ú©w­s+ÛÿžÿœU:c™•—“ÔY¯ ¬0ⱎ÷YKM®ô][ÓSg«O³ü/AÕúVèÅÖd³í8M×íøí'k@Ü]›ˆÝöãíçèõñ¿Ò}‘Pì!í³Ü×´‚?œ×7Úÿë(4-ÜsÇ—†Xä bxŒkÕÆzɱÓ0ÎWéø Kl½·]¤GŒ»7ÿ&ËÙ‹ÿ¡ Ô—õ§‡¿+­³=WÓÉôÔ1lÏŶæf²:uM}£,Ù¸ÔÆ Í£ßúÆc[H÷dXÏSÖõ)ý/¥½ DHôÌ|Ð:z¿©ÿz¢,’=2ÇúßÕb󕇒Ìj[gQ©í}¢ Aɦ¦mgÓµÌnu£ýYsÙÿ —é§#¦õf?Á™[õip-¹› sE´»Ò˧k÷}&ìRÈ¡´Ùx¶Œ®­ÆXÚØ-ºªÅvÙ…Ó±ë¿õve9Úûr¿U£#';"ïæëS¾Š²2êÂêXÖäo­ïƳ2ºEí5ú_¢£;¥Yèdzž¥c1þË—G¡újí®ÏQhÃý¯pþÍ!½ÿ/ë6H—«ûÜ-VtlZ²Ù•SœÇ6ï]ì1µÎÛ{?3ÒÛý+þôuUüÒ|ÏùKÿ åÕa-7ý[Í­Ö6ŒŒÊ½"ö+ÉkKƒ^ g×}ßFÆÿ†X]RŒús°¶gz޲œ×;¡;pÚÇ1Žßì÷)¹hN\Æ0M@CòÉ›”„Ç3ŽR7\_ÞùdÛpkšZà××4ðC†×4ÿYª¿§ƒÓikîx©£‹òºÂv¶¯m¶îµîôke^àÙ³ÓUÆ?V·Ù®~{ð7?2šk¢íõk¬e?¿“Fúv~“ÕôÕÜ^ˆÊkÍûE4ääµÏ¬Ú\ë6×gÙï6åÞç=›]û®ôÿë~§§­7©”jëO^¿à»>à;/ñZ–fä]íÆ­'&Öiÿi±¬þkwýÈËÿ­ã-«ßSîê½.ÌÜl‘‡SŸhÆa`´Ûki»'>ÛfݶÛUµþ‹ÓÉÙú__þÓÖÆî™Ó¨k°œÌì²÷°ºÀ@ôþÐÚËú ~u9ߤÿØ•›‡Õ:§KvCú5卑õ».üF:×¶ªßž.mŸcõ^vÛö{jͶ¿Òþ“ùõ$áÁŒœgƒ]e/L¥àædF†˜Vì¬èØìçÑFP[½Ç+Ž;šÈe¾µÖ~ŠšÿX³eJÿ^ú­“Ññp¯Ïµ¹mÉqnIh ¯'éâý’ÏfCi{=\_Z×úÏÈô?šûO¢µ0.=#®þÖÊuv»¨ZÜ~£w£]^Ÿªí”[C™ÕCr¾ÏÌ‹r_e~ŽE×z˜ËSë7U¢Þ‰‚湤ìêYZöÖߤì*›kl©ù··÷™gØéý=¿¥û5vG.fdÇACæïþõªPÊ2G¨ë_½o5õ{¨uâü°õK>-‚¶c\FX6´7í·¬~Ý^#YéÕUUæWú^êÿÑÙnìNÔ®Ùi?Vz¶S¶úµE˜Y6<Æê\öÕOÛœÖþ{0z‡¬ÿûWS¾šÏªŽé·`ýa§«ºH,fE¬®›+©‰•mL¡õ»ôž…¿dÿµõ]þ‘SÂÌO³äî·©¶œ®¹øÆÇ· æRï§k±½_ÔgóßÎþŸÔP“r$G£. ÈÆ áËŽýq:oò—¾ÃÃÇÁħ žž>3UL’a¬7;ÜïhF\·Ô¶æN[ª½î赇M„ÙÔK2Ý‹uŸ¥û nÛ‹]O¶ÿÓÓ‘èz4z~§R›M_o×íØß‚ÿEÿ×õT’I8ßXºíJÙ‘‹`ÇêxÀýš÷ cšu³-÷Y‰vßøÊlýbŸÒV¹zì³{ê¾§ceÑ#æ\Â~‹Úñí»ÈýM£·þïR¦z Íë] «ÔÁkFM».¨ÖOÓhÜË)·ü>=Ͳ‹¿sÙZ«Íò‘Î,zr ¥ÿs6c—ŽaÚciÜÉâk鸵æ;2°[kÉu‚IyklvâïæÙcÙ]LÙWý·O¦<ÐrïfÛsCšñ¹Ž´Z–Úߣm85Ý_7ÿÏú]; þôUìÜn­Ó­ô2°Ý‘mŽ-ij®4ÞïðU¼þ‘Ý6Û7~“í«UúK+Ì»ÒzCn8{Üne_I¶²ÝÌ{ñì麛tö~Ð˯ô;?˜éؽŸð*·!Éd—1ŘÅUÅúGôxOõZPÅ8HÏ 7 !zÜ¿Gü!³¥u,kñU¼¶Œªnci{>Êöä:ÌL×;7¥ìöÖ2žŸ•ƒ¿ùºqÿšE»'&þ­cÙ‘n7Iqª«1›ê¼dZßÓdßCÎulm Â{1_]›ò2}_})ëÁêý.G¥œlœv3ÛE¬ôž^ÚÜßUÏ©í­ößs(õþ}öÿ8™ù=?;*Œ~§Òî«-î5cÝe\Hg¥ŸI¯&ÿI›?Gÿ þlÏ L%pã:ÿè̼`›EÃÑ/ïp§¯©µÍq£}VÜQ¨ì›êÌm6TßI¿£²æÅ.­çôË2ðvåãÙX§)¯-º²!ÇmsÚÿnöµûU¾£SGTêVÜêqë¯Ò¶ë’_oO¹ù—]KóÝêØÏõqª©Îû>NG¯fÏô¸uì ­Ë=C8_½¹bê[/¢ÖY‹‹gçþr©Ëâöó‚\~Ī¿½™— ŒrÆVw<1?Ýý' §õvu\L.›–Y‘ÒØ1nuNÝc¬ôëè÷g6·º¿ÒW—ˆú2?Wû¥ÿr±6BY¿¢`RÚ±ßkæSEV¼Ü×½ÛÏèeÑê7ß¡ê=Šå9™™½O«e:¾¥Š ØÌ¯µšß[Nfï³àú¸ø•²ßÒä>ÚýSùõ üï«6ZN[Û{šÐËMa ,ÛVK+w¥‘éý«}mÈõ¿ÃÂ(þõÁÌ ¸Äö”x?Dy:ðÄF2 ‰zÔœrqqzÏìî²íõbÞ*ϯö;sl­¯«ÓÈ®ºnnÛ-ôïÇýNG§mXÞ«ÿV»¥¯«Y“ÓË~¯ãá×Ñh{ØÎ[aËc\ædQçщöìgz´Uèßu·ìŒFëiY}C!÷ôK*ÂÁ~>6F3Ãn`¦£[.m·]éb‹_UT:¿W#ô>«)ý*»‰GIÆwN£¤f¡“SloUÊǃŽjp¿"†¾Æï§ÖÇͲªz}LµùaúÿàT¹y©æÄrX„ñšáù¸£%þ ¦°ãä#+Ÿ­=;þ’6·ü€þ‘ë~À};6f9Ö2íãec£7v]íúûE¾–GóTaú¬ª¯µ÷—tŽŒÖcãS ¿&¿cjk‹ýjñšÀÝ·þuW·ÔeÖzÿÍ[W¨•‚Æç7Ï}4ßcó0l¯oèò6¼u _Ó¶ê¿M]ögc~‹ô®z?ÑÔ®¾¬ o²tÚ[¾§²¦ÒÑìc­»óSn½Õ1öýŸí­»èõ,«×õ˜æ'ÈlGò Ìqá…j:JDñN_Ôƒ+kÂé˜t ñ…Å$b´€\׺ë=^×ú7Ù]vú;6z·~¯ú4>‘Òòú¯PuV<³¨ÚÉËɨAÂijùº1ÜẬÜêØßF«}Kq?O—ÿ‘,LÞ¡ÔK1Yêu;¯½ƒÓéøïs/®œ–T÷Q•œÇ±·cQ»íÿ¤[F/ó½çIé8}# bbAq²ëžw[m®þw'"Ïð—[ÿ¨ëôꮺӉ`æy€=0Ó¥ÐÿÐÛØôbãÕ‹ŽÁ]1µÕXá¬hØÆê´"¤’kAÿÐõT’I)$’IM^©Ó©ê;'§^÷×N]nªÇTí¯ pÚ펇Ô®;ªý^ê¸äÝk憆uNš6ä±­ géú[±ÿ£«Õé–zÞ—«]tz÷zÚH‰²ÙÀK~œbuN¨l}u6¾µUaζÌx§&¶·vöe`¼Têò}Íe8ÿffÿFÏÏV›õ‹ší¶ú²q~ÍWÚ,mµ ±¸Þ›¿u–}¤ú5îe^¦Å×õ‰Òz oÄ®÷°Ev¹±k5Ýú†m¾ŸúÕŒY¶ýT{dàõLª@!Ì«#fem îæ²ÌߤÝßÓT£1þZµåÊö£ÿ7þùä*éÝ6ÊK°‚Ú sì¦Û]Õ½®s÷äôÿQ¸_"‰ý[íøÔ_ú:}{2VçOe5õ®ƒV;·SK2k¬îÜv²Š*f÷~þÁïPÎú‹Ÿ}‚ç“föØ÷ nÄuŽnã¶û*¿7Ô­Î~뱞¯ç«]êÇQÁêx¹ÆÂÃÅÆ7½íźÛ\û.eTnÙ~=;=´{ßê¦ÜjT¿5цN8Y¿Ýìãô|\lž…Ò}z›i«‡W¼NÓé´iýoÎJ®«Ðñr¨Á  ,ºß³VI­¡Ísñ›ïsjý¬Ûq«¶¿Qž§«ZÒÁú¯õ›]€S)m…·¼Á±¯s”{·÷Ѫú—š-6?;özÖ;Œ°Ød:ï[6î¡ú_s¿Ié,ÁÊä$ñ /OS®y¬`úú\JzænCwQÒ²‹Ý>Žâ í6V÷^önô×Òïëÿì?®Ý7ªgåZ}w«žÀYÒñk6äR\gõÛ[¶Œ7û½'³2Úü×óvúÞ¯U_ÔÞ”ísìÈêfwmË´šôìì,³à¿ûx«g–ãâÔÊ(fŒª¦†1£ù,`kZ¥'Ò¡ýÝçOþõŠ\Ü¿Fôýïûؼ_PèXrp>ÛeuÑöK+ʯ§Uúl‹=' ÇfG¥FCªõk®Œ:Ÿê?ô/Î}XŸ êî_WÉûa¤ôÜrÃ_Û^ÀÌë?G·‚ì ]îýc'õÏôXØÿÏ®á%fŒ#ÃAïjC‹æ6Oé}ø8?˜˜U h¬CXßôž÷:_ew¾Ëlý%¯÷ج$’,*I$’SÿÙ8BIM!SAdobe PhotoshopAdobe Photoshop CS8BIMÿá8http://ns.adobe.com/xap/1.0/ 1 295 300 1 150/1 150/1 2 2007-07-13T13:02:02+02:00 2007-07-13T13:02:02+02:00 2007-07-13T13:02:02+02:00 Adobe Photoshop CS Macintosh uuid:d747b9af-32d2-11dc-84a7-c4efaea405a2 adobe:docid:photoshop:60020505-1ffd-11db-9d58-ef56d46c77e0 adobe:docid:photoshop:7582ff4d-32d3-11dc-84a7-c4efaea405a2 image/jpeg ÿâ XICC_PROFILE HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿÿî!Adobed@ÿÛ„      ÿÂ,'ÿÄ    !10 @A24"PB3$%7#56 !1AQ"aq2#BR3 ‘0¡Ñbr‚ÒCS“$4´7@±’cD„”%•&vP¢sƒ³Ótu'ÁÂâTEµ6fg !1AQ"aq2‘¡±BR ðÁÑbr‚’#0²3@á¢CSs4ñÂÒc$P³â“ÿÚ ÷ïÀ"’ê2¯ïGQõ©¯zÁˆô²Xƒ½ä…BlóŒ©^H­^VÏA^ж Ü-U“žûgÇw€ä#nK¾S»Ou yØx,l¥\—3ü“Yß =+¡fó»8LŒõRr…®ÖR¦g‘lüCMñlÿÑCJ8¯ð¬¥’ê©ÆXo£d®aàV-ŸP•56²þl.¸Öð  Ò®<9zï;Ë}Ví¹ó|`໹L‚¼âÂHmÅñ «0"ÜÓ-Ï_|؃{ÓèMZ`vsU=D„s¾ïÑ’½:ºSÞð\yíÄ×´yZ‘‡}~.$ Úiä ðä‰0ý“ö&å.WèZyçPºuþÓ‘jÞ‚~ï­È׫T_sȶ»úræI&4—›¹¸7v/À{KðWO9ö›•*E£ž€R;Z,<³îÀ˜û_¤gÔî¦! H*%Éní×^•ÊM¾Í­8>4!žj—ð²G8 h·ŽÜóùO¨ù»¿6Óè&îõøhCÏ|EÅ¢ÊÔRJžÁË©QêÂKŽ˜ŽùówV6ÆùQl®þ¹Øû”,eVÁ t†áº°É˜Jxµ^LÍÎÍ» r×O<¢úMqéZ‘fC¼…^3å¤ôM¿gË›ô#v7®œYʶg^³ØHòü~Bv“Ûù|)}’·+\ëŠîËt[ËGkWæ#÷xÎÖëU@;O%¢lì‘ê>à é¯ÌlÛÃÛ:#ªQ¢WÚÏÉö‹›à?°Ö$ý&×Ðì •ëçå×0—E|.}K¾{ÞyèM´BéËûHîƒÇó«u¢6ZYvi¬¿}6g#—ãØjARêµ÷‰å¾zJIY6¶ô>Õ‹¤4É‚Í(wIm+3¹õd³þ„ozl¾ 3¾ãÔ'Õ&Ópksù#k›ÄJ³dã ˆæ‰ïšš‡“ç_Ú¦²ŠR #3\tDXSÒ°§‘ï(["†VÎ×n,˜ù}ÍÕ¨1ë>¶8VÌ»“ž©HôZíÍÏçÔ¶š÷vƒ Pv«·è_Ö?7óþ1óF²Áu³ñú]¨¯IpFœ]húÌñ–ŸyY,Tùã)+lÕ(‚ÎF'¿ž™Ò½üõTlô"Í­ýRù#AÚ)í6sXgxÚmoè/+ñaú2veq¶}¶qx/¬IT€Åìg2—æt@9q˜ÐnD„èŠså^•¤IÛl ™8Jù=W¹5+òBz)eb“ê{93JsŽr´KF…r6{½a±ÓŸvvô\ê1Å&ÇÐÞ*gcQ; L_Hœœû”‹ødä^ÃmNýÇáY€ñÏ6~^Á6I'zå“Ã×s“𾓒I\5Ö°%mž¡¦«.©êŸxe$}¡eq`0½7ÑGg¶Þ&¥”ƒtDX"NXÕ»®w>Ôn[÷/j<úß¼ÐiË,òì>ÒqùãÓ¨š/yÉVTüíŠ×‹4îÉõ++,fÙ½ ÓëÕjÓ¬=êÎèQúÛ¬S‹ìdÉæÀ„I†kq¨’è{u/U¦Ñ4²^˜o5ÿ£°ïÚî"¿N%æ½£?ªÙ(ìSØ6ô?$2ÚÆ?šQûõÂßRªõnÝc|×aY±QÈK<ÛÀϳ†7}R{GÐó7ßi¥^Ñ›ìî{O.À/^Øùs+J`‚°²ô¦°½7^N|íilÑy}õ…Ï)%t‚ÖNƒÅmkM}¸µ.Òˆq/b۳νþeŽø¥‡eSÌú™[-3öµ Iï–ëÍŸÓ@®WËqÌm@±ZPÕš×÷Dß›UA—Æ2¸´)x)’Pî®ùËâ²$¤³8â>¤máƒÞ—ó}¢¶å¼~ØÎt *ëJE‚slG¡Y²n+öõÒ|váoÏ8Óš§\JÎ˺ ¢8;Z´« cW'¬Oh˜t·õ wáüx‚°ŒöM——:lòü­é?“™¾WÖ{k2Fn*¬CrýólŸ«<|Äwª^[T^®-a­Ü;¿À|Eû›óg’_:bô7>CŽ÷€»i“ó_ SrR»ß‘yïÒ߃ŸAV%2[!¦ë=µÍò¾£Û$ÛÚV/Qb¶³6Ú\€ûçq/ÿ+/ˆû´ŠÛŽ'O5Þ8"«9–±ÃcU ëieEGõw»ü9à¢5ª©_´Ùéw†ÕþZjÕÀ×)]Ïíɧ¯ øC€[¹«Ï[س8· ¹È-Ÿ;Zxk.ö²ëϹ³Ý‡¼ö™F¹ötá¶ô»5Y·ü~5ì³lö°%â…ü·€ìSð’ž—lÃFDºiÄFÄÞ:ª7Û-¦ñ_FJLc÷Ó]Œ}J¶ý­2õôS™%Š´fªÄÚkÅdi«þXt5‰§˜kôÌoân!•°sÊXc{ô„±MÊ™¶jDFÕý*ÈöB´MÏî’IåY,[rö_ê)§+/Š…Ô`²y-ƒ1}ÉÄV´c;‚ʯ'Xä"\z…%¾j·S[ηˆÂÓŽe+3B­ú'Àw€œu¸UOÎ8—'³²úµ”„¿ykiõ®ï>aï¦ô whºõ18¯}!k k’d§d§ò=&—ºÌ1”úõ§ç„*Qó¯KØU¤P#¤z KŸÖ¥ØoêQ—6œæ…¾×¤ ÙÀ²Q¸°hR>wÂlK, !P1;Öè«eäk-®Ãzsêoß9~í~šx¡¦QZ¯=bù:Îc1lÎ1·ý]%ê‰Øè|¤ìQöóÒ•¥ôV¾êÚǯë?‚G¤ª­Ï¬ÇX(VÕQÅÚš¹¾þcð¦Ñä P‘uçæÜ?b’u¢Õ`uÀΦ$¾;Û Z‚à1ýz¥šÕé‘â%ÇÀj”VáÄcoúºKÕ8˜®íLfR©û½˜×<‹·J§-2>ÄeõÏ/mÒª‡S·†‰¥ÉÒͯšE„ïÆü¶… ÇóL§wkM®§Ö—2oÖ’²‚§]€ÊÈ|i7{÷Ѷ1Øè±èðÞáhn»ô>Õ×ur i&QbÏ©f¢Û-|òÃÔ"ûb;'÷çÔæì¨g]V?nɾD«¬à ?ʽ" Ü<Áò9õ§væ¦\¬×2TÒ®ªŽjSêÛ=•w°Ù]:ç”4»­»¥nrlÞš}e¹XZ¬jÊaÕÕh”eqeýÖ¹‡_ËP×w BzHžSçb»!È›áã/óåM«îɹGõ•p(§æ6ÏjU¸ó—öÉ9i*UµMÞÙÛtœ¤¡îv—L«8„å‘…ó‡ãÂ3…ú‹köÃ+‚¨y†¥VvÊïÆœ×[¨yÅ ¦…ãúóïJçÔÄ3v¬O«Zuæùí/œÏl…A?2p¬š}Iª®UD'ÓºýÉÑiJ8ùW{\òË‘ ”’­CjΪœu½Ã4µ…ê§cl5?#Z-b=Ã5Êù©Q¥ö Iâ:YéËÓÜÕgJ»"úßç%s €-¸y[”çÛüŸ;Li×ÇïÑœP§ïqßwlu\÷ZágwÒÖƒEpɆµ'©Wx”,ÞTL¾bjvs´é<—ÐüºY{K¿,6,¿ØõHG–XÜŒôïÆGdàÖ{×!ª5¢6Ie¯Y¹¨¢k YHl{Ľ þ5][ñ¹ÖÔ]ƒ7ÚÐÒ‘X]óÇFÛ µÚ‹…`eTíµCLœÛæRž!§õ;Î^ÿÌGеÒV¯àÎrÕæî>D¢H(|aŒ½šµgiÚ.ÀÇÃwn;Ìß>£ #pÝLù„é³™ Õ ú’ÞµkXéf^ ò‰>8+¾…¨ï!Çqy=ä?i¸Ý2Ϩj,,7vÕ¨Ÿžöª“Ú6SOí?¹¸+—5 r§àå*ã›ÃÖÀÓ‚IÔtQÔj©ïWfÚ‚º,i7²¨ïß2—ÉÅX ÷—xÿÚýC®Bû´[Lw´‘ q²ßŸ½K"í’‹= é—RkYg› Ù”Å¶Ó äK¬ItÕ/ðÂ=²^ÆÆ,²Û9uqü»ÇãÔ((Â~´º ‹>À¨Y\24RŒkíMx·Ñ Æì—Í n•ÀÿÁÊL5ŒJáv~šÇ9ŽlŽYò­*Ê(PmÌ 3ÙWóåtÊûù°ÿÈ$åd…µ¶]¾ÅEp Ýâ É `EØ¿­ç‹¶ËÃd-œ±?€´ßQŽò*×ÿ)‚f`“Û!}7ž˜ŒW9Âð‹ÅO Y ¿þæ"¢ª3m"¢ˆ¨Undmʬ É *ÕùßÅ­5}ˆEÄ ¨cBÝ~3ŽZ*éDqî}’i¨R †"')¸]² gf“~º–C'³®Ü¸„0}ÂlCî‹¥Q;+¼‚ 3¶&àÖ©ž>ÊËtÑ­Dгxú)´¡k–—°XÙÊnSý#˜K¡¤M‘Ñ ¾#©ÐÄ]‹žåx˜ Ô0åè°‚zø>ÌÁ¶6$yïW# RhŠÄ¡Ûšm0~ÆãXfã$«ÏãC6QʶG £Ø¬Åh‰·‡n ¨T„é«vG5×-\¦å?Ñ¿[…Á²:4]d´ºm’J8R^ñç EÌqfÉïã£ðП¹`Í“t—`ݳ PxÊ©g1ØÆË3cPƒQÅ=ÓpFZE‰"Db¯4MALìlîäSœ`ýlAwQN“P’$R-9–”»Y¢V!€Áñß­#ŽG×Uv”‘Ô‹\LÞ³§J9S _¦Ýi 1pk3£6N»*ÿ­G¥„ežÇ†Ç›Ê!\R²Á\RV8P°@‘‰Èµdà ¼3I€U3&h R޲@e¾Y’èºn¡dZ’awi|s2©F4~ùWËÄC«$e$›Ç²Us.R@´UU;–ñdSÇË ïØ á»Uc¬lkéÑNA!º¢ºˆ™u›?É(¹š±³™Â’õá*g23ÅxÍfkUeÌ°Ø šÆ’YHÇmjîTíÑwUŸ,Ã/†ãh!Ý«_Mà$ªÍUp¹×R=ñ™ªåÀ®¤B¬›#5" ³e\ªÆ1´>,±Ö>7ˆ]EŠD‰rD޲€ %ß5§6TNÑR°sª#Ü(ÞÅ·˜ÆÒ¯#T‘­ÓeœIDΉâæ¼zZ®ä®‚¹¬»PMcÛ€÷ø,2ÁÄÆ L%»¢øW•I>­ZªéTJ!,bÄîÎtÐE³æTÇPÇZ,¶ ðÐË‹6UI‰™œÉL 2Eø:nfêã†ȩ́ìÑëÍÄy'.€L´Êƽ‘›Õ:½OÀývL§ª¿VoVf¡Õ”É8W1ãŒ}™¾;bVå{$ƒrCYW•T²hÛ áSB¸T áƒG8ú¾² I'$ƯHñ1‚QÉ6xng˘µF ¼„ÖqË$r÷PÂPDýÇÈ8²oŒùÓ6Âågðʳ!J'R:FÈùw ‚"=â\Šâ3Ф"‹©› 0‰‡â)„£!›ì9 ™(%kŒ½oY®·jéãFH³LÀü@ ÷)°C¾ |G.o½¤^VL²jÙÓZHž´ó±]Ɔ8¸@­Mø‰‡€@@c#Â=0Ò–Ž÷éäEEÃ¼ŽˆlÀ‚>#ÐÝŠ ÈCù‡~Øä½›9×dr¸ÙûQz .+*ûvóR~ã*MÀïÂaÀc °DDRb')ÃÄÝ󾮟¤§|ï„KÈð¦ŒDK!8n‚Áw.wÄØÆ0!ÇòÍ¿œŽ5›l’i(<’ÆB7¤^Œf4\ÚEÈ8\ˆûtGòT‰¢_$Ê@\UºPÂs:$"i·€ÆGÀŠ”K!—ðWª#ØýÂSœ@/‘±ÐwO¾]Ôó—ꥑê¨ôH¾œzóRpéˆF  9Pþg¹X ÍT“Xþ`s}uYÛ;g`ê™<Î@ì ˆD@>géê¶yÔÅ?§þ]ŒßÓ’'’ì£NÁ"jÏ‘šºB+ëEcD ù”EP\#S)Ìì‡ñ4j  2QB"Øé¨”z‡)(c.ÜÈH„E°C¸€÷ă¹ú@Év1ÈöO¶læ¿éÊÚÊ%•:§Œ0¼‹éQ_»Œoî\cØ“µN ǘtb¹ €a^'î )¬Šë‘'pA)_Ôx¿¨=#ú ý„…î=ûbظ©¼J™ æ ˜ýúròËÜÅeef K R‘Ô‚ìjù<Ä: <1Æn…²§ne›”ÂQAÑ^§ð&ñdÊaÁÀL?LÂR€ƒË;v詾hýD¾%ÇFî|]¬›Ö†hº*ŠGž”AáXº3Eæ%Ï$|cáò‘Ù4Ä29É@îA³•¨ÙtÞô#âDâR@çÄÈ#ÛŒr)Àn‚8"‡¨n†7‘ºlX¿n÷ªi™C: ôÚ®!Ä‚‹²Ê7Æ’jˆ¿€‡ yŸ ,(ô( …µÕÆ‘i¡ŸL0‰üò.8_*uÒDÏáÐu.ÌpÅSì8àþ$íÖ×÷6ASRpJÆÐ1 AÈé˜.‹´q¬ª e¤øî¹€D)—iƒ9µ”X‘èÀ\L#„OåŒÙ¨ñDˆÞ9[îRH%¢O°&©“Äœý\ŸÈÿ¢ ¹d=ãÌtígjd3ôÚ-b` 9$¼zÍBP¸šÇOÌÍ$š.I袔÷%úaÃæ ÷”#ã|dÎÎ4[ƒ¤±M©È Ì$ S3èM ÜpbaÜÃá°ÃUšè2’NHùŸ´RI pú9W&èC˜†`otÉx•ˆ^†Tç,÷%úuE%3ÐK¼ö T0œÕWÂI’o¨éZ£ÐY_„ 8$Àì?þ´*—XéÈ'8Ýë_j´DÀ4 ‘|g Ôn¥~,$d4#Ö¢w¥TE«%3í>XÊ!r®BA6.”ÄkÏÆõ” ‰¤šVTS@®¼@SQTtñgJaNbeÕXÝÄ0¦ò Ü¿€.uaŒW½UšÉ¤Y¶Ê¢t…«Ã· Y´6dÇíŒê z¸xQíeft^-d̼aÒ+ ÿ¸Eb¤ÙŸ{ÃMƒü2.)휺3(õTç„¥ ¤0œT—|!{bð¡âaî?†É¸NÓVR\fà¨*îtŽ“Ê4¿vþ%7®Æ9ÙŽ-š[Ý>FAdð®Ì ±þáãc9Žr· ’ÖgÊYN­ Ô*a+!웽‘pìW|‚ÂË ca Û;`ž{è9l›”í4åbÇ¢u*•ò³@åL@bó™)Ì’õÖªcªÒ‰£ hWi¬Ú}‰°*ÉÙ¦áŒÁJ3ÅZ3Yc,#{nÖ~)dPrEH¤¿oò.ØRvϦÏ@€úF(,´!Q3&mwæx澂k b‰$º.©Uhй%؈TCÔ\ÐʆwÃs dµŒÏÒi&å 8~áÆ3LN¼¼‚ei"­ ä…‹,öÁØ=ÄD@¸ú³Õ†’Ä­E•$Û¼ò6(‰‡íÐU3Ý^¸W+%TŽü¼‹üš"Uœ+×P¦AxÑ y$g !mj)ÍÙ=âyS”õÑ0öÀ"&Îß®ÑùÛN‹’€.Ø~Sbj‘@ÇÑF1ÒŒXæ(ý õ1„È7Qs9r™¼I„² ¶.1ˆró!ëɰ7|÷Àà‘Y,MãS‰¢ ™©Á:­L¤‰ƒwêò7Õ()ê¶n²’ ¦é«·Ë⯜"ʴѶ@:vþ·lMâäÂË®I"”ßy/oåøaDILG©²&!Ñ€ÄÿÿÚýPLG,Ã<¡‹ÛÄ£‚™pRÁLpC·ñAÀ0áñÆ€àç|¢8RQùg|ùŽvÀ3}Ð2D6+ÑLZ²ØØ½eÁ1vª =»`€l1D?"}ð¶}§o˜Ná‚=°ßF_ô1Iƒ”¥YFå)Êlåqº¸ö1v˜Û;÷Ã'úäO·_®AÙüʰ0 ôeý¾"«B·9Š1-¹‘G$”1ñým3È#ý0Ä`‡oÔ!~6°çãk ,‘0ÿtCI“ŒV€&~vNì&Já'¸SüYS,sÿP« EÉ#vJwíŠã){ˆlíŸÏçÓ¿~´çO±Яۦܘöm“#&¡T/W-’rEkfm‰Ü»I2;ØÃ°V"Ä”fÈ÷ʹìˆñ'¾#ðËÛ”fú&ÆÒD>¡ñVèçv Û$ÝŽl§¨ˆ€„2žœŸK*ú‹•]tJ|œOÔaß,E9¤}#碦z*g¢¦z g ¦K‡‰˜N¼àœ ®›‚ö}z0´OÎ(ƒôWïñÝ£å™ÈäLáÔÓˆ+ÛÉ)ÚmÄÁ:wIéãÔÒQ‰›Åç‘s̸ù³Ï$©&1-Ç=BcÓÍÿ”ì»Ô_}õþ}ñþ}ñþ}ñþ}íþ}íþMTV4Îâi/ÖËV}zXW`ñk—»ƒVR¶-c”„T’Õ'Q¥@‘ÏZÁFB2~­f,¤§¨L/Õ3ù‹ßmÑÏ4*eƒt-_2tWhtî9)R7½Ç§qÎãóÈz˽LšH‹ôŽs·1ŒH”ýI.Ÿsoég¹ûžL©é±íò»%âü¼•jÄÍIr¶Q‰«ŒÐ3ô Ci›!fký6t‚ìЪ=hUÛìÈÕ)zbÁ䍛-†Å’î® ‘oao.^›*De‡(ª¡G¸TÑõጫ&ío¨ÃKÊe½oJ+/ˆw.Aªpjª‡9ؘ\°éoPøØ]9ÇÐÇh–“»°eú ì¢l›W¨Hš¾å7ðÒÐPNå ×Ú+ã1¦@80Æä¸Ì?pð;$üÌ"•¢›,š~ šB²lW²® p«MŠçÁŽ[úñÙ«” UáÖ'”ÚžNq%L‘åS(¨ÉصT팻rœJ:Wf’]·Á!Lˆ]»d›'ð_làà@;k$¹‘H©­ŒíR©—&\˜VÈAByÀe}™[3ÍŠóÔ{ЦUHé¹›ª’ž™åߤä­ u¤¤ŒøØÑ’ÎŽÝ ˆ€€Å»/›–$02z³%µŽèm2Ÿ~ÿˆZob°&™S+—"\bØ¥(ˆ@Γ–OÐzž,ŠkeSl“Ô,ç@2að¾yÒìÃÑuÔ„1̨´rª,B˜J.{?KË,a‘Œ€‡1‘¼% ‚··kóEAt×/l펤ز[5¾MXd&pz¡»@ãŽcå ¢ªÔ‹¹”ØSÓTÝ$έ—ËŒ—²Žëa÷ìú7‰0ò¥nV‘©*‘Š%dñFŠºjš©ã9u@ÊÇ£ wMTlbˆ€±³I±Í«dõ~äýRªg2«¦ˆÚe ¬u³ )qÛ±î_ DÄT)@¡"ã°BÙÞEŒ%­œ§[Ü·»}ðOÖÕ+ÏrÕŽ8r£ƒäc²7Vi§¹(‡aÆoUh§¶IðvÄ—:`Æp€t‘fà’mPA(ßî’þŒvCÓf&"I"ˆöÅž™\$€,Ÿ¨DQ*@ªäK2*â³&tòôé–H[Ú<ÆÁ3Yʤd‘MS\®Û{e"ž¦ ;du‡¡$Ñ#¶®¡D:cœ±¿Ý%ýV~™à¢øé_E3L1‹,±R*Ê™SF­Ü¬Y{×.ã:Jb–²`Åqƒõ ‰ªdÅp$ª.ôŽ“à³T™dN‰áصȚ¯Ö4;Æøª©®'Šd¦ãŒ`ÂrHFH£†v¹ðÉL)J@3žøR ÄV=RcN\(ý' +ŒÛ*ågè9dᥞA¸ÂKI¼µy¬ˆL×\FÂ!ß,õñ`¦4tvª‘0”AD̘·rdBBU' Ûض†r›féZÿÕ,%YebÌC/tÁ˜ó”àRSæÑØ/‚UT7¦¢‚Š)„{™.@µE—XßpÕ¹ë•òÆ'v‰2频Ö<yaÙ€BÓ5÷È‘bX+êF©–Tq,WÊ”O¼r³v¯…xc ‚i™C.C|ªxW&ðgÿ]TÅD +*Þ²ÅÈ3#7" åoD‹8:¢ƒ×,eäxWlC-Œ¡™²4¬ §ñâÕ26nÜV\eU´K‘Š ²$X– Ê‘ãÑ$Œ©üI ™•(…Ï¥[2 ºÐ ŽkÇL­Yªä[ú"¤xˆÒÉ‰àæ‹ ­ÉÓzc˜âÚ=Ò­ÑM$ltŽ—âÅVE³v‘iÊIŠ D0ÇÐ;ƒKI#‚ŠC~ˆ€NS»áÈb•äi©v»w%9TŠÎ7p†0štäñ/JÔ…µ¤8< QÄ"+E`«È¶Ï»íñêž-Ü®OF« t\È·:„'àÎ<ˆ ǤlW&p²Òrm ›ºt£•?R^ ´‰e\nãÁ2bNK•+·(,‘Z*ƒHv‡]A(”Á2 Ï-íÓ;Çjœù³ù5¡´âÎ9y°m¸âKœVü[Dl‰üW‡ºyøn>qª¿¨Aq3]ñ¶›ª¸É.Õµ(°©Ç¹æy³~Sk®\qãgÈÿ ùó(ÆsÜЊ²¾}¬·¾ÙÍw¥õ>§DDDpL'¶A%pßeh¸NGñ&Ý¢okpSp<Ÿâg²Ü1{Ùµº/’ÛNv½·4‡"êðznéCiÌ ¹=rÍ]¸Bÿµy]U²k*ÛÞ\ר0cǰöÙ»Z©ë—^AÄh[¤£Fqf:ÍCã¾§£Ð·Ò ‰Ôé(¨@C$ `æc­PÔ¶ õ›ŽRUö¼z¤ÎRµ¶o™¹I„bµ]£K)TÙÐÛ…†¾ÛûCI¨Å’÷]½ª;λú[ckS4½‘Gºì»¦m×[Õr• q±y97^®AU#9 Áî³°ª•zã_×:C^k»+‘:_R¯%ËMcNÜä8G:UYšK—:V¤‹elKOÏÇ‚hrZ¼ï}‹ZÊ&çÕÛ-AÃ97Z…Ñp²“YP¶ÀÞ«û YVö3FWÇ3c²-ÄØÛ=Xv4>ò¯ï*¯èZ-êUr’ÊÅÈ[Þlí¦• ºcKNl)y‰ší.Jnè­Ã»vîЄ۟í"F~c€QÝ:Ï_ÔnVfž†ÓûRÅUÖ7Iý|ûÖkT>²ÚÍo°/Û‰e9:ÂÂnEþ#nROBo8˜ómílúWcÆr6ôýš2,mº­åuEËXCä¤U#lRªvåé‹Eí«v¦Ò¦[`¬ÚŸiÔ7= ãØsÊݳ›'“•}yiÕÌà÷Ü>ÏØqº²’F÷þRlZB“œŸÕ»‹I¸E_j­ô‚››KÒN}‹¼§ðñ‚”Á×›lÿìt@‘|„ŠÂlÛ‰mÝ%°_KŤ»Í1¬nÁ%¥¹Ö7f^ô©Ø?g"Ïrqæ¹£·ìñvª­zï]‚^á2–³·Íq¾á7$¯vš*¤á/‡•ÛNË[ƒ×”*Þ¯¥n­ÝXÒ1‘ÚÂý¹7ƬԘ×ÌrçjECÖê[qìù-YF—{íÅ­3})«'n懅‡®°ËfÖÖôWl^7‘d â=§ ìñèë;= j–ín{õ»­k°úÓv¢êY&6>;¬Ù n0<†ÖŒáÛé¿xÙ²;'_ÇìŠÎÇÙ6]³¦u }êÉ«x§k•×V?‚BA”K/®»öýQå»úŠòÐõ=X­WbêUý•¯cö]n¥[B£]Ý1;žõmÐÚÍår2Ùl­Qk—Ý©°ù$0PÕ¨¯¦Y÷M6KnÛ[7%NRÁ ºû·Mkýšz¦€®ìHF¬®u‡»Ê«´kVVâb­ÀÛbK]4@Në­w´bhÛéJ' »Ð³,_GLÇlg°©{b³*öri/%ªì;›JرÙöVÑ­v skP:óâîéÍU»vÌÛ®‚›ÂÔoZyæ¯åu.ã2 =.úÕ¯?=häm—æ#°¯Ñšî”¥ÆÍr¢ñÅ”k¨èõ§.5¹ÈM Àí¹£\ÙU³Z·4Êí¤$Ù9ƒ¾[µBÕ;++ms1–Ò»¶×cUõ.ͲšîHÚ>ø#›’5:„”äU¿haXׂrí›2AH*׸GÛèW_t t\~ÖQ/¯Mx!'²¬ïK[㸊ÀCˆv½ìàÛy³Ýûmø¢ÃJ›Wö»3H[~îcµå“”€Ñï6TU×£Ò~;ÉÃz²Fi«ÃU’~ÊŽÅJº½9#=+«f+©Ê°ämû›6ëªVlÖÝ‘^·Ôì[ö¥_–“ÛF”«ä5å—–Ãf‘þ¡›Œ{p»0r«Ö+Ÿï{ÓY6ÈÁÉFÛgýGÖÁ9¸3k´VV‘öæ¿lÛ‘fªs+9¾ÌˆŽ‹ˆ‹ØÉDÞÿË9‘á"€J`¶¥«h¹®·Ü&dzoˆcÖ&û”Á›Ê•i¹2ƒgµžãÍQuWMÈ7·Ð6-*“c¹iÖ:þ΄̎“¶)TÔ4WT±EE-9­…ýïnEÖmZz¸Y¹eVE²:Œ“„Í™kN—IÖ5Šªù/g„Ó Y6R †çÈçã§ÐÔîGéÈÞ;ò^aF ðï‹¢ ·Vµ&ˆä+ø';éhÖ´[„zïýšºåÇ^@;øDÁ³5Á¸»µ¾™#2Öº´Ï­õ åÕͧªº¯o²ë¦Ps‘6X½w’¦UâS«èJæÝX´øþœ2IÖñM»3›?yR$µµ_ZÕ\ûí»¡Zõ¼'ƹ”µ ~>-(=³fÛúDQÖºýÆ6U'ù Æ>NëÛ⤛Kç=žégT.)ñ³Œv.ÃÁ,J%®JÈÒÇ­#e,¿˜·š•‹áÚz¹(QÉ\µß.uKåm䋾?]£¥#&²ÕclÎ5ž´ÓîzÌŸå;ý§aÚõß&T“åìbv4ŠLeõ3ÈÇózÞ^¶èY_ðä$Ë(-uFã,ö|M²±°õuñ´æ¢Öu³\5F·c²vÕvvœåË8æ´]ݸé\z«Õëz–í>¾§ºïIд¥6¹l™µ;¶8Ñ»bs/@QjÇO«MHª'Kˆ´î]‰ñr BÖ7ý* rÓ iË\#«cLIÓ¦Ä{ŽÃ+Û”¥`4m†GaÅîÚ&ÍŸ‡ªBi7VG“Û,A[Úd º¾Zqôt„¦ Û|±BC‹/¸Ë­¬ïmUtõfØ}%Œ»é0[U~ÞÚª}“Ïí[NJc‡L¦ Â^ç²)š{ZëÉ¿µ^B'£µ«½{O SœÍXäš³¬TÛ((zÄ'Ç¿¸÷Läd²—={sé//_‰…¯M\Ò°1×óMqÙ·Ûy9 d%OY\îî+o=:Òá°k4eöÎê¦JkJ¦Ài\ÒÚ»bmk½ßg ÆœväŸ*ÕÒ¿·7’¨Svu‹T»ä–ÌØÚÚ•%Kœ¨B^·¶°…ŠÖÚn?oíeeÚk=P;ÇŒãšßÑ—ºHF×ÕåtF‘ªè-ú;[Qëý×OØ´£Åµ˜?c*Æ÷%\²Y5rÊÞ>õ®§ëóµþMÇ­#¯¶uOc@Ü´v¡¾ºäN¨Š£jKŸgP7'ù_œ,J<š¾=à"[C›.Û£³m[ó§µÞÇOÔz„}8HeÄšŒ¾Ù¿o­m¡wžó¡Jܪ©ýÏl6¥khJš÷kÄm&:ÒµþÃolÑ ñÃŽš½új¢“„¶'~Ï7[ÖEæ¬ÞÎmq±Ñ©öì±ñ£™=]­ö• ñ#²iwîFrŽèÒ¨ÚA¼´3íû9lKL­#TÉò”*³ý»¬Óíõ–ù¾YhèRÕ»s’z.†õ¾ÝÚ÷¯ž*Ü4æéÛ6yªf»B.«¸lôèyÉ ã­3@Àþµ‹‹Û“E¹1µŽÊ™oÝ Mä½rlõ[•JóЉ¹#ʳ_ÉL6‚²ÑŠÕ»¶aãû9±ù0dÁ„b_ë>Z®5J<{-Ù¬GÜù„®˜˜ÜrùnÜTª”Ç!õO$&uDíº±X¯kE¶¹(ž³Õô-=Pþji-Q»!æø“ºõÐØàª4™*n Ò×o´eÉ—Ҝټs”´ržv9ív!±'ÙÕö”dÜU·v KÜ,:Bÿ­¸ÑKZŸDwnØ8Û·ÁÕšGSé8‰æ2ñúw{VÌÿ ‰xœ‡}×”ËÆÃ+þ!DY´íÚU£Œúë‚Ú/n¦ö°ªþ"¯b'Ò YG¼JµÄB‰€#OÊÙæ ñ¸.£±IÈn5 x]$‘…¹< E8jíõU¥{vÜÞð*OM„°ŒEiæ9vR0:X7¨…ýêÍÐw8)ë2¿â ÈÀƒ´‘‡ö‰¿pðæÇ±F>˜tW”¶|OÄ{”pŽýU<ÅÖ~¢xGbøG£äÑÀ,ý¢ ˆì¹÷S÷…^¿bØ$µÈ:“'Ô'Å ÁÃh4å]ÀÕŒ'QV@œŠ,ua@óYc éÖHmKá,ú´ˆ‚3¢œÄkk‹,Áé˜L+ XêDE\{7gBƒÂC¬³4,’§…tNÖ$ÆQW’ºÅ-È,§I%cÌà™`„Ã@‰5åó–ÅÀ3ÃCŽèÒ(í -\‡>ãp·p÷¿ ?Ù<Þa›ÏR‹Îø£Ëòÿ¦„bά$2œ”®/µE˜’NdâOiè[vlj‚ê8(c-ó4¯vâ¢êÆ%¡C‹LÚ¼1ðê’1¢ÆÔTƒ¨ƒâ¥t À¥ÄSŸ5jKAÇ– ÀËHvÄ<陕x±¥å…²±£ÞF€W`F¹––8×/þê~ð®cý×ýãRŽËØHö„ænFâÚÇ¡õ Žk—±{¯G–ßšÞŸa¬EÞU·ázßý·®‹r·Sœ·2tïj ¬å8зÏ,:e†:”»™hԺݕtž¶Ú/˾²³Ÿp´k>S€5%§J…Êh'6rØ x¼j¯áãÇ8Á^{«U‡’3Sƒ/jý"W¯û ±ËEËÛ~ûÛÏÙˆì£{˜rîvŸ`Ô0£Ëç{–­ïkYÜN²ž5êÔ:,\ hÙ¶ªZÙ¬÷2¸§ XâU‰Ðm£c—N *%ãV¥æ¸+ª&O†s4C»6³%FE·è^늶«± |R`Õ;kA¶A’1€$0C‰ûL£¾r­:'V©YÕ£L˜lÁœÅXeÔýá\Çû¯ûÇ¢ÄÞ!/€È dü˧8Hò×&=F•?¦Û¸ ­ÆC´iÒÜ™Åc<¦¡ÔŒód`ú®–âêCš‘*{Táéú…µæWâ<7‡eщìpÔßÿ“|¶¡ÅaánÆÐ‚èŒ Sª0Šk|ú l£¨¸H×B <:‰‚—˜³w&€A!Ñ£PS°jÒHé4¶9èVÈ>Jß{á=~·MHý©,` n[‘hLšàͺ“rý¬ÎÈзiu1ùâNuœ(8.ÚlŽñ˜=G#¼Ró<¸‹Æ¥û'ß·Úþ¨Q$ìÓ5Æ‹5hUm|6ˆ¹0%Î*Úg~um'ùnd6¶Ð Å ¶µ·‰xð“ºh_¶…L%Á+î¸÷´'tÕÐK]¸®cÀ c : ·`0¦¿æ2“0#J±Õ¤Da?]rÿî§ï æ?ÝÞ= q«&*A2½›¨Ýr· Óâ|°þŒ$™Cm¼¾bÚÚ„ ¾m±{V¦ºöýâÚŸaÓ#8£äG“mVݸºTfÈ3hëèêWÄÚå þ¥ãü4ôñ¶åuåÿU_2rº  ©>«ˆ>Ä Z½pÿ3É‚t²“§‹0F`²˜˜‰ÛO“'_\ÝÒc+­ p*¨8ŒãKgžFò O‰4˜hÚÈcò”·-°ea ŒA_³,LG•åLXŸõ?þ‡½™Ø:Ѐ-€NzŠíÐâ+´SYå!‹“”a\|µË'}»š‡å¸ïWÿ'8³ðÞSi¿7H­\ŦU90âCØë+ëè[V†§rÉÀU¿é¼¹Õo—D™xÿûàN¡×Mfð†ChœârÛE­Q°tlmÜ™}‡1°Ñ翦 ›a¸™†–¯h‚F¡Ä»jåë×B2¬"´A†²O !Ìç#Œ·-ÌåÌ:æPüK³´dî -ÛLXH#"Ïè?²nG–nƒ°÷À>È÷¾#†CÔÌØ`¥ŽÚýd¡Ýu0üé?»Bý¡­WöϘ£~)ê\Fuåß- ¹wÐt3:U PŽןÌêBŽ*Ø´ yAm]näNÒfƒ°Ð¦[ Ñq1&Æ2¢üˆ¹¶IàöXäõ·á4QÁ p î#a«|¿2ПnaÂÌ Ý`p{Ú@KLØ,êi8Ó]å‹Ü´#YQäÚÚݲ˜88{ц*PpÎýSFçô×76›MòýÝ—ZãÕA²\Cž*Êi®û ÇØ\ và½u6SUͮرïØ:–ùéê?"ß(§›ï7‡Ð¸þ/.ÙrŒ6aÞ:Žúàr÷ùˆ?IþËcÂ~Òa´ŠêÊ7…Ôê¶ßu†ÆWDù7GÿIH>Ófû„‹k%®¸ T ·„NÖ>Š›u+ .–¶‡[†­YŽúǸlr`ê ÷–‡x—=‹ô˜¯Ó¶ øŸˆú<#ÑPXÆì‡ taQ¨ÆãˆôýKzOÄœ'Ñá>ª7-1qâysï(i¸ÃJéc‡v9eE4è y`ƒ&ñlðÌíš-a¼Û`I`ž­Ý[Æ=ÔôÚ^û¶ÆÎ·A–Ö\)T»B‚ I€§5GhÛJü½ZOàšN ®r†F'ª›˜¸¦áÔJ«b¨'Ò2ÔÓØ+HXQÄžÞ‰Ž’Ì`fÚ¹Ì}‰îØ;„ [@Æ££¯JËá^f¤t&5#Žâ¸2ž¢´D“š*êU†Â>ƒÐUkmâF­·jŸhƒ×_ÏYClÛ0-1Ó]‰Mq™VêÆ)¼ðC“&sÇoÏ„”F{bÈâQ³lÙ9TYØ÷’h3CÞßš§föëÙ²¤™'åêS‹[/zÿñoQÛEXFm¥åí ƒ¯Æg9åèÙЦÀ&à2#ÿMôy›ü*ÐÆÐÈ1ñ C5œ€ŽÚì¨U" Ñ‡-ý·pDnèºÀÁa ~žÔ+ʼ¢å½Ç5û­šû:¨¿(ÚÆÔ8\Ù8ë_EFÚ“üfý€}Ñö¼{¿g­Gë(üê6}á³xà=ïÓOñíþŠÓi@ÞvžÓ·ÙAºKF=µDï,ƒâbÇðˆ¶=Ù 5›\«’©«Q[`4ŠðÇâ®1¨ø¼YûÑ„ï§pT°>`]miÿH{IW·Ž)3"¼à…A&%ˆ±Œ$ŸTtì%l)Å’ÌAî©9ž€DƒFýô ÖÈÒÙ1m£Ž8åRs4˜(9NÚ+ Æî•VÃTGa¢“1ÒÍ iÙ¿³¢Fb2¨5±ŸºvéÝ¿¿ävaÓÙîê©4O@=}Ÿ±þ"O²:t]F·Š•¹*šP]•äi*}sýóVÞ\êÕƒÀ`gÃFõaþò˜êÖãm5“”ꚺÀÇ ê´Îfûh¹pP‘~Žªtb4x«¦sl;0¤*Ê!@ÄÔt¨ê­½Õ×YVU•eYVTpè½×¤úTtX‰Ç³mfÝÖ@ʬ©p M¨L)S'NÒP¾žRçþ½?‘ŠýT ˜Äc»û¨9ÔQQ©µ—P0q¸zªÛµ{M;È*ª5¶þÅWy:1¥$ì³ öWuøíð’¿@¡ªbqŒãluÓ]°°JH-sUÁsTy~X5ÇTE}[H<@p·v¡íç¡ئ–7|ËŽ jˆBvtéÛféü·ñ)èd·aTF‰viÀã€Ê£wÏ KÃßýáƒzúZT4 &€6‚IÌQÄHÙ8Ö¹¤çL¤):gžt­ ÊM2˜s'!B`ƒ‘™Ø¾ÞŒ1è'péŒ@'£ÓÐj*Åð6²žð{¢æ‹…J´F´²a:Úãíˆ*}´Zãbq$ÌõÎÚ6ÚëmK2 ,ÒЂ5= Á J¬uô?*r¾„¾¼Iì#¿¡lÚ“¦HŒ"s3õÖ¢Áˆ 0î¡+ŽÙê›–m¼K÷¶Ä=c¥µ˜E®Ä‚3§yÀˆª@á\ éõmHï«#àÏÕWÀc Äú¨Ú€êGF'3EODïè&¶¸TŠ$ô¼ô\ŒÒ~øKth¼ÉÔªU<Æ2UYáB²QÂfjåÅÒº›Á*YdI'D 8 ám\ÒVC nÈ— „™ Â¨‰¦PšpA£ËàÌpÀ;ñlOBÜC ¤Ú Š^fß‚ðÔ:¾¿…¦…À&3ÁÀŽúb.êe@tAˆVm¬'h00F"¼Ñã1ÿpê;w“¥ZIÄŸ’.¾[>¿«ÓÓmé`TüÍ Áépèdo a}Tö4b§¸Ò¸ÁGxÚ7µi-Ë™m+lAˆUDÀ*™‚x±¤¼¢J01ÙóÏft¬ÊHŒÉ&L’Äí=ÃÓÑåØBÇnà7±8(ë&ôß8\ºÄ²éþ¼cl9ñ†@T[wž-)- l˜Ä‰£|1ÐÓ‰]:Ÿ8U™Óö².[0GÎñZ­`ûSojï±ûwF¾¿ª V=Ì•;=èßaÑNÁCgoI;úW˜QÃtc÷×ZÁôü€¨ c“Ø+Wõ†Ùe7ßo ±énªòmjÏúi€=n|NzÛÑA”Á‚6¶¿™_â®W¯eÀ>Û¹ºØ»º›-dÄs5®Ù,5#Nž!ÆWÙ¶ƒ)‚2"£™ükŸâ\hƒSeƒŽ¬ûÔãPDtÀYiUIÅ·üþ}}S³¢|Gè´¨N™Áwa²rì¨ð¿Ä>‘·Û×_¨%~!—~îˆ52OAÞ~CÛQƼK÷—gâ½ã¤_æ˜X²r,8Ÿý´ñ7n ×FßôôòÀÜ8ÞoÅ’¤ôÕ²m»yŠÌ÷µpÚ+80˵:¸jzðÏ ^´qƒ“š°Ú 3Ëx=å÷­6ã½OºÛr8ôq¹Õ‚‡&|°|D dÆÚ7èÖNiAÄïðÉÛê ¯€D Š‘¨ pÞÙ¤GT!˜üõTéX‰¨;r¬z<»}çbŠT$*å'iÞh‹üjàâ%‘÷ É eí ‚`o2}5üªñn̓¿:ú·˜Ø=¿%žÀ eøË-Ÿ{Q9cÄ bA•ó~ðÿ1Çé©ÿ×lçÔÏÜ(ݼåØí&è:†®‰BÍA[Ý}ôŸt÷cüË0WŽ'S2™uóN—pE1á]:¦AÏ ]²`äFjÃj°Úý+W+Ãpx­ûmŸyz¼C …1¨Aë©Þè‚ÚbÁWÜd†þ±D²€Ì.9ƒà±‘«:$3 c;g¯èŒª×ß_héV8cP:8xSk}[Í Z•{N'¬üû(…"sS˜‘ˆê¨U‚@ÕŒÉöz o4N[ëù‹W °`õõQv”fWgucPq*qùO`àsS¹†Gè=DÓ[¸!”Fâ: ¤‘,Y º›Bª[üOpÎpëò‹«°ÏI§áœ‰c ›*ÊóCZ£ $’4uD/‹‹ÂÔ÷t%·PXÛ Y¢dµÂIqɘ`žÊH#Fv·sŸÂëÉVQÅ£%kƒ&Ôf21kH¸ŸãéŽþ¬I œ»*×ß_hù:m)cÕA¹“?deÞv÷zhµ°ÁWpŸª‹1’s&›—c„Jý#é¢÷`ÚM·'Ô7 n]Ž#ì9Žï®…•ÀÜÌý‘³¿£ k¯åÿ=`q(ãjŒ›µvýœvtjBTâ$ÀàFƼÄPŽ„**ÁffˆB¸Bá"p%š!©­j W2&'lNppœŽc 6® ²dº€?TÄ*¹>ìäF+‰ÒY0¼Û‚Üô€"VÛÄéeOyxT@|e¨Û¸!‡Ï1c øZA©ÏÙ;XðŽÚ>Xú¨ÀÀ0®Ù“öIÐbj9‹Jçý#éÂïo©†¡éX>ªà½m»Êþðm¸H §om`¤÷á´Þˆö×”fOª¦ë>…úýu ¨î|’†ãPîa‚ì´Öïâ¬V'šv8uŠ:WÌ×?Ft%]O Ö»¦[Ô;:S 2#1Su‹³Xœ~TóìÑsùìû§Ýü½ zц±µOQÈõV…n0Ag*Yõ¶³ Þí„ca¸R¤€qÈö†TÀ¸4±‹Lñ;'#¼a•^Õ*„$ƒ¥r!žfçä)ysüG‡¹Õð'៴iÕ|E‡¢÷× ÉëV’¸°ç*´“ÄæÃ-⪋H*­ Äéȉέýáí¥v0¡>_¥nFö?@¢¬º]q‰ÀŽª»l±…$De6ô¨3’iMÁÀq2`€Ë¥ÓOn*ižé‘ “¤ð±À-½tYŒ´ÑN[µ¶Íõ¨™'jzg£ص»€2°‚DV¤–°Ç…¾ð·^ãï¹Ùuî’@n£‰Ìmʼۀkô¬–:îάÚáÛYâêèóœ~˜=EóQÝâ=€m n¬HÁ¶ú~¹«T£@ëúª[+]£0¯«Ù@Lé$‰Æ óë§S$¼ ' ¦jßÞÚò×2‚;€4ÎG„G`š•}r§3髉xË.Ýù}~®º– ³n¨Èv;úªn´Ã¨ì1€7÷}9V¢OU@ý‹[º¡•„r#çýÔoY—±é)÷¾ÎæôãÒ¶í‰f ¼œªß,¸éÅŽö9žó€ê´4vPe$FÊ€0œk†Tõ¡¾º,1ŒIE¡1žÏm#2àÆþÚE7…#»²µØÄŸŒ_nú‘³‘ÝöO_¶™¬¶’ÌdÆ8Ej¸ÅŽòf“”»ú†4´8b'*ÕË· Å”c˜;^Éïì"ì‡Î~{hx×úûó히# ÿgH4oòÛ{?ïºpÜvQG0Àƒ¢=p`%S·Þnïë'uc™ÄýTí¤4â7‚2ºwP 3êÛïÃu{6׃NÄ•vüöSÙSœ{$}5ƒŠùï¯áHú«ÊÐLç'áDZxf¿µú—»NŒªÚïeöеË[:˜i&=Ø÷Ѽ2mê˜#×"ƒŸ Á»7÷gA…uôFÊÃöÄÜX¸ 0n N2:ˆ=QVÐ.•¶ŒñÝ0'y;Lµ¥ˆƒ:NSwGë©Vƒ³¶#<û«tã¶wG__ª¼«jM±â#ãóúh]…Q‰öMNñ]ÿM-¶0 šÐƒbH%¤Ç‡ Ù\DèbLiq 01ƃY^( a–Lê[P2W4®&1œ'P‹ê \m¢'£>Ú6m) s'3Õ='£ÈsÄ™u®ÏF^Žœ3þÁ¦%}tE³¥Œê#we e@îËÒ$Ÿ@ DÆ;8Ç¢¥H=íã;:úª`m& n®ÿ¦mI3Ѧږ=T«¤Ë}e`î2"*\Œ@ß+¨„ä8£Nf'É˪›‹+ñ GÖ;ëŒ?o'åï öU¿º¾ÁÐU€ ç×ÛZD¨Ç#9áïMj·‹“Khˆ Ⱥhkñ±,Óœý‚BòöüW3û)ï uÖ®_„î>õ(à« ‡çA¬?k;zqèž#v O¢¤[Ð7¹ÓêŽT_™æU@ÎGt±ú(óã½° ™Œx)˜¥Á !µ«i&$1Ù^@T†Ñ:ŸN¨3'® ×Wñýàkôï«õ:Ç­OÑ_­`‘¾ÙÖ=7ª¡Nãƒ~SAv0“MÌ8†¹øPxGÒzè:œšÓpc°íŸUi|AɆGê=_µŸ–-ZRÌr粃sme~–ú½5«‘´ ‡Ò%·œÆ9õáJ-Ü:’èˆð²\]VµšÏ =µxè*oCÁ1¦âÜ&:¸#¦µuŠÈa¼Àu ÝŠƒÈÂýÐ[ËòÖ‰œå‰Ò6Šþh[Yc#Ý ÏXÝdS² !|°–ÌT á3NÀª÷•Ip 3áÏ*¹jö’-ŒÖu1<9#Hß$R›¡d’¨ +œ0;0ÈѵÁt.hçˆNPþÍC¾—–e)N­1’àœI(â­,ÖòlÉ' :£#¤}Q$Iœ6€ßg¯††F2+Pä~ƒ×í¯ŸÏººÿc'§šêé[ÖüJg·xì# [Öü,'³xí 7›"ÃfBu«g#^W. Æ4Ú]d$`#¬×éØ[c}ÇÇò¤ûkšUû–ǵÉöW9w¸ ÿ¶¸y˽áýµÁÌ«}ûqëB=•úœºÜí¶?•ôŸ]7††lÖà(Çv&&P{+]¨Ô*êâUÆK Én²qyV! b kÎ|dÜ)M Œ¶DQOœAÄ0Æ5#g´a¾¿T›–~8â_÷Ùö‡} ƒMrØÂ1\qÝ’q`3ÈPK¬rj @ݰo¢Ž%Mh8ƒá;ÇÖ6ôOì±ùüöô|þsчKÙåíyŠq’a¶êmÄcÕÏÜ7~ÂÊZÉûX÷PKJFÀ®îª4L cA×"‡/‘¢ê‡S±€#×Z¹ †ßþ·—´{=äü'º¿ú¬‹<Ã` ‚¯³ò3¸Ãl¢yppÄ€aÚ?†ö"œNÜ3¡ÊÞ’À\Ä1AÆcáÌO¦$Q½Ë V³kcÝÞÖþ•ôPt2Fõ1’DiÇb.d ‚£H™`pcöѼ庶î;Žú(ã‰L¯°ì¬~_—dDÁ†öÛdeÛ5t¿ÂsþþÑêù1²§ _æå-ì\™û~ÿê¡nÒ…QƒrÙa‚Ba›Ã¨Ì(' «7Ù¼›AšÕÔzn qŠV «oeu\K¶ßd¶8ž¢jê#ë³d=ÁŒé¹pi(~ì3²ioÙYkj.[Ìvð1SáÓêÈaW2Z˜WÄÈL»˜1ëD€)®ÌËÄãK2ùbÐâ·vÑÃIÌ4I4³ÀÅ­î«]G N鞃jò‡C˜?<úó­CUÞXwÜ´=®ƒó/X¯1`«Ã6˜ýP2 woìƒMç¡·i mb®}É8¶‹„¤Qæ¬Òln(÷ö(ýñß@ƒ úé^Ø,&B†2œ‘;3Ê(1IØvWž¾$Ï­º¦Úé·µÛîÚdzÓN,Ë_^ ÇÞŒÔ €#-³ü—½´_¼rúè’dš`Eæ%×¼;~/Që­v˜óÏhïù+ÍókŽh‡fæa¿pÙ™Ç*à’Ä*ï9Ég%ç {ê·ÝÉ·rÐ0Ö^ËI‚"Ha#Oo˜qqYUpIeIi&DéQM1E±“3”箿Zâ'Þ`=¦Œ^N½ ŸÝ£ÏQÛ+í¦ÍźÀû ::‚Ca˜; Î…žU £÷5±†[PƬX‰Æc²¿•5wYømÚ÷m+™–÷²€:ŒÒ]\5¨h9€FÞ†æye›'–Ç»¾å±ûË·1C˜åáU´dTꎻ¯…_˜c©p•:Âà1³‹ Çðn°Ù”ì9¯££ÉåÔݹ´ —ï¶Kíê¡saq¶ ÂÒ÷fç­°ê¨ÐÅD%Þ%êŸî>¢>BrË’ Gï6^íùå¦*Ãhùâ:æD}¡áï¯tŽ¡@¡rëì9îÎ_mO>óxý•Ù½»:/0P¶m’¡‰Å™£ë¨P`Іް MÎ]'z ù“IõÔòËGúw¿Q;ˆ¸¿â¡cž¶y{‡“6ßî\?…¡©¼ËJÚ›Y‘2ÑWuqôèuù€“u”+Ë„ˆ‚aF:cdÒ§4¾EÖ0ˆâœ´{qÜØtk\9k­ˆÙjáÛÔŽ+u- K&$d{FÊ6o©ü*¢\¶Âª1vå×^õ6­¨©‹¶Î"<2}ÕǬQåmÚWˆ ž# émkâWÛ 26áZÃ* âvÄ ÞÞbpQ¼Éžãnï*‹ £,ÇA¸£¨}ßxz1îé,rÓÞ>óݳÕKnbNpLw 'ºµêVI‰R;ˆÁíMipAƒÑ6› ªqSÝ¿¬Aë¥<ÓVõbqϤûØo7šCÊ•6€täÙÕßE·n%»¦^Ú‘¡ÉÏd®¯z4YˆDAØæó­r‡Âž—‡Äç4¶v(âaœ ­(D\•DÜ>[Z¼Ñ³R$žüÅy–õ^äÆ`ñ]°7ƒËCo¼ƒx èC)İŠ~k˜:È ÚÄ-cŒ±9ç«oCŽhh‚Qéݶr£ÊØp¿óXmnHFT1ŒfÍ…@KŸ±ÔíÚß@MiÄ«a«ÏeÕYH´W]ÛÑ’øÜ–V8FÚ†Y 2aß.ú Òa’Êk O„¶ iFf%Ìq—AVİàjå†ÍFG¼cÑpŒØi‹dô3%§¹#L¤†Yƒƒè¦h`ÏÄC “³g¶…Ñ:Ï„²NŽ!Œã0¨ YW,_¶€HÝ8ô1'*NUr´1ë¸|gþÑÙA¬\%v©Ê7Öz¢…»çÉ»×á?W¬uÔƒ†ýžšÕÑÿÉlþšì¼ëþk ¶Ôàƒ&#žyí´ì uÆ£m¿NvÄ2oY¯0N@bI1´žƒ}²²¥ÿH?1IÄššH9†›úk]?ËGÚ @n,8dG‹¥·lU2`\åy~^ï0Ö¿ˆP`ž£–Ü„á4—´2kéa ³±†8ôó<Ï,|ÏåÃjW‰:dXšµÍ”Ñæ ‰˜ÄŒðÝÓc–ò]üéãQÁn>/˜Ãji¬ÝPÈà†h4ßÓ¹‹¤Û´‘—™løÎm𑔊€ t9Uc-h”?‡Â{Ö: °DÃG—–aÄŠZæ¦Vû@m~‰8Ntׯ6”\ϰu“²¯^‚ ´,XˆÉY*“"÷ôZ½µ;˜}j:>²OÕЋ¦â”Äiy]QâÐÀ=T†¨2Aœ{vÑTàH*· *kâ•„Cálóéc¶íÈü6Äþózº Kº‘#]·MCˆÁÒ};©D.J7(Á}T·Ø~¥ó'î­§Ð:9®wúoõ³|crÓAÃ"s$ì†ÒĉZþý}åVB_PN’ŒH¦cy«\×õSqÔóÂù|Di´¬@8IÏ~‘Vy!Ì^{|Õ†7 ?¢YOºeepá¯êlo7›oÎUBþ%ÐF¦LÙ³âÙ_Ò¹ûWîk»p!RߦQá º&fff¹õºH6X‹ýÀ´¢t¸CüIÀžÞ±\•Îbàp-rÚß[Mp‰ýU`aøtœ5c8bkú)åÚà¶ÞbìY˜©ƒ¬äøå†X@Ê­·>ïy®^*·mß „“§KÚéS³‡t#¢×<£M¡¿Û¹—åxüÇä^³±Ô8íS¤úˆé-~â .¾&ã$øBa-:½W.\]JŠXŒçH˜Æ”=»(×БåH"!´¸Èáˆ` Ž‹ßfÐÃèè»ÕÔ>A¶åYHÚªNP12GgO-oìüì~€)V ’0“Ž@m¡ÀÁÉÍ“FpÜsðÕ«YêaV¹uÊÚ*ú>¾:ï-mœâIä x5ü&–‡/q@fc frˆ vE'%rØ{Ha#‡#ö÷ÒóÚ›¨4«G®àwbiïù æ8!š1`Ø4ìâï«v”)hÊ,`‡zî4.s6ã¬$úvŽ£4¿ÌXGÐ!er„FYU¦P8[ÀpOú¿˜µËÛ[“:‚‰xØXùsïÛ`;bWü@R¶ð:$Uƒñj_JÏ´t­Ë*Zæ’Z6äÎÆ{ŽÓLL©‘¿ ¾ŠÒÖs§K-’u%f#$8jž.‹ë¾Û{EãŸîá>ƒ^è5á>ƒ^è5á>ƒ^ô´»­[öM(VØ9|[2έ#!P"_Ì8Ä‚vFí•Ê!ÈÜÐ>š=7nÿMKÕ·Ó¥ÏêñdaŽ´ "..)¼€@q\±ŒÀÇ ê©þbÜjÑâ1šýẘò×R朒 vÓÚ³~ÛÝUc¤0&TÎ#§±Î*))­ ‚:_2rú P"YÙô4L¨ ˜Ä®êæMð£Ê¼Qt‚8Fù'˜¦O…ÜzŠV¸Z#z¶ rŒ;+–m×W×"³šÌzk˜·mRâsYôùr¡+Ž #PÓt¨X œàDÔ5Çdø Æ)èœGQ1YH«‚F(ÛFãÑuë €€¯ã¿¦¿Žþšþ;úkøïé5üwüÆ¿Žÿ˜Õ·c%­!øcë¥ÙF’ gŽsýóVÞnZ°¹œprŒÔ_hùyS˜±Ïùœ:APØø˜O #Ç2F5ËXA7M¿&ôdX§ w7î­Jå] ¼îãsIm]@p÷Wõ^_‘·å‡åÀ@£J: ²OÃi¥åW“{|ÚYpÎmûÚN©|øöHÜyN{–F­½ÛdAբ쌳Ãëjþ›d)‹|¹ `Ƴæ“—ˆû+šµ—¼Åﳉ"2ÚE+€8爜zú; ™Üú\ÒéÕ§Óœìî¥×âŒ{jŧ­qAÆ3_ñÓÑýõÿ=ß_ñÓÑýõÿ=ÿ=ÿ=ì9t¬rÜEÞ¸>:Dâ6о— †ª¸šqpÛ*_O,ûíéüŒE('H‘Žìsî¡pë ¨¨ÖÚ˨8Ü:²«7F\}Unúäê­ù€?!osõ„`âÌ ”Fs‘Ìá´ü‰èϦ÷0ËFo@1ë¥Sœ Áup˜âˆmñ¶† Aý¸W.»‹7åSôž—ºZ©0bAÒ{Dá9tq6Ll]!@ÄêZçìÙEöÝm½‡ 7ăÕ"†¬¶öQ¹i`•Â_SëÕ4ÍqÕ@]``Þ¼»ëÍR ’°Këvu_wAêÒ7Ú¸Gá¸'÷”ô5»vD`øø—afœ8 ¨‰ÄŸEZËÙà=™¯Ò;ºySjóÙ v”tÀœ³Œâ®Ý·ýJï6-Úfde`ˆ:†£°vÕ¡¢ê¥Ó¤9X@ÓIœzôÌM7(RåÇA.m®¡l}¬g °0í®[™µvõ”<ÀA  LFÆâ´õ©«öM«®öJ‚ÚÓ0}¨«=ÃÌÓDY¸ûøviÈÉÏ}?–¬létq¥ÐõŒséNMOöþÚC7¤é^‚饎 p<` ˜ï Hйse´ øœÏ±z 8 ª–.¸%%5?ê/ŒÒYxvçÐÏ¥•†·ÀÀmš`2‚_Vg$éè¾w€¿˜Ñfïjý#éè}/4F¤´r5}Ðh³Ls$Ì÷×”¨5b€’ª 2иjgˆ0H¿¢ç,ÍBß^$õˆïèK6¤é’#Ÿݵ¬°b »¨Jã¶z°¡fóE‹ü-¸u÷gØú‘—G-ü¢+µ«šÈb€Lă¶®ÛæyN^Ê=§]Và6¢§HÁŽç\Ÿ$y¶¯ka¨@YsžGÄ2®v÷$ü»¥øgó+Y0L°JâHdF×+ä(%y³pÉ À0$LmØ+ú»•Í-â8¤6ˆg\‹w–VWµ¯F¥ffḧŽÿ¨Ý½vÀ³ré ték,HÕ$â3Af0$€fjç5þ_‚ØÿÖ»{\ËvE8aß'm¯4¶¬#ã;ÍI¯5¼W˜¿áÉ?Â'¿¡î@O†Xé¾Î2ÝUiÙP\W´4ŒIB †+÷NqE¬*±ƒ%˜&œ0n,; ´ïwQ(ʳY™¤øDáÕЖ¶»ú”í#¡ã4†ôgê'£H•¿ˆW[‚ Ï c3NâSxd'2£¼(Û}$Ha©™T0Âxx™ À˜Ò£tpìÂï8ž…t0ÊA¢…û~ ÃPê>ú÷5 €Lf> p#¼SwS"¤x±ˆVy„àê ¦ÄRÿMæØ öÄ!>òü=¿W`OÈ7ïòáœæe†®Ý$KjÒ…Eù-ý3–nó˜úÞ}ýÇ}aXf6ÆýÇê «¤å“;†R \ú=f‚¨€Á€èµa¯yÝX—áĬBÀ¨Ì±ßMt*’Y—Z¨_5T®@cQÎ’ÃÚw¶æYjÓ§’qŒ"ì¥F®#*ã½FX׿¡,Œ­§­Ìûè(Ù0 ÷ÓZlÔ‘è Ø;qãh¤T’Rx´„rUEȼq¤º• Ò³Ò#2IÆI$ÿÓ£E¥,}C¬œ€í£Èù¡î’YcÀ­ mºÇV™¨4¶ï¼YRZ6ÌjŒHžÚ7à 0JéÔù¬Οµ¥½eŠº™RòŸÔX[æ€ÇÂÿxì?k#ïAÄü¹8MÊÿMl2{Ã!½mo?o!îÉÆ´®_?]pCAâÇ!×»¬ì¡sHÈ쟞ݕ&šýËe•†G‰s ´6gnæXpëÕ³¨ŒÁíèÓqC Ä=‹´* “¸óÊ­‚¯eâW^‚u22‰IVŒ„ôIÊ®ßø˜‘Ù’ú£¤_\ýåúÄ|€ª$œ€ÌÖ®q¸¿Ó_â9 ÿUyH»_åøŽl{}0FUüÒxÇñW¯eÁÔÞöæè[`ìBjl@L€¹}ã™­v‰a¬©JC¤c+»vÚ ¦ÈŠ[ÇëØc°æ;°û4"ð´ÿ ÿå—æÓZ­0q½HaêžwQw± =tW—žaþÆ ßq¸.ªÓÌ0K_餅ümâ~þª€¢ºD‰30 õuлŒÜFGÛÖz<¥Èxý¿]pœ«Í²ÅxÛ÷†L: |èÐ~1à?xfž±ÙAr;é­]‘³ô¡wÌw ¥T9Õ£Q¡³3c1¿¡àñ\à‹Ä{–~C ñ%í;Æ"íö­ì'Äßqsnܺè§&¾X9¹Æãwûƒ©}4„£6µb×g†Ùa¶£&p¨"@¹o1°äAÍHÚ 3ËÞ]¶Îã½~î8ô~£F\^ZŸ1¶Õo/Ì'@Œ  âwˆÓ¨íõPWŒ@" ‚DR056/º÷ÒZþmô³x›"{hk毙üÆÈ­O.w±,ÄMq+\È;±¦F2Jn=DXôÐ0d ôïǯ8ÈtyV¼[NÅ]L½õLj3Ž`ýQP6W–;þªÛj·µîÚ§³¼ ‹ŸÚrooWO’§‚έïz0^ãòY­-?baS⓳@ë¯Ðmχû‰·ï7¢‹ÝbÌvž‰¸%} 6ÆÑ 6ÇÛç Þè8³Ä5™:Yý5Ǧg ƒÑ®Ùƒ‘m 6Š/Êàþõ­£®ßĽ^!ÐB˜ õ݆®=Ѥ¶˜€`*û‚ éÅe˜\¸a¿†…c#Ù×Vtȧn®¹Ù¸ ¢q«_}}¢—°{:⮢ Ô~£G_ -ªέÇë «èÓg-­ÿŽþÚÒH¹ž³P;E` í®#ZÔçè©ÌuP$8’7®…¾bnÛëú‡ÂÚñ9û#gkd(èR¨ËÑZí™?dãôTs•ŽÿúGÒ+‚ã'S CÒ°}UÁvÛw•öжÇIÁ×mŽCa®cÝÚáP½¦}•úŒ[«!è€\vÜý{(«â åóŠÀHê­6³ Û;vú)|a°üòè[vD¹ÊŠ]$:íÐA¡K ÍÄ=xúè]Qa†ãõm.°ÿÏ¿}jhd&aƒêëùQ^u¡úL!ÝÙ»ÑÐ.!‚=ch=GmiˆYˆ,Ú›V }ÛJ2lb¡'Ç#Øi•p4“·Lã§nü¨Y·oHR4ɘQ9À´ËâA4,{ï ÿö¯áž³Wn·»Ü=5Ço£®–å±+pë9ú¶“‹˜=G ·Ñi9¶24Ÿx{hEp¯¦ˆˆ"™IÊ~µCVGØDeØúòÈÔš‹xÿU'•Ž ¬HÄŸžç¨â·û§?F~ší‚Ìrµ67[3»ì¤í¥æm‰)ƒGÿðŸQ ˆ 1È ê/°RÆX“€''çLáZPþš`½gkwìêíùeJ°‚ j\m1Àîû-׸ííè WP&íêœÆÜ«Ìp5 P²[‰ÀŒà¨ãÑæ¸à·k{£é4ÊH,¸ñ ¼jR³×*f‚¨’r¤·lãlf>"e£³*ÌDã‰óë§S'TbNã4Ÿx{kHÎ-¼‹=&* j;É?D 6ÓÂÊucoÕ‰ŠÕ\Gê¦tBUD“³çë­6›‡á8îî4öî[‚£ÅH8m˳¦{6“™ÇÐ'!Ô(Ù³>i˜ Ù9"tÎD’Û?î Ì9÷àé$MTU'2“^]±6„‚À‰S1V†Õ‚ ²µC—0bì®îÖÛ¸vþÄÛ¸)ÀƒFí©k[ö¯SuuúzB –cuš×Çís™îúy‹ xO¶¶¤Díú7˜@1 >¾ø©Y^ÌG®‹#†‘E±1HÅpÆþÚÛ:è=³Å?3ÛPp¸¹¤u{+‡=dÖ&M•áôN&­Ü¸5Z&{¿»×@Ú‚„aQ³¯E²5 ämQ²WÙ–ÒB07³{IövW“euÈ2>%¬©Ä Â@3Ö¿ ŒTn$xˆ’5h–0ÓNˆA¸¼V˜>˰…889‚6Ñ[po>;Lu™ÇH÷Wûè»$É=²ƒ•¼˜íOüñôn¢¬#0sy·,…í÷›»/M<+€úO}[·æŽ=ÒâÓ¾0ÄQea„aÖÙ C$à$ÑV“Û_¦äwáèÊ…§†Vñ‚i‘º¯4¯8úEcm½#¢|Ñè?]y¥ËŒ cé o b2Ì{+ôíªö }9ÕÆ½”¶Á“‡²…™à}›Œ`~ƒAíÙÔ½£5ìa…Zç9f‚‘ Ѩa2‘ôV³ tŽ&ˆ,{ç3RAbHFdœ‡·†¼?¢Ë ÛA áŸf1‡\Èí‰x:8yÌ/¬úé®Ý:™³?=›¿juˆxÁ†¿xí¤å­,V c ·³·n&ƒ ij!IâöˆÂsèX ÆÉa•uN;0Õ¨>¹Å` >õe„dÜ&”¢“æ b7l^ͦ™`é*Aïþüjà qD•Yº¤ºÝ&q\ H\'ÅŒm® #‰:ÈÌœHÌáEo7 ‰ÇןeIþÄHõú² ->¥X€0ÈÈp8çŽ4UÓFY0’HÆ|Dã=öÊ‘8 â@Úg*I˜Ãi Ž^è-i¥mR 038j08R¾ dá 7~ vSÀÁŽØÂ¸u‘HŽx‚ÌHÓ2<;©-? #1ÇH;ÆD©#…~£„X&2{x”Á¡vÊ—` d«”I1¨˜ß5´.åÃ×cШìJ €':¿³AÄW±=X{+„°ïÚ( ½Â6iÑ_Ÿô@²?7÷W µäýUUì\×Ö=ñ슟ÿ'ÿÚ?þ‰ð<…Ê”·f»1‹2òϹt—À[¬„/Ê%_Ù½vð·ÊÞo’ÄqTcåYËÑpš¢O'@f«Óœ>‘‘W[Îä..ᘆ½#c”“ò›üM£ñ#)mæŒm®ìëæë—ïÿ}†]f+·ñD ¸Bâ'þ³_÷ŽÇs#/Þ9}är»×ÚB3›þmr­ýgDº,:ò¦ÖE…¤—˜•βè“ór$Ý®±_Ì8i›CgƦݻ[>dY²æ[7 ŽôpçÇdTß’„JF"‰ºî‰©!3›ðÓP«¡Y¿9y"dí „©Qcȇ}-…3(„B¨½¤*¤¤„#ÈópßœiÄ ñªÖi2êÚ6I[ R½«B!KxRUàn3ÂeÚ}<{#F¿n†ƒäºúì·t0Œˆ »Ä?/´Ï¢þÀ’}îy6S¯ ¢zdé. L²Ø&än8j‚"‰ÕUWdÔÜs売ù„¼†áG›•Âtjð¸¢ì_Éiå÷ìˆ*§MÑt¯ó×:Í©¥½ÎqO«ØíRø³*äÔ­%ЧBØÙòÒ·Ç|}KоçùͬXÂvªø“óÞõ$ºKâªn.”•UU|UuÑzn»{4¨(ª¨›ª"oÓQ°G%dó)]ÈbÀV´ëØ’ÜGGvìÜ]tG~í—}¶×4Šx–‘¢~šÉã><ä.Cr,JÚ,MËxTÛ´ .Œ!É\p n5ëÇD4MÄÇtßeßS¥Eù„Æñ ÏUHqæF­…jãXC[ƒ%¨À‚ëvo©"–èj„;uB›9—Èj.Å­÷RÙ¨LÎ ÈÍ;\uöA)ˆu‰x\BlÉ|wqÇfö%IˆX3S2¶ »“G܈ݻ ’¢Èe–Æ;€ }Ä] 0|9ã¿Ë“.·~¹§ï“MdÜ:ʸg"{±ÙjS(’füY !#m6êv‰ú‰„Só·TÅÉóƣɩů+ÿ65±ºTd· ´ãQ^°Žß{ n´éýÝãÜ|®óõ¾7HH%Ê,× |Á–÷Vl0/ ãIéû:j»æŸŠæqœd$kýnbäîC…º]¾CÍ6“k»•vD’Ïjy¹¨'}_“cö£Õ·urZ—ö×À›y’ $ûýÇ3‹ø›—Î\×v—ƒÐ¼ÛPi»¾ë¹³›Ç¯ëIIÕòoª.£rgÌV]+5–Ókå|¼Å*q\fÖ®B²üé=e!“^ùn*(‡j¦¢UÕÁYY^Ú3¶@ÄvÙ¦›Aö"k»eÛ}·òßWÙQ;Ôs©zíürƒÖ¯ÁŽ`½x™€)§q}Ôó][ÓâX5ÆQlÅ_¯F²\bÊ´~…ÌŽyÁ3[á5ûôŒ­‰ª®ûí÷°Š—êêîàZP~SD@iÊ×ê,Y˜ÔÛ9ëúÛM"h>§D(7|•g‹Ï˜XZ¶Ôüœ¥ºõ\†’=xµ*®úÒ]qÇf»CW­/2‡v¶!´iùk­ÛÎjþ\i¨6sÎ[ºN:7`è¾æ¯ü‘ÿûdqz)*§ð…E]ÿý=v”U¶mšlM̆Ãè¿j8¥zÉ1¦å*÷$êøC[ WÚ/AV ëEÒów%qǦŸƒZ7e}V›x"Á»b¨žÄ4Ñ5açêAšw¼p< 6ÿ+®qTzl¨º[ÈØ†Cò³š”$­¥–¦¦nC-¾¥Å“ Çhä¿ e8q\}7l‹qDÙ6Ÿ‘pÓ2±l’,èÕRÈ Š•³š¬¬`™®–³ƒ]Cþ°/¯"[ƒà;ê7%cKŒ@°´bƒ£l o¨) ZÁd52|⸓q”E÷Òî4m R³O”^_‹Ãùŵœ4µ ñ–GaL•‹Sq×½6œVQÁC‘ 0BîBUÕ_|ÎbÌð¶whèÄÇræä,œ'#}z V[ü~? -Äè‚F«¤T]Ñ|ú=¶U–ÝÂÇ1ºÇ.æòÅà3÷Ç Q<“Ú½®Ž7̸àï—9;ƒÜ€­”<Ë0cÁ'iÔâxIp}welAuãür.3C•Üñ}ùŸ5'd<~$ã„D¾ÝWr3KðÜOó.&;É£Õ©ËÀ}*k’Oº ÎøIÑ;Ñ£%ë­6]‰<úxë–ñy\–³{«HŸ*G}Ïàº,h\YTs"!<‘FÛfC ×Å:jæê¢»ê·93#oø©›[ió1üié_—¹_lN¼´RåË/V\&•(„  E{ÝÕdª\vŸgƒù]vI8…Ù‘ ™©$_Í'’®âØ@íDØE6Mgó2H‰SÆÅ$3™‚DcZìHã-öžÙw§”Gu÷‘>òí¡»žBµ„äfe´ ô·‰%Ù´à´Ð(”X2 îîÙ ¯rm¦'•6].ÊDäŠÖ,U̘:ôµnh1!ÀBi脎4ˆ]ç÷{¶æ)L÷z2¸÷ yžñP.Ç*Ÿ!îÙEv^¨½S\aÿ„hÿÐÒ!.ÿUOf¹À˜!ãi’©òi.Iqš¸–R.†ª‘³"# -ż¨Ié¶ž>òmiiÎÙF3&¬^ŽÝUö7We‰³9.:”ÎÖÛìÜ^BDíÝMHåmŒ[VÚwxϾãí‹­ *ª!¶Bc¿ˆª*t]YS˰›5‰sRò3-¡5%fC%Þ(J$‹Úi¾Ê‹ç§®x8´áK7\W¤c°¿ëRaª¢ªI¢”JÈwm²”uh“ËXø|ÝñE~7gA%¢Å9î·,±ÆdnËÆú‚Í©1qPÄ_i »ú"êƒ&ùxÉdg•3*Û¨ª›A–TÅ…¯D’òJ}˜SÊÈÅl&ŠúÞ€6¶ÆZ¹âüëŽÉä—@Ý´Ø–QÚ—Gy\2?/ztQ2'™lç4ðÆGÀ Ûy²TðGp`¹æÿ—˜{­‡Jx¦eجqêNPKx»ìb´?ò7‹ÕDFz¦«s®:ÈâäØÕ¢*36:ªN‡G#ÈdÐ\aæ×¡¶à‰Šø§ô[ï.ª–1Ùlés¦<½±áAŒûò/tÝW¯AET¬äϘÚå¦Ãê¤ þ/ùn#GaW(õfÏ&í÷&ØmÔY]Ùá±rëôlŸbx&¦å…Ë4tp=in¡™*¢ L²Ð›¯8J¨‚ÛbFKàš±¥“%Œ›¹.•A›(f„Å”(lÊŽªãF‚à/ˆ˜¦û*jÿ‹yZHå¾–Ö=™J/um¡wÔ^¶ža>2!ù:.&Ÿ›a-ˆ¢‚¹&l—–Zñ#pÔDQ=ªºÇ cì[a¶9[tW¹8=iiVTGñ™Dy«pZ€ üuw·ª¨ïÛ¬Úå 9óÁ5%ˆc.årŒi ù†o”ó-1i&â›$€AQ[-LÀòœ¦&gŠä5Á&ë—^v5Üæûn«$)0]½!}µt6ýâŽÂœw5ü…ë¼{Œ°›¬:€íG®ÞbÝ¢ˆÛR¥´Œ0qàÅ3⬫ˆ¦jN/rïMÇá…SäUõÃë¶•ìIvÆÂ `ˆÝ„uDu[ “µvUDšæ­™!À²=½ÕDDJ¹ïkŒ? ¶þ£ë²ÿù5Õ6Õµ=µ4+«æÉ›Êé ³0 { MœÜQrëüÚg¬‹cˆÃŒ–^WIY[« Æji0{‘¶A!í ÛÜ!ÝtWX@¿y‘Úå£70•W=1Ë·ñVâ„XÔuö}ÅètKÞUºŽûjeã!s¼²ÂnI›»5Б/ãç¹îµ!ð÷\6XšRŠ¢ª>Š.Ä%”\»—‘øÖ¶-ûÅQŒ1²[Ø—ED"ôßÅÃé÷t–ÿ-áŒÆmmø‚ýç¥â·Ø ‘äN×Jq«ì/iSMõÈxÖÀ_3¶a®UGw;–¨ÜFÛ~;Ê5>'£ê4Ô†„Ñ´>õouqÎ:çð›ÆœrÉɹœë7NT[E˜äÈêà;Q Ö^t›uéNv°ßb#iyÌŸ'™Å¼’ÄZû.Jãöd*âùœ)í›ÑÇÓON-ƒ‰+2ƒgÁñP-M±¥f^?•cR?-ä;·fã³÷âÌgÍeVÁÁ÷…|Q?¡[òubPijb3¯LŸ1åìq÷žùì €õUê» *¤.~çøC.Š&¼MÄÊhý~ôèfŸqûgÃo]õOÃýÛ{"}}Ìrìs¹@¢”Ñ0ÔóQ#7g)ç[HÉ3í P‘7-‘js¾anV7ªGªUíHœÐÎuÚFÞ—'Ñ—O=†Q‹VýÙL›m¡¦Ç*£SUŒ‰þ#bÓ^¼ÇŽD‡{PuÂ2Ù7UèšÆ>i1˜nÊwã-'2ÓÅW-0yN¡È{°QTÞªu~)¿>ÏP|4M>Ì £Ê+ÑI§€%A°1¤$îEu²Eê›*. CÅê_|êl¬ìè§ÚÉvÆdmÁ¦¥7CêF «L¶Ð¦ê¨ƒÜ½wüë?¯…~â"EÄ`÷Ù]<«à-×B¤uòîO¯DQòõh0ÑÉùŬz:§‘tt—4‘®@]M·Íþað^!¥†è3b˜½,WêÛG:í÷Õ ¿Wð‘WÉ5cÉ¿4œ±–áõñ%XK´¬»ZÖ ˆÈù5¶,bTNÅèž>ZÊeä/,Èj’¥«+Ì#½ÉcÌ•U5ÁŒ2*Kc!ƒ'PIEU:ûÞ:L—(ã²aÝ) Ö=ýëUš aÜ¥ £lOÒTQO-)c\ñÊ4ªP¹jÙ”þÉ»ÏnŸ§[ÔrÎ1ž²v[| ¦‰ä³* •}ªÒýšÛ’¸*Ù!··­’`“ZÈ¢¢y™B44ì]\73glÏùÖ8ú”;V¸œeâŒf@.“'±ˆ‘쪛.Ýu.UNA@÷Åb9­K«æ–Z}×áJx¼ ¸t!]Vp?Í¡¬ÈmgÃw‰yò¾Íl€•^¦ª„Ü F^lôv_T÷wí\' Áøâ^eSqiñ¹ÖS)Ô Œ–îáóGÛ¬b3fsm]49n‰0ÌfÔ{…;;q?™–Ü–%O)3X.ãY  ë5Ym7våI|Á 2j*-¸HŽGsÞÙ6Ô«XuòqlÖµ‘Çvj‰eÛ´Ÿ‰@¦ÝÀ_y—E; ˆ|Ñ? ]åÙ]¼jk„õ…å̳ìf4fMÇ }ˆ‰àUz']W|ÆrudЬN\/–þ.ž«YÔíþ$²ewOÌ'ÊÈ®ÿʦÞù)}QSG#-ÍfTN¾®Æ#º«*Í‘!Ù¯§Ã°£ëˆ2Žª#®¨·¸î¤7<«Ë_›9.r|,ƒ¿ˆqaåñm¸u–VØô’&à+l´„‘Oµáõš6Û?M]³·°­Æh*i†äM}˜™ßf£0Ž8 Øwk`)ç²"yjÔ¥{Îñ©NDËøÊÒ@9qT H-»)‘ mÿ¼Ñ(ûá±'ŽÈüYl7*$¦Í™Q^6ÝiÁP6ÌW¢‰ ª*/ŠjÿåîÿÉs¶x­~YàRÇY2,±é†fåSò!j?å¡6N:[#$Ú¢.ÛiÏãìÕx““÷xÓ¤ÏuµÛfì²xÕS¡QlÛ¤¸à®>ˆÅ¬L”ë3JËhÎ3xP"5*L¹ž©8ãòÂÂn!‰!'rvê²69™L |C‘X:ip÷n…Q\³±×'°Â ;]mc8D‹°©¯v¹6Bcqë^SøLÁ¨Rå„s®É«2I QÍÈà(¹ÙÛÑÏe¹Å²»Ë }Éõ×5lÕ%Ùd,ÊnÖ96,¥É†ÃÆlª€2¢ˆž>³žgðì¯Wo ÆdUÕ”XUðQøòyÆÜã²t£*©ˆ¢}Ñ릹U›8’¯O'±¹žÜ¨ŠàðÚŒÜv÷qPŒm)¶ú&û ¦Ë¬žÆš+tµµ,â°©³IsgÃzFuÙódÖ1}dHjÁ‹ŠˆŠ¾;nšÉç5ø‘»SÃmWL«¶ÛYl¶rŸ!eŠá2?q‘U$NÄTBÖk‹æÏÕÙ×`5ͽ*ú ]K Fó»[€*ãL*È-zN:*‰³ˆF*½µòXu%ac6m}2ÙºÄ+–æÖ˜ ‡63ÝêM©‚¡2ñ ÷ÛêevœÇæ*jPeË.2̦^Beä"e"Ý)¢š úc0ïùëáG*¬ðººýòŽ_ÄòFÂù¡\ðü,vÔ•%´óû<󌩴 Ầ§W>¦Ü{ÎÅyY/LÅ·[/L“îª"ôTð××?dùW¤y0sùŽe•¤Ë&E–¨–Ýb(H*øÁêˆ6Ê#MÄA×}OãL_¤eLc¡>ÆºÊÆXMaªö‘=’z­×z‚Ž—¨£ºìZ:û(ð3,.†¶¢HìiL8í>㲉'BP…z¢¢ê?ËÇÌDùwg"t\[ËÓq‰.ŒV¿‡of2M›2‰µVØ”$>¸n½ûï—âùVPÏ!ãôbÕQCq«êá+& ;ÇŒå¨3-–˜ª‡Ü~‚+Žº[² _óÁL¶ÿ+bñR&Q‰!úQ³Œ}•Ýêy~C-•bºª·¼«¢ôJ t™=[yài\m…0ïFûû‰wíE]ºjSW ¯ c ÝñæHÌzûzse¾èÓ{%:ÔõKŒ?Ǿ3ŸŠß`zµ˜î; ã×TCb7$:ä©E(zqÛzSÊO=é¸*dª‚›'O¢öÐ+ñlÅÉxÝï’óAÛ2©Åé»Vû™T^ý…åªL¾•L`ÝGGR3Œð*ƒñžÕq‡D›4_MXfÓ›YrúVGKPZn½Éñ>É’4UõcÉ-Þ $DUTñ-ÛÅp ,ªÞ²+Uìã8,¶}¦#"ƒ1Ý}ÁouDGNÞ¿^—øg‰ª0è§û» ÒãÔ·ö– X:¢¿Q;­ì¹’“ñŽã ÔXÈyOn‘eüÄæÆ~k-·­åú GîÇÈqeKêW«¤4©ööi?Џ‚»,н±Ân^ÛÚ,Áƒ_°]]Kò²LjÞäfn)™Cr’kÊÙ!4€ëý‚dˆ@M:ª$ˆ¢¨º ¬Iˆ  ž=&$™Ki¥µ™ñRl˜PÝzYª¡w¸â÷) ï¥Ä0ËòRlàB2°eù–9•ô× .•zÊ“0Þ­ABq·ÝÙC·gê¢ÈL†M¬º›¨ÍÉ>'cÄÊO©œ Û‚ój=í*Žé±'Tݪî\”þ{Æ=ÈÔaŽÆöU"«°C”üFÓ¢|[#õ¸;®ú‡iW5™õóÙ ö1\Y}—pq·THI¢¢ìºÊsl&¸ß©b¤×$ÀD¤¸³áDp_bž+©9°Ÿ3•5–QMÔl;CÝÕV=5OŠeÓœu¬2¦|7U‘#0áL­ˆN½´p' ¦ÌMEÄàÛÞ·Äòª¶nqûØåʹäèb½P„“¨!Q$EN©¨Ÿ*¼ƒÈ.ãÙ)8Sø_œŽ¾4ë[ªxŒ˜; §ä§d[¸@ + Q\6SÔ ÞG8o.µ«Å(ç]@²r͘ÓäT³›RÖÅ•!ùQâÌ}IÙ–rm€–ç¦Ð<^¡jW3Ö6Mpo)ØG‰óFÚ/£ElòŒx™s A%gö§TíyQTWM>àû¸ËÍ’n$$›¢¢¢îŠŸÊÆø‡‹fü/3ó„‡é±+NÿÈ«;|…áò,áï÷ž&Ñ7êšÇ0 F*Ä Æb X}ëÜóÆª¦ô—ÏÄÝ}Â'%ê¤JºÅ¬r_L[ʯ©bD—Ò8̃e&l©ŒHÑŽÙ«míÞó6ŠEÒ¿;äÌajøú-J̨uÙ__¦°áFˆàµ: r"ª¼ ¢ìg ›D5î¶2³®qÖJ|ÕFa´o7„2÷Œ‘h7]×ÝòM@ÉÇðú>6‚Ù5¶âIM£~t™”†f3 þ9ÂåÄ2(®öª§^õƒKWW‹Ò°nÉv46xÔÞx…¡m±#5R"Ûª®ë¨¼wòû"~#2¾}‰ä.Z3Vý½u$¯Êçv£büªã9À!fk’B.ÒAôÊ´.aûpˆÀÛ?HX9HØ£ÄК© )]¼t»÷'QÛÇ\›ü½A‡Ê´Ù‰ æE] JÇ¥År·ô¬ûl™&åŠ#æÓN ¨I²whfsNg'1T1Ájʬi…è½…²G¥íûOšïû:jª‚ª%c‚Í|ŽÈ¢{´ú¿.Ìë(쉡}º·ÜR”Mª‹ ‰¸¨J*‰²uÔ;f®ÃžÃRb<¢AÞÓ†Ùvš!&註*o­Õ6Onº¦ßn»¶^ßÚòÓ•Y<+êÇSg Ø0܆—ìv_­:édð¾k#Š ¦¼{¶¸ë¾>ãHd²aïídÕötr7×ño2[6äF-¦¶Ó°nÁôœZûQAiÒp=Õ^í÷W»Rã˜ö ÜfÎLú*ù_ sfpÄVš­‹5VýqŸ_Tû»œTåDAÔ*ÌÛ—?!¬‰6²ß:šŒµÖm3+ù«ÊÁöÇTº¾!Þ;ÊÈøò¾NEÄ2Ý)™FÝÇêQÅîvË^‚Ÿ}؈½¤›“{/…NUŠÛ1wAvÀɪµŠ[¶à/ó(®èB¨Š*ŠŠˆ©©ÜµGTÌé5v•ÙQ\­<ìËÕïGb¬ÞžŠëÐëkÑNL†b‚) ¯†å©¥ã4Ò±ºGl"Zr•L§‚žòK 0xüwОy¤Büs2ì÷D‹GG*cÔÖ°¤³iˆå0×¶e5¼Eï‰>1¦Ê„ÙýäßÞ!^‹©5WXë>kã[féùJž…§¦2Ôö[Yö®TGeÒ²¯ž¨NED˜bI<Z›KÍôÏÍüéÛL×dG ûy¸ìµ$ŒÝûPnrÕ“VÝ7ˆª¨jH™Ênobý„œçœ’Í%'.p—ôšŠNï$T8©ß5oÒ-¶Ý“:ÒÎSPkkc».ÂsÄ€Ó,2 n8d½DQUU|µ{óGMž_q®Ipá×pƒñ;] Šj1Z°­}©dâ,·[-•;ƒ´“dÔ\{ægƒ:ëƒ0Q£²q ÆJ‚ )I ú· Wî½»{ø8‰©57P*ó,7(ˆ‰"âÔêùÑœMÄ‘S¼ WÄHW¢õßTøÅ È Š¬ r^˜ø°Òlr$›Ž¸¨72UÛÏMPN¶° ‘Ò¾òŽú­YYP¬ªßIdIiöí4ê¶BIâž •˜óV?—¶I"êÝÿŠŸ5÷ MÙ2žØ{Üp‰UvDDM„Q׋쫭k8{5e+q¼Ï…ÉÀ9Q©ÍeqlÞQ`&é¶l ˜i  w@ä ¾±Ún]Êñè :Å¬Šƒq¨v“#´NMv: ¸BámÜ ª]¨Z·Ë³ ¸˜æ3BÂÉ·¹œ~›,¶žÕñ"%è"(¤K² *®Ú‘!ÚñO¾½¬Õ4e&Ë_ï“ï ÄðdÔpWß$EÙ!ÑãÕq©iàd:Øm£Myªøªøª¯U^ªºëÑ=«á§®hæ56ñh\…G*3¾„Ò Œ]'4íï]Ñ|õ€fì\À°È¶ö8_&âÆÁÚ ˆ¤¯">­'j‹èÛ/n(j».é¬^Ç© “ËhncúhÓox’“×OUÅtZp—mþκ̪«2$¿Àøå‹Œ¶+-¾o•}ÕÓ ë^5%OÀ&ŸxWpïÕV[ŠÂk—aÇs"±tíËÓŠöÚ`‰×Év+¨£cl»*§E]“qÖFy¼«p/à›¯¦º%yà”ËJ’å6ñO°Uˆ“tCUáEÛWr3Û{zÄnÂê õvR¡¥\}…µw4ï0ꊓnö¢™}º¯õ‰ÌzÒ^='™Oc³e ¾{ŠÜrÿî@QK»eEÛ[*lº—C“TE¼¦œ=²k¥‚kì$óO!T$ò]"ÌzË‘¸i•ÙÇœî—c þÒª{óá¶ž;þ+cûBšfú±cÍ¢ÉÞbÞùÊBi–²†c¶HÄY²AÕ¥>ÞýˆT»P\è›%øgØÔœ'ÃY‰\ÜtIs¤W]I/Qº†ß’€ü³ôÕLýÞÖv £|™ŠÂ‘'‰2ww+`ÑÛU:·_DRÈ+£ÝQEE–Èô!÷Ñ;“¤K*ÙlZTÛF f°Hëc>À`Iº—éMcy† Ï0©+›‰a0 ˜j$°ŠŒ%sÒT…STÓ@¤DÈ¡¿ß計¸5ÖT’ñ»Ñ…Ë È(üGþëaª!"öª/¼;/ž©>dñV ɸËùN™•@[¼5ç¥6»ì„ü_‰¿]ÐÃõ¶ÓÔ-tmdâ~äž_ÈYz6=ŠH,©¤_$ÕO=BËî³înÁ§7tÅÕ¬’°ˆÊÎ¥f#[1,¨æãhÛ@›Šî«×X‡$b2¾3Í*ãÚÕ:¿|[|•·õ\l·"EO/äaß.øüÃwÏ•I`•‡‡Ö ?tîãÔVBqT¶ðÔxpذᴠCŠÚl 4Р6‰à‚(ˆš~$¦•SdÔ¨¯€¸Ó­’l@`H¢H©âŠ›ië—|¡œf ά‹>¾õeâ3‰UTþ±Uz±ÓßïÇ^ÝüCmDÁ9²O r¬…Œ7!t>È“mÊšÔ{cÍUè(¢çõšT$QT訽é¼Ìó†(1Œn!͹¶»M’"u#%T÷ˆ•uÔ@äJ÷èøö•ÿ‹â~!•àÒ'î®nÛû®Ìp}æÚ-Å]¾þë¥Uê«âº‰gcM„»‰¬Õc•1‡cc%vb?¬{4Ïzþ»„‚ŸoM\åõÐr{¼o* ¸žuÅPåyx­¸Fˆì”yïIÆÉµ3°Sq$-d¹Ó}]ÌuD Fv#î±\ø½×ä›îº.5ØʶØ"n‚¤»ê{õõìD“lÿÅZ>ÃbJ‚!ê¼B›™öŠ'quÙ4§’å5ú'UK¬G/ø./ô´è5È”Šnš›ë{¼×Ĉ£²HKõªèZo’éãªô’¯EOçy DÒ9äµWà½Qk¦1%™£%þ–®k­j#IDr Ø«hIŽà¨“n8&©²ôëÓËMbÜ}E&û¾~%îvöGfé³:- 6Õ~83 ½ðmÍÈýíÐvN½½Þ?˸Çq›äXÑ$J*(´°ìBï«ø©¸¨ˆù ®éäPÛ8ÖFµf¶BŠIe™M¡Š8»ôßmüË蟛a^²ã{'ŠW"ñÌTî(jK»¶ôí'A!OyöÝ1÷‡eN•ܕǯEÈòjj 78ÜÍ“])m˜Ìɉ"M+¨¨Ú—j¡{‡î©&¤ñ×!_ÎnòÖiTe¬ÄH¬«Éez !?êt>Òt –Ú‡ÅÓ\PâŽD–ëœS-Å^ÊK“îvE ôduv.ëл›O-v¢*ªôíOÔ¬C‚÷'ò3ëØ½3 ‘ ï±Zدs1EÄ}ç?¬Ó6¼Ó~Þ@ãõœqTŽGÆ ’l¢¦É/©9Áÿúª{M´Ø M4( 4‚ )ÑE6DDö&‘S¢§T]r'Ë›þDÄw8˜ v-änî¹­úlÄ£ÀSõ]%ðOäs71«&޲rñ¯š®à5ëÄ–2Y_d»"uwóÇÙü‡ñ쾊EM#©ÁšÚ ù8Ùt&Í<Œ <—M3ˆØ¿Î|_d^:Èå d•¬"ýÚ‹—7I" ÷X•×dAÔ¶°û—"äÕ)ÿxð ––¾þ°üÆT}ý‘\;|‹JªH(‰º’ª""'Šª¯DDÐÍŒ÷­À\ida†ÂOÜå7ñ [záäTØâD$PŠ+Ð˹ÏbkÇr%ñöªë7±n¾F‹Ë—Q[’K‘øò§WdÇÜiQ¨Íª*"‘w.ʽGaÜ9]SÏk‘.fÝ……~A5÷Åê©Ôm6f‘‘„Dp D;S`ÙzïÙ¤õ Is dH&[…Ùì„áö"‘uÔ¼i‘òf­O™äIÄè©*ÅP„‰<Á”"û4Gžr,ØðÝ]ËÄTª ~ÁÉE)o'µHÇf½hgÅ*îS¤²’äûI顪þv2ÃL¶ üȉ¥ã´ø¯ˆ¸h¿ ‘uññ*楢î›ø)"^D/ÅVôéä96Zê8žeÝg‡öš=²Ùú½ãDöj5ŸÔ=ÆùLÂF „çEê™çá´+!Dl•|ÎÃòÙugù¶Sl·‰uf“£¤…vz6#ê®÷*/bvì›Ûô꺕ɶׅ,,·óõÎb?!Ì‚\ $hø«À™ †¢Ð{Ý».ÈIªÚÎB©^1ͬäx8¥«í‘ÌW×vJ‚Kë&Ê‚}°÷ðÖþ ¦ö5g†9ÉÇ÷œbþYl.‡“pçBOºÛ½z!jÆsxíksí§5ek3áZW_›Yᨪ« §io¸ùjÃÎíÞ?"iª©“zV ’9M|V¿ÔeÑC^ÑO$EÔi¼¹âu5‘Ã*ªÅ»Ööíßq£9rÛRXÂùªnÄ~»’¡žÁª18øT$I¯ãAÑø©_!cJøøÊ"ëP¶=œRRß»t]-¤{40Ñðnß'ž*óu±Éw‚0ûϺE°6ŹtM–ßйȭã›m ™#õí¹%KÔr-|a™ÜwWwM¶ó×ó}H¸Sø~õ›{6šûòhe'Â]Åéâ‡Â4OÚ_-A´­’k¬£µ*Æ—pu— ·|Ð…QSèå@€_õí]+‘1F‘}ç.lˆ`Ö€§š¬§ÛèžZİÆKÔ\v±ˆ²ä/‹Ò»{å·9…³Ë2Òa/© úˆûE=𲤴e$W[Fr,ÖW§snjì¾Jž(¾K×Yœüv⪪Ίõj¡à!­îH .8óó‰\˜®HTšPDhznž:VfW7.‹g[bÊ*!ˆ>Ñ¢ø.Û¢¦è©©Ö¡ì­Ù¿ yá4¥dóÐÔ²„Z‰èF‚¤é*{ä¾Tß}¼ÓR«æ´BžË‘¦2IºNŠŠ§Ö*©ªLRâYKÉ8bÎwÝ8âîá·PiùsŠ‹×c€ë ‹ç×èùpáæË½Œƒ+•›ä¬ ø×â1½fEÄý“›)·ñQÒªõUñ]QW^rV)‚;WfÝÛ¹klJ¯³Vu¦š“ Çš7s½P“¼G¢í¬~©eRÚUb£ùõ¹2áØ± J|S d¦¤Š„)·º[j~%'òô¢Î#5[¦-¡VÝ¿ ]õe`¶„ø#BÚzJhgÜIºt]5=úH4·y;«ar0éš qÕMÛd¥WÇyöy=õh» }Ñ>‰3f¾1aBdäL”k°¶ËB¦á’ûQUu’s-³Fͯ)Ê4l9ºÍ‹Bmš8Ûˆ„Û‚»‰ &èH¾ÅN¿FMžAÅÙ´È"@õd¹¶Âl¦ãŽÂÙHíRAê¾; /EÔٮ˪—.¥iâ¤)OA1BlL–šG~òm;w×ñ ¬N±"}‘Æ©i´mö§E~¹"|Þ2QÄD$TûÚ‚Æ•n-"XɄٵÝóVÂ"ö"ª¯ÑË~ëž(buÙ…[d¾ïæ4O~Y9?hØÁÔ?Ft~/ñí5?T&ßÉ~ÚR§Ö¬·êÛèËkmãÞUgxL› z»#Ç£5:͸aZ-d?Ô*摳ªæÊ«Õ•îÖ,Ì£‚ãíSÁ\«nlÀ"`wßÕ6QBê‰ã¬f¢C0ë'Å,>VAùDЬ$u¡íÅ-·àÍLQ¹Úi{48¼§Ø4jÒÊ\(Q ×"Á‹&IœxqÉäCìi½¼Q¹KdDÛè©ãÊlj‹^^»‹Š‹¡÷Û¯sy®§Ô11þÙ5&F<(MxqÁ6ÚhPDòDM8Ð8&ë(„óBH¦_uHSª"ùoã©PßÖp$!ÆÄÙ4OtÚt¸WoO·TÜgÆ95¦3OȌʓ›á ¸ÖÁ¥h‘$I…ê÷9 ä8¾‚ eØ[—DÛQ`@Ž Âd#ÊÒl ´Úv€ '’"m«\n»Ífãé¾@õ[{µ|ÅK´ÕT|ú"oÓ~‹ªÛËåÖ Œp&‚†PÓtDT‘o-ô›.þöûê5md&+«¡7VÅ–ZðlìO¢}M‹)"¾Ò;°ç°Iº/‚¶à¯Ú$º=\û‚¢?ü+ùBÛ…åÞLTU­íÓ騈».-žž£âƒe’Iô~Ô‹¶ú‹è ûŽÝ Éò”±gå\G&rÒn²:¼ÈX°@;l©Úh›ôÝXæ9løÉ¿@rvU`®zž½¤çJDÇIÅûÿˆjÞh‰¬ë“%q¼¢Ìëq…^¾%AhÝžÄyÄqÕöªýÞeÇ\½Ê%‘“âU·Z— SÔô›BEî"%^ˆ%ÚJ©¸ùp÷:JõáF#ÕKâFr+î8ØIFT•:§r§Ö¡×Y×'9m>#ùŽUø|÷A#×GyÀlP‘·EÛǵ5A‡†]aWÈX¼‡2eL"{Öq§”d‘6BmmÇÃÃ\× ò cyN7° Ñ95dÇøW_v2§s¦›.æžu×ç¹EºØ_\3_.¹É °‚!ÕÒŠø¢ì¿N[^)Ù;Ç`_°>K2µÅ%SëVÉ¥_£¯‡ž¤Ìʲ::’¯+ÝiŠ*£~ÖT4i‰ó? [»JN©!õð^ÔdvÖÕÍÛ@¦®“:]c€ òw³µÄ!ëÛ¶ê5QËÃ)¬ù¢D˜â$ãNGøqnICšÉªw ¢)ï '‡Ñ-ct‘‚ä44sOZ»XÏ’§öˆZø¿Q>Óõ½_.Í»»¿›Ròêy^]–Þ¯U%›}4ÑU|÷O¥eN¨º‡”ãð®1«ˆr@]Õ‹,9ê¾’iØäù¶M¼â!8¨…ç­þ˜LW½\ÊácñØÕ%c¢ŸR8ùþd3ÊÂ5JD­”âZL{áãÆ$h»uí‹Ó-•KeÛÇmX¶y.;iŠTGucWÐä_Ä s§$T)*¦ŠätUŒñûå¹+Ĉ›¹!Œ]“+èå yyüL€øv6úýGmcÔ,¦ÁO]'ÚM¶(kúKuúâ× «fgÞô³gep¿iÁA5úÉ}‰×ÒGÅmã0Ŭ·é»Ü¢Ë#Óµm‡¶Õ^:ª=­ Txì3P!¶KviWrûWP¯\©ŒåÕk ¾ÐöYTTVÀüPv%éõê}ÑbµËkhÓÌYNôQ öä ƒÂâ&Ⱦ ª¡.Û®ªjÝÇ`9[Bê?IšEn+¨ª¨mêª*怜2,^ºæ{‚ÜÉL‰9Ú>EÑIØ[¦¡ î+[f•Í£0=V–‡ª6 »~χժGÀ۸Øcæ ˆü—ÞFQ|öÒ^VaõPmÄÕÆçµPÀËÄ>è/_Dú2ªM¿®HF_1x\d“ëGWXvHkÜíÝ4)Rþ8ÙWÿ= FIi§`ä›db„Œ7÷ÝQUß°|ËÁ5t) Ë…1 ~$¶I ·Zq€À‡t!$]ÑS\/t=\»ª +í ~!´_íã}5×8å[ÓïÖ­èÑ>8Ū8‚ê§&ÂK‚ÜVÕUò¶¾ú ©&ʾJšþ,ª@)e^.,¦ÐVP")1Ü«·x¢¢ªyjK˜åôÀ„HÊÂï¦K¾ÝÈžì»/‚êκ›*©²¼ƒKÁXÌqÅ6#TA÷¶íꂺ›M–Dƒ÷ ~aBôFxuZ…ÞáïÚ½zxlºŠ -a–R,¢j4ëÅÔÏQE{‰¾¾ïÕ¬ÉÛ–¢´XýóÕ¾²m –ÓtSî3ܾ´ÛìúDU7BTEO©uŽEUÝ*åZ×·ý„[)-Š~„DÖ-‘g³òU¥Èk,k&1_2oóè rm´ÑmÕß¿bíRÙI=”c-+ïÀ2l+N2¡±@hU·‘„vØ“n¸¦rª Âä ”ïUÛd}©,–ëìØõþrÏøÀþ®¿Î™ÿÕ×#SRWSd´<˜›¥²Fü¥\†Ý#*ºØ zé**¯EÕe[–Í*øLDr[އ{ÊËBÚ¸^÷‰vï¡3 »°§Breü—«ú.è$Ñ;Ü`‹ú†j?V¿Ïc"y~3Ýk)޳¢—¯M`ßo¬ß^èÎ&ß{Gfª¾ ü¶Ès=ÛÄÏúšã{«þ1Ç­nçTïkc* ›Ï>Ûî¶Dá*õ_sm²[þ€ÿd¯ýžÞ¿Ù)ÿg5ýM² OþÍgúšÿd—ý˜Çõ4?ý ÄvÝ7Þ­îu›Ñ@ŠÔt\‰•A‰‘@m†Br“M€§ADO-^̃‰ã¹n$Åt‡3Xòe4ªÀ“hذÜPU5UU%U1ìÙ=gXòWa±‹ü‘†gàäóõÏÆr ú œ§ŒÕÇìT袞;ï¨óîVexÜ·WØdÈ*¯ÙߣOa/ûÿFé¿N½<F§»ƒ`yf'ÊÿšvÁHm9·¿ÞyÖĽÅ4Ý}ÑM—ÅU7]aÜ·±~íÊuÇ34o ¹%誌¼»&ÝE_í\ ʬv{²ò ›–6-“›¹9Y'‘å]APWÉ5δ8MRÒ³k‰6Ý31[XñóÄm´H‚G¹Šl½WP±ˆüy>“>¯Ççǵ¶~­EF@°^¯|ž¤ž¶Þê’&ßwÏ®šcÐ%ÇÈé¬nj%°,­ð–h`*­ì…²*’"ù)"ë†j†ïÃÔbN7e4/I%º3{¸Ñ;QUÃ_ök<­¹Ä²9îÚdr¦Æz%6ý=Ô:©uUO.š‹(› L¶ð¶i±Š8(H„žJ›ì¿@*ø!"ÿOT’?VÂÂæcKíìä¯éMbÿ”Zæ,‹;ø¼Ä-ÖZ´?—nª¨¾‚~Þ{wtÖ/üf]ùbVGL„·U•ØýÊïwímÓ»}µÇ6QBt ¬ò¦<ÈN¢¨:з!ǶTè¢+¾—ÿ§TÛèÏû½³ªoñGýÞ¿ÙÕ/ø¢þï_ìæ“üIu¯ösIþ!º×û9£ÿ£ÿøµÍkhÚv\×Útcì MÇ2EßÅ7Ó•Ö_–¹#õîx›ŠŸïê=ôsȲzWذo&´‰úé”n<ÓeÁ…!ÐWmåFÌÁ„KeTEMÓ¦ú—Ç·Xeuüš[)õ™i‰¿!kà, ¡‘-¹M«`2{›ä™íâ)·ÓóޝºPó”¸h?â®ë¢ÉûĵtüzѺÅ|§#Ó’! ³H†:¢¢¢£ªˆ;mç« r)ãvŸ‘EÈ,£*6(í¥<­½O(6AuÑîî_Ý^î›k‘j₹5)žª¬Šõmõ÷2‰ª{¨ä„żó$ö>عÿÞú~ò¯M—¯—³Pî/²ëxÕ|Æ'űˆû‚;Ÿvꊨª¨£æ©ç¢T%Nï½·Mv÷/jx&ý5·q*'–ëå®îõîöï×J=ËÚ¾)¿M~ð¿uׯђ^¸» Md©Cõ˜4J úKdÖ BðöI®£†2ÇØû£®ÿçšêUãOeÑ£crÛ£¬‹7S"Ë®îÕˆGW7½ Mú§ôõX¹ %¥ÄZƒ=»GâdºÃ@'+v ÀQt·T]üw× R¼¡qivøûº¸ÀKþ„O£on®2,½ Z«,¬\iÁld0ðÇs±{ULQÒAîN›ïì]lºrœ"¸îó€­;èÆXMÂh^q$!úë#½{TUvM¶÷¾ŽA—¾ÊÆ9f£ö”W?¦ºþFËÖÿS‘ú[{ÝÿÃß ¶ÞÝõó)‡úiŽòöC&3+Ó¶5â1nÆÉìT”»jXÀq¦g“.$d  òŠúdà ‰¡l¤ˆ¨ªž ªÜk0¸; ø·nG¶‹[‹•u´gZO ·ç/¸ú§)Q¯GÔCUNº–îiT6“ÿ©m¦ Í®BRDSpc8àö÷'¸i×ÏMáVð_‡ÔF¼bòŠ,5F–ÚVK‡1=EšSšî%Dp”wÜ•vúg ¢NPÁØÉx!Øcr‰§íøib¿biStEÝSXæI’ó]ÖMbõ££sƨ þ[d6ÛÌÖÁ¿“Píqå%4ðNåÔiÐb|ppâIm[uàEVÝlº‰".Ä+à½5•q¬¥_‰ã»w¡@î]ÉÊ™j²«]Oj+'ÙöЧӄvE;b}Ù1kcÃþ˜÷£jŠ}ˆªHš¿³¯æ;îFn–šL¹´“ØØ-¨’¼¹v©§oj'ת JËØ°/ŸHŒÝȆ!©$]¾‘¸†½Ê›¢—gvȺ“Š}ÅÔêÀG/äUEø–«ÅQUåBB÷QQKµo·¦°ì޲÷"Æk¤åÍ×0å{m£Òi7Px}aDh‘wEÝ~°]dÔîR_XÏÅd«6Á(8Ø®Æú¹ê" b»&å²îºÆ."„ûdz0îÆ(kcúÓåí÷ÑÝ{¡*¯·Vk_m]•…¼¢²kЗÕßdpI6]—eEò_§ ㆽïâûfäÞ oîSÕ˘E·‘ƒi¿Š–½ÔDî_tSï–²,³ ‹Œò¶rzë&§UÚ¬L¢ª%GcN@i‰ˆØˆ»é/r¢ö¯qt]Óhs‚ícòØmç«_QWc™Š4â‚÷®Ë²ªo«7E{âñþ$ÄPfÝÈYŸj0ÀoöýIxѦc6O<êø6*D_¡Qê¼®—̯#̱Æ~ºMYI´±†&ø•6ýqÖî/BTBÒx"’þŽº°³ ™Õ³Ø;;xbÃæÛ„P›(¨Ão2Ås©)'orúi¶¦ã‘‘JVaaSŽEñ#¶±dO?uÅ×åš|Âü¥åévz}¿ðuËð=8Ü›‡c¤Ûd7«ýz9ŠžÕDe•_µ>Œ`mqFm¢[Ô|QMvšã,zS°d G%DY ÃŽJÑ¡+ïÅ¿´u¶’©š:˜Œˆ×ÓÇdc7µ÷‘¡dP;wêˆ}1—Úå6 c¯»+º¯ªƒ>ÒTHPÁ¸*üóõB,(@â˜!¨8ê**l¢$DÑ <WÁQ|Ñ~Œ'•'8§#>ÝAIi,“òûDé×amÑq°ÒfŽ6H„ÛƒÕWª*/±S®²|÷2Á”Wó'ÈI« àØn?kŠg².¹lŠ¿wEI³£¯²‡*fwkØßç—Hø{mR&‰‚QU^åMÕE6Õ1Âhо #òCm¢ªþTû»Åž¨ž?ù{Ëþ ×É4$†ˆ@b»¡"õEEOTú0åÅkâÙËÇî?0“[­´Ñˆö‰zŠ=ÈJ;*'–¯ëïðWiKa&Ó«@ùHu’UKÜ#^»¦Éã®<Ã[€Âßc¹XÚFø–VA) ݤ»8=w×$Úá¶8µ” §²mãwÛ"¨ÈIÄ7›S Nò$DBBM“d]`ãK¹@ÎÞ·”N8 Åm ÀïÛ{tÙ5ó5ÈŒ£‚íãë6ªò“oŠ#‰¿¸›˜ýíql¯fÆ÷ ‰&æ/ñëâzC®§¡1’DNþ¾÷_¯eE¿µ²ÆÆ-o_X­Ù¿fáFkuo×qÒ!ïE%ê+Õ‡_}Ðe†œ}ã^Ñî"%_DM×W¼³`É6cWƒGu ª(Ƥì½Ef=»ŸØ jà ±qÚö‡R`M†]öòfØ„۬º*6b¾(Bª‹¦8âíçÆ,”ËŠòW•I`}â©âøHŒ‹³{þñ½¶ê›%Û»¼R<»I‡*PºóJñ'MÜFœ%ÛÏmE­¬ˆÕ}|&Ѩp˜ÛððþFÉ⾑‚V8c…R< ÉW¬ªˆ¾B¨cMÄñ76E}Sî»â»i¦i¸Ñ£6-°È"m¶Ú ˆŠx Š&ÉìMLtטëJ1-$A8òf`’#õò^lI@ÅÚ_ ‹ÁQu£iÆëàw›Æ®¼ë®š¸ëÏ8]MÇ ”‰WÏU-iˆ^]c·n|M­å;?ðc }TîŒØ¸ã›6ªŠ=ª*½wµTà ¸ÁÚÙHmè-Öº„þÂ=ñZ#F×ÓÝ•|×eèšÌòçõkxwb¦;ªÛ)•ë–ËûCËõÑÉttmz™]$òŒ,…\K|}ೈ-íúÎOì%Ö7˜V.ðrzȶqÓöRKbâ‚ý`J¢¿ZjƭǤF ÎGY1ôd5Þ*ˆlºˆª+ÔI¢õÖcg|‘j¡e% ÈØ»6³o¤5"(¸Í™i?cuçÀ€H[m;Sn»ë#ĦÈr$\’½ú÷å2ˆ¦Ú<;w —BÙvÜW¡'E躻]hõ—糂c¢LµÎó+Øôp ½8‚ê©¿)ß&bÇm ×Ü_ÅWQ~a‹dáœmþkÉÕKÛ w^îbâEsHC`8h¨&jï¦Eº §FŸaÐ}‡À\aöÕ „Ä“¢¡"¢¢ë"ʸëbÓ”ïâÅ \€\i¹Ñ*Ü%nKÎI‹m˜´Dˆ¢£¾ýʫ۶«øÙübñeåíM¡‹vVYD¨ ›;Ž-,Ï{N¢¾ÙØÎM ãªçl[Ѝ<ÃÀ»µ";©Õ·[.¢Iáönšcä‡ÊÃ’ê1‹ò’liôn5ª'HÒQ:w¯¸çŠ*.úEEED!$]ÑQ|Íùfã„¶Ø©¸á*ˆ§URU舞ÕÓÔØ§*±ÜV2>MèH+³‘iГg]_{î–ë¶ c¸ô®©®ñÅTˆˆ—sqÃ^¦á—¼D½UtÃ8CÙkt’ÞÿY1š•ж#L©Kîp~· tqåBVÑ•TÙÓn+ç\ÁqêìrÖ@È †¦zhãl4Ó††Û “»’6‚=:êDÉ„X‘7åÊu{A¶›#2UðAU][ó;ød‹ü.â?äø¸B%[zêhΩ,¶á :2ÜüC@.ý‘6ÜvÝ-±›f-¡oÚé4ªŽ2~m¾Ñ"Fžbh‹ô+jè¶°ÍPŠ$ÆAö•SÁ{BMÓÛ¶¦ÙÎqªÚjH†ü“Am˜ìëÚž‰²"'ÔšÇÚz¦ã»8c2…«Ò6EÚ¶Tþ&L+ÞïjP¬†Ìšwn‚®É­‡~Ôè;ªªìžªõUѺñ£l´*o8]@Sr%û7ÔîL±ŒL[ó¦Ia—§¨›85[¤†×ÕøHÀàÿé>…EMÑ|S\ÇÀ΂± ½ÍLª¶€ÅtæÉ‰õÒÚYu²è ãfŠ„‹õ¦œ—Ã×LB*™q¦Dë‡7ê£]?ßv7ÔÞf‚¿‘(m8ÖÈ•Vé•Z÷Kþ"ÉŽøÎ'Ö¤?f‚M\èöQ7 ÁSê&Ô“[*m®ˆ«¾ŠUµ„Z¸À›œ‰‰ý“Š)£…Ç´6|‹=A_¬iY¬h½¯YH@`Sû%ú´ÔÎY¹fMp’8ÏQ›V"¢î):Jö½-SÌ}Ö÷òTÔxq#µ FѸñXm¦›è ˆ"ˆžH›jó Z(Ó²¶›f°ë,±øê*ÉWº½är‰ @Å}Ñ!ßÍ+9-§A*sq vÒCV E°ŒÑ,"2Pu¦‰MͶUqÃS5良j®žâ\~AŽ1Nm½Ê·¬jj÷µNɧ‰¸©»Û}ÔM½©«›,f§Ua¬±ù´x=„ä8ÄŠ-¸‘…}Uh6"QÊšþ%¡Ÿ'ËÄ(©Qy<‚[ øRA|ÑÄߨI¦àrµ[p")#q¹ ¤ ʇUWaø¶º¹ ×Ï»pßÀ‘4ĨψÒ[cIhÛp 7БSÁSSèoa…M›~”ØdFb„„žð’l¨Š›.š¾,žêýšè×ãõ·¤¯ËÂS›þ”…DpБ¡õU<~Œo‹1§ ¼›˜.âbO*“ Í%[ k·€Ç†.¸KåÓT¥ d…GŒ×Eª§ˆ> E†Ð°È'ö ŸO|ÌÖ°^H\S•U´ÝO½x$Ÿµ+çzO}Bn.º/T!]ÑQ|)Zâu¢’÷ÎpÂIÝ=€šËX‰”RR[TÔb|2ärÇ'‹4#¯­Ô4x}EtÁ‡m@¥õ|öøˆ2™›LÀ$ÇpmI£VÌPÁTUD…ES~ŠŠŸDÜ_"iÏ„’@ü9ñ‹Ó—c+ÝdGS«o2^ðª}‹ÑWMñW*8ÛyËM˜¾RéAÊ µÿ)¿@” ûö7ÝÞÅt¨¨„„Š„*›¢¢ø¢¢ût¡Œâp Šó÷™'Ô°ÜÊl#6¥]DÄ6ý6AåRPûª«Ómµ±©þ;A€œ‘b³IL[dRûàÓÔ“¨êÊ(ÌŸÜ.¤(žðí²Ë´ vO£]a"¦Î$èÎC•tRAv;ì:ˆ@bª>½;[ ÊŒòv½ð4óBEý)£˜x,:‰î*©O£qú—w_=á8Ȫý©¬Û#Çólîºf?Eac7çï>Ç«9ºÚ¼J=›¢tóÖ=gqšgNÙÖC—*9ß<Ó^£ì†ˆŒ‹k¶ä»uÐÌk ‡e<qŸnOZ<Šž}Ó\y~ÄÔaɲ:¼j1'ùG܈…:~ pÜÕúÑÛP²ÆíŠò’Å(Ó4SIÑŒ*r 6AFEMMG·ÃÅQ5“âWÖqì¨ù Ùðq1ã‹`.=ÜÌYòâ€(6Ú£Í8ŠHá®Ú‡<­‡dÝu¢\bØÌN`R>möHضۀùþ*´-£@» ¢í¾‘?B&žã1|Ìžþ&ÉQ;ãc±¡8j I'FÛñEêº\KŽñË …ú¸ÎXY$VÖLÇ•HQùöîFfd›í¿’"lš…+Œ 0ÌŸ²«YXüÖ£Öä4* 2ßmòzÈl_4õ{½ÑAV‘<,ï§³‰¶¯,‰LÁŽc£Šˆ„­²Ú ‡r¦ë²xª®£`2Ø5â¾>XwÜÍ/oÛÜ^­m/ŸÅz¯§“#·‰&§e?+·ñ°iŽ™ÈÃ÷ŠëجÃUR4‚cÜý[„ª»z]Ío²zbuüÉØµò"«XÅâ 58G¢»W<cÎoh·öŠkeM•ó1¼ºê.=‰ÑÃÇ©!§àVÁio3-º™¯™©/šý|b_0óJªÛƒ DèßåUf-8ô$’ ©ê5à»!"Š–‡‰PýÕÏ“Ù=ìV‚ ùq…ºùeSZi$D†ó"–}Åõ\õ½>ÎâVÞeÀy—„M—›$ 0$ÜHI7EEEÝ>‡1ì¢?5Óãš³2¶úµ.÷™uµê„Ÿbî5æWÒÃyÁsK-öC¹{[xØîäyz¿ºsÇt]ôÛ­ºÓ¢†Ó ¨@bIº’nŠŠQSUOÚ×32Mà´¥c¹FœÐmIðS5íîEDök¤Â¦»uS-±ÞB²’ÃoL³¶q ®dzÍOºšvû„>ê´b©¨µÕÙ ¹tx펄TÅ´«G$—,7³°Iøˆ‡‰‰wÛï¾ü¼9Š™xÆ;“È¤Ç „/0P°p‚o½AÎîåpÜUïBAµÊ?øNãý Ýaßü†·ý¯£Ž¹ÆË-1¹rjî)"£^¼ŠËI„žØYx•QuòßW­dÏ–;$Ì¿Œ£ÑRX¬1ã<ÑÇyWnó÷;PöQûº‡Žcì9¦¨¬0ã¦ñwÖ…œýØC3T]úHN³>ÎÒso?–¢ ‹)Ç0©È‘ðÑAÃFšU3TíDóÕ¾mÀ¹ÝLzžBH–9{]ù=“ÑÙFX”Ù´ãcŸ¤ˆéžË·¼;¦¡Gù…âúÊœRC€Õ‡%a$L[ÞH>¼ê¹müH°›în6㊠ú««.*ÈbļvS¯¹IˆfŠºe”Vœ6Ù·¡uÅu·Ûv3ˆèÞ@Ô›¾²“Í\|Æî9ÇoƒyMsIÕF¶ÄûZž›ìÓý®m°‰šé¼C ¹o ¶ŠÑ`v‘Ý…k êqzañОuŽÎ¸J½ ¾öÚÂx²€–DlV¼YfI³“纪ôé®ù©ÈfâïíÛËù8÷ÌžTvY× ÆÖYM;¤^á²U²†IتŸÇÖ&={õY}I5»{˜­M«žÒî0ð¡¶iö¢õO%éôEŸnS¢âÅ(˜Çê«nX¡jb†³æK´µpH›EAVcEt…TÕP“µ¼‰¬z×®œâ­8\²1¤KŠ¢$’:@jª‚Ž"¢wm²¦¹wX¹Ai”WJ,–¦ 8ϼ‡Øž¡=%U#lÎêñ4(F#º¯r"ëÇ¿<½Íh¬ç1MMžNƒyZF£Áªe†Xv[iéïÜÓF †ænö¦•6Tòú%WØDf| Í`Él]eæ6 q³EOT× W|»,YÜs‚xw>E5­~õÞç¦A¢”¢gáÚPïB"i.ݓɼ_2‹7‹sr÷WÊA"+Åá¼)»ü4 UûªºþΑvèI¸¯’¢ù§Ñki[O ¾ÊôÁ˹ñ˜m§¦H¨ù‚"¸¢„»)uë®QÿÂwèNëÿä5¿è}$KÐA72^ˆˆžj¾I§hqV¤ò6Xä8þÏ6Ñxo*oî_RUOf›•ÊÖ­3FŽÅãJG +ÅEw“ÑÉD:t ü:k Á°–áÕ_çY V‰ºãb0à?hò22 ¡ÙãíO¼¨‰ç¢Åñ¼~=Í£_÷Ó4¸e¹V×ÒMžvsî ) *¯kIø`}²±l^Ôqo-V»“ñýK[¤ZÛH†ÝVEè ¯{rA±÷E Q6ÕUU]\¼“+Ée v!ˆW©:ÒkŸq–A7ÙÄÍ}ÐÔ—VYžxä[ÎqÏ™ms†=øõpÅ{ؤ­%ê‘Ø^¦Iû×72胷 ñ¬xÉÌ]s;⦑;YHvF«i^Âx'ÂLï$]ѳÛmb&$eEEWd‘‹k·ÝâÕ~1E‘QJ->ÛHQß«Xâ‚ÉÀÒƒ±´í&ɦ™~–2œIQÓ&Ç>§`d˱›ò5×ö‹P9w›Æ²Ü³Bˆwî@e¬’•ÃlÚr$±}°›» Á@ÑQWmÑwþR‰"’l¨½QQt˜ìv~y†Ñéëñ·Ù¨e/UÈäJiÕ6Ú<-«Ì½,öF/QÂî&6ÖÖåÁŸW<ÈÒMµúÄÛqÛ$TTQ1EEñM4Æ0ÈÍÏóãü{Z]QË9h¨/š'÷¨¡Üó‹àˆ;/ޱ,HFË"³—! UVUÅrÂï#½–¤ü“½Í×^qIÂUTA»•CSó‡âóŒA»óGèÐÍvû…1ˆÇºø™§µ4ÌþåK܆Ÿ4n::ãfÀ­F˜D@‹ÑZ{m¼4£a„b<™µé7´v–aµbصÝõ »klŸƒ¹&ˆ“ﻥ«vÛ³µï»ºk®A¨ü²ûu‡NP»ë?E(Øq§=ãF]1ß~ÁDÙ5cX[Ù–wÉq&þ{‡3…Uˆ^â³£)0n[©E§7&œeóüQê¾é¦at³2 ™z¨á1‹À‹[mQVòìÐÓˆëñ‚ Åâôw\S.Ž{£ôc8‡!ár¹‘²["Åhç~Wz-Š+ó£Ù‚)AŒÃ{,‡‰6íU×!bÜÇ9 nmÁ¦Ck(z÷+™ie,‘'«l(m¢$Ï¢¼Û@]â@ïvÉ»ó8Wæ'0­²Œ*ä _?&2ŠGÈwQa×M–§²à¦Š!xjö¿$£\[:Áî$ãyö1êzÁÒ  ò~õ‡›0u“ý`$Ô|︲ã^P¯ÊÞJÆH¶©²ú3QYœÂìˆMHEN5ˆq¯Ìž6ÔéY•´l{æL>9¹_kc)TcƲ¨9_qUI¯Q•]×ðÅùYg•‰iä±½@+ØóŠ¡±&3ž-¼Ã‚.6iÔIuaÁ<·#â³ZHå/ ÌÔ=8ù}/ksÙòIL¦Á-¤]ĽôÜ ¢ËÈc$šë˵TDŠ;ý„ Ii QÆ”»Ueë§lfÖˆã³âÊŒb'5_R• ½±‘2‰|MÔ· ˆÙA4BغnO¿SaјÒ‡%Ø®‹¨Üˆä ó'Ø«Úm’*¯T_PXX²SåbsÚ†½÷Œ`ˆ2MÆvSb‹êz$]À»{…ï"n‰©¹ÎEž·ucÄ’ö[¤çž&ûÎÔdWÄ•vEÃåc ‚啱o² ‹Ô‘ic1¡rD‰®äD&¤*¾â'oM—\có^Û›qu¯Ár°*G' ¹Tj&#ÔÒ!+rÁÁ[Ué×TùΖeæ¢-qv Hà=?#’óhãInäI Ùøm‡¼ªª¢%}Ëüµaï–óF4µˆªUøýP›•([¨²Ò®î9÷žss-úkù…f¹x½|8‡4ƀѾÿðÔÃGãØ£-¢“Ÿ–ËpQKÒ'6M@ÉksÚ¾FµÉBÁ0|F[·¸;´ÔXÑÌÈWï¸çh7×½Qzk=å>a¶©ÆržRÈÏ&Ì¥uÕFûmCXÔ—QφŽËm©þ¹÷/††@<ÙG6ÑÑ’†*Ú¶©Ü††‹ÛÛ·]÷Ûnº{æbú1á_Còù á÷&¼j¬[dÝ«äâŠÆŠ¿àÐϧr/òÇ·”ö?“QÈKN=Ï Š~aClÚ~¨ê»w}ךUíp7ë± ¯òÝ[8Ï/c úò£1ºW_×n¢ÝÕ3„‰ê0î߈}“Ü o¢Âž»”f kÖmé7$Cv29ÐôÔ„N «ÜSKÑK˜xìÇ)»É‰˜µ­ eîH‰^Ëq Õ™:CŠƒ*[¢;µã¹.ÚUöõÖ?”WXr2åæùRc¸Uhú—¶î8¾ëké~*J›¸~=5VçÞ]ü›Ýåh®qæ9ŸF9œuÀVáËdÍÁH2ä¶f-¸Û¾öþ›Ê½ËÀyG,ðÓ¸¼?3ü¢Ó‘)¬¢ÚãRceŠ¥£ŽïssS}ÆÕÖQG̼7·Èò;iè¨"»6âÎBìÛ 2ÆEíö"'U]‘:®³®n™N-oÊ—1­qš·=Ù•ô•ñW¯û/:ÒÄ?«Þ‰¨2†Áº¹oN¯I½ïO¼ÁG%RîDí=ÑvîÙu‘UËqû'²¡°v2Ÿ7i¨o+݉ßݺíæ›m®X_ÿ§Ýÿ¡;ªFªc ëHU–uõÇ·d§k–4ÁŒ[ôÙßG³¯·T<ÃÁ–pÞ»äëj:íøÐ¹¢è®︯QºåWo¹§,ôɹNio6kËܽÆ1ã¶ëQã6¥ÕhôjwRXÏ‘€ÊÇÊpʲޘ4¤ì£‹:$r|Ì…—tQW¢ï×C"ÒÂ-drT~[Ͱ «àˆN¢®±Š|u¸ßæ÷õ˜Ö8õœ†­je«ÈË/Ì(J,Š®ê¢›—Aªš‰™óöF\Ó“Õÿ–¥u B´ÛNõ&j{”ôúþ$³stëÚ+©ð¸‡¶çH˜_if÷8‹`8ýlR‹$³$ô$ºË;1ÔRÛe ñ×úËùSåðãܦÈI¼—&YÍzEòòkŸ' —¸†l¨Ž“¿`ð ÄiÅhŒ{…UuiSâ¸þ-2Knȸº‡,'M E7M×›.ÔOx·]¼×Mcìfñ¤G%×ÝäÑ_„R+&z(ì[kç¶Y2ír7¦ã.4ó.ª¢îŠš¦ùWãb~£ñ(1OrØ…ÚU´ŽnMÓ0è¢ ÎµØ»‘?vÊ™öõDÕN7W1OCC šúj¨ €Ìh±i¦Å<Qú:Ë×dcÙf8ñOãþD«í Z+ ¶G£šýöÏd™?qÑè]{H[âq­cäËÉ¢ _¯UN—@}ez!¯x/QEO¦Îúê`WÓÒÅzu¤çaf;¦á¯Ø)áçá¨ø¥¤wë3™è‘rÞ_ÔdbüG\òþEŽw'Vdݽø"**‚¹Ü=LñÞO°…o f±M$Ga;GЄê÷¶ƒ²(»·EMCÃiùK5¨â&­«n&póÓ³¨Wª¥·6+pŸžÛÒà´4@Ëݪ‰¶É®3®äI9%w9É•ÌWX“&ʳ ΞA²Û2Mc7;´ÝQdöíQÑNùoù¹ão˜:ÄÜÇÌcŒK†CÅét†Ž!mæô!_n£]sw ơœ°‡W3q|‚5ÌØ>cˆn·`6o8#Ü€]»¦ú©…xìé6÷Î<Ý=O_.ÖÊZÇ'ɘpšuÒÑQH»{StÝuȘëUÙ|+«¬jÒd ø•ôRrDˆ®6Øw9w"DÜ•<×XÕc‘oŽÂ%\(ÏDf‚Ý×=V˜1ÈŠ„¨H©ÑvÕÇb¸Vwqo.EuÎN¼´¡›SSSmX߯Ñä°]ž,'ÇGšÃB@Ònûj¢_´—œUÊõMã<у´Ùäu­oðWM}6/j$OV,•N©÷š=Û4EMr%wúЛÆpLB¶iv1l¥X:çÃ=-T#£n5±6}TS§œ‰\¥s‹e9[Œ›2ì9ͼžöB(±Zç«Ú«º¢$x¢ºvª/]Ûb•ç="Uô¶¨Ð °û²# “¼‡i”LGbصÄÜCÈáqÊøÛEÉ—Œ-ò¼f']z–ݦ”JT¸„¤-¥ƒD„ŠàûÔ“°*åàÓb'äATÛacªv«bȈmÔLQQwMõ#åÌàñÿØ…†OǼ†m9/ >ð”¼~ÿ'mØO8çk®wl˜(ºŠ•ÔÌKb’F]j,Œë&ÖúÞJûÎÈç{òŸ5]È—tý‘ÓØFLÎmùÄYÃy&ÊÚrvŒ ·â£ÈVÁôVûšGDTw1«¹ºi«ÛªfYkzlf†mMŒZÆvèm¯»e„cÖ…FÒ¤™ÏÖÊ6¥°¯ºÄ“f8¹è·ß²ûÛc×øí’Gs$¯üÎÓm‹PÞM«ŽDïWwO¼ˆ£õégåœuMap‹¸_´ÇÀÙ' èjÌ„Tö÷êÖê³–¹;Xäêû #ír9 5†DÃâµÿ.³ø‚s½ý½Ñ>‰¹þ®¸6À“‹Ÿå°n0 ¿ÄMI‘W Ë8ìYºÿdgpÉ£‚b†ê¨Š»o£4Ê8Vì%øŠ‚/joýêÅÔÔ¯š&ki òá2&kA—Ü« mGéQ«hgExc¸ÛÌÉ‹"2â¾öÄ%ÑwÓ™¦c]r ´p ³:øVãH±}ßuoðÙî芀ˆ¤"=äj›é‰/D“ymc6-]1Z­éÓ¦©¤v[GL‘³%7EIUzh0rÇU¾-É*.U’5éül'䯒®ÅhÆBô=›yZÙµ÷QÔB Kƒ8;LÓ¬Y’8&+!ÅqªZÙzOµ™Ú§½‚Têj¦êˆ€÷—]Y=*̳.QÍ] ü›É2›@“i0G`iëèDŽŠ Ã½ =z’’¯ô7X} y‡À›y— 6!!]ÑQS¢¢éüÃå—"ƒÆrìæ$Œ›ŠíšvFcÞIë=; ŽÖ¾¨ª½Ñ¿ •´ÝKMq›†rê®$É <ù†ËÙN6KÉ3‡º®¨;»·‰G @ý5-…ÎÄ$BEÔÜ{,°ÆÛ¯¾™lçä,ÊXSr úé«^J·•ßuLMxTt[#ôÅ[*l©©g‘ãuö²æVʧvÑÖㆠ֙ 5-lL ‘{ û&_Ð ©6›–Ȥ‹¬qÌeBÿ‘q»øY–3QÀzCqÔ9ÖSž@UPŽÁÐ2-‘{¶ê½4ż=þÚ¸'DßÇÒ’Â:ÿjI§~¾(”¿Ï)ÅÖM—ÑÕ¥ÕÆ7,úúÂC qÆ™¦-ûä›™ õQDë œîsEÍòæ5hãWÔm7 ,yñ뛟¤Ù„RûŽbzˆÒ©!ôATUßO¥%En˜Ö½kŠ­f%¾79`Ûæ>Ø<û( ûƒcÚŠ¤½»¬š®JÈäE¢nÖ¾U”³l°A‘-» -@2ó0ެ«MI"?\K¦ê¹'2ÇóÚüʺ$L¢0‘£½%ºô®›0¸Éœ&ò’®în^*º¢âJ®#ĹV—Œ5x–{üL˜ó®×0‘3¯(_m´pÚ5CÛ»ÅWXÏ"ó­Í?Ài)Î=ãLH$-Ul¹­+XL™/g¦IôU[ìÛE%Ü•uÑv_%Ó?sÜÇ%ÕmÑšÌɶû¤°ž@6m¨>×@‘(*¤‚*‹Ý×U|òýòùšf«!³‹#½ ÅÚVáüƹce»+øuQUQwÇtNî¨y‚™Ý•þ4â r­ƒN]ü¤)ï §BF…ü—GKŸ%Vþ³äÃkºdÂñï™5Õ9ÖuÂ]N©´ˆÕ…eœwbXÀ|PÚ}‡Á[u§z˜’¢¢ø¦ ßÝ̶åyø»îDËIUØÅz:E5tÝŸQTˆu ÕíEéþåTTÝÅ4Vy‡cïÞ©V°U¨~Gù…iFª›ôÜôKÅŸ2\ƒû³Qq.&[ZÚoÐE›v}ËoˆÒ¥)q_!°Ú/i^ÑZc²M<޶TÆÑõ{j×0– (ÈíÁæì.)ùJ¡ —çÒà î¨ÕR¯–“º¿…±P_~Ï µp~´áÅÿ„šEÊ~eñ¼Q²Oňa@ó»ù I¶#oµZ] òg/rŸ)ïþqY;!*zÓö§ÂQµ§Ô¦º yÄ8¾7` ¿çm@mû_Ê|„vI.þ×?òŸÿÙ endstream endobj 13 0 obj 111919 endobj 15 0 obj << /Length 16 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream x…ROHQþÍ6„ˆA…xˆw •)¬¬ ÚvuY•m[•Ò¢gߺ£³3Ó›Ù5Å“]¢É`¨‰µé²™…}v*Ëìðèñ²bç{aÿ[QÓÀ'a?d‡yÖ­ö®Sà{„=5àήÅñÚŠ^-C÷T#hŒsMÄÓ×9s¤ˆï1Ô˜÷F9¦ 1w–ª7€;aYªf ±]û®ê%î{wÓã;Ñ›9 \ Ir±ÙÐ< X}‹°I<>ÎUàw¨˜À¹‰ÜÍ(÷Õg£RVzWÆOã¹ñÅøelÏ€~¬v×{|ÿéãu×¶><ùzÜ9®½UaVqe ÝÿÇ2„Ù'9¦ÁÓ¡YXkØväšÌL° (Ä>—ú’UÜÕîí¸EÌP>,l%ºKTn)Ôê=ƒJ¬+Øvp’Ä,Z¸Skº9xwØ"zmùMW²ë†þúözûÚòmʨ)(ͳDf”±[£äÝxÛýf‘Ÿ8:¾ç½ŠZÉþIE?…9Z*òUôVPÖÄog~¶~\?¥çõAý< =­ŸÑ¯è£¾ tIÏÂsQ£Ið°i!â Šƒ3ÔNTcâ)ñò´[d‘ý@ýf endstream endobj 16 0 obj 704 endobj 8 0 obj [ /ICCBased 15 0 R ] endobj 17 0 obj << /Length 18 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.> stream x–wT×ÇßÌl/´]–"eé½·¤.½H•& ËîKYÖe°7D"ŠˆV$(bÀh(+¢Xì "J F•ÌÆõ÷;'ùýNÞw>ó}÷žwçÞûÎ(!a¬@¶P"Žô÷fÆÅ'0ñ½D€6p¸¹¢Ð(¿h€®@_63u’ñ_ àõ-€Z®[„3™éÿïC‘+K€ÂÑ;?—‹r!ÊYù‘LŸD™ž’)c#c1š ʪ2NûÄæú|bOó²…<ÔG–³ˆ—Í“qÊó¤|”‘”‹òü|”o ¬Ÿ%Í üez6Ÿ“ †"Ó%|n:ÊÖ(SÄÑ‘l”ç@ ¤}Å)_±„_€æ ;G´D,HK—0¹&Lgg3€ŸŸÅ—H,Â9ÜLŽ˜Çdçd‹8Â%|úfYP’Õ–‰ÙÑÆÙÑÑÂÖ-ÿçõ›Ÿ½þd½ýäñ2âÏžAŒž/Ú—Ø/ZN-¬)´6[¾h);h[€êÝ/šþ>ä híûê{²yI—HD.VVùùù–>×RVÐÏë:|öü{øêù ¢‚¡[£°R¡Fá„ ”"MÑF1L1[±Tñ°âeÅ'Jx%C%_%žR¡Ò¥óJ#4„¦GcÓ¸´u´:ÚÚ(G7¢Ò3è%ôïè½ôIe%e{ååååSÊC „aÈdd1ÊÇ·ïT4U¼Tø*›TšTT¦Uç¨zªòU‹U›Uoª¾ScªùªeªmUkS{ ŽQ7UPÏWߣ~A}b}Žëîœâ9ÇæÜÕ€5L5"5–iÐèјÒÔÒô×iîÔ<¯9¡ÅÐòÔÊЪÐ:­5®MÓv×hWhŸÑ~ÊTfz1³˜UÌ.椎†N€ŽTg¿N¯ÎŒ®‘î|ݵºÍºôHz,½T½ ½N½I}mýPýåúúw ˆ,ƒtƒÝÓ†F†±† Û Ÿ©-5j4ºoL5ö0^l\k|ÃgÂ2É4ÙmrÍ6u0M7­1í3ƒÍÍf»ÍúͱæÎæBóZóA Š…—EžE£Å°%Ã2Är­e›ås+}««­VÝV­¬³¬ë¬ïÙ(ÙÙ¬µé°ùÝÖÔ–k[c{ÃŽjçg·Ê®Ýî…½™=ß~ýmšC¨Ã‡N‡ŽNŽbÇ&Çq'}§d§]Nƒ,:+œUʺäŒuöv^å|Òù­‹£‹Äå˜Ëo®®™®‡]ŸÌ5šËŸ[7wÄM×ã¶ßmÈéžì¾Ï}ÈCǃãQëñÈSÏ“çYï9æeâ•áuÄë¹·µ·Ø»Å{šíÂ^Á>ëƒøøûûôú*ùÎ÷­ö}è§ë—æ×è7éïà¿Ìÿl6 8`kÀ` f 7°!p2È)hEPW0%8*¸:øQˆiˆ8¤# ÝzžÁ<á¼¶0¶-ìA¸Qøâð#pá5#m"—GvGÑ¢’¢G½ŽöŽ.‹¾7ßx¾t~gŒ|LbLCÌt¬OlyìPœUÜŠ¸«ñêñ‚øö|BLB}ÂÔßÛŒ&:$%ÞZh´°`áåEꋲJ’Oâ$OÆ&Ç&N~Ï ãÔr¦RSv¥LrÙÜÜgIsKÛ–6žî‘^™>!` ª/22öfLg†e̜͊ÍjÎ&d'gŸ* 3…]9Z99ý"3Q‘hh±Ëâí‹'ÅÁâú\(wan»„ŽþLõH¥ë¥Ãyîy5yoòcò( z–˜.Ù´dl©ßÒo—a–q—u.×Y¾fùð ¯ûWB+SVv®Ò[U¸jtµÿêCkHk2×ü´ÖzmùÚWëb×uj®.Y￾±H®H\4¸ÁuÃÞ˜‚½›ì6íÜô±˜W|¥Äº¤²ä})·ôÊ76ßT}3»9uso™cÙž-¸-Â-·¶zl=T®X¾´|d[è¶Ö fEqÅ«íIÛ/WÚWîÝAÚ!Ý1TRÕ¾Sç–ï«Ó«oÖx×4ïÒØµi×ônÞî=ž{šöjî-ÙûnŸ`ßíýþû[k k+àäx\S×ý-ëÛ†zõú’ú…‡Eêjpjh8¬q¸¬n”6ŽI§¾ökÎ×:úçöŸð8wÝçúÅ7®Þœw³ÿÖü[·‡nón?¹“uçÅݼ»3÷VßÇÞ/~ ð ò¡ÆÃÚŸM~nr:5ì3Üó(êѽîȳ_ry?Zø˜ú¸rL{¬á‰í““ã~ãמ.x:úLôlf¢èWÅ_w=7~þÃož¿õLÆM޾¿˜ý½ô¥Ú˃¯ì_uN…O=|ýzfºøÚ›CoYo»ßž›É_õÁäCÇÇà÷g³ggÿ˜óü endstream endobj 20 0 obj 2615 endobj 14 0 obj [ /ICCBased 19 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 1333 858] /Count 1 /Kids [ 2 0 R ] >> endobj 21 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 22 0 obj << /Length 23 0 R /Length1 19420 /Filter /FlateDecode >> stream x¼ |”ÕÕ?~ï}¶Ù÷}’ÌL&™,CÈ6!"yIX"V3h$¬nUÀ *¸!n%Ú V[&ˆ jÚÖÚÖWZ«Uk_ó¶X«•Ÿ¼}©%3ÿï}& ¶ýýþŸßoÂ}ÎÝÎ]Î=÷ÜsÎ}%„˜ÈV"uÅËzéaÖ‰œ_ñ°âªáÏŸ¾qº‡eÒêÞK®ˆÜèßEˆî·„Hs.¹üÚÕÊwß=Mˆ¥ˆøùkV-[ùåmK&ÒÐ ü káxÕô3¤ŸDºhͯٵV"ÍÛßsùºËí~úqB&­DzÎË®é•Ù¿DúÒáµË®XõÀ5÷=ˆ4ú#Žë®Ü(æI×#}éµ½Võ6GV „L¾œÛ:äQüñŸ‰Èd0L.Ëá¹üÇrOàýoâ¿”HhDÐòuÚS?VÇhD„˜ÇrþXˆ•؈8ˆ“¸ˆ›x´ ^â#~ A’GòI a´RH¢¤ˆKGHžö“<1†${ìlÈôdñ2Ù§˜t~.Œu›&?$¿£¥4LèWÄKNS?­&3‰H¾ÄœQr?F±ì¦ôä!‹ÈL*¢NœÜAÎ^•ý„œGî!gŸ£7eŸBùNò3r#øO‘’z2õ‘Uäá#’Ì>Dtdf?™Ì§²Œ¼ƒ¿/0Ž{É}äÇôúìiôê"7¡½FÒLš³/gÏrr‡¸KzWÿ,¹›ÉPë¦I/¡§™d1YK®&}ä)ò ê Ò»Ò‰ìw²c½œ¤cê!ŸÐ::›=!š²S²ïƒ#†ÈÏ1_þ7,^(î—.Ì4e;‚•yŽè ôe©FºkôÆìcÙg°®1R ŠÌA?ËÉÍäeò:ùoò7¶%»…Ì ÐóOi> Ó(þó³Íl³ðÙva´›È^’"ir„¹Žlm¿GÈ!òämò7ò?äµÑ‰t }Œ¦èýŒéY!›ËzÙnöû‘0G¸[xY¬§Š—‰oˆïK·I;”eJæÌ¾Ì½™e~}.ûkðŽíÇH(z#¸â òy ­¿Gþ@þÈùíO¦KèÅèåJz;½þˆþ”þš~ŠYbÛá¯Mf-èuÛ:ÝÄîe÷¡÷7ñw”½ÏþÀþʾ$¡P˜ ¬R pTø³hcâx±Zœ+.³X™iº´@zRzZzE:!7Ê+å^ù/ÊMÊ-º_–þg†dÖdR™ð®œt(ñ]ò8øþÖà è`Ä#ä$V!@#´ãn m´Î¦Ћè*zÝFï¡{èÃôqú f€90c³f¶€-c«Ø-l»“Âßö:{‡½ËŽcä^!*Ä…ja¦°D¸PX‹9l6 ·€²w O o o  ŽcÕ¼b¸I¼N|PÜ/-/]¿Ç¥—¤aé×ÒéŒÌ䀜'WÊ—ÊOÊTde‚Ò¡lW~«ü®—æÑrŒ< Þ?÷c~ìÁös‰[èqdçS2çnÇ:,À®øÒ$d°.^ޱ¹™_trtYSŠéó¤Žþ”l‘™ *Ž4ý€ˆ¯²óÈÛ´›úÅýÂZé,Bž†4ÚÅ^`ÏÓ©äkd‹Ù#¡Ñ'ÉGà÷kÈ}ô2z%yš§“è ´žn!¿ea½…4fg"ÕÓ™ôÁÈâJrñ¹)üÛm O2ßÍâõOƒd7Vô‡äCúò•²ŸAº FË eî¿ßJ¸ÔëÂ>Û‚ý臹\~“¢ÜJ½œþo§÷ÿ›™Y‰SìSê£Å´ûá¸t•´KzJ:$ýXzC®µo!ƒ£ÿn6`+ȯɧäKªÃÚøÉ8’Àx'bìär–^$Óh€ôbÏ–BŽO›É•hå&Pïìç±7N@N\D~LÞ¥Œz1£è_‡vÚAç¥äJ²+x3@ÎJHíròWÌÛB'²èOEK»!µ†1¦ÈŸAí¬6®q -t1Úú’\@V¢‡ ¤ƒ$mÙÃTsH‹ð+лˆÚÈTZH¿¼nìP NÅéO”‘q™9Ù‰¬GxgLùý8½‚ä<º£°b£ÄMç’ºÌ|Œá-BÔæ…jÓ”ó'Oj˜X_—¨­©®ª_1.^^VZ+.ŠF¡‚ü¼`ÀïózÜ.§Ãn³ZÌ&£A¯SdI%ãZ£mÝáT¬;%Æ¢3fTðtt2–}#£;FVÛ·ë¤ÂoоUSEÍÕÿTSÍÕTÏÕ¤¶p#i¬n†So´DÃtɼNÄïl‰&éãZ|¶ߥÅ͈G"@·úÖ´„S´;Üšj»jM_kwKÅ8zÐh˜¶ÊP1Ž45"–òF{RïªE˜·uÒAFtfL1ˆ¶´¦üQ ¢¡¸uÙÊTǼÎÖ–`$’¬—¢ÓVD—§HtjÊתiZ7)yZJѺ ÷¤0²#|pÜp߃6²¼;nZ]¹ì¢Î”° m´¦ìqôÛ’ò^wÌ÷u;¦unûfiPèkõõ„yå¾¾máÔð¼Îoà#¼…dm—·u÷µ¡ë;°Rí ÂèÝšìLÑ[Ñe˜Ï„Ï*7¿UÑVžÓ}i8¥N®é»´KèK‘ù×FÒ€:”!ÖpßÂÎh$ÕŒ&—µät‘¾ù×øÕ°ÿÛ%ãÚì9´XÇ"&ó7#«@ô\™ÓªóXûüs”¥|DÑ™)µ"Œ‘tF1§‰ü±j"é[1 €_’+µ+Ò“ÒOëî³Mâù˜"MIŶh¸ï ˆÿìÛ9ËÆräbÛ„r>9Çj)ºìl<§ÊË9‹(Ó°¦ã-]W1îªA6!Úk €|¤´]–œT òG"|w ªd9©­ó:sé0YLµ2žL±n^‚Ì•¸ñ’­gKΡwGÁɇ4uÝÒÅÎý³Ú<ÎÖ5“RÔó(^•+o_mŸ·¤3ÜÚ×=Æµí ¿•Ê•s‚‚n(‹¥œÓ:… C±  •‚)/Zr® ¦”XŒ24v‡¦Ô2h¸-eëž‘{& ‘ÈØ–ùWœAE÷ ¤Áì Ž¥¯ÑÆf‘šgnÔ©ÉßJkt¦>¡}!$k_¸¤¯Ïð­²6Ȳ¾¾¶h¸­¯»oÙ`vëòhØíbûÙþ¾ÞVH¡Ü‚fì¦ÚîHb*kè$°-#S+pHA ÂÞÃN[…L=ÄhFVY“ê$’˜ˆA3”øu²”a 4FôP2}Ä·jmœc;Ù8{´‘4!n;ƒGuUıãAqpŸ ÃgT‰üƒ„Åa‚å¿H8Hï‚}#‘)ªç6éK‰ÉÒjœ|‘J¥“ŒƒT§¹NÌèɳ§ùâè£kö(iš}¼Ú ÕUtÃz§Pq w×ÑšñhÒ~útæsÞþ¦Ì}‚r©éY½Î(”AZ åGèD£Á°Æ”"«fŒUat~Ó%W5lô8ïàä(µ7;ïÃq»dY)™0¡>zõ—oZR¿h»ú_¿îÎÞðƼ勸½ù::ý#´&N»ñjP˜Hey¢hГc4,UIL: {ãiN¯.N¤ÆS¤éxÓqt:Q„ש?ó1 3‡gþ‡?±"˜Ë²ìÇÒÅÒ[ÐúßQçܦßîÚîÙKöȯé+üÖø… /Ö—šJÍe®2Ï&i“þ6I§8¯×éõ–±r¡XRJ¥¥ô¯ ?5JMt.È9ßFè`F³Ãv_Bƒ3 ]¢z}¢Î¢Z KûR+k¥VÕíKXi©Zè¨0ÖÏ-‹ÉçDk*P•GóÜ%ý µ*!¥JÀ2w 7/ÈÑsýìãsl]§º@QÐuôd¼ký±8‡<ÒU]EºhWW•d1&v‰„½¯‹E e»ÍS[3Al¢¡©™7>Ë|¹^GÔüäÊšÌïO\õ½_þ¼ÿª§XðŸаHÖÒû÷^œjÛp˧™¯2Ÿ~¶›ÓŽÁB%Ò2ð™ ‹½E­-•J Ó½«ÄU&©ÜÛàáIzÖx¤ï„à¶àƒÒn£²SœŽb«Mç/9 P…“HoLðy©Î­ŽTEXÄî“°­ÊÆlƒlÇ@¸zl¾|̶u­?Ç̵ÍÀ7ŸçzÚåŒÔx=‡Û]ѵ×ÖÔOau‰X¬$½å?×}ã`wEýêÙ7/ÿþè[´ô××ÏXÚØxù‚)ÏJGòb¯d>þgoî_Ñ^_9Sgq,þéSO^í°äøäèô·`®z²AmÒI¢,+a]•î%݇:±R·KÇt:"ˆÅŒ2=Ñ)Mò\˜ óì|«ŒÌ(êÃ4Lª8c`V†oÎJ[ÆÆÙ'»øç“r4Tv­$[#fXk¸±ÙŽNf+G‘ŽœÎË÷,’%l6¹Ìf“Õä6{=ÅN›‹v»ú]Ìå"á'ç&:Ë }A-!f›™™,é—Sò°|Tåm½QŽVEY4âþ&Õ «W|½‚|Wv?ÙÅ·%¤ï7YX;M¶wYn°ýDü~Ȧõ]] hFOÅãñ:#ÂxÚ±oÏR5º›­ûëÛ[_y¹û†K2ß}gËW7þþíKçÎ(:ô±tdî/nzâwyo{:óGÚôt22úˆ0§¨sê¬ M8i)™•ý³ø7Èöqô¨zÞ}0ÿpéÏÆ‰ànp·/¾JZUºQ¾Æ¼±ô=Ó;QSҰȲ¨0]cZí¸$ÒSzɸ«óoËß19¢ƒÙ‘‚P‚Cu•?˜W8/úráËQq}áúè…7Fÿ«ð¿¢rÜPn.*,Š6˜ÑvC»¹¥pZôRóªèµæë ·›û ÷ö›Ÿ,tê z³\(Gý¿ÙS¨F f‘zûT8±ÎG×ùöú˜ï[E‚ÙaÕhi°Â%{Z'ª¨ gV7ÝEû¡' Ã\ý_¢h°ÁÿUQ®÷}žõR¯êô&¼íJI,0>TÒoKAš¶ÓÏí9 ä¯øÍ˜Pm_Ðy¨“8DºpœœŒoàÇÉúøÉ®ø±Ü?æð6ti{:Ü)=‚ùS@£cðOigC!È€Ü×Óž:ªZ æ°£Á +Ïû‹j1!ÏÜ`ðñàl€ùú—<(³i ;U÷$Ã$s]aè8Ó<­°-ºÏðƒBéJž÷Å~‚i›¯°.1aBmXÌoŠìvy=¢ÆYüì›EýÛvÞ}Þù‰¡ÿÕ½mËç?€ëÊ«dÞuÞpÃ3+ÇM¤©77Ý‘%/e>ͼCÿw÷í×ÎKÌ :ÆO^|í3½¯®þÛ/ÌëWÔ6$Š+W_ñâŽÍ\F!-)¹ºCö°Ÿô©¢WlØ®úéºézåýbÛnÛö=î‡=ûmÏy~çþH>%Í&Ž@¥Ø©7Ãæ7-Ô‚Ã@-TƒÁî ÐÜdá`U°?8ƒr8ì¯òû??3Õ›¾Þrü$ÜmGS kÛNËΈ“çÄ™P9j³°h!?ëFçÎë7o ÐÒªß}æ7ïmvåKGÎüùʼnK®¸d÷3BüL&súýÝÉe/Ú|ŠËܙٿÀo8þÔº^]£tyR¾'0+8#ofñïmÚõümþ b«ý—Än‹Ýã¿7°/0|-ðó I–Ínì÷”Èeî¤ÿjvÛ'?+ÿL6½”xÏÆò‹jªíãÌEj||¢H-,ÅߟXWt¦ˆµås.¯²XçåS’oËOåÿ=_ÌÏGk‰Š\®Y2²(¢æÙ›"jІ‡/ˆ ²ÏŠŠÉlÇ>”iÅDq¨¡ª.cAuLW¦/5'C¦½&2Ѭ‰šT‹'a ÌMÐD7Öõ®*JimYd©—~è¥s½K½ë¼‚×_ÛÓ|ö$Ä.Y¼‹Ûе6 uŒ«çÇÁÇ8¿GøÞÑñxޡӕùt}òx.1DвÃÏó ‹V±®x² Pº N{~¸®ïâ: ´âZ.—ÇÁ –È2–’szýxe¸E˜3;VYêèªlü7o¾0Ø.‹3ŸmŠ0ãû]ßqñÃ÷üôüŽuí éÅ>-ªïl9¿µÖfdÿÐ}ÉíÏeï¸õü¼z¿®­-}û’;ÛóŠÃyóZ'g~ã¨ñ•4N^\«/ZE8?l?ܧÁyäÑ!âÈžV« õÁéAæX,/6,ö,ö%ó¾Tä:q²y²³.Ø*¶›Û­Áû”õ“  `Ò’ââ«á4­Äàè½´ÀVÆ„á2ÕD{ÉVôçÏoÊQ|}ãì㣞ƒ³YÓü¸nÏU²*î´NÕ¸Z^mXíYíëÉ“º’¤KÓK@<ø¥HVâvbKäĈ¶úoJ¿’ÉŒ]xPu$f^Ûuó-—¬ºM:2zâ¾ÌÇ™¿gNdÞ¿0ù+bnïÞ§?µ†’E˜{ö‚Ÿü—:¯Óšt@¹µö8z<7ø®õ?À0ýÌö3ßïlïø>‘?Ñ}âüÄ}ZvNtNtÏrÌò´ù’¦“2ÉQï©÷ WKW[·I·Y·ûŸtì÷ 9{ôγ¾`‚Ãg®„¥ÖÌsü Zí óø£  ™Ãn$*ªõHí.pêH#Ea¯By.J3˜#s!`A%âò:s¤ä67â'ǹÑÐu <ËmÀœlMsF‚ÆWê%ÎvÜ~3ŠÕ™¿ZVÌí¹aËe«ÝÔ?ùÆ'™¿RÏñW>bŸÕ,Xx÷S/>ráºÊ¿ï±HZ¼ŸóÍBÐŽÛ VÜíR+I9iH:rܲ¬qZ¯ï-ØZÀ& Ó$wÂ?Kh1Ír·øÔë9Ÿ¤%#çÕbT,V,…Á[f1Ç(ç«•vrÞ‰èüùÚöä3\*Ç1š:³5¼bî‘{ =Ž·È]ðþÕMÐQ[ã…EýMV—eþÑ|pÉs™d^IßDý£ŽÊ–ë–Ý~Ë%+·=raW:¸ný÷1Û™Þ§Î_ûÄ÷Ÿ{l/æÛŒù–€W\$~oˆØ°OÚŒ ê2ï¶=)í7<¯Þ<Ðé\t›.·æ,¼fø¹éû¦ÓÊ—fsž5Ï­BF¸U‹=au¿ä~Ó-¸9WX š4hñ²;U¨{ŽK·…Y|®!ö´Ö¡™ùáœùYX–ƒñŠôåiPµB öƒ¤0áYêp€Ì¢Ñáãä.2*$B+Ý9&ª,XZ°®`oX`èT³5‚ÉÃø·ìÐãPT—O-u5ùÔ+Â>.­ù)ŸlÕ&‚>!TÒ êq˜>[õd×zŽ×  |Ri/©½aŠ–lŽ4Å oú—¡]Z÷T²ðN-¼{ÜÞ&^'ž¬l„x†éÒûP;/!-`"ËÑ0ŽHÎãDˆh§§“ÊŠìe_Qß„Odþzku½uœ:äQU¸iÙÔ%%Â5‹/jl¤t~åC={÷À ñÌk™oØ1ƒ^~Ý–iÓ®ärÇ ðgè 2¨Ââ¦åbض'Å­>I'¾äcn¹»Å‰n‹“séuV#]jÌÂhä a©Ýê¡Yõðd íž@Ó²ÓeÐ×6éæê:t‚®ÔVi_jgöA*ªf‹3Æ\KI¿gØÃ<œ'ô¦„Çï½fˆõÀ©_O"•{’Ît5žìò#>œ[ÜâDh£¡ÆŠßØIä¬Õ´«¯Â·»Ö…bõ=Òðà¦k®ŒM›r^Ýo~“ùø1ÖqÛ- Š~bk˜×þ‡3Ï 3µ½Ÿ™'vk:D%£.¿:[>s˜Ì½Õ·™·V‹a »B¨¢µ¬VPé46M¸Ðšt%‹—-ÆR]f=m?ítL6×z&—ÖŽƒBíi/mwÂ4ê5Ü…SÛh2ËMæ‹Çë®0› òùŠøxVÛÚ°Ø5&0šr°´<·`kåÕ‰ÜFлƒÚÑ¿T‰Ó!k C'¸Ñ­øüry™1ðq¡£÷ûÕ´"hP5Ú¢ˆÃ_uNúœ“?¶ã¶Ñc\ñÃjô$7—ñ;«€Ÿ°±5ÆâhìKíв ÷¾ñ{ïì·^“[ÖWOñ%e«ã=•[¤Ë+yø©¦üuÑc ì­ƒ­/ UÁÉU®%cᮥͺüÒÅkë‹æÍÃïܰœÒ—~º•*SzŸß™ùÛÏÜÜ}É]·¯Yus[ÉDwAÄS½øá>»ómj¤Ýfú G.mºËÂnþÁ£}÷‰þGÁ€÷À&OB®{HZ[i×ÀXHÛT:ÕþŸôïT¯H©ˆuÚר%J™Óew8£VNÔ|AÑ .·¯r 1^ %èiVOõ 3T@OaQb—¯ßÇz}'|ìsü¡®˜‡‹>ÕŠºýnzÂMÝ~oSNìÑó%p+åÔXJ“ÿÜ =šz5K§y/pØ¡ 07X."ÐGæQúôí/.{dn~æãð¼óÚÖÖf`eŽ~´wFïí;GïfÕû—Ôµl¿mô3Ló^lÄ"Êý’W=FÖd74©ú=ÛªOé‡õGõŸë¥¾[¿Eß I8|œbªæ_Ht"Y’ÑÀœ™|vúHQBôëÆæ¥Í*wŽiÛSs i^!¨‰âN>h„{sNñ03gþ1KŒýã}èl°QÎqæRËøá b[¥nËJŸçB[¤~dHÜÑLˆQΚÚXˆ_ü—±h¢aƒ¦g¡ç1ÿÏf܆ïÁ^/¡“‡H°»Ðd«É-{L !¡KøÑÖªkõµDMa¡²l¾»lkÙÞ²ïËû•}¦gågM©²£e#eRVYÖ‚—Ê>,“ËÔ@^¢ é­Z¡¤DD%Ï…aÚ pÍ_-›Ý^ÌË‹•@P«-æ°«KêºítÈ3ÈÚTk ËÏCÞº<Ú ¿*òÃ0âzDšÌvÀªoâP€q— j‰ÚŒÐˆPT’(Q'—¨,y³äÃÁZ*ÙZ"’pIUI¶D,ñ—þ)džš¬ítø*!Oრ=µ¾‹ƒ³ iÓ˜²é8¶¼¶ãAÏ q®öÓ8|âàLWÓþq½Ê´äƒ~Í«›©°cxõÇ/Úôx)86¿dÞä5ã34Mh^S‘ùXŒÝýƒ…‹-\zQËžÑ$[úÝñ3vìÎ0Ööð’qm·<8zü¢˜ÄšyÈ^Õ§8½Î%º5:qP¤X-[‹®Åú‰M’µ kW,fÙd4Bc4æ!Ú†%4‹FþwÖ`Œ™àX*KÃÿÄéªí[=Ùýí}«Q æÔ··®æIâ^|Mw‹|k£jDÂö“™‹æ5Ì܇_ÚñV×CsC¬à‡«&vÜ’Î„ÄØ#‡¦­¹å;Ø Ø¯ó¡—=„¹š¡Å? Îø ýX÷¥óK·øû \ˆ~ɯgIÛbçbOÒ÷Û#ïÑ=`Ô¿Í~/} Ûô±ô±ü³m¿î—ìWò«ºŸ™¤Mºíò-:Ü>4z9‘\¢âjPÝÁÞ Z"ä[jwÎxÑ®%4Ã…Ku}m5tÑŸH» ÒáÇN8°úÄí‚áR+þ†üžß7úÈÓDæõÏîÉ|ÙGû׮½ÿþµkw³Â;¨Ü—yíóÿμzKöÉï>ùdÿ#OâuAFvd.À|mлRÇOtÎp2GBh078Áa¦y¦³%ø÷ žÛngõñSÊ߃:ì oÚi£÷ûgí4{™ÅbÙlšnügKmöñF0½íØ¿Øj”37?Ǹ­ö ý›Àuïæ¼ÎM n¬qÜsîÔÚAåÚg.¢,sf¨sç\,²ç®ÕËoºmÅ%·cq;Vfþ33š9•y¯mÑè'ÂÐÀÓìœëàbîË1w;ÞxT­w4²„9ájÌ›ÅZÌ-®YyºÞÍ×¹½‰¤”4\`^ìLz“Åùû ûòNëO™¿t™ìÄäK+¡fscU±Úd G,®˜Ý®«ú6j „rÇÿ)ÜLœÿÉo™ª´+¾~Œ=Raµ³ÇÛã_ƒœÚ¹ýQËYXüô¦Úy3¿„™õß_úì¦>* _úp#2'n]¹zû-Ë–Ý“¹œy¦/¸}/µáÍÐ’ ýªM8ô½½§<ü çwŠ7lˆP¯­ÿ“jéÕ[è\n’„JG§e¥×K4«)db;MYk2Í51Ó »Z-SìrɆR¢·é«ô½zQØâØë`K[G¢ÃFb÷ˆeª‘±­pD2ê·7 Ѽœ‚ ýòܦ>ÕåŸS1qc7à}ÎëI{Ê» =U‡ çƒ†š‰ØØä9nÈ)›²öó}=í²–îäÓÏ›<¿RŒ=pYKÝ㛟Êü7æX…=mÃËÙ+ê°l—£º¯ÝÝãØãz äþr½âjs1Çóæ!Ëk‘¢§Í§ å2ó"ó*óýÆû ‡LJsT-j‰]R¸2¶Í±Íu[áÍEúúX«Üfœežkm‹L…‡¶¨$Voª‹pd]‘"$»>â3—˜ £JQ¡:îJÓ5®kÝW•m*¿Ý}KùCîûËŠš·ÒÞ;|–ÿ <5NöFÛꩨ`9šâ;¼¯#&V¢Vƒ²"3ƒ"éƒÄà D;.Ç]úƒÝdrÄ…¸56 ò a†¼GØ#k¾aõšqÓAB£(J¢ÞhMA=’Kï7¸M¦()K¤ }©¡ÄTMê¥)ú62M—f(3õW“kÄ«%\®6m#·‹Û$\¶™Þ#ï‰oKoëß3¼mú”|*“Žé?53ýü]<%VNéÿn8eªÀ[o©úऄÃC?˜}_Kx }®Œð”Ì¥·gáç*cK '©Y+×G´rÕˆ¶eB0Êã 8HÏÇXv/¿Ì­ü¡WŒ¢ÌÎ zÀóÕ˜ÂÀLxµB4 ’Á¨èu²NQ$I9˜ `b¨´4Á% ¦Ð5ë©…„Aó+ˆA%µ S¿ù'C4ÓVþÙ£ßèhÀ?êË1£ÙhÚ“Ç´q×LCžÞŒ’_GòÁ"p€³€pÙȨš0ãÓisr‚ߨšxÎ ~äp€ÔHk pöà$¹fÄùËÉÿш Ðd&Eí¯=G­IÝ™§3{îxläáï³§Gñšö.¾ ¯ïÝ=êŽRåç"Û£ ÑèÛÊ 3^\ ˆ>¹T®'u3h’^O7)†+è$¥ÎRöO˧}±SÊ q’aš8Çðª¨;ß°PLVŠW®¡7îw+G o‹ÎÌ‚¨À‹ãÃb¹¡Vl2´‰z·è7L2Ì1\fØ/>'¾n8%êñ–ω‡KŒw qލn“=AE¼÷Æ—@Gô:ÓâpYE"+@³D%«§(!ĘÞŘ^’ƱâFÊ£ªÅÆ‘\x—B–$è«:½ÞHà»"-×êT£nÕ\ó^óˆY0 <›ÕÂ¥z…êàþSØEü6\$«¾–ë! N÷ãrõ”#•9ù Ø&Ç×Ç·Ýð“mã}c10…æ±ó6äXýYC\Í'˜kŒ1H×úõÀë7ÔRmeñÓ-™»é/üŒÎÊì¡Û3ûß}ŸE™ù€eô£¿¦33ÏaY1P |¨ó±®Nš8ä(•¨“OÞg‚ÞG¼Â2Hä1.CËp¼ˆf£E¶1â”E'^ÅÁËpwC¡¤ T­æJK) »«ÜÝn;Óø.Œ%4›#¯ áÆöÕçOláKBKT=ÓRxo„§´¨yco¸¸LÕDêìQ?+—­£Ú~½6̶„?ôxWenkA®ò×|;ÙÜ}òÍ”ÛJ]í)ŽûI8îÓ¢Éb½²' ø¿¤¦^IüU³½Éisúñpøš ­N Áaé\[ÉÜFR,¬¬nYÖ[à©?M£™íÓŠ§]°¥cÞÿÔºåû±©,ìogØP×òó 혯Læè_;êÐßFgr¼.Rè›YµÚfO( ÕØ—ô´Õ§¦›:i'ë¡=l‹C÷¡xÔô¹8b •âcÊóxÅ_G t¡ª×CdÑJÓcšÊ`µÙˆa§¸*k86ÜCã‡ô†Z›•/T~Õb®ó[ñ⒵ʪZ·XekÔ†%ÆŠ®–l5íâÆC6“—§h<%kFƒ_[&Xök¾sÖràæZW|Þ4…åŽ÷ pC2ûdãñø.G¿8†'ŽÈ/ŽÑõ9N‚U-z_‚â· РèøjòKMædâzm±ôƒ±Áh3!˜5¥7Ijëè„zY‘ð’)U&ÔFÜ…ô®å•Õ™íÂÚÌ¥;7åÑßÓ×{+Ê>y-3îaåËÜz`9Loœìøl×Rkã:¿Žç’ŸüžÅÎA}fž¼·.P'øF×~€Ê”Ì2ÍF¾ú*3ÏÖz®d¬‰ÉÈb Ør“‹7±§ÈëÒkdÂ}âŸÈÈ»ðQi1¹y»gÞ+^If"à"À…€ÍÀõiñ?‘{€w/J>ÙŒ¼»æ#ì@¸PÈ×ðªP?„ôÀ5Ê DhB°ˆ_öá[Pü­ÆwX¿Â7l#l<¾ÿêtÂñSi‰¼\Q6+§tgô×.5|jl4n0ozÅ<Éú+!eø¾¤’Ô’:Ìf"i!­øn:¾¯™Ifáû˜óÉ\|‹2ÌÇW 1žÅøÖ¥ß+-Á‡á«$òc²PxˆXÁÓ¡ì°°gÀæªQ…¬ÎµÙ&ÜO:I ³É0#넻ɆêíéŠêš!0Xjl¨¿ƒ„¶"¤Oª¥UÄxýNoþæ´Õ®á}']•ÈEl¾šŽf—p ¡Â*a-^ áCµµüTa`>àra%|œê€ÕV³ý5¡z¾Û*Cq³àÁ×P!¡Eà߯òj›Ò–\?›Ò¥å5ÍašàÓªX3I ªNPÒ5¡ðó‚Š‘ªÂíxs–ïö´Í]ó¢p« àÂ9$lE-oÈú¢` •|& ôæš]Í&a!¦¹d aŒ”ìÕžª°6†Ð_«ó&$\–t¶ iwhøyá^­¿{x+èoJZWËÁ€ÙR3ܬ¦ 4%܊ߥõ¶k 6ßyÅ„RR…À@Ô-ˆmAÌ&ô!Ö‡eêÃÒôaiú0Š>|hJ„í(ÙŽ:•Âu¤W¸šìBØ‹¸ˆ ¸Ó  _:wº¨´fHð >PÂö¨Ø+_’¥òˆÌÂÍAfÖä(D Ù ÊÔ8’Ÿ!D؇pB=B BB1B¡>V´Nµp¬ÉK"a„zâÁ[ÄaשCÌL÷ üÔLô¼Ÿ’Rà=Ÿ.©L—Ìx.]²<Æaܲó>‹Mõ4àt芔?L‡žGêÉ4®iWºd<À…é’7BÍfºŠ&G]8`Þ<=?ZŒjóÒ¡2€xº$Æk—££b”–ÑNr q »(×S4šŒÚ…éP¯­#%|ááëІ'!ÎÓÂôùí©j Ýú ãý+ öx/ŒûætèÍâAºX5„^¨ø.*7‡ÒÍ^çÃÁ1˜âðÙоâí¡‡Ñ->z04>tWÅ ÙwbÜÛµ.Ò¡›ð¡åÓª3´5TÚXq,tehVhYh~¨«ùéÐE¡ø0I¶ÚÓ‡Chp&fQœM/ÆX0Ķе!5Tj¿ÀéK&ò®ÁÉ/p à…h­÷q oy1zO‡ÕR»Z®œPv)*S•ÉJT)T ”|Å¥sèl:‹Î¤3ètpU‰øVˆè\ÜV‹sUÜ%ó7ºˆ M/rjqØìˆçôp8Ht úqÊ)ÀѼ`*mO ¯ íËéS ¢ƒÔ0oIJŠN¥)G;i_8551Þ>¨dç§êãí)¥ãÂ΃”Þ•DnŠÝ>HÉÂÎAšåY·ùÃ)¹õN\æPê¿õÎd’øãEþþX‘oóäHð}r¬È†l{tªv5Ç—ƒp|~OÝžŠ,À]5XßÊÿû5»’ÿ´biíiÁ?¤7jaã•¿¹¸„×ü×߯÷Û´iÓ•ñØÇ[¥í©r8Ç&ð[sEAWÝ-Iä?›'ZÞA½¾®Æ1º‘wÇcp±‚*.!ˆÂúå~…q+bã@ ¿f݋ж ÀjdW§+5{™]=PXÌí—•u9û”§ÓH w.Õ•ÃâTíˆì*ÞU±«¾¿¸¿¢¿ž;ÿïCfh?JÓ•û²1~åYb º1 bsO:~,—¯™/ý<jüJÍ“wn9Îâs¼ÿlæ¨ý®ÔšçÙ…ñäQ­ ¬F®ïM¹ªñx.¢a‚Ê /"ÿ—Chë endstream endobj 23 0 obj 14133 endobj 24 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 722 /Descent -212 /Flags 32 /FontBBox [-628 -376 2034 1011] /FontName /HEGFHG+Arial-BoldMT /ItalicAngle 0 /StemV 0 /Leading 33 /MaxWidth 2000 /XHeight 525 /FontFile2 22 0 R >> endobj 25 0 obj [ 278 0 0 0 0 0 0 238 0 0 0 0 278 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 722 722 0 611 0 0 278 0 0 611 0 0 0 667 0 722 667 0 722 0 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 0 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 ] endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /HEGFHG+Arial-BoldMT /FontDescriptor 24 0 R /Widths 25 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 26 0 obj << /Length 27 0 R /Length1 23072 /Filter /FlateDecode >> stream x­| |[ŵ÷̽Ú-KW‹eɲ¤+É’Ù–¼&vœè:¶ãØ!±³;`섘$° ì‰Yšeo›Ð² ŠÍâx eKÉcM ÅiKÙÓ¤¼ ÄÒ÷Ÿ‘œ¥ð¾ïý~ß“}æÌvÏ™;3çÌ™3#J1’!"åÌs— ’[h-rÞÌ}ÕÀ™K®:eóé„4+HÇÎ]rñ îŸÚË‘DZ>oɹýÿ°\¾éÍH—œÝ¢š†ôsHw®éüÓÖ_Í$¤ÅHHŽyìc$Ò¼„¸#àíTD<-Ñ=ò $ u²‰‰˜‘’ˆ…X‰ØIRÕ§„¨n%n`¯¸”x Ieà/Éu(û”ä$Ç ÞGíÝÂç,²›"ýÝA~‹°°l ×QϽ<|)¹†ü-3“õh[”v‘ÇH1ò÷‘9•܉¿ï²’—Q¾;õ2¼MðúEÈ»é—è‚GðáÝv«BämšR}I­âd-]OÿKìý;A!)ìLµ‘yäZò ]iêq& 9—\Nn!¿¤fH—Ú‡^q€wKêÔ+è¯sÉ62J'vª®HmÁ“óÉyäVò$-Wõ©^ÿkòêÔ@ê-ôÝ äAšEý .I-"ùd2‰“ÓÉëàŠ?*«ŠÇSÉ?¥¶~„4‚Òzp½…ü;ÙCþA›éÛª°š$iÊ—z=õÆež½Šø“h€Î  ¹â›â÷5'iÅÓ§“~²œ 5ä!ü=†V¤Õ´†6 ÍBp½p»ð¢x›ê Õ:ŒÌzò,&‚Š–P…΢óé£ô-úzëñŠ$A{d¼oi!§¼ï&ŒÔ+¼ÕûÈ8¥hÁYt€^Aï¥[énúgá%qj¦êËÔY©kð²FÅAü¤L…ßÇÉÙŽçÿ Ž.´½ŠÆñ~W §kÅj±S ¾£Z¤zL= 22 =½€t‘Ë0r·_ƒê ä}ò5 ÒéôGߣI![xT¬oŸVQ•¢º]õrÒ’üMr4y0Õ’êNÅû-%W“ëÉmä7äA̸'AmŒ¶ÒSè\º˜öâuôú}‘~%¨„Ó…§Ä°¸Z¼T¼L¼]<¢ ©.U½«^›ìIÞ–ÜžŠ¥ÎG‹¯O}¶š!O“H;ZzY‰™1HÖ’‹ÑæËÑçW¡å×ò¿›ñ¿Ïgȳè—ýä+r„êi65Qáo2†·ê¢ЛèÝô~úú)ýV hID¨æË1ž÷ / o ˆ‰Ï‰o‹o«ªÙª…˜…©WµE3U÷ÆûŽ>1~×ø=I!YœìIiSîT~ª5õDêÅÔ¾Ôß!¹2)żœ™ºœlƬÅH½Ž¸’ö7ò)æóÍB h˜Î¦§Ó+ÑÓס¯Aƒ¿G0sž £ø{»èÐ=èý÷é~ú7úÅäÂB->]8K¸LxXx^xQHŠY¢[ ¢?Ä~ôéâñA¼Ã[â?ÄoU&•MVMQõ«nU=ªzAµOõƒºU=[}‘Æ¢¹I³‰ÏB&?'|h‹P úí†üÑãO / e.gÿËá ô[ò NþFÇ1ËoÀß•ä3ÈÑ"¡‰~‚™ôk:‰ÞJïD¡ŸÜ@w‘­ä>ñ1úžp5¹ Ò_N¾DH…´œ^/äCÞ"Œ¿bf솼üChE|7FÚIv‹»é ù'ýšÞLâ]ú„²œ¾E&Óëi3Y%“ ¹€îÆ ÃG­¨¨ú4èÛåL÷ªn¾n§I«°…¿ýMt ÙJ‹1ßvÓÓȘªVõb˜é·“»Ð¼í¤€ü6õ3òot)äøIj ¿ &§ˆ‡UXMR‡TuKJH.%{SsÉkÐX’ø™I>¤7BoÌ$P¹7µ*UÙ¸;Õv^CV…êFµÚx‰°Š¼ ÝªùHÓ ©ÐPõ¥êeêyêYê&õ$u…ºXíW»ÔfµAuPõ'ÕÕ¿©îW]Ù-W娌âGПÛÄ»ÅÅq¶Ë1'=¢JøNø»ð¹ðGa¯°KxDXOh凩WRw§:SSS“R¶d2y$ùbòñä½ÉÛ“?K%“}ã/ýÓÑ·n;úýf|/ô× ôµäX.L-N’úòfOÝ–šš|ŸnÂ;†È8äë èÕÛ0.÷£o» áa&•H’!ÐCï¡|;ysì"ÒGNÕ, ï0$óê̬})ceÅ GŸ‚19ÐÒ…Xi_"¥î‚Æ6.2 oR9ùR-sÖ§Yä¯tùO’'Çï·‡5ëvÍ#äˆæ—â ¸Ü(´¨-ª(æü¸0@oN–< :í2²]õ7²å”®E§.\0ÞÜÎŽ9ímñiS¦Ô×MžTS]UY‹–—•FJŠ‹ á‚`À/û¼ž|wžË™ëȱ۬ÉlÊ6fô:­F­JJ[‚3úäD¸/¡ gÎ,céàd,9!£/!#kÆÉu2{n ŠNª© æYÿRSI×TŽÕ¤’Ü@ÊJå– œØÝ”Géâ¹]ˆßÜì–x|6«Â<‘„ß'äçŠf9Aûä–ÄŒµ+6¶ô5—•ÒmY†¦`S¿¡¬”l3d!š…X"78¸æN£<"ä¶Ôoˆ.ï˜È 6·$\A< 2b¨eɲDçÜ®–f·ßß]Vš Mg—&HpzÂáUHg“Ð4%´œ¼2×!7ÊÛJwm¼iT"Kû"ÆeÁeKNïJˆK@£%a‰€os"÷ÒÇ“ nmêÚpb©[ÜØâ\)³Ê7n[çvð¬ÛÏ(twƒžB3ú6Îë›0TÔEãXóÙ«¤_ª?ØÂrúΖúàôàŠg÷a@ò6&ȼKüÃyyÊöÔ~’×"o\Ðô'âî`÷’æümv²qÞ%#.Ev\RVºM²¤{s›Éœ‰³OŒô£§Óe<Æ«³Ø¬yǺ“²Û æÑ™2ZÒÄ‹LfAÿd²ñÌÉèu|º)žJ,Ã0¬Lè›ú6Jõ,]Iê”7!öà¯NÎY’ÉÑ„$H2 Ùä86ÁtÉD<‰$JJؼÐ6a ÑÆi<]SVºvTØ”d téìÂcÝõQô¹ßÏFõÆQ…,E"14·+–ÉR÷0Q¢‘î„ÐÇJvM”ä,d%C%Çï bú>‰U›ƒ„.|ìß,9l-+êÔñ)îO—Ïšœ5wq—ܲ±/3Ug-8)•.gŠ~CY&–°5u‰nMmÄ·ÈK1O_|¬ ]Æ„*„ ŸÉËFµ:LEžCå ©of:ì6øýAù=4š:Äžâèøc™×HÔG2 M7;1å¤ôIÍ3ng-€¢f-X¼q£á¤²ÄœHÂJèC˜'‰ìPÂÄã¶Ð°Ã´0"'L}!hó±E©´°ë·¿[î’ J Yœ‡¢‡÷DVó•… Zf‚.䄹!'•Ž6ÔM:÷bÕ !ÆÕêB )”°ð¸#4ì²°X8oë±0(ùQ X¤†ÿwÀÿ¹¡„+ä$Rƒî(É´…ë‡MXgWŸ{ t)ÞÿêЮ„†w/d Óý…·CûÑ`ü§É.€Ü&:"ø‡”v_É$ÐE'~@A S©mJYi1Âcr8ˆä°I)÷A C'»ƒþîÑT 2ÂÒ¡/„^—û6ö!LÌ/a¥aÙ uÐîÆc"êÎÀª´q㌠øKv—±%[À®Ž¨–« Vy-™¢x5ÚCX%ÕªC"1hÔ‡DQÈÓkU‡(qéf]æŒÌ‘7Ìo˜#}Ó0[o ñ†ñ±*‹ßò[üËUä¨,î:ª¨ÉDVíb<ºS©î¾hªÔ”¨i¬œªkµÁÚxI</Zv®ér“^-çÈwê^Ô¼*¿£ùXóM­Žc+ûáá^áŠÝÛf±ÅJ&½®˜—Lª6Z £©]JÔ+WK†Nƒ † ‚Áß[J;Jiii±])«¬¶÷[%¿W[lª¦Õ~UV6=éï Ð{XoÍŠòêr7ÄF……ŠU«äšâ>­¬iE­krüiþæ=‘Ùãðê‘Ö$~`u<~ZD1KJÙ⸤˜½,°Ç#‘H÷ˆµ.ºzÍÕk"¨²R»FP‰5uõ8–ÜœÃñpúQ<\g­«³ÔI_Q "øTÄHÏjººÇ_£Ñášê‚ªÊÜšêp0 M§kk'ÕÖVU:r,,°k°be9ö\GUeí$Ñ7{Ç)üj?ë¹´cà´[j½Åuö‚ºS~¥ì|;Ø·ºlÅ‹'»+µ?Û+.~âì+ÿd¯(¯/ÈžRžΕr\lJ.®+/«£Ω…E«¿¾’ÍŸÔ—©1Õj v{%t³R¡ôzƒQ|Z÷²îSÝ÷z•OŒ¾)dc´@þ²ä¨æ¨œ*È.Pôæx˜÷>"Š!«š§œˆ¸UÀ­Â:b2K«ÍžãȘÙÞ6BŽÙy¹.o[¶œ]d‚Aå%¿Jk6ù Y>6¤v¢•øx*ÚN­&¡¥ûµTËy[ qm^) ™0!{.qÈŽ˜ãMǘã #åÐnqPÇD5‡+ræå|&DVó)Àä Ò³ºgöLÌ…¸¥n5Flr$²MÄî©l%Kª¦x~˜``+bM—(yÅ%²_­÷«}>Z¬G k>Z¢+òÔ¡‘È•W^IÚ\¢HáÂ,cØXTf…‚Ę E!(N— ±@ÕA˜0Ê•bþEzhYM-lR;Á¤)Ìá3§¶ªÊ’‰P60GØ¡ËfÝÛñ.-J~òé¼»ZµÇ•¶ ŸâÂá+‡†·Þzë}jK²º¢"ùÁžß'”W²Ù ^Ä£÷¬O$._}Ë-Xí×@Öo„¬GÈAeö>ËÛö÷ ö~nýÄþIÁç…?Øtv}P¨µö[–[ûsÎ*úÁ¨É2Rk›uva·õOö}_Ú?/Ðæ¹²D­±¹Üc¶¤—ÜÔ=JýOȥŨüÅZý(mWô‚ÆádiæxÙ0I®šAï~¯ÐéÝã¼ye6.΃aJÂr8 «Â®Ò?¤±gõlHsr Äúc6~âãKKz˜Ð |¹uLð˜ˆK:%Û7°@Ï7T( ÖÕÝL²º‡rùc²( ‡ umF0íZ5Õ*>*,­«+/ñä8Ë箻則_š;5X2µgcò›ƒ×>I ¾\x«¸<o»¦}šÓ:àŽýöª‹oÌ“fO+ižzÚ™×~ú!õÉL·Nƒü}ž‘¿A%jÈÒ™Ô9âa•²|9>Y*‘³¢9QY.ù0üa —>˸|´À,3y+áS™É"O9q+6&}ÙA¸k휞O+`z:Úè ?A§·ÍpÎacÒgÓê }ÙY¹‡OÏDËLè vÁ#мÒ™<ŸÔ!õJÒ 4&”R’n§D%W¤m3&Y±ž´°IL妥Lúꘈ˜ˆ1=IÄœÁB“5h ùH¡ A6Ÿ `i *.É2–dA¾Š¾ Í2“ .}²ßž#ç@¾üv”æ8Ž•ž _mäz™¤7·&#_¶äK55ئ@Ïθ{Þ§ÉOhÑ»÷ÌâòL‹×-¿V[~xŽISeq Íúý®¨HÕ••Ÿ ]l¼§c¼Ï†|yH½W1ŒZGíϸïVe¦ö+mùÞêeÂ*ûï5ïköÚ÷º>Õ|fÿÌõ_ÂÍYÚÿéû.h®Õ´jëJûJçÙygûÎ þ\ØâÛ|Ìwð{W–G«³l^ªC‡Ž”ÔW3¬]ê!ÝpH‡êxÊêU<5\ÞÌ,º^ªx‡¼Â&/õŽR§RCk0N?"ù5>BÍp-¼IÄ´ƒb4WÃàð³¥=î÷;´*¿”åú†ÉEY0}F‚3âÏ 3 þÁ‚êýY4+/\pE=ÅnS‚5>Û M°)Ùæj›+Ô¶*­—Ùý1›2¢Ù‡¹ZD,uQ¨é5È;Àú)¯âòÇÙ;ŒØ‹Òæé •ãá"¾C¼ÿÞ³:©šQ”)„íXúÞQô–ܸ¯Ap4õÎ00ÓL@ýúP«“¸N€è«‚‰Ùá€o šW«Zyôù77®y~Ž·x²·(ùÚ¦o’ûh|ÏÿY53*ÿ5z×ÊwÅèK+ìõ¥Eù¡&êx}/5wUµŸ{ʲµ]‹ua ¦ð¢ÕmÐUt¶â׺sÝ…îInÕÝa*˜%kQ²£pÜ%2±`æxÛƒ¢g¥*ÞeÌfKm£ñD9gf ѲØ8U¥eåÑXEe¡;Oª–.Žk‹ &Þ¶¥¥µº@™=AM=˜cýE~±.+«"ËÊJK%gÌ©8;}Î!§Æ©1/Óë…e:‰ÄލGéŠQöÇü‚?¯&o1S&rž”s±1))vc|@Ú"=!í”TDêzSRI®êQJ·M¨yÌ„¥†A63fŒ4Iƒt ¾yã,rà“iöÁƒíJ ÷×ôP‹?mLù™ÉuÂÂYÅR•nhA§³E4'SUè§Ì ¿…—.eáÒWw.‹O.¶…×/=k6m`yÂΤ‰I;ú5 ç\·Í7¹4:EëšZ6‡e0ûŠLO.P½ þ–„H½Y©3 ‚Ö˜kô[+¬Ó­£¾Qÿ+¾Wüß~W‘%¹}!Ù Ýa<ìûÁÿ}á‘ÃeG*² ™n¯`‚¤G¤pê©!%§,v+QO0-èJQ¥Öh1&FÐïm³ç†­vG^Ôã(5ûƒZr©@5Q¿'Ël _D]aáã4lÑ?¡ß©S¯ÔïÒï׋>}Tß¡õyUÖ>«`}¹”›c>¹Cî•äAY½S¦²«²mù„Êÿ¤ã´:­õ±ÉÀâ ½ßðqü€tË2_˜agL¬<¦ÿ Þîdý_Rî ”J}¤Ü‹ â/öÑ2_ô¸•Öÿ± w~…;TÅòÃAêÎ;¦á™þ7†Šƒê¢”…H¦ Ú„qU3¡ü-vXåÆUem͉‹Á‰k€8vU¼=xÚsk?c‘¿œ±¢ùæöÿÄr÷ŸsnŽ?tá…1;¦²áw¬ºï¶œ5gYi)ÍÝýš[–l[ýàƒ«×<ð“û<ÈýcûÉä+Å5¦§CS¨!Ó!m4ç:®Âû|çÄÌæ¢â’HiY4«øÑržö•ôzÝÄȳÒû¯€ß/ŸH†LžT›ö¿fê>ém›LàÕ|D1Ó#˜ÞÅEE‹dp9™´Jº=ÄÄÀ|ÐçÕ?Ë4ÅbCÔWA+\uéÁïYÍw•LJãÛK Â?pø7´ø6ˆB,ùV{JææÍtý¤Ú\K5—Eíò'ìÝÛ”«›Î~ðÜ9ÎØ´ö/Úâ1×ì‚èéÍ+»;r+âퟷÇ+œsøš KwV84óÞµÉõf_ÒÉ>‰Òó;äHMWr脼´ 9ÂXÌÂXˆ8‹}q;¡XX²²§ LìréÔS%[1 i%Ëö3'+Ðl¦_Âqgõ‰ƒ :æÒžÈ5xÛ¢B\èÀQÐaÖÖ]J¶©.Ž\’¯É6ÔÏ"×NH&½Xźۜ“#Ûcö>»hwyßÏ… v•4~b…}|<¾«#ævE ;lCr‚5tb3ù¯úOH¦Ò7l ·²ð›˜m£¶ìÛ—¼l¼‘M^iµ†yÚ‚¾¹}S¡~[¹ØNµ-µ]h²m̽®ì?Ê^¾mû0÷­²}³}^aþm4aÛ‘ûdÙŽè¿Ûþ#çÕ\ÊvOîíe[m÷çü6÷2m?–ýMdc`SÅ-6d‹TÔWô’…¶ÅÞ í~ÛGl¢>ƒå¢6Ðï¿.ðjà«ÀÁoc{psP ~Ul¾ÿûu¯_‰½í?â×ÿ½ö{wÅ~gßÜ{Ó®ƒ?`ÿpk s ·×øÓˆ; œ§Ì®¶/œ_c5S…äWDIÈöMkC‘HS5ðÐHç<†w ϪáÙÍ,Ù¦Ôί È­5²¿Qnöωuú{c›Ü›ò7y6y7ù²ì wÛó‚Õªœ¨„'-³2Vb?³…Xv‰ àxùPëF—Á•çÎ÷x}²?01_ÌXë=ôøyÈD~®·­\i­‘Êåò­å‰òCåjR>V.”ã ”Àôš±rZ^plÁvXÜêHíw¨|ŽMŽ'°9VÁìRᇢ””V;”ºÇ«Æá°7²6²vM´y¢½hçp¾Â:G1ZôÇÏn&šdò¶ù QÐqD™_ÃÜ4ŠÞf·Ûlö` ÀRØ“Ù+*bLÉUÛy0ÓUc¬ .ûZûÚ˜h#»?X«0T¥ãˆê©+¶“žCÂXI—`mµ ·?iµÚÒ —É g¶Ñ÷顤؈š]qŽ ŽƒQŠë]•€­b‡ð=ôï·ŠË&{ýË\Þà²ØŸ#úe‚a™Å®À—dßA¿ 6áAÅbÅ ƒ‘¾9ðaÛQjÉ­cÖhD·¡<¢¾BzIµ¡Ü‰$‹:#RUq<¸z ¢=nò2÷“’]ÄlÑo„ø7Hº],©¡;½Œn'v¦°Üé¹ œvVPnébÆ)zìy+ØÆ— 놓)7nW²+ˆå³ùÇHÚæiŽ‘ödÒ#]”IsŒ4¼?¼>ÇHfÒ# #›³æi.”6l" ÙÐYàAæ9”)TŒ±†ÛÓÑŽ$ †²¬q; ™`°Ù5‚Áæä‘ÿ‘¢G$˜H™`@Åð¾6^QÑcVؼ5«²àÒÂ(bA! ¼,ð° ŸA Š#1æn¬`—ä§“.3’òYfA YÀÇúÿ#è^ašž}ؖ橊º‰ ¦oà¥dôÉ3h aÇkvÃ?…ÏêÕkzHÏš5«WÃÉ4aúLJÛËië9¨¥–³£'Ò;Á¿th« ‹1[Eê¾£Ü6þª=ØG&e«Hz…Ÿ}eÄ]Η•×’{Ó+LaxÄëË•X_NÁúâ$ë”,r|/3¡R˜!óã­ w#;(ž¨«÷¶9Q9cÏæY$6T|Ÿ!K1©OÚʶ®‰û´Â:+ç»`îþ‰Õ2½Ý?þŽì]RáÆ&ÓÅ%ŠcÌLÔ<êy´ôYÏvï³¥»=¯—ê¬Ìm9’ä~EÅŸ¬¶øÊ×ûÖ—oòm*ßâÛR>æ+7TèÆ&Å…8«­7UOVlˆX¤º¦vÒäºú)Sž¶0óð¸_gâäÜlj4XFÐæ€ 1õmVOœºû¼?Qל®ÇžQŒVõÄ}yÙŽ4Y…ÀôF…é7LÉä{ÛÌÛQá%ß[VRCµÓóü†¿ê"ƒvº¦¦º:Ê1`§Š•à©\‡RYÃݳn¶yë«'ü¶ª>Ç cȱ١²:Fé!Åâ•}1ŸàcêÁÇFNáEOZà ÀÎáš0'  §Âª>8 ‡Â›á0dÏ„Ù3aP&eåxt¸AšÂ:Ô®Ù2…š§l26eÿ”CSÔoòˆÈ K—ŧ(SãÕS”ÆéÕS†šZ›9 ±Sæ#Ö¹Ái=ÕS\MñŒû‚‹V$²fuOçR#Sè”íB’4I‡{ºùZð D•iL\ÃLu°Æ8­±qZ¼]¼©¾"TZZ™ÚyU²¦¾¬¬NØ-°ºZ’g¦塲¦t-I2rL4uz¸™ù¤Xá’OoýÌzªÏ›ä%LöSyùP”ú¢4êª=yûǼ4€ Íšž€ØòAž˜cØ_ s3G*–ÌXž0Š™aúé-aÕÄðÝ9yCÇÓg/`CÃǨ zFë9ó&öƒ1gGzÐZb±Õ‹oM^^x°µ¹ºÉW4©;yµÙ[ŸÞšé×é¡Â^ðTøh/ÃX™±üwåŒg„QÍ{†}¦¬ïæ¼ç|×õ{oþ§¦o…ï4Ù/»^v Ö¶s>q}éV}à|/ÿsáSÍ'†/MŸ[µËœgç? ~Hÿ`Öo³6kW giú ç˜Î¶.shì~£6™s§Ø-jw=UäYáTy®°ðŸ.¦Ô‰ºíÈñ`K}€?è`[<| +J–;`ÖÇ­,ÈabìN‹ Α¨¹/¡!«™ ¨ÚtŸ¦ÏT—]¿ù¦¹îúÔ7QñšÝ­K~uãŽçnØø}jퟮ¾ò£K.;pý_^qæüÁá ûzŽÓƒðiÝŽþ “jºW‰ŽûÆ‹ÇËÇWk4nCXxÚÿ²oñûeŸR¦ñ¹q|è–Ã*kó]ŘUÇÎᄎ¸•Ê‚RÝ KþÉ»jx.£á'Ü’låù±G4ÏÛær’ë "~OÞ×Å­SSé/Àí1S!ëå`LVäNY$²$Ëò~Y•©œWë¾4/Ïå"á¯q;Á\"1cáÍÌ¡†v ;ԨɜfŽ>a~F‰9«áêb'ˆðsÄãðT¾â0ãà‚ûVªÎcŠîÄ3DoUuQ‰7X„K¼…>ZDP䋸pº]9áæ:á$1VÂùWePUŠÑñ'yº¬¥åîü²P¹;T—æ£|ÂÆŽ3:5]Êla&Ò¹°€Ë¤ÊYPÆü‹å,àéæG=¡ÿΪâZ‡’üèg🲓j;…\q³“pžNœ?šyÏÜ·hÑ·>Óq`o¾¹÷îÅSŸ¸òªÇW'\á Åb3*bÉ¿Ž¾~Íyåôg‘k»Ïïh›wï=Ü>\ÝÉæ[1½ø™Ò»4ÔÊÖ%”WcÚ%á é l•‰éRæW²ÕÇ÷Ðÿâg{n¶—M{lTÇïNXܪùѽO³uV‹\­¶(­ü¡j‹)¯R±J¾\ŽxÃ?mwUÓbSÖ(õ(~s§iò\¢“!Òº>ˆµf3Îbò"”`[ÈÔ©%@üÌIÞéïóú5~WÉ pn:0ï÷'0Ú™«göæIÅp¥C~Í©“”« {@(Wî(µš%A”SPm-A"YvØjŒåfÙ§Ï•³Ö_›ucì­¬£¦Oêþ\ÿ]T”si¬ W¬*7ˆ*¢-ð;Œ®˜P.cìc,0Âñ4R^YmÈ`¤w ×× É/­­K—³Ò‘Îù,Í1/oïH—ó§[ÙÓ;àÍb4•¬¦š˜« IK}†Ê>¯°º¾A4 £Â*¥%VnÅÊEÿ$­¯e}ËÁÑÜÒÑ"øZh‹ U·(µ5-ïMÚ ÉUÜeÕ¹K˜oûý"ñÇqBó^ž¡ÐoÏRà¶énœajÓ2( I›¥„´KÚ/i¤¼6í³ÂBØ38ÉËòzæøªäªX•X…Qôþ`u•kfGúü7Ò3ûp,Oæž €XÝóqv)ìØÉñLåx? ˜Ð8ÈeóúÄÏKú(%«Ùqþj6YóˆbÈŽ7±` ZXÐÌîfs`˜möóö!cf4ëvEã9€Ç‡¯X:]'º¸¶dÏ0­Éh(¹ˆ€¡%ÞÊpµ0®–ŒÖ<±ÅˆwSææaG‰ê1ç†8LϨÍBœ8ÀÂIŸC!›5Ö`]fØbcvp³Ö‘“y@l®<¯á¢¾yàΕk–ÜøQ÷qsÀÞ:TiŠ^sêÍsB55~;~Ϻ7Z¯n°ùM%“%yRh²ð Ÿ¯Ð‚›D’9??tëÜóÚÏñy³Mñö–öxqeQq©ÃY”—gÍko;ç¼¶eî|Š*›œååLYÜ¡ú¾ òذKç¥ÃŠ/„¯ð„C!FDí·d º¨Ëe/+.¦ƒÆýFÍ\EŸW*H{çÂo±3ÿu'<؃ö„}—}¿ýÝ !“e ÙÕvWÙ\ý©s î3¬² iïÙéï‘8Õ0?¢Ð~8f›œú}Ì/ãHV› a\PljI_À¡ì}O>¿ ×óo¤»ýø™_µ»dÕ/¯­òM‘+’cgîÜÉõT;ÓL”/h8í럞ãoÊkˆy¢\L_d…09aw²_§¼è«»Å›°N销!'Œžù™ ¦<ÓJÃJùY]lšlZ£{ÍŸ™5¬Ÿpcâ†%+PÚÛ{|e:ÙÄd+%G±+6ŪX”\Å©ä+Ål<ñ²]zc¿·Ø¥Ñ0p(ý¯ß˜¥ p‚Ó‡ƒø‚Î~*¡ßó"þg=ޤÜŒ{‹eÈJ}Vju•œlÜÂí62ü;ñ¾¥×ž'qláaF=öƒ›°>á1¹ ‚…[ “&Òªÿ5/DžV:¥C’€Í€V1È– ‡ÐõH€UQzm× ´Š$wâky8êÄaU‚¨ÁgëHp=T­ þ…Õyã=yN(Ûžy.e›œ»²uÞZ·A—ö7;3Þfh© ƒLX§lÜ ^Ÿ¢ì‚÷ˆš¡ Û}+¹e™,D$'ŒÊ tç3{cZûsîä C(b£0‚‡8Æu †mäiOÈÆïUÕVeŽàƒøÚ^Æ%És`g +þ4/·2ÞN]LâÉGÞK>âaQjÃ1 sþwôe“ïäpîÚ(ìd3¢®¼Î˾ŸJñ>¢úOÌ‹°øåœÍÖÍ9‚^0‹šKð‰ŽÐ¶»ìû„½Ö÷sÞ }!|fý4ç“t½C¸Ãv·ýîÐau—uWÎÙcÝ“sì·îÏI‘CÖ¯s²ÈP}/N9°ª’!Ü^%Cù5d(¯Æ®äÕØØ ´öV[3é]#xiŽyÚ•N+W#Â.Ú Y‡2¬´>"Y¥œ^ÒiíÌÙBX»õ%B(T'Ô†Ú„¡Ó-óWÙn²¿I_^µ¾d{Ãþr΄v…¿£)‹‡É‚>¤ »¨W°„á)´*ÜN›Ã§Ò ©i³í±1¥ÈASña\õa–ì3ù5¯«¾£ú—àð3ÀËD¹btÒô]Éb±î8v4>° „v ÷÷H²Û'lgÍ8pÙ'/æÞÃô-P¶,fHA‚ B¸[¶J1ä8ì9 û}ŽI»(¼Ðj±CvpøƒÛ>¥ˆI—ÕV*²‡sD…B›•Šì{É9bØNl®Ù½}”ž­H^¯Çc0è5XÂðÅ@ƒc‡ð±(~¢5È…k?9„ §Dæ²¶Ò†¯]þa;¾ØqcK¬˜‰3-^éPú˜ç7ðcÜ߯Îz6\ñ;é¡ÃÐñ;ü™¸ A½§šO `6I†™ƒŸIå„dñM¿Ã‰S›3Û·¦^ÃÖÍ·Õ"@ê#ÅT†²îÄ@BöLq äGÏXqÁ‰`‚HÃ#k؉Ôñ¿1¹ä`ö‚ Ÿ½À¼aXÍøìæi´€§yÂÍÓÀ<6ñ40ÒC#hÒó4l.žæõm<½k˜§ÑVþ<0Kgձ䶬µyã»)¶Gk(ûú(óuTñC (›­Ê6¡bÒZåg/<6¹.Þ¾³=^àþé¡ÎSœ±xû íñIµÿ½4y°S¬‹0ER.;“ÏÒÙÉÚ’¹;P\§odöQ¾‡¡[ÊDA¹fºy9ß|Yef—¤ Nõ¬õ^g¾Ö{»Gmb™w 0 3î@0h¾Íükóvò¤ùe³Fåµ{7˜î0ýÞ«ŽÒrS±t‡ççÞû½O{^'/{>ñ¬[•ÍæFó<ó*óäwæƒä Y4טדõæ[Í$3úG¹(«¦T {L3̋̋¥EÞsÈJÓrï¥äRÓ#äó—ä ówÄâ–lÞ ˜&›g˜›½{É»^½UÖË9K6ÊÙQkÔµGsôQK£·Åíñœ[‡]×aé°väôZz­½¶^{oŽÎl6¡+ÊÊ$ÆÛh¤ìú»Žf2ÿË*k¤Ž\'ß™{àœL!À‚U·î…PÚÛYZvÌ bñGO±E÷&9'‘mHÙ×%s£á¤“vvªŽó ì‰g^ÏK,ìe^\¨T« Kee£Â¸´íP &3N&þ¨xØ6À„ ™zD†’Ò¡5á vê#Ä+Ü¥H ßu<à [ÍÔœ41#+kÐC%ÏzÏ~èî|z=,ØWÏÑ{ñ ß8} „ÝÁMÆq×áçž%vÑ_Ãà+uîñ¥:­/ø¹1W‘ˆ–ü¦ÝPÛqi೑\;©}'ƒ¹§'´=ƒ5[ ˜ëLˆo3g¦ÒŽËïkøÃ¬Lxš´CœÍC,`ÝÊV|ò1¼f ‹mPôÑÓ iVN¾ôÍi&|·3Éšv;Ç$ ^Ú‰›:š¹î3q…Nþ²²:Þþ,òæ¯MÇrþB[¼¶&Y2› b²‘-ðohá}\”>:LÓ÷ÓK;äïèÒ´,Â9ı!3&?-öšŽèôøê >/}(„'pê£ä5Å)#%z^Ÿà9Í#ãwÃ>ؼ(SÿòX +eŸ\Õn²ЭÚúx ``:àö δ®D½€«§"~xàNÀÏ^¸¥ŽG@¿’ÊB‘°_Ü«ú‹zæ#íýºÊ¬¥Y¯d¿cú­¹^Zc9Û³½l¿.çÖÜ]®kxërÉטq×à}x£¤¿.²Jý6|ÇèQ¬y¬7Ø/5à~YûÌ–…§6Fš.\³²Íœþ‹:ç—MXµlö^Õ’A|_ø§>¹ÈlÆÝŸø‰™¤ ¿[0 ßž¥“ÌÅ·ÎçãÛ½§’Eønr7YLNß¶È×8UEIà‡9Æ€^@àMÀà @‡ï¥ënÞ`%jâÃUã( Ia/`ìXjb[[‡j¢ˆÉ‘,S¥¯±ß3[*„1„ @ÀO›ì#ƒ<6„p3mE˜à±]ÓϰR,‡c5÷öDžÏraŸ°Šs“…½à²µ÷b·¸Wx˜çJÂûh“Æ   ‚ïç^çaá=x^Þ#{¢ðžpË'¼;\mö5Ž ï §òôÂÂëø{ ¯âït¨™Ãkü­^%»„WI €ù}€AÀfÀ.€½óÞm«ðÂ(BÐ`õ_#›;XeQ;ŠXœÓêEHÉzárÜñßNë…‹—.\Z/\¸°pÏDl5` à|ž³ ±sçxÎ ÄVΜƒœðèç<Àc<Àc€óðÎc@Dl5` €ñÀ¤ðà<„ˆ­œ `<ÚÁƒ"¼p àR{‡vÐoývÐoçôÛA¿ôÛA¿ÓoývÐoývN¿ôÛA¿ôÛ9ýzN¿ôëA¿ôë9ýzЯýzЯçôëA¿ôëA¿žÓ¯ýzЯýza`›ª¾1õ`PõœA”3ˆ‚A ¢`å ¢`ƒ(D9ƒ(DÁ QÎ Q0ˆ‚A”¿@ô£ ý(§?Æéþèþ§?úc ?úcœþèþèqúc ?úc ?Æéþèþ§¿^Xމô(àqLµõ™€e€~ÀYˆõXÖ }€%€¥<ç4ÄNôÎà9‹ëtóœùˆ-,œŠœð9|ú9ŸðŸðà|Àg|Àg€óNCìt@€ñÀr:>à3Àù ó[X`|zÁ§Wx„,/±3Ëýö>½àÓ >½àÓËùô‚O/øô‚O/çÓ >½àÓ >½œO/øô a¨‚S/çÔNàÔÎ9u€S8u€SçÔNàÔNœS8u€S8upNàÔNàÔÁ9u€SÞ¨|:8Ÿ8øÔƒ‡p&` ÀÞ&qðˆƒGœóˆƒG<âàç<âà8xÄ98xÄÁ#qÎ# %œG<¢à(ç(xDÁ#ÊyDÁ# QðˆrQðˆ‚G<¢œG<¢à(ç1pcà1cà1ÆyŒÇxŒÇç1cà1cœÇxŒÇxŒqcà1cà1Æx—Ó…Ëh¤äHË÷šû [!#[ +Ë 3‹ ­&HJ$&¹(ƒ|”BN !/!HEÒᇔȯ°4ÏÍ~òCc­þ­¿mÜŠ¶nA›—¡í‹ÐÂV´´ -n@Ëch_ÚYŠö¢Ý!´.€VúÑZY˜¯¸¼wüs™ïÀÀj@ 0Jó”XF?¶Z € 27Û}ÄáÀ.ÎjÑ)¹ÂTvɦÏópÆÃ‹xx [yX¯ävf?ß™½±3{ 3»·3»»3{Fgv}gö³4IÖʧŠg]öí벯[—}úºìöuÙÓ×e7®Ë®[—]».;ЏL¿¢ ¨økÞÁÃ[XH~àá?y¸Ÿ‡gð°‡2½´a8›à+âG†ýSñÞ‡‡ý@†ýKöWûž£â !”øèýÃþ3û›aÿ< åÃþ ³†ý@Ó‡ýM@Oúc¾ïý£*møþì_ã{ËßîKøë|÷±¼aß^”å[ãøúý%¾eéìEiÔÄÐÓ¾©þG}eéœÒtÎB›Þ¦ßífÖ®³ê$IgÔt:F§Ò ¸õwí~¥”íÙíüî%Ø”¨x\‚ N!Ö,ÄèlÀûvSa&LÝ&LJØÄY¬ùÓé¬Ä®3ɬ¥râ›ùÁQj˜»8¡N§ ë,2kÁôÈùÎY ×üY‰ùøžQajb¨y–ŒOÂ5'w5w'Â<:J â•™¸‚x}&>„xk&Žú݉I‘Y£ÚÔ¼ÄäȬ„¾ó´®m”þ¬©„p=¨,è¥)–u­›ýt¾JE}×Þìf8uíÍÝÝı6¯î4KÝŒæŸúxf_óqwt$ãüb9Œwç%ŠÑ÷8.7h}UZ_PËògÍGææÇµ›[´›1éL§'qǬù]‰”/–‰ÌÂ8Ηá:âÂÔ–æíÂ4†º»¶»¶ ñv16îÚŠ—> endobj 29 0 obj [ 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 0 600 600 600 600 600 600 0 600 ] endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /JHEUVA+CourierNewPS-BoldMT /FontDescriptor 28 0 R /Widths 29 0 R /FirstChar 97 /LastChar 121 /Encoding /MacRomanEncoding >> endobj 30 0 obj << /Length 31 0 R /Length1 30956 /Filter /FlateDecode >> stream xŒ} `Õÿ{oŽ™½fï3Én’Ýp¢å‘K  rƒÈ)‚g¨ˆ¨hëY+xTñ*ÄšRêQ¥ÐzU[•¶ hEiK© Ùüïí°íÿÿo–}ó͛ٙ7ï;Þ÷ýÞ÷B !ÒB$bM_0m‘ôw¹5oñïôåË÷/úÝrB胄¨½f-š½`ò;Ûë„(¿}åÊY¯¬ûSˆç#„4=2gæ´ÿÊN©'dþü¾ßTx8p½ù‹°_:gÁ²ŽçB—`ÿGØÿæÊ…Ó§5ÿñ¢„\¹û7.˜¶b‘ü²ã>B8°Ÿ¸jÚ‚™ï$^†ý*¾¿háÒeªËfbÿ"ì?ºhÉÌEg÷~Žý/ 1ºPGñᢒläRQÃx¥ø“ˆLA©ÄF4¢ ÚÈ¥=Oó68í"nbññ“ ŠÚ “‰’‰“RHŠp·$)&%ùߟٔ’I“2RN*H%É*Òƒô$Õ¤éMúRKú’~¤?@êÈ@2ˆÔ“s”]$‚oTyšDä4îDº>Ã÷ßfçváÇù–}Û´ç¿„l"/йäò ÙCáW›ÉNÒF^'!2„íäeò!u(Ǻžì:^U‘xž6òÚ!e;WeÐo z©ý>Ïõsò9@Kè/ØBÅ¡ôQ,åÚ®wÀñÞd"Zû4~ù)ý»Ÿ›¤Wåa]çúåÞÛäWäO4J«é:‰U°…ìQi ¤« ¿íMf¹èïqõi†î`¶_zB~N>©dv¹À‘4ù1ù ùuâIt)ý}þ… f—³³?K?’Ÿ‘g›†§¾Œ, w’çÈ¿¨— ãè¥t½ž®¦÷Їè>z€aç± l>ûZš#-–^–ÏÇg¼¼T¾Y¹M¹C=’œÝ›ýmö_]}ºn#ã «ÐúûÈ£x²d?ùŸOÈŸ©BíÔ…O‚&éDz>7Ò;éãt}†¶á.èŸéçôïôŸô$#ø¨,Æ’¬Ÿ¶„]Ã~Äaûñ9À¾dßJ!©XÊH}¥z©QZˆV­–Öã³]ú“•÷Ë]èç>ÊýÊe“òœ²G9¦:l?ЈöÖ©':+;?Î’ìšìýÙ­Ù¶®?Aó¸¾Å¡iõhý4|æß÷Câ6“·©}¥•ô\zzær:.¦+Г·Ð‡éOEÛFw£—Þ§_£ÍNmîÉú²óÙ|.c3Ùb¶žÝËÚØ{ì;É&Ù%·*¥áR“4SZ&­”î—Z¥·¤¤?K'¤SøtɆ\$Ëi9#—/—¯–•?“?S¦*o*‡UC] Þ¦¶«³õ³kkgk²ÝmÛa{Gk†tþ’l'/ž10^¥UÒPi;¹‹ÕÈööÈóåd†4ŠARÙ&º†Ý@ÛX©²BÄÑÑ䘜F_¿Ê6°l4ŠŽ¤ãÉ<Ö;wMÕ/? ª^þ%9*ïÆ³ýW^¡:èìkÕA¶RÂêpÏ_I½äŒô&ùPú„ÚäÇÈdƒ†èQö´4Rð²|®2™$¥GÈϤÅô² …¥=©­ƒ¦ÏÂ.L }è7R‘ØhHQé/äf2Ÿýž…¯!Ðòlr©¡×“ÏÈSЊ å*µR Ð7Ø\y-óÑ6Âägðtu´”JŠŸÜB›¤‡Õ¯Ùäj²_6ÈÇÒóhý~ö3i”|L¹˜ÎÜ@n#‹»V‘•Êdùwt6‘è$’’º]/õ‘“ØÞ«26m´{ìÀyÒ(Ô„!9A.&ÂB<ŒÏƒ°2$h.tüX±ß6uk'³…Õ!D~3{1™Òõy¨k6¹ªë^Òö`u×õ¸â&r˜ÜM6Ñ[³×‘E°þ@·/R†±ýʰ®l-û€g÷Ÿ¿èí “/ðùFÎU^"kå÷ÉxÒе®ë]Hw9,ìCä r!9„§ü w¸@ê 5ÙÑlK×0iž÷2®ëé®"j9]W’1d7ù©M!ÓlkðÄ çY çžS?h`Ý€þ}kkúôîUݳGU¦²¢¼,*-)N&Š â±h$ ü>¯Çt»œ»¡k6U‘%FIÕÐ’a͉Öts«œ.¹à‚|¿d*¦UÑÜš@Õ°ïŸÓšà¿›†Cß;Ó™³þíL+w¦uúLj&êI}ªÄÐ’Dë¾!%‰v:eÜdÐw)iL´ô(A¯´t2‰$††ç I´ÒæÄÐÖaËç¬Ú<¤GÝb7— žiô¨"[ ;H;¨ÖPÉ¢-4t. ¸…͉Gl– Ú)ÁOq)5tڌֱã&K&{TµÒÁÓK®h%%ç·º3â2XܦUÜj·IÌmÅÓ;[ª:Ö®k7ÉÍÇŒ’Ó¦Nn•¦áC[=ÜwHkèÚCá3»¸¸wðäÕgIk‡†ç&øÉk×®N´n7ù¬ßÆ’ü ¸~ËRÚ×í×S#Ç'p7vkãäVz+n™àOŸ*÷|3K†òšæy‰V½äü’9kç5ƒ5ѵ­äâ•ɭѨµ³ë ‰M¬0¹$ÙÚ+iœ6$¾ÅOÖ^¼r[ÄJD¾¤GÕÓ“ëØ-.wžp8Ï&f¢ÓsÇ%NçÔÈ‹O÷,å-*ÑjA¢¦'Ð’É%x¦¼˜9€¬> À_#ůZg€#s[õÁÍkͼH[•”Y’XûO (9úå÷k¦åkÔ”ùOÂr99-j­tZ7ݚɴVVr± OÑÆsÅ~ßUËÛYIÉ"3 ºŒEßNkXîO&9ƒïh·ÈØim79·Ÿ WĶ«:ÓØÊšù‘Žî#‰üHK÷‘Ó?o.$· '5Ъ¥Oÿs›AßÐ9[iðÿqxfîøÈñ%#ÇM™œº¶9/µ#'|o/wœw(ú ÇòT«oðd)ÆPÇ)“ÄQåÔ)§OÁÎdG«œÂ?UõŒv›©541¬Õl¾ W6Éd^gþ?jï:Æ%6g~–ŒÖ™|CsÍnô½ýï5ϱV9&‡œ0eíZã{Ç j¹VŽÈo ñdÂädbp+™ÍLá_{WÇþmŒµZè2™-Õ±üî÷NŒåÔˆ?.=ª†Áf®];¬$1lmóÚií]-W”$Ì’µ;Ù¶gí¢¡°v9ÁiïÚuG¬uغFôØ:êÁÈù\O˜œrÁ.Ý`Äa’¹ƒŠpEB¬r~£‡T[;{ÈòE>$Ã&¢$¢©Ê!&íÆÀ¯Ã ìIÂóD}gýhóxý¨ÎzÒÚ<…¢w¯¤'éI¡ öN%¤ŽS–BN’ù¹LÚÆ®A\¡Às¿z'o¶§j•ö®o¬âtE­]50ÔÈ”(ŠjÿJ×4IbĦÕn½Eg:zÑ 8ݵúÇT’뵜žZq,~:œAC2¼%fg¦ Í@ƒL|:ëQP·®Ž{÷¢™ŒOê[jD¹¾Ï¾õÞ×KÚFCÇŽe?Ï•Š2Ue¢i+@‰*_1"­JÐõ”Ñy*¿£y¢é(i8*®Þ»Wî²kzŠ‹yÿùÏìWèVJ®ÏŽcÍÊÛˆìαŒ27%¦×¦™f;­ÙF6¸4l-mƒë2"™RB’¤ç=?Y'.Ýyâ¨yׯo@—Ò&šfžÚþýúר6|&¥ŸÜ÷›QSv¯ZYvNI†f²ãvÓo¨ë«;Oh\{ÿK/g‹²‰ïݦå(gå&Ó “¯Î[`l(¶mdƒt™ zÒfšl"ˆoÚÜnAjs:ñ¥å6 6Ñí*r1×óÞ|3øû·vúJˆ§¶,OM€É:W¡Ï‹Ï)»vÕî)£ögÇуôO»wÞ¿vÊïNv~øUöïYMôÓ³ÙéÍˆÉ 2z»A|Nm§c­4•꣭'“°CÔ¶cà¯.„÷µR´Ñþ؃è¯ãMÇ™GÁk0„3þ¨Ù)Ó»W ¸íWmeýúõß±oì%}êúIûö-¾#=*2GíçÑv6-€ìWY‘El‘ÄFÑQ¸e aQeNˆÈ‹îäÒu¨Éü”T:Ú»YL›|}“óXmß¾ÍÇi»P¬Fû%’²ÂŒ7·>×ÈÍDÞˆãeÑÎMBfrÍÚµoß>þ[DÛ¬2"‘ñ;‰ÔõñVkïúØJøë(“6H›%&-'Ô³¡®ÐIéaGÀ»gp{yÛµèzóøQ3'/«•ž™¦̽\n2™­¡ô™õÙÉåËïø×Ù¦tBúÚ•[K÷˜Î°Ï§Nt¶woóxñ•¥›&¨B¿RØÞuÄ ñ ùѸ G N'Êvö’å`F(”(2=Œ%Š jÕïìãå>R}” I/÷ÂYŒma§oèðz™¸¡¥»= r÷9hÙ½>6±ÐÏëøµ·âÒ¸}›ÝÎ&‚øÒrq™üowËdr÷ãw7³ú R©/)¯¨/Ù^ÓÞˆÛF8\ó3\×z¯õÝîÝí==;u¼bÑÇbfÜ,0 MõçämðU4lõ®cV´Ð05Uýu<êÇ£Z< ®hѸä,4ÛÙ“ÛÆx¨§†·ó' ¢;Ü”9Œ¥¡·ÑÛV²¤–¾ÄV·1éËáÙÞ€€{!»‰Él+%Eôî-wÿNd8…1m8ÚÙtÈã ÕÁ¾„êV»zf\`)76Àø£¼ M´iIcc*L÷‡„÷ë×·6]R,Ľ¦pÆBµÉ¶SýY(õÄÃ_oz躰¦O^ø$ðÌ·èÊO_éøbþ‚ÕwfO|ðAöÄ=WÜ6έ·Ïš½fàˆõãWmzá7=-Å*œ·ñÃO6Îz ¢jïšÝ]„ÒŽ»A'̹åæË§¯¾åTרõcžjùÁ³›¸ýZDþ,âŒÑrÜ-µ(LRTIcÊKl *%6e+³Ô]t,|›±½Ÿ£Ï%dÕäzšÀϯ¶]2E(\ýÑÑæ ©ŽŽ:Š¿p£4B\Ã`ái€ÒÀ"éÍSY‰±U›èÃÛ€kýb[ÎÞ¯ -ìnêL%›Âxàù  ŠEy”\Ôç0¼×«$ª%ªäÛðiZP?ê(oÄiðˆò S}%zªKz“­ÊNÛFhý¶ì,Þ”(ðSlÄEgï .7Fp oËß`WyÍq«‘‹5×Ou¢"Êj³—9[›£7›k¤õæÊ«j‡yÌ´kJ#àűæ{«ùÇ?œÿpé²CvÊ. a¼"˧KSm6h 8Æ/î½¹¹Þ“„ÍáÇ!&A¡¾± IÐã„ìðãWz¡¢h…ª¤¶³E–N4Ç磌í¢v0Ûny 2Ó&]<pÝ'²´^¦r;¥–}¬£Ãö‰CZï ¾oºmûmì&[‹Ù~è~ï}1ö/Ž@†ñ/ F#æÑ£$ÜP=ÚpŽþññ0㹺gXl…p{êêV›{÷ºöî]­ä¶.G¶ÚÇl-D˜Ó&»%Ͷ \T®tÉbŒ¦ü¯#j‰””|I)]¦Ú$Vó[6ù£ç:üØôo +Ž×(»¾Fwg‡°)ôþ×Üyç• ‘ÈŸƒW ù•Ô·“ÈàÊp»](ËÃJ&•Ì*Yªß¢«s£W+‹ô¥ö›•›íjYP—Âe•…Á]÷y +++*H¼ =W„¡˜há´êà^›ÚÞõ©UÃ-¨êå–RUyß«¿:Hð\õsIP'¤ÒŽ8ÿ…Ãàç9¸døYŽhUAa‚r Iðãàê a¸ÁÏñ]›`sŽPyÍ1 ×Õ”4•kU®‹¸ ÑÆÎ¨£ÇsU™ü¸†#°ÖðÓëëª=Ü-§Bãh.QãIöáVE¶ÅÅJh²OnPK— ¢èÓÿ\†ôý,½éÍ¥³fßz÷%-¿X—ý!=gÕ€ GûÁ£Ù?З¥O8á¾uÙ”];g^öTMÙî–Ù[š{K{‚³FXXqr£Í1`þ°‹Wb£dV×gÊrø_äííÓÙ¼FsC•x¾#Öå¼w¤s:,ϲ‚rKÁzò°òœôSçN©Íùšó9TðË[à)(*ÕrOeÇ5ýfTæ®ÞÖò:ܳÃêQ^gº •c¾B‡+”u3í¾¤”ÒhQ(Ш†1Q¨E §£·yÌÓ4Š[1”ÜoÀHèáæ .wSÓbth†.¡!U.).EÇyKkúÈ!ú¯Xe¿—[i¹mÏ9Ù_>š}ÿÇ›éà=¤Uƒ^©ÙóÃgþ2uÁ§·=ñgÆz}òôªß¦·|³ÇÆ{Ï~}ÏKÙÏ×îæ2Í€êe dÚÞ;lU'Šè`-'Ÿ³ÐM44Z§E]ˆ•np!ÕâFŸ0KÑ¢ó¾A s¾é¾Â¾¼ roÇ¿½{ ^iõ“b6MÕMÖd5ކ™j7  †¤‚þ /(©1)”¤^аOÒ áIôc&S‰¿U´‰Ëh±7àgÐT²OÞï*ƒ\>J¿}nÊË–Ž¾öž}·f·Ðº{~Ú{訮ýBö-eW à¢+²û÷>Í>3­Ï ýzýü©OÿUY|¶Ï·ÙÉ}V@U 5Íf#’ÌÝÐ íD³qù(0½µ¶ Ò… #ádFÔ)ëÿsŸqÍý¾Â:]š!¡ŸMê•JKIÒb)Fp$x'Rª† ]|^ÒtYª#;ž¬¬™IPfîdæÇ`.ã¨ùPM1ÇøïÙ’–2ZVNÔ0y…IOÏóŠ<ÊlVO„æó0ªÛëÌà±°Ïm&¾<€H‘Kbñh<—TGÚLÒEi-h=v$IÐíKâd¿/aÃ^±’JÒ¸²í÷ (Ô“IR*¡€„ ç˜I¾C!ðv}SžïY`ÈÖ“Á„pÂï•aDú{¤‹Ø‚»³6þ>»¡mû‡ ”Þ›Þœ¼bÇÂ[÷\“°š²{n5{[¼Ì»‹m"NÚ{«’ ÛÛ2º‘°7Ù©}ÒEí8ÂÚ¤è±îE&î3éńҬ´(P¶i›‡€Ç!›êÃP}‡€ŽžÞ9Ô„¨ÝÀMl÷!§ˆNVß ‚lzž B^&Ž®“Á÷è½'b‘­(åP¸eüf‹Ëà‘ Ôï¾³#YçªJÖÄ{gGÿ:WŸþ‚ÜÞµ=Ðõü¯Q Y Ô¨±ˆCýúÓ$ÌR<bvüÒ^ÁH_ä5(/e'mÎNVvüû=Œý±tê»aò›'ûÊO&„®<]]Ñé [¼ðœ=ÕÂŽ ÀpŽXINi6 !¡Æl’¤é2cºM“¥„ªB…rVDÞt+9]‚±µ¢\Ø”¦„&ìcíÍöEö»b×àï@À:,'Œ÷ÿÇ.äí·,ìÓ÷ìw>`18˺MV¦‰®&ÂHÞK§-6& (åž0'‡-qŒöà‹O­–@nìÝ‹žàB›f «CèÛ±cXfõÉ‘}êlÅèì“#ymIçµ—ÔÙ\~|}|ÿøÈ‚Y2ÀÉo¶òä®(ÿÊ&ÖP>ŽPÏ#¯Il×k§²`Ù*ù&°«åd X}:ü›”wG#¿¶ÆFÝÔoúý±P,&˦췇ì1ù™Ð׫.) ÇX¢ÀòŒñ YÑÉÊdýs¢çrß”ÐåáIÑKbw„bf¤P’¼…v=NÀÁãÁ7v r£ˆcÂåñ…° Ž Äw ˜"[´¥€¸Óœ‹ªàQÎ|DâÝ‘M.´ÉùB°@Ix|óÁ#„7>“$ûÈÜ ñM“ÔôÁäCxC¦Ó5´ß›tØsmÙ¯ìÏîÚô:-xÿ4¶òó{~“}Ÿýš. ?Ù“ýé?ÉnÜþ:òó쿲ûi-m£öfçâ¹òíD>ÇV«j¦g¾Ÿ4Gú/5/õËvG!¬ …¹{N4oZ±´fòç€9=n ?O‹&¢ÿ¢ag‚þoÒÚíîþ§·9{0îÅhs±èÞ1y‡7ç]ÀiAJ!‚<–Lz°phNÄ'¬âÞQWÞÛøUöìzÝîG›.ê}Köve—Ë;sÇ‚—²ÏKtÝMSo8s²ƒ|;å+ÈòFèë¾ËÓÒ,î`ö8r’àyú‹ü%j¥Ò#”IRêCÓ)…F¤›”‰%“Ó •ë¤k•uÒ:å>äß=Iž“Þ%ï“áÃáh\ÉJe"7)÷†ïO¿›–SÁÊtm°.="<">´hhÉÈô$m²gb`J|JÁ¤¢K—ÏUf槯Kß¿+ý‡ðÓ{˜Ý|gk¬vák@¬NûÕÊ@EfR°\²•§ÃA…¨@k¢ ã;D)-,tKL+-´éÑ´/ÌÝu_·ì‚8"dÄ1!» r²Ë +Åe×w!‹&*[*Ye2 e~¦]ȯ=Rñïò;*¢ùzÞÕOù†ùFnLlj"0Îî%)¸Ø@–Ίڹ”£¶_^¼=\Öû§Ëä®^R÷èOžøÕkÙÝ›[éÐ7¸È_Õùé¦ÏAÒ?Èþ™Æþ8gê¥3Ò”Y]wÝ¥tê‡Ð»~‘ýé‡Û³ŸÜYÝô­ÛJfßÏâäìoÊE ûÁ¶:äÓSVÒkwQo¿ø”¢YÚ‚"@|p×Die)ìè21yÄý*‰ 9ÂÛÞõçmÞh-¶Ç¶—Õzø~AY­™ß“û8þûméÜqœ/ŽcË[#@¤\Æ/LŒ·O/ˆ/ÑW¸Vºo5Ö¸p>ãnwq}æ6áç$ç6îsOÅüÒ_{÷b«lº4]^*-“åTY_©.>Xa»¨`hÑÒaeã¥FÛÔ‚KÊo÷¹J8¼Í^ŽHuén¢¬›ÀÉàaîä“sNÎ8ù„5ŒŸTîL—²R©,ÕÏ][2$5´zJbRÉÄÔ•öyÎù®Yþ™á•ök׺o0¯.]šºMZk¿Ý¹Ö}§ykéÍ©{÷»ïæ'T{$ÓÞX:ª§+hšŠ¨WîÓ;$cFœ=VÆn±X*èìQX–¢)%踕Ãå {è……AIŒtÄøM¹pŸošÄÔDõÑÜ'fõH•ºœv% ´-†ä:äÖ©4UZŒ:@/±Q\‘M¼£ÏQd, ðBxW&MбHRZ„L3È­–¯¿¥‚[£ÅêiRA+øÀír±‰ Ž[N~¥Šh<MCC¿‡@ ûÞ€ÈÃÿÞ |”‹ô΃M£Aæ€É $ø Di""<Ä‹ã<$€ãé GŠ`2êôl¡¯!¿JËÄôŸâ’ã˜((‡fÌíezê‹ÎË_¿aá³ãÇN”½rÜÜÙ7þýGO|{›²ËýÂ3­Õ  Ln¹ö¶“?y-û‡èûæUw^rþÒ!Cg—„¦eú?1sá/fÌ}k•뎻V]:¦¦f~ù í˯޿t’ÿ¹¬öB¬º vÑFn·œ +D—ÔBZ#¦á–nA+¥/ª ʪùÔ¥Û)å{bÙE ­ñ±ûÖÄŸs¡ùÀ‚š¬ð“¿¢¶ã¡3jf†ñí<Ôô)7¹!_$Û !éa¾l¼6Sœ/¼ðÝ?rí} ~ÇQüäËH»'Ë“µ749È_þs­Ü@`mÏrî_Ð?Xé ’öTxÓá:ÒÏSçíA†{Fx‡‡'“K<“½—„͵ÝùŽ´jLdµJ­cˆ2Ä120A™à¸40C™á˜X¦,s\p+Ž[x‘Ýïf‚àçZHXкº˜U(É@T:ßʬ;]n·¹ÊÞ@0ì߆ ¾ux=|kM ô$”ø)%aEÓ a ö:t½0àéõ8Üî„éñ›¦Ç«;´p@q{L蚤HaÓí֑цä"öz=˜¼‹†BQó<Ž# â@Àׄñ¸ >剴Ó;¶äœƒ¦hdT'À„Îh¤3/PæL–«6JÍ^÷Ú'¥ÑXðÅïÆ”Ä{|úËìU/eß,³…üÙ7 « Ü÷×RéãÎhöËÜÑ&ý ÁlÓºÄÌá'Ÿv˜ëìÈm·*0&EhÐÎ*¼¾´¿4@ ptõõö÷^_›¬õòim·a 'Ul‘¢"¶Ð²ƒÖ•8 ó³$^\C¯±³´\a+·WºÒÞ~ò@m _ñm‚ܤMµOqMðΦ3åyÚ|û\×LïÕòµ÷ ®ñ^ã»M^k[kÜ'·k/z_•ßÐÞ—¯}àzÏû™|D;âúÔ[gò Ëãthyi×x eûf'ò„ÝA~3l Ù ?8b¹8eªXR»Ä`Iàr.xà›˜ÕyÖuÊ“ì% 6>¤Ý;©i:=^ŸÏN‰ÎœvÉá3ìT5™O7|¾Ñ‘ ¦KÌéL8$¿Ã!Á&!Ý’ùœð‰V ÈgÂä.L½_þbÂXot’ÑŽ¬·Ëóæ§Ý2Ô6Ëkî7%$5^n ñö$¹ùÉŒ>Î¥¶)|8r´éh!¸ƒÍy´¼\­|OH šº:·›Ëe½&ij{“Ó½ûà†æ¿ÛWn­n­=RG¹KŽÕÁ1ù!â6¾‘Ñ;buZq¬¼ïØçàX‡U¯óÁý•ðuº‚¡zŸ7:GCœP/É Á|lõDÀVì­³; ’çPR¬·œbœrøB¨ó…PÇ)ª»M¹íé&bþ7Ì%òñNÛÊn¥ÐYÿ¬ã3jŒ/é=˜–½ÝÙÉ2Dzw%{²ëÙ)öóìš«Æ^Boíuê[fïÑwla–rlç®#r\>«:ú³V•îÔ+#Îhe…³²@i l`åˆÊ&gSå<çÜÊæ^k·U<üqôg œ‡9|$‡û{$ =y¶|Gä¥ò½‘ýå¿ |T® R¤þ‡¸Â9ñÂìNé˵f"ß/ …3U•µur]Õù‚ªIZcf–67³Ü±Úñ†ã[ç·OÿZ•ÍêÒÚPŸ¤?|yÅ V¯v5¸îvmpu¹” ®Í®¯]’ ÖS$›~!¼{(,2x¢K¤b¹Tž¨årÅ¥P;{vGø>äâÙà0·¢ÂuZfô‰KöŠiæ4‚( ~V*‰áËîPáËÜ”F©Ì½Y8„‡ÄqÑ ¨ù#÷ÒÔ‰¥âFØÏùd¥íìRËUf‘´™N¤{¥7§•:ŽðB¼·ƒûÉéÞ¼Îr" «®£Žm¬£uˆ2[çñ+†RáâêÒWÔý*+RT¦bÀÁ•HiSÃ"®ðÃk8?Th.J13¨öp¡\Œ9þ Ê ü ¦ÓiÀ-3‡óˆáò,;‘3ˆ\8þ×´øèbìp…¡w®y=åy,dqJ…Ã̳¹0}Í?}‘¶+RÏ…Ã ÿ:øƒ¡’´¤Ú\’x²N’êg윷y÷ð¥ôÿálZ3tÍM+ ZÃW¸}ͳcM=T¼;ºbï©}Ìóxºàæ‰Ãž»uôªÑ~—3Zš2®êqNãâðâ;FZÓ.ì¹âØÉ[Ï@?*›å£ª/h¾tÌ9×À¾3rdšcË&) -Ö©âp—*}•¡ŠÒPÔZÄŠŠa??¾¨h}‘:ÐW¬^¼(Ú¤59'»›‚—EçiW:縯 ^í(úÀñaèÃÈŸ}_†¾Œü¥à`QWQ$¡T»«ý½”·¥\ä«ÌR>,ø§üé0.Ye$Ç eâ.{¸ô€šv øs‹]Îe1Ø…”ÚEþŒŸu3<9°H\NA.=¯±ª9GíË€Ô!~Dæ¤FJ1ÖA‰m¤­ô•‹Û5†")a@œ² ¸€Q!,T8áÔË…>%„…8U§¬ ¿5…D¡ôó[ÐHáðþßs¥¹\,á3Ë@¥„qà.Bø'rr¸¬p$Š,N–À¯FÄ0ÑD²_™„€ ¢Ë3¥=žn[²åŠÍ‹­ìß_Þ=ŸÕN¼gùó?½zùó˜ËüçÝcîþõÒì×Ù÷~BïeâûÞ<ðê>1~í:"…ÍŠÒ)yŸ»Öu“›ºí”OE.Â|§ìÛmḌ¢›ÆŸß&žß†(4pV”BÊ÷½óª–ͽM}ø—»æÃu-Šö ÷5ûšC?f?–v>i>uhΈ1Í•æ)W;9[œO9¶ë;ŒíGSOa’«ør÷B÷MnÉÌðg­•½Äüh3šµ¦1Oª·ÛŽP°»q4½Ô¥ñîvÇàß–Ú3EðáÁY‚E–àÏ‚+QÁ•ñ@é~-²5 ÍÅO²ü$›0±¶Þ±Ú½ùÈ|É€¦%ùõ; åž÷Ñ%Ç3G—ˆg‡Â{êªÍ¦Cø'"hp®i?Ðoàá^.ŸŽ–9ï¤ú-_ÿìÃì¿–|~û ,Ú¹iÊšgŸ¼eÞ]ôÖЋûi5ž§lÕæÇbó¯üåÛïíù×ÉaàÙ'ÐIä®Ñ‰Ö““)g­sˆSéëï¿„M0.öÏf3”™úts¼£èå]ßG‘þÃþ¯Cº,*ÊD¹ÂŽŒríEA©³gp ëëɆ:‡ùGÄ/1&9g;«Ÿ¿£Ç]& H.;R¢bRJöp %);eš<ÔôXžfO‹ÊÉe"§¢/×@Œ¸¸¡õ¨\‚çŽg™·ôd~bë²ÉœEcl’­Pˆœ°Õ¶B>ºØ„úq±äsœ·¶HaíØ³t­iñ¨£§õ‹k˜X–Pô”£ðÞð=£i|N.Ù—Ûcäàuôì¤Ú3÷ÞôîÕóÞ¹¹ùþêm‰ç¯^þÓM×­xì¶G×|b•ÖŽ;¹;à}ë׿xõ÷örž„-„žÀ³ñV¨ˆÄ˜œkRšô‰ö™Ò|e¡>Ó®!Üá«ÓR¬J—íªújççÙ¯©ÿïbû©#ÆÖ[§¯ëüs ˜tûõÏÐI¡'Úh̽ƒ–g?Î~k&6ïšCï»m𜧄ô‰-ÀFCÔiúuêŽTGzE°L%òcÇ#ÎgœZÔYîltDäï‘òhQmæ”î¸A,ã÷É’JŒ ~êïòYr(%#5ú^&Þ½Ôò­•‰Õ®'4bqE‰XN( ñ ¬ªœ×b®:¤JøSBu¸&~®@ø=÷Ôñ)sA|÷"ïfòD8²›î"Ir«ˆ äF 4P>¿z®?ðˆ£0'Žy«†£ˆXEB“ßô¨ºMÕà'™ð‰GuǰéHXJMY‚éξ5}± – †£€š@‰gë† ¾èÍË/šÐçâ!û÷K¯[<¿vØ%ÞŸÚ¯Xwjtâüì8é èD!2pZÍv»â¯²§üÙ‡úU½ RPeOû«JêìýüÚ‡ù'Ù&ÛçØ¿3þpõ,©*;·äܲ‹ÊÖWm¬²õKö«h¨f–Z1!9¡b®mzrzEsUKÕ‡eG’_•|]æ Õ@;ÛÒV÷ÙÄXb&!ò‘¤…t€ÛÙ V%wC‹ã#¨IÕ©pø@ˆš!+Ôj ÉUËØÄ*‘A†Mø•°…„a A¦ÅÒ˜/r†ŸŸ³Û°8e]ÈÕ*´ÌMS¤¸¨ô÷~÷'î.·\änpÁP'tÆ +†eXR`|naÝx=KD2UË’ÜÀ!¬Ëq’8,Zù7×yè_…ÕÁ¾P¦l‡xÚ¤p#ùÜOHå ì ØŽëQúì5³6Ûû ^vÚ°‹.oýñ«~{çîkŸšù‡?ÿâ¡§n¸~Ó ×®Ø49:.ÕgÆ”þ­wÐú¤t݃-§æ}³ÅsRåo;^yë—¯þ’cM«‘xÍó*ýtÚN„àBµ˜ ?ÈW©Sr_¼ a—SUC‘Ú†ÐÜ/tǛɡ)ݪéWÛ¥ÓÑÃlb& )¬å¢ôsA@ù¥åá‡Tyt¢ŽôQ‹ì!®*:T %b{ I°bÿò‚@Œ l¨¶_mkðX- n ¶»‚rùS¹„m8†çRt^ˆ åûN˜TNX!¡¥9× kÐÐî´‡ïr>!aB-ëC9G†ƒ§ã ŒLù܇Lž±Ýì)Û9—CKB;]x9NÊ¥:bÔ©A/ OGXE Ô¹¤6p`<JÄ:$5àYÝvcÇòŸl»zþØ;ëáþýÞ¦'鼜=¶úºñwÝÐùtr …CðûldŸu™Þ?Á}½¾QoÕ;ôOôcºèEú"¬ݯ:¨wéF‘/ˆ‰^]•nD¢Ê†jKaéy£Ü*wÈeµC>&3"'äؓ圿Ì&‚È÷Ö&€e2Ò‚P ˆc9Ë"‡Çƒ8…¼ ðJ­ý{ï!ÅMàñùµ <àâÃÄ’Å_jŠ‘|M[[›ü×ýûOäôÉaÖ»ÇJÈ♽ä]k¨¬¤”Ar ^ ¢„4E±ÉXO¢øuÚ Ù£Ømü íª-îq¯‡E2ãp8S†±ÞN‹ì ö1v ‘ÆwV. ù´3,ØEdi‡ÿ‚KPjü9ìB·íŸÿ…$ ÓZ-<žy:Úä0ãbÒ0ŠÇxªÜ´µ(…¯6µ\NµK3ÝiÍ4bTwÙbH%åÁ—HÖh®ï™·AÅokËÎ)îWÔ¿_[ÍyŒ?ÿío¿½î!׈{å©'7î5ƒë+dAúýbgÓ¬áW©“Ô)ºävþC9¡"5Œ«0±ÜÄ2°êåÊPå#–˜˜ž(]c0¯šð%kòÛæ-«ÅYÇÚ°õbÎ IQaÝ‚U–Yí¯+ÔÆdãéjãCé/ªí)•–¨i[J«Sè Î1ÎF¹QlkÔoW*鯪¿“ßS©ŸÛþ¥~«¼†K™!=h/vù¦l*R T ›Št4ÀÀÊ|B@V8 m·«]Ü–ÔpÞ(ÅÀúÝV2!âØ¢ëáÙS„¥/Ú€÷r0è~Öê-t ­'B’ ‚Dèº(ð ®÷‡óOÉá³Îæ5œÒQ|^ÎÏ žbƒ˜â4:3̘'ùD™¯@´íZ½$ÊÚb¤3 O4—‰S[ƒ|óñV“ŸÎ7bÏ!6[ìùl¨F¯ñ[y?’©æân~½(ð«[ÃüÇ_n‰åNGÚ[É DI¸@âÁÙ ¡ôÙϳóè+g» ônÚš]Þ9ƒ]›½”ËåÍ(ú }ýËE(HPǶþrI¶µ}sÛ^½sÛÜšö+…áÆD¹ Ê'Š<Å1E*R!m°KÁ*w¾ª9gàù•ÀN,o‡g³ÐšìlkÏ£|p˜ë¸ò@BŽ×9 ëÊÁån“¢K8Ñ ò¶‹Œ–¿o»Àª%ðÆ„ùâ&‹ïñ?ž¢{s›HÑųc UÓð™Jèk<Í0— ÊP©ß[£ìÎÚ”|H>¤ÿ)t8¡¼«œH°–(Ññ@å’¸à.…ª%X¡eHÑõ©)–‚s¥Öc­ÌÏ#’qЬãbíñsÓŒ}¬>ææÙøP{„ƒ[ˆ1Çr¹R<~ËÇ1´Ér„Sëc4&.;}¹˜¸ö¿²<ür11JÆDèÚlnpŽáQ'b?‡ÿÅÚq½ a5%)z€@÷6VD¸þI¼¯óÜ8[ÿ„Å%A¡ü*y¶·üÂIÃþ‰”¦ÚéŠmÿn9_°ãÐéÕ 0Êg?ìt $ø wžáA %†ºòÉ€îSZi¿Ã£^g { Î/ào€{ϘŸA‘®…}öÀýXŸ§æ- èÆ_?úì¶’©ç.úQÛä­(§ï}ù“wmÞÑYÆ~rååï{²ó¶uÅŠ±ßÓù×îs} y Ò,Ÿ"©>¶Él7ÿ"}æ;&ð©KYõ˜•&}Ð<>î Ë Íïò½ð¹¨tN—ÃU~VXø\vámÙ…·….ïmÙÅÐm/æÌ@›ð¶ìÂÛÂþ·9†Ú…·…ýXeȇ>áÐÙiR·Fcb ¸ç>f‹ÂíᎰƪ¾@Pèæ ,ˆÏiÞ<ÛáÊ©à‡ ®9Ô0çpåp>~ ï¿;p£CX¶uV²´Aj¾W e̽Ö\>ê9í…Unh† ë–Ì4ðuÞ<“ù² ˜SÌ3p.s X®`lŽÅ«¿ú£æÇÆšF[åü –>-§Ø7t.e·]µà¼{ßê̯íü  |t’¿#ü©o|Ö€ÈÈ:b-åTDðÚŒˆc¸z6ImÔf«s5­ÖèìjŽôŽ  OU¦ê›MÞ¦àÅáÊ}†¹À» 8#| èªâ¼TÂd®q©ãJi¦2Ó¸Òa„â²Í£á/‰è'&Á&¦Ïxlj€N äã:W8>&Ú'Î Ap¶ƒè°|¥©Ú^X³j3m À:½?•àõ#8œÚUJ.øŠU”Dà@€òz+, òË —ä‘ÞQ+€­Âˆòâ(@…&¼ôát_sY¬óá—>^¯_¡\¡Ë|tâ'úÌþ`æÿ¼pvX4äÉÛõ¼î¯w|’=ºsëêÛ¶n»uõV¼à¬ì®åÙ?uîûëh!u¾õæ[¿ýÕ›¿Xúêì\9 zñ¶‡+¬»fós¤)7$Z¬(Qá()èèSp~Á¢Äú„6040vaèÂX£v©cjhjlž6ß1×\šëH¼íÿ(üQôíÂCþC…]‰`‰œ13¾ò@Y$æó°ý¯YÓîq⺄N\‘Ò5 Ëh6Z 9!˜˜ …ïö©eç¬4+±Ïm¹È9½Úà¸@pèˆU»ÛXF}5¬Æ›"ä¿#çÝ€¹°ÈyÀ\ƧóÂ" l=˜‹Ü+˜I30§g'ŸäŒ1ó‡ËÁH®“ÜÞv£å¾nÊE¬Œµe,‡?—¯~rà½sÖ˜wõ'×M¹»§ç©å+ž{zÙÒ-Ù¹ÊËkÇ[×õàÙ“w\4°ó¤ôä¾½o¾ûæ¯ßç8ÞÙ¹ÒAðÐ$qÚϺËÎ2¬2<ˆd+jC !22²¾pc¡Rë«5ñ ‰öŽM÷M5¶¾£¾ëýTýÜñEج`ÅŽ ²Éû:F°aŽ)l.ûÀñ‡ð_‚ŸG>bn*;ýQà¬.Õ\ޏB®ÂQV75Ý–»ÙÝâ– Q(¸ç`Ì@eu 0Â-ÀÔb0å¬tùèÇ…ðEÄé Â~,óü'ÊZÊ£©(a*f¨¹-RPø}â¿ ¬Çy(öoŒÁ[p¶ùƒµ|k™.¼ÂŠöœZpe+ˆlðŽø„´(øR1 ÜLúøP&Ç{Ú‹ÑY±|áÚ>üçÕ·~.‡áBcP&ø/# þ«ˆ #ùŽ`2{«­´?ݯ;PIA}*l.ˆ\Ö³ x?€øbWÕʨ¸U8|sŸŽ>¬¡OKÖ‡#ø¥DÜ“ˆp›$r½Ì& ‚7€V„7"QêFØ-šçN‘3h"¬„X–‡‹?éo#½ó0=½;‰âlb\]2:?žÉ,>ëüXœÔpt±˜ç1 O6å8Çø—Ÿ ÇÒY«¬Ga à´Çôš>SR‹‰ÑËm1ªô@QèÇnÒU#Å%N‡Vˆ£¼L7ÔŒ#Ef÷·ø‹—êsD3•™U«‡uÿ5!ßIý¾þbj€O±—á]°µ˜IÏ9fg’Xòõ mØê¾ýºëWôMýðՇƜ7 òžñ7¼<ÅÓêX:÷úyÁ`uì–W˜4÷Õö@ωÏ_2sÈ9%áTŸ«F_Y^”¹àºÙá‹§^Ü¿$^à3Jkλ~ê” —<ÏíUi×ßY¥òÞåƒuµd°$ÍñÌ¥€h‰Ks8 *‘ ‰·å¾%»Û,Æ"§7å ]6m¨>´Ù¶ïÞXo“ ü§¶V[‡íÞHÆÁfÀà¶ þ.R$PÃã2Qó4Ôpè2ç™ññ”°]8ó-m»ØZªù‚ê Ú1¿âA7‘š`*âaETÄ,!­„¼Ülϧž„D´"à{§„ü¼°ŸG…C"ðÄþ žr­Nì ÑŽ Æk€ ð%z,ÊE7F[£]Q9 hšÐ0P=¡ÐêÈF)ÎyT‘JuκˆQ×GG¾ `À8úŸÁÆÞïXÉ,ÆGeÓåt;y>%±Ù#NÍ“ƒñ΄\šV~~³ Ìâ ! A©áúw/{bŒio³{®7î®Am´]°`LߥìÞÎmwö>nüÝkX‡MÁ0I:þô‹|î@Hш¡©T=®[ÊP©ÎœµË´Ø‹}JŠ=u·ðNOŽ€³Vã’\¿Ø†-L²ØâŒß[za²–”£ÀÞK¦C‚(°÷¡ucyO¬GávTr=mÔ‘¾Æd¸1 ïÎiÔ&ë³è,6W›«¯ H'd+µú5ÆjºšÝ&Ýn[£­ÕBÔï1ž'/“m[Œ7ȯŒɻƗä/ÆIrܨÂãa4ÊIÚèoŒ!^¾cyƒµ ‚ÚÚ<ò¦ãyø£´é¸åæŒ4ˆMyê2¯N-ObµLQv˜Àê2ÈhÆw_f_†TŸNjîoLé†_× LkÙ®,ᶈÔUÕfèH¯Uªñ>žbͲ¬Ü{il»P +ÔiÌÒÌ¢Åö/~ǵ a;‘ú =ÄW1@]ëN#Œ/žIMlÓ)ò“º (2•Dn±H%E)ýYöÊŸJ!çìËÙ«ätç-³NXÎÖñ€|¨È }òá• º×p{¹‡*,P.-L”è°wÚ0K]‘Ï)O‚—8€Ü.˜2ÀðÊ)%ö D‰o= ªýátÀha­“«Ö ÙTG U9cçArʾ}æ{ûÌwðR:ž€,2ÅóñGãcE Zè§•r…Á.ô\ê¹Ë#y0,Š%ÖE‹ä`[Ç,½(YkƱf ú}Ìz±¨´VVºOé¯"Yµcí¹æ5‰OòÛâZÌ^€X6e«Ô2.¼úß6Pä" W-Û(m¤}°{¸çBï¥î‹½óm3´ÙÞ•êµ¶eÚNu—{‡÷ŸêI½Üî)'åÎ2W¹»Ì[í@ú{¯ÑnÓ”p½žðÀÀˆå‘QÇ›šÂðmð«YSø¿g…çõ?ºäH ·!÷–yZ8ÿŽl-?¹ i ¶¯E¤øºº´‘^îrlŠ7Š#[kÇc)ºÖu`‹­ªG¶&‘.^#Òŵ®ƒ[l‰\­µü5[;ù…vÀĵa¯lµõâWÜJ°]¹;¾¸¸ÿ]Hü΃ôm#!'ø»Eƹ˜=paå»·ŽTá ßâã°#W8ģ䞙XýγÓEVº/$RÓ¥2‰ŽÌ¾´ë™¹æ™úž³cs¶í¥g*Þ‡‰ùñ!ϯÙU¾¹Í:ù!»~û©ýb,rc,úlIÿ˜‹njWe¦#uÁ ™t ¿Ü] pÀßÌ{Ñí¥n$(ó9 kl¤nŠû~ù~ ¯†rw(j‡íM·î¶‚uQɧœQ³/h_Eï²kÕÞKäF[£}²ëú ñ ýEÖîxÝþk×[æ‡Ò»úo0ÞnõBö¸×ã;á^à>Èç”[dã5®* ð¿eÏRU)—?®b än¬¤D¹Ûí4Og›†Š· æ«äU™©Óùã¯bf*uv ¹Šx)äÆ/õŽpÞè(6ÜÓTýF ©ã±-u¬Ú"^7Ør%¤YñØížëEÀÚt<7``¼0ã]˜âgg‹ãÕ¦ùƒ¿âT¤‹#Y\$ŠïÍ•ØpáÅ,Æ> Õæ ÔþErxA£8T'áË÷1Ñ„¦X¯@~w²NG8þ×( Tê¦Fž® ï¼_ÿþ|®H*£nzKö¡?=Ñ3^•Úö~özÇGÌ~ÎÊiöÛá½Î¯9™utþ†^ؘmÂs%‘oòd$Jÿ•—‘ÃïÆú¸½ª]õY^d_XŽD^V"Õ™èGÑð>L’ðÖa½ 8ÛÜq ûô±µ ^WîŸäÞlH–ÓCå½jM^à•|Þ 3ì-³—9Êœýýœ}]yìåÞrßÁFo£¯10×;×77°R]î\é¹ÖmàVçZÏ:ï:ßíþMöÝæKž]þ/ŒÏüÿtvšßú»â…ÝôÙã1Ù=Ä} ÒE"§›/Úó’³¶xÿ%VÒ`ñ‹ÞCÄï󥼆;nÌaÊn 6°ÌÆá°«üùIÜŒ³êø+qog ÛÝè ËßÎ&Xö¯åe—{_Á»9Úéù;Ü´˜ Á4NÈõ^ÃÔË1Æ!ut‰µ ço«F&®ÑK\ÓˆÎëäï„ñ׆Íã‡"xïâ£Q,‚^Åð!·þ gF;{‚“‹Œ_|0²Õ{†½y oâ8Bì]G¸ùÊ‹ÕNâïúïÙ0Šñ® hÙöÔæÏBzxŠ5’"š}eÿ9Öù1pcàE P¹É?¨ªþ‚'­Ø³ ö|”).Êü¥-{åy¥½®ŸT›ýŒY^›ï.Ë;ºzÕõËÙü“¯o>¿q<÷ƒËa{Þ\¹èfËémgohÌKûxC|¦û7–‚ž Ï{{¬ AT°r½ÚDVº1‚côús*À&hSô±æ•t:›ðå:ºL»N¿ƒÞŠÅlßÒã,ÑÒ´BËèuÚOµ÷©kË‹f –ÁÀ yÇ*A8ÍêÃLwŠ2,b”¿’MS2xDcš“`¿Üc#ÿ>ýù¶æ¹=ŸŸ .›…½M6bæêܯú¾D9 DÞ¸È7ÆÝ%N6I¶ äueoåu‘CyçÈ#ÀQØÇ’¦&òM¤Ž2à2$/ }þpŽBw#ý3ؽà¯ÌÙó~Ä ê"”Y 4yõ?-ü@8§Û°Þ{‘ïG¹øž€½혠­€ À~ƒ(Xw‘gå: !æÐq:‰Ø2ÅÆnãaãÕ¼—MšÙiþR£h–6Ëù|_þ“…‹ o=[\lUl¾’—|lß5¯q~÷‚«emå í ?^t¾b§ã[•Êqç~Pµ¹–TV]¯¾Xs¤Vuÿ}ñSKº–>â9²ìWË/¯ø½>6ć2 jUîîÛA¦ ý\„Øb¤ÅèÙsãeœ-¤;ÒÚóÀ×=Áo?¶iëºNÉ)»XÌu›ÅŸ5ç“RHfcŠ- ¸e…ç1¿%ìG “"È´’6Ä­ZK¢ˆ’µŽÜ‡ÿ{w .ÒzD”éDĪ.Ä´é&1Dûz±p"$Ùi VÊÈ  „CÖí@0Œ&bÍy¶Aï&€€‰ e©ƒw2PÏI•Þ²Õ+“›ôdïC2™~ ¦ëu÷ë:|¯NkÖi_[¥»W„t½x™®íµ^ •§ó‹¼“A<³L.Œl‡¤ì5bÅS²œ3, €á1ZÝ0ØÓ5nïè„ÁH(æd§ˆºÅ³“š**ñóY–Í`ì8»Î>ÑsØ'éâïhp-û€œ&ûŸ÷Ùûd7»†¶AúQ`¸Ì&v Ÿ÷ð¹Ê®+{—Ô~ &€ÀÌÞ…´±wÄf#¥°ýcï@ÚØ|­+VvÖev9;Éþ˜jhòž‘†§>gðÚœQV‘3ì¥Þ ûCêæRža¦U?\ÉÞ" Û*¤ P Ø˜`]‚u‰hÀc@Àõ9¤ PÙ4p¸„Ù.‘Ð(ìb ÍdØ…”;ă¥Qu·,9{“‰sœg¯Ký;ö[©ß€F`<6Í^O99  Ÿ Œ Ú]ü<öjºÆÎ³Á6Nâõ€hú€ÀÄ&XUêanG%gÉ4޶œ¥ÈGRÿ‚WH` ¸ïÁ6¦ án¾ĨŠiqîC?ER÷ƒ°„p?ù<,!ÜßÝK÷Ö°„p?¼–îž>XB¸Û;aAdØÑ_×,æ íS5heÃè¥aôÒ0ziL‹¹‰cg/¦êêÐc‡ž¥u\§Ú+T[OµãT¤Ú.ªí¡Újªm¤š‡jª9© ÚYÚˆ®Ðhàå/$›åT›¦ÚKT‹SÍMµZªÕPM¥ s¥îÅŽ‘*ûs¥ïöy­XGzÔ…ÍÚ…Ý~ò•©Hj•N^èº*]ç×Ó+š½Û‚ml §0 Sä=ÀˆšÂf4…J¦PÒô“À L`Wá{ŒHi…¬ü@°˜Lruf°*Œlƒ«xZ®X=¤h)6…1çb.L¶ê°ylm†œw;i»3ëd ¤´‡W{‰‚ ÿ‹Æ>+ú×gEÄ´°làrvÓõHêf%ÏÐRî³<¸€þ„8ñ´§MÄMk¡I\¦ï$EøW;íM9ºPÌšr/ãã´X”ã7æá æ_gùÛjÆHSüOðœão9öñ7ê3 <¯¸1@Š«’zÆÑÈ_š–Ô=È8œâ»„ã?p´òÇ2cPÏØG*`åëÝ=¼ õ…›y Ž:Ǹ߱‘¯ÖYwŠ2c|%VÁ£›uXÙ¥ÙhµSVø† f‰Zf>dîÆ[3w™½æef—™›+ÍæùŠ]±)ÅJ¡’¯(¸UlÄŒD™/žÅöˆß¼ù&›PâÇó§KÛ†# •?xâ¸F¼îJó QÝÂëé“$ºYMüsCu†æßߓȫÑ„=J¢¡D£'š1g×'<Ñ„¹ãÁî$¥bð&Ø3Šø;š®½":^©¢%{÷W½dïþXŒ”—îô—ûí¾’¦5áÛˆ~éì‹sÇÜ‚³Ð¹¥ÜS™8ÝÐ8YKx…‘­Ä­‰ðYgÒðF$|†~*T¬ûŒÁGÿY/ü_8‹fh—ä•~ ¶(ð'Q¨ŠSçÖyµ(^PàY,¤Vòj-É3RÁKÆk"ád 8e*‰KN¼LýoÎt-8µà”jdZr¦K5ÁIød5(NP(â$JŠƒ.’¹æII©ÏQöÍQöÉ– úÚHލ¦èÚ,§è8sÝøÿŒÁ®ÏÓ-±ÞBõWGþÄs;-Oh›U59ˆæîß<ð¨Ð›±êÁpb :¬&[d¹/e÷Šì–êp’ôF:»“½Ápª%Щގ¥[;V5|¡­}sm­ê¸M[¢2Ì$¤&[e¹/µÕ ²[E[ ¢­ÑVk U¶Eä6ÞÑTH(†+©Ó¬ Ûk…+*µm÷É·ÅU¾«b'$'HB‚"ˆ\ ¶ëåÁåA‘…}JdÃmÍe•ïjqUŒÓ¹,Ü%Õ!âÚßAÊ#…õ¿8¸†vˆÁÐ¥Gøn»€A¨¸p|ˆ`Zˆ:\;ûqíœ4›áíÇàkžõDp-©;WÀÙ,ˆÃQøV ŸÅ’#~ukë·¼ÓØÙ4 8é‰Ç g´“áPÐÙƒn@œ±qœ.‰‰8°Šãe¢ølmâ{èS)â‚_9>‹¡9+×C9- Š"ñÙÊ#z‰üŸlS endstream endobj 31 0 obj 21848 endobj 32 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 723 /Descent -212 /Flags 32 /FontBBox [-665 -325 2028 1006] /FontName /XEGZWL+ArialMT /ItalicAngle 0 /StemV 0 /Leading 33 /MaxWidth 2000 /XHeight 525 /FontFile2 30 0 R >> endobj 33 0 obj [ 278 0 355 0 0 0 0 191 333 333 0 0 278 333 278 278 0 0 556 0 0 0 0 0 556 0 0 0 584 0 584 0 0 667 667 722 722 667 611 778 722 278 0 0 556 833 722 778 667 778 722 667 611 722 667 944 667 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 ] endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XEGZWL+ArialMT /FontDescriptor 32 0 R /Widths 33 0 R /FirstChar 32 /LastChar 122 /Encoding /MacRomanEncoding >> endobj 1 0 obj << /Title () /Author (Lukas Zeller) /Creator (Apple Numbers 1.0.2) /Producer (Mac OS X 10.5.4 Quartz PDFContext) /CreationDate (D:20080827130750Z00'00') /ModDate (D:20080827130750Z00'00') >> endobj xref 0 34 0000000000 65535 f 0000180451 00000 n 0000009579 00000 n 0000126627 00000 n 0000000022 00000 n 0000009559 00000 n 0000009693 00000 n 0000123815 00000 n 0000122864 00000 n 0000141523 00000 n 0000180278 00000 n 0000157573 00000 n 0000009879 00000 n 0000122013 00000 n 0000126590 00000 n 0000122036 00000 n 0000122844 00000 n 0000122900 00000 n 0000123795 00000 n 0000123851 00000 n 0000126569 00000 n 0000126711 00000 n 0000126761 00000 n 0000140985 00000 n 0000141007 00000 n 0000141247 00000 n 0000141700 00000 n 0000157204 00000 n 0000157226 00000 n 0000157459 00000 n 0000157758 00000 n 0000179697 00000 n 0000179719 00000 n 0000179954 00000 n trailer << /Size 34 /Root 21 0 R /Info 1 0 R /ID [ <4cf718985bb264c6d382c471b1a1ca6e> <4cf718985bb264c6d382c471b1a1ca6e> ] >> startxref 180657 %%EOF syncevolution-1.5/src/synthesis/doc/engine_settings_keys.rtf0000755000373300037200000001751112424517753026240 0ustar00nightlyallusers00000000000000{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf430 {\fonttbl\f0\fswiss\fcharset0 ArialMT;\f1\froman\fcharset0 TimesNewRomanPSMT;} {\colortbl;\red255\green255\blue255;} {\info {\author Lukas Zeller} {\*\company Sherwood Forest}}\paperw11905\paperh16837\margl1417\margr1417\margb1134\margt1417\vieww19240\viewh20720\viewkind0 \deftab720 \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \f0\b\fs20 \cf0 /engineinfo general info about engine (read-only)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 version - SySync full version string\ platform - name of the platform\ \ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 /configvars configuration variables (volatile)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 platformname - name of the current platform\ platformvers - version string of the current platform\ globcfg_path - global system-wide config path (such as C:\\Windows or /etc)\ loccfg_path - local config path (such as exedir or user's dir)\ defout_path - default path to writable directory to write logs and other output by default\ temp_path - path where we can write temp files\ exedir_path - path to directory where executable resides\ userdir_path - path to the user's home directory for user-visible documents and files\ appdata_path - path to the user's preference directory for this application\ prefs_path - path to directory where all application prefs reside (not just mine)\ device_uri - URI of the device (as from getDeviceInfo)\ device_name - Name of the device (as from getDeviceInfo)\ user_name - name of the currently logged-in user\ conferrpath -for Synthesis SyncML engine library only: path of the file to output configuration parsing error messages. Can be set to "console" to di-rect the error messages to the standard output (note that a usable standard output might not exist for certain platforms).\ \pard\tx2414\tx2414\pardeftab720\li2556\fi-2556\ri0 \cf0 xxxx - user-defined variables (can also set to override default value of one of the above)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \cf0 \ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 /licensing license (volatile, text/code must be set every time app ist started)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 licensetext - license text\ licensecode - Writeonly: license code (setting it will recalculate all the following status variables)\ regStatus - Readonly: TSyError status code of currently set license\ regOK - Readonly: if true, license is ok\ productCode - Readonly: product code from license\ productFlags - Readonly: product flags from license\ quantity - Readonly: licensed quantity\ licenseType - Readonly: license type\ daysleft - Readonly: number of days left of expiring license or demo mode (-1 = not expiring)\ \ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 /profiles Client settings profiles (persistent)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 settingsstatus - TSyError status of the settings. MUST BE CALLED AT LEAST ONCE before opening subkeys\ overwrite - (volatile) boolean flag. In case opening settings would cause deleting incompatible settings, this is done only if overwrite is set to true.\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 / Profile ID (as assigned by engine when profile is created)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 profileName - display name of the profile\ protocol - transport protocol: 0=included in URI, 1=http, 2=https, 3=wsp, 4=obex_irda, 5=obex_bt, 6=obex_tcp\ serverURI - SyncML Server URI\ URIpath - Path element appended to SyncML Server URI (e.g. in case URI is hardcoded)\ serverUser - SyncML Server user\ serverPassword - SyncML Server password (stored in disguised form)\ transportUser - user for login at the transport level (e.g. HTTP auth)\ transportPassword - password for transport level login (stored in disguised form)\ socksHost - SOCKS proxy address\ proxyHost - HTTP proxy address\ proxyUser - user for login at the proxy\ proxyPassword - password for proxy login (stored in disguised form)\ encoding - SyncML encoding (1=WBXML, 2=XML - note that not some client builds only support WBXML)\ syncmlvers - SyncML version to use to start session (0=automatic, 1=1.0, 2=1.1, 3=1.2)\ useProxy - If set to true, this indicates that configured proxy server(s) should be used\ useConnectionProxy - if set to true, this indicates that OS-defined, connection specific proxies should be used\ timedSyncMobile - Number of minutes for mobile timed autosync (0=none)\ timedSyncCradled - Number of minutes for cradled timed autosync (0=none)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 \ /autosynclevels\ / Autosync level ID, 0..2, 0=first priority, 2=least priority\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 mode - Autosync mode for this level (0=IPP, 1=timed, 2=off, 3=server alerted)\ startDayTime - minute of the day when autosync starts in this level\ endDayTime - minute of the day when autosync ends in this level\ weekdayMask - weekdays where autosync is enabled in this level (Bit 0=Sun, 1=Mon .. 6=Sat\ chargeLevel - percentage of battery charge needed to enable autosync (0..100, 100=with AC supply only)\ memLevel - percentage of memory free needed to enable autosync (0..100)\ flags - flags reserved for future use\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 \ /targets Targets (databases available for sync in this profile)\ Target ID is the as defined in the config\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 enabled - if set to true, this datastore will be included in next sync\ forceslow - if set to true, next sync will be a slow sync\ syncmode - sync mode: 0=twoway, 1=from server only, 2=from client only\ limit1 - sync range limit (such as number of days in the past, depends on datastore)\ limit2 - sync range limit (such as number of days in the future, depends on datastore)\ extras - flags for sync range limist (depends on datastore)\ localpath - local database path (if any), to differentiate multiple instances of the same database type\ remotepath - remote (server) database path\ localcontainer - local container name, if any (usage depends on datastore implementation)\ dbname - Readonly: name of the related (in the XML config)\ lastSync - Readonly: time of last successful sync\ lastToRemoteSync - Readonly: time of last sync that sent data to the remote party (server)\ resumeAlertCode - Read: if != 0, next sync will be a resume. Write: set to 0 to prevent resume. DO NOT WRITE OTHER VALUES THAN 0.\ \pard\tx2414\tx2414\pardeftab720\li2556\fi-2556\ri0 \cf0 dispName - Readonly: the datastore's display name as configured with (if none configured, this returns same as "dbname")\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 \ Session key unnamed implicit per-session key obtained by OpenSessionKey()\ \ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 connectURI - URI to use to connect to SyncML server. Note that this might be different from the original Server URI in profile's "serverURI" as the SyncML server might request sending requests to another URI during a sync session.\ contenttype - content type string to use for the HTTP "Content-Type:" header.\ \ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b \cf0 /sessionvars Session context script variables (for PRO engines with scripting only)\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \b0 \cf0 - name of any script variable defined in session context scripts (like ).\ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \f1\fs24 \cf0 \ \pard\tx2414\pardeftab720\li2556\fi-2556\ri0 \f0\fs20 \cf0 \ }syncevolution-1.5/src/synthesis/libsynthesis_contributor_agreement.doc0000644000373300037200000012400012424517753030413 0ustar00nightlyallusers00000000000000ÐÏࡱá>þÿ NQÿÿÿÿRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Áq` Áð)1bh£N N N N N N N b b b b b 8š 4Î d2 ÅìH ^ Lª ª ª ª ª ª ª ª ª ª ª ª ª ±h!°ÅÅÅÅÅÅM "o o o o o o o o o ª £2 H H H H H H H H H H H H H H H H H H H H H o Æ œœœœœœœœœœœœœœœœœ°°°°°°°!(A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A!A! libsynthesis contributor agreement These terms apply to your contribution of materials to a product or project owned or managed by us and designated below ('project'), and set out the intellectual property rights you grant to us (plan44.ch and Synthesis AG) in the contributed materials. If this contribution is on behalf of a company, the term 'you' will also mean the company you identify below. If you agree to be bound by these terms, fill in the information requested below and provide your signature. Read this agreement carefully before signing. The term 'contribution' means any source code, object code, patch, tool, sample, graphic, specification, manual, documentation, or any other material posted or submitted by the Contributor(s) designated below to the Project. With respect to any worldwide copyrights, or copyright applications and registrations, in your contribution: you hereby assign to us joint ownership, and to the extent that such assignment is or becomes invalid, ineffective or unenforceable, you hereby grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, royalty-free, unrestricted license to exercise all rights under those copyrights. This includes, at our option, the right to sublicense these same rights to third parties through multiple levels of sublicensees or other licensing arrangements; you agree that each of us can do all things in relation to your contribution as if each of us were the sole owners, and if one of us makes a derivative work of your contribution, the one who makes the derivative work (or has it made) will be the sole owner of that derivative work; you agree that you will not assert any moral rights in your contribution against us, our licensees or transferees; you agree that we may register a copyright in your contribution and exercise all ownership rights associated with it; and you agree that neither of us has any duty to consult with, obtain the consent of, pay or render an accounting to the other for any use or distribution of your contribution. With respect to any patents you own, or that you can license without payment to any third party, you hereby grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge, royalty-free license to: make, have made, use, sell, offer to sell, import, and otherwise transfer your contribution in whole or in part, alone or in combination with or included in any product, work or materials arising out of the project to which your contribution was submitted, and at our option, to sublicense these same rights to third parties through multiple levels of sublicensees or other licensing arrangements. Except as set out above, you keep all right, title, and interest in your contribution. The rights that you grant to us under these terms are effective on the date you first submitted a contribution to us, even if your submission took place before the date you sign these terms. Any contribution we make available under any license will also be made available under a suitable FSF (Free Software Foundation) or OSI (Open Source Initiative) approved license. With respect to your contribution, you represent that: it is an original work and that you can legally grant the rights set out in these terms; it does not to the best of your knowledge violate any third party's copyrights, trademarks, patents, or other intellectual property rights; and you are authorized to sign this contract on behalf of your company (if identified below). These terms will be governed by the laws of Switzerland. Any choice of law rules will not apply. Please designate the Project for which you would like to contribute materials: Project name:Please designate the Contributor(s) and the Project for which you would like to contribute materials: Nameemail addressmailing addresstelephone/faxOn behalf of the Contributor(s) listed above, you agree to the terms of this agreement (Please print clearly): Company:Your name:Your title:Your signature: Date: To deliver these terms to us, scan and email a signed copy to us at opensource@plan44.ch.  libsynthesis contributor agreement - derivative work based on Sun Contributor Agreement This document is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License  HYPERLINK "http://creativecommons.org/licenses/by-sa/3.0/" http://creativecommons.org/licenses/by-sa/3.0/ libsynthesis contributor agreement - Page  PAGE 2/ NUMPAGES 2 libsynthesis contributor agreement - Page  PAGE 1/ NUMPAGES 2 ÏDÐÉêyùºÎŒ‚ªK© àÉêyùºÎŒ‚ªK© ^http://creativecommons.org/licenses/by-sa/3.0/F$$If–l”hÖ\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿ†œ@ñÿ@NormalCJsH mH tH _HaJDAòÿ¡DDefault Paragraph Fontdióÿ³d Table Normal.aöö4Ö4Öl4Ö4Öl (kôÿÁ(No ListÌþñÿòÌ Free FormE$$$¤¤dð*$1$@& ]„^„`„$a$-DMÆ ÿÿY568:;<7S*CJOJPJQJ@ˆphsHmHH*>*KHEHfHqÊ ÿÿîþñÿîBody An$$$¤¤dð*$1$@& ]„^„`„$a$-DMÆ ÿÿÆ& 0`Àð P€°à@Y568:;<7S*CJOJPJQJ@ˆphsH mH H*>*KHEHfHqÊ ÿÿþþñÿþAgreementTitlen$$$¤¤Œdð*$1$@& ]„^„`„$a$-DMÆ ÿÿÆ& 0`Àð P€°à@Y568:;<7S*CJOJPJQJ@ˆphsH mH H*>*KHEHfHqÊ ÿÿþñÿ"NumberedParagraphn$$$¤x¤dð*$1$@& ]„^„`„$a$-DMÆ ÿÿÆ& 0`Àð P€°à@Y568:;<7S*CJOJPJQJ@ˆphsH mH H*>*KHEHfHqÊ ÿÿþñÿ2SubParagraphBulletn$$$¤¤dð*$1$@& ]„^„`„$a$-DMÆ ÿÿÆ& `Àð P€°à@Y568:;<7S*CJOJPJQJ@ˆphsH mH H*>*KHEHfHqÊ ÿÿÔþñÿBÔ TableContentsE$$$¤¤dð*$1$@& ]„^„`„$a$-DMÆ ÿÿY568:;<7S*CJOJPJQJ@ˆphsH mH H*>*KHEHfHqÊ ÿÿôþñÿRô CCLicensen$$$¤¤dð*$1$@& ]„^„`„$a$-DMÆ ÿÿÆ& 0`Àð P€°à@Y568:) 0 00#R$‰°Ð°`°Ð/ °à=!°Ä"°ÄDHT V   ô ö ”–Ê̲´¨ª¦¨²´ÆÈZ\ÊÌ~€  ¢ V!X!""¼"ýóðçäßÜ×ÔÏÌÇÄ¿¼·´¯¬§¤Ÿœ—”Œ‡„|wtolgdCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJEHCJCJOJPJQJCJ5CJ$OJPJQJCJ$%¼"Ø"Ú"Ü"¨#²#Î#î# $$$$$$$$$"$$$&$($,$.$0$2$6$8$:$<$@$B$D$F$J$L$N$P$T$V$X$Z$\$:%L%N%P%f%h%j%‚%„%†%¦%¨%ª%¬%¸%º%¾%r&t&v&x&z&|&~&ýüüùöóðíüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüüêçüüäüüáüüÞüüüÛüüØüüüÏÆ«4jUCJOJPJQJsHmHtHujhCJOJPJQJCJOJPJQJCJCJCJCJCJCJCJCJCJCJCJCJCJA~&€&0'ò'ô'l(n(p(Ì(Î(Ð(Ò(Ô(÷ôñìëàÛÔ͈Cëˆ568:;<79XTS*CJOJPJQJ@ˆphÿRHdsHmHtH_HH*>*KHEHwhÿ *ehrÊÿfHqÊ ÿÿˆ568:;<79XTS*CJOJPJQJ@ˆphÿRHdsHmHtH_HH*>*KHEHwhÿ *ehrÊÿfHqÊ ÿÿ 0JjU CJphþ>* jUjUj jUCJCJCJOJPJQJ Ô(Ö(Ø(,).):)<)>)@)B)D)X)Z)\)^)»º²¥ˆ{sf^QI<6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH ˆ568:;<79XTS*CJOJPJQJ@ˆphÿRHdsHmHtH_HH*>*KHEHwhÿ *ehrÊÿfHqÊ ÿÿ^)`)b)¶)¸)Ä)Æ)È)Ê)Ì)Î)â)ä)æ)è)»º²¥ˆ{sf^QI<6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH 6jUCJsH mH 6CJsH mH ˆ568:;<79XTS*CJOJPJQJ@ˆphÿRHdsHmHtH_HH*>*KHEHwhÿ *ehrÊÿfHqÊ ÿÿè)ê)î)ð)»ºuˆ568:;<79XTS*CJOJPJQJ@ˆphÿRHdsHmHtH_HH*>*KHEHwhÿ *ehrÊÿfHqÊ ÿÿˆ568:;<79XTS*CJOJPJQJ@ˆphÿRHdsHmHtH_HH*>*KHEHwhÿ *ehrÊÿfHqÊ ÿÿHV  ö –Ì´ª¨ûù×מžžžž|! & F`„åþÆ2 0`Àð P€°à@9 & F^„ `„VÿÆ] ª`Àð P€°à@  `Àð P€°à@! & F`„åþÆ2 0`Àð P€°à@¤È ¨´È\Ì€ÆÆ¤¤k9 & F^„ `„VÿÆ] ª`Àð P€°à@  `Àð P€°à@! & F`„åþÆ2 0`Àð P€°à@9 & F^„ `„VÿÆ] ª`Àð P€°à@  `Àð P€°à@€¢ X!""¼"Ø"Ú"ÆÆ¤¤ž˜˜$If¤d¤d! & F`„åþÆ2 0`Àð P€°à@9 & F^„ `„VÿÆ] ª`Àð P€°à@  `Àð P€°à@Ú"Ü"¨#²#Î#:4..$If¤d¤dÄ$$If–l”hÖ0© Ä%© aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖÿÿÿÿÿÿÿÿpÖÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖÎ#î# $ $$$$$$$$$$ $"$$$&$($*$,$.$0$2$4$6$8$ùùôùùùùïùùùùêùùùùåùùùùàùùFfï Ff§Ff_FfFfÏ$If2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2ÖF$$If–l”~Ö\ÊZŠÄ%Ê 0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚Ö8$:$<$>$@$B$D$F$H$J$L$N$P$R$T$V$X$Z$\$:%L%N%ùùôùùùùïùùùùêùùùùåßùù¤d¤dFfFfÇFfFf7 $IfN%P%f%h%:44$IfÄ$$If–l”hÖ0´ Ä%´ aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖÿÿÿÿÿÿÿÿpÖÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Öh%j%‚%„%:44$IfÄ$$If–l”hÖ0´ Ä%´ aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖÿÿÿÿÿÿÿÿpÖÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö„%†%¦%¨%ª%:444$IfÄ$$If–l”hÖ0´ Ä%´ aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖÿÿÿÿÿÿÿÿpÖÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Öª%¬%¸%º%:44$IfÄ$$If–l”€Ö0´ Ä%´ aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖÿÿÿÿÿÿÿÿpÖÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Öº%¼%¾%r&t&v&:8888Ä$$If–l”hÖ0´ Ä%´ aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚ÖƒÖ„ÖÖÿÿÿÿÿÿÿÿpÖÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Öv&x&z&|&€&0'ò'Ð(Ò(Ô(Ö(Ø(`)b)ê)î)ð)ýýûûûûûù÷ù÷ò÷ò÷û$a$;<7S*CJOJPJQJ@ˆphsH mH H*>*KHEHfHqÊ ÿÿø*ÿÿÿÿIŽŽŽ‘¼"~&Ô(^)è)ò)¨€Ú"Î#8$N%h%„%ª%º%v&ò) !"#$%&'ÿÿUnknownù7fj“Xÿ€.579DFsz|~‰‹‘!ÿ€“ÿ€!ÿ€“ÿ€ðlðð,bð$¶,^N¤O¢ªŽŽ]µ“ðWÿ1Pnð)¶,^N¤O¢ªŽŽ]µ“ðWÿ‰PNG  IHDRYŒ aÞ%iCCPICC Profilex…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.€:)(œµk×ÊxÖm¥NtÖÔÎUËV!¿[~¬Y³FLþí·ß¢|ùò¨Y³&üüüP¥J¬\¹R^¥åþôÓO¸wç"·lG©ó´õúû,þû†½rpľ…ß/OÞ¹sg,_¾Ül1™1¯W¯¶lÙ‚ (Íù á¡E‹2{ONGK->}½zõBÅŠõG⬨mÛ¶•M§PŸ>}j|N‹ëÚµ+Ž:‚øûñàzH¸éüŒ1Bð—íË–-ÃØ±c*ûö틞={âæÍ›èÑ£‡ÀûP¹5j„(åx铸aY¡÷„ì`pÀÏ›"DÐÜÝÅ‹KX“¦ì[©R%ÁPNhÇ/;g3šÚ¥ß.J¼Ú±cG³¡÷ïßþýûcÊ”)˜8q"(B†)µoß^„óïp=$nÜùsçáäè„V­ZIÛ“'O0oÞ<ù=uêTY+µVo£†¿~ýZž“'|ëÆ-Ù0i´ñËLÈ4¯ààþƒ²[\„©9Ò=|øIIIï±OLLÄ£GD0úÃvíÚ¡aÆ2ÑýQû3„ý¹ª¹/Ù²eƒ§§§Ù#k7LL‰ïp-•³ÖµŽ°CŸQ°`Aög÷øñc§téÒFô;9rä#—7T¸¨ÈÇÇG®OT{;3±I{F_f½˜Ó¼ÖpP¾N6lgÔ)S!!!"ìW¯^aøðáÒ¿dÉ’ð÷÷==Î…ÒüHçƳ¯¾h¯õ«¦41E´hJÖ"Ë0‘ïp쥦”ªâgÆÜ:O®q×®]»ÒAòÃx[W(Þ“8¾mk0²ƒ™@ÇÆÄÊÓ H¢ÁÆ¡]ºtÁµk×Я_?øúúŠƒÛ·oÆ'ÑD‘"E0`ÀñÐÆ ç»t&ôÈôÞÄN.>SRŠÉð›BË1%ÂP‹-ŒM„///ã=Т(Œ¼®yíL>·|ÂOÇpFM{öìÁŒ¡'_`”òüùs™ƒ¹Ü½û.Ya²“Õ”Û,¡ö1e%™NœÎ“¦@é4ˆS4%ƨ>!eãÆ(^¼¸8*î:Ÿ‘òçÏ/¿cccñ2ñ%ì fî4ÒÞ¦ÁËç]²Á¤åèÄøœŽmëÖ­ÒÔ»wï÷ …¸M*Q¢„1„ãÚJ—)í[·#::Zp™ó¤Õ±?Ã7:@ÂÞèÑ£E­[·x!¯¨=QwE‹5òd»-d¦VÜ¡W*¾%1LÒIO0˜e‘˜fÒãsBÏž=A*THž2(lݤoßH4=½]ÒùbzÏ´¶˜{1I¨U¦D ÔIwLú=ktÖž¥*ƒõy§å;ÖîUõÒ>¤Aã†pU¥= ™‘EôÑh~î cVBCm¥)±ß„ ÀL°N:rþüyP°Ô š«íر¡¡¡(Z¼‚TáȸÐ'J-¬P±‚܆® EXh’^' 7oÞ\ÆfÝdéÒ¥èÓ§Nž<‰ÎÝ‚•¶vqÝq|¿ª•ñBù‡5«WKÒD ¬qá˜&œq˜fOá›ašÃHB'š2ãd:–ÖíÛ G¯RÑŸÛr¥P8 UÃ6ª$å’¼æìä,Wj'©¼ÂÛvÚ£¢_E†òÐâ‹`‰4úÈ1„‡…«Déºôpqv‘ÍÑ¡®zêÂÓ»´7Þ$›[…Ë÷n9g½@d&) ™Që¨[6nFHHÊéE.Ø491åLMàÇ”˜òRÀÄ×ÀâlLŸÛò›Ââ¢ýªUÇÅŒëZÌ5I"8F/¥¼J¢ˆòú\˜%DXƒëT Úuk£ªªÖÅ]Ãõk×%²b®@xùx©ya©¹dUÀ–cŠYrvq†!Å &Ó¢u œˆ>Ë—/ æ®_¿^" Ë—3º?tèè°HA­šÃÝÃ]jø–ËgŒj|ËøÊáLâ&¤¦¥âmš:‚R¿-7Ú’‡å=­’VPɯ’@sGM®0ÂÈQ gó„È’‡µ{nåJâŸÖV9—üj÷¸Ã^ªfêSÆG2¿)ã'+ìzâß’%K ‡iÖ˜š¶ÑI²¾À¤ ²Â¿oÆ=tÔ&M3åõGýMHz¤þ¦õ›d ²yê—\U°­­Z¿Z‹Üó‹6&dŒ¦2iW1¤¦’Ma²RëtñâEMUÍ4•¶Ê;ʵ•a«´mû¶k=ûüÍl}¼ÿ…+mŽ‹7£zõëaðð!’¿_¹|?ÌýAaÖ»t›áN@@€œŒ™`è'#̤Ó”›+Èéò—.¶ùõ ¦Oš&i²Ù@Y¸aÙ”IÚ^ܺuKŠê4G†‡¯hÑ¢’›ÆÐ™±'´°ÒÈ”ÿöíÛÒmLÄX<ú”dUÚµ ÒÂ#7i[÷DŠf«ÐH+X¨ Õ¾j2Ò®ðVS'ßZÈÔ‰Ú–ZdÔ/ÚÔYÓ´|nn¾§¿ŸÑUŪšJ4•$h*×TÍZ£å('¥©PSS‡ šÂl›ÇÉ“'¦RsMïµ³gÏjmÚ´‘wGŽ©)˜ÓÔyŸÍ¼2š7ŸYÕdõ@¨VÝZøkŸžP• Ö5._º¬N«ÿÇK,Í¢’«*¼x(Çæ[¶´88ž£¥¦¤âÐþCøçâ¥{ë%1ÖÞ»w¯dœ¬3£ä¹#Óú‚¬ \=ÔÓàÁƒ% – ³4ÂXäâ1ÇüXÊTÈú7ãn‚PæÉ› ÓÞýÓ‡ŠQùŸ7œÜÇíúXÖ®lýúõ œ.ñ™Þ“Óf•Xì¢u³ØiÓ¦¡C‡ °éÈùœò)„œ)\duò´þ„;Zãç$éÇÛÃçœágæý¹LùþüÉ ÂåHöIEND®B`‚ŸÑUŪšJ4•$h*×TÍZ£å('¥©PSS‡ šÂl›ÇÉ“'¦RsMïµ³gÏjmÚ´‘wGŽ©)˜ÓÔyŸÍ¼2š7ŸYÕdõ@¨VÝZøkŸžP• Ö5._º¬N«ÿÇK,Í¢’«*¼x(Çæ[¶´88ž£¥¦¤âÐþCøçâ¥{ë%1ÖÞ»w¯dœ¬3£ä¹#Óú‚¬ \=ÔÓàÁƒ% – ³4ÂXäâ1ÇüXÊTÈú7ãn‚PæÉ› ÓÞýÓ‡ŠQùŸ7œÜÇíúXÖ®lýúõ œ.ñ™Þ“Óf•Xì¢u³ØiÓ¦¡C‡ °éÈùœò)„œ)\@ñÿÿÿ€€€÷ð&ððÊð( ð ðð’² ð³ ðBA¿ÀËœ1Ö×ÿ„ð…ð†ð‡ðC"ñ‘’ððð< ð C ð¿ÿ ?ð>øôlJsèN‰ÿÿÿÿÿÿÿÿÿtèN‰ÿÿÿÿÿÿÿÿÿuèN‰ÿÿÿÿÿÿÿÿÿvèN‰ÿÿÿÿÿÿÿÿÿwèN‰ÿÿÿÿÿÿÿÿÿxèN‰ÿÿÿÿÿÿÿÿÿyèN‰ÿÿÿÿÿÿÿÿÿ^„`„ÆCJpho(EH.^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EH^„ª`„vƪCJpho(EH" ^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EH^„`„ÆCJpho(EH.^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EH^„ª`„vƪCJpho(EH" ^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EH^„`„ÆCJpho(EH.^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EH^„ª`„vƪCJpho(EH" ^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EH^„`„ÆCJpho(EH.^„`„ÐCJpho(EH^„`„ CJpho(EH^„`„pCJpho(EH^„`„@ CJpho(EH^„`„CJpho(EH^„`„àCJpho(EH^„`„°CJpho(EH^„`„€CJpho(EHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø`iTimes New RomanTimes New RomanESymbolSymbolA&ArialArialaÒ0é0®0Î0Ò‰´0 Pro W3Ò0é0®0Î0Ò‰´0 Pro W3ATimesTimesQHelveticaHelvetica#ˆÐhäŠ 'äŠ '!ƒÖ„ÖÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿpÖ(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÖÖÖÖÖ2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö2Ö0 :aölö4Ö4Öl4Ö4Öl4f4 Ö‡Ö ÿÿÿÿ`Ö ÿÿÿÿÔ€ÖÖ‚Ö€#@(0(       Root EntryBPafouÿ (-29@CEÿÿÿÿÿÿÿÿ€>ÕÞ±€…uæ·”ÍO@1Table\jw~…’œ£¦¬°¼ÆËÏÔ×Þêíòû ÿÿÿÿ€…u淔̀…uæ·”ÍA!WordDocumentPaSiEÿÿÿÿ€…u淔̀…uæ·”Í1bData    ÿÿÿÿÿÿÿÿÿÿÿÿ€…u淔̀…uæ·”ÍWþÿÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®|8 ( 0 þÿà…ŸòùOh«‘+'³Ù0SummaryInformation  (ÿÿÿÿÿÿÿÿ€…u淔̀…uæ·”ÍHDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ€…u淔̀…uæ·”ÍObjectPool p8°¡°A ÑÉ©P“ÿÿÿÿÿÿÿÿÿÿÿÿ€…u淔̀…uæ·”Íÿÿÿÿ0`Æp°€œÐJ@°° Cðþ€Åp…0àm°—à•ààаk°À^ðŸÿÿÿÿÿÿÿÿÿÿÿÿ€>ÕÞ±€>ÕÞ±ÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ &7 !"#$%+'()*,0-./L1234568B9:;<=>?@AþÿÿÿCDEFGHIJKMþÿÿÿþÿÿÿPþÿÿÿþÿÿÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsyncevolution-1.5/src/synthesis/libsynthesis_contributor_agreement.pages0000644000373300037200000064576712424517753031001 0ustar00nightlyallusers00000000000000PK\1AiH à image.png‰PNG  IHDRYŒ aÞ%iCCPICC Profilex…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.€:)(œµk×ÊxÖm¥NtÖÔÎUËV!¿[~¬Y³FLþí·ß¢|ùò¨Y³&üüüP¥J¬\¹R^¥åþôÓO¸wç"·lG©ó´õúû,þû†½rpľ…ß/OÞ¹sg,_¾Ül1™1¯W¯¶lÙ‚ (Íù á¡E‹2{ONGK->}½zõBÅŠõG⬨mÛ¶•M§PŸ>}j|N‹ëÚµ+Ž:‚øûñàzH¸éüŒ1Bð—íË–-ÃØ±c*ûö틞={âæÍ›èÑ£‡ÀûP¹5j„(åx铸aY¡÷„ì`pÀÏ›"DÐÜÝÅ‹KX“¦ì[©R%ÁPNhÇ/;g3šÚ¥ß.J¼Ú±cG³¡÷ïßþýûcÊ”)˜8q"(B†)µoß^„óïp=$nÜùsçáäè„V­ZIÛ“'O0oÞ<ù=uêTY+µVo£†¿~ýZž“'|ëÆ-Ù0i´ñËLÈ4¯ààþƒ²[\„©9Ò=|øIIIï±OLLÄ£GD0úÃvíÚ¡aÆ2ÑýQû3„ý¹ª¹/Ù²eƒ§§§Ù#k7LL‰ïp-•³ÖµŽ°CŸQ°`Aög÷øñc§téÒFô;9rä#—7T¸¨ÈÇÇG®OT{;3±I{F_f½˜Ó¼ÖpP¾N6lgÔ)S!!!"ìW¯^aøðáÒ¿dÉ’ð÷÷==Î…ÒüHçƳ¯¾h¯õ«¦41E´hJÖ"Ë0‘ïp쥦”ªâgÆÜ:O®q×®]»ÒAòÃx[W(Þ“8¾mk0²ƒ™@ÇÆÄÊÓ H¢ÁÆ¡]ºtÁµk×Я_?øúúŠƒÛ·oÆ'ÑD‘"E0`ÀñÐÆ ç»t&ôÈôÞÄN.>SRŠÉð›BË1%ÂP‹-ŒM„///ã=Т(Œ¼®yíL>·|ÂOÇpFM{öìÁŒ¡'_`”òüùs™ƒ¹Ü½û.Ya²“Õ”Û,¡ö1e%™NœÎ“¦@é4ˆS4%ƨ>!eãÆ(^¼¸8*î:Ÿ‘òçÏ/¿cccñ2ñ%ì fî4ÒÞ¦ÁËç]²Á¤åèÄøœŽmëÖ­ÒÔ»wï÷ …¸M*Q¢„1„ãÚJ—)í[·#::Zp™ó¤Õ±?Ã7:@ÂÞèÑ£E­[·x!¯¨=QwE‹5òd»-d¦VÜ¡W*¾%1LÒIO0˜e‘˜fÒãsBÏž=A*THž2(lݤoßH4=½]ÒùbzÏ´¶˜{1I¨U¦D ÔIwLú=ktÖž¥*ƒõy§å;ÖîUõÒ>¤Aã†pU¥= ™‘EôÑh~î cVBCm¥)±ß„ ÀL°N:rþüyP°Ô š«íر¡¡¡(Z¼‚TáȸÐ'J-¬P±‚܆® EXh’^' 7oÞ\ÆfÝdéÒ¥èÓ§Nž<‰ÎÝ‚•¶vqÝq|¿ª•ñBù‡5«WKÒD ¬qá˜&œq˜fOá›ašÃHB'š2ãd:–ÖíÛ G¯RÑŸÛr¥P8 UÃ6ª$å’¼æìä,Wj'©¼ÂÛvÚ£¢_E†òÐâ‹`‰4úÈ1„‡…«Déºôpqv‘ÍÑ¡®zêÂÓ»´7Þ$›[…Ë÷n9g½@d&) ™Që¨[6nFHHÊéE.Ø491åLMàÇ”˜òRÀÄ×ÀâlLŸÛò›Ââ¢ýªUÇÅŒëZÌ5I"8F/¥¼J¢ˆòú\˜%DXƒëT Úuk£ªªÖÅ]Ãõk×%²b®@xùx©ya©¹dUÀ–cŠYrvq†!Å &Ó¢u œˆ>Ë—/ æ®_¿^" Ë—3º?tèè°HA­šÃÝÃ]jø–ËgŒj|ËøÊáLâ&¤¦¥âmš:‚R¿-7Ú’‡å=­’VPɯ’@sGM®0ÂÈQ gó„È’‡µ{nåJâŸÖV9—üj÷¸Ã^ªfêSÆG2¿)ã'+ìzâß’%K ‡iÖ˜š¶ÑI²¾À¤ ²Â¿oÆ=tÔ&M3åõGýMHz¤þ¦õ›d ²yê—\U°­­Z¿Z‹Üó‹6&dŒ¦2iW1¤¦’Ma²RëtñâEMUÍ4•¶Ê;ʵ•a«´mû¶k=ûüÍl}¼ÿ…+mŽ‹7£zõëaðð!’¿_¹|?ÌýAaÖ»t›áN@@€œŒ™`è'#̤Ó”›+Èéò—.¶ùõ ¦Oš&i²Ù@Y¸aÙ”IÚ^ܺuKŠê4G†‡¯hÑ¢’›ÆÐ™±'´°ÒÈ”ÿöíÛÒmLÄX<ú”dUÚµ ÒÂ#7i[÷DŠf«ÐH+X¨ Õ¾j2Ò®ðVS'ßZÈÔ‰Ú–ZdÔ/ÚÔYÓ´|nn¾§¿ŸÑUŪšJ4•$h*×TÍZ£å('¥©PSS‡ šÂl›ÇÉ“'¦RsMïµ³gÏjmÚ´‘wGŽ©)˜ÓÔyŸÍ¼2š7ŸYÕdõ@¨VÝZøkŸžP• Ö5._º¬N«ÿÇK,Í¢’«*¼x(Çæ[¶´88ž£¥¦¤âÐþCøçâ¥{ë%1ÖÞ»w¯dœ¬3£ä¹#Óú‚¬ \=ÔÓàÁƒ% – ³4ÂXäâ1ÇüXÊTÈú7ãn‚PæÉ› ÓÞýÓ‡ŠQùŸ7œÜÇíúXÖ®lýúõ œ.ñ™Þ“Óf•Xì¢u³ØiÓ¦¡C‡ °éÈùœò)„œ)\duò´þ„;Zãç$éÇÛÃçœágæý¹LùþüÉ ÂåHöIEND®B`‚PK\1Aװ޲ÆÆthumbs/PageCapThumbV2-1.tiffMM*Àúþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþíþþ ÿíÿþ þñþþÿíÿþþñþþ$ÿíÿþ$þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ&ÿíÿþ&þñþþ$ÿíÿþ$þñþþþ?þTþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþYþTþ?þþñþþ þþ$þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ&þ$þþ þñúþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþíÍÍÍÍ-8n€8¸RSv‡s H~ HLinomntrRGB XYZ Î 1acspMSFTIEC sRGBöÖÓ-HP cprtP3desc„lwtptðbkptrXYZgXYZ,bXYZ@dmndTpdmddĈvuedL†viewÔ$lumiømeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ óQÌXYZ XYZ o¢8õXYZ b™·…ÚXYZ $ „¶ÏdescIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view¤þ_.ÏíÌ \žXYZ L VPWçmeassig CRT curv #(-27;@EJOTY^chmrw|†‹•šŸ¤©®²·¼ÁÆËÐÕÛàåëðöû %+28>ELRY`gnu|ƒ‹’š¡©±¹ÁÉÑÙáéòú &/8AKT]gqz„Ž˜¢¬¶ÁËÕàëõ !-8COZfr~Š–¢®ºÇÓàìù -;HUcq~Œš¨¶ÄÓáðþ +:IXgw†–¦µÅÕåö'7HYj{Œ¯ÀÑãõ+=Oat†™¬¿Òåø 2FZn‚–ª¾Òçû  % : O d y ¤ º Ï å û  ' = T j ˜ ® Å Ü ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eНÕú Ek‘·Ý*QwžÅì;cвÚ*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý# #8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<' >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·OOIO“OÝP'PqP»QQPQ›QæR1R|RÇSS_SªSöTBTTÛU(UuUÂVV\V©V÷WDW’WàX/X}XËYYiY¸ZZVZ¦Zõ[E[•[å\5\†\Ö]']x]É^^l^½__a_³``W`ª`üaOa¢aõbIbœbðcCc—cëd@d”dée=e’eçf=f’fèg=g“géh?h–hìiCišiñjHjŸj÷kOk§kÿlWl¯mm`m¹nnknÄooxoÑp+p†pàq:q•qðrKr¦ss]s¸ttptÌu(u…uáv>v›vøwVw³xxnxÌy*y‰yçzFz¥{{c{Â|!||á}A}¡~~b~Â#„å€G€¨ kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ— —u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿPK\1AÿrÌŽ/¼/¼QuickLook/Thumbnail.jpgÿØÿàJFIFÿá@ExifMM*‡i ‹ ÿÛC    ÿÛCÿÀ‹"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?þþ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ˆø™®jÞøsãÏhRYE­iú=åí£\ÂeˆK,ë½)eÈ#¸®Þ¹Ïøj߯~ñ7„nïõ.ÓT°ŸO–æÓËóàIP£2yˆé¸8ܬ3ÔúrT÷³·©­ ET‹ž×W?”ÏÁp?km{öRñgǵ/Ùùþ,hßtŸˆ×áþ¤!¸¹Ÿ]’ɤŽéµm†"Œ¢ÂJÈ’eÙ™0µú±§Ái¿e!ðï…ü_¥|Oð—Ç Åà›ßjvv:ž´Öùbß5è³q$9h„w2<‡Šïòוøþû+x#Áž%ðütý«¼Qá½WáÝ—Ã+ˆµ=GA šM¶¤ú„R+[é18šFÉ*S¦y®çÇ¿ðDOÙ£âW…þ&x{Æ¿>5x¢ëƺÏöïŒ/u|?túýÔvÑÛZ?—6–ðÙ½ªD¾DÖqÁ21f.Ûˆ¯G:r«7 "õ^_¼zz{7çªG5›”:%£ÿÀ#¯›çNÝÓ×wo^Òÿà«ß³î²ßí¬<ñáµ^ߨø·M—G´Š÷Dk[#zòK ݇´ |aÙ‚› |Çñ?þ ­ðƒMøsm⯂ß>=|Dñ=Æ»àý6ßKÕtëmÍc¯¹ZŠîøØ+€¤«–^B©ß^ðþ ¤¥§ŽîxÚ$o è­ïÆ9Ûø!wì÷qá×ðñý£?kDÙmàÛkÁ{áÕŸMÿ„rBúsÇ·G Íó2Éæ+† €aÍ{Xs|>ã}Þ­ÎÞ±Q²z®i+Ý)UTöo‘®o{{Ùi_[7$Úß•4¬ìøOƒ¿ðYý Ãß´í#ð_ö½Òo<¢èŸ.|àÿi¾’5£‹K]@ÛÞÎnæó.‚o6€pXg×ôßø.Ÿì­Xx~MÄ~,Ôï˜8®ŠãþÕðsZýœü?û*xïö†ý¤þ,|ÒKA¥è¾-O j°ØØd†ÍV] ƒänÝËvŒˆ|óŒUÞ*”o¬”`ºµÏ«êå{y]½mr’—>»7?UyK’Þ\¶ºÑÞÉiv¸†ÿðY…v>/ñ§…þ/ë÷þ"Ôþ#ËàßøjËÃK¡ê–El#º6w¨ß‹yvÂêìNĉÜ_vþÐß·wÁÿÙÃÄ>ðW‰<3ñwÇŸuý*}~ßþðóêZ•¦•A=äІR2ꥴ¬Ü$nx¯ƒn?à‚?²Å׃|wðâ÷ãí­ü9ñ³»¢jçÚ¼7PÛÃ2[´úCMo,i{'ŽA:œþóŠû'ãüÛáÿÅï‹?³ïÇ_ übøóð âçÃ&hú߃oôö“PѦTY¬.¢Ôìîà•"þñcI”ò²)­§î&ôÑ?”-¯ý¿¾­¸Ýïbé§ï9zÞ¼×_ù/É4ºmãÚÏüWö:ÑåñÁoŠWþ´›X±³ÖâÑ£KMoQÓ Yïì-–Y’>ØÇ1 ¨ÎÀ­xwÄ¿ø._Â}?Áú&¯ðkàÇŸˆ>)½ñw…<8ºf«§Úé -5µó-5óîFøÞ0ÅP•l˜ Á>âÿø"Gì¿âæñmŸü,~ðΡy¯jÚv—cy¤¼^Õux ûûi.tùeye@p·4jĮ̀#ïþsðïLkûF~ÖQÝ%Ï„nìïV÷ë6Ÿ.€†;nŽå Y7«îÎFÖÃW&ÉήŠðnݯy¯šÑm£ïªX®{KØÛí¥{ö´·Í½^«¶;ãÏüOáΗàÚJøKà¾øðåol5Ÿx‡ámö«á êvæ"ñ]\Z\¤s’² G û˜œEq_³¯üûT·øÃñOáOíQ£Üßè‹ã-'ž ñ‡…<%Ž•wqy¤­ìv·~~¡4©4¸#ˆÒ!¹SÉú’çþ 9ðrûà—í‰ð"ûãí!{áoºËëÞ*¾’ïD7ú}ӈÛ'fÄ å.|ä˜õÁ¬þûû<é~:Ò<_ªüJøíâýßÄšw‹î<;©_i£NÔµ‹+!gis7‘cÿ»Œd"H‘—%™OkÔ-¥Úî´½âçnªÖ’Žºé}6rN [TçoÅBýéÓSÊ>,Át?fÿüñÏÅχ>1|DÖ¬<©x»JÒe°¶²]J+Kï°J­+ÎD{.HVà’¹eÜ+Øá§†ÛÁÚ7Ľâ7„üM=¯‡añ,‘XÁ>á=cW¶óìtÛ‹?Í,À­‘+æ¼dâ¾²ÿ‚þÍpé>5ðÆ¥ûGþ׺ÿ‚µk·Ñ.u-¶‹§ßßýºT·x´t™gù•¦–SŽpâ½WRÿ‚-þÎ:î¡¥]ø‡â¿í ¯YùÞÔ5ëKCKòüUªhÑ4Z~¡tRÁZ9cB-±†Ø»£<çjN“II[UKÊé[Êßöõ¬íÍlª9¥efýïM£o=_7m7ÖÈúöFÿ‚Œ|ý´­ü_«ü&øwûHh¾Ñíf¹oø—À·šn“©˜¦’¢³º`c»‘6ÊÄ[#w+Ánൿ±ÆŸ.³¦ëwƽÅQK£E¥è—^U¾ñÔîd¶²òLV$±8+xÖîrê ‚~¶ý•ÿc/~ɳµÏìÑàOˆüSà§›S–-G\»²]RÓí²<’å²µ·EØÒ1F(\q–8¯ÅŸðo³häÒ¿f_Ú›ö‚Ô¼E¨Ýif¼ž. \¤Ú ¥ô×»bØnn–wB­tí¼æÈÇ„œUh­\4½·ë{v诪ÝÛ¶øh©RnzO[.šmw»O]žËN¿rið[Ù_Ä6_.<+ðÃö±ñ¦£â›^ËEÓ4?ɨßÝ\i·Km|žE¼®àBí–“Q@Y]«%à¼ÿðN÷}^ÜxûÄé¨%Ä6ºM¬¶PE7ˆ¦’îK@+Î>ω¢{ö` ça i~ÇŸðK¯ü7×>|Oý >6ëZ—>\x‡Nð^•áM ÃZ.‘>…¨HMFÖÃI†?µmUÜm$}ç%˜—ðCŸÙâo†~-ø3eû@þÖÚ7¹¼f¿¼'¢ZëšP‹áÞ¾/ïíz|§§ÌŽßºÔ^ò ¤…EÉ5²„í=¼µÒëå{]®—ÑÛr]¥Í˦º_^v­u{j’m6ÒºåÅð^ŸØcÂÚ™âx,~<øÇÃSøR?\j…~ßo¦iøXÉ<ïØSÁòÌk¹Ü‚bYG5Ðkð\ØoÃ:‰5^üQð¯ˆt¯^øróÃú®– ’ZØ-ü÷¾`òVÕÒA™DŒ]cTi—IñÇþÇðƒöŒ“ÄÚ‡ÅÚƒö½ñˆõ¿[ü;ÖuA{áÄŸQ°Šýo…Á_ìcs™×'ÊD„)*±(Æ9{¿ø!ŸÀãÉ~/x{ö’ý®<#ñ¢?Ây¥ø®ÂûÃÆïD¿m:=>X¡†M­$‚Kx£ —LC.åe9Í(Ò²»×Þó_å}4äß­ßÈ(ÙÅóî¶ó÷:ïgÏuégÜô¿ Áeÿd¯|FÑ>øOAøã®O¨xŠÓÂÖúÄ>ŒéGQºÓÛP³ˆÏçÿËź³!àŒIåñ^áÿçýµ¯oŸÙþ÷ãì¿ |CðƒJ“ÅÞ‹¦Yj7V÷]ÙÚ^IwÃ#ÌæSŒ6à7.ø·üëá?¯>2Ý~Òµ†¯â›ŸˆšoÄˈ¯/<=,3ê¶v c lN‘æ˜|‡eaæo%·o>¬ýŠÿb¿þÂÿ µï„ß <{ñWƺ×oµËOÞZN43u3M%µ¹··‡1yŽÍ™|É2Ç2€3¡(òOÚ-zä·¾Ú¶åm-eÑÚøO;-UÖ¾^ÿÿiçvúbÑE‘¨QEQEQEQEQEQEQEVfµªG¡èú¦³5¦§¨Eio%ÃAen×RÛciã@É8´éÈ#8Í k}O“|ûk| ñî· hQj¾"ð}Æ­¨jºF•?‰4Ù4«}OPÓõÓ®¬à–}©4ëu±¬hK8ŒÈ£*íî|]øQ<)qÄÿ‡“@És"ºkVÅY-ÿ×°!ðD_Ƈ¾+äÍö;øEâo¯„ô¯‹_uí+Hñ‰¦º‘L‹íG]Mfî"Èò®ÈöaÍ#íyÁÿ‚fü ×<¢|;Óþ&üVÓ&ðÈŸN]KO°Ð¬çšG³…"û\)¥­– "Dµ•VæÞhÚ[xšE©Z©4êIGáµâ÷º¶—ü5[§ÒÊî¢KáwÖϦÏÓ·Nyé÷N¯ñÏྨøJ×~,ü8ѵ [HŸ_Ó#ºÖ­âþÐÓ!hV[È‹8 µÄ¸Ê99äV}Çíû>Zj7ÚE×ÇoƒvÚµ¬‰ ͬž(±Y­äp #¡—r–Éb¼â§ì;ðËâ7„~øwQñ×|¦ø:Çì¶RiÖ:Û΋wiwº{Yôù,ö‰lâ;#†8‚–Û·Ïü_û~Íÿ |âÿøÃâ§ŠüðêÊYüAªê3cZÙiÐôàÄ‘`#ŠÓKƒiA;v¿2K^žz«y­/Ót»ÙDÛ÷9Vûùhþýl¾~ZýçüSøa«Yßj:WÄêz}­„z¥Ìöúż‘ÛÙ:oK—er&R9ùHäW+ûFþÏZUÌöz§Çƒ:mÜV ªIÇŠ,cxì›îÜÒ‚"=œü§Ö¾yðgì…ð‡M_žð‡ÅO‰Pêþ#Ó[Gñ YÜØC.˜Ó¦ä¹H£´X>Ðe’) UmꈫñbÁ4luËÿŠV þ6Í®G kZ<~MAôÿ?ÃÚ¼-{qy5ÉKÎ6ú¹X“E°ÆY %‹„SM·gkÛ~¶ýS¿©2“Z¥uÿ?ÅÝo¦þGê_…?ioþ3Õ¼I¤h¼-,šišâ[Ø£·¾‰íÒq=´…¶ÜD#‘I’2Tg“]$?¾\xƒ[ðœ_~iº¤:þžu›u¸´Ôe‰fŽÑã/¸LñººÇÅX0kä½?öðW„|gámwGÖµ›¿[x¼kªÝjZšÅuòÅ"´q%­¼Qµ½ÃM+N’±L¨€`.Ö¡û0ü ø÷ãüZÒ~'x¯ÄQ_¬ºF©gasc6ža–+I%·­šEó97‡Þ©•]ƒE%v¯ß_M5üZõò±w²wÞÚzë£üÏÈú¿Qø¥ðËH“W‡VøàM.]>FŠýnu{xÍ“„”3,„ebi¡¬«¿ÿì-å÷Åï…öVx æÍ¯Ú"`ùx92cŸ6/ûøŸÞù§Ç¿²„|eñ;âÅ/êz‡….u+ßE¢K¡ê3Ìc¸±¹Áw-¼Ñµ²LÓ•FÄl8ÔHì0©ÏhÿðO…ž ñv‘ã{_‹_,ôm3P‡YMçûôÁv—V—/34ó:ï{(²eUVqå+Xu[Ú;_~¿Ö=<í¤Ôu³ÿ‚ôÓﺿ‘öV³ñWá‡/ï´¯üHð…ª[[%å͵î±o¶öîÁWWpUˆPÄ`’9®G^ý¤ÿg¯ ]ZØøƒãÂ]&ú{Û}:8&ñ ¨‘®g CÝù ùÏ\×Ïò~Οþ4x“â‹ Öôñ&˜°ýžÚÕc:Åd†'tevhÊHÙ°qOø&ïÂ$Ñõÿ]|cøØözÜ2Û\@÷0’k\«Sþ%ùÚ >|.Y˜’N2VšIÝwÛOM¥æb§+Iµè¿¯ëSíñ³àÈÔ¬tsñoáˆÕî¯[M¶µþß´ó®.Ôá Dó74€ðP ÃÒ²þ#|~øEð·O×®ü[ãÏ ÚßiË ¹Ó“P€Þ©•ÂD¾QpÀ»«»“Œ×κWìð³F×ÛÅxçâSëE­¡™Æ–KZÛ>Ïe“嬎¡²ƒó~j—Æ?³/Á _ê_µ?о,ð©ÕõöÖa^Ø´BúcJ#imävI(¥ 2® ]óK¥_Ãþùäí'm–Ÿ­ü—ãåÓéþ9ü±Õmü;­|RøyáïºBí£êå¤ð™@Ø I¼1ÎÇ'¦j”ÿ´GÀ+mbããgˆu©-ç»Kfñ v†rÉÿu…cÙˆšðoŽ¿±/Ãߌ÷þ8ñ/‰¾$|R𤺭¾.dÑF›Ù¢@bÌO%”’´“’XçÛŠò»¯ø'Â=wÃö1_|pøÕ¨Û]jŸÛQO¨Aáéþ×<®$U’ô£ËÀùd‰6ꦕ¢ï¾þ_ç×ÖÅÅ­y¿¯øÀû>oÚàœ:´ú1ø«ðéî`B÷lºõ™[´0ó¿{˜ò##š¿áŒÿ<]¬j¾Ó+Ÿ‰¿µoC¶’Ê µ½>ÒmäHãògû%¬hÆÅ*’nUs¹@l®Hèï¿—_ëR!4ù¯ºÿ/Ã_ÃSèÏükø;ñû0xâŸÃßIz³½œzv±o<—K ”•‘QË0FVV pA¬ê>i^Õ|cª|Røu¦øFÆàÚßj·Ý´vvsƒƒ“3„G¬A¯œü!ûü,øKâ[߉rxçâü·ÛW ªOfmàxR]’nŠÙV4‘ÆÃ÷‘šò¿bÝQøQ®Ÿ|WâCâßé~-}w[›N—ÊŠbM±‹OØÄ£¾|rƒ’:Ö2’×—ËñikÚ˛וwiiZÑmÃU­º7dßçʾ~Zý·eñ×àŽ¥uŽñ“áV¡zòÇCˆmÞG‘‰2Y¤Šä|/ûTþÏþ1ñ¿ÄŸ‡º'Å Iâo ÝÚXë1Ë{qÇ=Ä~dIŒÛ%8à„'k|§ŠðK¿ø'/Á;Ï \x.o|Eo \Ý\Ü_[y–í©<±Êñ3-¨`¢Hë) #v0›ëŸðJ߆Zô>-ƒVý¢?iwÓµ¡m© Íáô[‹("Çi¸i;ÕW;Õ„ÙçÌ®Šjž¼íÿMkÿ€ßM5ë§½5ä¼u}¾ë}úúYoÌù>óÐþ9|ñG‰.¼ᯋ?éëŠÝ·øÉðÂ}Aì޼%nLCm,š¥°ŽýåŒH‹ ó?xJœà ž£#šø_à÷ìUðÛUð'üK}ñ‹Ä^"ñµÖ›n³¤Ë¥´2Û:l’ Ø&åAÇ‚˜+’À¿ÏY–ðL?†úµÓÙø«RºÒ|%§¤šf“c¦­ëßéÏFít×–,!™™«Zˆž3€²œ k8¨´ž÷×Ó¿N½;k®Æ”§î½,¿;útèÞ—ŽýëáÏŽ¼aâ_žøµðßÅ%°±þÓ¾±Óµ»k™¬í<LjÍ"Æä¢ #‘KÈõütø%pÐ%¿Æ/…“¼¨dˆ'ˆmÈ£~XbN@òß‘ýÆô5ãþý‘ô Fñ‹®|Wø³ã˜uo ?„5 u/ì˜d¸µ/)Y³ic ”¨`6°U.®Û™¼ÛTÿ‚o~Îþ!Õ¼%â_KñXñn©ÿlC©Ç«}Š[‹¡.ôiVÙ#‚™Û÷.nçÌcWÓçI».¯~ý4òþ¶™¹r9EkÑ|º¿_'þWi~ ë€âçÃ` ÕÓIµ×í%ÅÛVßåþð‚O¼AW1á/Ú[à¯>/[h_t³ð.¥“â]Bk…ŠÂÆæ[h®UEË.hòUˆV%N_5ø¯þ ÙðO^ñ.‰ãoøÛÇýšó;[ÝÙèRÙË ’¤¯¬Úslùã–XÊL†5)"“Ñxö(ðƒ´ÏøzÛãOÅŸkúž±¤øš;ýB]Ýé2YZGeoåGŒq4F(J·¥‹9 6çFÎsÞÚ/>hõíËÌí¦º_Ozï÷þ¶ûÝ®úvw÷~žƒã/ ¸|Eskñ[áµÍ¾åÿkI»jË¥ù˜Ùçø‹vF7ã9âªY|uø#©ÃÎñá^¡nó=ºIˆm$W•c²$Áa+‘Ô+ès^¡þÂß ü7ð3[ýŸ´M{Æ–> ½Õ´Í`JO76’Y]Û]Cf×Ëdßk>b;à¶0ò?ÿÁ;> êíàŸ ê_¾2èÓÀÑÜØXÚ6…¿kQj<Öˆé…X ‚ Jªç0ãrâgñ%S·ËE}:õFª1pro[½<¾Î½/×{qi¾ ø,åÐ~-|2Ö㸎y­ÚÓ^µ˜O$‰™JÈwʰb8]§8Å%¿Æ¿ƒw–¿m²ø³ðÎöÓì²ß "×­]M¼oå¼ ‰1±\„-Ð1Á9¯Ï¯~Àþ ÇñLøkûAüR²ñæ“eq£K`Í£}ŠÊîãKž¯öc:ž·k3j"{{«)nîîš+l΃l¤-+[¬™’´tÓK•ïoǪïÒÊé>ê÷3JV»Zë§Ý¾šu»ÖÝ>ðÒÿj¯:œ_ndñö¢YøïH“[ð´úœ©g­‰TiHLMÇÌA$ ze§Å/†WúBx‚Çâ7/t1¾‹W·{v2B'ÛóDD‹Ï(w9¯¼9û2ü ø¹ð¿á‡¡|_×~3xWÀ~g‡¢Ô÷K¸]bëOÔífh¯$µ´XÖXot¸Cýa*ÑÈ¥sŒCðöeøâÙj×À^ø«xcLÕµ©¼K·àíJ;õÒfk¶•m,dÔ­æ­ LZÄ’Aµ =«µbyTeìõ’z/.mþå¿k£nHßWý[üú[mnö>Ä´ø£ðÏP²Öµ+ˆ¾¾Ó´Øc¸Ôn!ÕíÞ;œe$•ƒâ5`2 `Ò²$øáðj8u™‡Å†Ó >É5Кí«Û²ggȹB±À%—‘_6øö$økðoáwŽü üPø¹¥hZ–›§C}¨µÝ‚Kh¶'ÚR4´[T–E\LþOïFFï˜ø/ÂÏø&wÀx"ðOÅO…ÿ´/Ç+àlíï´MnÊ_´w1›M n],E06ú ’.ä+¶iÈ14U*qršŒ´KGkêïk««muÞÍy®z¼©¤ôô·_šM¤ítìö£_ >)x7ã‡Âþß]j~ñNg¯è×3ÛIo$öW1,±;G (êJ°t"½¼»àÂàOÁï†?ü;­x‡Äz…t+-ÊÿV0Û¸-¡X’I¼QBd* ·—.s…Šõ¬b¤«IQøní}í}/·O$*wå\Û…Q\å…Q@Q@q?¼%uã߇~:ðE—‰õ^kEÞ™±§¶Û-剣Œ:Ü9êvÕÊøçF¸ñ‚ü[áû[3Sº¾Ónm#¶½žH-îãe $‘"!'’9¬««ÂJ×ÑÿZ]ýÈß '‘’v³ZÿÃé÷Ÿ•:Oü¢óÅš…lj->>ü1¿ðìöZ•ªØøSú®—§éWO’XÇi®ù1 ê_='K0¥«§’ð«œ?~ÂßlüSðGÃòüAÑþ'x6ßPŠïT¿»Ó!ÒÃ^Ai¢A x`½„F]´¹§cgÖÉlÐyÊZÿ€eÚᔾøaáߌ"±Ñ£»ÖL‰å쨞Kìøouˆ!¶z¤ö[%ܰ=ĺ\³¤Ââd{³„ÿ°Ïí‘©]|5oüKÓüW6 ”3ê×_üF/ T}&[¯$ ­%İjDNÅeãm’2C訫Æ—º”|šZé§Xµï%-ô¼’׎X‰Ò‹œSriíÓïÚ÷miµÛ³dºüÆzo‚´‡¾ ý¤üâß[ZÉgqg©øyþÓ º6™§\‚ÒjÍŸ´«‰„‚E‘õÞ¬È^IüMÿ·ñ_޼ñÃÖÿ´OÃkëoÃ<uuàKR±6RÛ]$m$×MºËj÷möimÖ–ñà ¬Æ8æNÛÿ³ü=f±¿ñOǽ&ëYƒ]Ñã[»3YÓá¶+s ´ƒJ´’Í‹É" —,­©KGöß„?k¯‡úgN¹ãøžúë–Zv…a}â;ë«]7UŠÚ8ÄŸdVew'ìí1bX¹WÄ剫 žÒ-s=ztWWéºKó7rö‘´ž‹¦½ZW·þLúé}Î ö£ý‡´ï‹þ1Ô>.'ÆÏ ü*ÕÛìQ¦¡.›p¢÷ÉI¡m6úh5g¹Ó¦2æKUx˜¼hD¡•JÕÒÿ`¸-eÒ5+¯Žú]çƒí.-"ŽÂä›â‡JLW„Ò ŠiÍ3JíÛ+—!š^3À°×Ç¿…¾)ÑE¯ˆ>üWømáGÄRx;MÖ®%‚æÆ-bÖ&¸¼}ö“Ä.á¼ûqRD‹$œêL{?¡x_öoý¤ôO‚_|¡ø¯Ã7&ð‡…ô:î6HÓçÖì`‘o5ÖÊ×l0ȯo¶C¶Ð/”¨8Ò•âÒz+~;ÿà7wévì÷b•Ww¿}:ÿNËwÀè¾~ÀZÁ­#ãm…·ÆøÍ0é¾'Ô,þxCÂéà‹ ?í«]9uþÕŠR%†ÞHî • ’?’LÇûØO—º3Zö²ïíWwðOâ÷ïüVþßñ¯}i¨é3ËñYb5+™æ·7kl—p½±´„,BEýÜŸ'$ÉÅü5ý”ÿmÿøëÀ /Æ;+?„6z§öŽ£¤iž>»Ü’ý¾iò©s£È&¶6þM»Y,–èwI"˨g™Ñö•¯6´²¿GîÉ~Ïçfe<\ª%Κ½ß𳋶—ß’=Õ®\×`x^m"Ïáÿ‰¥žÒæöÎØI¥Z&–4Kdeä™Éi¢­áŠ$.$ºl°Ý©ißðLmdxGTðWŠ>)|&ñ¾‡{¡6$Z×€oµ!g´§Û-¾Ù¬ÊaIÁ-sYep¬ w«øÛàí‹â_ø£TÓþ!i:/…Ÿ[žKQcãÝVÞMWL{6KpÖëgåé²Û\°¬*Ü"bB7mg¬þÉŸ¶EýΨËñ‰µb ®î Éø¡¯Ø!ž[{Ø© 6­jÄ.!ÃF­Ç(®b–&jjªo™¤þ{¤ú]wÚíjìùz•ogue§ã¿£·Ý{­Z`é> ñ†ñk_ñƒ¼CðËLµ¸‡NÒïô±³5¤G¸š8¢e-:ìÞ\('vw_(ZÿÁ9|dÚî·â [ãׄ®u)uKM¹´ð<ÖóèóKt&2ÄÇStYBª¦õEÉ]ÅyÛF»ûþÑ>7ƒÅžø’š¡i%Äf¨ûo¶Ë,ñ±›J[“++# ~ÕžZ,*(fÉø‡û þÛþ3X<,†ï˜I¾ŠÞiZâO’‘Ç %MS«8ÅI4Þš|ÓüÛ}´ò<Ü?¾ÜZÞÿw4—ß®ìñgÿ‚y|bŸS³ººý¥> :Öø]Z[Ûü8»‰âA±í2mX‰y `€ôÓø¹ûj¾,‹áO€µx[JдOI£ÿÂms¥F%µ½ÞÅ ¬fù%¶†å“+¹w.r*_þÌÿ·%Ø´añÊJK$“Çÿ æ­j·dmœ4V„ªmøŒ‘œÕ}ö@ý§"ð–­áÍkÆö‚Hb³¶¶½ø®ê¶«dc¹–[«2L®òÆCÌB…9Jš›öêšùÚé?×½žªé£¿ÙòÇNÏåw×á飷Fø?Œ¿ðMÿOà k?…Þ%ðŠ/#6PÁ¦I¡˜l¯`f€N·j×ê·6¨#yc€°eiærI:žÿ‚YXÄú…–·ñ³Fø‹áV¾Pðjš>¥y0´_8¶žáõv³òâyG“þŠ4Q¼Ðn³ûþßøB×ádž>5éGÁ“βK-çÄýzÍÍ*éÐI‹Iqÿ\òÅ"nà6zŠf?Û¯TÐ_DðŸÆ}À2,®Ö“XøÛSÁ  3X†˜¸(|çD)òžI:©· Qºå¿^¿ð4ÓͲ=¤£WGæÚÚëU÷Ýïe¢ºêz'ÀØûþ߈|U§Ë¥h~oGá½*Ò+ kM6úûÉhäÔmí"äƒt[#xŒ£{!p¶kľ(~À_ô»O‡þøg7…u¯VÆçXµÓôÇÓ#‡ìédu:’“æºdË3F2¡fù÷çø ûUÿÂ¥øwàØ~([Gâí/^ºž÷T—Å÷·W2ém$j.e²2M0r÷Š1Ž$5'¾ ~ØÞ"ømðÃ@Òþ/èZ'ެtUµÕõ ;]Ô,â]EfV7J^)žñd„4L“Ÿ·˜ ¶1k¹ÝÊöqùÚò¿¢z[Í+Y`_*å‚qV+ò­5½ì“ù=Û×çýGþ |ŸÙX]üZø]áÛ¦I­¬nm¼ñ\YO=¼ 4Juûç{pç*UÆVHåRÀýñ?öXÕ<{㟆Z|Þ/Öü84Ï]è—þ"laM~èÆR×ËûÕ{vy¦ý×”‡Î ¸àã|eû!|rñÏÁßøÄþ6]kÄGìüUcu?Žõg»DŽÞte‹QòÕ³‰&Ü»C(PW€vטêÿ±÷íÍ­ê­¯|v·ñ-톨×zMëøîòÅV¢Á¥oµ‘]¡Y¸•'H²ê `ÏÔ•¤ôM?-U´ìÕÞš^ËÎÝuñ“pSz»=,®½ï¹ÞÉß§­\ð_ìi¯ü%ø•à¯GñóÀ:_‡¬¯?µµ- K"%Ť§Q i'Rû¢˜~ï?( /†éÿ°·þ-øƒâ‹¾"kžðþ?Š/üK¤ê7ºu¶ÿ‚R\x³Ãâ]OöŠð๷ŽÞÞðø"k‹s`³ÜN¶ª­ªº4 ÒÄ>ë-º€å)ô¯ÆØ6÷â‡Ä;¯ØxÿÀ^K¯ Ûxjö8|ßl‘âŠhÖê;´½FŒÃæ$–ÊQŒ,Œ÷€ýïÂÚ/Hø»û=_øÄþо ø{F·Ó¼K¦7ˆï„ºƒ¦Y[W†ã ör²É$rpù#£yÏÀ/ÛƒRµ³I>+èþÖÆ¦fºÔ¬|uª\%ØK«fBÖ[1{hî"{%/ M(twc¹5©7Ïtú½té{}÷vó}®Ö\4K^ÝþÕ¯÷Y_®š&ô}WÅoØ_[ø‘ñãÅö¿ãÒt;=:êÊãEž{ɧ[híÌÂê;ØÀaŠ4O– ¸º•›ñ³öUø…¨ü<ð/†|2¾ø£yi£è~Ô´ôØaŠX­uH.$¸û(–š9!óÖHVTÈTPQ󔿳Ïíãð×áÿ‡åñ/Äï|LÖOöfŸ¬®•ñ/Ä\]¼“i‹<±ìwB›“Qv‘ G*…Ú0±õIû/ÿÁD¬ºUçÇ=S³[ x#¾_‰ZÕ¥ÅÄñX^F’:&švq-«9I0ënY”±*ù¬$iÔѧï^û«Ç^ªö|ÎÝõÚÈï.œËk|¿'{ùZ÷‘¹«ÿÁ5‰áM@ý¤tÝ*ÏKº´¸W½ð…ÅÝÄ« …©ŒÊºœn£´™Xd‚—;H`™}ÿ‚ké·ZçÃy´ßÚKÅþ ŸÂ:ÔºšižÒì­ ŽôÛËYçí2ÚO#ÞšhÝC˜£2U\{oÀ½ö‚ðç|qªk×>$ñçnüHºUœ:Ö§{i.ƒd-äšîíÈ?nO·† ±ÁþŒb °L¿Èúwì/û\xãÅþ!øcñ+Mðï‹/£Óô÷¸“⎽pÚ½…¾Á Ùs*£"ÜšXÀV`LN´àÓ_k+¥¿~‰ù^×ÙåZ*ræ“Ö:.šk~Û]ïøéáÿØƾ øk |'Ðh /Äþ ³ñÖ¯ãí|Wà˜.’úë«ÉšÅ’ÂâÎ °­Ò˜œ&VhVL¶4Ùðì7Ã~øgâ‚´öñ3YOwwƒ™ šæ;¡5ÄóÛý´‰Þá›z0ÀbÏ€=ñ£öný¬¼A¤ü¹øiñIË4‰IòÍu¿qÚâ_ÓŸ‚_î>|ø_ð²ïZ´ñχtMB #gëA ÆeXL’ƒmÈC#ã8Üz×ʾül‡àÁK;_êöµFŸ&‘¢·ˆ4©oõkY²è/ä‹öw–Ù YŸÌœ Y„-‡m±¿™xÃövýºá°ñ„ÞøË¤êz³>¥o«xëV³‚õe‹VŽÒf–;9ÞÍ K­7tq¤Šïd\ã|šûW)J îÒo§»ÍÊý=æ½^¾êæ3X(s©éu~ÿi®m<ÚºòVV~ëýG†x.c[ÍÄD0$G½K\σü;gá_éú5•®š4³E$by¼¥Y€$f=^ƒ¥tÕÎÕ‡up¢Š) (¢Š(¢Š+'_´Ôïô=fÇEÕeÐõ‰­eŠÖõ#IÒb¤,d©ÁÃ9Vµr¾:Ö.ü?à¯kÖù·ÖZmÍÔ+æ÷:FÌ⎑ԣãû­ÐኜcNR•ì“Û—™­·4£½úŸ—ÚÇ…à¢>1øUªéü7aªxªIîí­-|3­i›Ö ô;ÅižáÖÌÂÉw$PÆb,Ø!›Ò.¾“áÿÛ[áÀŠü:ðŽõ‹WÞ2ûn“ks­hײ%ö-šïÿL¼0Zò£Ç&]ÝB†Þ|p~ß_´—Ä øOú?Ã4øc©êšÏ‡¬SX¶½“RÕþÁ)ÑôÆ•¬jS¢e$ˆ9™•0R?Pÿ‡€ü{¿Ñ.µ_~Íþž|+â1.µã COûMÄVšd©¦M"G[¥žúky•”k6!Œ‘AèÐÀT£)Ïw>Xëm¢ã?-Îý9–šÄRÄÊ›ü»N]mï©G[õZÙ.©o­ìØÁûøcÄÚ¶Ÿàßx‡HøUyww"]jZ,ú®–gñ’Ë5¿›=Â\±´hòDÑ|©Ì›`ô¯ˆw_·´«ðÓÂð_Ø´ž/ã«×C”Å«}¿ME_ôéÀQöGÔ„ "‰#\3a_/ø(ÇÄKÍà­cà%²ëI©Y@/tËÝBóN–ÎmGQ±y–w±‰KÄ4ñrñgp†ê»ßYžý¿>4˜d]sा!Ö¤Ñ,õfx¯%µÓ¥½û œ²é6ˆlþЗrÉ=Ï• >Mœ ÈŸuyª.T©Ë¥—þK§á¯©éÒ›r•['{·=oþ_Ó#½ñOü6 ÅÒ[øÅ†¿ ½¬M¼žHçu´‰ÉšMHogœN“Db…@d0º€Ku~ºÿ‚ˆxá_í)§|DÐ>!h(6ëuà™t¼/o«KSSV³¶/q%¢È,#ÒÛ}ÙU2ÜK‰bôö½øµ¬üÕ|ymð{áùñì^$Ðthtƒâ›Ñdmµ´ p÷?Ù¾j´"yw €©0`È™bžk¢ÿÁB¾"\êÚ•â?ZG†ŸSÕÒÂÉŽ¯}.ý×övMk!6‘^Æ×2ÈÖáß÷vá²7“˜J×±K™»jÖº$ü–½oÞ˱);_Eóóõù~/Us”ð_ðR?üFÐ|†Öo€²ý¾h®mí.žþÆâÖÌE–Ü´v÷ uzKÜ<)îe[WÛ)LLV%ÝûY.U“Û¿øzi«êîO±q“¤÷·Ýe¿dýäý|•Ž[Ç^1ÿ‚’øᶯãïÝx‘5»:;½N =;Ã/¤Ú0-ËEºoµPÓË-#f(ÃnG¡'¿à©^Š÷Àžñ§‹-õîôM[P_ ilÚXZò$º…D‹8THhŒrG» $q×ø+öªý¢|Gð¿Ç¿­äÑïÚÓâœv™i¨[M¦éϠɦióf¸m<ÌÁ'žáÂ0ÆT1³®ÖU¡uûzüqÔ¡Ó¼asð7ľ ‹K‘¥ºðe­Ä—z¾­/ötÒ½•ÜsiêmvÉå—IëÓíÅi³O}Ì(ÃÚKžM_®º$·ûGuikcØÿf¿þÖzçÄ-wßõý:ËBÓ4»»ÍMJé¦÷G¸[˨m!¸ˆÐ´Z{ÍÉ&Q¡‘}©Ãi>-ÿ‚€xÃÃvÚïƒum_Òf:¥¾“ªiñi¯£$7 YÝ\­ÂBRÚhŒ‚A.²EC±›6®ÿnŸÚ×âügû%êž,ðÆ¿~ll¼U¡^ÞÞéjžcB—rȶ`EÏ%šd’Ue¸”.Ý»oŽ?¶ÏþüXÕ¾ø[àþŸâ¿³­‚GQÔ/tû`óN‰ .¶RîÛ3‚ ¡ØA‘yÄUm¸Ti.mº'­ÿí¯OŠïUºÃË™Åu×tìž–½û«ë¯k'­Û{ÏÛYø1­>­ðÿijüV´ñ-ƒivÚ¼º ËXÖ/2rm.LK ‘dnHŸkp|ßàH¿à¦6ZÍëjø‹á˜5Y&Õ5I¥_ jj5olê)ö{@Ë9€ùO!™—œkøYûcxÿâo—àKÍXørù'fÔl¦I^é¬Ã"2Ï4k·p")ae*žKáø(çÇÏê:z_þ̾µð´––—7 °ñf¡ue\5ª­À/¥F­m\8–]à‡æ U©·V¯Ók?–¼­úúØÑÍ¥ÈÒßñ¾ßù5½>óJÿÃßðP‹ËíCû~Û⿊tócmmf°\xJßÊ”HL×D,©¶ãka “Ôå}ïHýôÏŽ­¥üIøQ©k—:‡„´ Z[@%»²:¥¯ˆ.,¿Òl.^Ú!’>6)ßsI’@Á9Ú‡íñÞM[Ôµ¯Ù÷_ð_öMÞ—xE•ü²nYÜ7É ¼“éÌ“Hþ\Û£@¬ªa&XšL.GÀÛâ§Ä‰º/ƒuO‡›´Í~ûíñM©½Õ‘Ðìš;}Öl°ÛssI'˜’:ãcæ@ •t¢çe½ýo®ÿ{í²ÖÊÏEÒƒ­-v}ûl—t¼þ&÷Õp áoø(ô~°øc¨[øÇ\ð/ü#óÙ¥ÓG 6©<«H¶÷W)naçÌò§$s€e9äõ:NŸÿ=ƒÁÚ-Ž‚šf¬éúE¥¬öÅÖ“åÏt¾Z ڭ̈39™ZF”6Ò3ê~.ý³þ+xWÆ>#ðlß³ÜÊúv³u¤¶©q¨ÜG¦Ü•ƒÏ¶1̶¬ ¸\Æ£Y°„A¦ü=ý´>)üAøŸà‡6ÿ<7 µõÛíM©ëWöòhŠÉ!Œ)ÓÌsÏò¢ìóÿxñœiÉÉr'w4ŸŸVŸÜúô³{ݩҼg²¿¦öiuÝtê­ÐÝøÙáßÚ?âì‘â^ø3Åš—Çy ÒæÝ kvI-ɸæ[KŸ´Û•X•X1—Ê-’H+’žÇã§Á¿‚z ׆5­GNø×«øÌ‰ô¿O§É?ˆmä“ÈI-£’$d„«£N#Úä猉?·¿‹<â_ˆv× u«¼/¨ÞXùwé–·^…™må $Y#•aãåAä/¿à¤¿ô›Yõ€þ ÔôAoömç‡üM{«‹ûƒnó0&=9aHÁQs6Ðç TŒŠs”¢¥§Åò|º|ÔWž¯ä«EÅ{ oÑùÙ­úï•ö:Ùõ?ø)—-œ×z>¹â`†K{ø4ˆ|7’ãÎ öÍu:¢ù#{‰q0°PWh¨¿kŒß¶§Âx·Ä^ðn£ÁÈôKxáÔ¥Ÿ@X¢Ôœ&J=ÅÂÉ ]KÜ#À01€A4m¿à¡_¬íQõƒšeö£y<ƒO¶€êpy` Â)›ì’íe¼˜ 3÷Gjøû[|Aø‹ã)ü7ñGჾXǦÚN×zõíüy8 ˆ‰%„*Ð8Y™—V_/½g*2‹Šk§éå×_¾ÞFÕ ù}¤•“ó·Tým¥½.ºÜùîßÄðQýcLÐ\*¶á¢y#[»y¼’å^Dw—2D‚}Kwíç¨üð†µpÙuo%ºÉ³÷ÏîÒR3¹kç¹?lÏÚ3áÏÆßŽCÄšoŒ¼oð¯KÔõ{M/tx’ÇP1ÜCQEqgd&€BŽÒ<“™–XÁ1ýÖa¹ñþ -ñR üDдŸ…Â/‡Ã×éúõ²ê7öšˆŽo-PM§#ÜndC0ˆßx Îfº2rŒeµf¯k­vü5ß~—±”àéÎTåöMôÛïë¦ÍÛgd{'¼5ûix³à®‰s׊t¯‹ÚwŠ~ݦÏjtt¼[Ao Qu±KœÈWç1òo˜gxsFý¹¾"üøÅ üm¶×´/‰oy§®Ž4KmO äÜ@ÓM§Í¡qæÄÊ®ËöÕ…ó”hÊœ?Œ_µ‡Çÿ†Ö_nôÝJÖL¾Ó>Ñ|'­|4× Ñ5uÕ/£Ô¤»[‡ÓL vÏv°ÈˆTü®RNAV‘Ž ÒµSM»hÚ¿f­ªÿÀt~½Z uŸ,gn©úß[zk·cÏSÿ‚–éÁ-Ö‹{âG´X7AhžŽMR×÷;Žd•/y›rîK|(ÚAÆî:ÓZÿ‚žß[ëwž!ð/Äa¢j6æÝô›vðjj:L>D`½¬¢ðÂ×&V~ùÞˆq†Ú[fãþ Sâd‡HŽ?ƒ¾Óµ;«»øÕuÏM¥BðŒѰim †…UR›˜¶ä`š×ü'ãvƒ¾ÊÿöqðqÕ™¬í‘£ñ6§%œ\@ÓG<Ó&’Æ+7*± †P|Ç °·Èxར• _™[o$´­ÉµçÅìúußðýÔÌ_…ß¶…tÙßÅzWŒ~!ü3Ôt_3ÅsêÚ–¨ÚÚÎ'g–mHM$Ú(K:ËhÇ.±hƦjËû]|Qý–| ¯-ø¨ê2Í«iÞ½ÒáûvÖWq" ¯¢·$v·‘Š˜¦R~FW›ëŸðQόޔMâ/Ù›ÃÚ­„š™Óc_ x“QÔ§…KÝ*ÜʲiP…E¶÷|ü¢TëOA{ûv|uzx?>i7G`Zæ SÔãV–KC+$ÙöæHDsÊVP㘳´€@ßN\Î_oM½é9=u²½þZ;Ý—Rö|®ò¤µþìTvÒýz뵺ťEÿÑo|=á *ý²¾6è–¾ ø[i?‰¯~Ò~ð¯í5Oøí5ÛýP>ƒP×´ûå¿»:¦©, k×Hó¶£2Ô#*îNÃÿ·Ÿí=­ßƒ5_‚¾¶ñ¦…-òø²]búM;Ya§K1k4M5>Ñ=½ÂÅÅ¿îÕ<Æ>b•݇í¡ñçÃOàߨ|/°øµâk»Ï±ÞjºÖ³.˜Ð|öåfe´ÒÌE'K‡kP‰Ú@ò CþISÑßæµÓO¹o·ÞiU^0«=,Ÿ­­Í¯Ë·çcgÃwðPÍcµ6‹ãÆÚ$­£]ÍðþïE“ÃPjhž¢‘ZÚ—žHͧǦ¸’ô,~uÃåÐH¼çÃpÁJüã­;º…þ Ið‚û[:”úž¥…õKí/ÍÕµÙÕ agöHì÷ºyó£Ý/’ŒHá÷[/Ûcâ4ÿ³eïÇÙ>¥íúkV–) iºÄ·‘ÚȈey#¹µÅ»3¤–ÑcNVÕ¼{Nÿ‚‰|HK¹|3kð³Âž"[{û¨Ç‰|ZúsÞÔ/m᎘L­ª¾Ñÿ*@ÿ8RÍ×VRÕÊ §~‰K¿Tõù§³"¥xß[«ß£ïË}»­=n•š?]£ß±<Ìy˜±ëO¯Éý;öîøÆuP?Â? Ü$W¶±^Ãqâ«…µ¶m•§{&M <ÄɽUfp ÚwG“ý;û6~Õ°|wÔ¼sa«hþð”ÖÜšN™mo­ý²òô"9i%„D¦ÌrrJȲœq^\*)mçøs/Ëñ>âŠ*Ê (¢€ (¢€ (¢€ k2¢³»@2I<N¦H¥ÑФ‚3Œâ“òþ*ð׋ü?aâÏ kÚOˆ|1ušÛP³e·¸Œ £©*ËyW‹xköµýšücâkxcã?µ¿Ý]­…µŒy–{†‚+…F>f0OÀ±Íý×Rzï…^ñgÃÏøsÂú—м;¯é–_£-´·7RÝ™£‘®d¢#ÈŒ…]аt Q¾Qø™û Š·ßÿá+ñ¿‚õx‹â-—cÓ/ü"×0Ú-¾‹o§-«î¼fn— 0Xöœ/–HYÔ”•œUõW]mÌ“ùòÞKÒÛèkIAÂ\îÎÎÞnÚ/KÙt>ÿ¼¼´Óín/¯î­¬l¢RòÍ3„HÔu,Ç€©«5ù¥áÏø'ö±§|ý¡~ø£â§„¾"kž8EUÖ5ï ßj6á’i¦‰¯¬nuI!»´æ0 6… Š(ݘ¢:ù޵ÿ¶Ô¼Qàï‰ñ'Æ?êZÞ·aâ;;M\øWRy´ùõ7åfÖ\ ˜c6x>β»V®ÉS‡5”´ïgå×îó1£ï5Ïîþ?‘úÏ­kzO‡të_\Ô-´½2,y“ÌÛQ2p2~¤U?xOÃ>0³³ÓüU é^!±·¼·Ô`†ò•"º‚E–€nÇ"««uVPF¾Søû%ƒ/ñRͼKáMKÞ%¶0-†Ÿáæ³[ûv¡:9ßq*H+Ø Q±p¶‰ƒ´ª'Ïcþ Íâ»ßhZ&¿ñ»Âwz…²Z‹BÃÁÓÙ=ÔÖóDÿi*5Ä×qEå_Ûnƒ–!”l§¤½×?¿õ_Šó5åIµëKþo§Gä~£=íœs=³Ý@.–31‹pß°p[o\g½r¾ ø‹àˆ_ðø›Lñé7ßÙš¢[¹/§ÝùQÍäJ¤åËí ²)î+óø%v‡uâ?ê·>8økq£Z>œ“éïà6o6ÒÖö;±k›ÿÝÅ#‰LˆÂDf6ß”‡oƒà—Sx,kú½ŸÅß j:»¼‡QÍǃ$Ýq,QÚ¤p]*߇¹µCj®±yŠË#0gì¦÷×OMŸÏ·Nædܤ¦¬•¬ûß}<¿õgûwI:œz:ÞÇ&¤ûñÛJ€X1 @e8$E7Yñ‰áäÓä×5[-).îá°¶3¸Q=Ì®8—=Y˜€rkòÃLÿ‚fkúL˧|lð^‘ºî-GQ‡Kð,–qx‚u·±„Åz¢ßh·u±UhÛæ1ÈɼpÕïÿÿbؾøþMã=Å­*Ý$‘É È—!$x^–y.äýÝ»Cˆ”¡Ú›Wqêþ_ðËñ·Cj‰/…ßú_ð~ï3îŠ+ò÷â‡ü§SñÞ¯âíÃ|3ðëÄZ­ûß cOðÅÊêv…¦W!n"Ôc<Æ&8Y\p SÎé¿ðM_ÀÖözÆo‡W~:2iW:Hð^§4/ûéf“d—zÜÓL’H¥y|½»U‚áT§­5)i.ßð}L§+6’¾¾Z®ûŸªº¦—§kzmþ«Ù[jZUÔMͼÈ9ãa†F‚$Qèº.“á½Jðö¦Ùèú¼vvV–шáµ*FŠ8UU8_øö&ñ¼9ñ£B±øÃ¦Êþ+ÒF™o»Ãm%¾TGËvòº*žJÌ‘`ª‡qoš_þ £ã éZÞ³ÿ 3Lø‰ã+ÈFŸº‡[Eº´÷âI®õ;„D·i£©I7uÚ€ãmÆÖm¿—w®½.í¯MB\Þï*½Ý½“¿¥ôv×M™û3E|!ñ»ö.Ô~.xSáw‡´o‹ú¯ÃKö† µ;5ešþGÃM S"Å ‘÷ÈÆòÔp|_Zÿ‚oxR:½¾ñƒÀF‹©o{ëà›©c¶c—äÚª'Ù­ö—>Qß˶E._y«õµü»ú~>F³I½/øm§ç÷¦^ðg„|g{§x7Âþð¥…Íܺ…Ì:uœvéqu!Ì“8@;Y'¹®–¿15ø'¶¿}w¥§ü-/Yèv>#þÓ†ÖËÂzŽŸ%柷ÛÝÍi¬D×Àra|´E ¦“è¿c?|KñÇŒ¼MuñCÁƒGÔ.­.líîü%,÷ñFŠD¶WbùVæÑŽ8„1˜Ü¹óÁÒ?Õ¶·ê¾^ewwÿWóùŸWx¦ëá/޵ë‚Þ2oø§Ä/§®ºþÔ9åk5”F·^Sƒò‰PàpÇÍwšf—¥h:m®•£éöZF“n›!·¶ˆG*;*¨ÀJü}¾ÿ‚XxîïÇ~.—öŽð–­o •¾™$z‡‚õ¶k‰uû/o-µ¨e¸dÙ¶"6*|¥–L~ÁøŸû4|AøÇ¤xKLñoÄ èÿØ—×+f,tË©Rk2‘¬7™u½o#(ÄK¹†[…êMMESN/Wºóþ¬¾÷rWį·õý}ÇÔºŽü#âk Sðö»g­iº™™ln-·IÁŒø`00TŽqÈ"º‰n ƒÊóçŠî#Mìö=g©ö¯Çíkþ Çâ«9ßÁž ñ˜Ñ¬5(înuÃbmmCŬÉqw<Ù"GG€þ0x¯WðgüïPðçˆü_ûxŸÆ6ñWŠõ/Œ>¸¶¾Õ¯o`†O Ì. ½Â(Xîf[à.eµeßk*¤^Q'åzòŸÁ1¼eá«ï Í«~ÑZO °Ô­o/g¾ðÅý¶£â/%RâúêÏW…®ohÛ9P€'æh¥+9éµúîµû¶óüG8¤Ý´ówÿ-~gë­Cöˆ<ókçÄnBy†=Ãp\ãv:ã=ëó[ã?ì³ñ«ã¯ÄÏ…Z—u?‡V/¦øzòßéº+È4ÝCí%à{(¦½[ÈSÜù¡”ºü»¸óÝþ Ÿã]Zÿ„‡þWÁí[T’åMßÚþLé¨Y}ªiÍ”¿ñ6ÞabQ•REøiQ´•妯ðvO¦ûúw&¢´¤–¶·ÏDôü½{£Zvðcâå΋ñCOÑ| ãËë`ö¶çÙ"¸–’Ѥ¥w¯“€p'­z½Í½ÜB{YṄôxÜ2ŸÄWóÇì•âÙ–òaà/|2¾Òµ}En|JƒÃ3ØÉz™¼ÈRñÕ®c]òò©ÎxLJZÿÁ3.´¸uÛ|hÓ¼#¥Íí„z'…¾Âl G›O!nŠ=¥Ç–MÄ{WÍi†Ìf•íôÓ_'¥ÿWòî5gÌå½ì¼Ö½|´Ðý:Ó|Yá½c]ñ†tÍfÊ÷_ÒÔ­³%‘–1$aÇmÈCc] |qðkövø•ð?P¿ø‡àÃúž£n÷Öw:ÌM±KvC› ·l1‡HÁS¸á«å;ßø&g§¸Ó"¶ý¥ôÆÐmãÔáû÷ƒ¥žW†ñ®K@n#Ôc–X×ÏŒ?Θiœ­Ó÷vþ¿¯ÄSÒ-¯->ZýÌýs®_Â>5ðŸt©µ¿ëúo‰4˜î§±’âÖMè—Èc–#èÈêTŽÄügø“ÿ½ñý׌| má|?¿øuw¨Öü5ôúëj¶>k |7uš[Cºÿj¯(³˜4±ÄÙåR>vÝ„UâšvmKð³WÿMµVvm~íÚ¾š_ç½·Û¿Ü~µh¾1ðω-´íXµÕìuKCa=¾^+¨ß\ ¸ù—¿9®–¿%t/ø&¿ÄiÚ†—á?ÚÀ6zK‹+I¼ø{qq¥J«›ñ\[ YDñÎÖWº†Bd¼ÜY¶7›ô÷Ä¿ÙÃâÅx{Àºü-àý?Þ'Òµ¯Üèš<¬íik‡·ž ›‡‚C$2üáÑcd*dI“Zð¦¯Èïÿ麿ÎÏÉÂí¤úþßç§[yŸfWx¡~x;ÅןüO£øKKñÒ[ÀVm05ì¨ÂTUÕ ÈÁRPrÁ¸ _˜¾ÿ‚gxïQð—u kâ£|(ñ ØÈº®‘§i÷Q>üÙÚÛ®£m%–ª±‹õkff¸—ÎIÅZù·û]ßüëW×4{;xóà»N,mâžßMøo%¶š/Q5ekØm¤ÔäòdvÔÕÉÞÄ ‰‹+E¾©íÝwOÒÿ‡º!Ìâ妺úm÷þÊÿ¥ðÍÌ1O ‰!u ­ýàzóχÞøWàµÔ4o†>ð‡…m¶Ç,ñhöÛBÊwlÁB0ØÏ¾ ñ'ì ñ3_ML'ÇŸ‡1_IâXuØu[‡³Í©¼‰Þ;IîUC(‚iÿÑf(aa/2W+iÿÆÕ4½&O h¿<1á¿Cá«]#Fðtº}®š;´MJPÛ¡Ú"x®/–ð»>bùWʹ·ÓþúùŠRµšü­×]þîºúŸ­WÆŸÿf¯~ÏZ£Eá?|;ÕüÎÖ¼x¸<ÿ):6£©Ü|Iñ„>.axöê}6ݷܽ¢JÆÀLêZ¬¸l‘í'$¾ ü8ÿ‚¤I­ø2è|QÕæÑäÿ‘’ÆãSТ·IšûNYþÊ`°i¤ðo˜Ê$¸Œ>_*×Ã? ~Ü^–OhÞ/ñs¶©âÏé·>ñn—©kÛtäÔ/g²¼YgÔQl÷Â-¡ŒÆK¿½FuVSþÒ?¶÷ Ò,¼á¨üXšs<–‡F¾–ÿK°’M$5ÝΓ¢QÊO-ôJq¼¤ã‘“q™áªÝûEûu¥Õ~+­ïîý«= VØÎtouû×½Ô[WOÍì·–êè–ÛáOü–ÿÅ~¶×¼Q¨¿Â» ]=n¬O‰¬¦¿¿¸ŠÒÞ)<Ù n"yMürä¶ÐY¤Þ©Û|3ÿ‚’Ë£x'J±ø‡yà«{$²‡X‡E›AU¹Ž9-ˆKA-“¬ˆRæ) K2ȧ°ü>ø±û[jšï‚5߉¾ñ…ô8µBÏÄz ƒ¡%"ŽÞóÈxîúàÍ¥läVŒ ¬í;e–?Ðämèµ— 0ÁZÒWƒ¾Žîýõþ¶ég¦–9åKÞjïk}×Z}ûõgÄž&¸ý­¼_ð÷Á–š—ªøÅš]òéþ(uŸNk¿/öj{a#‚8…äƒp•™ ”*|ÈO)ÿgí½¦~ÎãO‹ÇºŸŠÿhKz9o.ïo4¨-¬ì„ÃzÛ,ÑLKë&kô"Šæ«ïJRÛšÛtÙéÚöüZØÞR¼c¹àïÝëײì~L¶•ûzhš·lµŸ‰ÿ†¿¬ë¶°Im6Ÿ§^é°Ú¹œ^šÃNo²¬²KãK¡s¸«zÇí àÛGÅž.ñÂïÞi_M òVßW´µ{Ôû<€À ·ó¡œÏå6ÿ0ÆÈe~ãþ‡QD-ŸÖý?«²¥+»ÿ]ÏÖësñçÂ??࢞oøE|?âÛýá„sµÎµþˆÚœòIy+Æí%£ÃöPÏl0åáˆÎ0ÞÍñ;á¯íÃuðûà^‘ðÛã/Ä;/ÚÃ/5 gðè½½­È·OŸOkvU›œD‘ü¿{wJý ¢¶•kÔökø}ß®â¥.Vš[}Ç䮡à/ø)­{¬þ%ÔaÑí|·†_øH¬ žòXç™Ñ¤6ÐF”0«¦0 ÏcRûáü7Xѵ µo‰>-Öu!`&ƒFÔgð´š\šŸÚâ,3ý˜Ó, Èbfwq¼n€ÛúëED*5.b*.hJ­ýUú.Öé׿~fxÀÿµF¬üFø—ñwK|WoámrÏEÖ´ù¬¯/­Qßζ¶EH‰”«.Fc`[nSµyï„<%ÿ!Õ¼3¡jÖ¼G-†¡g ý„šÜ2ê:tŒ¨dŠú´‰$V¶$e$FùY“ï/ë­+ky[óüu:=¾–i=o•¾ï#ò>‡?ðSÿ³Êxñìµ+»x ýݾµ`ÐÁy³*0‚êÞu†—d{sò™1ǧx_á§ím |;ñmÞ™·ÃßõZj:ÁMJÂ{Ëë/!’äÚÉä­¼ndØÑù«€†9àþ‘QD¤ßÝoÅ?ÑE¥%+lïø5ú³ó÷Oð7íµeð_âןñGQÖ>9ÜÝ!ðßÛáÒÛL¶…6жÑÀê®ÒHΤ–PÀÛüKð‹þ ãX_ëÚáðØÑ£I4‹½#ZÒ®¦MEƒƒ:ý¦ÃˆdY€vTùW'Ÿ×:(‡»%.ßð?Ëï2«(òíÿ§¡ù-®|.ÿ‚‡ÍáíNÅþ#ø³Åº½Ì °ßÉá–Ó²8lEöÅCʆϲ ¬Ý;àçüÃ+g‡üaãHVᣇUøºÊí¢O>Vylâ»íáàÅ„ØcRª8߯tV”êòô2xeÍ{¿½Ÿ’Ú¯ì×ûR|BøWñÓGø›uñG]³Ð¢]LkF;û‹+øfy-ü»EXAŠ3åùÑÿ¬À!‘럳–ûRi¿5ï üNø«ã_ü?Ó4h'˜júL6ÒÁ Ûª\Aaµâ¬*²É,8Jé… ¿Ch®xÂÛ¾ñ¾¶Úúöô;fàán­ú_—ô¾lülо~ßžŸÅz·‚5Ýa5­TDš¬·ºþ›u&¥åEi¸ŽY y<ý‰rÊÁ9Œ63¹>‚ñ¯À?‰~+ñ½sâ¿‚ìi/C੼?«hšÍõŠÏa¬I!'R*"†ÖC$l"’HU$ŒD hûŽ?Dh­ÝKÚëoòkõ;vDÖ¨ç''¥ûz§÷è•÷µ×V~YÚü5ÿ‚‚A¦øzÒOˆúÆŠlV%»¶Ð¦ÑVÖîâ-ÃlêÚIÉ×ÊÖ`VNT¯6ñ¯ìÅûføÿᇉ|âø¿ÄÒ˥˦Zi¾"Ôô+ý5®%Óïà’ïÏ’ÊKäËÏÌ$.«ŠäoÙZ+Nûÿ]?¯½t.Ž"P©í#Þþ_%Ðü‰³ø?ÿÐ<5ô?ëz—…'ÒžÊÞ[ÝwKµÔ4,õöy¶¶k½¼é, MR³îVóz[/†ŸðQ=RïAµ¼ø¹â/éqjX¿6·-鸵_· ´Ö­ ]¯`³®DŒÐ¹ŽO½$¿ª4VÕgÏGÚ×ëóîüþ{Š5¹RI-<¿¯ømÊ{‡µ„phVk_YxYG†Ž—kh¿mÑ5ˆnàmRwš7f™&·[ÐÒÈÉóJBËp³"EWãÁŸÛ{Äõˆ_õ6ÐlmôíCE·ÖtíWNI¦\\[<)counÑ¥ÌaœÝoŒ²¥Ãí¬TSG)ªW3ÓûÊÏðº^Z;œÜžç³éîù¿vÖÕôºMß­Þìü†ñî•ûsø×ÄŸÁN,õ^CñâÞKˆoõM!%Öôé쎥%¤ê–·Bk9^Ey-Lkj¹Y­df>S•›îŸÙ_Á>5ðà KGñöˆú½sâŸë"ÞKø¯$^j—7Q$„ó L»‚äÈÜßxý#Ejª¾NKv^zÛó¿çþl(¢ŠÈaEPEPEPT5]NÛFÓ5 ^ô]5¬/q(‚žBФ±Æ »`pª '€ «õŸ«YO©izŽŸkªêÌð<1ÞÚÌöŒÊ@•¨ñ–Rr7£.@Ê‘ÅLÛ³±PµÕÎá_Å |aðµÏŠü'ˆ-mmõÝ"òÓTÓ¥²»³¼¶™¡š'ŠP!”á†U”«) ƒ^ áïÛ«à‰õKEÒï|bšÝ¨ŸÌ²ºÑf¶™Œ:Üš$ÁVP»¼»ØÊ;}ÕFŠR|¹#võ¿ƒ?/þøsEðË|^ø™ñ*ÊΕ’_[é 6¡<Ò$u3XXÛn›rÈÅ€]ís3È$r¬žPß°ÇÀñ“Wø÷k¥xŽÇâ}æ±{­I}¢Û[*=:H–&?#dI8„‚Ÿi~ óU$Ó]tÖÝ]º_dÞºÞËM[æI4âú;é~‘¾·¶îÚ_Mu·Ù}®ûZþÏ&ñ¾ðçHø­àËŸÞ‰bK5Ô c äqÙHÖÊåVïËÔmA’ì’î€MzT¿~Á®]øb‰ÿ!ñ,1Yϧ>µl.a¸1Ž&Œ¾õw ÅTŒ§à×Êz?ìà ûÃ7Ö¿~4ʺLºdÖ±MýŒÊ>Æú3€HÓÁćCµß‚?×\lòó•…®þÆß³¯Æß‰:Ç->(Ïâ[øŠ}{S³µƒÃš¤0I,vp wIôùš“iKÀ­ÚMnág c¦´iÿË·ÓñÓðø¾äTTlœžÿ†þ—éó¿Cëh~;ü¹¼N·øËð¦}AìåÔñ›HÖ±îó' $Év¶çû£iÉàÕ]oö„øáËïéšçÆ_†n©«Ïco¥ÚÉ®[yÚ„—r,v¢$¹Ä®ê€Cn5ùݨÁ1~^jmà?üVñ}§ÖÚÉ| “jeö«iª[ZG™c¿ÓåŠD‚-FA ±Û$Q0×iúW°ç„ü ©-ç…~0|`ÐôäÖ´Í~2Ú ;K[»e·IDH4ÜÅÔv±G,(V%PL nøp”!í¿»u¯[_^ö²¿}VÚé•YY>]ìþþvÚïÍ®‰ËèãÁŸëZ‡4Š¿µ_ZjóhØÃ«ÀÓ¦¥qÉ%¦ÍÛŒ¨²ÆY$o©µoŒ?ü;}¨[ë¿þhz”1Ø]Gw®ZÃ,7 ¥Ò à«• ÁO$d_?꟱'€5߈7ž=×¼}ñ;\ŽoÛøt{—ÓþÅk4VwpEKEœF—I(-+93J¥Êùk!âÿø'¿€|iãøóVøÃñ¸j:ܳË-²¡³Z\Z쉤ÓZ`ª—R•#áˆê2§(¨ÚÏuïy=4]ﯧžïhÆ.÷v×OMu×ç§×«ñ_ákéÚ®°Ÿ¼úMгÞÝ fÜÃf«#DL¿j":Ä|ÈËÔUWã/Âl¿¾2ÜJ°[‘®ÚþþRΡçù˜˜ärŒ;ño‡²ç†´Ÿ üwð÷ôûK»ˆ­ÝÖ«ak¨Ïqkmjñˆ’(<ÕQàwXÑMq)‰.ÞC¤ÿÁ2goøu¼-á½Oân™¥Mk¨Ø_ùú²_¾¡kzðÍu5ÜRìó.!ûAhö0šYœæ8.*6÷žºÁûºwòØÎ{û¾ð>÷¿nì÷mcöÂýôM#Çž"ºø—áË øv [‹ÝFÚî)ín<ó(D‚Tb³É˜d–×qñçàÚZIugñ;À:ÉYVž·i,ža,6ãÌëò?~Fô5òï‹?àžŸüOi§Ckñ‡ã„î­t«m;1´`ßfŠÞæ réÏçK™76Ϊ¥vüÁ Ô¿àšŸ³¥íÇÅ«û¿‰«ãKci¬Ïk«#¨Îó‡“ Ñ<•vœ©Xò¿k¹Æ<ÃZB4š\ͯé~þVêÖ%ò«ÓÕöÛ§~÷¿“Þëcé/ þÒlJ…à ¢t¹Ìk™ˆÜÐu¿ØƒÁz÷ˆ5/j?¾+]ÊÚÅZËý”ðhbîßȺµ‡6>dÊ…².^wBÄ£&9Uì¯Û_]?=_[Y;»óyÛÓ[í©í»Ý=òÛãçÀ«ÛÛý6ÏãOÂk½JÖW†êÞ/Ù´–Ò*–dueX*± ò“Ú ƒãÿÁ[¦Õå·ø§ðò}*Á _j)®Ú5¥›‡ åÉ “ûˆlWÄžÿ‚}[ØYü:°ñÕÊhºâOÖڼɥéó4°ÙÛ›{X^a7Ê“­Ã¸+¸e×ä:_¿`)¼Iá/i þ&ø³HÕloÖWûdÚ}ªMnÚ‰¾•|È´Ù%ئ6ÑåI |ÊÖ ;6íêÿæºwfœ«U}¿ÿËñØúƒJý­?fÝVX-GÆŸ‡v£.¦txm/5‹xn%ºÚ]Qc/¸î@]N0Ëó9¯føF? Éâ¯GàñÚN¬×Ñ 1üôó·lÛïœWÁšüwᆢk×?¾#¦·kæ»Ãi‘‰3,k4K°'Éa¨RĪýÒö-öQ¶Ò¾…?¾*kž ³áñ|ös^èÛÈòy©pð>âÀlœHЍª¡EŠåvzéùkøíåøóÑsnòÑYúÞú/»{ÚÖ{èpÓ~/|&ÖN¸ºGŇz«ivéy© mnÚ_ìèee›kŸ-ä3`Zʾø÷ð/L²›RÔ¾4|&Óôøíã»’yüGgqÀç )f“‚t8â¼;ß±Ã? |%ø‡ðƒÃž+øƒ£hþ"¹²_Û5„wšmÀ”Íæ@E¯–xÌØ™%ã⼿ư”[JÕ¼ã¯Üøž?ÿoÍu«6Ÿ‘<êöê!žÉæÊ '%Q3Q'­£ýO~ËU{´¶ŽÍ¿éÃlµÖëK^_aÝüxø!a§Vóã»]4Ê!Yäñ šÆÒ@ÆL!9äz×9âOÚoào„4k kÄÿü%¢ÅqN ›R·óâ·fÛö‡A!+êdû I¯ðì+àÝ#ź߈OÁ©¥]éP麈ºI’É_l³ÅuA²´ŒdûVÙ7Êñºÿt-x$?ðN½Z WñÕÅíí·ŠâÎî[›5’ßDq ‘B¦˜#ûKÁ ­ÇÊV³³½½?O×ð×[ktRjõ·û®í×{~:uÓîMöøC¬ÉâÞ-Ó4=?K’hï/µ;˜m-“Ë—Ë,G·Ýqò0<RkŸ´—ÀmöËHºø»ðâã_ºi’ÓNƒ\´k›·ˆ#H¨ž`Ë"ÈŒGPâ¾qÿ‡y|:³þǓßþ6øRëM¾þÐÓ¥³“Hsi)•ä#lÚ{¬ˆCº”:ílãp )\ÿÁ:>Þê^'Õ/>5üzºŸV–I.ƒ¾‡€Ž±)HÓ7mÆâHä—»®ÿð>þ½¼Ê\¼Ö{Wþºþ_\KñÃàÅ¿”.þ-ü2²‘î×O 6¿hö³·ø2­ù—äûß0ã‘[oñ7á¼z?ü$R|AðDzÛ?³þÜÚ´ßí[¶ùfý¾fàFÌîϯŽôOø'oÂ?éÚ™¦øçâœQiV ¥XHÒéÒI šº:DÅìÛÌ*Éì üÄ#hZ‡ì ðÒ÷àUçìùkñã‡à¹õ™µ¦–ÒòŦ¤·&´’Þ|ÈXCJŠUv…´¼—Ýç¯]í¦½wµÝ®âÊË]áÿ[tû{ñí#ð'þ×¼Wqñcáþ£¤é·qØ^bÚáá»rÛ•G'Í9'Þ# ®šÿãÂ]#R&µñ7áþ‡¯yvò¶Ÿ}¬ÛAuÍ(´Ná×y .G'šùþáðîÑ®´ß‹¿ôZÊÎM=/ þÅß5´›<ØÝN16ÿ-2Û7.ߦN{oб/ÿ‹ä^"Ö¼_ãK I5 ò©c£]Á ¶µû7’ÑÞXL¬’& 1b°ÌOH1×îýoú?½yµVº;~7ÛîëÜ÷)þ:|!ƒV“H< qq¸ûkǬڔÓL[7‰ÿy˜ÏνG~qÆpl¿j_Ù£PžþÚÏö„ø)=Í­ÕÅ•Äð”YŠxlÑdÎänv=kâ†ðM{+- ÅZGÅ/1[ë©ÜG Á§²Ë-ºF7˧¬¬)m Á³4~Y˜ªö»Ø#À—F¹£7ÅÏÂÚöѬÖV¸Ò¥¸³F¹ŠâB“K`Ò¹‘¢Ãy­ Úî&åø~6ÿ=?#Y¨iÊÞÿ…÷ë~ÿ/=>€Ó¿hϺƣâ ?Gø«à Ut†š=fæ fÙ Ò$ŒFZ9ßÌÄm‰S¯÷†qÅi§ÇÒÜj–‘üføQ%ÝŠE-ìKâ+2öi'ú¶y™@ÿÂ[íšùÁ_ðMÿ†~Ñü7¢ø{âïÇo¤Ln´ãq&Žæ ƒ%¬!Û§®íÍj¤©ù{ |›04Oø%À/ é°éŒ¾,éZlEÞà›LI-d0ÚÂ$Še²Äê¶‘mdKŽTí®˜BžŠRéÛ¯ü{ÚËWwnG*œÛ[þþ? ó»zr¥/½¼_ñÁ>ƒK½ñ‡‰t?iw~aKÛëØmíãDŒÈÎÏ#¨ d‘œw㚎Š n4Ä6ÿü>©Ã-Λ|šÅ»[êÆ»¤’)í‘Uyb¤€95óÇÅÏØ÷HøóàÝ?Á_þ-|JÖ쬵]RúÊâÒßK‚hín¡šÝlŸu£¬‰ 3W*$bŠÒ3œæ®¹û#è÷>øWðöÇR¼Õ|#£xÊçÆWz•íè´Ô¢™ä–_"²‚(ž)y#u|HNᜒKGwu÷i{ú~Få>v­¢O[îÖÖVëÝ÷Õ#è5øÏðyÜÆŸ>¼‚á­JvÔŸ=Z$hþÿß <*W¨3F:²ç¦ð·Œ¼!ã/ûsÁ>*ðߌt_5áûf•}Üb¬›ãb»”‚ÎA×ÅðO?†ZFŸá{üKø½á³¤Ac§ZOk&—$­¦Z´-‹ùöR+ 6ñæR<ò\`­~ü4Ñþ|5ð_Âÿê:®¯£hz|:uµÕúÛ­ÄñÆ¡CIöx¢‹q‘¨ö¥¦¿‡ŸŸ[z]ë×K½ä•´þ‘èÔQEI!EPEPEPEPEP$VxäEs@oîŸZüÖ¹ý‘h»ûÍæëãËÙI ó}®};[ÖíÞæU¿³¸‡S×/ÎðZËm-°Q[©1]ðÉúY^ â|~¼ý¢>øÛÃÿü;£~ÎV^Ô¬¼Eà‰<;·šÖ«#Äm/Rü¶øYAŒ ­æäí(’÷Óõ×¶óÙvm=-Ì©JÉ¿ë{Á~Iú?‚´ØãE”~ƒ^øËªëbÎ-:ÒîìxëıêS[E&ƒ-ÌK{öƒq¶åô«²ê_íÄ6ñæoÚÖÿaoŽwÞ-‡ÇZÇmCÞ(¶Y^)Gˆõ¹¡Ô#Iu†µ±»‹ÏUžþÒ·c#n‘MŠ(Ñê\x·öáñ/ü,Éþø“Oñ—†l9k>2ÓïÊÿd^øÏÄ kei!Ôž;“ϪÄ×–ª&DŽR–1ýѵšÑo¿à§ºžµâ+]·ñ'‡tH/íl4ÛÈto ¼—šaÕ FÔí x¶‰tòÁöAY¡hˆ‘ݰtíþ !©ø‡Ã¿¼W®x¿Àº½—öžw-Í—‡ Ó`³kû^ha½»[y\Í ê"»ÂIdÆËÚJ »«k}»ÿNýüÓΖ.Œ^š>»¥u¿m›J÷j-~ÂÑ_›:oŒm½[öGÐ|]áë#ãßŽšŽ¢¢Þ] ô ºdoäǨ(¾дwi»1ä'x‹â†üsã-:ëB½bÒÂÃÆ8RV ®×23[³\lO.f.ê­4gÊ9_£¾+Çûm[|\½¿øeÿ ”¿ u +MD‡@’-"í-ï ‚îJYîÌLdgO%\ÄÁÆMt¿Ï×K¯/Ç}¤S6Gn¾M&»ß˪Ôý ¢¿;þ5x‡öó±ñTWŸê:ž›w¡Ã+jv_ØO¦iš±ºóce¼ºŠñºû(R±ÈÉ9…güGñ¯í#{âO„ú€íÒßâÒxBÚãÆšU„º}õÞˆe¸·ÓT¬õþµû×ßó?Bè¯ÆûÿÁXå¹—T‡À>%µKfñéš›x@Ũ#L›çi-ï †HLž^6ê»ã#9ô]{ß·‰ðOáÌ߬~$Y|CƒÅw—š¾¯_øy®ïl$9Oµ2Hö»Xì¶‘[pN1‘ZN<©=ïoÅ¥úÝù&Rw|½nÿ}üö^gê]ùñ¯ÁŸ¶w~ èN•©|QƒÅO¨j]Ûè·:…ýÕƒª}–KÖ‘ü…xØ3±È™!r¬¤©Óø?'íÿ§|@Óü9ãè5 ‡:nƒ4VÚ†§¦hRm݈q^Og~³A0”d, ÇÍrb7æ”_ÙWõÑ»/=—«ò)ZÑÍ–¶³õßµµôý&¢¿$gÔà§z¦à©SGñŸÚßY·ñ,cð…þ˜²Dëa%®/®àuŠ`™ŸsDÑ“pê1ã¸ÿ‚§MvÑÅã:K˜""M3ÂM{l±ó>Ðoʼ’8U•~ÏRI±÷u…;»7`¬¹)ûMü–¯îþ¿öŠü­Õ¼'ûpk?³„´ŸKñ¾ÿâäºö£ý»•¨ø^ fµ–Þ_#.Ò$BÎ9 ±H·9ÛÀ1¯>Šø* ¶Pø*O |VÒt{'’Ò-vÒóÁwkÕ¹†f2\“<+2·îöܪ7ÍU WI¶–«ñIþ³ó¹åÌí·ü;_¥ý?dè¯Ïïz¯í¹§øó\¸øQ x—^øtšu¬–pX+ÓsöwÅ‹Ù6JL¥¹’]¥B¸ù›ÄÈu.æ{‘s[ψ¿•qü®ñ†ñψÿo/‡z>$xïÀ†ÓNÒÞèiWßh¯äÁ;iê‘°$ ³]'!š3嬲,JDUVÑɽ¯ø;iÞÿfۚ›“Iu·^ýû[©ûE~!èþ3ÿ‚¯x†ÒÂóÃë^&𾣜"ÖãÒ|-hÐD[J73¤2Ý’ÎDš°RCLj"*¬Jùž‹»ÿEŽóLÒ‡üZömk%Äš¡Ó|';}¯ì1³J¿ÚùPùí(I#IŸz ÿ»Ã?M|#‚RæNýž¿5ºþ–åB4y¢Õ½mùÛúÕè~»Ñ_Ÿ´¯Û;ûWâ»|D›âF»§Éà«Ë?A||2–sêÂ{¶‰™mH%xÞÙb!ÚŸ>ÖËxJçöì²ðOÄx5? Á¹Zü#±É.” &áQŠ8ãiÏ¿˜Ñ¼Ó4Næ0Qe®H»»y'÷¶­ê­wÙ5ÝÊ6iwmzhµôÖß&~ˆÑ_ž:W†lO|=øçcñUñm¶¯&•·„­-WE·yä£ý¤¼•ºÞd’D·ÜPPYÿ‚¢h7ÚׇüKãYÛ§Ø%³Ó|- î©`ú‚®dš]I#M^+Ef(-–ÁË©:ù~7ÿ/ÅyÚ|ÿ®Ÿçø3õÒŠüÄ2ÁD¯êÒy|A¥)ºž¸¶³ðãH–‚qöI ß#'œÖå¾Ô²+¢ÎÈýÞsÄC¬ÿÁQßÅ-¤&™®ÙxM,$¸µÕ/4 ÝËqvö,^ ¡­’‘]KÙÞ¥.¶Ó$ãæ©®dÝíe}­É©5r¿ó_×ü>ÚŸ®TWç׋‡í™©xGöÕ´¯ jº'ħðôvÞ3}:÷D¾mö]GH"9.¼ˆ¦?e‹†H6üŠFþa©ÝÿÁMl< ­_ÚéWÚ爤ðÎw§[ZËá´Ô-õ¹¢Hï­%ŠR¶´–¦q"ÜŸ5uFpmÕÍΕ“m­¿iåÖýŽˆÑ¼y®¾óõRŠüb>ý¾4ÍsâqÒþøþÓÂ>"¼Ôžò[mgÃóëÐ\ÍvÀX«ç†2í IH!óü¼HWéßÁ _ÄW> ±ðߊüã_ ëú µ†—w&±ä8Ôæû¼Ï4C4«2+Êг’?{ ÀeB»c†n¥>w£²võ½×É¥ëtìŒ*¾Zœ‹U®¾JÖûîý,{QLaEPEPEPEóŽ´ùgâÿÚ{ö¬ð!ñφ~øÇZ>›s¬ù6’ø'ÄR]ê.·¯ÑN¨ÀDµ§Ê‘H]g_,áâ'ÍüMñOöÅñOŒ´ßFLÔõhïî<5­K=¯Ùµ;‹Y –Ö&¡,®’YÝ[Åok#KoÐ^DE°<5ÿ׬£ðEž½ðãKø þ%Öuk+Yð.¡u¬icÊÕ¤±†&¸¶±hÐ %Óci%hÁûT´$.kŽø‰ÿQÑ~k>³ÕåðØê:ÒëöÚ‰--.uaÚ͆EH„1É¥ƒ5˲¬i÷”Åz#t䣣¿äöóWOMZ+>S%…©ÔµéFö¶ÛmõW>Ÿø‡ûB~Ò¾Ð~ÜøsàÔ>!×5= uY-ô^x$¼ñ=´@ÇÖgË–Y×íQ‡Û B€îeÃñßíûPø#áÇÀoAð¼aâ_i y­[i~×%þǼ“É•m^-qk²&™Y®s$C! Y¿ý¬´Tø%eñCH±ð6§âÆP¼ð÷ü&6ožonL»ÝÛ‰Äå]£)*£9Í~~ߺÄ­^K¾x’K4°yÝ´9ÛY¸†xá´–A$Ä ?kUŽrpæ7ܱñœ'g)RÚIßÎ×.©iÙum¸…Üc5³üôÿƒ¿#Èï?k¯Û6Éü=¥/ÀkÝJée¹šúOxªr¢g‰PNRaæÜ2wŽ6þ^cfÍp:'í!ûtëž;ðLj|Iðß\Ñ´{-8ïlm~xŠÛOþѸšÃuÔ‚YÎEspžBå‹@òoP¬«Ù\ÿÁN4›OøÄí½Cá¹Ù¸°ñ„7ºuܺ•œ"aä.xäºhîm[æ…üîÀ#Aaÿ^ðƯá;é^øyuáxKµ¸¼ÿ…ƒGÝõÇ“nƒËµvòÈ(K°R €Prk|:”e(ó^éoç×òÌñ“w‹²[ìïª~¾]µíc³Ò¿j¿ÚÍ牼MðBóÃíuvÖ–P|=ññ–Xìa¸h¥¹ˆùvé3I*¥Ìˆ!¡òÜ´´yWˆk¿Û#Å~Òô«ƒ^-ðˆµ]2æèjzWÃ_ȺDâ,JâæÖ3¹dC ‘2®ü†I>`£ë¶Ïƒ>6x‹Ç~¾°ð§€nô{û}"8îs4p´ˆ®Ü‚ßN|Pý¢þ!Yê_ ®¾ø:ÓâG†¼Jú­ƒ-Å”¶·–7v‚Bdx®%†O$´2EòÄìY‘‡Éó˜ükÿ8Ñ’×KÑtÍ3Ã_¼Q«è§XÒ½¬,W`ªHí ÖWE É‚t%YˆØ9¯PøUû^7Äø|x›àN/‹$Ó5[‹}w·w X´ûkùm®!IÒÁe%¶ërÊÅ¥$–;T£7+Y_§’Õ?¹ë¥»w§$å)(ôZk¥ök¯g­ÛÙ·Ó#µ§í/qã‡ú'Œ¾x†ËBÖîtèd¾²ð&½"ØI4Э̲«¥·Ù•ä q)X\¦å dWã/Ú›ö½øcñoÅžÑþø“Çþ¿×î“âÿøš{m5´Io#éÖsùé'™#$ª¨‘„fvd—!ÿा/ðF³ñ—Qñׄ>j¾Ò5]E-QPøÇûJþÞzŸ†µï x3ádžøŸàØèE—Z“]´Ó.lÁù_¼·ºº7²JåYã`\–ÉQ^c©ÁLt‹oø‡Á6|'&µ¤ÞOk¨ÇyãX­žÔDÌrfe}¡X#ã0O3oÿð¶Ÿã/ýàO€Î½w¥]j­scãÍ5 rÆÖF†9<©DsΪÙV(%X·’Xça«ÂQN÷Mþ ¦û[å{k~U©¿ÆÚþ-¥kü´½í}ÕÅðí»ûG|@7º§†þØ +ýEøâ«è­­–P‡b2£yÌ‹åK¹VA»j>|nOÛƒ]Ô´Í./ÙÛÅ>ÑîÝ'Ö?áQø®þK,óHm™#b§5Q’ îËÁé<7ûwZhŠm|ðsào4£w6¥0Ñ|R¶×ñÚæ,ÜÍa.™äiml·;óÅ_ñükDðÌÖ:ìøW¨|<š+å7ÒüF³´žÞî Œ"ÞçíGofÊÃ2‰fÌjÈ~lñèQ¯N‹p潕®ïu{¾·¾Ú«;lsTk’]®õí{[m4º~›žÉñOö…ý©¼ ñsÆþðÃøƒádm6]/‚uˆ£^53ÀÚ‚;Û—%™ƒ•=›œ„øÅûTþоø“âŸøàWŠÆ¬¥&tÏ™$m"˜â˳+:—*’Ú7õV²zuV¿Ÿ­Ê'({º]­~í5ÒÎúu»Õ´’>±oŽÿ㿇±ü/ñu¿‚µ¯ÿhꚕDŽõ=šUÛD®½ÜAí"`IVŠG áÍ|qgûlþØ׺hÒ~è¾$ðíûÝIg¬Ûx+ÄæÙš$|Ù£Ãp<ÍÊ1s#Eœ¢üÝ6 ÿ‚¥è·V¡©Éð¯Â÷¶ñèÇSŽ 7⛩I|~Ηa6êñOÁŽÌFÕ‰õ_?nŸ k þ;øƒáÁïèZgí>Õ ƒëöÖQM3:ù‚æÖÞœ£y“tÖಂH gV”ôµÝ¼µùéun®ÉmtíBÑŠkâå³ýíî½-{Yê¼×Ŷ‡íá}WRÓtï„>ø†öVöŸÚÇNðŠ‘´ .-¢š9¥ŽÝ.§¸ä1´ÄfK Í¿íOûXøo]ÕlüaðÃQñ¼×²5„7ŸH €$Ž#7 ²IÂlj"É}…¸‚¿n_Éá¿‹Ÿ!ø?¥iÇNÐ-üEªêZ>¥i ¼"qlb½™’3nñŸÞ)e[|I¸}ÑæZ¯ü—Þó‰þø_C2xvÏ]±¸“â>’të·ž_/ìÿÚ_òÆg[‡&±ó€4xy¶”S½—ŸNui¾­^Ú+#%^>ÍKKmç~þ_]´]nß²~Ïß´¿ÄxÆÿYøÏá?Š_´»›xt{[K¯ëº}‹ê?l™DVÛ“|J¤±vŒ Ø`N6±ñëö³‡Æ&ðßþ¤:E¦¤ÑGu®x ÄWfü>¡, Å24P¬kbLîeÄŠITÃ4þ 'iq«jZ ß„þxNé¢ÔMÿmEÖªm!/:[D¶íóFpÆ%þ탖ÁÅqúGü'A– è2ü2kísSÕ­ô«InæÞ6$u2ÌUáY Y“yF T•©âý®?ihu+3Xø#âkKhô¹u;=NÏá·ˆ/¡×Xo j±ÄŬ¦€ùy±·“Ò°?iïø(Wü >'ñÿÂÿ‡Ú¿€4hY´·z†£ ÓH’Åp^'´cÄÊÑ¡ Ô©ìO—â/ÛÄÞðOÂ+¹l< ©Ýk~±ñ«¬?ˆ¡°6©%ääÃlñH% eÀ&D %±\”1 ­Ò^_7k­zr·¯šÕÙ§V.Œ:½òe?;Ém×]5GÏíûhø–ßÄšÍ×€~%ézF©•v4ëOk6wúȺš-šæš]®á’&‘1#ùAÛõŸÀÚgâ'ü ,ß¼ {àO‰š„:Ƥ'„¼CRÒÙã¹v‘bEyUFÆÛ?&Ø`¿1\ÿÁNµ ïÙÝh¾ ð›àNïEÕSñ…´w³‰tèQ£1Ææ'†kÓÆÀ«JHÀ)fø+û~§ÅøþïSð†ìüAáßÅã9†â6Ô´ÝHW‚µ¶TR… (IÃB2;ôÇ9R”ÖÎ;õZ6šï¢»ßþÝØê)^qëÓg´lÞ»I­.·w×UÅCûW~ÙPZÂëö~mJþÏN\Ãà­rÚrg­âI´ l©9rÂ0¤{»¯~Ó_´ï†¾ j^)_7z÷Ž!Õ›NkÔð¶¶–6ñµÁŽ)Ž™oΫ:`ǹà‰Ðg,ªŒ‰^Á`þZxµ48|1á½sÆY펵¦xÎÒê:>ª¡vª}ÕLí+’jè~|6ß?ø7ÿlÔ|N<{áígß¼}âÍ7ŦŸmq£üAÓm-$³m|éº{";5ÕÄ;X,—‰ÍŠD [ÏY4äšÛKoùÚö7èŽWMÆÑ{í÷ÝzhÚû¶Ü÷‹Úóö©·ñ_Œü/âo€šþ‹c½§XèzýŸÃ¯ê67:uÅ´Ì÷r¤CÍ.âk6\)EݰÏŸ:ÐjïÚÿÁ‘ø1þüLø…âk­wY’Ò÷Zøyâ†=5n/|ƒ%Ü6âÞ=¦’5—Ë.“DÅ‚Ÿ5½3öý¼<]û>|F½Ðït¿‚É¡èš=¯ˆõ}6ùz½õÓõK«—Ž'·#Sa¶a+¬ŠÂ ,?ðT ÚiÑx‚_„Úýφ$}9ÅÍ–¦—s[¥Ô÷6ém5¼Q™c¾Y­Â½¸ ˆ.!g™T±L±0~Îö²z'¿hýîZ馺+FsR‹Ûîïù|Õ÷¤~Òß¶”–š®·¤~Í:ö»o-ÍÜBËQÑo´ë‹{ˆô»[ø²³ÎUmæ?k³Ý œGuä}ðd õWìÛñ×ÄŸ|/áËŠZøSâf£ö©…¿‡uÝ6Ócº1E#¦«iÖó1ï†Eqb†Hñ!ñþ á=gàߌë¢xN±ñW‰Ú<³xóNŸFü¹¥‰Ž©kç[‡™!Ø‘}ï9ÄGi‡ŸÁÿ+:Œ¾þÊø9§ˆ5hµKÿEkr‘¼©Óü‘nÍý¬¥Ÿu‰#ƒÎ;ò·RI>GZÉ÷½–þm¸»[Euæ¦ýï}[¿•ÞŸ$š¿V“ò©tWæ³ÿ×—MÖ"„–¾Ô4ý?Å3k­x‹ìRé’èžB^}ž;‹0/S}Ì^\«¶Pͼ »¼ëÅßðTX,¼Y¨ xcÀÚŸƒtkÖäŸÅÖÑMs%„Wït¸1þâh—OfDùã”Üžll%òó§FsŠ”UÓÕzmO3lCöIʦ–Ó箞º=7Ðý¢¿<g/ÛßFø½­øwÂÿtO|7Öu-çU†ko5í –=Ytï°´oÅr²Mj¦9YöF’mf¡ÕšMÁO£ÛäìÿaFi¶—Oøp¢Š)QEQEQE‡8;p[¶ih Ïo~Õ<â‰Úï¯ø—Cð犴?\[èšœ­w£$$ˆ\$p–&;•Ý•Îà8®óáí±ðâG‰~øSI}^ÞO™dð´·kg Ü ¥Ûj+f­î<ÁAŸbHÅc‘‡ ¬~п± ¶¥âû_ŒÂÏxÚ÷T»½Õ¬5=ë­Kû&k”‡QœÃ›öGe4Ñ4‡zG „mòßmx>)~Â_ |E¥øgá7€~ [|AÒ®- Hðÿ‡­tË"ØÜA¥´ê|˜Õ¼¡±Hsol ›3XNXÓNµß6ÏÉ¥ù4ߥïäêÆ\ҊѦռÓð=N ~ÝŸ ô}Q¼?âO øòŹ»µvÖ-ŸΧ6Ù{ÞkÿeÜqåä),Ö¹i¿à ^𿌾 øwâÃïøFÛK¸‰-vG÷CåÛùßjQ.Äd’qþ¥¥VEÜ’Üñü;¿]øyiñÄß þëÿ¼Bn ŠîëÀQ\¦±Ew-ÃùfÔ¼°˜®o¤yJ˜ÌwͶG'Òõ؇WðÅïŠü[û;|&ðÇlüNt-âûÀ‘K&«kÛ ·…ÎÄGHäŒ:˜¾ë¹W*©¶”¶ß[Ý¥åÕ¤»ý÷Ú¼bŸ4omwî“oðNúig¿H|û}ü/ñ¹s}mð³â,Ñëku¡^è:öŒÚ¯‡Í­”°j·&ÙŸÉ·-¨Æ«¼îErαä}=¦~ÑõqþÑZ:_ê^ šÍî–;wµ{§òähÚ‰¼¡*Ȭ… €«†VÃÃZ§Åïø&§‚|iàK]àWÂy`º’÷W‡Ä:wÔH4;Ñmy³ºÚµóbei“dJkȤ®çá×ÄŸØ{Æ~×ßVøKðïÂñëÚ>™»áë-ú½‡›u,"òÞ^‚9%¸c3iœ³‚y¯k EòïÑôíÙ_u¯ÎÉ4–S”yôÑvûž÷ÓKôòîÏgðÏí—à¯øÄáÿÄ­E¶ñ‡tÈ.!³ûV¿qumm4ÿÁ8$ðìþð}—Á»oêon"ÓüðérµªƒÊéj WEbÞCcòó¹sÏÞü^ÿ‚Xi~6Oê6?³NŸñ:ÊÊÒö;Ùü kðG5²Ûì-mö€c“쌨¿2~áðÆ­©ò9.u¥Öß/ÆêOòÛ[¾ü©ÞÏú~Zëÿõ~Ö?¼­CðúÛá·Ž<[u£ëøoOƒHÒ-õˆíâ˜YBÓÍÇ$pH½¶G·…°Û^Y'íùð“âwñ/ïŠ^ÐuMFç¶v× wÚåî-“É‚K[Ïôrd¹æGŒnF!öa øòçö-øãà­oâ]Þ¥áKÝ õ{+ ÏéºsÏ­\Ç8Ù+Ik!½Wy{#W-ʃš±¢j°'Œ´ßx¿DøðwXÓ´Ï'OÕu$ð ä’(ÂZ$†Ô‰vyKäÄ]ÆJ‚¬¤¥f¤½oùýÖZÿEÅ;«Û§É¯Ë_›;Ÿ€Ÿ´·ÃOŠ:šü=ø࿈ÓtÛImíæÔ좂Ûu«$RÛ.&iwÆÍ´–@­µŠ³ âz×í]á/üwñ¶£¯|ø¦ióÍáÍ[ÄÍyÞÁoöwŽh­ÅÓyV­öœ6ÄY™ÑKDÀLß´?üÄíׄ ð7‚†îf›JÔP#…c³i85g/o®÷üz¾©ìFÁ©Aë²Ó£þ¿­æ_Ú×÷Ÿ ¼5ñ#DøYñ§P¶Öo›O²ÓçÑ#´»Cåy©q$w3D¾C)V¬sœ@ðßþÞ~ 3øwDÒ¾x×âˆíçÒoõ0t¨b·³I]xžy@[„Þ5 |1G;X_…ŸÿcCá®e'Âo‡¿ ¼#§O,ö>_ C:hÎZx¥¸0ÚÀÑ[G¶Ý7 ´üÌ9ã¾ Õ¿à–ò|Hñ·¢x‹À~+ºÕ“wölþi:r[ª"¢ºÙEPPE²²ƒ òToç¡BÕ’Ñkßd´ûîïÚÄP­MÅNZ§òÝùù[Céãûjøn?‡šÄ÷øOñ: Áâ«ogÓD’C,Ìu¿jâI>d8›*BÆÜgRóöÖø=cðÎ÷⮯¦øÓKðäºuœËug xSÆZÆœÖéþk}RöÎ ¶™cµ•ÀHœ|Á¾U ÕN Eï¶Ï_ëüÉN>í·º¿š¾Ëµ×¯o5Ìx[þ =¡Í?‰-~$| ø½áFþÑŠÇÃöºu•¾¯>¶ï™öeŽÒwo´ Y@òÎ>IœW«h·¯ÁOøêO‡‡¾*j4‹Q‹OÔ4ø|>Íu¤#F®·7pó­`!Ô•žJ‚ šó]7Å¿ðM_ÞKà~|+ºO Ácuð¦XâÔ'’??0£Ø+ªŒ¾ÐJnÁ"¾±±øû8ë—~ñ¼¾ɬXÏý¥¤_ÜxNÚ+Í:v@†X̉`r€)#k`Ò•eh½ÌÆi®eµî×§OUÒÿ}ígå^*ý·>ø?Æž%ð-þ‡ã©üG§j«¤ÞC ºÊîv™b’u™á;Ô mlår2k‚›þ ;ðrÊm?OÕþ|wÓu[ÿ14|ñ½Ü×îYu Y^³ÎYXÊL±±ÞYTî땨­þȲ‡‰¬ÓNñ'ìËû?øƒOTòÖ ïiÓÆ©ò|¡^ýÜ|Ó4ôQäåµKßÈÒ¥¹½ÝµûúÁü…ã?ÚƒBðåÿ‡ô«?|@¸žûJ²Ö¥¼—LE·Òí®.…²%¼É2Ê_+±È#'޾/ü[áóø£O‹Køgñ/Uð\ñÜÕ"²·$ÉF¾jþÿkEºXã<ùˆìC¢…b>ÒÖ~ |$ñ Ö¾ü?ÔÝlaÓ#’mÝÞ+X¤ób…X¦U#“çE+€ÀÍx—ÂïØwögøW£ÿcX|,ðOŠbK†¹·—YÐtÙ^ЗˆÄvè‰ó*±`»Ù”330ÍP»½úþ;}ÛÿZÅTù=ÍýßÿcÂÿ¶·†|SàŸˆä ¼}§x÷Ú¾¿yá «½-uãŸ>RÄÂìÂÊÌ ù¥Ä[ƒä‚*{oÛWÀº¶ñmÀu?h^ÿ„ˆhÆ;HŸV„Ï%¿—ï8· 'ŠHÈ•ãû»¹R¤ûn‹û>|ðׇµ¯øwà—Â=Âz–œÚ>¡¥ÙønÎ;ëݺÖXR0 ÞùS½¸äÕ;à?Á #Eñ?†´¿ƒ¿ ´ï ëv’XktªZê¶®<Ä#Ù,l²Œ ÍrjêºMÊËF´õ×ðòüI¤¤—¾îÿá¿àöÜüúøGûRüø[Š4~ xÇáηeywswb¥µSq¦D×Õ͢Æë9ÔB6 *v)VV?Fø3ö¾Ó Ót GS¾»¿[U»7–NËqd‘Åpà¼{JÅT·Ýfש¿ì§û.É»Ìý›~¾ëshÙðvœsósúŸ¸|ùþ^Ÿ¾“ûí[¯Ùëà¹jÃOø7Å:æ•6‹¯hú-¶¦ö¯–SÏ .0r«ÁÅ,Lã½+ì÷ôi~6#JIY)õjïÊéËæÕÒ>\×?à¤ü*o­¼Sà?Œz»kisu6˜úeœ×)åE$Ë ºtÝ,Q3¡Ý°µ™_ä¬è¿à¢Þ ±¾ž/|øãá;æ76úfo«k:ܱI8?g‹M¹¸VÜ–Ó8Œ‘'ÉŒn*§è‹?Øóö]HÐ4½göø-âù´ë?°Ã{«xGL¸¹hÏ™»sy|ÆY‹m,œ|Ç;Þ ý—fKªÏâŸÙßàg‰./ÌM}%ÿ„¬'këÆd//±•YwgA*_*”z®¿æ¾zëÓMõ2¤çÊÔÒéoÕ=üµ·ùokûdø_ð|SàøçÅ·Ú‹4ïêz0vzÍÔöñ,ÒCsqC¥ÊM‰vHñ|Ñ£†MÞ=á/ø(—§ð¿„õ/|(ø™áÏß-·Û¢³µ´¸´µže±°˜Ü ¤¯©YÇ`3eÕ$dûL|ø>4-cÂß𪾠ê0Þ_éÇD¶6··:ÔØòiIòWc¹F‡7àïí#àOÚâå­åïÂ_ˆþ¿ÓtëSÁú•øk6¹²›MÒîn£¹µ†Žãý6XÙv…*á·ªûOÄØëöpø› ^躯ÂO‡ú5ô–1i±júv`—ö–‰/˜ I$ÁˆÁ¢uh]ÕÑ•˜§á÷ìÙð;á Ñn¼3ðÏÁ1xŠÆÒ[(µ©4‹_íŠHáŠUó’5*¯µºM©²Þ 4UÂ+Ióv|¿¯¯¥ÇIÁ+Nÿ/—O=Vû|•~~Û_ï|#á;À >6xgÂÚŠYÝéÏ«ZÂÒÝ›é´ÖI$y/$™ÿ¶l¥v”îį¸ïGAç^ýª~ü=ñŒ5üñF›¡ël5‹mt^ ¤µ´’-ëʸ·žëÌžm}öÅh1Èçil¹àý•¿f+m>"ßöuø“¨²ŽÕ<'`!ŽÜ%ºU[B´µP ` X1a-?e_Ù‡NÒ4ýMýœ¾éº%š¢YÚAàý9 ³ '–‚©¶;kd-¼+Ѫ³¢œ4öi_Ͻ­¶ž¾E·JÖIê|¡­ÿÁG¼¤ø—ÀMðÇâ&“£jÑæH¯l¢}RôNm“M6q[K*J.g¸h±,‘º2e•T†¯Ð?x®ÏÇ^ðÏŒ´ý7Ä5–©cüVzµ„–WÖ‹"O <2®pѰ ¬#"¼+ß±ÏìÝ¢ø Oøy­ü øqñH'Y'ñ‡4ë¹ïLÁ¯)ê®Î±Ä¬ÛAag;E}¤húO‡ô­7BÐt½;DÑ,àK[;;H-aE ‘ÆŠ¢¨rSVO›W¥»%moø#ï§ŸüÀÑ¢Š)€QEQEQEQEx'ˆ?fÏ…ž%ý¢>þÔº­ˆ¤ø»áê^ÒgX¹ŽÍ,/^'¸GµWHÅ¡Œ†e$m‹n¯¶¿“·Þ켓o[Y¾úëþW‡[¬½;öKø¥ø«Ä1µðψ›UÕíï-uxgñ>«=ޝÄÓÌëqi%Ë[Îî® ~dmå ™cؼ «oØËöyÓç´Ÿ x³BÓ¡±Ñ´ø4½;Æͦ™o™°Y´vPÝ­²J‹hÒ¬bI#EŽFtkåû¿ØOTñš|NÔîüUðëOÕ·á Sá二ڤš\Ú­ãDÓÉ!‘¿å®à˜•Œˆq±Wš¾ ÿ‚yüZÔ¾"ø›Oø§¯øk\ð…¤:%†™¬\i’É¡§Ú>—,°ˆ?µV3Œ­À" ò4o(žxßÙ>ÿÁ<Ñ<;suâ·7ö'ÅÚµÁû4ß»xYé”[‘„ò0# ¨» ÆŸû ~Ëzv»eªi>ñe†·em ³ oë©æÚ*L‰op‹{¶xšRb˜4nÁY•š4+ó>¿ÿÏÔn|sðb|_ðXñ'Œü?‰ÿ “àÉôë»O*êúx¼×“Ë<·¦5…eˆª¡Ù"b„WÕù§¤¹uŠïü·ÛO¹™ëíeÙIÙ÷[s|Õôß§›úKIýŽþèÚf¤Zé.lì-ã´´7ž9×n¤†ÏÉù¯ЍI(+Í<ûþÇÚž‹5çÃ}'Æ:o‡Ž¬.xÇúý…µ®§kpÊóC½ê$oFŽWŒ+H‹åH]ÊùÚãþ ùã½'_‡YÓ¿hv‰§ØÛÛjÔü }}¦Mh.a¢¸Yµß1âýÌ¢/5ØÅæpÌ«±½§Àÿ±ý®áO^ ðÇÅÏAªxž×ìz…Ή¡µ¼ÖW^lÒÇ%È®Ó7•2ÆCb¨`¡.Whívþi«?ŸÞŸÞ[ŠIK®‹å³_-=Qëcà7ìÇe¨k “Cq¯ë7öþ)º‰u;ù/ å³n‚ìÜù†H¤B¿!Þ­„ÀÈLÓKý™> èžñ7ý+ÂÚ—„õ}Dj÷.µ~dÀ Jf2[ɘѷDÉóßx±>à¿Ø‚׺OŽ:_xj[x}´5ºµðï“6†ây„q;NÅ­ÌÁ‘·g ‚â|#ý‹\Å d%+•R<÷@øûAã­/áÞ—®ë‡Ä=/:u¶Ÿuñ]º»mBÜ}›Þ6ä‰v°ŒåUmâ³ôߨÛÄø{ñ«ÁOñÏF‹ÄÞ9·‚Ê+›ÞÆ"y˜Îlž÷3Ï"ÊFYP·”„ôg|'ýƒ|KðÿÅ:ˆ¼Iñ£Cñ|G©C5¼šÕ¥K›h<·ó`"~`Ùu¥RRçm;«?›åvüt×£èaR B0ŠëD®¯§–¶ô4nÿb_ØgÄžÔt 7ÃwÿÙzQm=£Òü[¬„Ó¥•\`$7[A>k“Æy®Ïá¯ì;ðóÂ_ ZùZËþ _¬hÖ3Zxoãw¼/)¶†Æ9´ïMlcµŒ>ȱ¨«‚Ά.73Ç ¿ðOÿŠž ñgÃk/‡þ&ðwÄO†ÑßɨjE4÷´¶K½òîyjlñ¹ó2g¶W”˜–6]§rï9Êqå”ï{hïnùo×þÎz«Ýp²Wz5é§]WõÐûíÿcßÙ¯FðÊxøàø~øMb°MãMzvq0Œ:‰Zí¤LˆÜ6àí#'<Ž?àž_õ¯†w üÐ"ð·‡ô¿ÁªkÚÜV±yKwª^=ÝÔã$î’W%¹êy¯Ï¿þÂ6Þø7ñSà6»ñ?Á~.>&‡N¸ó.ü*X¤ÖÒ‡7WIzÿiiA-˜þaœž1OQýçøsû?ücðžµã£âÍK]¶´†ÚêÆ8td°¿ŽAäêGíwDfI6;ØuŒ!WÎRQ㦟=-øm÷mÓiB.I·w·¢Ñþ¯O/=K¨¯ËŸÿÁ<¼SªÝh:ï‡~;iÚ>½¦Ø¢Ù\_xmï’âá Š9~Ö‘^[­Ì–I4òv4̓×:ÿ¿àŸºÿ€>|\ðª|`ð®§ñ+Å+¦)ñ/ü!ò¬QÅk°›i­ßPy'·«n‰g‡#$ä–㥮ªÖó×ôß_‘ËRmJ *êW»þ]íë}6ïä~—ÖMö»¤éÖWz…ÕìBÒXæhÁÆå‚…!9ɸ¯Íkø',šŒWÖº·Äß j6ÜK;ÛIáyÚ "‘ƒ 7Œßáí  ‹xØ“ ³.çÎj¾‡ÿرÐï5 F|'þÔy¤½¶½À2Eu ä—PÏ%ÃȺ¸ 2Ì-?ø×™¬´vZê¾î¯å¿_¼ý ðo<'ñÃZWŒ¼â+Å^¾ŒËg¨YJ%‚å2FåaÁ~£§kºN­q{m¦ßE{%¾Ï4Æ A¹C.[ Ž„×äÇ…ÿàšËàÈôMáÇÇ_‡z·e* R#àÖ™uXEÕ´òM4j1âížÃ9%v¸Ìm› Ñ¿àœW>Óô9~3ø'DðŠýšÛL°ðƒéÖQ3%º%ÈA~Ê/#hsÊ)™ò“,œ–ï§ü·Ù~)N÷­.®ÞŸðß×Cõvª_ßZé–w…ì¤K¾FX¨ú($þùñàÏØgÄž øñ?àŸÅï Ü\xŒiŸñ5oÈR&‚8y&¯ØÎóù,Å„‘Òdî#œßþÄ>#øqð³â¿€µßÚÏYÖ|] ÚèI¬\èr!µ½X ¡æÞ½Ä…\CöªS)·8 Á^I=­o7×îzyö9ë^6å×ÒÛ÷×ÒÇß^ñ¿…|e&¹†5›}dé·azbVÛ Âýè÷èv“‚<‚+cYÖ4¿i®¿®_Ûiz-´·——S6Øí K¼Œ{*¨$ŸA_pÁ?&Ó>xgà†…ñšD6~7½ñ}ü–žº±±ÖæYäxd‚ÏQ†a*´ÁÖaqþ²0æ3¥Á:þ(Yë>"ŸUý¡~x—Ãz§ÛZ]>÷áÝÓ5…ĶpۥݤŸÛ`¸ 4’lo5de!Nçl1 ¥%OV“³èÝ—ìÛkåçrð¶•M<ºïåu{kó?S4_L×ô­?[ѯ`Ô´›¸RâÚâ#”š6V¸ æ²toøcÄ:¿ˆ4-V‡QÔô¹D7é6Ø$9ùwãkA);H à‚+á½7öAø+¡üðÿŽ|3£øwOׯ³…¯†ž"ò#c5´–³Ù­ßΆIÈ)"bhãlddßÑ?díào‹¾xâw€£ñtþ*—^_]øWíˆgis"_[ÅyÝJcg¤DNA#¡ºîÎNšºI[¾­_î»õ¶†t.áSFï-íë{/Kù~Q_žß?a[߇Ÿ þ*ü:ñOÅæñ™ñFg¥=ü:ÙäÓï`‰Õoã3Ïq+æ9'•ãF‹åÀb£Ë.ÿà›ÿÙñ|?ÑGí 6¼–W³ëúu?VÒ4i$eDPK18zÖâŸøª=Bok:~µ ­ËÙÜ=¼Ö)—‘Üd~uðGÂïØNøswñ^Õüm¡j>ñ/ƒÛÂqZZè×vϦÇ%Œ6Ó%¤—æD6Ë"´òƒ+îvnÿà•z­Ä_ØÚ_Ç߇ú;”…5m/Mð~¥¦Úêºx²µ²ŠÒhì5È'H"[{‰­ü¹Åq0‘Xùl²mF1•W;FÚ?;»«z$þvé¬JrQ‹Kvï䬭Ù;¶Öý?½§íGL³m?N°°iÞé …"26s&ÐNI<ã¹?Z½Q%®†‘m«°¢Š) (¢Š(¢Š(¢Š(=ýh¤9ÁÛݳIù˜ß³×í¹'Œ¼AwuñÏH½ðlþ#¿Ôô¨Û^¿[>Ò[ë9cŠá>Eäkoì HcT¸ˆ$ˆ×N¿?fÿÛÀø§á½_â·‡¼/y7„SCðAÒµé5'×+goLº|ºlW“4s‘ ™üÔ”n‰HPže¨¿üz?‹7×4?xÿC°Ôõ :]@ êvö6÷Zé…ìmdÔàDñÉ¥›‰'ÅÁ€”+¥iÞý¾là¹ÖôÛÍSRñœ«£É9ñü#ö\@ÚäWV›¬–R¦ÞÒXnäùÝ<ãº@¤ÖÉ>Ž?z¿Þ¯¾êÜ·¶¦U$¦Þ¦¥ÒÍÝiÛÕmÕõi÷ÿ³íy¨x[Wðïí$Þ µŠýå¿Ò/µ­W[HlËÛoÁxfÇÛ™2šÓûCM°Ñnä›C_ô˜no{‹6µ„ÏdâØ]ÎÎ)Õ14›w…7ÒÚÛ¯ø{ëÖío£}ÉNiBqkm5Õé}šþš²ÕhtŸ þ~Ö¿|[¦x‚óÄö?¼.þ´Ó5-WñÆ¥y:ê¦î6žúÞ{ˆk„ÌLrDÌåaTx8~Câ7ÀÛ[Åÿ>"êÚ?ÄÍÃÿ/.ÞãE‚Ïâ.µg j_ïü{âÝÖÃIÖ-4Šæ(Ê9+ݺ7övøÙῃiá/ ëÚnã+Ÿ_jÚËÛø»R ¨ÚM,Œ/Úq F]\D¨#% y ÄÕ‰šíQ6©ð§TðW‡¼aew7…bk›QôçÔìoÚê×íŠæÞC¥µòÙ›¯+æ6¦@pH+œ·ð—í—âÿ„´ÿêÞ4ÜéñYøNÏN]Ì«îr.£’9r'Ú"Þ'•bó ›n+jÑr©Í+_E¦Þìº[K>Tû8Û¦ÜÞ×ÜŒm¦þzÁ-zì÷Þ÷{ïæs~ËŸ·Å¶—¡XÛ~Ñ××Ol|GwÄ;Ë[›ýˆÏlÓi1Yû¦0GŽSˆ˜ªëé?´çìÝûQ|a×uû üDÑ#ðÍŠÛ¾“uâCL·ÔÐÛJm4vÖÒy#Ï0Ì'Œ´„!BðÞ`|UÿHžQcíN1Å,lº“ÂÒAvQ¸ÊLWFH%–Ñ-Ë0†hÔÌH„hÇ»xÛIý­/~>ü1Ö|9¦x£HøX‰¢ÉâGÓn´R÷G÷Ÿj·Ü7˜ñ#23ùJŒT,±ùj¡VTêB?z×ÝkÕ½¬¹}RiuH'.XÎ{Ù=;ít»·Í¦»¦âÓWNø÷ðKöŸñ'‰®à_ôÿxF}Z$§Æš…ŒÚUÊÛ͘­VÎx%¤FggFýÞq» 0¾%|ý®ü_yðu´¿ŠÖšu†—áˆì¥gñƒáM–‹§jmõ¼w¾0Õ/f•-Œ"h•ŸMó-â14m<]êà3gð/ÀÛ£Iñî‡âoül±»Ñ ñdW÷ú}ÏŒnõ+ÝCƒVé§ZIo&×UÙ%ÅÄLð¬Œ掻ÿØ~Õš†>8Ác¯Ühž3m#K}ïRÓà„¶¸±ÊnƒE¾{dWo)äˆ1%WËž<ðü“Æß<+¦üCðä%ñl·7i©/…u2Õ,àVÛH³¼¶²«¶áªïSäùD›GM¸¾TÖoçk»Û]–éÑ+œ8Êü”Ü’nëd®ôWK­¾-mÕ4ïcêCáWí•syûL¾“ñÁ^Myü 󷈵 åÓ^?õIj¢Ïr ˜$ÊÁs_9xö@ý³4VmPø…| 5®› |YÕ‚Z£ÜÉ,èîÚJÜÏ!ÞŸÏF8*@^kÐþ"ü=ý°lþ|½ø'‰ü5ñsE—[ó ¿½Ó¯-Íy~ÍúËpÂ[vÔ9•2¸)ƒO²~Ü>/ýž™¼[Ämâ³x©$¹ÓtËo éדiºËlŒ/®mZ+!š+’Œ2#qŠÂPäÒ.üºt×[z¾É^Ú7ÍÚ—ðϼ9ñKú–—k¥è×PøRÇQ]*é.î ò<}¾-Niä›a ñÏ q°¬¤QRîÛþ ›4ÞÕ|;ªx1ô™5w]GNÖÆ™my–pÌðE,mpÊîÂFTî®÷M{G%Ó^Ÿ~vÛ^–iKýƒ›ë«VmÞÊöÒÿðV…?‡Ÿ²gí኿¾$x—âLJ~ ˜5 ¨üVº‡5e›SÓÝÁ€[²ÚbÜDC9µ@HÎCœ(jôO~Ì´O¾.i^#ñOÄ ;^øqgãµÏìÉ:ø±¥ë?-õKk»«ëˆz½®£l.'‘á0%ˆHð agýàB AÁÎ×>~ÔV?³¿„´Ý?“|UÔµ«ûå꾎îëÌ‚u¥–wH²¿—"E¸û„ç <Šø* ¶Pø*O |VÒt{'’Ò-vÒóÁwkÕ¹†f2\“<+2·îöܪ7ÍW‡‹ŒUÚèµô½ûÙ7kõ뱺©yµ¶ÿ¾ý/å3è|ý®|Câˆ3hž?ÒôÝãWó4«›oj¶’ÜéF9|»wµKSŒ°HÑæXdÜ,¼Û÷O˲~Ç¿ðQ)üA{¨ëÿô?ÙGqyw¦~(kºSXܹ»[yÖ;m=£"¤¶O%ÃÆÌ®í–P_Ø?háû{Mñuõ¯„^ñv¡á]&ÍG‡çÓo4‚Už ar÷p^]@ò^G ŸÊEo³m–Éæý‡‡ÿomAÛXÔuoOâD¶Ô†˜oôÿ ÙZYʶм– ®$A<ªñ1Ýq°ÛW NtqÍ7kÙ-ÕûmçÞÞ}´ª±rj:>oM/}m­å·]xþÅ?µ^«¬êºŽ…ñ¦ jKVú»5kCJC ¸¦ßj>Ú®épr¹UóDŠU€ ·ì¥ûvÜêâm_â×…ÅÒK;“âµuk¥“y ¢³Éb ¹bŠãl‘¤*«á‰[Þ8Ÿþ U{â;-/|A{M2çS¼ðµÿ„üÕ»[<ðZ=óÄæ/žt: Z8[c+2‡è58¿à£^ð•ìžÒ÷Z NžÓO4)õké%Xní#‚Yb´”ˆnVI/B7Ú>LjÂãº.Wd¯¯]w뮾{ês%vé¾¾õß]šWòÓM•Ÿ™ ŸìÕûqÇã¿ ø¶_Ëý‡eqÁÐÏÄ PÛ¤›¬Ä剱?kŽAã¬S ±›…UÚJoþÑ¿²÷Æ¿ÚWWøeã9íl|Õô¨þ%ëcEº‚{‰wZ(<©%>r¯ÚBÃ.Õ)’§mu-?à ‹'Á»Ï‚ZŸ„õ yì­âñ¶ªl4÷³”7—,±*ä4Œ³‰‚,6<Ÿ<2ùtø)Šîÿá7凂¶ÖçÓcðüw0‚ùJÚI$»’Öb,v³/Ú‘¤—-¢ÄÞœS·ºÛVÑÞ/Ë]tk­–Qt  ›»µD“[Ù>–FîÛ»lõ…ÿ?lÝÛã¤Þ=øÇo¬ëÚ¦’l¼) ñT·V6’#FÆÜéqIe"‡X^ušäÊ#Y|¸äÜÀuoÙSþ )£â wÂß´\>t·û3O½øƒ©¬6Zi¸»–KݧL¯#Dö°-ã+ͤ˜m“ë¯Ù7Xý¢EѼ7ûFx?â7‡<Õâ“]µeuEFû;gNYÖi&·%¤hB9;0ýe¢°©.ismñm§Åfüítš×G®å5ug­­ø&½/i=~ãóëâgìûûPx‡6úgÆ;ä›Oдý?[»¶ñŽ¥¢>§v‚è]Ì#³·(ZA%¹Y V3€¸ü©ã?Ùþ +㈿ |]uñKàðÒü7â«o®|k¬O6§j-õ+k›Ÿû5dÓ Ñ\Y“=¼„†‚Aåíc¿öŠ!6¥)3æôw¾‹d¯Óg³DÕ§ÅEôI}Ê×õóÞú­lÏÌÿ†_nâ'üSãz†ƒiâ}Nï^Ógñ…Ö©i¬i’D±ÀÐÛdm$Anò\Ai×÷æD–8׿cÏÚçGø‰ñ+Ç |}áß ëz­Î«Ž©{ñZžCcq7ˆ® Ž[y¬å‰|™õ=8Gï#€A3E€Rþ»ÑN3q‡${5ç­º¿N§Tq &šM?óo¥µ»ß}ä_|-ãü,ð·‡>#ë:޽ãSy=Ö¸ÚÄ€´¬Ë¼k[f¸¥T;BŒBŒî9cë´QJsæm³š1²°QE%Q@Q@Q@x6¿ã?´?Ãßh´Íwö{¿Ð5+ïxý¼M3h:¤Oµ±]9—θ«H|Ô;SË;°J†÷šCÈ{w†iîá[É ­Ì­on¯hÛ¤™QQeG¢,Ñ|ôýœu“I_¯2ßNï¶›]$®^:ЪÛ÷TæOk=½é«Ý¦Þ–ò+ø(ïÅëgAðgÀ‡’jqãÇyi®øÖãO»µº¼›KFôùžXâKë–w^#k%W \+ÇÞü3ý¹þ+øïâG‚|ªüÐ<1o¬j7}²]wPs´3[Ã, ?³B øÌ²ÈÖ»ñåAæK´^yðûöÄðo„µßxšÿön‡Zø©«jI}wàË-Áäk©þËko,÷ºŠ=ìÍ®÷¸@¨É ®ÀcÅz‡ü·á槯èþ°ø?ñjó]½3ÜÃl—z ”é°ÞÅe5öÇ¿W)Ä¡Z=¾qÚÁ#‘ð‡Ju"ç/mÖÉõß²Öí[EºÝ©/i+_g×KkÛïïmöòÝoöêøáà_Š~3ƒÅ4ÝkÁö—ú{iÖ°ßÅ5¬qßÛÛÛL«”ó\M$s™U‚yQåàšöÿƒ¿µŸÅß‹žøÇâM7áW†í|A¢h1êzwwujú•À¸¿‰Ò[Ÿ*EâÖCH@œgx*OÒ¿><øcö†ðV—ãÿéÚ§‡®íâ6»hãš9|éàšÚX yöóC%»¤‰4q²¸dÆäu_SñO…<1ãjþñŸ‡´_x[P­¯´ÝFÕ.-¯"n I‚®§¸ Š^ÎTèºøÒ·7[÷ê¿«míœå·5íÙ/Gø§ó?5¯?à þ>¶Âº ýž5¸´=JÊbU¸þÑŽûNÒe¶¹¹Ké`ûùBÁr"±hå¹El¢NçÅŸ¶WÅ}à×ÂÏ‹þý›|SãÈuû­FÖïJÒVîkÛ‚y–9„ml­åË%Õœ'2F£p;ëô"ÚÚÚÊÚÞÎÎÞ KH‘bŠ(*D€`*À *zUõ‹TôwZïê­çë§àb¢ù“oK5m7¾Žöé¶Ö}®~0|^ý¬¿i;ø«JðüÞ*ðXÙ4ɧE§ÚêQÍ#Gk$`yšzÈŒ7Ȇ=òäî!¸}óãí¿ñ+áwƽwáµ·À;ľ ŠóMÓíµè5»€ðˆ¥’[˨Ÿ• ¥¸ŒotžGùÇÊý#¢•%ËW®úúÚßu¿µöœïm4ô½úõýÏ öÃøŒŸ>-|Nñ‡Ã>ËVѵhl´½Ê;ç’{yT™ä0üé#t—lQùeKä×—ZÿÁHYss_KZÞ}ïëòÓmѪjÖk«.‹ú×]ÏÈ}SöòøË®øgBÓµ?…ëð‡ÄÝ•ÕÜwºMäúœº—s²$—ízrBÒȆEW[ïtj÷ŸµćÞ,›OÓ<áûÏé_ÙWWwðø¡¿ÔÐË$‘›gÓ¥ˆB6]gWËš>ÿÕ WJÓ5Ý6ûFÖ´ë_Hº‰ ¹µ¹‰eŠâ6de`C:ƒVïºîÿ[.ú]zÛÔµ5}WõuþV]¯ßSñ’ø(—Çk¥Òüm ü;ð>«á^Ñl­4ý;VŸXMÃÊ|»Û„·²ISjç@Ò‚€) ó_Oøwö²ñ×>|Zñ¾ ¼ðïˆü7y¥ÚÁsg0Š j9Ì%® i`¸òÇÎùŠH̨ áÇÝ^ð—…ü¤A x?ÃÚ/…ôH¹ŽÒÂÙ ‰O®Ôv®†º*U‹øcoø{ÿÀßô¶PÝIŸŸ~ ý¯>+ø·áÆ_ˆ1üðññG…b†þÓ]¼˜j–Yf˜¬`ç$HÌ#HŸsmLÀטø§þ ñSÃÉ£ÝEû6^ÝÚN ×ѽÝò\hö†,7sF,‰ͽ;‡Ü§‘Šý,ñ‚ü!ñA»ð·Žü/áÿxfwçÓõK8î­¦dpèZ9RUÕXdpTÕÒ"$h±Æª‘¨T =c[ÞO—ÝMõóéý-e8Þéi®Ÿ§ëþgçï…l/ˆú·Ã/ˆß|Gð‹ÃÚ‰¤ÜÙZYGkªj7—›o™5ä?Ùé%²F[扈’£8à5ÿÛ¿ã›<Ö:wìùáÙ¯’úæÅþÝâ ëhâH£gŽô‘§<‚Úèä3"3r ŒPè©iÛêßçwó±•/uZZÿÿø åæ~SÛþÚ?úâøöéøåáÍ'HÐþ'|)‡ÄW’K•Ÿˆ-¤¼•õK–’1Or-¼éçÈ”,$–0O×*+XM-ÕÕÿ¥åoÏ{•VW‹QѽŸoø~¿…Éß ~Ý¿•¶ê¿  ñ6­w5°UŠòâÖÂ9<«_2Ö Ø™#™Œò°Iä—& 0Ê7½'¿¶ßuo?¾+x‹àņ‡âM9m´;FúÿíjŽ& ÏöÝ] …äØNç^qú3E:µ“²µíò×õZ~;™(Ù-{ü¿§úŸZßüÆvGÅZOÀ3Z±ÓVÐ8åíÿñn×Å$ÐàøkâÝ.¤¶¹›Ä†+ë›×­²#iðZ¤J–¨“\&<ø÷°þ™øwá·Ãßë÷ˆ|+à øo]Õ.$ºÔo,tø šúgbÏ$ŒŠ ³1,ÄòX’rNk¶¤åV’Õ¯¹ùµ.{ßM4ôïëÿ Òß¾ý²¼i®|&ñ¿Æø"=/K´ÔôĶÒfÑõ+;í.ÂêÖ't¯»¸’NLh¨€yKû;~Ú/ñw[ŸAøðãTø55ž>’ׯ$–ú´×¶ÒÍöxähФј& ÉÀ }†7ŽGû¶¢–'hZhb™£22Ê FÁ†z3îhæå¦ö·••Ÿ­÷ר8{×OM~öî¾å¥´ºó?,uoø(OÅ -t»éÿf­JßLºD¬—·R\é"©Ó.’GXîÑDÎȬÀ*£gíê> þÒŸçý>|d‡LÓ~x“QÔ5'“EÐu!¨ ›HôFh¢yï4ÂÐËçÃ+nÀIµ”1Fý+¢°¢¥9IÝi¥¾ÿë¥ú.¤y¹¹t×O¿òºóÐüƒöòø‹}â AÐþ é²Áu®Ï¢Ms­jƒiïmz°J“°ÒÚ#4Öå®íV"Ë:!denвÿ‚’üQGÑïõ¿ÙŠâæþâÖk™íô^æüY£Ûê®%³‚}¡¦š)8dµ³ Έ߮TV²w½¿­?ÏQFqQµµïó.Ëä~I\ÿÁF~-ÙZøËQŸök°ÔôßY[Üê#J×/n.õ“ìN·zl3ið¦£hc¸¹ÃÇ(‘ä²x­ã»•¼µõßÚcöÔø‡ðFûÅ ø~#^Øé¢îÚÚïQ¼°{ÐÚuÍÚ\æ+)ȵ@–nê¯"ÏqÙ’ªÿ¢UsFÉ[müôÿ=tûŒæô÷tüL_ ÝkÞÑ/|Ci¦Xk³ZE-äS¼öðÌTXätFu 3"’9 t­ª(©“»º&)¥fQEHŠ( Š( Š( ¼çRøÁð«Gø›á¯‚Ú·Äoißu:çWÒ|36¥ jz••¹Q5ÄVå¼ÇŽ2ë¹€ f½¸»ï‡u?h_uø.ÿân—cs¥éž"ŸK‚MON³‘§·†ä¯›Rã.ŠÁXÆ„ƒn¯¶¿“·ãkù\Úo§æ¯ø^Þv<;Pø¥ûÁi¯ëº§Œg˜ìšêâ=Rîiì65ŵÍÂÏç9à´3ÙÝy…îÚÖrÛ|·# ÓõÙr]3Xñ—ÁgÒôeK«Û˜-¬öéÀK*+± ò~öÔ»ãAãþÇ_ 5»ßk^>ñ×uïßëw7~¸ŸNŽ16œÚwØ<‰®. bì% µZi¥¹D†FR½…û%ü Ð|-ñ?ÂÚ7мm‡.Ÿrùé¯Þ–›…?hŸØßÿüIáßë_| âé-¿².µÛLŽÿû>wCbŒåO³Étø|°n+,+Ùli:Žã}j×â„΅ỵ-wP’.ÓK¶v™’LàFky•¾l©ƒm¯ñgìMû?x‡Zñ&§¨ø¯âw¨Ï-äðXx•­ZÜÉu ãùE@–0g·I>VÜàSŠ¥ð‹À²‡Âë­cà÷…:x  ø„Iu©ê: ŒñÞ\j\\G wsÍz%û<‘2Cž ÆPÒ‡fÍvÿb?ø¯Iñ$Þñw‰|3ã[Ý>þÆ+û¶û]·úDæqç@†&•c’¡dC‚U‹)*s©{Edz¿¯D¼´jþw¶Ôrj¦š«…îßž©ÚÝ×fz>û^þν힗ñ‡áÖ§f’êÓ^²¹YÊ´«$kS4û£0˸4` ’¬öÐý“":$z‡íðƒB½Ô¡·žÆÏT×`±»¹YäX¢Ûì’îy.ÝÛF2ÀÐ?à_ ÃþÓ¾"ëï5]-!Xg‚8,c‰¢•åŽHÄqïŠeyùèë1bX¾âMzO…?b„þ Õ­õm\ø“G«Úk¢ÕÃÄ÷°Ù#™`V8Ô¡;qÀ±:ÒI4ª>®öí}­·]Ýî7$ÜšVÑ[^½àwòØú"?‰?æ×5¯ Åã? ?ˆ4ëS{h/Í´€c28ÏÊ£räž›†q‘^s?íQû5ÚÛKywñãá5¤hòI$Úõ´kEÜÛ‹8ÚBüØ8;yéÍf\~Ë? ï>!üBø™{/Œ/|Aâ}*]SIuii&ÂR,üð€È¬¡l•sgɼSû xÿÃúì^ñgcñ•Ý·ö¦¹&¦%¸³VK;©UгÉ3*ítSι8ɾFÖöünïÛ¥­Ýé¢ÔÖ*<öoOøo_>û-ÏU“öÈý“aѵ_Ü~Ò-´ ŽKëÙ|MfY+†(ev,a‚67§+ñ7í½û7ø[Áš·o¾%xFòÚݧX,¬õÝ:{­KÊ+»È s±ÌÖuUñV°Ç‚äñf±â/k·±Ï¢®—öK5¶£4Ï:Osss7œÐLîÑ¢¡Kx™# ›˜ä|MÿõÐuïŠ7ž2´ø•®iž¿7jÚq³Šk«É'•$˜-Ä™X•Œi·djɃ†äÕJ/–ÉûÎþ‰ôó¶÷ÓªÓs7tÒÓK÷óû¿G©ôw‡?jÿ€^3Ò5gÁÿ<5â{m?B‹Äwmy†ÞÅøW{‡e¶Sœ‚QŒàsZ¾ý§?g¿i~(Õü%ñ£áˆ-4(Äšñ²×­.F‰Â’.)c#rƒ“ŽG<ŠäôoÙ#ᆇ ³Ô¼pçÄÚShú³É¨‚Ó@z2áG€Àt<äóXÞý|ðÃÃ~3Ó>júœ:¶«£O¢¡ñ#>©e Ríݾx^@vŒ"ŸqÍ[k–O­½nì½-oÄÆš«Í+ZêïÊÊïï¿üÔuÚ?à‘$QjŸ>iÒ9 ‚mbÜÇneºÊ@êA©¼?ûCüñf«â Ãþøƒ\ÒmÿT³³Ö­åŸM¶lí–dV-¶Ó‚Àgàº?ì ð'KÐt½müCkåØéö÷†ÊúH–öæÍH¶¹&C$¡¡ÜÂ52 B°|W¡øCöOøgàß øóÁ–š§µmÄvðÁ©=ö°ò\f0vKÊÑÁ9È8ÈqSQYË—]íçÛüßÝæºi¸¸®mô¿–×ûµKïò6ïjßÙ—L¶kÝOãÿ 2Ñb3´·>!µ‰UQÉg?2ðyù—ŽEs·¶Ÿì±nÒAÇO†w:‹dY[jÚÜêÎ!óŠ[<î‘ND1(åWøŠ×3©~ÿõ«©ïõkân³¨Möi§¸¼ÖÚy%»Qc»Ë©Û.ØÕNݨpIRÄš±£þÅ t)ç¸Ó¼Añ) ¶w6.²j‰"˜ç‡É€Ñœ1Nã¡äV‰BÎ÷¿ë§ü¾O«J—/*ï×·—ãküí²o{Á¶Wìåãk Zâ?Š^ ðæ©§4£RÒõfÈ]éÂ?¼ò¬3Hª÷+ŽõoAý°?g/YÜk:gÅoÿÂ-FQ«\jVð[ˇt!VG<·o3ËòÊ©*ç}¬þÁ?5í&].ÿSø˜öqc ݾºð\[YÅíU£Q˜Ü»Ü²x`½¿ìð6ËI´Ðì5O‰ö:U½£iöÑG®·î-ÌJ“"2Ë"‘!n †U`G–úíÿ ÿåýåú[ñþ¶=Û´ìÿñÏÅz‡€þ5|.ñ­Ž„æ-bm'\¶»M5ÃmÛ)ÈC»åÁç êöZ.§}ñ TðÔš½ö´º=ö®otø§»ŠXî[Ü+ÆÐ¸ž\ÂÁ£ùöíØ§ÂïØ»àïÁÏ ø§Á½ø‹¦øgVÒŸI–5ùä’Ù/-åŠb|á+w3¶Ó÷ ŠSå»å½º}Û}ã§{{ûÝ}Ý_¯—㥞ž•û\ü*ñÄíá†\ñL×ßeû>³§µ¤Úkyñܺüâ4m&V^CÆk°Õÿi¿ÙãAº»²Ö¾6|1Òï ™­åŠ}ft,ŒF g…ŠSžŸº“û­øSûü ø/â#ÄžŸÇv7vW‹{3jbX†ºll)€¹¼œàcï/eZ×?`¿Ù·ÅšV½ øËÂÚÏ‹ô;á +i}ªO²ÊÒ)neKHŒl­ä†»¹\±d™£bS ò«rëßï_¥þãžÙÁ¹YK§Uú?^×êz}ßíMû6ØjºÆ…}ñßá5¦·§À×7ÖrëÖË=¬@Æ :Ü£3DG>jcï ò¶×ì³'‡¼a¯øKãÉ’hºuÞ¥uaá¯Xß]H–öÿh‘,ÁùeN”|é’7 æ›»9kµx6›4I±ºg&0€A.˜å Ùø³ö›øàßé^Õþ+ü9_ÞEauŠ|Ca é³»œÃowåM21‰ä ªË’å r¯ñì)á}bÿÃw>øãÚ=fêûZŽæågmBÒæ=Kíñ0UòäÔ¥;ðÛQvª©Øéê>>ý”~xÞ µ‹Pñ/Øô[k(`˜KC¥ÜIsd|¬ʳJY×xó$ ©8­Rê¾ëëó¶ÚêôvµÞµãZ“ÖÏWµöZ+»^íïek_bÿí¹û/iºìzE߯?-›ØÜÞ®¦º½«Ú³A°Ën6Èd3*Iì ÊË ,öï|Sø}ñKN¯€Q¸a´;€ÌZ´žÚþMþ.Ëç}‡Ñ¿ëÓ—sã¤ÿ‚dxWþޱñFoŒ2}BïÄâ/²ÅiDÍqw,–þ\l°É«uåȲFÀ˜c¸AÒ­ÊåØÁ.ŠMÒ}4NÛ=U­~ñO^—w‹m;9þîj+Uw¯g{ß¿¼Ûû½ä½ÛùÇÄø%Ç‚~!Ol³üL½ðž”š‰ÔËAðÝ…„M˜4ر¨QMEòðSçnèâd§?üËÂfÓP6.4Ívå$·¸Ôãð½ƒO{m%ŒöåÁ2¾Ó3ÛUa/‚²®Aó|(ý»¼añÄÞñ×þ!h–º\:&ŸöÛ_j¶šv¡oér^N· aÍ#¤7©A²B×7p£É’/døOû=~Ü~ø‡ðûZø‹ñ¦ûZð]ž­}u¬YÅñk£p<è|‰Do¡Ä%†X#5‹:f)q)íaß$£8»suíÓ^»i¥í³²½ŠÍ¯züÍzúõó×Õw²=[ãì#ðƒãWÇüo×¼Wâ½Çz5¥´wZ~›-´všêGæÄ­{DÏ2{›ûm…‚ywÓ<ÅŠHügQÿ‚[xGPðÿƒáhOk¦Ê×·0O†l…Ö›wp·è×òË6E¾! WÊ^NæœÕ¿cßÚûGøãˆ>"xj ›OPº²š÷â.¸wos}m(Šâg*¤qÛ¥Ä) ;FŒË${å=áŸìëû]xÀ?lüaãí2ãâgˆ|;™¡j°üKÖïRÂê+«÷Œþúɦ!¹LðÆÒ¹‡çµXí„ÅTt!QË–I^Û´Ûz_Ê÷ü‘Ï <^!»lùT»­ýßß¹ì?¿e­?Ä¿µ/‹ÇÆ>Òõ¹c†·Õ|?oug#‹;»@%ó[2odãý…^A5çÿ`_ ~пí~#ø«â•ÕͶ“m£ê:h—ZuØH¦SçBç. ›z,…ŒeÒ8o$›ö`ý½ïu-rÖ÷ã6–t*š8oˆš„ñÇmý£4¦á“I2É*Û˜¹ûIrU£*yÀéÿ±GíÛà»K§øyñwBÑu ¾Ío·âv°dÖmcûQ›t×:]Á†âc%¾.6K$YTº¯Ì®åg²Z_î·ãýhˆ-)I]^ÎÛtwÓu¢óî·KíOÿ±~™ðKÇö¾5Ó|{6³iÚZÑ-`û7ÄaŽdùÒÙ¤…`Ç$Ùi«éRjsh‰©éï¬Ç¸’ÐL¦dˆœ)ÁIã8Å|á¿€_´ö‰ð›ÆšßÅí_Uøy¯i³Ay}ãKÛϵhEl³Z}¡là3ÎVçtöÖùÌ‹ ÇËu¼û8||ð—¾;\·ŠtmOã>»ºèzÍÇ‹õ&$E¸ÇólÚ…#- ry›<ÇRÌE/f¢ùo¢·žúþ×îF¶í­ÿM:÷¶Ÿ{?Ag¸‚Ö..§ŠÚÝç’F ª=I< z:H‹$n²FÀ2°9 =E~zx+àíq>™ñ2Ç⇌¼ ªXëž½Ó­´Ãâ}GTMÕîV£ž[XG’ uWf·iw¢à•>%ìÃÿÓ4= ÂÚÆOizU–•u§Çz¿õi®ãi-bDb³il“˜HêX«¢ªà`-r{Í7Ûó’u“ôdF¥ÚÑ«ßôùëwÓ¡úõE~süaø-ûlx¦Ûà}¿€>&x3F“KÒÓÆEâÝ_JþÔ¸,‚V…µË8(«Ë'š¬F«Tß>þÑ>øË¦é^,ø—ã=WÀúvˆòjPÞjZ¦§osx\}Ã}rb ¦h¼·Ïî÷H0£«^¿‡ùôý7)ÊË俇è\wv³O=´W0Ksß65pZ<ôÈê3Ž3S×ä3þÌ_·uŽ»ñÅ7‰þ/‰õ›˜£–ø|M×-›RáWEÓ[’DÙ E“*ß:õ>¹û<üøçàŸŠúмsãy| ¥è—2jV— Öõ[[­Nk©»[_^´fTHL‘ˆÜ$Š€8AÖT’Ô®ÿà]ï¯d´Ýëk;o:ikëEnÝ},·Úÿ£´WçWÁÙëö§øâ½üEñRàë#t±À|_ªkžd2ØG$w°¯šûäüÆrÈb’ ÄÞþÏ·f­iy?ü-ÂZ̶wqD–_u{Ëx5;ïó-Š T6›LQ7ÌŒÄdÄ’çqONÿÕþ~{]jG+ëýy|ûíݧ¡ú—Ua¾²¹žêÖÞòÖ{¨Æ’hI€år=kòÆ?Ù»öò²M X|lÑŒ–÷QÉi{ã½bè^34 ²¤±¸)2–‘n$€,j~jë> þÍ´Ž‡ñoÁ¿>*j^ mF\ë0èþ>Ö.Ú›V…Z@ÖP%ñ+µn2AR0u(´ß7õÓúéÔÖT’Mó#ô’êîÒÆº¾º·³¶\’W«“’xä?"»µžk‹xn­æ¸„,jà´DŒÀr29æ¿5/?e¿Úõ¼CñMŸöŒÓüEà+é7øcI¸Ôµk{« ]#/Ú.L³+pBB ÈW äcüýšiÿž8>;¶O x²#c%¾£§Iñ?Y¼}h¤-Ì{fUä[÷’ȸPÌ0¢(Â2ƒ”Ÿo믥÷èYµ'oÇoÑ»y«vgêÅÝ­¢¤—w6ö¨ÌLŽ3€g¹ô©e–8c’i¤H¢E,îÇ@ä’OA_›_ÿfïÚ{ãŸUµñõ–àñ]>ˆž-¾²û@Ëuh-Ù$ŠU”­ÔÌpüã ò]7öQý¼<3¬ÌÚ?Å_ ø‚‰Ö}CYÔþ'ë¢ëTbhodtùmcTb l#~Á!ÚäŠÎÏ‘Éîº}ß.÷Õí¥Ö¦M+«=á«ÿ$ý$º©%úûÄPÇqm4W6î$‘°eqêàÔv÷–—žÙ.­®¼¹)<· å¸ê§î5ðÂÙïö’ðö™ãý/âoÄXõˆõ¯ Þé*m|oªÜ-Ëù‚) F·ˆZíW’®ÈÉ×iß±ßí‹á?êzwÃo‚¥ÔoÒ}R Š:¼u’\ÉÍÞ—?‘;+Dï/’í#FVBà–3^|½_Ÿ_먹W'5õ¾ÞVNÿ{·ÉŸ°TW¾þÕ>#ñ;ÿÂãM*ÛÃQèútV÷ÍãmGO»[„’?¶[=­µŸ‘(š4v[Ã"M9UGÌ>\“öWÿ‚’íx®]?ö–ÑßG½Óæ·°ûWŒµ9 ·²êb[ \ â»2ȲÇ3¤À,ˆHò÷£INVm-÷ò·ç}=íîóº_ÓñWü6õµºÛö>Šü¨Ñ?f¿Û¦æöîÿÆŸã¼½]VK¤5K{+˜ÄЙ-ãÓQí”Æ’«[<×( gÌrÌÕèð~Ï_´ö•ð—ào€ô‰‰£êZ •í®ºãÆz­Ô·÷M$ k}öÙ¡ûEȈ$û­¥Î [ cÑß}?¿§«Õ¥v«“»ïúŸ ¾•«Á¥êš~¤m¦kko:ÉäL¿z6ÚNÖÁäV…~lj¿hƒ¿²'Äï†^ðt—~4¶ðEÍÖ®øÅÚ…Þ¥ªx‰ä˜µ·Ú£D,³)r¾c(ŒÁoÔ¾þß¾ðÕÖªŸõƒd4éÛB†Ûź注YjR]ZϧZÝÛµª5å´N²[ÜLóÅ#[K#;dMcNö×{}öª²õBP÷¹[·ùiÚý½¾û~ÐQ_ üTø%ûNkº/Ã#áÇÆãOÒ,ཿŸ\ºµo㹉î'uX¦‰q– ³Ü–Y/ó/ âÙ³ö«Oƒ_<-áOŒ:Çü, ÂÚ’ëw÷uXÿ¶¼A)µh™®^Îg–¶ñ7É #¥¼…T/Jû;[«ßUå§â¾Y§zŠÓwè´Z?7{Û²éfÿI HrI¨m®­¯mỳ¸‚îÖE±8d‘OBàŠü¬±ý›¿nÝ&SugñzÏV‰¡µ·š×Vø›ªÜ<ö¨426-.$I[ìú û\q$‡í1¶Ñ¸ˆ¹ï€¿²7íàø¼Ὲß,4ŸèÏ¢[>™áŠ:¡µ:mµ–Ç·Ž?ì˜& ³õv¸ÿIL4‚2bãI=ßõý>¥{{®Z·:wÒöë³üt·Í{—õîŠüØø½ðöËñÇň:…~$hþøS}ì¸->"k:uÜ{4÷Š2ÐÃdËûKï*b®±£2³dWè‡áÕmô-ß]’ u¤µ‰.Ú)LˆÓˆbªXg<•R}aMóG™éåý[Ô÷gʵóû¿ÏðfÅQLŠ( Š( Š( Š*­õäz}•ÝôÉu,0ÆÒ²Á Í#2B¢Î}‚Ià MÛV4®ì‹TWŸü4ø•áïŠÞOøffßOûmö,7Ö­o<6·2[O)êVXr¤©ÆA"¾yð÷íÕðÄúŽ¥¢éw¾1MnÔOæY]h³[LÆnM`«(]Þ]ìe¾ê£E)>\‘»>ª=^Þz7§É7è® 5'²v~M»%êÞžº?i^-ÿ‚ŽOñŸÄú6¹ð¿Å–ßW¸}Uµºð³Ë[©„)tèÈté-âBÍ_nG¹„ø—ËηÕॺ¯‡ážÄž×&Ò즎ßQ‹Ã=¶ K®¥ Íï– Fö$’Âè}— ~Ö¿³Ç‰¼o£ü9Ò>+x2çÆ7¢X’Íu(ÃyvR5ƒ²¹U»òõGd»$»€ ^•/Åß„ðk—~ŸâÃÈ|KÌVséÏ­[ ˜n$ c‰£/½]±U#'iÀ85s„¢ÕÕ¶ùÛ®»Þêýôï­)ï¦ÿ†·ÿ5éuÓOÎ/Kÿñg†uùeRñ‰n¯‡ñŽåÒR2§ô^Žÿîo#Ó­þ2ü)ŸP{9uxrûúf¹ñ—ᆛªjóØÛév²k–Þv¡%Ü‹¨‰îq+º„ Û† b©K™(·}—í§ž«OŸÉ΢·¼¬“¿Ü¿Éê|¦ø³öÜøƒû7|ø‹ðÛZ×¼EñkûSY¹Õlöh0XÝÛ½­âØÃs c ÌHÖ›§²u2á,Íë;¤épñ1û±¶6?Ƶöž‰ñÇàωu­GÚÅ_‡Ú¯ˆ-5y´ ìaÕàiÓRŠ8ä’ÓfíÆTYc,€7ŒÕ­_ã7ÁÿÝ^Øëßþh—¶×Ieq æ»k ÁpêYauw]”ò@'µf§{+)-=¶ü,õÑïªòƒŒ›úoñoéwµ¬ÒÓCãƒ7·m·Ä¹t/‰vº»ü8°Ñîc°¿Ôl4'Mfçuȉîf²¼Y¡”b× ¯”È_qVå~rø‘à?ø)Ä‹]ßSÕ~*趯mh'·ðõ׆-†ª."’âãt¯ºkXÄl-%™de¸ŽN6þ¯‹ LÕõ±ñ+À £iñ¼·÷cY¶òlQdxÙ¥}ûcãt%ˆ‘‡PEr÷ÿ´wìû¦ZéW×ß>Ag-¤6RÿÂEhVéîf[„"O›Í”ˆÐŽŽ5œ¢çdõ{~7ûúS*q^--o—üá=ïþ UªøÚ-+ÄKâo x55 2ɯ,´o ÈfÓšæ=ñõar±-Á’gåâHšÌ­è~+xOöÅѾ'üRñŸÁ];ÅW—ÚƒEg¤]êRè“YÇvÌÈ¢6‘e[WŸMØŸqÊ•Lšû?Rý¢~i éª|pøEc*Ãqpc“ÄvaÌPfp¾fHqåïŠØÑ>3ü!ñ'‡G‹´/Š?õO y6· ±naŽ;„fÝ„ó]Ø,Åk6“KoÖÛýÎÞ¯¦ƒRq’¿Kiéùï¯ÈøßÅz§íÕ¡|ð¦§á¿øÓÆÿî1•¬Z>oc¢FðY‡a<–7 },wLÑ”*ob¶+"8ØÈT¯%øïð> !©Íñ—áL:qm‚á¼Ef#-…8ÜdÆpëÿ}/¨®Ç[ñŸƒü5¤[xƒÄ~,ðÖ ÎѬ7··ñAo1|l #°V-‘Œr1\T¡ËöZúßï{zmÔÖsmÛn¿×—_ÏCàOËÿ¶ðwÆýsÇqÜk>1ŠÖÒhðE¡Á Øódó§FOÚ<¡+q"C¼¶ÕÇOð‡‡¿oÿøBÇNð¿„>$ø{P˜˜ïf×ïü56¥,L÷d7Úb¸¸‰7ÂÀy,§„0 £#ý¤þxWF½×µŒ_ Ö DhïäëVÒ»j%K-UrMÃ8‹ïœp*µŸí=û<Þx'Møˆß~XxFîÁµ(Ëh‚Àª­!`Ï•1îÁåIÁÁ­ëTn.mYhï¶Ëõ½ß¯bhÞqÞíï¯W·¦Ëµ»Üüõ×>þݾ-ðŸöOˆ/¾3j“ W³ŽKÙü)m{hëµÇ5”‹ºI%VÆï“A5«â ÿà¥/moáTÓ>(]Á,k?ü$:+x> ˆcC‘ «s(Q;ànòâ1c8eâ¿K×âŸÃ7ŠÚoøX~ TšÖ Ø·ê°){y—tR€[;]ySÐŽ”Ýâ·Âï^ÙiÞø“àj7+¾Þ bÞy']¥²ŠŽK  œŽÀšªS”$´¿/F¿5ÞûýÏM5S†‰4ﯯõ¡ù½+ÁG,t«û x[SÐ#ŽX—Nƒ‘ÞÕæ&âI‹Ü2-Ò‚ A\ÂW;Æî+× ÑüQy§Íw¨Å,’4×>m¬SÄÍpªÀ;‚1X7úÿü›H²ŽêøÅÌó%¶±ÿ„f+ˆ$/2¡žâ(šÙWÌ#,fç[Šý·øÓð’kvšo‰^°‘ݧ†ãYµI-LØò–Aæ|…ó…¯lÔ–þj‡n™ñcᮢßh{LA®ÚÉûõRÍÊÿ|($¯P8ª•Fç)Ûw{tKk.ËçúÓš¬¾þº·wçþGÊOyûfØ|2øAæéÞ:×|q¨ê7-â¶¶ÃQ_h ¾m”Æó G´”Å$·;YJlãÀ¯nÿà©—~)ŽâÒÓV°ð‚ qn–þ3µÃ,K$r³Íþ¡Ìñ´¼Ú¨¹ÈoÓK‹? -4½\ºø—ðþÛEÔ·gÞI¬Û,ø )Ëí“”¤òÃÖ¼ÃÆµ·ì÷à.¡ñ7Äÿ Ú\¦M¼1êK. ª#iZG,ëÊ!Àؤ±àfœª®iI¥­Ýº/ø údªr”T#é~»ßïv·¥ÑùµãO‡ðQoü*‘~7DÞØÙ Õï|#£kj 2\_ ›ö´ÂpGÜ+´™K1íoìà§Q[ZxF+¯ˆ7š!Ž‹^°‡RŠÚ6‹÷S‰›ÊnMÆ(Ú IÃ)û¿¦6> êé²Ù|Yøit—–©}iåë¶­ö›g8YS|ÈI0È'½S¶øùð:ò][|bøa-Ÿ‡^õ鯻kåhÍ,bH„ï¿l[Ñ•—qF#ß”§Ëm¯o-5ù½|ßÈËW'~××{?žÇç«ÿÁImí/tý+ÃZŸ†”k3ý™¶xvfŸJf—2Ë›†U½ ä²m>IŸrá~øø¨üXXèÿt?§‹m‘„Úµ÷öbDo`¤¥ŒÌ‹&аˆŸ0Ç9¢‹ãOÁÉ䵊‹? æ–uáT×­I™eRÑþ`ê¬T¼‘œTŸ> j¼:‡Æ/…—ºôŽbŽÊÚ=ø ÅDbMÄ€¬qŽŠ} O7K 4¬–¯üÏS¢¼;\ý§?g ZÝÞëß> iVðZ5ü¦oY)Kep6<Ìì BîÆ2qÖµîþ=ü°ñ%σõ‹tïCge¨Kcs¬AÑÛÝ3-´…Y‡”`ŸÞÚqš”›Ûúþ¬Í’ÑžµEpÚ÷Äÿ†¾¸»´ñGÄ?xrîÞÙogŠÿV··x-˰wP³ñ’yªšWÅï„úìwShŸþk1A —5¦µm0Š$‰%wm®p«‘¹'€®Œx ™oFú"¬ïcÑ(¯›¼û\þÏ¢Ôæð'Å x¥-^Ë?e¿€™àºHž˜÷8ó e•‘r:’1]UŸí ð_Vñ_„|á߉ñgˆu¿µ›tJ ÍËoĬÞS’ª¬ ’xÜ õ«”t’± J×=žŠò‹?uey4¿Œÿ 5$[ÆÓÙ­üEg JÚ¶CûÀŒ¬Sï`qƒ\ÿ…?jOÙ§Çz¦±¢x+öƒø+âÝ_OÿÛ}7ÅW/mû´î !ÆHØú\õ?×ê]Ÿõ÷~zïErú¯ü¡ßÃ¥k~/ð¾ªK ÜÇmu¨E²DÒ¬K V`J™0Y•z+ MøÁð—YŸM¶Ñþ)|:Õno\Eg¶·m+]¹y,a\—;¢•p3ÌN:©ÀµîÏE¢Š(¢Š(¢Š(¢Š(ª:¤÷úuý¶¥{£ÜM ÅݲÆÒÛ1 Jeê«.G Ž*õšº°Ó³¹ã ¾ h´ÿìÏ kZ´:+ͨjöBÒÂÞÚÿPºf–õ’ÞÞ1›ƒñ—¤wG‡¡~dz?Š>&]~Ó^MfçÆÚ®­}®&¯i©³Bd¸Ó#Ó%‰#`cò6À³y,¥Ò™ð_šûbE.Ž€àF}+ò[Jÿ‚dxƒIñ߇¼SÇm}ßW“Y¾Ñ“ú¥¤W—­©O|·àÚë1¯Û}½¸’T–&¶†H¤†Dë•=–Vùu^–Z/$´KD¦ÔµÙ¶ß]{ë»m»ú¶üý~ãö/øQðÞ_ëzÏÇ‹š]•–§¡XéÂùôo.[´¹ÐÒÞ <n&ÑìÑ€ “q0O/1ù]/?`?„ßþ Ëñ#]ñ/‹$Öeñ Lj&·—JÐo-¤y °È w§JP#é–sG:2Ý$‘³„;ÏZOüñ4ákc{ñáþ¹áøt_Ø+Ÿ êÕ͕ż÷^lO«µ«ÚÝÉm€Ì³<²‰Cì¥ðöC×~\üm¾Ð®üE¨¤þ´Ðü=e©^@‘Üj eWš”/4ÖñÝ4ø¼©%&3§³(S+¼»WÄIÆnNí'kuWZmÖËôZ3¦ܱŒ­g§OŸNîþ]QçÁ+ü ¬ÏªøS^ø‡ãóðÞÂÏOo ÊntíGQÒu[UÌì·Út°´q.¦É»y–Ék‘倇߼5ûx+áæ¥߇¾4üXðÞœuÝ+[µÓ"A†Ò ëqo‰ 4㺎Ú(å‚2#P -ß>;øeÿÙø¬xÃWßúÖHå¶•Ñ®Òð‰^ãÈ’‰ KæÛ¼QýÑi9ï~À~;ñ¯Åøíþ=xoFðÄ—/s£éV¾ “í÷NÆâY5¶½ÃÅ&ÐÖ¨™¿ˆo<´%üß-“_àÒ7K½Ýöívõ:êb*CÚ:zëuýíõ×n›þˆô{¿Ù7\Oƒ´¯„ôÍCñçÄJêðí®,4¥*±Æ"Àé;^w y×­’íÊÃÿÖø_±>¹ůú|ÓH÷k º3Aò_é] i¥×|ç,¡‚Œ(<×¥ë_³Ž¢øÏñgãM·4]{JÖü+y Ûøa4‚ãs¬&2×fôE.׉±º LÀ:òOÄž ÿ‚[xÊ_i××Åøb}Cæ í´-JH<;©Kcoo+Y­¾¶¶Ëùr™Õã˜ÌòoY# –Šk™$ôJß-²¶úF?zìoÍoµÖýuzjý9žúÚö½Ùô>ÿÄø/áÈ4¸ôß|Nµ¹´·†Õ.-¬<=k$±Å4Ædò4´ û4e`duA½˜ó]®›ûxgà ~2xS¾,ñÅK¯iözf®|UªE ”ïoÙÚícÓm¢†–^dxbBïgoÈ'ü'ÆZïˆþ%ø‚ãÄž øG¦Üx¾fÓô+M÷ìÞƒ‹"¿l];X·y%Sßg;ÐAæÑH +zkÁ6/ü)ð~™*ê>c/Ãy$™ä¸’íñ]Q˜}²_0•&Lòs§V^Í.kó%uê”Þú7ªZÝ_Cš()9í+ýí;~‰ßf­¹×j?°Çìåñ'P¾ð…¿ÅˆW(ð“YÝ\%íœ×š.ªö-n5k‹i]¦ž ìÂc$nÛ›nwgØ¢ýþøHør[ÄÞ<ÕôÝDfáíÖ,>Ö—9×ìê¼Ø—ç…blÁ9å¿gOÙCâçì÷5õ—ü.O|DÐõq®´÷~»¶»KHb»%»Ba¹^â w‚<¸J€ ž#¡Á/ ³¼Õµ|Uð·‰üEq&èu'ð„ËsfnüµG}AÈÚ÷°Æî$2N!%'8¾g§•ß_ºï}:øiTå„%]I=tŠÖËÏšËn÷vÕ{ÿÃýŸ&Ò5ý'Oñ?Æm3ûGY´×dž]|j-mqÒÊ‚¾ŠxàLÈ¢ü°ÂzzþÆú5ï‚< ào|Wøâ{/ ±·ðÝäöúj\XiÆÁ,^Ê@–¢…h•É‘ãóHÅYp¸ðþ ½ýŸá+ %þ3^hž ›G¾—BÒf†ÆöðÈðKÛ»«¨ÚiJíïèÖ¿­ÔöðCà-‡Áý'áñÅ>ðì/ŽÊÚþÕôátº¦.žwY˜NAUÃGæ>|ó\‰?à˜_ üX4xu¿¥²±»°[E6‹BP°¨S£àØ¿Ážø‰oñ#Iøñ6]A®'¾Ô¬t´³Ö/%‹Êk‰DvK*6ÁŒC$Ižvæ¾rÕà›:¶¥§êJ|lÒ­l$[t³|/(K‚7fkHP_ ¶Ó>lyùÈR ã¶ñWìâ_|>øaà7øé;é~Ôšê}2m.ö îÜÊΩ:µÌ2G•Øíu,`©ÌL¤¥f£+ÉîÿîßmÛÓ«[ìeEF×Ñtù%§¯*[–7E ¸Qm%­Þ™i,@ðíÝŠ#!òÐ˾(»Ñ€ÁÏø'mûøfkø_µ¿ŠJ¹Óä¼¶Ñ|‹[©šãη¸–%¸ó³Ý\Gº7e21ëšoì«â¯€ºŸìßâÏø[þdÓ--ô{ýÂø^i×hâG—þ&7·Œñï"I+„«3Š#&©»o¦ô³×É$•ûîµ&n“·ådî¿ï§Gä­wöøA⿾ø â}cÇw>Ò.~Ù§¤Ý[è„óle%›J‚Ú$ Hb±ÆŠ^4b>Q^UâÿÙÛöhðâkšæ£ñïÇ´½}/HÔÙïôæŠÍÚ;[{x&’îÎG-1Ž™˜³<‡ 79è?à›séº>—£éÿ|Kª5¾—&š·Ú¾”“]Z·›#¤ð4±HO%‰ º% ÇsÞ;ÿ‚fjž(Ò!ðΉñWán…á#s¥\M¥Üü;–îÝÑí\Í MSÈmØy§~¸ÚØ%º©rʳS•£&®ü®¯t¯´oßî"z‘§´imÚúÙ|íØõM_þ ùð‚ÂÚæêŠ´¶–ò»k¸N˜ÓY_ ¬ÑæÁ“¤(¥]>I+œ=·ì³cÂoˆ_ >ühñ_‹õ÷ÔôHoî¼Dúní6{`vp-ôàžk¤y!¢h÷T éåŸðKˆ-tŸŠz„?hÏx~ãÄ3[˦É=‚N<'åÈ>k3±H²U",ÒJ Y‰Î§„ÿàžþ?ðÄ |F´øËðæêûIy¯mtËo jºeˆÔ<·Xîü»mh#Jìçíd™&P¸HÙC‰¥5 (ɨèöÖñPåêöµ·Ú1Ù$dß4®ã¯}:ó_ñ³ë¼·mš:ïüOÁö/aáxö÷O¼K>âÇSÕ-í Ò-"’9{9l¬£»YÙ£Æß=">t¹NÃÛÜÁ9~Ü?޼oñ6+ ~îþîöÚ5Ò”!º–æIQ$>nÜÝHçc€¹$î-Gâ÷ìEâÿŒ,¾.ß|[ðptk.åôß\É·ÊR9 òí* #e;’0¥‰!–Ìß±Šbðàý/ãp{h|LúõÆ‹«hÿÃMní){lEÌsCù Åþ’ËF„!Æ+N<¶ìúzþ‹^ý ዪԓnÒÕß«²Õùôù\ó¿ Á:¿fïøbË]ð‡Åïˆ:Η7©£ZxvÍn¦¶’䬨¶ÒÒ?0Iq#3*ì ¾ì¾ï¡~)~ž ø·â‡ñ?ˆþ$üSeðáðÅÖ›Ó å£Ã$7êöm ’hœ+uUò¢¡._æ?à™šþ…¡Yè~øÏðÿÂqZ oQh¼7üL¯å%3·—ª# PÆÏ¸’¬Cn,Oø'Å_øN%ðÝŸˆ|?¡x^ÓÃPiöÞ&µ²¸ŠÞþùšÚ[©å¶MT]0à1½»1]’K"܉%§ZsJSø´ßÑ»õµž‰o­×S*T)Âïdï·ª^[­[ògÜ¿¿aßüCñöãÛω¿ô7°³´±´Ò¬›J’Ê šÊUÀ¹±–Q¹¬!݉9|H*±ç‡>ø×Æ^#Úõ­Ï†¬|#g+êæ¾µ†2­}spÅmã«$%â- ­°-ò…V\þË^%ñ'­à‡|GðãSø{¢j4ú:¦‹¨\JöÖ°§ÆóP™ÝÚmæ7y$ÙUq+ççÝ+þ ÷¬xsÇ_ omüm¬jÙ÷q«j¶V°ZØÝØÇk }’âÚi¥–Iî. ´ºi¢ØCZº–_5üÆßÅN÷‹mz¦®ß•Ûi«ÛW¾‡L+ÍEE»hžéçk-{ú3¢oØŸà…‡ÄO hºïí)ñ‹Pø›§XG¨G ìúwöæ]2%žULEl¾yy€¦ÏTðgì—ðËöt¼Ð¾!Z|Vø“iáïÚ[™ì/†—ö+ûˆ¬c°K‰6+*ÊÑG yvÍlê¤DYŽï™,à˜~ ŠãCÕ|kñwá÷ĸ´‹ÛmRÛH‡†;[©a¸yÙ<¹µG ždJ”T‘•ù«{_‚¿bÝJOÙþ/†Þ%ñ†®·Ww0]M¥ø†ÒÓW´ŠÚØfµµºHÂý¦K{h"¶¬¼ìóÌl–¯¬Õ©Eª’÷“Ñ%§“éµß}¯¥ÑÈ’^D½Ë%Ú·­šõ¶¶gáÿø'χ>!øÁ:׌þ.üFÑ ë)¢è²YêöÖÚ† °_ÜÿdÙE`†ìmbÇ(žÜܤ¯äŠX;“̵ø%¦¬“j—Þøß x{Sº]ZèˇµX-BæîòhåÛg­[ù‘®’Úâ)K™¡¶„FöÅP§Ñ^.ý|Iâ… þè´_§†´™t×¹‹B½ºY™®l¦SŸ©4ÐÆ‚Ñ$³NÄH¹“ä!ñŸ¹IÆ–×R·šºZùt}o²* ÎJu4v’¿”¬ÚÓ»û­¡±ñ;öD‡ãŒ? ¼=ñ—Ä—?ôÃú¶•¬x‡Ï:f­â?·Z}–h%‚Î8í„ —.ÜZÛ:"”P°ý>XüEðßÅ%ø‡ñM¼[g¨ZêWî§LHµù­Ñ#·7(,°» þãÉ-½‹–`¥|_ø&玵 #ÁšV¹ñçÁ:´ºm†©eyvžÔm&Õ'žà‡S[ë(}å¡[™eY#¸vÅoógŠ?à™Þ$Õ%¸o üyѼ#¦›I,WG·ð­Çö]Õ»kR6óDšŠÊ±œË}’kc"ÌÞq”$IÍi©-Ö©ö÷¯òï¢í}MkF3\²wN÷^©_O;[ײÔý_7V¢å,šæxÈdX‹ì€€X¸ŸqS×çÏÄ/ØY|aâ¿…Þ1Ó|gá kïxJËÂ7vº¿†¦Õ"×- ¹y2É-èœÛ¾ç-’LL‰m!rbe—ê€ÿ î> |:Ðüuâ8¼a-µ¥©Õäµ’;íSɵ†qy$“J×b,Ò’¹A©fªi8ÉÉ٦컮f“ò¼líÓTc)IJÖÓOÆ7t®¼ôg³QE…Q@Q@Q@x.¿àÿן´OÃßxã‡tÙÎËÃú•—ˆ¼'‡c–óZÕdx¥ê_–ß«(1µ¼Ãœ¥=êŠKµÿ×ë§gfµH/£]ÿÎÿ§Ý¦Ìü¦›Wÿ‚”ZÝx÷W:u*÷[]H¶‡ÂAsmöe, K%Á7š<™•—ç•·Œy‘Eá¾ÿ‡³h^:ø¡ãMCáv³ýŸ«x{H·¶û§á뫳¨ÚêÑÝLl®5´C&œöÏ“4 ×d Àˆ/í|lý n>.ižÔü¬GðæMP±»½¼ð~¸³˜Í樱L—RâáU¶´9ed+:•`¯¯Ô?m?Ú†ËZÔÛKø-?Ž|"°Ðþ'èÿô-gÃ2jzÝ¥¶“¦ÿk2=¼×—vÑIy=°j ÛáßµXêW>k-ÓAäê­¶’]K‹g—í)¯ïÔÄ%) ¯jøñëãmÇŽo­?h›{M ú½†–ž·Ó~ëºpMBkëèdŠ{«‰%]Þ\V¶D„¨“yùXcæÏ~ÖµÍïÆ(àÑþ|[Óü# øƒS³i"ð¶–¾š`¿.'W€ý£È’Ú)“ìÓ)œM b†êß5¬îÜŸdÒW]—M<ûõjû4¹¿º¾R»OÓ;«-wú?—¶ÍïÃO?ð—Mø†5£oáq™¡Fb³[©Mnâîh§àò_7QÁ(c òù ¾)â_ø)¦…¨éöz€üm㛽²ž[½Kþ+pðý¡ã¹Ö+¸ÉO!c•]¸’F0ÄhšŸíûgèzNµ­ß~ÏêE4–PAiàÊÑF·NƒUcSI<-,ÿd†&Ÿ÷¢%wuù½sâgíûQøOFð¾øiâ/Þh:n¡©Û[hºÅÕ´×SH‘ݬ2c’ÜZ†3®bIçO,L®‹[¾Ëæ•ý5åÕìïn¶*œ}îkí}/Ý¥êÖº=¬¯²¹óÇì¿üÁŸ|u¨üQð'Æ{?„:·ˆ.üO$:»xcT¸œ+O‰í7Új嬗íÌmâµ·t%%3óßèŒÞ4ý·o|Og/Àχ>7·ð–­¡A}k5ì^  ]µ…Û5½Üw‰q拃f§ËY‘H~YCÿüeý§ô |×#ðQ¾ø®xRýn_k²éÚ=ì×›¢’Ú7gâŽYÙ¥Y3¶UÞñ_íñßHƒá4?ÁíwPÖ5 ˬê|!¬I Ú„F ú˜ƒcÒH†ó;„{âwVøÌJ„ù&’q÷t×dÖ÷wÛOD’w³0¾úU#ªš[ùÛ_'®­÷mí¥/ÙÿÇ¿¶=ž­®ÞþÒß ¼aÅÖ•¥ØéºM¶yma$« Éx—–÷‹=ijËç4Ö¶ì<¼ÇÜòÍÿÕ¼o©xj÷Ã÷— '¾Ô@½±´ÐÞK»O0yH¶haÞ±=Ìžg–ìª F²'íIûcÞÜ^ù t+H†uŠÖö‡>$œêмq2Ï䣇µÚï$mïlÀX²†Âù/‚hßÛ¿Jð¬z‰¾x§ÄÒÞø.­ã—ÀÚò^xv æM¶—+ÿMÙ¼ÄHB,[$ÎêÍ®i(Ûeo-âµîõo¶éôO*˜¨E?6Ÿ]=Ù?’èÖéÙï©õÇÀX¾8|;ðˆü#­ü2ø…mã­NIot»JúÎþÎÖH´«D 4±ÝÉåïž9UTp\8 ¸üµâτ߷ÅKµÔ¾"ZüO’ÞÞÎXt‹m6÷Ãv¦3$¶Dý±K•2öÄ/„Ë¿¤ñ‡í{ûcXØéÞÒ> kVÞ(’ÎäÝk|"ñEíŒ3,fHÞ8Q²A#Ë1´€–;ƒ¹ZòþÕµ¦“gâ üñ´¶sögÔ|¯™ï”ÉpVåC*¾ÄÙù20l`êMÊ^×KËð³·Ê÷_%wd›]4oË˾Ÿzÿ€þnÛ¸§é_³½¯í±}âí.ßãž/ð_€­"Ôì_ÙžŽ"É'—m™oww<˜Àt|E!ÉóBŸ”Cð0þÝ–:ðæ•ñ./ÞxÞãS]RïÄØ2I}jMË[z}f”ßÛÜiÒyyذ‹v$ß0AîŸô¿žøCñ‡á¶§ð×âd?.©­èšý…õœá„1Ãj³5ã¢;0v¹E ’¼ež$ý§ÿi»O„~ñ‡þêw>;¾¶ÔžïL»ðÖ®¢âêÚéáK)WαóãO=$˜:B 僾<øÓûLxoá'ŸÁà‰¼EñP’õï4Ý/ÁZñ‚Íqˆ–{XÚI×OšSqû¡k™ÒäçMk/qúó=WÏ®ÖF“£í*BÚ8Ý¥òW¾ÿð÷ìÒù§âà¤ÿ | ©øÙl|m%…” 5夶þévÁHèD¥ä(72®æ,ØÉ#å;Ÿ<„pE¡xšÏÃú]”¶~R»\´޹"+s>ñÂ`ÙñmÇükËŸ‡þ ´ñf¢ïÚ›\\è°Ç{»NËyNdS!†àykEl%à´Ñ¨$ãx{ö«ý».¯îω?g+JÓ•„,~ÖËK:Â’ÞÒ–à³"Ȥ §ÌfäS@ý²ÿjË üaâ½càgÅËñ{we¿‡ág‰ö$ÆekX¦HHK<ÅîGîU“? V–Ë×Þ²V·WkÛtÚ½¹¡|0÷šP޶rüM7Ù=µ³Iµt›=ÛÄv¶î£ð—àö¯¦ê¿,~'Ç ºõ¥‡…mgw‘#íw ÷3ÚŸ(‡ÿ[ƒ’rCi{ÿ–ÿ[Ò§Òþ%ÚiÖz’ÇR•<#j¶È1°„˜mIÉÌQÈ¡ˆ À#Ð>þÔ5OXx³âž™­øCà寔GÙeøIâ]:þÏTkÑÅ4·¶€1Ÿ$$™2+ üDý©ÿny¼1â-cßüEyu¡Ü[]ÙYh¾Öbºñl'Qx «L¶È×lÛål"z;}#ñ›öŽý¢üg¤]|5ø3¨øâ9<'¸­/…5e“U¿o<=’Á2ØÉŽ) N¤ì_Ÿµò;omÕõ³¾ú'®»o}¶œ¯Ús[ûÞZio>ŽË},Ï?Ôõ¯ø(Ö‘-¾£oáíOÅöÖÐ;êbèúаƒÈOw,!f]÷x¹òИSËÚ§ð¡ûwÛüñ׊üs¢øÏQøÓ5Õ‚éþ#Ã1Ogi¾!tÖ ­hól2•ûTû7(à¦ø¡ñ—ö ð†ð€øcÃ^×õ­WKZü‰à-væ+9Þ{h•V8fÝoµg’B“1r-ÛîY>]·ý¸l¯Zhšžû5xëÃÆ(,ïïôÝCáW‰VkÂlï[$•€Ž2ÓÇj¿1ŒHUão½V©¾GÑm~Özýö׺ØÃ“žjWÛî|Ú«þ–Û©é¤ßðR[ Ööðéëö›ä–X­|2e‹a$^d¥ïò-Ò¸dcÈÂn4ƒÃ·mþ¯¯uñcSÐ?¶cÔZÆøxHÙÜÀú­³‹xÞ' ¾q•rÑÿ¬”• ÉÙ~Õß¶†³qi«êÿ§O Z­ÓÅ¢øÅ‘Þji/AípÂéå¤ù‘[çy´£<úíWûX_ë‹âȾ|M¼ŽK½7F½Ñgð>µcvßÚºŒ2ßÚÇw@ÌmÒÒGW¸¬gr™Çª•êk¼]š{kßï^KïEóª‹ÝÑoÛg¶»uíuòd> ҿ࢟ <#á ØiU¥Ÿw¯ß÷tZ쮼üÿIÓ5 'â]Î¥i¯üe³ðTš4ú}…Þ“ÿ®µ©¤ódzE7—q>ØîÏ“‡O´ “,j¢ç4ø)¿ÄK_øCñt¶×zhͪNšÝí¥ŸŸw"<šsê6¶RL“=¸wFB֙à †Õ÷kö…ý¨<7ðCPñe§Ã9|sñ&^Á{v”½›“I%«žé-4÷½^®êõKê§+sÙ6ÿ¸·òøM^Û;w?´½÷íúº—‰¡ýôôòÓMÿ‰kÇ%¼û´Û’Ä}¶du½MAmB‡?e6Ò>wI–O¾¼;e¨éÚ‹a«êú†¿ªÃiW7×i Oy(PWX" Ç$ˆÕW'€~pþÏÿ´7íqªüHøeð‡âŸÂûwÒ×LI5¿Íàïii«1†vc™ ÖÖÒÂÉj²-Õ ~Ñ#DwFb?¦õÕ^›‚KFž©®º¿óý«O7QT´õZ-Oø?ÒßRŠ(®c¬(¢Š(¢Š(¢Š(¢¼_ý¥¾øgö‡ø{û+ë> Ôíþ5ø§@Ô¼M¢é«¥]¼7:}“Ä—25ÊÆ`Œ©š1µÜ1Ü097j+wÁ6þä›~I±IÙ9=•¿’ûÛKÕ¤|u}ÿ¾¶ñ†¥áoƒ:>µ4Z桤Âö^1ŽW‘lÛWóÕãû.äºdÒ%xí—yu™ tÃc„¼ÿ‚Œø7ᆙÞ•ð{ÂÚ‡w=µ·ØüU¤éÞÖ5 Î:]&¥p ‡I" À4—{âÚÇdõ/¿Ú[ön³ø¡}û7ü.ÿ„¶®­­ÝêÖíktÑiK$·2Î÷M¾5–S)Œ(*ÙÜ #+yk?Ø÷Dø¡¨êßÚÞ&_ˆ—Z=¼žk躬ÈÚT—^\S[©ŒÂ‘M2º ¾@fÜH)Õ„u–Wéÿ[¥®ÛïkkZq”¥ìÕ’¾›õ²ûºý×9ÿ†?·¢|\øµàox[Ãàð¦«w¯i÷7SøÀIªØ^éë(û¶QÛ‘ÓŒžKK‘ónTGû>~ÞÒühñ~ƒà;ø>}vëXÕô[©¼7â‘©E§OköçG‘œ@VÉ­ä—KÀðùd)qî÷?¶Àí;áůÅNóǺ'‚ç}@‰oüªÚܬ6jísröÒÛ¬é ,n|Æ@&âT&Õ?à¡ÿ^ë\³ðŽñ^Õ´û=FîêãP𶩦YÙÛÛÅiä’[S<<ÖƯmÁ$#íòÝ\íJ ëkÿÁOþkÓ®§jþÓ|U¤ø²ê×U[·ºuº†Áa„ÈLЇÍ%È‹;qÀa‹¡5E)ï+ë¶¶¶ž¥Þ·Z6tûhEí³O^ÎÖ¾ŠûèôÑìÏ™|ûq\볦ñ×PønšªA«ØhÞ ·ÐµS© ´[ÛJ·(`šEQu˜›ÇûÎX(fá5/ø)V—¡i÷:—‰þè~´†[Ë{‰5oGj–ò\BmîY­ñÒÍîPäË‹"œå+è~ѳ¹£ü'ñ‹üGs=¦¥â ËÛKݼ·:½˜O ·ùLÒBÐL|¶W»2(*וêŸðQO…V¾?ñ÷ôo ø‹U]/OŽk}M´ÝF+KQ€+eq(²hí7‡‡Ë•݃™ € ‘F+9ré®ÛÙ(þ®íi½¢¯{ôcì¡YÝíw¥ß3]}RzéfßVtIûpi0|о/ëÚ/ß hÚ׊.<3¢O¨øÚ´é¤ŽâKu7žG—o$²DV8€³¼i¸ãçOˆðV|>{5/ƒÞv<—ÌnŠ`ŒZCj—m*Ì¥Áû#í„nÈ’3¼ Û~—ðíõð_ž¸ñƸuÍ+8¢—V†ÇGÔõÑKÛE:¤î,Ók7™µHRŽGÊÇ$Qÿ‚‡þÊzºèñˆümàèôûxo/îµÏêú]­¿˜$ÚâêÚ8CbåðC”žµO–«æÒ{_¥¶ºów¿¢°RÄÓ’\®÷ÿä¿ËÝõÕŸ2ê_ðRjDðÙø[áf«Á©Ã¥Mu¥xÖ-M#ºžöòÞŒ2ZÆäm´Ý!%Yö¨|f¨x‹þ ¿ƒ<bð·í÷ðRöÔYx¶×Åþñš_\ZM£Zx{SÔ]#Iî#[„h­A’-Ù™Õv©;I<hé--v¾JÛ+úïé~åÊœ›r[-=Ÿ­¼¼™à:—üçLðLJdÔåðVñS[ˆÖæ#Äöæ8Ä‹n[?”>Ñm8/#eBÖÈë~Ý÷“~κÇÛ_„k…uxô}SIÑu©5V±–Hc• =­«¼Ã oÝ!S»9ì_ lÏÙë㈴|:ñ.·âíBúÚ[¸.l¼?}=º"ÈHšé!0[±HÈêK£Gÿ%f'í×û4Íg§ê6~7¿Õ¬n×Q6ÒéúMÕïÚÍÊ\"#vwFPXAŒQ‹œTZ·+j龉=_š²·ÞîE 3|ºó[G¦í­=;Ÿ3x£þ “á ø‹Dð½×ÂùN¹©hPë¶Ök«m}oÆÒžÖXt>Z3JçÙ^™ñÃöüÑ> ë²Ô¼ i¨hÚŽ‡m®Nmi­`‚)P9ÜM»‚‚ëƒAà‘]Ô·Ïì×sä[ÿiüK{Ùî ´'ÀzÛ]Ý2±à†YV2>rŠv÷­/þÚ| ñ'Røm«Üø† cL–(5‹«Ÿ êñÚ[y‘cHn–Íí®…ÉQ*ÜçŠÂ£ýÜf“ëÑôôÞQù«?ˆºQnMoúZÍþRÓÏË_‹ü'ÿ1ñÄÚÏŠnu†Þ×¼%{xrXož’1ˆ‚“ ?2Œ§#3ìåÊœ^‹O¹ÙÞþ©?ø%Ô¡4ùßñWIz+éêº4| ¥ÿÁ\´}WÂ>$’O ü-_YªØ>§¥üA²¿ÒtÛùZq×aSív¶CÊÿ™`TgÊÞ¾´ñoí»à_‡?³ï>-ë>$økâýZòM.ÇSŠÓĶööö÷w1*%Ã*œndW ¸«]î¹û_ü/‹áÖ±ñÂ:‰üuÖ‰i-»Ì÷´¶Ò“*ŒÛÈ«»ÎŒH6œ…n•æº?íÛðJÆ×NÖõo ø¯Ã7Ú¸›U´´ðŽ·u¨%àuˆ¯—™ã‡ïË(ÛómÛÈÒ½zwå^íí»ùÛ¦ëô)>—»ü5ô¯Ë篈?ðT+K QáÛ ü:ðιªÊ±u{ÿEq¤›T’ææAXf‘d+?0‘ăú•gà¿_øGEðóøCÂa¹¶ÓÆŸ ³‰ÁóÒ-»†;ƒÈ¯ž4_Û#áΫ¡üRñÅÖâÈþxrM0[êz=õõÞ®.Ôm1ÙEng„à7v;@5†à ÿ³CÅblõˆº¥õ×Ùŵ…Ÿ‚õyïdižD@`[s,ctRÒ*¢íÉ`5­H¸GÞVkwøíѤ֟æ„¥dµßç{[òü϶zp8WÄZGíåð‚b‰ôßøVîanöºPðö¥ª¬rB%gžÞÒÚDEPÃæŠI—æ(C(©ñ+öùøMá/ƒ¾øÉà-7^ø»¡kóÜA¢&6òn¼†Q+´Š®BŒ»Ë8 I#:éÓ‹”ôK™œ$¥dº«ü·¿¥º(¯‹í¿oÙöagÌŸìu,c¾x%ð&´‚2cyíj¥UŽBÑ©.6ò¹*¥ÿíÏû8iþ›Åóx«Ä3èŠ¥Ûøzþy®0fEp™%oÜKò*–;0$Q§)|*ÿÕ¿2cR2µžÿðÿª>¼¢¾Bøaûgü-ø‹àßx¶k_è­áÄ–ãR´M SžF¶YZ!, mRKŒ²R4fVHâ³Çíóû7­Õ½æ¯ñ H½–&ž8µjÖŽñ«¬làKn¹Pí·#º·\Vu$¡¬ôÛ}7Ûúî«lïÿû6Šüíð—ü_áζ¾3ÿ„Â>'ð·ü#º­Ýޝ4V—º”E w†µû-«Ëq)ŽÜ·’cïmVvOS¥Á@¾ j>!½°–?Úh¸† &þÁÕ«sxn'‚hN6‚â1€±nR¬®žÍòóôÔOUýuüµô>颾?ñí“àüYñ/ÂßéZåÔ/¦¦ŒÚMî­y¬ ”„³›K{s$)ÜD®ä²ª¶÷(¡¶óÚ—üà#èoðÇŒ¼S¯Üi³ßéúwü#z¤;Ù-$¸UºqjæÅ £y&P#`p•T ê=•ÿ ΪXj“iE^öüv×cî+俇¿¶Á?ø Ä^7oǤ¾‡wa¤ëö[%•ôÍRí⎠.QYÞI'…Så]âXÜ|ެjé_¶‚5{Ÿˆ~$KÒ> xSßÛúïŠ5F¸²–Ðåâû,–ਅb—Îid£d ¦aµX¸;OMÿ}ý5ù®èæ¥5R*PÖú/]­ë~‡Ów¾ðŽ¥â-/Åú…|9âÛž -RkžîÎ6ûÉ¥w¢žáHº:ø«Åß·W  7†íüSã‹ÍRxÌV¶=üÓKfe‚)'…`·“Ïek›s°crHX6±ƒð÷öûøiãÝkX† aðïÚdC¹µŽþæïÄQ,&…â¶û”w[ô ¸‘ ç »™*rŸÂ»¿º×ü_ÍÞÛ;D«A;7®‰úë¿mßenêÿyÑ_jŸðPßÙ—GÔÓJ½Ôþ, šñì|äøwâ·I£K·^agåF`7^pv/-w…ó"ß"ÁC¿e mÖö×ⱩéâãP¶¸¸°ðö£{žÖ~p¸7&ìÁ$·šæìÄè`lKˆÉ:R‹JJÍšÇ[µÓúý¶h¯þþÔÿ¾2xÏUøyào\oXiqë7ÚN§£]é·–vrM$1ÌðÜÆ’ä’)V96ùrùRùlûoÑ¥·þº'ªþ¯¯äQEIAEPEPEPG^´RyƒCãý á÷ìEð÷â%÷ô%ø#áo‰gX{+›ÄÖ`ŽìêW/u#Z°2çÌ‘înŸÉ#–‘Ø.FG™|`ðßü—á^™¬kŸ¬þ éÓéwѬ–¯|²ßEtþtðÙG Èd™§–+U7—t@Ùjô þÄß ü)ñ#Ã?¬|Oã»­oGÕîõ[.ÉàE¸}NG·lÛy“U¹emâUÄ`IâNÆŸðNƒÞ5{É'ñ·Å]_í RþÂ]>{3JÛ]ßCOi!’9¦w8›Ì(ˆÚ< a‰Œå£k¾úõVõºù'ÕÙ9j©Ó‹vþ¯{þ6õM·g¡Ù”ý‡þ%|+øm%ψ¾ ø‡á—Ù.µOMsâ$ˆÛ¼r-Ó$¦bdŒ¤²Ç2–d*î’¤Šò]áŸìYá{Ãÿ üA üQâ+{ÿÙk÷².ÍOO¾½œ’êHž:œ¨¦AŽV}®ÅÜØ×ÿà˜ß"ý®ûI“IŸÌÓ<;rÑ$ðÉq¥É%´‰÷+û–E‘n$Y–UÚ«ë_¿b‡´_‹cŸ¦‘-ŒPJ‰y Ðfómd1xŽ£i`8#Ñ”¡ÍVù[w]R³¶½u·k®×Ó…:ŠŸ÷•½º¾—í{]ïnÚñ~#øGÿåñ•6£âˆgOAd¿ÔÌ·^ €ÛG¿h†òE&}‰›«µ—nµÄû²Ò>z¯é±ž¿áÏxoÅÚïÈzžêþÓûCÄ‘^˜cÔ ždÛÞ|ù &p9*Gy«ÿÁ7~ø¢mZûÆŸ¾,xÓ[Ôt } SÔõ 7Ã_l½0‰UnüÈô”òed™ÑÖ,0LDä’ûþ ­ð‡P{Ù$ø‘ñ’Õ®uí;‘o6—w3‹æ¼ ð­’Ä;2Ø$òÉRç‚3GhÙ½ܺµëÿ뢺“©%(Ê7VÓ]ßmWãòµµ~Æÿc?ˆ^øqàÛ}Cà¿ü(÷òj^°Mn Èu+äœÌ÷¨•…Ü«92—;ØJw“¿æ®…?ðO†Vz¤[~x.Ëí-§_ùþ!†’ëh_.bóó*¢…ß—M£nÜWŸü?ýu?„üãßüB¹¼øy¤ÚCÚj©ffwŽÞl46ö1¤§É·A¾lm <Çl¡Â¯asÿñøy{â¿x¯Qø½ñ«S—U¸º¹{K”Ð¥†Ñ¦†ò&3i†`od ¾F#ËŒFðê¤bï$ÿ›ï¾—õþ¼õ¤Üì«ikyïñ[ÑÛµõ"‹á/üZÏCÔ'HÿfÄðäð®™y#ø†ØÛÜGêZmëúÃ^×ÓéÏh_°Žá?ü7ð³ðËÁ—ò.©£i~ µÖ–ðàH«M‹hЀXFCžI5ÉÞøSþ Ù¢kšUÅÿˆ~Ùø’KËk+bþ+Cq<÷ þL}£s‰MÃâ6Ê¿šx9®3Ç¿ðL„¿KþÐø¯ñKšÊíï­ÚÚß@•<ò·jHntÉaœ)½•‚JŽ™TÊ‘¸7ciÿòøe§]ý¯Kø•ñSK_´}£ìÖöº vÙ-lÌžHÓ<±}•À0Ü »v\±ió]iäÿ«m¹ÑJ-IÚú÷Öý{÷¹î >þÍZ±/Å?„Þ ðJêÚ„&õÍ&äÏý¨r–Uv[‡PYG,ꤨ`2*‡ü1·ìÄ5SÄIð{Ã1x‚úâ[»ëèÚd¸½ž@¡å–@û¤rWsB¨Q€1]wÀß‚WÀ?é>ðÇŒüyâ XAäYYë70Ü A¼·Èâ%(ÎÕq*¢"€¶V,ÞšÛkݤôcæóû"~Î ªèšëü+Ñ$ÖtÛ‰.¬.šy̶’9Ì…É$ɽpÀŽ*Šß²wÁß‹o‹áÔ´k¯xYd–ã\Ó$ö)’3Èžhx²#,˜d+µæ¾–¢³i8òtíó¿æ“%;5.«oÇüßÞûŸ-xsö8ø£xsOðö±áýSÇD oö­gR¸žY#A„C‡ G à` ôýžþ ¯‡õŸ ¿€t‹Q¹Žòþ9ÞI^îdÈFy‹¶ÐH¶$cŠöZ*¥&ï~¤¥k[¦ß—äx¹ýþ j^>Ó…®åI®-ÌÓnv@D`I¿ÌU@J¢† ªv¨ŠÄ‹öVø펣û%½¶`ÐÈon‰L@æNFTpr8¯ è©i^㾜½—5¯Ùà¼ÞñÇ€|¡Ëð¿OñťƧq¡¾ÉŸÈ™eEO3rÄ © C6ݧšÒÒd/Ù³BÖ,üA¢ü#ðΑ¬Á2\$ö†X|»¿xU\Ä»’H%‹19$šúFЧ&÷þ´·ä†äÞ¬ù¾/Ùöo†ïNÔ"øU¡­õ£¶›Îœ¼@ B€ù™ØT((~CµxùF5õ?Ù‡à³á‹j |=wáë}J]b([ÌöÙé'iyŽî@,YŽì ç½æŠr“’ånèGÏÒþËn-®­n~é×1Í4w,eº¸wŽTªèæMѶÙ$RP‚UÙNA ùwÄØ#özñ±:>ƒðËW}F FæÿÓ k‹–ˆÊÈ›™XÆ¡æ’Aål;Î쓜ý¥E%&¶ºá¯Ù·àÏ„ôÝwLÑü©©l-u9e½¸’]A<Ó)29|îiˆÁ,ÄžµÎj_±çìÕ¬ÉÚÏÂm X•YYMÜ÷mô˜ä8RìX¯BØ$>–¢”ýï‹QF)+#äÏþÄ¿³¾¯á¿èz­¼¬AuÚž—#­ÄSMѵÈZ7”,òá¤VûØ Ž+rÃöAýží-thî~iú–¥f"a-ÄâââT21–GWšFšc&~ÿšá·E}/EZ©%³"µ¬x¦»û:|ñ/Œaøƒ­ü=ѯ|iÂé¨î‘&Q,j™VËÚˆ?¸Ûp;Wo¿eÿÙöþY%“á/ƒ­ ’êSN¶vÿeK¹/¥inÚUˆªÌe•ÞB\7ï¸Ã×¼ÑYr«rô4çw½ÿ¤x†Ÿû7|Ó4={ÖŸ´A¤jimâHÒJî¶òù¶ádv/•(G°®É>uÃ|Õ³ üø_áx5ûox]4xõKXm/Ìw ÷ÆC»~åq’w©X–,O5êÔUÍó_›[‘d’è|¿¤þÅ¿²Ï‡îmï<;ðSÁÞ¼‚Ê:Ö]5d´{x„!©ƒÚ ˜ö±ò—$â¬Ý~Ç?³ÜWPIðwÂÑÁ4‹1Ž6ŽU6Å$Œ#¡³´ÚÉ´¯ÙãÚFÑ_KÑTªIjŸõ¿ç©5)ÆM¹+ßþòÐù™ÿcÙ‰“P‰>xZÖÚêêîúX-̰Â'¹IRåÖ4p‘™„ó™6½§™Û-#±uçìsû0êGYmOàǃõ3©Aqkªý©oíˆe… h®·±ûR£eÞ#XÐ \ ú^Š=¤¯{–÷o¹ä¾øðŸÀzíŠCð£QÑü1àk–ÒæÌ,ºlV"îv†ÝÞ=‚ÙBD¥™ðû@T&¢täªòìÞËÍ«/¹ë¿_#*xªS5=W–»í¯ü ôòX¿³ïíéâïŒÞ0ð…µÏ€*ðU¾´Ú´Q&Ymíç¶²‚ò-êñ¤ÑE4r²¬ÏŒ7ý§µ=Àñ§ü¦üJ¿]±ðß‹t&þin|7¨\Cy! ¸y oq 1ae‰ü ü‡çsþ ñÞlúÇìñyoh’jÓ,w7ÓÜi÷–íp‘ÚÏVlË%Á†9!Û»tS«`éþÝ Ѽâ/ø£Yðµ¾·6¥»Îþ»’7ÙŠÜÚySÁ¢8RA#pŠ¡ëŸö‚ø± |$ð]ö‘‹ñÄš®¯®ÙÜêzÖ¢4‰,ííÌïF¶Ú|±I&£Eo”–rNï,ñíÝñVçX¹Ô4x{áÿ‚m?³Öþz(5]R8Ü3¸KHDwo”Ef8•YŠh뺶ÿ‚xGZÑ|Kwá¿…þ Ÿ^Ñí-nõ-7Qñ‰k-š\¡’ݘ%ÜŽË$`QX‚Fà£,IM¸Ejž¾¦“~i¨­nÓo{ni%l“¿ý»kú]ÞÛ^Ëk {ÿøÃ¬gàïxJ)ü?6œuXï}¶–©R*\Dø–gŒÉ‰ a3ŒR yfƒûh|ø_7ˆµíKàµç‡¼_}§\øŠóQÓ4Í2Èë–Ëzö¯7Éy)fHbw–@Ý¡=ÇÅ¿¶×<ká­GYøkñëwz šýÕ”'O–ãL²[¯³6].LR·›’)í9# U&”lõW_ÍÖÝì×ôÞ³:MUå¶«[yyö½ý~ãä~Ùÿ´½Œsi–é$ uÙ“MÓšæãV+$ím–KP±C";áI:ŸùnݾÁøeû[?‹¾kÞ2ñw‡|?áÇmy©iº•íåì×v1m¤Í&V%%Š5”!_¾yÆf§ûfµ×Áæø•áÿ†z¾‰©¾¿‡…Ž¿¨Ù)³yb2%Ë›YåŽDË#FWƒ\÷ÂÛ«Døƒãü5×>xžÇâÔ(º¬°ÜiiicQr¹½iváÉ*çI¬dÝG%NÉËo-¿¢Ýôß̪©B©%¢ÑùÙëówüÑÿय¢7Ú‡ìó –‘öHÙšVökÈfhÃ3I°*±&ye‘Î39ÇgqûU|Yð·Áoþ>]6/ˆ¾(ÕmõW¾†êäé6×oÀŽ•SM–UM­¹Z1vä‰Èf­ÿ,ð‡|u%†«¥ÃuàËò Ðü‹Ë%¿žD”Å<’Fn‹„WÇR•¹‚}àí­£üoÕ5Eø_âëmjÆÆââq£§Í·Qï"Ò&iÒGvU7–#ù¹p5¬*ÆT}¬c£Öúì“¿ùéä»JJ'Ú}ë×}õèýOœ`ÿ‚„üaþЊÆO‚–îñÔÙ$úž§kiXK¼ot¶—‘È>X®@<1‡Íÿøç§ÙkŸìÉáÛ»Û +[ë‹-+Ä÷sOsÀ2Ëiö>î£s$LYJ"¼›boP—þ Oð¤h“ëö¿þ&_Ù[é’j÷Š‘Z«ÚÀ“½¼œ<ÃÌdš6FTÝýá•ÉŸ¿n Tø ñáV‰g¨‹oM ]­ôÖ×"ÐÃm%ÄÒŽê4‘‚ÇOÉå” ÕÓWýâÖž?ÍÇR¤í ëÓæíù5ærzŸíñnÃöpÐ>4^ü>°>¿wdÞ†[­1Z4ŽVŠþÑe=Âgj+0,1ýÓÝÚßâ\_ü/ñŽo‚vúž þ!M^ÒôBîìéë#’êô5šâ13Æ­û¤*ŒÏÑ qrÿÁGü5cáÝ/X¾øCñ¯RhtýFê]>?SºŠÌ\•/ÕÁ´WåSírC/ŒžÏâ¿íOðODñÂ{?‰ß ÿ¶uçÒí|]¢^Ý[ÛOk¥\JÑÃû‹©qÜ œg ¯å¶à<çJ¥4—2ºn+}|׫I½´½ýp)¦úYIíçù'§™æiû}|L‚]-µÏÙðxvÖt t“ê7rÜi7¦t‹û>t†ÍÕn0d—î·¾¹aûT|B?üã/|6ð~‰â=jm6Ñ`ÕµÛ+4VÄkq2iÂH¦” ¦-›†Ýç‚|U?à¦Z}§ˆ.áOƒ^<ø…ámNH†/¼7s£…˜2[y‘Ü=Ƥ«¹ZåHuJ«`€Û–ßðR/ ë×ÂÛÃß×/¬> ÝüV×lÓSºXúêÔRïäW·0é¤ZE’eû\;·’†_{Ö¿à  t¯Íáû?øÃÄRnÔÞtûÍ6C,:|ñAxZ3t%ŠHÞe")]À` ¸Ù\•ÿ+ð÷ˆ4í YÐþüKžÖòÕ®¾Ãq«èÐê,=>Ku>ØmØÈº‚g|ñ”òۆȥ §y¸é¿Ë_ò{vfT0µ%.dî»Áõ[¿CéoÙ‹ö„¹ý ¼ w¬kž?¼gm}es¥ïšdòຖÝ.¢y¡‰ž)LE”=5ñ‹>5~Ñÿ u_‰ºõÅ|U±ð·Ž›G&µ¥é¶vúÆ=ë:ËKóƒ…†#xDë¸7Y?ü[Rðo¨Öžl™K•R–7„…FX¤•£ ÿ½eΞp”\ÕÔ’jýWuknÚùZÞw9¨ÅÂKÞ×ðßîIþ7òá|;û}üZ¹ÔÒ _à•¬Ö1ëºÐÛKr.†«©X\j™¢n­È³‚hãD¦;ê$Uº¿‰?µ_Æo~Ðá¸4- Qð†ªt»9c¹‚K«K‡ðúÅxÒ}–Vyb:…㣣†MÜ¡déßþ ;ðz/‰š?à ¼5ã/í;­FÃKŸP…­n,t»‹««‹XÒêH¥cjLÖÏi•#.ñFË,Q?¨ü`ý®¼?ðÃÅö>ðïß|cñÚ xÉðåΚ Z4w† wu™¦’ÉáEˆ»y’ü‰i5VÖNé_kÙ?Á~o[ÚÆ)Éòê—ù¸ïëø¥çý™ÿm‹_´GÄŸøROƒV?ô[=æîÆ]L_Æ5­@y/Šy @°î#º/83s0h†<ß·ÇÆ)¼7k¬éÿ²ÖµmªÏ£Ç¨Ziº•ýÄêwBââÒæÎÜGlí+ÚÍoçJÁJ›Iá™çmt·¿ðPŸ„¾6Ò`Ó´o„¾9ø¡á wL³’)-î4e«YjSµ½™_µÞF&Šæ ò‚¡—Ë  GAâÚm<ðáFµðƒáΙá TðUþ¥£èv¶q[é-lÖCjÍoz©Æ.[÷p¤¨þ^Ñ4_3š§¸ùÓ“¿Vœ¯ÛÉ=ö²å{”5r¨ìÔ›~KHÙ-]Õ“ûï¯O¥þü\> ¼ñƒi0é&¯¨iðÚb—0CpñÇ:™bˆ‘¸ ;²¬Ã }®±¼;ýµý¢ÿÂIw¦ßøƒì±}¶{;V¶‚YöíM$“œ)‘Ènnµ³ZM$ìºWù™Á¶®úÿVùlQEAaEPEPEP$ cpù(AÎ3œ~ùÕàOÁ<~zû÷·»ÕEìšÖ§§ß^Ü,ÞÜÚÝ´ïs¼0EpgŠwªF΢VãÏ賜#Á0 Éè=ëóãNø?û[j“øïÇuˆ¾%×oï¯.¬uÈ´s¯O©-¼Oh`†ç3Ç<6vJб‘f{u©cÃ…¹š}¿U§ÏóIYßBMÛOëG¯ßo“}AðŸÅ¿ØÏÇ$Ñãötÿ‚~ko£üI[ðºAâ bãÄvú®ñ.þÖÛÅ7Ë%£Ëz~ÿÁ;ü*4ïÿjü5ðÔaáРÒOfd"DŠÄBnÀ %¡H@ÀòA ó1n£ÁŸ³ÇìKgàè> ø#RÒ§ðíηo­Å¦Ù|CÔ&¹¸¾Óímm†$[Ó;$vö–ÑÉo)‘š½÷eNÍ;ô·š¿½ûwUæõÐè•·Ÿßm?Áw2õ¯Ú_öÒtgVÓÛáž­y¦\ǾÄhKm%®¢f¶ŠfšK9¥ó‘ 3˜Ì†e1–Ý“ÔøcöŒý•bøOð£öˆ´Ó,t ø†Ú1 ]éþ¸»¹cu ÜIc·‘¤ŒŒ––жÂw°¯5¼øÿù³Ó5‰"¸ðˆ’V‚ßR‚Ïq6©$!Rq›ÌÏ$BÐÚB]<‡ÚGÏžWÂÿe/|9ðW¿„Ú¯‰> üøeªÛø†ãM¹Ô5+;[[<ÝZý–+—»F´ƒu´Û‘ËP‰ 9ËDÜ{Ç^Êö“öî½uVõŠ©ÞðÙ'§weËÓùôé£ï·¥x7öý¼em½¬xwÁ^Ôïnu};í:w/«Ão!•¤†Xbu“ÌÙç,aŒŒí$WOÆØûÄÏñMðž‘ðëÆ^1Ðô©µ½[CÁ|¡g™ð©YJ¡‘¾u2€Àð‹OÙËþ Ãã}_\ðü ¨h7U᱄Ãñ\Ò!–YíÌ¡¬Z+øÕÇ—1*ð}Ìü…p1ê²ÜþÅ_¥Ñu¯Éa |P»—C‡R½ñΣ¨hÚ¥ävÄ»™§»{h.$Ž ¦pVY]K³`VÖ’IûÖ²Þ{}îÎÖòK¶±^ûkUvß’NïîŠuÛ1µ¯Û?öñ†,nîîü'âï[i²½¯…¥ðܲêÖ~TI3Z›I ómÛiFTe]êU0 ž¯Ný«ÿdÍ "ÄsxsÁ~1Ö­cŽÿM·ðõÕÄ·q'îÈfŠ×÷ñE¸#±"-±ö7ËUîgØ«KÅÞ,ŸÄ¿ØÖV§Kñ-ÒüOÕ-í`›N ðŠIÕcA·¥EFPN[¦ü$ý„õÝRË\ÒüOà]vîk™lí<Ï,M4ʯ%¼q­ÞÏÞmY @`°ó6ç-[ÍÅÉòêŸùü÷Ow×ñÎÍE[uþKòwù}Éš×íûøwáï…~&xSÃÞñŸ‡ïoŸHѤм*Òq Eʰ£"ÆIß&Ä Ã 3­ð×ö‚ýˆ~#ê¾ð?ƒµ?…kâí[Kš;=]mnãµý¦[wŠHTÄ»s/–áC¨Þš²|'àÏØ¿âÏ‚ôŸƒ?‰gñ^ƒáýrçMÒíîø‘n,ôM_Âw÷ÞÐ?á!m"ëÃÓE}áí7hV²É–ªÊ­PêP |×⯀ßðN¯ j£Äw1øËÄsj„1½Þ•ñ+_¿†)Äl°”‹Q"(ÐÎêc "@ÜEÑn?cÏ‚úÇü3ð³â4:7ŒµÍëPŠÞçÅ×þ °½~êg¶²¹¾h%¸Q"ÄVUPÄ€™Ôƒ»Ž­-¿¼£ëµîü‘¼m{?/¹½z?ÏsÒ5oÚ/ö+ð©¯|?°ðµôÖÇgü#ò›9æ•TÛ†Û|‡–æ~vgƒâÏì¡áÝ'Â~?Ò“À–My=í¦…qm •gý¡k²iÐZùŒn!šæÚ)Õ-ä+4eÀx÷a[ŠÜÿ…Wû êžѾ IâŸkžÒZ}nßLŸâÅÔñœ%ÓÉ%ÛLûyû‡$94«§I.Ÿ£ÿä"(»Æ.K×ÖÛàOîó'›ö…ý½sY·ðlú¤Ç¬_5Ÿ„î5.ÄæH-[Í\q*ˆÿ´'ì×ð’MØø7]x£IIŸUð¿…¯bxt™$tiMÕ¬ÑѲD*Þx9eN >ü*øAû&­®|Wµøý¥Åðã^³¶KM"óÅ—Zt©i ºË,—û¤‰dVò™R6r~w”`°uÏ‚¿³'Œ¯¼;áJýo5 éÞm½•¯õ.-l_s 'XnÕæŒîb}㜃QRQ·^«Ë[§ø|®U9ZOŸ¶þwV~›üìp¾ý aí%ô?‡Ú¼­jš G¬WñÜêWÖ~p ³M:<ÅÌ$vbÑ!±ÿ û·ÓÇÆŸí.ÍûHÿ5Væßl­nÌn¤½{‘M+FWÌò£S· tÛ«¶öÿƒm;?!Æ.éµ§_¹ÛúísoNý­?`+ÉÅ®¬x3Zxk†:W‚¯.ÒØÑ>æ†Ñ–6m¬»I À¯NðÆÙ3âο¥øGÂòøKľ#ºÓÞ,&ðÔÑÌ,ðC,Öêc€°ùKa—8¯'ð‡Â¯Ø‹PÕ¯ü7¥êúÕõìpéÚEµæ§ñX¹´/Ïm¥Ä×ÌnTG+àFÇíè :ñF­û |"Ö5¿kúÄ]_ê'@þ×›XÕ|­6õŒVâ8$’ë13™¢O5v©ÈËñÄ»{OgßeÕëm½ù»u1nJ<ÏOËk¯É¿E~‡ÒÞ/ø•û9x/ã?†>ø‡À¾‡Äº®ƒq©Árº-³ÚE¦ìÌ@Þ$ w¤aNFH¬ïü]ý|gªYi^Ó|#q¬Ý[É໋Y¦M˜ -ª’7 ?î€ÿw ^kgoû'üø…sá«ï‡®<{§júf·sy.¯§Ýi—­`ÂÙ¼ÿ´$ªŸg‘ƒ"Xoˆ5ÇXOû(øãÿ‚ï4[}bÿþ­2ë]Ón.tû«ø­<ùM”º„zåÃm‡å p!,¸")]I)»Þÿæþí¼íwk¶·©BVn)è®ôÛEky=¯®—²Oè/|Xý¼9ªkºˆ-ük|©6z‡ÂÒIðE.g]ënRX!æVRÑÄÇ2&¹‹ÿÚßö2´¾Ð­ÜÉ~tÔºW6ÞÔç‡IŠÝcgd‘,ÈŠ?Þ(FCµÎUK W_…?°¦³¬ø¾ÛÆž¼{»Ùµi¦‡â=Ó[[µùÛ0…áŠÞ¢ kã ¯ø'›ñ ÛÃ^-ñŸ…n5o۵ė7^<¸“N¸-v±¡g¼ò÷97†5@vmr6aMtö³Ÿüö &æ'ñV—¬hw·ZÜ®£ñgU¾ƒP–i.KÃ(ŸQu›s]Ü-· 8PT ´9-ªþ´ü¿ËcZœ‹{«ÿÁþ¾ýÏWð×ÇÙÄž7Ò¼á×ð´¾9¿óm"¶>¸‚eó¼âÑJÏl¢7Ș…¯˜ˆÜ9®mÿhØ[BÖµ½m_ជ®øw÷7Iá¹ “KêêØmÆÕkˆ.â]¼4¡eœ_|'ýŠnü£x‡À,ð߈¾"ÚÝF`k/ˆww—Of³¢¬‘-ã,Æ%º™ º¶ÕeR0ˆ͗ß°OÆO|Cñæ½ðóMðŸˆõy®ôWÅšƒË¡]\\Gu¼‰âMÐJ'Óâ1º4l^ÜI QÇE¯ÃøôӪ߭öfU%ôî¼´¾½õµ­¦ûž§?íûøKNø;â»+ÿ­Š4æÕ|w£xbk¶¾³I!ŒËÙmÙ£Q%ä3·ç¹E3€rüIûWþÈþ m+ÆÖ3ø:K³5„’j'LÚÛj’ÂI3Ò¼Oaðî[~kOPÖ5”Ó5¹Òi­µT‚i.BòÞÌÒ G6MÈi:;œ£xòj’Öû¾·ÓÖÞißFE&ý›ö«Þ¾ëd½ä·ù=ofšÙkúsðÏâg€~.ø>ÃÇ? ¼EcâŸO-Å´7vèè¢X&x&Œ«ª²2I£+C)q]õ|Çðâ7Âïí9þx×âµ¶±¡x~ÃÄ7 â—Ôo.VÊòæîKÛé$’áÚK+¡ƒ+²¬jNâ-ôåUhZZ^ÞdSm­BŠ(¬‹ (¢€ (¢€ (¢€”2²œàŒüœÔfŸÙ[ÂÞ0ñž£âßÚ¿â5ö£ª¡’ÞúçAh48®n¢É˜(!–úH|뉇*)q_¬2'™Ç’»E~d_Á?õcAøÑ¡ˆÖZ >=ð[ü7ñD’é§S’ïFŽÿR¸¶»µ2J‘ÁvbÕ¯_:)ãiLo´ª”ŠNV–ݯ_&ü­rãFœô¨ífµµú¤ôÓh¶÷I´–í‡þ ‰ðŽm[Ã:®¥ñGâæ¼494]>ßS³ðõävºlFon†m-Z¶¶d¸ ö Ð©3¶î£ãì™ðrO…t?|høŸðÏÁ°Ó4:kÒ³ªˆæ³[tž9ì%I&‘í¢Œ t‰™Õ,»~mð/ü{Æ×~'Ó~"jþ9Ò~J¾%½¼¾ðÁÓo¤‚îÖ-WR¸²¾ßc¬ÇÔDw6À\J%ŒC’ÖØÛåý¦~ɦüñÏÀ‰¼KðãZÐõËí6òán<%:[VÑÎá#¿Çq'ÙüÈîb•$†R’ åUW(ÁÓ…šº~W[7Ûâ“Òþ±ÓŒ]eRoTš¿”µ’×Í/R·ÁØëῆdHÄó'’żÚ鯉›©Ï{Ù4›ÝݧkmÑ_¦›³Ÿ„¥rÇKt鵿V¿È¥ãߨöWø~ƒUñ·ÅŸø*ß]×®tÝ:y,ü?Éyª›˜Áf:Y–ä´·óˆáåpólCƒ°ú§Ã¿Øwà_Áoš?Å?Æž4»ñ*øÿFÕ<áK¿@ÐêWVº 1¢5Çž¢ k¨¤†6YZà§îË{wõ­^¢þÉ~ ¹øñ'AÑþ*ü^o4Ķ—QWÓ£»°ˆÜ]ܫ۱VÝy ýêH6ª2·ËkÿÒñ¤úï…µm{ãŸÃO[i)§ýšßUøs5Æeµ¼¶¹ŽbN«ƒ"˜#•.žkÝAê5ø&ô×~Ô¬4[êWPhk-´Ú Ë¥I=£'Û%1[ÞÅxEäq[£)¼ÂÛœ7<«ÉÒŒ[o¥»%kkýX!Fœª§¬µ}Û½ÿ=nÿÉ;6?ðM¿ÙëÅÞÕ4vø«ñ{ÅV?ot»š-CN´¸ŠEPjÏgg ,dÝùHÚHèkÞuØ»áλ¡hZN£â¾¡g­^ëÓj(,]FêêÏìs™bû7ÙðÐñòF¤¸ó\_Š¿doxÏàçÄ?†p|DÒ|}­kv±]M§O«E­¬PE‚sžl¢L†feÊÎÊIø{À_ðN/ŠÖv~·ñÝŸ‚õýaõËÛSPŸBŠU»±ò±¯x©³Ý\nÊ!¼ÈDŒ ¿$óÚ-ÊÑÛç¬wèµµÓ}5Ñ šPŒ\zs/KÅßÖéZëºî¿|ûü(øoð×â7¿ kþ,´ðçˆçGšse¤ Ë8W•mÖu²pªÒIµ®Ìò(rÀ¯/Ö¿à˜ÿ 5­oQÖ§øÛû@ØÅs%¼ÓXÚÍ¢­©xeº•#i¬U·]Èw) ò§9¶\?ðM­3²¼ø™Út¦÷Tž Hu QþÖ³î7jbHÁ†bÊÂE9Âà\Á4¼Cí½ÖûFê²Íƒ&•î«¥^Mw Æ%“m¶£oi,MncŠXå¶‘äòcK‚ǺU\âÔçño׿ûì¼õ»ê(B1½´ôõVôïåky ¿eoÙËá7Ä/|_‹öø‡ñQžK¨4¨uË=î;çµHâe…àÒ’æ&€Zœù£6Ì߯ß`´ý€~ [YÖuÏüañMÍ׈m¼IÚ¯ìíΟÖ[!ies …TÀµÅÕúçAlª€ nµ…8¨.h=¯øÖóRrŒ­ußþæ|ïðÏöøuð·Ãü1¢ø×Çz•¿‰aH$»»³Ñ–÷NE ðXFó|чÿJ3à’ 86ÿ‚pü=ž)šûã_Ç«íNB²5ë6‡ÆUB«'î´ÅRFs·sÕHâ¿D(¥í%ÍΞ¶Käµ_ˆF«IÅlïžÿyùÙðûþ ¹ðËÀ>&·ñ[üWøµã-Z;û}LK¬iþyÌr;“çC¥G0GÞCF lT9'ß/?f ê|añŽ÷Ç>>½¾Öti4IôIÓM—K·â11^ÐÏ’J¼­=PŽ+éz)JWw~kïÑþÎnMÉîÝþiÞÿ~¾oV~[Á<~ØE§ÙiŸ¾9éÚ=¼B?°‰ô›ˆ¤ ¦ÓºæÂI* UDuEq„Ô¿àž^ÔüA¦ø‚ããgÇrÖ),v6ŒÚ#ÛÚ+¼nB†ÓKðc^­“ÎIã TTArÉJ:49T“VlüöÐ?à›Ÿ¼/ã?øËBñgíŽ$rG¦Oi¢ÝÙ\PÛ>žòBw ûàx¤ÜHß· =sRýþêSüXÔ&½ÔåÖü_¨K{}q¦éWRA ¨#šÅDÖl³ZȃkÅp&È8ÈÀÇÕ´UMóoçøÙ¿¾Ú„êJRç“×G~·I¤ýRo]ÿãÏÙËö#øAû3jšŽ¯àËŸx’ö[:ÎMu,®%Ñíí ¬vÓGn“FŒª7!v^P \ý‡ì)ðòkûûïëú·ˆJøRïÁZR=†žë¤éòÍ<‹qšÚIÚý¡×Ìßå° ˜ºçî:(›æ|Ïú¿_]^»êËX‰êソ ¿#óƒXÿ‚d|ÖuëÏOã_-Ì—öš„Q¾‡á‰ÒŠŠHÉ—Igž9ƒ32NÒ*3„q^¯ñ—ö$ø_ñÓÅ>ñ_*ñ–µ­hšy°5; Uº>dî³—K– í¯ú3¬¤nV9';Rÿ‚~üÔ¼­xI¯üMouªjÍÞ«¬Çk¦&£ª[êBì\ÙM"Úx1y6̯˜§y%÷}ÍE8Í­Ÿõ{þdÁrÉJ:5ý^zî~xhÿðN†º>»«ë+ñƒãŽ¡m=ºØÙé÷'C{}Ñ^fH ?Ù¢Rªg–IËVuÇüKáäö¾ÓWã¿ím£iÎ:Í%ÐÚ8--§†Xm‹>˜ÒH£ÈTÞìÓmwĈaúAECI´ßOÐ)ESø4þ¿àŸÛÁ=~ÿ£Í®|XøÏâíLÛÛÚ^Þj/¤¬ºŒ1G¦ -ì"X*ÕËFˆC0T {àìàÙɼ+¥x/Ç9Öü!¥^ZêPÙjâÐÈ—6Ú¾‰l­`V%´™Õ‘‹Ë)`Ȫ¾î¢º^.§¼¯¤ô}šM»z]·êÛêÆ¾²ý,¿$—¢GÇß b¿†¥:,JââHcŠ(Õ0~¸¢ŠÒ¥YMÞNì˜Å-õe`¢Š+1…Q@Q@QÕ.nì´ÝBòÇNŸX½Š’Hî\)"5g!cÀ,@ç’^¬ícGÒ7°ð–¦ÑØ6¶^È«]L4/³Ü¤+rÒ-£¶´±àN &"„È=Äß¶ßÿ |GÕþ_|9øí©kVzŸöl—_†_P·e_²y×_èîò-´o³ófdU_?<ˆæ1òz+~ÂÆú†™ðà-޵áI5}ACÑQl­´ÛÁkÿkSö8ü©´ˆB+β€H°´JЮ4_دÇv÷ÿu~ÎÞ"›JÕ—^¼Ôî´­6î]?Wš¶ûI˜+rÑÆ°yŠÌì"†;@Õ«FZÓV²¿ÞÒOÓI_³Ó¡´©¨YM;ÞϦ«]7ÖÍz­zž<ŸðSo€RÚxgT¶ð·ÆOEÕÊ[XÞiÚLë&¢æõSMd¶¸’Tº/§ÝFѲ‘ùr´NBפXþÚñ¼ð—âïˆÍî¿aáËù&†ÇNþÁ¾mä– ¨î®c™%·†æ95‰ ½„ð§Ãø'oįüWM ÿfoŠæçöÚgˆ<6mô]BÇKÒãæ*ð‰$T •dºŒƒt:·Œ¿à™ºˆ4µ‚Ëö7Ô<|úkÚØÂž‡Sl.`û$¡ghÛ’Ëlñæ6xLcs 5h*©´ùtvëkÝö½ÒjêÝôwç¨ÛMC{5óé÷]hüû¤½ ~Ú¾Óüa©x?Å~ø‹ái¢ñT~†ñã´º‚6âÖÖ Â-çy#†K›¥ˆ»×k<ЉóU½_öÕø[¤ø»Æ>>øãQ:eî“okln<Ó Ï.鄚$‘»-§Qó¡Jãn>)ÿÁ<´?jþ6—ì«câX¯nu]oÄés¡Ã=•üqÙ–šêC"ÜZ1`D›[åKbX­ñg죭ßÞ¬šÏ…h‹ïëúGÚ3&›ª›òF–GoÊ<êÊT<ˆn7s¼“ŒãÇYY'æï–¶ºæ}ºè´WUró_MߢÖ×ùÛ×mõtþÿÁA¾|Z¼ðM—ß|]ñKø…¢:k&™mh_Ì>{‰®Æc,Cà6îÊŽÛÅ¿¶GÃëíáùü-ñZžKëÍ:Â{ Ki"Õ.--Úâñ"Ý:°0DŒì$T-‚#+7Nºýü'ñ[½Òlÿe¯ |UÒîÉÔ.`²Ó-õ=>æ5·„™$ $Ñn-S$‚ðŽ®x?üEÿ‚vZø³Q¸M7ögñW޼E«ÙÝkí§[hòê/30µP¿ Vb©‘÷0UÚ 2\±{É;y·nWæ–·ÚýÐܠܤ¶_†÷Wïðô令±sÿ ø~gÓGøKñ«_ÑnZåÖþ }9íb¶¹›í(’^,ŽöVE]¡òèJ’1/¿à :†<{ý‰ã?…´ß I?Ø^ê.´k×’Í!†ê4¹e*æíy uS÷ö€Ì=_â‘ûxF5Š^ý–ü7k5œºÊÜkÚV—`G¸/2Hʼn}ÏsTmüCûjþ=ð›áüñ·‰|I%ëÚêZ6—¦Ý<»wi$žEùÀu³1‚ÐF+¥ò[_õþ½Sïe£Ši4Ÿõgýy5óæî¿oI®­¥€|ycá8~Â×Þ ¼ŽÐÛÂ×o¶ w&๎á[–P`‚sÅ.…ÿø®|Eð‡ÂÿìŠZW‰u™-VºÒ¢öës,[<’$Ì1+\Â.æŽà»[/uø&-¯Šu]Ã? ÿeï^év¿mµ½—šF˜·q™$ó°(³-ì2ùEæØn õ+ öñ©ø’þÎsi^¿ƒM“T¸ðíœ1i·Nc’$Šy"ÞQSpʸ!”c¡:JQæNÝ{îýzÙtÙõfV¿;þ¬¿áþ3¶øÛû]ü'ýŸ|Kká‰1øŸO¼¸ÓV´šhäŠö‘RQï»Å¼;¨\„Ëò# Áÿ¶·Âÿ|D·øYoᯉ/ŒŽ º]Ôö"Ø]Ì‚9&`~Pè÷¯Ì0O8¡©ûXkº‘/Ä¿†réšF›.…¥ø^çR³’ÃOGo*Q, — ùL ¶íÑßX~Å>Ôþø»QÒ?fÿ k"Ñeð¦©-–ñ[JT«ZJT2+’¸Ø@bT ’r¥ð¾—×ïzyinÿ†®jVvÑôû—ë]Pý½¾iÚ–§¥Éð¯ãíÔö¦à¼–Ú 3C²9Œ*í"\‰eC)Lã'hæ³-¿à¡? îu;í| ý£[µºŠÂîÎÛðÞÍotౄ­µÄ›ÊF¦FdÝ_â-òÓµ_~À_µ‹¿x^Ù×Tø¬ºMÊÛÂ=ŽÞ Ó­'fšaèÙá´nÌÅX·BFF¨ÿÁ9õŸ év2ðŸìÇ¡Ko ¾¯&â/DKëSe,‰Ô€Ê&Ys·,Ë·&¥FP_½ÓEù¿=¬ŸÏ]•ž“唚§~¶òÚÉüßÝç©oþGðâçѼ7ñ“Ä÷Vox5+]3æâãGKy<·’ñLÙ‚ØO±€ef ¬ Ûð'íÕ៉ï|1ðwâò èkwPêM¶šêi2Y"›²¥Y[sïä9?ø«þ úÚv‘â}ágÀ_æÚàÃxwIÑ5lÌeÚ@Òº€’¼QŽw õ¯Wøf?bè¾'¿øwáÙâÒÚ}*{oZÙézlrChU Å¥òĸ »ÐI’ x­Ý4âåÕ¯çÑÛ·[?•ºœõ½¢QÑ~;®¾—['ÔòÁCü©h…ï>|Gðž½oz–¦ÊmnDêÒ$e¢u¸Äž[º«ÎrP:üÕõoÁ/‹ò|ið~ã8þx×ÀvK#šĖNd +ÇÁ¶¸”s³w8àŽùò\WŸðIùeÓ<#o§þÁÓÝ-¸¹³Ò"Ó´'–8céMʪà`…àé^¯ðËã_ì5¡x–ÛÀß¼cû?ZøŸPÔ›F:ƒRÑä{Å]í ¢ÉHB äù˜ž¹4K•ü+Gk~_‹üt•;Ôz÷émÿ/éaQ_-èÿ¶oìë«øã_ð Ÿ4Y°2®ý^T°Žõ¢r’ˆì²JÂl8ùY«¢Õj¿ÙËJ𯅰¾¼]övbýd»¼_5"&82ÈÉ%Tãp'ší|Eñ¿à÷„µ¨¼9â‰Þðþ¿ Œ¥•æ¥S6òÆ äù±àuýâqÈ£üíóíêiÉ-í¾¿#Ô¨¯ _ÚOàå÷‡¼[âoxÓDñN—¡ÝYYê2Û^A1Ktш@žæH­Û>j$9ÎÑ—! íi€Z…õùu¶ÿ=¾óéj+Añ'‡üQi5ÿ‡5­3\²Žy-¤–Öe‘Rdb®„©á•uVÝ&‚áER¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(®2ûáÇÃÍOÇZÅ GÀ~ ¿ø™¥ØÜézgˆ¦Òà“TÓ¬çdiíá¹e2ņ8Ë¢°V1¡ àc³¯×ÿfÏ…ž%ý¢~þÔº­—ˆŸâ÷…ü?©xgI¸X¹ŽÍ,/^'^Õ\A#†2”‘´z.~%=~Oóz?&Þ¶³Ïåù¯ËT½W-¡~Ïß uø™›âO_/‰lõ=#Y‰ï‚·—5äòHUL`¡Ie¸TaÆÖ#æHã<û%~Î×¾ ø·£xSñ#èÞ-Ôm£ñ%Ö›ªî÷No³þðD«’~èC3HŽÓGpÊ^(ã9sûjJh Ý;â–áoxëÃZ¯‡ˆô_ ý›YÑ#¸Ô//-š+—ººÀoeÌdg×Êå‰ÞÁ4<]{áßèöÿ<9áëøn”¾ð}Æ—máÉ$ºÔ.YBš‘xb¸:†Ë¤æt· a—:ZSµ­ÍšòRºOºWr^gF#—šU#.f¤Ú}]â¯/&ÚQïev¶·Ñÿ ¿àŸß³ïÂíO[Ôô8üy©CB¼ðåÌŽ·,Л ›m2ÚXÕ@O•¤X(#yLG2HZ+ÿØCà¬qx«V›^ñêkz’Á¨jwš¨spѵ“$òªŒÊ4û4')ÏÌîí‹ðÃö&»øt|s·âƒuk®xFO I§Ç¢]Igk+8a4fòúâéb_™E¸¸•+÷J|kTÿ‚aÁ¬èzׄu?Šº ß‚ï,¡±‹Jo Hmt˜‘¥ŽÚ&½dH®üÙî6ܳ¦ÅÂà–Þ­iÎO™·îÚ÷éy._K;ö÷šÞæ6SITïëo…Ý|×ßûð“ö ð·„t;BñÏÅ=OÅž'®/#›E¶ƒJV¤ 3˜ÿy#«y…2;˜Ð,jÅTVí¯ì“û6|1øáß]ü@ñÝ—õ]^°ƒPñœoî’h®Ò‰Ô€›ìÈÐ* L@I a|Uý‚âGÄß|OƒÇ^ѯt¯ ÛøcQÓ„ ÙêðÄ’*¯Ëx¯ eic€³ìšiŸ,‡­ñþ á |Zñ_ƒmÜoë'gÊü“¾»{ªÖ¾žñƒö0ýw‚ÙÛ- EþÀ¿|k¢ø›Cñuߎ|Cm¬ß麶¦÷Ñoº¿²‘^ÚèH…#ÁŒ'ÜSŒäŸ>ð?ì«x{á÷Ç?x·â¾—ñÿÆf—QÔtJo6(ÝÝRò Rh§Á•ãÝm „FæÕëÉ?á×zÜKâ[OÚK=2æ;q¥J4­F[½-ñºkX–mUì$±Cå¬6²Y²Æk´È|±¼í̽ëÚË®Ûéèý/¹¬j9i'e~¾vMõè—ž‹Ñ}ñöBøSñ¦÷Ã> ñoŠ~#kZž—¦>oy·Ë¡SŽß)A+ Êì¡KHæþþÌߴωüAø}âïˆ:·ˆt]Bs{jò=”ײ  ÎèP$„ »•ýÙÚ ‚Ñ®ÞZOØfDøOàŸ…š<+¦iº?ˆu­rHm<-öm?Uûy¸cçÛGt7O—&T™]ym°c˜5ßÙTÑ?g­௄õ¹ñT~+]nÛÅZ=•®.—3\ù­{qÎërÅIY@ eÉù8N\²p‹´_âäÕÛ_{}ݵКÒ|š6í}<’’_6¬½Ge®þÁ_¼C£÷ˆ¾-EËL]m¼@ЕYÈd Šn.æ$Œ0Îp*Ÿ‹¿g…þkŸtŸé~Ñ}¬îÄ}¨-ü_hžØÃ ÃfÈ€R¬=ÄŸø'ÅÏŽþ øwán‰ñ~×á׉-âßNÔ¥ž8£C$ÚMŸ³f·Ç1; Á ÙÚÿÁ:—FÕ¼m«è_-ðèÒñ­Þ©® ÀfŠ[eýÞÑÊÜÈÆ2àã!qŸñ þ åàÍgÂúæ‹ðçÇ^#ðmþ§yÍôš‚ý¾ ‚Èï#,jÑí•ÄŒ»‰t¬ly¯ ñü'Ç÷žÔt _Ž>ÖõYoæÔe“Wð–¥x·2y¦X§ŒK¬°´½Gö¨°»1ˆ‹Ÿ³ì3ñ{Gñ—‚>%üRñ.‘¡^hú­Æ¡.”m®–kÙ^_1gCcªý@ï™nÑ’d†68­]iU—ï$ô¶­ôÒÊÞM½/çe©Š©Q;µ}?o饺uz³Ý,`OþÔ‡ˆõÏüA¹ñ®¨¶¶Wð\¤1Ü´`ãH#®0¨ *@À5»á?ÙÓÞŸö„ð%<4>$ø»I‚ò´Û€ºv‘Ö’ÞK§Ie<ù³Da¾Âcy«â¿Øê:ß5¿|VÔ|%.µ®Å¬ÛÅ.–.DR‡í6öíиIäÙ#f T…Q¸×‹^Á8ütt«í;Gý ¼5¦Çus̶÷> ¸º¶µ+4r˜íjhmã-B«|¬ÌÙ9 Ï757 =µ½UÚò³Ý­õ·réÆ0Ö=öÞÝ_Ë¿Ìô¯ ÿÁ>¾Þx/ øûâ|oqö(t·¹Ò¯L€ÚÂå’€Äî3-Æìíôo~Ã>ø§Â>2е?ˆÒëš$¯-ƒÝkUMäV~pØÏ'IóÞÛéÖ¾ ’ÆYÉ#Ë RIª´p¼ªû €"çæ#ÑUÅTI4ï×Ñß§þ•ë݉Чð¥¢Úéu^½vÿ€{Ä?Ø£öw»—Æ3ñ÷ˆ¼si¤ÝÊÚ…è¸×v[[gœÊîTF,àdôç#Šô¨>ü,ñ6ƒà Zx³Æ:”:ߨnã¼V{Ëè„RHÏåygr·`]½@¯‡ö ¼ñìÝð÷ᇈ|Aáñã;Vm~]KÄ~·ÖÞfŠh–0¶ò[¢Érª,¨ßòÌýìî®/Jÿ‚oj6ÐÙi‡Åo?„ ¼Žâ=.ËÁs[Åi#ÈâbÈ3‚aPÊÃUÉÅÇ›m-åoø-Ã¨Óø¹’w}^»uI^úýÅ߆?±/ûýwâg‡uŸ·¾6K i®'Ó4{x,§Ñn¥…•|çÃÈY |l$!ûáA5ôOÃØ³à‡ÂxÇž‡ÄñkúF‘y¢YOq¨n1X\0w…Ü(y£V‘egTffP˜Ÿ’µïØ;â7†¾xëÁ>£ð“â^«â_húÅÕ´ þÌÓb´<©žêÚ]I¾Úì¿3‘,EÛ¢ö©%ÿ‚cêúž¼«âo~ñWÃÖŠyô[ïNòObà"´¿Ú^K•ó”)’a@C`ЍÜn´i%êÜ7ÊíÆúÞÛœøk©¾m.Ûmvæ’_;.n›ì{&‡û ~Ë?ln‡µOø_D×o—Yë^U­Íë\}¦/%vBÐí†àåžµë~<ýŽþüDñˆ'ˆ´2ö"d°RݧHÅB‡Ž!U@¨±C²U]±ƒÍ|ð³þ £ã?i1ku_xsÆpÚ\éðÜËáx¦¿Äå¼û…hu "…Þ61¬ÆEPòY}{û9~Èþ:ý™µ?áñÿíc÷ai«éÃÂÒXE”̤Ùíº•â‘ Änï ªÉµp 4Sät¦ì»tÕ˧k;ú¶ìµ¶5jOÚ;jŸ^º(ýú¯¹$tþ ýоxJùµø«âHˆÞZ]¼C]À÷È‘©!õX£V\íÊ3HÍÁÙ~Å_³õ¶±ðx·XþÎÒmÖ÷@»Õ!¼{}>Xã†#"M nFŠ6NèØçvMxEÏüªk;_ÿÂ!ñcá—†µ{Ø®—x~4¦Eç^ÌÌÂ=J=ò¼—P»É€³[~ðÙRø%Ïfø“¦øÿ_ý¡¼­E±KëX<ªiókŸgœÍåÝÅ®ºq|¬VgÌ[ ÈðH²?~öšßV·³·ãÑtÚÛjT*ÔMÛDÞ¶ì¯gÓ½ÿíçÖçê—Ãÿ¤\hQx›Ä¾#Ó„ìök©Î&{8 nÌŠrÍïÚ·nüMáûèþ¼Õì­üI¨[Ü]ÙY;â[¨`1‰Gp†hôóÖ¿&¼#ÿ·ñ/‚¼oàýãŸÒñ´X´]CQ›À×É© M1dyµL’ía<‡s1^»ä²³I§¢ÿÁ2üa 'Ã=fÃãç‚fñ=ö¯©]øââÆÉi“{ê¾l›Ùä¼ï’ᡔݗ¦¬#íçº]u×§¯fÛÕê·Ôr§YCTïòÒëïzYh½Öú†âæÞÖ?:êxm¢Ü©¾G 73Q“Ü’õ$ üü¶ýš~3ü8ý˜þ+|ÐüeῊÚEç…õ»}&Ò~Ũ¦§u-Ãà “í+–ñ¤‘ i\\1žIÝ›pð˜¿à˜:íäút÷_>Cᵑ/“×¾{›m:a­Á«­¼@jžX·ŠX"Œ«yc%t¬gŸºî¯óëÓåø•¾Óëý?Ç×~Çëñ Iw5¥Ý¥ý­½õÕ½í”È$Šhœ:J„d2°à‚;ŠüŠÑ?à–:…LJ5 oã_‡5ÍbÀK·²økRškß2âÁ¥¸?iÖ%Xî&·³xeh•bsw;ù?<‹'П³‡ì›ñCöj¾ÓWÃ?þj~ºƒCÓµÝÏÁ2iV0ÛÙX\Á$ºj-ä²Z<²,C$“Avò„@ò—]iÓƒƒ”¥gÚÏ»ëÛ¯éÛ J\î)i®¿+íÞú[¿‘÷ÍùáàoØ./ üjð·Åß|AÒ|ršL­,v7z»îîï-FGk¶ûCH’ÜùE¥[K|ö€?Cë—þ¶ÿ;š=ÚèQE (¢€ (¢€ (¢€ Cœ¸ÝÛ4µàºþ£ûJGûDü=Ó<3á¿„—?²Ô¾Ô¤ñF©w{r¾"¶ÖƒÅö(í¢Qä5»/æ;³´‚»pâÕ¨÷¿à›ý,¼ìº£}¿Îß¯Ý®Èøã?À¿Û³âŽã= XñMÖ¯áË©µ‹6Ò-µ{kkا‡Y†ÖTýÊ–b¹Ò¼È.w5«:*eŸfûáßügR»Õ4³ñKÇ~Ñ"Žhô›ý"ÿÃmu$M¨ÞãíKu§J†ajúyS û©ƒ0aþ‘Øøöý«4Ûω:vð{B×BñMï‡-õ-óP¶Ô¶XO¨[º¥¥Ä’ªÈcfÏ"¦Ë§œíd‡é¼3ûT|jÕüñÛZÖ> ø÷Dñ…¬âk#ðÿ]"þí¯oà1ÀŒŠu5Xí­¥-fî6Ü» „ë·E»h’~v–ßðVñºæ·ºi“rTæ­«I¯+_^Ïÿ&³µÚ‘›û@|1ý­î~$O®üñV½¢Ø6…ig=üg@Ž}Nâ =PF“Éqfó²©ìä`Q±öD—Ç|Ið;öäñRøëÂ%Öuá¬ÐjóiÚ|úæ—w§4÷zƒÇÛ\Û5ÄiM§4D©°ÚȬÁIúO þ×µö·®xj?­ô}X×lô™–óÀ^-·–Ì >ֿ䳋W«¼·1Å=ÂClk²IKÈ_øÑûa~Ô>øÍãŸø#ösñwŠü§¶Úâx_»IŸÈƒj¤–êbºWšáFøˆÚ!˜0Â<ˆ,D©rÝ_~—óíç§oSJÒs‹„’ÑGü—Ï£ù˜>øSûvøiþ ’ À±ê7·Ú~ƒe©éV°Kgs¬]\ÜF­¦‘/š)PÄÛ–YƒWçègð7íýá­boøDµÝwÄÚ]Ʊ ò¾µâÍ=Ý-wiEÎ~õ—¢ž\Q"'È :xÒþÕŸ·Æâ sÄÒü ñO‚­Ê'…ãø}®iв›«TµŽ¶”G<“I;“XZ2‘2³/¶Ûþѵf±ªêTøoqgàÍ7TÑ+½;À>"ŽëÄÓÝ –å#cº… u‘–X²#Œ”¬ª¿´ºô×[ùíúug5»ûA~Ѷ? ~x†çàŽ¯6»¬ë7úV·m¤è·÷SÙZ$óEm¨$!‘àŽEH¦`ìïÈB¬¤~boÛÏö™¿—^Ò|ðpjךMÖ‘¥Ëe¨x3Ä3_¹•,šêév(ûJÀ.%±˜äU,S¦„dêÆÑMÆÉ쯧+û÷õzÜÒP•œ%®­éoævWWM-´vii½Ï~ý¢þ~ÖºŸˆt­OÀ?2i«aªøŠ÷Ož':¤s$0È’È¢Ç%v)±÷¹?k×äî™ûa~Õ^(ÿ„Ãð|ñOõˆ ÔæÓõKÿ„^(šßP° äI·s€Ò2Í´,g&½7âíûMøgJø}‚¾]xÎþóCÒ®ïn®¼¬Ân¤Úgòç²kvùšÎlÌÁˆ »I®vù¢¤¶VKäŸÝ¤^öéÝ4iòÞ7½îõókõ—çÙŸ¢´Wæ‡ÄoŠŸµÕïß‚ž3ðŽ>‡ã˜<þÔ_ï¯øËð¶W”éacøgâ­¤·þÐUe‰Z)ÌYE™£Uù±ƒ^ñÿãWí?¤ê*øuðÿÀ~(±Ñ!)`5ûO 꺭ý¼!  {ÛþîçÎ "ÒîDz¡RJÝ»/ÃüמúÉYÛ}¿ÿ“ü:´~˜Q_üLøÝûB|8ø®ü=ð_€,>!øOð妳oª-œ÷—**[¼sÇÇŸ$Êå¥Ú‘|Ñ//»&¼'[ý²l w¶ðΗû=k1øÆâx’ ·økâk­/ìîÑ´´Ñ-8v>SÊ®»Nì`šª4ÝI(C­íÓgn¾º_t›WIµž"j”J›%w×¥úWinÒ­”WÂ?hoŽÞø¯ø#@økª_éú}µƒQ| ¬ê—©2/›}ö¬ae†L£YïûA8m šùçZý±mMLŸÄ7ß³ìBR—H´ð/ˆ.î90+•¸V•ýó>vav UN›ž±þ¿®½žTÒÑ­Tz»~?×äöjÿ®´WâO‡¿à¡¶¯à=3Æzwìë}ã»;ûiot˽ῊÚù>Ë;ˆˆ ,²OÂ]YDÔ/ ~ŠøûQ~Ôÿ¾!|>ð—Ä‚úo„´Yµ4¼º“D¾Ó¦±2íy^ Ù–eŠá$„ÀëŠÌ“䀞©eõSqjÖÑê´i]“x{E³Iýû~-o±úYE~E|SøÁûTjÏ¢xׯ¶šµî«ž¡{cáGU‹A„kKÖ¨- $r \·œÍ¹A2ÚêÿiOŽÿ´oÃÏx¿Á¿~|[Õ´äÕ4¡c®éž Ö5“wg4–Ñù´qù¢[…{ƒ˜—˰ܯ%ªB5ÒM¯º×üôêÚi&í{Œ\ªº+uküÝ–¿Ÿe«²½¿R¨¯É«Ú¿öÐñ'‚-&~Âcâ­÷ÄÿøJüoà½cÃÞ"ø‹eãØôËÿµÌ6‹o¢ÛéËjû¯™ƒÛ¥ÂÌ=§ å’Õâ}Ö?y{·è÷J^WI¶½;»†´©ÍÕ÷ege¾¶|©éÕÚûyhº…á»7Ó¼;¢é:žÓÍtÐY[$´ÒÈÒK!Tny›«3rI5¡-ͼ2[Å4ðÅ,¬R%gÊÀ!Aêp Àì ¯Éû/ø&§Ž-ô«øÛö›¿¶ñ|Þ ‹W>$µÒ/Úúx® C*]j“Ûù›.¥'‚8$Ž%ƒ¼1¸ïu¿ø'þ£¯þÏ¿ þOñ/ÁÚ?|/{©jPxŠÇÃ7ÒGkuy§^YÍ-ŒWz¬÷V/þ™$Šßl”©Ü£àk8¤åg{ZÝßD½nûIÝ®m/{ùvõ»û»Ÿ¥4Wä­üãOŽz}CÇ¿'Ö/¬í¬ÖEðüñiÈ‘j"D€ÞjÓα´×Ñʱ™HO²Æ£ Gå{·ÁØ¢çáÄËoÿÂÇÓõ]4»)ôKm íà’9w3fº›Éc+É!0÷™Ìó>B“eÏ(ô[>þ]×Ïår¥Ëm^ë¶¶ùÝk§£³>ÞÖµÍ/ÃÖ'RÖn¾Çd$HŒ…€f`£;A dõè;×—iŸ´OÀíkIö—ñKÁך1¿Ót±r·`!¼¿òþÇOñÏæÅ±z¶õÇZøßÁ¿ðN¹¼sâ+­ã׈5qs­iú®—kªè­m Eo~'kx«A#¶ŠÎ×tŽä-¨r¤ `)õ„Þ1øaãˆþñtZ¶³á­eÌþadí¥ùÁ5»Þ9–)Œ<€êUXŒ±¬dä•Ö¾_w_¿§Þv:tÔù\®¯ºôÝ_]ýÑú+ó«áwìUâÓü_ñ…ñþ§«xr]'D¶¸]BÒ}<¢Uµ6 ößf¡[t– î¾sløwÁø'_Œ'ðv‘Æ[éwOmkí„zbG:<*|Éa^Ëoiö­ånbV&X¢$«­®ìº%ø·§É%_™Ïow›úéþoîï¡û \æ•àïèZÆ·â¾ÑõýM•õë[¢¸Ô ,Š¡¤ bkòëÆðL ïAk§ß|x:í¨ðݾ‹sw­hws]Ü]'˜³]³Ôm¬È$Ä‘½³óL¬¥E^׿à™÷Wz¥¬žø³áxh_½åÆ•§øfúÍ$é"'W³Õa+4 :ùNC"˜‡îÈ +vN6ë{ù~:§ÿMß¼»ZÞw½ÿðÆú£Z·ÅO‡Zö§öÏŒ4]7ìWöÚ]ß.ß"îr0œÿ’Žù®ùÝ#G’GTAff8zšüçµý‚$¼ø#ñà׌ükðçÅVÚõþ{<ßð…4V׿×kûw½^K>Ðe4[›qÚ3wàwìn|®üb´Ônµ_øCµhzuž¡­Åœ“I‚âú”´±ÆÈñÀ!šSˆàU@Ëf¯­ÿ­?ÏOÇk²’×Ëñø­ù{ßzÞÈû³@ño†¼TÚÂøs[Óõ£atl¯ ¼Å¼áü²GÚê~Œ*¼ká9üauðþ-MÃ`º¤º`“ý!- „mþæâ}M~\KÿÁÔ ÑtÝ7Cø­ð×ÃÒCÊiþ»±¶Õ,-¼¤Ëk«G)ŒNÊ 3ä `øñûø·âî¿¡jþøËáßÚZxzÃA{{ï Üj0·ž9¼Ñ7öŒR)>^%œg%ßœÔ^º÷·ÊÏ_¾ÊÞ¾¢­£´5_ðW§KÿZ¡õRþþËK±¼Ôõ¨l´ûxšiæ‘¶¬H£%‰ìùƒü6ÎËVø§«Ú|vñ\©â) ±ÓgÒ k/\Ê\@„®ÊpVY\L7†ØµÜüvý…5OŽº~‘¥ëß-t+-&æKÏùæi`d…#Žâ(ÒÞç'϶ÚQþQ¸Šº‘JÜ®ÿ¦õI|ïÞ×.[é·ü5×âþïCëañÛáÿ FÞ<Ñb›]ˆ\iQÈ]ê"ûM¬ ¢3aC6$NEz>«¬iº,0Üê—BÒ %XʱÛ¦p8u<æ¾ñÇìMÿ mÏììtÿx{ÁðxK²Ò£¹Òt;‹+ëÈ"UI­D^¤bkZOÄY!°JŠóh¿à›VöZ´>5êZõ–±x“Gm®øvÚæ×Lƒ÷¢H¢ŽÝàfÞ²-#¿Ê€lñ]¦ãUÝŸ’Ù¿6½lLãôºW]›½×¾^Wéúw±ÏsC"M ¨eu9 Bê+?x~o\øB=VÕ¼O ¢ßÉe“æ-»6Ñ&?»»Œú×åcÁ3&ø–Ò{?xËÀÑhÚ4zV±àù5+›7Šef{{„¾…bŠhÁI!16âwoÀÙS.n[Û«_…þæì¾~LQK™]éÿÁ/5°mâð¿ü9mo¦éúo‡<1h‰ö6‚8mјTŽ5ÂŒ°àõz=BMfE£iIâ­ÒÒKñl‚æX‹,M&7‰ N$ãšüÒ‡þ Ӯ٢çüoÓ¬’²ûO Ê£J‚,}Š[á²Õü½íÖààm~ÀÞ7ð×>øË_øÕàï.=å×—ámJÂïWnܼk¼ Y%žX%IShÆFã¼R”µvõô×n½?àKHi«í÷¡^(ñg…| dšÇ‰u]Þææ;TrŒÏs;p¨ª€³¶8áTž$'‡|qáßø—Kð׈tÍgRÑ®–ÇU‚ 7=„åAƒª±FVö ×Ä7?°£j?ôÏŠúÇÄ=][?ÿÂMÿ‡ ËÜ÷,‘É#\àɸ ¡UŒ ¤#â'ìâˆ_5߈—¿¼3ƒu=mõKÝO Îר 9-Öò=A –L’ÞQ\íù Pk8=5ìþNñ²û¹¾ä:Ú5É®ºúZ[m×—ï/ÑúçµÿxoÂÒh1x‹X²Ò$Õ/ÓLÓÄÍ·íwlŽë ú±XÜãÑM|ðûþ óÿÁß &øáâOêþ7²šÍ5kG·ÿ‰Ê¥¦XâµhKÆÓ¼²„2 žfÅ`ªsW?ðOÚkhþøÉàŸ‡>’‚ÆßHðDÐ^éá’ïs$é©*]—B"]»1óÜ.¬Teh»­5ü÷í·õ­Ú7jþŸ§õøŸ¨UÎø«Å¾ðN‹wâ/ê°hºº<“ÝJÇ*3³1íPªÄ“À¾,øûê!øŸÆP½üW—úÜw^´¶H®|U§3kQÛ»^hùQÞI§ ƶѦÅÚ¥2Š'<ŸKÛ­û~‡¢ák'×ð¾ÿuÞ¶ÚÝOØj+Àÿg/…þ2øCð˾ ñ‡Œ­|oªÛéо¥¨>ž^j:³—’òîW‰–ód}Á"†%N@È /¾S­¸§{uîa ]\(¢ŠÌ ¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Šç¼Yâ]?Á¾×|Wª¬Ï§iö²]̱”Ê£$.öUÉè2Àdõ3šŠr{"£'eÔèh¯Žü?ûs|Ö|{ᯇZ§ˆl¼®êº4úͱÖu½"'¶I-™Rñå«]"”@(à°ù7úßí9û8iú,ž$Ô~>|Ó|>’¤/}sâk8 Y€ˆ]¤ ‰ ä’1ZÕƒ†²Óú±+]µ=ÆŠùjÏöÐýšõOhßto‹ Ö5;Ùd¶[¸u‹1iÊÇ‚ ï*´’:KU‰_!Ôœ]ÿí/ðÖÊ+»‹?5é¥dKk{?Ø™.Ÿ`T/2¡%³¸ƒŒÔKMÆâÕïÐ÷J+Î$øÃðž/§‹%ø—à8¼.ׇO]Eµh³]ÚaÚ_wsœ×'ª~Óÿ³f‡=¥¶·û@|Ñ®n.ZÎÚ;¿YB÷3¨,cŒ4€»árp§ÐÓQmÙ ¥Ïs¢¾L“öæý”.4Û‹ï üwøUã;Ø”I&›§x—OËyPHašxØ)heŸ½±¶ç­x;öÛý•œ÷6vêÅKHÎàsÇò@ëÅR§'}6Ü·NJ×[ÿ_©õMà3~ÕŸ³%®“§k·ÿ´Á½+H¼kD¶¸½ñ¥²Î÷8û:2A—° ¿x’3]n½ñ¿àÏ…uKÄß>øX†Ô^Ík{­[Ã,Vä$eg)ŸQëIŧgЇµûž£ExM¯íGû5__j:]—íðVïR³6âîÞ?Y4–¦sˆC¨“+æ8Üzf³õ¿ÚëöSðÕý®•â?Ú_à©Ï3[Ám{ã > g”1Rˆ¯(,Û•—<©©r»ØqWØúŠñ Wö™ýœt=NÛEÖþ>|Ò5™îVÎ K¯ÙE4ó°R"Di3éò€Oμr+»ðÄ_üSðÝ¿Œ~øŸJñ‡…¦–X!Ô,dó ™ãrŽº0 ÈÈÈ<ÒZíýW_xù]¯ýuÿ'÷3´¢¾E·ý¶¾ÂÓñ‡Â­gS¿ð½Þˆ×‘ÞëZ„–‹¥FÖÅÁæIÙ­ðÎ}¡"Á•7`=HþÑÿ³Ú½ìmñËáKmkíŸÚ†ÝÉ +3!‚2íD]Ò’Ù«¯5ý&L´n/u¿—õsÚ(¯ñïÆï|<Õ|%¥ê¶ú¾¦5› CS¶¸°Ë[ÚE’;f@ìHv+ä°dg7á§Ç]?âOüyà5øñÁzž…¥Ð¹ÖmíE¶­mp›ã𶏔§pb¸Ì8o/c+5F-ÿ_×õ~Ì$ì“}Os¢Š*@(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+‰øà âŸüKðûŪ'‡õ[ckvl®ZÞ,NÙ• 8-¦Y£TŽ#óª’HÀ ƒö\òïýkþoïtw_Õ÷ûì|Écû&ü.Ó4†¾Óo§rnF›*1ddrÊìη>âNêó?°/>*ÍãWIñßÄok¾!w7ÞV¯rÖq‰%ÈÑ[¤ˆ‰+:!óNæÚ¦>Q™OÞ´Sm»ymå·ù Ž—K¯õúŸÜþÀ¿³þ¯ká§ñ‹u«kö_]K©F#‚k©îíVÚá×jfÛ(£gc1ôFQYÐÁ9etÓ<;§Ýø&]Jm"Ö;=2òWnlQ7k†wmàn,îÄ’ÄŸºh¦¤Öû·/OóÕýïsáþ ×û3xoAÒ#òtë™î´ë¹5×¶rM$o# ¾k³yQ‚ò3ÈU@,@ôŸ‚þ ü:ð.àMðý¾ª<8’¦}ª}}aæ\¤òƒ"–Î dq^©E?i+rßA=eÌ÷>U׿c¯„^#ø{¨|8Ô'ñ¬:]Ö¿yâk‹ë]Yíõ 5 •™%—ÏŒRVy+†\‚¤šño ÿÁ9~iþ'›^ñ†³qã‹[mbÏ[Ñ¡½±†ytÛ›q"£y×"gl¬žAÞÏ *îÄþ‰ÑD*J/™?éZßu•‚k™r½¿Î÷ûîÏñÀßxëÅšo‹¼Auâ î¬ìWO·µŽåRÞ(„é1ÂíÜž4ÜCr)㊿ðÇá&ð°ø©ô¿ø×Äsjú„š•ÌšÍÿÚZ9ª¦p¾€ä€Õh¨Žš/?ÅÝýïQI_WýYY~Q@Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÿÙPK\1A§"O6é6éQuickLook/Preview.pdf%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream x­œËr#·†÷ýØ¥UÅ‘y§˜¬—“r6‰cUÍÂÊÂZ¢=žn™3r̼_+Ï’ƒ¾`7È%Í,H¡ƒs¿Í_Ü7î7vã˱ý›,¦‹«ÕÚÍÆëËñz¼vóñØí~po]ã¾øòãĽûè&îã;[`Oü’‰ûàf“ôgõs÷gw5¾ZÏV3÷³6H#[w xùv þY(‹ñx¹Z3(iÄC1Ħ1#ÂþrFÏåbÜýï†ÞäÞÕ»î/×nržÚçd5½œMW·\ºëî‹ëëÉåØ(½¾sß¹úç 8uõñóöÂHøxQ…/û†¡O[¾ýgd€åpïâ”6.¯êO»c{=æSks&«Ë•«Ý÷÷úÎvᳪ?0P»pÿv×w_]™Ÿä‘ðh>[_.WÓµñ¨ <šÂ£Ú]¸ëŸÎ<ÌŸºù•ñr=‰@g5Æ_Gfl¡E¬cÀ}ŠSØ}è*“M’û>Nyx@{-kݾ}Üe‚ÞiÝ>~º0EÌÄß6®½saW…BL›çˆ±¤Šîa×nQ ž»vçüÔ#õ]Ä+Mû47`±ñkû¨6 tŸ¦ÝîÝ£ÔYø4“ìùJÓ“íd¼(wÃæ’»‚ÆÔ»ý!R,[ínê?À€"»‚3έꛋQN°ÐaS¸ÖT!ÀþH3ݯ†9,Q>ïKù©ü!y™?0{ؽ“jÞoÎ^ÝýP†LÐ]!Üz1c7µLB+æóK0Ûæl1=¨Îu}=˜¬£w5#¯ð®ß‚Î^¬W…*ª¡ÓËÅÜûÀ?ãƒÿœ› FS#ºòi¶Û7ãåÌ4à r–5]:÷õ]BÜ)ð»Ô{OJ¥àcÞgÁÍ0ÍÛ>"wÞ]1hähñ w‰^`äþ¾VJt`œ4­dGç2®¾€ç«‚€a^s× [8ÅÌ1ÅÏ~y„HÑÖ7Ö.~3ÉÅ’8‰Á˜k®÷WöxC® à<÷á*(Û= §K÷/‚„dº‚@Ju‡š€¹Nº&‡ÆÚüî"h¦ŽÆ\@9íB÷ ßšûK ºêJ…'¥}A/û‚®ê‰~~Ò¸´„}á&ÜÊòõ“i£8Åҫ伂6kcN8Um“]_0ˆ¡QHеO¬¶´¿V’d+•¹ö6ä}UÍ4–¡mÅeòêÌbÕÖ;÷Zôb”ð}ÈR†Àö£,¿x0°ŸARîÂ3t*úWó€=AŒ‰m3zFqY‰jrUª. Ý›, >bä6-8>2TzÂz8coÙ7›½k™"‡í“óÀ@¦1vK ™€ÌÜC+»M‹°.í×ÓÇ[p5æóÉf1ªÄDJÝ—'¢ÝݤhbÉ—”W„m«úTb//ó„âtN¢œ×‹BO6£‹Ê:} ëZž¯ûyH:±¸êkšé{IFw]§téê;PÆ:`fXRÕ¿2ÁSþ(¾a 3 ðy0êŠ9SÊàŒr¥S¤9äfÌ:˜Õf®YÞp Gû `yp´›(dQÚ"úNÝ#Ð*¤PÚ!‹Ià·³®@Õmû !AÚîÚÇû­kÖr8Louä¡÷y00³Ã¼a -·ÅƒD…uFõÇ£$8NdÉvćXæUµä¸+¸ƒÀ&pLÚÀæÍ½ug)f`^#Ö—»‚¹PùÓs2»Biå3»Y^›„Vì9™Ýj Pcf‡"û`¦xü^²ñm}í RÚ}–cëÎîž|/vè<ºë«óŸï<êÙgwC°áˆ§×,ìíɳ» 1OícD 73é!u“‰z@aZºv ù r×îÎÜww@ôaàóŸ© ÏhŒHG¢q¦S,í™ÝÐ{R>Ö‹® =/6Ʋ»rž®m N]?¦QÖËy_‡¾Ë{Hàog\Ï:N¾ÒqBU«Á ^#KÏŸsœà[²ò·Ïîú;ëúWv-Þ{Ô#;»ëŸicà6C'.}ií$u:ñŵÁœÑ)m(X~°í-Œ^6rN*;„ÚuaæC¨æN0ŒRÝ‘Q °©LíÏV­kG&r ð+»DD¤˜ãÓ¼Æð˜.Ed=u€R%˜*¸=´*þR»ß2©BLR:Œ ’ðɇº0èÍ‘º0&v²º¯M²€mÖ€ÀRõöÜW,‚ð׳B“0Ç,ðVgý(‹Ôê&e9HàVpÑ*ü*ŒzY}Kù—u+=ôÀ®#‰t¨ã›qRžWØíMÿEàû8kÒ ß‹`&z¦tƒ^HE´©¦ê‘»ÏßèºF/¥Eg¹‹aðèd»—jÔ'¼!ån“4TtÁø-ÊxýTåVœFÄœüÐaHO¤±ñ–X÷¬š(O€»nÁb:íÛÃ9.ö˜$†PÍňz‘£w|±íèO¦]’9'âRÔ³ìÅ#%)€²Ð éuÞ‹XeªYº SÌ™0ÐEŸ q˜ø(5ÉP¼‚sI÷ÌõÇ1Îfi¯æšO=8Ë€DæÅlP ›Ú˜“*„¬˜¥¤ü÷¸6ÀòÞabô™J”¸„ iJ‘Eã«TI‹Å€Èzþ UR®1ï«h3ºØuvÒ+z/2“f0Õν8Ën[S³*ÜýQæÄêEôÏR?+]ÍFnìÎ*àd5L–ÔÂ,kè1]ô/‹›Åf eÓ@-½i¯4qÅæ:r9…3­Ì}Fì癥Çè…Ñ Œ2%=•8›ÿ­ü[¼©GʨÅjPŠ›2|¶b©ub‚}¤$Tĉ‘pV®‹{µ P¨©R‰C Ôaâ‹)¶$—?³CNí)´Ü¦ÏNÐéjt½àcw£ ÄvœsKœ@œò>鞤_l"³mþâÈØX&"Sb|w–s=ªWÃÒº»BºK?¤_ñI<Â&2´í{§w$R”ìä1˜¿v3ž*Æ ,»È*š¤½Ù†½ü§Vö"Zz›2ê‡5B âéé^´!6lÈ=Ê$t´gqth˜2=hµ|ÞGØ›þÛӋõàHÔ|Äé#Jc8QîÀP*$_½Ê¦p” —Üò7ýÈÇ@FµvŸÉQ%CÉÌì2Ñ›ãþŠ7ù–/±—±ã÷, Á0§ùí»ˆcl—¼¥€ú÷áëPœ¶±+–/ýT´Ç×g¹a~ÂÊÒM¯!c*sSk?õYȳ—É /y}­wëú$@y\I†QÈœÿ†"ü,Ý6 !Œ¹Šßai×Knðv]ïålXA-ÎÈç†%Täõ®ñúíÉ®w WV$iôÛ ž§._`¥ò<ÓÍÀÅi©vË£v´Äû¯sö½ìÞ¥}í³oƒÚ¯‘MØœ(d@LžÚoe(#°ÃìÀ5ý¾Î*õÚÝû´6{U½×–§O‚î[°Ÿ…ºÉ芦¥,=©olÇú®X´f™6O}°^0Æê¬x×ñËì·ë€,—CûýýÅïë –tfÓB¤ØßïY¥£EÝãÒJfëîÝû&L!ó°_UoT÷:½ä­¦k_Ñ@2iåÁQr±Ý±×;ÂB3åT…[ô™ÓU@õœúû9Áî½Àë9uRA_ùy6Ù¢å9J4ŒŒ]ëq¹õ&îRÛ/a¸¶â“q-¤;xñ%þDJÓNÿDŠ IçÝÄg½âliÝ¿>R½B7qÙA=ðêÆ\ïûÀ^H#ºõ°M®÷¿±J'n%Ïš¯ Ÿ¼¬`Lj“TXb”ŽöååkUÙª¢Rî~—$ë>ù¥…›;ùRƒÔ!K*ldºqÝïÇHrÈþXÉ®c§x _Ÿ^®1ÀݧDt§+<ý7ÉçUJ¡½:"–ÞƒK¯¢40ñ¤Ï°Þ3¦Eñs¢Ø°Edÿ޲«ž<= b>6òÖö%AÔ_¼òÄ~ñˆˆëi‚üÍÿ*6û endstream endobj 5 0 obj 4515 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 309.0909 400] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 8 0 R /Cs1 7 0 R >> /Font << /TT3.0 11 0 R /TT2.0 10 0 R /TT1.0 9 0 R /TT4.0 12 0 R >> >> endobj 13 0 obj << /Length 14 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x–wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû endstream endobj 14 0 obj 2612 endobj 8 0 obj [ /ICCBased 13 0 R ] endobj 15 0 obj << /Length 16 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream x…UMlUgתŠ´U+•'þZEi´ * ®:i"×ÍRm×ÏñÖ›Ýewí6QO¹T!® „z¨Z~ÔæÒ^ЍTTÈ©H­ ª8â›õÚY‡CÖzö÷æÍÌ›ùfÆKÔ}Ñð<»KÍ;¡_˜Ìξ<{Ltß .Ò¨‡ðfàeK¥ ÆŽëHþí|î}K)–ÜÜ˾:Ï6Ý¥Ë20¡uË-æD|ÿÝXÏU·©ºú$Ö~uB}NR‡I¨/¨ÔçÕ<¤ÃêþÈÆ‡í¼®çÁ7ޅצ§×¨žŒçÜŽúÏ{ç%ÿUËüæÍß:,ÝvÜsˆ«¹ksöÜ$GÈ­ëÿ³!“|];ûåöD„bU½xüfϵ³t$Y‹¨:åµHßNßI¯âûVz-é#ýCz Ÿ[”E½ìˆÙydÇʈëx0q€ˆê¨+G¿·#Ç؅бéGœ¹‘U€ ü ËZÄT²æ‰žèÈ—sgWœs;<ïć̫|½x¯HK}úÇú/úúwú¯úªþÐÏÑ´ú¤Õ%Q÷)o)Ÿ)_)—”Ï•ë$”+ÊŠrY¹ª|¤|ݧ®(—à…u[=×ì±vfšq1ܱAÄk3o,mEp gë™Kä¶ñ†Î~nߥÔvjjyíaíqmBëÕöi´mÚ Ö€6ªíÆÉÎvߨq5y¶’=kÑlÄf³’UüúˆÒÀg=.žS‹f·E§#‚¨fàÿÓÊs…¹H½‚ÞµÔ]ê€:ÏQV݇I!ž´ÌH&ŸÉ’Èôf†3™ÃŒ}sÊDf7N‡ñ=ÒΈY1“:yÉ„sÚd{}^ø_‰{‰½4€mìd(ÏàE”s½ßš«†bPןY¼"¥sÌþ>aضˆŽáË@ú Yî'~ÿ²ÑG£÷jjëu³î7š2J¥¾&ú"jˆê endstream endobj 16 0 obj 1088 endobj 7 0 obj [ /ICCBased 15 0 R ] endobj 18 0 obj << /Length 19 0 R /Filter /FlateDecode >> stream x­\KsÜÈ ¾óWôqTµ¦ùæ0§$Ú’J%»±R©Tœƒ-É–w¥íØÚÿ}¾~|Ø3’¬áH‡!Aâk~¡ÑüÅýè~q•«Ê ußôëqrm5•ÕTM®«*·»vÿr÷úüsí.?»Ú}¾žx–Úݹ¶ÖÛâ6ÜF¸uµžÚ±u·R€Rn܇ˆâlqH·EDé«j§Ê (%¢@ èPöUø÷…¹Wö²—wî®nâSüvë²qýÚ]ܹ×mYA³‹n5–gîâ'÷§ X:7^gXy½,fóbþãV?œy)·º=ƒðø½N¿ïÂo±úÌøÀ]ñJ}J<7‘Ë­¾dhîË ø2;)y·ý){û2ÝÅ}ØîÜoäæSÂâk7îëöAŸo¨Ë•ã%üYŠ'öÖ]&¸í†´_ÿ@’ðÝ%ÙkZ¬„—/P±ÖïÎÜÝÅ_båzÇoÆ.ßô®í†r¬ÇÆ5]WÖ]ݹ©ì§~êÆ"ùUîÓ¼(w?”mÝ6ðåf¬ËaF×’v+´BJñ´¼ä[wc¨ä¾C; ’¶åºÅ?p˶oá¸ÍP—´†ìñbOÒ>¶×:¶Ùͪ®‡&HV Õ¤-GüyÔ¡ ´ Y i§aÑò”vJ4/m(x†èß´/ƒHšETÞç}? ß»ó7©)¾9/žhŠj[Z­¿[·ez t[ë5””zŽ£ªô\7îMìëJäeÕ[ä"‘ ;@tËø›F4c/i~þÈ-*ÊwŽèŠº ëÁcù«1™hRÂ1zdà(ÇëP }7¶C/eät•ZiòRúʺ.ÛÐâ8U7ôý—ôبÍÌùà Q˜AƒF…ùa»îç:Ðbå¤cf÷Åþl¯3zf.Ò(ü²Éøê¦-žÐ‹='ee*=)pH2£{ð'‡¤8âét>‥CÀv÷VG÷gŽâl®0ºåP³Ñ-"QZ[dÚÝ"_›nÅêå£[„›©æIÅJU£hŽîAÝ(#_xdt3†ßs(é®ê ]Gß:ºÕ]ÆÎî0ºŽn-fG˜¹…ñ‚£i:º9)å¶Ø/Ù·g¡¶ä>Ýè6ŽvðïÚ¶)×ͺ Ò²“fG·¦-ÇvìÐ9+¯Òn\ÝNe‡?‹8®Ë=Æ\E$­h•[y•ýѳ6xK¹ïB)S7a¢ˆžÛÓ,¢òÎe&7f (%(fI›! ¯EœÙÂv3;âÍ@³v¬Æ²ö¾µ£Ò¬É}çh3çm–I+ZåV;*ÍÚ‘ÜÖŽ¤aÖ"vTnµ£ÒìL†ÜÖŽ¤Aëd[+£Îd,¢Ú±ÊÁO»üÜþHš±cãÛhÕ×ÖŽ†fíHnkGÒP ÉG Ã-v44kGr[;’fìh¸ÅކfíHnkGÒŒ ·ØÑÐn´m‚jMèoÕz0-æÇëõ„YœXž4¼g¬qh$qô6á¸ÛBm&4߇± GºXÂÑ[å!:Å(cÇjëõb£MzÉ­ò(G¢…ëL[L‰¦™‘ðf YKõcÙŒÍzæg‰gz'Ä™}¢ÒQy-"-j)!Î,••¦ˆÊ;CdßåmšÕ„¤©Ÿ¹Æ ¯ET;bÍ0X±›öÚfíØaÌì‡afÇDËìHnÓ^ ¢ÚQÕŽÑØBd46K4m¯îEFå!ª-QíH¹­ ¢ðZDµ#¨u_ÏV™^ž@³vlº²ê°€²-7Ñ2;’ÛÚ‘4í÷\£ˆjG‹8³E’Qí¨ˆJSDå!Z[Pkiʨ¶5ˆÂkÕŽ}°ÞŸÃ iÖŽ}º¦óÑ6åM´ÌŽä¶v$ÍÚQÕŽÑØBd46K4늨¼3Dµ… › ¢Ò ¢ðZDc D.êi67‘ÍØÑÏb1Ùäev$·µ#iÆŽäF͈I ˆÆ"£ÚQ…Fn /iQm!ˆÆfª5}”Ü‘¼¤=Šx82óTtoà£1ÓtS©Q™+|xzAÜ$­) b =Ñ üeˆõÚ7ÄW÷@_ˆ××¥ 3åïkT§wð„×£·]ˆ¸F´ÑZcú°´oJ„ä+µåº+rZˆ[#f+Úô¾¥ˆ17¬+Ū1^x|Uµ~ÀÇÐÝ=Ý-r÷„‘ÜøKÜ=bDw'úwOxÉ݉¾Ô†tw¢/q÷ˆaÜ=.r÷ˆaÜ=•²ÔÝ“lÑÝS!KÝ=ÂwO…,u÷¦iŒ»§»Eîž0’»‰»GŒèîD_âî /¹;Ñw÷„zw¢/q÷ˆaÜE,éÝ#†q÷TÊRwO²EwO…,u÷cÜ=²Ôݧ óvîñf‘³Gˆäë |‰«ˆèé z‰£G´äç úx7ÉËô'ÆÇþÆÃcK< ý;–°Ô½ŠñîXÂRçÎ6éæ9y‘Ãç`Éõs2Ò7ŽŸÍg`±9dÄfÑü>CH Lôs2¶)ŽñçP©ÙääEk€ Ì4¥ìI½h𔙿•=Y¼NÈðÒ‚!£¢®–­2<Ó ³'¨3¿£¼˜]ûfÝÈÚorñîXß²°X§ø½4¿¤l¸;,š5×€ w'€­!%—€>oÁß­ˆ+@À†»SÀ¢Õ˜,‹pwX´R&nNŠF1W¥+áàh~ùÏ`dœ0Û\]UÛªoÌ©Ôažm‚˜hØHõKõÿÈ óY‘K³M¸U³M‚ »¸´É‰‡òNV{w‡dæ&zQeë@¶ž‘æ÷§ÛE¢*ì\Ôçc˜¬'30'„y%Èàˆ™WW;òHn .æYz÷5!!z¸u³HM…}©šÏ©Gu7_¦¨„hEQŒ…v£†EŠ*ìKÍ“PX¬³û›í&^«×)ç3Xþ—×ã3 NL3nŠ—¤Ü>’àÔ!óâ®°©½HÜú;3Y7î=u¸¡¼TîƒÛ~8WR”¢×J.Žæñä)J£+ˆw«IS l¦÷Û_)Ów!¯–‚}”6Âç"Þ6]&½WKˆùG;º«È0S0“)k—K$Ê!y»îí¡|æ¨!á¤xr»{1¤Y§y"Ç3¤œûXÿ¬î®$í1«‹5C)¢xH惯oÏžH¥ª»²:Ì„Ržpß#ûÛ—š&üh"U=„Œ"?ùM–&,´¸ñi© ›GE’OA`ê°ðž.ʧê¶²@‘Ä Í‰ýÝÏî=Í*"³œ+·Ý¸7gÆT|@àaãæÇ4cµÏt8s}‡=­ÕhÍ•)V‡”yiº)Ö&m¨¾±ª7ÊøÝª/깫-½çá€4±Ü>[ԙI¹r|´!"î¤!¸séyi{¶ –ªu¥³„(+¢jAnÏà⯸…ÖËØn^IåJ\$Û‡Îõ×O:øÏgü“~²¹ßîXº⯩—`áÏqhÛ°}s Ÿù¶ž9¶ìöÛ÷ …äï=–à2ÜÊà/eM¶ÑŽˆœTJj2㟙º+·»³›¾ƒ[}dI¹‰‰C;jÍ“"^ý:¹Ùû¯¯„Fï"<ê —ÚÚ°ÊêÚu‡ÓN¿Å¤/,ÔÅ›ó§æ(Ò—†æW78®Š˜»ÿŒÏ¯×n$í¶ð¬×?\ï.¯ï¿<¼»u»O@îðÁ_£þH²Ã¡L^ÿù®vßoñvìœñ¹•×ÿ¸¾}÷åÓ¯×çÛÛíîÓÝõ—ݧË"„Xl¼‡ŽÜÞ"ycô®'ÿ‹©u£làÜQ¾ù‚©SnwÓ×'Ÿ>W­‹•c훓؇º|vˆtmŽpƒô%÷î#®Û¡ì‹ë—¿p Ø “ aÀ™÷à¸ï>ò©6žÂ/}¬}ö¿Ž³o®®ª5תÑù×1ÈPoÂRP©Q¢"ÒÇwàœœÙ\cE˜ªxÙÈüãÿò[ãV endstream endobj 19 0 obj 3818 endobj 17 0 obj << /Type /Page /Parent 3 0 R /Resources 20 0 R /Contents 18 0 R /MediaBox [0 0 309.0909 400] /Annots 24 0 R >> endobj 20 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs5 21 0 R /Cs2 8 0 R /Cs1 7 0 R >> /Font << /TT4.0 12 0 R /TT3.0 11 0 R >> /XObject << /Im1 22 0 R >> >> endobj 24 0 obj [ 25 0 R 26 0 R ] endobj 22 0 obj << /Length 23 0 R /Type /XObject /Subtype /Image /Width 45 /Height 16 /Interpolate true /ColorSpace 27 0 R /SMask 28 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xÍT[L“göv1‰!˜æ’•ž)‡ È„ZZN£–€T…F’qˆ%[ÁpË"‚+T(R„ZKùKK¨ŒL0šp!/11 xF¸ðÄÖYJÕ]ïÏ›üß÷½ïû¼Ï÷>ïÃÞT•Æ Ñèÿ É`†° ÃõÜi°oÁ ³Ø,v;$”½kÿĹ`°˜ÐB`ö 4bS½{S‚ûÍÂn°FûàЋº_Ó¬h¾,oìÔ¨L·Í¦[f¨>)ƒ·Lë@ýïõç+Ê*ªêP_‡ûž¥0ß±´uµ•K+`ðë•ßÅ8<¸g`%p‚èà@¡Q ›qpØ„¾­@t‚LŽˆˆˆŒŒÄbâbäírëŸ60tóí¡Î^'‘#>-nnn–ÉdǹÇÏW–YîX–””Hx|^CCC‹¼%??ŸŸÂWëÕptB!.¢ƒôàÒÕwƒB£Oïß¿¿±±ñâÅ‹ùùy©TêçïñÒ/C#Ø;87MúØc±:ngg§¦¦fqqq}}] HeRˈRZ^š››ûôéÓ{÷îñäÉUç.m„ƒ» l4«Ûˆï"$…’wïÞÖõëéé!‘ü•Ý¨Ž“¢”_¨¨(¯€åìì¬P(¼zõ*ÖsssñœøÑgÔÅsÖÖÖ Exx8øp¹Ü—/_J$Y} ný1 déç:NG@~xxxeeåíÛ·wïÞœœ|ÿþ}^^Š…Ò8iXGmÂL¡eȂШÈ(Ê«W¯àõƒ ]Õ×õG»<''Ú¢¢"»ÝŽ m±X´Z­¸ð´Ê%\-=CPUUµ½½––÷ºº:Ô:55õìÙ³>´ÛìT:.ÐÈÊÍ&ðÇÇǽ¼¼ ÀÉ©)=7Õ×TmÐvww£(Ïž=£R©°T*•…Å…Ÿ£‘ÀMhmi]XX`2™€Â½ÂÂÂÆÆÆ€üæÍ›‰‰ 4³ÞÜ郎6\¾$‰ ÝÚÚ"‘Hj6™“yH/F€ÃåDOOO??^2OÓ¯ cóy|dcuuõñãÇSSS%%%¤Ò•–¦s¥çüIþ )0 èë À @_?_¬Ý ¾òó=òÍhqŽ(nZç0kŽ/3ç¤Þ¬Ïç}Lf‡²CÃBÑ–è7•¶ë‚LêùÅžåÝii)ILô™3gÐT®*¬Y,Vcc#Þ LÞ 7íç¶ÑßG#½È*J¬è¼†¹Ã«•.xxx|ÎE.—ã}ËÊÊÒëõ˜73œ´µµUWW ÷?pÜa‰lÄ%Ä%p9ÌæÁƒ_º¸mñ>>nÿ·íß#ñƒæ endstream endobj 23 0 obj 1328 endobj 28 0 obj << /Length 29 0 R /Type /XObject /Subtype /Image /Width 45 /Height 16 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xóûøŸXðÑï3±JêHQK‚±£JG\Ü"ÁÇ·ÚaËo endstream endobj 29 0 obj 35 endobj 30 0 obj << /Length 31 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.> stream x…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqx endstream endobj 33 0 obj 1047 endobj 21 0 obj [ /ICCBased 32 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 309.0909 400] /Count 2 /Kids [ 2 0 R 17 0 R ] >> endobj 34 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 26 0 obj << /Subtype /Link /A 35 0 R /Rect [74.24242 44.39392 159.2433 44.94949] /Type /Annot /Border [ 0 0 0 ] >> endobj 35 0 obj << /URI 36 0 R /Type /Action /S /URI >> endobj 36 0 obj (http://creativecommons.org/licenses/by-sa/3.0/) endobj 25 0 obj << /Subtype /Link /A 37 0 R /Rect [74.24242 39.39392 159.2433 44.39392] /Type /Annot /Border [ 0 0 0 ] >> endobj 37 0 obj << /URI 36 0 R /Type /Action /S /URI >> endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /USHFDS+Helvetica /FontDescriptor 38 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 32 /Widths [ 278 ] >> endobj 38 0 obj << /Type /FontDescriptor /FontName /USHFDS+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth -441 /MaxWidth 1500 /FontFile2 39 0 R >> endobj 39 0 obj << /Length 40 0 R /Length1 5056 /Filter /FlateDecode >> stream x½X{pEþõ-/U>.7WNåÄÓ“`y¯P\(qݨœDíM„"ã˜rÀµZÙ5É`{ãÊ}.ƒ¡Í½ ±Î…¦Ç”ÎÂ=JK¹¯ßc½qeâ˼iÊ´énåZ×GJY¾á`°K]õJQùËÊd4DšŠN=ÞLe¢k—2¡I.þLÔì ÛGEl_Ü3_9Óí«-œ¾Ç`·öÕ”{ ¶Ñ;­¦`OaM¾§°^ñVççC_ö¼}‹ýzûûT{±½ÀžgwÛsíãYŽ ÇOéŽT‡Ãa7Ø㕊íë¥JÐÒÛç°9dƒ= §t‚²œ‡þ䂃ã ól^Fã Ö{4ƒkPŽÙ,Íf°C} ×!¯"qM²×qÃæh>éìnÃF[¯ì©tVfÍΜQíû¡[ÈŠ ß‹ør2—¾§®1 tõ©\1]Áátç°òƒ²{B‘ªââºÅúzº:ZýÍÒüÔ¾½§Í©G›TõHG¨º˜jjnã2Ñ»´ˆOïÐ|ê‘«ÝEáVîÑ|G¨Õ¿$p¤ÕñÅ{¼=~-ì ö5U­]9b¬mɱÖV}ÏXU¼³µ|¬&«ÝEc­äá&>ÖJ>ÖJ>V“·É‹OÞßÞXuK7v§êo¯Sõ‚F½vÑò€®†ƒ>ƒ=§oÉ”!?Er”r¤2RˆÌwPßårp©ù‰üe všÿ+°¨ý¼ ƒ•³h€î¦}t˜lôôº¤X~Û+è(½Å&ÑU8{%2¨ž^b¦ùµÒïßM§h7¡t´é¤ñˆîds#l/ô&Úbþ†&Ótºƒž¢èu'5˜}ˆ.¦¥tzÑþE¦ G¤±æ“æGä Eès "¯™õæaÊ¢ª¢x·ÐIæß5ÛÈI@÷0=JûéiúŒÝÆŽšmfyÚ<ƒ­ê¤‰Ôˆ²‰egÄÃÒæÃæ?ÍA0Q@E5D»è·èÿ0ÊŽV?»‰u³]l·ànŽJ[å ƒß‚‡Bš‡RCkè.0ÐOÏÐè+ö¹à3ÄnñYóZó¿”Fu˜%ŸI„zPîDÙ‰9`66…Íe l»ŸífoEÂR! üRX/|".WˆÄ7¤[¤¸¼C~Ж6xÎg¾IÈE×ÓZڌ٢Óô}ÍDô5‘yX«b7 DÙ>¡ŸígýB`§…ƒì}ö!ûœd!]/ ÝÂ.¡W8%¼"¶‹»Å‡Ä÷ÅsÒlY÷ËÛ<ö¿ 6 n|Ŭ0Ϙ_âˆu+SE i…1Û.º†~…YB9ŒU{†ž¥¬ò!›HgéK°@,‹å°©lÊBvkeíìv夅åBH2… ÂD¡Qh:…¨ð¦sÅ"q¾¸\<Œò¼ø–x^M5ØòEèwû´ ªŸµô–~¥îv£êw¶ùT…T¿^ÝÓó‡|¥%¬ß :RKKøÁá¥4Þ±NsÛpÀÒ\žá×s4Ÿ_ÏÖ #&züá½aQÀïËu»ƒðÁµ8€1JKÚuà¤íé-ZËvÃKM!®…Wt1Ô…ï+³XŸ ùô ?v~gkþuÁSŽÄªuoh;Èåfˆ[á°êUt+l t¶uÇØ¤nâ™à u¨zŠV¥µÅ:B —â9ÞëðÕ©!Ïöf[FiI¿ss…³ï/S:‡Ë ·ssB~z{Âÿú—ÎÍÏ|Y·8Iã hµÀ©«ÍÖ ÀNç·ÈtŠ5OO¸‚ Ólž¹º€=#ztÙSÖ£Ã0Ú| p¡_<%;ÇzU‘ŠeÌÄJ!?CScçð´ig?é ylžŒsă|¡“{Egáa½‡?,=˜u›SkãëÛc­)lÍé¿À›SÃ1ëãðo¸u5Þ&Kê JialgÐ`æVƒ|®~¼£Š«n@¸„oµvƇQZG‘ÚU%j5F®æ{E©±Ú–˜Z­¶a3IK"‰ËÀ`c<ÑŒè æ&ÕH08ý”ñ~Ðé± zèêÒr•}‹¤)%x˜Šy E=êËÕ½¾ VÛw ! `çƒÈ*O"âMíÎ!ÌS¹¼ñ«½àÝ%Š.‚±ï³1 ¹õX,7Æo Û`t±Ã;ä0ˆ§pÊ m@[Ík­[sVsz ¶ôðŽÂ;û¥ž–Ä–?ÚiÃÓ/Ã3FÃðÌQ1\‘D:‚áYÀ\ÁþùÇðì W^šao7@ÎZ¯ÅpÕebxîhöŠa醫ÙÏž÷ã1\3‚áÚK3ãW:¾,Ò!Õ¤‡ð¾ÍÿeðNÒi|»‰ø¨2ñ¿Œ£ OTG†At•ÛÐÅ÷ ’P ºý=:ŽDËŠ£rJùÕ™îÌ|Ô*i§ñÍßå§¾žkH ÎãÖeFðÍò}‹V€áë+Ú†ÿ£hicMµ¯±¸&²º'ÒÝÞFN"Ê“§‰æÐÅIa®¸þ ½b± endstream endobj 40 0 obj 2706 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DNHCPQ+Times-Bold /FontDescriptor 41 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 0 444 0 500 556 278 0 0 278 833 556 500 0 0 444 389 333 556 0 0 0 500 ] >> endobj 41 0 obj << /Type /FontDescriptor /FontName /DNHCPQ+Times-Bold /Flags 32 /FontBBox [-228 -407 1778 1295] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 693 /StemV 165 /XHeight 474 /StemH 46 /MaxWidth 1803 /FontFile2 42 0 R >> endobj 42 0 obj << /Length 43 0 R /Length1 11360 /Filter /FlateDecode >> stream xÍz xSU¶èÞç$9ùiÒ¤ùmÒæ$9ÍO“¦i“&¥mÚžþ7üÉ?Mm¥¥ËŸPÀ*Œ2¨ Rp.ãUt”«2\B¨˜¢£Ì ˆŒ8ƒ#ê<Ÿ:¼¸ê³£×‹Œ£4ykŸT@ßÜûÍû¾ûÝw³»÷Ú?kï½ÖÚk¯½ö>]»úÖ~”ƒ6"ñ}+zW!ág¼À龡µ¶lYQ†Ø±xÕÍ+²eõ„$ŸÜ¼|ÝâlÙtBÚÛú{eËè ÀÈTd˸`ÑÀе·gËF`ûò•}í&¹VôÞ>1?zʶ[zWô„_I’¢U+׬ŠÈw `ûªÕýø¸!Ù[P—ùNÄPÊC mFRD!5„„˜W„0á§W}š· 7ú%ÖH…ò›N ðÕ„Ó¥W^RÕÈ»Wö->”ÕòtiºTUsµEèI^ ÕøR¨¢Û÷ÜNÉN†Ò§¨mÉ6V—¢†hSÔVy)ê>šµ€:EÝ 7Em JQ›(SÔ=rRÔÝ)ê.òµ€,Eý€4EmÀ¤¨;HRÔÄ)êD)j=:E­@¥¨Ûàl A‰×·±ŒáßŰ͋m•xgï,Â;Tp¥†TM-Ù=FõA9C-‚ô3!=#`üŽê‡š—©^H is‡€¿’Z õ7@þêf…°Yêæ$–ò ªŸFƒH‰ é~!exÝ òô òè rß rã ²fPT6Èñ¨p i¿ºxE¥òéJåP¥’«$(ÿ‚â€2YH „ÔÈëâÊóqå/ãÊÇâÊž¸r^\YW6ð0òî=Bz·®Ò!%¤^!Õðòå£åO=Ê…å$òœ‹F ¿œW(?QºG”ÖåˆEyÿåbU2ÉFño0´Z-·°)ü×d— À¥,ø"ÙU¥Ï’]NNv¹Ø†||uI1bñÔ…çüÚ+"å÷ñ2ŠÀ÷ð2¡ü.òb'”ÿô¾ÝßÉ‚·³àlÒÛ •g’^€×“^€×²àÕ¤× ¥ɘ À/“1€cÉX)€—“±€’±…RÉØyÏgÁá¤9”’Iÿ]ì‹8üÔ~˜~c²+j˜ì*pg²+àŽd×$¶ÁoC{×Nð°Ê{ Ó @ÂÛ*´]h_‰¶ <Ý‚— åIûR¼LÅÄ ýnžIÿ¾¤w2LsSÒ[ žŒ•èHÆf± J<Å„Áæ ˜@ál:ÍHú÷Ú Iÿy ÚýS“þ×Ùž‚˜ˆ7†œv{Òù(`—O¬J`b5üø€rBI1â…Uq#¯0©($”sÙup$½Á(ö¤· €-é-P˜]SVò†dŒð¢%Ò}«‘_è¯àu0ÿ×],û×®"ö«½çÙ¿@¼4J” Éþ«7…¼‘ýÜ{žý³7ÈŽyËÙO½rö‚ŸcßÙþ¡½ 6=û¦WÃþ>–Ǿî<Ï}ûu×£ì1ïBöePƒ|J„ù\ö€·‚ýy,‡Ý[Î>#uZöè³'öûcè÷€w9;ìÌÖß͛ٻ@InƒqVû ØUþÞs„]é³+M²Ëœ@Üv©ó!vÀ™’¹}ÛSæì@Kg¬„#e9ËH¼,My‰Z& Ûj`Àa[¬ÖJ`Ãn抰o €)»épÛ€áްM1[ 3íO²QBl’­Š Ó‡üОdËö¡…Ù¿‡ecrvî!f>SÍ„™ ¦”q1v¦)`tÒ<©Zª’æHåR©T"I))’êR™s|;¦“¨ ˆH*¢H ¤ˆÂR Mn0QÃHJÝñ^ˆ› Þ q#Ä âí‡ gÎ&½G©aêŽaèQêjýDåzêމܽÔí¹Û©!!—Hæxh2JáÌæ~Àdª7ÕçÕiªZ›ÿFÒ#Tö4û®ýLÿ^‡¿…{]7\˜øÉ”Ù‰g ㉠Éd ãSųm]£T„ªhi¥ÂÄ;Fñj*Ò2‹ÔãÕÍq@›* ¡½TÐP€F;Ð^‚†öÒm+A;´}oK󡽊x7Ú. lïPögGòÂ0O IäÈ+ y%r‚J!àáeˆ‡ÁxH+?/#XxY~®0˜A˜Ïé”$ñŽC>' rú„f÷µf¿]h^–m^–_kd»Û³ívh¿&ºÿ¹þÆÿW"o;·õÉ–~®¥‡k釨“Ø64`Jl\h³ÚzŽ4Ø´«gaß½ý‰s\sb+×l;´Mè÷½æ'Ió6®ùz²eNÇ¡'ùþæä6~[ ×Û?<ý‰©~g®­WçšúÄߘë 2ØT2×t¡ß÷æz4O's=HæzÌ5Ÿ.ÌÕ²dvãšë~·®]›-ým­½.@Yˆ&ú 2ƒËùÄILwfÆÅ+=ýZæ]ºv¶?¡[ZŠ6¡rtüìÓHŒžBIÔˆ[ þ8Òb;´Ü„à(jOV £ö¡Ïñ|´@Ÿ¡m”­€3°ùQÆ,@sÑIdGK2iCChmGOCÛL´=s&sf+‡ÙV¢{Ñl…ü4ŠÞÇË3'á\hD· ýè\—yðL0S“ÈTÔ f4Mƒ‘;Á_^#>~†ÞÀë2÷fN‡ ÌW†Â@×>t8ø‡ð:º‘Þ-~ÞÂ*ܘ™9œ9óxPŒG÷C؉v£'Ñóh ¥qÏÄ2Ë2«3Ï#'Ì5€îB÷¡]èѯÑ_±û© µ’:´ 2ö< æ ç8zËqž‡oÁëðþ §dVe#ìDA˜q?úú:…Þ@¦àF¼Ÿ¤ÐZú!úQñøŸ3\æ# ¯ ÍBk@B[ÑAÀÿz}ˆþ‚¾LØŒY\†+pOÁöáƒMm¦öQ¨1ZJÿ#}B”“þ0óAæ2HÅ…| ã0ŒØ w‹©À3‘àj»@V¿@¿„µ:{ î4ï¡ èÏX„µØ3Y`;.Ÿ Â૯ÆO@ø#þ˜¦(Š¡côƒ"$Ú,®¯Ë82™J¿h¼¤Fµ¨NX¹.æZ3ß÷- ×íè1XÅt(ø ý+ú]Bß +˜ÆbÌj‡=°*e8¡ó8”LÁSaæâù@Q'^€áøAü#ü<„—ð¯ðIü'ü1þ#P)¦°j1j&5›º“Ú!I½I»é/DV‘OċޛŕâNñÃâýóÜø§é鑌(35³=óhæÍÌ'H÷´š»`!ð°xX wÒè!» <²ü'Ðä# GÇ`OBx Âiô?Aª„Õ;჎_rq65 +Z…ëp3p7B^ º± ߆ï„þ~ $ÿ$~4kx¼>üŸƒp\_Âßß:*aªÀóÔ©6S? 9@€ðZOé¹ôô:z7ý4ý ýý ¬ãbѰèQÑK¢7ÄHÌŠÛÅ}âuâ-⟊ŠO‹ß,)’`v01ễµ©‚pýO ¶½ˆ¨!j,‚î±KÑA¼}MI«Û°ÖzH/»¾o€Û[õc\kô3ñzèÄÃ`+*aǾ{+†„ójÅÇ©yè#T–L›C¦Ì'âµâµˆOA…MÐS;açÆ~’n[mé_dÞ¦­@âÝ`¼B@¼Ûå,âvk-,°˜óMFƒ^§ÍÓ¨sUÊ…\&e$b žsI ×ÚcK¸z"×Þî'e®*z¯«èIØ ªõ»8 é× MßÁäsñ÷0ù,&«mQõ—ØZ8[âõfΖÂ3; ÿ@3·%Æ„ü4!¿SÈ+!o·C[‹i Ù–À=¶–DëÐÀpKO³¿òÀ¾Ü_Gyh£-½‹3fv´4[ìö¸¿$›ú¸… Ä5&r}ÝI?8Éœ³:`nÉ’жå,âmKñhaÉõvu$èÞx‚ê!sh| #ל0®¿`ºVü6×rÿu ÊÙÚÛ?Üšà{¶ÐI±‡”zï‡ÒâÇ$¨ÍñŽÞ Ä"Ú³\dÏzgÏR[BÆ5rÃK{@æhVGÒÌ›…C5ft$óù|¡à/5m¨±ƒPFý þkì¦ Yø/÷dëŒ@Ó†ãçN™uU.˜ÌÍŀ̄­O˜„Z'‘¤î›âƒ_—K²¦žau5¬GBìTs¶á/,7öéwkz'j$Nõ—ˆ4’弪 Ü;‘‡w›’))$›Ñqãíqâa§Psá(¼Ñ nò§‡¨Ã’fè …â¨ðÚ!ç-±µÕ­dÝlÃ¶áØ¢a[«m\ä 4ôÇÀÎìŽ%Îé°'ø¸åj¶?¯†q|dèèÃqaéÄ…ªÀ8 •”L!ÞÎŒŽ™‰Í–ß‘€Š›Ñ‘8Úð8A)À;—˜&h.šý^hdG/~# &cÎîàì‰cÃÖa²'²åF߯à'*Rˆ UIá3 /În!œ³Yñf˜ª ÔëÛå…×±ÿXÂÁ«tCÏP$\ñŸ$áðß#áÈß%áÊ«”~G“€æJ"áªÿ: WGÂ5ÿ±„£Wé"kÚ¨ áºÿ$ ×ÿ=æÿ. 7\¥ô;nšˆ„›þë$Ü|„Ḡ9É< TˆÖ Ž~y!–B9e;U•’g‘”¡ÞíNºUP×êì0Ä·ïÑ9ð¸ü”màIÂÓÂÿçž& wòèÍÀ;:ùÉÀcSÀwòS"Ê…—õìO#€ ¸S|×â+ÔZz¹H.Z.—,”ü–i…÷•Õ²Ù‹€Güv$QÁ]Šx³ |X‚[ bXÉÅ"–¦)³L°åKáE¨ô°ýæ&Ÿoú¥è´ñètõåè4õxÕGÇ£$–—…4v¢SüñÉož|½û$ýîŒ^‘ùþˆ>4ó¨½Ê¯Õ/©ß£¦î™z±Ó» ꊕnÎ]är××OÁ[ƒ?-ÛŸ-{¶îÙúQüœçhÙѺ£õÇ=¯•ýÞcj`áqU­ˆÍS‰ì¹*¬š¬Räå9Œ"V®U448¼êr\^Þä­ÊuÐ^µoôîôRÞÕË«š¤<_àXÉÿŽÿ#Oó)jᡦÆÀéËÝgßW«/uŽŸ?£É« šH ¼Õž6ÕAa(Ðm2¿øë®//ï®»¨2R©‘0½Î*ÁÎp…‹s‹­X¯“pW¸" ‚ÿ¥Œ`¤ÒÈœÃír ÐÆøß|&û¬º%µ®ôrcš¶°²M*ÍQi¦…jfðÄ?ߺ֨ÊÑêØh¬4t£×¤˜»¬¡~Îðè­Ö<öé|±Á¦–³OÌzøÆùÅlŽZ¦Ò«ë[‡†›š¤ÕV¦óµä…­5s9òAZkÎe>yaÍ•ˆC›øö¹Ò¹º­ú#ÆWt¯è_5^Ð}©“ÙuE&_ábébÝbýmº]:©šÃ,gåj¸‚B%›[ £Y-‡ds´ í´æ+$üðôST/sª”^+Ïb6EõrN_êÍP_îQ‚ëñUaa•w——ánÔ]d$²™^>©‘åéuÄçf8M…ËƇóŠæ,™?mUã eÅSæx3ýo¯ÎÚPùxaiýŽ¢Ö^{ü£^ýøEÑããc“/ýʼntzŒ¯X+zŸ÷Ë‚DϽ™ÿE/ýsÂ}q?×¥÷ÙŠ‹èyšN[§}7¯h©m©ýEýQÛ Ý)Û×\Ž®`žýFn±}ŸNœcÇ.Æl1H•êƒb,ÔjÐ4CŒU¸\”C,–S ¼Ùþ™[@G‚¥r  À4VŸ"ÈŒCAƒ‚ÞÉuœiœ¥¶£-ýæP²¬HÅŒ_fìÑ]í¼»:°àΙKv¥¿‚‹UÅô5¢¨_añÒ›ÚÃ?è|Æoá ©uÿ‹—?·sßcx ð+Bô|úMà7YÐxù+¿/×¢*È)Tø$•hk±Z|†Jõ´ÍÊVÏ<ÏüÉýž!Ͻ¾{Kî¯Ü:éÇž}¾ŸU<[ù중ŠÑʯ˜/*òB¶2Sn¬µŠZMõut‹ËMW?fÄõF0â\#6޵:Zhgu™¬z†_æô3¹Î¹s™¹s#n–òJlÚ ¸©­S#ó%Çzàú?¿á@çðZîšÓsl¯7kþ¼Àñ·»Ç.e7MW›Îv›¦e‘éýnMž±J3!Üq3zìÎLçǺáGvi‡˜WuG ÖüzÖd¡ë7%ì<;±b®HeØå&6«2\ŠÓe0Úõ1fÄn¹¸¬­3ZqHX6¡:`Ü©³ÎV];yfä¶-WOÞvÃ@:aSåÄ:£–²]íϽÜ~»«öy|Ï÷ì`µZ«Ýá°æ.´lœöÐ{k;~ŽÏPLUç–»‡7l¹ëJ{žãÆpØœgwZ»U*£É×>o½Iå}dåýG rW¸jµ¹(±¥ÀÍ:Dðoàôb±Ò°:'91[°5Ùí{üøUkEܘk;CÿïX+&+q æÊ׈7•ïêÚôà5s7{E‰Å‚=]òœÜ{ßþ´¦ÅÃ\3XÓÜYÉÄhäßîä(ü™!¾­;i'S,=küDtArAþWÑeÉe9î¬ajzH7dÌ—/U-QÓ¨C4_BëÁµÉuJfÆl+æåá<¾‹÷)ˆçã|¾/œÂ²çì¥W/9l>Ì †Ÿm×:唈uj‘³TQÍTW›Õ9 í äNÃç[͇ ¬övK]Û§ fîF¾¾>Úå'Y«°Õ^å@ŽÁ¥¿{¯:¡>¦>£©£5Óà•u_:o®S™MjRº4ÅKc&31Hƒ×t©6jÝA0{íцÀ"÷·+€³n‚ä–Òp‚û«×á*IücAÄœuŠ9\Qe}rÞ “=†òÝ·W„÷=Üð£¼|=ã¯(ÜÔÑÜd-œ¹j lÆSOÏ®å´2F“·á8Ž<´®­ºÒ­7M®ii¹é¶>½6ý‡ SKŠŠœîH00ãÖÕ'4ú†²Øè‹Dÿì™ Ô£b|ãXijЬoÓk<¶+Ð*©LÂØ5±|…×ÙõmŠì’ž±K•ÞBMVbÜÙÀó«æÓ`9̵¯›Ìç‡ÞƒâqT? þ4©=-k(@¢ ƒ‰†Ò„ôœ8¿þ¾ÖØ-žp {jů­Ô•z"–ò¢`ÇÛ#ôܪ|GyÅâ[Óû:Çwû ýUAÓœp·¥b+µ{ŸûîЫ"ØQ£|«#OUNUQQeTEÉi~>“Ÿ_S8¹0Î,aö0Ï0G™#†W o.rÕ*uåàäœUu”³qÖ¢§«QsZ«.…U¼ËÈËLF›I-—‰‹TH€ b¬ À¨p2N§š59ä2o.üSaïˆ{áÿ½À„µ&. àžÿÖ Nƒã ¼A¢'ïýƬþrì þ<£Ú³&â‘M&&+Є3HfÂ/ B­ÿ,×<­<`)MûËZ_ê[+›scß~o”ÓÇcu…!Vã¡ZøgùrI OãØRo.Ýð8%&N |P|Àt'ýÈ,ïH/òk˜€±d@¹NµÏ°ÏxÄpÄxÁpÁø¥áKcŽX¬ Ünƒ­ÐÊ*ÙB« Ù°­-¯¤Äo-,ôæ©TJ‰R¥*´•@»_ª£Œ®bZguë%”lN™ª‚!ÍWKè²¹ÜR`óR¨¬–Éy\}\Y5 G#igÛ•3z¢¯FôØ:á—¹mËæ¾—æA™¾g·¢vø¿€)ðÕñ4þÃ`Ü]ç¡ù¨u }0|·ÅBN‚àå¯yz{ÓŒ™¾9KVô¯ñ7®\¾ý}dâ endstream endobj 43 0 obj 7880 endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /SKLDXW+Times-Roman /FontDescriptor 44 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 250 0 0 0 0 0 0 180 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 0 0 278 278 0 0 0 0 921 722 0 667 722 611 556 722 0 333 0 0 611 0 722 722 556 0 667 556 611 722 0 944 0 722 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 ] >> endobj 44 0 obj << /Type /FontDescriptor /FontName /SKLDXW+Times-Roman /Flags 32 /FontBBox [-203 -428 1700 1272] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 676 /StemV 102 /XHeight 461 /StemH 44 /MaxWidth 1721 /FontFile2 45 0 R >> endobj 45 0 obj << /Length 46 0 R /Length1 23628 /Filter /FlateDecode >> stream x½¼ |Õù0|Î,wæîû¾ÎÝoîšÜ$77ëd%ÂŽ$HXdQdƒ¨(XD­TënZWÔVƒ+UpE«­Z‹KmEkÕüÛ‹´ ™¼Ï™ûöû¾ÿïû½¿77sΙ3Û™ç<ûóœY½ê²…HƒÖ#‰ó—Í[ä?Ó+á;æ÷¯”öyBŒï‹–•ö5õ±›]¼öÂÒ¾å8BÛ/œ· ´NC]½:Jû¸êðâe«//íÃý™‹—Ï=n™ ý×-›wùèóч°¸dÞ²…¥ógÅ¡¯X~éêÒþù×AýÀŠU GÏÇ=)^„¾‘löšÑJ¤@w %¢~uq_À¹ Âð“ÿ”»cï}ý7ØÈËû¿h8_®_¹åã*iîéÛ´÷¨RС©H‚.íi®4W{ÏÙ#òuP4¢òä Š%E½ò×Ó°~nz+·MÃb³Ÿ‚ÓsrKƒ\"|JTcÀ[9¼UÿÖ<‘"cü+ECyˆ"£À#hZÏS<Ì×.hí‚…¶Qd#­k(©yt ´oözŠ…šGZ=Ë¡g9ô,‡ͽIð„9°G£‰°Gž:QÞËÁ^ìåä½,<- {YyÏOñ{0/>…?ÃÝxÊ~½ÿ…•:ÿ3¸ w£ —ïÙ8Ñÿ~ß"—׊º€öã€öX@{K@{M@û¾M‚ÃË%u“´ïOÒ¶NÒ6MÒÖNÒ>ëPÓ¢%®}6®ŒkŽk¯ŠkûãÚt®ÞÆÁá‡åò§b`œöŸã´¯ŒÓÞ5N{ý8íã´ŽÓ ã´x´aÖíÑâ«èoÕoÕ#%4÷mÕÞºú¾Ù[žõ7âìÏû“©jÿ ¾aÏ´T?Ú3í1³o@ íG €_…Úäz-ÎÉõå8'_³'›€Ë.ÝÓx?T+÷4p\„2òÁ¥{òÇ¡·fÏ´Ùþf%ÎÞ³µñäžé=·Áá²=©7üÍFCî0ÊˇC(/ß%8Z+öL‹Âéì>èHbã=~ió …øOe§øOfèù&3ÈCõÇÄ õØÿGY¨D»ÿƒìlÿïÇùÃ^œvÜÿ|öbÿS)ù‚GÛž!OAà¾GTûÌÞæ {ƒÿçòáíyù~wL“«ÛÐyÀÜæÒÌ >oUžíŸœ]åŸXzÒØ6ùŽÙ§ä×ú‡¨möú›³^Cãþº6x“=þ"¹|¿²ôðŠŒüzåãýIx=怿lZ¹?ÄbÚ?}7‡›Î¸*.ÇE¹ç㼜…7ñ^ÇkxÏó žáoyËàÈ'bx²( ¤R0¤d䶨 ‘Q˜§µñÈõøf[“£ÉÔh,v´ý‡b®Ü9·-ùŸþ¼wtMíØéí¨ oo×@ÕÔÀ¬žƒøÏø³ö¶ƒøsRõ¾€ÿÜ>EîÚz{]ã'õ âÏÛ— Â%óDrðsèçÁ ]çÉ÷A èj;ˆ¦‘ îCU£¹ lµ|Ú ¥Ó²p8­Tä´ã(+Ÿ–¥ŽË§½ANÛ½9ÑÞ¶;œÂfÐfù”Íl†œ/<—¶íÎBg©pNwN5 ßÈ+ß(Ÿ‡S¡èíÙ]‘‡vç+äÃÙï§J‡§”O‘ŸÿýáLéðöÒáípø?øÿOß–ÿÙU{Ï¿wÃ}í CísCí a›;pcÿbÇÀú Ýî%ttîó“zÞÂ{C Û6„ڻϗ¯û·Ã÷‘Ãç‡Úv£ûÚ§õì¾O\ضç|ñüöLèÞ7¯lÿÁ³n8û¬•7ÿ‡gÝLn¶’FUÈ|üSÜûûÐ[èh<š‰m=†Ç -h*¢e¸…ñoP5jG÷£çàŠµh9œÛ~‚¸ê©‘ ¯=†ÑIÃ^Ô€zà.7¡»G£íè ôÍÈŽ‘/Q]g¼;ò'”Eëá(…\(÷\ŠVà4µzdj„çÝ…žBcÛH#²¢JTÚÐ"´-C— ëàØ³è]ô; úJ£<§Í@7¢ÛÐh½„ýøJü3F9²xd):F°®»Þæ-ôgôߨˆŸÇ/xFöŒÀ³C¨µÈÇïC?C;ÐÏÉ› —áw á©x¢+G´##§à|=@MD]h\± ]or:‚^‡ßà©q\§ãx=Þ‚_¦Zh3ñF®…QòïøM„ñ_ #ÝŠn>‚ž€ß‹è·y%QÍÔzêm¤Ef2Û?rÍÈ®‘çF~ 3Â"À¿ ~ãÑjt9ÚŒn€÷¹@/ ÷a®þ††1‡ Øc؇?Â_Qˆ2R ¸Ûkôrz ½‹AÌ}ÌGl#»IzH:>²häö‘×GþoO¾™/À¯žÑ„&£©¨-X_$ãÇÝhÚìÞEÇÐGhIØïYÀ-x&¾ÿÆGñ?)Š2P~xf‚ÚDmƒß!ê(õ.í¢½tœ.§gÓwÐÛèG˜ÛØìJö§ìnÅWÜfi¾´@ê—®’žé¹säñ‘C0FCæ´…·Œ¦Á ^ˆ®a½…àŒg/Ú¿0ª§Ñ3è(ŒíèàÜi€ƒR†ƒ ‘ÃE\aœ­¸ µg"žó3÷àyx)^‡¯Æ×áûà÷3¼Þcüâ§ñëø-ü;øÇ_ÃïŸKq”ƒ QQJ¤ºà7~ó¨ùÔbj µŒº~Q»¨}Ô èFºƒž¿úý.ý;úô·Œ‹YÍ\ÉüŠ9ÊcŽ3gN²6ÇNgÏS8EE¿âÅ^î"î îÚ0þ%¼Ó¹óÑZêê;t55è 4~ê5ªfbÞ‹H=ˆîú¨]üCÀL•ÃO¿k†eðCb, ‡‚BÀïózÜ.§Ãn³ZÌ&£A¯ÓjÔ*%Ï)X†5)ÕꘈÎ`¢¡ÎÎ4Ù̓ŽyçtÌ@WÇÏëæÁ¡œ)™þÛ™béLñì™Ø¨GõéT =x£-Ä3'÷@ûæ¶Po``HnwËí­r[ mA€ íŽÅm<7Ð>ÐÑ¿xKûܶt zªt  ¡&7@­óÖ8@­äŒöW¨­}À‚6£#íó LšÜÓÞæ„Þtj·Î]0€B-úäèåä:`Û‘)=ðìtj Höt£fAhÁƒ"º`.iÍ›Õ3@Ïë æ’g“öPÛ€ýŠÏßïžiµßtÎÁ*Ò1oá–Žqît²;—ìÍ» öºˆ” ®ïíÀ×ÃàÈ ä±—Þ¢$Ø"s—”¡–Ðâ-KçÌÑ”ž=.Ñ%K4©gStÊ;éÔAÇÕuå`º9ÝLê:Áqu©þóJý¿9DjÇÕ‡?ºkÊY¸`òìÐXæ@`¾üŒµ† kЖù5>øëÅð–K”­s·ja>؈!Øò ˜EsCC_ÿ°gÞh"bø‘ƒd:ÏbÄi ;ÀFKu "夞Ýÿ¸—è{ƒ¨Í{¤ =gvzÅ :,iƒ«a'‘‚Ž2Ze©@ŒºƒÌ[`K`ËØ[Å0áLD®áÀÂ-½Yx©=K œÖ# ˆ½î³Í…½½µpŸ$¹\§oé…;,½ÔrWvNJ¥ºˆhŸÔ3¹g`}›{@l늚Ô3p°«·΂w)Ôë–8FÇœ1§Ëàx¶tÐA×Ã-z·l!÷œÚmÙâÞBh¢´?ˆÑ¿wˆ£ƒˆœBPe¯Ÿ×Bܤ#$„Vo<*èufzÁþ‡pÅÙqÕym… áÊÿC®úŸ@¸úáÂÙ‘þÂ50æpñÿ„kÏ0û2(àMx%ZDíD³a«†ýßA= ê©"bÀÎ1Áö)l °õÂf‡­¶Øâp΃°íäf£A¸Ÿ=åÉ}™Oá¼K‘Úåp?yÚd¿ú8Ÿçy ÏÃÝŒ”P§é›QÜ—ƒ: u9Ôq¸>íjØLð,xæÈh3ÐŽ(Špo$o•P+a#ÏSÒ^´Ž;aŸŒ?÷.ƒ:›îYI½!£‰¼>±ÛàOƒx3ÔôühÜ \,8p8Д ÏÔp…ô =x‡ÈŸ™äšfdÒŠl :Ú.Òܰy@%š¯ž$  ´B°…a;÷/úY 4HÌ$J\Í€všYZúj%èÇÕ£R-ø¦êA“k<÷òÿcm¡ÿ»âèãªá W€%­ÀãA7ú)~´ûéýãc޲Өì׊qœ‡û“Ò¦|N5^õz¼z¦FsX{¡.¬7è¯5ðÆ6ã'¦WÌãÌï[î·6Z÷Øî°×Úp¤_:«]A×Qw›û„ço™÷¤¯Ç÷wÿµ …q—ÁÁ¡I0ïLù`¯Ð0ë­û(<–U€ÛBô †K#ËŒ¥iÊ¥Tpc1ròʯ„Ž)Ždr‰úîáú †“õ݆ázÔT?\o8Ey.oŒ1ضðÔwl×wûéNGà1ZD»Ð0»0ªVôpGu;%*Vp+ŽR³~ª“÷«úŸ,v$'Nt?qÜh*6d]_íp>ïF벎¡òœ T)BWUVç?ñb¦<\I³î,»8ŸâtA©ßéÌ9ýÕò3gK·QËá™FÔ.z4Z†Öò3Ãh´´Qk6Ûí.æ—|§Ñi2bõ^áG¥—ë>1¡}aÛ稩ÉT,bTèUëðxsuÁ®àFƒÝdç¢1Ê8û­õ¿4ïh_›™ü‰ëÊ[†èÙ˜Ûq°~ío¥ÒéG¥÷oêÇ^pyÉ㩆ñŒñXÐ81 ¤°ÞÀ)àŸVë9½Â`T˜m0&K§ú—z§Õ&©û<àÝ'†8&{ä!¡>Dq0$.V]¨6bT¬`³›ŒÔ˜ ]¯›Qg¾gÌÕµ“ßqÝ¿ùm<_:Ùõ²N¯pÙïãùØãÛ„ž=ÒIÃüüNúŸÍÞ c‹¾Â`šâiŠVh)š7ÜÁ©­0²m ¬HškëaáòÑ‘ _5´Ê1:¸î¡b>“GWžÃ} Œ«¦*â‚Q2c6+>yë4óܱ&UkYGmKÓ‚I¿ŒÆ«¯.Óñ\¡2>~~Œeþ15†Ò^Dj ±‹^Çâ]0Kòs>GÙnÀ³`&áJJJ·^†ñ‡#_àçÁ>T£¨hfËÔj-Œœ/£œí‹Âå?.ó 4ɘ3³(BØ×ҚͶ4ç¤jÉf[å{2#S€a0žFÑhz¢‰¢0Eƒ£Ñ”zttOá2$àGvÿ áœti4ÕcÀžMÝ™ä:ÀH‡ðë ¤º ÙÅßõý)d¢w³s.|èV1ø8þJó™…>‚ÞCŸ!ºU±E-=žWl÷±ºí6-µÙ4Hñ{ªÍ®AŠÛðgž2œBMCMð.­kÅäÕDK”x¢†ÕÚUUÀ¬©*Ìy¡Åê¡¥vêª6C¡t+ª0m„‚ø>ä‚4ào^Ù‡úÂ&ceŒ i…Õb·åMĘá(!‹ …ê<µî¡qçÎ&!(|zÍÂÆË¤OŽ\³ùü+G"`–ÿã'X'}ùÓ¿ºYbëþûÅá—¤ý{ŸÇ˜zj˜ð„O~v6ȑ墳߲ÑBE-ÕJ3|ÿIþöî“åðG_²Ç|üÓ¢Q«¡)†·²<§qÀ¼Rô Îí×h´N»ã|9ÀÿA܇Fy0§Q¼¬o”ìþfè4þ&™,Ï!x1›Õh±Ù­B §ð3¨àª"yê­"•Ë<ð£¯Ú–¯¨®ªŒÉÓ>Ê Î…ÄF %®õÞþ¦›6ú>Ò: ÔöÁŸô]2-Så»åî‡ÛcSæÖ.“Þ•¾¾r¾ùåªg—_4ùL¹jï¸r٪ɩYÜ]¹dÞäL1QX²ã9éã±e®š¢_ܧ@˺^ô_NcV«`”­E_jÒji¬EšQ! \øi¼d´ß¹_E³*jûD%z@™c>a(fW?PˆŠí Zñ4¥M Ñëdôé;ÑW?|¤éoê%‘P*nÊ$àJÚz%ÌycÞ2†ŒB5]²â¯Zæ¼ýö¶áCÌÖáqôu§¯º^z O¿^žãæ‘/ékØk@w{SŒmtã*Þb…8AÂÎZ‚«Z£ÔÛ]½þR“ÛírC‹aÁLÄ¢/¢|Àí¦\N×¢U0êdDË^<°Ý:`¥¬û3à¢çvgң×çµÞuØ5\CEàkÃ,d6é2IV~ƒ"ycx­Qži˜gÐCÔ¦ù€à|‚WYå=,p»0 AY…=n&Ds²Y_Ù† x9 @Ž(àFÁ,S§Ã!`…݇1BÀ‰<ûÍÁŠK—¾¾û:›š§hê~"ò&0a«´núã×Më'ùï ê$ÓOnxý§˜^ÕD+y5‹?¶ùt•ì.³lʘÝó?’Þ7û'ùÒ%ÜèØ>Ç^8A[ÅÐùz€®ReÜ–‰ËÝØÝá¦D• dƒÛ)md3²c;…}1ƒ3K¤B, 41¼î°ÈBž«á —ÃTìÏ:ú†Œ2÷(Êü"[]ˆqF]ÖHh ah9lî*`‚U ·Cœ£$6lØ@ôP ‘jÁ®ÃÂ;¢„œ8&B\ôs_=3 ý;¾Ã5ìºýcÆ®w4¦'MÞöþ“eÜ›÷ÝxÇš‹±A:†Çaž7üŽ`Ÿ8¦óãeQSàã5‹ŸU}õ/¤W^' ð“8ÈH¢§jÐ*Ñs¥jÿ Ž^­æ·p×)^Ék’W‚S ¤AZ´á 6Z‰uNg@ØÓ ‚Y:¤ÂÐi f‚â4Ù;µz ȘDø+°V}¸[Af 2ÐwJ®Ã·KãçMo5ûl—ðÝ‹ÌËâ…†í]-0V =8òW|ýèvT%z¨2ž3–ÙÕN¢Ù•éÔe,«s:œ/ §—ŸSC†ïÕ"Ä‘0oTY¢Î4ˆrr]{*×(fRí÷7‹ÙlGKÖ6µ¥2ÍMÙÓ-Ùtks&Õ!a'èr¯ÂÌ`…Ís/Õæl%mÎ_æä8µ§Ìæ× çêuá°p1hà âw¯×uˆj2üP»CÿQ»ûÁ€_ÝzÞ¹šÞÍD£jÉMØûÆGím«•l¿Á‘O·ƒ®¥ïûsâeÅP›ò§¹å;*vä_¾šU:t¶BÄ)UU…Ž1m[T ÷¨Ô¾2Šçƒ©]1<1†›b8V¤‚.½€…1B¬®U¬ šQk0Ð¥îLÕ°eIÚWîó•«ËSê1áT¸¦©&H註©Rß=>{ø½!ÃÇ+AÖ‹Ùþ7Ù£ÐjÈ:ˆ4Çq45üÅ=E «>Çᡯ×eûú "§ÔE0˜1å7HY©’Â$ˆ\ ŠEcÀQÈ<# {!O”xYÅ"—„CÙʰ br›j­Yó“ÚÊ…—~ò§´Ô?û’ôó‹òAlß8~彘»o̽ð@!è*Ó9*æ½)Ýý;éï}ñ ¶ÍYùÄUÑ;¤“÷á}ãñ†ÞÊzéè Ãÿõܯ°?úðÎíß¾" ´¤*.¼gãØ=¶jáÎ%3oXœeX}è«ï¾"ýAúǃ÷yÊfçNü¢‰}Ï>È·Ù׋;i=mpÒNƤ7Ü~w I'™„¢H™¢¢Þ_˜®šn¿‰¾‰ÙÌoTþHû#Ýô?2Üä¿)p}s›ö6ÝmúÛ ÷øï „Û´m:ŠƒÐ4²Ûl˜r8`s:1ã¦VÜz­[W ð}Àæ¤4t9æ•^¡H™àD¥J•0Á• 'mW»Àê°Ó¦R0ކD”Ý1ˆ§‹¥((y: ×Ñ|¨Y S‡€Ôí„ס)% fO¸œÃÃÂ!êGÔ»ˆ¡ Ò&_V¾ìÄ$<#} vÈb(Ifþe¤ÈB0+Kœ¬˜´Hc“]w¸~“¡ž3ÔC¥{4l¬ÆtÐX><ªVF³XИicÅô­C_Jó'Nœ‹‹c)ßÐ9üÏ™•Óôá/&ùË\8Fé¨Êá£Ã(/ü=tjÍê‚*áíiýø²#¯öº*-E& f+?ò1ÄBæƒG&Œ]¿÷|nÿÔA÷:–8¨8o³³nÅÕ"ï8n7‹AØ¡vDmœ JM&¢M·2ösó¶ÙŸ·ÿÚNƒÔQìê§ù)vw4"›"RßqPÀˆ9R¢Fæ¤ÈÕð…Ëq àjr¸€™ÖJÔUOPkôF„¨Ñ£/ m ƒÏT@º€¦–ˆlŒ‰S¢¤êBÞ’… H ™08E(0JYAzá—:o¥*iÎ&Z®~÷wÒ_±ÿÃm»gEÛ>þªtà…½Ï¾Œ›8v~K (UÞ0í~éqé=0~ŽOΈž×|Éo_Äaœ|ý]€èëì:7:€ÓÝbÅËnü?Ⱥö»¿åÙjÞ$èÝáxØ,¸íñÉL©2 ÅRT& óŠiÏ{°³?ªÕ%Ì`­Ñ%Ð/‰DÄq½`c À!¶€!î ÒJŸ×ï x/£`"®¥ƒŠV:¡`½TqnÕY$AM!@ {‘mþ(H'«‘-Y2±*à1ŒÑ"{B`•wÿíÞÿ:üˆôU{¹tÕŠ¶–UTÛ…g­»zÒy?ûløå‹snÇݶ;ü©¿®ÕWÓ·¬ù謥wK_Ï©÷׎ê«ÌËâ³{M¼ha¬?v}ŒÖ½¢vëUXu•Î{—Ë­wbgÚK ȇÁÍÇC–»ìnäÀŽ´ÅkÑÑNXéˆÄTt8dÌ:^ÝÌÄõÞbNy}¾x‚DL$h§cµ²KµE'E©è ¥ÚŸ4ù M€™,<#À<ÙwâĉzÙšHEú@F¦ j Ð!CMh¾éÃC_'“¥zt—(½…³P3‡2 âH…/o”wÁHm¦§l_ÙÚ²Š¹J×â}Ò—i+®ûQ§-—³w^+é>ôÖK‹}§ž fEd.kå£Ò±Í“¼q©0a]Ó-± ¶ówIáýŸ™;aô¨8ó?‚q"Xöï`ô îPewŸ"áçE÷çŽó¡+ܾ‡ƒNÁí‡ÎeTœX^bTÙHÈI›‹bšL. Ì*¦äæ…œŽD8—K†·…~¢²¡‰¡çCthböVè§% ߪ(—ùÖɾ>‚DÀç `+îE°04¸ÀI¸Wƒkˆ°±QªõÄ3Zc"’Žã„yeó*#Ì+õCæE”€g]ÕßÒJľÑœec!zÙçÆTD›6d›Z×¾pDz—}Yn]I©Æ;ˤm¿ÞyóÓý/ã±0³`@š|ûØõ`‚>*}&½ Ó;BA<¦¿–‹FYK`´,|ù®_ávì;úG¶ÀÛ¨kGŒk·2$$kN˸–é· Jp—2f‹’§Ì&Þb‰J0p5†>É‘Ö,!CÀÃçÀhuÏQyîœ÷9Vò´`aݸqë¨Ù¤þ9ÎF”Å5ô-+›Ѩ¢yåé•kŠÊˆL%ÚxÚ.´RlXè¼Ì¹Ñy»óAç~§âûáºÎ†Ón£u´ÍÂhyÇ.KÆ#vñÈpLrЂþyÈ„wxÜgy(´à¾n<‚° @z2ðs‚utè>œÈ,@æTëÊn{ÌžïÀÆC3+œÚó=ÁGžŽc,MÍ<(ýŒÐ9Øù#_°À»€¦„î[~ïÀ=ÎÅÎÔ_ê¾´~æQ¨‰Ââ‹@íà ÌÀ&åCn?ïP msØU.µ1®Q§ìvS\ž MÈé»RŒ2ˆË\1„7ûúëúá¯1~-;濆©‘!ÌNÓi2?Ãõdº™ƒ.Ëؤ%„ˆy¾bЙ þ¾(ÔòÛ‡°QVB€û]ÓéI75á9´µBX‰ÿxÙ„ÐéþòÀrÉO½ÑöþœÞ$T9©èé(õÄ£yAjfî8õ3ÿôŸÉ ybiÔt}¥¬Û»!Nô Xù’é5Ëk.ú=Ó1Ë1ýºîˆáˆíuóî]û¶L+Ïg{¨G¤ƒû1–NïùâÍgA¡¶>ûÆ;ÏIÿ>yîWÔ6|ô:Nˉ0eÒëÒ3¸ó¥ýŽHƒÒÞ#/¾Œk¨K84ÉLÑALìˆØù’ë5uÀùª—2‰*_’7Ó»cgô àަC¦ /f¦9!ã˨º¸1\ÔNËJH,Êë¦Ü9÷$7 ÐQíO(‚£ZH"~ù‰"ë ²Oà„,3 fÈ$‰ÏéUk¥‰à¨Ú«›Ž)'Zj:úèéß«fÐØikE¥ÒÏÍA<°ì^$6$ûÖ¬F ÐQª +ˆxY‰nÂXÙ£¡S û>ãú&o!h¸yòm§»¬¶ùʃl‘Þü\Xäsåð‹ÌmQgrøK–Š}åôõ˜kè5µ)£¯=øö3´tÓêz"4d[0TCDñoâå®÷ÜTÌs0t$øNðxð_žAŽ ZƒÖP™'d=üNïS^J?Nã.‹‡ ‚Ûé#á2§ƒ “×ëñ†ƒO|¶™Ð¤ðÜðúð@˜ ‡5f³›ËX¨€&îNy7ò`VˆÐÓœËD°5 ÌSªH ' '•< ó²ç`„Ø$=Ûw˜øiJ å&Ö>ˆzâ’#ó–8ê“‘Ùds0 {„*l0ŒƒƒY ˜ +â¥Gã’;ÓjüÖÄÖTp%Ãs%ˆS«çüâÖ fĤõýµÍË©ÂîþO^~ ?›Ð «@D¿L‰¶ÜÓrf$nx±ºc=½æâVe4=ýøÝ¸†¿Í¥ªŸ•–­jPɰŸ>ò=t 1[œ£ÆÐZÕ•ê-ê-š?‡?‹p]|¯jz„R«¸È ª´›"¨Þ‰pÕƒ˜µUW‹½åKÊ©ò©Œ›ôø]W‹çÙ.´Q¶Qs<¢U1Œ?S0ÓL&£+ÝUƒx‰¨Gîj­A ÆÝ\ÁévAß~Ûçî»%/ê nC.ù×ä¡Åêžà ¾êIdÈ(C±&{ô¾uCdžwú¾Ýë†'®¡CYØ#œ±h€רõB<Æ _÷™¶±r•<•4k ë‚Ó‘2SÁ¦¡˜`h: GtZ¾L5'âJ•"ÅLG‚Ñ?8àeú( á5D‡˜ÑÈôe1˜7%ÇϨÎ)(¤À‚ýXvHÏ U„h|]eÇû/¸¥3{箉Ùoîì8¢‹zù²tyÅGO[—Ë-Ü÷h{Û?žók}ØÉ¤`IÂ}[¦ÜrÕòã²³—Uäç]vï›íaAä¾ù=kŠËÏè¹|Çû)'ÞG%| FÌ Ð”üøŠWh7µ ¯ÁÒŠ9VIø±Ÿ¢ŒãÜÚt‡øE:d~Åæ¦ìf#$ð¼Q«0gÀ'¬ÕðN ‹=Tļ¨ãø„ÉoœcÜfÜedŒÐµuÙ‚áíÈ‚JÞêú'Îzçdé,“ú°^Öá/÷õ†¾&Á?¢´'AH åÈЉ3׫ËÃË÷¬Mã±kÅU;¯ôW°]ÒÌ?õQ3"ª–ëtÁƒ„ox@&ýÞ‘d$üDœ5Ý5ÍÝçíõÝ¥¾Ë÷ ûiïw~e„‹¨«¹ju;×®>ϵĽĻÄ÷¨÷QŸTsÚ/Õ)¨»(M‚àŽÄCàe˜hÄlB”2ãQF£‡N›r€¹Ììƒ<\‚Þá %5ª$»Àá «"$L‚—”‚"@â%Zê*‰ Ñ.j^GjÊg§ÎËMZ­Û|¹4 í»¼¹}5zT”oZ9¼rÇÌ™}˜²><]j{w õΚÞ_ýµ~E“2*Ï·rä n5À¢²úîÌAf'2`‹3€8®‚ŒU\£ª©è­Zä\â^ã¼Ü};ºoÓo3<ˆÄiwéŸ0<y(ºíÃOëŸ6<y2úRä¥hP¾3d0œ“sQ\çråiU2•N—©TÊ,ìe2ê|eUUv£~Þä6>댺#—é݆¸:ä÷» îšx•˜Š¸R¨bpdÍ^eEyjqš+“äÊ}å)“R©*K§S&—Ë­ÎdP;«**ÐÏWU”óLM.“vªU ¥»,âªÊ•Ab&ÉÅTUÔD ݩŠòLZY ÎÐÈ îØ@.ìzBë‘¿ ª¨f} Uã,Öâ?íVÌ’}¤}.g÷°Ë1 õð™xÉa%(òjP.IXÞev8‹þ÷q<¯.D®q9dÇÑÿSÁïœH|½®ž‡v6ñęԷ’(,X¶(€ °ô8Y““=‹6»ƒ§žð¢ÝAGC&EŒÆ!5¦ 4¸2j5Ž›ç®4Sáno†7@Ž5²ÓÃWï(x+]Ǧ_éŸzB:â¿m`Ùô™€[”Ò˜¶D}§%ªåŸmàŽ‹F±ÊXer— #êɺŒËP„¨u4ʽc†·}%Ý4DõŸþÞ‰ÿ€ã›X‚v@ƒö`ï¼#¾…âØ2¾È·»ÚæÇ¶G(žã•Ê”Éî°ó—0…á0ôØÙXÈ1&äûcØ`¦cî„Q~ÛËÛ•&ÞÁ…CñDò)pí™ð·¢rLÂw$|ñÐ3ø[4r¬”¨,{¢ÿ„chx¨Øž¾n"€ÿCš Ì Ê²]V–²ýD>Û‹e%ú²\p£¾•ØæL êÍ9p=—aY©¦–vvj¬¼Iõ´áCåãçHowoþñ­Ò‰WL¢€ÏF)WR HEü¦7ªLé”L:XµUªV®©ãÀ©×º/À7¼~)CG£.ˆ³Þ@ïGDÍX#^øeôT”âb JºGuOñQÕ£êG´Ï(_S¾ž}=÷¡òÃܱò¯•C9ý >U^f÷ø-~”×ë±~lE¦ºXžÒ«ÂÂ[ò.ÓX­æÔÍ\s1fPg›ËÄòµ‰lÙ®2ªlB¢ªÕs·[˜6–¿ìnm!Jø‰a‰­ÿ`9\œØ•P YCñ“OºŒä²­kl Å5vÌQmT5E±^kd|ȶûÍnŽ|8§5(Š1ÒéÙ&Þ‡Œ1‹ï¬8¥“ÄïJ¡"¾1ð«ÊH_­áBu¤¤qd¾ ál„4$báqKHÄk¬TUaªëÒ®­õ±\ËZ ýd6[‚å3UÄêMçžxø…ö¯MØ}‘@¤¦¶­_}þ”ó®Æë¨²h¦wåùIϸâEóêM¿0Þêrg5E¾Æ¦­ wÜ}uûuÒòZ[L箌9£= -êµ},!tÀAœëYX_âit³Xö+4ø-ñø˜uòà­!E„ƒÌR…UM#¡Q͹çÕ¾6Ý ÁX$¦ÈZY±òuKA@ù=“B²™Îɹò8<! ñE±ÇD„¢Ø«w‚ɶÐ(8Íà£Î¬Fc}$•ó&d÷†ã7·êG¹*g]~Û[Òß?\þ^ +·TÞ´éê›Çlfþt‰ Åð¶\²ë_/½#ý¦'ŵ姿¥sûíÃ3Z%ªƒ,À ‹Þ™ƒ!ðŒ½ÑþØøžñ=ÇŸŒŸû¸*5È`õRåRÕëÛʵª+¬WØÔqÞîàT»ƒ²;ÌœJËjó‹¼ ¬Åf:Dµ„üà  öF mà«Æ»#a‚­†“¦"AÒ¡>ÐÈžqȊਃÚíT&„M^Cé(TFŸ9ŠômTN§0ìDPÀ‰¦ 0‘U8Yg“%¶œ-F@QžuÅþL.TÙ*¡zÕÏž¸mñäL­§Ø´vÛ}ÊWRô® ÝB1—ÉUÙ¬/?xçßÚbÓ—wl<ùÛ_Cf‘Œå›!¶øe-ú@\vWüÑøëñWSŸ¦N¤hYæªÌ™{3%Ï<•|:óFòh楚“dÞ­ÑÑÉñ *Ä«1“TõV£/`Ÿäõøn* ‚±3ÁXE6d§ÙÊZÆ”6âÊ|š«mŒÅuÉšb¢aFê m÷—a ¼»¾@Ø0ì;!ç‚S{¨„a$8"‡çÁËJ2nF«²U㩪T!ŠŠq(ª“•Q\“¨=Ù€rÁ ÀÇ™¤pMO?š­tÉkUèÁQ!“)UUiÊ›dÅhèT¦!qç5&ÿ”ôÌ !¢€D-*Ю¶©7þŒ«IŒ»ó·ÃO^:÷Æ–«oºý§ôî€5‚2-X5. «£–×Öþus%¦*W§¼²Á•ÆÜ¿Ç…ÓÌJà'®½è¿Øqxo|ä Xe³üh$ãõ÷bß~©f¹ébë•ÜZþ Í:ã5¦u–uÖÓº“zítþB~®ñ0ó²éæsåŸô| ç;h¥ŠRªh4¦ÇÐ g¾×Ìݪø¹‚R4kÕ^U¯á×à_'Øë§?0Ðû}%ìí3Ár)á/ñzþ*G‰ÿ£H\¦s#ÖqE-&™£‚;Þ‡VGG‘Íè6†‚Ñ+äY«ò ?-E³bÅÀ¥ q€='€r*P¼3|½ê¹k—lm%þø‹gÞø¯ç¯èðCjwù¥izç‹{¿xç’…škÞÇžƒ¯âðØ…ÕS”÷Œ%1}`Àå(Z# *â9U F”nBžèÇa¡Éù8D lÔlsowäÕØÏ}^N¡ˆFT´/Çñ’SÒ+d¹,ð ¬eeûáè7}ECÉ) Ê5±µK¼XšÃpØA”%Trz…ªò•¥ü…Qú%&§ðb’#›ñ¥­=–œòAϹ dÒuÑàx·þÔ· †¿ò°íË©k[ï_övGPJ¹¬Þ®xóPëðÕàË&«åT-µÐ/?3£NXY5½%ÎÛÒÙzcË ­;Ý,g ÊVWk±u)}qÍC–‡Êf³!Ó™Jº[4覢ã ÍJاç)'ƒFK—ïô'&&žOЉ1ó3\'G5u3fDmã'on—#&HÔô²ùê@o¦¡=fƒ<ªßˆºúƒSÛ ¶œm«m»ôґݽ=Ù£Ã}`òB„ßpôa’/ˆ#["GAêÿ°¯Ÿ`T 9ò]"ly¨¼FÓó•øáŸä€˜¾7cë°5tÆv•ŒÙ¼'^ 0v›@÷$59(§`ÝÊ2:O¿úì½5­ò'‘)AÛM6[øÔα“­ÓÍš'L*ã³ÛÍÞ9™ŒgÝ)mÛ÷À¡|W‹&c·¯ü&R?oåsÿl^ú‡xé´VÐ@!ŸëØ&±šŠÝ3÷²ß´Ó“Ëüµ•«žW^àèUÞì½÷?sýØp{[ÆdôÇ#½ ,¾Üš9ÿÕWÞyÅ Tà+d¿ÓŸlΡ¢­Ý†¿µc¥Ýe_³!ëÏQ¡&¬>?Ys°«Éã „’Mžl t†í&BÉd"ä2ÒŠXŽ1Xõ(ÖhårY¿OeщTbÉ,Dº`väÈ„,À‡™‰Óè ‹%$^âDïl–Ù+$-ÙQ["ÉŽˆ=æÓˆè˜pÕQŸ<1A˜7a{I˜ËÐYóY΄uØ›¦ä½5j«6µÁ9—j*ï¹ðçuòñÒÄÍ3'ÜZ9]ãQ×]Bª©¢©°6Âû¸á{:ƒõ›;/“/U¦ö|;|½Â(™WÔh9€ŽtOéŽjÐqúÄhH£oÒx"Èx8†IvãVOÀùbž;˜ç\$¬ŠÉg@};ó>2è ¥Gåðà­ì)hê–Ýk%‰cøxdkWË)²®GËHÙ)ÉUT#ÊŒLÞÔ§’ ÉTýú‹j”úœÚZ‘ÜÕîá©Â<ÉÅV76ÈGOUU—áš Fç׽ޮXUK>¯3²Eñnù2h£Mñž€u’Ûã¹UÐhÕYkHÈHqò2§›×%-äErðNûBá¬ÅJ‚)Yùm>'dH¼O$ÙfÔñAb—DŒÊì‹”é!õ* ‰½ú„ɇô1“Ët G (©l€6œûòTI9#&dþ Î*Â<…·çG›lZŒ]Y]Ú1Ý??]Ϥ&ýiÜ¥™0£1I@õí?¯›Zù uk[³Šó{T!£UÁŸ^ðļ=õBhV“Ð#ìJTƒ~#öw„{ýÖÖ‡¬_†¿ sL ˆ Õ‚ÐkéÍ- ,ÍÝmU Á`Ñd †¬–PP N5 åkyΚ³”—ç`)%hìQ_IsÑ#VªtÔSSˆ©¬åpœö†rT¬Â;7¶>v(FÇj „Õ–òlM@}ìBPµE¢³?¶ 86ÿ YÙ'K >bù:M@/ôs¼Á•tAÊÆŸlcŠÑŒa“ ÷Í! Ñ$l¢Ç#HR9ÅAç™ 3·!—6{Œ3u¦ é[}Öt-Þ±bó¯êþxëd©5dô¨”ÒkyßXIðpSé/ÇD)Êãp;ô¬òô“'Ü]C{<\×îê¿ ®å\ ktj³ß%ý¸ij`O²:ö*ðÙÁ+¢[‘ÇÛ&Í1¦VíÑl5!°'Ûm*ðÊ¡}FS–fE÷ LN€Rºô()•xÇ(ùTÈËÄSÖ×¢¶4èç¦ç8º~¶äñ(‹Sé·[œe …®×XNMž‘ç€J0É©PTÒÀJóïDOµ³2@먉‰‰õ”¡ÎÐíŸ@7Ò­žÄsðÝ— ÁÚó z˜ÅñA¦y&ÂáZO<*4yꡱµžî@H`'Á+ݪoë.ˆc;[ÅBu:ì¶°Œ¦}‚Y_ÑÞh¯hôûíznBw}]"®šD‰¨.sKú­4Õ™ÄcDm‡X]È6ß"¾%R"ô<ÙÁ˜cc³¬ •‰*Ç ý'úûž³ 'ò%Ä\‰Îu&5{”fK6©1ËÑ8rçh¶À ¼à<ȃ§ÞN˜ñØŸãÌ”]ú ký{×™a‚+K[­ºÎØ–¥æo¿¨!`W˜3Gµ¿iŠÔ0£`\Ü,Fª‹³¤ª9•ᢆþtU¯Ttqfï Š—aØCÛ¦ÒmšÙÞmî 7þhÜviÞ˜<ïòðÕSñ®y™)IgAB“§Ñ.—¦íz츧ö‚ÖêáÆ×bXô< hýSú—òª­'Å^§«ÛEÝ¡{H‚Ñ/*üù¬Ð$°‘&dÌžZO Û§‚La +õ™tÄcfh.oÒ'í1=—¯ªJ®r*7¤Ô '«M±L–¦!ßydwus½Ø·¸®'Þ2g!·Ó$Àö1%á‹;\qG^WÌ™ø^8öŠÆ3è݄ɬü§éµ“ÑÙÀ‘1E¹NiÖ%îžÍѳ*'Lk«¹¸¶Mš>¶V<¯®!X-¶K]øC²j`± (9¤©ð«”·(QJwŠØãQ5\ˆ;oeÜ^5üVg9åHÒ¨rä 3îIV×Ý*¦^R~¦¤î0ÜmÛnxÌöе! c·OWM3°µ¼#ï¤8SžW;­mN5dSÜú6=D®ˆµàvj¦¢l,@fƒ ޲k#¬";mb£ZfZ:äˆb…AeŠÂ'a  p,Fe]¢Ï(‹ä9FYipÃÚzšÍ2‰|ÚoÔ¨XÊçæCœ›£æ'Ôù Û™Dà&©ò° QU%Ï7 ѰÀ_EèùfìhÚ‡#·iœb. £¢HùZ¥ h)·RNÍ*i³à ÈÉŠŒ³Èu6´DÞxÞ¢Ž‹ïÞ¶dÜÒ ³ó‘¼ÚlšÃfÙ–Š™s¶¼ü×ý5 ±ºe¹d\Ýú»CƒÎOIÊáÇmcéCã“`½úq›R±©%PóÕÑW¤§tÖéà *é\åß/À1€öú¶8]•t% IúöÔ£™ƒ™£™ßS_dN¦¸î®á#­áã [&PšÀ¢ íVØsîH™µð4cp:Tùéej! SÄ"Y—9é@Ÿ*´mÛÒ8MÐNV^eÿÀ–Xb?,¤êËFÀx®ñd–3›ú¤6ŠÔY(”F…Ünº8^4@ܬªLu÷*¶áÑt™~Á¿G)ÙШ?š½ún•qÔ¯ž Må,Žôºoºáêó+Cc–+{š½S%Oü´%ëÞÂø‹ fW¼€š˜šôÕ»ÑmfM¼…Á £>%V¹b¼GÀµ ðºv_ùŸ?y²0}ˆ‹³>$ü²kð´ä‹6çÏxÁ9XZ¶ZA,æ³Ù¬À=!º[r’i ᥂=Ö±©kFEÓŠ+Wo_[u o2(œßl¼¬cÒ–ëÞÝ}Ký]:‰uá®[Õ°bjKÙ„ˆØ²ñü[ã*µô—yÕ Î«Õ9fõ=ýwÄú à¦楎ÙªÕ ±LiÄî e¡Š¾ BT ª1\£^-ªuXôÁ¢m*kq;DcÊféÑ]¯¸>l€Å$ÇBÓð#éÇåxÅÕtTNO‰<…èQ_:q×ÉKdH%1îÁ‰Gø¥0ÆîãB”šûÇl aPµ_êë?í°‹AœM«/MM¯FÕ ŠI‚k¥ ¦ñãÂ}NP  … B-%‡4ñ`eR©~kŸÖ±AÜ¢<™þÀ«”*/½)sæè~…%hðz†OáׄNs̨¤ý~¦¸h8gÖÙÔ‡½“ÂOøFe#_³?øÔBfÂÆ(Í­EwQ¨ *”|)OÏ[”9G0\cÙdQÂòj:ƨ]`U®\®hJçÜ·§Êe±Â”ò<ر¤¥˜jªpWÁéôTS0(Ó¹ª 7œ`ƒwÐ×r®˜5í“"xç|{Ä¥ðzÙè˜Ó_)yCe‡ËrPÿqm’ƒIt&¼+›û¤ãøZeY2bFçTà w¢:lþ™Ãð .L>QT–Êy«{„ž`O¨ß¶‰ÙÄððQ|3upúNÃ;S]UU©x…ªJaçU*ˆÀX x5…=a' !(a«.T© !kѤJMUpÚŠï){ÖRÀV U‰ÝªRðµXo¢k=cÞlíòxrå4¤ò+TV¦Îh[Gέ3*ÜåD…j(¯Ï¾ôáKšd‡eG¥åF¨É^<rId2$n&û †ŠÌ<}†Ã<¬+ &utFe‡…<Ÿg&ŠXŸß{)FœÈ^ H €ù#AÙ®… r®ÈŒâcѪ*O²Î[^Å-ù÷c˜ÏÉHó½vÔ6¶ÚwxuþJéýêÊä_Õ¦ÆÑwz°ÙgîÉ´NÎŒ³¹Là¯`²±J+&d(‡¢&ss àž<•ö©ÌÎãQá»o¡p€ÃOé×Ç“Ü—ÌtbB%ñ²Djœ²Í=.už{qj³jsê®ÔÁÔïRºÎŽ%U©$P¿Z]49@=U*§šR©dJ©v8áŸP&+õ˜‘"ióèr\î̱œÒ‚Ö[°¥Â¿XÑYßë;l`SÇÈ©€pŸâ|Fi¾?,ürÉbÙ 4ʰÎds‘e`2ÕD<ø¡ GF¥ýò¾ÁêÇæDB/™rÇ¥5Ô¥]‹l5W)éP0_?¤ïôc^Õy½ÃßRj¾Får@Ê•ŸÍ$N?÷þ 5 ñ< )¥KEí!’þU t0àG¾×ò°8ËN½DQê©& q°©&•Jmà0×á.3–£°¡cµQ]4*T‹¢ŠJ•‰ƒL=X“)*<¹]ŵhšD½>îaè³K5 :+ ,f-È¡8.'Æmè´+h;\‡ål ?òx¦–}$$NEBU„ç8Žd‰åè²sX…JT B„n~»o› yNK…¤·hC |ðNÇéC]·rÒWvºuÜE‡Ï/ÂZ||-u-ý:±—"ŸØ£ÖòƒøÄnJ“}gø(Ê‚Êv&"Aô¬?ï|líÚGv®Á×>~ÅÚ;×^A¾_‚aÊØKP zG\äçóà¸?&;,ZŽ…Ëš<™c¡úVOó±G›œõÆJ¡Ll‹ÔçËh¦ÐRkO¹b0à1ÜnΫ˜sc…ùn·“S´4ga¾ceùÊl$Væj««ŸÊз±ÎÖ¶AÂ<M/4NCÓåè]|«q&:¾GÙ‡6¡C0ÂòÈÐBS»Æ·õÌHN[²lá¥é)˗ͻ䈘q endstream endobj 46 0 obj 17667 endobj 12 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CMNUXO+Times-Italic /FontDescriptor 47 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 333 0 278 0 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 444 0 444 0 500 500 278 0 0 278 722 500 500 0 0 389 389 278 500 0 0 0 444 ] >> endobj 47 0 obj << /Type /FontDescriptor /FontName /CMNUXO+Times-Italic /Flags 96 /FontBBox [-296 -413 1661 1205] /ItalicAngle -7 /Ascent 750 /Descent -250 /CapHeight 667 /StemV 95 /XHeight 454 /StemH 42 /MaxWidth 1610 /FontFile2 48 0 R >> endobj 48 0 obj << /Length 49 0 R /Length1 12632 /Filter /FlateDecode >> stream x½{ x[ŵðÌÜ{uµëj±VKW²$K¶lË–YòvmK^ãÄÙ퀛,8 LMpàj M)Ðæ±¥(&P¹šB( Ò ”÷m¡u·éc±õν²è׿ßÿ¿ïézæÌrfæÌ™3眙{}åæ«V#5FV®؈¤Ÿ¹ÀÉ•CWº³yù1„˜Äš—®Ïæµ4Bì™K/¿fM6o©@ÈöØàêUÙ<ú`Õ dóê‘opý•[³ùœ³/¾|ÃÊéz ô‡J×l‰õî+Ö¯Îâ—• nܰåÊl¾ô}€Ý7¯žÆÇ=@ÐRy7 »¡èoŠu# X´ ÉÐ1$GqðtæoÙ3ˆ†Z±~Wœx›]¡«ýëåRþ) žøÖ{•“|ù„¦]ñ=h­˜Á¡ MŽúß&˜|@Óû¥&3‘%ZBiT !ú1ù6V£ZÄ“;Ǻc|šìBGe£,9Ø~¸Þ|x9¸ùàr˜?'ùƒqrØ}¸›tì&i2úD¼‚ÏI“=c­¼)MFÓäf†4Ù @Ÿ&»pir]šì M“hÒäê4¹€*M¾ @™&ÃiryšìÀ¦Év²4ù&M®@§É6Tš\ˆÙ §ÉÕPš :€c¤À˜,M¤_6" ^'ÅIñB)6I1'ÅôÑš 5Jüì¥x¥í æƒšsƒš5/ jžÅƒ¨ œR̦.Í©.MªK3Ò¥©íÒDº4…]bWA€uNŠ=Rì,šóš·:4?ïÐîЬìÐTthüš4þ… ß©yw§æášüïNs'”þਮS‡Oã Nèìõ±î"þÇøyä†Yòø§cî§ùF>†â´˜vŽ#^Ê?…š±ÊG‹$ø( ÈE¼þ±îJ>—u׸x¬{€ecÝËôŽu_C,EÝR“Ecîs|£/@n©Ë¹ÓCt¡=DìjÀG¶ñ—BëÄXó%|£7¢f ½F^Õ¹"áœ3Ý~šB-Ô‰õš£ü)~"žÆKÆø¡ÿÿá¢4Çø_ÒäQAÅ¿8ǟ쾃¥;M ø¹EP<Æÿ$MžâÀ‡HDã¿/–Œñ³hßv§å€½?‹}gPêr_0<Åß8Å޷CÛ‚§ø+š¥±×gÁ¥Ah µk‚çøKøoò Rûyn iÎ"iìöø)¾5(Ý$à§ø¤ûß$6ãØb@TC6Ív[•Í•óRoe{¤ÞÂٙË€Zh2ý‚Ž÷ñ›yOó¥üb^Á+FŸÆ7 âBŒ½fG·°£—±£ëØÑ%ìh;ZÍŽ–°£y쨋5É rN®•«åJ¹\.“Órû”μ/"Ð&'è<Œh)Í1 Ĉ`9AV2‚äd7„› ÜázÃv@ø„m¶B‚0’yÿ ±õ8!ß8*u:N¾A¶Mn#7M§n"[§S[É”‚Mü„8&À±„Ò8³3…oIÉv÷¤p ßêH!ˆ{­fóPƒµÁP¯µ$þNÔ/ö'B~Öÿvƒ m!…;»¯ù ˆé€õ<þ‰yŠå_eùÇX ³s! ŒJ£Â(„ÑWÙÑi«3µ¿saOêgo*"&2ÎÞÎTÉB÷Å=ã¤Ô%ã¤^½=ãè=Ò\ –£÷½€¶LB­Ýh(.@à ^D’‘ÐVfÑܤ^Dë ‘«‘[Bs“«%´s"Ú‘ÍñdâH"@¡ŸA›%”Íô3_AÙóu”=Êži‡ÔK ½4CÔÛs$/GyR¾ Õ‹²Õ%Ùê©:z¡:˜­nÍV·Bõ×xÿÿ™YÝôßé ¹va“54XC\-³ê”ÌÛ”b½ÿ§>¶Lÿ`ðJÀ#`ª‘YŒŒÔzdG(ó°ÿ™?O-ËL1¨xê‘Ì¿Q¹°¹¾;ÀσAûÐsh+ÚéëQQ!jOè!02½èP)lÊ{ÁƒØ‡Î#+jE—á÷aŒGÁF½ x~”Dw!3”¯BCÐ>5î“à½DÑEèt½„Î@ßEhZŒŽ“Ù7Pº½ŽHS™Qè©U¡õèFtkæ1TŒê §atöâ-™ ÔÏz ë6ô:yæÅ"¥Dc-`·‘Ž`vaïwD ¾è톑–@‹£°£[3›¡•U 5¢6Ôt_‹ö¢@Ùó輜\IÎ$2Ïd^~ø }>P³9mFWÂw¡§Ð8ú /!ÚŒ/sf<óbæ€Kƒœˆ‡6u`#{€ÒKÑ­Ðofü¯èxΡ_c5®Á¸ïÄwãñ›$IS»¨1šcøÌ¢\àL8^TGQ Ð}1Z`ä[Ð÷Ða ñct[±Wྟ8IYC6ãä4Eï¡Ïe>–(!°,p²(¯GsàY |»E£èX»ý@ÙCà¾+ó+4>C_b³XŽƒ8 ½·}ÿŠß#Zb&^ÒD~E…¨zjýsú“œºuê/™žLofSæi˜ý{0–8s‘O¡å@ñ*˜û¬öX;ñ¹žÝè>t= ö8zF>c¿ŠÞ@ïÂø¿C¿&Ð'è?ÁOž*Ô˜ƒ'çÂãÇÅÀµzXÕn<áx߀oÄ·ñQü4~8ÙJzHÙNv““Ÿ“7ÉYò[ò{òWJA9)ðø%º•^F?Æh™̵Ì0ó¸¬jò“©èÔÒ©åSCS§2lF›)Ì e¶g¾“IêþIâ¤éÀ_öŠ„`Uç ¹ðtƒ¤õ¡KÐJ´]k³¸yðó^˜áÃè1X§‚,½ ³û9¬ú»è×0³¿¢/Ð$š›>Û@ž qfÔ 3Z„ã|1^ŽWà5xoÂÛðµ0Ç=ðÜŠoƒYÞÇGðóøcü >Oaˆšè‰›ÁÊ´’Å𠀬'×’]ävr'9@î#‡È¿9J^nüLQ*JKù©(ôÆÃÀwG\²=i]™ÔðüžlÞ.qŒ!!êM‘~±æØLMÎb±fx¦f¶y¿¤ñ¨è磜”<öOÇ™ÉÁx ›ÿAõj©îŠ:ÓHÑÝsƒg.:ìi”pŽÃ µbyq•‹â¾6ó‡LEz UYän¾··{Ý#î‘öU#î÷ 4í— T¬é ÃÔö¬…xQ'%ô:f“«{{ãÐO•Ø4ô‘^èaÝt¥¢ð$ E‹:a‘ó»{æ÷¤†Ž”è…E…-t Øz vOo/`UÏR o_k¦94WB}<Û xîÃÐEïȈØçBQ>Œ8FÄMŸÍ§1úÛaº Dq/¤ñp7´àõ8įÇë²z0T 쟅››ÌáºYº¡e=P['q¸áˆÃÂ?ÃáÆŠÃM³”~ÃÍ@s“ÈáÄÿ‡“_ãpË?æpë,Ý@dPÛ*q¸ýˆÃÿ ‡;ÿ)Ï™¥ôkîšçˆžû¿Çáy_á0Bô™ z†<‚V’XæÏ4B+!Xè ÁeÜ©R· ¤9~C3/ä!TQNTÁå]_LÝ’yº¹?UÃéãYÈ»Ñ2I­AòïüDB(4œþß²ÿkS.!€¥„ ‚›mÔB ž-‡ôRÚž“iÖO3KeUp[€¶Ïº‘ä’ßS»©óôV¦EÆÉbƒòZ…Oq½Ò¬|]µJÝ¢>ƒˆèsɼpîOM‚‚f“ˆ‘% Ü‹ FŠBJ›ÄÈ&'T’¡{SãørÇÛOj'kçBÜ5Y‹j¹IÈBTVêÕ{ôFYUú‹8Sýù‰4uâËj‘4 ¾ßÍàù‚nGvA#ú^4C#UÓg ¡ð$Ö,±²R£‡õ ãçœSõD1,µËü9óYÆ4A» A«À @åh58ï2œÆ· ZŠ"*²ŸBû±{j¾5d·qܤU¤ëòR܇ËÁo?¿jò‹ULÓçßé€lea¿-äÑ–8ÛÜ#.†f,VÚT¹iô®›·ºÞåÍ&Ÿy"¨~W¼OŠŒV CÓFwÐbµî1Ð4cdܼšöNGçÓUt ½¦å¡=yžðI÷ÜÙ¾Pmˆ;ô4ìÒ–„¶sÇCâT­ˆût"ô%¶Ÿ°#n‚Ëõ"ò÷5Àá) ¡²"ßËVFëq±˜d,Öâ“Ù’ãY™hîÖa;Ë–D.±çþ¹œ7ª1™JªíÒÉò°™: i»’Çg×Á³ÀBXb˜³ŸÈ2IÒ •x™o1óXÜ|8bfµ˜fvy¤JÜŸ Ø¢ÅÞ¼üÊŠª(TÂBHcòqSøÁ½×&ËïÚ;\²h3-SmRP„¦é‹]9~J‘£ÓËMÚzëàŽ˜¿À¡1,®oo®(ãŸ{²'>?{_wû¼;6^`öiçhXÃ*4:íÔ«0Ã!V­eZ!g犊€oW‰kKU£Ã°sÛç@£Ãú3¿¥^b®…{­h9_kxIøÒðÖü+Ã7ûFü»óv=”?îR±ù•ù­ùT8Ç§ÜˆÒØ(T^e§.ÇŠ˜Î,˜“Ã|>°;¡f ¸UÁx®¯<(¾wä|¾reEù¬À÷žÃg@à'à™f±(æ ðf¥\RzŸB¼ ííœè¨uWEÀR3š@äg ?JO 5%Êy9^&c4VÖuw ìeFA^\ÖpÅUWì|ûÍ¿tÉ¿x`Ï‚úûnÛ©¢7{ÕKåeäJl•Ë5“êáøêÛ.ûìí7KŠ­¿~í±¹}Sçþú` ,Ú¨àÛjðm½ X¼oy‰ÀX±ÕckEìp*µ £ øXS“S¥ÿÄýˆ^«_°zx¶ÉU判Ÿ “Q¸ìÉ÷KêðäéMö:@nèLŸUbÍäI˜=w²o4åÉ>+(¸˜Õ^V$uH$ù³|U¦>¿¼:ßñß?Ñßßu[ëliܲ÷¦Cã?|‹ÚuEE¸¢$Ï^«0ئniÓpoRnî-]øè¾~"z5 ™ßP0·\T€†…ù—›@ w“Å´Æ4dÚeºÙ—é8}†þþZÍÐX(ð(•y\^€b“'§•k¶© 4ñÜÖB1Ë—#™[&Èúe¯Éþ(“ÉB…3Ú¶LÖ: &¶œ½î„Õ.©ý°”„Ùn‚u7LëzZ—5hâf‹ÎLÖ—µ @<‰Ÿ½9÷â©ÇÓ(·Ìë\Tz‘½xÑû×}ïû“ÏÛ¸=RÉëø7¯¿ÞÖ:zÊ”ù{.‰8;-±ÚËöï}æ­µùÅZtËâ¦z¨©›ÁŸrÂmÔO…íkН.¾Ñ¾«ø†Ä¾à=EûrU‘ª”TÓ-sè„rEñÂØº¢mE[ªï¡÷+5 gS³›2ê©xŽ»Ñ¨×©Ë*¢I³Ù§B<îTTÜéŽ<«”°Î@›Î혣Žo †HhŽ.~]ò¾$I&eñòG7FG£$Ú5'|ötß¹ÉX¸o‚; !»s&ÏÛmV‘°]²àe7ÅÝu¥—\ ¨©inå È”€F‚5¨*Zö8›ul.KyŽ×„(l°º"Þ´èá•F÷Âe·Äão>p°À\Vð¼Î¾KmÏÔÈ–í6wÌÝ&”TÿþíPíZ#“}q›ÎnÔÙgyö½GñsþºGš:ÿpÅ—7nžW[`¶™:÷ôìŒØ1ÙÕÌy•®2kQÍò»NÄŒÝfŸçQ´ÓiÉ[°ð»[Ÿ¼q, ì=æcê fj@§…­¬Ëâªrµ¸–º.uít±lå.Å®*JpyøÖ´16lð¢Nº°Àd¤Ëìò£ ò b´ ®å¾75ð“Ѥ‹Æ¤º:F㲨†­F•öf¯ÊÔ4r “Í”0]iº×ĘLÊWÝ(„O†Eà ïofܶ‰†8¹ Ï˜’¼7ÑvXE7N\Ѽ|æE4!ÓZÎË:vŸCÓÆ'kWŒYýfΙÕn`£%gîk²–0Å…„U-Ž7«"Ù„yÎ!£þÝŽî½W•ö*Ù]29§ã í­ö–²¥=Á*Š>@(gk>ÙRZÖr/(R=©S¨ -S|yÖ쫛g¬µLyL~^r\d,] k,ZÒ!×+lZí/6ÎÛû%ýŒÆ éá„DÐ@æc’Ëp)CûÿëÃÖ´•R䎑¢¢~PŒ·€æ³µkýZe ùüL·J|)^\òu–±¦f—ЏAëjµ¢ñû‚?G|¹Ý÷€ï/>ÊçËzL"Ã7…j¹ÐIø¼;mÅÇÂ’ºüt‚;?AÀ/ôЉpŸÉIž±×YÉ¥Ø öY’|I›ÌÚãi–æ{³6+/(¨©)pá—µ2Æ”Wí)µ+;˺ÚC1¹j/EWÎ]Øî/]B¯ŠK¡¤¤á=f²*¦Ò©Ô5ÞF³vmI[[™3THˆÚ¤ôé=J•LnÊÊðbàW ÜoûÑn¡MfÅ~¯±Ñ`Pæe;Õ^ÑA«M&ÃÖnÓ×Ët:­å4;Uºü –ãt¸IׯۨÖÑ:]¾2?ãפƒÄ¬m‘@ÑÁCè±âÓ]œvûqÉÆJ–§^XfÔ팶Tà+i]P|•¡º›e§^PÑZ£ïÊ cIéÂE¾Üœ‘ƒTØåy:ì‘q”Ò¤übnÈ 0:†kו-48m…682 Kæcæ~Я p™ð£šyµuóæ]U|Uí®b–©g› ró«¸Ê9•]Uó_èøELJª¹sç5tu5vll ¶{;:ç4W0ù~N'“ÇM]Ê¢à\»M/câMs»eL…ž³ 6½ÝÎ-Òqoðûó+ÊËyC$Â475ñ†ÆÆ®¢¨2]°`Ž’mj,F”¢ úó¹a?æü ÿ"ÿíþ1?ã÷/T2ܢȪÈõ‘G#OE~9a#]\cý¨5J`ZL æ4ãCµµâ‰ÜynbF!´JšáoBX•ì߬†øêÙ/»Hòit9È0;ëûP2Q·ƒOµ€!ÑÍ””ìn¸M¥7›eá¬`‘´ •Ç—zBºoÛžk¼ÖÔàÈ1ÙjxeÛí­nsÃŒR”ÍØ<ÖT[Öxﳄʱ6Œ×Ä+Ý•ž§èª®Õÿ.¿jÃÊ݃ÔÍfÏœ¼knz¤÷~¡Õ¼xòW‡!Çäj³j×\ÃÙëty9¤TÍÉ­ö—×}ë/äE…^au¼qQï¾e“U&U€£ò¸;µò{WÜ~A׿r"`½ðp5þxÌTU°®îžÀÃñÀKŸÕ¼x3v¦FG×ÑõܪÚʺֆ^Õ’º«]» wä¨TUЍ›ëh!à¶E*\ç1¨6(½ªN]yÄåÄY̧é‚BÀl6¹Ê#ÞàrºôAà `sbQ³Ž‚Hék.R%œ«œ7:)§Ï•p]âºÑE»Z›œ.ÎåjRb5µ5†‡NZEë€À h!f× Gq§íDiÞ'½ò ‹ ›¶›³k)ø.˜Œ™ýû5¡‹á?lf=¥j‹¶1ê~BFvn[0º¹È]§”ß@+µœ=Ñå\Pº 3¯¡w(Y‹³sss²²®‰¬›ë1:=ÉS*ÙÍL-xú¢ûõž%Ö ×”GRè¬u«ìŠç×èóµø×Ár•Õ»{þÆ¥ßìDØîgà<¨ï²_hk¡ÛÔíš^ÓÇ}­f¯æõ+†lïÞ²}¨ûÈü‘í¼îs³A¡R¨ «tÜLÓÊ@.K9*mü[àp;eq}‡Ë> Ž$8F}Ù3…¤ð7õUef’‰Fô/¼>XØýàŽË Þ¾{nÚAºGžþé/GýèÙwo\þÍ#%K?<ó9úĶÓ'O÷¶_ž8%úðM'å¥n…7á÷ s_(Àp«B3 +s8áMýþÁ · ³ˆ×¹ˆÂd\&³ŽáM9aât‚4¹ø"Vg.W°® S©n ËxÌsC®Ý.âj —„O½ Õöå:R"y'g] ñ@?sÕ3×BYÕp\^«Í*qñ„‹?}B’Ü·0–<=ÑÊÍì|Ñe¯ŠÊñ#,Æ«Ìm?].//æÝ 5­’îˆ{CŽâ‡´z—_í³çŽ3Ô­*VÉLmÝòQ}°¸ÆÊ™eì;×u]×}YV±ÀîrÓ”GÎùD>y2 سèÁ¹Úÿ-å-ª›ügeL®Þ*ÖûBµúòÐZý鎒kž¨È; A{Æôk”´›Ñx9¥ß+Ês¾;`d™€Pš_¬Ú'ÿ|Z–&}?,l½×û¨—x!-ä™àc‚BΛ×c?$从*¡Üë©8$`¯=ZU>¹ý<\-Ù­ŸH1wæ+`g,¼i²o(lìƒ(8…À©T¢Õk!HZ™ûdA˜öÒÊÍà8K.uÏzÍ¢.§¼—\k¸˜ñ¡EŽ{Û=fWt}ÝÂna§Ñ¹}Kًͪtx4v¸cJòÑÖhIúº‚»Õ&£Üƒ ¯©¾tIkQµåÚù±ØÒ~“~êÜ@ÙEÑÊ‚úykæ­Š_¾/ÏÚIäyøËéåð}É¿1NÆÅðKø5ü¿“¿“—ˬ 棜Ïrh÷¸ÝíV+¡„¢)¥Q`<e!”ÑbµXxeå p¶Ü©5ÉDÜG³OE‚AŠ#-$¨,f] àÕŒ‹!ÜÄ»’““X<Ès!¸´«%r®ÖÂvî$wBND.J>™½î%»5Ë@0WF/Ø)Qs š-.¬Ãå¬W²fâO²eù•]„úñÝrnõ†~ŽR0JšÂ8ö ú‘£ g´‡‚]»ä†šò’ŽyÚ¡eCÝ›4C«’½Ó<¹Âà©È]¨Ëùæêª¼¿ë#êj/J Ï„Û»Í˜ÔØËì¿Ó_æT:É–Z—T÷ÄW9WEïtî¯Ò …îP[¨Å­®ŽÇbñÊJ»aÚIS ‰J§–vó|aS¬:ÏCW:%ï5‘@ŽÊJÞàtæ*ÙÜ CfІKëT‰¤³%ˆ¸–ĒľÄñĹ“H$•¹\“s‘ó°&ÎeKrƃË-¶K:< îè„sYÓ!r™SÅWœKö¸Ï×þ½ ß~\~\ Ç ‡ÝÎß´èJŽž·²W™uxæh!^ŠÂ;}ÒÈfgÚ°NpÇà 2ã^|L¨ò–;îcä˜:ÂÊì95G’õîÚ»žaäjÎmU9 þÜ’ÈÊÅEÕJ•!×ÌŽÌ»y›ÇQ‹ó†R¯s.¬d´“=¶\™ÅþƦÕßèzh²Æ”§Ò€,ª|æbãœè†Òr{} eíâW<¨Ím˱ÃU4μ2µ”=C›…B+Ï%‚ÓãÈ”Fœ9xC.¸ÊZp–sK#L ±9^s§•%i\'˜Ñ*¨qä:K#l‰9fŽ{‚%5q¸’8ƒ#›htQÃ乆O&ÁøÃ Õ†BrXVn?%±ˆ‡cq[—G •${ˆf+ýÑ*ñØ×2¢Â9kHZ¸–_YÌ·åçhe:EÙÛÞ²ùódN/ÖçØZ.¸¶¬_mÖs¡`0RÕ² {VÝ·¶ aêt‰Ñ dLÕTã¶á£Ãí© Ô¹S}H-ïÐ{Ô y‘Ÿ/¬i½lâÉGNoy2ß‚…/!¬†Wï,ï7àñP9ì„$|Ø/7Ä/ æIß?‰_ï-AKá;·‹®øú^ü'ø§¹kîâžy¡EkׯÞRÜ~åÀåkáE ú/Ô[µ‰ endstream endobj 49 0 obj 8981 endobj 50 0 obj (libsynthesis_contributor_agreement) endobj 51 0 obj (Mac OS X 10.8.1 Quartz PDFContext) endobj 52 0 obj (Lukas Zeller) endobj 53 0 obj (Pages) endobj 54 0 obj (D:20120917093602Z00'00') endobj 55 0 obj () endobj 56 0 obj [ ] endobj 1 0 obj << /Title 50 0 R /Author 52 0 R /Producer 51 0 R /Creator 53 0 R /CreationDate 54 0 R /ModDate 54 0 R /Keywords 55 0 R /AAPL:Keywords 56 0 R >> endobj xref 0 57 0000000000 65535 f 0000058245 00000 n 0000004631 00000 n 0000017130 00000 n 0000000022 00000 n 0000004611 00000 n 0000004740 00000 n 0000008877 00000 n 0000007628 00000 n 0000020953 00000 n 0000017710 00000 n 0000029569 00000 n 0000048272 00000 n 0000004892 00000 n 0000007607 00000 n 0000007664 00000 n 0000008856 00000 n 0000012828 00000 n 0000008913 00000 n 0000012807 00000 n 0000012955 00000 n 0000017093 00000 n 0000013178 00000 n 0000014705 00000 n 0000013144 00000 n 0000017532 00000 n 0000017289 00000 n 0000015885 00000 n 0000014726 00000 n 0000014951 00000 n 0000014970 00000 n 0000015865 00000 n 0000015922 00000 n 0000017072 00000 n 0000017225 00000 n 0000017411 00000 n 0000017467 00000 n 0000017654 00000 n 0000017885 00000 n 0000018136 00000 n 0000020932 00000 n 0000021339 00000 n 0000021577 00000 n 0000029548 00000 n 0000030253 00000 n 0000030492 00000 n 0000048250 00000 n 0000048671 00000 n 0000048911 00000 n 0000057983 00000 n 0000058004 00000 n 0000058057 00000 n 0000058109 00000 n 0000058140 00000 n 0000058164 00000 n 0000058206 00000 n 0000058225 00000 n trailer << /Size 57 /Root 34 0 R /Info 1 0 R /ID [ <9c42d52f2953ede5b562e73783758a86> <9c42d52f2953ede5b562e73783758a86> ] >> startxref 58404 %%EOF PK\1A4.¸õèèbuildVersionHistory.plist local build-Jun 29 2012 PK\1AL9"ô|¶t index.xmlí½isÛHš ü}C}Åk’¸÷¸wmÉ.׎\åµT]]³±á€HPD$8(Yõëß>ÎÕYÞÏI’çÿút}³X»gêm£ØÙ.ÜìK>÷—ü‹ ˜_6g@¶dIÑ$ ½¸w·nèÄAøæ"ò½í}´bô@ûz·÷üå×¥»o.þ÷ÞŸLŒ‰"ÉÊ«‰$¿–´×²yñÿÈO×^=¡gQh°:ÉŸo.~ ÂåÅüÿ1gtÙíï|oáÄð¹·]èáÍõeè¢gW`ŸC8Ó·‡ãxýà€Õ€ãšJöT6oeùµb¿V¬ÿOsM?XÇw¶÷{çÞeÛݦ@ -o®oÜøv¯Ø´u»ßܹ!„ÿ|sWüŒŸv`=ùÈjျ§OÁƒçFM`@¸¹þ§yw¾{ím¿¹Ë[÷{ü.ø~l·x@QÛïð€ûvóá·Ï‚ Þ±û£³kœSaÕ¼ôcµ`n®ßqxÁ}èìÖO‚pãÄ…”]Æ«?…§cæn£|R  nÖÁãgp&~Ü{K7j¹õÕ¾pZðñOÛ¼˜QÇSU-ßë Šá6e'ïýÖM—Ý>Ù&lùv ¶ÝÈ(97ÝgÚë—›b|ÃÚ|YšY39…Xlþ-]Ê_ö1ÀnØcu˜`ÐÛäÍÏÝðâõ¦O)²fj–jh&û’4@-\¤Ÿܶ¨Œ~)é°P“_#€#îxvÅiõ`Èy‡·kiëxþÛ8vkHå£[È ¶°ÄÑmUi¼¾\Òä¾sBÞ»$3ïR=¨œŽ^ §ô’r³–î×ËU"L錦 °Fðñi·v·¨Y}ªƒts}íDñ§`é­9á·ýn€³È„ÇâD]g WŸ ѰþOÛeÑ;aèðm× ~1.ƒ³¡ªp6Ô,Ά†ÆÙÐâŒÍ;Yæ¬ðNGÖªó™çÛ4çÙRÔàö—Ëëa®J¤ôèAäÞûüÒ€¤ïÞ˧~Ð+ðÝ„Lí•ë»1–ùú\ó:PXŒ½u7;Ù·Q䯽âHhÂ?ƒ-s#^¦Ÿ‡¯xsÙå_V·ÞÆnœ‡æ§0(A¤›køìÿì½Å·ë øö9t<÷±ëJ6Âz{{ók3›`A6a.¡ÿÔìÊ–ûy­N h€9] µz½qc0…ú{±ï¢¿(_Ã"}sŸƒp5õ(´sðÜØ‡l¶6Piê’5›çÖÎߦ1š5Tî35}ô–ñ„§“gk×»_Ço.L›xÁ¥„Ç =Ú8á½· ';@”™OÑkß]Å>ʹߦ¡Øª­é*zyÄq°ÐH®Ù¶m{%+²d#¬þ:Äßft^#ú ˆ$"@¯W‚Öj¥5&ùŒÑÏŸo~ =°:hûÛ1`Õ®?ßÜ€5‹ÿÁYÄAÈu±V9¸Rçyi´óÒŽá-ÄŠ¶é. âBŒ’Y&?ánAÝð›‹w¾³ý6º§‹äÄ<Öqíº1ÍOWo.n>ÜÜdO§Ù.ÙãÐAZ1ô .wP‰É[´þ¤¬o.²–SÔtª'‡$¹xà ìЃ%fê{|L4Ç×͹‹ª€÷ð» xq¯ÁrÝoß\ÀÕœ2|.æÔ^ºÑ¥—¥ué•°9­»iR§nF§‘íN+¢(–DÑ;-‰buZUê´$ªÚ¼$óìhÎÉCºòÂ(¾ vÞ“cüU°·„…¥Éž~ 6Î6…]è‚ñ7°sðx „Ÿ<$äëp´P2sñ3Âj±¢KÕ_½I?WiüÍ×á~žÐ2w÷›¯¼Ù¼ˆ¾ì}÷7H,’o‚¯ßìœø¥á/«à¹ð‹h@´½]œ1J·Á=øv¶tpAás̯ã‡æ¥žº?ÍæøñÔ´÷ýd†”·ÙànÀJ~sË=h¯×Þ ω£ý° \¬‹Ì÷úÆû#ÓÂÙy1ؾ?H œ'r6ˆ¶‘Ðnf›ìï×¥ V!YO¤ôþyøËtKîÉá%¨KTy‡Îâ[¶—1Øþ›µÎ^òIhj|»ŠÓ­Ê q" Kð.toïÜUº¥SñÁó}æ²g/³ypÑÇI˜¾Åè@”á_$sD ñôà…ÛlŽp÷òù/à_“ï‘—Ðix}–€×]¸ÓðþnŠ^Oá+LÌs.á>ûë.ûËDŸ¸Ýùg–€"^:»ÒÚ¼§À óã½N”QÉOt¬Én;‘‹.ÄÚ[Åùf½»wÎÏvY^ÊÛ|÷¨gƒözø~ðUýùM¡l³Ù¼Â Ì+ F¶·%vãç`ë’Ìl’ð ?Áà6`ÃkçÎõoFi•irðË©ߢmÅ<ñ*Ùý-üä\´ëÛnž/ùœ¾!Ù£Ý+€Ã®Ù¨{Üæ‰F±3ñþùIî#~x=…·áÍEî)ÓÐôç uKw/{ž(NK’O.ÚõjÇÚ*rKàC¨D|›Tƒ³¡©p6”%‹·%E¹ÏhiñÎG‘y'”­<--‹gÓ ûCç‚2–'‘åžãZaÂ㘠Ԍ‹ Ú9Ë%Áõ&Ú5PÏÅ•Û<¸@.o‹B*Ë'¬ $Õ3‹Ì6€ÙÞoŠ ìm÷Á>š3—1_8 e / ±¤žÌÚ%‹ GX]ÉT¹ZZ«%{{º.\¤[¨)®Ó–B[&´eB[ÖG[ÆÄÒU~¹›Ð±ŽÍ.P©p¡Û15sÌqS¬­DC¨òƒ–¦4æŽâ2b©¿Ð Mà8š@_õ°Uè¹XÇRÕsÄLÆjÞ—Výì>"jõùæÓíáì;_¿’ 7A|F|¤Ó&>Â,Ôžðr†²šf¡éÄ#¥Qa‘z®ði,îÝONÎÕˆ2 Ë•·Z¹a §/QªFHÁrù9k“}|ƒ~BgšÔßz÷%.é¿,—Ø‹ø'83èg"/©Ô©Ø;lMÓ«Vù°·˜Ò‹‘‹]°>~hÇ;Ò»¯Òi·™!Z+Þ9¢Æ¬YÒ>.Þ¶íˆÞƒ>¼‚mYã¡|;9˜ð)&÷7±Æ\kŸ ”50òx °þˆéa³¨÷®W (áú{JˆäM‘Ñ"‚‹Òa$y7:V"QP#Nš(l¬„)ɹÐç®o>t¿}N¢{ogƒÓJ“Ÿ‚~Sü®pµhÍð;6.ãG;eè¨ç4qCm Ѻ8$Ú¸¬ÔÁrc³òÐaGž)¢vÅÉ“O‹ýߟºülTTk…(~c^ôÚu¶)–oÁU}w È­ÈNUz믉åw*ZÈŠ³¡ÚÅ "¨Y,Z¤-su—?ws†Î M³UÃRMÓJfÁ×]"]Ûí f±ìÛ]]Åeá3rñ ½VƒÐK1ÅrÖiÐ…½¼L[àíT˜ÛÙUw%¹–ŒxÞ‡ðå^•¶÷Õ¨½¯cIøÕÀE%UÌwuçeä4/„%àPÛÐy„t8¬Ñh Eá]!þ!k—<”Y¹<𡂆§¡»JíËûT&nN }ê°HŽG……ƒLî2q½ônN2~\šÛ¼4ù4Ò…ü;§5œ[¦a˜Â¼;àÃ^ßÁzsA¶È×½ºŨ\g1½ –Ø·™¶ê•Pg$祑á'xT\Ó$Y¦ç<Ï*|¶³—N2fdÉ¿¶;á|GZ'OíÑ´"lf Âm©a•0Ý=–à§Åé)‰ûôØâôˆÓS:=2¿Q(¤Åñ¡(¤[2@²PG‹cD=F-DyY¨¥_È!b…íÂèèw©×…íª²ÅRVb$©q…ÅxEFj9l‘¢×!âŽGK ŠÌ‚5Û¹–»·Û¯JÏ‘=Jþ"˜ó%žF.TÒNKL× zúµ£®ð wƒ7ø{f³ÃØ%n׋zùÙsÿ õ‘òsy(AVƒ©YV©Â4R¯’ÁíÜô%@¬Ð¨£dfÙè?ÓuKÖÉÎõ"¬ww5ïHÝ ×¸áºÇY¹Ë·€z·_Xµ®üPAãkDƒG¢eGß&P …rõÉûŽG6¸ëBùãêÅFqæhXнf@壹D•tÄ.•w‰¹.¡áKV·È‰ÚVçÂþÊ í‚žú,ž²ÔÉÝf¹{(k;}Øb-\‚“ø6ôŸ‘²¿9…~…ì*ãÏ+¦÷ψߔð²})!þpið‡–štIr>pu©+hï :LRš#Ÿ—丣ÂôwP$b¿¬ß†ÒdÌ}Nð1²…ePœ˜ÂGLWèÍÍþ•¤àÁ4y”"¿^ýðƒ4ûá‡þ>Íþ$Û¥É!w>8Q¼\ìC@¸O`o–à¿Þ\‘o·.¸tÞƒ;M2 ¿.è4^ûÈÙ.£<Ȝ̔4]Á\V0÷³tOo.°™;m°\ø&¤sJ?‡áL5ï*æ¬Ä‘WNì|œO ¯Ïb‹œY¹îÌòµƒM~\LйÓb÷iÃn¶NYéÏn¸Ø`®·ß½¨ãéU˜§÷Ï?|+ýýOÉN~Õa©æ _~üpFg˜se³}̶íôÄŽ{1–Xд2´…÷ÜÁÏqz‚;ŸÝó¿uKˆ¶Jºñ ~Ï´Ej2©µƒº¼sB!LKH_¨E‚»‹ÝâR¡GÈka{ONQ˜y½â›:KoŸ1I ÔÚ™ú a=ólD¹ú‹1ð„]7Ÿ(öSâp€CHèvÄ–[χx›ã¾*h2ÙpÐkxÆdof–„þ“e[‘lŲ †Æ•:²êæFZ?ï&hn-kKG&eêü´òtÓMPXŠõfhBuˆ¤:EÑ&­×ëÉf³™DQTCüj`‚ÖïÃ0~ýäêŽ"yjD§i]@â^v°t1?Ø¢9`,þ¥Ã“ÖûE€3Ìǧ‡áAEQ_ÇHx* ’„ƪñ/¸Û”‰´éd¾´°£ÈÓ]¾³ ü$¹ù`@ƒßÜå½ûþûÎG¼ùÞH,ΣZŽ›ºðÃax€©©s8S¸Am=ÖéÛzæÂj#¬6Âjóœ¬6¤ñähœãYmø©F‘Ô—ˆ¼YMNgÑÔ`3U“‰ªzûÒ9'–˜RhUS`Ì0©Æøà’<Ývë.À9C«µb<‹È‡Z!ªç’ÒaÐdEpn½Ë'~š/çOOu¢'h} ¸“%ökVàÉŠR£Á“Ë¿PµK±ÕðráåK\=á#ßi•)S}ÐïBOFÕ“ýÎÖ“)W'¤LgëÑ¡‘i¿ÙzHèœ&'Ahã(X-GÑKµWIeêXˆß—ÎA} ¨1²ƒÎî2×Ò³Þ Uˆ·òàø`¯ì´¯ÑXq±²O üßõDOþWžéà_ ýû_ô6¹Oà›Ó2ê #%f Í‚ø+_Ãëê–i“I5ÀjŒøà ª2²…ÊH¨Œ„ÊH¨Œ„£ïáTF-èFF†ûº Œšª[nÉÁº›]üÔÞA i²F'ÁÁ²WR÷ÙÎV`×Ü`Øå$˜\ê@Л“LÔÁ„âÍØF‹bñjQØp«î,GðPçpN±¢ÌÆBh™F©·°R¶uÃéÍ› e.£}çE‡Az96iÈiž‘~ Â{¯ÆÇ‚zœ‹j¨~ß+ŒN@ç7¨|Î,Ú"t!  ]èB@A@ç'£Ó›‰©ãË µK°ËE?‰šÐÁ—•ÏU=/öœl5¿3l5¤ô#®M&d\¨2_BãR*œÇ€N¼0Yx Õ:(Öé;NF‹ËMz@öäá…Yëm4„7)Ø4Böì Ô9• „¢÷çòÐ’Øj©&h5#=—•hÁiñxÖfŽE]5Õ’mU·Çw‡Ì±¨êŠ­ÉŠ©øCS‰+§hŠªZª©)º)Y¦)óÔ­dÊKž¢a¸BÝæp ,hÃê¯d¡¿ú+¡¿ú+¡¿:œþŠ›h¹½qã›Û' ËC„$U ãhŸ†1³£¼¶yåì¾¢Bža»S$ŠÔ¶›3å4¼Í–·9ö[Æ÷¾ Cip¬Œ‹õƒ¨ ÁìLÄ%¯l‘Z¹¿qeäq ØFWi¦³ÓYÕÁbeùé)Î7B¤Óìj½VÝtXcgb2*§ËµÑGª»=0Œz¼Õ¨á³KpœEœTÆ”³’(èYv!ªúô>¹ ….ª!ŠP§*ã®PXôRa*¢Úû:çcM5Œ‰Q^X”Ó nUf4g~Ëb}Kþ[:O]ñšhY›Éz%࿾O±è)G‡b1kŽ¥¢Ö<=ŠÅ­yz‹\sô(»æé¡·y©øõ’»byõh(ß6…õ-{øoÙ¬oÃË`}Kþ[*G…ùšÒöЊöc·oªMO^Y¨ ®a!To» r%Ô+^dFÜ,›Œ“ÈüüæâO×3ü*‚ ©€ò™æÏoƒ­[åJD»´ 5çûLÁæðHÅd}Kþ[‹ËD¨Toœ²Îëhµð("Ê£w¹°uûËåä£ë,¡G#e.§búÒüdÅÜ@Õ¨•þ NY?Œ6Õù~¿uî|w‰3¢Ö«¯¶`:¦ÚŠ•`IÓY±À,­¡þõ¡üÉò‘ˆ:AÚë–âÊ‹šöˆÒd(ûin¾c©EŠ,xn£ô.YÒÐØó*óìU¤µiUѶåØKÏ¿nÙ$H-k[1Ðñ%[ÊV­Ü“Y¶–eh-VX¯·­þ;¤:×4œ(ÑM ü› wš“ÝÑÁ‚Zçüp=Ÿâ¹,'‚‘JÙ¦ô•·ˆ­N)b«W‹ØêÌ"¶²(b+ŠØŠ"¶¢ˆ­(b{´"¶úQŠØÞCT±¾‡Â÷Pø ßCQÅ6UlO°Š­4Ó%Ù6$KV"›†¤r×umE]Û—S×¶ÓM‰D¥[QéVTº•nE¥Û3¨tËDñw5ïN¤öíc&ÕpOŠRZWõqE}\Q÷y×Çmù'Šâ>ƒ¢¸òéÅÕSWVE aV aUq#QWTÅUqEUÜãTÅF)&êäžMÜ&ô!êäŠ:¹¢NîÀŠ÷g\9w"jéFϺ–®~¤Zº²&4MBÓ$4MBÓ$ü#QLWÓ•Í}Ùåu‡á„^pw˜a¿È¼ýÜëEQ^Q”WåN„ϽL¯~¤2½ºý…è/D!ú Ñ?ez}žezO.0Sî…{O¬po?=„(åûl#ÓŽ\ÜwÀ¨EQîW”ûå~«ÌÒ,Y’ÝRLÓ²UÉ$.˜ î”jꆩ*¶&¦öl‹ûƒhÆ.÷«§Ü¯!ô`B&ô`B&ô`‘(÷ûlÊýž¢ O€ǯ>û’À¤¯±HpS$Õ  έO” æ/\•“¢û»ŒxX7&Ëo”e;ë$Ķ&á ãFÓ/ÁÆÙR¬F&Ä;ÊGÝí×_o.h²`³<Ç*šU‘óèuWZ€´ÂKuµGÕ™¤SÊi€èÒekQ±ƒ8Ê/HΙ2a©®S§U)Á¨ˆ™''VλK‰ 7‚º eœUæh%’q´Yv\ºÞÂTn,H¼Ì’Y5)E(ÂfëÚa¥Óú‚\è¡(g[2UÍ2Ô Zípßu–p§/æT(ºÑ¥—¥ué%ãðøÖÝ4©S7ÃêÔÍî´"ŠÒiI’²Ñ­»Y–D•:-‰ª6/ ­ Ÿjâ×÷§eõ:€‹f¥Úðé}má9o?b=¡&¿½o°‚\b0ZI–€vÂ,Ù)ù t“þ L£kÒ;6ré‹kç `W² 'ü-YѪ€_ÖpSVÅŸŒ«,›Æy–Ûìœ%¬ïJþ´1Á.áØ¡Oÿ¾ â8ؤ¿͇?2¢—ÃÂS£ð¹U&e>\UëÍ+VÓªtgÉéLÞ åJ˜_·I_WFñßüìsí¥µ!ó²?Ÿâ#™ XM^{™7¯=qF%—kj”0IýÂÒåaUíóè4B£5)fyÂÜxDn÷ÜÔåröéÓìéiòñãëͦ°B2©n0”/Ñšý´Ù6Ï‹‡] Tê8 ‰–ñŠ$Ê«Bfn.,IDòT?·J刮ª<ÃFê&Û°lSÜŒFh©L¬‰’É´Í,x1¶%©¶X KÓUÛ¤TÐÌÆF›K#  •>¯"ùšÕâC†9+R«$º¼¼’Í6©xÁ I²$”CÏJ94?¥ÎÀÞeg¡Æ¸/Ô0'¨†Q,¡vj—³T»@´QâS®Ìã“< l“°'¬¤[° ²!ËŒ/‰†ÎSörê÷‹xÛU»eÀ;z‘ÝeÜ,›ˆn„¨ôæâOŸÿt=ÃO ©%ð åCbbbb‰¦ ã¤9ce~tƒCÛ?“Ýã6O4ì\üKÓÕJù«é#M¦pž‰ªh.  è/ :ë:–î^öKŽå ÉUö‡a”±8bŒ£¡®q64Ά6÷d$ÞÙÈ ïtdM£Jþ´]#w>„F-îãß eƻĚ:ã]d]™é¼kb(3cð]¶”™iƒÿx…2“¹÷PRf¶Á³…c}RYf~Ld$^x‹)Š<§!éDbà›÷7;>¸À:o‹*H<–ONxïm£y[C"–Œ>„®;šó: .Oä–"gZ¤+Š»kyv‘ž÷ó #ÒªSüWYcÛ¤ûýúul]ªò÷˜ÊÞ £+xIp“²W–„¶÷¹i{ Š×L'{–zذÂ{¿)Rˆœ¼í>س?Qðy€ct‘M¿D#þïÏ`ÿ$I»„<ÀIV‘:m$ÈâOü ࢆîL m!ðwÔÍjm6.æÝ:*µg¾}]ùB©“·u|KÕZÁ¬TlTÄw êUFvÃU²¨/•f(¾ï\±[æNÀ9ñn!Jü ‘k0ÌÒÉ\4 ØæYÂæ#3Cy”9Ù®ðK”ˆÿ‡@ã"Ê\!µlÍ)‘ìOk:U"ƒ+jö¹Â”60'ä-g1ULª>û—Ða¦TQ`áhlN+Æ*Ît`°I†ä—Ú¹ZVzV…’èS`¾J,]üà¶Ý1³’Ô§iá_”ou£¿+‡Gi9*7¼‚'ÒËq|Ož³îŠ!Y$®;VÊŽ•Ž{‘'i'¾=§ %ŠÞ>!‰Ëx¸# m}ùþÈðæÃå%ć·^ì"+“¢¾,ƽ- #T®#/xãÑyã2º…Wžç?Cîu~ºLh’O:R}Hå…éON :#˜@ø'ð»än¤’‡!s÷ªC±^š å‰Pb°‚xÄîz7Êöob¤oáKtÃÊrôwS’tÎÊ…¶…êd$ÕIeèQ.'£a9ŽF¥h„ɼ’h¶¹ë´é´à\g:§[ËÆÙ”©‰„…Ч j¨Ç)G§ˆ4Ü" ·HÃ-Òp‹4܇ðì¢-~tÂ'\2Â͇-îw;”¦ ¦G(„,.b ÁñwkçXC mîó€~2VàoÇ\¿ðû¬%8ühwAlC«1ˆF]@ŒgÀ¨sGìɲ5ãbT þ¶†D %QQùgk­a‹Q¶™9³[1Èê͇ˆdl“zG#peŸ•EöY¾ì³ú3Ì>Û*õ È¼zš™WŸYzÕê™ÙTq6Õ'Lµ ÅÔtY2ER4=åÏpÙWSÒ-KÑTI2 ݶe"aªe ÿLÍU[W í¹&L-Úuäc¹™Â…L¸ 2áB&\È^¼3r.@ÕÏKƒN£Xœp.ιàå8xúh¬Ùqœ šÒvØuI;TÙ²DÞŽNy;xENûÅÞC:žynyqDÊ‘Dš®ÿà¬JÓw€0±dóƒ-¹X+¾T!íö«ÒóÄ" ¹÷îvy!H•„"N„Ô õ˜©ÑÑŒ©¢5H /,‰@„"$!¼` D}ÆHZQ D ÓÇ›àÁs«²D¹­J‚‚ûâdžq…‡ÈxúÃoÀS¡WìXäò%B¯Á=¼óÝ%á™´ôBœæùÍÅ]¯q}·8vk¸ž¸WóEËì.)p“ȆVݰAi—a•¤lÜníLÁ½qÙó—Pçš,=u–Q~ñŸ¤ZN}üûæ³ðz¤îÒ%‚‰ìc<ùðó¨Ï¾øq šV4Æí0:13,×€ßH}Â0\w³R'Ù0»_èWÆu ΋³]y>hUÄâ±ÏöA,¿ZQhbö †íòS°Lí"½œAé—¨pc:Þ¡‰Ây‹oº¢¨ßþÖ‘K½ÙÇðÎL‘_/e+È%ä]:=²å¾ýîE‡J¨*BŸ!ôBŸ!ô/PŸÁãcª$$¢Xg¹ÆÖ½(%¼FíxŠl¤f, ­¾E„j½»È?PÚ$UÆÈä8œ A R@ÂJ ¸ä‡ŒÍ(õ†‚ 5x™b´®‹Ñ¢éá,àÀ—Áü´V“å‰Ã'êi¯[=âÊ‹šöˆÒä@ô2¹H÷.FËì… µy‘jŸ2ÍR‡CÐ_&…aˆžLÍ¢èEž¡1¡§_mõ²&».ë3ݶmS×-ÝVM¬Ðfj€´DûŒU£==£7€MÎÏ©`<:2) ¯eÞo êÀ‹ê˜–±¹ë aÄÀT¹¦ŒúíæÃíû0 Âßt¥‹Xó§+ŠpÚI,eŽ*|E{åaµ{I0kÒK_ïÞÒù1tÀ±gh¥©&•šeÌ,+Ô$ÒÑ#X3»ŒÎd5‰8cžÔƒøKnÆ_¥ÛE‘§¹ùv®¸èûПÊ\ñÐÊK‰‡¦Zñˆxg¥.‚®è.%Ì“ìÛÏD\ë3Šk¥-B¡SÃBŒæjØ’l’mX¶)+º¢a®&zeIŠdZŠfJ&æjØ–¤ÚŠª–¦«¶i?Ç0Wž1 •$o¡ø˜ë¢Î)Ä®§ûÚIÄq•Ó›¢bzT 1©±†å£îöë¯7<é¸4®.O7Uئëà[˲D þ0'¶\.*QŸn%êf¥ÙÒ}ðî  ³‚€ù\ë]sD°j0‚õ6€UÕE«`¬"€UdÇ>6øpy æ{„Oõv1„·‹ðvÞ.ÂÛE$’I b¾Jj >\ðá‚|¸àÃÇ78ÝÃ5Ç­PZdEmü¡œRðGøÞ²kðGìx>D“ï)<]éÕãD`¾qƨʯJ!%£0y[t*{‡70¸‰7L¤ê7”ùŽ\ÿ´Ù!Þ¾(ñþ-W¥3lÍžÉÃxÀ´Âµì»7Ó›pk£ŸŠÚÀ#ôw‰"Ãv~WÁ?¿°¼^B‹!´B‹ñbµQFHEQæ`Ó´ì”Tí¸fúOþ÷ŒóÄhõ·«wÍ>{.Bï¨&Ïç òà…itìS®Wà@#õ*ÜÎ]@G´Ý…Fóý£Ê8¶iȺ%kŠd“ùþéïîjÞ‘„™kÜpÝöÍ]B½Sû…ÕXëÊ5Mž È Ñ²á»ÃS³ h¡\¡‚Hφî[¡A¿èv„/ÆhGyW%ÕK³G  òÑ\¢’Jb—Ê»Ä\ŒÐÕÇüµ5x  ËLÛ§¯Œn—婨M¨°… [¨°… û¬UØó–¤&ãîsŠOF“P‰3¯5‡‹Ä5›S[›ã_ÅœW€8òʉπõ‰áõ@n‘)gV¦J \ƒ@í`“_#Ót.Á´Ø}Úð›­SVú³.6˜ ê;ž^…yzÿüÃ÷·Òßÿ”àäWÝ–jÎðåÇgt†9W6ÛÇlÛNO.à¸cÉM+C[xÏü§'¸óÙ=/ü[·„h[ ¨ êñL[¤&³‘Z;ب ôñÒt¾„ôõ€j$¸»˜Ñ-.z„lŒÛ{xB4½PߌÐYzûŒÑHLé(¶QÔú=ÏF”ë¿OØ5pcðyÒa?-8¤‚„¦V ¶Üz>ÀÛ÷UA•Ɇƒ^ÃÛ0{#Í ý§¨–&[ºiˆ}¦HÉKÛ ”4v©eµän’fhšÅPËR[ÖïœÉlêÇÌàí®e‘éH©LåŸ6@.ﬡo†F!xÅ`ðòþ•µRÔBÊm`‚Ö(-ÀÓÿ‚Üáàdžß#éÔˆWÓº¤…‘ñ½ì`2SX‡lÑ®0Ôá„mìýÆ‹"ÀafÓãÓçp ¢ñg1$Õ”_pÛ)SÓy„ÒjŽ"ŒwùBÎoðÛŸäÎ…m~ ~s—÷îûï;œëæË"±Ø–zHh9nè–‡Ö9ò¬å7¾þ­&‰°aó6aóõogóá'EZ_¢Fðf5‘8ET[€Íe½Y'– ™Rh•j@)³4LršË&×4…É n·îœ3´Q+ÞÈ£ñˆlp¨â¡z.)MB,äbk’:?Í—ó§§:“ ´¾ìÉ»‘5«ÿdE©ÑÿÉeýŸ2ºþ¯nôHæ‹~6j2ÚXI·÷ dá›<_Óíb§úãŠóñ )µ7ƒcé¢úÊ#\ ·À=Pù\OÕZLÆVôË…‹n”/º…¸,ÛŠd+–mŒ}ïU66M5E¿ Uƒö;[ƒ¦\™*ž­…‡¦®aÜwë!¡³šœ ‘¡µ`_E Ö^ÿ•)|“ÏÂ{v (ÿ$ -Ä]F`™Ýô{YL"Ld½u³[³Fc…j"ÿ»žèÉÿÊ3ü+¡ÿk‚Þ&÷|sºƒCF½¿Ú— >a—éðªÚkÚdRsõGòTÅ,+³[4E¡£25@º­Íª}u<®uÈ êdÛdSï±ÎÆ Ï´v Øål°+u°èÍYQVµ†²Rœ‚Úˆ ¯¨À†[µæÁÑ“ÃÇSÄ\Q°( yfbÓ0V?¶NoÝp ¤&h™çUßyÑaÎBMª"šƒ‡…N8¯ÔX©Ç¹(kõÛø&X¼IÔø›‡Ïɦɸ)Œ›Â¸)Œ›" ípÆM~²‘1:½™˜:¾ ªt»\4ÖxÆ ¾¬|®êy±ç¤Hü¡H$¥q•h2!ãB•ùú#h‡êoá<´òÂd¹¢4Të©S§ï8+1{Äé!Ø¤Í ³Öì>„ëØ4ílïùÅB±Cp¹*HlÕU´ÿêžËÊ ´àás<ëóÊ)Ši«¦i™¦)ƒKe[Ä•ÓuC·ÅÒ U•,S6ˆ+g–¡˜à²Á~¦dê‡ÀNu+™ò›gƒŒ¾R‹k5-5çëjºA’ÄöPœŠÌ²f–·¤WEftÜ`Åöéƒr×b! VÝ­›$Àa,Þìˆõ¼ª‚¾’Bžl·“ǸÔÁ—Óoü|<>–Ç'vÆG¶ C7r¬ülõƒ¨ ¹êÀ%r±H‡ñ(äÊA$-”K½n² ´9u°Xù>zj-!²ËySÈã}t}Z?“S—§Òâô>ô§ê4o dLR‚¼½o’TÂcÕCJ¾’Ö隇€ „œFúâºT"— bú<ͧJ雵pimÈgÕôpÕÏÿJv˜uŸ¯€¦5ÊÝÛG\5B£5)Fb¾7Ñ+€Ë%ÓR4S2 |n¯ÚŠª–¦«¶I)¦6Š‚¡uP‚lÕ­Vù ´š!EÞB¥P‡V-Ô¡1 u¨¢P‡(Ô! uˆB¢PÇÑ uhG)Ô¡©¢P‡ðk~ͯYø5‹B¢PÇIêf:–{e!²iH*í³Z‰b¢˜Ç‹-æ1ÐÝ?DÁQðCü?N¹àä[Bõ§YÞcȱ?“b'N»G-ø!‹‚¢à‡(ø! ~ˆ‚Ï©à‡|:?´#üÐDNa;¶#a;?DÁQðCü?\ðcX5™(ïq6å=šÐ‡(ï!Ê{ˆò«âŸa1a ˆ(ÝñœJw0M|ð†Õ4éBÓ$4MBÓ$4MÂKùpš&QŠé\J1 Ëæ¾ÌÂKÃrÂ+³4ì°_dQ¥¡òEá%QxI^ކ/¯8“v¤âL†Põ€Põ€PˆâL‚¥>ÓâLgà) 8‰N'VÀihí…(òô‚bÞŽTj„IQöI”}eŸ*éÆg†lª¶¬j¦eé²*[dÞlY7t¼7uS×UY:HÕƒyÑ [Ò‰# ­ª—<ÃD%¡<Õ:DµŽÃá¼g_›c””l#Öïhòü?býŽáÝPDµþjˆðåÌòéc¨»¿ ¾WÍj© ¯¾!ÝÀšzådU3 ¤é#xŒÈ7ø7Íêº÷0«:NÿåÊø…¸[箨"ó¶HEÅx»ôBåÜ@¯Ñ3@%ÅÝp/¼ôÈç.)ßLÿRHŽÚlœðr8ÄçµãB>ס­IhШk寭CÅ{ðF³ŒàöFÌvåù MT±¦ýR…“‚Õ³øjE±eÏÀQØ.?ËÔzÖ«Œ ýªîÃŽ¯Ù»`ù4yKÞ§²%û4|Ø›LÉ0,3š~ 6ΖjNn4hÓ¬àc6å£îöë¯74Ëw³õšU×µbÕ¦Claî¦é6ðÖíFs~s7»jÙP]±dŸœåzÞÝ}0óïE ôVxA+öY*õZo^^ºÞÂÔ´\0Š3kµÖdd Ø£[ÀíhÀ®þð)¢qLi%tà¯7ðà£ß¾ë,!yH(c¹—nté…µlm{ɫѮ›&uêftZ ué–ìkÝMï´$ŠÕiIT©Ó’¨jó’̳£Yü«ÙÛ"A%vã<šÈ$»%œ«l‚ÄëÝ`ãÆP~ÀÔ# §¬ÅÔ‡M¦÷¸Ímf³u¢Ú ƒ cž·y͉DŸ¸r®³@Opªå¬†zÆT¡{»±• ”Öðß²XßÒ‡ÿ–^¼í˜Ÿ+_õšŒ8²6“õJRœú>¶è`*-;È’Õ¶‡¦µíaI-{(rÛ‰'4­MË¢¦(¢]$r³)GCþ´)¬oÙÃËf}Ëþ[ë[êðßR³ µH­/lÛC+ÚÝžr=Ë;›]Y(WÕ0bª·]¹‚ŠL™h…›åo“qµÞ\üéz†C!üQ>Óüùm°u«ü€h—¶c¡æ|Ÿ)À©˜¬oiÃKc‰3™ìR”d¨%²SíÈT&–›£¹~1¯ÕÍ~D‚ØäÏÎf÷÷ɇ €õE­j¶ÑÔ6k´¢¤tl,™°OpW(QY¡ZUà¦êÞã+\O,¾¨[L‘,5‘ªÜƒåÚÔ’†¶¨tm§¯=i½lA½ZÔŶAL<šÜ‚õhBL.©±-)s¤ÀíkðâV¦Õ h—²jIƒl±ˆCåŽRuñn1ð^ùÖ ãÅÂÛÔ;™ÙpÚE »q¤2’oW#˜Ú{È«]?è®Á”K¾›™º«MCÐFuÂ}uW§µË©qÁkZ.“Ç­©yJìs‰ŠÑH_…_¡ðA­É;Io[#·¾¬Øìê¬ë]ÿÁ½…3}¨/ÕÀ^a£†Ž×%Ñ‹o`Ž¢I9 e2­~ƒF¢[1Tö»7H?’r³Ù¬Ã\¢˜ŠìiÁtùe1§óîlf‹$H‡æÙÚx»?&¬œ1k¦lÎæ¯æ‚]jÍ.±¬eÇå9„M¥ÚMyzón" ÉJý·›·(ùÐo:®ïöw€|¡¾?]±V1™Â8E{ÌSlnXíñi”ÇàH³&ôÀB,ôÀB|îz`z¬T¹ +Š'dŠŽÐ N†¾fG<3ÛT¨È ©O(<=:ŽJ‘êã¨ð)ÚoŠ_†äÂÛîƒ={‡ ¡Vr=YkbÍgiÛg/àŽ¡á Y¸¾_ pa­¸lìwÁòiš·Ã'ùŠÛKð&±>0†Ý;d-ùJšÌ UÁF¢î%9ôÅu}¤cŸF‹µ¿}îfrËÉ¿‘G°KJ""›þ}Äq°I!Z d´#‡5ÜM6 ˆäÙ+ZÌt~@žEÄÉ™b_£Üë(I¾!ŽHÓ”eüáÕ?H³~øáïÓìO²]êkµóUÒ’ãÉËÅ>GfîR°øõæŠ|»u«â=¸iÊ‘â÷[3×›9Ûe4\¸öq‰G’–i¬áÔY€ï9‹'ŸI6ØG.|{”n$ùÚÊñ#·tSêWÖ¿®µpé:£šj#4Z“+À%À(b\Kð(ÙÓê‘üvÀóYœ€iÍ~ÚìOáÅÃNœ•:N°Çp»ÉH‘{.÷z½žl6›IEµ3¯B¬MxBƒ1(²àù£lkF³:Fpw¶ÃË2§è/}MêqXö7„ì/d!û Ùÿ ²?)‚MpÙ?)!^¢ÄÓÑ h§Dâwæóºõb¿±ºÄ…šÁ6;w%A4ë6õêÙYßfþÏ2tU³,Y·©µèÙ_F•ã?øA^¹»xÝ4…]~ž$M™†×å“· Â[oñíÚÝÞ7Ncðx¼ ÑÀ.‘6ã¼wï—÷nÔy@‡…\ý£_B˜ºaêVŸ]ÑçZ4áò‚ GSŸu‰{”ÜÀ icŒ{ zèüÞ8™¬Ë¶^sRØàÀë+|m¯Ý{w»|í¥ÅU~€«ÿË]Äè#ßß\˜ò,`~]Ë®HR»Æy½&BO s¾O& ¢w[W¹´®z¾®ƒœIöi,®ô¿š7N³4KæÛ·•?¦\¡sz•æØü1ô–?úëZé˜È϶‹šCL 8cˆº/k ¼èNˆW£ð*BˆTN²¢”bŸ‘vÈYzû(M¾§…’fºSÜH²l+’­X¶1hRÐy6DòøPg‚–L[îûïa-(|¸îÖ…ÊDÀbÞz>{º~®hÖbL¥©âaGݺJ ƒë ÝÇ ôþ,•ã#Ü;!Ž6Þ¢óé僘óâCô4½e}o7h2³jQYT¼aUÑóÓ|9z*ÓË8d³|µrQ#ÄT?µ€›³Mï7^ynkΰ#Ï3rFX×ðËêÊ]8ËÊÙÈ=\9» Sòv{`>N6fÑëjŒh…æú›ãû¹pfJ3MÂÿé¶!i†¦‘)ãïîjÞUv¨~Ô I¾È+p±–÷Ñx Ö1æ…I!Ñ…kÎ$“Utú·Ê5ä¿ 6êòªC0½éýùzXÕ£NA60ŒÈ5†‘Ë0Œ`‹FƒeDmmáX>²ÑïÊPÄ¡Ùp`AŽCŒ#´ *&˜j‰K°÷Aø”ìsy<3UYȃ$’½8´òLµdM±Y KÕ:(Wé(Èi˨19¦„åÌÑòø7itFHtÙm±È Ù'çßXóÉ ›%/&ç…™ËíˆÏæ×v®'°éz˜š§NSÀúbrÝÈÓéfrúÜa. x'ƒÍT4;On؇gïo…YBµïûÿÞ#ÖWFäˆÆõ¹Z DÞ€5r ‰¸œ¼ƒºM>zÀ­*mÔG§¦ãFŽ™*¹Y†g9—‡Jæ‡`“ø¡&ZÉà×@)©3Õ©Sd‡U0áåZ,¤‡Äš¬JâZPÐe龇T…©„?P3øT-IS¢jzA‡ªt¨ZE…:ªÊ”g¾®yh×p:K*k‚‰4ôôww5ï*:…ƧǔËnö«•÷½Iæú™ÈÅ …¼ƒ+eU…võ8³•‘_a©û3º[ÝF¯nAØ`KØPP«*µâ]Ÿ"ak/°Hµ Ô ÃÙß®Ò-#mHËÛ“+XÂʹzLD^7rôn8k¦WXÈVÖL¬û=¦u þû ÉO[˜ûÏäˆ#Й8‘¥Ppâ:ýs¢Ì$]§Zbb~ÐEKfoѳƒ çóš1x¼fj@É$Æd×Á‚‹«W׺":séa@ÂÛ-ãSІàZPTßšž(™ `Q8¦Ý`ü€Šaí„ö¯äºMeƒ._ÕYHÖax®Ó`ˆ´Œ'$¶×NSÔè}Tˆ knç9‘àq–$ÜÌÛ„™abªvB¨àS¿Md†¼5vŠvOp2‚P]B"÷Ïm\~ÒuhFÇù ½ÑtÙ4%]Ó$]‘L¸ÿ(Ë€ìOåd00fŧ.ɶ!Y2´l’J(>ïîjÞÑÝÝ*£­8M&”ˆE:ù M °tçA>ñ€›ËÁs|¥ìÿ*s:Ûv@®Ã€tW—©®– G¢#8úh½Zƒƒ&¹†ty.¾9÷nM•RÑŽkw¥w¬‡Eo¸‰æèwhš`U¼FäKÛp¥LâÜ—×àÌn?¨Owèè|Âý{Áô™d+“ߊžr ͱz¨ä† h‰¿wûß*¬²Óm\Õ¬ê˜Éëþ(7®j½ïc;/”-yßñÈ„f‹5ëV4@o†Ù£Pùh°áZìRy—˜ëBº?ÖT3á/ŽÂmX±Ü:ýÚ(íT«Ån¢¢Š¨¨"*ªˆjªg]MuÞ’ÔdÜ}NñE{—ô·Ü«˜ó G^9±ó°>ñPqW´3ËSÅ5,ìךü%n»è¤‚‰²û´ Mh œ²ö¹\tÎ ó<ÿù‡ïo¥¿ÿ)9ÒɯºS-mRçŽ+›íc¶mg")4Ý”ÑÖŠ¶ž;øÉNÏtçÓ|^8ºn q!À AT„úAÌÓÍÕ9h' s„ykèëUMpwyBÕjSR*å@5sôTf¬',¸1ø¼@ ²Ÿ¦‡RSUɧ¶ˆ¶] znàÜ™Šji²¥›¶L¨nïî²Á;4ë ý>Ÿ“{ýŸ ÔÍZ>r]¦éO ©7ÝíçÞBÞ†ÈêÑ& ä ÆÉÿ Å ËbàÖ°.  qS;ј®£ü`‹–†±¸ž ¬eÇL Ù4‚Š  o¬b=¬êjŽ"ŒwùBÎ]ð[¤ä>…m ~s—÷îûï;œëùêë!a¯Ïºåáu€©é´ƒéˆ'£ŠQ6Ñòê ‰ÃQ>TÈ·Z“ýÌ5Íä¨Þw„å… Z¥2Í•×$§¹lònP˜e»u‘¡Õˆz„Ë5‚C­ê}ð.)3ÅF…¥èW¬¸ÔÑŽ7Ñu9‘IQ<”Ëâ¡2ºxX7ú4¯É‰JQ´‘‘°÷ycá’Aªp-ë7$S× Ž%ªô%W\ ?’]–ø|•¸•´>ráZåk]­Äq¼ôD© ñ»°¨ÖïlK¹:iM [Iƒ². âÝU)uÏ>QBYA‘>ŠüÓ^ôÉd}ˆ&ßo—…÷(ðÐpdº ‘ÏôOï'r×òVì•݈5+ü0C üßõDOþWžéà_ ýû_ô6¹sà›ÓrZ=QIcŸˆÐçtxUÅm2©za$ÉDÑÊzŒ¢IQ|è†(•1KûÉ-Ñ¢»ÙÅOíÕ•Më5:Q´ÈV¾§nµT.-T°Ë‰bNêЈôS':l6E¤ØqÛ0ô/Cφ[UÉŸ„ÿ‡ëŽp®§`HbÌÄa”¹u¥î¯‘WèPjž&h™ù¼wÙ]‡™IV¡’¢Ð¡Y‰9¯ÂJYw¨9–«"5õ; M°Òà’qxEÕ,±ð³ŠƒÜﺫ ¥yq‹šá›¹¸Ú®‚ ×ù9Iž¿3$O’¤ŠËEc4X9pJ¤á$ׯA¥*8³˼0YvIª¸âV5YËSö£cé"²—CL>³Û*3„žlê¸Ú7y-E•ÅeÉ’ØR´ËÊ ´`î=ž“yÁTUS ]1-ÍR4Õ”U*æÑUWlM6TE1!:æ©[·”=QDÃ0“C1{¸ÐqhÆŽÛ"£ÛÁ3º:òUäŽ;ùÜq]rP3Í £>HjºYD>»áóÙqÓ«"£9®sûÀâÜ«LzêæFén3 ÛYw`í¯b ÅVMœª«“û Ôÿ‹Ó‰ðT‚–CöÆaª CËq:¹ê‡Uëmß×K”KÀeÙFpAáŠN:Pþ÷á=é´¿šn²Ph\ª&Mk¯ ÏUJÒÑšÅAã7Ç÷Ûœ1‹}Æj@•ÒÌwLß bPý‚! ý‚È/¤~‘1þÅHØœH:¡Å*o~h•’Z­æ‡V™ù¡u‘Zä‡ù¡E~h‘ú@ù¡y‚üÕRF‘ôEçåtx™@E&Е ”y/DÞO‘÷Säýy?EÞÏSÎûYÍÔÁËð:Ëg÷‘>»œž§¹£fð”EO‘ÁSdð\îÁò&÷ä Ï’Ü|îENd‘YäD~q^/-²bˆ È"ò3u‘ùŽE¾ã“ÍwÜÌ‚ŠìÆÏÄkôH¹Œ{{ ‹ÌÅ"s±È\œ^'[7,C15Ó0lE¶m“ˆÜ—t[³5𿺪X–dZ*º/ª!Y†&iª¢ê¦i?»dÆ}0Ͱ©‹y¢šõ’õ\dœ|Þ¼È/)òKŽ…½^P6ÉLãH¹#›<˜;²¯‰MdŠlŸ)R-x„¾ƒ–ý÷Ë{7ê|Óêà9Wn½Øw;&9ä3¬ƒ”"ŠD‡"Ñ¡Htøb¶@ÖˆD¡öW^è¢Ì!(«î¡‡D±þ|tKà”>ióÞ¢ 7X".òGp¤wà^)b¾)MÉý@ ltåîâuçm†}\ ½üÄNE„x³BYy¾ƒïX˜_‚¦–)ø!+øç„å¥bæùƒšÜ@CQígj1Ÿ£œ~¼ÑtÙ4%]Ó$]‘-JÕˈñ­”“¹†ÄшÅ7@îš¼®F¢ÄÕAÁAIJÑÊ¡êoZ&ÏÅÇ ôþ8Ö$B;°PBwïÝí²·v˜ FÖâ1`ˆ53ð–¡«šeÉúA´ íV tH.ºY\o,‘´y¦Ú8×1ãÉ› a”‘åíÚ[|ã“!4H—"k€•Ò CÕE–¥þ“~ë. µ›.Êï ¢Á½ndã-:œ\–ˆ'<Ñ–jµrx¢>~8"[‰¦^Ì}殼ïMØôç`ë–°J»ôÓÜõ§ª¨-tòz%‡ÎÛì7Ø`Ð5»DL! ÉÅš¨j3@â®ý<ôÀKd£Îú]xD³œÔõázˆ´•L;h¢b¦² þŸ¡i²¡¦CÆ»»šwÕ8Ó†q£ëýÅ]ùøÌGHNã lô_ ŒÁ2õK÷ÐbÆ>Qìq™TËn„æøÁ‚pø ðVKºmHØV‹8 Œww5ï*®ý îŠO}1 ¸Ld@&i“•ªèúÊ-Â*¨ŸÅ¶H€ç¿ÀQcUPLZuÈÝTò©—wà>"µÒòw[ ´ºŸÀ6ÁHׇ§9ßôÉ®\&Ék/ƒ%3fc¦,¸ÔkjÒ¾Üü÷Þ ÝÞÔž Zúþ¦%¦IIei„Gj~2¹—¨(ŠˆâhŒâhÍË“HWíîÙ {ql0.{@ºFÔ/LqŸ0büeuå.œeÅ„Krlœr}í”±lE,E‡Y8{ëó[ƒ½rºÝÒó÷+éj’ª^Þõ)5Â|Â/c5¯ÝU ‡õdYépR+án*ûS4f©£‡'œa]ÓüùmâO)ÚÑÛ±Ps¾Ï `TLÖ·´á¿¥±¤™Lvé.ךür­!äÚç®å°ùOƒux8$ðF¡¿7ûعÀ.È~Ï»FíóÊXón=5¥kOC¦öÌ·ô£ë,¡šBn^Ù¾¨¾0Ûa;ýs±['‹c»è!joˆÎoªŠ)Ú¹N›N ìFÞ»`â?è®Á”KÇ-Ó$ÕHÚþ–\¼0›ê(6T–ËëG×paHÇô]à/©5h¨†×!kK-ÃRÛ.>ªÒ“4ñ¶Û¯JÏÙ†Q`:L)RŸ¡Dæ“d0iÇʼn@Â÷ɉùúOÅgðóÊ[­\Èá´³¤6B –ËÏY›ìãôsù¯×€¤CðÑ%.î¿,—ÑÓŸ²¤Ä°é*âjÓè)Ñ4Ýýʇ½- ßŒÓ{ð‚}ôñC»3@ï×¶í߃>¼3„mYS¤|;9ð)¾æ7±ÆíîM ŒUºÉm¦‹Nï|QcÖ„YŸÇ?¡O %-¢Þº\e‰þÓÛ.ÛÅò±A$o®Ùâ£E÷©ÃHònt¬D¢ Ž2/goÖrö²eÞ^ðö‚·¼½àí_oo_Mk”§"d'4Ô!NÐhMŠé 0­Ø†’éJuߦ¦5ûi³4Ê‹‡8*uœ…$=x’G5‹PèÔ°ÕdÎ9]Óa¶¾d–mÊkdn4ôÊ’É´Í”L"–a[’j+3Zš®ÚåªJÇ!Ú\†P>ÉVÝj•¿ÀOËbGDl&ˆ¸“SÂïÔ# ¯gºd0B—dIÄ. "vIÄ.‰Ø%»$b—Dì’hÿ‚b—îŸíÆ…Ð¥?ÿð]‘åïdü’$â—DüÒÙÄ/iü­*’¶¼°p&ƒÿpèBóñÜOƒÅÌNCéþ3Ö¢,z—3Ue‘RLEI8%6j‘ΑoCCCxyCààÇGUŽ'&ônúèÅkD_ÀÔý;€nU€àÏ<¯= ^—ݤ’Y%3¡j|9Ü5 u³aQ^ÓÐæžŒÄ;YáNI‰¾âV>×*3i³ä] ÑŽ³]“’G[“¤ÜuáUœ2´D—7èuíÖ9FjdlýI½!¾î]°|šT¥ r8Ò&œ )þ„æ~_Š­àŠQ«!Uý‹‰Ñé˜O÷ÁïàRßÚmŸPïŒ?¯8ïÓ\ì+.õeŸû..öy®ú’‹|Ñë½Ã<ÓE~~>îWõn1’Ò§[|Á)ÞXöQ'ÒKþêGòQï¯4ž¿°¡ˆ:·äøö×ôHØ6kÜ€m[ßýìQ»@¢;Ù|>»¶>¿FW2(ëm½±.olCxc olá-¼±…76çTBÿAó¿U&]¸ß ÂýV¸ß ÷[á~+Üo…û­h/Üo…û­p¿= ÷[.µÎM9 ƒG.Ý’)tKB·$tK#é–ÕØ€[º^¯'›ÍfE‘P&U™Ôà˜¼ <—§ì,¥amÑYJ{¶ƒú°ŽÅ S†–žWÛÕN¸Ú¼ï|KîÚM°¦÷.OBJÃÚt ”ö‡Úñ¦tÅFCºb]¤+éŠEºb‘®X¤+~!éŠõ“®˜'í¿Ôà–ˆ÷ß]fýêè©ù¼rÏEÖâsÉZ©¦*³Í"cü·åàØì“Þ{Ûˆ|4„hªäÖEL€²÷›â—!#æm÷Á>bòÅľֲ¶¥;TK(‡FUÍOG¿£ýŽÐï<[ýS k5uyZ!Ih…­ÞàU®1¼Ê-áU.`¯ráU.¼Ê…W¹ð*^墽ð*^å«ü$¼ÊÛ;eJ¹>¹žg²PáÁJFSo óÉ:>¸‡„ž˜á»žùªÓå¥iˆ?«ƒý‚5¹"ŒèsóáöºÖ½sÀ­_BoR¨}*ø”wõ±µY7,CUdE·tM³ [[Åÿ™ªdØ&hCøØÚš,›†fj’­©¶d™U3ǨA“+¼‚0]RÅM¶;P]4"@#>Û3oócìwÞöþKð¨ôú¾Qý~3lÐö#2™\"Íøwç:qÔ9â  hBŒ©²„ ¦¡e>GüÉÞÅ8ÿé.ÀÿV'ú€ž3—‘è6•« Éù‘r0ò^[*±FÂ\Ý{¤jÒX‹}¾ê¿‘·ÿ€l†Ü+Ê¥ãüH¹\Ò`¿›Î¾Ä ‡h†8„ÐÓ˜œÂC”"rú£Ìçà_¼o.B÷¢zÌñøƒG §î¢·e’X¾_z!˜¯lóÄØ·Ê‰cg±†ŠAÜ ):Ü%jBþ]•Ðû 2ØÁü‰‰Ñu·v¦ñ:t£uà/ Œ:CÚÚô¹fÝ¢7Ü A ²ÝõWEàä« ×Qm>ø‚•zíˆ^Kz$榼ÝÇÁ7òþp;SˆŒïCÔ€2Ã];^¶úŠWáThPʇ rC9…ušë>À8mò’Ž´ÜrPʃj“ÒrLÒc²Æ$5‰—Úi è ‡V¢Y/¼&ÕíðâF×Áâ[FÅðH ±Êñ¡É0­Ó¡ê *†A¤TŽŠ[ì‚ȃ½ùÞ¨É|‚ÚÈŒ×KUYXÚ Ê„g ©³ß…üi M‹.¹f˜ KNoQ^r)[p©i¹kæ@¥-j/º¥ÖÒ-ì!»¯2£´ïBËÿOÑ•í|çÉ]¶bHÕ 4Â,Ч[….ø6Øl˜Ú€‡ø0°±r¯C£Ô¹‰Å,»A[ö:ØU¬2ÐHL6Þªûox6³t“\VMè~ÀÆD/Vš`Îsže.±¢ºd>GZnkøUXZÓ8²ºj\™7,‘yCdÞ™7DV×—˜ˆcÞ÷V¥ûȾ,³ÌOÐçW°~ñdžÀÁÕ( jÌOEGÝl ÷¬™Í 9þÚÙs®Å~fñlW‹³”9¤XÏ4{Ü®¤e?§ô¥©²¦˜ši™¶¤(ÎPuÅÖdÕV-]ØÌ&Pœ {©&x/éšÔ ¸RÅÎ~ìÒ@9d(W”^÷˜Ò°¶ê1ÿÝïUÈ´ç®#ã·bÚ:ÜbU·È]Ï5]–-šºµ‚õ[MÌæ¶lª’fÛ*k×GÜ%‹w—L±KÇÛ%•w—±KÇÛ%“w— ±KÇÛ%ƒw—t±KÇÛ%…w—äSÞ¥$ÑÄbóô­²E‹ŒUÞ­+è¯oh#ÀâÃÿK÷0uÔ?èFÈïN؃ìÄéŸúÖçã Ù,i{¨ón¡&PÞ@(ol·XÀgmÑ‚’*”²aõ^žFd¦×êDzÛbÇóqX-¥æyµßH*Š"(ülí:Ë.#.õ+Ýß–Ê%åy(—:Üҵƫ‚Ÿ”säAÕ¹_dd"²/•u)¶ °AjAûíó nrS[± æùäD`Ž`|ÍgðóÊ[­\ø­vÆÓFHÁrù9k“}|ƒ~N".¾4ù)è7Åï.`3œ¸ŸÞ ¿Ë.iåƒîƒ»í4Ø‘g¨]q”o&½àSl8»‰0ng>®±J׿õ4QÏ)lË3Y¢uqÊ´xÛµzñç°ºÁ>úø¡Ýé¢wÏÏܵ»Š¿@j?5a¹á׫¬üzÛe;—b6ˆîb€y7:B"qWêkeò¶6»‘HnÔ)¹%OÌׯdô]ë”GÌô‡³©'‘ͨMW‘ž¨}z"”Èög÷¥²ý|óé–?CÑüH ‡dI$ªã jÍO=o•pêíËp(œe8äs(Ñbj|YW ߉"‚þ¢wDÂ_. ¡ÂÁbZ¦Õõó9yŠHÔ{¬Q@'¥"#3Z´"õœDµ{¦n.ú™Ì$Ÿ¨c¡½nIrˆ+/jZNJ“Që„%ÉåÖBÐÚR^¤~Ι]ZÓ 9€ÒbåýMÏÇ `Ãó3ò|˜‚ùai{J(™7r2tCî=I² ‚c~ãZêAŠýÚÒ†ú®0ËZy¬0Dµ²²Ñ¦²EËŸvô—;ßûï½ËS¦‚+/R¬¢ÛcV¤ ËÏ®bk\O%tõU(˜ç^n–zHÒB£g&¯L»Ô±ÈéC »™Åv-N´p…ê™yºŠÞ Ø›¥e)SUL1Ú)«ˆ>%ãH¥&œâz™ èú˂Λ¬¼>Ñ6—WƒÑ´8³o×4Ô5ΆÅôÜ5 mîÉH¼³‘Þé”2|¯¸3c×fZî³¢aÛ†M©’GÉ)k¤åÇ8“=pÚÔhÎÀ6¯3°%œ‡pÆâpflq¶©§UT‰Õ®®w9½ÆR L Þ¥ …èn–V´ÃZ°BÜø¡b‡»ÞÁᓲô}%½ÃÖaWºi”æ4åßD­º‰óA†Ôö4éâ4Êij»u†ØºsÝ:Slݹn%¶î\·Î[w¦[§HbëNŒé½ –Oüû'Ÿ¿«(â w ÆÓRátÂV*ƒß‹»VcFíT¶¬KAQZ,:¡Òe£Wªe%O¬¬ä8¾,šƒG©LÅR˜pÖ]­~µìu էů— ¤±ØXŠáºËç=Y_îu°œvsNqÿEYÙª ÚõÕ£!‹3Û]Š3«ÃK¸ú£Ý¥ú£2ü·”KóÚÍ¥yßùÒøÎÁÊÂÛõeáy¸œJ5ÒzY˜*ý¢* 7µNªÝ P´Ð´ÓUN}Aûê]«v5O§áh©Ñ:M´M=°…8¹çÚÞò©è=&|V…>O¥ È ¥°¹_-¬cUó=~…ËáðL;ctºo|»9|ÝXyˆÂ±CÒ¯¶„Ëì¸ÜíHÖpóˈV»iZ½ÈVï*ãî¡°ÈØÔDlôdô£n·*l‹çjVe±uãm]5Œ¾¸yåØy£¨µ.)àMf6,l¸YJ•èIÜ¢ãžKae>[”"Ü«Ïvë4±u§Á·©áÛ„ëúÙÞTáº~¶['\×Oˆå¶êYî:wº›–^{:Ó#ÆèçÓÓ”vN®)²53…wŠðNÞ)Â;å˜Þ)ÖLø¦ß”¾)Õ¬x嘬ì 53(µ75/c9bs:ZYIºþ“mÉT5ËP/hÙ[ü¤ÎÊÅœ E1g "™†b«¶¦w‚¢]zYZ—^rVe«]7MêÔͰ:u³;­ˆ¢tZ’„EhÝÍê´$ªÔiITµyIh©”ODõ-âcG”vTÎÆ!Pµ_ˆC &½0‡@M§ì8N@°¦ôºÏÂÕð] 5õ´\ GÌߤi=Žïyx2jú‹ðdÔŒgìɨ c͹ÚÙ4!G†3ƒ&Sœšú(‡p€Ð„Ÿòùg‚ԥɌ£ _Ús¥ºp7=zR#›éa ÷‘¹CøFßá!2wˆö/#sǸüžˆQ9[V]ĨœíÖ‰x“³Ý:orÊTÕ>„bTf³½©Âìq¶['Ìçºu†Hr¶['Ì6g»uÂl3âÖ žv]–˜†œíýÞ¹wÓ]ò¶÷þóÍ…»ýúëM®R"{1Xö³)©[¤ˆ>­³»²,,”ŽŽYÕ—Z¦µÐ þ¸„G‘yn—pÛœY™Rù³ð™ý\b˜GŸk_²&¢÷fŒ‹^„–ðl)ƒÐžO’}À$ i†3Š%ÜD–áI < „'Ȳ Ú‹, uYt‘eAdYYžm–Cø"œ­l/|Îvë„_ÁÙnð+8Û­~çºu¦ð+8Û­~g»u¯àèá ÓŽc ;ްã;ްã;ްãˆö"t†Oxz-¯.<½Îvë„ fL1Ëy öLA ½L¶(Ù¾’À…Z4:nÃFŸœðÞÛFÉ´–Kì¾ý:véì¡qˆ 3l“64ÍV K5Mw*!åõ]ÇÁ&mz÷kvûŒ”¾Í !ù"à< ÃÔÙ¢"a˜:Û­†©³Ý:a˜:×­³„aê`¡wöAê[¢u¶×UX´Îvë„nêl·Nè¦Îvë„nêl·N¨aÎvë„æ0ašHAj|­lðí"½õúHoÖÍŒvÎÂ}»Š“ˆªC¦N5d–ú£ŸïÜUº=à¥N#`Åj®³ÅjBÍu®[g 5× å1ë© ‹yàˆ½Õf²fƒÿ ÙÒUI1›£fi¡-â‹ þøbF* Ͻd³Ú›DwnJ6|Ž+¥cŽ+YjHru©¢l¡=[/T£g»uB5zVùÕ®DÀ:hQ¼ÙÖøë"rë-XãH_¡õÞe;i]ýˆÛáï+,)#= ì` }× iå<¶?ïîf?µ:ïÄlÝï°‰ãC¿æßÂd5Ò‡Óü5}ÑÜÁ¿x¡ß\„î=<h+?pbo{NÝ­sç»KpPÂ=šÓko V²Þ.½ì¼€µC.m˜©Œcg±ÞÀíFÝðD«é.)MT)(ݱ×ä÷–òG€S‹7ס­ 1Y¨ê"Ð/KáH¶.תÂþl üY¡{m¤¼¶'Âò 3ÃÙòÂÌpVˆ„…÷ï©›g(åggãÎOœŸlwL­©lm ö¹¢:YìóÑ`[g¤ÁV{k°kó?¬üŠ$ò?ˆrà"ùƒHþ ’?ˆrà¢ýËKã=’CÖñFí”þ²$ŸˆŒ&KÂŽy¾Bš0džO¹"»]¹¢?›â§3Ž&êˆ:¢NÁ™Õ)%Cv¾d]¬Ofï2î¾å'Ãß £åù"¼s¾{'ŒŸg»w²0~žïÞ‰ŠÓˆÖáÛ)ËB}y¾WU¨/Ïwï„~á|÷NèÎwï„ûøùîPÅ¢>TƒåÌ: _*T7ç{O…êæ4DH%üð¡!FCŒÙ¼E0Çð£3kFW W™ŸJà‰¬½ÙÙ"=EèÍN)3·}.EÚ³ó½°B{v¾{'´g#î]º;œ›GÝ®[˜”#-’ÀÜ«+ âC€9¼C‡€Øç¶;P+±ý¹Ò9ÝNæ­ÇŸ·þˆ\bÞË'ž¹6¤žðóòxš¿Pn{ãB;Ðt˜åO¼~¢j‹0:íç,ʾ—®ïW.ÀSæúg]¦kí™€Ë /¿ÙöóÔÁ®^¾ãØâ굉çPÌ^ç ÃV½ÖY«®3fyŒ}OšYýxàâ(@56cš—´Ži‹.±Ö£à'8M+cÑV¦5h(Ðs’I˜ß 3> õ@ƒ"‚5v2Ûw¢~hžSh¤ÏW^é ô¢¾-…{1 ݕ© Ì4j. L”Õ* áDYT¡S>[´¥ òùîP ŸïÞ ÕðÙ$ïbVG=dò®n1èzŸZ­¤ªÃø’«B+¾(Oø´Æg‡’}½¬“HŸf|Îøå¥{ Ñ×&Ë,±s–Ko{Ïtr!†vˆc&ÜoÏE÷ÛóÝ;¡¼<ß½ÊËí]“¡á å6`æ"±ßç"}*g”:Z»ø¡9”@;Â¥ªÔ³%€šP¥ž@ÜWs¾¦†` uíùÞm¡3<ß½:ÃLR¯)N\®H¼¬÷« áùâ¡ <ß½ ÂóÝ;¡ < :¬éd$)›q;Å”^¯˜R›càOD5£ }çÙ¢]¨ÕNHWÝ€X¢¶“z °Ç UqLt;L"…cæ`È"Õ&Ÿµt»|oëN×®w¿Ž¡yã‚gƒ—OSRisóð·§ýV<ö”‹DŽKwE%cÝx¾°ò|¿ÇY³³ ggA.ž…9ùÚ¨/¡¶‰‚d¹nºÀŒT9Ùâš }ïù2 Bß{¾{'ô½'"gf1¾Î6Øâ.È)Àÿ^».fæÀ2-¦îöPf8_ÿõ2tajŽýÚ8Ì©4½ƒý=‰Àg<3k7·@^‹‘¼Š’¬ðÍιwÁ'ŒñÂ%OÁ¸„Ë瘀`Ò¤üžH€>'úû@x ]8ÖíÏìÎY|£¾›Ó¦…—æ?/-Ðê5NdAþ ^8à$Àúýƒ»ÅAÖ?Á«æ­¼ôìÆîwèÚ†]…oÞvùæƒ"VíXuEnnò—é‰E!ã„å$Á޳L=GòŽóÒÈð<*ê\K{? –Ë)9‰Úi„’Ühj 1{oA¯g0°@©Çóq–Äg€MÎwë‘¿Ð]óg8[âR€}Ö·š˜ì/Ëåó™ê¼„¹qJòï†kŒµ€wpk¨9‰šV¤Fíœm©e9ªtñÀ%EOÛxíF^4YÛ8ô£Ø)Òuá&ÓÉg85ÌäÜ»y¼ûëÇß»ŒÏÿ1Ï^#Ú^z‹É4PÂípî^f®mGì ¹+òv¥ˆ0pÂsF|S…Üݳžk ‰÷Î{g‰>[;/Ñ:ú ¤Þ(²ôõV ߉¢7ùÇRCÞ´š&òmönš˜Ó^Þv ÷n°qãð -š÷‡]‹o.„î]ÜgëÄûÐñaFoô…Ç7š¥Î4I’M“5ÉPûÔ;¤ù£vÍwAäÁ«‚^|Ï Oð¯d·Ò¡–DßB2-Š|O$̔˂oÞ{,]??Ê¿ná¿Ë êŒVÝkòVUlëÃå¥u¥éÚ¥¡½S®Ó0 C–Õ÷Ö{¬àô$MÓQª÷€“ ~åÇIëÊ*˜¿˜zÑôÁ‹¼;x˜WŽá± ©ÚÛÞOÝ-ß’|G|zº ƒ?Ü-åmò©RƒNˉ†ã-!ð`uɼÀG"â'ž5ÖK­½%À Y©ø°°>‹y“#ÝVAÇL‹Ô‚ .î®Jºlꦅ?¿ÓrÃÐ]NëÛ­¼8†Ëœ´2¬™*KºfX¦ž .×wÑ *òL…€ YRuY7úíJ°‹_ç RTžÂ± ›ÆC(ú% §)¼”àc’š†ûí$>ê‹›Þ¿t[t Eš‰¢{^#V$ ÕIŸï#JóÀä~SÕ±¦ôÌ'Õqdóš½GÀª:8tbÁ+Œã¢]:Ÿ¥éÌç!¹è‹ û{ãl÷Žïãc—’”døpHXtBïÀ¨7[¥í±U:lÿ¹mÙ²ª€å `¥ï…h?e]iƆÙuÆóÚcSÈ9±ûp‘Pq¶bÚFˆàmãm< ufB_ Ý:¦+X«4†’Wþ4.þñ9 þ Ö`‰÷k.1~ržŒ½Î'´Êv‚n´_Äó¬Ï¼´(óä¤$Ó ãìi´s“ô ÙWàod¹*^Õ¬÷Êó!ìÆ¹÷¤°!ð#Ó"¾Iº'_Ç¿ð÷ ]Wõñ,‹3Ðßܧ 5ò·œÇlf#Êý(Á1¼g·Ãé9àÃ0¿>:á<úš¿š—9À⣌K.s§º–±§V›™sâ#ñðòxxÅRf²mÛ–lX¶¦«²ÒЧgv?¯ôäñ5U}/óøVÒ$íRyÿîÒ6 ð|,ýƒ‘`Ë—Ãã+T_5ŠL¾Vdòí¡™|­ŽÉ·í™Â½mÍR4ENHm…Çf´+ñت43tEÕT‚Ç·ky|YQÐMd]Ñ-Ó²YB½]YÈ0g†¦@Dá€n0¾˜¼(}ŸÐ%ÕNo-Ï'$}¦J‚½]uŽ(.¿ºÈ]E½-oh·f” k$FIæg”ZN˜öd¥YíÀÍÊUÀj°ÖÁiŸ²ÈZp‡h˜¨§Y¯@î‹mSÙ¨î~Ý0ª€Í `«ÃZè”í³*í¾ÂHû;¦j#Ý1EëŽÑ ƒÜ1Y’Fºd†=Ò%³Œ‘î˜>Ö“um¬KF;rÃ\2¥ß%³ì±$~y¬KfŒuÇu¤;fË#Ý1CéŽÉš9Ú%SG»d£Q2µß%“Õ±ôj¶1»¨uÍ4{¤k&ËÚX´l´{&vϤ±î™9-Óz^3Yéš™úH׌f爘uËlu4©l¤KfècÝ1{¤+FÛ<¾+ÖÖügbþÓóŸVkþc|[Uf6©“ ÆX ÅØÄØÄØÄØŽ>¶Žî ²ÔV‡­µf—ì±ÜÔÑtØš<»¤ò+±ûhAÛïÒh¢£>–èh'9cm’Òo“de,ÉÖFÚ%Ck—ô±6Ií¹Iª2–ÑNM #i#m“©ŽµMZÏm¢)x‡q»KŠ×­Ñî’2Ö.é}1ÞXpKk—Ì‘vI‘ÆÚ$£'ï0š—‚6š Uë.™ÖX»dö½Jcºí±vÉ‹*É£m’Õo“4{´«4¾m“ôўݗw*%Ó£YôÎŒøÐ>÷Š…Ý(µñ}îaÒÕ¾®öìØ=qÇ$æ1èèÝãùg¹ Ý(m¦Ž]>屦gámïGŸˆ¡'®£cM$v}w·¶î|å|1‚#½ JštŒæèrB}ÄÜÄÜÄÜÄÜÄÜžéÜD´á‘¢ ¡»ù¡Â •Áà U~¥Z¶¡YVTá$ +iHc‡ƒ„ª=C ßIoõ÷ú{õòRñ—o-Õ”5Ó|gÙï.ß™W/,¤P¥†ÊRmÞýàyC ©9m£]9ÞNŸ™– -î¦7ä ‘f&Œ¡5M[±³„#”¼!Ôv̼!úAó†èíó†ŒeTUG‹MPGÓ¹IÊHþœ&pBχöÛ?¢¹ÖÍz1–´ý4Óõ0Û¯ôÛ~X¡}¤ý—ÆRæšcÅ&ÑÂq†‰™ÐÔ®ûßÖÕX?r¦!ñí¢{¤Êr‡T©ßVì3›wG×K㙥¤±¬‰&?e;lf)YVÇÂæ²2Öœ•~s¶Æb`h!”ÃÌXí™?l4–M-ešÖsÊòhSÖÇš²Þ÷.5gKê:å¡MÖš=‚´tˆ4q—Á´{:h†¸Æù멚‚2%-Q4Ô üvåðYòšÏ€5Ó Å*ØÉÇ]ƒØ‹ýã,Â*ËãÅvPKG"qå_ŽšdÜöEÛµŠ¼{¤Yë:Ü…´Lüõ€)ú̶ U±qÀ®œXd¡|v!M2­ÌÅ0 ]]%ï«éä7`œ‚QˆeþÁIgõF•)ÖÚûîÆt㽋¹ú¿Ï"¯+öÇ0©À·sâ5ê ÿxsñi"«öLVTÅÔMݰTÝÖ&¦¬ÏtCSmE²l &µ›\OdMšé’¢˜ª®Ûº)©2j§Ø†dɺ†•õ¨6“uÓ¶l]’m˜-´Sg’¬hº,›rÚʘ©ºfØ’žäÕ›˜’=3%M“ Sµ˜.µ3g’eØŠ­*²ãA;€r’D‹äaê3U3MÙT,dÀH¿f(*³! @ÿh§ÌlC…O5ƒ9&Ôgº¥›dÄØµ™ˆˆ©ƒ%Bù@'†aÎl0<]—ÌläÒÌ4T ¬…fJh½ p$ª¢¨–i •AíT¾Z Fn 1'OtFÇþÎÜÁb¼pâ|^M` ûtèPfÁ˜áÈB÷¿÷n”/"œ/Xžð!¼g™X=›|q%ž\^0oázïûpD°N0j$—Yëjâ3Æu>i¥ñ]) }/ŠIl¹}A{OÝÓ ¯`O–î«Ip‡)þ(Öb ö3üW“ÈÙì|ð0‘5À Sz+(7€¯&ØFõj² {¸ŽÉcxÃÁG°Kavª&€ÄøDû»Çnº¿“Ë7ü5ú[õN€#›%•'f“¶»b÷Þ”«ÿ›ˆ?ØÀ\TˆÀR<¡¿|„§qìžð}Eë”ýD8&YXŒB÷ì~ˆŸ¼‚§¾‚}^z%rÕïx«N† 6ˆé`§|k·c\Fko‡±_²õ˜ï:€Ší!FC=Ñå…h)'`7ëôàøÞ.˜»ZAbøàÂ÷û­ ÆÂ…bþ« 1gôí†;7FÇÚ C÷!Xà°Xºû}áï#ðU¾£ðÍtfyþ ƒ'ÇŸ¦+€X^OÂ… ½<É`sÝm„ЛûÝ øÛØ,AÞÛ˯ƒˆ<#³É-DTÞ|Ü °$„“`‡o\||Xp­² ¤ ®¯›ÂGëè…-‚óÀ:6>Øß¯'›½{à–O|÷Á4 àõ‹–_dü@…`ÅîæŒþ~„#Øò¬%dð”p†`§ û2@[f{WÜ9*­w@› ã ´QŸ\|lA»`ë&Í6Î7-°ÃÞƒƒ$8>ßàÛÊGðžÂ¾ë é Ÿ”ûþìË(–îß0ɽ+~ͼÔÿ¼¶ þDóÛ1¼ù€ëAhuq9=á4 €! ŠÁ.¼B§p®rÝF+°‡î™ãGlúSB!À&;¡/8’¬“aÙtõÀª ÑÜGHÀ¼øï¨×9-ËÖõ¦Â·ÞxH–ûñî`A"€ëÐô ÓÅÔŽ  Výy‚'#t:cpH·Ñ^BŠ06\%LÎ>BÔe I5!T¶ààLKÎÛTÓxÀ!BÄ.%8FˆÉn)Ī)‚ °¦ˆN'ýs2ôt2LÞóKö{iÀ+pš\„é_Á#8q ‚¥Nˆh?úémvAc „Žé#¼ï)š£àp™ñÑÃM½}DºÐÀSÝy[L^@7²„ïÑÀï«„¨…„@ì„âà1@”ÈÍdb0èG S¬)£z77“^ µ2Ü–™²#±b‡—‹”Ž÷ûï w©z¦èp„Cÿ溻œK~…= k •¯àÍ&“Ûu¾à)v"QLÊpZÀÌ"&Kp–Q_Tל]â™E@_MÀÆm!󇕰1SÐëàÛdç;@èN4 àX ÊÇ2›¼«x)\Ä NœÇó!.Lfo`ŽqSµËFÕÖ`P^Œ|¸ù0ùëˆ!o‚Uügÿ*]ÐeÿÆËH˜.i÷ú§—"¿.é=ô GòïGXŒv³^GB !aÔî vHy±oÛàÑw—÷îäÁ |xïJ¼È_¢‚nÍ¥»qÂoÑ«”ãy•#à:=ìqøf½5ß î»³‘w¡‹ô, Jµ¾T\“êÞäÎ`5î_’KÔ¸^ª§ûÛá™\suiFR)ú ¶p›k(}çÑãÀýá†>ØâG¯€ÿà+Ðdî¡ë}.ªB»Á ,v÷ì92Y2—1K.³ä“2f©ºm±ìYÍ{Ûb{"£Í—>û®¹¹’šTM#±0ckâÝû@~s4±µäòë^$01Úå¶RVTrÁ­©6Z~^\ÉC­_É€‰Õ9-«|ìeý…DÕ”%…¸²­9s™ÛRã]„»,cM¶kB̳?Bÿéo‡__¥çú2lÁí{pÒ”p0ÊE#‘"È!ÎŒ†H/ØÈ€¤@|ç uÿ+³äÎú¿±D펹ÅïSÐÆ¸Z[V{àÔ>Sw è~©õn­óƒ ^áqï˜L+v‹;€L–¯¼ÙoI5y›ù„`ôäúÀ¨SÃ5”˜9v™IÊ—¡‹~l6Ð* 6!§7kÈ@¿EDHI“_·Põz_'²xïi¦íÛd ŽÄ›‹uï^Ïç‹d@ <žYÞÏ“QGó»§iäÌÁPæÜ« _ü£äÒ\à ÷ØÍ(™2öC¢ºâ£ŸØuì7ç¿~§9xœ‚C´òîê' ¦Bý ÌF\mÛaO¨-ôñ/àÄŽÂàöD¶ úp¹Ð‰m¢è†4‘5Ùš ¦÷{ ÁPÒÈø KŽÝáå*!îžzéÞ²“oØÅMáŠç’¤ê€6-%UÍ›/ÒUO›«¸¹,ÛŠ}oBsH§ë[Æëýæn GšûÅ—‘ÏÓcLiìEøþÊxeGÃÖ‘ + òHÆþ}°ë§;ýCwÓâr «xë·Ï7É++uð+B˜¿0/o-åQ„Ÿ¥WöÿãÿPK>\1AiH à image.pngPK>\1Aװ޲ÆÆ?thumbs/PageCapThumbV2-1.tiffPK>\1AÿrÌŽ/¼/¼?&QuickLook/Thumbnail.jpgPK>\1A§"O6é6é£âQuickLook/Preview.pdfPK>\1A4.¸õèè ÌbuildVersionHistory.plistPK>\1AL9"ô|¶t +Íindex.xmlPK‡ZJsyncevolution-1.5/src/synthesis/libsynthesis_contributor_agreement.pdf0000644000373300037200000016673112424517753030440 0ustar00nightlyallusers00000000000000%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xµ\Ë’ã¶Ýó+° U¥‘õV+YÅ.'ålǪòÂ…{dIöÌÎhlùü[ù–\ð✠hJê©T/È&‹û~Ô{÷­{ïÆò·œLÝj=uÍOî{W¹/¾ú0q¯?¸‰ûðZÞú7ï8æm{7voÛ™oÝÁíŠÆx SÔ¯7ö€ß |ûÊ_ü¯ß¹/7Åä!<}p“Õt4›®&n¹t›wî‹Íf2ˬÍÎýàÊ·7M]ùs¸> Ü«öÁ½)Ês…G¸û)Œƒl:¸×aHmÓ›A‘_ë¸ëf V®t?îyåp}÷S€d°î?nó÷õ¦GŽ'.âÉ|¶-WÓµò¤žLÁ“Ò Üæ—~@ÓÀÜ©›?óÖÂÌ–±³Ñ¸c7þ&kðÀ} Cð ywÉÖB˜žÔ™Ójw®OMÄhÀk(ÌýVW®Þ9¬èED°8•"Bcܱ©·'ˆ ]Ýø¿tHµaª®þ:P‹­ŸÛEµÂr{ötv'à ª­HòºRtd9/2ÂÜb1 Ú!PŒ¡[÷„Û·à>‰tåŸ@p/{Ô:9öq0Pž D+ WSô5Ñùêc…é3®xnâR|N`2za• °8;ªâþ€‡ÄÙ«¯Û7%È(ð€pQÖ«¸ƒÇ’&Àóù˜h*Wä^´Ò‰¯V·lx2Y›Ü鿃ŒÎÄŽ\ü0(ÔS‚›FØÀ-æÞ‡ýÓÿŽ›Ç1?L°PSs92ð‰…P¶‰q(‹#8ƒ¸ˆêȹov†H‡q@7a„iâ]pËœ<CP]DvÞá¡-«?âUu¸å|´våP° À@&ñÇ:RGÃ]ã}ìŠ|Mõc6ËèíYÉ.NÁhÒ†äKMékÒš¡bÈp¦µ#ðžŠ׿;ÇIMÍ{]aëƒ+G^¼A‹}¼p%ZµrOõI N<0¬7²IDóuU}P”™2tÿ…¥€a¸R³ªt)7(îwôóUF `Vµ«‰8 ÁjQlòèý T’¨)^\Äc¿ú²]˜)®ôÖâClc=ã}~NÄiäþµA–2<A…TòP:€ º¹,ÀÅw'×Hý„¹…V0ÝW@­Ú^Á—«‚é˜zòr"€nOê–’0/ÜdéÄ熒Ö1"lB¢šSAõÆœZ¯4%=³¹uP]W樺Œ›+J­:ƒ•®”´X™o¥‡ºúIó2‹˜]ÏN£WÆ(Ì:˜s®kÈ}hx}ň,‡Q>pUGð$É5Ô„ðÜ£ÿÀ ¬ sÄÀºÆqà™B*ŽA-|¶ßU P„Õª$Cºm œN®T%õóÁÙ[ɆñZ„]c5Ñ'ËÊ0 Ã0‹Z‡‘;Öô6Iµi8ßžž€;PÃx\±X7*(4÷U¯ÔÍcɵ$Y¢²ò¡.[”©ç³…ïóA®ëE×mHy¥ð‰ËÁ5]Eáþ…ä°¯ôQˆ£kjX|¹‰Õ°-9§“¨L NnzÕÉQÖ«TgàÕߜȒÀve|@Ä+LJ‰)‚/dKë-S¦ºQí+Ê-Ÿa=ŠÝüÏñLíÍÔâË|%¬:VgÇ «¥±ìf¡XHªÅ߆d†P$P3ˆíˆÃÀƒPÝ%`dr¥6m”ïSß´| ‚”fF'ê‰ AØ36§ì2”þŒ ¬í0Ź\Jb>Ï»öSþqOÔ]-FsÅÈ`/Å祴-r]’NŒ|ç ˆÚ#]씓hHÔHœkE4„Ë tô…¸Z°¨Ä›óðK¿aÈ’Á)â ë#<°ØÉΊUºD*ܘÂî+xéh-E–ÊÆÙÞtèçTc„Y]6œû ŒàÍv8ð±…”í÷e檋Ó&^HØڵ¥+w ÚæOà)= åºÏñ1#@ÑH‹a[e•з0D¬é:S¾£ ó¢Ëlx‡™’7(, `Þ¡¡æb&|«ºzR€jX%LêO‹Rÿ£2[M32£_‡¯w¾^ ¥¯ºª~Di Ú1³á7tM}áJù×ó«Ùd²;U|H=ÇVti…é[®W@#,<àIPïtðè7ÜPéŽ(a5 £ØßO“JjàÁ2;}Umù@ItîÍLT°Í-›šƒ?’\Ñ'RCŒÌçBzÒèl\}Ä¿ ÞWZ¾QG£Íq£êÈÕÒšàt€Øû¬À]ÉÕˆ4&É¡cåíúØ‚aª”¥#%±‘®€²ûŠ—X?…thêÓþÀ²%;8IÖ›²>ã"fãqÆE@Ø@’¾Z_Dy¦ï’„S$"eÁ5YK >äÊ(àò3 ;­ßjO“m¬¡MÕ•3s€JQþ¡á™×,®4gzAæu¥º…$W;‚ÁÄ |Ðz=}Q0=x1Zôa~•”Éä%«˜€Æ *~µ7iB\Q[èéPï&"«jsoÈú™ŒYÉÅJ2ô¥hì:<°l¼Ë†I5iŒÂˆ½J¯å¥©yë’gÓu75Ñcvj¸jf3Î2à‹ (pBúøLÌ:†òCo° •Ÿò¶rŸA™9æ¥è\IGáȾºyã×rTM¹Q޹hQô+<÷ÁÚöÏÑ#‰pÍJ톕Ú<·ãÀ˜(R ïåÐc)né• ¢òÜŸ¡\Zú2ä9fÁÒ˜©°¢ÈpãVÕSÅIG[TÀ†h­> ¬‚êþ¢3Ÿå{]Óz‰ï+ž‹ªÔ¦=yc+Æ#ÞiYIhR&É6'åÂ0L’ e!mUZ°ìš!‹ô'2ÐÜ ¦ªÝhªÄ`¯h‰–•‘2‹4Ò!’LBmáî•NIBÊÁ¾ðYÃõ(·ÚÔœ³% –µ ”÷ *Ÿ¥¹é6Éw÷kfÑ.Úçk.Ý H¦ŽAEåHØð|× #Ð0¿Zò°)rM%‹2·aC•”NÖ¾ZîYBÊéÐN\¯¶¢ÔpŽÞÜTE2­Ñ”5næµÊ:OºnM2È€¦Àö#`Wªúm¤ná˜r½eL†QP½MØ{_?©íLÎ'IEª>ºè=-fD”%)”‹üXv$¨™ÐÍl©K´ä *Ê6ì™ÿJBvÔP_¼åñÛŠ¯­#nn%)òz$âw! ô¥€¯eΖåÀ›FÍm°‚%ó¡/V•HÙÇjÌ¢ãþe~ƒþ&Îv>ËÕš 4q•#  v$åZº ¤½qÒM¤!‹@Dr¡H <©[°¦ƒe˜½dÌ ÓÚþNZ¨·{KóE¼rÖ¿·ÔÙ¢Ò-‰ ±˜ïÿ{K쀩°%Ê—loÛ¹QÓn a³cBâæ–Æø¤î„ts Q°oR›"áÏqÖª_óÕ+¼È gI+‰¶x±Lˆ Yƒ9~Ø01Á «›[jÝ’¦þ*$Ý´h«ÅbÙÕýrÞ_…ȇoi¦*p$Íèž×ü:ì·1óöÜI¦{%´É”Æ^êÿTSmôì3.%K(ë W¸æÚ§¶C¹`ueX]ø. fîÕ™-“>À“¸¦h]k†ÉñHv°N]É'%8™³i¹,ûÔX4G×7ˉQ(SŠk_øYÏFË”Å*)eÅ2n>°“?PbâÆx€< n4‚4²Ÿ ÃÝ /ï<Ï”ëÂl¡V`Ði«X¶=Œƒ‚»2Ž”ª ƒ+`ni'ÜÊíéã›Û¹Øyµ"pHvÐz,1ÝÅÎñ†m´ ¹RµÝ$¤cz5\Pb¼1 §œëúcøPÉÚN78dgëâÏÀG3 ›.WH4[±%hð`cï‘“.¬T#½sî|­&Y,¢Â3²Tˆ8Âô‹T#üƒ*º?*Lظ4€ûÞñ Ð+™X¶ µXçŽ^˜6Â| ,<â‰å²à`àšøy 3þ’ªË0îk~òdFv2¡'àDÊú¿áôw¸áù63ÜGGÈޝwX…Ú‚ą̊ÿ®¬ëÈÀຒ-hÉoþ T¸Æ7±‹H¾éH uþËýôðôcIøìHU.,%gG2Ù|Ão—@*P¥ÝçâæÔ˜„"Œ9ú/ÀÀ¿ûN*,I“îþn9ëò (/È·R8î‡â†®ot …܆ñiâx•Àû>}W·êë!ŸGP׎r§à>@ÀtfKtõIK8=+_ø‚¸©¶L¿=¼¨¯6aÛžJŠ$7P8å™ì|≤žÉoXM†aüžÞ+X«h¼œ¯ŽFgÞÖ´l†ì8®\û÷öX±¿glSWùÅ%¾Ó ¹)•(j‰hj¡'ó© ˜ÆRnX¾`—r¹ìÚŸS¸k—2åB'”_rÆDÌø<X•Ûúâ¹VÜͳWo*ÛXL±Þ–‡"?r•&£â]DL2­»¾Å¡Îü†Ò„F^9õl…Ïõ3wctó†àÛMÍn§ÿouMÚݦûœ´šü*ªôÙ3Ï•ùÔì./!\•Ç–¶b|²Ó~âAIb›6ó4HÖïàß›ÚnÚrG¸ð—W½®2/û;->$;†>a}{0Wù{ÈÓ¡öQu´?þÇi:žQgri6rh+ä~GAÙO— )¶¿£ÐÖ4˜>à)J¶Ö%»}dxØ1.P¹ô€'KEèHï'ìƒË>~ÿ(û3Ei&Ö6}V“è§t´µ\.£$äêÏ¥p5ÃË¿¸ ’Ì9ýà)Á~;uú7äÿâ3¸½%vM˜Ý/eUÆŒ—ÐNÆaÓi?~‡Ü…I5ÄÔ»ú¾»ôçy«jÛ_ø‘” ˜{—¯*h;ÄÃ5ì¹b¼aÎQÀšŒXÇ#pÀ¾Üäö¥Îuó¯T&ëåh¼”ݨÕ®t}Þ,€Õ1>ƒY`kª4˜Ä99ûVqYÑk-4ÿÛWø5ÿÛW³¥ÿ‚¬ÃUBÂ1Û \¯ä³cÕ-ÊÞçnåàÙÚ¯dO9¹çxà|,è¯å7„Ñ ¤/î‚4?ÓÔ }û?Êû?> endstream endobj 5 0 obj 4415 endobj 2 0 obj << /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792] >> endobj 6 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs2 8 0 R /Cs1 7 0 R >> /Font << /TT3.0 11 0 R /TT1.0 9 0 R /TT4.0 12 0 R /TT2.0 10 0 R >> >> endobj 13 0 obj << /Length 14 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x–wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû endstream endobj 14 0 obj 2612 endobj 8 0 obj [ /ICCBased 13 0 R ] endobj 15 0 obj << /Length 16 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >> stream x…UMlUgתŠ´U+•'þZEi´ * ®:i"×ÍRm×ÏñÖ›Ýewí6QO¹T!® „z¨Z~ÔæÒ^ЍTTÈ©H­ ª8â›õÚY‡CÖzö÷æÍÌ›ùfÆKÔ}Ñð<»KÍ;¡_˜Ìξ<{Ltß .Ò¨‡ðfàeK¥ ÆŽëHþí|î}K)–ÜÜ˾:Ï6Ý¥Ë20¡uË-æD|ÿÝXÏU·©ºú$Ö~uB}NR‡I¨/¨ÔçÕ<¤ÃêþÈÆ‡í¼®çÁ7ޅצ§×¨žŒçÜŽúÏ{ç%ÿUËüæÍß:,ÝvÜsˆ«¹ksöÜ$GÈ­ëÿ³!“|];ûåöD„bU½xüfϵ³t$Y‹¨:åµHßNßI¯âûVz-é#ýCz Ÿ[”E½ìˆÙydÇʈëx0q€ˆê¨+G¿·#Ç؅бéGœ¹‘U€ ü ËZÄT²æ‰žèÈ—sgWœs;<ïć̫|½x¯HK}úÇú/úúwú¯úªþÐÏÑ´ú¤Õ%Q÷)o)Ÿ)_)—”Ï•ë$”+ÊŠrY¹ª|¤|ݧ®(—à…u[=×ì±vfšq1ܱAÄk3o,mEp gë™Kä¶ñ†Î~nߥÔvjjyíaíqmBëÕöi´mÚ Ö€6ªíÆÉÎvߨq5y¶’=kÑlÄf³’UüúˆÒÀg=.žS‹f·E§#‚¨fàÿÓÊs…¹H½‚ÞµÔ]ê€:ÏQV݇I!ž´ÌH&ŸÉ’Èôf†3™ÃŒ}sÊDf7N‡ñ=ÒΈY1“:yÉ„sÚd{}^ø_‰{‰½4€mìd(ÏàE”s½ßš«†bPןY¼"¥sÌþ>aضˆŽáË@ú Yî'~ÿ²ÑG£÷jjëu³î7š2J¥¾&ú"jˆê endstream endobj 16 0 obj 1088 endobj 7 0 obj [ /ICCBased 15 0 R ] endobj 18 0 obj << /Length 19 0 R /Filter /FlateDecode >> stream x[ÛrÛÈ}ÇWÌ#Uµ¦ ˆ<%Ñæ!©T²+•JÅyÐ]Ú•H™–¼ñßçôå4À{]µœ!ûv¦{zfzFŸÒÏéSÊñoY”©iË´½MÿJëôþüs‘®?§"}¾Æ¯òËsÐrNâ1…Ö#­ötù ÝBø\§!$§Q²GŸÕM… ­µé«'zÉæÖ'톶ð9¡Ó:¥ôz©“˜D}X;§# æÃº* ÉJÓæ-öÐ{P ¡³9B§u„ÁI»EãSuC‹#tZ§”^¡ët„®Ó{ÎéC§#DÔVŽPš†°B¦ÍŒÑ°•0:›!$­!dQZ;'1™Bë‘Öj¯Ð9‰É8­GNCÈ£´ÂŒ« ¡6aµÀ.4zÉæÖ'í¶½21I>¬œÖ)¥×CHÄdœÞsNG:Ý?ˆÚ¥#”¦#,rdø@è½@¨„ÐÙ¡Ó:Âà¤Ý¢‚QZ9§ãuZ§”^¡ë$&3Õ{ÎéC§#DÔ6ŽPš†PÒU d/*a t6CHZCÈ£´rNÇäœÖ#­!Ô^¡s:&ç´9 !{\cT'vç4t±M¶Õvö(«#½Uáã~ì(²ÏŠc U*Q!=~ŠQV9'ðÄSu:‹båPâŒu!KNF1’W4öqô‘5€br]VÁšÉ¾­;uèaTw`¡s…u·Å7†² (î Öå¼Êó¼Ó½Â"¢â„åYa›C3ðMÚ4f?øq´áÛE#›'†…÷$,Æ;±‡†…@5âb…°È(fRX8£…Eˆñ°ò­3zXPL„Å‘“xİ÷‚²FâƒÊ°ÀÄuq“õYXX‡a¡ epê½Õ\ÐP !0—¥ìçÞ ìÄ@KA“ˆ5,ÈÈl‘ ÂtF ŠÉ2iÔÂbFâÃɰ¨Åx¶è¸È5¦›Ùbܳn«……uãS×è-,\ÐhXˆÕ­,©Œ édå´ 0FO.e4$ÄAJká2&å cóxNV¬FÂ!ð .c4ÂLƼi¼ÓBAi ˆ#í3†}ÙÙlq`¢|Ñ!%·(Ð&€Ÿ®LFnÈ#Кæ~ºï…Yýà”–ê¥ì„uÔåâ0¸¿…u‚³¥´h»au7ç™<õ|,ü£K€YFï*žé®…ó«Ãm'0îÔÝòïpüˆuZʵ•í—ZxUÊX£{ãÄŽgQÝ¢S{9Ü‚S{àö€«q!Å~Ùè ^­½ASü,gçÔÞ §Ì0Ó _7SÊqí è‡ û½-6 tu+@a?Ÿ+‹ëþí¢Ì£®VN¹ZüÛå3 ³¼\ÔM{‹“ê§Ôèõ§¥L³ w«¹«7jô¬ï׋Y‰fé>Šä77[òxù^¯ÕvoÓìP¸ÄØ(YN:ç‰Ñ;i»îÆl~ô+Íõý€õZñÞµÞ¦j}^aº«ý™_KŸ¼öu.”x§Žý~MžcÍñ}yجÙ~ïWžw,èÿ7˜Yÿ³wÚü÷^çàäšúï¼ü]§+šõ@shû]ÚÜíߢd³têBÆn-ö/d(ŒA÷D¯{—Ô7áØ«ÍÚôƒ^EÓ°ûWþîæá’zßÐ4‹oH¼e… ;ÍÂÞÅrt¨—’(:®ºÓÇþ€ÝkxÂõäN/q…Ó êßj÷þúÐÁ“RoZéC‡ªZî§#L-^mÑÔjæd³-øúñìàbQï}ʲw—žŸºLÏð"CÉ +J¨MÖã5‘‰òk"vüšˆ|wz>¸LçL¸L_Š6,’HTÒK–lQÈr'‹4~Õ6 RF+·çÆ'TÚV*/b9‡òC–,Á" ½Â)[©%™tk‡t¥¥D!·¶Re&äÇ2-ÒËÖËe#'ÿUÛ”.$8z‰½™‘»t¥réÎA~)Ÿ‰ôFL–Â%¤K;‰Kwr—®.]Û(EêÈ–•»4tÜ˲wk‡íJK‰Z<Öq7*—®ÜΑ™ô‰…C #$n«&µvLðÒjì§ìqÖMìÕª´’ý,7½ùØE¼LJÓ²Ó;µÝ3?4ìiì—ÐP^Ó(«“iÜÁ8tR…b©<ÌX&ë28ÃE£ÛàdÖœŽÑÇ¥Äà)Åà¸yv¢°Îøàt mp\È$ˆ9;­iƒsŽE Z“"%O>àŒA8RÌ‹Aè©:ðC£6ñ8E¶}.Þ-¨°çF{0âÅ©ºén»]7š’GŽ©ÉxjI`½8œ>(¸Rõ,x€eåt WÏÎû “—]žÎÁ!B–y´œ¸—ÅK =Š=üù†[‹nÖ_WeY#VaWFÙ#f'^2ŠX‘Fìˆýø¿Ï¤šSÉë¿í7¼CÒå‘ã4Ñ0YÀ¾Ë0¹dŸ;nuŽ Ö/³;äî©êÉ3B[ÙŽô”·AÛ;>zøê-ö¶‡uàm,‡ÇõÔ»U1«¬ ª]³ g×/_o¡¾x=q9fƒïpñB÷ðAÜÅ^_b˜º÷bô+NÛØÒdz×Ys5Ž'ŒúþÈ®Ÿ$›ôü?tN² s/N×qÀ«2Šå4å,¥±4>x WR+ž“ä>N‚7ÝcÙ—¯ay߬c6ßæ…&¬ÃxÄwùüñ÷rÈ,Òì…ÑÐuU͉ðÏ »óroW³ãF yd¨Âƒ*dø}/fñÜ™¯Â¶¯q¤9t©ƒãáïú‚+ŽFÝãa¼^&š¡£™I Aé]b!ô 1&hR]ï!ôö×tEú0™~“6ëôçê·õà9yu›Îä¸Ô¤ÙÈ4ÆN׿´ÃdÄ*Óš¿†á®&?(QáLxá%ˆxûpÒ͆ÑñÆ'Än(9JÃŒ¿ìÆc6ë‚•ÒnÒÛÚß¾§YçÑt™c½ë›lÖù¦[.ië¦St8ÀÄO„I[´³~ÎŒÊHXv(úÉ%‘¿{ö)uðOºxý²ÙR{7uw™³€&~º8é©]q|g»ªÁþüM³ÅϬšµX­²Ïî¥lŒÅq/¥ÎK …ØÚ˜¯0:\óÍö,é)pvOÃ!•vBÊÜáHW_ßÅw´“¿Á/höFqŽ×K« Öñ›ýMˆ¿N)Òî+ùÈ:½ŠrÞJÝ×ã¸íYä(06üîIoÞÿt»½¾}y}»|JÛG<âX™?¶¿i¥{²÷~.Òìÿ-Ù¢”òþ·O—¯_nÏ7O›íãóíëöñ:Sñ $LÙÝ[-þ®`Ù.RÃÌ×ÿô“߯µ{ŽÝËÕîó˜èß™²íŒçnz‰›m5L—÷h/äì/ào}!@Œˆá!‰ã]40/ïùëÎdØŸžûµ²ÏûO Ϭì¶?S$Áüv‰,{8Ð37R$á9Ø›~þ?Þ£ endstream endobj 19 0 obj 3493 endobj 17 0 obj << /Type /Page /Parent 3 0 R /Resources 20 0 R /Contents 18 0 R /MediaBox [0 0 612 792] /Annots 24 0 R >> endobj 20 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs5 21 0 R /Cs2 8 0 R /Cs1 7 0 R >> /Font << /TT3.0 11 0 R /TT4.0 12 0 R >> /XObject << /Im1 22 0 R >> >> endobj 24 0 obj [ 25 0 R 26 0 R ] endobj 22 0 obj << /Length 23 0 R /Type /XObject /Subtype /Image /Width 89 /Height 31 /Interpolate true /ColorSpace 27 0 R /Intent /Perceptual /SMask 28 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xå˜wLWÉDZЍ(RE,ø¢ô©OD„qí‹ «ˆ¢¬€î‚`¥*Ò»{Œ±Å5–ÄÞbïú>?ÇÜüÂïÇOð÷²ÙÉÍÍܹsΜóÓfÔÔd­Å?»}Ã@­iÓ¦~S''lNŒMŠû=qIqñ×'lJà¡Ãg£$‰KŠäë¿‘7Š–Éèî÷ëdphÞ¼9|ÊjË w){ŠKªK+öTVîÝU¾»‚~im™ø„¤hW±2¥|”W—Tì­,¬,JÍÚŠè²uû6Ø2X\UòCæ2ÙöVæ—lÉL‰KŽG©´éÅßn¹à", ´˜Äu¬žW–_çABÖÚ’‘èâê2Ða Í¿lúÙõsîä;ù—Èè5¹¥yLÈ+¯KX‡O}Ÿà–“>iÊ$3µ&ÂHÕš4mjni1eƯ™¹™¨S-ã,½9c‹§÷xC#ÃïÄjj¨cÝÃú·ù;Šr”*¥Èi ð åP\Ü\´u´¥…êt¬¬»-^\PQhŠK¨Øš°úà9`À€ÐÐЬ¬¬ŒŒŒ[[[ "¢"eP+ì#Œ/^¤¥­ÅL''§ðððôôô-[¶õêÕ‹A‹®–?h+%—T EIMÙªÈ0ýŽúð¤!ÛÒ¥Kµ²²²¸¸xÆ 'N400;:¤çd4p „ (¼rY³æÍÌÍÍáùåË—¯_¿Þ½{÷áÇt>þ\RRbllÜB½EèêPE4JjJÙwVïÛ·ï¡C‡ ‘oïß¿R½¶zlbôúhÕ¦…<* (­)Ã#444XËÎή¼¼üãÇòk‰>’³•­[·fš•µÎŽëÉ£]_Ÿ¥‰ ­Û´îÑ£Ç7·Ë—/ëèè/lÅÈÕ«W»víŠ:I©ÉòV‡jQÀ8dÈÇ‹É÷îÝ;räÈéÓ§_¾|)FNœ8¡¯¯oÐÙÄnëFlAØš?44e8øùù=þ\p®ï}àÀSSS&÷´é¹½pG~EŠEÅ/ è?°«V­Îœ9#±}ðàA÷îÝûõë÷êÕ+iðøñãêêêŽÎC¥%B @¾cÇŽ·oßf&&Ѿ}{d YYYá)‚›ÈˆÇ¬H…TJ­¢ ²0%3Uø¯Ï§OŸ$©TtØ ðgQ÷ñîªEö“hÒ¤Éüùó%ž÷ïß߸qãŠ+V­ZµyóægÏžI¿¦NJ@Û”¶Ù /ª*ÿ+‚µ¢££Åœ””>uuugÍšÅdMMM>srrÄß‘#GbW™yY`XJ¡À$Ƹ•ÍíA’–Nnn.Ú!YIÞ˜WÇûfϛ͇–8 9#RÛ³gô«ªªŠñ ßEÄ •{ùLPo¡Žû0çÉ“'ˆÊ„äädABää“Èùöí[FRSSù$Ù¡¢0bD ŠìLLF©¢¢"IÑìÍ›7Ò/^±Ò#F°¨›ç8”­oQÆKkËÇwoÙ²%Þ-1¬ÅîÝ»¥_ÄŠÿiþ‚-€ ê`ldüúõkæ\¼xÑÐÐnû÷ï$x á‹ÚùÒ¥KŒT‘Š4'T*˜"Øvàï $š„g¶»OŸ>mÚ´! `½‚ ‹-êܹ³¶¶6I°¬¬L²sçNhMLMrŠwª°F¶u̸10ÉB¬Bn‚VjÕÕÕbœ÷µk×p_ÿ_$( @Þy÷î˜sþüyù$Â8 ¬p[&=z”>Y@Å)BÁä±î®J^\SSƒ¨L²5jÖRQQ̱··îÔ©“……Eoݺ¥¥¥E¼Ý˜¶I…°Ê䩲*÷Â… BÞ¨ãê*[šæíí}ýúué—Ð%`Á¡ ïÑ®£Yˆð‰¥¨ò°À\OOOLÀ¼á¹bu¨x C ™í9:@˜˜˜($A*>E€ÂõøwîÜ!åŠ3‡-£#¬ka³˜“ ¼v2HqOZE¬•——-M>PðkíÚµ F¯A`8 $ÖÎå qLê+>§M›F^>wƒL>ۀ߾GÝúó©"Œôµí ÌUð!qóYZZ*>y「 ²äAÒ/Òˆ`Dx[€ïàAÆ&Æ–––ò‘Yò OâùôéSsKs¨p:u‚n[ÝŠjçÔ©S„ ¤BeÞ´Áƒ “]]»þvFE{ø¾; …7€; •Aš „¡¤ä“¬Í'º#$P`{xú•+W$jQW|øð¾dëcU/ÍBKCƒá23`&ãx¨ %›,_¾|ìØ±žžž$eQ™Pk >¼Y³fQñQªåáo3K¸yº±Äœ9sĵµµ@MÙI¾vvvæWaa!qƒåyœ:‡p!üôæÍ›¸°fKM©„Wì`6Þžðñ›ä'â'¶ gNÇêx¢——¼|¼êÚXy>¶áüo™< ,$— iå߀#ž0SFEIQ„’EKenØ­[7)>`ŠmÛ¶%­pô`Ù}¶ón×® ”rWȰcÇhMÍÍv–äªÈ B& Îß ###Ožu¨bbb8ב9[‰;vNå T„ù\¹.¶oߎIp§‡]Á›9Sv^û§5ÒÍ?Måÿ¾ÿJþN endstream endobj 23 0 obj 2931 endobj 28 0 obj << /Length 29 0 R /Type /XObject /Subtype /Image /Width 89 /Height 31 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 /Filter /FlateDecode >> stream xãXøŸ`!ÇRZ 4“VæÒȹ£ÆŽ†ÀhŒ†ÀhŒ†ÀhŒ†ÀÈ=4òþI¸ì endstream endobj 29 0 obj 54 endobj 30 0 obj << /Length 31 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqx endstream endobj 31 0 obj 1047 endobj 21 0 obj [ /ICCBased 30 0 R ] endobj 32 0 obj << /Length 33 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…”MHaÇÿ³±Ñ—ÅÐÁ$T& RÓõ+S¶eÕL b}wg§™Ý-E"„è˜uŒ.VD‡ˆNá¡C§:D™u‰ £E^"¶ÿ;“»cT¾03¿yžÿû|½ÃURŽcE4`ÊλÉÞ˜vztLÛüU¨F\)Ãs:‰Ÿ©•Ïõkõ-iYj”±Öû6|«v™P4*wd>,y<àã’/ä<5g$©4Ù!7¸CÉNò-òÖlˆÇCœžTµS“3—q";È-E#+c> ëvÚ´Éï¥=íSÔ°ßÈ79 Ú¸òý@Û`Ó‹ŠmÌÜv×Ulõ5ÀÎ`ñPÅö=éÏGÙõÊËjöÃ)ÑkúP*}¯6ß~^/•~Ü.•~ÞaÖñÔ2 nÑײ0å%Ôìfüäý‹ƒž|U °À9Žlú¯7?ûÛ‰j`¨‘Ël7¸òâ"çtæœi×ÌNäµf]?¢uðh…ÖgM Zʲ4ßåi®ð„[é&LYÎÙ_Ûx {xOö¹$¼î̥߬S]œ%šØÖ§´èê&7ïgÌž>r=¯÷·g8`候ï 8rʶâ<©‰ÔØãñ“dÆWT'“ó<çeLß~.u"A®¥=9™ë—š]ÜÛ>31Ä3’¬X3ñßüÆ-$eÞ}ÔÜu,ÿ›gm‘g…6ï64$Ñ‹áÀEzL*LZ¥_ÐjÂÃä_•å]½XážÏy¸[Æ?…Xs åšþNÿ¢/ë ú]ýó|m¡¾â™sϚƫk_Wf–ÕȸA2¾¬)ˆo°Úz-diâôä•õáê2ö|mÙ£Éâj|5Ô¥ejÄ8ãÉ®e÷E²Å7áç[Ëö¯éQû|öIM%ײºxf)ú|6\ kÿ³«`Ò²«ðä.> endobj 34 0 obj << /Type /Catalog /Pages 3 0 R /Version /1.4 >> endobj 26 0 obj << /Subtype /Link /A 35 0 R /Rect [147 82.99988 315.3018 88.99988] /Type /Annot /Border [ 0 0 0 ] >> endobj 35 0 obj << /URI 36 0 R /Type /Action /S /URI >> endobj 36 0 obj (http://creativecommons.org/licenses/by-sa/3.0/) endobj 25 0 obj << /Subtype /Link /A 37 0 R /Rect [147 77.99988 315.3018 82.99988] /Type /Annot /Border [ 0 0 0 ] >> endobj 37 0 obj << /URI 36 0 R /Type /Action /S /URI >> endobj 12 0 obj << /Type /Font /Subtype /TrueType /BaseFont /GZYJJR+Times-Italic /FontDescriptor 38 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 333 0 278 0 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 444 0 444 0 500 500 278 0 0 278 722 500 500 0 0 389 389 278 500 0 0 0 444 ] >> endobj 38 0 obj << /Type /FontDescriptor /FontName /GZYJJR+Times-Italic /Flags 96 /FontBBox [-296 -413 1661 1205] /ItalicAngle -7 /Ascent 750 /Descent -250 /CapHeight 667 /StemV 95 /XHeight 454 /StemH 42 /MaxWidth 1610 /FontFile2 39 0 R >> endobj 39 0 obj << /Length 40 0 R /Length1 12632 /Filter /FlateDecode >> stream x½{ x[ŵðÌÜ{uµëj±VKW²$K¶,Ë–Y^¯myÇÙ쀛ÄÁ „l`B ÁB‚¨JhJ6-E1Ê¥ÐB …>h ¼Gh ­»=H‹­wî•í@¿þýûþÿ}O×3g–3sÏœ9s–‘|åæ«‘ «ÖlDÒÇ\àäªá+Ý™ºüBLbÍÆK×gêZ!öÌ¥—_³&S·”"d{lhp`u¦Ž¾X> ™:†~äZåÖL=ë,À‹/ß°j¦ßó¡¢õ[gÞÄ~÷ë3øÅEƒ7l¹2S/z`×ÆÍƒ3ø¸虡%ƒ!år Ú…dè’#‚8xºó·ìD# ô¹âÄÛìJ]õ§X/—êt'%xâ›ï•M=ðåš6Å÷`´b_„24 8ê›z`êMLî—†Ìf–j¥P5¤hèÇäÛXªOîïŠó)²O“±ä`Ûá6rxóá=äàæƒ{Èaþp%9Ȭ$‡Ý‡»ÈA÷Á.’"cOT–òY)²g¼…7¥È(cŠÜÀ"»èSd.En K‘´)rMŠÜ@"7P¥È7(Sd€"E® O‘ØÙ@–"×`RäZtŠl@¥È5€˜­pŠ\ ¥È° ˆ1F L€Ér¡ÞDjðh#ÒàuR~‘”/’r“”sRNݨٰQS¯Ä¯¡!À~QÊWI¹QÐiþ8¤97¤yqHóÂæY<„:É)åŒ`êÔœêÔ$;5£šêNM´S“ß)NõÔXç¤Ü#å.ÁÒ®9ß®y«]óóvÍávͪvMi»Æß®Iá_úšwwjÞ©ÉÝ©ñîÔ8wBëŽê:tHñ4þê€É^ï*àŒŸGnX%:î~š¯·ác¨’ëÏÎÀ ÄKõ§P#öCûãh±E¹ˆ×?ÞUƧðŠñ®w-°|¼k€Þñ®KàËP—4dñ¸û_¯ÇÝÈ-M9æh§šðQ€­ãü¥0:1Þx _¯Àõ¨QB¯…7/…îl‘ðz Κ™F?C¡úÄ~ÍQþ?Y™ÂKÇùaÿ8ÿáâÇù_RäQAÅ¿8ǟ캓¥+E ù¹ÅÐ<Îÿ$CžâÀ‡HDç¿/¶Œó3hßv§ä€½?ƒ}WPšr_0…<Åß8Åï_ ³o‡ ¶OñW4Jï^Ÿ—a4ô® žã/á¿Áw¤ñ ÜÒ¼ÅÒ»Û*Oñ-AéÝÍ@~ŠorŸâÄ¡ã¼G ˆªËÔb™iË3µ^š­x4[$³’0,±¨…±! Ó/èx¿™÷4^Ê/á¼bìi|#bÑÞ!ÄÙ±ûرvl ;v;¶Ž[ÊŽµ²cìX!;–ÃŽ¹X“Ü çäZ¹Z®”Ëå29-'p.L©ôûB>Ýa’q"ÎÈ–ÊËAŽ–Ô^o%£HNvCºÒMn€4i¤ë mƒ´Ò0¤ÑôûOˆ£'È(¹î¨4鹎l›iÜFnž)ÝL¶Î”¶’a©‡ø ñÇÛJáôÎ$¾5)ÛÝ“ÄI|›#‰ ﵚÍÃuÖ:C­>Þœø;Y¿ÔØŸ]øXÿÛ.Œ…îèºæ' ¦Öóø'R~ä)–•åc%ÌŽE€0&!ŒIcÆ^eÇf¬ÎäþŽE=ÉGœ½É¨XH;{;’…‹Ü÷L:RÓ”˜ µ"èí™@¦n±½—è´åhí:@C•"4üâE4 é mUÍMjE´.¹¹%47¹ZB;'¢Ù\Ù”8R  ÐÏ ÍÊfú™¯ ìù:Ê eÏ ŠCš%€Y!ëí9’„#iß…îÅ™îÂLw¡Ô»ÐÌt·dº[ ûk¼ÿÿ¬ 6üw&hZ»¨ÁŒêê¬!®GXuRæmH²ÞÿÓ[f>ð ðJÀ#`*Y‚ŒÔzdG(ý¤ßBúóôòô4SŠÂÓ¤ÿʆÃõÝ™>ôÚ‡žC[Ñv(߀R(ˆòQ3xB‘éEç°€ŠàPÞ Ä>tYQ º ¿ïxlÔ«€çGMènd†öÕhÆç¢FÀ}¼—º]ƒŽ —И»u£%è89œ~£o¡×ñi*=3¢r´Ý„nK?†Â¨fA7c/Þ’žD}ð¬ºnG Óé7`],RJ4VæBxÓ¬À.,ààŽhÁ·ñ½]ð¦¥0â(œè–ôfeD¥H@õ¨õÝ×¢½èPöŸ TÄÁl.@›Ñ•ð†»ÑSh}†—mÚ—¾?=‘~1ýGÀ%ˆANÄØ°‘=@é¥è6˜7+þWô<çЯ±WázÜ…wâoáñ›¤‰ S»¨qšcøô¢làL8žTÇPÐ}1Z‰àÍ·¢ï¡Ã@ãÇè<¶b.Å |?q’<²†l ÇÉiŠÞCŸK,QB`'XàdP^‹æÁ³øv5ŠÆÐ°wû²‡À|væWh}†¾Ä f±qfoúþ¿G´ÄL¼¤üŠ QµÔúçô9¦iú¶é¿¤{Ò½éMé§aõïÁ»Ä•‹|º­ŠWÃÚ‡a·wÀÞ‰ÏðìF÷¡Cèa°ÇѳðæðîWÑè]xÿïÐï†Iô úOð“§€ 5æàÉÂÙðøq¸V »Ú…âa¼àñMø6 ñ >ŠŸÆ/'[Hé#ÛÉnòcòsò&9K~K~OþJ)('å¿D·ÐËéÇ-³’¹–a—•O}2›^6½bzxúTšMkÓùéáôöôwÒ)ØÕ?Iœ”#øË^Ø‘ìê<4ž.´>t Z…Ö Ë`o¶7ï~Þ +|=ûôC¥—au?‡]ýVöWôšBÓà`ÓÀgÈs>ŽÂŠZ`E‹ñ܃/Æ+ðJ¼áMx¾Ö¸žÛðí°Êûñãø~Œ?Áç " Q=q“Ø™²žƒõäZ²‹ÜAî"È}äù’$GÉ+À?iJEi)?ƒ§‰šGͧ¨MÔmÔƒÔ!êQê$õ:5I}IMQSt)§Ð×Òûèçèwàù£g"L³„YÍ\Æ\ÁŒ2w1‡™qæ]æ Y¹ ”ÛÍÞÀîfïf£ï Ÿ¡{à¤}õó Êújõ–ïE? §Hzý8p#©€³S >g½í“M>'ûñË Yh¸“fÐu„é@NHVên8×(ý¤IHO7€„¾égÒg(¼w]ú 3{8 'Þ'âú-­ÀóA¬¤JA~Wƒf)’N_¾-.І BùyÁ@®ßçÍñ¸y—3Ûa·Y-æ,“Ñ çtZZ¥TÈYCSà„4y›ûÝÉÜþ$ëmm ‹uï4 |¥¡?醦æ¯ã$Ýâ¸èú¦˜kþSÈ` s˜˜sW£êp»ÉëNžJxÝàA/ìò­ o¯;9)•;¥2+U4Pñx`„»É:”p'q¿»)Ù<<4ÚÔŸà‰šÃø2\€&ôæšÃ*qæ$jØ>d b4%íÞDSÒæ…2ôQþ¦ÕÉ®…=M ‡ÇÓ.HâÆUÞK’,–.43\š9É6&e0µ{m€ö¸Ý›âÐ%ý!õjïê‹{’ÔLєԇ’o"iÙvÎz¡:[jÚ;Óù!t&‰¿y`p´9)ô曆Õ~±6°j¢yO’½à¸í„‰Ý"¹"é™E z›Ä–þuî¤ÂÛà]×<·&Q÷5žq»]˜Hƒqkr.îñz’uoï@"ûˆ v_ó„MpÛ¾Þ.˜°î¨òË&ÂõázVy¬;2ð77fÚß8&BëŽãïìèžã ñ¶Á*’îUn  Ç K©³Á 4ºª˜ Ÿ^ LX›T4ör•°[IÆÏyÝ£Ÿ‚CÚïüý×[fZd~îS$vŠ›='0I<0[N†BÉü|ØsØŸAØ& ­Vj(  'Þœ;éV¡.àã@oeøîñˆ[¶'% K ’YØ“©»Ñ%Žq$DB½IÒ/ö›íÉZ"öŒÌöÌ ï÷‚4ý|”•”çÎýé8³±i¨2‰Íÿ {Pê‡;…‚ŽRtõÁà™‹{ %œpCA­\N¡QÜ×&`ýP)-€†|”Ê ÜÍÀ÷fàv¯{Ô=Ú¶zÔÝì¦ý„ŽÁÑÞ,}QÏZÈ÷x’B¯c®8ØÛ[ ó”‹óÀ@í…ÖÍÌPjŠLR¬ 69·«gaOr$áH ‰^ØT8BÇ€­ÇàôôöVÅ¥@ñöµÖšã@sE>ôWffÏ}¦èç\$Êç±ÑQǨxè3õFÛ Ì4¤ˆ"ž…邱¼‡Øàõx=@Vo^UçgV@áææs¸fŽnY ÔÖH®ûâ°ðÏp¸þŸâpÃ¥_ãp#ÐÜ r8ñ¿Ç᦯q¸ùs¸eŽn ²¨m‘8Üö?Äáö†Ãÿ‡çÍQú5wÍóDÏÿßãð‚¯p!úƒô$=CA«H<ýg¡U,ôЇà2îT©[Q$Ê$?‰£HK˜êÊ)'*…äöN¨/¡nM¿ÓÎÞŸª!úxên´\RkPü;‘  ‘ÃÿûGöÊÂ%¤°”Tp³­‘FhÁ³å^*Às2Íùif©­â°n´ |Ö$›üžÚM§·2Í2Nö”W+|Š”fåëªÕêfõDDŸKæ…¸SŒ<Í6!FÖDà^4_0RRÊØ&ŒlrB51t¯bz_Ž ¼ý¤zªz>äSÕ¨®š›‚*dÅE^½G€d”•§¾¨d*>?‘¢N|)^ÂGWá[ÀóÝŽì‚Fô½h†FªªÏB‘)¬7XâÅEFëÁÏ9§k‰bD—þsú=²œi€q¥‚V$€JÐ 8ï2œÂwZŠ"*²ŸBû±{z¡5d·q“Ü”U¤ëÃâ"܇KÀo?¿zê‹ÕLÃçßé€ la†`Ÿ¿-äЖJ[Ý£.†f,VÚT¹iô®›·ºÞåÍ<&…Ÿy"¨~W¼O ŒV CÓFwÐbµî1Ð4cdܼšöNGçÒåt3½–å¡=9žÈI÷ÜÙ¾Puˆ;ôÔíÒ†¶sÇCâR­ˆût2ô%¶Ÿ°#n‚”Ëõ"ò÷ÕAðƒTVšëeËbµ¸ŽXL2kq–ÉlÉò¬J4vé°e £—سÿ\ÂÕ˜L' ÕzéÔ 9X*£þdój½V†§™"K±2µì‹\éå™Á³Æ!!ê;Ì:àÃVA%3Êx‹ÑÂÓ‚5E6 nx.·É7ë§ËjÛ, §Ç­ÆŒ[P;=ëCçœN‹Ù¼ÒtŸ‰˜`ÅgÏôMž¶×LÙ­Üùê³RAoˆ£:{ͤÕ>uü챺I¨s kÿÌ.®1†ËcåâsX€rIütXd–'Z³P Nnh¸ê–«7.†:¿¿tàà“{MãKù? Ï ‹E1…7'å’Òûà»Ð>ÐÎ.Ä2PwµXT,5« D~rcôŒPS¢œ—àå2Fce=1w‡À^faäÅåuW\uÅηßü÷K—.eñ‹öt×ÞwûŽh9ý¸Ù«ÖØXB(/#Wb«\®™RTÞ~Ùgo¿Yv´üúµÇæ÷MŸû냈h£ª€ok¨]À·õ‚`ñ¾å%cÅV­9°Ã©Ô2Œ6àcM N•¾ò'î×@ôZü‚ÕÃÛ°M®*AD ýd„ŒÁeO®_R‡'Oo²×€rÃgú¬k¦NÂ깓}à)OöYAñÀÅ”¨ö2‚$©C"ÉȘå«2õùå¹þ¨'/|ÿdçí5¬³¹~ËÞ›Müð-j×¥‘ÒÂ{µÂ`›¾ã¥M#½MrsoÑ¢G÷}ðÑ«!HHÿ†ê€µe£<4",¼ ܳ›,¦5¦aÓ.Ó-þ»MÇé3ô‡ôÐj†ÆBžG©Ìár+˜»bÌè7sÖœv-9s_“}°$€)n$ì¢hq¼É~ ,põïvtí½ª¨WÉî’É9Ÿoo±7/ë –SôBé8[ãÉæ¢âæ{±@‘ŠLBÅXh™âË´t_ÍcµeÚcòëôúã"ëPÑ’hDcÑ’v¹^aÓj±qÁÞ/ég4yHAéI6#@RŒö þÖ‡­)+¥Èž( ý oÍgkÓúµ6Êòù™.•ø¥x¸8ä-è(fM.qƒÖÕjE+â÷£~Žø >r‡ïß_|”Ï—ñ˜D†o Us¡“,ðy;wÚŠE$uùé$w~’€_,éá‘>+(’“þ42k¯3’-J±ì³$ù’6™³Ç3,Íõfl þfee^^UUž ¿¬•1¦œ O‘]ÙQÜÙŠËU{)ºlþ¢6ÑRzP BaaÝ{ÌTy\¥S©«¼õfíÚÂÖÖbg(ŸµIéÓ{”*™Ü”‘á%À¯*¸ßö£ÝB«ÌŠý^/b7¢¡ ÌËv¨½:-¢ƒV›: L†­Í¦ ¯—7ètZ5Êjtªt¹A-Çépƒ®_·Q7¢£uº\e wÖ¯þHÄœm•@ÑÁCèBXñé.N»ý¸dc% ËŠK/E-³êvVÛŠŠ:ð•4‰u‡¯2Tt±ìô *Zkô]t,-Z´Ø—’3r »ýeô\”vrõµcÖ( 0#˜3ŒUW‹/¸óÜä¬Bh•4Ãß*0„°+™¿9 ñÕØ/³Iòt9È0;çûP2Q·ƒO³€!ÑÍ””Ün¸PM¥7Se!V°HZ†Êá‹<¡ ]·oˆÌ7Þ {jpd™lU¼²õŽ·9‡aÆ(Êflo¨.®¿÷YBeYë&ª*ËÜež§èòÎÁ—_µaÕî!ê³g^Î57?Ò{¿Ðb^2õ+ÃerµZµk®áì5ºœ,R¤æäVûËCë¾ùò¢B¯°:Þ¸¨wßò‡É‹*“*ÀQ9\”^õ½+ëß9°^xˆ ¸ê‚eÜTž·®æžÀÉÀKŸU½x3~¦JG×еìò겚–º^ÕÒš«]» wf©T劘›kh!à¶*\ã1¨6(½ª]IÔåÄYܧë‚BÀl 6¸J¢QÞàrºêôAà `sâ1³Ž‚Hék,P%œ«79)§Ï•p]âºÉE»Zœ.ÎåjPb5´ÖG†OZEë€ÀÑw¢.2V¢zN(þÖLH> h!æö !wR<¸3v¢¨o‚H¯ä¦¡­ÃæÌ^Jß“1{~¿& `1ü‡Í¬§HmÑÖÇÜOÈÈÎmÝc› Ü5Jù´RËÙÎî¢îŽœ:†Þ¡d-ÎŽÍMe5 dÝ|Ñé¡HŽRÉhfºûé‹î×{–ZK]Ó]H¡³Ö¬¶o/Wésµø×Á•Õ»{áÆeßìD9Øîg Ô‚wÙ/´6Ó­ê6M¯i©c˜¾V³Wsúà ¶w oÙ>Ô}dþÈv^÷¹Ù P)Ô„Uƒ@:n¡ie ›%,•¶ò›àp;e•úv—3rIpŒú21…¤ð7õ•gB3ÉD‚#úίu=¸ã2ƒ·ïž›w®Ñ§úËÑC?zöݛ֟óHGá²ϼFŽ>±íôÉÓß½ý—'N‰~ü¦“òR·Á7á÷ ó_ÈÃp«B3 +s8á›ú üƒAo^G¯s…9ȸLfÛ²"Äéirñ¬Î\¢`]A§RÝ‘ñ˜ç†]»]ÄÕ)Œœ{ªîËu¤Dò$Nιâ5€~ö" £'f¯…2ªá¸¼Z›Qâb„›?!Iî[KžžhåfO¾è2ˆWE%øãÕæÖŸ.‹””„y·BM«ä;+½!GøÀ!­ÞåWûlÁù u›ŠU2ÓÛC·~T WY9³Œ}çúÎë»î$ËK»í.7MyäœOä“'ý™„3[ŠÞœƒþo*oUÝì?+c²õ¦PXï UëKBkõ§Cr%×Êú,‹xÛÝfµÊA(šRÆCQB-V‹…7PVÞ1°å.­I&â6;}* Ri&Ae^0ãb¯f] 1pïJNNa1çBpiWMä\5­…íÜIˆ\”|2{ÍKvk†`®Œ^°S¢æA4[\X‡KX¯dÍÄO²e¹e„úñ·äÜà†~ŽR0JšÂ8þ ú‘£ g´G‚]»ôƪ’Âö,yÚ¡eC]›4C«’½Ó8µÒà)Í^¤ËúÆ`yάßõõ µ%ÐgÂ]fLªìÅö¨ßé/öGËœ‹eˬK+z*W;WÇîrî/× ùîPk¨Ù«¨¨ŒÇ+ËÊì†'M)$ÊœZÚÌñELñŠ]攼×D9ÊÊxƒÓ™­d³ƒ™))ªQ%šœÍAÄ5'–&ö%Ž'Î%˜D¢I™Í58;_kâlV67Ízp™Ðb»¤À£àŽN8—1"—ˆ*¾âDX2á^<_ûWô‚|ûqùq-„» œ¿Ñ•=oY.7ëðlh!^ŠÂ;idª³6ìÜ1xAƒÌºª¤ùÎû9¦Ž°2{VÕ‘¦ÚRwõÝÏ0rµN綪œvatÕ’‚ ¥ÊmfGܲÍã(…ÍyC©W„ŒÙNV2Ú©[¶ÌbcÓàuMU™rTE•Ï6΋m(*±×š×.ùpåƒÚìÖ,;\Eãô+Ó˨!ÐÃq´Y)´òl"8=ŽìhQÔ ™ƒ7dƒ«¬g9»(Êd‘›å5wXY’Â5‚Y+‡G¶³(ÊšãæJO°°ª®$NÅ!d.ª›:W÷ɈÐXm($‡ `åöSûˆ‹Çº$j(+%™ š-óÇÊÅ @`\ˈ w6Ö´.p-·¬,˜kËÍÒÊtŠâ·;¼Å Èœ^¬Ï²µ\pmq¿Ú¬çBÁ`´öªåö¬¾om^ÝôéB£AÉ0˜ªªÀ­#GG(ÚSJ¨s§úþ\1Ñ®÷¨ò?Ÿ_ÕrÙ䓜Þòd~6~ i¾úø{`¡x¿¿‘¿*“пl…/7Ä_@-~ÿ$þzo)Z¿s»°1àŠ_ß‹ÿ¿ÁiYÞÛÞÞZ¼výà–pÛ•—¯…/JЗ'²\ endstream endobj 40 0 obj 8971 endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XUSKSD+Helvetica /FontDescriptor 41 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 32 /Widths [ 278 ] >> endobj 41 0 obj << /Type /FontDescriptor /FontName /XUSKSD+Helvetica /Flags 32 /FontBBox [-951 -481 1445 1122] /ItalicAngle 0 /Ascent 770 /Descent -230 /CapHeight 717 /StemV 98 /XHeight 523 /StemH 85 /AvgWidth -441 /MaxWidth 1500 /FontFile2 42 0 R >> endobj 42 0 obj << /Length 43 0 R /Length1 5056 /Filter /FlateDecode >> stream x½X{pEþõ-/U>.7WNåÄÓ“`y¯P\(qݨœDíM„"ã˜rÀµZÙ5É`{ãÊ}.ƒ¡Í½ ±Î…¦Ç”ÎÂ=JK¹¯ßc½qeâ˼iÊ´énåZ×GJY¾á`°K]õJQùËÊd4DšŠN=ÞLe¢k—2¡I.þLÔì ÛGEl_Ü3_9Óí«-œ¾Ç`·öÕ”{ ¶Ñ;­¦`OaM¾§°^ñVççC_ö¼}‹ýzûûT{±½ÀžgwÛsíãYŽ ÇOéŽT‡Ãa7Ø㕊íë¥JÐÒÛç°9dƒ= §t‚²œ‡þ䂃ã ól^Fã Ö{4ƒkPŽÙ,Íf°C} ×!¯"qM²×qÃæh>éìnÃF[¯ì©tVfÍΜQíû¡[ÈŠ ß‹ør2—¾§®1 tõ©\1]Áátç°òƒ²{B‘ªââºÅúzº:ZýÍÒüÔ¾½§Í©G›TõHG¨º˜jjnã2Ñ»´ˆOïÐ|ê‘«ÝEáVîÑ|G¨Õ¿$p¤ÕñÅ{¼=~-ì ö5U­]9b¬mɱÖV}ÏXU¼³µ|¬&«ÝEc­äá&>ÖJ>ÖJ>V“·É‹OÞßÞXuK7v§êo¯Sõ‚F½vÑò€®†ƒ>ƒ=§oÉ”!?Er”r¤2RˆÌwPßårp©ù‰üe všÿ+°¨ý¼ ƒ•³h€î¦}t˜lôôº¤X~Û+è(½Å&ÑU8{%2¨ž^b¦ùµÒïßM§h7¡t´é¤ñˆîds#l/ô&Úbþ†&Ótºƒž¢èu'5˜}ˆ.¦¥tzÑþE¦ G¤±æ“æGä Eès "¯™õæaÊ¢ª¢x·ÐIæß5ÛÈI@÷0=JûéiúŒÝÆŽšmfyÚ<ƒ­ê¤‰Ôˆ²‰egÄÃÒæÃæ?ÍA0Q@E5D»è·èÿ0ÊŽV?»‰u³]l·ànŽJ[å ƒß‚‡Bš‡RCkè.0ÐOÏÐè+ö¹à3ÄnñYóZó¿”Fu˜%ŸI„zPîDÙ‰9`66…Íe l»ŸífoEÂR! üRX/|".WˆÄ7¤[¤¸¼C~Ж6xÎg¾IÈE×ÓZڌ٢Óô}ÍDô5‘yX«b7 DÙ>¡ŸígýB`§…ƒì}ö!ûœd!]/ ÝÂ.¡W8%¼"¶‹»Å‡Ä÷ÅsÒlY÷ËÛ<ö¿ 6 n|Ŭ0Ϙ_âˆu+SE i…1Û.º†~…YB9ŒU{†ž¥¬ò!›HgéK°@,‹å°©lÊBvkeíìv夅åBH2… ÂD¡Qh:…¨ð¦sÅ"q¾¸\<Œò¼ø–x^M5ØòEèwû´ ªŸµô–~¥îv£êw¶ùT…T¿^ÝÓó‡|¥%¬ß :RKKøÁá¥4Þ±NsÛpÀÒ\žá×s4Ÿ_ÏÖ #&züá½aQÀïËu»ƒðÁµ8€1JKÚuà¤íé-ZËvÃKM!®…Wt1Ô…ï+³XŸ ùô ?v~gkþuÁSŽÄªuoh;Èåfˆ[á°êUt+l t¶uÇØ¤nâ™à u¨zŠV¥µÅ:B —â9ÞëðÕ©!Ïöf[FiI¿ss…³ï/S:‡Ë ·ssB~z{Âÿú—ÎÍÏ|Y·8Iã hµÀ©«ÍÖ ÀNç·ÈtŠ5OO¸‚ Ólž¹º€=#ztÙSÖ£Ã0Ú| p¡_<%;ÇzU‘ŠeÌÄJ!?CScçð´ig?é ylžŒsă|¡“{Egáa½‡?,=˜u›SkãëÛc­)lÍé¿À›SÃ1ëãðo¸u5Þ&Kê JialgÐ`æVƒ|®~¼£Š«n@¸„oµvƇQZG‘ÚU%j5F®æ{E©±Ú–˜Z­¶a3IK"‰ËÀ`c<ÑŒè æ&ÕH08ý”ñ~Ðé± zèêÒr•}‹¤)%x˜Šy E=êËÕ½¾ VÛw ! `çƒÈ*O"âMíÎ!ÌS¹¼ñ«½àÝ%Š.‚±ï³1 ¹õX,7Æo Û`t±Ã;ä0ˆ§pÊ m@[Ík­[sVsz ¶ôðŽÂ;û¥ž–Ä–?ÚiÃÓ/Ã3FÃðÌQ1\‘D:‚áYÀ\ÁþùÇðì W^šao7@ÎZ¯ÅpÕebxîhöŠa醫ÙÏž÷ã1\3‚áÚK3ãW:¾,Ò!Õ¤‡ð¾ÍÿeðNÒi|»‰ø¨2ñ¿Œ£ OTG†At•ÛÐÅ÷ ’P ºý=:ŽDËŠ£rJùÕ™îÌ|Ô*i§ñÍßå§¾žkH ÎãÖeFðÍò}‹V€áë+Ú†ÿ£(°´±®ÑW\YÝéno#'åɈÓDsè⎤Î0W\ÿ»bÆ endstream endobj 43 0 obj 2706 endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /DJDPIO+Times-Bold /FontDescriptor 44 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 0 444 0 500 556 278 0 0 278 833 556 500 0 0 444 389 333 556 0 0 0 500 ] >> endobj 44 0 obj << /Type /FontDescriptor /FontName /DJDPIO+Times-Bold /Flags 32 /FontBBox [-228 -407 1778 1295] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 693 /StemV 165 /XHeight 474 /StemH 46 /MaxWidth 1803 /FontFile2 45 0 R >> endobj 45 0 obj << /Length 46 0 R /Length1 11360 /Filter /FlateDecode >> stream xÍz xSU¶èÞç$9ùiÒ¤ùmÒæ$9ÍO“¦i“&¥mÚžþ7üÉ?Mm¥¥ËŸPÀ*Œ2¨ Rp.ãUt”«2\B¨˜¢£Ì ˆŒ8ƒ#ê<Ÿ:¼¸ê³£×‹Œ£4ykŸT@ßÜûÍû¾ûÝw³»÷Ú?kï½ÖÚk¯½ö>]»úÖ~”ƒ6"ñ}+zW!ág¼À龡µ¶lYQ†Ø±xÕÍ+²eõ„$ŸÜ¼|ÝâlÙtBÚÛú{eËè ÀÈTd˸`ÑÀе·gËF`ûò•}í&¹VôÞ>1?zʶ[zWô„_I’¢U+׬ŠÈw `ûªÕýø¸!Ù[Ù¶ëR ù<´IÐf$ERChAˆùpEC~zÕ§y r£_bT(?±é”_ÝñA8]zå%U¼ peßâ(AiÀQ-O—¦KU5W[„~ä¥P/…Ê!º}Ïí”ìd(}ŠÚ–lcu)j€6Em—¢î IQ[¨SÔ½rSÔfªµ €2EÝ 'EÝ @‘¢î OQÈRÔHSÔLŠº€$EÝ@œ¢~@”¢Ö SÔ:TŠºΖ”x}ûÇþ] Û¼ØV‰wÆñÎ"¼£!@õWjHÕÔBÝcT”3Ô"H?Ò3Æï¨~¨y™ê…ô f1wø+©ÅPäo n†QX›¥nNb)ß  *ði4ˆ”ø¸îR†× *O**÷ *7*k•‘Aeƒ¿*÷ö ©‹WT*Ÿ®TU*¹J‚ò/((“…´@H¼.®<Wþ2®|,®ì‰+çÅ•Eqeƒ#àÞ#¤w éz!ÒYBêR ¯ñ(ÿàQ>êQþÔ£\èQNò(_À¹húËyÕˆòÃ¥{DiQŽX”GñoP.V%s‘lÿC«Õr ›ÂMv™\Ê‚/’]…Pú,Ùåðçd—‹mÈÇQ—#_@]xÀ?¡½"R~/£|/Êï"/vBùIï Ðý,x; Î&½Py&éõx=éux- ^Mz­P:‘ŒÙü2s8–Œ•x9 x![ •Œð|Nú—C)™ôßžˆÈOí‡é7&»ò¡ö‡É®w&»"îHvMbüø6´W qík ¼: $¼­BÛ…ö•h»ÀÓ-x™P^´/ÅËY,A¼Ðïfà™ôïKz'Ã47%½%âÉX9€ŽdlÛ ÄsQLlŠ ÎF1¡ÓŒ¤? ÝôŸú§MÐ?5émá)(€‰xcÈ)`·'vùĪ&VÃ?Á('”#^X7ò “:BB9—]GÒûŒbOzÛØ’Þb…Ù0e%oHÆ/Z"ݱù…þ ^óÝŲí*b¿Ú{žý ÄK£D ’ì¿zSØÉÙϽçÙ?{ƒì˜·œýÔ+g/ø9öí/JЛ€aÓ³oz5ìïcyìëÎóìqз_w=Êó.d_9ȧD˜Ïex+ØŸÇrØý±åì31R§e>{b±?†~x—³ÃÎlýݼ™½ ”ä6gµ¿€]åOá=GØ•þ0»"Ù$»Ì Äa—:bœ))Û·=Ea^ÁÞ´tÆJع1R–³ŒÄËÒ”—Ø©5`’À°­6l¶UÀj­6ì&`®û¶˜²›·±mîÛs°µ0Óþ$%Ä&Ùª˜0}ÈíI¶l/Z˜-ñ{X6&gçbæ3ÕL˜©`Jcg ™F'Í“ª¥*iŽT.•J%R‘”’"©.•9Ç!°c:‰š‰ˆ¤"Ф@Š(,¥Ðä5Œ¤Ô}ï…¸ âÝ7BÜñˆë!ÞqâpæÜaÒ{”¦î†¥î ÖOT®§îÈÝKÝ>‘»r)€dN€‡&£ÎlNàL†¡zS}^¦ªµùo$=BeO³ïÚÏôïuø[¸×uÃ…‰ŸL™Ý‘x¶0ž’L¦0>%Q<ÛÖÕ1JE¨Š–æQ*L@¼c¯¦"-³H=^Ý´©ÚK… uh´í%hh/íж´CÛ÷¶4Ú  ˆw£íÊvñnev$/L#ñšD޼šW"'h ^†xŒ‡°òsñ2‚…—åç ƒ„ùœN@‰Aï8äsÂ!§Ohv_köÛ…æeÙæeÙ9ðµö@¶»=Ûn‡ök¢ûoëoü%âð¶s[ŸléçZz¸–~ˆ=‰mC¦ÄÆ…6Û¡­çHƒ-A»zö ØÛŸ8Çõ7'¶rͶCÛ„~ßk~’4oãš¡'[ætz’ïoNnã·µp½ÍñÃÓŸ˜úàwæÚzu®©Oü¹ž ƒM%sMú}o®Iót2׃d®É\ÓùéÂ\-Kf7®¹îwëÚµÙÒßÐØëâT‘…h¢"3B™w ~Hbº33.^ìé×2ïÒå°³ýÙÝ*ÐR´ •£3àgŸFbôJ¢FÜõǑۡå&´GQ x²Jµ}Žç£Åèú m£ähœ-ÈB0fš‹N";Z’I£BÃh;zÚf¢í™3™s0[9̶Ý‹v`+ä Qô>^ž9 çB#ºíGïàºÌÓ€g‚™šD> ¢5£ÉhŒÜ þò"ñ ô3ô^—¹7s8d`¾2ºö¡#ÀÁ78„×Ñôhi„ð{ôVáÆÌìÌáÌ)˜Çƒª`¬8ºÂN´=‰žGc(x&>Y–Yy9a®tºíBÿˆ~þŠ}ØO©•ÔA ­ ±ç5=ÇÑ»XŽsð<| ^‡Gð_¨8}$³*ó(a' ÂŒûÑ/ЯÐ)ôú0å¸7âø$u€ÖÒÑŠ‡Äÿœá2}MhZÚŠþÐûèCôôð`ÂfÌâ2\Ãx î„°¤hj3µ:@ÑRú颜ô‡™2—A*.ä‡aÄf¸[Lž‰WCزúú%¬Õ)Ø[p§y]@Æ"¬Å˜ÉóØq.Æm¦_x5~ÂñÇ0EQÔ£!Ñfq…x]Æ‘©ÈTBø-ð@ƒä ¥0ªEuÂÊu4Ð2˜ù¸ïl¹nGÁ*Ž @Ágè_Ñèú]Á4c(Pƒ„8ìU)Õ˜Ç1 d ž ë4ÏŠ:ñ¼oÄâáç!¼„…Oâ?áñøJ1¥€U‹Q3©ÙÔÔ.IêMÚM!²Š|"^ô®è¼Ø,®wŠï—ȘçÆ?MHdD™©™í™G3of>Ar¸§…ÐtØ ‡•ÀÃZ¸“î@AØá1å?&=:k|ÂkN£ÿ Rý#¬Þyÿtl xü ø“ƒŒ³¬¨YXÑ*\‡›»Ù:ðbÐUø6|'ðçðc ù'ñÓ Y#Àãõáwø„‹ø#àúþøÖQSžo¤~Hm„°™ú hÈê„¿Ðz:HÏ¥o¤×Ñ»é§égè×èO`‹†EŠ^½!FbVÜ.î¯oÿT|P|Zü¦øcI‘䳃yˆùVe¬Mì„ëZа½èE4@ Q#`¬p]ŠâµèkJ \݆µ°Öë@zØõÝxÜÞʨãX£Ÿ‰§Ð»@'[Q ;ö}Ø[1ô ìœwP+>NÍC¡B°dÚÌ2e>¯¯E”x *„h‚žÚ ;7ð“t#ØBhKÿ"ó6mïûàâÝ.gç°ÛXkaÅœo2ô:mžF«Ræ(ä2)#‹hðœKZ¸Ö[ÂÕ“¹¸öv?)s½PÑ{]EOÂU­ßÅIØH¿^hú&˜‹¿‡Ég1ù«˜Xm‹¢¨¿ÄÖÂÙ¯7s¶îœÙùš¹¸-1&ä§ ùB^ y»:ØZLͶî±µ$Z‡†[zšý%x”öåþ8â‘‚ œ@M½w ‰šFKÂÌ5·$ò9ÈCílé]”˜1³£¥Ùb·Çý% ÜÔÇ-L ®1‘ë›èNúÁIæœÕsûK–$€~´-g·h[ŠG {H®·«#A÷ÆT™CãK¹æ„qýӵⷹ–û¯kLPÎÖÞþáÖß³ „NŠ=¤Ô{?”¦?&AmŽw$ðf Ž!Оå"{Ö;{–Ú2®‘^Ú2G³:’fÞ,ª 4£#™Ïç ɨiC„2êoð7Xc7mȹ'[ÿûcš6?pʬ«rÁdn.d&l}Â$Ð:‰$ý“Ðpß$üâ¸\’5õ ««a=b§š³ ‰`¡¸±O¿[Ó;Q#qª¿D¤‘,çUHàÞ‰<¼Û”LI!ÙŒŽCo;…š Gáˆ^p“?…:%±¼,¤±kÜâO~ó”xàëÝ'éw¯¸`ôŠÌ‡ôGô) ™G èU~m¬~Iýý3uÏÔ‹ œÞ]PW¬tsî"—»¸®¸~ ÞüiÙ~ülÙ³uÏÖâçû¾z\}©{püüM^U`ÐDRà­ö´i¬~ Cn“ùuÈÀ_w}yxwÝE•‘J„‘èu†P v†+\œƒXlÅz„s¸Â‘Pü/ `#•F@æn—[€®0Æÿæ3ÙgÕ-©u¥×Ó´…•mRiŽJ3-T3ûƒ'þùÖµFUŽVÇFc¥¡½&ÅÜe õs~„Goµæ¹°Oç‹ 6µœ}bÖÃ7Î/fsÔ2•¦ØX]ßÚ84ÜÔ|$­6°2¯µ /l­™Ë– ÒrXs.ó¡È k®DÚÄ·Ï•ÎÕmÕ1¾¢{Eÿªñ‚îKÌ®+2ù KëëoÓíÒIÕf9+WÃ*ÙÜÍj9$›£eh§5_!áw€§Ÿ¢úx™S¥ôZy³)ªç³(púR7h†úr÷ˆäX/ˆ¯ ƒ «|¸»¼ w£î"#‘Í„ðò©H%ˆ,O¯C >7Ãi*\î0>œW4gÉüi«o(+ž2ÿÀ›é{uÖ†ÊÇ Këwµ~ðÚãõêÇ/Š ˜|é/N¤Óc|ÅZÑû¼_$zîÍü/z)èŸî‹»ø¹.½ÏV\DÏÓtÚ:íó¸yEKmKí/êÚNèNÙ¾ærtóì7r‹íûtâ;v1f‹AªTc±Ø Vƒ¦b¬Âå¢b±œjàÍöÏ,Ø8âÑò+ØAÔÊã&j5¼›O™/½_U˜P©¬:ºAðG4i„‚/]PЙp…;«Jy¡ èXVm¨p qÔƒ¿˜Rí.¬¤òÍö3vß5³Êt-º·mƉ¯±ìýRúÔ†¾ðô<Û§‹ètol9–¾R¤ŸÄm«°`ókoÃû‚ýX û±äa†´ÝÆ×tNì5ÍEsñ<:®Œ›:òò_ÈSäió´*‹½M&—«¬V'ŨbF…ƒq8Ì2˘̑«ÅµŸi)øšÖ÷\‘Ý!çÍ„õ"X?¬^"[ö,½m¦±úÙ@f ŒôvH®ã´Hã,Ű•mé7‡ú“eE*fü2cîjçÝÕwÎ\²+ý\¬*¦Ï¨=@ý ‹—ÞÔ6.øAç3~ _øH­ûÏX¼ü¹ûÃ[€_ ¤çÓo¿9È‚æÀËÈ_ù}¹UAN¡Â'©DÓX‹µ  Ðâ3Tª§m®P¶zæyæOî÷ yîõÝ[råÖI?öìóý¬âÙÊg'TŒV~Å|Q‘²•™rcí¬UÔjlª¯£[\nºú1#®7â€ç±q¬ÕÑB;«ËdÕ3ü2§ŸÉuÎÈËÌq³”WbÓîÁMm™/9Ö×ÿù Ú8‡×rל†œc{½ °Xó玿Ý=v ,ÓиiºÚt¶Û4-kŒLïwkòŒUš ᎃ˜AÐcw~`:?Ö ?²ÃH;ļª;µæ×³& ]¿Ù(AèdçÙ‰sE*Ã.7±Y•áR,˜.ƒÑ®çˆ1#vËÅemÑŠC² µÐãNuî´êÚÉ3#·mÙ¸zò¶Ò ›*$Öµ”íjØxîåöÛíXµÏã{¾g«ÕZí‡5w¡eóà´‡Þ[›Ø9ðs|†bª:·Ü=¼aË]WúÛó7†Ãæ<»ÓÚ­RM¾öyëM*ï#+ï?R»Â=P{¬ÍE‰-nÖ!‚ç!ŠþôÕ)î‚À èœÚpž‹šÁÆyÐ1~½^¡·Q ƒÂHÉ 2£Ä%qçò—Á]l(6v:K KŒ®÷?þÁøŒáã¨aÔhPKY½ÅMÜfNk„C¬Y=5E"Î*­á4•V}„³›9ˆ9-a="¥ÙÀðÅ”ŒÇmÐË-f¯>+÷ñÊœW_Rzy‹Á FÉÆ€m1­ëL¢Q0‰ðì‰ÔÑèYÁ< ÆquWÖá°`íš:²_ÈQbÔÛÃBuÖJdkì“Â% øþúmó‡ö*Ól¥Gej z*ÓÚr&Ð*ÒÖ–KƒãǦÎÞúTZ×âË)/W¸šðç­\ý¼ñ÷š\ x2%¶dGÉÄ[à¬.@7ó“ÔzÖB)sÔ•9Ö‚H‘†#Œ9«e3jÔ´¾ ^ŠRøšLa½¤À"ó6V8ÔVà}Ä`ôjÔ£T* ßÑópÀ’ƒ¬QPc0¬>KŽ<0ùYóç Óp|˱À꺺»»;#:«·o–Lbowwc#Äob²ê8<í·ïwìî‰ÖÛ×;Öׇ¶Ù·9¶·…öØ÷8ö÷„rŠ5ÅöbGq°8ÔÚÐÚ¸Ô¾Ô±4¸4¤ÙeYPE”C›²ÕÐT3_s"ç„þ­œ·ôoÕ(:íŽÎ`gH¤–±6Ê^æô#u¸!Tæ€G0BSM‘˜³Êà@笶­Óêü‘ºhÄï,PˆE2]“­WÇru‹mŸ8f2å22ISc°Ün“·7*ßRàuµ#§ÍI%œ8à,sòÎνN1|~,âÍí%~oe;ŠØ"T"‚‘²ÙÙG ùH»ÜQ狈”›‰”Ï]î9/ìØõÄÇ쾨ôEØyDmÚ­Ínbé&< Ôälª¶Oi+ª~x|¼Í-)/—º[ðç3:zµÙmVθ[ñçÓ;oVNl;aωšá|ò bô"¿^kÃJƒÒH»hw¾¢ÀP`$†j¾*nˆ«––¢"¦ê熟_4¼hßj>\`µ·[êÚ>e0s7òmôíôѾ(?ÉZ…­ö*r|.ýÝ{Õ õ1õµH­ œ¯¬ûÒysí˜zÌlR“ÒÐ¥!(^3™‰A¼¦# HµùS3蚀Ùk6n¹÷¸]œu»à$·Ä†Ü_½ÎWIâ "à¬SÌáŠ*ë“ón˜ì1”ï¾½"¼ïá†ååëEᦎæ&káÌUe3žzªxv-§•1š|¸ Çqä¡umÕ•n½irMKËM·ðéµé? l˜ZRTätG‚·®>¡Ñç0”ÅF_$úgÏ\ ËàÇ"žU`}›^£à±]VIe¾À®‰å+l¼Î®oS¤`—äðŒ]ªô"h²ãή˜_5ŸËa®}Ýd>?ô£ú1õ§IíiAXC"mL4„&¤ç4Àùõ÷å°Ænñ„ÝS+~ýk¥®Ô±”;~Ø çVå;Ê+ßšÞ×9¾ÛWè¯ šæ„»-[©Ýþ Üw§€^ÁŽå[ùxªrªŠŠ*£*JÆHóó™üüšÂÉ…qf ³‡y†9Ê1¼bxÛpÑ«V©‹('笪£œ³E8]šÓZu)¬â]F^fj4ÚLj¹L\¤B’\cF…“q:Õ¬É!—ys០{GÜØ ÿï. ¬5qðü·uoà =yï7fõ—cWð—àÕž5߈l:01Y‘€€&œAâx¨0žxIjøg¹æiåKqhÞ]ÖúRߊXÙœûö{£”˜>8«+ ±Õ‡èà8Ë—KyÇ–zsé†Ç)1qZàƒºà¦;éw@f!xGz‘_ÃŒ%Êuª}†}Æ#†#Æ † Æ/ _sÄbeÈàvl…VVÉZmȆmmy%%~ka¡7O¥RúK”*U¡­ÚýRetÓ:«[/¡dsÊT i®¨¸ŠàÑ#öDBúpà•è{Ç…C¿*P€Ÿ‰\"OÃC“"#\§I#VûÔQ’v«¥Ñ¨šŠ §‘ú7D´D« ‚cÉ×]ŠÝð¶ƒäà™Æ¨ iÁ& ¤†|’%O6Ø>sRy½X—ôYB—Íå–›—BeµLÎãê{äʪI8â YÒ¿³î®›âs¿j¬öø•†™ÁQ øUáH(Ä:;cbÓ‹ð Õ¯ñq0H;Û®œùÓ}5¢7ÀÖ ¿Ìíh[6÷½4Ê´ð=»µÃÿL¯Ž7 ð³àî:ÍG¨Kèƒá»-r/Í“›gÄnðÍY²¢¿qåòEèÿõ!Þ endstream endobj 46 0 obj 7880 endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TVOUBP+Times-Roman /FontDescriptor 47 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 222 /Widths [ 250 0 0 0 0 0 0 180 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 0 0 278 278 0 0 0 0 921 722 0 667 722 611 556 722 0 333 0 0 611 0 722 722 556 0 667 556 611 722 0 944 0 722 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 ] >> endobj 47 0 obj << /Type /FontDescriptor /FontName /TVOUBP+Times-Roman /Flags 32 /FontBBox [-203 -428 1700 1272] /ItalicAngle 0 /Ascent 750 /Descent -250 /CapHeight 676 /StemV 102 /XHeight 461 /StemH 44 /MaxWidth 1721 /FontFile2 48 0 R >> endobj 48 0 obj << /Length 49 0 R /Length1 23628 /Filter /FlateDecode >> stream x½¼ xUÕÕ0¼÷î9wžçñÜùæŽÉMrs3žÌC A ƒ"ƒDÁ* j¥Zg+Ð:¢–0©‚#ZmÕZj+Z«æmßiró­}n@ì×ÿÿßç¾çËÍÙ{Ÿ}¦}Ö^óZû¬^uùB¤BÄùËæ­@ÒŸá„ðóVûŠû¼ !ÆsÑŠEËŠûªZ„Ø-‹.Y{Qqßt¡¶‹Î[PÜGg ®\ Å}\upñ²ÕW÷õGàþÌ%Ëç7Í…þë–Í»bìùèCØ÷]:oÙÂâù³¢PW,¿luqÿ‚ë ~`Ū…cçã^„d/^ ÏàâRIÚh%’¡;QH¿„¸/d/"aøIò¿Ý±o޶ö¬ç¥ý_Ô] Õ¯ÜòqEaî™ÛÔ÷(Ð!?{>©e¨]ꣅ¹…¹ê{Α®ƒ¢q•ƇP$.j忞†µÓpÃ[1¼}Õø4œž‘JŸTê¤áÓ¢#ÞÆám2ü·ÆIã_)ÊÃí EƒÐzžâa¾vCk7´(´"i]C!ØHÍ£[ } ´7P,Ô<âÐrèY=Ë¡g9ô0hìuÃæÀ&Áyê$i/{ °—‘öÒð´4쥥=/Åïżøþ wá)´ÞVj¼ÏàNÜ….D^\ºwÓ$ïsø!äCj|‹T^+j|ê}êã>õ->õ5>õsøFÔ ‡/‘J,jºÕïw«›»Õ ÝêênõÓ¸Eá0-š¢êg£ê¡¨úá¨úê¨z ªNFáê=h<~X**úÆ«ÿ9^ýÊxõ]ãÕ×W_9^}Ñxµ0^}¡Kt©.õ^P{«v›É¡¹›úÖmÐ÷;Ҵ·qÿã@ÖOTz‡ð {§% úÑÞiyÍx#Š1ÞhмøjÔ"ÕkqFª¯Àéøš½é\vÙÞúû¡Z¹·þ€ãb”’.Ý›=½U{§Íö6Êqvìže¨…'÷Lî­¿ —ìM¼ámÔãJátQV:@Yé.þ±Z¶wZNg÷Ã@GcCïõ¶ Qø ÷tzŠ÷TjˆžoRC•.x´åòôÎà{D¥÷ÁômÞÒ7x^/Þ‘•îwÇ4©º=½7Àm.K áé{½«²ä JïÅpÇ¥‰Nï|è¾GÔzS‰œwjúiïäô*ï¤â“ƵHwìH?%½Ö?Du£ÛÛ˜v{ëêßðÖ´À›ìõæÉå{½åŇ—¥¤×+­ŸàÃë1½%ÓJ½~x$“ÞžEÜ®‡Ëq\† s!Îù9oàu¼†Wñ žçe<ÃÞò¦¡ÑOÄ8ðd’éH%cHÉHmP"%¢0Oj áÑëñÍ–[ƒ¡^ŸokùÅ\©snKü?ý¹ïèœÚ;¸ËÝ7XF£î¾ÎÁŠ©¾Y½‡ðŸñg­-‡ðç¤êƒ}ÿ¹uŠÔ/´ôõÙ:'t÷áÏ[— Á%óErðsèçÁ ƒÓ¥û tµBÓH÷¡*QŒÜP¶R:í†âii¸ œÖB*rÚ ”–NKS'¤ÓÞ §íÙkmÙƒNaSh‹tÊ6EN€GžK[ö¤¡€³ƒ8#;£”nä–n”ÍÂ)õPôõî)Ë {²eÒáô÷‡ÅÃSЇ§H‡/øþpªxxGñð8üŸ@üÿ§oaÓÿìª}Ü»ñ¾Ö…Ö¹Ö…°Í¼q`±mpÃ…>ßž÷’¾A:<÷Âù‹I=oáཅ-ƒ-¾=H×ýÛáûÈá -{Ð}­Óz÷Ü'.lÙ{xAk&tߦ›W¶þàY7œ{ÖÊ›ÿón&7[IžµIºîßžÕJo"Ïj%Ïj%ÏÚ$n’žEÞ¾uÉÔ¦ËþÃßêË/Ÿ}Ùe³»Ql'rÃf£ïDF„F?…m¶/ M À±Â³£ïÑ ™ýd£ µ(Œ\hº äÉ:ô1ª@VàãŸâzØßÞB@ÐLthë1ÜŽ¶¢‰(–á:Ä¿A•¨Ýžƒ+Ö¢åpnú ધF_€¾JôB§@»Qꅻ܄î=‚v /Ð7£;G¿DYt=œñîèŸPm€£r Üs)Z“ÔêÑͨžwz }Œ-£õÈŒÊQ-jA‹Ðb´ ]Š®ƒcÏ¢wÑï0è;(‰2ðœ64݈nCw¢Aôöâ«ðÏùèâÑ¥h:Œ`)\w+¼Í[èÏ迱?_uî…gPj’Žß‡~†v¢Ÿ“7A/ÃïÆSñ :@—ªGËFOÃùZ€šˆ:Ñ,¸bºÞä.t½¿?ÀS£¸÷àxÞŠ_¦šh#ñG¯…Qòï:øM‚ñ_#݆n>‚ž€ß‹è·y9PÔê$­§Ef2;0zÍèîÑçF 3Â" À¿~ÐjtÚ‚n€÷¹D/ ÷a®þ†F0‡uØ cØ?Â_QˆÒS1¸Ûkôrz+½›AÌ}ÌGl=»¹ðPáÄè¢ÑÛG_ý¼=úFf>¿*xFšŒ¦¢>´`}±„w£Ýh:°{G¡TÀxÏnÂ3ñ•øø>†ÿIQ”ŽòÂ3cÔfj;üSǨwií¦£t)=›¾ƒÞN?ÂÜÆ.`W²?e÷Ⱦâ¶æ Wží½sôñÑÃ0FCæ´ƒ·Œ¦Á ^„®”`½•àŒg:¿ƒ0ª§Ñ3èŒíè$àÜ€ƒ\‚ƒ ‘Áy\‹ëaœÍ¸µgžó3÷âyx)^‡×ãëð}ðûÞ ï±~‡ðÓøuüþüNà¯á÷OŠ¥8ÊF¨0%Rð›¿yÔ|j1µ„ZFÝ ¿‡¨ÝÔ~jˆFt=ÝFÏƒß }˜~—þýú[ÆÁ¬f®b~ÅcŽ3'˜¿3§X›a{Øé2›,/= ÛÇ]Ì=ÁG{Æ¿„w:ÿo>ZKÝA}‡ÖSí@g ñS¯Q0ëð>ü@êAtÐG9èâfЍ~ ø] 0,#áP0à|^ÛåtØmV‹Ùd4èuZZ¥TÈyNÆ24¨I‰Ö@Û\ß`xî tt$É~`tÌ;¯cî ºÚ~xΠ\7ýàLμèß΋gŠçÎÄ:_-ªM&|­ßà-ßž9¹Ú7·ú|ƒÃR»Kjo“Újh \àkµ-nñ â¹¾ÖÁ¶Å[[ç¶$øÐS$€ %¹ñ jž·Äj&g´:-­ƒö´áj·`°{rok‹Sú’‰AÜ  ØáîÞÁÀ]}}p¼ãØH¡^·Ä66æŒ9YÇÓÅ»€ºnÑ·u+¹çÔÞ€0xxëVçVBÅý!Œþ½CëBä‚*CxC7\ U@p’Ž€`X}-𨠠×ÙéKøÿÂeçÆ Wfa´e„ËÿA¸âáÊÿ„sçFúWÁ˜sÂùÿ{®>ÂìËH €7á•hµ ͆­öu7ÔRyÄ€c€íSØê`ëƒÍ [#lm°EáœaÛÅÍFCp?;eÉ}™Oá¼ËÚ¥p?iÚd¿ú8ïó\ÐçânFr¨“ôͨîËA†ºê(\…v%lxáGÅ—ë99±uaË稡ÁÏcTèUÝ«ðxceÎ*ãdzÕ`åÂJ?û­ ¿4îl]›šü‰ãª[†éÙ˜Ûy¡°aío ; g-¼›Pó8vƒËKO%Œ§ÆcBãEŸœÂZ'ƒZ©å´2^f´À˜LÊ_jíf‹4¦®éÀ»NŽüpLÖ<ÒICBýˆâ`H\¤2W©×E¨HÎb5è©ö‰“®›Qc¼§}}õäw÷oyÏ/œX¿¬Ã-\~åûx>öÄø6¡woá¿ Ãüü®ð!>š½Æ~…Á4ÅÓ-SS4¯»ƒSšadÛeX7QÛMæ#Âc#¹zx•mlp]Ãùl &®4ƒûW=LU8ÀùÃdÆÊ,f|êÖiƹ㠊撶ꦆÝ¿ G+×—hx.W0¿ÆÒLµSÀKŸ¨@u4v°ÀëØ!¼fIzî Ýç(ÝaÌB7þgANi6H0þpô ü<؇Jl‰R©†‘ó%”]¥~Q¸âÇEpž…&¹sv`&Y{ššÓ馯ŒTMét³tOfôc 0 ÆS/ÚMO2P¦hpÔ!šRŽî)\‚üÈžŸÁ#ìa€6 †Z س¹+_§; Éâ~}A¡æ"vñwpo F‡é=ì\  ºUô?Ž¿R}f¢¢÷Ðgˆ.El^MOàe;<¬f‡EMm1 Qü>Ÿb‹cˆâöø¼éc'‡u§†QÃp¼KóZ± ¹Ua[ÈæC®°.Ä„ÕVE0kªsnh±Zh)íš „PȲ Lë¡ ¾© øÛˆWö£þ A_¡~Zf6Y-Y1f8JðGÂz]®2K­»T¨ßµ«Að‹ƒŸ^³°þòÂ'G¯ÙrÁU£!0Kÿñ¬)|ùÓ¿º¥ÀÖü÷‹#/ì{w`ê©Â>ø…ØÙ G–‹öÓ&6Uš(ÕÈ…ü'~úÛ ¹O¦OÀ}é^ã…&ðO‹zµŠ¦ÞÌòœÊóJÑC8s@¥RÛ­¶gðÿq?ãQÀœÆð²¶P²ë›á3ø›x¼4ƒàÅ,f½Éb5 €žzÀO¿Œ«e© ñ”#ÇÖŽ·ESƒx¹Šícå§'t•0.¬r&}¦Ì­sÁˆA"!úuvȼ!qBÈûKñ#½€ºC{J{ÊİZ™É¬ ™˜8o>‹mv…+4´Í®·Û” ÌÊL²‹5¬Ùô€CD‚SEoÑ?c\²nÀ nÛ•>vBwê$Ì®£î˜Í<¶a˜PW‘)‘a«snÁÜ»âÔ0Ër…JÉjé ,WÁÔ2:(™^]­®öìÔ®Ìñiú ÷¨Ç„6MÊ€ÇÑB¾Ëv,¿¡'—ýõ†GßþSa~}îÄRÇò3´â«ñ‚Gzï‚Ü*ùçûÞ½çÂ[…«R}ªÂ_¥6}£ÿM°KA¢ß.ÖŽ³_ÀQ\ÐŒqy®“[Ê-å×rWñÚ_ *­‚ÍfEtûuj›•2ª¨ob¢_-–c¹a(fW>铉²2Zö4¥M Ñj$ôé?Ù_;r¤éojõE‘PÊoNÅàJÚZ9ŒY}ÖÐôBÕS0㯚æ¼ýöö‘Ã̶‘ñôug®¾¾ðî¹^šãÆÑ/ékØk@w{SŒlrâ Þd†8AÌÊšü&³R%×Z:­ö2ƒÓépB‹aÁLÄe¢'$Àé¤vÇ¢YÐëêTHÍ^ì?¸Ã¹ñõŸbzU-ç•,þØâÑ’³»]ö’)í{æTxßèíö$‹¸Ñ°}޽p$„¶‰ ´]¹ÂÒ9M“–;±³ÍI‰ AÎúwPêÐdÅV û#:ï–H…HhbdÝ…=ð†-} Zui‘&Ð"âø/¶†º¿8 'dÕo;2üõºt?4@ääºæ 3¢üú)3UT˜‘+@A‘p8 ™gÄcÍe‰/©Xä’`À'Y¡,GL`SÃÍUk~R]¾pð²Oþô¯S€–Úg_*üüâ¬[7MXy/æîk_ Èù%[Ù¼7 wÿ®ð÷¾xa[æ¬|âêð…S÷áýðƾòÚ±Fþë¹_aÎôá;¾}¥0Ø”(¯»èžb縊…»–̼5d²—`å᯾;ôJá…‹²ÑXИ—ûx™,a€å EÌWÊì´\í«Áv‹BÆØ|AVÛîUrQó´O«¡ù@£¦©Û¯CSräOŸtØGFl„CÔ¨uC¤L¾¤|Y‰IxVú@m“ÄPœÌ<üKH‘†`Vš8Y1i‘Æf»îHíf]-§«…Jö2hØX‰1è 9° U,É!§HI•¹¬1 >@4ap²€oŒ²üôÂ/5îrEܘŽ5­÷w…¿bï‡Û7uÍ ·,|üÕÂÁö=û2nàØùM>¡ü†i÷/¼Æï¡ ñáé—þöEÄñ×ß8¾Î®y£8Ý-–½ìÄðCüã€ó[ž­ä ‚ÖŒ‚Ó Œ”"Z,E¥ /›ö¼ »0ÂjMÌÖ] ñ’ˆ8®Õlt8Ä0Dí~Zîq{Ý>·àfdLÈâô_–Ãr;¬›Ê!Ω8’8¨)(A`/’ÍédÖ³EK&R<†Ñ›$¯@ ¢Ò®¿Ýû_G)|ÕZZ¸zEKÓ**Š­¿Â³Ö­ïžþ³ÏF^¾Ä7çVpü×lßâÉžþëZU~5}Ë ‘Ïz°0ãîÂ×sj½Õcú*ó2À„øì^/^ˆ\¡5¯(ZV\­qßåpjíØžtÓrF£AFpòÑ€é.«Ù°-ir›4´Ý”ÛB û£†×†wûSQmŠ7n'ãc1Ún[-ïT¬Fáî0¢âoŒ¡ 0ã%€g˜§úOž£âÄÒ"£J‡vÚXQ¥2i`V97/`·Å‚™L<¸=ðë•L < C³¯L;-NøVY©Ä·Nõ÷$>¯[‰p/€…®Î.H½êÄQ­+šRëc¡dX%Ì+E˜W a^‰2/¢ü;ëªüf"öõ&æ ÐË>×'Bê¤.Ýмö…£…wqÉ¡ÉqÁæ•”b‚½¤°ý…wÞüôÀËxœÌÌï+L¾}Ü0A-|VxA£µü¸} š ‡Y“oAaYðŠÝ¿Â­Øsìl·Q×Þ~¯U NyÒOHÖ˜”p-ÐN”à.eŒ&9O ¼É å aàj }’#ÍiB†€3ºÏß1 Ðê"ž£ÒÌyïr¬èiÁºñã×Q³I9òsœÉókè[V6ÊÂaYãÊ3+×äå!‰8Š´ñ*´h¥X·Ð~¹}“ývûƒövÙ÷Ãuœ% »ÕBkh‹‰Qó¶Ý¦”Fìà‘Ígë¶Ñ6‚þ.iÈ„w¸œçx(´à¾n<‚° @z2ðó‚ylèœõI,@âTóÊ.kÄšmÃúÃ3ËœÞû=Á‡eõ‰ú#,MͰ1Í<Ÿrii*e•»\NvÚ\#6‚l}òNåÃJJ9ÍIØã&ܦ.Pl‘t%±Z†ö9¬ëCئÌ!Ú‚DÕ@ ^=‡‘Ä*c‚B¡âsXf€‚ ï9(¸ÀUÔÀœ% (ñz*WIx=øì¢v`*:€qáÌÞ¡Ñ/Þ|jó³o¼ó\á…Ožûµ_Xx'¥D˜’Âë…gpÇK- ö|ñe\E½XÄ I¦pD1±£bÇKŽ×\ÔAû«nÊ *ºç{Õl#7m­(—{¹9ˆç|–܋į$ßšY´:Jd/+ÑM30;8Pd ôÀÏg\ßàÎùu7O¾íÌc—W7^J¹0ƒM…7?ÙÛ¯y‘¹­-l|ÉRÑq¯œ™¨l¿†^sq‹<üÚƒo?CnZ]K„†äOck†Jˆ(þM¼¢Ãñž“ЏŽúßñŸðÿËuÒÏ1~³ß(q…ü¬‹ßå~ÊMiÇ«œ%Ñ Npš¢m(X¢ã”¿?fp»]î ßå ‚Ï6èÎ n™`Pe4:¹”‰ò©¢Î˜Ÿw¹ýf…=;L[“À<¡ÅtZÂpñs0?)ynðö@ˆ ÐÓýGˆŸ¦H‘Pnfuàƒ¨%.92`‰£~ ™ #³†Ø°ÌÀØ8˜‚©à°"^z0.º3Íúïa]FlMW4,0W„8µzÎ/n¸qF¤°a ºq9•Û3ðÉËá‡"ë  ¶U ¢_¦Ž†›ím ØSnd±²m½æ’fy8Ùsâî#ßf²5À–­ªSH°ïýŒº†˜-N‹a}`­â*åVåVÕŸƒŸ…¸N¾OÑ¢” .tƒâõæÐŠwB\åæDuÅz±¯tI)Uº3‘r’¯c½8Ýr‘…²ì £!µ‚a¼©œ‘fR)¹Xî¬ÂKD-rVªuŠ?êärv§ú¸œg/Ø-YQ›sê2ñ¿ÆGÁÍWöú‡ðÕO"]FGéòUécïô¯>aÓ½ÓðíZ7l;is ŸNÃáŒyì8Ƭâ1®ûºŸÈüs•«¤é(÷%YCPãïAòL›„Âg€]@¢ iÔ|‰¢Ç¢r…,Áô Aïí!x‰>ŠDBx Ñã!æG42}i æMÑñ3¦3€F )°`/–ÒÄ3DB_WÞvå oéHß¹{RzÆ›»ÚŽjÂn¾$YZöÑ%ÓÖe2 ÷?ÚÚògçüZ´3É:X’pßÖ)·\½|ÁøôìeeÙy—ßûfkP(L8zßüÞIUùúå‹gô^±óýŽ„ï§¾„G#fhÊ ~üzÙ+´“ÚwSÀ×`iÅ «$¼ØKQúñNuÒÏCü"0¾bqRV£’ x^¯–SàV«x;ÐÅ^ªa^Ôp|ÌàÕÏÑo×ïÖ3zèÚ‹:­‡Àð¶¥A¥ouíÉ“ç¼s’t–È}X+éðÀ—ûûuÃ_“àQÚ㠤΅r$èD™ë•¥Áå{W¦ñصâª]WyËØÎÂÌ?ýQ3BЦëtჄo¸@&ýÞ‘d$üDœÕã˜æìw÷yîRÞåyÐù´û;¯<Ä…”•\¥²•kUNw,q.q/ñ<ê~Ô£ÕEýÖ‹@uòk."J“ 8CÑ8F&2%O¹äá°Ï¦Q'l`.3¢à÷— ÷D#gyCQ*Ê.p8Hª S`ÆE%„ x‘…»Š"h¬‹š7Ж˜òÙéé™îøøšqW û¯hl]MæVެÜ9óGf¡Ì÷(ÃaußΑ¯ÞYóÁû«Ÿ£6¬h‡¥ù–~Á­XTAVßÈìD:l²ûG±Š«Ue}‹ìKœkìW8oG·ãíÚíºуø!õníº‡B…÷£ýøiíÓº'CO†_ ½öKw†ì†³sŠËàL¦4©ˆ'’É…Bž†½TJ™-¯¨(ÃN4Àœúgíagèá­SUœÁgÎY­!G• ®Ù'/+õA-Ns¤’¾L©§4aË%ÉdÂàp8•©T j{EYY úùвRž©Ê¤’v¥B&w–„™HÌ$¹˜Š²ªP¤;UVšJÊ«ÁÂmû}ÈOƒCh’ãD…Um¨¢ªìùê!ü§}ŠY’´ßaïqØF 9/:Œ eXr#C Ê%‰kÀ»ÌngÑÿÞ ŽgàõÀ…È5›ä8ú*8ð‰¯ÕÔòPÃÎfž8“úW…K6‚'ir’gÑb•cðÔ>C´;èãhȤˆÐ8 ÄôáÑ:GJ©ÄÑã󜕾F*ØåNñ:ȱFpzxjñ9w¹ãxÏUÞ©' G½· .ë™ ¸EÉõISØs¦@5ý³Üqá0Vè+ Î’D=Y“rèòµ‡y½»}dûW…›†©3?ûðpt3KÐhÂìý€wÄ·°KWÂçùVG«ÀüØòãÅs¼\ž0XmVžãb†`0„+ ØÚ¶ 7‚uF:âŒéåu9ݼUnàm\0ÅŸמ+ÊÛcî¨-扞Áߢvȱ’£’ôÉ“¶á‘áüxúºˆþj€0+(ËVIY®KùlÍC”•èËREÀúWbs˜3,¨7çÁõ|~„%¥šZÚÑ¡2c`ðeÚÕ‚×—N˜Sx»kÓÈol.œ¼qE7|6L9âꈯÇoºÃò„FÀ¤ýÛ e…•kj8pê5o ð ¯_ÆÀѨâ¬7ÐûAçQ#V‰}>¦¸H›ŒRîQÜ“Tñ¨òõ3ò×䯧_Ï|(ÿ0s¼ôkùpF;ƒO”–X]^“eµZ¬W–ªÌ—&´ $3ñ¦lˆKÕW*ùú:e#טè”鯱tm,]²»„*¢¨h¶Eœ-þ&¦E„å/{š›ˆ~r„Dbk?XŽÔž vd%CÖÐEüäÃÄ“.!¹$GkêQ•sTH–… a¬Wãê2­d±Ã:ŽDi cŒ4Z¶÷ }Ää9'NAé$ñ»âD¨ˆo üªÒEk0W*ªG™/H`8a ‰X8DÜ’ñ)V˜ê¼¬s[m$Ó´¶€~2 Mþ‹³©”"dv'3O<üBkˆWǬž/TUÝRGO¨¼`ÊôõxUNõ­¼ x^í¢ž‹¢ÍgZ•ç«,êš`ÛÝë[¯+,¯¶D4Îòˆ=Ü[×ä«\ÛOÁâBĹž…õ%6F7‹%ߨ°L…ïQã›»‘ o ÈBd–ÊÌJ õJÎ9_¯ô´h†(FBYÚt،ͯ[ ’ÈïÙì’ÍtøHÊ…¦Àæò©t>•'Œ]:( "Æn­L²…ÆÀiu`5ë#а”7!¹7¤¸1¸U9ÊQ>ëŠÛÞ*üýÃåïùª±|kùM›×ßܾ…ù—ß!Êd#Û3ñνôNá7½ F¨.==/ù›Ûo™Ñ\ Š0H :éÝ9ÏØ¸­ðGôïéß³ýIÿ¹‡«P‚ V.•/U,1/±\)_«¸Ò|¥Eå­6N¡³Ú(«ÍÈ)Ô¬: ±ÈÛÀZlt)TSÀ žj_H×¾j¼'$ت;eÈ$îüØYG€¤Ž9¨nAa@ØàÖ…‘F€B¡÷ÃHëS‡¥t QáÀNœhÚI…“t6IbKÙbTå PWHe­â*Wýì‰ÛONU»ò k·ß÷7,{%AïÞØ%ä3©L…Åüòƒwþ­%Ò£¿¢mÓ©ßþ2‹$ü(Ø ³À/«Ñâ²»¢F_¾šø4q2!CËRW§nLÝ›z,þxê©øÓ©7âÇR/U}ÿ õn•†ŽOˆQ^yœéV¸”ÛôŸµÛíòÜ*”Aceü‘²tÀJ³åÕŒ!©ÇåÙ$W]‰J?“6DD)ÂŒÖæZî/Á@ÿxOm €°`ØRʧöpÃHpD σ—•dÜŒUEd«ÈG‰\å£PTÆËø*V}²å‚A³I9àš ž~4›é¢3Ö,Ó‚£B"Sª¢Ü5HŠÑЩT]4ä̪ Þ)É™~]H‰Z”¯UiQÊnüW7w×oGž¼lîMëoºý§ôŸ9„ëëR-˜U«¡–ä×Öœùuc9¦*S#¿ªÎ‘Äܿǹ3ÌŠá'®½ø¿Øyxotô Xe³ üh$ãõ÷bÿ~©j¹áóUÜZþJÕ:ý5†u¦uæ3šSZu?W„yÙðó¹üOZ¾Ž„óm´\AÉ´ Óí´Ìåšï6r·Ê~.£dj¥ÛBÕ­û5ø× özétô^O{û y°\ŠøK¼Þ„¿JÑG¢CÀÿ—hœˆ5‡a“Aâ¨àŽ÷`»ÕÐadÑ» ¡`´2iÀª<ËO‹QÀlXñ0$`)A`Ï  \rÔ…ïŒ\¯xîÚ%Ûê±?þâ™7þëùÇk}üÒYzY’Þõâ¾/Þ¹t¡êš÷±ëЫ88na唥½ãHL˜p9ŒÖˆ¹œ‚xvE €¦+üqPhp…>Ð6ZlúÛmY%ö²y›“ÉÂ!íñEq´è”t i. <ëÀ#iÉ~8öM^WtJ‚rMlí"ï–fÓ±e ^Šly1aŒ~‰ÉÅÉܘäÁHfEtiócŧ|Ð{cÆ™´zMØ?Á©=ýmÝÆ‘¯\lërêÚæû—½ÝV#”³»3Ú8Ü<²|Ùdµƒ* Mô ÀÏŒ¨VVÍ@o‰óÆ5u4ߨtCó.'ËFÙœ¼ÙÑœo^J_Rõé!›¼Ñ¨Ku$âÆö;©ð]c™öéØtùdÐh©éÙolRìùkŸ”áðÙ9ª>¯™1#l™0y[x‡1A¢ªÍVúúRu­ äQýFÔÔšÚ¢³d,Û,;, ¤—ŽîéëMé“"üºcïŒ|@É9*ÐÀ‡ý£ÒPH‘ï"aK;@åE0Κ¯Äÿ$Äð½[ƒÍ³¶k¤hÌf¥ 8ñ±Ûº'©ÈA9ëV’ÑYúÕg¯|è­iå? Mñ[.´©Ò™È§vœlî1ªž0(ôÏî°7ºç´¥ª0žugaûþg;›T)k´uå7¡Úy+/ fó…ˆ—Mk òY±†m+©È=s/ÿM+=¹Ä[]¾êyù…^ŸVáNß{ÿ3× ¶¶Ô¨ zo4Ô·Àäɬ™ó_ý¥W¾@u¾Bö;ýÈæ :(ZZ-ø[+–[Vð5ëÒÞ hpÁêóÓe@ð7ã :\_ ÞàJûgÙn,Ç=-‹dY‹"õf.“özÁ@Úè`™.OC¤ fGŠLHp™8βXBâE!NôÀf‰½BҒŶ!’l Y#0˜Ž WóÉ„y¶…¹¤3Ÿ¥LÈ1‡½aJÖ]¥4«ís©†ÒÞ‹~^ã+P˜4£¬qæÄ[Ë{ í.eÍ¥ô᪠š ªC¼‡¹§Ã_»¥ãòÂ⥢ÂåRU_Šo‡¯Wè ÆU*B ãÝS€£tœ~1PiT®2|6Ÿ®Ûê²Ýêòy!_Ìâoóœ Iãô)og#^ßG:-¡ô°~¼•< ]’{­(qt߃líJ)¥QÒõhÉ)9%¹ ‚jD™‘Èû‘ÚD¼®.ž¨Ýpq•\›QšËâ»[]<•›Wp°•õuÒÑÓzEÅåø£F{ŒÑx5y·ŠãGÊVU“€ÀëŒn-ˆxôN)´I 'x—ÏÜít¹nTjeÚR…(yÓÌjâ&ò"x§ý`Úd&Á”´ô6Ÿ2$Þ'’l3æø ±K"F¥ ö„J´z†Ä^mÌàAÚˆÁƒõ%P‰CPU6@ˆÏyª¨‹œ“2ÿçá?ž…ÂÛóà 5ÆŽ´&iëñÎOÖ2‰î?¿,`ÔÇ ¨¾ýçúq‰E¡ŸP·¶4*8¯KЛeü™OÌÛ[[&dV`5 =Ê®DUè7â@[°×7`Þd~Èüeð» ÇøÂ¾°PéË }¦¾Ì"ßÒÌÝf…à÷ç &Àl øEÿTƒPj2—fÌSii–R‚Æö5-ò`e¨2F‡]U¹ˆÂ\ Çiw CEÊÜs#"‡#t¤:GhQi*MWù”ǃp U':ˉ`›€ðacð_—–|²Äà#–ßÉá3äôB?Çëq¤lð`üI6ö˜ØË–0 rßô!b‚MÂ&Z 9‚$•ƒPtž¡0së2I£K?sQG’þ±ÙcNVã+¶üªæÐ·M.4ô.…¼ðZÖ3® ¸¸²©ô—íaŠrÙœ6-+?óäI§OeUÑ.×¹§òoCk9‡‹Â*Ò¨Âw~Ü âÙ°'Y {5øì`ÑÍÈeõ->ƒê8S­t©¶ô؃“­xåÐ~½!M3„¢ÀûŒF"'@1]zŒ”мcŒ|*sä%â)éoRšê4‚}ós];»àrÉóSé·›ì%2™¬U™NOž‘å€J0É©•ÓÀJóïDW¥½ÜGé}k¨I±Iµ”®F×åH7ä’Í®ØsðÝ?ÁÚs¡Z˜Å ~¦¹&ú‚ÁjWÔÈ5¸j|qÕ®._@åc»á•nÕ6sæÄqÍb®2tšXFÕ:Ѩ-k­·–Õ{½V-7±«¶&UtF¢ªKÝ’|+Iu$‡p»¨n+séÆ[Ä·DªC„ž'Ûcd\š• 2‰@å„nàä@¿ Às®AàDþ „8"+ѹΦfÑlÑ&Õ§Àc9g#Bî<Í”œYðÔ[ S"û󜙒Kt­ï:Û#LtD#I³YÓÙ˲ÔümÕùÌãssæï¬ô6L)ÔÍÈ™C—4Š¡Êü¬BÅœr“pqÝ@²¢¯wpF÷ ŠŸbØ€MÝ¢ÐlžÙÚnì ÖÿhüŽÂ¼ö,ïpñ•Sñîy©)q{®€&O£UËõØvOõ…Í•#M¨Æ°è xÐú§ô/¥U[OŠ}vG—ƒºCó£WЕy³i¡A`C .Áç'Șõ]Õ.Ÿ/¶O™Â"VjSÉËÈÐ\Ö Õ[#Z.[&øå\9ä,”3NH©AOV"©4MC¾óèžÊ æZ±o!p?RK¼ d: ÎBnE¦I&€ígŠÂ1µ9¢¶0(¼Žˆ=ö½pìgÑ»“YùOÓ!i'c³Cíy•±FnÔÄîžÍѳÊ'Nk©º¤º¥Ð3®Zœ^Sç¯[ øC—¼b`±(9 *ó*ä·M÷•F&¼XHvˆØåRÔ]„›¾2j­y«£”r$iT>úGÐwŒ$«ën/É?“Swèî¶ìÐ=fùFÁZ‰±Z{Ótl5oËÚ)Îå•vs‹] ÀÔA§¶E ‘+b-8c†š!/ Ù #¬ê kÃÈJ›ÃX/‡–‘ƒ–ÙÂØÂ@¡SÂðI(‹QI—èwÊ")Vê…MÊù-§¹ò‘—_ÂÌ™WNá¾ê;oY±öž[CÔØX8óþËïëxß_~Áö޽ù𸬖à\Ò‘÷@~oû*å•Âö»C»BFND¾‰ðŠ¢ âÖ öóºfµ+{<˜jv•}°ùô’Òà„µõ4›Ò¥bÙ¤W¯R°”ÇÉ×8'GÍ)³e¶2‰ÀMRá$ÒÖaA£Šrž³n¢a¿Š ÐóÌØ±´[0 nÓ(Æ\ &B…‘ òµŠAÑb8n¥”šUÔfÁ+2“/çë\"h‘¼ñ¼Em—ܽ}Éø+ /ÌΆ²J£a{„e›ÊfÎÙúò_TÅÄʦåýêæß:xA¢ yLÖ2Ž>]QãÁ’MNã=ا÷{e=HÐy%×4àiÑmÌž ð‚s°¸lµŒXÌç²Y{Bt·è>$ÓÀKk¤ms猲†W­Þ±¶âÞ “Ù8¯É_y[÷ÖëÞÝsKí]•uà®YU·bjSÉÄØ´é‚Û¢ eá/ó*L¯žÕѾúž;¢z}pÓóRÃìÕj†X"×c§Ÿ2Qy_&*E;W¯UŠ A=°h›J›œ6QŸ0YzìCÇ+Žë`1ÉÈ‘cÐÔ½ÄHÞqØ^q4“RÀÀ@"OzÌ—NÜuÒ’EIŒ{pâ¾GÉQj[[°Âï°”¯®(±.cY¹­µn¥š¥ïé9ìód^¯0*ýšý1À§26…¹p&oÎ;óBµ_&çàKyZÞ$ÏØü1ÿÓf“–WÓ&Gåè#+«pd2yC2ãt9]“¦”çÁŽ%-ÙTC™³ÎH&§ü~ÁŸÌT”9á“à2«múP´ iX½«:¢“ymÊZO™!ICÄô’QÝn–ÁLÞ‘‘!éñåq>ìò')! _9Ðîƒå5é—V€‰8ýHGüu+‹í3ÀßHï{DRŒÅ3ÇQã#Gâº#ú0nÁÀ%- c’M°&aÍâ €Q›£Vš€0D‹a`¤¨&ID éNœ3Wꢇj«Õʃ{U®T¢`÷¹ ‡™LEý©ð-ű*ªðn©/W¥Jc¶ÐªýTÜdʦðNúZÎ1'=…ÞëºÀrÈÜn6Ü~æ+9/c¨ôÈoYê?®s0‰ö˜{ecá¾VeZO˜±yUxèëÄCæ0|‚ “OTà•¦2îÊ^¡×ß°lf6³]ÝGeŸG m\‡¶C×ne*+r /STȬ¼BsL¯&³ÆÌÑX.%l•¹ E.`ଭN»Cö ì ì=cM2Ør\®"°š2¾¬k tµK§¯¡‘Ì.£.W¦”†T~™ÂÌÔèõãjȹ5z™³”¨Pu¥µé—>| R“¬°ì¨¸Ü5XkÏ€gB*ÉTŠƒÄÍx?ÔP‘¹“¦Ow„‡u%°Á¤ŽÍ¨ä°æóìDëó{/ÅØ‚ÉKI0$È"Ùõ 0AΙQ|<\QáŠ×¸KK¸)Ûë| óÙöTa¾Ûê ‚úfëN·Æ[^x¿²<þ—ÃÕ‰ñô.lô{SÍ“Sã-ø+˜t䟅S”ËEQ6ƒ±Ñ—sÎõŸNzFçr)ýõðÝ·À 8 ÀáWé×Ç“Ü—δcB%Ñ’Xb¼¼Å9>1ݹ8±E±%qWâPâw MGGâŠD¨_©Ìl žÊåS ‰Dc´ß~¹¤±äcXg³¹È20‰jB.üP™-¥Pù ß`õbc,¦-rÇeUÖ$‹,UW˘Âa¶ Hßéż:¬q»G¾¥”|•Âaƒ”+/›Šyîýªê¢Y0@r‡‚Ú?B Eý«è`À|¯åaq–•z‰¢”S â`S …RÇa®Í \fGa,BÇJ½2¯—) Eåå ™z°&S”¹>"r»9ŠgR5ˆZ|ÜC×ß¾[1¨8 + LF-È¡8!%Æ­x´+hÛG¤l ?òx¶–|$$NEBU„ç8Žd‰åزsX…JT \ˆ®y;o›¸Î|K '/iRø:à¶3‡;oå _Yéæñÿ>¿kññµÔµôëÄ^>„X|r¯RÍá“{(Uú‘c( *ÛÙˆѳþ¼ë±µkÙµ_ûø•kwíZ{%ùþ| †)a/EMèq‘—Ï‚ãþ¸ä°h:,ip¥Žj›]Çm°×êË…µ¿%T›-¡™\S ¬=åò~ŸKw»1«@`rÄ™äæ;vNÖÔ˜†ùŽ”dËÓ¡H‰£¥¦v*CßÆÚ›[†ð”}ÂÊ}Å—DÛ€ªÀ§>¤%E×ñoœ ÖÓYÿaÄùÿDï‡‚Øæ’b1Ù /Æf±™m´Ì$·‡‘7‚a fÃÆ’‚]•`©Ÿ§lÁÈZÂùÏw6iKRuš…¦‰õ·ÜB}ôǹ;âBêÊŽqÓ‚&†ú}ò.9«`0Æ5“ õsS±¶R[û¦¸³«Pï¢+—RwÔýÓ½µÞäc¥ÍeË~Ê0XÇ+å¥%–ËÈ_–T)\9œåjÑp‹‘9fâ1$úžô7º-,¶þ­l„}øJ ̺ ‘¯Œ'«¾ÿ.‘CúYíöý׆ÀYŠ_:û¡jø¾P |³ 2ƒÈWÇKß}ìOå$øód4¾Ð8 õHÑ»^øVãLt|²mF‡a$2„¥‘É …¦MŸÔÓÔŸ¶dÙÂË’S–/›wéÿ1™nM endstream endobj 49 0 obj 17672 endobj 50 0 obj (libsynthesis_contributor_agreement) endobj 51 0 obj (Mac OS X 10.8.1 Quartz PDFContext) endobj 52 0 obj (Lukas Zeller) endobj 53 0 obj (Pages) endobj 54 0 obj (D:20120917093640Z00'00') endobj 55 0 obj () endobj 56 0 obj [ ] endobj 1 0 obj << /Title 50 0 R /Author 52 0 R /Producer 51 0 R /Creator 53 0 R /CreationDate 54 0 R /ModDate 54 0 R /Keywords 55 0 R /AAPL:Keywords 56 0 R >> endobj xref 0 57 0000000000 65535 f 0000059432 00000 n 0000004531 00000 n 0000018337 00000 n 0000000022 00000 n 0000004511 00000 n 0000004635 00000 n 0000008772 00000 n 0000007523 00000 n 0000031867 00000 n 0000028624 00000 n 0000040483 00000 n 0000018902 00000 n 0000004787 00000 n 0000007502 00000 n 0000007559 00000 n 0000008751 00000 n 0000012398 00000 n 0000008808 00000 n 0000012377 00000 n 0000012520 00000 n 0000017348 00000 n 0000012743 00000 n 0000015893 00000 n 0000012709 00000 n 0000018729 00000 n 0000018491 00000 n 0000018300 00000 n 0000015914 00000 n 0000016158 00000 n 0000016177 00000 n 0000017327 00000 n 0000017385 00000 n 0000018280 00000 n 0000018427 00000 n 0000018608 00000 n 0000018664 00000 n 0000018846 00000 n 0000019301 00000 n 0000019541 00000 n 0000028603 00000 n 0000028799 00000 n 0000029050 00000 n 0000031846 00000 n 0000032253 00000 n 0000032491 00000 n 0000040462 00000 n 0000041167 00000 n 0000041406 00000 n 0000059169 00000 n 0000059191 00000 n 0000059244 00000 n 0000059296 00000 n 0000059327 00000 n 0000059351 00000 n 0000059393 00000 n 0000059412 00000 n trailer << /Size 57 /Root 34 0 R /Info 1 0 R /ID [ ] >> startxref 59591 %%EOF syncevolution-1.5/src/synthesis/m4-repo/0000755000373300037200000000000012424517753022011 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/m4-repo/dk-warn.m40000644000373300037200000000712512424517753023623 0ustar00nightlyallusers00000000000000## Copyright (c) 2004-2007 Daniel Elstner ## ## This file is part of danielk's Autostuff. ## ## danielk's Autostuff 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. ## ## danielk's Autostuff 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 danielk's Autostuff; if not, write to the Free Software Foundation, ## Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #serial 20070116 ## DK_ARG_ENABLE_WARNINGS(variable, min-flags, max-flags, [deprecation-prefixes]) ## ## Provide the --enable-warnings configure argument, set to "min" by default. ## and should be space-separated lists of compiler ## warning flags to use with --enable-warnings=min or --enable-warnings=max, ## respectively. Warning level "fatal" is the same as "max" but in addition ## enables -Werror mode. ## ## If not empty, should be a list of module prefixes ## which is expanded to -D_DISABLE_DEPRECATED flags if fatal warnings ## are enabled, too. ## AC_DEFUN([DK_ARG_ENABLE_WARNINGS], [dnl m4_if([$3],, [AC_FATAL([3 arguments expected])])[]dnl dnl AC_ARG_ENABLE([warnings], [AS_HELP_STRING( [--enable-warnings=@<:@min|max|fatal|no@:>@], [control compiler pickyness @<:@min@:>@])], [dk_enable_warnings=$enableval], [dk_enable_warnings=min])[]dnl dk_lang= case $ac_compile in *'$CXXFLAGS '*) dk_lang='C++' dk_cc=$CXX dk_conftest=conftest.${ac_ext-cc} ;; *'$CFLAGS '*) dk_lang=C dk_cc=$CC dk_conftest=conftest.${ac_ext-c} ;; esac AS_IF([test "x$dk_lang" != x], [ AC_MSG_CHECKING([which $dk_lang compiler warning flags to use]) case $dk_enable_warnings in no) dk_warning_flags=;; max) dk_warning_flags="$3";; fatal) dk_warning_flags="$3 -Werror";; *) dk_warning_flags="$2";; esac dk_deprecation_flags= m4_if([$4],,, [ AS_IF([test "x$dk_enable_warnings" = xfatal], [ dk_deprecation_prefixes="$4" for dk_prefix in $dk_deprecation_prefixes do dk_deprecation_flags="${dk_deprecation_flags}-D${dk_prefix}_DISABLE_DEPRECATED " done ]) ])[]dnl dk_tested_flags= AS_IF([test "x$dk_warning_flags" != x], [ # Keep in mind that the dummy source must be devoid of any # problems that might cause diagnostics. AC_LANG_CONFTEST([AC_LANG_SOURCE( [[int main(int argc, char** argv) { return (argv != 0) ? argc : 0; }]])]) for dk_flag in $dk_warning_flags do # Test whether the compiler accepts the flag. GCC doesn't bail # out when given an unsupported flag but prints a warning, so # check the compiler output instead. dk_cc_out=`$dk_cc $dk_tested_flags $dk_flag -c "$dk_conftest" 2>&1 || echo failed` rm -f "conftest.${OBJEXT-o}" AS_IF([test "x$dk_cc_out" = x], [ AS_IF([test "x$dk_tested_flags" = x], [dk_tested_flags=$dk_flag], [dk_tested_flags="$dk_tested_flags $dk_flag"]) ], [ echo "$dk_cc_out" >&AS_MESSAGE_LOG_FD ]) done rm -f "$dk_conftest" ]) dk_all_flags=$dk_deprecation_flags$dk_tested_flags AC_SUBST([$1], [$dk_all_flags]) test "x$dk_all_flags" != x || dk_all_flags=none AC_MSG_RESULT([$dk_all_flags]) ]) ]) syncevolution-1.5/src/synthesis/src/0000755000373300037200000000000012424707650021312 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/DB_interfaces/0000755000373300037200000000000012424517753024005 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/0000755000373300037200000000000012424517753025223 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/DB_interfaces/api_db/DLL_interface.cpp0000755000373300037200000001375712424517753030402 0ustar00nightlyallusers00000000000000/* * File: DLL_interface.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * General interface to access the routines * of a DLL. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * */ #include "sync_include.h" #include "sync_dbapidef.h" #include "sync_dbapiconnect.h" #include "SDK_util.h" #include "SDK_support.h" #include "DLL_interface.h" #ifdef ANDROID #include "android/log.h" #endif #ifdef SYSYNC_ENGINE #include "syncappbase.h" #endif #ifdef JNI_SUPPORT #include "JNI_interface.h" #endif #ifdef __cplusplus namespace sysync { #endif // ------------------------------------------------------------------ #ifdef PLUGIN_DLL //! derived class for DLL access bool TDLL::Connect( cAppCharP aModName, ErrReport aReport, void* /* ref */ ) { fModName= Plugin_MainName( aModName ); return ConnectDLL( fMod, fModName.c_str(), aReport ); } // TDLL::Connect bool TDLL::GetFunction( cAppCharP aFuncName, cAppCharP /* aParams */, appPointer &aFunc, ErrMReport aReport, void* ref ) { appPointer m; /* don't overwrite if "" or in case of error */ if (*aFuncName=='\0') return true; if (!DLL_Function( fMod, aFuncName, m )) { aReport( ref, aFuncName,fModName.c_str() ); return false; } aFunc= m; return true; } // TDLL::GetFunction bool TDLL::Disconnect() { return DisconnectDLL( fMod ); } // TDLL::Disconnect #endif // PLUGIN_DLL // ---- Handler for DLL connection reporting ------------------------ static void ReportPuts( cAppCharP aText ) { #ifdef ANDROiD __android_log_write( ANDROID_LOG_DEBUG, "ReportError", aText ); #else ConsolePrintf( aText ); #endif } // ReportPuts void Report_Error( cAppCharP aText, ... ) { const sInt16 maxmsglen=1024; char msg[maxmsglen]; va_list args; msg[0]='\0'; va_start(args, aText); // assemble the message string vsnprintf(msg, maxmsglen, aText, args); va_end(args); // write the string ReportPuts( msg ); } void ModuleConnectionError( void* /* ref */, cAppCharP aModName ) { string s= "Can't connect to library " + Apo( aModName ) + "."; Report_Error ( s.c_str() ); } // ModuleConnectionError void FuncConnectionError( void* /* ref */, cAppCharP aFuncName, cAppCharP aModName ) { string s= "Can't connect to function " + Apo( aFuncName ); if (*aModName!='\0') s+= " of module " + Apo( aModName ); s+= "."; Report_Error ( s.c_str() ); } // FuncConnectionError // ------------------------------------------------------------------ static TAccess* AssignedObject( cAppCharP name, bool is_jni ) // Create object for LIB or DLL or JNI { TAccess* d = NULL; bool is_lib= false; do { #ifdef JNI_SUPPORT if (is_jni) { d= static_cast( new TJNI_Methods ); break; } // JNI (Java) #endif is_lib= IsLib( name ); if (is_lib) { d= new TAccess; break; } // LIB direct #ifdef PLUGIN_DLL d= static_cast( new TDLL ); break; // DLL (C/C++) #endif } while (false); if (d==NULL) return NULL; d->fJNI= is_jni; d->fLIB= is_lib; return d; } // AssignedObject static void FreeAssignedObject( TAccess* d ) { do { #ifdef JNI_SUPPORT if (d->fJNI) { TJNI_Methods* dj= static_cast( d ); delete dj; break; } // JNI (Java) #endif if (d->fLIB) { delete d; break; } // LIB direct #ifdef PLUGIN_DLL { TDLL* dd= static_cast( d ); delete dd; break; } // DLL (C/C++) #endif } while (false); } // ------------------------------------------------------------------ TSyError ConnectModule( appPointer &aMod, cAppCharP aModName, bool is_jni ) { TAccess* d= AssignedObject( aModName, is_jni ); if (!d) return DB_Forbidden; if (d->Connect ( aModName,ModuleConnectionError )) { aMod= d; return LOCERR_OK; } else { aMod= NULL; FreeAssignedObject(d); return DB_NotFound; } } // ConnectModule TSyError ConnectFunctions( appPointer aMod, appPointer aField, memSize aFieldSize, bool aParamInfo, ... ) /* Connect to DLL (or LIB if = "") */ { TSyError err = LOCERR_OK; TAccess* d = (TAccess*)aMod; char* p = NULL; char* q; appPointer* m = (appPointer*)aField; bool notEnough= false; bool tooMany = false; if (aParamInfo) aFieldSize= 2*aFieldSize; // do vararg handling va_list args; va_start( args, aParamInfo ); // the element before the open param list // now go thru the list of all functions and put them into the list uInt32 ii= 0; while (ii*sizeof(p)<=aFieldSize) { p= va_arg( args, char* ); if (p==NULL) break; if (p==(char*)XX) p= NULL; // XX is equivalent to NULL, but not termination of the list q= NULL; // if aParamInfo, treat them as a pair

    must be earlier than if (dt>aSampleTime ) dDone= true; if (st>aSampleTime && st>dt) sDone= true; year++; // search in next year } while (!dDone || !sDone); //lineartime_t lt= seconds2lineartime( t.bias * SecsPerMin ); string offs; timecontext_t tc= TCTX_OFFSCONTEXT( t.bias+t.biasDST ); ContextToISO8601StrAppend( offs, tc, false ); // now concatenate the result string aText= "TRUE;"; StringObjAppendPrintf( aText, "%s;", offs.c_str() ); //StringObjAppendPrintf( aText, "%+03d;", t.bias / MinsPerHour ); string dstStr; TimestampToISO8601Str( dstStr, dt, TCTX_UTC ); string stdStr; TimestampToISO8601Str( stdStr, st, TCTX_UTC ); // s must be of the format stdName;dstName here, for example CET;CEST or PST;PDT aText+= dstStr + ";" + stdStr + ";" + s; return true; } // ContextToTzDaylight // ----------------------------------------------------------------------------------------- // Get sequence between and . If these strings end in \n, then that character // matches arbitrary line endings (in other words, \n, \r, end of string). static string PeeledStr( const string &aStr, const string &bv, const string &ev, sInt32 aNth ) { string::size_type bp= 0; if (aNth==-1) { bp= RfindProperty( aStr, bv ); if (bp==string::npos) return ""; } else { sInt32 i= 1; while (true) { bp= FindProperty( aStr, bv, bp ); if (bp==string::npos) return ""; if (i>=aNth) break; i++; bp++; } // while } // if //string::size_type bp= aStr.find( bv, 0 ); if (bp==string::npos) return ""; string::size_type ep= FindProperty( aStr, ev, bp ); if (ep==string::npos) return ""; string::size_type bpl= bp + bv.length(); return aStr.substr( bpl, ep - bpl ); } // PeeledStr // Get the string between "BEGIN:[line end]" and "END:[line end]" string VStr( const string &aStr, const string &value, sInt32 aNth ) { return PeeledStr( aStr, Property( VTZ_BEGIN, value ), Property( VTZ_END, value ), aNth ); } // VStr // Get the value string between ":" and "\r?\n" string VValue( const string &aStr, const string &key ) { string res = PeeledStr( aStr, key + ":", "\n", 1 ); // strip optional trailing \r if (!res.empty() && res[res.size() - 1] == '\r') return res.substr(0, res.size() - 1); else return res; } // VValue } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync/vtimezone.h0000755000373300037200000000614712424517753025051 0ustar00nightlyallusers00000000000000/* * File: vtimezone.h * * Author: Beat Forster (bfo@synthesis.ch) * * Parser/Generator routines for VTIMEZONE * * Copyright (c) 2006-2011 by Synthesis AG + plan44.ch * * 2006-03-06 : bfo : created from exctracts of "rrules.h" * */ #ifndef VTIMEZONE_H #define VTIMEZONE_H // includes #include "timezones.h" #include "lineartime.h" #include "debuglogger.h" using namespace sysync; namespace sysync { // forward class TDebugLogger; bool VTIMEZONEtoTZEntry( const char* aText, // VTIMEZONE string to be parsed tz_entry &t, TDebugLogger* aLogP); /*! Convert VTIMEZONE string into internal context value */ bool VTIMEZONEtoInternal( const char* aText, ///< VTIMEZONE string to be parsed timecontext_t &aContext, GZones* g, TDebugLogger* aLog= NULL, string* aTzidP= NULL ); ///< if not NULL, receives TZID as found in VTIMEZONE /*! Convert internal context value into VTIMEZONE */ bool internalToVTIMEZONE( timecontext_t aContext, string &aText, ///< receives VTIMEZONE string GZones* g, TDebugLogger* aLog= NULL, sInt32 testYear= 0, // starting year sInt32 untilYear= 0, // ending year cAppCharP aPrefIdent= NULL ); // preferred type of TZID /*! Convert TZ/DAYLIGHT string into internal context value */ bool TzDaylightToContext( const char* aText, ///< DAYLIGHT property value to be parsed timecontext_t aStdOffs, ///< Standard (non-DST) offset obtained from TZ timecontext_t &aContext, ///< receives context GZones* g, timecontext_t preferredCtx = TCTX_UNKNOWN, // preferred context, if rule matches more than one context TDebugLogger* aLog= NULL ); /*! Create DAYLIGHT string from context for a given sample time(year) */ bool ContextToTzDaylight( timecontext_t aContext, lineartime_t aSampleTime, ///< specifies year for which we want to see a sample string &aText, ///< receives DAYLIGHT string timecontext_t &aStdOffs, ///< receives standard (non-DST) offset for TZ GZones* g, TDebugLogger* aLog= NULL ); // ---- utility functions --------------------------------------------------------- /*! parsing: * Get the string between "BEGIN:\n" and "END:\n" * Default: First occurance */ string VStr( const string &aStr, const string &value, sInt32 aNth= 1 ); /*! parsing: * Get the value between ":" and "\n" */ string VValue( const string &aStr, const string &key ); /*! Get the hour/minute string of */ string HourMinStr( int bias ); } // namespace sysync #endif // VTIMEZONE_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/0000755000373300037200000000000012424517753023346 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/0000755000373300037200000000000012424517753025776 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/demo/0000755000373300037200000000000012424517753026722 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/demo/DLL/0000755000373300037200000000000012424517753027335 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/demo/DLL/target_options.h0000644000373300037200000000141012424517753032543 0ustar00nightlyallusers00000000000000/* * File: target_options.h * * Author: Beat Forster (bfo@synthesis.ch) * * Programming interface between Synthesis SyncML engine * and a database structure. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #ifndef TARGET_OPTIONS_H #define TARGET_OPTIONS_H /* - find out target platform */ #ifdef __MACH__ #define MACOSX #else #if defined __MWERKS__ || defined _MSC_VER #ifndef _WIN32 #define _WIN32 #endif #else #define LINUX #endif #endif /* code is running within DLL */ #define SDK_DLL 1 /* - we are not at the SyncML engine's side here */ /* - and we need an extern "C" interface for the DLL */ #undef SYSYNC_ENGINE /* activate debug output */ #define SYDEBUG 2 #endif /* TARGET_OPTIONS_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/demo/sync_dbapi_demo.c0000644000373300037200000007246612424517753032224 0ustar00nightlyallusers00000000000000/* * File: sync_dbapi_demo.c * * Author: Beat Forster (bfo@synthesis.ch) * * * Programming interface between Synthesis SyncML engine * and a database structure. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * * E X A M P L E C O D E * ======================== * (To be used as starting point for SDK development. * It can be adapted and extended by programmer) * */ #include "sync_include.h" /* include general SDK definitions */ #include "sync_dbapidef.h" /* include the interface file and utilities */ #include "SDK_util.h" /* include SDK utilities */ /* C/C++ support */ #ifdef __cplusplus /* this allows to have more than one of these modules in C++ */ namespace SDK_demodb { using sysync::SDK_Interface_Struct; using sysync::DB_Callback; using sysync::ItemID; using sysync::MapID; using sysync::LOCERR_OK; using sysync::LOCERR_NOTIMP; using sysync::DB_Full; using sysync::DB_NotFound; using sysync::DB_Forbidden; using sysync::ReadNextItem_Changed; using sysync::ReadNextItem_Unchanged; using sysync::ReadNextItem_EOF; using sysync::Password_ClrText_IN; #endif #include "sync_dbapi.h" /* include the interface file and utilities */ #define BuildNumber 0 /* User defined build number, can be 0..255 */ #define MyDB "DemoDB" /* example debug name */ #define MY_ID 42 /* example datastore context */ #define STRLEN 80 /* Max length of local string copies */ #if defined MACOSX && defined __MWERKS__ #pragma export on #endif /* -- MODULE -------------------------------------------------------------------- */ /* this is an example, how a context could be structured */ /**** CAN BE ADAPTED BY USER ****/ #ifdef __cplusplus class ModuleContext { public: ModuleContext() { fCB= NULL; } DB_Callback fCB; /* callback structure */ char fModuleName[ STRLEN ]; /* the module's name */ }; #else typedef struct { DB_Callback fCB; /* callback structure */ char fModuleName[ STRLEN ]; /* the module's name */ } ModuleContext; #endif /* will be casted to the ModuleContext* structure */ static ModuleContext* MoC( CContext mContext ) { return (ModuleContext*)mContext; } TSyError Module_CreateContext( CContext *mContext, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB ) { cAppCharP sep= ""; ModuleContext* mc; #ifdef __cplusplus mc= new ModuleContext; #else mc= (ModuleContext*)malloc( sizeof(ModuleContext) ); #endif if (mc==NULL) return DB_Full; if (subName!=NULL && *subName!='\0') sep= "!"; /* Notation: "!" */ strncpy ( mc->fModuleName, moduleName, STRLEN ); mc->fCB = mCB; DEBUG_DB( mc->fCB, MyDB,Mo_CC, "'%s%s%s' (%s)", mc->fModuleName,sep,subName, mContextName ); *mContext= (CContext)mc; /* return the created context structure */ return LOCERR_OK; } /* Module_CreateContext */ /* Get the plug-in's version number */ CVersion Module_Version( CContext mContext ) { CVersion v= Plugin_Version( BuildNumber ); /* The current plugin's SDK version is expected here */ if ( mContext ) DEBUG_DB( MoC( mContext )->fCB, MyDB,Mo_Ve, "%08X", v ); return v; } /* Module_Version */ /* Get the plug-in's capabilities */ TSyError Module_Capabilities( CContext mContext, appCharP *mCapabilities ) { char s[ 256 ]; /* copy it into a local string */ char* p= s; /* return value of sprintf contains the total string length: increment will concatenate */ p+= sprintf( p, "%s\n", MyPlatform() ); p+= sprintf( p, "%s\n", DLL_Info ); p+= sprintf( p, "%s:%s\n", CA_MinVersion, "V1.0.6.0" ); /* must not be changed */ p+= sprintf( p, "%s:%s\n", CA_Manufacturer, "Synthesis AG" ); /**** SHOULD BE ADAPTED BY USER ****/ p+= sprintf( p, "%s:%s", CA_Description, "Demo Example Module" ); /**** SHOULD BE ADAPTED BY USER ****/ *mCapabilities= StrAlloc( s ); DEBUG_DB( MoC( mContext )->fCB, MyDB,Mo_Ca, "'%s'", *mCapabilities ); return LOCERR_OK; } /* Module_Capabilities */ TSyError Module_PluginParams( CContext mContext, cAppCharP mConfigParams, CVersion engineVersion ) { ModuleContext* mc= MoC( mContext ); DEBUG_DB ( mc->fCB, MyDB,Mo_PP, " Engine=%08X", engineVersion ); DEBUG_DB ( mc->fCB, MyDB,Mo_PP, "'%s'", mConfigParams ); /*return LOCERR_CFGPARSE;*/ /* if there are unsupported params */ return LOCERR_OK; } /* Module_PluginParams */ /* Dispose the memory of the module context */ void Module_DisposeObj( CContext mContext, void* memory ) { DEBUG_Exotic_DB( MoC( mContext )->fCB, MyDB,Mo_DO, "free at %08X '%s'", memory,memory ); StrDispose( memory ); } /* Module_DisposeObj */ TSyError Module_DeleteContext( CContext mContext ) { ModuleContext* mc= MoC( mContext ); DEBUG_DB ( mc->fCB, MyDB,Mo_DC, "'%s'", mc->fModuleName ); #ifdef __cplusplus delete mc; #else free ( mc ); #endif return LOCERR_OK; } /* Module_DeleteContext */ /* ---------------------- session handling --------------------- */ /* this is an example, how a context could be structured */ /**** CAN BE ADAPTED BY USER ****/ #ifdef __cplusplus class SessionContext { public: SessionContext() { fCB= NULL; } int fID; /* a reference number. */ DB_Callback fCB; /* callback structure */ int fPMode; /* The login password mode */ }; #else typedef struct { int fID; /* a reference number. */ DB_Callback fCB; /* callback structure */ int fPMode; /* The login password mode */ } SessionContext; #endif /* will be casted to the SessionContext* structure */ static SessionContext* SeC( CContext sContext ) { return (SessionContext*)sContext; } /* Create a context for a new session */ TSyError Session_CreateContext( CContext *sContext, cAppCharP sessionName, DB_Callback sCB ) { SessionContext* sc; /*return DB_Error;*/ /* added for test */ #ifdef __cplusplus sc= new SessionContext; #else sc= (SessionContext*)malloc( sizeof(SessionContext) ); #endif if (sc==NULL) return DB_Full; /**** CAN BE ADAPTED BY USER ****/ sc->fID= 333; /* as an example */ sc->fCB= sCB; sc->fPMode= Password_ClrText_IN; /* take this mode ... */ /* sc->fPMode= Password_ClrText_OUT; */ /* ... or this */ DEBUG_DB( sc->fCB, MyDB,Se_CC, "%d '%s'", sc->fID,sessionName ); *sContext= (CContext)sc; /* return the created context structure */ return LOCERR_OK; } /* Session_CreateContext */ /* ----- "script-like" ADAPT --------- */ TSyError Session_AdaptItem( CContext sContext, appCharP *sItemData1, appCharP *sItemData2, appCharP *sLocalVars, uInt32 sIdentifier ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,"Session_AdaptItem", "'%s' '%s' '%s' id=%d", *sItemData1,*sItemData2,*sLocalVars, sIdentifier ); return LOCERR_OK; } /* Session_AdaptItem */ /* Check the database entry of and return its nonce string */ TSyError Session_CheckDevice( CContext sContext, cAppCharP aDeviceID, appCharP *sDevKey, appCharP *nonce ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); *sDevKey= StrAlloc( aDeviceID ); *nonce = StrAlloc( "xyz_last" ); DEBUG_DB( sc->fCB, MyDB,Se_CD, "%d dev='%s' nonce='%s'", sc->fID, *sDevKey,*nonce ); return LOCERR_OK; } /* Session_CheckDevice */ /* Get a new nonce from the database. If this returns an error, the SyncML engine * will create its own nonce. */ TSyError Session_GetNonce( CContext sContext, appCharP *nonce ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_GN, "%d (not supported)", sc->fID ); *nonce= NULL; return DB_NotFound; } /* Session_GetNonce */ /* Save the new nonce (which will be expected to be returned * in the next session for this device */ TSyError Session_SaveNonce( CContext sContext, cAppCharP nonce ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_SN, "%d nonce='%s'", sc->fID, nonce ); return LOCERR_OK; } /* Session_SaveNonce */ /* Save the device info of */ TSyError Session_SaveDeviceInfo( CContext sContext, cAppCharP aDeviceInfo ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_SD, "%d info='%s'", sc->fID, aDeviceInfo ); return LOCERR_OK; } /* Session_SaveDeviceInfo */ /* Get the plugin's DB time */ TSyError Session_GetDBTime( CContext sContext, appCharP *currentDBTime ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_GT, "%d", sc->fID ); *currentDBTime= NULL; return DB_NotFound; } /* Session_GetDBTime */ /* Return: Password_ClrText_IN 'SessionLogin' will get clear text password * Password_ClrText_OUT " must return clear text password * Password_MD5_OUT " must return MD5 coded password * Password_MD5_Nonce_IN " will get MD5B64(MD5B64(user:pwd):nonce) */ sInt32 Session_PasswordMode( CContext sContext ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_PM, "%d mode=%d", sc->fID, sc->fPMode ); return sc->fPMode; } /* Session_PasswordMode */ /* Make login */ TSyError Session_Login( CContext sContext, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); TSyError err= DB_Forbidden; /* default */ /* different modes, choose one for the plugin */ if (sc->fPMode==Password_ClrText_IN) { if (strcmp( sUsername,"super" )==0 && strcmp( *sPassword,"user" )==0) { *sUsrKey = StrAlloc( "1234" ); err= LOCERR_OK; } } else { /* Password will be returned */ if (strcmp( sUsername,"super" )==0) { *sPassword= StrAlloc( "user" ); *sUsrKey = StrAlloc( "1234" ); err= LOCERR_OK; } } /* if */ if (err) { DEBUG_DB( sc->fCB, MyDB,Se_LI, "%d usr='%s' err=%d", sc->fID,sUsername, err ); } else DEBUG_DB( sc->fCB, MyDB,Se_LI, "%d usr='%s' pwd='%s' => key='%s'", sc->fID,sUsername,*sPassword, *sUsrKey ); return err; } /* Session_Login */ /* Make logout */ TSyError Session_Logout( CContext sContext ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_LO, "%d",sc->fID ); return LOCERR_OK; } /* Session_Logout */ void Session_DisposeObj( CContext sContext, void* memory ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_Exotic_DB( sc->fCB, MyDB,Se_DO, "%d free at %08X '%s'", sc->fID, memory,memory ); StrDispose ( memory ); } /* Session_DisposeObj */ /* Can be implemented empty, if no action is required */ void Session_ThreadMayChangeNow( CContext sContext ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_Exotic_DB( sc->fCB, MyDB,Se_TC, "%d",sc->fID ); } /* Session_ThreadMayChangeNow */ /* This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. Can be implemented empty, if not needed */ void Session_DispItems( CContext sContext, bool allFields, cAppCharP specificItem ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_DI, "%d %d '%s'", sc->fID, allFields,specificItem ); } /* Session_DispItems */ /* Delete a session context */ TSyError Session_DeleteContext( CContext sContext ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_DC, "%d",sc->fID ); #ifdef __cplusplus delete sc; #else free ( sc ); #endif return LOCERR_OK; } /* Session_DeleteContext */ /* ----------------------------------------------------------------- */ /* This is an example, how a context could be structured */ /**** CAN BE ADAPTED BY USER ****/ #ifdef __cplusplus class TDBContext { public: TDBContext() { fCB= NULL; } DB_Callback fCB; /* debug logging callback */ int contextID; /* context identifier */ int nthItem; /* for 'ReadNextItem' */ char fDevKey[ STRLEN ]; char fUsrKey[ STRLEN ]; }; #else typedef struct { DB_Callback fCB; /* debug logging callback */ int contextID; /* context identifier */ int nthItem; /* for 'ReadNextItem' */ char fDevKey[ STRLEN ]; char fUsrKey[ STRLEN ]; } TDBContext; #endif typedef TDBContext* ContextP; /* will be casted to the ContextP structure */ static ContextP DBC( CContext aContext ) { return (ContextP)aContext; } /* -- OPEN ----------------------------------------------------------------------- */ TSyError CreateContext( CContext *aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ) { ContextP ac; #ifdef __cplusplus ac= new TDBContext; #else ac= (ContextP)malloc( sizeof(TDBContext) ); #endif if (ac==NULL) return DB_Full; /**** CAN BE ADAPTED BY USER ****/ ac->fCB = aCB; /* debug logging callback */ ac->contextID= MY_ID; /* example context */ ac->nthItem = 0; /* reset counter */ strncpy ( ac->fDevKey, sDevKey, STRLEN ); /* local copies */ strncpy ( ac->fUsrKey, sUsrKey, STRLEN ); DEBUG_DB( ac->fCB, MyDB,Da_CC, "%d '%s' dev='%s' usr='%s'", ac->contextID, aContextName, ac->fDevKey, ac->fUsrKey ); *aContext= (CContext)ac; /* return the created context structure */ return LOCERR_OK; } /* CreateContext */ uInt32 ContextSupport( CContext aContext, cAppCharP aContextRules ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_CS, "%d '%s'", ac->contextID,aContextRules ); return 0; } /* ContextSupport */ uInt32 FilterSupport( CContext aContext, cAppCharP aFilterRules ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_FS, "%d '%s'", ac->contextID,aFilterRules ); return 0; } /* FilterSupport */ /* -- ADMINISTRATION ------------------------------------------------------------ */ TSyError LoadAdminData( CContext aContext, cAppCharP aLocDB, cAppCharP aRemDB, appCharP *adminData ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_LA, "%d '%s' '%s' '%s' '%s'", ac->contextID, ac->fDevKey, ac->fUsrKey, aLocDB, aRemDB ); *adminData= NULL; return DB_Forbidden; /* not yet implemented */ } /* LoadAdminData */ TSyError LoadAdminDataAsKey( CContext aContext, cAppCharP aLocDB, cAppCharP aRemDB, KeyH adminKey ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_LA, "%d '%s' '%s' '%s' '%s' adminKey=%08X", ac->contextID, ac->fDevKey, ac->fUsrKey, aLocDB, aRemDB, adminKey ); return DB_Forbidden; /* not yet implemented */ } /* LoadAdminDataAsKey */ TSyError SaveAdminData( CContext aContext, cAppCharP adminData ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_SA, "%d '%s'", ac->contextID, adminData ); return DB_Forbidden; /* not yet implemented */ } /* SaveAdminData */ TSyError SaveAdminDataAsKey( CContext aContext, KeyH adminKey ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_SA, "%d adminKey=%08X", ac->contextID, adminKey ); return DB_Forbidden; /* not yet implemented */ } /* SaveAdminDataAsKey */ bool ReadNextMapItem( CContext aContext, MapID mID, bool aFirst ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB, Da_RM, "%d %08X first=%d (EOF)", ac->contextID, mID, aFirst ); return false; /* not yet implemented */ } /* ReadNextMapItem */ TSyError InsertMapItem( CContext aContext, cMapID mID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_IM, "%d %08X: '%s' '%s' %04X %d", ac->contextID, mID, mID->localID, mID->remoteID, mID->flags, mID->ident ); return DB_Forbidden; /* not yet implemented */ } /* InsertMapItem */ TSyError UpdateMapItem( CContext aContext, cMapID mID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_UM, "%d %08X: '%s' '%s' %04X %d", ac->contextID, mID, mID->localID, mID->remoteID, mID->flags, mID->ident ); return DB_Forbidden; /* not yet implemented */ } /* UpdateMapItem */ TSyError DeleteMapItem( CContext aContext, cMapID mID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DM, "%d %08X: '%s' '%s' %04X %d", ac->contextID, mID, mID->localID, mID->remoteID, mID->flags, mID->ident ); return DB_Forbidden; /* not yet implemented */ } /* DeleteMapItem */ /* -- GENERAL -------------------------------------------------------------------- */ void DisposeObj( CContext aContext, void* memory ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_Exotic_DB( ac->fCB, MyDB,Da_DO, "%d free at %08X", ac->contextID,memory ); free( memory ); } /* DisposeObj */ void ThreadMayChangeNow( CContext aContext ) { /**** CAN BE ADAPTED BY USER ****/ /* can be implemented empty, if no action is required */ ContextP ac= DBC( aContext ); DEBUG_Exotic_DB( ac->fCB, MyDB,Da_TC, "%d", ac->contextID ); } /* ThreadMayChangeNow */ void WriteLogData( CContext aContext, cAppCharP logData ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB, Da_WL, "%d (BEGIN)\n%s", ac->contextID, logData ); DEBUG_DB( ac->fCB, MyDB, Da_WL, "%d (END)", ac->contextID ); } /* WriteLogData */ /* This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. Can be implemented empty, if not needed */ void DispItems( CContext aContext, bool allFields, cAppCharP specificItem ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DI, "%d %d '%s'", ac->contextID,allFields,specificItem ); } /* DispItems */ /* ----- "script-like" ADAPT --------- */ TSyError AdaptItem( CContext aContext, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, uInt32 aIdentifier ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,"AdaptItem", "'%s' '%s' '%s' id=%d", *aItemData1,*aItemData2,*aLocalVars, aIdentifier ); return LOCERR_OK; } /* AdaptItem */ /* -- READ ---------------------------------------------------------------------- */ TSyError StartDataRead( CContext aContext, cAppCharP lastToken, cAppCharP resumeToken ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_SR, "%d last='%s' resume='%s'", ac->contextID, lastToken,resumeToken ); ac->nthItem= 0; /* reset counter */ return LOCERR_OK; } /* StartDataRead */ TSyError ReadNextItem( CContext aContext, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); if (aFirst) ac->nthItem= 0; /* Show all visible items to the SyncML engine here */ /* "ReadNextItem" will be called subsequently until ReadNextItem_EOF is returned */ if (ac->nthItem>0) { *aStatus= ReadNextItem_EOF; DEBUG_DB( ac->fCB, MyDB,Da_RN, "%d aStatus=%d", ac->contextID, *aStatus ); return LOCERR_OK; } /* if */ /* This example just shows one hard coded element */ aID->item = StrAlloc( "demo_ID" ); aID->parent= StrAlloc( "demo_parent" ); *aItemData = StrAlloc( "demo_data" ); *aStatus = ReadNextItem_Changed; /* comparison not implemented here */ ac->nthItem++; DEBUG_DB( ac->fCB, MyDB,Da_RN, "%d aStatus=%d aItemData='%s' aID=(%s,%s)", ac->contextID, *aStatus, *aItemData, aID->item,aID->parent ); return LOCERR_OK; } /* ReadNextItem */ TSyError ReadNextItemAsKey( CContext aContext, ItemID aID, KeyH aItemKey, sInt32* aStatus, bool aFirst ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); if (aFirst) ac->nthItem= 0; /* Show all visible items to the SyncML engine here */ /* "ReadNextItemAsKey" will be called subsequently until ReadNextItem_EOF is returned */ if (ac->nthItem>0) { *aStatus= ReadNextItem_EOF; DEBUG_DB( ac->fCB, MyDB,Da_RNK, "%d aStatus=%d", ac->contextID, *aStatus ); return LOCERR_OK; } /* if */ /* This example just shows one hard coded element */ aID->item = StrAlloc( "demo_ID" ); aID->parent= StrAlloc( "demo_parent" ); *aStatus = ReadNextItem_Changed; /* comparison not implemented here */ ac->nthItem++; DEBUG_DB( ac->fCB, MyDB,Da_RNK, "%d aStatus=%d aItemKey=%08X aID=(%s,%s)", ac->contextID, *aStatus, aItemKey, aID->item,aID->parent ); return LOCERR_OK; } /* ReadNextItemAsKey */ TSyError ReadItem( CContext aContext, cItemID aID, appCharP *aItemData ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); *aItemData= StrAlloc( "demo_data" ); DEBUG_DB( ac->fCB, MyDB,Da_RI, "%d aItemData='%s' aID=(%s,%s)", ac->contextID,*aItemData, aID->item,aID->parent ); return LOCERR_OK; } /* ReadItem */ TSyError ReadItemAsKey( CContext aContext, cItemID aID, KeyH aItemKey ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_RIK, "%d aItemKey=%08X aID=(%s,%s)", ac->contextID, aItemKey, aID->item,aID->parent ); return LOCERR_OK; } /* ReadItemAsKey */ TSyError ReadBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer *aBlkPtr, memSize *aBlkSize, memSize *aTotSize, bool aFirst, bool *aLast ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); const memSize sz= sizeof(int); int* ip = (int*)malloc( sz ); /* example BLOB structure for test (=4 bytes) */ *ip = 231; *aBlkPtr = (appPointer)ip; if (*aBlkSize==0 || *aBlkSize>=sz) *aBlkSize= sz; *aTotSize= *aBlkSize; *aLast = true; DEBUG_DB( ac->fCB, MyDB,Da_RB, "%d aID=(%s,%s) aBlobID=(%s)", ac->contextID, aID->item,aID->parent, aBlobID ); DEBUG_DB( ac->fCB, MyDB,"", "aBlkPtr=%08X aBlkSize=%d aTotSize=%d aFirst=%s aLast=%s", *aBlkPtr, *aBlkSize, *aTotSize, aFirst?"true":"false", *aLast?"true":"false" ); return LOCERR_OK; } /* ReadBlob */ TSyError EndDataRead( CContext aContext ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_ER, "%d", ac->contextID ); return LOCERR_OK; } /* EndDataRead */ /* -- WRITE --------------------------------------------------------------------- */ TSyError StartDataWrite( CContext aContext ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_SW, "%d", ac->contextID ); return LOCERR_OK; } /* StartDataWrite */ TSyError InsertItem( CContext aContext, cAppCharP aItemData, ItemID newID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); newID->item = StrAlloc( "hello" ); DEBUG_DB( ac->fCB, MyDB,Da_II, "%d '%s'\nnewID=(%s,%s)", ac->contextID, aItemData, newID->item,newID->parent ); return LOCERR_OK; } /* InsertItem */ TSyError InsertItemAsKey( CContext aContext, KeyH aItemKey, ItemID newID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_IIK, "%d %08X\n", ac->contextID, aItemKey ); newID= NULL; return LOCERR_NOTIMP; } /* InsertItemAsKey */ TSyError UpdateItem( CContext aContext, cAppCharP aItemData, cItemID aID, ItemID updID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); if (strcmp( aID->item,"example" )!=0) updID->item = StrAlloc( "example" ); DEBUG_DB( ac->fCB, MyDB,Da_UI, "%d '%s'\naID=(%s,%s)", ac->contextID, aItemData, aID->item,aID->parent ); if (updID->item==NULL) { DEBUG_DB( ac->fCB, MyDB,"", "NULL" ); } else { DEBUG_DB( ac->fCB, MyDB,"", "updID=(%s,%s)", updID->item,updID->parent ); } return LOCERR_OK; } /* UpdateItem */ TSyError UpdateItemAsKey( CContext aContext, KeyH aItemKey, cItemID aID, ItemID updID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_UIK, "%d %08X\naID=(%s,%s)", ac->contextID, aItemKey, aID->item,aID->parent ); updID= NULL; return LOCERR_NOTIMP; } /* UpdateItemAsKey */ TSyError MoveItem( CContext aContext, cItemID aID, cAppCharP newParID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_MvI, "%d aID=(%s,%s) => (%s,%s)", ac->contextID, aID->item,aID->parent, aID->item,newParID ); return LOCERR_OK; } /* MoveItem */ TSyError DeleteItem( CContext aContext, cItemID aID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DeI, "%d aID=(%s,%s)", ac->contextID,aID->item,aID->parent ); return LOCERR_OK; } /* DeleteItem */ TSyError FinalizeLocalID( CContext aContext, cItemID aID, ItemID updID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_FLI, "%d aID=(%s,%s)", ac->contextID,aID->item,aID->parent ); updID= NULL; return LOCERR_NOTIMP; } /* FinalizeLocalID */ TSyError DeleteSyncSet( CContext aContext ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DSS, "%d", ac->contextID ); return LOCERR_NOTIMP; } /* DeleteSyncSet */ TSyError WriteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_WB, "%d aID=(%s,%s) aBlobID=(%s)", ac->contextID, aID->item,aID->parent, aBlobID ); DEBUG_DB( ac->fCB, MyDB,"", "aBlkPtr=%08X aBlkSize=%d aTotSize=%d aFirst=%s aLast=%s", aBlkPtr, aBlkSize, aTotSize, aFirst?"true":"false", aLast ?"true":"false" ); return LOCERR_OK; } /* WriteBlob */ TSyError DeleteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DB, "%d aID=(%s,%s) aBlobID=(%s)", ac->contextID, aID->item,aID->parent, aBlobID ); return LOCERR_OK; } /* DeleteBlob */ TSyError EndDataWrite( CContext aContext, bool success, appCharP *newToken ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); #define TokenExample "20041110T230000Z" *newToken= StrAlloc( TokenExample ); DEBUG_DB( ac->fCB, MyDB,Da_EW, "%d %s '%s'", ac->contextID, success ? "COMMIT":"ROLLBACK", *newToken ); return LOCERR_OK; } /* EndDataWrite */ /* ----------------------------------- */ TSyError DeleteContext( CContext aContext ) { /**** CAN BE ADAPTED BY USER ****/ ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DC, "%d", ac->contextID ); #ifdef __cplusplus delete ac; #else free ( ac ); /* release the structure itself */ #endif return LOCERR_OK; } /* DeleteContext */ /* C/C++ support */ #ifdef __cplusplus } /* namespace */ #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/0000755000373300037200000000000012424517753030025 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/DLL/0000755000373300037200000000000012424517753030440 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/DLL/target_options.h0000644000373300037200000000171312424517753033654 0ustar00nightlyallusers00000000000000/* * File: target_options.h * * Author: Beat Forster (bfo@synthesis.ch) * * Programming interface between Synthesis SyncML engine * and a database structure. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #ifndef TARGET_OPTIONS_H #define TARGET_OPTIONS_H /* - find out target platform */ #ifdef __MACH__ #define MACOSX #else #if defined __MWERKS__ || defined _MSC_VER #ifndef _WIN32 #define _WIN32 #endif #ifndef WIN32 #define WIN32 #endif #else #define LINUX #endif #endif /* code is running within DLL */ #define SDK_DLL 1 /* - we are not at the SyncML engine's side here */ /* - and we need an extern "C" interface for the DLL */ #undef SYSYNC_ENGINE /* activate debug output */ #define SYDEBUG 2 /* use internal BLOB and ADMIN implementation */ //#define DISABLE_PLUGIN_DATASTOREADMIN 1 //#define DISABLE_PLUGIN_BLOBS 1 #endif /* TARGET_OPTIONS_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/myadapter.h0000644000373300037200000000106612424517753032167 0ustar00nightlyallusers00000000000000/* * File: myadapter.h * * Author: Beat Forster (bfo@synthesis.ch) * * This bridge allows a OceanBlue module * which needn't to be changed for different * DBApi database adapters * * Copyright (c) 2008-2011 by Synthesis AG + plan44.ch * */ #ifndef MYADAPTER_H #define MYADAPTER_H //*** defs used for unified OceanBlue *** #define MyAdapter_Name "SnowWhite" #define MyAdapter_Module SnowWhite_Module #define MyAdapter_Session SnowWhite_Session #define MyAdapter SnowWhite #include "snowwhite.h" #endif // MYADAPTER_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.cpp0000644000373300037200000010354512424517753032476 0ustar00nightlyallusers00000000000000/* * File: oceanblue.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * datastore plugin interface and * Base class for datastore plugins in C++ * * Copyright (c) 2008-2011 by Synthesis AG + plan44.ch * */ #include "myadapter.h" namespace oceanblue { using sysync::SDK_Interface_Struct; using sysync::DB_Callback; using sysync::ItemID; using sysync::MapID; using sysync::LOCERR_OK; using sysync::LOCERR_NOTIMP; using sysync::LOCERR_TRUNCATED; using sysync::DB_Forbidden; using sysync::DB_NotFound; using sysync::DB_Full; using sysync::Password_Mode_Undefined; using sysync::ReadNextItem_EOF; using sysync::VP_GlobMulti; using sysync::VALTYPE_TEXT; using sysync::VALTYPE_INT16; using sysync::VALTYPE_INT32; using sysync::Manufacturer; using sysync::Description; using sysync::MinVersion; using sysync::YesField; using sysync::IsAdmin; #include "sync_dbapi.h" // include the interface file and utilities #define MyDB "OceanBlue" // example debug name /* ----- OceanBlue MODULE --------------------------------------------------------- */ TSyError OceanBlue_Module::CreateContext( cAppCharP subName ) { DEBUG_DB( fCB, MyDB,Mo_CC, "'%s' mod='%s' sub='%s'", fContextName.c_str(), fModName.c_str(), subName ); return LOCERR_OK; } // CreateContext CVersion OceanBlue_Module::Version() { return Plugin_Version( 0 ); } TSyError OceanBlue_Module::Capabilities( appCharP &capa ) { string s = MyPlatform(); s+= '\n'; s+= DLL_Info; Manufacturer ( s, "Synthesis AG" ); Description ( s, "OceanBlue Adapter" ); MinVersion ( s, VP_GlobMulti ); // at least V1.5.1 YesField ( s, CA_ADMIN_Info ); // show "ADMIN" info capa= StrAlloc( s.c_str() ); return LOCERR_OK; } // Capabilities TSyError OceanBlue_Module::PluginParams ( cAppCharP /* mConfigParams */, // ignore CVersion /* engineVersion */ ) { return LOCERR_OK; } void OceanBlue_Module::DisposeObj( void* memory ) { StrDispose( memory ); } TSyError OceanBlue_Module::DeleteContext() { DEBUG_DB( fCB, MyDB,Mo_DC, "'%s'", fContextName.c_str() ); return LOCERR_OK; } // DeleteContext /* ----- OceanBlue SESSION -------------------------------------------------------- */ TSyError OceanBlue_Session::CreateContext() { DEBUG_DB( fCB, MyDB,Se_CC, "session='%s'", fSessionName.c_str() ); return LOCERR_OK; } // CreateContext // -- device TSyError OceanBlue_Session::CheckDevice( cAppCharP /* aDeviceID */, appCharP &sDevKey, appCharP &nonce ) { sDevKey= StrAlloc( "key" ); nonce = StrAlloc( "nonce" ); return LOCERR_OK; } // CheckDevice TSyError OceanBlue_Session::GetNonce ( appCharP& /* nonce */ ) { return DB_NotFound; } TSyError OceanBlue_Session::SaveNonce ( cAppCharP /* nonce */ ) { return LOCERR_OK; } TSyError OceanBlue_Session::SaveDeviceInfo( cAppCharP /* aDeviceInfo */ ) { return LOCERR_OK; } TSyError OceanBlue_Session::GetDBTime ( appCharP& /* currDBTime */ ) { return DB_NotFound; } // -- login sInt32 OceanBlue_Session::PasswordMode() { return Password_Mode_Undefined; } TSyError OceanBlue_Session::Login ( cAppCharP /* sUsername */, appCharP& /* sPassword */, appCharP& /* sUsrKey */ ) { return DB_Forbidden; } TSyError OceanBlue_Session::Logout() { return LOCERR_OK; } // -- general void OceanBlue_Session::DisposeObj( void* memory ) { StrDispose( memory ); } void OceanBlue_Session::ThreadMayChangeNow() { } void OceanBlue_Session::DispItems( bool /* allFields */, cAppCharP /* specificItem */ ) { } TSyError OceanBlue_Session::Adapt_Item( appCharP& /* sItemData1 */, appCharP& /* sItemData2 */, appCharP& /* sLocalVars */, uInt32 /* sIdentifier */ ) { return LOCERR_OK; } TSyError OceanBlue_Session::DeleteContext() { DEBUG_DB( fCB, MyDB,Se_DC, "session='%s'", fSessionName.c_str() ); return LOCERR_OK; } // DeleteContext /* ----- OceanBlue DATASTORE ------------------------------------------------------ */ TSyError OceanBlue::CreateContext ( cAppCharP sDevKey, cAppCharP sUsrKey ) { DEBUG_DB( fCB, MyDB,Da_CC, "'%s' (%s) dev='%s' usr='%s'", fContextName.c_str(), fAsAdmin?"admin":"data", sDevKey,sUsrKey ); #ifndef DISABLE_PLUGIN_DATASTOREADMIN fAdmin.Init( fCB, MyDB, "", fContextName, sDevKey,sUsrKey ); #endif #ifndef DISABLE_PLUGIN_BLOBS fBlob.Init ( fCB, MyDB, "", fContextName, sDevKey,sUsrKey ); #endif fNthItem= 0; // initialize it return LOCERR_OK; } // CreateContext uInt32 OceanBlue::ContextSupport( cAppCharP /* aContextRules */ ) { return 0; } uInt32 OceanBlue::FilterSupport ( cAppCharP /* aFilterRules */ ) { return 0; } // -- admin #ifndef DISABLE_PLUGIN_DATASTOREADMIN TSyError OceanBlue::LoadAdminData ( cAppCharP aLocDB, cAppCharP aRemDB, appCharP &adminData ) { return fAdmin.LoadAdminData ( aLocDB, aRemDB, &adminData ); } // LoadAdminData TSyError OceanBlue::LoadAdminDataAsKey( cAppCharP /* aLocDB */, cAppCharP /* aRemDB */, KeyH /* adminKey */ ) { return LOCERR_NOTIMP; } // LoadAdminDataAsKey TSyError OceanBlue::SaveAdminData ( cAppCharP adminData ) { return fAdmin.SaveAdminData ( adminData ); } // SaveAdminData TSyError OceanBlue::SaveAdminDataAsKey( KeyH /* adminKey */ ) { return LOCERR_NOTIMP; } // SaveAdminDataAsKey bool OceanBlue::ReadNextMapItem ( MapID mID, bool aFirst ) { return fAdmin.ReadNextMapItem ( mID, aFirst ); } // ReadNextMapItem TSyError OceanBlue::InsertMapItem ( cMapID mID ) { return fAdmin.InsertMapItem ( mID ); } // InsertMapItem TSyError OceanBlue::UpdateMapItem ( cMapID mID ) { return fAdmin.UpdateMapItem ( mID ); } // UpdateMapItem TSyError OceanBlue::DeleteMapItem ( cMapID mID ) { return fAdmin.DeleteMapItem ( mID ); } // DeleteMapItem #else TSyError OceanBlue::LoadAdminData ( cAppCharP /* aLocDB */, cAppCharP /* aRemDB */, appCharP& /* adminData */ ) { return DB_Forbidden; } TSyError OceanBlue::LoadAdminDataAsKey( cAppCharP /* aLocDB */, cAppCharP /* aRemDB */, KeyH /* adminKey */ ) { return DB_Forbidden; } TSyError OceanBlue::SaveAdminData ( cAppCharP /* adminData */ ) { return DB_Forbidden; } TSyError OceanBlue::SaveAdminDataAsKey ( KeyH /* adminKey */ ) { return DB_Forbidden; } bool OceanBlue::ReadNextMapItem ( MapID /* mID */, bool /* aFirst */ ) { return false; } TSyError OceanBlue::InsertMapItem ( cMapID /* mID */ ) { return DB_Forbidden; } TSyError OceanBlue::UpdateMapItem ( cMapID /* mID */ ) { return DB_Forbidden; } TSyError OceanBlue::DeleteMapItem ( cMapID /* mID */ ) { return DB_Forbidden; } #endif // -- read TSyError OceanBlue::StartDataRead ( cAppCharP /* lastToken */, cAppCharP /* resumeToken */ ) { return LOCERR_OK; } TSyError OceanBlue::ReadNextItem ( ItemID /* aID */, appCharP& /* aItemData */, sInt32 &aStatus, bool /* aFirst */ ) { aStatus= ReadNextItem_EOF; return LOCERR_OK; } TSyError OceanBlue::ReadNextItemAsKey( ItemID /* aID */, KeyH /* aItemKey */, sInt32 &aStatus, bool /* aFirst */ ) { aStatus= ReadNextItem_EOF; return LOCERR_OK; } TSyError OceanBlue::ReadItem ( cItemID /* aID */, appCharP& /* aItemData */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::ReadItemAsKey ( cItemID /* aID */, KeyH /* aItemKey */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::EndDataRead() { return LOCERR_OK; } // -- write TSyError OceanBlue::StartDataWrite() { return LOCERR_OK; } TSyError OceanBlue::InsertItem ( cAppCharP /* aItemData */, ItemID /* newID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::InsertItemAsKey ( KeyH /* aItemKey */, ItemID /* newID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::UpdateItem ( cAppCharP /* aItemData */, cItemID /* aID */, ItemID /* updID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::UpdateItemAsKey ( KeyH /* aItemKey */, cItemID /* aID */, ItemID /* updID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::MoveItem ( cItemID /* aID */, cAppCharP /* newParID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::DeleteItem ( cItemID /* aID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::FinalizeLocalID ( cItemID /* aID */, ItemID /* updID */ ) { return LOCERR_NOTIMP; } TSyError OceanBlue::DeleteSyncSet() { return LOCERR_NOTIMP; } TSyError OceanBlue::EndDataWrite ( bool /* success */, appCharP& /* newToken */ ) { return LOCERR_OK; } // -- blobs TSyError OceanBlue::ReadBlob ( cItemID aID, cAppCharP aBlobID, appPointer &aBlkPtr, memSize &aBlkSize, memSize &aTotSize, bool aFirst, bool &aLast ) { #ifndef DISABLE_PLUGIN_BLOBS return fBlob.ReadBlob ( aID,aBlobID, &aBlkPtr,&aBlkSize,&aTotSize, aFirst,&aLast ); #endif return LOCERR_NOTIMP; } // ReadBlob TSyError OceanBlue::WriteBlob ( cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast ) { #ifndef DISABLE_PLUGIN_BLOBS return fBlob.WriteBlob ( aID,aBlobID, aBlkPtr,aBlkSize,aTotSize, aFirst,aLast ); #endif return LOCERR_NOTIMP; } // WriteBlob TSyError OceanBlue::DeleteBlob( cItemID aID, cAppCharP aBlobID ) { #ifndef DISABLE_PLUGIN_BLOBS return fBlob.DeleteBlob( aID,aBlobID ); #endif return LOCERR_NOTIMP; } // DeleteBlob // -- general void OceanBlue::WriteLogData ( cAppCharP /* logData */ ) { } void OceanBlue::DisposeObj ( void* /* memory */ ) { } void OceanBlue::ThreadMayChangeNow() { } void OceanBlue::DispItems ( bool /* allFields */, cAppCharP /* specificItem */ ) { } TSyError OceanBlue::Adapt_Item ( appCharP& /* aItemData1 */, appCharP& /* aItemData2 */, appCharP& /* aLocalVars */, uInt32 /* aIdentifier */ ) { return LOCERR_OK; } TSyError OceanBlue::DeleteContext() { DEBUG_DB( fCB, MyDB,Da_DC, "'%s'", fContextName.c_str() ); return LOCERR_OK; } // DeleteContext // ---- call-in functions ---- sInt32 OceanBlue::GetValueID ( KeyH aItemKey, string aValName, string suff ) { if (!fCB->ui.GetValueID) return -1; aValName+= suff; return fCB->ui.GetValueID ( fCB, aItemKey, aValName.c_str() ); } // GetValueID TSyError OceanBlue::GetValue ( KeyH aItemKey, string aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize, string suff ) { if (!fCB->ui.GetValue) return LOCERR_NOTIMP; aValName+= suff; return fCB->ui.GetValue ( fCB, aItemKey, aValName.c_str(), aValType, aBuffer, aBufSize, &aValSize ); } // GetValue TSyError OceanBlue::GetValueByID( KeyH aItemKey, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize, string suff ) { if (!fCB->ui.GetValueByID) return LOCERR_NOTIMP; AppendSuffixToID ( aItemKey, aID, suff.c_str() ); return fCB->ui.GetValueByID( fCB, aItemKey, aID, arrIndex, aValType, aBuffer, aBufSize, &aValSize ); } // GetValueByID TSyError OceanBlue::SetValue ( KeyH aItemKey, string aValName, uInt16 aValType, appPointer aBuffer, memSize aValSize, string suff ) { if (!fCB->ui.SetValue) return LOCERR_NOTIMP; aValName+= suff; return fCB->ui.SetValue ( fCB, aItemKey, aValName.c_str(), aValType, aBuffer, aValSize ); } // SetValue TSyError OceanBlue::SetValueByID( KeyH aItemKey, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aValSize, string suff ) { if (!fCB->ui.SetValueByID) return LOCERR_NOTIMP; AppendSuffixToID ( aItemKey, aID, suff.c_str() ); return fCB->ui.SetValueByID( fCB, aItemKey, aID, arrIndex, aValType, aBuffer, aValSize ); } // SetValueByID // ------------------------------------------------- void OceanBlue::AppendSuffixToID( KeyH aItemKeyH, sInt32 &aID, cAppCharP suff ) { string s= suff; if (s=="") return; s= VALNAME_FLAG + s; aID+= GetValueID( aItemKeyH, s.c_str() ); } // AppendSuffixToID // ---- convenience routines to access Get/SetValue for specific types ---- // string TSyError OceanBlue::GetStr( KeyH aItemKey, string aValName, string &aText, string suff ) { TSyError err; const uInt16 ty= VALTYPE_TEXT; const int txtFSz= 80; // a readonable string length to catch it at once char txt[ txtFSz ]; memSize txtSz; // try directly to fit in a short string first appCharP f= (char*)&txt; err= GetValue( aItemKey, aValName, ty, f, txtFSz, txtSz, suff ); bool tooShort= err==LOCERR_TRUNCATED; if (tooShort) { err= GetValue( aItemKey, aValName, ty, f, 0, txtSz, suff ); // get size f= (appCharP)malloc( txtSz+1 ); // plus NUL termination err= GetValue( aItemKey, aValName, ty, f, txtSz+1, txtSz, suff ); // no error anymore } // if if (err) aText= ""; else aText= f; // assign it if (tooShort) free( f ); // and deallocate again, if used dynamically return err; } // GetStr TSyError OceanBlue::GetStrByID( KeyH aItemKey, sInt32 aID, string &aText, sInt32 arrIndex, string suff ) { TSyError err; const uInt16 ty= VALTYPE_TEXT; const int txtFSz= 80; // a readonable string length to catch it at once char txt[ txtFSz ]; memSize txtSz; // try directly to fit in a short string first appCharP f= (char*)&txt; err= GetValueByID( aItemKey, aID,arrIndex, ty, f, txtFSz, txtSz, suff ); bool tooShort= err==LOCERR_TRUNCATED; if (tooShort) { err= GetValueByID( aItemKey, aID,arrIndex, ty, f, 0, txtSz, suff ); // get size f= (appCharP)malloc( txtSz+1 ); // plus NUL termination err= GetValueByID( aItemKey, aID,arrIndex, ty, f, txtSz+1, txtSz, suff ); // no error anymore } // if if (err) aText= ""; else aText= f; // assign it if (tooShort) free( f ); // and deallocate again, if used dynamically return err; } // GetStrByID TSyError OceanBlue::SetStr ( KeyH aItemKey, string aValName, string aText, string suff ) { // -1 automatically calculate length from null-terminated string return SetValue ( aItemKey, aValName, VALTYPE_TEXT, (appPointer)aText.c_str(), (memSize)-1, suff ); } // SetStr TSyError OceanBlue::SetStrByID( KeyH aItemKey, sInt32 aID, string aText, sInt32 arrIndex, string suff ) { // -1 automatically calculate length from null-terminated string return SetValueByID( aItemKey, aID,arrIndex, VALTYPE_TEXT, (appPointer)aText.c_str(), (memSize)-1, suff ); } // SetStrByID /* sInt16 / uInt16 */ TSyError OceanBlue::GetInt16 ( KeyH aItemKey, string aValName, sInt16 &aValue, string suff ) { memSize vSize; return GetValue ( aItemKey, aValName, VALTYPE_INT16,&aValue, sizeof(aValue),vSize, suff ); } // GetInt16 TSyError OceanBlue::GetInt16 ( KeyH aItemKey, string aValName, uInt16 &aValue, string suff ) { memSize vSize; return GetValue ( aItemKey, aValName, VALTYPE_INT16,&aValue, sizeof(aValue),vSize, suff ); } // GetInt16 TSyError OceanBlue::GetInt16ByID( KeyH aItemKey, sInt32 aID, sInt16 &aValue, sInt32 arrIndex, string suff ) { memSize vSize; return GetValueByID( aItemKey, aID,arrIndex, VALTYPE_INT16,&aValue, sizeof(aValue),vSize, suff ); } // GetInt16ByID TSyError OceanBlue::GetInt16ByID( KeyH aItemKey, sInt32 aID, uInt16 &aValue, sInt32 arrIndex, string suff ) { memSize vSize; return GetValueByID( aItemKey, aID,arrIndex, VALTYPE_INT16,&aValue, sizeof(aValue),vSize, suff ); } // GetInt16ByID TSyError OceanBlue::SetInt16 ( KeyH aItemKey, string aValName, sInt16 aValue, string suff ) { return SetValue ( aItemKey, aValName, VALTYPE_INT16,&aValue, sizeof(aValue), suff ); } // SetInt16 TSyError OceanBlue::SetInt16ByID( KeyH aItemKey, sInt32 aID, sInt16 aValue, sInt32 arrIndex, string suff ) { return SetValueByID( aItemKey, aID,arrIndex, VALTYPE_INT16,&aValue, sizeof(aValue), suff ); } // SetInt16ByID /* sInt32 / uInt32 */ TSyError OceanBlue::GetInt32 ( KeyH aItemKey, string aValName, sInt32 &aValue, string suff ) { memSize vSize; return GetValue ( aItemKey, aValName, VALTYPE_INT32,&aValue, sizeof(aValue),vSize, suff ); } // GetInt32 TSyError OceanBlue::GetInt32 ( KeyH aItemKey, string aValName, uInt32 &aValue, string suff ) { memSize vSize; return GetValue ( aItemKey, aValName, VALTYPE_INT32,&aValue, sizeof(aValue),vSize, suff ); } // GetInt32 TSyError OceanBlue::GetInt32ByID( KeyH aItemKey, sInt32 aID, sInt32 &aValue, sInt32 arrIndex, string suff ) { memSize vSize; return GetValueByID( aItemKey, aID,arrIndex, VALTYPE_INT32,&aValue, sizeof(aValue),vSize, suff ); } // GetInt32ByID TSyError OceanBlue::GetInt32ByID( KeyH aItemKey, sInt32 aID, uInt32 &aValue, sInt32 arrIndex, string suff ) { memSize vSize; return GetValueByID( aItemKey, aID,arrIndex, VALTYPE_INT32,&aValue, sizeof(aValue),vSize, suff ); } // GetInt32ByID TSyError OceanBlue::SetInt32 ( KeyH aItemKey, string aValName, sInt32 aValue, string suff ) { return SetValue ( aItemKey, aValName, VALTYPE_INT32,&aValue, sizeof(aValue), suff ); } // SetInt32 TSyError OceanBlue::SetInt32ByID( KeyH aItemKey, sInt32 aID, sInt32 aValue, sInt32 arrIndex, string suff ) { return SetValueByID( aItemKey, aID,arrIndex, VALTYPE_INT32,&aValue, sizeof(aValue), suff ); } // SetInt32ByID /* -------------------------------------------------------------------------------- */ #if defined MACOSX && defined __MWERKS__ #pragma export on #endif /* ---- MODULE -------------------------------------------------------------------- */ static MyAdapter_Module* SW_Mo( CContext mc ) { return (MyAdapter_Module*)mc; } TSyError Module_CreateContext( CContext *mc, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB ) { MyAdapter_Module* swm= new MyAdapter_Module; if (swm==NULL) return DB_Full; swm->fCB = mCB; swm->fModName = moduleName; swm->fContextName= mContextName; TSyError err= swm->CreateContext ( subName ); if (err)delete swm; else *mc= (CContext)swm; return err; } // Module_CreateContext CVersion Module_Version ( CContext mc ) { if (!mc ) return Plugin_Version( 0 ); return SW_Mo( mc )->Version(); } // Module_Version TSyError Module_Capabilities( CContext mc, appCharP *capa ) { return SW_Mo( mc )->Capabilities ( *capa ); } // Module_Capabilities TSyError Module_PluginParams( CContext mc, cAppCharP mConfigParams, CVersion engineVersion ) { return SW_Mo( mc )->PluginParams ( mConfigParams, engineVersion ); } // Module_PluginParams void Module_DisposeObj ( CContext mc, void* memory ) { SW_Mo( mc )->DisposeObj ( memory ); } // Module_DisposeObj TSyError Module_DeleteContext( CContext mc ) { MyAdapter_Module* swm= SW_Mo( mc ); TSyError err= swm->DeleteContext(); delete swm; return err; } // Module_DeleteContext /* ---- SESSION ------------------------------------------------------------------- */ static MyAdapter_Session* SW_Se( CContext sc ) { return (MyAdapter_Session*)sc; } TSyError Session_CreateContext ( CContext *sc, cAppCharP sessionName, DB_Callback sCB ) { MyAdapter_Session* sws= new MyAdapter_Session; if (sws==NULL) return DB_Full; sws->fCB = sCB; sws->fSessionName= sessionName; TSyError err= sws->CreateContext(); if (err)delete sws; else *sc= (CContext)sws; return err; } // Session_CreateContext // -- device TSyError Session_CheckDevice ( CContext sc, cAppCharP aDeviceID, appCharP *sDevKey, appCharP *nonce ) { return SW_Se( sc )->CheckDevice ( aDeviceID, *sDevKey,*nonce ); } // Session_CheckDevice TSyError Session_GetNonce ( CContext sc, appCharP *nonce ) { return SW_Se( sc )->GetNonce ( *nonce ); } // Session_GetNonce TSyError Session_SaveNonce ( CContext sc, cAppCharP nonce ) { return SW_Se( sc )->SaveNonce ( nonce ); } // Session_SaveNonce TSyError Session_SaveDeviceInfo( CContext sc, cAppCharP aDeviceInfo ) { return SW_Se( sc )->SaveDeviceInfo ( aDeviceInfo ); } // Session_SaveDeviceInfo TSyError Session_GetDBTime ( CContext sc, appCharP *currentDBTime ) { return SW_Se( sc )->GetDBTime ( *currentDBTime ); } // Session_GetDBTime // -- login sInt32 Session_PasswordMode( CContext sc ) { return SW_Se( sc )->PasswordMode(); } // Session_PasswordMode TSyError Session_Login ( CContext sc, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey ) { return SW_Se( sc )->Login ( sUsername, *sPassword, *sUsrKey ); } // Session_Login TSyError Session_Logout( CContext sc ) { return SW_Se( sc )->Logout(); } // Session_Logout // -- general void Session_DisposeObj( CContext sc, void* memory ) { SW_Se( sc )->DisposeObj ( memory ); } // Session_DisposeObj void Session_ThreadMayChangeNow( CContext sc ) { SW_Se( sc )->ThreadMayChangeNow(); } // Session_ThreadMayChangeNow void Session_DispItems ( CContext sc, bool allFields, cAppCharP specificItem ) { SW_Se( sc )->DispItems ( allFields, specificItem ); } // Session_DispItems TSyError Session_AdaptItem ( CContext sc, appCharP *sItemData1, appCharP *sItemData2, appCharP *sLocalVars, uInt32 sIdentifier ) { return SW_Se( sc )->Adapt_Item( *sItemData1, *sItemData2, *sLocalVars, sIdentifier ); } // Session_AdaptItem TSyError Session_DeleteContext( CContext sc ) { MyAdapter_Session* sws= SW_Se( sc ); TSyError err= sws->DeleteContext(); delete sws; return err; } // Session_DeleteContext /* ---- DATASTORE ----------------------------------------------------------------- */ static MyAdapter* SW( CContext ac ) { return (MyAdapter*)ac; } TSyError CreateContext( CContext *ac, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ) { MyAdapter* sw= new MyAdapter; if (sw==NULL) return DB_Full; sw->fCB = aCB; sw->fContextName= aContextName; sw->fAsAdmin= IsAdmin( sw->fContextName ); TSyError err= sw->CreateContext( sDevKey,sUsrKey ); if (err) delete sw; else *ac= (CContext)sw; return err; } // CreateContext uInt32 ContextSupport( CContext ac, cAppCharP aContextRules ) { return SW( ac )->ContextSupport ( aContextRules ); } // ContextSupport uInt32 FilterSupport ( CContext ac, cAppCharP aFilterRules ) { return SW( ac )->FilterSupport ( aFilterRules ); } // FilterSupport // -- admin TSyError LoadAdminData ( CContext ac, cAppCharP aLocDB, cAppCharP aRemDB, appCharP *adminData ) { return SW( ac )->LoadAdminData ( aLocDB, aRemDB, *adminData ); } // LoadAdminData TSyError LoadAdminDataAsKey( CContext ac, cAppCharP aLocDB, cAppCharP aRemDB, KeyH adminKey ) { return SW( ac )->LoadAdminDataAsKey ( aLocDB, aRemDB, adminKey ); } // LoadAdminDataAsKey TSyError SaveAdminData ( CContext ac, cAppCharP adminData ) { return SW( ac )->SaveAdminData ( adminData ); } // SaveAdminData TSyError SaveAdminDataAsKey( CContext ac, KeyH adminKey ) { return SW( ac )->SaveAdminDataAsKey ( adminKey ); } // SaveAdminDataAsKey bool ReadNextMapItem ( CContext ac, MapID mID, bool aFirst ) { return SW( ac )->ReadNextMapItem ( mID, aFirst ); } // ReadNextMapItem TSyError InsertMapItem ( CContext ac, cMapID mID ) { return SW( ac )->InsertMapItem ( mID ); } // InsertMapItem TSyError UpdateMapItem ( CContext ac, cMapID mID ) { return SW( ac )->UpdateMapItem ( mID ); } // UpdateMapItem TSyError DeleteMapItem ( CContext ac, cMapID mID ) { return SW( ac )->DeleteMapItem ( mID ); } // DeleteMapItem // -- read TSyError StartDataRead ( CContext ac, cAppCharP lastToken, cAppCharP resumeToken ) { return SW( ac )->StartDataRead ( lastToken, resumeToken ); } // StartDataRead TSyError ReadNextItem ( CContext ac, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) { return SW( ac )->ReadNextItem ( aID, *aItemData, *aStatus, aFirst ); } // ReadNextItem TSyError ReadNextItemAsKey( CContext ac, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ) { return SW( ac )->ReadNextItemAsKey ( aID, aItemKey, *aStatus, aFirst ); } // ReadNextItemAsKey TSyError ReadItem ( CContext ac, cItemID aID, appCharP *aItemData ) { return SW( ac )->ReadItem ( aID, *aItemData ); } // ReadItem TSyError ReadItemAsKey ( CContext ac, cItemID aID, KeyH aItemKey ) { return SW( ac )->ReadItemAsKey ( aID, aItemKey ); } // ReadItemAsKey TSyError EndDataRead ( CContext ac ) { return SW( ac )->EndDataRead(); } // EndDataRead // -- write TSyError StartDataWrite ( CContext ac ) { return SW( ac )->StartDataWrite(); } // StartDataWrite TSyError InsertItem ( CContext ac, cAppCharP aItemData, ItemID newID ) { return SW( ac )->InsertItem ( aItemData, newID ); } // InsertItem TSyError InsertItemAsKey( CContext ac, KeyH aItemKey, ItemID newID ) { return SW( ac )->InsertItemAsKey ( aItemKey, newID ); } // InsertItemAsKey TSyError UpdateItem ( CContext ac, cAppCharP aItemData, cItemID aID, ItemID updID ) { return SW( ac )->UpdateItem ( aItemData, aID, updID ); } // UpdateItem TSyError UpdateItemAsKey( CContext ac, KeyH aItemKey, cItemID aID, ItemID updID ) { return SW( ac )->UpdateItemAsKey ( aItemKey, aID, updID ); } // UpdateItemAsKey TSyError MoveItem ( CContext ac, cItemID aID, cAppCharP newParID ) { return SW( ac )->MoveItem ( aID, newParID ); } // MoveItem TSyError DeleteItem ( CContext ac, cItemID aID ) { return SW( ac )->DeleteItem ( aID ); } // DeleteItem TSyError FinalizeLocalID( CContext ac, cItemID aID, ItemID updID ) { return SW( ac )->FinalizeLocalID ( aID, updID ); } // FinalizeLocalID TSyError DeleteSyncSet ( CContext ac ) { return SW( ac )->DeleteSyncSet(); } // DeleteSyncSet TSyError EndDataWrite ( CContext ac, bool success, appCharP *newToken ) { return SW( ac )->EndDataWrite ( success, *newToken ); } // EndDataWrite // -- blobs TSyError ReadBlob ( CContext ac, cItemID aID, cAppCharP aBlobID, appPointer *aBlkPtr, memSize *aBlkSize, memSize *aTotSize, bool aFirst, bool *aLast ) { return SW( ac )->ReadBlob ( aID,aBlobID, *aBlkPtr,*aBlkSize,*aTotSize, aFirst,*aLast ); } // ReadBlob TSyError WriteBlob ( CContext ac, cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast ) { return SW( ac )->WriteBlob ( aID,aBlobID, aBlkPtr, aBlkSize, aTotSize, aFirst, aLast ); } // WriteBlob TSyError DeleteBlob( CContext ac, cItemID aID, cAppCharP aBlobID ) { return SW( ac )->DeleteBlob( aID,aBlobID ); } // DeleteBlob // -- general void WriteLogData( CContext ac, cAppCharP logData ) { SW( ac )->WriteLogData ( logData ); } // WriteLogData void DisposeObj ( CContext ac, void* memory ) { SW( ac )->DisposeObj ( memory ); } // DisposeObj void ThreadMayChangeNow( CContext ac ) { SW( ac )->ThreadMayChangeNow(); } // ThreadMayChangeNow void DispItems ( CContext ac, bool allFields, cAppCharP specificItem ) { SW( ac )->DispItems ( allFields, specificItem ); } // DispItems TSyError AdaptItem ( CContext ac, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, uInt32 aIdentifier ) { return SW( ac )->Adapt_Item( *aItemData1, *aItemData2, *aLocalVars, aIdentifier ); } // AdaptItem TSyError DeleteContext( CContext ac ) { MyAdapter* sw= SW( ac ); TSyError err= sw->DeleteContext(); delete sw; return err; } // DeleteContext } // namespace /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.h0000644000373300037200000003045312424517753032140 0ustar00nightlyallusers00000000000000/* * File: oceanblue.h * * Author: Beat Forster (bfo@synthesis.ch) * * Base class for datastore plugins in C++ * * Copyright (c) 2008-2011 by Synthesis AG + plan44.ch * */ #ifndef OCEANBLUE_H #define OCEANBLUE_H #include "sync_include.h" // include general SDK definitions #include "sync_dbapidef.h" // include the interface file and utilities #include "SDK_util.h" // include SDK utilities #include "SDK_support.h" // include more SDK support // There are reference implementations for admin data handling and for BLOBs // But they needn't to be used. The "target_options.h" defines whether to use them #ifndef DISABLE_PLUGIN_DATASTOREADMIN #include "admindata.h" #endif #ifndef DISABLE_PLUGIN_BLOBS #include "blobs.h" #endif // Use them in two different namespaces namespace oceanblue { using sysync::sInt16; using sysync::uInt16; using sysync::sInt32; using sysync::uInt32; using sysync::appPointer; using sysync::memSize; using sysync::DB_Callback; using sysync::MapID; using sysync::cMapID; using sysync::ItemID; using sysync::cItemID; using sysync::KeyH; #ifndef DISABLE_PLUGIN_DATASTOREADMIN using sysync::TAdminData; #endif #ifndef DISABLE_PLUGIN_BLOBS using sysync::TBlob; #endif // The three classes "OceanBlue_Module", "OceanBlue_Session" and "OceanBlue" should // be derived as shown in the "snowwhite" adapter example. // It is intended not to change this module, but only the derived adapter. // The name of the derived adapter is defined "myadapter.h" // Module access class OceanBlue_Module { public: virtual ~OceanBlue_Module() { }; // virtual destructor DB_Callback fCB; // local callback reference string fModName; // the module name string fContextName; // the context name virtual TSyError CreateContext ( cAppCharP subName ); virtual CVersion Version(); virtual TSyError Capabilities ( appCharP &mCapabilities ); virtual TSyError PluginParams ( cAppCharP mConfigParams, CVersion engineVersion ); virtual void DisposeObj ( void* memory ); virtual TSyError DeleteContext(); }; // OceanBlue_Module // Session access class OceanBlue_Session { public: virtual ~OceanBlue_Session() { }; // virtual destructor DB_Callback fCB; // local callback reference string fSessionName; // the session name virtual TSyError CreateContext(); // -- device virtual TSyError CheckDevice ( cAppCharP aDeviceID, appCharP &sDevKey, appCharP &nonce ); virtual TSyError GetNonce ( appCharP &nonce ); virtual TSyError SaveNonce ( cAppCharP nonce ); virtual TSyError SaveDeviceInfo ( cAppCharP aDeviceInfo ); virtual TSyError GetDBTime ( appCharP ¤tDBTime ); // -- login virtual sInt32 PasswordMode(); virtual TSyError Login ( cAppCharP sUsername, appCharP &sPassword, appCharP &sUsrKey ); virtual TSyError Logout(); // -- general virtual void DisposeObj ( void* memory ); virtual void ThreadMayChangeNow(); virtual void DispItems ( bool allFields, cAppCharP specificItem ); virtual TSyError Adapt_Item ( appCharP &sItemData1, appCharP &sItemData2, appCharP &sLocalVars, uInt32 sIdentifier ); virtual TSyError DeleteContext(); }; // OceanBlue_Session // Datastore access class OceanBlue { public: virtual ~OceanBlue() { }; // virtual destructor DB_Callback fCB; // local callback reference string fContextName; // the context name bool fAsAdmin; // true, if it is admin context uInt32 fNthItem; #ifndef DISABLE_PLUGIN_DATASTOREADMIN TAdminData fAdmin; // an internal ADMIN implementation can be used #endif #ifndef DISABLE_PLUGIN_BLOBS TBlob fBlob; // an internal BLOB implementation can be used #endif virtual TSyError CreateContext ( cAppCharP sDevKey, cAppCharP sUsrKey ); virtual uInt32 ContextSupport ( cAppCharP aContextRules ); virtual uInt32 FilterSupport ( cAppCharP aFilterRules ); // -- admin virtual TSyError LoadAdminData ( cAppCharP aLocDB, cAppCharP aRemDB, appCharP &adminData ); virtual TSyError LoadAdminDataAsKey( cAppCharP aLocDB, cAppCharP aRemDB, KeyH adminKey ); virtual TSyError SaveAdminData ( cAppCharP adminData ); virtual TSyError SaveAdminDataAsKey ( KeyH adminKey ); virtual bool ReadNextMapItem ( MapID mID, bool aFirst ); virtual TSyError InsertMapItem ( cMapID mID ); virtual TSyError UpdateMapItem ( cMapID mID ); virtual TSyError DeleteMapItem ( cMapID mID ); // -- read virtual TSyError StartDataRead ( cAppCharP lastToken, cAppCharP resumeToken ); virtual TSyError ReadNextItem ( ItemID aID, appCharP &aItemData, sInt32 &aStatus, bool aFirst ); virtual TSyError ReadNextItemAsKey ( ItemID aID, KeyH aItemKey, sInt32 &aStatus, bool aFirst ); virtual TSyError ReadItem ( cItemID aID, appCharP &aItemData ); virtual TSyError ReadItemAsKey ( cItemID aID, KeyH aItemKey ); virtual TSyError EndDataRead(); // -- write virtual TSyError StartDataWrite(); virtual TSyError InsertItem ( cAppCharP aItemData, ItemID newID ); virtual TSyError InsertItemAsKey( KeyH aItemKey, ItemID newID ); virtual TSyError UpdateItem ( cAppCharP aItemData, cItemID aID, ItemID updID ); virtual TSyError UpdateItemAsKey( KeyH aItemKey, cItemID aID, ItemID updID ); virtual TSyError MoveItem ( cItemID aID, cAppCharP newParID ); virtual TSyError DeleteItem ( cItemID aID ); virtual TSyError FinalizeLocalID ( cItemID aID, ItemID updID ); virtual TSyError DeleteSyncSet(); virtual TSyError EndDataWrite ( bool success, appCharP &newToken ); // -- blobs virtual TSyError ReadBlob ( cItemID aID, cAppCharP aBlobID, appPointer &aBlkPtr, memSize &aBlkSize, memSize &aTotSize, bool aFirst, bool &aLast ); virtual TSyError WriteBlob ( cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast ); virtual TSyError DeleteBlob ( cItemID aID, cAppCharP aBlobID ); // -- general virtual void WriteLogData ( cAppCharP logData ); virtual void DisposeObj ( void* memory ); virtual void ThreadMayChangeNow(); virtual void DispItems ( bool allFields, cAppCharP specificItem ); virtual TSyError Adapt_Item ( appCharP &aItemData1, appCharP &aItemData2, appCharP &aLocalVars, uInt32 aIdentifier ); virtual TSyError DeleteContext(); // ---- call-in functions ---- virtual sInt32 GetValueID ( KeyH aItemKey, string aValName, string suff="" ); virtual TSyError GetValue ( KeyH aItemKey, string aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize, string suff="" ); virtual TSyError GetValueByID( KeyH aItemKey, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize, string suff="" ); virtual TSyError SetValue ( KeyH aItemKey, string aValName, uInt16 aValType, appPointer aBuffer, memSize aValSize, string suff="" ); virtual TSyError SetValueByID( KeyH aItemKey, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aValSize, string suff="" ); // ---- convenience routines to access Get/SetValue for specific types ---- /* string */ virtual TSyError GetStr ( KeyH aItemKey, string aValName, string &aText, string suff="" ); virtual TSyError GetStrByID ( KeyH aItemKey, sInt32 aID, string &aText, sInt32 arrIndex= 0, string suff="" ); virtual TSyError SetStr ( KeyH aItemKey, string aValName, string aText, string suff="" ); virtual TSyError SetStrByID ( KeyH aItemKey, sInt32 aID, string aText, sInt32 arrIndex= 0, string suff="" ); /* sInt16 / uInt16 */ virtual TSyError GetInt16 ( KeyH aItemKey, string aValName, sInt16 &aValue, string suff="" ); virtual TSyError GetInt16 ( KeyH aItemKey, string aValName, uInt16 &aValue, string suff="" ); virtual TSyError GetInt16ByID( KeyH aItemKey, sInt32 aID, sInt16 &aValue, sInt32 arrIndex= 0, string suff="" ); virtual TSyError GetInt16ByID( KeyH aItemKey, sInt32 aID, uInt16 &aValue, sInt32 arrIndex= 0, string suff="" ); virtual TSyError SetInt16 ( KeyH aItemKey, string aValName, sInt16 aValue, string suff="" ); virtual TSyError SetInt16ByID( KeyH aItemKey, sInt32 aID, sInt16 aValue, sInt32 arrIndex= 0, string suff="" ); /* sInt32 / uInt32 */ virtual TSyError GetInt32 ( KeyH aItemKey, string aValName, sInt32 &aValue, string suff="" ); virtual TSyError GetInt32 ( KeyH aItemKey, string aValName, uInt32 &aValue, string suff="" ); virtual TSyError GetInt32ByID( KeyH aItemKey, sInt32 aID, sInt32 &aValue, sInt32 arrIndex= 0, string suff="" ); virtual TSyError GetInt32ByID( KeyH aItemKey, sInt32 aID, uInt32 &aValue, sInt32 arrIndex= 0, string suff="" ); virtual TSyError SetInt32 ( KeyH aItemKey, string aValName, sInt32 aValue, string suff="" ); virtual TSyError SetInt32ByID( KeyH aItemKey, sInt32 aID, sInt32 aValue, sInt32 arrIndex= 0, string suff="" ); /* suffix handling */ virtual void AppendSuffixToID( KeyH aItemKey, sInt32 &aID, cAppCharP suff ); }; // OceanBlue } // namespace #endif // OCEANBLUE_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/snowwhite.cpp0000644000373300037200000002625712424517753032574 0ustar00nightlyallusers00000000000000/* * File: snowwhite.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * Programming interface between Synthesis SyncML engine * and a database structure. * * Copyright (c) 2008-2011 by Synthesis AG + plan44.ch * * * E X A M P L E C O D E * ======================== * (To be used as starting point for SDK development. * It can be adapted and extended by programmer) * */ #include "myadapter.h" namespace oceanblue { using sysync::memSize; using sysync::stringSize; using sysync::appChar; using sysync::LOCERR_OK; using sysync::DB_Forbidden; using sysync::DB_NotFound; using sysync::Password_MD5_OUT; using sysync::ReadNextItem_Unchanged; using sysync::ReadNextItem_EOF; using sysync::VP_GlobMulti; using sysync::VALTYPE_TIME64; using sysync::MinVersion; using sysync::Manufacturer; using sysync::Description; using sysync::YesField; using sysync::IntStr; using sysync::Parans; #define BuildNumber 1 // user defined build number, can be 0..255 #define MyDB MyAdapter_Name // plugin module's name #define Example_UsrKey "5678" #define ItemRdOffs 12000 // examples: first valid item for reading #define ItemOffs 15000 // first valid item // ---- module ----------------------------------------------------------------------------- // If your implementation has a higher build number, override it as done here CVersion MyAdapter_Module::Version() { CVersion v= Plugin_Version( BuildNumber ); // an individual build number DEBUG_DB( fCB, MyDB,Mo_Ve, "%08X", v ); // NOTE: do not change the version number itself return v; // as it used by the engine to } // Version // guarantee up/downwards compatibility // If your implementation has special capabilities, override them here // Your company's name and the plugin descriptiom should be added here TSyError MyAdapter_Module::Capabilities( appCharP &capa ) { string s = MyPlatform(); // some standard identifiers s+= '\n'; s+= DLL_Info; Manufacturer ( s, "Plugin GmbH" ); // **** your company's name **** string desc = MyAdapter_Name; desc+= " Plugin"; Description ( s, desc ); // **** your plugin's description **** MinVersion ( s, VP_GlobMulti ); // at least V1.5.1 YesField ( s, CA_ADMIN_Info ); // show "ADMIN" info YesField ( s, CA_ItemAsKey ); // use the routines capa= StrAlloc( s.c_str() ); return LOCERR_OK; } // Capabilities // ---- session ---------------------------------------------------------------------------- // Example password mode sInt32 MyAdapter_Session::PasswordMode() { int mode= Password_MD5_OUT; return mode; } /* Session_PasswordMode */ // Example login allowed for super:user MD5 login, resulting in = "5678" TSyError MyAdapter_Session::Login( cAppCharP sUsername, appCharP &sPassword, appCharP &sUsrKey ) { cAppCharP MD5_OUT_SU= "11JrMX94iTR1ob5KZFtEwQ=="; // the MD5B64 example for "super:user" TSyError err= DB_Forbidden; // default if (strcmp( sUsername,"super" )==0) { // an example account ("super"), hard coded here err = LOCERR_OK; sPassword= StrAlloc( MD5_OUT_SU ); sUsrKey = StrAlloc( Example_UsrKey ); // allows to access the datastore later } // if return err; } // Login // ---- utility routines ------------------------------------------------------------------- // set some contacts field as example void MyAdapter::SetContactFields( KeyH aItemKey, cAppCharP aFirst, cAppCharP aLast, cAppCharP aCity ) { SetInt32( aItemKey, "SYNCLVL", 10 ); // set some fields SetStr ( aItemKey, "N_FIRST", aFirst ); SetStr ( aItemKey, "N_LAST", aLast ); SetStr ( aItemKey, "ADR_W_CITY", aCity ); } // SetContactFields // set some events field as example void MyAdapter::SetEventFields ( KeyH aItemKey, cAppCharP aSum, cAppCharP aLoc, cAppCharP aMod, cAppCharP aStart, cAppCharP aEnd, bool allDay ) { SetInt32( aItemKey, "SYNCLVL", 10 ); // set some fields SetStr ( aItemKey, "KIND", "EVENT" ); SetStr ( aItemKey, "SUMMARY", aSum ); SetStr ( aItemKey, "LOCATION", aLoc ); SetStr ( aItemKey, "DMODIFIED", aMod ); SetStr ( aItemKey, "DTSTART", aStart ); SetStr ( aItemKey, "DTEND", aEnd ); SetInt32( aItemKey, "ALLDAY", allDay ); if (allDay) { sInt32 id= GetValueID( aItemKey, "DTSTART" ); SetStrByID( aItemKey,id, "DATE", 0,VALSUFF_TZNAME ); // timezone name } // if if (allDay) { sInt32 id= GetValueID( aItemKey, "DTEND" ); SetStrByID( aItemKey,id, "DATE", 0,VALSUFF_TZNAME ); // timezone name } // if } // SetEventFields // Get values: name, type, array size, timezone name of TSyError MyAdapter::GetFieldKey( KeyH aItemKey, sInt32 aID, string &aKey, uInt16 &aType, sInt32 &nFields, string &aTZ ) { TSyError err; aTZ= ""; err= GetStrByID ( aItemKey,aID, aKey, 0,VALSUFF_NAME ); if (err) return err; // field name err= GetInt16ByID( aItemKey,aID, aType, 0,VALSUFF_TYPE ); if (err) return err; // field type err= GetInt32ByID( aItemKey,aID, nFields, 0,VALSUFF_ARRSZ ); if (err) nFields= -1; // array size if (aType==VALTYPE_TIME64) { err= GetStrByID( aItemKey,aID, aTZ, 0,VALSUFF_TZNAME ); // timezone name } // if return LOCERR_OK; } // GetFieldKey // Display available fields of void MyAdapter::DisplayFields( KeyH aItemKey ) { cAppCharP DF= "Display_Fields"; TSyError err; sInt32 id; string vKey, vTZ, vName; uInt16 vType; sInt32 nFields; cAppCharP step= VALNAME_FIRST; while (true) { id = GetValueID ( aItemKey, step ); err= GetFieldKey( aItemKey, id, vKey,vType,nFields,vTZ ); if (err) break; bool isArr= nFields>=0; // check array condition if (isArr) DEBUG_DB( fCB, MyDB,DF, " (%2d) %s: **ARRAY** %d", vType, vKey.c_str(), nFields ); else nFields= 1; // not an array -> 1 element if (vTZ!="") vTZ= " " + Parans( "TZNAME=" + vTZ ); // for each array element do ... for (int i= 0; i // just return 15000,15001,... as valid item ids // please choose a persistent solution for a real implementation fCreItem= ItemOffs; return inherited::CreateContext( sDevKey,sUsrKey ); // and call the base method } // CreateContext // Example routine: Return 4 valid items 12000 .. 12003 TSyError MyAdapter::ReadNextItemAsKey( ItemID aID, KeyH /* aItemKey */, sInt32 &aStatus, bool aFirst ) { // Example: Constant 4 valid contact items or 2 event items for this example // See "ReadItemAsKey" for details of this example uInt32 n= 0; if (fContextName=="contacts") n= 4; if (fContextName=="events" ) n= 2; if (aFirst) fNthItem= 0; // re-initialize it if (fNthItem>=n) { aStatus= ReadNextItem_EOF; return LOCERR_OK; } // Create items 12000 .. aID->item= StrAlloc( IntStr( ItemRdOffs+fNthItem ).c_str() ); fNthItem++; // next aStatus= ReadNextItem_Unchanged; return LOCERR_OK; } // ReadNextItemAsKey // Example routine: Return 4 valid items 12000..12003 for contacts // 2 valid items 12000..12001 for events TSyError MyAdapter::ReadItemAsKey( cItemID aID, KeyH aItemKey ) { TSyError err= LOCERR_OK; string s = aID->item; do { if (fContextName=="contacts") { if (s=="12000") { SetContactFields( aItemKey, "Johann Sebastian","Bach", "Leipzig" ); break; } if (s=="12001") { SetContactFields( aItemKey, "Wolfgang Amadeus","Mozart", "Salzburg" ); break; } if (s=="12002") { SetContactFields( aItemKey, "Richard", "Wagner", "Bayreuth" ); break; } if (s=="12003") { SetContactFields( aItemKey, "Giacomo", "Puccini","Lucca" ); break; } } // if if (fContextName=="events") { // can have the same IDs as contacts, because they are independent if (s=="12000") { SetEventFields ( aItemKey, "Sechsel\xC3\xA4uten", "Bellevue", "20081110T140000Z", "20090420", "20090421" ); break; } if (s=="12001") { SetEventFields ( aItemKey, "Knabenschiessen", "Albisg\xC3\xBC\x65tli", "20081110T140000", "20090914T041500", "20090915T17" ); break; } } // if // not found err= DB_NotFound; } while (false); return err; } // ReadItemAsKey // Example routine: Debug display of the item contents. // Return item names 15000 ... TSyError MyAdapter::InsertItemAsKey( KeyH aItemKey, ItemID newID ) { // **** implementation for inserting an item must be added here **** TSyError err; sInt32 id; // ---- as an example, first and last name will be read ---- string vFirst, vLast; err= GetStr ( aItemKey, "N_FIRST", vFirst ); // get it directly id = GetValueID( aItemKey, "N_LAST" ); // or get it via id err= GetStrByID( aItemKey, id, vLast ); DEBUG_DB( fCB, MyDB,Da_IIK, "%08X %s %s", aItemKey, vFirst.c_str(),vLast.c_str() ); // ---- this is a simple loop to show the contents of each field of an item ---- DisplayFields( aItemKey ); // just return 15000, 15001, ... as valid item ids newID->item= StrAlloc( IntStr( fCreItem++ ).c_str() ); return LOCERR_OK; } // InsertItemAsKey TSyError MyAdapter::UpdateItemAsKey( KeyH aItemKey, cItemID /* aID */, ItemID /* updID */ ) { // **** implementation for updating an item must be added here **** DEBUG_DB( fCB, MyDB,Da_UIK, "%08X", aItemKey ); DisplayFields( aItemKey ); return LOCERR_OK; } // UpdateItemAsKey TSyError MyAdapter::DeleteItem( cItemID /* aID */ ) { // **** implementation for deleting an item must be added here **** return DB_NotFound; } // DeleteItem } // namespace /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/snowwhite/snowwhite.h0000644000373300037200000000540312424517753032227 0ustar00nightlyallusers00000000000000/* * File: snowwhite.h * * Author: Beat Forster (bfo@synthesis.ch) * * Datastore plugin classes which is derived * from the "oceanblue" classes. * * Copyright (c) 2008-2011 by Synthesis AG + plan44.ch * */ #ifndef SNOWWHITE_H #define SNOWWHITE_H #include "myadapter.h" #include "sync_include.h" #include "oceanblue.h" namespace oceanblue { class MyAdapter_Module : public OceanBlue_Module { typedef OceanBlue_Module inherited; public: /**** any of the OceanBlue_Module methods can be overriden ****/ CVersion Version(); TSyError Capabilities( appCharP &capa ); }; // MyAdapter_Module class MyAdapter_Session : public OceanBlue_Session { typedef OceanBlue_Session inherited; public: /**** any of the OceanBlue_Session methods can be overriden ****/ sInt32 PasswordMode(); TSyError Login( cAppCharP sUsername, appCharP &sPassword, appCharP &sUsrKey ); }; // MyAdapter_Session class MyAdapter : public OceanBlue { typedef OceanBlue inherited; private: uInt32 fCreItem; // an internal number for new item creation // Fill example items void SetContactFields( KeyH aItemKey, cAppCharP aFirst, cAppCharP aLast, cAppCharP aCity ); void SetEventFields ( KeyH aItemKey, cAppCharP aSum, cAppCharP aLoc, cAppCharP aMod, cAppCharP aStart, cAppCharP aEnd, bool allday= true ); // Get field information TSyError GetFieldKey ( KeyH aItemKey, sInt32 aID, string &aKey, uInt16 &aType, sInt32 &nFields, string &aTZ ); // Display fields of the work item void DisplayFields ( KeyH aItemKey ); public: /**** any of the OceanBlue methods can be overriden ****/ TSyError CreateContext ( cAppCharP sDevKey, cAppCharP sUsrKey ); // for this example, the methods will be used TSyError ReadNextItemAsKey ( ItemID aID, KeyH aItemKey, sInt32 &aStatus, bool aFirst ); TSyError ReadItemAsKey ( cItemID aID, KeyH aItemKey ); TSyError InsertItemAsKey ( KeyH aItemKey, ItemID newID ); TSyError UpdateItemAsKey ( KeyH aItemKey, cItemID aID, ItemID updID ); TSyError DeleteItem ( cItemID aID ); }; // MyAdapter } // namespace #endif // SNOWWHITE_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/text_db/0000755000373300037200000000000012424517753027427 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/text_db/DLL/0000755000373300037200000000000012424517753030042 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/text_db/DLL/target_options.h0000644000373300037200000000153412424517753033257 0ustar00nightlyallusers00000000000000/* * File: target_options.h * * Author: Beat Forster (bfo@synthesis.ch) * * Programming interface between Synthesis SyncML engine * and a database structure. * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #ifndef TARGET_OPTIONS_H #define TARGET_OPTIONS_H /* - find out target platform */ #ifdef __MACH__ #define MACOSX #else #if defined __MWERKS__ || defined _MSC_VER #ifndef _WIN32 #define _WIN32 #endif #else #define LINUX #endif #endif /* code is running within DLL */ #define SDK_DLL 1 /* - we are not at the SyncML engine's side here */ /* - and we need an extern "C" interface for the DLL */ #undef SYSYNC_ENGINE /* activate debug output */ #define SYDEBUG 2 //#define DISABLE_PLUGIN_DATASTOREADMIN 1 //#define DISABLE_PLUGIN_BLOBS 1 #endif /* TARGET_OPTIONS_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp0000644000373300037200000013161612424517753033322 0ustar00nightlyallusers00000000000000/* * File: sync_dbapi_text.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * Example DBApi database adapter plugin * Written in C++ * * Similar behaviour as the former "text_db". * (with extensions for ARRAY and BLOB access) * * For newer engine versions, this sample code * is 1:1 used as datastore connector for the * so called demo server/client. * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * * E X A M P L E C O D E * (text_db interface) * */ #include "sync_include.h" // include general SDK definitions #include "sync_dbapidef.h" // include the interface file and utilities #include "SDK_util.h" // include SDK utilities #include "SDK_support.h" // and some C++ support functionality #ifndef SYSYNC_ENGINE // outside the SyncML engine we need additional stuff: #include "stringutil.h" // local implementation for CStr <=> Str conversions #include // isalnum #endif #include "admindata.h" // TAdminData class #include "blobs.h" // TBlob class #include "dbitem.h" // TDBItem class namespace SDK_textdb { // the plugin runs within a namespace using sysync::DB_Callback; // common definitions for both namespaces using sysync::ItemID_Struct; using sysync::ItemID; using sysync::cItemID; using sysync::MapID; using sysync::KeyH; using sysync::TDBItem; using sysync::TDBItemField; using sysync::TAdminData; using sysync::TBlob; using sysync::LOCERR_OK; using sysync::LOCERR_TOOOLD; using sysync::LOCERR_NOTIMP; using sysync::DB_Forbidden; using sysync::DB_NotFound; using sysync::DB_Full; using sysync::DB_Error; using sysync::Password_ClrText_IN; using sysync::Password_ClrText_OUT; using sysync::Password_MD5_Nonce_IN; using sysync::Password_MD5_OUT; using sysync::ReadNextItem_Unchanged; using sysync::ReadNextItem_Changed; using sysync::ReadNextItem_Resumed; using sysync::ReadNextItem_EOF; using sysync::VP_GlobMulti; using sysync::Manufacturer; using sysync::Description; using sysync::GContext; using sysync::MinVersion; using sysync::NoField; using sysync::YesField; using sysync::IsAdmin; using sysync::GlobContext; using sysync::GlobContextFound; using sysync::Apo; using sysync::IntStr; using sysync::VersionStr; using sysync::ConcatNames; using sysync::ConcatPaths; using sysync::CurrentTime; using sysync::CompareTokens; using sysync::CStrToStrAppend; #include "sync_dbapi.h" // include the interface file within the namespace #define BuildNumber 0 // User defined build number, initial value is 0 #define MyDB "TextDB" // textdb example debug name #if defined MACOSX && defined __MWERKS__ // export the items for Mac OS X as well #pragma export on // (for Windows, a ".def" file is required) #endif /* ------------------------------------------------------------------------------ */ /* File name prefixes for the textdb implementation */ #define P_Device "DEV_" // device info #define P_Data "TDB_" // textdb data #define P_NewItem "NID_" // new item id (for a persistent approach) /* -- MODULE -------------------------------------------------------------------- */ /* All the plugin's common variables are defined here * Normally there is just one such context per module. * These variables could be defined as global vars as well. * * The example here shows, how to handle a common AND a * module context in parallel. A module context will be * opened once for the Session environment and twice for * each Datastore (for the data and the admin part). * The idea is to have the session's plugin params as * default values for the datastore plugin params. These * default values (for gDataPath/gBlobPath and gMapPath) * will be stored at the common context. */ class CommonContext { public: CommonContext() { cInstalled = false; cEngineVersion= 0; // engine's version not yet available here cGlob = NULL; } bool cInstalled; // The module is already installed long cEngineVersion; // the engine's version GlobContext* cGlob; // structure for reaching the common context // --- local copies of ... // NOTE: These are default values if datatore specific // paths are not defined string cDataPath; // directory where to store data string cBlobPath; // " " " " BLOBs string cMapPath; // " " " " maps and admin data /* other elements can be defined here */ /* ... */ }; // CommonContext class ModuleContext { public: ModuleContext() { fCB= NULL; fCC= NULL; } // --- local copies of ... DB_Callback fCB; // the callback structure CommonContext* fCC; // reference to the common context string fModuleName; // the module's name string fSubName; // the sub path name (not used for textdb implementation) string fContextName; // the context name string fDataPath; // directory where to store data string fBlobPath; // " " " " BLOBs string fMapPath; // " " " " maps and admin data /* other elements can be defined here */ /* ... */ }; // ModuleContext /* will be casted to the ModuleContext* structure */ static ModuleContext* MoC( CContext mContext ) { return (ModuleContext*)mContext; } TSyError Module_CreateContext( CContext *mContext, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB ) { DEBUG_DB( mCB, MyDB,Mo_CC, "'%s' (%s)", ConcatNames( moduleName,subName ).c_str(), mContextName ); if (!CB_gContext( mCB )) return LOCERR_TOOOLD; // the new system is required ! ModuleContext* mc= new ModuleContext; // get the (unique) module context *mContext= (CContext)mc; // return the context variable mc->fModuleName = moduleName; // local copy of module's name mc->fSubName = subName; // " " " module's sub name mc->fContextName= mContextName; // " " " the contexts name (e.g. "contacts") mc->fCB = mCB; // " " " the callback reference string db= MyDB; #ifdef _MSC_VER db+= "_visual"; #endif #if defined __MACH__ && !defined __MWERKS__ db+= "_universal"; #endif GlobContext* g= (GlobContext*)mCB->gContext; if (GlobContextFound( db, g )) mc->fCC= (CommonContext*)g->ref; // connect the structure else { mc->fCC= new CommonContext; mc->fCC->cGlob= g; g->ref= mc->fCC; // connect the structure } // if g->cnt++; DEBUG_DB( mCB, MyDB,Mo_CC, "mContext=%08X gContext=%08X g->ref=%08X", *mContext, mCB->gContext, g->ref ); return LOCERR_OK; } // Module_CreateContext /* -- VERSION/CAPABILITIES ---- */ /* Get the plug-in's version number */ CVersion Module_Version( CContext mContext ) { /* The current plugin's SDK version is expected here */ CVersion v= Plugin_Version( BuildNumber ); if ( mContext ) DEBUG_DB( MoC( mContext )->fCB, MyDB,Mo_Ve, "%s", VersionStr( v ).c_str() ); return v; } /* Module_Version */ /* Get the plug-in's capabilities */ TSyError Module_Capabilities( CContext mContext, appCharP *mCapabilities ) { if (!mContext) return DB_Forbidden; ModuleContext* mc= MoC( mContext ); string s = MyPlatform(); s+= '\n'; s+= DLL_Info; Manufacturer( s, "Synthesis AG" ); // **** can be adapted *** Description ( s, "Text database module. Writes data directly to TDB_*.txt file" ); YesField ( s, CA_ADMIN_Info ); MinVersion ( s, VP_GlobMulti ); // at least V1.5.1 if (mc->fCC) { GContext( s, mc->fCC->cGlob ); } // if // Parts of the plug-in can be disabled (will not be connected and therefore not be used) // These settings are expected ath the "target_options.h" of the plugin #ifdef DISABLE_PLUGIN_SESSIONAUTH NoField( s, Plugin_SE_Auth ); #endif #ifdef DISABLE_PLUGIN_DEVICEADMIN NoField( s, Plugin_DV_Admin ); #endif #ifdef DISABLE_PLUGIN_DATASTOREADMIN NoField( s, Plugin_DS_Admin ); #endif #ifdef DISABLE_PLUGIN_DATASTOREDATA NoField( s, Plugin_DS_Data ); #endif *mCapabilities= StrAlloc( s.c_str() ); DEBUG_DB( mc->fCB, MyDB,Mo_Ca, "'%s'", *mCapabilities ); return LOCERR_OK; } // Module_Capabilities TSyError Module_PluginParams( CContext mContext, cAppCharP mConfigParams, CVersion engineVersion ) { /* Decide, which data path to take */ cAppCharP DataFilePath= "datafilepath"; // TDB_ cAppCharP BlobFilePath= "blobfilepath"; // BLB_ cAppCharP MapFilePath= "mapfilepath"; // DEV_ / ADM_ / MAP_ // ---- legacy, please use and for newer implementations #if defined LINUX || defined MACOSX cAppCharP DataPath= "unixpath"; #else cAppCharP DataPath= "winpath"; #endif // ---- END legacy ---- ModuleContext* mc= MoC( mContext ); DEBUG_DB ( mc->fCB, MyDB,Mo_PP, "EngineVersion: %s", VersionStr( engineVersion ).c_str() ); DEBUG_DB ( mc->fCB, MyDB,Mo_PP, "'%s'", mConfigParams ); // ------------------------------------------------------ // Get the data path for the textDB files char* vv; mc->fDataPath= mc->fCC->cDataPath; // as default // ---- legacy data path if (Field( mConfigParams, DataPath, &vv )) { mc->fDataPath= ""; CStrToStrAppend( vv, mc->fDataPath ); StrDispose ( vv ); } // if // ---- END legacy ---- // *** DATA PATH *** // overwrite it, if using new definition if (Field( mConfigParams, DataFilePath, &vv )) { mc->fDataPath= ""; CStrToStrAppend( vv, mc->fDataPath ); StrDispose ( vv ); } // if // *** BLOB PATH *** // the same for the BLOB files // take this as the default mc->fBlobPath= mc->fCC->cBlobPath; // take the global one if (mc->fBlobPath.empty()) mc->fBlobPath= mc->fDataPath; // or take the local data path if (mc->fBlobPath.empty()) mc->fBlobPath= mc->fCC->cDataPath; // or even more globally if (Field( mConfigParams, BlobFilePath, &vv )) { mc->fBlobPath= ""; CStrToStrAppend( vv, mc->fBlobPath ); StrDispose ( vv ); } // if // *** MAP PATH *** // and the same for the map/admin files // take this as the default mc->fMapPath= mc->fCC->cMapPath; // take the global one if (mc->fMapPath.empty()) mc->fMapPath= mc->fDataPath; // or take the local data path if (mc->fMapPath.empty()) mc->fMapPath= mc->fCC->cDataPath; // or even more globally if (Field( mConfigParams, MapFilePath, &vv )) { mc->fMapPath= ""; CStrToStrAppend( vv, mc->fMapPath ); StrDispose ( vv ); } // if // get global defaults when called for session context // Indication: fContextName> is empty. if (!mc->fCC->cInstalled && mc->fContextName.empty()) { mc->fCC->cDataPath = mc->fDataPath; mc->fCC->cBlobPath = mc->fBlobPath; mc->fCC->cMapPath = mc->fMapPath; } // if if (mc->fCC->cEngineVersion==0) // set it once mc->fCC->cEngineVersion= engineVersion; mc->fCC->cInstalled= true; // now it's really installed return LOCERR_OK; } // Module_PluginParams /* Dispose the memory of the module context */ void Module_DisposeObj( CContext mContext, void* memory ) { ModuleContext* mc= MoC( mContext ); DEBUG_Exotic_DB( mc->fCB, MyDB,Mo_DO, "%d free at %08X '%s'", mc, memory,memory ); StrDispose ( memory ); } // Module_DisposeObj TSyError Module_DeleteContext( CContext mContext ) { ModuleContext* mc= MoC( mContext ); //printf( "DEL: '%s' %08X\n", mc->fModuleName.c_str(), mc->fCB->gContext ); DEBUG_DB ( mc->fCB, MyDB,Mo_DC, "'%s'", mc->fModuleName.c_str() ); GlobContext* g= mc->fCC->cGlob; g->cnt--; if (g->cnt==0) { CommonContext* cc= (CommonContext*)g->ref; delete cc; g->ref= NULL; } // if delete mc; return LOCERR_OK; } // Module_DeleteContext // ---------------------- session handling --------------------- #if !defined DISABLE_PLUGIN_DEVICEADMIN || !defined DISABLE_PLUGIN_DEVICEADMIN /*! Each session requires a session context, which will be created with * 'Session_CreateContext' and deleted with 'Session_DeleteContext'. */ class SessionContext { public: DB_Callback fCB; TDBItem fDevList; // The current device list TDBItem* fDev; // reference string fDeviceID; // stored value of 'CheckDevice' /* other elements can be defined here */ /* ... */ }; // SessionContext /* will be casted to the SessionContext* structure */ static SessionContext* SeC( CContext sContext ) { return (SessionContext*)sContext; } /* Create a context for a new session */ TSyError Session_CreateContext( CContext *sContext, cAppCharP sessionName, DB_Callback sCB ) { SessionContext* sc= new SessionContext; if (sc==NULL) return DB_Full; sc->fDev= NULL; sc->fCB = sCB; DEBUG_DB ( sc->fCB, MyDB,Se_CC, "%d '%s'", sc,sessionName ); *sContext= (CContext)sc; // return the context variable return LOCERR_OK; } // Session_CreateContext /* ----- "script-like" ADAPT --------- */ TSyError Session_AdaptItem( CContext sContext, appCharP *sItemData1, appCharP *sItemData2, appCharP *sLocalVars, uInt32 sIdentifier ) { /**** CAN BE ADAPTED BY USER ****/ SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,"AdaptItem", "'%s' '%s' '%s' id=%d", *sItemData1,*sItemData2,*sLocalVars, sIdentifier ); return LOCERR_OK; } /* Session_AdaptItem */ /*! Create a alphanumerical string out of (ignore all other chars) * This is an internal utility proc. */ static string AlphaNum( cAppCharP aName ) { cAppCharP p= aName; string s; while (*p!='\0') { if (isalnum( *p )) s+= tolower( *p ); p++; } // while return s; } // AlphaNum #ifndef DISABLE_PLUGIN_DEVICEADMIN /* Check the database entry of and return its nonce string */ TSyError Session_CheckDevice( CContext sContext, cAppCharP aDeviceID, appCharP *sDevKey, appCharP *nonce ) { SessionContext* sc= SeC ( sContext ); ModuleContext* mc= MoC( sc->fCB->cContext ); TSyError err= LOCERR_OK; sc->fDeviceID= AlphaNum( aDeviceID ); string s= P_Device + sc->fDeviceID + ".txt"; sc->fDevList.fFileName= ConcatPaths( mc->fMapPath, s ); err= sc->fDevList.LoadDB( true, "DEV", sc->fCB ); // load the DEV file info if (!sc->fDev) { /* get the device */ sc->fDev= &sc->fDevList; bool found= ListNext( sc->fDev ); if (!found) { /* not found -> create such an element */ err= sc->fDevList.CreateEmptyItem( s, sc->fDev ); if (err) return err; } // if } // if *sDevKey= StrAlloc( sc->fDeviceID.c_str() ); // 1:1 assigned at the moment *nonce = StrAlloc( sc->fDev->fToken.c_str() ); DEBUG_DB ( sc->fCB, MyDB,Se_CD, "devKey='%s' nonce='%s' err=%d", *sDevKey, *nonce, err ); return LOCERR_OK; } /* Session_CheckDevice */ /* Get a new nonce from the database. * If this function returns an error (as done for this implementiation here), * the SyncML engine has to create its own nonce. */ TSyError Session_GetNonce( CContext sContext, appCharP * /* nonce */ ) { SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_GN, "%d (not supported)", sc ); return DB_NotFound; } /* Session_GetNonce */ /* Save the new nonce (which will be expected to be returned * in the next session for this device */ TSyError Session_SaveNonce( CContext sContext, cAppCharP nonce ) { TSyError err= DB_NotFound; SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB, Se_SN, "%d '%s'", sc,nonce ); if (sc->fDev) { sc->fDev->fToken= nonce; sc->fDevList.fChanged= true; err= sc->fDevList.SaveDB( true, sc->fCB ); // save it } // if return err; } /* Session_SaveNonce */ /* Save the device info for */ TSyError Session_SaveDeviceInfo( CContext sContext, cAppCharP aDeviceInfo ) { SessionContext* sc= SeC ( sContext ); ModuleContext* mc= MoC( sc->fCB->cContext ); TSyError err= DB_NotFound; if (!sc->fDev) { string s= P_Device + sc->fDeviceID + ".txt"; sc->fDevList.fFileName= ConcatPaths( mc->fMapPath, s ); /* get the device */ sc->fDev= &sc->fDevList; bool found= ListNext( sc->fDev ); if (!found) { /* not found -> create such an element */ err= sc->fDevList.CreateEmptyItem( s, sc->fDev ); if (err) return err; } // if } // if if (sc->fDev) { err= sc->fDevList.UpdateFields( sc->fCB, aDeviceInfo, sc->fDev, true ); if (!err) err= sc->fDevList.SaveDB( true, sc->fCB ); } // if DEBUG_DB( sc->fCB, MyDB,Se_SD, "%d err=%d", sc, err ); sc->fDevList.Disp_Items( sc->fCB, Se_SD ); return err; } /* Session_SaveDeviceInfo */ TSyError Session_GetDBTime( CContext /* sContext */, appCharP *currentDBTime ) { string iso8601_str= CurrentTime(); *currentDBTime= StrAlloc( iso8601_str.c_str() ); return LOCERR_OK; } /* Session_GetDBTime */ #endif // DISABLE_PLUGIN_DEVICEADMIN #ifndef DISABLE_PLUGIN_SESSIONAUTH /* There are currently 4 different password modes supported: * Return: Password_ClrText_IN 'SessionLogin' will get clear text password * Password_ClrText_OUT " must return clear text password * Password_MD5_OUT " must return MD5 coded password * Password_MD5_Nonce_IN " will get MD5B64(MD5B64(user:pwd):nonce) */ sInt32 Session_PasswordMode( CContext sContext ) { //int mode= Password_ClrText_IN; //int mode= Password_ClrText_OUT; //int mode= Password_MD5_Nonce_IN; int mode= Password_MD5_OUT; SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_PM, "%d mode=%d", sc, mode ); return mode; } /* Session_PasswordMode */ /* Make login */ /* This example here shows how the different modes are working */ /* In practice, it's sufficient to support one of theses modes */ /* The chosen mode must be returned with "Session_PasswordMode" */ TSyError Session_Login( CContext sContext, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey ) { cAppCharP MD5_OUT_SU = "11JrMX94iTR1ob5KZFtEwQ=="; // the MD5B64 example for "super:user" cAppCharP MD5_OUT_TT = "xPlhtDgO4k2YL+127za+nw=="; // the MD5B64 example for "test:test" SessionContext* sc= SeC( sContext ); TSyError err= DB_Forbidden; // default sInt32 mode= Session_PasswordMode( sContext ); if (strcmp( sUsername,"super" )==0) { // an example account ("super"), hard coded here switch (mode) { case Password_ClrText_IN : if (strcmp( *sPassword,"user" )==0) err= LOCERR_OK; break; case Password_ClrText_OUT : *sPassword= StrAlloc( "user" ); err= LOCERR_OK; break; case Password_MD5_OUT : *sPassword= StrAlloc( MD5_OUT_SU ); err= LOCERR_OK; break; case Password_MD5_Nonce_IN: break; // currently not supported for SDK_textdb } // switch if (!err) *sUsrKey= StrAlloc( "5678" ); // allows to access the datastore later } // if if (strcmp( sUsername,"test" )==0) { // an example account ("test"), hard coded here switch (mode) { case Password_ClrText_IN : if (strcmp( *sPassword,"test" )==0) err= LOCERR_OK; break; case Password_ClrText_OUT : *sPassword= StrAlloc( "test" ); err= LOCERR_OK; break; case Password_MD5_OUT : *sPassword= StrAlloc( MD5_OUT_TT ); err= LOCERR_OK; break; case Password_MD5_Nonce_IN: break; // currently not supported for SDK_textdb } // switch if (!err) *sUsrKey= StrAlloc( "test" ); } // if appCharP pw= *sPassword; if (err && (mode==Password_ClrText_OUT || mode==Password_MD5_OUT )) pw= (appCharP)""; appCharP uk= *sUsrKey; if (err) uk= (appCharP)""; DEBUG_DB( sc->fCB, MyDB,Se_LI,"%d usr='%s' pwd='%s' => key='%s' err=%d", sc, sUsername, pw,uk, err ); return err; } // Session_Login /* Make logout */ TSyError Session_Logout( CContext sContext ) { SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_LO, "%d", sc ); return LOCERR_OK; /* do nothing */ } // Session_Logout #endif // DISABLE_PLUGIN_SESSIONAUTH void Session_DisposeObj( CContext sContext, void* memory ) { SessionContext* sc= SeC( sContext ); DEBUG_Exotic_DB( sc->fCB, MyDB,Se_DO, "%d free at %08X '%s'", sc, memory,memory ); StrDispose ( memory ); } /* Session_DisposeObj */ void Session_ThreadMayChangeNow( CContext sContext ) { SessionContext* sc= SeC( sContext ); DEBUG_Exotic_DB( sc->fCB, MyDB,Se_TC, "%d", sc ); } /* Session_ThreadMayChangeNow */ /* For Debugging only ! * Will not be called by the SyncML engine * Can be implemented empty, if not needed */ void Session_DispItems( CContext sContext, bool allFields, cAppCharP specificItem ) { SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_DI, "%d", sc ); sc->fDevList.Disp_Items( sc->fCB, "", allFields, specificItem ); } /* Session_DispItems */ /* Delete the session context; there will be no subsequent calls * to . All 'Session_DisposeObj' calls will be done before */ TSyError Session_DeleteContext( CContext sContext ) { SessionContext* sc= SeC( sContext ); DEBUG_DB ( sc->fCB, MyDB,Se_DC, "%d", sc ); delete sc; return LOCERR_OK; } // Session_DeleteContext #endif // ---- end session ------------------------------------------ // ---------- context class ---------------------------------- /*! Each datastore access requires a context, which will be created with * 'CreateContext' and deleted with 'DeleteContext'. */ typedef struct { bool allfields; // false (default): 'ReadNextItem' will return ID only / // true: returns ID + data /* other elements can be defined here */ /* ... */ } SupportType; class TDBContext { public: TDBContext( cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ); ~TDBContext(); DB_Callback fCB; // callback structure for logging string fContextName; // local copy of the context name string fUserName; // unique key of usr-local string fCombiName; // unique key of dev-usr-local TDBItem fLogList; // log info TDBItem* fCurrent; // for 'ReadNextItem' int fNth; // and according counter TDBItem fNewItem; string fNewID; TDBItem fItemList; #ifndef DISABLE_PLUGIN_DATASTOREADMIN TAdminData fAdmin; // admin data handling #endif #ifndef DISABLE_PLUGIN_BLOBS TBlob fBlob; // current blob info #endif TDBItem fSupportList; SupportType fSupport; // fast readable form TDBItem fFilterList; string fLastToken; // the of the last session string fResumeToken; // suspend/resume support string fNewToken; // the of this session void ResetCounter(); TSyError RemoveAll ( TDBItem* hdK ); TSyError UpdateSupport( TDBItem* hdK, int &n ); void KeyAndField ( cAppCharP sKey, cAppCharP sField, string &s ); void KeyAndField ( TDBItemField* actKey, TDBItemField* actField, string &s ); /* other elements can be defined here */ /* ... */ }; // DBContext typedef TDBContext* ContextP; /* will be casted to the ContextP structure */ static ContextP DBC( CContext aContext ) { return (ContextP)aContext; } /* the constructor */ TDBContext::TDBContext( cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ) { fContextName= aContextName; // make a local copy bool asAdmin= IsAdmin( fContextName ); fCB = aCB; DEBUG_DB( fCB, MyDB,Da_CC, "'%s' dev='%s' usr='%s' type=%s", fContextName.c_str(), sDevKey,sUsrKey, asAdmin ? "ADMIN" : "DATA" ); fUserName = ConcatNames( sUsrKey, fContextName, "_" ); fCombiName= ConcatNames( sDevKey, fUserName, "_" ); ModuleContext* mc= MoC( aCB->cContext ); #ifndef DISABLE_PLUGIN_DATASTOREADMIN if (asAdmin) fAdmin.Init( aCB, MyDB, mc->fMapPath, fContextName, sDevKey,sUsrKey ); #endif #ifndef DISABLE_PLUGIN_BLOBS fBlob.Init ( aCB, MyDB, mc->fBlobPath, fContextName, sDevKey,sUsrKey ); #endif ResetCounter(); fNewItem.init ( "newItem", aCB ); fItemList.init ( "itemID","parentID", aCB ); fSupportList.init( "support", aCB, new TDBItem ); fSupport.allfields= false; fFilterList.init ( "filter", aCB, new TDBItem ); fLogList.init ( "log", aCB, new TDBItem ); } // constructor TDBContext::~TDBContext() { DEBUG_DB( fCB, MyDB,Da_DC, "" ); } // destructor /*! Reset the counter for 'ReadNextItem' */ void TDBContext::ResetCounter() { fCurrent= &fItemList; fNth= 0; } // ResetCounter TSyError TDBContext::UpdateSupport( TDBItem* hdK, int &n ) // Update the specific field with the new value . // Create the whole bunch of missing keys, if not yet available. { TDBItem* hdI = hdK; ListNext( hdI ); TDBItemField* actK= &hdK->item; // the key TDBItemField* actI= &hdI->item; //printf( " v allfields=%s\n", // fSupport.allfields?"true":"false" ); n= 0; // init nr of valid contexts int i= 0; // init nr of total contexts while (ListNext( actK,actI ) && i==n) { // still all ? if (strcmp( actK->field.c_str(), Da_RN )==0) { fSupport.allfields= strcmp( actI->field.c_str(),"allfields" )==0; n++; } // if i++; //printf( " i=%d n=%d '%s' '%s'\n", // i, n, actK->field.c_str(), actI->field.c_str() ); } // while //printf( " n allfields=%s\n", // fSupport.allfields?"true":"false" ); return LOCERR_OK; } // UpdateSupport TSyError TDBContext::RemoveAll( TDBItem* hdK ) // Remove all elements of the list { TDBItem* hdI = hdK; ListNext( hdI ); TDBItemField* prvK= &hdK->item; // the key TDBItemField* prvI= &hdI->item; while (true) { TDBItemField* actK= prvK; // the key TDBItemField* actI= prvI; if (!ListNext( actK,actI )) break; prvK->next= actK->next; actK->next= NULL; // avoid destroying the whole chain delete actK; prvI->next= actI->next; actI->next= NULL; // avoid destroying the whole chain delete actI; } // while return LOCERR_OK; } // RemoveAll /* -- OPEN ----------------------------------------------------------------------- */ TSyError CreateContext( CContext *aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ) { ContextP ac= new TDBContext( aContextName, aCB, sDevKey,sUsrKey ); if (ac==NULL) return DB_Full; // this is really fatal *aContext= (CContext)ac; return LOCERR_OK; } /* CreateContext */ /* -- GENERAL -------------------------------------------------------------------- */ #if !defined DISABLE_PLUGIN_DATASTOREADMIN || !defined DISABLE_PLUGIN_DATASTOREDATA uInt32 ContextSupport( CContext aContext, cAppCharP aSupportRules ) { ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_CS, "'%s'", aSupportRules ); ac->RemoveAll( &ac->fSupportList ); ac->fSupportList.UpdateFields( ac->fCB, aSupportRules ); int n; ac->UpdateSupport( &ac->fSupportList, n ); DEBUG_DB( ac->fCB, MyDB,Da_CS, "allfields=%d", ac->fSupport.allfields ); return n; // number of supported contexts } // ContextSupport uInt32 FilterSupport( CContext aContext, cAppCharP aFilterRules ) { ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_FS, "'%s'", aFilterRules ); ac->fFilterList.UpdateFields( ac->fCB, aFilterRules ); return 0; // none supported until now } // FilterSupport void ThreadMayChangeNow( CContext aContext ) { ContextP ac= DBC( aContext ); DEBUG_Exotic_DB( ac->fCB, MyDB,Da_TC, "(%08X)", ac ); ac->fNewItem.SaveDB ( false ); // possibly partly save ac->fItemList.SaveDB( false ); } /* ThreadMayChangeNow */ void WriteLogData( CContext aContext, cAppCharP logData ) { ContextP ac= DBC( aContext ); ac->fLogList.UpdateFields( ac->fCB, logData ); ac->fLogList.Disp_Items ( ac->fCB, Da_WL ); } /* WriteLogData */ /* ---- display database contents, for debugging only ---- */ /* Writes the context of items to dbg output path * This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. */ void DispItems( CContext aContext, bool allFields, cAppCharP specificItem ) { ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_DI, "BEGIN" ); TDBItem* actB= &ac->fItemList; TDBItemField* actK; ac->fSupportList.Disp_Items( NULL, "fSupport", allFields,specificItem ); ac->fFilterList.Disp_Items ( NULL, "fFilter", allFields,specificItem ); DEBUG_( ac->fCB, "---" ); if (!actB->next) { // key titles only DEBUG_( ac->fCB, "%s", actB->c_str() ); actK= &actB->item; // the key identifier while (ListNext( actK )) DEBUG_( ac->fCB, "%s: -", actK->field.c_str() ); } else ac->fItemList.Disp_Items( NULL, "fItem", allFields,specificItem ); DEBUG_DB( ac->fCB, MyDB,Da_DI, "END" ); } // DispItems #endif // ----- end general ---------------------------------------- #ifndef DISABLE_PLUGIN_DATASTOREADMIN /* -- ADMINISTRATION ------------------------------------------------------------ */ /* (will be passed to the "admindata" module) */ TSyError LoadAdminData ( CContext aContext, cAppCharP aLocDB, cAppCharP aRemDB, appCharP *adminData ) { return DBC( aContext )->fAdmin.LoadAdminData ( aLocDB, aRemDB, adminData ); } // LoadAdminData TSyError LoadAdminDataAsKey( CContext /* aContext */, cAppCharP /* aLocDB */, cAppCharP /* aRemDB */, KeyH /* adminKey */ ) { return LOCERR_NOTIMP; } // LoadAdminDataAsKey TSyError SaveAdminData ( CContext aContext, cAppCharP adminData ) { return DBC( aContext )->fAdmin.SaveAdminData ( adminData ); } // SaveAdminData TSyError SaveAdminDataAsKey( CContext /* aContext */, KeyH /* adminKey */ ) { return LOCERR_NOTIMP; } // SaveAdminDataAsKey bool ReadNextMapItem( CContext aContext, MapID mID, bool aFirst ) { return DBC( aContext )->fAdmin.ReadNextMapItem( mID, aFirst ); } // ReadNextMapItem TSyError InsertMapItem( CContext aContext, cMapID mID ) { return DBC( aContext )->fAdmin.InsertMapItem ( mID ); } // InsertMapItem TSyError UpdateMapItem( CContext aContext, cMapID mID ) { return DBC( aContext )->fAdmin.UpdateMapItem ( mID ); } // UpdateMapItem TSyError DeleteMapItem( CContext aContext, cMapID mID ) { return DBC( aContext )->fAdmin.DeleteMapItem ( mID ); } // DeleteMapItem #endif // DISABLE_PLUGIN_DATASTOREADMIN #ifndef DISABLE_PLUGIN_DATASTOREDATA /* -- READ ---------------------------------------------------------------------- */ TSyError StartDataRead( CContext aContext, cAppCharP lastToken, cAppCharP resumeToken ) { ContextP ac= DBC ( aContext ); ModuleContext* mc= MoC( ac->fCB->cContext ); ac->fLastToken = lastToken; // store it in case of no success ac->fResumeToken= resumeToken; // used for OMA DS 1.2 suspend/resume support ac->fNewToken = CurrentTime( -1 ); // make sure that all changes will be seen DEBUG_DB( ac->fCB, MyDB,Da_SR, "last='%s' resume='%s' new='%s'", lastToken,resumeToken, ac->fNewToken.c_str() ); ac->ResetCounter(); // start with the first element string s= P_Data + ac->fUserName + ".txt"; if (mc) s= ConcatPaths( mc->fDataPath,s ); ac->fItemList.fFileName= s; // load the database into memory ac->fItemList.LoadDB( false ); // implementation could be changed to "by name" here // ------------------- s= P_NewItem + ac->fUserName + ".txt"; if (mc) s= ConcatPaths( mc->fDataPath,s ); ac->fNewItem.fFileName= s; // load the database into memory ac->fNewItem.LoadDB ( false ); // implementation could be changed to "by name" here TDBItem* act= &ac->fNewItem; ac->fNewID= F_First; if (ListNext( act )) ac->fNewID= act->itemID; return LOCERR_OK; } /* StartDataRead */ TSyError ReadNextItem( CContext aContext, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) { ContextP ac= DBC( aContext ); if (aFirst) ac->ResetCounter(); *aItemData= NULL; // safety setting, if no value returning cAppCharP mode= "Unused"; // default string s; ac->fNth++; if (ListNext( ac->fCurrent )) { aID->item = StrAlloc( ac->fCurrent->itemID.c_str() ); aID->parent= StrAlloc( ac->fCurrent->parentID.c_str() ); if (ac->fSupport.allfields) ReadItem( aContext, aID, aItemData ); // assume, there are two yyyymmddThhmmssZ strings, which can be // compared directly w/o conversion into lineartime *aStatus= CompareTokens( ac->fCurrent->fToken, ac->fLastToken, ac->fResumeToken ); switch (*aStatus) { case ReadNextItem_Unchanged: mode= "Unchanged"; s= Apo(ac->fLastToken ) + " >= "; break; case ReadNextItem_Changed : mode= "Changed"; s= Apo(ac->fLastToken ) + " < " ; break; case ReadNextItem_Resumed : mode= "Resumed"; s= Apo(ac->fResumeToken) + " < " ; break; } // switch s+= Apo( ac->fCurrent->fToken ); DEBUG_DB( ac->fCB, MyDB,Da_RN, "(no=%d) %s (%s): %s", ac->fNth, mode, ac->fCurrent->c_str(), s.c_str() ); return LOCERR_OK; } // if DEBUG_DB( ac->fCB, MyDB,Da_RN, "(no=%d) EOF", ac->fNth ); *aStatus= ReadNextItem_EOF; return LOCERR_OK; } /* ReadNextItem */ // The variant is not supported for textdb TSyError ReadNextItemAsKey( CContext /* aContext */, ItemID /* aID */, KeyH /* aItemKey */, sInt32* /* aStatus */, bool /* aFirst */ ) { return LOCERR_NOTIMP; } /* ReadNextItemAsKey */ static bool ItemFound( cItemID aID, TDBItem* &actL ) { appCharP p= aID->parent; if (!p) p= (appCharP)""; while (ListNext( actL )) { if (strcmp( aID->item, actL->itemID.c_str() )==0 && // search for item strcmp( p, actL->parentID.c_str() )==0) return true; } // while return false; } // ItemFound TSyError ReadItem( CContext aContext, cItemID aID, appCharP *aItemData ) { ContextP ac = DBC( aContext ); TSyError err= DB_NotFound; TDBItem* actL; TDBItemField* actK; TDBItemField* actF; int a= 0; string s, dat; *aItemData= (appCharP)""; actL= &ac->fItemList; if (ItemFound( aID, actL )) { actK = &ac->fItemList.item; // now concatenate int n= 0; actF= &actL->item; while (ListNext( actK,actF )) { s= KeyAndField( actK,actF ); if (n>0) dat+= '\n'; n++; dat+= s; } // while *aItemData= StrAlloc( dat.c_str() ); err= LOCERR_OK; } // if s= ItemID_Info( aID ); if (!err) a= strlen( *aItemData ); DEBUG_DB( ac->fCB, MyDB,Da_RI, "%s '%s' len=%d err=%d", s.c_str(), *aItemData, a, err ); return err; } /* ReadItem */ // The variant is not supported for textdb TSyError ReadItemAsKey( CContext /* aContext */, cItemID /* aID */, KeyH /* aItemKey */ ) { return LOCERR_NOTIMP; } /* ReadItemAsKey */ TSyError EndDataRead( CContext aContext ) { ContextP ac= DBC( aContext ); // no additional actions needed at this point DEBUG_DB( ac->fCB, MyDB,Da_ER, "(%08X)", ac ); // just logging return LOCERR_OK; } /* EndDataRead */ /* -- WRITE --------------------------------------------------------------------- */ TSyError StartDataWrite( CContext aContext ) { ContextP ac= DBC( aContext ); // no additional actions needed at this point DEBUG_DB( ac->fCB, MyDB,Da_SW, "(%08X)", ac ); // just logging return LOCERR_OK; } /* StartDataWrite */ TSyError InsertItem( CContext aContext, cAppCharP aItemData, ItemID newID ) { ContextP ac= DBC( aContext ); string newItemID; TDBItem* act; ItemID_Struct a; a.item = (appCharP)""; a.parent= newID->parent; if (!a.parent) a.parent= (appCharP)""; TSyError err= ac->fItemList.CreateEmptyItem( &a, newItemID, act, ac->fNewID ); if (err) a.item= (appCharP)"???"; // undefined else a.item= (appCharP)newItemID.c_str(); string s= ItemID_Info( &a ); DEBUG_DB( ac->fCB, MyDB,Da_II, "%s '%s' err=%d", s.c_str(), aItemData, err ); if (!err) { // the newly created item will now be updated => filled with content ItemID_Struct u; u.item = NULL; // no change of item u.parent= NULL; err= UpdateItem( aContext, aItemData, &a,&u ); } // if if (err) { DeleteItem( aContext, &a ); // remove it again in case of an error newID->item= NULL; } else { newID->item= StrAlloc ( newItemID.c_str() ); ac->fNewID = IntStr( atoi( newID->item )+1 ); } // if return err; } /* InsertItem */ // The variant is not supported for textdb TSyError InsertItemAsKey( CContext /* aContext */, KeyH /* aItemKey */, ItemID /* newID */ ) { return LOCERR_NOTIMP; } /* InsertItemAsKey */ TSyError UpdateItem( CContext aContext, cAppCharP aItemData, cItemID aID, ItemID /* updID */ ) // This implementation will not create a new { ContextP ac = DBC( aContext ); TSyError err= DB_NotFound; TDBItem* actI; err= ac->fItemList.GetItem( aID, actI ); // the item must exist already if (!err) err= ac->fItemList.UpdateFields( ac->fCB, aItemData, actI, false, ac->fNewToken.c_str() ); string s= ItemID_Info( aID ); DEBUG_DB( ac->fCB, MyDB,Da_UI, "%s '%s' err=%d", s.c_str(), aItemData, err ); return err; } /* UpdateItem */ // The variant is not supported for textdb TSyError UpdateItemAsKey( CContext /* aContext */, KeyH /* aItemKey */, cItemID /* aID */, ItemID /* updID */ ) { return LOCERR_NOTIMP; } /* UpdateItemAsKey */ TSyError MoveItem( CContext aContext, cItemID aID, cAppCharP newParID ) { ContextP ac = DBC( aContext ); TSyError err= DB_NotFound; TDBItem* actL; ItemID_Struct nID; nID.item = aID->item; nID.parent= (appCharP)newParID; err= ac->fItemList.ParentExist( aID->item, newParID ); if (!err) err= ac->fItemList.GetItem( aID, actL ); if (!err) actL->parentID= newParID; string s= ItemID_Info( aID ); string n= ItemID_Info( &nID ); DEBUG_DB( ac->fCB, MyDB,Da_MvI, "%s => %s err=%d", s.c_str(),n.c_str(), err ); return err; } /* MoveItem */ TSyError DeleteItem( CContext aContext, cItemID aID ) { ContextP ac= DBC( aContext ); TDBItem* act; TSyError err= ac->fItemList.GetItem( aID, act ); if (err) return err; // must exist already if (ac->fCurrent==act) ListBack( ac->fCurrent, &ac->fItemList ); err= ac->fItemList.DeleteItem( aID ); DEBUG_DB( ac->fCB, MyDB,Da_DeI, "%s err=%d", ItemID_Info( aID ).c_str(), err ); return err; } /* DeleteItem */ TSyError FinalizeLocalID( CContext /* aContext */, cItemID aID, ItemID updID ) { updID->item= StrAlloc( aID->item ); return LOCERR_OK; //return LOCERR_NOTIMP; } /* FinalizeLocalID */ TSyError DeleteSyncSet( CContext aContext ) { TSyError err; ContextP ac= DBC( aContext ); ItemID_Struct iID; appCharP itemData; sInt32 status; while (true) { err= ReadNextItem( aContext, &iID, &itemData, &status, true ); if (err || status==ReadNextItem_EOF) break; err= DeleteItem( aContext, &iID ); DEBUG_DB( ac->fCB, MyDB,Da_DSS, "%s: err=%d\n", ItemID_Info( &iID ).c_str(), err ); if (err) break; DisposeObj( aContext, iID.item ); DisposeObj( aContext, iID.parent ); DisposeObj( aContext, itemData ); } // while return err; } /* DeleteSyncSet */ /* -- BLOBs --------------------------------------------------------------------- */ #ifndef DISABLE_PLUGIN_BLOBS TSyError ReadBlob ( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer *aBlkPtr, memSize *aBlkSize, memSize *aTotSize, bool aFirst, bool *aLast ) { return DBC( aContext )->fBlob.ReadBlob ( aID, aBlobID, aBlkPtr,aBlkSize, aTotSize, aFirst,aLast ); } // ReadBlob TSyError WriteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast ) { return DBC( aContext )->fBlob.WriteBlob ( aID, aBlobID, aBlkPtr,aBlkSize, aTotSize, aFirst,aLast ); } // WriteBlob; TSyError DeleteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID ) { return DBC( aContext )->fBlob.DeleteBlob ( aID, aBlobID ); } // DeleteBlob #endif /* ------------------------------------------------------------------------------ */ /* If all operations for this datastore access are successful, the current * itemlist can be written to a text file and the will be returned */ TSyError EndDataWrite( CContext aContext, bool success, appCharP *newToken ) { ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,Da_EW, "=> %s", success ? "COMMIT":"ROLLBACK" ); TDBItem* act= &ac->fNewItem; ac->fNewItem.CreateItem( ac->fNewID,"", act ); TSyError err= DB_Error; ac->fNewItem.SaveDB ( false ); if (success) err= ac->fItemList.SaveDB( false ); // be aware that this implementation // in case of no success might have saved already a part at "ThreadMyChangeNow" if (err) ac->fNewToken= ac->fLastToken; *newToken= StrAlloc( ac->fNewToken.c_str() ); DEBUG_DB( ac->fCB, MyDB,Da_EW, "err=%d newToken='%s'", err, *newToken ); return err; } /* EndDataWrite */ #endif // DISABLE_PLUGIN_DATASTOREDATA /* ----- "script-like" ADAPT --------- */ TSyError AdaptItem( CContext aContext, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, uInt32 aIdentifier ) { /**** CAN BE ADAPTED BY USER ****/ // NOTE: will not yet be called by the SyncML engine ContextP ac= DBC( aContext ); DEBUG_DB( ac->fCB, MyDB,"AdaptItem", "'%s' '%s' '%s' id=%d", *aItemData1,*aItemData2,*aLocalVars, aIdentifier ); *aItemData1 = StrAlloc( *aItemData1 ); *aItemData2 = StrAlloc( "4:just_a_test\n" ); return LOCERR_OK; } /* AdaptItem */ /* ----------------------------------- */ void DisposeObj( CContext aContext, void* memory ) { ContextP ac= DBC( aContext ); DEBUG_Exotic_DB( ac->fCB, MyDB,Da_DO, "%d free at %08X '%s'", ac, memory,memory ); StrDispose ( memory ); } /* DisposeObj */ TSyError DeleteContext( CContext aContext ) { ContextP ac= DBC( aContext ); delete ac; // release the structure itself return LOCERR_OK; } /* DeleteContext */ } /* namespace */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/0000755000373300037200000000000012424517753024771 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/SDK_support.cpp0000755000373300037200000005507412424517753027730 0ustar00nightlyallusers00000000000000/* * File: SDK_support.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * Some SDK support utility functions for C++ * * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * */ #include "sync_include.h" // import some global things #include "sync_dbapidef.h" #include "SDK_util.h" #include "SDK_support.h" #ifdef __cplusplus namespace sysync { #endif #define FLen 30 // max length of (internal) item name // --- plugin name handling ---------------------------------------- //! recognize separation bool SepFound( string name, string::size_type &pos, string sep, bool backwards ) { if (backwards) pos= name.rfind( sep, name.length()-1 ); else pos= name.find ( sep, 0 ); return pos!=string::npos; } // SepFound // returns true if in brackets: "[aaa]" bool InBracks( string name ) { string::size_type o, c; return SepFound( name, o, "[" ) && o==0 && SepFound( name, c, "]", true ) && c==name.length()-1; } // InBracks // returns true if twice in brackets: "[[aaa]]" static bool InDBracks( string name ) { string::size_type o, c; return SepFound( name, o, "[[" ) && o==0 && SepFound( name, c, "]]", true ) && c==name.length()-2; } // InDBracks bool CutBracks( string &name ) { bool ok= InBracks( name ); if (ok) name= name.substr( 1, name.length()-2 ); // cut the brackets return ok; } // CutBracks /*! Returns true, if belongs to an internal LIB. * Returns false for DLL access * The following notations are recognized as LIB: * "" * "[aaa]" * "[aaa!bbb]" * "[aaa x]" * "[aaa x!bbb]" * * "[aaa]!bbb" * "[aaa x]!bbb" * * "[aaa] x" * "[aaa] x!bbb" */ bool IsLib( string name ) { if (name.empty() || InBracks( name )) return true; // empty or embraced with '[' ']' string::size_type o, c; return SepFound( name, o, "[" ) && o==0 && SepFound( name, c, "]",true ) && ( name[ c+1 ]=='!' || name[ c+1 ]==' ' ); } // IsLib // Cut the brackets at begin/end of , if available string NoBracks( string name ) { string p; string::size_type pos; if (SepFound( name, pos )) { // check the case "[aaa]!bbb" first p= Plugin_MainName( name ); if (IsLib( p )) { p= NoBracks( p ) + "!" + Plugin_SubName ( name ); return p; } // if } // if if (SepFound( name, pos, " " )) { // check the case "[aaa] xx" if (name[ 0 ]=='[' && name[ pos-1 ]==']' && NextToken( name, p )) { p= NoBracks( p ) + " " + name; return p; } // if } // if // check now for "[aaa]" or "[aaa!bbb]" CutBracks( name ); return name; } // NoBracks /*! Add brackets at begin/end of , if not yet there */ string AddBracks( string name ) { if (!name.empty() && !InBracks( name )) name= Bracks( name ); return name; } // AddBracks static string Plugin_PartName( string name, bool asSub ) { string::size_type pos, o, c; if (!SepFound( name, pos )) { // at least one '!' must be there if (asSub) return ""; else return name; } // if int nBridge= 0; if (SepFound( name, o, "[" ) && o==0) { for (c= pos+1; c 0) name= '[' + name; } else { name= name.substr( 0, pos ); while (nBridge-- > 0) name= name + ']'; } // if while (InDBracks( name )) CutBracks( name ); return name; } // Plugin_PartName //! the part before and after '!' string Plugin_MainName( string name ) { return Plugin_PartName( name, false ); } string Plugin_SubName ( string name ) { return Plugin_PartName( name, true ); } bool WithSubSystem( string name, string &sMain, string &sSub ) { sMain= Plugin_MainName( name ); sSub = Plugin_SubName ( name ); return !sSub.empty(); } // WithSubSystem bool IsAdmin( string &aContextName ) { uInt32 fLen= aContextName.length(); uInt32 fPos= fLen - strlen( ADMIN_Ident ); bool asAdmin= aContextName.rfind( ADMIN_Ident,fLen )==fPos; if (asAdmin) aContextName= aContextName.substr( 0, fPos ); return asAdmin; } // IsAdmin // ------ command line utility functions ------------------------------------- // assign command line arguments void CLine::InitOptions( int argc, char* argv[] ) { fArgc= argc; // get copies fArgv= argv; } // InitOptions // Get th option string of void CLine::StrOpt( char opt, int n, string &value ) { int p= 0; for (int i=1; i= fArgc) return; char* s= fArgv[ i+p ]; if (*s=='-') { // search for options do { s++; if (*s==opt) { // yes, that's the one we're looking for bool ok= true; int act= i+p+1; int lim= i+n; for (int j=act; j<=lim; j++) { s= fArgv[ j ]; if (*s=='-') { // no other options allowed s++; if (*s<'0' || *s>'9') { // negative numbers ARE allowed ok= false; break; } // if } // if p++; } // for if (ok) { value= s; return; // it's ok -> assign } // if } // if } while (*s!='\0' && *s!=' '); } // if } // for } // StrOpt void CLine::GetName( int n, string &value ) { int j= 0; for (int i=1; i if (!s.empty()) s+= '\n'; // add a separator (in-between) s+= fieldName; // and the new identifier s+= ':' + fieldValue; } // AddCapa // Add a fieldname with "no" attribute void NoField( string &s, string fieldName ) { AddCapa( s, fieldName, "no" ); } // Add a fieldname with "yes" attribute void YesField( string &s, string fieldName ) { AddCapa( s, fieldName, "yes" ); } // Add a fieldname with "both" attribute void BothField( string &s, string fieldName ) { AddCapa( s, fieldName,"both" ); } // Add the minimum supported version for the plugin to : // ===> MUST be sent at StartDataRead ==> V1.0.6.X void MinVersion( string &s, CVersion internalMinVersion ) { CVersion minV= VP_ResumeToken; // At least V1.0.6.X for all ... if (minV<=internalMinVersion) // ... or even higher minV= internalMinVersion; string value; GetField( s, CA_MinVersion, value ); if (!value.empty()) { // already a min version defined ? if (VersionNr( value )>=minV) return; // it's perfectly fine already -> done RemoveField( s, CA_MinVersion, value ); // must be replaced, remove it } // if AddCapa( s, CA_MinVersion, VersionStr( minV ) ); } // MinVersion // Add sub system's version, if smaller than internal void SubVersion( string &s, CVersion subSysVersion ) { if (Plugin_Version( 0 ) information to void GContext( string &s, GlobContext* gContext ) { if (gContext) AddCapa( s, CA_GlobContext, RefStr( gContext ) ); } // CContext // Add capability error, if void CapaError( string &s, TSyError err ) { if (err) AddCapa( s, CA_Error, IntStr(err) ); } // CapaError // ---- utility functions ---------------------------------------------------------- // Allocate local memory for an item void MapAlloc( MapID rslt, cMapID mID ) { rslt->localID = StrAlloc( mID->localID ); rslt->remoteID= StrAlloc( mID->remoteID ); rslt->flags = mID->flags; rslt->ident = mID->ident; } // MapAlloc // Allocate local memory for an item void ItemAlloc( ItemID rslt, cItemID aID ) { rslt->item = StrAlloc( aID->item ); rslt->parent= StrAlloc( aID->parent ); } // ItemAlloc void BlockAlloc( appPointer *newPtr, appPointer bPtr, uInt32 bSize ) { *newPtr= malloc( bSize ); memcpy( *newPtr, bPtr, bSize ); } // BlockAlloc // ----------------------------------------------------------- // Get int value as string string IntStr( sInt32 i ) { char f[ FLen ]; sprintf ( f, "%d", (int)i ); string s= f; return s; } // IntStr string RefStr( void* a, bool asHex ) { char f[ FLen ]; #if __WORDSIZE == 64 if (asHex) sprintf( f, "%016llX", (unsigned long long)a ); else sprintf( f, "%lld", (long long int )a ); #else if (asHex) sprintf( f, "%08X", (unsigned int)a ); else sprintf( f, "%d", (int)a ); #endif string s= f; return s; } // RefStr static string HexConv( uInt32 h, cAppCharP format ) { char f[ FLen ]; sprintf ( f, format, h ); string s= f; return s; } // HexConv /*! Get byte/hex/longhex value as string */ string ByteStr( uInt8 h ) { return HexConv( h, "%02X" ); } string HexStr( uInt16 h ) { return HexConv( h, "%04X" ); } string LHexStr( uInt32 h ) { return HexConv( h, "%08X" ); } /*! Get ch as int value */ int HexNr( char ch ) { int i= 0; if ( ch>='0' && ch<='9' ) i= ch-'0'; if ( ch>='a' && ch<='f' ) i= ch-'a'+10; if ( ch>='A' && ch<='F' ) i= ch-'A'+10; return i; } // HexNr /*! Get string as hex value */ void* LHexRef( string v ) { #if __WORDSIZE == 64 long long a= 0; const int mx= 16; #else long a= 0; const int mx= 8; #endif int len= v.length(); if (len>mx) len= mx; for (int i= 0; imx) len= mx; for (int i= 0; i as version string Va.b.c.d string VersionStr( CVersion v ) { if (v==VP_BadVersion) return ""; if (v==0) return "--"; string s; for (int i= 0; i<= 3; i++) { if (!s.empty()) s= '.' + s; s= IntStr( v % 256 ) + s; v= v / 256; } // for return 'V' + s; } // VersionStr // Get as version long 0x0a0b0c0d CVersion VersionNr( string s ) { long v= 0x00000000; string a; int j= s.find( 'V',0 ); if (j==0) s= s.substr( 1, s.length()-1 ); if (s.length()==8 && // direct conversion s.find( '.',0 )==string::npos) { return LHex( s ); } // if for (int i= 0; i<= 3; i++) { a= s; j= a.find( '.',1 ); if (j>=1) { a= a.substr( 0,j ); s= s.substr( j+1, s.length()-j-1 ); } else s= ""; // if j= atoi( a.c_str() ); v= 256*v + j; } // for return v; } // VersionNr bool SameBegin( string s, string cmp ) { ssize_t w= s.length()-cmp.length(); return w>=0 && s.find ( cmp, 0 )==0; } // SameBegin bool SameEnd ( string s, string cmp ) { ssize_t w= s.length()-cmp.length(); return w>=0 && s.find ( cmp, w )==(size_t)w; } // SameEnd // Replace 0A -> 0B, TAB -> ' ' when saving void ReplaceSave( cAppCharP str, string &rslt ) { unsigned char* s= (unsigned char*)str; // support UTF8 as well char ch= '\0'; rslt= ""; while (*s!='\0') { bool ok= true; switch (*s) { case 0x0A : ch= 0x0B; break; case 0x09 : ch= ' '; break; // TAB -> SP case 0x1D : ch= *s ; break; // do not touch ARR Sep default : if (*s>=0x20 && *s!=0x7F) ch= *s; else ok= false; // ignore others } // switch s++; if (ok) rslt+= ch; } // while } // ReplaceSave // Replace 0B -> 0A, when loading void ReplaceLoad( cAppCharP str, string &rslt ) { unsigned char* s= (unsigned char*)str; // support UTF8 as well char ch= '\0'; rslt= ""; while (*s!='\0') { bool ok= true; switch (*s) { case 0x0B : ch= 0x0A; break; case 0x09 : case 0x1D : ch= *s ; break; // do not touch ARR Sep default : if (*s>=0x20 && *s!=0x7F) ch= *s; else ok= false; // ignore others } // switch s++; if (ok) rslt+= ch; } // while } // ReplaceLoad // ---------------------------------------------------------------------- string Apo ( string s ) { return "'" + s + "'"; } // Get string within single quotes string Parans( string s ) { return "(" + s + ")"; } // Get string within parans string Bracks( string s ) { return "[" + s + "]"; } // Get string within brackets void CutCh ( string &s ) { s= s.substr( 1, s.length()-1 ); } // Cut 1st char void CutLSP( string &s ) { while (s.find( " ",0 )==0) CutCh( s ); } // Cut all leading SP // Token separation bool NextToken( string &s, string &nx, string sep ) { nx= ""; CutLSP ( s ); if ( s.empty()) return false; string::size_type len= s.length(); string::size_type pos= s.find( sep, 0 ); // search for the last separator if (pos==string::npos) { nx= s; // no separation possible, result is all s = ""; } else { int sepLen= sep.length(); nx= s.substr( 0, pos ); // separate, if found s = s.substr( pos+sepLen,len-pos-sepLen+1 ); CutLSP( s ); } // if return true; } // NextToken string LineConv( string str, uInt32 maxLen, bool visibleN ) { cAppCharP BN = "\\n"; string s, nx, value; bool first= true; bool b= false; bool e= false; if (visibleN) { string::size_type len= str.length(); if (len>0) { b= str.find ( "\n", 0 )==0; e= str.rfind( "\n", len-1 )==len-1; } // if } // if while (NextToken( str,nx, "\n" )) { if (first && str.empty()) return nx; string rema; // cut \r NextToken( nx,rema, "\r" ); nx= rema; string v= nx; if (NextToken( nx,value, ":" ) && !nx.empty()) { if (!s.empty()) { if (visibleN) s+= BN; else s+= " "; } // if s+= v; } // if first= false; } // while if (b) s= BN + s; if (e) s= s + BN; if (maxLen>0 && maxLen, string string ItemID_Info( cItemID aID, string aName ) { string id; if (aID) { if (aID->item) id= aID->item; if (aID->parent) { string p= aID->parent; if (!p.empty()) id+= "," + p; } // if } // if id= Parans( id ); if (!aName.empty()) id= aName + "=" + id; return id; } // ItemID_Info // Get string string MapID_Info( cMapID mID ) { string id; if (mID) { if (mID->localID) id+= Apo( mID->localID ) + " "; if (mID->remoteID) id+= Apo( mID->remoteID ) + " "; id+= HexStr( mID->flags ) + " "; id+= IntStr( mID->ident ); } // if id= "map=" + Parans( id ); return id; } // MapID_Info // Concat and string ConcatPaths( string path1, string path2, bool isJava ) { if (path2.empty()) return path1; if (path1.empty()) return path2; if (isJava) path1+= '/'; else { #ifdef _WIN32 path1+= '\\'; #else path1+= '/'; #endif } // if return path1 + path2; } // ConcatPaths // Concat , and string ConcatPaths( string path1, string path2, string path3, bool isJava ) { return ConcatPaths( ConcatPaths ( path1, path2, isJava ), path3, isJava ); } // ConcatPaths /*! Notation: "!" */ string ConcatNames( string name1, string name2, string sep ) { if (!name1.empty() && !name2.empty()) name1+= sep; name1+= name2; return name1; } // ConcatNames static bool Chk( string s, string &aDat, cAppCharP &q, cAppCharP &qV, int offs ) { string::size_type pos= aDat.find( s, 0 ); do { // either at the beginning ... if (pos==0) break; // ... or right after a '\n' pos= aDat.find( "\n" + s, 0 ); if (pos==string::npos) return false; pos++; // without \n at the beginning } while (false); q = aDat.c_str() + pos; qV= q + s.length() + offs; return true; } // Chk static bool GetField_R( string &aDat, string aKey, string &value, bool removeIt ) { cAppCharP q; cAppCharP qV; cAppCharP qN; cAppCharP qR; value= ""; // in case of not found if (!Chk( aKey + StdPattern, aDat, q,qV, 0 ) && // is it one of these types ? !Chk( aKey + ArrayPattern, aDat, q,qV,-1 ) && !Chk( aKey + ";", aDat, q,qV,-1 )) return false; qN= strstr( q,"\n" ); // search for next separator bool last= qN==NULL; if (last) qN= (cAppCharP)q + strlen( q ); // it's the last field ? qR= qN-1; if (*qR!='\r') qR= qN; // ignore \r value.assign ( qV, qR-qV ); // get the snippet if (removeIt) { cAppCharP qE= qN; if (*qE) qE++; if (last) { // if it is the last one, cut line break before as well while (q>aDat.c_str()) { q--; if (*q!='\n' && *q!='\r') { q++; break; } } // while } // if string::size_type pos= q-aDat.c_str(); // offset to at string::size_type n = qE-q; // size of the field aDat= aDat.erase( pos, n ); } // if return true; } // GetField_R bool GetField( string aDat, string aKey, string &value ) { return GetField_R ( aDat, aKey, value, false ); } // GetField bool RemoveField( string &aDat, string aKey, string &removedValue ) { return GetField_R ( aDat, aKey, removedValue, true ) && !removedValue.empty(); } // RemoveField bool FlagOK( string aDat, string aKey, bool isYes ) { string value; GetField( aDat, aKey, value ); bool ok, emp= aKey.empty(); if (isYes) { ok= !emp && ( value=="yes" || value=="true" || value=="both" ); } else { ok= emp || !( value=="no" || value=="false" ); } //printf( "value=%-10s isYes=%-5d ok=%-5d aEmp=%-5d aKey='%s'\n", // value.c_str(), isYes, ok, aDat.empty(), aKey.c_str() ); return ok; } // FlagOK bool FlagBoth( string aDat, string aKey ) { string value; GetField( aDat, aKey, value ); return value=="both"; } // FlagBoth void FilterFields( string &aDat, string aFilter ) { string s, removedValue; cAppCharP qN; cAppCharP qR; cAppCharP q= aFilter.c_str(); while (*q) { qN= strstr( q,"\n" ); if (!qN) qN= (cAppCharP)q + strlen( q ); qR= qN-1; if (*qR!='\r') qR= qN; s.assign( q, (unsigned int)( qR-q ) ); q= qN; if (*q) q++; RemoveField( aDat, s, removedValue ); } // while } // FilterFields /* ---------- global context handling ------------------------ */ bool GlobContextFound( string dbName, GlobContext* &g ) { while (g!=NULL) { if (dbName==g->refName) break; // work is done if (strcmp( g->refName,"" )==0) { strcpy( g->refName, dbName.c_str() ); return false; } // if if (g->next==NULL) { return false; } // if g= g->next; } // while return g!=NULL && g->ref!=NULL; } // GlobContextFound /* ---------- Tunnel itemKey --------------------------------- */ TSyError OpenTunnel_ItemKey( TunnelWrapper* tw ) { TSyError err, cer; SDK_UI_Struct* ui= &tw->tCB->ui; KeyH tKey, sKey; err= ui->OpenSessionKey( tw->tCB, tw->tContext, &sKey, 0 ); if (!err) { err= ui->OpenKeyByPath ( tw->tCB, &tKey, sKey, "tunnel", 0 ); if (!err) { err= ui->OpenKeyByPath ( tw->tCB, &tw->tItemKey, tKey, "item", 0 ); cer= ui->CloseKey ( tw->tCB, tKey ); if (!err) err= cer; } // if cer= ui->CloseKey ( tw->tCB, sKey ); if (!err) err= cer; } // if return err; } // OpenTunnel_ItemKey TSyError CloseTunnel_ItemKey( TunnelWrapper* tw ) { SDK_UI_Struct* ui= &tw->tCB->ui; return ui->CloseKey( tw->tCB, tw->tItemKey ); } // CloseTunnel_ItemKey #if defined __cplusplus } // namespace */ #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/SDK_support.h0000755000373300037200000001644012424517753027367 0ustar00nightlyallusers00000000000000/* * File: SDK_support.h * * Author: Beat Forster (bfo@synthesis.ch) * * Some SDK support utility functions for C++ * * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * */ #ifndef SDK_SUPPORT_H #define SDK_SUPPORT_H #include "sync_include.h" // import some global things #include namespace sysync { /*! Search for separators */ bool SepFound( string name, string::size_type &pos, string sep= "!", bool backwards= false ); // ---- Bracket (LIB) support /*! Returns true, if belongs to an internal LIB. * Returns false for DLL or JNI (Java Native Interface) access */ bool IsLib( string name ); /*! Returns true, if is within brackets: "[aaa]" */ bool InBracks( string name ); /*! Cut brackets, if at beginning and end * Returns true, if is within brackets: "[aaa]" */ bool CutBracks( string &name ); /*! Cut the brackets at beginning/end of */ string NoBracks( string name ); /*! Add brackets at beginning/end of * if not yet there and if not empty string */ string AddBracks( string name ); /*! Get plug-in's main path of , e.g. "aaa!bbb" ==> "aaa" */ string Plugin_MainName( string name ); /*! Get plug-in's sub path of , e.g. "aaa!bbb" ==> "bbb" */ string Plugin_SubName ( string name ); /*! Get the two path's and * Returns true, if sSub is not empty "" */ bool WithSubSystem ( string name, string &sMain, string &sSub ); /*! Returns true if names contains " ADMIN" at the end * The " ADMIN" part will be ut, if available */ bool IsAdmin( string &aContextName ); // ------ command line utility functions ------------------------------------- class CLine { public: CLine() { fArgc= 0; } void InitOptions( int argc, char* argv[] ); // assign command line arguments void StrOpt ( char opt, int n, string &value ); // Get th option string of void GetName ( int n, string &value ); bool NextOpt ( char opt, int &n, string &value ); // Get next option, if available void IntOpt ( char opt, int n, uInt32 &value ); void IntOpt ( char opt, int n, sInt32 &value ); void IntOpt ( char opt, int n, uInt16 &value ); void IntOpt ( char opt, int n, sInt16 &value ); bool Opt_Found ( char opt ); // check for a specific option private: int fArgc; char** fArgv; }; // Cline // ---- Capabilities support -------------------------------------------------------- /*! Add a fieldname with "no", "yes" or "both" attribute */ void NoField( string &s, string fieldName ); void YesField( string &s, string fieldName ); void BothField( string &s, string fieldName ); /*! Add the minimum supported version for the plugin to * NOTE: If \ is not specified or lower than the system's * minimum version, the system's minimum version will be taken. * If \ is higher, it will be directly returned. */ void MinVersion ( string &s, CVersion internalMinVersion= 0 ); /*! Add sub system's version, if smaller than internal */ void SubVersion ( string &s, CVersion subSysVersion ); /*! Sub system's name; additionally this is a capability separator * So all following capabilities belong to the sub system */ void SubSystem ( string &s, string subSysName ); /*! Add the manufacturer's to \ */ void Manufacturer( string &s, string name ); /*! Add a short description , what the module is doing to */ void Description ( string &s, string desc ); /*! Add a string to */ void GuidStr ( string &s, string guidStr ); /*! Add a string to */ void BuiltIn ( string &s, string plugin ); /*! Add global context information to */ void GContext ( string &s, GlobContext* gContext ); /*! Add capability error */ void CapaError ( string &s, TSyError err ); // ---- utility functions ---------------------------------------------------------- /* Allocate local memory for an item */ void MapAlloc ( MapID rslt, cMapID mID ); void ItemAlloc ( ItemID rslt, cItemID aID ); void BlockAlloc( appPointer *newPtr, appPointer bPtr, uInt32 bSize ); /*! Convert \ into \ string for Save/Load operations */ void ReplaceSave( cAppCharP str, string &rslt ); void ReplaceLoad( cAppCharP str, string &rslt ); /*! Get int value as string */ string IntStr( sInt32 i ); /*! Get ptr address value as string */ string RefStr( void* a, bool asHex= true ); /*! Get byte/hex/longhex value as string */ string ByteStr( uInt8 h ); string HexStr( uInt16 h ); string LHexStr( uInt32 h ); /*! Get as int value */ int HexNr( char ch ); /*! Get string as hex value */ void* LHexRef( string v ); long LHex ( string v ); /*! Get boolean as const char string */ cAppCharP Bo ( bool b ); /*! Get boolean as short const char string "v"=true / "o"=false */ cAppCharP BoS( bool b ); /*! Get as version string Va.b.c.d */ string VersionStr( CVersion v ); /*! Get as version long 0x0a0b0c0d */ CVersion VersionNr ( string v ); /* true, if starts/ends with */ bool SameBegin( string s, string cmp ); bool SameEnd ( string s, string cmp ); /*! Get a string within single quotes */ string Apo ( string s ); /*! Get a string within parans */ string Parans ( string s ); /*! Get a string within brackets */ string Bracks ( string s ); /*! Token separation */ void CutCh ( string &s ); void CutLSP ( string &s ); bool NextToken( string &s, string &nx, string sep=" " ); /*! Display a line with and removed '\n' */ string LineConv( string str, uInt32 maxLen= 0, bool visibleN= false ); /*! Get (\,\ \ \) string */ string MapID_Info ( cMapID mID ); /*! Get (\,\) string */ string ItemID_Info( cItemID aID, string aName= "" ); /*! Concatenate ,,[] with OS specific separator in-between */ string ConcatPaths( string path1, string path2, bool isJava= false ); string ConcatPaths( string path1, string path2, string path3, bool isJava= false ); /*! Notation: "!" */ string ConcatNames( string name, string subName, string sep= "!" ); // ----------------------------------------------------------------------------------- /*! Get / field from . will be returned */ bool GetField ( string aDat, string aKey, string &value ); /*! Remove field from . will be returned */ bool RemoveField( string &aDat, string aKey, string &removedValue ); /*! Check if is - "yes"/"true/"both" ( = true ) * - not available or NOT "no"/"false" ( else ) */ bool FlagOK ( string aDat, string aKey, bool isYes= false ); /*! Check if is "both" */ bool FlagBoth( string aDat, string aKey ); /*! filter out item fields from . Result is */ void FilterFields( string &aDat, string aFilter ); /* ---------- global context handling ------------------------ */ bool GlobContextFound( string dbName, GlobContext* &g ); /* ---------- UI call-in: tunnel itemKey --------------------- */ TSyError OpenTunnel_ItemKey( TunnelWrapper* tw ); TSyError CloseTunnel_ItemKey( TunnelWrapper* tw ); } // namespace #endif /* SDK_SUPPORT */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/SDK_util.c0000755000373300037200000005351512424517753026627 0ustar00nightlyallusers00000000000000/* * File: SDK_util.c * * Authors: Beat Forster * * * SDK utility functions for * - version handling * - string alloc/dispose * - debug/callback * * written in Std C, can be used in C++ as well * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #include "sync_dbapidef.h" #include "SDK_util.h" #include #include #include #ifndef __MACH__ #include #endif #ifdef ANDROID #include "android/log.h" #endif #define MyDB "SDK" /* local debug name */ #define Old_SDKversionMask 0xffff00ff /* Old mask for version comparison: Omit OS identifier */ #define maxmsglen 1024 /* Maximum string length for callback string */ /* This StdC module is independent from namespace "sysync" */ /* Get the plug-in's version/subversion number * The plugin will contain a user defined 0..255 * This version number is defined by Synthesis and should not be changed: * The engine contains also a version number, and makes some comparisons. */ CVersion Plugin_Version( short buildNumber ) { #define P 256 long v; #define SDK_VERSION_MAJOR 1 /* Release: V1.9.1, change this if you need troubles */ #define SDK_VERSION_MINOR 9 #define SDK_SUBVERSION 1 /* allowed range for the local build number */ if (buildNumber< 0) buildNumber= 0; if (buildNumber>255) buildNumber= 255; v= ((SDK_VERSION_MAJOR *P + SDK_VERSION_MINOR)*P + SDK_SUBVERSION )*P + buildNumber; return v; } /* Plugin_Version */ /* Check, if is supported in * NOTE: For the SyncML engine internally everything is supported * This will be reflected with the fact that for 2.1.1.X * the engine's version was always much much higher. * Today the engine's version is equivalent to the SDK version. */ bool Feature_Supported ( CVersion versionFeature, CVersion currentVersion ) { CVersion v= currentVersion; if (v=versionFeature; } /* FeatureSupported */ /* Check, if is equivalent to */ bool Feature_SupportedEq( CVersion versionFeature, CVersion currentVersion ) { CVersion v= currentVersion; if (vlen) n= len; /* never more than the length of */ } /* if */ cp= (char*)malloc( n+1 ); if (cp) { strncpy( cp, s, n ); /* not yet NUL terminated !! */ cp[ n ]= '\0'; } return cp; } /* StrAllocN */ /* Allocate local memory for a string */ appCharP StrAlloc ( cAppCharP s ) { return StrAllocN( s, strlen( s ), true ); } /* StrAlloc */ /* !Dispose a string which has been allocated with 'StrAlloc' */ void StrDispose( void* s ) { if (s!=NULL) free( s ); } /* StrDispose */ /* ------------------ field operations ------------------------- */ bool Field( cAppCharP item, cAppCharP key, char** field ) { char* b; char* e; char* t= (char*)item; *field= NULL; while (true) { b= strstr( t,key ); if (!b) break; /* available ? */ e= strstr( b,"\r" ); if (!e) e= strstr( b,"\n" ); /* get the end of this field */ if (b==item || *(b-1)=='\r' || *(b-1)=='\n') { b+= strlen( key )+1; if (*(b-1)==':') { /* correctly separated ? */ if (!e) *field= StrAlloc ( b ); /* either the rest */ else *field= StrAllocN( b, e-b, false ); /* or till next field */ return *field != NULL; } /* if */ } /* if */ if (!e) break; t= e+1; /* go to the next field */ } /* loop */ return false; } /* Field */ bool SameField( cAppCharP item, cAppCharP key, cAppCharP field ) { char* vv; bool ok= Field( item, key, &vv ); /* get the field */ if (ok) { ok= strcmp( field,vv )==0; /* and compare it with */ StrDispose ( vv ); /* is no longer used now */ } /* if */ return ok; } /* SameField */ /* ------------------ callback system -------------------------------------- */ /* Initialize to safe defaults, useable for Std C as well * NOTE: The current = latest available will be taken */ static bool BadCB( void* aCallbackRef ) { DB_Callback cb= aCallbackRef; if (cb==NULL) { printf( "bad cb==NULL\n" ); return true; } /* if */ if (cb->callbackRef!=cb) { printf( "bad callbackRef %08lX <> %08lX\n", (unsigned long)cb->callbackRef, (unsigned long)cb ); return true; } /* if */ return false; /* false= it's ok */ } /* BadCB */ void NBlk( void* aCallbackRef ) { int i; DB_Callback cb= aCallbackRef; if (!CB_OK( cb,2 )) return; /*if ( BadCB( aCallbackRef )) return;*/ for (i=0; ilCount; i++) printf( " " ); } /* NBlk */ static void BeginBlk( void* aCallbackRef, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText ) { DB_Callback cb= aCallbackRef; if ( BadCB( aCallbackRef )) return; NBlk( cb ); printf( "<%s> %s %s\n", aTag, aDesc, aAttrText ); cb->lCount++; } /* BeginBlk */ static void EndBlk( void* aCallbackRef, cAppCharP aTag ) { DB_Callback cb= aCallbackRef; if (!CB_OK( cb,2 )) return; /*if ( BadCB( aCallbackRef )) return;*/ cb->lCount--; NBlk( cb ); printf( "\n", aTag ); } /* EndBlk */ static void EndThread( void* aCallbackRef ) { DB_Callback cb= aCallbackRef; if (!CB_OK( cb,2 )) return; /*if ( BadCB( aCallbackRef )) return;*/ NBlk( cb ); printf( "=EndThread=\n" ); } /* EndThread */ /* -------------------------------------------------------------------- */ void InitCallback( void* aCB, uInt16 aVersion, void* aRoutine, void* aExoticRoutine ) { DB_Callback cb= aCB; if (!cb) return; cb->callbackVersion= aVersion; cb->callbackRef = cb; /* the callback pointer is the cb itself here */ if (CB_OK( cb,1 )) { cb->debugFlags = 0; /* debug disable so far */ cb->DB_DebugPuts = aRoutine; if (aRoutine) { if (aExoticRoutine) cb->debugFlags= DBG_PLUGIN_ALL; else cb->debugFlags= DBG_PLUGIN_INT + DBG_PLUGIN_DB; } /* if */ cb->cContext= 0; /* contexts */ cb->mContext= 0; cb->sContext= 0; } /* if */ if (CB_OK( cb,2 )) { cb->DB_DebugBlock = BeginBlk; /* level 2 */ cb->DB_DebugEndBlock = EndBlk; cb->DB_DebugEndThread= EndThread; cb->lCount = 0; } /* if */ if (CB_OK( cb,3 )) cb->DB_DebugExotic = aExoticRoutine; /* level 3 */ if (CB_OK( cb,4 )) cb->allow_DLL_legacy= 0; /* false */ /* level 4 */ if (CB_OK( cb,5 )) cb->allow_DLL = 0; /* false */ /* level 5 */ if (CB_OK( cb,6 )) { cb->reserved1= 0; /* level 6 */ cb->reserved2= 0; cb->reserved3= 0; cb->reserved4= 0; } /* if */ if (CB_OK( cb,7 )) { cb->thisCB = cb; /* level 7 */ cb->logCount= 0; } /* if */ if (CB_OK( cb,8 )) { cb->thisBase = NULL; /* level 8 */ cb->jRef = NULL; cb->gContext = 0; cb->ui.SetStringMode = NULL; cb->ui.InitEngineXML = NULL; cb->ui.InitEngineFile = NULL; cb->ui.InitEngineCB = NULL; cb->ui.OpenSession = NULL; cb->ui.OpenSessionKey = NULL; cb->ui.SessionStep = NULL; cb->ui.GetSyncMLBuffer = NULL; cb->ui.RetSyncMLBuffer = NULL; cb->ui.ReadSyncMLBuffer = NULL; cb->ui.WriteSyncMLBuffer= NULL; cb->ui.CloseSession = NULL; cb->ui.OpenKeyByPath = NULL; cb->ui.OpenSubkey = NULL; cb->ui.DeleteSubkey = NULL; cb->ui.GetKeyID = NULL; cb->ui.SetTextMode = NULL; cb->ui.SetTimeMode = NULL; cb->ui.CloseKey = NULL; cb->ui.GetValue = NULL; cb->ui.GetValueByID = NULL; cb->ui.GetValueID = NULL; cb->ui.SetValue = NULL; cb->ui.SetValueByID = NULL; } /* if */ if (CB_OK( cb,9 )) { cb->SDK_Interface_size= sizeof(SDK_Interface_Struct); /* level 9 */ cb->dt.StartDataRead = NULL; /* tunnel callback functions, for internal use only */ cb->dt.ReadNextItem = NULL; cb->dt.ReadItem = NULL; cb->dt.EndDataRead = NULL; cb->dt.StartDataWrite = NULL; cb->dt.InsertItem = NULL; cb->dt.UpdateItem = NULL; cb->dt.MoveItem = NULL; cb->dt.DeleteItem = NULL; cb->dt.EndDataWrite = NULL; } /* if */ if (CB_OK( cb,11 )) { cb->dt.DisposeObj = NULL; cb->dt.ReadNextItemAsKey= NULL; cb->dt.ReadItemAsKey = NULL; cb->dt.InsertItemAsKey = NULL; cb->dt.UpdateItemAsKey = NULL; } /* if */ } /* InitCallback */ /* Initialize to safe defaults and "CB_PurePrintf", usable for Std C as well */ /* Normal debug output */ void InitCallback_Pure ( void* aCB, uInt16 aVersion ) { InitCallback ( aCB, aVersion, CB_PurePrintf, NULL ); } /* InitCallback_Pure */ /* Initialize to safe defaults and "CB_PurePrintf", usable for Std C as well */ /* Normal and exotic debug output */ void InitCallback_Exotic( void* aCB, uInt16 aVersion ) { InitCallback ( aCB, aVersion, CB_PurePrintf, CB_PurePrintf ); } /* InitCallback_Exotic */ /* The for 'InitCallback', when a simple "printf" is * requested for the callback. * * Routine must be defined as * typedef void (*DB_DebugPuts_Func)( void *aCallbackRef, cAppCharP aText ); */ void CB_PurePrintf( void* aCB, cAppCharP aText ) { DB_Callback cb= aCB; if (!CB_OK( cb,2 )) return; /*if ( BadCB( aCB )) return;*/ NBlk( cb ); printf( "%s\n", aText ); } /* CB_PurePrintf */ /* Get the size of the SDK_Interface_Struct to be copied */ TSyError SDK_Size( void* aCB, uInt32 *sSize ) { TSyError err= LOCERR_OK; DB_Callback cb = aCB; do { /* try to get the SDK_Interface_Struct of the calling engine */ if (cb->callbackVersion< SDK_Interface_Struct_V8) { err= LOCERR_TOOOLD; break; } if (cb->callbackVersion==SDK_Interface_Struct_V8) *sSize= SDK_Interface_Struct_V8_Size; else *sSize= cb->SDK_Interface_size; /* but it must neither be smaller than version 8 size nor larger than the own size */ if (*sSize< SDK_Interface_Struct_V8_Size) { err= LOCERR_TOOOLD; break; } if (*sSize>sizeof(SDK_Interface_Struct)) *sSize= sizeof(SDK_Interface_Struct); } while (false); /*printf( "sizeof=%d sSize=%d err=%d\n", sizeof(SDK_Interface_Struct), *sSize, err );*/ return err; } /* SDK_Size */ /* ---------- debug output ----------------------------------- */ /* prints directly to the screen */ static void ConsolePuts( cAppCharP msg ) { #ifdef ANDROID __android_log_write( ANDROID_LOG_DEBUG, "ConsolePuts", msg ); #else printf( "%s\n", msg ); #endif } /* ConsolePuts */ #if !defined(SYSYNC_ENGINE) && !defined(UIAPI_LINKED) /* the Synthesis SyncML engine has its own implementation */ /* => use this code in SDK only */ void ConsoleVPrintf( cAppCharP format, va_list args ) { #ifdef SYDEBUG char msg[ maxmsglen ]; msg[ 0 ]= '\0'; /* start with an empty */ vsnprintf ( msg, maxmsglen,format,args ); /* assemble the message string */ ConsolePuts( msg ); /* write the string */ #endif } /* ConsoleVPrintf */ void ConsolePrintf( cAppCharP text, ... ) { va_list args; va_start ( args,text ); ConsoleVPrintf( text,args ); va_end ( args ); } /* ConsolePrintf */ #endif /* Get the callback version of */ uInt16 CB_Version( void* aCB ) { DB_Callback cb= aCB; if (cb) return cb->callbackVersion; else return 0; } /* CB_Version */ /* Check, if structure is at least */ bool CB_OK( void* aCB, uInt16 minVersion ) { return CB_Version( aCB )>=minVersion; } /* Check, if structure supports UI callback (cbVersion>=6) */ /* static bool CB_UI( void* aCB ) { return CB_OK( aCB,6 ); } */ /* Check, if structure supports (cbVersion>=8) and <> 0 */ bool CB_gContext ( void* aCB ) { DB_Callback cb= aCB; return CB_OK ( aCB,8 ) && cb->gContext!=0; } /* CB_gContext */ /* Check, if structure supports CA_SubSytem (cbVersion>=10) */ bool CB_SubSystem( void* aCB ) { return CB_OK( aCB,10 ); } /* Check, if structure is at least and DBG_PLUGIN_DB is set */ bool DB_OK( void* aCB, uInt16 minVersion ) { DB_Callback cb= aCB; /* at least one flag must be set */ return CB_OK( aCB,minVersion ) && (DBG_PLUGIN_DB & cb->debugFlags)!=DBG_PLUGIN_NONE; } /* DB_OK */ /* Check, if structure is at least and one of is set */ bool Callback_OK( void* aCB, uInt16 minVersion, uInt16 debugFlags ) { DB_Callback cb= aCB; /* at least one flag must be set */ return CB_OK( aCB,minVersion ) && (debugFlags & cb->debugFlags)!=DBG_PLUGIN_NONE; } /* Callback_OK */ /* Normal callback output of */ void CallbackPuts( void* aCB, cAppCharP text ) { DB_Callback cb= aCB; if (!Callback_OK( aCB, 1,DBG_PLUGIN_ALL )) return; if (cb->DB_DebugPuts) cb->DB_DebugPuts( cb->callbackRef, text ); } /* CallbackPuts */ /* Exotic callback output of */ static void CallbackExotic( void* aCB, cAppCharP text ) { DB_Callback cb= aCB; if (!Callback_OK( aCB, 3,DBG_PLUGIN_ALL )) { CallbackPuts( aCB,text ); return; } if (cb->DB_DebugExotic) cb->DB_DebugExotic( cb->callbackRef, text ); } /* CallbackExotic */ static void CallbackVPrintf( DB_Callback aCB, cAppCharP format, va_list args, uInt16 outputMode ) { #ifdef SYDEBUG #ifdef __GNUC__ int isMax; #endif char message[ maxmsglen ]; char* ptr= (char*)&message; #ifdef __GNUC__ // need a copy for vasprintf() call va_list copy; va_copy(copy, args); #endif message[ 0 ]= '\0'; /* start with an empty */ vsnprintf( message, maxmsglen, format,args ); /* assemble the message string */ #ifdef __GNUC__ isMax= strlen(message)==maxmsglen-1; if (isMax && vasprintf( &ptr, format, copy ) != -1) {}; va_end(copy); #endif switch (outputMode) { case OutputNorm : CallbackPuts ( aCB, ptr ); break; /* case OutputExoticBefore: */ /* case OutputExoticAfter : */ case OutputExotic : CallbackExotic( aCB, ptr ); break; case OutputConsole : case OutputExoticBefore: case OutputExoticAfter : case OutputBefore : case OutputAfter : NBlk ( (void*)aCB ); ConsolePuts ( ptr ); break; } /* switch */ #ifdef __GNUC__ if (isMax) free( ptr ); #endif #endif } /* CallbackVPrintf */ void DEBUG_( void* aCB, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,DBG_PLUGIN_ALL )) { va_start ( args,text ); CallbackVPrintf( aCB, text,args, false ); va_end ( args ); } /* if (gDebug) */ #endif } /* DEBUG_ */ #ifdef SYDEBUG void DoDEBUG( void* aCB, uInt16 outputMode, bool withIntro, cAppCharP ident, cAppCharP routine, va_list args, cAppCharP text ) { cAppCharP dbIntro= ""; cAppCharP id = ""; cAppCharP isX = ""; cAppCharP p = ""; char* s; int size; if (*routine!='\0') { if (withIntro) { dbIntro= "##### "; if (outputMode==OutputBefore || outputMode==OutputExoticBefore) dbIntro= ">>>>> "; if (outputMode==OutputAfter || outputMode==OutputExoticAfter) dbIntro= "<<<<< "; } /* if */ id= ident; #if defined SDK_LIB isX= ": "; #elif defined SDK_DLL isX= " (DLL): "; #else isX= " (LNK): "; #endif if (*text!='\0') p= ": "; } /* if */ size= strlen(dbIntro) + strlen(id) + strlen(isX) + strlen(routine) + strlen(p) + strlen(text) + 1; s= (char*)malloc( size ); if (s) { sprintf( s, "%s%s%s%s%s%s", dbIntro,id,isX,routine,p,text ); CallbackVPrintf( aCB, s,args, outputMode ); free ( s ); } } /* DoDEBUG */ #endif /* ------------------------------------------------------------------------------------- */ void DEBUG_Call( void* aCB, uInt16 debugFlags, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,debugFlags )) { va_start ( args,text ); DoDEBUG( aCB, false,true, ident,routine, args,text ); va_end ( args ); } /* if */ #endif } /* DEBUG_Call */ void DEBUG_INT( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,DBG_PLUGIN_INT )) { va_start ( args,text ); DoDEBUG( aCB, false,true, ident,routine, args,text ); va_end ( args ); } /* if */ #endif } /* DEBUG_INT */ void DEBUG_DB( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,DBG_PLUGIN_DB )) { va_start ( args,text ); DoDEBUG( aCB, false,true, ident,routine, args,text ); va_end ( args ); } /* if */ #endif } /* DEBUG_DB */ /* ------------------------------------------------------------------------------------- */ void DEBUG_Exotic_INT( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,DBG_PLUGIN_INT ) && Callback_OK( aCB, 1,DBG_PLUGIN_EXOT )) { va_start ( args,text ); DoDEBUG( aCB, true,true, ident,routine, args,text ); va_end ( args ); } /* if */ #endif } /* DEBUG_Exotic_INT */ void DEBUG_Exotic_DB( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,DBG_PLUGIN_EXOT )) { va_start ( args,text ); DoDEBUG( aCB, true,true, ident,routine, args,text ); va_end ( args ); } /* if */ #endif } /* DEBUG_Exotic_DB */ void DEBUG_Exotic_DBW( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ) { #ifdef SYDEBUG va_list args; if (Callback_OK( aCB, 1,DBG_PLUGIN_EXOT )) { va_start ( args,text ); DoDEBUG( aCB, true,false,ident,routine, args,text ); va_end ( args ); } /* if */ #endif } /* DEBUG_Exotic_DBW */ /* ------------------------------------------------------------------------------------- */ /* Start of sub block */ void DEBUG_Block( void* aCB, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText ) { /* callbackVersion >= 2 support for blocks */ #ifdef SYDEBUG DB_Callback cb= aCB; if (Callback_OK( aCB, 2,DBG_PLUGIN_ALL ) && cb->DB_DebugBlock) cb->DB_DebugBlock( cb->callbackRef, aTag,aDesc,aAttrText ); else /* old */ DEBUG_DB( aCB, MyDB, aTag, "%s (%s) BEGIN", aAttrText,aDesc ); #endif } /* DEBUG_Block */ /* End of sub block */ void DEBUG_EndBlock( void* aCB, cAppCharP aTag ) { #ifdef SYDEBUG DB_Callback cb= aCB; if (Callback_OK( aCB, 2,DBG_PLUGIN_ALL ) && cb->DB_DebugEndBlock) cb->DB_DebugEndBlock( cb->callbackRef, aTag ); else /* old */ DEBUG_DB( aCB, MyDB, aTag, "END" ); #endif } /* DEBUG_EndBlock */ void DEBUG_EndThread( void* aCB ) { #ifdef SYDEBUG DB_Callback cb= aCB; if (Callback_OK( aCB, 2,DBG_PLUGIN_ALL ) && cb->DB_DebugEndThread) cb->DB_DebugEndThread( cb->callbackRef ); else /* old */ DEBUG_DB( aCB, MyDB, "THREAD", "END" ); #endif } /* DEBUG_EndThread */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/SDK_util.h0000755000373300037200000001510312424517753026623 0ustar00nightlyallusers00000000000000/* * File: SDK_util.h * * Authors: Beat Forster * * * Useful SDK utility functions * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #ifndef SDK_UTIL_H #define SDK_UTIL_H #include "sync_include.h" /* C/C++ and DLL/library support */ #ifdef __cplusplus extern "C" { using sysync::uInt16; using sysync::uInt32; using sysync::appCharP; using sysync::cAppCharP; using sysync::appPointer; using sysync::CVersion; using sysync::TSyError; #endif #if defined SYSYNC_ENGINE || defined PLUGIN_INFO #define DLL_Info "DLL:false" #else #define DLL_Info "DLL:true" #endif /*! Get the current version of the plug-in module. * The returned value will be incremented in future releases of the SDK. * Not to be changed by plug-in developer. * A customer defined can be set (0..255). */ CVersion Plugin_Version( short buildNumber ); /*! Check, if is supported in * NOTE: For the SyncML engine internally everything is supported * This will be reflected with the fact that for 2.1.1.X * the engine's version was always much much higher. * Today the engine's version is equivalent to the SDK version. */ bool Feature_Supported ( CVersion versionFeature, CVersion currentVersion ); /*! Check, if is equivalent to */ bool Feature_SupportedEq( CVersion versionFeature, CVersion currentVersion ); /*! Get the "PLATFORM:xxx" string as const definition */ cAppCharP MyPlatform( void ); /* ---------- allocate/dispose local memory for a string ----- */ /*! Allocate a string locally, with length \ */ appCharP StrAllocN ( cAppCharP s, int n, bool fullSize ); /*! Allocate a string locally */ appCharP StrAlloc ( cAppCharP s ); /* !Dispose a string which has been allocated with 'StrAlloc' */ void StrDispose( void* s ); /* ---------------- field operations ------------------------- */ /*! Gets the of at , if available */ bool Field ( cAppCharP item, cAppCharP key, appCharP *field ); /*! Returns true, if 's field is . */ bool SameField( cAppCharP item, cAppCharP key, cAppCharP field ); /* ---------- callback setup (for internal use only) --------- */ /*! Initialize the callback structure for debug output * For internal use only !! */ void NBlk ( void* aCB ); void InitCallback ( void* aCB, uInt16 aVersion, appPointer aRoutine, appPointer aExoticRoutine ); /*! Using 'CB_PurePrintf' as ; no overloading possible with Std C */ void InitCallback_Pure ( void* aCB, uInt16 aVersion ); void InitCallback_Exotic( void* aCB, uInt16 aVersion ); /* plus exotic output */ /*! If simple "printf" is requested for the callback. * 'CB_PurePrintf' can be given as for 'InitCallback. * For internal use only !! */ void CB_PurePrintf( void* aRef, cAppCharP aTxt ); /* Get the size of the SDK_Interface_Struct to be copied */ TSyError SDK_Size ( void* aCB, uInt32 *sSize ); /* ---------- debug output ----------------------------------- */ #ifndef SYSYNC_ENGINE /* if it is running standalone as DLL */ /* the Synthesis SyncML engine has its own implementation */ /* => use this code in SDK only */ void ConsoleVPrintf( cAppCharP format, va_list args ); void ConsolePrintf ( cAppCharP text, ... ); #endif /* Output modes */ #define OutputNorm 0 #define OutputExotic 1 #define OutputConsole 2 #define OutputBefore 3 #define OutputAfter 4 #define OutputExoticBefore 5 #define OutputExoticAfter 6 /* Get the callback version of */ uInt16 CB_Version( void* aCB ); /* Check, if structure is at least */ bool CB_OK ( void* aCB, uInt16 minVersion ); /* Check, if structure supports (cbVersion>=8) and <> 0 */ bool CB_gContext ( void* aCB ); /* Check, if structure supports CA_SubSytem (cbVersion>=10) */ bool CB_SubSystem( void* aCB ); /* Check, if structure is at least and DBG_PLUGIN_DB is set */ bool DB_OK ( void* aCB, uInt16 minVersion ); /* Check, if structure is at least and one of is set */ bool Callback_OK ( void* aCB, uInt16 minVersion, uInt16 debugFlags ); void CallbackPuts( void* aCB, cAppCharP text ); void DEBUG_ ( void* aCB, cAppCharP text, ... ); void DoDEBUG ( void* aCB, uInt16 outputMode, bool withIdent, cAppCharP ident, cAppCharP routine, va_list args, cAppCharP text ); /*! The debug logging callback call * The SyncML engine will write the text to the context assigned log file * * Input: : Callback variable of the context. The SyncML engine will * pass such a reference, when creating the module, session * or datastore context. The plug-in must store it within its * context for later use. * : Debug logging flags, bits0/1 are reserved, all others can be * defined plugin specific * : Normally the name of the plug-in module, usually defined as 'MyDB' * : The name of the current routine for reference * : The logging text in "printf" format. * ... : The parameters, defined at \ with %s, %d, %X ... */ void DEBUG_Call ( void* aCB, uInt16 debugFlags, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ); /*! The same as DEBUG_Call, but only when specific DBG_PLUGIN_INT/DBG_PLUGIN_DB flag is set */ void DEBUG_INT ( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ); void DEBUG_DB ( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ); /*! The same as DEBUG_Call/DEBUG_INT/DEBUG/DEBUG_DB, but only, if exotic flag is set */ void DEBUG_Exotic_INT ( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ); void DEBUG_Exotic_DB ( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ); void DEBUG_Exotic_DBW ( void* aCB, cAppCharP ident, cAppCharP routine, cAppCharP text, ... ); /*! Special block and thread markers * If \ starts with "-", this block will be displayed collapsed by default */ void DEBUG_Block ( void* aCB, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText ); void DEBUG_EndBlock ( void* aCB, cAppCharP aTag ); void DEBUG_EndThread ( void* aCB ); /* C/C++ and DLL/library support */ #if defined __cplusplus } // end extern "C" #endif #endif /* SDK_UTIL_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/UI_util.cpp0000644000373300037200000001523112424517753027051 0ustar00nightlyallusers00000000000000/* * File: UI_util.cpp * * Author: Beat Forster * * Programming interface between a user application * and the Synthesis SyncML client engine. * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ #ifdef HAVE_CONFIG_H # include #endif #include "prefix_file.h" #include "UI_util.h" #include "SDK_util.h" #include "SDK_support.h" // ---- include DLL functionality ---- #if defined _WIN32 #include #define DLL_Suffix ".dll" #elif defined MACOSX #include #define DLL_Suffix ".dylib" #define RFlags (RTLD_NOW + RTLD_GLOBAL) #elif defined LINUX #include #define DLL_Suffix ".so" #define RFlags RTLD_LAZY #else #define DLL_Suffix "" #endif // ----------------------------------- namespace sysync { static TSyError NotFnd( appPointer aRef, cAppCharP /* aName */ ) { TSyError err= LOCERR_OK; if (aRef==NULL) { err= DB_NotFound; //printf( "Not found: '%s' err=%d\n", aName, err ); } // if return err; } // NotFnd // Connect to DLL static TSyError ConnectDLL( cAppCharP aDLLname, appPointer &aDLL ) { #if defined _WIN32 aDLL= LoadLibrary( aDLLname ); #elif defined MACOSX || defined LINUX aDLL= dlopen( aDLLname, RFlags ); //printf( "'%s' %s\n", aDLLname, dlerror() ); #else aDLL= NULL; #endif return NotFnd( aDLL, aDLLname ); } // ConnectDLL // Get of at static TSyError DLL_Func( appPointer aDLL, cAppCharP aFuncName, appPointer &aFunc ) { #if defined _WIN32 aFunc= (appPointer)GetProcAddress( (HINSTANCE)aDLL, aFuncName ); #elif defined MACOSX || defined LINUX aFunc= dlsym( aDLL, aFuncName ); #else aFunc= NULL; #endif return NotFnd( aFunc, aFuncName ); } // DLL_Func static bool IsLib( cAppCharP name ) { int len= strlen(name); return len==0 || (name[ 0 ]=='[' && name[ len-1 ]==']'); // empty or embraced with "[" "]" } // IsLib // Connect SyncML engine TSyError UI_Connect( UI_Call_In &aCI, appPointer &aDLL, bool &aIsServer, cAppCharP aEngineName, CVersion aPrgVersion, uInt16 aDebugFlags ) { // Always search for BOTH names, independently of environment cAppCharP SyFName= "SySync_ConnectEngine"; cAppCharP FName= "ConnectEngine"; string name= aEngineName; TSyError err= 0; bool dbg= ( aDebugFlags & DBG_PLUGIN_DIRECT )!=0; CVersion engVersion; appPointer fFunc; ConnectEngine_Func fConnectEngine= NULL; aIsServer = false; do { aCI = NULL; // no such structure available at the beginning aDLL= NULL; if (dbg) printf( "name='%s' err=%d\n", name.c_str(), err ); if (name.empty()) { // not yet fully implemented: Take default settings aCI= new SDK_Interface_Struct; InitCallback_Pure( aCI, DB_Callback_Version ); aCI->debugFlags= aDebugFlags; break; } // if if (IsLib( name.c_str() )) { if (name == "[]") { #ifdef DBAPI_LINKED fConnectEngine= SYSYNC_EXTERNAL(ConnectEngine); #endif } else if (name == "[server:]") { aIsServer=true; #ifdef DBAPI_SRV_LINKED fConnectEngine= SySync_srv_ConnectEngine; #endif } break; } // if cAppCharP prefix = "server:"; size_t prefixlen = strlen(prefix); if (name.size() > prefixlen && !name.compare(0, prefixlen, prefix)) { // ignore prefix and if we find the lib, look for different entry points aIsServer=true; name = name.substr(prefixlen); SyFName= "SySync_srv_ConnectEngine"; FName= "srv_ConnectEngine"; } err= ConnectDLL( name.c_str(), aDLL ); // try with name directly if (dbg) printf( "modu='%s' err=%d\n", name.c_str(), err ); if (err) { name+= DLL_Suffix; err= ConnectDLL( name.c_str(), aDLL ); // try with suffix next } // if if (dbg) printf( "modu='%s' err=%d\n", name.c_str(), err ); if (err) break; cAppCharP fN= SyFName; err= DLL_Func( aDLL, fN, fFunc ); fConnectEngine= (ConnectEngine_Func)fFunc; if (dbg) printf( "func err=%d '%s' %s\n", err, fN, RefStr( (void*)fConnectEngine ).c_str() ); if (!fConnectEngine) { fN= FName; err= DLL_Func( aDLL, fN, fFunc ); fConnectEngine= (ConnectEngine_Func)fFunc; if (dbg) printf( "func err=%d '%s' %s\n", err, fN, RefStr( (void*)fConnectEngine ).c_str() ); } // if } while (false); if (fConnectEngine) err= fConnectEngine( &aCI, &engVersion, aPrgVersion, aDebugFlags ); if (dbg) printf( "call err=%d\n", err ); //DEBUG_DB ( aCI, MyMod, "ConnectEngine", "aCB=%08X eng=%08X prg=%08X aDebugFlags=%04X err=%d", // aCB, engVersion, aPrgVersion, aDebugFlags, err ); if (fConnectEngine && err) return err; return NotFnd( aCI, "ConnectEngine" ); } // UI_Connect TSyError UI_Disconnect( UI_Call_In aCI, appPointer aDLL, bool aIsServer ) { // Always search for BOTH names, independently of environment cAppCharP SyFName= "SySync_DisconnectEngine"; cAppCharP FName= "DisconnectEngine"; TSyError err= 0; appPointer fFunc; DisconnectEngine_Func fDisconnectEngine= NULL; do { if (aDLL==NULL) { if (aIsServer) { #ifdef DBAPI_LINKED fDisconnectEngine= SYSYNC_EXTERNAL(DisconnectEngine); #endif } else { #ifdef DBAPI_SRV_LINKED fDisconnectEngine= SySync_srv_DisconnectEngine; #endif } break; } // if if (aIsServer) { SyFName = "SySync_srv_DisconnectEngine"; FName = "srv_DisconnectEngine"; } cAppCharP fN= SyFName; err= DLL_Func( aDLL, fN, fFunc ); fDisconnectEngine= (DisconnectEngine_Func)fFunc; if (!fDisconnectEngine) { fN= FName; err= DLL_Func( aDLL, fN, fFunc ); fDisconnectEngine= (DisconnectEngine_Func)fFunc; } // if //printf( "func err=%d %08X\n", err, fConnectEngine ); } while (false); if (fDisconnectEngine) err= fDisconnectEngine( aCI ); //printf( "call err=%d\n", err ); //DEBUG_DB ( aCI, MyMod, "ConnectEngine", "aCB=%08X eng=%08X prg=%08X aDebugFlags=%04X err=%d", // aCB, engVersion, aPrgVersion, aDebugFlags, err ); if (fDisconnectEngine && err) return err; return NotFnd( aCI, "DisconnectEngine" ); } // UI_Disconnect } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/UI_util.h0000644000373300037200000000155512424517753026522 0ustar00nightlyallusers00000000000000/* * File: UI_util.h * * Author: Beat Forster * * Programming interface between a user application * and the Synthesis SyncML client engine. * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * * */ #include #include "sync_dbapidef.h" namespace sysync { class UIContext { public: UI_Call_In uCI; appPointer uDLL; string uName; }; // UIContext /* Function definitions */ TSyError UI_Connect ( UI_Call_In &aCI, appPointer &aDLL, bool &aIsServer, cAppCharP aEngineName, CVersion aPrgVersion, uInt16 aDebugFlags ); TSyError UI_Disconnect( UI_Call_In aCI, appPointer aDLL, bool aIsServer ); } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/admindata.cpp0000644000373300037200000001503312424517753027421 0ustar00nightlyallusers00000000000000/* * File: admindata.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * DBApi database adapter * Admin data handling * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * E X A M P L E C O D E * (text_db interface) * */ #include "admindata.h" #include "SDK_util.h" // include SDK utilities #include "SDK_support.h" namespace sysync { // the TAdminData class is part of sysync namespace #define P_Admin "ADM_" // admin table #define P_Map "MAP_" // map table // --------------------------------------------------------------------------- void TAdminData::Init( void* aCB, cAppCharP aDBName, string aMapPath, string aContextName, string sDevKey, string sUsrKey ) { fCB = aCB; // the callback for debug purposes fDBName = aDBName; // DBName, used for debug purposes myDB = fDBName.c_str(); // access the same way as in the textdb module fMapPath = aMapPath; fContextName= aContextName; fDevKey = sDevKey; fUsrKey = sUsrKey; } // Init /*! Reset the map counter for 'ReadNextMapItem' */ void TAdminData::ResetMapCounter() { fMap= &fMapList; } // ResetMapCounter // Get string string TAdminData::MapID_Flag_Str( cMapID mID, bool asHex ) { if (asHex) return HexStr( mID->flags ); else return IntStr( mID->flags ); // default is integer } // MapID_Flag_Str // Get , string string TAdminData::MapID_Str( cMapID mID ) { string id= mID->localID; if (*mID->remoteID!=0) { id+= ","; id+= mID->remoteID; } // if id+= " flags=" + MapID_Flag_Str( mID, true ); id+= " ident=" + IntStr ( (sInt32)mID->ident ); return id; } // MapID_Str // --------------------------------------------------------------------------- TSyError TAdminData::LoadAdminData( string aLocDB, string aRemDB, appCharP *adminData ) { TSyError err; TDBItem* actI; string combi = ConcatNames( fUsrKey, fContextName, "_" ); combi = ConcatNames( fDevKey, combi, "_" ); string admName= ConcatPaths( fMapPath, P_Admin + combi + ".txt" ); string mapName= ConcatPaths( fMapPath, P_Map + combi + ".txt" ); fAdmList.fFileName= admName; err= fAdmList.LoadDB( true, "ADM", fCB ); // Get all the elements of the list as a \n separated string string s= ""; actI= &fAdmList; bool found= ListNext( actI ); if (found) { TDBItemField* actK= &fAdmList.item; // the key identifier TDBItemField* actF= &actI->item; // the item current field while (ListNext( actK,actF )) { cAppCharP k= actK->field.c_str(); cAppCharP f= actF->field.c_str(); s+= KeyAndField( k,f ) + '\n'; } // while } else { // no such element: create a new one with empty admin data string newItemID; fAdmList.CreateEmptyItem( newItemID, actI ); DEBUG_DB( fCB, myDB, Da_LA, "newItemID='%s'", newItemID.c_str() ); } // if *adminData= StrAlloc( s.c_str() ); fAdm= actI; fAdmList.Disp_Items( fCB ); fMapList.fFileName= mapName; if (!mapName.empty()) { err= fMapList.LoadDB( false, "", fCB ); DEBUG_DB( fCB, myDB, Da_LA, "mapFile='%s' err=%d", fMapList.fFileName.c_str(), err ); } // if ResetMapCounter(); // and are not yes use in this implementation DEBUG_DB( fCB, myDB, Da_LA, "'%s' '%s'", aLocDB.c_str(),aRemDB.c_str() ); if (found) return LOCERR_OK; else return DB_NotFound; } /* LoadAdminData */ TSyError TAdminData::SaveAdminData( cAppCharP adminData ) { fAdmList.UpdateFields( fCB, adminData, fAdm, true ); fAdmList.Disp_Items ( fCB,Da_SA ); TSyError err= fAdmList.SaveDB( true, fCB ); if (!err) err= fMapList.SaveDB( false,fCB ); return err; } /* SaveAdminData */ // --------------------------------------------------------------------------- bool TAdminData::ReadNextMapItem( MapID mID, bool aFirst ) { if (aFirst) ResetMapCounter(); string s= "(EOF)"; bool ok= ListNext( fMap ); if ( ok ) { TDBItem* mpL= &fMapList; TDBItem* act= fMap; mID->localID = StrAlloc( act->itemID.c_str() ); mpL->Field( "0",act, s ); mID->remoteID= StrAlloc( s.c_str() ); mpL->Field( "1",act, s ); mID->flags = atoi ( s.c_str() ); mpL->Field( "2",act, s ); mID->ident = atoi ( s.c_str() ); s= MapID_Str( mID ); } // if DEBUG_DB( fCB, myDB,Da_RM, "%s", s.c_str() ); return ok; } // ReadNextMapItem TSyError TAdminData::GetMapItem( cMapID mID, TDBItem* &act ) { TDBItem* mpL= &fMapList; return mpL->GetItem_2( mID->localID, IntStr( (sInt32)mID->ident ).c_str(), mpL, act ); } // GetMapItem TSyError TAdminData::UpdMapItem( cMapID mID, TDBItem* act ) { TSyError err= fMapList.UpdateField( fCB, "0", mID->remoteID, act, false ); if (!err) err= fMapList.UpdateField( fCB, "1", MapID_Flag_Str( mID ).c_str(), act, false ); if (!err) err= fMapList.UpdateField( fCB, "2", IntStr( (sInt32)mID->ident ).c_str(), act, false ); return err; } // UpdMapItem TSyError TAdminData::InsertMapItem( cMapID mID ) { TDBItem* act; TSyError err= GetMapItem( mID, act ); if (!err) err= DB_Error; // Element already exists else { ItemID_Struct a; a.item = mID->localID; a.parent= const_cast(""); // map items are not hierarchical string newItemID; err= fMapList.CreateEmptyItem( &a, newItemID, act ); if (!err) err= UpdMapItem ( mID, act ); } // if DEBUG_DB( fCB, myDB,Da_IM, "%s err=%d", MapID_Str( mID ).c_str(), err ); return err; } // InsertMapItem TSyError TAdminData::UpdateMapItem( cMapID mID ) { TDBItem* act; TSyError err= GetMapItem( mID, act ); // Element does not yet exist ? if (!err) err= UpdMapItem( mID, act ); DEBUG_DB( fCB, myDB,Da_UM, "%s err=%d", MapID_Str( mID ).c_str(), err ); return err; } // UpdateMapItem TSyError TAdminData::DeleteMapItem( cMapID mID ) { TDBItem* act; TSyError err= GetMapItem( mID, act ); if (!err) err= fMapList.DeleteItem( act ); DEBUG_DB( fCB, myDB,Da_DM, "%s err=%d", MapID_Str( mID ).c_str(), err ); return err; } // DeleteMapItem } /* namespace */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/admindata.h0000644000373300037200000000375512424517753027076 0ustar00nightlyallusers00000000000000/* * File: admindata.h * * Author: Beat Forster (bfo@synthesis.ch) * * * DBApi database adapter * Admin data handling * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * E X A M P L E C O D E * (text_db interface) * */ #ifndef ADMINDATA_H #define ADMINDATA_H #include "sync_include.h" // import global things #include "sync_dbapidef.h" // get some definitions #include "SDK_util.h" // include SDK utilities #include "dbitem.h" #include namespace sysync { class TAdminData { public: void Init( void* aCB, cAppCharP aDBName, string aAdminPath, string aContextName, string sDevKey, string sUsrKey ); TSyError LoadAdminData ( string aLocDB, string aRemDB, appCharP *adminData ); TSyError SaveAdminData ( cAppCharP adminData ); bool ReadNextMapItem( MapID mID, bool aFirst ); TSyError InsertMapItem( cMapID mID ); TSyError UpdateMapItem( cMapID mID ); TSyError DeleteMapItem( cMapID mID ); private: void ResetMapCounter(); TSyError GetMapItem ( cMapID mID, TDBItem* &act ); TSyError UpdMapItem ( cMapID mID, TDBItem* act ); string MapID_Flag_Str ( cMapID mID, bool asHex= false ); string MapID_Str ( cMapID mID ); void* fCB; // callback structure, for debug logs string fDBName; // database name, for debug logs cAppCharP myDB; // fDBName.c_str() string fMapPath; string fContextName; string fDevKey; string fUsrKey; TDBItem fAdmList; // admin structure TDBItem* fAdm; // admin item TDBItem fMapList; // map structure TDBItem* fMap; // map item }; // TAdminData } /* namespace */ #endif /* ADMINDATA_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/blobs.cpp0000644000373300037200000002472112424517753026604 0ustar00nightlyallusers00000000000000/* * File: blobs.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * DBApi database adapter * BLOB (Binary Large Object) access * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * * E X A M P L E C O D E * (text_db interface) * */ #include "blobs.h" #include "SDK_util.h" // include SDK utilities #include "SDK_support.h" namespace sysync { // the BLOB class is part of sysync namespace #define P_Blob "BLB_" // BLOB data // BLOB constructor TBlob::TBlob() { fOpened= false; #ifdef PLATFORM_FILE fAttrActive= false; // the BLOB can have file dates and attributes fDateActive= false; #endif } // constructor // BLOB destructor TBlob::~TBlob() { CloseBlob(); } // destructor void TBlob::Init( void* aCB, cAppCharP aDBName, string aBlobPath, string aContextName, string sDevKey, string sUsrKey ) { fCB = aCB; // the callback for debug purposes only fDBName = aDBName; // DBName, used for debug purposes only fBlobPath = aBlobPath; fContextName= aContextName; fDevKey = sDevKey; fUsrKey = sUsrKey; } // Init // ------------------------------------------------------------------------- // Get the BLOB's name string TBlob::BlobName( cItemID aID, cAppCharP aBlobID ) { // if it is not an item, but e.g. an admin element => take the device key string v= aID->item; if (v.empty()) v= fDevKey; string s= ConcatNames( fUsrKey, fContextName, "_" ); s= P_Blob + ConcatNames( v, s, "_" ) + "_"; s+= aBlobID; s= ConcatPaths( fBlobPath, s ); // take a specific file path return s; } // BlobName // Get the BLOB's size. For this implementation the BLOB size is // identical to the file size. // Operation allowed also for open BLOBs size_t TBlob::BlobSize( string aBlobName ) { TSyError err; fpos_t tmp; fName= aBlobName; if (fName.empty()) return 0; // A BLOB w/o a name has size 0 bool opn= fOpened; // if not yet opened, open it temporary if (!opn) { err= OpenBlob( "rb" ); if (err) return 0; } else fgetpos( fFile, &tmp ); // save the current pos fseek ( fFile, 0,SEEK_END ); size_t size= ftell( fFile ); if (!opn) { err= CloseBlob(); if (err) return 0; } else fsetpos( fFile, &tmp ); // restore the current pos return size; } // BlobSize // BLOB will be stored as separate files in this implementation // This is the routine to open them for read or write TSyError TBlob::OpenBlob( cAppCharP mode ) { CloseBlob(); fFile= fopen( fName.c_str(), mode ); if (!fFile) return DB_NotFound; fOpened= true; fseek ( fFile, 0, SEEK_END ); fCurPos= 0; fSize = ftell( fFile ); // get total size rewind ( fFile ); return LOCERR_OK; } // OpenBlob // BLOB will be stored as separate files in this implementation // This is the routine to close the current one. TSyError TBlob::CloseBlob() { if (fOpened) { fclose( fFile ); fOpened= false; } fCurPos= 0; fSize = 0; return LOCERR_OK; } // CloseBlob // Attribute and date handling routines #ifdef PLATFORM_FILE TSyError TBlob::GetAttr( string aBlobName, TAttr &aAttr, bool &isFolder ) { TSyError err= Get_FileAttr( aBlobName, fAttr, isFolder ); //if (!err && isFolder) err= DB_Forbidden; DEBUG_Exotic_DB( fCB, fDBName.c_str(),"GetAttr", "'%s': hsadwrx=%d%d%d%d%d%d%d folder=%d err=%d", aBlobName.c_str(), fAttr.h,fAttr.s,fAttr.a,fAttr.d, fAttr.w,fAttr.r,fAttr.x, isFolder, err ); aAttr= fAttr; return err; } // GetAttr TSyError TBlob::SetAttr( TAttr aAttr ) { fAttr = aAttr; fAttrActive= true; DEBUG_Exotic_DB( fCB, fDBName.c_str(),"SetAttr", "hsadwrx=%d%d%d%d%d%d%d", fAttr.h,fAttr.s,fAttr.a,fAttr.d, fAttr.w,fAttr.r,fAttr.x ); return LOCERR_OK; // no error here } // SetAttr // ----------------------------------------------------------------------------------- TSyError TBlob::GetDates( string aBlobName, TDates &aDate ) { TSyError err= Get_FileDate( aBlobName, fDate ); DEBUG_Exotic_DB( fCB, fDBName.c_str(),"GetDates", "'%s': cre=%s mod=%s acc=%s err=%d", aBlobName.c_str(), fDate.created.c_str(), fDate.modified.c_str(), fDate.accessed.c_str(), err ); aDate= fDate; return err; } // GetDates TSyError TBlob::SetDates( string aBlobName, TDates aDate ) { fDate = aDate; fDateActive = true; TSyError err= Set_FileDate( aBlobName, fDate ); DEBUG_Exotic_DB( fCB, fDBName.c_str(),"SetDates", "cre=%s mod=%s acc=%s err=%d", fDate.created.c_str(), fDate.modified.c_str(), fDate.accessed.c_str(), err ); return LOCERR_OK; // no error here } // SetDates #endif // PLATFORM_FILE // ----------------------------------------------------------------------------------- // BLOB will be stored as separate files in this implementation // This is the routine to read the current one or a part of it TSyError TBlob::ReadBlob( string aBlobName, appPointer *blkPtr, memSize *blkSize, memSize *totSize, bool aFirst, bool *aLast ) { // This example shows two values of influence: // - the maximum value of returned is BlobBlk // - for blob sizes < BlobChk, the will be returned, else 0. #define BlobBlk 2048 #define BlobMax 2048 // checking limit for returning = 0 //#define BlobMax 10000 // checking limit for returning = 0 TSyError err= LOCERR_OK; *blkPtr = NULL; // initialize *totSize= 0; *aLast = true; if (aFirst) fName= aBlobName; DEBUG_DB( fCB, fDBName.c_str(), Da_RB, "blobName='%s' size=%d 1st=%s", fName.c_str(), *blkSize, Bo( aFirst ) ); do { // exit part if (fName.empty()) { err= DB_NotFound; break; } if (aFirst) { // special treatement for : open the file err= OpenBlob( "rb" ); if (err) { if (err==DB_NotFound) { // a not existing BLOB is not an error err= LOCERR_OK; *blkSize= 0; } // if break; } // if } // if if (!fOpened) { err= DB_Forbidden; break; } // now it must be open ! // adapt the default size if (*blkSize==0 || *blkSize>BlobBlk) *blkSize= BlobBlk; *blkPtr= malloc( *blkSize ); if (!*blkPtr) return LOCERR_OUTOFMEM; uInt32 rslt= fread( *blkPtr, 1, *blkSize, fFile ); *aLast= rslt!=*blkSize; if (*aLast && ferror( fFile )) return DB_Error; // check if already finished fCurPos+= rslt; if (fCurPos>=fSize) *aLast = true; // yes, it's done if (fSize: close the file if (*aLast) { *blkSize= rslt; err= CloseBlob(); } // if } while (false); // end exit part DEBUG_DB( fCB, fDBName.c_str(), Da_RB, "blk(%08X,%d) tot=%d last=%s err=%d", *blkPtr, *blkSize, *totSize, Bo( *aLast ), err ); return err; } // ReadBlob TSyError TBlob::ReadBlob( cItemID aID, cAppCharP aBlobID, appPointer *blkPtr, memSize *blkSize, memSize *totSize, bool aFirst, bool *aLast ) { return ReadBlob( BlobName( aID, aBlobID ), blkPtr,blkSize,totSize, aFirst,aLast ); } // ReadBlob // BLOB will be stored as separate files in this implementation // This is the routine to write the current one or a part of it TSyError TBlob::WriteBlob( string aBlobName, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ) { TSyError err= LOCERR_OK; if (aFirst) { // empty blobs needn't to be written if (aLast && blkSize==0) return DeleteBlob( aBlobName ); fName= aBlobName; } // if do { if (fName.empty()) { err= DB_NotFound; break; } if (aFirst) { // special treatement for : open the file err= OpenBlob( "wb" ); if (err) break; } // if if (!fOpened) { err= DB_Forbidden; break; } // now it must be open ! uInt32 rslt= fwrite( blkPtr, 1,blkSize, fFile ); if (rslt!=blkSize) err= DB_Error; fCurPos+= rslt; // special treatement for : close the file if (aLast || err) { CloseBlob(); #ifdef PLATFORM_FILE if (fAttrActive) Set_FileAttr( fName, fAttr ); if (fDateActive) Set_FileDate( fName, fDate ); fAttrActive= false; // it's written now fDateActive= false; #endif } // if } while (false); DEBUG_DB( fCB, fDBName.c_str(),Da_WB, "blobName='%s' blk(%08X,%d) tot=%d", fName.c_str(), blkPtr, blkSize, totSize ); DEBUG_DB( fCB, fDBName.c_str(),Da_WB, "1st=%s last=%s err=%d", Bo( aFirst ), Bo( aLast ), err ); return err; } // WriteBlob TSyError TBlob::WriteBlob( cItemID aID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ) { return WriteBlob( BlobName( aID, aBlobID ), blkPtr,blkSize,totSize, aFirst,aLast ); } // WriteBlob // BLOB will be stored as separate files in this implementation // This is the routine to delete the current one. TSyError TBlob::DeleteBlob( string aBlobName ) { CloseBlob(); // close potential old one TSyError err= LOCERR_OK; fName= aBlobName; do { // exit part if (fName.empty()) { err= DB_NotFound; break; } if (fOpened) { err= DB_Forbidden; break; } remove( fName.c_str() ); // not existing BLOB is not an error } while (false); // end exit part DEBUG_DB( fCB, fDBName.c_str(),Da_DB, "blobName='%s' err=%d", fName.c_str(), err ); return err; } // DeleteBlob TSyError TBlob::DeleteBlob( cItemID aID, cAppCharP aBlobID ) { return DeleteBlob( BlobName( aID, aBlobID ) ); } // DeleteBlob } /* namespace */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/blobs.h0000644000373300037200000000701612424517753026247 0ustar00nightlyallusers00000000000000/* * File: blobs.h * * Author: Beat Forster (bfo@synthesis.ch) * * * DBApi database adapter * BLOB (Binary Large Object) access * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * * E X A M P L E C O D E * */ #ifndef BLOBS_H #define BLOBS_H #include "sync_dbapidef.h" // get some definitions #ifdef PLATFORM_FILE #include "platform_file.h" #endif #include namespace sysync { /* NOTE: A BLOB object can be used for different BLOBs, * but only for one BLOB simultaneously. * If a new BLOB will be opened, the old one will * be closed automatically, if still opened. * read/write with = true will open a new one * " " " " = false will ignore */ class TBlob { public: TBlob(); ~TBlob(); void Init( void* aCB, cAppCharP aDBName, string aBlobPath, string aContextName, string sDevKey, string sUsrKey ); string BlobName ( cItemID aID, cAppCharP aBlobID ); size_t BlobSize ( string aBlobName ); // allowed also for open BLOBs TSyError ReadBlob ( string aBlobName, appPointer *blkPtr, memSize *blkSize, memSize *totSize, bool aFirst, bool *aLast ); TSyError ReadBlob ( cItemID aID, cAppCharP aBlobID, appPointer *blkPtr, memSize *blkSize, memSize *totSize, bool aFirst, bool *aLast ); TSyError WriteBlob ( string aBlobName, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ); TSyError WriteBlob ( cItemID aID, cAppCharP aBlobID, appPointer blkPtr, memSize blkSize, memSize totSize, bool aFirst, bool aLast ); TSyError DeleteBlob( string aBlobName ); TSyError DeleteBlob( cItemID aID, cAppCharP aBlobID ); #ifdef PLATFORM_FILE TSyError GetAttr ( string aBlobName, TAttr &aAttr, bool &isFolder ); // get BLOB's file attributes TSyError SetAttr ( TAttr aAttr ); // set " " " TSyError GetDates( string aBlobName, TDates &aDate ); // get BLOB's file dates TSyError SetDates( string aBlobName, TDates aDate ); // set " " " #endif string getDBName() const { return fDBName; } string getBlobPath() const { return fBlobPath; } string getContextName() const { return fContextName; } string getDevKey() const { return fDevKey; } string getUsrKey() const { return fUsrKey; } private: void* fCB; // callback structure, for debug logs string fDBName; // database name, for debug logs string fBlobPath; // params for creating BLOB's name string fContextName; string fDevKey; string fUsrKey; FILE* fFile; // assigned file bool fOpened; // Is it currently opened ? memSize fCurPos; // current position memSize fSize; // BLOB's size string fName; // BLOB's file name #ifdef PLATFORM_FILE TAttr fAttr; // BLOB's file attributes bool fAttrActive; TDates fDate; // BLOB's file dates bool fDateActive; #endif TSyError OpenBlob( const char* mode ); TSyError CloseBlob(); }; // TBlob } /* namespace */ #endif /* BLOBS_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/cp936_tables_inc.cpp0000755000373300037200000233516012424517753030541 0ustar00nightlyallusers00000000000000const size_t ucs2_to_cp936_numelems = 44054; const treeval_t ucs2_to_cp936_elements[ucs2_to_cp936_numelems] = { 0x40E6,0x0220,0x0081,0x0081,0x0081,0x01C9,0x0081,0x0152,0x0092,0x0081,0x0081,0x0081,0x0081,0x0087,0x0083,0xA3A4, 0x0083,0xA957,0xA3FE,0x0085,0x0083,0xA956,0xA1EA,0x0081,0xA1E9,0x00F2,0x00B2,0x0092,0x0082,0x0089,0x0085,0x0083, 0xA1AB,0xA3FD,0x0083,0xA3FC,0xA3FB,0x0085,0x0083,0xA3FA,0xA3F9,0x0083,0xA3F8,0xA3F7,0x0091,0x0089,0x0085,0x0083, 0xA3F6,0xA3F5,0x0083,0xA3F4,0xA3F3,0x0085,0x0083,0xA3F2,0xA3F1,0x0083,0xA3F0,0xA3EF,0x0089,0x0085,0x0083,0xA3EE, 0xA3ED,0x0083,0xA3EC,0xA3EB,0x0085,0x0083,0xA3EA,0xA3E9,0x0083,0xA3E8,0xA3E7,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xA3E6,0xA3E5,0x0083,0xA3E4,0xA3E3,0x0085,0x0083,0xA3E2,0xA3E1,0x0083,0xA3E0,0xA3DF,0x0089,0x0085,0x0083,0xA3DE, 0xA3DD,0x0083,0xA3DC,0xA3DB,0x0085,0x0083,0xA3DA,0xA3D9,0x0083,0xA3D8,0xA3D7,0x0091,0x0089,0x0085,0x0083,0xA3D6, 0xA3D5,0x0083,0xA3D4,0xA3D3,0x0085,0x0083,0xA3D2,0xA3D1,0x0083,0xA3D0,0xA3CF,0x0089,0x0085,0x0083,0xA3CE,0xA3CD, 0x0083,0xA3CC,0xA3CB,0x0085,0x0083,0xA3CA,0xA3C9,0x0083,0xA3C8,0xA3C7,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xA3C6,0xA3C5,0x0083,0xA3C4,0xA3C3,0x0085,0x0083,0xA3C2,0xA3C1,0x0083,0xA3C0,0xA3BF,0x0089,0x0085,0x0083,0xA3BE, 0xA3BD,0x0083,0xA3BC,0xA3BB,0x0085,0x0083,0xA3BA,0xA3B9,0x0083,0xA3B8,0xA3B7,0x0091,0x0089,0x0085,0x0083,0xA3B6, 0xA3B5,0x0083,0xA3B4,0xA3B3,0x0085,0x0083,0xA3B2,0xA3B1,0x0083,0xA3B0,0xA3AF,0x0089,0x0085,0x0083,0xA3AE,0xA3AD, 0x0083,0xA3AC,0xA3AB,0x0085,0x0083,0xA3AA,0xA3A9,0x0083,0xA3A8,0xA3A7,0x0081,0x0081,0x0089,0x0085,0x0083,0xA3A6, 0xA3A5,0x0083,0xA1E7,0xA3A3,0x0081,0x0083,0xA3A2,0xA3A1,0x008E,0x0082,0x0082,0x0082,0x0082,0x0082,0x0085,0x0083, 0xA988,0xA987,0x0083,0xA986,0xA985,0x0081,0x00BD,0x009F,0x0090,0x0088,0x0084,0x0082,0xA984,0x0083,0xA983,0xA982, 0x0085,0x0083,0xA981,0xA980,0x0083,0xA97E,0xA97D,0x0089,0x0085,0x0083,0xA97C,0xA97B,0x0083,0xA97A,0xA979,0x0085, 0x0083,0xA978,0xA977,0x0081,0xA976,0x0090,0x0089,0x0085,0x0083,0xA975,0xA974,0x0083,0xA973,0xA972,0x0084,0x0082, 0xA971,0x0083,0xA970,0xA96F,0x0089,0x0085,0x0083,0xA96E,0xA96D,0x0083,0xA96C,0xA96B,0x0085,0x0083,0xA96A,0xA969, 0x0081,0xA968,0x009D,0x008D,0x0085,0x0082,0x0082,0xA6EB,0x0085,0x0083,0xA6EA,0xA6E9,0x0083,0xA6E8,0xA6E5,0x0089, 0x0085,0x0083,0xA6E4,0xA6E7,0x0083,0xA6E6,0xA6EF,0x0085,0x0083,0xA6EE,0xA6E3,0x0083,0xA6E2,0xA6F1,0x0081,0x0089, 0x0085,0x0083,0xA6F0,0xA6E1,0x0083,0xA6E0,0xA6F5,0x0084,0x0081,0xA6F4,0x0083,0xA6F2,0xA955,0x00B5,0x0082,0x0082, 0x0082,0x00AB,0x0095,0x008D,0x0088,0x0084,0x0082,0xFE4F,0x0083,0xFE4E,0xFE4D,0x0082,0x0083,0xFE4C,0xFE4B,0x0081, 0x0084,0x0082,0xFE4A,0x0083,0xFE49,0xFE48,0x008A,0x0085,0x0082,0x0081,0xFE47,0x0082,0x0083,0xFE46,0xFE45,0x0087, 0x0084,0x0082,0xFE44,0x0082,0xFE43,0x0085,0x0083,0xFE42,0xFE41,0x0081,0xFE40,0x0082,0x0082,0x0081,0x0081,0x0082, 0xFDA0,0x0081,0x0097,0x0089,0x0081,0x0081,0x0081,0x0082,0x0081,0x0081,0xFD9F,0x0088,0x0082,0x0081,0x0082,0x0082, 0x0081,0xFD9E,0x0082,0x0081,0x0081,0x0082,0x0081,0xFD9D,0x0081,0x0082,0x0082,0x0082,0x0082,0x0082,0x0082,0xFD9C, 0x0082,0x1F5C,0x0F68,0x076E,0x0370,0x0172,0x0082,0x00F1,0x00B1,0x0091,0x0082,0x0088,0x0084,0x0082,0xFD9B,0x0083, 0xFD9A,0xFD99,0x0085,0x0083,0xFD98,0xFD97,0x0083,0xD9DF,0xB9EA,0x0091,0x0089,0x0085,0x0083,0xFD96,0xFD95,0x0083, 0xFD94,0xEDE8,0x0085,0x0083,0xB9A8,0xC1FA,0x0083,0xFD93,0xFD92,0x0089,0x0085,0x0083,0xFD91,0xFD90,0x0083,0xFD8F, 0xFD8E,0x0085,0x0083,0xFD8D,0xFD8C,0x0083,0xFD8B,0xFD8A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFD89,0xFD88,0x0083, 0xF6BB,0xC8A3,0x0085,0x0083,0xF6BA,0xF6B9,0x0083,0xF6B8,0xF6B7,0x0089,0x0085,0x0083,0xF6B6,0xF6B5,0x0083,0xC1E4, 0xF6B4,0x0085,0x0083,0xFD87,0xFD86,0x0083,0xF6B3,0xB3DD,0x0091,0x0089,0x0085,0x0083,0xFD85,0xFD84,0x0083,0xFD83, 0xFD82,0x0085,0x0083,0xFD81,0xFD80,0x0083,0xFD7E,0xFD7D,0x0089,0x0085,0x0083,0xFD7C,0xFD7B,0x0083,0xFD7A,0xFD79, 0x0085,0x0083,0xFD78,0xFD77,0x0083,0xFD76,0xFD75,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFD74,0xFD73,0x0083, 0xFD72,0xFD71,0x0085,0x0083,0xFD70,0xFD6F,0x0083,0xFD6E,0xFD6D,0x0089,0x0085,0x0083,0xFD6C,0xFD6B,0x0083,0xFD6A, 0xFD69,0x0085,0x0083,0xFD68,0xFD67,0x0083,0xFD66,0xFD65,0x0091,0x0089,0x0085,0x0083,0xFD64,0xFD63,0x0083,0xFD62, 0xFD61,0x0085,0x0083,0xFD60,0xFD5F,0x0083,0xFD5E,0xFD5D,0x0089,0x0085,0x0083,0xFD5C,0xFD5B,0x0083,0xFD5A,0xFD59, 0x0085,0x0083,0xFD58,0xECB4,0x0083,0xC6EB,0xFD57,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFD56,0xFD55,0x0083,0xFD54, 0xFD53,0x0085,0x0083,0xFD52,0xFD51,0x0083,0xFD50,0xFD4F,0x0089,0x0085,0x0083,0xFD4E,0xFD4D,0x0083,0xF7FE,0xFD4C, 0x0085,0x0083,0xFD4B,0xFD4A,0x0083,0xFD49,0xFD48,0x0091,0x0089,0x0085,0x0083,0xF7FD,0xF7FC,0x0083,0xFD47,0xB1C7, 0x0085,0x0083,0xFD46,0xF7FA,0x0083,0xFD45,0xF7FB,0x0089,0x0085,0x0083,0xFD44,0xFD43,0x0083,0xFD42,0xFD41,0x0085, 0x0083,0xFD40,0xFCA0,0x0083,0xFC9F,0xF7F9,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xFC9E,0x0083,0xFC9D, 0xF7F8,0x0085,0x0083,0xFC9C,0xFC9B,0x0083,0xFC9A,0xFC99,0x0089,0x0085,0x0083,0xFC98,0xFC97,0x0083,0xFC96,0xFC95, 0x0085,0x0083,0xFC94,0xF7F7,0x0083,0xFC93,0xCAF3,0x0091,0x0089,0x0085,0x0083,0xFC92,0xFC91,0x0083,0xFC90,0xFC8F, 0x0085,0x0083,0xFC8E,0xFC8D,0x0083,0xDCB1,0xFC8C,0x0089,0x0085,0x0083,0xD8BB,0xFC8B,0x0083,0xFC8A,0xFC89,0x0085, 0x0083,0xB9C4,0xFC88,0x0083,0xFC87,0xD8BE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFC86,0xB6A6,0x0083,0xF6BE,0xFC85, 0x0085,0x0083,0xF6BD,0xFC84,0x0083,0xFC83,0xFC82,0x0089,0x0085,0x0083,0xFC81,0xFC80,0x0083,0xFC7E,0xFC7D,0x0085, 0x0083,0xFC7C,0xFC7B,0x0083,0xFC7A,0xFC79,0x0091,0x0089,0x0085,0x0083,0xFC78,0xF6BC,0x0083,0xFC77,0xEDEB,0x0085, 0x0083,0xEDEA,0xFC76,0x0083,0xEDE9,0xFC75,0x0089,0x0085,0x0083,0xFC74,0xFC73,0x0083,0xFC72,0xFC71,0x0085,0x0083, 0xFC70,0xFC6F,0x0083,0xFC6E,0xFC6D,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF7F6,0xFC6C,0x0083,0xFC6B,0xFC6A, 0x0085,0x0083,0xFC69,0xF7F5,0x0083,0xF7F2,0xFC68,0x0089,0x0085,0x0083,0xF7F3,0xFC67,0x0083,0xF7F4,0xFC66,0x0085, 0x0083,0xFC65,0xF7F1,0x0083,0xFC64,0xF7EF,0x0091,0x0089,0x0085,0x0083,0xF7F0,0xFC63,0x0083,0xF7EE,0xF7ED,0x0085, 0x0083,0xF7EC,0xFC62,0x0083,0xFC61,0xC4AC,0x0089,0x0085,0x0083,0xFC60,0xFC5F,0x0083,0xFC5E,0xC7AD,0x0085,0x0083, 0xFC5D,0xFC5C,0x0083,0xBADA,0xFC5B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF0A4,0xC0E8,0x0083,0xCAF2,0xFC5A,0x0085, 0x0083,0xFC59,0xFC58,0x0083,0xD9E4,0xFC57,0x0089,0x0085,0x0083,0xFC56,0xFC55,0x0083,0xFC54,0xBBC6,0x0085,0x0083, 0xFC53,0xFC52,0x0083,0xFC51,0xFC50,0x0091,0x0089,0x0085,0x0083,0xFC4F,0xF7E2,0x0083,0xF7E1,0xFC4E,0x0085,0x0083, 0xC2E9,0xFC4D,0x0083,0xFC4C,0xF4EF,0x0089,0x0085,0x0083,0xFC4B,0xFC4A,0x0083,0xFC49,0xF4F0,0x0085,0x0083,0xFC48, 0xFC47,0x0083,0xFC46,0xFC45,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFC44,0xFC43,0x0083,0xFC42,0xFC41, 0x0085,0x0083,0xFC40,0xFBA0,0x0083,0xFB9F,0xFB9E,0x0089,0x0085,0x0083,0xFB9D,0xC2F3,0x0083,0xFB9C,0xFB9B,0x0085, 0x0083,0xFB9A,0xFB99,0x0083,0xFB98,0xFB97,0x0091,0x0089,0x0085,0x0083,0xF7EB,0xFB96,0x0083,0xF7EA,0xFB95,0x0085, 0x0083,0xFB94,0xFB93,0x0083,0xFB92,0xFB91,0x0089,0x0085,0x0083,0xFB90,0xFB8F,0x0083,0xFB8E,0xFB8D,0x0085,0x0083, 0xC2B4,0xF7E8,0x0083,0xFB8C,0xFB8B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFB8A,0xFB89,0x0083,0xFB88,0xFB87,0x0085, 0x0083,0xF7E7,0xFB86,0x0083,0xFB85,0xF7E6,0x0089,0x0085,0x0083,0xF7E5,0xFB84,0x0083,0xFB83,0xFB82,0x0085,0x0083, 0xFB81,0xF7E4,0x0083,0xFB80,0xFB7E,0x0091,0x0089,0x0085,0x0083,0xC2B9,0xF5BA,0x0083,0xFB7D,0xFB7C,0x0085,0x0083, 0xFB7B,0xFB7A,0x0083,0xFB79,0xFB78,0x0089,0x0085,0x0083,0xFB77,0xFB76,0x0083,0xFB75,0xFB74,0x0085,0x0083,0xF0D9, 0xFB73,0x0083,0xF0D7,0xD3A5,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFB72,0xFB71,0x0083,0xF0D8,0xF0D6,0x0085, 0x0083,0xF0D5,0xF0D4,0x0083,0xF0D3,0xF0D2,0x0089,0x0085,0x0083,0xF0D1,0xF0D0,0x0083,0xFB70,0xBAD7,0x0085,0x0083, 0xF0CF,0xFB6F,0x0083,0xFB6E,0xFB6D,0x0091,0x0089,0x0085,0x0083,0xFB6C,0xF0CE,0x0083,0xFB6B,0xF0CD,0x0085,0x0083, 0xF0CC,0xF0CB,0x0083,0xFB6A,0xF7BD,0x0089,0x0085,0x0083,0xF0CA,0xFB69,0x0083,0xF0C9,0xFB68,0x0085,0x0083,0xFB67, 0xFB66,0x0083,0xF0C8,0xFB65,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC5F4,0xF0C7,0x0083,0xFB64,0xF0C6,0x0085,0x0083, 0xF0C5,0xC8B5,0x0083,0xF0C4,0xF0C3,0x0089,0x0085,0x0083,0xF0C2,0xF0C1,0x0083,0xB6EC,0xF0C0,0x0085,0x0083,0xBEE9, 0xF0BF,0x0083,0xF0BE,0xFB63,0x0091,0x0089,0x0085,0x0083,0xBAE8,0xF0BD,0x0083,0xB8EB,0xFB62,0x0085,0x0083,0xFB61, 0xF0BC,0x0083,0xF0BB,0xF0B9,0x0089,0x0085,0x0083,0xF0BA,0xF0B8,0x0083,0xCDD2,0xFB60,0x0085,0x0083,0xD4A7,0xF0B6, 0x0083,0xF0B7,0xFB5F,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xD1EC,0x0083,0xFB5E,0xD1BC,0x0085, 0x0083,0xF0B5,0xF0B4,0x0083,0xF0B3,0xF0B2,0x0089,0x0085,0x0083,0xF0B1,0xFB5D,0x0083,0xD1BB,0xC5B8,0x0085,0x0083, 0xFB5C,0xC3F9,0x0083,0xF0B0,0xBCA6,0x0091,0x0089,0x0085,0x0083,0xF0AF,0xC4F1,0x0083,0xFB5B,0xFB5A,0x0085,0x0083, 0xFB59,0xFB58,0x0083,0xFB57,0xFB56,0x0089,0x0085,0x0083,0xFB55,0xFB54,0x0083,0xFB53,0xFB52,0x0085,0x0083,0xFB51, 0xFB50,0x0083,0xFB4F,0xFB4E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFB4D,0xFB4C,0x0083,0xFB4B,0xFB4A,0x0085,0x0083, 0xFB49,0xFB48,0x0083,0xFB47,0xFB46,0x0089,0x0085,0x0083,0xFB45,0xFB44,0x0083,0xFB43,0xFB42,0x0085,0x0083,0xFB41, 0xFB40,0x0083,0xFAA0,0xFA9F,0x0091,0x0089,0x0085,0x0083,0xFA9E,0xFA9D,0x0083,0xFA9C,0xFA9B,0x0085,0x0083,0xFA9A, 0xFA99,0x0083,0xFA98,0xFA97,0x0089,0x0085,0x0083,0xFA96,0xFA95,0x0083,0xFA94,0xFA93,0x0085,0x0083,0xFA92,0xFA91, 0x0083,0xFA90,0xFA8F,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFA8E,0xFA8D,0x0083,0xFA8C,0xFA8B,0x0085,0x0083, 0xFA8A,0xFA89,0x0083,0xFA88,0xFA87,0x0089,0x0085,0x0083,0xFA86,0xFA85,0x0083,0xFA84,0xFA83,0x0085,0x0083,0xFA82, 0xFA81,0x0083,0xFA80,0xFA7E,0x0091,0x0089,0x0085,0x0083,0xFA7D,0xFA7C,0x0083,0xFA7B,0xFA7A,0x0085,0x0083,0xFA79, 0xFA78,0x0083,0xFA77,0xFA76,0x0089,0x0085,0x0083,0xFA75,0xFA74,0x0083,0xFA73,0xFA72,0x0085,0x0083,0xFA71,0xFA70, 0x0083,0xFA6F,0xFA6E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFA6D,0xFA6C,0x0083,0xFA6B,0xFA6A,0x0085,0x0083,0xFA69, 0xFA68,0x0083,0xFA67,0xFA66,0x0089,0x0085,0x0083,0xFA65,0xFA64,0x0083,0xFA63,0xFA62,0x0085,0x0083,0xFA61,0xFA60, 0x0083,0xFA5F,0xFA5E,0x0091,0x0089,0x0085,0x0083,0xFA5D,0xFA5C,0x0083,0xFA5B,0xFA5A,0x0085,0x0083,0xFA59,0xFA58, 0x0083,0xFA57,0xFA56,0x0089,0x0085,0x0083,0xFA55,0xFA54,0x0083,0xFA53,0xFA52,0x0085,0x0083,0xFA51,0xFA50,0x0083, 0xFA4F,0xFA4E,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xFA4D,0xFA4C,0x0083,0xFA4B,0xFA4A,0x0085,0x0083, 0xFA49,0xFA48,0x0083,0xFA47,0xFA46,0x0089,0x0085,0x0083,0xFA45,0xFA44,0x0083,0xFA43,0xFA42,0x0085,0x0083,0xFA41, 0xFA40,0x0083,0xF9A0,0xF99F,0x0091,0x0089,0x0085,0x0083,0xF99E,0xF99D,0x0083,0xF99C,0xF99B,0x0085,0x0083,0xF99A, 0xF999,0x0083,0xF998,0xF997,0x0089,0x0085,0x0083,0xF996,0xF995,0x0083,0xF994,0xF993,0x0085,0x0083,0xF992,0xF991, 0x0083,0xF990,0xF98F,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF98E,0xF98D,0x0083,0xF98C,0xF98B,0x0085,0x0083,0xF98A, 0xF989,0x0083,0xF988,0xF987,0x0089,0x0085,0x0083,0xF986,0xF985,0x0083,0xF984,0xF983,0x0085,0x0083,0xF982,0xF981, 0x0083,0xF980,0xF97E,0x0091,0x0089,0x0085,0x0083,0xF97D,0xF97C,0x0083,0xF97B,0xF97A,0x0085,0x0083,0xF979,0xF978, 0x0083,0xF977,0xF976,0x0089,0x0085,0x0083,0xF975,0xF974,0x0083,0xF973,0xF972,0x0085,0x0083,0xF971,0xF970,0x0083, 0xF96F,0xF96E,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF96D,0xF96C,0x0083,0xF96B,0xF96A,0x0085,0x0083,0xF969, 0xF968,0x0083,0xF967,0xF966,0x0089,0x0085,0x0083,0xF965,0xF964,0x0083,0xF963,0xF962,0x0085,0x0083,0xF961,0xF960, 0x0083,0xF95F,0xF95E,0x0091,0x0089,0x0085,0x0083,0xF95D,0xF95C,0x0083,0xF95B,0xF95A,0x0085,0x0083,0xF959,0xF958, 0x0083,0xF957,0xF956,0x0089,0x0085,0x0083,0xF955,0xF954,0x0083,0xF953,0xF952,0x0085,0x0083,0xF951,0xF950,0x0083, 0xF94F,0xF94E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF94D,0xF94C,0x0083,0xF94B,0xF94A,0x0085,0x0083,0xF949,0xF948, 0x0083,0xF947,0xF946,0x0089,0x0085,0x0083,0xF945,0xF944,0x0083,0xF943,0xF942,0x0085,0x0083,0xF941,0xF940,0x0083, 0xF8A0,0xF89F,0x0091,0x0089,0x0085,0x0083,0xF89E,0xF89D,0x0083,0xF89C,0xF89B,0x0085,0x0083,0xF89A,0xF899,0x0083, 0xF898,0xF897,0x0089,0x0085,0x0083,0xF896,0xF895,0x0083,0xF894,0xF893,0x0085,0x0083,0xF892,0xF891,0x0083,0xF890, 0xF88F,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF88E,0xF88D,0x0083,0xF88C,0xF88B,0x0085,0x0083, 0xF88A,0xF889,0x0083,0xF888,0xF887,0x0089,0x0085,0x0083,0xF886,0xF885,0x0083,0xF884,0xF883,0x0085,0x0083,0xF882, 0xF881,0x0083,0xF880,0xF87E,0x0091,0x0089,0x0085,0x0083,0xF87D,0xF87C,0x0083,0xF87B,0xF87A,0x0085,0x0083,0xF879, 0xF878,0x0083,0xF877,0xF876,0x0089,0x0085,0x0083,0xF875,0xF874,0x0083,0xF873,0xF872,0x0085,0x0083,0xF871,0xF870, 0x0083,0xF86F,0xF86E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF86D,0xF86C,0x0083,0xF86B,0xF86A,0x0085,0x0083,0xF869, 0xF868,0x0083,0xF867,0xF866,0x0089,0x0085,0x0083,0xF865,0xF864,0x0083,0xF863,0xF862,0x0085,0x0083,0xF861,0xF860, 0x0083,0xF85F,0xF85E,0x0091,0x0089,0x0085,0x0083,0xF85D,0xF85C,0x0083,0xF85B,0xF85A,0x0085,0x0083,0xF859,0xF858, 0x0083,0xF857,0xF856,0x0089,0x0085,0x0083,0xF855,0xF854,0x0083,0xF853,0xF852,0x0085,0x0083,0xF851,0xF850,0x0083, 0xF84F,0xF84E,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF84D,0xF84C,0x0083,0xF84B,0xF84A,0x0085,0x0083,0xF849, 0xF848,0x0083,0xF847,0xF846,0x0089,0x0085,0x0083,0xF845,0xF844,0x0083,0xF843,0xF842,0x0085,0x0083,0xF841,0xF840, 0x0083,0xF7AF,0xF7A0,0x0091,0x0089,0x0085,0x0083,0xF79F,0xF7AE,0x0083,0xC1DB,0xF7AD,0x0085,0x0083,0xF7AC,0xF79E, 0x0083,0xF79D,0xF7AB,0x0089,0x0085,0x0083,0xF7AA,0xF7A9,0x0083,0xB1EE,0xF7A8,0x0085,0x0083,0xF7A7,0xF7A6,0x0083, 0xF79C,0xF79B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF7A5,0xF7A4,0x0083,0xF7A3,0xF7A2,0x0085,0x0083,0xF7A1,0xF6FE, 0x0083,0xF6FD,0xF79A,0x0089,0x0085,0x0083,0xF799,0xF6FC,0x0083,0xF6FB,0xF6FA,0x0085,0x0083,0xF6F9,0xC8FA,0x0083, 0xF798,0xF797,0x0091,0x0089,0x0085,0x0083,0xF796,0xF795,0x0083,0xF794,0xF6F8,0x0085,0x0083,0xF6F7,0xF6F6,0x0083, 0xF6F5,0xF793,0x0089,0x0085,0x0083,0xBEA8,0xF6F4,0x0083,0xF6F3,0xF6F2,0x0085,0x0083,0xF6F1,0xF6F0,0x0083,0xF6EF, 0xF6EE,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF6ED,0xF792,0x0083,0xF6EC,0xF6EB,0x0085,0x0083,0xF791, 0xF6EA,0x0083,0xF790,0xF6E9,0x0089,0x0085,0x0083,0xF6E8,0xF6E7,0x0083,0xF6E6,0xF6E5,0x0085,0x0083,0xC0F0,0xF6E4, 0x0083,0xF6E3,0xF6E2,0x0091,0x0089,0x0085,0x0083,0xF6E1,0xF6E0,0x0083,0xF6DF,0xF78F,0x0085,0x0083,0xCFCA,0xF6DE, 0x0083,0xF6DD,0xF78E,0x0089,0x0085,0x0083,0xF78D,0xF78C,0x0083,0xF78B,0xF6DC,0x0085,0x0083,0xF6DB,0xF78A,0x0083, 0xF6DA,0xF6D9,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF6D8,0xF789,0x0083,0xF6D7,0xB1AB,0x0085,0x0083,0xF788,0xF6D6, 0x0083,0xF787,0xF786,0x0089,0x0085,0x0083,0xF6D4,0xF6D3,0x0083,0xF6D2,0xF6D1,0x0085,0x0083,0xF785,0xF784,0x0083, 0xF6D0,0xC2B3,0x0091,0x0089,0x0085,0x0083,0xF783,0xF6CF,0x0083,0xF782,0xF781,0x0085,0x0083,0xD3E3,0xF780,0x0083, 0xF77E,0xF77D,0x0089,0x0085,0x0083,0xF77C,0xF77B,0x0083,0xF77A,0xF779,0x0085,0x0083,0xF778,0xF777,0x0083,0xF776, 0xF775,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF774,0xF773,0x0083,0xF772,0xF771,0x0085,0x0083,0xF770,0xF76F, 0x0083,0xF76E,0xF76D,0x0089,0x0085,0x0083,0xF76C,0xF76B,0x0083,0xF76A,0xF769,0x0085,0x0083,0xF768,0xF767,0x0083, 0xF766,0xF765,0x0091,0x0089,0x0085,0x0083,0xF764,0xF763,0x0083,0xF762,0xF761,0x0085,0x0083,0xF760,0xF75F,0x0083, 0xF75E,0xF75D,0x0089,0x0085,0x0083,0xF75C,0xF75B,0x0083,0xF75A,0xF759,0x0085,0x0083,0xF758,0xF757,0x0083,0xF756, 0xF755,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF754,0xF753,0x0083,0xF752,0xF751,0x0085,0x0083,0xF750,0xF74F,0x0083, 0xF74E,0xF74D,0x0089,0x0085,0x0083,0xF74C,0xF74B,0x0083,0xF74A,0xF749,0x0085,0x0083,0xF748,0xF747,0x0083,0xF746, 0xF745,0x0091,0x0089,0x0085,0x0083,0xF744,0xF743,0x0083,0xF742,0xF741,0x0085,0x0083,0xF740,0xF6A0,0x0083,0xF69F, 0xF69E,0x0089,0x0085,0x0083,0xF69D,0xF69C,0x0083,0xF69B,0xF69A,0x0085,0x0083,0xF699,0xF698,0x0083,0xF697,0xF696, 0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xF695,0x0083,0xF694,0xF693,0x0085,0x0083,0xF692, 0xF691,0x0083,0xF690,0xF68F,0x0089,0x0085,0x0083,0xF68E,0xF68D,0x0083,0xF68C,0xF68B,0x0085,0x0083,0xF68A,0xF689, 0x0083,0xF688,0xF687,0x0091,0x0089,0x0085,0x0083,0xF686,0xF685,0x0083,0xF684,0xF683,0x0085,0x0083,0xF682,0xF681, 0x0083,0xF680,0xF67E,0x0089,0x0085,0x0083,0xF67D,0xF67C,0x0083,0xF67B,0xF67A,0x0085,0x0083,0xF679,0xF678,0x0083, 0xF677,0xF676,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF675,0xF674,0x0083,0xF673,0xF672,0x0085,0x0083,0xF671,0xF670, 0x0083,0xF66F,0xF66E,0x0089,0x0085,0x0083,0xF66D,0xF66C,0x0083,0xF66B,0xF66A,0x0085,0x0083,0xF669,0xF668,0x0083, 0xF667,0xF666,0x0091,0x0089,0x0085,0x0083,0xF665,0xF664,0x0083,0xF663,0xF662,0x0085,0x0083,0xF661,0xF660,0x0083, 0xF65F,0xF65E,0x0089,0x0085,0x0083,0xF65D,0xF65C,0x0083,0xF65B,0xF65A,0x0085,0x0083,0xF659,0xF658,0x0083,0xF657, 0xF656,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF655,0xF654,0x0083,0xF653,0xF652,0x0085,0x0083,0xF651,0xF650, 0x0083,0xF64F,0xF64E,0x0089,0x0085,0x0083,0xF64D,0xF64C,0x0083,0xF64B,0xF64A,0x0085,0x0083,0xF649,0xF648,0x0083, 0xF647,0xF646,0x0091,0x0089,0x0085,0x0083,0xF645,0xF644,0x0083,0xF643,0xF642,0x0085,0x0083,0xF641,0xF640,0x0083, 0xF5A0,0xF59F,0x0089,0x0085,0x0083,0xF59E,0xF59D,0x0083,0xF59C,0xF59B,0x0085,0x0083,0xF59A,0xF599,0x0083,0xF598, 0xF597,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF596,0xF595,0x0083,0xF594,0xF593,0x0085,0x0083,0xF592,0xF591,0x0083, 0xF590,0xF58F,0x0089,0x0085,0x0083,0xF58E,0xF58D,0x0083,0xF58C,0xF58B,0x0085,0x0083,0xF58A,0xF589,0x0083,0xF588, 0xF587,0x0091,0x0089,0x0085,0x0083,0xF586,0xF585,0x0083,0xF584,0xF583,0x0085,0x0083,0xF582,0xF581,0x0083,0xF580, 0xF57E,0x0089,0x0085,0x0083,0xF57D,0xF57C,0x0083,0xF57B,0xF57A,0x0085,0x0083,0xF579,0xF578,0x0083,0xF577,0xF576, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF575,0xF574,0x0083,0xF573,0xF572,0x0085,0x0083,0xF571,0xF570, 0x0083,0xF56F,0xF56E,0x0089,0x0085,0x0083,0xF56D,0xF56C,0x0083,0xF56B,0xF56A,0x0085,0x0083,0xF569,0xF568,0x0083, 0xF567,0xF566,0x0091,0x0089,0x0085,0x0083,0xF565,0xF564,0x0083,0xF563,0xF562,0x0085,0x0083,0xF561,0xF560,0x0083, 0xF55F,0xF55E,0x0089,0x0085,0x0083,0xF55D,0xF55C,0x0083,0xF55B,0xF55A,0x0085,0x0083,0xF559,0xF558,0x0083,0xF557, 0xF556,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF555,0xF554,0x0083,0xF553,0xF552,0x0085,0x0083,0xF551,0xF550,0x0083, 0xF54F,0xF54E,0x0089,0x0085,0x0083,0xF54D,0xF54C,0x0083,0xF54B,0xF54A,0x0085,0x0083,0xF549,0xF548,0x0083,0xF547, 0xF546,0x0091,0x0089,0x0085,0x0083,0xF545,0xF544,0x0083,0xF543,0xF542,0x0085,0x0083,0xF541,0xF540,0x0083,0xF4A0, 0xF49F,0x0089,0x0085,0x0083,0xF49E,0xF49D,0x0083,0xF49C,0xF49B,0x0085,0x0083,0xF49A,0xF499,0x0083,0xF498,0xF497, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF496,0xF495,0x0083,0xF494,0xF493,0x0085,0x0083,0xF492,0xF491,0x0083, 0xF490,0xF48F,0x0089,0x0085,0x0083,0xF48E,0xF48D,0x0083,0xF48C,0xF48B,0x0085,0x0083,0xF48A,0xF489,0x0083,0xF488, 0xF487,0x0091,0x0089,0x0085,0x0083,0xF486,0xF485,0x0083,0xF484,0xF483,0x0085,0x0083,0xF482,0xF481,0x0083,0xF480, 0xF47E,0x0089,0x0085,0x0083,0xF47D,0xF47C,0x0083,0xF47B,0xF47A,0x0085,0x0083,0xF479,0xC4A7,0x0083,0xF478,0xF477, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xF7CE,0xF476,0x0083,0xCEBA,0xF475,0x0085,0x0083,0xF7CD,0xF474,0x0083,0xF473, 0xF472,0x0089,0x0085,0x0083,0xF7CB,0xF7CC,0x0083,0xF7CA,0xF471,0x0085,0x0083,0xF7C8,0xC6C7,0x0083,0xF7C9,0xBBEA, 0x0091,0x0089,0x0085,0x0083,0xBFFD,0xF470,0x0083,0xF46F,0xF46E,0x0085,0x0083,0xF46D,0xB9ED,0x0083,0xE5F7,0xF46C, 0x0089,0x0085,0x0083,0xF46B,0xF46A,0x0083,0xF469,0xF468,0x0085,0x0083,0xF467,0xF466,0x0083,0xF465,0xD8AA,0x017F, 0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xF464,0x0083,0xF463,0xDBCB,0x0085,0x0083,0xF462,0xF461,0x0083,0xF460, 0xF45F,0x0089,0x0085,0x0083,0xF45E,0xF45D,0x0083,0xF45C,0xF45B,0x0085,0x0083,0xF45A,0xF459,0x0083,0xF458,0xF7E0, 0x0091,0x0089,0x0085,0x0083,0xF457,0xF456,0x0083,0xF455,0xF7DF,0x0085,0x0083,0xF454,0xF453,0x0083,0xF452,0xF451, 0x0089,0x0085,0x0083,0xF450,0xF44F,0x0083,0xF44E,0xF44D,0x0085,0x0083,0xF44C,0xF44B,0x0083,0xF44A,0xF7DE,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xF449,0xF448,0x0083,0xF447,0xF7DD,0x0085,0x0083,0xF446,0xF445,0x0083,0xF444,0xF443, 0x0089,0x0085,0x0083,0xF442,0xF441,0x0083,0xF7DC,0xF440,0x0085,0x0083,0xF3A0,0xF39F,0x0083,0xF39E,0xD7D7,0x0091, 0x0089,0x0085,0x0083,0xF39D,0xF39C,0x0083,0xF39B,0xF39A,0x0085,0x0083,0xF399,0xF398,0x0083,0xF397,0xF7D9,0x0089, 0x0085,0x0083,0xF396,0xF7DB,0x0083,0xF395,0xF394,0x0085,0x0083,0xF393,0xF392,0x0083,0xF391,0xF390,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xF38F,0xF38E,0x0083,0xF38D,0xF7D7,0x0085,0x0083,0xF38C,0xF7DA,0x0083,0xF38B,0xF7D8, 0x0089,0x0085,0x0083,0xF38A,0xF389,0x0083,0xF388,0xF387,0x0085,0x0083,0xF7D6,0xF386,0x0083,0xF385,0xF384,0x0091, 0x0089,0x0085,0x0083,0xF383,0xF7D5,0x0083,0xF382,0xF7D4,0x0085,0x0083,0xF381,0xF380,0x0083,0xF37E,0xF37D,0x0089, 0x0085,0x0083,0xF37C,0xF37B,0x0083,0xB8DF,0xF37A,0x0085,0x0083,0xF379,0xF378,0x0083,0xF377,0xCBE8,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xF376,0xF7C7,0x0083,0xF375,0xF374,0x0085,0x0083,0xF373,0xF372,0x0083,0xF7C6,0xF7C5,0x0089, 0x0085,0x0083,0xF371,0xF370,0x0083,0xF36F,0xF36E,0x0085,0x0083,0xF36D,0xF7C3,0x0083,0xF36C,0xF36B,0x0091,0x0089, 0x0085,0x0083,0xF7C4,0xF7C1,0x0083,0xF7C2,0xF36A,0x0085,0x0083,0xF369,0xF368,0x0083,0xF7C0,0xF367,0x0089,0x0085, 0x0083,0xF7BF,0xF366,0x0083,0xBAA1,0xF7BC,0x0085,0x0083,0xF7BE,0xF365,0x0083,0xF364,0xF363,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xF362,0xF7BA,0x0083,0xF7BB,0xF361,0x0085,0x0083,0xF360,0xF35F,0x0083,0xF35E,0xF35D, 0x0089,0x0085,0x0083,0xF35C,0xF35B,0x0083,0xB9C7,0xE6F8,0x0085,0x0083,0xF35A,0xE6F7,0x0083,0xD6E8,0xE6F6,0x0091, 0x0089,0x0085,0x0083,0xE6F5,0xC2E2,0x0083,0xE6F4,0xE6F3,0x0085,0x0083,0xE5B9,0xE6F2,0x0083,0xE6F1,0xE6F0,0x0089, 0x0085,0x0083,0xC9A7,0xF359,0x0083,0xE6EF,0xC6AD,0x0085,0x0083,0xE6EE,0xF358,0x0083,0xF357,0xE6ED,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xE6EC,0xC6EF,0x0083,0xE6EB,0xBFA5,0x0085,0x0083,0xF356,0xF355,0x0083,0xD1E9,0xB3D2,0x0089, 0x0085,0x0083,0xE6EA,0xF354,0x0083,0xE6E9,0xBAA7,0x0085,0x0083,0xC2E6,0xE6E8,0x0083,0xBDBE,0xF353,0x0091,0x0089, 0x0085,0x0083,0xC2EE,0xE6E7,0x0083,0xE6E6,0xE6E4,0x0085,0x0083,0xBCDD,0xE6E5,0x0083,0xCDD5,0xD7A4,0x0089,0x0085, 0x0083,0xE6E3,0xBED4,0x0083,0xE6E2,0xE6E1,0x0085,0x0083,0xCABB,0xE6E0,0x0083,0xC2BF,0xB2B5,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xF352,0xC7FD,0x0083,0xB3DB,0xD1B1,0x0085,0x0083,0xCDD4,0xD4A6,0x0083,0xC2ED,0xF351,0x0089, 0x0085,0x0083,0xF350,0xF34F,0x0083,0xF34E,0xF34D,0x0085,0x0083,0xF34C,0xF34B,0x0083,0xF34A,0xF349,0x0091,0x0089, 0x0085,0x0083,0xF348,0xF347,0x0083,0xF346,0xF345,0x0085,0x0083,0xF344,0xF343,0x0083,0xF342,0xF341,0x0089,0x0085, 0x0083,0xF340,0xF2A0,0x0083,0xF29F,0xF29E,0x0085,0x0083,0xF29D,0xF29C,0x0083,0xF29B,0xF29A,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xF299,0xF298,0x0083,0xF297,0xF296,0x0085,0x0083,0xF295,0xF294,0x0083,0xF293,0xF292,0x0089,0x0085, 0x0083,0xF291,0xF290,0x0083,0xF28F,0xF28E,0x0085,0x0083,0xF28D,0xF28C,0x0083,0xF28B,0xF28A,0x0091,0x0089,0x0085, 0x0083,0xF289,0xF288,0x0083,0xF287,0xF286,0x0085,0x0083,0xF285,0xF284,0x0083,0xF283,0xF282,0x0089,0x0085,0x0083, 0xF281,0xF280,0x0083,0xF27E,0xF27D,0x0085,0x0083,0xF27C,0xF27B,0x0083,0xF27A,0xF279,0x027F,0x017F,0x00FF,0x00BF, 0x009F,0x008F,0x0087,0x0083,0xF278,0x0083,0xF277,0xF276,0x0085,0x0083,0xF275,0xF274,0x0083,0xF273,0xF272,0x0089, 0x0085,0x0083,0xF271,0xF270,0x0083,0xF26F,0xF26E,0x0085,0x0083,0xF26D,0xF26C,0x0083,0xF26B,0xF26A,0x0091,0x0089, 0x0085,0x0083,0xF269,0xF268,0x0083,0xF267,0xF266,0x0085,0x0083,0xF265,0xF264,0x0083,0xF263,0xF262,0x0089,0x0085, 0x0083,0xF261,0xF260,0x0083,0xF25F,0xF25E,0x0085,0x0083,0xF25D,0xF25C,0x0083,0xF25B,0xF25A,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xF259,0xF258,0x0083,0xF257,0xF256,0x0085,0x0083,0xF255,0xF254,0x0083,0xF253,0xF252,0x0089,0x0085, 0x0083,0xF251,0xF250,0x0083,0xF24F,0xF24E,0x0085,0x0083,0xF24D,0xF24C,0x0083,0xF24B,0xF24A,0x0091,0x0089,0x0085, 0x0083,0xF249,0xF248,0x0083,0xF247,0xF246,0x0085,0x0083,0xF245,0xF244,0x0083,0xF243,0xF242,0x0089,0x0085,0x0083, 0xF241,0xF240,0x0083,0xF1A0,0xF19F,0x0085,0x0083,0xF19E,0xF19D,0x0083,0xF19C,0xF19B,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xF19A,0xF199,0x0083,0xF198,0xF197,0x0085,0x0083,0xF196,0xF195,0x0083,0xF194,0xF193,0x0089,0x0085, 0x0083,0xF192,0xF191,0x0083,0xF190,0xF18F,0x0085,0x0083,0xF18E,0xF18D,0x0083,0xF18C,0xF18B,0x0091,0x0089,0x0085, 0x0083,0xF18A,0xF189,0x0083,0xF188,0xF187,0x0085,0x0083,0xF186,0xF185,0x0083,0xF184,0xF183,0x0089,0x0085,0x0083, 0xF182,0xF181,0x0083,0xF180,0xF17E,0x0085,0x0083,0xF17D,0xF17C,0x0083,0xF17B,0xF17A,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xF179,0xF178,0x0083,0xF177,0xF176,0x0085,0x0083,0xF175,0xF174,0x0083,0xF173,0xF172,0x0089,0x0085,0x0083, 0xF171,0xF170,0x0083,0xF16F,0xF16E,0x0085,0x0083,0xF16D,0xF16C,0x0083,0xF16B,0xF16A,0x0091,0x0089,0x0085,0x0083, 0xF169,0xF168,0x0083,0xF167,0xF166,0x0085,0x0083,0xF165,0xF164,0x0083,0xF163,0xF162,0x0089,0x0085,0x0083,0xF161, 0xF160,0x0083,0xF15F,0xF15E,0x0085,0x0083,0xF15D,0xF15C,0x0083,0xF15B,0xF15A,0x0101,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xF159,0xF158,0x0083,0xF157,0xF156,0x0085,0x0083,0xF155,0xF154,0x0083,0xF153,0xF152,0x0089,0x0085, 0x0083,0xF151,0xF150,0x0083,0xF14F,0xDCB0,0x0085,0x0083,0xF14E,0xF14D,0x0083,0xF0A5,0xF14C,0x0091,0x0089,0x0085, 0x0083,0xF14B,0xF14A,0x0083,0xF149,0xF148,0x0085,0x0083,0xF147,0xF146,0x0083,0xF145,0xF144,0x0089,0x0085,0x0083, 0xF143,0xF142,0x0083,0xCFE3,0xD9E5,0x0085,0x0083,0xD8B8,0xCAD7,0x0083,0xE2CE,0xE2CD,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xE2CC,0xC2F8,0x0083,0xE2CB,0xE2CA,0x0085,0x0083,0xC1F3,0xF141,0x0083,0xE2C9,0xF140,0x0089,0x0085,0x0083, 0xB2F6,0xE2C8,0x0083,0xF0A0,0xC0A1,0x0085,0x0083,0xE2C7,0xB9DD,0x0083,0xCFDA,0xE2C6,0x0091,0x0089,0x0085,0x0083, 0xF09F,0xF09E,0x0083,0xC4D9,0xE2C5,0x0085,0x0083,0xB6F6,0xF09D,0x0083,0xE2C4,0xB1FD,0x0089,0x0085,0x0083,0xF09C, 0xBDC8,0x0083,0xF09B,0xF09A,0x0085,0x0083,0xE2C3,0xC8C4,0x0083,0xB6FC,0xE2C2,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xF099,0xCBC7,0x0083,0xB1A5,0xCACE,0x0085,0x0083,0xBDA4,0xD2FB,0x0083,0xB7B9,0xE2C1,0x0089,0x0085,0x0083, 0xE2C0,0xE2BF,0x0083,0xE2BE,0xE2BD,0x0085,0x0083,0xE2BC,0xF098,0x0083,0xBCA2,0xF097,0x0091,0x0089,0x0085,0x0083, 0xE2BB,0xF096,0x0083,0xF095,0xF094,0x0085,0x0083,0xF093,0xF092,0x0083,0xF091,0xF090,0x0089,0x0085,0x0083,0xF08F, 0xF08E,0x0083,0xF08D,0xF08C,0x0085,0x0083,0xF08B,0xF08A,0x0083,0xF7D2,0xF7D3,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xF089,0xF088,0x0083,0xF087,0xF086,0x0085,0x0083,0xF085,0xF084,0x0083,0xF083,0xF082,0x0089,0x0085,0x0083,0xF081, 0xF080,0x0083,0xF07E,0xF07D,0x0085,0x0083,0xF07C,0xF07B,0x0083,0xF07A,0xF079,0x0091,0x0089,0x0085,0x0083,0xF078, 0xF077,0x0083,0xF076,0xF075,0x0085,0x0083,0xF074,0xF073,0x0083,0xF072,0xF071,0x0089,0x0085,0x0083,0xF070,0xF06F, 0x0083,0xF06E,0xF06D,0x0085,0x0083,0xF06C,0xF06B,0x0083,0xF06A,0xF069,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xF068,0xF067,0x0083,0xF066,0xF065,0x0085,0x0083,0xF064,0xF7D1,0x0083,0xF063,0xF062,0x0089,0x0085, 0x0083,0xF061,0xF060,0x0083,0xF05F,0xF05E,0x0085,0x0083,0xF05D,0xF05C,0x0083,0xF05B,0xF05A,0x0091,0x0089,0x0085, 0x0083,0xF059,0xF058,0x0083,0xF057,0xF056,0x0085,0x0083,0xF055,0xF054,0x0083,0xF053,0xF052,0x0089,0x0085,0x0083, 0xF051,0xF050,0x0083,0xF04F,0xF04E,0x0085,0x0083,0xF04D,0xF04C,0x0083,0xF04B,0xF04A,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xF049,0xF048,0x0083,0xF047,0xB2CD,0x0085,0x0083,0xF046,0xF045,0x0083,0xF7D0,0xF044,0x0089,0x0085,0x0083, 0xF043,0xF042,0x0083,0xF041,0xF040,0x0085,0x0083,0xEFA0,0xEF9F,0x0083,0xEF9E,0xEF9D,0x0091,0x0089,0x0085,0x0083, 0xEF9C,0xEF9B,0x0083,0xEF9A,0xEF99,0x0085,0x0083,0xEF98,0xEF97,0x0083,0xEF96,0xEF95,0x0089,0x0085,0x0083,0xEF94, 0xEF93,0x0083,0xEF92,0xEF91,0x0085,0x0083,0xEF90,0xEF8F,0x0083,0xEF8E,0xEF8D,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xEF8C,0xEF8B,0x0083,0xEF8A,0xEF89,0x0085,0x0083,0xEF88,0xEF87,0x0083,0xEF86,0xEF85,0x0089,0x0085,0x0083, 0xEF84,0xEF83,0x0083,0xEF82,0xF7CF,0x0085,0x0083,0xE2B8,0xEF81,0x0083,0xEF80,0xEF7E,0x0091,0x0089,0x0085,0x0083, 0xEF7D,0xEF7C,0x0083,0xEF7B,0xEF7A,0x0085,0x0083,0xCAB3,0xB7C9,0x0083,0xEF79,0xEF78,0x0089,0x0085,0x0083,0xEF77, 0xECAE,0x0083,0xECAD,0xC6AE,0x0085,0x0083,0xEF76,0xEF75,0x0083,0xECAC,0xEF74,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xECAB,0xECAA,0x0083,0xECA9,0xEF73,0x0085,0x0083,0xEF72,0xB7E7,0x0083,0xEF71,0xEF70,0x0089,0x0085,0x0083,0xEF6F, 0xEF6E,0x0083,0xEF6D,0xEF6C,0x0085,0x0083,0xEF6B,0xEF6A,0x0083,0xEF69,0xEF68,0x0091,0x0089,0x0085,0x0083,0xEF67, 0xEF66,0x0083,0xEF65,0xEF64,0x0085,0x0083,0xEF63,0xEF62,0x0083,0xEF61,0xEF60,0x0089,0x0085,0x0083,0xEF5F,0xEF5E, 0x0083,0xEF5D,0xEF5C,0x0085,0x0083,0xEF5B,0xEF5A,0x0083,0xEF59,0xEF58,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xEF57,0xEF56,0x0083,0xEF55,0xEF54,0x0085,0x0083,0xEF53,0xEF52,0x0083,0xEF51,0xEF50,0x0089,0x0085,0x0083, 0xEF4F,0xEF4E,0x0083,0xEF4D,0xEF4C,0x0085,0x0083,0xC8A7,0xF2AD,0x0083,0xF2AC,0xB2FC,0x0091,0x0089,0x0085,0x0083, 0xEF4B,0xF2AB,0x0083,0xF2AA,0xB5DF,0x0085,0x0083,0xF2A9,0xF2A8,0x0083,0xB6EE,0xD1D5,0x0089,0x0085,0x0083,0xF2A7, 0xF2A6,0x0083,0xEF4A,0xCCE2,0x0085,0x0083,0xBFC5,0xD3B1,0x0083,0xEF49,0xF2A5,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xCDC7,0xEF48,0x0083,0xC6B5,0xD2C3,0x0085,0x0083,0xF2A4,0xEF47,0x0083,0xF2A3,0xF2A2,0x0089,0x0085,0x0083,0xEF46, 0xBCD5,0x0083,0xF2A1,0xBEB1,0x0085,0x0083,0xC6C4,0xC1EC,0x0083,0xC2AD,0xD4A4,0x0091,0x0089,0x0085,0x0083,0xF1FE, 0xCBCC,0x0083,0xB0E4,0xF1FD,0x0085,0x0083,0xB6D9,0xB9CB,0x0083,0xCDE7,0xE7EF,0x0089,0x0085,0x0083,0xD0EB,0xCBB3, 0x0083,0xCFEE,0xF1FC,0x0085,0x0083,0xC7EA,0xB6A5,0x0083,0xD2B3,0xEF45,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xEF44,0xEF43,0x0083,0xEF42,0xEF41,0x0085,0x0083,0xEF40,0xEEA0,0x0083,0xEE9F,0xEE9E,0x0089,0x0085,0x0083,0xEE9D, 0xEE9C,0x0083,0xEE9B,0xEE9A,0x0085,0x0083,0xEE99,0xEE98,0x0083,0xEE97,0xEE96,0x0091,0x0089,0x0085,0x0083,0xEE95, 0xEE94,0x0083,0xEE93,0xEE92,0x0085,0x0083,0xEE91,0xEE90,0x0083,0xEE8F,0xEE8E,0x0089,0x0085,0x0083,0xEE8D,0xEE8C, 0x0083,0xEE8B,0xEE8A,0x0085,0x0083,0xEE89,0xEE88,0x0083,0xEE87,0xEE86,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEE85, 0xEE84,0x0083,0xEE83,0xEE82,0x0085,0x0083,0xEE81,0xEE80,0x0083,0xEE7E,0xEE7D,0x0089,0x0085,0x0083,0xEE7C,0xEE7B, 0x0083,0xEE7A,0xEE79,0x0085,0x0083,0xEE78,0xEE77,0x0083,0xEE76,0xEE75,0x0091,0x0089,0x0085,0x0083,0xEE74,0xEE73, 0x0083,0xEE72,0xEE71,0x0085,0x0083,0xEE70,0xEE6F,0x0083,0xEE6E,0xEE6D,0x0089,0x0085,0x0083,0xEE6C,0xEE6B,0x0083, 0xEE6A,0xEE69,0x0085,0x0083,0xEE68,0xEE67,0x0083,0xEE66,0xEE65,0x087B,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F, 0x008F,0x0087,0x0083,0xEE64,0x0083,0xEE63,0xEE62,0x0085,0x0083,0xEE61,0xEE60,0x0083,0xEE5F,0xEE5E,0x0089,0x0085, 0x0083,0xEE5D,0xEE5C,0x0083,0xEE5B,0xEE5A,0x0085,0x0083,0xEE59,0xEE58,0x0083,0xEE57,0xEE56,0x0091,0x0089,0x0085, 0x0083,0xEE55,0xEE54,0x0083,0xEE53,0xEE52,0x0085,0x0083,0xEE51,0xEE50,0x0083,0xEE4F,0xEE4E,0x0089,0x0085,0x0083, 0xEE4D,0xEE4C,0x0083,0xEE4B,0xEE4A,0x0085,0x0083,0xEE49,0xEE48,0x0083,0xEE47,0xEE46,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xEE45,0xEE44,0x0083,0xEE43,0xEE42,0x0085,0x0083,0xEE41,0xEE40,0x0083,0xEDA0,0xED9F,0x0089,0x0085,0x0083, 0xED9E,0xED9D,0x0083,0xED9C,0xED9B,0x0085,0x0083,0xED9A,0xED99,0x0083,0xED98,0xED97,0x0091,0x0089,0x0085,0x0083, 0xED96,0xED95,0x0083,0xED94,0xED93,0x0085,0x0083,0xED92,0xED91,0x0083,0xED90,0xED8F,0x0089,0x0085,0x0083,0xED8E, 0xED8D,0x0083,0xED8C,0xED8B,0x0085,0x0083,0xED8A,0xED89,0x0083,0xC9D8,0xD4CF,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xED88,0xD2F4,0x0083,0xED87,0xED86,0x0085,0x0083,0xED85,0xED84,0x0083,0xED83,0xBEC2,0x0089,0x0085,0x0083, 0xE8BA,0xE8B9,0x0083,0xE8B8,0xBAAB,0x0085,0x0083,0xED82,0xC8CD,0x0083,0xCEA4,0xED81,0x0091,0x0089,0x0085,0x0083, 0xED80,0xED7E,0x0083,0xED7D,0xED7C,0x0085,0x0083,0xED7B,0xED7A,0x0083,0xED79,0xED78,0x0089,0x0085,0x0083,0xED77, 0xED76,0x0083,0xED75,0xED74,0x0085,0x0083,0xED73,0xED72,0x0083,0xED71,0xED70,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xED6F,0xED6E,0x0083,0xED6D,0xED6C,0x0085,0x0083,0xED6B,0xED6A,0x0083,0xED69,0xED68,0x0089,0x0085,0x0083,0xED67, 0xED66,0x0083,0xED65,0xED64,0x0085,0x0083,0xED63,0xED62,0x0083,0xED61,0xED60,0x0091,0x0089,0x0085,0x0083,0xED5F, 0xED5E,0x0083,0xED5D,0xED5C,0x0085,0x0083,0xED5B,0xED5A,0x0083,0xED59,0xED58,0x0089,0x0085,0x0083,0xED57,0xED56, 0x0083,0xED55,0xED54,0x0085,0x0083,0xED53,0xED52,0x0083,0xED51,0xED50,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xF7B9,0xED4F,0x0083,0xF7B8,0xED4E,0x0085,0x0083,0xED4D,0xF7B5,0x0083,0xED4C,0xB1DE,0x0089,0x0085,0x0083, 0xED4B,0xF7B6,0x0083,0xED4A,0xED49,0x0085,0x0083,0xED48,0xED47,0x0083,0xED46,0xED45,0x0091,0x0089,0x0085,0x0083, 0xED44,0xF7B7,0x0083,0xED43,0xED42,0x0085,0x0083,0xBECF,0xED41,0x0083,0xED40,0xECA0,0x0089,0x0085,0x0083,0xEC9F, 0xEC9E,0x0083,0xEC9D,0xEC9C,0x0085,0x0083,0xC7CA,0xEC9B,0x0083,0xEC9A,0xEC99,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xF7B4,0xEC98,0x0083,0xF7B3,0xF7B2,0x0085,0x0083,0xEC97,0xEC96,0x0083,0xEC95,0xB0B0,0x0089,0x0085,0x0083,0xEC94, 0xD0AC,0x0083,0xEC93,0xEC92,0x0085,0x0083,0xEC91,0xEC90,0x0083,0xEC8F,0xF7B1,0x0091,0x0089,0x0085,0x0083,0xEC8E, 0xEC8D,0x0083,0xEC8C,0xEC8B,0x0085,0x0083,0xEC8A,0xEC89,0x0083,0xEC88,0xEC87,0x0089,0x0085,0x0083,0xF7B0,0xEC86, 0x0083,0xEC85,0xEC84,0x0085,0x0083,0xEC83,0xEC82,0x0083,0xB0D0,0xEC81,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xD1A5,0xBDF9,0x0083,0xEC80,0xEC7E,0x0085,0x0083,0xEC7D,0xEC7C,0x0083,0xEC7B,0xEC7A,0x0089,0x0085,0x0083,0xEC79, 0xEC78,0x0083,0xEC77,0xB8EF,0x0085,0x0083,0xEC76,0xEC75,0x0083,0xEC74,0xD8CC,0x0091,0x0089,0x0085,0x0083,0xEC73, 0xEC72,0x0083,0xC3E6,0xC3D2,0x0085,0x0083,0xBFBF,0xEC71,0x0083,0xB7C7,0xEC70,0x0089,0x0085,0x0083,0xEC6F,0xB5E5, 0x0083,0xEC6E,0xBEB2,0x0085,0x0083,0xEC6D,0xEC6C,0x0083,0xBEB8,0xEC6B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEC6A, 0xF6A6,0x0083,0xC7E0,0xEC69,0x0085,0x0083,0xEC68,0xEC67,0x0083,0xEC66,0xEC65,0x0089,0x0085,0x0083,0xEC64,0xEC63, 0x0083,0xEC62,0xEC61,0x0085,0x0083,0xEC60,0xEC5F,0x0083,0xEC5E,0xEC5D,0x0091,0x0089,0x0085,0x0083,0xEC5C,0xEC5B, 0x0083,0xEC5A,0xEC59,0x0085,0x0083,0xEC58,0xEC57,0x0083,0xF6B2,0xEC56,0x0089,0x0085,0x0083,0xEC55,0xEC54,0x0083, 0xEC53,0xC5F9,0x0085,0x0083,0xB0D4,0xEC52,0x0083,0xEC51,0xEC50,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083, 0xEC4F,0x0083,0xEC4E,0xC2B6,0x0085,0x0083,0xEC4D,0xF6B1,0x0083,0xEC4C,0xEC4B,0x0089,0x0085,0x0083,0xF6B0,0xEC4A, 0x0083,0xEC49,0xF6AF,0x0085,0x0083,0xEC48,0xEC47,0x0083,0xEC46,0xEC45,0x0091,0x0089,0x0085,0x0083,0xEC44,0xEC43, 0x0083,0xEC42,0xEC41,0x0085,0x0083,0xEC40,0xEBA0,0x0083,0xEB9F,0xCFBC,0x0089,0x0085,0x0083,0xEB9E,0xCBAA,0x0083, 0xEB9D,0xEB9C,0x0085,0x0083,0xEB9B,0xEB9A,0x0083,0xEB99,0xC1D8,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEB98,0xEB97, 0x0083,0xC4DE,0xEB96,0x0085,0x0083,0xEB95,0xEB94,0x0083,0xF6AD,0xF6AE,0x0089,0x0085,0x0083,0xBBF4,0xEB93,0x0083, 0xEB92,0xEB91,0x0085,0x0083,0xC3B9,0xF6AC,0x0083,0xD5F0,0xF6AA,0x0091,0x0089,0x0085,0x0083,0xEB90,0xCFF6,0x0083, 0xEB8F,0xEB8E,0x0085,0x0083,0xF6AB,0xD0E8,0x0083,0xEB8D,0xCEED,0x0089,0x0085,0x0083,0xEB8C,0xEB8B,0x0083,0xEB8A, 0xEB89,0x0085,0x0083,0xB1A2,0xEB88,0x0083,0xC0D7,0xC1E3,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEB87,0xEB86, 0x0083,0xF6A8,0xEB85,0x0085,0x0083,0xEB84,0xEB83,0x0083,0xF6A9,0xEB82,0x0089,0x0085,0x0083,0xEB81,0xEB80,0x0083, 0xEB7E,0xD1A9,0x0085,0x0083,0xF6A7,0xD3EA,0x0083,0xEB7D,0xEB7C,0x0091,0x0089,0x0085,0x0083,0xEB7B,0xEB7A,0x0083, 0xEB79,0xEB78,0x0085,0x0083,0xEB77,0xF6C5,0x0083,0xEB76,0xEB75,0x0089,0x0085,0x0083,0xEB74,0xEB73,0x0083,0xEB72, 0xEB71,0x0085,0x0083,0xEB70,0xEB6F,0x0083,0xEB6E,0xEB6D,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB5F1,0xEB6C,0x0083, 0xEB6B,0xF6C3,0x0085,0x0083,0xEB6A,0xEB69,0x0083,0xB3FB,0xF6C2,0x0089,0x0085,0x0083,0xD3BA,0xB4C6,0x0083,0xEB68, 0xEB67,0x0085,0x0083,0xEFF4,0xEB66,0x0083,0xB9CD,0xBCAF,0x0091,0x0089,0x0085,0x0083,0xD1C5,0xD0DB,0x0083,0xEB65, 0xEB64,0x0085,0x0083,0xD1E3,0xC8B8,0x0083,0xEB63,0xC4D1,0x0089,0x0085,0x0083,0xF6C1,0xF6C0,0x0083,0xEB62,0xEB61, 0x0085,0x0083,0xF6BF,0xEB60,0x0083,0xEB5F,0xC1A5,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEB5E,0xEB5D, 0x0083,0xE3C4,0xEB5C,0x0085,0x0083,0xEB5B,0xDAF4,0x0083,0xEB5A,0xEB59,0x0089,0x0085,0x0083,0xEB58,0xEB57,0x0083, 0xEB56,0xEB55,0x0085,0x0083,0xEB54,0xEB53,0x0083,0xCBED,0xEB52,0x0091,0x0089,0x0085,0x0083,0xEB51,0xEB50,0x0083, 0xEB4F,0xEB4E,0x0085,0x0083,0xEB4D,0xEB4C,0x0083,0xEB4B,0xEB4A,0x0089,0x0085,0x0083,0xEB49,0xD5CF,0x0083,0xEB48, 0xEB47,0x0085,0x0083,0xCFB6,0xB0AF,0x0083,0xDAF3,0xEB46,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEB45,0xB8F4,0x0083, 0xEB44,0xEB43,0x0085,0x0083,0xEB42,0xD2FE,0x0083,0xCBE6,0xEB41,0x0089,0x0085,0x0083,0xDAF2,0xEB40,0x0083,0xCBE5, 0xEAA0,0x0085,0x0083,0xEA9F,0xDAF1,0x0083,0xEA9E,0xC2A1,0x0091,0x0089,0x0085,0x0083,0xD3E7,0xEA9D,0x0083,0xEA9C, 0xEA9B,0x0085,0x0083,0xEA9A,0xEA99,0x0083,0xEA98,0xEA97,0x0089,0x0085,0x0083,0xEA96,0xEA95,0x0083,0xEA94,0xEA93, 0x0085,0x0083,0xEA92,0xEA91,0x0083,0xCFDD,0xCCD5,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC1EA,0xDAF0,0x0083, 0xEA90,0xDAEF,0x0085,0x0083,0xEA8F,0xEA8E,0x0083,0xEA8D,0xEA8C,0x0089,0x0085,0x0083,0xEA8B,0xDAEE,0x0083,0xEA8A, 0xC5E3,0x0085,0x0083,0xCFD5,0xD4C9,0x0083,0xDAED,0xEA89,0x0091,0x0089,0x0085,0x0083,0xEA88,0xB3FD,0x0083,0xEA87, 0xD4BA,0x0085,0x0083,0xB6B8,0xEA86,0x0083,0xDAEC,0xEA85,0x0089,0x0085,0x0083,0xEA84,0xEA83,0x0083,0xB1DD,0xEA82, 0x0085,0x0083,0xEA81,0xEA80,0x0083,0xEA7E,0xEA7D,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC9C2,0xDAEB,0x0083,0xEA7C, 0xEA7B,0x0085,0x0083,0xEA7A,0xCFDE,0x0083,0xEA79,0xEA78,0x0089,0x0085,0x0083,0xBDB5,0xC4B0,0x0083,0xC2AA,0xEA77, 0x0085,0x0083,0xDAEA,0xB3C2,0x0083,0xC2A4,0xC2BD,0x0091,0x0089,0x0085,0x0083,0xBCCA,0xB8BD,0x0083,0xEA76,0xDAE9, 0x0085,0x0083,0xEA75,0xCDD3,0x0083,0xB0A2,0xEA74,0x0089,0x0085,0x0083,0xDAE7,0xDAE8,0x0083,0xD7E8,0xEA73,0x0085, 0x0083,0xEA72,0xEA71,0x0083,0xEA70,0xBDD7,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xD5F3,0x0083, 0xD2F5,0xD1F4,0x0085,0x0083,0xB7C0,0xDAE5,0x0083,0xEA6F,0xEA6E,0x0089,0x0085,0x0083,0xC8EE,0xEA6D,0x0083,0xEA6C, 0xEA6B,0x0085,0x0083,0xDAE6,0xEA6A,0x0083,0xEA69,0xEA68,0x0091,0x0089,0x0085,0x0083,0xEA67,0xEA66,0x0083,0xEA65, 0xEA64,0x0085,0x0083,0xDAE3,0xDAE4,0x0083,0xEA63,0xB6D3,0x0089,0x0085,0x0083,0xEA62,0xDAE2,0x0083,0xB8B7,0xEA61, 0x0085,0x0083,0xE3DB,0xE3DA,0x0083,0xEA60,0xE3D9,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE3D8,0xE3D7,0x0083,0xC0AB, 0xEA5F,0x0085,0x0083,0xE3D6,0xC0BB,0x0083,0xB2FB,0xE3D5,0x0089,0x0085,0x0083,0xD1D6,0xE3D4,0x0083,0xE3D3,0xE3D2, 0x0085,0x0083,0xE3D1,0xD1CB,0x0083,0xE3D0,0xEA5E,0x0091,0x0089,0x0085,0x0083,0xE3CF,0xD4C4,0x0083,0xE3CE,0xE3CD, 0x0085,0x0083,0xBAD2,0xB8F3,0x0083,0xB7A7,0xEA5D,0x0089,0x0085,0x0083,0xE3CC,0xC3F6,0x0083,0xE3CB,0xCEC5,0x0085, 0x0083,0xB9EB,0xC4D6,0x0083,0xD5A2,0xC3C6,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE3CA,0xE3C9,0x0083,0xBCE4, 0xE3C8,0x0085,0x0083,0xCFD0,0xE3C7,0x0083,0xC8F2,0xB4B3,0x0089,0x0085,0x0083,0xCECA,0xB1D5,0x0083,0xEA5C,0xE3C6, 0x0085,0x0083,0xC9C1,0xE3C5,0x0083,0xC3C5,0xEA5B,0x0091,0x0089,0x0085,0x0083,0xEA5A,0xEA59,0x0083,0xEA58,0xEA57, 0x0085,0x0083,0xEA56,0xEA55,0x0083,0xEA54,0xEA53,0x0089,0x0085,0x0083,0xEA52,0xEA51,0x0083,0xEA50,0xEA4F,0x0085, 0x0083,0xEA4E,0xEA4D,0x0083,0xEA4C,0xEA4B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEA4A,0xEA49,0x0083,0xEA48,0xEA47, 0x0085,0x0083,0xEA46,0xEA45,0x0083,0xEA44,0xEA43,0x0089,0x0085,0x0083,0xEA42,0xEA41,0x0083,0xEA40,0xE9A0,0x0085, 0x0083,0xE99F,0xE99E,0x0083,0xE99D,0xE99C,0x0091,0x0089,0x0085,0x0083,0xE99B,0xE99A,0x0083,0xE999,0xE998,0x0085, 0x0083,0xE997,0xE996,0x0083,0xE995,0xE994,0x0089,0x0085,0x0083,0xE993,0xE992,0x0083,0xE991,0xE990,0x0085,0x0083, 0xE98F,0xE98E,0x0083,0xE98D,0xE98C,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE98B,0xE98A,0x0083,0xE989, 0xE988,0x0085,0x0083,0xE987,0xE986,0x0083,0xE985,0xE984,0x0089,0x0085,0x0083,0xE983,0xE982,0x0083,0xE981,0xE980, 0x0085,0x0083,0xE97E,0xE97D,0x0083,0xE97C,0xE97B,0x0091,0x0089,0x0085,0x0083,0xE97A,0xE979,0x0083,0xE978,0xE977, 0x0085,0x0083,0xE976,0xE975,0x0083,0xE974,0xE973,0x0089,0x0085,0x0083,0xE972,0xE971,0x0083,0xE970,0xE96F,0x0085, 0x0083,0xE96E,0xE96D,0x0083,0xE96C,0xE96B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE96A,0xE969,0x0083,0xE968,0xE967, 0x0085,0x0083,0xE966,0xE965,0x0083,0xE964,0xE963,0x0089,0x0085,0x0083,0xE962,0xE961,0x0083,0xE960,0xE95F,0x0085, 0x0083,0xE95E,0xE95D,0x0083,0xE95C,0xE95B,0x0091,0x0089,0x0085,0x0083,0xE95A,0xE959,0x0083,0xE958,0xE957,0x0085, 0x0083,0xE956,0xE955,0x0083,0xE954,0xB3A4,0x0089,0x0085,0x0083,0xE953,0xE952,0x0083,0xE951,0xE950,0x0085,0x0083, 0xE94F,0xE94E,0x0083,0xE94D,0xE94C,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCFE2,0xE94B,0x0083,0xE94A,0xEFF0, 0x0085,0x0083,0xEFEF,0xEFEE,0x0083,0xC1AD,0xEFED,0x0089,0x0085,0x0083,0xE949,0xC0D8,0x0083,0xEFEC,0xEFEB,0x0085, 0x0083,0xEFEA,0xEFE9,0x0083,0xEFE8,0xEFE7,0x0091,0x0089,0x0085,0x0083,0xEFE6,0xEFE5,0x0083,0xEFE4,0xC1CD,0x0085, 0x0083,0xEFE3,0xEFE2,0x0083,0xE948,0xEFE0,0x0089,0x0085,0x0083,0xEFDF,0xEFE1,0x0083,0xBEB5,0xEFDE,0x0085,0x0083, 0xE947,0xEFDD,0x0083,0xEFDC,0xEFDB,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEFDA,0xE946,0x0083,0xEFD9,0xEFD8,0x0085, 0x0083,0xEFD7,0xB0F7,0x0083,0xB8E4,0xEFD6,0x0089,0x0085,0x0083,0xEFD5,0xC4F8,0x0083,0xEFD4,0xE945,0x0085,0x0083, 0xC4F7,0xEFD3,0x0083,0xE944,0xD5F2,0x0091,0x0089,0x0085,0x0083,0xEFD2,0xEFD1,0x0083,0xEFD0,0xE943,0x0085,0x0083, 0xEFCE,0xC3BE,0x0083,0xB6C6,0xEFCD,0x0089,0x0085,0x0083,0xEFCC,0xE942,0x0083,0xEFCB,0xB6CD,0x0085,0x0083,0xEFF1, 0xC7C2,0x0083,0xEFCA,0xEFC9,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEFC8,0xEFCF,0x0083,0xEFC7, 0xE941,0x0085,0x0083,0xEFC6,0xEFC5,0x0083,0xC3CC,0xBEE2,0x0089,0x0085,0x0083,0xBCFC,0xB6A7,0x0083,0xEFC4,0xEFC2, 0x0085,0x0083,0xEFC1,0xEFC3,0x0083,0xCFC7,0xE940,0x0091,0x0089,0x0085,0x0083,0xBDF5,0xD7B6,0x0083,0xB4B8,0xC2E0, 0x0085,0x0083,0xEFC0,0xCEFD,0x0083,0xE8A0,0xEFBF,0x0089,0x0085,0x0083,0xEFBE,0xEFBD,0x0083,0xE89F,0xEFBC,0x0085, 0x0083,0xC3AA,0xB4ED,0x0083,0xEFBB,0xD5E0,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEFBA,0xEFB9,0x0083,0xEFB8,0xEFB7, 0x0085,0x0083,0xEFB6,0xCCE0,0x0083,0xC8F1,0xEFB5,0x0089,0x0085,0x0083,0xEFB4,0xEFB3,0x0083,0xD0BF,0xB7E6,0x0085, 0x0083,0xEFB2,0xEFB1,0x0083,0xD0E2,0xEFB0,0x0091,0x0089,0x0085,0x0083,0xEFAF,0xB9F8,0x0083,0xB3FA,0xEFAD,0x0085, 0x0083,0xEFAE,0xCBF8,0x0083,0xCFFA,0xEFAC,0x0089,0x0085,0x0083,0xC1B4,0xEFAB,0x0083,0xEFAA,0xE89E,0x0085,0x0083, 0xC6CC,0xEFA9,0x0083,0xD6FD,0xEFA8,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD2F8,0xEFA7,0x0083,0xEFA6,0xEFA5, 0x0085,0x0083,0xB2F9,0xD2BF,0x0083,0xBDC2,0xEFA4,0x0089,0x0085,0x0083,0xEFA3,0xC3FA,0x0083,0xB8F5,0xEFA2,0x0085, 0x0083,0xEEFE,0xEFA1,0x0083,0xEEFD,0xEEFC,0x0091,0x0089,0x0085,0x0083,0xE89D,0xEEFB,0x0083,0xEEFA,0xCFB3,0x0085, 0x0083,0xEEF9,0xD5A1,0x0083,0xEEF8,0xEEF7,0x0089,0x0085,0x0083,0xEEF6,0xC2C1,0x0083,0xCDAD,0xEEF5,0x0085,0x0083, 0xE89C,0xEEF3,0x0083,0xEEF4,0xEEF2,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEEF1,0xEEF0,0x0083,0xE89B,0xE89A,0x0085, 0x0083,0xEEEF,0xEEEE,0x0083,0xEEED,0xE899,0x0089,0x0085,0x0083,0xEEEC,0xEEEB,0x0083,0xEEEA,0xEEE9,0x0085,0x0083, 0xEEE8,0xEEE7,0x0083,0xEEE6,0xE898,0x0091,0x0089,0x0085,0x0083,0xC3AD,0xC7A6,0x0083,0xEEE5,0xC1E5,0x0085,0x0083, 0xB2AC,0xCCFA,0x0083,0xD3CB,0xEEE4,0x0089,0x0085,0x0083,0xBCD8,0xEEE3,0x0083,0xEEE2,0xD7EA,0x0085,0x0083,0xEEE1, 0xEEE0,0x0083,0xEEDF,0xEEDE,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEEDD,0xB2A7,0x0083,0xEEDC,0xC7AF, 0x0085,0x0083,0xEEDB,0xC7AE,0x0083,0xEEDA,0xEED9,0x0089,0x0085,0x0083,0xC5A5,0xEED7,0x0083,0xEED8,0xEED5,0x0085, 0x0083,0xEED6,0xB9B3,0x0083,0xCED9,0xBEFB,0x0091,0x0089,0x0085,0x0083,0xC7D5,0xD4BF,0x0083,0xEED4,0xEED3,0x0085, 0x0083,0xB8D6,0xB1B5,0x0083,0xC4C6,0xD6D3,0x0089,0x0085,0x0083,0xB3AE,0xB6DB,0x0083,0xEED2,0xEED1,0x0085,0x0083, 0xEED0,0xB8C6,0x0083,0xE897,0xEECE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE896,0xEECF,0x0083,0xEECD,0xB5F6,0x0085, 0x0083,0xB7B0,0xE895,0x0083,0xEECC,0xEECB,0x0089,0x0085,0x0083,0xC7A5,0xEECA,0x0083,0xEEC9,0xEEC7,0x0085,0x0083, 0xEEC8,0xB6A4,0x0083,0xD5EB,0xEEC6,0x0091,0x0089,0x0085,0x0083,0xEEC5,0xEEC4,0x0083,0xE894,0xE893,0x0085,0x0083, 0xE892,0xE891,0x0083,0xE890,0xE88F,0x0089,0x0085,0x0083,0xE88E,0xE88D,0x0083,0xE88C,0xE88B,0x0085,0x0083,0xE88A, 0xE889,0x0083,0xE888,0xE887,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE886,0xE885,0x0083,0xE884,0xE883,0x0085, 0x0083,0xE882,0xE881,0x0083,0xE880,0xE87E,0x0089,0x0085,0x0083,0xE87D,0xE87C,0x0083,0xE87B,0xF6CE,0x0085,0x0083, 0xE87A,0xE879,0x0083,0xE878,0xE877,0x0091,0x0089,0x0085,0x0083,0xE876,0xE875,0x0083,0xE874,0xE873,0x0085,0x0083, 0xE872,0xE871,0x0083,0xE870,0xE86F,0x0089,0x0085,0x0083,0xE86E,0xE86D,0x0083,0xE86C,0xE86B,0x0085,0x0083,0xE86A, 0xE869,0x0083,0xE868,0xE867,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE866,0xE865,0x0083,0xE864,0xE863,0x0085,0x0083, 0xE862,0xE861,0x0083,0xE860,0xE85F,0x0089,0x0085,0x0083,0xE85E,0xE85D,0x0083,0xE85C,0xE85B,0x0085,0x0083,0xE85A, 0xE859,0x0083,0xE858,0xE857,0x0091,0x0089,0x0085,0x0083,0xE856,0xE855,0x0083,0xE854,0xE853,0x0085,0x0083,0xE852, 0xE851,0x0083,0xE850,0xE84F,0x0089,0x0085,0x0083,0xF6CD,0xE84E,0x0083,0xE84D,0xE84C,0x0085,0x0083,0xE84B,0xE84A, 0x0083,0xE849,0xE848,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xE847,0x0083,0xE846,0xE845, 0x0085,0x0083,0xE844,0xE843,0x0083,0xE842,0xE841,0x0089,0x0085,0x0083,0xE840,0xE7A0,0x0083,0xE79F,0xE79E,0x0085, 0x0083,0xE79D,0xE79C,0x0083,0xE79B,0xE79A,0x0091,0x0089,0x0085,0x0083,0xE799,0xE798,0x0083,0xE797,0xE796,0x0085, 0x0083,0xE795,0xE794,0x0083,0xE793,0xE792,0x0089,0x0085,0x0083,0xE791,0xE790,0x0083,0xE78F,0xE78E,0x0085,0x0083, 0xE78D,0xE78C,0x0083,0xE78B,0xE78A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE789,0xE788,0x0083,0xE787,0xE786,0x0085, 0x0083,0xE785,0xE784,0x0083,0xE783,0xE782,0x0089,0x0085,0x0083,0xE781,0xE780,0x0083,0xE77E,0xE77D,0x0085,0x0083, 0xE77C,0xE77B,0x0083,0xE77A,0xE779,0x0091,0x0089,0x0085,0x0083,0xE778,0xE777,0x0083,0xE776,0xE775,0x0085,0x0083, 0xE774,0xE773,0x0083,0xE772,0xE771,0x0089,0x0085,0x0083,0xE770,0xE76F,0x0083,0xE76E,0xE76D,0x0085,0x0083,0xE76C, 0xE76B,0x0083,0xE76A,0xE769,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE768,0xE767,0x0083,0xE766,0xE765,0x0085, 0x0083,0xE764,0xE763,0x0083,0xE762,0xE761,0x0089,0x0085,0x0083,0xE760,0xE75F,0x0083,0xE75E,0xE75D,0x0085,0x0083, 0xE75C,0xE75B,0x0083,0xE75A,0xE759,0x0091,0x0089,0x0085,0x0083,0xE758,0xE757,0x0083,0xE756,0xE755,0x0085,0x0083, 0xE754,0xE753,0x0083,0xE752,0xE751,0x0089,0x0085,0x0083,0xE750,0xE74F,0x0083,0xE74E,0xE74D,0x0085,0x0083,0xE74C, 0xE74B,0x0083,0xE74A,0xE749,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE748,0xF7E9,0x0083,0xE747,0xE746,0x0085,0x0083, 0xE745,0xE744,0x0083,0xE743,0xE742,0x0089,0x0085,0x0083,0xE741,0xE740,0x0083,0xE6A0,0xE69F,0x0085,0x0083,0xE69E, 0xF6CB,0x0083,0xE69D,0xE69C,0x0091,0x0089,0x0085,0x0083,0xE69B,0xE69A,0x0083,0xE699,0xE698,0x0085,0x0083,0xE697, 0xE696,0x0083,0xE695,0xE694,0x0089,0x0085,0x0083,0xE693,0xE692,0x0083,0xE691,0xE690,0x0085,0x0083,0xE68F,0xE68E, 0x0083,0xE68D,0xE68C,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE68B,0xE68A,0x0083,0xE689,0xE688,0x0085, 0x0083,0xE687,0xE686,0x0083,0xE685,0xE684,0x0089,0x0085,0x0083,0xE683,0xE682,0x0083,0xE681,0xE680,0x0085,0x0083, 0xE67E,0xE67D,0x0083,0xE67C,0xE67B,0x0091,0x0089,0x0085,0x0083,0xE67A,0xE679,0x0083,0xE678,0xE677,0x0085,0x0083, 0xE676,0xE675,0x0083,0xE674,0xE673,0x0089,0x0085,0x0083,0xE672,0xE671,0x0083,0xE670,0xE66F,0x0085,0x0083,0xE66E, 0xE66D,0x0083,0xE66C,0xE66B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE66A,0xE669,0x0083,0xE668,0xE667,0x0085,0x0083, 0xE666,0xE665,0x0083,0xE664,0xE663,0x0089,0x0085,0x0083,0xF6CC,0xE662,0x0083,0xE661,0xE660,0x0085,0x0083,0xE65F, 0xE65E,0x0083,0xE65D,0xE65C,0x0091,0x0089,0x0085,0x0083,0xE65B,0xE65A,0x0083,0xE659,0xE658,0x0085,0x0083,0xE657, 0xE656,0x0083,0xE655,0xE654,0x0089,0x0085,0x0083,0xE653,0xE652,0x0083,0xE651,0xE650,0x0085,0x0083,0xE64F,0xE64E, 0x0083,0xE64D,0xE64C,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE64B,0xE64A,0x0083,0xE649,0xE648,0x0085,0x0083, 0xE647,0xE646,0x0083,0xE645,0xE644,0x0089,0x0085,0x0083,0xE643,0xE642,0x0083,0xE641,0xE640,0x0085,0x0083,0xE5A0, 0xF6CA,0x0083,0xE59F,0xE59E,0x0091,0x0089,0x0085,0x0083,0xE59D,0xE59C,0x0083,0xE59B,0xE59A,0x0085,0x0083,0xE599, 0xE598,0x0083,0xE597,0xE596,0x0089,0x0085,0x0083,0xE595,0xE594,0x0083,0xE593,0xE592,0x0085,0x0083,0xE591,0xE590, 0x0083,0xE58F,0xE58E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE58D,0xE58C,0x0083,0xE58B,0xE58A,0x0085,0x0083,0xE589, 0xE588,0x0083,0xE587,0xE586,0x0089,0x0085,0x0083,0xE585,0xE584,0x0083,0xE583,0xE582,0x0085,0x0083,0xE581,0xE580, 0x0083,0xE57E,0xE57D,0x0091,0x0089,0x0085,0x0083,0xE57C,0xE57B,0x0083,0xE57A,0xE579,0x0085,0x0083,0xE578,0xE577, 0x0083,0xE576,0xE575,0x0089,0x0085,0x0083,0xE574,0xF6C9,0x0083,0xE573,0xE572,0x0085,0x0083,0xE571,0xE570,0x0083, 0xE56F,0xE56E,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xE56D,0x0083,0xE56C,0xE56B,0x0085,0x0083,0xE56A, 0xE569,0x0083,0xE568,0xE567,0x0089,0x0085,0x0083,0xE566,0xE565,0x0083,0xE564,0xE563,0x0085,0x0083,0xE562,0xE561, 0x0083,0xE560,0xE55F,0x0091,0x0089,0x0085,0x0083,0xE55E,0xE55D,0x0083,0xE55C,0xE55B,0x0085,0x0083,0xE55A,0xE559, 0x0083,0xE558,0xE557,0x0089,0x0085,0x0083,0xE556,0xE555,0x0083,0xE554,0xE553,0x0085,0x0083,0xE552,0xE551,0x0083, 0xE550,0xE54F,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE54E,0xE54D,0x0083,0xE54C,0xE54B,0x0085,0x0083,0xE54A,0xE549, 0x0083,0xE548,0xE547,0x0089,0x0085,0x0083,0xE546,0xE545,0x0083,0xE544,0xE543,0x0085,0x0083,0xE542,0xE541,0x0083, 0xE540,0xE4A0,0x0091,0x0089,0x0085,0x0083,0xE49F,0xE49E,0x0083,0xE49D,0xE49C,0x0085,0x0083,0xE49B,0xE49A,0x0083, 0xE499,0xE498,0x0089,0x0085,0x0083,0xE497,0xE496,0x0083,0xE495,0xE494,0x0085,0x0083,0xE493,0xE492,0x0083,0xE491, 0xE490,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE48F,0xE48E,0x0083,0xE48D,0xE48C,0x0085,0x0083,0xE48B,0xE48A, 0x0083,0xE489,0xE488,0x0089,0x0085,0x0083,0xE487,0xE486,0x0083,0xE485,0xE484,0x0085,0x0083,0xE483,0xE482,0x0083, 0xE481,0xE480,0x0091,0x0089,0x0085,0x0083,0xE47E,0xE47D,0x0083,0xE47C,0xE47B,0x0085,0x0083,0xE47A,0xE479,0x0083, 0xE478,0xE477,0x0089,0x0085,0x0083,0xE476,0xE475,0x0083,0xE474,0xE473,0x0085,0x0083,0xE472,0xE471,0x0083,0xE470, 0xE46F,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE46E,0xE46D,0x0083,0xE46C,0xE46B,0x0085,0x0083,0xE46A,0xE469,0x0083, 0xE468,0xE467,0x0089,0x0085,0x0083,0xE466,0xE465,0x0083,0xE464,0xE463,0x0085,0x0083,0xE462,0xE461,0x0083,0xE460, 0xE45F,0x0091,0x0089,0x0085,0x0083,0xF6C8,0xE45E,0x0083,0xE45D,0xE45C,0x0085,0x0083,0xE45B,0xE45A,0x0083,0xE459, 0xE458,0x0089,0x0085,0x0083,0xE457,0xE456,0x0083,0xE455,0xE454,0x0085,0x0083,0xE453,0xE452,0x0083,0xE451,0xE450, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE44F,0xE44E,0x0083,0xE44D,0xE44C,0x0085,0x0083,0xE44B,0xE44A, 0x0083,0xE449,0xE448,0x0089,0x0085,0x0083,0xE447,0xE446,0x0083,0xF6C7,0xE445,0x0085,0x0083,0xE444,0xE443,0x0083, 0xE442,0xE441,0x0091,0x0089,0x0085,0x0083,0xE440,0xE3A0,0x0083,0xE39F,0xE39E,0x0085,0x0083,0xE39D,0xE39C,0x0083, 0xE39B,0xE39A,0x0089,0x0085,0x0083,0xE399,0xE398,0x0083,0xE397,0xE396,0x0085,0x0083,0xE395,0xE394,0x0083,0xE393, 0xE392,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE391,0xE390,0x0083,0xE38F,0xE38E,0x0085,0x0083,0xE38D,0xE38C,0x0083, 0xE38B,0xE38A,0x0089,0x0085,0x0083,0xE389,0xE388,0x0083,0xF6C6,0xE387,0x0085,0x0083,0xE386,0xE385,0x0083,0xE384, 0xE383,0x0091,0x0089,0x0085,0x0083,0xE382,0xE381,0x0083,0xE380,0xE37E,0x0085,0x0083,0xE37D,0xE37C,0x0083,0xE37B, 0xE37A,0x0089,0x0085,0x0083,0xE379,0xE378,0x0083,0xE377,0xE376,0x0085,0x0083,0xE375,0xE374,0x0083,0xE373,0xE372, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE371,0xE370,0x0083,0xE36F,0xE36E,0x0085,0x0083,0xBCF8,0xE36D,0x0083, 0xE36C,0xE36B,0x0089,0x0085,0x0083,0xE36A,0xE369,0x0083,0xE368,0xE367,0x0085,0x0083,0xE366,0xE365,0x0083,0xE364, 0xE363,0x0091,0x0089,0x0085,0x0083,0xE362,0xE361,0x0083,0xE360,0xE35F,0x0085,0x0083,0xE35E,0xE35D,0x0083,0xE35C, 0xE35B,0x0089,0x0085,0x0083,0xE35A,0xE359,0x0083,0xE358,0xE357,0x0085,0x0083,0xE356,0xE355,0x0083,0xE354,0xE353, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xE352,0xE351,0x0083,0xE350,0xE34F,0x0085,0x0083,0xE34E,0xE34D,0x0083,0xE34C, 0xE34B,0x0089,0x0085,0x0083,0xE34A,0xE349,0x0083,0xE348,0xE347,0x0085,0x0083,0xE346,0xE345,0x0083,0xE344,0xE343, 0x0091,0x0089,0x0085,0x0083,0xE342,0xE341,0x0083,0xE340,0xE2A0,0x0085,0x0083,0xE29F,0xE29E,0x0083,0xE29D,0xE29C, 0x0089,0x0085,0x0083,0xE29B,0xE29A,0x0083,0xE299,0xE298,0x0085,0x0083,0xE297,0xE296,0x0083,0xE295,0xE294,0x027F, 0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xE293,0x0083,0xE292,0xE291,0x0085,0x0083,0xE290,0xE28F,0x0083, 0xE28E,0xE28D,0x0089,0x0085,0x0083,0xE28C,0xE28B,0x0083,0xE28A,0xE289,0x0085,0x0083,0xE288,0xE287,0x0083,0xE286, 0xE285,0x0091,0x0089,0x0085,0x0083,0xE284,0xE283,0x0083,0xE282,0xE281,0x0085,0x0083,0xE280,0xE27E,0x0083,0xE27D, 0xE27C,0x0089,0x0085,0x0083,0xE27B,0xE27A,0x0083,0xE279,0xE278,0x0085,0x0083,0xE277,0xE276,0x0083,0xE275,0xE274, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xE273,0xE272,0x0083,0xE271,0xE270,0x0085,0x0083,0xE26F,0xE26E,0x0083,0xE26D, 0xE26C,0x0089,0x0085,0x0083,0xE26B,0xE26A,0x0083,0xE269,0xE268,0x0085,0x0083,0xE267,0xE266,0x0083,0xE265,0xE264, 0x0091,0x0089,0x0085,0x0083,0xE263,0xE262,0x0083,0xE261,0xE260,0x0085,0x0083,0xE25F,0xE25E,0x0083,0xE25D,0xE25C, 0x0089,0x0085,0x0083,0xE25B,0xE25A,0x0083,0xE259,0xE258,0x0085,0x0083,0xE257,0xE256,0x0083,0xE255,0xE254,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xE253,0xE252,0x0083,0xE251,0xE250,0x0085,0x0083,0xE24F,0xE24E,0x0083,0xE24D, 0xE24C,0x0089,0x0085,0x0083,0xE24B,0xE24A,0x0083,0xE249,0xE248,0x0085,0x0083,0xE247,0xE246,0x0083,0xE245,0xE244, 0x0091,0x0089,0x0085,0x0083,0xE243,0xE242,0x0083,0xE241,0xE240,0x0085,0x0083,0xE1A0,0xE19F,0x0083,0xE19E,0xE19D, 0x0089,0x0085,0x0083,0xE19C,0xE19B,0x0083,0xE19A,0xE199,0x0085,0x0083,0xE198,0xB8AA,0x0083,0xE197,0xE196,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xE195,0xE194,0x0083,0xE193,0xE192,0x0085,0x0083,0xE191,0xE190,0x0083,0xE18F,0xE18E, 0x0089,0x0085,0x0083,0xBDF0,0xE18D,0x0083,0xC1BF,0xD2B0,0x0085,0x0083,0xD6D8,0xC0EF,0x0083,0xE18C,0xCACD,0x0091, 0x0089,0x0085,0x0083,0xD3D4,0xE18B,0x0083,0xB2C9,0xE18A,0x0085,0x0083,0xE189,0xE188,0x0083,0xE187,0xE186,0x0089, 0x0085,0x0083,0xE185,0xE184,0x0083,0xE183,0xE182,0x0085,0x0083,0xE181,0xE180,0x0083,0xE17E,0xF5B8,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xE17D,0xE17C,0x0083,0xE17B,0xE17A,0x0085,0x0083,0xF5B6,0xF5B7,0x0083,0xE179, 0xE178,0x0089,0x0085,0x0083,0xE177,0xE176,0x0083,0xF5B5,0xF5B4,0x0085,0x0083,0xF5B3,0xE175,0x0083,0xE174,0xF5B2, 0x0091,0x0089,0x0085,0x0083,0xE173,0xE172,0x0083,0xE171,0xE170,0x0085,0x0083,0xE16F,0xE16E,0x0083,0xF5B1,0xF5B0, 0x0089,0x0085,0x0083,0xE16D,0xE16C,0x0083,0xE16B,0xE16A,0x0085,0x0083,0xE169,0xE168,0x0083,0xC8A9,0xC3D1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xE167,0xE166,0x0083,0xE165,0xE164,0x0085,0x0083,0xE163,0xE162,0x0083,0xE161,0xD0D1, 0x0089,0x0085,0x0083,0xF5AF,0xF5AD,0x0083,0xE160,0xE15F,0x0085,0x0083,0xF5AE,0xF5AB,0x0083,0xB4D7,0xE15E,0x0091, 0x0089,0x0085,0x0083,0xD7ED,0xE15D,0x0083,0xB4BC,0xE15C,0x0085,0x0083,0xF5AC,0xE15B,0x0083,0xE15A,0xE159,0x0089, 0x0085,0x0083,0xE158,0xE157,0x0083,0xC4F0,0xF5A7,0x0085,0x0083,0xF5A6,0xE156,0x0083,0xE155,0xE154,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xF5AA,0xCBE1,0x0083,0xBFE1,0xC3B8,0x0085,0x0083,0xBDCD,0xF5A9,0x0083,0xE153,0xF5A8, 0x0089,0x0085,0x0083,0xBDB4,0xF5A3,0x0083,0xF5A5,0xCDAA,0x0085,0x0083,0xE152,0xB3EA,0x0083,0xE151,0xC0D2,0x0091, 0x0089,0x0085,0x0083,0xF5A4,0xE150,0x0083,0xE14F,0xE14E,0x0085,0x0083,0xCBD6,0xF4FE,0x0083,0xBAA8,0xF5A1,0x0089, 0x0085,0x0083,0xF5A2,0xE14D,0x0083,0xE14C,0xCCAA,0x0085,0x0083,0xD4CD,0xE14B,0x0083,0xE14A,0xB7D3,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xE149,0xE148,0x0083,0xD0EF,0xE147,0x0085,0x0083,0xE146,0xE145,0x0083,0xE144,0xBEC6,0x0089, 0x0085,0x0083,0xE143,0xF4FB,0x0083,0xF4FD,0xF4FC,0x0085,0x0083,0xC5E4,0xD7C3,0x0083,0xC7F5,0xF4FA,0x0091,0x0089, 0x0085,0x0083,0xD3CF,0xE142,0x0083,0xE141,0xDBBA,0x0085,0x0083,0xE140,0xE0A0,0x0083,0xDBB9,0xE09F,0x0089,0x0085, 0x0083,0xE09E,0xE09D,0x0083,0xE09C,0xE09B,0x0085,0x0083,0xE09A,0xE099,0x0083,0xE098,0xE097,0x0181,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xDBB8,0xE096,0x0083,0xE095,0xE094,0x0085,0x0083,0xE093,0xE092,0x0083,0xE091, 0xE090,0x0089,0x0085,0x0083,0xDBB6,0xE08F,0x0083,0xDBB7,0xE08E,0x0085,0x0083,0xE08D,0xE08C,0x0083,0xE08B,0xE08A, 0x0091,0x0089,0x0085,0x0083,0xE089,0xE088,0x0083,0xE087,0xE086,0x0085,0x0083,0xE085,0xE084,0x0083,0xDBB5,0xDBB3, 0x0089,0x0085,0x0083,0xE083,0xE082,0x0083,0xE081,0xDBB4,0x0085,0x0083,0xE080,0xE07E,0x0083,0xE07D,0xE07C,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB1C9,0xE07B,0x0083,0xE07A,0xE079,0x0085,0x0083,0xE078,0xE077,0x0083,0xE076,0xE075, 0x0089,0x0085,0x0083,0xE074,0xE073,0x0083,0xE072,0xE071,0x0085,0x0083,0xE070,0xE06F,0x0083,0xE06E,0xE06D,0x0091, 0x0089,0x0085,0x0083,0xE06C,0xE06B,0x0083,0xE06A,0xE069,0x0085,0x0083,0xE068,0xDBB2,0x0083,0xE067,0xB6F5,0x0089, 0x0085,0x0083,0xE066,0xE065,0x0083,0xE064,0xDBB1,0x0085,0x0083,0xB6BC,0xE063,0x0083,0xE062,0xE061,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xE060,0xB5A6,0x0083,0xE05F,0xE05E,0x0085,0x0083,0xE05D,0xB3BB,0x0083,0xE05C,0xE05B, 0x0089,0x0085,0x0083,0xE05A,0xE059,0x0083,0xDBB0,0xE058,0x0085,0x0083,0xB9F9,0xE057,0x0083,0xDBAF,0xE056,0x0091, 0x0089,0x0085,0x0083,0xE055,0xB2BF,0x0083,0xD4C7,0xDBAA,0x0085,0x0083,0xE054,0xE053,0x0083,0xE052,0xDBAB,0x0089, 0x0085,0x0083,0xBFA4,0xE051,0x0083,0xE050,0xE04F,0x0085,0x0083,0xBAC2,0xDBAC,0x0083,0xDBAE,0xE04E,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xE04D,0xE04C,0x0083,0xDBAD,0xE04B,0x0085,0x0083,0xE04A,0xE049,0x0083,0xDBA9,0xE048,0x0089, 0x0085,0x0083,0xD6A3,0xDBA6,0x0083,0xDBA3,0xC0C9,0x0085,0x0083,0xE047,0xE046,0x0083,0xE045,0xBDBC,0x0091,0x0089, 0x0085,0x0083,0xE044,0xE043,0x0083,0xDBA8,0xE042,0x0085,0x0083,0xDBA4,0xDBA7,0x0083,0xE041,0xE040,0x0089,0x0085, 0x0083,0xD3F4,0xDFA0,0x0083,0xDF9F,0xDBA5,0x0085,0x0083,0xDF9E,0xDF9D,0x0083,0xC1DA,0xDAFE,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xD7DE,0xDBA1,0x0083,0xDF9C,0xDAFD,0x0085,0x0083,0xC9DB,0xDAFB,0x0083,0xDAFC,0xDF9B, 0x0089,0x0085,0x0083,0xC7F1,0xDBA2,0x0083,0xBAAA,0xD3CA,0x0085,0x0083,0xDF9A,0xDAF9,0x0083,0xDF99,0xD0B0,0x0091, 0x0089,0x0085,0x0083,0xDF98,0xDF97,0x0083,0xDF96,0xB0EE,0x0085,0x0083,0xDF95,0xDF94,0x0083,0xC4C7,0xD0CF,0x0089, 0x0085,0x0083,0xDAFA,0xDF93,0x0083,0xDF92,0xDF91,0x0085,0x0083,0xDAF7,0xDF90,0x0083,0xDAF6,0xDF8F,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xDAF8,0xDF8E,0x0083,0xDAF5,0xDF8D,0x0085,0x0083,0xE7DF,0xDF8C,0x0083,0xB5CB,0xDF8B,0x0089, 0x0085,0x0083,0xD2D8,0xDF8A,0x0083,0xDF89,0xDF88,0x0085,0x0083,0xDF87,0xDF86,0x0083,0xE5E5,0xDF85,0x0091,0x0089, 0x0085,0x0083,0xDF84,0xE5E3,0x0083,0xDF83,0xDF82,0x0085,0x0083,0xDF81,0xDF80,0x0083,0xE5E4,0xE5E2,0x0089,0x0085, 0x0083,0xDF7E,0xD1FB,0x0083,0xB1DC,0xDF7D,0x0085,0x0083,0xE5E1,0xDF7C,0x0083,0xDF7B,0xDF7A,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xDF79,0xDF78,0x0083,0xDF77,0xDF76,0x0085,0x0083,0xD7F1,0xE5E0,0x0083,0xDF75,0xDF74,0x0089, 0x0085,0x0083,0xDF73,0xDF72,0x0083,0xDF71,0xD5DA,0x0085,0x0083,0xD4E2,0xDF70,0x0083,0xDF6F,0xDF6E,0x0091,0x0089, 0x0085,0x0083,0xDF6D,0xE5DB,0x0083,0xDF6C,0xDF6B,0x0085,0x0083,0xD2A3,0xDF6A,0x0083,0xC7B2,0xE5DD,0x0089,0x0085, 0x0083,0xDF69,0xDF68,0x0083,0xDF67,0xDF66,0x0085,0x0083,0xDF65,0xDF64,0x0083,0xE5DE,0xDF63,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xDF62,0xE5DC,0x0083,0xD2C5,0xDF61,0x0085,0x0083,0xDF60,0xDF5F,0x0083,0xB5C0,0xE5D9,0x0089,0x0085, 0x0083,0xE5D8,0xE5DA,0x0083,0xB6F4,0xDF5E,0x0085,0x0083,0xB1E9,0xDF5D,0x0083,0xDF5C,0xDF5B,0x0091,0x0089,0x0085, 0x0083,0xDF5A,0xDF59,0x0083,0xD3F6,0xDF58,0x0085,0x0083,0xDF57,0xE5D7,0x0083,0xDF56,0xCBEC,0x0089,0x0085,0x0083, 0xB6DD,0xDF55,0x0083,0xDF54,0xD3E2,0x0085,0x0083,0xDF53,0xB1C6,0x0083,0xC2DF,0xDF52,0x1075,0x087B,0x047D,0x027F, 0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xDF51,0x0083,0xD2DD,0xDF50,0x0085,0x0083,0xE5D4,0xE5D3,0x0083, 0xDF4F,0xDF4E,0x0089,0x0085,0x0083,0xDF4D,0xDF4C,0x0083,0xDF4B,0xE5D6,0x0085,0x0083,0xB4FE,0xE5D5,0x0083,0xDF4A, 0xDF49,0x0091,0x0089,0x0085,0x0083,0xDF48,0xDF47,0x0083,0xDF46,0xDF45,0x0085,0x0083,0xE5CE,0xDF44,0x0083,0xDF43, 0xDF42,0x0089,0x0085,0x0083,0xB7EA,0xE5D2,0x0083,0xD4EC,0xCBD9,0x0085,0x0083,0xB3D1,0xCAC5,0x0083,0xDF41,0xB9E4, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xCDA8,0xDF40,0x0083,0xDEA0,0xB6BA,0x0085,0x0083,0xE5D1,0xDE9F,0x0083,0xCDBE, 0xDE9E,0x0089,0x0085,0x0083,0xB5DD,0xE5CF,0x0083,0xD6F0,0xCDB8,0x0085,0x0083,0xDE9D,0xE5D0,0x0083,0xDE9C,0xE5CD, 0x0091,0x0089,0x0085,0x0083,0xD1B7,0xD1A1,0x0083,0xDE9B,0xDE9A,0x0085,0x0083,0xC4E6,0xE5CB,0x0083,0xE5CC,0xCCD3, 0x0089,0x0085,0x0083,0xCACA,0xCBCD,0x0083,0xCDCB,0xDE99,0x0085,0x0083,0xDE98,0xD7B7,0x0083,0xDE97,0xDE96,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xDE95,0xBCA3,0x0083,0xB1C5,0xC3D4,0x0085,0x0083,0xDE94,0xDE93,0x0083,0xDE92, 0xE5C9,0x0089,0x0085,0x0083,0xDE91,0xDE90,0x0083,0xCAF6,0xDE8F,0x0085,0x0083,0xE5C5,0xB5FC,0x0083,0xDE8E,0xC6C8, 0x0091,0x0089,0x0085,0x0083,0xB5CF,0xE5C7,0x0083,0xE5CA,0xDE8D,0x0085,0x0083,0xE5C8,0xE5C4,0x0083,0xE5C6,0xDE8C, 0x0089,0x0085,0x0083,0xCCF6,0xDE8B,0x0083,0xDE8A,0xB3D9,0x0085,0x0083,0xC1AC,0xCEA5,0x0083,0xD4B6,0xBDF8,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xDE89,0xD5E2,0x0083,0xBBB9,0xDE88,0x0085,0x0083,0xDE87,0xE5C3,0x0083,0xB7B5,0xE5C2, 0x0089,0x0085,0x0083,0xDE86,0xBDFC,0x0083,0xD4CB,0xDE85,0x0085,0x0083,0xD3AD,0xDE84,0x0083,0xDE83,0xDE82,0x0091, 0x0089,0x0085,0x0083,0xDE81,0xDE80,0x0083,0xC2F5,0xB9FD,0x0085,0x0083,0xDE7E,0xD1B8,0x0083,0xC6F9,0xDE7D,0x0089, 0x0085,0x0083,0xD3D8,0xC7A8,0x0083,0xDE7C,0xDE7B,0x0085,0x0083,0xB4EF,0xC1C9,0x0083,0xDE7A,0xDE79,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xDE78,0xB1DF,0x0083,0xDE77,0xDE76,0x0085,0x0083,0xE5C1,0xDE75,0x0083,0xDE74, 0xDE73,0x0089,0x0085,0x0083,0xDE72,0xC8E8,0x0083,0xB3BD,0xDE71,0x0085,0x0083,0xDE70,0xDE6F,0x0083,0xDE6E,0xB1E8, 0x0091,0x0089,0x0085,0x0083,0xDE6D,0xB1E7,0x0083,0xB1E6,0xDE6C,0x0085,0x0083,0xDE6B,0xDE6A,0x0083,0xDE69,0xC0B1, 0x0089,0x0085,0x0083,0xDE68,0xDE67,0x0083,0xDE66,0xB1D9,0x0085,0x0083,0xB4C7,0xDE65,0x0083,0xB9BC,0xD0C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xEAA5,0xD5DE,0x0083,0xEAA4,0xD5B7,0x0085,0x0083,0xCFBD,0xD4AF,0x0083,0xE0CE,0xCAE4, 0x0089,0x0085,0x0083,0xDE64,0xBCAD,0x0083,0xB7F8,0xEAA3,0x0085,0x0083,0xEAA2,0xEAA1,0x0083,0xDE63,0xE9FE,0x0091, 0x0089,0x0085,0x0083,0xB9F5,0xBBD4,0x0083,0xB1B2,0xE9FD,0x0085,0x0083,0xC1BE,0xB8A8,0x0083,0xE9FC,0xBDCF,0x0089, 0x0085,0x0083,0xE9FB,0xE9FA,0x0083,0xDE62,0xBDCE,0x0085,0x0083,0xE9F9,0xD4D8,0x0083,0xE9F8,0xC7E1,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xE9F7,0xE9F6,0x0083,0xE9F4,0xE9F5,0x0085,0x0083,0xE9F3,0xE9F2,0x0083,0xD6E1,0xE9F1, 0x0089,0x0085,0x0083,0xE9F0,0xE9EF,0x0083,0xBAE4,0xC8ED,0x0085,0x0083,0xC2D6,0xE9EE,0x0083,0xD7AA,0xE9ED,0x0091, 0x0089,0x0085,0x0083,0xDE61,0xD0F9,0x0083,0xB9EC,0xD4FE,0x0085,0x0083,0xB3B5,0xDE60,0x0083,0xDE5F,0xDE5E,0x0089, 0x0085,0x0083,0xDE5D,0xDE5C,0x0083,0xDE5B,0xDE5A,0x0085,0x0083,0xDE59,0xDE58,0x0083,0xDE57,0xDE56,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xDE55,0xDE54,0x0083,0xDE53,0xDE52,0x0085,0x0083,0xDE51,0xDE50,0x0083,0xDE4F,0xDE4E,0x0089, 0x0085,0x0083,0xDE4D,0xDE4C,0x0083,0xDE4B,0xDE4A,0x0085,0x0083,0xDE49,0xDE48,0x0083,0xDE47,0xDE46,0x0091,0x0089, 0x0085,0x0083,0xDE45,0xDE44,0x0083,0xDE43,0xDE42,0x0085,0x0083,0xDE41,0xDE40,0x0083,0xDDA0,0xDD9F,0x0089,0x0085, 0x0083,0xDD9E,0xDD9D,0x0083,0xDD9C,0xDD9B,0x0085,0x0083,0xDD9A,0xDD99,0x0083,0xDD98,0xDD97,0x017F,0x00FF,0x00BF, 0x009F,0x008F,0x0087,0x0083,0xDD96,0x0083,0xDD95,0xDD94,0x0085,0x0083,0xDD93,0xDD92,0x0083,0xDD91,0xDD90,0x0089, 0x0085,0x0083,0xDD8F,0xDD8E,0x0083,0xDD8D,0xDD8C,0x0085,0x0083,0xDD8B,0xDD8A,0x0083,0xDD89,0xDD88,0x0091,0x0089, 0x0085,0x0083,0xDD87,0xDD86,0x0083,0xDD85,0xDD84,0x0085,0x0083,0xDD83,0xDD82,0x0083,0xDD81,0xDD80,0x0089,0x0085, 0x0083,0xDD7E,0xDD7D,0x0083,0xDD7C,0xDD7B,0x0085,0x0083,0xDD7A,0xDD79,0x0083,0xDD78,0xDD77,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xDD76,0xDD75,0x0083,0xDD74,0xDD73,0x0085,0x0083,0xDD72,0xDD71,0x0083,0xDD70,0xDD6F,0x0089,0x0085, 0x0083,0xDD6E,0xDD6D,0x0083,0xDD6C,0xDD6B,0x0085,0x0083,0xDD6A,0xDD69,0x0083,0xDD68,0xDD67,0x0091,0x0089,0x0085, 0x0083,0xDD66,0xDD65,0x0083,0xDD64,0xDD63,0x0085,0x0083,0xDD62,0xDD61,0x0083,0xDD60,0xDD5F,0x0089,0x0085,0x0083, 0xDD5E,0xDD5D,0x0083,0xDD5C,0xDD5B,0x0085,0x0083,0xDD5A,0xDD59,0x0083,0xDD58,0xDD57,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xDD56,0xDD55,0x0083,0xDD54,0xDD53,0x0085,0x0083,0xDD52,0xDD51,0x0083,0xDD50,0xDD4F,0x0089,0x0085, 0x0083,0xDD4E,0xDD4D,0x0083,0xDD4C,0xDD4B,0x0085,0x0083,0xDD4A,0xDD49,0x0083,0xDD48,0xDD47,0x0091,0x0089,0x0085, 0x0083,0xDD46,0xDD45,0x0083,0xDD44,0xDD43,0x0085,0x0083,0xDD42,0xDD41,0x0083,0xDD40,0xDCA0,0x0089,0x0085,0x0083, 0xDC9F,0xDC9E,0x0083,0xDC9D,0xDC9C,0x0085,0x0083,0xDC9B,0xDC9A,0x0083,0xDC99,0xDC98,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xDC97,0xDC96,0x0083,0xDC95,0xDC94,0x0085,0x0083,0xDC93,0xDC92,0x0083,0xDC91,0xDC90,0x0089,0x0085,0x0083, 0xDC8F,0xDC8E,0x0083,0xDC8D,0xDC8C,0x0085,0x0083,0xDC8B,0xEAA6,0x0083,0xDC8A,0xDC89,0x0091,0x0089,0x0085,0x0083, 0xDC88,0xDC87,0x0083,0xDC86,0xDC85,0x0085,0x0083,0xDC84,0xDC83,0x0083,0xDC82,0xDC81,0x0089,0x0085,0x0083,0xDC80, 0xDC7E,0x0083,0xDC7D,0xDC7C,0x0085,0x0083,0xDC7B,0xDC7A,0x0083,0xDC79,0xDC78,0x0101,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xDC77,0xCCC9,0x0083,0xDC76,0xDC75,0x0085,0x0083,0xDC74,0xDC73,0x0083,0xDC72,0xDC71,0x0089,0x0085, 0x0083,0xDC70,0xB6E3,0x0083,0xDC6F,0xDC6E,0x0085,0x0083,0xC7FB,0xDC6D,0x0083,0xDC6C,0xB9AA,0x0091,0x0089,0x0085, 0x0083,0xC9ED,0xDC6B,0x0083,0xDC6A,0xDC69,0x0085,0x0083,0xDC68,0xDC67,0x0083,0xDC66,0xDC65,0x0089,0x0085,0x0083, 0xDC64,0xDC63,0x0083,0xDC62,0xDC61,0x0085,0x0083,0xDC60,0xF5F3,0x0083,0xDC5F,0xF5F2,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xDC5E,0xDC5D,0x0083,0xDC5C,0xDC5B,0x0085,0x0083,0xDC5A,0xDC59,0x0083,0xDC58,0xF5F0,0x0089,0x0085,0x0083, 0xDC57,0xDC56,0x0083,0xDC55,0xF5F1,0x0085,0x0083,0xF5EF,0xDC54,0x0083,0xDC53,0xDC52,0x0091,0x0089,0x0085,0x0083, 0xDC51,0xDC50,0x0083,0xDC4F,0xDC4E,0x0085,0x0083,0xB3F9,0xDC4D,0x0083,0xF5EE,0xDC4C,0x0089,0x0085,0x0083,0xDC4B, 0xDC4A,0x0083,0xD4EA,0xDC49,0x0085,0x0083,0xB4DA,0xDC48,0x0083,0xDC47,0xF5EB,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xDC46,0xDC45,0x0083,0xDC44,0xDC43,0x0085,0x0083,0xDC42,0xF5EA,0x0083,0xDC41,0xF5ED,0x0089,0x0085,0x0083, 0xDC40,0xB6D7,0x0083,0xDBA0,0xF5E9,0x0085,0x0083,0xF5EC,0xDB9F,0x0083,0xB2E4,0xB5C5,0x0091,0x0089,0x0085,0x0083, 0xDB9E,0xDB9D,0x0083,0xF5BF,0xDB9C,0x0085,0x0083,0xDB9B,0xB1C4,0x0083,0xDB9A,0xDB99,0x0089,0x0085,0x0083,0xDB98, 0xDB97,0x0083,0xDB96,0xDB95,0x0085,0x0083,0xDB94,0xDB93,0x0083,0xDB92,0xDB91,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xDB90,0xDB8F,0x0083,0xF5BE,0xDB8E,0x0085,0x0083,0xDB8D,0xDB8C,0x0083,0xDB8B,0xDB8A,0x0089,0x0085,0x0083,0xDB89, 0xF5E7,0x0083,0xF5E6,0xDB88,0x0085,0x0083,0xDB87,0xDB86,0x0083,0xDB85,0xDB84,0x0091,0x0089,0x0085,0x0083,0xCCA3, 0xF5E8,0x0083,0xF5E3,0xB5B8,0x0085,0x0083,0xE5BF,0xDB83,0x0083,0xDB82,0xCCE3,0x0089,0x0085,0x0083,0xDB81,0xF5E5, 0x0083,0xF5E4,0xF5DE,0x0085,0x0083,0xDB80,0xDB7E,0x0083,0xF5E1,0xDB7D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F, 0x0087,0x0083,0xDB7C,0x0083,0xF5DD,0xF5DF,0x0085,0x0083,0xDB7B,0xDB7A,0x0083,0xDB79,0xF5E0,0x0089,0x0085,0x0083, 0xDB78,0xDB77,0x0083,0xDB76,0xF5E2,0x0085,0x0083,0xDB75,0xF5DC,0x0083,0xF5DA,0xDB74,0x0091,0x0089,0x0085,0x0083, 0xF5D9,0xDB73,0x0083,0xD7D9,0xB2C8,0x0085,0x0083,0xDB72,0xDB71,0x0083,0xDB70,0xDB6F,0x0089,0x0085,0x0083,0xDB6E, 0xF5DB,0x0083,0xCCDF,0xDB6D,0x0085,0x0083,0xDB6C,0xF5D8,0x0083,0xBEE1,0xF5D7,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xDB6B,0xDB6A,0x0083,0xDB69,0xDB68,0x0085,0x0083,0xDB67,0xDB66,0x0083,0xDB65,0xDB64,0x0089,0x0085,0x0083,0xF5D6, 0xDB63,0x0083,0xDB62,0xDB61,0x0085,0x0083,0xDB60,0xCCA4,0x0083,0xDB5F,0xDB5E,0x0091,0x0089,0x0085,0x0083,0xB3EC, 0xDB5D,0x0083,0xD3BB,0xF5D4,0x0085,0x0083,0xDB5C,0xDB5B,0x0083,0xDB5A,0xF5BD,0x0089,0x0085,0x0083,0xDB59,0xDB58, 0x0083,0xDB57,0xDB56,0x0085,0x0083,0xDB55,0xDB54,0x0083,0xDB53,0xF5D5,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xDB52,0xF5D2,0x0083,0xB6E5,0xF5D1,0x0085,0x0083,0xF5CF,0xF5CE,0x0083,0xDB51,0xBCF9,0x0089,0x0085,0x0083,0xDB50, 0xCCF8,0x0083,0xDB4F,0xDB4E,0x0085,0x0083,0xDB4D,0xC2B7,0x0083,0xDB4C,0xDB4B,0x0091,0x0089,0x0085,0x0083,0xF5CD, 0xF5BC,0x0083,0xB9F2,0xDB4A,0x0085,0x0083,0xBFE7,0xDB49,0x0083,0xDB48,0xDB47,0x0089,0x0085,0x0083,0xF5D3,0xF5D0, 0x0083,0xDB46,0xDB45,0x0085,0x0083,0xDB44,0xB8FA,0x0083,0xF5C8,0xBEE0,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDB43, 0xF5CB,0x0083,0xF5C7,0xDB42,0x0085,0x0083,0xDB41,0xF5C6,0x0083,0xF5C5,0xDB40,0x0089,0x0085,0x0083,0xDAA0,0xDA9F, 0x0083,0xDA9E,0xC5DC,0x0085,0x0083,0xDA9D,0xF5CA,0x0083,0xF5C9,0xDA9C,0x0091,0x0089,0x0085,0x0083,0xB5F8,0xB0CF, 0x0083,0xDA9B,0xDA9A,0x0085,0x0083,0xDA99,0xDA98,0x0083,0xF5CC,0xDA97,0x0089,0x0085,0x0083,0xF5C4,0xD4BE,0x0083, 0xDA96,0xDA95,0x0085,0x0083,0xDA94,0xF5C1,0x0083,0xD6BA,0xDA93,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xF5C2,0xDA92,0x0083,0xF5C3,0xDA91,0x0085,0x0083,0xF5BB,0xDA90,0x0083,0xDA8F,0xF5C0,0x0089,0x0085,0x0083,0xC5BF, 0xD7E3,0x0083,0xDA8E,0xF4F5,0x0085,0x0083,0xDA8D,0xDA8C,0x0083,0xDA8B,0xDA8A,0x0091,0x0089,0x0085,0x0083,0xDA89, 0xDA88,0x0083,0xDA87,0xDA86,0x0085,0x0083,0xDA85,0xDA84,0x0083,0xDA83,0xDA82,0x0089,0x0085,0x0083,0xDA81,0xC8A4, 0x0083,0xDA80,0xDA7E,0x0085,0x0083,0xDA7D,0xCCCB,0x0083,0xDA7C,0xDA7B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDA7A, 0xDA79,0x0083,0xDA78,0xDA77,0x0085,0x0083,0xDA76,0xDA75,0x0083,0xDA74,0xDA73,0x0089,0x0085,0x0083,0xF4F3,0xDA72, 0x0083,0xDA71,0xF4F4,0x0085,0x0083,0xDA70,0xDA6F,0x0083,0xDA6E,0xDA6D,0x0091,0x0089,0x0085,0x0083,0xDA6C,0xC7F7, 0x0083,0xD4BD,0xDA6B,0x0085,0x0083,0xDA6A,0xDA69,0x0083,0xDA68,0xB3AC,0x0089,0x0085,0x0083,0xF4F2,0xDA67,0x0083, 0xDA66,0xB3C3,0x0085,0x0083,0xDA65,0xDA64,0x0083,0xDA63,0xDA62,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDA61, 0xDA60,0x0083,0xDA5F,0xDA5E,0x0085,0x0083,0xDA5D,0xC6F0,0x0083,0xB8CF,0xD5D4,0x0089,0x0085,0x0083,0xB8B0,0xF4F1, 0x0083,0xDA5C,0xDA5B,0x0085,0x0083,0xD7DF,0xDA5A,0x0083,0xDA59,0xF4F7,0x0091,0x0089,0x0085,0x0083,0xDA58,0xBAD5, 0x0083,0xDA57,0xDA56,0x0085,0x0083,0xDA55,0xF4F6,0x0083,0xC9E2,0xDA54,0x0089,0x0085,0x0083,0xB3E0,0xB8D3,0x0083, 0xD3AE,0xC9C4,0x0085,0x0083,0xD4F9,0xDA53,0x0083,0xD4DE,0xD8CD,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD8D3,0xC8FC, 0x0083,0xD7AC,0xEAE7,0x0085,0x0083,0xD7B8,0xDA52,0x0083,0xC0B5,0xEAE6,0x0089,0x0085,0x0083,0xC5E2,0xE2D9,0x0083, 0xDA51,0xDA50,0x0085,0x0083,0xB4CD,0xC9CD,0x0083,0xCAEA,0xEAE5,0x0091,0x0089,0x0085,0x0083,0xB6C4,0xB8B3,0x0083, 0xC9DE,0xEAE3,0x0085,0x0083,0xEAE2,0xEAE4,0x0083,0xEAE1,0xEAE0,0x0089,0x0085,0x0083,0xD7CA,0xD4DF,0x0083,0xC2B8, 0xC1DE,0x0085,0x0083,0xEADF,0xBBDF,0x0083,0xBCD6,0xEADE,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xD4F4,0xEADD,0x0083,0xBAD8,0xB7D1,0x0085,0x0083,0xC3B3,0xB4FB,0x0083,0xEADC,0xB9F3,0x0089,0x0085,0x0083,0xCCF9, 0xEADB,0x0083,0xEADA,0xBCFA,0x0085,0x0083,0xB7A1,0xB9E1,0x0083,0xD6FC,0xB9BA,0x0091,0x0089,0x0085,0x0083,0xB1E1, 0xC6B6,0x0083,0xCCB0,0xB7B7,0x0085,0x0083,0xD6CA,0xBBF5,0x0083,0xD5CB,0xB0DC,0x0089,0x0085,0x0083,0xCFCD,0xD4F0, 0x0083,0xB2C6,0xB9B1,0x0085,0x0083,0xDA4F,0xB8BA,0x0083,0xD5EA,0xB1B4,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDA4E, 0xDA4D,0x0083,0xDA4C,0xDA4B,0x0085,0x0083,0xDA4A,0xDA49,0x0083,0xDA48,0xDA47,0x0089,0x0085,0x0083,0xDA46,0xDA45, 0x0083,0xDA44,0xDA43,0x0085,0x0083,0xDA42,0xDA41,0x0083,0xDA40,0xD9A0,0x0091,0x0089,0x0085,0x0083,0xD99F,0xD99E, 0x0083,0xD99D,0xD99C,0x0085,0x0083,0xD99B,0xD99A,0x0083,0xD999,0xD998,0x0089,0x0085,0x0083,0xD997,0xD996,0x0083, 0xD995,0xD994,0x0085,0x0083,0xD993,0xD992,0x0083,0xD991,0xD990,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD98F, 0xD98E,0x0083,0xD98D,0xD98C,0x0085,0x0083,0xD98B,0xD98A,0x0083,0xD989,0xD988,0x0089,0x0085,0x0083,0xD987,0xD986, 0x0083,0xD985,0xD984,0x0085,0x0083,0xD983,0xD982,0x0083,0xD981,0xD980,0x0091,0x0089,0x0085,0x0083,0xD97E,0xD97D, 0x0083,0xD97C,0xD97B,0x0085,0x0083,0xD97A,0xD979,0x0083,0xD978,0xD977,0x0089,0x0085,0x0083,0xD976,0xD975,0x0083, 0xD974,0xD973,0x0085,0x0083,0xD972,0xD971,0x0083,0xD970,0xD96F,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD96E,0xD96D, 0x0083,0xD96C,0xD96B,0x0085,0x0083,0xD96A,0xD969,0x0083,0xD968,0xD967,0x0089,0x0085,0x0083,0xD966,0xD965,0x0083, 0xD964,0xD963,0x0085,0x0083,0xD962,0xD961,0x0083,0xD960,0xD95F,0x0091,0x0089,0x0085,0x0083,0xD95E,0xD95D,0x0083, 0xD95C,0xD95B,0x0085,0x0083,0xD95A,0xD959,0x0083,0xD958,0xD957,0x0089,0x0085,0x0083,0xD956,0xD955,0x0083,0xD954, 0xD953,0x0085,0x0083,0xD952,0xD951,0x0083,0xD950,0xD94F,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD94E, 0xD94D,0x0083,0xD94C,0xD94B,0x0085,0x0083,0xD94A,0xD949,0x0083,0xD948,0xD947,0x0089,0x0085,0x0083,0xD946,0xD945, 0x0083,0xD944,0xD943,0x0085,0x0083,0xD942,0xD941,0x0083,0xD940,0xD8A0,0x0091,0x0089,0x0085,0x0083,0xD89F,0xD89E, 0x0083,0xD89D,0xD89C,0x0085,0x0083,0xD89B,0xD89A,0x0083,0xD899,0xD898,0x0089,0x0085,0x0083,0xD897,0xD896,0x0083, 0xD895,0xD894,0x0085,0x0083,0xD893,0xD892,0x0083,0xD891,0xD890,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD88F,0xD88E, 0x0083,0xD88D,0xD88C,0x0085,0x0083,0xF5F8,0xD88B,0x0083,0xD88A,0xD889,0x0089,0x0085,0x0083,0xF5F9,0xD888,0x0083, 0xD887,0xD886,0x0085,0x0083,0xD885,0xD884,0x0083,0xD883,0xD882,0x0091,0x0089,0x0085,0x0083,0xC3B2,0xD881,0x0083, 0xF5F6,0xBAD1,0x0085,0x0083,0xD880,0xD87E,0x0083,0xD87D,0xF5F7,0x0089,0x0085,0x0083,0xD87C,0xD87B,0x0083,0xF5F5, 0xD87A,0x0085,0x0083,0xD879,0xD878,0x0083,0xD877,0xD876,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD875,0xD874, 0x0083,0xB2F2,0xB1AA,0x0085,0x0083,0xF5F4,0xD873,0x0083,0xD872,0xD871,0x0089,0x0085,0x0083,0xD870,0xE1D9,0x0083, 0xD86F,0xD86E,0x0085,0x0083,0xD86D,0xD86C,0x0083,0xD86B,0xD86A,0x0091,0x0089,0x0085,0x0083,0xD869,0xD4A5,0x0083, 0xBAC0,0xD868,0x0085,0x0083,0xD867,0xD866,0x0083,0xD865,0xD864,0x0089,0x0085,0x0083,0xD863,0xD862,0x0083,0xBBBF, 0xCFF3,0x0085,0x0083,0xD861,0xD860,0x0083,0xD85F,0xD85E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD85D,0xD85C,0x0083, 0xEBE0,0xD85B,0x0085,0x0083,0xD85A,0xD859,0x0083,0xD858,0xF5B9,0x0089,0x0085,0x0083,0xD857,0xD856,0x0083,0xD855, 0xD854,0x0085,0x0083,0xD853,0xD852,0x0083,0xD851,0xD850,0x0091,0x0089,0x0085,0x0083,0xCDE3,0xD84F,0x0083,0xD84E, 0xF4F9,0x0085,0x0083,0xD84D,0xF4F8,0x0083,0xB6B9,0xD84C,0x0089,0x0085,0x0083,0xD84B,0xD84A,0x0083,0xD849,0xBBED, 0x0085,0x0083,0xD848,0xD847,0x0083,0xD846,0xD845,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083, 0xD844,0x0083,0xD843,0xD842,0x0085,0x0083,0xD841,0xD840,0x0083,0xB9C8,0xDADF,0x0089,0x0085,0x0083,0xDADE,0xC7B4, 0x0083,0xDADD,0xDADC,0x0085,0x0083,0xC6D7,0xC0BE,0x0083,0xDADB,0xDADA,0x0091,0x0089,0x0085,0x0083,0xCCB7,0xC3FD, 0x0083,0xDAD9,0xDAD8,0x0085,0x0083,0xC3A1,0xBDF7,0x0083,0xDAD7,0xC7AB,0x0089,0x0085,0x0083,0xDAD6,0xB0F9,0x0083, 0xD2A5,0xD0BB,0x0085,0x0083,0xDAD5,0xDAD4,0x0083,0xDAD3,0xD7A0,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDAD2,0xC3D5, 0x0083,0xDAD0,0xD1E8,0x0085,0x0083,0xDACF,0xDAD1,0x0083,0xB2F7,0xDACE,0x0089,0x0085,0x0083,0xDACD,0xDACC,0x0083, 0xCEBD,0xDACB,0x0085,0x0083,0xDACA,0xD0B3,0x0083,0xDAC9,0xBBD1,0x0091,0x0089,0x0085,0x0083,0xB5FD,0xDAC8,0x0083, 0xC4B1,0xD2EA,0x0085,0x0083,0xD79F,0xCCB8,0x0083,0xDAC7,0xD7BB,0x0089,0x0085,0x0083,0xC1C2,0xDAC6,0x0083,0xB5F7, 0xDAC5,0x0085,0x0083,0xCBAD,0xDAC4,0x0083,0xDAC3,0xBFCE,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB7CC,0xDAC2, 0x0083,0xB6C1,0xC5B5,0x0085,0x0083,0xDAC1,0xD6EE,0x0083,0xC7EB,0xDAC0,0x0089,0x0085,0x0083,0xCBD0,0xCBB5,0x0083, 0xDABF,0xBBE5,0x0085,0x0083,0xD3D5,0xDABE,0x0083,0xCEF3,0xDABD,0x0091,0x0089,0x0085,0x0083,0xD3EF,0xCEDC,0x0083, 0xBDEB,0xD79E,0x0085,0x0083,0xDABC,0xDABB,0x0083,0xB2EF,0xCFEA,0x0089,0x0085,0x0083,0xB8C3,0xDABA,0x0083,0xD2E8, 0xD1AF,0x0085,0x0083,0xB9EE,0xDAB9,0x0083,0xDAB8,0xB5AE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBBB0,0xDAB7,0x0083, 0xD6EF,0xB3CF,0x0085,0x0083,0xDAB6,0xDAB5,0x0083,0xCAAB,0xDAB4,0x0089,0x0085,0x0083,0xCAD4,0xDAB3,0x0083,0xDAB2, 0xDAB1,0x0085,0x0083,0xD2EB,0xD79D,0x0083,0xDAAF,0xDAB0,0x0091,0x0089,0x0085,0x0083,0xB4CA,0xD6DF,0x0083,0xDAAE, 0xD5EF,0x0085,0x0083,0xCBDF,0xD5A9,0x0083,0xD79C,0xCAB6,0x0089,0x0085,0x0083,0xD7E7,0xC6C0,0x0083,0xDAAD,0xDAAC, 0x0085,0x0083,0xD6A4,0xBEF7,0x0083,0xB7C3,0xC9E8,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB7ED,0xCBCF, 0x0083,0xD79B,0xC2DB,0x0085,0x0083,0xB6EF,0xD0ED,0x0083,0xDAAB,0xD1C8,0x0089,0x0085,0x0083,0xDAAA,0xDAA9,0x0083, 0xBBE4,0xBDB2,0x0085,0x0083,0xD79A,0xBCC7,0x0083,0xD1B6,0xD2E9,0x0091,0x0089,0x0085,0x0083,0xD1B5,0xD799,0x0083, 0xC6FD,0xDAA8,0x0085,0x0083,0xC8C3,0xCCD6,0x0083,0xDAA7,0xDAA6,0x0089,0x0085,0x0083,0xBCA5,0xC8CF,0x0083,0xB8BC, 0xB6A9,0x0085,0x0083,0xBCC6,0xDAA5,0x0083,0xD798,0xD797,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD796,0xD795,0x0083, 0xD794,0xD793,0x0085,0x0083,0xD792,0xD791,0x0083,0xD790,0xD78F,0x0089,0x0085,0x0083,0xD78E,0xD78D,0x0083,0xD78C, 0xD78B,0x0085,0x0083,0xD78A,0xD789,0x0083,0xD788,0xD787,0x0091,0x0089,0x0085,0x0083,0xD786,0xD785,0x0083,0xD784, 0xD783,0x0085,0x0083,0xD782,0xD781,0x0083,0xD780,0xD77E,0x0089,0x0085,0x0083,0xD77D,0xD77C,0x0083,0xD77B,0xD77A, 0x0085,0x0083,0xD779,0xD778,0x0083,0xD777,0xD776,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD775,0xD774,0x0083, 0xD773,0xD772,0x0085,0x0083,0xD771,0xD770,0x0083,0xD76F,0xD76E,0x0089,0x0085,0x0083,0xD76D,0xD76C,0x0083,0xD76B, 0xD76A,0x0085,0x0083,0xD769,0xD768,0x0083,0xD767,0xD766,0x0091,0x0089,0x0085,0x0083,0xD765,0xC6A9,0x0083,0xD764, 0xD763,0x0085,0x0083,0xD762,0xD761,0x0083,0xD760,0xBEAF,0x0089,0x0085,0x0083,0xD75F,0xD75E,0x0083,0xD75D,0xD75C, 0x0085,0x0083,0xD75B,0xD75A,0x0083,0xD759,0xD758,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD757,0xD756,0x0083,0xD755, 0xD754,0x0085,0x0083,0xD753,0xD752,0x0083,0xD751,0xD750,0x0089,0x0085,0x0083,0xD74F,0xD74E,0x0083,0xD74D,0xD74C, 0x0085,0x0083,0xD74B,0xD74A,0x0083,0xD749,0xD748,0x0091,0x0089,0x0085,0x0083,0xD747,0xD746,0x0083,0xD745,0xD744, 0x0085,0x0083,0xD743,0xD742,0x0083,0xD741,0xD740,0x0089,0x0085,0x0083,0xD6A0,0xD69F,0x0083,0xD69E,0xD69D,0x0085, 0x0083,0xD69C,0xD69B,0x0083,0xD69A,0xD699,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xD698,0x0083,0xD697, 0xD696,0x0085,0x0083,0xD695,0xD694,0x0083,0xD693,0xD692,0x0089,0x0085,0x0083,0xD691,0xD690,0x0083,0xD68F,0xD68E, 0x0085,0x0083,0xD68D,0xD68C,0x0083,0xD68B,0xD68A,0x0091,0x0089,0x0085,0x0083,0xD689,0xD688,0x0083,0xD687,0xD686, 0x0085,0x0083,0xD685,0xD684,0x0083,0xD683,0xD682,0x0089,0x0085,0x0083,0xF6A5,0xD681,0x0083,0xD680,0xD67E,0x0085, 0x0083,0xD67D,0xD67C,0x0083,0xD67B,0xD67A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD679,0xD678,0x0083,0xD677,0xD676, 0x0085,0x0083,0xD675,0xD674,0x0083,0xD673,0xD672,0x0089,0x0085,0x0083,0xD671,0xD670,0x0083,0xD66F,0xD66E,0x0085, 0x0083,0xD66D,0xD66C,0x0083,0xD66B,0xD66A,0x0091,0x0089,0x0085,0x0083,0xD669,0xD668,0x0083,0xD667,0xD666,0x0085, 0x0083,0xD665,0xD664,0x0083,0xD663,0xE5C0,0x0089,0x0085,0x0083,0xD662,0xD661,0x0083,0xD660,0xD65F,0x0085,0x0083, 0xD65E,0xD65D,0x0083,0xD65C,0xD65B,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD65A,0xD659,0x0083,0xD658,0xD657, 0x0085,0x0083,0xD656,0xD655,0x0083,0xD654,0xD653,0x0089,0x0085,0x0083,0xD652,0xD651,0x0083,0xD650,0xD64F,0x0085, 0x0083,0xD64E,0xD64D,0x0083,0xD64C,0xD64B,0x0091,0x0089,0x0085,0x0083,0xD64A,0xD649,0x0083,0xD648,0xD647,0x0085, 0x0083,0xD646,0xD645,0x0083,0xD644,0xD643,0x0089,0x0085,0x0083,0xD642,0xD641,0x0083,0xD640,0xD5A0,0x0085,0x0083, 0xD59F,0xD59E,0x0083,0xD59D,0xD59C,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD59B,0xD59A,0x0083,0xD599,0xD598,0x0085, 0x0083,0xD597,0xD596,0x0083,0xD595,0xD594,0x0089,0x0085,0x0083,0xD593,0xD592,0x0083,0xD591,0xD590,0x0085,0x0083, 0xD58F,0xD58E,0x0083,0xD58D,0xD58C,0x0091,0x0089,0x0085,0x0083,0xD58B,0xD58A,0x0083,0xD589,0xD588,0x0085,0x0083, 0xD587,0xD586,0x0083,0xD585,0xD584,0x0089,0x0085,0x0083,0xD583,0xD582,0x0083,0xD581,0xD580,0x0085,0x0083,0xD57E, 0xD57D,0x0083,0xD57C,0xD57B,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD57A,0xD579,0x0083,0xD578,0xD577, 0x0085,0x0083,0xD576,0xD575,0x0083,0xD574,0xD573,0x0089,0x0085,0x0083,0xD572,0xD571,0x0083,0xD570,0xD56F,0x0085, 0x0083,0xD56E,0xD56D,0x0083,0xD56C,0xD56B,0x0091,0x0089,0x0085,0x0083,0xD56A,0xD569,0x0083,0xD568,0xD567,0x0085, 0x0083,0xD566,0xD565,0x0083,0xD564,0xD563,0x0089,0x0085,0x0083,0xD562,0xD561,0x0083,0xD560,0xD55F,0x0085,0x0083, 0xD55E,0xD55D,0x0083,0xD55C,0xD55B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD55A,0xD559,0x0083,0xD558,0xD557,0x0085, 0x0083,0xD556,0xD555,0x0083,0xD554,0xD553,0x0089,0x0085,0x0083,0xD552,0xD551,0x0083,0xD550,0xCAC4,0x0085,0x0083, 0xD54F,0xD54E,0x0083,0xD54D,0xD54C,0x0091,0x0089,0x0085,0x0083,0xD54B,0xD54A,0x0083,0xD549,0xD548,0x0085,0x0083, 0xCCDC,0xD3FE,0x0083,0xD547,0xD546,0x0089,0x0085,0x0083,0xD545,0xD544,0x0083,0xD543,0xD542,0x0085,0x0083,0xD541, 0xD540,0x0083,0xD4A0,0xD49F,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD49E,0xD49D,0x0083,0xD49C,0xD49B,0x0085, 0x0083,0xD49A,0xD5B2,0x0083,0xD499,0xD498,0x0089,0x0085,0x0083,0xD497,0xD496,0x0083,0xD495,0xD494,0x0085,0x0083, 0xD493,0xD492,0x0083,0xD491,0xD490,0x0091,0x0089,0x0085,0x0083,0xD48F,0xD48E,0x0083,0xD48D,0xD48C,0x0085,0x0083, 0xD48B,0xD48A,0x0083,0xD489,0xD488,0x0089,0x0085,0x0083,0xD487,0xD486,0x0083,0xD485,0xD484,0x0085,0x0083,0xD483, 0xD482,0x0083,0xD481,0xD480,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD47E,0xD47D,0x0083,0xD47C,0xD47B,0x0085,0x0083, 0xD47A,0xD479,0x0083,0xD478,0xD477,0x0089,0x0085,0x0083,0xD476,0xD475,0x0083,0xD474,0xD473,0x0085,0x0083,0xD472, 0xD471,0x0083,0xD470,0xD46F,0x0091,0x0089,0x0085,0x0083,0xD46E,0xD46D,0x0083,0xD46C,0xD46B,0x0085,0x0083,0xD46A, 0xD469,0x0083,0xEEBA,0xD468,0x0089,0x0085,0x0083,0xD467,0xD466,0x0083,0xD465,0xD464,0x0085,0x0083,0xD463,0xD462, 0x0083,0xD461,0xD460,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xF6A4,0x0083,0xD45F,0xD45E,0x0085, 0x0083,0xD45D,0xD45C,0x0083,0xD45B,0xD45A,0x0089,0x0085,0x0083,0xD459,0xD458,0x0083,0xD457,0xD456,0x0085,0x0083, 0xD455,0xD454,0x0083,0xD453,0xD452,0x0091,0x0089,0x0085,0x0083,0xD451,0xD450,0x0083,0xD44F,0xD44E,0x0085,0x0083, 0xD44D,0xD44C,0x0083,0xD44B,0xD44A,0x0089,0x0085,0x0083,0xD449,0xD448,0x0083,0xD447,0xD446,0x0085,0x0083,0xD445, 0xD444,0x0083,0xD443,0xD442,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD441,0xD440,0x0083,0xD3A0,0xD39F,0x0085,0x0083, 0xD39E,0xD39D,0x0083,0xD39C,0xD39B,0x0089,0x0085,0x0083,0xD39A,0xD399,0x0083,0xD398,0xD397,0x0085,0x0083,0xD396, 0xD395,0x0083,0xD394,0xD393,0x0091,0x0089,0x0085,0x0083,0xD392,0xD391,0x0083,0xD390,0xD38F,0x0085,0x0083,0xD38E, 0xD38D,0x0083,0xD38C,0xD38B,0x0089,0x0085,0x0083,0xD9EA,0xD38A,0x0083,0xD389,0xD388,0x0085,0x0083,0xD387,0xD386, 0x0083,0xD385,0xD1D4,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD384,0xD383,0x0083,0xD382,0xD381,0x0085,0x0083, 0xD380,0xD37E,0x0083,0xD37D,0xD37C,0x0089,0x0085,0x0083,0xD37B,0xD37A,0x0083,0xD379,0xD378,0x0085,0x0083,0xECB2, 0xD377,0x0083,0xD376,0xD375,0x0091,0x0089,0x0085,0x0083,0xF6A3,0xD374,0x0083,0xD373,0xD372,0x0085,0x0083,0xF6A2, 0xD371,0x0083,0xD370,0xD36F,0x0089,0x0085,0x0083,0xD36E,0xB4A5,0x0083,0xF6A1,0xD36D,0x0085,0x0083,0xBDE2,0xD36C, 0x0083,0xD36B,0xD36A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD369,0xF5FC,0x0083,0xD368,0xF5FE,0x0085,0x0083,0xD367, 0xF5FD,0x0083,0xD366,0xD365,0x0089,0x0085,0x0083,0xD364,0xF5FB,0x0083,0xD363,0xD362,0x0085,0x0083,0xD361,0xBDC7, 0x0083,0xEAEF,0xEAEE,0x0091,0x0089,0x0085,0x0083,0xEAED,0xEAEC,0x0083,0xD360,0xEAEB,0x0085,0x0083,0xEAEA,0xEAE9, 0x0083,0xBEF5,0xC0C0,0x0089,0x0085,0x0083,0xEAE8,0xCAD3,0x0083,0xC3D9,0xB9E6,0x0085,0x0083,0xD35F,0xB9DB,0x0083, 0xBCFB,0xD35E,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD35D,0xD35C,0x0083,0xD35B,0xD35A,0x0085,0x0083, 0xD359,0xD358,0x0083,0xD357,0xD356,0x0089,0x0085,0x0083,0xD355,0xD354,0x0083,0xD353,0xD352,0x0085,0x0083,0xD351, 0xD350,0x0083,0xD34F,0xD34E,0x0091,0x0089,0x0085,0x0083,0xD34D,0xD34C,0x0083,0xD34B,0xD34A,0x0085,0x0083,0xD349, 0xD348,0x0083,0xD347,0xD346,0x0089,0x0085,0x0083,0xD345,0xD344,0x0083,0xD343,0xD342,0x0085,0x0083,0xD341,0xD340, 0x0083,0xD2A0,0xD29F,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD29E,0xD29D,0x0083,0xD29C,0xD29B,0x0085,0x0083,0xD29A, 0xD299,0x0083,0xD298,0xD297,0x0089,0x0085,0x0083,0xD296,0xD295,0x0083,0xD294,0xD293,0x0085,0x0083,0xD292,0xD291, 0x0083,0xD290,0xD28F,0x0091,0x0089,0x0085,0x0083,0xD28E,0xD28D,0x0083,0xD28C,0xD28B,0x0085,0x0083,0xD28A,0xD289, 0x0083,0xD288,0xD287,0x0089,0x0085,0x0083,0xD286,0xB8B2,0x0083,0xD285,0xD284,0x0085,0x0083,0xF1FB,0xD283,0x0083, 0xD2AA,0xD282,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCEF7,0xD281,0x0083,0xD280,0xD27E,0x0085,0x0083,0xF1E1, 0xD27D,0x0083,0xD27C,0xD27B,0x0089,0x0085,0x0083,0xD27A,0xD279,0x0083,0xD278,0xD277,0x0085,0x0083,0xD276,0xD275, 0x0083,0xD274,0xD273,0x0091,0x0089,0x0085,0x0083,0xD272,0xD271,0x0083,0xD270,0xD26F,0x0085,0x0083,0xD26E,0xD26D, 0x0083,0xD26C,0xD26B,0x0089,0x0085,0x0083,0xD26A,0xF1E0,0x0083,0xD269,0xD268,0x0085,0x0083,0xD267,0xD266,0x0083, 0xD265,0xD264,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBDF3,0xF4C5,0x0083,0xD263,0xD262,0x0085,0x0083,0xD261,0xD260, 0x0083,0xD25F,0xD25E,0x0089,0x0085,0x0083,0xD25D,0xD25C,0x0083,0xD25B,0xD25A,0x0085,0x0083,0xD259,0xD258,0x0083, 0xD257,0xD256,0x0091,0x0089,0x0085,0x0083,0xD255,0xD254,0x0083,0xD253,0xD252,0x0085,0x0083,0xD251,0xD250,0x0083, 0xD24F,0xD24E,0x0089,0x0085,0x0083,0xD24D,0xD24C,0x0083,0xD24B,0xCFE5,0x0085,0x0083,0xD24A,0xD249,0x0083,0xF1DF, 0xD248,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD247,0xD246,0x0083,0xD245,0xD244,0x0085,0x0083, 0xD243,0xD242,0x0083,0xD241,0xD240,0x0089,0x0085,0x0083,0xD1A0,0xF1DE,0x0083,0xD19F,0xF1DC,0x0085,0x0083,0xD19E, 0xD19D,0x0083,0xD19C,0xE5BD,0x0091,0x0089,0x0085,0x0083,0xD19B,0xD19A,0x0083,0xD199,0xD198,0x0085,0x0083,0xF1DD, 0xCDCA,0x0083,0xD197,0xD196,0x0089,0x0085,0x0083,0xD195,0xD194,0x0083,0xC8EC,0xD193,0x0085,0x0083,0xD192,0xD191, 0x0083,0xF1D7,0xD190,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD18F,0xD18E,0x0083,0xD18D,0xD18C,0x0085,0x0083,0xF1DA, 0xF1D2,0x0083,0xF1D8,0xD18B,0x0089,0x0085,0x0083,0xD18A,0xD189,0x0083,0xD188,0xD187,0x0085,0x0083,0xF1D9,0xB0FD, 0x0083,0xD186,0xBAD6,0x0091,0x0089,0x0085,0x0083,0xD185,0xD184,0x0083,0xD183,0xD182,0x0085,0x0083,0xD181,0xF1DB, 0x0083,0xD180,0xD17E,0x0089,0x0085,0x0083,0xD17D,0xD17C,0x0083,0xD17B,0xD17A,0x0085,0x0083,0xD179,0xB9D3,0x0083, 0xD178,0xD177,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD176,0xF1D5,0x0083,0xD175,0xF1D3,0x0085,0x0083,0xD174, 0xD173,0x0083,0xB9FC,0xC2E3,0x0089,0x0085,0x0083,0xD172,0xD171,0x0083,0xD170,0xC5E1,0x0085,0x0083,0xC9D1,0xD16F, 0x0083,0xF1D1,0xF1D6,0x0091,0x0089,0x0085,0x0083,0xD16E,0xD16D,0x0083,0xD16C,0xD16B,0x0085,0x0083,0xD16A,0xD169, 0x0083,0xD168,0xF1D4,0x0089,0x0085,0x0083,0xD167,0xD166,0x0083,0xF1D0,0xBFE3,0x0085,0x0083,0xF1CF,0xF1CD,0x0083, 0xD165,0xD164,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF4C4,0xD163,0x0083,0xD162,0xD161,0x0085,0x0083,0xD160,0xD15F, 0x0083,0xC8B9,0xF4C3,0x0089,0x0085,0x0083,0xD15E,0xD15D,0x0083,0xD4A3,0xD2E1,0x0085,0x0083,0xD15C,0xD9F6,0x0083, 0xD15B,0xD15A,0x0091,0x0089,0x0085,0x0083,0xD159,0xF1CE,0x0083,0xD158,0xD157,0x0085,0x0083,0xD156,0xD155,0x0083, 0xF1CC,0xD154,0x0089,0x0085,0x0083,0xD153,0xF1C9,0x0083,0xD7B0,0xD152,0x0085,0x0083,0xD151,0xC1D1,0x0083,0xB2C3, 0xD150,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD14F,0xD14E,0x0083,0xD14D,0xF1CB,0x0085,0x0083,0xD14C, 0xD14B,0x0083,0xD14A,0xD149,0x0089,0x0085,0x0083,0xF1CA,0xD148,0x0083,0xD147,0xD146,0x0085,0x0083,0xD145,0xD144, 0x0083,0xB8A4,0xD143,0x0091,0x0089,0x0085,0x0083,0xD142,0xD141,0x0083,0xCFAE,0xD140,0x0085,0x0083,0xB1BB,0xD0A0, 0x0083,0xD09F,0xD09E,0x0089,0x0085,0x0083,0xD09D,0xD09C,0x0083,0xD09B,0xD9F3,0x0085,0x0083,0xD09A,0xF1C8,0x0083, 0xD099,0xD098,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD097,0xD096,0x0083,0xD095,0xCDE0,0x0085,0x0083,0xD094,0xD093, 0x0083,0xD092,0xD091,0x0089,0x0085,0x0083,0xD090,0xD0E4,0x0083,0xD08F,0xD08E,0x0085,0x0083,0xD08D,0xCCBB,0x0083, 0xD08C,0xD08B,0x0091,0x0089,0x0085,0x0083,0xD08A,0xD089,0x0083,0xC5DB,0xD088,0x0085,0x0083,0xB4FC,0xD087,0x0083, 0xD086,0xF4C2,0x0089,0x0085,0x0083,0xD085,0xD084,0x0083,0xF4C1,0xB0C0,0x0085,0x0083,0xD083,0xF1C7,0x0083,0xD4AC, 0xD082,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF1C6,0xF4C0,0x0083,0xF1C5,0xD081,0x0085,0x0083,0xD080,0xD07E, 0x0083,0xD07D,0xD07C,0x0089,0x0085,0x0083,0xD6D4,0xD07B,0x0083,0xD07A,0xD079,0x0085,0x0083,0xD078,0xF1C4,0x0083, 0xD077,0xCBA5,0x0091,0x0089,0x0085,0x0083,0xD076,0xD9F2,0x0083,0xD075,0xB3C4,0x0085,0x0083,0xC9C0,0xD074,0x0083, 0xF1C3,0xB1ED,0x0089,0x0085,0x0083,0xD073,0xD072,0x0083,0xB2B9,0xF1C2,0x0085,0x0083,0xD2C2,0xE1E9,0x0083,0xBAE2, 0xD071,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD070,0xD06F,0x0083,0xD06E,0xD06D,0x0085,0x0083,0xD06C,0xD06B,0x0083, 0xD1C3,0xD06A,0x0089,0x0085,0x0083,0xBDD6,0xD069,0x0083,0xD068,0xCFCE,0x0085,0x0083,0xD067,0xD066,0x0083,0xD065, 0xD064,0x0091,0x0089,0x0085,0x0083,0xD063,0xD062,0x0083,0xD1DC,0xD0D0,0x0085,0x0083,0xD061,0xD060,0x0083,0xD05F, 0xD05E,0x0089,0x0085,0x0083,0xD05D,0xD05C,0x0083,0xD0C6,0xF4AC,0x0085,0x0083,0xD05B,0xD05A,0x0083,0xD059,0xD1AA, 0x087B,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xD058,0x0083,0xD057,0xD056,0x0085,0x0083, 0xF3BD,0xD055,0x0083,0xD054,0xF3BC,0x0089,0x0085,0x0083,0xD053,0xD052,0x0083,0xD051,0xD050,0x0085,0x0083,0xD04F, 0xD04E,0x0083,0xEEC3,0xD04D,0x0091,0x0089,0x0085,0x0083,0xD04C,0xD04B,0x0083,0xD04A,0xD049,0x0085,0x0083,0xD048, 0xD047,0x0083,0xD046,0xD045,0x0089,0x0085,0x0083,0xD044,0xD043,0x0083,0xD042,0xD041,0x0085,0x0083,0xD040,0xCFA0, 0x0083,0xB4C0,0xF3BB,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCF9F,0xCF9E,0x0083,0xCF9D,0xCF9C,0x0085,0x0083,0xCF9B, 0xF3BA,0x0083,0xCF9A,0xCF99,0x0089,0x0085,0x0083,0xCF98,0xCF97,0x0083,0xF3B6,0xC8E4,0x0085,0x0083,0xCF96,0xF3B7, 0x0083,0xCF95,0xCF94,0x0091,0x0089,0x0085,0x0083,0xCF93,0xCF92,0x0083,0xCF91,0xCF90,0x0085,0x0083,0xCF8F,0xCF8E, 0x0083,0xF3B9,0xCF8D,0x0089,0x0085,0x0083,0xCF8C,0xCF8B,0x0083,0xCF8A,0xCF89,0x0085,0x0083,0xCF88,0xD9F9,0x0083, 0xCF87,0xCF86,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCF85,0xCF84,0x0083,0xF3B8,0xCF83,0x0085,0x0083,0xCF82, 0xCF81,0x0083,0xCF80,0xD0B7,0x0089,0x0085,0x0083,0xCF7E,0xCF7D,0x0083,0xCF7C,0xCF7B,0x0085,0x0083,0xCF7A,0xCF79, 0x0083,0xCF78,0xCF77,0x0091,0x0089,0x0085,0x0083,0xCF76,0xCF75,0x0083,0xF3B5,0xCF74,0x0085,0x0083,0xCF73,0xCF72, 0x0083,0xF3B3,0xCF71,0x0089,0x0085,0x0083,0xCF70,0xCF6F,0x0083,0xCF6E,0xF3A8,0x0085,0x0083,0xCF6D,0xCF6C,0x0083, 0xCF6B,0xCF6A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF3B4,0xCF69,0x0083,0xCF68,0xCF67,0x0085,0x0083,0xCF66,0xF3B2, 0x0083,0xCF65,0xCF64,0x0089,0x0085,0x0083,0xCF63,0xCF62,0x0083,0xCF61,0xCF60,0x0085,0x0083,0xCF5F,0xF3AD,0x0083, 0xF2FE,0xF3AF,0x0091,0x0089,0x0085,0x0083,0xCF5E,0xCF5D,0x0083,0xCF5C,0xCF5B,0x0085,0x0083,0xCF5A,0xF3AC,0x0083, 0xF3B1,0xCF59,0x0089,0x0085,0x0083,0xCF58,0xCF57,0x0083,0xF3A1,0xCF56,0x0085,0x0083,0xCF55,0xCF54,0x0083,0xCF53, 0xCF52,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF3B0,0xCF51,0x0083,0xCF50,0xF3AE,0x0085,0x0083,0xCF4F, 0xCF4E,0x0083,0xC2DD,0xCF4D,0x0089,0x0085,0x0083,0xCF4C,0xCF4B,0x0083,0xCF4A,0xF3AA,0x0085,0x0083,0xCF49,0xF3AB, 0x0083,0xCF48,0xCF47,0x0091,0x0089,0x0085,0x0083,0xCF46,0xF2FC,0x0083,0xCF45,0xF3A4,0x0085,0x0083,0xF3A9,0xF3A7, 0x0083,0xCF44,0xCF43,0x0089,0x0085,0x0083,0xF2FD,0xCF42,0x0083,0xCF41,0xCF40,0x0085,0x0083,0xCEA0,0xCE9F,0x0083, 0xCE9E,0xCE9D,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCE9C,0xC3F8,0x0083,0xCE9B,0xCE9A,0x0085,0x0083,0xCE99,0xCE98, 0x0083,0xCE97,0xCE96,0x0089,0x0085,0x0083,0xCE95,0xF3A5,0x0083,0xCE94,0xCE93,0x0085,0x0083,0xCE92,0xF2FB,0x0083, 0xCE91,0xCE90,0x0091,0x0089,0x0085,0x0083,0xCE8F,0xCE8E,0x0083,0xCE8D,0xC8DA,0x0085,0x0083,0xCE8C,0xF2F4,0x0083, 0xCE8B,0xCE8A,0x0089,0x0085,0x0083,0xF3A2,0xCE89,0x0083,0xCE88,0xF3A3,0x0085,0x0083,0xCE87,0xF3A6,0x0083,0xF2EB, 0xCE86,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCE85,0xCE84,0x0083,0xF2EE,0xF2ED,0x0085,0x0083,0xF2F7,0xF2EF, 0x0083,0xCE83,0xCE82,0x0089,0x0085,0x0083,0xCE81,0xCE80,0x0083,0xB5FB,0xCE7E,0x0085,0x0083,0xBAFB,0xCE7D,0x0083, 0xCE7C,0xCE7B,0x0091,0x0089,0x0085,0x0083,0xF2F1,0xCE7A,0x0083,0xF2F3,0xCE79,0x0085,0x0083,0xCE78,0xCE77,0x0083, 0xCE76,0xCE75,0x0089,0x0085,0x0083,0xCE74,0xCE73,0x0083,0xCE72,0xF2FA,0x0085,0x0083,0xF2F8,0xF2F6,0x0083,0xCE71, 0xCE70,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF2F0,0xCE6F,0x0083,0xCE6E,0xCE6D,0x0085,0x0083,0xCE6C,0xCE6B,0x0083, 0xCE6A,0xF2F9,0x0089,0x0085,0x0083,0xCE69,0xBBC8,0x0083,0xCE68,0xCE67,0x0085,0x0083,0xCE66,0xF2F5,0x0083,0xCE65, 0xCE64,0x0091,0x0089,0x0085,0x0083,0xCE63,0xCE62,0x0083,0xD0AB,0xCE61,0x0085,0x0083,0xF2F2,0xCE60,0x0083,0xCE5F, 0xB2F5,0x0089,0x0085,0x0083,0xF2E5,0xD3AC,0x0083,0xCE5E,0xCE5D,0x0085,0x0083,0xCE5C,0xCE5B,0x0083,0xCE5A,0xCE59, 0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xCE58,0x0083,0xF2EA,0xF2E4,0x0085,0x0083,0xCE57,0xCE56,0x0083, 0xF2DF,0xCE55,0x0089,0x0085,0x0083,0xCE54,0xCE53,0x0083,0xF2E9,0xCE52,0x0085,0x0083,0xCE51,0xF2E6,0x0083,0xCE50, 0xCE4F,0x0091,0x0089,0x0085,0x0083,0xF2E7,0xCE4E,0x0083,0xCE4D,0xF2E2,0x0085,0x0083,0xCE4C,0xCE4B,0x0083,0xCE4A, 0xCE49,0x0089,0x0085,0x0083,0xF2E8,0xCE48,0x0083,0xCE47,0xCE46,0x0085,0x0083,0xF2E1,0xCE45,0x0083,0xF2DE,0xF2EC, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xC0AF,0xCE44,0x0083,0xCE43,0xF2E0,0x0085,0x0083,0xCE42,0xC3DB,0x0083,0xCE41, 0xF2E3,0x0089,0x0085,0x0083,0xCE40,0xD6A9,0x0083,0xCECF,0xCDA0,0x0085,0x0083,0xCDC9,0xCD9F,0x0083,0xF2D1,0xD1D1, 0x0091,0x0089,0x0085,0x0083,0xCD9E,0xCD9D,0x0083,0xCD9C,0xCD9B,0x0085,0x0083,0xF2DC,0xCD9A,0x0083,0xCD99,0xF2DB, 0x0089,0x0085,0x0083,0xF2DD,0xF2DA,0x0083,0xF2D8,0xCD98,0x0085,0x0083,0xCD97,0xCD96,0x0083,0xF2D7,0xB7E4,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xCD95,0xCAF1,0x0083,0xCD94,0xB6EA,0x0085,0x0083,0xCD93,0xCD92,0x0083,0xCD91, 0xCD90,0x0089,0x0085,0x0083,0xD3BC,0xF2D9,0x0083,0xCD8F,0xCD8E,0x0085,0x0083,0xCD8D,0xF2D3,0x0083,0xF2CF,0xF2CD, 0x0091,0x0089,0x0085,0x0083,0xF2CC,0xD5DD,0x0083,0xCD8C,0xC2F9,0x0085,0x0083,0xF2CE,0xCD8B,0x0083,0xCD8A,0xCD89, 0x0089,0x0085,0x0083,0xF2CB,0xCD88,0x0083,0xCD87,0xCD86,0x0085,0x0083,0xCD85,0xB8F2,0x0083,0xCD84,0xCD83,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xCD82,0xCD81,0x0083,0xF2D4,0xF2D2,0x0085,0x0083,0xCD80,0xCD7E,0x0083,0xD6EB,0xCD7D, 0x0089,0x0085,0x0083,0xCDDC,0xF2D5,0x0083,0xCD7C,0xCD7B,0x0085,0x0083,0xCD7A,0xBBD7,0x0083,0xCD79,0xCD78,0x0091, 0x0089,0x0085,0x0083,0xF2D6,0xF2D0,0x0083,0xF2C9,0xF2C3,0x0085,0x0083,0xCD77,0xCD76,0x0083,0xB5B0,0xB9C6,0x0089, 0x0085,0x0083,0xF2C8,0xCD75,0x0083,0xC9DF,0xC7F9,0x0085,0x0083,0xCD74,0xF2C1,0x0083,0xCD73,0xCD72,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xCD71,0xD6FB,0x0083,0xCD70,0xCD6F,0x0085,0x0083,0xCD6E,0xCD6D,0x0083,0xCD6C, 0xF2C5,0x0089,0x0085,0x0083,0xCD6B,0xCD6A,0x0083,0xCD69,0xF2C0,0x0085,0x0083,0xF2C2,0xF2CA,0x0083,0xCD68,0xCD67, 0x0091,0x0089,0x0085,0x0083,0xF2C6,0xF2C4,0x0083,0xF2C7,0xCD66,0x0085,0x0083,0xCD65,0xF2B9,0x0083,0xCD64,0xF2BD, 0x0089,0x0085,0x0083,0xF2BF,0xF2B6,0x0083,0xF2BB,0xCD63,0x0085,0x0083,0xCD62,0xD4E9,0x0083,0xF2BC,0xCD61,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xCD60,0xCD5F,0x0083,0xCD5E,0xCD5D,0x0085,0x0083,0xF2BA,0xD1C1,0x0083,0xCD5C,0xCD5B, 0x0089,0x0085,0x0083,0xCD5A,0xCD59,0x0083,0xCD58,0xCD57,0x0085,0x0083,0xB2CF,0xCD56,0x0083,0xF2BE,0xCD55,0x0091, 0x0089,0x0085,0x0083,0xCD54,0xCD53,0x0083,0xCD52,0xCD51,0x0085,0x0083,0xF2B7,0xB0F6,0x0083,0xF2B8,0xCEC3,0x0089, 0x0085,0x0083,0xCD50,0xCD4F,0x0083,0xCD4E,0xCD4D,0x0085,0x0083,0xCD4C,0xCD4B,0x0083,0xCD4A,0xC2EC,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xD2CF,0xCAB4,0x0083,0xF2B2,0xCFBA,0x0085,0x0083,0xCBE4,0xF2B4,0x0083,0xF2B5,0xF2B3, 0x0089,0x0085,0x0083,0xBAE7,0xCD49,0x0083,0xCD48,0xCD47,0x0085,0x0083,0xCD46,0xCD45,0x0083,0xCD44,0xCD43,0x0091, 0x0089,0x0085,0x0083,0xCAAD,0xCD42,0x0083,0xCD41,0xF2B1,0x0085,0x0083,0xCD40,0xF2B0,0x0083,0xB3E6,0xCCA0,0x0089, 0x0085,0x0083,0xCC9F,0xCC9E,0x0083,0xCC9D,0xCC9C,0x0085,0x0083,0xCC9B,0xCC9A,0x0083,0xCC99,0xEBBD,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xCC98,0xCC97,0x0083,0xCC96,0xD3DD,0x0085,0x0083,0xCC95,0xCC94,0x0083,0xCC93,0xD0E9,0x0089, 0x0085,0x0083,0xCC92,0xCC91,0x0083,0xCC90,0xCC8F,0x0085,0x0083,0xCC8E,0xF2AF,0x0083,0xCC8D,0xCC8C,0x0091,0x0089, 0x0085,0x0083,0xC2C7,0xC5B0,0x0083,0xC2B2,0xBBA2,0x0085,0x0083,0xF2AE,0xCC8B,0x0083,0xCC8A,0xCC89,0x0089,0x0085, 0x0083,0xCC88,0xCC87,0x0083,0xCC86,0xCC85,0x0085,0x0083,0xCC84,0xCC83,0x0083,0xCC82,0xCC81,0x027F,0x017F,0x00FF, 0x00BF,0x009F,0x008F,0x0087,0x0083,0xCC80,0x0083,0xCC7E,0xCC7D,0x0085,0x0083,0xCC7C,0xCC7B,0x0083,0xDEC2,0xCC7A, 0x0089,0x0085,0x0083,0xCC79,0xCC78,0x0083,0xD5BA,0xCC77,0x0085,0x0083,0xCC76,0xCC75,0x0083,0xCC74,0xCC73,0x0091, 0x0089,0x0085,0x0083,0xCC72,0xCC71,0x0083,0xCC70,0xCC6F,0x0085,0x0083,0xCC6E,0xCC6D,0x0083,0xCC6C,0xCC6B,0x0089, 0x0085,0x0083,0xCC6A,0xDEC0,0x0083,0xCC69,0xDEBE,0x0085,0x0083,0xCC68,0xCC67,0x0083,0xCC66,0xCC65,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xCC64,0xCC63,0x0083,0xCC62,0xCC61,0x0085,0x0083,0xCC60,0xCC5F,0x0083,0xCC5E,0xCC5D,0x0089, 0x0085,0x0083,0xCC5C,0xCC5B,0x0083,0xCC5A,0xCC59,0x0085,0x0083,0xDEC1,0xCC58,0x0083,0xCC57,0xCC56,0x0091,0x0089, 0x0085,0x0083,0xCC55,0xC4A2,0x0083,0xCC54,0xCC53,0x0085,0x0083,0xCC52,0xCC51,0x0083,0xCC50,0xCC4F,0x0089,0x0085, 0x0083,0xCC4E,0xCC4D,0x0083,0xCC4C,0xCC4B,0x0085,0x0083,0xCC4A,0xDEBF,0x0083,0xCC49,0xCC48,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xCC47,0xCC46,0x0083,0xCC45,0xDEBD,0x0085,0x0083,0xCC44,0xCC43,0x0083,0xCC42,0xD4E5,0x0089, 0x0085,0x0083,0xCC41,0xCC40,0x0083,0xCBA0,0xCB9F,0x0085,0x0083,0xCB9E,0xCB9D,0x0083,0xCB9C,0xCB9B,0x0091,0x0089, 0x0085,0x0083,0xCB9A,0xCB99,0x0083,0xCB98,0xCB97,0x0085,0x0083,0xCB96,0xCB95,0x0083,0xCB94,0xCB93,0x0089,0x0085, 0x0083,0xCB92,0xB7AA,0x0083,0xCB91,0xCB90,0x0085,0x0083,0xCB8F,0xCB8E,0x0083,0xCCD9,0xCB8D,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xCB8C,0xCB8B,0x0083,0xCB8A,0xCB89,0x0085,0x0083,0xCB88,0xCB87,0x0083,0xDEBC,0xCB86,0x0089,0x0085, 0x0083,0xCB85,0xCB84,0x0083,0xCB83,0xCB82,0x0085,0x0083,0xCB81,0xC5BA,0x0083,0xCB80,0xDEBA,0x0091,0x0089,0x0085, 0x0083,0xCB7E,0xCB7D,0x0083,0xC3EA,0xB2D8,0x0085,0x0083,0xCB7C,0xCB7B,0x0083,0xCB7A,0xCB79,0x0089,0x0085,0x0083, 0xCB78,0xBDE5,0x0083,0xCB77,0xCB76,0x0085,0x0083,0xCB75,0xCB74,0x0083,0xCB73,0xCB72,0x0101,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xCB71,0xDEBB,0x0083,0xCB70,0xCB6F,0x0085,0x0083,0xCB6E,0xCB6D,0x0083,0xCB6C,0xCB6B,0x0089, 0x0085,0x0083,0xCB6A,0xDEB7,0x0083,0xCB69,0xDEB8,0x0085,0x0083,0xCB68,0xCB67,0x0083,0xCB66,0xCB65,0x0091,0x0089, 0x0085,0x0083,0xCB64,0xCB63,0x0083,0xDEB9,0xCAED,0x0085,0x0083,0xDEB4,0xCB62,0x0083,0xCB61,0xCB60,0x0089,0x0085, 0x0083,0xD0BD,0xCB5F,0x0083,0xDEB0,0xCB5E,0x0085,0x0083,0xCB5D,0xCB5C,0x0083,0xDEAF,0xCB5B,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xCB5A,0xCB59,0x0083,0xCB58,0xCB57,0x0085,0x0083,0xCB56,0xCB55,0x0083,0xDEB5,0xD1A6,0x0089,0x0085, 0x0083,0xCB54,0xCB53,0x0083,0xCB52,0xCB51,0x0085,0x0083,0xCB50,0xCB4F,0x0083,0xCB4E,0xCB4D,0x0091,0x0089,0x0085, 0x0083,0xCB4C,0xCB4B,0x0083,0xCB4A,0xDEB2,0x0085,0x0083,0xCB49,0xCB48,0x0083,0xCB47,0xCB46,0x0089,0x0085,0x0083, 0xCB45,0xCB44,0x0083,0xCB43,0xDEB1,0x0085,0x0083,0xCB42,0xDEB6,0x0083,0xB1A1,0xCB41,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xCB40,0xCAA0,0x0083,0xCA9F,0xCA9E,0x0085,0x0083,0xC0D9,0xCA9D,0x0083,0xCA9C,0xDEAE,0x0089,0x0085, 0x0083,0xDEAA,0xDEB3,0x0083,0xCA9B,0xCA9A,0x0085,0x0083,0xCA99,0xCA98,0x0083,0xD4CC,0xCA97,0x0091,0x0089,0x0085, 0x0083,0xDEAD,0xCA96,0x0083,0xCA95,0xCA94,0x0085,0x0083,0xCA93,0xCA92,0x0083,0xCA91,0xCA90,0x0089,0x0085,0x0083, 0xCA8F,0xCA8E,0x0083,0xDEA7,0xCA8D,0x0085,0x0083,0xCA8C,0xCA8B,0x0083,0xDEA8,0xCA8A,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xCA89,0xCA88,0x0083,0xCA87,0xCA86,0x0085,0x0083,0xDEA9,0xCA85,0x0083,0xCA84,0xCA83,0x0089,0x0085,0x0083, 0xCA82,0xDEA5,0x0083,0xCA81,0xCA80,0x0085,0x0083,0xDEA1,0xCA7E,0x0083,0xCA7D,0xCA7C,0x0091,0x0089,0x0085,0x0083, 0xCA7B,0xCA7A,0x0083,0xCA79,0xCA78,0x0085,0x0083,0xCA77,0xCA76,0x0083,0xCA75,0xCA74,0x0089,0x0085,0x0083,0xC8EF, 0xBDB6,0x0083,0xDEA6,0xCA73,0x0085,0x0083,0xCA72,0xCA71,0x0083,0xCA70,0xDEAC,0x0181,0x0101,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xCA6F,0xCA6E,0x0083,0xCA6D,0xCA6C,0x0085,0x0083,0xCA6B,0xB1CE,0x0083,0xB0AA,0xDEA2,0x0089, 0x0085,0x0083,0xDDFE,0xDDFC,0x0083,0xDDFA,0xC7BE,0x0085,0x0083,0xCA6A,0xCA69,0x0083,0xCA68,0xCA67,0x0091,0x0089, 0x0085,0x0083,0xCA66,0xCA65,0x0083,0xCA64,0xCA63,0x0085,0x0083,0xCA62,0xCA61,0x0083,0xCADF,0xC4E8,0x0089,0x0085, 0x0083,0xCA60,0xCA5F,0x0083,0xCA5E,0xCA5D,0x0085,0x0083,0xCA5C,0xCA5B,0x0083,0xCA5A,0xCA59,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xCA58,0xB2CC,0x0083,0xCA57,0xDDFD,0x0085,0x0083,0xCA56,0xCA55,0x0083,0xCA54,0xCA53,0x0089,0x0085, 0x0083,0xCEB5,0xCA52,0x0083,0xCA51,0xD5E1,0x0085,0x0083,0xCA50,0xCA4F,0x0083,0xCA4E,0xC2FB,0x0091,0x0089,0x0085, 0x0083,0xCA4D,0xC3EF,0x0083,0xCA4C,0xCA4B,0x0085,0x0083,0xCA4A,0xCA49,0x0083,0xDDF8,0xCA48,0x0089,0x0085,0x0083, 0xCA47,0xCA46,0x0083,0xCA45,0xCA44,0x0085,0x0083,0xCA43,0xCA42,0x0083,0xCA41,0xCA40,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xC9A0,0xC99F,0x0083,0xC99E,0xDEA3,0x0085,0x0083,0xC99D,0xC99C,0x0083,0xDEA4,0xC99B,0x0089,0x0085, 0x0083,0xC99A,0xC999,0x0083,0xC998,0xC997,0x0085,0x0083,0xC996,0xC995,0x0083,0xC994,0xC993,0x0091,0x0089,0x0085, 0x0083,0xC992,0xC991,0x0083,0xDDFB,0xC990,0x0085,0x0083,0xC98F,0xC98E,0x0083,0xC5EE,0xC98D,0x0089,0x0085,0x0083, 0xC98C,0xC98B,0x0083,0xC98A,0xC989,0x0085,0x0083,0xDDEB,0xDDF6,0x0083,0xC988,0xDDF7,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC987,0xC986,0x0083,0xDDF1,0xBCBB,0x0085,0x0083,0xC985,0xC0B6,0x0083,0xC984,0xC983,0x0089,0x0085,0x0083, 0xC982,0xC981,0x0083,0xC980,0xC97E,0x0085,0x0083,0xB1CD,0xC97D,0x0083,0xC97C,0xDDED,0x0091,0x0089,0x0085,0x0083, 0xC97B,0xCBF2,0x0083,0xDDEA,0xC97A,0x0085,0x0083,0xC979,0xDDE9,0x0083,0xC978,0xC977,0x0089,0x0085,0x0083,0xDDEE, 0xC8D8,0x0083,0xC976,0xC975,0x0085,0x0083,0xC974,0xC973,0x0083,0xD0EE,0xC972,0x0101,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xC971,0xDDE8,0x0083,0xC970,0xDDEF,0x0085,0x0083,0xC96F,0xDDEC,0x0083,0xC96E,0xC96D,0x0089,0x0085, 0x0083,0xDDF0,0xDDF3,0x0083,0xD5F4,0xC96C,0x0085,0x0083,0xC96B,0xC96A,0x0083,0xDDF4,0xC969,0x0091,0x0089,0x0085, 0x0083,0xC6D1,0xC968,0x0083,0xC967,0xD8E1,0x0085,0x0083,0xC966,0xC965,0x0083,0xC964,0xC963,0x0089,0x0085,0x0083, 0xC962,0xC961,0x0083,0xC960,0xC95F,0x0085,0x0083,0xC95E,0xC95D,0x0083,0xC95C,0xC95B,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC95A,0xDDF2,0x0083,0xC959,0xC958,0x0085,0x0083,0xC957,0xC956,0x0083,0xCBE2,0xC955,0x0089,0x0085,0x0083, 0xC954,0xC3C9,0x0083,0xC953,0xDDF5,0x0085,0x0083,0xC952,0xC951,0x0083,0xC950,0xC94F,0x0091,0x0089,0x0085,0x0083, 0xC94E,0xC94D,0x0083,0xC94C,0xC94B,0x0085,0x0083,0xDDE5,0xC94A,0x0083,0xDDE4,0xBDAF,0x0089,0x0085,0x0083,0xC949, 0xDDDE,0x0083,0xDDDC,0xDDDB,0x0085,0x0083,0xC948,0xC947,0x0083,0xC946,0xC945,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xB5D9,0xC944,0x0083,0xC943,0xC942,0x0085,0x0083,0xC941,0xC940,0x0083,0xC8A0,0xC89F,0x0089,0x0085,0x0083, 0xDDDD,0xC89E,0x0083,0xDDDF,0xC89D,0x0085,0x0083,0xDDE3,0xBFFB,0x0083,0xC89C,0xDDDA,0x0091,0x0089,0x0085,0x0083, 0xC89B,0xB4D0,0x0083,0xC89A,0xC899,0x0085,0x0083,0xC898,0xDDE7,0x0083,0xD4E1,0xBAF9,0x0089,0x0085,0x0083,0xC897, 0xDDE2,0x0083,0xC896,0xC895,0x0085,0x0083,0xC894,0xC893,0x0083,0xC892,0xB6AD,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC891,0xC6CF,0x0083,0xC890,0xC88F,0x0085,0x0083,0xC88E,0xC88D,0x0083,0xDDD6,0xB8F0,0x0089,0x0085,0x0083,0xDDD8, 0xDDD9,0x0083,0xC88C,0xD6F8,0x0085,0x0083,0xC88B,0xC88A,0x0083,0xC889,0xC888,0x0091,0x0089,0x0085,0x0083,0xC887, 0xDDD7,0x0083,0xC886,0xC885,0x0085,0x0083,0xC884,0xC883,0x0083,0xC882,0xC881,0x0089,0x0085,0x0083,0xC880,0xC87E, 0x0083,0xC87D,0xC87C,0x0085,0x0083,0xDDE1,0xC87B,0x0083,0xC87A,0xC879,0x047F,0x027F,0x017F,0x00FF,0x00BF,0x009F, 0x008F,0x0087,0x0083,0xC878,0x0083,0xC877,0xC876,0x0085,0x0083,0xC875,0xC874,0x0083,0xC2E4,0xDDE0,0x0089,0x0085, 0x0083,0xC873,0xC872,0x0083,0xC871,0xDDC7,0x0085,0x0083,0xC870,0xC86F,0x0083,0xC86E,0xC86D,0x0091,0x0089,0x0085, 0x0083,0xC86C,0xC86B,0x0083,0xDDE6,0xC86A,0x0085,0x0083,0xC869,0xC868,0x0083,0xC867,0xC866,0x0089,0x0085,0x0083, 0xC865,0xC864,0x0083,0xC863,0xC8F8,0x0085,0x0083,0xCFF4,0xDDD3,0x0083,0xD3AA,0xD3A9,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC862,0xC861,0x0083,0xC860,0xC85F,0x0085,0x0083,0xC85E,0xC85D,0x0083,0xC2DC,0xDDC6,0x0089,0x0085,0x0083, 0xC85C,0xC85B,0x0083,0xC85A,0xDDC1,0x0085,0x0083,0xC859,0xC858,0x0083,0xC857,0xC856,0x0091,0x0089,0x0085,0x0083, 0xC855,0xC854,0x0083,0xDDC8,0xC853,0x0085,0x0083,0xDDCC,0xCEAE,0x0083,0xC6BC,0xC3C8,0x0089,0x0085,0x0083,0xDDC2, 0xC852,0x0083,0xC851,0xC850,0x0085,0x0083,0xC84F,0xDDC9,0x0083,0xC84E,0xCCD1,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xDDCD,0xC84D,0x0083,0xDDBD,0xC84C,0x0085,0x0083,0xC84B,0xC84A,0x0083,0xDDC4,0xC849,0x0089,0x0085,0x0083, 0xC848,0xC847,0x0083,0xDDCF,0xDDCE,0x0085,0x0083,0xC846,0xC845,0x0083,0xC844,0xC843,0x0091,0x0089,0x0085,0x0083, 0xC842,0xB7C6,0x0083,0xC1E2,0xDDD4,0x0085,0x0083,0xC841,0xC840,0x0083,0xC7A0,0xC79F,0x0089,0x0085,0x0083,0xC79E, 0xDDD0,0x0083,0xC6D0,0xC79D,0x0085,0x0083,0xC79C,0xC79B,0x0083,0xDDBE,0xC79A,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC799,0xC798,0x0083,0xDDD5,0xB2A4,0x0085,0x0083,0xDDCB,0xC797,0x0083,0xDDC3,0xB2CB,0x0089,0x0085,0x0083,0xC796, 0xC795,0x0083,0xC794,0xDDBF,0x0085,0x0083,0xC793,0xDDC5,0x0083,0xC792,0xDDCA,0x0091,0x0089,0x0085,0x0083,0xC791, 0xC790,0x0083,0xC78F,0xC78E,0x0085,0x0083,0xBACA,0xC78D,0x0083,0xC78C,0xBEFA,0x0089,0x0085,0x0083,0xC78B,0xBED5, 0x0083,0xC78A,0xC789,0x0085,0x0083,0xB9BD,0xC788,0x0083,0xDDD1,0xC787,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC786,0xC785,0x0083,0xDDBC,0xDDD2,0x0085,0x0083,0xC784,0xC783,0x0083,0xC3A7,0xDDBB,0x0089,0x0085,0x0083, 0xC782,0xDDBA,0x0083,0xD3A8,0xDDB5,0x0085,0x0083,0xBBF1,0xDDB2,0x0083,0xC781,0xDDAB,0x0091,0x0089,0x0085,0x0083, 0xDDAA,0xC1AB,0x0083,0xC0B3,0xDDA8,0x0085,0x0083,0xC780,0xC77E,0x0083,0xC77D,0xC77C,0x0089,0x0085,0x0083,0xC4AA, 0xDDAD,0x0083,0xDDB3,0xDDB9,0x0085,0x0083,0xC77B,0xC77A,0x0083,0xC779,0xC778,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC777,0xC776,0x0083,0xC775,0xDDAC,0x0085,0x0083,0xC774,0xDDB8,0x0083,0xC773,0xDDAF,0x0089,0x0085,0x0083,0xDCF0, 0xC772,0x0083,0xC771,0xDDB7,0x0085,0x0083,0xC770,0xC76F,0x0083,0xC76E,0xC76D,0x0091,0x0089,0x0085,0x0083,0xDDAE, 0xDCEC,0x0083,0xC76C,0xC76B,0x0085,0x0083,0xC76A,0xC9AF,0x0083,0xC769,0xC768,0x0089,0x0085,0x0083,0xC767,0xC766, 0x0083,0xC0F2,0xC765,0x0085,0x0083,0xC764,0xC6CE,0x0083,0xDDB0,0xC763,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC762,0xC761,0x0083,0xC760,0xC75F,0x0085,0x0083,0xC75E,0xC75D,0x0083,0xDDB4,0xDDB1,0x0089,0x0085,0x0083,0xDDB6, 0xC75C,0x0083,0xC75B,0xDDA9,0x0085,0x0083,0xBAC9,0xC75A,0x0083,0xC759,0xC758,0x0091,0x0089,0x0085,0x0083,0xC757, 0xC756,0x0083,0xC755,0xC754,0x0085,0x0083,0xD2A9,0xDDA7,0x0083,0xDDA6,0xDDA4,0x0089,0x0085,0x0083,0xD2F1,0xDDA5, 0x0083,0xDDA3,0xDDA1,0x0085,0x0083,0xD3AB,0xDCFD,0x0083,0xDCFE,0xBBE7,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC8D9, 0xC753,0x0083,0xB5B4,0xDCF9,0x0085,0x0083,0xDCF6,0xDCF1,0x0083,0xC752,0xDCEA,0x0089,0x0085,0x0083,0xDCE9,0xBCD4, 0x0083,0xC751,0xC750,0x0085,0x0083,0xC74F,0xC74E,0x0083,0xC74D,0xC0F3,0x0091,0x0089,0x0085,0x0083,0xC74C,0xBBC4, 0x0083,0xDCE8,0xBCF6,0x0085,0x0083,0xDCF3,0xC74B,0x0083,0xC74A,0xC749,0x0089,0x0085,0x0083,0xC748,0xC747,0x0083, 0xB2DD,0xC746,0x0085,0x0083,0xDCF4,0xBEA3,0x0083,0xC745,0xC744,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xDCF5,0xC743,0x0083,0xC742,0xDCF7,0x0085,0x0083,0xC741,0xC740,0x0083,0xC6A0,0xDCED,0x0089,0x0085,0x0083, 0xC69F,0xDCFB,0x0083,0xC8E3,0xC8D7,0x0085,0x0083,0xC69E,0xB2E8,0x0083,0xD2F0,0xDCEE,0x0091,0x0089,0x0085,0x0083, 0xDCFC,0xC69D,0x0083,0xDCEF,0xC69C,0x0085,0x0083,0xDCF2,0xC69B,0x0083,0xDCFA,0xB2E7,0x0089,0x0085,0x0083,0xC3A3, 0xC69A,0x0083,0xC699,0xB4C4,0x0085,0x0083,0xBCEB,0xC698,0x0083,0xC697,0xC696,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC695,0xC694,0x0083,0xC693,0xC692,0x0085,0x0083,0xC691,0xC690,0x0083,0xC68F,0xDCE7,0x0089,0x0085,0x0083,0xDDA2, 0xDCE1,0x0083,0xC68E,0xC68D,0x0085,0x0083,0xDCF8,0xC68C,0x0083,0xDCE4,0xDCE3,0x0091,0x0089,0x0085,0x0083,0xC68B, 0xC68A,0x0083,0xDCE0,0xC689,0x0085,0x0083,0xDCD7,0xBEA5,0x0083,0xC688,0xDCDD,0x0089,0x0085,0x0083,0xC687,0xC686, 0x0083,0xDCD4,0xDCEB,0x0085,0x0083,0xDCD8,0xDCE2,0x0083,0xC3A9,0xC7D1,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xB7B6,0xC3AF,0x0083,0xD7C2,0xC685,0x0085,0x0083,0xC684,0xC683,0x0083,0xC682,0xC681,0x0089,0x0085,0x0083,0xDCDE, 0xC680,0x0083,0xC6BB,0xC67E,0x0085,0x0083,0xDCD5,0xC67D,0x0083,0xC67C,0xDCDA,0x0091,0x0089,0x0085,0x0083,0xC67B, 0xC67A,0x0083,0xD3A2,0xC679,0x0085,0x0083,0xB1BD,0xC678,0x0083,0xC677,0xC676,0x0089,0x0085,0x0083,0xC9BB,0xC675, 0x0083,0xC674,0xC673,0x0085,0x0083,0xC672,0xBFE0,0x0083,0xC8F4,0xDCD6,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDCC4, 0xC671,0x0083,0xDCD3,0xDCE5,0x0085,0x0083,0xB9B6,0xB0FA,0x0083,0xC670,0xDCD9,0x0089,0x0085,0x0083,0xBFC1,0xC66F, 0x0083,0xC66E,0xDCDC,0x0085,0x0083,0xC3E7,0xC66D,0x0083,0xDCE6,0xCCA6,0x0091,0x0089,0x0085,0x0083,0xDCDF,0xDCDB, 0x0083,0xD4B7,0xC66C,0x0085,0x0083,0xCBD5,0xDCD1,0x0083,0xB2D4,0xDCC9,0x0089,0x0085,0x0083,0xDCC8,0xDCC3,0x0083, 0xC66B,0xDCC2,0x0085,0x0083,0xCEAD,0xC66A,0x0083,0xC669,0xDCD0,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC668,0xC667,0x0083,0xDCCA,0xC666,0x0085,0x0083,0xC665,0xDCC0,0x0083,0xD1BF,0xC664,0x0089,0x0085,0x0083,0xC663, 0xC662,0x0083,0xC7DB,0xDCBF,0x0085,0x0083,0xDCC6,0xC661,0x0083,0xC660,0xDCCC,0x0091,0x0089,0x0085,0x0083,0xB7BC, 0xC65F,0x0083,0xBBA8,0xDCC1,0x0085,0x0083,0xD0BE,0xDCC7,0x0083,0xB0C5,0xB7D2,0x0089,0x0085,0x0083,0xDCBE,0xDCCE, 0x0083,0xDCCB,0xDCB8,0x0085,0x0083,0xC65E,0xC2AB,0x0083,0xBDE6,0xDCD2,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC65D, 0xC65C,0x0083,0xDCCD,0xC65B,0x0085,0x0083,0xDCCF,0xC65A,0x0083,0xD6A5,0xCEDF,0x0089,0x0085,0x0083,0xC659,0xC658, 0x0083,0xDCBD,0xDCC5,0x0085,0x0083,0xDCBC,0xC657,0x0083,0xC656,0xC655,0x0091,0x0089,0x0085,0x0083,0xC654,0xC3A2, 0x0083,0xDCBB,0xC653,0x0085,0x0083,0xDCB6,0xDCBA,0x0083,0xC9D6,0xC652,0x0089,0x0085,0x0083,0xD3F3,0xDCB7,0x0083, 0xC651,0xD8C2,0x0085,0x0083,0xC650,0xC64F,0x0083,0xC64E,0xDCB9,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC64D, 0xBDDA,0x0083,0xC64C,0xC64B,0x0085,0x0083,0xDCB5,0xB0AC,0x0083,0xDCB4,0xC64A,0x0089,0x0085,0x0083,0xC649,0xD2D5, 0x0083,0xDCB3,0xC648,0x0085,0x0083,0xC647,0xC646,0x0083,0xC645,0xE5F5,0x0091,0x0089,0x0085,0x0083,0xD1DE,0xC9AB, 0x0083,0xC644,0xBCE8,0x0085,0x0083,0xC1BC,0xF4DE,0x0083,0xC643,0xC642,0x0089,0x0085,0x0083,0xC641,0xC640,0x0083, 0xC5A0,0xF4BF,0x0085,0x0083,0xC59F,0xC59E,0x0083,0xC59D,0xC59C,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC59B,0xC59A, 0x0083,0xC599,0xC598,0x0085,0x0083,0xF4BE,0xC597,0x0083,0xC596,0xC595,0x0089,0x0085,0x0083,0xC594,0xF4BD,0x0083, 0xC593,0xCBD2,0x0085,0x0083,0xC592,0xC591,0x0083,0xC590,0xC58F,0x0091,0x0089,0x0085,0x0083,0xC58E,0xC58D,0x0083, 0xC58C,0xC58B,0x0085,0x0083,0xF4BC,0xC58A,0x0083,0xC589,0xC588,0x0089,0x0085,0x0083,0xF4BB,0xC587,0x0083,0xF4BA, 0xC586,0x0085,0x0083,0xCDA7,0xC585,0x0083,0xC584,0xF4B9,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083, 0xC583,0x0083,0xC582,0xC581,0x0085,0x0083,0xC580,0xC57E,0x0083,0xF4B8,0xC57D,0x0089,0x0085,0x0083,0xC57C,0xF4B5, 0x0083,0xC57B,0xB4AC,0x0085,0x0083,0xF4B4,0xCFCF,0x0083,0xB2B0,0xB6E6,0x0091,0x0089,0x0085,0x0083,0xF4B7,0xF4B6, 0x0083,0xC57A,0xB2D5,0x0085,0x0083,0xBDA2,0xF4B1,0x0083,0xC579,0xF4B0,0x0089,0x0085,0x0083,0xB0E3,0xF4B3,0x0083, 0xBABD,0xC578,0x0085,0x0083,0xF4B2,0xC577,0x0083,0xC576,0xC575,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC574,0xF4AF, 0x0083,0xF4AE,0xF4AD,0x0085,0x0083,0xC573,0xD6DB,0x0083,0xCEE8,0xC572,0x0089,0x0085,0x0083,0xCBB4,0xE2B6,0x0083, 0xC571,0xC570,0x0085,0x0083,0xC56F,0xC56E,0x0083,0xC56D,0xC56C,0x0091,0x0089,0x0085,0x0083,0xCCF2,0xC56B,0x0083, 0xCAE6,0xC56A,0x0085,0x0083,0xF3C2,0xC569,0x0083,0xC568,0xC9E1,0x0089,0x0085,0x0083,0xC9E0,0xC567,0x0083,0xC566, 0xC565,0x0085,0x0083,0xC564,0xC563,0x0083,0xD3DF,0xBECB,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF4AA,0xC562, 0x0083,0xF4A9,0xF4A8,0x0085,0x0083,0xD2A8,0xC561,0x0083,0xF4A7,0xC560,0x0089,0x0085,0x0083,0xBECA,0xD5E9,0x0083, 0xC55F,0xC55E,0x0085,0x0083,0xC55D,0xC55C,0x0083,0xC55B,0xC55A,0x0091,0x0089,0x0085,0x0083,0xD6C2,0xD6C1,0x0083, 0xC559,0xC558,0x0085,0x0083,0xC557,0xC556,0x0083,0xC555,0xB3F4,0x0089,0x0085,0x0083,0xF4AB,0xC554,0x0083,0xD7D4, 0xC553,0x0085,0x0083,0xC552,0xEAB0,0x0083,0xC551,0xC550,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC54F,0xB3BC,0x0083, 0xC54E,0xC54D,0x0085,0x0083,0xC54C,0xC54B,0x0083,0xC54A,0xC549,0x0089,0x0085,0x0083,0xC548,0xC547,0x0083,0xC546, 0xC545,0x0085,0x0083,0xC544,0xC543,0x0083,0xC542,0xC541,0x0091,0x0089,0x0085,0x0083,0xC540,0xC4A0,0x0083,0xC49F, 0xC49E,0x0085,0x0083,0xC49D,0xC49C,0x0083,0xC49B,0xC49A,0x0089,0x0085,0x0083,0xEBFB,0xC499,0x0083,0xEBFD,0xC498, 0x0085,0x0083,0xC497,0xC496,0x0083,0xD2DC,0xC495,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC494,0xD3B7, 0x0083,0xB1DB,0xECA1,0x0085,0x0083,0xCDCE,0xC493,0x0083,0xC492,0xC491,0x0089,0x0085,0x0083,0xC490,0xEBFE,0x0083, 0xE2DF,0xC48F,0x0085,0x0083,0xC48E,0xC48D,0x0083,0xC48C,0xC48B,0x0091,0x0089,0x0085,0x0083,0xC48A,0xC9C5,0x0083, 0xC489,0xC488,0x0085,0x0083,0xC487,0xC486,0x0083,0xC485,0xC484,0x0089,0x0085,0x0083,0xC483,0xC482,0x0083,0xEBFA, 0xC481,0x0085,0x0083,0xC5F2,0xC480,0x0083,0xECA2,0xC47E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC47D,0xEBF9,0x0083, 0xC47C,0xC47B,0x0085,0x0083,0xC47A,0xC479,0x0083,0xC478,0xCFA5,0x0089,0x0085,0x0083,0xC4A4,0xCCC5,0x0083,0xC477, 0xC476,0x0085,0x0083,0xB1EC,0xC475,0x0083,0xC474,0xC473,0x0091,0x0089,0x0085,0x0083,0xC472,0xC471,0x0083,0xC470, 0xEBF7,0x0085,0x0083,0xC46F,0xB8E0,0x0083,0xC46E,0xC46D,0x0089,0x0085,0x0083,0xC46C,0xC46B,0x0083,0xB2B2,0xC46A, 0x0085,0x0083,0xEBF5,0xC469,0x0083,0xC468,0xC467,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC466,0xC465,0x0083, 0xEBF6,0xC464,0x0085,0x0083,0xB0F2,0xCDC8,0x0083,0xCCDA,0xEBF0,0x0089,0x0085,0x0083,0xEBEF,0xC4E5,0x0083,0xCFD9, 0xB8B9,0x0085,0x0083,0xC463,0xC462,0x0083,0xC461,0xC460,0x0091,0x0089,0x0085,0x0083,0xEBE9,0xC45F,0x0083,0xC45E, 0xEBEC,0x0085,0x0083,0xD1FC,0xC45D,0x0083,0xC8F9,0xEBF1,0x0089,0x0085,0x0083,0xC45C,0xC45B,0x0083,0xC45A,0xEBEE, 0x0085,0x0083,0xC459,0xEBF2,0x0083,0xC458,0xD0C8,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC457,0xC456,0x0083,0xC455, 0xC454,0x0085,0x0083,0xEBED,0xC453,0x0083,0xC452,0xC451,0x0089,0x0085,0x0083,0xC450,0xC44F,0x0083,0xEBEB,0xEBEA, 0x0085,0x0083,0xC44E,0xC44D,0x0083,0xC44C,0xCDF3,0x0091,0x0089,0x0085,0x0083,0xC7BB,0xEBE8,0x0083,0xC44B,0xB8AD, 0x0085,0x0083,0xB8AF,0xC44A,0x0083,0xC449,0xC448,0x0089,0x0085,0x0083,0xEBE7,0xD2B8,0x0083,0xC0B0,0xC447,0x0085, 0x0083,0xEBE6,0xC446,0x0083,0xCCF3,0xC445,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC444,0xC443, 0x0083,0xC442,0xC441,0x0085,0x0083,0xC440,0xC3A0,0x0083,0xC6A2,0xC39F,0x0089,0x0085,0x0083,0xC39E,0xC39D,0x0083, 0xC39C,0xC39B,0x0085,0x0083,0xC1B3,0xC39A,0x0083,0xEBE1,0xC399,0x0091,0x0089,0x0085,0x0083,0xC398,0xC397,0x0083, 0xEBE5,0xCDD1,0x0085,0x0083,0xC396,0xB8AC,0x0083,0xC395,0xC394,0x0089,0x0085,0x0083,0xEBE3,0xC393,0x0083,0xC392, 0xC391,0x0085,0x0083,0xC390,0xC38F,0x0083,0xC38E,0xC38D,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC38C,0xC38B,0x0083, 0xC38A,0xC389,0x0085,0x0083,0xC388,0xC387,0x0083,0xEBE2,0xC386,0x0089,0x0085,0x0083,0xC385,0xC384,0x0083,0xBDC5, 0xC383,0x0085,0x0083,0xEBE4,0xC382,0x0083,0xB2B1,0xC381,0x0091,0x0089,0x0085,0x0083,0xD9F5,0xC5A7,0x0083,0xEBDF, 0xC4D4,0x0085,0x0083,0xC6EA,0xD4E0,0x0083,0xEBDB,0xEBDA,0x0089,0x0085,0x0083,0xC380,0xC37E,0x0083,0xBCB9,0xC2F6, 0x0085,0x0083,0xC37D,0xC37C,0x0083,0xB4E0,0xC37B,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC37A,0xC379,0x0083, 0xD6AC,0xC378,0x0085,0x0083,0xC377,0xC376,0x0083,0xC375,0xC4DC,0x0089,0x0085,0x0083,0xEBDD,0xC374,0x0083,0xB0B7, 0xC373,0x0085,0x0083,0xD0D8,0xC372,0x0083,0xBDBA,0xC371,0x0091,0x0089,0x0085,0x0083,0xEBD8,0xB8EC,0x0083,0xEBDC, 0xEBD7,0x0085,0x0083,0xD2C8,0xBFE8,0x0083,0xC370,0xEBD9,0x0089,0x0085,0x0083,0xE6C0,0xEBD6,0x0083,0xEBCD,0xEBCC, 0x0085,0x0083,0xEBCB,0xEBCA,0x0083,0xC36F,0xF1E3,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD8B7,0xC36E,0x0083,0xC36D, 0xBAFA,0x0085,0x0083,0xC36C,0xC36B,0x0083,0xB0FB,0xEBD5,0x0089,0x0085,0x0083,0xCAA4,0xEBCE,0x0083,0xC5DF,0xEBD1, 0x0085,0x0083,0xC36A,0xEBD3,0x0083,0xC5D6,0xC369,0x0091,0x0089,0x0085,0x0083,0xC368,0xC367,0x0083,0xC366,0xC365, 0x0085,0x0083,0xC364,0xC363,0x0083,0xCCA5,0xEBD2,0x0089,0x0085,0x0083,0xB1B3,0xC362,0x0083,0xC361,0xC360,0x0085, 0x0083,0xC35F,0xC35E,0x0083,0xB5A8,0xC35D,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEBD0,0xCEB8,0x0083, 0xEBCF,0xD0B2,0x0085,0x0083,0xD5CD,0xD6D7,0x0083,0xC9F6,0xEBC4,0x0089,0x0085,0x0083,0xEBC2,0xC35C,0x0083,0xB7CE, 0xC35B,0x0085,0x0083,0xC35A,0xEBC9,0x0083,0xC359,0xC358,0x0091,0x0089,0x0085,0x0083,0xEBC8,0xC357,0x0083,0xD3FD, 0xEBC5,0x0085,0x0083,0xC356,0xBFCF,0x0083,0xB0B9,0xEBC7,0x0089,0x0085,0x0083,0xC355,0xEBC6,0x0083,0xB7BE,0xBCE7, 0x0085,0x0083,0xC354,0xC353,0x0083,0xC352,0xB7CA,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB7F4,0xC351,0x0083,0xD6AB, 0xB9C9,0x0085,0x0083,0xB3A6,0xEBBF,0x0083,0xC350,0xB8CE,0x0089,0x0085,0x0083,0xEBC0,0xB8D8,0x0083,0xB6C7,0xC34F, 0x0085,0x0083,0xD6E2,0xC34E,0x0083,0xD0A4,0xC34D,0x0091,0x0089,0x0085,0x0083,0xC34C,0xEBC1,0x0083,0xC34B,0xC34A, 0x0085,0x0083,0xC349,0xC348,0x0083,0xC347,0xC346,0x0089,0x0085,0x0083,0xBCA1,0xC0DF,0x0083,0xC345,0xC8E2,0x0085, 0x0083,0xC344,0xD5D8,0x0083,0xCBC1,0xC343,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD2DE,0xCBE0,0x0083,0xC342, 0xC341,0x0085,0x0083,0xEDB1,0xEDB2,0x0083,0xC340,0xC2A0,0x0089,0x0085,0x0083,0xC29F,0xC29E,0x0083,0xC29D,0xC29C, 0x0085,0x0083,0xC29B,0xC29A,0x0083,0xC299,0xC298,0x0091,0x0089,0x0085,0x0083,0xC297,0xC296,0x0083,0xC295,0xF1FA, 0x0085,0x0083,0xC294,0xC293,0x0083,0xC292,0xC291,0x0089,0x0085,0x0083,0xC290,0xC28F,0x0083,0xB4CF,0xF1F9,0x0085, 0x0083,0xC28E,0xC28D,0x0083,0xC28C,0xC28B,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC28A,0xC289,0x0083,0xC288,0xC287, 0x0085,0x0083,0xC286,0xC285,0x0083,0xC284,0xC283,0x0089,0x0085,0x0083,0xC282,0xC281,0x0083,0xBEDB,0xC280,0x0085, 0x0083,0xC6B8,0xC27E,0x0083,0xC27D,0xC27C,0x0091,0x0089,0x0085,0x0083,0xC1AA,0xC27B,0x0083,0xF1F8,0xC27A,0x0085, 0x0083,0xC279,0xC278,0x0083,0xC277,0xF1F7,0x0089,0x0085,0x0083,0xD6B0,0xC1FB,0x0083,0xC1C4,0xC276,0x0085,0x0083, 0xC275,0xC274,0x0083,0xF1F6,0xC273,0x6511,0x4051,0x2069,0x1075,0x087B,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F, 0x008F,0x0087,0x0083,0xC272,0x0083,0xF1F5,0xC4F4,0x0085,0x0083,0xC271,0xC270,0x0083,0xB9A2,0xC26F,0x0089,0x0085, 0x0083,0xB5A2,0xC26E,0x0083,0xB3DC,0xC26D,0x0085,0x0083,0xC26C,0xCBCA,0x0083,0xDEC7,0xD2AE,0x0091,0x0089,0x0085, 0x0083,0xF1F4,0xC26B,0x0083,0xB6FA,0xC26A,0x0085,0x0083,0xF1F2,0xC269,0x0083,0xC268,0xC267,0x0089,0x0085,0x0083, 0xC266,0xC265,0x0083,0xC264,0xC5D5,0x0085,0x0083,0xF1F0,0xF1F1,0x0083,0xF1EF,0xF1EE,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xF1ED,0xC263,0x0083,0xC262,0xF1EC,0x0085,0x0083,0xC261,0xF1EB,0x0083,0xC260,0xC25F,0x0089,0x0085,0x0083, 0xC25E,0xF1EA,0x0083,0xC25D,0xC25C,0x0085,0x0083,0xB0D2,0xD4C5,0x0083,0xBAC4,0xF1E9,0x0091,0x0089,0x0085,0x0083, 0xB8FB,0xF1E8,0x0083,0xC25B,0xF1E7,0x0085,0x0083,0xC25A,0xC4CD,0x0083,0xC259,0xC258,0x0089,0x0085,0x0083,0xCBA3, 0xB6F8,0x0083,0xF1F3,0xC257,0x0085,0x0083,0xC256,0xC255,0x0083,0xC254,0xEAC8,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xD5DF,0xEBA3,0x0083,0xBFBC,0xC253,0x0085,0x0083,0xC0CF,0xD2AB,0x0083,0xC252,0xC251,0x0089,0x0085,0x0083, 0xC250,0xD2ED,0x0083,0xB7AD,0xC24F,0x0085,0x0083,0xC24E,0xC24D,0x0083,0xC24C,0xC24B,0x0091,0x0089,0x0085,0x0083, 0xC24A,0xC249,0x0083,0xF4E8,0xC248,0x0085,0x0083,0xB0BF,0xBAB2,0x0083,0xC247,0xF4E7,0x0089,0x0085,0x0083,0xC246, 0xC245,0x0083,0xC244,0xC243,0x0085,0x0083,0xF4E6,0xC242,0x0083,0xC241,0xF4E5,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xF4E3,0xC240,0x0083,0xC1A0,0xC19F,0x0085,0x0083,0xF4E4,0xB4E4,0x0083,0xB5D4,0xC19E,0x0089,0x0085,0x0083,0xC19D, 0xC19C,0x0083,0xC19B,0xC19A,0x0085,0x0083,0xC199,0xC7CC,0x0083,0xC198,0xC197,0x0091,0x0089,0x0085,0x0083,0xF4E2, 0xCFE8,0x0083,0xC196,0xC195,0x0085,0x0083,0xC194,0xC193,0x0083,0xC192,0xF4E1,0x0089,0x0085,0x0083,0xC191,0xD2EE, 0x0083,0xC190,0xF1B4,0x0085,0x0083,0xC18F,0xC18E,0x0083,0xC18D,0xC18C,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xB3E1,0xC18B,0x0083,0xC18A,0xC189,0x0085,0x0083,0xCECC,0xC188,0x0083,0xF4E0,0xC187,0x0089,0x0085,0x0083, 0xD3F0,0xE5F1,0x0083,0xC186,0xC185,0x0085,0x0083,0xB8FE,0xD9FA,0x0083,0xC184,0xC183,0x0091,0x0089,0x0085,0x0083, 0xC182,0xC181,0x0083,0xC180,0xF4CB,0x0085,0x0083,0xC17E,0xF4CA,0x0083,0xF4C9,0xC17D,0x0089,0x0085,0x0083,0xC17C, 0xC17B,0x0083,0xC17A,0xC179,0x0085,0x0083,0xC178,0xC177,0x0083,0xF4C8,0xC176,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC175,0xC8BA,0x0083,0xC174,0xC173,0x0085,0x0083,0xCFDB,0xC172,0x0083,0xF4C7,0xD0DF,0x0089,0x0085,0x0083,0xF4C6, 0xC171,0x0083,0xC170,0xC1E7,0x0085,0x0083,0xC16F,0xC16E,0x0083,0xC16D,0xC16C,0x0091,0x0089,0x0085,0x0083,0xC16B, 0xB8E1,0x0083,0xC16A,0xC169,0x0085,0x0083,0xC168,0xC167,0x0083,0xC166,0xC3C0,0x0089,0x0085,0x0083,0xC165,0xC7BC, 0x0083,0xC164,0xD1F2,0x0085,0x0083,0xC163,0xC162,0x0083,0xC161,0xC160,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC15F,0xC15E,0x0083,0xC15D,0xC15C,0x0085,0x0083,0xEEBF,0xC15B,0x0083,0xC15A,0xEEC0,0x0089,0x0085,0x0083,0xC159, 0xC158,0x0083,0xC157,0xC156,0x0085,0x0083,0xEEBE,0xC155,0x0083,0xC154,0xC153,0x0091,0x0089,0x0085,0x0083,0xC152, 0xEEBC,0x0083,0xC151,0xCAF0,0x0085,0x0083,0xEEBD,0xC150,0x0083,0xC14F,0xD6C3,0x0089,0x0085,0x0083,0xC14E,0xC14D, 0x0083,0xC14C,0xD7EF,0x0085,0x0083,0xD5D6,0xEEBB,0x0083,0xC14B,0xC14A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC149, 0xC148,0x0083,0xC147,0xB0D5,0x0085,0x0083,0xEEB8,0xC146,0x0083,0xEEB9,0xC145,0x0089,0x0085,0x0083,0xC144,0xC143, 0x0083,0xC142,0xB7A3,0x0085,0x0083,0xC141,0xEEB7,0x0083,0xC2DE,0xC140,0x0091,0x0089,0x0085,0x0083,0xBAB1,0xD8E8, 0x0083,0xC0A0,0xC09F,0x0085,0x0083,0xCDF8,0xB9DE,0x0083,0xC09E,0xC09D,0x0089,0x0085,0x0083,0xC09C,0xC09B,0x0083, 0xC09A,0xC099,0x0085,0x0083,0xC098,0xC097,0x0083,0xC096,0xC095,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083, 0xF3C1,0x0083,0xF3C0,0xC094,0x0085,0x0083,0xF3BF,0xC093,0x0083,0xC092,0xC091,0x0089,0x0085,0x0083,0xC090,0xC08F, 0x0083,0xC08E,0xC08D,0x0085,0x0083,0xC8B1,0xC08C,0x0083,0xB8D7,0xC08B,0x0091,0x0089,0x0085,0x0083,0xF3BE,0xE7DA, 0x0083,0xBDC9,0xE7D9,0x0085,0x0083,0xE7D8,0xE7D7,0x0083,0xE7D6,0xE7D5,0x0089,0x0085,0x0083,0xC9C9,0xE7D4,0x0083, 0xE7D3,0xE7D2,0x0085,0x0083,0xE7D1,0xCBF5,0x0083,0xD3A7,0xE7D0,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE7CF,0xE7CE, 0x0083,0xE7CD,0xE7CC,0x0085,0x0083,0xE7CB,0xE7CA,0x0083,0xB2F8,0xE7C9,0x0089,0x0085,0x0083,0xC08A,0xB7EC,0x0083, 0xE7C7,0xE7C8,0x0085,0x0083,0xB8BF,0xE7C6,0x0083,0xD4B5,0xE7C5,0x0091,0x0089,0x0085,0x0083,0xB1E0,0xC2C6,0x0083, 0xB5DE,0xBBBA,0x0085,0x0083,0xE7C4,0xE7C3,0x0083,0xC089,0xE7C2,0x0089,0x0085,0x0083,0xB6D0,0xE7B6,0x0083,0xE7C1, 0xE7C0,0x0085,0x0083,0xC088,0xBCA9,0x0083,0xE7BF,0xE7BE,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC0C2,0xC3E5, 0x0083,0xBCEA,0xE7BD,0x0085,0x0083,0xE7BC,0xE7BB,0x0083,0xD7BA,0xC2CC,0x0089,0x0085,0x0083,0xE7BA,0xD5C0,0x0083, 0xD7DB,0xE7B9,0x0085,0x0083,0xE7B8,0xC087,0x0083,0xB3F1,0xB1C1,0x0091,0x0089,0x0085,0x0083,0xE7B7,0xC3E0,0x0083, 0xCEAC,0xC9FE,0x0085,0x0083,0xE7B5,0xE7B4,0x0083,0xB4C2,0xE7B3,0x0089,0x0085,0x0083,0xE7B2,0xD0F8,0x0083,0xC086, 0xE7B1,0x0085,0x0083,0xD0F7,0xBCA8,0x0083,0xE7B0,0xBCCC,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCCD0,0xCBE7,0x0083, 0xC085,0xD0E5,0x0085,0x0083,0xBEEE,0xE7AF,0x0083,0xE7AE,0xCDB3,0x0089,0x0085,0x0083,0xBDCA,0xBEF8,0x0083,0xC2E7, 0xE7AD,0x0085,0x0083,0xD1A4,0xB8F8,0x0083,0xBBE6,0xE7AC,0x0091,0x0089,0x0085,0x0083,0xC084,0xC8C6,0x0083,0xE7AB, 0xBDE1,0x0085,0x0083,0xC8DE,0xB0F3,0x0083,0xE7AA,0xBEAD,0x0089,0x0085,0x0083,0xD2EF,0xC9DC,0x0083,0xE7A9,0xE7A8, 0x0085,0x0083,0xB0ED,0xE7A7,0x0083,0xD6D5,0xD6AF,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCFB8,0xC9F0, 0x0083,0xD7E9,0xC1B7,0x0085,0x0083,0xE7A6,0xE7A5,0x0083,0xE7A4,0xCFDF,0x0089,0x0085,0x0083,0xE7A3,0xC5A6,0x0083, 0xC083,0xC082,0x0085,0x0083,0xB7C4,0xCEC6,0x0083,0xD6BD,0xB7D7,0x0091,0x0089,0x0085,0x0083,0xC2DA,0xD7DD,0x0083, 0xC081,0xC4C9,0x0085,0x0083,0xB8D9,0xC9B4,0x0083,0xE7A2,0xB4BF,0x0089,0x0085,0x0083,0xC080,0xE7A1,0x0083,0xCEB3, 0xC8D2,0x0085,0x0083,0xBCCD,0xE6FE,0x0083,0xE6FD,0xBCB6,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD4BC,0xE6FC,0x0083, 0xCFCB,0xE6FB,0x0085,0x0083,0xBAEC,0xE6FA,0x0083,0xBEC0,0xE6F9,0x0089,0x0085,0x0083,0xC07E,0xC07D,0x0083,0xC07C, 0xF4EE,0x0085,0x0083,0xC07B,0xC07A,0x0083,0xC079,0xC078,0x0091,0x0089,0x0085,0x0083,0xC077,0xC076,0x0083,0xC075, 0xC074,0x0085,0x0083,0xC073,0xC072,0x0083,0xC071,0xC070,0x0089,0x0085,0x0083,0xC06F,0xC06E,0x0083,0xC06D,0xC06C, 0x0085,0x0083,0xC06B,0xC06A,0x0083,0xC069,0xC068,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC067,0xC066,0x0083, 0xC065,0xC064,0x0085,0x0083,0xD7EB,0xC063,0x0083,0xC062,0xC061,0x0089,0x0085,0x0083,0xC060,0xC05F,0x0083,0xC05E, 0xC05D,0x0085,0x0083,0xC05C,0xC05B,0x0083,0xC05A,0xC059,0x0091,0x0089,0x0085,0x0083,0xC058,0xC057,0x0083,0xC056, 0xC055,0x0085,0x0083,0xC054,0xC053,0x0083,0xC052,0xC051,0x0089,0x0085,0x0083,0xC050,0xC04F,0x0083,0xC04E,0xC04D, 0x0085,0x0083,0xC04C,0xC04B,0x0083,0xC04A,0xC049,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC048,0xC047,0x0083,0xC046, 0xC045,0x0085,0x0083,0xC044,0xC043,0x0083,0xC042,0xC041,0x0089,0x0085,0x0083,0xC040,0xBFA0,0x0083,0xBF9F,0xBF9E, 0x0085,0x0083,0xBF9D,0xBF9C,0x0083,0xBF9B,0xBF9A,0x0091,0x0089,0x0085,0x0083,0xBF99,0xBF98,0x0083,0xBF97,0xBF96, 0x0085,0x0083,0xBF95,0xBF94,0x0083,0xBF93,0xBF92,0x0089,0x0085,0x0083,0xBF91,0xBF90,0x0083,0xBF8F,0xBF8E,0x0085, 0x0083,0xBF8D,0xBF8C,0x0083,0xBF8B,0xF4ED,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xBF8A,0x0083, 0xBF89,0xBF88,0x0085,0x0083,0xBF87,0xBF86,0x0083,0xB7B1,0xBF85,0x0089,0x0085,0x0083,0xBF84,0xBF83,0x0083,0xBF82, 0xBF81,0x0085,0x0083,0xF7E3,0xBF80,0x0083,0xBF7E,0xBF7D,0x0091,0x0089,0x0085,0x0083,0xBF7C,0xBF7B,0x0083,0xBF7A, 0xBF79,0x0085,0x0083,0xBF78,0xBF77,0x0083,0xBF76,0xBF75,0x0089,0x0085,0x0083,0xBF74,0xBF73,0x0083,0xBF72,0xBF71, 0x0085,0x0083,0xBF70,0xBF6F,0x0083,0xBF6E,0xBF6D,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBF6C,0xBF6B,0x0083,0xBF6A, 0xBF69,0x0085,0x0083,0xBF68,0xBF67,0x0083,0xBF66,0xBF65,0x0089,0x0085,0x0083,0xBF64,0xBF63,0x0083,0xBF62,0xBF61, 0x0085,0x0083,0xBF60,0xBF5F,0x0083,0xBF5E,0xBF5D,0x0091,0x0089,0x0085,0x0083,0xBF5C,0xBF5B,0x0083,0xBF5A,0xBF59, 0x0085,0x0083,0xBF58,0xBF57,0x0083,0xBF56,0xBF55,0x0089,0x0085,0x0083,0xBF54,0xBF53,0x0083,0xBF52,0xBF51,0x0085, 0x0083,0xBF50,0xBF4F,0x0083,0xBF4E,0xBF4D,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBF4C,0xBF4B,0x0083,0xBF4A, 0xBF49,0x0085,0x0083,0xBF48,0xBF47,0x0083,0xBF46,0xBF45,0x0089,0x0085,0x0083,0xBF44,0xBF43,0x0083,0xBF42,0xBF41, 0x0085,0x0083,0xBF40,0xBEA0,0x0083,0xBE9F,0xBE9E,0x0091,0x0089,0x0085,0x0083,0xBE9D,0xBE9C,0x0083,0xBE9B,0xBE9A, 0x0085,0x0083,0xBE99,0xBE98,0x0083,0xBE97,0xBE96,0x0089,0x0085,0x0083,0xBE95,0xBE94,0x0083,0xBE93,0xBE92,0x0085, 0x0083,0xBE91,0xBE90,0x0083,0xBE8F,0xBE8E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBE8D,0xBE8C,0x0083,0xBE8B,0xBE8A, 0x0085,0x0083,0xBE89,0xBE88,0x0083,0xBE87,0xBE86,0x0089,0x0085,0x0083,0xBE85,0xBE84,0x0083,0xBE83,0xBE82,0x0085, 0x0083,0xBE81,0xBE80,0x0083,0xBE7E,0xBE7D,0x0091,0x0089,0x0085,0x0083,0xBE7C,0xBE7B,0x0083,0xBE7A,0xBE79,0x0085, 0x0083,0xBE78,0xBE77,0x0083,0xBE76,0xBE75,0x0089,0x0085,0x0083,0xBE74,0xBE73,0x0083,0xBE72,0xBE71,0x0085,0x0083, 0xBE70,0xBE6F,0x0083,0xBE6E,0xBE6D,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBE6C,0xBE6B,0x0083,0xBE6A, 0xBE69,0x0085,0x0083,0xBE68,0xBE67,0x0083,0xBE66,0xBE65,0x0089,0x0085,0x0083,0xBE64,0xBE63,0x0083,0xBE62,0xBE61, 0x0085,0x0083,0xBE60,0xBE5F,0x0083,0xBE5E,0xBE5D,0x0091,0x0089,0x0085,0x0083,0xBE5C,0xBE5B,0x0083,0xBE5A,0xBE59, 0x0085,0x0083,0xBE58,0xBE57,0x0083,0xBE56,0xBE55,0x0089,0x0085,0x0083,0xBE54,0xF4EC,0x0083,0xBE53,0xBE52,0x0085, 0x0083,0xBE51,0xBE50,0x0083,0xBE4F,0xBE4E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBE4D,0xF4EB,0x0083,0xBE4C,0xBE4B, 0x0085,0x0083,0xBE4A,0xBE49,0x0083,0xBE48,0xBE47,0x0089,0x0085,0x0083,0xBE46,0xBE45,0x0083,0xBE44,0xBE43,0x0085, 0x0083,0xBE42,0xBE41,0x0083,0xBE40,0xBDA0,0x0091,0x0089,0x0085,0x0083,0xBD9F,0xBD9E,0x0083,0xBD9D,0xBD9C,0x0085, 0x0083,0xBD9B,0xBD9A,0x0083,0xBD99,0xBD98,0x0089,0x0085,0x0083,0xBD97,0xBD96,0x0083,0xBD95,0xBD94,0x0085,0x0083, 0xBD93,0xBD92,0x0083,0xBD91,0xBD90,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBD8F,0xBD8E,0x0083,0xBD8D,0xBD8C, 0x0085,0x0083,0xBD8B,0xBD8A,0x0083,0xBD89,0xBD88,0x0089,0x0085,0x0083,0xBD87,0xBD86,0x0083,0xBD85,0xBD84,0x0085, 0x0083,0xBD83,0xBD82,0x0083,0xBD81,0xBD80,0x0091,0x0089,0x0085,0x0083,0xF4EA,0xBD7E,0x0083,0xBD7D,0xBD7C,0x0085, 0x0083,0xBD7B,0xBD7A,0x0083,0xBD79,0xBD78,0x0089,0x0085,0x0083,0xBD77,0xD0F5,0x0083,0xBD76,0xBD75,0x0085,0x0083, 0xBD74,0xBD73,0x0083,0xBD72,0xBD71,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBD70,0xBD6F,0x0083,0xBD6E,0xBD6D,0x0085, 0x0083,0xBD6C,0xBD6B,0x0083,0xBD6A,0xBD69,0x0089,0x0085,0x0083,0xBD68,0xBD67,0x0083,0xBD66,0xBD65,0x0085,0x0083, 0xBD64,0xBD63,0x0083,0xBD62,0xBD61,0x0091,0x0089,0x0085,0x0083,0xBD60,0xBD5F,0x0083,0xBD5E,0xBD5D,0x0085,0x0083, 0xBD5C,0xBD5B,0x0083,0xBD5A,0xBD59,0x0089,0x0085,0x0083,0xBD58,0xBD57,0x0083,0xBD56,0xBD55,0x0085,0x0083,0xBD54, 0xBD53,0x0083,0xBD52,0xBD51,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBD50,0xBD4F,0x0083,0xBD4E, 0xBD4D,0x0085,0x0083,0xBD4C,0xBD4B,0x0083,0xBD4A,0xBD49,0x0089,0x0085,0x0083,0xBD48,0xBD47,0x0083,0xBD46,0xBD45, 0x0085,0x0083,0xBD44,0xBD43,0x0083,0xBD42,0xBD41,0x0091,0x0089,0x0085,0x0083,0xBD40,0xBCA0,0x0083,0xBC9F,0xBC9E, 0x0085,0x0083,0xBC9D,0xBC9C,0x0083,0xBC9B,0xBC9A,0x0089,0x0085,0x0083,0xC0DB,0xBC99,0x0083,0xBC98,0xBC97,0x0085, 0x0083,0xD7CF,0xBC96,0x0083,0xBC95,0xBC94,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBDF4,0xBC93,0x0083,0xBC92,0xBC91, 0x0085,0x0083,0xBC90,0xCBF7,0x0083,0xBC8F,0xCBD8,0x0089,0x0085,0x0083,0xBC8E,0xBC8D,0x0083,0xBC8C,0xBC8B,0x0085, 0x0083,0xBC8A,0xBC89,0x0083,0xBC88,0xBC87,0x0091,0x0089,0x0085,0x0083,0xBC86,0xBC85,0x0083,0xBC84,0xBC83,0x0085, 0x0083,0xBC82,0xBC81,0x0083,0xBC80,0xBC7E,0x0089,0x0085,0x0083,0xBC7D,0xBC7C,0x0083,0xBC7B,0xBC7A,0x0085,0x0083, 0xBC79,0xCEC9,0x0083,0xBC78,0xBC77,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBC76,0xBC75,0x0083,0xBC74,0xBC73, 0x0085,0x0083,0xBC72,0xBC71,0x0083,0xBC70,0xBC6F,0x0089,0x0085,0x0083,0xBC6E,0xBC6D,0x0083,0xBC6C,0xBC6B,0x0085, 0x0083,0xCFB5,0xBC6A,0x0083,0xBC69,0xF4E9,0x0091,0x0089,0x0085,0x0083,0xBC68,0xBC67,0x0083,0xBC66,0xBC65,0x0085, 0x0083,0xBC64,0xBC63,0x0083,0xBC62,0xBC61,0x0089,0x0085,0x0083,0xC5B4,0xBC60,0x0083,0xBC5F,0xBC5E,0x0085,0x0083, 0xBC5D,0xBC5C,0x0083,0xBC5B,0xF4DD,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBC5A,0xBC59,0x0083,0xBC58,0xBC57,0x0085, 0x0083,0xBC56,0xBC55,0x0083,0xBC54,0xBFB7,0x0089,0x0085,0x0083,0xD4E3,0xBC53,0x0083,0xBC52,0xC3D3,0x0085,0x0083, 0xBC51,0xBC50,0x0083,0xB2DA,0xBC4F,0x0091,0x0089,0x0085,0x0083,0xF4DC,0xCCC7,0x0083,0xB8E2,0xBC4E,0x0085,0x0083, 0xBC4D,0xBC4C,0x0083,0xBC4B,0xBC4A,0x0089,0x0085,0x0083,0xBC49,0xBC48,0x0083,0xF4D9,0xF4D8,0x0085,0x0083,0xBC47, 0xBAFD,0x0083,0xBC46,0xF4DA,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF4D7,0xBC45,0x0083,0xF4DB,0xBC44, 0x0085,0x0083,0xBC43,0xBC42,0x0083,0xF4D6,0xBC41,0x0089,0x0085,0x0083,0xBC40,0xBEAB,0x0083,0xF4D5,0xF4D4,0x0085, 0x0083,0xBBA0,0xBB9F,0x0083,0xB4E2,0xBB9E,0x0091,0x0089,0x0085,0x0083,0xBB9D,0xBB9C,0x0083,0xBB9B,0xBB9A,0x0085, 0x0083,0xBEAC,0xF4D3,0x0083,0xC1BB,0xBB99,0x0089,0x0085,0x0083,0xBB98,0xC1B8,0x0083,0xBB97,0xBB96,0x0085,0x0083, 0xBB95,0xB7E0,0x0083,0xBB94,0xBB93,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBB92,0xBB91,0x0083,0xD6E0,0xD4C1,0x0085, 0x0083,0xBB90,0xF4D2,0x0083,0xBB8F,0xBB8E,0x0089,0x0085,0x0083,0xCBDA,0xF4D1,0x0083,0xF4CF,0xF4D0,0x0085,0x0083, 0xBB8D,0xBB8C,0x0083,0xBB8B,0xD5B3,0x0091,0x0089,0x0085,0x0083,0xB4D6,0xBB8A,0x0083,0xC6C9,0xBB89,0x0085,0x0083, 0xBB88,0xC1A3,0x0083,0xF4CE,0xBB87,0x0089,0x0085,0x0083,0xBB86,0xBB85,0x0083,0xBB84,0xBB83,0x0085,0x0083,0xBB82, 0xBB81,0x0083,0xB7DB,0xBB80,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBB7E,0xBB7D,0x0083,0xBB7C,0xBB7B,0x0085, 0x0083,0xBB7A,0xBB79,0x0083,0xBB78,0xBB77,0x0089,0x0085,0x0083,0xBB76,0xBB75,0x0083,0xD7D1,0xF4CC,0x0085,0x0083, 0xC0E0,0xBB74,0x0083,0xBB73,0xBB72,0x0091,0x0089,0x0085,0x0083,0xBB71,0xBB70,0x0083,0xBB6F,0xD9E1,0x0085,0x0083, 0xC3D7,0xBB6E,0x0083,0xBB6D,0xBB6C,0x0089,0x0085,0x0083,0xBB6B,0xBB6A,0x0083,0xBB69,0xBB68,0x0085,0x0083,0xBB67, 0xBB66,0x0083,0xBB65,0xBB64,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBB63,0xBB62,0x0083,0xBB61,0xBB60,0x0085,0x0083, 0xBB5F,0xBB5E,0x0083,0xBB5D,0xBB5C,0x0089,0x0085,0x0083,0xBB5B,0xBB5A,0x0083,0xBB59,0xBB58,0x0085,0x0083,0xBB57, 0xBB56,0x0083,0xBB55,0xBB54,0x0091,0x0089,0x0085,0x0083,0xBB53,0xBB52,0x0083,0xBB51,0xBB50,0x0085,0x0083,0xBB4F, 0xBB4E,0x0083,0xBB4D,0xBB4C,0x0089,0x0085,0x0083,0xBB4B,0xBB4A,0x0083,0xBCAE,0xBB49,0x0085,0x0083,0xBB48,0xBB47, 0x0083,0xBB46,0xBB45,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xBB44,0x0083,0xBB43,0xBB42, 0x0085,0x0083,0xBB41,0xBB40,0x0083,0xBAA0,0xF4A5,0x0089,0x0085,0x0083,0xF4A6,0xB2BE,0x0083,0xBA9F,0xBA9E,0x0085, 0x0083,0xBA9D,0xBA9C,0x0083,0xBA9B,0xBA9A,0x0091,0x0089,0x0085,0x0083,0xF4A4,0xBA99,0x0083,0xBA98,0xBA97,0x0085, 0x0083,0xBA96,0xBA95,0x0083,0xBA94,0xBA93,0x0089,0x0085,0x0083,0xBA92,0xBA91,0x0083,0xBA90,0xBA8F,0x0085,0x0083, 0xBA8E,0xBA8D,0x0083,0xF4A2,0xBA8C,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBA8B,0xBBC9,0x0083,0xF4A3,0xBA8A,0x0085, 0x0083,0xBA89,0xBA88,0x0083,0xBA87,0xBA86,0x0089,0x0085,0x0083,0xBA85,0xF4A1,0x0083,0xBA84,0xBA83,0x0085,0x0083, 0xBA82,0xBA81,0x0083,0xBA80,0xBA7E,0x0091,0x0089,0x0085,0x0083,0xBA7D,0xBA7C,0x0083,0xF3FD,0xBA7B,0x0085,0x0083, 0xBA7A,0xBA79,0x0083,0xBA78,0xBA77,0x0089,0x0085,0x0083,0xBA76,0xF3FC,0x0083,0xBA75,0xBA74,0x0085,0x0083,0xF3F9, 0xF3FE,0x0083,0xBA73,0xBA72,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBA71,0xB4D8,0x0083,0xBA70,0xBA6F,0x0085, 0x0083,0xBA6E,0xBA6D,0x0083,0xBA6C,0xBA6B,0x0089,0x0085,0x0083,0xBA6A,0xBA69,0x0083,0xF3FA,0xBA68,0x0085,0x0083, 0xF3FB,0xBA67,0x0083,0xBA66,0xBA65,0x0091,0x0089,0x0085,0x0083,0xBA64,0xC5F1,0x0083,0xBA63,0xBA62,0x0085,0x0083, 0xBA61,0xBA60,0x0083,0xBA5F,0xC0E9,0x0089,0x0085,0x0083,0xBA5E,0xBA5D,0x0083,0xC0BA,0xBA5C,0x0085,0x0083,0xBA5B, 0xBA5A,0x0083,0xF3F8,0xBA59,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBA58,0xBA57,0x0083,0xF3F7,0xF3F6,0x0085,0x0083, 0xBA56,0xBA55,0x0083,0xBA54,0xB4DB,0x0089,0x0085,0x0083,0xBA53,0xBA52,0x0083,0xBA51,0xF3F4,0x0085,0x0083,0xBA50, 0xBA4F,0x0083,0xF3F5,0xB8DD,0x0091,0x0089,0x0085,0x0083,0xBA4E,0xBA4D,0x0083,0xBA4C,0xBA4B,0x0085,0x0083,0xBA4A, 0xC2A8,0x0083,0xBA49,0xF3F1,0x0089,0x0085,0x0083,0xBA48,0xBA47,0x0083,0xBA46,0xBA45,0x0085,0x0083,0xF3F3,0xBA44, 0x0083,0xBA43,0xBA42,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBA41,0xC6AA,0x0083,0xD7AD,0xBA40,0x0085, 0x0083,0xB9A0,0xB99F,0x0083,0xB99E,0xF3F2,0x0089,0x0085,0x0083,0xB99D,0xB99C,0x0083,0xB99B,0xB99A,0x0085,0x0083, 0xB999,0xB998,0x0083,0xB997,0xB996,0x0091,0x0089,0x0085,0x0083,0xF3E7,0xB995,0x0083,0xB994,0xB993,0x0085,0x0083, 0xF3F0,0xB992,0x0083,0xB991,0xCFE4,0x0089,0x0085,0x0083,0xB990,0xB98F,0x0083,0xB98E,0xBCFD,0x0085,0x0083,0xF3E8, 0xF3EF,0x0083,0xF3EC,0xC2E1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF3EA,0xF3E6,0x0083,0xF3E5,0xB98D,0x0085,0x0083, 0xB98C,0xB98B,0x0083,0xF3EE,0xB9DC,0x0089,0x0085,0x0083,0xB98A,0xB989,0x0083,0xB988,0xF3E9,0x0085,0x0083,0xF3ED, 0xB987,0x0083,0xB986,0xB985,0x0091,0x0089,0x0085,0x0083,0xB984,0xCBE3,0x0083,0xB983,0xBBFE,0x0085,0x0083,0xB2AD, 0xB982,0x0083,0xB981,0xB980,0x0089,0x0085,0x0083,0xF3E4,0xB97E,0x0083,0xB97D,0xB9BF,0x0085,0x0083,0xB97C,0xB97B, 0x0083,0xB97A,0xB979,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB978,0xB977,0x0083,0xB976,0xF3EB,0x0085,0x0083, 0xB975,0xB974,0x0083,0xB973,0xB972,0x0089,0x0085,0x0083,0xBCF2,0xB971,0x0083,0xC7A9,0xB970,0x0085,0x0083,0xB96F, 0xF3E0,0x0083,0xB96E,0xB3EF,0x0091,0x0089,0x0085,0x0083,0xB96D,0xBFEA,0x0083,0xB96C,0xF3DB,0x0085,0x0083,0xB96B, 0xB96A,0x0083,0xF3E2,0xF3E3,0x0089,0x0085,0x0083,0xB969,0xB968,0x0083,0xF3DF,0xB967,0x0085,0x0083,0xB966,0xB965, 0x0083,0xB964,0xB963,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB962,0xB961,0x0083,0xB960,0xB95F,0x0085,0x0083,0xB95E, 0xB95D,0x0083,0xF3E1,0xB95C,0x0089,0x0085,0x0083,0xF3DE,0xB95B,0x0083,0xB95A,0xF3DD,0x0085,0x0083,0xB959,0xC9B8, 0x0083,0xF3D9,0xB958,0x0091,0x0089,0x0085,0x0083,0xF3D8,0xB957,0x0083,0xB2DF,0xB956,0x0085,0x0083,0xB4F0,0xB955, 0x0083,0xCDB2,0xD6FE,0x0089,0x0085,0x0083,0xBFF0,0xB7A4,0x0083,0xB954,0xB953,0x0085,0x0083,0xF3DC,0xBDEE,0x0083, 0xB952,0xB5C8,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xB951,0x0083,0xF3CC,0xB950,0x0085,0x0083,0xF3DA, 0xB94F,0x0083,0xB94E,0xB94D,0x0089,0x0085,0x0083,0xB94C,0xB94B,0x0083,0xB94A,0xF3D6,0x0085,0x0083,0xB949,0xC1FD, 0x0083,0xB948,0xBCE3,0x0091,0x0089,0x0085,0x0083,0xB947,0xF3CD,0x0083,0xB946,0xB945,0x0085,0x0083,0xB944,0xB943, 0x0083,0xF3D5,0xB942,0x0089,0x0085,0x0083,0xF3D1,0xB941,0x0083,0xB940,0xF3D0,0x0085,0x0083,0xB8A0,0xB5DA,0x0083, 0xF3CA,0xF3CE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB89F,0xB1BF,0x0083,0xB89E,0xB7FB,0x0085,0x0083,0xF3D3,0xF3D4, 0x0083,0xB89D,0xB89C,0x0089,0x0085,0x0083,0xB89B,0xF3D2,0x0083,0xB89A,0xF3D7,0x0085,0x0083,0xB899,0xB898,0x0083, 0xB5D1,0xB897,0x0091,0x0089,0x0085,0x0083,0xF3CF,0xB896,0x0083,0xB895,0xB894,0x0085,0x0083,0xF3C8,0xB1CA,0x0083, 0xB893,0xB892,0x0089,0x0085,0x0083,0xD0A6,0xB891,0x0083,0xF3CB,0xB890,0x0085,0x0083,0xB88F,0xB88E,0x0083,0xCBF1, 0xF3C9,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB88D,0xF3C5,0x0083,0xB88C,0xB0CA,0x0085,0x0083,0xB88B,0xF3C7, 0x0083,0xF3C6,0xB88A,0x0089,0x0085,0x0083,0xB889,0xB888,0x0083,0xB8CD,0xB887,0x0085,0x0083,0xF3C4,0xB886,0x0083, 0xB885,0xF3C3,0x0091,0x0089,0x0085,0x0083,0xD6F1,0xB884,0x0083,0xB883,0xB882,0x0085,0x0083,0xB881,0xB880,0x0083, 0xB87E,0xB87D,0x0089,0x0085,0x0083,0xB87C,0xB87B,0x0083,0xB6CB,0xB87A,0x0085,0x0083,0xBDDF,0xB879,0x0083,0xB878, 0xB877,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB876,0xB875,0x0083,0xB874,0xF1B5,0x0085,0x0083,0xCDAF,0xB873,0x0083, 0xBFA2,0xB872,0x0089,0x0085,0x0083,0xB871,0xD5C2,0x0083,0xBEB9,0xBEBA,0x0085,0x0083,0xB870,0xB86F,0x0083,0xB86E, 0xB86D,0x0091,0x0089,0x0085,0x0083,0xD5BE,0xB86C,0x0083,0xB86B,0xCAFA,0x0085,0x0083,0xB86A,0xB869,0x0083,0xB868, 0xB867,0x0089,0x0085,0x0083,0xB866,0xB865,0x0083,0xB864,0xB863,0x0085,0x0083,0xB862,0xB861,0x0083,0xC1A2,0xB860, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB85F,0xB85E,0x0083,0xB85D,0xB85C,0x0085,0x0083,0xB85B,0xB85A, 0x0083,0xB859,0xB858,0x0089,0x0085,0x0083,0xB857,0xB856,0x0083,0xC1FE,0xB855,0x0085,0x0083,0xB854,0xB853,0x0083, 0xB852,0xB851,0x0091,0x0089,0x0085,0x0083,0xB850,0xB84F,0x0083,0xB84E,0xB84D,0x0085,0x0083,0xB84C,0xB84B,0x0083, 0xF1C1,0xB84A,0x0089,0x0085,0x0083,0xB849,0xB848,0x0083,0xB847,0xB846,0x0085,0x0083,0xF1C0,0xF1BE,0x0083,0xB845, 0xB844,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB843,0xF1BF,0x0083,0xB842,0xF1BC,0x0085,0x0083,0xBFFA,0xB841,0x0083, 0xB840,0xB7A0,0x0089,0x0085,0x0083,0xB79F,0xF1BD,0x0083,0xBFDF,0xB79E,0x0085,0x0083,0xCED1,0xB4DC,0x0083,0xB79D, 0xB79C,0x0091,0x0089,0x0085,0x0083,0xB79B,0xBEBD,0x0083,0xB4B0,0xBDD1,0x0085,0x0083,0xF1BB,0xB79A,0x0083,0xB799, 0xD6CF,0x0089,0x0085,0x0083,0xD2A4,0xB798,0x0083,0xB797,0xB796,0x0085,0x0083,0xC7CF,0xB795,0x0083,0xB794,0xB793, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB792,0xF1BA,0x0083,0xB791,0xF1B9,0x0085,0x0083,0xB790,0xD5AD,0x0083, 0xC7D4,0xB78F,0x0089,0x0085,0x0083,0xCDBB,0xF1B8,0x0083,0xB4A9,0xB78E,0x0085,0x0083,0xB78D,0xB78C,0x0083,0xB78B, 0xBFD5,0x0091,0x0089,0x0085,0x0083,0xF1B7,0xF1B6,0x0083,0xC7EE,0xBEBF,0x0085,0x0083,0xB78A,0xD1A8,0x0083,0xB789, 0xB788,0x0089,0x0085,0x0083,0xB787,0xF0A6,0x0083,0xB786,0xB785,0x0085,0x0083,0xB784,0xB783,0x0083,0xB782,0xB781, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB780,0xB77E,0x0083,0xB77D,0xB77C,0x0085,0x0083,0xB77B,0xB77A,0x0083,0xB779, 0xB778,0x0089,0x0085,0x0083,0xB777,0xB776,0x0083,0xB775,0xB774,0x0085,0x0083,0xB773,0xB772,0x0083,0xB771,0xB770, 0x0091,0x0089,0x0085,0x0083,0xB76F,0xB76E,0x0083,0xCBEB,0xB76D,0x0085,0x0083,0xB76C,0xB76B,0x0083,0xB76A,0xB769, 0x0089,0x0085,0x0083,0xF0A3,0xB768,0x0083,0xB767,0xB766,0x0085,0x0083,0xB765,0xB764,0x0083,0xB763,0xB762,0x027F, 0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xB761,0x0083,0xB760,0xB75F,0x0085,0x0083,0xC4C2,0xB75E,0x0083, 0xB75D,0xB75C,0x0089,0x0085,0x0083,0xB75B,0xB75A,0x0083,0xB759,0xB8E5,0x0085,0x0083,0xB758,0xBBFC,0x0083,0xBCDA, 0xB5BE,0x0091,0x0089,0x0085,0x0083,0xB757,0xF0A1,0x0083,0xB756,0xF0A2,0x0085,0x0083,0xB755,0xB754,0x0083,0xB753, 0xCEC8,0x0089,0x0085,0x0083,0xB752,0xB751,0x0083,0xB750,0xB74F,0x0085,0x0083,0xB74E,0xB74D,0x0083,0xB74C,0xB74B, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB74A,0xB749,0x0083,0xB748,0xB747,0x0085,0x0083,0xB746,0xB745,0x0083,0xB744, 0xF6D5,0x0089,0x0085,0x0083,0xB743,0xB742,0x0083,0xB3ED,0xB741,0x0085,0x0083,0xEFFD,0xB740,0x0083,0xB6A0,0xB69F, 0x0091,0x0089,0x0085,0x0083,0xD6C9,0xB69E,0x0083,0xB69D,0xB0DE,0x0085,0x0083,0xB69C,0xB69B,0x0083,0xEFFE,0xB69A, 0x0089,0x0085,0x0083,0xB699,0xB698,0x0083,0xB697,0xB696,0x0085,0x0083,0xCBB0,0xC9D4,0x0083,0xB695,0xB3CC,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB694,0xB693,0x0083,0xB692,0xB691,0x0085,0x0083,0xEFF9,0xB690,0x0083,0xB68F, 0xEFFB,0x0089,0x0085,0x0083,0xEFFC,0xB68E,0x0083,0xCFA1,0xB68D,0x0085,0x0083,0xB68C,0xBBE0,0x0083,0xB68B,0xD2C6, 0x0091,0x0089,0x0085,0x0083,0xB68A,0xB689,0x0083,0xBDD5,0xB688,0x0085,0x0083,0xB687,0xB686,0x0083,0xB685,0xB684, 0x0089,0x0085,0x0083,0xB683,0xB682,0x0083,0xB3C6,0xBBFD,0x0085,0x0083,0xB681,0xEFF6,0x0083,0xB680,0xEFF8,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB67E,0xD6C8,0x0083,0xB67D,0xD1ED,0x0085,0x0083,0xC7D8,0xB67C,0x0083,0xB3D3,0xEFF7, 0x0089,0x0085,0x0083,0xB67B,0xB67A,0x0083,0xB679,0xD7E2,0x0085,0x0083,0xB678,0xB677,0x0083,0xB676,0xB675,0x0091, 0x0089,0x0085,0x0083,0xB674,0xB673,0x0083,0xC3D8,0xB672,0x0085,0x0083,0xB671,0xEFF5,0x0083,0xB670,0xB66F,0x0089, 0x0085,0x0083,0xC3EB,0xBFC6,0x0083,0xB66E,0xB66D,0x0085,0x0083,0xB66C,0xD6D6,0x0083,0xB66B,0xC7EF,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB66A,0xB1FC,0x0083,0xB669,0xB668,0x0085,0x0083,0xB8D1,0xB667,0x0083,0xB666, 0xCDBA,0x0089,0x0085,0x0083,0xB665,0xCBBD,0x0083,0xD0E3,0xB664,0x0085,0x0083,0xBACC,0xC7DD,0x0083,0xB663,0xC0EB, 0x0091,0x0089,0x0085,0x0083,0xD8AE,0xD3ED,0x0083,0xB662,0xB661,0x0085,0x0083,0xB660,0xB65F,0x0083,0xB65E,0xECFC, 0x0089,0x0085,0x0083,0xB65D,0xB65C,0x0083,0xB65B,0xB65A,0x0085,0x0083,0xB659,0xB658,0x0083,0xB657,0xB656,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB655,0xB654,0x0083,0xB653,0xECFB,0x0085,0x0083,0xB652,0xB651,0x0083,0xB650,0xB64F, 0x0089,0x0085,0x0083,0xB64E,0xB64D,0x0083,0xB64C,0xB64B,0x0085,0x0083,0xB64A,0xB649,0x0083,0xB648,0xB647,0x0091, 0x0089,0x0085,0x0083,0xECFA,0xB646,0x0083,0xB645,0xB644,0x0085,0x0083,0xB643,0xB642,0x0083,0xB641,0xB640,0x0089, 0x0085,0x0083,0xB5A0,0xB59F,0x0083,0xB59E,0xB8A3,0x0085,0x0083,0xB59D,0xB59C,0x0083,0xB59B,0xB59A,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xECF9,0xB599,0x0083,0xB598,0xB597,0x0085,0x0083,0xB596,0xECF8,0x0083,0xC2BB,0xB595, 0x0089,0x0085,0x0083,0xB594,0xBDFB,0x0083,0xD9F7,0xB593,0x0085,0x0083,0xB592,0xB591,0x0083,0xB590,0xB58F,0x0091, 0x0089,0x0085,0x0083,0xECF7,0xB58E,0x0083,0xBBF6,0xB5BB,0x0085,0x0083,0xB58D,0xB58C,0x0083,0xB58B,0xB58A,0x0089, 0x0085,0x0083,0xB589,0xB588,0x0083,0xB587,0xECF5,0x0085,0x0083,0xB586,0xBCC0,0x0083,0xB585,0xB584,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB583,0xB582,0x0083,0xC6B1,0xECF6,0x0085,0x0083,0xB581,0xCFE9,0x0083,0xB580,0xB57E,0x0089, 0x0085,0x0083,0xECF2,0xB57D,0x0083,0xECF4,0xCBEE,0x0085,0x0083,0xC9F1,0xD7A3,0x0083,0xECEF,0xECEE,0x0091,0x0089, 0x0085,0x0083,0xECF1,0xB57C,0x0083,0xB57B,0xECF3,0x0085,0x0083,0xD7E6,0xB57A,0x0083,0xB579,0xECF0,0x0089,0x0085, 0x0083,0xB578,0xB577,0x0083,0xB576,0xB575,0x0085,0x0083,0xB574,0xB573,0x0083,0xB572,0xB571,0x0181,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB570,0xECED,0x0083,0xC6ED,0xB56F,0x0085,0x0083,0xECEC,0xB56E,0x0083,0xB56D, 0xB56C,0x0089,0x0085,0x0083,0xB56B,0xC6EE,0x0083,0xECEB,0xB56A,0x0085,0x0083,0xC9E7,0xB569,0x0083,0xC0F1,0xECEA, 0x0091,0x0089,0x0085,0x0083,0xCABE,0xB568,0x0083,0xB567,0xB566,0x0085,0x0083,0xB565,0xB564,0x0083,0xEDE7,0xB563, 0x0089,0x0085,0x0083,0xB562,0xB561,0x0083,0xB560,0xB55F,0x0085,0x0083,0xB55E,0xB55D,0x0083,0xB55C,0xB55B,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB55A,0xB559,0x0083,0xB558,0xB557,0x0085,0x0083,0xB556,0xB555,0x0083,0xEDE5,0xB554, 0x0089,0x0085,0x0083,0xB553,0xB552,0x0083,0xB551,0xB550,0x0085,0x0083,0xEDE6,0xB54F,0x0083,0xB54E,0xB54D,0x0091, 0x0089,0x0085,0x0083,0xB54C,0xB54B,0x0083,0xB54A,0xB549,0x0085,0x0083,0xB548,0xB547,0x0083,0xB546,0xEDE4,0x0089, 0x0085,0x0083,0xB545,0xB544,0x0083,0xB543,0xB542,0x0085,0x0083,0xB541,0xB540,0x0083,0xB4A0,0xB49F,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB49E,0xB49D,0x0083,0xB49C,0xB49B,0x0085,0x0083,0xB49A,0xEDE2,0x0083,0xB499,0xB498, 0x0089,0x0085,0x0083,0xB497,0xBDB8,0x0083,0xB496,0xB495,0x0085,0x0083,0xB494,0xB493,0x0083,0xB492,0xB491,0x0091, 0x0089,0x0085,0x0083,0xBBC7,0xB490,0x0083,0xB48F,0xC1D7,0x0085,0x0083,0xB48E,0xB48D,0x0083,0xEDE3,0xB48C,0x0089, 0x0085,0x0083,0xEDE1,0xB48B,0x0083,0xB48A,0xB489,0x0085,0x0083,0xB488,0xB487,0x0083,0xEDE0,0xB486,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB485,0xB484,0x0083,0xC4A5,0xB483,0x0085,0x0083,0xB482,0xB481,0x0083,0xB480,0xB47E,0x0089, 0x0085,0x0083,0xB47D,0xB47C,0x0083,0xB47B,0xB47A,0x0085,0x0083,0xB479,0xB478,0x0083,0xB477,0xB476,0x0091,0x0089, 0x0085,0x0083,0xB475,0xEDDE,0x0083,0xB474,0xB473,0x0085,0x0083,0xB472,0xBFC4,0x0083,0xEDDD,0xB471,0x0089,0x0085, 0x0083,0xB470,0xB46F,0x0083,0xC5CD,0xB46E,0x0085,0x0083,0xB46D,0xB46C,0x0083,0xB46B,0xB4E8,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xC0DA,0xEDDF,0x0083,0xB46A,0xB469,0x0085,0x0083,0xB468,0xB0F5,0x0083,0xB467,0xB466, 0x0089,0x0085,0x0083,0xB465,0xB4C5,0x0083,0xB464,0xB463,0x0085,0x0083,0xC4EB,0xB462,0x0083,0xB461,0xB460,0x0091, 0x0089,0x0085,0x0083,0xB45F,0xEDDB,0x0083,0xB45E,0xB45D,0x0085,0x0083,0xB45C,0xB45B,0x0083,0xB2EA,0xCCBC,0x0089, 0x0085,0x0083,0xEDDA,0xBCEE,0x0083,0xC5F6,0xB45A,0x0085,0x0083,0xB459,0xB458,0x0083,0xB457,0xB456,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB455,0xB454,0x0083,0xB453,0xB1CC,0x0085,0x0083,0xB452,0xEDDC,0x0083,0xB451,0xEDD9,0x0089, 0x0085,0x0083,0xB450,0xEDD8,0x0083,0xB44F,0xB5FA,0x0085,0x0083,0xB44E,0xB44D,0x0083,0xEDD7,0xEDD3,0x0091,0x0089, 0x0085,0x0083,0xEDD5,0xB44C,0x0083,0xB5E2,0xCDEB,0x0085,0x0083,0xB44B,0xB44A,0x0083,0xB449,0xEDD4,0x0089,0x0085, 0x0083,0xB448,0xB1AE,0x0083,0xB447,0xB446,0x0085,0x0083,0xCBE9,0xB0AD,0x0083,0xC2B5,0xB445,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB444,0xB5EF,0x0083,0xB443,0xEDD6,0x0085,0x0083,0xB442,0xB441,0x0083,0xB440,0xB3A0,0x0089, 0x0085,0x0083,0xB39F,0xB39E,0x0083,0xB39D,0xB39C,0x0085,0x0083,0xB39B,0xB39A,0x0083,0xC5F0,0xB399,0x0091,0x0089, 0x0085,0x0083,0xB398,0xB397,0x0083,0xB396,0xBCEF,0x0085,0x0083,0xB395,0xB394,0x0083,0xB393,0xB392,0x0089,0x0085, 0x0083,0xB391,0xB390,0x0083,0xB38F,0xB38E,0x0085,0x0083,0xC8B7,0xEDCB,0x0083,0xD3B2,0xC1F2,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xEDD2,0xB38D,0x0083,0xB38C,0xB38B,0x0085,0x0083,0xB38A,0xB389,0x0083,0xB388,0xB387,0x0089,0x0085, 0x0083,0xB386,0xB385,0x0083,0xB384,0xB383,0x0085,0x0083,0xB382,0xCFF5,0x0083,0xB381,0xB380,0x0091,0x0089,0x0085, 0x0083,0xB37E,0xB37D,0x0083,0xB37C,0xEDCD,0x0085,0x0083,0xEDCC,0xCBB6,0x0083,0xB37B,0xB37A,0x0089,0x0085,0x0083, 0xCEF8,0xB379,0x0083,0xEDCF,0xB378,0x0085,0x0083,0xEDCA,0xB377,0x0083,0xEDD1,0xB376,0x087B,0x047D,0x027F,0x017F, 0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xB375,0x0083,0xB374,0xB373,0x0085,0x0083,0xEDD0,0xB372,0x0083,0xB9E8, 0xB371,0x0089,0x0085,0x0083,0xB370,0xB36F,0x0083,0xB36E,0xB4A1,0x0085,0x0083,0xB36D,0xC0F9,0x0083,0xB36C,0xEDC5, 0x0091,0x0089,0x0085,0x0083,0xEDC3,0xEDC2,0x0083,0xEDC1,0xD4D2,0x0085,0x0083,0xC9E9,0xB36B,0x0083,0xB36A,0xC6C6, 0x0089,0x0085,0x0083,0xB369,0xB368,0x0083,0xB367,0xC5E9,0x0085,0x0083,0xB366,0xB365,0x0083,0xEDBE,0xEDC7,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB364,0xB363,0x0083,0xEDC9,0xB362,0x0085,0x0083,0xD5E8,0xEDCE,0x0083,0xEDC6,0xB361, 0x0089,0x0085,0x0083,0xEDC8,0xB360,0x0083,0xB35F,0xB35E,0x0085,0x0083,0xEDC4,0xB35D,0x0083,0xEDC0,0xEDBF,0x0091, 0x0089,0x0085,0x0083,0xB35C,0xD1E2,0x0083,0xB35B,0xEDBB,0x0085,0x0083,0xEDBA,0xD7A9,0x0083,0xB35A,0xD1D0,0x0089, 0x0085,0x0083,0xB359,0xC5F8,0x0083,0xEDBC,0xB358,0x0085,0x0083,0xB357,0xB356,0x0083,0xBFB3,0xC6F6,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB355,0xB354,0x0083,0xEDB9,0xB353,0x0085,0x0083,0xB352,0xB351,0x0083,0xB350,0xB34F, 0x0089,0x0085,0x0083,0xB34E,0xC9B0,0x0083,0xC2EB,0xEDB8,0x0085,0x0083,0xBFF3,0xB7AF,0x0083,0xCEF9,0xB34D,0x0091, 0x0089,0x0085,0x0083,0xB34C,0xB34B,0x0083,0xB34A,0xEDB7,0x0085,0x0083,0xB349,0xEDB6,0x0083,0xB348,0xB347,0x0089, 0x0085,0x0083,0xCAAF,0xB346,0x0083,0xB345,0xB344,0x0085,0x0083,0xB343,0xB0AB,0x0083,0xB6CC,0xEFF3,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xBDC3,0xB342,0x0083,0xBED8,0xB341,0x0085,0x0083,0xEFF2,0xB340,0x0083,0xD6AA,0xB2A0,0x0089, 0x0085,0x0083,0xD2D3,0xCAB8,0x0083,0xB29F,0xB29E,0x0085,0x0083,0xB29D,0xB29C,0x0083,0xB29B,0xF1E6,0x0091,0x0089, 0x0085,0x0083,0xC3AC,0xB29A,0x0083,0xB299,0xB298,0x0085,0x0083,0xB4A3,0xB297,0x0083,0xB296,0xB295,0x0089,0x0085, 0x0083,0xB294,0xB293,0x0083,0xB292,0xB291,0x0085,0x0083,0xB290,0xB28F,0x0083,0xDBC7,0xB28E,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xB28D,0xB28C,0x0083,0xB28B,0xB28A,0x0085,0x0083,0xB289,0xB288,0x0083,0xB287,0xB286, 0x0089,0x0085,0x0083,0xB285,0xB284,0x0083,0xB283,0xB282,0x0085,0x0083,0xF6C4,0xB281,0x0083,0xEEAD,0xB280,0x0091, 0x0089,0x0085,0x0083,0xD5B0,0xB27E,0x0083,0xB27D,0xB27C,0x0085,0x0083,0xB27B,0xB27A,0x0083,0xEEAC,0xB279,0x0089, 0x0085,0x0083,0xCDAB,0xB278,0x0083,0xB277,0xEEAB,0x0085,0x0083,0xB276,0xB275,0x0083,0xB274,0xCBB2,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB273,0xB5C9,0x0083,0xD6F5,0xB272,0x0085,0x0083,0xC7C6,0xB271,0x0083,0xC6B3,0xB270,0x0089, 0x0085,0x0083,0xB26F,0xDEAB,0x0083,0xB26E,0xEEAA,0x0085,0x0083,0xEEA9,0xB26D,0x0083,0xB26C,0xB26B,0x0091,0x0089, 0x0085,0x0083,0xB26A,0xB269,0x0083,0xB268,0xB267,0x0085,0x0083,0xB266,0xB265,0x0083,0xB264,0xB263,0x0089,0x0085, 0x0083,0xB262,0xC2F7,0x0083,0xEEA8,0xB261,0x0085,0x0083,0xB260,0xCFB9,0x0083,0xEEA4,0xEEA7,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB25F,0xB25E,0x0083,0xB25D,0xB25C,0x0085,0x0083,0xB25B,0xB25A,0x0083,0xB3F2,0xC3E9,0x0089, 0x0085,0x0083,0xB259,0xB258,0x0083,0xB257,0xEEA6,0x0085,0x0083,0xEEA3,0xD8BA,0x0083,0xEEA5,0xB256,0x0091,0x0089, 0x0085,0x0083,0xB255,0xB254,0x0083,0xB6C3,0xB253,0x0085,0x0083,0xB252,0xB251,0x0083,0xB250,0xB24F,0x0089,0x0085, 0x0083,0xB24E,0xB24D,0x0083,0xB24C,0xB24B,0x0085,0x0083,0xB24A,0xB249,0x0083,0xB248,0xB2C7,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xBDDE,0xB247,0x0083,0xB246,0xEDFE,0x0085,0x0083,0xB245,0xC4C0,0x0083,0xEEA2,0xB244,0x0089,0x0085, 0x0083,0xB6BD,0xEEA1,0x0083,0xCBAF,0xB243,0x0085,0x0083,0xB242,0xB241,0x0083,0xB240,0xB1A0,0x0091,0x0089,0x0085, 0x0083,0xBEA6,0xEDFD,0x0083,0xB19F,0xB19E,0x0085,0x0083,0xB19D,0xB19C,0x0083,0xB19B,0xB19A,0x0089,0x0085,0x0083, 0xB199,0xB198,0x0083,0xEDFA,0xEDF9,0x0085,0x0083,0xB197,0xB196,0x0083,0xB195,0xB194,0x017F,0x00FF,0x00BF,0x009F, 0x008F,0x0087,0x0083,0xB193,0x0083,0xB192,0xB191,0x0085,0x0083,0xB190,0xEDFB,0x0083,0xB18F,0xB18E,0x0089,0x0085, 0x0083,0xB18D,0xEDFC,0x0083,0xB18C,0xD5F6,0x0085,0x0083,0xD7C5,0xB18B,0x0083,0xB18A,0xB189,0x0091,0x0089,0x0085, 0x0083,0xD1DB,0xB188,0x0083,0xCCF7,0xB187,0x0085,0x0083,0xEDF8,0xBEEC,0x0083,0xBFF4,0xEDF7,0x0089,0x0085,0x0083, 0xB186,0xB185,0x0083,0xB184,0xB183,0x0085,0x0083,0xB182,0xC3D0,0x0083,0xB181,0xEDF5,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xB180,0xB17E,0x0083,0xB17D,0xD1A3,0x0085,0x0083,0xD5A3,0xB17C,0x0083,0xEDF6,0xB17B,0x0089,0x0085,0x0083, 0xB17A,0xB179,0x0083,0xEDF3,0xB178,0x0085,0x0083,0xC3DF,0xD5E6,0x0083,0xB177,0xB176,0x0091,0x0089,0x0085,0x0083, 0xB175,0xB174,0x0083,0xEDF2,0xEDF4,0x0085,0x0083,0xB173,0xB172,0x0083,0xB171,0xB170,0x0089,0x0085,0x0083,0xB16F, 0xB16E,0x0083,0xB16D,0xB16C,0x0085,0x0083,0xB16B,0xB16A,0x0083,0xB169,0xEDEE,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xB168,0xBFB4,0x0083,0xB167,0xC3BC,0x0085,0x0083,0xEDF1,0xEDF0,0x0083,0xB166,0xB165,0x0089,0x0085,0x0083, 0xEDED,0xB164,0x0083,0xB163,0xCAA1,0x0085,0x0083,0xB162,0xB161,0x0083,0xB6DC,0xB160,0x0091,0x0089,0x0085,0x0083, 0xC5CE,0xB15F,0x0083,0xB15E,0xEDEF,0x0085,0x0083,0xCFE0,0xB15D,0x0083,0xB15C,0xB15B,0x0089,0x0085,0x0083,0xD6B1, 0xB15A,0x0083,0xC3A4,0xEDEC,0x0085,0x0083,0xB159,0xB6A2,0x0083,0xC4BF,0xB158,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xB157,0xB156,0x0083,0xB155,0xB154,0x0085,0x0083,0xB153,0xB152,0x0083,0xB151,0xEEC2,0x0089,0x0085,0x0083,0xB150, 0xB14F,0x0083,0xB14E,0xB14D,0x0085,0x0083,0xB14C,0xC3CB,0x0083,0xB14B,0xB14A,0x0091,0x0089,0x0085,0x0083,0xB149, 0xCAA2,0x0083,0xB148,0xB147,0x0085,0x0083,0xC5CC,0xB5C1,0x0083,0xB8C7,0xB146,0x0089,0x0085,0x0083,0xBFF8,0xB145, 0x0083,0xBAD0,0xBCE0,0x0085,0x0083,0xD1CE,0xD5B5,0x0083,0xB0BB,0xEEC1,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xB144,0xB143,0x0083,0xD2E6,0xB142,0x0085,0x0083,0xD3AF,0xB141,0x0083,0xC5E8,0xD6D1,0x0089,0x0085,0x0083, 0xB140,0xB0A0,0x0083,0xD3DB,0xB09F,0x0085,0x0083,0xB09E,0xC3F3,0x0083,0xB09D,0xB09C,0x0091,0x0089,0x0085,0x0083, 0xB09B,0xB09A,0x0083,0xB099,0xB098,0x0085,0x0083,0xB097,0xB096,0x0083,0xB095,0xB094,0x0089,0x0085,0x0083,0xF1E5, 0xB093,0x0083,0xF1E4,0xD6E5,0x0085,0x0083,0xB092,0xB091,0x0083,0xC6A4,0xB090,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xB08F,0xB08E,0x0083,0xB08D,0xB08C,0x0085,0x0083,0xB08B,0xB08A,0x0083,0xB089,0xB088,0x0089,0x0085,0x0083,0xF0AB, 0xB087,0x0083,0xB086,0xB085,0x0085,0x0083,0xB084,0xB083,0x0083,0xB082,0xB081,0x0091,0x0089,0x0085,0x0083,0xB080, 0xB07E,0x0083,0xB07D,0xF0AA,0x0085,0x0083,0xB07C,0xB07B,0x0083,0xCDEE,0xB07A,0x0089,0x0085,0x0083,0xB079,0xF0A9, 0x0083,0xB078,0xB0A8,0x0085,0x0083,0xB077,0xB076,0x0083,0xF0A8,0xB075,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xB074,0xB8DE,0x0083,0xB073,0xB072,0x0085,0x0083,0xF0A7,0xBBCA,0x0083,0xBDD4,0xB071,0x0089,0x0085,0x0083,0xB5C4, 0xB070,0x0083,0xD4ED,0xB06F,0x0085,0x0083,0xB06E,0xB06D,0x0083,0xB0D9,0xB0D7,0x0091,0x0089,0x0085,0x0083,0xB06C, 0xB5C7,0x0083,0xB06B,0xB06A,0x0085,0x0083,0xB9EF,0xB069,0x0083,0xB068,0xB067,0x0089,0x0085,0x0083,0xB066,0xB065, 0x0083,0xB064,0xB063,0x0085,0x0083,0xB062,0xF1B3,0x0083,0xB061,0xB060,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB05F, 0xF1B2,0x0083,0xB05E,0xB05D,0x0085,0x0083,0xB05C,0xB05B,0x0083,0xB05A,0xB059,0x0089,0x0085,0x0083,0xB058,0xD1A2, 0x0083,0xB057,0xB056,0x0085,0x0083,0xB055,0xB054,0x0083,0xF1AE,0xB053,0x0091,0x0089,0x0085,0x0083,0xF1B0,0xB052, 0x0083,0xB051,0xB050,0x0085,0x0083,0xB04F,0xB04E,0x0083,0xF1B1,0xB04D,0x0089,0x0085,0x0083,0xF1AF,0xB04C,0x0083, 0xB04B,0xB04A,0x0085,0x0083,0xB049,0xB048,0x0083,0xB047,0xF1AD,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087, 0x0083,0xB0A9,0x0083,0xB046,0xB045,0x0085,0x0083,0xB044,0xB043,0x0083,0xB042,0xB041,0x0089,0x0085,0x0083,0xB040, 0xAFA0,0x0083,0xF1AA,0xAF9F,0x0085,0x0083,0xAF9E,0xF1A5,0x0083,0xF1A8,0xF1AB,0x0091,0x0089,0x0085,0x0083,0xAF9D, 0xF1A2,0x0083,0xAF9C,0xAF9B,0x0085,0x0083,0xAF9A,0xC8B3,0x0083,0xAF99,0xAF98,0x0089,0x0085,0x0083,0xF1A9,0xD5CE, 0x0083,0xF1AC,0xAF97,0x0085,0x0083,0xAF96,0xF1A7,0x0083,0xAF95,0xAF94,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF1A6, 0xAF93,0x0083,0xCCB1,0xB1F1,0x0085,0x0083,0xB4F1,0xAF92,0x0083,0xAF91,0xCADD,0x0089,0x0085,0x0083,0xF0FB,0xC1F6, 0x0083,0xAF90,0xF1A3,0x0085,0x0083,0xAF8F,0xF1A4,0x0083,0xCEC1,0xAF8E,0x0091,0x0089,0x0085,0x0083,0xAF8D,0xAF8C, 0x0083,0xF1A1,0xAF8B,0x0085,0x0083,0xF0FE,0xF0FC,0x0083,0xF0F9,0xAF8A,0x0089,0x0085,0x0083,0xF0FD,0xAF89,0x0083, 0xAF88,0xAF87,0x0085,0x0083,0xAF86,0xF0F5,0x0083,0xAF85,0xAF84,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAF83, 0xF0F8,0x0083,0xAF82,0xF0FA,0x0085,0x0083,0xAF81,0xAF80,0x0083,0xAF7E,0xAF7D,0x0089,0x0085,0x0083,0xF0F7,0xAF7C, 0x0083,0xF0F1,0xAF7B,0x0085,0x0083,0xB4E1,0xF0F6,0x0083,0xF0F4,0xAF7A,0x0091,0x0089,0x0085,0x0083,0xAF79,0xF0F3, 0x0083,0xAF78,0xAF77,0x0085,0x0083,0xB1D4,0xAF76,0x0083,0xAF75,0xAF74,0x0089,0x0085,0x0083,0xAF73,0xB3D5,0x0083, 0xAF72,0xAF71,0x0085,0x0083,0xF0F2,0xCCB5,0x0083,0xAF70,0xAF6F,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAF6E,0xAF6D, 0x0083,0xF0EF,0xBBBE,0x0085,0x0083,0xAF6C,0xF0EC,0x0083,0xF0F0,0xF0ED,0x0089,0x0085,0x0083,0xAF6B,0xF0EE,0x0083, 0xF0EB,0xC1A1,0x0085,0x0083,0xAF6A,0xAF69,0x0083,0xAF68,0xC6A6,0x0091,0x0089,0x0085,0x0083,0xAF67,0xAF66,0x0083, 0xCDB4,0xAF65,0x0085,0x0083,0xAF64,0xB6BB,0x0083,0xAF63,0xF0E9,0x0089,0x0085,0x0083,0xBADB,0xD6CC,0x0083,0xAF62, 0xD1F7,0x0085,0x0083,0xAF61,0xAF60,0x0083,0xAF5F,0xAF5E,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xF0EA, 0xAF5D,0x0083,0xAF5C,0xC8AC,0x0085,0x0083,0xBEB7,0xD3B8,0x0083,0xD6A2,0xAF5B,0x0089,0x0085,0x0083,0xB2A1,0xF0E4, 0x0083,0xF0E7,0xF0E8,0x0085,0x0083,0xAF5A,0xAF59,0x0083,0xAF58,0xBCB2,0x0091,0x0089,0x0085,0x0083,0xBED2,0xCCDB, 0x0083,0xAF57,0xAF56,0x0085,0x0083,0xD5EE,0xF0E3,0x0083,0xAF55,0xAF54,0x0089,0x0085,0x0083,0xB4C3,0xF0E2,0x0083, 0xF0E1,0xC6A3,0x0085,0x0083,0xF0E5,0xF0E6,0x0083,0xB7E8,0xB4AF,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAF53,0xF0DF, 0x0083,0xD2DF,0xAF52,0x0085,0x0083,0xAF51,0xAF50,0x0083,0xAF4F,0xAF4E,0x0089,0x0085,0x0083,0xBDEA,0xB0CC,0x0083, 0xF0E0,0xAF4D,0x0085,0x0083,0xD1F1,0xF0DD,0x0083,0xC5B1,0xAF4C,0x0091,0x0089,0x0085,0x0083,0xF0DE,0xAF4B,0x0083, 0xAF4A,0xBECE,0x0085,0x0083,0xB8ED,0xAF49,0x0083,0xC1C6,0xF0DC,0x0089,0x0085,0x0083,0xAF48,0xF0DB,0x0083,0xAF47, 0xF0DA,0x0085,0x0083,0xD2C9,0xAF46,0x0083,0xCAE8,0xAF45,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAF44,0xAF43, 0x0083,0xF1E2,0xAF42,0x0085,0x0083,0xAF41,0xAF40,0x0083,0xAEA0,0xBDAE,0x0089,0x0085,0x0083,0xAE9F,0xAE9E,0x0083, 0xEEB6,0xAE9D,0x0085,0x0083,0xAE9C,0xAE9B,0x0083,0xE7DC,0xAE9A,0x0091,0x0089,0x0085,0x0083,0xAE99,0xAE98,0x0083, 0xAE97,0xAE96,0x0085,0x0083,0xEEB5,0xBBFB,0x0083,0xAE95,0xAE94,0x0089,0x0085,0x0083,0xAE93,0xB3EB,0x0083,0xAE92, 0xEEB4,0x0085,0x0083,0xAE91,0xAE90,0x0083,0xAE8F,0xAE8E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAE8D,0xAE8C,0x0083, 0xAE8B,0xB7AC,0x0085,0x0083,0xAE8A,0xAE89,0x0083,0xAE88,0xC6E8,0x0089,0x0085,0x0083,0xC2D4,0xAE87,0x0083,0xAE86, 0xAE85,0x0085,0x0083,0xAE84,0xAE83,0x0083,0xAE82,0xAE81,0x0091,0x0089,0x0085,0x0083,0xAE80,0xD0F3,0x0083,0xEEB3, 0xDBCE,0x0085,0x0083,0xC1F4,0xAE7E,0x0083,0xAE7D,0xAE7C,0x0089,0x0085,0x0083,0xAE7B,0xC5CF,0x0083,0xAE7A,0xAE79, 0x0085,0x0083,0xAE78,0xAE77,0x0083,0xCEB7,0xEEB0,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAE76, 0xBDE7,0x0083,0xEEB1,0xAE75,0x0085,0x0083,0xAE74,0xEEB2,0x0083,0xAE73,0xAE72,0x0089,0x0085,0x0083,0xB3A9,0xAE71, 0x0083,0xAE70,0xAE6F,0x0085,0x0083,0xAE6E,0xEEAF,0x0083,0xAE6D,0xE7DE,0x0091,0x0089,0x0085,0x0083,0xAE6C,0xAE6B, 0x0083,0xBBAD,0xEEAE,0x0085,0x0083,0xAE6A,0xB5E9,0x0083,0xC4D0,0xAE69,0x0089,0x0085,0x0083,0xB5E7,0xAE68,0x0083, 0xC9EA,0xBCD7,0x0085,0x0083,0xD3C9,0xCCEF,0x0083,0xE5B8,0xAE67,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB1C2,0xF0AE, 0x0083,0xB8A6,0xAE66,0x0085,0x0083,0xCBA6,0xD3C3,0x0083,0xAE65,0xAE64,0x0089,0x0085,0x0083,0xC9FB,0xAE63,0x0083, 0xAE62,0xAE61,0x0085,0x0083,0xAE60,0xAE5F,0x0083,0xC9FA,0xAE5E,0x0091,0x0089,0x0085,0x0083,0xAE5D,0xCCF0,0x0083, 0xAE5C,0xC9F5,0x0085,0x0083,0xDFB0,0xB8CA,0x0083,0xAE5B,0xAE5A,0x0089,0x0085,0x0083,0xAE59,0xAE58,0x0083,0xEAB6, 0xAE57,0x0085,0x0083,0xEAB5,0xAE56,0x0083,0xEAB4,0xAE55,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDDF9,0xAE54, 0x0083,0xAE53,0xAE52,0x0085,0x0083,0xAE51,0xAE50,0x0083,0xAE4F,0xAE4E,0x0089,0x0085,0x0083,0xAE4D,0xD5E7,0x0083, 0xAE4C,0xAE4B,0x0085,0x0083,0xAE4A,0xAE49,0x0083,0xEAB3,0xAE48,0x0091,0x0089,0x0085,0x0083,0xAE47,0xAE46,0x0083, 0xAE45,0xAE44,0x0085,0x0083,0xAE43,0xAE42,0x0083,0xB4C9,0xC6BF,0x0089,0x0085,0x0083,0xAE41,0xEAB2,0x0083,0xAE40, 0xADA0,0x0085,0x0083,0xAD9F,0xAD9E,0x0083,0xEAB1,0xCECD,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAD9D,0xAD9C,0x0083, 0xAD9B,0xAD9A,0x0085,0x0083,0xAD99,0xAD98,0x0083,0xAD97,0xCDDF,0x0089,0x0085,0x0083,0xAD96,0xC8BF,0x0083,0xB0EA, 0xC6B0,0x0085,0x0083,0xAD95,0xF0AD,0x0083,0xAD94,0xF0AC,0x0091,0x0089,0x0085,0x0083,0xAD93,0xB9CF,0x0083,0xAD92, 0xAD91,0x0085,0x0083,0xAD90,0xAD8F,0x0083,0xAD8E,0xAD8D,0x0089,0x0085,0x0083,0xAD8C,0xAD8B,0x0083,0xAD8A,0xE8B6, 0x0085,0x0083,0xAD89,0xAD88,0x0083,0xAD87,0xAD86,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAD85,0xAD84, 0x0083,0xAD83,0xAD82,0x0085,0x0083,0xAD81,0xAD80,0x0083,0xAD7E,0xAD7D,0x0089,0x0085,0x0083,0xAD7C,0xAD7B,0x0083, 0xAD7A,0xAD79,0x0085,0x0083,0xAD78,0xAD77,0x0083,0xAD76,0xAD75,0x0091,0x0089,0x0085,0x0083,0xAD74,0xAD73,0x0083, 0xAD72,0xE8B7,0x0085,0x0083,0xAD71,0xAD70,0x0083,0xAD6F,0xAD6E,0x0089,0x0085,0x0083,0xAD6D,0xAD6C,0x0083,0xAD6B, 0xAD6A,0x0085,0x0083,0xAD69,0xAD68,0x0083,0xAD67,0xAD66,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAD65,0xAD64,0x0083, 0xAD63,0xAD62,0x0085,0x0083,0xE8B3,0xE8B2,0x0083,0xE8B5,0xAD61,0x0089,0x0085,0x0083,0xAD60,0xAD5F,0x0083,0xAD5E, 0xAD5D,0x0085,0x0083,0xAD5C,0xAD5B,0x0083,0xAD5A,0xE8B1,0x0091,0x0089,0x0085,0x0083,0xAD59,0xE8AB,0x0083,0xAD58, 0xAD57,0x0085,0x0083,0xAD56,0xAD55,0x0083,0xAD54,0xAD53,0x0089,0x0085,0x0083,0xAD52,0xAD51,0x0083,0xAD50,0xAD4F, 0x0085,0x0083,0xAD4E,0xE8B4,0x0083,0xAD4D,0xE8AC,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAD4C,0xAD4B,0x0083, 0xE8B0,0xAD4A,0x0085,0x0083,0xAD49,0xAD48,0x0083,0xE8AF,0xAD47,0x0089,0x0085,0x0083,0xAD46,0xAD45,0x0083,0xC1A7, 0xAD44,0x0085,0x0083,0xE8AE,0xE8AD,0x0083,0xAD43,0xE8AA,0x0091,0x0089,0x0085,0x0083,0xAD42,0xAD41,0x0083,0xAD40, 0xACA0,0x0085,0x0083,0xAC9F,0xAC9E,0x0083,0xE8A8,0xD1FE,0x0089,0x0085,0x0083,0xAC9D,0xAC9C,0x0083,0xAC9B,0xAC9A, 0x0085,0x0083,0xAC99,0xB9E5,0x0083,0xAC98,0xAC97,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE8A9,0xAC96,0x0083,0xAC95, 0xAC94,0x0085,0x0083,0xAC93,0xAC92,0x0083,0xAC91,0xAC90,0x0089,0x0085,0x0083,0xAC8F,0xAC8E,0x0083,0xAC8D,0xAC8C, 0x0085,0x0083,0xAC8B,0xAC8A,0x0083,0xC9AA,0xC8F0,0x0091,0x0089,0x0085,0x0083,0xAC89,0xE8A4,0x0083,0xE7F8,0xBAF7, 0x0085,0x0083,0xE8A7,0xAC88,0x0083,0xE8A5,0xAC87,0x0089,0x0085,0x0083,0xE8A6,0xAC86,0x0083,0xAC85,0xAC84,0x0085, 0x0083,0xAC83,0xAC82,0x0083,0xAC81,0xAC80,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xAC7E, 0x0083,0xAC7D,0xAC7C,0x0085,0x0083,0xAC7B,0xAC7A,0x0083,0xAC79,0xAC78,0x0089,0x0085,0x0083,0xAC77,0xAC76,0x0083, 0xAC75,0xAC74,0x0085,0x0083,0xAC73,0xE8A3,0x0083,0xAC72,0xAC71,0x0091,0x0089,0x0085,0x0083,0xAC70,0xAC6F,0x0083, 0xC7ED,0xAC6E,0x0085,0x0083,0xAC6D,0xAC6C,0x0083,0xAC6B,0xAC6A,0x0089,0x0085,0x0083,0xC5C3,0xC5FD,0x0083,0xC7D9, 0xC1D5,0x0085,0x0083,0xAC69,0xAC68,0x0083,0xE7FC,0xAC67,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE7FD,0xAC66,0x0083, 0xE7FE,0xAC65,0x0085,0x0083,0xE7F7,0xAC64,0x0083,0xE7FB,0xAC63,0x0089,0x0085,0x0083,0xE7F9,0xE7FA,0x0083,0xAC62, 0xAC61,0x0085,0x0083,0xD7C1,0xAC60,0x0083,0xAC5F,0xAC5E,0x0091,0x0089,0x0085,0x0083,0xAC5D,0xAC5C,0x0083,0xAC5B, 0xE8A1,0x0085,0x0083,0xE8A2,0xAC5A,0x0083,0xAC59,0xAC58,0x0089,0x0085,0x0083,0xAC57,0xAC56,0x0083,0xAC55,0xAC54, 0x0085,0x0083,0xAC53,0xAC52,0x0083,0xCBF6,0xE7F6,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAC51,0xAC50,0x0083, 0xAC4F,0xAC4E,0x0085,0x0083,0xE7F0,0xC1F0,0x0083,0xAC4D,0xAC4C,0x0089,0x0085,0x0083,0xC0ED,0xC0C5,0x0083,0xAC4B, 0xC7F2,0x0085,0x0083,0xAC4A,0xAC49,0x0083,0xAC48,0xAC47,0x0091,0x0089,0x0085,0x0083,0xAC46,0xAC45,0x0083,0xAC44, 0xAC43,0x0085,0x0083,0xAC42,0xAC41,0x0083,0xAC40,0xABA0,0x0089,0x0085,0x0083,0xAB9F,0xAB9E,0x0083,0xAB9D,0xAB9C, 0x0085,0x0083,0xE7F5,0xAB9B,0x0083,0xAB9A,0xAB99,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAB98,0xB0E0,0x0083,0xAB97, 0xAB96,0x0085,0x0083,0xAB95,0xE7F1,0x0083,0xAB94,0xE7F2,0x0089,0x0085,0x0083,0xAB93,0xE7ED,0x0083,0xAB92,0xAB91, 0x0085,0x0083,0xAB90,0xAB8F,0x0083,0xD6E9,0xAB8E,0x0091,0x0089,0x0085,0x0083,0xE7F3,0xAB8D,0x0083,0xAB8C,0xAB8B, 0x0085,0x0083,0xAB8A,0xE7EE,0x0083,0xAB89,0xAB88,0x0089,0x0085,0x0083,0xAB87,0xAB86,0x0083,0xAB85,0xAB84,0x0085, 0x0083,0xAB83,0xE7E7,0x0083,0xB7A9,0xE7E5,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAB82,0xD5E4,0x0083, 0xAB81,0xAB80,0x0085,0x0083,0xC9BA,0xE7EB,0x0083,0xE7EC,0xAB7E,0x0089,0x0085,0x0083,0xAB7D,0xAB7C,0x0083,0xAB7B, 0xAB7A,0x0085,0x0083,0xE7E6,0xAB79,0x0083,0xE7EA,0xAB78,0x0091,0x0089,0x0085,0x0083,0xAB77,0xAB76,0x0083,0xAB75, 0xB2A3,0x0085,0x0083,0xE7F4,0xAB74,0x0083,0xAB73,0xE7E8,0x0089,0x0085,0x0083,0xAB72,0xAB71,0x0083,0xAB70,0xE7E9, 0x0085,0x0083,0xC1E1,0xAB6F,0x0083,0xCFD6,0xBBB7,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE7E2,0xAB6E,0x0083,0xAB6D, 0xC3B5,0x0085,0x0083,0xAB6C,0xCDE6,0x0083,0xAB6B,0xAB6A,0x0089,0x0085,0x0083,0xAB69,0xAB68,0x0083,0xAB67,0xAB66, 0x0085,0x0083,0xE7E3,0xAB65,0x0083,0xAB64,0xE7E4,0x0091,0x0089,0x0085,0x0083,0xAB63,0xAB62,0x0083,0xAB61,0xC2EA, 0x0085,0x0083,0xAB60,0xAB5F,0x0083,0xAB5E,0xAB5D,0x0089,0x0085,0x0083,0xBEC1,0xAB5C,0x0083,0xAB5B,0xAB5A,0x0085, 0x0083,0xAB59,0xE7E1,0x0083,0xAB58,0xAB57,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE7E0,0xAB56,0x0083,0xAB55, 0xCDF5,0x0085,0x0083,0xAB54,0xD3F1,0x0083,0xAB53,0xC2CA,0x0089,0x0085,0x0083,0xAB52,0xAB51,0x0083,0xD0FE,0xAB50, 0x0085,0x0083,0xAB4F,0xAB4E,0x0083,0xAB4D,0xAB4C,0x0091,0x0089,0x0085,0x0083,0xE2B5,0xAB4B,0x0083,0xAB4A,0xAB49, 0x0085,0x0083,0xAB48,0xAB47,0x0083,0xAB46,0xAB45,0x0089,0x0085,0x0083,0xAB44,0xAB43,0x0083,0xAB42,0xAB41,0x0085, 0x0083,0xAB40,0xAAA0,0x0083,0xAA9F,0xE2B4,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAA9E,0xCCA1,0x0083,0xE2B3,0xAA9D, 0x0085,0x0083,0xAA9C,0xAA9B,0x0083,0xAA9A,0xAA99,0x0089,0x0085,0x0083,0xAA98,0xAA97,0x0083,0xAA96,0xAA95,0x0085, 0x0083,0xAA94,0xAA93,0x0083,0xE2B2,0xAA92,0x0091,0x0089,0x0085,0x0083,0xAA91,0xAA90,0x0083,0xAA8F,0xAA8E,0x0085, 0x0083,0xAA8D,0xAA8C,0x0083,0xAA8B,0xE2B1,0x0089,0x0085,0x0083,0xAA8A,0xAA89,0x0083,0xAA88,0xAA87,0x0085,0x0083, 0xE9E1,0xAA86,0x0083,0xE2AF,0xAA85,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xAA84,0x0083,0xE2B0,0xAA83, 0x0085,0x0083,0xAA82,0xAA81,0x0083,0xAA80,0xAA7E,0x0089,0x0085,0x0083,0xAA7D,0xAA7C,0x0083,0xAA7B,0xAA7A,0x0085, 0x0083,0xAA79,0xAA78,0x0083,0xAA77,0xAA76,0x0091,0x0089,0x0085,0x0083,0xD4B3,0xBBAB,0x0083,0xAA75,0xAA74,0x0085, 0x0083,0xAA73,0xAA72,0x0083,0xE2AA,0xE2AD,0x0089,0x0085,0x0083,0xE9E0,0xAA71,0x0083,0xAA70,0xBAEF,0x0085,0x0083, 0xAA6F,0xAA6E,0x0083,0xE2AE,0xAA6D,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAA6C,0xCFD7,0x0083,0xAA6B,0xE2AC,0x0085, 0x0083,0xC3A8,0xD6ED,0x0083,0xD0C9,0xAA6A,0x0089,0x0085,0x0083,0xAA69,0xAA68,0x0083,0xE2AB,0xAA67,0x0085,0x0083, 0xAA66,0xE2A9,0x0083,0xE2A4,0xAA65,0x0091,0x0089,0x0085,0x0083,0xAA64,0xE2A6,0x0083,0xE2A7,0xB2C2,0x0085,0x0083, 0xC3CD,0xAA63,0x0083,0xAA62,0xAA61,0x0089,0x0085,0x0083,0xE2A2,0xB2FE,0x0083,0xE2A8,0xAA60,0x0085,0x0083,0xE2A3, 0xAA5F,0x0083,0xAA5E,0xAA5D,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xAA5C,0xC1D4,0x0083,0xAA5B,0xAA5A,0x0085, 0x0083,0xAA59,0xE2A5,0x0083,0xAA58,0xAA57,0x0089,0x0085,0x0083,0xAA56,0xAA55,0x0083,0xAA54,0xAA53,0x0085,0x0083, 0xE1FD,0xAA52,0x0083,0xE1FB,0xAA51,0x0091,0x0089,0x0085,0x0083,0xAA50,0xAA4F,0x0083,0xAA4E,0xC0C7,0x0085,0x0083, 0xE2A1,0xE1FE,0x0083,0xAA4D,0xC0EA,0x0089,0x0085,0x0083,0xE1FA,0xAA4C,0x0083,0xAA4B,0xE1F9,0x0085,0x0083,0xE1FC, 0xE1F8,0x0083,0xD3FC,0xD5F8,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE1F6,0xCAA8,0x0083,0xCFC1,0xB6C0,0x0085,0x0083, 0xAA4A,0xAA49,0x0083,0xE1F7,0xE1F5,0x0089,0x0085,0x0083,0xAA48,0xAA47,0x0083,0xAA46,0xAA45,0x0085,0x0083,0xAA44, 0xAA43,0x0083,0xBDC6,0xBADD,0x0091,0x0089,0x0085,0x0083,0xAA42,0xC4FC,0x0083,0xAA41,0xAA40,0x0085,0x0083,0xA0FE, 0xA0FD,0x0083,0xBED1,0xA0FC,0x0089,0x0085,0x0083,0xB9B7,0xA0FB,0x0083,0xA0FA,0xA0F9,0x0085,0x0083,0xA0F8,0xE1F4, 0x0083,0xA0F7,0xBAFC,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xA0F6,0xE1F2,0x0083,0xE1F3,0xA0F5,0x0085, 0x0083,0xA0F4,0xA0F3,0x0083,0xA0F2,0xB1B7,0x0089,0x0085,0x0083,0xA0F1,0xA0F0,0x0083,0xA0EF,0xB5D2,0x0085,0x0083, 0xE1F0,0xBFF1,0x0083,0xE1F1,0xA0EE,0x0091,0x0089,0x0085,0x0083,0xA0ED,0xA0EC,0x0083,0xA0EB,0xA0EA,0x0085,0x0083, 0xA0E9,0xA0E8,0x0083,0xD3CC,0xE1EF,0x0089,0x0085,0x0083,0xE1EE,0xD7B4,0x0083,0xA0E7,0xE1ED,0x0085,0x0083,0xA0E6, 0xA0E5,0x0083,0xA0E4,0xE1EC,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB7B8,0xA0E3,0x0083,0xE1EB,0xC8AE,0x0085,0x0083, 0xA0E2,0xA0E1,0x0083,0xA0E0,0xA0DF,0x0089,0x0085,0x0083,0xA0DE,0xA0DD,0x0083,0xA0DC,0xA0DB,0x0085,0x0083,0xA0DA, 0xA0D9,0x0083,0xA0D8,0xA0D7,0x0091,0x0089,0x0085,0x0083,0xEAF1,0xA0D6,0x0083,0xA0D5,0xA0D4,0x0085,0x0083,0xA0D3, 0xA0D2,0x0083,0xA0D1,0xA0D0,0x0089,0x0085,0x0083,0xA0CF,0xA0CE,0x0083,0xA0CD,0xA0CC,0x0085,0x0083,0xA0CB,0xEAFB, 0x0083,0xA0CA,0xA0C9,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEAFA,0xA0C8,0x0083,0xEAF9,0xA0C7,0x0085,0x0083, 0xEAF8,0xB6BF,0x0083,0xA0C6,0xA0C5,0x0089,0x0085,0x0083,0xA0C4,0xA0C3,0x0083,0xA0C2,0xEAF7,0x0085,0x0083,0xA0C1, 0xA0C0,0x0083,0xC0E7,0xCFAC,0x0091,0x0089,0x0085,0x0083,0xEAF6,0xEAF5,0x0083,0xA0BF,0xA0BE,0x0085,0x0083,0xA0BD, 0xCEFE,0x0083,0xCCD8,0xA0BC,0x0089,0x0085,0x0083,0xA0BB,0xA0BA,0x0083,0xC7A3,0xA0B9,0x0085,0x0083,0xA0B8,0xC9FC, 0x0083,0xA0B7,0xA0B6,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEAF4,0xEAF0,0x0083,0xA0B5,0xA0B4,0x0085,0x0083,0xA0B3, 0xA0B2,0x0083,0xCEEF,0xA0B1,0x0089,0x0085,0x0083,0xC4C1,0xEAF3,0x0083,0xA0B0,0xA0AF,0x0085,0x0083,0xA0AE,0xC0CE, 0x0083,0xC4B5,0xA0AD,0x0091,0x0089,0x0085,0x0083,0xC4B2,0xA0AC,0x0083,0xEAF2,0xA0AB,0x0085,0x0083,0xC5A3,0xA0AA, 0x0083,0xD1C0,0xA0A9,0x0089,0x0085,0x0083,0xA0A8,0xEBBB,0x0083,0xA0A7,0xA0A6,0x0085,0x0083,0xA0A5,0xEBBA,0x0083, 0xA0A4,0xA0A3,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xA0A2,0x0083,0xA0A1,0xEBB9,0x0085,0x0083, 0xC5C6,0xA0A0,0x0083,0xA09F,0xA09E,0x0089,0x0085,0x0083,0xB0E6,0xC6AC,0x0083,0xA09D,0xA09C,0x0085,0x0083,0xA09B, 0xA09A,0x0083,0xA099,0xA098,0x0091,0x0089,0x0085,0x0083,0xA097,0xE3DD,0x0083,0xA096,0xCBAC,0x0085,0x0083,0xA095, 0xD8B3,0x0083,0xA094,0xB5F9,0x0089,0x0085,0x0083,0xB0D6,0xD2AF,0x0083,0xB8B8,0xBEF4,0x0085,0x0083,0xA093,0xA092, 0x0083,0xA091,0xB0AE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEBBC,0xA090,0x0083,0xA08F,0xA08E,0x0085,0x0083,0xC5C0, 0xA08D,0x0083,0xD7A6,0xA08C,0x0089,0x0085,0x0083,0xECE0,0xA08B,0x0083,0xA08A,0xA089,0x0085,0x0083,0xA088,0xA087, 0x0083,0xA086,0xA085,0x0091,0x0089,0x0085,0x0083,0xA084,0xA083,0x0083,0xA082,0xECDF,0x0085,0x0083,0xA081,0xA080, 0x0083,0xA07E,0xA07D,0x0089,0x0085,0x0083,0xA07C,0xA07B,0x0083,0xA07A,0xA079,0x0085,0x0083,0xA078,0xA077,0x0083, 0xA076,0xA075,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xA074,0xA073,0x0083,0xA072,0xA071,0x0085,0x0083,0xA070, 0xA06F,0x0083,0xA06E,0xA06D,0x0089,0x0085,0x0083,0xA06C,0xA06B,0x0083,0xB1AC,0xA06A,0x0085,0x0083,0xA069,0xA068, 0x0083,0xA067,0xA066,0x0091,0x0089,0x0085,0x0083,0xA065,0xA064,0x0083,0xA063,0xA062,0x0085,0x0083,0xA061,0xA060, 0x0083,0xA05F,0xECDE,0x0089,0x0085,0x0083,0xA05E,0xA05D,0x0083,0xA05C,0xA05B,0x0085,0x0083,0xA05A,0xA059,0x0083, 0xA058,0xA057,0x00A1,0x0091,0x0089,0x0085,0x0083,0xA056,0xA055,0x0083,0xDBC6,0xA054,0x0085,0x0083,0xA053,0xA052, 0x0083,0xA051,0xA050,0x0089,0x0085,0x0083,0xA04F,0xECDD,0x0083,0xA04E,0xD4EF,0x0085,0x0083,0xA04D,0xA04C,0x0083, 0xA04B,0xA04A,0x0091,0x0089,0x0085,0x0083,0xECDB,0xA049,0x0083,0xA048,0xA047,0x0085,0x0083,0xA046,0xA045,0x0083, 0xA044,0xA043,0x0089,0x0085,0x0083,0xA042,0xA041,0x0083,0xA040,0xD1E0,0x0085,0x0083,0xECDC,0x9FFE,0x0083,0x9FFD, 0x9FFC,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9FFB,0x9FFA,0x0083,0xC1C7,0x9FF9,0x0085,0x0083,0x9FF8, 0x9FF7,0x0083,0x9FF6,0x9FF5,0x0089,0x0085,0x0083,0x9FF4,0x9FF3,0x0083,0x9FF2,0x9FF1,0x0085,0x0083,0x9FF0,0xC8BC, 0x0083,0x9FEF,0x9FEE,0x0091,0x0089,0x0085,0x0083,0x9FED,0x9FEC,0x0083,0x9FEB,0x9FEA,0x0085,0x0083,0x9FE9,0x9FE8, 0x0083,0x9FE7,0xECE4,0x0089,0x0085,0x0083,0x9FE6,0x9FE5,0x0083,0x9FE4,0xECD8,0x0085,0x0083,0x9FE3,0xECD7,0x0083, 0x9FE2,0x9FE1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9FE0,0x9FDF,0x0083,0x9FDE,0x9FDD,0x0085,0x0083,0xB0BE,0x9FDC, 0x0083,0x9FDB,0x9FDA,0x0089,0x0085,0x0083,0xECD9,0x9FD9,0x0083,0x9FD8,0x9FD7,0x0085,0x0083,0x9FD6,0x9FD5,0x0083, 0x9FD4,0x9FD3,0x0091,0x0089,0x0085,0x0083,0xECDA,0xCAEC,0x0083,0x9FD2,0x9FD1,0x0085,0x0083,0x9FD0,0x9FCF,0x0083, 0x9FCE,0xCEF5,0x0089,0x0085,0x0083,0xECD6,0x9FCD,0x0083,0x9FCC,0x9FCB,0x0085,0x0083,0xC8DB,0x9FCA,0x0083,0x9FC9, 0x9FC8,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9FC7,0xD1AC,0x0083,0x9FC6,0x9FC5,0x0085,0x0083,0x9FC4,0x9FC3, 0x0083,0xD0DC,0x9FC2,0x0089,0x0085,0x0083,0x9FC1,0x9FC0,0x0083,0x9FBF,0x9FBE,0x0085,0x0083,0xCFA8,0x9FBD,0x0083, 0x9FBC,0x9FBB,0x0091,0x0089,0x0085,0x0083,0x9FBA,0x9FB9,0x0083,0x9FB8,0xC9BF,0x0085,0x0083,0x9FB7,0x9FB6,0x0083, 0xECD5,0x9FB5,0x0089,0x0085,0x0083,0xECD4,0x9FB4,0x0083,0x9FB3,0x9FB2,0x0085,0x0083,0x9FB1,0xECCE,0x0083,0xECD2, 0x9FB0,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9FAF,0x9FAE,0x0083,0xD6F3,0x9FAD,0x0085,0x0083,0x9FAC,0x9FAB,0x0083, 0x9FAA,0x9FA9,0x0089,0x0085,0x0083,0xECD0,0xD5D5,0x0083,0xECE3,0x9FA8,0x0085,0x0083,0xC3BA,0x9FA7,0x0083,0x9FA6, 0x9FA5,0x0091,0x0089,0x0085,0x0083,0x9FA4,0x9FA3,0x0083,0xC9B7,0x9FA2,0x0085,0x0083,0xECCF,0x9FA1,0x0083,0x9FA0, 0x9F9F,0x0089,0x0085,0x0083,0x9F9E,0x9F9D,0x0083,0x9F9C,0x9F9B,0x0085,0x0083,0x9F9A,0x9F99,0x0083,0x9F98,0x9F97, 0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9F96,0x9F95,0x0083,0xBCE5,0x9F94,0x0085,0x0083,0xBBCD, 0x9F93,0x0083,0xECD3,0x9F92,0x0089,0x0085,0x0083,0x9F91,0x9F90,0x0083,0x9F8F,0xECD1,0x0085,0x0083,0x9F8E,0x9F8D, 0x0083,0x9F8C,0x9F8B,0x0091,0x0089,0x0085,0x0083,0x9F8A,0x9F89,0x0083,0x9F88,0x9F87,0x0085,0x0083,0x9F86,0x9F85, 0x0083,0x9F84,0x9F83,0x0089,0x0085,0x0083,0x9F82,0x9F81,0x0083,0xC8BB,0x9F80,0x0085,0x0083,0x9F7E,0x9F7D,0x0083, 0x9F7C,0xECCD,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD1E6,0xECCC,0x0083,0x9F7B,0x9F7A,0x0085,0x0083,0x9F79,0x9F78, 0x0083,0x9F77,0x9F76,0x0089,0x0085,0x0083,0x9F75,0x9F74,0x0083,0xBDB9,0x9F73,0x0085,0x0083,0x9F72,0x9F71,0x0083, 0x9F70,0x9F6F,0x0091,0x0089,0x0085,0x0083,0x9F6E,0x9F6D,0x0083,0x9F6C,0x9F6B,0x0085,0x0083,0x9F6A,0x9F69,0x0083, 0xB7D9,0xB1BA,0x0089,0x0085,0x0083,0xECE2,0x9F68,0x0083,0xECCB,0xBBC0,0x0085,0x0083,0x9F67,0xECCA,0x0083,0x9F66, 0x9F65,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xECC9,0x9F64,0x0083,0x9F63,0x9F62,0x0085,0x0083,0x9F61,0x9F60, 0x0083,0xBAB8,0xD1C9,0x0089,0x0085,0x0083,0x9F5F,0x9F5E,0x0083,0x9F5D,0x9F5C,0x0085,0x0083,0x9F5B,0x9F5A,0x0083, 0x9F59,0x9F58,0x0091,0x0089,0x0085,0x0083,0x9F57,0x9F56,0x0083,0x9F55,0xB7E9,0x0085,0x0083,0x9F54,0x9F53,0x0083, 0x9F52,0xC5EB,0x0089,0x0085,0x0083,0x9F51,0xCDE9,0x0083,0x9F50,0x9F4F,0x0085,0x0083,0x9F4E,0x9F4D,0x0083,0x9F4C, 0x9F4B,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9F4A,0xCFA9,0x0083,0x9F49,0xC8C8,0x0085,0x0083,0xBDFD,0xCCCC,0x0083, 0x9F48,0xBBE2,0x0089,0x0085,0x0083,0xECC7,0xC9D5,0x0083,0xB7B3,0x9F47,0x0085,0x0083,0xBFBE,0x9F46,0x0083,0x9F45, 0x9F44,0x0091,0x0089,0x0085,0x0083,0x9F43,0xD1CC,0x0083,0x9F42,0x9F41,0x0085,0x0083,0x9F40,0xD6F2,0x0083,0x9EFE, 0xC0D3,0x0089,0x0085,0x0083,0xBAE6,0x9EFD,0x0083,0x9EFC,0x9EFB,0x0085,0x0083,0x9EFA,0x9EF9,0x0083,0x9EF8,0x9EF7, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9EF6,0x9EF5,0x0083,0x9EF4,0x9EF3,0x0085,0x0083,0x9EF2,0x9EF1, 0x0083,0xECC8,0x9EF0,0x0089,0x0085,0x0083,0xC1D2,0x9EEF,0x0083,0x9EEE,0x9EED,0x0085,0x0083,0x9EEC,0xCCFE,0x0083, 0xC0C3,0xCBB8,0x0091,0x0089,0x0085,0x0083,0xECC3,0x9EEB,0x0083,0x9EEA,0xB3E3,0x0085,0x0083,0xC1B6,0xECC2,0x0083, 0x9EE9,0xB5E3,0x0089,0x0085,0x0083,0xD5A8,0xECC4,0x0083,0x9EE8,0x9EE7,0x0085,0x0083,0x9EE6,0xB1FE,0x0083,0x9EE5, 0xECC6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9EE4,0xBEBC,0x0083,0xC5DA,0xCCBF,0x0085,0x0083,0xBEE6,0xECC5,0x0083, 0x9EE3,0x9EE2,0x0089,0x0085,0x0083,0x9EE1,0x9EE0,0x0083,0x9EDF,0x9EDE,0x0085,0x0083,0x9EDD,0x9EDC,0x0083,0x9EDB, 0x9EDA,0x0091,0x0089,0x0085,0x0083,0x9ED9,0x9ED8,0x0083,0x9ED7,0xECC1,0x0085,0x0083,0xECBF,0x9ED6,0x0083,0x9ED5, 0xD6CB,0x0089,0x0085,0x0083,0x9ED4,0x9ED3,0x0083,0xECC0,0xBFBB,0x0085,0x0083,0xC8B2,0x9ED2,0x0083,0xB3B4,0x9ED1, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9ED0,0x9ECF,0x0083,0xD1D7,0x9ECE,0x0085,0x0083,0x9ECD,0x9ECC,0x0083, 0xB4B6,0xC2AF,0x0089,0x0085,0x0083,0x9ECB,0x9ECA,0x0083,0x9EC9,0xEAC1,0x0085,0x0083,0x9EC8,0x9EC7,0x0083,0x9EC6, 0x9EC5,0x0091,0x0089,0x0085,0x0083,0xECBE,0xB2D3,0x0083,0xD4D6,0x9EC4,0x0085,0x0083,0xD7C6,0x9EC3,0x0083,0x9EC2, 0x9EC1,0x0089,0x0085,0x0083,0xBEC4,0x9EC0,0x0083,0xD4EE,0xC1E9,0x0085,0x0083,0x9EBF,0x9EBE,0x0083,0x9EBD,0x9EBC, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xBBD2,0xB5C6,0x0083,0x9EBB,0xC3F0,0x0085,0x0083,0xECE1,0xBBF0,0x0083,0x9EBA, 0x9EB9,0x0089,0x0085,0x0083,0x9EB8,0x9EB7,0x0083,0x9EB6,0x9EB5,0x0085,0x0083,0x9EB4,0x9EB3,0x0083,0x9EB2,0x9EB1, 0x0091,0x0089,0x0085,0x0083,0x9EB0,0x9EAF,0x0083,0xE5B1,0x9EAE,0x0085,0x0083,0x9EAD,0x9EAC,0x0083,0x9EAB,0x9EAA, 0x0089,0x0085,0x0083,0x9EA9,0x9EA8,0x0083,0x9EA7,0x9EA6,0x0085,0x0083,0x9EA5,0x9EA4,0x0083,0x9EA3,0x9EA2,0x1075, 0x087B,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x9EA1,0x0083,0xE5B0,0x9EA0,0x0085,0x0083, 0x9E9F,0xB9E0,0x0083,0x9E9E,0x9E9D,0x0089,0x0085,0x0083,0x9E9C,0x9E9B,0x0083,0x9E9A,0x9E99,0x0085,0x0083,0x9E98, 0x9E97,0x0083,0x9E96,0x9E95,0x0091,0x0089,0x0085,0x0083,0x9E94,0x9E93,0x0083,0x9E92,0x9E91,0x0085,0x0083,0x9E90, 0x9E8F,0x0083,0x9E8E,0x9E8D,0x0089,0x0085,0x0083,0xE5AE,0x9E8C,0x0083,0x9E8B,0x9E8A,0x0085,0x0083,0xE5AF,0x9E89, 0x0083,0x9E88,0x9E87,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9E86,0x9E85,0x0083,0x9E84,0x9E83,0x0085,0x0083,0x9E82, 0x9E81,0x0083,0x9E80,0x9E7E,0x0089,0x0085,0x0083,0x9E7D,0x9E7C,0x0083,0x9E7B,0x9E7A,0x0085,0x0083,0x9E79,0x9E78, 0x0083,0xE5AC,0x9E77,0x0091,0x0089,0x0085,0x0083,0x9E76,0x9E75,0x0083,0x9E74,0x9E73,0x0085,0x0083,0x9E72,0x9E71, 0x0083,0xE5AD,0xE5AB,0x0089,0x0085,0x0083,0x9E70,0x9E6F,0x0083,0x9E6E,0x9E6D,0x0085,0x0083,0x9E6C,0x9E6B,0x0083, 0x9E6A,0x9E69,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC6D9,0x9E68,0x0083,0x9E67,0x9E66,0x0085,0x0083,0x9E65, 0x9E64,0x0083,0x9E63,0x9E62,0x0089,0x0085,0x0083,0x9E61,0x9E60,0x0083,0x9E5F,0x9E5E,0x0085,0x0083,0x9E5D,0x9E5C, 0x0083,0x9E5B,0x9E5A,0x0091,0x0089,0x0085,0x0083,0x9E59,0x9E58,0x0083,0x9E57,0x9E56,0x0085,0x0083,0x9E55,0x9E54, 0x0083,0x9E53,0x9E52,0x0089,0x0085,0x0083,0x9E51,0x9E50,0x0083,0x9E4F,0x9E4E,0x0085,0x0083,0x9E4D,0x9E4C,0x0083, 0x9E4B,0x9E4A,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9E49,0x9E48,0x0083,0xE5AA,0xE5A7,0x0085,0x0083,0x9E47,0x9E46, 0x0083,0x9E45,0x9E44,0x0089,0x0085,0x0083,0x9E43,0x9E42,0x0083,0x9E41,0x9E40,0x0085,0x0083,0x9DFE,0x9DFD,0x0083, 0x9DFC,0x9DFB,0x0091,0x0089,0x0085,0x0083,0xE5A6,0xE5A9,0x0083,0x9DFA,0xE5A8,0x0085,0x0083,0x9DF9,0x9DF8,0x0083, 0x9DF7,0x9DF6,0x0089,0x0085,0x0083,0x9DF5,0x9DF4,0x0083,0x9DF3,0x9DF2,0x0085,0x0083,0x9DF1,0x9DF0,0x0083,0x9DEF, 0xB1F4,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE4FE,0x9DEE,0x0083,0x9DED,0x9DEC,0x0085,0x0083,0x9DEB, 0x9DEA,0x0083,0x9DE9,0x9DE8,0x0089,0x0085,0x0083,0xE5A1,0x9DE7,0x0083,0x9DE6,0x9DE5,0x0085,0x0083,0x9DE4,0x9DE3, 0x0083,0x9DE2,0xE5A5,0x0091,0x0089,0x0085,0x0083,0x9DE1,0xBCA4,0x0083,0x9DE0,0x9DDF,0x0085,0x0083,0x9DDE,0x9DDD, 0x0083,0x9DDC,0x9DDB,0x0089,0x0085,0x0083,0xE5A3,0x9DDA,0x0083,0x9DD9,0xE5A4,0x0085,0x0083,0x9DD8,0x9DD7,0x0083, 0xB0C4,0x9DD6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9DD5,0x9DD4,0x0083,0x9DD3,0x9DD2,0x0085,0x0083,0x9DD1,0x9DD0, 0x0083,0x9DCF,0x9DCE,0x0089,0x0085,0x0083,0x9DCD,0x9DCC,0x0083,0xE5A2,0x9DCB,0x0085,0x0083,0x9DCA,0x9DC9,0x0083, 0x9DC8,0x9DC7,0x0091,0x0089,0x0085,0x0083,0xD4E8,0x9DC6,0x0083,0x9DC5,0x9DC4,0x0085,0x0083,0x9DC3,0xC0BD,0x0083, 0x9DC2,0x9DC1,0x0089,0x0085,0x0083,0x9DC0,0x9DBF,0x0083,0x9DBE,0x9DBD,0x0085,0x0083,0x9DBC,0x9DBB,0x0083,0x9DBA, 0x9DB9,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9DB8,0x9DB7,0x0083,0x9DB6,0xC5EC,0x0085,0x0083,0xE4F8,0xE4F9, 0x0083,0x9DB5,0x9DB4,0x0089,0x0085,0x0083,0xE4F7,0xB3BA,0x0083,0x9DB3,0x9DB2,0x0085,0x0083,0x9DB1,0xB3CE,0x0083, 0x9DB0,0x9DAF,0x0091,0x0089,0x0085,0x0083,0x9DAE,0x9DAD,0x0083,0x9DAC,0x9DAB,0x0085,0x0083,0x9DAA,0xE4FC,0x0083, 0x9DA9,0xE4FD,0x0089,0x0085,0x0083,0x9DA8,0xE4FA,0x0083,0x9DA7,0x9DA6,0x0085,0x0083,0x9DA5,0xE4F3,0x0083,0x9DA4, 0xE4FB,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9DA3,0x9DA2,0x0083,0x9DA1,0xB3B1,0x0085,0x0083,0xCCB6,0x9DA0,0x0083, 0x9D9F,0x9D9E,0x0089,0x0085,0x0083,0x9D9D,0x9D9C,0x0083,0x9D9B,0xC1CA,0x0085,0x0083,0x9D9A,0x9D99,0x0083,0x9D98, 0xE4EA,0x0091,0x0089,0x0085,0x0083,0x9D97,0x9D96,0x0083,0x9D95,0xC2BA,0x0085,0x0083,0x9D94,0xC7B1,0x0083,0x9D93, 0x9D92,0x0089,0x0085,0x0083,0x9D91,0xC5CB,0x0083,0x9D90,0x9D8F,0x0085,0x0083,0x9D8E,0x9D8D,0x0083,0x9D8C,0x9D8B, 0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x9D8A,0x0083,0x9D89,0x9D88,0x0085,0x0083,0x9D87,0xCEAB,0x0083, 0x9D86,0xE4F2,0x0089,0x0085,0x0083,0x9D85,0x9D84,0x0083,0x9D83,0xE4EC,0x0085,0x0083,0xE4EB,0x9D82,0x0083,0x9D81, 0x9D80,0x0091,0x0089,0x0085,0x0083,0x9D7E,0x9D7D,0x0083,0x9D7C,0x9D7B,0x0085,0x0083,0xD1FA,0x9D7A,0x0083,0x9D79, 0x9D78,0x0089,0x0085,0x0083,0x9D77,0x9D76,0x0083,0x9D75,0x9D74,0x0085,0x0083,0xE4F1,0x9D73,0x0083,0x9D72,0xD5C4, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x9D71,0xCAFE,0x0083,0x9D70,0xE4F0,0x0085,0x0083,0x9D6F,0xE4DD,0x0083,0x9D6E, 0xC2FE,0x0089,0x0085,0x0083,0xE4F4,0xE4F6,0x0083,0x9D6D,0x9D6C,0x0085,0x0083,0x9D6B,0x9D6A,0x0083,0xE4ED,0x9D69, 0x0091,0x0089,0x0085,0x0083,0x9D68,0x9D67,0x0083,0xC4AE,0x9D66,0x0085,0x0083,0x9D65,0x9D64,0x0083,0x9D63,0x9D62, 0x0089,0x0085,0x0083,0x9D61,0x9D60,0x0083,0x9D5F,0x9D5E,0x0085,0x0083,0x9D5D,0xE4EE,0x0083,0xD1DD,0xC0EC,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x9D5C,0x9D5B,0x0083,0x9D5A,0xC2A9,0x0085,0x0083,0x9D59,0x9D58,0x0083,0x9D57, 0x9D56,0x0089,0x0085,0x0083,0x9D55,0xE4F5,0x0083,0x9D54,0x9D53,0x0085,0x0083,0xC6E1,0x9D52,0x0083,0x9D51,0x9D50, 0x0091,0x0089,0x0085,0x0083,0xC6AF,0x9D4F,0x0083,0x9D4E,0x9D4D,0x0085,0x0083,0x9D4C,0x9D4B,0x0083,0x9D4A,0x9D49, 0x0089,0x0085,0x0083,0x9D48,0xE4EF,0x0083,0x9D47,0x9D46,0x0085,0x0083,0x9D45,0x9D44,0x0083,0xB5CE,0x9D43,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x9D42,0x9D41,0x0083,0x9D40,0x9CFE,0x0085,0x0083,0x9CFD,0x9CFC,0x0083,0x9CFB,0x9CFA, 0x0089,0x0085,0x0083,0x9CF9,0xCCB2,0x0083,0xB1F5,0x9CF8,0x0085,0x0083,0xC2D0,0xC0C4,0x0083,0xC2CB,0x9CF7,0x0091, 0x0089,0x0085,0x0083,0xE4DE,0xC2FA,0x0083,0xE4DC,0xE4D9,0x0085,0x0083,0xD6CD,0x9CF6,0x0083,0x9CF5,0x9CF4,0x0089, 0x0085,0x0083,0xB9F6,0x9CF3,0x0083,0x9CF2,0xE4E4,0x0085,0x0083,0x9CF1,0xEBF8,0x0083,0xCCCF,0xD7D2,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x9CF0,0xBBAC,0x0083,0x9CEF,0xE4E6,0x0085,0x0083,0x9CEE,0x9CED,0x0083,0x9CEC, 0xD7CC,0x0089,0x0085,0x0083,0x9CEB,0x9CEA,0x0083,0x9CE9,0xB5E1,0x0085,0x0083,0x9CE8,0x9CE7,0x0083,0x9CE6,0x9CE5, 0x0091,0x0089,0x0085,0x0083,0xE4E8,0xB3FC,0x0083,0x9CE4,0x9CE3,0x0085,0x0083,0x9CE2,0xE4E1,0x0083,0x9CE1,0xE4E2, 0x0089,0x0085,0x0083,0xC4E7,0x9CE0,0x0083,0x9CDF,0xE4E3,0x0085,0x0083,0xC8DC,0x9CDE,0x0083,0xE4E5,0x9CDD,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xE4D1,0xE4DA,0x0083,0x9CDC,0xCBDD,0x0085,0x0083,0x9CDB,0x9CDA,0x0083,0x9CD9,0x9CD8, 0x0089,0x0085,0x0083,0xCFAA,0x9CD7,0x0083,0x9CD6,0xE4E0,0x0085,0x0083,0x9CD5,0xE4DF,0x0083,0x9CD4,0x9CD3,0x0091, 0x0089,0x0085,0x0083,0xD2E7,0x9CD2,0x0083,0x9CD1,0xE4E9,0x0085,0x0083,0x9CD0,0x9CCF,0x0083,0xC1EF,0x9CCE,0x0089, 0x0085,0x0083,0x9CCD,0x9CCC,0x0083,0xE4DB,0x9CCB,0x0085,0x0083,0x9CCA,0x9CC9,0x0083,0x9CC8,0x9CC7,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x9CC6,0x9CC5,0x0083,0xD4B4,0xE4E7,0x0085,0x0083,0x9CC4,0x9CC3,0x0083,0x9CC2,0x9CC1, 0x0089,0x0085,0x0083,0x9CC0,0xB8C8,0x0083,0x9CBF,0x9CBE,0x0085,0x0083,0xE4D3,0xBDA6,0x0083,0x9CBD,0xC0A3,0x0091, 0x0089,0x0085,0x0083,0x9CBC,0x9CBB,0x0083,0x9CBA,0xCAAA,0x0085,0x0083,0xCDE5,0x9CB9,0x0083,0x9CB8,0x9CB7,0x0089, 0x0085,0x0083,0x9CB6,0x9CB5,0x0083,0x9CB4,0x9CB3,0x0085,0x0083,0x9CB2,0x9CB1,0x0083,0x9CB0,0x9CAF,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x9CAE,0x9CAD,0x0083,0x9CAC,0x9CAB,0x0085,0x0083,0xE4CE,0x9CAA,0x0083,0x9CA9,0xE4D0,0x0089, 0x0085,0x0083,0x9CA8,0x9CA7,0x0083,0x9CA6,0x9CA5,0x0085,0x0083,0x9CA4,0x9CA3,0x0083,0x9CA2,0x9CA1,0x0091,0x0089, 0x0085,0x0083,0x9CA0,0x9C9F,0x0083,0x9C9E,0xE4D2,0x0085,0x0083,0x9C9D,0x9C9C,0x0083,0x9C9B,0xD5BF,0x0089,0x0085, 0x0083,0x9C9A,0x9C99,0x0083,0xCFE6,0x9C98,0x0085,0x0083,0xBAFE,0x9C97,0x0083,0xE4D5,0xE4D4,0x027F,0x017F,0x00FF, 0x00BF,0x009F,0x008F,0x0087,0x0083,0x9C96,0x0083,0x9C95,0x9C94,0x0085,0x0083,0x9C93,0xE4CF,0x0083,0xCDC4,0x9C92, 0x0089,0x0085,0x0083,0x9C91,0x9C90,0x0083,0x9C8F,0x9C8E,0x0085,0x0083,0x9C8D,0x9C8C,0x0083,0x9C8B,0xE4D8,0x0091, 0x0089,0x0085,0x0083,0xC5C8,0x9C8A,0x0083,0x9C89,0x9C88,0x0085,0x0083,0x9C87,0x9C86,0x0083,0x9C85,0x9C84,0x0089, 0x0085,0x0083,0x9C83,0xC3EC,0x0083,0x9C82,0xD3CE,0x0085,0x0083,0x9C81,0x9C80,0x0083,0x9C7E,0xBFCA,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x9C7D,0xE4D6,0x0083,0x9C7C,0x9C7B,0x0085,0x0083,0xB8DB,0x9C7A,0x0083,0xCEBC,0x9C79,0x0089, 0x0085,0x0083,0xE4CD,0x9C78,0x0083,0xCEC2,0x9C77,0x0085,0x0083,0x9C76,0x9C75,0x0083,0xE4D7,0xB2B3,0x0091,0x0089, 0x0085,0x0083,0xD4FC,0x9C74,0x0083,0xB6C9,0xC7FE,0x0085,0x0083,0x9C73,0x9C72,0x0083,0xD3E5,0x9C71,0x0089,0x0085, 0x0083,0x9C70,0xE4BE,0x0083,0x9C6F,0x9C6E,0x0085,0x0083,0xC9F8,0xE4C9,0x0083,0x9C6D,0xD3E6,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x9C6C,0x9C6B,0x0083,0xE4C5,0xBDA5,0x0085,0x0083,0x9C6A,0xE4C2,0x0083,0xD7D5,0xE4CB,0x0089, 0x0085,0x0083,0x9C69,0xD4A8,0x0083,0x9C68,0x9C67,0x0085,0x0083,0x9C66,0x9C65,0x0083,0xC7E5,0x9C64,0x0091,0x0089, 0x0085,0x0083,0x9C63,0x9C62,0x0083,0x9C61,0x9C60,0x0085,0x0083,0x9C5F,0x9C5E,0x0083,0x9C5D,0xEDB5,0x0089,0x0085, 0x0083,0xCCED,0x9C5C,0x0083,0xD1CD,0x9C5B,0x0085,0x0083,0xBBEC,0x9C5A,0x0083,0x9C59,0x9C58,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xB4BE,0x9C57,0x0083,0xC9EE,0x9C56,0x0085,0x0083,0x9C55,0xBBB4,0x0083,0x9C54,0xB4E3,0x0089,0x0085, 0x0083,0xD2F9,0x9C53,0x0083,0x9C52,0x9C51,0x0085,0x0083,0x9C50,0xE4C6,0x0083,0x9C4F,0xD3D9,0x0091,0x0089,0x0085, 0x0083,0x9C4E,0x9C4D,0x0083,0xB5AD,0xE4C4,0x0085,0x0083,0x9C4C,0xE4C1,0x0083,0xE4C7,0x9C4B,0x0089,0x0085,0x0083, 0x9C4A,0x9C49,0x0083,0xE4C8,0xCCD4,0x0085,0x0083,0x9C48,0xC4D7,0x0083,0x9C47,0x9C46,0x0101,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x9C45,0x9C44,0x0083,0xCAE7,0x9C43,0x0085,0x0083,0x9C42,0x9C41,0x0083,0x9C40,0xCCCA,0x0089, 0x0085,0x0083,0xC1DC,0x9BFE,0x0083,0x9BFD,0x9BFC,0x0085,0x0083,0xE4BF,0xCFFD,0x0083,0xE4C0,0xD7CD,0x0091,0x0089, 0x0085,0x0083,0x9BFB,0x9BFA,0x0083,0x9BF9,0xB5ED,0x0085,0x0083,0xE4C3,0x9BF8,0x0083,0x9BF7,0x9BF6,0x0089,0x0085, 0x0083,0x9BF5,0x9BF4,0x0083,0x9BF3,0xBAD4,0x0085,0x0083,0x9BF2,0x9BF1,0x0083,0xBAAD,0x9BF0,0x00A1,0x0091,0x0089, 0x0085,0x0083,0x9BEF,0xD2BA,0x0083,0x9BEE,0x9BED,0x0085,0x0083,0xD1C4,0xE4CC,0x0083,0x9BEC,0x9BEB,0x0089,0x0085, 0x0083,0xE4CA,0xB8A2,0x0083,0xC9AC,0xD5C7,0x0085,0x0083,0xBDA7,0xC8F3,0x0083,0x9BEA,0xB5D3,0x0091,0x0089,0x0085, 0x0083,0xBBC1,0x9BE9,0x0083,0xCED0,0xE4B6,0x0085,0x0083,0xC1B0,0xE4B5,0x0083,0xC0D4,0x9BE8,0x0089,0x0085,0x0083, 0xCCCE,0x9BE7,0x0083,0x9BE6,0x9BE5,0x0085,0x0083,0x9BE4,0x9BE3,0x0083,0xCCE9,0xE4B9,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xE4B8,0x9BE2,0x0083,0xE4B3,0x9BE1,0x0085,0x0083,0x9BE0,0xCFD1,0x0083,0x9BDF,0xD3BF,0x0089,0x0085, 0x0083,0x9BDE,0x9BDD,0x0083,0xC9E6,0xCFFB,0x0085,0x0083,0x9BDC,0x9BDB,0x0083,0xC4F9,0x9BDA,0x0091,0x0089,0x0085, 0x0083,0x9BD9,0xCDBF,0x0083,0x9BD8,0x9BD7,0x0085,0x0083,0x9BD6,0x9BD5,0x0083,0x9BD4,0xE4BC,0x0089,0x0085,0x0083, 0x9BD3,0x9BD2,0x0083,0x9BD1,0xBDFE,0x0085,0x0083,0xBAA3,0x9BD0,0x0083,0x9BCF,0xD4A1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0x9BCE,0x9BCD,0x0083,0x9BCC,0x9BCB,0x0085,0x0083,0xE4B4,0xB8A1,0x0083,0x9BCA,0x9BC9,0x0089,0x0085,0x0083, 0x9BC8,0xC0CB,0x0083,0xBAC6,0x9BC7,0x0085,0x0083,0x9BC6,0xC6D6,0x0083,0x9BC5,0x9BC4,0x0091,0x0089,0x0085,0x0083, 0xE4BD,0x9BC3,0x0083,0x9BC2,0xE4BB,0x0085,0x0083,0x9BC1,0xE4B7,0x0083,0x9BC0,0xE4BA,0x0089,0x0085,0x0083,0x9BBF, 0xBFA3,0x0083,0xD5E3,0x9BBE,0x0085,0x0083,0x9BBD,0x9BBC,0x0083,0x9BBB,0xE4B1,0x0181,0x0101,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xC5A8,0xE4B0,0x0083,0xBBEB,0x9BBA,0x0085,0x0083,0xE4AF,0xBCC3,0x0083,0xE4AB,0x9BB9,0x0089, 0x0085,0x0083,0xB2E2,0xD7C7,0x0083,0x9BB8,0xE4A5,0x0085,0x0083,0xBDBD,0xBDAC,0x0083,0xC7B3,0x9BB7,0x0091,0x0089, 0x0085,0x0083,0xE4A4,0x9BB6,0x0083,0xC1F7,0x9BB5,0x0085,0x0083,0x9BB4,0xC5C9,0x0083,0xC7A2,0xCDDD,0x0089,0x0085, 0x0083,0xBBEE,0x9BB3,0x0083,0xE4A1,0x9BB2,0x0085,0x0083,0x9BB1,0x9BB0,0x0083,0xE4AD,0x9BAF,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xE4B2,0xD6DE,0x0083,0xB6FD,0x9BAE,0x0085,0x0083,0x9BAD,0xE4AC,0x0083,0x9BAC,0x9BAB,0x0089,0x0085, 0x0083,0xE4AA,0xBAE9,0x0083,0x9BAA,0x9BA9,0x0085,0x0083,0xE4A2,0x9BA8,0x0083,0xBDF2,0x9BA7,0x0091,0x0089,0x0085, 0x0083,0x9BA6,0x9BA5,0x0083,0x9BA4,0x9BA3,0x0085,0x0083,0x9BA2,0xB6B4,0x0083,0x9BA1,0x9BA0,0x0089,0x0085,0x0083, 0xC2E5,0xE4AE,0x0083,0xE4A8,0x9B9F,0x0085,0x0083,0xCFB4,0x9B9E,0x0083,0x9B9D,0x9B9C,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0x9B9B,0xC8F7,0x0083,0x9B9A,0x9B99,0x0085,0x0083,0x9B98,0xE4A9,0x0083,0x9B97,0xE4A3,0x0089,0x0085, 0x0083,0xD1F3,0x9B96,0x0083,0x9B95,0x9B94,0x0085,0x0083,0xE4A6,0x9B93,0x0083,0x9B92,0xE4A7,0x0091,0x0089,0x0085, 0x0083,0x9B91,0x9B90,0x0083,0xBDE0,0x9B8F,0x0085,0x0083,0x9B8E,0xE3FE,0x0083,0xD4F3,0xC6C3,0x0089,0x0085,0x0083, 0xD0BA,0xE3F8,0x0083,0x9B8D,0xE3F2,0x0085,0x0083,0xE3F1,0xEDB4,0x0083,0xB1C3,0x9B8C,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xD3BE,0x9B8B,0x0083,0xE3F3,0xCCA9,0x0085,0x0083,0xE3FD,0xE3FA,0x0083,0x9B8A,0x9B89,0x0089,0x0085,0x0083, 0xE3F9,0xC0E1,0x0083,0x9B88,0xD7A2,0x0085,0x0083,0x9B87,0x9B86,0x0083,0xC4E0,0x9B85,0x0091,0x0089,0x0085,0x0083, 0xC6FC,0xB2A8,0x0083,0xC5DD,0xE3F6,0x0085,0x0083,0x9B84,0xC5A2,0x0083,0x9B83,0x9B82,0x0089,0x0085,0x0083,0xB7BA, 0x9B81,0x0083,0x9B80,0x9B7E,0x0085,0x0083,0xE3F4,0xE3F7,0x0083,0xB7A8,0xE3EF,0x0101,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xE3FC,0x9B7D,0x0083,0x9B7C,0xE3EE,0x0085,0x0083,0x9B7B,0x9B7A,0x0083,0x9B79,0xC3DA,0x0089,0x0085, 0x0083,0x9B78,0xB2B4,0x0083,0xC8AA,0x9B77,0x0085,0x0083,0x9B76,0x9B75,0x0083,0xC7F6,0xD0B9,0x0091,0x0089,0x0085, 0x0083,0x9B74,0x9B73,0x0083,0x9B72,0x9B71,0x0085,0x0083,0xD1D8,0xD5B4,0x0083,0xB9C1,0xD5D3,0x0089,0x0085,0x0083, 0xD6CE,0x9B70,0x0083,0xD3CD,0xB7D0,0x0085,0x0083,0x9B6F,0x9B6E,0x0083,0x9B6D,0x9B6C,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xBAD3,0xE3F5,0x0083,0xE3FB,0x9B6B,0x0085,0x0083,0x9B6A,0xBEDA,0x0083,0xE3F0,0x9B69,0x0089,0x0085,0x0083, 0xC4AD,0xBBA6,0x0083,0xE3ED,0x9B68,0x0085,0x0083,0xB2D7,0xC2D9,0x0083,0xC1A4,0xC5BD,0x0091,0x0089,0x0085,0x0083, 0xE3E3,0x9B67,0x0083,0xC3BB,0x9B66,0x0085,0x0083,0xB9B5,0x9B65,0x0083,0x9B64,0x9B63,0x0089,0x0085,0x0083,0xC5E6, 0x9B62,0x0083,0xC9B3,0x9B61,0x0085,0x0083,0x9B60,0x9B5F,0x0083,0x9B5E,0xE3E6,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xEDB3,0x9B5D,0x0083,0x9B5C,0xE3E5,0x0085,0x0083,0xC6E3,0x9B5B,0x0083,0x9B5A,0xE3E7,0x0089,0x0085,0x0083, 0x9B59,0x9B58,0x0083,0xB3C1,0xC9F2,0x0085,0x0083,0x9B57,0xE3EC,0x0083,0xE3E4,0x9B56,0x0091,0x0089,0x0085,0x0083, 0xCED6,0xD2CA,0x0083,0xC7DF,0x9B55,0x0085,0x0083,0x9B54,0xB7DA,0x0083,0xC6FB,0x9B53,0x0089,0x0085,0x0083,0x9B52, 0x9B51,0x0083,0xD0DA,0x9B50,0x0085,0x0083,0x9B4F,0xE3EB,0x0083,0x9B4E,0xE3EA,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x9B4D,0xBCB3,0x0083,0x9B4C,0xCCAD,0x0085,0x0083,0x9B4B,0x9B4A,0x0083,0x9B49,0x9B48,0x0089,0x0085,0x0083,0x9B47, 0xCDF4,0x0083,0xE3E9,0xE3E8,0x0085,0x0083,0x9B46,0x9B45,0x0083,0x9B44,0xCCC0,0x0091,0x0089,0x0085,0x0083,0x9B43, 0x9B42,0x0083,0xCEDB,0xB3D8,0x0085,0x0083,0xBDAD,0xB9AF,0x0083,0xC8EA,0xE3E1,0x0089,0x0085,0x0083,0xD1B4,0x9B41, 0x0083,0x9B40,0x9AFE,0x0085,0x0083,0xBAB9,0x9AFD,0x0083,0xC9C7,0xE3E0,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F, 0x008F,0x0087,0x0083,0x9AFC,0x0083,0x9AFB,0x9AFA,0x0085,0x0083,0xCFAB,0x9AF9,0x0083,0x9AF8,0x9AF7,0x0089,0x0085, 0x0083,0x9AF6,0x9AF5,0x0083,0xE3E2,0xBABA,0x0085,0x0083,0x9AF4,0xBBE3,0x0083,0xD9E0,0x9AF3,0x0091,0x0089,0x0085, 0x0083,0x9AF2,0x9AF1,0x0083,0xC7F3,0xD6AD,0x0085,0x0083,0xCDA1,0x9AF0,0x0083,0x9AEF,0xD9DB,0x0089,0x0085,0x0083, 0x9AEE,0x9AED,0x0083,0x9AEC,0x9AEB,0x0085,0x0083,0xD3C0,0x9AEA,0x0083,0x9AE9,0xE3DF,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xCBAE,0x9AE8,0x0083,0xEBB5,0x9AE7,0x0085,0x0083,0xC7E8,0xC2C8,0x0083,0xB5AA,0x9AE6,0x0089,0x0085,0x0083, 0x9AE5,0x9AE4,0x0083,0xEBB4,0xEBB2,0x0085,0x0083,0xB0B1,0xD1F5,0x0083,0xBAA4,0x9AE3,0x0091,0x0089,0x0085,0x0083, 0xEBB3,0x9AE2,0x0083,0xC7E2,0xEBB1,0x0085,0x0083,0x9AE1,0xB7FA,0x0083,0x9AE0,0x9ADF,0x0089,0x0085,0x0083,0x9ADE, 0xB7D5,0x0083,0xEBB0,0xEBAF,0x0085,0x0083,0xEBAE,0x9ADD,0x0083,0xC4CA,0xEBAD,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC6F8,0xC3A5,0x0083,0x9ADC,0xC3F1,0x0085,0x0083,0xD8B5,0xCACF,0x0083,0x9ADB,0xEBAC,0x0089,0x0085,0x0083, 0x9ADA,0x9AD9,0x0083,0x9AD8,0x9AD7,0x0085,0x0083,0x9AD6,0xEBAA,0x0083,0xEBAB,0xEBA9,0x0091,0x0089,0x0085,0x0083, 0x9AD5,0x9AD4,0x0083,0x9AD3,0x9AD2,0x0085,0x0083,0x9AD1,0x9AD0,0x0083,0x9ACF,0xEBA6,0x0089,0x0085,0x0083,0x9ACE, 0x9ACD,0x0083,0x9ACC,0xEBA8,0x0085,0x0083,0x9ACB,0x9ACA,0x0083,0x9AC9,0xEBA7,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x9AC8,0xEBA5,0x0083,0x9AC7,0x9AC6,0x0085,0x0083,0x9AC5,0xCCBA,0x0083,0x9AC4,0x9AC3,0x0089,0x0085,0x0083,0x9AC2, 0xBAC1,0x0083,0xEBA4,0x9AC1,0x0085,0x0083,0x9AC0,0x9ABF,0x0083,0x9ABE,0x9ABD,0x0091,0x0089,0x0085,0x0083,0x9ABC, 0x9ABB,0x0083,0x9ABA,0xD5B1,0x0085,0x0083,0x9AB9,0x9AB8,0x0083,0x9AB7,0x9AB6,0x0089,0x0085,0x0083,0x9AB5,0xC3AB, 0x0083,0x9AB4,0xB1D0,0x0085,0x0083,0x9AB3,0xC5FE,0x0083,0xB1D1,0xB1CF,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xB1C8,0xD8B9,0x0083,0xB6BE,0x9AB2,0x0085,0x0083,0x9AB1,0xC3BF,0x0083,0x9AB0,0xC4B8,0x0089,0x0085,0x0083, 0x9AAF,0xCEE3,0x0083,0x9AAE,0x9AAD,0x0085,0x0083,0x9AAC,0x9AAB,0x0083,0x9AAA,0xD2E3,0x0091,0x0089,0x0085,0x0083, 0x9AA9,0x9AA8,0x0083,0xECB1,0xBBD9,0x0085,0x0083,0x9AA7,0xB5EE,0x0083,0x9AA6,0x9AA5,0x0089,0x0085,0x0083,0x9AA4, 0x9AA3,0x0083,0x9AA2,0x9AA1,0x0085,0x0083,0x9AA0,0xD2F3,0x0083,0x9A9F,0xB6CE,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC5B9,0xECAF,0x0083,0x9A9E,0x9A9D,0x0085,0x0083,0x9A9C,0x9A9B,0x0083,0x9A9A,0x9A99,0x0089,0x0085,0x0083,0x9A98, 0x9A97,0x0083,0xE9EC,0x9A96,0x0085,0x0083,0x9A95,0x9A94,0x0083,0x9A93,0x9A92,0x0091,0x0089,0x0085,0x0083,0x9A91, 0x9A90,0x0083,0x9A8F,0xE9EB,0x0085,0x0083,0x9A8E,0x9A8D,0x0083,0x9A8C,0x9A8B,0x0089,0x0085,0x0083,0x9A8A,0xE9EA, 0x0083,0xE9E9,0x9A89,0x0085,0x0083,0x9A88,0x9A87,0x0083,0xD6B3,0x9A86,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x9A85,0xE9E7,0x0083,0xE9E6,0x9A84,0x0085,0x0083,0x9A83,0x9A82,0x0083,0x9A81,0xE9E8,0x0089,0x0085,0x0083,0x9A80, 0xB2D0,0x0083,0xCAE2,0xD1B3,0x0085,0x0083,0x9A7E,0xE9E4,0x0083,0xB4F9,0x9A7D,0x0091,0x0089,0x0085,0x0083,0xE9E5, 0xD1EA,0x0083,0xE9E3,0xE9E2,0x0085,0x0083,0x9A7C,0x9A7B,0x0083,0x9A7A,0x9A79,0x0089,0x0085,0x0083,0xBCDF,0xCBC0, 0x0083,0x9A78,0xB4F5,0x0085,0x0083,0x9A77,0x9A76,0x0083,0x9A75,0x9A74,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9A73, 0x9A72,0x0083,0x9A71,0x9A70,0x0085,0x0083,0x9A6F,0x9A6E,0x0083,0x9A6D,0x9A6C,0x0089,0x0085,0x0083,0x9A6B,0x9A6A, 0x0083,0xCDE1,0x9A69,0x0085,0x0083,0x9A68,0xC6E7,0x0083,0xCEE4,0xB2BD,0x0091,0x0089,0x0085,0x0083,0xB4CB,0xD5FD, 0x0083,0xD6B9,0x9A67,0x0085,0x0083,0x9A66,0x9A65,0x0083,0x9A64,0x9A63,0x0089,0x0085,0x0083,0x9A62,0x9A61,0x0083, 0x9A60,0xECA8,0x0085,0x0083,0x9A5F,0x9A5E,0x0083,0x9A5D,0x9A5C,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083, 0x9A5B,0x0083,0x9A5A,0x9A59,0x0085,0x0083,0x9A58,0x9A57,0x0083,0x9A56,0x9A55,0x0089,0x0085,0x0083,0x9A54,0xB8E8, 0x0083,0x9A53,0x9A52,0x0085,0x0083,0xC7B8,0x9A51,0x0083,0xD0AA,0xECA7,0x0091,0x0089,0x0085,0x0083,0x9A50,0x9A4F, 0x0083,0xECA6,0x9A4E,0x0085,0x0083,0x9A4D,0x9A4C,0x0083,0x9A4B,0xBFEE,0x0089,0x0085,0x0083,0x9A4A,0x9A49,0x0083, 0x9A48,0xC6DB,0x0085,0x0083,0xECA5,0x9A47,0x0083,0xECA4,0x9A46,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9A45,0x9A44, 0x0083,0x9A43,0xD3FB,0x0085,0x0083,0x9A42,0x9A41,0x0083,0x9A40,0x99FE,0x0089,0x0085,0x0083,0x99FD,0x99FC,0x0083, 0x99FB,0x99FA,0x0085,0x0083,0x99F9,0x99F8,0x0083,0xC5B7,0x99F7,0x0091,0x0089,0x0085,0x0083,0x99F6,0xECA3,0x0083, 0xD0C0,0xBBB6,0x0085,0x0083,0xB4CE,0xC7B7,0x0083,0x99F5,0x99F4,0x0089,0x0085,0x0083,0x99F3,0x99F2,0x0083,0x99F1, 0x99F0,0x0085,0x0083,0x99EF,0x99EE,0x0083,0x99ED,0x99EC,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x99EB,0x99EA, 0x0083,0x99E9,0x99E8,0x0085,0x0083,0x99E7,0x99E6,0x0083,0x99E5,0x99E4,0x0089,0x0085,0x0083,0x99E3,0x99E2,0x0083, 0x99E1,0x99E0,0x0085,0x0083,0x99DF,0x99DE,0x0083,0x99DD,0x99DC,0x0091,0x0089,0x0085,0x0083,0x99DB,0x99DA,0x0083, 0x99D9,0x99D8,0x0085,0x0083,0x99D7,0x99D6,0x0083,0x99D5,0x99D4,0x0089,0x0085,0x0083,0x99D3,0x99D2,0x0083,0x99D1, 0x99D0,0x0085,0x0083,0x99CF,0x99CE,0x0083,0x99CD,0x99CC,0x00A1,0x0091,0x0089,0x0085,0x0083,0x99CB,0x99CA,0x0083, 0x99C9,0x99C8,0x0085,0x0083,0x99C7,0x99C6,0x0083,0x99C5,0x99C4,0x0089,0x0085,0x0083,0x99C3,0x99C2,0x0083,0x99C1, 0x99C0,0x0085,0x0083,0x99BF,0x99BE,0x0083,0x99BD,0x99BC,0x0091,0x0089,0x0085,0x0083,0x99BB,0x99BA,0x0083,0x99B9, 0x99B8,0x0085,0x0083,0x99B7,0x99B6,0x0083,0x99B5,0x99B4,0x0089,0x0085,0x0083,0x99B3,0x99B2,0x0083,0x99B1,0x99B0, 0x0085,0x0083,0x99AF,0x99AE,0x0083,0x99AD,0x99AC,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x99AB,0x99AA, 0x0083,0x99A9,0x99A8,0x0085,0x0083,0x99A7,0x99A6,0x0083,0x99A5,0x99A4,0x0089,0x0085,0x0083,0x99A3,0x99A2,0x0083, 0x99A1,0x99A0,0x0085,0x0083,0x999F,0x999E,0x0083,0x999D,0x999C,0x0091,0x0089,0x0085,0x0083,0x999B,0x999A,0x0083, 0x9999,0x9998,0x0085,0x0083,0x9997,0x9996,0x0083,0x9995,0x9994,0x0089,0x0085,0x0083,0x9993,0x9992,0x0083,0x9991, 0x9990,0x0085,0x0083,0x998F,0x998E,0x0083,0x998D,0x998C,0x00A1,0x0091,0x0089,0x0085,0x0083,0x998B,0x998A,0x0083, 0x9989,0x9988,0x0085,0x0083,0x9987,0x9986,0x0083,0x9985,0x9984,0x0089,0x0085,0x0083,0x9983,0xC3CA,0x0083,0xE9DF, 0x9982,0x0085,0x0083,0xE9DD,0x9981,0x0083,0x9980,0x997E,0x0091,0x0089,0x0085,0x0083,0x997D,0x997C,0x0083,0x997B, 0x997A,0x0085,0x0083,0x9979,0xE9D1,0x0083,0x9978,0x9977,0x0089,0x0085,0x0083,0x9976,0x9975,0x0083,0x9974,0x9973, 0x0085,0x0083,0x9972,0x9971,0x0083,0xE9DE,0x9970,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x996F,0x996E,0x0083, 0x996D,0x996C,0x0085,0x0083,0xE9DB,0xE9DC,0x0083,0x996B,0xE9D5,0x0089,0x0085,0x0083,0x996A,0x9969,0x0083,0x9968, 0x9967,0x0085,0x0083,0x9966,0x9965,0x0083,0x9964,0x9963,0x0091,0x0089,0x0085,0x0083,0x9962,0xCFAD,0x0083,0x9961, 0x9960,0x0085,0x0083,0x995F,0xCCB4,0x0083,0x995E,0x995D,0x0089,0x0085,0x0083,0x995C,0xE9DA,0x0083,0x995B,0x995A, 0x0085,0x0083,0xE9D6,0x9959,0x0083,0x9958,0x9957,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9956,0x9955,0x0083,0x9954, 0x9953,0x0085,0x0083,0xB3F7,0x9952,0x0083,0x9951,0x9950,0x0089,0x0085,0x0083,0x994F,0x994E,0x0083,0x994D,0x994C, 0x0085,0x0083,0x994B,0x994A,0x0083,0x9949,0x9948,0x0091,0x0089,0x0085,0x0083,0xE9CD,0x9947,0x0083,0x9946,0x9945, 0x0085,0x0083,0xCFF0,0x9944,0x0083,0x9943,0x9942,0x0089,0x0085,0x0083,0x9941,0x9940,0x0083,0xE9D3,0x98FE,0x0085, 0x0083,0xB3C8,0xE9D9,0x0083,0x98FD,0x98FC,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x98FB,0x0083, 0x98FA,0x98F9,0x0085,0x0083,0x98F8,0x98F7,0x0083,0xE9D2,0x98F6,0x0089,0x0085,0x0083,0x98F5,0x98F4,0x0083,0x98F3, 0x98F2,0x0085,0x0083,0x98F1,0x98F0,0x0083,0x98EF,0xC7C1,0x0091,0x0089,0x0085,0x0083,0x98EE,0x98ED,0x0083,0xE9CF, 0x98EC,0x0085,0x0083,0x98EB,0x98EA,0x0083,0x98E9,0x98E8,0x0089,0x0085,0x0083,0xE9D0,0xE9D7,0x0083,0x98E7,0x98E6, 0x0085,0x0083,0x98E5,0x98E4,0x0083,0x98E3,0x98E2,0x00A1,0x0091,0x0089,0x0085,0x0083,0x98E1,0xE9D4,0x0083,0x98E0, 0x98DF,0x0085,0x0083,0x98DE,0xD3A3,0x0083,0x98DD,0xE9C9,0x0089,0x0085,0x0083,0x98DC,0x98DB,0x0083,0x98DA,0x98D9, 0x0085,0x0083,0xBAE1,0x98D8,0x0083,0xE9D8,0x98D7,0x0091,0x0089,0x0085,0x0083,0x98D6,0x98D5,0x0083,0x98D4,0x98D3, 0x0085,0x0083,0x98D2,0xC4A3,0x0083,0x98D1,0xD5C1,0x0089,0x0085,0x0083,0x98D0,0x98CF,0x0083,0x98CE,0x98CD,0x0085, 0x0083,0x98CC,0x98CB,0x0083,0xE9CC,0xE9CB,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x98CA,0x98C9,0x0083,0x98C8, 0x98C7,0x0085,0x0083,0x98C6,0x98C5,0x0083,0x98C4,0x98C3,0x0089,0x0085,0x0083,0x98C2,0x98C1,0x0083,0x98C0,0x98BF, 0x0085,0x0083,0xB7AE,0x98BE,0x0083,0x98BD,0x98BC,0x0091,0x0089,0x0085,0x0083,0x98BB,0x98BA,0x0083,0x98B9,0x98B8, 0x0085,0x0083,0x98B7,0x98B6,0x0083,0x98B5,0xE9C8,0x0089,0x0085,0x0083,0x98B4,0xB2DB,0x0083,0x98B3,0x98B2,0x0085, 0x0083,0x98B1,0x98B0,0x0083,0x98AF,0x98AE,0x00A1,0x0091,0x0089,0x0085,0x0083,0x98AD,0x98AC,0x0083,0x98AB,0x98AA, 0x0085,0x0083,0xE9CE,0x98A9,0x0083,0x98A8,0x98A7,0x0089,0x0085,0x0083,0x98A6,0xE9CA,0x0083,0x98A5,0x98A4,0x0085, 0x0083,0x98A3,0x98A2,0x0083,0x98A1,0x98A0,0x0091,0x0089,0x0085,0x0083,0x989F,0x989E,0x0083,0x989D,0x989C,0x0085, 0x0083,0x989B,0x989A,0x0083,0xE9C6,0xE9C4,0x0089,0x0085,0x0083,0x9899,0x9898,0x0083,0x9897,0xBCF7,0x0085,0x0083, 0x9896,0x9895,0x0083,0x9894,0x9893,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9892,0x9891,0x0083,0xE9C0, 0x9890,0x0085,0x0083,0x988F,0x988E,0x0083,0xBBB1,0x988D,0x0089,0x0085,0x0083,0xE9B6,0x988C,0x0083,0xE9B3,0x988B, 0x0085,0x0083,0xE9C3,0x988A,0x0083,0x9889,0x9888,0x0091,0x0089,0x0085,0x0083,0x9887,0x9886,0x0083,0x9885,0x9884, 0x0085,0x0083,0x9883,0xE9C2,0x0083,0x9882,0x9881,0x0089,0x0085,0x0083,0x9880,0x987E,0x0083,0x987D,0xE9BD,0x0085, 0x0083,0x987C,0x987B,0x0083,0x987A,0xC8B6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9879,0x9878,0x0083,0xC1F1,0x9877, 0x0085,0x0083,0x9876,0xE9C1,0x0083,0x9875,0x9874,0x0089,0x0085,0x0083,0x9873,0xE9BF,0x0083,0x9872,0xE9BE,0x0085, 0x0083,0x9871,0x9870,0x0083,0xD5A5,0xE9BC,0x0091,0x0089,0x0085,0x0083,0x986F,0x986E,0x0083,0x986D,0x986C,0x0085, 0x0083,0x986B,0x986A,0x0083,0x9869,0x9868,0x0089,0x0085,0x0083,0x9867,0x9866,0x0083,0xB0F1,0xE9BB,0x0085,0x0083, 0x9865,0x9864,0x0083,0xE9B0,0x9863,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9862,0xE9C5,0x0083,0xC0C6,0x9861, 0x0085,0x0083,0x9860,0x985F,0x0083,0x985E,0x985D,0x0089,0x0085,0x0083,0x985C,0xE9C7,0x0083,0x985B,0x985A,0x0085, 0x0083,0x9859,0xE9B7,0x0083,0xE9B5,0xE9B4,0x0091,0x0089,0x0085,0x0083,0xD3DC,0x9858,0x0083,0xE9AD,0x9857,0x0085, 0x0083,0xB8C5,0x9856,0x0083,0xE9AF,0x9855,0x0089,0x0085,0x0083,0x9854,0x9853,0x0083,0xC2A5,0x9852,0x0085,0x0083, 0x9851,0xE9BA,0x0083,0xE9B1,0xBFAC,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9850,0x984F,0x0083,0x984E,0x984D,0x0085, 0x0083,0x984C,0xE9A8,0x0083,0x984B,0x984A,0x0089,0x0085,0x0083,0xE8FA,0x9849,0x0083,0x9848,0xE9AE,0x0085,0x0083, 0x9847,0x9846,0x0083,0x9845,0x9844,0x0091,0x0089,0x0085,0x0083,0xE9B8,0x9843,0x0083,0x9842,0xE9B9,0x0085,0x0083, 0x9841,0x9840,0x0083,0xE9AA,0x97FE,0x0089,0x0085,0x0083,0xC0E3,0xE9AC,0x0083,0x97FD,0x97FC,0x0085,0x0083,0xB3FE, 0x97FB,0x0083,0x97FA,0xE9A5,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x97F9,0x97F8,0x0083,0xD0A8, 0x97F7,0x0085,0x0083,0x97F6,0x97F5,0x0083,0x97F4,0x97F3,0x0089,0x0085,0x0083,0x97F2,0x97F1,0x0083,0x97F0,0x97EF, 0x0085,0x0083,0x97EE,0x97ED,0x0083,0x97EC,0x97EB,0x0091,0x0089,0x0085,0x0083,0x97EA,0x97E9,0x0083,0x97E8,0x97E7, 0x0085,0x0083,0xE9AB,0x97E6,0x0083,0x97E5,0xB4BB,0x0089,0x0085,0x0083,0x97E4,0xB4AA,0x0083,0x97E3,0x97E2,0x0085, 0x0083,0x97E1,0xE9A9,0x0083,0x97E0,0x97DF,0x00A1,0x0091,0x0089,0x0085,0x0083,0x97DE,0x97DD,0x0083,0xE9B2,0x97DC, 0x0085,0x0083,0x97DB,0x97DA,0x0083,0xD2AC,0x97D9,0x0089,0x0085,0x0083,0x97D8,0xCDD6,0x0083,0x97D7,0x97D6,0x0085, 0x0083,0x97D5,0x97D4,0x0083,0x97D3,0x97D2,0x0091,0x0089,0x0085,0x0083,0x97D1,0x97D0,0x0083,0xE9A1,0x97CF,0x0085, 0x0083,0x97CE,0x97CD,0x0083,0xE8FD,0xE8FC,0x0089,0x0085,0x0083,0x97CC,0x97CB,0x0083,0x97CA,0x97C9,0x0085,0x0083, 0x97C8,0x97C7,0x0083,0x97C6,0x97C5,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x97C4,0x97C3,0x0083,0x97C2,0x97C1, 0x0085,0x0083,0xBDB7,0x97C0,0x0083,0xE9A7,0x97BF,0x0089,0x0085,0x0083,0xD7B5,0xD6B2,0x0083,0x97BE,0xE9A3,0x0085, 0x0083,0x97BD,0x97BC,0x0083,0x97BB,0x97BA,0x0091,0x0089,0x0085,0x0083,0x97B9,0xD2CE,0x0083,0x97B8,0x97B7,0x0085, 0x0083,0x97B6,0xE9A4,0x0083,0x97B5,0x97B4,0x0089,0x0085,0x0083,0x97B3,0x97B2,0x0083,0xE8FB,0x97B1,0x0085,0x0083, 0xB9D7,0xE8FE,0x0083,0x97B0,0x97AF,0x00A1,0x0091,0x0089,0x0085,0x0083,0x97AE,0xBFC3,0x0083,0x97AD,0x97AC,0x0085, 0x0083,0x97AB,0xC0E2,0x0083,0xE9A2,0x97AA,0x0089,0x0085,0x0083,0xC9AD,0x97A9,0x0083,0x97A8,0x97A7,0x0085,0x0083, 0x97A6,0x97A5,0x0083,0x97A4,0x97A3,0x0091,0x0089,0x0085,0x0083,0x97A2,0x97A1,0x0083,0x97A0,0xE9A6,0x0085,0x0083, 0x979F,0x979E,0x0083,0xCCC4,0x979D,0x0089,0x0085,0x0083,0x979C,0x979B,0x0083,0x979A,0x9799,0x0085,0x0083,0xC5EF, 0x9798,0x0083,0xBCAC,0x9797,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9796,0xD7D8,0x0083,0x9795,0x9794, 0x0085,0x0083,0xB0F4,0x9793,0x0083,0x9792,0x9791,0x0089,0x0085,0x0083,0x9790,0xB9F7,0x0083,0x978F,0xC6E5,0x0085, 0x0083,0x978E,0xC3DE,0x0083,0x978D,0x978C,0x0091,0x0089,0x0085,0x0083,0x978B,0x978A,0x0083,0x9789,0x9788,0x0085, 0x0083,0xE8F9,0x9787,0x0083,0xBCEC,0x9786,0x0089,0x0085,0x0083,0x9785,0x9784,0x0083,0x9783,0x9782,0x0085,0x0083, 0x9781,0x9780,0x0083,0x977E,0x977D,0x00A1,0x0091,0x0089,0x0085,0x0083,0x977C,0xE8F3,0x0083,0x977B,0xCAE1,0x0085, 0x0083,0x977A,0x9779,0x0083,0xD0B5,0xCCDD,0x0089,0x0085,0x0083,0x9778,0xCBF3,0x0083,0x9777,0x9776,0x0085,0x0083, 0x9775,0x9774,0x0083,0xC0E6,0xCEE0,0x0091,0x0089,0x0085,0x0083,0xC3CE,0x9773,0x0083,0x9772,0x9771,0x0085,0x0083, 0xC9D2,0x9770,0x0083,0x976F,0x976E,0x0089,0x0085,0x0083,0x976D,0x976C,0x0083,0x976B,0x976A,0x0085,0x0083,0x9769, 0x9768,0x0083,0x9767,0xB9A3,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9766,0x9765,0x0083,0x9764,0xE8F7,0x0085, 0x0083,0x9763,0x9762,0x0083,0x9761,0xE8F4,0x0089,0x0085,0x0083,0x9760,0x975F,0x0083,0x975E,0x975D,0x0085,0x0083, 0x975C,0x975B,0x0083,0x975A,0x9759,0x0091,0x0089,0x0085,0x0083,0xB0F0,0xC3B7,0x0083,0x9758,0xE8E8,0x0085,0x0083, 0x9757,0xC1BA,0x0083,0x9756,0x9755,0x0089,0x0085,0x0083,0x9754,0x9753,0x0083,0x9752,0x9751,0x0085,0x0083,0x9750, 0x974F,0x0083,0x974E,0xE8F6,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCDB0,0x974D,0x0083,0xE8F5,0x974C,0x0085,0x0083, 0x974B,0x974A,0x0083,0x9749,0x9748,0x0089,0x0085,0x0083,0x9747,0x9746,0x0083,0x9745,0xE8F8,0x0085,0x0083,0x9744, 0xD7AE,0x0083,0xBDB0,0xE8ED,0x0091,0x0089,0x0085,0x0083,0xE8EB,0xC7C5,0x0083,0xE8E7,0xB5B5,0x0085,0x0083,0xE8E5, 0xE8E3,0x0083,0xE8E2,0x9743,0x0089,0x0085,0x0083,0x9742,0x9741,0x0083,0x9740,0x96FE,0x0085,0x0083,0x96FD,0x96FC, 0x0083,0x96FB,0x96FA,0x087B,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x96F9,0x0083,0xE8EA, 0xBDDB,0x0085,0x0083,0xBBB8,0x96F8,0x0083,0xC9A3,0xCDA9,0x0089,0x0085,0x0083,0x96F7,0xE8E4,0x0083,0x96F6,0xD7C0, 0x0085,0x0083,0x96F5,0xE8F0,0x0083,0xE8F1,0xB0B8,0x0091,0x0089,0x0085,0x0083,0x96F4,0xBFF2,0x0083,0xCEA6,0xE8E6, 0x0085,0x0083,0xCCD2,0xB9F0,0x0083,0xE8EC,0xE8EE,0x0089,0x0085,0x0083,0x96F3,0xE8EF,0x0083,0xD4D4,0xB8F1,0x0085, 0x0083,0x96F2,0x96F1,0x0083,0xB8F9,0xBACB,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD1F9,0x96F0,0x0083,0x96EF,0x96EE, 0x0085,0x0083,0xE8E1,0xE8E0,0x0083,0x96ED,0x96EC,0x0089,0x0085,0x0083,0x96EB,0x96EA,0x0083,0x96E9,0x96E8,0x0085, 0x0083,0x96E7,0xD6EA,0x0083,0xE8F2,0x96E6,0x0091,0x0089,0x0085,0x0083,0x96E5,0x96E4,0x0083,0x96E3,0x96E2,0x0085, 0x0083,0x96E1,0x96E0,0x0083,0xD0A3,0x96DF,0x0089,0x0085,0x0083,0x96DE,0x96DD,0x0083,0xE8E9,0x96DC,0x0085,0x0083, 0x96DB,0x96DA,0x0083,0x96D9,0x96D8,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC0F5,0xC6DC,0x0083,0x96D7,0x96D6, 0x0085,0x0083,0xCBA8,0x96D5,0x0083,0xCAF7,0x96D4,0x0089,0x0085,0x0083,0xC0B8,0xE8DD,0x0083,0x96D3,0xE8D3,0x0085, 0x0083,0xB6B0,0xE8D0,0x0083,0xE8CE,0xD5BB,0x0091,0x0089,0x0085,0x0083,0xB1EA,0x96D2,0x0083,0xD5A4,0x96D1,0x0085, 0x0083,0x96D0,0x96CF,0x0083,0x96CE,0xE8D9,0x0089,0x0085,0x0083,0xCAC1,0x96CD,0x0083,0xE8DF,0x96CC,0x0085,0x0083, 0x96CB,0x96CA,0x0083,0x96C9,0x96C8,0x00A1,0x0091,0x0089,0x0085,0x0083,0x96C7,0x96C6,0x0083,0x96C5,0xB2F1,0x0085, 0x0083,0xC1F8,0x96C4,0x0083,0xD6F9,0xE8CD,0x0089,0x0085,0x0083,0xBFC2,0x96C3,0x0083,0x96C2,0xBCED,0x0085,0x0083, 0x96C1,0x96C0,0x0083,0xE8D1,0x96BF,0x0091,0x0089,0x0085,0x0083,0x96BE,0x96BD,0x0083,0xB2E9,0x96BC,0x0085,0x0083, 0x96BB,0xE8DC,0x0083,0x96BA,0xC4FB,0x0089,0x0085,0x0083,0x96B9,0xD7F5,0x0083,0xE8D8,0xB9F1,0x0085,0x0083,0x96B8, 0xE8D6,0x0083,0xE8D4,0xE8CF,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x96B7,0x96B6,0x0083,0x96B5,0xC8E1, 0x0085,0x0083,0xC8BE,0xC6E2,0x0083,0xB8CC,0xC4B3,0x0089,0x0085,0x0083,0xB0D8,0x96B4,0x0083,0x96B3,0x96B2,0x0085, 0x0083,0x96B1,0x96B0,0x0083,0x96AF,0x96AE,0x0091,0x0089,0x0085,0x0083,0x96AD,0x96AC,0x0083,0x96AB,0xB1FA,0x0085, 0x0083,0xE8DA,0x96AA,0x0083,0xE8DE,0x96A9,0x0089,0x0085,0x0083,0x96A8,0x96A7,0x0083,0x96A6,0x96A5,0x0085,0x0083, 0x96A4,0x96A3,0x0083,0x96A2,0xE8DB,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBCCF,0xBCDC,0x0083,0xE8D5,0x96A1,0x0085, 0x0083,0xE8D7,0x96A0,0x0083,0x969F,0xE8D2,0x0089,0x0085,0x0083,0xBFDD,0x969E,0x0083,0xE8C9,0x969D,0x0085,0x0083, 0xB7E3,0xC7B9,0x0083,0x969C,0xE8C7,0x0091,0x0089,0x0085,0x0083,0xE8C5,0x969B,0x0083,0xE8C0,0x969A,0x0085,0x0083, 0xD4E6,0xCAE0,0x0083,0x9699,0x9698,0x0089,0x0085,0x0083,0x9697,0xE8C8,0x0083,0xD6A6,0xB9FB,0x0085,0x0083,0x9696, 0xC3B6,0x0083,0x9695,0xE8C4,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC1D6,0x9694,0x0083,0xD5ED,0x9693,0x0085, 0x0083,0x9692,0x9691,0x0083,0x9690,0xCEF6,0x0089,0x0085,0x0083,0x968F,0x968E,0x0083,0x968D,0x968C,0x0085,0x0083, 0xE8CA,0x968B,0x0083,0xCDF7,0x968A,0x0091,0x0089,0x0085,0x0083,0xE8C1,0x9689,0x0083,0x9688,0xB9B9,0x0085,0x0083, 0x9687,0x9686,0x0083,0xBCAB,0x9685,0x0089,0x0085,0x0083,0xB0E5,0xCBC9,0x0083,0x9684,0xE8CC,0x0085,0x0083,0x9683, 0x9682,0x0083,0x9681,0x9680,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE8CB,0x967E,0x0083,0xE8C6,0x967D,0x0085,0x0083, 0xE8C3,0xEABD,0x0083,0x967C,0xBDDC,0x0089,0x0085,0x0083,0xB1AD,0x967B,0x0083,0xBABC,0x967A,0x0085,0x0083,0x9679, 0xE8C2,0x0083,0xE8BF,0xD1EE,0x0091,0x0089,0x0085,0x0083,0x9678,0x9677,0x0083,0xC0B4,0x9676,0x0085,0x0083,0x9675, 0x9674,0x0083,0xCCF5,0xB8DC,0x0089,0x0085,0x0083,0xCAF8,0xE8BD,0x0083,0x9673,0xB6C5,0x0085,0x0083,0x9672,0x9671, 0x0083,0x9670,0x966F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x966E,0x0083,0xD5C8,0x966D,0x0085,0x0083, 0x966C,0xE8BC,0x0083,0x966B,0xB4E5,0x0089,0x0085,0x0083,0xB2C4,0xD0D3,0x0083,0xC0EE,0x966A,0x0085,0x0083,0xE8BB, 0x9669,0x0083,0x9668,0xC9BC,0x0091,0x0089,0x0085,0x0083,0xE8BE,0x9667,0x0083,0xB8CB,0x9666,0x0085,0x0083,0x9665, 0xC8A8,0x0083,0xD4D3,0x9664,0x0089,0x0085,0x0083,0xC9B1,0x9663,0x0083,0x9662,0xD0E0,0x0085,0x0083,0x9661,0x9660, 0x0083,0xBBFA,0x965F,0x00A1,0x0091,0x0089,0x0085,0x0083,0x965E,0x965D,0x0083,0x965C,0xB6E4,0x0085,0x0083,0xC6D3, 0x965B,0x0083,0x965A,0xD6EC,0x0089,0x0085,0x0083,0x9659,0xCAF5,0x0083,0x9658,0xD4FD,0x0085,0x0083,0xB1BE,0xC4A9, 0x0083,0xCEB4,0x9657,0x0091,0x0089,0x0085,0x0083,0xC4BE,0x9656,0x0083,0xEBFC,0x9655,0x0085,0x0083,0x9654,0x9653, 0x0083,0x9652,0x9651,0x0089,0x0085,0x0083,0x9650,0xC6DA,0x0083,0x964F,0xB3AF,0x0085,0x0083,0x964E,0xCDFB,0x0083, 0x964D,0x964C,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x964B,0xC0CA,0x0083,0x964A,0xEBDE,0x0085,0x0083,0xCBB7, 0x9649,0x0083,0x9648,0x9647,0x0089,0x0085,0x0083,0xEBD4,0x9646,0x0083,0x9645,0xB7FE,0x0085,0x0083,0x9644,0xC5F3, 0x0083,0xEBC3,0xD3D0,0x0091,0x0089,0x0085,0x0083,0xD4C2,0x9643,0x0083,0x9642,0x9641,0x0085,0x0083,0x9640,0x95FE, 0x0083,0x95FD,0x95FC,0x0089,0x0085,0x0083,0xD7EE,0xCCE6,0x0083,0xD4F8,0x95FB,0x0085,0x0083,0xC2FC,0x95FA,0x0083, 0x95F9,0xB2DC,0x00A1,0x0091,0x0089,0x0085,0x0083,0x95F8,0xEAC2,0x0083,0x95F7,0x95F6,0x0085,0x0083,0xB8FC,0xD2B7, 0x0083,0xC7FA,0x95F5,0x0089,0x0085,0x0083,0xD4BB,0x95F4,0x0083,0x95F3,0x95F2,0x0085,0x0083,0x95F1,0x95F0,0x0083, 0x95EF,0xEAD9,0x0091,0x0089,0x0085,0x0083,0x95EE,0x95ED,0x0083,0xEAD8,0x95EC,0x0085,0x0083,0x95EB,0x95EA,0x0083, 0x95E9,0x95E8,0x0089,0x0085,0x0083,0x95E7,0x95E6,0x0083,0x95E5,0xC6D8,0x0085,0x0083,0xEAD7,0xEAD6,0x0083,0x95E4, 0xCAEF,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x95E3,0x95E2,0x0083,0x95E1,0x95E0,0x0085,0x0083,0x95DF, 0x95DE,0x0083,0x95DD,0x95DC,0x0089,0x0085,0x0083,0x95DB,0x95DA,0x0083,0x95D9,0x95D8,0x0085,0x0083,0x95D7,0x95D6, 0x0083,0x95D5,0x95D4,0x0091,0x0089,0x0085,0x0083,0x95D3,0x95D2,0x0083,0x95D1,0x95D0,0x0085,0x0083,0x95CF,0x95CE, 0x0083,0x95CD,0x95CC,0x0089,0x0085,0x0083,0x95CB,0x95CA,0x0083,0xEAD5,0x95C9,0x0085,0x0083,0x95C8,0x95C7,0x0083, 0x95C6,0xE5DF,0x00A1,0x0091,0x0089,0x0085,0x0083,0x95C5,0x95C4,0x0083,0x95C3,0x95C2,0x0085,0x0083,0xB1A9,0x95C1, 0x0083,0x95C0,0x95BF,0x0089,0x0085,0x0083,0x95BE,0x95BD,0x0083,0xC4BA,0x95BC,0x0085,0x0083,0x95BB,0x95BA,0x0083, 0x95B9,0x95B8,0x0091,0x0089,0x0085,0x0083,0xF4DF,0xEAD3,0x0083,0x95B7,0x95B6,0x0085,0x0083,0x95B5,0x95B4,0x0083, 0x95B3,0x95B2,0x0089,0x0085,0x0083,0x95B1,0x95B0,0x0083,0x95AF,0xEAD4,0x0085,0x0083,0x95AE,0x95AD,0x0083,0x95AC, 0x95AB,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x95AA,0xB0B5,0x0083,0xC5AF,0x95A9,0x0085,0x0083,0x95A8,0x95A7, 0x0083,0x95A6,0xCAEE,0x0089,0x0085,0x0083,0x95A5,0x95A4,0x0083,0x95A3,0x95A2,0x0085,0x0083,0xEAD2,0x95A1,0x0083, 0x95A0,0x959F,0x0091,0x0089,0x0085,0x0083,0x959E,0xCFBE,0x0083,0x959D,0x959C,0x0085,0x0083,0xEAD1,0x959B,0x0083, 0xD4DD,0x959A,0x0089,0x0085,0x0083,0x9599,0x9598,0x0083,0xC1C0,0x9597,0x0085,0x0083,0x9596,0x9595,0x0083,0xD6C7, 0x9594,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9593,0xEAD0,0x0083,0xBEA7,0x9592,0x0085,0x0083,0xC7E7,0x9591,0x0083, 0x9590,0x958F,0x0089,0x0085,0x0083,0xCEFA,0xBEB0,0x0083,0xC6D5,0x958E,0x0085,0x0083,0x958D,0x958C,0x0083,0x958B, 0x958A,0x0091,0x0089,0x0085,0x0083,0xB3BF,0x9589,0x0083,0xBBDE,0x9588,0x0085,0x0083,0xCEEE,0x9587,0x0083,0x9586, 0xEACE,0x0089,0x0085,0x0083,0x9585,0xEAC9,0x0083,0x9584,0x9583,0x0085,0x0083,0x9582,0x9581,0x0083,0xCDED,0x9580, 0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x957E,0x0083,0xEACF,0xEACD,0x0085,0x0083,0xD4CE,0xEACA, 0x0083,0xCFFE,0xC9B9,0x0089,0x0085,0x0083,0x957D,0x957C,0x0083,0xEACC,0x957B,0x0085,0x0083,0x957A,0xC9CE,0x0083, 0xBDFA,0x9579,0x0091,0x0089,0x0085,0x0083,0x9578,0x9577,0x0083,0x9576,0x9575,0x0085,0x0083,0x9574,0x9573,0x0083, 0xBBCE,0x9572,0x0089,0x0085,0x0083,0xEACB,0x9571,0x0083,0x9570,0xCFD4,0x0085,0x0083,0x956F,0xD6E7,0x0083,0x956E, 0x956D,0x00A1,0x0091,0x0089,0x0085,0x0083,0x956C,0x956B,0x0083,0x956A,0xEAC6,0x0085,0x0083,0xEAC7,0xEAC4,0x0083, 0x9569,0x9568,0x0089,0x0085,0x0083,0xEAC5,0x9567,0x0083,0xCAC7,0x9566,0x0085,0x0083,0xD5D1,0x9565,0x0083,0x9564, 0x9563,0x0091,0x0089,0x0085,0x0083,0x9562,0xD7F2,0x0083,0xC3C1,0x9561,0x0085,0x0083,0xB4BA,0x9560,0x0083,0x955F, 0x955E,0x0089,0x0085,0x0083,0x955D,0xD3B3,0x0083,0xD0C7,0x955C,0x0085,0x0083,0xEAC3,0x955B,0x0083,0x955A,0x9559, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xEABC,0x9558,0x0083,0x9557,0x9556,0x0085,0x0083,0xEABF,0xCEF4,0x0083, 0xD2D7,0x9555,0x0089,0x0085,0x0083,0x9554,0x9553,0x0083,0xBBE8,0xC3F7,0x0085,0x0083,0x9552,0xB2FD,0x0083,0x9551, 0xEABB,0x0091,0x0089,0x0085,0x0083,0x9550,0x954F,0x0083,0x954E,0xC0A5,0x0085,0x0083,0x954D,0x954C,0x0083,0xEABE, 0xB0BA,0x0089,0x0085,0x0083,0x954B,0xEAC0,0x0083,0x954A,0x9549,0x0085,0x0083,0x9548,0x9547,0x0083,0x9546,0xCDFA, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x9545,0x9544,0x0083,0xBFF5,0xCAB1,0x0085,0x0083,0x9543,0x9542,0x0083,0x9541, 0x9540,0x0089,0x0085,0x0083,0xBAB5,0xEABA,0x0083,0xEAB9,0xEAB8,0x0085,0x0083,0xD0F1,0xD1AE,0x0083,0x94FE,0x94FD, 0x0091,0x0089,0x0085,0x0083,0xD4E7,0xD6BC,0x0083,0xBEC9,0xB5A9,0x0085,0x0083,0xC8D5,0x94FC,0x0083,0x94FB,0xBCC8, 0x0089,0x0085,0x0083,0x94FA,0xCEDE,0x0083,0x94F9,0x94F8,0x0085,0x0083,0x94F7,0x94F6,0x0083,0x94F5,0x94F4,0x0101, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x94F3,0x94F2,0x0083,0xC6EC,0xECBD,0x0085,0x0083,0x94F1,0x94F0,0x0083, 0x94EF,0xECBC,0x0089,0x0085,0x0083,0x94EE,0x94ED,0x0083,0xD7E5,0xECBB,0x0085,0x0083,0x94EC,0xECBA,0x0083,0xD0FD, 0x94EB,0x0091,0x0089,0x0085,0x0083,0x94EA,0x94E9,0x0083,0x94E8,0xECB7,0x0085,0x0083,0xC2C3,0xECB8,0x0083,0xECB9, 0x94E7,0x0089,0x0085,0x0083,0xC5D4,0x94E6,0x0083,0x94E5,0x94E4,0x0085,0x0083,0xCAA9,0xECB6,0x0083,0x94E3,0x94E2, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB7BD,0x94E1,0x0083,0x94E0,0x94DF,0x0085,0x0083,0x94DE,0x94DD,0x0083,0x94DC, 0x94DB,0x0089,0x0085,0x0083,0x94DA,0xD0C2,0x0083,0xCBB9,0x94D9,0x0085,0x0083,0xB6CF,0x94D8,0x0083,0xEDBD,0x94D7, 0x0091,0x0089,0x0085,0x0083,0xD5B6,0x94D6,0x0083,0xB8AB,0x94D5,0x0085,0x0083,0xB3E2,0xBDEF,0x0083,0x94D4,0x94D3, 0x0089,0x0085,0x0083,0xCED3,0x94D2,0x0083,0xD5E5,0x94D1,0x0085,0x0083,0x94D0,0xD0B1,0x0083,0xF5FA,0x94CF,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xC1CF,0x94CE,0x0083,0xB6B7,0x94CD,0x0085,0x0083,0x94CC,0x94CB,0x0083,0xECB5, 0x94CA,0x0089,0x0085,0x0083,0xB0DF,0xECB3,0x0083,0x94C9,0x94C8,0x0085,0x0083,0x94C7,0xB1F3,0x0083,0xD5AB,0x94C6, 0x0091,0x0089,0x0085,0x0083,0x94C5,0x94C4,0x0083,0xCEC4,0x94C3,0x0085,0x0083,0x94C2,0x94C1,0x0083,0x94C0,0x94BF, 0x0089,0x0085,0x0083,0x94BE,0x94BD,0x0083,0x94BC,0x94BB,0x0085,0x0083,0x94BA,0x94B9,0x0083,0x94B8,0x94B7,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x94B6,0x94B5,0x0083,0xB7F3,0x94B4,0x0085,0x0083,0x94B3,0xD5FB,0x0083,0x94B2,0xC7C3, 0x0089,0x0085,0x0083,0x94B1,0xCAFD,0x0083,0x94B0,0x94AF,0x0085,0x0083,0x94AE,0xBEB4,0x0083,0xEBB8,0x94AD,0x0091, 0x0089,0x0085,0x0083,0x94AC,0x94AB,0x0083,0x94AA,0xB6D8,0x0085,0x0083,0x94A9,0x94A8,0x0083,0xC9A2,0xB8D2,0x0089, 0x0085,0x0083,0x94A7,0x94A6,0x0083,0x94A5,0xB3A8,0x0085,0x0083,0xB1D6,0x94A4,0x0083,0xC1B2,0x94A3,0x0181,0x0101, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBDCC,0x94A2,0x0083,0x94A1,0xB0BD,0x0085,0x0083,0xEBB7,0x94A0,0x0083, 0x949F,0x949E,0x0089,0x0085,0x0083,0xBEC8,0x949D,0x0083,0xC3F4,0x949C,0x0085,0x0083,0x949B,0xB5D0,0x0083,0x949A, 0x9499,0x0091,0x0089,0x0085,0x0083,0xF4CD,0xD0A7,0x0083,0x9498,0x9497,0x0085,0x0083,0xB9CA,0x9496,0x0083,0x9495, 0x9494,0x0089,0x0085,0x0083,0x9493,0x9492,0x0083,0xD5FE,0xB7C5,0x0085,0x0083,0x9491,0x9490,0x0083,0xB9A5,0x948F, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB8C4,0xD8FC,0x0083,0x948E,0xCAD5,0x0085,0x0083,0xEBB6,0xEAB7,0x0083,0x948D, 0x948C,0x0089,0x0085,0x0083,0x948B,0x948A,0x0083,0xD6A7,0xDFAD,0x0085,0x0083,0x9489,0x9488,0x0083,0xBEF0,0x9487, 0x0091,0x0089,0x0085,0x0083,0x9486,0x9485,0x0083,0x9484,0x9483,0x0085,0x0083,0xDFAC,0x9482,0x0083,0x9481,0x9480, 0x0089,0x0085,0x0083,0x947E,0x947D,0x0083,0x947C,0x947B,0x0085,0x0083,0x947A,0x9479,0x0083,0x9478,0x9477,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x9476,0xC8C1,0x0083,0x9475,0x9474,0x0085,0x0083,0x9473,0x9472,0x0083,0x9471, 0xD4DC,0x0089,0x0085,0x0083,0x9470,0x946F,0x0083,0x946E,0x946D,0x0085,0x0083,0x946C,0x946B,0x0083,0x946A,0x9469, 0x0091,0x0089,0x0085,0x0083,0xDFAB,0x9468,0x0083,0x9467,0x9466,0x0085,0x0083,0x9465,0x9464,0x0083,0x9463,0x9462, 0x0089,0x0085,0x0083,0x9461,0xC5CA,0x0083,0x9460,0x945F,0x0085,0x0083,0x945E,0x945D,0x0083,0x945C,0x945B,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x945A,0x9459,0x0083,0x9458,0x9457,0x0085,0x0083,0x9456,0x9455,0x0083,0x9454,0x9453, 0x0089,0x0085,0x0083,0x9452,0x9451,0x0083,0x9450,0x944F,0x0085,0x0083,0x944E,0x944D,0x0083,0x944C,0x944B,0x0091, 0x0089,0x0085,0x0083,0x944A,0x9449,0x0083,0x9448,0xB2C1,0x0085,0x0083,0x9447,0xDFA9,0x0083,0x9446,0xDFAA,0x0089, 0x0085,0x0083,0x9445,0x9444,0x0083,0x9443,0xCBD3,0x0085,0x0083,0x9442,0x9441,0x0083,0x9440,0x93FE,0x0101,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x93FD,0xEBA2,0x0083,0xDFA8,0x93FC,0x0085,0x0083,0x93FB,0x93FA,0x0083,0x93F9, 0xC7DC,0x0089,0x0085,0x0083,0x93F8,0xDFA7,0x0083,0x93F7,0xC7E6,0x0085,0x0083,0xB2D9,0x93F6,0x0083,0x93F5,0x93F4, 0x0091,0x0089,0x0085,0x0083,0x93F3,0x93F2,0x0083,0x93F1,0x93F0,0x0085,0x0083,0xC9C3,0x93EF,0x0083,0x93EE,0xC0DE, 0x0089,0x0085,0x0083,0x93ED,0xDFA6,0x0083,0x93EC,0x93EB,0x0085,0x0083,0x93EA,0xBAB3,0x0083,0x93E9,0xDFA5,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x93E8,0xDFA3,0x0083,0xDFA2,0x93E7,0x0085,0x0083,0xC4EC,0x93E6,0x0083,0x93E5,0x93E4, 0x0089,0x0085,0x0083,0x93E3,0xD7AB,0x0083,0x93E2,0xB4E9,0x0085,0x0083,0xB2A5,0xC7CB,0x0083,0x93E1,0x93E0,0x0091, 0x0089,0x0085,0x0083,0xC1C3,0x93DF,0x0083,0x93DE,0x93DD,0x0085,0x0083,0x93DC,0xB3B7,0x0083,0x93DB,0x93DA,0x0089, 0x0085,0x0083,0x93D9,0x93D8,0x0083,0x93D7,0xD7B2,0x0085,0x0083,0x93D6,0x93D5,0x0083,0x93D4,0x93D3,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xDFA4,0x93D2,0x0083,0x93D1,0xDEFE,0x0085,0x0083,0xCBBA,0x93D0,0x0083,0x93CF,0xC8F6, 0x0089,0x0085,0x0083,0xB3C5,0x93CE,0x0083,0x93CD,0x93CC,0x0085,0x0083,0x93CB,0x93CA,0x0083,0x93C9,0x93C8,0x0091, 0x0089,0x0085,0x0083,0x93C7,0x93C6,0x0083,0xC6B2,0x93C5,0x0085,0x0083,0xBEEF,0xDEFC,0x0083,0x93C4,0xC1CC,0x0089, 0x0085,0x0083,0x93C3,0x93C2,0x0083,0x93C1,0x93C0,0x0085,0x0083,0x93BF,0x93BE,0x0083,0x93BD,0xDFA1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xC4A1,0xC3FE,0x0083,0x93BC,0x93BB,0x0085,0x0083,0x93BA,0x93B9,0x0083,0x93B8,0x93B7,0x0089, 0x0085,0x0083,0x93B6,0x93B5,0x0083,0x93B4,0x93B3,0x0085,0x0083,0xDEFD,0x93B2,0x0083,0x93B1,0x93B0,0x0091,0x0089, 0x0085,0x0083,0xC4A6,0x93AF,0x0083,0xB4DD,0x93AE,0x0085,0x0083,0x93AD,0x93AC,0x0083,0x93AB,0x93AA,0x0089,0x0085, 0x0083,0x93A9,0x93A8,0x0083,0x93A7,0xDEFB,0x0085,0x0083,0x93A6,0x93A5,0x0083,0x93A4,0x93A3,0x047D,0x027F,0x017F, 0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x93A2,0x0083,0xD5AA,0x93A1,0x0085,0x0083,0x93A0,0x939F,0x0083,0xCBA4, 0x939E,0x0089,0x0085,0x0083,0xDEF0,0x939D,0x0083,0x939C,0x939B,0x0085,0x0083,0x939A,0x9399,0x0083,0x9398,0x9397, 0x0091,0x0089,0x0085,0x0083,0xCCAF,0x9396,0x0083,0xB1F7,0xD2A1,0x0085,0x0083,0xB0DA,0xDEF3,0x0083,0xC9E3,0x9395, 0x0089,0x0085,0x0083,0x9394,0xDEF4,0x0083,0x9393,0xEBA1,0x0085,0x0083,0x9392,0xB2EB,0x0083,0x9391,0x9390,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xD0AF,0x938F,0x0083,0x938E,0x938D,0x0085,0x0083,0x938C,0x938B,0x0083,0xE5BA,0x938A, 0x0089,0x0085,0x0083,0x9389,0x9388,0x0083,0x9387,0x9386,0x0085,0x0083,0x9385,0xB4EE,0x0083,0xB0E1,0x9384,0x0091, 0x0089,0x0085,0x0083,0xCCC2,0x9383,0x0083,0x9382,0x9381,0x0085,0x0083,0xDEF9,0x9380,0x0083,0x937E,0x937D,0x0089, 0x0085,0x0083,0x937C,0xDEFA,0x0083,0xDEF7,0x937B,0x0085,0x0083,0xB8E3,0x937A,0x0083,0xCBD1,0xDEF6,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x9379,0x9378,0x0083,0x9377,0x9376,0x0085,0x0083,0x9375,0x9374,0x0083,0xC9A6,0xB4EA, 0x0089,0x0085,0x0083,0x9373,0x9372,0x0083,0xB4A4,0xB2AB,0x0085,0x0083,0x9371,0x9370,0x0083,0xDEF8,0xDEF5,0x0091, 0x0089,0x0085,0x0083,0x936F,0x936E,0x0083,0x936D,0x936C,0x0085,0x0083,0x936B,0xBDC1,0x0083,0x936A,0x9369,0x0089, 0x0085,0x0083,0xC2A7,0xB8E9,0x0083,0xB2F3,0xDEEC,0x0085,0x0083,0x9368,0xC0BF,0x0083,0x9367,0x9366,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x9365,0x9364,0x0083,0xDEEA,0x9363,0x0085,0x0083,0xDEDE,0x9362,0x0083,0xD4AE,0x9361,0x0089, 0x0085,0x0083,0xDEE9,0x9360,0x0083,0x935F,0x935E,0x0085,0x0083,0x935D,0xBDD2,0x0083,0x935C,0x935B,0x0091,0x0089, 0x0085,0x0083,0xBEBE,0xBFAB,0x0083,0x935A,0x9359,0x0085,0x0083,0x9358,0x9357,0x0083,0x9356,0xB4A7,0x0089,0x0085, 0x0083,0x9355,0xCED5,0x0083,0xDEEB,0x9354,0x0085,0x0083,0xDEEE,0x9353,0x0083,0x9352,0x9351,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x9350,0x934F,0x0083,0x934E,0x934D,0x0085,0x0083,0xD2BE,0x934C,0x0083,0x934B,0x934A, 0x0089,0x0085,0x0083,0xB2E5,0x9349,0x0083,0xCCE1,0xC3E8,0x0085,0x0083,0xDEEF,0xD7E1,0x0083,0x9348,0x9347,0x0091, 0x0089,0x0085,0x0083,0x9346,0xC8E0,0x0083,0x9345,0x9344,0x0085,0x0083,0xDEF1,0x9343,0x0083,0xDEED,0x9342,0x0089, 0x0085,0x0083,0x9341,0x9340,0x0083,0x92FE,0x92FD,0x0085,0x0083,0xDEF2,0x92FC,0x0083,0xDEE8,0x92FB,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xB2F4,0x92FA,0x0083,0xB5A7,0xD6C0,0x0085,0x0083,0x92F9,0x92F8,0x0083,0xDEE2,0xC2B0,0x0089, 0x0085,0x0083,0x92F7,0x92F6,0x0083,0xEAFE,0x92F5,0x0085,0x0083,0xDEE7,0xDEDD,0x0083,0xDEE4,0x92F4,0x0091,0x0089, 0x0085,0x0083,0xB4EB,0xD1DA,0x0083,0xCDC6,0xBFD8,0x0085,0x0083,0x92F3,0xBDD3,0x0083,0x92F2,0xB3B8,0x0089,0x0085, 0x0083,0xCCBD,0x92F1,0x0083,0xC2D3,0x92F0,0x0085,0x0083,0x92EF,0x92EE,0x0083,0x92ED,0x92EC,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x92EB,0x92EA,0x0083,0xBEF2,0x92E9,0x0085,0x0083,0xD2B4,0x92E8,0x0083,0x92E7,0x92E6,0x0089, 0x0085,0x0083,0xC5C5,0x92E5,0x0083,0xC6FE,0xCCCD,0x0085,0x0083,0xDEE1,0x92E4,0x0083,0xD5C6,0x92E3,0x0091,0x0089, 0x0085,0x0083,0xDEE5,0xB5F4,0x0083,0xCADA,0xB6DE,0x0085,0x0083,0x92E2,0x92E1,0x0083,0x92E0,0x92DF,0x0089,0x0085, 0x0083,0xB5E0,0x92DE,0x0083,0xCFC6,0x92DD,0x0085,0x0083,0x92DC,0x92DB,0x0083,0x92DA,0xC4ED,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xDEE0,0x92D9,0x0083,0x92D8,0xBDDD,0x0085,0x0083,0xB4B7,0x92D7,0x0083,0x92D6,0x92D5,0x0089,0x0085, 0x0083,0x92D4,0xDEDF,0x0083,0x92D3,0x92D2,0x0085,0x0083,0xBEDD,0xDEE3,0x0083,0x92D1,0x92D0,0x0091,0x0089,0x0085, 0x0083,0x92CF,0xDEE6,0x0083,0x92CE,0xC5F5,0x0085,0x0083,0x92CD,0x92CC,0x0083,0x92CB,0xB5B7,0x0089,0x0085,0x0083, 0xBBBB,0xBCF1,0x0083,0x92CA,0xCBF0,0x0085,0x0083,0xC0CC,0x92C9,0x0083,0x92C8,0x92C7,0x017F,0x00FF,0x00BF,0x009F, 0x008F,0x0087,0x0083,0x92C6,0x0083,0x92C5,0x92C4,0x0085,0x0083,0x92C3,0x92C2,0x0083,0xB2B6,0x92C1,0x0089,0x0085, 0x0083,0x92C0,0x92BF,0x0083,0x92BE,0xBEE8,0x0085,0x0083,0xC4F3,0xC9D3,0x0083,0xBAB4,0xB0C6,0x0091,0x0089,0x0085, 0x0083,0xDEDB,0x92BD,0x0083,0xD7BD,0x92BC,0x0085,0x0083,0x92BB,0xC0A6,0x0083,0xCDB1,0x92BA,0x0089,0x0085,0x0083, 0xDEDC,0xCEE6,0x0083,0x92B9,0x92B8,0x0085,0x0083,0x92B7,0x92B6,0x0083,0xCDEC,0x92B5,0x00A1,0x0091,0x0089,0x0085, 0x0083,0x92B4,0xCDA6,0x0083,0xDEDA,0x92B3,0x0085,0x0083,0x92B2,0x92B1,0x0083,0x92B0,0x92AF,0x0089,0x0085,0x0083, 0x92AE,0xEAFD,0x0083,0x92AD,0x92AC,0x0085,0x0083,0xD5F1,0x92AB,0x0083,0x92AA,0x92A9,0x0091,0x0089,0x0085,0x0083, 0xB4EC,0xC5B2,0x0083,0x92A8,0xB0A4,0x0085,0x0083,0x92A7,0x92A6,0x0083,0xBBD3,0xBCB7,0x0089,0x0085,0x0083,0xD5F5, 0xDED8,0x0083,0xB5B2,0xC4D3,0x0085,0x0083,0xD0AE,0xCCA2,0x0083,0xCECE,0x92A5,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC2CE,0xD6BF,0x0083,0x92A4,0x92A3,0x0085,0x0083,0x92A2,0xCDDA,0x0083,0x92A1,0x92A0,0x0089,0x0085,0x0083, 0x929F,0x929E,0x0083,0xCCF4,0x929D,0x0085,0x0083,0x929C,0xBFE6,0x0083,0x929B,0x929A,0x0091,0x0089,0x0085,0x0083, 0x9299,0x9298,0x0083,0xB0B4,0xEAFC,0x0085,0x0083,0xD6B8,0x9297,0x0083,0x9296,0x9295,0x0089,0x0085,0x0083,0x9294, 0xB9D2,0x0083,0xB3D6,0x9293,0x0085,0x0083,0xC4C3,0xCAB0,0x0083,0xD7A7,0xC6B4,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x9292,0x9291,0x0083,0x9290,0x928F,0x0085,0x0083,0xBFBD,0xDED9,0x0083,0x928E,0xCBA9,0x0089,0x0085,0x0083,0xC8AD, 0x928D,0x0083,0xB9B0,0x928C,0x0085,0x0083,0xD5FC,0xDED7,0x0083,0xCAC3,0xC0A8,0x0091,0x0089,0x0085,0x0083,0x928B, 0x928A,0x0083,0xD4F1,0xB2A6,0x0085,0x0083,0xC5A1,0xC0B9,0x0083,0xD3B5,0x9289,0x0089,0x0085,0x0083,0xBCF0,0xC2A3, 0x0083,0x9288,0x9287,0x0085,0x0083,0xC4E2,0x9286,0x0083,0x9285,0xB0DD,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xD5D0,0xDED5,0x0083,0xD7BE,0xBED0,0x0085,0x0083,0xDED6,0xCDCF,0x0083,0x9284,0xB0CE,0x0089,0x0085,0x0083, 0xCDD8,0xBEDC,0x0083,0x9283,0xB9D5,0x0085,0x0083,0x9282,0xC1E0,0x0083,0xC5C4,0xB0E8,0x0091,0x0089,0x0085,0x0083, 0x9281,0xDED4,0x0083,0xC0AD,0xC4E9,0x0085,0x0083,0xC4B4,0xB2F0,0x0083,0xB5A3,0xD6F4,0x0089,0x0085,0x0083,0x9280, 0xB7F7,0x0083,0x927E,0x927D,0x0085,0x0083,0xC3F2,0x927C,0x0083,0xB3E9,0xD1BA,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xDED3,0x927B,0x0083,0xC4A8,0x927A,0x0085,0x0083,0x9279,0x9278,0x0083,0xB5D6,0x9277,0x0089,0x0085,0x0083,0x9276, 0x9275,0x0083,0xB1A7,0x9274,0x0085,0x0083,0x9273,0x9272,0x0083,0x9271,0xCCA7,0x0091,0x0089,0x0085,0x0083,0xC5FB, 0x9270,0x0083,0x926F,0xC5EA,0x0085,0x0083,0x926E,0x926D,0x0083,0xB1A8,0xBBA4,0x0089,0x0085,0x0083,0x926C,0xC7C0, 0x0083,0xC2D5,0xBFD9,0x0085,0x0083,0xDED2,0x926B,0x0083,0x926A,0x9269,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xC5D7,0xB8A7,0x0083,0x9268,0xD5DB,0x0085,0x0083,0xBFB9,0xB6B6,0x0083,0xCDB6,0x9267,0x0089,0x0085,0x0083,0xD7A5, 0xCAE3,0x0083,0xD2D6,0x9266,0x0085,0x0083,0x9265,0x9264,0x0083,0x9263,0x9262,0x0091,0x0089,0x0085,0x0083,0x9261, 0xB0D1,0x0083,0xBEF1,0x9260,0x0085,0x0083,0x925F,0x925E,0x0083,0x925D,0xB3AD,0x0089,0x0085,0x0083,0x925C,0x925B, 0x0083,0x925A,0xBCBC,0x0085,0x0083,0xB3D0,0xD5D2,0x0083,0x9259,0xB6F3,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9258, 0x9257,0x0083,0xC5FA,0x9256,0x0085,0x0083,0x9255,0xB7F6,0x0083,0x9254,0x9253,0x0089,0x0085,0x0083,0xB0E2,0x9252, 0x0083,0x9251,0xC8C5,0x0085,0x0083,0xB3B6,0xB0E7,0x0083,0xC5A4,0xD1EF,0x0091,0x0089,0x0085,0x0083,0xC9A8,0xDED1, 0x0083,0xC0A9,0x9250,0x0085,0x0083,0xD6B4,0xC7A4,0x0083,0x924F,0x924E,0x0089,0x0085,0x0083,0xBFDB,0x924D,0x0083, 0x924C,0x924B,0x0085,0x0083,0x924A,0x9249,0x0083,0x9248,0x9247,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087, 0x0083,0xBFB8,0x0083,0x9246,0x9245,0x0085,0x0083,0xCDD0,0x9244,0x0083,0x9243,0x9242,0x0089,0x0085,0x0083,0xC8D3, 0xB4F2,0x0083,0xB0C7,0xC6CB,0x0085,0x0083,0x9241,0x9240,0x0083,0xD4FA,0xB2C5,0x0091,0x0089,0x0085,0x0083,0xDED0, 0xCAD6,0x0083,0x91FE,0xECE9,0x0085,0x0083,0xECE8,0xC9C8,0x0083,0x91FD,0x91FC,0x0089,0x0085,0x0083,0x91FB,0xECE7, 0x0083,0x91FA,0xB1E2,0x0085,0x0083,0xCBF9,0xB7BF,0x0083,0xECE5,0xECE6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x91F9, 0x91F8,0x0083,0x91F7,0x91F6,0x0085,0x0083,0x91F5,0xBBA7,0x0083,0x91F4,0x91F3,0x0089,0x0085,0x0083,0xB4F7,0xB4C1, 0x0083,0x91F2,0x91F1,0x0085,0x0083,0x91F0,0x91EF,0x0083,0xC2BE,0x91EE,0x0091,0x0089,0x0085,0x0083,0xEAAF,0x91ED, 0x0083,0xBDD8,0x91EC,0x0085,0x0083,0x91EB,0x91EA,0x0083,0x91E9,0xEAAD,0x0089,0x0085,0x0083,0xEAAE,0x91E8,0x0083, 0xEAAB,0xEAAC,0x0085,0x0083,0x91E7,0xEAAA,0x0083,0x91E6,0x91E5,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x91E4, 0xEAA9,0x0083,0xC6DD,0x91E3,0x0085,0x0083,0xD5BD,0xEAA8,0x0083,0xBBF2,0xE3DE,0x0089,0x0085,0x0083,0x91E2,0x91E1, 0x0083,0xBDE4,0xCED2,0x0085,0x0083,0xB3C9,0xCFB7,0x0083,0xC8D6,0xCAF9,0x0091,0x0089,0x0085,0x0083,0xD0E7,0xEAA7, 0x0083,0xCEEC,0x91E0,0x0085,0x0083,0xB8EA,0x91DF,0x0083,0xEDB0,0x91DE,0x0089,0x0085,0x0083,0x91DD,0x91DC,0x0083, 0x91DB,0x91DA,0x0085,0x0083,0x91D9,0xDCB2,0x0083,0x91D8,0x91D7,0x00A1,0x0091,0x0089,0x0085,0x0083,0x91D6,0x91D5, 0x0083,0x91D4,0x91D3,0x0085,0x0083,0x91D2,0x91D1,0x0083,0x91D0,0xE3C2,0x0089,0x0085,0x0083,0x91CF,0x91CE,0x0083, 0x91CD,0x91CC,0x0085,0x0083,0x91CB,0x91CA,0x0083,0x91C9,0x91C8,0x0091,0x0089,0x0085,0x0083,0x91C7,0x91C6,0x0083, 0x91C5,0x91C4,0x0085,0x0083,0x91C3,0x91C2,0x0083,0xC5B3,0x91C1,0x0089,0x0085,0x0083,0x91C0,0x91BF,0x0083,0x91BE, 0x91BD,0x0085,0x0083,0x91BC,0x91BB,0x0083,0x91BA,0x91B9,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x91B8, 0x91B7,0x0083,0x91B6,0x91B5,0x0085,0x0083,0x91B4,0x91B3,0x0083,0x91B2,0x91B1,0x0089,0x0085,0x0083,0xE3C1,0x91B0, 0x0083,0xC0C1,0xEDAF,0x0085,0x0083,0x91AF,0x91AE,0x0083,0x91AD,0x91AC,0x0091,0x0089,0x0085,0x0083,0x91AB,0xEDAE, 0x0083,0xB0C3,0x91AA,0x0085,0x0083,0xD0B8,0x91A9,0x0083,0x91A8,0x91A7,0x0089,0x0085,0x0083,0x91A6,0x91A5,0x0083, 0xB6AE,0x91A4,0x0085,0x0083,0x91A3,0x91A2,0x0083,0xBAB6,0x91A1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x91A0,0x919F, 0x0083,0x919E,0x919D,0x0085,0x0083,0x919C,0xE3C0,0x0083,0x919B,0x919A,0x0089,0x0085,0x0083,0x9199,0x9198,0x0083, 0x9197,0x9196,0x0085,0x0083,0x9195,0x9194,0x0083,0x9193,0x9192,0x0091,0x0089,0x0085,0x0083,0xE3BD,0x9191,0x0083, 0x9190,0xEDAC,0x0085,0x0083,0xBAA9,0xE3BF,0x0083,0x918F,0x918E,0x0089,0x0085,0x0083,0x918D,0x918C,0x0083,0x918B, 0x918A,0x0085,0x0083,0x9189,0x9188,0x0083,0x9187,0xEDAD,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9186,0x9185, 0x0083,0x9184,0x9183,0x0085,0x0083,0x9182,0x9181,0x0083,0x9180,0x917E,0x0089,0x0085,0x0083,0xE3BE,0x917D,0x0083, 0x917C,0x917B,0x0085,0x0083,0x917A,0x9179,0x0083,0xD4F7,0x9178,0x0091,0x0089,0x0085,0x0083,0x9177,0xB1EF,0x0083, 0x9176,0x9175,0x0085,0x0083,0x9174,0x9173,0x0083,0x9172,0x9171,0x0089,0x0085,0x0083,0x9170,0x916F,0x0083,0x916E, 0x916D,0x0085,0x0083,0x916C,0x916B,0x0083,0x916A,0x9169,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9168,0x9167,0x0083, 0x9166,0x9165,0x0085,0x0083,0x9164,0xBFB6,0x0083,0x9163,0xE3BC,0x0089,0x0085,0x0083,0x9162,0x9161,0x0083,0x9160, 0x915F,0x0085,0x0083,0xCEBF,0x915E,0x0083,0x915D,0x915C,0x0091,0x0089,0x0085,0x0083,0x915B,0x915A,0x0083,0x9159, 0x9158,0x0085,0x0083,0xBFAE,0xBBDB,0x0083,0x9157,0x9156,0x0089,0x0085,0x0083,0x9155,0x9154,0x0083,0xC2FD,0x9153, 0x0085,0x0083,0x9152,0x9151,0x0083,0x9150,0xEDAB,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x914F, 0x914E,0x0083,0x914D,0x914C,0x0085,0x0083,0x914B,0x914A,0x0083,0x9149,0xC4BD,0x0089,0x0085,0x0083,0x9148,0x9147, 0x0083,0x9146,0xC9E5,0x0085,0x0083,0x9145,0x9144,0x0083,0xC9F7,0x9143,0x0091,0x0089,0x0085,0x0083,0xBBC5,0x9142, 0x0083,0xE3BB,0x9141,0x0085,0x0083,0xB4C8,0x9140,0x0083,0x90FE,0x90FD,0x0089,0x0085,0x0083,0x90FC,0x90FB,0x0083, 0x90FA,0x90F9,0x0085,0x0083,0x90F8,0xD4B8,0x0083,0x90F7,0x90F6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x90F5,0x90F4, 0x0083,0x90F3,0x90F2,0x0085,0x0083,0x90F1,0x90F0,0x0083,0x90EF,0x90EE,0x0089,0x0085,0x0083,0x90ED,0x90EC,0x0083, 0x90EB,0x90EA,0x0085,0x0083,0x90E9,0x90E8,0x0083,0x90E7,0x90E6,0x0091,0x0089,0x0085,0x0083,0x90E5,0xE3BA,0x0083, 0x90E4,0x90E3,0x0085,0x0083,0x90E2,0xC0A2,0x0083,0xE3B4,0x90E1,0x0089,0x0085,0x0083,0xB7DF,0xE3B6,0x0083,0x90E0, 0x90DF,0x0085,0x0083,0xE3B3,0xB8D0,0x0083,0x90DE,0x90DD,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x90DC,0x90DB, 0x0083,0xD3DE,0x90DA,0x0085,0x0083,0x90D9,0x90D8,0x0083,0x90D7,0xE3B5,0x0089,0x0085,0x0083,0x90D6,0x90D5,0x0083, 0x90D4,0x90D3,0x0085,0x0083,0x90D2,0xD2E2,0x0083,0xE3B9,0xEDAA,0x0091,0x0089,0x0085,0x0083,0x90D1,0x90D0,0x0083, 0x90CF,0xD3E4,0x0085,0x0083,0xD3FA,0x90CE,0x0083,0xEDA9,0x90CD,0x0089,0x0085,0x0083,0x90CC,0x90CB,0x0083,0x90CA, 0xB3EE,0x0085,0x0083,0xE3B8,0x90C9,0x0083,0x90C8,0x90C7,0x00A1,0x0091,0x0089,0x0085,0x0083,0x90C6,0x90C5,0x0083, 0xD0CA,0xC8C7,0x0085,0x0083,0x90C4,0x90C3,0x0083,0xBBCC,0x90C2,0x0089,0x0085,0x0083,0xE3B7,0xCFEB,0x0083,0x90C1, 0x90C0,0x0085,0x0083,0xB6E8,0xB9DF,0x0083,0xB5AC,0xB2D1,0x0091,0x0089,0x0085,0x0083,0xE3AB,0xB1B9,0x0083,0x90BF, 0xB3CD,0x0085,0x0083,0xB2D2,0xBEE5,0x0083,0xB5EB,0x90BE,0x0089,0x0085,0x0083,0x90BD,0x90BC,0x0083,0x90BB,0x90BA, 0x0085,0x0083,0xBBDD,0xCEA9,0x0083,0x90B9,0xE3AE,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCFA7,0x90B8, 0x0083,0xE3B1,0x90B7,0x0085,0x0083,0xE3AF,0x90B6,0x0083,0x90B5,0xCCE8,0x0089,0x0085,0x0083,0x90B4,0x90B3,0x0083, 0x90B2,0xBBF3,0x0085,0x0083,0x90B1,0x90B0,0x0083,0x90AF,0x90AE,0x0091,0x0089,0x0085,0x0083,0x90AD,0xCDEF,0x0083, 0xBEAA,0x90AC,0x0085,0x0083,0x90AB,0x90AA,0x0083,0xE3B0,0xC7E9,0x0089,0x0085,0x0083,0x90A9,0x90A8,0x0083,0x90A7, 0x90A6,0x0085,0x0083,0x90A5,0x90A4,0x0083,0x90A3,0x90A2,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB5BF,0xE3AC,0x0083, 0x90A1,0x90A0,0x0085,0x0083,0xBCC2,0x909F,0x0083,0x909E,0x909D,0x0089,0x0085,0x0083,0xE3B2,0x909C,0x0083,0xB1AF, 0xE3AD,0x0085,0x0083,0x909B,0xC3F5,0x0083,0x909A,0xE3A5,0x0091,0x0089,0x0085,0x0083,0xD0FC,0xEDA8,0x0083,0x9099, 0x9098,0x0085,0x0083,0xC4FA,0x9097,0x0083,0xD4C3,0x9096,0x0089,0x0085,0x0083,0x9095,0xBBBC,0x0083,0x9094,0x9093, 0x0085,0x0083,0xD3C6,0xCEF2,0x0083,0x9092,0xE3A6,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x9091,0xE3AA,0x0083, 0xE3A4,0x9090,0x0085,0x0083,0x908F,0x908E,0x0083,0xE3A3,0x908D,0x0089,0x0085,0x0083,0xBBDA,0x908C,0x0083,0xE3A8, 0x908B,0x0085,0x0083,0x908A,0x9089,0x0083,0x9088,0xBAB7,0x0091,0x0089,0x0085,0x0083,0xE3A9,0x9087,0x0083,0x9086, 0xCFA4,0x0085,0x0083,0x9085,0x9084,0x0083,0x9083,0x9082,0x0089,0x0085,0x0083,0xC7C4,0xE3A7,0x0083,0x9081,0x9080, 0x0085,0x0083,0x907E,0xD3C1,0x0083,0x907D,0xE3A2,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC4D5,0xE2FC,0x0083,0xE2FD, 0xE2FB,0x0085,0x0083,0xE2FA,0x907C,0x0083,0xB6F1,0x907B,0x0089,0x0085,0x0083,0x907A,0xBFD2,0x0083,0x9079,0x9078, 0x0085,0x0083,0xC7A1,0xCFA2,0x0083,0x9077,0xB9A7,0x0091,0x0089,0x0085,0x0083,0xCCF1,0xB6B2,0x0083,0xE3A1,0xB6F7, 0x0085,0x0083,0xBADE,0xEDA4,0x0083,0x9076,0x9075,0x0089,0x0085,0x0083,0xD0F4,0xEDA7,0x0083,0xBBD6,0x9074,0x0085, 0x0083,0x9073,0x9072,0x0083,0x9071,0xEDA2,0x2069,0x1075,0x087B,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F, 0x0087,0x0083,0x9070,0x0083,0x906F,0xEDA3,0x0085,0x0083,0xEDA6,0x906E,0x0083,0x906D,0x906C,0x0089,0x0085,0x0083, 0xCBA1,0x906B,0x0083,0x906A,0xBAE3,0x0085,0x0083,0x9069,0xBFD6,0x0083,0x9068,0x9067,0x0091,0x0089,0x0085,0x0083, 0xBBD0,0x9066,0x0083,0xC1B5,0x9065,0x0085,0x0083,0x9064,0x9063,0x0083,0x9062,0x9061,0x0089,0x0085,0x0083,0x9060, 0x905F,0x0083,0xCAD1,0xE2FE,0x0085,0x0083,0xEDA5,0x905E,0x0083,0xE2F8,0x905D,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x905C,0xEDA1,0x0083,0xD7DC,0x905B,0x0085,0x0083,0x905A,0x9059,0x0083,0x9058,0x9057,0x0089,0x0085,0x0083,0xE2F0, 0x9056,0x0083,0x9055,0x9054,0x0085,0x0083,0x9053,0x9052,0x0083,0xC7D3,0x9051,0x0091,0x0089,0x0085,0x0083,0x9050, 0x904F,0x0083,0xE2F6,0xB9D6,0x0085,0x0083,0xE2F5,0xD4B9,0x0083,0xD0D4,0xE2F1,0x0089,0x0085,0x0083,0xBCB1,0x904E, 0x0083,0x904D,0x904C,0x0085,0x0083,0xE2F9,0xB5A1,0x0083,0x904B,0x904A,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xCBBC,0xC1AF,0x0083,0xE2F2,0x9049,0x0085,0x0083,0xE2EF,0x9048,0x0083,0x9047,0xB2C0,0x0089,0x0085,0x0083,0xC5C2, 0xD5FA,0x0083,0x9046,0xC5AD,0x0085,0x0083,0x9045,0x9044,0x0083,0xE2F3,0xD4F5,0x0091,0x0089,0x0085,0x0083,0xE2F4, 0x9043,0x0083,0x9042,0xE2F7,0x0085,0x0083,0x9041,0x9040,0x0083,0x8FFE,0xE2EB,0x0089,0x0085,0x0083,0xE2EA,0xE2E6, 0x0083,0xE2E4,0xCBCB,0x0085,0x0083,0xCCAC,0xBBB3,0x0083,0xB7DE,0xE2E9,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBAF6, 0x8FFD,0x0083,0xD0C3,0x8FFC,0x0085,0x0083,0x8FFB,0xE2EE,0x0083,0x8FFA,0x8FF9,0x0089,0x0085,0x0083,0xC4EE,0x8FF8, 0x0083,0x8FF7,0x8FF6,0x0085,0x0083,0xB3C0,0x8FF5,0x0083,0x8FF4,0xE2E5,0x0091,0x0089,0x0085,0x0083,0xE2ED,0x8FF3, 0x0083,0xBFEC,0xE2EC,0x0085,0x0083,0x8FF2,0x8FF1,0x0083,0xD3C7,0x8FF0,0x0089,0x0085,0x0083,0x8FEF,0xE2E8,0x0083, 0x8FEE,0x8FED,0x0085,0x0083,0xE2E7,0xD6D2,0x0083,0x8FEC,0x8FEB,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xE3C3,0x8FEA,0x0083,0x8FE9,0x8FE8,0x0085,0x0083,0xC3A6,0xCDFC,0x0083,0xD6BE,0xE2E2,0x0089,0x0085,0x0083,0x8FE7, 0x8FE6,0x0083,0x8FE5,0xDFAF,0x0085,0x0083,0xECFD,0xECFE,0x0083,0xE2E3,0x8FE4,0x0091,0x0089,0x0085,0x0083,0xC8CC, 0xBCC9,0x0083,0x8FE3,0x8FE2,0x0085,0x0083,0xE2E1,0x8FE1,0x0083,0x8FE0,0xD2E4,0x0089,0x0085,0x0083,0xB1D8,0xE2E0, 0x0083,0xD0C4,0x8FDF,0x0085,0x0083,0x8FDE,0x8FDD,0x0083,0x8FDC,0x8FDB,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBBD5, 0xE1E8,0x0083,0x8FDA,0x8FD9,0x0085,0x0083,0x8FD8,0x8FD7,0x0083,0xB5C2,0x8FD6,0x0089,0x0085,0x0083,0xE1E7,0x8FD5, 0x0083,0x8FD4,0x8FD3,0x0085,0x0083,0x8FD2,0x8FD1,0x0083,0x8FD0,0xCEA2,0x0091,0x0089,0x0085,0x0083,0xE1E6,0x8FCF, 0x0083,0x8FCE,0xD1AD,0x0085,0x0083,0x8FCD,0xE1E5,0x0083,0x8FCC,0x8FCB,0x0089,0x0085,0x0083,0x8FCA,0x8FC9,0x0083, 0x8FC8,0x8FC7,0x0085,0x0083,0xD3F9,0x8FC6,0x0083,0x8FC5,0x8FC4,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8FC3, 0xE1E4,0x0083,0x8FC2,0x8FC1,0x0085,0x0083,0xE1E3,0xC5C7,0x0083,0xB5C3,0x8FC0,0x0089,0x0085,0x0083,0xE1E2,0x8FBF, 0x0083,0x8FBE,0xCDBD,0x0085,0x0083,0x8FBD,0xD0EC,0x0083,0x8FBC,0x8FBB,0x0091,0x0089,0x0085,0x0083,0x8FBA,0xE1E1, 0x0083,0xC2C9,0xBBB2,0x0085,0x0083,0xE1E0,0xBADC,0x0083,0xE1DF,0x8FB9,0x0089,0x0085,0x0083,0xB4FD,0xBEB6,0x0083, 0x8FB8,0xE1DE,0x0085,0x0083,0xD5F7,0xCDF9,0x0083,0x8FB7,0x8FB6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8FB5,0xB1CB, 0x0083,0xB3B9,0x8FB4,0x0085,0x0083,0xD2DB,0x8FB3,0x0083,0xE1DD,0x8FB2,0x0089,0x0085,0x0083,0x8FB1,0x8FB0,0x0083, 0xE1DC,0x8FAF,0x0085,0x0083,0xD3B0,0xD5C3,0x0083,0x8FAE,0x8FAD,0x0091,0x0089,0x0085,0x0083,0xC5ED,0xB1F2,0x0083, 0x8FAC,0xB1EB,0x0085,0x0083,0xB2CA,0x8FAB,0x0083,0x8FAA,0xD1E5,0x0089,0x0085,0x0083,0x8FA9,0xCDAE,0x0083,0x8FA8, 0xD0CE,0x0085,0x0083,0xE1EA,0x8FA7,0x0083,0x8FA6,0x8FA5,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xD2CD, 0x0083,0x8FA4,0x8FA3,0x0085,0x0083,0x8FA2,0x8FA1,0x0083,0xE5E9,0xE5E7,0x0089,0x0085,0x0083,0xE5E8,0xC2BC,0x0083, 0x8FA0,0xB5B1,0x0085,0x0083,0xB9E9,0x8F9F,0x0083,0xE5E6,0x8F9E,0x0091,0x0089,0x0085,0x0083,0x8F9D,0x8F9C,0x0083, 0x8F9B,0x8F9A,0x0085,0x0083,0x8F99,0x8F98,0x0083,0x8F97,0x8F96,0x0089,0x0085,0x0083,0x8F95,0x8F94,0x0083,0x8F93, 0x8F92,0x0085,0x0083,0x8F91,0x8F90,0x0083,0xECB0,0x8F8F,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8F8E,0x8F8D,0x0083, 0xE5F6,0x8F8C,0x0085,0x0083,0xC7BF,0xB5AF,0x0083,0x8F8B,0x8F8A,0x0089,0x0085,0x0083,0x8F89,0x8F88,0x0083,0x8F87, 0x8F86,0x0085,0x0083,0x8F85,0xC8F5,0x0083,0x8F84,0xCDE4,0x0091,0x0089,0x0085,0x0083,0x8F83,0xE5F4,0x0083,0x8F82, 0x8F81,0x0085,0x0083,0xE5F2,0xE5F3,0x0083,0x8F80,0xBBA1,0x0089,0x0085,0x0083,0xCFD2,0xC3D6,0x0083,0x8F7E,0x8F7D, 0x0085,0x0083,0x8F7C,0x8F7B,0x0083,0xD5C5,0xB5DC,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8F7A,0x8F79,0x0083, 0x8F78,0xB3DA,0x0085,0x0083,0x8F77,0x8F76,0x0083,0xBAEB,0xB8A5,0x0089,0x0085,0x0083,0x8F75,0xD2FD,0x0083,0x8F74, 0xB9AD,0x0085,0x0083,0x8F73,0xDFB1,0x0083,0x8F72,0xCABD,0x0091,0x0089,0x0085,0x0083,0x8F71,0x8F70,0x0083,0x8F6F, 0xDFAE,0x0085,0x0083,0xB1D7,0x8F6E,0x0083,0xDEC4,0x8F6D,0x0089,0x0085,0x0083,0x8F6C,0x8F6B,0x0083,0xC5AA,0xC6FA, 0x0085,0x0083,0xD2EC,0xDBCD,0x0083,0xBFAA,0xD8A5,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDEC3,0x8F6A,0x0083,0x8F69, 0x8F68,0x0085,0x0083,0xBDA8,0x8F67,0x0083,0x8F66,0xCDA2,0x0089,0x0085,0x0083,0xD1D3,0x8F65,0x0083,0xDBC8,0x8F64, 0x0085,0x0083,0x8F63,0x8F62,0x0083,0x8F61,0x8F60,0x0091,0x0089,0x0085,0x0083,0x8F5F,0x8F5E,0x0083,0x8F5D,0x8F5C, 0x0085,0x0083,0xE2DE,0x8F5B,0x0083,0xE2DD,0x8F5A,0x0089,0x0085,0x0083,0x8F59,0x8F58,0x0083,0x8F57,0x8F56,0x0085, 0x0083,0x8F55,0x8F54,0x0083,0x8F53,0x8F52,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8F51,0x8F50,0x0083, 0x8F4F,0xE2DC,0x0085,0x0083,0x8F4E,0x8F4D,0x0083,0x8F4C,0x8F4B,0x0089,0x0085,0x0083,0xC1CE,0x8F4A,0x0083,0x8F49, 0xC0AA,0x0085,0x0083,0xE2DA,0xE2DB,0x0083,0x8F48,0x8F47,0x0091,0x0089,0x0085,0x0083,0x8F46,0x8F45,0x0083,0x8F44, 0x8F43,0x0085,0x0083,0xC0C8,0xC1AE,0x0083,0x8F42,0x8F41,0x0089,0x0085,0x0083,0x8F40,0x8EFE,0x0083,0x8EFD,0x8EFC, 0x0085,0x0083,0x8EFB,0x8EFA,0x0083,0x8EF9,0x8EF8,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE2D7,0x8EF7,0x0083,0x8EF6, 0x8EF5,0x0085,0x0083,0x8EF4,0xE2D5,0x0083,0xD3B9,0xBFB5,0x0089,0x0085,0x0083,0xCAFC,0xE2D6,0x0083,0x8EF3,0xE2D8, 0x0085,0x0083,0x8EF2,0x8EF1,0x0083,0x8EF0,0x8EEF,0x0091,0x0089,0x0085,0x0083,0x8EEE,0xCDA5,0x0083,0x8EED,0x8EEC, 0x0085,0x0083,0x8EEB,0x8EEA,0x0083,0x8EE9,0xD7F9,0x0089,0x0085,0x0083,0xB6C8,0xE2D3,0x0083,0x8EE8,0x8EE7,0x0085, 0x0083,0x8EE6,0x8EE5,0x0083,0xE2D4,0xB7CF,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC5D3,0x8EE4,0x0083,0xB8AE, 0x8EE3,0x0085,0x0083,0xB8FD,0xC3ED,0x0083,0x8EE2,0xB5EA,0x0089,0x0085,0x0083,0xE2D2,0xB5D7,0x0083,0xD3A6,0xBFE2, 0x0085,0x0083,0x8EE1,0xE2D0,0x0083,0xC2AE,0xD0F2,0x0091,0x0089,0x0085,0x0083,0x8EE0,0x8EDF,0x0083,0x8EDE,0xE2D1, 0x0085,0x0083,0xB4B2,0x8EDD,0x0083,0x8EDC,0xB1D3,0x0089,0x0085,0x0083,0xC7EC,0x8EDB,0x0083,0xD7AF,0x8EDA,0x0085, 0x0083,0x8ED9,0x8ED8,0x0083,0xE2CF,0xB9E3,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8ED7,0xD3C4,0x0083,0xD3D7,0xBBC3, 0x0085,0x0083,0xE7DB,0x8ED6,0x0083,0xD0D2,0x8ED5,0x0089,0x0085,0x0083,0xB2A2,0x8ED4,0x0083,0xC4EA,0xC6BD,0x0085, 0x0083,0xB8C9,0x8ED3,0x0083,0x8ED2,0x8ED1,0x0091,0x0089,0x0085,0x0083,0x8ED0,0x8ECF,0x0083,0x8ECE,0x8ECD,0x0085, 0x0083,0x8ECC,0x8ECB,0x0083,0x8ECA,0x8EC9,0x0089,0x0085,0x0083,0x8EC8,0x8EC7,0x0083,0x8EC6,0x8EC5,0x0085,0x0083, 0xB4B1,0xE1A6,0x0083,0x8EC4,0x8EC3,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xE1A5,0x0083,0x8EC2, 0x8EC1,0x0085,0x0083,0xE1A4,0x8EC0,0x0083,0x8EBF,0x8EBE,0x0089,0x0085,0x0083,0x8EBD,0x8EBC,0x0083,0xC4BB,0xE1A3, 0x0085,0x0083,0x8EBB,0x8EBA,0x0083,0x8EB9,0x8EB8,0x0091,0x0089,0x0085,0x0083,0x8EB7,0x8EB6,0x0083,0x8EB5,0xBBCF, 0x0085,0x0083,0x8EB4,0x8EB3,0x0083,0x8EB2,0x8EB1,0x0089,0x0085,0x0083,0x8EB0,0x8EAF,0x0083,0xB7F9,0xE1A2,0x0085, 0x0083,0x8EAE,0xC3DD,0x0083,0x8EAD,0x8EAC,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8EAB,0x8EAA,0x0083,0xC3B1,0xE0FE, 0x0085,0x0083,0xE0FD,0x8EA9,0x0083,0x8EA8,0xB3A3,0x0089,0x0085,0x0083,0xE1A1,0x8EA7,0x0083,0x8EA6,0x8EA5,0x0085, 0x0083,0x8EA4,0x8EA3,0x0083,0xE0FC,0x8EA2,0x0091,0x0089,0x0085,0x0083,0x8EA1,0xB0EF,0x0083,0xCFAF,0x8EA0,0x0085, 0x0083,0x8E9F,0x8E9E,0x0083,0x8E9D,0x8E9C,0x0089,0x0085,0x0083,0xD6A1,0xB4F8,0x0083,0x8E9B,0x8E9A,0x0085,0x0083, 0x8E99,0x8E98,0x0083,0x8E97,0x8E96,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8E95,0x8E94,0x0083,0xB5DB,0xD6C4, 0x0085,0x0083,0xB2AF,0xD6E3,0x0083,0xE0F9,0xC1B1,0x0089,0x0085,0x0083,0x8E93,0xCCFB,0x0083,0xC5C1,0xE0FA,0x0085, 0x0083,0x8E92,0x8E91,0x0083,0xE0FB,0xD5CA,0x0091,0x0089,0x0085,0x0083,0xE0F8,0x8E90,0x0083,0x8E8F,0xCFA3,0x0085, 0x0083,0x8E8E,0x8E8D,0x0083,0x8E8C,0xCAA6,0x0089,0x0085,0x0083,0x8E8B,0xB7AB,0x0083,0xCBA7,0x8E8A,0x0085,0x0083, 0xB2BC,0xCAD0,0x0083,0xB1D2,0x8E89,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8E88,0xBDED,0x0083,0xD9E3,0x8E87,0x0085, 0x0083,0x8E86,0x8E85,0x0083,0x8E84,0x8E83,0x0089,0x0085,0x0083,0xCFEF,0x8E82,0x0083,0x8E81,0xB0CD,0x0085,0x0083, 0xCBC8,0xD2D1,0x0083,0xBCBA,0x8E80,0x0091,0x0089,0x0085,0x0083,0xDBCF,0xB2EE,0x0083,0x8E7E,0x8E7D,0x0085,0x0083, 0xCED7,0x8E7C,0x0083,0xB9AE,0xBEDE,0x0089,0x0085,0x0083,0xC7C9,0xD7F3,0x0083,0xB9A4,0x8E7B,0x0085,0x0083,0x8E7A, 0xB3B2,0x0083,0xD1B2,0x8E79,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8E78,0xD6DD,0x0083,0xB4A8,0x8E77, 0x0085,0x0083,0xE7DD,0x8E76,0x0083,0x8E75,0x8E74,0x0089,0x0085,0x0083,0x8E73,0x8E72,0x0083,0x8E71,0x8E70,0x0085, 0x0083,0x8E6F,0x8E6E,0x0083,0x8E6D,0x8E6C,0x0091,0x0089,0x0085,0x0083,0x8E6B,0x8E6A,0x0083,0xCEA1,0x8E69,0x0085, 0x0083,0x8E68,0x8E67,0x0083,0x8E66,0x8E65,0x0089,0x0085,0x0083,0x8E64,0x8E63,0x0083,0xE1DB,0x8E62,0x0085,0x0083, 0x8E61,0x8E60,0x0083,0x8E5F,0x8E5E,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8E5D,0x8E5C,0x0083,0x8E5B,0x8E5A,0x0085, 0x0083,0x8E59,0x8E58,0x0083,0x8E57,0x8E56,0x0089,0x0085,0x0083,0xE1DA,0x8E55,0x0083,0x8E54,0x8E53,0x0085,0x0083, 0x8E52,0x8E51,0x0083,0x8E50,0x8E4F,0x0091,0x0089,0x0085,0x0083,0x8E4E,0x8E4D,0x0083,0x8E4C,0x8E4B,0x0085,0x0083, 0x8E4A,0x8E49,0x0083,0x8E48,0x8E47,0x0089,0x0085,0x0083,0x8E46,0x8E45,0x0083,0x8E44,0x8E43,0x0085,0x0083,0x8E42, 0x8E41,0x0083,0x8E40,0x8DFE,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8DFD,0x8DFC,0x0083,0xE1D8,0x8DFB,0x0085, 0x0083,0x8DFA,0x8DF9,0x0083,0xE1D7,0x8DF8,0x0089,0x0085,0x0083,0x8DF7,0x8DF6,0x0083,0x8DF5,0x8DF4,0x0085,0x0083, 0x8DF3,0x8DF2,0x0083,0x8DF1,0x8DF0,0x0091,0x0089,0x0085,0x0083,0x8DEF,0x8DEE,0x0083,0x8DED,0x8DEC,0x0085,0x0083, 0x8DEB,0x8DEA,0x0083,0x8DE9,0x8DE8,0x0089,0x0085,0x0083,0x8DE7,0x8DE6,0x0083,0x8DE5,0x8DE4,0x0085,0x0083,0x8DE3, 0xE1D6,0x0083,0x8DE2,0x8DE1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8DE0,0x8DDF,0x0083,0x8DDE,0x8DDD,0x0085,0x0083, 0x8DDC,0x8DDB,0x0083,0x8DDA,0x8DD9,0x0089,0x0085,0x0083,0x8DD8,0x8DD7,0x0083,0x8DD6,0xE1D5,0x0085,0x0083,0x8DD5, 0x8DD4,0x0083,0x8DD3,0x8DD2,0x0091,0x0089,0x0085,0x0083,0xE1CF,0x8DD1,0x0083,0x8DD0,0xE1CD,0x0085,0x0083,0xE1D1, 0x8DCF,0x0083,0xE1D4,0x8DCE,0x0089,0x0085,0x0083,0x8DCD,0x8DCC,0x0083,0x8DCB,0x8DCA,0x0085,0x0083,0x8DC9,0x8DC8, 0x0083,0x8DC7,0x8DC6,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8DC5,0x8DC4,0x0083,0xE1D0,0x8DC3, 0x0085,0x0083,0xE1CE,0x8DC2,0x0083,0x8DC1,0xE1C9,0x0089,0x0085,0x0083,0x8DC0,0x8DBF,0x0083,0x8DBE,0x8DBD,0x0085, 0x0083,0x8DBC,0x8DBB,0x0083,0x8DBA,0x8DB9,0x0091,0x0089,0x0085,0x0083,0x8DB8,0x8DB7,0x0083,0x8DB6,0xC7B6,0x0085, 0x0083,0xE1D2,0xE1D3,0x0083,0x8DB5,0x8DB4,0x0089,0x0085,0x0083,0xEFFA,0x8DB3,0x0083,0x8DB2,0x8DB1,0x0085,0x0083, 0x8DB0,0x8DAF,0x0083,0x8DAE,0x8DAD,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8DAC,0xE1CA,0x0083,0xE1CC,0x8DAB,0x0085, 0x0083,0x8DAA,0x8DA9,0x0083,0x8DA8,0x8DA7,0x0089,0x0085,0x0083,0x8DA6,0x8DA5,0x0083,0x8DA4,0xE1CB,0x0085,0x0083, 0x8DA3,0x8DA2,0x0083,0x8DA1,0x8DA0,0x0091,0x0089,0x0085,0x0083,0x8D9F,0xE1C4,0x0083,0xD5B8,0x8D9E,0x0085,0x0083, 0x8D9D,0x8D9C,0x0083,0xB1C0,0x8D9B,0x0089,0x0085,0x0083,0xE1C2,0xE1C3,0x0083,0x8D9A,0xE1C5,0x0085,0x0083,0x8D99, 0x8D98,0x0083,0x8D97,0x8D96,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8D95,0xE1C6,0x0083,0x8D94,0x8D93,0x0085, 0x0083,0xE1C8,0x8D92,0x0083,0x8D91,0x8D90,0x0089,0x0085,0x0083,0x8D8F,0xD1C2,0x0083,0x8D8E,0xB4DE,0x0085,0x0083, 0x8D8D,0x8D8C,0x0083,0x8D8B,0x8D8A,0x0091,0x0089,0x0085,0x0083,0x8D89,0xC6E9,0x0083,0x8D88,0x8D87,0x0085,0x0083, 0x8D86,0x8D85,0x0083,0x8D84,0x8D83,0x0089,0x0085,0x0083,0xB3E7,0xE1C7,0x0083,0x8D82,0x8D81,0x0085,0x0083,0xE1C1, 0xE1C0,0x0083,0x8D80,0x8D7E,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8D7D,0x8D7C,0x0083,0x8D7B,0x8D7A,0x0085,0x0083, 0xBEFE,0x8D79,0x0083,0x8D78,0x8D77,0x0089,0x0085,0x0083,0x8D76,0x8D75,0x0083,0x8D74,0x8D73,0x0085,0x0083,0x8D72, 0x8D71,0x0083,0x8D70,0xB7E5,0x0091,0x0089,0x0085,0x0083,0x8D6F,0x8D6E,0x0083,0xC7CD,0x8D6D,0x0085,0x0083,0x8D6C, 0xD3F8,0x0083,0x8D6B,0xB6EB,0x0089,0x0085,0x0083,0x8D6A,0xC2CD,0x0083,0xE1BF,0xE1BD,0x0085,0x0083,0x8D69,0x8D68, 0x0083,0xCFBF,0x8D67,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8D66,0x8D65,0x0083,0x8D64,0x8D63,0x0085, 0x0083,0x8D62,0x8D61,0x0083,0xD6C5,0x8D60,0x0089,0x0085,0x0083,0x8D5F,0x8D5E,0x0083,0x8D5D,0x8D5C,0x0085,0x0083, 0x8D5B,0xE1BC,0x0083,0x8D5A,0x8D59,0x0091,0x0089,0x0085,0x0083,0x8D58,0x8D57,0x0083,0x8D56,0x8D55,0x0085,0x0083, 0xE1BE,0x8D54,0x0083,0x8D53,0x8D52,0x0089,0x0085,0x0083,0x8D51,0x8D50,0x0083,0x8D4F,0xE1BB,0x0085,0x0083,0x8D4E, 0x8D4D,0x0083,0xE1B9,0x8D4C,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBFF9,0x8D4B,0x0083,0xE1B4,0x8D4A,0x0085,0x0083, 0x8D49,0x8D48,0x0083,0x8D47,0xB0B6,0x0089,0x0085,0x0083,0xE1BA,0x8D46,0x0083,0xE1B2,0x8D45,0x0085,0x0083,0xD4C0, 0x8D44,0x0083,0xE1B7,0x8D43,0x0091,0x0089,0x0085,0x0083,0x8D42,0x8D41,0x0083,0xC1EB,0xE1B5,0x0085,0x0083,0xE1B6, 0x8D40,0x0083,0xD1D2,0x8CFE,0x0089,0x0085,0x0083,0x8CFD,0x8CFC,0x0083,0x8CFB,0x8CFA,0x0085,0x0083,0xE1B8,0xE1B3, 0x0083,0x8CF9,0x8CF8,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8CF7,0x8CF6,0x0083,0x8CF5,0xE1B1,0x0085,0x0083, 0xB5BA,0xE1B0,0x0083,0xE1AE,0xE1AD,0x0089,0x0085,0x0083,0xB8DA,0xE1AB,0x0083,0x8CF4,0xB2ED,0x0085,0x0083,0x8CF3, 0x8CF2,0x0083,0xE1AF,0xE1AA,0x0091,0x0089,0x0085,0x0083,0x8CF1,0x8CF0,0x0083,0xE1A9,0xE1A7,0x0085,0x0083,0x8CEF, 0x8CEE,0x0083,0x8CED,0xE1AC,0x0089,0x0085,0x0083,0x8CEC,0x8CEB,0x0083,0x8CEA,0x8CE9,0x0085,0x0083,0x8CE8,0xC6F1, 0x0083,0xCBEA,0x8CE7,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD3EC,0x8CE6,0x0083,0x8CE5,0x8CE4,0x0085,0x0083,0x8CE3, 0xE1A8,0x0083,0xD2D9,0x8CE2,0x0089,0x0085,0x0083,0x8CE1,0x8CE0,0x0083,0x8CDF,0x8CDE,0x0085,0x0083,0x8CDD,0x8CDC, 0x0083,0xC9BD,0x8CDB,0x0091,0x0089,0x0085,0x0083,0xCDCD,0xE5F8,0x0083,0x8CDA,0x8CD9,0x0085,0x0083,0x8CD8,0x8CD7, 0x0083,0x8CD6,0x8CD5,0x0089,0x0085,0x0083,0x8CD4,0xE5F0,0x0083,0xC2C4,0x8CD3,0x0085,0x0083,0xE5EF,0x8CD2,0x0083, 0xC2C5,0xCDC0,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x8CD1,0x0083,0xCAF4,0x8CD0,0x0085, 0x0083,0x8CCF,0x8CCE,0x0083,0x8CCD,0xE5ED,0x0089,0x0085,0x0083,0x8CCC,0x8CCB,0x0083,0x8CCA,0xD5B9,0x0085,0x0083, 0x8CC9,0x8CC8,0x0083,0x8CC7,0xD0BC,0x0091,0x0089,0x0085,0x0083,0xE5EC,0xC6C1,0x0083,0xCABA,0x8CC6,0x0085,0x0083, 0x8CC5,0xCEDD,0x0083,0xBDEC,0xCCEB,0x0089,0x0085,0x0083,0xC7FC,0x8CC4,0x0083,0x8CC3,0xBED3,0x0085,0x0083,0x8CC2, 0x8CC1,0x0083,0xB2E3,0xC6A8,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBED6,0xC4F2,0x0083,0xCEB2,0xBEA1,0x0085,0x0083, 0xC4E1,0xE5EA,0x0083,0xB3DF,0xD2FC,0x0089,0x0085,0x0083,0xCAAC,0x8CC0,0x0083,0x8CBF,0x8CBE,0x0085,0x0083,0xDECF, 0x8CBD,0x0083,0x8CBC,0xBECD,0x0091,0x0089,0x0085,0x0083,0x8CBB,0x8CBA,0x0083,0x8CB9,0x8CB8,0x0085,0x0083,0xDECE, 0x8CB7,0x0083,0x8CB6,0x8CB5,0x0089,0x0085,0x0083,0x8CB4,0xD2A2,0x0083,0x8CB3,0xDECD,0x0085,0x0083,0xD3C8,0x8CB2, 0x0083,0xDECC,0x8CB1,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8CB0,0x8CAF,0x0083,0x8CAE,0xB3A2,0x0085,0x0083, 0xE6D9,0x8CAD,0x0083,0xC9D0,0x8CAC,0x0089,0x0085,0x0083,0xB3BE,0x8CAB,0x0083,0xBCE2,0xE6D8,0x0085,0x0083,0xB6FB, 0x8CAA,0x0083,0x8CA9,0xC9D9,0x0091,0x0089,0x0085,0x0083,0x8CA8,0xD0A1,0x0083,0x8CA7,0x8CA6,0x0085,0x0083,0x8CA5, 0x8CA4,0x0083,0xD7F0,0xCEBE,0x0089,0x0085,0x0083,0x8CA3,0x8CA2,0x0083,0xBDAB,0x8CA1,0x0085,0x0083,0xC9E4,0x8CA0, 0x0083,0x8C9F,0xB7E2,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8C9E,0xCAD9,0x0083,0x8C9D,0x8C9C,0x0085,0x0083,0xB5BC, 0xD1B0,0x0083,0xCBC2,0xB6D4,0x0089,0x0085,0x0083,0xB4E7,0x8C9B,0x0083,0x8C9A,0x8C99,0x0085,0x0083,0x8C98,0x8C97, 0x0083,0x8C96,0x8C95,0x0091,0x0089,0x0085,0x0083,0xE5BE,0x8C94,0x0083,0xE5BC,0x8C93,0x0085,0x0083,0x8C92,0x8C91, 0x0083,0x8C90,0x8C8F,0x0089,0x0085,0x0083,0xD5AF,0x8C8E,0x0083,0x8C8D,0xC1C8,0x0085,0x0083,0xE5BB,0x8C8C,0x0083, 0x8C8B,0xB9D1,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8C8A,0xB2EC,0x0083,0xC4AF,0xC7DE,0x0085,0x0083, 0x8C89,0x8C88,0x0083,0x8C87,0x8C86,0x0089,0x0085,0x0083,0x8C85,0x8C84,0x0083,0x8C83,0x8C82,0x0085,0x0083,0x8C81, 0xD4A2,0x0083,0xBAAE,0x8C80,0x0091,0x0089,0x0085,0x0083,0xC3C2,0x8C7E,0x0083,0x8C7D,0x8C7C,0x0085,0x0083,0xB8BB, 0x8C7B,0x0083,0x8C7A,0x8C79,0x0089,0x0085,0x0083,0x8C78,0xBFDC,0x0083,0xC3DC,0xD2FA,0x0085,0x0083,0xBCC4,0x8C77, 0x0083,0xBCC5,0x8C76,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8C75,0xCBDE,0x0083,0xB1F6,0xBFED,0x0085,0x0083,0x8C74, 0x8C73,0x0083,0x8C72,0xC8DD,0x0089,0x0085,0x0083,0xE5B7,0x8C71,0x0083,0xBCD2,0xCFFC,0x0085,0x0083,0xD1E7,0xBAA6, 0x0083,0x8C70,0x8C6F,0x0091,0x0089,0x0085,0x0083,0xD4D7,0x8C6E,0x0083,0x8C6D,0x8C6C,0x0085,0x0083,0x8C6B,0xB9AC, 0x0083,0xCFDC,0x8C6A,0x0089,0x0085,0x0083,0x8C69,0x8C68,0x0083,0xBBC2,0xE5B6,0x0085,0x0083,0xCAD2,0xD0FB,0x0083, 0xBFCD,0xC9F3,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB3E8,0x8C67,0x0083,0xCAB5,0xB1A6,0x0085,0x0083,0xD2CB, 0xCDF0,0x0083,0xB6A8,0xD6E6,0x0089,0x0085,0x0083,0xB9D9,0xD7DA,0x0083,0x8C66,0xE5B4,0x0085,0x0083,0x8C65,0xE5B5, 0x0083,0x8C64,0x8C63,0x0091,0x0089,0x0085,0x0083,0x8C62,0xBAEA,0x0083,0x8C61,0x8C60,0x0085,0x0083,0xCDEA,0xCBCE, 0x0083,0x8C5F,0xB0B2,0x0089,0x0085,0x0083,0xCAD8,0xD3EE,0x0083,0x8C5E,0xD5AC,0x0085,0x0083,0xE5B3,0xCBFC,0x0083, 0x8C5D,0xC4FE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE5B2,0x8C5C,0x0083,0x8C5B,0xC4F5,0x0085,0x0083,0x8C5A,0x8C59, 0x0083,0xC8E6,0x8C58,0x0089,0x0085,0x0083,0x8C57,0x8C56,0x0083,0x8C55,0xB7F5,0x0085,0x0083,0x8C54,0xE6DC,0x0083, 0x8C53,0xE5EE,0x0091,0x0089,0x0085,0x0083,0xCAEB,0x8C52,0x0083,0x8C51,0x8C50,0x0085,0x0083,0xD8AB,0x8C4F,0x0083, 0xC2CF,0xBAA2,0x0089,0x0085,0x0083,0x8C4E,0x8C4D,0x0083,0xD1A7,0xE6DB,0x0085,0x0083,0xB9C2,0xBCBE,0x0083,0xE6DF, 0x8C4C,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x8C4B,0x0083,0xC3CF,0x8C4A,0x0085,0x0083,0xD0A2,0xD7CE, 0x0083,0xD8C3,0xE6DA,0x0089,0x0085,0x0083,0xCBEF,0xB4E6,0x0083,0xD7D6,0x8C49,0x0085,0x0083,0xD4D0,0xBFD7,0x0083, 0xE6DE,0x8C48,0x0091,0x0089,0x0085,0x0083,0xE6DD,0xD7D3,0x0083,0x8C47,0x8C46,0x0085,0x0083,0x8C45,0x8C44,0x0083, 0x8C43,0x8C42,0x0089,0x0085,0x0083,0x8C41,0x8C40,0x0083,0x8BFE,0x8BFD,0x0085,0x0083,0x8BFC,0x8BFB,0x0083,0x8BFA, 0x8BF9,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8BF8,0xE6D7,0x0083,0x8BF7,0x8BF6,0x0085,0x0083,0x8BF5,0x8BF4,0x0083, 0x8BF3,0x8BF2,0x0089,0x0085,0x0083,0x8BF1,0x8BF0,0x0083,0xE6D6,0x8BEF,0x0085,0x0083,0x8BEE,0xD9F8,0x0083,0x8BED, 0xE6D5,0x0091,0x0089,0x0085,0x0083,0x8BEC,0x8BEB,0x0083,0x8BEA,0x8BE9,0x0085,0x0083,0x8BE8,0x8BE7,0x0083,0x8BE6, 0x8BE5,0x0089,0x0085,0x0083,0x8BE4,0x8BE3,0x0083,0x8BE2,0x8BE1,0x0085,0x0083,0x8BE0,0x8BDF,0x0083,0x8BDE,0x8BDD, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8BDC,0x8BDB,0x0083,0x8BDA,0x8BD9,0x0085,0x0083,0x8BD8,0x8BD7,0x0083, 0x8BD6,0x8BD5,0x0089,0x0085,0x0083,0x8BD4,0x8BD3,0x0083,0xE6D3,0xE6D4,0x0085,0x0083,0x8BD2,0x8BD1,0x0083,0x8BD0, 0x8BCF,0x0091,0x0089,0x0085,0x0083,0x8BCE,0x8BCD,0x0083,0x8BCC,0x8BCB,0x0085,0x0083,0x8BCA,0x8BC9,0x0083,0x8BC8, 0x8BC7,0x0089,0x0085,0x0083,0xE6D2,0x8BC6,0x0083,0x8BC5,0x8BC4,0x0085,0x0083,0x8BC3,0x8BC2,0x0083,0x8BC1,0x8BC0, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x8BBF,0x8BBE,0x0083,0x8BBD,0x8BBC,0x0085,0x0083,0x8BBB,0x8BBA,0x0083,0x8BB9, 0x8BB8,0x0089,0x0085,0x0083,0x8BB7,0x8BB6,0x0083,0x8BB5,0x8BB4,0x0085,0x0083,0x8BB3,0x8BB2,0x0083,0x8BB1,0x8BB0, 0x0091,0x0089,0x0085,0x0083,0xE6CD,0x8BAF,0x0083,0x8BAE,0x8BAD,0x0085,0x0083,0x8BAC,0x8BAB,0x0083,0xE6C6,0x8BAA, 0x0089,0x0085,0x0083,0xC4DB,0x8BA9,0x0083,0x8BA8,0xE6CF,0x0085,0x0083,0x8BA7,0x8BA6,0x0083,0xE6CC,0x8BA5,0x0101, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB5D5,0xE6CB,0x0083,0x8BA4,0x8BA3,0x0085,0x0083,0x8BA2,0xE6D1,0x0083, 0x8BA1,0x8BA0,0x0089,0x0085,0x0083,0x8B9F,0xE6D0,0x0083,0x8B9E,0xE6CE,0x0085,0x0083,0x8B9D,0xE6C9,0x0083,0x8B9C, 0xE6C8,0x0091,0x0089,0x0085,0x0083,0x8B9B,0x8B9A,0x0083,0x8B99,0x8B98,0x0085,0x0083,0x8B97,0xCFD3,0x0083,0x8B96, 0x8B95,0x0089,0x0085,0x0083,0xBCB5,0x8B94,0x0083,0x8B93,0x8B92,0x0085,0x0083,0x8B91,0x8B90,0x0083,0x8B8F,0xC9A9, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xBCDE,0x8B8E,0x0083,0x8B8D,0xE6C5,0x0085,0x0083,0x8B8C,0x8B8B,0x0083,0x8B8A, 0x8B89,0x0089,0x0085,0x0083,0x8B88,0xE6CA,0x0083,0x8B87,0x8B86,0x0085,0x0083,0xEBF4,0x8B85,0x0083,0xCFB1,0xE6C7, 0x0091,0x0089,0x0085,0x0083,0x8B84,0x8B83,0x0083,0x8B82,0x8B81,0x0085,0x0083,0x8B80,0x8B7E,0x0083,0x8B7D,0xE6C1, 0x0089,0x0085,0x0083,0x8B7C,0x8B7B,0x0083,0x8B7A,0x8B79,0x0085,0x0083,0x8B78,0x8B77,0x0083,0x8B76,0x8B75,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x8B74,0x8B73,0x0083,0x8B72,0x8B71,0x0085,0x0083,0x8B70,0x8B6F,0x0083,0xE6C2, 0xC3C4,0x0089,0x0085,0x0083,0x8B6E,0x8B6D,0x0083,0x8B6C,0x8B6B,0x0085,0x0083,0x8B6A,0x8B69,0x0083,0x8B68,0xC3BD, 0x0091,0x0089,0x0085,0x0083,0x8B67,0x8B66,0x0083,0x8B65,0x8B64,0x0085,0x0083,0x8B63,0x8B62,0x0083,0x8B61,0x8B60, 0x0089,0x0085,0x0083,0x8B5F,0x8B5E,0x0083,0x8B5D,0x8B5C,0x0085,0x0083,0x8B5B,0x8B5A,0x0083,0x8B59,0x8B58,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x8B57,0x8B56,0x0083,0xD0F6,0x8B55,0x0085,0x0083,0x8B54,0x8B53,0x0083,0x8B52,0xE6C4, 0x0089,0x0085,0x0083,0x8B51,0x8B50,0x0083,0xE6C3,0xC9F4,0x0085,0x0083,0xE6BF,0xD3A4,0x0083,0x8B4F,0x8B4E,0x0091, 0x0089,0x0085,0x0083,0x8B4D,0x8B4C,0x0083,0x8B4B,0x8B4A,0x0085,0x0083,0x8B49,0x8B48,0x0083,0x8B47,0xC0B7,0x0089, 0x0085,0x0083,0x8B46,0x8B45,0x0083,0xE6BA,0x8B44,0x0085,0x0083,0x8B43,0x8B42,0x0083,0x8B41,0xE6BE,0x027F,0x017F, 0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x8B40,0x0083,0x8AFE,0x8AFD,0x0085,0x0083,0x8AFC,0x8AFB,0x0083,0x8AFA, 0x8AF9,0x0089,0x0085,0x0083,0xBBE9,0x8AF8,0x0083,0x8AF7,0x8AF6,0x0085,0x0083,0x8AF5,0xE6BC,0x0083,0x8AF4,0x8AF3, 0x0091,0x0089,0x0085,0x0083,0x8AF2,0x8AF1,0x0083,0x8AF0,0x8AEF,0x0085,0x0083,0x8AEE,0x8AED,0x0083,0x8AEC,0x8AEB, 0x0089,0x0085,0x0083,0xE6BB,0xCDF1,0x0083,0x8AEA,0x8AE9,0x0085,0x0083,0xC6C5,0x8AE8,0x0083,0x8AE7,0x8AE6,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x8AE5,0x8AE4,0x0083,0xE6B9,0x8AE3,0x0085,0x0083,0x8AE2,0x8AE1,0x0083,0xE6BD,0x8AE0, 0x0089,0x0085,0x0083,0x8ADF,0x8ADE,0x0083,0x8ADD,0x8ADC,0x0085,0x0083,0xC8A2,0x8ADB,0x0083,0xE6B5,0x8ADA,0x0091, 0x0089,0x0085,0x0083,0xE6B4,0xD3E9,0x0083,0x8AD9,0x8AD8,0x0085,0x0083,0x8AD7,0x8AD6,0x0083,0x8AD5,0x8AD4,0x0089, 0x0085,0x0083,0x8AD3,0xC3E4,0x0083,0x8AD2,0x8AD1,0x0085,0x0083,0x8AD0,0xB6F0,0x0083,0x8ACF,0xE6B7,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x8ACE,0x8ACD,0x0083,0xC9EF,0xBEEA,0x0085,0x0083,0x8ACC,0x8ACB,0x0083,0xC4C8,0x8ACA, 0x0089,0x0085,0x0083,0x8AC9,0x8AC8,0x0083,0xC4EF,0x8AC7,0x0085,0x0083,0x8AC6,0x8AC5,0x0083,0x8AC4,0xE6B8,0x0091, 0x0089,0x0085,0x0083,0x8AC3,0xE6B6,0x0083,0x8AC2,0x8AC1,0x0085,0x0083,0x8AC0,0x8ABF,0x0083,0xE6B2,0x8ABE,0x0089, 0x0085,0x0083,0x8ABD,0xE6B3,0x0083,0xE6AE,0xBDBF,0x0085,0x0083,0xE6AC,0xE6AB,0x0083,0xC2A6,0xCDDE,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x8ABC,0xCDFE,0x0083,0x8ABB,0xD7CB,0x0085,0x0083,0x8ABA,0x8AB9,0x0083,0x8AB8,0xD2F6,0x0089, 0x0085,0x0083,0x8AB7,0xE6B1,0x0083,0x8AB6,0x8AB5,0x0085,0x0083,0x8AB4,0x8AB3,0x0083,0x8AB2,0x8AB1,0x0091,0x0089, 0x0085,0x0083,0x8AB0,0x8AAF,0x0083,0x8AAE,0x8AAD,0x0085,0x0083,0x8AAC,0x8AAB,0x0083,0xBCA7,0x8AAA,0x0089,0x0085, 0x0083,0x8AA9,0x8AA8,0x0083,0xD2CC,0x8AA7,0x0085,0x0083,0x8AA6,0xC0D1,0x0083,0x8AA5,0xE6AF,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x8AA4,0x8AA3,0x0083,0x8AA2,0x8AA1,0x0085,0x0083,0x8AA0,0xE6AD,0x0083,0xBDAA,0x8A9F, 0x0089,0x0085,0x0083,0xD2A6,0x8A9E,0x0083,0xE6B0,0xE6A9,0x0085,0x0083,0x8A9D,0x8A9C,0x0083,0xCEAF,0xD0D5,0x0091, 0x0089,0x0085,0x0083,0xE6A6,0xB9C3,0x0083,0xBDE3,0x8A9B,0x0085,0x0083,0x8A9A,0x8A99,0x0083,0x8A98,0xCABC,0x0089, 0x0085,0x0083,0xE6A2,0x8A97,0x0083,0x8A96,0x8A95,0x0085,0x0083,0xC4B7,0x8A94,0x0083,0x8A93,0x8A92,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x8A91,0x8A90,0x0083,0x8A8F,0x8A8E,0x0085,0x0083,0xE6AA,0x8A8D,0x0083,0x8A8C,0xC6DE,0x0089, 0x0085,0x0083,0x8A8B,0xC3C3,0x0083,0x8A8A,0x8A89,0x0085,0x0083,0x8A88,0x8A87,0x0083,0x8A86,0x8A85,0x0091,0x0089, 0x0085,0x0083,0xE6A7,0x8A84,0x0083,0x8A83,0xE6A8,0x0085,0x0083,0xC4DD,0x8A82,0x0083,0x8A81,0xE6A3,0x0089,0x0085, 0x0083,0xE5FD,0xE5FC,0x0083,0xB7C1,0x8A80,0x0085,0x0083,0x8A7E,0xCDD7,0x0083,0xE6A5,0xE5FE,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x8A7D,0x8A7C,0x0083,0x8A7B,0x8A7A,0x0085,0x0083,0xE6A4,0x8A79,0x0083,0x8A78,0x8A77,0x0089, 0x0085,0x0083,0x8A76,0xC3EE,0x0083,0x8A75,0xE6A1,0x0085,0x0083,0xD1FD,0x8A74,0x0083,0x8A73,0xBCCB,0x0091,0x0089, 0x0085,0x0083,0xB6CA,0x8A72,0x0083,0x8A71,0x8A70,0x0085,0x0083,0x8A6F,0xE5FB,0x0083,0x8A6E,0x8A6D,0x0089,0x0085, 0x0083,0xC8D1,0x8A6C,0x0083,0xC2E8,0xB8BE,0x0085,0x0083,0xD7B1,0x8A6B,0x0083,0xCDFD,0xE5FA,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xC8E7,0xE5F9,0x0083,0x8A6A,0x8A69,0x0085,0x0083,0x8A68,0xBAC3,0x0083,0x8A67,0x8A66,0x0089,0x0085, 0x0083,0x8A65,0xCBFD,0x0083,0xBCE9,0x8A64,0x0085,0x0083,0xC4CC,0x8A63,0x0083,0xC5AB,0xC5AE,0x0091,0x0089,0x0085, 0x0083,0x8A62,0x8A61,0x0083,0x8A60,0x8A5F,0x0085,0x0083,0x8A5E,0x8A5D,0x0083,0x8A5C,0x8A5B,0x0089,0x0085,0x0083, 0x8A5A,0x8A59,0x0083,0x8A58,0x8A57,0x0085,0x0083,0x8A56,0xB0C2,0x0083,0x8A55,0x8A54,0x0181,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xC9DD,0x8A53,0x0083,0xB5EC,0x8A52,0x0085,0x0083,0x8A51,0x8A50,0x0083,0x8A4F,0x8A4E, 0x0089,0x0085,0x0083,0xDEC9,0x8A4D,0x0083,0xDECA,0xCCD7,0x0085,0x0083,0xBDB1,0xDEC8,0x0083,0xB1BC,0x8A4C,0x0091, 0x0089,0x0085,0x0083,0x8A4B,0xC6F5,0x0083,0x8A4A,0xD7E0,0x0085,0x0083,0xBFFC,0x8A49,0x0083,0x8A48,0xB7DC,0x0089, 0x0085,0x0083,0x8A47,0xB7EE,0x0083,0xC4CE,0xC6E6,0x0085,0x0083,0x8A46,0x8A45,0x0083,0xD1D9,0x8A44,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xDBBC,0xDEC6,0x0083,0x8A43,0x8A42,0x0085,0x0083,0x8A41,0x8A40,0x0083,0xDEC5,0x89FE,0x0089, 0x0085,0x0083,0xB6E1,0xBCD0,0x0083,0xBFE4,0xD2C4,0x0085,0x0083,0x89FD,0x89FC,0x0083,0xCDB7,0x89FB,0x0091,0x0089, 0x0085,0x0083,0x89FA,0xCAA7,0x0083,0x89F9,0xBABB,0x0085,0x0083,0xD1EB,0xD8B2,0x0083,0x89F8,0xB7F2,0x0089,0x0085, 0x0083,0xCCAB,0xCCEC,0x0083,0x89F7,0xB4F3,0x0085,0x0083,0x89F6,0xE2B7,0x0083,0xE2B9,0x89F5,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x89F4,0x89F3,0x0083,0x89F2,0xB9BB,0x0085,0x0083,0x89F1,0x89F0,0x0083,0xD2B9,0x89EF,0x0089, 0x0085,0x0083,0xB6E0,0xD9ED,0x0083,0x89EE,0x89ED,0x0085,0x0083,0xCDE2,0xCFA6,0x0083,0xD9E7,0x89EC,0x0091,0x0089, 0x0085,0x0083,0x89EB,0x89EA,0x0083,0x89E9,0xCFC4,0x0085,0x0083,0x89E8,0xB8B4,0x0083,0x89E7,0x89E6,0x0089,0x0085, 0x0083,0x89E5,0x89E4,0x0083,0x89E3,0xB1B8,0x0085,0x0083,0x89E2,0x89E1,0x0083,0xB4A6,0x89E0,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xE2BA,0x89DF,0x0083,0x89DE,0x89DD,0x0085,0x0083,0x89DC,0x89DB,0x0083,0x89DA,0x89D9,0x0089,0x0085, 0x0083,0x89D8,0xD2BC,0x0083,0x89D7,0x89D6,0x0085,0x0083,0xBAF8,0x89D5,0x0083,0x89D4,0xBFC7,0x0091,0x0089,0x0085, 0x0083,0x89D3,0x89D2,0x0083,0xC9F9,0x89D1,0x0085,0x0083,0xD7B3,0x89D0,0x0083,0xC8C9,0xCABF,0x0089,0x0085,0x0083, 0x89CF,0x89CE,0x0083,0x89CD,0x89CC,0x0085,0x0083,0x89CB,0x89CA,0x0083,0xC8C0,0x89C9,0x0101,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x89C8,0x89C7,0x0083,0x89C6,0x89C5,0x0085,0x0083,0x89C4,0x89C3,0x0083,0x89C2,0x89C1,0x0089, 0x0085,0x0083,0x89C0,0x89BF,0x0083,0x89BE,0x89BD,0x0085,0x0083,0x89BC,0xBABE,0x0083,0x89BB,0x89BA,0x0091,0x0089, 0x0085,0x0083,0x89B9,0xDBD6,0x0083,0x89B8,0x89B7,0x0085,0x0083,0x89B6,0x89B5,0x0083,0x89B4,0x89B3,0x0089,0x0085, 0x0083,0x89B2,0x89B1,0x0083,0x89B0,0x89AF,0x0085,0x0083,0x89AE,0xDBD5,0x0083,0x89AD,0x89AC,0x00A1,0x0091,0x0089, 0x0085,0x0083,0x89AB,0xB1DA,0x0083,0x89AA,0x89A9,0x0085,0x0083,0x89A8,0x89A7,0x0083,0xDBD4,0x89A6,0x0089,0x0085, 0x0083,0x89A5,0x89A4,0x0083,0x89A3,0x89A2,0x0085,0x0083,0x89A1,0x89A0,0x0083,0x899F,0x899E,0x0091,0x0089,0x0085, 0x0083,0x899D,0x899C,0x0083,0x899B,0x899A,0x0085,0x0083,0x8999,0x8998,0x0083,0x8997,0x8996,0x0089,0x0085,0x0083, 0x8995,0xB6D5,0x0083,0xC4AB,0x8994,0x0085,0x0083,0x8993,0x8992,0x0083,0x8991,0x8990,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0x898F,0x898E,0x0083,0x898D,0xD0E6,0x0085,0x0083,0xD4F6,0x898C,0x0083,0x898B,0x898A,0x0089,0x0085, 0x0083,0xDCAE,0xC7BD,0x0083,0x8989,0x8988,0x0085,0x0083,0x8987,0x8986,0x0083,0x8985,0xC4B9,0x0091,0x0089,0x0085, 0x0083,0xC9CA,0x8984,0x0083,0x8983,0x8982,0x0085,0x0083,0x8981,0x8980,0x0083,0x897E,0x897D,0x0089,0x0085,0x0083, 0x897C,0xDCAD,0x0083,0x897B,0x897A,0x0085,0x0083,0x8979,0xCAFB,0x0083,0x8978,0xBEB3,0x00A1,0x0091,0x0089,0x0085, 0x0083,0x8977,0xDCAC,0x0083,0xDCAF,0x8976,0x0085,0x0083,0xDBD3,0x8975,0x0083,0x8974,0x8973,0x0089,0x0085,0x0083, 0x8972,0x8971,0x0083,0x8970,0x896F,0x0085,0x0083,0x896E,0x896D,0x0083,0x896C,0x896B,0x0091,0x0089,0x0085,0x0083, 0x896A,0x8969,0x0083,0x8968,0x8967,0x0085,0x0083,0x8966,0x8965,0x0083,0xDCAB,0xCCEE,0x0089,0x0085,0x0083,0x8964, 0x8963,0x0083,0x8962,0x8961,0x0085,0x0083,0x8960,0xDCAA,0x0083,0x895F,0x895E,0x087B,0x047D,0x027F,0x017F,0x00FF, 0x00BF,0x009F,0x008F,0x0087,0x0083,0x895D,0x0083,0x895C,0x895B,0x0085,0x0083,0x895A,0xC8FB,0x0083,0x8959,0x8958, 0x0089,0x0085,0x0083,0x8957,0x8956,0x0083,0x8955,0xCCC1,0x0085,0x0083,0x8954,0x8953,0x0083,0x8952,0xCBFE,0x0091, 0x0089,0x0085,0x0083,0x8951,0x8950,0x0083,0xCBDC,0x894F,0x0085,0x0083,0x894E,0x894D,0x0083,0xEBF3,0xCBFA,0x0089, 0x0085,0x0083,0x894C,0x894B,0x0083,0x894A,0x8949,0x0085,0x0083,0x8948,0x8947,0x0083,0x8946,0xDCA8,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x8945,0x8944,0x0083,0x8943,0x8942,0x0085,0x0083,0x8941,0x8940,0x0083,0x88FE,0x88FD,0x0089, 0x0085,0x0083,0x88FC,0x88FB,0x0083,0x88FA,0x88F9,0x0085,0x0083,0x88F8,0x88F7,0x0083,0xB6C2,0x88F6,0x0091,0x0089, 0x0085,0x0083,0x88F5,0x88F4,0x0083,0x88F3,0xD1DF,0x0085,0x0083,0x88F2,0x88F1,0x0083,0x88F0,0x88EF,0x0089,0x0085, 0x0083,0x88EE,0xBFB0,0x0083,0x88ED,0x88EC,0x0085,0x0083,0x88EB,0x88EA,0x0083,0x88E9,0xB5CC,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x88E8,0x88E7,0x0083,0xB1A4,0xDCA9,0x0085,0x0083,0x88E6,0xDCA6,0x0083,0x88E5,0x88E4,0x0089, 0x0085,0x0083,0x88E3,0x88E2,0x0083,0xDCA7,0x88E1,0x0085,0x0083,0x88E0,0x88DF,0x0083,0xB6E9,0x88DE,0x0091,0x0089, 0x0085,0x0083,0x88DD,0x88DC,0x0083,0xC7B5,0x88DB,0x0085,0x0083,0x88DA,0x88D9,0x0083,0xDCA2,0x88D8,0x0089,0x0085, 0x0083,0xDCA1,0x88D7,0x0083,0x88D6,0x88D5,0x0085,0x0083,0xDDC0,0xB6D1,0x0083,0x88D4,0x88D3,0x00A1,0x0091,0x0089, 0x0085,0x0083,0x88D2,0xCCC3,0x0083,0x88D1,0xDCA5,0x0085,0x0083,0x88D0,0x88CF,0x0083,0xDCA3,0x88CE,0x0089,0x0085, 0x0083,0x88CD,0xBBF9,0x0083,0xC5E0,0xDBFC,0x0085,0x0083,0x88CC,0x88CB,0x0083,0x88CA,0xDBFA,0x0091,0x0089,0x0085, 0x0083,0x88C9,0x88C8,0x0083,0x88C7,0x88C6,0x0085,0x0083,0xDBFB,0x88C5,0x0083,0xDCA4,0x88C4,0x0089,0x0085,0x0083, 0x88C3,0x88C2,0x0083,0x88C1,0x88C0,0x0085,0x0083,0x88BF,0x88BE,0x0083,0x88BD,0xDBFD,0x0101,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x88BC,0x88BB,0x0083,0x88BA,0xB2BA,0x0085,0x0083,0xD3F2,0x88B9,0x0083,0xDBFE,0x88B8,0x0089, 0x0085,0x0083,0x88B7,0xDBF6,0x0083,0xDBF7,0xDBF5,0x0085,0x0083,0x88B6,0x88B5,0x0083,0xDBF4,0xC6D2,0x0091,0x0089, 0x0085,0x0083,0x88B4,0xDBF8,0x0083,0x88B3,0x88B2,0x0085,0x0083,0xDBEF,0xB3C7,0x0083,0x88B1,0x88B0,0x0089,0x0085, 0x0083,0xC2F1,0x88AF,0x0083,0x88AE,0x88AD,0x0085,0x0083,0x88AC,0x88AB,0x0083,0x88AA,0x88A9,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xB0A3,0xB9A1,0x0083,0x88A8,0x88A7,0x0085,0x0083,0x88A6,0x88A5,0x0083,0x88A4,0x88A3,0x0089,0x0085, 0x0083,0x88A2,0x88A1,0x0083,0x88A0,0xDBF9,0x0085,0x0083,0x889F,0x889E,0x0083,0x889D,0xDBF1,0x0091,0x0089,0x0085, 0x0083,0x889C,0xDBEE,0x0083,0x889B,0x889A,0x0085,0x0083,0x8899,0xBFE5,0x0083,0xDBEB,0x8898,0x0089,0x0085,0x0083, 0xB5E6,0x8897,0x0083,0xDBD1,0x8896,0x0085,0x0083,0xDBF0,0xBFD1,0x0083,0x8895,0xDBEC,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xD4AB,0xB9B8,0x0083,0xDBD2,0xDBF3,0x0085,0x0083,0x8894,0x8893,0x0083,0x8892,0x8891,0x0089,0x0085, 0x0083,0xB6E2,0x8890,0x0083,0x888F,0x888E,0x0085,0x0083,0x888D,0x888C,0x0083,0x888B,0x888A,0x0091,0x0089,0x0085, 0x0083,0xDBF2,0xC0DD,0x0083,0x8889,0x8888,0x0085,0x0083,0x8887,0x8886,0x0083,0x8885,0xDBED,0x0089,0x0085,0x0083, 0xD0CD,0x8884,0x0083,0x8883,0x8882,0x0085,0x0083,0x8881,0xDBE4,0x0083,0xDBE2,0xC2A2,0x00A1,0x0091,0x0089,0x0085, 0x0083,0xC0AC,0xB4B9,0x0083,0x8880,0x887E,0x0085,0x0083,0x887D,0x887C,0x0083,0x887B,0xDBE5,0x0089,0x0085,0x0083, 0xDBE6,0x887A,0x0083,0x8879,0x8878,0x0085,0x0083,0xBFC0,0xDBE9,0x0083,0x8877,0x8876,0x0091,0x0089,0x0085,0x0083, 0xDBEA,0x8875,0x0083,0x8874,0x8873,0x0085,0x0083,0xC5F7,0x8872,0x0083,0xDBE8,0x8871,0x0089,0x0085,0x0083,0xDBE3, 0xC6BA,0x0083,0xDBE1,0xDBE7,0x0085,0x0083,0x8870,0xCCB9,0x0083,0x886F,0xC0A4,0x017F,0x00FF,0x00BF,0x009F,0x008F, 0x0087,0x0083,0x886E,0x0083,0x886D,0xC6C2,0x0085,0x0083,0xD7B9,0xB7D8,0x0083,0xCEEB,0xB0D3,0x0089,0x0085,0x0083, 0xDBDE,0xCCB3,0x0083,0xBCE1,0x886C,0x0085,0x0083,0x886B,0xBFE9,0x0083,0x886A,0x8869,0x0091,0x0089,0x0085,0x0083, 0x8868,0x8867,0x0083,0x8866,0xBFD3,0x0085,0x0083,0xD7F8,0xBBB5,0x0083,0xBFB2,0xCCAE,0x0089,0x0085,0x0083,0xDBD0, 0x8865,0x0083,0xB7BB,0x8864,0x0085,0x0083,0x8863,0xBEF9,0x0083,0x8862,0x8861,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x8860,0x885F,0x0083,0xDBE0,0x885E,0x0085,0x0083,0xD6B7,0x885D,0x0083,0xBBF8,0x885C,0x0089,0x0085,0x0083,0x885B, 0xDBDF,0x0083,0xB3A1,0xDBDB,0x0085,0x0083,0x885A,0x8859,0x0083,0x8858,0x8857,0x0091,0x0089,0x0085,0x0083,0x8856, 0xDBDA,0x0083,0x8855,0x8854,0x0085,0x0083,0xB5D8,0xDBDD,0x0083,0xDBDC,0xB9E7,0x0089,0x0085,0x0083,0xDBD8,0x8853, 0x0083,0xDBD9,0xDBD7,0x0085,0x0083,0xD4DA,0x8852,0x0083,0x8851,0x8850,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0x884F,0xCAA5,0x0083,0x884E,0x884D,0x0085,0x0083,0x884C,0xCDC1,0x0083,0x884B,0x884A,0x0089,0x0085,0x0083,0xE0F7, 0x8849,0x0083,0x8848,0x8847,0x0085,0x0083,0x8846,0x8845,0x0083,0x8844,0x8843,0x0091,0x0089,0x0085,0x0083,0x8842, 0x8841,0x0083,0x8840,0x87FE,0x0085,0x0083,0x87FD,0x87FC,0x0083,0x87FB,0x87FA,0x0089,0x0085,0x0083,0x87F9,0x87F8, 0x0083,0xE0F5,0xE0F6,0x0085,0x0083,0xC8A6,0x87F7,0x0083,0xD4B2,0x87F6,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE0F4, 0xC6D4,0x0083,0x87F5,0x87F4,0x0085,0x0083,0x87F3,0xE0F3,0x0083,0xCDBC,0xB9FA,0x0089,0x0085,0x0083,0x87F2,0x87F1, 0x0083,0xB9CC,0xE0F2,0x0085,0x0083,0x87F0,0x87EF,0x0083,0x87EE,0xE0F0,0x0091,0x0089,0x0085,0x0083,0xCEA7,0x87ED, 0x0083,0x87EC,0xB4D1,0x0085,0x0083,0xC0A7,0x87EB,0x0083,0x87EA,0xD4B0,0x0089,0x0085,0x0083,0x87E9,0xE0F1,0x0083, 0x87E8,0x87E7,0x0085,0x0083,0x87E6,0x87E5,0x0083,0x87E4,0x87E3,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xB6DA,0x87E2,0x0083,0xCDC5,0xE0EF,0x0085,0x0083,0xD2F2,0xD8B6,0x0083,0xBBD8,0xE0EE,0x0089,0x0085,0x0083,0x87E1, 0xCBC4,0x0083,0xC7F4,0x87E0,0x0085,0x0083,0x87DF,0xE0ED,0x0083,0x87DE,0x87DD,0x0091,0x0089,0x0085,0x0083,0xE0EC, 0x87DC,0x0083,0x87DB,0x87DA,0x0085,0x0083,0x87D9,0x87D8,0x0083,0x87D7,0x87D6,0x0089,0x0085,0x0083,0x87D5,0x87D4, 0x0083,0xC4D2,0x87D3,0x0085,0x0083,0x87D2,0x87D1,0x0083,0x87D0,0x87CF,0x00A1,0x0091,0x0089,0x0085,0x0083,0x87CE, 0x87CD,0x0083,0x87CC,0x87CB,0x0085,0x0083,0x87CA,0x87C9,0x0083,0x87C8,0x87C7,0x0089,0x0085,0x0083,0xBDC0,0x87C6, 0x0083,0x87C5,0x87C4,0x0085,0x0083,0x87C3,0xC8C2,0x0083,0x87C2,0x87C1,0x0091,0x0089,0x0085,0x0083,0x87C0,0x87BF, 0x0083,0x87BE,0x87BD,0x0085,0x0083,0x87BC,0xE0EB,0x0083,0x87BB,0x87BA,0x0089,0x0085,0x0083,0x87B9,0x87B8,0x0083, 0x87B7,0x87B6,0x0085,0x0083,0x87B5,0x87B4,0x0083,0x87B3,0x87B2,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x87B1, 0xCFF9,0x0083,0x87B0,0x87AF,0x0085,0x0083,0x87AE,0x87AD,0x0083,0x87AC,0x87AB,0x0089,0x0085,0x0083,0x87AA,0x87A9, 0x0083,0x87A8,0x87A7,0x0085,0x0083,0x87A6,0x87A5,0x0083,0x87A4,0x87A3,0x0091,0x0089,0x0085,0x0083,0x87A2,0xE0EA, 0x0083,0x87A1,0x87A0,0x0085,0x0083,0x879F,0xCCE7,0x0083,0xBABF,0x879E,0x0089,0x0085,0x0083,0x879D,0x879C,0x0083, 0x879B,0x879A,0x0085,0x0083,0x8799,0x8798,0x0083,0xE0E3,0xE0E9,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8797,0x8796, 0x0083,0x8795,0x8794,0x0085,0x0083,0x8793,0x8792,0x0083,0x8791,0x8790,0x0089,0x0085,0x0083,0xE0E8,0xE0E7,0x0083, 0x878F,0x878E,0x0085,0x0083,0x878D,0x878C,0x0083,0xB8C1,0x878B,0x0091,0x0089,0x0085,0x0083,0x878A,0x8789,0x0083, 0x8788,0xE0E5,0x0085,0x0083,0x8787,0x8786,0x0083,0x8785,0x8784,0x0089,0x0085,0x0083,0xCAC9,0xE0E6,0x0083,0xD4EB, 0xD8AC,0x0085,0x0083,0xC6F7,0x8783,0x0083,0x8782,0x8781,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083, 0xE0E4,0x0083,0x8780,0xE0DE,0x0085,0x0083,0x877E,0x877D,0x0083,0x877C,0x877B,0x0089,0x0085,0x0083,0x877A,0xE0E0, 0x0083,0x8779,0x8778,0x0085,0x0083,0xE0DF,0xE0D9,0x0083,0xE0DB,0x8777,0x0091,0x0089,0x0085,0x0083,0x8776,0xE0E2, 0x0083,0x8775,0x8774,0x0085,0x0083,0x8773,0x8772,0x0083,0x8771,0xD2AD,0x0089,0x0085,0x0083,0xE0DD,0xE0E1,0x0083, 0x8770,0x876F,0x0085,0x0083,0x876E,0x876D,0x0083,0x876C,0x876B,0x00A1,0x0091,0x0089,0x0085,0x0083,0x876A,0x8769, 0x0083,0x8768,0x8767,0x0085,0x0083,0x8766,0x8765,0x0083,0xBAD9,0x8764,0x0089,0x0085,0x0083,0x8763,0x8762,0x0083, 0xCEFB,0x8761,0x0085,0x0083,0xE0DA,0x8760,0x0083,0x875F,0xCBBB,0x0091,0x0089,0x0085,0x0083,0x875E,0xD7EC,0x0083, 0x875D,0xB3B0,0x0085,0x0083,0xD6F6,0x875C,0x0083,0x875B,0x875A,0x0089,0x0085,0x0083,0xE0D8,0xE0DC,0x0083,0x8759, 0x8758,0x0085,0x0083,0x8757,0x8756,0x0083,0xE0D7,0x8755,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8754,0xE0D3, 0x0083,0xE0D4,0x8753,0x0085,0x0083,0x8752,0x8751,0x0083,0xE0BD,0xE0CF,0x0089,0x0085,0x0083,0x8750,0x874F,0x0083, 0xC2EF,0x874E,0x0085,0x0083,0x874D,0xD0EA,0x0083,0x874C,0x874B,0x0091,0x0089,0x0085,0x0083,0x874A,0x8749,0x0083, 0x8748,0x8747,0x0085,0x0083,0x8746,0x8745,0x0083,0xD8C5,0xB8C2,0x0089,0x0085,0x0083,0x8744,0xE0D1,0x0083,0x8743, 0x8742,0x0085,0x0083,0xBCCE,0xE0D0,0x0083,0x8741,0x8740,0x00A1,0x0091,0x0089,0x0085,0x0083,0x86FE,0x86FD,0x0083, 0x86FC,0x86FB,0x0085,0x0083,0xE0D2,0xE0D6,0x0083,0x86FA,0xE0D5,0x0089,0x0085,0x0083,0xCBD4,0x86F9,0x0083,0x86F8, 0x86F7,0x0085,0x0083,0x86F6,0x86F5,0x0083,0xE0BB,0x86F4,0x0091,0x0089,0x0085,0x0083,0xE0CC,0x86F3,0x0083,0xE0C8, 0xE0C7,0x0085,0x0083,0x86F2,0x86F1,0x0083,0xE0C5,0x86F0,0x0089,0x0085,0x0083,0x86EF,0xE0C0,0x0083,0xE0BF,0xE0BA, 0x0085,0x0083,0x86EE,0xE0CB,0x0083,0x86ED,0xE0C2,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xE0C6,0xE0CD, 0x0083,0xCBC3,0x86EC,0x0085,0x0083,0xCECB,0x86EB,0x0083,0xE0B5,0x86EA,0x0089,0x0085,0x0083,0xE0C3,0xCAC8,0x0083, 0x86E9,0x86E8,0x0085,0x0083,0x86E7,0x86E6,0x0083,0x86E5,0xE0B2,0x0091,0x0089,0x0085,0x0083,0x86E4,0xE0C1,0x0083, 0xC9A4,0xE0AA,0x0085,0x0083,0xE0BE,0x86E3,0x0083,0x86E2,0x86E1,0x0089,0x0085,0x0083,0xE0CA,0xE0C9,0x0083,0x86E0, 0x86DF,0x0085,0x0083,0xE0BC,0x86DE,0x0083,0x86DD,0x86DC,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD0E1,0xE0C4,0x0083, 0x86DB,0x86DA,0x0085,0x0083,0x86D9,0x86D8,0x0083,0x86D7,0xE0B7,0x0089,0x0085,0x0083,0xE0B6,0x86D6,0x0083,0xD3F7, 0x86D5,0x0085,0x0083,0xE0AD,0x86D4,0x0083,0xC5E7,0x86D3,0x0091,0x0089,0x0085,0x0083,0xDFF7,0x86D2,0x0083,0xD4FB, 0x86D1,0x0085,0x0083,0xE0AC,0x86D0,0x0083,0x86CF,0x86CE,0x0089,0x0085,0x0083,0x86CD,0x86CC,0x0083,0x86CB,0x86CA, 0x0085,0x0083,0x86C9,0x86C8,0x0083,0xD0FA,0x86C7,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x86C6,0x86C5,0x0083, 0x86C4,0x86C3,0x0085,0x0083,0x86C2,0x86C1,0x0083,0xE0B0,0x86C0,0x0089,0x0085,0x0083,0xBAC8,0xCFB2,0x0083,0x86BF, 0x86BE,0x0085,0x0083,0xE0B9,0xB4AD,0x0083,0x86BD,0x86BC,0x0091,0x0089,0x0085,0x0083,0x86BB,0xE0B8,0x0083,0x86BA, 0x86B9,0x0085,0x0083,0xE0B3,0x86B8,0x0083,0xDFF6,0x86B7,0x0089,0x0085,0x0083,0x86B6,0x86B5,0x0083,0xE0A9,0xBAB0, 0x0085,0x0083,0xBAED,0xE0AE,0x0083,0xC0AE,0x86B4,0x00A1,0x0091,0x0089,0x0085,0x0083,0x86B3,0xC9C6,0x0083,0xE0AB, 0xCEB9,0x0085,0x0083,0xE0AF,0xBFA6,0x0083,0x86B2,0xE0B1,0x0089,0x0085,0x0083,0x86B1,0xCCE4,0x0083,0xE0B4,0x86B0, 0x0085,0x0083,0x86AF,0xD0A5,0x0083,0xE0A5,0xE0A4,0x0091,0x0089,0x0085,0x0083,0xE0A3,0x86AE,0x0083,0x86AD,0x86AC, 0x0085,0x0083,0x86AB,0x86AA,0x0083,0x86A9,0xC4F6,0x0089,0x0085,0x0083,0xDFF9,0xD8C4,0x0083,0x86A8,0xC5BE,0x0085, 0x0083,0x86A7,0x86A6,0x0083,0xDFF5,0xC0B2,0x0181,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC9B6,0xC6A1, 0x0083,0x86A5,0x86A4,0x0085,0x0083,0xB7C8,0x86A3,0x0083,0x86A2,0x86A1,0x0089,0x0085,0x0083,0x86A0,0xE0A8,0x0083, 0x869F,0x869E,0x0085,0x0083,0x869D,0x869C,0x0083,0x869B,0xE0A2,0x0091,0x0089,0x0085,0x0083,0xDFFB,0x869A,0x0083, 0x8699,0x8698,0x0085,0x0083,0x8697,0xDFFD,0x0083,0x8696,0x8695,0x0089,0x0085,0x0083,0x8694,0x8693,0x0083,0x8692, 0xB0A1,0x0085,0x0083,0xDFF8,0x8691,0x0083,0x8690,0xC9CC,0x00A1,0x0091,0x0089,0x0085,0x0083,0x868F,0xD7C4,0x0083, 0xBFD0,0x868E,0x0085,0x0083,0xDFFA,0x868D,0x0083,0xDFFC,0xCDD9,0x0089,0x0085,0x0083,0x868C,0xDFFE,0x0083,0x868B, 0x868A,0x0085,0x0083,0x8689,0x8688,0x0083,0xE0A1,0x8687,0x0091,0x0089,0x0085,0x0083,0x8686,0x8685,0x0083,0xE0A6, 0x8684,0x0085,0x0083,0xB3AA,0xE0A7,0x0083,0xCEA8,0xCADB,0x0089,0x0085,0x0083,0x8683,0xBBA3,0x0083,0x8682,0xDFF4, 0x0085,0x0083,0x8681,0x8680,0x0083,0xDFF3,0x867E,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x867D,0xBBBD,0x0083, 0xDFF0,0xDFEF,0x0085,0x0083,0x867C,0xDFEB,0x0083,0x867B,0x867A,0x0089,0x0085,0x0083,0x8679,0x8678,0x0083,0xDFE9, 0x8677,0x0085,0x0083,0x8676,0x8675,0x0083,0x8674,0x8673,0x0091,0x0089,0x0085,0x0083,0x8672,0xDFED,0x0083,0x8671, 0x8670,0x0085,0x0083,0xDFF2,0xCCC6,0x0083,0xDFF1,0x866F,0x0089,0x0085,0x0083,0x866E,0x866D,0x0083,0x866C,0x866B, 0x0085,0x0083,0xB0A6,0x866A,0x0083,0xB4BD,0xCBF4,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8669,0x8668,0x0083,0x8667, 0x8666,0x0085,0x0083,0xD1E4,0x8665,0x0083,0xDBC1,0x8664,0x0089,0x0085,0x0083,0xDFEC,0xBADF,0x0083,0x8663,0xB2B8, 0x0085,0x0083,0x8662,0x8661,0x0083,0x8660,0x865F,0x0091,0x0089,0x0085,0x0083,0x865E,0x865D,0x0083,0xDFEE,0xD5DC, 0x0085,0x0083,0x865C,0x865B,0x0083,0x865A,0xCFF8,0x0089,0x0085,0x0083,0xBFDE,0x8659,0x0083,0x8658,0xC4C4,0x0085, 0x0083,0xC1A8,0xC9DA,0x0083,0xDFEA,0xC5B6,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB8E7,0x8657,0x0083, 0x8656,0x8655,0x0085,0x0083,0x8654,0x8653,0x0083,0xD3B4,0xDFE8,0x0089,0x0085,0x0083,0xDFE6,0xDFE2,0x0083,0x8652, 0xDFE1,0x0085,0x0083,0xDFE0,0x8651,0x0083,0xBBA9,0x8650,0x0091,0x0089,0x0085,0x0083,0xDFDC,0xDFD9,0x0083,0xDFD8, 0xDFD5,0x0085,0x0083,0xD1C6,0xDFD1,0x0083,0xDFE7,0xB0A5,0x0089,0x0085,0x0083,0xCFEC,0xDFDF,0x0083,0x864F,0x864E, 0x0085,0x0083,0xD4D5,0xB9FE,0x0083,0xCDDB,0xB6DF,0x00A1,0x0091,0x0089,0x0085,0x0083,0x864D,0xBAE5,0x0083,0x864C, 0xDFD3,0x0085,0x0083,0xC6B7,0xB0A7,0x0083,0xDFDE,0x864B,0x0089,0x0085,0x0083,0xD1CA,0x864A,0x0083,0xDFDD,0x8649, 0x0085,0x0083,0x8648,0xCFCC,0x0083,0x8647,0x8646,0x0091,0x0089,0x0085,0x0083,0x8645,0xDFD4,0x0083,0xBFC8,0x8644, 0x0085,0x0083,0xD4DB,0x8643,0x0083,0xBFA9,0x8642,0x0089,0x0085,0x0083,0xDFD2,0xD2A7,0x0083,0xE5EB,0xDFE4,0x0085, 0x0083,0xDFE3,0xD7C9,0x0083,0xDFD6,0xDFD7,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8641,0xDFE5,0x0083,0xDFDB, 0x8640,0x0085,0x0083,0x85FE,0x85FD,0x0083,0x85FC,0x85FB,0x0089,0x0085,0x0083,0xDFD0,0x85FA,0x0083,0xDFCC,0xDFCB, 0x0085,0x0083,0xC1FC,0x85F9,0x0083,0x85F8,0xBFA7,0x0091,0x0089,0x0085,0x0083,0xB9BE,0xDFC7,0x0083,0x85F7,0xD6E4, 0x0085,0x0083,0x85F6,0xB8C0,0x0083,0xD3BD,0xBECC,0x0089,0x0085,0x0083,0x85F5,0xBACD,0x0083,0xD5A6,0x85F4,0x0085, 0x0083,0x85F3,0x85F2,0x0083,0x85F1,0xC5D8,0x00A1,0x0091,0x0089,0x0085,0x0083,0x85F0,0xDFCD,0x0083,0x85EF,0xDFC6, 0x0085,0x0083,0x85EE,0xBED7,0x0083,0x85ED,0x85EC,0x0089,0x0085,0x0083,0xC3FC,0xBAF4,0x0083,0xC9EB,0x85EB,0x0085, 0x0083,0x85EA,0xC5DE,0x0083,0xDFC8,0xDFCE,0x0091,0x0089,0x0085,0x0083,0xBAC7,0x85E9,0x0083,0xCEB6,0xDFDA,0x0085, 0x0083,0xDFC9,0x85E8,0x0083,0x85E7,0x85E6,0x0089,0x0085,0x0083,0x85E5,0x85E4,0x0083,0x85E3,0x85E2,0x0085,0x0083, 0x85E1,0xD6DC,0x0083,0x85E0,0xDFCF,0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x85DF,0x0083, 0xDFCA,0x85DE,0x0085,0x0083,0xC4D8,0x85DD,0x0083,0x85DC,0x85DB,0x0089,0x0085,0x0083,0x85DA,0x85D9,0x0083,0xCED8, 0xC7BA,0x0085,0x0083,0x85D8,0xDFC3,0x0083,0xD4B1,0xDFC2,0x0091,0x0089,0x0085,0x0083,0xDFBF,0xC5BB,0x0083,0xDFBE, 0xDFBD,0x0085,0x0083,0xDFBC,0x85D7,0x0083,0xC4C5,0x85D6,0x0089,0x0085,0x0083,0x85D5,0x85D4,0x0083,0x85D3,0xDFBB, 0x0085,0x0083,0xB8E6,0x85D2,0x0083,0xB3CA,0x85D1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB4F4,0x85D0,0x0083,0x85CF, 0xDFC0,0x0085,0x0083,0x85CE,0x85CD,0x0083,0xD1BD,0x85CC,0x0089,0x0085,0x0083,0xCEE1,0x85CB,0x0083,0xBAF0,0xCEC7, 0x0085,0x0083,0x85CA,0xB4B5,0x0083,0xCEFC,0x85C9,0x0091,0x0089,0x0085,0x0083,0x85C8,0xB3B3,0x0083,0xCEE2,0x85C7, 0x0085,0x0083,0xDFC5,0xD6A8,0x0083,0x85C6,0xC6F4,0x0089,0x0085,0x0083,0xCBB1,0xBFD4,0x0083,0xCCFD,0xBAAC,0x0085, 0x0083,0x85C5,0xB7D4,0x0083,0xB6D6,0xB0C9,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xB7F1,0x85C4,0x0083,0x85C3, 0xDFC4,0x0085,0x0083,0x85C2,0xDFC1,0x0083,0xB7CD,0xD2F7,0x0089,0x0085,0x0083,0xCDCC,0xC1DF,0x0083,0x85C1,0xBEFD, 0x0085,0x0083,0x85C0,0x85BF,0x0083,0x85BE,0xC2F0,0x0091,0x0089,0x0085,0x0083,0xDFB9,0xC2C0,0x0083,0x85BD,0xCFC5, 0x0085,0x0083,0xDFB8,0xCFF2,0x0083,0xCDC2,0xC0F4,0x0089,0x0085,0x0083,0xBAF3,0xC3FB,0x0083,0xCDAC,0x85BC,0x0085, 0x0083,0xB5F5,0xBCAA,0x0083,0xBACF,0x85BB,0x00A1,0x0091,0x0089,0x0085,0x0083,0xDFBA,0x85BA,0x0083,0xB8F7,0xB3D4, 0x0085,0x0083,0x85B9,0xD3F5,0x0083,0x85B8,0x85B7,0x0089,0x0085,0x0083,0x85B6,0xDFB4,0x0083,0xB5F0,0xDFB7,0x0085, 0x0083,0x85B5,0xCCBE,0x0083,0xCBBE,0xBAC5,0x0091,0x0089,0x0085,0x0083,0xD2B6,0xD8CF,0x0083,0x85B4,0xD3D2,0x0085, 0x0083,0xCAB7,0xDFB3,0x0083,0xCCA8,0xBFC9,0x0089,0x0085,0x0083,0xB6A3,0xB0C8,0x0083,0xD5D9,0xBDD0,0x0085,0x0083, 0xD6BB,0xDFB5,0x0083,0xDFB6,0x85B3,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC1ED,0xBEE4,0x0083,0xB9C5, 0xBFDA,0x0085,0x0083,0x85B2,0x85B1,0x0083,0xB5FE,0xDBC5,0x0089,0x0085,0x0083,0x85B0,0x85AF,0x0083,0x85AE,0xC5D1, 0x0085,0x0083,0x85AD,0xD0F0,0x0083,0xB1E4,0xCADC,0x0091,0x0089,0x0085,0x0083,0xC8A1,0x85AC,0x0083,0xCAE5,0x85AB, 0x0085,0x0083,0x85AA,0xB7A2,0x0083,0x85A9,0x85A8,0x0089,0x0085,0x0083,0x85A7,0xB7B4,0x0083,0xCBAB,0xD3D1,0x0085, 0x0083,0xBCB0,0xB2E6,0x0083,0xD3D6,0x85A6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x85A5,0x85A4,0x0083,0x85A3,0x85A2, 0x0085,0x0083,0xB2CE,0xC8FE,0x0083,0x85A1,0xCFD8,0x0089,0x0085,0x0083,0x85A0,0x859F,0x0083,0x859E,0xC8A5,0x0085, 0x0083,0x859D,0x859C,0x0083,0x859B,0x859A,0x0091,0x0089,0x0085,0x0083,0xDBCC,0x8599,0x0083,0x8598,0x8597,0x0085, 0x0083,0x8596,0x8595,0x0083,0x8594,0x8593,0x0089,0x0085,0x0083,0xD8CB,0x8592,0x0083,0x8591,0x8590,0x0085,0x0083, 0x858F,0xBEC7,0x0083,0xB3F8,0x858E,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCFC3,0xD8CA,0x0083,0x858D,0xD8C9, 0x0085,0x0083,0xCFE1,0x858C,0x0083,0x858B,0xD4AD,0x0089,0x0085,0x0083,0x858A,0xD8C8,0x0083,0x8589,0x8588,0x0085, 0x0083,0xBAF1,0x8587,0x0083,0xC0E5,0x8586,0x0091,0x0089,0x0085,0x0083,0x8585,0xB2DE,0x0083,0x8584,0x8583,0x0085, 0x0083,0x8582,0x8581,0x0083,0x8580,0x857E,0x0089,0x0085,0x0083,0x857D,0xD8C7,0x0083,0xD1E1,0xD1B9,0x0085,0x0083, 0x857C,0xC0F7,0x0083,0x857B,0x857A,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC0FA,0xCCFC,0x0083,0xB6F2,0x8579,0x0085, 0x0083,0xB3A7,0x8578,0x0083,0x8577,0xC7E4,0x0089,0x0085,0x0083,0x8576,0x8575,0x0083,0x8574,0x8573,0x0085,0x0083, 0xDAE1,0x8572,0x0083,0xD0B6,0xBEED,0x0091,0x0089,0x0085,0x0083,0x8571,0xC2D1,0x0083,0xC8B4,0xBCB4,0x0085,0x0083, 0x8570,0xCEA3,0x0083,0xD3A1,0xC3AE,0x0089,0x0085,0x0083,0xD8B4,0x856F,0x0083,0x856E,0xCEC0,0x0085,0x0083,0x856D, 0xDAE0,0x0083,0x856C,0xCED4,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xD8D4,0x0083,0x856B,0xC2B1,0x0085, 0x0083,0xD8D5,0xC2AC,0x0083,0xBFA8,0xD5BC,0x0089,0x0085,0x0083,0xDFB2,0xB1E5,0x0083,0x856A,0xB2B7,0x0085,0x0083, 0x8569,0xB2A9,0x0083,0x8568,0x8567,0x0091,0x0089,0x0085,0x0083,0xC4CF,0xC2F4,0x0083,0xB5A5,0x8566,0x0085,0x0083, 0xD7BF,0xD7E4,0x0083,0xB1B0,0x8565,0x0089,0x0085,0x0083,0xD0AD,0xBBAA,0x0083,0x8564,0x8563,0x0085,0x0083,0x8562, 0xB0EB,0x0083,0xBBDC,0xCEE7,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC9FD,0x8561,0x0083,0xD8A6,0x8560,0x0085,0x0083, 0xC7A7,0x855F,0x0083,0xCAAE,0x855E,0x0089,0x0085,0x0083,0xC4E4,0xD8D2,0x0083,0x855D,0x855C,0x0085,0x0083,0xD2BD, 0xC7F8,0x0083,0xC6A5,0x855B,0x0091,0x0089,0x0085,0x0083,0x855A,0x8559,0x0083,0x8558,0x8557,0x0085,0x0083,0x8556, 0x8555,0x0083,0x8554,0x8553,0x0089,0x0085,0x0083,0x8552,0xD8D1,0x0083,0x8551,0x8550,0x0085,0x0083,0x854F,0xB7CB, 0x0083,0x854E,0x854D,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x854C,0xD8D0,0x0083,0x854B,0x854A,0x0085,0x0083, 0xCFBB,0x8549,0x0083,0xBFEF,0xBDB3,0x0089,0x0085,0x0083,0x8548,0x8547,0x0083,0xD4D1,0x8546,0x0085,0x0083,0x8545, 0xD8CE,0x0083,0xB3D7,0x8544,0x0091,0x0089,0x0085,0x0083,0xB1B1,0xBBAF,0x0083,0xD8B0,0x8543,0x0085,0x0083,0x8542, 0x8541,0x0083,0x8540,0xD9EB,0x0089,0x0085,0x0083,0xDECB,0x84FE,0x0083,0xD9E9,0x84FD,0x0085,0x0083,0x84FC,0x84FB, 0x0083,0x84FA,0xD0D9,0x00A1,0x0091,0x0089,0x0085,0x0083,0x84F9,0xB4D2,0x0083,0xB0FC,0x84F8,0x0085,0x0083,0x84F7, 0x84F6,0x0083,0x84F5,0xD4C8,0x0089,0x0085,0x0083,0xCEF0,0xB9B4,0x0083,0x84F4,0x84F3,0x0085,0x0083,0x84F2,0xC9D7, 0x0083,0xD9E8,0x84F1,0x0091,0x0089,0x0085,0x0083,0x84F0,0x84EF,0x0083,0x84EE,0x84ED,0x0085,0x0083,0x84EC,0x84EB, 0x0083,0x84EA,0xDBC4,0x0089,0x0085,0x0083,0x84E9,0x84E8,0x0083,0x84E7,0x84E6,0x0085,0x0083,0x84E5,0x84E4,0x0083, 0x84E3,0x84E2,0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x84E1,0x84E0,0x0083,0x84DF,0xC7DA,0x0085,0x0083, 0x84DE,0x84DD,0x0083,0x84DC,0x84DB,0x0089,0x0085,0x0083,0xC4BC,0x84DA,0x0083,0x84D9,0x84D8,0x0085,0x0083,0x84D7, 0x84D6,0x0083,0x84D5,0xBFB1,0x0091,0x0089,0x0085,0x0083,0x84D4,0xDBC3,0x0083,0x84D3,0x84D2,0x0085,0x0083,0x84D1, 0xC0D5,0x0083,0x84D0,0xDBC2,0x0089,0x0085,0x0083,0x84CF,0x84CE,0x0083,0x84CD,0x84CC,0x0085,0x0083,0xD1AB,0x84CB, 0x0083,0xC3E3,0x84CA,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD3C2,0x84C9,0x0083,0x84C8,0x84C7,0x0085,0x0083,0xB2AA, 0x84C6,0x0083,0x84C5,0x84C4,0x0089,0x0085,0x0083,0xCAC6,0xDBC0,0x0083,0x84C3,0x84C2,0x0085,0x0083,0x84C1,0x84C0, 0x0083,0x84BF,0x84BE,0x0091,0x0089,0x0085,0x0083,0x84BD,0x84BC,0x0083,0x84BB,0x84BA,0x0085,0x0083,0xC0CD,0xBEA2, 0x0083,0xC0F8,0x84B9,0x0089,0x0085,0x0083,0x84B8,0x84B7,0x0083,0xDBBF,0xDBBE,0x0085,0x0083,0xBDD9,0xC5AC,0x0083, 0xD6FA,0xB6AF,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x84B6,0x84B5,0x0083,0x84B4,0x84B3,0x0085,0x0083,0xC1D3, 0xDBBD,0x0083,0xCEF1,0xBCD3,0x0089,0x0085,0x0083,0xB9A6,0xB0EC,0x0083,0xC8B0,0x84B2,0x0085,0x0083,0xC1A6,0x84B1, 0x0083,0x84B0,0x84AF,0x0091,0x0089,0x0085,0x0083,0x84AE,0x84AD,0x0083,0x84AC,0x84AB,0x0085,0x0083,0xD8E6,0x84AA, 0x0083,0x84A9,0xD8E5,0x0089,0x0085,0x0083,0x84A8,0x84A7,0x0083,0x84A6,0x84A5,0x0085,0x0083,0x84A4,0x84A3,0x0083, 0x84A2,0xC5FC,0x00A1,0x0091,0x0089,0x0085,0x0083,0x84A1,0x84A0,0x0083,0x849F,0x849E,0x0085,0x0083,0x849D,0xD8E3, 0x0083,0xD8E4,0x849C,0x0089,0x0085,0x0083,0xBDCB,0x849B,0x0083,0xD8E2,0x849A,0x0085,0x0083,0x8499,0x8498,0x0083, 0x8497,0x8496,0x0091,0x0089,0x0085,0x0083,0x8495,0x8494,0x0083,0x8493,0x8492,0x0085,0x0083,0x8491,0xB8EE,0x0083, 0x8490,0x848F,0x0089,0x0085,0x0083,0xB8B1,0x848E,0x0083,0x848D,0x848C,0x0085,0x0083,0x848B,0xBCF4,0x0083,0xCAA3, 0x848A,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xBEE7,0x0083,0x8489,0xB0FE,0x0085,0x0083,0x8488, 0x8487,0x0083,0x8486,0xD8DF,0x0089,0x0085,0x0083,0x8485,0x8484,0x0083,0xD8DE,0x8483,0x0085,0x0083,0xD8E0,0x8482, 0x0083,0x8481,0x8480,0x0091,0x0089,0x0085,0x0083,0x847E,0x847D,0x0083,0xC6CA,0x847C,0x0085,0x0083,0xCCDE,0x847B, 0x0083,0x847A,0xBDA3,0x0089,0x0085,0x0083,0xB9D0,0x8479,0x0083,0x8478,0xC7B0,0x0085,0x0083,0xD8DD,0x8477,0x0083, 0xCFF7,0x8476,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8475,0x8474,0x0083,0x8473,0x8472,0x0085,0x0083,0x8471,0xCCEA, 0x0083,0xBCC1,0xB6E7,0x0089,0x0085,0x0083,0xD8DC,0xD8DB,0x0083,0x8470,0xB9F4,0x0085,0x0083,0x846F,0xBFCC,0x0083, 0xB4CC,0xC9B2,0x0091,0x0089,0x0085,0x0083,0xC8AF,0xCBA2,0x0083,0xD6C6,0x846E,0x0085,0x0083,0x846D,0xD8DA,0x0083, 0x846C,0x846B,0x0089,0x0085,0x0083,0xB5BD,0x846A,0x0083,0xB9CE,0xD8D9,0x0085,0x0083,0x8469,0xB1F0,0x0083,0x8468, 0xC0FB,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC5D9,0x8467,0x0083,0x8466,0x8465,0x0085,0x0083,0xC5D0,0x8464, 0x0083,0x8463,0x8462,0x0089,0x0085,0x0083,0xC9BE,0x8461,0x0083,0x8460,0xB3F5,0x0085,0x0083,0x845F,0xB4B4,0x0083, 0xB8D5,0xD4F2,0x0091,0x0089,0x0085,0x0083,0xC1F5,0xC1D0,0x0083,0xEBBE,0x845E,0x0085,0x0083,0x845D,0x845C,0x0083, 0xBBAE,0xD0CC,0x0089,0x0085,0x0083,0x845B,0x845A,0x0083,0xD8D8,0xDBBB,0x0085,0x0083,0x8459,0x8458,0x0083,0xBFAF, 0x8457,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD8D7,0xC7D0,0x0083,0xB7D6,0x8456,0x0085,0x0083,0x8455,0xC8D0,0x0083, 0xD8D6,0xB5F3,0x0089,0x0085,0x0083,0xB5B6,0xD4E4,0x0083,0x8454,0xBAAF,0x0085,0x0083,0xDBCA,0xBBF7,0x0083,0xB3F6, 0xB0BC,0x0091,0x0089,0x0085,0x0083,0xCDB9,0x8453,0x0083,0xD0D7,0xDBC9,0x0085,0x0083,0x8452,0xB5CA,0x0083,0x8451, 0x8450,0x0089,0x0085,0x0083,0xBBCB,0xBFAD,0x0083,0x844F,0xC6BE,0x0085,0x0083,0x844E,0xD9EC,0x0083,0x844D,0x844C, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x844B,0x844A,0x0083,0x8449,0x8448,0x0085,0x0083,0xB7EF,0x8447, 0x0083,0x8446,0xB7B2,0x0089,0x0085,0x0083,0xBCB8,0x8445,0x0083,0x8444,0xC4FD,0x0085,0x0083,0x8443,0xC1DD,0x0083, 0x8442,0x8441,0x0091,0x0089,0x0085,0x0083,0x8440,0x83FE,0x0083,0x83FD,0x83FC,0x0085,0x0083,0x83FB,0x83FA,0x0083, 0x83F9,0xB4D5,0x0089,0x0085,0x0083,0x83F8,0xBCF5,0x0083,0x83F7,0x83F6,0x0085,0x0083,0xC1E8,0xB5F2,0x0083,0x83F5, 0xC1B9,0x00A1,0x0091,0x0089,0x0085,0x0083,0x83F4,0xDAA1,0x0083,0xD7BC,0x83F3,0x0085,0x0083,0xC6E0,0x83F2,0x0083, 0x83F1,0x83F0,0x0089,0x0085,0x0083,0xBEBB,0x83EF,0x0083,0x83EE,0xD9FD,0x0085,0x0083,0xD9FE,0xB6B3,0x0083,0x83ED, 0x83EC,0x0091,0x0089,0x0085,0x0083,0x83EB,0xC0E4,0x0083,0xD2B1,0xBFF6,0x0085,0x0083,0x83EA,0xBEF6,0x0083,0xB3E5, 0xD9FC,0x0089,0x0085,0x0083,0xB1F9,0xB7EB,0x0083,0x83E9,0x83E8,0x0085,0x0083,0xB6AC,0xD9FB,0x0083,0x83E7,0x83E6, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x83E5,0x83E4,0x0083,0x83E3,0xDAA4,0x0085,0x0083,0xD4A9,0x83E2,0x0083, 0xDAA3,0x83E1,0x0089,0x0085,0x0083,0xB9DA,0x83E0,0x0083,0x83DF,0x83DE,0x0085,0x0083,0xC5A9,0xBEFC,0x0083,0x83DD, 0xD0B4,0x0091,0x0089,0x0085,0x0083,0x83DC,0xC8DF,0x0083,0xDAA2,0xC3E1,0x0085,0x0083,0x83DB,0x83DA,0x0083,0xC3B0, 0x83D9,0x0089,0x0085,0x0083,0x83D8,0x83D7,0x0083,0x83D6,0xD4D9,0x0085,0x0083,0xB2E1,0x83D5,0x0083,0x83D4,0xC8BD, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB8D4,0x83D3,0x0083,0x83D2,0xC4DA,0x0085,0x0083,0x83D1,0x83D0,0x0083,0xD8E7, 0xD9E6,0x0089,0x0085,0x0083,0xBCBD,0x83CF,0x0083,0x83CE,0xCADE,0x0085,0x0083,0xBCE6,0xD1F8,0x0083,0x83CD,0xD7C8, 0x0091,0x0089,0x0085,0x0083,0xB5E4,0xBEDF,0x0083,0xC6E4,0xB1F8,0x0085,0x0083,0xD0CB,0xB9D8,0x0083,0x83CC,0xB9B2, 0x0089,0x0085,0x0083,0xC0BC,0x83CB,0x0083,0xD9E2,0xC1F9,0x0085,0x0083,0xB9AB,0xB0CB,0x0083,0x83CA,0x83C9,0x0181, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC8AB,0x83C8,0x0083,0x83C7,0xC8EB,0x0085,0x0083,0x83C6,0x83C5, 0x0083,0xBEA4,0x83C4,0x0089,0x0085,0x0083,0x83C3,0x83C2,0x0083,0x83C1,0x83C0,0x0085,0x0083,0xB6B5,0x83BF,0x0083, 0xB5B3,0x83BE,0x0091,0x0089,0x0085,0x0083,0x83BD,0x83BC,0x0083,0xD9F0,0xD9EE,0x0085,0x0083,0xCDC3,0x83BB,0x0083, 0x83BA,0xB6D2,0x0089,0x0085,0x0083,0x83B9,0x83B8,0x0083,0x83B7,0xC3E2,0x0085,0x0083,0x83B6,0xBFCB,0x0083,0x83B5, 0xB9E2,0x00A1,0x0091,0x0089,0x0085,0x0083,0xCFC8,0x83B4,0x0083,0xD5D7,0xB3E4,0x0085,0x0083,0xD0D6,0xD4AA,0x0083, 0x83B3,0xD4CA,0x0089,0x0085,0x0083,0xD8A3,0xB6F9,0x0083,0x83B2,0x83B1,0x0085,0x0083,0x83B0,0x83AF,0x0083,0x83AE, 0x83AD,0x0091,0x0089,0x0085,0x0083,0x83AC,0x83AB,0x0083,0x83AA,0x83A9,0x0085,0x0083,0x83A8,0x83A7,0x0083,0x83A6, 0x83A5,0x0089,0x0085,0x0083,0x83A4,0x83A3,0x0083,0x83A2,0x83A1,0x0085,0x0083,0x83A0,0x839F,0x0083,0x839E,0x839D, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x839C,0x839B,0x0083,0x839A,0x8399,0x0085,0x0083,0x8398,0x8397,0x0083, 0x8396,0xC0DC,0x0089,0x0085,0x0083,0x8395,0x8394,0x0083,0x8393,0x8392,0x0085,0x0083,0x8391,0x8390,0x0083,0x838F, 0x838E,0x0091,0x0089,0x0085,0x0083,0x838D,0x838C,0x0083,0x838B,0x838A,0x0085,0x0083,0x8389,0x8388,0x0083,0xC8E5, 0x8387,0x0089,0x0085,0x0083,0x8386,0x8385,0x0083,0x8384,0x8383,0x0085,0x0083,0x8382,0xD9D9,0x0083,0x8381,0x8380, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x837E,0xD9D8,0x0083,0xD9D3,0x837D,0x0085,0x0083,0x837C,0x837B,0x0083,0x837A, 0x8379,0x0089,0x0085,0x0083,0x8378,0x8377,0x0083,0x8376,0x8375,0x0085,0x0083,0x8374,0xC6A7,0x0083,0x8373,0x8372, 0x0091,0x0089,0x0085,0x0083,0x8371,0x8370,0x0083,0x836F,0xBDA9,0x0085,0x0083,0x836E,0xCBDB,0x0083,0x836D,0x836C, 0x0089,0x0085,0x0083,0x836B,0x836A,0x0083,0xD9D7,0xD9D4,0x0085,0x0083,0xD9D5,0x8369,0x0083,0x8368,0x8367,0x0101, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8366,0xC9AE,0x0083,0xD9D6,0x8365,0x0085,0x0083,0x8364,0x8363,0x0083, 0x8362,0x8361,0x0089,0x0085,0x0083,0x8360,0x835F,0x0083,0x835E,0x835D,0x0085,0x0083,0x835C,0x835B,0x0083,0xC1C5, 0x835A,0x0091,0x0089,0x0085,0x0083,0x8359,0x8358,0x0083,0xD9D2,0x8357,0x0085,0x0083,0x8356,0x8355,0x0083,0x8354, 0x8353,0x0089,0x0085,0x0083,0x8352,0xCFF1,0x0083,0x8351,0x8350,0x0085,0x0083,0x834F,0x834E,0x0083,0x834D,0x834C, 0x00A1,0x0091,0x0089,0x0085,0x0083,0x834B,0x834A,0x0083,0x8349,0x8348,0x0085,0x0083,0x8347,0x8346,0x0083,0x8345, 0x8344,0x0089,0x0085,0x0083,0x8343,0x8342,0x0083,0x8341,0x8340,0x0085,0x0083,0x82FE,0xC9B5,0x0083,0xD9D1,0x82FD, 0x0091,0x0089,0x0085,0x0083,0x82FC,0x82FB,0x0083,0x82FA,0x82F9,0x0085,0x0083,0x82F8,0x82F7,0x0083,0xB0C1,0x82F6, 0x0089,0x0085,0x0083,0x82F5,0x82F4,0x0083,0x82F3,0x82F2,0x0085,0x0083,0xB4DF,0x82F1,0x0083,0x82F0,0xD9D0,0x00C1, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xB4A2,0xD9CF,0x0083,0x82EF,0xD9CE,0x0085,0x0083,0x82EE,0xB4F6,0x0083,0x82ED, 0x82EC,0x0089,0x0085,0x0083,0x82EB,0x82EA,0x0083,0x82E9,0x82E8,0x0085,0x0083,0x82E7,0x82E6,0x0083,0x82E5,0x82E4, 0x0091,0x0089,0x0085,0x0083,0x82E3,0x82E2,0x0083,0x82E1,0x82E0,0x0085,0x0083,0x82DF,0x82DE,0x0083,0x82DD,0x82DC, 0x0089,0x0085,0x0083,0x82DB,0x82DA,0x0083,0x82D9,0xB0F8,0x0085,0x0083,0x82D8,0x82D7,0x0083,0x82D6,0x82D5,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xC0FC,0x82D4,0x0083,0x82D3,0xB8B5,0x0085,0x0083,0x82D2,0x82D1,0x0083,0x82D0,0x82CF, 0x0089,0x0085,0x0083,0xBFFE,0xB3A5,0x0083,0xD9C7,0x82CE,0x0085,0x0083,0x82CD,0xD9CD,0x0083,0x82CC,0x82CB,0x0091, 0x0089,0x0085,0x0083,0x82CA,0xCDB5,0x0083,0xC5BC,0x82C9,0x0085,0x0083,0x82C8,0x82C7,0x0083,0x82C6,0x82C5,0x0089, 0x0085,0x0083,0x82C4,0x82C3,0x0083,0x82C2,0x82C1,0x0085,0x0083,0xD9CC,0x82C0,0x0083,0x82BF,0x82BE,0x0081,0x0081, 0x047D,0x027F,0x017F,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0x82BD,0x0083,0x82BC,0x82BB,0x0085,0x0083,0xBDA1, 0x82BA,0x0083,0x82B9,0x82B8,0x0089,0x0085,0x0083,0x82B7,0x82B6,0x0083,0x82B5,0x82B4,0x0085,0x0083,0x82B3,0xCDA3, 0x0083,0x82B2,0xD7F6,0x0091,0x0089,0x0085,0x0083,0x82B1,0x82B0,0x0083,0x82AF,0x82AE,0x0085,0x0083,0xD9C9,0x82AD, 0x0083,0x82AC,0x82AB,0x0089,0x0085,0x0083,0x82AA,0x82A9,0x0083,0xC6AB,0xD9CB,0x0085,0x0083,0x82A8,0xD9BC,0x0083, 0x82A7,0x82A6,0x00A1,0x0091,0x0089,0x0085,0x0083,0x82A5,0xD9CA,0x0083,0xBCD9,0x82A4,0x0085,0x0083,0x82A3,0x82A2, 0x0083,0xD9C8,0x82A1,0x0089,0x0085,0x0083,0x82A0,0x829F,0x0083,0x829E,0xC7E3,0x0085,0x0083,0x829D,0xD6B5,0x0083, 0x829C,0xD5AE,0x0091,0x0089,0x0085,0x0083,0x829B,0x829A,0x0083,0x8299,0x8298,0x0085,0x0083,0x8297,0x8296,0x0083, 0x8295,0x8294,0x0089,0x0085,0x0083,0x8293,0x8292,0x0083,0x8291,0xD9C0,0x0085,0x0083,0xD9C1,0xD9BE,0x0083,0x8290, 0xC4DF,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xD9BB,0xD9C6,0x0083,0x828F,0xBEEB,0x0085,0x0083,0xD9C5,0x828E, 0x0083,0x828D,0x828C,0x0089,0x0085,0x0083,0xB3AB,0x828B,0x0083,0xBDE8,0x828A,0x0085,0x0083,0x8289,0xD9C3,0x0083, 0x8288,0xD2D0,0x0091,0x0089,0x0085,0x0083,0xBAF2,0xCCC8,0x0083,0x8287,0x8286,0x0085,0x0083,0x8285,0xBEF3,0x0083, 0x8284,0xB5B9,0x0089,0x0085,0x0083,0x8283,0x8282,0x0083,0xD9BF,0x8281,0x0085,0x0083,0xB1B6,0xD9C4,0x0083,0x8280, 0x827E,0x00A1,0x0091,0x0089,0x0085,0x0083,0x827D,0x827C,0x0083,0x827B,0x827A,0x0085,0x0083,0x8279,0x8278,0x0083, 0x8277,0x8276,0x0089,0x0085,0x0083,0x8275,0x8274,0x0083,0x8273,0xD9C2,0x0085,0x0083,0x8272,0x8271,0x0083,0x8270, 0xB0B3,0x0091,0x0089,0x0085,0x0083,0x826F,0xD9BA,0x0083,0x826E,0x826D,0x0085,0x0083,0x826C,0x826B,0x0083,0xD9BD, 0x826A,0x0089,0x0085,0x0083,0xBEE3,0x8269,0x0083,0xB8A9,0xD0DE,0x0085,0x0083,0xBCF3,0x8268,0x0083,0x8267,0xD9B3, 0x0101,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xC1A9,0xD9B2,0x0083,0x8266,0xD9B1,0x0085,0x0083,0x8265,0x8264, 0x0083,0xD9B6,0x8263,0x0089,0x0085,0x0083,0xD0C5,0x8262,0x0083,0xD9B9,0xD3E1,0x0085,0x0083,0xB1A3,0xD9B7,0x0083, 0x8261,0xD9B5,0x0091,0x0089,0x0085,0x0083,0x8260,0xB7FD,0x0083,0xCBD7,0x825F,0x0085,0x0083,0x825E,0x825D,0x0083, 0x825C,0x825B,0x0089,0x0085,0x0083,0xD9B8,0xC0FE,0x0083,0xC7CE,0xD9DE,0x0085,0x0083,0x825A,0x8259,0x0083,0x8258, 0xBFA1,0x00A1,0x0091,0x0089,0x0085,0x0083,0x8257,0x8256,0x0083,0x8255,0x8254,0x0085,0x0083,0xD9B4,0xB6ED,0x0083, 0xB4D9,0x8253,0x0089,0x0085,0x0083,0x8252,0x8251,0x0083,0xB1E3,0x8250,0x0085,0x0083,0x824F,0x824E,0x0083,0x824D, 0x824C,0x0091,0x0089,0x0085,0x0083,0x824B,0x824A,0x0083,0x8249,0x8248,0x0085,0x0083,0xC7D6,0x8247,0x0083,0x8246, 0x8245,0x0089,0x0085,0x0083,0x8244,0x8243,0x0083,0xBAEE,0xCEEA,0x0085,0x0083,0x8242,0xD9AF,0x0083,0x8241,0xD9AD, 0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083,0xBFEB,0xC7C8,0x0083,0xB2E0,0xD5EC,0x0085,0x0083,0xBDC4,0x8240,0x0083, 0xC2C2,0x81FE,0x0089,0x0085,0x0083,0x81FD,0xCFC0,0x0083,0x81FC,0x81FB,0x0085,0x0083,0xD2C0,0x81FA,0x0083,0xB9A9, 0x81F9,0x0091,0x0089,0x0085,0x0083,0x81F8,0x81F7,0x0083,0xB6B1,0x81F6,0x0085,0x0083,0x81F5,0xD9B0,0x0083,0x81F4, 0x81F3,0x0089,0x0085,0x0083,0xD9A7,0x81F2,0x0083,0xD9AA,0x81F1,0x0085,0x0083,0xCACC,0x81F0,0x0083,0xC0FD,0x81EF, 0x00A1,0x0091,0x0089,0x0085,0x0083,0xD9A8,0xB3DE,0x0083,0x81EE,0x81ED,0x0085,0x0083,0x81EC,0xD6B6,0x0083,0xD9A9, 0x81EB,0x0089,0x0085,0x0083,0x81EA,0x81E9,0x0083,0xCAB9,0xD9AB,0x0085,0x0083,0x81E8,0xD9AE,0x0083,0xD9AC,0x81E7, 0x0091,0x0089,0x0085,0x0083,0x81E6,0x81E5,0x0083,0x81E4,0xD9A5,0x0085,0x0083,0x81E3,0xD9A6,0x0083,0xBCD1,0x81E2, 0x0089,0x0085,0x0083,0x81E1,0xB0DB,0x0083,0xD1F0,0x81E0,0x0085,0x0083,0x81DF,0xC0D0,0x0083,0x81DE,0x81DD,0x017F, 0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xC5E5,0x0083,0x81DC,0xD8FB,0x0085,0x0083,0x81DB,0xD9DD,0x0083,0xD8F4, 0xD3B6,0x0089,0x0085,0x0083,0x81DA,0x81D9,0x0083,0xC4E3,0xD9A1,0x0085,0x0083,0xD8FA,0xD8FE,0x0083,0xD7F7,0xB7F0, 0x0091,0x0089,0x0085,0x0083,0xD8FD,0xD3E0,0x0083,0xD9DC,0xD9A2,0x0085,0x0083,0x81D8,0xBACE,0x0083,0x81D7,0xCCE5, 0x0089,0x0085,0x0083,0x81D6,0xD3D3,0x0083,0xD7F4,0xD7A1,0x0085,0x0083,0xB5CD,0xCEBB,0x0083,0x81D5,0x81D4,0x00A1, 0x0091,0x0089,0x0085,0x0083,0x81D3,0x81D2,0x0083,0x81D1,0x81D0,0x0085,0x0083,0xB5AB,0x81CF,0x0083,0x81CE,0xB5E8, 0x0089,0x0085,0x0083,0x81CD,0x81CC,0x0083,0x81CB,0x81CA,0x0085,0x0083,0x81C9,0xD9A4,0x0083,0xCBC6,0x81C8,0x0091, 0x0089,0x0085,0x0083,0xCBC5,0x81C7,0x0083,0xC9EC,0x81C6,0x0085,0x0083,0xC1E6,0x81C5,0x0083,0xB0E9,0x81C4,0x0089, 0x0085,0x0083,0xD9A3,0x81C3,0x0083,0xB9C0,0xB2AE,0x0085,0x0083,0x81C2,0x81C1,0x0083,0x81C0,0xD8F9,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xCEB1,0x81BF,0x0083,0x81BE,0xD8F7,0x0085,0x0083,0xC2D7,0xD8F6,0x0083,0xC9CB,0x81BD, 0x0089,0x0085,0x0083,0xD8F3,0x81BC,0x0083,0xB4AB,0xCEB0,0x0085,0x0083,0xC9A1,0x81BB,0x0083,0x81BA,0xD8F1,0x0091, 0x0089,0x0085,0x0083,0xBBE1,0xBBEF,0x0083,0xD3C5,0xD6DA,0x0085,0x0083,0x81B9,0x81B8,0x0083,0x81B7,0x81B6,0x0089, 0x0085,0x0083,0x81B5,0xD0DD,0x0083,0xB7A5,0xB7FC,0x0085,0x0083,0xBCBF,0xCEE9,0x0083,0x81B4,0x81B3,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xD2C1,0xD8F8,0x0083,0x81B2,0x81B1,0x0085,0x0083,0x81B0,0x81AF,0x0083,0x81AE,0x81AD,0x0089, 0x0085,0x0083,0x81AC,0xC6F3,0x0083,0x81AB,0xB7C2,0x0085,0x0083,0x81AA,0xB7DD,0x0083,0x81A9,0xC8CE,0x0091,0x0089, 0x0085,0x0083,0x81A8,0x81A7,0x0083,0x81A6,0xBCDB,0x0085,0x0083,0xBCFE,0xD8F5,0x0083,0x81A5,0xD8F2,0x0089,0x0085, 0x0083,0xD6D9,0x81A4,0x0083,0xD1F6,0x81A3,0x0085,0x0083,0x81A2,0x81A1,0x0083,0xC3C7,0xD8EF,0x0101,0x00C1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xD2C7,0x81A0,0x0083,0xD8ED,0x819F,0x0085,0x0083,0x819E,0xD2D4,0x0083,0xC1EE,0xB4FA, 0x0089,0x0085,0x0083,0x819D,0xD8EE,0x0083,0x819C,0xC7AA,0x0085,0x0083,0xD8F0,0xD9DA,0x0083,0x819B,0x819A,0x0091, 0x0089,0x0085,0x0083,0x8199,0xCFC9,0x0083,0xB8B6,0xD5CC,0x0085,0x0083,0xCBFB,0xCACB,0x0083,0xD7D0,0xB2D6,0x0089, 0x0085,0x0083,0x8198,0xC2D8,0x0083,0x8197,0x8196,0x0085,0x0083,0xB4D3,0xC8D4,0x0083,0x8195,0xBDE9,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xBDF1,0xD8EB,0x0083,0x8194,0xB3F0,0x0085,0x0083,0xC6CD,0xBDF6,0x0083,0xD8C6,0xD8EA,0x0089, 0x0085,0x0083,0xD8EC,0xC8CA,0x0083,0xCAB2,0xD2DA,0x0085,0x0083,0x8193,0x8192,0x0083,0x8191,0xD8E9,0x0091,0x0089, 0x0085,0x0083,0xC8CB,0x8190,0x0083,0x818F,0x818E,0x0085,0x0083,0x818D,0xD9F4,0x0083,0x818C,0xD9F1,0x0089,0x0085, 0x0083,0xC7D7,0x818B,0x0083,0x818A,0x8189,0x0085,0x0083,0xC1C1,0xCDA4,0x0083,0xBEA9,0xCFED,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0x8188,0xC4B6,0x0083,0xBAE0,0xB2FA,0x0085,0x0083,0xD2E0,0xBAA5,0x0083,0xBDBB,0x8187,0x0089, 0x0085,0x0083,0xBFBA,0xCDF6,0x0083,0xD9EF,0xD8BD,0x0085,0x0083,0x8186,0x8185,0x0083,0x8184,0xD0A9,0x0091,0x0089, 0x0085,0x0083,0xD1C7,0x8183,0x0083,0xD8A8,0x8182,0x0085,0x0083,0x8181,0xBEAE,0x0083,0xCEE5,0xD8C1,0x0089,0x0085, 0x0083,0xBBA5,0xD4C6,0x0083,0x8180,0xBFF7,0x0085,0x0083,0xD3DA,0xD8A1,0x0083,0xB6FE,0xCAC2,0x00A1,0x0091,0x0089, 0x0085,0x0083,0x817E,0xD5F9,0x0083,0xD3E8,0x817D,0x0085,0x0083,0xC1CB,0x817C,0x0083,0x817B,0x817A,0x0089,0x0085, 0x0083,0x8179,0x8178,0x0083,0x8177,0x8176,0x0085,0x0083,0xC7AC,0x8175,0x0083,0x8174,0x8173,0x0091,0x0089,0x0085, 0x0083,0x8172,0x8171,0x0083,0x8170,0x816F,0x0085,0x0083,0x816E,0x816D,0x0083,0x816C,0xC8E9,0x0089,0x0085,0x0083, 0x816B,0xC2D2,0x0083,0xC2F2,0x816A,0x0085,0x0083,0x8169,0x8168,0x0083,0x8167,0x8166,0x0081,0x0081,0x00FF,0x00BF, 0x009F,0x008F,0x0087,0x0083,0x8165,0x0083,0xD8C0,0x8164,0x0085,0x0083,0x8163,0xCAE9,0x0083,0x8162,0x8161,0x0089, 0x0085,0x0083,0x8160,0x815F,0x0083,0xCFE7,0xCFB0,0x0085,0x0083,0xD2B2,0xC6F2,0x0083,0xBEC5,0xD8BF,0x0091,0x0089, 0x0085,0x0083,0x815E,0x815D,0x0083,0xD2D2,0xB3CB,0x0085,0x0083,0x815C,0xB9D4,0x0083,0x815B,0xC7C7,0x0089,0x0085, 0x0083,0xC5D2,0xC6B9,0x0083,0x815A,0xC0D6,0x0085,0x0083,0xB7A6,0xBAF5,0x0083,0xD5A7,0xCEDA,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xD6AE,0x8159,0x0083,0xD2E5,0xC3B4,0x0085,0x0083,0xD8B1,0x8158,0x0083,0xBEC3,0x8157,0x0089,0x0085, 0x0083,0xC4CB,0x8156,0x0083,0x8155,0x8154,0x0085,0x0083,0xD8AF,0xBED9,0x0083,0xC0F6,0x8153,0x0091,0x0089,0x0085, 0x0083,0xD6F7,0xCEAA,0x0083,0xB5A4,0xCDE8,0x0085,0x0083,0x8152,0xD8BC,0x0083,0x8151,0xC1D9,0x0089,0x0085,0x0083, 0x8150,0xB4AE,0x0083,0x814F,0xB7E1,0x0085,0x0083,0x814E,0x814D,0x0083,0xD6D0,0xE3DC,0x00C1,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xD1BE,0xB8F6,0x0083,0x814C,0xD8AD,0x0085,0x0083,0xC9A5,0x814B,0x0083,0xD1CF,0xC1BD,0x0089,0x0085, 0x0083,0x814A,0xB6AA,0x0083,0x8149,0x8148,0x0085,0x0083,0x8147,0xD8A9,0x0083,0xCBBF,0xB6AB,0x0091,0x0089,0x0085, 0x0083,0xB4D4,0xD2B5,0x0083,0xB1FB,0xC7F0,0x0085,0x0083,0x8146,0xCAC0,0x0083,0xD8A7,0xC7D2,0x0089,0x0085,0x0083, 0xD7A8,0x8145,0x0083,0xB3F3,0xD8A4,0x0085,0x0083,0x8144,0xD3EB,0x0083,0xB2BB,0xD8A2,0x0081,0x0091,0x0089,0x0085, 0x0083,0xCFC2,0xC9CF,0x0083,0xC8FD,0xD5C9,0x0085,0x0083,0xCDF2,0x8143,0x0083,0x8142,0x8141,0x0081,0x0085,0x0083, 0xC6DF,0x8140,0x0083,0xB6A1,0xD2BB,0x05BC,0x0219,0x0082,0x0082,0x00BB,0x00B1,0x0082,0x0096,0x0082,0x008B,0x0082, 0x0085,0x0081,0x0082,0xA954,0x0081,0x0083,0xA953,0xA952,0x0086,0x0081,0x0081,0x0081,0xA951,0x0081,0x0082,0x0081, 0xA950,0x0088,0x0082,0x0082,0x0082,0x0081,0x0082,0xA94F,0x008E,0x0089,0x0081,0x0085,0x0083,0xA94E,0xA94D,0x0081, 0xA94C,0x0082,0x0082,0x0082,0xA94B,0x0081,0x0081,0x0081,0x0081,0xA94A,0x0082,0x0082,0x0081,0x0082,0x0082,0x0082, 0x0081,0x0081,0xA949,0x00A5,0x0081,0x0082,0x009C,0x0087,0x0082,0x0082,0x0082,0x0082,0xA95A,0x0086,0x0082,0x0082, 0x0082,0xA2EE,0x0089,0x0085,0x0083,0xA2ED,0xA2EC,0x0083,0xA2EB,0xA2EA,0x0085,0x0083,0xA2E9,0xA2E8,0x0083,0xA2E7, 0xA2E6,0x0081,0x0081,0x0081,0x0081,0x0081,0xA2E5,0x00D1,0x0082,0x0097,0x0082,0x0086,0x0082,0x0082,0x0082,0xA8E9, 0x0089,0x0085,0x0083,0xA8E8,0xA8E7,0x0083,0xA8E6,0xA8E5,0x0085,0x0083,0xA8E4,0xA8E3,0x0083,0xA8E2,0xA8E1,0x00A1, 0x0091,0x0089,0x0085,0x0083,0xA8E0,0xA8DF,0x0083,0xA8DE,0xA8DD,0x0085,0x0083,0xA8DC,0xA8DB,0x0083,0xA8DA,0xA8D9, 0x0089,0x0085,0x0083,0xA8D8,0xA8D7,0x0083,0xA8D6,0xA8D5,0x0085,0x0083,0xA8D4,0xA8D3,0x0083,0xA8D2,0xA8D1,0x0091, 0x0089,0x0085,0x0083,0xA8D0,0xA8CF,0x0083,0xA8CE,0xA8CD,0x0085,0x0083,0xA8CC,0xA8CB,0x0083,0xA8CA,0xA8C9,0x0081, 0x0085,0x0083,0xA8C8,0xA8C7,0x0083,0xA8C6,0xA8C5,0x00F7,0x00B7,0x0097,0x008A,0x0086,0x0082,0x0083,0xA964,0xA963, 0x0081,0x0081,0xA960,0x0086,0x0082,0x0083,0xA5F6,0xA5F5,0x0085,0x0083,0xA5F4,0xA5F3,0x0083,0xA5F2,0xA5F1,0x0091, 0x0089,0x0085,0x0083,0xA5F0,0xA5EF,0x0083,0xA5EE,0xA5ED,0x0085,0x0083,0xA5EC,0xA5EB,0x0083,0xA5EA,0xA5E9,0x0089, 0x0085,0x0083,0xA5E8,0xA5E7,0x0083,0xA5E6,0xA5E5,0x0085,0x0083,0xA5E4,0xA5E3,0x0083,0xA5E2,0xA5E1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xA5E0,0xA5DF,0x0083,0xA5DE,0xA5DD,0x0085,0x0083,0xA5DC,0xA5DB,0x0083,0xA5DA,0xA5D9,0x0089, 0x0085,0x0083,0xA5D8,0xA5D7,0x0083,0xA5D6,0xA5D5,0x0085,0x0083,0xA5D4,0xA5D3,0x0083,0xA5D2,0xA5D1,0x0091,0x0089, 0x0085,0x0083,0xA5D0,0xA5CF,0x0083,0xA5CE,0xA5CD,0x0085,0x0083,0xA5CC,0xA5CB,0x0083,0xA5CA,0xA5C9,0x0089,0x0085, 0x0083,0xA5C8,0xA5C7,0x0083,0xA5C6,0xA5C5,0x0085,0x0083,0xA5C4,0xA5C3,0x0083,0xA5C2,0xA5C1,0x00C1,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xA5C0,0xA5BF,0x0083,0xA5BE,0xA5BD,0x0085,0x0083,0xA5BC,0xA5BB,0x0083,0xA5BA,0xA5B9,0x0089, 0x0085,0x0083,0xA5B8,0xA5B7,0x0083,0xA5B6,0xA5B5,0x0085,0x0083,0xA5B4,0xA5B3,0x0083,0xA5B2,0xA5B1,0x0091,0x0089, 0x0085,0x0083,0xA5B0,0xA5AF,0x0083,0xA5AE,0xA5AD,0x0085,0x0083,0xA5AC,0xA5AB,0x0083,0xA5AA,0xA5A9,0x0089,0x0085, 0x0083,0xA5A8,0xA5A7,0x0083,0xA5A6,0xA5A5,0x0085,0x0083,0xA5A4,0xA5A3,0x0083,0xA5A2,0xA5A1,0x0093,0x008B,0x0086, 0x0082,0x0083,0xA967,0xA966,0x0081,0x0083,0xA962,0xA961,0x0082,0x0084,0x0082,0xA4F3,0x0083,0xA4F2,0xA4F1,0x0091, 0x0089,0x0085,0x0083,0xA4F0,0xA4EF,0x0083,0xA4EE,0xA4ED,0x0085,0x0083,0xA4EC,0xA4EB,0x0083,0xA4EA,0xA4E9,0x0089, 0x0085,0x0083,0xA4E8,0xA4E7,0x0083,0xA4E6,0xA4E5,0x0085,0x0083,0xA4E4,0xA4E3,0x0083,0xA4E2,0xA4E1,0x0159,0x0081, 0x0081,0x0081,0x014C,0x00FF,0x00BF,0x009F,0x008F,0x0087,0x0083,0xA4E0,0x0083,0xA4DF,0xA4DE,0x0085,0x0083,0xA4DD, 0xA4DC,0x0083,0xA4DB,0xA4DA,0x0089,0x0085,0x0083,0xA4D9,0xA4D8,0x0083,0xA4D7,0xA4D6,0x0085,0x0083,0xA4D5,0xA4D4, 0x0083,0xA4D3,0xA4D2,0x0091,0x0089,0x0085,0x0083,0xA4D1,0xA4D0,0x0083,0xA4CF,0xA4CE,0x0085,0x0083,0xA4CD,0xA4CC, 0x0083,0xA4CB,0xA4CA,0x0089,0x0085,0x0083,0xA4C9,0xA4C8,0x0083,0xA4C7,0xA4C6,0x0085,0x0083,0xA4C5,0xA4C4,0x0083, 0xA4C3,0xA4C2,0x00A1,0x0091,0x0089,0x0085,0x0083,0xA4C1,0xA4C0,0x0083,0xA4BF,0xA4BE,0x0085,0x0083,0xA4BD,0xA4BC, 0x0083,0xA4BB,0xA4BA,0x0089,0x0085,0x0083,0xA4B9,0xA4B8,0x0083,0xA4B7,0xA4B6,0x0085,0x0083,0xA4B5,0xA4B4,0x0083, 0xA4B3,0xA4B2,0x0091,0x0089,0x0085,0x0083,0xA4B1,0xA4B0,0x0083,0xA4AF,0xA4AE,0x0085,0x0083,0xA4AD,0xA4AC,0x0083, 0xA4AB,0xA4AA,0x0089,0x0085,0x0083,0xA4A9,0xA4A8,0x0083,0xA4A7,0xA4A6,0x0085,0x0083,0xA4A5,0xA4A4,0x0083,0xA4A3, 0xA4A2,0x0098,0x0087,0x0081,0x0081,0x0081,0x0081,0xA4A1,0x0082,0x0089,0x0085,0x0083,0xA948,0xA947,0x0083,0xA946, 0xA945,0x0085,0x0083,0xA944,0xA943,0x0083,0xA942,0xA941,0x0098,0x008B,0x0087,0x0084,0x0081,0xA940,0x0082,0xA895, 0x0081,0x0081,0xA894,0x0086,0x0082,0x0083,0xA1BD,0xA1BC,0x0085,0x0083,0xA1B3,0xA1B2,0x0083,0xA1FE,0xA893,0x0091, 0x0089,0x0085,0x0083,0xA1BF,0xA1BE,0x0083,0xA1BB,0xA1BA,0x0085,0x0083,0xA1B9,0xA1B8,0x0083,0xA1B7,0xA1B6,0x0089, 0x0085,0x0083,0xA1B5,0xA1B4,0x0083,0xA996,0xA965,0x0084,0x0081,0xA1A9,0x0083,0xA1A8,0xA1A3,0x0081,0x0081,0x0081, 0x0081,0x0081,0x0081,0x0083,0xA1A2,0xA1A1,0x0203,0x0082,0x00DD,0x008E,0x0082,0x0081,0x0081,0x0086,0x0082,0x0082, 0x0082,0xA1E1,0x0081,0x0081,0x0082,0xA1E2,0x00A1,0x008D,0x0081,0x0081,0x0087,0x0084,0x0081,0xA891,0x0082,0xA1EE, 0x0081,0x0081,0xA1EF,0x008B,0x0081,0x0082,0x0085,0x0083,0xA890,0xA88F,0x0083,0xA88E,0xA88D,0x0082,0x0086,0x0082, 0x0083,0xA1F1,0xA1F2,0x0082,0x0081,0xA1F0,0x0094,0x008D,0x0087,0x0081,0x0082,0x0083,0xA1F3,0xA1F4,0x0082,0x0081, 0x0083,0xA88C,0xA88B,0x0081,0x0082,0x0082,0x0083,0xA1F7,0xA1F8,0x0088,0x0082,0x0081,0x0081,0x0083,0xA1F5,0xA1F6, 0x0089,0x0082,0x0085,0x0083,0xA88A,0xA889,0x0081,0xA888,0x0086,0x0082,0x0083,0xA887,0xA886,0x0085,0x0083,0xA885, 0xA884,0x0083,0xA883,0xA882,0x0166,0x00E6,0x00AC,0x0096,0x0091,0x0089,0x0085,0x0083,0xA881,0xA880,0x0083,0xA87E, 0xA87D,0x0085,0x0083,0xA87C,0xA87B,0x0083,0xA87A,0xA879,0x0081,0x0081,0x0081,0xA878,0x0087,0x0082,0x0082,0x0083, 0xA877,0xA876,0x0089,0x0085,0x0083,0xA875,0xA874,0x0083,0xA873,0xA872,0x0085,0x0083,0xA871,0xA870,0x0083,0xA86F, 0xA86E,0x00A1,0x0091,0x0089,0x0085,0x0083,0xA86D,0xA86C,0x0083,0xA86B,0xA86A,0x0085,0x0083,0xA869,0xA868,0x0083, 0xA867,0xA866,0x0089,0x0085,0x0083,0xA865,0xA864,0x0083,0xA863,0xA862,0x0085,0x0083,0xA861,0xA860,0x0083,0xA85F, 0xA85E,0x0091,0x0089,0x0085,0x0083,0xA85D,0xA85C,0x0083,0xA85B,0xA85A,0x0085,0x0083,0xA859,0xA858,0x0083,0xA857, 0xA856,0x0086,0x0081,0x0083,0xA855,0xA854,0x0082,0x0083,0xA9EF,0xA9EE,0x00C1,0x00A1,0x0091,0x0089,0x0085,0x0083, 0xA9ED,0xA9EC,0x0083,0xA9EB,0xA9EA,0x0085,0x0083,0xA9E9,0xA9E8,0x0083,0xA9E7,0xA9E6,0x0089,0x0085,0x0083,0xA9E5, 0xA9E4,0x0083,0xA9E3,0xA9E2,0x0085,0x0083,0xA9E1,0xA9E0,0x0083,0xA9DF,0xA9DE,0x0091,0x0089,0x0085,0x0083,0xA9DD, 0xA9DC,0x0083,0xA9DB,0xA9DA,0x0085,0x0083,0xA9D9,0xA9D8,0x0083,0xA9D7,0xA9D6,0x0089,0x0085,0x0083,0xA9D5,0xA9D4, 0x0083,0xA9D3,0xA9D2,0x0085,0x0083,0xA9D1,0xA9D0,0x0083,0xA9CF,0xA9CE,0x00A1,0x0091,0x0089,0x0085,0x0083,0xA9CD, 0xA9CC,0x0083,0xA9CB,0xA9CA,0x0085,0x0083,0xA9C9,0xA9C8,0x0083,0xA9C7,0xA9C6,0x0089,0x0085,0x0083,0xA9C5,0xA9C4, 0x0083,0xA9C3,0xA9C2,0x0085,0x0083,0xA9C1,0xA9C0,0x0083,0xA9BF,0xA9BE,0x0091,0x0089,0x0085,0x0083,0xA9BD,0xA9BC, 0x0083,0xA9BB,0xA9BA,0x0085,0x0083,0xA9B9,0xA9B8,0x0083,0xA9B7,0xA9B6,0x0089,0x0085,0x0083,0xA9B5,0xA9B4,0x0083, 0xA9B3,0xA9B2,0x0085,0x0083,0xA9B1,0xA9B0,0x0083,0xA9AF,0xA9AE,0x0099,0x0081,0x0081,0x0091,0x0089,0x0085,0x0083, 0xA9AD,0xA9AC,0x0083,0xA9AB,0xA9AA,0x0085,0x0083,0xA9A9,0xA9A8,0x0083,0xA9A7,0xA9A6,0x0081,0x0081,0x0083,0xA9A5, 0xA9A4,0x0082,0x0088,0x0082,0x0082,0x0082,0x0083,0xA2C4,0xA2C3,0x0091,0x0089,0x0085,0x0083,0xA2C2,0xA2C1,0x0083, 0xA2C0,0xA2BF,0x0085,0x0083,0xA2BE,0xA2BD,0x0083,0xA2BC,0xA2BB,0x0089,0x0085,0x0083,0xA2BA,0xA2B9,0x0083,0xA2B8, 0xA2B7,0x0085,0x0083,0xA2B6,0xA2B5,0x0083,0xA2B4,0xA2B3,0x00E9,0x00C9,0x0081,0x0081,0x00AF,0x009F,0x008F,0x0087, 0x0083,0xA2B2,0x0083,0xA2B1,0xA2D8,0x0085,0x0083,0xA2D7,0xA2D6,0x0083,0xA2D5,0xA2D4,0x0089,0x0085,0x0083,0xA2D3, 0xA2D2,0x0083,0xA2D1,0xA2D0,0x0085,0x0083,0xA2CF,0xA2CE,0x0083,0xA2CD,0xA2CC,0x0081,0x0089,0x0085,0x0083,0xA2CB, 0xA2CA,0x0083,0xA2C9,0xA2C8,0x0085,0x0083,0xA2C7,0xA2C6,0x0081,0xA2C5,0x0081,0x0090,0x0088,0x0084,0x0082,0xA2E2, 0x0083,0xA2E1,0xA2E0,0x0085,0x0083,0xA2DF,0xA2DE,0x0083,0xA2DD,0xA2DC,0x0081,0x0085,0x0083,0xA2DB,0xA2DA,0x0081, 0xA2D9,0x008A,0x0082,0x0082,0x0082,0x0082,0x0081,0x0081,0x0082,0xA1D0,0x0082,0x0088,0x0081,0x0082,0x0082,0x0081, 0x0081,0xA853,0x0087,0x0081,0x0082,0x0082,0x0081,0xA1CD,0x0081,0x0085,0x0082,0x0081,0xA1D1,0x0082,0x0081,0xA892, 0x0109,0x00E9,0x00A2,0x008A,0x0082,0x0082,0x0082,0x0084,0x0082,0xA1DB,0x0081,0xA1DA,0x0093,0x0089,0x0082,0x0084, 0x0082,0xA852,0x0083,0xA851,0xA1DD,0x0087,0x0084,0x0081,0xA1DC,0x0082,0xA1D4,0x0081,0x0081,0xA1D9,0x0082,0x0081, 0x0082,0x0081,0xA850,0x009E,0x008E,0x0089,0x0085,0x0081,0x0081,0xA1D5,0x0081,0x0081,0xA1D6,0x0082,0x0082,0x0082, 0xA1D7,0x0089,0x0082,0x0084,0x0082,0xA1CB,0x0083,0xA1C3,0xA1DF,0x0085,0x0081,0x0081,0xA1E0,0x0082,0x0081,0xA1D3, 0x009B,0x008F,0x0088,0x0084,0x0082,0xA1D2,0x0083,0xA1C8,0xA1C9,0x0085,0x0083,0xA1C5,0xA1C4,0x0082,0xA1CE,0x0085, 0x0081,0x0082,0xA84F,0x0085,0x0083,0xA1CF,0xA84E,0x0083,0xA1DE,0xA1D8,0x0089,0x0085,0x0082,0x0081,0xA1CC,0x0082, 0x0082,0xA84D,0x0085,0x0082,0x0082,0xA1C6,0x0081,0x0082,0xA1C7,0x0089,0x0081,0x0081,0x0081,0x0082,0x0081,0x0081, 0xA1CA,0x0082,0x0082,0x008C,0x0085,0x0082,0x0082,0xA84C,0x0085,0x0083,0xA84B,0xA84A,0x0081,0xA849,0x0088,0x0084, 0x0082,0xA1FD,0x0083,0xA1FA,0xA1FC,0x0081,0x0081,0xA1FB,0x00C3,0x00B6,0x009A,0x0082,0x008D,0x0085,0x0082,0x0082, 0xA2AA,0x0085,0x0083,0xA2A9,0xA2A8,0x0083,0xA2A7,0xA2A6,0x0089,0x0085,0x0083,0xA2A5,0xA2A4,0x0083,0xA2A3,0xA2A2, 0x0081,0x0081,0xA2A1,0x0081,0x0090,0x0088,0x0084,0x0082,0xA2FC,0x0083,0xA2FB,0xA2FA,0x0085,0x0083,0xA2F9,0xA2F8, 0x0083,0xA2F7,0xA2F6,0x0089,0x0085,0x0083,0xA2F5,0xA2F4,0x0083,0xA2F3,0xA2F2,0x0081,0x0081,0xA2F1,0x0082,0x0087, 0x0082,0x0081,0x0082,0x0082,0xA959,0x0081,0x0082,0x0082,0x0081,0xA1ED,0x0090,0x0081,0x0081,0x0089,0x0085,0x0082, 0x0082,0xA848,0x0082,0x0082,0xA847,0x0081,0x0081,0x0082,0xA1E6,0x0082,0x0081,0x0081,0x0081,0x0081,0x0081,0x0080, 0x00B9,0x0081,0x0081,0x0081,0x0081,0x0081,0x0082,0x0092,0x0082,0x0086,0x0081,0x0082,0x0081,0xA1F9,0x0088,0x0084, 0x0081,0xA846,0x0083,0xA1E5,0xA1E4,0x0081,0x0082,0xA1EB,0x008B,0x0086,0x0082,0x0082,0x0082,0xA1AD,0x0081,0x0081, 0x0081,0xA845,0x008D,0x0086,0x0081,0x0083,0xA1B1,0xA1B0,0x0085,0x0083,0xA1AF,0xA1AE,0x0082,0xA1AC,0x0088,0x0085, 0x0083,0xA844,0xA1AA,0x0081,0xA843,0x0081,0x0082,0xA95C,0x0082,0x0082,0x0193,0x0156,0x00E1,0x0082,0x00A0,0x0082, 0x008F,0x0087,0x0084,0x0082,0xA7D7,0x0082,0xA7F1,0x0085,0x0083,0xA7F0,0xA7EF,0x0083,0xA7EE,0xA7ED,0x0089,0x0085, 0x0083,0xA7EC,0xA7EB,0x0083,0xA7EA,0xA7E9,0x0085,0x0083,0xA7E8,0xA7E7,0x0083,0xA7E6,0xA7E5,0x00A1,0x0091,0x0089, 0x0085,0x0083,0xA7E4,0xA7E3,0x0083,0xA7E2,0xA7E1,0x0085,0x0083,0xA7E0,0xA7DF,0x0083,0xA7DE,0xA7DD,0x0089,0x0085, 0x0083,0xA7DC,0xA7DB,0x0083,0xA7DA,0xA7D9,0x0085,0x0083,0xA7D8,0xA7D6,0x0083,0xA7D5,0xA7D4,0x0091,0x0089,0x0085, 0x0083,0xA7D3,0xA7D2,0x0083,0xA7D1,0xA7C1,0x0085,0x0083,0xA7C0,0xA7BF,0x0083,0xA7BE,0xA7BD,0x0089,0x0085,0x0083, 0xA7BC,0xA7BB,0x0083,0xA7BA,0xA7B9,0x0085,0x0083,0xA7B8,0xA7B7,0x0083,0xA7B6,0xA7B5,0x00B1,0x00AA,0x00A1,0x0091, 0x0089,0x0085,0x0083,0xA7B4,0xA7B3,0x0083,0xA7B2,0xA7B1,0x0085,0x0083,0xA7B0,0xA7AF,0x0083,0xA7AE,0xA7AD,0x0089, 0x0085,0x0083,0xA7AC,0xA7AB,0x0083,0xA7AA,0xA7A9,0x0085,0x0083,0xA7A8,0xA7A6,0x0083,0xA7A5,0xA7A4,0x0081,0x0081, 0x0085,0x0083,0xA7A3,0xA7A2,0x0081,0xA7A1,0x0081,0x0081,0x0081,0x0081,0x0082,0xA7A7,0x0092,0x0082,0x0082,0x0088, 0x0084,0x0082,0xA6D8,0x0083,0xA6D7,0xA6D6,0x0085,0x0083,0xA6D5,0xA6D4,0x0083,0xA6D3,0xA6D2,0x00A0,0x0090,0x0088, 0x0084,0x0082,0xA6D1,0x0083,0xA6D0,0xA6CF,0x0085,0x0083,0xA6CE,0xA6CD,0x0083,0xA6CC,0xA6CB,0x0089,0x0085,0x0083, 0xA6CA,0xA6C9,0x0083,0xA6C8,0xA6C7,0x0085,0x0083,0xA6C6,0xA6C5,0x0083,0xA6C4,0xA6C3,0x0087,0x0081,0x0081,0x0083, 0xA6C2,0xA6C1,0x0088,0x0084,0x0082,0xA6B8,0x0083,0xA6B7,0xA6B6,0x0085,0x0083,0xA6B5,0xA6B4,0x0083,0xA6B3,0xA6B2, 0x00A9,0x0081,0x0081,0x00A0,0x0090,0x0088,0x0084,0x0082,0xA6B1,0x0083,0xA6B0,0xA6AF,0x0085,0x0083,0xA6AE,0xA6AD, 0x0083,0xA6AC,0xA6AB,0x0089,0x0085,0x0083,0xA6AA,0xA6A9,0x0083,0xA6A8,0xA6A7,0x0085,0x0083,0xA6A6,0xA6A5,0x0083, 0xA6A4,0xA6A3,0x0081,0x0081,0x0081,0x0083,0xA6A2,0xA6A1,0x0082,0x0081,0x0087,0x0082,0x0081,0x0081,0x0082,0xA842, 0x0086,0x0082,0x0082,0x0082,0xA841,0x0081,0x0085,0x0083,0xA840,0xA1A5,0x0082,0xA1A6,0x00AD,0x008F,0x0082,0x0081, 0x0087,0x0081,0x0081,0x0082,0x0081,0xA8C0,0x0081,0x0081,0x0082,0x0081,0xA8BB,0x0082,0x0081,0x0092,0x0086,0x0082, 0x0082,0x0082,0xA8B8,0x0087,0x0084,0x0082,0xA8B7,0x0082,0xA8B6,0x0084,0x0082,0xA8B5,0x0082,0xA8B3,0x0081,0x0087, 0x0084,0x0082,0xA8AF,0x0082,0xA8AB,0x0081,0x0082,0xA8A3,0x009E,0x0089,0x0082,0x0082,0x0082,0x0081,0x0081,0x0081, 0xA8B1,0x008F,0x0082,0x0086,0x0082,0x0082,0x0081,0xA8AD,0x0085,0x0082,0x0082,0xA8BE,0x0082,0x0082,0xA8BD,0x0082, 0x0082,0x0081,0x0081,0x0081,0xA8A9,0x00B1,0x008D,0x0087,0x0082,0x0081,0x0081,0x0081,0xA8A7,0x0081,0x0081,0x0081, 0x0081,0xA8A5,0x0093,0x0089,0x0085,0x0082,0x0081,0xA8A1,0x0082,0x0082,0xA8B9,0x0087,0x0084,0x0082,0xA8B2,0x0081, 0xA8B4,0x0081,0x0081,0xA1C2,0x008B,0x0086,0x0081,0x0083,0xA8AE,0xA8B0,0x0082,0x0083,0xA8AA,0xA8AC,0x0081,0x0084, 0x0082,0xA8BA,0x0083,0xA8A6,0xA8A8,0x008D,0x0081,0x0087,0x0081,0x0082,0x0083,0xA8A2,0xA8A4,0x0082,0x0081,0x0081, 0xA1C1,0x0087,0x0082,0x0082,0x0081,0x0081,0xA1A4,0x0087,0x0081,0x0082,0x0083,0xA1C0,0xA1E3,0x0085,0x0082,0x0082, 0xA1A7,0x0084,0x0081,0xA1EC,0x0082,0xA1E8, }; // ucs2_to_cp936_elements const TConvFlatTree ucs2_to_cp936 = { 0x00A4, // min key 0xFFE5, // max key 0x0081, // links space start 0x7FFF, // links space end ucs2_to_cp936_numelems, // number of elements (treeval_t *)&ucs2_to_cp936_elements // elements }; // ucs2_to_cp936 const size_t cp936_to_ucs2_numelems = 44536; const treeval_t cp936_to_ucs2_elements[cp936_to_ucs2_numelems] = { 0xEFFE,0xADE7,0xEFFE,0x5B47,0xCB80,0xB38E,0xA796,0xA310,0xA188,0xA0C4,0xA026,0xA000,0xA000,0xA01E,0xA00E,0xA006, 0xA002,0xFA29,0xA002,0xFA28,0xFA27,0xA004,0xA002,0xFA24,0xFA23,0xA002,0xFA21,0xFA20,0xA008,0xA004,0xA002,0xFA1F, 0xFA18,0xA002,0xFA14,0xFA13,0xA004,0xA002,0xFA11,0xFA0F,0xA002,0xFA0E,0xFA0D,0xA000,0xA000,0xA000,0xA000,0xFA0C, 0xA01F,0xA001,0xA001,0xA00D,0xA005,0xA001,0xA002,0xF9F1,0xF9E7,0xA004,0xA002,0xF995,0xF979,0xA002,0xF92C,0x9FA5, 0xA008,0xA004,0xA002,0x9FA4,0x9FA3,0xA002,0x9FA2,0x9FA1,0xA004,0xA002,0x9F9E,0x9F9D,0xA002,0x9F9C,0x9F98,0xA03F, 0xA020,0xA010,0xA008,0xA004,0xA002,0x9F97,0x9F96,0xA002,0x9F95,0x9F94,0xA004,0xA002,0x9F93,0x9F92,0xA002,0x9F91, 0x9F90,0xA008,0xA004,0xA002,0x9F8F,0x9F8E,0xA002,0x9F8D,0x9F82,0xA004,0xA002,0x9F81,0x9F7E,0xA002,0x9F7D,0x9F7C, 0xA00F,0xA007,0xA004,0xA002,0x9F7B,0x9F7A,0xA000,0x9F79,0xA004,0xA002,0x9F78,0x9F77,0xA002,0x9F76,0x9F75,0xA008, 0xA004,0xA002,0x9F74,0x9F73,0xA002,0x9F72,0x9F71,0xA004,0xA002,0x9F70,0x9F6F,0xA002,0x9F6E,0x9F6D,0xA020,0xA010, 0xA008,0xA004,0xA002,0x9F6C,0x9F6B,0xA002,0x9F6A,0x9F69,0xA004,0xA002,0x9F68,0x9F67,0xA002,0x9F66,0x9F65,0xA008, 0xA004,0xA002,0x9F64,0x9F63,0xA002,0x9F62,0x9F61,0xA004,0xA002,0x9F60,0x9F5F,0xA002,0x9F5E,0x9F5D,0xA010,0xA008, 0xA004,0xA002,0x9F5C,0x9F5B,0xA002,0x9F5A,0x9F59,0xA004,0xA002,0x9F58,0x9F57,0xA002,0x9F56,0x9F55,0xA008,0xA004, 0xA002,0x9F54,0x9F53,0xA002,0x9F52,0x9F4F,0xA004,0xA002,0x9F4E,0x9F4D,0xA002,0x9F4C,0x9F4B,0xA02A,0xA000,0xA000, 0xA01E,0xA00E,0xA006,0xA002,0x9F4A,0xA002,0x9F49,0x9F48,0xA004,0xA002,0x9F47,0x9F46,0xA002,0x9F45,0x9F43,0xA008, 0xA004,0xA002,0x9F42,0x9F41,0xA002,0x9F40,0x9F3F,0xA004,0xA002,0x9F3C,0x9F3A,0xA002,0x9F38,0x9F36,0xA000,0xA000, 0xA004,0xA002,0x9F35,0x9F34,0xA002,0x9F33,0x9F32,0xA01B,0xA001,0xA001,0xA009,0xA001,0xA004,0xA002,0x9F31,0x9F30, 0xA002,0x9F2E,0x9F2D,0xA008,0xA004,0xA002,0x9F2B,0x9F2A,0xA002,0x9F29,0x9F28,0xA004,0xA002,0x9F27,0x9F26,0xA002, 0x9F25,0x9F24,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x9F23,0x9F21,0xA002,0x9F1F,0x9F1E,0xA004,0xA002,0x9F1D, 0x9F1C,0xA002,0x9F1B,0x9F1A,0xA008,0xA004,0xA002,0x9F18,0x9F16,0xA002,0x9F15,0x9F14,0xA004,0xA002,0x9F12,0x9F11, 0xA002,0x9F0F,0x9F0C,0xA00F,0xA008,0xA004,0xA002,0x9F0A,0x9F09,0xA002,0x9F08,0x9F07,0xA003,0xA000,0x9F06,0xA002, 0x9F05,0x9F04,0xA008,0xA004,0xA002,0x9F03,0x9F02,0xA002,0x9F01,0x9F00,0xA004,0xA002,0x9EFF,0x9EFD,0xA002,0x9EFA, 0x9EF8,0xA020,0xA010,0xA008,0xA004,0xA002,0x9EF7,0x9EF6,0xA002,0x9EF5,0x9EF4,0xA004,0xA002,0x9EF3,0x9EF2,0xA002, 0x9EF1,0x9EF0,0xA008,0xA004,0xA002,0x9EEE,0x9EED,0xA002,0x9EEC,0x9EEB,0xA004,0xA002,0x9EE8,0x9EE6,0xA002,0x9EE4, 0x9EE3,0xA010,0xA008,0xA004,0xA002,0x9EE1,0x9EDE,0xA002,0x9EDA,0x9ED9,0xA004,0xA002,0x9ED7,0x9ED6,0xA002,0x9ED5, 0x9ED3,0xA008,0xA004,0xA002,0x9ED2,0x9ED0,0xA002,0x9ECC,0x9ECB,0xA004,0xA002,0x9ECA,0x9EC8,0xA002,0x9EC7,0x9EC6, 0xA0C5,0xA02E,0xA000,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x9EC5,0xA002,0x9EC3,0x9EC2,0xA004,0xA002,0x9EC1,0x9EC0, 0xA002,0x9EBF,0x9EBC,0xA008,0xA004,0xA002,0x9EBA,0x9EB9,0xA002,0x9EB7,0x9EB6,0xA004,0xA002,0x9EB5,0x9EB3,0xA002, 0x9EB2,0x9EB1,0xA000,0xA008,0xA004,0xA002,0x9EB0,0x9EAF,0xA002,0x9EAE,0x9EAD,0xA000,0xA002,0x9EAC,0x9EAB,0xA018, 0xA001,0xA001,0xA006,0xA001,0xA001,0xA002,0x9EAA,0x9EA9,0xA008,0xA004,0xA002,0x9EA8,0x9EA7,0xA002,0x9EA5,0x9EA4, 0xA004,0xA002,0x9EA3,0x9EA2,0xA002,0x9EA1,0x9EA0,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x9E9E,0x9E9C,0xA002, 0x9E9B,0x9E9A,0xA004,0xA002,0x9E99,0x9E98,0xA002,0x9E97,0x9E96,0xA008,0xA004,0xA002,0x9E95,0x9E94,0xA002,0x9E91, 0x9E90,0xA004,0xA002,0x9E8F,0x9E8E,0xA002,0x9E8D,0x9E8C,0xA00F,0xA008,0xA004,0xA002,0x9E8A,0x9E89,0xA002,0x9E86, 0x9E85,0xA004,0xA002,0x9E84,0x9E83,0xA000,0x9E81,0xA008,0xA004,0xA002,0x9E80,0x9E7D,0xA002,0x9E7C,0x9E7B,0xA004, 0xA002,0x9E7A,0x9E79,0xA002,0x9E78,0x9E77,0xA020,0xA010,0xA008,0xA004,0xA002,0x9E76,0x9E75,0xA002,0x9E74,0x9E72, 0xA004,0xA002,0x9E6F,0x9E6E,0xA002,0x9E65,0x9E62,0xA008,0xA004,0xA002,0x9E61,0x9E60,0xA002,0x9E5F,0x9E5D,0xA004, 0xA002,0x9E59,0x9E56,0xA002,0x9E54,0x9E53,0xA010,0xA008,0xA004,0xA002,0x9E52,0x9E50,0xA002,0x9E4D,0x9E40,0xA004, 0xA002,0x9E3C,0x9E3B,0xA002,0x9E34,0x9E30,0xA008,0xA004,0xA002,0x9E2E,0x9E27,0xA002,0x9E24,0x9E1E,0xA004,0xA002, 0x9E1D,0x9E1C,0xA002,0x9E1B,0x9E1A,0xA031,0xA000,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x9E19,0xA002,0x9E18,0x9E17, 0xA004,0xA002,0x9E16,0x9E15,0xA002,0x9E14,0x9E13,0xA008,0xA004,0xA002,0x9E12,0x9E11,0xA002,0x9E10,0x9E0F,0xA004, 0xA002,0x9E0E,0x9E0D,0xA002,0x9E0C,0x9E0B,0xA000,0xA008,0xA004,0xA002,0x9E0A,0x9E09,0xA002,0x9E08,0x9E07,0xA004, 0xA002,0x9E06,0x9E05,0xA002,0x9E04,0x9E03,0xA013,0xA001,0xA001,0xA001,0xA008,0xA004,0xA002,0x9E02,0x9E01,0xA002, 0x9E00,0x9DFF,0xA004,0xA002,0x9DFE,0x9DFD,0xA002,0x9DFC,0x9DFB,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x9DFA, 0x9DF9,0xA002,0x9DF8,0x9DF7,0xA004,0xA002,0x9DF6,0x9DF5,0xA002,0x9DF4,0x9DF3,0xA008,0xA004,0xA002,0x9DF2,0x9DF1, 0xA002,0x9DF0,0x9DEF,0xA004,0xA002,0x9DEE,0x9DED,0xA002,0x9DEC,0x9DEB,0xA010,0xA008,0xA004,0xA002,0x9DEA,0x9DE9, 0xA002,0x9DE8,0x9DE7,0xA004,0xA002,0x9DE6,0x9DE5,0xA002,0x9DE4,0x9DE3,0xA007,0xA003,0xA000,0x9DE2,0xA002,0x9DE1, 0x9DE0,0xA004,0xA002,0x9DDF,0x9DDE,0xA002,0x9DDD,0x9DDC,0xA020,0xA010,0xA008,0xA004,0xA002,0x9DDB,0x9DDA,0xA002, 0x9DD9,0x9DD8,0xA004,0xA002,0x9DD7,0x9DD6,0xA002,0x9DD5,0x9DD4,0xA008,0xA004,0xA002,0x9DD3,0x9DD2,0xA002,0x9DD1, 0x9DD0,0xA004,0xA002,0x9DCF,0x9DCE,0xA002,0x9DCD,0x9DCC,0xA010,0xA008,0xA004,0xA002,0x9DCB,0x9DCA,0xA002,0x9DC9, 0x9DC8,0xA004,0xA002,0x9DC7,0x9DC6,0xA002,0x9DC5,0x9DC4,0xA008,0xA004,0xA002,0x9DC3,0x9DC2,0xA002,0x9DC1,0x9DC0, 0xA004,0xA002,0x9DBF,0x9DBE,0xA002,0x9DBD,0x9DBC,0xA18A,0xA0C4,0xA036,0xA000,0xA000,0xA01E,0xA00E,0xA006,0xA002, 0x9DBB,0xA002,0x9DBA,0x9DB9,0xA004,0xA002,0x9DB8,0x9DB7,0xA002,0x9DB6,0x9DB5,0xA008,0xA004,0xA002,0x9DB4,0x9DB3, 0xA002,0x9DB2,0x9DB1,0xA004,0xA002,0x9DB0,0x9DAF,0xA002,0x9DAE,0x9DAD,0xA010,0xA008,0xA004,0xA002,0x9DAC,0x9DAB, 0xA002,0x9DAA,0x9DA9,0xA004,0xA002,0x9DA8,0x9DA7,0xA002,0x9DA6,0x9DA5,0xA000,0xA000,0xA002,0x9DA4,0x9DA3,0xA00F, 0xA001,0xA001,0xA001,0xA004,0xA001,0xA001,0x9DA2,0xA004,0xA002,0x9DA1,0x9DA0,0xA002,0x9D9F,0x9D9E,0xA03F,0xA020, 0xA010,0xA008,0xA004,0xA002,0x9D9D,0x9D9C,0xA002,0x9D9B,0x9D9A,0xA004,0xA002,0x9D99,0x9D98,0xA002,0x9D97,0x9D96, 0xA008,0xA004,0xA002,0x9D95,0x9D94,0xA002,0x9D93,0x9D92,0xA004,0xA002,0x9D91,0x9D90,0xA002,0x9D8F,0x9D8E,0xA010, 0xA008,0xA004,0xA002,0x9D8D,0x9D8C,0xA002,0x9D8B,0x9D8A,0xA004,0xA002,0x9D89,0x9D88,0xA002,0x9D87,0x9D86,0xA008, 0xA004,0xA002,0x9D85,0x9D84,0xA002,0x9D83,0x9D82,0xA003,0xA001,0x9D81,0xA002,0x9D80,0x9D7F,0xA020,0xA010,0xA008, 0xA004,0xA002,0x9D7E,0x9D7D,0xA002,0x9D7C,0x9D7B,0xA004,0xA002,0x9D7A,0x9D79,0xA002,0x9D78,0x9D77,0xA008,0xA004, 0xA002,0x9D76,0x9D75,0xA002,0x9D74,0x9D73,0xA004,0xA002,0x9D72,0x9D71,0xA002,0x9D70,0x9D6F,0xA010,0xA008,0xA004, 0xA002,0x9D6E,0x9D6D,0xA002,0x9D6C,0x9D6B,0xA004,0xA002,0x9D6A,0x9D69,0xA002,0x9D68,0x9D67,0xA008,0xA004,0xA002, 0x9D66,0x9D65,0xA002,0x9D64,0x9D63,0xA004,0xA002,0x9D62,0x9D61,0xA002,0x9D60,0x9D5F,0xA03C,0xA000,0xA000,0xA01E, 0xA00E,0xA006,0xA002,0x9D5E,0xA002,0x9D5D,0x9D5C,0xA004,0xA002,0x9D5B,0x9D5A,0xA002,0x9D59,0x9D58,0xA008,0xA004, 0xA002,0x9D57,0x9D56,0xA002,0x9D55,0x9D54,0xA004,0xA002,0x9D53,0x9D52,0xA002,0x9D51,0x9D50,0xA010,0xA008,0xA004, 0xA002,0x9D4F,0x9D4E,0xA002,0x9D4D,0x9D4C,0xA004,0xA002,0x9D4B,0x9D4A,0xA002,0x9D49,0x9D48,0xA008,0xA004,0xA002, 0x9D47,0x9D46,0xA002,0x9D45,0x9D44,0xA000,0xA000,0x9D43,0xA00B,0xA001,0xA001,0xA001,0xA001,0xA003,0xA001,0x9D42, 0xA002,0x9D41,0x9D40,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x9D3F,0x9D3E,0xA002,0x9D3D,0x9D3C,0xA004,0xA002, 0x9D3B,0x9D3A,0xA002,0x9D39,0x9D38,0xA008,0xA004,0xA002,0x9D37,0x9D36,0xA002,0x9D35,0x9D34,0xA004,0xA002,0x9D33, 0x9D32,0xA002,0x9D31,0x9D30,0xA010,0xA008,0xA004,0xA002,0x9D2F,0x9D2E,0xA002,0x9D2D,0x9D2C,0xA004,0xA002,0x9D2B, 0x9D2A,0xA002,0x9D29,0x9D28,0xA008,0xA004,0xA002,0x9D27,0x9D26,0xA002,0x9D25,0x9D24,0xA004,0xA002,0x9D23,0x9D22, 0xA001,0x9D21,0xA020,0xA010,0xA008,0xA004,0xA002,0x9D20,0x9D1F,0xA002,0x9D1E,0x9D1D,0xA004,0xA002,0x9D1C,0x9D1B, 0xA002,0x9D1A,0x9D19,0xA008,0xA004,0xA002,0x9D18,0x9D17,0xA002,0x9D16,0x9D15,0xA004,0xA002,0x9D14,0x9D13,0xA002, 0x9D12,0x9D11,0xA010,0xA008,0xA004,0xA002,0x9D10,0x9D0F,0xA002,0x9D0E,0x9D0D,0xA004,0xA002,0x9D0C,0x9D0B,0xA002, 0x9D0A,0x9D09,0xA008,0xA004,0xA002,0x9D08,0x9D07,0xA002,0x9D06,0x9D05,0xA004,0xA002,0x9D04,0x9D03,0xA002,0x9D02, 0x9D01,0xA17C,0xA07F,0xA03E,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x9D00,0xA002,0x9CFF,0x9CFE,0xA004,0xA002,0x9CFD, 0x9CFC,0xA002,0x9CFB,0x9CFA,0xA008,0xA004,0xA002,0x9CF9,0x9CF8,0xA002,0x9CF7,0x9CF6,0xA004,0xA002,0x9CF5,0x9CF4, 0xA002,0x9CF3,0x9CF2,0xA010,0xA008,0xA004,0xA002,0x9CF1,0x9CF0,0xA002,0x9CEF,0x9CEE,0xA004,0xA002,0x9CED,0x9CEC, 0xA002,0x9CEB,0x9CEA,0xA008,0xA004,0xA002,0x9CE9,0x9CE8,0xA002,0x9CE7,0x9CE6,0xA004,0xA002,0x9CE5,0x9CE4,0xA000, 0x9CE3,0xA001,0xA020,0xA010,0xA008,0xA004,0xA002,0x9F44,0x9F3E,0xA002,0x9F3D,0x9F37,0xA004,0xA002,0x9F39,0x9F2F, 0xA002,0x9F2C,0x9F22,0xA008,0xA004,0xA002,0x9EEF,0x9EEA,0xA002,0x9EE5,0x9EE7,0xA004,0xA002,0x9EE9,0x9EE2,0xA002, 0x9EDF,0x9EE0,0xA010,0xA008,0xA004,0xA002,0x9EDD,0x9EDC,0xA002,0x9EDB,0x9E9F,0xA004,0xA002,0x9E9D,0x93D6,0xA002, 0x9E92,0x9E8B,0xA008,0xA004,0xA002,0x9E88,0x9E87,0xA002,0x9E82,0x7E3B,0xA004,0xA002,0x9EBE,0x9EBD,0xA002,0x9B23, 0x9B1F,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9B13,0xA002,0x9B0F,0x9B08,0xA004,0xA002,0x9AF9,0x9AED,0xA002, 0x9AFB,0x9AEB,0xA008,0xA004,0xA002,0x9AEF,0x9AE6,0xA002,0x9AE1,0x9ADF,0xA004,0xA002,0x9954,0x9955,0xA002,0x992E, 0x990D,0xA010,0xA008,0xA004,0xA002,0x98E8,0x9B51,0xA002,0x9B4D,0x9B48,0xA004,0xA002,0x9B49,0x9B47,0xA002,0x9B43, 0x9B45,0xA008,0xA004,0xA002,0x9AD1,0x9ACC,0xA002,0x9ACB,0x9AC2,0xA004,0xA002,0x9AC5,0x9AC0,0xA002,0x9AC1,0x9ABC, 0xA020,0xA010,0xA008,0xA004,0xA002,0x9ABA,0x9AB6,0xA002,0x9E58,0x9AB7,0xA004,0xA002,0x9AB0,0x9AB1,0xA002,0x97B4, 0x97B2,0xA008,0xA004,0xA002,0x97A3,0x97AB,0xA002,0x97AF,0x9794,0xA004,0xA002,0x9792,0x9791,0xA002,0x9785,0x977C, 0xA010,0xA008,0xA004,0xA002,0x9CE2,0x9CDF,0xA002,0x9CDD,0x9CDC,0xA004,0xA002,0x9CD9,0x9CD8,0xA002,0x9CD7,0x9CD5, 0xA008,0xA004,0xA002,0x9CD4,0x9CD3,0xA002,0x9CD0,0x9CCF,0xA004,0xA002,0x9CCE,0x9CCD,0xA002,0x9CCC,0x9CE1,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x9CE0,0x9CDB,0xA002,0x9CDA,0x9CD2,0xA004,0xA002,0x9CD1,0x9CC9,0xA002,0x9CC8, 0x9CC2,0xA008,0xA004,0xA002,0x9CC1,0x9CC0,0xA002,0x9CBF,0x9CBE,0xA004,0xA002,0x9CB9,0x9CAF,0xA002,0x9CAC,0x9CAA, 0xA010,0xA008,0xA004,0xA002,0x9C9D,0x9C99,0xA002,0x9C98,0x9C97,0xA004,0xA002,0x9C96,0x9C93,0xA002,0x9C8F,0x9C8C, 0xA008,0xA004,0xA002,0x9C8A,0x9C89,0xA002,0x9C84,0x9C83,0xA004,0xA002,0x9C80,0x9C7E,0xA002,0x9C7D,0x9C7B,0xA01F, 0xA00F,0xA007,0xA003,0xA001,0x9C7A,0xA002,0x9C79,0x9C78,0xA004,0xA002,0x9C77,0x9C76,0xA002,0x9C75,0x9C74,0xA008, 0xA004,0xA002,0x9C73,0x9C72,0xA002,0x9C71,0x9C70,0xA004,0xA002,0x9C6F,0x9C6E,0xA002,0x9C6D,0x9C6C,0xA010,0xA008, 0xA004,0xA002,0x9C6B,0x9C6A,0xA002,0x9C69,0x9C68,0xA004,0xA002,0x9C67,0x9C66,0xA002,0x9C65,0x9C64,0xA008,0xA004, 0xA002,0x9C63,0x9C62,0xA002,0x9C61,0x9C60,0xA004,0xA002,0x9C5F,0x9C5E,0xA002,0x9C5D,0x9C5C,0xA083,0xA045,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x9C5B,0xA002,0x9C5A,0x9C59,0xA004,0xA002,0x9C58,0x9C57,0xA002,0x9C56,0x9C55,0xA008, 0xA004,0xA002,0x9C54,0x9C53,0xA002,0x9C52,0x9C51,0xA004,0xA002,0x9C50,0x9C4F,0xA002,0x9C4E,0x9C4D,0xA010,0xA008, 0xA004,0xA002,0x9C4C,0x9C4B,0xA002,0x9C4A,0x9C49,0xA004,0xA002,0x9C48,0x9C47,0xA002,0x9C46,0x9C45,0xA008,0xA004, 0xA002,0x9C44,0x9C43,0xA002,0x9C42,0x9C41,0xA004,0xA002,0x9C40,0x9C3F,0xA002,0x9C3E,0x9C3D,0xA000,0xA000,0xA000, 0xA000,0xA000,0x9C3C,0xA001,0xA01D,0xA00D,0xA005,0xA001,0xA002,0x9CCB,0x9CCA,0xA004,0xA002,0x9CC7,0x9CC6,0xA002, 0x9CC5,0x9CC4,0xA008,0xA004,0xA002,0x9CBD,0x9CBC,0xA002,0x9CBB,0x9CBA,0xA004,0xA002,0x9CB7,0x9CB6,0xA002,0x9CB5, 0x9CB4,0xA010,0xA008,0xA004,0xA002,0x9CB3,0x9CB2,0xA002,0x9CB1,0x9CB0,0xA004,0xA002,0x9CAE,0x9CAD,0xA002,0x9CAB, 0x9CA9,0xA008,0xA004,0xA002,0x9CA8,0x9CA7,0xA002,0x9CA6,0x9CA5,0xA004,0xA002,0x9CA3,0x9CA2,0xA002,0x9CA1,0x9CA0, 0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9C9F,0xA002,0x9C9E,0x9C9B,0xA004,0xA002,0x9C9A,0x9C95,0xA002,0x9C94, 0x9C92,0xA008,0xA004,0xA002,0x9C91,0x9C90,0xA002,0x9C8E,0x9C8B,0xA004,0xA002,0x7A23,0x9C88,0xA002,0x9C87,0x9C86, 0xA010,0xA008,0xA004,0xA002,0x9C85,0x9C82,0xA002,0x9C7F,0x946B,0xA004,0xA002,0x943E,0x938F,0xA002,0x93CA,0x936A, 0xA008,0xA004,0xA002,0x933E,0x92C8,0xA002,0x92AE,0x928E,0xA004,0xA002,0x96E0,0x77BF,0xA002,0x96D2,0x96CE,0xA020, 0xA010,0xA008,0xA004,0xA002,0x96BD,0x96BC,0xA002,0x96B9,0x9F0D,0xA004,0xA002,0x9F0B,0x9EFE,0xA002,0x9F8C,0x9F8A, 0xA008,0xA004,0xA002,0x9F89,0x9F88,0xA002,0x9F87,0x9F86,0xA004,0xA002,0x9F85,0x9F83,0xA002,0x9F80,0x973E,0xA010, 0xA008,0xA004,0xA002,0x9730,0x972D,0xA002,0x972A,0x970E,0xA004,0xA002,0x970F,0x9708,0xA002,0x9701,0x9706,0xA008, 0xA004,0xA002,0x96EF,0x96F3,0xA002,0x96E9,0x9753,0xA004,0xA002,0x8B26,0x8A3E,0xA002,0x89EF,0x89EB,0xA040,0xA020, 0xA010,0xA008,0xA004,0xA002,0x89E5,0x9C3B,0xA002,0x9C3A,0x9C39,0xA004,0xA002,0x9C38,0x9C37,0xA002,0x9C36,0x9C35, 0xA008,0xA004,0xA002,0x9C34,0x9C33,0xA002,0x9C32,0x9C31,0xA004,0xA002,0x9C30,0x9C2F,0xA002,0x9C2E,0x9C2D,0xA010, 0xA008,0xA004,0xA002,0x9C2C,0x9C2B,0xA002,0x9C2A,0x9C29,0xA004,0xA002,0x9C28,0x9C27,0xA002,0x9C26,0x9C25,0xA008, 0xA004,0xA002,0x9C24,0x9C23,0xA002,0x9C22,0x9C21,0xA004,0xA002,0x9C20,0x9C1F,0xA002,0x9C1E,0x9C1D,0xA01F,0xA00F, 0xA007,0xA004,0xA002,0x9C1C,0x9C1B,0xA001,0x9C1A,0xA004,0xA002,0x9C19,0x9C18,0xA002,0x9C17,0x9C16,0xA008,0xA004, 0xA002,0x9C15,0x9C14,0xA002,0x9C13,0x9C12,0xA004,0xA002,0x9C11,0x9C10,0xA002,0x9C0F,0x9C0E,0xA010,0xA008,0xA004, 0xA002,0x9C0D,0x9C0C,0xA002,0x9C0B,0x9C0A,0xA004,0xA002,0x9C09,0x9C08,0xA002,0x9C07,0x9C06,0xA008,0xA004,0xA002, 0x9C05,0x9C04,0xA002,0x9C03,0x9C02,0xA004,0xA002,0x9C01,0x9C00,0xA002,0x9BFF,0x9BFE,0xA5FC,0xA2FE,0xA17E,0xA081, 0xA048,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9BFD,0xA002,0x9BFC,0x9BFB,0xA004,0xA002,0x9BFA,0x9BF9,0xA002,0x9BF8, 0x9BF7,0xA008,0xA004,0xA002,0x9BF6,0x9BF5,0xA002,0x9BF4,0x9BF3,0xA004,0xA002,0x9BF2,0x9BF1,0xA002,0x9BF0,0x9BEF, 0xA010,0xA008,0xA004,0xA002,0x9BEE,0x9BED,0xA002,0x9BEC,0x9BEB,0xA004,0xA002,0x9BEA,0x9BE9,0xA002,0x9BE8,0x9BE7, 0xA008,0xA004,0xA002,0x9BE6,0x9BE5,0xA002,0x9BE4,0x9BE3,0xA004,0xA002,0x9BE2,0x9BE1,0xA002,0x9BE0,0x9BDF,0xA000, 0xA000,0xA000,0xA004,0xA002,0x9BDE,0x9BDD,0xA000,0x9BDC,0xA001,0xA018,0xA008,0xA001,0xA003,0xA001,0x89DC,0xA002, 0x89DA,0x89DE,0xA008,0xA004,0xA002,0x89D6,0x659B,0xA002,0x8C94,0x8C98,0xA004,0xA002,0x8C85,0x8C8A,0xA002,0x8C82, 0x8C78,0xA010,0xA008,0xA004,0xA002,0x8E9E,0x8E9C,0xA002,0x8E90,0x8E94,0xA004,0xA002,0x8E8F,0x8E85,0xA002,0x8E74, 0x8E6F,0xA008,0xA004,0xA002,0x8E7C,0x8E76,0xA002,0x8E70,0x8E4A,0xA004,0xA002,0x8E52,0x8E51,0xA002,0x8E42,0x8E41, 0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x8E49,0xA002,0x8E31,0x8E3D,0xA004,0xA002,0x8E35,0x8E39,0xA002,0x8E40, 0x8E3A,0xA008,0xA004,0xA002,0x8E2F,0x8E23,0xA002,0x8E2E,0x8E2C,0xA004,0xA002,0x8E1F,0x8E1D,0xA002,0x8E14,0x8DFD, 0xA010,0xA008,0xA004,0xA002,0x8E09,0x8DE4,0xA002,0x8DFB,0x8DF9,0xA004,0xA002,0x8DE3,0x8DF8,0xA002,0x8DF7,0x8DEC, 0xA008,0xA004,0xA002,0x8DC6,0x8DDB,0xA002,0x8DCF,0x8DCE,0xA004,0xA002,0x8DDE,0x8DDA,0xA002,0x8DD7,0x8DD6,0xA020, 0xA010,0xA008,0xA004,0xA002,0x8DC4,0x8DBA,0xA002,0x8DBC,0x8DBF,0xA004,0xA002,0x8DB5,0x8E69,0xA002,0x8E59,0x8E05, 0xA008,0xA004,0xA002,0x8DEB,0x8DB8,0xA002,0x9E7E,0x8C55,0xA004,0xA002,0x91BA,0x91B4,0xA002,0x91B5,0x91AF,0xA010, 0xA008,0xA004,0xA002,0x91AE,0x91AD,0xA002,0x91AA,0x91A3,0xA004,0xA002,0x91A2,0x9191,0xA002,0x918D,0x9190,0xA008, 0xA004,0xA002,0x9185,0x918C,0xA002,0x9179,0x9174,0xA004,0xA002,0x9172,0x917E,0xA002,0x917D,0x916F,0xA040,0xA020, 0xA010,0xA008,0xA004,0xA002,0x9169,0x9170,0xA002,0x9161,0x9162,0xA004,0xA002,0x9BDB,0x9BDA,0xA002,0x9BD9,0x9BD8, 0xA008,0xA004,0xA002,0x9BD7,0x9BD6,0xA002,0x9BD5,0x9BD4,0xA004,0xA002,0x9BD3,0x9BD2,0xA002,0x9BD1,0x9BD0,0xA010, 0xA008,0xA004,0xA002,0x9BCF,0x9BCE,0xA002,0x9BCD,0x9BCC,0xA004,0xA002,0x9BCB,0x9BCA,0xA002,0x9BC9,0x9BC8,0xA008, 0xA004,0xA002,0x9BC7,0x9BC6,0xA002,0x9BC5,0x9BC4,0xA004,0xA002,0x9BC3,0x9BC2,0xA002,0x9BC1,0x9BC0,0xA01F,0xA00F, 0xA008,0xA004,0xA002,0x9BBF,0x9BBE,0xA002,0x9BBD,0x9BBC,0xA003,0xA000,0x9BBB,0xA002,0x9BBA,0x9BB9,0xA008,0xA004, 0xA002,0x9BB8,0x9BB7,0xA002,0x9BB6,0x9BB5,0xA004,0xA002,0x9BB4,0x9BB3,0xA002,0x9BB2,0x9BB1,0xA010,0xA008,0xA004, 0xA002,0x9BB0,0x9BAF,0xA002,0x9BAE,0x9BAD,0xA004,0xA002,0x9BAC,0x9BAB,0xA002,0x9BAA,0x9BA9,0xA008,0xA004,0xA002, 0x9BA8,0x9BA7,0xA002,0x9BA6,0x9BA5,0xA004,0xA002,0x9BA4,0x9BA3,0xA002,0x9BA2,0x9BA1,0xA083,0xA04D,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x9BA0,0xA002,0x9B9F,0x9B9E,0xA004,0xA002,0x9B9D,0x9B9C,0xA002,0x9B9B,0x9B9A,0xA008,0xA004, 0xA002,0x9B99,0x9B98,0xA002,0x9B97,0x9B96,0xA004,0xA002,0x9B95,0x9B94,0xA002,0x9B93,0x9B92,0xA010,0xA008,0xA004, 0xA002,0x9B91,0x9B90,0xA002,0x9B8F,0x9B8E,0xA004,0xA002,0x9B8D,0x9B8C,0xA002,0x9B8B,0x9B8A,0xA008,0xA004,0xA002, 0x9B89,0x9B88,0xA002,0x9B87,0x9B86,0xA004,0xA002,0x9B85,0x9B84,0xA002,0x9B83,0x9B82,0xA000,0xA000,0xA008,0xA004, 0xA002,0x9B81,0x9B80,0xA002,0x9B7F,0x9B7E,0xA000,0xA002,0x9B7D,0x9B7C,0xA001,0xA015,0xA005,0xA001,0xA001,0xA001, 0x9164,0xA008,0xA004,0xA002,0x914F,0x914E,0xA002,0x9150,0x914A,0xA004,0xA002,0x8C49,0x8C47,0xA002,0x8D6D,0x8D67, 0xA010,0xA008,0xA004,0xA002,0x8DB1,0x8D91,0xA002,0x8D94,0x8D84,0xA004,0xA002,0x8D73,0x9EB4,0xA002,0x9EB8,0x7E9B, 0xA008,0xA004,0xA002,0x7E47,0x7DAE,0xA002,0x7DA6,0x7D77,0xA004,0xA002,0x7CF8,0x7FF3,0xA002,0x7FEE,0x7FE9,0xA07E, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7FE6,0xA002,0x7FE1,0x7FE5,0xA004,0xA002,0x7FD5,0x7FCE,0xA002,0x7FBF,0x66A8, 0xA008,0xA004,0xA002,0x826E,0x7CE8,0xA002,0x7CD7,0x7CC5,0xA004,0xA002,0x7CC8,0x7CCD,0xA002,0x7CCC,0x7CC7,0xA010, 0xA008,0xA004,0xA002,0x7CC1,0x7CBD,0xA002,0x7CBC,0x7CB2,0xA004,0xA002,0x7CA2,0x7C9E,0xA002,0x7C9C,0x7C9D,0xA008, 0xA004,0xA002,0x7C91,0x6549,0xA002,0x7C7C,0x7FB2,0xA004,0xA002,0x7FB0,0x7FAF,0xA002,0x7FA7,0x7F9F,0xA020,0xA010, 0xA008,0xA004,0xA002,0x7F9D,0x895E,0xA002,0x88DF,0x88D8,0xA004,0xA002,0x8888,0x8885,0xA002,0x887E,0x8268,0xA008, 0xA004,0xA002,0x825F,0x825A,0xA002,0x824F,0x824B,0xA004,0xA002,0x8249,0x8244,0xA002,0x823E,0x8234,0xA010,0xA008, 0xA004,0xA002,0x8233,0x823B,0xA002,0x8238,0x822B,0xA004,0xA002,0x8228,0x822F,0xA002,0x822D,0x8223,0xA008,0xA004, 0xA002,0x8222,0x8221,0xA002,0x8844,0x81EC,0xA004,0xA002,0x8204,0x8202,0xA002,0x8201,0x81FE,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x7C40,0x7C41,0xA002,0x7C38,0x7C26,0xA004,0xA002,0x7C2A,0x7C1F,0xA002,0x9B7B,0x9B7A,0xA008, 0xA004,0xA002,0x9B79,0x9B78,0xA002,0x9B77,0x9B76,0xA004,0xA002,0x9B75,0x9B74,0xA002,0x9B73,0x9B72,0xA010,0xA008, 0xA004,0xA002,0x9B71,0x9B70,0xA002,0x9B6F,0x9B6E,0xA004,0xA002,0x9B6D,0x9B6C,0xA002,0x9B6B,0x9B6A,0xA008,0xA004, 0xA002,0x9B69,0x9B68,0xA002,0x9B67,0x9B66,0xA004,0xA002,0x9B65,0x9B64,0xA002,0x9B63,0x9B62,0xA01F,0xA00F,0xA008, 0xA004,0xA002,0x9B61,0x9B60,0xA002,0x9B5F,0x9B5E,0xA004,0xA002,0x9B5D,0x9B5C,0xA000,0x9B5B,0xA008,0xA004,0xA002, 0x9B5A,0x9B59,0xA002,0x9B58,0x9B57,0xA004,0xA002,0x9B56,0x9B55,0xA002,0x9B53,0x9B52,0xA010,0xA008,0xA004,0xA002, 0x9B50,0x9B4E,0xA002,0x9B4C,0x9B4B,0xA004,0xA002,0x9B4A,0x9B46,0xA002,0x9B40,0x9B3F,0xA008,0xA004,0xA002,0x9B3E, 0x9B3D,0xA002,0x9B3A,0x9B39,0xA004,0xA002,0x9B38,0x9B37,0xA002,0x9B36,0x9B35,0xA17E,0xA081,0xA050,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x9B34,0xA002,0x9B33,0x9B31,0xA004,0xA002,0x9B30,0x9B2E,0xA002,0x9B2D,0x9B2C,0xA008,0xA004, 0xA002,0x9B2B,0x9B2A,0xA002,0x9B29,0x9B28,0xA004,0xA002,0x9B27,0x9B26,0xA002,0x9B25,0x9B24,0xA010,0xA008,0xA004, 0xA002,0x9B22,0x9B21,0xA002,0x9B20,0x9B1E,0xA004,0xA002,0x9B1D,0x9B1C,0xA002,0x9B1B,0x9B1A,0xA008,0xA004,0xA002, 0x9B19,0x9B18,0xA002,0x9B17,0x9B16,0xA004,0xA002,0x9B15,0x9B14,0xA002,0x9B12,0x9B11,0xA000,0xA000,0xA008,0xA004, 0xA002,0x9B10,0x9B0E,0xA002,0x9B0D,0x9B0C,0xA004,0xA002,0x9B0B,0x9B0A,0xA002,0x9B09,0x9B07,0xA001,0xA010,0xA001, 0xA007,0xA003,0xA001,0x7C0B,0xA002,0x7C16,0x7C0F,0xA004,0xA002,0x7BFC,0x7BFE,0xA002,0x7C0C,0x7BEA,0xA010,0xA008, 0xA004,0xA002,0x7BE6,0x7BE5,0xA002,0x7BDA,0x7BDD,0xA004,0xA002,0x7BCC,0x7BC1,0xA002,0x7BD1,0x7BB4,0xA008,0xA004, 0xA002,0x7BAB,0x7BA2,0xA002,0x7B9C,0x7BAA,0xA004,0xA002,0x7B85,0x7BA8,0xA002,0x7B9D,0x7BAC,0xA07E,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x7BB8,0xA002,0x7BA7,0x7BA6,0xA004,0xA002,0x7B90,0x7B71,0xA002,0x7B72,0x7B62,0xA008,0xA004, 0xA002,0x7B7B,0x7B6E,0xA002,0x7B60,0x7B5D,0xA004,0xA002,0x7B4C,0x7B75,0xA002,0x7B45,0x7B5A,0xA010,0xA008,0xA004, 0xA002,0x7B58,0x7B1E,0xA002,0x7B3E,0x7B33,0xA004,0xA002,0x7B24,0x7B25,0xA002,0x7B20,0x7B31,0xA008,0xA004,0xA002, 0x7B2E,0x7B19,0xA002,0x7B2A,0x7B38,0xA004,0xA002,0x7B47,0x7B0F,0xA002,0x7B2B,0x7B0A,0xA020,0xA010,0xA008,0xA004, 0xA002,0x7B15,0x7B04,0xA002,0x7B03,0x7B08,0xA004,0xA002,0x7AFD,0x7AFA,0xA002,0x8210,0x7F45,0xA008,0xA004,0xA002, 0x7F44,0x7F42,0xA002,0x7F36,0x883C,0xA004,0xA002,0x8839,0x8821,0xA002,0x881B,0x880A,0xA010,0xA008,0xA004,0xA002, 0x87FE,0x8813,0xA002,0x8816,0x87EE,0xA004,0xA002,0x87E0,0x87EA,0xA002,0x87DB,0x87CA,0xA008,0xA004,0xA002,0x87C0, 0x87D1,0xA002,0x87BD,0x87D3,0xA004,0xA002,0x87CB,0x87B3,0xA002,0x87B5,0x87AC,0xA040,0xA020,0xA010,0xA008,0xA004, 0xA002,0x87E5,0x87AB,0xA002,0x8783,0x8797,0xA004,0xA002,0x87AD,0x8785,0xA002,0x8788,0x87C6,0xA008,0xA004,0xA002, 0x9B06,0x9B05,0xA002,0x9B04,0x9B02,0xA004,0xA002,0x9B01,0x9B00,0xA002,0x9AFF,0x9AFE,0xA010,0xA008,0xA004,0xA002, 0x9AFD,0x9AFC,0xA002,0x9AFA,0x9AF8,0xA004,0xA002,0x9AF7,0x9AF6,0xA002,0x9AF5,0x9AF4,0xA008,0xA004,0xA002,0x9AF3, 0x9AF2,0xA002,0x9AF1,0x9AF0,0xA004,0xA002,0x9AEE,0x9AEC,0xA002,0x9AEA,0x9AE9,0xA01F,0xA010,0xA008,0xA004,0xA002, 0x9AE8,0x9AE7,0xA002,0x9AE5,0x9AE4,0xA004,0xA002,0x9AE3,0x9AE2,0xA002,0x9AE0,0x9ADE,0xA007,0xA003,0xA000,0x9ADD, 0xA002,0x9ADC,0x9ADB,0xA004,0xA002,0x9ADA,0x9AD9,0xA002,0x9AD7,0x9AD6,0xA010,0xA008,0xA004,0xA002,0x9AD5,0x9AD4, 0xA002,0x9AD2,0x9AD0,0xA004,0xA002,0x9ACF,0x9ACE,0xA002,0x9ACD,0x9ACA,0xA008,0xA004,0xA002,0x9AC9,0x9AC8,0xA002, 0x9AC7,0x9AC6,0xA004,0xA002,0x9AC4,0x9AC3,0xA002,0x9ABF,0x9ABE,0xA083,0xA055,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x9ABD,0xA002,0x9ABB,0x9AB9,0xA004,0xA002,0x9AB5,0x9AB4,0xA002,0x9AB3,0x9AB2,0xA008,0xA004,0xA002,0x9AAF,0x9AAE, 0xA002,0x9AAD,0x9AAC,0xA004,0xA002,0x9AAB,0x9AAA,0xA002,0x9AA9,0x9AA6,0xA010,0xA008,0xA004,0xA002,0x9A99,0x9A95, 0xA002,0x9A94,0x9A8E,0xA004,0xA002,0x9A8D,0x9A89,0xA002,0x9A83,0x9A72,0xA008,0xA004,0xA002,0x9A6B,0x9A6A,0xA002, 0x9A69,0x9A68,0xA004,0xA002,0x9A67,0x9A66,0xA002,0x9A65,0x9A64,0xA000,0xA010,0xA008,0xA004,0xA002,0x9A63,0x9A62, 0xA002,0x9A61,0x9A60,0xA004,0xA002,0x9A5F,0x9A5E,0xA002,0x9A5D,0x9A5C,0xA000,0xA000,0xA002,0x9A5B,0x9A5A,0xA001, 0xA00D,0xA001,0xA004,0xA001,0xA001,0x87D2,0xA004,0xA002,0x87A8,0x87AF,0xA002,0x8793,0x8765,0xA010,0xA008,0xA004, 0xA002,0x8759,0x8764,0xA002,0x877C,0x8763,0xA004,0xA002,0x8753,0x878B,0xA002,0x876E,0x874C,0xA008,0xA004,0xA002, 0x8770,0x8760,0xA002,0x877B,0x877E,0xA004,0xA002,0x877D,0x8722,0xA002,0x8782,0x873F,0xA07E,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x8737,0xA002,0x8729,0x8731,0xA004,0xA002,0x8734,0x8748,0xA002,0x873E,0x871A,0xA008,0xA004,0xA002, 0x872E,0x8725,0xA002,0x871E,0x873B,0xA004,0xA002,0x8723,0x8709,0xA002,0x870D,0x870A,0xA010,0xA008,0xA004,0xA002, 0x8708,0x86F8,0xA002,0x8707,0x8703,0xA004,0xA002,0x86D1,0x86D8,0xA002,0x86DF,0x86F4,0xA008,0xA004,0xA002,0x86DE, 0x8713,0xA002,0x86D0,0x86F3,0xA004,0xA002,0x86ED,0x86F2,0xA002,0x86F1,0x86E9,0xA020,0xA010,0xA008,0xA004,0xA002, 0x86B4,0x86CF,0xA002,0x86C9,0x86AF,0xA004,0xA002,0x86B1,0x86BA,0xA002,0x86B0,0x86CE,0xA008,0xA004,0xA002,0x86B5, 0x86C4,0xA002,0x86B6,0x86A9,0xA004,0xA002,0x8693,0x86AA,0xA002,0x86A3,0x86A7,0xA010,0xA008,0xA004,0xA002,0x869D, 0x86AC,0xA002,0x868B,0x868D,0xA004,0xA002,0x86A8,0x867B,0xA002,0x867C,0x867A,0xA008,0xA004,0xA002,0x867F,0x866E, 0xA002,0x866C,0x8654,0xA004,0xA002,0x864D,0x98A6,0xA002,0x98A5,0x98A2,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x98A1,0x989F,0xA002,0x989E,0x989B,0xA004,0xA002,0x989A,0x9894,0xA002,0x988F,0x988D,0xA008,0xA004,0xA002,0x988C, 0x9889,0xA002,0x9A59,0x9A58,0xA004,0xA002,0x9A57,0x9A56,0xA002,0x9A55,0x9A54,0xA010,0xA008,0xA004,0xA002,0x9A53, 0x9A52,0xA002,0x9A51,0x9A50,0xA004,0xA002,0x9A4F,0x9A4E,0xA002,0x9A4D,0x9A4C,0xA008,0xA004,0xA002,0x9A4B,0x9A4A, 0xA002,0x9A49,0x9A48,0xA004,0xA002,0x9A47,0x9A46,0xA002,0x9A45,0x9A44,0xA01F,0xA010,0xA008,0xA004,0xA002,0x9A43, 0x9A42,0xA002,0x9A41,0x9A40,0xA004,0xA002,0x9A3F,0x9A3E,0xA002,0x9A3D,0x9A3C,0xA007,0xA004,0xA002,0x9A3B,0x9A3A, 0xA000,0x9A39,0xA004,0xA002,0x9A38,0x9A37,0xA002,0x9A36,0x9A35,0xA010,0xA008,0xA004,0xA002,0x9A34,0x9A33,0xA002, 0x9A32,0x9A31,0xA004,0xA002,0x9A30,0x9A2F,0xA002,0x9A2E,0x9A2D,0xA008,0xA004,0xA002,0x9A2C,0x9A2B,0xA002,0x9A2A, 0x9A29,0xA004,0xA002,0x9A28,0x9A27,0xA002,0x9A26,0x9A25,0xA2FF,0xA17F,0xA082,0xA058,0xA03E,0xA01E,0xA00E,0xA006, 0xA002,0x9A24,0xA002,0x9A23,0x9A22,0xA004,0xA002,0x9A21,0x9A20,0xA002,0x9A1F,0x9A1E,0xA008,0xA004,0xA002,0x9A1D, 0x9A1C,0xA002,0x9A1B,0x9A1A,0xA004,0xA002,0x9A19,0x9A18,0xA002,0x9A17,0x9A16,0xA010,0xA008,0xA004,0xA002,0x9A15, 0x9A14,0xA002,0x9A13,0x9A12,0xA004,0xA002,0x9A11,0x9A10,0xA002,0x9A0F,0x9A0E,0xA008,0xA004,0xA002,0x9A0D,0x9A0C, 0xA002,0x9A0B,0x9A0A,0xA004,0xA002,0x9A09,0x9A08,0xA002,0x9A07,0x9A06,0xA000,0xA010,0xA008,0xA004,0xA002,0x9A05, 0x9A04,0xA002,0x9A03,0x9A02,0xA004,0xA002,0x9A01,0x9A00,0xA002,0x99FF,0x99FE,0xA000,0xA004,0xA002,0x99FD,0x99FC, 0xA002,0x99FB,0x99FA,0xA001,0xA009,0xA001,0xA001,0xA003,0xA001,0x9883,0xA002,0x9880,0x9878,0xA010,0xA008,0xA004, 0xA002,0x8983,0x8071,0xA002,0x8069,0x8052,0xA004,0xA002,0x804D,0x8046,0xA002,0x8043,0x8035,0xA008,0xA004,0xA002, 0x800B,0x8031,0xA002,0x8028,0x8029,0xA004,0xA002,0x8027,0x8026,0xA002,0x8025,0x8022,0xA07E,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x8020,0xA002,0x801C,0x8016,0xA004,0xA002,0x8014,0x8012,0xA002,0x77DC,0x76B4,0xA008,0xA004,0xA002, 0x76B2,0x80E5,0xA002,0x758B,0x897B,0xA004,0xA002,0x8966,0x8941,0xA002,0x8936,0x892B,0xA010,0xA008,0xA004,0xA002, 0x8934,0x890A,0xA002,0x891B,0x8913,0xA004,0xA002,0x8919,0x8921,0xA002,0x88F0,0x88FE,0xA008,0xA004,0xA002,0x88E8, 0x88FC,0xA002,0x891A,0x88F1,0xA004,0xA002,0x88E5,0x88E3,0xA002,0x88CE,0x88E2,0xA020,0xA010,0xA008,0xA004,0xA002, 0x88C9,0x88BC,0xA002,0x88B7,0x88C6,0xA004,0xA002,0x88A2,0x8882,0xA002,0x887F,0x887D,0xA008,0xA004,0xA002,0x8872, 0x8869,0xA002,0x8864,0x7AB3,0xA004,0xA002,0x7AAD,0x7AA8,0xA002,0x7AAC,0x7AA0,0xA010,0xA008,0xA004,0xA002,0x7AA6, 0x7A95,0xA002,0x7A88,0x7A86,0xA004,0xA002,0x7A80,0x7A79,0xA002,0x7A78,0x7AE6,0xA008,0xA004,0xA002,0x7FCA,0x766F, 0xA002,0x766B,0x7656,0xA004,0xA002,0x765C,0x7654,0xA002,0x765E,0x764D,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x7633,0x763E,0xA002,0x7643,0x7635,0xA004,0xA002,0x763F,0x7630,0xA002,0x762D,0x7640,0xA008,0xA004,0xA002,0x7620, 0x7622,0xA002,0x763C,0x761B,0xA004,0xA002,0x99F9,0x99F8,0xA002,0x99F7,0x99F6,0xA010,0xA008,0xA004,0xA002,0x99F5, 0x99F4,0xA002,0x99F3,0x99F2,0xA004,0xA002,0x99F1,0x99F0,0xA002,0x99EF,0x99EE,0xA008,0xA004,0xA002,0x99ED,0x99EC, 0xA002,0x99EB,0x99EA,0xA004,0xA002,0x99E9,0x99E8,0xA002,0x99E7,0x99E6,0xA01F,0xA010,0xA008,0xA004,0xA002,0x99E5, 0x99E4,0xA002,0x99E3,0x99E2,0xA004,0xA002,0x99E1,0x99E0,0xA002,0x99DF,0x99DE,0xA008,0xA004,0xA002,0x99DD,0x99DC, 0xA002,0x99DB,0x99DA,0xA003,0xA000,0x99D9,0xA002,0x99D8,0x99D7,0xA010,0xA008,0xA004,0xA002,0x99D6,0x99D5,0xA002, 0x99D4,0x99D3,0xA004,0xA002,0x99D2,0x99D1,0xA002,0x99D0,0x99CF,0xA008,0xA004,0xA002,0x99CE,0x99CD,0xA002,0x99CC, 0x99CB,0xA004,0xA002,0x99CA,0x99C9,0xA002,0x99C8,0x99C7,0xA083,0xA05C,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x99C6, 0xA002,0x99C5,0x99C4,0xA004,0xA002,0x99C3,0x99C2,0xA002,0x99C1,0x99C0,0xA008,0xA004,0xA002,0x99BF,0x99BE,0xA002, 0x99BD,0x99BC,0xA004,0xA002,0x99BB,0x99BA,0xA002,0x99B9,0x99B8,0xA010,0xA008,0xA004,0xA002,0x99B7,0x99B6,0xA002, 0x99B5,0x99B4,0xA004,0xA002,0x99B3,0x99B2,0xA002,0x99B1,0x99B0,0xA008,0xA004,0xA002,0x99AF,0x99AE,0xA002,0x99AD, 0x99AC,0xA004,0xA002,0x99AB,0x99AA,0xA002,0x99A9,0x99A7,0xA000,0xA010,0xA008,0xA004,0xA002,0x99A6,0x99A4,0xA002, 0x99A3,0x99A2,0xA004,0xA002,0x99A1,0x99A0,0xA002,0x999F,0x999E,0xA008,0xA004,0xA002,0x999D,0x999C,0xA002,0x999B, 0x999A,0xA000,0xA002,0x998E,0x998C,0xA001,0xA006,0xA001,0xA001,0xA001,0xA001,0x7619,0xA010,0xA008,0xA004,0xA002, 0x7615,0x7618,0xA002,0x7625,0x760A,0xA004,0xA002,0x7617,0x760C,0xA002,0x7605,0x7600,0xA008,0xA004,0xA002,0x7610, 0x75FF,0xA002,0x75FC,0x75F1,0xA004,0xA002,0x7603,0x75E7,0xA002,0x75EB,0x75E4,0xA07E,0xA03E,0xA01E,0xA00E,0xA006, 0xA002,0x75E6,0xA002,0x75E8,0x75E3,0xA004,0xA002,0x75CD,0x75D6,0xA002,0x75C2,0x75C3,0xA008,0xA004,0xA002,0x75B0, 0x75B1,0xA002,0x75C4,0x75B8,0xA004,0xA002,0x75B4,0x75B3,0xA002,0x75A3,0x75AC,0xA010,0xA008,0xA004,0xA002,0x759D, 0x75A0,0xA002,0x7596,0x7594,0xA004,0xA002,0x7592,0x9E73,0xA002,0x9E6D,0x9E71,0xA008,0xA004,0xA002,0x9E6C,0x9E6B, 0xA002,0x9E6A,0x9E69,0xA004,0xA002,0x9E68,0x9E67,0xA002,0x9E66,0x9E63,0xA020,0xA010,0xA008,0xA004,0xA002,0x9E5E, 0x9E5C,0xA002,0x9E5B,0x9E5A,0xA004,0xA002,0x9E57,0x9E55,0xA002,0x9E51,0x9E4E,0xA008,0xA004,0xA002,0x9E4C,0x9E4B, 0xA002,0x9E49,0x9E48,0xA004,0xA002,0x9E47,0x9E46,0xA002,0x9E44,0x9E42,0xA010,0xA008,0xA004,0xA002,0x9E41,0x9E3E, 0xA002,0x9E3A,0x9E39,0xA004,0xA002,0x9E37,0x9E38,0xA002,0x9E36,0x9E31,0xA008,0xA004,0xA002,0x9E32,0x9E2C,0xA002, 0x9E2B,0x9E2A,0xA004,0xA002,0x9E29,0x9E28,0xA002,0x9E22,0x9E20,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x752C, 0x74E0,0xA002,0x74DE,0x76A4,0xA004,0xA002,0x7699,0x7693,0xA002,0x768E,0x7688,0xA008,0xA004,0xA002,0x7A70,0x99A5, 0xA002,0x9ECF,0x7A51,0xA004,0xA002,0x7A37,0x7A39,0xA002,0x9989,0x9983,0xA010,0xA008,0xA004,0xA002,0x9982,0x997E, 0xA002,0x997B,0x9979,0xA004,0xA002,0x9978,0x9973,0xA002,0x9966,0x9964,0xA008,0xA004,0xA002,0x9962,0x9961,0xA002, 0x9960,0x995F,0xA004,0xA002,0x995E,0x995D,0xA002,0x995C,0x995B,0xA01F,0xA010,0xA008,0xA004,0xA002,0x995A,0x9959, 0xA002,0x9958,0x9957,0xA004,0xA002,0x9956,0x9953,0xA002,0x9952,0x9951,0xA008,0xA004,0xA002,0x9950,0x994F,0xA002, 0x994E,0x994D,0xA004,0xA002,0x994C,0x994B,0xA000,0x994A,0xA010,0xA008,0xA004,0xA002,0x9949,0x9948,0xA002,0x9947, 0x9946,0xA004,0xA002,0x9945,0x9944,0xA002,0x9943,0x9942,0xA008,0xA004,0xA002,0x9941,0x9940,0xA002,0x993F,0x993E, 0xA004,0xA002,0x993D,0x993C,0xA002,0x993B,0x993A,0xA17D,0xA080,0xA05F,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9939, 0xA002,0x9938,0x9937,0xA004,0xA002,0x9936,0x9935,0xA002,0x9934,0x9933,0xA008,0xA004,0xA002,0x9932,0x9931,0xA002, 0x9930,0x992F,0xA004,0xA002,0x992D,0x992C,0xA002,0x992B,0x992A,0xA010,0xA008,0xA004,0xA002,0x9929,0x9928,0xA002, 0x9927,0x9926,0xA004,0xA002,0x9925,0x9924,0xA002,0x9923,0x9922,0xA008,0xA004,0xA002,0x9921,0x9920,0xA002,0x991F, 0x991E,0xA004,0xA002,0x991D,0x991C,0xA002,0x991B,0x991A,0xA000,0xA010,0xA008,0xA004,0xA002,0x9919,0x9918,0xA002, 0x9917,0x9916,0xA004,0xA002,0x9915,0x9914,0xA002,0x9913,0x9912,0xA008,0xA004,0xA002,0x9911,0x990F,0xA002,0x990E, 0x990C,0xA004,0xA002,0x990B,0x990A,0xA002,0x9909,0x9908,0xA001,0xA001,0xA00F,0xA007,0xA003,0xA001,0x7A14,0xA002, 0x7A1E,0x7A02,0xA004,0xA002,0x7A03,0x5D47,0xA002,0x7A06,0x79EB,0xA008,0xA004,0xA002,0x79E3,0x79ED,0xA002,0x79D5, 0x96C9,0xA004,0xA002,0x77EC,0x77E7,0xA002,0x953A,0x9573,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9572,0xA002, 0x9571,0x956F,0xA004,0xA002,0x956C,0x956B,0xA002,0x956A,0x9569,0xA008,0xA004,0xA002,0x9568,0x9567,0xA002,0x9566, 0x9565,0xA004,0xA002,0x9564,0x9562,0xA002,0x9561,0x955D,0xA010,0xA008,0xA004,0xA002,0x955F,0x955E,0xA002,0x955B, 0x9559,0xA004,0xA002,0x9558,0x9557,0xA002,0x9556,0x9554,0xA008,0xA004,0xA002,0x9553,0x9552,0xA002,0x954F,0x954E, 0xA004,0xA002,0x954C,0x9549,0xA002,0x9546,0x9545,0xA020,0xA010,0xA008,0xA004,0xA002,0x9544,0x9535,0xA002,0x9542, 0x953F,0xA004,0xA002,0x953E,0x953C,0xA002,0x9538,0x9537,0xA008,0xA004,0xA002,0x9536,0x9534,0xA002,0x9532,0x9531, 0xA004,0xA002,0x952C,0x9529,0xA002,0x952B,0x952A,0xA010,0xA008,0xA004,0xA002,0x9522,0x951F,0xA002,0x951E,0x951D, 0xA004,0xA002,0x951B,0x9518,0xA002,0x9516,0x9515,0xA008,0xA004,0xA002,0x9514,0x9513,0xA002,0x9512,0x950F,0xA004, 0xA002,0x950E,0x950D,0xA002,0x950A,0x9509,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x9507,0x9506,0xA002,0x9502, 0x9503,0xA004,0xA002,0x94FF,0x94FD,0xA002,0x94FC,0x94F9,0xA008,0xA004,0xA002,0x94F7,0x94F5,0xA002,0x94F4,0x94F3, 0xA004,0xA002,0x94EF,0x94EE,0xA002,0x94EB,0x94E9,0xA010,0xA008,0xA004,0xA002,0x9907,0x9906,0xA002,0x9905,0x9904, 0xA004,0xA002,0x9903,0x9902,0xA002,0x9901,0x9900,0xA008,0xA004,0xA002,0x98FF,0x98FE,0xA002,0x98FD,0x98FC,0xA004, 0xA002,0x98FB,0x98FA,0xA002,0x98F9,0x98F8,0xA020,0xA010,0xA008,0xA004,0xA002,0x98F7,0x98F6,0xA002,0x98F5,0x98F4, 0xA004,0xA002,0x98F3,0x98F2,0xA002,0x98F1,0x98F0,0xA008,0xA004,0xA002,0x98EF,0x98EE,0xA002,0x98ED,0x98EC,0xA004, 0xA002,0x98EB,0x98EA,0xA002,0x98E9,0x98E6,0xA00F,0xA007,0xA003,0xA000,0x98E5,0xA002,0x98E4,0x98E3,0xA004,0xA002, 0x98E2,0x98E1,0xA002,0x98E0,0x98DD,0xA008,0xA004,0xA002,0x98DC,0x98DB,0xA002,0x98D7,0x98D6,0xA004,0xA002,0x98D4, 0x98D0,0xA002,0x98CF,0x98CD,0xA083,0xA065,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x98CC,0xA002,0x98CB,0x98CA,0xA004, 0xA002,0x98C9,0x98C8,0xA002,0x98C7,0x98C6,0xA008,0xA004,0xA002,0x98C5,0x98C4,0xA002,0x98C3,0x98C2,0xA004,0xA002, 0x98C1,0x98C0,0xA002,0x98BF,0x98BE,0xA010,0xA008,0xA004,0xA002,0x98BD,0x98BC,0xA002,0x98BB,0x98BA,0xA004,0xA002, 0x98B9,0x98B8,0xA002,0x98B7,0x98B6,0xA008,0xA004,0xA002,0x98B5,0x98B4,0xA002,0x98B3,0x98B2,0xA004,0xA002,0x98B1, 0x98B0,0xA002,0x98AF,0x98AE,0xA020,0xA010,0xA008,0xA004,0xA002,0x98AD,0x98AC,0xA002,0x98AB,0x98AA,0xA004,0xA002, 0x98A9,0x98A8,0xA002,0x98A3,0x9899,0xA008,0xA004,0xA002,0x9895,0x9892,0xA002,0x988E,0x988B,0xA004,0xA002,0x9874, 0x9873,0xA002,0x9872,0x9871,0xA000,0xA000,0xA000,0xA002,0x9870,0x986F,0xA001,0xA001,0xA00C,0xA004,0xA001,0xA001, 0x94EA,0xA004,0xA002,0x94E8,0x94E7,0xA002,0x94E5,0x94E4,0xA008,0xA004,0xA002,0x94E2,0x94E0,0xA002,0x94DF,0x94DE, 0xA004,0xA002,0x94DB,0x94D8,0xA002,0x94D9,0x94D7,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x94D6,0xA002,0x94D5, 0x94D2,0xA004,0xA002,0x94D1,0x94D0,0xA002,0x94CE,0x94CD,0xA008,0xA004,0xA002,0x94CC,0x94CB,0xA002,0x94CA,0x94C9, 0xA004,0xA002,0x94C8,0x94C4,0xA002,0x94BF,0x94BD,0xA010,0xA008,0xA004,0xA002,0x94BC,0x94BA,0xA002,0x94B9,0x94B8, 0xA004,0xA002,0x94B7,0x94B6,0xA002,0x94B4,0x94B2,0xA008,0xA004,0xA002,0x94B0,0x94AF,0xA002,0x94AC,0x94AD,0xA004, 0xA002,0x94AA,0x94AB,0xA002,0x94A4,0x94A3,0xA020,0xA010,0xA008,0xA004,0xA002,0x949C,0x949B,0xA002,0x949A,0x9495, 0xA004,0xA002,0x9497,0x9494,0xA002,0x9490,0x948F,0xA008,0xA004,0xA002,0x948D,0x948C,0xA002,0x948A,0x948B,0xA004, 0xA002,0x9487,0x9486,0xA002,0x9485,0x8832,0xA010,0xA008,0xA004,0xA002,0x76E5,0x76CD,0xA002,0x7F7E,0x7F81,0xA004, 0xA002,0x7F79,0x7F71,0xA002,0x7F74,0x7F68,0xA008,0xA004,0xA002,0x8A48,0x7F5F,0xA002,0x7F61,0x7F58,0xA004,0xA002, 0x7583,0x7579,0xA002,0x7572,0x755B,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x7548,0x754B,0xA002,0x754E,0x7540, 0xA004,0xA002,0x753A,0x77BD,0xA002,0x77B5,0x77B0,0xA008,0xA004,0xA002,0x77A0,0x779F,0xA002,0x7791,0x778C,0xA004, 0xA002,0x7780,0x777D,0xA002,0x778D,0x777F,0xA010,0xA008,0xA004,0xA002,0x7765,0x7762,0xA002,0x986E,0x986D,0xA004, 0xA002,0x986C,0x986B,0xA002,0x986A,0x9869,0xA008,0xA004,0xA002,0x9868,0x9867,0xA002,0x9866,0x9865,0xA004,0xA002, 0x9864,0x9863,0xA002,0x9862,0x9861,0xA020,0xA010,0xA008,0xA004,0xA002,0x9860,0x985F,0xA002,0x985E,0x985D,0xA004, 0xA002,0x985C,0x985B,0xA002,0x985A,0x9859,0xA008,0xA004,0xA002,0x9858,0x9857,0xA002,0x9856,0x9855,0xA004,0xA002, 0x9854,0x9853,0xA002,0x9852,0x9851,0xA00F,0xA007,0xA004,0xA002,0x9850,0x984F,0xA000,0x984E,0xA004,0xA002,0x984D, 0x984C,0xA002,0x984B,0x984A,0xA008,0xA004,0xA002,0x9849,0x9848,0xA002,0x9847,0x9846,0xA004,0xA002,0x9845,0x9844, 0xA002,0x9843,0x9842,0xABF3,0xA5FA,0xA2FB,0xA17D,0xA080,0xA068,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9841,0xA002, 0x9840,0x983F,0xA004,0xA002,0x983E,0x983D,0xA002,0x983C,0x983B,0xA008,0xA004,0xA002,0x983A,0x9839,0xA002,0x9838, 0x9837,0xA004,0xA002,0x9836,0x9835,0xA002,0x9834,0x9833,0xA010,0xA008,0xA004,0xA002,0x9832,0x9831,0xA002,0x9830, 0x982F,0xA004,0xA002,0x982E,0x982D,0xA002,0x982C,0x982B,0xA008,0xA004,0xA002,0x982A,0x9829,0xA002,0x9828,0x9827, 0xA004,0xA002,0x9826,0x9825,0xA002,0x9824,0x9823,0xA020,0xA010,0xA008,0xA004,0xA002,0x9822,0x9821,0xA002,0x9820, 0x981F,0xA004,0xA002,0x981E,0x981D,0xA002,0x981C,0x981B,0xA008,0xA004,0xA002,0x981A,0x9819,0xA002,0x9818,0x9817, 0xA004,0xA002,0x9816,0x9815,0xA002,0x9814,0x9813,0xA000,0xA000,0xA004,0xA002,0x9812,0x9811,0xA002,0x9810,0x980F, 0xA001,0xA001,0xA006,0xA001,0xA001,0xA002,0x7768,0x775A,0xA008,0xA004,0xA002,0x7743,0x7747,0xA002,0x7751,0x7750, 0xA004,0xA002,0x7738,0x7735,0xA002,0x7726,0x772D,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7719,0xA002,0x7722, 0x771A,0xA004,0xA002,0x7708,0x7707,0xA002,0x76F9,0x770D,0xA008,0xA004,0xA002,0x7704,0x76F1,0xA002,0x9EFC,0x9EFB, 0xA004,0xA002,0x9EF9,0x9F9B,0xA002,0x7934,0x791E,0xA010,0xA008,0xA004,0xA002,0x7924,0x7913,0xA002,0x78F4,0x7905, 0xA004,0xA002,0x78F2,0x78EC,0xA002,0x78C9,0x78D9,0xA008,0xA004,0xA002,0x78D4,0x78A5,0xA002,0x78B9,0x78B2,0xA004, 0xA002,0x78A3,0x78A1,0xA002,0x789C,0x7887,0xA020,0xA010,0xA008,0xA004,0xA002,0x789A,0x7893,0xA002,0x789B,0x786A, 0xA004,0xA002,0x784C,0x7847,0xA002,0x7850,0x7826,0xA008,0xA004,0xA002,0x7857,0x7856,0xA002,0x786D,0x784E,0xA004, 0xA002,0x7829,0x7823,0xA002,0x782C,0x7825,0xA010,0xA008,0xA004,0xA002,0x783C,0x781F,0xA002,0x783B,0x783A,0xA004, 0xA002,0x7839,0x781D,0xA002,0x781C,0x782D,0xA008,0xA004,0xA002,0x65AB,0x7811,0xA002,0x7818,0x7817,0xA004,0xA002, 0x7809,0x7800,0xA002,0x77F8,0x77F6,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6DFC,0x6CF6,0xA002,0x6C93,0x807F, 0xA004,0xA002,0x8080,0x6206,0xA002,0x61D1,0x61CB,0xA008,0xA004,0xA002,0x619D,0x61A9,0xA002,0x615D,0x610D,0xA004, 0xA002,0x6106,0x60AB,0xA002,0x6063,0x6059,0xA010,0xA008,0xA004,0xA002,0x6041,0x6067,0xA002,0x605A,0x605D,0xA004, 0xA002,0x603C,0x980E,0xA002,0x980D,0x980C,0xA008,0xA004,0xA002,0x980B,0x980A,0xA002,0x9809,0x9808,0xA004,0xA002, 0x9807,0x9806,0xA002,0x9805,0x9804,0xA020,0xA010,0xA008,0xA004,0xA002,0x9803,0x9802,0xA002,0x9801,0x9800,0xA004, 0xA002,0x97FF,0x97FE,0xA002,0x97FD,0x97FC,0xA008,0xA004,0xA002,0x97FB,0x97FA,0xA002,0x97F9,0x97F8,0xA004,0xA002, 0x97F7,0x97F4,0xA002,0x97F2,0x97F1,0xA00F,0xA008,0xA004,0xA002,0x97F0,0x97EF,0xA002,0x97EE,0x97E8,0xA004,0xA002, 0x97E5,0x97E4,0xA001,0x97E3,0xA008,0xA004,0xA002,0x97E2,0x97E1,0xA002,0x97E0,0x97DF,0xA004,0xA002,0x97DE,0x97DD, 0xA002,0x97DC,0x97DB,0xA081,0xA06E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x97DA,0xA002,0x97D9,0x97D8,0xA004,0xA002, 0x97D7,0x97D6,0xA002,0x97D5,0x97D4,0xA008,0xA004,0xA002,0x97D3,0x97D2,0xA002,0x97D1,0x97D0,0xA004,0xA002,0x97CF, 0x97CE,0xA002,0x97CD,0x97CC,0xA010,0xA008,0xA004,0xA002,0x97CB,0x97CA,0xA002,0x97C9,0x97C8,0xA004,0xA002,0x97C7, 0x97C6,0xA002,0x97C5,0x97C4,0xA008,0xA004,0xA002,0x97C3,0x97C2,0xA002,0x97C1,0x97C0,0xA004,0xA002,0x97BF,0x97BE, 0xA002,0x97BD,0x97BC,0xA020,0xA010,0xA008,0xA004,0xA002,0x97BB,0x97BA,0xA002,0x97B9,0x97B8,0xA004,0xA002,0x97B7, 0x97B6,0xA002,0x97B5,0x97B3,0xA008,0xA004,0xA002,0x97B1,0x97B0,0xA002,0x97AE,0x97AC,0xA004,0xA002,0x97AA,0x97A9, 0xA002,0x97A8,0x97A7,0xA000,0xA008,0xA004,0xA002,0x97A6,0x97A5,0xA002,0x97A4,0x97A2,0xA004,0xA002,0x97A1,0x979F, 0xA000,0x979E,0xA001,0xA001,0xA001,0xA008,0xA004,0xA002,0x5FD0,0x5FD1,0xA002,0x79B3,0x79A7,0xA004,0xA002,0x799A, 0x798A,0xA002,0x7985,0x797A,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7967,0xA002,0x796F,0x7960,0xA004,0xA002, 0x7957,0x7962,0xA002,0x795A,0x7953,0xA008,0xA004,0xA002,0x795C,0x795B,0xA002,0x7949,0x7946,0xA004,0xA002,0x7940, 0x793B,0xA002,0x6249,0x6248,0xA010,0xA008,0xA004,0xA002,0x6243,0x623D,0xA002,0x623E,0x71B9,0xA004,0xA002,0x7166, 0x7118,0xA002,0x706C,0x7228,0xA008,0xA004,0xA002,0x721D,0x71F9,0xA002,0x71E7,0x71D4,0xA004,0xA002,0x71E0,0x71A0, 0xA002,0x71A8,0x71B5,0xA020,0xA010,0xA008,0xA004,0xA002,0x71B3,0x7198,0xA002,0x717A,0x7178,0xA004,0xA002,0x714A, 0x7172,0xA002,0x7145,0x7168,0xA008,0xA004,0xA002,0x715C,0x7173,0xA002,0x7131,0x712F,0xA004,0xA002,0x7116,0x7113, 0xA002,0x7110,0x70CA,0xA010,0xA008,0xA004,0xA002,0x70E8,0x70B1,0xA002,0x70AB,0x70B7,0xA004,0xA002,0x70C0,0x70BB, 0xA002,0x709D,0x7096,0xA008,0xA004,0xA002,0x709C,0x7080,0xA002,0x65D6,0x65D2,0xA004,0xA002,0x65CE,0x65CC,0xA002, 0x65C3,0x65C4,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x65C6,0x65BC,0xA002,0x6593,0x9F51,0xA004,0xA002,0x6590, 0x89F3,0xA002,0x6BC2,0x5F40,0xA008,0xA004,0xA002,0x6BB3,0x98DA,0xA002,0x98D9,0x98D5,0xA004,0xA002,0x98D3,0x98D2, 0xA002,0x98D1,0x6B59,0xA010,0xA008,0xA004,0xA002,0x6B46,0x6B43,0xA002,0x6B39,0x6B37,0xA004,0xA002,0x6B24,0x81A6, 0xA002,0x81C1,0x979D,0xA008,0xA004,0xA002,0x979C,0x979B,0xA002,0x979A,0x9799,0xA004,0xA002,0x9797,0x9796,0xA002, 0x9795,0x9793,0xA020,0xA010,0xA008,0xA004,0xA002,0x9790,0x978F,0xA002,0x978E,0x978C,0xA004,0xA002,0x978A,0x9789, 0xA002,0x9788,0x9787,0xA008,0xA004,0xA002,0x9786,0x9784,0xA002,0x9783,0x9782,0xA004,0xA002,0x9781,0x9780,0xA002, 0x977F,0x977E,0xA010,0xA008,0xA004,0xA002,0x977D,0x977B,0xA002,0x977A,0x9779,0xA004,0xA002,0x9778,0x9777,0xA002, 0x9775,0x9772,0xA007,0xA003,0xA001,0x9771,0xA002,0x9770,0x976F,0xA004,0xA002,0x976E,0x976D,0xA002,0x976C,0x976B, 0xA180,0xA083,0xA073,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x976A,0xA002,0x9768,0x9767,0xA004,0xA002,0x9766,0x9764, 0xA002,0x9763,0x975F,0xA008,0xA004,0xA002,0x975D,0x975C,0xA002,0x975A,0x9758,0xA004,0xA002,0x9757,0x9755,0xA002, 0x9754,0x9751,0xA010,0xA008,0xA004,0xA002,0x9750,0x974F,0xA002,0x974E,0x974D,0xA004,0xA002,0x974C,0x974B,0xA002, 0x974A,0x9749,0xA008,0xA004,0xA002,0x9748,0x9747,0xA002,0x9746,0x9745,0xA004,0xA002,0x9744,0x9743,0xA002,0x9742, 0x9741,0xA020,0xA010,0xA008,0xA004,0xA002,0x9740,0x973F,0xA002,0x973D,0x973C,0xA004,0xA002,0x973B,0x973A,0xA002, 0x9737,0x9736,0xA008,0xA004,0xA002,0x9735,0x9734,0xA002,0x9733,0x9731,0xA004,0xA002,0x972F,0x972E,0xA002,0x972C, 0x972B,0xA010,0xA008,0xA004,0xA002,0x9729,0x9728,0xA002,0x9727,0x9726,0xA004,0xA002,0x9725,0x9724,0xA002,0x9723, 0x9722,0xA000,0xA000,0xA000,0x9721,0xA001,0xA001,0xA001,0xA005,0xA001,0xA002,0x81BB,0x81CA,0xA004,0xA002,0x6726, 0x81CC,0xA002,0x81AA,0x81A3,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6ED5,0xA002,0x8191,0x8182,0xA004,0xA002, 0x8188,0x5AB5,0xA002,0x584D,0x8167,0xA008,0xA004,0xA002,0x816D,0x817D,0xA002,0x817C,0x8169,0xA004,0xA002,0x8160, 0x8171,0xA002,0x815A,0x8159,0xA010,0xA008,0xA004,0xA002,0x8174,0x8153,0xA002,0x814C,0x8148,0xA004,0xA002,0x8132, 0x8118,0xA002,0x812C,0x811E,0xA008,0xA004,0xA002,0x8136,0x8C5A,0xA002,0x8112,0x6715,0xA004,0xA002,0x80FC,0x80F2, 0xA002,0x810E,0x810D,0xA020,0xA010,0xA008,0xA004,0xA002,0x80ED,0x80F4,0xA002,0x80F1,0x80EB,0xA004,0xA002,0x80DD, 0x6710,0xA002,0x80D7,0x80CD,0xA008,0xA004,0xA002,0x80D9,0x80C4,0xA002,0x80C2,0x80DB,0xA004,0xA002,0x80EA,0x80E9, 0xA002,0x80E8,0x80E7,0xA010,0xA008,0xA004,0xA002,0x80B7,0x80B4,0xA002,0x80AD,0x80AB,0xA004,0xA002,0x80B1,0x80BD, 0xA002,0x670A,0x80BC,0xA008,0xA004,0xA002,0x8093,0x809C,0xA002,0x809F,0x5216,0xA004,0xA002,0x8662,0x7230,0xA002, 0x7256,0x7252,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x724D,0x656B,0xA002,0x6555,0x6535,0xA004,0xA002,0x6C32, 0x6C2A,0xA002,0x6C24,0x6C29,0xA008,0xA004,0xA002,0x6C21,0x6C1A,0xA002,0x6C19,0x6C18,0xA004,0xA002,0x6C15,0x6C0D, 0xA002,0x6C06,0x6C07,0xA010,0xA008,0xA004,0xA002,0x6C05,0x6BF9,0xA002,0x6BF5,0x6BFD,0xA004,0xA002,0x6BF3,0x6BEA, 0xA002,0x8004,0x64D8,0xA008,0xA004,0xA002,0x643F,0x9720,0xA002,0x971F,0x971D,0xA004,0xA002,0x971B,0x971A,0xA002, 0x9719,0x9718,0xA020,0xA010,0xA008,0xA004,0xA002,0x9717,0x9715,0xA002,0x9714,0x9712,0xA004,0xA002,0x9711,0x9710, 0xA002,0x970C,0x970B,0xA008,0xA004,0xA002,0x970A,0x9705,0xA002,0x9703,0x9702,0xA004,0xA002,0x96FF,0x96FD,0xA002, 0x96FC,0x96FB,0xA010,0xA008,0xA004,0xA002,0x96FA,0x96F8,0xA002,0x96F5,0x96F4,0xA004,0xA002,0x96F2,0x96F1,0xA002, 0x96F0,0x96EE,0xA007,0xA004,0xA002,0x96ED,0x96EC,0xA001,0x96EB,0xA004,0xA002,0x96E7,0x96E6,0xA002,0x96E5,0x96E4, 0xA082,0xA076,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x96E3,0xA002,0x96E2,0x96E1,0xA004,0xA002,0x96DF,0x96DE,0xA002, 0x96DD,0x96DC,0xA008,0xA004,0xA002,0x96DB,0x96DA,0xA002,0x96D9,0x96D8,0xA004,0xA002,0x96D7,0x96D6,0xA002,0x96D4, 0x96D3,0xA010,0xA008,0xA004,0xA002,0x96D1,0x96D0,0xA002,0x96CB,0x96CA,0xA004,0xA002,0x96C8,0x96C3,0xA002,0x96C2, 0x96BF,0xA008,0xA004,0xA002,0x96BB,0x96BA,0xA002,0x96B8,0x96B7,0xA004,0xA002,0x96B5,0x96B4,0xA002,0x96B2,0x96B1, 0xA020,0xA010,0xA008,0xA004,0xA002,0x96AF,0x96AE,0xA002,0x96AD,0x96AC,0xA004,0xA002,0x96AB,0x96AA,0xA002,0x96A9, 0x96A8,0xA008,0xA004,0xA002,0x96A6,0x96A5,0xA002,0x96A4,0x96A3,0xA004,0xA002,0x96A2,0x96A1,0xA002,0x96A0,0x969F, 0xA010,0xA008,0xA004,0xA002,0x969E,0x969D,0xA002,0x969B,0x969A,0xA004,0xA002,0x9696,0x9695,0xA002,0x9693,0x9692, 0xA000,0xA004,0xA002,0x9691,0x968E,0xA000,0x968C,0xA001,0xA001,0xA001,0xA001,0xA004,0xA002,0x63B0,0x6332,0xA002, 0x6308,0x7292,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x728F,0xA002,0x728D,0x728B,0xA004,0xA002,0x7284,0x727F, 0xA002,0x727E,0x726F,0xA008,0xA004,0xA002,0x7266,0x725D,0xA002,0x729F,0x726E,0xA004,0xA002,0x89D1,0x89D0,0xA002, 0x89CF,0x89CE,0xA010,0xA008,0xA004,0xA002,0x89CC,0x89CB,0xA002,0x89CA,0x89C7,0xA004,0xA002,0x8D59,0x8D55,0xA002, 0x8D4D,0x8D47,0xA008,0xA004,0xA002,0x8D49,0x8D48,0xA002,0x8D46,0x8D45,0xA004,0xA002,0x8D40,0x8D3D,0xA002,0x8D3B, 0x8D36,0xA020,0xA010,0xA008,0xA004,0xA002,0x8D33,0x8D32,0xA002,0x66E9,0x66E6,0xA004,0xA002,0x66DC,0x66DB,0xA002, 0x66BE,0x669D,0xA008,0xA004,0xA002,0x66A7,0x668C,0xA002,0x6684,0x6677,0xA004,0xA002,0x6657,0x6661,0xA002,0x6656, 0x664F,0xA010,0xA008,0xA004,0xA002,0x6641,0x6654,0xA002,0x665F,0x8006,0xA004,0xA002,0x6635,0x6636,0xA002,0x6631, 0x6634,0xA008,0xA004,0xA002,0x661D,0x66F7,0xA002,0x7085,0x6600,0xA004,0xA002,0x6615,0x6603,0xA002,0x6772,0x6619, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x660A,0x65F0,0xA002,0x65EF,0x65EE,0xA004,0xA002,0x6534,0x7513,0xA002, 0x7511,0x750F,0xA008,0xA004,0xA002,0x74FF,0x74F4,0xA002,0x74EF,0x81E7,0xA004,0xA002,0x622C,0x6224,0xA002,0x6225, 0x6221,0xA010,0xA008,0xA004,0xA002,0x6222,0x621F,0xA002,0x621B,0x6217,0xA004,0xA002,0x620B,0x8ECE,0xA002,0x8F9A, 0x8F98,0xA008,0xA004,0xA002,0x8F8F,0x8F8E,0xA002,0x8F8D,0x968A,0xA004,0xA002,0x9689,0x9687,0xA002,0x9684,0x9683, 0xA020,0xA010,0xA008,0xA004,0xA002,0x9682,0x9681,0xA002,0x9680,0x967F,0xA004,0xA002,0x967E,0x967D,0xA002,0x967C, 0x967B,0xA008,0xA004,0xA002,0x967A,0x9679,0xA002,0x9678,0x9673,0xA004,0xA002,0x9671,0x9670,0xA002,0x966F,0x966E, 0xA010,0xA008,0xA004,0xA002,0x966D,0x966B,0xA002,0x9666,0x9665,0xA004,0xA002,0x9663,0x9660,0xA002,0x965E,0x965D, 0xA008,0xA004,0xA002,0x965C,0x965A,0xA002,0x9659,0x9658,0xA003,0xA001,0x9657,0xA002,0x9656,0x9653,0xA2FB,0xA17F, 0xA082,0xA07A,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9652,0xA002,0x9651,0x964F,0xA004,0xA002,0x964E,0x964A,0xA002, 0x9643,0x9641,0xA008,0xA004,0xA002,0x963E,0x963A,0xA002,0x9639,0x9638,0xA004,0xA002,0x9637,0x9630,0xA002,0x962F, 0x962D,0xA010,0xA008,0xA004,0xA002,0x962C,0x962B,0xA002,0x9629,0x9628,0xA004,0xA002,0x9627,0x9626,0xA002,0x9625, 0x9624,0xA008,0xA004,0xA002,0x9623,0x9620,0xA002,0x961E,0x961B,0xA004,0xA002,0x9618,0x9613,0xA002,0x9607,0x95FF, 0xA020,0xA010,0xA008,0xA004,0xA002,0x95EC,0x95E7,0xA002,0x95E6,0x95E5,0xA004,0xA002,0x95E4,0x95E3,0xA002,0x95E2, 0x95E1,0xA008,0xA004,0xA002,0x95E0,0x95DF,0xA002,0x95DE,0x95DD,0xA004,0xA002,0x95DC,0x95DB,0xA002,0x95DA,0x95D9, 0xA010,0xA008,0xA004,0xA002,0x95D8,0x95D7,0xA002,0x95D6,0x95D5,0xA004,0xA002,0x95D4,0x95D3,0xA002,0x95D2,0x95D1, 0xA008,0xA004,0xA002,0x95D0,0x95CF,0xA002,0x95CE,0x95CD,0xA000,0xA000,0x95CC,0xA001,0xA001,0xA001,0xA001,0xA001, 0xA001,0x8F8B,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x8F87,0xA002,0x8F84,0x8F82,0xA004,0xA002,0x8F81,0x8F7E, 0xA002,0x8F7C,0x8F7A,0xA008,0xA004,0xA002,0x8F79,0x8F77,0xA002,0x8F78,0x8F76,0xA004,0xA002,0x8F75,0x8F73,0xA002, 0x8F72,0x8F71,0xA010,0xA008,0xA004,0xA002,0x8F6D,0x8F6B,0xA002,0x6BAA,0x6BA1,0xA004,0xA002,0x6B9B,0x6B9A,0xA002, 0x6B8D,0x6B93,0xA008,0xA004,0xA002,0x6B92,0x6B84,0xA002,0x6B87,0x6B82,0xA004,0xA002,0x6B81,0x7352,0xA002,0x7337, 0x6AAB,0xA020,0xA010,0xA008,0xA004,0xA002,0x6A97,0x6AA9,0xA002,0x6A90,0x6A91,0xA004,0xA002,0x6A7C,0x6A58,0xA002, 0x6A28,0x6A3D,0xA008,0xA004,0xA002,0x6A79,0x6A8E,0xA002,0x6A35,0x6A5B,0xA004,0xA002,0x6A50,0x6AA0,0xA002,0x6A3E, 0x6A44,0xA010,0xA008,0xA004,0xA002,0x69F2,0x6A65,0xA002,0x6A18,0x6A17,0xA004,0xA002,0x69ED,0x6A2F,0xA002,0x69FF, 0x698D,0xA008,0xA004,0xA002,0x69E0,0x6995,0xA002,0x69DF,0x69CA,0xA004,0xA002,0x69C1,0x69B1,0xA002,0x69D4,0x69AD, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x69AB,0x69BB,0xA002,0x69A7,0x699B,0xA004,0xA002,0x6979,0x6963,0xA002, 0x6966,0x6989,0xA008,0xA004,0xA002,0x69CE,0x6988,0xA002,0x6987,0x69CC,0xA004,0xA002,0x6934,0x6978,0xA002,0x6998, 0x6980,0xA010,0xA008,0xA004,0xA002,0x696B,0x6984,0xA002,0x695D,0x6942,0xA004,0xA002,0x6960,0x6939,0xA002,0x6971, 0x6910,0xA008,0xA004,0xA002,0x68E3,0x6957,0xA002,0x6901,0x690B,0xA004,0xA002,0x68F0,0x6924,0xA002,0x95CB,0x95CA, 0xA020,0xA010,0xA008,0xA004,0xA002,0x95C9,0x95C8,0xA002,0x95C7,0x95C6,0xA004,0xA002,0x95C5,0x95C4,0xA002,0x95C3, 0x95C2,0xA008,0xA004,0xA002,0x95C1,0x95C0,0xA002,0x95BF,0x95BE,0xA004,0xA002,0x95BD,0x95BC,0xA002,0x95BB,0x95BA, 0xA010,0xA008,0xA004,0xA002,0x95B9,0x95B8,0xA002,0x95B7,0x95B6,0xA004,0xA002,0x95B5,0x95B4,0xA002,0x95B3,0x95B2, 0xA008,0xA004,0xA002,0x95B1,0x95B0,0xA002,0x95AF,0x95AE,0xA004,0xA002,0x95AD,0x95AC,0xA000,0x95AB,0xA07F,0xA000, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x95AA,0xA002,0x95A9,0x95A8,0xA004,0xA002,0x95A7,0x95A6,0xA002,0x95A5,0x95A4, 0xA008,0xA004,0xA002,0x95A3,0x95A2,0xA002,0x95A1,0x95A0,0xA004,0xA002,0x959F,0x959E,0xA002,0x959D,0x959C,0xA010, 0xA008,0xA004,0xA002,0x959B,0x959A,0xA002,0x9599,0x9598,0xA004,0xA002,0x9597,0x9596,0xA002,0x9595,0x9594,0xA008, 0xA004,0xA002,0x9593,0x9592,0xA002,0x9591,0x9590,0xA004,0xA002,0x958F,0x958E,0xA002,0x958D,0x958C,0xA020,0xA010, 0xA008,0xA004,0xA002,0x958B,0x958A,0xA002,0x9589,0x9588,0xA004,0xA002,0x9587,0x9586,0xA002,0x9585,0x9584,0xA008, 0xA004,0xA002,0x9583,0x9582,0xA002,0x9581,0x9580,0xA004,0xA002,0x957E,0x957D,0xA002,0x957C,0x957B,0xA010,0xA008, 0xA004,0xA002,0x957A,0x9579,0xA002,0x9578,0x9577,0xA004,0xA002,0x9575,0x9574,0xA002,0x956E,0x9560,0xA008,0xA004, 0xA002,0x955A,0x9555,0xA002,0x954B,0x9548,0xA004,0xA002,0x9543,0x953D,0xA002,0x9533,0x9527,0xA07D,0xA03D,0xA01D, 0xA00D,0xA005,0xA001,0xA002,0x68F9,0x6920,0xA004,0xA002,0x691F,0x68FC,0xA002,0x696E,0x68C2,0xA008,0xA004,0xA002, 0x686B,0x6893,0xA002,0x6877,0x6874,0xA004,0xA002,0x688F,0x68B5,0xA002,0x6829,0x6849,0xA010,0xA008,0xA004,0xA002, 0x684A,0x683E,0xA002,0x6840,0x6867,0xA004,0xA002,0x6841,0x6866,0xA002,0x6855,0x681D,0xA008,0xA004,0xA002,0x6883, 0x6864,0xA002,0x6844,0x6862,0xA004,0xA002,0x684E,0x6861,0xA002,0x6860,0x6833,0xA020,0xA010,0xA008,0xA004,0xA002, 0x6832,0x67FD,0xA002,0x67C1,0x680E,0xA004,0xA002,0x67E2,0x67B8,0xA002,0x67C3,0x6800,0xA008,0xA004,0xA002,0x67DD, 0x67B3,0xA002,0x67DA,0x67B5,0xA004,0xA002,0x67D9,0x680C,0xA002,0x67B0,0x67E9,0xA010,0xA008,0xA004,0xA002,0x680A, 0x67D8,0xA002,0x6809,0x67F0,0xA004,0xA002,0x677C,0x6777,0xA002,0x678B,0x67AD,0xA008,0xA004,0xA002,0x679E,0x67A8, 0xA002,0x6775,0x67A7,0xA004,0xA002,0x6798,0x6773,0xA002,0x676A,0x6787,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x67A5,0x6769,0xA002,0x6748,0x675E,0xA004,0xA002,0x6753,0x674C,0xA002,0x97EC,0x97EB,0xA008,0xA004,0xA002,0x97EA, 0x74BA,0xA002,0x74D2,0x74A7,0xA004,0xA002,0x7490,0x74A9,0xA002,0x74A8,0x749E,0xA010,0xA008,0xA004,0xA002,0x748B, 0x7487,0xA002,0x7481,0x7480,0xA004,0xA002,0x748E,0x749C,0xA002,0x747E,0x746D,0xA008,0xA004,0xA002,0x7477,0x7459, 0xA002,0x7455,0x7457,0xA004,0xA002,0x745C,0x7441,0xA002,0x741A,0x741B,0xA020,0xA010,0xA008,0xA004,0xA002,0x9520, 0x951C,0xA002,0x94FB,0x94E6,0xA004,0xA002,0x94DA,0x94D4,0xA002,0x94D3,0x94CF,0xA008,0xA004,0xA002,0x94C7,0x9498, 0xA002,0x9496,0x9491,0xA004,0xA002,0x9484,0x9483,0xA002,0x9482,0x9481,0xA010,0xA008,0xA004,0xA002,0x9480,0x947F, 0xA002,0x947E,0x947D,0xA004,0xA002,0x947C,0x947B,0xA002,0x947A,0x9479,0xA008,0xA004,0xA002,0x9478,0x9477,0xA002, 0x9476,0x9475,0xA004,0xA002,0x9474,0x9473,0xA002,0x9472,0x9471,0xA17F,0xA086,0xA07D,0xA03D,0xA01D,0xA00D,0xA005, 0xA002,0x9470,0xA001,0x946F,0xA004,0xA002,0x946E,0x946D,0xA002,0x946C,0x946A,0xA008,0xA004,0xA002,0x9469,0x9468, 0xA002,0x9467,0x9466,0xA004,0xA002,0x9465,0x9464,0xA002,0x9463,0x9462,0xA010,0xA008,0xA004,0xA002,0x9461,0x9460, 0xA002,0x945F,0x945E,0xA004,0xA002,0x945D,0x945C,0xA002,0x945B,0x945A,0xA008,0xA004,0xA002,0x9459,0x9458,0xA002, 0x9457,0x9456,0xA004,0xA002,0x9455,0x9454,0xA002,0x9453,0x9452,0xA020,0xA010,0xA008,0xA004,0xA002,0x9451,0x9450, 0xA002,0x944F,0x944E,0xA004,0xA002,0x944D,0x944C,0xA002,0x944B,0x944A,0xA008,0xA004,0xA002,0x9449,0x9448,0xA002, 0x9447,0x9446,0xA004,0xA002,0x9445,0x9444,0xA002,0x9443,0x9442,0xA010,0xA008,0xA004,0xA002,0x9441,0x9440,0xA002, 0x943F,0x943D,0xA004,0xA002,0x943C,0x943B,0xA002,0x943A,0x9439,0xA008,0xA004,0xA002,0x9438,0x9437,0xA002,0x9436, 0x9435,0xA004,0xA002,0x9434,0x9433,0xA002,0x9432,0x9431,0xA000,0xA000,0xA000,0xA000,0xA000,0xA002,0x9430,0x942F, 0xA079,0xA039,0xA019,0xA009,0xA001,0xA004,0xA002,0x742C,0x742E,0xA002,0x7430,0x7428,0xA008,0xA004,0xA002,0x7425, 0x7426,0xA002,0x745B,0x742A,0xA004,0xA002,0x740F,0x73F2,0xA002,0x73BA,0x73DE,0xA010,0xA008,0xA004,0xA002,0x73E7, 0x73E9,0xA002,0x740A,0x987C,0xA004,0xA002,0x73D9,0x73E5,0xA002,0x73C8,0x73C9,0xA008,0xA004,0xA002,0x73C0,0x73B3, 0xA002,0x73B7,0x73D1,0xA004,0xA002,0x73C2,0x73CF,0xA002,0x739F,0x73A2,0xA020,0xA010,0xA008,0xA004,0xA002,0x73AE, 0x7391,0xA002,0x738E,0x9095,0xA004,0xA002,0x753E,0x5DDB,0xA002,0x757F,0x5E7A,0xA008,0xA004,0xA002,0x7F35,0x7F33, 0xA002,0x7F32,0x7F31,0xA004,0xA002,0x7F30,0x7F2F,0xA002,0x7F2D,0x7F2C,0xA010,0xA008,0xA004,0xA002,0x7F2B,0x7F2A, 0xA002,0x7F27,0x7F26,0xA004,0xA002,0x7F25,0x7F24,0xA002,0x7F23,0x7F22,0xA008,0xA004,0xA002,0x7F21,0x7F1F,0xA002, 0x7F1B,0x7F1C,0xA004,0xA002,0x7F19,0x7F17,0xA002,0x7F12,0x7F11,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x7F0F, 0x7F0C,0xA002,0x7F0B,0x7F08,0xA004,0xA002,0x7F07,0x7F03,0xA002,0x7F02,0x7F01,0xA008,0xA004,0xA002,0x7EFE,0x7EFB, 0xA002,0x7EFA,0x7EF6,0xA004,0xA002,0x7F0D,0x7EF2,0xA002,0x7EF1,0x7EEF,0xA010,0xA008,0xA004,0xA002,0x7EEE,0x7EEB, 0xA002,0x7EE8,0x7EE1,0xA004,0xA002,0x7EE0,0x7EDB,0xA002,0x7ED7,0x7ED4,0xA008,0xA004,0xA002,0x7ED0,0x7ECC,0xA002, 0x7ECB,0x7EC9,0xA004,0xA002,0x7EC2,0x7EC1,0xA002,0x7EC0,0x7EBE,0xA020,0xA010,0xA008,0xA004,0xA002,0x7EB0,0x7EAD, 0xA002,0x942E,0x942D,0xA004,0xA002,0x942C,0x942B,0xA002,0x942A,0x9429,0xA008,0xA004,0xA002,0x9428,0x9427,0xA002, 0x9426,0x9425,0xA004,0xA002,0x9424,0x9423,0xA002,0x9422,0x9421,0xA010,0xA008,0xA004,0xA002,0x9420,0x941F,0xA002, 0x941E,0x941D,0xA004,0xA002,0x941C,0x941B,0xA002,0x941A,0x9419,0xA008,0xA004,0xA002,0x9418,0x9417,0xA002,0x9416, 0x9415,0xA004,0xA002,0x9414,0x9413,0xA002,0x9412,0x9411,0xA089,0xA07D,0xA03D,0xA01D,0xA00D,0xA006,0xA002,0x9410, 0xA002,0x940F,0x940E,0xA003,0xA001,0x940D,0xA002,0x940C,0x940B,0xA008,0xA004,0xA002,0x940A,0x9409,0xA002,0x9408, 0x9407,0xA004,0xA002,0x9406,0x9405,0xA002,0x9404,0x9403,0xA010,0xA008,0xA004,0xA002,0x9402,0x9401,0xA002,0x9400, 0x93FF,0xA004,0xA002,0x93FE,0x93FD,0xA002,0x93FC,0x93FB,0xA008,0xA004,0xA002,0x93FA,0x93F9,0xA002,0x93F8,0x93F7, 0xA004,0xA002,0x93F6,0x93F5,0xA002,0x93F4,0x93F3,0xA020,0xA010,0xA008,0xA004,0xA002,0x93F2,0x93F1,0xA002,0x93F0, 0x93EF,0xA004,0xA002,0x93EE,0x93ED,0xA002,0x93EC,0x93EB,0xA008,0xA004,0xA002,0x93EA,0x93E9,0xA002,0x93E8,0x93E7, 0xA004,0xA002,0x93E6,0x93E5,0xA002,0x93E4,0x93E3,0xA010,0xA008,0xA004,0xA002,0x93E2,0x93E1,0xA002,0x93E0,0x93DF, 0xA004,0xA002,0x93DE,0x93DD,0xA002,0x93DC,0x93DB,0xA008,0xA004,0xA002,0x93DA,0x93D9,0xA002,0x93D8,0x93D7,0xA004, 0xA002,0x93D5,0x93D4,0xA002,0x93D3,0x93D2,0xA000,0xA000,0xA000,0xA000,0xA004,0xA002,0x93D1,0x93D0,0xA002,0x93CF, 0x93CE,0xA076,0xA036,0xA016,0xA006,0xA001,0xA001,0xA002,0x7EA9,0x7EA8,0xA008,0xA004,0xA002,0x7EA5,0x7EA3,0xA002, 0x7EA1,0x7E9F,0xA004,0xA002,0x9AA7,0x9AA5,0xA002,0x9AA3,0x9AA2,0xA010,0xA008,0xA004,0xA002,0x9AA0,0x9A9F,0xA002, 0x9A9D,0x9A9C,0xA004,0xA002,0x9A9B,0x9A98,0xA002,0x9A96,0x9A93,0xA008,0xA004,0xA002,0x9A92,0x9A90,0xA002,0x9A8A, 0x9A88,0xA004,0xA002,0x9A85,0x9A81,0xA002,0x9A80,0x9A7D,0xA020,0xA010,0xA008,0xA004,0xA002,0x9A7F,0x9A7A,0xA002, 0x9A78,0x9A77,0xA004,0xA002,0x9A75,0x5B62,0xA002,0x5B53,0x5B51,0xA008,0xA004,0xA002,0x5B73,0x5B65,0xA002,0x5B5A, 0x5C1C,0xA004,0xA002,0x5C15,0x5B40,0xA002,0x5B37,0x5B32,0xA010,0xA008,0xA004,0xA002,0x5B16,0x5B17,0xA002,0x5B09, 0x5ADC,0xA004,0xA002,0x5AD8,0x5AE6,0xA002,0x5AD6,0x5AF1,0xA008,0xA004,0xA002,0x5AE3,0x5AE0,0xA002,0x5AB8,0x5AD4, 0xA004,0xA002,0x5AD2,0x5AB2,0xA002,0x5AEB,0x5ABE,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x5A7A,0x5A77,0xA002, 0x5A9B,0x5AAA,0xA004,0xA002,0x80EC,0x5A75,0xA002,0x5A62,0x5A3C,0xA008,0xA004,0xA002,0x5A55,0x5A4A,0xA002,0x5A67, 0x5A40,0xA004,0xA002,0x5A13,0x5A23,0xA002,0x5A11,0x5A34,0xA010,0xA008,0xA004,0xA002,0x5A32,0x5A09,0xA002,0x5A0C, 0x59F9,0xA004,0xA002,0x59D8,0x59E3,0xA002,0x5A08,0x59DD,0xA008,0xA004,0xA002,0x5A06,0x5A05,0xA002,0x59BE,0x59D7, 0xA004,0xA002,0x59AF,0x59B2,0xA002,0x59D2,0x59A4,0xA020,0xA010,0xA008,0xA004,0xA002,0x599E,0x59AB,0xA002,0x59CA, 0x5997,0xA004,0xA002,0x93CD,0x93CC,0xA002,0x93CB,0x93C9,0xA008,0xA004,0xA002,0x93C8,0x93C7,0xA002,0x93C6,0x93C5, 0xA004,0xA002,0x93C4,0x93C3,0xA002,0x93C2,0x93C1,0xA010,0xA008,0xA004,0xA002,0x93C0,0x93BF,0xA002,0x93BE,0x93BD, 0xA004,0xA002,0x93BC,0x93BB,0xA002,0x93BA,0x93B9,0xA008,0xA004,0xA002,0x93B8,0x93B7,0xA002,0x93B6,0x93B5,0xA004, 0xA002,0x93B4,0x93B3,0xA002,0x93B2,0x93B1,0xA5FF,0xA2FE,0xA17D,0xA08D,0xA07D,0xA03D,0xA01D,0xA00D,0xA006,0xA002, 0x93B0,0xA002,0x93AF,0x93AE,0xA004,0xA002,0x93AD,0x93AC,0xA001,0x93AB,0xA008,0xA004,0xA002,0x93AA,0x93A9,0xA002, 0x93A8,0x93A7,0xA004,0xA002,0x93A6,0x93A5,0xA002,0x93A4,0x93A3,0xA010,0xA008,0xA004,0xA002,0x93A2,0x93A1,0xA002, 0x93A0,0x939F,0xA004,0xA002,0x939E,0x939D,0xA002,0x939C,0x939B,0xA008,0xA004,0xA002,0x939A,0x9399,0xA002,0x9398, 0x9397,0xA004,0xA002,0x9396,0x9395,0xA002,0x9394,0x9393,0xA020,0xA010,0xA008,0xA004,0xA002,0x9392,0x9391,0xA002, 0x9390,0x938E,0xA004,0xA002,0x938D,0x938C,0xA002,0x938B,0x938A,0xA008,0xA004,0xA002,0x9389,0x9388,0xA002,0x9387, 0x9386,0xA004,0xA002,0x9385,0x9384,0xA002,0x9383,0x9382,0xA010,0xA008,0xA004,0xA002,0x9381,0x9380,0xA002,0x937F, 0x937E,0xA004,0xA002,0x937D,0x937C,0xA002,0x937B,0x937A,0xA008,0xA004,0xA002,0x9379,0x9378,0xA002,0x9377,0x9376, 0xA004,0xA002,0x9375,0x9374,0xA002,0x9373,0x9372,0xA000,0xA000,0xA000,0xA006,0xA002,0x9371,0xA002,0x9370,0x936F, 0xA004,0xA002,0x936E,0x936D,0xA000,0x936C,0xA070,0xA030,0xA010,0xA001,0xA007,0xA003,0xA001,0x59A3,0xA002,0x59AA, 0x59A9,0xA004,0xA002,0x598D,0x5983,0xA002,0x5981,0x5C6E,0xA010,0xA008,0xA004,0xA002,0x9B3B,0x5F3C,0xA002,0x8274, 0x5F2D,0xA004,0xA002,0x5F29,0x5F2A,0xA002,0x7FBC,0x5C66,0xA008,0xA004,0xA002,0x5C63,0x5B71,0xA002,0x5C59,0x5C50, 0xA004,0xA002,0x54AB,0x5C3B,0xA002,0x5F58,0x5F56,0xA020,0xA010,0xA008,0xA004,0xA002,0x5F57,0x5F50,0xA002,0x908B, 0x9083,0xA004,0xA002,0x9088,0x9082,0xA002,0x907D,0x9074,0xA008,0xA004,0xA002,0x66B9,0x905B,0xA002,0x9062,0x9058, 0xA004,0xA002,0x9068,0x9050,0xA002,0x9052,0x9051,0xA010,0xA008,0xA004,0xA002,0x9044,0x902F,0xA002,0x902D,0x9036, 0xA004,0xA002,0x9035,0x9021,0xA002,0x9016,0x900D,0xA008,0xA004,0xA002,0x9011,0x9026,0xA002,0x900B,0x9004,0xA004, 0xA002,0x9005,0x8FE8,0xA002,0x8FF3,0x8FE6,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x8FE9,0x8FE4,0xA002,0x8FEE, 0x8FE5,0xA004,0xA002,0x8FD5,0x8FD3,0xA002,0x8FB6,0x8B07,0xA008,0xA004,0xA002,0x8E47,0x5BF0,0xA002,0x8930,0x5BEE, 0xA004,0xA002,0x5BE4,0x6434,0xA002,0x9A9E,0x752F,0xA010,0xA008,0xA004,0xA002,0x5BB8,0x5BA5,0xA002,0x5B93,0x5B95, 0xA004,0xA002,0x5B84,0x5B80,0xA002,0x705E,0x704F,0xA008,0xA004,0xA002,0x7035,0x7039,0xA002,0x701B,0x7023,0xA004, 0xA002,0x701A,0x6FEF,0xA002,0x6FE0,0x6FDE,0xA020,0xA010,0xA008,0xA004,0xA002,0x6FEE,0x6FE1,0xA002,0x6FC2,0x6FB6, 0xA004,0xA002,0x6FB9,0x6FA7,0xA002,0x6FC9,0x936B,0xA008,0xA004,0xA002,0x9369,0x9368,0xA002,0x9367,0x9366,0xA004, 0xA002,0x9365,0x9364,0xA002,0x9363,0x9362,0xA010,0xA008,0xA004,0xA002,0x9361,0x9360,0xA002,0x935F,0x935E,0xA004, 0xA002,0x935D,0x935C,0xA002,0x935B,0x935A,0xA008,0xA004,0xA002,0x9359,0x9358,0xA002,0x9357,0x9356,0xA004,0xA002, 0x9355,0x9354,0xA002,0x9353,0x9352,0xA094,0xA07D,0xA03D,0xA01D,0xA00E,0xA006,0xA002,0x9351,0xA002,0x9350,0x934F, 0xA004,0xA002,0x934E,0x934D,0xA002,0x934C,0x934B,0xA007,0xA003,0xA000,0x934A,0xA002,0x9349,0x9348,0xA004,0xA002, 0x9347,0x9346,0xA002,0x9345,0x9344,0xA010,0xA008,0xA004,0xA002,0x9343,0x9342,0xA002,0x9341,0x9340,0xA004,0xA002, 0x933F,0x933D,0xA002,0x933C,0x933B,0xA008,0xA004,0xA002,0x933A,0x9339,0xA002,0x9338,0x9337,0xA004,0xA002,0x9336, 0x9335,0xA002,0x9334,0x9333,0xA020,0xA010,0xA008,0xA004,0xA002,0x9332,0x9331,0xA002,0x9330,0x932F,0xA004,0xA002, 0x932E,0x932D,0xA002,0x932C,0x932B,0xA008,0xA004,0xA002,0x932A,0x9329,0xA002,0x9328,0x9327,0xA004,0xA002,0x9326, 0x9325,0xA002,0x9324,0x9323,0xA010,0xA008,0xA004,0xA002,0x9322,0x9321,0xA002,0x9320,0x931F,0xA004,0xA002,0x931E, 0x931D,0xA002,0x931C,0x931B,0xA008,0xA004,0xA002,0x931A,0x9319,0xA002,0x9318,0x9317,0xA004,0xA002,0x9316,0x9315, 0xA002,0x9314,0x9313,0xA000,0xA000,0xA010,0xA008,0xA004,0xA002,0x9312,0x9311,0xA002,0x9310,0x930F,0xA004,0xA002, 0x930E,0x930D,0xA002,0x930C,0x930B,0xA000,0xA000,0xA000,0x930A,0xA06D,0xA02D,0xA00D,0xA001,0xA004,0xA001,0xA001, 0x6FD1,0xA004,0xA002,0x6F7A,0x6F7C,0xA002,0x6F72,0x6F78,0xA010,0xA008,0xA004,0xA002,0x6F8C,0x6F8D,0xA002,0x6F89, 0x6F29,0xA004,0xA002,0x6F09,0x6F2A,0xA002,0x6F74,0x6F4B,0xA008,0xA004,0xA002,0x6F36,0x6F2F,0xA002,0x6EF9,0x6F15, 0xA004,0xA002,0x6F24,0x6F47,0xA002,0x6F46,0x6F62,0xA020,0xA010,0xA008,0xA004,0xA002,0x6E9F,0x6EC2,0xA002,0x6E8F, 0x6ECF,0xA004,0xA002,0x6EB4,0x6ED7,0xA002,0x6EB7,0x6EBB,0xA008,0xA004,0xA002,0x6EBD,0x6EA7,0xA002,0x6EA5,0x6EE2, 0xA004,0xA002,0x6F2D,0x6EE0,0xA002,0x6E98,0x6EB1,0xA010,0xA008,0xA004,0xA002,0x6EDF,0x6E44,0xA002,0x6E25,0x6E32, 0xA004,0xA002,0x6E54,0x6E53,0xA002,0x6E86,0x6E5F,0xA008,0xA004,0xA002,0x6EB2,0x6E6B,0xA002,0x6E4E,0x6E6E,0xA004, 0xA002,0x6E2B,0x6DAE,0xA002,0x6E0C,0x6DAB,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6E16,0x6DD9,0xA002,0x6DDD, 0x6DE6,0xA004,0xA002,0x6E11,0x6DE0,0xA002,0x6DBF,0x6E0E,0xA008,0xA004,0xA002,0x6DDE,0x6DC5,0xA002,0x6DC7,0x6E1A, 0xA004,0xA002,0x6D63,0x6D7C,0xA002,0x6D60,0x6D5C,0xA010,0xA008,0xA004,0xA002,0x6D94,0x6D93,0xA002,0x6D5E,0x6DA0, 0xA004,0xA002,0x6D9E,0x6D6F,0xA002,0x6D91,0x6D33,0xA008,0xA004,0xA002,0x6D54,0x6D52,0xA002,0x6D4F,0x6D1A,0xA004, 0xA002,0x6D35,0x6D2E,0xA002,0x6D4D,0x6D2B,0xA020,0xA010,0xA008,0xA004,0xA002,0x6D0E,0x6D19,0xA002,0x6D04,0x6D07, 0xA004,0xA002,0x6D48,0x6D43,0xA002,0x6D0C,0x6D27,0xA008,0xA004,0xA002,0x6D39,0x9309,0xA002,0x9308,0x9307,0xA004, 0xA002,0x9306,0x9305,0xA002,0x9304,0x9303,0xA010,0xA008,0xA004,0xA002,0x9302,0x9301,0xA002,0x9300,0x92FF,0xA004, 0xA002,0x92FE,0x92FD,0xA002,0x92FC,0x92FB,0xA008,0xA004,0xA002,0x92FA,0x92F9,0xA002,0x92F8,0x92F7,0xA004,0xA002, 0x92F6,0x92F5,0xA002,0x92F4,0x92F3,0xA180,0xA097,0xA07D,0xA03D,0xA01D,0xA00E,0xA006,0xA002,0x92F2,0xA002,0x92F1, 0x92F0,0xA004,0xA002,0x92EF,0x92EE,0xA002,0x92ED,0x92EC,0xA007,0xA004,0xA002,0x92EB,0x92EA,0xA000,0x92E9,0xA004, 0xA002,0x92E8,0x92E7,0xA002,0x92E6,0x92E5,0xA010,0xA008,0xA004,0xA002,0x92E4,0x92E3,0xA002,0x92E2,0x92E1,0xA004, 0xA002,0x92E0,0x92DF,0xA002,0x92DE,0x92DD,0xA008,0xA004,0xA002,0x92DC,0x92DB,0xA002,0x92DA,0x92D9,0xA004,0xA002, 0x92D8,0x92D7,0xA002,0x92D6,0x92D5,0xA020,0xA010,0xA008,0xA004,0xA002,0x92D4,0x92D3,0xA002,0x92D2,0x92D1,0xA004, 0xA002,0x92D0,0x92CF,0xA002,0x92CE,0x92CD,0xA008,0xA004,0xA002,0x92CC,0x92CB,0xA002,0x92CA,0x92C9,0xA004,0xA002, 0x92C7,0x92C6,0xA002,0x92C5,0x92C4,0xA010,0xA008,0xA004,0xA002,0x92C3,0x92C2,0xA002,0x92C1,0x92C0,0xA004,0xA002, 0x92BF,0x92BE,0xA002,0x92BD,0x92BC,0xA008,0xA004,0xA002,0x92BB,0x92BA,0xA002,0x92B9,0x92B8,0xA004,0xA002,0x92B7, 0x92B6,0xA002,0x92B5,0x92B4,0xA000,0xA000,0xA010,0xA008,0xA004,0xA002,0x92B3,0x92B2,0xA002,0x92B1,0x92B0,0xA004, 0xA002,0x92AF,0x92AD,0xA002,0x92AC,0x92AB,0xA000,0xA004,0xA002,0x92AA,0x92A9,0xA000,0x92A8,0xA069,0xA029,0xA009, 0xA001,0xA001,0xA003,0xA001,0x6CFE,0xA002,0x6CEF,0x6CD3,0xA010,0xA008,0xA004,0xA002,0x6CB1,0x6CEE,0xA002,0x6CEB, 0x6CFA,0xA004,0xA002,0x6CD6,0x6CE0,0xA002,0x6CB2,0x6CD7,0xA008,0xA004,0xA002,0x6CF1,0x6CF8,0xA002,0x6CF7,0x6CAD, 0xA004,0xA002,0x6CD4,0x6CD0,0xA002,0x6CA9,0x6C86,0xA020,0xA010,0xA008,0xA004,0xA002,0x6C76,0x6C74,0xA002,0x6C69, 0x6C68,0xA004,0xA002,0x6C8C,0x6C94,0xA002,0x6C90,0x6C85,0xA008,0xA004,0xA002,0x6CA3,0x6C4A,0xA002,0x6C5C,0x6C54, 0xA004,0xA002,0x6C35,0x6215,0xA002,0x723F,0x4E2C,0xA010,0xA008,0xA004,0xA002,0x961A,0x9619,0xA002,0x9617,0x9616, 0xA004,0xA002,0x9615,0x9612,0xA002,0x960F,0x960D,0xA008,0xA004,0xA002,0x960C,0x960B,0xA002,0x960A,0x9608,0xA004, 0xA002,0x9606,0x9604,0xA002,0x9603,0x95FE,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x95FC,0x95F6,0xA002,0x95F5, 0x95F3,0xA004,0xA002,0x95F1,0x95EB,0xA002,0x95E9,0x96B3,0xA008,0xA004,0xA002,0x5FDD,0x61F5,0xA002,0x61D4,0x61B7, 0xA004,0xA002,0x61A7,0x6194,0xA002,0x61AC,0x6175,0xA010,0xA008,0xA004,0xA002,0x614A,0x612B,0xA002,0x610E,0x6100, 0xA004,0xA002,0x60F4,0x6123,0xA002,0x6115,0x6126,0xA008,0xA004,0xA002,0x6120,0x60B4,0xA002,0x60DA,0x60C6,0xA004, 0xA002,0x60D8,0x60DD,0xA002,0x60B1,0x60BB,0xA020,0xA010,0xA008,0xA004,0xA002,0x60EC,0x609B,0xA002,0x608C,0x6092, 0xA004,0xA002,0x6083,0x609D,0xA002,0x60AD,0x609A,0xA008,0xA004,0xA002,0x6096,0x607D,0xA002,0x606A,0x92A7,0xA004, 0xA002,0x92A6,0x92A5,0xA002,0x92A4,0x92A3,0xA010,0xA008,0xA004,0xA002,0x92A2,0x92A1,0xA002,0x92A0,0x929F,0xA004, 0xA002,0x929E,0x929D,0xA002,0x929C,0x929B,0xA008,0xA004,0xA002,0x929A,0x9299,0xA002,0x9298,0x9297,0xA004,0xA002, 0x9296,0x9295,0xA002,0x9294,0x9293,0xA09B,0xA07D,0xA03D,0xA01D,0xA00E,0xA006,0xA002,0x9292,0xA002,0x9291,0x9290, 0xA004,0xA002,0x928F,0x928D,0xA002,0x928C,0x928B,0xA008,0xA004,0xA002,0x928A,0x9289,0xA002,0x9288,0x9287,0xA003, 0xA000,0x9286,0xA002,0x9285,0x9284,0xA010,0xA008,0xA004,0xA002,0x9283,0x9282,0xA002,0x9281,0x9280,0xA004,0xA002, 0x927F,0x927E,0xA002,0x927D,0x927C,0xA008,0xA004,0xA002,0x927B,0x927A,0xA002,0x9279,0x9278,0xA004,0xA002,0x9277, 0x9276,0xA002,0x9275,0x9273,0xA020,0xA010,0xA008,0xA004,0xA002,0x9272,0x9271,0xA002,0x9270,0x926F,0xA004,0xA002, 0x926E,0x926D,0xA002,0x926C,0x926B,0xA008,0xA004,0xA002,0x926A,0x9269,0xA002,0x9268,0x9267,0xA004,0xA002,0x9266, 0x9265,0xA002,0x9264,0x9263,0xA010,0xA008,0xA004,0xA002,0x9262,0x9261,0xA002,0x9260,0x925F,0xA004,0xA002,0x925E, 0x925D,0xA002,0x925C,0x925B,0xA008,0xA004,0xA002,0x925A,0x9259,0xA002,0x9258,0x9257,0xA004,0xA002,0x9256,0x9255, 0xA002,0x9254,0x9253,0xA000,0xA000,0xA010,0xA008,0xA004,0xA002,0x9252,0x9251,0xA002,0x9250,0x924F,0xA004,0xA002, 0x924E,0x924D,0xA002,0x924C,0x924B,0xA008,0xA004,0xA002,0x924A,0x9249,0xA002,0x9248,0x9247,0xA000,0xA000,0x9246, 0xA066,0xA026,0xA006,0xA001,0xA001,0xA001,0xA001,0x6042,0xA010,0xA008,0xA004,0xA002,0x607A,0x607B,0xA002,0x6079, 0x6078,0xA004,0xA002,0x6021,0x603F,0xA002,0x600A,0x602B,0xA008,0xA004,0xA002,0x6029,0x600D,0xA002,0x600F,0x601B, 0xA004,0xA002,0x6026,0x6035,0xA002,0x6019,0x5FF8,0xA020,0xA010,0xA008,0xA004,0xA002,0x5FED,0x5FEA,0xA002,0x6006, 0x6005,0xA004,0xA002,0x5FFE,0x5FE4,0xA002,0x5FE1,0x6004,0xA008,0xA004,0xA002,0x5FEE,0x6003,0xA002,0x5FCF,0x5FD6, 0xA004,0xA002,0x5FC9,0x5FC4,0xA002,0x81BA,0x5EEA,0xA010,0xA008,0xA004,0xA002,0x5EE8,0x5EDB,0xA002,0x5ED1,0x5ED2, 0xA004,0xA002,0x8D53,0x5EB3,0xA002,0x5EBE,0x5EB5,0xA008,0xA004,0xA002,0x5EB9,0x5EA0,0xA002,0x5EA5,0x5E96,0xA004, 0xA002,0x5E8B,0x5E91,0xA002,0x5E80,0x9995,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x9994,0x9993,0xA002,0x9991, 0x9990,0xA004,0xA002,0x998D,0x998A,0xA002,0x9987,0x9984,0xA008,0xA004,0xA002,0x9980,0x997D,0xA002,0x9977,0x9974, 0xA004,0xA002,0x996C,0x996B,0xA002,0x996A,0x9969,0xA010,0xA008,0xA004,0xA002,0x9968,0x9967,0xA002,0x9963,0x5902, 0xA004,0xA002,0x5924,0x98E7,0xA002,0x5925,0x821B,0xA008,0xA004,0xA002,0x737E,0x736F,0xA002,0x736C,0x7360,0xA004, 0xA002,0x7357,0x734D,0xA002,0x7350,0x7331,0xA020,0xA010,0xA008,0xA004,0xA002,0x7338,0x732C,0xA002,0x7325,0x7339, 0xA004,0xA002,0x7322,0x7315,0xA002,0x731D,0x731E,0xA008,0xA004,0xA002,0x730A,0x7321,0xA002,0x7313,0x7317,0xA004, 0xA002,0x72FB,0x9245,0xA002,0x9244,0x9243,0xA010,0xA008,0xA004,0xA002,0x9242,0x9241,0xA002,0x9240,0x923F,0xA004, 0xA002,0x923E,0x923D,0xA002,0x923C,0x923B,0xA008,0xA004,0xA002,0x923A,0x9239,0xA002,0x9238,0x9237,0xA004,0xA002, 0x9236,0x9235,0xA002,0x9234,0x9233,0xA2FF,0xA17E,0xA09E,0xA07D,0xA03D,0xA01D,0xA00E,0xA006,0xA002,0x9232,0xA002, 0x9231,0x9230,0xA004,0xA002,0x922F,0x922E,0xA002,0x922D,0x922C,0xA008,0xA004,0xA002,0x922B,0x922A,0xA002,0x9229, 0x9228,0xA004,0xA002,0x9227,0x9226,0xA000,0x9225,0xA010,0xA008,0xA004,0xA002,0x9224,0x9223,0xA002,0x9222,0x9221, 0xA004,0xA002,0x9220,0x921F,0xA002,0x921E,0x921D,0xA008,0xA004,0xA002,0x921C,0x921B,0xA002,0x921A,0x9219,0xA004, 0xA002,0x9218,0x9217,0xA002,0x9216,0x9215,0xA020,0xA010,0xA008,0xA004,0xA002,0x9214,0x9213,0xA002,0x9212,0x9211, 0xA004,0xA002,0x9210,0x920F,0xA002,0x920E,0x920D,0xA008,0xA004,0xA002,0x920C,0x920B,0xA002,0x920A,0x9209,0xA004, 0xA002,0x9208,0x9207,0xA002,0x9206,0x9205,0xA010,0xA008,0xA004,0xA002,0x9204,0x9203,0xA002,0x9202,0x9201,0xA004, 0xA002,0x9200,0x91FF,0xA002,0x91FE,0x91FD,0xA008,0xA004,0xA002,0x91FC,0x91FB,0xA002,0x91FA,0x91F9,0xA004,0xA002, 0x91F8,0x91F7,0xA002,0x91F6,0x91F5,0xA000,0xA000,0xA010,0xA008,0xA004,0xA002,0x91F4,0x91F3,0xA002,0x91F2,0x91F1, 0xA004,0xA002,0x91F0,0x91EF,0xA002,0x91EE,0x91ED,0xA008,0xA004,0xA002,0x91EC,0x91EB,0xA002,0x91EA,0x91E9,0xA004, 0xA002,0x91E8,0x91E7,0xA000,0x91E6,0xA060,0xA020,0xA001,0xA00F,0xA007,0xA003,0xA001,0x72FA,0xA002,0x7303,0x72F3, 0xA004,0xA002,0x7301,0x72F7,0xA002,0x72F4,0x72F2,0xA008,0xA004,0xA002,0x72E9,0x72EF,0xA002,0x72E8,0x72D2,0xA004, 0xA002,0x72CD,0x72CE,0xA002,0x72C1,0x72C3,0xA020,0xA010,0xA008,0xA004,0xA002,0x72B8,0x72B7,0xA002,0x72B4,0x72B0, 0xA004,0xA002,0x72AD,0x5F61,0xA002,0x8862,0x5FBC,0xA008,0xA004,0xA002,0x5FB5,0x5FAD,0xA002,0x5FA8,0x5F9C,0xA004, 0xA002,0x5F99,0x5F95,0xA002,0x5F8C,0x5F89,0xA010,0xA008,0xA004,0xA002,0x5F87,0x5F82,0xA002,0x5F77,0x5F73,0xA004, 0xA002,0x5DC5,0x5DB7,0xA002,0x8C73,0x5D9D,0xA008,0xA004,0xA002,0x5D99,0x5D82,0xA002,0x5D74,0x5D69,0xA004,0xA002, 0x5D4A,0x5D4B,0xA002,0x5D6B,0x5D5D,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x5D6F,0x5D5B,0xA002,0x5D6C,0x5D3D, 0xA004,0xA002,0x5D34,0x5D3E,0xA002,0x5D58,0x5D1B,0xA008,0xA004,0xA002,0x5D06,0x5D1E,0xA002,0x5D24,0x5D2E,0xA004, 0xA002,0x5D26,0x5D27,0xA002,0x5D03,0x5D02,0xA010,0xA008,0xA004,0xA002,0x5CE5,0x5CCB,0xA002,0x5CE4,0x5CD2,0xA004, 0xA002,0x5CC4,0x5CB7,0xA002,0x5CC1,0x5CA3,0xA008,0xA004,0xA002,0x5CB1,0x5CAB,0xA002,0x5CAC,0x5CBD,0xA004,0xA002, 0x5CA2,0x5CB5,0xA002,0x5C9C,0x5C9A,0xA020,0xA010,0xA008,0xA004,0xA002,0x5C91,0x5C99,0xA002,0x5C98,0x5C88,0xA004, 0xA002,0x5C96,0x5C90,0xA002,0x5C8D,0x5C7A,0xA008,0xA004,0xA002,0x5C8C,0x5E61,0xA002,0x5E5E,0x5E5B,0xA004,0xA002, 0x5E54,0x5E44,0xA002,0x5E37,0x91E5,0xA010,0xA008,0xA004,0xA002,0x91E4,0x91E3,0xA002,0x91E2,0x91E1,0xA004,0xA002, 0x91E0,0x91DF,0xA002,0x91DE,0x91DD,0xA008,0xA004,0xA002,0x91DB,0x91DA,0xA002,0x91D9,0x91D8,0xA004,0xA002,0x91D7, 0x91D6,0xA002,0x91D5,0x91D4,0xA0A4,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002,0x91D3,0xA002,0x91D2,0x91D0,0xA004, 0xA002,0x91CB,0x91C8,0xA002,0x91C6,0x91C5,0xA008,0xA004,0xA002,0x91C4,0x91C3,0xA002,0x91C2,0x91C1,0xA004,0xA002, 0x91C0,0x91BF,0xA002,0x91BE,0x91BD,0xA00F,0xA007,0xA003,0xA000,0x91BC,0xA002,0x91BB,0x91B9,0xA004,0xA002,0x91B8, 0x91B7,0xA002,0x91B6,0x91B3,0xA008,0xA004,0xA002,0x91B2,0x91B1,0xA002,0x91B0,0x91AC,0xA004,0xA002,0x91AB,0x91A9, 0xA002,0x91A8,0x91A7,0xA020,0xA010,0xA008,0xA004,0xA002,0x91A6,0x91A5,0xA002,0x91A4,0x91A1,0xA004,0xA002,0x91A0, 0x919F,0xA002,0x919E,0x919D,0xA008,0xA004,0xA002,0x919C,0x9199,0xA002,0x9198,0x9197,0xA004,0xA002,0x9196,0x9195, 0xA002,0x9194,0x9193,0xA010,0xA008,0xA004,0xA002,0x918F,0x918E,0xA002,0x918A,0x9188,0xA004,0xA002,0x9186,0x9184, 0xA002,0x9183,0x9182,0xA008,0xA004,0xA002,0x9181,0x9180,0xA002,0x917C,0x917B,0xA004,0xA002,0x917A,0x9173,0xA002, 0x916D,0x916B,0xA000,0xA020,0xA010,0xA008,0xA004,0xA002,0x9168,0x9167,0xA002,0x9166,0x9160,0xA004,0xA002,0x915F, 0x915C,0xA002,0x915B,0x9159,0xA008,0xA004,0xA002,0x9158,0x9156,0xA002,0x9155,0x9154,0xA004,0xA002,0x9153,0x9151, 0xA002,0x9148,0x9147,0xA000,0xA000,0xA000,0xA000,0x9145,0xA05D,0xA01D,0xA001,0xA00C,0xA004,0xA001,0xA001,0x5E3C, 0xA004,0xA002,0x5E3B,0x5E31,0xA002,0x5E11,0x5E14,0xA008,0xA004,0xA002,0x5E19,0x5E0F,0xA002,0x571C,0x5709,0xA004, 0xA002,0x570A,0x5704,0xA002,0x56FF,0x56F9,0xA020,0xA010,0xA008,0xA004,0xA002,0x56EB,0x56F5,0xA002,0x56E1,0x56DD, 0xA004,0xA002,0x56D7,0x56D4,0xA002,0x56AF,0x5693,0xA008,0xA004,0xA002,0x5685,0x567C,0xA002,0x567B,0x566B,0xA004, 0xA002,0x5671,0x5664,0xA002,0x5686,0x5654,0xA010,0xA008,0xA004,0xA002,0x564C,0x565C,0xA002,0x5659,0x5662,0xA004, 0xA002,0x564D,0x562C,0xA002,0x5657,0x5639,0xA008,0xA004,0xA002,0x5658,0x562D,0xA002,0x5627,0x5600,0xA004,0xA002, 0x55FE,0x5623,0xA002,0x5624,0x5601,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x560C,0x5608,0xA002,0x561E,0x8F94, 0xA004,0xA002,0x55E4,0x55F5,0xA002,0x55E8,0x55CD,0xA008,0xA004,0xA002,0x55CC,0x55F3,0xA002,0x55F2,0x55E5,0xA004, 0xA002,0x55EF,0x55C4,0xA002,0x55DD,0x55E6,0xA010,0xA008,0xA004,0xA002,0x55D4,0x55EC,0xA002,0x55EB,0x55D1,0xA004, 0xA002,0x561F,0x55C9,0xA002,0x55F7,0x55EA,0xA008,0xA004,0xA002,0x5599,0x5594,0xA002,0x55BE,0x55BD,0xA004,0xA002, 0x55DF,0x557B,0xA002,0x5591,0x55D6,0xA020,0xA010,0xA008,0xA004,0xA002,0x557E,0x559F,0xA002,0x5581,0x5588,0xA004, 0xA002,0x55B9,0x55B1,0xA002,0x5583,0x55D2,0xA008,0xA004,0xA002,0x558B,0x555C,0xA002,0x5530,0x5533,0xA004,0xA002, 0x5577,0x5576,0xA002,0x5575,0x5556,0xA010,0xA008,0xA004,0xA002,0x5537,0x9144,0xA002,0x9142,0x9141,0xA004,0xA002, 0x9140,0x913F,0xA002,0x913E,0x913D,0xA008,0xA004,0xA002,0x913C,0x913B,0xA002,0x913A,0x9138,0xA004,0xA002,0x9137, 0x9136,0xA002,0x9135,0x9134,0xA180,0xA0A7,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002,0x9133,0xA002,0x9132,0x9130, 0xA004,0xA002,0x912E,0x912D,0xA002,0x912C,0x912B,0xA008,0xA004,0xA002,0x912A,0x9129,0xA002,0x9128,0x9127,0xA004, 0xA002,0x9126,0x9125,0xA002,0x9124,0x9121,0xA00F,0xA007,0xA004,0xA002,0x9120,0x911F,0xA000,0x911D,0xA004,0xA002, 0x911C,0x911B,0xA002,0x911A,0x9118,0xA008,0xA004,0xA002,0x9117,0x9116,0xA002,0x9115,0x9114,0xA004,0xA002,0x9113, 0x9112,0xA002,0x9111,0x9110,0xA020,0xA010,0xA008,0xA004,0xA002,0x910F,0x910E,0xA002,0x910D,0x910C,0xA004,0xA002, 0x910B,0x910A,0xA002,0x9109,0x9108,0xA008,0xA004,0xA002,0x9107,0x9106,0xA002,0x9105,0x9103,0xA004,0xA002,0x9101, 0x9100,0xA002,0x90FF,0x90FC,0xA010,0xA008,0xA004,0xA002,0x90FB,0x90FA,0xA002,0x90F9,0x90F7,0xA004,0xA002,0x90F6, 0x90F5,0xA002,0x90F3,0x90F2,0xA008,0xA004,0xA002,0x90F1,0x90F0,0xA002,0x90EE,0x90EC,0xA004,0xA002,0x90EA,0x90E9, 0xA002,0x90E5,0x90E4,0xA000,0xA020,0xA010,0xA008,0xA004,0xA002,0x90E3,0x90E0,0xA002,0x90DF,0x90DE,0xA004,0xA002, 0x90DA,0x90D9,0xA002,0x90D8,0x90D6,0xA008,0xA004,0xA002,0x90D5,0x90D4,0xA002,0x90D2,0x90CD,0xA004,0xA002,0x90CC, 0x90CB,0xA002,0x90C9,0x90C8,0xA000,0xA000,0xA004,0xA002,0x90C6,0x90C3,0xA000,0x90C2,0xA059,0xA019,0xA001,0xA008, 0xA001,0xA003,0xA001,0x553C,0xA002,0x5550,0x553F,0xA008,0xA004,0xA002,0x5555,0x5541,0xA002,0x556D,0x5549,0xA004, 0xA002,0x55B5,0x558F,0xA002,0x5567,0x552A,0xA020,0xA010,0xA008,0xA004,0xA002,0x5527,0x5511,0xA002,0x550F,0x5523, 0xA004,0xA002,0x5522,0x54F3,0xA002,0x5514,0x54FD,0xA008,0xA004,0xA002,0x5520,0x54E7,0xA002,0x551B,0x54DE,0xA004, 0xA002,0x54CF,0x54DD,0xA002,0x54A4,0x54AA,0xA010,0xA008,0xA004,0xA002,0x54A9,0x54DC,0xA002,0x54DA,0x54D9,0xA004, 0xA002,0x54CC,0x54BF,0xA002,0x54BB,0x54D5,0xA008,0xA004,0xA002,0x54A3,0x5472,0xA002,0x54D4,0x54D3,0xA004,0xA002, 0x54A6,0x54A7,0xA002,0x54D2,0x54B4,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x54C2,0x54AD,0xA002,0x54D0,0x549D, 0xA004,0xA002,0x5466,0x5476,0xA002,0x5484,0x549B,0xA008,0xA004,0xA002,0x549A,0x5464,0xA002,0x5471,0x5477,0xA004, 0xA002,0x5494,0x5482,0xA002,0x5432,0x5423,0xA010,0xA008,0xA004,0xA002,0x5459,0x5457,0xA002,0x5421,0x5443,0xA004, 0xA002,0x5456,0x5454,0xA002,0x5453,0x5452,0xA008,0xA004,0xA002,0x544B,0x5406,0xA002,0x5416,0x5412,0xA004,0xA002, 0x53FB,0x53E8,0xA002,0x53E9,0x53FD,0xA020,0xA010,0xA008,0xA004,0xA002,0x53F1,0x535F,0xA002,0x5F11,0x7519,0xA004, 0xA002,0x5FD2,0x5F0B,0xA002,0x652E,0x6525,0xA008,0xA004,0xA002,0x6509,0x64E2,0xA002,0x64E4,0x64D7,0xA004,0xA002, 0x64D0,0x64C0,0xA002,0x64BA,0x6499,0xA010,0xA008,0xA004,0xA002,0x64B8,0x64B7,0xA002,0x647A,0x90C0,0xA004,0xA002, 0x90BF,0x90BD,0xA002,0x90BC,0x90B7,0xA008,0xA004,0xA002,0x90B2,0x90AD,0xA002,0x90AB,0x90A9,0xA004,0xA002,0x90A8, 0x90A7,0xA002,0x90A5,0x90A4,0xA0AB,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002,0x90A0,0xA002,0x909F,0x909E,0xA004, 0xA002,0x909C,0x909A,0xA002,0x9098,0x9096,0xA008,0xA004,0xA002,0x9094,0x9092,0xA002,0x9090,0x908F,0xA004,0xA002, 0x908E,0x908D,0xA002,0x908C,0x908A,0xA00F,0xA008,0xA004,0xA002,0x9089,0x9087,0xA002,0x9086,0x9085,0xA003,0xA000, 0x9084,0xA002,0x9081,0x907E,0xA008,0xA004,0xA002,0x907C,0x907B,0xA002,0x907A,0x9079,0xA004,0xA002,0x9078,0x9077, 0xA002,0x9076,0x9073,0xA020,0xA010,0xA008,0xA004,0xA002,0x9072,0x9071,0xA002,0x9070,0x906F,0xA004,0xA002,0x906C, 0x906B,0xA002,0x906A,0x9069,0xA008,0xA004,0xA002,0x9067,0x9066,0xA002,0x9064,0x9061,0xA004,0xA002,0x9060,0x905F, 0xA002,0x905E,0x905D,0xA010,0xA008,0xA004,0xA002,0x905C,0x905A,0xA002,0x9059,0x9056,0xA004,0xA002,0x9055,0x9054, 0xA002,0x904E,0x904C,0xA008,0xA004,0xA002,0x904B,0x904A,0xA002,0x9049,0x9048,0xA004,0xA002,0x9046,0x9045,0xA002, 0x9043,0x9040,0xA000,0xA020,0xA010,0xA008,0xA004,0xA002,0x903F,0x903D,0xA002,0x903A,0x9039,0xA004,0xA002,0x9037, 0x9034,0xA002,0x9033,0x9032,0xA008,0xA004,0xA002,0x9031,0x9030,0xA002,0x902C,0x902B,0xA004,0xA002,0x902A,0x9029, 0xA002,0x9028,0x9027,0xA000,0xA008,0xA004,0xA002,0x9025,0x9024,0xA002,0x9023,0x901C,0xA000,0xA000,0x9019,0xA056, 0xA016,0xA001,0xA005,0xA001,0xA001,0xA001,0x6496,0xA008,0xA004,0xA002,0x646D,0x6484,0xA002,0x645E,0x6421,0xA004, 0xA002,0x6426,0x640C,0xA002,0x6420,0x641B,0xA020,0xA010,0xA008,0xA004,0xA002,0x640B,0x6441,0xA002,0x6445,0x63BE, 0xA004,0xA002,0x63C6,0x6452,0xA002,0x63CE,0x63DE,0xA008,0xA004,0xA002,0x63C4,0x63FF,0xA002,0x63E0,0x63F8,0xA004, 0xA002,0x63F2,0x63BC,0xA002,0x63AE,0x6369,0xA010,0xA008,0xA004,0xA002,0x638A,0x63AC,0xA002,0x636D,0x63B4,0xA004, 0xA002,0x638E,0x637A,0xA002,0x6371,0x63F6,0xA008,0xA004,0xA002,0x63AD,0x6343,0xA002,0x634B,0x6339,0xA004,0xA002, 0x62F6,0x6322,0xA002,0x62EE,0x62D7,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x62DA,0x62CA,0xA002,0x62BB,0x629F, 0xA004,0xA002,0x626A,0x624C,0xA002,0x5C34,0x5C2C,0xA008,0xA004,0xA002,0x5C25,0x5C22,0xA002,0x530F,0x5958,0xA004, 0xA002,0x595A,0x5955,0xA002,0x8037,0x5941,0xA010,0xA008,0xA004,0xA002,0x593C,0x5F08,0xA002,0x5EFE,0x863C,0xA004, 0xA002,0x8616,0x8629,0xA002,0x8605,0x8627,0xA008,0xA004,0xA002,0x85FF,0x85DC,0xA002,0x85C1,0x85D3,0xA004,0xA002, 0x85B0,0x85B7,0xA002,0x85B9,0x8585,0xA020,0xA010,0xA008,0xA004,0xA002,0x859C,0x85AE,0xA002,0x8579,0x858F,0xA004, 0xA002,0x8587,0x85A8,0xA002,0x85A4,0x857B,0xA008,0xA004,0xA002,0x8572,0x8543,0xA002,0x77A2,0x857A,0xA004,0xA002, 0x855E,0x8564,0xA002,0x8568,0x8548,0xA010,0xA008,0xA004,0xA002,0x8559,0x84FC,0xA002,0x84FF,0x853B,0xA004,0xA002, 0x8556,0x9018,0xA002,0x9015,0x9013,0xA008,0xA004,0xA002,0x900E,0x900C,0xA002,0x9008,0x9007,0xA004,0xA002,0x8FFF, 0x8FFE,0xA002,0x8FFC,0x8FFB,0xB7DA,0xABEA,0xA5F6,0xA2FB,0xA17C,0xA0AD,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002, 0x8FFA,0xA002,0x8FF6,0x8FF5,0xA004,0xA002,0x8FF4,0x8FF2,0xA002,0x8FF1,0x8FEF,0xA008,0xA004,0xA002,0x8FEC,0x8FE7, 0xA002,0x8FE3,0x8FE1,0xA004,0xA002,0x8FE0,0x8FDA,0xA002,0x8FD7,0x8FD6,0xA00F,0xA008,0xA004,0xA002,0x8FD2,0x8FCF, 0xA002,0x8FCD,0x8FCC,0xA004,0xA002,0x8FCB,0x8FCA,0xA000,0x8FC9,0xA008,0xA004,0xA002,0x8FC6,0x8FC3,0xA002,0x8FC0, 0x8FBF,0xA004,0xA002,0x8FBC,0x8FBB,0xA002,0x8FBA,0x8FB8,0xA020,0xA010,0xA008,0xA004,0xA002,0x8FB7,0x8FB5,0xA002, 0x8FB4,0x8FB3,0xA004,0xA002,0x8FB2,0x8FAF,0xA002,0x8FAE,0x8FAD,0xA008,0xA004,0xA002,0x8FAC,0x8FAA,0xA002,0x8FA7, 0x8FA6,0xA004,0xA002,0x8FA5,0x8FA4,0xA002,0x8FA2,0x8FA1,0xA010,0xA008,0xA004,0xA002,0x8FA0,0x8F9D,0xA002,0x8F92, 0x8F8C,0xA004,0xA002,0x8F80,0x8F6A,0xA002,0x8F65,0x8F64,0xA008,0xA004,0xA002,0x8F63,0x8F62,0xA002,0x8F61,0x8F60, 0xA004,0xA002,0x8F5F,0x8F5E,0xA002,0x8F5D,0x8F5C,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x8F5B,0xA002,0x8F5A,0x8F59, 0xA004,0xA002,0x8F58,0x8F57,0xA002,0x8F56,0x8F55,0xA008,0xA004,0xA002,0x8F54,0x8F53,0xA002,0x8F52,0x8F51,0xA004, 0xA002,0x8F50,0x8F4F,0xA002,0x8F4E,0x8F4D,0xA000,0xA008,0xA004,0xA002,0x8F4C,0x8F4B,0xA002,0x8F4A,0x8F49,0xA004, 0xA002,0x8F48,0x8F47,0xA002,0x8F46,0x8F45,0xA04F,0xA00F,0xA001,0xA001,0xA005,0xA001,0xA002,0x853A,0x851F,0xA004, 0xA002,0x8539,0x84F0,0xA002,0x8538,0x750D,0xA020,0xA010,0xA008,0xA004,0xA002,0x850C,0x84E3,0xA002,0x84E5,0x8497, 0xA004,0xA002,0x84B4,0x84B9,0xA002,0x84A1,0x84E0,0xA008,0xA004,0xA002,0x84BA,0x84BF,0xA002,0x84CA,0x84D3,0xA004, 0xA002,0x84BD,0x84E6,0xA002,0x84D0,0x84CD,0xA010,0xA008,0xA004,0xA002,0x84C1,0x846D,0xA002,0x8431,0x848E,0xA004, 0xA002,0x848C,0x8476,0xA002,0x8469,0x8446,0xA008,0xA004,0xA002,0x843C,0x8478,0xA002,0x8489,0x847A,0xA004,0xA002, 0x8488,0x8487,0xA002,0x8473,0x8459,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x845A,0x8451,0xA002,0x845C,0x83E1, 0xA004,0xA002,0x83F0,0x8426,0xA002,0x83C0,0x83C5,0xA008,0xA004,0xA002,0x83EA,0x83F9,0xA002,0x83F8,0x8403,0xA004, 0xA002,0x840F,0x83DF,0xA002,0x83D4,0x8406,0xA010,0xA008,0xA004,0xA002,0x8411,0x8438,0xA002,0x841C,0x83D6,0xA004, 0xA002,0x83FD,0x83DD,0xA002,0x840B,0x8418,0xA008,0xA004,0xA002,0x5807,0x83D8,0xA002,0x83E5,0x8401,0xA004,0xA002, 0x83C1,0x83BC,0xA002,0x83BA,0x83A8,0xA020,0xA010,0xA008,0xA004,0xA002,0x839E,0x8398,0xA002,0x837B,0x83B8,0xA004, 0xA002,0x837D,0x83A9,0xA002,0x83B6,0x837C,0xA008,0xA004,0xA002,0x8385,0x839C,0xA002,0x8393,0x83AA,0xA004,0xA002, 0x83A0,0x83B4,0xA002,0x83B3,0x8378,0xA010,0xA008,0xA004,0xA002,0x83B0,0x836E,0xA002,0x836D,0x836A,0xA004,0xA002, 0x836C,0x8369,0xA002,0x831B,0x8368,0xA008,0xA004,0xA002,0x8F44,0x8F43,0xA002,0x8F42,0x8F41,0xA004,0xA002,0x8F40, 0x8F3F,0xA002,0x8F3E,0x8F3D,0xA0B4,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002,0x8F3C,0xA002,0x8F3B,0x8F3A,0xA004, 0xA002,0x8F39,0x8F38,0xA002,0x8F37,0x8F36,0xA008,0xA004,0xA002,0x8F35,0x8F34,0xA002,0x8F33,0x8F32,0xA004,0xA002, 0x8F31,0x8F30,0xA002,0x8F2F,0x8F2E,0xA010,0xA008,0xA004,0xA002,0x8F2D,0x8F2C,0xA002,0x8F2B,0x8F2A,0xA004,0xA002, 0x8F29,0x8F28,0xA002,0x8F27,0x8F26,0xA007,0xA004,0xA002,0x8F25,0x8F24,0xA001,0x8F23,0xA004,0xA002,0x8F22,0x8F21, 0xA002,0x8F20,0x8F1F,0xA020,0xA010,0xA008,0xA004,0xA002,0x8F1E,0x8F1D,0xA002,0x8F1C,0x8F1B,0xA004,0xA002,0x8F1A, 0x8F19,0xA002,0x8F18,0x8F17,0xA008,0xA004,0xA002,0x8F16,0x8F15,0xA002,0x8F14,0x8F13,0xA004,0xA002,0x8F12,0x8F11, 0xA002,0x8F10,0x8F0F,0xA010,0xA008,0xA004,0xA002,0x8F0E,0x8F0D,0xA002,0x8F0C,0x8F0B,0xA004,0xA002,0x8F0A,0x8F09, 0xA002,0x8F08,0x8F07,0xA008,0xA004,0xA002,0x8F06,0x8F05,0xA002,0x8F04,0x8F03,0xA004,0xA002,0x8F02,0x8F01,0xA002, 0x8F00,0x8EFF,0xA000,0xA020,0xA010,0xA008,0xA004,0xA002,0x8EFE,0x8EFD,0xA002,0x8EFC,0x8EFB,0xA004,0xA002,0x8EFA, 0x8EF9,0xA002,0x8EF8,0x8EF7,0xA008,0xA004,0xA002,0x8EF6,0x8EF5,0xA002,0x8EF4,0x8EF3,0xA004,0xA002,0x8EF2,0x8EF1, 0xA002,0x8EF0,0x8EEF,0xA010,0xA008,0xA004,0xA002,0x8EEE,0x8EED,0xA002,0x8EEC,0x8EEB,0xA004,0xA002,0x8EEA,0x8EE9, 0xA002,0x8EE8,0x8EE7,0xA000,0xA000,0xA002,0x8EE6,0x8EE5,0xA04B,0xA00B,0xA001,0xA001,0xA001,0xA004,0xA002,0x8365, 0x8366,0xA002,0x8333,0x833A,0xA020,0xA010,0xA008,0xA004,0xA002,0x832D,0x8360,0xA002,0x8317,0x8340,0xA004,0xA002, 0x835F,0x8343,0xA002,0x8347,0x834F,0xA008,0xA004,0xA002,0x832F,0x835E,0xA002,0x839B,0x8331,0xA004,0xA002,0x8334, 0x833C,0xA002,0x8392,0x8308,0xA010,0xA008,0xA004,0xA002,0x835C,0x835B,0xA002,0x8351,0x831C,0xA004,0xA002,0x82D5, 0x82E0,0xA002,0x8315,0x8314,0xA008,0xA004,0xA002,0x8306,0x831A,0xA002,0x8311,0x82D3,0xA004,0xA002,0x82FB,0x830C, 0xA002,0x82D8,0x82D2,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x82F4,0x82DC,0xA002,0x8307,0x830F,0xA004,0xA002, 0x82E4,0x82F7,0xA002,0x8309,0x82E1,0xA008,0xA004,0xA002,0x82A4,0x82CE,0xA002,0x82C4,0x829F,0xA004,0xA002,0x82AA, 0x82A1,0xA002,0x82B4,0x82A9,0xA010,0xA008,0xA004,0xA002,0x82C1,0x82CC,0xA002,0x82CB,0x82AE,0xA004,0xA002,0x82B7, 0x8298,0xA002,0x82E3,0x82CA,0xA008,0xA004,0xA002,0x82C8,0x82B0,0xA002,0x82BE,0x82B8,0xA004,0xA002,0x82AB,0x8299, 0xA002,0x8297,0x8291,0xA020,0xA010,0xA008,0xA004,0xA002,0x828E,0x8284,0xA002,0x82A8,0x828A,0xA004,0xA002,0x828F, 0x827F,0xA002,0x827D,0x8279,0xA008,0xA004,0xA002,0x61FF,0x9F19,0xA002,0x99A8,0x5880,0xA004,0xA002,0x589A,0x5889, 0xA002,0x5881,0x586C,0xA010,0xA008,0xA004,0xA002,0x5865,0x5820,0xA002,0x5844,0x5819,0xA004,0xA002,0x581E,0x5800, 0xA002,0x57ED,0x57FD,0xA008,0xA004,0xA002,0x580D,0x580B,0xA002,0x8EE4,0x8EE3,0xA004,0xA002,0x8EE2,0x8EE1,0xA002, 0x8EE0,0x8EDF,0xA17F,0xA0B7,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002,0x8EDE,0xA002,0x8EDD,0x8EDC,0xA004,0xA002, 0x8EDB,0x8EDA,0xA002,0x8ED9,0x8ED8,0xA008,0xA004,0xA002,0x8ED7,0x8ED6,0xA002,0x8ED5,0x8ED4,0xA004,0xA002,0x8ED3, 0x8ED2,0xA002,0x8ED1,0x8ED0,0xA010,0xA008,0xA004,0xA002,0x8ECF,0x8ECD,0xA002,0x8ECC,0x8ECB,0xA004,0xA002,0x8ECA, 0x8EC9,0xA002,0x8EC8,0x8EC7,0xA008,0xA004,0xA002,0x8EC6,0x8EC5,0xA002,0x8EC4,0x8EC3,0xA003,0xA001,0x8EC2,0xA002, 0x8EC1,0x8EC0,0xA020,0xA010,0xA008,0xA004,0xA002,0x8EBF,0x8EBE,0xA002,0x8EBD,0x8EBC,0xA004,0xA002,0x8EBB,0x8EB9, 0xA002,0x8EB8,0x8EB7,0xA008,0xA004,0xA002,0x8EB6,0x8EB5,0xA002,0x8EB4,0x8EB3,0xA004,0xA002,0x8EB1,0x8EB0,0xA002, 0x8EAE,0x8EAD,0xA010,0xA008,0xA004,0xA002,0x8EAA,0x8EA9,0xA002,0x8EA8,0x8EA7,0xA004,0xA002,0x8EA6,0x8EA5,0xA002, 0x8EA4,0x8EA3,0xA008,0xA004,0xA002,0x8EA2,0x8EA1,0xA002,0x8EA0,0x8E9F,0xA004,0xA002,0x8E9D,0x8E9B,0xA002,0x8E9A, 0x8E99,0xA000,0xA020,0xA010,0xA008,0xA004,0xA002,0x8E98,0x8E97,0xA002,0x8E96,0x8E95,0xA004,0xA002,0x8E93,0x8E92, 0xA002,0x8E91,0x8E8E,0xA008,0xA004,0xA002,0x8E8D,0x8E8C,0xA002,0x8E8B,0x8E8A,0xA004,0xA002,0x8E89,0x8E88,0xA002, 0x8E86,0x8E84,0xA010,0xA008,0xA004,0xA002,0x8E83,0x8E82,0xA002,0x8E80,0x8E7E,0xA004,0xA002,0x8E7D,0x8E7B,0xA002, 0x8E7A,0x8E79,0xA000,0xA004,0xA002,0x8E78,0x8E77,0xA002,0x8E75,0x8E73,0xA048,0xA008,0xA001,0xA001,0xA001,0xA001, 0xA002,0x57DD,0x57E4,0xA020,0xA010,0xA008,0xA004,0xA002,0x57F8,0x57EF,0xA002,0x57F4,0x57B8,0xA004,0xA002,0x57D2, 0x57D9,0xA002,0x57DA,0x57D8,0xA008,0xA004,0xA002,0x57D5,0x57A0,0xA002,0x5793,0x57B4,0xA004,0xA002,0x57A7,0x57CF, 0xA002,0x57B2,0x578C,0xA010,0xA008,0xA004,0xA002,0x57A4,0x57AD,0xA002,0x5773,0x5776,0xA004,0xA002,0x576D,0x5768, 0xA002,0x577B,0x577C,0xA008,0xA004,0xA002,0x5786,0x576B,0xA002,0x5785,0x5769,0xA004,0xA002,0x5742,0x573B,0xA002, 0x575C,0x572F,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x572E,0x5739,0xA002,0x5733,0x572A,0xA004,0xA002,0x572C, 0x5729,0xA002,0x58D1,0x58C5,0xA008,0xA004,0xA002,0x58BC,0x587E,0xA002,0x57A1,0x57A9,0xA004,0xA002,0x574C,0x5DEF, 0xA002,0x755A,0x5F01,0xA010,0xA008,0xA004,0xA002,0x53B6,0x9B2F,0xA002,0x51FC,0x51F5,0xA004,0xA002,0x5EF4,0x77CD, 0xA002,0x71EE,0x53DF,0xA008,0xA004,0xA002,0x52F0,0x52D6,0xA002,0x52D0,0x54FF,0xA004,0xA002,0x52BE,0x52AD,0xA002, 0x52AC,0x52A2,0xA020,0xA010,0xA008,0xA004,0xA002,0x5942,0x520D,0xA002,0x9146,0x9143,0xA004,0xA002,0x9139,0x912F, 0xA002,0x9131,0x9123,0xA008,0xA004,0xA002,0x911E,0x9122,0xA002,0x9104,0x90FE,0xA004,0xA002,0x90EF,0x90EB,0xA002, 0x90DB,0x90D7,0xA010,0xA008,0xA004,0xA002,0x90DC,0x90E2,0xA002,0x90E6,0x90D3,0xA004,0xA002,0x90C7,0x90C4,0xA002, 0x90D0,0x90BE,0xA008,0xA004,0xA002,0x90C5,0x90CF,0xA002,0x90B0,0x90B8,0xA004,0xA002,0x8E71,0x8E6E,0xA002,0x8E6B, 0x8E6A,0xA0BB,0xA07D,0xA03D,0xA01E,0xA00E,0xA006,0xA002,0x8E68,0xA002,0x8E67,0x8E65,0xA004,0xA002,0x8E64,0x8E63, 0xA002,0x8E62,0x8E61,0xA008,0xA004,0xA002,0x8E60,0x8E5F,0xA002,0x8E5E,0x8E5D,0xA004,0xA002,0x8E5C,0x8E5B,0xA002, 0x8E5A,0x8E58,0xA010,0xA008,0xA004,0xA002,0x8E57,0x8E56,0xA002,0x8E55,0x8E54,0xA004,0xA002,0x8E53,0x8E50,0xA002, 0x8E4F,0x8E4E,0xA008,0xA004,0xA002,0x8E4D,0x8E4C,0xA002,0x8E46,0x8E45,0xA004,0xA002,0x8E43,0x8E3F,0xA001,0x8E3E, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8E3C,0x8E3B,0xA002,0x8E38,0x8E37,0xA004,0xA002,0x8E36,0x8E34,0xA002,0x8E33, 0x8E32,0xA008,0xA004,0xA002,0x8E30,0x8E2D,0xA002,0x8E2B,0x8E28,0xA004,0xA002,0x8E27,0x8E26,0xA002,0x8E25,0x8E24, 0xA010,0xA008,0xA004,0xA002,0x8E21,0x8E20,0xA002,0x8E1C,0x8E1B,0xA004,0xA002,0x8E1A,0x8E19,0xA002,0x8E18,0x8E17, 0xA008,0xA004,0xA002,0x8E16,0x8E15,0xA002,0x8E13,0x8E12,0xA004,0xA002,0x8E11,0x8E10,0xA002,0x8E0E,0x8E0D,0xA000, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8E0B,0x8E08,0xA002,0x8E07,0x8E06,0xA004,0xA002,0x8E04,0x8E03,0xA002,0x8E02, 0x8E01,0xA008,0xA004,0xA002,0x8E00,0x8DFF,0xA002,0x8DFE,0x8DFC,0xA004,0xA002,0x8DF6,0x8DF4,0xA002,0x8DF2,0x8DF1, 0xA010,0xA008,0xA004,0xA002,0x8DF0,0x8DEE,0xA002,0x8DED,0x8DE9,0xA004,0xA002,0x8DE7,0x8DE6,0xA002,0x8DE5,0x8DE2, 0xA008,0xA004,0xA002,0x8DE1,0x8DE0,0xA002,0x8DDC,0x8DD9,0xA000,0xA002,0x8DD8,0x8DD5,0xA041,0xA001,0xA020,0xA010, 0xA008,0xA004,0xA002,0x90BA,0x90B6,0xA002,0x90B3,0x90B4,0xA004,0xA002,0x90A1,0x90AC,0xA002,0x9099,0x909D,0xA008, 0xA004,0xA002,0x909B,0x9097,0xA002,0x96B0,0x9697,0xA004,0xA002,0x968D,0x9688,0xA002,0x9674,0x9672,0xA010,0xA008, 0xA004,0xA002,0x966C,0x9667,0xA002,0x965F,0x9654,0xA004,0xA002,0x9649,0x9642,0xA002,0x963C,0x963D,0xA008,0xA004, 0xA002,0x962A,0x9631,0xA002,0x9621,0x9622,0xA004,0xA002,0x961D,0x537A,0xA002,0x5369,0x8C36,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x8C35,0x8C33,0xA002,0x8C32,0x8C2F,0xA004,0xA002,0x8C2E,0x8C2B,0xA002,0x8C2A,0x8C27,0xA008, 0xA004,0xA002,0x8C25,0x8C21,0xA002,0x8C20,0x8C1F,0xA004,0xA002,0x8C1D,0x8C18,0xA002,0x8C1B,0x8C19,0xA010,0xA008, 0xA004,0xA002,0x8C16,0x8C15,0xA002,0x8C14,0x8C12,0xA004,0xA002,0x8C11,0x8C0F,0xA002,0x8C0C,0x8C07,0xA008,0xA004, 0xA002,0x8C04,0x8C02,0xA002,0x8C00,0x8BFF,0xA004,0xA002,0x8BFC,0x8BF9,0xA002,0x8BF6,0x8BF3,0xA020,0xA010,0xA008, 0xA004,0xA002,0x8BF0,0x8BEE,0xA002,0x8BE9,0x8BE8,0xA004,0xA002,0x8BE4,0x8BE0,0xA002,0x8BDF,0x8BDC,0xA008,0xA004, 0xA002,0x8BD9,0x8BD8,0xA002,0x8BD6,0x8BD4,0xA004,0xA002,0x8BD3,0x8BD2,0xA002,0x8BCE,0x8BCF,0xA010,0xA008,0xA004, 0xA002,0x8BCB,0x8BC3,0xA002,0x8BC2,0x8BB7,0xA004,0xA002,0x8BB5,0x8BB4,0xA002,0x8BAA,0x8BA7,0xA008,0xA004,0xA002, 0x8BA6,0x8BA0,0xA002,0x51A5,0x51A2,0xA004,0xA002,0x5196,0x51C7,0xA002,0x8DD4,0x8DD3,0xA2FF,0xA17F,0xA0C2,0xA07D, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x8DD2,0xA002,0x8DD0,0x8DCD,0xA004,0xA002,0x8DCA,0x8DC9,0xA002,0x8DC8,0x8DC7, 0xA008,0xA004,0xA002,0x8DC5,0x8DC2,0xA002,0x8DC1,0x8DC0,0xA004,0xA002,0x8DBD,0x8DBB,0xA002,0x8DB9,0x8DB7,0xA010, 0xA008,0xA004,0xA002,0x8DB6,0x8DB2,0xA002,0x8DB0,0x8DAF,0xA004,0xA002,0x8DAE,0x8DAD,0xA002,0x8DAC,0x8DAB,0xA008, 0xA004,0xA002,0x8DAA,0x8DA9,0xA002,0x8DA8,0x8DA7,0xA004,0xA002,0x8DA6,0x8DA5,0xA002,0x8DA4,0x8DA2,0xA01F,0xA00F, 0xA007,0xA003,0xA001,0x8DA1,0xA002,0x8DA0,0x8D9E,0xA004,0xA002,0x8D9D,0x8D9C,0xA002,0x8D9B,0x8D9A,0xA008,0xA004, 0xA002,0x8D99,0x8D98,0xA002,0x8D97,0x8D96,0xA004,0xA002,0x8D95,0x8D93,0xA002,0x8D92,0x8D90,0xA010,0xA008,0xA004, 0xA002,0x8D8F,0x8D8E,0xA002,0x8D8D,0x8D8C,0xA004,0xA002,0x8D89,0x8D88,0xA002,0x8D87,0x8D86,0xA008,0xA004,0xA002, 0x8D83,0x8D82,0xA002,0x8D80,0x8D7F,0xA004,0xA002,0x8D7E,0x8D7D,0xA002,0x8D7C,0x8D7B,0xA03E,0xA01E,0xA00E,0xA006, 0xA002,0x8D7A,0xA002,0x8D79,0x8D78,0xA004,0xA002,0x8D72,0x8D71,0xA002,0x8D6F,0x8D6E,0xA008,0xA004,0xA002,0x8D6C, 0x8D6A,0xA002,0x8D69,0x8D68,0xA004,0xA002,0x8D65,0x8D5F,0xA002,0x8D57,0x8D52,0xA010,0xA008,0xA004,0xA002,0x8D51, 0x8D20,0xA002,0x8D1C,0x8D1B,0xA004,0xA002,0x8D1A,0x8D19,0xA002,0x8D18,0x8D17,0xA008,0xA004,0xA002,0x8D16,0x8D15, 0xA002,0x8D14,0x8D13,0xA004,0xA002,0x8D12,0x8D11,0xA002,0x8D10,0x8D0F,0xA000,0xA000,0xA000,0xA000,0xA000,0x8D0E, 0xA03D,0xA001,0xA01C,0xA00C,0xA004,0xA001,0xA001,0x51BC,0xA004,0xA002,0x51BD,0x51B1,0xA002,0x51AB,0x7FB8,0xA008, 0xA004,0xA002,0x8803,0x5B34,0xA002,0x7980,0x88D2,0xA004,0xA002,0x8114,0x4EB5,0xA002,0x88A4,0x886E,0xA010,0xA008, 0xA004,0xA002,0x4EB3,0x5156,0xA002,0x4EA0,0x5155,0xA004,0xA002,0x5919,0x51EB,0xA002,0x5310,0x8A07,0xA008,0xA004, 0xA002,0x530D,0x52F9,0xA002,0x5914,0x5181,0xA004,0xA002,0x9998,0x9EC9,0xA002,0x5DFD,0x516E,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x7C74,0x6C46,0xA002,0x9FA0,0x4FCE,0xA004,0xA002,0x4F65,0x4F58,0xA002,0x6C3D,0x4EDD,0xA008, 0xA004,0xA002,0x510B,0x5107,0xA002,0x50EE,0x50E6,0xA004,0xA002,0x50EC,0x50ED,0xA002,0x5106,0x50D6,0xA010,0xA008, 0xA004,0xA002,0x50BA,0x50A9,0xA002,0x50A7,0x50A5,0xA004,0xA002,0x507B,0x506C,0xA002,0x504E,0x5048,0xA008,0xA004, 0xA002,0x5055,0x5043,0xA002,0x507E,0x5028,0xA004,0xA002,0x5025,0x500C,0xA002,0x501C,0x4FFE,0xA020,0xA010,0xA008, 0xA004,0xA002,0x502D,0x502E,0xA002,0x500F,0x502C,0xA004,0xA002,0x4FF3,0x504C,0xA002,0x5029,0x4FF8,0xA008,0xA004, 0xA002,0x4FDF,0x4FD1,0xA002,0x4FDC,0x4FE3,0xA004,0xA002,0x4FDA,0x4FC5,0xA002,0x4FEA,0x4FE8,0xA010,0xA008,0xA004, 0xA002,0x4FE6,0x4F94,0xA002,0x4FAC,0x4F7C,0xA004,0xA002,0x4FAA,0x4F7B,0xA002,0x4F7E,0x4F8F,0xA008,0xA004,0xA002, 0x4F83,0x4F89,0xA002,0x4F91,0x4F74,0xA004,0xA002,0x4F76,0x4F3D,0xA002,0x4F32,0x4F57,0xA0C7,0xA07D,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x4F5F,0xA002,0x8D0D,0x8D0C,0xA004,0xA002,0x8D0B,0x8D0A,0xA002,0x8D09,0x8D08,0xA008,0xA004, 0xA002,0x8D07,0x8D06,0xA002,0x8D05,0x8D04,0xA004,0xA002,0x8D03,0x8D02,0xA002,0x8D01,0x8D00,0xA010,0xA008,0xA004, 0xA002,0x8CFF,0x8CFE,0xA002,0x8CFD,0x8CFC,0xA004,0xA002,0x8CFB,0x8CFA,0xA002,0x8CF9,0x8CF8,0xA008,0xA004,0xA002, 0x8CF7,0x8CF6,0xA002,0x8CF5,0x8CF4,0xA004,0xA002,0x8CF3,0x8CF2,0xA002,0x8CF1,0x8CF0,0xA01F,0xA00F,0xA007,0xA004, 0xA002,0x8CEF,0x8CEE,0xA000,0x8CED,0xA004,0xA002,0x8CEC,0x8CEB,0xA002,0x8CEA,0x8CE9,0xA008,0xA004,0xA002,0x8CE8, 0x8CE7,0xA002,0x8CE6,0x8CE5,0xA004,0xA002,0x8CE4,0x8CE3,0xA002,0x8CE2,0x8CE1,0xA010,0xA008,0xA004,0xA002,0x8CE0, 0x8CDF,0xA002,0x8CDE,0x8CDD,0xA004,0xA002,0x8CDC,0x8CDB,0xA002,0x8CDA,0x8CD9,0xA008,0xA004,0xA002,0x8CD8,0x8CD7, 0xA002,0x8CD6,0x8CD5,0xA004,0xA002,0x8CD4,0x8CD3,0xA002,0x8CD2,0x8CD1,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x8CD0,0x8CCF,0xA002,0x8CCE,0x8CCD,0xA004,0xA002,0x8CCC,0x8CCB,0xA002,0x8CCA,0x8CC9,0xA008,0xA004,0xA002,0x8CC8, 0x8CC7,0xA002,0x8CC6,0x8CC5,0xA004,0xA002,0x8CC4,0x8CC3,0xA002,0x8CC2,0x8CC1,0xA010,0xA008,0xA004,0xA002,0x8CC0, 0x8CBF,0xA002,0x8CBE,0x8CBD,0xA004,0xA002,0x8CBC,0x8CBB,0xA002,0x8CBA,0x8CB9,0xA008,0xA004,0xA002,0x8CB8,0x8CB7, 0xA002,0x8CB6,0x8CB5,0xA004,0xA002,0x8CB4,0x8CB3,0xA002,0x8CB2,0x8CB1,0xA000,0xA000,0xA000,0xA004,0xA002,0x8CB0, 0x8CAF,0xA000,0x8CAE,0xA039,0xA001,0xA018,0xA008,0xA001,0xA003,0xA001,0x4F5D,0xA002,0x4F5A,0x6538,0xA008,0xA004, 0xA002,0x4F67,0x4F5E,0xA002,0x4F2B,0x4F09,0xA004,0xA002,0x4F27,0x4F25,0xA002,0x4EF5,0x4F64,0xA010,0xA008,0xA004, 0xA002,0x4F22,0x4EF3,0xA002,0x4F1B,0x4EDE,0xA004,0xA002,0x4EEB,0x4EE1,0xA002,0x4EE8,0x4EC2,0xA008,0xA004,0xA002, 0x4EC9,0x4EC3,0xA002,0x4EBB,0x7F54,0xA004,0xA002,0x5182,0x5293,0xA002,0x5290,0x5281,0xA040,0xA020,0xA010,0xA008, 0xA004,0xA002,0x5282,0x527D,0xA002,0x84AF,0x525C,0xA004,0xA002,0x5261,0x525E,0xA002,0x524C,0x5240,0xA008,0xA004, 0xA002,0x523F,0x5233,0xA002,0x522D,0x520E,0xA004,0xA002,0x5208,0x5202,0xA002,0x5363,0x5366,0xA010,0xA008,0xA004, 0xA002,0x8D5C,0x533E,0xA002,0x532E,0x5326,0xA004,0xA002,0x53F5,0x531A,0xA002,0x8D5D,0x9765,0xA008,0xA004,0xA002, 0x53AE,0x53A5,0xA002,0x53A3,0x539D,0xA004,0xA002,0x538D,0x4EC4,0xA002,0x560F,0x556C,0xA020,0xA010,0xA008,0xA004, 0xA002,0x5B5B,0x8288,0xA002,0x4E93,0x4E69,0xA004,0xA002,0x4E5C,0x9F10,0xA002,0x4E9F,0x4E36,0xA008,0xA004,0xA002, 0x9F17,0x777E,0xA002,0x6BD3,0x9997,0xA004,0xA002,0x80E4,0x56DF,0xA002,0x6C10,0x536E,0xA010,0xA008,0xA004,0xA002, 0x723B,0x592D,0xA002,0x4E47,0x5315,0xA004,0xA002,0x4E3F,0x79BA,0xA002,0x4E28,0x5669,0xA008,0xA004,0xA002,0x5B6C, 0x9B32,0xA002,0x4E1E,0x4E98,0xA004,0xA002,0x4E15,0x5345,0xA002,0x5EFF,0x4E10,0xA176,0xA0CB,0xA07D,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x5140,0xA002,0x4E0C,0x4E8D,0xA004,0xA002,0x8CAD,0x8CAC,0xA002,0x8CAB,0x8CAA,0xA008,0xA004, 0xA002,0x8CA9,0x8CA8,0xA002,0x8CA7,0x8CA6,0xA004,0xA002,0x8CA5,0x8CA4,0xA002,0x8CA3,0x8CA2,0xA010,0xA008,0xA004, 0xA002,0x8CA1,0x8CA0,0xA002,0x8C9F,0x8C9E,0xA004,0xA002,0x8C9D,0x8C9C,0xA002,0x8C9B,0x8C9A,0xA008,0xA004,0xA002, 0x8C99,0x8C97,0xA002,0x8C96,0x8C95,0xA004,0xA002,0x8C93,0x8C92,0xA002,0x8C91,0x8C90,0xA01F,0xA00F,0xA008,0xA004, 0xA002,0x8C8F,0x8C8E,0xA002,0x8C8D,0x8C8B,0xA003,0xA000,0x8C88,0xA002,0x8C87,0x8C86,0xA008,0xA004,0xA002,0x8C84, 0x8C83,0xA002,0x8C81,0x8C80,0xA004,0xA002,0x8C7F,0x8C7E,0xA002,0x8C7D,0x8C7C,0xA010,0xA008,0xA004,0xA002,0x8C7B, 0x8C77,0xA002,0x8C76,0x8C75,0xA004,0xA002,0x8C74,0x8C72,0xA002,0x8C71,0x8C70,0xA008,0xA004,0xA002,0x8C6F,0x8C6E, 0xA002,0x8C6D,0x8C6C,0xA004,0xA002,0x8C69,0x8C68,0xA002,0x8C67,0x8C66,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x8C65,0x8C64,0xA002,0x8C63,0x8C60,0xA004,0xA002,0x8C5F,0x8C5E,0xA002,0x8C5D,0x8C5C,0xA008,0xA004,0xA002,0x8C5B, 0x8C59,0xA002,0x8C58,0x8C57,0xA004,0xA002,0x8C56,0x8C54,0xA002,0x8C53,0x8C52,0xA010,0xA008,0xA004,0xA002,0x8C51, 0x8C50,0xA002,0x8C4F,0x8C4E,0xA004,0xA002,0x8C4D,0x8C4B,0xA002,0x8C4A,0x8C48,0xA008,0xA004,0xA002,0x8C45,0x8C44, 0xA002,0x8C43,0x8C42,0xA004,0xA002,0x8C40,0x8C3F,0xA002,0x8C3E,0x8C3D,0xA000,0xA000,0xA008,0xA004,0xA002,0x8C3C, 0x8C3B,0xA002,0x8C3A,0x8C39,0xA000,0xA000,0x8C38,0xA02B,0xA001,0xA00A,0xA001,0xA001,0xA004,0xA002,0x5EA7,0x5750, 0xA002,0x4F5C,0x505A,0xA010,0xA008,0xA004,0xA002,0x67DE,0x4F50,0xA002,0x5DE6,0x6628,0xA004,0xA002,0x9075,0x5C0A, 0xA002,0x7F6A,0x6700,0xA008,0xA004,0xA002,0x9189,0x5634,0xA002,0x7E82,0x94BB,0xA004,0xA002,0x7EC4,0x963B,0xA002, 0x8BC5,0x7956,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x65CF,0x5352,0xA002,0x8DB3,0x79DF,0xA004,0xA002,0x63CD, 0x594F,0xA002,0x8D70,0x90B9,0xA008,0xA004,0xA002,0x7EB5,0x603B,0xA002,0x7EFC,0x5B97,0xA004,0xA002,0x8E2A,0x68D5, 0xA002,0x9B03,0x5B57,0xA010,0xA008,0xA004,0xA002,0x6E0D,0x81EA,0xA002,0x5B50,0x6ED3,0xA004,0xA002,0x7C7D,0x4ED4, 0xA002,0x7D2B,0x5B5C,0xA008,0xA004,0xA002,0x6DC4,0x6ECB,0xA002,0x59FF,0x8D44,0xA004,0xA002,0x54A8,0x5179,0xA002, 0x6D4A,0x707C,0xA020,0xA010,0xA008,0xA004,0xA002,0x7740,0x5544,0xA002,0x914C,0x8301,0xA004,0xA002,0x7422,0x684C, 0xA002,0x5353,0x62D9,0xA008,0xA004,0xA002,0x6349,0x51C6,0xA002,0x8C06,0x7F00,0xA004,0xA002,0x5760,0x8D58,0xA002, 0x8FFD,0x9525,0xA010,0xA008,0xA004,0xA002,0x690E,0x72B6,0xA002,0x58EE,0x649E,0xA004,0xA002,0x5986,0x88C5,0xA002, 0x5E84,0x6869,0xA008,0xA004,0xA002,0x7BC6,0x8D5A,0xA002,0x64B0,0x8F6C,0xA004,0xA002,0x7816,0x4E13,0xA002,0x62FD, 0x722A,0xA0CE,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6293,0xA002,0x9A7B,0x795D,0xA004,0xA002,0x6CE8,0x4F4F, 0xA002,0x8C1E,0x8C09,0xA008,0xA004,0xA002,0x8BEA,0x8BD0,0xA002,0x8BC7,0x8BBB,0xA004,0xA002,0x8BB1,0x8BAC,0xA002, 0x8B9F,0x8B9E,0xA010,0xA008,0xA004,0xA002,0x8B9D,0x8B9C,0xA002,0x8B9B,0x8B9A,0xA004,0xA002,0x8B99,0x8B98,0xA002, 0x8B97,0x8B96,0xA008,0xA004,0xA002,0x8B95,0x8B94,0xA002,0x8B93,0x8B92,0xA004,0xA002,0x8B91,0x8B90,0xA002,0x8B8F, 0x8B8E,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x8B8D,0x8B8C,0xA002,0x8B8B,0x8B8A,0xA004,0xA002,0x8B89,0x8B88,0xA000, 0x8B87,0xA008,0xA004,0xA002,0x8B86,0x8B85,0xA002,0x8B84,0x8B83,0xA004,0xA002,0x8B82,0x8B81,0xA002,0x8B80,0x8B7F, 0xA010,0xA008,0xA004,0xA002,0x8B7E,0x8B7D,0xA002,0x8B7C,0x8B7B,0xA004,0xA002,0x8B7A,0x8B79,0xA002,0x8B78,0x8B77, 0xA008,0xA004,0xA002,0x8B76,0x8B75,0xA002,0x8B74,0x8B73,0xA004,0xA002,0x8B72,0x8B71,0xA002,0x8B70,0x8B6F,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8B6E,0x8B6D,0xA002,0x8B6B,0x8B6A,0xA004,0xA002,0x8B69,0x8B68,0xA002,0x8B67, 0x8B65,0xA008,0xA004,0xA002,0x8B64,0x8B63,0xA002,0x8B62,0x8B61,0xA004,0xA002,0x8B60,0x8B5F,0xA002,0x8B5E,0x8B5D, 0xA010,0xA008,0xA004,0xA002,0x8B5C,0x8B5B,0xA002,0x8B5A,0x8B59,0xA004,0xA002,0x8B58,0x8B57,0xA002,0x8B56,0x8B55, 0xA008,0xA004,0xA002,0x8B54,0x8B53,0xA002,0x8B52,0x8B51,0xA004,0xA002,0x8B50,0x8B4F,0xA002,0x8B4E,0x8B4D,0xA000, 0xA000,0xA008,0xA004,0xA002,0x8B4C,0x8B4B,0xA002,0x8B4A,0x8B49,0xA004,0xA002,0x8B48,0x8B47,0xA000,0x8B46,0xA031, 0xA001,0xA010,0xA001,0xA007,0xA003,0xA001,0x7B51,0xA002,0x94F8,0x8D2E,0xA004,0xA002,0x86C0,0x52A9,0xA002,0x67F1, 0x8457,0xA010,0xA008,0xA004,0xA002,0x4E3B,0x5631,0xA002,0x77A9,0x62C4,0xA004,0xA002,0x716E,0x70DB,0xA002,0x7AF9, 0x9010,0xA008,0xA004,0xA002,0x8BDB,0x8BF8,0xA002,0x732A,0x6731,0xA004,0xA002,0x86DB,0x682A,0xA002,0x73E0,0x9AA4, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x663C,0x5B99,0xA002,0x76B1,0x5492,0xA004,0xA002,0x5E1A,0x8098,0xA002, 0x8F74,0x7CA5,0xA008,0xA004,0xA002,0x8BCC,0x6D32,0xA002,0x5DDE,0x5468,0xA004,0xA002,0x821F,0x4F17,0xA002,0x4EF2, 0x91CD,0xA010,0xA008,0xA004,0xA002,0x80BF,0x79CD,0xA002,0x7EC8,0x8877,0xA004,0xA002,0x949F,0x5FE0,0xA002,0x76C5, 0x4E2D,0xA008,0xA004,0xA002,0x7A92,0x6CBB,0xA002,0x6EDE,0x75D4,0xA004,0xA002,0x7099,0x8D28,0xA002,0x7A1A,0x79E9, 0xA020,0xA010,0xA008,0xA004,0xA002,0x667A,0x5236,0xA002,0x5CD9,0x5E1C,0xA004,0xA002,0x7F6E,0x81F4,0xA002,0x81F3, 0x63B7,0xA008,0xA004,0xA002,0x631A,0x5FD7,0xA002,0x7EB8,0x65E8,0xA004,0xA002,0x53EA,0x8DBE,0xA002,0x6B62,0x6307, 0xA010,0xA008,0xA004,0xA002,0x5740,0x4F84,0xA002,0x503C,0x6267,0xA004,0xA002,0x6B96,0x690D,0xA002,0x76F4,0x804C, 0xA008,0xA004,0xA002,0x7EC7,0x4E4B,0xA002,0x6C41,0x8102,0xA004,0xA002,0x80A2,0x77E5,0xA002,0x8718,0x5431,0xA5F6, 0xA2FC,0xA17D,0xA0D2,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x652F,0xA002,0x679D,0x829D,0xA004,0xA002,0x8BC1, 0x90D1,0xA002,0x75C7,0x5E27,0xA008,0xA004,0xA002,0x8B45,0x8B44,0xA002,0x8B43,0x8B42,0xA004,0xA002,0x8B41,0x8B40, 0xA002,0x8B3F,0x8B3E,0xA010,0xA008,0xA004,0xA002,0x8B3D,0x8B3C,0xA002,0x8B3B,0x8B3A,0xA004,0xA002,0x8B39,0x8B38, 0xA002,0x8B37,0x8B36,0xA008,0xA004,0xA002,0x8B35,0x8B34,0xA002,0x8B33,0x8B32,0xA004,0xA002,0x8B31,0x8B30,0xA002, 0x8B2F,0x8B2E,0xA01F,0xA010,0xA008,0xA004,0xA002,0x8B2D,0x8B2C,0xA002,0x8B2B,0x8B2A,0xA004,0xA002,0x8B29,0x8B28, 0xA002,0x8B27,0x8B25,0xA007,0xA003,0xA000,0x8B24,0xA002,0x8B23,0x8B22,0xA004,0xA002,0x8B21,0x8B20,0xA002,0x8B1F, 0x8B1E,0xA010,0xA008,0xA004,0xA002,0x8B1D,0x8B1C,0xA002,0x8B1B,0x8B1A,0xA004,0xA002,0x8B19,0x8B18,0xA002,0x8B17, 0x8B16,0xA008,0xA004,0xA002,0x8B15,0x8B14,0xA002,0x8B13,0x8B12,0xA004,0xA002,0x8B11,0x8B10,0xA002,0x8B0F,0x8B0E, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x8B0D,0xA002,0x8B0C,0x8B0B,0xA004,0xA002,0x8B0A,0x8B09,0xA002,0x8B08,0x8B06, 0xA008,0xA004,0xA002,0x8B05,0x8B04,0xA002,0x8B03,0x8B02,0xA004,0xA002,0x8B01,0x8B00,0xA002,0x8AFF,0x8AFE,0xA010, 0xA008,0xA004,0xA002,0x8AFD,0x8AFC,0xA002,0x8AFB,0x8AFA,0xA004,0xA002,0x8AF9,0x8AF8,0xA002,0x8AF7,0x8AF6,0xA008, 0xA004,0xA002,0x8AF5,0x8AF4,0xA002,0x8AF3,0x8AF2,0xA004,0xA002,0x8AF1,0x8AF0,0xA002,0x8AEF,0x8AEE,0xA000,0xA010, 0xA008,0xA004,0xA002,0x8AED,0x8AEC,0xA002,0x8AEB,0x8AEA,0xA004,0xA002,0x8AE9,0x8AE8,0xA002,0x8AE7,0x8AE6,0xA000, 0xA000,0xA002,0x8AE5,0x8AE4,0xA02B,0xA001,0xA00A,0xA001,0xA001,0xA004,0xA002,0x653F,0x6B63,0xA002,0x62EF,0x6574, 0xA010,0xA008,0xA004,0xA002,0x6014,0x4E89,0xA002,0x72F0,0x5F81,0xA004,0xA002,0x7741,0x6323,0xA002,0x84B8,0x9635, 0xA008,0xA004,0xA002,0x9547,0x632F,0xA002,0x9707,0x8BCA,0xA004,0xA002,0x75B9,0x6795,0xA002,0x4FA6,0x9488,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8D1E,0x81FB,0xA002,0x7827,0x7504,0xA004,0xA002,0x771F,0x659F,0xA002,0x73CD, 0x6D59,0xA008,0xA004,0xA002,0x8FD9,0x8517,0xA002,0x9517,0x8005,0xA004,0xA002,0x8F99,0x86F0,0xA002,0x54F2,0x6298, 0xA010,0xA008,0xA004,0xA002,0x906E,0x53EC,0xA002,0x8087,0x5146,0xA004,0xA002,0x7F69,0x7167,0xA002,0x8D75,0x6CBC, 0xA008,0xA004,0xA002,0x627E,0x662D,0xA002,0x62DB,0x969C,0xA004,0xA002,0x7634,0x80C0,0xA002,0x4ED7,0x8D26,0xA020, 0xA010,0xA008,0xA004,0xA002,0x5E10,0x4E08,0xA002,0x6756,0x6DA8,0xA004,0xA002,0x638C,0x5F20,0xA002,0x6F33,0x5F70, 0xA008,0xA004,0xA002,0x7AE0,0x6A1F,0xA002,0x7EFD,0x6E5B,0xA004,0xA002,0x7AD9,0x6218,0xA002,0x5360,0x6808,0xA010, 0xA008,0xA004,0xA002,0x8638,0x5C55,0xA002,0x5D2D,0x8F97,0xA004,0xA002,0x65A9,0x76CF,0xA002,0x6CBE,0x7C98,0xA008, 0xA004,0xA002,0x8A79,0x6BE1,0xA002,0x77BB,0x5BE8,0xA004,0xA002,0x503A,0x7A84,0xA002,0x5B85,0x658B,0xA0D7,0xA07D, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6458,0xA002,0x8BC8,0x70B8,0xA004,0xA002,0x4E4D,0x548B,0xA002,0x69A8,0x6805, 0xA008,0xA004,0xA002,0x7728,0x95F8,0xA002,0x94E1,0x8AE3,0xA004,0xA002,0x8AE2,0x8AE1,0xA002,0x8AE0,0x8ADF,0xA010, 0xA008,0xA004,0xA002,0x8ADE,0x8ADD,0xA002,0x8ADC,0x8ADB,0xA004,0xA002,0x8ADA,0x8AD9,0xA002,0x8AD8,0x8AD7,0xA008, 0xA004,0xA002,0x8AD6,0x8AD5,0xA002,0x8AD4,0x8AD3,0xA004,0xA002,0x8AD2,0x8AD1,0xA002,0x8AD0,0x8ACF,0xA01F,0xA010, 0xA008,0xA004,0xA002,0x8ACE,0x8ACD,0xA002,0x8ACC,0x8ACB,0xA004,0xA002,0x8ACA,0x8AC9,0xA002,0x8AC8,0x8AC7,0xA008, 0xA004,0xA002,0x8AC6,0x8AC5,0xA002,0x8AC4,0x8AC3,0xA003,0xA001,0x8AC2,0xA002,0x8AC1,0x8AC0,0xA010,0xA008,0xA004, 0xA002,0x8ABF,0x8ABE,0xA002,0x8ABD,0x8ABC,0xA004,0xA002,0x8ABB,0x8ABA,0xA002,0x8AB9,0x8AB8,0xA008,0xA004,0xA002, 0x8AB7,0x8AB6,0xA002,0x8AB5,0x8AB4,0xA004,0xA002,0x8AB3,0x8AB2,0xA002,0x8AB1,0x8AB0,0xA040,0xA020,0xA010,0xA008, 0xA004,0xA002,0x8AAF,0x8AAE,0xA002,0x8AAD,0x8AAC,0xA004,0xA002,0x8AAB,0x8AAA,0xA002,0x8AA9,0x8AA8,0xA008,0xA004, 0xA002,0x8AA7,0x8AA6,0xA002,0x8AA5,0x8AA4,0xA004,0xA002,0x8AA3,0x8AA2,0xA002,0x8AA1,0x8AA0,0xA010,0xA008,0xA004, 0xA002,0x8A9F,0x8A9E,0xA002,0x8A9D,0x8A9C,0xA004,0xA002,0x8A9B,0x8A9A,0xA002,0x8A99,0x8A98,0xA008,0xA004,0xA002, 0x8A97,0x8A96,0xA002,0x8A95,0x8A94,0xA004,0xA002,0x8A92,0x8A91,0xA002,0x8A90,0x8A8F,0xA000,0xA010,0xA008,0xA004, 0xA002,0x8A8E,0x8A8D,0xA002,0x8A8C,0x8A8B,0xA004,0xA002,0x8A88,0x8A87,0xA002,0x8A86,0x8A85,0xA000,0xA004,0xA002, 0x8A84,0x8A83,0xA002,0x8A82,0x8A81,0xA028,0xA001,0xA007,0xA001,0xA001,0xA001,0xA002,0x8F67,0x672D,0xA010,0xA008, 0xA004,0xA002,0x6E23,0x55B3,0xA002,0x624E,0x8D60,0xA004,0xA002,0x66FE,0x618E,0xA002,0x589E,0x600E,0xA008,0xA004, 0xA002,0x8D3C,0x6CFD,0xA002,0x5219,0x62E9,0xA004,0xA002,0x8D23,0x71E5,0xA002,0x7076,0x7682,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x9020,0x566A,0xA002,0x8E81,0x86A4,0xA004,0xA002,0x6FA1,0x65E9,0xA002,0x67A3,0x85FB,0xA008, 0xA004,0xA002,0x51FF,0x7CDF,0xA002,0x906D,0x846C,0xA004,0xA002,0x810F,0x8D43,0xA002,0x8D5E,0x6682,0xA010,0xA008, 0xA004,0xA002,0x6512,0x54B1,0xA002,0x5728,0x518D,0xA004,0xA002,0x8F7D,0x5BB0,0xA002,0x707E,0x54C9,0xA008,0xA004, 0xA002,0x683D,0x6742,0xA002,0x7838,0x531D,0xA004,0xA002,0x5B55,0x97F5,0xA002,0x6655,0x915D,0xA020,0xA010,0xA008, 0xA004,0xA002,0x8574,0x8FD0,0xA002,0x5141,0x9668,0xA004,0xA002,0x5300,0x90E7,0xA002,0x4E91,0x8018,0xA008,0xA004, 0xA002,0x9605,0x60A6,0xA002,0x6708,0x7CA4,0xA004,0xA002,0x5CB3,0x94A5,0xA002,0x8DC3,0x8D8A,0xA010,0xA008,0xA004, 0xA002,0x7EA6,0x66F0,0xA002,0x9662,0x6028,0xA004,0xA002,0x613F,0x82D1,0xA002,0x8FDC,0x7F18,0xA008,0xA004,0xA002, 0x6E90,0x733F,0xA002,0x5706,0x5458,0xA004,0xA002,0x56ED,0x8F95,0xA002,0x63F4,0x539F,0xA17D,0xA0DB,0xA07D,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x8881,0xA002,0x57A3,0x5143,0xA004,0xA002,0x51A4,0x6E0A,0xA002,0x9E33,0x9A6D,0xA008, 0xA004,0xA002,0x8C6B,0x9884,0xA002,0x88D5,0x5BD3,0xA004,0xA002,0x6D74,0x8A80,0xA002,0x8A7F,0x8A7E,0xA010,0xA008, 0xA004,0xA002,0x8A7D,0x8A7C,0xA002,0x8A7B,0x8A7A,0xA004,0xA002,0x8A78,0x8A77,0xA002,0x8A76,0x8A75,0xA008,0xA004, 0xA002,0x8A74,0x8A73,0xA002,0x8A72,0x8A71,0xA004,0xA002,0x8A70,0x8A6F,0xA002,0x8A6E,0x8A6D,0xA01F,0xA010,0xA008, 0xA004,0xA002,0x8A6C,0x8A6B,0xA002,0x8A6A,0x8A69,0xA004,0xA002,0x8A68,0x8A67,0xA002,0x8A66,0x8A65,0xA008,0xA004, 0xA002,0x8A64,0x8A63,0xA002,0x8A62,0x8A61,0xA004,0xA002,0x8A60,0x8A5F,0xA001,0x8A5E,0xA010,0xA008,0xA004,0xA002, 0x8A5D,0x8A5C,0xA002,0x8A5B,0x8A5A,0xA004,0xA002,0x8A59,0x8A58,0xA002,0x8A57,0x8A56,0xA008,0xA004,0xA002,0x8A55, 0x8A54,0xA002,0x8A53,0x8A52,0xA004,0xA002,0x8A51,0x8A50,0xA002,0x8A4F,0x8A4E,0xA040,0xA020,0xA010,0xA008,0xA004, 0xA002,0x8A4D,0x8A4C,0xA002,0x8A4B,0x8A4A,0xA004,0xA002,0x8A49,0x8A47,0xA002,0x8A46,0x8A45,0xA008,0xA004,0xA002, 0x8A44,0x8A43,0xA002,0x8A42,0x8A41,0xA004,0xA002,0x8A40,0x8A3F,0xA002,0x8A3D,0x8A3C,0xA010,0xA008,0xA004,0xA002, 0x8A3B,0x8A3A,0xA002,0x8A39,0x8A38,0xA004,0xA002,0x8A37,0x8A36,0xA002,0x8A35,0x8A34,0xA008,0xA004,0xA002,0x8A33, 0x8A32,0xA002,0x8A31,0x8A30,0xA004,0xA002,0x8A2F,0x8A2E,0xA002,0x8A2D,0x8A2C,0xA000,0xA010,0xA008,0xA004,0xA002, 0x8A2B,0x8A2A,0xA002,0x8A29,0x8A28,0xA004,0xA002,0x8A27,0x8A26,0xA002,0x8A25,0x8A24,0xA008,0xA004,0xA002,0x8A23, 0x8A22,0xA002,0x8A21,0x8A20,0xA000,0xA002,0x8A1F,0x8A1E,0xA022,0xA001,0xA001,0xA010,0xA008,0xA004,0xA002,0x8A89, 0x80B2,0xA002,0x72F1,0x6B32,0xA004,0xA002,0x6108,0x5FA1,0xA002,0x5CEA,0x55BB,0xA008,0xA004,0xA002,0x9047,0x5401, 0xA002,0x90C1,0x828B,0xA004,0xA002,0x57DF,0x7389,0xA002,0x7FBD,0x8BED,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x5B87,0x79B9,0xA002,0x5C7F,0x4E0E,0xA004,0xA002,0x96E8,0x5A31,0xA002,0x4E88,0x9685,0xA008,0xA004,0xA002,0x6E14, 0x6E1D,0xA002,0x6109,0x9C7C,0xA004,0xA002,0x903E,0x4FDE,0xA002,0x4F59,0x8206,0xA010,0xA008,0xA004,0xA002,0x611A, 0x865E,0xA002,0x6986,0x76C2,0xA004,0xA002,0x4E8E,0x6DE4,0xA002,0x8FC2,0x5E7C,0xA008,0xA004,0xA002,0x53C8,0x8BF1, 0xA002,0x91C9,0x4F51,0xA004,0xA002,0x53F3,0x53CB,0xA002,0x6709,0x9149,0xA020,0xA010,0xA008,0xA004,0xA002,0x6E38, 0x6CB9,0xA002,0x72B9,0x94C0,0xA004,0xA002,0x90AE,0x7531,0xA002,0x5C24,0x5FE7,0xA008,0xA004,0xA002,0x60A0,0x4F18, 0xA002,0x5E7D,0x7528,0xA004,0xA002,0x52C7,0x607F,0xA002,0x6C38,0x6D8C,0xA010,0xA008,0xA004,0xA002,0x6CF3,0x548F, 0xA002,0x86F9,0x8E0A,0xA004,0xA002,0x96CD,0x5EB8,0xA002,0x75C8,0x81C3,0xA008,0xA004,0xA002,0x4F63,0x62E5,0xA002, 0x54DF,0x6620,0xA004,0xA002,0x786C,0x9896,0xA002,0x5F71,0x76C8,0xA0DE,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x8D62,0xA002,0x8FCE,0x8747,0xA004,0xA002,0x8367,0x8425,0xA002,0x8424,0x83B9,0xA008,0xA004,0xA002,0x7F28,0x5E94, 0xA002,0x9E70,0x5A74,0xA004,0xA002,0x6A31,0x82F1,0xA002,0x5370,0x8A1D,0xA010,0xA008,0xA004,0xA002,0x8A1C,0x8A1B, 0xA002,0x8A1A,0x8A19,0xA004,0xA002,0x8A18,0x8A17,0xA002,0x8A16,0x8A15,0xA008,0xA004,0xA002,0x8A14,0x8A13,0xA002, 0x8A12,0x8A11,0xA004,0xA002,0x8A10,0x8A0F,0xA002,0x8A0E,0x8A0D,0xA020,0xA010,0xA008,0xA004,0xA002,0x8A0C,0x8A0B, 0xA002,0x8A0A,0x8A09,0xA004,0xA002,0x8A08,0x8A06,0xA002,0x8A05,0x8A04,0xA008,0xA004,0xA002,0x8A03,0x8A02,0xA002, 0x8A01,0x89FF,0xA004,0xA002,0x89FE,0x89FD,0xA002,0x89FC,0x89FB,0xA00F,0xA007,0xA003,0xA001,0x89FA,0xA002,0x89F9, 0x89F8,0xA004,0xA002,0x89F7,0x89F6,0xA002,0x89F5,0x89F4,0xA008,0xA004,0xA002,0x89F2,0x89F1,0xA002,0x89F0,0x89EE, 0xA004,0xA002,0x89ED,0x89EC,0xA002,0x89EA,0x89E9,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x89E8,0x89E7,0xA002, 0x89E4,0x89E2,0xA004,0xA002,0x89E1,0x89E0,0xA002,0x89DF,0x89DD,0xA008,0xA004,0xA002,0x89DB,0x89D9,0xA002,0x89D8, 0x89D7,0xA004,0xA002,0x89D5,0x89D4,0xA002,0x89D3,0x89CD,0xA010,0xA008,0xA004,0xA002,0x89C3,0x89C0,0xA002,0x89BF, 0x89BE,0xA004,0xA002,0x89BD,0x89BC,0xA002,0x89BB,0x89BA,0xA008,0xA004,0xA002,0x89B9,0x89B8,0xA002,0x89B7,0x89B6, 0xA004,0xA002,0x89B5,0x89B4,0xA002,0x89B3,0x89B2,0xA000,0xA010,0xA008,0xA004,0xA002,0x89B1,0x89B0,0xA002,0x89AF, 0x89AE,0xA004,0xA002,0x89AD,0x89AC,0xA002,0x89AB,0x89AA,0xA008,0xA004,0xA002,0x89A9,0x89A8,0xA002,0x89A7,0x89A6, 0xA004,0xA002,0x89A5,0x89A4,0xA002,0x89A3,0x89A2,0xA01F,0xA001,0xA001,0xA00D,0xA005,0xA001,0xA002,0x9690,0x5F15, 0xA004,0xA002,0x5C39,0x996E,0xA002,0x5BC5,0x6DEB,0xA008,0xA004,0xA002,0x94F6,0x541F,0xA002,0x59FB,0x9634,0xA004, 0xA002,0x97F3,0x6BB7,0xA002,0x56E0,0x836B,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x8335,0x7ECE,0xA002,0x7FCC, 0x7FFC,0xA004,0xA002,0x5F02,0x8BD1,0xA002,0x8C0A,0x8BAE,0xA008,0xA004,0xA002,0x8BE3,0x6EA2,0xA002,0x76CA,0x4E49, 0xA004,0xA002,0x5FC6,0x6BC5,0xA002,0x610F,0x88D4,0xA010,0xA008,0xA004,0xA002,0x4EA6,0x75AB,0xA002,0x8084,0x9038, 0xA004,0xA002,0x81C6,0x5F79,0xA002,0x4EBF,0x5C79,0xA008,0xA004,0xA002,0x9091,0x6613,0xA002,0x6291,0x827A,0xA004, 0xA002,0x4EE5,0x77E3,0xA002,0x4E59,0x5DF2,0xA020,0xA010,0xA008,0xA004,0xA002,0x501A,0x8681,0xA002,0x6905,0x5F5D, 0xA004,0xA002,0x59E8,0x5B9C,0xA002,0x6C82,0x7591,0xA008,0xA004,0xA002,0x80F0,0x4EEA,0xA002,0x79FB,0x9057,0xA004, 0xA002,0x5937,0x9890,0xA002,0x8863,0x4F0A,0xA010,0xA008,0xA004,0xA002,0x4F9D,0x94F1,0xA002,0x63D6,0x533B,0xA004, 0xA002,0x58F9,0x4E00,0xA002,0x6DB2,0x591C,0xA008,0xA004,0xA002,0x814B,0x66F3,0xA002,0x53F6,0x4E1A,0xA004,0xA002, 0x6396,0x9875,0xA002,0x4E5F,0x51B6,0xA2FE,0xA17F,0xA0E4,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x91CE,0xA002, 0x7237,0x8036,0xA004,0xA002,0x564E,0x6930,0xA002,0x8000,0x8981,0xA008,0xA004,0xA002,0x836F,0x8200,0xA002,0x54AC, 0x59DA,0xA004,0xA002,0x8C23,0x7A91,0xA002,0x9065,0x5C27,0xA010,0xA008,0xA004,0xA002,0x6447,0x89A1,0xA002,0x89A0, 0x899F,0xA004,0xA002,0x899E,0x899D,0xA002,0x899C,0x899B,0xA008,0xA004,0xA002,0x899A,0x8999,0xA002,0x8998,0x8997, 0xA004,0xA002,0x8996,0x8995,0xA002,0x8994,0x8993,0xA020,0xA010,0xA008,0xA004,0xA002,0x8992,0x8991,0xA002,0x8990, 0x898F,0xA004,0xA002,0x898E,0x898D,0xA002,0x898C,0x898B,0xA008,0xA004,0xA002,0x898A,0x8989,0xA002,0x8988,0x8987, 0xA004,0xA002,0x8985,0x8984,0xA002,0x8982,0x8980,0xA00F,0xA007,0xA004,0xA002,0x897E,0x897D,0xA001,0x897C,0xA004, 0xA002,0x897A,0x8979,0xA002,0x8978,0x8977,0xA008,0xA004,0xA002,0x8976,0x8975,0xA002,0x8974,0x8973,0xA004,0xA002, 0x8972,0x8971,0xA002,0x8970,0x896F,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x896E,0x896D,0xA002,0x896C,0x896B, 0xA004,0xA002,0x896A,0x8969,0xA002,0x8968,0x8967,0xA008,0xA004,0xA002,0x8965,0x8964,0xA002,0x8963,0x8962,0xA004, 0xA002,0x8961,0x8960,0xA002,0x895D,0x895C,0xA010,0xA008,0xA004,0xA002,0x895B,0x895A,0xA002,0x8959,0x8958,0xA004, 0xA002,0x8957,0x8956,0xA002,0x8955,0x8954,0xA008,0xA004,0xA002,0x8953,0x8952,0xA002,0x8951,0x8950,0xA004,0xA002, 0x894F,0x894E,0xA002,0x894D,0x894C,0xA020,0xA010,0xA008,0xA004,0xA002,0x894B,0x894A,0xA002,0x8949,0x8948,0xA004, 0xA002,0x8947,0x8946,0xA002,0x8945,0x8943,0xA008,0xA004,0xA002,0x8942,0x8940,0xA002,0x893F,0x893E,0xA004,0xA002, 0x893D,0x893C,0xA002,0x893B,0x893A,0xA000,0xA000,0xA000,0xA002,0x8939,0x8938,0xA01B,0xA001,0xA001,0xA009,0xA001, 0xA004,0xA002,0x7476,0x5996,0xA002,0x8170,0x9080,0xA008,0xA004,0xA002,0x6F3E,0x6837,0xA002,0x517B,0x75D2,0xA004, 0xA002,0x4EF0,0x6C27,0xA002,0x9633,0x6D0B,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x7F8A,0x75A1,0xA002,0x4F6F, 0x626C,0xA004,0xA002,0x6768,0x79E7,0xA002,0x9E2F,0x592E,0xA008,0xA004,0xA002,0x6B83,0x9A8C,0xA002,0x8C1A,0x5BB4, 0xA004,0xA002,0x7130,0x5F66,0xA002,0x5501,0x96C1,0xA010,0xA008,0xA004,0xA002,0x781A,0x538C,0xA002,0x71D5,0x5830, 0xA004,0xA002,0x8273,0x6F14,0xA002,0x884D,0x773C,0xA008,0xA004,0xA002,0x63A9,0x5944,0xA002,0x6CBF,0x708E,0xA004, 0xA002,0x960E,0x989C,0xA002,0x8A00,0x5EF6,0xA020,0xA010,0xA008,0xA004,0xA002,0x5CA9,0x8712,0xA002,0x7814,0x4E25, 0xA004,0xA002,0x76D0,0x6DF9,0xA002,0x70DF,0x9609,0xA008,0xA004,0xA002,0x54BD,0x7109,0xA002,0x8BB6,0x4E9A,0xA004, 0xA002,0x54D1,0x96C5,0xA002,0x6DAF,0x8859,0xA010,0xA008,0xA004,0xA002,0x5D16,0x869C,0xA002,0x7259,0x82BD,0xA004, 0xA002,0x4E2B,0x5440,0xA002,0x9E2D,0x9E26,0xA008,0xA004,0xA002,0x62BC,0x538B,0xA002,0x8FC5,0x900A,0xA004,0xA002, 0x8BAF,0x8BAD,0xA002,0x6C5B,0x6B89,0xA0E7,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5DE1,0xA002,0x9A6F,0x5BFB, 0xA004,0xA002,0x8BE2,0x65EC,0xA002,0x5FAA,0x718F,0xA008,0xA004,0xA002,0x52CB,0x8840,0xA002,0x96EA,0x7A74,0xA004, 0xA002,0x5B66,0x859B,0xA002,0x9774,0x7EDA,0xA010,0xA008,0xA004,0xA002,0x7729,0x7663,0xA002,0x9009,0x8937,0xA004, 0xA002,0x8935,0x8933,0xA002,0x8932,0x8931,0xA008,0xA004,0xA002,0x892F,0x892E,0xA002,0x892D,0x892C,0xA004,0xA002, 0x8929,0x8928,0xA002,0x8927,0x8926,0xA020,0xA010,0xA008,0xA004,0xA002,0x8924,0x8923,0xA002,0x8922,0x8920,0xA004, 0xA002,0x891F,0x891E,0xA002,0x891D,0x891C,0xA008,0xA004,0xA002,0x8918,0x8917,0xA002,0x8916,0x8915,0xA004,0xA002, 0x8914,0x8911,0xA002,0x890F,0x890E,0xA00F,0xA008,0xA004,0xA002,0x890D,0x890C,0xA002,0x890B,0x8909,0xA003,0xA001, 0x8908,0xA002,0x8907,0x8906,0xA008,0xA004,0xA002,0x8905,0x8904,0xA002,0x8903,0x8901,0xA004,0xA002,0x8900,0x88FF, 0xA002,0x88FD,0x88FB,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x88FA,0x88F7,0xA002,0x88F6,0x88F5,0xA004,0xA002, 0x88F2,0x88EF,0xA002,0x88EE,0x88ED,0xA008,0xA004,0xA002,0x88EC,0x88EB,0xA002,0x88EA,0x88E9,0xA004,0xA002,0x88E7, 0x88E6,0xA002,0x88E1,0x88E0,0xA010,0xA008,0xA004,0xA002,0x88DE,0x88DD,0xA002,0x88DC,0x88DB,0xA004,0xA002,0x88DA, 0x88D7,0xA002,0x88D6,0x88D3,0xA008,0xA004,0xA002,0x88D1,0x88D0,0xA002,0x88CF,0x88CD,0xA004,0xA002,0x88CC,0x88CB, 0xA002,0x88CA,0x88C8,0xA020,0xA010,0xA008,0xA004,0xA002,0x88C7,0x88C4,0xA002,0x88C3,0x88C0,0xA004,0xA002,0x88BF, 0x88BE,0xA002,0x88BD,0x88BB,0xA008,0xA004,0xA002,0x88BA,0x88B9,0xA002,0x88B8,0x88B6,0xA004,0xA002,0x88B5,0x88B4, 0xA002,0x88B3,0x88B2,0xA000,0xA000,0xA004,0xA002,0x88B0,0x88AF,0xA002,0x88AE,0x88AC,0xA018,0xA001,0xA001,0xA006, 0xA001,0xA001,0xA002,0x7384,0x65CB,0xA008,0xA004,0xA002,0x60AC,0x5BA3,0xA002,0x55A7,0x8F69,0xA004,0xA002,0x7EED, 0x7EEA,0xA002,0x5A7F,0x7D6E,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6064,0x755C,0xA002,0x5E8F,0x65ED,0xA004, 0xA002,0x53D9,0x9157,0xA002,0x84C4,0x8BB8,0xA008,0xA004,0xA002,0x5F90,0x987B,0xA002,0x5618,0x865A,0xA004,0xA002, 0x9700,0x620C,0xA002,0x589F,0x7EE3,0xA010,0xA008,0xA004,0xA002,0x8896,0x79C0,0xA002,0x9508,0x55C5,0xA004,0xA002, 0x673D,0x7F9E,0xA002,0x4FEE,0x4F11,0xA008,0xA004,0xA002,0x718A,0x96C4,0xA002,0x6C79,0x5308,0xA004,0xA002,0x80F8, 0x51F6,0xA002,0x5144,0x59D3,0xA020,0xA010,0xA008,0xA004,0xA002,0x6027,0x674F,0xA002,0x5E78,0x9192,0xA004,0xA002, 0x884C,0x90A2,0xA002,0x5F62,0x578B,0xA008,0xA004,0xA002,0x5211,0x5174,0xA002,0x60FA,0x7329,0xA004,0xA002,0x8165, 0x661F,0xA002,0x8845,0x4FE1,0xA010,0xA008,0xA004,0xA002,0x5FC3,0x5FFB,0xA002,0x65B0,0x8F9B,0xA004,0xA002,0x6B23, 0x950C,0xA002,0x82AF,0x85AA,0xA008,0xA004,0xA002,0x5C51,0x8C22,0xA002,0x6CFB,0x6CC4,0xA004,0xA002,0x61C8,0x87F9, 0xA002,0x5378,0x68B0,0xA17E,0xA0EB,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5199,0xA002,0x8C10,0x80C1,0xA004, 0xA002,0x659C,0x90AA,0xA002,0x643A,0x631F,0xA008,0xA004,0xA002,0x534F,0x978B,0xA002,0x874E,0x6B47,0xA004,0xA002, 0x4E9B,0x6954,0xA002,0x6548,0x7B11,0xA010,0xA008,0xA004,0xA002,0x5578,0x8096,0xA002,0x6821,0x5B5D,0xA004,0xA002, 0x5C0F,0x88AA,0xA002,0x88A9,0x88A8,0xA008,0xA004,0xA002,0x88A7,0x88A6,0xA002,0x88A5,0x88A3,0xA004,0xA002,0x88A1, 0x88A0,0xA002,0x889F,0x889E,0xA020,0xA010,0xA008,0xA004,0xA002,0x889D,0x889B,0xA002,0x889A,0x8899,0xA004,0xA002, 0x8898,0x8897,0xA002,0x8895,0x8894,0xA008,0xA004,0xA002,0x8893,0x8891,0xA002,0x8890,0x888F,0xA004,0xA002,0x888E, 0x888C,0xA002,0x888A,0x8889,0xA00F,0xA008,0xA004,0xA002,0x8887,0x8886,0xA002,0x8883,0x8880,0xA004,0xA002,0x887C, 0x887B,0xA001,0x887A,0xA008,0xA004,0xA002,0x8879,0x8878,0xA002,0x8876,0x8875,0xA004,0xA002,0x8874,0x8873,0xA002, 0x8871,0x886F,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x886D,0x886A,0xA002,0x8867,0x8866,0xA004,0xA002,0x8860, 0x885F,0xA002,0x885E,0x885D,0xA008,0xA004,0xA002,0x885C,0x885B,0xA002,0x885A,0x8858,0xA004,0xA002,0x8856,0x8855, 0xA002,0x8853,0x8852,0xA010,0xA008,0xA004,0xA002,0x8851,0x8850,0xA002,0x884F,0x884E,0xA004,0xA002,0x884B,0x884A, 0xA002,0x8849,0x8848,0xA008,0xA004,0xA002,0x8847,0x8846,0xA002,0x8843,0x8842,0xA004,0xA002,0x8841,0x883F,0xA002, 0x883E,0x883D,0xA020,0xA010,0xA008,0xA004,0xA002,0x883B,0x883A,0xA002,0x8838,0x8837,0xA004,0xA002,0x8836,0x8835, 0xA002,0x8834,0x8833,0xA008,0xA004,0xA002,0x8831,0x8830,0xA002,0x882F,0x882E,0xA004,0xA002,0x882D,0x882C,0xA002, 0x882B,0x882A,0xA000,0xA008,0xA004,0xA002,0x8829,0x8828,0xA002,0x8827,0x8826,0xA000,0xA002,0x8825,0x8824,0xA013, 0xA001,0xA001,0xA001,0xA008,0xA004,0xA002,0x6653,0x6DC6,0xA002,0x5BB5,0x6D88,0xA004,0xA002,0x9500,0x56A3,0xA002, 0x54EE,0x524A,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x9704,0x785D,0xA002,0x8427,0x8C61,0xA004,0xA002,0x5411, 0x50CF,0xA002,0x6A61,0x5DF7,0xA008,0xA004,0xA002,0x9879,0x4EAB,0xA002,0x54CD,0x60F3,0xA004,0xA002,0x8BE6,0x7965, 0xA002,0x7FD4,0x4E61,0xA010,0xA008,0xA004,0xA002,0x6E58,0x8944,0xA002,0x7BB1,0x9999,0xA004,0xA002,0x9576,0x53A2, 0xA002,0x76F8,0x7EBF,0xA008,0xA004,0xA002,0x9650,0x9677,0xA002,0x5BAA,0x7FA1,0xA004,0xA002,0x9985,0x817A,0xA002, 0x53BF,0x732E,0xA020,0xA010,0xA008,0xA004,0xA002,0x73B0,0x9669,0xA002,0x663E,0x5ACC,0xA004,0xA002,0x5F26,0x6D8E, 0xA002,0x95F2,0x8237,0xA008,0xA004,0xA002,0x8854,0x8D24,0xA002,0x54B8,0x7EA4,0xA004,0xA002,0x9C9C,0x4ED9,0xA002, 0x5148,0x9528,0xA010,0xA008,0xA004,0xA002,0x6380,0x5413,0xA002,0x590F,0x53A6,0xA004,0xA002,0x4E0B,0x72ED,0xA002, 0x4FA0,0x5CE1,0xA008,0xA004,0xA002,0x6687,0x8F96,0xA002,0x971E,0x5323,0xA004,0xA002,0x867E,0x778E,0xA002,0x7EC6, 0x620F,0xA0EE,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x9699,0xA002,0x7CFB,0x6D17,0xA004,0xA002,0x94E3,0x559C, 0xA002,0x5AB3,0x4E60,0xA008,0xA004,0xA002,0x5E2D,0x88AD,0xA002,0x6A84,0x7280,0xA004,0xA002,0x6C50,0x6EAA,0xA002, 0x70EF,0x7184,0xA010,0xA008,0xA004,0xA002,0x60DC,0x5915,0xA002,0x819D,0x6089,0xA004,0xA002,0x5E0C,0x606F,0xA002, 0x7A00,0x8823,0xA008,0xA004,0xA002,0x8820,0x881F,0xA002,0x881E,0x881D,0xA004,0xA002,0x881C,0x881A,0xA002,0x8819, 0x8818,0xA020,0xA010,0xA008,0xA004,0xA002,0x8817,0x8814,0xA002,0x8812,0x8811,0xA004,0xA002,0x8810,0x880F,0xA002, 0x880E,0x880D,0xA008,0xA004,0xA002,0x880C,0x880B,0xA002,0x8809,0x8808,0xA004,0xA002,0x8807,0x8806,0xA002,0x8805, 0x8804,0xA010,0xA008,0xA004,0xA002,0x8802,0x8801,0xA002,0x8800,0x87FF,0xA004,0xA002,0x87FD,0x87FC,0xA002,0x87FB, 0x87FA,0xA007,0xA003,0xA001,0x87F8,0xA002,0x87F7,0x87F6,0xA004,0xA002,0x87F5,0x87F4,0xA002,0x87F3,0x87F2,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x87F1,0x87F0,0xA002,0x87EF,0x87ED,0xA004,0xA002,0x87EC,0x87EB,0xA002,0x87E9, 0x87E8,0xA008,0xA004,0xA002,0x87E7,0x87E6,0xA002,0x87E4,0x87E3,0xA004,0xA002,0x87E2,0x87E1,0xA002,0x87DF,0x87DE, 0xA010,0xA008,0xA004,0xA002,0x87DD,0x87DC,0xA002,0x87DA,0x87D9,0xA004,0xA002,0x87D8,0x87D7,0xA002,0x87D6,0x87D5, 0xA008,0xA004,0xA002,0x87D4,0x87D0,0xA002,0x87CF,0x87CE,0xA004,0xA002,0x87CD,0x87CC,0xA002,0x87C9,0x87C8,0xA020, 0xA010,0xA008,0xA004,0xA002,0x87C7,0x87C5,0xA002,0x87C4,0x87C3,0xA004,0xA002,0x87C2,0x87C1,0xA002,0x87BF,0x87BE, 0xA008,0xA004,0xA002,0x87BC,0x87BB,0xA002,0x87B9,0x87B8,0xA004,0xA002,0x87B7,0x87B6,0xA002,0x87B4,0x87B2,0xA000, 0xA008,0xA004,0xA002,0x87B1,0x87B0,0xA002,0x87AE,0x87AA,0xA004,0xA002,0x87A9,0x87A7,0xA002,0x87A6,0x87A5,0xA010, 0xA001,0xA001,0xA001,0xA005,0xA001,0xA002,0x727A,0x9521,0xA004,0xA002,0x5438,0x563B,0xA002,0x6670,0x77FD,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x7852,0x897F,0xA002,0x6790,0x7199,0xA004,0xA002,0x6614,0x8BEF,0xA002,0x609F, 0x52A1,0xA008,0xA004,0xA002,0x52FF,0x7269,0xA002,0x6664,0x96FE,0xA004,0xA002,0x620A,0x575E,0xA002,0x4FAE,0x4F0D, 0xA010,0xA008,0xA004,0xA002,0x821E,0x5348,0xA002,0x6342,0x4E94,0xA004,0xA002,0x6B66,0x6BCB,0xA002,0x5434,0x543E, 0xA008,0xA004,0xA002,0x68A7,0x829C,0xA002,0x65E0,0x5C4B,0xA004,0xA002,0x8BEC,0x6C61,0xA002,0x4E4C,0x94A8,0xA020, 0xA010,0xA008,0xA004,0xA002,0x545C,0x5DEB,0xA002,0x6C83,0x63E1,0xA004,0xA002,0x5367,0x65A1,0xA002,0x6211,0x7A9D, 0xA008,0xA004,0xA002,0x6DA1,0x8717,0xA002,0x631D,0x74EE,0xA004,0xA002,0x7FC1,0x55E1,0xA002,0x95EE,0x7D0A,0xA010, 0xA008,0xA004,0xA002,0x7A33,0x543B,0xA002,0x7EB9,0x95FB,0xA004,0xA002,0x6587,0x868A,0xA002,0x6E29,0x761F,0xA008, 0xA004,0xA002,0x536B,0x6170,0xA002,0x5C09,0x8C13,0xA004,0xA002,0x6E2D,0x4F4D,0xA002,0x9B4F,0x5582,0xABF6,0xA5FB, 0xA2FF,0xA17E,0xA0F3,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x80C3,0xA002,0x754F,0x5473,0xA004,0xA002,0x851A, 0x672A,0xA002,0x7EAC,0x5C3E,0xA008,0xA004,0xA002,0x4F2A,0x4F1F,0xA002,0x59D4,0x840E,0xA004,0xA002,0x82C7,0x7EF4, 0xA002,0x6F4D,0x4E3A,0xA010,0xA008,0xA004,0xA002,0x60DF,0x552F,0xA002,0x56F4,0x6845,0xA004,0xA002,0x8FDD,0x97E6, 0xA002,0x5371,0x5FAE,0xA008,0xA004,0xA002,0x5DCD,0x87A4,0xA002,0x87A3,0x87A2,0xA004,0xA002,0x87A1,0x87A0,0xA002, 0x879E,0x879D,0xA020,0xA010,0xA008,0xA004,0xA002,0x879C,0x879B,0xA002,0x879A,0x8799,0xA004,0xA002,0x8798,0x8796, 0xA002,0x8795,0x8794,0xA008,0xA004,0xA002,0x8792,0x8791,0xA002,0x8790,0x878F,0xA004,0xA002,0x878E,0x878C,0xA002, 0x878A,0x8789,0xA010,0xA008,0xA004,0xA002,0x8787,0x8786,0xA002,0x8784,0x8781,0xA004,0xA002,0x8780,0x877F,0xA002, 0x877A,0x8779,0xA007,0xA004,0xA002,0x8778,0x8777,0xA001,0x8775,0xA004,0xA002,0x8773,0x8772,0xA002,0x8771,0x876F, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x876D,0xA002,0x876C,0x876B,0xA004,0xA002,0x876A,0x8769,0xA002,0x8768,0x8767, 0xA008,0xA004,0xA002,0x8766,0x8762,0xA002,0x8761,0x875F,0xA004,0xA002,0x875E,0x875D,0xA002,0x875C,0x875B,0xA010, 0xA008,0xA004,0xA002,0x875A,0x8758,0xA002,0x8756,0x8755,0xA004,0xA002,0x8754,0x8752,0xA002,0x8751,0x8750,0xA008, 0xA004,0xA002,0x874F,0x874D,0xA002,0x874B,0x874A,0xA004,0xA002,0x8746,0x8745,0xA002,0x8744,0x8743,0xA020,0xA010, 0xA008,0xA004,0xA002,0x8742,0x8741,0xA002,0x8740,0x873D,0xA004,0xA002,0x873C,0x873A,0xA002,0x8739,0x8738,0xA008, 0xA004,0xA002,0x8736,0x8735,0xA002,0x8733,0x8732,0xA004,0xA002,0x8730,0x872F,0xA002,0x872D,0x872C,0xA010,0xA008, 0xA004,0xA002,0x872B,0x872A,0xA002,0x8728,0x8727,0xA004,0xA002,0x8726,0x8724,0xA002,0x8720,0x871F,0xA000,0xA004, 0xA002,0x871D,0x871B,0xA000,0x8719,0xA00B,0xA001,0xA001,0xA001,0xA001,0xA003,0xA001,0x5A01,0xA002,0x5984,0x5FD8, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x671B,0x65FA,0xA002,0x5F80,0x7F51,0xA004,0xA002,0x6789,0x4EA1,0xA002, 0x738B,0x6C6A,0xA008,0xA004,0xA002,0x8155,0x4E07,0xA002,0x5A49,0x5B9B,0xA004,0xA002,0x60CB,0x7696,0xA002,0x665A, 0x633D,0xA010,0xA008,0xA004,0xA002,0x7897,0x5B8C,0xA002,0x70F7,0x4E38,0xA004,0xA002,0x987D,0x73A9,0xA002,0x6E7E, 0x5F2F,0xA008,0xA004,0xA002,0x8C4C,0x5916,0xA002,0x6B6A,0x889C,0xA004,0xA002,0x74E6,0x5A03,0xA002,0x6D3C,0x86D9, 0xA020,0xA010,0xA008,0xA004,0xA002,0x54C7,0x6316,0xA002,0x553E,0x62D3,0xA004,0xA002,0x59A5,0x692D,0xA002,0x9A7C, 0x9A6E,0xA008,0xA004,0xA002,0x9640,0x9E35,0xA002,0x8131,0x6258,0xA004,0xA002,0x62D6,0x81C0,0xA002,0x5C6F,0x541E, 0xA010,0xA008,0xA004,0xA002,0x9000,0x892A,0xA002,0x8715,0x817F,0xA004,0xA002,0x9893,0x63A8,0xA002,0x56E2,0x6E4D, 0xA008,0xA004,0xA002,0x5154,0x5410,0xA002,0x571F,0x5C60,0xA004,0xA002,0x6D82,0x9014,0xA002,0x5F92,0x56FE,0xA0F9, 0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7A81,0xA002,0x79C3,0x51F8,0xA004,0xA002,0x900F,0x5934,0xA002,0x6295, 0x5077,0xA008,0xA004,0xA002,0x75DB,0x7EDF,0xA002,0x7B52,0x6345,0xA004,0xA002,0x6876,0x7AE5,0xA002,0x5F64,0x94DC, 0xA010,0xA008,0xA004,0xA002,0x540C,0x77B3,0xA002,0x916E,0x6850,0xA004,0xA002,0x901A,0x8247,0xA002,0x633A,0x5EAD, 0xA008,0xA004,0xA002,0x4EAD,0x505C,0xA002,0x5EF7,0x6C40,0xA004,0xA002,0x8716,0x8714,0xA002,0x8711,0x8710,0xA020, 0xA010,0xA008,0xA004,0xA002,0x870F,0x870E,0xA002,0x870C,0x870B,0xA004,0xA002,0x8706,0x8705,0xA002,0x8704,0x8701, 0xA008,0xA004,0xA002,0x86FF,0x86FD,0xA002,0x86FC,0x86FB,0xA004,0xA002,0x86FA,0x86F7,0xA002,0x86F6,0x86F5,0xA010, 0xA008,0xA004,0xA002,0x86EF,0x86EC,0xA002,0x86EB,0x86EA,0xA004,0xA002,0x86E8,0x86E7,0xA002,0x86E6,0x86E5,0xA008, 0xA004,0xA002,0x86E3,0x86E2,0xA002,0x86E1,0x86E0,0xA003,0xA000,0x86DD,0xA002,0x86DC,0x86DA,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x86D7,0x86D6,0xA002,0x86D5,0x86D3,0xA004,0xA002,0x86D2,0x86CD,0xA002,0x86CC,0x86C8,0xA008, 0xA004,0xA002,0x86C5,0x86C3,0xA002,0x86C2,0x86C1,0xA004,0xA002,0x86BF,0x86BE,0xA002,0x86BD,0x86BC,0xA010,0xA008, 0xA004,0xA002,0x86BB,0x86B9,0xA002,0x86B8,0x86B7,0xA004,0xA002,0x86B3,0x86B2,0xA002,0x86AE,0x86AD,0xA008,0xA004, 0xA002,0x86AB,0x86A6,0xA002,0x86A5,0x86A2,0xA004,0xA002,0x86A1,0x86A0,0xA002,0x869F,0x869E,0xA020,0xA010,0xA008, 0xA004,0xA002,0x869B,0x869A,0xA002,0x8699,0x8698,0xA004,0xA002,0x8697,0x8696,0xA002,0x8694,0x8692,0xA008,0xA004, 0xA002,0x8691,0x8690,0xA002,0x868F,0x868E,0xA004,0xA002,0x8689,0x8688,0xA002,0x8687,0x8686,0xA010,0xA008,0xA004, 0xA002,0x8685,0x8684,0xA002,0x8683,0x8678,0xA004,0xA002,0x8677,0x8676,0xA002,0x8675,0x8674,0xA008,0xA004,0xA002, 0x8673,0x8672,0xA002,0x8670,0x866F,0xA000,0xA000,0x866D,0xA008,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0x70C3, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x542C,0x5385,0xA002,0x5E16,0x94C1,0xA004,0xA002,0x8D34,0x8DF3,0xA002, 0x773A,0x8FE2,0xA008,0xA004,0xA002,0x6761,0x6311,0xA002,0x8146,0x8214,0xA004,0xA002,0x606C,0x751C,0xA002,0x7530, 0x586B,0xA010,0xA008,0xA004,0xA002,0x6DFB,0x5929,0xA002,0x5C49,0x5243,0xA004,0xA002,0x6D95,0x60D5,0xA002,0x568F, 0x66FF,0xA008,0xA004,0xA002,0x4F53,0x557C,0xA002,0x8E44,0x9898,0xA004,0xA002,0x63D0,0x9511,0xA002,0x8E22,0x5254, 0xA020,0xA010,0xA008,0xA004,0xA002,0x68AF,0x8A8A,0xA002,0x75BC,0x817E,0xA004,0xA002,0x85E4,0x7279,0xA002,0x5957, 0x8BA8,0xA008,0xA004,0xA002,0x9676,0x6DD8,0xA002,0x9003,0x6843,0xA004,0xA002,0x8404,0x7EE6,0xA002,0x6ED4,0x6D9B, 0xA010,0xA008,0xA004,0xA002,0x638F,0x70EB,0xA002,0x8D9F,0x6DCC,0xA004,0xA002,0x8EBA,0x5018,0xA002,0x7CD6,0x5510, 0xA008,0xA004,0xA002,0x819B,0x68E0,0xA002,0x5802,0x642A,0xA004,0xA002,0x5858,0x6C64,0xA002,0x70AD,0x53F9,0xA17C, 0xA0FC,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x63A2,0xA002,0x78B3,0x8892,0xA004,0xA002,0x6BEF,0x5766,0xA002, 0x8C08,0x8C2D,0xA008,0xA004,0xA002,0x6F6D,0x75F0,0xA002,0x6A80,0x575B,0xA004,0xA002,0x6EE9,0x762B,0xA002,0x8D2A, 0x644A,0xA010,0xA008,0xA004,0xA002,0x574D,0x6C70,0xA002,0x6001,0x592A,0xA004,0xA002,0x915E,0x6CF0,0xA002,0x53F0, 0x62AC,0xA008,0xA004,0xA002,0x82D4,0x80CE,0xA002,0x8E0F,0x8E4B,0xA004,0xA002,0x631E,0x736D,0xA002,0x866A,0x8669, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8668,0x8667,0xA002,0x8666,0x8665,0xA004,0xA002,0x8664,0x8663,0xA002,0x8661, 0x8660,0xA008,0xA004,0xA002,0x865F,0x865D,0xA002,0x865C,0x865B,0xA004,0xA002,0x8659,0x8658,0xA002,0x8657,0x8656, 0xA010,0xA008,0xA004,0xA002,0x8655,0x8653,0xA002,0x8652,0x864C,0xA004,0xA002,0x864B,0x864A,0xA002,0x8649,0x8648, 0xA008,0xA004,0xA002,0x8647,0x8646,0xA002,0x8645,0x8644,0xA004,0xA002,0x8643,0x8642,0xA000,0x8641,0xA040,0xA020, 0xA010,0xA008,0xA004,0xA002,0x8640,0x863F,0xA002,0x863E,0x863D,0xA004,0xA002,0x863B,0x863A,0xA002,0x8639,0x8637, 0xA008,0xA004,0xA002,0x8636,0x8635,0xA002,0x8634,0x8633,0xA004,0xA002,0x8632,0x8631,0xA002,0x8630,0x862F,0xA010, 0xA008,0xA004,0xA002,0x862E,0x862D,0xA002,0x862C,0x862B,0xA004,0xA002,0x862A,0x8628,0xA002,0x8626,0x8625,0xA008, 0xA004,0xA002,0x8624,0x8623,0xA002,0x8622,0x8621,0xA004,0xA002,0x8620,0x861F,0xA002,0x861E,0x861D,0xA020,0xA010, 0xA008,0xA004,0xA002,0x861C,0x861B,0xA002,0x861A,0x8619,0xA004,0xA002,0x8618,0x8617,0xA002,0x8615,0x8614,0xA008, 0xA004,0xA002,0x8613,0x8612,0xA002,0x8610,0x860F,0xA004,0xA002,0x860E,0x860D,0xA002,0x860C,0x860B,0xA010,0xA008, 0xA004,0xA002,0x860A,0x8609,0xA002,0x8608,0x8607,0xA004,0xA002,0x8606,0x8604,0xA002,0x8603,0x8602,0xA008,0xA004, 0xA002,0x8601,0x8600,0xA002,0x85FE,0x85FD,0xA004,0xA002,0x85FC,0x85FA,0xA000,0x85F9,0xA001,0xA03F,0xA01F,0xA00F, 0xA007,0xA003,0xA001,0x5854,0xA002,0x5979,0x5B83,0xA004,0xA002,0x4ED6,0x584C,0xA002,0x6240,0x9501,0xA008,0xA004, 0xA002,0x7D22,0x7410,0xA002,0x7F29,0x5506,0xA004,0xA002,0x68AD,0x84D1,0xA002,0x7B0B,0x635F,0xA010,0xA008,0xA004, 0xA002,0x5B59,0x795F,0xA002,0x96A7,0x9042,0xA004,0xA002,0x7A57,0x5C81,0xA002,0x788E,0x9AD3,0xA008,0xA004,0xA002, 0x7EE5,0x968F,0xA002,0x968B,0x867D,0xA004,0xA002,0x7B97,0x849C,0xA002,0x9178,0x8083,0xA020,0xA010,0xA008,0xA004, 0xA002,0x8BC9,0x5BBF,0xA002,0x6EAF,0x5851,0xA004,0xA002,0x50F3,0x7C9F,0xA002,0x901F,0x7D20,0xA008,0xA004,0xA002, 0x4FD7,0x9165,0xA002,0x82CF,0x55FD,0xA004,0xA002,0x64DE,0x8258,0xA002,0x641C,0x8BF5,0xA010,0xA008,0xA004,0xA002, 0x8BBC,0x5B8B,0xA002,0x9001,0x9882,0xA004,0xA002,0x6002,0x8038,0xA002,0x677E,0x5DF3,0xA008,0xA004,0xA002,0x9972, 0x4F3C,0xA002,0x4F3A,0x56DB,0xA004,0xA002,0x55E3,0x5BFA,0xA002,0x8086,0x6B7B,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x4E1D,0xA002,0x53F8,0x79C1,0xA004,0xA002,0x601D,0x5636,0xA002,0x6495,0x65AF,0xA008,0xA004,0xA002, 0x70C1,0x6714,0xA002,0x7855,0x8BF4,0xA004,0xA002,0x821C,0x987A,0xA002,0x77AC,0x542E,0xA010,0xA008,0xA004,0xA002, 0x7A0E,0x7761,0xA002,0x6C34,0x8C01,0xA004,0xA002,0x723D,0x53CC,0xA002,0x971C,0x62F4,0xA008,0xA004,0xA002,0x6813, 0x5E05,0xA002,0x7529,0x8870,0xA004,0xA002,0x6454,0x800D,0xA002,0x5237,0x6055,0xA020,0xA010,0xA008,0xA004,0xA002, 0x85F8,0x85F7,0xA002,0x85F6,0x85F5,0xA004,0xA002,0x85F4,0x85F3,0xA002,0x85F2,0x85F1,0xA008,0xA004,0xA002,0x85F0, 0x85EF,0xA002,0x85EE,0x85ED,0xA004,0xA002,0x85EC,0x85EB,0xA002,0x85EA,0x85E8,0xA010,0xA008,0xA004,0xA002,0x85E7, 0x85E6,0xA002,0x85E5,0x85E3,0xA004,0xA002,0x85E2,0x85E1,0xA002,0x85E0,0x85DF,0xA008,0xA004,0xA002,0x85DE,0x85DD, 0xA002,0x85DB,0x85DA,0xA004,0xA002,0x85D9,0x85D8,0xA002,0x85D7,0x85D6,0xA03F,0xA01F,0xA00F,0xA007,0xA003,0xA000, 0x85D4,0xA002,0x85D2,0x85D1,0xA004,0xA002,0x85CE,0x85CD,0xA002,0x85CC,0x85CB,0xA008,0xA004,0xA002,0x85CA,0x85C8, 0xA002,0x85C7,0x85C6,0xA004,0xA002,0x85C5,0x85C4,0xA002,0x85C3,0x85C2,0xA010,0xA008,0xA004,0xA002,0x85C0,0x85BF, 0xA002,0x85BE,0x85BD,0xA004,0xA002,0x85BC,0x85BB,0xA002,0x85BA,0x85B8,0xA008,0xA004,0xA002,0x85B6,0x85B5,0xA002, 0x85B4,0x85B3,0xA004,0xA002,0x85B2,0x85B1,0xA002,0x85AD,0x85AC,0xA020,0xA010,0xA008,0xA004,0xA002,0x85AB,0x85A9, 0xA002,0x85A7,0x85A6,0xA004,0xA002,0x85A5,0x85A3,0xA002,0x85A2,0x85A1,0xA008,0xA004,0xA002,0x85A0,0x859F,0xA002, 0x859E,0x859D,0xA004,0xA002,0x859A,0x8599,0xA002,0x8598,0x8597,0xA010,0xA008,0xA004,0xA002,0x8596,0x8595,0xA002, 0x8594,0x8593,0xA004,0xA002,0x8592,0x8591,0xA002,0x8590,0x858E,0xA008,0xA004,0xA002,0x858D,0x858C,0xA002,0x858B, 0x858A,0xA004,0xA002,0x8589,0x8588,0xA002,0x8586,0x8583,0xA007,0xA000,0xA000,0xA000,0xA000,0xA000,0x8582,0xA03C, 0xA01C,0xA00C,0xA004,0xA001,0xA001,0x6F31,0xA004,0xA002,0x6570,0x5EB6,0xA002,0x5885,0x7AD6,0xA008,0xA004,0xA002, 0x620D,0x675F,0xA002,0x6811,0x8FF0,0xA004,0xA002,0x672F,0x5C5E,0xA002,0x9F20,0x9ECD,0xA010,0xA008,0xA004,0xA002, 0x8700,0x7F72,0xA002,0x66D9,0x6691,0xA004,0xA002,0x85AF,0x719F,0xA002,0x5B70,0x8D4E,0xA008,0xA004,0xA002,0x4E66, 0x758F,0xA002,0x6DD1,0x8212,0xA004,0xA002,0x53D4,0x8F93,0xA002,0x6292,0x6B8A,0xA020,0xA010,0xA008,0xA004,0xA002, 0x68B3,0x67A2,0xA002,0x852C,0x517D,0xA004,0xA002,0x7626,0x53D7,0xA002,0x552E,0x6388,0xA008,0xA004,0xA002,0x5BFF, 0x5B88,0xA002,0x9996,0x624B,0xA004,0xA002,0x6536,0x8BD5,0xA002,0x89C6,0x5BA4,0xA010,0xA008,0xA004,0xA002,0x6043, 0x5E02,0xA002,0x6C0F,0x9970,0xA004,0xA002,0x91CA,0x4F8D,0xA002,0x4ED5,0x9002,0xA008,0xA004,0xA002,0x566C,0x55DC, 0xA002,0x662F,0x52BF,0xA004,0xA002,0x901D,0x8A93,0xA002,0x62ED,0x4E8B,0xA2FC,0xA17E,0xA0FB,0xA07E,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x67FF,0xA002,0x4E16,0x58EB,0xA004,0xA002,0x793A,0x5F0F,0xA002,0x59CB,0x9A76,0xA008,0xA004, 0xA002,0x5C4E,0x4F7F,0xA002,0x77E2,0x53F2,0xA004,0xA002,0x8BC6,0x5B9E,0xA002,0x8680,0x98DF,0xA010,0xA008,0xA004, 0xA002,0x4EC0,0x65F6,0xA002,0x62FE,0x77F3,0xA004,0xA002,0x5341,0x8671,0xA002,0x5C38,0x8BD7,0xA008,0xA004,0xA002, 0x6E7F,0x65BD,0xA002,0x72EE,0x5931,0xA004,0xA002,0x5E08,0x5723,0xA002,0x80DC,0x5269,0xA020,0xA010,0xA008,0xA004, 0xA002,0x76DB,0x7701,0xA002,0x8581,0x8580,0xA004,0xA002,0x857F,0x857D,0xA002,0x857C,0x8578,0xA008,0xA004,0xA002, 0x8577,0x8576,0xA002,0x8575,0x8573,0xA004,0xA002,0x8571,0x8570,0xA002,0x856F,0x856E,0xA010,0xA008,0xA004,0xA002, 0x856D,0x856C,0xA002,0x856B,0x856A,0xA004,0xA002,0x8569,0x8567,0xA002,0x8566,0x8565,0xA008,0xA004,0xA002,0x8563, 0x8562,0xA002,0x8561,0x8560,0xA004,0xA002,0x855F,0x855D,0xA002,0x855C,0x855B,0xA03D,0xA01D,0xA00D,0xA006,0xA002, 0x855A,0xA002,0x8558,0x8557,0xA003,0xA001,0x8555,0xA002,0x8554,0x8553,0xA008,0xA004,0xA002,0x8552,0x8551,0xA002, 0x8550,0x854F,0xA004,0xA002,0x854E,0x854D,0xA002,0x854C,0x854B,0xA010,0xA008,0xA004,0xA002,0x8547,0x8546,0xA002, 0x8545,0x8544,0xA004,0xA002,0x8542,0x8541,0xA002,0x8540,0x853F,0xA008,0xA004,0xA002,0x853E,0x8536,0xA002,0x8535, 0x8534,0xA004,0xA002,0x8533,0x8532,0xA002,0x8531,0x8530,0xA020,0xA010,0xA008,0xA004,0xA002,0x852F,0x852E,0xA002, 0x852D,0x852A,0xA004,0xA002,0x8529,0x8528,0xA002,0x8527,0x8526,0xA008,0xA004,0xA002,0x8525,0x8524,0xA002,0x8523, 0x8522,0xA004,0xA002,0x8520,0x851E,0xA002,0x851D,0x851C,0xA010,0xA008,0xA004,0xA002,0x851B,0x8519,0xA002,0x8518, 0x8516,0xA004,0xA002,0x8515,0x8514,0xA002,0x8512,0x8510,0xA008,0xA004,0xA002,0x850F,0x850E,0xA002,0x850D,0x850B, 0xA004,0xA002,0x850A,0x8509,0xA002,0x8508,0x8507,0xA00D,0xA000,0xA000,0xA000,0xA006,0xA002,0x8506,0xA002,0x8505, 0x8504,0xA000,0xA000,0x8503,0xA036,0xA016,0xA006,0xA001,0xA001,0xA002,0x7EF3,0x5347,0xA008,0xA004,0xA002,0x7272, 0x7525,0xA002,0x751F,0x58F0,0xA004,0xA002,0x6E17,0x614E,0xA002,0x80BE,0x751A,0xA010,0xA008,0xA004,0xA002,0x5A76, 0x5BA1,0xA002,0x6C88,0x795E,0xA004,0xA002,0x7EC5,0x5A20,0xA002,0x6DF1,0x8EAB,0xA008,0xA004,0xA002,0x4F38,0x547B, 0xA002,0x7533,0x7837,0xA004,0xA002,0x8BBE,0x793E,0xA002,0x6D89,0x6151,0xA020,0xA010,0xA008,0xA004,0xA002,0x5C04, 0x6444,0xA002,0x8D66,0x820D,0xA004,0xA002,0x820C,0x86C7,0xA002,0x8D4A,0x5962,0xA008,0xA004,0xA002,0x7ECD,0x90B5, 0xA002,0x54E8,0x5C11,0xA004,0xA002,0x97F6,0x52FA,0xA002,0x828D,0x70E7,0xA010,0xA008,0xA004,0xA002,0x7A0D,0x634E, 0xA002,0x68A2,0x88F3,0xA004,0xA002,0x5C1A,0x4E0A,0xA002,0x664C,0x8D4F,0xA008,0xA004,0xA002,0x5546,0x4F24,0xA002, 0x5892,0x7F2E,0xA004,0xA002,0x6247,0x6C55,0xA002,0x5584,0x81B3,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x8D61,0xA002,0x64C5,0x9655,0xA004,0xA002,0x95EA,0x886B,0xA002,0x717D,0x5220,0xA008,0xA004,0xA002,0x5C71,0x6749, 0xA002,0x82EB,0x73CA,0xA004,0xA002,0x6652,0x7B5B,0xA002,0x715E,0x5565,0xA010,0xA008,0xA004,0xA002,0x50BB,0x7EB1, 0xA002,0x6C99,0x5239,0xA004,0xA002,0x6740,0x7802,0xA002,0x838E,0x50E7,0xA008,0xA004,0xA002,0x68EE,0x6DA9,0xA002, 0x8272,0x745F,0xA004,0xA002,0x5AC2,0x626B,0xA002,0x9A9A,0x6414,0xA020,0xA010,0xA008,0xA004,0xA002,0x4E27,0x55D3, 0xA002,0x6851,0x6563,0xA004,0xA002,0x4F1E,0x8502,0xA002,0x8501,0x8500,0xA008,0xA004,0xA002,0x84FE,0x84FD,0xA002, 0x84FB,0x84FA,0xA004,0xA002,0x84F9,0x84F8,0xA002,0x84F7,0x84F6,0xA010,0xA008,0xA004,0xA002,0x84F5,0x84F4,0xA002, 0x84F3,0x84F2,0xA004,0xA002,0x84F1,0x84EF,0xA002,0x84EE,0x84ED,0xA008,0xA004,0xA002,0x84EB,0x84EA,0xA002,0x84E9, 0x84E8,0xA004,0xA002,0x84E7,0x84E4,0xA002,0x84E2,0x84E1,0xA03F,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x84DE,0x84DC, 0xA002,0x84DB,0x84DA,0xA004,0xA002,0x84D9,0x84D8,0xA001,0x84D7,0xA008,0xA004,0xA002,0x84D5,0x84D4,0xA002,0x84D2, 0x84CF,0xA004,0xA002,0x84CE,0x84CC,0xA002,0x84CB,0x84C8,0xA010,0xA008,0xA004,0xA002,0x84C7,0x84C6,0xA002,0x84C5, 0x84C3,0xA004,0xA002,0x84C2,0x84C0,0xA002,0x84BE,0x84BC,0xA008,0xA004,0xA002,0x84BB,0x84B7,0xA002,0x84B6,0x84B5, 0xA004,0xA002,0x84B3,0x84B1,0xA002,0x84B0,0x84AE,0xA020,0xA010,0xA008,0xA004,0xA002,0x84AD,0x84AC,0xA002,0x84AB, 0x84AA,0xA004,0xA002,0x84A9,0x84A8,0xA002,0x84A7,0x84A6,0xA008,0xA004,0xA002,0x84A5,0x84A4,0xA002,0x84A3,0x84A2, 0xA004,0xA002,0x84A0,0x849F,0xA002,0x849E,0x849D,0xA010,0xA008,0xA004,0xA002,0x849B,0x849A,0xA002,0x8498,0x8496, 0xA004,0xA002,0x8495,0x8494,0xA002,0x8493,0x8492,0xA008,0xA004,0xA002,0x8491,0x8490,0xA002,0x848F,0x848D,0xA004, 0xA002,0x848A,0x8486,0xA002,0x8485,0x8484,0xA010,0xA000,0xA000,0xA000,0xA006,0xA002,0x8483,0xA002,0x8481,0x8480, 0xA004,0xA002,0x847F,0x847E,0xA000,0x847D,0xA031,0xA011,0xA001,0xA008,0xA004,0xA002,0x53C1,0x4E09,0xA002,0x8D5B, 0x585E,0xA004,0xA002,0x9CC3,0x816E,0xA002,0x8428,0x6D12,0xA010,0xA008,0xA004,0xA002,0x6492,0x5F31,0xA002,0x82E5, 0x6DA6,0xA004,0xA002,0x95F0,0x9510,0xA002,0x745E,0x854A,0xA008,0xA004,0xA002,0x962E,0x8F6F,0xA002,0x8925,0x5165, 0xA004,0xA002,0x6C5D,0x4E73,0xA002,0x8FB1,0x5982,0xA020,0xA010,0xA008,0xA004,0xA002,0x5B7A,0x5112,0xA002,0x8815, 0x8339,0xA004,0xA002,0x8089,0x67D4,0xA002,0x63C9,0x5197,0xA008,0xA004,0xA002,0x7ED2,0x5BB9,0xA002,0x6EB6,0x7194, 0xA004,0xA002,0x878D,0x8363,0xA002,0x84C9,0x8338,0xA010,0xA008,0xA004,0xA002,0x620E,0x65E5,0xA002,0x4ECD,0x6254, 0xA004,0xA002,0x7EAB,0x598A,0xA002,0x5203,0x8BA4,0xA008,0xA004,0xA002,0x4EFB,0x97E7,0xA002,0x5FCD,0x4EBA,0xA004, 0xA002,0x4EC1,0x58EC,0xA002,0x70ED,0x60F9,0xA180,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7ED5,0xA002, 0x6270,0x9976,0xA004,0xA002,0x8BA9,0x56B7,0xA002,0x6518,0x58E4,0xA008,0xA004,0xA002,0x74E4,0x67D3,0xA002,0x5189, 0x71C3,0xA004,0xA002,0x7136,0x7FA4,0xA002,0x88D9,0x96C0,0xA010,0xA008,0xA004,0xA002,0x786E,0x69B7,0xA002,0x9E4A, 0x5374,0xA004,0xA002,0x7638,0x7094,0xA002,0x7F3A,0x529D,0xA008,0xA004,0xA002,0x5238,0x72AC,0xA002,0x62F3,0x75CA, 0xA004,0xA002,0x5168,0x6CC9,0xA002,0x919B,0x6743,0xA020,0xA010,0xA008,0xA004,0xA002,0x98A7,0x5708,0xA002,0x53BB, 0x8DA3,0xA004,0xA002,0x9F8B,0x5A36,0xA002,0x53D6,0x847C,0xA008,0xA004,0xA002,0x847B,0x8479,0xA002,0x8477,0x8474, 0xA004,0xA002,0x8472,0x8470,0xA002,0x846F,0x846E,0xA010,0xA008,0xA004,0xA002,0x846A,0x8468,0xA002,0x8467,0x8466, 0xA004,0xA002,0x8465,0x8464,0xA002,0x8462,0x8460,0xA008,0xA004,0xA002,0x845F,0x845E,0xA002,0x845D,0x8458,0xA004, 0xA002,0x8456,0x8455,0xA002,0x8454,0x8453,0xA03F,0xA01F,0xA010,0xA008,0xA004,0xA002,0x8452,0x8450,0xA002,0x844F, 0x844E,0xA004,0xA002,0x844D,0x844C,0xA002,0x844B,0x844A,0xA007,0xA003,0xA001,0x8449,0xA002,0x8448,0x8447,0xA004, 0xA002,0x8445,0x8444,0xA002,0x8443,0x8442,0xA010,0xA008,0xA004,0xA002,0x8441,0x8440,0xA002,0x843F,0x843E,0xA004, 0xA002,0x843B,0x843A,0xA002,0x8439,0x8437,0xA008,0xA004,0xA002,0x8436,0x8435,0xA002,0x8434,0x8433,0xA004,0xA002, 0x8432,0x8430,0xA002,0x842F,0x842E,0xA020,0xA010,0xA008,0xA004,0xA002,0x842D,0x842C,0xA002,0x842B,0x842A,0xA004, 0xA002,0x8429,0x8423,0xA002,0x8422,0x8421,0xA008,0xA004,0xA002,0x8420,0x841F,0xA002,0x841E,0x841B,0xA004,0xA002, 0x841A,0x8419,0xA002,0x8417,0x8416,0xA010,0xA008,0xA004,0xA002,0x8415,0x8414,0xA002,0x8413,0x8412,0xA004,0xA002, 0x8410,0x840A,0xA002,0x8409,0x8408,0xA008,0xA004,0xA002,0x8407,0x8405,0xA002,0x8402,0x8400,0xA004,0xA002,0x83FF, 0x83FE,0xA002,0x83FC,0x83FB,0xA015,0xA000,0xA000,0xA00E,0xA006,0xA002,0x83FA,0xA002,0x83F7,0x83F6,0xA004,0xA002, 0x83F5,0x83F4,0xA002,0x83F3,0x83EF,0xA000,0xA000,0xA000,0x83EE,0xA02E,0xA00E,0xA001,0xA005,0xA001,0xA002,0x6E20, 0x9A71,0xA004,0xA002,0x5C48,0x8EAF,0xA002,0x66F2,0x86C6,0xA010,0xA008,0xA004,0xA002,0x533A,0x8D8B,0xA002,0x6CC5, 0x914B,0xA004,0xA002,0x56DA,0x6C42,0xA002,0x7403,0x90B1,0xA008,0xA004,0xA002,0x4E18,0x79CB,0xA002,0x7A77,0x743C, 0xA004,0xA002,0x5E86,0x8BF7,0xA002,0x9877,0x60C5,0xA020,0xA010,0xA008,0xA004,0xA002,0x6C30,0x6674,0xA002,0x64CE, 0x6E05,0xA004,0xA002,0x537F,0x503E,0xA002,0x6C22,0x8F7B,0xA008,0xA004,0xA002,0x9752,0x6C81,0xA002,0x5BDD,0x79BD, 0xA004,0xA002,0x64D2,0x82B9,0xA002,0x52E4,0x7434,0xA010,0xA008,0xA004,0xA002,0x79E6,0x4EB2,0xA002,0x4FB5,0x94A6, 0xA004,0xA002,0x7A83,0x602F,0xA002,0x4E14,0x8304,0xA008,0xA004,0xA002,0x5207,0x7A8D,0xA002,0x4FCF,0x5CED,0xA004, 0xA002,0x7FD8,0x64AC,0xA002,0x9798,0x5DE7,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x4FA8,0xA002,0x4E54, 0x77A7,0xA004,0xA002,0x6865,0x6084,0xA002,0x6572,0x9539,0xA008,0xA004,0xA002,0x6A47,0x62A2,0xA002,0x5F3A,0x8537, 0xA004,0xA002,0x5899,0x7F8C,0xA002,0x8154,0x545B,0xA010,0xA008,0xA004,0xA002,0x67AA,0x6B49,0xA002,0x6B20,0x5D4C, 0xA004,0xA002,0x5811,0x8C34,0xA002,0x6D45,0x9063,0xA008,0xA004,0xA002,0x6F5C,0x524D,0xA002,0x94B3,0x94B1,0xA004, 0xA002,0x9ED4,0x4E7E,0xA002,0x8C26,0x4EDF,0xA020,0xA010,0xA008,0xA004,0xA002,0x7B7E,0x8FC1,0xA002,0x5343,0x94C5, 0xA004,0xA002,0x948E,0x6266,0xA002,0x7275,0x6D3D,0xA008,0xA004,0xA002,0x6070,0x83ED,0xA002,0x83EC,0x83EB,0xA004, 0xA002,0x83E8,0x83E7,0xA002,0x83E6,0x83E4,0xA010,0xA008,0xA004,0xA002,0x83E3,0x83E2,0xA002,0x83DE,0x83DB,0xA004, 0xA002,0x83DA,0x83D9,0xA002,0x83D7,0x83D5,0xA008,0xA004,0xA002,0x83D3,0x83D2,0xA002,0x83D1,0x83D0,0xA004,0xA002, 0x83CE,0x83CD,0xA002,0x83CB,0x83C9,0xA03F,0xA01F,0xA010,0xA008,0xA004,0xA002,0x83C8,0x83C6,0xA002,0x83C4,0x83C3, 0xA004,0xA002,0x83C2,0x83BF,0xA002,0x83BE,0x83BB,0xA007,0xA004,0xA002,0x83B5,0x83AF,0xA001,0x83AE,0xA004,0xA002, 0x83AD,0x83AC,0xA002,0x83A7,0x83A6,0xA010,0xA008,0xA004,0xA002,0x83A5,0x83A4,0xA002,0x83A3,0x83A2,0xA004,0xA002, 0x83A1,0x839F,0xA002,0x839D,0x839A,0xA008,0xA004,0xA002,0x8399,0x8397,0xA002,0x8396,0x8395,0xA004,0xA002,0x8394, 0x8391,0xA002,0x8390,0x838F,0xA020,0xA010,0xA008,0xA004,0xA002,0x838D,0x838C,0xA002,0x838B,0x838A,0xA004,0xA002, 0x8388,0x8387,0xA002,0x8384,0x8383,0xA008,0xA004,0xA002,0x8382,0x8381,0xA002,0x8380,0x837F,0xA004,0xA002,0x837E, 0x837A,0xA002,0x8379,0x8376,0xA010,0xA008,0xA004,0xA002,0x8375,0x8374,0xA002,0x8373,0x8372,0xA004,0xA002,0x8371, 0x8370,0xA002,0x8362,0x835D,0xA008,0xA004,0xA002,0x8359,0x8358,0xA002,0x8357,0x8356,0xA004,0xA002,0x8355,0x8353, 0xA002,0x834E,0x834D,0xA018,0xA000,0xA000,0xA00E,0xA006,0xA002,0x834C,0xA002,0x834B,0x834A,0xA004,0xA002,0x8348, 0x8345,0xA002,0x8344,0x8342,0xA000,0xA004,0xA002,0x8341,0x833F,0xA000,0x833E,0xA02A,0xA00A,0xA001,0xA001,0xA004, 0xA002,0x6390,0x8BAB,0xA002,0x6CE3,0x6C7D,0xA010,0xA008,0xA004,0xA002,0x5F03,0x8FC4,0xA002,0x6C14,0x5668,0xA004, 0xA002,0x780C,0x5951,0xA002,0x542F,0x4F01,0xA008,0xA004,0xA002,0x4E5E,0x5C82,0xA002,0x8D77,0x9A91,0xA004,0xA002, 0x7941,0x7948,0xA002,0x65D7,0x9F50,0xA020,0xA010,0xA008,0xA004,0xA002,0x8110,0x5D0E,0xA002,0x7566,0x6B67,0xA004, 0xA002,0x5947,0x68CB,0xA002,0x5176,0x6C8F,0xA008,0xA004,0xA002,0x67D2,0x6F06,0xA002,0x51C4,0x4E03,0xA004,0xA002, 0x59BB,0x621A,0xA002,0x6816,0x6B3A,0xA010,0xA008,0xA004,0xA002,0x671F,0x7011,0xA002,0x66DD,0x8C31,0xA004,0xA002, 0x6D66,0x666E,0xA002,0x5703,0x6734,0xA008,0xA004,0xA002,0x57D4,0x84B2,0xA002,0x83E9,0x8461,0xA004,0xA002,0x8386, 0x4EC6,0xA002,0x94FA,0x6251,0xA5FA,0xA2FB,0xA17E,0xA0FB,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5256,0xA002, 0x7C95,0x8FEB,0xA004,0xA002,0x9B44,0x7834,0xA002,0x5A46,0x9887,0xA008,0xA004,0xA002,0x6CFC,0x5761,0xA002,0x5C4F, 0x8BC4,0xA004,0xA002,0x74F6,0x51ED,0xA002,0x5E73,0x840D,0xA010,0xA008,0xA004,0xA002,0x82F9,0x576A,0xA002,0x4E52, 0x8058,0xA004,0xA002,0x54C1,0x8D2B,0xA002,0x9891,0x62FC,0xA008,0xA004,0xA002,0x77A5,0x6487,0xA002,0x7968,0x74E2, 0xA004,0xA002,0x6F02,0x98D8,0xA002,0x9A97,0x7247,0xA020,0xA010,0xA008,0xA004,0xA002,0x504F,0x7BC7,0xA002,0x8B6C, 0x5C41,0xA004,0xA002,0x50FB,0x75DE,0xA002,0x5339,0x76AE,0xA008,0xA004,0xA002,0x75B2,0x813E,0xA002,0x5564,0x833D, 0xA004,0xA002,0x833B,0x8337,0xA002,0x8332,0x8330,0xA010,0xA008,0xA004,0xA002,0x832E,0x832A,0xA002,0x8329,0x8326, 0xA004,0xA002,0x8325,0x8324,0xA002,0x8323,0x8322,0xA008,0xA004,0xA002,0x8321,0x8320,0xA002,0x831F,0x831E,0xA004, 0xA002,0x831D,0x8319,0xA002,0x8318,0x8316,0xA03D,0xA01D,0xA00E,0xA006,0xA002,0x8313,0xA002,0x8312,0x8310,0xA004, 0xA002,0x830D,0x830B,0xA002,0x830A,0x8300,0xA008,0xA004,0xA002,0x82FF,0x82FE,0xA002,0x82FD,0x82FC,0xA003,0xA000, 0x82FA,0xA002,0x82F8,0x82F6,0xA010,0xA008,0xA004,0xA002,0x82F5,0x82F3,0xA002,0x82F2,0x82F0,0xA004,0xA002,0x82EE, 0x82ED,0xA002,0x82EC,0x82EA,0xA008,0xA004,0xA002,0x82E9,0x82E8,0xA002,0x82E7,0x82E2,0xA004,0xA002,0x82DD,0x82DA, 0xA002,0x82D9,0x82D6,0xA020,0xA010,0xA008,0xA004,0xA002,0x82D0,0x82C9,0xA002,0x82C6,0x82C5,0xA004,0xA002,0x82C3, 0x82C2,0xA002,0x82C0,0x82BF,0xA008,0xA004,0xA002,0x82BC,0x82BB,0xA002,0x82BA,0x82B6,0xA004,0xA002,0x82B5,0x82B2, 0xA002,0x82A7,0x82A3,0xA010,0xA008,0xA004,0xA002,0x82A2,0x82A0,0xA002,0x829E,0x829B,0xA004,0xA002,0x829A,0x8296, 0xA002,0x8295,0x8294,0xA008,0xA004,0xA002,0x8293,0x8290,0xA002,0x828C,0x8289,0xA004,0xA002,0x8287,0x8286,0xA002, 0x8285,0x8283,0xA01D,0xA000,0xA000,0xA00E,0xA006,0xA002,0x8281,0xA002,0x8280,0x827C,0xA004,0xA002,0x827B,0x8278, 0xA002,0x8277,0x8276,0xA008,0xA004,0xA002,0x8275,0x8271,0xA002,0x826D,0x826C,0xA000,0xA002,0x826B,0x826A,0xA026, 0xA006,0xA001,0xA001,0xA001,0xA001,0x6BD7,0xA010,0xA008,0xA004,0xA002,0x7435,0x5288,0xA002,0x62AB,0x6279,0xA004, 0xA002,0x9739,0x7812,0xA002,0x576F,0x78B0,0xA008,0xA004,0xA002,0x6367,0x9E4F,0xA002,0x670B,0x81A8,0xA004,0xA002, 0x7BF7,0x787C,0xA002,0x68DA,0x84EC,0xA020,0xA010,0xA008,0xA004,0xA002,0x5F6D,0x6F8E,0xA002,0x70F9,0x62A8,0xA004, 0xA002,0x7830,0x76C6,0xA002,0x55B7,0x6C9B,0xA008,0xA004,0xA002,0x4F69,0x914D,0xA002,0x966A,0x8D54,0xA004,0xA002, 0x88F4,0x57F9,0xA002,0x80DA,0x5478,0xA010,0xA008,0xA004,0xA002,0x6CE1,0x8DD1,0xA002,0x888D,0x70AE,0xA004,0xA002, 0x5228,0x5486,0xA002,0x629B,0x80D6,0xA008,0xA004,0xA002,0x802A,0x65C1,0xA002,0x5E9E,0x4E53,0xA004,0xA002,0x53DB, 0x5224,0xA002,0x7554,0x76FC,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x78D0,0xA002,0x76D8,0x6F58,0xA004, 0xA002,0x6500,0x6D3E,0xA002,0x6E43,0x5F98,0xA008,0xA004,0xA002,0x724C,0x6392,0xA002,0x62CD,0x7436,0xA004,0xA002, 0x6015,0x5E15,0xA002,0x722C,0x8DB4,0xA010,0xA008,0xA004,0xA002,0x556A,0x6CA4,0xA002,0x5076,0x5455,0xA004,0xA002, 0x85D5,0x6BB4,0xA002,0x9E25,0x6B27,0xA008,0xA004,0xA002,0x54E6,0x8BFA,0xA002,0x7CEF,0x61E6,0xA004,0xA002,0x632A, 0x759F,0xA002,0x8650,0x6696,0xA020,0xA010,0xA008,0xA004,0xA002,0x5973,0x6012,0xA002,0x52AA,0x5974,0xA004,0xA002, 0x5F04,0x519C,0xA002,0x6D53,0x8113,0xA008,0xA004,0xA002,0x7EBD,0x94AE,0xA002,0x626D,0x725B,0xA004,0xA002,0x6CDE, 0x62E7,0xA002,0x8269,0x8267,0xA010,0xA008,0xA004,0xA002,0x8266,0x8265,0xA002,0x8264,0x8263,0xA004,0xA002,0x8262, 0x8261,0xA002,0x8260,0x825E,0xA008,0xA004,0xA002,0x825D,0x825C,0xA002,0x825B,0x8259,0xA004,0xA002,0x8257,0x8256, 0xA002,0x8255,0x8254,0xA03F,0xA01F,0xA010,0xA008,0xA004,0xA002,0x8253,0x8252,0xA002,0x8251,0x8250,0xA004,0xA002, 0x824E,0x824D,0xA002,0x824C,0x824A,0xA008,0xA004,0xA002,0x8248,0x8246,0xA002,0x8245,0x8243,0xA004,0xA002,0x8242, 0x8241,0xA000,0x8240,0xA010,0xA008,0xA004,0xA002,0x823F,0x823D,0xA002,0x823C,0x823A,0xA004,0xA002,0x8232,0x822E, 0xA002,0x8229,0x8227,0xA008,0xA004,0xA002,0x8226,0x8225,0xA002,0x8224,0x8220,0xA004,0xA002,0x821D,0x821A,0xA002, 0x8219,0x8218,0xA020,0xA010,0xA008,0xA004,0xA002,0x8217,0x8216,0xA002,0x8215,0x8213,0xA004,0xA002,0x8211,0x820F, 0xA002,0x820E,0x820B,0xA008,0xA004,0xA002,0x820A,0x8209,0xA002,0x8208,0x8207,0xA004,0xA002,0x8203,0x81FF,0xA002, 0x81FD,0x81FA,0xA010,0xA008,0xA004,0xA002,0x81F9,0x81F8,0xA002,0x81F7,0x81F6,0xA004,0xA002,0x81F5,0x81F2,0xA002, 0x81F1,0x81F0,0xA008,0xA004,0xA002,0x81EF,0x81EE,0xA002,0x81EB,0x81E9,0xA004,0xA002,0x81E8,0x81E6,0xA002,0x81E5, 0x81E4,0xA020,0xA000,0xA000,0xA00E,0xA006,0xA002,0x81E2,0xA002,0x81E1,0x81E0,0xA004,0xA002,0x81DF,0x81DE,0xA002, 0x81DD,0x81DC,0xA008,0xA004,0xA002,0x81DB,0x81DA,0xA002,0x81D9,0x81D8,0xA004,0xA002,0x81D7,0x81D6,0xA002,0x81D5, 0x81D4,0xA020,0xA001,0xA00F,0xA007,0xA003,0xA001,0x5B81,0xA002,0x51DD,0x72DE,0xA004,0xA002,0x67E0,0x60A8,0xA002, 0x6D85,0x954D,0xA008,0xA004,0xA002,0x954A,0x556E,0xA002,0x5B7D,0x8042,0xA004,0xA002,0x634F,0x5C3F,0xA002,0x9E1F, 0x917F,0xA020,0xA010,0xA008,0xA004,0xA002,0x5A18,0x5FF5,0xA002,0x637B,0x64B5,0xA004,0xA002,0x78BE,0x5E74,0xA002, 0x62C8,0x852B,0xA008,0xA004,0xA002,0x6EBA,0x9006,0xA002,0x817B,0x533F,0xA004,0xA002,0x4F60,0x62DF,0xA002,0x5C3C, 0x6CE5,0xA010,0xA008,0xA004,0xA002,0x502A,0x9713,0xA002,0x59AE,0x80FD,0xA004,0xA002,0x5AE9,0x5185,0xA002,0x9981, 0x5462,0xA008,0xA004,0xA002,0x6DD6,0x95F9,0xA002,0x607C,0x8111,0xA004,0xA002,0x6320,0x56CA,0xA002,0x96BE,0x7537, 0xA180,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5357,0xA002,0x5948,0x8010,0xA004,0xA002,0x5976,0x4E43, 0xA002,0x6C16,0x7EB3,0xA008,0xA004,0xA002,0x5A1C,0x90A3,0xA002,0x94A0,0x5450,0xA004,0xA002,0x54EA,0x62FF,0xA002, 0x7A46,0x7267,0xA010,0xA008,0xA004,0xA002,0x7766,0x76EE,0xA002,0x6728,0x6155,0xA004,0xA002,0x52DF,0x5E55,0xA002, 0x66AE,0x5893,0xA008,0xA004,0xA002,0x6BCD,0x59C6,0xA002,0x4EA9,0x7261,0xA004,0xA002,0x62C7,0x67D0,0xA002,0x725F, 0x8C0B,0xA020,0xA010,0xA008,0xA004,0xA002,0x964C,0x5BDE,0xA002,0x6F20,0x6CAB,0xA004,0xA002,0x9ED8,0x58A8,0xA002, 0x83AB,0x672B,0xA008,0xA004,0xA002,0x62B9,0x9B54,0xA002,0x6469,0x78E8,0xA004,0xA002,0x819C,0x6A21,0xA002,0x8611, 0x6479,0xA010,0xA008,0xA004,0xA002,0x81D3,0x81D2,0xA002,0x81D1,0x81D0,0xA004,0xA002,0x81CF,0x81CE,0xA002,0x81CD, 0x81CB,0xA008,0xA004,0xA002,0x81C9,0x81C8,0xA002,0x81C7,0x81C5,0xA004,0xA002,0x81C4,0x81BF,0xA002,0x81BE,0x81BD, 0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x81BC,0x81B9,0xA002,0x81B8,0x81B7,0xA004,0xA002,0x81B6,0x81B5,0xA002, 0x81B4,0x81B2,0xA008,0xA004,0xA002,0x81B1,0x81B0,0xA002,0x81AF,0x81AE,0xA004,0xA002,0x81AD,0x81AC,0xA002,0x81AB, 0x81A9,0xA00F,0xA007,0xA003,0xA000,0x81A7,0xA002,0x81A5,0x81A4,0xA004,0xA002,0x81A2,0x81A1,0xA002,0x81A0,0x819F, 0xA008,0xA004,0xA002,0x819E,0x819A,0xA002,0x8199,0x8197,0xA004,0xA002,0x8196,0x8195,0xA002,0x8194,0x8193,0xA020, 0xA010,0xA008,0xA004,0xA002,0x8192,0x8190,0xA002,0x818E,0x818D,0xA004,0xA002,0x818C,0x818B,0xA002,0x8189,0x8187, 0xA008,0xA004,0xA002,0x8186,0x8185,0xA002,0x8184,0x8183,0xA004,0xA002,0x8181,0x8178,0xA002,0x8177,0x8176,0xA010, 0xA008,0xA004,0xA002,0x8175,0x8173,0xA002,0x8172,0x816F,0xA004,0xA002,0x816C,0x816B,0xA002,0x816A,0x8168,0xA008, 0xA004,0xA002,0x8166,0x8164,0xA002,0x8163,0x8162,0xA004,0xA002,0x8161,0x815F,0xA002,0x815E,0x815D,0xA026,0xA000, 0xA01E,0xA00E,0xA006,0xA002,0x815C,0xA002,0x815B,0x8158,0xA004,0xA002,0x8157,0x8156,0xA002,0x8152,0x814F,0xA008, 0xA004,0xA002,0x814E,0x814D,0xA002,0x8149,0x8147,0xA004,0xA002,0x8145,0x8144,0xA002,0x8143,0x8142,0xA000,0xA000, 0xA000,0xA002,0x8141,0x8140,0xA01D,0xA001,0xA00C,0xA004,0xA001,0xA001,0x6478,0xA004,0xA002,0x8C2C,0x547D,0xA002, 0x540D,0x94ED,0xA008,0xA004,0xA002,0x9E23,0x879F,0xA002,0x660E,0x95FD,0xA004,0xA002,0x60AF,0x654F,0xA002,0x76BF, 0x62BF,0xA020,0xA010,0xA008,0xA004,0xA002,0x6C11,0x706D,0xA002,0x8511,0x5999,0xA004,0xA002,0x5E99,0x6E3A,0xA002, 0x79D2,0x85D0,0xA008,0xA004,0xA002,0x7784,0x63CF,0xA002,0x82D7,0x9762,0xA004,0xA002,0x7F05,0x5A29,0xA002,0x52C9, 0x514D,0xA010,0xA008,0xA004,0xA002,0x5195,0x7EF5,0xA002,0x7720,0x68C9,0xA004,0xA002,0x5E42,0x5BC6,0xA002,0x871C, 0x6CCC,0xA008,0xA004,0xA002,0x89C5,0x79D8,0xA002,0x7C73,0x5F25,0xA004,0xA002,0x8C1C,0x8FF7,0xA002,0x7CDC,0x9761, 0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x919A,0xA002,0x772F,0x5B5F,0xA004,0xA002,0x68A6,0x731B,0xA002, 0x9530,0x76DF,0xA008,0xA004,0xA002,0x6AAC,0x8499,0xA002,0x840C,0x4EEC,0xA004,0xA002,0x95F7,0x95E8,0xA002,0x5A9A, 0x59B9,0xA010,0xA008,0xA004,0xA002,0x5BD0,0x6627,0xA002,0x7F8E,0x6BCF,0xA004,0xA002,0x9541,0x5A92,0xA002,0x7709, 0x6CA1,0xA008,0xA004,0xA002,0x7164,0x9709,0xA002,0x9176,0x6885,0xA004,0xA002,0x679A,0x73AB,0xA002,0x4E48,0x8D38, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8C8C,0x5E3D,0xA002,0x5192,0x8302,0xA004,0xA002,0x536F,0x94C6,0xA002,0x77DB, 0x6BDB,0xA008,0xA004,0xA002,0x951A,0x8305,0xA002,0x732B,0x83BD,0xA004,0xA002,0x5FD9,0x6C13,0xA002,0x76F2,0x832B, 0xA010,0xA008,0xA004,0xA002,0x8292,0x8C29,0xA002,0x813F,0x813D,0xA004,0xA002,0x813C,0x813B,0xA002,0x813A,0x8139, 0xA008,0xA004,0xA002,0x8137,0x8135,0xA002,0x8134,0x8133,0xA004,0xA002,0x8130,0x812E,0xA002,0x812D,0x812B,0xA03F, 0xA020,0xA010,0xA008,0xA004,0xA002,0x812A,0x8129,0xA002,0x8128,0x8127,0xA004,0xA002,0x8126,0x8125,0xA002,0x8124, 0x8123,0xA008,0xA004,0xA002,0x8122,0x8121,0xA002,0x8120,0x811F,0xA004,0xA002,0x811D,0x811C,0xA002,0x811B,0x8119, 0xA00F,0xA007,0xA004,0xA002,0x8117,0x8115,0xA000,0x810C,0xA004,0xA002,0x810B,0x8108,0xA002,0x8107,0x8105,0xA008, 0xA004,0xA002,0x8104,0x8103,0xA002,0x8101,0x8100,0xA004,0xA002,0x80FF,0x80FE,0xA002,0x80FB,0x80F9,0xA020,0xA010, 0xA008,0xA004,0xA002,0x80F7,0x80F5,0xA002,0x80EE,0x80E6,0xA004,0xA002,0x80E3,0x80E2,0xA002,0x80E0,0x80DF,0xA008, 0xA004,0xA002,0x80D8,0x80D5,0xA002,0x80D4,0x80D3,0xA004,0xA002,0x80D2,0x80D1,0xA002,0x80D0,0x80CF,0xA010,0xA008, 0xA004,0xA002,0x80CB,0x80CA,0xA002,0x80C9,0x80C8,0xA004,0xA002,0x80C7,0x80C5,0xA002,0x80BB,0x80B9,0xA008,0xA004, 0xA002,0x80B8,0x80B6,0xA002,0x80B5,0x80B3,0xA004,0xA002,0x80B0,0x80AC,0xA002,0x80A8,0x80A7,0xA029,0xA000,0xA01E, 0xA00E,0xA006,0xA002,0x80A6,0xA002,0x80A3,0x809E,0xA004,0xA002,0x8099,0x8097,0xA002,0x8095,0x8094,0xA008,0xA004, 0xA002,0x8092,0x8091,0xA002,0x8090,0x808F,0xA004,0xA002,0x808E,0x808D,0xA002,0x808A,0x8088,0xA000,0xA000,0xA004, 0xA002,0x8085,0x8082,0xA002,0x8081,0x807E,0xA019,0xA001,0xA008,0xA001,0xA003,0xA001,0x6F2B,0xA002,0x6162,0x66FC, 0xA008,0xA004,0xA002,0x8513,0x6EE1,0xA002,0x86EE,0x9992,0xA004,0xA002,0x7792,0x8109,0xA002,0x8FC8,0x5356,0xA020, 0xA010,0xA008,0xA004,0xA002,0x9EA6,0x4E70,0xA002,0x57CB,0x5417,0xA004,0xA002,0x561B,0x9A82,0xA002,0x9A6C,0x8682, 0xA008,0xA004,0xA002,0x7801,0x739B,0xA002,0x9EBB,0x5988,0xA004,0xA002,0x7EDC,0x9A86,0xA002,0x6D1B,0x843D,0xA010, 0xA008,0xA004,0xA002,0x88F8,0x9AA1,0xA002,0x7BA9,0x9523,0xA004,0xA002,0x903B,0x7F57,0xA002,0x87BA,0x841D,0xA008, 0xA004,0xA002,0x8BBA,0x7EB6,0xA002,0x6CA6,0x4ED1,0xA004,0xA002,0x4F26,0x8F6E,0xA002,0x62A1,0x7565,0xA2FE,0xA180, 0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x63A0,0xA002,0x4E71,0x5375,0xA004,0xA002,0x6EE6,0x5B6A,0xA002, 0x631B,0x5CE6,0xA008,0xA004,0xA002,0x7EFF,0x6EE4,0xA002,0x7387,0x5F8B,0xA004,0xA002,0x6C2F,0x8651,0xA002,0x7F15, 0x5C61,0xA010,0xA008,0xA004,0xA002,0x5C65,0x65C5,0xA002,0x4FA3,0x94DD,0xA004,0xA002,0x5415,0x9A74,0xA002,0x622E, 0x9646,0xA008,0xA004,0xA002,0x5F55,0x7984,0xA002,0x6F5E,0x9E7F,0xA004,0xA002,0x8D42,0x8DEF,0xA002,0x9732,0x788C, 0xA020,0xA010,0xA008,0xA004,0xA002,0x9E93,0x9C81,0xA002,0x864F,0x5364,0xA004,0xA002,0x63B3,0x7089,0xA002,0x5E90, 0x9885,0xA008,0xA004,0xA002,0x5362,0x82A6,0xA002,0x964B,0x6F0F,0xA004,0xA002,0x7BD3,0x6402,0xA002,0x5A04,0x697C, 0xA010,0xA008,0xA004,0xA002,0x9647,0x62E2,0xA002,0x5784,0x9686,0xA004,0xA002,0x807D,0x807C,0xA002,0x807B,0x807A, 0xA008,0xA004,0xA002,0x8079,0x8078,0xA002,0x8077,0x8076,0xA004,0xA002,0x8075,0x8074,0xA002,0x8073,0x8072,0xA03F, 0xA020,0xA010,0xA008,0xA004,0xA002,0x8070,0x806F,0xA002,0x806E,0x806D,0xA004,0xA002,0x806C,0x806B,0xA002,0x8068, 0x8067,0xA008,0xA004,0xA002,0x8066,0x8065,0xA002,0x8064,0x8063,0xA004,0xA002,0x8062,0x8061,0xA002,0x8060,0x805F, 0xA00F,0xA008,0xA004,0xA002,0x805E,0x805D,0xA002,0x805C,0x805B,0xA003,0xA000,0x8059,0xA002,0x8057,0x8056,0xA008, 0xA004,0xA002,0x8055,0x8053,0xA002,0x8051,0x8050,0xA004,0xA002,0x804F,0x804E,0xA002,0x8049,0x8048,0xA020,0xA010, 0xA008,0xA004,0xA002,0x8047,0x8045,0xA002,0x8044,0x8041,0xA004,0xA002,0x8040,0x803E,0xA002,0x803C,0x803A,0xA008, 0xA004,0xA002,0x8039,0x8034,0xA002,0x8032,0x8030,0xA004,0xA002,0x802F,0x802E,0xA002,0x802D,0x802C,0xA010,0xA008, 0xA004,0xA002,0x802B,0x8024,0xA002,0x8023,0x8021,0xA004,0xA002,0x801F,0x801E,0xA002,0x801D,0x801B,0xA008,0xA004, 0xA002,0x801A,0x8013,0xA002,0x8011,0x800F,0xA004,0xA002,0x800E,0x800A,0xA002,0x8009,0x8008,0xA02D,0xA000,0xA01E, 0xA00E,0xA006,0xA002,0x8007,0xA002,0x8002,0x7FFF,0xA004,0xA002,0x7FFE,0x7FFD,0xA002,0x7FFA,0x7FF9,0xA008,0xA004, 0xA002,0x7FF8,0x7FF7,0xA002,0x7FF6,0x7FF5,0xA004,0xA002,0x7FF4,0x7FF2,0xA002,0x7FEF,0x7FED,0xA000,0xA008,0xA004, 0xA002,0x7FEC,0x7FEB,0xA002,0x7FEA,0x7FE8,0xA000,0xA002,0x7FE7,0x7FE4,0xA016,0xA001,0xA005,0xA001,0xA001,0xA001, 0x7ABF,0xA008,0xA004,0xA002,0x7B3C,0x5499,0xA002,0x804B,0x9F99,0xA004,0xA002,0x516D,0x67F3,0xA002,0x6D41,0x7624, 0xA020,0xA010,0xA008,0xA004,0xA002,0x5218,0x7559,0xA002,0x998F,0x786B,0xA004,0xA002,0x69B4,0x7409,0xA002,0x6E9C, 0x4EE4,0xA008,0xA004,0xA002,0x53E6,0x9886,0xA002,0x5CAD,0x9675,0xA004,0xA002,0x7075,0x51CC,0xA002,0x7F9A,0x4F36, 0xA010,0xA008,0xA004,0xA002,0x94C3,0x9F84,0xA002,0x96F6,0x83F1,0xA004,0xA002,0x73B2,0x62CE,0xA002,0x541D,0x8D41, 0xA008,0xA004,0xA002,0x51DB,0x6DCB,0xA002,0x9CDE,0x90BB,0xA004,0xA002,0x4E34,0x9716,0xA002,0x78F7,0x6797,0xA0FD, 0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7433,0xA002,0x730E,0x52A3,0xA004,0xA002,0x70C8,0x88C2,0xA002,0x5217, 0x6599,0xA008,0xA004,0xA002,0x5ED6,0x9563,0xA002,0x6482,0x4E86,0xA004,0xA002,0x6F66,0x8FBD,0xA002,0x5BE5,0x71CE, 0xA010,0xA008,0xA004,0xA002,0x7597,0x50DA,0xA002,0x804A,0x64A9,0xA004,0xA002,0x8C05,0x4EAE,0xA002,0x667E,0x91CF, 0xA008,0xA004,0xA002,0x8F86,0x4E24,0xA002,0x826F,0x7CB1,0xA004,0xA002,0x6881,0x51C9,0xA002,0x7CAE,0x7EC3,0xA020, 0xA010,0xA008,0xA004,0xA002,0x70BC,0x604B,0xA002,0x94FE,0x8138,0xA004,0xA002,0x655B,0x5E18,0xA002,0x6D9F,0x601C, 0xA008,0xA004,0xA002,0x5EC9,0x9570,0xA002,0x8FDE,0x83B2,0xA004,0xA002,0x8054,0x4FE9,0xA002,0x54E9,0x7483,0xA010, 0xA008,0xA004,0xA002,0x529B,0x96B6,0xA002,0x6CA5,0x7C92,0xA004,0xA002,0x7ACB,0x75E2,0xA002,0x7FE3,0x7FE2,0xA008, 0xA004,0xA002,0x7FDE,0x7FDD,0xA002,0x7FDC,0x7FDB,0xA004,0xA002,0x7FDA,0x7FD9,0xA002,0x7FD7,0x7FD6,0xA03F,0xA020, 0xA010,0xA008,0xA004,0xA002,0x7FD3,0x7FD2,0xA002,0x7FD1,0x7FD0,0xA004,0xA002,0x7FCF,0x7FCD,0xA002,0x7FCB,0x7FC9, 0xA008,0xA004,0xA002,0x7FC8,0x7FC7,0xA002,0x7FC6,0x7FC4,0xA004,0xA002,0x7FC3,0x7FC2,0xA002,0x7FC0,0x7FBE,0xA00F, 0xA008,0xA004,0xA002,0x7FBB,0x7FBA,0xA002,0x7FB7,0x7FB6,0xA004,0xA002,0x7FB5,0x7FB4,0xA000,0x7FB3,0xA008,0xA004, 0xA002,0x7FB1,0x7FAE,0xA002,0x7FAD,0x7FAC,0xA004,0xA002,0x7FAB,0x7FAA,0xA002,0x7FA9,0x7FA8,0xA020,0xA010,0xA008, 0xA004,0xA002,0x7FA6,0x7FA5,0xA002,0x7FA3,0x7FA2,0xA004,0xA002,0x7FA0,0x7F9C,0xA002,0x7F9B,0x7F99,0xA008,0xA004, 0xA002,0x7F98,0x7F97,0xA002,0x7F96,0x7F95,0xA004,0xA002,0x7F93,0x7F92,0xA002,0x7F91,0x7F90,0xA010,0xA008,0xA004, 0xA002,0x7F8F,0x7F8D,0xA002,0x7F8B,0x7F89,0xA004,0xA002,0x7F88,0x7F87,0xA002,0x7F86,0x7F85,0xA008,0xA004,0xA002, 0x7F84,0x7F83,0xA002,0x7F82,0x7F80,0xA004,0xA002,0x7F7F,0x7F7D,0xA002,0x7F7C,0x7F7B,0xA030,0xA000,0xA01E,0xA00E, 0xA006,0xA002,0x7F7A,0xA002,0x7F78,0x7F77,0xA004,0xA002,0x7F76,0x7F75,0xA002,0x7F73,0x7F70,0xA008,0xA004,0xA002, 0x7F6F,0x7F6D,0xA002,0x7F6C,0x7F6B,0xA004,0xA002,0x7F67,0x7F66,0xA002,0x7F65,0x7F64,0xA000,0xA008,0xA004,0xA002, 0x7F63,0x7F60,0xA002,0x7F5E,0x7F5D,0xA004,0xA002,0x7F5C,0x7F5B,0xA002,0x7F59,0x7F56,0xA011,0xA001,0xA001,0xA007, 0xA003,0xA001,0x4FD0,0xA002,0x4F8B,0x5088,0xA004,0xA002,0x5229,0x5386,0xA002,0x783E,0x52B1,0xA020,0xA010,0xA008, 0xA004,0xA002,0x5389,0x4E3D,0xA002,0x6817,0x540F,0xA004,0xA002,0x8354,0x8389,0xA002,0x793C,0x9CA4,0xA008,0xA004, 0xA002,0x91CC,0x674E,0xA002,0x7406,0x6F13,0xA004,0xA002,0x79BB,0x72F8,0xA002,0x7BF1,0x9ECE,0xA010,0xA008,0xA004, 0xA002,0x7281,0x68A8,0xA002,0x5398,0x51B7,0xA004,0xA002,0x695E,0x68F1,0xA002,0x6CEA,0x7C7B,0xA008,0xA004,0xA002, 0x808B,0x64C2,0xA002,0x5792,0x5121,0xA004,0xA002,0x7D2F,0x78CA,0xA002,0x857E,0x956D,0xA180,0xA0FD,0xA07E,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x96F7,0xA002,0x4E50,0x52D2,0xA004,0xA002,0x6D9D,0x70D9,0xA002,0x916A,0x59E5,0xA008, 0xA004,0xA002,0x4F6C,0x8001,0xA002,0x7262,0x52B3,0xA004,0xA002,0x635E,0x6D6A,0xA002,0x6717,0x90CE,0xA010,0xA008, 0xA004,0xA002,0x5ECA,0x72FC,0xA002,0x6994,0x7405,0xA004,0xA002,0x6EE5,0x70C2,0xA002,0x7F06,0x61D2,0xA008,0xA004, 0xA002,0x89C8,0x63FD,0xA002,0x8C30,0x6F9C,0xA004,0xA002,0x5170,0x9611,0xA002,0x7BEE,0x62E6,0xA020,0xA010,0xA008, 0xA004,0xA002,0x680F,0x5A6A,0xA002,0x84DD,0x8D56,0xA004,0xA002,0x6765,0x83B1,0xA002,0x5566,0x8FA3,0xA008,0xA004, 0xA002,0x814A,0x8721,0xA002,0x5587,0x62C9,0xA004,0xA002,0x5783,0x9614,0xA002,0x5ED3,0x6269,0xA010,0xA008,0xA004, 0xA002,0x62EC,0x56F0,0xA002,0x6346,0x6606,0xA004,0xA002,0x5764,0x6E83,0xA002,0x6127,0x9988,0xA008,0xA004,0xA002, 0x7F53,0x7F52,0xA002,0x7F4F,0x7F4E,0xA004,0xA002,0x7F4D,0x7F4C,0xA002,0x7F4B,0x7F4A,0xA03F,0xA020,0xA010,0xA008, 0xA004,0xA002,0x7F49,0x7F48,0xA002,0x7F47,0x7F46,0xA004,0xA002,0x7F43,0x7F41,0xA002,0x7F40,0x7F3F,0xA008,0xA004, 0xA002,0x7F3E,0x7F3D,0xA002,0x7F3C,0x7F3B,0xA004,0xA002,0x7F39,0x7F37,0xA002,0x7F1E,0x7F10,0xA010,0xA008,0xA004, 0xA002,0x7F0A,0x7EF9,0xA002,0x7EEC,0x7EE4,0xA004,0xA002,0x7ED6,0x7EBC,0xA002,0x7EBB,0x7EB4,0xA007,0xA003,0xA000, 0x7EAE,0xA002,0x7E9E,0x7E9D,0xA004,0xA002,0x7E9C,0x7E9A,0xA002,0x7E99,0x7E98,0xA020,0xA010,0xA008,0xA004,0xA002, 0x7E97,0x7E96,0xA002,0x7E95,0x7E94,0xA004,0xA002,0x7E93,0x7E92,0xA002,0x7E91,0x7E90,0xA008,0xA004,0xA002,0x7E8F, 0x7E8E,0xA002,0x7E8D,0x7E8C,0xA004,0xA002,0x7E8B,0x7E8A,0xA002,0x7E89,0x7E88,0xA010,0xA008,0xA004,0xA002,0x7E87, 0x7E86,0xA002,0x7E85,0x7E84,0xA004,0xA002,0x7E83,0x7E81,0xA002,0x7E80,0x7E7F,0xA008,0xA004,0xA002,0x7E7E,0x7E7D, 0xA002,0x7E7C,0x7E7B,0xA004,0xA002,0x7E7A,0x7E79,0xA002,0x7E78,0x7E77,0xA035,0xA000,0xA01E,0xA00E,0xA006,0xA002, 0x7E76,0xA002,0x7E75,0x7E74,0xA004,0xA002,0x7E73,0x7E72,0xA002,0x7E71,0x7E70,0xA008,0xA004,0xA002,0x7E6F,0x7E6E, 0xA002,0x7E6D,0x7E6C,0xA004,0xA002,0x7E6B,0x7E6A,0xA002,0x7E69,0x7E68,0xA010,0xA008,0xA004,0xA002,0x7E67,0x7E66, 0xA002,0x7E65,0x7E64,0xA004,0xA002,0x7E63,0x7E62,0xA002,0x7E61,0x7E60,0xA000,0xA000,0xA002,0x7E5F,0x7E5E,0xA00E, 0xA001,0xA001,0xA004,0xA001,0xA001,0x5080,0xA004,0xA002,0x9B41,0x594E,0xA002,0x8475,0x7AA5,0xA020,0xA010,0xA008, 0xA004,0xA002,0x5CBF,0x76D4,0xA002,0x4E8F,0x51B5,0xA004,0xA002,0x65F7,0x7736,0xA002,0x77FF,0x6846,0xA008,0xA004, 0xA002,0x72C2,0x7B50,0xA002,0x5321,0x6B3E,0xA004,0xA002,0x5BBD,0x5FEB,0xA002,0x4FA9,0x7B77,0xA010,0xA008,0xA004, 0xA002,0x5757,0x80EF,0xA002,0x8DE8,0x630E,0xA004,0xA002,0x57AE,0x5938,0xA002,0x88E4,0x5E93,0xA008,0xA004,0xA002, 0x9177,0x82E6,0xA002,0x7A9F,0x54ED,0xA004,0xA002,0x67AF,0x5BC7,0xA002,0x6263,0x53E3,0xA0FD,0xA07E,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x62A0,0xA002,0x63A7,0x5B54,0xA004,0xA002,0x6050,0x7A7A,0xA002,0x542D,0x5751,0xA008,0xA004, 0xA002,0x6073,0x57A6,0xA002,0x5543,0x80AF,0xA004,0xA002,0x8BFE,0x5BA2,0xA002,0x523B,0x514B,0xA010,0xA008,0xA004, 0xA002,0x6E34,0x53EF,0xA002,0x54B3,0x58F3,0xA004,0xA002,0x79D1,0x9897,0xA002,0x78D5,0x68F5,0xA008,0xA004,0xA002, 0x67EF,0x82DB,0xA002,0x5777,0x9760,0xA004,0xA002,0x70E4,0x62F7,0xA002,0x8003,0x7095,0xA020,0xA010,0xA008,0xA004, 0xA002,0x4EA2,0x6297,0xA002,0x625B,0x7CE0,0xA004,0xA002,0x6177,0x5EB7,0xA002,0x770B,0x780D,0xA008,0xA004,0xA002, 0x574E,0x52D8,0xA002,0x582A,0x520A,0xA004,0xA002,0x6168,0x51EF,0xA002,0x6977,0x63E9,0xA010,0xA008,0xA004,0xA002, 0x5F00,0x54AF,0xA002,0x5361,0x5496,0xA004,0xA002,0x5580,0x9A8F,0xA002,0x90E1,0x6D5A,0xA008,0xA004,0xA002,0x7AE3, 0x4FCA,0xA002,0x7E5D,0x7E5C,0xA004,0xA002,0x7E5B,0x7E5A,0xA002,0x7E59,0x7E58,0xA03F,0xA020,0xA010,0xA008,0xA004, 0xA002,0x7E57,0x7E56,0xA002,0x7E55,0x7E54,0xA004,0xA002,0x7E53,0x7E52,0xA002,0x7E51,0x7E50,0xA008,0xA004,0xA002, 0x7E4F,0x7E4E,0xA002,0x7E4D,0x7E4C,0xA004,0xA002,0x7E4B,0x7E4A,0xA002,0x7E49,0x7E48,0xA010,0xA008,0xA004,0xA002, 0x7E46,0x7E45,0xA002,0x7E44,0x7E43,0xA004,0xA002,0x7E42,0x7E40,0xA002,0x7E3F,0x7E3E,0xA007,0xA004,0xA002,0x7E3D, 0x7E3C,0xA000,0x7E3A,0xA004,0xA002,0x7E39,0x7E38,0xA002,0x7E37,0x7E36,0xA020,0xA010,0xA008,0xA004,0xA002,0x7E35, 0x7E34,0xA002,0x7E33,0x7E32,0xA004,0xA002,0x7E31,0x7E30,0xA002,0x7E2F,0x7E2E,0xA008,0xA004,0xA002,0x7E2D,0x7E2C, 0xA002,0x7E2B,0x7E2A,0xA004,0xA002,0x7E29,0x7E28,0xA002,0x7E27,0x7E26,0xA010,0xA008,0xA004,0xA002,0x7E25,0x7E24, 0xA002,0x7E23,0x7E22,0xA004,0xA002,0x7E21,0x7E20,0xA002,0x7E1F,0x7E1E,0xA008,0xA004,0xA002,0x7E1D,0x7E1C,0xA002, 0x7E1B,0x7E1A,0xA004,0xA002,0x7E19,0x7E18,0xA002,0x7E17,0x7E16,0xA038,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x7E15, 0xA002,0x7E14,0x7E13,0xA004,0xA002,0x7E12,0x7E11,0xA002,0x7E10,0x7E0F,0xA008,0xA004,0xA002,0x7E0E,0x7E0D,0xA002, 0x7E0C,0x7E0B,0xA004,0xA002,0x7E0A,0x7E09,0xA002,0x7E08,0x7E07,0xA010,0xA008,0xA004,0xA002,0x7E06,0x7E05,0xA002, 0x7E04,0x7E03,0xA004,0xA002,0x7E02,0x7E01,0xA002,0x7E00,0x7DFF,0xA000,0xA004,0xA002,0x7DFE,0x7DFD,0xA002,0x7DFC, 0x7DFB,0xA00A,0xA001,0xA001,0xA001,0xA003,0xA001,0x5CFB,0xA002,0x541B,0x519B,0xA020,0xA010,0xA008,0xA004,0xA002, 0x94A7,0x83CC,0xA002,0x5747,0x7EDD,0xA004,0xA002,0x8BC0,0x51B3,0xA002,0x89C9,0x7235,0xA008,0xA004,0xA002,0x5014, 0x6398,0xA002,0x6289,0x652B,0xA004,0xA002,0x6485,0x7EE2,0xA002,0x5377,0x7737,0xA010,0xA008,0xA004,0xA002,0x5026, 0x5A1F,0xA002,0x9E43,0x6350,0xA004,0xA002,0x5267,0x70AC,0xA002,0x60E7,0x53E5,0xA008,0xA004,0xA002,0x4FF1,0x952F, 0xA002,0x8E1E,0x8DDD,0xA004,0xA002,0x5177,0x5DE8,0xA002,0x636E,0x62D2,0xC53E,0xB72E,0xABF4,0xA5F9,0xA2FA,0xA17A, 0xA0FB,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x805A,0xA002,0x6CAE,0x4E3E,0xA004,0xA002,0x77E9,0x5480,0xA002, 0x5C40,0x83CA,0xA008,0xA004,0xA002,0x9A79,0x5C45,0xA002,0x75BD,0x72D9,0xA004,0xA002,0x62D8,0x97A0,0xA002,0x759A, 0x5C31,0xA010,0xA008,0xA004,0xA002,0x548E,0x8205,0xA002,0x81FC,0x65E7,0xA004,0xA002,0x6551,0x53A9,0xA002,0x9152, 0x4E5D,0xA008,0xA004,0xA002,0x7078,0x4E45,0xA002,0x97ED,0x7396,0xA004,0xA002,0x7EA0,0x7A76,0xA002,0x63EA,0x7A98, 0xA020,0xA010,0xA008,0xA004,0xA002,0x70AF,0x51C0,0xA002,0x7ADE,0x7ADF,0xA004,0xA002,0x9756,0x75C9,0xA002,0x5F84, 0x955C,0xA008,0xA004,0xA002,0x656C,0x5883,0xA002,0x9759,0x9888,0xA004,0xA002,0x666F,0x8B66,0xA002,0x4E95,0x7ECF, 0xA010,0xA008,0xA004,0xA002,0x7CB3,0x7CBE,0xA002,0x60CA,0x4EAC,0xA004,0xA002,0x9CB8,0x6676,0xA002,0x775B,0x830E, 0xA008,0xA004,0xA002,0x5162,0x8346,0xA002,0x52B2,0x5C3D,0xA004,0xA002,0x7DFA,0x7DF9,0xA002,0x7DF8,0x7DF7,0xA03D, 0xA01E,0xA00E,0xA006,0xA002,0x7DF6,0xA002,0x7DF5,0x7DF4,0xA004,0xA002,0x7DF3,0x7DF2,0xA002,0x7DF1,0x7DF0,0xA008, 0xA004,0xA002,0x7DEF,0x7DEE,0xA002,0x7DED,0x7DEC,0xA004,0xA002,0x7DEB,0x7DEA,0xA002,0x7DE9,0x7DE8,0xA010,0xA008, 0xA004,0xA002,0x7DE7,0x7DE6,0xA002,0x7DE5,0x7DE4,0xA004,0xA002,0x7DE3,0x7DE2,0xA002,0x7DE1,0x7DE0,0xA008,0xA004, 0xA002,0x7DDF,0x7DDE,0xA002,0x7DDD,0x7DDC,0xA004,0xA002,0x7DDB,0x7DDA,0xA001,0x7DD9,0xA020,0xA010,0xA008,0xA004, 0xA002,0x7DD8,0x7DD7,0xA002,0x7DD6,0x7DD5,0xA004,0xA002,0x7DD4,0x7DD3,0xA002,0x7DD2,0x7DD1,0xA008,0xA004,0xA002, 0x7DD0,0x7DCF,0xA002,0x7DCE,0x7DCD,0xA004,0xA002,0x7DCC,0x7DCB,0xA002,0x7DCA,0x7DC9,0xA010,0xA008,0xA004,0xA002, 0x7DC8,0x7DC7,0xA002,0x7DC6,0x7DC5,0xA004,0xA002,0x7DC4,0x7DC3,0xA002,0x7DC2,0x7DC1,0xA008,0xA004,0xA002,0x7DC0, 0x7DBF,0xA002,0x7DBE,0x7DBD,0xA004,0xA002,0x7DBC,0x7DBB,0xA002,0x7DBA,0x7DB9,0xA03E,0xA000,0xA01E,0xA00E,0xA006, 0xA002,0x7DB8,0xA002,0x7DB7,0x7DB6,0xA004,0xA002,0x7DB5,0x7DB4,0xA002,0x7DB3,0x7DB2,0xA008,0xA004,0xA002,0x7DB1, 0x7DB0,0xA002,0x7DAF,0x7DAD,0xA004,0xA002,0x7DAC,0x7DAB,0xA002,0x7DAA,0x7DA9,0xA010,0xA008,0xA004,0xA002,0x7DA8, 0x7DA7,0xA002,0x7DA5,0x7DA4,0xA004,0xA002,0x7DA3,0x7DA2,0xA002,0x7DA1,0x7DA0,0xA008,0xA004,0xA002,0x7D9F,0x7D9E, 0xA002,0x7D9D,0x7D9C,0xA004,0xA002,0x7D9B,0x7D9A,0xA000,0x7D99,0xA001,0xA020,0xA010,0xA008,0xA004,0xA002,0x6D78, 0x70EC,0xA002,0x8FD1,0x7981,0xA004,0xA002,0x664B,0x9773,0xA002,0x8FDB,0x8C28,0xA008,0xA004,0xA002,0x4EC5,0x9526, 0xA002,0x7D27,0x895F,0xA004,0xA002,0x6D25,0x4ECA,0xA002,0x91D1,0x65A4,0xA010,0xA008,0xA004,0xA002,0x7B4B,0x5DFE, 0xA002,0x5C4A,0x8BEB,0xA004,0xA002,0x75A5,0x4ECB,0xA002,0x501F,0x754C,0xA008,0xA004,0xA002,0x82A5,0x85C9,0xA002, 0x6212,0x59D0,0xA004,0xA002,0x89E3,0x7ED3,0xA002,0x6D01,0x7AED,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x776B,0xA002,0x6377,0x6770,0xA004,0xA002,0x6854,0x8282,0xA002,0x52AB,0x622A,0xA008,0xA004,0xA002,0x9636,0x8857, 0xA002,0x79F8,0x7686,0xA004,0xA002,0x63A5,0x63ED,0xA002,0x7A96,0x53EB,0xA010,0xA008,0xA004,0xA002,0x8F83,0x8F7F, 0xA002,0x9175,0x6559,0xA004,0xA002,0x527F,0x7EDE,0xA002,0x7F34,0x997A,0xA008,0xA004,0xA002,0x89D2,0x72E1,0xA002, 0x811A,0x4FA5,0xA004,0xA002,0x77EB,0x94F0,0xA002,0x6405,0x56BC,0xA020,0xA010,0xA008,0xA004,0xA002,0x5A07,0x9A84, 0xA002,0x6D47,0x90CA,0xA004,0xA002,0x4EA4,0x80F6,0xA002,0x7126,0x7901,0xA008,0xA004,0xA002,0x6912,0x8549,0xA002, 0x964D,0x9171,0xA004,0xA002,0x5320,0x8BB2,0xA002,0x5956,0x6868,0xA010,0xA008,0xA004,0xA002,0x848B,0x7586,0xA002, 0x6C5F,0x6D46,0xA004,0xA002,0x5C06,0x59DC,0xA002,0x50F5,0x5EFA,0xA008,0xA004,0xA002,0x6DA7,0x6E85,0xA002,0x6E10, 0x996F,0xA004,0xA002,0x5251,0x8230,0xA002,0x5065,0x7D98,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x7D97,0x7D96, 0xA002,0x7D95,0x7D94,0xA004,0xA002,0x7D93,0x7D92,0xA002,0x7D91,0x7D90,0xA008,0xA004,0xA002,0x7D8F,0x7D8E,0xA002, 0x7D8D,0x7D8C,0xA004,0xA002,0x7D8B,0x7D8A,0xA002,0x7D89,0x7D88,0xA010,0xA008,0xA004,0xA002,0x7D87,0x7D86,0xA002, 0x7D85,0x7D84,0xA004,0xA002,0x7D83,0x7D82,0xA002,0x7D81,0x7D80,0xA008,0xA004,0xA002,0x7D7F,0x7D7E,0xA002,0x7D7D, 0x7D7C,0xA004,0xA002,0x7D7B,0x7D7A,0xA002,0x7D79,0x7D78,0xA01F,0xA00F,0xA007,0xA003,0xA001,0x7D76,0xA002,0x7D75, 0x7D74,0xA004,0xA002,0x7D73,0x7D72,0xA002,0x7D71,0x7D70,0xA008,0xA004,0xA002,0x7D6F,0x7D6D,0xA002,0x7D6C,0x7D6B, 0xA004,0xA002,0x7D6A,0x7D69,0xA002,0x7D68,0x7D67,0xA010,0xA008,0xA004,0xA002,0x7D66,0x7D65,0xA002,0x7D64,0x7D63, 0xA004,0xA002,0x7D62,0x7D61,0xA002,0x7D60,0x7D5F,0xA008,0xA004,0xA002,0x7D5E,0x7D5D,0xA002,0x7D5C,0x7D5B,0xA004, 0xA002,0x7D5A,0x7D59,0xA002,0x7D58,0x7D57,0xA045,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7D56,0xA002,0x7D55,0x7D54, 0xA004,0xA002,0x7D53,0x7D52,0xA002,0x7D51,0x7D50,0xA008,0xA004,0xA002,0x7D4F,0x7D4E,0xA002,0x7D4D,0x7D4C,0xA004, 0xA002,0x7D4B,0x7D4A,0xA002,0x7D49,0x7D48,0xA010,0xA008,0xA004,0xA002,0x7D47,0x7D46,0xA002,0x7D45,0x7D44,0xA004, 0xA002,0x7D43,0x7D42,0xA002,0x7D41,0x7D40,0xA008,0xA004,0xA002,0x7D3F,0x7D3E,0xA002,0x7D3D,0x7D3C,0xA004,0xA002, 0x7D3B,0x7D3A,0xA002,0x7D39,0x7D38,0xA000,0xA000,0xA000,0xA000,0xA000,0x7D37,0xA001,0xA01D,0xA00D,0xA005,0xA001, 0xA002,0x4EF6,0x7BAD,0xA004,0xA002,0x952E,0x89C1,0xA002,0x8D31,0x8DF5,0xA008,0xA004,0xA002,0x9274,0x69DB,0xA002, 0x8350,0x51CF,0xA004,0xA002,0x526A,0x4FED,0xA002,0x7B80,0x6361,0xA010,0xA008,0xA004,0xA002,0x62E3,0x7877,0xA002, 0x78B1,0x67EC,0xA004,0xA002,0x68C0,0x8327,0xA002,0x7F04,0x5978,0xA008,0xA004,0xA002,0x8270,0x80A9,0xA002,0x517C, 0x714E,0xA004,0xA002,0x95F4,0x7B3A,0xA002,0x5C16,0x575A,0xA17F,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x76D1,0xA002,0x6B7C,0x5AC1,0xA004,0xA002,0x9A7E,0x67B6,0xA002,0x4EF7,0x7A3C,0xA008,0xA004,0xA002,0x5047,0x94BE, 0xA002,0x7532,0x8D3E,0xA004,0xA002,0x988A,0x835A,0xA002,0x52A0,0x5BB6,0xA010,0xA008,0xA004,0xA002,0x4F73,0x5939, 0xA002,0x67B7,0x5609,0xA004,0xA002,0x7EAA,0x7EE7,0xA002,0x5993,0x9645,0xA008,0xA004,0xA002,0x5FCC,0x65E2,0xA002, 0x8BB0,0x8BA1,0xA004,0xA002,0x5BC2,0x5BC4,0xA002,0x6D4E,0x60B8,0xA020,0xA010,0xA008,0xA004,0xA002,0x5242,0x796D, 0xA002,0x4F0E,0x5B63,0xA004,0xA002,0x5180,0x6280,0xA002,0x84DF,0x5DF1,0xA008,0xA004,0xA002,0x810A,0x51E0,0xA002, 0x6324,0x7EA7,0xA004,0xA002,0x5AC9,0x5373,0xA002,0x6C72,0x75BE,0xA010,0xA008,0xA004,0xA002,0x6025,0x53CA,0xA002, 0x96C6,0x7C4D,0xA004,0xA002,0x8F91,0x68D8,0xA002,0x6781,0x5409,0xA008,0xA004,0xA002,0x7F09,0x7EE9,0xA002,0x59EC, 0x9E21,0xA004,0xA002,0x8BA5,0x6FC0,0xA002,0x8FF9,0x9965,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x808C,0x7D36, 0xA002,0x7D35,0x7D34,0xA004,0xA002,0x7D33,0x7D32,0xA002,0x7D31,0x7D30,0xA008,0xA004,0xA002,0x7D2E,0x7D2D,0xA002, 0x7D2C,0x7D2A,0xA004,0xA002,0x7D29,0x7D28,0xA002,0x7D26,0x7D25,0xA010,0xA008,0xA004,0xA002,0x7D24,0x7D23,0xA002, 0x7D21,0x7D1F,0xA004,0xA002,0x7D1E,0x7D1D,0xA002,0x7D1C,0x7D1B,0xA008,0xA004,0xA002,0x7D1A,0x7D19,0xA002,0x7D18, 0x7D17,0xA004,0xA002,0x7D16,0x7D15,0xA002,0x7D14,0x7D13,0xA01F,0xA00F,0xA007,0xA004,0xA002,0x7D12,0x7D11,0xA001, 0x7D10,0xA004,0xA002,0x7D0F,0x7D0E,0xA002,0x7D0D,0x7D0C,0xA008,0xA004,0xA002,0x7D0B,0x7D09,0xA002,0x7D08,0x7D07, 0xA004,0xA002,0x7D06,0x7D05,0xA002,0x7D04,0x7D03,0xA010,0xA008,0xA004,0xA002,0x7D02,0x7D01,0xA002,0x7D00,0x7CFF, 0xA004,0xA002,0x7CFE,0x7CFD,0xA002,0x7CFC,0x7CFA,0xA008,0xA004,0xA002,0x7CF9,0x7CF7,0xA002,0x7CF6,0x7CF5,0xA004, 0xA002,0x7CF4,0x7CF3,0xA002,0x7CF2,0x7CF1,0xA048,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7CF0,0xA002,0x7CEE,0x7CED, 0xA004,0xA002,0x7CEC,0x7CEB,0xA002,0x7CEA,0x7CE9,0xA008,0xA004,0xA002,0x7CE7,0x7CE6,0xA002,0x7CE5,0x7CE4,0xA004, 0xA002,0x7CE3,0x7CE2,0xA002,0x7CE1,0x7CDE,0xA010,0xA008,0xA004,0xA002,0x7CDD,0x7CDB,0xA002,0x7CDA,0x7CD8,0xA004, 0xA002,0x7CD4,0x7CD3,0xA002,0x7CD2,0x7CD1,0xA008,0xA004,0xA002,0x7CD0,0x7CCF,0xA002,0x7CCE,0x7CCB,0xA004,0xA002, 0x7CC9,0x7CC6,0xA002,0x7CC4,0x7CC3,0xA000,0xA000,0xA000,0xA004,0xA002,0x7CC2,0x7CC0,0xA000,0x7CBF,0xA001,0xA019, 0xA009,0xA001,0xA004,0xA002,0x7B95,0x79EF,0xA002,0x7A3D,0x7578,0xA008,0xA004,0xA002,0x673A,0x57FA,0xA002,0x573E, 0x51FB,0xA004,0xA002,0x7978,0x8D27,0xA002,0x970D,0x60D1,0xA010,0xA008,0xA004,0xA002,0x6216,0x83B7,0xA002,0x706B, 0x4F19,0xA004,0xA002,0x6D3B,0x8C41,0xA002,0x6DF7,0x6D51,0xA008,0xA004,0xA002,0x9B42,0x5A5A,0xA002,0x660F,0x8364, 0xA004,0xA002,0x7ED8,0x8BF2,0xA002,0x8BB3,0x6C47,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x70E9,0xA002, 0x4F1A,0x79FD,0xA004,0xA002,0x8D3F,0x6666,0xA002,0x60E0,0x5349,0xA008,0xA004,0xA002,0x6167,0x6094,0xA002,0x6BC1, 0x56DE,0xA004,0xA002,0x86D4,0x6062,0xA002,0x5FBD,0x8F89,0xA010,0xA008,0xA004,0xA002,0x6325,0x7070,0xA002,0x8C0E, 0x604D,0xA004,0xA002,0x5E4C,0x6643,0xA002,0x714C,0x60F6,0xA008,0xA004,0xA002,0x51F0,0x7687,0xA002,0x7C27,0x8757, 0xA004,0xA002,0x78FA,0x9EC4,0xA002,0x614C,0x8352,0xA020,0xA010,0xA008,0xA004,0xA002,0x5E7B,0x5BA6,0xA002,0x6DA3, 0x7115,0xA004,0xA002,0x8C62,0x75EA,0xA002,0x5524,0x60A3,0xA008,0xA004,0xA002,0x6362,0x7F13,0xA002,0x8FD8,0x6853, 0xA004,0xA002,0x73AF,0x6B22,0xA002,0x574F,0x6DEE,0xA010,0xA008,0xA004,0xA002,0x6000,0x5F8A,0xA002,0x69D0,0x8BDD, 0xA004,0xA002,0x5316,0x5212,0xA002,0x753B,0x6ED1,0xA008,0xA004,0xA002,0x733E,0x534E,0xA002,0x54D7,0x82B1,0xA004, 0xA002,0x6237,0x6CAA,0xA002,0x4E92,0x62A4,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x552C,0x864E,0xA002,0x5F27, 0x7CBB,0xA004,0xA002,0x7CBA,0x7CB8,0xA002,0x7CB7,0x7CB6,0xA008,0xA004,0xA002,0x7CB5,0x7CB4,0xA002,0x7CB0,0x7CAF, 0xA004,0xA002,0x7CAD,0x7CAC,0xA002,0x7CAB,0x7CA9,0xA010,0xA008,0xA004,0xA002,0x7CA8,0x7CA7,0xA002,0x7CA6,0x7CA3, 0xA004,0xA002,0x7CA1,0x7CA0,0xA002,0x7C9B,0x7C9A,0xA008,0xA004,0xA002,0x7C99,0x7C96,0xA002,0x7C94,0x7C93,0xA004, 0xA002,0x7C90,0x7C8F,0xA002,0x7C8E,0x7C8D,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x7C8C,0x7C8B,0xA002,0x7C8A,0x7C88, 0xA003,0xA001,0x7C87,0xA002,0x7C86,0x7C85,0xA008,0xA004,0xA002,0x7C84,0x7C83,0xA002,0x7C82,0x7C81,0xA004,0xA002, 0x7C80,0x7C7F,0xA002,0x7C7E,0x7C7A,0xA010,0xA008,0xA004,0xA002,0x7C79,0x7C78,0xA002,0x7C77,0x7C76,0xA004,0xA002, 0x7C75,0x7C72,0xA002,0x7C71,0x7C70,0xA008,0xA004,0xA002,0x7C6F,0x7C6E,0xA002,0x7C6D,0x7C6C,0xA004,0xA002,0x7C6B, 0x7C6A,0xA002,0x7C69,0x7C68,0xA04C,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7C67,0xA002,0x7C66,0x7C65,0xA004,0xA002, 0x7C64,0x7C63,0xA002,0x7C62,0x7C61,0xA008,0xA004,0xA002,0x7C60,0x7C5F,0xA002,0x7C5E,0x7C5D,0xA004,0xA002,0x7C5C, 0x7C5B,0xA002,0x7C5A,0x7C59,0xA010,0xA008,0xA004,0xA002,0x7C58,0x7C57,0xA002,0x7C56,0x7C55,0xA004,0xA002,0x7C54, 0x7C53,0xA002,0x7C52,0x7C51,0xA008,0xA004,0xA002,0x7C50,0x7C4F,0xA002,0x7C4E,0x7C4C,0xA004,0xA002,0x7C4B,0x7C4A, 0xA002,0x7C49,0x7C48,0xA000,0xA000,0xA008,0xA004,0xA002,0x7C47,0x7C46,0xA002,0x7C45,0x7C44,0xA000,0xA000,0x7C43, 0xA001,0xA016,0xA006,0xA001,0xA001,0xA002,0x6E56,0x7CCA,0xA008,0xA004,0xA002,0x72D0,0x8774,0xA002,0x80E1,0x846B, 0xA004,0xA002,0x58F6,0x745A,0xA002,0x5FFD,0x4E4E,0xA010,0xA008,0xA004,0xA002,0x547C,0x540E,0xA002,0x5019,0x539A, 0xA004,0xA002,0x543C,0x7334,0xA002,0x4FAF,0x5589,0xA008,0xA004,0xA002,0x7EA2,0x5F18,0xA002,0x5B8F,0x6D2A,0xA004, 0xA002,0x9E3F,0x8679,0xA002,0x70D8,0x54C4,0xA2FC,0xA17C,0xA0FB,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x8F70, 0xA002,0x6052,0x8861,0xA004,0xA002,0x6A2A,0x4EA8,0xA002,0x54FC,0x6068,0xA008,0xA004,0xA002,0x72E0,0x5F88,0xA002, 0x75D5,0x9ED1,0xA004,0xA002,0x563F,0x8D3A,0xA002,0x9E64,0x8910,0xA010,0xA008,0xA004,0xA002,0x8D6B,0x6DB8,0xA002, 0x6CB3,0x9602,0xA004,0xA002,0x8C89,0x76D2,0xA002,0x5408,0x4F55,0xA008,0xA004,0xA002,0x548C,0x79BE,0xA002,0x6838, 0x83CF,0xA004,0xA002,0x8377,0x559D,0xA002,0x5475,0x6D69,0xA020,0xA010,0xA008,0xA004,0xA002,0x53F7,0x8017,0xA002, 0x597D,0x90DD,0xA004,0xA002,0x6BEB,0x8C6A,0xA002,0x568E,0x58D5,0xA008,0xA004,0xA002,0x822A,0x676D,0xA002,0x592F, 0x6C49,0xA004,0xA002,0x6C57,0x710A,0xA002,0x608D,0x61BE,0xA010,0xA008,0xA004,0xA002,0x65F1,0x634D,0xA002,0x64BC, 0x7FF0,0xA004,0xA002,0x7F55,0x558A,0xA002,0x51FD,0x5BD2,0xA008,0xA004,0xA002,0x6DB5,0x542B,0xA002,0x97E9,0x90AF, 0xA004,0xA002,0x61A8,0x9163,0xA002,0x9A87,0x5BB3,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x4EA5,0xA002,0x6C26,0x6D77, 0xA004,0xA002,0x5B69,0x9AB8,0xA002,0x7C42,0x7C3E,0xA008,0xA004,0xA002,0x7C3D,0x7C3C,0xA002,0x7C3B,0x7C3A,0xA004, 0xA002,0x7C39,0x7C37,0xA002,0x7C36,0x7C35,0xA010,0xA008,0xA004,0xA002,0x7C34,0x7C33,0xA002,0x7C32,0x7C31,0xA004, 0xA002,0x7C30,0x7C2F,0xA002,0x7C2E,0x7C2D,0xA008,0xA004,0xA002,0x7C2C,0x7C2B,0xA002,0x7C29,0x7C28,0xA004,0xA002, 0x7C25,0x7C24,0xA002,0x7C23,0x7C22,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x7C21,0x7C20,0xA002,0x7C1E,0x7C1D,0xA004, 0xA002,0x7C1C,0x7C1B,0xA000,0x7C1A,0xA008,0xA004,0xA002,0x7C19,0x7C18,0xA002,0x7C17,0x7C15,0xA004,0xA002,0x7C14, 0x7C13,0xA002,0x7C12,0x7C11,0xA010,0xA008,0xA004,0xA002,0x7C10,0x7C0E,0xA002,0x7C0D,0x7C0A,0xA004,0xA002,0x7C09, 0x7C08,0xA002,0x7C06,0x7C05,0xA008,0xA004,0xA002,0x7C04,0x7C03,0xA002,0x7C02,0x7C01,0xA004,0xA002,0x7C00,0x7BFF, 0xA002,0x7BFD,0x7BFB,0xA050,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7BFA,0xA002,0x7BF9,0x7BF8,0xA004,0xA002,0x7BF6, 0x7BF5,0xA002,0x7BF4,0x7BF3,0xA008,0xA004,0xA002,0x7BF2,0x7BF0,0xA002,0x7BEF,0x7BED,0xA004,0xA002,0x7BEC,0x7BEB, 0xA002,0x7BE9,0x7BE8,0xA010,0xA008,0xA004,0xA002,0x7BE7,0x7BE4,0xA002,0x7BE3,0x7BE2,0xA004,0xA002,0x7BE0,0x7BDF, 0xA002,0x7BDE,0x7BDC,0xA008,0xA004,0xA002,0x7BDB,0x7BD8,0xA002,0x7BD7,0x7BD6,0xA004,0xA002,0x7BD5,0x7BD4,0xA002, 0x7BD2,0x7BD0,0xA000,0xA000,0xA008,0xA004,0xA002,0x7BCF,0x7BCE,0xA002,0x7BCD,0x7BCB,0xA004,0xA002,0x7BCA,0x7BC9, 0xA002,0x7BC8,0x7BC5,0xA001,0xA010,0xA001,0xA007,0xA003,0xA001,0x54C8,0xA002,0x8FC7,0x88F9,0xA004,0xA002,0x679C, 0x56FD,0xA002,0x90ED,0x9505,0xA010,0xA008,0xA004,0xA002,0x68CD,0x6EDA,0xA002,0x8F8A,0x523D,0xA004,0xA002,0x8D35, 0x8DEA,0xA002,0x67DC,0x6842,0xA008,0xA004,0xA002,0x7678,0x8BE1,0xA002,0x9B3C,0x8F68,0xA004,0xA002,0x95FA,0x9F9F, 0xA002,0x5F52,0x7845,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x572D,0xA002,0x89C4,0x7470,0xA004,0xA002, 0x901B,0x5E7F,0xA002,0x5149,0x8D2F,0xA008,0xA004,0xA002,0x704C,0x60EF,0xA002,0x7F50,0x9986,0xA004,0xA002,0x7BA1, 0x89C2,0xA002,0x51A0,0x5B98,0xA010,0xA008,0xA004,0xA002,0x5173,0x68FA,0xA002,0x602A,0x62D0,0xA004,0xA002,0x4E56, 0x8902,0xA002,0x6302,0x5BE1,0xA008,0xA004,0xA002,0x5250,0x74DC,0xA002,0x522E,0x96C7,0xA004,0xA002,0x56FA,0x987E, 0xA002,0x6545,0x80A1,0xA020,0xA010,0xA008,0xA004,0xA002,0x8C37,0x9AA8,0xA002,0x86CA,0x53E4,0xA004,0xA002,0x9F13, 0x59D1,0xA002,0x5B64,0x6CBD,0xA008,0xA004,0xA002,0x4F30,0x7B8D,0xA002,0x5495,0x83C7,0xA004,0xA002,0x8F9C,0x591F, 0xA002,0x8D2D,0x6784,0xA010,0xA008,0xA004,0xA002,0x57A2,0x72D7,0xA002,0x82DF,0x6C9F,0xA004,0xA002,0x52FE,0x94A9, 0xA002,0x5171,0x8D21,0xA008,0xA004,0xA002,0x62F1,0x6C5E,0xA002,0x5DE9,0x5F13,0xA004,0xA002,0x5BAB,0x516C,0xA002, 0x8EAC,0x4F9B,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x9F9A,0x606D,0xA002,0x529F,0x653B,0xA004,0xA002,0x5DE5, 0x6897,0xA002,0x803F,0x57C2,0xA008,0xA004,0xA002,0x7BC4,0x7BC3,0xA002,0x7BC2,0x7BC0,0xA004,0xA002,0x7BBF,0x7BBE, 0xA002,0x7BBD,0x7BBC,0xA010,0xA008,0xA004,0xA002,0x7BBB,0x7BBA,0xA002,0x7BB9,0x7BB7,0xA004,0xA002,0x7BB6,0x7BB5, 0xA002,0x7BB3,0x7BB2,0xA008,0xA004,0xA002,0x7BB0,0x7BAF,0xA002,0x7BAE,0x7BA5,0xA004,0xA002,0x7BA4,0x7BA3,0xA002, 0x7BA0,0x7B9F,0xA01F,0xA010,0xA008,0xA004,0xA002,0x7B9E,0x7B9B,0xA002,0x7B9A,0x7B99,0xA004,0xA002,0x7B98,0x7B96, 0xA002,0x7B93,0x7B92,0xA007,0xA003,0xA000,0x7B91,0xA002,0x7B8F,0x7B8E,0xA004,0xA002,0x7B8C,0x7B8B,0xA002,0x7B8A, 0x7B89,0xA010,0xA008,0xA004,0xA002,0x7B88,0x7B87,0xA002,0x7B86,0x7B84,0xA004,0xA002,0x7B83,0x7B82,0xA002,0x7B81, 0x7B7F,0xA008,0xA004,0xA002,0x7B7D,0x7B7C,0xA002,0x7B7A,0x7B78,0xA004,0xA002,0x7B76,0x7B74,0xA002,0x7B73,0x7B70, 0xA055,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7B6F,0xA002,0x7B6D,0x7B6C,0xA004,0xA002,0x7B6B,0x7B6A,0xA002,0x7B69, 0x7B68,0xA008,0xA004,0xA002,0x7B67,0x7B66,0xA002,0x7B65,0x7B64,0xA004,0xA002,0x7B63,0x7B61,0xA002,0x7B5F,0x7B5E, 0xA010,0xA008,0xA004,0xA002,0x7B5C,0x7B59,0xA002,0x7B57,0x7B55,0xA004,0xA002,0x7B53,0x7B4E,0xA002,0x7B4D,0x7B4A, 0xA008,0xA004,0xA002,0x7B48,0x7B46,0xA002,0x7B44,0x7B43,0xA004,0xA002,0x7B42,0x7B41,0xA002,0x7B40,0x7B3F,0xA000, 0xA010,0xA008,0xA004,0xA002,0x7B3D,0x7B3B,0xA002,0x7B39,0x7B37,0xA004,0xA002,0x7B36,0x7B35,0xA002,0x7B34,0x7B32, 0xA000,0xA000,0xA002,0x7B30,0x7B2F,0xA001,0xA00D,0xA001,0xA004,0xA001,0xA001,0x7FB9,0xA004,0xA002,0x5E9A,0x66F4, 0xA002,0x8015,0x8DDF,0xA010,0xA008,0xA004,0xA002,0x6839,0x7ED9,0xA002,0x5404,0x4E2A,0xA004,0xA002,0x94EC,0x9694, 0xA002,0x9601,0x86E4,0xA008,0xA004,0xA002,0x683C,0x845B,0xA002,0x9769,0x5272,0xA004,0xA002,0x7599,0x80F3,0xA002, 0x9E3D,0x6208,0xA17F,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6401,0xA002,0x6B4C,0x54E5,0xA004,0xA002, 0x544A,0x7A3F,0xA002,0x9550,0x641E,0xA008,0xA004,0xA002,0x7CD5,0x7F94,0xA002,0x818F,0x9AD8,0xA004,0xA002,0x768B, 0x7BD9,0xA002,0x6760,0x6E2F,0xA010,0xA008,0xA004,0xA002,0x5C97,0x7EB2,0xA002,0x809B,0x7F38,0xA004,0xA002,0x94A2, 0x521A,0xA002,0x5188,0x8D63,0xA008,0xA004,0xA002,0x6562,0x79C6,0xA002,0x611F,0x8D76,0xA004,0xA002,0x809D,0x7AFF, 0xA002,0x67D1,0x6746,0xA020,0xA010,0xA008,0xA004,0xA002,0x7518,0x5E72,0xA002,0x6E89,0x76D6,0xA004,0xA002,0x9499, 0x6982,0xA002,0x6539,0x8BE5,0xA008,0xA004,0xA002,0x560E,0x5676,0xA002,0x5490,0x7F1A,0xA004,0xA002,0x5987,0x9644, 0xA002,0x8BA3,0x5BCC,0xA010,0xA008,0xA004,0xA002,0x8D1F,0x8179,0xA002,0x7236,0x961C,0xA004,0xA002,0x4ED8,0x5085, 0xA002,0x590D,0x8D4B,0xA008,0xA004,0xA002,0x8986,0x526F,0xA002,0x8D74,0x8150,0xA004,0xA002,0x5E9C,0x8151,0xA002, 0x812F,0x65A7,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x91DC,0x4FEF,0xA002,0x8F85,0x629A,0xA004,0xA002,0x752B, 0x5F17,0xA002,0x88B1,0x798F,0xA008,0xA004,0xA002,0x6DAA,0x6D6E,0xA002,0x7B2D,0x7B29,0xA004,0xA002,0x7B27,0x7B23, 0xA002,0x7B22,0x7B21,0xA010,0xA008,0xA004,0xA002,0x7B1F,0x7B1D,0xA002,0x7B1C,0x7B1A,0xA004,0xA002,0x7B18,0x7B17, 0xA002,0x7B16,0x7B13,0xA008,0xA004,0xA002,0x7B12,0x7B10,0xA002,0x7B0E,0x7B0D,0xA004,0xA002,0x7B0C,0x7B09,0xA002, 0x7B07,0x7B05,0xA01F,0xA010,0xA008,0xA004,0xA002,0x7B02,0x7B01,0xA002,0x7B00,0x7AFE,0xA004,0xA002,0x7AFC,0x7AFB, 0xA002,0x7AF8,0x7AF7,0xA007,0xA004,0xA002,0x7AF6,0x7AF5,0xA000,0x7AF4,0xA004,0xA002,0x7AF3,0x7AF2,0xA002,0x7AF1, 0x7AF0,0xA010,0xA008,0xA004,0xA002,0x7AEE,0x7AEC,0xA002,0x7AEB,0x7AEA,0xA004,0xA002,0x7AE9,0x7AE8,0xA002,0x7AE7, 0x7AE4,0xA008,0xA004,0xA002,0x7AE2,0x7AE1,0xA002,0x7ADD,0x7ADC,0xA004,0xA002,0x7ADB,0x7ADA,0xA002,0x7AD8,0x7AD7, 0xA058,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7AD5,0xA002,0x7AD4,0x7AD3,0xA004,0xA002,0x7AD2,0x7AD1,0xA002,0x7AD0, 0x7ACF,0xA008,0xA004,0xA002,0x7ACE,0x7ACD,0xA002,0x7ACC,0x7ACA,0xA004,0xA002,0x7AC9,0x7AC8,0xA002,0x7AC7,0x7AC6, 0xA010,0xA008,0xA004,0xA002,0x7AC5,0x7AC4,0xA002,0x7AC3,0x7AC2,0xA004,0xA002,0x7AC1,0x7AC0,0xA002,0x7ABE,0x7ABD, 0xA008,0xA004,0xA002,0x7ABC,0x7ABB,0xA002,0x7ABA,0x7AB9,0xA004,0xA002,0x7AB8,0x7AB7,0xA002,0x7AB6,0x7AB5,0xA000, 0xA010,0xA008,0xA004,0xA002,0x7AB4,0x7AB2,0xA002,0x7AB1,0x7AB0,0xA004,0xA002,0x7AAF,0x7AAE,0xA002,0x7AAB,0x7AAA, 0xA000,0xA004,0xA002,0x7AA9,0x7AA7,0xA002,0x7AA4,0x7AA3,0xA001,0xA009,0xA001,0xA001,0xA003,0xA001,0x670D,0xA002, 0x4FD8,0x4F0F,0xA010,0xA008,0xA004,0xA002,0x7B26,0x6C1F,0xA002,0x5E45,0x8F90,0xA004,0xA002,0x62C2,0x6276,0xA002, 0x5B75,0x80A4,0xA008,0xA004,0xA002,0x6577,0x592B,0xA002,0x5426,0x4F5B,0xA004,0xA002,0x51E4,0x5949,0xA002,0x8BBD, 0x7F1D,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x51AF,0xA002,0x9022,0x70FD,0xA004,0xA002,0x75AF,0x98CE, 0xA002,0x950B,0x5CF0,0xA008,0xA004,0xA002,0x8702,0x67AB,0xA002,0x5C01,0x4E30,0xA004,0xA002,0x7CAA,0x6124,0xA002, 0x5FFF,0x4EFD,0xA010,0xA008,0xA004,0xA002,0x594B,0x7C89,0xA002,0x6C7E,0x711A,0xA004,0xA002,0x575F,0x7EB7,0xA002, 0x5206,0x6C1B,0xA008,0xA004,0xA002,0x5429,0x915A,0xA002,0x82AC,0x8D39,0xA004,0xA002,0x6CB8,0x5E9F,0xA002,0x80BA, 0x5420,0xA020,0xA010,0xA008,0xA004,0xA002,0x8BFD,0x532A,0xA002,0x80A5,0x98DE,0xA004,0xA002,0x5561,0x975E,0xA002, 0x83F2,0x653E,0xA008,0xA004,0xA002,0x7EBA,0x8BBF,0xA002,0x4EFF,0x59A8,0xA004,0xA002,0x9632,0x623F,0xA002,0x80AA, 0x65B9,0xA010,0xA008,0xA004,0xA002,0x82B3,0x574A,0xA002,0x6CDB,0x996D,0xA004,0xA002,0x72AF,0x8D29,0xA002,0x8303, 0x8FD4,0xA008,0xA004,0xA002,0x53CD,0x70E6,0xA002,0x51E1,0x7E41,0xA004,0xA002,0x9492,0x77FE,0xA002,0x6A0A,0x7FFB, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x756A,0x5E06,0xA002,0x85E9,0x73D0,0xA004,0xA002,0x6CD5,0x9600,0xA002, 0x4E4F,0x4F10,0xA008,0xA004,0xA002,0x7B4F,0x7F5A,0xA002,0x53D1,0x8D30,0xA004,0xA002,0x7AA2,0x7AA1,0xA002,0x7A9E, 0x7A9B,0xA010,0xA008,0xA004,0xA002,0x7A9A,0x7A99,0xA002,0x7A94,0x7A93,0xA004,0xA002,0x7A90,0x7A8F,0xA002,0x7A8E, 0x7A8C,0xA008,0xA004,0xA002,0x7A8B,0x7A8A,0xA002,0x7A89,0x7A87,0xA004,0xA002,0x7A85,0x7A82,0xA002,0x7A7E,0x7A7D, 0xA01F,0xA010,0xA008,0xA004,0xA002,0x7A7C,0x7A7B,0xA002,0x7A75,0x7A73,0xA004,0xA002,0x7A72,0x7A71,0xA002,0x7A6F, 0x7A6E,0xA008,0xA004,0xA002,0x7A6D,0x7A6C,0xA002,0x7A6B,0x7A6A,0xA003,0xA000,0x7A69,0xA002,0x7A68,0x7A67,0xA010, 0xA008,0xA004,0xA002,0x7A66,0x7A65,0xA002,0x7A64,0x7A63,0xA004,0xA002,0x7A62,0x7A61,0xA002,0x7A60,0x7A5F,0xA008, 0xA004,0xA002,0x7A5E,0x7A5D,0xA002,0x7A5C,0x7A5B,0xA004,0xA002,0x7A5A,0x7A59,0xA002,0x7A58,0x7A56,0xA05C,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x7A55,0xA002,0x7A54,0x7A53,0xA004,0xA002,0x7A52,0x7A50,0xA002,0x7A4F,0x7A4E,0xA008, 0xA004,0xA002,0x7A4D,0x7A4C,0xA002,0x7A4B,0x7A4A,0xA004,0xA002,0x7A49,0x7A48,0xA002,0x7A47,0x7A45,0xA010,0xA008, 0xA004,0xA002,0x7A44,0x7A43,0xA002,0x7A42,0x7A41,0xA004,0xA002,0x7A40,0x7A3E,0xA002,0x7A3A,0x7A38,0xA008,0xA004, 0xA002,0x7A36,0x7A35,0xA002,0x7A34,0x7A32,0xA004,0xA002,0x7A31,0x7A30,0xA002,0x7A2F,0x7A2E,0xA000,0xA010,0xA008, 0xA004,0xA002,0x7A2D,0x7A2C,0xA002,0x7A2B,0x7A2A,0xA004,0xA002,0x7A29,0x7A28,0xA002,0x7A27,0x7A26,0xA008,0xA004, 0xA002,0x7A25,0x7A24,0xA002,0x7A22,0x7A21,0xA000,0xA002,0x7A1F,0x7A1D,0xA001,0xA006,0xA001,0xA001,0xA001,0xA001, 0x4E8C,0xA010,0xA008,0xA004,0xA002,0x6D31,0x9975,0xA002,0x5C14,0x8033,0xA004,0xA002,0x513F,0x800C,0xA002,0x6069, 0x997F,0xA008,0xA004,0xA002,0x9102,0x904F,0xA002,0x627C,0x5384,0xA004,0xA002,0x6076,0x5A25,0xA002,0x8BB9,0x989D, 0xA5FB,0xA2FD,0xA17E,0xA0FB,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x4FC4,0xA002,0x9E45,0x5CE8,0xA004,0xA002, 0x86FE,0x5815,0xA002,0x60F0,0x5241,0xA008,0xA004,0xA002,0x8235,0x8DFA,0xA002,0x6735,0x8EB2,0xA004,0xA002,0x579B, 0x593A,0xA002,0x591A,0x54C6,0xA010,0xA008,0xA004,0xA002,0x6387,0x9041,0xA002,0x76FE,0x949D,0xA004,0xA002,0x56E4, 0x987F,0xA002,0x6566,0x8E72,0xA008,0xA004,0xA002,0x5428,0x58A9,0xA002,0x5BF9,0x961F,0xA004,0xA002,0x5151,0x5806, 0xA002,0x7F0E,0x65AD,0xA020,0xA010,0xA008,0xA004,0xA002,0x6BB5,0x953B,0xA002,0x77ED,0x7AEF,0xA004,0xA002,0x5992, 0x6E21,0xA002,0x5EA6,0x809A,0xA008,0xA004,0xA002,0x9540,0x675C,0xA002,0x8D4C,0x7779,0xA004,0xA002,0x5835,0x8BFB, 0xA002,0x72EC,0x728A,0xA010,0xA008,0xA004,0xA002,0x6BD2,0x7763,0xA002,0x90FD,0x75D8,0xA004,0xA002,0x9017,0x8C46, 0xA002,0x9661,0x6597,0xA008,0xA004,0xA002,0x6296,0x515C,0xA002,0x6D1E,0x51BB,0xA004,0xA002,0x606B,0x4F97,0xA002, 0x680B,0x52A8,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x61C2,0xA002,0x8463,0x51AC,0xA004,0xA002,0x4E1C,0x4E22,0xA002, 0x8BA2,0x5B9A,0xA008,0xA004,0xA002,0x952D,0x9F0E,0xA002,0x9876,0x9489,0xA004,0xA002,0x53EE,0x76EF,0xA002,0x4E01, 0x7A1C,0xA010,0xA008,0xA004,0xA002,0x7A1B,0x7A19,0xA002,0x7A18,0x7A16,0xA004,0xA002,0x7A15,0x7A13,0xA002,0x7A12, 0x7A11,0xA008,0xA004,0xA002,0x7A10,0x7A0F,0xA002,0x7A0C,0x7A0A,0xA004,0xA002,0x7A09,0x7A08,0xA002,0x7A07,0x7A05, 0xA020,0xA010,0xA008,0xA004,0xA002,0x7A04,0x7A01,0xA002,0x79FF,0x79FE,0xA004,0xA002,0x79FC,0x79FA,0xA002,0x79F9, 0x79F7,0xA008,0xA004,0xA002,0x79F6,0x79F5,0xA002,0x79F4,0x79F3,0xA004,0xA002,0x79F2,0x79F1,0xA002,0x79EE,0x79EC, 0xA00F,0xA007,0xA003,0xA001,0x79EA,0xA002,0x79E8,0x79E5,0xA004,0xA002,0x79E2,0x79E1,0xA002,0x79E0,0x79DE,0xA008, 0xA004,0xA002,0x79DD,0x79DC,0xA002,0x79DB,0x79DA,0xA004,0xA002,0x79D9,0x79D7,0xA002,0x79D6,0x79D4,0xA064,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x79D3,0xA002,0x79D0,0x79CF,0xA004,0xA002,0x79CE,0x79CC,0xA002,0x79CA,0x79C8,0xA008, 0xA004,0xA002,0x79C7,0x79C5,0xA002,0x79C4,0x79C2,0xA004,0xA002,0x79BF,0x79BC,0xA002,0x79B8,0x79B7,0xA010,0xA008, 0xA004,0xA002,0x79B6,0x79B5,0xA002,0x79B4,0x79B2,0xA004,0xA002,0x79B1,0x79B0,0xA002,0x79AF,0x79AE,0xA008,0xA004, 0xA002,0x79AD,0x79AC,0xA002,0x79AB,0x79AA,0xA004,0xA002,0x79A9,0x79A8,0xA002,0x79A6,0x79A5,0xA020,0xA010,0xA008, 0xA004,0xA002,0x79A4,0x79A3,0xA002,0x79A2,0x79A1,0xA004,0xA002,0x79A0,0x799F,0xA002,0x799E,0x799D,0xA008,0xA004, 0xA002,0x799C,0x799B,0xA002,0x7999,0x7998,0xA004,0xA002,0x7997,0x7996,0xA002,0x7995,0x7994,0xA000,0xA000,0xA000, 0xA000,0x7993,0xA001,0xA001,0xA00D,0xA005,0xA001,0xA002,0x53E0,0x8C0D,0xA004,0xA002,0x8FED,0x8776,0xA002,0x789F, 0x7239,0xA008,0xA004,0xA002,0x8DCC,0x8C03,0xA002,0x9493,0x540A,0xA004,0xA002,0x6389,0x5201,0xA002,0x51CB,0x96D5, 0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x53FC,0xA002,0x7889,0x6BBF,0xA004,0xA002,0x6DC0,0x5960,0xA002, 0x60E6,0x5E97,0xA008,0xA004,0xA002,0x7538,0x4F43,0xA002,0x7535,0x57AB,0xA004,0xA002,0x975B,0x5178,0xA002,0x70B9, 0x7898,0xA010,0xA008,0xA004,0xA002,0x6EC7,0x6382,0xA002,0x98A0,0x7F14,0xA004,0xA002,0x9012,0x5F1F,0xA002,0x5E1D, 0x7B2C,0xA008,0xA004,0xA002,0x8482,0x5730,0xA002,0x5E95,0x62B5,0xA004,0xA002,0x5AE1,0x7FDF,0xA002,0x6DA4,0x72C4, 0xA020,0xA010,0xA008,0xA004,0xA002,0x7B1B,0x654C,0xA002,0x8FEA,0x6EF4,0xA004,0xA002,0x4F4E,0x5824,0xA002,0x9093, 0x51F3,0xA008,0xA004,0xA002,0x77AA,0x7B49,0xA002,0x767B,0x706F,0xA004,0xA002,0x8E6C,0x7684,0xA002,0x5F97,0x5FB7, 0xA010,0xA008,0xA004,0xA002,0x76D7,0x9053,0xA002,0x60BC,0x7A3B,0xA004,0xA002,0x5230,0x5BFC,0xA002,0x7977,0x5C9B, 0xA008,0xA004,0xA002,0x5012,0x8E48,0xA002,0x6363,0x5200,0xA004,0xA002,0x6863,0x8361,0xA002,0x515A,0x6321,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x5F53,0x86CB,0xA002,0x5F39,0x8BDE,0xA004,0xA002,0x6DE1,0x60EE,0xA002,0x4F46, 0x6C2E,0xA008,0xA004,0xA002,0x65E6,0x80C6,0xA002,0x63B8,0x90F8,0xA004,0xA002,0x5355,0x4E39,0xA002,0x62C5,0x803D, 0xA010,0xA008,0xA004,0xA002,0x6020,0x7992,0xA002,0x7991,0x7990,0xA004,0xA002,0x798E,0x798D,0xA002,0x798C,0x798B, 0xA008,0xA004,0xA002,0x7989,0x7988,0xA002,0x7987,0x7986,0xA004,0xA002,0x7983,0x7982,0xA002,0x797F,0x797E,0xA020, 0xA010,0xA008,0xA004,0xA002,0x797D,0x797C,0xA002,0x797B,0x7979,0xA004,0xA002,0x7976,0x7975,0xA002,0x7974,0x7973, 0xA008,0xA004,0xA002,0x7972,0x7971,0xA002,0x7970,0x796E,0xA004,0xA002,0x796C,0x796B,0xA002,0x796A,0x7969,0xA00F, 0xA007,0xA004,0xA002,0x7966,0x7964,0xA001,0x7963,0xA004,0xA002,0x7961,0x7959,0xA002,0x7958,0x7955,0xA008,0xA004, 0xA002,0x7954,0x7952,0xA002,0x7951,0x7950,0xA004,0xA002,0x794F,0x794E,0xA002,0x794D,0x794C,0xA067,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x794B,0xA002,0x794A,0x7947,0xA004,0xA002,0x7945,0x7944,0xA002,0x7943,0x7942,0xA008,0xA004, 0xA002,0x793F,0x793D,0xA002,0x7939,0x7938,0xA004,0xA002,0x7937,0x7936,0xA002,0x7935,0x7933,0xA010,0xA008,0xA004, 0xA002,0x7932,0x7931,0xA002,0x7930,0x792F,0xA004,0xA002,0x792E,0x792D,0xA002,0x792C,0x792B,0xA008,0xA004,0xA002, 0x792A,0x7929,0xA002,0x7928,0x7927,0xA004,0xA002,0x7926,0x7925,0xA002,0x7923,0x7922,0xA020,0xA010,0xA008,0xA004, 0xA002,0x7921,0x7920,0xA002,0x791F,0x791D,0xA004,0xA002,0x791C,0x791B,0xA002,0x791A,0x7919,0xA008,0xA004,0xA002, 0x7918,0x7917,0xA002,0x7916,0x7915,0xA004,0xA002,0x7914,0x7912,0xA002,0x7911,0x7910,0xA000,0xA000,0xA004,0xA002, 0x790F,0x790E,0xA000,0x790D,0xA001,0xA001,0xA009,0xA001,0xA004,0xA002,0x902E,0x5F85,0xA002,0x888B,0x8D37,0xA008, 0xA004,0xA002,0x4EE3,0x6B86,0xA002,0x5E26,0x6234,0xA004,0xA002,0x50A3,0x6B79,0xA002,0x5446,0x5927,0xA180,0xA0FD, 0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6253,0xA002,0x7629,0x7B54,0xA004,0xA002,0x8FBE,0x642D,0xA002,0x9519, 0x632B,0xA008,0xA004,0xA002,0x63AA,0x6413,0xA002,0x64AE,0x78CB,0xA004,0xA002,0x5BF8,0x5B58,0xA002,0x6751,0x7FE0, 0xA010,0xA008,0xA004,0xA002,0x6DEC,0x7CB9,0xA002,0x7601,0x8106,0xA004,0xA002,0x50AC,0x5D14,0xA002,0x6467,0x7A9C, 0xA008,0xA004,0xA002,0x7BE1,0x8E7F,0xA002,0x4FC3,0x7C07,0xA004,0xA002,0x918B,0x7C97,0xA002,0x51D1,0x4E1B,0xA020, 0xA010,0xA008,0xA004,0xA002,0x4ECE,0x5306,0xA002,0x56F1,0x8471,0xA004,0xA002,0x806A,0x6B21,0xA002,0x8D50,0x523A, 0xA008,0xA004,0xA002,0x6B64,0x8BCD,0xA002,0x74F7,0x6148,0xA004,0xA002,0x8F9E,0x96CC,0xA002,0x78C1,0x8328,0xA010, 0xA008,0xA004,0xA002,0x75B5,0x7EF0,0xA002,0x6233,0x8822,0xA004,0xA002,0x7EAF,0x6DF3,0xA002,0x5507,0x9187,0xA008, 0xA004,0xA002,0x693F,0x6625,0xA002,0x5782,0x9524,0xA004,0xA002,0x6376,0x708A,0xA002,0x5439,0x521B,0xA040,0xA020, 0xA010,0xA008,0xA004,0xA002,0x95EF,0x5E8A,0xA002,0x5E62,0x7A97,0xA004,0xA002,0x75AE,0x4E32,0xA002,0x5598,0x8239, 0xA008,0xA004,0xA002,0x4F20,0x693D,0xA002,0x7A7F,0x5DDD,0xA004,0xA002,0x63E3,0x5904,0xA002,0x89E6,0x6410,0xA010, 0xA008,0xA004,0xA002,0x77D7,0x50A8,0xA002,0x7840,0x790C,0xA004,0xA002,0x790B,0x790A,0xA002,0x7909,0x7908,0xA008, 0xA004,0xA002,0x7907,0x7906,0xA002,0x7904,0x7903,0xA004,0xA002,0x7902,0x7900,0xA002,0x78FF,0x78FE,0xA020,0xA010, 0xA008,0xA004,0xA002,0x78FD,0x78FC,0xA002,0x78FB,0x78F9,0xA004,0xA002,0x78F8,0x78F6,0xA002,0x78F5,0x78F3,0xA008, 0xA004,0xA002,0x78F1,0x78F0,0xA002,0x78EF,0x78EE,0xA004,0xA002,0x78ED,0x78EB,0xA002,0x78EA,0x78E9,0xA00F,0xA008, 0xA004,0xA002,0x78E7,0x78E6,0xA002,0x78E5,0x78E4,0xA003,0xA001,0x78E3,0xA002,0x78E2,0x78E1,0xA008,0xA004,0xA002, 0x78E0,0x78DF,0xA002,0x78DE,0x78DD,0xA004,0xA002,0x78DC,0x78DB,0xA002,0x78DA,0x78D8,0xA06B,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x78D7,0xA002,0x78D6,0x78D3,0xA004,0xA002,0x78D2,0x78D1,0xA002,0x78CF,0x78CE,0xA008,0xA004,0xA002, 0x78CD,0x78CC,0xA002,0x78C8,0x78C7,0xA004,0xA002,0x78C6,0x78C4,0xA002,0x78C3,0x78C2,0xA010,0xA008,0xA004,0xA002, 0x78C0,0x78BF,0xA002,0x78BD,0x78BC,0xA004,0xA002,0x78BB,0x78BA,0xA002,0x78B8,0x78B7,0xA008,0xA004,0xA002,0x78B6, 0x78B5,0xA002,0x78AF,0x78AE,0xA004,0xA002,0x78AD,0x78AC,0xA002,0x78AB,0x78AA,0xA020,0xA010,0xA008,0xA004,0xA002, 0x78A9,0x78A8,0xA002,0x78A6,0x78A4,0xA004,0xA002,0x78A2,0x78A0,0xA002,0x789E,0x789D,0xA008,0xA004,0xA002,0x7899, 0x7896,0xA002,0x7895,0x7894,0xA004,0xA002,0x7892,0x7890,0xA002,0x788F,0x788B,0xA000,0xA008,0xA004,0xA002,0x788A, 0x7888,0xA002,0x7886,0x7885,0xA000,0xA000,0x7884,0xA001,0xA001,0xA006,0xA001,0xA001,0xA002,0x695A,0x9664,0xA008, 0xA004,0xA002,0x6EC1,0x96CF,0xA002,0x9504,0x8E87,0xA004,0xA002,0x53A8,0x6A71,0xA002,0x51FA,0x521D,0xA0FD,0xA07E, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x81ED,0xA002,0x4E11,0x7785,0xA004,0xA002,0x7EF8,0x4EC7,0xA002,0x7B79,0x6101, 0xA008,0xA004,0xA002,0x7A20,0x8E0C,0xA002,0x7574,0x916C,0xA004,0xA002,0x62BD,0x5BA0,0xA002,0x5D07,0x866B,0xA010, 0xA008,0xA004,0xA002,0x51B2,0x5145,0xA002,0x70BD,0x65A5,0xA004,0xA002,0x7FC5,0x8D64,0xA002,0x5C3A,0x4F88,0xA008, 0xA004,0xA002,0x9F7F,0x803B,0xA002,0x9A70,0x5F1B,0xA004,0xA002,0x8FDF,0x6C60,0xA002,0x5319,0x6301,0xA020,0xA010, 0xA008,0xA004,0xA002,0x75F4,0x5403,0xA002,0x79E4,0x9A8B,0xA004,0xA002,0x901E,0x627F,0xA002,0x8BDA,0x6F84,0xA008, 0xA004,0xA002,0x60E9,0x7A0B,0xA002,0x4E58,0x5448,0xA004,0xA002,0x6210,0x6A59,0xA002,0x57CE,0x79F0,0xA010,0xA008, 0xA004,0xA002,0x6491,0x886C,0xA002,0x8D81,0x9648,0xA004,0xA002,0x6C89,0x5FF1,0xA002,0x6668,0x5C18,0xA008,0xA004, 0xA002,0x8FB0,0x81E3,0xA002,0x90F4,0x6F88,0xA004,0xA002,0x5F7B,0x63A3,0xA002,0x64A4,0x626F,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x8F66,0x7092,0xA002,0x5435,0x5DE2,0xA004,0xA002,0x6F6E,0x5632,0xA002,0x671D,0x949E,0xA008, 0xA004,0xA002,0x6284,0x8D85,0xA002,0x5021,0x5531,0xA004,0xA002,0x7545,0x655E,0xA002,0x5382,0x80A0,0xA010,0xA008, 0xA004,0xA002,0x507F,0x957F,0xA002,0x5E38,0x5C1D,0xA004,0xA002,0x573A,0x7883,0xA002,0x7882,0x7881,0xA008,0xA004, 0xA002,0x7880,0x787F,0xA002,0x787E,0x787D,0xA004,0xA002,0x787B,0x787A,0xA002,0x7879,0x7878,0xA020,0xA010,0xA008, 0xA004,0xA002,0x7876,0x7875,0xA002,0x7874,0x7873,0xA004,0xA002,0x7872,0x7871,0xA002,0x7870,0x786F,0xA008,0xA004, 0xA002,0x7869,0x7868,0xA002,0x7867,0x7866,0xA004,0xA002,0x7865,0x7864,0xA002,0x7863,0x7862,0xA00F,0xA008,0xA004, 0xA002,0x7861,0x7860,0xA002,0x785F,0x785E,0xA004,0xA002,0x785C,0x785B,0xA001,0x785A,0xA008,0xA004,0xA002,0x7859, 0x7858,0xA002,0x7854,0x7853,0xA004,0xA002,0x7851,0x784F,0xA002,0x784D,0x784B,0xA06E,0xA03E,0xA01E,0xA00E,0xA006, 0xA002,0x784A,0xA002,0x7849,0x7848,0xA004,0xA002,0x7846,0x7844,0xA002,0x7843,0x7842,0xA008,0xA004,0xA002,0x7841, 0x783F,0xA002,0x783D,0x7836,0xA004,0xA002,0x7835,0x7833,0xA002,0x7832,0x7831,0xA010,0xA008,0xA004,0xA002,0x782F, 0x782E,0xA002,0x782B,0x782A,0xA004,0xA002,0x7828,0x7824,0xA002,0x7822,0x7821,0xA008,0xA004,0xA002,0x7820,0x781E, 0xA002,0x781B,0x7819,0xA004,0xA002,0x7815,0x7813,0xA002,0x7810,0x780F,0xA020,0xA010,0xA008,0xA004,0xA002,0x780E, 0x780B,0xA002,0x780A,0x7808,0xA004,0xA002,0x7807,0x7806,0xA002,0x7805,0x7804,0xA008,0xA004,0xA002,0x7803,0x77FC, 0xA002,0x77FB,0x77FA,0xA004,0xA002,0x77F9,0x77F7,0xA002,0x77F5,0x77F4,0xA000,0xA008,0xA004,0xA002,0x77F2,0x77F1, 0xA002,0x77F0,0x77EF,0xA004,0xA002,0x77EA,0x77E8,0xA000,0x77E6,0xA001,0xA001,0xA001,0xA008,0xA004,0xA002,0x7316, 0x660C,0xA002,0x98A4,0x9610,0xA004,0xA002,0x4EA7,0x94F2,0xA002,0x7F20,0x8C17,0xA2FF,0xA180,0xA0FD,0xA07E,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x998B,0xA002,0x8749,0x63BA,0xA004,0xA002,0x6400,0x8C7A,0xA002,0x67F4,0x62C6,0xA008, 0xA004,0xA002,0x8BE7,0x5DEE,0xA002,0x5C94,0x5BDF,0xA004,0xA002,0x643D,0x78B4,0xA002,0x67E5,0x8336,0xA010,0xA008, 0xA004,0xA002,0x832C,0x53C9,0xA002,0x63D2,0x8E6D,0xA004,0xA002,0x5C42,0x6D4B,0xA002,0x518C,0x4FA7,0xA008,0xA004, 0xA002,0x7B56,0x5395,0xA002,0x8349,0x66F9,0xA004,0xA002,0x69FD,0x7CD9,0xA002,0x64CD,0x85CF,0xA020,0xA010,0xA008, 0xA004,0xA002,0x6CA7,0x4ED3,0xA002,0x8231,0x82CD,0xA004,0xA002,0x707F,0x60E8,0xA002,0x60ED,0x6B8B,0xA008,0xA004, 0xA002,0x8695,0x53C2,0xA002,0x9910,0x8521,0xA004,0xA002,0x83DC,0x5F69,0xA002,0x91C7,0x8E29,0xA010,0xA008,0xA004, 0xA002,0x776C,0x8D22,0xA002,0x624D,0x6750,0xA004,0xA002,0x88C1,0x731C,0xA002,0x64E6,0x6016,0xA008,0xA004,0xA002, 0x90E8,0x7C3F,0xA002,0x6B65,0x5E03,0xA004,0xA002,0x4E0D,0x57E0,0xA002,0x8865,0x54FA,0xA040,0xA020,0xA010,0xA008, 0xA004,0xA002,0x535C,0x6355,0xA002,0x9A73,0x6CCA,0xA004,0xA002,0x6E24,0x818A,0xA002,0x8116,0x8236,0xA008,0xA004, 0xA002,0x5E1B,0x4F2F,0xA002,0x7B94,0x94C2,0xA004,0xA002,0x640F,0x52C3,0xA002,0x535A,0x6CE2,0xA010,0xA008,0xA004, 0xA002,0x94B5,0x62E8,0xA002,0x64AD,0x83E0,0xA004,0xA002,0x73BB,0x5E76,0xA002,0x75C5,0x77E4,0xA008,0xA004,0xA002, 0x77E1,0x77E0,0xA002,0x77DF,0x77DE,0xA004,0xA002,0x77DD,0x77DA,0xA002,0x77D9,0x77D8,0xA020,0xA010,0xA008,0xA004, 0xA002,0x77D6,0x77D5,0xA002,0x77D4,0x77D3,0xA004,0xA002,0x77D2,0x77D1,0xA002,0x77D0,0x77CF,0xA008,0xA004,0xA002, 0x77CE,0x77CC,0xA002,0x77CB,0x77CA,0xA004,0xA002,0x77C9,0x77C8,0xA002,0x77C7,0x77C6,0xA010,0xA008,0xA004,0xA002, 0x77C5,0x77C4,0xA002,0x77C3,0x77C2,0xA004,0xA002,0x77C1,0x77C0,0xA002,0x77BE,0x77BC,0xA007,0xA003,0xA001,0x77BA, 0xA002,0x77B9,0x77B8,0xA004,0xA002,0x77B7,0x77B6,0xA002,0x77B4,0x77B2,0xA073,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x77B1,0xA002,0x77AF,0x77AE,0xA004,0xA002,0x77AD,0x77AB,0xA002,0x77A8,0x77A6,0xA008,0xA004,0xA002,0x77A4,0x77A3, 0xA002,0x77A1,0x779E,0xA004,0xA002,0x779D,0x779C,0xA002,0x779B,0x779A,0xA010,0xA008,0xA004,0xA002,0x7799,0x7798, 0xA002,0x7797,0x7796,0xA004,0xA002,0x7795,0x7794,0xA002,0x7793,0x7790,0xA008,0xA004,0xA002,0x778F,0x778B,0xA002, 0x778A,0x7789,0xA004,0xA002,0x7788,0x7787,0xA002,0x7786,0x7783,0xA020,0xA010,0xA008,0xA004,0xA002,0x7782,0x7781, 0xA002,0x777C,0x777B,0xA004,0xA002,0x777A,0x7778,0xA002,0x7777,0x7776,0xA008,0xA004,0xA002,0x7775,0x7774,0xA002, 0x7773,0x7772,0xA004,0xA002,0x7771,0x7770,0xA002,0x776F,0x776E,0xA010,0xA008,0xA004,0xA002,0x776D,0x776A,0xA002, 0x7769,0x7767,0xA004,0xA002,0x7764,0x7760,0xA002,0x775F,0x775E,0xA000,0xA000,0xA000,0x775D,0xA001,0xA001,0xA001, 0xA005,0xA001,0xA002,0x70B3,0x997C,0xA004,0xA002,0x79C9,0x4E19,0xA002,0x67C4,0x51B0,0xA0FD,0xA07E,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x5175,0xA002,0x6448,0x5BBE,0xA004,0xA002,0x6EE8,0x6FD2,0xA002,0x658C,0x5F6C,0xA008,0xA004, 0xA002,0x762A,0x522B,0xA002,0x618B,0x9CD6,0xA004,0xA002,0x8868,0x8198,0xA002,0x5F6A,0x6807,0xA010,0xA008,0xA004, 0xA002,0x904D,0x8FAB,0xA002,0x8FA9,0x8FA8,0xA004,0xA002,0x535E,0x53D8,0xA002,0x4FBF,0x6241,0xA008,0xA004,0xA002, 0x8D2C,0x7F16,0xA002,0x8FB9,0x97AD,0xA004,0xA002,0x965B,0x907F,0xA002,0x81C2,0x58C1,0xA020,0xA010,0xA008,0xA004, 0xA002,0x8F9F,0x5FC5,0xA002,0x5F0A,0x655D,0xA004,0xA002,0x95ED,0x75F9,0xA002,0x5E87,0x5E01,0xA008,0xA004,0xA002, 0x6BD6,0x6BD9,0xA002,0x6BD5,0x853D,0xA004,0xA002,0x84D6,0x78A7,0xA002,0x5F7C,0x7B14,0xA010,0xA008,0xA004,0xA002, 0x9119,0x6BD4,0xA002,0x9F3B,0x903C,0xA004,0xA002,0x8FF8,0x8E66,0xA002,0x6CF5,0x752D,0xA008,0xA004,0xA002,0x7EF7, 0x5D29,0xA002,0x7B28,0x672C,0xA004,0xA002,0x82EF,0x5954,0xA002,0x88AB,0x7119,0xA040,0xA020,0xA010,0xA008,0xA004, 0xA002,0x60EB,0x5907,0xA002,0x72C8,0x500D,0xA004,0xA002,0x94A1,0x8D1D,0xA002,0x80CC,0x8F88,0xA008,0xA004,0xA002, 0x5317,0x5351,0xA002,0x60B2,0x7891,0xA004,0xA002,0x676F,0x7206,0xA002,0x9C8D,0x8C79,0xA010,0xA008,0xA004,0xA002, 0x66B4,0x62A5,0xA002,0x62B1,0x5B9D,0xA004,0xA002,0x9971,0x5821,0xA002,0x4FDD,0x96F9,0xA008,0xA004,0xA002,0x8584, 0x775C,0xA002,0x7759,0x7758,0xA004,0xA002,0x7757,0x7756,0xA002,0x7755,0x7754,0xA020,0xA010,0xA008,0xA004,0xA002, 0x7753,0x7752,0xA002,0x774F,0x774E,0xA004,0xA002,0x774D,0x774C,0xA002,0x774B,0x774A,0xA008,0xA004,0xA002,0x7749, 0x7748,0xA002,0x7746,0x7745,0xA004,0xA002,0x7744,0x7742,0xA002,0x773F,0x773E,0xA010,0xA008,0xA004,0xA002,0x773D, 0x773B,0xA002,0x7739,0x7734,0xA004,0xA002,0x7733,0x7732,0xA002,0x7731,0x7730,0xA007,0xA004,0xA002,0x772E,0x772C, 0xA001,0x772B,0xA004,0xA002,0x772A,0x7727,0xA002,0x7725,0x7724,0xA076,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7723, 0xA002,0x7721,0x771E,0xA004,0xA002,0x771D,0x771C,0xA002,0x771B,0x7718,0xA008,0xA004,0xA002,0x7717,0x7716,0xA002, 0x7715,0x7714,0xA004,0xA002,0x7713,0x7712,0xA002,0x7711,0x7710,0xA010,0xA008,0xA004,0xA002,0x770F,0x770E,0xA002, 0x770C,0x770A,0xA004,0xA002,0x7706,0x7705,0xA002,0x7703,0x7702,0xA008,0xA004,0xA002,0x7700,0x76FF,0xA002,0x76FD, 0x76FB,0xA004,0xA002,0x76FA,0x76F7,0xA002,0x76F6,0x76F5,0xA020,0xA010,0xA008,0xA004,0xA002,0x76F3,0x76F0,0xA002, 0x76ED,0x76EC,0xA004,0xA002,0x76EB,0x76EA,0xA002,0x76E9,0x76E8,0xA008,0xA004,0xA002,0x76E7,0x76E6,0xA002,0x76E4, 0x76E3,0xA004,0xA002,0x76E2,0x76E1,0xA002,0x76E0,0x76DE,0xA010,0xA008,0xA004,0xA002,0x76DD,0x76DC,0xA002,0x76DA, 0x76D9,0xA004,0xA002,0x76D5,0x76D3,0xA002,0x76CC,0x76CB,0xA000,0xA004,0xA002,0x76C9,0x76C7,0xA000,0x76C4,0xA001, 0xA001,0xA001,0xA001,0xA004,0xA002,0x5265,0x8912,0xA002,0x5305,0x80DE,0xA178,0xA0FD,0xA07E,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x82DE,0xA002,0x8C24,0x508D,0xA004,0xA002,0x9551,0x868C,0xA002,0x78C5,0x68D2,0xA008,0xA004,0xA002, 0x7ED1,0x8180,0xA002,0x699C,0x6886,0xA004,0xA002,0x5E2E,0x90A6,0xA002,0x7ECA,0x529E,0xA010,0xA008,0xA004,0xA002, 0x534A,0x74E3,0xA002,0x4F34,0x62CC,0xA004,0xA002,0x626E,0x7248,0xA002,0x677F,0x9881,0xA008,0xA004,0xA002,0x822C, 0x6273,0xA002,0x642C,0x73ED,0xA004,0xA002,0x6591,0x7A17,0xA002,0x62DC,0x8D25,0xA020,0xA010,0xA008,0xA004,0xA002, 0x4F70,0x6446,0xA002,0x767E,0x67CF,0xA004,0xA002,0x767D,0x7238,0xA002,0x7F62,0x9738,0xA008,0xA004,0xA002,0x575D, 0x8019,0xA002,0x628A,0x9776,0xA004,0xA002,0x8DCB,0x62D4,0xA002,0x5DF4,0x75A4,0xA010,0xA008,0xA004,0xA002,0x516B, 0x7B06,0xA002,0x5427,0x53ED,0xA004,0xA002,0x6252,0x634C,0xA002,0x82AD,0x6FB3,0xA008,0xA004,0xA002,0x61CA,0x5965, 0xA002,0x50B2,0x8884,0xA004,0xA002,0x7FF1,0x71AC,0xA002,0x6556,0x51F9,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x76CE,0x6602,0xA002,0x80AE,0x6848,0xA004,0xA002,0x80FA,0x5CB8,0xA002,0x6697,0x6309,0xA008,0xA004,0xA002,0x4FFA, 0x5B89,0xA002,0x6C28,0x978D,0xA004,0xA002,0x9698,0x7231,0xA002,0x788D,0x827E,0xA010,0xA008,0xA004,0xA002,0x77EE, 0x853C,0xA002,0x764C,0x7691,0xA004,0xA002,0x54C0,0x5509,0xA002,0x54CE,0x6328,0xA008,0xA004,0xA002,0x57C3,0x963F, 0xA002,0x554A,0x76C3,0xA004,0xA002,0x76C1,0x76C0,0xA002,0x76BE,0x76BD,0xA020,0xA010,0xA008,0xA004,0xA002,0x76BC, 0x76BB,0xA002,0x76BA,0x76B9,0xA004,0xA002,0x76B8,0x76B7,0xA002,0x76B6,0x76B5,0xA008,0xA004,0xA002,0x76B3,0x76B0, 0xA002,0x76AF,0x76AD,0xA004,0xA002,0x76AC,0x76AB,0xA002,0x76AA,0x76A9,0xA010,0xA008,0xA004,0xA002,0x76A8,0x76A7, 0xA002,0x76A6,0x76A5,0xA004,0xA002,0x76A3,0x76A2,0xA002,0x76A1,0x76A0,0xA008,0xA004,0xA002,0x769F,0x769E,0xA002, 0x769D,0x769C,0xA003,0xA001,0x769B,0xA002,0x769A,0x7698,0xA000,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7697,0xA002, 0x7695,0x7694,0xA004,0xA002,0x7692,0x7690,0xA002,0x768F,0x768D,0xA008,0xA004,0xA002,0x768C,0x768A,0xA002,0x7689, 0x7685,0xA004,0xA002,0x7683,0x7681,0xA002,0x7680,0x767F,0xA010,0xA008,0xA004,0xA002,0x767C,0x767A,0xA002,0x7679, 0x7677,0xA004,0xA002,0x7676,0x7675,0xA002,0x7674,0x7673,0xA008,0xA004,0xA002,0x7672,0x7671,0xA002,0x7670,0x766E, 0xA004,0xA002,0x766D,0x766C,0xA002,0x766A,0x7669,0xA020,0xA010,0xA008,0xA004,0xA002,0x7668,0x7667,0xA002,0x7666, 0x7665,0xA004,0xA002,0x7664,0x7662,0xA002,0x7661,0x7660,0xA008,0xA004,0xA002,0x765F,0x765D,0xA002,0x765B,0x765A, 0xA004,0xA002,0x7659,0x7658,0xA002,0x7657,0x7655,0xA010,0xA008,0xA004,0xA002,0x7653,0x7652,0xA002,0x7651,0x7650, 0xA004,0xA002,0x764F,0x764E,0xA002,0x764B,0x764A,0xA008,0xA004,0xA002,0x7649,0x7648,0xA002,0x7647,0x7646,0xA000, 0xA000,0x7645,0xA04A,0xA001,0xA00A,0xA001,0xA001,0xA001,0xA003,0xA001,0x7644,0xA002,0x7642,0x7641,0xA020,0xA010, 0xA008,0xA004,0xA002,0x763D,0x763B,0xA002,0x763A,0x7639,0xA004,0xA002,0x7637,0x7636,0xA002,0x7632,0x7631,0xA008, 0xA004,0xA002,0x762F,0x762E,0xA002,0x762C,0x7628,0xA004,0xA002,0x7627,0x7623,0xA002,0x7621,0x761E,0xA010,0xA008, 0xA004,0xA002,0x761D,0x761C,0xA002,0x761A,0x7616,0xA004,0xA002,0x7614,0x7613,0xA002,0x7612,0x7611,0xA008,0xA004, 0xA002,0x760F,0x760E,0xA002,0x760D,0x760B,0xA004,0xA002,0x7609,0x7608,0xA001,0x7607,0xA000,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x7606,0xA002,0x7604,0x7602,0xA004,0xA002,0x75FE,0x75FD,0xA002,0x75FB,0x75FA,0xA008,0xA004,0xA002, 0x75F8,0x75F7,0xA002,0x75F6,0x75F5,0xA004,0xA002,0x75F3,0x75F2,0xA002,0x75EF,0x75EE,0xA010,0xA008,0xA004,0xA002, 0x75ED,0x75EC,0xA002,0x75E9,0x75E5,0xA004,0xA002,0x75E1,0x75E0,0xA002,0x75DF,0x75DD,0xA008,0xA004,0xA002,0x75DC, 0x75DA,0xA002,0x75D9,0x75D7,0xA004,0xA002,0x75D3,0x75D1,0xA002,0x75D0,0x75CF,0xA020,0xA010,0xA008,0xA004,0xA002, 0x75CE,0x75CC,0xA002,0x75CB,0x75C6,0xA004,0xA002,0x75C1,0x75C0,0xA002,0x75BF,0x75BB,0xA008,0xA004,0xA002,0x75BA, 0x75B7,0xA002,0x75B6,0x75AD,0xA004,0xA002,0x75AA,0x75A9,0xA002,0x75A8,0x75A7,0xA010,0xA008,0xA004,0xA002,0x75A6, 0x75A2,0xA002,0x759E,0x759C,0xA004,0xA002,0x759B,0x7598,0xA002,0x7595,0x7593,0xA008,0xA004,0xA002,0x7590,0x758E, 0xA002,0x758D,0x758C,0xA004,0xA002,0x758A,0x7589,0xA000,0x7588,0xA6E8,0xA320,0xA190,0xA0C8,0xA042,0xA001,0xA001, 0xA020,0xA010,0xA008,0xA004,0xA002,0x7587,0x7585,0xA002,0x7584,0x7582,0xA004,0xA002,0x7581,0x7580,0xA002,0x757E, 0x757D,0xA008,0xA004,0xA002,0x757C,0x757B,0xA002,0x757A,0x7577,0xA004,0xA002,0x7576,0x7575,0xA002,0x7573,0x7571, 0xA010,0xA008,0xA004,0xA002,0x7570,0x756F,0xA002,0x756E,0x756D,0xA004,0xA002,0x756C,0x756B,0xA002,0x7569,0x7568, 0xA008,0xA004,0xA002,0x7567,0x7564,0xA002,0x7563,0x7562,0xA004,0xA002,0x7561,0x7560,0xA002,0x755F,0x755E,0xA07D, 0xA03D,0xA01D,0xA00D,0xA005,0xA002,0x755D,0xA001,0x7558,0xA004,0xA002,0x7557,0x7556,0xA002,0x7555,0x7553,0xA008, 0xA004,0xA002,0x7552,0x7551,0xA002,0x7550,0x754D,0xA004,0xA002,0x754A,0x7549,0xA002,0x7547,0x7546,0xA010,0xA008, 0xA004,0xA002,0x7544,0x7543,0xA002,0x7542,0x7541,0xA004,0xA002,0x753F,0x753D,0xA002,0x753C,0x7539,0xA008,0xA004, 0xA002,0x7536,0x7534,0xA002,0x752E,0x752A,0xA004,0xA002,0x7527,0x7526,0xA002,0x7524,0x7523,0xA020,0xA010,0xA008, 0xA004,0xA002,0x7522,0x7521,0xA002,0x7520,0x751E,0xA004,0xA002,0x751D,0x751B,0xA002,0x7517,0x7516,0xA008,0xA004, 0xA002,0x7515,0x7514,0xA002,0x7512,0x7510,0xA004,0xA002,0x750E,0x750C,0xA002,0x750B,0x750A,0xA010,0xA008,0xA004, 0xA002,0x7509,0x7508,0xA002,0x7507,0x7506,0xA004,0xA002,0x7505,0x7503,0xA002,0x7502,0x7501,0xA008,0xA004,0xA002, 0x7500,0x74FE,0xA002,0x74FD,0x74FC,0xA004,0xA002,0x74FB,0x74FA,0xA002,0x74F9,0x74F8,0xA000,0xA000,0xA000,0xA000, 0xA000,0xA002,0x74F5,0x74F3,0xA03F,0xA001,0xA001,0xA01D,0xA00D,0xA005,0xA001,0xA002,0x74F2,0x74F1,0xA004,0xA002, 0x74F0,0x74ED,0xA002,0x74EC,0x74EB,0xA008,0xA004,0xA002,0x74EA,0x74E9,0xA002,0x74E8,0x74E7,0xA004,0xA002,0x74E5, 0x74E1,0xA002,0x74DF,0x74DD,0xA010,0xA008,0xA004,0xA002,0x74DB,0x74DA,0xA002,0x74D9,0x74D8,0xA004,0xA002,0x74D7, 0x74D6,0xA002,0x74D5,0x74D4,0xA008,0xA004,0xA002,0x74D3,0x74D1,0xA002,0x74D0,0x74CF,0xA004,0xA002,0x74CE,0x74CD, 0xA002,0x74CC,0x74CB,0xA07D,0xA03D,0xA01D,0xA00D,0xA006,0xA002,0x74CA,0xA002,0x74C9,0x74C8,0xA003,0xA001,0x74C7, 0xA002,0x74C6,0x74C5,0xA008,0xA004,0xA002,0x74C4,0x74C3,0xA002,0x74C2,0x74C1,0xA004,0xA002,0x74C0,0x74BF,0xA002, 0x74BE,0x74BD,0xA010,0xA008,0xA004,0xA002,0x74BC,0x74BB,0xA002,0x74B9,0x74B8,0xA004,0xA002,0x74B7,0x74B6,0xA002, 0x74B5,0x74B4,0xA008,0xA004,0xA002,0x74B3,0x74B2,0xA002,0x74B1,0x74B0,0xA004,0xA002,0x74AF,0x74AE,0xA002,0x74AD, 0x74AC,0xA020,0xA010,0xA008,0xA004,0xA002,0x74AB,0x74AA,0xA002,0x74A6,0x74A5,0xA004,0xA002,0x74A4,0x74A3,0xA002, 0x74A2,0x74A1,0xA008,0xA004,0xA002,0x74A0,0x749F,0xA002,0x749D,0x749B,0xA004,0xA002,0x749A,0x7499,0xA002,0x7498, 0x7497,0xA010,0xA008,0xA004,0xA002,0x7496,0x7495,0xA002,0x7494,0x7493,0xA004,0xA002,0x7492,0x7491,0xA002,0x748F, 0x748D,0xA008,0xA004,0xA002,0x748C,0x748A,0xA002,0x7489,0x7488,0xA004,0xA002,0x7486,0x7485,0xA002,0x7484,0x7482, 0xA000,0xA000,0xA000,0xA000,0xA004,0xA002,0x747F,0x747D,0xA002,0x747C,0x747B,0xA0C8,0xA03B,0xA001,0xA001,0xA019, 0xA009,0xA001,0xA004,0xA002,0x747A,0x7479,0xA002,0x7478,0x7475,0xA008,0xA004,0xA002,0x7474,0x7473,0xA002,0x7472, 0x7471,0xA004,0xA002,0x746F,0x746E,0xA002,0x746C,0x746B,0xA010,0xA008,0xA004,0xA002,0x746A,0x7469,0xA002,0x7468, 0x7467,0xA004,0xA002,0x7466,0x7465,0xA002,0x7464,0x7463,0xA008,0xA004,0xA002,0x7462,0x7461,0xA002,0x7460,0x745D, 0xA004,0xA002,0x7458,0x7456,0xA002,0x7454,0x7453,0xA07D,0xA03D,0xA01D,0xA00D,0xA006,0xA002,0x7452,0xA002,0x7451, 0x7450,0xA004,0xA002,0x744F,0x744E,0xA001,0x744D,0xA008,0xA004,0xA002,0x744C,0x744B,0xA002,0x744A,0x7449,0xA004, 0xA002,0x7448,0x7447,0xA002,0x7446,0x7445,0xA010,0xA008,0xA004,0xA002,0x7444,0x7443,0xA002,0x7442,0x7440,0xA004, 0xA002,0x743F,0x743E,0xA002,0x743D,0x743B,0xA008,0xA004,0xA002,0x743A,0x7439,0xA002,0x7438,0x7437,0xA004,0xA002, 0x7432,0x7431,0xA002,0x742F,0x742D,0xA020,0xA010,0xA008,0xA004,0xA002,0x742B,0x7429,0xA002,0x7427,0x7424,0xA004, 0xA002,0x7423,0x7421,0xA002,0x7420,0x741F,0xA008,0xA004,0xA002,0x741E,0x741D,0xA002,0x741C,0x7419,0xA004,0xA002, 0x7418,0x7417,0xA002,0x7416,0x7415,0xA010,0xA008,0xA004,0xA002,0x7414,0x7413,0xA002,0x7412,0x7411,0xA004,0xA002, 0x740E,0x740D,0xA002,0x740C,0x740B,0xA008,0xA004,0xA002,0x7408,0x7407,0xA002,0x7404,0x7402,0xA004,0xA002,0x7401, 0x7400,0xA002,0x73FF,0x73FE,0xA000,0xA000,0xA000,0xA008,0xA004,0xA002,0x73FD,0x73FC,0xA002,0x73FB,0x73FA,0xA000, 0xA002,0x73F9,0x73F8,0xA038,0xA001,0xA001,0xA016,0xA006,0xA001,0xA001,0xA002,0x73F7,0x73F6,0xA008,0xA004,0xA002, 0x73F5,0x73F4,0xA002,0x73F3,0x73F1,0xA004,0xA002,0x73F0,0x73EF,0xA002,0x73EE,0x73EC,0xA010,0xA008,0xA004,0xA002, 0x73EB,0x73EA,0xA002,0x73E8,0x73E6,0xA004,0xA002,0x73E4,0x73E3,0xA002,0x73E2,0x73E1,0xA008,0xA004,0xA002,0x73DF, 0x73DD,0xA002,0x73DC,0x73DB,0xA004,0xA002,0x73DA,0x73D8,0xA002,0x73D7,0x73D6,0xA07D,0xA03D,0xA01D,0xA00E,0xA006, 0xA002,0x73D5,0xA002,0x73D4,0x73D3,0xA004,0xA002,0x73D2,0x73CE,0xA002,0x73CC,0x73CB,0xA007,0xA003,0xA001,0x73C7, 0xA002,0x73C6,0x73C5,0xA004,0xA002,0x73C4,0x73C3,0xA002,0x73C1,0x73BF,0xA010,0xA008,0xA004,0xA002,0x73BE,0x73BD, 0xA002,0x73BC,0x73B9,0xA004,0xA002,0x73B8,0x73B6,0xA002,0x73B5,0x73B4,0xA008,0xA004,0xA002,0x73B1,0x73AD,0xA002, 0x73AC,0x73AA,0xA004,0xA002,0x73A8,0x73A7,0xA002,0x73A6,0x73A5,0xA020,0xA010,0xA008,0xA004,0xA002,0x73A4,0x73A3, 0xA002,0x73A1,0x73A0,0xA004,0xA002,0x739E,0x739D,0xA002,0x739C,0x739A,0xA008,0xA004,0xA002,0x7399,0x7398,0xA002, 0x7397,0x7395,0xA004,0xA002,0x7394,0x7393,0xA002,0x7392,0x7390,0xA010,0xA008,0xA004,0xA002,0x738F,0x738D,0xA002, 0x738C,0x738A,0xA004,0xA002,0x7388,0x7386,0xA002,0x7385,0x7383,0xA008,0xA004,0xA002,0x7382,0x7381,0xA002,0x7380, 0x737F,0xA004,0xA002,0x737D,0x737C,0xA002,0x737B,0x737A,0xA000,0xA000,0xA000,0xA008,0xA004,0xA002,0x7379,0x7378, 0xA002,0x7377,0x7376,0xA004,0xA002,0x7375,0x7374,0xA002,0x7373,0x7372,0xA1FB,0xA0C9,0xA032,0xA001,0xA001,0xA010, 0xA001,0xA007,0xA003,0xA001,0x7371,0xA002,0x7370,0x736E,0xA004,0xA002,0x736B,0x736A,0xA002,0x7369,0x7368,0xA010, 0xA008,0xA004,0xA002,0x7367,0x7366,0xA002,0x7365,0x7364,0xA004,0xA002,0x7363,0x7362,0xA002,0x7361,0x735F,0xA008, 0xA004,0xA002,0x735E,0x735D,0xA002,0x735C,0x735B,0xA004,0xA002,0x735A,0x7359,0xA002,0x7358,0x7356,0xA07D,0xA03D, 0xA01D,0xA00E,0xA006,0xA002,0x7355,0xA002,0x7354,0x7353,0xA004,0xA002,0x7351,0x734F,0xA002,0x734E,0x734C,0xA007, 0xA004,0xA002,0x734B,0x734A,0xA000,0x7349,0xA004,0xA002,0x7348,0x7347,0xA002,0x7346,0x7345,0xA010,0xA008,0xA004, 0xA002,0x7344,0x7343,0xA002,0x7342,0x7341,0xA004,0xA002,0x7340,0x733D,0xA002,0x733C,0x733B,0xA008,0xA004,0xA002, 0x733A,0x7336,0xA002,0x7335,0x7333,0xA004,0xA002,0x7332,0x7330,0xA002,0x732F,0x732D,0xA020,0xA010,0xA008,0xA004, 0xA002,0x7328,0x7327,0xA002,0x7326,0x7324,0xA004,0xA002,0x7323,0x7320,0xA002,0x731F,0x731A,0xA008,0xA004,0xA002, 0x7319,0x7318,0xA002,0x7314,0x7312,0xA004,0xA002,0x7311,0x7310,0xA002,0x730F,0x730D,0xA010,0xA008,0xA004,0xA002, 0x730C,0x730B,0xA002,0x7309,0x7308,0xA004,0xA002,0x7307,0x7306,0xA002,0x7305,0x7304,0xA008,0xA004,0xA002,0x7302, 0x7300,0xA002,0x72FF,0x72FE,0xA004,0xA002,0x72FD,0x72F9,0xA002,0x72F6,0x72F5,0xA000,0xA000,0xA010,0xA008,0xA004, 0xA002,0x72EB,0x72EA,0xA002,0x72E7,0x72E6,0xA004,0xA002,0x72E5,0x72E4,0xA002,0x72E3,0x72E2,0xA000,0xA004,0xA002, 0x72DF,0x72DD,0xA000,0x72DC,0xA0A2,0xA04B,0xA00B,0xA001,0xA001,0xA001,0xA004,0xA002,0x254B,0x254A,0xA002,0x2549, 0x2548,0xA020,0xA010,0xA008,0xA004,0xA002,0x2547,0x2546,0xA002,0x2545,0x2544,0xA004,0xA002,0x2543,0x2542,0xA002, 0x2541,0x2540,0xA008,0xA004,0xA002,0x253F,0x253E,0xA002,0x253D,0x253C,0xA004,0xA002,0x253B,0x253A,0xA002,0x2539, 0x2538,0xA010,0xA008,0xA004,0xA002,0x2537,0x2536,0xA002,0x2535,0x2534,0xA004,0xA002,0x2533,0x2532,0xA002,0x2531, 0x2530,0xA008,0xA004,0xA002,0x252F,0x252E,0xA002,0x252D,0x252C,0xA004,0xA002,0x252B,0x252A,0xA002,0x2529,0x2528, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x2527,0x2526,0xA002,0x2525,0x2524,0xA004,0xA002,0x2523,0x2522,0xA002, 0x2521,0x2520,0xA008,0xA004,0xA002,0x251F,0x251E,0xA002,0x251D,0x251C,0xA004,0xA002,0x251B,0x251A,0xA002,0x2519, 0x2518,0xA010,0xA008,0xA004,0xA002,0x2517,0x2516,0xA002,0x2515,0x2514,0xA004,0xA002,0x2513,0x2512,0xA002,0x2511, 0x2510,0xA008,0xA004,0xA002,0x250F,0x250E,0xA002,0x250D,0x250C,0xA004,0xA002,0x250B,0x250A,0xA002,0x2509,0x2508, 0xA011,0xA000,0xA008,0xA004,0xA002,0x2507,0x2506,0xA002,0x2505,0x2504,0xA004,0xA002,0x2503,0x2502,0xA002,0x2501, 0x2500,0xA000,0xA001,0xA000,0xA001,0x3007,0xA072,0xA038,0xA018,0xA009,0xA001,0xA004,0xA002,0xFE6B,0xFE6A,0xA002, 0xFE69,0xFE68,0xA008,0xA004,0xA002,0xFE66,0xFE65,0xA002,0xFE64,0xFE63,0xA003,0xA000,0xFE62,0xA002,0xFE61,0xFE60, 0xA010,0xA008,0xA004,0xA002,0xFE5F,0xFE5E,0xA002,0xFE5D,0xFE5C,0xA004,0xA002,0xFE5B,0xFE5A,0xA002,0xFE59,0xFE57, 0xA008,0xA004,0xA002,0xFE56,0xFE55,0xA002,0xFE54,0xFE52,0xA004,0xA002,0xFE51,0xFE50,0xA002,0xFE4F,0xFE4E,0xA01C, 0xA010,0xA008,0xA004,0xA002,0xFE4D,0xFE4C,0xA002,0xFE4B,0xFE4A,0xA004,0xA002,0xFE49,0x309E,0xA002,0x309D,0x3006, 0xA008,0xA004,0xA002,0x30FE,0x30FD,0xA002,0x309C,0x309B,0xA000,0xA000,0x30FC,0xA00E,0xA007,0xA003,0xA000,0x2010, 0xA002,0x3231,0x2121,0xA003,0xA001,0xFFE4,0xA002,0xFFE2,0xFE30,0xA008,0xA004,0xA002,0x33D5,0x33D2,0xA002,0x33D1, 0x33CE,0xA004,0xA002,0x33C4,0x33A1,0xA002,0x339E,0x339D,0xA000,0xA000,0xA010,0xA008,0xA004,0xA002,0x339C,0x338F, 0xA002,0x338E,0x32A3,0xA004,0xA002,0x3029,0x3028,0xA002,0x3027,0x3026,0xA008,0xA004,0xA002,0x3025,0x3024,0xA002, 0x3023,0x3022,0xA000,0xA000,0x3021,0xA13E,0xA0A0,0xA03A,0xA001,0xA019,0xA009,0xA001,0xA004,0xA002,0x3129,0x3128, 0xA002,0x3127,0x3126,0xA008,0xA004,0xA002,0x3125,0x3124,0xA002,0x3123,0x3122,0xA004,0xA002,0x3121,0x3120,0xA002, 0x311F,0x311E,0xA010,0xA008,0xA004,0xA002,0x311D,0x311C,0xA002,0x311B,0x311A,0xA004,0xA002,0x3119,0x3118,0xA002, 0x3117,0x3116,0xA008,0xA004,0xA002,0x3115,0x3114,0xA002,0x3113,0x3112,0xA004,0xA002,0x3111,0x3110,0xA002,0x310F, 0x310E,0xA039,0xA01A,0xA010,0xA008,0xA004,0xA002,0x310D,0x310C,0xA002,0x310B,0x310A,0xA004,0xA002,0x3109,0x3108, 0xA002,0x3107,0x3106,0xA004,0xA000,0xA000,0x3105,0xA003,0xA001,0x0261,0xA001,0x0148,0xA00F,0xA007,0xA003,0xA000, 0x0144,0xA002,0x0251,0x00EA,0xA004,0xA002,0x00FC,0x01DC,0xA002,0x01DA,0x01D8,0xA008,0xA004,0xA002,0x01D6,0x00F9, 0xA002,0x01D4,0x00FA,0xA004,0xA002,0x016B,0x00F2,0xA002,0x01D2,0x00F3,0xA01C,0xA010,0xA008,0xA004,0xA002,0x014D, 0x00EC,0xA002,0x01D0,0x00ED,0xA004,0xA002,0x012B,0x00E8,0xA002,0x011B,0x00E9,0xA008,0xA004,0xA002,0x0113,0x00E0, 0xA002,0x01CE,0x00E1,0xA000,0xA000,0x0101,0xA001,0xA008,0xA004,0xA002,0x301E,0x301D,0xA002,0x3012,0x2295,0xA004, 0xA002,0x2609,0x25E5,0xA002,0x25E4,0x25E3,0xA07D,0xA03D,0xA01D,0xA00E,0xA006,0xA002,0x25E2,0xA002,0x25BD,0x25BC, 0xA004,0xA002,0x2595,0x2594,0xA002,0x2593,0x258F,0xA008,0xA004,0xA002,0x258E,0x258D,0xA002,0x258C,0x258B,0xA004, 0xA002,0x258A,0x2589,0xA000,0x2588,0xA010,0xA008,0xA004,0xA002,0x2587,0x2586,0xA002,0x2585,0x2584,0xA004,0xA002, 0x2583,0x2582,0xA002,0x2581,0x2573,0xA008,0xA004,0xA002,0x2572,0x2571,0xA002,0x2570,0x256F,0xA004,0xA002,0x256E, 0x256D,0xA002,0x256C,0x256B,0xA020,0xA010,0xA008,0xA004,0xA002,0x256A,0x2569,0xA002,0x2568,0x2567,0xA004,0xA002, 0x2566,0x2565,0xA002,0x2564,0x2563,0xA008,0xA004,0xA002,0x2562,0x2561,0xA002,0x2560,0x255F,0xA004,0xA002,0x255E, 0x255D,0xA002,0x255C,0x255B,0xA010,0xA008,0xA004,0xA002,0x255A,0x2559,0xA002,0x2558,0x2557,0xA004,0xA002,0x2556, 0x2555,0xA002,0x2554,0x2553,0xA008,0xA004,0xA002,0x2552,0x2551,0xA002,0x2550,0x22BF,0xA004,0xA002,0x2267,0x2266, 0xA002,0x2252,0x2223,0xA000,0xA000,0xA010,0xA008,0xA004,0xA002,0x221F,0x2215,0xA002,0x2199,0x2198,0xA004,0xA002, 0x2197,0x2196,0xA002,0x2109,0x2105,0xA008,0xA004,0xA002,0x2035,0x2025,0xA002,0x2015,0x2013,0xA004,0xA002,0x02D9, 0x02CB,0xA000,0x02CA,0xA000,0xA047,0xA008,0xA001,0xA001,0xA001,0xA001,0xA002,0x044F,0x044E,0xA020,0xA010,0xA008, 0xA004,0xA002,0x044D,0x044C,0xA002,0x044B,0x044A,0xA004,0xA002,0x0449,0x0448,0xA002,0x0447,0x0446,0xA008,0xA004, 0xA002,0x0445,0x0444,0xA002,0x0443,0x0442,0xA004,0xA002,0x0441,0x0440,0xA002,0x043F,0x043E,0xA010,0xA008,0xA004, 0xA002,0x043D,0x043C,0xA002,0x043B,0x043A,0xA004,0xA002,0x0439,0x0438,0xA002,0x0437,0x0436,0xA008,0xA004,0xA002, 0x0451,0x0435,0xA002,0x0434,0x0433,0xA004,0xA002,0x0432,0x0431,0xA000,0x0430,0xA027,0xA007,0xA001,0xA001,0xA001, 0xA002,0x042F,0x042E,0xA010,0xA008,0xA004,0xA002,0x042D,0x042C,0xA002,0x042B,0x042A,0xA004,0xA002,0x0429,0x0428, 0xA002,0x0427,0x0426,0xA008,0xA004,0xA002,0x0425,0x0424,0xA002,0x0423,0x0422,0xA004,0xA002,0x0421,0x0420,0xA002, 0x041F,0x041E,0xA000,0xA010,0xA008,0xA004,0xA002,0x041D,0x041C,0xA002,0x041B,0x041A,0xA004,0xA002,0x0419,0x0418, 0xA002,0x0417,0x0416,0xA008,0xA004,0xA002,0x0401,0x0415,0xA002,0x0414,0x0413,0xA004,0xA002,0x0412,0x0411,0xA000, 0x0410,0xA2B5,0xA148,0xA095,0xA000,0xA03C,0xA00A,0xA001,0xA001,0xA001,0xA004,0xA002,0xFE34,0xFE33,0xA001,0xFE31, 0xA01D,0xA00D,0xA008,0xA004,0xA002,0xFE38,0xFE37,0xA002,0xFE3C,0xFE3B,0xA001,0xA002,0xFE44,0xFE43,0xA008,0xA004, 0xA002,0xFE42,0xFE41,0xA002,0xFE3E,0xFE3D,0xA004,0xA002,0xFE40,0xFE3F,0xA002,0xFE3A,0xFE39,0xA006,0xA000,0xA000, 0xA002,0xFE36,0xFE35,0xA007,0xA003,0xA001,0x03C9,0xA002,0x03C8,0x03C7,0xA004,0xA002,0x03C6,0x03C5,0xA002,0x03C4, 0x03C3,0xA031,0xA01E,0xA00E,0xA006,0xA002,0x03C1,0xA002,0x03C0,0x03BF,0xA004,0xA002,0x03BE,0x03BD,0xA002,0x03BC, 0x03BB,0xA008,0xA004,0xA002,0x03BA,0x03B9,0xA002,0x03B8,0x03B7,0xA004,0xA002,0x03B6,0x03B5,0xA002,0x03B4,0x03B3, 0xA006,0xA000,0xA000,0xA002,0x03B2,0x03B1,0xA005,0xA001,0xA002,0x03A9,0x03A8,0xA004,0xA002,0x03A7,0x03A6,0xA002, 0x03A5,0x03A4,0xA020,0xA010,0xA008,0xA004,0xA002,0x03A3,0x03A1,0xA002,0x03A0,0x039F,0xA004,0xA002,0x039E,0x039D, 0xA002,0x039C,0x039B,0xA008,0xA004,0xA002,0x039A,0x0399,0xA002,0x0398,0x0397,0xA004,0xA002,0x0396,0x0395,0xA002, 0x0394,0x0393,0xA000,0xA000,0xA000,0xA002,0x0392,0x0391,0xA000,0xA048,0xA008,0xA001,0xA001,0xA001,0xA001,0xA002, 0x30F6,0x30F5,0xA020,0xA010,0xA008,0xA004,0xA002,0x30F4,0x30F3,0xA002,0x30F2,0x30F1,0xA004,0xA002,0x30F0,0x30EF, 0xA002,0x30EE,0x30ED,0xA008,0xA004,0xA002,0x30EC,0x30EB,0xA002,0x30EA,0x30E9,0xA004,0xA002,0x30E8,0x30E7,0xA002, 0x30E6,0x30E5,0xA010,0xA008,0xA004,0xA002,0x30E4,0x30E3,0xA002,0x30E2,0x30E1,0xA004,0xA002,0x30E0,0x30DF,0xA002, 0x30DE,0x30DD,0xA008,0xA004,0xA002,0x30DC,0x30DB,0xA002,0x30DA,0x30D9,0xA004,0xA002,0x30D8,0x30D7,0xA002,0x30D6, 0x30D5,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x30D4,0x30D3,0xA002,0x30D2,0x30D1,0xA004,0xA002,0x30D0,0x30CF, 0xA002,0x30CE,0x30CD,0xA008,0xA004,0xA002,0x30CC,0x30CB,0xA002,0x30CA,0x30C9,0xA004,0xA002,0x30C8,0x30C7,0xA002, 0x30C6,0x30C5,0xA010,0xA008,0xA004,0xA002,0x30C4,0x30C3,0xA002,0x30C2,0x30C1,0xA004,0xA002,0x30C0,0x30BF,0xA002, 0x30BE,0x30BD,0xA008,0xA004,0xA002,0x30BC,0x30BB,0xA002,0x30BA,0x30B9,0xA004,0xA002,0x30B8,0x30B7,0xA002,0x30B6, 0x30B5,0xA020,0xA010,0xA008,0xA004,0xA002,0x30B4,0x30B3,0xA002,0x30B2,0x30B1,0xA004,0xA002,0x30B0,0x30AF,0xA002, 0x30AE,0x30AD,0xA008,0xA004,0xA002,0x30AC,0x30AB,0xA002,0x30AA,0x30A9,0xA004,0xA002,0x30A8,0x30A7,0xA002,0x30A6, 0x30A5,0xA000,0xA000,0xA004,0xA002,0x30A4,0x30A3,0xA002,0x30A2,0x30A1,0xA0AC,0xA000,0xA03D,0xA001,0xA01C,0xA00C, 0xA004,0xA001,0xA001,0x3093,0xA004,0xA002,0x3092,0x3091,0xA002,0x3090,0x308F,0xA008,0xA004,0xA002,0x308E,0x308D, 0xA002,0x308C,0x308B,0xA004,0xA002,0x308A,0x3089,0xA002,0x3088,0x3087,0xA010,0xA008,0xA004,0xA002,0x3086,0x3085, 0xA002,0x3084,0x3083,0xA004,0xA002,0x3082,0x3081,0xA002,0x3080,0x307F,0xA008,0xA004,0xA002,0x307E,0x307D,0xA002, 0x307C,0x307B,0xA004,0xA002,0x307A,0x3079,0xA002,0x3078,0x3077,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x3076, 0x3075,0xA002,0x3074,0x3073,0xA004,0xA002,0x3072,0x3071,0xA002,0x3070,0x306F,0xA008,0xA004,0xA002,0x306E,0x306D, 0xA002,0x306C,0x306B,0xA004,0xA002,0x306A,0x3069,0xA002,0x3068,0x3067,0xA010,0xA008,0xA004,0xA002,0x3066,0x3065, 0xA002,0x3064,0x3063,0xA004,0xA002,0x3062,0x3061,0xA002,0x3060,0x305F,0xA008,0xA004,0xA002,0x305E,0x305D,0xA002, 0x305C,0x305B,0xA004,0xA002,0x305A,0x3059,0xA002,0x3058,0x3057,0xA020,0xA010,0xA008,0xA004,0xA002,0x3056,0x3055, 0xA002,0x3054,0x3053,0xA004,0xA002,0x3052,0x3051,0xA002,0x3050,0x304F,0xA008,0xA004,0xA002,0x304E,0x304D,0xA002, 0x304C,0x304B,0xA004,0xA002,0x304A,0x3049,0xA002,0x3048,0x3047,0xA000,0xA008,0xA004,0xA002,0x3046,0x3045,0xA002, 0x3044,0x3043,0xA000,0xA002,0x3042,0x3041,0xA000,0xA04F,0xA00F,0xA001,0xA001,0xA005,0xA001,0xA002,0xFFE3,0xFF5D, 0xA004,0xA002,0xFF5C,0xFF5B,0xA002,0xFF5A,0xFF59,0xA020,0xA010,0xA008,0xA004,0xA002,0xFF58,0xFF57,0xA002,0xFF56, 0xFF55,0xA004,0xA002,0xFF54,0xFF53,0xA002,0xFF52,0xFF51,0xA008,0xA004,0xA002,0xFF50,0xFF4F,0xA002,0xFF4E,0xFF4D, 0xA004,0xA002,0xFF4C,0xFF4B,0xA002,0xFF4A,0xFF49,0xA010,0xA008,0xA004,0xA002,0xFF48,0xFF47,0xA002,0xFF46,0xFF45, 0xA004,0xA002,0xFF44,0xFF43,0xA002,0xFF42,0xFF41,0xA008,0xA004,0xA002,0xFF40,0xFF3F,0xA002,0xFF3E,0xFF3D,0xA004, 0xA002,0xFF3C,0xFF3B,0xA002,0xFF3A,0xFF39,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0xFF38,0xFF37,0xA002,0xFF36, 0xFF35,0xA004,0xA002,0xFF34,0xFF33,0xA002,0xFF32,0xFF31,0xA008,0xA004,0xA002,0xFF30,0xFF2F,0xA002,0xFF2E,0xFF2D, 0xA004,0xA002,0xFF2C,0xFF2B,0xA002,0xFF2A,0xFF29,0xA010,0xA008,0xA004,0xA002,0xFF28,0xFF27,0xA002,0xFF26,0xFF25, 0xA004,0xA002,0xFF24,0xFF23,0xA002,0xFF22,0xFF21,0xA008,0xA004,0xA002,0xFF20,0xFF1F,0xA002,0xFF1E,0xFF1D,0xA004, 0xA002,0xFF1C,0xFF1B,0xA002,0xFF1A,0xFF19,0xA020,0xA010,0xA008,0xA004,0xA002,0xFF18,0xFF17,0xA002,0xFF16,0xFF15, 0xA004,0xA002,0xFF14,0xFF13,0xA002,0xFF12,0xFF11,0xA008,0xA004,0xA002,0xFF10,0xFF0F,0xA002,0xFF0E,0xFF0D,0xA004, 0xA002,0xFF0C,0xFF0B,0xA002,0xFF0A,0xFF09,0xA000,0xA008,0xA004,0xA002,0xFF08,0xFF07,0xA002,0xFF06,0xFF05,0xA004, 0xA002,0xFFE5,0xFF03,0xA002,0xFF02,0xFF01,0xA171,0xA0AF,0xA000,0xA042,0xA008,0xA001,0xA001,0xA001,0xA001,0xA002, 0x216B,0x216A,0xA01D,0xA010,0xA008,0xA004,0xA002,0x2169,0x2168,0xA002,0x2167,0x2166,0xA004,0xA002,0x2165,0x2164, 0xA002,0x2163,0x2162,0xA005,0xA000,0xA002,0x2161,0x2160,0xA004,0xA002,0x3229,0x3228,0xA002,0x3227,0x3226,0xA00D, 0xA008,0xA004,0xA002,0x3225,0x3224,0xA002,0x3223,0x3222,0xA000,0xA002,0x3221,0x3220,0xA008,0xA004,0xA002,0x2469, 0x2468,0xA002,0x2467,0x2466,0xA004,0xA002,0x2465,0x2464,0xA002,0x2463,0x2462,0xA040,0xA020,0xA010,0xA008,0xA004, 0xA002,0x2461,0x2460,0xA002,0x2487,0x2486,0xA004,0xA002,0x2485,0x2484,0xA002,0x2483,0x2482,0xA008,0xA004,0xA002, 0x2481,0x2480,0xA002,0x247F,0x247E,0xA004,0xA002,0x247D,0x247C,0xA002,0x247B,0x247A,0xA010,0xA008,0xA004,0xA002, 0x2479,0x2478,0xA002,0x2477,0x2476,0xA004,0xA002,0x2475,0x2474,0xA002,0x249B,0x249A,0xA008,0xA004,0xA002,0x2499, 0x2498,0xA002,0x2497,0x2496,0xA004,0xA002,0x2495,0x2494,0xA002,0x2493,0x2492,0xA016,0xA010,0xA008,0xA004,0xA002, 0x2491,0x2490,0xA002,0x248F,0x248E,0xA004,0xA002,0x248D,0x248C,0xA002,0x248B,0x248A,0xA000,0xA000,0xA002,0x2489, 0x2488,0xA010,0xA008,0xA004,0xA002,0x2179,0x2178,0xA002,0x2177,0x2176,0xA004,0xA002,0x2175,0x2174,0xA002,0x2173, 0x2172,0xA000,0xA000,0xA002,0x2171,0x2170,0xA000,0xA048,0xA008,0xA001,0xA001,0xA001,0xA001,0xA002,0x3013,0x2193, 0xA020,0xA010,0xA008,0xA004,0xA002,0x2191,0x2190,0xA002,0x2192,0x203B,0xA004,0xA002,0x25B2,0x25B3,0xA002,0x25A0, 0x25A1,0xA008,0xA004,0xA002,0x25C6,0x25C7,0xA002,0x25CE,0x25CF,0xA004,0xA002,0x25CB,0x2605,0xA002,0x2606,0x2116, 0xA010,0xA008,0xA004,0xA002,0x00A7,0x2030,0xA002,0xFFE1,0xFFE0,0xA004,0xA002,0x00A4,0xFF04,0xA002,0x2103,0x2033, 0xA008,0xA004,0xA002,0x2032,0x00B0,0xA002,0x2640,0x2642,0xA004,0xA002,0x2234,0x2235,0xA002,0x221E,0x2265,0xA040, 0xA020,0xA010,0xA008,0xA004,0xA002,0x2264,0x226F,0xA002,0x226E,0x2260,0xA004,0xA002,0x221D,0x223D,0xA002,0x2248, 0x224C,0xA008,0xA004,0xA002,0x2261,0x222E,0xA002,0x222B,0x2299,0xA004,0xA002,0x2312,0x2220,0xA002,0x2225,0x22A5, 0xA010,0xA008,0xA004,0xA002,0x221A,0x2237,0xA002,0x2208,0x2229,0xA004,0xA002,0x222A,0x220F,0xA002,0x2211,0x2228, 0xA008,0xA004,0xA002,0x2227,0x2236,0xA002,0x00F7,0x00D7,0xA004,0xA002,0x00B1,0x3011,0xA002,0x3010,0x3017,0xA020, 0xA010,0xA008,0xA004,0xA002,0x3016,0x300F,0xA002,0x300E,0x300D,0xA004,0xA002,0x300C,0x300B,0xA002,0x300A,0x3009, 0xA008,0xA004,0xA002,0x3008,0x3015,0xA002,0x3014,0x201D,0xA004,0xA002,0x201C,0x2019,0xA002,0x2018,0x2026,0xA010, 0xA008,0xA004,0xA002,0x2016,0xFF5E,0xA002,0x2014,0x3005,0xA004,0xA002,0x3003,0x00A8,0xA002,0x02C7,0x02C9,0xA000, 0xA004,0xA002,0x00B7,0x3002,0xA002,0x3001,0x3000,0xA17F,0xA0C1,0xA041,0xA001,0xA020,0xA010,0xA008,0xA004,0xA002, 0x72DB,0x72DA,0xA002,0x72D8,0x72D6,0xA004,0xA002,0x72D5,0x72D4,0xA002,0x72D3,0x72D1,0xA008,0xA004,0xA002,0x72CF, 0x72CC,0xA002,0x72CB,0x72CA,0xA004,0xA002,0x72C9,0x72C7,0xA002,0x72C6,0x72C5,0xA010,0xA008,0xA004,0xA002,0x72C0, 0x72BF,0xA002,0x72BE,0x72BD,0xA004,0xA002,0x72BC,0x72BB,0xA002,0x72BA,0x72B5,0xA008,0xA004,0xA002,0x72B3,0x72B2, 0xA002,0x72B1,0x72AE,0xA004,0xA002,0x72AB,0x72AA,0xA002,0x72A9,0x72A8,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x72A7,0x72A6,0xA002,0x72A5,0x72A4,0xA004,0xA002,0x72A3,0x72A2,0xA002,0x72A1,0x72A0,0xA008,0xA004,0xA002,0x729E, 0x729D,0xA002,0x729C,0x729B,0xA004,0xA002,0x729A,0x7299,0xA002,0x7298,0x7297,0xA010,0xA008,0xA004,0xA002,0x7296, 0x7295,0xA002,0x7294,0x7293,0xA004,0xA002,0x7291,0x7290,0xA002,0x728E,0x728C,0xA008,0xA004,0xA002,0x7289,0x7288, 0xA002,0x7287,0x7286,0xA004,0xA002,0x7285,0x7283,0xA002,0x7282,0x727D,0xA020,0xA010,0xA008,0xA004,0xA002,0x727C, 0x727B,0xA002,0x7278,0x7277,0xA004,0xA002,0x7276,0x7274,0xA002,0x7273,0x7271,0xA008,0xA004,0xA002,0x7270,0x726D, 0xA002,0x726C,0x726B,0xA004,0xA002,0x726A,0x7268,0xA002,0x7265,0x7264,0xA010,0xA008,0xA004,0xA002,0x7263,0x7260, 0xA002,0x725E,0x725C,0xA004,0xA002,0x725A,0x7258,0xA002,0x7257,0x7255,0xA008,0xA004,0xA002,0x7254,0x7253,0xA002, 0x7251,0x7250,0xA004,0xA002,0x724F,0x724E,0xA002,0x724B,0x724A,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7249, 0xA002,0x7246,0x7245,0xA004,0xA002,0x7244,0x7243,0xA002,0x7242,0x7241,0xA008,0xA004,0xA002,0x7240,0x723E,0xA002, 0x723C,0x723A,0xA004,0xA002,0x7234,0x7233,0xA002,0x7232,0x722F,0xA010,0xA008,0xA004,0xA002,0x722E,0x722D,0xA002, 0x722B,0x7229,0xA004,0xA002,0x7227,0x7226,0xA002,0x7225,0x7224,0xA008,0xA004,0xA002,0x7223,0x7222,0xA002,0x7221, 0x7220,0xA004,0xA002,0x721F,0x721E,0xA002,0x721C,0x721B,0xA01F,0xA00F,0xA007,0xA003,0xA001,0x721A,0xA002,0x7219, 0x7218,0xA004,0xA002,0x7217,0x7216,0xA002,0x7215,0x7214,0xA008,0xA004,0xA002,0x7213,0x7212,0xA002,0x7211,0x7210, 0xA004,0xA002,0x720F,0x720E,0xA002,0x720D,0x720C,0xA010,0xA008,0xA004,0xA002,0x720B,0x720A,0xA002,0x7209,0x7208, 0xA004,0xA002,0x7207,0x7205,0xA002,0x7204,0x7203,0xA008,0xA004,0xA002,0x7202,0x7201,0xA002,0x7200,0x71FF,0xA004, 0xA002,0x71FE,0x71FD,0xA002,0x71FC,0x71FB,0xA000,0xA020,0xA010,0xA008,0xA004,0xA002,0x71FA,0x71F8,0xA002,0x71F7, 0x71F6,0xA004,0xA002,0x71F5,0x71F4,0xA002,0x71F3,0x71F2,0xA008,0xA004,0xA002,0x71F1,0x71F0,0xA002,0x71EF,0x71ED, 0xA004,0xA002,0x71EC,0x71EB,0xA002,0x71EA,0x71E9,0xA010,0xA008,0xA004,0xA002,0x71E8,0x71E6,0xA002,0x71E4,0x71E3, 0xA004,0xA002,0x71E2,0x71E1,0xA002,0x71DF,0x71DE,0xA008,0xA004,0xA002,0x71DD,0x71DC,0xA002,0x71DB,0x71DA,0xA004, 0xA002,0x71D9,0x71D8,0xA002,0x71D7,0x71D6,0xA0BE,0xA03E,0xA001,0xA01D,0xA00D,0xA005,0xA001,0xA002,0x71D3,0x71D2, 0xA004,0xA002,0x71D1,0x71D0,0xA002,0x71CF,0x71CD,0xA008,0xA004,0xA002,0x71CC,0x71CB,0xA002,0x71CA,0x71C9,0xA004, 0xA002,0x71C8,0x71C7,0xA002,0x71C6,0x71C5,0xA010,0xA008,0xA004,0xA002,0x71C4,0x71C2,0xA002,0x71C1,0x71C0,0xA004, 0xA002,0x71BF,0x71BE,0xA002,0x71BD,0x71BC,0xA008,0xA004,0xA002,0x71BB,0x71BA,0xA002,0x71B8,0x71B7,0xA004,0xA002, 0x71B6,0x71B4,0xA002,0x71B2,0x71B1,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x71B0,0x71AF,0xA002,0x71AE,0x71AD, 0xA004,0xA002,0x71AB,0x71AA,0xA002,0x71A9,0x71A7,0xA008,0xA004,0xA002,0x71A6,0x71A5,0xA002,0x71A4,0x71A3,0xA004, 0xA002,0x71A2,0x71A1,0xA002,0x719E,0x719D,0xA010,0xA008,0xA004,0xA002,0x719C,0x719B,0xA002,0x719A,0x7197,0xA004, 0xA002,0x7196,0x7195,0xA002,0x7193,0x7192,0xA008,0xA004,0xA002,0x7191,0x7190,0xA002,0x718E,0x718D,0xA004,0xA002, 0x718C,0x718B,0xA002,0x7189,0x7188,0xA020,0xA010,0xA008,0xA004,0xA002,0x7187,0x7186,0xA002,0x7185,0x7183,0xA004, 0xA002,0x7182,0x7181,0xA002,0x7180,0x717F,0xA008,0xA004,0xA002,0x717E,0x717C,0xA002,0x717B,0x7179,0xA004,0xA002, 0x7177,0x7176,0xA002,0x7175,0x7174,0xA010,0xA008,0xA004,0xA002,0x7171,0x7170,0xA002,0x716F,0x716D,0xA004,0xA002, 0x716C,0x716B,0xA002,0x716A,0x7169,0xA008,0xA004,0xA002,0x7165,0x7163,0xA002,0x7162,0x7161,0xA004,0xA002,0x7160, 0x715F,0xA002,0x715D,0x715B,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x715A,0xA002,0x7159,0x7158,0xA004,0xA002, 0x7157,0x7156,0xA002,0x7155,0x7154,0xA008,0xA004,0xA002,0x7153,0x7152,0xA002,0x7151,0x7150,0xA004,0xA002,0x714F, 0x714D,0xA002,0x714B,0x7149,0xA010,0xA008,0xA004,0xA002,0x7148,0x7147,0xA002,0x7146,0x7144,0xA004,0xA002,0x7143, 0x7142,0xA002,0x7141,0x7140,0xA008,0xA004,0xA002,0x713F,0x713E,0xA002,0x713D,0x713C,0xA004,0xA002,0x713B,0x713A, 0xA002,0x7139,0x7138,0xA01F,0xA00F,0xA007,0xA004,0xA002,0x7137,0x7135,0xA001,0x7134,0xA004,0xA002,0x7133,0x7132, 0xA002,0x712E,0x712D,0xA008,0xA004,0xA002,0x712C,0x712B,0xA002,0x712A,0x7129,0xA004,0xA002,0x7128,0x7127,0xA002, 0x7125,0x7124,0xA010,0xA008,0xA004,0xA002,0x7123,0x7122,0xA002,0x7121,0x7120,0xA004,0xA002,0x711F,0x711E,0xA002, 0x711D,0x711C,0xA008,0xA004,0xA002,0x711B,0x7117,0xA002,0x7114,0x7112,0xA004,0xA002,0x7111,0x710F,0xA002,0x710E, 0x710D,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x710C,0x710B,0xA002,0x7108,0x7107,0xA004,0xA002,0x7106,0x7105, 0xA002,0x7104,0x7103,0xA008,0xA004,0xA002,0x7102,0x7101,0xA002,0x7100,0x70FF,0xA004,0xA002,0x70FE,0x70FC,0xA002, 0x70FB,0x70FA,0xA010,0xA008,0xA004,0xA002,0x70F8,0x70F6,0xA002,0x70F5,0x70F4,0xA004,0xA002,0x70F3,0x70F2,0xA002, 0x70F1,0x70F0,0xA008,0xA004,0xA002,0x70EE,0x70EA,0xA002,0x70E5,0x70E3,0xA004,0xA002,0x70E2,0x70E1,0xA002,0x70E0, 0x70DE,0xA000,0xA000,0xA000,0xA000,0xA002,0x70DD,0x70DC,0xB826,0xAC17,0xA60F,0xA307,0xA183,0xA0B8,0xA03A,0xA001, 0xA019,0xA009,0xA001,0xA004,0xA002,0x70DA,0x70D7,0xA002,0x70D6,0x70D5,0xA008,0xA004,0xA002,0x70D4,0x70D3,0xA002, 0x70D2,0x70D1,0xA004,0xA002,0x70D0,0x70CF,0xA002,0x70CE,0x70CD,0xA010,0xA008,0xA004,0xA002,0x70CC,0x70CB,0xA002, 0x70C9,0x70C7,0xA004,0xA002,0x70C6,0x70C5,0xA002,0x70C4,0x70BF,0xA008,0xA004,0xA002,0x70BE,0x70BA,0xA002,0x70B6, 0x70B5,0xA004,0xA002,0x70B4,0x70B2,0xA002,0x70B0,0x70AA,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x70A9,0xA002,0x70A8, 0x70A7,0xA004,0xA002,0x70A6,0x70A5,0xA002,0x70A4,0x70A3,0xA008,0xA004,0xA002,0x70A2,0x70A1,0xA002,0x70A0,0x709F, 0xA004,0xA002,0x709E,0x709B,0xA002,0x709A,0x7098,0xA010,0xA008,0xA004,0xA002,0x7097,0x7093,0xA002,0x7091,0x7090, 0xA004,0xA002,0x708F,0x708D,0xA002,0x708C,0x708B,0xA008,0xA004,0xA002,0x7088,0x7087,0xA002,0x7086,0x7084,0xA004, 0xA002,0x7083,0x7082,0xA002,0x7081,0x707D,0xA020,0xA010,0xA008,0xA004,0xA002,0x707B,0x707A,0xA002,0x7079,0x7077, 0xA004,0xA002,0x7074,0x7073,0xA002,0x7072,0x7071,0xA008,0xA004,0xA002,0x706E,0x706A,0xA002,0x7069,0x7068,0xA004, 0xA002,0x7067,0x7066,0xA002,0x7065,0x7064,0xA010,0xA008,0xA004,0xA002,0x7063,0x7062,0xA002,0x7061,0x7060,0xA004, 0xA002,0x705F,0x705D,0xA002,0x705C,0x705B,0xA008,0xA004,0xA002,0x705A,0x7059,0xA002,0x7058,0x7057,0xA004,0xA002, 0x7056,0x7055,0xA002,0x7054,0x7053,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x7052,0xA002,0x7051,0x7050,0xA004, 0xA002,0x704E,0x704D,0xA002,0x704B,0x704A,0xA008,0xA004,0xA002,0x7049,0x7048,0xA002,0x7047,0x7046,0xA004,0xA002, 0x7045,0x7044,0xA002,0x7043,0x7042,0xA010,0xA008,0xA004,0xA002,0x7041,0x7040,0xA002,0x703F,0x703E,0xA004,0xA002, 0x703D,0x703C,0xA002,0x703B,0x703A,0xA008,0xA004,0xA002,0x7038,0x7037,0xA002,0x7036,0x7034,0xA004,0xA002,0x7033, 0x7032,0xA002,0x7031,0x7030,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x702F,0x702E,0xA002,0x702D,0x702C,0xA003,0xA000, 0x702B,0xA002,0x702A,0x7029,0xA008,0xA004,0xA002,0x7028,0x7027,0xA002,0x7026,0x7025,0xA004,0xA002,0x7024,0x7022, 0xA002,0x7021,0x7020,0xA010,0xA008,0xA004,0xA002,0x701F,0x701E,0xA002,0x701D,0x701C,0xA004,0xA002,0x7019,0x7018, 0xA002,0x7017,0x7016,0xA008,0xA004,0xA002,0x7015,0x7014,0xA002,0x7013,0x7012,0xA004,0xA002,0x7010,0x700F,0xA002, 0x700E,0x700D,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x700C,0x700B,0xA002,0x700A,0x7009,0xA004,0xA002,0x7008, 0x7007,0xA002,0x7006,0x7005,0xA008,0xA004,0xA002,0x7004,0x7003,0xA002,0x7002,0x7001,0xA004,0xA002,0x7000,0x6FFF, 0xA002,0x6FFE,0x6FFD,0xA010,0xA008,0xA004,0xA002,0x6FFC,0x6FFB,0xA002,0x6FFA,0x6FF9,0xA004,0xA002,0x6FF8,0x6FF7, 0xA002,0x6FF6,0x6FF5,0xA008,0xA004,0xA002,0x6FF4,0x6FF3,0xA002,0x6FF2,0x6FF1,0xA004,0xA002,0x6FF0,0x6FED,0xA002, 0x6FEC,0x6FEB,0xA000,0xA000,0xA008,0xA004,0xA002,0x6FEA,0x6FE9,0xA002,0x6FE8,0x6FE7,0xA000,0xA000,0x6FE6,0xA0B6, 0xA036,0xA001,0xA015,0xA005,0xA001,0xA001,0xA001,0x6FE5,0xA008,0xA004,0xA002,0x6FE4,0x6FE3,0xA002,0x6FE2,0x6FDF, 0xA004,0xA002,0x6FDD,0x6FDC,0xA002,0x6FDB,0x6FDA,0xA010,0xA008,0xA004,0xA002,0x6FD9,0x6FD8,0xA002,0x6FD7,0x6FD6, 0xA004,0xA002,0x6FD5,0x6FD4,0xA002,0x6FD3,0x6FD0,0xA008,0xA004,0xA002,0x6FCF,0x6FCE,0xA002,0x6FCD,0x6FCC,0xA004, 0xA002,0x6FCB,0x6FCA,0xA002,0x6FC8,0x6FC7,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6FC6,0x6FC5,0xA002,0x6FC4, 0x6FC3,0xA004,0xA002,0x6FC1,0x6FBF,0xA002,0x6FBE,0x6FBD,0xA008,0xA004,0xA002,0x6FBC,0x6FBB,0xA002,0x6FBA,0x6FB8, 0xA004,0xA002,0x6FB7,0x6FB5,0xA002,0x6FB4,0x6FB2,0xA010,0xA008,0xA004,0xA002,0x6FB1,0x6FB0,0xA002,0x6FAF,0x6FAE, 0xA004,0xA002,0x6FAD,0x6FAC,0xA002,0x6FAB,0x6FAA,0xA008,0xA004,0xA002,0x6FA9,0x6FA8,0xA002,0x6FA6,0x6FA5,0xA004, 0xA002,0x6FA4,0x6FA3,0xA002,0x6FA2,0x6FA0,0xA020,0xA010,0xA008,0xA004,0xA002,0x6F9F,0x6F9E,0xA002,0x6F9D,0x6F9B, 0xA004,0xA002,0x6F9A,0x6F99,0xA002,0x6F98,0x6F97,0xA008,0xA004,0xA002,0x6F96,0x6F95,0xA002,0x6F94,0x6F93,0xA004, 0xA002,0x6F92,0x6F91,0xA002,0x6F90,0x6F8F,0xA010,0xA008,0xA004,0xA002,0x6F8B,0x6F8A,0xA002,0x6F87,0x6F86,0xA004, 0xA002,0x6F85,0x6F83,0xA002,0x6F82,0x6F81,0xA008,0xA004,0xA002,0x6F80,0x6F7F,0xA002,0x6F7E,0x6F7D,0xA004,0xA002, 0x6F7B,0x6F79,0xA002,0x6F77,0x6F76,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6F75,0xA002,0x6F73,0x6F71,0xA004, 0xA002,0x6F70,0x6F6F,0xA002,0x6F6C,0x6F6B,0xA008,0xA004,0xA002,0x6F6A,0x6F69,0xA002,0x6F68,0x6F67,0xA004,0xA002, 0x6F65,0x6F64,0xA002,0x6F63,0x6F61,0xA010,0xA008,0xA004,0xA002,0x6F60,0x6F5F,0xA002,0x6F5D,0x6F5B,0xA004,0xA002, 0x6F5A,0x6F59,0xA002,0x6F57,0x6F56,0xA008,0xA004,0xA002,0x6F55,0x6F54,0xA002,0x6F53,0x6F52,0xA004,0xA002,0x6F51, 0x6F50,0xA002,0x6F4F,0x6F4E,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x6F4C,0x6F4A,0xA002,0x6F49,0x6F48,0xA004,0xA002, 0x6F45,0x6F44,0xA000,0x6F43,0xA008,0xA004,0xA002,0x6F42,0x6F41,0xA002,0x6F40,0x6F3F,0xA004,0xA002,0x6F3D,0x6F3C, 0xA002,0x6F3B,0x6F3A,0xA010,0xA008,0xA004,0xA002,0x6F39,0x6F38,0xA002,0x6F37,0x6F35,0xA004,0xA002,0x6F34,0x6F32, 0xA002,0x6F30,0x6F2E,0xA008,0xA004,0xA002,0x6F2C,0x6F28,0xA002,0x6F27,0x6F26,0xA004,0xA002,0x6F25,0x6F23,0xA002, 0x6F22,0x6F21,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6F1F,0x6F1E,0xA002,0x6F1D,0x6F1C,0xA004,0xA002,0x6F1B, 0x6F1A,0xA002,0x6F19,0x6F18,0xA008,0xA004,0xA002,0x6F17,0x6F16,0xA002,0x6F12,0x6F11,0xA004,0xA002,0x6F10,0x6F0E, 0xA002,0x6F0D,0x6F0C,0xA010,0xA008,0xA004,0xA002,0x6F0B,0x6F0A,0xA002,0x6F08,0x6F07,0xA004,0xA002,0x6F05,0x6F04, 0xA002,0x6F03,0x6F01,0xA008,0xA004,0xA002,0x6F00,0x6EFF,0xA002,0x6EFE,0x6EFD,0xA004,0xA002,0x6EFC,0x6EFB,0xA002, 0x6EFA,0x6EF8,0xA000,0xA000,0xA008,0xA004,0xA002,0x6EF7,0x6EF6,0xA002,0x6EF5,0x6EF3,0xA004,0xA002,0x6EF2,0x6EF1, 0xA000,0x6EF0,0xA184,0xA0B1,0xA031,0xA001,0xA010,0xA001,0xA007,0xA003,0xA001,0x6EEF,0xA002,0x6EEE,0x6EED,0xA004, 0xA002,0x6EEC,0x6EEB,0xA002,0x6EEA,0x6EE7,0xA010,0xA008,0xA004,0xA002,0x6EE3,0x6EDD,0xA002,0x6EDC,0x6EDB,0xA004, 0xA002,0x6ED9,0x6ED8,0xA002,0x6ED6,0x6ED2,0xA008,0xA004,0xA002,0x6ED0,0x6ECE,0xA002,0x6ECD,0x6ECC,0xA004,0xA002, 0x6ECA,0x6EC9,0xA002,0x6EC8,0x6EC6,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6EC5,0x6EC4,0xA002,0x6EC3,0x6EC0, 0xA004,0xA002,0x6EBF,0x6EBE,0xA002,0x6EBC,0x6EB9,0xA008,0xA004,0xA002,0x6EB8,0x6EB5,0xA002,0x6EB3,0x6EB0,0xA004, 0xA002,0x6EAE,0x6EAD,0xA002,0x6EAC,0x6EAB,0xA010,0xA008,0xA004,0xA002,0x6EA9,0x6EA8,0xA002,0x6EA6,0x6EA4,0xA004, 0xA002,0x6EA3,0x6EA1,0xA002,0x6EA0,0x6E9E,0xA008,0xA004,0xA002,0x6E9D,0x6E9B,0xA002,0x6E9A,0x6E99,0xA004,0xA002, 0x6E97,0x6E96,0xA002,0x6E95,0x6E94,0xA020,0xA010,0xA008,0xA004,0xA002,0x6E93,0x6E92,0xA002,0x6E91,0x6E8E,0xA004, 0xA002,0x6E8D,0x6E8C,0xA002,0x6E8B,0x6E8A,0xA008,0xA004,0xA002,0x6E88,0x6E87,0xA002,0x6E84,0x6E82,0xA004,0xA002, 0x6E81,0x6E80,0xA002,0x6E7D,0x6E7C,0xA010,0xA008,0xA004,0xA002,0x6E7B,0x6E7A,0xA002,0x6E79,0x6E78,0xA004,0xA002, 0x6E77,0x6E76,0xA002,0x6E75,0x6E74,0xA008,0xA004,0xA002,0x6E73,0x6E72,0xA002,0x6E71,0x6E70,0xA004,0xA002,0x6E6F, 0x6E6D,0xA002,0x6E6C,0x6E6A,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6E69,0xA002,0x6E68,0x6E67,0xA004,0xA002, 0x6E66,0x6E65,0xA002,0x6E64,0x6E63,0xA008,0xA004,0xA002,0x6E62,0x6E61,0xA002,0x6E60,0x6E5E,0xA004,0xA002,0x6E5D, 0x6E5C,0xA002,0x6E5A,0x6E59,0xA010,0xA008,0xA004,0xA002,0x6E57,0x6E55,0xA002,0x6E52,0x6E51,0xA004,0xA002,0x6E50, 0x6E4F,0xA002,0x6E4C,0x6E4B,0xA008,0xA004,0xA002,0x6E4A,0x6E49,0xA002,0x6E48,0x6E47,0xA004,0xA002,0x6E46,0x6E45, 0xA002,0x6E42,0x6E41,0xA01F,0xA010,0xA008,0xA004,0xA002,0x6E40,0x6E3F,0xA002,0x6E3E,0x6E3D,0xA004,0xA002,0x6E3C, 0x6E3B,0xA002,0x6E39,0x6E37,0xA007,0xA003,0xA000,0x6E36,0xA002,0x6E35,0x6E33,0xA004,0xA002,0x6E31,0x6E30,0xA002, 0x6E2E,0x6E2C,0xA010,0xA008,0xA004,0xA002,0x6E2A,0x6E28,0xA002,0x6E27,0x6E26,0xA004,0xA002,0x6E22,0x6E1F,0xA002, 0x6E1E,0x6E1C,0xA008,0xA004,0xA002,0x6E1B,0x6E19,0xA002,0x6E18,0x6E15,0xA004,0xA002,0x6E13,0x6E12,0xA002,0x6E0F, 0x6E0B,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6E09,0x6E08,0xA002,0x6E07,0x6E06,0xA004,0xA002,0x6E04,0x6E03, 0xA002,0x6E02,0x6E01,0xA008,0xA004,0xA002,0x6E00,0x6DFF,0xA002,0x6DFE,0x6DFD,0xA004,0xA002,0x6DFA,0x6DF8,0xA002, 0x6DF6,0x6DF5,0xA010,0xA008,0xA004,0xA002,0x6DF4,0x6DF2,0xA002,0x6DF0,0x6DEF,0xA004,0xA002,0x6DED,0x6DEA,0xA002, 0x6DE9,0x6DE8,0xA008,0xA004,0xA002,0x6DE7,0x6DE5,0xA002,0x6DE3,0x6DE2,0xA004,0xA002,0x6DDF,0x6DDC,0xA002,0x6DDB, 0x6DDA,0xA000,0xA010,0xA008,0xA004,0xA002,0x6DD7,0x6DD5,0xA002,0x6DD4,0x6DD3,0xA004,0xA002,0x6DD2,0x6DD0,0xA002, 0x6DCF,0x6DCE,0xA000,0xA000,0xA000,0x6DCD,0xA0AE,0xA02E,0xA001,0xA00D,0xA001,0xA004,0xA001,0xA001,0x6DCA,0xA004, 0xA002,0x6DC9,0x6DC8,0xA002,0x6DC3,0x6DC2,0xA010,0xA008,0xA004,0xA002,0x6DC1,0x6DBE,0xA002,0x6DBD,0x6DBC,0xA004, 0xA002,0x6DBB,0x6DBA,0xA002,0x6DB9,0x6DB7,0xA008,0xA004,0xA002,0x6DB6,0x6DB4,0xA002,0x6DB3,0x6DB1,0xA004,0xA002, 0x6DB0,0x6DAD,0xA002,0x6DAC,0x6DA5,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6DA2,0x6D9C,0xA002,0x6D9A,0x6D99, 0xA004,0xA002,0x6D98,0x6D97,0xA002,0x6D96,0x6D92,0xA008,0xA004,0xA002,0x6D90,0x6D8F,0xA002,0x6D8D,0x6D8B,0xA004, 0xA002,0x6D8A,0x6D87,0xA002,0x6D86,0x6D84,0xA010,0xA008,0xA004,0xA002,0x6D83,0x6D81,0xA002,0x6D80,0x6D7F,0xA004, 0xA002,0x6D7E,0x6D7D,0xA002,0x6D7B,0x6D7A,0xA008,0xA004,0xA002,0x6D79,0x6D76,0xA002,0x6D75,0x6D73,0xA004,0xA002, 0x6D72,0x6D71,0xA002,0x6D70,0x6D6D,0xA020,0xA010,0xA008,0xA004,0xA002,0x6D6C,0x6D6B,0xA002,0x6D68,0x6D67,0xA004, 0xA002,0x6D65,0x6D64,0xA002,0x6D62,0x6D61,0xA008,0xA004,0xA002,0x6D5F,0x6D5D,0xA002,0x6D5B,0x6D58,0xA004,0xA002, 0x6D57,0x6D56,0xA002,0x6D55,0x6D50,0xA010,0xA008,0xA004,0xA002,0x6D4C,0x6D49,0xA002,0x6D44,0x6D42,0xA004,0xA002, 0x6D40,0x6D3F,0xA002,0x6D3A,0x6D38,0xA008,0xA004,0xA002,0x6D37,0x6D36,0xA002,0x6D34,0x6D30,0xA004,0xA002,0x6D2F, 0x6D2D,0xA002,0x6D2C,0x6D29,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6D28,0xA002,0x6D26,0x6D24,0xA004,0xA002, 0x6D23,0x6D22,0xA002,0x6D21,0x6D20,0xA008,0xA004,0xA002,0x6D1F,0x6D1D,0xA002,0x6D1C,0x6D18,0xA004,0xA002,0x6D16, 0x6D15,0xA002,0x6D14,0x6D13,0xA010,0xA008,0xA004,0xA002,0x6D11,0x6D10,0xA002,0x6D0F,0x6D0D,0xA004,0xA002,0x6D0A, 0x6D09,0xA002,0x6D08,0x6D06,0xA008,0xA004,0xA002,0x6D05,0x6D03,0xA002,0x6D02,0x6D00,0xA004,0xA002,0x6CFF,0x6CF9, 0xA002,0x6CF4,0x6CF2,0xA01F,0xA010,0xA008,0xA004,0xA002,0x6CED,0x6CEC,0xA002,0x6CE9,0x6CE7,0xA004,0xA002,0x6CE6, 0x6CE4,0xA002,0x6CDF,0x6CDD,0xA007,0xA004,0xA002,0x6CDC,0x6CDA,0xA000,0x6CD9,0xA004,0xA002,0x6CD8,0x6CD2,0xA002, 0x6CD1,0x6CCF,0xA010,0xA008,0xA004,0xA002,0x6CCE,0x6CCD,0xA002,0x6CCB,0x6CC8,0xA004,0xA002,0x6CC7,0x6CC6,0xA002, 0x6CC3,0x6CC2,0xA008,0xA004,0xA002,0x6CC1,0x6CC0,0xA002,0x6CBA,0x6CB7,0xA004,0xA002,0x6CB6,0x6CB5,0xA002,0x6CB4, 0x6CB0,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6CAF,0x6CAC,0xA002,0x6CA8,0x6CA2,0xA004,0xA002,0x6CA0,0x6C9E, 0xA002,0x6C9D,0x6C9C,0xA008,0xA004,0xA002,0x6C9A,0x6C98,0xA002,0x6C97,0x6C96,0xA004,0xA002,0x6C95,0x6C92,0xA002, 0x6C91,0x6C8E,0xA010,0xA008,0xA004,0xA002,0x6C8D,0x6C8B,0xA002,0x6C8A,0x6C87,0xA004,0xA002,0x6C84,0x6C80,0xA002, 0x6C7F,0x6C7C,0xA008,0xA004,0xA002,0x6C7B,0x6C7A,0xA002,0x6C78,0x6C77,0xA004,0xA002,0x6C75,0x6C73,0xA002,0x6C71, 0x6C6F,0xA000,0xA010,0xA008,0xA004,0xA002,0x6C6E,0x6C6D,0xA002,0x6C6C,0x6C6B,0xA004,0xA002,0x6C67,0x6C66,0xA002, 0x6C65,0x6C63,0xA000,0xA004,0xA002,0x6C62,0x6C5A,0xA000,0x6C59,0xA303,0xA183,0xA0A8,0xA02A,0xA001,0xA009,0xA001, 0xA001,0xA003,0xA001,0x6C58,0xA002,0x6C56,0x6C53,0xA010,0xA008,0xA004,0xA002,0x6C52,0x6C51,0xA002,0x6C4F,0x6C4E, 0xA004,0xA002,0x6C4D,0x6C4C,0xA002,0x6C4B,0x6C48,0xA008,0xA004,0xA002,0x6C45,0x6C44,0xA002,0x6C43,0x6C3F,0xA004, 0xA002,0x6C3E,0x6C3C,0xA002,0x6C3B,0x6C3A,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6C39,0xA002,0x6C37,0x6C36,0xA004, 0xA002,0x6C33,0x6C31,0xA002,0x6C2D,0x6C2C,0xA008,0xA004,0xA002,0x6C2B,0x6C25,0xA002,0x6C23,0x6C20,0xA004,0xA002, 0x6C1E,0x6C1D,0xA002,0x6C1C,0x6C17,0xA010,0xA008,0xA004,0xA002,0x6C12,0x6C0E,0xA002,0x6C0C,0x6C0B,0xA004,0xA002, 0x6C0A,0x6C09,0xA002,0x6C08,0x6C04,0xA008,0xA004,0xA002,0x6C03,0x6C02,0xA002,0x6C01,0x6C00,0xA004,0xA002,0x6BFF, 0x6BFE,0xA002,0x6BFC,0x6BFB,0xA020,0xA010,0xA008,0xA004,0xA002,0x6BFA,0x6BF8,0xA002,0x6BF7,0x6BF6,0xA004,0xA002, 0x6BF4,0x6BF2,0xA002,0x6BF1,0x6BF0,0xA008,0xA004,0xA002,0x6BEE,0x6BED,0xA002,0x6BEC,0x6BE9,0xA004,0xA002,0x6BE8, 0x6BE7,0xA002,0x6BE6,0x6BE5,0xA010,0xA008,0xA004,0xA002,0x6BE4,0x6BE3,0xA002,0x6BE2,0x6BE0,0xA004,0xA002,0x6BDF, 0x6BDE,0xA002,0x6BDD,0x6BDC,0xA008,0xA004,0xA002,0x6BDA,0x6BD8,0xA002,0x6BD1,0x6BD0,0xA004,0xA002,0x6BCE,0x6BCC, 0xA002,0x6BCA,0x6BC9,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6BC8,0xA002,0x6BC7,0x6BC6,0xA004,0xA002,0x6BC4, 0x6BC3,0xA002,0x6BC0,0x6BBE,0xA008,0xA004,0xA002,0x6BBD,0x6BBC,0xA002,0x6BBB,0x6BBA,0xA004,0xA002,0x6BB9,0x6BB8, 0xA002,0x6BB6,0x6BB2,0xA010,0xA008,0xA004,0xA002,0x6BB1,0x6BB0,0xA002,0x6BAF,0x6BAE,0xA004,0xA002,0x6BAD,0x6BAC, 0xA002,0x6BAB,0x6BA9,0xA008,0xA004,0xA002,0x6BA8,0x6BA7,0xA002,0x6BA6,0x6BA5,0xA004,0xA002,0x6BA4,0x6BA3,0xA002, 0x6BA2,0x6BA0,0xA01F,0xA010,0xA008,0xA004,0xA002,0x6B9F,0x6B9E,0xA002,0x6B9D,0x6B9C,0xA004,0xA002,0x6B99,0x6B98, 0xA002,0x6B97,0x6B95,0xA008,0xA004,0xA002,0x6B94,0x6B91,0xA002,0x6B90,0x6B8F,0xA004,0xA002,0x6B8E,0x6B8C,0xA001, 0x6B88,0xA010,0xA008,0xA004,0xA002,0x6B85,0x6B80,0xA002,0x6B7F,0x6B7E,0xA004,0xA002,0x6B7D,0x6B7A,0xA002,0x6B78, 0x6B77,0xA008,0xA004,0xA002,0x6B76,0x6B75,0xA002,0x6B74,0x6B73,0xA004,0xA002,0x6B72,0x6B71,0xA002,0x6B70,0x6B6F, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6B6E,0x6B6D,0xA002,0x6B6C,0x6B6B,0xA004,0xA002,0x6B69,0x6B68,0xA002, 0x6B61,0x6B60,0xA008,0xA004,0xA002,0x6B5F,0x6B5E,0xA002,0x6B5D,0x6B5C,0xA004,0xA002,0x6B5B,0x6B5A,0xA002,0x6B58, 0x6B57,0xA010,0xA008,0xA004,0xA002,0x6B56,0x6B55,0xA002,0x6B54,0x6B53,0xA004,0xA002,0x6B52,0x6B51,0xA002,0x6B50, 0x6B4F,0xA008,0xA004,0xA002,0x6B4E,0x6B4D,0xA002,0x6B4B,0x6B4A,0xA004,0xA002,0x6B48,0x6B45,0xA002,0x6B44,0x6B42, 0xA000,0xA010,0xA008,0xA004,0xA002,0x6B41,0x6B40,0xA002,0x6B3F,0x6B3D,0xA004,0xA002,0x6B3C,0x6B3B,0xA002,0x6B38, 0x6B36,0xA008,0xA004,0xA002,0x6B35,0x6B34,0xA002,0x6B33,0x6B31,0xA000,0xA002,0x6B30,0x6B2F,0xA0A2,0xA022,0xA001, 0xA001,0xA010,0xA008,0xA004,0xA002,0x6B2E,0x6B2D,0xA002,0x6B2C,0x6B2B,0xA004,0xA002,0x6B2A,0x6B29,0xA002,0x6B28, 0x6B26,0xA008,0xA004,0xA002,0x6B25,0x6B1F,0xA002,0x6B1E,0x6B1D,0xA004,0xA002,0x6B1C,0x6B1B,0xA002,0x6B1A,0x6B19, 0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6B18,0x6B17,0xA002,0x6B16,0x6B15,0xA004,0xA002,0x6B14,0x6B13,0xA002, 0x6B12,0x6B11,0xA008,0xA004,0xA002,0x6B10,0x6B0F,0xA002,0x6B0E,0x6B0D,0xA004,0xA002,0x6B0C,0x6B0B,0xA002,0x6B0A, 0x6B09,0xA010,0xA008,0xA004,0xA002,0x6B08,0x6B07,0xA002,0x6B06,0x6B05,0xA004,0xA002,0x6B04,0x6B03,0xA002,0x6B02, 0x6B01,0xA008,0xA004,0xA002,0x6B00,0x6AFF,0xA002,0x6AFE,0x6AFD,0xA004,0xA002,0x6AFC,0x6AFB,0xA002,0x6AFA,0x6AF9, 0xA020,0xA010,0xA008,0xA004,0xA002,0x6AF8,0x6AF7,0xA002,0x6AF6,0x6AF5,0xA004,0xA002,0x6AF4,0x6AF3,0xA002,0x6AF2, 0x6AF1,0xA008,0xA004,0xA002,0x6AF0,0x6AEF,0xA002,0x6AEE,0x6AED,0xA004,0xA002,0x6AEC,0x6AEB,0xA002,0x6AEA,0x6AE9, 0xA010,0xA008,0xA004,0xA002,0x6AE8,0x6AE7,0xA002,0x6AE6,0x6AE5,0xA004,0xA002,0x6AE4,0x6AE3,0xA002,0x6AE2,0x6AE1, 0xA008,0xA004,0xA002,0x6AE0,0x6ADF,0xA002,0x6ADE,0x6ADD,0xA004,0xA002,0x6ADC,0x6ADB,0xA002,0x6ADA,0x6AD9,0xA07D, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6AD8,0xA002,0x6AD7,0x6AD6,0xA004,0xA002,0x6AD5,0x6AD4,0xA002,0x6AD3,0x6AD2, 0xA008,0xA004,0xA002,0x6AD1,0x6AD0,0xA002,0x6ACF,0x6ACE,0xA004,0xA002,0x6ACD,0x6ACC,0xA002,0x6ACB,0x6ACA,0xA010, 0xA008,0xA004,0xA002,0x6AC9,0x6AC8,0xA002,0x6AC7,0x6AC6,0xA004,0xA002,0x6AC5,0x6AC4,0xA002,0x6AC3,0x6AC2,0xA008, 0xA004,0xA002,0x6AC1,0x6AC0,0xA002,0x6ABF,0x6ABE,0xA004,0xA002,0x6ABD,0x6ABC,0xA002,0x6ABB,0x6ABA,0xA020,0xA010, 0xA008,0xA004,0xA002,0x6AB9,0x6AB8,0xA002,0x6AB7,0x6AB6,0xA004,0xA002,0x6AB5,0x6AB4,0xA002,0x6AB3,0x6AB2,0xA008, 0xA004,0xA002,0x6AB1,0x6AB0,0xA002,0x6AAF,0x6AAE,0xA004,0xA002,0x6AAD,0x6AAA,0xA002,0x6AA8,0x6AA7,0xA00F,0xA007, 0xA003,0xA001,0x6AA6,0xA002,0x6AA5,0x6AA4,0xA004,0xA002,0x6AA3,0x6AA2,0xA002,0x6AA1,0x6A9F,0xA008,0xA004,0xA002, 0x6A9E,0x6A9D,0xA002,0x6A9C,0x6A9B,0xA004,0xA002,0x6A9A,0x6A99,0xA002,0x6A98,0x6A96,0xA040,0xA020,0xA010,0xA008, 0xA004,0xA002,0x6A95,0x6A94,0xA002,0x6A93,0x6A92,0xA004,0xA002,0x6A8F,0x6A8D,0xA002,0x6A8C,0x6A8B,0xA008,0xA004, 0xA002,0x6A8A,0x6A89,0xA002,0x6A88,0x6A87,0xA004,0xA002,0x6A86,0x6A85,0xA002,0x6A83,0x6A82,0xA010,0xA008,0xA004, 0xA002,0x6A81,0x6A7F,0xA002,0x6A7E,0x6A7D,0xA004,0xA002,0x6A7B,0x6A7A,0xA002,0x6A78,0x6A77,0xA008,0xA004,0xA002, 0x6A76,0x6A75,0xA002,0x6A74,0x6A73,0xA004,0xA002,0x6A72,0x6A70,0xA002,0x6A6F,0x6A6E,0xA000,0xA010,0xA008,0xA004, 0xA002,0x6A6D,0x6A6C,0xA002,0x6A6B,0x6A6A,0xA004,0xA002,0x6A69,0x6A68,0xA002,0x6A67,0x6A66,0xA008,0xA004,0xA002, 0x6A64,0x6A63,0xA002,0x6A62,0x6A60,0xA004,0xA002,0x6A5F,0x6A5E,0xA002,0x6A5D,0x6A5C,0xA183,0xA09F,0xA01F,0xA001, 0xA001,0xA00D,0xA005,0xA001,0xA002,0x6A5A,0x6A57,0xA004,0xA002,0x6A56,0x6A55,0xA002,0x6A54,0x6A53,0xA008,0xA004, 0xA002,0x6A52,0x6A51,0xA002,0x6A4F,0x6A4E,0xA004,0xA002,0x6A4D,0x6A4C,0xA002,0x6A4B,0x6A4A,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x6A49,0x6A48,0xA002,0x6A46,0x6A45,0xA004,0xA002,0x6A43,0x6A42,0xA002,0x6A41,0x6A40,0xA008, 0xA004,0xA002,0x6A3F,0x6A3C,0xA002,0x6A3B,0x6A3A,0xA004,0xA002,0x6A39,0x6A38,0xA002,0x6A37,0x6A36,0xA010,0xA008, 0xA004,0xA002,0x6A34,0x6A33,0xA002,0x6A32,0x6A30,0xA004,0xA002,0x6A2E,0x6A2D,0xA002,0x6A2C,0x6A2B,0xA008,0xA004, 0xA002,0x6A29,0x6A27,0xA002,0x6A26,0x6A25,0xA004,0xA002,0x6A24,0x6A23,0xA002,0x6A22,0x6A20,0xA020,0xA010,0xA008, 0xA004,0xA002,0x6A1E,0x6A1D,0xA002,0x6A1C,0x6A1B,0xA004,0xA002,0x6A1A,0x6A19,0xA002,0x6A16,0x6A15,0xA008,0xA004, 0xA002,0x6A14,0x6A13,0xA002,0x6A12,0x6A11,0xA004,0xA002,0x6A10,0x6A0F,0xA002,0x6A0E,0x6A0D,0xA010,0xA008,0xA004, 0xA002,0x6A0C,0x6A0B,0xA002,0x6A09,0x6A08,0xA004,0xA002,0x6A07,0x6A06,0xA002,0x6A05,0x6A04,0xA008,0xA004,0xA002, 0x6A03,0x6A02,0xA002,0x6A01,0x6A00,0xA004,0xA002,0x69FE,0x69FC,0xA002,0x69FB,0x69FA,0xA07D,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x69F9,0xA002,0x69F8,0x69F7,0xA004,0xA002,0x69F6,0x69F5,0xA002,0x69F4,0x69F3,0xA008,0xA004,0xA002, 0x69F1,0x69F0,0xA002,0x69EF,0x69EE,0xA004,0xA002,0x69EC,0x69EB,0xA002,0x69EA,0x69E9,0xA010,0xA008,0xA004,0xA002, 0x69E8,0x69E7,0xA002,0x69E6,0x69E5,0xA004,0xA002,0x69E4,0x69E3,0xA002,0x69E2,0x69E1,0xA008,0xA004,0xA002,0x69DE, 0x69DD,0xA002,0x69DC,0x69DA,0xA004,0xA002,0x69D9,0x69D8,0xA002,0x69D7,0x69D6,0xA020,0xA010,0xA008,0xA004,0xA002, 0x69D5,0x69D3,0xA002,0x69D2,0x69D1,0xA004,0xA002,0x69CF,0x69CD,0xA002,0x69CB,0x69C9,0xA008,0xA004,0xA002,0x69C8, 0x69C7,0xA002,0x69C6,0x69C5,0xA004,0xA002,0x69C4,0x69C3,0xA002,0x69C2,0x69C0,0xA00F,0xA007,0xA004,0xA002,0x69BF, 0x69BE,0xA001,0x69BD,0xA004,0xA002,0x69BC,0x69BA,0xA002,0x69B9,0x69B8,0xA008,0xA004,0xA002,0x69B6,0x69B5,0xA002, 0x69B3,0x69B2,0xA004,0xA002,0x69B0,0x69AF,0xA002,0x69AE,0x69AC,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x69AA, 0x69A9,0xA002,0x69A6,0x69A5,0xA004,0xA002,0x69A4,0x69A3,0xA002,0x69A2,0x69A1,0xA008,0xA004,0xA002,0x69A0,0x699F, 0xA002,0x699E,0x699D,0xA004,0xA002,0x699A,0x6999,0xA002,0x6997,0x6996,0xA010,0xA008,0xA004,0xA002,0x6993,0x6992, 0xA002,0x6991,0x6990,0xA004,0xA002,0x698F,0x698E,0xA002,0x698C,0x698B,0xA008,0xA004,0xA002,0x698A,0x6985,0xA002, 0x6983,0x6981,0xA004,0xA002,0x697F,0x697E,0xA002,0x697D,0x697B,0xA020,0xA010,0xA008,0xA004,0xA002,0x697A,0x6976, 0xA002,0x6975,0x6974,0xA004,0xA002,0x6973,0x6972,0xA002,0x6970,0x696F,0xA008,0xA004,0xA002,0x696D,0x696C,0xA002, 0x696A,0x6969,0xA004,0xA002,0x6968,0x6967,0xA002,0x6965,0x6964,0xA000,0xA000,0xA000,0xA002,0x6962,0x6961,0xA09B, 0xA01B,0xA001,0xA001,0xA009,0xA001,0xA004,0xA002,0x695F,0x695C,0xA002,0x695B,0x6959,0xA008,0xA004,0xA002,0x6958, 0x6956,0xA002,0x6955,0x6953,0xA004,0xA002,0x6952,0x6951,0xA002,0x6950,0x694F,0xA040,0xA020,0xA010,0xA008,0xA004, 0xA002,0x694E,0x694D,0xA002,0x694C,0x694B,0xA004,0xA002,0x694A,0x6949,0xA002,0x6948,0x6947,0xA008,0xA004,0xA002, 0x6946,0x6945,0xA002,0x6944,0x6943,0xA004,0xA002,0x6941,0x6940,0xA002,0x693E,0x693C,0xA010,0xA008,0xA004,0xA002, 0x693B,0x693A,0xA002,0x6938,0x6937,0xA004,0xA002,0x6936,0x6935,0xA002,0x6933,0x6932,0xA008,0xA004,0xA002,0x6931, 0x692F,0xA002,0x692E,0x692C,0xA004,0xA002,0x692B,0x692A,0xA002,0x6929,0x6928,0xA020,0xA010,0xA008,0xA004,0xA002, 0x6927,0x6926,0xA002,0x6925,0x6923,0xA004,0xA002,0x6922,0x6921,0xA002,0x691E,0x691D,0xA008,0xA004,0xA002,0x691C, 0x691B,0xA002,0x691A,0x6919,0xA004,0xA002,0x6918,0x6917,0xA002,0x6916,0x6915,0xA010,0xA008,0xA004,0xA002,0x6914, 0x6913,0xA002,0x6911,0x690F,0xA004,0xA002,0x690C,0x690A,0xA002,0x6909,0x6908,0xA008,0xA004,0xA002,0x6907,0x6906, 0xA002,0x6904,0x6903,0xA004,0xA002,0x6902,0x6900,0xA002,0x68FF,0x68FE,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x68FD,0xA002,0x68FB,0x68F8,0xA004,0xA002,0x68F7,0x68F6,0xA002,0x68F4,0x68F3,0xA008,0xA004,0xA002,0x68F2,0x68EF, 0xA002,0x68ED,0x68EC,0xA004,0xA002,0x68EB,0x68EA,0xA002,0x68E9,0x68E8,0xA010,0xA008,0xA004,0xA002,0x68E7,0x68E6, 0xA002,0x68E5,0x68E4,0xA004,0xA002,0x68E2,0x68E1,0xA002,0x68DF,0x68DE,0xA008,0xA004,0xA002,0x68DD,0x68DC,0xA002, 0x68DB,0x68D9,0xA004,0xA002,0x68D7,0x68D6,0xA002,0x68D4,0x68D3,0xA020,0xA010,0xA008,0xA004,0xA002,0x68D1,0x68D0, 0xA002,0x68CF,0x68CE,0xA004,0xA002,0x68CC,0x68CA,0xA002,0x68C8,0x68C7,0xA008,0xA004,0xA002,0x68C6,0x68C5,0xA002, 0x68C4,0x68C3,0xA004,0xA002,0x68C1,0x68BF,0xA002,0x68BE,0x68BD,0xA00F,0xA008,0xA004,0xA002,0x68BC,0x68BB,0xA002, 0x68BA,0x68B9,0xA003,0xA001,0x68B8,0xA002,0x68B7,0x68B6,0xA008,0xA004,0xA002,0x68B4,0x68B2,0xA002,0x68B1,0x68AE, 0xA004,0xA002,0x68AC,0x68AB,0xA002,0x68AA,0x68A9,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x68A5,0x68A4,0xA002, 0x68A3,0x68A1,0xA004,0xA002,0x68A0,0x689F,0xA002,0x689E,0x689D,0xA008,0xA004,0xA002,0x689C,0x689B,0xA002,0x689A, 0x6899,0xA004,0xA002,0x6898,0x6896,0xA002,0x6895,0x6894,0xA010,0xA008,0xA004,0xA002,0x6892,0x6891,0xA002,0x6890, 0x688E,0xA004,0xA002,0x688D,0x688C,0xA002,0x688B,0x688A,0xA008,0xA004,0xA002,0x6889,0x6888,0xA002,0x6887,0x6884, 0xA004,0xA002,0x6882,0x6880,0xA002,0x687F,0x687E,0xA020,0xA010,0xA008,0xA004,0xA002,0x687D,0x687C,0xA002,0x687B, 0x687A,0xA004,0xA002,0x6879,0x6878,0xA002,0x6875,0x6873,0xA008,0xA004,0xA002,0x6872,0x6871,0xA002,0x6870,0x686F, 0xA004,0xA002,0x686E,0x686D,0xA002,0x686C,0x686A,0xA000,0xA000,0xA004,0xA002,0x685F,0x685E,0xA002,0x685D,0x685C, 0xA60F,0xA307,0xA183,0xA096,0xA018,0xA001,0xA001,0xA006,0xA001,0xA001,0xA002,0x685B,0x685A,0xA008,0xA004,0xA002, 0x6859,0x6858,0xA002,0x6857,0x6856,0xA004,0xA002,0x6852,0x684F,0xA002,0x684D,0x684B,0xA03E,0xA01E,0xA00E,0xA006, 0xA002,0x6847,0xA002,0x683F,0x683B,0xA004,0xA002,0x683A,0x6836,0xA002,0x6835,0x6834,0xA008,0xA004,0xA002,0x6831, 0x6830,0xA002,0x682F,0x682E,0xA004,0xA002,0x682D,0x682C,0xA002,0x682B,0x6828,0xA010,0xA008,0xA004,0xA002,0x6827, 0x6826,0xA002,0x6825,0x6824,0xA004,0xA002,0x6823,0x6822,0xA002,0x6820,0x681F,0xA008,0xA004,0xA002,0x681E,0x681C, 0xA002,0x681B,0x681A,0xA004,0xA002,0x6819,0x6818,0xA002,0x6815,0x6814,0xA020,0xA010,0xA008,0xA004,0xA002,0x6812, 0x6810,0xA002,0x680D,0x6806,0xA004,0xA002,0x6804,0x6803,0xA002,0x6802,0x6801,0xA008,0xA004,0xA002,0x67FE,0x67FC, 0xA002,0x67FB,0x67FA,0xA004,0xA002,0x67F9,0x67F8,0xA002,0x67F7,0x67F6,0xA010,0xA008,0xA004,0xA002,0x67F5,0x67F2, 0xA002,0x67EE,0x67ED,0xA004,0xA002,0x67EB,0x67EA,0xA002,0x67E8,0x67E7,0xA008,0xA004,0xA002,0x67E6,0x67E4,0xA002, 0x67E3,0x67E1,0xA004,0xA002,0x67DF,0x67DB,0xA002,0x67D7,0x67D6,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x67D5, 0xA002,0x67CE,0x67CD,0xA004,0xA002,0x67CC,0x67CB,0xA002,0x67CA,0x67C9,0xA008,0xA004,0xA002,0x67C8,0x67C7,0xA002, 0x67C6,0x67C5,0xA004,0xA002,0x67C2,0x67C0,0xA002,0x67BF,0x67BE,0xA010,0xA008,0xA004,0xA002,0x67BD,0x67BC,0xA002, 0x67BB,0x67BA,0xA004,0xA002,0x67B9,0x67B4,0xA002,0x67B2,0x67B1,0xA008,0xA004,0xA002,0x67AE,0x67AC,0xA002,0x67A9, 0x67A6,0xA004,0xA002,0x67A4,0x67A1,0xA002,0x67A0,0x679F,0xA020,0xA010,0xA008,0xA004,0xA002,0x679B,0x6799,0xA002, 0x6796,0x6794,0xA004,0xA002,0x6793,0x6792,0xA002,0x6791,0x678F,0xA008,0xA004,0xA002,0x678E,0x678D,0xA002,0x678C, 0x678A,0xA004,0xA002,0x6788,0x6786,0xA002,0x6785,0x6783,0xA00F,0xA008,0xA004,0xA002,0x6782,0x6780,0xA002,0x677D, 0x677B,0xA004,0xA002,0x677A,0x6779,0xA000,0x6778,0xA008,0xA004,0xA002,0x6776,0x6774,0xA002,0x6771,0x676E,0xA004, 0xA002,0x676C,0x676B,0xA002,0x6767,0x6766,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6764,0x6763,0xA002,0x6762, 0x675D,0xA004,0xA002,0x675B,0x675A,0xA002,0x6759,0x6758,0xA008,0xA004,0xA002,0x6757,0x6755,0xA002,0x6754,0x6752, 0xA004,0xA002,0x674D,0x674B,0xA002,0x674A,0x6747,0xA010,0xA008,0xA004,0xA002,0x6745,0x6744,0xA002,0x6741,0x673F, 0xA004,0xA002,0x673E,0x673C,0xA002,0x673B,0x6739,0xA008,0xA004,0xA002,0x6738,0x6737,0xA002,0x6736,0x6733,0xA004, 0xA002,0x6732,0x6730,0xA002,0x672E,0x6729,0xA020,0xA010,0xA008,0xA004,0xA002,0x6727,0x6725,0xA002,0x6724,0x6723, 0xA004,0xA002,0x6722,0x6721,0xA002,0x6720,0x671E,0xA008,0xA004,0xA002,0x671C,0x671A,0xA002,0x6719,0x6718,0xA004, 0xA002,0x6716,0x6713,0xA002,0x6712,0x6711,0xA000,0xA008,0xA004,0xA002,0x670F,0x670E,0xA002,0x670C,0x6707,0xA004, 0xA002,0x6706,0x6705,0xA000,0x6704,0xA092,0xA012,0xA001,0xA001,0xA001,0xA007,0xA003,0xA001,0x6703,0xA002,0x6702, 0x6701,0xA004,0xA002,0x66FD,0x66FB,0xA002,0x66FA,0x66F8,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x66F6,0x66F5, 0xA002,0x66F1,0x66EF,0xA004,0xA002,0x66EE,0x66ED,0xA002,0x66EC,0x66EB,0xA008,0xA004,0xA002,0x66EA,0x66E8,0xA002, 0x66E7,0x66E5,0xA004,0xA002,0x66E4,0x66E3,0xA002,0x66E2,0x66E1,0xA010,0xA008,0xA004,0xA002,0x66E0,0x66DF,0xA002, 0x66DE,0x66DA,0xA004,0xA002,0x66D8,0x66D7,0xA002,0x66D6,0x66D5,0xA008,0xA004,0xA002,0x66D4,0x66D3,0xA002,0x66D2, 0x66D1,0xA004,0xA002,0x66D0,0x66CF,0xA002,0x66CE,0x66CD,0xA020,0xA010,0xA008,0xA004,0xA002,0x66CC,0x66CB,0xA002, 0x66CA,0x66C9,0xA004,0xA002,0x66C8,0x66C7,0xA002,0x66C6,0x66C5,0xA008,0xA004,0xA002,0x66C4,0x66C3,0xA002,0x66C2, 0x66C1,0xA004,0xA002,0x66C0,0x66BF,0xA002,0x66BD,0x66BC,0xA010,0xA008,0xA004,0xA002,0x66BB,0x66BA,0xA002,0x66B8, 0x66B7,0xA004,0xA002,0x66B6,0x66B5,0xA002,0x66B3,0x66B2,0xA008,0xA004,0xA002,0x66B1,0x66B0,0xA002,0x66AF,0x66AD, 0xA004,0xA002,0x66AC,0x66AB,0xA002,0x66AA,0x66A9,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x66A6,0xA002,0x66A5, 0x66A4,0xA004,0xA002,0x66A3,0x66A2,0xA002,0x66A1,0x66A0,0xA008,0xA004,0xA002,0x669F,0x669E,0xA002,0x669C,0x669B, 0xA004,0xA002,0x669A,0x6699,0xA002,0x6698,0x6695,0xA010,0xA008,0xA004,0xA002,0x6694,0x6693,0xA002,0x6692,0x6690, 0xA004,0xA002,0x668F,0x668E,0xA002,0x668D,0x668B,0xA008,0xA004,0xA002,0x668A,0x6689,0xA002,0x6688,0x6686,0xA004, 0xA002,0x6685,0x6683,0xA002,0x6681,0x6680,0xA020,0xA010,0xA008,0xA004,0xA002,0x667F,0x667D,0xA002,0x667C,0x667B, 0xA004,0xA002,0x6679,0x6678,0xA002,0x6675,0x6673,0xA008,0xA004,0xA002,0x6672,0x6671,0xA002,0x666D,0x666C,0xA004, 0xA002,0x666B,0x666A,0xA002,0x6669,0x6667,0xA010,0xA008,0xA004,0xA002,0x6665,0x6663,0xA002,0x6662,0x6660,0xA004, 0xA002,0x665E,0x665D,0xA002,0x665C,0x665B,0xA007,0xA003,0xA000,0x6659,0xA002,0x6658,0x6651,0xA004,0xA002,0x6650, 0x664E,0xA002,0x664D,0x664A,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6649,0x6648,0xA002,0x6647,0x6646,0xA004, 0xA002,0x6645,0x6644,0xA002,0x6642,0x6640,0xA008,0xA004,0xA002,0x663F,0x663D,0xA002,0x663B,0x663A,0xA004,0xA002, 0x6639,0x6638,0xA002,0x6637,0x6633,0xA010,0xA008,0xA004,0xA002,0x6632,0x6630,0xA002,0x662E,0x662C,0xA004,0xA002, 0x662B,0x662A,0xA002,0x6629,0x6626,0xA008,0xA004,0xA002,0x6624,0x6623,0xA002,0x6622,0x6621,0xA004,0xA002,0x661E, 0x661C,0xA002,0x661B,0x661A,0xA020,0xA010,0xA008,0xA004,0xA002,0x6618,0x6617,0xA002,0x6616,0x6612,0xA004,0xA002, 0x6611,0x6610,0xA002,0x660D,0x660B,0xA008,0xA004,0xA002,0x6609,0x6608,0xA002,0x6607,0x6605,0xA004,0xA002,0x6604, 0x6601,0xA002,0x65FF,0x65FE,0xA010,0xA008,0xA004,0xA002,0x65FD,0x65FC,0xA002,0x65FB,0x65F9,0xA004,0xA002,0x65F8, 0x65F5,0xA002,0x65F4,0x65F3,0xA000,0xA000,0xA000,0x65F2,0xA184,0xA08F,0xA00F,0xA001,0xA001,0xA001,0xA004,0xA001, 0xA001,0x65EB,0xA004,0xA002,0x65EA,0x65E4,0xA002,0x65E3,0x65E1,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x65DF, 0x65DE,0xA002,0x65DD,0x65DC,0xA004,0xA002,0x65DB,0x65DA,0xA002,0x65D9,0x65D8,0xA008,0xA004,0xA002,0x65D5,0x65D4, 0xA002,0x65D3,0x65D1,0xA004,0xA002,0x65D0,0x65CD,0xA002,0x65CA,0x65C9,0xA010,0xA008,0xA004,0xA002,0x65C8,0x65C7, 0xA002,0x65C2,0x65C0,0xA004,0xA002,0x65BF,0x65BE,0xA002,0x65BB,0x65BA,0xA008,0xA004,0xA002,0x65B8,0x65B7,0xA002, 0x65B6,0x65B5,0xA004,0xA002,0x65B4,0x65B3,0xA002,0x65B2,0x65B1,0xA020,0xA010,0xA008,0xA004,0xA002,0x65AE,0x65AC, 0xA002,0x65AA,0x65A8,0xA004,0xA002,0x65A6,0x65A3,0xA002,0x65A2,0x65A0,0xA008,0xA004,0xA002,0x659E,0x659D,0xA002, 0x659A,0x6598,0xA004,0xA002,0x6596,0x6595,0xA002,0x6594,0x6592,0xA010,0xA008,0xA004,0xA002,0x658F,0x658E,0xA002, 0x658D,0x658A,0xA004,0xA002,0x6589,0x6588,0xA002,0x6586,0x6585,0xA008,0xA004,0xA002,0x6584,0x6583,0xA002,0x6582, 0x6581,0xA004,0xA002,0x6580,0x657F,0xA002,0x657E,0x657D,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x657C,0xA002, 0x657B,0x657A,0xA004,0xA002,0x6579,0x6578,0xA002,0x6576,0x6575,0xA008,0xA004,0xA002,0x6573,0x6571,0xA002,0x656F, 0x656E,0xA004,0xA002,0x656D,0x656A,0xA002,0x6569,0x6568,0xA010,0xA008,0xA004,0xA002,0x6567,0x6565,0xA002,0x6564, 0x6561,0xA004,0xA002,0x6560,0x655F,0xA002,0x655C,0x655A,0xA008,0xA004,0xA002,0x6558,0x6557,0xA002,0x6554,0x6553, 0xA004,0xA002,0x6552,0x6550,0xA002,0x654E,0x654D,0xA020,0xA010,0xA008,0xA004,0xA002,0x654B,0x654A,0xA002,0x6547, 0x6546,0xA004,0xA002,0x6544,0x6543,0xA002,0x6542,0x6541,0xA008,0xA004,0xA002,0x6540,0x653D,0xA002,0x653C,0x653A, 0xA004,0xA002,0x6537,0x6533,0xA002,0x6532,0x6531,0xA010,0xA008,0xA004,0xA002,0x6530,0x652D,0xA002,0x652C,0x652A, 0xA004,0xA002,0x6529,0x6528,0xA002,0x6527,0x6526,0xA007,0xA004,0xA002,0x6524,0x6523,0xA000,0x6522,0xA004,0xA002, 0x6521,0x6520,0xA002,0x651F,0x651E,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x651D,0x651C,0xA002,0x651B,0x651A, 0xA004,0xA002,0x6519,0x6517,0xA002,0x6516,0x6515,0xA008,0xA004,0xA002,0x6514,0x6513,0xA002,0x6511,0x6510,0xA004, 0xA002,0x650F,0x650E,0xA002,0x650D,0x650C,0xA010,0xA008,0xA004,0xA002,0x650B,0x650A,0xA002,0x6508,0x6507,0xA004, 0xA002,0x6506,0x6505,0xA002,0x6504,0x6503,0xA008,0xA004,0xA002,0x6502,0x6501,0xA002,0x64FF,0x64FE,0xA004,0xA002, 0x64FD,0x64FC,0xA002,0x64FB,0x64FA,0xA020,0xA010,0xA008,0xA004,0xA002,0x64F9,0x64F8,0xA002,0x64F7,0x64F6,0xA004, 0xA002,0x64F5,0x64F4,0xA002,0x64F3,0x64F2,0xA008,0xA004,0xA002,0x64F1,0x64F0,0xA002,0x64EF,0x64EE,0xA004,0xA002, 0x64ED,0x64EC,0xA002,0x64EB,0x64EA,0xA010,0xA008,0xA004,0xA002,0x64E9,0x64E8,0xA002,0x64E7,0x64E5,0xA004,0xA002, 0x64E3,0x64E1,0xA002,0x64E0,0x64DF,0xA000,0xA004,0xA002,0x64DD,0x64DC,0xA000,0x64DB,0xA08B,0xA00B,0xA001,0xA001, 0xA001,0xA001,0xA003,0xA001,0x64DA,0xA002,0x64D9,0x64D6,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x64D5,0x64D4, 0xA002,0x64D3,0x64D1,0xA004,0xA002,0x64CF,0x64CC,0xA002,0x64CB,0x64CA,0xA008,0xA004,0xA002,0x64C9,0x64C8,0xA002, 0x64C7,0x64C6,0xA004,0xA002,0x64C4,0x64C3,0xA002,0x64C1,0x64BF,0xA010,0xA008,0xA004,0xA002,0x64BE,0x64BD,0xA002, 0x64BB,0x64B9,0xA004,0xA002,0x64B6,0x64B4,0xA002,0x64B3,0x64B2,0xA008,0xA004,0xA002,0x64B1,0x64AF,0xA002,0x64AB, 0x64AA,0xA004,0xA002,0x64A8,0x64A7,0xA002,0x64A6,0x64A5,0xA020,0xA010,0xA008,0xA004,0xA002,0x64A3,0x64A2,0xA002, 0x64A1,0x64A0,0xA004,0xA002,0x649F,0x649D,0xA002,0x649C,0x649B,0xA008,0xA004,0xA002,0x649A,0x6498,0xA002,0x6497, 0x6494,0xA004,0xA002,0x6493,0x6490,0xA002,0x648F,0x648E,0xA010,0xA008,0xA004,0xA002,0x648D,0x648C,0xA002,0x648B, 0x648A,0xA004,0xA002,0x6489,0x6488,0xA002,0x6486,0x6483,0xA008,0xA004,0xA002,0x6481,0x6480,0xA002,0x647F,0x647E, 0xA004,0xA002,0x647D,0x647C,0xA002,0x647B,0x6477,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x6476,0xA002,0x6475, 0x6474,0xA004,0xA002,0x6473,0x6472,0xA002,0x6471,0x6470,0xA008,0xA004,0xA002,0x646F,0x646E,0xA002,0x646C,0x646B, 0xA004,0xA002,0x646A,0x6468,0xA002,0x6466,0x6465,0xA010,0xA008,0xA004,0xA002,0x6464,0x6463,0xA002,0x6462,0x6461, 0xA004,0xA002,0x6460,0x645F,0xA002,0x645D,0x645C,0xA008,0xA004,0xA002,0x645B,0x645A,0xA002,0x6459,0x6457,0xA004, 0xA002,0x6456,0x6455,0xA002,0x6453,0x6451,0xA020,0xA010,0xA008,0xA004,0xA002,0x6450,0x644F,0xA002,0x644E,0x644D, 0xA004,0xA002,0x644C,0x644B,0xA002,0x6449,0x6443,0xA008,0xA004,0xA002,0x6442,0x6440,0xA002,0x643E,0x643C,0xA004, 0xA002,0x643B,0x6439,0xA002,0x6438,0x6437,0xA010,0xA008,0xA004,0xA002,0x6436,0x6435,0xA002,0x6433,0x6432,0xA004, 0xA002,0x6431,0x6430,0xA002,0x642F,0x642E,0xA008,0xA004,0xA002,0x642B,0x6429,0xA002,0x6428,0x6427,0xA003,0xA000, 0x6425,0xA002,0x6424,0x6423,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x6422,0x641F,0xA002,0x641D,0x641A,0xA004, 0xA002,0x6419,0x6418,0xA002,0x6417,0x6416,0xA008,0xA004,0xA002,0x6415,0x6412,0xA002,0x6411,0x640E,0xA004,0xA002, 0x640D,0x640A,0xA002,0x6409,0x6408,0xA010,0xA008,0xA004,0xA002,0x6407,0x6406,0xA002,0x6404,0x6403,0xA004,0xA002, 0x63FE,0x63FC,0xA002,0x63FB,0x63FA,0xA008,0xA004,0xA002,0x63F9,0x63F7,0xA002,0x63F5,0x63F3,0xA004,0xA002,0x63F1, 0x63F0,0xA002,0x63EF,0x63EE,0xA020,0xA010,0xA008,0xA004,0xA002,0x63EC,0x63EB,0xA002,0x63E8,0x63E7,0xA004,0xA002, 0x63E6,0x63E5,0xA002,0x63E4,0x63E2,0xA008,0xA004,0xA002,0x63DF,0x63DD,0xA002,0x63DC,0x63DB,0xA004,0xA002,0x63DA, 0x63D9,0xA002,0x63D8,0x63D7,0xA010,0xA008,0xA004,0xA002,0x63D5,0x63D4,0xA002,0x63D3,0x63D1,0xA004,0xA002,0x63CC, 0x63CB,0xA002,0x63CA,0x63C8,0xA008,0xA004,0xA002,0x63C7,0x63C5,0xA002,0x63C3,0x63C2,0xA000,0xA000,0x63C1,0xA301, 0xA184,0xA088,0xA008,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0x63C0,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002, 0x63BF,0x63BD,0xA002,0x63BB,0x63B9,0xA004,0xA002,0x63B6,0x63B5,0xA002,0x63B2,0x63B1,0xA008,0xA004,0xA002,0x63AF, 0x63AB,0xA002,0x63A6,0x63A4,0xA004,0xA002,0x63A1,0x639F,0xA002,0x639E,0x639D,0xA010,0xA008,0xA004,0xA002,0x639C, 0x639B,0xA002,0x639A,0x6399,0xA004,0xA002,0x6397,0x6395,0xA002,0x6394,0x6393,0xA008,0xA004,0xA002,0x6391,0x638D, 0xA002,0x638B,0x6386,0xA004,0xA002,0x6385,0x6384,0xA002,0x6383,0x6381,0xA020,0xA010,0xA008,0xA004,0xA002,0x637F, 0x637E,0xA002,0x637D,0x637C,0xA004,0xA002,0x6379,0x6378,0xA002,0x6375,0x6374,0xA008,0xA004,0xA002,0x6373,0x6372, 0xA002,0x6370,0x636F,0xA004,0xA002,0x636C,0x636B,0xA002,0x636A,0x6368,0xA010,0xA008,0xA004,0xA002,0x6366,0x6365, 0xA002,0x6364,0x6360,0xA004,0xA002,0x635D,0x635C,0xA002,0x635B,0x635A,0xA008,0xA004,0xA002,0x6359,0x6358,0xA002, 0x6357,0x6356,0xA004,0xA002,0x6354,0x6353,0xA002,0x6352,0x6351,0xA07D,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x634A, 0xA002,0x6348,0x6347,0xA004,0xA002,0x6344,0x6341,0xA002,0x6340,0x633F,0xA008,0xA004,0xA002,0x633E,0x633C,0xA002, 0x633B,0x6338,0xA004,0xA002,0x6337,0x6336,0xA002,0x6335,0x6334,0xA010,0xA008,0xA004,0xA002,0x6333,0x6331,0xA002, 0x6330,0x632E,0xA004,0xA002,0x632D,0x632C,0xA002,0x6329,0x6327,0xA008,0xA004,0xA002,0x6326,0x631C,0xA002,0x6319, 0x6318,0xA004,0xA002,0x6317,0x6315,0xA002,0x6314,0x6313,0xA020,0xA010,0xA008,0xA004,0xA002,0x6312,0x6310,0xA002, 0x630F,0x630D,0xA004,0xA002,0x630C,0x630B,0xA002,0x630A,0x6306,0xA008,0xA004,0xA002,0x6305,0x6304,0xA002,0x6303, 0x6300,0xA004,0xA002,0x62FB,0x62FA,0xA002,0x62F9,0x62F8,0xA010,0xA008,0xA004,0xA002,0x62F5,0x62F2,0xA002,0x62F0, 0x62EB,0xA004,0xA002,0x62EA,0x62E4,0xA002,0x62E1,0x62E0,0xA008,0xA004,0xA002,0x62DE,0x62DD,0xA002,0x62D5,0x62D1, 0xA004,0xA002,0x62CF,0x62CB,0xA000,0x62C3,0xA040,0xA020,0xA010,0xA008,0xA004,0xA002,0x62C1,0x62C0,0xA002,0x62BE, 0x62BA,0xA004,0xA002,0x62B8,0x62B7,0xA002,0x62B6,0x62B4,0xA008,0xA004,0xA002,0x62B3,0x62B2,0xA002,0x62B0,0x62AF, 0xA004,0xA002,0x62AE,0x62AD,0xA002,0x62AA,0x62A9,0xA010,0xA008,0xA004,0xA002,0x62A7,0x62A6,0xA002,0x62A3,0x629E, 0xA004,0xA002,0x629D,0x629C,0xA002,0x6299,0x6294,0xA008,0xA004,0xA002,0x6290,0x628F,0xA002,0x628E,0x628D,0xA004, 0xA002,0x628C,0x628B,0xA002,0x6288,0x6287,0xA020,0xA010,0xA008,0xA004,0xA002,0x6286,0x6285,0xA002,0x6283,0x6282, 0xA004,0xA002,0x6281,0x627D,0xA002,0x627B,0x627A,0xA008,0xA004,0xA002,0x6278,0x6277,0xA002,0x6275,0x6274,0xA004, 0xA002,0x6272,0x6271,0xA002,0x6268,0x6265,0xA010,0xA008,0xA004,0xA002,0x6264,0x6262,0xA002,0x6261,0x6260,0xA004, 0xA002,0x625F,0x625E,0xA002,0x625D,0x625C,0xA008,0xA004,0xA002,0x625A,0x6259,0xA002,0x6257,0x6256,0xA004,0xA002, 0x6255,0x6250,0xA000,0x624F,0xA080,0xA001,0xA03F,0xA01F,0xA00F,0xA007,0xA003,0xA001,0x624A,0xA002,0x6246,0x6245, 0xA004,0xA002,0x6244,0x6242,0xA002,0x623C,0x623B,0xA008,0xA004,0xA002,0x623A,0x6239,0xA002,0x6238,0x6236,0xA004, 0xA002,0x6235,0x6232,0xA002,0x6231,0x6230,0xA010,0xA008,0xA004,0xA002,0x622F,0x622D,0xA002,0x622B,0x6229,0xA004, 0xA002,0x6228,0x6227,0xA002,0x6226,0x6223,0xA008,0xA004,0xA002,0x6220,0x621E,0xA002,0x621D,0x621C,0xA004,0xA002, 0x6219,0x6214,0xA002,0x6213,0x6209,0xA020,0xA010,0xA008,0xA004,0xA002,0x6207,0x6205,0xA002,0x6204,0x6203,0xA004, 0xA002,0x6202,0x6201,0xA002,0x6200,0x61FE,0xA008,0xA004,0xA002,0x61FD,0x61FC,0xA002,0x61FB,0x61FA,0xA004,0xA002, 0x61F9,0x61F8,0xA002,0x61F7,0x61F6,0xA010,0xA008,0xA004,0xA002,0x61F4,0x61F3,0xA002,0x61F2,0x61F1,0xA004,0xA002, 0x61F0,0x61EF,0xA002,0x61EE,0x61ED,0xA008,0xA004,0xA002,0x61EC,0x61EB,0xA002,0x61EA,0x61E9,0xA004,0xA002,0x61E8, 0x61E7,0xA002,0x61E5,0x61E4,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x61E3,0xA002,0x61E2,0x61E1,0xA004,0xA002, 0x61E0,0x61DF,0xA002,0x61DE,0x61DD,0xA008,0xA004,0xA002,0x61DC,0x61DB,0xA002,0x61DA,0x61D9,0xA004,0xA002,0x61D8, 0x61D7,0xA002,0x61D6,0x61D5,0xA010,0xA008,0xA004,0xA002,0x61D3,0x61D0,0xA002,0x61CF,0x61CE,0xA004,0xA002,0x61CD, 0x61CC,0xA002,0x61C9,0x61C7,0xA008,0xA004,0xA002,0x61C6,0x61C5,0xA002,0x61C4,0x61C3,0xA004,0xA002,0x61C1,0x61C0, 0xA002,0x61BF,0x61BD,0xA020,0xA010,0xA008,0xA004,0xA002,0x61BC,0x61BB,0xA002,0x61BA,0x61B9,0xA004,0xA002,0x61B8, 0x61B6,0xA002,0x61B5,0x61B4,0xA008,0xA004,0xA002,0x61B3,0x61B2,0xA002,0x61B1,0x61B0,0xA004,0xA002,0x61AF,0x61AE, 0xA002,0x61AD,0x61AB,0xA010,0xA008,0xA004,0xA002,0x61AA,0x61A6,0xA002,0x61A5,0x61A4,0xA004,0xA002,0x61A3,0x61A2, 0xA002,0x61A1,0x61A0,0xA008,0xA004,0xA002,0x619F,0x619E,0xA002,0x619C,0x619B,0xA004,0xA002,0x619A,0x6199,0xA002, 0x6198,0x6197,0xA03F,0xA01F,0xA00F,0xA007,0xA003,0xA000,0x6196,0xA002,0x6195,0x6193,0xA004,0xA002,0x6192,0x6191, 0xA002,0x6190,0x618F,0xA008,0xA004,0xA002,0x618D,0x618C,0xA002,0x618A,0x6189,0xA004,0xA002,0x6188,0x6187,0xA002, 0x6186,0x6185,0xA010,0xA008,0xA004,0xA002,0x6184,0x6183,0xA002,0x6182,0x6181,0xA004,0xA002,0x6180,0x617F,0xA002, 0x617E,0x617D,0xA008,0xA004,0xA002,0x617C,0x617B,0xA002,0x617A,0x6179,0xA004,0xA002,0x6178,0x6176,0xA002,0x6174, 0x6173,0xA020,0xA010,0xA008,0xA004,0xA002,0x6172,0x6171,0xA002,0x616F,0x616E,0xA004,0xA002,0x616D,0x616C,0xA002, 0x616B,0x616A,0xA008,0xA004,0xA002,0x6169,0x6166,0xA002,0x6165,0x6164,0xA004,0xA002,0x6163,0x6161,0xA002,0x6160, 0x615F,0xA010,0xA008,0xA004,0xA002,0x615E,0x615C,0xA002,0x615B,0x615A,0xA004,0xA002,0x6159,0x6158,0xA002,0x6157, 0x6156,0xA008,0xA004,0xA002,0x6154,0x6153,0xA002,0x6152,0x6150,0xA004,0xA002,0x614F,0x614D,0xA002,0x614B,0x6149, 0xA180,0xA083,0xA007,0xA000,0xA000,0xA000,0xA000,0xA000,0x6147,0xA03C,0xA01C,0xA00C,0xA004,0xA001,0xA001,0x6146, 0xA004,0xA002,0x6145,0x6144,0xA002,0x6143,0x6142,0xA008,0xA004,0xA002,0x6141,0x6140,0xA002,0x613E,0x613D,0xA004, 0xA002,0x613C,0x613B,0xA002,0x613A,0x6139,0xA010,0xA008,0xA004,0xA002,0x6138,0x6137,0xA002,0x6136,0x6135,0xA004, 0xA002,0x6134,0x6133,0xA002,0x6132,0x6131,0xA008,0xA004,0xA002,0x6130,0x612F,0xA002,0x612E,0x612D,0xA004,0xA002, 0x612C,0x612A,0xA002,0x6129,0x6128,0xA020,0xA010,0xA008,0xA004,0xA002,0x6125,0x6122,0xA002,0x6121,0x611E,0xA004, 0xA002,0x611D,0x611C,0xA002,0x611B,0x6119,0xA008,0xA004,0xA002,0x6118,0x6117,0xA002,0x6116,0x6114,0xA004,0xA002, 0x6113,0x6112,0xA002,0x6111,0x6110,0xA010,0xA008,0xA004,0xA002,0x610C,0x610B,0xA002,0x610A,0x6107,0xA004,0xA002, 0x6105,0x6104,0xA002,0x6103,0x6102,0xA008,0xA004,0xA002,0x60FF,0x60FE,0xA002,0x60FD,0x60FC,0xA004,0xA002,0x60FB, 0x60F8,0xA002,0x60F7,0x60F5,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x60F2,0xA002,0x60F1,0x60EA,0xA004,0xA002, 0x60E5,0x60E4,0xA002,0x60E3,0x60E2,0xA008,0xA004,0xA002,0x60E1,0x60DE,0xA002,0x60DB,0x60D9,0xA004,0xA002,0x60D7, 0x60D6,0xA002,0x60D4,0x60D3,0xA010,0xA008,0xA004,0xA002,0x60D2,0x60D0,0xA002,0x60CF,0x60CE,0xA004,0xA002,0x60CD, 0x60CC,0xA002,0x60C9,0x60C8,0xA008,0xA004,0xA002,0x60C7,0x60C4,0xA002,0x60C3,0x60C2,0xA004,0xA002,0x60C1,0x60C0, 0xA002,0x60BF,0x60BE,0xA020,0xA010,0xA008,0xA004,0xA002,0x60BD,0x60BA,0xA002,0x60B9,0x60B7,0xA004,0xA002,0x60B6, 0x60B5,0xA002,0x60B3,0x60B0,0xA008,0xA004,0xA002,0x60AE,0x60AA,0xA002,0x60A9,0x60A7,0xA004,0xA002,0x60A5,0x60A4, 0xA002,0x60A2,0x60A1,0xA010,0xA008,0xA004,0xA002,0x609E,0x609C,0xA002,0x6099,0x6098,0xA004,0xA002,0x6097,0x6095, 0xA002,0x6093,0x6091,0xA008,0xA004,0xA002,0x6090,0x608F,0xA002,0x608E,0x608B,0xA004,0xA002,0x608A,0x6088,0xA002, 0x6087,0x6086,0xA03F,0xA01F,0xA00F,0xA007,0xA004,0xA002,0x6085,0x6082,0xA000,0x6081,0xA004,0xA002,0x6080,0x607E, 0xA002,0x6077,0x6075,0xA008,0xA004,0xA002,0x6074,0x6072,0xA002,0x6071,0x606E,0xA004,0xA002,0x6066,0x6065,0xA002, 0x6061,0x6060,0xA010,0xA008,0xA004,0xA002,0x605F,0x605E,0xA002,0x605C,0x605B,0xA004,0xA002,0x6058,0x6057,0xA002, 0x6056,0x6054,0xA008,0xA004,0xA002,0x6053,0x6051,0xA002,0x604F,0x604E,0xA004,0xA002,0x604C,0x604A,0xA002,0x6049, 0x6048,0xA020,0xA010,0xA008,0xA004,0xA002,0x6047,0x6046,0xA002,0x6045,0x6044,0xA004,0xA002,0x6040,0x603E,0xA002, 0x603D,0x603A,0xA008,0xA004,0xA002,0x6039,0x6038,0xA002,0x6037,0x6036,0xA004,0xA002,0x6034,0x6033,0xA002,0x6032, 0x6031,0xA010,0xA008,0xA004,0xA002,0x6030,0x602E,0xA002,0x602D,0x602C,0xA004,0xA002,0x6024,0x6023,0xA002,0x6022, 0x601F,0xA008,0xA004,0xA002,0x601E,0x601A,0xA002,0x6018,0x6017,0xA004,0xA002,0x6013,0x6011,0xA002,0x6010,0x600C, 0xA082,0xA00A,0xA000,0xA000,0xA000,0xA000,0xA002,0x600B,0xA002,0x6009,0x6008,0xA038,0xA018,0xA008,0xA001,0xA003, 0xA001,0x6007,0xA002,0x5FFC,0x5FFA,0xA008,0xA004,0xA002,0x5FF9,0x5FF7,0xA002,0x5FF6,0x5FF4,0xA004,0xA002,0x5FF3, 0x5FF2,0xA002,0x5FF0,0x5FEF,0xA010,0xA008,0xA004,0xA002,0x5FEC,0x5FE9,0xA002,0x5FE8,0x5FE6,0xA004,0xA002,0x5FE5, 0x5FE3,0xA002,0x5FE2,0x5FDF,0xA008,0xA004,0xA002,0x5FDE,0x5FDC,0xA002,0x5FDB,0x5FDA,0xA004,0xA002,0x5FD5,0x5FD4, 0xA002,0x5FD3,0x5FCE,0xA020,0xA010,0xA008,0xA004,0xA002,0x5FCB,0x5FCA,0xA002,0x5FC8,0x5FC7,0xA004,0xA002,0x5FC2, 0x5FC1,0xA002,0x5FC0,0x5FBF,0xA008,0xA004,0xA002,0x5FBE,0x5FBB,0xA002,0x5FBA,0x5FB9,0xA004,0xA002,0x5FB8,0x5FB6, 0xA002,0x5FB4,0x5FB3,0xA010,0xA008,0xA004,0xA002,0x5FB2,0x5FB1,0xA002,0x5FB0,0x5FAF,0xA004,0xA002,0x5FAC,0x5FAB, 0xA002,0x5FA9,0x5FA7,0xA008,0xA004,0xA002,0x5FA6,0x5FA5,0xA002,0x5FA4,0x5FA3,0xA004,0xA002,0x5FA2,0x5FA0,0xA002, 0x5F9F,0x5F9E,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5F9D,0xA002,0x5F9B,0x5F9A,0xA004,0xA002,0x5F96,0x5F94, 0xA002,0x5F93,0x5F91,0xA008,0xA004,0xA002,0x5F8F,0x5F8E,0xA002,0x5F8D,0x5F86,0xA004,0xA002,0x5F83,0x5F7F,0xA002, 0x5F7E,0x5F7D,0xA010,0xA008,0xA004,0xA002,0x5F7A,0x5F78,0xA002,0x5F76,0x5F75,0xA004,0xA002,0x5F74,0x5F72,0xA002, 0x5F6F,0x5F6E,0xA008,0xA004,0xA002,0x5F6B,0x5F68,0xA002,0x5F67,0x5F65,0xA004,0xA002,0x5F63,0x5F60,0xA002,0x5F5F, 0x5F5E,0xA020,0xA010,0xA008,0xA004,0xA002,0x5F5C,0x5F5B,0xA002,0x5F5A,0x5F59,0xA004,0xA002,0x5F54,0x5F51,0xA002, 0x5F4F,0x5F4E,0xA008,0xA004,0xA002,0x5F4D,0x5F4C,0xA002,0x5F4B,0x5F4A,0xA004,0xA002,0x5F49,0x5F48,0xA002,0x5F47, 0x5F46,0xA010,0xA008,0xA004,0xA002,0x5F45,0x5F44,0xA002,0x5F43,0x5F42,0xA004,0xA002,0x5F41,0x5F3F,0xA002,0x5F3E, 0x5F3D,0xA008,0xA004,0xA002,0x5F3B,0x5F38,0xA002,0x5F37,0x5F36,0xA004,0xA002,0x5F35,0x5F34,0xA002,0x5F33,0x5F32, 0xA03F,0xA01F,0xA00F,0xA008,0xA004,0xA002,0x5F30,0x5F2E,0xA002,0x5F2C,0x5F2B,0xA003,0xA000,0x5F28,0xA002,0x5F24, 0x5F23,0xA008,0xA004,0xA002,0x5F22,0x5F21,0xA002,0x5F1E,0x5F1D,0xA004,0xA002,0x5F1C,0x5F1A,0xA002,0x5F19,0x5F16, 0xA010,0xA008,0xA004,0xA002,0x5F14,0x5F12,0xA002,0x5F10,0x5F0E,0xA004,0xA002,0x5F0D,0x5F0C,0xA002,0x5F09,0x5F07, 0xA008,0xA004,0xA002,0x5F06,0x5F05,0xA002,0x5EFD,0x5EFC,0xA004,0xA002,0x5EFB,0x5EF9,0xA002,0x5EF8,0x5EF5,0xA020, 0xA010,0xA008,0xA004,0xA002,0x5EF3,0x5EF2,0xA002,0x5EF1,0x5EF0,0xA004,0xA002,0x5EEF,0x5EEE,0xA002,0x5EED,0x5EEC, 0xA008,0xA004,0xA002,0x5EEB,0x5EE9,0xA002,0x5EE7,0x5EE6,0xA004,0xA002,0x5EE5,0x5EE4,0xA002,0x5EE3,0x5EE2,0xA010, 0xA008,0xA004,0xA002,0x5EE1,0x5EE0,0xA002,0x5EDF,0x5EDE,0xA004,0xA002,0x5EDD,0x5EDC,0xA002,0x5EDA,0x5ED9,0xA008, 0xA004,0xA002,0x5ED8,0x5ED7,0xA002,0x5ED5,0x5ED4,0xA004,0xA002,0x5ED0,0x5ECF,0xA002,0x5ECE,0x5ECD,0xABF6,0xA5FB, 0xA2FC,0xA17C,0xA07F,0xA00E,0xA000,0xA000,0xA000,0xA006,0xA002,0x5ECC,0xA002,0x5ECB,0x5EC8,0xA000,0xA002,0x5EC7, 0x5EC6,0xA031,0xA011,0xA001,0xA008,0xA004,0xA002,0x5EC5,0x5EC4,0xA002,0x5EC3,0x5EC2,0xA004,0xA002,0x5EC1,0x5EC0, 0xA002,0x5EBF,0x5EBD,0xA010,0xA008,0xA004,0xA002,0x5EBC,0x5EBB,0xA002,0x5EBA,0x5EB4,0xA004,0xA002,0x5EB2,0x5EB1, 0xA002,0x5EB0,0x5EAF,0xA008,0xA004,0xA002,0x5EAE,0x5EAC,0xA002,0x5EAB,0x5EAA,0xA004,0xA002,0x5EA9,0x5EA8,0xA002, 0x5EA4,0x5EA3,0xA020,0xA010,0xA008,0xA004,0xA002,0x5EA2,0x5EA1,0xA002,0x5E9D,0x5E9B,0xA004,0xA002,0x5E98,0x5E92, 0xA002,0x5E8E,0x5E8D,0xA008,0xA004,0xA002,0x5E8C,0x5E89,0xA002,0x5E88,0x5E85,0xA004,0xA002,0x5E83,0x5E82,0xA002, 0x5E81,0x5E7E,0xA010,0xA008,0xA004,0xA002,0x5E79,0x5E77,0xA002,0x5E75,0x5E71,0xA004,0xA002,0x5E70,0x5E6F,0xA002, 0x5E6E,0x5E6D,0xA008,0xA004,0xA002,0x5E6C,0x5E6B,0xA002,0x5E6A,0x5E69,0xA004,0xA002,0x5E68,0x5E67,0xA002,0x5E66, 0x5E65,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5E64,0xA002,0x5E63,0x5E60,0xA004,0xA002,0x5E5F,0x5E5D,0xA002, 0x5E5C,0x5E5A,0xA008,0xA004,0xA002,0x5E59,0x5E58,0xA002,0x5E57,0x5E56,0xA004,0xA002,0x5E53,0x5E52,0xA002,0x5E51, 0x5E50,0xA010,0xA008,0xA004,0xA002,0x5E4F,0x5E4E,0xA002,0x5E4D,0x5E4B,0xA004,0xA002,0x5E4A,0x5E49,0xA002,0x5E48, 0x5E47,0xA008,0xA004,0xA002,0x5E46,0x5E43,0xA002,0x5E41,0x5E40,0xA004,0xA002,0x5E3F,0x5E3E,0xA002,0x5E3A,0x5E39, 0xA020,0xA010,0xA008,0xA004,0xA002,0x5E36,0x5E35,0xA002,0x5E34,0x5E33,0xA004,0xA002,0x5E32,0x5E30,0xA002,0x5E2F, 0x5E2C,0xA008,0xA004,0xA002,0x5E2B,0x5E2A,0xA002,0x5E29,0x5E28,0xA004,0xA002,0x5E25,0x5E24,0xA002,0x5E23,0x5E22, 0xA010,0xA008,0xA004,0xA002,0x5E21,0x5E20,0xA002,0x5E1F,0x5E1E,0xA004,0xA002,0x5E17,0x5E13,0xA002,0x5E12,0x5E0E, 0xA008,0xA004,0xA002,0x5E0D,0x5E0B,0xA002,0x5E0A,0x5E09,0xA004,0xA002,0x5E07,0x5E04,0xA002,0x5E00,0x5DFF,0xA03F, 0xA01F,0xA010,0xA008,0xA004,0xA002,0x5DFC,0x5DFB,0xA002,0x5DFA,0x5DF9,0xA004,0xA002,0x5DF8,0x5DF6,0xA002,0x5DF5, 0x5DF0,0xA007,0xA003,0xA001,0x5DED,0xA002,0x5DEC,0x5DEA,0xA004,0xA002,0x5DE4,0x5DE3,0xA002,0x5DE0,0x5DDF,0xA010, 0xA008,0xA004,0xA002,0x5DDC,0x5DDA,0xA002,0x5DD9,0x5DD8,0xA004,0xA002,0x5DD7,0x5DD6,0xA002,0x5DD5,0x5DD4,0xA008, 0xA004,0xA002,0x5DD3,0x5DD2,0xA002,0x5DD1,0x5DD0,0xA004,0xA002,0x5DCF,0x5DCE,0xA002,0x5DCC,0x5DCB,0xA020,0xA010, 0xA008,0xA004,0xA002,0x5DCA,0x5DC9,0xA002,0x5DC8,0x5DC7,0xA004,0xA002,0x5DC6,0x5DC4,0xA002,0x5DC3,0x5DC2,0xA008, 0xA004,0xA002,0x5DC1,0x5DC0,0xA002,0x5DBF,0x5DBE,0xA004,0xA002,0x5DBD,0x5DBC,0xA002,0x5DBB,0x5DBA,0xA010,0xA008, 0xA004,0xA002,0x5DB9,0x5DB8,0xA002,0x5DB6,0x5DB5,0xA004,0xA002,0x5DB4,0x5DB3,0xA002,0x5DB2,0x5DB1,0xA008,0xA004, 0xA002,0x5DB0,0x5DAF,0xA002,0x5DAE,0x5DAD,0xA004,0xA002,0x5DAC,0x5DAB,0xA002,0x5DAA,0x5DA9,0xA083,0xA015,0xA000, 0xA000,0xA00E,0xA006,0xA002,0x5DA8,0xA002,0x5DA7,0x5DA6,0xA004,0xA002,0x5DA5,0x5DA4,0xA002,0x5DA3,0x5DA2,0xA000, 0xA000,0xA000,0x5DA1,0xA02E,0xA00E,0xA001,0xA005,0xA001,0xA002,0x5DA0,0x5D9F,0xA004,0xA002,0x5D9E,0x5D9C,0xA002, 0x5D9B,0x5D9A,0xA010,0xA008,0xA004,0xA002,0x5D98,0x5D97,0xA002,0x5D96,0x5D95,0xA004,0xA002,0x5D94,0x5D93,0xA002, 0x5D92,0x5D91,0xA008,0xA004,0xA002,0x5D90,0x5D8F,0xA002,0x5D8E,0x5D8D,0xA004,0xA002,0x5D8C,0x5D8B,0xA002,0x5D8A, 0x5D89,0xA020,0xA010,0xA008,0xA004,0xA002,0x5D88,0x5D87,0xA002,0x5D86,0x5D85,0xA004,0xA002,0x5D84,0x5D83,0xA002, 0x5D81,0x5D80,0xA008,0xA004,0xA002,0x5D7F,0x5D7E,0xA002,0x5D7D,0x5D7C,0xA004,0xA002,0x5D7B,0x5D7A,0xA002,0x5D79, 0x5D78,0xA010,0xA008,0xA004,0xA002,0x5D77,0x5D76,0xA002,0x5D75,0x5D73,0xA004,0xA002,0x5D72,0x5D71,0xA002,0x5D70, 0x5D6E,0xA008,0xA004,0xA002,0x5D6D,0x5D6A,0xA002,0x5D68,0x5D67,0xA004,0xA002,0x5D66,0x5D65,0xA002,0x5D64,0x5D63, 0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5D62,0xA002,0x5D61,0x5D60,0xA004,0xA002,0x5D5F,0x5D5E,0xA002,0x5D5C, 0x5D5A,0xA008,0xA004,0xA002,0x5D59,0x5D57,0xA002,0x5D56,0x5D55,0xA004,0xA002,0x5D54,0x5D53,0xA002,0x5D52,0x5D51, 0xA010,0xA008,0xA004,0xA002,0x5D50,0x5D4F,0xA002,0x5D4E,0x5D4D,0xA004,0xA002,0x5D49,0x5D48,0xA002,0x5D46,0x5D45, 0xA008,0xA004,0xA002,0x5D44,0x5D43,0xA002,0x5D42,0x5D41,0xA004,0xA002,0x5D40,0x5D3F,0xA002,0x5D3C,0x5D3B,0xA020, 0xA010,0xA008,0xA004,0xA002,0x5D3A,0x5D39,0xA002,0x5D38,0x5D37,0xA004,0xA002,0x5D36,0x5D35,0xA002,0x5D33,0x5D32, 0xA008,0xA004,0xA002,0x5D31,0x5D30,0xA002,0x5D2F,0x5D2C,0xA004,0xA002,0x5D2B,0x5D2A,0xA002,0x5D28,0x5D25,0xA010, 0xA008,0xA004,0xA002,0x5D23,0x5D22,0xA002,0x5D21,0x5D20,0xA004,0xA002,0x5D1F,0x5D1D,0xA002,0x5D1C,0x5D1A,0xA008, 0xA004,0xA002,0x5D19,0x5D18,0xA002,0x5D17,0x5D15,0xA004,0xA002,0x5D13,0x5D12,0xA002,0x5D11,0x5D10,0xA03F,0xA01F, 0xA010,0xA008,0xA004,0xA002,0x5D0F,0x5D0D,0xA002,0x5D0C,0x5D0B,0xA004,0xA002,0x5D0A,0x5D09,0xA002,0x5D08,0x5D05, 0xA007,0xA004,0xA002,0x5D04,0x5D01,0xA001,0x5D00,0xA004,0xA002,0x5CFF,0x5CFE,0xA002,0x5CFD,0x5CFC,0xA010,0xA008, 0xA004,0xA002,0x5CFA,0x5CF9,0xA002,0x5CF8,0x5CF7,0xA004,0xA002,0x5CF6,0x5CF5,0xA002,0x5CF4,0x5CF3,0xA008,0xA004, 0xA002,0x5CF2,0x5CF1,0xA002,0x5CEF,0x5CEE,0xA004,0xA002,0x5CEC,0x5CEB,0xA002,0x5CE9,0x5CE7,0xA020,0xA010,0xA008, 0xA004,0xA002,0x5CE3,0x5CE2,0xA002,0x5CE0,0x5CDF,0xA004,0xA002,0x5CDE,0x5CDD,0xA002,0x5CDC,0x5CDB,0xA008,0xA004, 0xA002,0x5CDA,0x5CD8,0xA002,0x5CD7,0x5CD6,0xA004,0xA002,0x5CD5,0x5CD4,0xA002,0x5CD3,0x5CD1,0xA010,0xA008,0xA004, 0xA002,0x5CD0,0x5CCF,0xA002,0x5CCE,0x5CCD,0xA004,0xA002,0x5CCC,0x5CCA,0xA002,0x5CC9,0x5CC8,0xA008,0xA004,0xA002, 0x5CC7,0x5CC6,0xA002,0x5CC5,0x5CC3,0xA004,0xA002,0x5CC2,0x5CC0,0xA002,0x5CBE,0x5CBC,0xA17F,0xA082,0xA018,0xA000, 0xA000,0xA00E,0xA006,0xA002,0x5CBB,0xA002,0x5CBA,0x5CB9,0xA004,0xA002,0x5CB6,0x5CB4,0xA002,0x5CB2,0x5CB0,0xA000, 0xA004,0xA002,0x5CAF,0x5CAE,0xA000,0x5CAA,0xA02A,0xA00A,0xA001,0xA001,0xA004,0xA002,0x5CA8,0x5CA7,0xA002,0x5CA6, 0x5CA5,0xA010,0xA008,0xA004,0xA002,0x5CA4,0x5CA1,0xA002,0x5CA0,0x5C9F,0xA004,0xA002,0x5C9E,0x5C9D,0xA002,0x5C95, 0x5C93,0xA008,0xA004,0xA002,0x5C92,0x5C8F,0xA002,0x5C8E,0x5C8B,0xA004,0xA002,0x5C8A,0x5C89,0xA002,0x5C87,0x5C86, 0xA020,0xA010,0xA008,0xA004,0xA002,0x5C85,0x5C84,0xA002,0x5C83,0x5C80,0xA004,0xA002,0x5C7E,0x5C7D,0xA002,0x5C7C, 0x5C7B,0xA008,0xA004,0xA002,0x5C78,0x5C77,0xA002,0x5C76,0x5C75,0xA004,0xA002,0x5C74,0x5C73,0xA002,0x5C72,0x5C70, 0xA010,0xA008,0xA004,0xA002,0x5C6D,0x5C6C,0xA002,0x5C6B,0x5C6A,0xA004,0xA002,0x5C69,0x5C68,0xA002,0x5C67,0x5C64, 0xA008,0xA004,0xA002,0x5C62,0x5C5F,0xA002,0x5C5D,0x5C5C,0xA004,0xA002,0x5C5B,0x5C5A,0xA002,0x5C58,0x5C57,0xA07E, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5C56,0xA002,0x5C54,0x5C53,0xA004,0xA002,0x5C52,0x5C4D,0xA002,0x5C4C,0x5C47, 0xA008,0xA004,0xA002,0x5C46,0x5C44,0xA002,0x5C43,0x5C37,0xA004,0xA002,0x5C36,0x5C35,0xA002,0x5C33,0x5C32,0xA010, 0xA008,0xA004,0xA002,0x5C30,0x5C2F,0xA002,0x5C2E,0x5C2D,0xA004,0xA002,0x5C2B,0x5C2A,0xA002,0x5C29,0x5C28,0xA008, 0xA004,0xA002,0x5C26,0x5C23,0xA002,0x5C21,0x5C20,0xA004,0xA002,0x5C1F,0x5C1E,0xA002,0x5C1B,0x5C19,0xA020,0xA010, 0xA008,0xA004,0xA002,0x5C17,0x5C13,0xA002,0x5C12,0x5C10,0xA004,0xA002,0x5C0E,0x5C0D,0xA002,0x5C0C,0x5C0B,0xA008, 0xA004,0xA002,0x5C08,0x5C07,0xA002,0x5C05,0x5C03,0xA004,0xA002,0x5C02,0x5C00,0xA002,0x5BFE,0x5BFD,0xA010,0xA008, 0xA004,0xA002,0x5BF7,0x5BF6,0xA002,0x5BF5,0x5BF4,0xA004,0xA002,0x5BF3,0x5BF2,0xA002,0x5BF1,0x5BEF,0xA008,0xA004, 0xA002,0x5BED,0x5BEC,0xA002,0x5BEB,0x5BEA,0xA004,0xA002,0x5BE9,0x5BE7,0xA002,0x5BE6,0x5BE3,0xA03F,0xA01F,0xA010, 0xA008,0xA004,0xA002,0x5BE2,0x5BE0,0xA002,0x5BDC,0x5BDB,0xA004,0xA002,0x5BDA,0x5BD9,0xA002,0x5BD8,0x5BD7,0xA008, 0xA004,0xA002,0x5BD6,0x5BD5,0xA002,0x5BD4,0x5BD1,0xA003,0xA001,0x5BCF,0xA002,0x5BCE,0x5BCD,0xA010,0xA008,0xA004, 0xA002,0x5BCB,0x5BCA,0xA002,0x5BC9,0x5BC8,0xA004,0xA002,0x5BC3,0x5BC1,0xA002,0x5BC0,0x5BBC,0xA008,0xA004,0xA002, 0x5BBB,0x5BBA,0xA002,0x5BB7,0x5BB2,0xA004,0xA002,0x5BB1,0x5BAF,0xA002,0x5BAE,0x5BAD,0xA020,0xA010,0xA008,0xA004, 0xA002,0x5BAC,0x5BA9,0xA002,0x5BA8,0x5BA7,0xA004,0xA002,0x5B9F,0x5B96,0xA002,0x5B94,0x5B92,0xA008,0xA004,0xA002, 0x5B91,0x5B90,0xA002,0x5B8E,0x5B8D,0xA004,0xA002,0x5B8A,0x5B86,0xA002,0x5B82,0x5B7F,0xA010,0xA008,0xA004,0xA002, 0x5B7E,0x5B7C,0xA002,0x5B7B,0x5B79,0xA004,0xA002,0x5B78,0x5B77,0xA002,0x5B76,0x5B74,0xA008,0xA004,0xA002,0x5B72, 0x5B6F,0xA002,0x5B6E,0x5B6D,0xA004,0xA002,0x5B6B,0x5B68,0xA002,0x5B67,0x5B61,0xA083,0xA01C,0xA000,0xA000,0xA00E, 0xA006,0xA002,0x5B60,0xA002,0x5B5E,0x5B56,0xA004,0xA002,0x5B52,0x5B4F,0xA002,0x5B4E,0x5B4D,0xA008,0xA004,0xA002, 0x5B4C,0x5B4B,0xA002,0x5B4A,0x5B49,0xA000,0xA000,0x5B48,0xA027,0xA007,0xA001,0xA001,0xA001,0xA002,0x5B47,0x5B46, 0xA010,0xA008,0xA004,0xA002,0x5B45,0x5B44,0xA002,0x5B43,0x5B42,0xA004,0xA002,0x5B41,0x5B3F,0xA002,0x5B3E,0x5B3D, 0xA008,0xA004,0xA002,0x5B3C,0x5B3B,0xA002,0x5B3A,0x5B39,0xA004,0xA002,0x5B38,0x5B36,0xA002,0x5B35,0x5B33,0xA020, 0xA010,0xA008,0xA004,0xA002,0x5B31,0x5B30,0xA002,0x5B2F,0x5B2E,0xA004,0xA002,0x5B2D,0x5B2C,0xA002,0x5B2B,0x5B2A, 0xA008,0xA004,0xA002,0x5B29,0x5B28,0xA002,0x5B27,0x5B26,0xA004,0xA002,0x5B25,0x5B24,0xA002,0x5B23,0x5B22,0xA010, 0xA008,0xA004,0xA002,0x5B21,0x5B20,0xA002,0x5B1F,0x5B1E,0xA004,0xA002,0x5B1D,0x5B1C,0xA002,0x5B1B,0x5B1A,0xA008, 0xA004,0xA002,0x5B19,0x5B18,0xA002,0x5B15,0x5B14,0xA004,0xA002,0x5B13,0x5B12,0xA002,0x5B11,0x5B10,0xA07E,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x5B0F,0xA002,0x5B0E,0x5B0D,0xA004,0xA002,0x5B0C,0x5B0B,0xA002,0x5B0A,0x5B08,0xA008, 0xA004,0xA002,0x5B07,0x5B06,0xA002,0x5B05,0x5B04,0xA004,0xA002,0x5B03,0x5B02,0xA002,0x5B01,0x5B00,0xA010,0xA008, 0xA004,0xA002,0x5AFF,0x5AFE,0xA002,0x5AFD,0x5AFC,0xA004,0xA002,0x5AFB,0x5AFA,0xA002,0x5AF9,0x5AF8,0xA008,0xA004, 0xA002,0x5AF7,0x5AF6,0xA002,0x5AF5,0x5AF4,0xA004,0xA002,0x5AF3,0x5AF2,0xA002,0x5AF0,0x5AEF,0xA020,0xA010,0xA008, 0xA004,0xA002,0x5AEE,0x5AED,0xA002,0x5AEC,0x5AEA,0xA004,0xA002,0x5AE8,0x5AE7,0xA002,0x5AE5,0x5AE4,0xA008,0xA004, 0xA002,0x5AE2,0x5ADF,0xA002,0x5ADE,0x5ADD,0xA004,0xA002,0x5ADB,0x5ADA,0xA002,0x5AD9,0x5AD7,0xA010,0xA008,0xA004, 0xA002,0x5AD5,0x5AD3,0xA002,0x5AD1,0x5AD0,0xA004,0xA002,0x5ACF,0x5ACE,0xA002,0x5ACD,0x5ACB,0xA008,0xA004,0xA002, 0x5ACA,0x5AC8,0xA002,0x5AC7,0x5AC6,0xA004,0xA002,0x5AC5,0x5AC4,0xA002,0x5AC3,0x5AC0,0xA03F,0xA01F,0xA010,0xA008, 0xA004,0xA002,0x5ABF,0x5ABD,0xA002,0x5ABC,0x5ABB,0xA004,0xA002,0x5ABA,0x5AB9,0xA002,0x5AB7,0x5AB6,0xA008,0xA004, 0xA002,0x5AB4,0x5AB1,0xA002,0x5AB0,0x5AAF,0xA004,0xA002,0x5AAE,0x5AAD,0xA001,0x5AAC,0xA010,0xA008,0xA004,0xA002, 0x5AAB,0x5AA9,0xA002,0x5AA8,0x5AA7,0xA004,0xA002,0x5AA6,0x5AA5,0xA002,0x5AA4,0x5AA3,0xA008,0xA004,0xA002,0x5AA2, 0x5AA1,0xA002,0x5AA0,0x5A9F,0xA004,0xA002,0x5A9E,0x5A9D,0xA002,0x5A9C,0x5A99,0xA020,0xA010,0xA008,0xA004,0xA002, 0x5A98,0x5A97,0xA002,0x5A96,0x5A95,0xA004,0xA002,0x5A94,0x5A93,0xA002,0x5A91,0x5A90,0xA008,0xA004,0xA002,0x5A8F, 0x5A8E,0xA002,0x5A8D,0x5A8C,0xA004,0xA002,0x5A8B,0x5A8A,0xA002,0x5A89,0x5A88,0xA010,0xA008,0xA004,0xA002,0x5A87, 0x5A86,0xA002,0x5A85,0x5A84,0xA004,0xA002,0x5A83,0x5A82,0xA002,0x5A81,0x5A80,0xA008,0xA004,0xA002,0x5A7E,0x5A7D, 0xA002,0x5A7C,0x5A7B,0xA004,0xA002,0x5A79,0x5A78,0xA002,0x5A73,0x5A72,0xA2FC,0xA17C,0xA07F,0xA01F,0xA000,0xA000, 0xA00E,0xA006,0xA002,0x5A71,0xA002,0x5A70,0x5A6F,0xA004,0xA002,0x5A6E,0x5A6D,0xA002,0x5A6C,0x5A6B,0xA008,0xA004, 0xA002,0x5A69,0x5A68,0xA002,0x5A66,0x5A65,0xA004,0xA002,0x5A64,0x5A63,0xA000,0x5A61,0xA020,0xA001,0xA00F,0xA007, 0xA003,0xA001,0x5A60,0xA002,0x5A5F,0x5A5E,0xA004,0xA002,0x5A5D,0x5A5C,0xA002,0x5A5B,0x5A59,0xA008,0xA004,0xA002, 0x5A58,0x5A57,0xA002,0x5A56,0x5A54,0xA004,0xA002,0x5A53,0x5A52,0xA002,0x5A51,0x5A50,0xA020,0xA010,0xA008,0xA004, 0xA002,0x5A4F,0x5A4E,0xA002,0x5A4D,0x5A4C,0xA004,0xA002,0x5A4B,0x5A48,0xA002,0x5A47,0x5A45,0xA008,0xA004,0xA002, 0x5A44,0x5A43,0xA002,0x5A42,0x5A41,0xA004,0xA002,0x5A3F,0x5A3E,0xA002,0x5A3D,0x5A3B,0xA010,0xA008,0xA004,0xA002, 0x5A3A,0x5A39,0xA002,0x5A38,0x5A37,0xA004,0xA002,0x5A35,0x5A33,0xA002,0x5A30,0x5A2F,0xA008,0xA004,0xA002,0x5A2E, 0x5A2D,0xA002,0x5A2C,0x5A2B,0xA004,0xA002,0x5A2A,0x5A28,0xA002,0x5A27,0x5A26,0xA07E,0xA03E,0xA01E,0xA00E,0xA006, 0xA002,0x5A24,0xA002,0x5A22,0x5A21,0xA004,0xA002,0x5A1E,0x5A1D,0xA002,0x5A1B,0x5A1A,0xA008,0xA004,0xA002,0x5A19, 0x5A17,0xA002,0x5A16,0x5A15,0xA004,0xA002,0x5A14,0x5A12,0xA002,0x5A10,0x5A0F,0xA010,0xA008,0xA004,0xA002,0x5A0E, 0x5A0D,0xA002,0x5A0B,0x5A0A,0xA004,0xA002,0x5A02,0x5A00,0xA002,0x59FE,0x59FD,0xA008,0xA004,0xA002,0x59FC,0x59FA, 0xA002,0x59F8,0x59F7,0xA004,0xA002,0x59F6,0x59F5,0xA002,0x59F4,0x59F3,0xA020,0xA010,0xA008,0xA004,0xA002,0x59F2, 0x59F1,0xA002,0x59F0,0x59EF,0xA004,0xA002,0x59EE,0x59ED,0xA002,0x59EB,0x59EA,0xA008,0xA004,0xA002,0x59E9,0x59E7, 0xA002,0x59E6,0x59E4,0xA004,0xA002,0x59E2,0x59E1,0xA002,0x59E0,0x59DF,0xA010,0xA008,0xA004,0xA002,0x59DE,0x59DB, 0xA002,0x59D9,0x59D6,0xA004,0xA002,0x59D5,0x59CF,0xA002,0x59CE,0x59CD,0xA008,0xA004,0xA002,0x59CC,0x59C9,0xA002, 0x59C8,0x59C7,0xA004,0xA002,0x59C5,0x59C4,0xA002,0x59C3,0x59C2,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x59C1, 0x59C0,0xA002,0x59BF,0x59BD,0xA004,0xA002,0x59BC,0x59BA,0xA002,0x59B8,0x59B7,0xA008,0xA004,0xA002,0x59B6,0x59B5, 0xA002,0x59B4,0x59B3,0xA004,0xA002,0x59B1,0x59B0,0xA002,0x59AD,0x59AC,0xA00F,0xA007,0xA003,0xA000,0x59A7,0xA002, 0x59A6,0x59A2,0xA004,0xA002,0x59A1,0x59A0,0xA002,0x599F,0x599D,0xA008,0xA004,0xA002,0x599C,0x599B,0xA002,0x599A, 0x5998,0xA004,0xA002,0x5995,0x5994,0xA002,0x5991,0x5990,0xA020,0xA010,0xA008,0xA004,0xA002,0x598F,0x598E,0xA002, 0x598C,0x598B,0xA004,0xA002,0x5989,0x5985,0xA002,0x5980,0x597F,0xA008,0xA004,0xA002,0x597E,0x597C,0xA002,0x597B, 0x597A,0xA004,0xA002,0x5977,0x5975,0xA002,0x5972,0x5971,0xA010,0xA008,0xA004,0xA002,0x5970,0x596F,0xA002,0x596E, 0x596D,0xA004,0xA002,0x596C,0x596B,0xA002,0x596A,0x5969,0xA008,0xA004,0xA002,0x5968,0x5967,0xA002,0x5966,0x5964, 0xA004,0xA002,0x5963,0x5961,0xA002,0x595F,0x595E,0xA083,0xA026,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x595D,0xA002, 0x595C,0x595B,0xA004,0xA002,0x5959,0x5953,0xA002,0x5952,0x5950,0xA008,0xA004,0xA002,0x594D,0x594C,0xA002,0x594A, 0x5946,0xA004,0xA002,0x5945,0x5943,0xA002,0x5940,0x593F,0xA000,0xA000,0xA000,0xA002,0x593E,0x593D,0xA01D,0xA001, 0xA00C,0xA004,0xA001,0xA001,0x593B,0xA004,0xA002,0x5936,0x5935,0xA002,0x5933,0x5932,0xA008,0xA004,0xA002,0x5930, 0x592C,0xA002,0x5928,0x5926,0xA004,0xA002,0x5923,0x5922,0xA002,0x5921,0x5920,0xA020,0xA010,0xA008,0xA004,0xA002, 0x591E,0x591D,0xA002,0x591B,0x5918,0xA004,0xA002,0x5917,0x5913,0xA002,0x5912,0x5911,0xA008,0xA004,0xA002,0x5910, 0x590E,0xA002,0x590C,0x590B,0xA004,0xA002,0x590A,0x5909,0xA002,0x5908,0x5906,0xA010,0xA008,0xA004,0xA002,0x5905, 0x5903,0xA002,0x5901,0x5900,0xA004,0xA002,0x58FF,0x58FE,0xA002,0x58FD,0x58FC,0xA008,0xA004,0xA002,0x58FB,0x58FA, 0xA002,0x58F8,0x58F7,0xA004,0xA002,0x58F5,0x58F4,0xA002,0x58F2,0x58F1,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002, 0x58EF,0xA002,0x58ED,0x58EA,0xA004,0xA002,0x58E9,0x58E8,0xA002,0x58E7,0x58E6,0xA008,0xA004,0xA002,0x58E5,0x58E3, 0xA002,0x58E2,0x58E1,0xA004,0xA002,0x58E0,0x58DF,0xA002,0x58DE,0x58DD,0xA010,0xA008,0xA004,0xA002,0x58DC,0x58DB, 0xA002,0x58DA,0x58D9,0xA004,0xA002,0x58D8,0x58D7,0xA002,0x58D6,0x58D4,0xA008,0xA004,0xA002,0x58D3,0x58D2,0xA002, 0x58D0,0x58CF,0xA004,0xA002,0x58CE,0x58CD,0xA002,0x58CC,0x58CB,0xA020,0xA010,0xA008,0xA004,0xA002,0x58CA,0x58C9, 0xA002,0x58C8,0x58C7,0xA004,0xA002,0x58C6,0x58C4,0xA002,0x58C3,0x58C2,0xA008,0xA004,0xA002,0x58C0,0x58BF,0xA002, 0x58BE,0x58BD,0xA004,0xA002,0x58BB,0x58BA,0xA002,0x58B9,0x58B8,0xA010,0xA008,0xA004,0xA002,0x58B7,0x58B6,0xA002, 0x58B5,0x58B4,0xA004,0xA002,0x58B3,0x58B2,0xA002,0x58B1,0x58B0,0xA008,0xA004,0xA002,0x58AF,0x58AE,0xA002,0x58AD, 0x58AC,0xA004,0xA002,0x58AB,0x58AA,0xA002,0x58A7,0x58A6,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x58A5,0x58A4, 0xA002,0x58A3,0x58A2,0xA004,0xA002,0x58A1,0x58A0,0xA002,0x589D,0x589C,0xA008,0xA004,0xA002,0x589B,0x5898,0xA002, 0x5897,0x5896,0xA004,0xA002,0x5895,0x5894,0xA002,0x5891,0x5890,0xA00F,0xA007,0xA004,0xA002,0x588F,0x588E,0xA000, 0x588D,0xA004,0xA002,0x588C,0x588B,0xA002,0x588A,0x5888,0xA008,0xA004,0xA002,0x5887,0x5886,0xA002,0x5884,0x5882, 0xA004,0xA002,0x587F,0x587D,0xA002,0x587C,0x587B,0xA020,0xA010,0xA008,0xA004,0xA002,0x587A,0x5879,0xA002,0x5878, 0x5877,0xA004,0xA002,0x5876,0x5875,0xA002,0x5874,0x5873,0xA008,0xA004,0xA002,0x5872,0x5871,0xA002,0x5870,0x586F, 0xA004,0xA002,0x586E,0x586D,0xA002,0x586A,0x5869,0xA010,0xA008,0xA004,0xA002,0x5868,0x5867,0xA002,0x5866,0x5864, 0xA004,0xA002,0x5863,0x5862,0xA002,0x5861,0x5860,0xA008,0xA004,0xA002,0x585F,0x585D,0xA002,0x585C,0x585B,0xA004, 0xA002,0x585A,0x5859,0xA002,0x5857,0x5856,0xA17F,0xA082,0xA029,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x5855,0xA002, 0x5853,0x5852,0xA004,0xA002,0x5850,0x584F,0xA002,0x584E,0x584B,0xA008,0xA004,0xA002,0x584A,0x5849,0xA002,0x5848, 0x5847,0xA004,0xA002,0x5846,0x5845,0xA002,0x5843,0x5842,0xA000,0xA000,0xA004,0xA002,0x5841,0x5840,0xA002,0x583F, 0x583E,0xA019,0xA001,0xA008,0xA001,0xA003,0xA001,0x583D,0xA002,0x583C,0x583B,0xA008,0xA004,0xA002,0x583A,0x5839, 0xA002,0x5838,0x5837,0xA004,0xA002,0x5836,0x5834,0xA002,0x5833,0x5832,0xA020,0xA010,0xA008,0xA004,0xA002,0x5831, 0x582F,0xA002,0x582E,0x582D,0xA004,0xA002,0x582C,0x582B,0xA002,0x5829,0x5828,0xA008,0xA004,0xA002,0x5827,0x5826, 0xA002,0x5825,0x5823,0xA004,0xA002,0x5822,0x581F,0xA002,0x581D,0x581C,0xA010,0xA008,0xA004,0xA002,0x581B,0x581A, 0xA002,0x5818,0x5817,0xA004,0xA002,0x5816,0x5814,0xA002,0x5813,0x5812,0xA008,0xA004,0xA002,0x5810,0x580F,0xA002, 0x580E,0x580C,0xA004,0xA002,0x580A,0x5809,0xA002,0x5808,0x5805,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5804, 0xA002,0x5803,0x5801,0xA004,0xA002,0x57FF,0x57FE,0xA002,0x57FC,0x57FB,0xA008,0xA004,0xA002,0x57F7,0x57F6,0xA002, 0x57F5,0x57F3,0xA004,0xA002,0x57F2,0x57F1,0xA002,0x57F0,0x57EE,0xA010,0xA008,0xA004,0xA002,0x57EC,0x57EB,0xA002, 0x57EA,0x57E9,0xA004,0xA002,0x57E8,0x57E7,0xA002,0x57E6,0x57E5,0xA008,0xA004,0xA002,0x57E3,0x57E2,0xA002,0x57E1, 0x57DE,0xA004,0xA002,0x57DC,0x57DB,0xA002,0x57D7,0x57D6,0xA020,0xA010,0xA008,0xA004,0xA002,0x57D3,0x57D1,0xA002, 0x57D0,0x57CD,0xA004,0xA002,0x57CC,0x57CA,0xA002,0x57C9,0x57C8,0xA008,0xA004,0xA002,0x57C7,0x57C6,0xA002,0x57C5, 0x57C4,0xA004,0xA002,0x57C1,0x57C0,0xA002,0x57BF,0x57BE,0xA010,0xA008,0xA004,0xA002,0x57BD,0x57BC,0xA002,0x57BB, 0x57BA,0xA004,0xA002,0x57B9,0x57B7,0xA002,0x57B6,0x57B5,0xA008,0xA004,0xA002,0x57B3,0x57B1,0xA002,0x57B0,0x57AF, 0xA004,0xA002,0x57AC,0x57AA,0xA002,0x57A8,0x57A5,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x579F,0x579E,0xA002, 0x579D,0x579C,0xA004,0xA002,0x579A,0x5799,0xA002,0x5798,0x5797,0xA008,0xA004,0xA002,0x5796,0x5795,0xA002,0x5794, 0x5791,0xA004,0xA002,0x5790,0x578F,0xA002,0x578E,0x578D,0xA00F,0xA008,0xA004,0xA002,0x578A,0x5789,0xA002,0x5788, 0x5787,0xA003,0xA000,0x5781,0xA002,0x5780,0x577F,0xA008,0xA004,0xA002,0x577E,0x577D,0xA002,0x577A,0x5779,0xA004, 0xA002,0x5778,0x5775,0xA002,0x5774,0x5772,0xA020,0xA010,0xA008,0xA004,0xA002,0x5771,0x5770,0xA002,0x576E,0x576C, 0xA004,0xA002,0x5767,0x5765,0xA002,0x5763,0x5762,0xA008,0xA004,0xA002,0x5759,0x5758,0xA002,0x5756,0x5755,0xA004, 0xA002,0x5754,0x5753,0xA002,0x5752,0x574B,0xA010,0xA008,0xA004,0xA002,0x5749,0x5748,0xA002,0x5746,0x5745,0xA004, 0xA002,0x5744,0x5743,0xA002,0x5741,0x573F,0xA008,0xA004,0xA002,0x573D,0x573C,0xA002,0x5738,0x5737,0xA004,0xA002, 0x5736,0x5735,0xA002,0x5734,0x5732,0xA083,0xA02D,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x5731,0xA002,0x572B,0x5727, 0xA004,0xA002,0x5726,0x5725,0xA002,0x5724,0x5722,0xA008,0xA004,0xA002,0x5721,0x5720,0xA002,0x571E,0x571D,0xA004, 0xA002,0x571B,0x571A,0xA002,0x5719,0x5718,0xA000,0xA008,0xA004,0xA002,0x5717,0x5716,0xA002,0x5715,0x5714,0xA000, 0xA002,0x5713,0x5712,0xA016,0xA001,0xA005,0xA001,0xA001,0xA001,0x5711,0xA008,0xA004,0xA002,0x5710,0x570F,0xA002, 0x570E,0x570D,0xA004,0xA002,0x570C,0x570B,0xA002,0x5707,0x5705,0xA020,0xA010,0xA008,0xA004,0xA002,0x5702,0x5701, 0xA002,0x5700,0x56FC,0xA004,0xA002,0x56FB,0x56F8,0xA002,0x56F7,0x56F6,0xA008,0xA004,0xA002,0x56F3,0x56F2,0xA002, 0x56EF,0x56EE,0xA004,0xA002,0x56EC,0x56EA,0xA002,0x56E9,0x56E8,0xA010,0xA008,0xA004,0xA002,0x56E7,0x56E6,0xA002, 0x56E5,0x56E3,0xA004,0xA002,0x56DC,0x56D9,0xA002,0x56D8,0x56D6,0xA008,0xA004,0xA002,0x56D5,0x56D3,0xA002,0x56D2, 0x56D1,0xA004,0xA002,0x56D0,0x56CF,0xA002,0x56CE,0x56CD,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x56CC,0xA002, 0x56CB,0x56C9,0xA004,0xA002,0x56C8,0x56C7,0xA002,0x56C6,0x56C5,0xA008,0xA004,0xA002,0x56C4,0x56C3,0xA002,0x56C2, 0x56C1,0xA004,0xA002,0x56C0,0x56BF,0xA002,0x56BE,0x56BD,0xA010,0xA008,0xA004,0xA002,0x56BB,0x56BA,0xA002,0x56B9, 0x56B8,0xA004,0xA002,0x56B6,0x56B5,0xA002,0x56B4,0x56B3,0xA008,0xA004,0xA002,0x56B2,0x56B1,0xA002,0x56B0,0x56AE, 0xA004,0xA002,0x56AD,0x56AC,0xA002,0x56AB,0x56AA,0xA020,0xA010,0xA008,0xA004,0xA002,0x56A9,0x56A8,0xA002,0x56A7, 0x56A6,0xA004,0xA002,0x56A5,0x56A4,0xA002,0x56A2,0x56A1,0xA008,0xA004,0xA002,0x56A0,0x569F,0xA002,0x569E,0x569D, 0xA004,0xA002,0x569C,0x569B,0xA002,0x569A,0x5699,0xA010,0xA008,0xA004,0xA002,0x5698,0x5697,0xA002,0x5696,0x5695, 0xA004,0xA002,0x5694,0x5692,0xA002,0x5691,0x5690,0xA008,0xA004,0xA002,0x568D,0x568C,0xA002,0x568B,0x568A,0xA004, 0xA002,0x5689,0x5688,0xA002,0x5687,0x5684,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x5683,0x5682,0xA002,0x5681, 0x5680,0xA004,0xA002,0x567F,0x567E,0xA002,0x567D,0x567A,0xA008,0xA004,0xA002,0x5679,0x5678,0xA002,0x5677,0x5675, 0xA004,0xA002,0x5674,0x5673,0xA002,0x5672,0x5670,0xA00F,0xA008,0xA004,0xA002,0x566F,0x566E,0xA002,0x566D,0x5667, 0xA004,0xA002,0x5666,0x5665,0xA000,0x5663,0xA008,0xA004,0xA002,0x5661,0x5660,0xA002,0x565F,0x565E,0xA004,0xA002, 0x565D,0x565B,0xA002,0x565A,0x5656,0xA020,0xA010,0xA008,0xA004,0xA002,0x5655,0x5653,0xA002,0x5652,0x5651,0xA004, 0xA002,0x5650,0x564F,0xA002,0x564B,0x564A,0xA008,0xA004,0xA002,0x5649,0x5648,0xA002,0x5647,0x5646,0xA004,0xA002, 0x5645,0x5644,0xA002,0x5643,0x5642,0xA010,0xA008,0xA004,0xA002,0x5641,0x5640,0xA002,0x563E,0x563D,0xA004,0xA002, 0x563C,0x563A,0xA002,0x5638,0x5637,0xA008,0xA004,0xA002,0x5635,0x5633,0xA002,0x5630,0x562F,0xA004,0xA002,0x562E, 0x562B,0xA002,0x562A,0x5629,0xA5F7,0xA2FB,0xA17C,0xA07F,0xA030,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x5628,0xA002, 0x5626,0x5625,0xA004,0xA002,0x5622,0x5621,0xA002,0x5620,0x561D,0xA008,0xA004,0xA002,0x561C,0x561A,0xA002,0x5619, 0x5617,0xA004,0xA002,0x5616,0x5615,0xA002,0x5614,0x5613,0xA000,0xA008,0xA004,0xA002,0x5612,0x5611,0xA002,0x5610, 0x560D,0xA004,0xA002,0x560B,0x560A,0xA002,0x5607,0x5606,0xA00F,0xA001,0xA001,0xA005,0xA001,0xA002,0x5605,0x5604, 0xA004,0xA002,0x5603,0x5602,0xA002,0x55FF,0x55FC,0xA020,0xA010,0xA008,0xA004,0xA002,0x55FB,0x55FA,0xA002,0x55F9, 0x55F8,0xA004,0xA002,0x55F6,0x55F4,0xA002,0x55F1,0x55F0,0xA008,0xA004,0xA002,0x55EE,0x55ED,0xA002,0x55E9,0x55E7, 0xA004,0xA002,0x55E2,0x55E0,0xA002,0x55DE,0x55DB,0xA010,0xA008,0xA004,0xA002,0x55DA,0x55D9,0xA002,0x55D8,0x55D7, 0xA004,0xA002,0x55D5,0x55D0,0xA002,0x55CF,0x55CE,0xA008,0xA004,0xA002,0x55CB,0x55CA,0xA002,0x55C8,0x55C7,0xA004, 0xA002,0x55C6,0x55C3,0xA002,0x55C2,0x55C1,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x55C0,0xA002,0x55BF,0x55BC, 0xA004,0xA002,0x55BA,0x55B8,0xA002,0x55B6,0x55B4,0xA008,0xA004,0xA002,0x55B2,0x55B0,0xA002,0x55AF,0x55AE,0xA004, 0xA002,0x55AD,0x55AC,0xA002,0x55AB,0x55AA,0xA010,0xA008,0xA004,0xA002,0x55A9,0x55A8,0xA002,0x55A6,0x55A5,0xA004, 0xA002,0x55A4,0x55A3,0xA002,0x55A2,0x55A1,0xA008,0xA004,0xA002,0x55A0,0x559E,0xA002,0x559B,0x559A,0xA004,0xA002, 0x5597,0x5596,0xA002,0x5595,0x5593,0xA020,0xA010,0xA008,0xA004,0xA002,0x5592,0x5590,0xA002,0x558E,0x558D,0xA004, 0xA002,0x558C,0x5586,0xA002,0x5585,0x557F,0xA008,0xA004,0xA002,0x557D,0x557A,0xA002,0x5579,0x5574,0xA004,0xA002, 0x5573,0x5572,0xA002,0x5571,0x5570,0xA010,0xA008,0xA004,0xA002,0x556F,0x556B,0xA002,0x5569,0x5568,0xA004,0xA002, 0x5563,0x5562,0xA002,0x5560,0x555F,0xA008,0xA004,0xA002,0x555E,0x555D,0xA002,0x555B,0x555A,0xA004,0xA002,0x5559, 0x5558,0xA002,0x5557,0x5554,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x5553,0x5552,0xA002,0x5551,0x554F,0xA004, 0xA002,0x554E,0x554D,0xA002,0x554C,0x554B,0xA008,0xA004,0xA002,0x5548,0x5547,0xA002,0x5545,0x5542,0xA004,0xA002, 0x5540,0x553D,0xA002,0x553B,0x553A,0xA010,0xA008,0xA004,0xA002,0x5539,0x5538,0xA002,0x5536,0x5535,0xA004,0xA002, 0x5534,0x5532,0xA002,0x552D,0x552B,0xA007,0xA004,0xA002,0x5529,0x5528,0xA001,0x5526,0xA004,0xA002,0x5525,0x5521, 0xA002,0x551F,0x551E,0xA020,0xA010,0xA008,0xA004,0xA002,0x551D,0x551C,0xA002,0x551A,0x5519,0xA004,0xA002,0x5518, 0x5517,0xA002,0x5516,0x5515,0xA008,0xA004,0xA002,0x5513,0x5512,0xA002,0x550E,0x550D,0xA004,0xA002,0x550C,0x550B, 0xA002,0x550A,0x5508,0xA010,0xA008,0xA004,0xA002,0x5505,0x5504,0xA002,0x5503,0x5502,0xA004,0xA002,0x5500,0x54FE, 0xA002,0x54FB,0x54F9,0xA008,0xA004,0xA002,0x54F8,0x54F7,0xA002,0x54F6,0x54F5,0xA004,0xA002,0x54F4,0x54F1,0xA002, 0x54F0,0x54EF,0xA082,0xA037,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x54EC,0xA002,0x54EB,0x54E4,0xA004,0xA002,0x54E3, 0x54E2,0xA002,0x54E1,0x54E0,0xA008,0xA004,0xA002,0x54DB,0x54D8,0xA002,0x54D6,0x54CB,0xA004,0xA002,0x54CA,0x54C5, 0xA002,0x54C3,0x54BE,0xA010,0xA008,0xA004,0xA002,0x54BC,0x54BA,0xA002,0x54B9,0x54B7,0xA004,0xA002,0x54B6,0x54B5, 0xA002,0x54B2,0x54B0,0xA000,0xA004,0xA002,0x54AE,0x54A5,0xA000,0x54A2,0xA00B,0xA001,0xA001,0xA001,0xA004,0xA002, 0x54A1,0x54A0,0xA002,0x549F,0x549E,0xA020,0xA010,0xA008,0xA004,0xA002,0x549C,0x5498,0xA002,0x5497,0x5493,0xA004, 0xA002,0x5491,0x548D,0xA002,0x548A,0x5489,0xA008,0xA004,0xA002,0x5488,0x5487,0xA002,0x5485,0x5483,0xA004,0xA002, 0x5481,0x547F,0xA002,0x547E,0x547A,0xA010,0xA008,0xA004,0xA002,0x5479,0x5474,0xA002,0x5470,0x546F,0xA004,0xA002, 0x546E,0x546D,0xA002,0x546C,0x546B,0xA008,0xA004,0xA002,0x546A,0x5469,0xA002,0x5467,0x5465,0xA004,0xA002,0x5463, 0x5461,0xA002,0x5460,0x545F,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x545E,0xA002,0x545D,0x545A,0xA004,0xA002, 0x5451,0x544F,0xA002,0x544E,0x544D,0xA008,0xA004,0xA002,0x544C,0x5449,0xA002,0x5447,0x5445,0xA004,0xA002,0x5444, 0x5442,0xA002,0x5441,0x543F,0xA010,0xA008,0xA004,0xA002,0x543D,0x543A,0xA002,0x5437,0x5436,0xA004,0xA002,0x5433, 0x5430,0xA002,0x542A,0x5425,0xA008,0xA004,0xA002,0x5424,0x5422,0xA002,0x541C,0x541A,0xA004,0xA002,0x5419,0x5418, 0xA002,0x5414,0x540B,0xA020,0xA010,0xA008,0xA004,0xA002,0x5407,0x5405,0xA002,0x5402,0x5400,0xA004,0xA002,0x53FF, 0x53FE,0xA002,0x53FA,0x53F4,0xA008,0xA004,0xA002,0x53E7,0x53E2,0xA002,0x53E1,0x53DE,0xA004,0xA002,0x53DD,0x53DC, 0xA002,0x53DA,0x53D5,0xA010,0xA008,0xA004,0xA002,0x53D3,0x53D2,0xA002,0x53D0,0x53CF,0xA004,0xA002,0x53CE,0x53C7, 0xA002,0x53C6,0x53C5,0xA008,0xA004,0xA002,0x53C4,0x53C3,0xA002,0x53C0,0x53BE,0xA004,0xA002,0x53BD,0x53BC,0xA002, 0x53BA,0x53B9,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x53B8,0x53B7,0xA002,0x53B5,0x53B4,0xA004,0xA002,0x53B3, 0x53B2,0xA002,0x53B1,0x53B0,0xA008,0xA004,0xA002,0x53AF,0x53AD,0xA002,0x53AC,0x53AB,0xA004,0xA002,0x53AA,0x53A7, 0xA002,0x53A4,0x53A1,0xA010,0xA008,0xA004,0xA002,0x53A0,0x539E,0xA002,0x539C,0x539B,0xA004,0xA002,0x5399,0x5397, 0xA002,0x5396,0x5394,0xA008,0xA004,0xA002,0x5393,0x5392,0xA002,0x5391,0x5390,0xA003,0xA001,0x538F,0xA002,0x538E, 0x538A,0xA020,0xA010,0xA008,0xA004,0xA002,0x5388,0x5387,0xA002,0x5383,0x5381,0xA004,0xA002,0x5380,0x537E,0xA002, 0x537D,0x537C,0xA008,0xA004,0xA002,0x537B,0x5379,0xA002,0x5376,0x5372,0xA004,0xA002,0x536D,0x536C,0xA002,0x536A, 0x5368,0xA010,0xA008,0xA004,0xA002,0x5365,0x535D,0xA002,0x535B,0x5359,0xA004,0xA002,0x5358,0x5354,0xA002,0x5350, 0x534D,0xA008,0xA004,0xA002,0x534C,0x534B,0xA002,0x5346,0x5344,0xA004,0xA002,0x5342,0x5340,0xA002,0x533D,0x533C, 0xA180,0xA083,0xA03B,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x5338,0xA002,0x5337,0x5336,0xA004,0xA002,0x5335,0x5334, 0xA002,0x5333,0x5332,0xA008,0xA004,0xA002,0x5331,0x5330,0xA002,0x532F,0x532D,0xA004,0xA002,0x532C,0x532B,0xA002, 0x5329,0x5328,0xA010,0xA008,0xA004,0xA002,0x5327,0x5325,0xA002,0x5324,0x5322,0xA004,0xA002,0x531F,0x531E,0xA002, 0x531C,0x531B,0xA008,0xA004,0xA002,0x5318,0x5314,0xA002,0x5313,0x5312,0xA000,0xA000,0x5311,0xA008,0xA001,0xA001, 0xA001,0xA001,0xA002,0x530E,0x530C,0xA020,0xA010,0xA008,0xA004,0xA002,0x530B,0x530A,0xA002,0x5309,0x5307,0xA004, 0xA002,0x5304,0x5303,0xA002,0x5302,0x5301,0xA008,0xA004,0xA002,0x52FD,0x52FC,0xA002,0x52FB,0x52F8,0xA004,0xA002, 0x52F7,0x52F6,0xA002,0x52F5,0x52F4,0xA010,0xA008,0xA004,0xA002,0x52F3,0x52F2,0xA002,0x52F1,0x52EF,0xA004,0xA002, 0x52EE,0x52ED,0xA002,0x52EC,0x52EB,0xA008,0xA004,0xA002,0x52EA,0x52E9,0xA002,0x52E8,0x52E7,0xA004,0xA002,0x52E6, 0x52E5,0xA002,0x52E3,0x52E2,0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x52E1,0xA002,0x52E0,0x52DE,0xA004,0xA002, 0x52DD,0x52DC,0xA002,0x52DB,0x52DA,0xA008,0xA004,0xA002,0x52D9,0x52D7,0xA002,0x52D5,0x52D4,0xA004,0xA002,0x52D3, 0x52D1,0xA002,0x52CF,0x52CE,0xA010,0xA008,0xA004,0xA002,0x52CD,0x52CC,0xA002,0x52CA,0x52C8,0xA004,0xA002,0x52C6, 0x52C5,0xA002,0x52C4,0x52C2,0xA008,0xA004,0xA002,0x52C1,0x52C0,0xA002,0x52BD,0x52BC,0xA004,0xA002,0x52BB,0x52BA, 0xA002,0x52B9,0x52B8,0xA020,0xA010,0xA008,0xA004,0xA002,0x52B7,0x52B6,0xA002,0x52B5,0x52B4,0xA004,0xA002,0x52B0, 0x52AF,0xA002,0x52AE,0x52A7,0xA008,0xA004,0xA002,0x52A6,0x52A5,0xA002,0x52A4,0x529C,0xA004,0xA002,0x529A,0x5299, 0xA002,0x5298,0x5297,0xA010,0xA008,0xA004,0xA002,0x5296,0x5295,0xA002,0x5294,0x5292,0xA004,0xA002,0x5291,0x528F, 0xA002,0x528E,0x528D,0xA008,0xA004,0xA002,0x528C,0x528B,0xA002,0x528A,0x5289,0xA004,0xA002,0x5287,0x5286,0xA002, 0x5285,0x5284,0xA03F,0xA020,0xA010,0xA008,0xA004,0xA002,0x5283,0x5280,0xA002,0x527E,0x527C,0xA004,0xA002,0x527B, 0x527A,0xA002,0x5279,0x5278,0xA008,0xA004,0xA002,0x5277,0x5276,0xA002,0x5275,0x5274,0xA004,0xA002,0x5273,0x5271, 0xA002,0x5270,0x526E,0xA010,0xA008,0xA004,0xA002,0x526D,0x526C,0xA002,0x526B,0x5268,0xA004,0xA002,0x5266,0x5264, 0xA002,0x5263,0x5262,0xA008,0xA004,0xA002,0x5260,0x525F,0xA002,0x525D,0x525B,0xA004,0xA002,0x525A,0x5259,0xA001, 0x5258,0xA020,0xA010,0xA008,0xA004,0xA002,0x5257,0x5255,0xA002,0x5253,0x5252,0xA004,0xA002,0x524F,0x524E,0xA002, 0x524B,0x5249,0xA008,0xA004,0xA002,0x5248,0x5247,0xA002,0x5246,0x5245,0xA004,0xA002,0x5244,0x523E,0xA002,0x523C, 0x5235,0xA010,0xA008,0xA004,0xA002,0x5234,0x5232,0xA002,0x5231,0x522F,0xA004,0xA002,0x522C,0x522A,0xA002,0x5227, 0x5226,0xA008,0xA004,0xA002,0x5225,0x5223,0xA002,0x5222,0x5221,0xA004,0xA002,0x521F,0x521E,0xA002,0x521C,0x5215, 0xA07F,0xA03E,0xA000,0xA01E,0xA00E,0xA006,0xA002,0x5214,0xA002,0x5213,0x5210,0xA004,0xA002,0x520F,0x520C,0xA002, 0x520B,0x5209,0xA008,0xA004,0xA002,0x5205,0x5204,0xA002,0x51FE,0x51F7,0xA004,0xA002,0x51F4,0x51F2,0xA002,0x51F1, 0x51EE,0xA010,0xA008,0xA004,0xA002,0x51EC,0x51EA,0xA002,0x51E9,0x51E8,0xA004,0xA002,0x51E7,0x51E6,0xA002,0x51E5, 0x51E3,0xA008,0xA004,0xA002,0x51E2,0x51DF,0xA002,0x51DE,0x51DC,0xA004,0xA002,0x51DA,0x51D9,0xA000,0x51D8,0xA001, 0xA020,0xA010,0xA008,0xA004,0xA002,0x51D7,0x51D6,0xA002,0x51D5,0x51D4,0xA004,0xA002,0x51D3,0x51D2,0xA002,0x51D0, 0x51CE,0xA008,0xA004,0xA002,0x51CD,0x51CA,0xA002,0x51C8,0x51C5,0xA004,0xA002,0x51C3,0x51C2,0xA002,0x51C1,0x51BF, 0xA010,0xA008,0xA004,0xA002,0x51BE,0x51BA,0xA002,0x51B9,0x51B8,0xA004,0xA002,0x51B4,0x51AE,0xA002,0x51AD,0x51AA, 0xA008,0xA004,0xA002,0x51A9,0x51A8,0xA002,0x51A7,0x51A6,0xA004,0xA002,0x51A3,0x51A1,0xA002,0x519F,0x519E,0xA07E, 0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x519D,0xA002,0x519A,0x5198,0xA004,0xA002,0x5194,0x5193,0xA002,0x5191,0x5190, 0xA008,0xA004,0xA002,0x518F,0x518E,0xA002,0x518B,0x518A,0xA004,0xA002,0x5187,0x5186,0xA002,0x5184,0x5183,0xA010, 0xA008,0xA004,0xA002,0x517F,0x517E,0xA002,0x517A,0x5172,0xA004,0xA002,0x516F,0x516A,0xA002,0x5169,0x5167,0xA008, 0xA004,0xA002,0x5166,0x5164,0xA002,0x5163,0x5161,0xA004,0xA002,0x5160,0x515F,0xA002,0x515E,0x515D,0xA020,0xA010, 0xA008,0xA004,0xA002,0x515B,0x5159,0xA002,0x5158,0x5157,0xA004,0xA002,0x5153,0x5152,0xA002,0x5150,0x514F,0xA008, 0xA004,0xA002,0x514E,0x514C,0xA002,0x514A,0x5147,0xA004,0xA002,0x5142,0x513E,0xA002,0x513D,0x513C,0xA010,0xA008, 0xA004,0xA002,0x513B,0x513A,0xA002,0x5139,0x5138,0xA004,0xA002,0x5137,0x5136,0xA002,0x5135,0x5134,0xA008,0xA004, 0xA002,0x5133,0x5132,0xA002,0x5131,0x5130,0xA004,0xA002,0x512F,0x512E,0xA002,0x512D,0x512C,0xA040,0xA020,0xA010, 0xA008,0xA004,0xA002,0x512B,0x512A,0xA002,0x5129,0x5128,0xA004,0xA002,0x5127,0x5126,0xA002,0x5125,0x5124,0xA008, 0xA004,0xA002,0x5123,0x5122,0xA002,0x5120,0x511F,0xA004,0xA002,0x511E,0x511D,0xA002,0x511C,0x511B,0xA010,0xA008, 0xA004,0xA002,0x511A,0x5119,0xA002,0x5118,0x5117,0xA004,0xA002,0x5116,0x5115,0xA002,0x5114,0x5113,0xA008,0xA004, 0xA002,0x5111,0x5110,0xA002,0x510F,0x510E,0xA004,0xA002,0x510D,0x510C,0xA002,0x510A,0x5109,0xA01F,0xA00F,0xA007, 0xA003,0xA001,0x5108,0xA002,0x5105,0x5104,0xA004,0xA002,0x5103,0x5102,0xA002,0x5101,0x5100,0xA008,0xA004,0xA002, 0x50FF,0x50FE,0xA002,0x50FD,0x50FC,0xA004,0xA002,0x50FA,0x50F9,0xA002,0x50F8,0x50F7,0xA010,0xA008,0xA004,0xA002, 0x50F6,0x50F4,0xA002,0x50F2,0x50F1,0xA004,0xA002,0x50F0,0x50EF,0xA002,0x50EB,0x50EA,0xA008,0xA004,0xA002,0x50E9, 0x50E8,0xA002,0x50E5,0x50E4,0xA004,0xA002,0x50E3,0x50E2,0xA002,0x50E1,0x50E0,0xA2FF,0xA180,0xA083,0xA045,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x50DF,0xA002,0x50DE,0x50DD,0xA004,0xA002,0x50DC,0x50DB,0xA002,0x50D9,0x50D8,0xA008, 0xA004,0xA002,0x50D7,0x50D5,0xA002,0x50D4,0x50D3,0xA004,0xA002,0x50D2,0x50D1,0xA002,0x50D0,0x50CE,0xA010,0xA008, 0xA004,0xA002,0x50CD,0x50CC,0xA002,0x50CB,0x50CA,0xA004,0xA002,0x50C9,0x50C8,0xA002,0x50C7,0x50C6,0xA008,0xA004, 0xA002,0x50C5,0x50C4,0xA002,0x50C3,0x50C2,0xA004,0xA002,0x50C1,0x50C0,0xA002,0x50BF,0x50BE,0xA000,0xA000,0xA000, 0xA000,0xA000,0x50BD,0xA001,0xA01D,0xA00D,0xA005,0xA001,0xA002,0x50BC,0x50B9,0xA004,0xA002,0x50B8,0x50B7,0xA002, 0x50B6,0x50B5,0xA008,0xA004,0xA002,0x50B4,0x50B3,0xA002,0x50B1,0x50B0,0xA004,0xA002,0x50AF,0x50AE,0xA002,0x50AD, 0x50AB,0xA010,0xA008,0xA004,0xA002,0x50AA,0x50A6,0xA002,0x50A4,0x50A2,0xA004,0xA002,0x50A1,0x50A0,0xA002,0x509F, 0x509E,0xA008,0xA004,0xA002,0x509D,0x509C,0xA002,0x509B,0x509A,0xA004,0xA002,0x5099,0x5098,0xA002,0x5097,0x5096, 0xA07E,0xA03E,0xA01E,0xA00E,0xA006,0xA002,0x5095,0xA002,0x5094,0x5093,0xA004,0xA002,0x5092,0x5091,0xA002,0x5090, 0x508F,0xA008,0xA004,0xA002,0x508E,0x508C,0xA002,0x508B,0x508A,0xA004,0xA002,0x5089,0x5087,0xA002,0x5086,0x5084, 0xA010,0xA008,0xA004,0xA002,0x5083,0x5082,0xA002,0x5081,0x507D,0xA004,0xA002,0x507C,0x507A,0xA002,0x5079,0x5078, 0xA008,0xA004,0xA002,0x5075,0x5074,0xA002,0x5073,0x5072,0xA004,0xA002,0x5071,0x5070,0xA002,0x506F,0x506E,0xA020, 0xA010,0xA008,0xA004,0xA002,0x506D,0x506B,0xA002,0x506A,0x5069,0xA004,0xA002,0x5068,0x5067,0xA002,0x5066,0x5064, 0xA008,0xA004,0xA002,0x5063,0x5062,0xA002,0x5061,0x5060,0xA004,0xA002,0x505F,0x505E,0xA002,0x505D,0x505B,0xA010, 0xA008,0xA004,0xA002,0x5059,0x5058,0xA002,0x5057,0x5056,0xA004,0xA002,0x5054,0x5053,0xA002,0x5052,0x5051,0xA008, 0xA004,0xA002,0x5050,0x504D,0xA002,0x504B,0x504A,0xA004,0xA002,0x5049,0x5046,0xA002,0x5045,0x5044,0xA040,0xA020, 0xA010,0xA008,0xA004,0xA002,0x5042,0x5041,0xA002,0x5040,0x503F,0xA004,0xA002,0x503D,0x503B,0xA002,0x5039,0x5038, 0xA008,0xA004,0xA002,0x5037,0x5036,0xA002,0x5035,0x5034,0xA004,0xA002,0x5033,0x5032,0xA002,0x5031,0x5030,0xA010, 0xA008,0xA004,0xA002,0x502F,0x502B,0xA002,0x5027,0x5024,0xA004,0xA002,0x5023,0x5022,0xA002,0x5020,0x501E,0xA008, 0xA004,0xA002,0x501D,0x501B,0xA002,0x5017,0x5016,0xA004,0xA002,0x5015,0x5013,0xA002,0x5011,0x5010,0xA01F,0xA00F, 0xA007,0xA004,0xA002,0x500E,0x500B,0xA001,0x500A,0xA004,0xA002,0x5009,0x5008,0xA002,0x5007,0x5006,0xA008,0xA004, 0xA002,0x5005,0x5004,0xA002,0x5003,0x5002,0xA004,0xA002,0x5001,0x5000,0xA002,0x4FFF,0x4FFD,0xA010,0xA008,0xA004, 0xA002,0x4FFC,0x4FFB,0xA002,0x4FF9,0x4FF7,0xA004,0xA002,0x4FF6,0x4FF5,0xA002,0x4FF4,0x4FF2,0xA008,0xA004,0xA002, 0x4FF0,0x4FEC,0xA002,0x4FEB,0x4FE7,0xA004,0xA002,0x4FE5,0x4FE4,0xA002,0x4FE2,0x4FE0,0xA082,0xA048,0xA03E,0xA01E, 0xA00E,0xA006,0xA002,0x4FDB,0xA002,0x4FD9,0x4FD6,0xA004,0xA002,0x4FD5,0x4FD4,0xA002,0x4FD3,0x4FD2,0xA008,0xA004, 0xA002,0x4FCD,0x4FCC,0xA002,0x4FCB,0x4FC9,0xA004,0xA002,0x4FC8,0x4FC7,0xA002,0x4FC6,0x4FC2,0xA010,0xA008,0xA004, 0xA002,0x4FC1,0x4FC0,0xA002,0x4FBE,0x4FBD,0xA004,0xA002,0x4FBC,0x4FBB,0xA002,0x4FBA,0x4FB9,0xA008,0xA004,0xA002, 0x4FB8,0x4FB7,0xA002,0x4FB6,0x4FB4,0xA004,0xA002,0x4FB3,0x4FB2,0xA002,0x4FB1,0x4FB0,0xA000,0xA000,0xA000,0xA004, 0xA002,0x4FAD,0x4FAB,0xA000,0x4FA4,0xA001,0xA019,0xA009,0xA001,0xA004,0xA002,0x4FA2,0x4FA1,0xA002,0x4F9F,0x4F9E, 0xA008,0xA004,0xA002,0x4F9C,0x4F9A,0xA002,0x4F99,0x4F98,0xA004,0xA002,0x4F96,0x4F95,0xA002,0x4F93,0x4F92,0xA010, 0xA008,0xA004,0xA002,0x4F90,0x4F8E,0xA002,0x4F8C,0x4F8A,0xA004,0xA002,0x4F87,0x4F86,0xA002,0x4F85,0x4F82,0xA008, 0xA004,0xA002,0x4F81,0x4F80,0xA002,0x4F7D,0x4F7A,0xA004,0xA002,0x4F79,0x4F78,0xA002,0x4F77,0x4F75,0xA07E,0xA03E, 0xA01E,0xA00E,0xA006,0xA002,0x4F72,0xA002,0x4F71,0x4F6E,0xA004,0xA002,0x4F6D,0x4F6B,0xA002,0x4F6A,0x4F68,0xA008, 0xA004,0xA002,0x4F66,0x4F62,0xA002,0x4F61,0x4F56,0xA004,0xA002,0x4F54,0x4F52,0xA002,0x4F4C,0x4F4B,0xA010,0xA008, 0xA004,0xA002,0x4F4A,0x4F49,0xA002,0x4F48,0x4F47,0xA004,0xA002,0x4F45,0x4F44,0xA002,0x4F42,0x4F41,0xA008,0xA004, 0xA002,0x4F40,0x4F3F,0xA002,0x4F3E,0x4F3B,0xA004,0xA002,0x4F39,0x4F37,0xA002,0x4F35,0x4F33,0xA020,0xA010,0xA008, 0xA004,0xA002,0x4F31,0x4F2E,0xA002,0x4F2D,0x4F2C,0xA004,0xA002,0x4F29,0x4F28,0xA002,0x4F23,0x4F21,0xA008,0xA004, 0xA002,0x4F1D,0x4F1C,0xA002,0x4F16,0x4F15,0xA004,0xA002,0x4F14,0x4F13,0xA002,0x4F12,0x4F0C,0xA010,0xA008,0xA004, 0xA002,0x4F0B,0x4F08,0xA002,0x4F07,0x4F06,0xA004,0xA002,0x4F05,0x4F04,0xA002,0x4F03,0x4F02,0xA008,0xA004,0xA002, 0x4F00,0x4EFE,0xA002,0x4EFC,0x4EFA,0xA004,0xA002,0x4EF9,0x4EF8,0xA002,0x4EF4,0x4EF1,0xA040,0xA020,0xA010,0xA008, 0xA004,0xA002,0x4EEF,0x4EEE,0xA002,0x4EED,0x4EE9,0xA004,0xA002,0x4EE7,0x4EE6,0xA002,0x4EE2,0x4EE0,0xA008,0xA004, 0xA002,0x4EDC,0x4EDB,0xA002,0x4EDA,0x4ED2,0xA004,0xA002,0x4ED0,0x4ECF,0xA002,0x4ECC,0x4EC8,0xA010,0xA008,0xA004, 0xA002,0x4EBE,0x4EBD,0xA002,0x4EBC,0x4EB9,0xA004,0xA002,0x4EB8,0x4EB7,0xA002,0x4EB6,0x4EB4,0xA008,0xA004,0xA002, 0x4EB1,0x4EB0,0xA002,0x4EAF,0x4EAA,0xA004,0xA002,0x4EA3,0x4E9E,0xA002,0x4E9D,0x4E9C,0xA01F,0xA00F,0xA008,0xA004, 0xA002,0x4E99,0x4E97,0xA002,0x4E96,0x4E90,0xA003,0xA001,0x4E8A,0xA002,0x4E87,0x4E85,0xA008,0xA004,0xA002,0x4E84, 0x4E83,0xA002,0x4E82,0x4E81,0xA004,0xA002,0x4E80,0x4E7F,0xA002,0x4E7D,0x4E7C,0xA010,0xA008,0xA004,0xA002,0x4E7B, 0x4E7A,0xA002,0x4E79,0x4E78,0xA004,0xA002,0x4E77,0x4E76,0xA002,0x4E75,0x4E74,0xA008,0xA004,0xA002,0x4E72,0x4E6F, 0xA002,0x4E6E,0x4E6D,0xA004,0xA002,0x4E6C,0x4E6B,0xA002,0x4E6A,0x4E68,0xA000,0xA000,0xA000,0xA03E,0xA01E,0xA00E, 0xA006,0xA002,0x4E67,0xA002,0x4E65,0x4E64,0xA004,0xA002,0x4E63,0x4E62,0xA002,0x4E5B,0x4E5A,0xA008,0xA004,0xA002, 0x4E57,0x4E55,0xA002,0x4E51,0x4E4A,0xA004,0xA002,0x4E46,0x4E44,0xA002,0x4E42,0x4E41,0xA010,0xA008,0xA004,0xA002, 0x4E40,0x4E3C,0xA002,0x4E37,0x4E35,0xA004,0xA002,0x4E33,0x4E31,0xA002,0x4E2F,0x4E2E,0xA008,0xA004,0xA002,0x4E29, 0x4E26,0xA002,0x4E23,0x4E21,0xA004,0xA002,0x4E20,0x4E1F,0xA002,0x4E17,0x4E12,0xA000,0xA000,0xA008,0xA004,0xA002, 0x4E0F,0x4E06,0xA002,0x4E05,0x4E04,0xA000,0xA000,0x4E02,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001, 0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0x20AC, }; // cp936_to_ucs2_elements const TConvFlatTree cp936_to_ucs2 = { 0x0080, // min key 0xFE4F, // max key 0xA000, // links space start 0xEFFF, // links space end cp936_to_ucs2_numelems, // number of elements (treeval_t *)&cp936_to_ucs2_elements // elements }; // cp936_to_ucs2 syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/dataconversion.h0000644000373300037200000000141012424517753030155 0ustar00nightlyallusers00000000000000#ifndef DataConversion_H #define DataConversion_H #include "sync_declarations.h" #ifdef __cplusplus #include using namespace sysync; namespace sysync { /** * convert data from one format into another * * @param aSession an active session handle * @param aFromTypeName the original datatype name, like "vCard30" * @param aToTypeName the generated datatype name * @retval aItemData original data, replaced with data in new format * @return true for success */ bool DataConversion(SessionH aSession, const char *aFromTypeName, const char *aToTypeName, std::string &aItemData); } // namespace sysync #endif /* __cplusplus */ #endif /* DataConversion_H */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/dbitem.cpp0000644000373300037200000006664112424517753026756 0ustar00nightlyallusers00000000000000/* * File: dbitem.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * Example DBApi database adapter. * TDBItem class for item handling * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * */ #include "sync_include.h" // import some global things #include "sync_dbapidef.h" #include "SDK_util.h" // include SDK utilities #include "SDK_support.h" #include "dbitem.h" #ifndef SYSYNC_ENGINE #include "stringutil.h" // local implementation of CStr <=> Str conversions #include "timeutil.h" // local implementation for time routines #endif namespace sysync { #define MyDB "DBItem" // 'DBItem' debug name #define FFirst 10000 // start number for item name (will be incremented) #define ARR_Sep '\x1D' // Array element separator within textdb file #define ARR_SepS "\x1D" // ... the same as string // ---- utility functions ---------------------------------------------------------- // Calculate the length of 's array expansion static int ArrLen( cAppCharP fKey, cAppCharP fVal ) { cAppCharP z= "[0]"; cAppCharP x= "[x]:"; int len= strlen( fVal ); // some additional space is needed for array elements, calculate it first int j= 0; int i; for (i= 0; i increase // don't forget element "[0]" len = 0; if (j>0) { len+= strlen( z ) + j*(strlen( fKey )+strlen( x )); // "yy[x]:" if (j>10) len+= j-10; // "[xx]" } // if return len; } // ArrLen /*! Create an item field */ void MakeField( TDBItemField* &act, cAppCharP field, cAppCharP fieldEnd, int &len, bool convert ) { MakeObj ( act ); if (fieldEnd) act->field.assign( field, (unsigned int)(fieldEnd-field) ); else act->field.assign( field ); if (convert) { string s= ""; // don't touch array separator StrToCStrAppend( act->field.c_str(), s, true, ARR_Sep ); act->field= s; } // if //printf( "len=%3d field='%s'\n", len, act->field.c_str() ); len+= act->field.length()+1; } // MakeField // Get a token string static string Token_Str( string aToken ) { if (aToken.empty()) return ""; else return "[" + aToken + "]"; } // Token_Str; // create a UTC token for time comparisons string CurrentTime( int secsOffs, bool dateOnly ) { string isoStr; lineartime_t f= secondToLinearTimeFactor * secsOffs; #ifdef SYSYNC_ENGINE timecontext_t tctx= TCTX_UTC; if (dateOnly) tctx= TCTX_DATEONLY; //lineartime_t timestamp= getSystemNowAs( TCTX_UTC, (GZones*)aGZones ); lineartime_t timestamp= getSystemNowAs( TCTX_UTC, NULL ); TimestampToISO8601Str( isoStr, timestamp + f, tctx, false, false ); #else lineartime_t timestamp= utcNowAsLineartime(); timeStampToISO8601 ( timestamp + f, isoStr, dateOnly ); #endif return isoStr; } // CurrentTime // Compare time of ISO8601 with / int CompareTokens( string aToken, string aLastToken, string aResumeToken ) { bool chg= aLastToken.empty() || // calculate newer condition aLastToken < aToken; bool res= !aResumeToken.empty() && // calculate resume condition aResumeToken < aToken && aResumeToken > aLastToken; int aStatus= ReadNextItem_Unchanged; if (chg) aStatus= ReadNextItem_Changed; if (res) aStatus= ReadNextItem_Resumed; return aStatus; } // CompareTokens // ------------------------------------------------------------------------- /* Combines and into string * support for blobs, tz names and array fields */ string KeyAndField( cAppCharP sKey, cAppCharP sField ) { cAppCharP fs= strstr( sField, ";" ); // semicolon pattern: BLOB, TZNAME, ... cAppCharP q = sField; cAppCharP qE; string s = sKey; if (fs) { s+= fs; return s; } // with semicolon int i= 0; while (true) { qE= strstr( q, ARR_SepS ); if (!qE && i==0) break; s+= '[' + IntStr( i ) + ']'; if (!qE) break; string tmp; tmp.assign( q, (unsigned int)( qE-q ) ); s+= ':' + tmp + '\n'; i++; q= qE+1; s+= sKey; } // loop s+= ":"; s+= q; return s; } // KeyAndField string KeyAndField( TDBItemField* actKey, TDBItemField* actField ) { return KeyAndField( actKey->field.c_str(), actField->field.c_str() ); } // KeyAndField void AddFields( string &aDat, string aAdd, cAppCharP param1, cAppCharP param2, cAppCharP param3, cAppCharP param4, cAppCharP param5 ) { string p; if (aAdd.empty()) return; int i= 1; while (true) { switch ( i ) { case 1 : p= param1; break; case 2 : p= param2; break; case 3 : p= param3; break; case 4 : p= param4; break; case 5 : p= param5; break; default: p= ""; } // switch string chk= "%" + IntStr( i++ ); string::size_type pos= aAdd.find( chk,0 ); if (pos==string::npos) break; aAdd.replace( pos,chk.length(), p ); } // loop if (!aDat.empty()) { cAppCharP c= aDat.c_str() + aDat.length()-1; // last char if (*c!='\n') aDat+= '\n'; } // if aDat+= aAdd; } // AddFields /* ------------------------------------------------------------------------ */ //! assign ID and callback void TDBItem::init( cAppCharP aItemID, cAppCharP aParentID, void* aCB, TDBItem* aNext ) { itemID = aItemID; parentID= aParentID; fCB = aCB; next = aNext; } // init //! assign ID and callback (overloaded) void TDBItem::init( cAppCharP aItemID, void* aCB, TDBItem* aNext ) { init( aItemID,"", aCB, aNext ); } // init // the combined item/parent string cAppCharP TDBItem::c_str() { fID= itemID; if (!parentID.empty()) { fID+= ","; fID+= parentID; } return fID.c_str(); } // c_str /* Get a specific item , which represents ,. * Returns error, if not found. * If is true (default), start at the beginning of the list, * else continue */ TSyError TDBItem::GetItem( cItemID aID, TDBItem* &actL, bool first ) { char* p= aID->parent; if (!p) p= const_cast(""); if (first) actL= this; while (ListNext( actL )) { if (strcmp( aID->item,actL->itemID.c_str() )==0 && strcmp( p, actL->parentID.c_str() )==0) return LOCERR_OK; } // while actL= NULL; return DB_NotFound; } // GetItem /* Overloaded for only w/o parent ID * Get a specific item , which represents * Returns error, if not found. */ TSyError TDBItem::GetItem( cAppCharP aItemID, TDBItem* &actL, bool first ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= NULL; return GetItem( &a, actL, first ); } // GetItem /* Overloaded for only w/o parent ID * Get a specific item , which represents * Returns error, if not found. */ TSyError TDBItem::GetItem_2( cAppCharP aItemID, cAppCharP aField2, TDBItem* mpL, TDBItem* &act ) { TSyError err= LOCERR_OK; ItemID_Struct a; a.item = (char*)aItemID; a.parent= NULL; bool first= true; string s; while (true) { err= GetItem( &a, act, first ); if (err) break; // not found mpL->Field ( "2",act, s ); if (strcmp( aField2,s.c_str() )==0) break; // found first= false; } // loop return err; } // GetItem_2 TSyError TDBItem::DeleteItem( TDBItem* actL ) { TDBItem* prvL= actL; ListBack( prvL, this ); // search for the previous element prvL->next= actL->next; actL->next= NULL; // avoid destroying the whole chain delete actL; fChanged= true; return LOCERR_OK; } /* DeleteItem */ TSyError TDBItem::DeleteItem( cItemID aID ) { TSyError err= DB_NotFound; TDBItem* actI; err= GetItem( aID, actI ); if (err) return err; // item must be not available as parent element TDBItem* actL= this; while (ListNext( actL )) { if (strcmp( aID->item,actL->parentID.c_str() )==0) return DB_Forbidden; } // while return DeleteItem( actI ); } /* DeleteItem */ TSyError TDBItem::DeleteItem( cAppCharP aItemID ) { ItemID_Struct a; a.item = (char*)aItemID; a.parent= const_cast(""); return DeleteItem( &a ); } // DeleteItem // parent element must be "" or exist TSyError TDBItem::ParentExist( cAppCharP aItemID, cAppCharP aParentID ) { if (*aParentID==0) return LOCERR_OK; if (strcmp( aItemID,aParentID )==0) return DB_Forbidden; // no recursion allowed TDBItem* actL= this; while (ListNext( actL )) { if (strcmp( aParentID,actL->itemID.c_str() )==0) return LOCERR_OK; } // while return DB_NotFound; } // ParentExists void TDBItem::CreateItem( string newItemID, string parentID, TDBItem* &actL ) { TDBItemField* actK; TDBItemField* actF; TDBItem* newL= new TDBItem; // create item root newL->fCB= fCB; // inherit callback actF= &newL->item; newL->itemID = newItemID; newL->parentID= parentID; actL->next= newL; ListNext( actL ); int n= 0; actK= &item; while (ListNext( actK )) { // number of elements according to the key MakeField ( actF, "", NULL, actL->len ); n++; } // while actL->len--; // termination is included already fChanged= true; } // CreateItem /* The strategy is simple: Take ID="10000" as start, go thru the whole list. * if found, increment. Insert new element at the end. */ TSyError TDBItem::CreateEmptyItem( ItemID aID, string &newItemID, TDBItem* &actL, string newID ) { TSyError err; int itemID= atoi( newID.c_str() ); if (itemID==0) itemID= atoi( F_First ); TDBItem* last; //TDBItem* newL; //TDBItemField* actK; //TDBItemField* actF; // parent element must be "" or exist err= ParentExist( "", aID->parent ); if (err) return err; newItemID= aID->item; if (newItemID.empty()) { actL= this; while (true) { last= actL; if (!ListNext( actL )) break; int itemNum= atoi( actL->itemID.c_str() ); if (itemNum>=itemID) itemID= itemNum+1; // assign largest unique number } // while newItemID= IntStr( itemID ); actL = last; } else { actL= LastElem( this ); // get the last element } // if CreateItem( newItemID, aID->parent, actL ); /* // create item root newL= new TDBItem; newL->fCB= fCB; // inherit callback actF= &newL->item; newL->itemID = newItemID; newL->parentID= aID->parent; actL->next= newL; ListNext( actL ); int n= 0; actK= &item; while (ListNext( actK )) { // number of elements according to the key MakeField ( actF, "", NULL, actL->len ); n++; } // while actL->len--; // termination is included already */ return LOCERR_OK; } // CreateEmptyItem TSyError TDBItem::CreateEmptyItem( cAppCharP aParentID, string &newItemID, TDBItem* &actL ) { ItemID_Struct a; a.item = const_cast(""); a.parent= (char*)aParentID; return CreateEmptyItem ( &a, newItemID, actL ); } // CreateEmptyItem TSyError TDBItem::CreateEmptyItem( string &newItemID, TDBItem* &actL ) { return CreateEmptyItem( "", newItemID, actL ); } // CreateEmptyItem /*! * Check, if can be interpreted as number */ static bool NumKey( cAppCharP aKey, int &iKey ) { iKey= atoi( aKey ); return iKey!=0 || strcmp( aKey,"0")==0; } // NumKey /* Update the specific field with the new value . * Create the whole bunch of missing keys, if not yet available. */ TSyError TDBItem::UpdateField( void* aCB, cAppCharP fKey, cAppCharP fVal, TDBItem* hdI, bool asName ) { TSyError err= DB_NotFound; char* ts; string s; int iKey= 0, iLast= -1; // start value if data base is empty TDBItemField* actK= &item; // the key TDBItemField* lastK; TDBItemField* actI= &hdI->item; TDBItemField* lastI; if (aCB==NULL) aCB= fCB; // get the default callback, if not overridden by // check, if the specific element is already existing while (true) { lastK= actK; if (!ListNext( actK )) break; lastI= actI; // a not existing field will be created (empty) if (!ListNext( actI )) { actI= lastI; MakeField ( actI, "", NULL, hdI->len ); } // if if (strcmp( fKey,actK->field.c_str())==0) { int oldLen= actI->field.length(); int newLen= strlen( fVal ) + ArrLen( fKey,fVal ); hdI->len += newLen-oldLen; // adapt the whole length actI->field= fVal; // and assign value of the new field err= LOCERR_OK; // the new value is assigned, everything is ok fChanged= true; // must be marked for a change break; } // if } // while // ----------------------------------------------------- if (err && !asName) { if (!lastK->field.empty()) iLast= atoi( lastK->field.c_str() ); if (!NumKey( fKey,iKey )) err= DB_NotFound; // not a valid key } // if if (err!=DB_NotFound) { s= KeyAndField( fKey,fVal ); // create name info string vv= hdI->c_str(); if (!vv.empty()) vv= " " + Parans( vv ) + " "; // create debug info string eInfo; if (err) eInfo= " err=" + IntStr( err ); DEBUG_Exotic_DB( aCB, MyDB,"UpdateField", "%s'%s'%s", vv.c_str(), s.c_str(), eInfo.c_str() ); return err; } // if if (asName) iKey= iLast+1; // create just one element // now add the missing key fields int i; for (i= iLast+1; i<=iKey; i++) { string tmp= IntStr( i ); if (asName) ts= (char*)fKey; else ts= (char*)tmp.c_str(); MakeField( lastK, ts, NULL, len ); // create a new key element } // for // and the same for each item TDBItem* actV= this; while (ListNext( actV )) { actI= &actV->item; while (true) { lastI= actI; if (!ListNext( actI )) { for (i= iLast+1; i<=iKey; i++) MakeField( lastI, "", NULL, actV->len ); break; } // if } // loop } // while // the task is not yet done => do it again (recursively) return UpdateField( aCB, fKey, fVal, hdI, asName ); } // UpdateField TSyError TDBItem::Field( cAppCharP fKey, TDBItem* hdI, string &s ) { TDBItemField* actK= &item; TDBItemField* actF= &hdI->item; while (ListNext( actK,actF )) { if (strcmp( actK->field.c_str(),fKey )==0) { s= actF->field.c_str(); return LOCERR_OK; } // if } // while return DB_NotFound; } // Field static void ReplaceArrElem( string &s, int n, string arrElem ) { int pos, v= 0; bool fnd; int i= n; while (true) { pos= v; v= s.find( ARR_Sep, pos ); fnd= v!=(int)string::npos; if (!fnd) v= s.length(); if (i<=0) break; if (!fnd) { if (arrElem.empty()) return; // adding not needed s+= ARR_Sep; } // if v++; i--; } // while s= s.substr( 0, pos ) + arrElem + s.substr( v, s.length()-v ); } // ReplaceArrElem static void CutEmptyEnd( string &s ) { while (!s.empty()) { uInt32 last= s.length()-1; if (s.rfind( ARR_Sep, last )!=last) break; // last char ? s= s.substr ( 0, last ); // if yes, cut it } // while } // CutEmptyEnd static int ArrIndex( cAppCharP q, cAppCharP qN ) { int n= 0; if (qN) { string s; s.assign( q, (unsigned int)( qN-q ) ); CutBracks( s ); n= atoi ( s.c_str() ); } // if return n; } // ArrIndex void TDBItem::Array_TDB( cAppCharP &q, cAppCharP aKey, TDBItem* hdI, string &aVal ) { cAppCharP qR; cAppCharP qN; cAppCharP qA; bool firstElem= true; // true during first element handling string s; // temporary local string int n; //aVal= ""; // init string //string org; Field( aKey, hdI, aVal ); // as it is now while (*q!='\0') { qN= strstr( q,":" ); qA= strstr( q,"[" ); if (!qN) break; // no more regular elements if (!qA || qNfToken= aNewToken; while (*q!='\0') { // break the string ':''\n' into key and value cAppCharP qN= strstr( q, StdPattern ); // normal notation cAppCharP qA= strstr( q,ArrayPattern ); // try array notation //cAppCharP qB= strstr( q, BlobPattern ); // try blob notation //cAppCharP qT= strstr( q, TZPattern ); // try tzname notation cAppCharP qS= strstr( q, ";" ); // semicolon notation bool isArr = qA && (!qN || qA DEBUG_Block ( aCB, DIT, itemID.c_str(), s.c_str() ); // hierarchical log TDBItem* actI= this; while (ListNext( actI )) { // for each item do ... if (*specificItem!=0 && strcmp( specificItem,actI->itemID.c_str() )!=0 ) continue; s= Token_Str( actI->fToken ); DEBUG_( aCB, "%s= (%s) %s", this->c_str(), actI->c_str(), s.c_str() ); TDBItemField* actK= &item; // the key identifier TDBItemField* actF= &actI->item; // the item current field cAppCharP f; while (ListNext( actK )) { // for each element do ... if (ListNext( actF )) f= actF->field.c_str(); else f= ""; // ""; if (allFields || !actF->field.empty()) { // display only under conditions s= KeyAndField( actK->field.c_str(), f ); DEBUG_( aCB, "%s", s.c_str() ); } // if } // while } // while DEBUG_EndBlock( aCB, DIT ); } // Disp_Items static void AddKey( void* aCB, bool withKey, cAppCharP qA, cAppCharP qR, int n, TDBItemField* &actF, int &len ) { if (withKey) MakeField( actF, qA,qR, len, true ); else { // just numbering, starting with "0" string tmp= IntStr( n-2 ); MakeField( actF, tmp.c_str(),NULL, len, true ); DEBUG_Exotic_DB( aCB, MyDB,"AddKey", "'%s'", tmp.c_str() ); } // if } // AddKey TSyError TDBItem::LoadDB( bool withKey, cAppCharP aPrefix, void* aCB ) { cAppCharP LDB= "-LoadDB"; // collapsed display with '-' at the beginning TSyError err= LOCERR_OK; char ch, prv= '\0'; char* q; char* qA; char* qR; char* qC; // create root structure TDBItem* actL= this; TDBItem* actI= NULL; TDBItem* newL= NULL; TDBItemField* actF; TDBItemField* actT; bool first= true; int n= 0, nMax= 0; if (fLoaded) return LOCERR_OK; if (withKey) init( aPrefix, aCB ); if (aCB==NULL) aCB= fCB; // get the default callback, if not overridden by FILE* f= fopen( fFileName.c_str(),"rb" ); if (!f) err= DB_NotFound; /* empty DB */ string s= "err=" + IntStr( err ); string rslt; DEBUG_Block( aCB, LDB, fFileName.c_str(), s.c_str() ); // hierarchical log if (f) { while (true) { // loop ... bool is0D= false; // last line ended with 0D ? // get lines, make it compatible for Windows, Mac and Linux q= &ch; s= ""; while (true) { if (fread( q, 1,1, f ) != 1) { ; // error ignored } if (feof( f )) break; if (*q=='\x0D') { is0D= true; break; } if (*q=='\x0A') { if (!is0D) break; *q= prv; is0D= false; } // if s += ch; prv= ch; } // while if (s.empty() && feof( f )) break; // .. until end of file q= (char*)s.c_str(); // remove possible UTF-8 lead-in if ((q[0] & 0xFF) == 0xEF && (q[1] & 0xFF) == 0xBB && (q[2] & 0xFF) == 0xBF) { q+=3; // skip UTF-8 lead-in DEBUG_Exotic_DB( aCB, MyDB,"", "UTF-8 lead-in skipped" ); } // if if (*q=='\0') continue; // empty line ? ReplaceLoad( q, rslt ); // textdb specific => normal q= (char*)rslt.c_str(); DEBUG_Exotic_DB( aCB, MyDB,"", "line='%s'", q ); // create index tree if (first) { actT= &actL->item; n= 0; qA= q; while ( *qA!='\0') { qR= strstr( qA,"\t" ); if (!qR) qR= qA + strlen( qA ); // no tab to skip if (n>1) // the index itself is not a field AddKey( aCB, withKey, qA,qR, n, actT, actL->len ); n++; if (*qR=='\0') break; qA= qR+1; } // while nMax= n; // keep it for later appending of additional elements actI= actL; // save it for later use } // if // create item elements if (!first || !withKey) { n= 0; qA= q; while ( *qA!='\0') { qR= strstr( qA,"\t" ); if (!qR) qR= qA + strlen( qA ); // no tab to skip if (n==0) { newL= new TDBItem; // create new item root newL->fCB= fCB; // inherit callback actF= &newL->item; qC= strstr( qA,"," ); if (!qC || qC>qR) qC= qR; /* separate itemID/parentID, if comma separator available */ newL->itemID.assign ( qA, (unsigned int)(qC-qA) ); if (qC!=qR) qC++; newL->parentID.assign( qC, (unsigned int)(qR-qC) ); actL->next= newL; ListNext ( actL ); } else if (n==1) newL->fToken.assign( qA, (unsigned int)(qR-qA) ); else { MakeField( actF, qA,qR, actL->len, true ); //printf( "A: %3d\n", actL->len ); actL->len+= ArrLen( "xx", actF->field.c_str() ); //printf( "B: %3d\n", actL->len ); } // if if (n>=nMax && actI!=NULL) { if (n>1) { //printf( "indexLenV=%d\n", actI->len ); AddKey( aCB, withKey, "???",NULL, n, actT, actI->len ); //printf( "indexLenN=%d\n", actI->len ); } // if nMax++; // adapt the new limit } // if if (*qR=='\0') break; qA= qR+1; n++; } // while } // if actL->len--; // termination is included //printf( "C: %3d\n", actL->len ); //printf( "D: '%s'\n", q ); first= false; // first run is done } // while fclose( f ); fLoaded = true; fChanged= false; } // if DEBUG_EndBlock( aCB, LDB ); return err; } // LoadDB TSyError TDBItem::SaveDB( bool withKey, void* aCB ) { cAppCharP SDB= "-SaveDB"; // collapsed display with '-' at the beginning TSyError err= LOCERR_OK; if (!fChanged) return LOCERR_OK; // nothing changed, no saving if (fFileName.empty()) return DB_NotFound; if (aCB==NULL) aCB= fCB; // get the default callback, if not overridden by FILE* f= fopen( fFileName.c_str(),"wb" ); if (!f) err= DB_NotFound; string s= "err=" + IntStr( err ); string rslt; DEBUG_Block( aCB, SDB, fFileName.c_str(), s.c_str() ); // hierarchical log if (f) { fputs( "\xEF\xBB\xBF", f ); // UTF-8 lead-in DEBUG_Exotic_DB( aCB, MyDB,"","UTF-8 lead-in written" ); string line; TDBItem* actI= this; while (withKey || ListNext( actI )) { line = actI->c_str(); // starting with the [","] line+= "\t"; line+= actI->fToken.c_str(); // append the timestamp int n= 0; TDBItemField* actF= &actI->item; // the item current field while (ListNext( actF )) { s= ""; // tab separated CStrToStrAppend( actF->field.c_str(), s, false, ARR_Sep ); // don't touch array separator ReplaceSave ( s.c_str(), rslt ); // normal => textdb specific line+= "\t" + rslt; n++; } // while int ii= line.length(); // remove empty items at the end while (ii>0) { if (line[ --ii ]!='\t') break; } line= line.substr( 0, ii+1 ); // now log and write the whole line DEBUG_DB( aCB, MyDB,"", "line='%s'", line.c_str() ); fprintf( f, "%s\r\n", line.c_str() ); withKey= false; } // while fclose( f ); fChanged= false; } // if DEBUG_EndBlock( aCB, SDB ); return err; } // SaveDB } /* namespace */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/dbitem.h0000644000373300037200000001747712424517753026426 0ustar00nightlyallusers00000000000000/* * File: dbitem.h * * Author: Beat Forster (bfo@synthesis.ch) * * * Example DBApi database adapter. * TDBItem class for item handling * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * */ #ifndef DBITEM_H #define DBITEM_H #include "sync_include.h" // import some global things #ifndef SYSYNC_ENGINE #include "stringutil.h" // local implementation of CStr <=> Str conversions #endif #define F_First "10000" // start number for item name (will be incremented) namespace sysync { // ---------- list templates ---------------------------------- //! go to the next element of . Returns true, if available template bool ListNext( T* &act ) { if (act) act= static_cast< T* >( act->next ); return act!=NULL; } // ListNext //! go to the next element of . Returns true, if available // the same with 2 parameters template bool ListNext( T1* &act1, T2* &act2 ) { return ListNext( act1 ) && ListNext( act2 ); } // ListNext template bool ListBack( T* &act, T* li ) // go to the previous element of . Returns true, if available { T* last; if (act==li) return false; do { last= li; } while (ListNext( li ) && li!=act); act= last; return true; } // ListBack template T* LastElem( T* li ) // go to the last element of . { T* act= NULL; ListBack( act,li ); return act; } // LastElem template void DeleteNext( T* &next, void* aCB= NULL, const char* s= "", bool dbg= false ) // delete the rest of the list { #ifndef ANDROID // no rtti support for Android if (dbg) DEBUG_Exotic_DB( aCB, "","Delete", "%s (%s)", typeid( T ).name(), s ); #endif if (next) { delete next; next= NULL; // don't let it undefined } // if } // DeleteNext template void MakeObj( T* &act ) // create an element at position of the given list { T* sv = static_cast< T* >( act->next ); // save it for linking later again act->next= static_cast< T* >( new T ); // create an element of the given type ListNext ( act ); act->next= sv; } // MakeObj // ---------- list class -------------------------------------- class TList : noncopyable { public: TList() { next= NULL; } // constructor virtual ~TList() { DeleteNext( next ); } // destructor (if not yet otherwise deleted) TList* next; // reference to the next element }; // TList // ---------- item field class -------------------------------- class TDBItemField : public TList { typedef TList inherited; public: TDBItemField() { next= NULL; } // constructor virtual ~TDBItemField() { TDBItemField** act= (TDBItemField**)&next; // destructor DeleteNext ( *act ); } string field; // the string field }; // TDBItemField // ---------- item class ------------------------------------- class TDBItem : public TDBItemField { typedef TDBItemField inherited; public: TDBItem( void* aCB= NULL ) { len= 1; fCB= aCB; fLoaded = false; fChanged= false; } // constructor virtual ~TDBItem() { TDBItem** act= (TDBItem**)&next; // destructor DeleteNext( *act, fCB, c_str(), true ); } TDBItemField item; // the header element int len; // length of all fields of this item bool fLoaded; // indicates, if already loaded bool fChanged; // indicates, if already changed string itemID; string parentID; const char* c_str(); // [","] void init( cAppCharP aItemID, cAppCharP aParentID, void* aCB= NULL, TDBItem* aNext= NULL ); // initalize void init( cAppCharP aItemID, void* aCB= NULL, TDBItem* aNext= NULL ); string fFileName; // the (full) file name for LoadDB/SaveDB private: string fID; // internal memory space for c_str() void Array_TDB ( cAppCharP &q, cAppCharP aKey, TDBItem* hdI, string &aVal ); public: string fToken; // the timestamp token (as string) void* fCB; // callback structure // two different versions, overloaded TSyError GetItem ( cItemID aID, TDBItem* &actL, bool first= true ); // get a specific item TSyError GetItem ( cAppCharP aItemID, TDBItem* &actL, bool first= true ); TSyError GetItem_2 ( cAppCharP aItemID, cAppCharP aField2, TDBItem* mpL, TDBItem* &actL ); // get item with specific field 0 // three different versions, overloaded TSyError DeleteItem ( cItemID aID ); TSyError DeleteItem ( cAppCharP aItemID ); TSyError DeleteItem ( TDBItem* actL ); TSyError ParentExist ( cAppCharP aItemID, cAppCharP aParentID ); void CreateItem ( string newItemID, string parentID, TDBItem* &actL ); // three different versions, overloaded TSyError CreateEmptyItem( ItemID aID, string &newItemID, TDBItem* &actL, string itemID= F_First ); TSyError CreateEmptyItem( cAppCharP aParentID, string &newItemID, TDBItem* &actL ); TSyError CreateEmptyItem ( string &newItemID, TDBItem* &actL ); TSyError UpdateField ( void* aCB, cAppCharP fKey, cAppCharP fVal, TDBItem* hdI= NULL, bool asName= true ); TSyError UpdateFields ( void* aCB, cAppCharP aItemData, TDBItem* hdI= NULL, bool asName= true, cAppCharP aNewToken= "" ); TSyError Field ( cAppCharP fKey, TDBItem* hdI, string &s ); bool SameField ( cAppCharP fKey, cAppCharP fVal, TDBItem* hdI ); void Disp_ItemData ( void* aCB, cAppCharP title, cAppCharP attrTxt, cAppCharP aItemData ); void Disp_Items ( void* aCB= NULL, cAppCharP txt= "", bool allFields= true, cAppCharP specificItem= "" ); // load and save the database from/to file TSyError LoadDB ( bool withKey, cAppCharP aPrefix= "", void* aCB= NULL ); TSyError SaveDB ( bool withKey, void* aCB= NULL ); }; // TDBItem // ---- utility functions ---------------------------------------------------------- /*! Create an item field */ void MakeField( TDBItemField* &act, cAppCharP field, cAppCharP fieldEnd, int &len, bool convert= false ); /*! Create a UTC token for time comparisons */ string CurrentTime( int secsOffs= 0, bool dateOnly= false ); /*! Compare time of ISO8601 with / */ int CompareTokens( string aToken, string aLastToken, string aResumeToken ); /*! combine key and field in a string */ string KeyAndField( cAppCharP sKey, cAppCharP sField ); string KeyAndField( TDBItemField* actKey, TDBItemField* actField ); /*! add some item fields to the beginning of . Result is . * If contains %1, it will be replaced by . * " " " %2, " " " " " */ void AddFields( string &aDat, string aAdd, cAppCharP param1= "", cAppCharP param2= "", cAppCharP param3= "", cAppCharP param4= "", cAppCharP param5= "" ); } /* namespace */ #endif /* DBITEM_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/engine_defs.h0000644000373300037200000003600412424517753027413 0ustar00nightlyallusers00000000000000/** * @File engine_defs.h * * @Author Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * @brief Definitions needed for the common engine interface * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ #ifndef ENGINE_DEFS_H #define ENGINE_DEFS_H #include "generic_types.h" #ifdef __cplusplus namespace sysync { #endif /* ---- supported charsets ---- */ enum TCharsetEnum { /** invalid */ CHS_UNKNOWN = 0, /** 7 bit ASCII-only, with nearest char conversion for umlauts etc. */ CHS_ASCII = 1, CHS_ANSI = 2, CHS_ISO_8859_1 = 3, CHS_UTF8 = 4, CHS_UTF16 = 5, CHS_GB2312 = 6, CHS_CP936 = 7, }; /* ---- line end modes ---- */ enum TLineendEnum { /** none specified */ LEM_NONE = 0, /** LF = 0x0A, Unix, Linux, MacOS X */ LEM_UNIX = 1, /** CR = 0x0D, Mac OS classic */ LEM_MAC = 2, /** CRLF = 0x0D 0x0A, Windows, DOS */ LEM_DOS = 3, /** as in C strings, '\n' which is 0x0A normally (but might be 0x0D on some platforms) */ LEM_CSTR = 4, /** 0x0B (filemaker tab-separated text format, CR is shown as 0x0B within fields */ LEM_FILEMAKER = 5 }; /* ---- literal quoting modes ---- */ enum TQuotingEnum { /** none specified */ QM_NONE = 0, /** single quote must be duplicated */ QM_DUPLSINGLE = 1, /** double quote must be duplicated */ QM_DUPLDOUBLE = 2, /** C-string-style escapes of CR,LF,TAB,BS,\," and ' (but no full c-string escape with \xXX etc.) */ QM_BACKSLASH = 3 }; /* ---- time formats ---- */ enum TTimeModeEnum { /** SySync lineartime (64 bit milliseconds) */ TMODE_LINEARTIME = 0, /** SySync lineardate (32 bit days) */ TMODE_LINEARDATE = 1, /** Unix epoch time (32 bit seconds) */ TMODE_UNIXTIME = 2, /** Unix epoch time (64 bit milliseconds) */ TMODE_UNIXTIME_MS = 3, /** Flag that can be added for time in UTC */ TMODE_FLAG_UTC = 0x8000, /** Flag that can be added for time as-is */ TMODE_FLAG_FLOATING = 0x4000, /** Mask to separate time mode */ TMODE_MODEMASK = 0x003F }; /* ---- path separator for settings key paths ---- */ #define SETTINGSKEY_PATH_SEPARATOR '/' /* ---- key/value special IDs ---- */ enum TKeyValEnum { /** special ID to signal unknown subkey or value */ KEYVAL_ID_UNKNOWN = -1, /** special ID to open first subkey */ KEYVAL_ID_FIRST = -2, /** special ID to open next subkey */ KEYVAL_ID_NEXT = -3, /** special ID to create new subkey (empty values) */ KEYVAL_ID_NEW = -4, /** special ID to create new subkey and initialize with (hard-coded or engine-config-predefined) default values */ KEYVAL_ID_NEW_DEFAULT = -5, /** special ID to create new subkey using previously opened subkey as template for initializing values */ KEYVAL_ID_NEW_DUP = -6, /** special ID for values that cannot be accessed by ID AT ALL */ KEYVAL_NO_ID = -7, /** special ID to specify entire contents of a container */ KEYVAL_ID_ALL = -8 }; /* ---- special value names ---- */ #define VALNAME_FIRST ".FIRST" /* for GetValueID(): get first value, for keys that support value iteration */ #define VALNAME_NEXT ".NEXT" /* for GetValueID(): get next value, for keys that support value iteration */ #define VALNAME_FLAG ".FLAG" /* for GetValueID(): get flag mask that can be added to value ID to get special attributes of a value instead of main value */ /* ---- special value name suffixes (not available for all settings keys, but primarily for item keys) ---- */ #define VALSUFF_NAME ".VALNAME" /* return field/value name as VALTYPE_TEXT */ #define VALSUFF_TYPE ".VALTYPE" /* return value's native type (VALTYPE_xxx) name as VALTYPE_INT16 */ #define VALSUFF_ARRSZ ".ARRAYSIZE" /* return size of array as VALTYPE_INT16. Returns DB_NotFound for non-array values */ #define VALSUFF_TZNAME ".TZNAME" /* if value is a time stamp, returns name of the time zone as VALTYPE_TEXT (empty=floating) */ #define VALSUFF_TZOFFS ".TZOFFS" /* if value is a time stamp, returns minute offset east of GMT as VALTYPE_INT16, DB_NotFound for floating timestamps */ #define VALSUFF_NORM ".NORM" /* return normalized value of field */ /* ---- value types ---- */ enum TValTypeEnum { /** Unknown */ VALTYPE_UNKNOWN = 0, /** 8-bit integer */ VALTYPE_INT8 = 1, /** 16-bit integer */ VALTYPE_INT16 = 2, /** 32-bit integer */ VALTYPE_INT32 = 3, /** 64-bit integer */ VALTYPE_INT64 = 4, /** enum (for the SDK user, this is equivalent to VALTYPE_INT8) */ VALTYPE_ENUM = 5, /** no value (for writing only, only works for values that have no value status) */ VALTYPE_NULL = 6, /** raw buffer, binary (for texts, will return application charset, null terminated) */ VALTYPE_BUF = 10, /** text in charset / line-end mode as specified with SetTextMode() */ VALTYPE_TEXT = 20, /** internal use only: text, internally saved in obfuscated format */ VALTYPE_TEXT_OBFUS = 21, /** time specification 64 bit in format specified with SetTimeMode() */ VALTYPE_TIME64 = 30, /** time specification 32 bit in format specified with SetTimeMode() */ VALTYPE_TIME32 = 31, }; /* ---- application feature numbers ---- */ enum TAppFeatureEnum { /** client autosync */ APP_FTR_AUTOSYNC = 1, /** client IPP/DMU */ APP_FTR_IPP = 2, /** client settings for event date range */ APP_FTR_EVENTRANGE = 3, /** client settings for email date and maxsize range */ APP_FTR_EMAILRANGE = 4 }; /* ---- danger flags ---- */ enum TDangerEnum { /** sync session will zap client data */ DANGERFLAG_WILLZAPCLIENT = 1, /** sync session will zap server data */ DANGERFLAG_WILLZAPSERVER = 2 }; /* ---- read-only indicators for certain settings fields --- */ enum TReadOnlyEnum { /** server URI is read-only */ RDONLY_URI = 1, /** URI path suffix is read-only */ RDONLY_URIPATH = 2, /** protocol (transport http/https flag as well as SyncML version) are read-only */ RDONLY_PROTOCOL = 4, /** DB path names */ RDONLY_DBPATH = 8, /** profile may not be deleted or renamed (but non-readonly options can be set) */ RDONLY_PROFILE = 16, /** proxy settings (except proxy auth settings) are read-only */ RDONLY_PROXY = 32 }; /** * Profile modes (MIME DIR mode). * * These are the values also used as parameter of the * MAKETEXTWITHPROFILE/PARSETEXTWITHPROFILE macros. */ enum ProfileModeEnum { PROFILEMODE_DEFAULT = 0, /**< default mode of profile */ PROFILEMODE_OLD = 1, /**< vCard 2.1 and vCalendar 1.0 style */ PROFILEMODE_MIMEDIR = 2 /**< MIME-DIR = vCard 3.0, iCalendar 2.0 style */ }; /* ---- bit definitons for "profileFlags" profile field --- */ enum TProfileFlagsEnum { /** we should log the next session (not handled in engine!) */ PROFILEFLAG_LOGNEXTSYNC = 0x00000001, /** run session in legacy mode */ PROFILEFLAG_LEGACYMODE = 0x00000002, /** run session in lenient mode */ PROFILEFLAG_LENIENTMODE = 0x00000004, /** we should keep msg logs of the next session (not handled in engine!) */ PROFILEFLAG_MSGNEXTSYNC = 0x00000008, /** we should use this profile in global syncs (not handled in engine!) */ PROFILEFLAG_USEINGLOBSYNC = 0x00000008 }; /* ---- bit definitons for "transpFlags" profile field --- */ enum TTranspFlagsEnum { /** SSL certificate verification/expiration errors should be ignored (not handled in engine!) */ TRANSPFLAG_SSLIGNORECERTFAIL = 0x00000001, /** use http auth for server connection (not handled in engine!) */ TRANSPFLAG_USEHTTPAUTH = 0x00000002 }; /* ---- step commands ---- */ /* - input to engine */ enum TStepCmdEnum { /** start a new client session */ STEPCMD_CLIENTSTART = 1, /** start a autosync session */ STEPCMD_CLIENTAUTOSTART = 2, /** just run next step */ STEPCMD_STEP = 10, /** run next step (after receiving STEPCMD_NEEDDATA and putting received SyncML data into buffer using GetSyncMLBuffer/ReturnSyncMLBuffer) */ STEPCMD_GOTDATA = 11, /** run next step (after receiving STEPCMD_SENDDATA and sending SyncML data from buffer using GetSyncMLBuffer/ReturnSyncMLBuffer) */ STEPCMD_SENTDATA = 12, /** suspend the session. Note that this command can be issued out-of order instead of the next pending command (STEPCMD_GOTDATA, STEPCMD_SENTDATA, STEPCMD_STEP) and will always return STEPCMD_OK. The next in-order STEPCMD_xx must be issued in the next step to complete the suspend */ STEPCMD_SUSPEND = 20, /** abort the session (user abort) */ STEPCMD_ABORT = 21, /** transport failure causes aborting the session */ STEPCMD_TRANSPFAIL = 22, /** timeout causes aborting the session */ STEPCMD_TIMEOUT = 23, /** process SAN in SyncML buffer */ STEPCMD_SAN_CHECK = 40, /** check for periodic autosync */ STEPCMD_AUTOSYNC_CHECK = 41, /* - output from engine */ /** engine returns to caller w/o progress info, and should be called again ASAP with STEPCMD_STEP or, if the previous call was STEPCMD_SUSPEND, with the step command that was pending before doing the suspend (for example STEPCMD_GOTDATA, STEPCMD_SENTDATA, STEPCMD_STEP) */ STEPCMD_OK = 100, /** engine returns to caller to show progress, and should be called again ASAP with STEPCMD_STEP */ STEPCMD_PROGRESS = 101, /** error (see return value of SessionStep call) */ STEPCMD_ERROR = 102, /** engine has new data to send to remote, use GetSyncMLBuffer() to get access to the engine buffer containing the message */ STEPCMD_SENDDATA = 110, /** engine needs new data, use GetSyncMLBuffer() to get access to the empty buffer where to put data */ STEPCMD_NEEDDATA = 111, /** engine needs to reset status to resend data */ STEPCMD_RESENDDATA = 112, /** session done, SAN processed, Autosync checked etc. No further action required */ STEPCMD_DONE = 120, /** communication session ends here (close connection!) but SyncML session continues */ STEPCMD_RESTART = 121, /** STEPCMD_AUTOSYNC_CHECK or STEPCMD_SAN_CHECK has detected need for performing a sync session */ STEPCMD_NEEDSYNC = 130 }; /* ---- session type selectors */ enum TSessionSelectorEnum { /* - binfile client engine selectors */ /** normal client session base selector value, add profile ID to select profile */ SESSIONSEL_CLIENT_NORMAL = 0x00000000, /** mask to extract profile ID from selector */ SESSIONSEL_PROFILEID_MASK = 0x0FFFFFFF, /** Autosync (timed, IPP, SAN) checking session */ SESSIONSEL_CLIENT_AS_CHECK = 0x10000000, /* - other special session selectors */ /** test session to access a datastore using DBAPI-like calls */ SESSIONSEL_DBAPI_TUNNEL = 0x80000001 }; /* ---- XML config data reader func type ---- */ #if defined _WIN32 && !defined _MSC_VER #define _CALLING_ __stdcall #else #define _CALLING_ #endif typedef int _CALLING_ (*TXMLConfigReadFunc)( appCharP aBuffer, bufferIndex aMaxSize, bufferIndex *aReadCharsP, void *aContext ); /* ---- Engine progress information ---- */ /* - progress event types */ enum TProgressEventEnum { /* global */ /** some fatal aborting error */ PEV_ERROR = 0, /** extra messages */ PEV_MESSAGE = 1, /** extra error code */ PEV_ERRCODE = 2, /** no extra message, just called to allow aborting */ PEV_NOP = 3, /** called to signal main program, that caller would want to wait for extra1 milliseconds */ PEV_WAIT = 4, /** called to allow debug interactions, extra1=code */ PEV_DEBUG = 5, /* transport-related */ PEV_SENDSTART = 6, PEV_SENDEND = 7, PEV_RECVSTART = 8, PEV_RECVEND = 9, /** expired */ PEV_SSL_EXPIRED = 10, /** not completely trusted */ PEV_SSL_NOTRUST = 11, /** sent periodically when waiting for network, allows application to check connection */ PEV_CONNCHECK = 12, /** sent when client could initiate a explicit suspend */ PEV_SUSPENDCHECK = 13, /* general */ /** alert 100 received from remote, SessionKey's "displayalert" value contains message */ PEV_DISPLAY100 = 14, /* session-related */ PEV_SESSIONSTART = 15, /** session ended, probably with error in extra */ PEV_SESSIONEND = 16, /* datastore-related */ /** preparing (e.g. preflight in some clients), extra1=progress, extra2=total */ PEV_PREPARING = 17, /** deleting (zapping datastore), extra1=progress, extra2=total */ PEV_DELETING = 18, /** datastore alerted (extra1=0 for normal, 1 for slow, 2 for first time slow, extra2=1 for resumed session, extra3=syncmode: 0=twoway, 1=fromserver, 2=fromclient) This used to be reported only in client mode, directly after receiving and checking the ALERT command from the server. Now this event is also reported in server mode at that point in time where the final sync mode is known (in other words, after the client acknowledged the alerted sync mode). Note that a server cannot reliably distinguish between "refresh-from-server" and "slow" sync. A client might delete all its data and then do a "slow" sync - the Synthesis engine itself does that. */ PEV_ALERTED = 19, /** sync started */ PEV_SYNCSTART = 20, /** item received, extra1=current item count, extra2=number of expected changes (if >= 0) */ PEV_ITEMRECEIVED = 21, /** item sent, extra1=current item count, extra2=number of expected items to be sent (if >=0) */ PEV_ITEMSENT = 22, /** item locally processed, extra1=# added, extra2=# updated, extra3=# deleted */ PEV_ITEMPROCESSED = 23, /** sync finished, probably with error in extra1 (0=ok), syncmode in extra2 (0=normal, 1=slow, 2=first time), extra3=1 for resumed session) */ PEV_SYNCEND = 24, /** datastore statistics for local (extra1=# added, extra2=# updated, extra3=# deleted) */ PEV_DSSTATS_L = 25, /** datastore statistics for remote (extra1=# added, extra2=# updated, extra3=# deleted) */ PEV_DSSTATS_R = 26, /** datastore statistics for local/remote rejects (extra1=# locally rejected, extra2=# remotely rejected) */ PEV_DSSTATS_E = 27, /** datastore statistics for server slowsync (extra1=# slowsync matches) */ PEV_DSSTATS_S = 28, /** datastore statistics for server conflicts (extra1=# server won, extra2=# client won, extra3=# duplicated) */ PEV_DSSTATS_C = 29, /** datastore statistics for data volume (extra1=outgoing bytes, extra2=incoming bytes) */ PEV_DSSTATS_D = 30, /** engine is in process of suspending */ PEV_SUSPENDING = 31, /** * range of event codes that can be used by applications for their * own purposes */ PEV_CUSTOM_START = 128, PEV_CUSTOM_END = 255 }; /* - progress event structure */ typedef struct TEngineProgressType { uInt16 eventtype; /* PEV_XXX definition */ sInt32 targetID; /* target ID if event is specific to a target, KEYVAL_ID_UNKNOWN if session global */ sIntPtr extra1; /* extra info, such as error code or count for progress or # of added items */ sIntPtr extra2; /* extra info, such as total for progress or # of updated items */ sIntPtr extra3; /* extra info, such as # of deleted items */ } TEngineProgressInfo; #ifdef __cplusplus } // namespace #endif #endif /* ENGINE_DEFS_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/enginemodulebase.cpp0000755000373300037200000001502112424517753031005 0ustar00nightlyallusers00000000000000/** * @File enginemodulebase.cpp * * @Author Beat Forster (bfo@synthesis.ch) * * @brief TEngineModuleBase * engine bus bar class * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ #include "prefix_file.h" #include "enginemodulebase.h" #include "SDK_util.h" #if defined SYSYNC_ENGINE || defined SYSYNC_ENGINE_TEST #include "engineentry.h" #endif #if !defined(SYSYNC_ENGINE) || defined(ENGINEINTERFACE_SUPPORT) namespace sysync { // TEngineModuleBase // ================= // local name #define MyName "enginemodulebase" // constructor TEngineModuleBase::TEngineModuleBase() { fCI = NULL; fEngineName= ""; // none fPrgVersion= 0; fDebugFlags= 0; fCIisStatic= false; } // TEngineModuleBase // destructor TEngineModuleBase::~TEngineModuleBase() { #if defined SYSYNC_ENGINE || defined SYSYNC_ENGINE_TEST if (fCI && !fCIisStatic) delete fCI; #endif } // ~TEngineModuleBase // --- Initial connection ------------------------ TSyError TEngineModuleBase::Connect( string aEngineName, CVersion aPrgVersion, uInt16 aDebugFlags) { TSyError err= LOCERR_OK; fEngineName = aEngineName; fPrgVersion = aPrgVersion; fDebugFlags = aDebugFlags; #if defined SYSYNC_ENGINE || defined SYSYNC_ENGINE_TEST uInt16 cbVersion= DB_Callback_Version; // use current by default if (fCI==NULL) { fCI = &fCIBuffer; fCIisStatic = true; } else { cbVersion= fCI->callbackVersion; // the cbVersion from outside (ConnectEngineS) } // if InitCallback_Exotic( fCI, cbVersion ); // be aware that it could be an older version fCI->thisBase= this; // get later for callback calls CB_Connect ( fCI ); #endif if (fPrgVersion==0) fPrgVersion= Plugin_Version( 0 ); // take the internal one if (fPrgVersiondebugFlags= fDebugFlags; if (!err) err= Init(); DEBUG_DB( fCI, MyName, "Connect","version=%08X flags=%04X err=%d", fPrgVersion, fDebugFlags, err ); return err; } // Connect TSyError TEngineModuleBase::Disconnect() { if (!fCI) return LOCERR_OK; DEBUG_DB( fCI, MyName, "Disconnect","" ); TSyError err= Term(); return err; } // Disconnect // ---------------------------------------------------------------------------------------------- TSyError TEngineModuleBase::GetStrValue( KeyH aKeyH, cAppCharP aValName, string &aText ) { TSyError err; const int txtFieldSize= 80; // a readonable string length to catch it at once char txtField[ txtFieldSize ]; memSize txtSize; char* f= (char*)&txtField; // try directly to fit in a short string first err= GetValue( aKeyH, aValName, VALTYPE_TEXT, f, txtFieldSize, txtSize ); bool tooShort= err==LOCERR_TRUNCATED; if (tooShort) { err= GetValue( aKeyH, aValName, VALTYPE_TEXT, f, 0, txtSize ); // get size f= (char*)malloc( txtSize+1 ); // plus NUL termination err= GetValue( aKeyH, aValName, VALTYPE_TEXT, f, txtSize+1, txtSize ); // no error anymore } // if aText.assign(f, txtSize); // assign it if (tooShort) free( f ); // and deallocate again, if used dynamically return err; } // GetStrValue; TSyError TEngineModuleBase::SetStrValue( KeyH aKeyH, cAppCharP aValName, string aText ) { // -1 automatically calculate length from null-terminated string return SetValue( aKeyH, aValName, VALTYPE_TEXT, aText.c_str(), (memSize)-1 ); } // SetStrValue // ---------------------------------------------------------------------------------------------- TSyError TEngineModuleBase::GetInt8Value( KeyH aKeyH, cAppCharP aValName, sInt8 &aValue ) { memSize vSize; return GetValue( aKeyH, aValName, VALTYPE_INT8, &aValue, sizeof(aValue), vSize ); } // GetInt8Value TSyError TEngineModuleBase::GetInt8Value( KeyH aKeyH, cAppCharP aValName, uInt8 &aValue ) { memSize vSize; return GetValue( aKeyH, aValName, VALTYPE_INT8, &aValue, sizeof(aValue), vSize ); } // GetInt8Value TSyError TEngineModuleBase::SetInt8Value( KeyH aKeyH, cAppCharP aValName, uInt8 aValue ) { return SetValue( aKeyH, aValName, VALTYPE_INT8, &aValue, sizeof(aValue) ); } // SetInt8Value // ---------------------------------------------------------------------------------------------- TSyError TEngineModuleBase::GetInt16Value( KeyH aKeyH, cAppCharP aValName, sInt16 &aValue ) { memSize vSize; return GetValue( aKeyH, aValName, VALTYPE_INT16, &aValue, sizeof(aValue), vSize ); } // GetInt16Value TSyError TEngineModuleBase::GetInt16Value( KeyH aKeyH, cAppCharP aValName, uInt16 &aValue ) { memSize vSize; return GetValue( aKeyH, aValName, VALTYPE_INT16, &aValue, sizeof(aValue), vSize ); } // GetInt16Value TSyError TEngineModuleBase::SetInt16Value( KeyH aKeyH, cAppCharP aValName, uInt16 aValue ) { return SetValue( aKeyH, aValName, VALTYPE_INT16, &aValue, sizeof(aValue) ); } // SetInt16Value // ---------------------------------------------------------------------------------------------- TSyError TEngineModuleBase::GetInt32Value( KeyH aKeyH, cAppCharP aValName, sInt32 &aValue ) { memSize vSize; return GetValue( aKeyH, aValName, VALTYPE_INT32, &aValue, sizeof(aValue), vSize ); } // GetInt32Value TSyError TEngineModuleBase::GetInt32Value( KeyH aKeyH, cAppCharP aValName, uInt32 &aValue ) { memSize vSize; return GetValue( aKeyH, aValName, VALTYPE_INT32, &aValue, sizeof(aValue), vSize ); } // GetInt32Value TSyError TEngineModuleBase::SetInt32Value( KeyH aKeyH, cAppCharP aValName, uInt32 aValue ) { return SetValue( aKeyH, aValName, VALTYPE_INT32, &aValue, sizeof(aValue) ); } // SetInt32Value // ---------------------------------------------------------------------------------------------- void TEngineModuleBase::AppendSuffixToID( KeyH aKeyH, sInt32 &aID, cAppCharP aSuffix ) { string s= aSuffix; if (s=="") return; s= VALNAME_FLAG + s; aID+= GetValueID( aKeyH, s.c_str() ); } // AppendSuffixToID } // namespace sysync /* end of TEngineModuleBase implementation */ #endif // not used in engine or engine with ENGINEINTERFACE_SUPPORT // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/enginemodulebase.h0000755000373300037200000005553012424517753030463 0ustar00nightlyallusers00000000000000/** * @File enginemodulebase.h * * @Author Beat Forster (bfo@synthesis.ch) * * @brief TEngineModuleBase * engine bus bar class * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ #ifndef ENGINEMODULEBASE_H #define ENGINEMODULEBASE_H #include "generic_types.h" #include "sync_dbapidef.h" #include "sysync_noncopyable.h" // we need STL strings #include using namespace std; namespace sysync { // Engine module base class TEngineModuleBase : noncopyable { SDK_Interface_Struct fCIBuffer; // used for fCI if the caller of Connect() doesn't set something public: TEngineModuleBase(); // constructor virtual ~TEngineModuleBase(); // destructor UI_Call_In fCI; // call in structure string fEngineName; // name of the SyncML engine to be connected CVersion fPrgVersion; // program's SDK version uInt16 fDebugFlags; // debug flags to be used bool fCIisStatic; // this is kept purely for source code backwards compatibility: // because fCI is *always* statically allocated TSyError Connect( string aEngineName, // connect the SyncML engine CVersion aPrgVersion= 0, uInt16 aDebugFlags= DBG_PLUGIN_NONE ); TSyError Disconnect(); // disconnect the SyncML engine virtual TSyError Init() = 0; virtual TSyError Term() = 0; // Engine init // ----------- /// @brief Set the global mode for string paramaters (when never called, default params are UTF-8 with C-style line ends) /// @param aCharSet[in] charset /// @param aLineEndMode[in] line end mode (default is C-lineends of the platform (almost always LF)) /// @param aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SetStringMode ( uInt16 aCharSet, uInt16 aLineEndMode= LEM_CSTR, bool aBigEndian = false ) = 0; /// @brief init object, optionally passing XML config text in memory /// @param aConfigXML[in] NULL or empty string if no external config needed, config text otherwise /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError InitEngineXML ( cAppCharP aConfigXML ) = 0; /// @brief init object, optionally passing a open FILE for reading config /// @param aConfigFilePath[in] path to config file /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError InitEngineFile ( cAppCharP aConfigFilePath ) = 0; /// @brief init object, optionally passing a callback for reading config /// @param aReaderFunc[in] callback function which can deliver next chunk of XML config data /// @param aContext[in] free context pointer passed back with callback /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError InitEngineCB ( TXMLConfigReadFunc aReaderFunc, void *aContext ) = 0; // Running a Sync Session // ---------------------- /// @brief Open a session /// @param aNewSessionH[out] receives session handle for all session execution calls /// @param aSelector[in] selector, depending on session type. For multi-profile clients: profile ID to use /// @param aSessionName[in] a text name/id to identify a session, useage depending on session type. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSession( SessionH &aNewSessionH, uInt32 aSelector=0, cAppCharP aSessionName=NULL ) = 0; /// @brief open session specific runtime parameter/settings key /// @note key handle obtained with this call must be closed BEFORE SESSION IS CLOSED! /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aSessionH[in] session handle obtained with OpenSession. /// When used as callback from DBApi, this parameter is irrelevant and /// must be set to NULL as a callback from DBApi has an implicit session context /// automatically. /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSessionKey ( SessionH aSessionH, KeyH &aNewKeyH, uInt16 aMode ) = 0; /// @brief Executes sync session or other sync related activity step by step /// @param aSessionH[in] session handle obtained with OpenSession /// @param aStepCmd[in/out] step command (STEPCMD_xxx): /// - tells caller to send or receive data or end the session etc. /// - instructs engine to suspend or abort the session etc. /// @param aInfoP[in] pointer to a TEngineProgressInfo structure, NULL if no progress info needed /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SessionStep( SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP = NULL ) = 0; /// @brief Get access to SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aForSend[in] direction send/receive /// @param aBuffer[out] receives pointer to buffer (empty for receive, full for send) /// @param aBufSize[out] receives size of empty or full buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError GetSyncMLBuffer( SessionH aSessionH, bool aForSend, appPointer &aBuffer, memSize &aBufSize ) = 0; /// @brief Return SyncML message buffer to engine /// @param aSessionH[in] session handle obtained with OpenSession /// @param aForSend[in] direction send/receive /// @param aProcessed[in] number of bytes put into or read from the buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError RetSyncMLBuffer( SessionH aSessionH, bool aForSend, memSize aProcessed ) = 0; /// @brief Read data from SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[in] pointer to buffer /// @param aBufSize[in] size of buffer, maximum to be read /// @param aMsgSize[out] size of data available in the buffer for read INCLUDING just returned data. /// @note If the aBufSize is too small to return all available data LOCERR_TRUNCATED will be returned, and the /// caller can repeat calls to ReadSyncMLBuffer to get the next chunk. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError ReadSyncMLBuffer ( SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize &aMsgSize ) = 0; /// @brief Write data to SyncML message buffer /// @param aSessionH[in] session handle obtained with OpenSession /// @param aBuffer[in] pointer to buffer /// @param aMsgSize[in] size of message to write to the buffer /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError WriteSyncMLBuffer( SessionH aSessionH, appPointer aBuffer, memSize aMsgSize ) = 0; /// @brief Close a session /// @note It depends on session type if this also destroys the session or if it may persist and can be re-opened. /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError CloseSession( SessionH aSessionH ) = 0; // Settings access // --------------- /// @brief open Settings key by path specification /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aParentKeyH[in] NULL if path is absolute from root, handle to an open key for relative access /// @param aPath[in] the path specification as null terminated string /// @param aMode[in] the open mode /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError OpenKeyByPath ( KeyH &aNewKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ) = 0; /// @brief open Settings subkey key by ID or iterating over all subkeys /// @param aNewKeyH[out] receives the opened key's handle on success /// @param aParentKeyH[in] handle to the parent key /// @param aID[in] the ID of the subkey to open, /// or KEYVAL_ID_FIRST/KEYVAL_ID_NEXT to iterate over existing subkeys /// or KEYVAL_ID_NEW to create a new subkey /// @param aMode[in] the open mode /// @return LOCERR_OK on success, DB_NoContent when no more subkeys are found with /// KEYVAL_ID_FIRST/KEYVAL_ID_NEXT /// or any other SyncML or LOCERR_xxx error code on failure virtual TSyError OpenSubkey ( KeyH &aNewKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ) = 0; /// @brief delete Settings subkey key by ID /// @param aParentKeyH[in] handle to the parent key /// @param aID[in] the ID of the subkey to delete /// @return LOCERR_OK on success /// or any other SyncML or LOCERR_xxx error code on failure virtual TSyError DeleteSubkey ( KeyH aParentKeyH, sInt32 aID ) = 0; /// @brief Get key ID of currently open key. Note that the Key ID is only locally unique within /// the parent key. /// @param aKeyH[in] an open key handle /// @param aID[out] receives the ID of the open key, which can be used to re-access the /// key within its parent using OpenSubkey() /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError GetKeyID ( KeyH aKeyH, sInt32 &aID ) = 0; /// @brief Set text format parameters (when never called, default params are those set with global SetStringMode()) /// @param aKeyH[in] an open key handle /// @param aCharSet[in] charset /// @param aLineEndMode[in] line end mode (defaults to C-lineends of the platform (almost always LF)) /// @param aBigEndian[in] determines endianness of UTF16 text (defaults to little endian = intel order) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SetTextMode ( KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode= LEM_CSTR, bool aBigEndian = false ) = 0; /// @brief Set time format parameters /// @param aKeyH[in] an open key handle /// @param aTimeMode[in] time mode, see TMODE_xxx (default is platform's lineratime_t when SetTimeMode() is not used) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError SetTimeMode ( KeyH aKeyH, uInt16 aTimeMode ) = 0; /// @brief Closes a key opened by OpenKeyByPath() or OpenSubKey() /// @param aKeyH[in] an open key handle. Will be invalid when call returns with LOCERR_OK. Do not re-use! /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError CloseKey ( KeyH aKeyH ) = 0; /// @brief Reads a named value in specified format into passed memory buffer /// @param aKeyH[in] an open key handle /// @param aValueName[in] name of the value to read. Some keys offer special ".XXX" /// suffixes to value names, which return alternate values (like a timestamp field's /// time zone name with ".TZNAME"). /// @param aValType[in] desired return type, see VALTYPE_xxxx /// @param aBuffer[in/out] buffer where to store the data /// @param aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) /// Note: to get only size of a value (useful especially for strings), pass 0 as buffer size. /// @param aValSize[out] actual size of value. /// For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator /// Note that this will be set also when return value is LOCERR_BUFTOOSMALL, /// to indicate the required buffer size /// For values that can be truncated (strings), LOCERR_TRUNCATED will be returned /// when returned value is not entire value - aValSize is truncated size then. /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure virtual TSyError GetValue ( KeyH aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) = 0; /// @brief get value's ID for use with Get/SetValueByID() /// @param aKeyH[in] an open key handle /// @param aName[in] name of the value to write. Some keys offer special ".FLAG.XXX" /// values, which return flag bits which can be added to the regular ID to obtain /// alternate values (like the value name with ".FLAG.VALNAME", useful when iterating /// over values). /// @return KEYVAL_ID_UNKNOWN when no ID available for name, ID of value otherwise virtual sInt32 GetValueID ( KeyH aKeyH, cAppCharP aName ) = 0; /// @brief Reads a named value in specified format into passed memory buffer /// @param aKeyH[in] an open key handle /// @param aID[in] ID of the value to read /// @param arrIndex[in] 0-based array element index for array values. /// @param aValType[in] desired return type, see VALTYPE_xxxx /// @param aBuffer[in/out] buffer where to store the data /// @param aBufSize[in] size of buffer in bytes (ALWAYS in bytes, even if value is Unicode string) /// Note: to get only size of a value (useful especially for strings), pass 0 as buffer size. /// @param aValSize[out] actual size of value. /// For VALTYPE_TEXT, size is string length (IN BYTES) excluding NULL terminator /// Note that this will be set also when return value is LOCERR_BUFTOOSMALL, /// to indicate the required buffer size /// For values that can be truncated (strings), LOCERR_TRUNCATED will be returned /// when returned value is not entire value - aValSize is truncated size then. /// @return LOCERR_OK on success, LOCERR_OUTOFRANGE when array index is out of range /// SyncML or LOCERR_xxx error code on other failure virtual TSyError GetValueByID ( KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) = 0; /// @brief Writes a named value in specified format passed in memory buffer /// @param aKeyH[in] an open key handle /// @param aValueName[in] name of the value to write. Some keys offer special ".XXX" /// suffixes to value names, which are used to set alternate values (like a /// timestamp field's time zone name with ".TZNAME"). /// @param aValType[in] type of value passed in, see VALTYPE_xxxx /// @param aBuffer[in] buffer containing the data /// @param aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure. If value /// buffer passed in is too small for aValType (such as only 2 bytes for a VALTYPE_INT32, /// LOCERR_BUFTOOSMALL will be returned and nothing stored. If buffer passed in is too /// long (e.g. for strings) to be entirely stored, only the beginning is stored and /// LOCERR_TRUNCATED is returned. virtual TSyError SetValue ( KeyH aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) = 0; /// @brief Writes a named value in specified format passed in memory buffer /// @param aKeyH[in] an open key handle /// @param aID[in] ID of the value to read /// @param arrIndex[in] 0-based array element index for array values. /// @param aValType[in] type of value passed in, see VALTYPE_xxxx /// @param aBuffer[in] buffer containing the data /// @param aValSize[in] size of value. For VALTYPE_TEXT, size can be passed as -1 if string is null terminated /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure. If value /// buffer passed in is too small for aValType (such as only 2 bytes for a VALTYPE_INT32, /// LOCERR_BUFTOOSMALL will be returned and nothing stored. If buffer passed in is too /// long (e.g. for strings) to be entirely stored, only the beginning is stored and /// LOCERR_TRUNCATED is returned. virtual TSyError SetValueByID ( KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) = 0; // Convenience routines to close and NULL a handle in one step // ----------------------------------------------------------- /// @brief Closes a key and nulls the handle /// @param aKeyH[in/out] an open key handle. Will be set to NULL on exit (to make sure it is not re-used) /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError CloseKeyAndNULL ( KeyH &aKeyH ) { TSyError sta = CloseKey(aKeyH); if (sta==LOCERR_OK) aKeyH=NULL; return sta; }; /// @brief Closes a session and nulls the handle /// @param aSessionH[in] session handle obtained with OpenSession /// @return LOCERR_OK on success, SyncML or LOCERR_xxx error code on failure TSyError CloseSessionAndNULL ( SessionH &aSessionH ) { TSyError sta = CloseSession(aSessionH); if (sta==LOCERR_OK) aSessionH=NULL; return sta; }; // Convenience routines to access Get/SetValue for specific types // -------------------------------------------------------------- virtual TSyError GetStrValue ( KeyH aKeyH, cAppCharP aValName, string &aText ); virtual TSyError SetStrValue ( KeyH aKeyH, cAppCharP aValName, string aText ); virtual TSyError GetInt8Value ( KeyH aKeyH, cAppCharP aValName, sInt8 &aValue ); // signed virtual TSyError GetInt8Value ( KeyH aKeyH, cAppCharP aValName, uInt8 &aValue ); // unsigned virtual TSyError SetInt8Value ( KeyH aKeyH, cAppCharP aValName, uInt8 aValue ); virtual TSyError GetInt16Value ( KeyH aKeyH, cAppCharP aValName, sInt16 &aValue ); // signed virtual TSyError GetInt16Value ( KeyH aKeyH, cAppCharP aValName, uInt16 &aValue ); // unsigned virtual TSyError SetInt16Value ( KeyH aKeyH, cAppCharP aValName, uInt16 aValue ); virtual TSyError GetInt32Value ( KeyH aKeyH, cAppCharP aValName, sInt32 &aValue ); // signed virtual TSyError GetInt32Value ( KeyH aKeyH, cAppCharP aValName, uInt32 &aValue ); // unsigned virtual TSyError SetInt32Value ( KeyH aKeyH, cAppCharP aValName, uInt32 aValue ); virtual void AppendSuffixToID ( KeyH aKeyH, sInt32 &aID, cAppCharP aSuffix ); // Tunnel Interface Methods --------------------------------------------------------------------- virtual TSyError StartDataRead ( SessionH aSessionH, cAppCharP lastToken, cAppCharP resumeToken ) = 0; virtual TSyError ReadNextItem ( SessionH aSessionH, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) = 0; virtual TSyError ReadItem ( SessionH aSessionH, cItemID aID, appCharP *aItemData ) = 0; virtual TSyError EndDataRead ( SessionH aSessionH ) = 0; virtual TSyError StartDataWrite ( SessionH aSessionH ) = 0; virtual TSyError InsertItem ( SessionH aSessionH, cAppCharP aItemData, ItemID aID )= 0; virtual TSyError UpdateItem ( SessionH aSessionH, cAppCharP aItemData, cItemID aID, ItemID updID )= 0; virtual TSyError MoveItem ( SessionH aSessionH, cItemID aID, cAppCharP newParID )= 0; virtual TSyError DeleteItem ( SessionH aSessionH, cItemID aID ) = 0; virtual TSyError EndDataWrite ( SessionH aSessionH, bool success, appCharP *newToken )= 0; virtual void DisposeObj ( SessionH aSessionH, void* memory ) = 0; // -- asKey -- virtual TSyError ReadNextItemAsKey( SessionH aSessionH, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst )= 0; virtual TSyError ReadItemAsKey ( SessionH aSessionH, cItemID aID, KeyH aItemKey )= 0; virtual TSyError InsertItemAsKey ( SessionH aSessionH, KeyH aItemKey, ItemID aID )= 0; virtual TSyError UpdateItemAsKey ( SessionH aSessionH, KeyH aItemKey, cItemID aID, ItemID updID )= 0; virtual TSyError debugPuts(cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aLinePrefix, cAppCharP aText) { return LOCERR_NOTIMP; } }; // TEngineModuleBase // debug level masks (original definition in sysync_debug.h) #define DBG_HOT 0x00000001 // hot information #define DBG_ERROR 0x00000002 // Error conditions /** * @param aFile source file name from which log entry comes * @param aLine source file line * @param aFunction function name * @param aDbgLevel same bit mask as in the internal TDebugLogger; * currently DBG_HOT and DBG_ERROR are defined publicly * @param aLinePrefix a short string to be displayed in front of each line; * the advantage of passing this separately instead of * making it a part of aText is that the logger might * be able to insert the prefix more efficiently and/or * (depending on the log format) with extra formatting * @param aText the text to be printed, may consist of multiple lines; * the log always starts a new line after the text, regardless * of how many newlines might be at the end of the text */ void SySyncDebugPuts(void* aCB, cAppCharP aFile, int aLine, cAppCharP aFunction, int aDbgLevel, cAppCharP aLinePrefix, cAppCharP aText); // factory function declarations - must be implemented in the source file of the leaf derivates of TEngineInterface #ifdef SYSYNC_CLIENT TEngineModuleBase *newClientEngine(void); #endif #ifdef SYSYNC_SERVER TEngineModuleBase *newServerEngine(void); #endif } // namespace sysync #endif // ENGINEMODULEBASE_H // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/enginemodulebridge.cpp0000644000373300037200000003071112424517753031327 0ustar00nightlyallusers00000000000000/* * File: enginemodulebridge.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * * Synthesis SyncML client test connector * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * * */ #include "enginemodulebridge.h" // include the interface file and utilities #include "SDK_util.h" #include "UI_util.h" namespace sysync { // local name #define MyName "enginemodulebridge" // -------------------------------------------------------------- TEngineModuleBridge::TEngineModuleBridge() { fDLL= NULL; fIsServer= false; } // constructor TEngineModuleBridge::~TEngineModuleBridge() { Term(); } // destructor // -------------------------------------------------------------- TSyError TEngineModuleBridge::Init() { TSyError err= UI_Connect( fCI, fDLL, fIsServer, fEngineName.c_str(), fPrgVersion, fDebugFlags ); return err; } // Init TSyError TEngineModuleBridge::Term() { TSyError err= LOCERR_OK; if (fCI) { err= UI_Disconnect( fCI, fDLL, fIsServer ); fCI= NULL; } return err; } // Term // -------------------------------------------------------------- TSyError TEngineModuleBridge::SetStringMode( uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ) { SetStringMode_Func p= fCI->ui.SetStringMode; if (!p) return LOCERR_NOTIMP; return p( fCI, aCharSet, aLineEndMode, aBigEndian ); } // SetStringMode TSyError TEngineModuleBridge::InitEngineXML( cAppCharP aConfigXML ) { InitEngineXML_Func p= fCI->ui.InitEngineXML; if (!p) return LOCERR_NOTIMP; return p( fCI, aConfigXML ); } // InitEngineXML TSyError TEngineModuleBridge::InitEngineFile( cAppCharP aConfigFilePath ) { InitEngineFile_Func p= fCI->ui.InitEngineFile; if (!p) return LOCERR_NOTIMP; return p( fCI, aConfigFilePath ); } // InitEngineFile TSyError TEngineModuleBridge::InitEngineCB( TXMLConfigReadFunc aReaderFunc, void* aContext ) { InitEngineCB_Func p= fCI->ui.InitEngineCB; if (!p) return LOCERR_NOTIMP; return p( fCI, aReaderFunc, aContext ); } // InitEngineCB // -------------------------------------------------------------- TSyError TEngineModuleBridge::OpenSession( SessionH &aSessionH, uInt32 aSelector, cAppCharP aSessionName ) { OpenSession_Func p= fCI->ui.OpenSession; if (!p) return LOCERR_NOTIMP; return p( fCI, &aSessionH, aSelector, aSessionName ); } // OpenSession TSyError TEngineModuleBridge::OpenSessionKey( SessionH aSessionH, KeyH &aKeyH, uInt16 aMode ) { OpenSessionKey_Func p= fCI->ui.OpenSessionKey; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH, &aKeyH, aMode ); } // OpenSessionKey TSyError TEngineModuleBridge::SessionStep( SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP ) { SessionStep_Func p= fCI->ui.SessionStep; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH, &aStepCmd, aInfoP ); } // SessionStep TSyError TEngineModuleBridge::GetSyncMLBuffer( SessionH aSessionH, bool aForSend, appPointer &aBuffer, memSize &aBufSize ) { GetSyncMLBuffer_Func p= fCI->ui.GetSyncMLBuffer; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH, aForSend, &aBuffer, &aBufSize ); } // GetSyncMLBuffer TSyError TEngineModuleBridge::RetSyncMLBuffer( SessionH aSessionH, bool aForSend, memSize aRetSize ) { RetSyncMLBuffer_Func p= fCI->ui.RetSyncMLBuffer; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH, aForSend, aRetSize ); } // RetSyncMLBuffer TSyError TEngineModuleBridge::ReadSyncMLBuffer( SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { ReadSyncMLBuffer_Func p= fCI->ui.ReadSyncMLBuffer; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH, aBuffer, aBufSize, &aValSize ); } // ReadSyncMLBuffer TSyError TEngineModuleBridge::WriteSyncMLBuffer( SessionH aSessionH, appPointer aBuffer, memSize aValSize ) { WriteSyncMLBuffer_Func p= fCI->ui.WriteSyncMLBuffer; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH, aBuffer, aValSize ); } // WriteSyncMLBuffer TSyError TEngineModuleBridge::CloseSession( SessionH aSessionH ) { CloseSession_Func p= fCI->ui.CloseSession; if (!p) return LOCERR_NOTIMP; return p( fCI, aSessionH ); } // CloseSession // -------------------------------------------------------------- TSyError TEngineModuleBridge::OpenKeyByPath( KeyH &aKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ) { OpenKeyByPath_Func p= fCI->ui.OpenKeyByPath; if (!p) return LOCERR_NOTIMP; return p( fCI, &aKeyH, aParentKeyH, aPath, aMode ); } // OpenKeyByPath TSyError TEngineModuleBridge::OpenSubkey( KeyH &aKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ) { OpenSubkey_Func p= fCI->ui.OpenSubkey; if (!p) return LOCERR_NOTIMP; return p( fCI, &aKeyH, aParentKeyH, aID, aMode ); } // OpenSubKey TSyError TEngineModuleBridge::DeleteSubkey( KeyH aParentKeyH, sInt32 aID ) { DeleteSubkey_Func p= fCI->ui.DeleteSubkey; if (!p) return LOCERR_NOTIMP; return p( fCI, aParentKeyH, aID ); } // DeleteSubkey TSyError TEngineModuleBridge::GetKeyID( KeyH aKeyH, sInt32 &aID ) { GetKeyID_Func p= fCI->ui.GetKeyID; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, &aID ); } // GetKeyID TSyError TEngineModuleBridge::SetTextMode( KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ) { SetTextMode_Func p= fCI->ui.SetTextMode; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, aCharSet, aLineEndMode, aBigEndian ); } // SetTextMode TSyError TEngineModuleBridge::SetTimeMode( KeyH aKeyH, uInt16 aTimeMode ) { SetTimeMode_Func p= fCI->ui.SetTimeMode; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, aTimeMode ); } // SetTimeMode TSyError TEngineModuleBridge::CloseKey( KeyH aKeyH ) { CloseKey_Func p= fCI->ui.CloseKey; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH ); } // CloseKey // -------------------------------------------------------------- TSyError TEngineModuleBridge::GetValue( KeyH aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { GetValue_Func p= fCI->ui.GetValue; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, aValName, aValType, aBuffer,aBufSize,&aValSize ); } // GetValue TSyError TEngineModuleBridge::GetValueByID( KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ) { GetValueByID_Func p= fCI->ui.GetValueByID; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, aID, arrIndex, aValType, aBuffer,aBufSize,&aValSize ); } // GetValueByID sInt32 TEngineModuleBridge::GetValueID( KeyH aKeyH, cAppCharP aName ) { GetValueID_Func p= fCI->ui.GetValueID; if (!p) return 0; return p( fCI, aKeyH, aName ); } // GetValueID TSyError TEngineModuleBridge::SetValue( KeyH aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { SetValue_Func p= fCI->ui.SetValue; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, aValName, aValType, aBuffer,aValSize ); } // SetValue TSyError TEngineModuleBridge::SetValueByID( KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ) { SetValueByID_Func p= fCI->ui.SetValueByID; if (!p) return LOCERR_NOTIMP; return p( fCI, aKeyH, aID, arrIndex, aValType, aBuffer,aValSize ); } // SetValueByID // ---- tunnel functions ----------------------------------------------------------------- TSyError TEngineModuleBridge::StartDataRead( SessionH aContext, cAppCharP lastToken, cAppCharP resumeToken ) { SDR_Func p= fCI->dt.StartDataRead; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, lastToken, resumeToken ); } // StartDataRead TSyError TEngineModuleBridge::ReadNextItem( SessionH aContext, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ) { RdNItemSFunc p= fCI->dt.ReadNextItem; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aID, aItemData, aStatus, aFirst ); } // ReadNextItem TSyError TEngineModuleBridge::ReadItem( SessionH aContext, cItemID aID, appCharP *aItemData ) { Rd_ItemSFunc p= fCI->dt.ReadItem; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aID, aItemData ); } // ReadItem TSyError TEngineModuleBridge::EndDataRead( SessionH aContext ) { EDR_Func p= fCI->dt.EndDataRead; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext ); } // EndDataRead TSyError TEngineModuleBridge::StartDataWrite( SessionH aContext ) { SDW_Func p= fCI->dt.StartDataWrite; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext ); } // StartDataWrite TSyError TEngineModuleBridge::InsertItem( SessionH aContext, cAppCharP aItemData, ItemID aID ) { InsItemSFunc p= fCI->dt.InsertItem; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aItemData, aID ); } // InsertItem TSyError TEngineModuleBridge::UpdateItem( SessionH aContext, cAppCharP aItemData, cItemID aID, ItemID updID ) { UpdItemSFunc p= fCI->dt.UpdateItem; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aItemData, aID, updID ); } // UpdateItem TSyError TEngineModuleBridge::MoveItem( SessionH aContext, cItemID aID, cAppCharP newParID ) { MovItem_Func p= fCI->dt.MoveItem; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aID, newParID ); } // MoveItem TSyError TEngineModuleBridge::DeleteItem( SessionH aContext, cItemID aID ) { DelItem_Func p= fCI->dt.DeleteItem; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aID ); } // DeleteItem TSyError TEngineModuleBridge::EndDataWrite( SessionH aContext, bool success, appCharP *newToken ) { EDW_Func p= fCI->dt.EndDataWrite; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, success, newToken ); } // EndDataWrite void TEngineModuleBridge::DisposeObj( SessionH aContext, void* memory ) { DisposeProc p= fCI->dt.DisposeObj; if (!p) return; p( (CContext)aContext, memory ); } // DisposeObj // --- asKey --- TSyError TEngineModuleBridge::ReadNextItemAsKey( SessionH aContext, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ) { RdNItemKFunc p= fCI->dt.ReadNextItemAsKey; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aID, aItemKey, aStatus, aFirst ); } // ReadNextItemAsKey TSyError TEngineModuleBridge::ReadItemAsKey( SessionH aContext, cItemID aID, KeyH aItemKey ) { Rd_ItemKFunc p= fCI->dt.ReadItemAsKey; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aID, aItemKey ); } // ReadItemAsKey TSyError TEngineModuleBridge::InsertItemAsKey( SessionH aContext, KeyH aItemKey, ItemID aID ) { InsItemKFunc p= fCI->dt.InsertItemAsKey; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aItemKey, aID ); } // InsertItemAsKey TSyError TEngineModuleBridge::UpdateItemAsKey( SessionH aContext, KeyH aItemKey, cItemID aID, ItemID updID ) { UpdItemKFunc p= fCI->dt.UpdateItemAsKey; if (!p) return LOCERR_NOTIMP; return p( (CContext)aContext, aItemKey, aID, updID ); } // UpdateItemAsKey } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/enginemodulebridge.h0000644000373300037200000001376312424517753031004 0ustar00nightlyallusers00000000000000/* * File: enginemodulebridge.h * * Author: Beat Forster (bfo@synthesis.ch) * * * Synthesis SyncML client bridge connector * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * * */ #ifndef ENGINEMODULEBRIDGE_H #define ENGINEMODULEBRIDGE_H // inherited from ... #include "enginemodulebase.h" namespace sysync { class TEngineModuleBridge : public TEngineModuleBase { typedef TEngineModuleBase inherited; public: TEngineModuleBridge(); virtual ~TEngineModuleBridge(); appPointer fDLL; bool fIsServer; virtual TSyError Init(); virtual TSyError Term(); // ---- Engine init ------------------------------------------------------------------------- virtual TSyError SetStringMode ( uInt16 aCharSet, uInt16 aLineEndMode= LEM_CSTR, bool aBigEndian= false ); virtual TSyError InitEngineXML ( cAppCharP aConfigXML ); virtual TSyError InitEngineFile ( cAppCharP aConfigFilePath ); virtual TSyError InitEngineCB ( TXMLConfigReadFunc aReaderFunc, void* aContext ); // ---- Running a Sync Session -------------------------------------------------------------- virtual TSyError OpenSession ( SessionH &aSessionH, uInt32 aSelector = 0, cAppCharP aSessionName = NULL ); virtual TSyError OpenSessionKey ( SessionH aSessionH, KeyH &aKeyH, uInt16 aMode ); virtual TSyError SessionStep ( SessionH aSessionH, uInt16 &aStepCmd, TEngineProgressInfo *aInfoP= NULL ); virtual TSyError GetSyncMLBuffer ( SessionH aSessionH, bool aForSend, appPointer &aBuffer, memSize &aBufSize ); virtual TSyError RetSyncMLBuffer ( SessionH aSessionH, bool aForSend, memSize aRetSize ); virtual TSyError ReadSyncMLBuffer ( SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); virtual TSyError WriteSyncMLBuffer( SessionH aSessionH, appPointer aBuffer, memSize aValSize ); virtual TSyError CloseSession ( SessionH aSessionH ); // ---- Settings access --------------------------------------------------------------------- virtual TSyError OpenKeyByPath ( KeyH &aKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ); virtual TSyError OpenSubkey ( KeyH &aKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ); virtual TSyError DeleteSubkey ( KeyH aParentKeyH, sInt32 aID ); virtual TSyError GetKeyID ( KeyH aKeyH, sInt32 &aID ); virtual TSyError SetTextMode ( KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode= LEM_CSTR, bool aBigEndian = false ); virtual TSyError SetTimeMode ( KeyH aKeyH, uInt16 aTimeMode ); virtual TSyError CloseKey ( KeyH aKeyH ); virtual TSyError GetValue ( KeyH aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); virtual TSyError GetValueByID ( KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize &aValSize ); virtual sInt32 GetValueID ( KeyH aKeyH, cAppCharP aName ); virtual TSyError SetValue ( KeyH aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); virtual TSyError SetValueByID ( KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); // ---- Tunnel methods ---------------------------------------------------------------------- virtual TSyError StartDataRead ( SessionH ac, cAppCharP lastToken, cAppCharP resumeToken ); virtual TSyError ReadNextItem ( SessionH ac, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ); virtual TSyError ReadItem ( SessionH ac, cItemID aID, appCharP *aItemData ); virtual TSyError EndDataRead ( SessionH ac ); virtual TSyError StartDataWrite ( SessionH ac ); virtual TSyError InsertItem ( SessionH ac, cAppCharP aItemData, ItemID aID ); virtual TSyError UpdateItem ( SessionH ac, cAppCharP aItemData, cItemID aID, ItemID updID ); virtual TSyError MoveItem ( SessionH ac, cItemID aID, cAppCharP newParID ); virtual TSyError DeleteItem ( SessionH ac, cItemID aID ); virtual TSyError EndDataWrite ( SessionH ac, bool success, appCharP *newToken ); virtual void DisposeObj ( SessionH ac, void* memory ); // ---- asKey ---- virtual TSyError ReadNextItemAsKey( SessionH ac, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ); virtual TSyError ReadItemAsKey ( SessionH ac, cItemID aID, KeyH aItemKey ); virtual TSyError InsertItemAsKey ( SessionH ac, KeyH aItemKey, ItemID aID ); virtual TSyError UpdateItemAsKey ( SessionH ac, KeyH aItemKey, cItemID aID, ItemID updID ); }; // TEngineModuleBridge } // namespace #endif // ENGINEMODULEBRIDGE /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/enginestubs.c0000644000373300037200000000172412424517753027467 0ustar00nightlyallusers00000000000000/* * File: enginestubs.c * * Author: Patrick Ohly * * Dummy implementations of the engine entry points * for client and server, to be linked statically against * SDK instead of the real engine. The engine then has * to be opened as module. * * Copyright (c) 2009 by Synthesis AG (www.synthesis.ch) * */ #include "sync_dbapi.h" ENGINE_ENTRY TSyError SYSYNC_EXTERNAL(ConnectEngine) (UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR { return 404; } ENGINE_ENTRY TSyError SYSYNC_EXTERNAL(DisconnectEngine) (UI_Call_In aCI) ENTRY_ATTR { return 404; } ENGINE_ENTRY TSyError SYSYNC_EXTERNAL_SRV(ConnectEngine) (UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR { return 404; } ENGINE_ENTRY TSyError SYSYNC_EXTERNAL_SRV(DisconnectEngine) (UI_Call_In aCI) ENTRY_ATTR { return 404; } syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/gb2312_tables_inc.cpp0000755000373300037200000115234512424517753030576 0ustar00nightlyallusers00000000000000const size_t ucs2_to_gb2312_numelems = 28470; const treeval_t ucs2_to_gb2312_elements[ucs2_to_gb2312_numelems] = { 0x284A,0x00E0,0x0000,0x0000,0x0000,0x00D1,0x0000,0x0000,0x000F,0x0000,0x0000,0x0000,0x0000,0x0005,0x0002,0xA3A4, 0x0001,0xA3FE,0x0003,0x0001,0xA1EA,0x0000,0xA1E9,0x0071,0x0031,0x0011,0x0001,0x0008,0x0004,0x0002,0xA1AB,0xA3FD, 0x0002,0xA3FC,0xA3FB,0x0004,0x0002,0xA3FA,0xA3F9,0x0002,0xA3F8,0xA3F7,0x0010,0x0008,0x0004,0x0002,0xA3F6,0xA3F5, 0x0002,0xA3F4,0xA3F3,0x0004,0x0002,0xA3F2,0xA3F1,0x0002,0xA3F0,0xA3EF,0x0008,0x0004,0x0002,0xA3EE,0xA3ED,0x0002, 0xA3EC,0xA3EB,0x0004,0x0002,0xA3EA,0xA3E9,0x0002,0xA3E8,0xA3E7,0x0020,0x0010,0x0008,0x0004,0x0002,0xA3E6,0xA3E5, 0x0002,0xA3E4,0xA3E3,0x0004,0x0002,0xA3E2,0xA3E1,0x0002,0xA3E0,0xA3DF,0x0008,0x0004,0x0002,0xA3DE,0xA3DD,0x0002, 0xA3DC,0xA3DB,0x0004,0x0002,0xA3DA,0xA3D9,0x0002,0xA3D8,0xA3D7,0x0010,0x0008,0x0004,0x0002,0xA3D6,0xA3D5,0x0002, 0xA3D4,0xA3D3,0x0004,0x0002,0xA3D2,0xA3D1,0x0002,0xA3D0,0xA3CF,0x0008,0x0004,0x0002,0xA3CE,0xA3CD,0x0002,0xA3CC, 0xA3CB,0x0004,0x0002,0xA3CA,0xA3C9,0x0002,0xA3C8,0xA3C7,0x0040,0x0020,0x0010,0x0008,0x0004,0x0002,0xA3C6,0xA3C5, 0x0002,0xA3C4,0xA3C3,0x0004,0x0002,0xA3C2,0xA3C1,0x0002,0xA3C0,0xA3BF,0x0008,0x0004,0x0002,0xA3BE,0xA3BD,0x0002, 0xA3BC,0xA3BB,0x0004,0x0002,0xA1C3,0xA3B9,0x0002,0xA3B8,0xA3B7,0x0010,0x0008,0x0004,0x0002,0xA3B6,0xA3B5,0x0002, 0xA3B4,0xA3B3,0x0004,0x0002,0xA3B2,0xA3B1,0x0002,0xA3B0,0xA3AF,0x0008,0x0004,0x0002,0xA3AE,0xA1AA,0x0002,0xA3AC, 0xA3AB,0x0004,0x0002,0xA3AA,0xA3A9,0x0002,0xA3A8,0xA3A7,0x0000,0x0000,0x0008,0x0004,0x0002,0xA3A6,0xA3A5,0x0002, 0xA1E7,0xA3A3,0x0000,0x0002,0xA3A2,0xA3A1,0x0000,0x0001,0x0001,0x0001,0x0000,0x0001,0x0001,0x0001,0x0001,0x0000, 0xD8A3,0x0001,0x1292,0x081E,0x03BD,0x01D8,0x0090,0x0001,0x0043,0x001D,0x0009,0x0001,0x0001,0x0003,0x0000,0xBACD, 0x0002,0xD9DF,0xB9EA,0x000A,0x0005,0x0001,0x0002,0xB9EA,0xEDE8,0x0000,0x0002,0xB9A8,0xC1FA,0x0006,0x0003,0x0001, 0xEDE8,0x0000,0xB9A8,0x0001,0x0000,0xC5D3,0x001C,0x000F,0x0007,0x0003,0x0001,0xC1FA,0x0002,0xF6BB,0xC8A3,0x0004, 0x0002,0xF6BA,0xF6B9,0x0002,0xF6B8,0xF6B7,0x0008,0x0004,0x0002,0xF6B6,0xF6B5,0x0002,0xC1E4,0xF6B4,0x0001,0x0002, 0xF6B3,0xB3DD,0x0005,0x0001,0x0001,0x0001,0xF6BB,0x0001,0x0000,0x0000,0xC8A3,0x002A,0x0017,0x000A,0x0004,0x0001, 0x0000,0xF6B9,0x0003,0x0000,0xF6BA,0x0001,0xC4F6,0x0006,0x0003,0x0000,0xF6B8,0x0001,0xB3F6,0x0003,0x0001,0xC1E4, 0x0002,0xF6B6,0xF6B4,0x0008,0x0004,0x0001,0x0000,0xF6B7,0x0000,0x0001,0xF6B5,0x0004,0x0001,0x0000,0xF6B3,0x0004, 0x0002,0xB3DD,0xECB4,0x0000,0xC6EB,0x000D,0x0008,0x0004,0x0001,0x0001,0xD5AB,0x0000,0x0000,0xC6EB,0x0000,0x0001, 0x0000,0xF7FE,0x000D,0x0007,0x0004,0x0002,0xF7FD,0xF7FC,0x0001,0xB1C7,0x0003,0x0001,0xF7FA,0x0001,0xF7FB,0x0004, 0x0001,0x0000,0xF7FA,0x0001,0x0001,0xF7F9,0x009A,0x0046,0x001D,0x000C,0x0005,0x0000,0x0001,0x0001,0xF7F8,0x0001, 0x0003,0x0001,0xF7F7,0x0001,0xCAF3,0x0005,0x0001,0x0001,0x0000,0xDCB1,0x0006,0x0003,0x0000,0xD8BB,0x0000,0xB6AC, 0x0003,0x0000,0xB9C4,0x0001,0xD8BE,0x0011,0x000C,0x0006,0x0003,0x0001,0xB6A6,0x0000,0xF6BE,0x0003,0x0000,0xF6BD, 0x0000,0xF6BE,0x0000,0x0000,0x0000,0xF7A1,0x000E,0x0008,0x0004,0x0002,0xF6BD,0xF6BC,0x0002,0xF6BC,0xEDEB,0x0003, 0x0000,0xEDEA,0x0000,0xEDE9,0x0006,0x0003,0x0000,0xF7F2,0x0001,0xC3B9,0x0000,0x0001,0xF7F5,0x002D,0x0017,0x000B, 0x0004,0x0000,0x0000,0xF7F6,0x0003,0x0001,0xF7F5,0x0002,0xF7F2,0xB5B3,0x0006,0x0003,0x0000,0xF7F3,0x0000,0xF7F4, 0x0003,0x0001,0xF7F1,0x0001,0xF7EF,0x000E,0x0008,0x0004,0x0002,0xF7F0,0xB5E3,0x0002,0xF7EE,0xF7ED,0x0003,0x0000, 0xF7EC,0x0001,0xC4AC,0x0004,0x0001,0x0001,0xC7AD,0x0001,0x0000,0xBADA,0x0014,0x000C,0x0008,0x0004,0x0002,0xF0A4, 0xC0E8,0x0002,0xCAF2,0xD9E4,0x0001,0x0000,0xD9E4,0x0004,0x0001,0x0001,0xBBC6,0x0000,0x0000,0xBBC6,0x000D,0x0007, 0x0003,0x0001,0xF7E2,0x0002,0xF7E1,0xC3B4,0x0003,0x0000,0xC2E9,0x0001,0xF4EF,0x0000,0x0001,0x0002,0xC3E6,0xF4F0, 0x0045,0x001D,0x000D,0x0005,0x0001,0x0001,0x0000,0xF4EF,0x0000,0x0003,0x0001,0xC2F3,0x0002,0xC2F3,0xB4D6,0x0007, 0x0000,0x0003,0x0000,0xF7EB,0x0000,0xF7EA,0x0004,0x0000,0x0000,0xC0F6,0x0000,0x0002,0xC2B4,0xF7E8,0x000F,0x0007, 0x0001,0x0003,0x0000,0xF7E7,0x0001,0xF7E6,0x0004,0x0000,0x0000,0xF7E5,0x0000,0x0001,0xF7E4,0x000E,0x0008,0x0004, 0x0002,0xC2B9,0xF5BA,0x0002,0xD1CE,0xBCEF,0x0003,0x0001,0xF5BA,0x0000,0xCFCC,0x0004,0x0001,0x0000,0xC2B1,0x0003, 0x0000,0xF0D9,0x0002,0xF0D7,0xD3A5,0x002F,0x0018,0x000D,0x0005,0x0001,0x0002,0xF0D8,0xF0D6,0x0004,0x0002,0xF0D5, 0xF0D4,0x0002,0xF0D3,0xF0D2,0x0007,0x0004,0x0002,0xF0D1,0xF0D0,0x0001,0xBAD7,0x0000,0x0000,0xF0CF,0x000D,0x0006, 0x0003,0x0001,0xF0CE,0x0001,0xF0CD,0x0004,0x0002,0xF0CC,0xF0CB,0x0001,0xF7BD,0x0006,0x0003,0x0000,0xF0CA,0x0000, 0xF0C9,0x0001,0x0000,0xF0C8,0x001E,0x000F,0x0007,0x0004,0x0002,0xC5F4,0xF0C7,0x0001,0xF0C6,0x0004,0x0002,0xF0C5, 0xC8B5,0x0002,0xF0C4,0xF0C3,0x0008,0x0004,0x0002,0xF0C2,0xF0C1,0x0002,0xB6EC,0xF0C0,0x0004,0x0002,0xBEE9,0xF0BF, 0x0000,0xF0BE,0x000E,0x0007,0x0004,0x0002,0xBAE8,0xF0BD,0x0000,0xB8EB,0x0003,0x0001,0xF0BC,0x0002,0xF0BB,0xF0B9, 0x0007,0x0004,0x0002,0xF0BA,0xF0B8,0x0000,0xCDD2,0x0004,0x0002,0xD4A7,0xF0B6,0x0000,0xF0B7,0x00B8,0x0069,0x003F, 0x002E,0x001B,0x000D,0x0005,0x0002,0xD1EC,0x0001,0xD1BC,0x0004,0x0002,0xF0B5,0xF0B4,0x0002,0xF0B3,0xF0B2,0x0007, 0x0003,0x0000,0xF0B1,0x0002,0xD1BB,0xC5B8,0x0003,0x0001,0xC3F9,0x0002,0xF0B0,0xBCA6,0x000E,0x0008,0x0004,0x0002, 0xF0AF,0xC4F1,0x0002,0xF0BD,0xF0BF,0x0003,0x0001,0xF0D9,0x0000,0xF0D0,0x0000,0x0001,0x0001,0xF0B5,0x0001,0x0006, 0x0001,0x0001,0x0002,0xF0D8,0xD3A5,0x0004,0x0000,0x0000,0xF0D6,0x0003,0x0000,0xF0C2,0x0000,0xF0D5,0x0019,0x000B, 0x0005,0x0000,0x0000,0x0001,0xF0D3,0x0000,0x0001,0x0002,0xF0D4,0xF0B8,0x0006,0x0001,0x0001,0x0002,0xF0D2,0xF0BA, 0x0004,0x0000,0x0001,0xC5B8,0x0000,0x0001,0xF0D1,0x0006,0x0001,0x0001,0x0001,0x0000,0xF0CE,0x0006,0x0001,0x0000, 0x0002,0xF0CF,0xF7BD,0x0001,0x0000,0x0000,0xBAD7,0x001F,0x0013,0x0009,0x0000,0x0004,0x0000,0x0001,0xDDBA,0x0001, 0x0001,0xF0CD,0x0005,0x0001,0x0001,0x0000,0xF0CA,0x0000,0x0000,0x0000,0xF0C9,0x0006,0x0000,0x0001,0x0001,0x0001, 0xF0C8,0x0001,0x0001,0x0001,0x0000,0xC8B5,0x0021,0x000F,0x000A,0x0004,0x0000,0x0000,0xB5F1,0x0003,0x0000,0xC5F4, 0x0000,0xF0C6,0x0001,0x0001,0x0001,0xF0C4,0x000A,0x0006,0x0003,0x0000,0xF0C0,0x0001,0xB6EC,0x0000,0x0000,0xF0C3, 0x0001,0x0003,0x0001,0xF0BE,0x0002,0xF0C1,0xBEE9,0x0006,0x0001,0x0001,0x0001,0x0000,0xF0BC,0x0000,0x0004,0x0000, 0x0001,0xB8EB,0x0000,0x0001,0xBAE8,0x0094,0x0035,0x001F,0x0010,0x0006,0x0000,0x0000,0x0002,0xF0BB,0xF0B9,0x0006, 0x0003,0x0000,0xD1BC,0x0000,0xD1EC,0x0000,0x0001,0xF0B3,0x000A,0x0006,0x0003,0x0001,0xF0B7,0x0001,0xF0B6,0x0000, 0x0001,0xD4A7,0x0000,0x0001,0x0001,0xCDD2,0x000C,0x0005,0x0001,0x0001,0x0001,0xD1BB,0x0000,0x0003,0x0001,0xF0B1, 0x0000,0xF0B2,0x0001,0x0004,0x0001,0x0000,0xF0B0,0x0000,0x0002,0xC3F9,0xB7EF,0x0029,0x000F,0x0005,0x0001,0x0001, 0x0001,0xF0AF,0x0006,0x0003,0x0001,0xD9EC,0x0001,0xC4F1,0x0001,0x0000,0xF7AF,0x000D,0x0007,0x0003,0x0001,0xF7AE, 0x0002,0xC1DB,0xF7AD,0x0003,0x0000,0xF7AC,0x0001,0xF7AB,0x0008,0x0004,0x0002,0xF7AA,0xF7A9,0x0002,0xB1EE,0xF7A8, 0x0000,0x0002,0xF7A7,0xF7A6,0x001B,0x000F,0x0008,0x0004,0x0002,0xF7A5,0xF7A4,0x0002,0xF7A3,0xF7A2,0x0004,0x0002, 0xF7A1,0xF6FE,0x0000,0xF6FD,0x0007,0x0003,0x0001,0xF6FC,0x0002,0xF6FB,0xF6FA,0x0000,0x0002,0xF6F9,0xC8FA,0x000B, 0x0004,0x0001,0x0001,0xF6F8,0x0004,0x0002,0xF6F7,0xF6F6,0x0000,0xF6F5,0x0008,0x0004,0x0002,0xBEA8,0xF6F4,0x0002, 0xF6F3,0xF6F2,0x0004,0x0002,0xF6F1,0xF6F0,0x0002,0xF6EF,0xF6EE,0x005E,0x0036,0x001D,0x000D,0x0007,0x0003,0x0000, 0xF6ED,0x0002,0xF6EC,0xF6EB,0x0003,0x0001,0xF6EA,0x0001,0xF6E9,0x0008,0x0004,0x0002,0xF6E8,0xF6E7,0x0002,0xF6E6, 0xF6E5,0x0004,0x0002,0xC0F0,0xF6E4,0x0002,0xF6E3,0xF6E2,0x000E,0x0007,0x0004,0x0002,0xF6E1,0xF6E0,0x0000,0xF6DF, 0x0004,0x0002,0xCFCA,0xF6DE,0x0000,0xF6DD,0x0004,0x0001,0x0001,0xF6DC,0x0003,0x0000,0xF6DB,0x0002,0xF6DA,0xF6D9, 0x0018,0x000B,0x0007,0x0003,0x0000,0xF6D8,0x0002,0xF6D7,0xB1AB,0x0000,0x0001,0xF6D6,0x0008,0x0004,0x0002,0xF6D4, 0xF6D3,0x0002,0xF6D2,0xF6D1,0x0001,0x0002,0xF6D0,0xC2B3,0x000A,0x0004,0x0000,0x0001,0xF6CF,0x0003,0x0000,0xD3E3, 0x0000,0xF6E2,0x0000,0x0000,0x0002,0xF6D4,0xF6F9,0x001C,0x000A,0x0005,0x0000,0x0001,0x0001,0xF6DD,0x0000,0x0000, 0x0001,0xF7AF,0x0005,0x0000,0x0000,0x0001,0xF6D7,0x0007,0x0004,0x0002,0xF6E0,0xC1DB,0x0000,0xF7AC,0x0003,0x0000, 0xF7AD,0x0000,0xF7AE,0x000A,0x0005,0x0001,0x0001,0x0001,0xB1EE,0x0000,0x0000,0x0000,0xF7A8,0x000A,0x0004,0x0001, 0x0000,0xF7A7,0x0003,0x0001,0xF7A9,0x0001,0xF6E4,0x0004,0x0000,0x0001,0xF6E6,0x0003,0x0001,0xF7A6,0x0002,0xF7A1, 0xF6E3,0x020F,0x00C3,0x005E,0x0028,0x0017,0x0010,0x0005,0x0001,0x0000,0x0000,0xF7A2,0x0005,0x0000,0x0002,0xF7A5, 0xF7A3,0x0003,0x0000,0xF7A4,0x0000,0xF6E5,0x0001,0x0001,0x0001,0x0002,0xC8FA,0xF6FB,0x000B,0x0005,0x0001,0x0000, 0x0000,0xF6FA,0x0000,0x0000,0x0002,0xF6FC,0xF6F8,0x0000,0x0001,0x0000,0x0000,0xF6EA,0x0023,0x0015,0x0009,0x0004, 0x0000,0x0001,0xF6F3,0x0001,0x0002,0xF6ED,0xF6EC,0x0006,0x0003,0x0001,0xBEA8,0x0000,0xF6F0,0x0003,0x0001,0xF6EF, 0x0001,0xF6F2,0x0005,0x0001,0x0001,0x0000,0xF6F4,0x0005,0x0001,0x0002,0xF6DF,0xF6EB,0x0000,0x0001,0xF6F6,0x000C, 0x0005,0x0001,0x0001,0x0001,0xF6E8,0x0000,0x0003,0x0000,0xC0F0,0x0000,0xF6E9,0x0000,0x0000,0x0000,0x0002,0xF6E1, 0xF6E7,0x0029,0x0019,0x000C,0x0000,0x0004,0x0001,0x0001,0xCFCA,0x0003,0x0000,0xF6D9,0x0002,0xF6DE,0xF6DB,0x0008, 0x0004,0x0001,0x0001,0xF6DC,0x0001,0x0001,0xF6DA,0x0001,0x0001,0x0001,0xF6D6,0x0007,0x0000,0x0000,0x0000,0x0002, 0xB1AB,0xF6D8,0x0001,0x0004,0x0001,0x0000,0xF6CF,0x0000,0x0001,0xF6D0,0x0013,0x0006,0x0000,0x0000,0x0001,0x0000, 0xC2B3,0x0005,0x0001,0x0001,0x0001,0xD3E3,0x0004,0x0000,0x0001,0xF7CA,0x0000,0x0001,0xC4A7,0x001A,0x000B,0x0007, 0x0003,0x0000,0xF7CE,0x0002,0xCEBA,0xF7CB,0x0000,0x0000,0xF7CD,0x0007,0x0004,0x0002,0xF7CB,0xF7CC,0x0000,0xF7CA, 0x0004,0x0002,0xF7C8,0xC6C7,0x0002,0xF7C9,0xBBEA,0x000A,0x0004,0x0000,0x0000,0xBFFD,0x0003,0x0001,0xB9ED,0x0000, 0xE5F7,0x0001,0x0001,0x0001,0xD8AA,0x008D,0x0041,0x0025,0x0016,0x0009,0x0005,0x0002,0xD3F4,0x0001,0xDBCB,0x0000, 0x0000,0xE3CE,0x0007,0x0003,0x0001,0xE3D2,0x0002,0xBAE5,0xC4D6,0x0003,0x0001,0xB6B7,0x0001,0xF7E0,0x0007,0x0000, 0x0003,0x0000,0xF7DE,0x0001,0xF7DF,0x0004,0x0000,0x0000,0xD0EB,0x0001,0x0001,0xF7DE,0x0012,0x0008,0x0004,0x0001, 0x0001,0xF7DD,0x0000,0x0001,0xBAFA,0x0004,0x0001,0x0000,0xF7DC,0x0003,0x0000,0xCBC9,0x0001,0xD7D7,0x0005,0x0001, 0x0001,0x0001,0xF7D9,0x0000,0x0000,0x0001,0xF7DB,0x0025,0x0012,0x000B,0x0004,0x0001,0x0001,0xF7D7,0x0004,0x0002, 0xB7A2,0xF7DA,0x0001,0xF7D8,0x0001,0x0003,0x0000,0xF7D6,0x0001,0xB7C2,0x0007,0x0000,0x0003,0x0001,0xF7D5,0x0001, 0xF7D4,0x0004,0x0001,0x0000,0xB8DF,0x0004,0x0002,0xF7C5,0xF7C6,0x0002,0xCCE5,0xCBE8,0x0011,0x000C,0x0007,0x0004, 0x0002,0xD4E0,0xF7C7,0x0001,0xF7C3,0x0001,0x0002,0xF7C6,0xF7C5,0x0001,0x0000,0x0001,0xF7C3,0x000B,0x0007,0x0004, 0x0002,0xF7C4,0xF7C1,0x0000,0xF7C2,0x0001,0x0000,0xF7C0,0x0007,0x0003,0x0000,0xF7BF,0x0002,0xBAA1,0xF7BC,0x0000, 0x0000,0xF7BE,0x006C,0x0031,0x0014,0x0008,0x0000,0x0003,0x0001,0xF7BA,0x0002,0xF7BB,0xB0B9,0x0005,0x0001,0x0002, 0xB9C7,0xE6F8,0x0003,0x0001,0xE6F7,0x0002,0xD6E8,0xE6F6,0x0010,0x0008,0x0004,0x0002,0xE6F5,0xC2E2,0x0002,0xE6F4, 0xE6F3,0x0004,0x0002,0xE5B9,0xE6F2,0x0002,0xE6F1,0xE6F0,0x0007,0x0003,0x0000,0xC9A7,0x0002,0xE6EF,0xC6AD,0x0003, 0x0000,0xE6EE,0x0001,0xE6ED,0x001B,0x000D,0x0008,0x0004,0x0002,0xE6EC,0xC6EF,0x0002,0xE6EB,0xBFA5,0x0001,0x0002, 0xD1E9,0xB3D2,0x0007,0x0003,0x0000,0xE6EA,0x0002,0xE6E9,0xBAA7,0x0004,0x0002,0xC2E6,0xE6E8,0x0000,0xBDBE,0x0010, 0x0008,0x0004,0x0002,0xC2EE,0xE6E7,0x0002,0xE6E6,0xE6E4,0x0004,0x0002,0xBCDD,0xE6E5,0x0002,0xCDD5,0xD7A4,0x0008, 0x0004,0x0002,0xE6E3,0xBED4,0x0002,0xE6E2,0xE6E1,0x0004,0x0002,0xCABB,0xE6E0,0x0002,0xC2BF,0xB2B5,0x002C,0x0018, 0x000E,0x0007,0x0003,0x0001,0xC7FD,0x0002,0xB3DB,0xD1B1,0x0004,0x0002,0xCDD4,0xD4A6,0x0000,0xC2ED,0x0004,0x0000, 0x0000,0xE6EA,0x0003,0x0001,0xE6F7,0x0000,0xE6F8,0x000A,0x0006,0x0003,0x0000,0xC2BF,0x0001,0xD6E8,0x0001,0x0001, 0xE6E4,0x0006,0x0003,0x0000,0xBEAA,0x0001,0xD1E9,0x0000,0x0001,0xBDBE,0x0013,0x0008,0x0004,0x0001,0x0001,0xE6F6, 0x0000,0x0001,0xE6E7,0x0004,0x0000,0x0000,0xE6E8,0x0003,0x0001,0xC7FD,0x0002,0xE6F5,0xE6F4,0x000B,0x0007,0x0004, 0x0002,0xE6EE,0xE6F1,0x0000,0xDDEB,0x0000,0x0000,0xC2E2,0x0005,0x0001,0x0002,0xE6F3,0xC9A7,0x0000,0x0000,0xE6E3, 0x010E,0x0061,0x002F,0x0019,0x0010,0x000B,0x0005,0x0002,0xB2DD,0x0001,0xCCDA,0x0003,0x0001,0xE6F2,0x0000,0xE6EF, 0x0000,0x0000,0x0000,0xE5B9,0x0001,0x0004,0x0001,0x0000,0xC6AD,0x0000,0x0001,0xE6F0,0x000D,0x0008,0x0001,0x0004, 0x0002,0xE6EB,0xC6EF,0x0000,0xE6EC,0x0001,0x0001,0x0000,0xE6ED,0x0000,0x0004,0x0001,0x0000,0xB3D2,0x0000,0x0000, 0xBFA5,0x001F,0x0009,0x0000,0x0004,0x0001,0x0000,0xC2E6,0x0001,0x0000,0xBAA7,0x000A,0x0004,0x0000,0x0001,0xE6E9, 0x0003,0x0000,0xE6E1,0x0000,0xCDD5,0x0007,0x0003,0x0000,0xCABB,0x0002,0xE6E2,0xE6E6,0x0001,0x0002,0xBCDD,0xE6E0, 0x0009,0x0000,0x0000,0x0003,0x0001,0xBED4,0x0002,0xE6E5,0xD7A4,0x0005,0x0000,0x0001,0x0000,0xB2B5,0x0001,0x0001, 0x0001,0xD1B1,0x0058,0x0023,0x0015,0x000D,0x0006,0x0003,0x0000,0xB3DB,0x0000,0xCDD4,0x0003,0x0001,0xB7EB,0x0002, 0xD4A6,0xC2ED,0x0004,0x0001,0x0001,0xDCB0,0x0001,0x0000,0xF0A5,0x0001,0x0005,0x0001,0x0002,0xCFE3,0xD9E5,0x0004, 0x0002,0xD8B8,0xCAD7,0x0002,0xE2CE,0xE2CD,0x001D,0x000E,0x0008,0x0004,0x0002,0xE2CC,0xC2F8,0x0002,0xE2CB,0xE2CA, 0x0003,0x0000,0xC1F3,0x0000,0xE2C9,0x0007,0x0004,0x0002,0xB2F6,0xE2C8,0x0001,0xC0A1,0x0004,0x0002,0xE2C7,0xB9DD, 0x0002,0xCFDA,0xE2C6,0x000C,0x0005,0x0001,0x0002,0xC4D9,0xE2C5,0x0003,0x0000,0xB6F6,0x0002,0xE2C4,0xB1FD,0x0004, 0x0000,0x0001,0xBDC8,0x0004,0x0002,0xE2C3,0xC8C4,0x0002,0xB6FC,0xE2C2,0x002F,0x001D,0x000F,0x0007,0x0003,0x0001, 0xCBC7,0x0002,0xB1A5,0xCACE,0x0004,0x0002,0xBDA4,0xD2FB,0x0002,0xB7B9,0xE2C1,0x0008,0x0004,0x0002,0xE2C0,0xE2BF, 0x0002,0xE2BE,0xE2BD,0x0003,0x0000,0xE2BC,0x0000,0xBCA2,0x000A,0x0004,0x0000,0x0000,0xE2BB,0x0003,0x0001,0xB2F6, 0x0001,0xF7D0,0x0001,0x0003,0x0000,0xF7CF,0x0002,0xF7D2,0xF7D3,0x0015,0x000A,0x0006,0x0003,0x0001,0xC8C4,0x0000, 0xBCA2,0x0001,0x0001,0xE2CD,0x0007,0x0003,0x0000,0xC0A1,0x0002,0xE2CB,0xE2CA,0x0001,0x0000,0xC2F8,0x000C,0x0004, 0x0000,0x0000,0xE2C9,0x0004,0x0002,0xE2C8,0xC1F3,0x0002,0xC0A1,0xE2BE,0x0001,0x0001,0x0000,0xCEB9,0x0091,0x0047, 0x0020,0x0010,0x0008,0x0004,0x0000,0x0000,0xE2BC,0x0000,0x0001,0xF7D1,0x0004,0x0001,0x0001,0xB9DD,0x0000,0x0000, 0xCEB9,0x0008,0x0004,0x0001,0x0000,0xCFDA,0x0000,0x0001,0xBDA4,0x0000,0x0004,0x0002,0xE2C6,0xEBC8,0x0001,0xD3E0, 0x0017,0x000D,0x0008,0x0004,0x0002,0xB6F6,0xC4D9,0x0002,0xE2C4,0xB2CD,0x0001,0x0002,0xF7D0,0xB6FC,0x0006,0x0003, 0x0001,0xD1F8,0x0000,0xE2C3,0x0001,0x0000,0xB1FD,0x000B,0x0004,0x0000,0x0000,0xBDC8,0x0003,0x0001,0xCACE,0x0002, 0xB1A5,0xCBC7,0x0001,0x0001,0x0001,0xE2C2,0x002B,0x0016,0x000A,0x0004,0x0000,0x0001,0xD2FB,0x0003,0x0000,0xB7B9, 0x0000,0xE2C1,0x0008,0x0004,0x0002,0xE2C0,0xE2BF,0x0002,0xE2BD,0xF7CF,0x0000,0x0000,0xE2B8,0x0009,0x0004,0x0000, 0x0001,0xBCA2,0x0000,0x0002,0xCAB3,0xB7C9,0x0008,0x0004,0x0002,0xB7C9,0xECAE,0x0002,0xECAD,0xC6AE,0x0001,0x0000, 0xECAC,0x0012,0x000B,0x0007,0x0004,0x0002,0xECAB,0xECAA,0x0000,0xECA9,0x0000,0x0001,0xB7E7,0x0001,0x0003,0x0001, 0xECAD,0x0001,0xC6AE,0x0005,0x0001,0x0001,0x0001,0xECAC,0x0004,0x0000,0x0001,0xD1EF,0x0000,0x0001,0xECAB,0x0071, 0x0034,0x0017,0x000B,0x0006,0x0003,0x0000,0xB9CE,0x0000,0xCCA8,0x0000,0x0002,0xECAA,0xECA9,0x0004,0x0001,0x0001, 0xB7E7,0x0004,0x0002,0xC8A7,0xF2AD,0x0002,0xF2AC,0xB2FC,0x000F,0x0007,0x0003,0x0001,0xF2AB,0x0002,0xF2AA,0xB5DF, 0x0004,0x0002,0xF2A9,0xF2A8,0x0002,0xB6EE,0xD1D5,0x0007,0x0004,0x0002,0xF2A7,0xF2A6,0x0001,0xCCE2,0x0004,0x0002, 0xBFC5,0xD3B1,0x0001,0xF2A5,0x001D,0x000E,0x0007,0x0003,0x0000,0xCDC7,0x0002,0xC6B5,0xD2C3,0x0003,0x0000,0xF2A4, 0x0002,0xF2A3,0xF2A2,0x0007,0x0003,0x0001,0xBCD5,0x0002,0xF2A1,0xBEB1,0x0004,0x0002,0xC6C4,0xC1EC,0x0002,0xC2AD, 0xD4A4,0x0010,0x0008,0x0004,0x0002,0xF1FE,0xCBCC,0x0002,0xB0E4,0xF1FD,0x0004,0x0002,0xB6D9,0xB9CB,0x0002,0xCDE7, 0xE7EF,0x0008,0x0004,0x0002,0xD0EB,0xCBB3,0x0002,0xCFEE,0xF1FC,0x0004,0x0002,0xC7EA,0xB6A5,0x0002,0xD2B3,0xC8A7, 0x0025,0x0015,0x000B,0x0007,0x0003,0x0000,0xF2A8,0x0002,0xC2AD,0xF2AD,0x0000,0x0000,0xCFD4,0x0004,0x0000,0x0000, 0xB2FC,0x0003,0x0000,0xB9CB,0x0000,0xF2AB,0x0008,0x0004,0x0000,0x0001,0xF2A9,0x0000,0x0001,0xC0E0,0x0000,0x0003, 0x0000,0xB5DF,0x0002,0xF2AA,0xD4B8,0x0011,0x000C,0x0004,0x0000,0x0000,0xF2A7,0x0004,0x0002,0xD1D5,0xF2A6,0x0002, 0xB6EE,0xCCE2,0x0001,0x0000,0x0001,0xBFC5,0x0001,0x0007,0x0003,0x0000,0xC6B5,0x0002,0xCDC7,0xBEB1,0x0000,0x0000, 0xF2A5,0x05A8,0x0279,0x0117,0x0089,0x004F,0x001F,0x000F,0x0007,0x0001,0x0003,0x0000,0xBCD5,0x0001,0xCDB7,0x0004, 0x0000,0x0001,0xB8A9,0x0001,0x0000,0xF2A4,0x0007,0x0000,0x0003,0x0000,0xD2C3,0x0001,0xF2A1,0x0004,0x0000,0x0000, 0xF2A2,0x0000,0x0002,0xC1EC,0xC6C4,0x001C,0x000E,0x0007,0x0003,0x0001,0xB6D9,0x0002,0xB0E4,0xCDE7,0x0004,0x0002, 0xD4A4,0xF1FE,0x0000,0xF1FD,0x0006,0x0003,0x0000,0xCBCC,0x0000,0xE7EF,0x0004,0x0002,0xD0EB,0xF1FC,0x0002,0xCBB3, 0xCFEE,0x000B,0x0007,0x0003,0x0001,0xC7EA,0x0002,0xB6A5,0xD2B3,0x0000,0x0001,0xCFEC,0x0004,0x0000,0x0001,0xD4CF, 0x0001,0x0002,0xC9D8,0xD4CF,0x0022,0x0016,0x0008,0x0004,0x0000,0x0001,0xD2F4,0x0001,0x0001,0xBEC2,0x0008,0x0004, 0x0002,0xE8BA,0xE8B9,0x0002,0xE8B8,0xBAAB,0x0003,0x0001,0xC8CD,0x0000,0xCEA4,0x0005,0x0001,0x0001,0x0000,0xE8B9, 0x0000,0x0003,0x0000,0xE8BA,0x0001,0xE8B8,0x0010,0x0005,0x0000,0x0000,0x0001,0xBAAB,0x0007,0x0004,0x0002,0xC8CD, 0xCEA4,0x0001,0xF7B5,0x0001,0x0000,0xC7A7,0x0000,0x0000,0x0003,0x0001,0xF7B2,0x0001,0xE7D6,0x0048,0x0021,0x0014, 0x000C,0x0006,0x0003,0x0000,0xF7B9,0x0000,0xF7B8,0x0003,0x0001,0xF7B5,0x0001,0xB1DE,0x0004,0x0000,0x0001,0xF7B6, 0x0001,0x0000,0xC7EF,0x0008,0x0004,0x0000,0x0001,0xF7B7,0x0000,0x0000,0xBECF,0x0001,0x0000,0x0000,0xC7CA,0x0015, 0x000D,0x0007,0x0003,0x0000,0xF7B4,0x0002,0xF7B3,0xF7B2,0x0003,0x0001,0xB9AE,0x0001,0xB0B0,0x0004,0x0000,0x0001, 0xD0AC,0x0001,0x0001,0xF7B1,0x0008,0x0004,0x0001,0x0000,0xBDD5,0x0001,0x0000,0xE7A5,0x0006,0x0003,0x0000,0xF7B0, 0x0000,0xCDE0,0x0001,0x0000,0xB0D0,0x0027,0x0010,0x0006,0x0000,0x0000,0x0002,0xD1A5,0xBDF9,0x0004,0x0001,0x0001, 0xB8EF,0x0003,0x0000,0xD8CC,0x0001,0xD8CC,0x000B,0x0005,0x0001,0x0002,0xC3E6,0xC3D2,0x0003,0x0000,0xBFBF,0x0000, 0xB7C7,0x0008,0x0004,0x0002,0xBEB2,0xB5E5,0x0002,0xF6A6,0xBEB2,0x0001,0x0000,0xBEB8,0x000C,0x0007,0x0000,0x0003, 0x0001,0xF6A6,0x0000,0xC7E0,0x0001,0x0000,0x0000,0xC1E9,0x000B,0x0006,0x0003,0x0000,0xF6B0,0x0000,0xF6A8,0x0001, 0x0002,0xF6B2,0xF6AB,0x0004,0x0001,0x0001,0xC5F9,0x0000,0x0000,0xB0D4,0x00AE,0x004F,0x0022,0x0012,0x0008,0x0004, 0x0001,0x0001,0xC2B6,0x0000,0x0001,0xF6B1,0x0006,0x0003,0x0000,0xF6B0,0x0001,0xF6AF,0x0001,0x0000,0xCEED,0x0008, 0x0004,0x0000,0x0001,0xC1EF,0x0001,0x0001,0xCFBC,0x0004,0x0000,0x0001,0xCBAA,0x0001,0x0001,0xC1D8,0x0017,0x000B, 0x0004,0x0001,0x0000,0xC4DE,0x0003,0x0000,0xD5B4,0x0002,0xF6AD,0xF6AE,0x0004,0x0000,0x0000,0xBBF4,0x0004,0x0002, 0xC3B9,0xF6AC,0x0002,0xD5F0,0xF6AA,0x000B,0x0004,0x0000,0x0001,0xCFF6,0x0004,0x0002,0xF6AB,0xD0E8,0x0001,0xCEED, 0x0004,0x0001,0x0000,0xB5E7,0x0003,0x0000,0xB1A2,0x0002,0xC0D7,0xC1E3,0x002B,0x0014,0x000B,0x0005,0x0001,0x0002, 0xF6A8,0xD4C6,0x0003,0x0001,0xB7D5,0x0000,0xF6A9,0x0004,0x0001,0x0001,0xD1A9,0x0000,0x0002,0xF6A7,0xD3EA,0x000B, 0x0005,0x0001,0x0002,0xC4D1,0xC0EB,0x0003,0x0001,0xF6C5,0x0001,0xBCA6,0x0006,0x0003,0x0001,0xD4D3,0x0000,0xB3FB, 0x0003,0x0000,0xCBAB,0x0001,0xCBE4,0x001A,0x000B,0x0006,0x0003,0x0000,0xB5F1,0x0001,0xF6C3,0x0001,0x0002,0xB3FB, 0xEEA1,0x0007,0x0004,0x0002,0xD3BA,0xB4C6,0x0000,0xF6C1,0x0004,0x0002,0xEFF4,0xDDC8,0x0002,0xB9CD,0xBCAF,0x000C, 0x0005,0x0000,0x0002,0xD1C5,0xD0DB,0x0004,0x0002,0xD1E3,0xC8B8,0x0001,0xC4D1,0x0007,0x0004,0x0002,0xF6C1,0xF6C0, 0x0000,0xD6BB,0x0004,0x0002,0xF6BF,0xC1A5,0x0001,0xC1A5,0x0051,0x0023,0x0015,0x000B,0x0006,0x0003,0x0001,0xC2A4, 0x0000,0xE3C4,0x0000,0x0002,0xD2FE,0xDAF4,0x0004,0x0001,0x0001,0xCFD5,0x0003,0x0001,0xCBE6,0x0000,0xCBED,0x0001, 0x0006,0x0003,0x0001,0xD5CF,0x0000,0xBCCA,0x0004,0x0002,0xCFB6,0xB0AF,0x0000,0xDAF3,0x001A,0x000C,0x0005,0x0000, 0x0002,0xD4C9,0xB8F4,0x0003,0x0001,0xD2FE,0x0002,0xCBE6,0xBDD7,0x0007,0x0003,0x0000,0xDAF2,0x0002,0xCBE5,0xB6D3, 0x0004,0x0002,0xDAED,0xDAF1,0x0001,0xC2A1,0x0008,0x0000,0x0004,0x0002,0xD3E7,0xB5CC,0x0000,0xD2A3,0x0005,0x0000, 0x0002,0xD1F4,0xE4BE,0x0003,0x0001,0xC2BD,0x0002,0xCFDD,0xCCD5,0x0032,0x0019,0x000C,0x0008,0x0004,0x0002,0xC1EA, 0xDAF0,0x0002,0xB3C2,0xDAEF,0x0000,0x0001,0xD2F5,0x0006,0x0003,0x0001,0xDAEE,0x0001,0xC5E3,0x0004,0x0002,0xCFD5, 0xD4C9,0x0000,0xDAED,0x000E,0x0007,0x0003,0x0001,0xB3FD,0x0002,0xD5F3,0xD4BA,0x0003,0x0000,0xB6B8,0x0002,0xDAEC, 0xC9FD,0x0007,0x0004,0x0002,0xC9C2,0xC9C2,0x0000,0xB1DD,0x0000,0x0001,0xDAEA,0x0018,0x0009,0x0005,0x0000,0x0002, 0xC9C2,0xDAEB,0x0000,0x0001,0xCFDE,0x0007,0x0004,0x0002,0xBDB5,0xC4B0,0x0000,0xC2AA,0x0004,0x0002,0xDAEA,0xB3C2, 0x0002,0xC2A4,0xC2BD,0x000D,0x0007,0x0004,0x0002,0xBCCA,0xB8BD,0x0001,0xDAE9,0x0003,0x0001,0xCDD3,0x0000,0xB0A2, 0x0008,0x0004,0x0002,0xDAE7,0xDAE8,0x0002,0xD7E8,0xDBE6,0x0001,0x0001,0xBDD7,0x018F,0x00C9,0x006F,0x0032,0x0019, 0x000D,0x0006,0x0002,0xD5F3,0x0002,0xD2F5,0xD1F4,0x0004,0x0002,0xB7C0,0xDAE5,0x0001,0xD6B7,0x0006,0x0003,0x0000, 0xC8EE,0x0000,0xBFD3,0x0003,0x0000,0xDAE6,0x0000,0xB6F2,0x000B,0x0004,0x0001,0x0000,0xCDD3,0x0004,0x0002,0xDAE3, 0xDAE4,0x0001,0xB6D3,0x0007,0x0004,0x0002,0xD8EC,0xDAE2,0x0000,0xB8B7,0x0004,0x0002,0xE3DB,0xE3DA,0x0001,0xE3D9, 0x001E,0x000F,0x0007,0x0004,0x0002,0xE3D8,0xE3D7,0x0000,0xC0AB,0x0004,0x0002,0xE3D6,0xC0BB,0x0002,0xB2FB,0xE3D5, 0x0008,0x0004,0x0002,0xD1D6,0xE3D4,0x0002,0xE3D3,0xE3D2,0x0004,0x0002,0xE3D1,0xD1CB,0x0000,0xE3D0,0x000F,0x0008, 0x0004,0x0002,0xE3CF,0xD4C4,0x0002,0xE3CE,0xE3CD,0x0004,0x0002,0xBAD2,0xB8F3,0x0000,0xB7A7,0x0008,0x0004,0x0002, 0xE3CC,0xC3F6,0x0002,0xE3CB,0xCEC5,0x0004,0x0002,0xB9EB,0xC4D6,0x0002,0xD5A2,0xC3C6,0x002E,0x001E,0x0010,0x0008, 0x0004,0x0002,0xE3CA,0xE3C9,0x0002,0xBCE4,0xE3C8,0x0004,0x0002,0xCFD0,0xE3C7,0x0002,0xC8F2,0xB4B3,0x0007,0x0004, 0x0002,0xCECA,0xB1D5,0x0001,0xE3C6,0x0004,0x0002,0xC9C1,0xE3C5,0x0000,0xC3C5,0x0009,0x0004,0x0000,0x0001,0xE3CB, 0x0000,0x0002,0xB1D9,0xB2FB,0x0000,0x0003,0x0000,0xE3DB,0x0000,0xB9D8,0x0016,0x000B,0x0007,0x0004,0x0002,0xB4B3, 0xE3DA,0x0000,0xE3D8,0x0001,0x0000,0xE3D9,0x0005,0x0001,0x0002,0xC0BB,0xE3D7,0x0003,0x0000,0xC0AB,0x0000,0xE3C7, 0x000A,0x0006,0x0003,0x0000,0xB0E5,0x0001,0xE3D6,0x0001,0x0001,0xE3D3,0x0008,0x0004,0x0002,0xE3D0,0xE3D4,0x0002, 0xE3D5,0xD1D6,0x0000,0x0001,0xD1CB,0x0050,0x0027,0x0015,0x0008,0x0004,0x0000,0x0000,0xE3D1,0x0000,0x0001,0xD4C4, 0x0007,0x0003,0x0001,0xE3CC,0x0002,0xE3CF,0xE3CD,0x0003,0x0001,0xC3F6,0x0000,0xB9EB,0x000D,0x0007,0x0003,0x0001, 0xB7A7,0x0002,0xE3D8,0xB8F3,0x0003,0x0001,0xBAD2,0x0001,0xC3D8,0x0001,0x0001,0x0000,0xD5A2,0x0017,0x000C,0x0005, 0x0001,0x0002,0xE3C9,0xBCE4,0x0004,0x0002,0xCFD0,0xCFD0,0x0001,0xC8F2,0x0007,0x0003,0x0000,0xE3C8,0x0002,0xE3CA, 0xBFAA,0x0000,0x0001,0xB1D5,0x000D,0x0006,0x0003,0x0000,0xE3C6,0x0001,0xC9C1,0x0003,0x0000,0xE3C5,0x0002,0xC3C5, 0xB3A4,0x0001,0x0001,0x0001,0xB3A4,0x003B,0x001D,0x000E,0x0006,0x0003,0x0000,0xCFE2,0x0001,0xEFF0,0x0004,0x0002, 0xEFEF,0xEFEE,0x0002,0xC1AD,0xEFED,0x0007,0x0003,0x0001,0xC0D8,0x0002,0xEFEC,0xEFEB,0x0004,0x0002,0xEFEA,0xEFE9, 0x0002,0xEFE8,0xEFE7,0x000F,0x0008,0x0004,0x0002,0xEFE6,0xEFE5,0x0002,0xEFE4,0xC1CD,0x0004,0x0002,0xEFE3,0xEFE2, 0x0001,0xEFE0,0x0008,0x0004,0x0002,0xEFDF,0xEFE1,0x0002,0xBEB5,0xEFDE,0x0003,0x0001,0xEFDD,0x0002,0xEFDC,0xEFDB, 0x001D,0x000F,0x0007,0x0003,0x0000,0xEFDA,0x0002,0xEFD9,0xEFD8,0x0004,0x0002,0xEFD7,0xB0F7,0x0002,0xB8E4,0xEFD6, 0x0007,0x0004,0x0002,0xEFD5,0xC4F8,0x0000,0xEFD4,0x0004,0x0002,0xC4F7,0xEFD3,0x0001,0xD5F2,0x000F,0x0007,0x0004, 0x0002,0xEFD2,0xEFD1,0x0000,0xEFD0,0x0004,0x0002,0xEFCE,0xC3BE,0x0002,0xB6C6,0xEFCD,0x0007,0x0003,0x0000,0xEFCC, 0x0002,0xEFCB,0xB6CD,0x0004,0x0002,0xEFF1,0xC7C2,0x0002,0xEFCA,0xEFC9,0x00F4,0x007B,0x003C,0x001E,0x000F,0x0007, 0x0004,0x0002,0xEFC8,0xEFCF,0x0000,0xEFC7,0x0004,0x0002,0xEFC6,0xEFC5,0x0002,0xC3CC,0xBEE2,0x0008,0x0004,0x0002, 0xBCFC,0xB6A7,0x0002,0xEFC4,0xEFC2,0x0004,0x0002,0xEFC1,0xEFC3,0x0000,0xCFC7,0x000F,0x0008,0x0004,0x0002,0xBDF5, 0xD7B6,0x0002,0xB4B8,0xC2E0,0x0004,0x0002,0xEFC0,0xCEFD,0x0001,0xEFBF,0x0007,0x0004,0x0002,0xEFBE,0xEFBD,0x0001, 0xEFBC,0x0004,0x0002,0xC3AA,0xB4ED,0x0002,0xEFBB,0xD5E0,0x0020,0x0010,0x0008,0x0004,0x0002,0xEFBA,0xEFB9,0x0002, 0xEFB8,0xEFB7,0x0004,0x0002,0xEFB6,0xCCE0,0x0002,0xC8F1,0xEFB5,0x0008,0x0004,0x0002,0xEFB4,0xEFB3,0x0002,0xD0BF, 0xB7E6,0x0004,0x0002,0xEFB2,0xEFB1,0x0002,0xD0E2,0xEFB0,0x0010,0x0008,0x0004,0x0002,0xEFAF,0xB9F8,0x0002,0xB3FA, 0xEFAD,0x0004,0x0002,0xEFAE,0xCBF8,0x0002,0xCFFA,0xEFAC,0x0007,0x0004,0x0002,0xC1B4,0xEFAB,0x0000,0xEFAA,0x0004, 0x0002,0xC6CC,0xEFA9,0x0002,0xD6FD,0xEFA8,0x003E,0x0020,0x0010,0x0008,0x0004,0x0002,0xD2F8,0xEFA7,0x0002,0xEFA6, 0xEFA5,0x0004,0x0002,0xB2F9,0xD2BF,0x0002,0xBDC2,0xEFA4,0x0008,0x0004,0x0002,0xEFA3,0xC3FA,0x0002,0xB8F5,0xEFA2, 0x0004,0x0002,0xEEFE,0xEFA1,0x0002,0xEEFD,0xEEFC,0x000F,0x0007,0x0003,0x0001,0xEEFB,0x0002,0xEEFA,0xCFB3,0x0004, 0x0002,0xEEF9,0xD5A1,0x0002,0xEEF8,0xEEF7,0x0008,0x0004,0x0002,0xEEF6,0xC2C1,0x0002,0xCDAD,0xEEF5,0x0003,0x0001, 0xEEF3,0x0002,0xEEF4,0xEEF2,0x001B,0x000C,0x0005,0x0000,0x0002,0xEEF1,0xEEF0,0x0004,0x0002,0xEEEF,0xEEEE,0x0000, 0xEEED,0x0008,0x0004,0x0002,0xEEEC,0xEEEB,0x0002,0xEEEA,0xEEE9,0x0004,0x0002,0xEEE8,0xEEE7,0x0000,0xEEE6,0x0010, 0x0008,0x0004,0x0002,0xC3AD,0xC7A6,0x0002,0xEEE5,0xC1E5,0x0004,0x0002,0xB2AC,0xCCFA,0x0002,0xD3CB,0xEEE4,0x0008, 0x0004,0x0002,0xBCD8,0xEEE3,0x0002,0xEEE2,0xD7EA,0x0004,0x0002,0xEEE1,0xEEE0,0x0002,0xEEDF,0xEEDE,0x0071,0x003F, 0x0020,0x0010,0x0008,0x0004,0x0002,0xEEDD,0xB2A7,0x0002,0xEEDC,0xC7AF,0x0004,0x0002,0xEEDB,0xC7AE,0x0002,0xEEDA, 0xEED9,0x0008,0x0004,0x0002,0xC5A5,0xEED7,0x0002,0xEED8,0xEED5,0x0004,0x0002,0xEED6,0xB9B3,0x0002,0xCED9,0xBEFB, 0x0010,0x0008,0x0004,0x0002,0xC7D5,0xD4BF,0x0002,0xEED4,0xEED3,0x0004,0x0002,0xB8D6,0xB1B5,0x0002,0xC4C6,0xD6D3, 0x0008,0x0004,0x0002,0xB3AE,0xB6DB,0x0002,0xEED2,0xEED1,0x0004,0x0002,0xEED0,0xB8C6,0x0001,0xEECE,0x001E,0x000E, 0x0007,0x0003,0x0001,0xEECF,0x0002,0xEECD,0xB5F6,0x0003,0x0000,0xB7B0,0x0002,0xEECC,0xEECB,0x0008,0x0004,0x0002, 0xC7A5,0xEECA,0x0002,0xEEC9,0xEEC7,0x0004,0x0002,0xEEC8,0xB6A4,0x0002,0xD5EB,0xEEC6,0x0009,0x0005,0x0000,0x0002, 0xEEC5,0xEEC4,0x0001,0x0001,0xD4E4,0x0007,0x0004,0x0002,0xF6C7,0xD7EA,0x0000,0xC2E0,0x0001,0x0001,0xC4F7,0x001B, 0x0011,0x0007,0x0001,0x0003,0x0000,0xCFE2,0x0000,0xD4BF,0x0006,0x0003,0x0001,0xEFE7,0x0001,0xF6CE,0x0000,0x0000, 0xC2AF,0x0000,0x0005,0x0001,0x0002,0xC5D9,0xEFF0,0x0001,0x0000,0xEEE5,0x000E,0x0006,0x0001,0x0000,0x0002,0xBCF8, 0xBCF8,0x0004,0x0001,0x0000,0xEFD9,0x0000,0x0000,0xEFEC,0x0008,0x0004,0x0001,0x0000,0xD6FD,0x0001,0x0001,0xEFEE, 0x0004,0x0000,0x0000,0xF6CD,0x0003,0x0000,0xEEF5,0x0000,0xEEEC,0x021C,0x00F5,0x0078,0x0037,0x001E,0x0013,0x0009, 0x0004,0x0001,0x0000,0xCCFA,0x0000,0x0002,0xC0D8,0xEFED,0x0004,0x0000,0x0001,0xC1AD,0x0003,0x0000,0xEFD4,0x0001, 0xEFD0,0x0005,0x0001,0x0001,0x0001,0xEFE8,0x0001,0x0001,0x0002,0xEFEB,0xD6D3,0x000C,0x0007,0x0001,0x0003,0x0001, 0xEFA9,0x0001,0xC1CD,0x0001,0x0000,0x0000,0xEFA6,0x0005,0x0001,0x0000,0x0000,0xEEF3,0x0004,0x0001,0x0000,0xD0E2, 0x0001,0x0000,0xEFEA,0x0024,0x000C,0x0007,0x0000,0x0003,0x0000,0xEFE4,0x0000,0xEEFC,0x0001,0x0001,0x0001,0xF6C9, 0x000A,0x0004,0x0001,0x0001,0xEFCE,0x0003,0x0001,0xEFDA,0x0000,0xBEB5,0x0008,0x0004,0x0002,0xB2F9,0xEFDE,0x0002, 0xEFDC,0xEFDB,0x0003,0x0001,0xC6DD,0x0001,0xEFCF,0x0014,0x0009,0x0005,0x0000,0x0002,0xEFAC,0xF7E9,0x0001,0x0000, 0xEFE1,0x0005,0x0001,0x0002,0xEFDD,0xEFD2,0x0003,0x0001,0xF6CB,0x0001,0xC1B4,0x0000,0x0004,0x0000,0x0000,0xD0FD, 0x0000,0x0000,0xEFDF,0x0043,0x0026,0x0016,0x000A,0x0004,0x0001,0x0000,0xEFD8,0x0003,0x0000,0xC4F8,0x0001,0xEFD7, 0x0006,0x0003,0x0001,0xD5F2,0x0001,0xB8E4,0x0003,0x0001,0xEFCB,0x0000,0xEFA1,0x0009,0x0005,0x0000,0x0002,0xEEF8, 0xEFD6,0x0000,0x0001,0xCED9,0x0001,0x0003,0x0001,0xB4B8,0x0001,0xEFD3,0x0010,0x0008,0x0000,0x0004,0x0002,0xC7B9, 0xCBF8,0x0001,0xC8DB,0x0004,0x0000,0x0000,0xF6CC,0x0000,0x0001,0xB0F7,0x0005,0x0001,0x0000,0x0001,0xC3BE,0x0004, 0x0000,0x0001,0xD6D3,0x0000,0x0001,0xD5E0,0x001F,0x0012,0x000A,0x0006,0x0003,0x0001,0xEFC8,0x0000,0xBCFC,0x0001, 0x0001,0xEFCC,0x0004,0x0001,0x0001,0xC7C2,0x0000,0x0001,0xF6CA,0x0006,0x0000,0x0001,0x0002,0xEFC6,0xEFCA,0x0001, 0x0003,0x0000,0xB6CD,0x0001,0xD5A1,0x000D,0x0005,0x0000,0x0001,0x0001,0xEFC9,0x0004,0x0001,0x0000,0xB6C6,0x0000, 0x0000,0xB9F8,0x0006,0x0000,0x0000,0x0002,0xEFC7,0xEECD,0x0004,0x0000,0x0001,0xF6C9,0x0001,0x0001,0xEFAA,0x0089, 0x0045,0x0027,0x0012,0x0008,0x0004,0x0001,0x0000,0xB1ED,0x0000,0x0001,0xC3CC,0x0006,0x0003,0x0001,0xB4ED,0x0000, 0xEFC0,0x0000,0x0001,0xCEFD,0x000A,0x0006,0x0003,0x0000,0xC3AA,0x0000,0xBDF5,0x0001,0x0000,0xC7AE,0x0004,0x0000, 0x0000,0xB6A7,0x0003,0x0001,0xEFBC,0x0002,0xEFA3,0xEFC5,0x000F,0x000A,0x0006,0x0003,0x0000,0xB4B8,0x0001,0xEFBF, 0x0001,0x0000,0xEFB9,0x0000,0x0000,0x0000,0xD7B6,0x000A,0x0004,0x0000,0x0000,0xEFC3,0x0003,0x0000,0xC2BC,0x0001, 0xEFBE,0x0001,0x0000,0x0000,0xB8D6,0x0024,0x0013,0x0008,0x0004,0x0000,0x0000,0xBEE2,0x0001,0x0001,0xEFAB,0x0007, 0x0004,0x0002,0xEFAE,0xEFAF,0x0000,0xEEF1,0x0001,0x0000,0xC6CC,0x000A,0x0006,0x0003,0x0000,0xEFB0,0x0000,0xEFB8, 0x0000,0x0000,0xB3FA,0x0000,0x0003,0x0001,0xEFB7,0x0001,0xEFB2,0x000D,0x0005,0x0001,0x0001,0x0000,0xB7E6,0x0004, 0x0000,0x0001,0xEEF2,0x0000,0x0000,0xEEFA,0x000D,0x0007,0x0004,0x0002,0xF6C8,0xB1B5,0x0001,0xD0BF,0x0003,0x0001, 0xEFB6,0x0001,0xC2C1,0x0001,0x0000,0x0002,0xEFB1,0xCCE0,0x0050,0x002B,0x0016,0x000A,0x0004,0x0000,0x0001,0xCFFA, 0x0003,0x0001,0xC8F1,0x0000,0xBAB8,0x0004,0x0001,0x0000,0xF6C7,0x0004,0x0002,0xEEED,0xEFA4,0x0002,0xEEF0,0xEEFB, 0x000B,0x0007,0x0003,0x0000,0xEFA7,0x0002,0xEEF7,0xD2BF,0x0000,0x0001,0xEFA8,0x0004,0x0000,0x0000,0xEEEE,0x0003, 0x0000,0xCFCE,0x0000,0xEFA2,0x0012,0x000D,0x0007,0x0003,0x0000,0xC3FA,0x0002,0xEEF9,0xD2C4,0x0003,0x0001,0xEEFD, 0x0001,0xCFB3,0x0000,0x0001,0x0000,0xF6C6,0x0008,0x0004,0x0001,0x0001,0xCDAD,0x0000,0x0001,0xEFA5,0x0005,0x0000, 0x0002,0xD2F8,0xEEFE,0x0003,0x0001,0xB8F5,0x0000,0xEEEF,0x0024,0x0010,0x0008,0x0004,0x0000,0x0000,0xBDC2,0x0000, 0x0000,0xBCF8,0x0004,0x0001,0x0001,0xEEE3,0x0000,0x0000,0xEEE2,0x0008,0x0004,0x0001,0x0000,0xEEDB,0x0000,0x0000, 0xB9B3,0x0006,0x0003,0x0000,0xD1EB,0x0000,0xEEE1,0x0003,0x0001,0xC7A6,0x0000,0xC3AD,0x0015,0x0009,0x0004,0x0000, 0x0001,0xC7AF,0x0001,0x0002,0xD7A2,0xB2AC,0x0006,0x0003,0x0001,0xB3FA,0x0001,0xEEE9,0x0003,0x0001,0xC5D9,0x0001, 0xEEE7,0x0008,0x0000,0x0003,0x0000,0xEEE8,0x0002,0xD7EA,0xEED2,0x0008,0x0004,0x0002,0xBCD8,0xEEE4,0x0002,0xD3CB, 0xEEDF,0x0001,0x0002,0xEEDA,0xEEEB,0x0148,0x00A0,0x0047,0x0023,0x0013,0x000C,0x0006,0x0002,0xEEE0,0x0002,0xEEDC, 0xCCA8,0x0003,0x0001,0xC1E5,0x0000,0xEEDD,0x0000,0x0003,0x0001,0xEEE6,0x0001,0xEEEA,0x000B,0x0005,0x0001,0x0002, 0xEED6,0xEED1,0x0003,0x0000,0xEED8,0x0000,0xB8C6,0x0000,0x0001,0x0001,0xBEFB,0x0011,0x0006,0x0001,0x0000,0x0002, 0xC5A5,0xB3AE,0x0007,0x0004,0x0002,0xEED3,0xEED4,0x0000,0xCEFD,0x0000,0x0000,0xB6DB,0x000B,0x0006,0x0003,0x0000, 0xC4C6,0x0001,0xC7A6,0x0000,0x0002,0xD4BF,0xEED7,0x0000,0x0004,0x0002,0xEED5,0xEED9,0x0000,0xBDEF,0x0025,0x0012, 0x000A,0x0006,0x0003,0x0000,0xEECF,0x0000,0xEECA,0x0000,0x0000,0xEECE,0x0004,0x0000,0x0000,0xEED1,0x0000,0x0001, 0xBAB8,0x000D,0x0007,0x0003,0x0000,0xB7B0,0x0002,0xEECB,0xBFDB,0x0003,0x0001,0xEECC,0x0000,0xB5F6,0x0001,0x0000, 0x0002,0xD5EB,0xB8AA,0x001E,0x000E,0x0007,0x0004,0x0002,0xEEC7,0xB6A4,0x0000,0xEEC8,0x0004,0x0002,0xEEC9,0xEEC6, 0x0000,0xEEC5,0x0008,0x0004,0x0002,0xBDF0,0xC0E5,0x0002,0xC1BF,0xD2B0,0x0004,0x0002,0xD6D8,0xC0EF,0x0002,0xCACD, 0xCACD,0x000D,0x0007,0x0003,0x0000,0xD3D4,0x0002,0xB2C9,0xB2C9,0x0003,0x0000,0xF5A6,0x0000,0xF5A7,0x0005,0x0000, 0x0002,0xD0C6,0xC4F0,0x0001,0x0001,0xF5B8,0x004A,0x0024,0x0013,0x0006,0x0001,0x0000,0x0002,0xF5B6,0xF5B7,0x0005, 0x0001,0x0002,0xF5B5,0xF5B4,0x0004,0x0002,0xF5B3,0xBDB4,0x0002,0xD2BD,0xF5B2,0x0006,0x0001,0x0001,0x0002,0xF5B1, 0xF5B0,0x0004,0x0001,0x0001,0xD4CD,0x0003,0x0001,0xB3F3,0x0002,0xC8A9,0xC3D1,0x0011,0x0005,0x0001,0x0001,0x0001, 0xD0D1,0x0005,0x0000,0x0002,0xF5AF,0xF5AD,0x0004,0x0002,0xF5AE,0xF5AB,0x0000,0xB4D7,0x000C,0x0006,0x0003,0x0000, 0xD7ED,0x0000,0xB4BC,0x0003,0x0000,0xF5AC,0x0000,0xEBE7,0x0005,0x0001,0x0002,0xC4F0,0xF5A7,0x0000,0x0000,0xF5A6, 0x0036,0x001D,0x000F,0x0008,0x0004,0x0002,0xF5AA,0xCBE1,0x0002,0xBFE1,0xC3B8,0x0004,0x0002,0xBDCD,0xF5A9,0x0001, 0xF5A8,0x0008,0x0004,0x0002,0xBDB4,0xF5A3,0x0002,0xF5A5,0xCDAA,0x0003,0x0001,0xB3EA,0x0001,0xC0D2,0x000C,0x0004, 0x0000,0x0000,0xF5A4,0x0004,0x0002,0xCBD6,0xF4FE,0x0002,0xBAA8,0xF5A1,0x0007,0x0004,0x0002,0xF5A2,0xCDAA,0x0001, 0xCCAA,0x0003,0x0000,0xD4CD,0x0001,0xB7D3,0x0018,0x0009,0x0005,0x0001,0x0002,0xD0EF,0xF0B2,0x0001,0x0001,0xBEC6, 0x0007,0x0003,0x0001,0xF4FB,0x0002,0xF4FD,0xF4FC,0x0004,0x0002,0xC5E4,0xD7C3,0x0002,0xC7F5,0xF4FA,0x000B,0x0007, 0x0004,0x0002,0xD3CF,0xDBAA,0x0001,0xDBBA,0x0001,0x0000,0xDBB9,0x0001,0x0001,0x0001,0xDAF7,0x00A2,0x004D,0x0028, 0x0017,0x000C,0x0006,0x0003,0x0000,0xDBB8,0x0001,0xDBA6,0x0003,0x0001,0xDAFE,0x0001,0xB5A6,0x0007,0x0004,0x0002, 0xDBB6,0xC1DA,0x0000,0xDBB7,0x0000,0x0000,0xD6A3,0x0009,0x0004,0x0001,0x0000,0xB5CB,0x0001,0x0002,0xDBB5,0xDBB3, 0x0004,0x0001,0x0001,0xDBB4,0x0000,0x0000,0xDEA4,0x0011,0x000C,0x0006,0x0003,0x0000,0xB1C9,0x0001,0xD4C7,0x0003, 0x0001,0xDAF9,0x0001,0xD7DE,0x0000,0x0001,0x0001,0xCFA2,0x000C,0x0006,0x0003,0x0000,0xCFE7,0x0001,0xDBA9,0x0003, 0x0001,0xDBB2,0x0001,0xB6F5,0x0004,0x0001,0x0001,0xDBB1,0x0000,0x0000,0xB6BC,0x002D,0x0015,0x000B,0x0004,0x0000, 0x0001,0xB5A6,0x0004,0x0002,0xD3CA,0xB3BB,0x0000,0xC4DF,0x0004,0x0001,0x0000,0xDBB0,0x0003,0x0000,0xB9F9,0x0000, 0xDBAF,0x000B,0x0007,0x0003,0x0001,0xB2BF,0x0002,0xD4C7,0xDBAA,0x0001,0x0001,0xDBAB,0x0006,0x0003,0x0000,0xBFA4, 0x0000,0xDBA3,0x0004,0x0002,0xBAC2,0xDBAC,0x0000,0xDBAE,0x0014,0x0008,0x0004,0x0001,0x0000,0xDBAD,0x0001,0x0000, 0xDBA9,0x0008,0x0004,0x0002,0xD6A3,0xDBA6,0x0002,0xDBA3,0xC0C9,0x0001,0x0001,0xBDBC,0x0009,0x0004,0x0001,0x0000, 0xDBA8,0x0000,0x0002,0xDBA4,0xDBA7,0x0006,0x0003,0x0000,0xD3F4,0x0001,0xDBA5,0x0001,0x0002,0xC1DA,0xDAFE,0x0063, 0x002F,0x001C,0x000E,0x0007,0x0004,0x0002,0xD7DE,0xDBA1,0x0001,0xDAFD,0x0004,0x0002,0xC9DB,0xDAFB,0x0000,0xDAFC, 0x0008,0x0004,0x0002,0xC7F1,0xDBA2,0x0002,0xBAAA,0xD3CA,0x0003,0x0001,0xDAF9,0x0001,0xD0B0,0x0009,0x0004,0x0001, 0x0001,0xB0EE,0x0001,0x0002,0xC4C7,0xD0CF,0x0004,0x0000,0x0000,0xDAFA,0x0003,0x0000,0xDAF7,0x0000,0xDAF6,0x0019, 0x000D,0x0007,0x0004,0x0002,0xDAF8,0xD3DA,0x0000,0xDAF5,0x0003,0x0000,0xE7DF,0x0000,0xB5CB,0x0007,0x0004,0x0002, 0xD2D8,0xE5CE,0x0000,0xC2DF,0x0001,0x0002,0xE5E5,0xB1DF,0x000D,0x0006,0x0003,0x0001,0xE5E3,0x0000,0xE5C7,0x0003, 0x0001,0xBBB9,0x0002,0xE5E4,0xE5E2,0x0007,0x0004,0x0002,0xC2F5,0xD1FB,0x0000,0xB1DC,0x0004,0x0002,0xE5E1,0xC1C9, 0x0001,0xD2C5,0x002D,0x0015,0x000D,0x0006,0x0003,0x0001,0xD1A1,0x0000,0xC7A8,0x0004,0x0002,0xD7F1,0xE5E0,0x0001, 0xB3D9,0x0004,0x0001,0x0001,0xD5DA,0x0000,0x0000,0xD4E2,0x000C,0x0005,0x0000,0x0002,0xCACA,0xE5DB,0x0003,0x0000, 0xD2A3,0x0002,0xC7B2,0xE5DD,0x0006,0x0003,0x0001,0xD4B6,0x0001,0xB5DD,0x0003,0x0001,0xD1B7,0x0000,0xE5DE,0x001E, 0x000F,0x0007,0x0004,0x0002,0xD2A3,0xE5DC,0x0000,0xD2C5,0x0004,0x0002,0xCEA5,0xB4EF,0x0002,0xB5C0,0xE5D9,0x0008, 0x0004,0x0002,0xE5D8,0xE5DA,0x0002,0xB6F4,0xB9FD,0x0003,0x0000,0xB1E9,0x0002,0xD4CB,0xD3CE,0x000C,0x0006,0x0003, 0x0000,0xD5EC,0x0000,0xD3F6,0x0003,0x0001,0xE5D7,0x0001,0xCBEC,0x0006,0x0003,0x0000,0xB6DD,0x0001,0xD3E2,0x0003, 0x0001,0xB1C6,0x0000,0xC2DF,0x0A97,0x0556,0x02A9,0x0185,0x00C3,0x0062,0x002B,0x0015,0x0009,0x0004,0x0001,0x0000, 0xD2DD,0x0000,0x0002,0xE5D4,0xE5D3,0x0007,0x0004,0x0002,0xBDF8,0xD6DC,0x0001,0xE5D6,0x0000,0x0002,0xB4FE,0xE5D5, 0x0007,0x0001,0x0003,0x0000,0xE5CE,0x0001,0xC1AC,0x0008,0x0004,0x0002,0xB7EA,0xE5D2,0x0002,0xD4EC,0xCBD9,0x0004, 0x0002,0xB3D1,0xCAC5,0x0001,0xB9E4,0x001D,0x000E,0x0007,0x0004,0x0002,0xCDA8,0xD5E2,0x0001,0xB6BA,0x0004,0x0002, 0xE5D1,0xE5C9,0x0000,0xCDBE,0x0008,0x0004,0x0002,0xB5DD,0xE5CF,0x0002,0xD6F0,0xCDB8,0x0003,0x0001,0xE5D0,0x0002, 0xD3C9,0xE5CD,0x000D,0x0005,0x0000,0x0002,0xD1B7,0xD1A1,0x0004,0x0002,0xC4E6,0xE5CB,0x0002,0xE5CC,0xCCD3,0x0007, 0x0004,0x0002,0xCACA,0xCBCD,0x0000,0xCDCB,0x0003,0x0001,0xD7B7,0x0001,0xD2C6,0x0034,0x0018,0x000D,0x0008,0x0004, 0x0002,0xC4CB,0xBCA3,0x0002,0xB1C5,0xC3D4,0x0001,0x0002,0xBBD8,0xE5C9,0x0004,0x0001,0x0000,0xCAF6,0x0004,0x0002, 0xE5C5,0xB5FC,0x0001,0xC6C8,0x000E,0x0007,0x0004,0x0002,0xB5CF,0xE5C7,0x0000,0xE5CA,0x0004,0x0002,0xE5C8,0xE5C4, 0x0000,0xE5C6,0x0006,0x0003,0x0000,0xCCF6,0x0001,0xB3D9,0x0004,0x0002,0xC1AC,0xCEA5,0x0002,0xD4B6,0xBDF8,0x0017, 0x000D,0x0006,0x0003,0x0001,0xD5E2,0x0000,0xBBB9,0x0003,0x0001,0xE5C3,0x0002,0xB7B5,0xE5C2,0x0006,0x0003,0x0001, 0xBDFC,0x0000,0xD4CB,0x0000,0x0000,0xD3AD,0x000C,0x0005,0x0001,0x0002,0xC2F5,0xB9FD,0x0004,0x0002,0xE5C6,0xD1B8, 0x0000,0xC6F9,0x0005,0x0000,0x0002,0xD3D8,0xC7A8,0x0000,0x0002,0xB4EF,0xC1C9,0x006B,0x002E,0x0017,0x0008,0x0004, 0x0000,0x0001,0xB1DF,0x0000,0x0000,0xE5C1,0x0008,0x0004,0x0002,0xC5A9,0xC8E8,0x0002,0xB3BD,0xB1E7,0x0004,0x0002, 0xB1E8,0xB4C7,0x0001,0xB1E8,0x000C,0x0006,0x0003,0x0001,0xB1E7,0x0000,0xB1E6,0x0003,0x0000,0xB0EC,0x0001,0xC0B1, 0x0004,0x0001,0x0001,0xB1D9,0x0003,0x0000,0xB4C7,0x0002,0xB9BC,0xD0C1,0x001E,0x0010,0x0008,0x0004,0x0002,0xEAA5, 0xD5DE,0x0002,0xEAA4,0xD5B7,0x0004,0x0002,0xCFBD,0xD4AF,0x0002,0xE0CE,0xCAE4,0x0007,0x0003,0x0001,0xBCAD,0x0002, 0xB7F8,0xEAA3,0x0004,0x0002,0xEAA2,0xEAA1,0x0001,0xE9FE,0x0010,0x0008,0x0004,0x0002,0xB9F5,0xBBD4,0x0002,0xB1B2, 0xE9FD,0x0004,0x0002,0xC1BE,0xB8A8,0x0002,0xE9FC,0xBDCF,0x0007,0x0004,0x0002,0xE9FB,0xE9FA,0x0001,0xBDCE,0x0004, 0x0002,0xE9F9,0xD4D8,0x0002,0xE9F8,0xC7E1,0x0035,0x0020,0x0010,0x0008,0x0004,0x0002,0xE9F7,0xE9F6,0x0002,0xE9F4, 0xE9F5,0x0004,0x0002,0xE9F3,0xE9F2,0x0002,0xD6E1,0xE9F1,0x0008,0x0004,0x0002,0xE9F0,0xE9EF,0x0002,0xBAE4,0xC8ED, 0x0004,0x0002,0xC2D6,0xE9EE,0x0002,0xD7AA,0xE9ED,0x000D,0x0007,0x0003,0x0001,0xD0F9,0x0002,0xB9EC,0xD4FE,0x0003, 0x0000,0xB3B5,0x0000,0xE9F1,0x0000,0x0004,0x0002,0xE9F6,0xE0CE,0x0001,0xBAE4,0x000B,0x0005,0x0001,0x0001,0x0000, 0xEAA5,0x0001,0x0000,0x0002,0xBDCE,0xD5DE,0x000B,0x0004,0x0000,0x0001,0xD7AA,0x0004,0x0002,0xEAA4,0xD4AF,0x0000, 0xCFBD,0x0006,0x0003,0x0000,0xECB1,0x0001,0xD3DF,0x0003,0x0000,0xD5B7,0x0001,0xB7F8,0x007F,0x0047,0x0022,0x000D, 0x0005,0x0000,0x0001,0x0001,0xCAE4,0x0004,0x0000,0x0000,0xEAA3,0x0000,0x0000,0xBCAD,0x000C,0x0006,0x0003,0x0001, 0xC2D6,0x0000,0xB1B2,0x0003,0x0001,0xE9FD,0x0000,0xB9F5,0x0001,0x0004,0x0002,0xEAA1,0xE9FE,0x0002,0xBBD4,0xEAA2, 0x000F,0x0009,0x0004,0x0000,0x0000,0xC1BE,0x0001,0x0002,0xC7E1,0xB8A8,0x0000,0x0000,0x0002,0xCDEC,0xE9FC,0x000C, 0x0006,0x0003,0x0001,0xE9F9,0x0000,0xD4D8,0x0003,0x0000,0xE9FA,0x0000,0xE9FB,0x0004,0x0000,0x0000,0xBDCF,0x0003, 0x0001,0xE9F8,0x0001,0xE9F3,0x001A,0x000D,0x0000,0x0008,0x0004,0x0002,0xE9F0,0xE9F7,0x0002,0xE9F2,0xD6E1,0x0000, 0x0001,0xE9EE,0x0008,0x0004,0x0000,0x0000,0xE9F4,0x0001,0x0000,0xBED0,0x0001,0x0000,0x0000,0xC8ED,0x0013,0x0008, 0x0004,0x0000,0x0000,0xE9EE,0x0001,0x0001,0xE9ED,0x0004,0x0000,0x0001,0xD0F9,0x0003,0x0001,0xEAA6,0x0002,0xBEFC, 0xB9EC,0x0006,0x0000,0x0000,0x0002,0xD4FE,0xB3B5,0x0000,0x0001,0x0001,0xC7FB,0x0051,0x0024,0x000F,0x0005,0x0000, 0x0000,0x0001,0xCCC9,0x0004,0x0000,0x0001,0xB6E3,0x0003,0x0000,0xC7FB,0x0001,0xB9AA,0x000B,0x0005,0x0000,0x0002, 0xC9ED,0xF5EF,0x0003,0x0001,0xF5F2,0x0000,0xB4DA,0x0004,0x0001,0x0000,0xF5E6,0x0003,0x0001,0xF5F3,0x0001,0xF5F2, 0x0016,0x0008,0x0004,0x0000,0x0001,0xF5D1,0x0001,0x0001,0xF5F0,0x0008,0x0004,0x0002,0xF5D9,0xF5C8,0x0002,0xF5DC, 0xF5F1,0x0003,0x0000,0xF5EF,0x0000,0xD4BE,0x000D,0x0007,0x0004,0x0002,0xF5D2,0xB3EC,0x0000,0xF5BB,0x0003,0x0000, 0xB3F9,0x0000,0xF5EE,0x0004,0x0001,0x0000,0xD4EA,0x0003,0x0000,0xB4DA,0x0001,0xF5EB,0x0029,0x0017,0x000A,0x0004, 0x0000,0x0001,0xF5CE,0x0003,0x0001,0xF5EA,0x0001,0xF5ED,0x0006,0x0003,0x0001,0xB6D7,0x0001,0xF5E9,0x0003,0x0000, 0xF5EC,0x0002,0xB2E4,0xB5C5,0x000A,0x0004,0x0001,0x0000,0xF5BF,0x0003,0x0001,0xB1C4,0x0001,0xD7D9,0x0004,0x0000, 0x0000,0xF5E7,0x0000,0x0000,0xBCA3,0x0012,0x0008,0x0004,0x0001,0x0000,0xF5BE,0x0001,0x0000,0xF5CF,0x0006,0x0003, 0x0001,0xF5E7,0x0000,0xF5E6,0x0001,0x0001,0xF5C4,0x000E,0x0008,0x0004,0x0002,0xCCA3,0xF5E8,0x0002,0xF5E3,0xB5B8, 0x0003,0x0000,0xE5BF,0x0001,0xCCE3,0x0007,0x0003,0x0001,0xF5E5,0x0002,0xF5E4,0xF5DE,0x0001,0x0000,0xF5E1,0x0152, 0x00A5,0x0046,0x002B,0x0015,0x0009,0x0005,0x0001,0x0002,0xF5DD,0xF5DF,0x0001,0x0001,0xF5E0,0x0006,0x0003,0x0000, 0xD3BB,0x0001,0xF5E2,0x0003,0x0001,0xF5DC,0x0000,0xF5DA,0x0008,0x0000,0x0003,0x0000,0xF5D9,0x0002,0xD7D9,0xB2C8, 0x0007,0x0003,0x0001,0xF5DB,0x0002,0xCCDF,0xF2E9,0x0003,0x0001,0xF5D8,0x0002,0xBEE1,0xF5D7,0x000A,0x0001,0x0004, 0x0000,0x0000,0xF5D6,0x0000,0x0002,0xBCF9,0xCCA4,0x000C,0x0007,0x0003,0x0000,0xB3EC,0x0002,0xD3BB,0xF5D4,0x0001, 0x0002,0xB6D7,0xF5BD,0x0001,0x0001,0x0001,0xF5D5,0x0032,0x0018,0x000F,0x0008,0x0004,0x0002,0xBED6,0xF5D2,0x0002, 0xB6E5,0xF5D1,0x0004,0x0002,0xF5CF,0xF5CE,0x0001,0xBCF9,0x0005,0x0000,0x0002,0xB2C8,0xCCF8,0x0000,0x0001,0xC2B7, 0x000B,0x0007,0x0004,0x0002,0xF5CD,0xF5BC,0x0000,0xB9F2,0x0000,0x0000,0xBFE7,0x0008,0x0004,0x0002,0xF5D3,0xF5D0, 0x0002,0xF5DC,0xBCA3,0x0003,0x0001,0xB8FA,0x0002,0xF5C8,0xBEE0,0x0017,0x000C,0x0006,0x0003,0x0001,0xF5CB,0x0000, 0xF5C7,0x0003,0x0001,0xF5C6,0x0000,0xF5C5,0x0004,0x0001,0x0001,0xC5DC,0x0004,0x0002,0xB2C8,0xF5CA,0x0000,0xF5C9, 0x0009,0x0005,0x0000,0x0002,0xB5F8,0xB0CF,0x0001,0x0000,0xF5CC,0x0007,0x0004,0x0002,0xF5C4,0xD4BE,0x0000,0xC6E7, 0x0003,0x0001,0xF5C1,0x0000,0xD6BA,0x0045,0x0022,0x0015,0x000C,0x0006,0x0003,0x0000,0xF5C2,0x0000,0xF5C3,0x0003, 0x0000,0xF5BB,0x0001,0xF5C0,0x0000,0x0004,0x0002,0xC5BF,0xD7E3,0x0002,0xF4F5,0xF4F5,0x0005,0x0001,0x0000,0x0000, 0xC7F7,0x0004,0x0000,0x0001,0xC8A4,0x0000,0x0001,0xCCCB,0x0012,0x0008,0x0004,0x0001,0x0001,0xD5D4,0x0001,0x0001, 0xB8CF,0x0006,0x0003,0x0000,0xF4F3,0x0001,0xF4F4,0x0001,0x0001,0xC7F7,0x000A,0x0006,0x0003,0x0001,0xC7F7,0x0000, 0xD4BD,0x0001,0x0001,0xB3AC,0x0000,0x0003,0x0000,0xF4F2,0x0001,0xB3C3,0x002C,0x0013,0x0008,0x0001,0x0003,0x0001, 0xC6F0,0x0002,0xB8CF,0xD5D4,0x0005,0x0000,0x0002,0xB8B0,0xF4F1,0x0003,0x0000,0xD7DF,0x0001,0xF4F7,0x000A,0x0004, 0x0000,0x0001,0xBAD5,0x0003,0x0001,0xF4F6,0x0000,0xC9E2,0x0008,0x0004,0x0002,0xB3E0,0xB8D3,0x0002,0xD3AE,0xC9C4, 0x0003,0x0000,0xD4F9,0x0002,0xD4DE,0xD8CD,0x001C,0x000F,0x0008,0x0004,0x0002,0xD8D3,0xC8FC,0x0002,0xD7AC,0xEAE7, 0x0003,0x0000,0xD7B8,0x0002,0xC0B5,0xEAE6,0x0005,0x0000,0x0002,0xC5E2,0xE2D9,0x0004,0x0002,0xB4CD,0xC9CD,0x0002, 0xCAEA,0xEAE5,0x0010,0x0008,0x0004,0x0002,0xB6C4,0xB8B3,0x0002,0xC9DE,0xEAE3,0x0004,0x0002,0xEAE2,0xEAE4,0x0002, 0xEAE1,0xEAE0,0x0008,0x0004,0x0002,0xD7CA,0xD4DF,0x0002,0xC2B8,0xC1DE,0x0004,0x0002,0xEADF,0xBBDF,0x0002,0xBCD6, 0xEADE,0x00C2,0x0067,0x003F,0x0020,0x0010,0x0008,0x0004,0x0002,0xD4F4,0xEADD,0x0002,0xBAD8,0xB7D1,0x0004,0x0002, 0xC3B3,0xB4FB,0x0002,0xEADC,0xB9F3,0x0008,0x0004,0x0002,0xCCF9,0xEADB,0x0002,0xEADA,0xBCFA,0x0004,0x0002,0xB7A1, 0xB9E1,0x0002,0xD6FC,0xB9BA,0x0010,0x0008,0x0004,0x0002,0xB1E1,0xC6B6,0x0002,0xCCB0,0xB7B7,0x0004,0x0002,0xD6CA, 0xBBF5,0x0002,0xD5CB,0xB0DC,0x0008,0x0004,0x0002,0xCFCD,0xD4F0,0x0002,0xB2C6,0xB9B1,0x0003,0x0001,0xB8BA,0x0002, 0xD5EA,0xB1B4,0x0015,0x000A,0x0004,0x0000,0x0001,0xB8D3,0x0003,0x0001,0xD8CD,0x0000,0xCAEA,0x0004,0x0000,0x0001, 0xD4DF,0x0004,0x0002,0xEAE1,0xD3AE,0x0001,0xC9C4,0x000A,0x0004,0x0001,0x0000,0xD4DE,0x0003,0x0000,0xD4F9,0x0001, 0xD7B8,0x0004,0x0000,0x0000,0xEADE,0x0001,0x0002,0xD8D3,0xC8FC,0x002D,0x0013,0x000B,0x0007,0x0004,0x0002,0xB9BA, 0xEAE7,0x0000,0xD7AC,0x0000,0x0000,0xCAA3,0x0004,0x0000,0x0000,0xC0B5,0x0001,0x0001,0xB6C4,0x000C,0x0006,0x0003, 0x0000,0xD5CB,0x0000,0xD6CA,0x0003,0x0001,0xEAE6,0x0000,0xB8B3,0x0008,0x0004,0x0002,0xBCFA,0xC2F4,0x0002,0xCFCD, 0xE2D9,0x0003,0x0000,0xC5E2,0x0000,0xC9CD,0x0012,0x000A,0x0006,0x0003,0x0000,0xB4CD,0x0001,0xD6DC,0x0001,0x0001, 0xEAE4,0x0000,0x0003,0x0001,0xB1F6,0x0002,0xC9DE,0xEAE2,0x000D,0x0006,0x0003,0x0000,0xEAE0,0x0000,0xD4F4,0x0004, 0x0002,0xBCD6,0xD7CA,0x0001,0xEAE0,0x0008,0x0004,0x0002,0xBBDF,0xC1DE,0x0002,0xC2B8,0xEADA,0x0004,0x0002,0xBAD8, 0xC3B3,0x0001,0xEADD,0x0052,0x0036,0x001A,0x000E,0x0007,0x0004,0x0002,0xCCF9,0xB7D1,0x0000,0xEADC,0x0004,0x0002, 0xB4FB,0xC2F2,0x0000,0xB1E1,0x0007,0x0004,0x0002,0xB9F3,0xB7A1,0x0000,0xEADF,0x0000,0x0002,0xEADB,0xD6FC,0x000D, 0x0008,0x0004,0x0002,0xD4F0,0xB9E1,0x0002,0xCCB0,0xB7B7,0x0000,0x0002,0xBBF5,0xC6B6,0x0008,0x0004,0x0002,0xD2C6, 0xDFAF,0x0002,0xB9B1,0xB2C6,0x0003,0x0000,0xB8BA,0x0002,0xD5EA,0xB1B4,0x000B,0x0005,0x0001,0x0000,0x0000,0xF5F8, 0x0000,0x0000,0x0002,0xF5F9,0xC3A8,0x000C,0x0007,0x0003,0x0000,0xC3B2,0x0002,0xF5F6,0xBAD1,0x0001,0x0002,0xE2B5, 0xF5F7,0x0000,0x0001,0x0000,0xF5F5,0x001E,0x000E,0x0009,0x0005,0x0001,0x0002,0xB2F2,0xB1AA,0x0000,0x0000,0xF5F4, 0x0000,0x0000,0x0001,0xE1D9,0x0008,0x0000,0x0004,0x0002,0xD6ED,0xD4A5,0x0000,0xBAC0,0x0000,0x0003,0x0000,0xBFD0, 0x0002,0xBBBF,0xCFF3,0x0012,0x0008,0x0004,0x0001,0x0000,0xEBE0,0x0001,0x0001,0xF5B9,0x0004,0x0000,0x0000,0xD1DE, 0x0003,0x0000,0xB7E1,0x0000,0xCAFA,0x000F,0x0008,0x0004,0x0002,0xCDE3,0xB5C7,0x0002,0xB7E1,0xF4F9,0x0004,0x0002, 0xC6F1,0xF4F8,0x0000,0xB6B9,0x0004,0x0001,0x0001,0xBBED,0x0000,0x0001,0xCFAA,0x02DD,0x018F,0x00F1,0x0074,0x0035, 0x0016,0x0006,0x0001,0x0001,0x0002,0xB9C8,0xDADF,0x0008,0x0004,0x0002,0xDADE,0xC7B4,0x0002,0xDADD,0xDADC,0x0004, 0x0002,0xC6D7,0xC0BE,0x0002,0xDADB,0xDADA,0x0010,0x0008,0x0004,0x0002,0xCCB7,0xC3FD,0x0002,0xDAD9,0xDAD8,0x0004, 0x0002,0xC3A1,0xBDF7,0x0002,0xDAD7,0xC7AB,0x0008,0x0004,0x0002,0xDAD6,0xB0F9,0x0002,0xD2A5,0xD0BB,0x0004,0x0002, 0xDAD5,0xDAD4,0x0000,0xDAD3,0x0020,0x0010,0x0008,0x0004,0x0002,0xDAD2,0xC3D5,0x0002,0xDAD0,0xD1E8,0x0004,0x0002, 0xDACF,0xDAD1,0x0002,0xB2F7,0xDACE,0x0008,0x0004,0x0002,0xDACD,0xDACC,0x0002,0xCEBD,0xDACB,0x0004,0x0002,0xDACA, 0xD0B3,0x0002,0xDAC9,0xBBD1,0x000F,0x0008,0x0004,0x0002,0xB5FD,0xDAC8,0x0002,0xC4B1,0xD2EA,0x0003,0x0001,0xCCB8, 0x0002,0xDAC7,0xD7BB,0x0008,0x0004,0x0002,0xC1C2,0xDAC6,0x0002,0xB5F7,0xDAC5,0x0004,0x0002,0xCBAD,0xDAC4,0x0002, 0xDAC3,0xBFCE,0x003F,0x0020,0x0010,0x0008,0x0004,0x0002,0xB7CC,0xDAC2,0x0002,0xB6C1,0xC5B5,0x0004,0x0002,0xDAC1, 0xD6EE,0x0002,0xC7EB,0xDAC0,0x0008,0x0004,0x0002,0xCBD0,0xCBB5,0x0002,0xDABF,0xBBE5,0x0004,0x0002,0xD3D5,0xDABE, 0x0002,0xCEF3,0xDABD,0x000F,0x0007,0x0004,0x0002,0xD3EF,0xCEDC,0x0000,0xBDEB,0x0004,0x0002,0xDABC,0xDABB,0x0002, 0xB2EF,0xCFEA,0x0008,0x0004,0x0002,0xB8C3,0xDABA,0x0002,0xD2E8,0xD1AF,0x0004,0x0002,0xB9EE,0xDAB9,0x0002,0xDAB8, 0xB5AE,0x001F,0x0010,0x0008,0x0004,0x0002,0xBBB0,0xDAB7,0x0002,0xD6EF,0xB3CF,0x0004,0x0002,0xDAB6,0xDAB5,0x0002, 0xCAAB,0xDAB4,0x0008,0x0004,0x0002,0xCAD4,0xDAB3,0x0002,0xDAB2,0xDAB1,0x0003,0x0000,0xD2EB,0x0002,0xDAAF,0xDAB0, 0x000F,0x0008,0x0004,0x0002,0xB4CA,0xD6DF,0x0002,0xDAAE,0xD5EF,0x0004,0x0002,0xCBDF,0xD5A9,0x0001,0xCAB6,0x0008, 0x0004,0x0002,0xD7E7,0xC6C0,0x0002,0xDAAD,0xDAAC,0x0004,0x0002,0xD6A4,0xBEF7,0x0002,0xB7C3,0xC9E8,0x005B,0x003C, 0x001E,0x000F,0x0007,0x0004,0x0002,0xB7ED,0xCBCF,0x0001,0xC2DB,0x0004,0x0002,0xB6EF,0xD0ED,0x0002,0xDAAB,0xD1C8, 0x0008,0x0004,0x0002,0xDAAA,0xDAA9,0x0002,0xBBE4,0xBDB2,0x0003,0x0001,0xBCC7,0x0002,0xD1B6,0xD2E9,0x000F,0x0007, 0x0003,0x0000,0xD1B5,0x0002,0xC6FD,0xDAA8,0x0004,0x0002,0xC8C3,0xCCD6,0x0002,0xDAA7,0xDAA6,0x0008,0x0004,0x0002, 0xBCA5,0xC8CF,0x0002,0xB8BC,0xB6A9,0x0004,0x0002,0xBCC6,0xDAA5,0x0001,0xDADD,0x0015,0x000A,0x0006,0x0003,0x0001, 0xDAD4,0x0001,0xD4DE,0x0001,0x0001,0xDADF,0x0007,0x0003,0x0000,0xC0BE,0x0002,0xC8C3,0xB2F7,0x0001,0x0001,0xF6C5, 0x0005,0x0000,0x0001,0x0001,0xB1E4,0x0001,0x0000,0x0001,0xB6C1,0x0022,0x0012,0x0008,0x0004,0x0000,0x0000,0xD3FE, 0x0001,0x0000,0xBBA4,0x0004,0x0000,0x0001,0xC7B4,0x0003,0x0001,0xD2E9,0x0000,0xD2EB,0x000B,0x0007,0x0004,0x0002, 0xBBD9,0xC6A9,0x0000,0xDADE,0x0001,0x0001,0xBEAF,0x0001,0x0001,0x0000,0xD4EB,0x0013,0x000D,0x0006,0x0003,0x0001, 0xC6D7,0x0001,0xCCB7,0x0004,0x0002,0xDADB,0xCAB6,0x0001,0xDADA,0x0001,0x0001,0x0002,0xBCA5,0xDADC,0x0007,0x0001, 0x0003,0x0000,0xD6A4,0x0001,0xCEFB,0x0001,0x0003,0x0000,0xBBA9,0x0001,0xC3A1,0x009F,0x0047,0x001B,0x000A,0x0005, 0x0001,0x0000,0x0001,0xBDF7,0x0000,0x0001,0x0001,0xDAA9,0x0009,0x0005,0x0001,0x0002,0xC3FD,0xDAD8,0x0001,0x0000, 0xDAD3,0x0004,0x0000,0x0000,0xF6A5,0x0001,0x0000,0xD2A5,0x0015,0x000D,0x0006,0x0003,0x0001,0xD0BB,0x0001,0xBDB2, 0x0004,0x0002,0xDAD6,0xC7AB,0x0001,0xB0F9,0x0004,0x0001,0x0000,0xDACA,0x0001,0x0000,0xDAD7,0x000A,0x0004,0x0000, 0x0000,0xC3D5,0x0003,0x0000,0xBBD1,0x0001,0xE5C0,0x0006,0x0003,0x0001,0xD6DF,0x0000,0xCCDC,0x0004,0x0002,0xCEBD, 0xDACB,0x0000,0xC4B1,0x002C,0x0017,0x000D,0x0006,0x0003,0x0000,0xC5B5,0x0000,0xDACE,0x0003,0x0000,0xD1E8,0x0002, 0xD6EE,0xB7ED,0x0006,0x0003,0x0000,0xDAC8,0x0001,0xDACF,0x0000,0x0001,0xBBE4,0x000B,0x0007,0x0004,0x0002,0xDAD1, 0xDACD,0x0001,0xDAC9,0x0001,0x0001,0xD0B3,0x0006,0x0003,0x0000,0xDAD0,0x0000,0xDACC,0x0000,0x0000,0xDABB,0x0016, 0x000B,0x0007,0x0003,0x0000,0xDAD2,0x0002,0xB5FD,0xDAC4,0x0001,0x0001,0xDAC5,0x0004,0x0000,0x0000,0xC2DB,0x0004, 0x0002,0xC1C2,0xDAC2,0x0001,0xDAC1,0x000C,0x0006,0x0003,0x0001,0xDABA,0x0001,0xC7EB,0x0003,0x0001,0xDAC3,0x0001, 0xCCB8,0x0004,0x0001,0x0000,0xD7BB,0x0003,0x0000,0xDAC6,0x0001,0xB5F7,0x0058,0x0027,0x0012,0x0008,0x0004,0x0001, 0x0000,0xD2EA,0x0000,0x0001,0xB7CC,0x0004,0x0000,0x0000,0xDAC7,0x0003,0x0000,0xBFCE,0x0000,0xCBAD,0x0007,0x0001, 0x0003,0x0000,0xCBB5,0x0000,0xBBE5,0x0008,0x0004,0x0002,0xCBD0,0xDABE,0x0002,0xCEF3,0xCEDC,0x0003,0x0001,0xBDEB, 0x0000,0xB3CF,0x0016,0x000A,0x0004,0x0000,0x0000,0xD3EF,0x0003,0x0000,0xDABD,0x0000,0xD3D5,0x0007,0x0004,0x0002, 0xE3A3,0xB5AE,0x0001,0xCAC4,0x0000,0x0002,0xDAC0,0xDABF,0x000D,0x0006,0x0003,0x0001,0xC8CF,0x0000,0xD6BE,0x0004, 0x0002,0xCCDC,0xD3FE,0x0001,0xBFE4,0x0008,0x0004,0x0002,0xDAB2,0xD6EF,0x0002,0xDAB3,0xB6DF,0x0003,0x0000,0xD9AC, 0x0001,0xDAB4,0x002F,0x0016,0x0008,0x0004,0x0001,0x0000,0xDAB6,0x0000,0x0001,0xD5B2,0x0007,0x0004,0x0002,0xB3EA, 0xDAB7,0x0001,0xCFEA,0x0004,0x0002,0xB8C3,0xBBB0,0x0000,0xDAB5,0x000C,0x0008,0x0004,0x0002,0xDAB9,0xB9EE,0x0002, 0xDAB8,0xB2EF,0x0000,0x0001,0xCAAB,0x0006,0x0003,0x0000,0xCAD4,0x0001,0xD2E8,0x0004,0x0002,0xD1AF,0xDABC,0x0000, 0xD3BD,0x0016,0x000A,0x0006,0x0003,0x0000,0xB4CA,0x0001,0xD7E7,0x0001,0x0000,0xDAB0,0x0006,0x0003,0x0001,0xC6C0, 0x0000,0xDAAF,0x0003,0x0000,0xDAB1,0x0000,0xD5A9,0x0008,0x0004,0x0000,0x0000,0xDAAA,0x0001,0x0000,0xEEBA,0x0004, 0x0000,0x0000,0xDAAE,0x0003,0x0001,0xDAAC,0x0001,0xF6A4,0x0133,0x00AF,0x0058,0x0028,0x0014,0x000A,0x0005,0x0002, 0xF6A4,0x0001,0xD6A4,0x0000,0x0002,0xD7A2,0xD5EF,0x0006,0x0003,0x0001,0xDAAD,0x0001,0xCBDF,0x0001,0x0000,0xD0ED, 0x0009,0x0005,0x0001,0x0002,0xC9E8,0xB3B3,0x0000,0x0001,0xB7C3,0x0006,0x0003,0x0000,0xD3C8,0x0000,0xDAAB,0x0000, 0x0002,0xBEF7,0xD0C0,0x0019,0x000C,0x0006,0x0003,0x0000,0xCBCF,0x0000,0xD1C8,0x0003,0x0000,0xB6EF,0x0001,0xBCC7, 0x0007,0x0004,0x0002,0xCDD0,0xC6FD,0x0000,0xDAA8,0x0003,0x0000,0xD1B5,0x0001,0xDAA6,0x000C,0x0006,0x0003,0x0001, 0xCCD6,0x0001,0xDAA7,0x0003,0x0001,0xD1B6,0x0001,0xBCC6,0x0004,0x0000,0x0000,0xD9EA,0x0004,0x0002,0xB8BC,0xB6A9, 0x0001,0xD1D4,0x001F,0x000D,0x0005,0x0001,0x0001,0x0001,0xB4A5,0x0004,0x0001,0x0001,0xF5FC,0x0000,0x0000,0xECB2, 0x0008,0x0004,0x0000,0x0000,0xF6A3,0x0000,0x0000,0xF6A2,0x0006,0x0003,0x0001,0xB4A5,0x0000,0xF6A1,0x0000,0x0000, 0xBDE2,0x001A,0x000C,0x0008,0x0004,0x0002,0xE2B3,0xF5FC,0x0002,0xB5D6,0xF5FE,0x0000,0x0001,0xF5FD,0x0007,0x0003, 0x0001,0xF5FB,0x0002,0xB4D6,0xBDEF,0x0003,0x0001,0xBDC7,0x0002,0xEAEF,0xEAEE,0x000F,0x0007,0x0004,0x0002,0xEAED, 0xEAEC,0x0001,0xEAEB,0x0004,0x0002,0xEAEA,0xEAE9,0x0002,0xBEF5,0xC0C0,0x0008,0x0004,0x0002,0xEAE8,0xCAD3,0x0002, 0xC3D9,0xB9E6,0x0003,0x0001,0xB9DB,0x0002,0xBCFB,0xB9DB,0x0049,0x0024,0x0012,0x000A,0x0006,0x0003,0x0000,0xEAEB, 0x0000,0xC0C0,0x0000,0x0001,0xBEF5,0x0004,0x0000,0x0000,0xEAEF,0x0000,0x0001,0xEAEE,0x000A,0x0006,0x0003,0x0000, 0xEAED,0x0001,0xEAE9,0x0000,0x0001,0xC7D7,0x0004,0x0000,0x0001,0xEAEC,0x0001,0x0000,0xEAEA,0x0012,0x0007,0x0001, 0x0003,0x0000,0xC3D9,0x0001,0xEAE8,0x0007,0x0004,0x0002,0xCBC5,0xCAD3,0x0000,0xC6B3,0x0000,0x0000,0xC3D9,0x0008, 0x0004,0x0000,0x0000,0xB9E6,0x0000,0x0000,0xBCFB,0x0004,0x0000,0x0001,0xB8B2,0x0004,0x0002,0xF1FB,0xB7A6,0x0000, 0xD2AA,0x0021,0x000D,0x0008,0x0004,0x0000,0x0000,0xCEF7,0x0000,0x0000,0xF1E1,0x0001,0x0000,0x0001,0xCFAE,0x000A, 0x0006,0x0003,0x0000,0xB3C4,0x0001,0xB0DA,0x0000,0x0001,0xCDE0,0x0006,0x0003,0x0001,0xF1E0,0x0001,0xF1DC,0x0001, 0x0001,0xF1C9,0x000D,0x0008,0x0000,0x0004,0x0002,0xBDF3,0xF4C5,0x0000,0xF1CF,0x0000,0x0000,0x0001,0xB0C0,0x0005, 0x0001,0x0001,0x0000,0xF1D0,0x0004,0x0001,0x0001,0xCFE5,0x0001,0x0000,0xF1DF,0x0095,0x003F,0x0022,0x0014,0x0007, 0x0001,0x0003,0x0000,0xD9F4,0x0001,0xF1DA,0x0006,0x0003,0x0001,0xF1DE,0x0001,0xF1DC,0x0004,0x0002,0xF1CD,0xBFE3, 0x0001,0xE5BD,0x0006,0x0001,0x0000,0x0002,0xF1DD,0xCDCA,0x0004,0x0001,0x0000,0xC8EC,0x0001,0x0000,0xF1D7,0x0010, 0x0008,0x0001,0x0004,0x0002,0xF1DA,0xF1D2,0x0000,0xF1D8,0x0001,0x0004,0x0002,0xF1D9,0xB0FD,0x0001,0xBAD6,0x0005, 0x0001,0x0000,0x0001,0xF1DB,0x0004,0x0000,0x0000,0xB8B4,0x0000,0x0001,0xB9D3,0x002A,0x0019,0x000C,0x0007,0x0003, 0x0001,0xF1D5,0x0002,0xD6C6,0xF1D3,0x0001,0x0002,0xB9FC,0xC2E3,0x0006,0x0003,0x0000,0xD9F2,0x0001,0xC5E1,0x0003, 0x0000,0xC9D1,0x0002,0xF1D1,0xF1D6,0x0005,0x0001,0x0001,0x0001,0xF1D4,0x0005,0x0001,0x0002,0xF1D0,0xBFE3,0x0004, 0x0002,0xF1CF,0xF1CD,0x0000,0xC0EF,0x0015,0x000C,0x0007,0x0003,0x0000,0xF4C4,0x0002,0xD7B0,0xB2B9,0x0001,0x0002, 0xC8B9,0xF4C3,0x0005,0x0001,0x0002,0xD4A3,0xD2E1,0x0000,0x0001,0xD9F6,0x000A,0x0004,0x0000,0x0001,0xF1CE,0x0003, 0x0001,0xF4C1,0x0000,0xF1CC,0x0006,0x0003,0x0001,0xF1C9,0x0000,0xD7B0,0x0003,0x0001,0xC1D1,0x0002,0xB2C3,0xD2F0, 0x0043,0x001D,0x000D,0x0005,0x0000,0x0001,0x0001,0xF1CB,0x0004,0x0000,0x0000,0xF1CA,0x0001,0x0000,0xB8A4,0x0008, 0x0004,0x0001,0x0000,0xCFAE,0x0000,0x0000,0xB1BB,0x0004,0x0001,0x0001,0xD9F3,0x0000,0x0001,0xF1C8,0x0011,0x0008, 0x0000,0x0004,0x0002,0xE0F9,0xD9F2,0x0001,0xCDE0,0x0005,0x0000,0x0002,0xD5E4,0xD0E4,0x0000,0x0001,0xCCBB,0x000A, 0x0004,0x0001,0x0000,0xC5DB,0x0003,0x0000,0xB4FC,0x0001,0xF4C2,0x0005,0x0001,0x0002,0xF4C1,0xB0C0,0x0003,0x0001, 0xF1C7,0x0000,0xD4AC,0x002F,0x0016,0x000B,0x0007,0x0004,0x0002,0xF1C6,0xF4C0,0x0000,0xF1C5,0x0001,0x0000,0xD6BB, 0x0005,0x0000,0x0002,0xD6D4,0xB3E5,0x0003,0x0001,0xF1C4,0x0001,0xCBA5,0x000D,0x0006,0x0003,0x0001,0xD9F2,0x0001, 0xB3C4,0x0003,0x0000,0xC9C0,0x0002,0xF1C3,0xB1ED,0x0005,0x0001,0x0002,0xB2B9,0xF1C2,0x0004,0x0002,0xD2C2,0xE1E9, 0x0000,0xBAE2,0x0016,0x000A,0x0004,0x0001,0x0000,0xB3E5,0x0003,0x0000,0xCEC0,0x0000,0xD1C3,0x0008,0x0004,0x0002, 0xBDD6,0xC5AA,0x0002,0xCDAC,0xCFCE,0x0000,0x0000,0xCAF5,0x000B,0x0007,0x0003,0x0001,0xD9A9,0x0002,0xD1DC,0xD0D0, 0x0000,0x0001,0xC3EF,0x0005,0x0001,0x0002,0xD0C6,0xF4AC,0x0001,0x0001,0xD1AA,0x04AA,0x0272,0x0121,0x0088,0x0041, 0x001A,0x0011,0x0008,0x0001,0x0004,0x0002,0xF3BD,0xC2F9,0x0001,0xF3BC,0x0004,0x0001,0x0000,0xB2CF,0x0001,0x0002, 0xEEC3,0xB9C6,0x0001,0x0001,0x0003,0x0001,0xF2C3,0x0002,0xB4C0,0xF3BB,0x0014,0x0008,0x0004,0x0000,0x0001,0xC0AF, 0x0000,0x0001,0xF3BA,0x0005,0x0001,0x0002,0xF3B6,0xC8E4,0x0004,0x0002,0xF2BA,0xF3B7,0x0001,0xF2EE,0x000A,0x0006, 0x0003,0x0000,0xF2D3,0x0001,0xD0AB,0x0001,0x0000,0xF3B9,0x0005,0x0001,0x0002,0xF2B2,0xD3AC,0x0000,0x0001,0xD9F9, 0x0026,0x0012,0x000A,0x0004,0x0001,0x0000,0xF3B8,0x0003,0x0001,0xD2CF,0x0001,0xD0B7,0x0004,0x0001,0x0000,0xF2C9, 0x0001,0x0000,0xB3E6,0x000C,0x0006,0x0003,0x0001,0xF2CD,0x0000,0xF3B5,0x0003,0x0000,0xB2F5,0x0000,0xF3B3,0x0004, 0x0001,0x0001,0xF3A8,0x0000,0x0001,0xF2B1,0x0010,0x0008,0x0004,0x0000,0x0000,0xF3B4,0x0000,0x0001,0xF3B2,0x0001, 0x0003,0x0001,0xF3AD,0x0002,0xF2FE,0xF3AF,0x0007,0x0001,0x0003,0x0001,0xF3AC,0x0000,0xF3B1,0x0006,0x0003,0x0000, 0xF2E5,0x0000,0xF3A1,0x0000,0x0000,0xD5DD,0x004B,0x0027,0x0014,0x000C,0x0006,0x0003,0x0000,0xF3B0,0x0001,0xF3AE, 0x0003,0x0001,0xF2F7,0x0000,0xC2DD,0x0004,0x0001,0x0001,0xF3AA,0x0000,0x0001,0xF3AB,0x000B,0x0006,0x0003,0x0001, 0xF2FC,0x0001,0xF3A4,0x0000,0x0002,0xF3A9,0xF3A7,0x0004,0x0000,0x0000,0xF2FD,0x0001,0x0000,0xD3A9,0x000F,0x0007, 0x0000,0x0003,0x0001,0xC3F8,0x0000,0xC2EC,0x0004,0x0000,0x0001,0xF3A5,0x0000,0x0001,0xF2FB,0x0008,0x0004,0x0001, 0x0001,0xC8DA,0x0000,0x0001,0xF2F4,0x0006,0x0003,0x0000,0xF3A2,0x0001,0xF3A3,0x0004,0x0002,0xF2CF,0xF3A6,0x0000, 0xF2EB,0x0027,0x0014,0x000A,0x0005,0x0001,0x0002,0xF2EE,0xF2ED,0x0000,0x0002,0xF2F7,0xF2EF,0x0006,0x0003,0x0000, 0xCECF,0x0000,0xB5FB,0x0000,0x0000,0xBAFB,0x0007,0x0000,0x0003,0x0000,0xF2F1,0x0000,0xF2F3,0x0007,0x0003,0x0000, 0xCAAD,0x0002,0xCFBA,0xF2FA,0x0000,0x0002,0xF2F8,0xF2F6,0x0012,0x0008,0x0004,0x0000,0x0000,0xF2F0,0x0001,0x0001, 0xF2F9,0x0006,0x0003,0x0001,0xBBC8,0x0001,0xCAB4,0x0000,0x0001,0xF2F5,0x000A,0x0004,0x0001,0x0000,0xD0AB,0x0003, 0x0000,0xF2F2,0x0001,0xB2F5,0x0007,0x0004,0x0002,0xF2E5,0xD3AC,0x0000,0xF2D5,0x0000,0x0001,0xBAE7,0x00AE,0x0059, 0x0026,0x0012,0x000A,0x0005,0x0001,0x0002,0xF2EA,0xF2E4,0x0001,0x0002,0xF2DF,0xC4DE,0x0004,0x0001,0x0000,0xF2E9, 0x0000,0x0001,0xF2E6,0x0007,0x0000,0x0003,0x0000,0xF2E7,0x0001,0xF2E2,0x0005,0x0000,0x0002,0xF2E8,0xB5FB,0x0004, 0x0002,0xF2E1,0xF2E1,0x0002,0xF2DE,0xF2EC,0x0019,0x000C,0x0006,0x0003,0x0000,0xC0AF,0x0001,0xF2E0,0x0003,0x0001, 0xC3DB,0x0001,0xF2E3,0x0006,0x0003,0x0001,0xD6A9,0x0000,0xCECF,0x0003,0x0000,0xCDC9,0x0002,0xF2D1,0xD1D1,0x000B, 0x0004,0x0000,0x0000,0xD1D1,0x0003,0x0000,0xF2DC,0x0002,0xF2EB,0xF2DB,0x0008,0x0004,0x0002,0xF2DD,0xF2DA,0x0002, 0xF2D8,0xF2B9,0x0003,0x0001,0xF2D7,0x0002,0xF2D7,0xB7E4,0x002B,0x0017,0x000B,0x0006,0x0003,0x0001,0xCAF1,0x0001, 0xB6EA,0x0001,0x0002,0xCDC9,0xF2CC,0x0005,0x0000,0x0002,0xD3BC,0xF2D9,0x0003,0x0001,0xF2D3,0x0002,0xF2CF,0xF2CD, 0x000C,0x0007,0x0004,0x0002,0xF2CC,0xD5DD,0x0001,0xC2F9,0x0000,0x0002,0xF2CE,0xF2CB,0x0004,0x0000,0x0000,0xF2CB, 0x0000,0x0001,0xB8F2,0x0012,0x0009,0x0005,0x0001,0x0002,0xF2D4,0xF2D2,0x0001,0x0000,0xD6EB,0x0005,0x0000,0x0002, 0xCDDC,0xF2D5,0x0000,0x0001,0xBBD7,0x000D,0x0008,0x0004,0x0002,0xF2D6,0xF2D0,0x0002,0xF2C9,0xF2C3,0x0001,0x0002, 0xB5B0,0xB9C6,0x0007,0x0003,0x0000,0xF2C8,0x0002,0xC9DF,0xC7F9,0x0000,0x0001,0xF2C1,0x0050,0x002D,0x0013,0x000A, 0x0004,0x0000,0x0001,0xD6FB,0x0003,0x0001,0xBED4,0x0001,0xF2C5,0x0004,0x0001,0x0001,0xF2C0,0x0000,0x0002,0xF2C2, 0xF2CA,0x000D,0x0007,0x0004,0x0002,0xF2C6,0xF2C4,0x0000,0xF2C7,0x0003,0x0001,0xF2B9,0x0001,0xF2BD,0x0007,0x0004, 0x0002,0xF2BF,0xF2B6,0x0000,0xF2BB,0x0003,0x0001,0xD4E9,0x0000,0xF2BC,0x0015,0x0009,0x0004,0x0000,0x0000,0xF7F7, 0x0000,0x0002,0xF2BA,0xD1C1,0x0006,0x0003,0x0001,0xBBD7,0x0001,0xF2B3,0x0003,0x0000,0xB2CF,0x0000,0xF2BE,0x0009, 0x0001,0x0004,0x0002,0xF2B7,0xB0F6,0x0002,0xF2B8,0xCEC3,0x0001,0x0001,0x0001,0xC2EC,0x002F,0x001A,0x0010,0x0008, 0x0004,0x0002,0xD2CF,0xCAB4,0x0002,0xF2B2,0xCFBA,0x0004,0x0002,0xCBE4,0xF2B4,0x0002,0xF2B5,0xF2B3,0x0006,0x0003, 0x0000,0xBAE7,0x0000,0xB8C9,0x0000,0x0001,0xF2C6,0x000D,0x0007,0x0003,0x0000,0xCAAD,0x0002,0xF2B0,0xF2B1,0x0003, 0x0001,0xF2B0,0x0000,0xB3E6,0x0004,0x0001,0x0000,0xBFF7,0x0001,0x0001,0xEBBD,0x0017,0x000C,0x0005,0x0001,0x0002, 0xBAC5,0xD3DD,0x0003,0x0001,0xC2B2,0x0002,0xD0E9,0xD0E9,0x0006,0x0003,0x0000,0xB7FC,0x0001,0xBAF5,0x0000,0x0002, 0xB4A6,0xF2AF,0x0000,0x0008,0x0004,0x0002,0xC2C7,0xC5B0,0x0002,0xC2B2,0xBBA2,0x0000,0x0000,0xF2AE,0x0112,0x007E, 0x0042,0x001B,0x000F,0x0008,0x0004,0x0001,0x0001,0xC2DC,0x0001,0x0000,0xDEC2,0x0000,0x0003,0x0000,0xDDF1,0x0000, 0xD5BA,0x0005,0x0001,0x0000,0x0001,0xC0BC,0x0000,0x0003,0x0001,0xDEC0,0x0001,0xDEBE,0x0012,0x0008,0x0004,0x0000, 0x0000,0xDCD7,0x0000,0x0000,0xDDFC,0x0006,0x0003,0x0000,0xDEBA,0x0001,0xE9DE,0x0000,0x0000,0xDEC1,0x0008,0x0004, 0x0000,0x0001,0xC4A2,0x0001,0x0001,0xC6BB,0x0006,0x0003,0x0000,0xD4CC,0x0001,0xCBD5,0x0004,0x0002,0xC2AB,0xDEBF, 0x0000,0xDEAD,0x001F,0x0013,0x0008,0x0004,0x0001,0x0001,0xDEBD,0x0001,0x0001,0xD4E5,0x0007,0x0004,0x0002,0xDDFE, 0xB0AA,0x0001,0xCAED,0x0000,0x0000,0xDCC2,0x0001,0x0005,0x0000,0x0002,0xDEB4,0xB7AA,0x0003,0x0001,0xD2A9,0x0000, 0xCCD9,0x000E,0x0007,0x0001,0x0003,0x0001,0xD2D5,0x0000,0xDEBC,0x0001,0x0003,0x0001,0xC5BA,0x0001,0xDEBA,0x000A, 0x0005,0x0001,0x0002,0xC3EA,0xB2D8,0x0000,0x0002,0xDDA3,0xC0B6,0x0000,0x0000,0x0001,0xBDE5,0x0048,0x0023,0x000D, 0x0005,0x0000,0x0000,0x0001,0xDEBB,0x0000,0x0004,0x0002,0xDCF9,0xDEB7,0x0001,0xDEB8,0x0009,0x0005,0x0001,0x0002, 0xDEB9,0xCAED,0x0000,0x0000,0xDEB4,0x0007,0x0004,0x0002,0xD0BD,0xC8F8,0x0000,0xDEB0,0x0003,0x0000,0xBCF6,0x0000, 0xDEAF,0x000E,0x0009,0x0004,0x0001,0x0001,0xDDB2,0x0001,0x0002,0xDEB5,0xD1A6,0x0001,0x0001,0x0000,0xC7BE,0x000A, 0x0006,0x0003,0x0001,0xBDAA,0x0001,0xDEB2,0x0001,0x0000,0xDCBC,0x0007,0x0003,0x0000,0xBCBB,0x0002,0xDCF6,0xDEB1, 0x0003,0x0001,0xDEB6,0x0000,0xB1A1,0x0025,0x0012,0x0007,0x0001,0x0003,0x0000,0xC0D9,0x0001,0xDEAE,0x0007,0x0004, 0x0002,0xDEAA,0xDEB3,0x0001,0xDDF7,0x0001,0x0000,0xD4CC,0x0008,0x0004,0x0000,0x0000,0xDEAD,0x0000,0x0001,0xCFF4, 0x0007,0x0004,0x0002,0xCEDF,0xB5B4,0x0000,0xDEA7,0x0001,0x0000,0xDEA8,0x0015,0x0008,0x0004,0x0000,0x0000,0xDDDE, 0x0000,0x0000,0xDEA9,0x0006,0x0003,0x0001,0xDEA5,0x0000,0xDCE9,0x0004,0x0002,0xDEA1,0xDDB5,0x0001,0xDCBF,0x0005, 0x0001,0x0000,0x0000,0xDCF1,0x0007,0x0004,0x0002,0xC8EF,0xBDB6,0x0000,0xDEA6,0x0003,0x0000,0xDDDB,0x0001,0xDEAC, 0x008C,0x0042,0x0024,0x0014,0x000B,0x0004,0x0000,0x0001,0xDDA1,0x0003,0x0001,0xB1CE,0x0002,0xB0AA,0xDEA2,0x0000, 0x0004,0x0002,0xDDFE,0xDDFC,0x0002,0xDDFA,0xC7BE,0x0008,0x0001,0x0003,0x0001,0xD2F1,0x0002,0xCADF,0xC4E8,0x0001, 0x0004,0x0002,0xDCE0,0xB4D0,0x0001,0xBDAF,0x0015,0x000A,0x0006,0x0003,0x0001,0xB2CC,0x0001,0xDDFD,0x0000,0x0000, 0xDDE4,0x0006,0x0003,0x0000,0xCEB5,0x0001,0xD5E1,0x0001,0x0002,0xB2B7,0xC2FB,0x0000,0x0004,0x0000,0x0001,0xC3EF, 0x0001,0x0000,0xDDF8,0x0020,0x000B,0x0000,0x0004,0x0001,0x0001,0xDEA3,0x0003,0x0001,0xDCEA,0x0000,0xDEA4,0x000D, 0x0007,0x0003,0x0001,0xC6C1,0x0002,0xDDFB,0xDCCA,0x0003,0x0000,0xC1AB,0x0000,0xC5EE,0x0001,0x0004,0x0002,0xDDEB, 0xDDF6,0x0001,0xDDF7,0x0013,0x0009,0x0005,0x0001,0x0002,0xDDF1,0xBCBB,0x0000,0x0001,0xC0B6,0x0004,0x0001,0x0001, 0xDDFB,0x0003,0x0000,0xB1CD,0x0001,0xDDED,0x000C,0x0006,0x0003,0x0001,0xCBF2,0x0000,0xDDEA,0x0003,0x0001,0xDDE9, 0x0001,0xB8C7,0x0005,0x0000,0x0002,0xDDEE,0xC8D8,0x0003,0x0000,0xCFAF,0x0000,0xD0EE,0x004D,0x0026,0x0018,0x000D, 0x0007,0x0003,0x0001,0xDDE8,0x0002,0xDDA5,0xDDEF,0x0003,0x0001,0xDDEC,0x0000,0xB2D4,0x0007,0x0004,0x0002,0xDDF0, 0xDDF3,0x0000,0xD5F4,0x0001,0x0000,0xDDF4,0x0008,0x0000,0x0004,0x0002,0xC6D1,0xC6D1,0x0001,0xD8E1,0x0000,0x0001, 0x0002,0xDCE7,0xB5E3,0x0014,0x000A,0x0004,0x0000,0x0001,0xDDF2,0x0003,0x0000,0xDDB0,0x0000,0xCBE2,0x0006,0x0003, 0x0001,0xC3C9,0x0001,0xDDF5,0x0001,0x0000,0xDDAA,0x000B,0x0004,0x0001,0x0000,0xCBD1,0x0003,0x0000,0xDDE5,0x0002, 0xDDE4,0xBDAF,0x0000,0x0003,0x0001,0xDDDE,0x0002,0xDDDC,0xDDDB,0x002B,0x0013,0x0005,0x0000,0x0000,0x0000,0xB5D9, 0x0007,0x0003,0x0000,0xDDDD,0x0002,0xDDDF,0xBBE7,0x0004,0x0002,0xDDE3,0xBFFB,0x0001,0xDDDA,0x000E,0x0007,0x0003, 0x0001,0xB4D0,0x0002,0xDDB4,0xD2A9,0x0003,0x0001,0xDDE7,0x0002,0xD4E1,0xBAF9,0x0004,0x0000,0x0001,0xDDE2,0x0003, 0x0000,0xCEAD,0x0001,0xB6AD,0x0013,0x000B,0x0006,0x0003,0x0001,0xC6CF,0x0000,0xB2CE,0x0001,0x0002,0xDDD6,0xB8F0, 0x0000,0x0004,0x0002,0xDDD8,0xDDD9,0x0001,0xD7C5,0x0006,0x0000,0x0000,0x0002,0xDDA6,0xDDD7,0x0004,0x0000,0x0001, 0xD2B6,0x0000,0x0002,0xDDE1,0xDDCF,0x02D3,0x015C,0x00A3,0x004D,0x0026,0x000E,0x0006,0x0001,0x0001,0x0002,0xC2E4, 0xDDE0,0x0004,0x0001,0x0001,0xDDC7,0x0001,0x0000,0xDDAB,0x000B,0x0006,0x0003,0x0001,0xDDE6,0x0000,0xDDE6,0x0001, 0x0002,0xBED8,0xCDF2,0x0005,0x0001,0x0002,0xE9B1,0xC8F8,0x0004,0x0002,0xCFF4,0xDDD3,0x0002,0xD3AA,0xD3A9,0x000B, 0x0006,0x0001,0x0001,0x0002,0xC2DC,0xDDC6,0x0000,0x0001,0x0001,0xDDC1,0x000E,0x0006,0x0003,0x0000,0xDDE6,0x0000, 0xDDC8,0x0004,0x0002,0xDDCC,0xCEAE,0x0002,0xC6BC,0xC3C8,0x0007,0x0004,0x0002,0xDDC2,0xC0B3,0x0000,0xDDCA,0x0004, 0x0002,0xDCC9,0xDDC9,0x0001,0xCCD1,0x0029,0x0013,0x000A,0x0006,0x0003,0x0000,0xDDCD,0x0000,0xDDBD,0x0001,0x0000, 0xDDC4,0x0005,0x0001,0x0002,0xDDCF,0xDDCE,0x0001,0x0001,0xE2D6,0x000B,0x0007,0x0003,0x0001,0xB7C6,0x0002,0xC1E2, 0xDDD4,0x0000,0x0000,0xBBAA,0x0007,0x0004,0x0002,0xBDF6,0xDDD0,0x0000,0xC6D0,0x0001,0x0000,0xDDBE,0x0016,0x000C, 0x0005,0x0001,0x0002,0xDDD5,0xB2A4,0x0003,0x0000,0xDDCB,0x0002,0xDDC3,0xB2CB,0x0004,0x0001,0x0001,0xDDBF,0x0003, 0x0001,0xDDC5,0x0001,0xDDCA,0x000B,0x0004,0x0001,0x0000,0xD4D6,0x0004,0x0002,0xBACA,0xE7FB,0x0001,0xBEFA,0x0006, 0x0003,0x0001,0xBED5,0x0000,0xC2CC,0x0003,0x0000,0xB9BD,0x0000,0xDDD1,0x005C,0x0031,0x001A,0x000C,0x0005,0x0001, 0x0002,0xDDBC,0xDDD2,0x0003,0x0000,0xB4CC,0x0002,0xC3A7,0xDDBB,0x0007,0x0003,0x0001,0xDDBA,0x0002,0xD3A8,0xDDB5, 0x0004,0x0002,0xBBF1,0xDDB2,0x0001,0xDDAB,0x0009,0x0000,0x0004,0x0002,0xDDAA,0xC1AB,0x0002,0xC0B3,0xDDA8,0x0008, 0x0004,0x0002,0xC4AA,0xDDAD,0x0002,0xDDB3,0xDDB9,0x0003,0x0000,0xDCC8,0x0001,0xDDB5,0x0016,0x000C,0x0006,0x0003, 0x0001,0xBCD4,0x0001,0xDDAC,0x0003,0x0001,0xDDB8,0x0001,0xDDAF,0x0006,0x0003,0x0000,0xDCF0,0x0001,0xDDB7,0x0000, 0x0001,0xBEA5,0x0009,0x0005,0x0000,0x0002,0xDDAE,0xDCEC,0x0000,0x0001,0xC9AF,0x0006,0x0003,0x0001,0xD7AF,0x0000, 0xC0F2,0x0003,0x0001,0xC6CE,0x0000,0xDDB0,0x002C,0x0010,0x0006,0x0001,0x0001,0x0002,0xDDB4,0xDDB1,0x0006,0x0003, 0x0000,0xDDB6,0x0001,0xDDA9,0x0000,0x0000,0xBAC9,0x000C,0x0004,0x0000,0x0000,0xB6B9,0x0004,0x0002,0xD2A9,0xDDA7, 0x0002,0xDDA6,0xDDA4,0x0008,0x0004,0x0002,0xD2F1,0xDDA5,0x0002,0xDDA3,0xDDA1,0x0004,0x0002,0xD3AB,0xDCFD,0x0002, 0xDCFE,0xBBE7,0x0017,0x000E,0x0007,0x0003,0x0000,0xC8D9,0x0002,0xB5B4,0xDCF9,0x0004,0x0002,0xDCF6,0xDCF1,0x0001, 0xDCEA,0x0005,0x0000,0x0002,0xDCE9,0xBCD4,0x0001,0x0001,0xC0F3,0x000D,0x0007,0x0003,0x0001,0xBBC4,0x0002,0xDCE8, 0xBCF6,0x0003,0x0000,0xDCF3,0x0000,0xDCF1,0x0006,0x0003,0x0001,0xBEA3,0x0000,0xB2DD,0x0004,0x0002,0xDCF4,0xBEA3, 0x0000,0xB4F0,0x00C0,0x005F,0x0032,0x001A,0x000B,0x0007,0x0004,0x0002,0xDCF5,0xBBAA,0x0001,0xDCF7,0x0001,0x0001, 0xDCED,0x0007,0x0003,0x0001,0xDCFB,0x0002,0xC8E3,0xC8D7,0x0004,0x0002,0xECB7,0xB2E8,0x0002,0xD2F0,0xDCEE,0x000E, 0x0007,0x0004,0x0002,0xDCFC,0xD7C8,0x0000,0xDCEF,0x0003,0x0000,0xDCF2,0x0002,0xDCFA,0xB2E7,0x0006,0x0003,0x0000, 0xC3A3,0x0001,0xB4C4,0x0000,0x0000,0xBCEB,0x0014,0x0008,0x0004,0x0001,0x0001,0xDEB6,0x0001,0x0001,0xDCE7,0x0005, 0x0000,0x0002,0xDDA2,0xDCE1,0x0003,0x0000,0xDCF8,0x0002,0xDCE4,0xDCE3,0x000C,0x0004,0x0001,0x0000,0xDCE0,0x0004, 0x0002,0xDCD7,0xBEA5,0x0002,0xB9B6,0xDCDD,0x0005,0x0001,0x0002,0xDCD4,0xDCEB,0x0004,0x0002,0xDCD8,0xDCE2,0x0002, 0xC3A9,0xC7D1,0x002A,0x0016,0x0009,0x0000,0x0004,0x0002,0xB7B6,0xC3AF,0x0002,0xD7C2,0xB8A3,0x0007,0x0004,0x0002, 0xDCDE,0xDDAE,0x0000,0xC6BB,0x0003,0x0000,0xDCD5,0x0001,0xDCDA,0x0008,0x0004,0x0001,0x0000,0xD3A2,0x0000,0x0000, 0xB1BD,0x0004,0x0000,0x0000,0xC9BB,0x0004,0x0002,0xDCD1,0xBFE0,0x0002,0xC8F4,0xDCD6,0x001B,0x000E,0x0007,0x0003, 0x0000,0xDCC4,0x0002,0xDCD3,0xDCE5,0x0004,0x0002,0xB9B6,0xB0FA,0x0001,0xDCD9,0x0006,0x0003,0x0000,0xBFC1,0x0001, 0xDCDC,0x0003,0x0000,0xC3E7,0x0002,0xDCE6,0xCCA6,0x000F,0x0007,0x0004,0x0002,0xDCDF,0xDCDB,0x0000,0xD4B7,0x0004, 0x0002,0xCBD5,0xDCD1,0x0002,0xB2D4,0xDCC9,0x0007,0x0004,0x0002,0xDCC8,0xDCC3,0x0001,0xDCC2,0x0003,0x0000,0xCEAD, 0x0001,0xDCD0,0x0066,0x0038,0x001A,0x000D,0x0006,0x0003,0x0000,0xDCD8,0x0000,0xDCCA,0x0003,0x0001,0xDCC0,0x0002, 0xD1BF,0xC3AB,0x0007,0x0003,0x0000,0xDBBB,0x0002,0xC7DB,0xDCBF,0x0003,0x0000,0xDCC6,0x0001,0xDCCC,0x000F,0x0007, 0x0003,0x0000,0xB7BC,0x0002,0xBBA8,0xDCC1,0x0004,0x0002,0xD0BE,0xDCC7,0x0002,0xB0C5,0xB7D2,0x0008,0x0004,0x0002, 0xDCBE,0xDCCE,0x0002,0xDCCB,0xDCB8,0x0003,0x0001,0xC2AB,0x0002,0xBDE6,0xDCD2,0x0014,0x000B,0x0004,0x0001,0x0000, 0xDCCD,0x0003,0x0000,0xDCCF,0x0002,0xD6A5,0xCEDF,0x0005,0x0001,0x0002,0xDCBD,0xDCC5,0x0000,0x0000,0xDCBC,0x000F, 0x0008,0x0004,0x0002,0xDDA9,0xC3A2,0x0002,0xDCBB,0xDCD0,0x0004,0x0002,0xDCB6,0xDCBA,0x0000,0xC9D6,0x0007,0x0004, 0x0002,0xD3F3,0xDCB7,0x0001,0xD8C2,0x0001,0x0001,0xDCB9,0x002F,0x001A,0x000D,0x0006,0x0003,0x0001,0xBDDA,0x0001, 0xDCE6,0x0004,0x0002,0xDCB5,0xB0AC,0x0000,0xDCB4,0x0007,0x0003,0x0001,0xD2D5,0x0002,0xDCB3,0xB2DD,0x0003,0x0000, 0xD1DE,0x0001,0xE5F5,0x000D,0x0008,0x0004,0x0002,0xD1DE,0xC9AB,0x0002,0xBCE8,0xBCE8,0x0000,0x0002,0xC1BC,0xF4DE, 0x0004,0x0001,0x0001,0xF4BF,0x0000,0x0001,0xBDA2,0x0010,0x0008,0x0004,0x0000,0x0000,0xF4B5,0x0000,0x0000,0xF4BE, 0x0000,0x0003,0x0001,0xCBD2,0x0002,0xB2D5,0xCBD2,0x0005,0x0001,0x0000,0x0000,0xF4BC,0x0006,0x0003,0x0000,0xF4BB, 0x0000,0xF4BA,0x0003,0x0000,0xCDA7,0x0002,0xE4E9,0xF4B9,0x015D,0x00AE,0x005A,0x002C,0x0013,0x0005,0x0001,0x0001, 0x0000,0xF4B8,0x0006,0x0003,0x0001,0xF4B5,0x0001,0xB4AC,0x0004,0x0002,0xF4B4,0xCFCF,0x0002,0xB2B0,0xB6E6,0x000E, 0x0007,0x0004,0x0002,0xF4B7,0xF4B6,0x0001,0xB2D5,0x0004,0x0002,0xBDA2,0xF4B1,0x0001,0xF4B0,0x0007,0x0004,0x0002, 0xB0E3,0xF4B3,0x0000,0xBABD,0x0000,0x0000,0xF4B2,0x0013,0x000D,0x0007,0x0003,0x0001,0xF4AF,0x0002,0xF4AE,0xF4AD, 0x0003,0x0001,0xD6DB,0x0000,0xCEE8,0x0000,0x0000,0x0002,0xCBB4,0xE2B6,0x000C,0x0006,0x0003,0x0000,0xCCF2,0x0000, 0xCAE6,0x0003,0x0000,0xF3C2,0x0001,0xC9E1,0x0007,0x0003,0x0000,0xC9E0,0x0002,0xBEC9,0xBED9,0x0004,0x0002,0xD0CB, 0xD3EB,0x0002,0xD3DF,0xBECB,0x002F,0x0018,0x000D,0x0007,0x0003,0x0000,0xF4AA,0x0002,0xF4A9,0xF4A8,0x0003,0x0000, 0xD2A8,0x0000,0xF4A7,0x0007,0x0004,0x0002,0xBECA,0xD5E9,0x0000,0xCCA8,0x0000,0x0001,0xF1F3,0x000A,0x0005,0x0000, 0x0002,0xD6C2,0xD6C1,0x0001,0x0002,0xF4DF,0xB3F4,0x0006,0x0003,0x0000,0xF4AB,0x0000,0xD7D4,0x0004,0x0002,0xC1D9, 0xEAB0,0x0001,0xCED4,0x0013,0x000B,0x0004,0x0000,0x0001,0xB3BC,0x0004,0x0002,0xD9F5,0xD4E0,0x0001,0xC2E3,0x0004, 0x0001,0x0000,0xEBCD,0x0000,0x0000,0xC0B0,0x0007,0x0001,0x0003,0x0001,0xEBF7,0x0001,0xC6EA,0x0007,0x0003,0x0000, 0xEBFB,0x0002,0xEBFD,0xC1B3,0x0001,0x0000,0xD2DC,0x004F,0x0026,0x0016,0x000F,0x0007,0x0003,0x0001,0xD3B7,0x0002, 0xB1DB,0xECA1,0x0004,0x0002,0xCDCE,0xC5A7,0x0002,0xEBDA,0xB5A8,0x0000,0x0003,0x0001,0xEBFE,0x0000,0xE2DF,0x0005, 0x0000,0x0000,0x0001,0xC9C5,0x0005,0x0001,0x0002,0xEBFA,0xC4E5,0x0003,0x0000,0xC5F2,0x0000,0xECA2,0x0015,0x000A, 0x0004,0x0000,0x0001,0xEBF9,0x0003,0x0000,0xBDBA,0x0001,0xCFA5,0x0007,0x0004,0x0002,0xC4A4,0xCCC5,0x0000,0xB7F4, 0x0000,0x0000,0xB1EC,0x0008,0x0004,0x0001,0x0001,0xEBF7,0x0000,0x0001,0xB8E0,0x0006,0x0003,0x0000,0xF1A4,0x0000, 0xB2B2,0x0003,0x0000,0xEBF5,0x0000,0xE0BC,0x0035,0x001A,0x000E,0x0006,0x0003,0x0001,0xEBF0,0x0000,0xEBF6,0x0004, 0x0002,0xB0F2,0xCDC8,0x0002,0xCCDA,0xEBF0,0x0008,0x0004,0x0002,0xEBEF,0xC4E5,0x0002,0xCFD9,0xB8B9,0x0000,0x0000, 0xB3A6,0x000E,0x0007,0x0004,0x0002,0xEBE9,0xBDC5,0x0001,0xEBEC,0x0003,0x0000,0xD1FC,0x0002,0xC8F9,0xEBF1,0x0006, 0x0003,0x0001,0xD6D7,0x0001,0xEBEE,0x0003,0x0001,0xEBF2,0x0002,0xC4D4,0xD0C8,0x0011,0x0008,0x0004,0x0001,0x0001, 0xEBE1,0x0000,0x0000,0xEBED,0x0005,0x0001,0x0002,0xEBEB,0xEBEA,0x0001,0x0001,0xCDF3,0x000D,0x0007,0x0004,0x0002, 0xC7BB,0xEBE8,0x0001,0xB8AD,0x0003,0x0000,0xB8AF,0x0000,0xC9F6,0x0007,0x0004,0x0002,0xEBE7,0xD2B8,0x0000,0xC0B0, 0x0003,0x0000,0xEBE6,0x0000,0xCCF3,0x00B3,0x0052,0x0020,0x000F,0x0005,0x0001,0x0001,0x0000,0xC6A2,0x0004,0x0001, 0x0001,0xD5CD,0x0003,0x0000,0xC1B3,0x0000,0xEBE1,0x0009,0x0005,0x0001,0x0002,0xEBE5,0xCDD1,0x0000,0x0001,0xB8AC, 0x0000,0x0004,0x0002,0xEBE3,0xCDD1,0x0001,0xD0DE,0x0016,0x000A,0x0004,0x0000,0x0001,0xB4BD,0x0003,0x0001,0xD9F5, 0x0000,0xEBE2,0x0006,0x0003,0x0001,0xEBD6,0x0000,0xBDC5,0x0003,0x0000,0xEBE4,0x0000,0xB2B1,0x0010,0x0008,0x0004, 0x0002,0xD9F5,0xC5A7,0x0002,0xEBDF,0xC4D4,0x0004,0x0002,0xC6EA,0xD4E0,0x0002,0xEBDB,0xEBDA,0x0005,0x0001,0x0002, 0xBCB9,0xC2F6,0x0003,0x0000,0xC2F6,0x0002,0xB4E0,0xD0B2,0x0033,0x0015,0x0008,0x0004,0x0001,0x0000,0xD6AC,0x0001, 0x0001,0xC4DC,0x0007,0x0003,0x0000,0xEBDD,0x0002,0xB0B7,0xEBEF,0x0003,0x0000,0xD0D8,0x0000,0xBDBA,0x000F,0x0008, 0x0004,0x0002,0xEBD8,0xB8EC,0x0002,0xEBDC,0xEBD7,0x0004,0x0002,0xD2C8,0xBFE8,0x0001,0xEBD9,0x0008,0x0004,0x0002, 0xE6C0,0xEBD6,0x0002,0xEBCD,0xEBCC,0x0004,0x0002,0xEBCB,0xEBCA,0x0001,0xF1E3,0x001A,0x000B,0x0006,0x0003,0x0000, 0xD8B7,0x0001,0xBAFA,0x0001,0x0002,0xB0FB,0xEBD5,0x0008,0x0004,0x0002,0xCAA4,0xEBCE,0x0002,0xC5DF,0xEBD1,0x0003, 0x0001,0xEBD3,0x0002,0xC5D6,0xB7F4,0x0009,0x0004,0x0001,0x0001,0xD6AB,0x0001,0x0002,0xCCA5,0xEBD2,0x0007,0x0003, 0x0000,0xB1B3,0x0002,0xEBD4,0xB2B2,0x0001,0x0000,0xB5A8,0x0065,0x0033,0x001A,0x0010,0x0008,0x0004,0x0002,0xEBD0, 0xCEB8,0x0002,0xEBCF,0xD0B2,0x0004,0x0002,0xD5CD,0xD6D7,0x0002,0xC9F6,0xEBC4,0x0006,0x0003,0x0000,0xEBC2,0x0000, 0xB7CE,0x0000,0x0001,0xEBC9,0x000E,0x0007,0x0003,0x0000,0xEBC8,0x0002,0xD3FD,0xEBC5,0x0003,0x0001,0xBFCF,0x0002, 0xB0B9,0xEBC7,0x0007,0x0003,0x0001,0xEBC6,0x0002,0xB7BE,0xBCE7,0x0001,0x0001,0xB7CA,0x001C,0x000E,0x0007,0x0003, 0x0000,0xB7F4,0x0002,0xD6AB,0xB9C9,0x0004,0x0002,0xB3A6,0xEBBF,0x0001,0xB8CE,0x0007,0x0004,0x0002,0xEBC0,0xB8D8, 0x0000,0xB6C7,0x0003,0x0000,0xD6E2,0x0002,0xD0A4,0xC8CD,0x0008,0x0004,0x0000,0x0001,0xEBC1,0x0000,0x0000,0xB8EC, 0x0007,0x0004,0x0002,0xBCA1,0xC0DF,0x0001,0xC8E2,0x0003,0x0001,0xD5D8,0x0002,0xCBC1,0xCBE0,0x002A,0x0018,0x000D, 0x0005,0x0000,0x0002,0xD2DE,0xCBE0,0x0004,0x0002,0xEDB1,0xEDB2,0x0002,0xC1FB,0xCCFD,0x0004,0x0001,0x0001,0xF1F7, 0x0003,0x0001,0xD6B0,0x0002,0xC4F4,0xF1F9,0x000C,0x0007,0x0003,0x0001,0xCBCA,0x0002,0xC9F9,0xF1FA,0x0000,0x0002, 0xB4CF,0xC1AA,0x0000,0x0001,0x0002,0xB4CF,0xF1F9,0x000F,0x0005,0x0001,0x0001,0x0000,0xCEC5,0x0004,0x0001,0x0000, 0xBEDB,0x0003,0x0000,0xC6B8,0x0000,0xCAA5,0x000A,0x0006,0x0003,0x0000,0xC1AA,0x0000,0xF1F8,0x0001,0x0001,0xF1F7, 0x0007,0x0004,0x0002,0xD6B0,0xC1FB,0x0000,0xC1C4,0x0001,0x0000,0xF1F6,0x4108,0x287E,0x13B9,0x0A0C,0x0557,0x02EC, 0x0151,0x00AB,0x005E,0x002E,0x0016,0x0009,0x0005,0x0001,0x0002,0xF1F5,0xC4F4,0x0001,0x0000,0xB9A2,0x0006,0x0003, 0x0000,0xB5A2,0x0000,0xB3DC,0x0003,0x0001,0xCBCA,0x0002,0xDEC7,0xD2AE,0x000A,0x0006,0x0003,0x0000,0xF1F4,0x0000, 0xB6FA,0x0000,0x0000,0xF1F2,0x0006,0x0003,0x0001,0xF1EF,0x0001,0xC5D5,0x0004,0x0002,0xF1F0,0xF1F1,0x0002,0xF1EF, 0xF1EE,0x0017,0x000B,0x0006,0x0003,0x0000,0xF1ED,0x0001,0xF1EC,0x0000,0x0002,0xB3FA,0xF1EB,0x0004,0x0000,0x0001, 0xF1EA,0x0004,0x0002,0xB0D2,0xD4C5,0x0002,0xBAC4,0xF1E9,0x000E,0x0007,0x0004,0x0002,0xB8FB,0xF1E8,0x0001,0xF1E7, 0x0004,0x0002,0xD7A8,0xC4CD,0x0000,0xC4CD,0x0007,0x0004,0x0002,0xCBA3,0xB6F8,0x0000,0xF1F3,0x0001,0x0001,0xEAC8, 0x002B,0x0016,0x000C,0x0007,0x0004,0x0002,0xD5DF,0xEBA3,0x0000,0xBFBC,0x0000,0x0002,0xC0CF,0xD2AB,0x0006,0x0003, 0x0001,0xD2ED,0x0000,0xB7AD,0x0000,0x0000,0xC7CC,0x000B,0x0004,0x0001,0x0000,0xF4E8,0x0004,0x0002,0xB0BF,0xBAB2, 0x0001,0xF4E7,0x0004,0x0001,0x0000,0xCDE6,0x0003,0x0000,0xF4E6,0x0001,0xF4E5,0x0010,0x000B,0x0004,0x0000,0x0000, 0xF4E3,0x0004,0x0002,0xF4E4,0xB4E4,0x0000,0xB5D4,0x0001,0x0000,0x0001,0xC7CC,0x000B,0x0007,0x0004,0x0002,0xF4E2, 0xCFE8,0x0001,0xCFB0,0x0001,0x0001,0xF4E1,0x0000,0x0003,0x0001,0xD2EE,0x0001,0xF1B4,0x0053,0x0028,0x0016,0x000A, 0x0004,0x0000,0x0000,0xB3E1,0x0003,0x0000,0xCECC,0x0000,0xF4E0,0x0005,0x0000,0x0002,0xD3F0,0xE5F1,0x0004,0x0002, 0xB8FE,0xD9FA,0x0001,0xEBFE,0x000A,0x0004,0x0001,0x0001,0xF4CB,0x0003,0x0001,0xF4CA,0x0000,0xF4C9,0x0001,0x0004, 0x0002,0xD2E5,0xCFDB,0x0000,0xF4C8,0x0015,0x000E,0x0007,0x0004,0x0002,0xF4C7,0xC8BA,0x0001,0xC8DE,0x0003,0x0000, 0xCFDB,0x0002,0xF4C7,0xD0DF,0x0000,0x0003,0x0000,0xF4C6,0x0001,0xC1E7,0x0008,0x0004,0x0000,0x0001,0xB8E1,0x0001, 0x0001,0xC3C0,0x0008,0x0004,0x0002,0xB4EF,0xC7BC,0x0002,0xD8C2,0xD1F2,0x0003,0x0001,0xEEBF,0x0001,0xEEBC,0x002A, 0x0011,0x000A,0x0004,0x0000,0x0000,0xC2DE,0x0003,0x0000,0xEEBF,0x0001,0xEEC0,0x0001,0x0003,0x0000,0xEEBE,0x0000, 0xB0D5,0x000E,0x0007,0x0004,0x0002,0xC2EE,0xEEBC,0x0001,0xCAF0,0x0004,0x0002,0xEEBD,0xB7A3,0x0001,0xD6C3,0x0004, 0x0001,0x0001,0xD7EF,0x0004,0x0002,0xD5D6,0xEEBB,0x0001,0xEEB7,0x0015,0x000B,0x0005,0x0001,0x0002,0xB9D2,0xB0D5, 0x0003,0x0000,0xEEB8,0x0000,0xEEB9,0x0004,0x0001,0x0001,0xB7A3,0x0003,0x0001,0xEEB7,0x0000,0xC2DE,0x000A,0x0005, 0x0000,0x0002,0xBAB1,0xD8E8,0x0000,0x0002,0xCDF8,0xB9DE,0x0006,0x0003,0x0001,0xF3BF,0x0000,0xCECD,0x0000,0x0001, 0xCCB3,0x00ED,0x0071,0x0034,0x0014,0x0009,0x0005,0x0002,0xF3C1,0x0000,0xF3C0,0x0000,0x0000,0xF3BF,0x0005,0x0000, 0x0002,0xC6BF,0xB2A7,0x0003,0x0000,0xC8B1,0x0000,0xB8D7,0x0010,0x0008,0x0004,0x0002,0xF3BE,0xE7DA,0x0002,0xBDC9, 0xE7D9,0x0004,0x0002,0xE7D8,0xE7D7,0x0002,0xE7D6,0xE7D5,0x0008,0x0004,0x0002,0xC9C9,0xE7D4,0x0002,0xE7D3,0xE7D2, 0x0004,0x0002,0xE7D1,0xCBF5,0x0002,0xD3A7,0xE7D0,0x001F,0x0010,0x0008,0x0004,0x0002,0xE7CF,0xE7CE,0x0002,0xE7CD, 0xE7CC,0x0004,0x0002,0xE7CB,0xE7CA,0x0002,0xB2F8,0xE7C9,0x0007,0x0003,0x0001,0xB7EC,0x0002,0xE7C7,0xE7C8,0x0004, 0x0002,0xB8BF,0xE7C6,0x0002,0xD4B5,0xE7C5,0x000F,0x0008,0x0004,0x0002,0xB1E0,0xC2C6,0x0002,0xB5DE,0xBBBA,0x0004, 0x0002,0xE7C4,0xE7C3,0x0001,0xE7C2,0x0008,0x0004,0x0002,0xB6D0,0xE7B6,0x0002,0xE7C1,0xE7C0,0x0003,0x0001,0xBCA9, 0x0002,0xE7BF,0xE7BE,0x003E,0x001F,0x0010,0x0008,0x0004,0x0002,0xC0C2,0xC3E5,0x0002,0xBCEA,0xE7BD,0x0004,0x0002, 0xE7BC,0xE7BB,0x0002,0xD7BA,0xC2CC,0x0008,0x0004,0x0002,0xE7BA,0xD5C0,0x0002,0xD7DB,0xE7B9,0x0003,0x0000,0xE7B8, 0x0002,0xB3F1,0xB1C1,0x0010,0x0008,0x0004,0x0002,0xE7B7,0xC3E0,0x0002,0xCEAC,0xC9FE,0x0004,0x0002,0xE7B5,0xE7B4, 0x0002,0xB4C2,0xE7B3,0x0007,0x0004,0x0002,0xE7B2,0xD0F8,0x0001,0xE7B1,0x0004,0x0002,0xD0F7,0xBCA8,0x0002,0xE7B0, 0xBCCC,0x001F,0x000F,0x0007,0x0004,0x0002,0xCCD0,0xCBE7,0x0001,0xD0E5,0x0004,0x0002,0xBEEE,0xE7AF,0x0002,0xE7AE, 0xCDB3,0x0008,0x0004,0x0002,0xBDCA,0xBEF8,0x0002,0xC2E7,0xE7AD,0x0004,0x0002,0xD1A4,0xB8F8,0x0002,0xBBE6,0xE7AC, 0x000F,0x0007,0x0003,0x0001,0xC8C6,0x0002,0xE7AB,0xBDE1,0x0004,0x0002,0xC8DE,0xB0F3,0x0002,0xE7AA,0xBEAD,0x0008, 0x0004,0x0002,0xD2EF,0xC9DC,0x0002,0xE7A9,0xE7A8,0x0004,0x0002,0xB0ED,0xE7A7,0x0002,0xD6D5,0xD6AF,0x006B,0x003B, 0x001D,0x0010,0x0008,0x0004,0x0002,0xCFB8,0xC9F0,0x0002,0xD7E9,0xC1B7,0x0004,0x0002,0xE7A6,0xE7A5,0x0002,0xE7A4, 0xCFDF,0x0005,0x0000,0x0002,0xE7A3,0xC5A6,0x0004,0x0002,0xB7C4,0xCEC6,0x0002,0xD6BD,0xB7D7,0x000F,0x0007,0x0004, 0x0002,0xC2DA,0xD7DD,0x0001,0xC4C9,0x0004,0x0002,0xB8D9,0xC9B4,0x0002,0xE7A2,0xB4BF,0x0007,0x0003,0x0001,0xE7A1, 0x0002,0xCEB3,0xC8D2,0x0004,0x0002,0xBCCD,0xE6FE,0x0002,0xE6FD,0xBCB6,0x0019,0x0010,0x0008,0x0004,0x0002,0xD4BC, 0xE6FC,0x0002,0xCFCB,0xE6FB,0x0004,0x0002,0xBAEC,0xE6FA,0x0002,0xBEC0,0xE6F9,0x0005,0x0001,0x0002,0xC0C2,0xF4EE, 0x0001,0x0000,0xE7DA,0x000B,0x0007,0x0003,0x0000,0xCFCB,0x0002,0xB2C5,0xD3A7,0x0001,0x0001,0xB2F8,0x0006,0x0003, 0x0001,0xC0DB,0x0000,0xD0F8,0x0003,0x0000,0xE6FE,0x0000,0xE7D3,0x0024,0x0010,0x0005,0x0001,0x0000,0x0000,0xD7EB, 0x0007,0x0004,0x0002,0xE7D7,0xE7CD,0x0000,0xBCCC,0x0000,0x0001,0xD2EF,0x0009,0x0004,0x0001,0x0001,0xBDC9,0x0001, 0x0002,0xE7D8,0xE7D9,0x0006,0x0003,0x0001,0xBCEB,0x0001,0xCFB5,0x0000,0x0002,0xBBE6,0xC9FE,0x000F,0x0006,0x0001, 0x0000,0x0002,0xE7C0,0xD0E5,0x0004,0x0000,0x0000,0xC8C6,0x0000,0x0002,0xE7D4,0xB7AD,0x000A,0x0006,0x0003,0x0001, 0xC9C9,0x0000,0xD6AF,0x0000,0x0000,0xE7D5,0x0001,0x0001,0x0002,0xF1DF,0xF4ED,0x012F,0x0093,0x004E,0x002F,0x0017, 0x000B,0x0005,0x0002,0xE7D1,0x0000,0xE7D2,0x0003,0x0000,0xB1C1,0x0000,0xB7B1,0x0006,0x0003,0x0001,0xBCA8,0x0000, 0xD7DC,0x0003,0x0000,0xF7E3,0x0000,0xE7CE,0x000E,0x0008,0x0004,0x0002,0xC2C6,0xF4EA,0x0002,0xE7CF,0xCFCB,0x0003, 0x0001,0xE7D0,0x0000,0xD7DD,0x0006,0x0003,0x0001,0xCBF5,0x0000,0xE7CA,0x0000,0x0000,0xB7EC,0x0010,0x0005,0x0001, 0x0000,0x0000,0xCFD8,0x0007,0x0004,0x0002,0xE7C8,0xE7C9,0x0000,0xE7C7,0x0000,0x0000,0xB8BF,0x0006,0x0001,0x0001, 0x0002,0xE7CC,0xE7A7,0x0001,0x0004,0x0002,0xE7C4,0xE7CB,0x0002,0xE7C6,0xDDD3,0x001F,0x0008,0x0001,0x0001,0x0003, 0x0000,0xD6C2,0x0000,0xE7BE,0x000C,0x0006,0x0003,0x0001,0xE7C2,0x0001,0xC1B7,0x0003,0x0001,0xE7BF,0x0000,0xE7C3, 0x0006,0x0003,0x0000,0xCEB3,0x0001,0xC3E5,0x0001,0x0002,0xBBBA,0xB1E0,0x0018,0x000B,0x0004,0x0000,0x0001,0xE7C1, 0x0003,0x0000,0xD4B5,0x0002,0xE7C5,0xB5DE,0x0006,0x0003,0x0001,0xB6D0,0x0000,0xBCA9,0x0003,0x0001,0xCFDF,0x0002, 0xE7BC,0xBCEA,0x0008,0x0004,0x0000,0x0000,0xE7BD,0x0000,0x0001,0xD0F7,0x0001,0x0000,0x0002,0xE7B3,0xBDF4,0x0051, 0x002D,0x0019,0x000A,0x0006,0x0003,0x0000,0xE7BB,0x0001,0xE7B5,0x0001,0x0000,0xBCA9,0x0007,0x0004,0x0002,0xC3E0, 0xE7B1,0x0000,0xB4C2,0x0004,0x0002,0xD5C0,0xE7B2,0x0002,0xE7B8,0xC2DA,0x000C,0x0005,0x0001,0x0002,0xB2CA,0xD7BA, 0x0003,0x0001,0xCDF8,0x0002,0xB8D9,0xE7BA,0x0000,0x0003,0x0001,0xF4EC,0x0002,0xCEAC,0xE7B7,0x0013,0x000C,0x0005, 0x0000,0x0002,0xD7BC,0xF4EB,0x0004,0x0002,0xE7B9,0xB3F1,0x0001,0xC2CC,0x0000,0x0003,0x0001,0xE7B6,0x0001,0xD7DB, 0x0007,0x0001,0x0003,0x0000,0xBEAD,0x0000,0xC0A6,0x0006,0x0003,0x0000,0xCBE7,0x0000,0xE7A8,0x0001,0x0001,0xE7B0, 0x0027,0x0011,0x000A,0x0004,0x0000,0x0001,0xE7AE,0x0003,0x0000,0xE7AF,0x0000,0xB0F3,0x0001,0x0003,0x0000,0xC3E1, 0x0000,0xBEEE,0x000B,0x0004,0x0000,0x0000,0xF4EA,0x0004,0x0002,0xE7AD,0xCBBF,0x0000,0xCDB3,0x0005,0x0000,0x0002, 0xBAA7,0xD0F5,0x0003,0x0001,0xEBB3,0x0001,0xC8DE,0x0014,0x000A,0x0004,0x0000,0x0001,0xB8F8,0x0003,0x0001,0xD1A4, 0x0000,0xC2E7,0x0006,0x0003,0x0001,0xBDCA,0x0001,0xBDE0,0x0000,0x0000,0xCCD0,0x000A,0x0006,0x0003,0x0001,0xE6FE, 0x0000,0xBEF8,0x0001,0x0001,0xBDE1,0x0000,0x0000,0x0002,0xE7A5,0xE7AC,0x00B3,0x005F,0x002D,0x0019,0x000D,0x0006, 0x0003,0x0001,0xB0ED,0x0001,0xD7E9,0x0004,0x0002,0xCFD2,0xD6D5,0x0001,0xE7A9,0x0006,0x0003,0x0000,0xE7AA,0x0001, 0xE7A8,0x0003,0x0001,0xE7A4,0x0000,0xC9DC,0x0009,0x0001,0x0004,0x0002,0xC9F0,0xE7A5,0x0002,0xE7A6,0xCFB8,0x0007, 0x0004,0x0002,0xC0DB,0xD4FA,0x0001,0xB3F1,0x0000,0x0000,0xD7CF,0x0019,0x000B,0x0004,0x0000,0x0000,0xBDF4,0x0003, 0x0001,0xCBF7,0x0002,0xB7C4,0xCBD8,0x0006,0x0003,0x0000,0xF1C6,0x0001,0xE7A1,0x0004,0x0002,0xB7D7,0xBCB6,0x0002, 0xD6BD,0xBAEA,0x000D,0x0007,0x0003,0x0000,0xC9B4,0x0002,0xE7A2,0xB4BF,0x0003,0x0000,0xE7A3,0x0001,0xC5A6,0x0004, 0x0001,0x0000,0xC4C9,0x0004,0x0002,0xCEC6,0xCEC9,0x0002,0xC8D2,0xE6FD,0x002D,0x0019,0x000F,0x0008,0x0004,0x0002, 0xE6FC,0xE6FA,0x0002,0xBAEC,0xD4BC,0x0004,0x0002,0xD1AD,0xE6FB,0x0001,0xBCCD,0x0004,0x0000,0x0001,0xBEC0,0x0003, 0x0000,0xCFB5,0x0001,0xF4E9,0x000C,0x0006,0x0003,0x0001,0xF4D0,0x0001,0xD9E1,0x0003,0x0001,0xF4CF,0x0001,0xCDC5, 0x0004,0x0000,0x0000,0xC5B4,0x0001,0x0001,0xF4DD,0x0014,0x0008,0x0004,0x0000,0x0000,0xC1B8,0x0001,0x0001,0xBFB7, 0x0008,0x0004,0x0002,0xD4E3,0xB7E0,0x0002,0xF4D6,0xC3D3,0x0001,0x0000,0xB2DA,0x0008,0x0000,0x0004,0x0002,0xF4DC, 0xCCC7,0x0000,0xB8E2,0x0005,0x0001,0x0002,0xF4D9,0xF4D8,0x0003,0x0001,0xBAFD,0x0001,0xF4DA,0x004F,0x0028,0x0015, 0x000A,0x0006,0x0003,0x0000,0xF4D7,0x0000,0xF4DB,0x0001,0x0000,0xF4D6,0x0007,0x0003,0x0001,0xBEAB,0x0002,0xF4D5, 0xF4D4,0x0001,0x0000,0xB4E2,0x000B,0x0004,0x0001,0x0000,0xD4C1,0x0004,0x0002,0xBEAC,0xF4D3,0x0000,0xC1BB,0x0004, 0x0000,0x0001,0xC1B8,0x0000,0x0001,0xB7E0,0x0016,0x000A,0x0005,0x0001,0x0002,0xD6E0,0xD4C1,0x0000,0x0002,0xE2CC, 0xF4D2,0x0008,0x0004,0x0002,0xCBDA,0xF4D1,0x0002,0xF4CF,0xF4D0,0x0001,0x0001,0xD5B3,0x000C,0x0006,0x0003,0x0000, 0xB4D6,0x0000,0xC6C9,0x0003,0x0001,0xC1A3,0x0000,0xF4CE,0x0001,0x0001,0x0000,0xB7DB,0x001F,0x000A,0x0001,0x0005, 0x0001,0x0002,0xD7D1,0xF4CC,0x0000,0x0000,0xC0E0,0x0009,0x0004,0x0001,0x0001,0xD9E1,0x0000,0x0002,0xC3D7,0xD3F5, 0x0006,0x0003,0x0001,0xC2E1,0x0001,0xC0E9,0x0003,0x0001,0xF3FD,0x0000,0xF3D6,0x0010,0x0009,0x0005,0x0001,0x0002, 0xD9DF,0xC7A9,0x0001,0x0001,0xC1FD,0x0000,0x0003,0x0000,0xF4A5,0x0001,0xF3EA,0x0005,0x0001,0x0001,0x0001,0xCCD9, 0x0000,0x0001,0x0002,0xBCAE,0xB3EF,0x0272,0x013D,0x008C,0x0043,0x001D,0x0010,0x0007,0x0001,0x0003,0x0001,0xC0BA, 0x0001,0xF4A5,0x0000,0x0004,0x0002,0xF4A6,0xB2BE,0x0002,0xC1B1,0xC7A9,0x0006,0x0000,0x0000,0x0002,0xF4A4,0xE9DC, 0x0001,0x0003,0x0001,0xF3EF,0x0000,0xF4A2,0x0013,0x000C,0x0006,0x0003,0x0001,0xBBC9,0x0000,0xF4A3,0x0003,0x0001, 0xF3F1,0x0001,0xBCF2,0x0000,0x0003,0x0001,0xF4A1,0x0000,0xF3EC,0x0008,0x0004,0x0001,0x0000,0xF3FD,0x0001,0x0001, 0xCBF2,0x0006,0x0003,0x0001,0xF3FC,0x0001,0xC2A8,0x0000,0x0002,0xF3F9,0xF3FE,0x0022,0x000F,0x0005,0x0000,0x0000, 0x0001,0xB4D8,0x0006,0x0003,0x0000,0xF3E5,0x0000,0xF3FA,0x0000,0x0000,0xF3FB,0x000A,0x0004,0x0000,0x0001,0xC5F1, 0x0003,0x0001,0xF3D9,0x0001,0xC0E9,0x0004,0x0001,0x0000,0xC0BA,0x0001,0x0002,0xF3F8,0xC9B8,0x0018,0x000B,0x0005, 0x0001,0x0002,0xF3F7,0xF3F6,0x0003,0x0000,0xF3C6,0x0001,0xB4DB,0x0006,0x0003,0x0000,0xF3E3,0x0001,0xF3F4,0x0003, 0x0001,0xF3E8,0x0002,0xF3F5,0xB8DD,0x0007,0x0001,0x0003,0x0001,0xC2A8,0x0001,0xF3F1,0x0001,0x0004,0x0002,0xF3F3, 0xF3E6,0x0001,0xD6FE,0x0053,0x0027,0x0011,0x000C,0x0006,0x0003,0x0001,0xC6AA,0x0000,0xD7AD,0x0003,0x0000,0xB7B6, 0x0001,0xF3F2,0x0000,0x0000,0x0000,0xBDDA,0x000A,0x0004,0x0000,0x0000,0xF3E7,0x0003,0x0000,0xF3F0,0x0001,0xCFE4, 0x0004,0x0001,0x0001,0xBCFD,0x0004,0x0002,0xF3E8,0xF3EF,0x0002,0xF3EC,0xC2E1,0x0016,0x000C,0x0007,0x0004,0x0002, 0xF3EA,0xF3E6,0x0000,0xF3E5,0x0001,0x0002,0xF3EE,0xB9DC,0x0006,0x0003,0x0000,0xE9A2,0x0001,0xF3E9,0x0000,0x0000, 0xF3ED,0x000A,0x0006,0x0003,0x0001,0xCBE3,0x0001,0xBBFE,0x0000,0x0000,0xB2AD,0x0008,0x0004,0x0002,0xF3E4,0xF3DD, 0x0002,0xF3F8,0xB9BF,0x0000,0x0001,0xBCE3,0x002B,0x0014,0x0008,0x0000,0x0004,0x0002,0xB2AD,0xB8F6,0x0001,0xF3EB, 0x0006,0x0003,0x0000,0xBCF2,0x0000,0xC7A9,0x0003,0x0001,0xF3E0,0x0001,0xB3EF,0x000E,0x0006,0x0003,0x0001,0xBFEA, 0x0001,0xF3DB,0x0004,0x0002,0xB2DF,0xDCF0,0x0002,0xF3E2,0xF3E3,0x0005,0x0001,0x0002,0xF3DF,0xCBE3,0x0001,0x0001, 0xCDB2,0x0018,0x000C,0x0006,0x0003,0x0001,0xF3C8,0x0000,0xB9DC,0x0003,0x0001,0xC0E9,0x0000,0xF3E1,0x0006,0x0003, 0x0000,0xF3DE,0x0001,0xF3DD,0x0003,0x0001,0xC9B8,0x0000,0xF3D9,0x000D,0x0006,0x0003,0x0000,0xF3D8,0x0000,0xB2DF, 0x0003,0x0000,0xB4F0,0x0002,0xCDB2,0xD6FE,0x0007,0x0004,0x0002,0xBFF0,0xB7A4,0x0001,0xCBF1,0x0004,0x0002,0xF3DC, 0xBDEE,0x0001,0xB5C8,0x0099,0x0055,0x002C,0x0014,0x0009,0x0005,0x0001,0x0002,0xF3CC,0xB1CA,0x0000,0x0000,0xF3DA, 0x0004,0x0001,0x0001,0xF3D6,0x0003,0x0001,0xC1FD,0x0002,0xF3CC,0xBCE3,0x000B,0x0004,0x0000,0x0001,0xF3CD,0x0003, 0x0000,0xB7B6,0x0002,0xF3D5,0xF3C7,0x0006,0x0003,0x0000,0xF3D1,0x0001,0xF3D0,0x0003,0x0001,0xB5DA,0x0002,0xF3CA, 0xF3CE,0x0015,0x000B,0x0006,0x0003,0x0001,0xB1BF,0x0001,0xB7FB,0x0000,0x0002,0xF3D3,0xF3D4,0x0006,0x0003,0x0001, 0xF3D2,0x0001,0xF3D7,0x0001,0x0000,0xB5D1,0x0009,0x0004,0x0000,0x0000,0xF3CF,0x0000,0x0002,0xF3C8,0xB1CA,0x0006, 0x0003,0x0000,0xD0A6,0x0000,0xF3CB,0x0001,0x0002,0xCBF1,0xF3C9,0x0025,0x0016,0x000C,0x0006,0x0003,0x0001,0xF3C5, 0x0001,0xB0CA,0x0003,0x0001,0xF3C7,0x0000,0xF3C6,0x0004,0x0001,0x0000,0xB8CD,0x0003,0x0000,0xF3C4,0x0001,0xF3C3, 0x0007,0x0000,0x0003,0x0000,0xD6F1,0x0001,0xBEBA,0x0004,0x0001,0x0000,0xB6CB,0x0000,0x0000,0xBDDF,0x0012,0x000A, 0x0004,0x0001,0x0001,0xF1B5,0x0003,0x0000,0xCDAF,0x0000,0xBFA2,0x0000,0x0003,0x0001,0xD5C2,0x0002,0xBEB9,0xBEBA, 0x0007,0x0000,0x0003,0x0000,0xD5BE,0x0001,0xCAFA,0x0001,0x0001,0x0002,0xC1A2,0xC7D4,0x0053,0x0025,0x0011,0x0009, 0x0004,0x0001,0x0000,0xF1BC,0x0000,0x0002,0xC7CF,0xB4DC,0x0004,0x0001,0x0000,0xC1FE,0x0001,0x0001,0xBFFA,0x0008, 0x0004,0x0001,0x0001,0xF1C0,0x0001,0x0000,0xF1C1,0x0005,0x0001,0x0002,0xD2A4,0xC7EE,0x0004,0x0002,0xF1C0,0xF1BE, 0x0001,0xCDDD,0x0016,0x000B,0x0007,0x0004,0x0002,0xCED1,0xF1BF,0x0001,0xF1BC,0x0000,0x0000,0xBFFA,0x0006,0x0003, 0x0001,0xF1BD,0x0000,0xBFDF,0x0000,0x0002,0xCED1,0xB4DC,0x000D,0x0007,0x0003,0x0001,0xBEBD,0x0002,0xB4B0,0xBDD1, 0x0003,0x0000,0xF1BB,0x0001,0xD6CF,0x0004,0x0000,0x0000,0xD2A4,0x0003,0x0000,0xC7CF,0x0002,0xBFDF,0xCDDD,0x002C, 0x0017,0x000C,0x0006,0x0003,0x0001,0xF1BA,0x0001,0xF1B9,0x0003,0x0001,0xD5AD,0x0000,0xC7D4,0x0007,0x0004,0x0002, 0xCDBB,0xF1B8,0x0000,0xB4A9,0x0001,0x0001,0xBFD5,0x000D,0x0008,0x0004,0x0002,0xF1B7,0xF1B6,0x0002,0xC7EE,0xBEBF, 0x0000,0x0002,0xCDDA,0xD1A8,0x0004,0x0000,0x0001,0xF0A6,0x0001,0x0000,0xBBF1,0x000D,0x0008,0x0004,0x0000,0x0000, 0xCEC8,0x0001,0x0001,0xBBE0,0x0000,0x0000,0x0000,0xF0A3,0x0005,0x0000,0x0001,0x0000,0xCBEB,0x0006,0x0003,0x0000, 0xF0A3,0x0001,0xD3B1,0x0000,0x0002,0xBBFD,0xF6D5,0x0125,0x0097,0x0046,0x0023,0x0011,0x0005,0x0001,0x0000,0x0000, 0xC4C2,0x0005,0x0001,0x0002,0xB9C8,0xB8E5,0x0003,0x0001,0xBBFC,0x0002,0xBCDA,0xB5BE,0x000A,0x0006,0x0003,0x0001, 0xF0A1,0x0001,0xF0A2,0x0001,0x0001,0xCEC8,0x0004,0x0000,0x0001,0xB3C6,0x0000,0x0000,0xD6D6,0x0010,0x0005,0x0001, 0x0001,0x0001,0xF6D5,0x0005,0x0001,0x0002,0xB3ED,0xD9F7,0x0003,0x0000,0xEFFD,0x0000,0xC0E2,0x000B,0x0007,0x0003, 0x0000,0xD6C9,0x0002,0xC6DA,0xB0DE,0x0001,0x0000,0xEFFE,0x0001,0x0004,0x0002,0xCBB0,0xC9D4,0x0001,0xB3CC,0x0029, 0x0019,0x000D,0x0006,0x0003,0x0000,0xDCE8,0x0000,0xB8D1,0x0004,0x0002,0xEFF9,0xCBB0,0x0001,0xEFFB,0x0006,0x0003, 0x0000,0xEFFC,0x0000,0xCFA1,0x0003,0x0001,0xBBE0,0x0001,0xD2C6,0x0005,0x0000,0x0001,0x0000,0xBDD5,0x0005,0x0001, 0x0002,0xB3C6,0xBBFD,0x0003,0x0001,0xEFF6,0x0001,0xEFF7,0x0012,0x000D,0x0006,0x0003,0x0001,0xD6C8,0x0001,0xD1ED, 0x0003,0x0000,0xC7D8,0x0002,0xB3D3,0xEFF7,0x0000,0x0001,0x0001,0xD7E2,0x0009,0x0004,0x0001,0x0000,0xC3D8,0x0000, 0x0002,0xD6BB,0xEFF5,0x0007,0x0004,0x0002,0xC3EB,0xBFC6,0x0001,0xBAC4,0x0003,0x0001,0xD6D6,0x0001,0xC7EF,0x0046, 0x002D,0x001A,0x000C,0x0006,0x0003,0x0001,0xB1FC,0x0000,0xF4CC,0x0003,0x0000,0xB8D1,0x0001,0xCDBA,0x0007,0x0003, 0x0001,0xCBBD,0x0002,0xD0E3,0xCDBA,0x0004,0x0002,0xBACC,0xC7DD,0x0001,0xC0EB,0x0009,0x0005,0x0000,0x0002,0xD8AE, 0xD3ED,0x0001,0x0001,0xECFC,0x0006,0x0003,0x0001,0xB5BB,0x0000,0xECF2,0x0000,0x0000,0xC0F1,0x000B,0x0000,0x0006, 0x0003,0x0000,0xECF8,0x0001,0xECFB,0x0000,0x0000,0xD3F9,0x0005,0x0000,0x0000,0x0000,0xECFA,0x0004,0x0001,0x0001, 0xB8A3,0x0000,0x0002,0xECF5,0xBBF6,0x0022,0x0012,0x000A,0x0004,0x0000,0x0000,0xECF9,0x0003,0x0001,0xECF8,0x0000, 0xC2BB,0x0000,0x0003,0x0001,0xBDFB,0x0002,0xD9F7,0xC2BB,0x0008,0x0000,0x0003,0x0000,0xECF7,0x0002,0xBBF6,0xB5BB, 0x0004,0x0001,0x0001,0xECF5,0x0000,0x0001,0xBCC0,0x0018,0x0009,0x0005,0x0001,0x0002,0xC6B1,0xECF6,0x0000,0x0001, 0xCFE9,0x0007,0x0003,0x0000,0xECF2,0x0002,0xECF4,0xCBEE,0x0004,0x0002,0xC9F1,0xD7A3,0x0002,0xECEF,0xECEE,0x0000, 0x0006,0x0003,0x0000,0xECF1,0x0001,0xECF3,0x0004,0x0002,0xD7E6,0xC3D8,0x0001,0xECF0,0x0085,0x0047,0x002B,0x001A, 0x000C,0x0007,0x0003,0x0001,0xECED,0x0002,0xC6ED,0xD6BB,0x0000,0x0002,0xECEC,0xB0C0,0x0006,0x0003,0x0001,0xC6EE, 0x0000,0xECEB,0x0004,0x0002,0xC9E7,0xC8D4,0x0002,0xC0F1,0xECEA,0x0008,0x0004,0x0000,0x0000,0xCABE,0x0001,0x0000, 0xEDE7,0x0004,0x0000,0x0001,0xEDC3,0x0001,0x0002,0xB7AF,0xC0F9,0x000F,0x000A,0x0004,0x0000,0x0000,0xEDC2,0x0003, 0x0000,0xBFF3,0x0000,0xEDE5,0x0001,0x0000,0x0000,0xEDE6,0x0008,0x0004,0x0000,0x0001,0xB0AD,0x0001,0x0001,0xEDE4, 0x0001,0x0000,0x0000,0xB4A1,0x0021,0x000D,0x0005,0x0001,0x0000,0x0001,0xEDE2,0x0004,0x0000,0x0001,0xBDB8,0x0000, 0x0001,0xEDCD,0x000A,0x0006,0x0003,0x0000,0xBBC7,0x0001,0xC1D7,0x0001,0x0000,0xEDE3,0x0006,0x0003,0x0000,0xEDE1, 0x0001,0xEDB6,0x0001,0x0000,0xEDE0,0x000A,0x0000,0x0005,0x0001,0x0002,0xC4A5,0xEDD3,0x0001,0x0001,0xEDD7,0x000B, 0x0005,0x0000,0x0002,0xD7A9,0xEDDE,0x0003,0x0001,0xBFC4,0x0000,0xEDDD,0x0004,0x0001,0x0000,0xC5CD,0x0001,0x0001, 0xB4E8,0x0058,0x0028,0x0013,0x0009,0x0005,0x0000,0x0002,0xC0DA,0xEDDF,0x0000,0x0001,0xB0F5,0x0004,0x0000,0x0001, 0xB4C5,0x0003,0x0000,0xC4EB,0x0000,0xC2EB,0x000A,0x0005,0x0000,0x0002,0xC8B7,0xEDDB,0x0001,0x0002,0xB2EA,0xCCBC, 0x0007,0x0004,0x0002,0xEDDA,0xBCEE,0x0000,0xC5F6,0x0000,0x0001,0xEDB8,0x001A,0x000D,0x0007,0x0004,0x0002,0xD5E8, 0xCBB6,0x0001,0xB1CC,0x0003,0x0001,0xEDDC,0x0001,0xEDD9,0x0006,0x0003,0x0001,0xEDD8,0x0001,0xB5FA,0x0003,0x0000, 0xD1D2,0x0002,0xEDD7,0xEDD3,0x000B,0x0007,0x0003,0x0000,0xEDD5,0x0002,0xB5E2,0xCDEB,0x0001,0x0001,0xEDD4,0x0004, 0x0000,0x0001,0xB1AE,0x0004,0x0002,0xCBE9,0xB0AD,0x0000,0xC2B5,0x001D,0x000C,0x0007,0x0000,0x0003,0x0001,0xB5EF, 0x0001,0xEDD6,0x0001,0x0001,0x0000,0xC5F0,0x0005,0x0000,0x0001,0x0001,0xBCEF,0x0004,0x0001,0x0001,0xD1E2,0x0004, 0x0002,0xC8B7,0xEDCB,0x0002,0xD3B2,0xC1F2,0x000F,0x000A,0x0006,0x0003,0x0000,0xEDD2,0x0000,0xEDBA,0x0001,0x0000, 0xEDCC,0x0001,0x0000,0x0001,0xCFF5,0x0009,0x0004,0x0001,0x0001,0xEDCD,0x0000,0x0002,0xEDCC,0xCBB6,0x0006,0x0003, 0x0000,0xCEF8,0x0000,0xEDCF,0x0003,0x0000,0xEDCA,0x0000,0xEDD1,0x0506,0x027E,0x0135,0x00A9,0x005A,0x002C,0x0013, 0x0007,0x0001,0x0003,0x0000,0xEDD0,0x0000,0xB9E8,0x0006,0x0003,0x0000,0xD6EC,0x0001,0xB4A1,0x0003,0x0001,0xC0F9, 0x0001,0xEDC5,0x000E,0x0008,0x0004,0x0002,0xEDC3,0xEDC2,0x0002,0xEDC1,0xD4D2,0x0003,0x0000,0xC9E9,0x0001,0xC6C6, 0x0006,0x0003,0x0001,0xC5DA,0x0001,0xC5E9,0x0001,0x0002,0xEDBE,0xEDC7,0x0016,0x000B,0x0004,0x0001,0x0000,0xEDC9, 0x0004,0x0002,0xD5E8,0xEDCE,0x0000,0xEDC6,0x0004,0x0000,0x0000,0xEDC8,0x0003,0x0000,0xEDC4,0x0002,0xEDC0,0xEDBF, 0x000D,0x0006,0x0003,0x0001,0xD1E2,0x0001,0xEDBB,0x0004,0x0002,0xEDBA,0xD7A9,0x0001,0xD1D0,0x0006,0x0003,0x0001, 0xC5F8,0x0000,0xEDBC,0x0001,0x0002,0xBFB3,0xC6F6,0x002A,0x0016,0x0008,0x0004,0x0001,0x0000,0xEDB9,0x0001,0x0000, 0xC0F7,0x0007,0x0003,0x0001,0xC9B0,0x0002,0xC2EB,0xEDB8,0x0004,0x0002,0xBFF3,0xB7AF,0x0000,0xCEF9,0x0008,0x0004, 0x0001,0x0001,0xEDB7,0x0000,0x0001,0xEDB6,0x0004,0x0000,0x0000,0xCAAF,0x0004,0x0002,0xBDC3,0xB0AB,0x0002,0xB6CC, 0xEFF3,0x0017,0x000C,0x0006,0x0003,0x0000,0xBDC3,0x0000,0xBED8,0x0003,0x0000,0xEFF2,0x0000,0xD6AA,0x0005,0x0000, 0x0002,0xD2D3,0xCAB8,0x0003,0x0001,0xDADC,0x0001,0xF1E6,0x0009,0x0005,0x0000,0x0002,0xC3AC,0xD6F5,0x0000,0x0000, 0xB4A3,0x0001,0x0001,0x0000,0xDBC7,0x0045,0x0020,0x000D,0x0005,0x0001,0x0000,0x0000,0xC3C9,0x0001,0x0003,0x0000, 0xF6C4,0x0002,0xEEAD,0xEDFA,0x0008,0x0004,0x0000,0x0000,0xD5B0,0x0001,0x0000,0xEEAC,0x0006,0x0003,0x0000,0xCDAB, 0x0001,0xEEAB,0x0001,0x0002,0xC1CB,0xCBB2,0x0017,0x000C,0x0006,0x0003,0x0001,0xB5C9,0x0000,0xD6F5,0x0003,0x0000, 0xC7C6,0x0000,0xC6B3,0x0006,0x0003,0x0001,0xDEAB,0x0001,0xEEAA,0x0000,0x0002,0xEEA9,0xC2F7,0x0001,0x0006,0x0003, 0x0001,0xC2F7,0x0000,0xEEA8,0x0003,0x0001,0xCFB9,0x0002,0xEEA4,0xEEA7,0x001D,0x0013,0x0008,0x0001,0x0003,0x0000, 0xC3D0,0x0002,0xB3F2,0xC3E9,0x0004,0x0001,0x0001,0xEEA6,0x0004,0x0002,0xEEA3,0xD8BA,0x0000,0xEEA5,0x0005,0x0000, 0x0001,0x0000,0xB6C3,0x0001,0x0001,0x0001,0xB2C7,0x001B,0x000D,0x0007,0x0004,0x0002,0xBDDE,0xD8BA,0x0001,0xEDFE, 0x0003,0x0001,0xC4C0,0x0000,0xEEA2,0x0008,0x0004,0x0002,0xB6BD,0xEEA1,0x0002,0xCBAF,0xBEEC,0x0003,0x0001,0xEDF9, 0x0001,0xD5F6,0x0006,0x0000,0x0000,0x0002,0xBEA6,0xEDFD,0x0005,0x0001,0x0002,0xEDFA,0xEDF9,0x0000,0x0000,0xC0A7, 0x00AC,0x004C,0x002D,0x0014,0x0007,0x0003,0x0000,0xB6ED,0x0000,0x0001,0xEDFB,0x0007,0x0004,0x0002,0xC7C6,0xEDFC, 0x0001,0xD5F6,0x0003,0x0000,0xD7C5,0x0000,0xD6DA,0x000F,0x0007,0x0003,0x0000,0xD1DB,0x0002,0xCCF7,0xEBDE,0x0004, 0x0002,0xEDF8,0xBEEC,0x0002,0xBFF4,0xEDF7,0x0004,0x0000,0x0000,0xD1A3,0x0003,0x0001,0xC3D0,0x0001,0xEDF5,0x0014, 0x000B,0x0004,0x0001,0x0001,0xD1A3,0x0003,0x0000,0xD5A3,0x0002,0xEDF6,0xEDF6,0x0004,0x0001,0x0000,0xEDF3,0x0000, 0x0002,0xC3DF,0xD5E6,0x0006,0x0000,0x0001,0x0002,0xEDF2,0xEDF4,0x0001,0x0001,0x0001,0xEDEE,0x002E,0x0016,0x000C, 0x0007,0x0003,0x0001,0xBFB4,0x0002,0xEBA3,0xC3BC,0x0000,0x0002,0xEDF1,0xEDF0,0x0006,0x0003,0x0000,0xEDED,0x0001, 0xCAA1,0x0001,0x0000,0xB6DC,0x000A,0x0006,0x0003,0x0000,0xC5CE,0x0001,0xEDEF,0x0000,0x0000,0xCFE0,0x0008,0x0004, 0x0002,0xD6B1,0xC3A4,0x0002,0xC3A4,0xEDEC,0x0003,0x0001,0xB6A2,0x0000,0xC4BF,0x0017,0x000A,0x0004,0x0001,0x0000, 0xB5B4,0x0003,0x0001,0xC2AC,0x0001,0xEEC2,0x0007,0x0004,0x0002,0xC5CC,0xBCE0,0x0001,0xBEA1,0x0003,0x0001,0xC3CB, 0x0000,0xD5B5,0x000C,0x0005,0x0000,0x0002,0xB5C1,0xCAA2,0x0004,0x0002,0xC5CC,0xB5C1,0x0000,0xB8C7,0x0007,0x0003, 0x0000,0xBFF8,0x0002,0xBAD0,0xBCE0,0x0004,0x0002,0xD1CE,0xD5B5,0x0002,0xB0BB,0xEEC1,0x0043,0x002A,0x0015,0x000B, 0x0004,0x0001,0x0000,0xD2E6,0x0003,0x0000,0xD3AF,0x0002,0xC5E8,0xD6D1,0x0006,0x0003,0x0001,0xB1AD,0x0000,0xD3DB, 0x0000,0x0001,0xC3F3,0x0008,0x0004,0x0001,0x0000,0xD6E5,0x0000,0x0000,0xF1E4,0x0007,0x0003,0x0000,0xF1E5,0x0002, 0xF1E4,0xD6E5,0x0003,0x0000,0xF0E5,0x0000,0xC6A4,0x0006,0x0001,0x0000,0x0000,0x0000,0xF0AB,0x0009,0x0005,0x0001, 0x0002,0xB0A8,0xCEFA,0x0001,0x0000,0xCDEE,0x0006,0x0003,0x0001,0xF0A9,0x0001,0xB0A8,0x0001,0x0000,0xF0A8,0x002D, 0x0017,0x000B,0x0004,0x0000,0x0001,0xB8DE,0x0004,0x0002,0xF0A7,0xBBCA,0x0000,0xBDD4,0x0007,0x0003,0x0000,0xB5C4, 0x0002,0xD4ED,0xD4ED,0x0001,0x0002,0xB0D9,0xB0D7,0x0009,0x0005,0x0000,0x0002,0xB7A2,0xB5C7,0x0000,0x0000,0xB9EF, 0x0005,0x0001,0x0002,0xF1B2,0xCCB1,0x0004,0x0002,0xD3B8,0xF1B3,0x0002,0xF1AB,0xF1A8,0x0019,0x000B,0x0007,0x0004, 0x0002,0xD1A2,0xF1B2,0x0001,0xF1AE,0x0001,0x0001,0xD6A2,0x0008,0x0004,0x0002,0xF0DC,0xD1A2,0x0002,0xD1F7,0xB3D5, 0x0003,0x0001,0xB1F1,0x0000,0xF1AE,0x000A,0x0004,0x0000,0x0000,0xF1B0,0x0003,0x0000,0xF0DD,0x0000,0xF1B1,0x0006, 0x0003,0x0000,0xF1AF,0x0000,0xD3FA,0x0001,0x0001,0xF1AD,0x0169,0x00BA,0x005C,0x0029,0x0016,0x000A,0x0003,0x0000, 0xB0A9,0x0003,0x0000,0xF0F7,0x0002,0xF0EF,0xF0EC,0x0005,0x0001,0x0002,0xF1AA,0xC1C6,0x0003,0x0001,0xF1A5,0x0002, 0xF1A8,0xF1AB,0x0008,0x0004,0x0000,0x0001,0xF1A2,0x0000,0x0001,0xC8B3,0x0007,0x0004,0x0002,0xF1A9,0xD5CE,0x0000, 0xF1AC,0x0000,0x0001,0xF1A7,0x001D,0x000E,0x0007,0x0003,0x0000,0xF1A6,0x0002,0xCCB1,0xB1F1,0x0003,0x0000,0xB4F1, 0x0002,0xC5B1,0xCADD,0x0007,0x0004,0x0002,0xF0FB,0xC1F6,0x0001,0xF1A3,0x0004,0x0002,0xB4AF,0xF1A4,0x0002,0xCEC1, 0xF0F9,0x000C,0x0004,0x0001,0x0000,0xF1A1,0x0004,0x0002,0xF0FE,0xF0FC,0x0002,0xF0F9,0xE0B3,0x0006,0x0003,0x0000, 0xF0FD,0x0000,0xBBBE,0x0000,0x0001,0xF0F5,0x0031,0x001B,0x000D,0x0008,0x0004,0x0002,0xD1F1,0xF0F8,0x0002,0xB7E8, 0xF0FA,0x0000,0x0002,0xD3FA,0xF1A1,0x0006,0x0003,0x0000,0xF0F7,0x0000,0xF0F1,0x0004,0x0002,0xB4E1,0xF0F6,0x0002, 0xF0F4,0xF0E2,0x000A,0x0006,0x0003,0x0001,0xF0F3,0x0001,0xB1D4,0x0000,0x0000,0xB1D4,0x0007,0x0003,0x0001,0xB3D5, 0x0002,0xC2E9,0xC2E9,0x0000,0x0002,0xF0F2,0xCCB5,0x0017,0x000C,0x0005,0x0001,0x0002,0xF0EF,0xBBBE,0x0003,0x0001, 0xF0EC,0x0002,0xF0F0,0xF0ED,0x0007,0x0003,0x0001,0xF0EE,0x0002,0xF0EB,0xC1A1,0x0001,0x0001,0xC6A6,0x000B,0x0004, 0x0001,0x0000,0xCDB4,0x0004,0x0002,0xBEB7,0xB6BB,0x0001,0xF0E9,0x0007,0x0004,0x0002,0xBADB,0xD6CC,0x0001,0xD1F7, 0x0000,0x0001,0xBBD7,0x0065,0x0037,0x001D,0x000E,0x0007,0x0004,0x0002,0xF0EA,0xB6B2,0x0001,0xC8AC,0x0004,0x0002, 0xBEB7,0xD3B8,0x0000,0xD6A2,0x0008,0x0004,0x0002,0xB2A1,0xF0E4,0x0002,0xF0E7,0xF0E8,0x0003,0x0000,0xDAE7,0x0002, 0xF0F2,0xBCB2,0x000A,0x0005,0x0000,0x0002,0xBED2,0xCCDB,0x0000,0x0002,0xD5EE,0xF0E3,0x0008,0x0004,0x0002,0xB4C3, 0xF0E2,0x0002,0xF0E1,0xC6A3,0x0004,0x0002,0xF0E5,0xF0E6,0x0002,0xB7E8,0xB4AF,0x0015,0x0007,0x0000,0x0003,0x0001, 0xF0DF,0x0000,0xD2DF,0x0007,0x0004,0x0002,0xBDEA,0xB0CC,0x0000,0xF0E0,0x0004,0x0002,0xD1F1,0xF0DD,0x0000,0xC5B1, 0x000D,0x0006,0x0003,0x0000,0xF0DE,0x0001,0xBECE,0x0003,0x0000,0xB8ED,0x0002,0xC1C6,0xF0DC,0x0006,0x0003,0x0001, 0xF0DB,0x0001,0xF0DA,0x0003,0x0000,0xD2C9,0x0000,0xCAE8,0x0024,0x0012,0x000A,0x0005,0x0001,0x0002,0xF1E2,0xB5FE, 0x0001,0x0002,0xB3EB,0xBDAE,0x0004,0x0001,0x0000,0xEEB6,0x0001,0x0000,0xE7DC,0x0008,0x0001,0x0004,0x0002,0xEEB5, 0xBBFB,0x0001,0xB5B1,0x0006,0x0003,0x0001,0xB3EB,0x0001,0xEEB4,0x0000,0x0001,0xD2EC,0x0011,0x0009,0x0005,0x0001, 0x0002,0xBBAD,0xB7AC,0x0001,0x0001,0xC6E8,0x0000,0x0003,0x0000,0xC2D4,0x0002,0xB4F0,0xB1CF,0x000C,0x0008,0x0004, 0x0002,0xC4B6,0xD0F3,0x0002,0xEEB3,0xDBCE,0x0000,0x0000,0xC1F4,0x0004,0x0000,0x0001,0xC5CF,0x0001,0x0002,0xCEB7, 0xEEB0,0x00A2,0x005D,0x002D,0x0014,0x000A,0x0006,0x0003,0x0001,0xBDE7,0x0000,0xEEB1,0x0000,0x0001,0xEEB2,0x0004, 0x0000,0x0000,0xB3A9,0x0003,0x0001,0xEEAF,0x0001,0xE7DE,0x000B,0x0005,0x0001,0x0002,0xBBAD,0xEEAE,0x0003,0x0001, 0xB5E9,0x0000,0xC4D0,0x0007,0x0003,0x0000,0xB5E7,0x0002,0xC9EA,0xBCD7,0x0004,0x0002,0xD3C9,0xCCEF,0x0000,0xE5B8, 0x0019,0x000F,0x0008,0x0004,0x0002,0xB1C2,0xF0AE,0x0002,0xB8A6,0xBDC7,0x0004,0x0002,0xCBA6,0xD3C3,0x0001,0xCBD5, 0x0006,0x0003,0x0000,0xC9FB,0x0001,0xB2FA,0x0001,0x0000,0xC9FA,0x000B,0x0006,0x0003,0x0001,0xCCF0,0x0001,0xC9F5, 0x0000,0x0002,0xDFB0,0xB8CA,0x0006,0x0003,0x0000,0xCECD,0x0000,0xEAB6,0x0003,0x0000,0xEAB5,0x0000,0xEAB4,0x001D, 0x000E,0x0006,0x0000,0x0000,0x0002,0xDDF9,0xEAB1,0x0004,0x0000,0x0001,0xD5E7,0x0001,0x0000,0xEAB3,0x0006,0x0001, 0x0001,0x0002,0xB4C9,0xC6BF,0x0004,0x0000,0x0001,0xEAB2,0x0001,0x0002,0xEAB1,0xCECD,0x0014,0x0007,0x0001,0x0003, 0x0001,0xB8D7,0x0001,0xCDDF,0x0007,0x0003,0x0001,0xC8BF,0x0002,0xB0EA,0xC6B0,0x0003,0x0001,0xF0AD,0x0001,0xF0AC, 0x000A,0x0006,0x0003,0x0001,0xB9CF,0x0001,0xE8B6,0x0001,0x0001,0xCFE2,0x0006,0x0003,0x0001,0xE8AC,0x0001,0xE8B6, 0x0001,0x0000,0xE7E7,0x0033,0x0016,0x000A,0x0005,0x0000,0x0001,0x0001,0xC7ED,0x0001,0x0001,0x0000,0xE8AF,0x0007, 0x0000,0x0003,0x0000,0xE7F4,0x0001,0xE8B7,0x0001,0x0000,0x0001,0xBBB7,0x0011,0x0009,0x0001,0x0004,0x0002,0xE8B3, 0xE8B2,0x0002,0xE8B5,0xE8A8,0x0004,0x0001,0x0000,0xE7E1,0x0001,0x0001,0xE8B1,0x0005,0x0000,0x0000,0x0001,0xE8AB, 0x0001,0x0003,0x0001,0xE8B4,0x0001,0xE8AC,0x0023,0x0015,0x000A,0x0004,0x0001,0x0000,0xE8B0,0x0003,0x0000,0xE7F6, 0x0000,0xE8AF,0x0004,0x0001,0x0000,0xC1A7,0x0004,0x0002,0xE8AE,0xE8AD,0x0001,0xE8AA,0x0006,0x0001,0x0001,0x0002, 0xE8A8,0xD1FE,0x0001,0x0004,0x0002,0xD5F2,0xB9E5,0x0000,0xC0C5,0x0015,0x000A,0x0006,0x0003,0x0000,0xE8A9,0x0001, 0xC2EA,0x0000,0x0000,0xD3A8,0x0006,0x0003,0x0001,0xD1FE,0x0000,0xCBF6,0x0001,0x0002,0xC9AA,0xC8F0,0x000D,0x0007, 0x0003,0x0001,0xE8A4,0x0002,0xE7F8,0xBAF7,0x0003,0x0000,0xE8A7,0x0000,0xE8A5,0x0000,0x0000,0x0000,0xE8A6,0x0267, 0x0123,0x0087,0x0045,0x0022,0x000C,0x0005,0x0000,0x0001,0x0001,0xE7E2,0x0001,0x0003,0x0001,0xE8A3,0x0001,0xE7F5, 0x0008,0x0004,0x0001,0x0000,0xC7ED,0x0000,0x0000,0xB7A9,0x0008,0x0004,0x0002,0xC5C3,0xC5FD,0x0002,0xC7D9,0xC1D5, 0x0003,0x0001,0xB5F1,0x0000,0xE7FC,0x0015,0x000C,0x0006,0x0003,0x0000,0xE7FD,0x0000,0xE7FE,0x0003,0x0000,0xE7F7, 0x0000,0xE7FB,0x0005,0x0000,0x0002,0xE7F9,0xE7FA,0x0000,0x0000,0xD7C1,0x0008,0x0004,0x0001,0x0001,0xE8A1,0x0000, 0x0000,0xE8A2,0x0001,0x0001,0x0002,0xCBF6,0xE7F6,0x001E,0x0014,0x0009,0x0004,0x0000,0x0001,0xC1A7,0x0000,0x0002, 0xE7F0,0xC1F0,0x0007,0x0004,0x0002,0xC0ED,0xC0C5,0x0001,0xC7F2,0x0000,0x0001,0xE8AF,0x0005,0x0000,0x0000,0x0000, 0xCFD6,0x0001,0x0000,0x0000,0xE7F5,0x0014,0x000C,0x0005,0x0000,0x0002,0xC5E5,0xB0E0,0x0004,0x0002,0xB9E7,0xE7F1, 0x0001,0xE7F2,0x0004,0x0000,0x0001,0xE7ED,0x0001,0x0000,0xD6E9,0x0008,0x0004,0x0000,0x0000,0xE7F3,0x0000,0x0001, 0xE7EE,0x0001,0x0003,0x0001,0xE7E7,0x0002,0xB7A9,0xE7E5,0x004D,0x0028,0x0012,0x000B,0x0004,0x0000,0x0001,0xD5E4, 0x0004,0x0002,0xC9BA,0xE7EB,0x0000,0xE7EC,0x0001,0x0003,0x0000,0xE7E6,0x0000,0xE7EA,0x000B,0x0005,0x0001,0x0002, 0xB4C3,0xB2A3,0x0003,0x0000,0xE7F4,0x0001,0xE7E8,0x0004,0x0001,0x0001,0xE7E9,0x0003,0x0000,0xC1E1,0x0002,0xCFD6, 0xBBB7,0x0016,0x000C,0x0006,0x0003,0x0000,0xE7E2,0x0001,0xC3B5,0x0003,0x0001,0xCDE6,0x0000,0xE7E5,0x0004,0x0000, 0x0000,0xBEF6,0x0003,0x0000,0xE7E3,0x0001,0xE7E4,0x0005,0x0000,0x0001,0x0001,0xC2EA,0x0006,0x0003,0x0000,0xBEC1, 0x0000,0xEECB,0x0000,0x0001,0xE7E1,0x0030,0x0017,0x000C,0x0006,0x0003,0x0000,0xE7E0,0x0001,0xCDF5,0x0003,0x0001, 0xD3F1,0x0001,0xC2CA,0x0007,0x0004,0x0002,0xD7C8,0xC3EE,0x0000,0xD0FE,0x0001,0x0000,0xE2A4,0x000E,0x0007,0x0003, 0x0000,0xE2B5,0x0002,0xE2A8,0xCFD7,0x0003,0x0000,0xCCA1,0x0002,0xCADE,0xE1EE,0x0004,0x0000,0x0001,0xC1D4,0x0003, 0x0000,0xBBF1,0x0002,0xC4FC,0xE2B4,0x0013,0x000E,0x0008,0x0004,0x0002,0xE2A8,0xCCA1,0x0002,0xE2B3,0xE1FD,0x0003, 0x0000,0xE1F6,0x0000,0xB6C0,0x0001,0x0001,0x0000,0xE2B2,0x0005,0x0001,0x0001,0x0001,0xE2B1,0x0001,0x0003,0x0000, 0xE9E1,0x0000,0xE2AF,0x00A5,0x0056,0x0026,0x000F,0x0006,0x0000,0x0002,0xBDB1,0x0000,0xE2B0,0x0005,0x0001,0x0002, 0xCAA8,0xD3FC,0x0000,0x0000,0xB4F4,0x000C,0x0005,0x0000,0x0002,0xD4B3,0xBBAB,0x0003,0x0000,0xE1F8,0x0002,0xE2AA, 0xE2AD,0x0007,0x0004,0x0002,0xE9E0,0xD3CC,0x0001,0xBAEF,0x0001,0x0000,0xE2AE,0x0017,0x000D,0x0006,0x0003,0x0001, 0xCFD7,0x0001,0xE2AC,0x0004,0x0002,0xC3A8,0xD6ED,0x0000,0xD0C9,0x0004,0x0001,0x0000,0xE2AB,0x0003,0x0001,0xE2A9, 0x0000,0xE2A4,0x000D,0x0007,0x0003,0x0001,0xE2A6,0x0002,0xE2A7,0xB2C2,0x0003,0x0000,0xC3CD,0x0000,0xD5F8,0x0007, 0x0004,0x0002,0xE2A2,0xB2FE,0x0000,0xE2A8,0x0000,0x0002,0xE2A3,0xF7D0,0x002A,0x000F,0x0008,0x0004,0x0000,0x0001, 0xC1D4,0x0000,0x0001,0xE2A5,0x0001,0x0003,0x0000,0xE1FD,0x0000,0xE1FB,0x000D,0x0005,0x0001,0x0002,0xB1B7,0xC0C7, 0x0004,0x0002,0xE2A1,0xE1FE,0x0002,0xCFC1,0xC0EA,0x0006,0x0003,0x0000,0xE1FA,0x0001,0xE1F9,0x0004,0x0002,0xE1FC, 0xE1F8,0x0002,0xD3FC,0xD5F8,0x0013,0x000D,0x0008,0x0004,0x0002,0xE1F6,0xCAA8,0x0002,0xCFC1,0xB6C0,0x0001,0x0002, 0xE1F7,0xE1F5,0x0001,0x0001,0x0002,0xBDC6,0xBADD,0x0008,0x0004,0x0000,0x0001,0xC4FC,0x0001,0x0000,0xBED1,0x0004, 0x0000,0x0000,0xB9B7,0x0003,0x0001,0xE1F4,0x0001,0xBAFC,0x0048,0x0028,0x0017,0x000B,0x0007,0x0003,0x0001,0xE1F2, 0x0002,0xE1F3,0xD0C9,0x0001,0x0001,0xB1B7,0x0004,0x0001,0x0001,0xB5D2,0x0004,0x0002,0xE1F0,0xBFF1,0x0002,0xE1F1, 0xD7B4,0x0006,0x0001,0x0001,0x0002,0xD3CC,0xE1EF,0x0007,0x0004,0x0002,0xE1EE,0xD7B4,0x0001,0xE1ED,0x0001,0x0001, 0xE1EC,0x0010,0x0008,0x0000,0x0003,0x0000,0xB7B8,0x0002,0xE1EB,0xC8AE,0x0004,0x0000,0x0000,0xCEFE,0x0000,0x0001, 0xB6BF,0x0005,0x0000,0x0000,0x0000,0xEAF1,0x0004,0x0000,0x0001,0xDCFD,0x0004,0x0002,0xDBBB,0xEAFB,0x0000,0xEAF8, 0x002C,0x0016,0x000B,0x0006,0x0003,0x0000,0xEAFA,0x0000,0xEAF9,0x0000,0x0002,0xEAF8,0xB6BF,0x0006,0x0003,0x0001, 0xCCD8,0x0001,0xEAF7,0x0001,0x0002,0xC0E7,0xCFAC,0x000D,0x0007,0x0004,0x0002,0xEAF6,0xEAF5,0x0000,0xC7A3,0x0003, 0x0001,0xCEFE,0x0000,0xCCD8,0x0005,0x0001,0x0002,0xC7A3,0xB5D6,0x0000,0x0001,0xC9FC,0x0016,0x0009,0x0005,0x0000, 0x0002,0xEAF4,0xEAF0,0x0001,0x0000,0xCEEF,0x0005,0x0000,0x0002,0xC4C1,0xEAF3,0x0004,0x0002,0xC8CD,0xC0CE,0x0002, 0xC4B5,0xCBFC,0x000D,0x0006,0x0003,0x0000,0xC4B2,0x0000,0xEAF2,0x0003,0x0000,0xC5A3,0x0002,0xD1C0,0xEBB9,0x0004, 0x0000,0x0001,0xEBBB,0x0000,0x0001,0xEBBA,0x011F,0x008B,0x0049,0x002F,0x0015,0x000A,0x0005,0x0002,0xF1BE,0x0001, 0xEBB9,0x0000,0x0002,0xC5C6,0xBCE3,0x0007,0x0004,0x0002,0xB0E6,0xC6AC,0x0000,0xC7BD,0x0001,0x0001,0xBFC2,0x000E, 0x0007,0x0003,0x0001,0xE3DD,0x0002,0xB6FB,0xCBAC,0x0003,0x0001,0xD8B3,0x0002,0xD2AF,0xB5F9,0x0008,0x0004,0x0002, 0xB0D6,0xD2AF,0x0002,0xB8B8,0xBEF4,0x0001,0x0001,0xB0AE,0x0011,0x000C,0x0006,0x0003,0x0000,0xEBBC,0x0001,0xD5F9, 0x0003,0x0000,0xC5C0,0x0000,0xD7A6,0x0000,0x0000,0x0000,0xECE0,0x0000,0x0004,0x0001,0x0001,0xECDF,0x0000,0x0001, 0xC0C3,0x001C,0x000C,0x0007,0x0000,0x0003,0x0000,0xC2AF,0x0001,0xCBB8,0x0000,0x0001,0x0000,0xB1AC,0x000B,0x0004, 0x0001,0x0000,0xECE2,0x0004,0x0002,0xBDFD,0xD1AC,0x0001,0xECDE,0x0001,0x0000,0x0000,0xBBE2,0x0011,0x0009,0x0005, 0x0001,0x0002,0xDBC6,0xD6F2,0x0000,0x0000,0xBBD9,0x0000,0x0003,0x0001,0xECDD,0x0002,0xB2D3,0xD4EF,0x000B,0x0005, 0x0000,0x0002,0xECDB,0xD3AA,0x0003,0x0000,0xECCB,0x0001,0xCCCC,0x0004,0x0001,0x0001,0xD1E0,0x0003,0x0000,0xECDC, 0x0000,0xC9D5,0x0045,0x0027,0x0015,0x000A,0x0006,0x0003,0x0000,0xC1D7,0x0000,0xC1C7,0x0001,0x0001,0xECC0,0x0004, 0x0000,0x0000,0xB5C6,0x0004,0x0002,0xD1E6,0xC8BC,0x0001,0xECC7,0x0008,0x0004,0x0001,0x0000,0xB3E3,0x0001,0x0001, 0xECE4,0x0004,0x0001,0x0001,0xECD8,0x0003,0x0001,0xECD7,0x0001,0xC8C8,0x000A,0x0005,0x0001,0x0000,0x0000,0xB0BE, 0x0000,0x0000,0x0000,0xECD9,0x0009,0x0005,0x0000,0x0002,0xECDA,0xCAEC,0x0001,0x0001,0xCEF5,0x0005,0x0000,0x0002, 0xECD6,0xECC1,0x0003,0x0000,0xC8DB,0x0000,0xD3AB,0x001F,0x000D,0x0008,0x0004,0x0000,0x0001,0xD1AC,0x0001,0x0000, 0xD0DC,0x0001,0x0000,0x0000,0xCFA8,0x0008,0x0004,0x0001,0x0001,0xC9BF,0x0001,0x0000,0xECD5,0x0004,0x0000,0x0000, 0xECD4,0x0003,0x0001,0xECCE,0x0000,0xECD2,0x0019,0x000A,0x0004,0x0001,0x0000,0xD6F3,0x0003,0x0000,0xECBE,0x0001, 0xB7B3,0x0008,0x0004,0x0002,0xECD0,0xD5D5,0x0002,0xECE3,0xBBC0,0x0004,0x0002,0xC3BA,0xC8E0,0x0000,0xDCE4,0x000D, 0x0007,0x0004,0x0002,0xD5A8,0xDFDC,0x0000,0xC9B7,0x0003,0x0000,0xECCF,0x0001,0xD1CC,0x0004,0x0001,0x0000,0xC5AF, 0x0003,0x0000,0xC9BC,0x0000,0xECBF,0x0086,0x003D,0x001B,0x0012,0x000B,0x0004,0x0001,0x0000,0xBCE5,0x0003,0x0000, 0xBBCD,0x0002,0xECD3,0xC1B6,0x0000,0x0003,0x0001,0xBBD4,0x0001,0xECD1,0x0001,0x0004,0x0001,0x0000,0xC8BB,0x0001, 0x0001,0xECCD,0x000E,0x0006,0x0000,0x0000,0x0002,0xD1E6,0xECCC,0x0004,0x0001,0x0000,0xBDB9,0x0001,0x0001,0xCEDE, 0x0009,0x0004,0x0000,0x0000,0xB4E3,0x0001,0x0002,0xB7D9,0xB1BA,0x0007,0x0003,0x0000,0xECE2,0x0002,0xECCB,0xBBC0, 0x0000,0x0001,0xECCA,0x0021,0x0011,0x0009,0x0004,0x0000,0x0000,0xECC9,0x0001,0x0002,0xBAB8,0xD1C9,0x0004,0x0001, 0x0000,0xE4B8,0x0000,0x0000,0xD1AC,0x0008,0x0004,0x0001,0x0001,0xB7E9,0x0001,0x0001,0xC5EB,0x0004,0x0000,0x0001, 0xCDE9,0x0000,0x0000,0xCCFE,0x0019,0x000E,0x0007,0x0004,0x0002,0xE2D2,0xCFA9,0x0001,0xC8C8,0x0004,0x0002,0xBDFD, 0xCCCC,0x0001,0xBBE2,0x0007,0x0004,0x0002,0xECC7,0xC9D5,0x0000,0xB7B3,0x0000,0x0000,0xBFBE,0x000A,0x0004,0x0000, 0x0001,0xD1CC,0x0003,0x0001,0xD6F2,0x0001,0xC0D3,0x0000,0x0000,0x0000,0xBAE6,0x0054,0x002E,0x0015,0x000A,0x0004, 0x0000,0x0001,0xCEDA,0x0003,0x0001,0xD0DD,0x0000,0xECC8,0x0004,0x0000,0x0000,0xC1D2,0x0003,0x0001,0xCCFE,0x0002, 0xC0C3,0xCBB8,0x000E,0x0006,0x0003,0x0000,0xECC3,0x0001,0xB3E3,0x0004,0x0002,0xC1B6,0xECC2,0x0002,0xCEAA,0xB5E3, 0x0005,0x0000,0x0002,0xD5A8,0xECC4,0x0003,0x0001,0xB1FE,0x0001,0xECC6,0x0011,0x000C,0x0007,0x0003,0x0001,0xBEBC, 0x0002,0xC5DA,0xCCBF,0x0000,0x0002,0xBEE6,0xECC5,0x0001,0x0000,0x0000,0xD5D5,0x000A,0x0004,0x0001,0x0001,0xECC1, 0x0003,0x0000,0xECBF,0x0001,0xD6CB,0x0005,0x0001,0x0002,0xECC0,0xBFBB,0x0003,0x0000,0xC8B2,0x0000,0xB3B4,0x0025, 0x000E,0x0009,0x0004,0x0001,0x0000,0xD1D7,0x0001,0x0002,0xB4B6,0xC2AF,0x0000,0x0001,0x0001,0xEAC1,0x000C,0x0008, 0x0004,0x0002,0xECBE,0xB2D3,0x0002,0xD4D6,0xD4D6,0x0000,0x0000,0xD7C6,0x0007,0x0003,0x0000,0xBEC4,0x0002,0xD4EE, 0xC1E9,0x0000,0x0000,0xBAE6,0x0012,0x000C,0x0007,0x0004,0x0002,0xBBD2,0xB5C6,0x0001,0xC3F0,0x0000,0x0002,0xECE1, 0xBBF0,0x0001,0x0000,0x0002,0xC2D0,0xCDE5,0x0006,0x0000,0x0001,0x0002,0xE5B1,0xE5B0,0x0006,0x0003,0x0000,0xCCB2, 0x0001,0xC0EC,0x0001,0x0001,0xC8F7,0x09EA,0x0541,0x0265,0x011A,0x0087,0x0042,0x001E,0x000F,0x0008,0x0004,0x0001, 0x0000,0xE5B0,0x0000,0x0001,0xB9E0,0x0001,0x0003,0x0001,0xE4DC,0x0000,0xE3E3,0x0005,0x0000,0x0001,0x0001,0xC0BD, 0x0004,0x0000,0x0000,0xE5AE,0x0003,0x0000,0xE5AF,0x0001,0xE4F2,0x000F,0x0005,0x0000,0x0000,0x0001,0xC3D6,0x0006, 0x0003,0x0001,0xE4FE,0x0000,0xE3F1,0x0001,0x0000,0xE5AC,0x000D,0x0006,0x0003,0x0001,0xE4EB,0x0000,0xE4EC,0x0003, 0x0000,0xC1A4,0x0002,0xE5AD,0xE5AB,0x0004,0x0000,0x0001,0xE3F2,0x0000,0x0000,0xB1F4,0x001C,0x0011,0x000A,0x0006, 0x0003,0x0000,0xC6D9,0x0000,0xE4AF,0x0001,0x0000,0xC9F2,0x0000,0x0003,0x0000,0xD0BA,0x0001,0xE4C2,0x0000,0x0004, 0x0001,0x0001,0xC2CB,0x0003,0x0001,0xE3F8,0x0001,0xBDA6,0x0013,0x000E,0x0008,0x0004,0x0002,0xB1F5,0xCEAB,0x0002, 0xE5AA,0xE5A7,0x0003,0x0001,0xBFA3,0x0000,0xC0C4,0x0001,0x0000,0x0001,0xCCCE,0x000C,0x0008,0x0004,0x0002,0xE5A6, 0xE5A9,0x0002,0xBCC3,0xE5A8,0x0001,0x0000,0xC3C9,0x0004,0x0000,0x0001,0xC5A2,0x0003,0x0000,0xCAAA,0x0001,0xB1F4, 0x003D,0x001E,0x000E,0x0005,0x0000,0x0000,0x0000,0xE4FE,0x0004,0x0000,0x0000,0xE5A1,0x0001,0x0002,0xC5A8,0xE5A5, 0x0006,0x0000,0x0000,0x0002,0xD7C7,0xBCA4,0x0006,0x0003,0x0000,0xE5A3,0x0001,0xE5A4,0x0001,0x0000,0xB0C4,0x0011, 0x0007,0x0000,0x0003,0x0000,0xB5ED,0x0001,0xE4AB,0x0006,0x0003,0x0000,0xEDB4,0x0000,0xE5A2,0x0000,0x0001,0xD4F3, 0x0009,0x0005,0x0000,0x0002,0xD4E8,0xE4C5,0x0000,0x0001,0xC0BD,0x0000,0x0001,0x0000,0xBDA7,0x002F,0x0017,0x0009, 0x0004,0x0001,0x0001,0xC5EC,0x0000,0x0002,0xE4F8,0xE4F9,0x0008,0x0004,0x0002,0xE4F7,0xB3BA,0x0002,0xC0D4,0xBDBD, 0x0003,0x0001,0xB3CE,0x0001,0xB3CE,0x000C,0x0006,0x0003,0x0001,0xC9AC,0x0000,0xE4B6,0x0003,0x0001,0xE4FC,0x0001, 0xE4FD,0x0006,0x0003,0x0001,0xE4FA,0x0000,0xE4E4,0x0003,0x0001,0xE4F3,0x0001,0xE4FB,0x0015,0x000B,0x0007,0x0003, 0x0001,0xC0A3,0x0002,0xE4B1,0xB3B1,0x0000,0x0000,0xCCB6,0x0004,0x0001,0x0001,0xC1CA,0x0003,0x0001,0xC8F3,0x0001, 0xE4EA,0x000A,0x0004,0x0001,0x0001,0xC2BA,0x0003,0x0001,0xC7B1,0x0000,0xC7B1,0x0004,0x0000,0x0001,0xC5CB,0x0000, 0x0001,0xBDE0,0x00AD,0x0056,0x0028,0x0011,0x0009,0x0003,0x0000,0xC6C3,0x0003,0x0001,0xCEAB,0x0001,0xE4F2,0x0004, 0x0001,0x0001,0xE4EC,0x0000,0x0000,0xE4EB,0x000C,0x0006,0x0003,0x0001,0xF2A3,0x0001,0xBDAC,0x0003,0x0000,0xD1FA, 0x0000,0xB4DD,0x0004,0x0001,0x0000,0xBDA5,0x0004,0x0002,0xE4F1,0xE4D3,0x0001,0xD5C4,0x001C,0x000E,0x0007,0x0004, 0x0002,0xD5C7,0xCAFE,0x0001,0xE4F0,0x0003,0x0001,0xE4DD,0x0002,0xD7D5,0xC2FE,0x0007,0x0004,0x0002,0xE4F4,0xE4F6, 0x0001,0xB8C9,0x0003,0x0001,0xCDDD,0x0002,0xE4ED,0xC1B0,0x0007,0x0000,0x0003,0x0000,0xBABA,0x0000,0xC4AE,0x0004, 0x0000,0x0000,0xC5BD,0x0003,0x0001,0xE4EE,0x0002,0xD1DD,0xC0EC,0x0025,0x000F,0x0005,0x0000,0x0001,0x0001,0xC2A9, 0x0004,0x0000,0x0001,0xE4F5,0x0003,0x0000,0xC6E1,0x0001,0xBCC5,0x000B,0x0007,0x0004,0x0002,0xC6AF,0xD3E6,0x0001, 0xC2FA,0x0000,0x0000,0xB9F6,0x0007,0x0003,0x0001,0xE4EF,0x0002,0xE4B0,0xC2B1,0x0001,0x0000,0xB5CE,0x0017,0x000A, 0x0006,0x0003,0x0000,0xC9F8,0x0001,0xD6CD,0x0001,0x0000,0xBBA6,0x0006,0x0003,0x0001,0xCCB2,0x0000,0xB1F5,0x0004, 0x0002,0xC2D0,0xC0C4,0x0000,0xC2CB,0x000E,0x0008,0x0004,0x0002,0xE4DE,0xC2FA,0x0002,0xE4DC,0xE4D9,0x0003,0x0000, 0xD6CD,0x0000,0xE0C6,0x0006,0x0003,0x0000,0xB9F6,0x0001,0xE4E4,0x0003,0x0001,0xEBF8,0x0002,0xCCCF,0xD7D2,0x005E, 0x0032,0x001A,0x000D,0x0006,0x0003,0x0001,0xBBAC,0x0001,0xE4E6,0x0003,0x0000,0xDCFE,0x0002,0xB5D3,0xD7CC,0x0007, 0x0003,0x0000,0xC6FB,0x0002,0xB8E4,0xB5E1,0x0003,0x0001,0xC3F0,0x0000,0xB2D7,0x000C,0x0005,0x0000,0x0002,0xE4E8, 0xB3FC,0x0003,0x0001,0xE4E1,0x0002,0xCAAA,0xE4E2,0x0006,0x0003,0x0000,0xC4E7,0x0001,0xE4E3,0x0003,0x0000,0xC8DC, 0x0000,0xE4E5,0x0015,0x000B,0x0007,0x0004,0x0002,0xE4D1,0xE4DA,0x0001,0xCBDD,0x0001,0x0001,0xCEC2,0x0006,0x0003, 0x0000,0xCFAA,0x0001,0xE4E0,0x0000,0x0001,0xE4DF,0x000D,0x0006,0x0003,0x0000,0xD2E7,0x0001,0xE4E9,0x0004,0x0002, 0xE4D1,0xB9B5,0x0000,0xC1EF,0x0004,0x0001,0x0000,0xE4DB,0x0003,0x0000,0xD7BC,0x0001,0xD5B3,0x001C,0x0013,0x0006, 0x0000,0x0001,0x0002,0xD4B4,0xE4E7,0x0006,0x0003,0x0001,0xB8C8,0x0000,0xE3ED,0x0004,0x0002,0xE4D3,0xBDA6,0x0001, 0xC0A3,0x0000,0x0004,0x0001,0x0001,0xCAAA,0x0000,0x0000,0xCDE5,0x000F,0x000A,0x0004,0x0001,0x0001,0xCCC0,0x0003, 0x0000,0xE4CE,0x0001,0xE4D0,0x0000,0x0001,0x0001,0xD3BF,0x000A,0x0004,0x0001,0x0001,0xE4D2,0x0003,0x0000,0xE4A5, 0x0001,0xD5BF,0x0004,0x0001,0x0000,0xCFE6,0x0003,0x0000,0xBAFE,0x0002,0xE4D5,0xE4D4,0x015A,0x00B1,0x0056,0x0021, 0x000F,0x0007,0x0001,0x0003,0x0001,0xE4CF,0x0000,0xCDC4,0x0004,0x0000,0x0001,0xB4D5,0x0001,0x0001,0xE4D8,0x0008, 0x0004,0x0000,0x0000,0xC5C8,0x0000,0x0001,0xBBEB,0x0006,0x0003,0x0001,0xC3EC,0x0001,0xD3CE,0x0001,0x0001,0xBFCA, 0x001C,0x000F,0x0007,0x0004,0x0002,0xB6FD,0xE4D6,0x0001,0xD1CD,0x0004,0x0002,0xB8DB,0xBACA,0x0002,0xCEBC,0xB2E2, 0x0006,0x0003,0x0000,0xE4CD,0x0000,0xCEC2,0x0003,0x0001,0xCED0,0x0002,0xE4D7,0xB2B3,0x000B,0x0007,0x0003,0x0000, 0xD4FC,0x0002,0xB6C9,0xC7FE,0x0001,0x0000,0xD3E5,0x0007,0x0004,0x0002,0xBCF5,0xE4BE,0x0000,0xBBC1,0x0004,0x0002, 0xC9F8,0xE4C9,0x0001,0xD3E6,0x0027,0x0014,0x000C,0x0005,0x0001,0x0002,0xE4C5,0xBDA5,0x0003,0x0001,0xE4C2,0x0002, 0xD7D5,0xE4CB,0x0004,0x0000,0x0001,0xD4A8,0x0001,0x0000,0xC7E5,0x0005,0x0001,0x0001,0x0001,0xEDB5,0x0007,0x0004, 0x0002,0xCCED,0xC7B3,0x0000,0xD1CD,0x0004,0x0002,0xBBEC,0xE4B5,0x0000,0xD4A8,0x001C,0x000E,0x0007,0x0003,0x0000, 0xB4BE,0x0002,0xC9EE,0xEEBD,0x0004,0x0002,0xD3FD,0xBBB4,0x0001,0xB4E3,0x0008,0x0004,0x0002,0xD2F9,0xC2D9,0x0002, 0xC1E8,0xBEBB,0x0003,0x0001,0xE4C6,0x0001,0xD3D9,0x000C,0x0005,0x0001,0x0002,0xB5AD,0xE4C4,0x0003,0x0001,0xE4C1, 0x0002,0xE4C7,0xB7EB,0x0008,0x0004,0x0002,0xE4C0,0xC0E1,0x0002,0xE4C8,0xCCD4,0x0000,0x0001,0xC4D7,0x0059,0x002A, 0x0016,0x000A,0x0006,0x0003,0x0001,0xC6E0,0x0000,0xCAE7,0x0001,0x0001,0xCCCA,0x0004,0x0000,0x0000,0xC1DC,0x0004, 0x0002,0xE4BF,0xCFFD,0x0002,0xE4C0,0xD7CD,0x000C,0x0006,0x0003,0x0001,0xB5C3,0x0001,0xB5ED,0x0003,0x0000,0xE4C3, 0x0001,0xC1B9,0x0004,0x0001,0x0001,0xBAD4,0x0001,0x0000,0xBAAD,0x0018,0x0009,0x0004,0x0000,0x0001,0xD2BA,0x0000, 0x0002,0xD1C4,0xE4CC,0x0008,0x0004,0x0002,0xE4CA,0xB8A2,0x0002,0xC9AC,0xD5C7,0x0004,0x0002,0xBDA7,0xC8F3,0x0001, 0xB5D3,0x000E,0x0007,0x0003,0x0000,0xBBC1,0x0002,0xCED0,0xE4B6,0x0004,0x0002,0xC1B0,0xE4B5,0x0000,0xC0D4,0x0004, 0x0000,0x0000,0xCCCE,0x0001,0x0002,0xCCE9,0xE4B9,0x002A,0x0017,0x000C,0x0006,0x0003,0x0000,0xE4B8,0x0000,0xE4B3, 0x0003,0x0001,0xCFD1,0x0001,0xD3BF,0x0005,0x0001,0x0002,0xC9E6,0xCFFB,0x0003,0x0000,0xE3FE,0x0000,0xC4F9,0x0008, 0x0004,0x0000,0x0001,0xCDBF,0x0001,0x0001,0xE4BC,0x0005,0x0001,0x0002,0xE4A4,0xBDFE,0x0003,0x0000,0xBAA3,0x0001, 0xD4A1,0x0010,0x0006,0x0001,0x0000,0x0002,0xE4B4,0xB8A1,0x0006,0x0003,0x0001,0xC0CB,0x0000,0xBAC6,0x0000,0x0001, 0xC6D6,0x000C,0x0006,0x0003,0x0000,0xE4BD,0x0001,0xE4BB,0x0003,0x0001,0xE4B7,0x0001,0xE4BA,0x0006,0x0003,0x0001, 0xBFA3,0x0000,0xD5E3,0x0001,0x0001,0xE4B1,0x00C0,0x005E,0x0036,0x001C,0x000E,0x0007,0x0004,0x0002,0xC5A8,0xE4B0, 0x0000,0xBBEB,0x0004,0x0002,0xE4AF,0xBCC3,0x0000,0xE4AB,0x0007,0x0004,0x0002,0xB2E2,0xD7C7,0x0001,0xE4A5,0x0004, 0x0002,0xBDBD,0xBDAC,0x0000,0xC7B3,0x000E,0x0006,0x0003,0x0000,0xE4A4,0x0000,0xC1F7,0x0004,0x0002,0xCEDB,0xC5C9, 0x0002,0xC7A2,0xCDDD,0x0006,0x0003,0x0000,0xBBEE,0x0000,0xE4A1,0x0003,0x0001,0xD0DA,0x0000,0xE4AD,0x0018,0x000B, 0x0007,0x0004,0x0002,0xE4B2,0xD6DE,0x0000,0xB6FD,0x0000,0x0001,0xE4AC,0x0007,0x0004,0x0002,0xE4AA,0xBAE9,0x0000, 0xD0B9,0x0003,0x0000,0xE4A2,0x0000,0xBDF2,0x0005,0x0001,0x0000,0x0001,0xB6B4,0x0007,0x0004,0x0002,0xC2E5,0xE4AE, 0x0000,0xE4A8,0x0000,0x0000,0xCFB4,0x002F,0x0015,0x000A,0x0004,0x0000,0x0001,0xC8F7,0x0003,0x0001,0xE4A9,0x0001, 0xE4A3,0x0005,0x0000,0x0002,0xD1F3,0xBCF6,0x0003,0x0000,0xE4A6,0x0001,0xE4A7,0x000C,0x0005,0x0001,0x0002,0xBDE0, 0xB0E3,0x0003,0x0001,0xE3FE,0x0002,0xD4F3,0xC6C3,0x0007,0x0004,0x0002,0xD0BA,0xE3F8,0x0001,0xE3F2,0x0004,0x0002, 0xE3F1,0xEDB4,0x0000,0xB1C3,0x0019,0x000E,0x0007,0x0003,0x0000,0xD3BE,0x0002,0xE3F3,0xCCA9,0x0004,0x0002,0xE3FD, 0xE3FA,0x0000,0xE8F5,0x0007,0x0004,0x0002,0xE3F9,0xC0E1,0x0001,0xD7A2,0x0001,0x0000,0xC4E0,0x000E,0x0008,0x0004, 0x0002,0xC6FC,0xB2A8,0x0002,0xC5DD,0xE3F6,0x0003,0x0001,0xC5A2,0x0000,0xCBDD,0x0004,0x0000,0x0000,0xB7BA,0x0004, 0x0002,0xE3F4,0xE3F7,0x0002,0xB7A8,0xE3EF,0x0061,0x002D,0x0019,0x000C,0x0006,0x0003,0x0000,0xE3FC,0x0001,0xE3EE, 0x0003,0x0000,0xC9E6,0x0001,0xC3DA,0x0006,0x0003,0x0001,0xB2B4,0x0000,0xC8AA,0x0003,0x0001,0xD2E7,0x0002,0xC7F6, 0xD0B9,0x000C,0x0004,0x0001,0x0000,0xBFF6,0x0004,0x0002,0xD1D8,0xD5B4,0x0002,0xB9C1,0xD5D3,0x0000,0x0003,0x0000, 0xD6CE,0x0002,0xD3CD,0xB7D0,0x001C,0x000D,0x0007,0x0004,0x0002,0xBAD3,0xE3F5,0x0000,0xE3FB,0x0003,0x0001,0xBEDA, 0x0000,0xE3F0,0x0007,0x0004,0x0002,0xC4AD,0xBBA6,0x0000,0xE3ED,0x0004,0x0002,0xB2D7,0xC2D9,0x0002,0xC1A4,0xC5BD, 0x000C,0x0006,0x0003,0x0000,0xE3E3,0x0000,0xC3BB,0x0003,0x0000,0xB9B5,0x0001,0xE3FA,0x0006,0x0003,0x0000,0xC5E6, 0x0000,0xC9B3,0x0003,0x0001,0xB3E5,0x0001,0xE3E6,0x0033,0x001A,0x000E,0x0007,0x0004,0x0002,0xEDB3,0xC3BB,0x0001, 0xE3E5,0x0003,0x0000,0xC6E3,0x0002,0xD9FC,0xE3E7,0x0005,0x0001,0x0002,0xB3C1,0xC9F2,0x0004,0x0002,0xD9F0,0xE3EC, 0x0000,0xE3E4,0x000D,0x0007,0x0004,0x0002,0xCED6,0xD2CA,0x0000,0xC7DF,0x0003,0x0001,0xB7DA,0x0000,0xC6FB,0x0006, 0x0003,0x0001,0xBEF6,0x0000,0xD0DA,0x0003,0x0001,0xE3EB,0x0001,0xE3EA,0x0014,0x0007,0x0000,0x0003,0x0001,0xBCB3, 0x0001,0xCCAD,0x0007,0x0003,0x0001,0xCDF4,0x0002,0xE3E8,0xE3E8,0x0003,0x0000,0xE1A9,0x0001,0xCCC0,0x000D,0x0005, 0x0001,0x0002,0xCEDB,0xB3D8,0x0004,0x0002,0xBDAD,0xB9AF,0x0002,0xC8EA,0xE3E1,0x0006,0x0003,0x0000,0xD1B4,0x0000, 0xCEDB,0x0003,0x0000,0xBAB9,0x0002,0xC9C7,0xE3E0,0x0268,0x0162,0x00B4,0x0061,0x002A,0x0017,0x000A,0x0004,0x0001, 0x0000,0xC3A3,0x0003,0x0000,0xCFAB,0x0000,0xB7BA,0x0007,0x0003,0x0001,0xE5AE,0x0002,0xE3E2,0xBABA,0x0003,0x0001, 0xBBE3,0x0000,0xD9DB,0x000C,0x0005,0x0001,0x0002,0xC7F3,0xD6AD,0x0003,0x0000,0xCDA1,0x0002,0xB7BA,0xD9DB,0x0001, 0x0003,0x0000,0xD3C0,0x0001,0xE3DF,0x001D,0x000E,0x0007,0x0004,0x0002,0xCBAE,0xEBB5,0x0000,0xEBB5,0x0004,0x0002, 0xC7E8,0xC2C8,0x0000,0xB5AA,0x0008,0x0004,0x0002,0xEBB2,0xC7E2,0x0002,0xEBB4,0xEBB2,0x0004,0x0002,0xB0B1,0xD1F5, 0x0000,0xBAA4,0x000C,0x0008,0x0004,0x0002,0xEBB3,0xC6F8,0x0002,0xC7E2,0xEBB1,0x0000,0x0001,0xB7FA,0x0007,0x0003, 0x0001,0xB7D5,0x0002,0xEBB0,0xEBAF,0x0003,0x0000,0xEBAE,0x0002,0xC4CA,0xEBAD,0x002C,0x001A,0x000E,0x0007,0x0004, 0x0002,0xC6F8,0xC3A5,0x0001,0xC3F1,0x0004,0x0002,0xD8B5,0xCACF,0x0001,0xEBAC,0x0004,0x0000,0x0000,0xEBAA,0x0004, 0x0002,0xD5B1,0xEBAA,0x0002,0xEBAB,0xEBA9,0x000A,0x0004,0x0001,0x0000,0xEAF3,0x0003,0x0001,0xEBA7,0x0001,0xEBA6, 0x0004,0x0001,0x0001,0xEBA8,0x0001,0x0001,0xEBA7,0x0013,0x0008,0x0004,0x0000,0x0001,0xEBA5,0x0000,0x0001,0xCCBA, 0x0007,0x0004,0x0002,0xC7F2,0xBAC1,0x0000,0xEBA4,0x0000,0x0001,0xC8DE,0x0005,0x0000,0x0001,0x0001,0xD5B1,0x0007, 0x0003,0x0001,0xC3AB,0x0002,0xB2C5,0xB1D0,0x0004,0x0002,0xC5FE,0xC5FE,0x0002,0xB1D1,0xB1CF,0x005A,0x002F,0x0017, 0x000D,0x0007,0x0004,0x0002,0xB1C8,0xD8B9,0x0000,0xB6BE,0x0003,0x0001,0xC3BF,0x0001,0xC4B8,0x0005,0x0000,0x0002, 0xCEE3,0xCEE3,0x0001,0x0002,0xC5B9,0xD2E3,0x000C,0x0005,0x0001,0x0002,0xECB1,0xBBD9,0x0004,0x0002,0xBBD9,0xB5EE, 0x0001,0xCFFD,0x0006,0x0003,0x0000,0xBFC7,0x0000,0xC9B1,0x0003,0x0001,0xD2F3,0x0001,0xB6CE,0x0014,0x000D,0x0007, 0x0004,0x0002,0xC5B9,0xECAF,0x0000,0xBCDF,0x0003,0x0001,0xE9EB,0x0000,0xE9E7,0x0000,0x0003,0x0001,0xE9E9,0x0000, 0xE9EC,0x000A,0x0006,0x0003,0x0000,0xE9E4,0x0001,0xE9EB,0x0001,0x0000,0xE9E6,0x0006,0x0003,0x0001,0xE9EA,0x0000, 0xE9E9,0x0004,0x0002,0xB2D0,0xD1DA,0x0000,0xD6B3,0x0030,0x0017,0x000A,0x0006,0x0003,0x0001,0xE9E7,0x0000,0xE9E6, 0x0001,0x0001,0xE9E8,0x0007,0x0003,0x0001,0xB2D0,0x0002,0xCAE2,0xD1B3,0x0003,0x0001,0xE9E4,0x0000,0xB4F9,0x000D, 0x0008,0x0004,0x0002,0xE9E5,0xD1EA,0x0002,0xE9E3,0xE9E2,0x0000,0x0002,0xD8B2,0xE9E2,0x0007,0x0004,0x0002,0xBCDF, 0xCBC0,0x0001,0xB4F5,0x0000,0x0002,0xB9E9,0xC0FA,0x0013,0x0008,0x0004,0x0001,0x0000,0xCBEA,0x0001,0x0001,0xF5D8, 0x0004,0x0001,0x0000,0xCDE1,0x0003,0x0001,0xC6E7,0x0002,0xCEE4,0xB2BD,0x000C,0x0008,0x0004,0x0002,0xB4CB,0xD5FD, 0x0002,0xD6B9,0xBBB6,0x0000,0x0001,0xECA3,0x0000,0x0001,0x0001,0xECA8,0x008D,0x0050,0x002D,0x0014,0x0007,0x0001, 0x0003,0x0001,0xC5B7,0x0001,0xCCBE,0x0005,0x0000,0x0002,0xCED8,0xB8E8,0x0004,0x0002,0xC7B8,0xD3E4,0x0002,0xD0AA, 0xECA7,0x000C,0x0007,0x0003,0x0000,0xE4CE,0x0002,0xECA6,0xF2A7,0x0001,0x0002,0xBFB2,0xBFEE,0x0006,0x0003,0x0000, 0xC7D5,0x0001,0xC6DB,0x0003,0x0000,0xECA5,0x0002,0xECA4,0xE0CA,0x0010,0x0008,0x0004,0x0001,0x0001,0xD3FB,0x0000, 0x0000,0xBAC8,0x0004,0x0000,0x0001,0xBFC8,0x0001,0x0000,0xC5B7,0x000E,0x0007,0x0003,0x0001,0xECA3,0x0002,0xD0C0, 0xBBB6,0x0004,0x0002,0xB4CE,0xC7B7,0x0001,0xE8F9,0x0001,0x0001,0x0001,0xE9AD,0x001B,0x000D,0x0008,0x0004,0x0001, 0x0001,0xE8EF,0x0001,0x0000,0xE9A1,0x0000,0x0001,0x0001,0xC8A8,0x0005,0x0000,0x0000,0x0001,0xC0B8,0x0005,0x0001, 0x0002,0xD3A3,0xE8F9,0x0000,0x0001,0xE9B7,0x0011,0x0005,0x0000,0x0001,0x0000,0xE8D0,0x0006,0x0003,0x0001,0xE9B4, 0x0001,0xE8C0,0x0003,0x0001,0xE8D3,0x0000,0xE9C6,0x0009,0x0004,0x0000,0x0000,0xB3F7,0x0001,0x0002,0xE8DD,0xE9DA, 0x0000,0x0003,0x0000,0xE8FC,0x0002,0xE8CE,0xE9B5,0x0037,0x0014,0x0006,0x0000,0x0000,0x0001,0x0000,0xE9D6,0x0006, 0x0000,0x0001,0x0002,0xB9F1,0xE8FE,0x0004,0x0001,0x0000,0xBCF7,0x0000,0x0001,0xC4FB,0x0012,0x0008,0x0004,0x0001, 0x0000,0xE9C4,0x0001,0x0000,0xCCA8,0x0006,0x0003,0x0001,0xC3CA,0x0000,0xE9DF,0x0000,0x0000,0xE9DD,0x0009,0x0005, 0x0001,0x0002,0xE9C9,0xBCEC,0x0000,0x0001,0xE9D1,0x0004,0x0000,0x0001,0xE8ED,0x0001,0x0000,0xE9DE,0x0023,0x0010, 0x000B,0x0004,0x0000,0x0001,0xB5B5,0x0004,0x0002,0xE9DB,0xE9DC,0x0001,0xE9D5,0x0001,0x0000,0x0000,0xE8DF,0x000B, 0x0004,0x0000,0x0001,0xCFAD,0x0004,0x0002,0xE9DD,0xCCB4,0x0001,0xC7C2,0x0004,0x0000,0x0001,0xE9DA,0x0000,0x0000, 0xE9D6,0x000A,0x0005,0x0001,0x0000,0x0000,0xB3F7,0x0000,0x0001,0x0000,0xBAE1,0x000C,0x0006,0x0003,0x0000,0xE9CD, 0x0001,0xCDD6,0x0003,0x0000,0xCFF0,0x0000,0xBBFA,0x0004,0x0001,0x0000,0xE9D3,0x0000,0x0002,0xB3C8,0xE9D9,0x012F, 0x008A,0x0048,0x001F,0x000E,0x0005,0x0001,0x0001,0x0000,0xE9D2,0x0004,0x0001,0x0001,0xC7C5,0x0001,0x0002,0xE8E3, 0xC7C1,0x0005,0x0000,0x0001,0x0000,0xE9CF,0x0005,0x0000,0x0002,0xE9D0,0xE9D7,0x0004,0x0002,0xE8EB,0xCAF7,0x0000, 0xC6D3,0x0011,0x000A,0x0004,0x0000,0x0001,0xE9D4,0x0003,0x0001,0xD3A3,0x0001,0xE9C9,0x0001,0x0003,0x0000,0xBAE1, 0x0000,0xE9D8,0x000A,0x0004,0x0001,0x0001,0xD1F9,0x0003,0x0001,0xC4A3,0x0001,0xD5C1,0x0007,0x0004,0x0002,0xCAE0, 0xE9AB,0x0001,0xC7F3,0x0003,0x0001,0xB1EA,0x0002,0xE9CC,0xE9CB,0x0024,0x000E,0x0009,0x0005,0x0001,0x0002,0xB3B2, 0xC2A5,0x0000,0x0001,0xC1BA,0x0001,0x0000,0x0000,0xB7AE,0x000B,0x0004,0x0000,0x0001,0xE8C8,0x0004,0x0002,0xC0D6, 0xD7AE,0x0001,0xE9C8,0x0007,0x0004,0x0002,0xEFDC,0xB2DB,0x0000,0xB9E6,0x0001,0x0001,0xF4AB,0x0011,0x0008,0x0004, 0x0001,0x0001,0xBDB0,0x0000,0x0000,0xE9CE,0x0004,0x0000,0x0001,0xE9CA,0x0001,0x0002,0xE9A4,0xE8FD,0x0008,0x0001, 0x0003,0x0000,0xD0A8,0x0002,0xE9C6,0xE9C4,0x0000,0x0001,0x0001,0xBCF7,0x004D,0x0027,0x0015,0x0009,0x0005,0x0001, 0x0002,0xE9C0,0xB8DC,0x0001,0x0000,0xBBB1,0x0008,0x0004,0x0002,0xE9B6,0xC7B9,0x0002,0xE9B3,0xB9B9,0x0000,0x0000, 0xE9C3,0x000A,0x0004,0x0001,0x0001,0xC5CC,0x0003,0x0001,0xE9C2,0x0001,0xE8E7,0x0004,0x0001,0x0001,0xE9BD,0x0001, 0x0001,0xC8B6,0x0016,0x0008,0x0004,0x0001,0x0000,0xC1F1,0x0000,0x0001,0xE9C1,0x0007,0x0004,0x0002,0xC8D9,0xE9BF, 0x0001,0xE9BE,0x0003,0x0000,0xE8BF,0x0002,0xD5A5,0xE9BC,0x0007,0x0000,0x0003,0x0000,0xB8C9,0x0000,0xE8EE,0x0005, 0x0001,0x0002,0xB0F1,0xE9BB,0x0001,0x0000,0xE9B0,0x002A,0x0013,0x0007,0x0000,0x0003,0x0001,0xE9C5,0x0000,0xC0C6, 0x0005,0x0000,0x0002,0xE9B1,0xE9C7,0x0003,0x0001,0xE9B7,0x0002,0xE9B5,0xE9B4,0x000C,0x0006,0x0003,0x0000,0xD3DC, 0x0000,0xE9AD,0x0003,0x0000,0xB8C5,0x0000,0xE9AF,0x0004,0x0001,0x0000,0xC2A5,0x0003,0x0001,0xE9BA,0x0002,0xE9B1, 0xBFAC,0x0017,0x000A,0x0004,0x0000,0x0001,0xBCAB,0x0003,0x0001,0xE9A8,0x0001,0xB6DC,0x0007,0x0004,0x0002,0xE8FA, 0xD2B5,0x0001,0xE9AE,0x0003,0x0000,0xB5FA,0x0000,0xE8E5,0x000B,0x0007,0x0004,0x0002,0xE9B8,0xE9B8,0x0001,0xE9B9, 0x0001,0x0000,0xE9AA,0x0005,0x0000,0x0002,0xC0E3,0xE9AC,0x0004,0x0002,0xB3FE,0xC3AF,0x0001,0xE9A5,0x0083,0x003E, 0x0021,0x0010,0x000B,0x0007,0x0003,0x0000,0xE8CE,0x0002,0xD0A8,0xB7E3,0x0000,0x0000,0xCBBC,0x0001,0x0000,0x0000, 0xD1EE,0x0007,0x0001,0x0003,0x0000,0xE9AB,0x0001,0xB4BB,0x0004,0x0000,0x0001,0xB4AA,0x0003,0x0001,0xE9A9,0x0001, 0xBCEA,0x000F,0x000A,0x0006,0x0003,0x0001,0xBCCF,0x0000,0xE9B2,0x0001,0x0000,0xD2AC,0x0000,0x0000,0x0001,0xCDD6, 0x0009,0x0004,0x0001,0x0000,0xE9A1,0x0001,0x0002,0xE8FD,0xE8FC,0x0001,0x0001,0x0001,0xEDD6,0x0021,0x0010,0x0008, 0x0001,0x0003,0x0000,0xBDB7,0x0002,0xE9A7,0xE8E2,0x0000,0x0004,0x0002,0xD7B5,0xD6B2,0x0001,0xE9A3,0x0008,0x0004, 0x0000,0x0001,0xD2CE,0x0000,0x0001,0xE9A4,0x0004,0x0001,0x0000,0xE8FB,0x0000,0x0002,0xB9D7,0xE8FE,0x0013,0x000B, 0x0004,0x0000,0x0001,0xBFC3,0x0004,0x0002,0xC6DC,0xC0E2,0x0000,0xE9A2,0x0004,0x0000,0x0000,0xC9AD,0x0001,0x0001, 0xD5BB,0x0009,0x0004,0x0001,0x0001,0xE9A6,0x0001,0x0002,0xCCC4,0xB6B0,0x0001,0x0003,0x0000,0xC5EF,0x0002,0xBCAC, 0xD4E6,0x004A,0x0020,0x0015,0x000B,0x0005,0x0000,0x0002,0xE8C7,0xD7D8,0x0003,0x0000,0xB0F4,0x0000,0xF3F5,0x0006, 0x0003,0x0001,0xB9F7,0x0001,0xC6E5,0x0000,0x0001,0xC3DE,0x0000,0x0004,0x0001,0x0000,0xC6FA,0x0003,0x0000,0xE8F9, 0x0000,0xBCEC,0x0018,0x000D,0x0006,0x0003,0x0001,0xE8F3,0x0001,0xCAE1,0x0003,0x0000,0xCDD1,0x0002,0xD0B5,0xCCDD, 0x0004,0x0000,0x0001,0xCBF3,0x0003,0x0000,0xB6B9,0x0002,0xC0E6,0xCEE0,0x000A,0x0004,0x0000,0x0000,0xC3CE,0x0003, 0x0000,0xC9D2,0x0001,0xE8C9,0x0004,0x0000,0x0001,0xCCF5,0x0001,0x0001,0xB9A3,0x0021,0x000A,0x0000,0x0005,0x0001, 0x0002,0xE8D9,0xE8F7,0x0001,0x0001,0xE8F4,0x000D,0x0007,0x0004,0x0002,0xB0F0,0xC3B7,0x0001,0xE8E8,0x0003,0x0001, 0xC1BA,0x0001,0xB8CB,0x0004,0x0001,0x0000,0xC6E1,0x0003,0x0001,0xC0C6,0x0001,0xE8F6,0x0014,0x0007,0x0000,0x0003, 0x0000,0xCDB0,0x0000,0xE8F5,0x0006,0x0003,0x0000,0xB1AD,0x0001,0xE8F8,0x0003,0x0001,0xD7AE,0x0002,0xBDB0,0xE8ED, 0x0000,0x0008,0x0004,0x0002,0xE8EB,0xC7C5,0x0002,0xE8E7,0xB5B5,0x0004,0x0002,0xE8E5,0xE8E3,0x0000,0xE8E2,0x0543, 0x029D,0x0159,0x00AD,0x004E,0x0034,0x0019,0x000C,0x0005,0x0001,0x0002,0xE8EA,0xBDDB,0x0003,0x0000,0xBBB8,0x0002, 0xC9A3,0xCDA9,0x0006,0x0003,0x0001,0xE8E4,0x0001,0xD7C0,0x0003,0x0001,0xE8F0,0x0002,0xE8F1,0xB0B8,0x000F,0x0007, 0x0003,0x0001,0xBFF2,0x0002,0xCEA6,0xE8E6,0x0004,0x0002,0xCCD2,0xB9F0,0x0002,0xE8EC,0xE8EE,0x0007,0x0003,0x0001, 0xE8EF,0x0002,0xD4D4,0xB8F1,0x0001,0x0002,0xB8F9,0xBACB,0x0010,0x0009,0x0004,0x0000,0x0000,0xD1F9,0x0000,0x0002, 0xE8E1,0xE8E0,0x0001,0x0003,0x0001,0xD6EA,0x0000,0xE8F2,0x0005,0x0001,0x0001,0x0000,0xD0A3,0x0000,0x0001,0x0000, 0xE8E9,0x002D,0x001C,0x000D,0x0007,0x0004,0x0002,0xC0F5,0xC6DC,0x0001,0xC6F5,0x0003,0x0000,0xCBA8,0x0000,0xCAF7, 0x0007,0x0004,0x0002,0xC0B8,0xE8DD,0x0001,0xE8D3,0x0004,0x0002,0xB6B0,0xE8D0,0x0002,0xE8CE,0xD5BB,0x000A,0x0006, 0x0003,0x0000,0xB1EA,0x0000,0xD5A4,0x0001,0x0001,0xE8D9,0x0000,0x0003,0x0000,0xCAC1,0x0000,0xE8DF,0x0016,0x000C, 0x0005,0x0001,0x0002,0xD5A4,0xB2F1,0x0003,0x0000,0xC1F8,0x0002,0xD6F9,0xE8CD,0x0006,0x0003,0x0000,0xBFC2,0x0001, 0xBCED,0x0001,0x0000,0xE8D1,0x000D,0x0007,0x0003,0x0000,0xF5FD,0x0002,0xB2E9,0xD9DE,0x0003,0x0001,0xE8DC,0x0001, 0xC4FB,0x0008,0x0004,0x0002,0xE9AA,0xD7F5,0x0002,0xE8D8,0xB9F1,0x0003,0x0001,0xE8D6,0x0002,0xE8D4,0xE8CF,0x0057, 0x0024,0x0014,0x000C,0x0004,0x0001,0x0001,0xC8E1,0x0004,0x0002,0xC8BE,0xC6E2,0x0002,0xB8CC,0xC4B3,0x0004,0x0000, 0x0000,0xB0D8,0x0001,0x0001,0xC5CC,0x000A,0x0004,0x0001,0x0001,0xB1FA,0x0003,0x0000,0xE8DA,0x0000,0xE8DE,0x0001, 0x0001,0x0002,0xE8F5,0xE8DB,0x001B,0x000E,0x0008,0x0004,0x0002,0xBCCF,0xBCDC,0x0002,0xE8D5,0xB9D5,0x0003,0x0000, 0xE8D7,0x0001,0xE8D2,0x0006,0x0003,0x0000,0xBFDD,0x0000,0xE8C9,0x0004,0x0002,0xB7E3,0xC7B9,0x0001,0xE8C7,0x000B, 0x0006,0x0003,0x0000,0xE8C5,0x0000,0xE8C0,0x0000,0x0002,0xD4E6,0xCAE0,0x0007,0x0003,0x0001,0xE8C8,0x0002,0xD6A6, 0xB9FB,0x0003,0x0001,0xC3B6,0x0001,0xE8C4,0x0028,0x0016,0x000C,0x0006,0x0003,0x0000,0xC1D6,0x0000,0xD5ED,0x0003, 0x0001,0xE8E2,0x0001,0xCEF6,0x0004,0x0001,0x0001,0xE8FB,0x0003,0x0000,0xE8CA,0x0000,0xCDF7,0x000A,0x0006,0x0003, 0x0000,0xE8C1,0x0001,0xB9B9,0x0001,0x0000,0xBCAB,0x0000,0x0004,0x0002,0xB0E5,0xCBC9,0x0001,0xE8CC,0x001B,0x000E, 0x0006,0x0003,0x0000,0xE8CB,0x0000,0xE8C6,0x0004,0x0002,0xE8C3,0xEABD,0x0002,0xB6AB,0xBDDC,0x0006,0x0003,0x0000, 0xB1AD,0x0000,0xBABC,0x0003,0x0001,0xE8C2,0x0002,0xE8BF,0xD1EE,0x0009,0x0004,0x0001,0x0000,0xC0B4,0x0001,0x0002, 0xCCF5,0xB8DC,0x0000,0x0004,0x0002,0xCAF8,0xE8BD,0x0002,0xC0E9,0xB6C5,0x00B4,0x005D,0x0030,0x0017,0x000A,0x0004, 0x0001,0x0000,0xD5C8,0x0003,0x0001,0xE8BC,0x0001,0xB4E5,0x0007,0x0004,0x0002,0xB2C4,0xD0D3,0x0000,0xC0EE,0x0003, 0x0000,0xE8BB,0x0001,0xC9BC,0x000D,0x0007,0x0003,0x0000,0xE8BE,0x0002,0xB8CB,0xD3DB,0x0003,0x0001,0xC8A8,0x0000, 0xD4D3,0x0007,0x0004,0x0002,0xC9B1,0xCAF8,0x0001,0xD0E0,0x0001,0x0002,0xBBFA,0xF3FE,0x0018,0x000A,0x0004,0x0001, 0x0001,0xB6E4,0x0003,0x0000,0xC6D3,0x0001,0xD6EC,0x0007,0x0003,0x0001,0xCAF5,0x0002,0xCAF5,0xD4FD,0x0004,0x0002, 0xB1BE,0xC4A9,0x0000,0xCEB4,0x000B,0x0007,0x0004,0x0002,0xC4BE,0xEBCA,0x0000,0xEBFC,0x0001,0x0000,0xCDFB,0x0006, 0x0003,0x0001,0xC6DA,0x0001,0xB3AF,0x0000,0x0001,0xCDFB,0x002F,0x0018,0x000B,0x0006,0x0003,0x0001,0xC0CA,0x0001, 0xEBDE,0x0000,0x0002,0xCBB7,0xECF6,0x0006,0x0003,0x0000,0xEBD4,0x0001,0xB7FE,0x0003,0x0001,0xC5F3,0x0002,0xEBC3, 0xD3D0,0x000A,0x0006,0x0003,0x0000,0xD4C2,0x0001,0xEAC2,0x0000,0x0001,0xBBE1,0x0007,0x0004,0x0002,0xD7EE,0xCCE6, 0x0000,0xD4F8,0x0003,0x0000,0xC2FC,0x0001,0xB2DC,0x0016,0x000C,0x0005,0x0000,0x0002,0xCAE9,0xEAC2,0x0004,0x0002, 0xB8FC,0xD2B7,0x0000,0xC7FA,0x0004,0x0000,0x0000,0xD4BB,0x0003,0x0000,0xC9B9,0x0001,0xEAD9,0x0005,0x0000,0x0001, 0x0000,0xEAD8,0x0006,0x0003,0x0000,0xBFF5,0x0001,0xC6D8,0x0004,0x0002,0xEAD7,0xEAD6,0x0001,0xCAEF,0x003D,0x001C, 0x000A,0x0005,0x0000,0x0001,0x0000,0xEAD3,0x0001,0x0001,0x0001,0xCFFE,0x000A,0x0006,0x0003,0x0001,0xEABC,0x0000, 0xC0FA,0x0000,0x0000,0xEACA,0x0004,0x0001,0x0000,0xEAD5,0x0001,0x0001,0xE5DF,0x0011,0x0007,0x0001,0x0003,0x0000, 0xB1A9,0x0001,0xEAC7,0x0004,0x0001,0x0000,0xC4BA,0x0003,0x0001,0xD4DD,0x0000,0xC2F7,0x0009,0x0005,0x0000,0x0002, 0xF4DF,0xEAD3,0x0001,0x0000,0xB3A9,0x0000,0x0003,0x0000,0xF0A9,0x0001,0xEAD4,0x0028,0x0011,0x000A,0x0006,0x0003, 0x0001,0xB0B5,0x0000,0xC5AF,0x0001,0x0001,0xCAEE,0x0001,0x0003,0x0000,0xEAD2,0x0001,0xEACD,0x000B,0x0005,0x0000, 0x0002,0xD4CE,0xCFBE,0x0003,0x0000,0xEAD1,0x0000,0xD4DD,0x0006,0x0003,0x0000,0xCDFA,0x0000,0xC1C0,0x0003,0x0001, 0xB0B5,0x0000,0xD6C7,0x0012,0x000A,0x0006,0x0003,0x0001,0xEAD0,0x0000,0xBEA7,0x0000,0x0000,0xC7E7,0x0000,0x0004, 0x0002,0xCEFA,0xBEB0,0x0000,0xC6D5,0x000D,0x0006,0x0003,0x0000,0xB3BF,0x0000,0xBBDE,0x0003,0x0000,0xCEEE,0x0002, 0xCEFA,0xEACE,0x0006,0x0003,0x0001,0xEAC9,0x0001,0xD6E7,0x0003,0x0000,0xC0A5,0x0000,0xCDED,0x014F,0x00A2,0x0054, 0x002A,0x0017,0x000D,0x0005,0x0001,0x0002,0xEACF,0xEACD,0x0004,0x0002,0xD4CE,0xEACA,0x0002,0xCFFE,0xC9B9,0x0004, 0x0001,0x0000,0xEACC,0x0003,0x0001,0xC9CE,0x0000,0xBDFA,0x0009,0x0004,0x0000,0x0000,0xBDFA,0x0001,0x0002,0xBBCE, 0xCAB1,0x0006,0x0003,0x0000,0xEACB,0x0001,0xCFD4,0x0000,0x0001,0xD6E7,0x0015,0x000B,0x0004,0x0001,0x0001,0xEAC6, 0x0004,0x0002,0xEAC7,0xEAC4,0x0000,0xD2DD,0x0006,0x0003,0x0000,0xEAC5,0x0000,0xCAC7,0x0000,0x0000,0xD5D1,0x000A, 0x0006,0x0003,0x0001,0xD7F2,0x0000,0xC3C1,0x0000,0x0000,0xB4BA,0x0007,0x0004,0x0002,0xEAC5,0xD3B3,0x0000,0xD0C7, 0x0000,0x0000,0xEAC3,0x0028,0x0016,0x000B,0x0004,0x0000,0x0000,0xEABC,0x0004,0x0002,0xEABF,0xCEF4,0x0000,0xD2D7, 0x0005,0x0001,0x0002,0xBBE8,0xC3F7,0x0003,0x0001,0xB2FD,0x0001,0xEABB,0x000A,0x0005,0x0001,0x0002,0xC9FD,0xC0A5, 0x0001,0x0002,0xEABE,0xB0BA,0x0004,0x0000,0x0001,0xEAC0,0x0001,0x0001,0xCDFA,0x0013,0x0006,0x0000,0x0001,0x0002, 0xBFF5,0xCAB1,0x0008,0x0004,0x0002,0xBAB5,0xEABA,0x0002,0xEAB9,0xEAB8,0x0000,0x0002,0xD0F1,0xD1AE,0x000E,0x0008, 0x0004,0x0002,0xD4E7,0xD6BC,0x0002,0xBEC9,0xB5A9,0x0003,0x0000,0xC8D5,0x0001,0xBCC8,0x0000,0x0000,0x0001,0xCEDE, 0x005C,0x002C,0x0015,0x0009,0x0005,0x0001,0x0002,0xC6EC,0xECBD,0x0001,0x0001,0xECBC,0x0005,0x0001,0x0002,0xD7E5, 0xECBB,0x0004,0x0002,0xECBA,0xECBA,0x0000,0xD0FD,0x000C,0x0004,0x0001,0x0001,0xECB7,0x0004,0x0002,0xC2C3,0xECB8, 0x0002,0xECB9,0xC6EC,0x0006,0x0003,0x0000,0xC5D4,0x0000,0xD3CE,0x0000,0x0002,0xCAA9,0xD3DA,0x0019,0x000B,0x0006, 0x0003,0x0000,0xB7BD,0x0000,0xB6CF,0x0001,0x0002,0xC7DB,0xEDBD,0x0007,0x0003,0x0001,0xD0C2,0x0002,0xCBB9,0xEDBD, 0x0004,0x0002,0xB6CF,0xD5B6,0x0000,0xEDBD,0x000B,0x0006,0x0003,0x0000,0xD5B6,0x0000,0xB8AB,0x0000,0x0002,0xB3E2, 0xBDEF,0x0006,0x0003,0x0000,0xCED3,0x0000,0xD5E5,0x0003,0x0001,0xD0B1,0x0000,0xF5FA,0x0026,0x0017,0x000C,0x0006, 0x0003,0x0000,0xC1CF,0x0000,0xB6B7,0x0003,0x0000,0xECB5,0x0000,0xECB5,0x0005,0x0000,0x0002,0xB0DF,0xECB3,0x0003, 0x0001,0xB1F3,0x0000,0xD5AB,0x0009,0x0004,0x0001,0x0000,0xCEC4,0x0001,0x0002,0xB1D0,0xC1B2,0x0001,0x0001,0x0002, 0xE5C4,0xC7FD,0x0018,0x000D,0x0006,0x0003,0x0001,0xCAFD,0x0000,0xB7F3,0x0004,0x0002,0xB5D0,0xD5FB,0x0001,0xC7C3, 0x0004,0x0000,0x0001,0xCAFD,0x0003,0x0001,0xBEB4,0x0002,0xEBB8,0xB6DE,0x0009,0x0004,0x0001,0x0001,0xB6D8,0x0001, 0x0002,0xC9A2,0xB8D2,0x0004,0x0001,0x0001,0xB3A8,0x0003,0x0000,0xB1D6,0x0000,0xC1B2,0x00A6,0x0054,0x0028,0x0016, 0x000C,0x0008,0x0004,0x0002,0xBDCC,0xD0F0,0x0002,0xB0DC,0xB0BD,0x0000,0x0000,0xEBB7,0x0006,0x0003,0x0000,0xBEC8, 0x0000,0xC3F4,0x0000,0x0001,0xB5D0,0x0009,0x0005,0x0000,0x0002,0xF4CD,0xD0A7,0x0000,0x0000,0xB9CA,0x0005,0x0001, 0x0002,0xD5FE,0xB7C5,0x0001,0x0000,0xB9A5,0x001B,0x000F,0x0008,0x0004,0x0002,0xB8C4,0xD8FC,0x0002,0xBFBC,0xCAD5, 0x0004,0x0002,0xEBB6,0xEAB7,0x0001,0xECA5,0x0005,0x0001,0x0002,0xD6A7,0xDFAD,0x0003,0x0001,0xC0BF,0x0002,0xBEF0, 0xBDC1,0x0009,0x0001,0x0004,0x0002,0xDFAC,0xCCAF,0x0002,0xC2CE,0xD4DC,0x0001,0x0004,0x0002,0xC9E3,0xD0AF,0x0000, 0xDFA5,0x0029,0x0012,0x000D,0x0007,0x0004,0x0002,0xB2F3,0xC8C1,0x0001,0xDEFC,0x0003,0x0001,0xC0B9,0x0001,0xD4DC, 0x0000,0x0001,0x0000,0xC2A3,0x000A,0x0006,0x0003,0x0000,0xDFAB,0x0001,0xC4EC,0x0000,0x0001,0xDEF3,0x0006,0x0003, 0x0001,0xC5CA,0x0001,0xC8C5,0x0003,0x0001,0xDFA3,0x0002,0xCBD3,0xB0DA,0x0015,0x000A,0x0004,0x0001,0x0000,0xDFA2, 0x0003,0x0001,0xC0A9,0x0001,0xD6C0,0x0007,0x0004,0x0002,0xB8E9,0xC5A1,0x0000,0xB1F7,0x0000,0x0001,0xC4E2,0x000A, 0x0004,0x0001,0x0001,0xB2C1,0x0003,0x0001,0xDFA9,0x0001,0xDFAA,0x0006,0x0003,0x0001,0xBCB7,0x0001,0xCBD3,0x0001, 0x0001,0xBEDD,0x0066,0x0033,0x0019,0x000C,0x0006,0x0003,0x0001,0xEBA2,0x0000,0xDFA8,0x0003,0x0001,0xB5A3,0x0001, 0xC7DC,0x0006,0x0003,0x0001,0xDFA7,0x0001,0xC7E6,0x0003,0x0000,0xB2D9,0x0002,0xB5B2,0xBBF7,0x000B,0x0004,0x0001, 0x0000,0xD4F1,0x0004,0x0002,0xC9C3,0xC2B0,0x0001,0xC0DE,0x0008,0x0004,0x0002,0xD3B5,0xDFA6,0x0002,0xBCF1,0xCECE, 0x0003,0x0001,0xBAB3,0x0002,0xCCA2,0xDFA5,0x001B,0x000D,0x0006,0x0003,0x0001,0xDFA3,0x0000,0xDFA2,0x0003,0x0000, 0xC4EC,0x0002,0xDEEC,0xC6CB,0x0007,0x0004,0x0002,0xCDD6,0xD7AB,0x0001,0xB4E9,0x0004,0x0002,0xB2A5,0xC7CB,0x0000, 0xB8A7,0x000D,0x0006,0x0003,0x0000,0xC1C3,0x0001,0xB3B6,0x0004,0x0002,0xB2A6,0xB3B7,0x0000,0xB5A7,0x0005,0x0001, 0x0002,0xDED8,0xD7B2,0x0003,0x0001,0xD5FC,0x0001,0xC4ED,0x0026,0x0013,0x000D,0x0006,0x0003,0x0000,0xDFA4,0x0001, 0xDEFE,0x0003,0x0000,0xCBBA,0x0002,0xC4D3,0xC8F6,0x0000,0x0000,0x0002,0xB3C5,0xB3C5,0x000D,0x0006,0x0003,0x0001, 0xC0CC,0x0000,0xC6B2,0x0004,0x0002,0xBEEF,0xDEFC,0x0001,0xC1CC,0x0001,0x0001,0x0002,0xB2F4,0xD5DB,0x0013,0x000B, 0x0007,0x0004,0x0002,0xC4A1,0xC3FE,0x0001,0xDED2,0x0001,0x0000,0xBFD9,0x0004,0x0001,0x0000,0xD6BF,0x0000,0x0000, 0xDEFD,0x0007,0x0000,0x0003,0x0000,0xC4A6,0x0000,0xB4DD,0x0007,0x0003,0x0001,0xD7DC,0x0002,0xC2A7,0xDEFB,0x0000, 0x0001,0xDEE8,0x02E8,0x0172,0x00B7,0x005B,0x002C,0x0012,0x0009,0x0004,0x0001,0x0000,0xD5AA,0x0001,0x0002,0xCBA4, 0xB7EC,0x0005,0x0000,0x0002,0xDEF0,0xDEE2,0x0000,0x0000,0xC7F3,0x000F,0x0007,0x0003,0x0000,0xCCAF,0x0002,0xB1F7, 0xD2A1,0x0004,0x0002,0xB0DA,0xDEF3,0x0002,0xC9E3,0xBFB8,0x0006,0x0003,0x0001,0xDEF4,0x0001,0xEBA1,0x0000,0x0002, 0xD5A5,0xB2EB,0x0015,0x000B,0x0005,0x0000,0x0002,0xD0AF,0xCED5,0x0003,0x0000,0xC7C0,0x0000,0xE5BA,0x0004,0x0001, 0x0001,0xCCCD,0x0003,0x0001,0xB4EE,0x0000,0xB0E1,0x000D,0x0006,0x0003,0x0000,0xCCC2,0x0000,0xCDD8,0x0004,0x0002, 0xDEF9,0xB4B7,0x0000,0xB6F3,0x0006,0x0003,0x0001,0xDEFA,0x0000,0xDEF7,0x0003,0x0000,0xB8E3,0x0002,0xCBD1,0xDEF6, 0x002C,0x0017,0x000B,0x0004,0x0001,0x0001,0xB5B7,0x0003,0x0000,0xD2A1,0x0002,0xC9A6,0xB4EA,0x0005,0x0001,0x0002, 0xB4A4,0xB2AB,0x0003,0x0001,0xCBF0,0x0002,0xDEF8,0xDEF5,0x0009,0x0004,0x0000,0x0001,0xC8B6,0x0000,0x0002,0xB9B9, 0xBDC1,0x0008,0x0004,0x0002,0xC2A7,0xB8E9,0x0002,0xB2F3,0xDEEC,0x0000,0x0001,0xC0BF,0x0019,0x000E,0x0006,0x0003, 0x0001,0xB1B3,0x0000,0xDEEA,0x0004,0x0002,0xDEDE,0xDEE7,0x0002,0xD4AE,0xD0A8,0x0004,0x0000,0x0000,0xDEE9,0x0004, 0x0002,0xBBD3,0xBDD2,0x0001,0xBEBE,0x0009,0x0005,0x0000,0x0002,0xBEBE,0xBFAB,0x0001,0x0001,0xB4A7,0x0006,0x0003, 0x0001,0xCED5,0x0000,0xDEEB,0x0004,0x0002,0xDEEE,0xDFAC,0x0002,0xD1DA,0xBBBB,0x005D,0x002B,0x0014,0x0008,0x0004, 0x0000,0x0000,0xD1EF,0x0000,0x0000,0xD2BE,0x0007,0x0003,0x0000,0xB2E5,0x0002,0xCCE1,0xC3E8,0x0000,0x0002,0xDEEF, 0xD7E1,0x000C,0x0004,0x0000,0x0001,0xC8E0,0x0004,0x0002,0xDEF1,0xD1D0,0x0002,0xDEED,0xBCE3,0x0004,0x0001,0x0000, 0xBCF0,0x0004,0x0002,0xDEF2,0xC5F6,0x0000,0xDEE8,0x0017,0x000C,0x0007,0x0003,0x0000,0xB2F4,0x0002,0xB5A7,0xD6C0, 0x0001,0x0002,0xDEE2,0xC2B0,0x0004,0x0001,0x0000,0xEAFE,0x0004,0x0002,0xDEE7,0xDEDD,0x0000,0xDEE4,0x000E,0x0008, 0x0004,0x0002,0xB4EB,0xD1DA,0x0002,0xCDC6,0xBFD8,0x0003,0x0001,0xBDD3,0x0001,0xB3B8,0x0007,0x0004,0x0002,0xCCBD, 0xB2C9,0x0000,0xC2D3,0x0003,0x0000,0xD8DF,0x0001,0xB9D2,0x002F,0x0017,0x000A,0x0006,0x0003,0x0001,0xD5F5,0x0000, 0xBEF2,0x0000,0x0000,0xD2B4,0x0007,0x0003,0x0000,0xC5C5,0x0002,0xC6FE,0xCCCD,0x0003,0x0000,0xDEE1,0x0000,0xD5C6, 0x000D,0x0008,0x0004,0x0002,0xDEE5,0xB5F4,0x0002,0xCADA,0xB6DE,0x0001,0x0002,0xC2D5,0xC9A8,0x0006,0x0003,0x0000, 0xB5E0,0x0000,0xCFC6,0x0001,0x0002,0xC5B2,0xC4ED,0x0017,0x000B,0x0006,0x0003,0x0000,0xDEE0,0x0001,0xBDDD,0x0000, 0x0002,0xB4B7,0xDED3,0x0005,0x0000,0x0002,0xBEED,0xDEDF,0x0004,0x0002,0xBEDD,0xDEE3,0x0001,0xDED1,0x000D,0x0007, 0x0003,0x0001,0xDEE6,0x0002,0xC9E1,0xC5F5,0x0003,0x0001,0xCDF3,0x0001,0xB5B7,0x0007,0x0004,0x0002,0xBBBB,0xBCF1, 0x0001,0xCBF0,0x0000,0x0000,0xC0CC,0x00B3,0x0058,0x002E,0x0013,0x0007,0x0001,0x0003,0x0001,0xB9CE,0x0000,0xB2B6, 0x0004,0x0001,0x0001,0xBEE8,0x0004,0x0002,0xC4F3,0xC9D3,0x0002,0xBAB4,0xB0C6,0x000D,0x0006,0x0003,0x0000,0xDEDB, 0x0000,0xD7BD,0x0003,0x0001,0xC0A6,0x0002,0xCDB1,0xBEC8,0x0007,0x0004,0x0002,0xDEDC,0xCEE6,0x0000,0xBDC1,0x0003, 0x0001,0xD0AE,0x0002,0xCDEC,0xC5B2,0x000F,0x0007,0x0000,0x0003,0x0001,0xCDA6,0x0000,0xDEDA,0x0004,0x0000,0x0001, 0xEAFD,0x0000,0x0000,0xD5F1,0x000C,0x0007,0x0004,0x0002,0xB4EC,0xC5B2,0x0001,0xB0A4,0x0001,0x0002,0xBBD3,0xBCB7, 0x0008,0x0004,0x0002,0xD5F5,0xDED8,0x0002,0xB5B2,0xC4D3,0x0004,0x0002,0xD0AE,0xCCA2,0x0000,0xCECE,0x002B,0x0014, 0x0009,0x0005,0x0000,0x0002,0xC2CE,0xD6BF,0x0000,0x0001,0xCDDA,0x0005,0x0001,0x0002,0xCCF4,0xC4C3,0x0003,0x0001, 0xBFE6,0x0000,0xD0A3,0x0009,0x0005,0x0001,0x0002,0xB0B4,0xEAFC,0x0000,0x0000,0xD6B8,0x0006,0x0003,0x0001,0xB9D2, 0x0000,0xB3D6,0x0004,0x0002,0xC4C3,0xCAB0,0x0002,0xD7A7,0xC6B4,0x0019,0x000B,0x0004,0x0001,0x0000,0xC0AD,0x0004, 0x0002,0xBFBD,0xDED9,0x0001,0xCBA9,0x0006,0x0003,0x0000,0xC8AD,0x0000,0xB9B0,0x0004,0x0002,0xD5FC,0xDED7,0x0002, 0xCAC3,0xC0A8,0x000C,0x0005,0x0001,0x0002,0xD4F1,0xB2A6,0x0004,0x0002,0xC5A1,0xC0B9,0x0000,0xD3B5,0x0005,0x0000, 0x0002,0xBCF0,0xC2A3,0x0003,0x0000,0xC4E2,0x0001,0xB0DD,0x0064,0x003B,0x001F,0x000F,0x0008,0x0004,0x0002,0xD5D0, 0xDED5,0x0002,0xD7BE,0xBED0,0x0004,0x0002,0xDED6,0xCDCF,0x0001,0xB0CE,0x0008,0x0004,0x0002,0xCDD8,0xBEDC,0x0002, 0xC7AF,0xB9D5,0x0004,0x0002,0xC4C3,0xC1E0,0x0002,0xC5C4,0xB0E8,0x0010,0x0008,0x0004,0x0002,0xC5D7,0xDED4,0x0002, 0xC0AD,0xC4E9,0x0004,0x0002,0xC4B4,0xB2F0,0x0002,0xB5A3,0xD6F4,0x0004,0x0000,0x0001,0xB7F7,0x0004,0x0002,0xC3F2, 0xBDD9,0x0002,0xB3E9,0xD1BA,0x0013,0x000B,0x0006,0x0003,0x0000,0xDED3,0x0000,0xC4A8,0x0001,0x0002,0xB5D6,0xD7A7, 0x0004,0x0001,0x0000,0xB1A7,0x0001,0x0001,0xCCA7,0x000B,0x0006,0x0003,0x0000,0xC5FB,0x0001,0xC5EA,0x0001,0x0002, 0xB1A8,0xBBA4,0x0007,0x0003,0x0001,0xC7C0,0x0002,0xC2D5,0xBFD9,0x0000,0x0000,0xDED2,0x002D,0x0016,0x000E,0x0007, 0x0004,0x0002,0xC5D7,0xB8A7,0x0001,0xD5DB,0x0004,0x0002,0xBFB9,0xB6B6,0x0000,0xCDB6,0x0000,0x0004,0x0002,0xD7A5, 0xCAE3,0x0000,0xD2D6,0x000C,0x0006,0x0003,0x0001,0xB0D1,0x0000,0xBEF1,0x0003,0x0000,0xBFDB,0x0001,0xB3AD,0x0004, 0x0001,0x0001,0xBCBC,0x0004,0x0002,0xB3D0,0xD5D2,0x0001,0xB6F3,0x0019,0x000B,0x0007,0x0004,0x0002,0xE8CE,0xB5D6, 0x0000,0xC5FA,0x0000,0x0001,0xB7F6,0x0006,0x0003,0x0000,0xB0E2,0x0001,0xC8C5,0x0004,0x0002,0xB3B6,0xB0E7,0x0002, 0xC5A4,0xD1EF,0x000E,0x0007,0x0004,0x0002,0xC9A8,0xDED1,0x0000,0xC0A9,0x0004,0x0002,0xD6B4,0xC7A4,0x0001,0xBAB4, 0x0005,0x0000,0x0002,0xBFDB,0xC7A4,0x0003,0x0001,0xDFA6,0x0001,0xCDD0,0x014B,0x00B4,0x005C,0x0030,0x0016,0x0009, 0x0005,0x0002,0xBFB8,0x0001,0xB8ED,0x0000,0x0000,0xCDD0,0x0008,0x0004,0x0002,0xC8D3,0xB4F2,0x0002,0xB0C7,0xC6CB, 0x0001,0x0002,0xD4FA,0xB2C5,0x000C,0x0007,0x0004,0x0002,0xDED0,0xCAD6,0x0001,0xECE9,0x0000,0x0002,0xECE8,0xC9C8, 0x0006,0x0003,0x0001,0xECE7,0x0001,0xB1E2,0x0004,0x0002,0xCBF9,0xB7BF,0x0002,0xECE5,0xECE6,0x0014,0x0007,0x0001, 0x0003,0x0001,0xBBA7,0x0000,0xBBA7,0x0007,0x0004,0x0002,0xB4F7,0xB4C1,0x0000,0xCFB7,0x0003,0x0000,0xD5BD,0x0000, 0xC2BE,0x000D,0x0007,0x0003,0x0000,0xEAAF,0x0002,0xBDD8,0xEAAF,0x0003,0x0001,0xEAA8,0x0001,0xEAAD,0x0007,0x0003, 0x0000,0xEAAE,0x0002,0xEAAB,0xEAAC,0x0000,0x0001,0xEAAA,0x0034,0x001D,0x000E,0x0006,0x0003,0x0001,0xEAA9,0x0000, 0xC6DD,0x0004,0x0002,0xD5BD,0xEAA8,0x0002,0xBBF2,0xE3DE,0x0007,0x0003,0x0000,0xEAA7,0x0002,0xBDE4,0xCED2,0x0004, 0x0002,0xB3C9,0xCFB7,0x0002,0xC8D6,0xCAF9,0x000F,0x0008,0x0004,0x0002,0xD0E7,0xEAA7,0x0002,0xCEEC,0xCEEC,0x0004, 0x0002,0xB8EA,0xEDB0,0x0000,0xEDB0,0x0001,0x0004,0x0002,0xC1B5,0xDCB2,0x0000,0xC9E5,0x0013,0x000E,0x0006,0x0003, 0x0000,0xBEE5,0x0000,0xE2E3,0x0004,0x0002,0xD0FC,0xBBB3,0x0002,0xC0C1,0xE3C2,0x0000,0x0001,0x0000,0xB3CD,0x0007, 0x0001,0x0003,0x0000,0xE2FB,0x0000,0xC5B3,0x0004,0x0000,0x0001,0xEDAF,0x0003,0x0001,0xEDA1,0x0000,0xC3C9,0x0048, 0x0023,0x000C,0x0001,0x0007,0x0003,0x0000,0xE3C1,0x0002,0xC0C1,0xEDAF,0x0001,0x0001,0xE3C1,0x000D,0x0008,0x0004, 0x0002,0xE2F8,0xEDAE,0x0002,0xB0C3,0xD3A6,0x0000,0x0002,0xD0B8,0xBFD2,0x0006,0x0003,0x0001,0xC7DA,0x0000,0xB6AE, 0x0001,0x0000,0xBAB6,0x0011,0x0007,0x0001,0x0003,0x0001,0xE3C0,0x0000,0xD2E4,0x0004,0x0001,0x0000,0xCFDC,0x0003, 0x0001,0xB2D2,0x0000,0xE2E4,0x000C,0x0007,0x0004,0x0002,0xE3BD,0xC3F5,0x0001,0xEDAC,0x0000,0x0002,0xBAA9,0xE3BF, 0x0004,0x0000,0x0000,0xB7DF,0x0001,0x0001,0xEDAD,0x0022,0x0013,0x0005,0x0000,0x0001,0x0000,0xB5AC,0x0007,0x0003, 0x0000,0xE3BE,0x0002,0xE3B4,0xC6BE,0x0003,0x0000,0xC1AF,0x0002,0xD4F7,0xBDBE,0x0007,0x0000,0x0003,0x0001,0xB1EF, 0x0000,0xB1B9,0x0004,0x0001,0x0000,0xD3C7,0x0001,0x0000,0xD3FB,0x0016,0x000B,0x0004,0x0000,0x0000,0xC6DD,0x0003, 0x0001,0xBFB6,0x0002,0xC7EC,0xE3BC,0x0005,0x0000,0x0002,0xC9E5,0xE3A5,0x0003,0x0000,0xCEBF,0x0000,0xC2C7,0x000B, 0x0006,0x0003,0x0001,0xCBCB,0x0000,0xE2E6,0x0000,0x0002,0xBFAE,0xBBDB,0x0006,0x0003,0x0001,0xB9DF,0x0000,0xC2FD, 0x0003,0x0001,0xE2FA,0x0001,0xEDAB,0x00AE,0x004E,0x002E,0x0013,0x000A,0x0004,0x0001,0x0000,0xB2D1,0x0003,0x0000, 0xB2D2,0x0001,0xC4BD,0x0004,0x0001,0x0001,0xC9E5,0x0001,0x0002,0xC9F7,0xE3B3,0x000F,0x0008,0x0004,0x0002,0xBBC5, 0xCCAC,0x0002,0xE3BB,0xD0F3,0x0004,0x0002,0xB4C8,0xD2F3,0x0000,0xE8BA,0x0006,0x0003,0x0000,0xC0F5,0x0001,0xBBEC, 0x0003,0x0001,0xD4B8,0x0000,0xE2E9,0x000A,0x0005,0x0001,0x0000,0x0001,0xE2FD,0x0000,0x0000,0x0000,0xE2EB,0x000C, 0x0005,0x0000,0x0002,0xCBDF,0xE3BA,0x0004,0x0002,0xEDA8,0xC0A2,0x0000,0xE3B4,0x0005,0x0000,0x0002,0xB7DF,0xE3B6, 0x0000,0x0002,0xE3B3,0xB8D0,0x0029,0x0017,0x000B,0x0007,0x0004,0x0002,0xE3AB,0xB0AE,0x0000,0xD3DE,0x0001,0x0001, 0xE3B5,0x0004,0x0000,0x0001,0xCCE8,0x0004,0x0002,0xC3E5,0xD2E2,0x0002,0xE3B9,0xEDAA,0x000A,0x0004,0x0001,0x0001, 0xD3E4,0x0003,0x0000,0xD3FA,0x0000,0xEDA9,0x0004,0x0001,0x0001,0xB3EE,0x0000,0x0000,0xE3B8,0x001E,0x000E,0x0007, 0x0003,0x0001,0xE2FC,0x0002,0xD0CA,0xC8C7,0x0004,0x0002,0xDCE4,0xB4C0,0x0000,0xBBCC,0x0008,0x0004,0x0002,0xE3B7, 0xCFEB,0x0002,0xE3A2,0xC4D5,0x0004,0x0002,0xB6E8,0xB9DF,0x0002,0xB5AC,0xB2D1,0x000E,0x0007,0x0004,0x0002,0xE3AB, 0xB1B9,0x0001,0xB3CD,0x0004,0x0002,0xB2D2,0xBEE5,0x0000,0xB5EB,0x0004,0x0001,0x0001,0xB6F1,0x0004,0x0002,0xBBDD, 0xCEA9,0x0001,0xE3AE,0x0057,0x0028,0x0018,0x000E,0x0008,0x0004,0x0002,0xCFA7,0xC3C6,0x0002,0xE3B1,0xEAA1,0x0003, 0x0000,0xE3AF,0x0001,0xCCE8,0x0006,0x0003,0x0000,0xB5AD,0x0001,0xBBF3,0x0000,0x0001,0xC0B7,0x000B,0x0006,0x0003, 0x0001,0xCDEF,0x0000,0xBEAA,0x0001,0x0002,0xE3B0,0xC7E9,0x0001,0x0001,0x0001,0xC6E0,0x0019,0x000C,0x0005,0x0000, 0x0002,0xB5BF,0xE3AC,0x0003,0x0000,0xBCC2,0x0002,0xC3C6,0xE2EA,0x0007,0x0003,0x0000,0xE3B2,0x0002,0xB1AF,0xE3AD, 0x0003,0x0001,0xC3F5,0x0001,0xE3A5,0x000B,0x0005,0x0000,0x0002,0xD0FC,0xEDA8,0x0003,0x0000,0xC4FA,0x0000,0xD4C3, 0x0004,0x0000,0x0001,0xBBBC,0x0004,0x0002,0xD3C6,0xCEF2,0x0001,0xE3A6,0x002D,0x0016,0x000A,0x0006,0x0003,0x0001, 0xE3AA,0x0000,0xE3A4,0x0001,0x0000,0xE3A3,0x0006,0x0003,0x0000,0xBBDA,0x0000,0xE3A8,0x0003,0x0000,0xCCE8,0x0001, 0xBAB7,0x000C,0x0007,0x0003,0x0000,0xE3A9,0x0002,0xD5DC,0xCFA4,0x0001,0x0002,0xD4A5,0xD4C3,0x0005,0x0000,0x0002, 0xC7C4,0xE3A7,0x0003,0x0001,0xD3C1,0x0001,0xE3A2,0x0019,0x000E,0x0008,0x0004,0x0002,0xC4D5,0xE2FC,0x0002,0xE2FD, 0xE2FB,0x0003,0x0000,0xE2FA,0x0000,0xB6F1,0x0004,0x0000,0x0001,0xBFD2,0x0004,0x0002,0xC7A1,0xCFA2,0x0001,0xB9A7, 0x000F,0x0008,0x0004,0x0002,0xCCF1,0xB6B2,0x0002,0xE3A1,0xB6F7,0x0004,0x0002,0xBADE,0xEDA4,0x0001,0xB3DC,0x0007, 0x0004,0x0002,0xD0F4,0xEDA7,0x0000,0xBBD6,0x0001,0x0001,0xEDA2,0x150C,0x0A08,0x0515,0x02CC,0x0164,0x00B1,0x0052, 0x0029,0x0012,0x0008,0x0004,0x0001,0x0001,0xEDA3,0x0000,0x0000,0xEDA6,0x0006,0x0003,0x0000,0xCBA1,0x0001,0xBAE3, 0x0000,0x0001,0xBFD6,0x000C,0x0006,0x0003,0x0000,0xBBD0,0x0000,0xC1B5,0x0003,0x0000,0xD6BC,0x0001,0xBAE3,0x0005, 0x0001,0x0002,0xCAD1,0xE2FE,0x0003,0x0000,0xEDA5,0x0000,0xE2F8,0x0011,0x0007,0x0000,0x0003,0x0001,0xEDA1,0x0000, 0xD7DC,0x0006,0x0003,0x0000,0xE2F0,0x0000,0xBBD0,0x0001,0x0000,0xC7D3,0x000D,0x0005,0x0001,0x0002,0xE2F6,0xB9D6, 0x0004,0x0002,0xE2F5,0xD4B9,0x0002,0xD0D4,0xE2F1,0x0004,0x0000,0x0000,0xBCB1,0x0004,0x0002,0xE2F9,0xB5A1,0x0001, 0xE6A8,0x0035,0x001B,0x000F,0x0008,0x0004,0x0002,0xCBBC,0xC1AF,0x0002,0xE2F2,0xBDE3,0x0003,0x0000,0xE2EF,0x0002, 0xCCFB,0xB2C0,0x0007,0x0004,0x0002,0xC5C2,0xD5FA,0x0001,0xC5AD,0x0001,0x0002,0xE2F3,0xD4F5,0x000A,0x0006,0x0003, 0x0000,0xE2F4,0x0001,0xE2F7,0x0001,0x0001,0xE2EB,0x0008,0x0004,0x0002,0xE2EA,0xE2E6,0x0002,0xE2E4,0xCBCB,0x0004, 0x0002,0xCCAC,0xBBB3,0x0002,0xB7DE,0xE2E9,0x0014,0x000A,0x0006,0x0003,0x0000,0xBAF6,0x0000,0xD0C3,0x0000,0x0001, 0xE2EE,0x0004,0x0000,0x0000,0xC4EE,0x0003,0x0000,0xB3C0,0x0001,0xE2E5,0x000D,0x0007,0x0003,0x0000,0xE2ED,0x0002, 0xBFEC,0xE2EC,0x0003,0x0001,0xCDE6,0x0000,0xD3C7,0x0004,0x0000,0x0001,0xE2E8,0x0000,0x0002,0xE2E7,0xD6D2,0x0051, 0x002A,0x0017,0x000C,0x0004,0x0000,0x0000,0xE3C3,0x0004,0x0002,0xC3A6,0xCDFC,0x0002,0xD6BE,0xE2E2,0x0004,0x0001, 0x0001,0xDFAF,0x0004,0x0002,0xECFD,0xECFE,0x0000,0xE2E3,0x000B,0x0005,0x0000,0x0002,0xC8CC,0xBCC9,0x0003,0x0000, 0xE2E1,0x0001,0xD2E4,0x0000,0x0004,0x0002,0xB1D8,0xE2E0,0x0000,0xD0C4,0x0014,0x000B,0x0005,0x0000,0x0002,0xBBD5, 0xE1E8,0x0003,0x0000,0xB3B9,0x0000,0xB5C2,0x0004,0x0000,0x0000,0xD5F7,0x0001,0x0002,0xF5E8,0xCEA2,0x000B,0x0006, 0x0003,0x0000,0xE1E6,0x0001,0xD1AD,0x0000,0x0002,0xB8B4,0xE1E5,0x0001,0x0004,0x0002,0xD3F9,0xE1E2,0x0001,0xB4D3, 0x0032,0x0016,0x000B,0x0004,0x0000,0x0001,0xE1E4,0x0004,0x0002,0xE1E3,0xC5C7,0x0000,0xB5C3,0x0006,0x0003,0x0000, 0xE1E2,0x0001,0xCDBD,0x0000,0x0002,0xBEB6,0xD0EC,0x000E,0x0007,0x0003,0x0001,0xBAF3,0x0002,0xC2C9,0xBBB2,0x0004, 0x0002,0xE1E0,0xBADC,0x0000,0xE1DF,0x0007,0x0004,0x0002,0xB4FD,0xBEB6,0x0001,0xE1DE,0x0004,0x0002,0xD5F7,0xCDF9, 0x0000,0xB7F0,0x0017,0x000E,0x0006,0x0003,0x0001,0xB1CB,0x0000,0xB3B9,0x0004,0x0002,0xD2DB,0xE2EC,0x0002,0xE1DD, 0xBCB3,0x0004,0x0001,0x0000,0xE1DC,0x0000,0x0002,0xD3B0,0xD5C3,0x000E,0x0008,0x0004,0x0002,0xC5ED,0xB1F2,0x0002, 0xB5F1,0xB1EB,0x0003,0x0000,0xB2CA,0x0001,0xD1E5,0x0007,0x0004,0x0002,0xD1E5,0xCDAE,0x0001,0xD0CE,0x0000,0x0000, 0xE1EA,0x00B0,0x0057,0x002B,0x0017,0x000A,0x0003,0x0000,0xD2CD,0x0003,0x0001,0xBBE3,0x0002,0xE5E9,0xE5E7,0x0007, 0x0004,0x0002,0xE5E8,0xC2BC,0x0001,0xB5B1,0x0003,0x0000,0xB9E9,0x0000,0xE5E6,0x000C,0x0006,0x0003,0x0000,0xCDE4, 0x0000,0xC3D6,0x0003,0x0000,0xC7BF,0x0000,0xB5AF,0x0004,0x0000,0x0000,0xB1F0,0x0001,0x0000,0xECB0,0x0017,0x000B, 0x0004,0x0001,0x0000,0xE5F6,0x0004,0x0002,0xC7BF,0xB5AF,0x0001,0xC7BF,0x0006,0x0003,0x0001,0xD5C5,0x0001,0xE5F2, 0x0003,0x0001,0xC8F5,0x0001,0xCDE4,0x000B,0x0004,0x0000,0x0001,0xE5F4,0x0004,0x0002,0xE5F2,0xE5F3,0x0001,0xBBA1, 0x0005,0x0000,0x0002,0xCFD2,0xC3D6,0x0001,0x0002,0xD5C5,0xB5DC,0x0030,0x0019,0x000B,0x0006,0x0003,0x0001,0xB0D0, 0x0001,0xB3DA,0x0001,0x0002,0xBAEB,0xB8A5,0x0007,0x0003,0x0001,0xD2FD,0x0002,0xB5F5,0xB9AD,0x0004,0x0002,0xDFB1, 0xDFB1,0x0001,0xCABD,0x000A,0x0004,0x0001,0x0001,0xDFAE,0x0003,0x0000,0xB1D7,0x0000,0xDEC4,0x0005,0x0001,0x0002, 0xC5AA,0xC6FA,0x0004,0x0002,0xD2EC,0xDBCD,0x0002,0xBFAA,0xD8A5,0x0012,0x000A,0x0004,0x0000,0x0000,0xDEC3,0x0003, 0x0000,0xBDA8,0x0001,0xCDA2,0x0000,0x0003,0x0000,0xD1D3,0x0002,0xDBC8,0xCCFC,0x000B,0x0004,0x0001,0x0000,0xC2AE, 0x0004,0x0002,0xE2DE,0xE2DE,0x0000,0xE2DD,0x0004,0x0001,0x0001,0xB9E3,0x0004,0x0002,0xB7CF,0xE2D0,0x0002,0xB3A7, 0xC3ED,0x0059,0x002E,0x0019,0x000C,0x0006,0x0003,0x0001,0xD8CB,0x0001,0xE2DC,0x0003,0x0000,0xB3F8,0x0001,0xD5B1, 0x0008,0x0004,0x0002,0xC1CE,0xD2F1,0x0002,0xC2A5,0xC0AA,0x0000,0x0002,0xE2DA,0xE2DB,0x000C,0x0005,0x0001,0x0002, 0xF5F4,0xCBD1,0x0004,0x0002,0xC0C8,0xC1AE,0x0000,0xCFC3,0x0004,0x0001,0x0000,0xBEC7,0x0000,0x0002,0xCFE1,0xB2DE, 0x0013,0x000B,0x0004,0x0000,0x0000,0xE2D7,0x0003,0x0001,0xE2D5,0x0002,0xD3B9,0xBFB5,0x0000,0x0004,0x0002,0xCAFC, 0xE2D6,0x0001,0xE2D8,0x000C,0x0006,0x0003,0x0001,0xCDA5,0x0001,0xBFE2,0x0003,0x0000,0xE2D1,0x0001,0xD7F9,0x0007, 0x0004,0x0002,0xB6C8,0xE2D3,0x0000,0xD6C5,0x0001,0x0002,0xE2D4,0xB7CF,0x0033,0x001C,0x000D,0x0006,0x0003,0x0000, 0xC5D3,0x0000,0xB8AE,0x0004,0x0002,0xB8FD,0xC3ED,0x0001,0xB5EA,0x0008,0x0004,0x0002,0xE2D2,0xB5D7,0x0002,0xD3A6, 0xBFE2,0x0003,0x0001,0xE2D0,0x0002,0xC2AE,0xD0F2,0x000A,0x0004,0x0001,0x0001,0xE2D1,0x0003,0x0000,0xB4B2,0x0001, 0xB1D3,0x0006,0x0003,0x0000,0xC7EC,0x0000,0xD7AF,0x0003,0x0000,0xB2E0,0x0002,0xE2CF,0xB9E3,0x001B,0x000F,0x0008, 0x0004,0x0002,0xBCB8,0xD3C4,0x0002,0xD3D7,0xBBC3,0x0004,0x0002,0xE7DB,0xB8C9,0x0000,0xD0D2,0x0008,0x0004,0x0002, 0xB2A2,0xBFAA,0x0002,0xC4EA,0xC6BD,0x0000,0x0000,0xB8C9,0x0006,0x0000,0x0001,0x0002,0xE0FC,0xB0EF,0x0004,0x0001, 0x0001,0xB1D2,0x0004,0x0002,0xB4B1,0xE1A6,0x0001,0xD6C4,0x011C,0x00AF,0x004D,0x0025,0x0014,0x000C,0x0005,0x0002, 0xE1A5,0x0001,0xBEB0,0x0003,0x0000,0xE1A4,0x0002,0xC4BB,0xE0FD,0x0000,0x0003,0x0000,0xE0FE,0x0002,0xC4BB,0xE1A3, 0x0005,0x0000,0x0001,0x0001,0xBBCF,0x0005,0x0001,0x0002,0xB7F9,0xE1A2,0x0004,0x0002,0xE0F8,0xC3DD,0x0001,0xD6A1, 0x0016,0x000B,0x0005,0x0001,0x0002,0xC3B1,0xE0FE,0x0003,0x0000,0xE0FD,0x0001,0xB3A3,0x0005,0x0000,0x0002,0xE1A1, 0xB4F8,0x0003,0x0000,0xD5CA,0x0000,0xE0FC,0x000A,0x0006,0x0003,0x0001,0xB0EF,0x0000,0xCFAF,0x0000,0x0000,0xCAA6, 0x0000,0x0004,0x0002,0xD6A1,0xB4F8,0x0000,0xCBA7,0x0030,0x0019,0x000D,0x0005,0x0001,0x0002,0xB5DB,0xD6C4,0x0004, 0x0002,0xB2AF,0xD6E3,0x0002,0xE0F9,0xC1B1,0x0007,0x0003,0x0001,0xCCFB,0x0002,0xC5C1,0xE0FA,0x0001,0x0002,0xE0FB, 0xD5CA,0x000A,0x0006,0x0003,0x0000,0xE0F8,0x0001,0xCFA3,0x0001,0x0001,0xCAA6,0x0006,0x0003,0x0001,0xB7AB,0x0000, 0xCBA7,0x0004,0x0002,0xB2BC,0xCAD0,0x0000,0xB1D2,0x0019,0x000B,0x0007,0x0004,0x0002,0xCAD0,0xBDED,0x0000,0xD9E3, 0x0001,0x0000,0xDAE1,0x0006,0x0003,0x0000,0xCFEF,0x0001,0xB0CD,0x0004,0x0002,0xCBC8,0xD2D1,0x0002,0xBCBA,0xDBCF, 0x000C,0x0005,0x0000,0x0002,0xDBCF,0xB2EE,0x0003,0x0000,0xCED7,0x0002,0xB9AE,0xBEDE,0x0007,0x0004,0x0002,0xC7C9, 0xD7F3,0x0000,0xB9A4,0x0003,0x0001,0xB3B2,0x0000,0xD1B2,0x003C,0x0021,0x0014,0x000A,0x0006,0x0003,0x0001,0xD6DD, 0x0000,0xB4A8,0x0000,0x0000,0xE7DD,0x0006,0x0003,0x0001,0xD1D2,0x0001,0xE1DB,0x0000,0x0001,0xC2CD,0x0008,0x0004, 0x0001,0x0000,0xCEA1,0x0000,0x0000,0xBFF9,0x0000,0x0001,0x0000,0xE1DB,0x0012,0x000B,0x0005,0x0001,0x0002,0xD4C0, 0xD3EC,0x0003,0x0001,0xC1EB,0x0001,0xE1C9,0x0000,0x0003,0x0000,0xE1DA,0x0001,0xE1AE,0x0001,0x0004,0x0000,0x0000, 0xE1BB,0x0001,0x0001,0xE1BD,0x001E,0x000D,0x0008,0x0004,0x0001,0x0000,0xE1D8,0x0001,0x0000,0xE1D7,0x0000,0x0000, 0x0000,0xE1C0,0x0005,0x0001,0x0000,0x0001,0xB4DD,0x0006,0x0003,0x0000,0xE1AB,0x0001,0xD5B8,0x0003,0x0001,0xE1D6, 0x0000,0xE1D0,0x0006,0x0001,0x0000,0x0001,0x0001,0xE1D5,0x0000,0x0006,0x0003,0x0000,0xE1CF,0x0001,0xE1CD,0x0003, 0x0000,0xE1D1,0x0000,0xE1D4,0x0090,0x0040,0x001F,0x0011,0x000A,0x0004,0x0001,0x0000,0xE1D0,0x0003,0x0000,0xE1CE, 0x0001,0xE1C9,0x0001,0x0003,0x0001,0xD1D2,0x0001,0xE1B0,0x0009,0x0004,0x0001,0x0001,0xC7B6,0x0000,0x0002,0xE1D2, 0xE1D3,0x0000,0x0000,0x0000,0xEFFA,0x000C,0x0007,0x0000,0x0003,0x0001,0xE1CA,0x0000,0xE1CC,0x0000,0x0001,0x0001, 0xE1CB,0x000A,0x0006,0x0003,0x0001,0xE1C4,0x0000,0xD5B8,0x0001,0x0000,0xB1C0,0x0007,0x0004,0x0002,0xE1C2,0xE1C3, 0x0001,0xE1C5,0x0000,0x0001,0xE1BF,0x0027,0x0016,0x000B,0x0004,0x0000,0x0001,0xE1C6,0x0004,0x0002,0xE1C8,0xBEFE, 0x0000,0xC2D8,0x0007,0x0004,0x0002,0xB8DA,0xD1C2,0x0001,0xB4DE,0x0001,0x0000,0xC0A5,0x0007,0x0000,0x0003,0x0001, 0xC6E9,0x0000,0xE1C1,0x0005,0x0000,0x0002,0xB3E7,0xE1C7,0x0000,0x0002,0xE1C1,0xE1C0,0x0014,0x000A,0x0006,0x0003, 0x0000,0xF6B9,0x0000,0xCFBF,0x0000,0x0000,0xBEFE,0x0006,0x0003,0x0001,0xB5BA,0x0001,0xE1AD,0x0001,0x0001,0xB7E5, 0x000A,0x0004,0x0001,0x0000,0xC7CD,0x0003,0x0001,0xD3F8,0x0001,0xB6EB,0x0007,0x0003,0x0001,0xC2CD,0x0002,0xE1BF, 0xE1BD,0x0001,0x0000,0xCFBF,0x004A,0x001B,0x000D,0x0008,0x0004,0x0000,0x0001,0xE1CD,0x0001,0x0000,0xD6C5,0x0001, 0x0000,0x0001,0xE1BC,0x0006,0x0001,0x0000,0x0002,0xE1BE,0xB8B7,0x0004,0x0001,0x0001,0xE1BB,0x0001,0x0000,0xE1B9, 0x0016,0x000A,0x0006,0x0003,0x0000,0xBFF9,0x0000,0xE1B4,0x0001,0x0001,0xB0B6,0x0006,0x0003,0x0000,0xE1BA,0x0000, 0xE1B2,0x0003,0x0000,0xD4C0,0x0000,0xE1B7,0x000E,0x0007,0x0003,0x0001,0xCDD3,0x0002,0xC1EB,0xE1B5,0x0003,0x0000, 0xE1B6,0x0002,0xD1D2,0xF6B4,0x0004,0x0001,0x0000,0xDAE9,0x0004,0x0002,0xE1B8,0xE1B3,0x0000,0xB8D4,0x002A,0x001A, 0x000E,0x0006,0x0003,0x0000,0xCFBF,0x0001,0xE1B1,0x0004,0x0002,0xB5BA,0xE1B0,0x0002,0xE1AE,0xE1AD,0x0007,0x0004, 0x0002,0xB8DA,0xE1AB,0x0001,0xB2ED,0x0001,0x0002,0xE1AF,0xE1AA,0x0009,0x0005,0x0001,0x0002,0xE1A9,0xE1A7,0x0001, 0x0001,0xE1AC,0x0001,0x0003,0x0001,0xC6F1,0x0000,0xCBEA,0x000F,0x000A,0x0004,0x0000,0x0000,0xD3EC,0x0003,0x0001, 0xE1A8,0x0000,0xD2D9,0x0001,0x0001,0x0000,0xC9BD,0x000B,0x0007,0x0004,0x0002,0xCDCD,0xE5F8,0x0001,0xCAF4,0x0001, 0x0001,0xE5F0,0x0007,0x0003,0x0001,0xE5F0,0x0002,0xC2C4,0xB2E3,0x0004,0x0002,0xE5EF,0xC2C5,0x0002,0xC2C5,0xCDC0, 0x0284,0x0189,0x00C3,0x005B,0x002E,0x0012,0x000A,0x0004,0x0001,0x0000,0xCAF4,0x0003,0x0000,0xCCEB,0x0001,0xE5ED, 0x0004,0x0001,0x0001,0xD5B9,0x0001,0x0001,0xD0BC,0x000F,0x0008,0x0004,0x0002,0xE5EC,0xC6C1,0x0002,0xCABA,0xCAAC, 0x0003,0x0001,0xCEDD,0x0002,0xBDEC,0xCCEB,0x0008,0x0004,0x0002,0xC7FC,0xBDEC,0x0002,0xBDEC,0xBED3,0x0001,0x0002, 0xB2E3,0xC6A8,0x001B,0x0010,0x0008,0x0004,0x0002,0xBED6,0xC4F2,0x0002,0xCEB2,0xBEA1,0x0004,0x0002,0xC4E1,0xE5EA, 0x0002,0xB3DF,0xD2FC,0x0005,0x0000,0x0002,0xCAAC,0xDECF,0x0003,0x0000,0xDECF,0x0001,0xBECD,0x0005,0x0001,0x0000, 0x0000,0xDECE,0x0007,0x0004,0x0002,0xC5D3,0xD2A2,0x0001,0xDECD,0x0003,0x0000,0xD3C8,0x0000,0xDECC,0x0036,0x001A, 0x000C,0x0006,0x0003,0x0001,0xCFCA,0x0001,0xB3A2,0x0003,0x0000,0xE6D9,0x0000,0xC9D0,0x0007,0x0003,0x0000,0xB3BE, 0x0002,0xBCE2,0xE6D8,0x0003,0x0000,0xB6FB,0x0002,0xB6FB,0xC9D9,0x000E,0x0007,0x0003,0x0001,0xD0A1,0x0002,0xB5BC, 0xB6D4,0x0003,0x0001,0xD1B0,0x0002,0xD7F0,0xCEBE,0x0007,0x0004,0x0002,0xD7A8,0xBDAB,0x0000,0xBDAB,0x0004,0x0002, 0xC9E4,0xB7F3,0x0001,0xB7E2,0x0014,0x000C,0x0004,0x0000,0x0001,0xCAD9,0x0004,0x0002,0xB5BC,0xD1B0,0x0002,0xCBC2, 0xB6D4,0x0000,0x0003,0x0000,0xB4E7,0x0002,0xB1A6,0xB3E8,0x000E,0x0007,0x0004,0x0002,0xE5BE,0xBFA1,0x0000,0xE5BC, 0x0004,0x0002,0xBFED,0xD0B4,0x0001,0xC9F3,0x0008,0x0004,0x0002,0xD5AF,0xC4FE,0x0002,0xCAB5,0xC1C8,0x0004,0x0002, 0xE5BB,0xCEF2,0x0002,0xC7DE,0xB9D1,0x0064,0x0031,0x001A,0x000C,0x0008,0x0004,0x0002,0xF1C0,0xB2EC,0x0002,0xC4AF, 0xC7DE,0x0001,0x0001,0xF1C1,0x0006,0x0003,0x0000,0xD6C3,0x0000,0xBDFE,0x0004,0x0002,0xCAB5,0xD4A2,0x0002,0xBAAE, 0xC7DE,0x000A,0x0006,0x0003,0x0000,0xC3C2,0x0001,0xC4FE,0x0000,0x0000,0xB8BB,0x0007,0x0003,0x0001,0xBFDC,0x0002, 0xC3DC,0xD2FA,0x0003,0x0000,0xBCC4,0x0000,0xBCC5,0x0018,0x000C,0x0008,0x0004,0x0002,0xB2C9,0xCBDE,0x0002,0xB1F6, 0xBFED,0x0001,0x0001,0xC8DD,0x0007,0x0003,0x0000,0xE5B7,0x0002,0xBCD2,0xCFFC,0x0000,0x0002,0xD1E7,0xBAA6,0x000C, 0x0006,0x0003,0x0000,0xD4D7,0x0000,0xB9AC,0x0003,0x0001,0xB9AC,0x0000,0xCFDC,0x0007,0x0003,0x0001,0xBBC2,0x0002, 0xBBC2,0xE5B6,0x0004,0x0002,0xCAD2,0xD0FB,0x0002,0xBFCD,0xC9F3,0x0033,0x001A,0x000F,0x0007,0x0003,0x0000,0xB3E8, 0x0002,0xCAB5,0xB1A6,0x0004,0x0002,0xD2CB,0xCDF0,0x0002,0xB6A8,0xD6E6,0x0007,0x0004,0x0002,0xB9D9,0xD7DA,0x0001, 0xE5B4,0x0000,0x0001,0xE5B5,0x000B,0x0004,0x0000,0x0001,0xBAEA,0x0004,0x0002,0xCDEA,0xCBCE,0x0001,0xB0B2,0x0007, 0x0004,0x0002,0xCAD8,0xD3EE,0x0001,0xD5AC,0x0004,0x0002,0xE5B3,0xCBFC,0x0001,0xC4FE,0x0017,0x000B,0x0007,0x0004, 0x0002,0xE5B2,0xC2CF,0x0001,0xC4F5,0x0001,0x0000,0xC8E6,0x0006,0x0003,0x0000,0xD1A7,0x0001,0xB7F5,0x0003,0x0001, 0xE6DC,0x0001,0xE5EE,0x000C,0x0004,0x0000,0x0000,0xCAEB,0x0004,0x0002,0xD8AB,0xCBEF,0x0002,0xC2CF,0xBAA2,0x0005, 0x0001,0x0002,0xD1A7,0xE6DB,0x0004,0x0002,0xB9C2,0xBCBE,0x0000,0xE6DF,0x007F,0x0046,0x0028,0x001A,0x000C,0x0004, 0x0001,0x0000,0xC3CF,0x0004,0x0002,0xD0A2,0xD7CE,0x0002,0xD8C3,0xE6DA,0x0007,0x0004,0x0002,0xCBEF,0xB4E6,0x0000, 0xD7D6,0x0004,0x0002,0xD4D0,0xBFD7,0x0000,0xE6DE,0x0009,0x0005,0x0000,0x0002,0xE6DD,0xD7D3,0x0000,0x0001,0xE6AE, 0x0001,0x0001,0x0000,0xC4EF,0x0011,0x0005,0x0000,0x0000,0x0001,0xE6D7,0x0006,0x0003,0x0001,0xC9F4,0x0000,0xE6D6, 0x0003,0x0001,0xD9F8,0x0001,0xE6D5,0x0008,0x0004,0x0000,0x0001,0xD3A4,0x0001,0x0001,0xE6C9,0x0001,0x0000,0x0001, 0xE6D6,0x001D,0x0010,0x0008,0x0004,0x0000,0x0000,0xE6C8,0x0000,0x0000,0xF4C1,0x0000,0x0003,0x0000,0xE6CD,0x0002, 0xE6D3,0xE6D4,0x0007,0x0001,0x0003,0x0001,0xBDBF,0x0000,0xE6BF,0x0000,0x0000,0x0002,0xE6D2,0xE6AC,0x000A,0x0005, 0x0001,0x0001,0x0000,0xE6B5,0x0001,0x0000,0x0000,0xE5FC,0x0008,0x0004,0x0000,0x0000,0xE6CD,0x0001,0x0000,0xE6C6, 0x0006,0x0003,0x0000,0xC4DB,0x0001,0xE6CF,0x0001,0x0000,0xE6CC,0x004D,0x0029,0x001A,0x000D,0x0007,0x0004,0x0002, 0xB5D5,0xE6CB,0x0000,0xEAC7,0x0003,0x0001,0xE6D1,0x0001,0xC2FD,0x0007,0x0003,0x0001,0xE6D0,0x0002,0xE5FD,0xE6CE, 0x0003,0x0001,0xE6C9,0x0001,0xE6C8,0x0007,0x0001,0x0003,0x0001,0xCFD3,0x0000,0xF4C1,0x0004,0x0000,0x0000,0xBCB5, 0x0001,0x0001,0xC9A9,0x0016,0x000B,0x0006,0x0003,0x0000,0xBCDE,0x0001,0xE6C5,0x0000,0x0002,0xC2E8,0xE6C1,0x0004, 0x0000,0x0001,0xE6CA,0x0003,0x0000,0xEBF4,0x0002,0xCFB1,0xE6C7,0x0009,0x0005,0x0001,0x0002,0xE6A3,0xCDB5,0x0001, 0x0001,0xE6C1,0x0000,0x0001,0x0000,0xE6B4,0x000C,0x0000,0x0006,0x0001,0x0001,0x0002,0xE6C2,0xC3C4,0x0001,0x0001, 0x0001,0xC3BD,0x0012,0x0008,0x0004,0x0001,0x0000,0xD0F6,0x0001,0x0001,0xE6C4,0x0005,0x0001,0x0002,0xE6C3,0xC9F4, 0x0000,0x0002,0xE6BF,0xD3A4,0x0008,0x0001,0x0004,0x0002,0xE6AB,0xD2F9,0x0001,0xC0B7,0x0005,0x0001,0x0002,0xE6BA, 0xB8BE,0x0001,0x0001,0xE6BE,0x012C,0x0089,0x003D,0x0019,0x000B,0x0001,0x0006,0x0003,0x0000,0xBBE9,0x0001,0xC4DD, 0x0000,0x0001,0xE6BC,0x0005,0x0000,0x0001,0x0000,0xE6B9,0x0005,0x0000,0x0002,0xE6BB,0xCDF1,0x0000,0x0000,0xC6C5, 0x0011,0x000A,0x0006,0x0003,0x0001,0xC2A6,0x0000,0xE6B9,0x0001,0x0000,0xE6BD,0x0001,0x0003,0x0000,0xC8A2,0x0000, 0xE6B5,0x0009,0x0005,0x0000,0x0002,0xE6B4,0xD3E9,0x0000,0x0001,0xE6D2,0x0004,0x0000,0x0001,0xC3E4,0x0003,0x0001, 0xB6F0,0x0001,0xE6B7,0x0029,0x0012,0x000A,0x0005,0x0001,0x0002,0xC9EF,0xBEEA,0x0001,0x0002,0xC4C8,0xD3E9,0x0004, 0x0001,0x0000,0xC4EF,0x0001,0x0001,0xE6B8,0x0008,0x0004,0x0000,0x0001,0xE6B6,0x0001,0x0000,0xE6B2,0x0007,0x0003, 0x0001,0xE6B3,0x0002,0xE6AE,0xBDBF,0x0004,0x0002,0xE6AC,0xE6AB,0x0002,0xC2A6,0xCDDE,0x0011,0x000A,0x0006,0x0003, 0x0001,0xCDFE,0x0001,0xD7CB,0x0001,0x0001,0xD2F6,0x0000,0x0003,0x0001,0xE6B1,0x0001,0xD9A7,0x0005,0x0001,0x0001, 0x0000,0xBCA7,0x0006,0x0003,0x0000,0xD6B6,0x0000,0xD2CC,0x0004,0x0002,0xBCE9,0xC0D1,0x0001,0xE6AF,0x0053,0x0028, 0x0013,0x0007,0x0001,0x0003,0x0001,0xE6AD,0x0000,0xBDAA,0x0007,0x0003,0x0000,0xD2A6,0x0002,0xE6B0,0xE6A9,0x0001, 0x0002,0xCEAF,0xD0D5,0x000D,0x0007,0x0004,0x0002,0xE6A6,0xB9C3,0x0000,0xBDE3,0x0003,0x0001,0xE6A9,0x0001,0xCABC, 0x0004,0x0000,0x0000,0xE6A2,0x0000,0x0000,0xC4B7,0x0010,0x0007,0x0001,0x0003,0x0000,0xE6AA,0x0001,0xC6DE,0x0005, 0x0000,0x0002,0xC3C3,0xC3C3,0x0001,0x0001,0xC4E3,0x000C,0x0006,0x0003,0x0000,0xE6A7,0x0001,0xE6A8,0x0003,0x0000, 0xC4DD,0x0001,0xE6A3,0x0007,0x0004,0x0002,0xE5FD,0xE5FC,0x0000,0xB7C1,0x0004,0x0002,0xB7E1,0xCDD7,0x0002,0xE6A5, 0xE5FE,0x0028,0x0012,0x0006,0x0001,0x0000,0x0002,0xE6A4,0xD7B1,0x0006,0x0003,0x0001,0xC3EE,0x0001,0xE6A1,0x0003, 0x0000,0xD1FD,0x0001,0xBCCB,0x0008,0x0004,0x0000,0x0000,0xB6CA,0x0000,0x0001,0xE5FB,0x0007,0x0003,0x0000,0xC8D1, 0x0002,0xC2E8,0xB8BE,0x0003,0x0000,0xD7B1,0x0002,0xCDFD,0xE5FA,0x0018,0x000B,0x0005,0x0000,0x0002,0xC8E7,0xE5F9, 0x0003,0x0001,0xBAC3,0x0000,0xE6B1,0x0006,0x0003,0x0001,0xCBFD,0x0000,0xBCE9,0x0003,0x0000,0xC4CC,0x0002,0xC5AB, 0xC5AE,0x0005,0x0001,0x0000,0x0000,0xB7DC,0x0007,0x0004,0x0002,0xB6E1,0xDEC6,0x0001,0xB0C2,0x0000,0x0001,0xB0C2, 0x00B1,0x005F,0x002E,0x0016,0x0007,0x0000,0x0003,0x0000,0xC9DD,0x0000,0xB5EC,0x0007,0x0003,0x0000,0xDEC9,0x0002, 0xDECA,0xCCD7,0x0004,0x0002,0xBDB1,0xDEC8,0x0002,0xB1BC,0xC9DD,0x000D,0x0007,0x0003,0x0001,0xC6F5,0x0002,0xDBBC, 0xD7E0,0x0003,0x0000,0xBFFC,0x0001,0xB7DC,0x0007,0x0003,0x0001,0xB7EE,0x0002,0xC4CE,0xC6E6,0x0001,0x0000,0xD1D9, 0x0017,0x000B,0x0005,0x0000,0x0002,0xDBBC,0xDEC6,0x0003,0x0000,0xBCD0,0x0000,0xDEC5,0x0008,0x0004,0x0002,0xB6E1, 0xBCD0,0x0002,0xBFE4,0xD2C4,0x0001,0x0000,0xCDB7,0x000D,0x0006,0x0003,0x0001,0xCAA7,0x0001,0xBABB,0x0004,0x0002, 0xD1EB,0xD8B2,0x0001,0xB7F2,0x0007,0x0004,0x0002,0xCCAB,0xCCEC,0x0001,0xB4F3,0x0003,0x0001,0xE2B7,0x0000,0xE2B9, 0x0027,0x0017,0x000B,0x0007,0x0003,0x0000,0xC3CE,0x0002,0xB9BB,0xB9BB,0x0001,0x0000,0xD2B9,0x0005,0x0000,0x0002, 0xB6E0,0xD9ED,0x0004,0x0002,0xCDE2,0xCFA6,0x0000,0xD9E7,0x0008,0x0004,0x0001,0x0001,0xCFC4,0x0000,0x0001,0xB8B4, 0x0004,0x0001,0x0001,0xB1B8,0x0001,0x0000,0xB4A6,0x0017,0x000C,0x0006,0x0003,0x0000,0xE2BA,0x0001,0xB6D7,0x0003, 0x0001,0xCAD9,0x0000,0xBAF8,0x0005,0x0000,0x0002,0xBAF8,0xD2BC,0x0003,0x0000,0xBAF8,0x0001,0xBFC7,0x000C,0x0005, 0x0001,0x0002,0xC9F9,0xD7B3,0x0003,0x0000,0xD7B3,0x0002,0xC8C9,0xCABF,0x0004,0x0000,0x0001,0xB0D3,0x0001,0x0000, 0xC8C0,0x0048,0x0027,0x0017,0x000A,0x0006,0x0003,0x0000,0xDBDE,0x0001,0xC2A2,0x0000,0x0000,0xBBB5,0x0007,0x0004, 0x0002,0xDBE4,0xDBDB,0x0000,0xC0DD,0x0003,0x0001,0xBABE,0x0001,0xD1B9,0x0008,0x0004,0x0000,0x0001,0xDBD6,0x0000, 0x0000,0xDBF7,0x0004,0x0001,0x0001,0xCCB3,0x0000,0x0001,0xDBD5,0x000F,0x000A,0x0004,0x0000,0x0001,0xB1DA,0x0003, 0x0000,0xBFD1,0x0000,0xDBD4,0x0001,0x0001,0x0001,0xB7D8,0x000B,0x0004,0x0000,0x0001,0xEDE3,0x0003,0x0000,0xB6E9, 0x0002,0xB5D8,0xB6D7,0x0000,0x0003,0x0001,0xB6D5,0x0000,0xC4AB,0x0027,0x0014,0x000B,0x0004,0x0001,0x0001,0xD0E6, 0x0004,0x0002,0xD4F6,0xEDCD,0x0000,0xD7B9,0x0005,0x0000,0x0002,0xDCAE,0xC7BD,0x0001,0x0001,0xC4B9,0x0008,0x0004, 0x0000,0x0000,0xC9CA,0x0000,0x0000,0xB9F9,0x0005,0x0000,0x0002,0xB5E6,0xDCAD,0x0003,0x0001,0xCAFB,0x0001,0xBEB3, 0x0016,0x000C,0x0006,0x0003,0x0001,0xDCAC,0x0000,0xDCAF,0x0003,0x0000,0xDBD3,0x0000,0xD7A9,0x0004,0x0000,0x0001, 0xC7B5,0x0003,0x0001,0xB3BE,0x0000,0xDCA1,0x0006,0x0001,0x0001,0x0002,0xDCAB,0xCCEE,0x0001,0x0003,0x0001,0xDCAA, 0x0000,0xDBF7,0x0562,0x0287,0x013D,0x0099,0x004B,0x0029,0x0013,0x0007,0x0003,0x0000,0xCEEB,0x0000,0x0001,0xC8FB, 0x0006,0x0003,0x0001,0xDAA3,0x0001,0xCCC1,0x0003,0x0000,0xCDBF,0x0001,0xCBFE,0x000D,0x0006,0x0003,0x0001,0xDBF5, 0x0000,0xCBDC,0x0003,0x0000,0xDBEE,0x0002,0xEBF3,0xCBFA,0x0005,0x0000,0x0002,0xDCE3,0xBFE9,0x0001,0x0001,0xDCA8, 0x000D,0x0007,0x0001,0x0003,0x0000,0xBCEE,0x0000,0xB8D4,0x0001,0x0001,0x0002,0xB6C2,0xB3A1,0x000D,0x0007,0x0003, 0x0001,0xBCB2,0x0002,0xB1A8,0xD1DF,0x0003,0x0000,0xD2A2,0x0000,0xBBCA,0x0004,0x0000,0x0001,0xBFB0,0x0001,0x0001, 0xB5CC,0x0027,0x0013,0x000B,0x0005,0x0001,0x0002,0xB1A4,0xDCA9,0x0003,0x0001,0xDCA6,0x0000,0xDBF6,0x0004,0x0001, 0x0000,0xDCA7,0x0001,0x0000,0xB6E9,0x0008,0x0004,0x0001,0x0000,0xC7B5,0x0001,0x0000,0xDCA2,0x0005,0x0000,0x0002, 0xDCA1,0xDBD1,0x0004,0x0002,0xDDC0,0xB6D1,0x0000,0xBCE1,0x0018,0x000A,0x0006,0x0003,0x0001,0xCCC3,0x0001,0xDCA5, 0x0001,0x0000,0xDCA3,0x0007,0x0003,0x0001,0xBBF9,0x0002,0xC5E0,0xDBFC,0x0004,0x0002,0xD6B4,0xD6B4,0x0001,0xDBFA, 0x000A,0x0004,0x0000,0x0000,0xBFB2,0x0003,0x0000,0xDBFB,0x0000,0xDCA4,0x0001,0x0001,0x0001,0xDBFD,0x0051,0x0029, 0x0018,0x000C,0x0005,0x0001,0x0002,0xDBEB,0xB2BA,0x0003,0x0000,0xD3F2,0x0002,0xDBFE,0xD2B0,0x0007,0x0003,0x0001, 0xDBF6,0x0002,0xDBF7,0xDBF5,0x0001,0x0002,0xDBF4,0xC6D2,0x0009,0x0004,0x0000,0x0001,0xDBF8,0x0000,0x0002,0xDBEF, 0xB3C7,0x0004,0x0000,0x0000,0xC2F1,0x0000,0x0000,0xF0AE,0x0011,0x0006,0x0000,0x0000,0x0002,0xB0A3,0xB9A1,0x0006, 0x0003,0x0001,0xDBAE,0x0001,0xDBF9,0x0001,0x0002,0xDBFB,0xDBF1,0x000A,0x0004,0x0000,0x0001,0xDBEE,0x0003,0x0001, 0xBFE5,0x0000,0xDBEB,0x0006,0x0003,0x0000,0xB5E6,0x0000,0xDBD1,0x0004,0x0002,0xDBF0,0xBFD1,0x0001,0xDBEC,0x0026, 0x0012,0x0009,0x0000,0x0004,0x0002,0xD4AB,0xB9B8,0x0002,0xDBD2,0xDBF3,0x0004,0x0000,0x0000,0xB6E2,0x0001,0x0002, 0xBAF1,0xDCA7,0x0009,0x0005,0x0000,0x0002,0xDBF2,0xC0DD,0x0001,0x0001,0xDBED,0x0004,0x0000,0x0000,0xD0CD,0x0003, 0x0001,0xDBE4,0x0002,0xDBE2,0xC2A2,0x0015,0x0009,0x0005,0x0000,0x0002,0xC0AC,0xB4B9,0x0001,0x0001,0xDBE5,0x0004, 0x0000,0x0000,0xDBE6,0x0004,0x0002,0xBFC0,0xDBE9,0x0002,0xC7F0,0xC2BD,0x000A,0x0004,0x0000,0x0000,0xDBEA,0x0003, 0x0000,0xC5F7,0x0000,0xDBE8,0x0008,0x0004,0x0002,0xDBE3,0xC6BA,0x0002,0xDBE1,0xDBE7,0x0003,0x0001,0xCCB9,0x0001, 0xC0A4,0x00AC,0x0057,0x002D,0x0017,0x000C,0x0004,0x0001,0x0001,0xC6C2,0x0004,0x0002,0xD7B9,0xB7D8,0x0002,0xCEEB, 0xB0D3,0x0007,0x0004,0x0002,0xDBDE,0xCCB3,0x0000,0xBCE1,0x0000,0x0001,0xBFE9,0x000C,0x0004,0x0001,0x0001,0xBFD3, 0x0004,0x0002,0xD7F8,0xBBB5,0x0002,0xBFB2,0xCCAE,0x0006,0x0003,0x0000,0xDBD0,0x0000,0xB7BB,0x0000,0x0001,0xBEF9, 0x0013,0x000B,0x0005,0x0001,0x0002,0xDBE0,0xDBE6,0x0003,0x0000,0xD6B7,0x0000,0xBBF8,0x0000,0x0003,0x0001,0xDBDF, 0x0002,0xB3A1,0xDBDB,0x000C,0x0004,0x0000,0x0001,0xDBDA,0x0004,0x0002,0xB5D8,0xDBDD,0x0002,0xDBDC,0xB9E7,0x0007, 0x0003,0x0000,0xDBD8,0x0002,0xDBD9,0xDBD7,0x0000,0x0000,0xD4DA,0x002C,0x0014,0x000A,0x0006,0x0003,0x0001,0xCAA5, 0x0000,0xEEAE,0x0000,0x0001,0xCDC1,0x0004,0x0000,0x0000,0xE0F7,0x0003,0x0000,0xCDC5,0x0000,0xCDBC,0x000A,0x0006, 0x0003,0x0001,0xD4B2,0x0000,0xD4B0,0x0001,0x0001,0xCEA7,0x0007,0x0003,0x0001,0xB9FA,0x0002,0xE0F5,0xE0F6,0x0004, 0x0002,0xC8A6,0xE0F0,0x0000,0xD4B2,0x0015,0x000C,0x0005,0x0000,0x0002,0xE0F4,0xC6D4,0x0003,0x0001,0xE0F3,0x0002, 0xCDBC,0xB9FA,0x0005,0x0001,0x0002,0xB9CC,0xE0F2,0x0001,0x0001,0xE0F0,0x000D,0x0006,0x0003,0x0000,0xCEA7,0x0001, 0xB4D1,0x0003,0x0000,0xC0A7,0x0002,0xB6EF,0xD4B0,0x0000,0x0003,0x0001,0xE0F1,0x0000,0xB4D1,0x0052,0x002C,0x0019, 0x000F,0x0007,0x0003,0x0000,0xB6DA,0x0002,0xCDC5,0xE0EF,0x0004,0x0002,0xD2F2,0xD8B6,0x0002,0xBBD8,0xE0EE,0x0006, 0x0003,0x0001,0xCBC4,0x0000,0xC7F4,0x0000,0x0001,0xBFDA,0x0008,0x0000,0x0004,0x0002,0xE0EC,0xC4F6,0x0001,0xD6F6, 0x0007,0x0003,0x0000,0xCBD5,0x0002,0xC4D2,0xC2DE,0x0000,0x0000,0xDFBD,0x0013,0x0009,0x0005,0x0001,0x0002,0xCFF9, 0xE0BF,0x0000,0x0000,0xDFF9,0x0004,0x0000,0x0000,0xBDC0,0x0003,0x0001,0xC8C2,0x0000,0xE0D3,0x000B,0x0005,0x0000, 0x0002,0xD1CF,0xE0B7,0x0003,0x0001,0xE0EB,0x0000,0xCFF2,0x0001,0x0003,0x0000,0xC1FC,0x0002,0xDFBF,0xD1CA,0x0020, 0x000D,0x0005,0x0000,0x0000,0x0001,0xCFF9,0x0004,0x0001,0x0001,0xC4F6,0x0001,0x0001,0xE0E0,0x000B,0x0004,0x0000, 0x0001,0xE0EA,0x0004,0x0002,0xB3A2,0xCCE7,0x0000,0xBABF,0x0001,0x0003,0x0001,0xCFC5,0x0002,0xE0E3,0xE0E9,0x0012, 0x0005,0x0001,0x0000,0x0000,0xDFCC,0x0007,0x0004,0x0002,0xE0E8,0xE0E7,0x0001,0xB5B1,0x0003,0x0000,0xB6D6,0x0000, 0xB8C1,0x000B,0x0007,0x0003,0x0000,0xC5E7,0x0002,0xDFE0,0xE0E5,0x0000,0x0001,0xE0C8,0x0008,0x0004,0x0002,0xCAC9, 0xE0E6,0x0002,0xD4EB,0xD8AC,0x0003,0x0000,0xC6F7,0x0002,0xDFDC,0xDFE6,0x016A,0x00AD,0x0054,0x0027,0x0014,0x0009, 0x0005,0x0002,0xE0E4,0x0001,0xE0DE,0x0000,0x0001,0xDFD5,0x0004,0x0000,0x0001,0xE0E0,0x0004,0x0002,0xE0DF,0xE0D9, 0x0000,0xE0DB,0x000A,0x0006,0x0003,0x0001,0xE0E2,0x0000,0xD0EA,0x0001,0x0001,0xD2AD,0x0005,0x0000,0x0002,0xE0DD, 0xE0E1,0x0000,0x0001,0xF5BE,0x0012,0x0007,0x0001,0x0003,0x0000,0xB6F1,0x0000,0xBAD9,0x0004,0x0001,0x0000,0xCEFB, 0x0004,0x0002,0xE0DA,0xDFBC,0x0001,0xCBBB,0x0010,0x0008,0x0004,0x0002,0xDFD8,0xD7EC,0x0002,0xE0B0,0xB3B0,0x0004, 0x0002,0xD6F6,0xDFB4,0x0002,0xD0A5,0xDFEB,0x0005,0x0000,0x0002,0xE0D8,0xE0DC,0x0003,0x0000,0xBBA9,0x0000,0xE0D7, 0x002D,0x0018,0x000B,0x0006,0x0003,0x0001,0xE0D3,0x0000,0xE0D4,0x0001,0x0002,0xE0BD,0xE0CF,0x0006,0x0003,0x0001, 0xDFE9,0x0000,0xC2EF,0x0003,0x0001,0xD0EA,0x0002,0xB3A2,0xDFF5,0x0009,0x0004,0x0000,0x0001,0xC5BB,0x0001,0x0002, 0xD8C5,0xB8C2,0x0005,0x0000,0x0002,0xE0B6,0xE0D1,0x0004,0x0002,0xBCCE,0xE0D0,0x0001,0xCCBE,0x0013,0x0008,0x0001, 0x0004,0x0002,0xE0D2,0xE0D6,0x0001,0xE0D5,0x0006,0x0003,0x0000,0xCBD4,0x0001,0xB4DF,0x0001,0x0002,0xE0BB,0xDFD9, 0x000B,0x0007,0x0003,0x0000,0xE0CC,0x0002,0xE0C8,0xE0C7,0x0001,0x0000,0xE0C5,0x0007,0x0003,0x0001,0xE0C0,0x0002, 0xE0BF,0xE0BA,0x0004,0x0002,0xDFEF,0xE0CB,0x0001,0xE0C2,0x0062,0x0032,0x0019,0x000D,0x0007,0x0004,0x0002,0xE0C6, 0xE0CD,0x0000,0xCBC3,0x0003,0x0000,0xCECB,0x0000,0xE0B5,0x0008,0x0004,0x0002,0xE0C3,0xCAC8,0x0002,0xC7B8,0xCED8, 0x0001,0x0001,0xE0B2,0x000D,0x0007,0x0003,0x0001,0xE0C1,0x0002,0xC9A4,0xE0AA,0x0003,0x0000,0xE0BE,0x0001,0xC2F0, 0x0005,0x0000,0x0002,0xE0CA,0xE0C9,0x0003,0x0000,0xE0BC,0x0002,0xD8C4,0xC7BA,0x0016,0x000A,0x0005,0x0000,0x0002, 0xD0E1,0xE0C4,0x0001,0x0002,0xD4EB,0xE0B7,0x0006,0x0003,0x0000,0xE0B6,0x0000,0xD3F7,0x0003,0x0000,0xE0AD,0x0000, 0xC5E7,0x000D,0x0007,0x0003,0x0000,0xDFF7,0x0002,0xD4FB,0xD3B4,0x0003,0x0000,0xE0AC,0x0001,0xB5A5,0x0008,0x0004, 0x0002,0xD1E4,0xC7C7,0x0002,0xB3D4,0xC9A5,0x0001,0x0002,0xD0FA,0xD1D2,0x002C,0x0014,0x0008,0x0004,0x0001,0x0001, 0xECA6,0x0001,0x0000,0xE0B0,0x0007,0x0004,0x0002,0xBAC8,0xCFB2,0x0001,0xBBBD,0x0000,0x0002,0xE0B9,0xB4AD,0x000C, 0x0006,0x0003,0x0001,0xE0B8,0x0001,0xD4DB,0x0003,0x0000,0xE0B3,0x0000,0xDFF6,0x0005,0x0001,0x0002,0xE0A9,0xBAB0, 0x0004,0x0002,0xBAED,0xE0AE,0x0000,0xC0AE,0x001B,0x000E,0x0007,0x0003,0x0001,0xC9C6,0x0002,0xE0AB,0xCEB9,0x0004, 0x0002,0xE0AF,0xBFA6,0x0001,0xE0B1,0x0006,0x0003,0x0001,0xCCE4,0x0000,0xE0B4,0x0003,0x0001,0xD0A5,0x0002,0xE0A5, 0xE0A4,0x0008,0x0004,0x0000,0x0000,0xE0A3,0x0001,0x0001,0xC4F6,0x0007,0x0004,0x0002,0xDFF9,0xD8C4,0x0001,0xC5BE, 0x0001,0x0002,0xDFF5,0xC0B2,0x00A9,0x005B,0x002D,0x0017,0x000E,0x0007,0x0004,0x0002,0xC9B6,0xC6A1,0x0000,0xCFCE, 0x0003,0x0000,0xB7C8,0x0002,0xC6F4,0xD1C6,0x0004,0x0000,0x0001,0xE0A8,0x0001,0x0002,0xE0A2,0xE0A2,0x000C,0x0004, 0x0000,0x0000,0xDFFB,0x0004,0x0002,0xE0A9,0xDFFD,0x0002,0xCECA,0xE2E8,0x0004,0x0001,0x0001,0xB0A1,0x0003,0x0000, 0xDFF8,0x0001,0xC9CC,0x0018,0x000E,0x0007,0x0004,0x0002,0xD7C4,0xD7C4,0x0000,0xBFD0,0x0003,0x0000,0xDFFA,0x0002, 0xDFFC,0xCDD9,0x0004,0x0000,0x0001,0xDFFE,0x0003,0x0001,0xC4EE,0x0000,0xE0A1,0x000C,0x0004,0x0001,0x0000,0xE0A6, 0x0004,0x0002,0xB3AA,0xE0A7,0x0002,0xCEA8,0xCADB,0x0006,0x0003,0x0001,0xBBA3,0x0001,0xDFF4,0x0001,0x0000,0xDFF3, 0x0023,0x0010,0x000B,0x0007,0x0003,0x0001,0xBBBD,0x0002,0xDFF0,0xDFEF,0x0000,0x0001,0xDFEB,0x0000,0x0001,0x0000, 0xDFE9,0x000B,0x0004,0x0000,0x0001,0xDFED,0x0004,0x0002,0xDFF2,0xCCC6,0x0000,0xDFF1,0x0001,0x0003,0x0000,0xB0A6, 0x0002,0xB4BD,0xCBF4,0x0014,0x000B,0x0005,0x0000,0x0002,0xBAAC,0xDFC2,0x0003,0x0000,0xD1E4,0x0000,0xDBC1,0x0000, 0x0004,0x0002,0xDFEC,0xBADF,0x0002,0xF7FD,0xB2B8,0x0009,0x0005,0x0001,0x0002,0xDFEE,0xD5DC,0x0001,0x0001,0xCFF8, 0x0006,0x0003,0x0000,0xBFDE,0x0001,0xC4C4,0x0004,0x0002,0xC1A8,0xC9DA,0x0002,0xDFEA,0xC5B6,0x006B,0x0035,0x0018, 0x000B,0x0004,0x0000,0x0000,0xB8E7,0x0003,0x0000,0xD4B1,0x0002,0xD3B4,0xDFE8,0x0007,0x0004,0x0002,0xDFE6,0xDFE2, 0x0001,0xDFE1,0x0003,0x0000,0xDFE0,0x0000,0xBBA9,0x0010,0x0008,0x0004,0x0002,0xDFDC,0xDFD9,0x0002,0xDFD8,0xDFD5, 0x0004,0x0002,0xD1C6,0xDFD1,0x0002,0xDFE7,0xB0A5,0x0005,0x0000,0x0002,0xCFEC,0xDFDF,0x0004,0x0002,0xD4D5,0xB9FE, 0x0002,0xCDDB,0xB6DF,0x001A,0x000D,0x0006,0x0003,0x0001,0xBAE5,0x0001,0xDFD3,0x0004,0x0002,0xC6B7,0xB0A7,0x0000, 0xDFDE,0x0007,0x0004,0x0002,0xD1CA,0xDFC3,0x0000,0xDFDD,0x0003,0x0001,0xCFCC,0x0001,0xF3C2,0x000C,0x0006,0x0003, 0x0001,0xDFD4,0x0000,0xBFC8,0x0003,0x0000,0xD4DB,0x0000,0xBFA9,0x0008,0x0004,0x0002,0xDFD2,0xD2A7,0x0002,0xE5EB, 0xDFE4,0x0004,0x0002,0xDFE3,0xD7C9,0x0002,0xDFD6,0xDFD7,0x0031,0x0018,0x000B,0x0007,0x0003,0x0001,0xDFE5,0x0002, 0xDFDB,0xDACC,0x0000,0x0001,0xBCA9,0x0007,0x0003,0x0000,0xDFD0,0x0002,0xDFCC,0xDFCB,0x0003,0x0000,0xC1FC,0x0001, 0xBFA7,0x000E,0x0007,0x0004,0x0002,0xB9BE,0xDFC7,0x0001,0xD6E4,0x0003,0x0001,0xB8C0,0x0002,0xD3BD,0xBECC,0x0007, 0x0004,0x0002,0xBFC8,0xBACD,0x0000,0xD5A6,0x0001,0x0001,0xC5D8,0x0018,0x000A,0x0006,0x0003,0x0001,0xDFCD,0x0001, 0xDFC6,0x0000,0x0001,0xBED7,0x0007,0x0004,0x0002,0xC3FC,0xBAF4,0x0000,0xC9EB,0x0003,0x0001,0xC5DE,0x0002,0xDFC8, 0xDFCE,0x000D,0x0008,0x0004,0x0002,0xBAC7,0xBAF0,0x0002,0xCEB6,0xDFDA,0x0000,0x0002,0xDFC9,0xF6A4,0x0001,0x0003, 0x0001,0xD6DC,0x0001,0xDFCF,0x02DF,0x0185,0x00CF,0x0063,0x002C,0x0014,0x0008,0x0004,0x0001,0x0000,0xDFCA,0x0000, 0x0000,0xC4D8,0x0005,0x0001,0x0002,0xCED8,0xC7BA,0x0003,0x0001,0xDFC3,0x0002,0xD4B1,0xDFC2,0x000E,0x0008,0x0004, 0x0002,0xDFBF,0xC5BB,0x0002,0xDFBE,0xDFBD,0x0003,0x0000,0xDFBC,0x0000,0xC4C5,0x0004,0x0001,0x0001,0xDFBB,0x0003, 0x0000,0xB8E6,0x0000,0xB3CA,0x0019,0x000C,0x0006,0x0003,0x0000,0xB4F4,0x0001,0xDFC0,0x0003,0x0000,0xC2C0,0x0000, 0xD1BD,0x0007,0x0003,0x0000,0xCEE1,0x0002,0xBAF0,0xCEC7,0x0003,0x0001,0xB4B5,0x0000,0xCEFC,0x000F,0x0008,0x0004, 0x0002,0xC4C5,0xB3B3,0x0002,0xCEE2,0xCEE2,0x0004,0x0002,0xDFC5,0xD6A8,0x0001,0xC6F4,0x0008,0x0004,0x0002,0xCBB1, 0xBFD4,0x0002,0xCCFD,0xBAAC,0x0003,0x0001,0xB7D4,0x0002,0xB6D6,0xB0C9,0x0035,0x0018,0x000D,0x0006,0x0003,0x0000, 0xB7F1,0x0001,0xDFC4,0x0003,0x0001,0xDFC1,0x0002,0xB7CD,0xD2F7,0x0007,0x0004,0x0002,0xCDCC,0xC1DF,0x0001,0xBEFD, 0x0001,0x0001,0xC2F0,0x000F,0x0007,0x0004,0x0002,0xDFB9,0xC2C0,0x0001,0xCFC5,0x0004,0x0002,0xDFB8,0xCFF2,0x0002, 0xCDC2,0xC0F4,0x0007,0x0004,0x0002,0xBAF3,0xC3FB,0x0000,0xCDAC,0x0004,0x0002,0xB5F5,0xBCAA,0x0000,0xBACF,0x0019, 0x000B,0x0007,0x0003,0x0000,0xDFBA,0x0002,0xB8F7,0xB3D4,0x0000,0x0001,0xD3F5,0x0007,0x0003,0x0001,0xDFB4,0x0002, 0xB5F0,0xDFB7,0x0003,0x0001,0xCCBE,0x0002,0xCBBE,0xBAC5,0x000F,0x0007,0x0004,0x0002,0xD2B6,0xD8CF,0x0001,0xD3D2, 0x0004,0x0002,0xCAB7,0xDFB3,0x0002,0xCCA8,0xBFC9,0x0008,0x0004,0x0002,0xB6A3,0xB0C8,0x0002,0xD5D9,0xBDD0,0x0004, 0x0002,0xD6BB,0xDFB5,0x0000,0xDFB6,0x0057,0x0032,0x001A,0x000F,0x0008,0x0004,0x0002,0xC1ED,0xBEE4,0x0002,0xB9C5, 0xBFDA,0x0003,0x0000,0xB4D4,0x0002,0xB5FE,0xDBC5,0x0004,0x0001,0x0001,0xC5D1,0x0003,0x0001,0xD0F0,0x0002,0xB1E4, 0xCADC,0x000A,0x0006,0x0003,0x0000,0xC8A1,0x0000,0xCAE5,0x0000,0x0001,0xB7A2,0x0007,0x0003,0x0001,0xB7B4,0x0002, 0xCBAB,0xD3D1,0x0004,0x0002,0xBCB0,0xB2E6,0x0000,0xD3D6,0x0010,0x000B,0x0004,0x0001,0x0001,0xB2CE,0x0004,0x0002, 0xB2CE,0xC8FE,0x0001,0xCFD8,0x0000,0x0001,0x0001,0xC8A5,0x000A,0x0006,0x0003,0x0000,0xDBCC,0x0000,0xD8C9,0x0000, 0x0000,0xC0F7,0x0005,0x0000,0x0002,0xD8CB,0xD1E1,0x0003,0x0001,0xBEC7,0x0000,0xB3F8,0x002B,0x0019,0x000E,0x0008, 0x0004,0x0002,0xCFC3,0xD8CA,0x0002,0xC0FA,0xD8C9,0x0003,0x0000,0xCFE1,0x0001,0xD4AD,0x0004,0x0000,0x0001,0xD8C8, 0x0004,0x0002,0xBAF1,0xD8C7,0x0000,0xC0E5,0x0006,0x0000,0x0000,0x0002,0xC5D3,0xB2DE,0x0008,0x0004,0x0002,0xEDC6, 0xD8C7,0x0002,0xD1E1,0xD1B9,0x0000,0x0001,0xC0F7,0x0019,0x000D,0x0007,0x0004,0x0002,0xC0FA,0xCCFC,0x0000,0xB6F2, 0x0003,0x0000,0xB3A7,0x0001,0xC7E4,0x0004,0x0001,0x0001,0xC8B4,0x0004,0x0002,0xDAE1,0xD0F4,0x0002,0xD0B6,0xBEED, 0x000E,0x0007,0x0003,0x0001,0xC2D1,0x0002,0xC8B4,0xBCB4,0x0003,0x0001,0xCEA3,0x0002,0xD3A1,0xC3AE,0x0007,0x0003, 0x0000,0xD8B4,0x0002,0xD1F6,0xCEC0,0x0003,0x0001,0xDAE0,0x0001,0xCED4,0x00B0,0x005E,0x0033,0x0018,0x000D,0x0005, 0x0002,0xD8D4,0x0001,0xC2B1,0x0004,0x0002,0xD8D5,0xC2AC,0x0002,0xBFA8,0xD5BC,0x0007,0x0004,0x0002,0xDFB2,0xB1E5, 0x0001,0xB2B7,0x0000,0x0001,0xB2A9,0x000F,0x0008,0x0004,0x0002,0xC4CF,0xC2F4,0x0002,0xB5A5,0xD0AD,0x0004,0x0002, 0xD7BF,0xD7E4,0x0000,0xB1B0,0x0005,0x0000,0x0002,0xD0AD,0xBBAA,0x0003,0x0001,0xB0EB,0x0002,0xBBDC,0xCEE7,0x001B, 0x000D,0x0006,0x0003,0x0000,0xC9FD,0x0000,0xD8A6,0x0003,0x0000,0xC7A7,0x0002,0xCAAE,0xC7F8,0x0007,0x0004,0x0002, 0xC4E4,0xD8D2,0x0000,0xD9C8,0x0004,0x0002,0xD2BD,0xC7F8,0x0000,0xC6A5,0x0005,0x0001,0x0001,0x0000,0xD8D1,0x0007, 0x0004,0x0002,0xBBE3,0xD8D1,0x0000,0xD8D0,0x0000,0x0001,0xB7CB,0x002F,0x0017,0x000B,0x0004,0x0000,0x0001,0xD8D0, 0x0003,0x0000,0xCFBB,0x0002,0xBFEF,0xBDB3,0x0006,0x0003,0x0000,0xBFBB,0x0000,0xD4D1,0x0003,0x0001,0xD8CE,0x0000, 0xB3D7,0x000B,0x0007,0x0004,0x0002,0xB1B1,0xBBAF,0x0000,0xD8B0,0x0001,0x0001,0xD9EB,0x0006,0x0003,0x0000,0xDECB, 0x0000,0xD9E9,0x0004,0x0002,0xCCD5,0xDEE4,0x0001,0xD0D9,0x0017,0x000A,0x0006,0x0003,0x0001,0xB4D2,0x0000,0xB0FC, 0x0001,0x0001,0xD4C8,0x0005,0x0000,0x0002,0xCEF0,0xB9B4,0x0004,0x0002,0xD4C8,0xC9D7,0x0002,0xD9E8,0xC8B0,0x0000, 0x0004,0x0001,0x0000,0xC0F8,0x0003,0x0000,0xD1AB,0x0002,0xDBBD,0xDBC4,0x0052,0x002D,0x0019,0x000B,0x0006,0x0003, 0x0001,0xBDCB,0x0001,0xC7DA,0x0000,0x0002,0xBCA8,0xCAC6,0x0007,0x0004,0x0002,0xC4BC,0xC0CD,0x0000,0xCAA4,0x0003, 0x0000,0xD1AB,0x0002,0xCEF1,0xBFB1,0x000D,0x0007,0x0004,0x0002,0xDBC3,0xDBC3,0x0000,0xB6AF,0x0003,0x0001,0xC0D5, 0x0001,0xDBC2,0x0001,0x0003,0x0000,0xD1AB,0x0000,0xC3E3,0x0010,0x000A,0x0004,0x0000,0x0000,0xD3C2,0x0003,0x0000, 0xB2AA,0x0000,0xBEA2,0x0000,0x0000,0x0002,0xCAC6,0xDBC0,0x0008,0x0001,0x0004,0x0002,0xC0CD,0xBEA2,0x0000,0xC0F8, 0x0005,0x0001,0x0002,0xDBBF,0xDBBE,0x0004,0x0002,0xBDD9,0xC5AC,0x0002,0xD6FA,0xB6AF,0x002C,0x0017,0x000C,0x0004, 0x0000,0x0001,0xC1A6,0x0004,0x0002,0xC1D3,0xDBBD,0x0002,0xCEF1,0xBCD3,0x0007,0x0004,0x0002,0xB9A6,0xB0EC,0x0000, 0xC8B0,0x0000,0x0000,0xC1A6,0x0008,0x0001,0x0003,0x0000,0xD8E6,0x0002,0xBCC1,0xD8E5,0x0005,0x0001,0x0002,0xBDA3, 0xD8DB,0x0004,0x0002,0xBDCB,0xB9F4,0x0002,0xC1F5,0xC5FC,0x0014,0x000D,0x0006,0x0003,0x0000,0xBEE7,0x0001,0xD4FD, 0x0004,0x0002,0xBBAE,0xD8E3,0x0000,0xD8E4,0x0000,0x0003,0x0000,0xBDCB,0x0000,0xD8E2,0x000B,0x0007,0x0003,0x0000, 0xB2F9,0x0002,0xB4B4,0xD8DC,0x0000,0x0001,0xB8EE,0x0007,0x0004,0x0002,0xB8B1,0xB9D0,0x0001,0xD6C6,0x0003,0x0001, 0xBCF4,0x0000,0xCAA3,0x017A,0x00C3,0x0062,0x002D,0x0015,0x0009,0x0005,0x0002,0xBEE7,0x0001,0xB0FE,0x0001,0x0001, 0xD8DF,0x0005,0x0001,0x0002,0xD8DE,0xB0FE,0x0004,0x0002,0xD8E0,0xB8D5,0x0000,0xCAC2,0x000A,0x0004,0x0001,0x0000, 0xC6CA,0x0003,0x0000,0xCCDE,0x0001,0xBDA3,0x0007,0x0003,0x0000,0xB9D0,0x0002,0xC9B2,0xC7B0,0x0004,0x0002,0xD8DD, 0xBFCB,0x0000,0xCFF7,0x001A,0x000C,0x0004,0x0000,0x0001,0xD4F2,0x0004,0x0002,0xD8D9,0xCCEA,0x0002,0xBCC1,0xB6E7, 0x0007,0x0004,0x0002,0xD8DC,0xD8DB,0x0001,0xB9F4,0x0003,0x0001,0xBFCC,0x0002,0xB4CC,0xC9B2,0x000D,0x0007,0x0004, 0x0002,0xC8AF,0xCBA2,0x0000,0xD6C6,0x0003,0x0001,0xD8DA,0x0001,0xB4B4,0x0007,0x0003,0x0000,0xB5BD,0x0002,0xB9CE, 0xD8D9,0x0003,0x0001,0xB1F0,0x0002,0xC9BE,0xC0FB,0x002C,0x0017,0x000A,0x0006,0x0003,0x0000,0xC5D9,0x0001,0xB1F0, 0x0000,0x0000,0xC5D0,0x0006,0x0003,0x0000,0xC9BE,0x0001,0xB3F5,0x0003,0x0001,0xB4B4,0x0002,0xB8D5,0xD4F2,0x000C, 0x0007,0x0004,0x0002,0xC1F5,0xC1D0,0x0000,0xEBBE,0x0001,0x0002,0xBBAE,0xD0CC,0x0005,0x0001,0x0002,0xD8D8,0xDBBB, 0x0001,0x0000,0xBFAF,0x001D,0x000E,0x0007,0x0004,0x0002,0xD8D7,0xC7D0,0x0000,0xB7D6,0x0003,0x0001,0xC8D0,0x0002, 0xD8D6,0xB5F3,0x0007,0x0004,0x0002,0xB5B6,0xD4E4,0x0001,0xBAAF,0x0004,0x0002,0xDBCA,0xBBF7,0x0002,0xB3F6,0xB0BC, 0x000D,0x0007,0x0003,0x0000,0xCDB9,0x0002,0xD0D7,0xDBC9,0x0003,0x0001,0xB5CA,0x0001,0xBFAD,0x0007,0x0004,0x0002, 0xBBCB,0xBFAD,0x0001,0xC6BE,0x0000,0x0001,0xD9EC,0x0054,0x0024,0x0012,0x0007,0x0001,0x0003,0x0000,0xB7EF,0x0001, 0xB7B2,0x0006,0x0003,0x0000,0xBCB8,0x0001,0xC4FD,0x0000,0x0002,0xC1DD,0xC1DD,0x0005,0x0001,0x0001,0x0001,0xB4D5, 0x0006,0x0003,0x0001,0xBCF5,0x0001,0xB6B3,0x0004,0x0002,0xC1E8,0xB5F2,0x0001,0xC1B9,0x0016,0x000B,0x0007,0x0004, 0x0002,0xBEBB,0xDAA1,0x0000,0xD7BC,0x0000,0x0000,0xC6E0,0x0006,0x0003,0x0000,0xBEBB,0x0001,0xD9FD,0x0000,0x0002, 0xD9FE,0xB6B3,0x000E,0x0007,0x0003,0x0001,0xC0E4,0x0002,0xD2B1,0xBFF6,0x0003,0x0001,0xBEF6,0x0002,0xB3E5,0xD9FC, 0x0005,0x0000,0x0002,0xB1F9,0xB7EB,0x0004,0x0002,0xB6AC,0xD9FB,0x0000,0xC3DD,0x002E,0x0015,0x000A,0x0004,0x0001, 0x0001,0xDAA4,0x0003,0x0000,0xD4A9,0x0000,0xDAA3,0x0004,0x0000,0x0000,0xB9DA,0x0004,0x0002,0xC5A9,0xBEFC,0x0001, 0xD0B4,0x000E,0x0007,0x0003,0x0001,0xC8DF,0x0002,0xDAA2,0xC3E1,0x0003,0x0001,0xB9B9,0x0002,0xC3B0,0xEBD0,0x0004, 0x0001,0x0001,0xD4D9,0x0003,0x0000,0xB2E1,0x0002,0xB2E1,0xC8BD,0x0018,0x000B,0x0006,0x0003,0x0000,0xB8D4,0x0001, 0xC4DA,0x0001,0x0002,0xD8E7,0xD9E6,0x0006,0x0003,0x0000,0xBCBD,0x0001,0xCADE,0x0004,0x0002,0xBCE6,0xD1F8,0x0001, 0xD7C8,0x000F,0x0008,0x0004,0x0002,0xB5E4,0xBEDF,0x0002,0xC6E4,0xB1F8,0x0004,0x0002,0xD0CB,0xB9D8,0x0001,0xB9B2, 0x0007,0x0003,0x0000,0xC0BC,0x0002,0xD9E2,0xC1F9,0x0004,0x0002,0xB9AB,0xB0CB,0x0001,0xC1BD,0x009F,0x0055,0x002B, 0x0012,0x000B,0x0007,0x0004,0x0002,0xC8AB,0xC4DA,0x0001,0xC8EB,0x0001,0x0000,0xBEA4,0x0001,0x0003,0x0000,0xB6B5, 0x0000,0xB5B3,0x000E,0x0007,0x0003,0x0001,0xD9F0,0x0002,0xD9F0,0xD9EE,0x0003,0x0000,0xCDC3,0x0002,0xB6F9,0xB6D2, 0x0004,0x0001,0x0001,0xC3E2,0x0004,0x0002,0xB6D2,0xBFCB,0x0001,0xB9E2,0x001B,0x000F,0x0008,0x0004,0x0002,0xCFC8, 0xD0D7,0x0002,0xD5D7,0xB3E4,0x0004,0x0002,0xD0D6,0xD4AA,0x0001,0xD4CA,0x0005,0x0000,0x0002,0xD8A3,0xB6F9,0x0004, 0x0002,0xD9B2,0xD9CE,0x0000,0xD9D0,0x000A,0x0004,0x0000,0x0001,0xD9B3,0x0003,0x0001,0xB2F3,0x0000,0xB4A2,0x0001, 0x0001,0x0000,0xD3C5,0x0020,0x000A,0x0005,0x0001,0x0001,0x0001,0xC0DC,0x0000,0x0000,0x0001,0xB3A5,0x000C,0x0006, 0x0003,0x0000,0xBEA1,0x0001,0xD9AD,0x0003,0x0000,0xD9B1,0x0000,0xC8E5,0x0004,0x0000,0x0000,0xD9CF,0x0003,0x0001, 0xD9D9,0x0001,0xBCF3,0x0017,0x000D,0x0007,0x0004,0x0002,0xBFEB,0xD9D8,0x0000,0xD9D3,0x0003,0x0000,0xD2DA,0x0000, 0xD9AF,0x0004,0x0000,0x0000,0xD2C7,0x0003,0x0001,0xC6A7,0x0001,0xBCDB,0x000A,0x0004,0x0001,0x0001,0xBDA9,0x0003, 0x0001,0xCBDB,0x0001,0xB9CD,0x0005,0x0001,0x0002,0xD9D7,0xD9D4,0x0000,0x0000,0xD9D5,0x0053,0x0023,0x0011,0x0009, 0x0000,0x0004,0x0002,0xD9C7,0xC9AE,0x0002,0xD9D6,0xBDC4,0x0004,0x0001,0x0001,0xBEDF,0x0001,0x0000,0xC1C5,0x0009, 0x0005,0x0001,0x0002,0xD9D2,0xC6CD,0x0001,0x0001,0xC7C8,0x0004,0x0000,0x0001,0xCFF3,0x0001,0x0002,0xCFC9,0xD9DD, 0x0015,0x000A,0x0006,0x0003,0x0000,0xC2FD,0x0001,0xBDF6,0x0001,0x0000,0xD9CD,0x0005,0x0001,0x0002,0xC7E3,0xD5C2, 0x0003,0x0001,0xC9B5,0x0000,0xD9D1,0x000E,0x0007,0x0003,0x0001,0xC9CB,0x0002,0xEBED,0xD5AE,0x0004,0x0002,0xD8F1, 0xB4AB,0x0000,0xB0C1,0x0007,0x0004,0x0002,0xC5F3,0xD9CC,0x0001,0xD3B6,0x0003,0x0000,0xB4DF,0x0001,0xD9D0,0x002A, 0x0015,0x000D,0x0007,0x0004,0x0002,0xB4A2,0xD9CF,0x0001,0xD9CE,0x0003,0x0001,0xB4F6,0x0000,0xBCD2,0x0001,0x0003, 0x0001,0xC8DD,0x0002,0xD0A7,0xB1B8,0x000D,0x0006,0x0003,0x0000,0xC9A1,0x0000,0xD8F7,0x0003,0x0000,0xE3BB,0x0002, 0xE1E6,0xBDDC,0x0004,0x0001,0x0001,0xB0F8,0x0000,0x0000,0xC2EE,0x0018,0x000A,0x0006,0x0003,0x0000,0xC0FC,0x0001, 0xB8B5,0x0001,0x0000,0xCFB5,0x0008,0x0004,0x0002,0xBFFE,0xB3A5,0x0002,0xD9C7,0xCEB1,0x0003,0x0001,0xD9CD,0x0000, 0xD4DB,0x000B,0x0007,0x0003,0x0001,0xCDB5,0x0002,0xC5BC,0xD5EC,0x0000,0x0000,0xB2E0,0x0004,0x0000,0x0000,0xC6F5, 0x0003,0x0000,0xD9CC,0x0000,0xB1C6,0x0000,0x0000,0x02CC,0x0159,0x009C,0x003F,0x001D,0x000C,0x0005,0x0001,0x0000, 0x0000,0xBDA1,0x0001,0x0003,0x0001,0xCDA3,0x0001,0xD7F6,0x0005,0x0001,0x0000,0x0000,0xD9C9,0x0005,0x0001,0x0002, 0xC6AB,0xD9CB,0x0003,0x0001,0xD9BC,0x0002,0xC6C1,0xF5E1,0x0015,0x000B,0x0007,0x0004,0x0002,0xCEB0,0xD9CA,0x0000, 0xBCD9,0x0001,0x0000,0xD9C8,0x0004,0x0001,0x0001,0xC7E3,0x0003,0x0001,0xD6B5,0x0001,0xD5AE,0x0001,0x0004,0x0001, 0x0001,0xD9C0,0x0004,0x0002,0xD9C1,0xD9BE,0x0002,0xC2D7,0xC4DF,0x0035,0x001B,0x000E,0x0007,0x0004,0x0002,0xD9BB, 0xD9C6,0x0001,0xBEEB,0x0003,0x0000,0xD9C5,0x0002,0xB7C2,0xE6BC,0x0007,0x0003,0x0000,0xB3AB,0x0002,0xBDE8,0xBEA2, 0x0003,0x0001,0xD9C3,0x0001,0xD2D0,0x000D,0x0007,0x0004,0x0002,0xBAF2,0xCCC8,0x0001,0xD0D2,0x0003,0x0001,0xBEF3, 0x0001,0xB5B9,0x0006,0x0003,0x0000,0xC3C7,0x0000,0xD9BF,0x0004,0x0002,0xB1B6,0xD9C4,0x0000,0xB8F6,0x0011,0x0007, 0x0000,0x0003,0x0000,0xB2D6,0x0001,0xC1A9,0x0006,0x0003,0x0001,0xD8F6,0x0001,0xD9C2,0x0001,0x0001,0xB0B3,0x000A, 0x0006,0x0003,0x0001,0xD9BA,0x0001,0xD9C3,0x0001,0x0000,0xD9BD,0x0007,0x0003,0x0000,0xBEE3,0x0002,0xB8A9,0xD0DE, 0x0003,0x0000,0xBCF3,0x0001,0xD9B3,0x005D,0x002F,0x001B,0x000B,0x0007,0x0004,0x0002,0xC1A9,0xD9B2,0x0001,0xD9B1, 0x0001,0x0000,0xD9B6,0x0008,0x0004,0x0002,0xD0C5,0xCFC0,0x0002,0xD9B9,0xD3E1,0x0004,0x0002,0xB1A3,0xD9B7,0x0002, 0xB8A9,0xD9B5,0x0008,0x0000,0x0004,0x0002,0xCFA1,0xB7FD,0x0000,0xCBD7,0x0008,0x0004,0x0002,0xD9B8,0xC0FE,0x0002, 0xC7CE,0xD9DE,0x0001,0x0001,0xBFA1,0x0016,0x000C,0x0004,0x0000,0x0000,0xE5C3,0x0004,0x0002,0xD9B4,0xB6ED,0x0002, 0xB4D9,0xCFB5,0x0006,0x0003,0x0000,0xD9B6,0x0000,0xB1E3,0x0001,0x0000,0xCDD1,0x000D,0x0007,0x0003,0x0000,0xCDA6, 0x0002,0xBED6,0xC2C2,0x0003,0x0000,0xC7D6,0x0000,0xD7F8,0x0005,0x0001,0x0002,0xBAEE,0xCEEA,0x0003,0x0001,0xD9AF, 0x0001,0xD9AD,0x002F,0x0018,0x000E,0x0008,0x0004,0x0002,0xBFEB,0xC7C8,0x0002,0xB2E0,0xD5EC,0x0003,0x0000,0xBDC4, 0x0000,0xC2C2,0x0004,0x0000,0x0001,0xCFC0,0x0003,0x0000,0xD2C0,0x0000,0xB9A9,0x000B,0x0007,0x0003,0x0001,0xB2EF, 0x0002,0xB6B1,0xC2D8,0x0000,0x0001,0xD9B0,0x0006,0x0003,0x0000,0xD9A7,0x0000,0xD9AA,0x0003,0x0000,0xCACC,0x0000, 0xC0FD,0x001C,0x000E,0x0007,0x0004,0x0002,0xD9A8,0xB3DE,0x0001,0xC0B4,0x0004,0x0002,0xEBDC,0xD6B6,0x0000,0xD9A9, 0x0007,0x0003,0x0001,0xD0CD,0x0002,0xCAB9,0xD9AB,0x0004,0x0002,0xB4CE,0xD9AE,0x0000,0xD9AC,0x000B,0x0004,0x0001, 0x0001,0xD9A5,0x0004,0x0002,0xB2A2,0xD9A6,0x0000,0xBCD1,0x0006,0x0003,0x0001,0xB0DB,0x0000,0xD1F0,0x0000,0x0001, 0xC0D0,0x00B8,0x005E,0x0035,0x0019,0x000C,0x0005,0x0002,0xC5E5,0x0001,0xD8FB,0x0003,0x0001,0xD9DD,0x0002,0xD8F4, 0xD3B6,0x0005,0x0001,0x0002,0xC4E3,0xD9A1,0x0004,0x0002,0xD8FA,0xD8FE,0x0002,0xD7F7,0xB7F0,0x000F,0x0008,0x0004, 0x0002,0xD8FD,0xD3E0,0x0002,0xD9DC,0xD9A2,0x0003,0x0001,0xBACE,0x0002,0xD5BC,0xCCE5,0x0008,0x0004,0x0002,0xD1F6, 0xD3D3,0x0002,0xD7F4,0xD7A1,0x0000,0x0002,0xB5CD,0xCEBB,0x0012,0x000B,0x0005,0x0001,0x0002,0xB2BC,0xD8F9,0x0003, 0x0000,0xB5AB,0x0001,0xB5E8,0x0001,0x0003,0x0001,0xD9A4,0x0000,0xCBC6,0x000C,0x0006,0x0003,0x0000,0xCBC5,0x0000, 0xC9EC,0x0003,0x0000,0xC1E6,0x0000,0xB0E9,0x0007,0x0003,0x0000,0xD9A3,0x0002,0xB9C0,0xB2AE,0x0001,0x0001,0xD8F9, 0x0032,0x001A,0x000D,0x0006,0x0003,0x0000,0xCEB1,0x0001,0xD8F7,0x0004,0x0002,0xC2D7,0xD8F6,0x0000,0xC9CB,0x0007, 0x0003,0x0000,0xD8F3,0x0002,0xB4AB,0xCEB0,0x0003,0x0000,0xC9A1,0x0001,0xD8F1,0x000C,0x0008,0x0004,0x0002,0xBBE1, 0xBBEF,0x0002,0xD3C5,0xD6DA,0x0000,0x0001,0xB7F2,0x0007,0x0003,0x0001,0xD0DD,0x0002,0xB7A5,0xB7FC,0x0000,0x0002, 0xBCBF,0xCEE9,0x0012,0x0006,0x0000,0x0000,0x0002,0xD2C1,0xD8F8,0x0006,0x0003,0x0001,0xC6F3,0x0001,0xB7C2,0x0003, 0x0001,0xB7DD,0x0001,0xC8CE,0x000B,0x0004,0x0001,0x0001,0xBCDB,0x0004,0x0002,0xBCFE,0xD8F5,0x0001,0xD8F2,0x0006, 0x0003,0x0000,0xD6D9,0x0000,0xD1F6,0x0001,0x0002,0xC3C7,0xD8EF,0x0064,0x0032,0x0018,0x000D,0x0006,0x0003,0x0000, 0xD2C7,0x0000,0xD8ED,0x0003,0x0001,0xD2D4,0x0002,0xC1EE,0xB4FA,0x0006,0x0003,0x0001,0xD8EE,0x0001,0xC7AA,0x0000, 0x0002,0xD8F0,0xD9DA,0x000F,0x0007,0x0003,0x0001,0xCFC9,0x0002,0xB8B6,0xD5CC,0x0004,0x0002,0xCBFB,0xCACB,0x0002, 0xD7D0,0xB2D6,0x0004,0x0000,0x0001,0xC2D8,0x0004,0x0002,0xB4D3,0xC8D4,0x0001,0xBDE9,0x001B,0x000F,0x0007,0x0004, 0x0002,0xBDF1,0xD8EB,0x0001,0xB3F0,0x0004,0x0002,0xC6CD,0xBDF6,0x0002,0xD8C6,0xD8EA,0x0008,0x0004,0x0002,0xD8EC, 0xC8CA,0x0002,0xCAB2,0xD2DA,0x0001,0x0001,0xD8E9,0x000B,0x0004,0x0000,0x0000,0xC8CB,0x0004,0x0002,0xB5AB,0xD9F4, 0x0001,0xD9F1,0x0004,0x0000,0x0000,0xC7D7,0x0004,0x0002,0xC1C1,0xCDA4,0x0002,0xBEA9,0xCFED,0x0039,0x001C,0x000E, 0x0007,0x0003,0x0001,0xC4B6,0x0002,0xBAE0,0xB2FA,0x0004,0x0002,0xD2E0,0xBAA5,0x0000,0xBDBB,0x0008,0x0004,0x0002, 0xBFBA,0xCDF6,0x0002,0xD9EF,0xD8BD,0x0003,0x0000,0xD1C7,0x0001,0xD0A9,0x000E,0x0007,0x0004,0x0002,0xD1C7,0xD8A8, 0x0000,0xD8A8,0x0003,0x0001,0xBEAE,0x0002,0xCEE5,0xD8C1,0x0007,0x0004,0x0002,0xBBA5,0xD4C6,0x0001,0xBFF7,0x0004, 0x0002,0xD3DA,0xD8A1,0x0002,0xB6FE,0xCAC2,0x0012,0x000A,0x0006,0x0003,0x0001,0xD5F9,0x0000,0xD3E8,0x0000,0x0000, 0xC1CB,0x0004,0x0000,0x0000,0xC2D2,0x0000,0x0000,0xB8C9,0x0005,0x0001,0x0001,0x0001,0xC8E9,0x0000,0x0003,0x0001, 0xC2D2,0x0000,0xC2F2,0x0000,0x0000,0x0061,0x002F,0x0015,0x0008,0x0004,0x0001,0x0000,0xD8C0,0x0000,0x0001,0xCAE9, 0x0005,0x0001,0x0002,0xCFE7,0xCFB0,0x0004,0x0002,0xD2B2,0xC6F2,0x0002,0xBEC5,0xD8BF,0x000B,0x0005,0x0001,0x0002, 0xD2D2,0xB3CB,0x0003,0x0001,0xB9D4,0x0001,0xC7C7,0x0007,0x0004,0x0002,0xC5D2,0xC6B9,0x0001,0xC0D6,0x0004,0x0002, 0xB7A6,0xBAF5,0x0002,0xD5A7,0xCEDA,0x0019,0x000D,0x0007,0x0003,0x0000,0xD6AE,0x0002,0xD2E5,0xC3B4,0x0003,0x0000, 0xD8B1,0x0000,0xBEC3,0x0005,0x0000,0x0002,0xC4CB,0xD8D7,0x0004,0x0002,0xD8AF,0xBED9,0x0000,0xC0F6,0x000E,0x0008, 0x0004,0x0002,0xD6F7,0xCEAA,0x0002,0xB5A4,0xCDE8,0x0003,0x0001,0xD8BC,0x0001,0xC1D9,0x0006,0x0003,0x0001,0xB4AE, 0x0001,0xB7E1,0x0001,0x0002,0xD6D0,0xE3DC,0x0038,0x001B,0x000F,0x0007,0x0004,0x0002,0xD1BE,0xB8F6,0x0001,0xD8AD, 0x0004,0x0002,0xC9A5,0xB2A2,0x0002,0xD1CF,0xC1BD,0x0004,0x0000,0x0001,0xB6AA,0x0004,0x0002,0xB6AA,0xD8A9,0x0002, 0xCBBF,0xB6AB,0x000F,0x0008,0x0004,0x0002,0xB4D4,0xD2B5,0x0002,0xB1FB,0xC7F0,0x0003,0x0001,0xCAC0,0x0002,0xD8A7, 0xC7D2,0x0007,0x0003,0x0000,0xD7A8,0x0002,0xB3F3,0xD8A4,0x0003,0x0001,0xD3EB,0x0002,0xB2BB,0xD8A2,0x0000,0x000C, 0x0008,0x0004,0x0002,0xCFC2,0xC9CF,0x0002,0xC8FD,0xD5C9,0x0000,0x0000,0xCDF2,0x0000,0x0003,0x0000,0xC6DF,0x0002, 0xB6A1,0xD2BB,0x0427,0x014D,0x0001,0x0001,0x0001,0x001F,0x0000,0x0001,0x0016,0x0001,0x0005,0x0001,0x0001,0x0001, 0xA2EE,0x0008,0x0004,0x0002,0xA2ED,0xA2EC,0x0002,0xA2EB,0xA2EA,0x0004,0x0002,0xA2E9,0xA2E8,0x0002,0xA2E7,0xA2E6, 0x0000,0x0000,0x0000,0x0000,0x0000,0xA2E5,0x0050,0x0001,0x0016,0x0001,0x0005,0x0001,0x0001,0x0001,0xA8E9,0x0008, 0x0004,0x0002,0xA8E8,0xA8E7,0x0002,0xA8E6,0xA8E5,0x0004,0x0002,0xA8E4,0xA8E3,0x0002,0xA8E2,0xA8E1,0x0020,0x0010, 0x0008,0x0004,0x0002,0xA8E0,0xA8DF,0x0002,0xA8DE,0xA8DD,0x0004,0x0002,0xA8DC,0xA8DB,0x0002,0xA8DA,0xA8D9,0x0008, 0x0004,0x0002,0xA8D8,0xA8D7,0x0002,0xA8D6,0xA8D5,0x0004,0x0002,0xA8D4,0xA8D3,0x0002,0xA8D2,0xA8D1,0x0010,0x0008, 0x0004,0x0002,0xA8D0,0xA8CF,0x0002,0xA8CE,0xA8CD,0x0004,0x0002,0xA8CC,0xA8CB,0x0002,0xA8CA,0xA8C9,0x0000,0x0004, 0x0002,0xA8C8,0xA8C7,0x0002,0xA8C6,0xA8C5,0x0072,0x0032,0x0012,0x0005,0x0001,0x0000,0x0001,0xA1A4,0x0005,0x0001, 0x0002,0xA5F6,0xA5F5,0x0004,0x0002,0xA5F4,0xA5F3,0x0002,0xA5F2,0xA5F1,0x0010,0x0008,0x0004,0x0002,0xA5F0,0xA5EF, 0x0002,0xA5EE,0xA5ED,0x0004,0x0002,0xA5EC,0xA5EB,0x0002,0xA5EA,0xA5E9,0x0008,0x0004,0x0002,0xA5E8,0xA5E7,0x0002, 0xA5E6,0xA5E5,0x0004,0x0002,0xA5E4,0xA5E3,0x0002,0xA5E2,0xA5E1,0x0020,0x0010,0x0008,0x0004,0x0002,0xA5E0,0xA5DF, 0x0002,0xA5DE,0xA5DD,0x0004,0x0002,0xA5DC,0xA5DB,0x0002,0xA5DA,0xA5D9,0x0008,0x0004,0x0002,0xA5D8,0xA5D7,0x0002, 0xA5D6,0xA5D5,0x0004,0x0002,0xA5D4,0xA5D3,0x0002,0xA5D2,0xA5D1,0x0010,0x0008,0x0004,0x0002,0xA5D0,0xA5CF,0x0002, 0xA5CE,0xA5CD,0x0004,0x0002,0xA5CC,0xA5CB,0x0002,0xA5CA,0xA5C9,0x0008,0x0004,0x0002,0xA5C8,0xA5C7,0x0002,0xA5C6, 0xA5C5,0x0004,0x0002,0xA5C4,0xA5C3,0x0002,0xA5C2,0xA5C1,0x0040,0x0020,0x0010,0x0008,0x0004,0x0002,0xA5C0,0xA5BF, 0x0002,0xA5BE,0xA5BD,0x0004,0x0002,0xA5BC,0xA5BB,0x0002,0xA5BA,0xA5B9,0x0008,0x0004,0x0002,0xA5B8,0xA5B7,0x0002, 0xA5B6,0xA5B5,0x0004,0x0002,0xA5B4,0xA5B3,0x0002,0xA5B2,0xA5B1,0x0010,0x0008,0x0004,0x0002,0xA5B0,0xA5AF,0x0002, 0xA5AE,0xA5AD,0x0004,0x0002,0xA5AC,0xA5AB,0x0002,0xA5AA,0xA5A9,0x0008,0x0004,0x0002,0xA5A8,0xA5A7,0x0002,0xA5A6, 0xA5A5,0x0004,0x0002,0xA5A4,0xA5A3,0x0002,0xA5A2,0xA5A1,0x0009,0x0001,0x0001,0x0003,0x0001,0xA4F3,0x0002,0xA4F2, 0xA4F1,0x0010,0x0008,0x0004,0x0002,0xA4F0,0xA4EF,0x0002,0xA4EE,0xA4ED,0x0004,0x0002,0xA4EC,0xA4EB,0x0002,0xA4EA, 0xA4E9,0x0008,0x0004,0x0002,0xA4E8,0xA4E7,0x0002,0xA4E6,0xA4E5,0x0004,0x0002,0xA4E4,0xA4E3,0x0002,0xA4E2,0xA4E1, 0x00C4,0x0000,0x0000,0x0000,0x00B7,0x007E,0x003E,0x001E,0x000E,0x0006,0x0002,0xA4E0,0x0002,0xA4DF,0xA4DE,0x0004, 0x0002,0xA4DD,0xA4DC,0x0002,0xA4DB,0xA4DA,0x0008,0x0004,0x0002,0xA4D9,0xA4D8,0x0002,0xA4D7,0xA4D6,0x0004,0x0002, 0xA4D5,0xA4D4,0x0002,0xA4D3,0xA4D2,0x0010,0x0008,0x0004,0x0002,0xA4D1,0xA4D0,0x0002,0xA4CF,0xA4CE,0x0004,0x0002, 0xA4CD,0xA4CC,0x0002,0xA4CB,0xA4CA,0x0008,0x0004,0x0002,0xA4C9,0xA4C8,0x0002,0xA4C7,0xA4C6,0x0004,0x0002,0xA4C5, 0xA4C4,0x0002,0xA4C3,0xA4C2,0x0020,0x0010,0x0008,0x0004,0x0002,0xA4C1,0xA4C0,0x0002,0xA4BF,0xA4BE,0x0004,0x0002, 0xA4BD,0xA4BC,0x0002,0xA4BB,0xA4BA,0x0008,0x0004,0x0002,0xA4B9,0xA4B8,0x0002,0xA4B7,0xA4B6,0x0004,0x0002,0xA4B5, 0xA4B4,0x0002,0xA4B3,0xA4B2,0x0010,0x0008,0x0004,0x0002,0xA4B1,0xA4B0,0x0002,0xA4AF,0xA4AE,0x0004,0x0002,0xA4AD, 0xA4AC,0x0002,0xA4AB,0xA4AA,0x0008,0x0004,0x0002,0xA4A9,0xA4A8,0x0002,0xA4A7,0xA4A6,0x0004,0x0002,0xA4A5,0xA4A4, 0x0002,0xA4A3,0xA4A2,0x000C,0x0006,0x0000,0x0000,0x0000,0x0000,0xA4A1,0x0001,0x0000,0x0000,0x0000,0xA8C6,0x0011, 0x0005,0x0000,0x0001,0x0001,0xA1E5,0x0005,0x0001,0x0002,0xA1BD,0xA1BC,0x0004,0x0002,0xA1B3,0xA1B2,0x0000,0xA1FE, 0x0010,0x0008,0x0004,0x0002,0xA1BF,0xA1BE,0x0002,0xA1BB,0xA1BA,0x0004,0x0002,0xA1B9,0xA1B8,0x0002,0xA1B7,0xA1B6, 0x0005,0x0000,0x0002,0xA1B5,0xA1B4,0x0003,0x0000,0xA1A9,0x0002,0xA1A8,0xA1A3,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0002,0xA1A2,0xA1A1,0x010C,0x0001,0x0039,0x000D,0x0001,0x0000,0x0000,0x0005,0x0001,0x0001,0x0001,0xA1E1, 0x0000,0x0000,0x0001,0xA1E2,0x0017,0x000C,0x0000,0x0000,0x0006,0x0003,0x0000,0xA1D1,0x0001,0xA1EE,0x0000,0x0000, 0xA1EF,0x0001,0x0001,0x0005,0x0001,0x0002,0xA1F1,0xA1F2,0x0001,0x0000,0xA1F0,0x000E,0x0007,0x0000,0x0000,0x0001, 0x0002,0xA1F3,0xA1F4,0x0000,0x0001,0x0001,0x0002,0xA1F7,0xA1F8,0x0000,0x0001,0x0000,0x0000,0x0001,0xA1F6,0x0092, 0x0012,0x0007,0x0001,0x0001,0x0000,0x0000,0x0000,0xA3AF,0x0001,0x0001,0x0004,0x0000,0x0001,0xA1FE,0x0001,0x0002, 0xA9EF,0xA9EE,0x0040,0x0020,0x0010,0x0008,0x0004,0x0002,0xA9ED,0xA9EC,0x0002,0xA9EB,0xA9EA,0x0004,0x0002,0xA9E9, 0xA9E8,0x0002,0xA9E7,0xA9E6,0x0008,0x0004,0x0002,0xA9E5,0xA9E4,0x0002,0xA9E3,0xA9E2,0x0004,0x0002,0xA9E1,0xA9EF, 0x0002,0xA9DF,0xA9DE,0x0010,0x0008,0x0004,0x0002,0xA9DD,0xA9DC,0x0002,0xA9DB,0xA9DA,0x0004,0x0002,0xA9D9,0xA9DF, 0x0002,0xA9D7,0xA9D6,0x0008,0x0004,0x0002,0xA9D5,0xA9D4,0x0002,0xA9D3,0xA9D2,0x0004,0x0002,0xA9D1,0xA9D7,0x0002, 0xA9CF,0xA9CE,0x0020,0x0010,0x0008,0x0004,0x0002,0xA9CD,0xA9CC,0x0002,0xA9CB,0xA9CA,0x0004,0x0002,0xA9C9,0xA9CF, 0x0002,0xA9C7,0xA9C6,0x0008,0x0004,0x0002,0xA9C5,0xA9C4,0x0002,0xA9C3,0xA9C2,0x0004,0x0002,0xA9C1,0xA9C7,0x0002, 0xA9BF,0xA9BE,0x0010,0x0008,0x0004,0x0002,0xA9BD,0xA9BC,0x0002,0xA9BB,0xA9BA,0x0004,0x0002,0xA9B9,0xA9B8,0x0002, 0xA9B7,0xA9B6,0x0008,0x0004,0x0002,0xA9B5,0xA9B4,0x0002,0xA9B3,0xA9B2,0x0004,0x0002,0xA9B1,0xA9B0,0x0002,0xA9AF, 0xA9AE,0x0018,0x0000,0x0000,0x0010,0x0008,0x0004,0x0002,0xA9AD,0xA9AC,0x0002,0xA9AB,0xA9AA,0x0004,0x0002,0xA9A9, 0xA9A8,0x0002,0xA9A7,0xA9A7,0x0000,0x0000,0x0002,0xA9A5,0xA1AA,0x0001,0x0007,0x0001,0x0001,0x0001,0x0002,0xA2C4, 0xA2C3,0x0010,0x0008,0x0004,0x0002,0xA2C2,0xA2C1,0x0002,0xA2C0,0xA2BF,0x0004,0x0002,0xA2BE,0xA2BD,0x0002,0xA2BC, 0xA2BB,0x0008,0x0004,0x0002,0xA2BA,0xA2B9,0x0002,0xA2B8,0xA2B7,0x0004,0x0002,0xA2B6,0xA2B5,0x0002,0xA2B4,0xA2B3, 0x005F,0x0048,0x0000,0x0000,0x002E,0x001E,0x000E,0x0006,0x0002,0xA2B2,0x0002,0xA2B1,0xA2D8,0x0004,0x0002,0xA2D7, 0xA2D6,0x0002,0xA2D5,0xA2D4,0x0008,0x0004,0x0002,0xA2D3,0xA2D2,0x0002,0xA2D1,0xA2D0,0x0004,0x0002,0xA2CF,0xA2CE, 0x0002,0xA2CD,0xA2CC,0x0000,0x0008,0x0004,0x0002,0xA2CB,0xA2CA,0x0002,0xA2C9,0xA2C8,0x0004,0x0002,0xA2C7,0xA2C6, 0x0000,0xA2C5,0x0000,0x000F,0x0007,0x0003,0x0001,0xA2E2,0x0002,0xA2E1,0xA2E0,0x0004,0x0002,0xA2DF,0xA2DE,0x0002, 0xA2DD,0xA2DC,0x0000,0x0004,0x0002,0xA2DB,0xA2DA,0x0000,0xA2D9,0x0009,0x0001,0x0001,0x0001,0x0001,0x0000,0x0000, 0x0001,0xA1D0,0x0001,0x0001,0x0006,0x0000,0x0001,0x0001,0x0000,0xA1CD,0x0000,0x0000,0x0001,0x0000,0xA1D1,0x007D, 0x0067,0x0021,0x0009,0x0001,0x0001,0x0001,0x0003,0x0001,0xA1DB,0x0000,0xA1DA,0x0012,0x0008,0x0001,0x0003,0x0001, 0xA1DD,0x0002,0xA1DC,0xA1DD,0x0006,0x0003,0x0000,0xA1DC,0x0001,0xA1D4,0x0000,0x0000,0xA1D9,0x0001,0x0000,0x0001, 0x0000,0xA1D5,0x0020,0x000D,0x0008,0x0004,0x0000,0x0000,0xA1D5,0x0000,0x0000,0xA1D6,0x0001,0x0001,0x0001,0xA1D7, 0x000B,0x0004,0x0000,0x0000,0xA1AB,0x0003,0x0001,0xA1CB,0x0002,0xA1C3,0xA1DF,0x0004,0x0000,0x0000,0xA1E0,0x0001, 0x0000,0xA1D3,0x0019,0x000E,0x0007,0x0003,0x0001,0xA1D2,0x0002,0xA1C8,0xA1C9,0x0004,0x0002,0xA1C5,0xA1C4,0x0001, 0xA1AC,0x0004,0x0000,0x0001,0xA9A6,0x0003,0x0000,0xA1CF,0x0002,0xA1DE,0xA1D8,0x0005,0x0000,0x0001,0x0000,0xA1CC, 0x0004,0x0001,0x0001,0xA1C6,0x0000,0x0001,0xA1C7,0x0008,0x0000,0x0000,0x0000,0x0001,0x0000,0x0000,0xA1CA,0x0001, 0x0001,0x0001,0x0007,0x0003,0x0001,0xA1FD,0x0002,0xA1FA,0xA1FC,0x0000,0x0000,0xA1FB,0x0025,0x001D,0x0001,0x0000, 0x000F,0x0007,0x0003,0x0001,0xA2FC,0x0002,0xA2FB,0xA2FA,0x0004,0x0002,0xA2F9,0xA2F8,0x0002,0xA2F7,0xA2F6,0x0008, 0x0004,0x0002,0xA2F5,0xA2F4,0x0002,0xA2F3,0xA2F2,0x0000,0x0000,0xA2F1,0x0001,0x0001,0x0000,0x0001,0x0001,0x0000, 0xA1ED,0x0000,0x0000,0x0000,0x0001,0x0000,0x0000,0x0001,0xA1E6,0x0032,0x0000,0x0000,0x0000,0x0000,0x0000,0x0001, 0x0011,0x0001,0x0005,0x0000,0x0001,0x0000,0xA1F9,0x0007,0x0003,0x0000,0xA3E0,0x0002,0xA1E5,0xA1E4,0x0000,0x0001, 0xA1EB,0x000C,0x0005,0x0001,0x0001,0x0001,0xA1AD,0x0000,0x0003,0x0000,0xA1A7,0x0001,0xA1A4,0x000A,0x0005,0x0000, 0x0002,0xA1B1,0xA1B0,0x0000,0x0002,0xA1AF,0xA1AE,0x0000,0x0000,0x0000,0xA1AA,0x0001,0x0001,0x0108,0x00D5,0x0060, 0x0001,0x001F,0x0001,0x000E,0x0006,0x0003,0x0001,0xA7D7,0x0001,0xA7F1,0x0004,0x0002,0xA7F0,0xA7EF,0x0002,0xA7EE, 0xA7ED,0x0008,0x0004,0x0002,0xA7EC,0xA7EB,0x0002,0xA7EA,0xA7E9,0x0004,0x0002,0xA7E8,0xA7E7,0x0002,0xA7E6,0xA7E5, 0x0020,0x0010,0x0008,0x0004,0x0002,0xA7E4,0xA7E3,0x0002,0xA7E2,0xA7E1,0x0004,0x0002,0xA7E0,0xA7DF,0x0002,0xA7DE, 0xA7DD,0x0008,0x0004,0x0002,0xA7DC,0xA7DB,0x0002,0xA7DA,0xA7D9,0x0004,0x0002,0xA7D8,0xA7D6,0x0002,0xA7D5,0xA7D4, 0x0010,0x0008,0x0004,0x0002,0xA7D3,0xA7D2,0x0002,0xA7D1,0xA7C1,0x0004,0x0002,0xA7C0,0xA7BF,0x0002,0xA7BE,0xA7BD, 0x0008,0x0004,0x0002,0xA7BC,0xA7BB,0x0002,0xA7BA,0xA7B9,0x0004,0x0002,0xA7B8,0xA7B7,0x0002,0xA7B6,0xA7B5,0x0030, 0x0029,0x0020,0x0010,0x0008,0x0004,0x0002,0xA7B4,0xA7B3,0x0002,0xA7B2,0xA7B1,0x0004,0x0002,0xA7B0,0xA7AF,0x0002, 0xA7AE,0xA7AD,0x0008,0x0004,0x0002,0xA7AC,0xA7AB,0x0002,0xA7AA,0xA7A9,0x0004,0x0002,0xA7A8,0xA7A6,0x0002,0xA7A5, 0xA7A4,0x0000,0x0000,0x0004,0x0002,0xA7A3,0xA7A2,0x0000,0xA7A1,0x0000,0x0000,0x0000,0x0000,0x0001,0xA7A7,0x0011, 0x0001,0x0001,0x0007,0x0003,0x0001,0xA6D8,0x0002,0xA6D7,0xA6D6,0x0004,0x0002,0xA6D5,0xA6D4,0x0002,0xA6D3,0xA6D2, 0x001F,0x000F,0x0007,0x0003,0x0001,0xA6D1,0x0002,0xA6D0,0xA6CF,0x0004,0x0002,0xA6CE,0xA6CD,0x0002,0xA6CC,0xA6CB, 0x0008,0x0004,0x0002,0xA6CA,0xA6C9,0x0002,0xA6C8,0xA6C7,0x0004,0x0002,0xA6C6,0xA6C5,0x0002,0xA6C4,0xA6C3,0x0006, 0x0000,0x0000,0x0002,0xA6C2,0xA6C1,0x0007,0x0003,0x0001,0xA6B8,0x0002,0xA6B7,0xA6B6,0x0004,0x0002,0xA6B5,0xA6B4, 0x0002,0xA6B3,0xA1C6,0x0028,0x0000,0x0000,0x001F,0x000F,0x0007,0x0003,0x0001,0xA6B1,0x0002,0xA1C7,0xA6AF,0x0004, 0x0002,0xA6AE,0xA6AD,0x0002,0xA6AC,0xA1C4,0x0008,0x0004,0x0002,0xA6AA,0xA6A9,0x0002,0xA6A8,0xA6A7,0x0004,0x0002, 0xA6A6,0xA6A5,0x0002,0xA6A4,0xA6A3,0x0000,0x0000,0x0000,0x0002,0xA6A2,0xA6A1,0x0001,0x0000,0x0001,0x0001,0x0000, 0x0003,0x0001,0xA1A5,0x0001,0xA1A6,0x001F,0x0001,0x0001,0x0000,0x0011,0x0005,0x0001,0x0001,0x0001,0xA8B8,0x0006, 0x0003,0x0001,0xA8B7,0x0001,0xA8B6,0x0003,0x0001,0xA8B5,0x0001,0xA8B3,0x0000,0x0006,0x0003,0x0001,0xA8AF,0x0001, 0xA8AB,0x0000,0x0001,0xA8A3,0x0016,0x0008,0x0001,0x0001,0x0001,0x0000,0x0000,0x0000,0xA8B1,0x0007,0x0001,0x0000, 0x0001,0x0001,0x0000,0xA8AD,0x0001,0x0001,0x0000,0x0000,0x0000,0xA8A9,0x0030,0x000C,0x0006,0x0001,0x0000,0x0000, 0x0000,0xA8A7,0x0000,0x0000,0x0000,0x0000,0xA8A5,0x0012,0x0008,0x0004,0x0001,0x0000,0xA8A1,0x0001,0x0001,0xA8B9, 0x0006,0x0003,0x0001,0xA8B2,0x0000,0xA8B4,0x0000,0x0000,0xA1C2,0x000A,0x0005,0x0000,0x0002,0xA8AE,0xA8B0,0x0001, 0x0002,0xA8AA,0xA8AC,0x0000,0x0003,0x0001,0xA8BA,0x0002,0xA8A6,0xA8A8,0x000C,0x0000,0x0006,0x0000,0x0001,0x0002, 0xA8A2,0xA8A4,0x0001,0x0000,0x0000,0xA1C1,0x0001,0x0006,0x0000,0x0001,0x0002,0xA1C0,0xA1E3,0x0004,0x0001,0x0001, 0xA1A7,0x0003,0x0000,0xA1EC,0x0001,0xA1E8, }; // ucs2_to_gb2312_elements const TConvFlatTree ucs2_to_gb2312 = { 0x00A4, // min key 0xFFE5, // max key 0x0000, // links space start 0x7FFF, // links space end ucs2_to_gb2312_numelems, // number of elements (treeval_t *)&ucs2_to_gb2312_elements // elements }; // ucs2_to_gb2312 const size_t gb2312_to_ucs2_numelems = 15470; const treeval_t gb2312_to_ucs2_elements[gb2312_to_ucs2_numelems] = { 0xC112,0xB0BD,0xA85E,0xA48F,0xA24B,0xA177,0xA0C0,0xA0AC,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9F44,0x9F3E, 0xA002,0x9F3D,0xA002,0x9F37,0x9F39,0xA004,0xA002,0x9F2F,0x9F2C,0xA002,0x9F22,0xA002,0x9EEF,0x9EF2,0xA00A,0xA004, 0xA002,0x9EE5,0x9EE7,0xA002,0x9EF7,0xA002,0x9EE2,0x9EDF,0xA006,0xA002,0x9EE0,0xA002,0x9EDD,0x9EDC,0xA002,0x9EDB, 0xA002,0x9E9F,0x9E9D,0xA016,0xA00A,0xA004,0xA002,0x93D6,0x9E92,0xA002,0x9E8B,0xA002,0x9E88,0x9E87,0xA006,0xA002, 0x9E82,0xA002,0x7E3B,0x9EBE,0xA002,0x9EBD,0xA002,0x9B23,0x9B1F,0xA00A,0xA004,0xA002,0x9B22,0x9B0F,0xA002,0x9B08, 0xA002,0x9AF9,0x9AED,0xA006,0xA002,0x9AFB,0xA002,0x9AEB,0x9AEF,0xA002,0x9AE6,0xA002,0x9AE1,0x9ADF,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x9954,0x9955,0xA002,0x992E,0xA002,0x995C,0x9957,0xA004,0xA002,0x9B51,0x9B4D,0xA002,0x9B48, 0xA002,0x9B4E,0x9B58,0xA00A,0xA004,0xA002,0x9B43,0x9B45,0xA002,0x9AD1,0xA002,0x9AD5,0x9AD6,0xA006,0xA002,0x9AC2, 0xA002,0x9ACF,0x9AC0,0xA002,0x9AC1,0xA002,0x9ABC,0x9ABA,0xA016,0xA00A,0xA004,0xA002,0x9AB6,0x9E58,0xA002,0x9AB7, 0xA002,0x9AB0,0x9AB1,0xA006,0xA002,0x97B4,0xA002,0x97B2,0x97A3,0xA002,0x97AB,0xA002,0x97C9,0x9794,0xA00A,0xA004, 0xA002,0x9792,0x97C3,0xA002,0x9785,0xA002,0x977C,0x9CE2,0xA006,0xA002,0x9CDF,0xA002,0x9CDD,0x9CDC,0xA002,0x9CD9, 0xA002,0x9CD8,0x9CD7,0xA000,0xA000,0xA000,0xA00A,0xA004,0xA002,0x9CD5,0x9CD4,0xA002,0x9CD3,0xA002,0x9CD0,0x9CCF, 0xA004,0xA002,0x9CCE,0x9CCD,0xA000,0x9F07,0xA00A,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xA002,0x9CCB,0x9CCA, 0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9CC7,0x9CC6,0xA002,0x9CC5,0xA002,0x9CC4,0x9CBD,0xA004,0xA002,0x9CBC, 0x9CBB,0xA002,0x9CBA,0xA002,0x9CB7,0x9CB6,0xA00A,0xA004,0xA002,0x9CB5,0x9CB4,0xA002,0x9CB3,0xA002,0x9CB2,0x9CB1, 0xA006,0xA002,0x9CB0,0xA002,0x9CAE,0x9CAD,0xA002,0x9CAB,0xA002,0x9CA9,0x9CA8,0xA016,0xA00A,0xA004,0xA002,0x9CA7, 0x9CA6,0xA002,0x9CA5,0xA002,0x9CA3,0x9CA2,0xA006,0xA002,0x9CA1,0xA002,0x9CA0,0x9C9F,0xA002,0x9C9E,0xA002,0x9C9B, 0x9C9A,0xA00A,0xA004,0xA002,0x9C95,0x9C94,0xA002,0x9C92,0xA002,0x9C91,0x9C90,0xA006,0xA002,0x9C8E,0xA002,0x9C8B, 0x7A4C,0xA002,0x9C88,0xA002,0x9C87,0x9C86,0xA02B,0xA016,0xA00A,0xA004,0xA002,0x9C85,0x9C82,0xA002,0x9C7F,0xA002, 0x946B,0x943E,0xA006,0xA002,0x938F,0xA002,0x93CA,0x936A,0xA002,0x93E8,0xA002,0x92C8,0x947E,0xA009,0xA004,0xA002, 0x928E,0x96E0,0xA002,0x77BF,0xA000,0x96D2,0xA006,0xA002,0x96CB,0xA002,0x96BC,0x96B9,0xA002,0x9F0D,0xA002,0x9F0B, 0x9EFE,0xA016,0xA00A,0xA004,0xA002,0x9F8C,0x9F8A,0xA002,0x9F89,0xA002,0x9F88,0x9F87,0xA006,0xA002,0x9F86,0xA002, 0x9F85,0x9F83,0xA002,0x9F80,0xA002,0x973E,0x9730,0xA00A,0xA004,0xA002,0x9744,0x972A,0xA002,0x970E,0xA002,0x970F, 0x9708,0xA006,0xA002,0x973D,0xA002,0x9706,0x96EF,0xA002,0x9742,0xA002,0x96E9,0x975A,0xA01D,0xA00E,0xA000,0xA000, 0xA000,0xA000,0xA004,0xA002,0x8B26,0x8A3F,0xA002,0x89EF,0xA002,0x89EB,0x89E5,0xA001,0xA001,0xA001,0xA001,0xA005, 0xA001,0xA002,0x89DC,0x89DA,0xA002,0x89F4,0xA002,0x89D6,0x659B,0xA0AC,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002, 0x8C94,0x8C98,0xA002,0x8C85,0xA002,0x8C8A,0x8C82,0xA004,0xA002,0x8C78,0x8E9E,0xA002,0x8EA6,0xA002,0x8E90,0x8E94, 0xA00A,0xA004,0xA002,0x8EAA,0x8E85,0xA002,0x8E74,0xA002,0x8E6F,0x8E7C,0xA006,0xA002,0x8E76,0xA002,0x8E70,0x8E4A, 0xA002,0x8E63,0xA002,0x8EA1,0x8E42,0xA016,0xA00A,0xA004,0xA002,0x8E41,0x8E49,0xA002,0x8E31,0xA002,0x8E3D,0x8E35, 0xA006,0xA002,0x8E39,0xA002,0x8E40,0x8E3A,0xA002,0x8E91,0xA002,0x8E23,0x8E2E,0xA00A,0xA004,0xA002,0x8E93,0x8E1F, 0xA002,0x8E1D,0xA002,0x8E14,0x8DFD,0xA006,0xA002,0x8E09,0xA002,0x8DE4,0x8E8B,0xA002,0x8E9A,0xA002,0x8DE3,0x8E55, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8E7A,0x8DEC,0xA002,0x8DC6,0xA002,0x8DDB,0x8DCF,0xA004,0xA002,0x8DCE,0x8E92, 0xA002,0x8DDA,0xA002,0x8DD7,0x8DD6,0xA00A,0xA004,0xA002,0x8E4C,0x8DBA,0xA002,0x8DBC,0xA002,0x8DBF,0x8DB5,0xA006, 0xA002,0x8E69,0xA002,0x8E59,0x8E05,0xA002,0x8DEB,0xA002,0x8E89,0x9E7E,0xA016,0xA00A,0xA004,0xA002,0x8C55,0x91BA, 0xA002,0x91B4,0xA002,0x91B5,0x91AF,0xA006,0xA002,0x91AE,0xA002,0x91AD,0x91AA,0xA002,0x91A3,0xA002,0x91A2,0x9191, 0xA00A,0xA004,0xA002,0x918D,0x9190,0xA002,0x9185,0xA002,0x918C,0x9179,0xA006,0xA002,0x9174,0xA002,0x9172,0x91C3, 0xA002,0x91C5,0xA002,0x916F,0x9169,0xA000,0xA000,0xA000,0xA000,0xA004,0xA002,0x9170,0x9161,0xA000,0x9162,0xA0DA, 0xA0C0,0xA015,0xA001,0xA001,0xA001,0xA006,0xA001,0xA001,0xA002,0x9164,0x914F,0xA006,0xA002,0x914E,0xA002,0x9150, 0x914A,0xA002,0x8C49,0xA002,0x8C47,0x8D6D,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8D67,0x8DB2,0xA002,0x8D91, 0xA002,0x8D94,0x8D84,0xA004,0xA002,0x8D73,0x9EB4,0xA002,0x9EB8,0xA002,0x7E9B,0x7E47,0xA00A,0xA004,0xA002,0x7DAE, 0x7DA6,0xA002,0x7E36,0xA002,0x7CF8,0x7FF3,0xA006,0xA002,0x7FEE,0xA002,0x7FE9,0x7FE6,0xA002,0x7FE1,0xA002,0x7FE5, 0x7FD5,0xA016,0xA00A,0xA004,0xA002,0x7FCE,0x7FBF,0xA002,0x81EE,0xA002,0x826E,0x7CE8,0xA006,0xA002,0x7CD7,0xA002, 0x7CC5,0x7CC8,0xA002,0x7CCD,0xA002,0x7CCC,0x7CC7,0xA00A,0xA004,0xA002,0x7CDD,0x7CBD,0xA002,0x7CBC,0xA002,0x7CB2, 0x7CA2,0xA006,0xA002,0x7C9E,0xA002,0x7CF6,0x7CF2,0xA002,0x7C91,0xA002,0x6549,0x7C7C,0xA029,0xA014,0xA00A,0xA004, 0xA002,0x7FB2,0x7FB0,0xA002,0x7FAF,0xA002,0x7FA7,0x7FA5,0xA004,0xA002,0x7F9D,0x895E,0xA002,0x88DF,0xA002,0x88D8, 0x8888,0xA009,0xA004,0xA002,0x88CA,0x887E,0xA002,0x8268,0xA000,0x825F,0xA006,0xA002,0x824F,0xA002,0x824B,0x8249, 0xA002,0x8244,0xA002,0x823E,0x8234,0xA016,0xA00A,0xA004,0xA002,0x8233,0x8263,0xA002,0x8238,0xA002,0x822B,0x8228, 0xA006,0xA002,0x822F,0xA002,0x822D,0x8223,0xA002,0x8222,0xA002,0x8221,0x8844,0xA00A,0xA004,0xA002,0x81EC,0x8204, 0xA002,0x8202,0xA002,0x8201,0x81FE,0xA006,0xA002,0x7C40,0xA002,0x7C5F,0x7C38,0xA002,0x7C26,0xA002,0x7C2A,0x7C1F, 0xA001,0xA001,0xA001,0xA001,0xA00A,0xA004,0xA002,0x7C0B,0x7C6A,0xA002,0x7C0F,0xA002,0x7BFC,0x7BFE,0xA006,0xA002, 0x7C0C,0xA002,0x7BEA,0x7BE6,0xA002,0x7BE5,0xA002,0x7BDA,0x7BDD,0xA0A8,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004, 0xA002,0x7BCC,0x7BC1,0xA002,0x7C23,0xA002,0x7BB4,0x7C2B,0xA004,0xA002,0x7BA2,0x7B9C,0xA002,0x7C1E,0xA002,0x7B85, 0x7C5C,0xA00A,0xA004,0xA002,0x7B9D,0x7BDB,0xA002,0x7BB8,0xA002,0x7BCB,0x7C00,0xA006,0xA002,0x7B90,0xA002,0x7BE0, 0x7B72,0xA002,0x7B62,0xA002,0x7B7B,0x7B6E,0xA016,0xA00A,0xA004,0xA002,0x7B60,0x7B8F,0xA002,0x7B4C,0xA002,0x7B75, 0x7B45,0xA006,0xA002,0x7BF3,0xA002,0x7B58,0x7B1E,0xA002,0x7C69,0xA002,0x7B33,0x7B24,0xA00A,0xA004,0xA002,0x7B25, 0x7B20,0xA002,0x7B31,0xA002,0x7B2E,0x7B19,0xA006,0xA002,0x7B2A,0xA002,0x7B38,0x7B47,0xA002,0x7B0F,0xA002,0x7B2B, 0x7B0A,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x7B67,0x7B32,0xA002,0x7BE4,0xA002,0x7B08,0x7AFD,0xA004,0xA002,0x7AFA, 0x8210,0xA002,0x7F45,0xA002,0x7F44,0x7F4C,0xA00A,0xA004,0xA002,0x7F36,0x883C,0xA002,0x8839,0xA002,0x8821,0x881B, 0xA006,0xA002,0x880A,0xA002,0x87FE,0x8813,0xA002,0x8816,0xA002,0x87EE,0x87E0,0xA016,0xA00A,0xA004,0xA002,0x87EA, 0x87DB,0xA002,0x87CA,0xA002,0x87C0,0x87D1,0xA006,0xA002,0x87BD,0xA002,0x87D3,0x87CB,0xA002,0x87B3,0xA002,0x87B5, 0x87AC,0xA00A,0xA004,0xA002,0x87E5,0x87AB,0xA002,0x8783,0xA002,0x8797,0x87AD,0xA000,0xA002,0x8785,0xA002,0x8788, 0x87C6,0xA020,0xA001,0xA001,0xA008,0xA001,0xA001,0xA002,0x87D2,0xA002,0x87A8,0x87AF,0xA00A,0xA004,0xA002,0x8793, 0x8765,0xA002,0x8759,0xA002,0x8764,0x87BB,0xA006,0xA002,0x8763,0xA002,0x8753,0x878B,0xA002,0x876E,0xA002,0x874C, 0x8770,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8760,0x877B,0xA002,0x8811,0xA002,0x877D,0x8722,0xA004,0xA002, 0x8782,0x873F,0xA002,0x8E21,0xA002,0x8729,0x8731,0xA00A,0xA004,0xA002,0x8734,0x87C8,0xA002,0x873E,0xA002,0x871A, 0x872E,0xA006,0xA002,0x8725,0xA002,0x871E,0x873B,0xA002,0x8723,0xA002,0x8709,0x870D,0xA016,0xA00A,0xA004,0xA002, 0x870A,0x8708,0xA002,0x86F8,0xA002,0x8707,0x8704,0xA006,0xA002,0x86D1,0xA002,0x8746,0x86DF,0xA002,0x8810,0xA002, 0x86DE,0x8713,0xA00A,0xA004,0xA002,0x86D0,0x8784,0xA002,0x86ED,0xA002,0x87EF,0x86FA,0xA006,0xA002,0x86EC,0xA002, 0x86B4,0x87F6,0xA002,0x86C9,0xA002,0x86AF,0x86B1,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x86BA,0x86B0,0xA002,0x8823, 0xA002,0x86B5,0x86C4,0xA006,0xA002,0x86B6,0xA002,0x86A9,0x8693,0xA002,0x86AA,0xA002,0x86A3,0x86A7,0xA00A,0xA004, 0xA002,0x8814,0x8706,0xA002,0x868B,0xA002,0x868D,0x86A8,0xA006,0xA002,0x867B,0xA002,0x867C,0x8696,0xA002,0x8806, 0xA002,0x87E3,0x866F,0xA016,0xA00A,0xA004,0xA002,0x8654,0x864D,0xA002,0x98A6,0xA002,0x98A5,0x98A2,0xA006,0xA002, 0x98A1,0xA002,0x989F,0x989E,0xA002,0x989B,0xA002,0x989A,0x9894,0xA000,0xA004,0xA002,0x988F,0x988D,0xA002,0x988C, 0xA000,0x9889,0xA1B8,0xA0C3,0xA026,0xA001,0xA001,0xA001,0xA00D,0xA001,0xA006,0xA002,0x9883,0xA002,0x9880,0x9878, 0xA002,0x8983,0xA002,0x8071,0x8075,0xA00A,0xA004,0xA002,0x8052,0x8079,0xA002,0x8046,0xA002,0x8043,0x8035,0xA006, 0xA002,0x81F7,0xA002,0x8031,0x8028,0xA002,0x8029,0xA002,0x802C,0x8026,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004, 0xA002,0x8025,0x8022,0xA002,0x8020,0xA002,0x801C,0x8016,0xA004,0xA002,0x8014,0x8012,0xA002,0x77DC,0xA002,0x76B4, 0x76B8,0xA00A,0xA004,0xA002,0x80E5,0x758B,0xA002,0x897B,0xA002,0x8966,0x8941,0xA006,0xA002,0x8936,0xA002,0x892B, 0x8964,0xA002,0x890A,0xA002,0x8938,0x8913,0xA016,0xA00A,0xA004,0xA002,0x8919,0x8921,0xA002,0x88F0,0xA002,0x88FE, 0x88E8,0xA006,0xA002,0x88FC,0xA002,0x891A,0x88F1,0xA002,0x8949,0xA002,0x895D,0x88CE,0xA00A,0xA004,0xA002,0x8933, 0x88C9,0xA002,0x88BC,0xA002,0x88B7,0x8960,0xA006,0xA002,0x88A2,0xA002,0x8882,0x887F,0xA002,0x887D,0xA002,0x8872, 0x8869,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8864,0x7AB3,0xA002,0x7AB6,0xA002,0x7AA8,0x7AAC,0xA004,0xA002,0x7AA0, 0x7AC7,0xA002,0x7A95,0xA002,0x7A88,0x7A86,0xA00A,0xA004,0xA002,0x7A80,0x7A79,0xA002,0x7A78,0xA002,0x7AE6,0x7FCA, 0xA006,0xA002,0x766F,0xA002,0x7672,0x7656,0xA002,0x765C,0xA002,0x7654,0x7669,0xA016,0xA00A,0xA004,0xA002,0x764D, 0x7633,0xA002,0x766E,0xA002,0x7643,0x7635,0xA006,0xA002,0x766D,0xA002,0x7630,0x762D,0xA002,0x7640,0xA002,0x818C, 0x7622,0xA000,0xA000,0xA002,0x763C,0x761B,0xA0C0,0xA02B,0xA001,0xA001,0xA013,0xA007,0xA001,0xA002,0x7619,0xA002, 0x7615,0x7618,0xA006,0xA002,0x7625,0xA002,0x760A,0x761E,0xA002,0x760C,0xA002,0x7649,0x7600,0xA00A,0xA004,0xA002, 0x7610,0x75FF,0xA002,0x75FC,0xA002,0x75F1,0x7603,0xA006,0xA002,0x75E7,0xA002,0x7647,0x75E4,0xA002,0x75E6,0xA002, 0x7646,0x75E3,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x75CD,0x75D6,0xA002,0x75C2,0xA002,0x75C3,0x75B0,0xA004, 0xA002,0x76B0,0x75C4,0xA002,0x75B8,0xA002,0x75FE,0x75B3,0xA00A,0xA004,0xA002,0x75A3,0x75AC,0xA002,0x759D,0xA002, 0x7658,0x7664,0xA006,0xA002,0x7594,0xA002,0x7592,0x9E73,0xA002,0x9E6D,0xA002,0x9E71,0x9E6C,0xA016,0xA00A,0xA004, 0xA002,0x9E6B,0x9E6A,0xA002,0x9E69,0xA002,0x9E68,0x9E67,0xA006,0xA002,0x9E66,0xA002,0x9E63,0x9E5E,0xA002,0x9E5C, 0xA002,0x9E5B,0x9E5A,0xA00A,0xA004,0xA002,0x9E57,0x9E55,0xA002,0x9E51,0xA002,0x9E4E,0x9E4C,0xA006,0xA002,0x9E4B, 0xA002,0x9E49,0x9E48,0xA002,0x9E47,0xA002,0x9E46,0x9E44,0xA02B,0xA016,0xA00A,0xA004,0xA002,0x9E42,0x9E41,0xA002, 0x9E3E,0xA002,0x9E3A,0x9E39,0xA006,0xA002,0x9E37,0xA002,0x9E38,0x9E36,0xA002,0x9E31,0xA002,0x9E32,0x9E2C,0xA00A, 0xA004,0xA002,0x9E2B,0x9E2A,0xA002,0x9E29,0xA002,0x9E28,0x9E22,0xA006,0xA002,0x9E20,0xA002,0x752C,0x74E0,0xA002, 0x74DE,0xA000,0x76A4,0xA000,0xA00A,0xA004,0xA002,0x7693,0x768E,0xA002,0x7688,0xA002,0x7A70,0x99A5,0xA006,0xA002, 0x9ECF,0xA002,0x7A61,0x7A37,0xA000,0x7A39,0xA001,0xA001,0xA008,0xA001,0xA001,0xA001,0xA001,0xA002,0x7A14,0x7A1E, 0xA015,0xA009,0xA004,0xA002,0x7A02,0x7A03,0xA002,0x5D47,0xA000,0x7A06,0xA006,0xA002,0x79EB,0xA002,0x79ED,0x79D5, 0xA002,0x96C9,0xA002,0x77EC,0x77E7,0xA00A,0xA004,0xA002,0x953A,0x9573,0xA002,0x9572,0xA002,0x9571,0x956F,0xA006, 0xA002,0x956C,0xA002,0x956B,0x956A,0xA002,0x9569,0xA002,0x9568,0x9567,0xA154,0xA090,0xA000,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x9566,0x9565,0xA002,0x9564,0xA002,0x9562,0x9561,0xA004,0xA002,0x955D,0x955F,0xA002,0x955E, 0xA002,0x955B,0x9559,0xA00A,0xA004,0xA002,0x9558,0x9557,0xA002,0x9556,0xA002,0x9554,0x9553,0xA006,0xA002,0x9552, 0xA002,0x954F,0x954E,0xA002,0x954C,0xA002,0x9549,0x9546,0xA016,0xA00A,0xA004,0xA002,0x9545,0x9544,0xA002,0x9535, 0xA002,0x9542,0x953F,0xA006,0xA002,0x953E,0xA002,0x953C,0x9538,0xA002,0x9537,0xA002,0x9536,0x9534,0xA00A,0xA004, 0xA002,0x9532,0x9531,0xA002,0x952C,0xA002,0x9529,0x952B,0xA006,0xA002,0x952A,0xA002,0x9522,0x951F,0xA002,0x951E, 0xA002,0x951D,0x951B,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9518,0x9516,0xA002,0x9515,0xA002,0x9514,0x9513,0xA004, 0xA002,0x9512,0x950F,0xA002,0x950E,0xA002,0x950D,0x950A,0xA00A,0xA004,0xA002,0x9509,0x9507,0xA002,0x9506,0xA002, 0x9502,0x9503,0xA006,0xA002,0x94FF,0xA002,0x94FD,0x94FC,0xA002,0x94F9,0xA002,0x94F7,0x94F5,0xA000,0xA00A,0xA004, 0xA002,0x94F4,0x94F3,0xA002,0x94EF,0xA002,0x94EE,0x94EB,0xA000,0xA000,0x94E9,0xA039,0xA001,0xA00C,0xA001,0xA001, 0xA004,0xA001,0xA001,0x94EA,0xA002,0x94E8,0xA002,0x94E7,0x94E5,0xA016,0xA00A,0xA004,0xA002,0x94E4,0x94E2,0xA002, 0x94E0,0xA002,0x94DF,0x94DE,0xA006,0xA002,0x94DB,0xA002,0x94D8,0x94D9,0xA002,0x94D7,0xA002,0x94D6,0x94D5,0xA00A, 0xA004,0xA002,0x94D2,0x94D1,0xA002,0x94D0,0xA002,0x94CE,0x94CD,0xA006,0xA002,0x94CC,0xA002,0x94CB,0x94CA,0xA002, 0x94C9,0xA002,0x94C8,0x94C4,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x94BF,0x94BD,0xA002,0x94BC,0xA002,0x94BA, 0x94B9,0xA004,0xA002,0x94B8,0x94B7,0xA002,0x94B6,0xA002,0x94B4,0x94B2,0xA00A,0xA004,0xA002,0x94B0,0x94AF,0xA002, 0x94AC,0xA002,0x94AD,0x94AA,0xA006,0xA002,0x94AB,0xA002,0x94A4,0x94A3,0xA002,0x949C,0xA002,0x949B,0x949A,0xA016, 0xA00A,0xA004,0xA002,0x9495,0x9497,0xA002,0x9494,0xA002,0x9490,0x948F,0xA006,0xA002,0x948D,0xA002,0x948C,0x948A, 0xA002,0x948B,0xA002,0x9487,0x9486,0xA00A,0xA004,0xA002,0x9485,0x8832,0xA002,0x76E5,0xA002,0x76CD,0x7F7E,0xA006, 0xA002,0x7F88,0xA002,0x7F79,0x7F71,0xA002,0x7F86,0xA002,0x7F68,0x8A48,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x7F5F, 0x7F61,0xA002,0x7F66,0xA002,0x7583,0x7579,0xA006,0xA002,0x7572,0xA002,0x755B,0x7548,0xA002,0x754B,0xA002,0x754E, 0x7540,0xA00A,0xA004,0xA002,0x753A,0x77BD,0xA002,0x77B5,0xA002,0x77B0,0x77A0,0xA006,0xA002,0x779F,0xA002,0x7791, 0x778C,0xA002,0x7780,0xA002,0x777D,0x778D,0xA000,0xA000,0xA004,0xA002,0x777F,0x7765,0xA000,0x96CE,0xA041,0xA001, 0xA001,0xA013,0xA001,0xA006,0xA001,0xA001,0xA002,0x7768,0x775A,0xA006,0xA002,0x7743,0xA002,0x7747,0x77BC,0xA002, 0x775E,0xA002,0x7738,0x7735,0xA016,0xA00A,0xA004,0xA002,0x7726,0x772D,0xA002,0x7719,0xA002,0x7722,0x771A,0xA006, 0xA002,0x7708,0xA002,0x7707,0x76F9,0xA002,0x770D,0xA002,0x7704,0x76F1,0xA00A,0xA004,0xA002,0x9EFC,0x9EFB,0xA002, 0x9EF9,0xA002,0x9F9B,0x7934,0xA006,0xA002,0x791E,0xA002,0x7924,0x7913,0xA002,0x78F4,0xA002,0x7905,0x78F2,0xA000, 0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x78EC,0x78C9,0xA002,0x78D9,0xA002,0x78D4,0x78A5,0xA004,0xA002,0x78B9, 0x78B2,0xA002,0x78A3,0xA002,0x78A1,0x78E3,0xA00A,0xA004,0xA002,0x7887,0x789A,0xA002,0x7893,0xA002,0x78E7,0x786A, 0xA006,0xA002,0x784C,0xA002,0x7847,0x7850,0xA002,0x7826,0xA002,0x78FD,0x7864,0xA016,0xA00A,0xA004,0xA002,0x786D, 0x784E,0xA002,0x7829,0xA002,0x7823,0x782C,0xA006,0xA002,0x7825,0xA002,0x783C,0x781F,0xA002,0x7931,0xA002,0x792A, 0x7839,0xA00A,0xA004,0xA002,0x781D,0x781C,0xA002,0x782D,0xA002,0x65B2,0x7811,0xA006,0xA002,0x7818,0xA002,0x7868, 0x7809,0xA002,0x78AD,0xA002,0x77F8,0x78EF,0xA000,0xA014,0xA00A,0xA004,0xA002,0x6DFC,0x6FA9,0xA002,0x6C93,0xA002, 0x807F,0x8080,0xA004,0xA002,0x6207,0x61E3,0xA002,0x61CB,0xA002,0x619D,0x61A9,0xA00A,0xA004,0xA002,0x615D,0x610D, 0xA002,0x6106,0xA002,0x6128,0x6063,0xA006,0xA002,0x6059,0xA002,0x6041,0x6067,0xA002,0x605A,0xA002,0x605D,0x61DF, 0xA435,0xA246,0xA10B,0xA0BF,0xA044,0xA001,0xA017,0xA001,0xA00A,0xA004,0xA002,0x5FD0,0x5FD1,0xA002,0x79B3,0xA002, 0x79A7,0x799A,0xA006,0xA002,0x798A,0xA002,0x79AA,0x797A,0xA002,0x7967,0xA002,0x798E,0x7960,0xA016,0xA00A,0xA004, 0xA002,0x7957,0x79B0,0xA002,0x795A,0xA002,0x7953,0x795C,0xA006,0xA002,0x795B,0xA002,0x7949,0x7946,0xA002,0x7940, 0xA002,0x793B,0x6249,0xA00A,0xA004,0xA002,0x6248,0x6243,0xA002,0x623D,0xA002,0x623E,0x71B9,0xA006,0xA002,0x7166, 0xA002,0x71FE,0x706C,0xA002,0x7228,0xA002,0x721D,0x71F9,0xA055,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x71E7,0x71D4, 0xA002,0x71E0,0xA002,0x71A0,0x71A8,0xA004,0xA002,0x71B5,0x71B3,0xA002,0x7198,0xA002,0x717A,0x7178,0xA00A,0xA004, 0xA002,0x714A,0x7172,0xA002,0x7145,0xA002,0x7168,0x715C,0xA006,0xA002,0x7173,0xA002,0x7131,0x712F,0xA002,0x71DC, 0xA002,0x7113,0x7110,0xA016,0xA00A,0xA004,0xA002,0x70CA,0x71C1,0xA002,0x70B1,0xA002,0x70AB,0x70B7,0xA006,0xA002, 0x70C0,0xA002,0x70BB,0x7197,0xA002,0x71C9,0xA002,0x7152,0x716C,0xA00A,0xA004,0xA002,0x65D6,0x65D2,0xA002,0x65CE, 0xA002,0x65CD,0x65C3,0xA005,0xA002,0x65C4,0xA000,0x8337,0xA002,0x6595,0xA002,0x9F51,0x6590,0xA000,0xA014,0xA00A, 0xA004,0xA002,0x89F3,0x8F42,0xA002,0x5F40,0xA002,0x6BB3,0x98DA,0xA004,0xA002,0x98D9,0x98D5,0xA002,0x98D3,0xA002, 0x98D2,0x98D1,0xA00A,0xA004,0xA002,0x6B59,0x6B46,0xA002,0x6B43,0xA002,0x6B39,0x6B37,0xA000,0xA002,0x6B5F,0xA002, 0x81A6,0x81C1,0xA001,0xA001,0xA01E,0xA008,0xA001,0xA001,0xA002,0x81BB,0xA002,0x81CA,0x6726,0xA00A,0xA004,0xA002, 0x81CC,0x81AA,0xA002,0x81A3,0xA002,0x6ED5,0x81CF,0xA006,0xA002,0x8182,0xA002,0x8188,0x5AB5,0xA002,0x584D,0xA002, 0x8167,0x816D,0xA016,0xA00A,0xA004,0xA002,0x8183,0x817C,0xA002,0x8169,0xA002,0x8160,0x8171,0xA006,0xA002,0x815A, 0xA002,0x8159,0x8174,0xA002,0x8153,0xA002,0x9183,0x8148,0xA00A,0xA004,0xA002,0x8132,0x8118,0xA002,0x812C,0xA002, 0x811E,0x8161,0xA006,0xA002,0x8C5A,0xA002,0x8112,0x7739,0xA002,0x80FC,0xA002,0x80F2,0x810E,0xA077,0xA000,0xA056, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x81BE,0x80ED,0xA002,0x80F4,0xA002,0x80F1,0x811B,0xA004,0xA002,0x80DD,0x80CA, 0xA002,0x80D7,0xA002,0x80CD,0x80D9,0xA00A,0xA004,0xA002,0x80C4,0x80C2,0xA002,0x80DB,0xA002,0x81DA,0x80E9,0xA006, 0xA002,0x80E8,0xA002,0x80E7,0x80B7,0xA002,0x991A,0xA002,0x80AD,0x80AB,0xA016,0xA00A,0xA004,0xA002,0x80B1,0x80BD, 0xA002,0x670A,0xA002,0x80BC,0x8093,0xA006,0xA002,0x809C,0xA002,0x809F,0x5216,0xA002,0x8662,0xA002,0x7230,0x7256, 0xA00A,0xA004,0xA002,0x7252,0x7258,0xA002,0x656B,0xA002,0x6555,0x6535,0xA006,0xA002,0x6C33,0xA002,0x6C2A,0x7D6A, 0xA002,0x6C2C,0xA002,0x6C21,0x6C1A,0xA000,0xA014,0xA00A,0xA004,0xA002,0x6C19,0x6C18,0xA002,0x6C15,0xA002,0x6C0D, 0x6C06,0xA004,0xA002,0x6C0C,0x6C05,0xA002,0x6BF9,0xA002,0x6BFF,0x6BFD,0xA000,0xA004,0xA002,0x6BF3,0x6BEA,0xA002, 0x8004,0xA002,0x64D8,0x643F,0xA052,0xA001,0xA025,0xA00F,0xA005,0xA001,0xA001,0xA001,0x63B0,0xA004,0xA002,0x6332, 0x6308,0xA002,0x7292,0xA002,0x728F,0x728D,0xA00A,0xA004,0xA002,0x7291,0x7284,0xA002,0x727F,0xA002,0x727E,0x726F, 0xA006,0xA002,0x7266,0xA002,0x725D,0x729F,0xA002,0x726E,0xA002,0x89D1,0x89D0,0xA016,0xA00A,0xA004,0xA002,0x89CF, 0x89CE,0xA002,0x89CC,0xA002,0x89CB,0x89CA,0xA006,0xA002,0x89C7,0xA002,0x8D59,0x8D55,0xA002,0x8D4D,0xA002,0x8D47, 0x8D49,0xA00A,0xA004,0xA002,0x8D48,0x8D46,0xA002,0x8D45,0xA002,0x8D40,0x8D3D,0xA006,0xA002,0x8D3B,0xA002,0x8D36, 0x8D33,0xA002,0x8D32,0xA002,0x66E9,0x66E6,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x66DC,0x66DB,0xA002,0x66BE, 0xA002,0x669D,0x66D6,0xA004,0xA002,0x668C,0x6684,0xA002,0x6677,0xA002,0x6657,0x6661,0xA00A,0xA004,0xA002,0x6689, 0x664F,0xA002,0x6641,0xA002,0x66C4,0x665F,0xA006,0xA002,0x8006,0xA002,0x66B1,0x6636,0xA002,0x6631,0xA002,0x6634, 0x661D,0xA016,0xA00A,0xA004,0xA002,0x6705,0x7085,0xA002,0x6600,0xA002,0x6615,0x6603,0xA006,0xA002,0x6772,0xA002, 0x66C7,0x660A,0xA002,0x65F0,0xA002,0x65EF,0x65EE,0xA00A,0xA004,0xA002,0x6534,0x7513,0xA002,0x7511,0xA002,0x750F, 0x74FF,0xA006,0xA002,0x74F4,0xA002,0x750C,0x81E7,0xA002,0x622C,0xA002,0x6224,0x6225,0xA000,0xA016,0xA00A,0xA004, 0xA002,0x6221,0x6222,0xA002,0x621F,0xA002,0x621B,0x6227,0xA006,0xA002,0x6214,0xA002,0x8ECE,0x8F9A,0xA002,0x8F98, 0xA002,0x8F8F,0x8F8E,0xA000,0xA000,0xA000,0x8F8D,0xA0C3,0xA057,0xA001,0xA001,0xA029,0xA013,0xA009,0xA003,0xA001, 0x8F8B,0xA002,0x8F87,0xA002,0x8F84,0x8F82,0xA004,0xA002,0x8F81,0x8F7E,0xA002,0x8F7C,0xA002,0x8F7A,0x8F79,0xA00A, 0xA004,0xA002,0x8F77,0x8F78,0xA002,0x8F76,0xA002,0x8F75,0x8F73,0xA006,0xA002,0x8F72,0xA002,0x8F71,0x8F6D,0xA002, 0x8F6B,0xA002,0x6BAA,0x6BAF,0xA016,0xA00A,0xA004,0xA002,0x6B9B,0x6BAB,0xA002,0x6B8D,0xA002,0x6BAE,0x6B9E,0xA006, 0xA002,0x6B84,0xA002,0x6BA4,0x6B82,0xA002,0x6B81,0xA002,0x7352,0x7337,0xA00A,0xA004,0xA002,0x6AAB,0x8617,0xA002, 0x6AA9,0xA002,0x7C37,0x6A91,0xA006,0xA002,0x6ADE,0xA002,0x6A58,0x6A28,0xA002,0x6A3D,0xA002,0x6AD3,0x6A8E,0xA000, 0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6A35,0x6A5B,0xA002,0x6A50,0xA002,0x6AA0,0x6A3E,0xA004,0xA002,0x6A44, 0x69F2,0xA002,0x6A65,0xA002,0x6A18,0x6A17,0xA00A,0xA004,0xA002,0x69ED,0x6AA3,0xA002,0x69FF,0xA002,0x698D,0x6AE7, 0xA006,0xA002,0x6995,0xA002,0x6AB3,0x69CA,0xA002,0x69C1,0xA002,0x69B1,0x69D4,0xA016,0xA00A,0xA004,0xA002,0x69AD, 0x69AB,0xA002,0x69BB,0xA002,0x69A7,0x699B,0xA006,0xA002,0x6979,0xA002,0x6963,0x6966,0xA002,0x6AF8,0xA002,0x69CE, 0x6ADA,0xA00A,0xA004,0xA002,0x6AEC,0x69CC,0xA002,0x6934,0xA002,0x8429,0x6998,0xA006,0xA002,0x6980,0xA002,0x696B, 0x6B16,0xA002,0x695D,0xA002,0x6A1D,0x6960,0xA000,0xA000,0xA00A,0xA004,0xA002,0x6939,0x6971,0xA002,0x6910,0xA002, 0x68E3,0x6957,0xA004,0xA002,0x69E8,0x690B,0xA002,0x7BA0,0xA000,0x6B0F,0xA0C5,0xA05F,0xA009,0xA001,0xA001,0xA001, 0xA001,0xA001,0xA002,0x6AC2,0x69E7,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6ADD,0x68FC,0xA002,0x696E,0xA002,0x6B1E, 0x686B,0xA004,0xA002,0x6893,0x6877,0xA002,0x6CED,0xA002,0x688F,0x68B5,0xA00A,0xA004,0xA002,0x6829,0x6849,0xA002, 0x684A,0xA002,0x6B12,0x69A4,0xA006,0xA002,0x6A9C,0xA002,0x6841,0x6A3A,0xA002,0x6855,0xA002,0x681D,0x6883,0xA016, 0xA00A,0xA004,0xA002,0x69BF,0x6844,0xA002,0x6968,0xA002,0x684E,0x6A48,0xA006,0xA002,0x690F,0xA002,0x6833,0x6832, 0xA002,0x6A89,0xA002,0x67C1,0x6ADF,0xA00A,0xA004,0xA002,0x67E2,0x67B8,0xA002,0x67C3,0xA002,0x6894,0x67DD,0xA006, 0xA002,0x67B3,0xA002,0x67DA,0x67B5,0xA002,0x67D9,0xA002,0x6AE8,0x67B0,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002, 0x67E9,0x6AF3,0xA002,0x67D8,0xA002,0x6ADB,0x67F0,0xA004,0xA002,0x677C,0x6777,0xA002,0x678B,0xA002,0x689F,0x6A05, 0xA00A,0xA004,0xA002,0x68D6,0x6775,0xA002,0x67A7,0xA002,0x6798,0x6773,0xA006,0xA002,0x676A,0xA002,0x6787,0x6AEA, 0xA002,0x69AA,0xA002,0x6748,0x675E,0xA016,0xA00A,0xA004,0xA002,0x6753,0x674C,0xA002,0x97EC,0xA002,0x97EB,0x97EA, 0xA006,0xA002,0x74BA,0xA002,0x74DA,0x74A7,0xA002,0x7490,0xA002,0x74A9,0x74A8,0xA00A,0xA004,0xA002,0x749E,0x748B, 0xA002,0x74BF,0xA002,0x7481,0x7480,0xA006,0xA002,0x74D4,0xA002,0x749C,0x747E,0xA002,0x746D,0xA002,0x74A6,0x7459, 0xA000,0xA000,0xA00A,0xA004,0xA002,0x7455,0x7457,0xA002,0x745C,0xA002,0x7441,0x741A,0xA000,0xA000,0x741B,0xA001, 0xA00E,0xA001,0xA001,0xA001,0xA005,0xA001,0xA002,0x742C,0x742E,0xA002,0x7430,0xA002,0x83CE,0x7425,0xA02C,0xA016, 0xA00A,0xA004,0xA002,0x7426,0x745B,0xA002,0x742A,0xA002,0x7489,0x743F,0xA006,0xA002,0x74BD,0xA002,0x73DE,0x73E7, 0xA002,0x73E9,0xA002,0x740A,0x987C,0xA00A,0xA004,0xA002,0x73D9,0x73E5,0xA002,0x73C8,0xA002,0x73C9,0x73C0,0xA006, 0xA002,0x73B3,0xA002,0x73B7,0x74CF,0xA002,0x73C2,0xA002,0x73CF,0x739F,0xA016,0xA00A,0xA004,0xA002,0x73A2,0x744B, 0xA002,0x74A3,0xA002,0x738E,0x9095,0xA006,0xA002,0x753E,0xA002,0x5DDB,0x757F,0xA002,0x5E7A,0xA002,0x7F35,0x7F33, 0xA00A,0xA004,0xA002,0x7F32,0x7F31,0xA002,0x97C1,0xA002,0x7F2F,0x7F2D,0xA006,0xA002,0x7F2C,0xA002,0x7F2B,0x7F2A, 0xA002,0x7F27,0xA002,0x7F26,0x7F25,0xA1E3,0xA120,0xA05F,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x7F24, 0x7F23,0xA002,0x7F22,0xA002,0x7F21,0x7F1F,0xA004,0xA002,0x7F1B,0x7F1C,0xA002,0x7F19,0xA002,0x7F17,0x7F12,0xA00A, 0xA004,0xA002,0x7F11,0x7F0F,0xA002,0x7F0C,0xA002,0x7F0B,0x7F08,0xA006,0xA002,0x7F07,0xA002,0x7F03,0x7F02,0xA002, 0x7F01,0xA002,0x7EFE,0x7EFB,0xA016,0xA00A,0xA004,0xA002,0x7EFA,0x7EF6,0xA002,0x7F0D,0xA002,0x7EF2,0x7EF1,0xA006, 0xA002,0x7EEF,0xA002,0x7EEE,0x7EEB,0xA002,0x7EE8,0xA002,0x7EE1,0x7EE0,0xA00A,0xA004,0xA002,0x7EDB,0x7ED7,0xA002, 0x7ED4,0xA002,0x7ED0,0x7ECC,0xA006,0xA002,0x7ECB,0xA002,0x7EC9,0x7EC2,0xA002,0x977E,0xA002,0x7EC0,0x7EBE,0xA000, 0xA000,0xA000,0xA000,0xA002,0x7EB0,0x7EAD,0xA06A,0xA014,0xA001,0xA001,0xA006,0xA001,0xA001,0xA002,0x7EA9,0x7EA8, 0xA006,0xA002,0x7EA5,0xA002,0x7EA3,0x7EA1,0xA002,0x7E9F,0xA002,0x9AA7,0x9AA5,0xA02A,0xA014,0xA00A,0xA004,0xA002, 0x9AA3,0x9AA2,0xA002,0x9AA0,0xA002,0x9A9F,0x9A9D,0xA004,0xA002,0x9A9C,0x9A9B,0xA002,0x9A98,0xA002,0x9A96,0x9A93, 0xA00A,0xA004,0xA002,0x9A92,0x9A90,0xA002,0x9A8A,0xA002,0x9A88,0x9A85,0xA006,0xA002,0x9A81,0xA002,0x9A80,0x9A7D, 0xA002,0x9A7F,0xA002,0x9A7A,0x9A78,0xA016,0xA00A,0xA004,0xA002,0x9A77,0x9A75,0xA002,0x5B62,0xA002,0x5B53,0x5B51, 0xA006,0xA002,0x5B73,0xA002,0x5B65,0x5B5A,0xA002,0x5C1C,0xA002,0x5C15,0x5B40,0xA00A,0xA004,0xA002,0x5B37,0x5B32, 0xA002,0x5B16,0xA002,0x5B17,0x5B09,0xA006,0xA002,0x5ADC,0xA002,0x5AD8,0x5AE6,0xA002,0x5AD6,0xA002,0x5B19,0x5AE3, 0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5AE0,0x5AB8,0xA002,0x5B2A,0xA002,0x5B21,0x5AB2,0xA004,0xA002,0x5AEB, 0x5ABE,0xA002,0x5A7A,0xA002,0x5A77,0x5A9B,0xA00A,0xA004,0xA002,0x5ABC,0x80EC,0xA002,0x5B0B,0xA002,0x5A62,0x5A3C, 0xA006,0xA002,0x5A55,0xA002,0x5A4A,0x5A67,0xA002,0x5A50,0xA002,0x5A13,0x5A23,0xA016,0xA00A,0xA004,0xA002,0x5A11, 0x5AFB,0xA002,0x5AA7,0xA002,0x5A09,0x5A0C,0xA006,0xA002,0x59F9,0xA002,0x59D8,0x59E3,0xA002,0x5B4C,0xA002,0x59DD, 0x5B08,0xA00A,0xA004,0xA002,0x5A6D,0x59BE,0xA002,0x59D7,0xA002,0x601E,0x59B2,0xA006,0xA002,0x59D2,0xA002,0x59A4, 0x599E,0xA002,0x5AAF,0xA002,0x59CA,0x5997,0xA071,0xA001,0xA018,0xA001,0xA001,0xA00A,0xA004,0xA002,0x59A3,0x5AD7, 0xA002,0x5AF5,0xA002,0x598D,0x5983,0xA006,0xA002,0x5981,0xA002,0x5C6E,0x9B3B,0xA002,0x5F3C,0xA002,0x8274,0x5F2D, 0xA02C,0xA016,0xA00A,0xA004,0xA002,0x5F29,0x5F33,0xA002,0x7FBC,0xA002,0x5C68,0x5C63,0xA006,0xA002,0x5B71,0xA002, 0x5C59,0x5C50,0xA002,0x54AB,0xA002,0x5C3B,0x5F58,0xA00A,0xA004,0xA002,0x5F56,0x5F57,0xA002,0x5F50,0xA002,0x908B, 0x9083,0xA006,0xA002,0x9088,0xA002,0x9082,0x907D,0xA002,0x9074,0xA002,0x66B9,0x905B,0xA016,0xA00A,0xA004,0xA002, 0x9062,0x9058,0xA002,0x9068,0xA002,0x9050,0x9052,0xA006,0xA002,0x9051,0xA002,0x9044,0x902F,0xA002,0x902D,0xA002, 0x9036,0x9035,0xA00A,0xA004,0xA002,0x9021,0x9016,0xA002,0x900D,0xA002,0x9011,0x9090,0xA006,0xA002,0x900B,0xA002, 0x9004,0x9005,0xA002,0x8FE8,0xA002,0x9015,0x8FE6,0xA000,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9087,0x8FE4, 0xA002,0x8FEE,0xA002,0x8FE5,0x8FD5,0xA004,0xA002,0x8FD3,0x8FB6,0xA002,0x8B07,0xA002,0x8E47,0x5BF0,0xA00A,0xA004, 0xA002,0x8930,0x5BEE,0xA002,0x5BE4,0xA002,0x6434,0x9A9E,0xA006,0xA002,0x752F,0xA002,0x5BB8,0x5BA5,0xA002,0x5B93, 0xA002,0x5B95,0x5B84,0xA016,0xA00A,0xA004,0xA002,0x5B80,0x705E,0xA002,0x705D,0xA002,0x7035,0x7039,0xA006,0xA002, 0x701B,0xA002,0x7023,0x701A,0xA002,0x6FEF,0xA002,0x6FE0,0x6FDE,0xA00A,0xA004,0xA002,0x6FEE,0x6FE1,0xA002,0x6FC2, 0xA002,0x6FB6,0x6FB9,0xA000,0xA002,0x6FA7,0xA000,0x6FC9,0xA13F,0xA0C3,0xA078,0xA022,0xA001,0xA00B,0xA001,0xA004, 0xA001,0xA001,0x7028,0xA002,0x6F7A,0xA002,0x6F7C,0x6F72,0xA00A,0xA004,0xA002,0x6F78,0x6F8C,0xA002,0x6F8D,0xA002, 0x6F89,0x6F29,0xA006,0xA002,0x6F09,0xA002,0x6F2A,0x6F74,0xA002,0x7032,0xA002,0x6F36,0x6F2F,0xA02A,0xA014,0xA00A, 0xA004,0xA002,0x6EF9,0x6F15,0xA002,0x6F24,0xA002,0x701F,0x7020,0xA004,0xA002,0x6F62,0x8245,0xA002,0x6EC2,0xA002, 0x6E8F,0x6ECF,0xA00A,0xA004,0xA002,0x6EB4,0x6F77,0xA002,0x6EB7,0xA002,0x6EBB,0x6EBD,0xA006,0xA002,0x6EA7,0xA002, 0x6EA5,0x6EE2,0xA002,0x6F2D,0xA002,0x7044,0x6E98,0xA016,0xA00A,0xA004,0xA002,0x6EB1,0x6EDF,0xA002,0x6E44,0xA002, 0x6E25,0x6E32,0xA006,0xA002,0x6E54,0xA002,0x6E53,0x6F35,0xA002,0x6E5F,0xA002,0x6EB2,0x6E6B,0xA00A,0xA004,0xA002, 0x6E4E,0x6E6E,0xA002,0x6E2B,0xA002,0x6DAE,0x6E0C,0xA006,0xA002,0x6DAB,0xA002,0x6E16,0x6DD9,0xA002,0x6DDD,0xA002, 0x6DE6,0x6FA0,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6DE0,0x6DBF,0xA002,0x7006,0xA002,0x6DDE,0x6DDB,0xA004, 0xA002,0x6DC7,0x967C,0xA002,0x6D63,0xA002,0x6D7C,0x6D60,0xA00A,0xA004,0xA002,0x6D5C,0x6D94,0xA002,0x7106,0xA002, 0x6D5E,0x6F7F,0xA006,0xA002,0x6DF6,0xA002,0x6D6F,0x6D91,0xA002,0x6D33,0xA002,0x6F6F,0x6EF8,0xA016,0xA00A,0xA004, 0xA002,0x700F,0x6D1A,0xA002,0x6D35,0xA002,0x6D2E,0x6FAE,0xA006,0xA002,0x6D2B,0xA002,0x6D0E,0x6D19,0xA002,0x6D04, 0xA002,0x6D07,0x6E5E,0xA000,0xA004,0xA002,0x6D79,0x6D0C,0xA002,0x6D27,0xA000,0x6D39,0xA001,0xA024,0xA001,0xA00D, 0xA001,0xA006,0xA002,0x6D87,0xA002,0x6CEF,0x6CD3,0xA002,0x6CB1,0xA002,0x6CEE,0x6CEB,0xA00A,0xA004,0xA002,0x6FFC, 0x6CD6,0xA002,0x6CE0,0xA002,0x6CB2,0x6CD7,0xA006,0xA002,0x6CF1,0xA002,0x7018,0x7027,0xA002,0x6CAD,0xA002,0x6CD4, 0x6CD0,0xA02B,0xA015,0xA009,0xA004,0xA002,0x6E88,0x6C86,0xA002,0x6C76,0xA000,0x6C74,0xA006,0xA002,0x6C69,0xA002, 0x6C8C,0x6C94,0xA002,0x6C90,0xA002,0x6C85,0x7043,0xA00A,0xA004,0xA002,0x6C4A,0x6C5C,0xA002,0x6C54,0xA002,0x6C35, 0x6215,0xA006,0xA002,0x723F,0xA002,0x4E2C,0x961A,0xA002,0x9619,0xA002,0x9617,0x9616,0xA016,0xA00A,0xA004,0xA002, 0x9615,0x9612,0xA002,0x960F,0xA002,0x960D,0x960C,0xA006,0xA002,0x9B29,0xA002,0x960A,0x9608,0xA002,0x9606,0xA002, 0x9B2E,0x9603,0xA00A,0xA004,0xA002,0x95FE,0x95FC,0xA002,0x95F6,0xA002,0x95F5,0x95F3,0xA006,0xA002,0x95F1,0xA002, 0x95EB,0x95E9,0xA002,0x96B3,0xA002,0x5FDD,0x61F5,0xA047,0xA000,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x61D4, 0x61B7,0xA002,0x61A7,0xA002,0x6194,0x61AC,0xA004,0xA002,0x6175,0x614A,0xA002,0x612B,0xA002,0x610E,0x6100,0xA00A, 0xA004,0xA002,0x60F4,0x6123,0xA002,0x6115,0xA002,0x6192,0x614D,0xA006,0xA002,0x60B4,0xA002,0x60DA,0x60C6,0xA002, 0x60D8,0xA002,0x60DD,0x60B1,0xA016,0xA00A,0xA004,0xA002,0x60BB,0x611C,0xA002,0x609B,0xA002,0x608C,0x6092,0xA006, 0xA002,0x6083,0xA002,0x609D,0x6173,0xA002,0x609A,0xA002,0x8A96,0x60F2,0xA000,0xA000,0xA000,0x606A,0xA082,0xA02C, 0xA001,0xA015,0xA009,0xA003,0xA001,0x6042,0xA002,0x6137,0xA002,0x60FB,0x61E8,0xA006,0xA002,0x615F,0xA002,0x6021, 0x61CC,0xA002,0x600A,0xA002,0x602B,0x6029,0xA00A,0xA004,0xA002,0x600D,0x600F,0xA002,0x601B,0xA002,0x6026,0x6035, 0xA006,0xA002,0x6019,0xA002,0x5FF8,0x5FED,0xA002,0x5FEA,0xA002,0x6134,0x60B5,0xA02A,0xA014,0xA00A,0xA004,0xA002, 0x613E,0x5FE4,0xA002,0x5FE1,0xA002,0x616A,0x5FEE,0xA004,0xA002,0x61AE,0x61FA,0xA002,0x5FD6,0xA002,0x5FC9,0x5FC4, 0xA00A,0xA004,0xA002,0x81BA,0x5EEA,0xA002,0x5EE8,0xA002,0x5EDB,0x5ED1,0xA006,0xA002,0x5ED2,0xA002,0x8D53,0x5EB3, 0xA002,0x5EBE,0xA002,0x83F4,0x5EB9,0xA016,0xA00A,0xA004,0xA002,0x5EA0,0x5EA5,0xA002,0x70F0,0xA002,0x5EAA,0x5EE1, 0xA006,0xA002,0x5E80,0xA002,0x9995,0x9994,0xA002,0x9993,0xA002,0x9991,0x9990,0xA00A,0xA004,0xA002,0x998D,0x998A, 0xA002,0x9987,0xA002,0x9984,0x9980,0xA006,0xA002,0x997D,0xA002,0x9977,0x9974,0xA002,0x996C,0xA002,0x996B,0x996A, 0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9969,0x9968,0xA002,0x9967,0xA002,0x9963,0x5902,0xA004,0xA002,0x5924, 0x98E7,0xA002,0x5925,0xA002,0x821B,0x8C86,0xA00A,0xA004,0xA002,0x736F,0x89DF,0xA002,0x7360,0xA002,0x7357,0x734D, 0xA006,0xA002,0x7350,0xA002,0x7331,0x7338,0xA002,0x732C,0xA002,0x7325,0x7339,0xA000,0xA00A,0xA004,0xA002,0x7322, 0x737C,0xA002,0x731D,0xA002,0x731E,0x730A,0xA006,0xA002,0x7380,0xA002,0x7313,0x7317,0xA000,0x72FB,0xA856,0xA3CC, 0xA21E,0xA0C4,0xA089,0xA001,0xA033,0xA008,0xA001,0xA001,0xA001,0xA001,0xA002,0x72FA,0x736B,0xA016,0xA00A,0xA004, 0xA002,0x72F3,0x7301,0xA002,0x72F7,0xA002,0x72F4,0x733B,0xA006,0xA002,0x72E9,0xA002,0x736A,0x72E8,0xA002,0x72D2, 0xA002,0x72CD,0x72CE,0xA00A,0xA004,0xA002,0x72C1,0x72C3,0xA002,0x72B8,0xA002,0x7377,0x72B4,0xA006,0xA002,0x72B0, 0xA002,0x72AD,0x5F61,0xA002,0x8862,0xA000,0x5FBC,0xA029,0xA013,0xA00A,0xA004,0xA002,0x5FAD,0x5FA8,0xA002,0x5F9C, 0xA002,0x5F99,0x5FA0,0xA003,0xA001,0x5F89,0xA002,0x5F87,0xA002,0x5F82,0x5F77,0xA00A,0xA004,0xA002,0x5F73,0x5DD4, 0xA002,0x5DB7,0xA002,0x8C73,0x5D9D,0xA006,0xA002,0x5D99,0xA002,0x5D82,0x5D74,0xA002,0x5D69,0xA002,0x5D4A,0x5D4B, 0xA016,0xA00A,0xA004,0xA002,0x5D6B,0x5D81,0xA002,0x5D6F,0xA002,0x5D5B,0x5D6C,0xA006,0xA002,0x5D3D,0xA002,0x5D34, 0x5D3E,0xA002,0x5DB8,0xA002,0x5D1B,0x5D06,0xA00A,0xA004,0xA002,0x5D1E,0x5D24,0xA002,0x5D2E,0xA002,0x5D26,0x5D27, 0xA006,0xA002,0x5D0D,0xA002,0x5D97,0x5D22,0xA002,0x5CCB,0xA002,0x5DA0,0x5CD2,0xA000,0xA000,0xA02A,0xA014,0xA00A, 0xA004,0xA002,0x5DA7,0x5CB7,0xA002,0x5CC1,0xA002,0x5CA3,0x5CB1,0xA004,0xA002,0x5CAB,0x5CAC,0xA002,0x5CBD,0xA002, 0x5CA2,0x5CB5,0xA00A,0xA004,0xA002,0x5C9C,0x5D50,0xA002,0x5C91,0xA002,0x5DB4,0x5CF4,0xA006,0xA002,0x5C88,0xA002, 0x5D87,0x5C90,0xA002,0x6C67,0xA002,0x5C7A,0x5C8C,0xA000,0xA00A,0xA004,0xA002,0x5E61,0x5E5E,0xA002,0x5E5B,0xA002, 0x5E54,0x5E44,0xA000,0xA000,0x5E37,0xA0C2,0xA08E,0xA038,0xA00D,0xA001,0xA001,0xA005,0xA001,0xA002,0x5E57,0x5E58, 0xA002,0x5E6C,0xA002,0x5E11,0x5E14,0xA016,0xA00A,0xA004,0xA002,0x889F,0x5E43,0xA002,0x571C,0xA002,0x5709,0x570A, 0xA006,0xA002,0x5704,0xA002,0x56FF,0x56F9,0xA002,0x56EB,0xA002,0x5707,0x56E1,0xA009,0xA003,0xA000,0x56DD,0xA002, 0x56D4,0xA002,0x56AF,0x5693,0xA006,0xA002,0x5685,0xA002,0x567C,0x567B,0xA002,0x566B,0xA002,0x5671,0x5664,0xA02A, 0xA014,0xA00A,0xA004,0xA002,0x5686,0x5654,0xA002,0x564C,0xA002,0x5695,0x5659,0xA004,0xA002,0x5662,0x564D,0xA002, 0x562C,0xA002,0x5657,0x5639,0xA00A,0xA004,0xA002,0x5658,0x562D,0xA002,0x5627,0xA002,0x5600,0x55FE,0xA006,0xA002, 0x5623,0xA002,0x56B6,0x5601,0xA002,0x560C,0xA002,0x5608,0x561E,0xA016,0xA00A,0xA004,0xA002,0x8F94,0x55E4,0xA002, 0x55F5,0xA002,0x55E8,0x6B36,0xA006,0xA002,0x55CC,0xA002,0x566F,0x55F2,0xA002,0x6EDC,0xA002,0x55EF,0x55C4,0xA00A, 0xA004,0xA002,0x55DD,0x55E6,0xA002,0x55D4,0xA002,0x55EC,0x56C1,0xA006,0xA002,0x55D1,0xA002,0x561F,0x8186,0xA002, 0x55F7,0xA002,0x55EA,0x5599,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5594,0x56B3,0xA002,0x560D,0xA002,0x55DF, 0x557B,0xA004,0xA002,0x7616,0x55D6,0xA002,0x557E,0xA002,0x5633,0x5581,0xA00A,0xA004,0xA002,0x5588,0x55B9,0xA002, 0x55B1,0xA002,0x5583,0x55D2,0xA006,0xA002,0x558B,0xA002,0x555C,0x5530,0xA002,0x5533,0xA002,0x5577,0x5576,0xA000, 0xA000,0xA004,0xA002,0x5575,0x5557,0xA000,0x5537,0xA001,0xA03F,0xA013,0xA001,0xA006,0xA001,0xA001,0xA002,0x553C, 0x5550,0xA006,0xA002,0x553F,0xA002,0x5555,0x5541,0xA002,0x56C0,0xA002,0x5549,0x55B5,0xA016,0xA00A,0xA004,0xA002, 0x558F,0x5616,0xA002,0x552A,0xA002,0x5527,0x5511,0xA006,0xA002,0x550F,0xA002,0x5523,0x55E9,0xA002,0x54F3,0xA002, 0x5514,0x54FD,0xA00A,0xA004,0xA002,0x562E,0x54E7,0xA002,0x561C,0xA002,0x54DE,0x54CF,0xA006,0xA002,0x5665,0xA002, 0x54A4,0x54AA,0xA002,0x54A9,0xA002,0x54DC,0x54DA,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x5672,0x54CC,0xA002,0x54BF, 0xA002,0x54BB,0x715F,0xA006,0xA002,0x54A3,0xA002,0x5472,0x55F6,0xA002,0x5635,0xA002,0x54A6,0x54A7,0xA00A,0xA004, 0xA002,0x5660,0x54B4,0xA002,0x54C2,0xA002,0x54AD,0x54D0,0xA006,0xA002,0x549D,0xA002,0x5466,0x5476,0xA002,0x5484, 0xA002,0x5680,0x549A,0xA016,0xA00A,0xA004,0xA002,0x5464,0x5471,0xA002,0x5477,0xA002,0x5494,0x5482,0xA006,0xA002, 0x5432,0xA002,0x5423,0x54BC,0xA002,0x5504,0xA002,0x5421,0x5443,0xA00A,0xA004,0xA002,0x56A6,0x5454,0xA002,0x56C8, 0xA002,0x5638,0x544B,0xA006,0xA002,0x5406,0xA002,0x5416,0x5412,0xA002,0x53FB,0xA002,0x53E8,0x53E9,0xA0EA,0xA02A, 0xA000,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x5630,0x53F1,0xA002,0x535F,0xA002,0x5F12,0x7519,0xA004,0xA002, 0x8CA3,0x5F0B,0xA002,0x652E,0xA002,0x6525,0x6509,0xA00A,0xA004,0xA002,0x64E2,0x64E4,0xA002,0x64D7,0xA002,0x64D0, 0x64C0,0xA006,0xA002,0x651B,0xA002,0x6499,0x64FC,0xA000,0x64F7,0xA099,0xA043,0xA017,0xA001,0xA00A,0xA004,0xA002, 0x6496,0x646D,0xA002,0x6516,0xA002,0x645E,0x6421,0xA006,0xA002,0x6426,0xA002,0x640C,0x6420,0xA002,0x641B,0xA002, 0x640B,0x6441,0xA016,0xA00A,0xA004,0xA002,0x6504,0x63BE,0xA002,0x63C6,0xA002,0x6452,0x63CE,0xA006,0xA002,0x63DE, 0xA002,0x63C4,0x64B3,0xA002,0x63E0,0xA002,0x63F8,0x63F2,0xA00A,0xA004,0xA002,0x645C,0x63F5,0xA002,0x6369,0xA002, 0x638A,0x63AC,0xA006,0xA002,0x636D,0xA002,0x6451,0x638E,0xA002,0x637A,0xA002,0x6371,0x63F6,0xA02A,0xA014,0xA00A, 0xA004,0xA002,0x63AD,0x6343,0xA002,0x634B,0xA002,0x6339,0x62F6,0xA004,0xA002,0x649F,0x62EE,0xA002,0x62D7,0xA002, 0x62DA,0x62CA,0xA00A,0xA004,0xA002,0x6375,0x6476,0xA002,0x636B,0xA002,0x624C,0x5C37,0xA006,0xA002,0x5C2C,0xA002, 0x5C25,0x5C22,0xA002,0x530F,0xA002,0x5958,0x595A,0xA016,0xA00A,0xA004,0xA002,0x5955,0x8037,0xA002,0x5969,0xA002, 0x593C,0x5F08,0xA006,0xA002,0x5EFE,0xA002,0x863C,0x8616,0xA002,0x8629,0xA002,0x8605,0x8627,0xA00A,0xA004,0xA002, 0x85FF,0x85DC,0xA002,0x85C1,0xA002,0x861A,0x85B0,0xA006,0xA002,0x85B7,0xA002,0x85B9,0x8585,0xA002,0x859C,0xA002, 0x85EA,0x8579,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x858F,0x8587,0xA002,0x85A8,0xA002,0x85A4,0x857B,0xA004, 0xA002,0x8604,0x8543,0xA002,0x77A2,0xA002,0x857A,0x855E,0xA00A,0xA004,0xA002,0x8564,0x8568,0xA002,0x8548,0xA002, 0x8559,0x911D,0xA000,0xA002,0x84FF,0xA002,0x853B,0x8556,0xA0A3,0xA001,0xA04A,0xA01E,0xA008,0xA001,0xA001,0xA002, 0x85FA,0xA002,0x851F,0x861E,0xA00A,0xA004,0xA002,0x84F0,0x8538,0xA002,0x750D,0xA002,0x850C,0x8577,0xA006,0xA002, 0x84E5,0xA002,0x8497,0x84B4,0xA002,0x84B9,0xA002,0x84A1,0x863A,0xA016,0xA00A,0xA004,0xA002,0x84BA,0x84BF,0xA002, 0x84CA,0xA002,0x84D3,0x84BD,0xA006,0xA002,0x9A40,0xA002,0x84D0,0x84CD,0xA002,0x84C1,0xA002,0x846D,0x8432,0xA00A, 0xA004,0xA002,0x848E,0x851E,0xA002,0x8476,0xA002,0x8469,0x8446,0xA006,0xA002,0x843C,0xA002,0x8478,0x8562,0xA002, 0x847A,0xA002,0x8488,0x8546,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x8473,0x8459,0xA002,0x845A,0xA002,0x8451,0x845C, 0xA006,0xA002,0x83E1,0xA002,0x83F0,0x8426,0xA002,0x83C0,0xA002,0x83C5,0x83EA,0xA00A,0xA004,0xA002,0x8445,0x83F8, 0xA002,0x8403,0xA002,0x840F,0x83DF,0xA006,0xA002,0x8409,0xA002,0x8406,0x96C8,0xA002,0x8438,0xA002,0x841C,0x83D6, 0xA016,0xA00A,0xA004,0xA002,0x83FD,0x83DD,0xA002,0x840B,0xA002,0x8418,0x5807,0xA006,0xA002,0x83D8,0xA002,0x83E5, 0x8401,0xA002,0x83C1,0xA002,0x83BC,0x9DAF,0xA00A,0xA004,0xA002,0x83A8,0x839E,0xA002,0x8398,0xA002,0x837B,0x8555, 0xA006,0xA002,0x8470,0xA002,0x83A9,0x859F,0xA002,0x837C,0xA002,0x849E,0x839C,0xA000,0xA000,0xA000,0xA014,0xA00A, 0xA004,0xA002,0x8393,0x83AA,0xA002,0x83A0,0xA002,0x8435,0x8494,0xA004,0xA002,0x8378,0x83B0,0xA002,0x836E,0xA002, 0x8452,0x84C0,0xA000,0xA004,0xA002,0x836C,0x85CE,0xA002,0x831B,0xA000,0x8541,0xA24A,0xA171,0xA0C3,0xA0A8,0xA052, 0xA026,0xA010,0xA006,0xA001,0xA001,0xA002,0x8365,0x8366,0xA004,0xA002,0x8333,0x833A,0xA002,0x832D,0xA002,0x85BA, 0x8317,0xA00A,0xA004,0xA002,0x8340,0x8588,0xA002,0x8343,0xA002,0x8347,0x834F,0xA006,0xA002,0x832F,0xA002,0x854E, 0x839B,0xA002,0x8331,0xA002,0x8334,0x833C,0xA016,0xA00A,0xA004,0xA002,0x8392,0x8308,0xA002,0x84FD,0xA002,0x8558, 0x8351,0xA006,0xA002,0x84A8,0xA002,0x82D5,0x82E0,0xA002,0x8315,0xA002,0x8314,0x8306,0xA00A,0xA004,0xA002,0x831A, 0x8526,0xA002,0x82D3,0xA002,0x82FB,0x830C,0xA006,0xA002,0x82D8,0xA002,0x82D2,0x82F4,0xA002,0x82DC,0xA002,0x8307, 0x8622,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x82E4,0x82F7,0xA002,0x8309,0xA002,0x82E1,0x82A4,0xA004,0xA002,0x82E7, 0x82C4,0xA002,0x829F,0xA002,0x82AA,0x82A1,0xA00A,0xA004,0xA002,0x82B4,0x82A9,0xA002,0x84EF,0xA002,0x8407,0x83A7, 0xA006,0xA002,0x82AE,0xA002,0x82B7,0x8298,0xA002,0x82E3,0xA002,0x82CA,0x85F6,0xA016,0xA00A,0xA004,0xA002,0x82B0, 0x82BE,0xA002,0x8553,0xA002,0x82AB,0x8299,0xA006,0xA002,0x858C,0xA002,0x8291,0x828E,0xA002,0x8284,0xA002,0x82A8, 0x828A,0xA00A,0xA004,0xA002,0x828F,0x827F,0xA002,0x827D,0xA002,0x8279,0x61FF,0xA006,0xA002,0x9F19,0xA002,0x99A8, 0x5880,0xA002,0x589A,0xA002,0x5889,0x5881,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x586C,0x5865,0xA002,0x5820, 0xA002,0x5844,0x5819,0xA004,0xA002,0x581E,0x5800,0xA002,0x57ED,0xA002,0x57FD,0x580D,0xA000,0xA000,0xA000,0x5874, 0xA001,0xA055,0xA029,0xA013,0xA009,0xA003,0xA001,0x57DD,0xA002,0x57E4,0xA002,0x57F8,0x57EF,0xA004,0xA002,0x57F4, 0x57B8,0xA002,0x57D2,0xA002,0x58CE,0x581D,0xA00A,0xA004,0xA002,0x5852,0x57D5,0xA002,0x57A0,0xA002,0x5793,0x57B4, 0xA006,0xA002,0x57A7,0xA002,0x57CF,0x584F,0xA002,0x578C,0xA002,0x57A4,0x57E1,0xA016,0xA00A,0xA004,0xA002,0x5773, 0x5776,0xA002,0x576D,0xA002,0x5768,0x963A,0xA006,0xA002,0x577C,0xA002,0x58DA,0x576B,0xA002,0x5785,0xA002,0x5769, 0x5742,0xA00A,0xA004,0xA002,0x573B,0x58E2,0xA002,0x572F,0xA002,0x572E,0x58D9,0xA006,0xA002,0x5733,0xA002,0x572A, 0x572C,0xA002,0x5729,0xA002,0x58D1,0x58C5,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x58BC,0x587E,0xA002,0x57A1,0xA002, 0x580A,0x574C,0xA006,0xA002,0x5DF0,0xA002,0x755A,0x5F01,0xA002,0x53B6,0xA002,0x9B2F,0x51FC,0xA00A,0xA004,0xA002, 0x51F5,0x5EF4,0xA002,0x77CD,0xA002,0x71EE,0x53DF,0xA006,0xA002,0x52F0,0xA002,0x52D7,0x52D0,0xA002,0x54FF,0xA002, 0x52BE,0x52AD,0xA016,0xA00A,0xA004,0xA002,0x52AC,0x52F1,0xA002,0x5950,0xA002,0x82BB,0x9146,0xA006,0xA002,0x9143, 0xA002,0x9139,0x912F,0xA002,0x9131,0xA002,0x9123,0x911E,0xA00A,0xA004,0xA002,0x9122,0x9104,0xA002,0x90FE,0xA002, 0x90EF,0x90EB,0xA006,0xA002,0x90DB,0xA002,0x90D7,0x90DC,0xA002,0x90E2,0xA002,0x9148,0x9106,0xA01F,0xA014,0xA000, 0xA000,0xA000,0xA00A,0xA004,0xA002,0x90C7,0x90C4,0xA002,0x9136,0xA002,0x90BE,0x90C5,0xA004,0xA002,0x90DF,0x90B0, 0xA000,0x90B8,0xA001,0xA001,0xA001,0xA001,0xA001,0xA002,0x9134,0xA002,0x90B6,0x90B3,0xA0AC,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x90B4,0x90A1,0xA002,0x9114,0xA002,0x9099,0x913A,0xA004,0xA002,0x909B,0x9097,0xA002,0x96B0, 0xA002,0x9697,0x968D,0xA00A,0xA004,0xA002,0x9688,0x9674,0xA002,0x9672,0xA002,0x966C,0x9689,0xA006,0xA002,0x965F, 0xA002,0x9654,0x9658,0xA002,0x9642,0xA002,0x963C,0x963D,0xA016,0xA00A,0xA004,0xA002,0x962A,0x9631,0xA002,0x9621, 0xA002,0x9622,0x961D,0xA006,0xA002,0x5DF9,0xA002,0x5369,0x8C36,0xA002,0x8C35,0xA002,0x8C33,0x8C32,0xA00A,0xA004, 0xA002,0x8C2F,0x8C2E,0xA002,0x8C2B,0xA002,0x8C2A,0x8C27,0xA006,0xA002,0x8C25,0xA002,0x8C21,0x8C20,0xA002,0x8C1F, 0xA002,0x8C1D,0x8C18,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8C1B,0x8C19,0xA002,0x8C16,0xA002,0x8C15,0x8C14,0xA004, 0xA002,0x8C12,0x8C11,0xA002,0x8C0F,0xA002,0x8C0C,0x8C07,0xA00A,0xA004,0xA002,0x8C04,0x8C02,0xA002,0x8C00,0xA002, 0x8BFF,0x8BFC,0xA006,0xA002,0x8BF9,0xA002,0x8BF6,0x8BF3,0xA002,0x8BF0,0xA002,0x8BEE,0x8BE9,0xA016,0xA00A,0xA004, 0xA002,0x8BE8,0x8BE4,0xA002,0x8BE0,0xA002,0x8BDF,0x8BDC,0xA006,0xA002,0x8BD9,0xA002,0x8BD8,0x8BD6,0xA002,0x8BD4, 0xA002,0x8BD3,0x8BD2,0xA00A,0xA004,0xA002,0x8BCE,0x8BCF,0xA002,0x8BCB,0xA002,0x8BC3,0x8BC2,0xA006,0xA002,0x8BB7, 0xA002,0x8BB5,0x8BB4,0xA002,0x8BAA,0xA002,0x8BA7,0x8BA6,0xA000,0xA000,0xA000,0xA000,0xA004,0xA002,0x8BA0,0x51A5, 0xA002,0x585A,0xA002,0x5196,0x51C7,0xA0DA,0xA0BB,0xA010,0xA001,0xA001,0xA001,0xA001,0xA006,0xA002,0x51BC,0xA002, 0x51BD,0x6C8D,0xA002,0x51AB,0xA002,0x7FB8,0x8803,0xA055,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5B34,0x7A1F,0xA002, 0x88D2,0xA002,0x81E0,0x893B,0xA004,0xA002,0x88A4,0x88F7,0xA002,0x4EB3,0xA002,0x6C87,0x4EA0,0xA00A,0xA004,0xA002, 0x5155,0x5919,0xA002,0x9CE7,0xA002,0x5310,0x8A07,0xA006,0xA002,0x530D,0xA002,0x52F9,0x5914,0xA002,0x5181,0xA002, 0x9998,0x9ECC,0xA015,0xA009,0xA004,0xA002,0x5DFD,0x516E,0xA002,0x7CF4,0xA001,0x9FA0,0xA006,0xA002,0x67E4,0xA002, 0x50C9,0x4F58,0xA002,0x6C46,0xA002,0x4EDD,0x510B,0xA00A,0xA004,0xA002,0x5107,0x50EE,0xA002,0x50E6,0xA002,0x50EC, 0x50ED,0xA006,0xA002,0x5106,0xA002,0x50D6,0x50BA,0xA002,0x513A,0xA002,0x5110,0x513B,0xA02A,0xA014,0xA00A,0xA004, 0xA002,0x50C2,0x50AF,0xA002,0x504E,0xA002,0x5048,0x5055,0xA004,0xA002,0x533D,0x50E8,0xA002,0x5028,0xA002,0x5025, 0x500C,0xA00A,0xA004,0xA002,0x501C,0x4FFE,0xA002,0x502D,0xA002,0x502E,0x500F,0xA006,0xA002,0x502C,0xA002,0x4FF3, 0x504C,0xA002,0x5029,0xA002,0x4FF8,0x4FDF,0xA016,0xA00A,0xA004,0xA002,0x4FD1,0x4FDC,0xA002,0x4FE3,0xA002,0x4FDA, 0x4FC5,0xA006,0xA002,0x5137,0xA002,0x513C,0x5114,0xA002,0x4F94,0xA002,0x5102,0x4F7C,0xA00A,0xA004,0xA002,0x5115, 0x8A82,0xA002,0x4F7E,0xA002,0x4F8F,0x884E,0xA006,0xA002,0x4F89,0xA002,0x59F7,0x4F74,0xA002,0x4F76,0xA002,0x4F3D, 0x4F32,0xA009,0xA000,0xA000,0xA000,0xA000,0xA000,0xA002,0x4F57,0x4F5F,0xA001,0xA001,0xA001,0xA007,0xA001,0xA002, 0x4F5D,0xA002,0x4F5A,0x6538,0xA006,0xA002,0x4F67,0xA002,0x4F5E,0x4F47,0xA002,0x4F09,0xA002,0x5096,0x5000,0xA0AC, 0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x4EF5,0x4F64,0xA002,0x4F22,0xA002,0x4EF3,0x50B4,0xA004,0xA002, 0x4EDE,0x4EEB,0xA002,0x4EE1,0xA002,0x4EE8,0x961E,0xA00A,0xA004,0xA002,0x4EC9,0x4EC3,0xA002,0x4EBB,0xA002,0x7F54, 0x5182,0xA006,0xA002,0x5293,0xA002,0x5290,0x5281,0xA002,0x5282,0xA002,0x527D,0x84AF,0xA016,0xA00A,0xA004,0xA002, 0x525C,0x639E,0xA002,0x525E,0xA002,0x524C,0x5274,0xA006,0xA002,0x528C,0xA002,0x5233,0x5244,0xA002,0x520E,0xA002, 0x5208,0x5202,0xA00A,0xA004,0xA002,0x5363,0x5366,0xA002,0x8D5C,0xA002,0x533E,0x5331,0xA006,0xA002,0x532D,0xA002, 0x53F5,0x531A,0xA002,0x8D5D,0xA002,0x9768,0x5EDD,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x53A5,0x53B4,0xA002,0x539D, 0xA002,0x5399,0x4EC4,0xA004,0xA002,0x560F,0x55C7,0xA002,0x5B5B,0xA002,0x8288,0x4E93,0xA00A,0xA004,0xA002,0x4E69, 0x4E5C,0xA002,0x9F10,0xA002,0x4E9F,0x4E36,0xA006,0xA002,0x9F17,0xA002,0x777E,0x6BD3,0xA002,0x9997,0xA002,0x80E4, 0x56DF,0xA016,0xA00A,0xA004,0xA002,0x6C10,0x536E,0xA002,0x723B,0xA002,0x6B80,0x4E47,0xA006,0xA002,0x5315,0xA002, 0x4E3F,0x79BA,0xA002,0x4E28,0xA002,0x5669,0x5B6C,0xA00A,0xA004,0xA002,0x9B32,0x4E1E,0xA002,0x4E99,0xA002,0x4E15, 0x5345,0xA006,0xA002,0x5EFF,0xA002,0x4E10,0xFA0C,0xA002,0x4E0C,0xA000,0x4E8D,0xA014,0xA001,0xA001,0xA001,0xA005, 0xA001,0xA001,0xA001,0x5EA7,0xA006,0xA002,0x5750,0xA002,0x4F5C,0x505A,0xA002,0x67DE,0xA002,0x4F50,0x5DE6,0xA056, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6628,0x9075,0xA002,0x5C0A,0xA002,0x7F6A,0x6700,0xA004,0xA002,0x9189,0x5634, 0xA002,0x7E82,0xA002,0x94BB,0x7EC4,0xA00A,0xA004,0xA002,0x963B,0x8BC5,0xA002,0x7956,0xA002,0x65CF,0x5352,0xA006, 0xA002,0x8DB3,0xA002,0x79DF,0x63CD,0xA002,0x594F,0xA002,0x8D70,0x9112,0xA016,0xA00A,0xA004,0xA002,0x7EB5,0x7E3D, 0xA002,0x7EFC,0xA002,0x5B97,0x8E64,0xA006,0xA002,0x68D5,0xA002,0x9B03,0x5B57,0xA002,0x6F2C,0xA002,0x81EA,0x5B50, 0xA00A,0xA004,0xA002,0x6ED3,0x7C7D,0xA002,0x4ED4,0xA002,0x7D2B,0x5B5C,0xA006,0xA002,0x6DC4,0xA002,0x6ECB,0x59FF, 0xA002,0x8D44,0xA002,0x54A8,0x8332,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x6FC1,0x707C,0xA002,0x8457,0xA002,0x5545, 0x914C,0xA006,0xA002,0x8301,0xA002,0x7422,0x684C,0xA002,0x5353,0xA002,0x62D9,0x6349,0xA00A,0xA004,0xA002,0x7DA7, 0x8C06,0xA002,0x7F00,0xA002,0x589C,0x8D58,0xA006,0xA002,0x8FFD,0xA002,0x9525,0x690E,0xA002,0x72C0,0xA002,0x58EF, 0x649E,0xA016,0xA00A,0xA004,0xA002,0x599D,0x88DD,0xA002,0x838A,0xA002,0x6A01,0x7BC6,0xA006,0xA002,0x8D5A,0xA002, 0x64B0,0x8F6C,0xA002,0x78DA,0xA002,0x8011,0x62FD,0xA00A,0xA004,0xA002,0x722A,0x6293,0xA002,0x9A7B,0xA002,0x795D, 0x9252,0xA000,0xA000,0x4F4F,0xA3CF,0xA1B5,0xA0C4,0xA023,0xA001,0xA001,0xA001,0xA00B,0xA001,0xA004,0xA001,0xA001, 0x7BC9,0xA002,0x94F8,0xA002,0x8D2E,0x86C0,0xA009,0xA004,0xA002,0x52A9,0x67F1,0xA001,0xA002,0x4E3B,0x56D1,0xA006, 0xA002,0x77DA,0xA002,0x62C4,0x716E,0xA002,0x71ED,0xA002,0x7AF9,0x9010,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004, 0xA002,0x8BDB,0x8BF8,0xA002,0x8C6C,0xA002,0x7843,0x86DB,0xA004,0xA002,0x682A,0x73E0,0xA002,0x9AA4,0xA002,0x665D, 0x5B99,0xA00A,0xA004,0xA002,0x76BA,0x5492,0xA002,0x5E1A,0xA002,0x8098,0x8F74,0xA006,0xA002,0x7CA5,0xA002,0x8BCC, 0x6D32,0xA002,0x5DDE,0xA002,0x9031,0x821F,0xA016,0xA00A,0xA004,0xA002,0x773E,0x4EF2,0xA002,0x91CD,0xA002,0x816B, 0x7A2E,0xA006,0xA002,0x7EC8,0xA002,0x8877,0x949F,0xA002,0x5FE0,0xA002,0x76C5,0x4E2D,0xA00A,0xA004,0xA002,0x7A92, 0x6CBB,0xA002,0x6EEF,0xA002,0x75D4,0x7099,0xA006,0xA002,0x8D28,0xA002,0x7A1A,0x79E9,0xA002,0x667A,0xA002,0x88FD, 0x5EA4,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5E5F,0x7F6E,0xA002,0x81F4,0xA002,0x81F3,0x64F2,0xA004,0xA002,0x646F, 0x8A8C,0xA002,0x7EB8,0xA002,0x65E8,0x96BB,0xA00A,0xA004,0xA002,0x8DBE,0x6B62,0xA002,0x6307,0xA002,0x962F,0x59EA, 0xA006,0xA002,0x503C,0xA002,0x6267,0x6B96,0xA002,0x690D,0xA002,0x76F4,0x8077,0xA016,0xA00A,0xA004,0xA002,0x7EC7, 0x4E4B,0xA002,0x6C41,0xA002,0x8102,0x80D1,0xA006,0xA002,0x77E5,0xA002,0x8718,0x5431,0xA002,0x652F,0xA002,0x679D, 0x829D,0xA000,0xA004,0xA002,0x8BC1,0x912D,0xA002,0x7665,0xA000,0x5E40,0xA0C2,0xA029,0xA001,0xA001,0xA011,0xA005, 0xA001,0xA001,0xA001,0x653F,0xA006,0xA002,0x6B63,0xA002,0x649C,0x6574,0xA002,0x6014,0xA002,0x722D,0x7319,0xA00A, 0xA004,0xA002,0x5FB5,0x775C,0xA002,0x6399,0xA002,0x84B8,0x9663,0xA006,0xA002,0x9547,0xA002,0x632F,0x9707,0xA002, 0x8BCA,0xA002,0x75B9,0x6795,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9049,0x9488,0xA002,0x8D1E,0xA002,0x81FB, 0x78AA,0xA004,0xA002,0x7504,0x771F,0xA002,0x659F,0xA002,0x8897,0x6D59,0xA00A,0xA004,0xA002,0x9019,0x8517,0xA002, 0x9517,0xA002,0x8005,0x8F99,0xA006,0xA002,0x87C4,0xA002,0x608A,0x647A,0xA002,0x906E,0xA002,0x53EC,0x8087,0xA016, 0xA00A,0xA004,0xA002,0x5146,0x7F69,0xA002,0x7167,0xA002,0x8D99,0x6CBC,0xA006,0xA002,0x627E,0xA002,0x662D,0x62DB, 0xA002,0x969C,0xA002,0x7634,0x8139,0xA00A,0xA004,0xA002,0x4ED7,0x8D26,0xA002,0x5E33,0xA002,0x4E08,0x6756,0xA006, 0xA002,0x6F32,0xA002,0x638C,0x5F35,0xA002,0x6F33,0xA002,0x5F70,0x7AE0,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x6A1F, 0x7EFD,0xA002,0x6E5B,0xA002,0x7AD9,0x6230,0xA006,0xA002,0x5360,0xA002,0x68E7,0x8638,0xA002,0x5C55,0xA002,0x5D84, 0x8F97,0xA00A,0xA004,0xA002,0x65AC,0x76DE,0xA002,0x9711,0xA002,0x7C98,0x8A79,0xA006,0xA002,0x6C08,0xA002,0x77BB, 0x5BE8,0xA002,0x50B5,0xA002,0x7A84,0x5B85,0xA000,0xA00A,0xA004,0xA002,0x9F4B,0x6458,0xA002,0x8BC8,0xA002,0x7160, 0x4E4D,0xA006,0xA002,0x548B,0xA002,0x69A8,0x6805,0xA002,0x7728,0xA002,0x95F8,0x94E1,0xA001,0xA001,0xA001,0xA016, 0xA00A,0xA004,0xA002,0x8F67,0x672D,0xA002,0x6E23,0xA002,0x55B3,0x7D2E,0xA006,0xA002,0x8D60,0xA002,0x66FE,0x618E, 0xA002,0x589E,0xA002,0x600E,0x8D3C,0xA00A,0xA004,0xA002,0x6FA4,0x5247,0xA002,0x64C7,0xA002,0x8D23,0x71E5,0xA006, 0xA002,0x7076,0xA002,0x7682,0x9020,0xA002,0x8B5F,0xA002,0x8E81,0x86A4,0xA156,0xA093,0xA000,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x6FA1,0x65E9,0xA002,0x68D7,0xA002,0x85FB,0x947F,0xA004,0xA002,0x7CDF,0x906D,0xA002,0x846C, 0xA002,0x9AD2,0x8D43,0xA00A,0xA004,0xA002,0x8D5E,0x66AB,0xA002,0x6522,0xA002,0x5592,0x5728,0xA006,0xA002,0x518D, 0xA002,0x8F7D,0x5BB0,0xA002,0x83D1,0xA002,0x54C9,0x683D,0xA016,0xA00A,0xA004,0xA002,0x96DC,0x7838,0xA002,0x531D, 0xA002,0x5B55,0x97FB,0xA006,0xA002,0x6688,0xA002,0x919E,0x860A,0xA002,0x904B,0xA002,0x5141,0x9695,0xA00A,0xA004, 0xA002,0x5300,0x9116,0xA002,0x96F2,0xA002,0x8018,0x9605,0xA006,0xA002,0x60A6,0xA002,0x6708,0x7CB5,0xA002,0x5DBD, 0xA002,0x94A5,0x8E8D,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8D8A,0x7EA6,0xA002,0x66F0,0xA002,0x9662,0x6028,0xA004, 0xA002,0x9858,0x82D1,0xA002,0x9060,0xA002,0x7F18,0x6E90,0xA00A,0xA004,0xA002,0x733F,0x5713,0xA002,0x54E1,0xA002, 0x5712,0x8F95,0xA006,0xA002,0x63F4,0xA002,0x539F,0x8881,0xA002,0x57A3,0xA002,0x5143,0x51A4,0xA000,0xA00A,0xA004, 0xA002,0x6E0A,0x9E33,0xA002,0x9A6D,0xA002,0x8C6B,0x9884,0xA000,0xA002,0x88D5,0xA002,0x5BD3,0x6D74,0xA035,0xA001, 0xA008,0xA001,0xA001,0xA001,0xA001,0xA002,0x8B7D,0x80B2,0xA016,0xA00A,0xA004,0xA002,0x7344,0x6B32,0xA002,0x7652, 0xA002,0x79A6,0x5CEA,0xA006,0xA002,0x55BB,0xA002,0x9047,0x7C72,0xA002,0x9B31,0xA002,0x828B,0x57DF,0xA00A,0xA004, 0xA002,0x7389,0x7FBD,0xA002,0x8BED,0xA002,0x5B87,0x79B9,0xA006,0xA002,0x5DBC,0xA002,0x8207,0x96E8,0xA002,0x5A31, 0xA002,0x4E88,0x9685,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6F01,0x6E1D,0xA002,0x6B48,0xA002,0x9C7C,0x903E, 0xA004,0xA002,0x4FDE,0x9918,0xA002,0x8F3F,0xA002,0x611A,0x865E,0xA00A,0xA004,0xA002,0x6986,0x76C2,0xA002,0x9098, 0xA002,0x6DE4,0x8FC2,0xA006,0xA002,0x5E7C,0xA002,0x53C8,0x8BF1,0xA002,0x91C9,0xA002,0x4F51,0x53F3,0xA016,0xA00A, 0xA004,0xA002,0x53CB,0x6709,0xA002,0x9149,0xA002,0x904A,0x6CB9,0xA006,0xA002,0x7336,0xA002,0x94C0,0x90F5,0xA002, 0x900C,0xA002,0x8A27,0x6182,0xA00A,0xA004,0xA002,0x60A0,0x512A,0xA002,0x5E7D,0xA002,0x7528,0x52C7,0xA006,0xA002, 0x607F,0xA002,0x6C38,0x6E67,0xA002,0x6CF3,0xA002,0x8A60,0x86F9,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x8E34,0x96CD, 0xA002,0x5EB8,0xA002,0x7670,0x81C3,0xA006,0xA002,0x50AD,0xA002,0x64C1,0x55B2,0xA002,0x6620,0xA002,0x786C,0x9896, 0xA00A,0xA004,0xA002,0x5F71,0x76C8,0xA002,0x8D62,0xA002,0x8FCE,0x8805,0xA006,0xA002,0x8367,0xA002,0x8425,0x87A2, 0xA002,0x83B9,0xA002,0x7F28,0x61C9,0xA000,0xA000,0xA004,0xA002,0x9E70,0x5B30,0xA002,0x6AFB,0xA002,0x82F1,0x5370, 0xA03C,0xA001,0xA001,0xA00E,0xA001,0xA001,0xA006,0xA002,0x96B1,0xA002,0x5F15,0x5C39,0xA002,0x996E,0xA002,0x5BC5, 0x6DEB,0xA016,0xA00A,0xA004,0xA002,0x94F6,0x541F,0xA002,0x59FB,0xA002,0x9670,0x97F3,0xA006,0xA002,0x6BB7,0xA002, 0x56E0,0x852D,0xA002,0x88C0,0xA002,0x7ECE,0x7FCC,0xA00A,0xA004,0xA002,0x7FFC,0x7570,0xA002,0x8BD1,0xA002,0x8C0A, 0x8BAE,0xA006,0xA002,0x8BE3,0xA002,0x6EA2,0x76CA,0xA002,0x7FA9,0xA002,0x61B6,0x6BC5,0xA000,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x610F,0x88D4,0xA002,0x4EA6,0xA002,0x75AB,0x8084,0xA004,0xA002,0x9038,0x81C6,0xA002,0x5F79, 0xA002,0x5104,0x5C79,0xA00A,0xA004,0xA002,0x9091,0x6613,0xA002,0x6291,0xA002,0x85DD,0x4EE5,0xA006,0xA002,0x77E3, 0xA002,0x4E59,0x5DF2,0xA002,0x501A,0xA002,0x87FB,0x6905,0xA016,0xA00A,0xA004,0xA002,0x5F5D,0x59E8,0xA002,0x5B9C, 0xA002,0x6C82,0x7591,0xA006,0xA002,0x80F0,0xA002,0x5100,0x8FFB,0xA002,0x907A,0xA002,0x9295,0x9890,0xA00A,0xA004, 0xA002,0x8863,0x4F0A,0xA002,0x4F9D,0xA002,0x94F1,0x63D6,0xA006,0xA002,0x91AB,0xA002,0x58F9,0x4E00,0xA002,0x6DB2, 0xA002,0x591C,0x814B,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x66F3,0x8449,0xA002,0x696D,0xA002,0x6396,0x9875,0xA004, 0xA002,0x4E5F,0x51B6,0xA002,0x91CE,0xA002,0x723A,0x8036,0xA00A,0xA004,0xA002,0x564E,0x6930,0xA002,0x8000,0xA002, 0x8981,0x85E5,0xA006,0xA002,0x8200,0xA002,0x54AC,0x59DA,0xA002,0x8C23,0xA002,0x7AAF,0x9683,0xA000,0xA000,0xA000, 0xA002,0x5C27,0x6447,0xA248,0xA10B,0xA0C1,0xA041,0xA001,0xA014,0xA001,0xA007,0xA001,0xA002,0x7476,0xA002,0x5996, 0x8170,0xA006,0xA002,0x9080,0xA002,0x6F3E,0x6A23,0xA002,0x990A,0xA002,0x7662,0x536C,0xA016,0xA00A,0xA004,0xA002, 0x6C27,0x967D,0xA002,0x6D0B,0xA002,0x7F8A,0x760D,0xA006,0xA002,0x4F6F,0xA002,0x98BA,0x694A,0xA002,0x79E7,0xA002, 0x9E2F,0x9260,0xA00A,0xA004,0xA002,0x6B83,0x9A8C,0xA002,0x8C1A,0xA002,0x5BB4,0x71C4,0xA006,0xA002,0x5F66,0xA002, 0x55AD,0x96C1,0xA002,0x786F,0xA002,0x53AD,0x71D5,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5830,0x8C54,0xA002, 0x6F14,0xA002,0x884D,0x773C,0xA004,0xA002,0x6B97,0x5944,0xA002,0x6CBF,0xA002,0x708E,0x960E,0xA00A,0xA004,0xA002, 0x989C,0x8A00,0xA002,0x5EF6,0xA002,0x789E,0x8712,0xA006,0xA002,0x7814,0xA002,0x56B4,0x9E7D,0xA002,0x6E30,0xA002, 0x7159,0x9609,0xA016,0xA00A,0xA004,0xA002,0x56A5,0x7109,0xA002,0x8BB6,0xA002,0x4E9E,0x555E,0xA006,0xA002,0x96C5, 0xA002,0x6DAF,0x8859,0xA002,0x5D16,0xA002,0x869C,0x7259,0xA00A,0xA004,0xA002,0x82BD,0x4E2B,0xA002,0x5440,0xA002, 0x9E2D,0x9E26,0xA006,0xA002,0x62BC,0xA002,0x58D3,0x8FC5,0xA002,0x905C,0xA002,0x8BAF,0x8BAD,0xA000,0xA014,0xA00A, 0xA004,0xA002,0x6C5B,0x6B89,0xA002,0x5DE1,0xA002,0x9A6F,0x5C0B,0xA004,0xA002,0x8BE2,0x65EC,0xA002,0x7D03,0xA002, 0x71FB,0x52F3,0xA00A,0xA004,0xA002,0x8840,0x96EA,0xA002,0x7A74,0xA002,0x5B78,0x859B,0xA006,0xA002,0x9774,0xA002, 0x7EDA,0x7734,0xA002,0x766C,0xA000,0x9078,0xA001,0xA001,0xA01C,0xA006,0xA001,0xA001,0xA001,0xA001,0x7384,0xA00A, 0xA004,0xA002,0x93C7,0x61F8,0xA002,0x5BA3,0xA002,0x55A7,0x8F69,0xA006,0xA002,0x7EED,0xA002,0x7EEA,0x5A7F,0xA002, 0x7D6E,0xA002,0x6064,0x755C,0xA016,0xA00A,0xA004,0xA002,0x5E8F,0x65ED,0xA002,0x6558,0xA002,0x9157,0x84C4,0xA006, 0xA002,0x8BB8,0xA002,0x5F90,0x9B1A,0xA002,0x5653,0xA002,0x865B,0x9700,0xA00A,0xA004,0xA002,0x620C,0x589F,0xA002, 0x7EE3,0xA002,0x8896,0x79C0,0xA006,0xA002,0x9508,0xA002,0x55C5,0x673D,0xA002,0x7F9E,0xA002,0x8129,0x70CB,0xA07C, 0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x718A,0x96C4,0xA002,0x6D36,0xA002,0x5308,0x80F8,0xA004,0xA002, 0x51F6,0x5144,0xA002,0x59D3,0xA002,0x6027,0x674F,0xA00A,0xA004,0xA002,0x5E78,0x9192,0xA002,0x884C,0xA002,0x90A2, 0x5F62,0xA006,0xA002,0x578B,0xA002,0x5211,0x8208,0xA002,0x60FA,0xA002,0x7329,0x8165,0xA016,0xA00A,0xA004,0xA002, 0x661F,0x91C1,0xA002,0x4FE1,0xA002,0x5FC3,0x5FFB,0xA006,0xA002,0x65B0,0xA002,0x8F9B,0x8A22,0xA002,0x950C,0xA002, 0x82AF,0x85AA,0xA00A,0xA004,0xA002,0x5C51,0x8C22,0xA002,0x7009,0xA002,0x6D29,0x61C8,0xA006,0xA002,0x87F9,0xA002, 0x5378,0x68B0,0xA002,0x5BEB,0xA002,0x8C10,0x8105,0xA000,0xA014,0xA00A,0xA004,0xA002,0x659C,0x90AA,0xA002,0x651C, 0xA002,0x633E,0x5354,0xA004,0xA002,0x978B,0x880D,0xA002,0x6B47,0xA002,0x4E9B,0x69E2,0xA00A,0xA004,0xA002,0x6548, 0x7B11,0xA002,0x562F,0xA002,0x8096,0x6821,0xA000,0xA002,0x5B5D,0xA000,0x5C0F,0xA04C,0xA001,0xA01F,0xA00A,0xA001, 0xA003,0xA001,0x66C9,0xA002,0x6DC6,0xA002,0x5BB5,0x6D88,0xA00A,0xA004,0xA002,0x9500,0x56C2,0xA002,0x54EE,0xA002, 0x524A,0x9704,0xA006,0xA002,0x785D,0xA002,0x856D,0x8C61,0xA002,0x56AE,0xA001,0x6A61,0xA016,0xA00A,0xA004,0xA002, 0x5DF7,0x9879,0xA002,0x4EAB,0xA002,0x97FF,0x60F3,0xA006,0xA002,0x8BE6,0xA002,0x7965,0x7FD4,0xA002,0x9109,0xA002, 0x6E58,0x8944,0xA00A,0xA004,0xA002,0x7BB1,0x9999,0xA002,0x9576,0xA002,0x5EC2,0x76F8,0xA006,0xA002,0x7EBF,0xA002, 0x9650,0x9677,0xA002,0x61B2,0xA002,0x7FA8,0x9985,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x817A,0x7E23,0xA002, 0x737B,0xA002,0x73FE,0x96AA,0xA004,0xA002,0x986F,0x5ACC,0xA002,0x7D43,0xA002,0x6D8E,0x95F2,0xA00A,0xA004,0xA002, 0x8237,0x929C,0xA002,0x8D24,0xA002,0x9E79,0x7EA4,0xA006,0xA002,0x9C9C,0xA002,0x50CA,0x5148,0xA002,0x9528,0xA002, 0x6380,0x5687,0xA016,0xA00A,0xA004,0xA002,0x590F,0x5EC8,0xA002,0x4E0B,0xA002,0x72F9,0x4FE0,0xA006,0xA002,0x5CFD, 0xA002,0x6687,0x8F96,0xA002,0x971E,0xA002,0x5323,0x8766,0xA00A,0xA004,0xA002,0x778E,0x7EC6,0xA002,0x6232,0xA002, 0x9699,0x7E6B,0xA006,0xA002,0x6D17,0xA002,0x94E3,0x559C,0xA002,0x5AB3,0xA002,0x7FD2,0x84C6,0xA000,0xA016,0xA00A, 0xA004,0xA002,0x8972,0x6A84,0xA002,0x7280,0xA002,0x6C50,0x8C3F,0xA006,0xA002,0x70EF,0xA002,0x7184,0x60DC,0xA002, 0x5915,0xA002,0x819D,0x6089,0xA000,0xA004,0xA002,0x5E0C,0x910E,0xA000,0x7A00,0xA0C5,0xA054,0xA001,0xA001,0xA026, 0xA010,0xA006,0xA001,0xA001,0xA002,0x72A7,0x9521,0xA004,0xA002,0x5438,0x8B46,0xA002,0x7699,0xA002,0x77FD,0x7852, 0xA00A,0xA004,0xA002,0x897F,0x6790,0xA002,0x7199,0xA002,0x6614,0x8BEF,0xA006,0xA002,0x609F,0xA002,0x52D9,0x52FF, 0xA002,0x7269,0xA002,0x6664,0x9727,0xA016,0xA00A,0xA004,0xA002,0x620A,0x5862,0xA002,0x4FAE,0xA002,0x4F0D,0x821E, 0xA006,0xA002,0x5348,0xA002,0x6342,0x4E94,0xA002,0x6B66,0xA002,0x6BCC,0x5434,0xA00A,0xA004,0xA002,0x543E,0x68A7, 0xA002,0x856A,0xA002,0x7121,0x5C4B,0xA006,0xA002,0x8BEC,0xA002,0x6D3F,0x70CF,0xA002,0x94A8,0xA002,0x6B4D,0x5DEB, 0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6C83,0x6439,0xA002,0x81E5,0xA002,0x65A1,0x6211,0xA004,0xA002, 0x7AA9,0x6E26,0xA002,0x8778,0xA002,0x64BE,0x7F4B,0xA00A,0xA004,0xA002,0x7FC1,0x55E1,0xA002,0x95EE,0xA002,0x7D0A, 0x7A69,0xA006,0xA002,0x543B,0xA002,0x7EB9,0x95FB,0xA002,0x6587,0xA002,0x868A,0x6EAB,0xA016,0xA00A,0xA004,0xA002, 0x761F,0x885B,0xA002,0x6170,0xA002,0x5C09,0x8C13,0xA006,0xA002,0x6E2D,0xA002,0x4F4D,0x9B4F,0xA002,0x9935,0xA002, 0x80C3,0x754F,0xA00A,0xA004,0xA002,0x5473,0x851A,0xA002,0x672A,0xA002,0x7EAC,0x5C3E,0xA006,0xA002,0x507D,0xA002, 0x5049,0x59D4,0xA002,0x840E,0xA002,0x8466,0x7EF4,0xA000,0xA014,0xA00A,0xA004,0xA002,0x6FF0,0x70BA,0xA002,0x60DF, 0xA002,0x552F,0x570D,0xA004,0xA002,0x6845,0x9055,0xA002,0x97E6,0xA002,0x5371,0x5FAE,0xA000,0xA000,0xA000,0x5DCD, 0xA0C0,0xA057,0xA001,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5A01,0x5984,0xA002,0x5FD8,0xA002,0x6722,0x6680,0xA004, 0xA002,0x5F80,0x7F51,0xA002,0x6789,0xA002,0x4EA1,0x738B,0xA00A,0xA004,0xA002,0x6C6A,0x8155,0xA002,0x842C,0xA002, 0x5A49,0x5B9B,0xA006,0xA002,0x60CB,0xA002,0x7696,0x665A,0xA002,0x8F13,0xA002,0x7897,0x5B8C,0xA016,0xA00A,0xA004, 0xA002,0x70F7,0x4E38,0xA002,0x987D,0xA002,0x7FEB,0x7063,0xA006,0xA002,0x5F4E,0xA002,0x8C4C,0x5916,0xA002,0x6B6A, 0xA002,0x977A,0x74E6,0xA00A,0xA004,0xA002,0x5A03,0x7AAA,0xA002,0x86D9,0xA002,0x54C7,0x7A75,0xA006,0xA002,0x553E, 0xA002,0x6428,0x59A5,0xA002,0x6A62,0xA002,0x9A7C,0x9A6E,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9640,0x9E35, 0xA002,0x8131,0xA002,0x8A17,0x62D6,0xA004,0xA002,0x81C0,0x5C6F,0xA002,0x541E,0xA002,0x9000,0x892A,0xA00A,0xA004, 0xA002,0x8715,0x817F,0xA002,0x9893,0xA002,0x63A8,0x7CF0,0xA006,0xA002,0x6E4D,0xA002,0x5154,0x5410,0xA002,0x571F, 0xA002,0x5C60,0x6D82,0xA016,0xA00A,0xA004,0xA002,0x9014,0x5F92,0xA002,0x5716,0xA002,0x7A81,0x79C3,0xA006,0xA002, 0x51F8,0xA002,0x900F,0x982D,0xA002,0x6295,0xA002,0x5AAE,0x75DB,0xA00A,0xA004,0xA002,0x7EDF,0x7B69,0xA002,0x6345, 0xA002,0x6876,0x7AE5,0xA006,0xA002,0x5F64,0xA002,0x94DC,0x8855,0xA002,0x77B3,0xA002,0x916E,0x6850,0xA000,0xA000, 0xA00A,0xA004,0xA002,0x901A,0x8247,0xA002,0x633A,0xA002,0x5EAD,0x4EAD,0xA000,0xA002,0x505C,0xA002,0x5EF7,0x6C40, 0xA001,0xA00A,0xA001,0xA001,0xA001,0xA001,0xA002,0x70F4,0xA002,0x807D,0x5EF3,0xA02C,0xA016,0xA00A,0xA004,0xA002, 0x6017,0x94C1,0xA002,0x8D34,0xA002,0x8DF3,0x773A,0xA006,0xA002,0x8FE2,0xA002,0x689D,0x6311,0xA002,0x8146,0xA002, 0x8214,0x606C,0xA00A,0xA004,0xA002,0x751C,0x7530,0xA002,0x586B,0xA002,0x6DFB,0x5929,0xA006,0xA002,0x5C5C,0xA002, 0x5243,0x6D95,0xA002,0x6113,0xA002,0x568F,0x66FF,0xA016,0xA00A,0xA004,0xA002,0x9AD4,0x557C,0xA002,0x8E44,0xA002, 0x9898,0x63D0,0xA006,0xA002,0x9511,0xA002,0x8E22,0x5254,0xA002,0x68AF,0xA002,0x8B04,0x75BC,0xA00A,0xA004,0xA002, 0x9A30,0x85E4,0xA002,0x7286,0xA002,0x5957,0x8BA8,0xA006,0xA002,0x9676,0xA002,0x6DD8,0x9003,0xA002,0x6843,0xA002, 0x8404,0x7EE6,0xB068,0xA804,0xA434,0xA1E9,0xA126,0xA063,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6ED4, 0x6FE4,0xA002,0x642F,0xA002,0x71D9,0x8D9F,0xA004,0xA002,0x6DCC,0x8EBA,0xA002,0x5018,0xA002,0x7CD6,0x5510,0xA00A, 0xA004,0xA002,0x819B,0x68E0,0xA002,0x5802,0xA002,0x642A,0x5858,0xA006,0xA002,0x6E6F,0xA002,0x70AD,0x6B4E,0xA002, 0x63A2,0xA002,0x78B3,0x8892,0xA016,0xA00A,0xA004,0xA002,0x6BEF,0x5766,0xA002,0x8C08,0xA002,0x8C2D,0x6F6D,0xA006, 0xA002,0x75F0,0xA002,0x6A80,0x7F48,0xA002,0x7058,0xA002,0x7671,0x8D2A,0xA00A,0xA004,0xA002,0x6524,0x574D,0xA002, 0x6C70,0xA002,0x614B,0x592A,0xA006,0xA002,0x915E,0xA002,0x6CF0,0x98B1,0xA002,0x62AC,0xA002,0x82D4,0x80CE,0xA000, 0xA000,0xA000,0xA004,0xA002,0x8E0F,0x8E4B,0xA002,0x64BB,0xA000,0x737A,0xA065,0xA00F,0xA001,0xA001,0xA001,0xA006, 0xA002,0x5854,0xA002,0x5979,0x7260,0xA002,0x4ED6,0xA002,0x584C,0x6240,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9501, 0x7D22,0xA002,0x7463,0xA002,0x7F29,0x5506,0xA004,0xA002,0x68AD,0x84D1,0xA002,0x7B4D,0xA002,0x640D,0x5B6B,0xA00A, 0xA004,0xA002,0x795F,0x96A7,0xA002,0x9042,0xA002,0x7A57,0x6B72,0xA006,0xA002,0x788E,0xA002,0x9AD3,0x7EE5,0xA002, 0x96A8,0xA002,0x968B,0x96D6,0xA016,0xA00A,0xA004,0xA002,0x7B97,0x849C,0xA002,0x9178,0xA002,0x8085,0x8BC9,0xA006, 0xA002,0x5BBF,0xA002,0x6EAF,0x5851,0xA002,0x50F3,0xA002,0x7C9F,0x901F,0xA00A,0xA004,0xA002,0x7D20,0x4FD7,0xA002, 0x9165,0xA002,0x8607,0x55FD,0xA006,0xA002,0x64FB,0xA002,0x825A,0x8490,0xA002,0x8BF5,0xA002,0x8BBC,0x5B8B,0xA056, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9001,0x9882,0xA002,0x616B,0xA002,0x8073,0x9B06,0xA004,0xA002,0x5DF3,0x9972, 0xA002,0x4F3C,0xA002,0x8997,0x56DB,0xA00A,0xA004,0xA002,0x55E3,0x5BFA,0xA002,0x8086,0xA002,0x6B7B,0x7D72,0xA006, 0xA002,0x53F8,0xA002,0x79C1,0x6952,0xA002,0x5636,0xA002,0x6495,0x65AF,0xA016,0xA00A,0xA004,0xA002,0x720D,0x6714, 0xA002,0x78A9,0xA002,0x8BF4,0x821C,0xA006,0xA002,0x987A,0xA002,0x77AC,0x542E,0xA002,0x7A0E,0xA002,0x7761,0x6C34, 0xA00A,0xA004,0xA002,0x8C01,0x723D,0xA002,0x96D9,0xA002,0x971C,0x62F4,0xA006,0xA002,0x6813,0xA002,0x5E25,0x7529, 0xA002,0x8870,0xA002,0x6454,0x800D,0xA000,0xA000,0xA000,0xA000,0xA002,0x5237,0x6055,0xA06C,0xA001,0xA015,0xA001, 0xA001,0xA007,0xA001,0xA002,0x6F31,0xA002,0x6578,0x5EB6,0xA006,0xA002,0x5885,0xA002,0x8C4E,0x620D,0xA002,0x675F, 0xA002,0x6A39,0x8FF0,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8853,0x5C6C,0xA002,0x9F20,0xA002,0x9ECD,0x8700,0xA004, 0xA002,0x7F72,0x66D9,0xA002,0x6691,0xA002,0x85F7,0x719F,0xA00A,0xA004,0xA002,0x5B70,0x8D4E,0xA002,0x66F8,0xA002, 0x758F,0x6DD1,0xA006,0xA002,0x8212,0xA002,0x53D4,0x8F93,0xA002,0x6292,0xA002,0x6B8A,0x68B3,0xA016,0xA00A,0xA004, 0xA002,0x6A1E,0x852C,0xA002,0x7378,0xA002,0x7626,0x53D7,0xA006,0xA002,0x552E,0xA002,0x6388,0x5BFF,0xA002,0x5B88, 0xA002,0x9996,0x624B,0xA00A,0xA004,0xA002,0x6536,0x8BD5,0xA002,0x89C6,0xA002,0x5BA4,0x6043,0xA006,0xA002,0x5E02, 0xA002,0x6C0F,0x9970,0xA002,0x91CB,0xA002,0x4F8D,0x4ED5,0xA000,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9069, 0x566C,0xA002,0x55DC,0xA002,0x662F,0x52E2,0xA004,0xA002,0x901D,0x8A93,0xA002,0x62ED,0xA002,0x525A,0x67FF,0xA00A, 0xA004,0xA002,0x4E16,0x58EB,0xA002,0x793A,0xA002,0x5F0F,0x59CB,0xA006,0xA002,0x9A76,0xA002,0x5C4E,0x4F7F,0xA002, 0x77E2,0xA002,0x53F2,0x8BC6,0xA016,0xA00A,0xA004,0xA002,0x5BE6,0x8755,0xA002,0x98DF,0xA002,0x4EC0,0x6642,0xA006, 0xA002,0x62FE,0xA002,0x77F3,0x5341,0xA002,0x8768,0xA002,0x5C4D,0x8BD7,0xA00A,0xA004,0xA002,0x6FD5,0x65BD,0xA002, 0x7345,0xA002,0x5931,0x5E2B,0xA006,0xA002,0x8056,0xA002,0x80DC,0x8CF8,0xA002,0x76DB,0xA000,0x7701,0xA13C,0xA0C4, 0xA073,0xA01D,0xA001,0xA006,0xA001,0xA001,0xA001,0xA001,0x7EF3,0xA00A,0xA004,0xA002,0x965E,0x7272,0xA002,0x7525, 0xA002,0x751F,0x8072,0xA006,0xA002,0x6EF2,0xA002,0x614E,0x814E,0xA002,0x751A,0xA002,0x5B38,0x5BE9,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x700B,0x795E,0xA002,0x7EC5,0xA002,0x5A20,0x6DF1,0xA004,0xA002,0x8EAB,0x4F38,0xA002,0x547B, 0xA002,0x7533,0x7837,0xA00A,0xA004,0xA002,0x8BBE,0x793E,0xA002,0x6D89,0xA002,0x61FE,0x5C04,0xA006,0xA002,0x651D, 0xA002,0x8D66,0x820D,0xA002,0x820C,0xA002,0x86C7,0x8D4A,0xA016,0xA00A,0xA004,0xA002,0x5962,0x7ECD,0xA002,0x90B5, 0xA002,0x54E8,0x5C11,0xA006,0xA002,0x97F6,0xA002,0x52FA,0x828D,0xA002,0x71D2,0xA002,0x7A0D,0x634E,0xA00A,0xA004, 0xA002,0x68A2,0x88F3,0xA002,0x5C1A,0xA002,0x4E0A,0x664C,0xA006,0xA002,0x8D4F,0xA002,0x5546,0x50B7,0xA002,0x5892, 0xA002,0x7F2E,0x6247,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6C55,0x5584,0xA002,0x81B3,0xA002,0x8D61,0x64C5, 0xA004,0xA002,0x965D,0x95EA,0xA002,0x886B,0xA002,0x717D,0x522A,0xA00A,0xA004,0xA002,0x5C71,0x7154,0xA002,0x82EB, 0xA002,0x73CA,0x66EC,0xA006,0xA002,0x7BE9,0xA002,0x715E,0x5565,0xA002,0x50BB,0xA002,0x7EB1,0x6C99,0xA016,0xA00A, 0xA004,0xA002,0x524E,0x6BBA,0xA002,0x7802,0xA002,0x838E,0x50E7,0xA006,0xA002,0x68EE,0xA002,0x6F80,0x8272,0xA002, 0x745F,0xA002,0x5AC2,0x6383,0xA00A,0xA004,0xA002,0x9A9A,0x6414,0xA002,0x55AA,0xA002,0x55D3,0x6851,0xA000,0xA002, 0x6563,0xA000,0x5098,0xA001,0xA01F,0xA001,0xA008,0xA001,0xA001,0xA002,0x53C1,0xA002,0x4E09,0x8D5B,0xA00A,0xA004, 0xA002,0x585E,0x9CC3,0xA002,0x816E,0xA002,0x85A9,0x7051,0xA006,0xA002,0x6492,0xA002,0x5F31,0x82E5,0xA002,0x6F64, 0xA002,0x95F0,0x9510,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x745E,0x854A,0xA002,0x962E,0xA002,0x8F6F,0x8925,0xA006, 0xA002,0x5165,0xA002,0x6C5D,0x4E73,0xA002,0x8FB1,0xA002,0x5982,0x5B7A,0xA00A,0xA004,0xA002,0x5112,0x8815,0xA002, 0x8339,0xA002,0x8089,0x67D4,0xA006,0xA002,0x7163,0xA002,0x5197,0x7FA2,0xA002,0x5BB9,0xA002,0x6EB6,0x9394,0xA016, 0xA00A,0xA004,0xA002,0x878D,0x8363,0xA002,0x84C9,0xA002,0x8338,0x620E,0xA006,0xA002,0x65E5,0xA002,0x793D,0x6254, 0xA002,0x7EAB,0xA002,0x598A,0x5203,0xA00A,0xA004,0xA002,0x8BA4,0x4EFB,0xA002,0x97E7,0xA002,0x5FCD,0x4EBA,0xA006, 0xA002,0x4EC1,0xA002,0x58EC,0x71B1,0xA002,0x60F9,0xA002,0x7ED5,0x64FE,0xA04C,0xA000,0xA000,0xA02A,0xA014,0xA00A, 0xA004,0xA002,0x9976,0x8BA9,0xA002,0x56B7,0xA002,0x6518,0x58E4,0xA004,0xA002,0x74E4,0x67D3,0xA002,0x5189,0xA002, 0x71C3,0x7136,0xA00A,0xA004,0xA002,0x7FA4,0x88D9,0xA002,0x96C0,0xA002,0x78BA,0x69B7,0xA006,0xA002,0x9E4A,0xA002, 0x537B,0x7638,0xA002,0x7094,0xA002,0x7F3A,0x52F8,0xA016,0xA00A,0xA004,0xA002,0x5238,0x72AC,0xA002,0x62F3,0xA002, 0x75CA,0x5168,0xA006,0xA002,0x6CC9,0xA002,0x919B,0x6B0A,0xA002,0x98A7,0xA002,0x5708,0x53BB,0xA000,0xA004,0xA002, 0x8DA3,0x9F8B,0xA002,0x5A36,0xA000,0x53D6,0xA07E,0xA028,0xA001,0xA011,0xA005,0xA001,0xA001,0xA001,0x6E20,0xA006, 0xA002,0x9A71,0xA002,0x5C48,0x8EC0,0xA002,0x66F2,0xA002,0x86C6,0x5340,0xA00A,0xA004,0xA002,0x8DA8,0x6CC5,0xA002, 0x914B,0xA002,0x56DA,0x6C42,0xA006,0xA002,0x7403,0xA002,0x90B1,0x5775,0xA002,0x97A6,0xA002,0x7AAE,0x74CA,0xA02A, 0xA014,0xA00A,0xA004,0xA002,0x6176,0x8BF7,0xA002,0x9877,0xA002,0x60C5,0x6C30,0xA004,0xA002,0x6674,0x64CE,0xA002, 0x6E05,0xA002,0x537F,0x50BE,0xA00A,0xA004,0xA002,0x6C2B,0x8F7B,0xA002,0x9752,0xA002,0x6C81,0x5BE2,0xA006,0xA002, 0x79BD,0xA002,0x64D2,0x82B9,0xA002,0x61C3,0xA002,0x7434,0x79E6,0xA016,0xA00A,0xA004,0xA002,0x89AA,0x4FB5,0xA002, 0x94A6,0xA002,0x7ACA,0x602F,0xA006,0xA002,0x4E14,0xA002,0x8304,0x5207,0xA002,0x7AC5,0xA002,0x4FCF,0x5CED,0xA00A, 0xA004,0xA002,0x7FF9,0x64AC,0xA002,0x9798,0xA002,0x5DE7,0x50D1,0xA006,0xA002,0x55AC,0xA002,0x77A7,0x6A4B,0xA002, 0x6084,0xA002,0x6572,0x9539,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6A47,0x6436,0xA002,0x5F4A,0xA002,0x8594, 0x7246,0xA004,0xA002,0x7F8C,0x8154,0xA002,0x55C6,0xA002,0x9397,0x6B49,0xA00A,0xA004,0xA002,0x6B20,0x5D4C,0xA002, 0x5879,0xA002,0x8C34,0x6DFA,0xA006,0xA002,0x9063,0xA002,0x6F5C,0x524D,0xA002,0x94B3,0xA002,0x94B1,0x9ED4,0xA015, 0xA009,0xA003,0xA001,0x8C26,0xA002,0x4EDF,0xA002,0x7C64,0x9077,0xA006,0xA002,0x97C6,0xA002,0x94C5,0x948E,0xA002, 0x6266,0xA002,0x727D,0x6D3D,0xA000,0xA000,0xA000,0x6070,0xA219,0xA0C3,0xA083,0xA001,0xA02C,0xA001,0xA015,0xA009, 0xA003,0xA001,0x6390,0xA002,0x8BAB,0xA002,0x6CE3,0x6ECA,0xA006,0xA002,0x68C4,0xA002,0x8FC4,0x6C23,0xA002,0x5668, 0xA002,0x780C,0x6814,0xA00A,0xA004,0xA002,0x555F,0x4F01,0xA002,0x4E5E,0xA002,0x8C48,0x8D77,0xA006,0xA002,0x9A91, 0xA002,0x7941,0x7948,0xA002,0x65D7,0xA002,0x9F50,0x81CD,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5D0E,0x7566,0xA002, 0x8DC2,0xA002,0x5947,0x68CB,0xA004,0xA002,0x5176,0x6C8F,0xA002,0x67D2,0xA002,0x6F06,0x6DD2,0xA00A,0xA004,0xA002, 0x4E03,0x59BB,0xA002,0x93DA,0xA002,0x68F2,0x6B3A,0xA006,0xA002,0x7A18,0xA002,0x7011,0x66DD,0xA002,0x8C31,0xA002, 0x6D66,0x666E,0xA016,0xA00A,0xA004,0xA002,0x5703,0x6A38,0xA002,0x57D4,0xA002,0x84B2,0x83E9,0xA006,0xA002,0x8461, 0xA002,0x8386,0x50D5,0xA002,0x94FA,0xA002,0x64B2,0x5256,0xA00A,0xA004,0xA002,0x7C95,0x8FEB,0xA002,0x9B44,0xA002, 0x7834,0x5A46,0xA006,0xA002,0x9887,0xA002,0x6F51,0x5761,0xA002,0x84F1,0xA002,0x8BC4,0x7F3E,0xA000,0xA000,0xA02A, 0xA014,0xA00A,0xA004,0xA002,0x6191,0x5E73,0xA002,0x840D,0xA002,0x860B,0x576A,0xA004,0xA002,0x4E52,0x8058,0xA002, 0x54C1,0xA002,0x8D2B,0x9891,0xA00A,0xA004,0xA002,0x62FC,0x8995,0xA002,0x6487,0xA002,0x7968,0x74E2,0xA006,0xA002, 0x6F02,0xA002,0x98D8,0x9A97,0xA002,0x7247,0xA002,0x504F,0x7BC7,0xA000,0xA00A,0xA004,0xA002,0x8B6C,0x5C41,0xA002, 0x50FB,0xA002,0x75DE,0x5339,0xA006,0xA002,0x76AE,0xA002,0x75B2,0x813E,0xA000,0x5564,0xA0C4,0xA08A,0xA034,0xA008, 0xA001,0xA001,0xA001,0xA001,0xA002,0x6BD8,0x7435,0xA016,0xA00A,0xA004,0xA002,0x5288,0x62AB,0xA002,0x6279,0xA002, 0x9739,0x7812,0xA006,0xA002,0x576F,0xA002,0x78B0,0x6367,0xA002,0x9E4F,0xA002,0x670B,0x81A8,0xA00A,0xA004,0xA002, 0x7BF7,0x787C,0xA002,0x68DA,0xA002,0x84EC,0x5F6D,0xA006,0xA002,0x6F8E,0xA002,0x70F9,0x62A8,0xA002,0x7830,0xA002, 0x76C6,0x5674,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6C9B,0x73EE,0xA002,0x914D,0xA002,0x966A,0x8D54,0xA004,0xA002, 0x88F4,0x57F9,0xA002,0x80DA,0xA002,0x5478,0x6CE1,0xA00A,0xA004,0xA002,0x8DD1,0x888D,0xA002,0x7832,0xA002,0x9464, 0x5486,0xA006,0xA002,0x62CB,0xA002,0x80D6,0x802A,0xA002,0x65C1,0xA002,0x9F90,0x4E53,0xA016,0xA00A,0xA004,0xA002, 0x53DB,0x5224,0xA002,0x7554,0xA002,0x76FC,0x78D0,0xA006,0xA002,0x76E4,0xA002,0x6F58,0x6500,0xA002,0x6D3E,0xA002, 0x6E43,0x5F98,0xA00A,0xA004,0xA002,0x724C,0x6392,0xA002,0x62CD,0xA002,0x7436,0x6015,0xA006,0xA002,0x5E15,0xA002, 0x722C,0x8DB4,0xA002,0x556A,0xA002,0x6F1A,0x5076,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5614,0x85D5,0xA002, 0x6BC6,0xA002,0x9E25,0x6B50,0xA004,0xA002,0x54E6,0x8BFA,0xA002,0x7CEF,0xA002,0x61E6,0x637C,0xA00A,0xA004,0xA002, 0x7627,0x8650,0xA002,0x7156,0xA002,0x5973,0x6012,0xA006,0xA002,0x52AA,0xA002,0x5974,0x8856,0xA002,0x8FB2,0xA002, 0x6FC3,0x81BF,0xA000,0xA00A,0xA004,0xA002,0x7EBD,0x94AE,0xA002,0x626D,0xA002,0x725B,0x6FD8,0xA000,0xA000,0x64F0, 0xA001,0xA039,0xA00D,0xA001,0xA001,0xA005,0xA001,0xA002,0x5BE7,0x51DD,0xA002,0x7370,0xA002,0x6AB8,0x60A8,0xA016, 0xA00A,0xA004,0xA002,0x6D85,0x954D,0xA002,0x954A,0xA002,0x9F67,0x5B7D,0xA006,0xA002,0x8076,0xA002,0x634F,0x5C3F, 0xA002,0x9E1F,0xA002,0x91C0,0x5B43,0xA00A,0xA004,0xA002,0x5FF5,0x649A,0xA002,0x6506,0xA002,0x78BE,0x5E74,0xA006, 0xA002,0x62C8,0xA002,0x852B,0x6EBA,0xA002,0x9006,0xA002,0x81A9,0x533F,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x59B3, 0x64EC,0xA002,0x5C3C,0xA002,0x6CE5,0x90F3,0xA006,0xA002,0x9713,0xA002,0x5A57,0x80FD,0xA002,0x5AE9,0xA002,0x5185, 0x9981,0xA00A,0xA004,0xA002,0x5462,0x6DD6,0xA002,0x9B27,0xA002,0x60F1,0x8166,0xA006,0xA002,0x6493,0xA002,0x56CA, 0x96E3,0xA002,0x7537,0xA002,0x5357,0x5948,0xA016,0xA00A,0xA004,0xA002,0x8010,0x5976,0xA002,0x8FFA,0xA002,0x6C16, 0x7EB3,0xA006,0xA002,0x5A1C,0xA002,0x90A3,0x94A0,0xA002,0x5450,0xA002,0x54EA,0x6310,0xA00A,0xA004,0xA002,0x7A46, 0x7267,0xA002,0x7766,0xA002,0x76EE,0x6728,0xA006,0xA002,0x6155,0xA002,0x52DF,0x5E59,0xA002,0x66AE,0xA002,0x5893, 0x6BCD,0xA0F4,0xA033,0xA000,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x59C6,0x755D,0xA002,0x7261,0xA002,0x62C7, 0x67D0,0xA004,0xA002,0x725F,0x8C0B,0xA002,0x964C,0xA002,0x5BDE,0x6F20,0xA00A,0xA004,0xA002,0x6CAB,0x9ED8,0xA002, 0x58A8,0xA002,0x83AB,0x672B,0xA006,0xA002,0x62B9,0xA002,0x9B54,0x6469,0xA002,0x78E8,0xA002,0x819C,0x6A21,0xA000, 0xA000,0xA000,0xA002,0x8611,0x6479,0xA095,0xA03F,0xA013,0xA001,0xA006,0xA001,0xA001,0xA002,0x6478,0x8C2C,0xA006, 0xA002,0x547D,0xA002,0x540D,0x94ED,0xA002,0x9E23,0xA002,0x879F,0x660E,0xA016,0xA00A,0xA004,0xA002,0x95FD,0x61AB, 0xA002,0x654F,0xA002,0x76BF,0x62BF,0xA006,0xA002,0x6C11,0xA002,0x706D,0x884A,0xA002,0x7385,0xA002,0x5EDF,0x6E3A, 0xA00A,0xA004,0xA002,0x79D2,0x85D0,0xA002,0x7784,0xA002,0x63CF,0x82D7,0xA006,0xA002,0x9EB5,0xA002,0x7F05,0x5A29, 0xA002,0x52C9,0xA002,0x514D,0x7D7B,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x7EF5,0x7720,0xA002,0x68C9,0xA002,0x5E42, 0x5BC6,0xA004,0xA002,0x871C,0x6CCC,0xA002,0x89C5,0xA002,0x959F,0x7C73,0xA00A,0xA004,0xA002,0x7030,0x8C1C,0xA002, 0x8FF7,0xA002,0x7CDC,0x9761,0xA006,0xA002,0x919A,0xA002,0x7787,0x5B5F,0xA002,0x68A6,0xA002,0x731B,0x9530,0xA016, 0xA00A,0xA004,0xA002,0x76DF,0x6AAC,0xA002,0x8499,0xA002,0x840C,0x5011,0xA006,0xA002,0x95F7,0xA002,0x95E8,0x5A9A, 0xA002,0x59BA,0xA002,0x5BD0,0x6627,0xA00A,0xA004,0xA002,0x7F8E,0x6BCF,0xA002,0x9541,0xA002,0x5A92,0x7709,0xA006, 0xA002,0x6CA1,0xA002,0x7164,0x9EF4,0xA002,0x9176,0xA002,0x6885,0x679A,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002, 0x73AB,0x9EBC,0xA002,0x8D38,0xA002,0x8C8C,0x5E3D,0xA004,0xA002,0x5192,0x8302,0xA002,0x536F,0xA002,0x94C6,0x77DB, 0xA00A,0xA004,0xA002,0x82BC,0x951A,0xA002,0x8305,0xA002,0x8C93,0x83BD,0xA006,0xA002,0x5FD9,0xA002,0x6C13,0x76F3, 0xA002,0x832B,0xA002,0x8292,0x8C29,0xA09C,0xA001,0xA043,0xA017,0xA001,0xA00A,0xA004,0xA002,0x6F2B,0x6162,0xA002, 0x66FC,0xA002,0x8513,0x6EFF,0xA006,0xA002,0x883B,0xA002,0x9992,0x779E,0xA002,0x8109,0xA002,0x9081,0x8CE3,0xA016, 0xA00A,0xA004,0xA002,0x9EA6,0x8CB7,0xA002,0x57CB,0xA002,0x55CE,0x561B,0xA006,0xA002,0x9A82,0xA002,0x9A6C,0x879E, 0xA002,0x78BC,0xA002,0x746A,0x9EBB,0xA00A,0xA004,0xA002,0x5ABD,0x7EDC,0xA002,0x9A86,0xA002,0x6D1B,0x843D,0xA006, 0xA002,0x88F8,0xA002,0x9AA1,0x7C6E,0xA002,0x9523,0xA002,0x908F,0x7F85,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x87BA, 0x863F,0xA002,0x8BBA,0xA002,0x7EB6,0x6DEA,0xA006,0xA002,0x5D19,0xA002,0x502B,0x8F6E,0xA002,0x6384,0xA002,0x7565, 0x63A0,0xA00A,0xA004,0xA002,0x4E82,0x5375,0xA002,0x7064,0xA002,0x5B7F,0x6523,0xA006,0xA002,0x5DD2,0xA002,0x83C9, 0x6FFE,0xA002,0x7387,0xA002,0x5F8B,0x6C2F,0xA016,0xA00A,0xA004,0xA002,0x8651,0x7F15,0xA002,0x5C62,0xA002,0x5C65, 0x65C5,0xA006,0xA002,0x4FB6,0xA002,0x94DD,0x5442,0xA002,0x9A74,0xA002,0x622E,0x9678,0xA00A,0xA004,0xA002,0x9304, 0x7984,0xA002,0x6F5E,0xA002,0x9E7F,0x8D42,0xA006,0xA002,0x8DEF,0xA002,0x9732,0x788C,0xA002,0x9E93,0xA002,0x9C81, 0x865C,0xA000,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x9E75,0x64C4,0xA002,0x946A,0xA002,0x5EEC,0x9885,0xA004, 0xA002,0x76E7,0x8606,0xA002,0x964B,0xA002,0x6F0F,0x7C0D,0xA00A,0xA004,0xA002,0x645F,0x5A41,0xA002,0x6A13,0xA002, 0x96B4,0x650F,0xA000,0xA002,0x58DF,0xA000,0x9686,0xA493,0xA248,0xA16C,0xA0C2,0xA0A2,0xA04C,0xA020,0xA00A,0xA001, 0xA003,0xA001,0x7ABF,0xA002,0x7C60,0xA002,0x56A8,0x807E,0xA00A,0xA004,0xA002,0x9F99,0x516D,0xA002,0x67F3,0xA002, 0x6D41,0x7624,0xA006,0xA002,0x5289,0xA002,0x7559,0x998F,0xA002,0x786B,0xA002,0x69B4,0x7409,0xA016,0xA00A,0xA004, 0xA002,0x9724,0x4EE4,0xA002,0x53E6,0xA002,0x9886,0x5DBA,0xA006,0xA002,0x9675,0xA002,0x9748,0x6DE9,0xA002,0x7F9A, 0xA002,0x4F36,0x94C3,0xA00A,0xA004,0xA002,0x9F84,0x96F6,0xA002,0x83F1,0xA002,0x73B2,0x62CE,0xA006,0xA002,0x541D, 0xA002,0x8D41,0x51DC,0xA002,0x6DCB,0xA002,0x9CDE,0x9130,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x81E8,0x9716,0xA002, 0x78F7,0xA002,0x6797,0x7433,0xA004,0xA002,0x7375,0x52A3,0xA002,0x70C8,0xA002,0x88C2,0x5217,0xA00A,0xA004,0xA002, 0x6599,0x5ED6,0xA002,0x9563,0xA002,0x6482,0x77AD,0xA006,0xA002,0x6F66,0xA002,0x907C,0x5BE5,0xA002,0x71CE,0xA002, 0x7642,0x50DA,0xA016,0xA00A,0xA004,0xA002,0x804A,0x64A9,0xA002,0x8C05,0xA002,0x4EAE,0x667E,0xA006,0xA002,0x91CF, 0xA002,0x8F86,0x5169,0xA002,0x826F,0xA002,0x7CB1,0x6A11,0xA00A,0xA004,0xA002,0x6DBC,0x7CE7,0xA002,0x7EC3,0xA002, 0x7149,0x6200,0xA006,0xA002,0x94FE,0xA002,0x81C9,0x6582,0xA002,0x7C3E,0xA002,0x6F23,0x6190,0xA000,0xA000,0xA014, 0xA00A,0xA004,0xA002,0x5EC9,0x9570,0xA002,0x9023,0xA002,0x84EE,0x806F,0xA004,0xA002,0x5006,0x54E9,0xA002,0x7483, 0xA002,0x52A6,0x96B8,0xA000,0xA004,0xA002,0x701D,0x7C92,0xA002,0x7ACB,0xA000,0x75E2,0xA001,0xA051,0xA025,0xA00F, 0xA005,0xA001,0xA001,0xA001,0x4FD0,0xA004,0xA002,0x4F8B,0x5088,0xA002,0x5229,0xA002,0x6B77,0x792B,0xA00A,0xA004, 0xA002,0x52F5,0x7805,0xA002,0x9E97,0xA002,0x6817,0x540F,0xA006,0xA002,0x8354,0xA002,0x8389,0x79AE,0xA002,0x9CA4, 0xA002,0x91CC,0x674E,0xA016,0xA00A,0xA004,0xA002,0x7406,0x7055,0xA002,0x96E2,0xA002,0x72F8,0x7C6C,0xA006,0xA002, 0x9ECE,0xA002,0x7281,0x68A8,0xA002,0x91D0,0xA002,0x51B7,0x695E,0xA00A,0xA004,0xA002,0x7A1C,0x6DDA,0xA002,0x985E, 0xA002,0x808B,0x64C2,0xA006,0xA002,0x58D8,0xA002,0x5121,0x7E8D,0xA002,0x78CA,0xA002,0x857E,0x956D,0xA02C,0xA016, 0xA00A,0xA004,0xA002,0x96F7,0x6A02,0xA002,0x52D2,0xA002,0x6F87,0x70D9,0xA006,0xA002,0x916A,0xA002,0x59E5,0x4F6C, 0xA002,0x8001,0xA002,0x7262,0x52DE,0xA00A,0xA004,0xA002,0x6488,0x6D6A,0xA002,0x6717,0xA002,0x90CE,0x5ECA,0xA006, 0xA002,0x72FC,0xA002,0x6994,0x746F,0xA002,0x6FEB,0xA002,0x721B,0x7F06,0xA016,0xA00A,0xA004,0xA002,0x61F6,0x89C8, 0xA002,0x652C,0xA002,0x8C30,0x703E,0xA006,0xA002,0x862D,0xA002,0x9611,0x7C43,0xA002,0x6514,0xA002,0x6B04,0x60CF, 0xA00A,0xA004,0xA002,0x85CD,0x8D56,0xA002,0x6765,0xA002,0x840A,0x5566,0xA006,0xA002,0x8FA3,0xA002,0x81D8,0x881F, 0xA002,0x5587,0xA002,0x62F9,0x5783,0xA01C,0xA000,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x9614,0x5ED3,0xA002, 0x64F4,0xA002,0x62EC,0x774F,0xA004,0xA002,0x7D91,0x665C,0xA002,0x5764,0xA002,0x6F70,0x6127,0xA000,0xA000,0xA000, 0x9988,0xA0AC,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5080,0x9B41,0xA002,0x594E,0xA002,0x8475,0x7ABA,0xA004, 0xA002,0x5DCB,0x76D4,0xA002,0x8667,0xA002,0x6CC1,0x66E0,0xA00A,0xA004,0xA002,0x7736,0x7926,0xA002,0x6846,0xA002, 0x72C2,0x7B50,0xA006,0xA002,0x5321,0xA002,0x6B3E,0x5BEC,0xA002,0x5FEB,0xA002,0x5108,0x7B77,0xA016,0xA00A,0xA004, 0xA002,0x584A,0x80EF,0xA002,0x8DE8,0xA002,0x630E,0x57AE,0xA006,0xA002,0x8A87,0xA002,0x8932,0x5EAB,0xA002,0x9177, 0xA002,0x82E6,0x7A9F,0xA00A,0xA004,0xA002,0x54ED,0x67AF,0xA002,0x5BC7,0xA002,0x91E6,0x56D7,0xA006,0xA002,0x6473, 0xA002,0x63A7,0x5B54,0xA002,0x6050,0xA002,0x7A7A,0x542D,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x962C,0x61C7,0xA002, 0x58BE,0xA002,0x8C64,0x80AF,0xA004,0xA002,0x8BFE,0x5BA2,0xA002,0x523B,0xA002,0x524B,0x6E34,0xA00A,0xA004,0xA002, 0x53EF,0x6B2C,0xA002,0x6BBC,0xA002,0x79D1,0x9897,0xA006,0xA002,0x78D5,0xA002,0x68F5,0x7241,0xA002,0x82DB,0xA002, 0x5777,0x9760,0xA016,0xA00A,0xA004,0xA002,0x70E4,0x62F7,0xA002,0x8003,0xA002,0x7095,0x4EA2,0xA006,0xA002,0x6297, 0xA002,0x6443,0x7CE0,0xA002,0x6177,0xA002,0x5EB7,0x770B,0xA00A,0xA004,0xA002,0x780D,0x6B3F,0xA002,0x52D8,0xA002, 0x582A,0x520A,0xA006,0xA002,0x6168,0xA002,0x51F1,0x6977,0xA002,0x63E9,0xA002,0x958B,0x54AF,0xA000,0xA000,0xA000, 0xA00A,0xA004,0xA002,0x5361,0x5496,0xA002,0x5580,0xA002,0x9A8F,0x90E1,0xA004,0xA002,0x6FEC,0x7AE3,0xA000,0x5BEF, 0xA0D5,0xA0B7,0xA00B,0xA001,0xA001,0xA001,0xA001,0xA001,0xA002,0x5D1A,0xA002,0x541B,0x8ECD,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x94A7,0x83CC,0xA002,0x5747,0xA002,0x7EDD,0x8BC0,0xA004,0xA002,0x73A6,0x89C9,0xA002,0x7235, 0xA002,0x5014,0x6398,0xA00A,0xA004,0xA002,0x6289,0x652B,0xA002,0x6485,0xA002,0x7EE2,0x6372,0xA006,0xA002,0x7760, 0xA002,0x5026,0x5A1F,0xA002,0x9E43,0xA002,0x6350,0x5287,0xA016,0xA00A,0xA004,0xA002,0x70AC,0x61FC,0xA002,0x53E5, 0xA002,0x4FF1,0x952F,0xA006,0xA002,0x8E1E,0xA002,0x8DDD,0x5177,0xA002,0x5DE8,0xA002,0x64DA,0x62D2,0xA00A,0xA004, 0xA002,0x805A,0x6CAE,0xA002,0x8209,0xA002,0x842D,0x5480,0xA006,0xA002,0x8DFC,0xA002,0x83CA,0x9A79,0xA002,0x5C45, 0xA002,0x75BD,0x72D9,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x8EE5,0x97A0,0xA002,0x759A,0xA002,0x5C31,0x548E,0xA004, 0xA002,0x8205,0x81FC,0xA002,0x820A,0xA002,0x6551,0x5EC4,0xA00A,0xA004,0xA002,0x9152,0x4E5D,0xA002,0x7078,0xA002, 0x4E45,0x97ED,0xA006,0xA002,0x7396,0xA002,0x7EA0,0x7A76,0xA002,0x63EB,0xA002,0x7A98,0x70AF,0xA016,0xA00A,0xA004, 0xA002,0x6DE8,0x7AF6,0xA002,0x7ADF,0xA002,0x9756,0x75D9,0xA006,0xA002,0x5F91,0xA002,0x955C,0x656C,0xA002,0x5883, 0xA002,0x975C,0x9888,0xA00A,0xA004,0xA002,0x666F,0x8B66,0xA002,0x4E95,0xA002,0x7ECF,0x7CB3,0xA006,0xA002,0x7CBE, 0xA002,0x9A5A,0x4EAC,0xA002,0x9CB8,0xA002,0x6676,0x775B,0xA00E,0xA000,0xA000,0xA000,0xA000,0xA004,0xA002,0x8396, 0x5162,0xA002,0x834A,0xA002,0x52C1,0x76E1,0xA001,0xA001,0xA001,0xA001,0xA006,0xA002,0x6D78,0xA002,0x71FC,0x8FD1, 0xA002,0x7981,0xA002,0x664B,0x9773,0xA0B5,0xA0AC,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9032,0x8C28,0xA002, 0x83EB,0xA002,0x9526,0x7DCA,0xA004,0xA002,0x895F,0x6D25,0xA002,0x4ECA,0xA002,0x91D1,0x91FF,0xA00A,0xA004,0xA002, 0x7B4B,0x5DFE,0xA002,0x5C4A,0xA002,0x8BEB,0x75A5,0xA006,0xA002,0x4ECB,0xA002,0x501F,0x754C,0xA002,0x82A5,0xA002, 0x85C9,0x6212,0xA016,0xA00A,0xA004,0xA002,0x601A,0x89E3,0xA002,0x7ED3,0xA002,0x7D5C,0x7AED,0xA006,0xA002,0x776B, 0xA002,0x6377,0x6770,0xA002,0x6854,0xA002,0x8282,0x62BE,0xA00A,0xA004,0xA002,0x622A,0x968E,0xA002,0x8857,0xA002, 0x9782,0x7686,0xA006,0xA002,0x63A5,0xA002,0x63ED,0x7A96,0xA002,0x53EB,0xA002,0x8F83,0x8F7F,0xA02A,0xA014,0xA00A, 0xA004,0xA002,0x9175,0x6559,0xA002,0x52E6,0xA002,0x7EDE,0x7F34,0xA004,0xA002,0x997A,0x89D2,0xA002,0x72E1,0xA002, 0x8173,0x50E5,0xA00A,0xA004,0xA002,0x77EF,0x94F0,0xA002,0x652A,0xA002,0x56BC,0x5B0C,0xA006,0xA002,0x9A84,0xA002, 0x6F86,0x90CA,0xA002,0x4EA4,0xA002,0x81A0,0x7126,0xA016,0xA00A,0xA004,0xA002,0x7901,0x6912,0xA002,0x8549,0xA002, 0x964D,0x91AC,0xA006,0xA002,0x5320,0xA002,0x8BB2,0x734E,0xA002,0x69F3,0xA002,0x8523,0x7586,0xA00A,0xA004,0xA002, 0x6C5F,0x6F3F,0xA002,0x5C07,0xA002,0x8591,0x50F5,0xA006,0xA002,0x5EFA,0xA002,0x6F97,0x6FFA,0xA002,0x6F38,0xA002, 0x996F,0x528D,0xA000,0xA000,0xA000,0xA000,0xA000,0xA002,0x8266,0x5065,0xA016,0xA001,0xA001,0xA001,0xA007,0xA001, 0xA002,0x4EF6,0xA002,0x7BAD,0x952E,0xA006,0xA002,0x89C1,0xA002,0x8D31,0x8E10,0xA002,0x9452,0xA002,0x6ABB,0x85A6, 0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6E1B,0x526A,0xA002,0x5109,0xA002,0x7C21,0x64BF,0xA004,0xA002,0x63C0, 0x9E7C,0xA002,0x78B1,0xA002,0x67EC,0x6AA2,0xA00A,0xA004,0xA002,0x8327,0x7F04,0xA002,0x59E6,0xA002,0x8271,0x80A9, 0xA006,0xA002,0x517C,0xA002,0x714E,0x95F4,0xA002,0x7B8B,0xA002,0x5C16,0x5805,0xA016,0xA00A,0xA004,0xA002,0x76E3, 0x6BB2,0xA002,0x5AC1,0xA002,0x9A7E,0x67B6,0xA006,0xA002,0x50F9,0xA002,0x7A3C,0x5047,0xA002,0x94BE,0xA002,0x7532, 0x8D3E,0xA00A,0xA004,0xA002,0x988A,0x83A2,0xA002,0x52A0,0xA002,0x5BB6,0x4F73,0xA006,0xA002,0x593E,0xA002,0x6935, 0x5609,0xA002,0x7EAA,0xA002,0x7EE7,0x5993,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x969B,0x5FCC,0xA002,0x65E2,0xA002, 0x8BB0,0x8BA1,0xA006,0xA002,0x6F03,0xA002,0x5BC4,0x6FDF,0xA002,0x60B8,0xA002,0x5291,0x796D,0xA00A,0xA004,0xA002, 0x4F0E,0x5B63,0xA002,0x5180,0xA002,0x6280,0x858A,0xA006,0xA002,0x5DF1,0xA002,0x810A,0x5E7E,0xA002,0x64E0,0xA002, 0x7EA7,0x5AC9,0xA016,0xA00A,0xA004,0xA002,0x5373,0x6C72,0xA002,0x75BE,0xA002,0x6025,0x53CA,0xA006,0xA002,0x96C6, 0xA002,0x7C4D,0x8F91,0xA002,0x68D8,0xA002,0x6975,0x5409,0xA00A,0xA004,0xA002,0x7F09,0x7EE9,0xA002,0x59EC,0xA002, 0x9E21,0x8BA5,0xA006,0xA002,0x6FC0,0xA002,0x8FF9,0x9965,0xA000,0x808C,0xA1B4,0xA0C6,0xA01F,0xA001,0xA001,0xA001, 0xA006,0xA001,0xA001,0xA001,0xA001,0x7B95,0xA00A,0xA004,0xA002,0x7A4D,0x7A3D,0xA002,0x7578,0xA002,0x6A5F,0x57FA, 0xA006,0xA002,0x573E,0xA002,0x64CA,0x798D,0xA002,0x8D27,0xA002,0x970D,0x60D1,0xA000,0xA056,0xA02A,0xA014,0xA00A, 0xA004,0xA002,0x6216,0x83B7,0xA002,0x706B,0xA002,0x4F19,0x6D3B,0xA004,0xA002,0x8C41,0x6DF7,0xA002,0x6E3E,0xA002, 0x9B42,0x5A5A,0xA00A,0xA004,0xA002,0x660F,0x8477,0xA002,0x7ED8,0xA002,0x8BF2,0x8BB3,0xA006,0xA002,0x6C47,0xA002, 0x71F4,0x6703,0xA002,0x7A62,0xA002,0x8D3F,0x6666,0xA016,0xA00A,0xA004,0xA002,0x60E0,0x5349,0xA002,0x6167,0xA002, 0x6094,0x8B6D,0xA006,0xA002,0x8FF4,0xA002,0x86D4,0x6062,0xA002,0x5FBD,0xA002,0x8F89,0x63EE,0xA00A,0xA004,0xA002, 0x7070,0x8C0E,0xA002,0x604D,0xA002,0x5E4C,0x6643,0xA006,0xA002,0x714C,0xA002,0x60F6,0x51F0,0xA002,0x7687,0xA002, 0x7C27,0x8757,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x78FA,0x9EC4,0xA002,0x614C,0xA002,0x8352,0x5E7B,0xA004,0xA002, 0x5BA7,0x6E19,0xA002,0x7165,0xA002,0x8C62,0x7613,0xA00A,0xA004,0xA002,0x559A,0x60A3,0xA002,0x63DB,0xA002,0x7F13, 0x9084,0xA006,0xA002,0x6853,0xA002,0x74B0,0x6B61,0xA002,0x58DE,0xA002,0x6DEE,0x61F7,0xA016,0xA00A,0xA004,0xA002, 0x5F8A,0x69D0,0xA002,0x8BDD,0xA002,0x5316,0x5283,0xA006,0xA002,0x756B,0xA002,0x6ED1,0x733E,0xA002,0x83EF,0xA002, 0x8B41,0x82B1,0xA00A,0xA004,0xA002,0x6237,0x6EEC,0xA002,0x4E92,0xA002,0x8B77,0x552C,0xA000,0xA002,0x864E,0xA000, 0x5F27,0xA0C3,0xA023,0xA001,0xA001,0xA00B,0xA001,0xA004,0xA001,0xA001,0x6E56,0xA002,0x7CCA,0xA002,0x72D0,0x8774, 0xA00A,0xA004,0xA002,0x9B0D,0x846B,0xA002,0x58FC,0xA002,0x745A,0x5FFD,0xA006,0xA002,0x8656,0xA002,0x547C,0x5F8C, 0xA002,0x5019,0xA002,0x5795,0x5474,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x7334,0x4FAF,0xA002,0x5589,0xA002, 0x7EA2,0x5F18,0xA004,0xA002,0x7D18,0x6D2A,0xA002,0x9E3F,0xA002,0x8743,0x70D8,0xA00A,0xA004,0xA002,0x9B28,0x8F70, 0xA002,0x6052,0xA002,0x8861,0x6A6B,0xA006,0xA002,0x4EA8,0xA002,0x54FC,0x6068,0xA002,0x72E0,0xA002,0x5F88,0x75D5, 0xA016,0xA00A,0xA004,0xA002,0x9ED1,0x563F,0xA002,0x8D3A,0xA002,0x9E64,0x8910,0xA006,0xA002,0x8D6B,0xA002,0x6DB8, 0x6CB3,0xA002,0x9602,0xA002,0x8C89,0x76D2,0xA00A,0xA004,0xA002,0x5408,0x4F55,0xA002,0x9FA2,0xA002,0x79BE,0x6838, 0xA006,0xA002,0x83CF,0xA002,0x8377,0x6B31,0xA002,0x5475,0xA002,0x6D69,0x865F,0xA02C,0xA016,0xA00A,0xA004,0xA002, 0x8017,0x597D,0xA002,0x90DD,0xA002,0x6BEB,0x8C6A,0xA006,0xA002,0x568E,0xA002,0x58D5,0x822A,0xA002,0x676D,0xA002, 0x592F,0x6F22,0xA00A,0xA004,0xA002,0x6C57,0x92B2,0xA002,0x608D,0xA002,0x61BE,0x65F1,0xA006,0xA002,0x634D,0xA002, 0x64BC,0x7FF0,0xA002,0x7F55,0xA002,0x558A,0x51FD,0xA016,0xA00A,0xA004,0xA002,0x5BD2,0x6DB5,0xA002,0x5505,0xA002, 0x97E9,0x90AF,0xA006,0xA002,0x61A8,0xA002,0x9163,0x9A87,0xA002,0x5BB3,0xA002,0x4EA5,0x6C26,0xA000,0xA004,0xA002, 0x6D77,0x5B69,0xA000,0x9AB8,0xA001,0xA001,0xA001,0xA012,0xA006,0xA001,0xA001,0xA002,0x54C8,0x904E,0xA006,0xA002, 0x88F9,0xA002,0x679C,0x570B,0xA002,0x90ED,0xA002,0x9505,0x68CD,0xA00A,0xA004,0xA002,0x6EFE,0x8F8A,0xA002,0x528A, 0xA002,0x8D35,0x8DEA,0xA006,0xA002,0x6AC3,0xA002,0x6842,0x7678,0xA002,0x8BE1,0xA002,0x9B3C,0x8F68,0xA159,0xA098, 0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x95FA,0x9F9F,0xA002,0x6B78,0xA002,0x7845,0x73EA,0xA004,0xA002, 0x89C4,0x7470,0xA002,0x901B,0xA002,0x5EE3,0x5149,0xA00A,0xA004,0xA002,0x8D2F,0x704C,0xA002,0x6163,0xA002,0x7F50, 0x9986,0xA006,0xA002,0x7BA1,0xA002,0x89C2,0x51A0,0xA002,0x5B98,0xA002,0x95DC,0x68FA,0xA016,0xA00A,0xA004,0xA002, 0x602A,0x67B4,0xA002,0x4E56,0xA002,0x8902,0x7F63,0xA006,0xA002,0x5BE1,0xA002,0x526E,0x74DC,0xA002,0x98B3,0xA002, 0x96C7,0x56FA,0xA00A,0xA004,0xA002,0x987E,0x6545,0xA002,0x80A1,0xA002,0x8C37,0x9AA8,0xA006,0xA002,0x8831,0xA002, 0x53E4,0x9F13,0xA002,0x59D1,0xA002,0x5B64,0x6CBD,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x4F30,0x7B8D,0xA002,0x5495, 0xA002,0x83C7,0x8F9C,0xA004,0xA002,0x5920,0x8D2D,0xA002,0x69CB,0xA002,0x57A2,0x72D7,0xA00A,0xA004,0xA002,0x830D, 0x6E9D,0xA002,0x52FE,0xA002,0x94A9,0x5171,0xA006,0xA002,0x8D21,0xA002,0x62F1,0x6C5E,0xA002,0x978F,0xA002,0x5F13, 0x5BAE,0xA000,0xA00A,0xA004,0xA002,0x516C,0x8EAC,0xA002,0x4F9B,0xA002,0x9F9A,0x606D,0xA006,0xA002,0x529F,0xA002, 0x653B,0x5DE5,0xA002,0x6897,0xA002,0x803F,0x57C2,0xA02D,0xA001,0xA001,0xA015,0xA009,0xA003,0xA001,0x7FB9,0xA002, 0x5E9A,0xA002,0x66F4,0x8015,0xA006,0xA002,0x8DDF,0xA002,0x6839,0x7ED9,0xA002,0x5404,0xA002,0x7B87,0x94EC,0xA00A, 0xA004,0xA002,0x9694,0x9601,0xA002,0x86E4,0xA002,0x683C,0x845B,0xA006,0xA002,0x9769,0xA002,0x5272,0x7599,0xA002, 0x80F3,0xA002,0x9E3D,0x6208,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x64F1,0x6B4C,0xA002,0x54E5,0xA002,0x544A, 0x7A3F,0xA004,0xA002,0x9550,0x641E,0xA002,0x7CD5,0xA002,0x7F94,0x818F,0xA00A,0xA004,0xA002,0x9AD8,0x768B,0xA002, 0x7BD9,0xA002,0x69D3,0x6E2F,0xA006,0xA002,0x5D17,0xA002,0x7EB2,0x809B,0xA002,0x7F38,0xA002,0x94A2,0x525B,0xA016, 0xA00A,0xA004,0xA002,0x5CA1,0x8D63,0xA002,0x6562,0xA002,0x7A08,0x611F,0xA006,0xA002,0x8D95,0xA002,0x809D,0x7AFF, 0xA002,0x67D1,0xA002,0x687F,0x7518,0xA00A,0xA004,0xA002,0x8677,0x6E89,0xA002,0x84CB,0xA002,0x9499,0x6982,0xA006, 0xA002,0x6539,0xA002,0x8BE5,0x560E,0xA002,0x5676,0xA002,0x5490,0x7F1A,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x5A66, 0x9644,0xA002,0x8BA3,0xA002,0x5BCC,0x8D1F,0xA006,0xA002,0x8179,0xA002,0x7236,0x961C,0xA002,0x4ED8,0xA002,0x5085, 0x8907,0xA00A,0xA004,0xA002,0x8D4B,0x8986,0xA002,0x526F,0xA002,0x8D74,0x8150,0xA006,0xA002,0x5E9C,0xA002,0x8151, 0x812F,0xA002,0x65A7,0xA002,0x91DC,0x982B,0xA000,0xA00A,0xA004,0xA002,0x8F85,0x64AB,0xA002,0x752B,0xA002,0x5F17, 0x88B1,0xA000,0xA002,0x8300,0xA002,0x6DAA,0x6D6E,0xA037,0xA001,0xA001,0xA009,0xA001,0xA001,0xA001,0xA002,0x670D, 0xA002,0x4FD8,0x8659,0xA016,0xA00A,0xA004,0xA002,0x7B26,0x6C1F,0xA002,0x5E45,0xA002,0x8F90,0x62C2,0xA006,0xA002, 0x6276,0xA002,0x5B75,0x819A,0xA002,0x6577,0xA002,0x592B,0x5426,0xA00A,0xA004,0xA002,0x5F7F,0x9CF3,0xA002,0x5949, 0xA002,0x8BBD,0x7F1D,0xA006,0xA002,0x99AE,0xA002,0x9022,0x70FD,0xA002,0x760B,0xA002,0x98CE,0x950B,0xA000,0xA056, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5CF0,0x8702,0xA002,0x6953,0xA002,0x5C01,0x8C50,0xA004,0xA002,0x7CDE,0x61A4, 0xA002,0x5FFF,0xA002,0x4EFD,0x596E,0xA00A,0xA004,0xA002,0x7C89,0x6C7E,0xA002,0x711A,0xA002,0x58B3,0x7EB7,0xA006, 0xA002,0x5206,0xA002,0x96F0,0x5429,0xA002,0x915A,0xA002,0x82AC,0x8D39,0xA016,0xA00A,0xA004,0xA002,0x6CB8,0x5EE2, 0xA002,0x80BA,0xA002,0x5420,0x8BFD,0xA006,0xA002,0x532A,0xA002,0x80A5,0x98DE,0xA002,0x5561,0xA002,0x975E,0x83F2, 0xA00A,0xA004,0xA002,0x653E,0x7EBA,0xA002,0x8BBF,0xA002,0x9AE3,0x59A8,0xA006,0xA002,0x9632,0xA002,0x623F,0x80AA, 0xA002,0x65B9,0xA002,0x82B3,0x574A,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x6CDB,0x996D,0xA002,0x72AF,0xA002,0x8D29, 0x8303,0xA004,0xA002,0x8FD4,0x53CD,0xA002,0x7169,0xA002,0x51E1,0x7E41,0xA00A,0xA004,0xA002,0x9492,0x792C,0xA002, 0x6A0A,0xA002,0x7FFB,0x756A,0xA006,0xA002,0x5E06,0xA002,0x85E9,0x743A,0xA002,0x6CD5,0xA002,0x9600,0x8982,0xA000, 0xA000,0xA004,0xA002,0x4F10,0x7B4F,0xA002,0x7F70,0xA002,0x9AEE,0x8D30,0xA555,0xA428,0xA249,0xA104,0xA0C2,0xA03B, 0xA001,0xA00E,0xA001,0xA001,0xA006,0xA002,0x4E8C,0xA002,0x6E33,0x9975,0xA002,0x723E,0xA002,0x8033,0x5152,0xA016, 0xA00A,0xA004,0xA002,0x800C,0x6069,0xA002,0x997F,0xA002,0x9102,0x904F,0xA006,0xA002,0x6424,0xA002,0x9628,0x60E1, 0xA002,0x5A25,0xA002,0x8BB9,0x989D,0xA00A,0xA004,0xA002,0x774B,0x9E45,0xA002,0x5CE8,0xA002,0x86FE,0x58AE,0xA006, 0xA002,0x60F0,0xA002,0x5241,0x8235,0xA002,0x8DFA,0xA002,0x6735,0x8EB2,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002, 0x579B,0x596A,0xA002,0x591A,0xA002,0x8A83,0x656A,0xA004,0xA002,0x9041,0x76FE,0xA002,0x949D,0xA002,0x56E4,0x987F, 0xA00A,0xA004,0xA002,0x6566,0x8E72,0xA002,0x5678,0xA002,0x58A9,0x5C0D,0xA006,0xA002,0x968A,0xA002,0x5151,0x5806, 0xA002,0x7F0E,0xA002,0x65B7,0x6BB5,0xA016,0xA00A,0xA004,0xA002,0x953B,0x77ED,0xA002,0x7AEF,0xA002,0x5992,0x6E21, 0xA006,0xA002,0x5EA6,0xA002,0x809A,0x9540,0xA002,0x675C,0xA002,0x8D4C,0x7779,0xA00A,0xA004,0xA002,0x5835,0x8BFB, 0xA002,0x7368,0xA002,0x72A2,0x6BD2,0xA006,0xA002,0x7763,0xA002,0x90FD,0x75D8,0xA002,0x9017,0xA002,0x8C46,0x9661, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9B25,0x6296,0xA002,0x515C,0xA002,0x6D1E,0x51CD,0xA004,0xA002,0x75CC,0x4F97, 0xA002,0x68DF,0xA002,0x52D5,0x61C2,0xA00A,0xA004,0xA002,0x8463,0x9F15,0xA002,0x6771,0xA002,0x4E22,0x8BA2,0xA006, 0xA002,0x5B9A,0xA002,0x952D,0x9F0E,0xA002,0x9876,0xA002,0x9489,0x53EE,0xA000,0xA000,0xA000,0xA002,0x76EF,0x4E01, 0xA001,0xA001,0xA014,0xA001,0xA007,0xA001,0xA002,0x758A,0xA002,0x8C0D,0x8FED,0xA006,0xA002,0x8776,0xA002,0x789F, 0x7239,0xA002,0x8DCC,0xA002,0x8C03,0x9493,0xA016,0xA00A,0xA004,0xA002,0x5F14,0x6389,0xA002,0x5201,0xA002,0x51CB, 0x9D70,0xA006,0xA002,0x53FC,0xA002,0x7889,0x6BBF,0xA002,0x6FB1,0xA002,0x5960,0x60E6,0xA00A,0xA004,0xA002,0x5E97, 0x7538,0xA002,0x4F43,0xA002,0x96FB,0x588A,0xA006,0xA002,0x975B,0xA002,0x5178,0x9EDE,0xA002,0x7898,0xA002,0x6EC7, 0x6382,0xA081,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x98A0,0x7F14,0xA002,0x905E,0xA002,0x5F1F,0x5E1D, 0xA004,0xA002,0x7B2C,0x8482,0xA002,0x58AC,0xA002,0x5E95,0x89DD,0xA00A,0xA004,0xA002,0x5AE1,0x7FDF,0xA002,0x6ECC, 0xA002,0x72C4,0x7B1B,0xA006,0xA002,0x6575,0xA002,0x8FEA,0x6EF4,0xA002,0x4F4E,0xA002,0x9684,0x9127,0xA016,0xA00A, 0xA004,0xA002,0x51F3,0x77AA,0xA002,0x7B49,0xA002,0x8C4B,0x71C8,0xA006,0xA002,0x8E6C,0xA002,0x7684,0x6DC2,0xA002, 0x5FB7,0xA002,0x76DC,0x9053,0xA00A,0xA004,0xA002,0x60BC,0x7A3B,0xA002,0x5230,0xA002,0x5C0E,0x79B1,0xA006,0xA002, 0x5CF6,0xA002,0x5012,0x8E48,0xA002,0x6417,0xA002,0x5200,0x6A94,0xA000,0xA014,0xA00A,0xA004,0xA002,0x8569,0x9EE8, 0xA002,0x64CB,0xA002,0x7576,0x86CB,0xA004,0xA002,0x5F48,0x8BDE,0xA002,0x6DE1,0xA002,0x619A,0x4F46,0xA00A,0xA004, 0xA002,0x6C2E,0x65E6,0xA002,0x81BD,0xA002,0x64A3,0x9132,0xA006,0xA002,0x55AE,0xA002,0x4E39,0x64D4,0xA002,0x803D, 0xA000,0x6020,0xA049,0xA001,0xA01C,0xA006,0xA001,0xA001,0xA001,0xA001,0x902E,0xA00A,0xA004,0xA002,0x5F85,0x888B, 0xA002,0x8D37,0xA002,0x4EE3,0x6B86,0xA006,0xA002,0x5E36,0xA002,0x6234,0x50A3,0xA002,0x6B79,0xA002,0x7343,0x5927, 0xA016,0xA00A,0xA004,0xA002,0x6253,0x7629,0xA002,0x8345,0xA002,0x9054,0x642D,0xA006,0xA002,0x9519,0xA002,0x632B, 0x63AA,0xA002,0x6413,0xA002,0x64AE,0x78CB,0xA00A,0xA004,0xA002,0x5BF8,0x5B58,0xA002,0x6751,0xA002,0x7FE0,0x7120, 0xA006,0xA002,0x7CB9,0xA002,0x7601,0x8106,0xA002,0x55FA,0xA002,0x5D14,0x6F3C,0xA056,0xA02A,0xA014,0xA00A,0xA004, 0xA002,0x7AC4,0x7BE1,0xA002,0x8EA5,0xA002,0x4FC3,0x7C07,0xA004,0xA002,0x918B,0x9EA4,0xA002,0x6E4A,0xA002,0x53E2, 0x5F9E,0xA00A,0xA004,0xA002,0x5306,0x56F1,0xA002,0x8525,0xA002,0x8070,0x6B21,0xA006,0xA002,0x8D50,0xA002,0x83BF, 0x6B64,0xA002,0x8BCD,0xA002,0x74F7,0x6148,0xA016,0xA00A,0xA004,0xA002,0x8FAD,0x96CC,0xA002,0x78C1,0xA002,0x8328, 0x75B5,0xA006,0xA002,0x7EF0,0xA002,0x6233,0x8822,0xA002,0x7EAF,0xA002,0x6DF3,0x8123,0xA00A,0xA004,0xA002,0x9187, 0x693F,0xA002,0x6625,0xA002,0x5782,0x9524,0xA006,0xA002,0x6425,0xA002,0x708A,0x5439,0xA002,0x5275,0xA002,0x95EF, 0x5E8A,0xA000,0xA016,0xA00A,0xA004,0xA002,0x5E62,0x7A97,0xA002,0x7621,0xA002,0x4E32,0x5598,0xA006,0xA002,0x8239, 0xA002,0x50B3,0x693D,0xA002,0x7A7F,0xA002,0x5DDD,0x63E3,0xA00A,0xA004,0xA002,0x8655,0x89F8,0xA002,0x6410,0xA002, 0x77D7,0x5132,0xA000,0xA000,0x790E,0xA0C4,0xA04E,0xA001,0xA001,0xA020,0xA00A,0xA001,0xA003,0xA001,0x695A,0xA002, 0x9664,0xA002,0x6EC1,0x96DB,0xA00A,0xA004,0xA002,0x9504,0x8E87,0xA002,0x5EDA,0xA002,0x6AE5,0x9F63,0xA006,0xA002, 0x521D,0xA002,0x81ED,0x919C,0xA002,0x7785,0xA002,0x7EF8,0x4EC7,0xA016,0xA00A,0xA004,0xA002,0x7C4C,0x6101,0xA002, 0x7A20,0xA002,0x8E8A,0x7587,0xA006,0xA002,0x916C,0xA002,0x62BD,0x5BF5,0xA002,0x5D07,0xA002,0x87F2,0x8876,0xA00A, 0xA004,0xA002,0x5145,0x71BE,0xA002,0x65A5,0xA002,0x7FC5,0x8D64,0xA006,0xA002,0x5C3A,0xA002,0x4F88,0x9F7F,0xA002, 0x803B,0xA002,0x9A70,0x5F1B,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x9072,0x6C60,0xA002,0x5319,0xA002, 0x6301,0x7661,0xA004,0xA002,0x55AB,0x79E4,0xA002,0x9A8B,0xA002,0x901E,0x627F,0xA00A,0xA004,0xA002,0x8BDA,0x6F84, 0xA002,0x61F2,0xA002,0x7A0B,0x4E58,0xA006,0xA002,0x5448,0xA002,0x6210,0x6A59,0xA002,0x57CE,0xA002,0x7A31,0x6491, 0xA016,0xA00A,0xA004,0xA002,0x896F,0x8D81,0xA002,0x9673,0xA002,0x6C89,0x5FF1,0xA006,0xA002,0x6668,0xA002,0x5C18, 0x8FB0,0xA002,0x81E3,0xA002,0x90F4,0x6F88,0xA00A,0xA004,0xA002,0x5FB9,0x63A3,0xA002,0x64A4,0xA002,0x64A6,0x8F66, 0xA006,0xA002,0x7092,0xA002,0x8A2C,0x6A14,0xA002,0x6F6E,0xA002,0x5632,0x671D,0xA000,0xA014,0xA00A,0xA004,0xA002, 0x949E,0x6284,0xA002,0x8D85,0xA002,0x5021,0x5531,0xA004,0xA002,0x7545,0x655E,0xA002,0x5EE0,0xA002,0x8178,0x511F, 0xA000,0xA004,0xA002,0x957F,0x5E38,0xA002,0x5C1D,0xA000,0x5834,0xA0C1,0xA053,0xA001,0xA026,0xA010,0xA006,0xA001, 0xA001,0xA002,0x7316,0x660C,0xA004,0xA002,0x98A4,0x9610,0xA002,0x7522,0xA002,0x94F2,0x7F20,0xA00A,0xA004,0xA002, 0x8C17,0x998B,0xA002,0x87EC,0xA002,0x647B,0x6519,0xA006,0xA002,0x8C7A,0xA002,0x67F4,0x62C6,0xA002,0x8BE7,0xA002, 0x5DEE,0x5C94,0xA016,0xA00A,0xA004,0xA002,0x5BDF,0x643D,0xA002,0x78B4,0xA002,0x67E5,0x8336,0xA006,0xA002,0x832C, 0xA002,0x53C9,0x63D2,0xA002,0x8E6D,0xA002,0x5C64,0x6E2C,0xA00A,0xA004,0xA002,0x518C,0x5E82,0xA002,0x7B74,0xA002, 0x5EC1,0x9A32,0xA006,0xA002,0x66F9,0xA002,0x69FD,0x7CD9,0xA002,0x64CD,0xA002,0x85CF,0x6EC4,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x5009,0x8259,0xA002,0x84BC,0xA002,0x71E6,0x61AF,0xA004,0xA002,0x615A,0x6B98,0xA002,0x8836, 0xA002,0x8460,0x9910,0xA00A,0xA004,0xA002,0x8521,0x83DC,0xA002,0x7DB5,0xA002,0x91C7,0x8E29,0xA006,0xA002,0x776C, 0xA002,0x8D22,0x7E94,0xA002,0x6750,0xA002,0x88C1,0x731C,0xA016,0xA00A,0xA004,0xA002,0x64E6,0x6016,0xA002,0x90E8, 0xA002,0x7C3F,0x6B65,0xA006,0xA002,0x5E03,0xA002,0x4E0D,0x57E0,0xA002,0x88DC,0xA002,0x54FA,0x8514,0xA00A,0xA004, 0xA002,0x6355,0x9A73,0xA002,0x6CCA,0xA002,0x6E24,0x818A,0xA006,0xA002,0x8116,0xA002,0x8236,0x5E1B,0xA002,0x4F2F, 0xA002,0x7B94,0x94C2,0xA000,0xA000,0xA00A,0xA004,0xA002,0x640F,0x52C3,0xA002,0x535A,0xA002,0x6CE2,0x94B5,0xA006, 0xA002,0x64A5,0xA002,0x64AD,0x83E0,0xA002,0x73BB,0xA002,0x5E76,0x75C5,0xA001,0xA001,0xA02C,0xA016,0xA00A,0xA004, 0xA002,0x70B3,0x997C,0xA002,0x79C9,0xA002,0x4E19,0x67C4,0xA006,0xA002,0x51B0,0xA002,0x5175,0x64EF,0xA002,0x8CD3, 0xA002,0x6FF1,0x7015,0xA00A,0xA004,0xA002,0x658C,0x5F6C,0xA002,0x765F,0xA002,0x5F46,0x618B,0xA006,0xA002,0x9CD6, 0xA002,0x9336,0x8198,0xA002,0x5F6A,0xA002,0x6A19,0x904D,0xA016,0xA00A,0xA004,0xA002,0x8FAE,0x8FAF,0xA002,0x8FA8, 0xA002,0x535E,0x8B8A,0xA006,0xA002,0x4FBF,0xA002,0x6241,0x8D2C,0xA002,0x7F16,0xA002,0x908A,0x97AD,0xA00A,0xA004, 0xA002,0x965B,0x907F,0xA002,0x81C2,0xA002,0x58C1,0x95E2,0xA006,0xA002,0x5FC5,0xA002,0x5F0A,0x655D,0xA002,0x95ED, 0xA002,0x75FA,0x5E87,0xA000,0xA000,0xA068,0xA000,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x5E63,0x6BD6,0xA002, 0x6BD9,0xA002,0x7562,0x853D,0xA004,0xA002,0x84D6,0x78A7,0xA002,0x5F7C,0xA002,0x7B46,0x9119,0xA00A,0xA004,0xA002, 0x6BD4,0x9F3B,0xA002,0x903C,0xA002,0x8FF8,0x8E66,0xA006,0xA002,0x6CF5,0xA002,0x752D,0x7EF7,0xA002,0x5D29,0xA002, 0x7B28,0x672C,0xA016,0xA00A,0xA004,0xA002,0x82EF,0x5954,0xA002,0x88AB,0xA002,0x7119,0x618A,0xA006,0xA002,0x5907, 0xA002,0x72FD,0x500D,0xA002,0x94A1,0xA002,0x8D1D,0x80CC,0xA00A,0xA004,0xA002,0x8F88,0x5317,0xA002,0x5351,0xA002, 0x60B2,0x7891,0xA006,0xA002,0x76C3,0xA002,0x7206,0x9C8D,0xA002,0x8C79,0xA002,0x66B4,0x62A5,0xA000,0xA000,0xA00A, 0xA004,0xA002,0x62B1,0x5BF6,0xA002,0x9971,0xA002,0x5821,0x4FDD,0xA000,0xA002,0x96F9,0x8584,0xA060,0xA00A,0xA001, 0xA001,0xA001,0xA001,0xA002,0x5265,0xA002,0x8912,0x5305,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x80DE,0x82DE,0xA002, 0x8C24,0xA002,0x508D,0x9551,0xA004,0xA002,0x868C,0x78C5,0xA002,0x68D2,0xA002,0x7ED1,0x8180,0xA00A,0xA004,0xA002, 0x699C,0x6886,0xA002,0x5E6B,0xA002,0x90A6,0x7ECA,0xA006,0xA002,0x8FA6,0xA002,0x534A,0x74E3,0xA002,0x4F34,0xA002, 0x62CC,0x626E,0xA016,0xA00A,0xA004,0xA002,0x7248,0x95C6,0xA002,0x9881,0xA002,0x822C,0x6273,0xA006,0xA002,0x642C, 0xA002,0x73ED,0x6591,0xA002,0x7A17,0xA002,0x62DC,0x8D25,0xA00A,0xA004,0xA002,0x4F70,0x896C,0xA002,0x767E,0xA002, 0x67CF,0x767D,0xA006,0xA002,0x7238,0xA002,0x7F77,0x9738,0xA002,0x58E9,0xA002,0x8019,0x628A,0xA056,0xA02A,0xA014, 0xA00A,0xA004,0xA002,0x9776,0x8DCB,0xA002,0x62D4,0xA002,0x5DF4,0x75A4,0xA004,0xA002,0x516B,0x7B06,0xA002,0x5427, 0xA002,0x53ED,0x6252,0xA00A,0xA004,0xA002,0x634C,0x82AD,0xA002,0x6FB3,0xA002,0x61CA,0x5967,0xA006,0xA002,0x50B2, 0xA002,0x8956,0x7FF1,0xA002,0x71AC,0xA002,0x6556,0x51F9,0xA016,0xA00A,0xA004,0xA002,0x76CE,0x6602,0xA002,0x9AAF, 0xA002,0x6848,0x80FA,0xA006,0xA002,0x5CB8,0xA002,0x6697,0x6309,0xA002,0x4FFA,0xA002,0x5B89,0x6C28,0xA00A,0xA004, 0xA002,0x978D,0x9698,0xA002,0x7231,0xA002,0x7919,0x827E,0xA006,0xA002,0x77EE,0xA002,0x85F9,0x764C,0xA002,0x769A, 0xA002,0x54C0,0x5509,0xA000,0xA000,0xA000,0xA004,0xA002,0x54CE,0x6328,0xA002,0x57C3,0xA002,0x963F,0x554A,0xA1B5, 0xA06D,0xA001,0xA001,0xA001,0xA017,0xA001,0xA001,0xA009,0xA003,0xA001,0x254B,0xA002,0x254A,0xA002,0x2549,0x2548, 0xA006,0xA002,0x2547,0xA002,0x2546,0x2545,0xA002,0x2544,0xA002,0x2543,0x2542,0xA029,0xA015,0xA00A,0xA004,0xA002, 0x2541,0x2540,0xA002,0x253F,0xA002,0x253E,0x253D,0xA005,0xA001,0xA002,0x253B,0x253A,0xA002,0x2539,0xA002,0x2538, 0x2537,0xA009,0xA004,0xA002,0x2536,0x2535,0xA001,0xA002,0x2533,0x2532,0xA006,0xA002,0x2531,0xA002,0x2530,0x252F, 0xA002,0x252E,0xA000,0x252D,0xA015,0xA00A,0xA004,0xA002,0x252B,0x252A,0xA002,0x2529,0xA002,0x2528,0x2527,0xA005, 0xA002,0x2526,0xA000,0x2525,0xA002,0x2523,0xA002,0x2522,0x2521,0xA009,0xA004,0xA002,0x2520,0x251F,0xA002,0x251E, 0xA000,0x251D,0xA006,0xA002,0x251B,0xA002,0x251A,0x2519,0xA002,0x2518,0xA002,0x2517,0x2516,0xA0B7,0xA02D,0xA000, 0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x2515,0x2514,0xA002,0x2513,0xA002,0x2512,0x2511,0xA004,0xA002,0x2510, 0x250F,0xA002,0x250E,0xA002,0x250D,0x250C,0xA00A,0xA004,0xA002,0x250B,0x250A,0xA002,0x2509,0xA002,0x2508,0x2507, 0xA006,0xA002,0x2506,0xA002,0x2505,0x2504,0xA002,0x2503,0xA002,0x2223,0x2501,0xA058,0xA013,0xA001,0xA001,0xA005, 0xA001,0xA001,0xA001,0x3129,0xA006,0xA002,0x3128,0xA002,0x3127,0x3126,0xA002,0x3125,0xA002,0x3124,0x3123,0xA02A, 0xA014,0xA00A,0xA004,0xA002,0x3122,0x3121,0xA002,0x3120,0xA002,0x311F,0x311E,0xA004,0xA002,0x311D,0x311C,0xA002, 0x311B,0xA002,0x311A,0x3119,0xA00A,0xA004,0xA002,0x3118,0x3117,0xA002,0x3116,0xA002,0x3115,0x3114,0xA006,0xA002, 0x3113,0xA002,0x3112,0x3111,0xA002,0x3110,0xA002,0x310F,0x310E,0xA013,0xA00A,0xA004,0xA002,0x310D,0x310C,0xA002, 0x310B,0xA002,0x310A,0x3109,0xA006,0xA002,0x3108,0xA002,0x3107,0x3106,0xA000,0x3105,0xA001,0xA001,0xA002,0x00EA, 0xA002,0x00FC,0x01DC,0xA000,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x01DA,0x01D8,0xA002,0x01D6,0xA002,0x00F9,0x01D4, 0xA004,0xA002,0x00FA,0x016B,0xA002,0x00F2,0xA002,0x01D2,0x00F3,0xA00A,0xA004,0xA002,0x014D,0x00EC,0xA002,0x01D0, 0xA002,0x00ED,0x012B,0xA006,0xA002,0x00E8,0xA002,0x011B,0x00E9,0xA002,0x0113,0xA002,0x00E0,0x01CE,0xA000,0xA000, 0xA000,0xA002,0x00E1,0x0101,0xA067,0xA001,0xA028,0xA001,0xA011,0xA005,0xA001,0xA001,0xA001,0x044F,0xA006,0xA002, 0x044E,0xA002,0x044D,0x044C,0xA002,0x044B,0xA002,0x044A,0x0449,0xA00A,0xA004,0xA002,0x0448,0x0447,0xA002,0x0446, 0xA002,0x0445,0x0444,0xA006,0xA002,0x0443,0xA002,0x0442,0x0441,0xA002,0x0440,0xA002,0x043F,0x043E,0xA020,0xA016, 0xA00A,0xA004,0xA002,0x043D,0x043C,0xA002,0x043B,0xA002,0x043A,0x0439,0xA006,0xA002,0x0438,0xA002,0x0437,0x0436, 0xA002,0x0451,0xA002,0x0435,0x0434,0xA000,0xA004,0xA002,0x0433,0x0432,0xA002,0x0431,0xA000,0x0430,0xA008,0xA001, 0xA001,0xA002,0x042F,0xA002,0x042E,0x042D,0xA00A,0xA004,0xA002,0x042C,0x042B,0xA002,0x042A,0xA002,0x0429,0x0428, 0xA006,0xA002,0x0427,0xA002,0x0426,0x0425,0xA002,0x0424,0xA002,0x0423,0x0422,0xA000,0xA000,0xA000,0xA014,0xA00A, 0xA004,0xA002,0x0421,0x0420,0xA002,0x041F,0xA002,0x041E,0x041D,0xA004,0xA002,0x041C,0x041B,0xA002,0x041A,0xA002, 0x0419,0x0418,0xA00A,0xA004,0xA002,0x0417,0x0416,0xA002,0x0401,0xA002,0x0415,0x0414,0xA006,0xA002,0x0413,0xA002, 0x0412,0x0411,0xA000,0x0410,0xA1CA,0xA0FF,0xA068,0xA046,0xA001,0xA026,0xA010,0xA006,0xA001,0xA001,0xA002,0x03C9, 0x03C8,0xA004,0xA002,0x03C7,0x03C6,0xA002,0x03C5,0xA002,0x03C4,0x03C3,0xA00A,0xA004,0xA002,0x03C1,0x03C0,0xA002, 0x03BF,0xA002,0x03BE,0x03BD,0xA006,0xA002,0x03BC,0xA002,0x03BB,0x03BA,0xA002,0x03B9,0xA002,0x03B8,0x03B7,0xA00E, 0xA00A,0xA004,0xA002,0x03B6,0x03B5,0xA002,0x03B4,0xA002,0x03B3,0x03B2,0xA000,0xA000,0x03B1,0xA006,0xA001,0xA001, 0xA002,0x03A9,0x03A8,0xA006,0xA002,0x03A7,0xA002,0x03A6,0x03A5,0xA002,0x03A4,0xA001,0x03A1,0xA000,0xA000,0xA012, 0xA009,0xA003,0xA001,0x039F,0xA002,0x039E,0xA002,0x039D,0x039C,0xA003,0xA001,0x039A,0xA002,0x0399,0xA002,0x0398, 0x0397,0xA00A,0xA004,0xA002,0x0396,0x0395,0xA002,0x0394,0xA002,0x0393,0x0392,0xA000,0xA000,0x0391,0xA001,0xA03E, 0xA012,0xA001,0xA005,0xA001,0xA001,0xA001,0x30F6,0xA006,0xA002,0x30F5,0xA002,0x30F4,0x30F3,0xA002,0x30F2,0xA002, 0x30F1,0x30F0,0xA016,0xA00A,0xA004,0xA002,0x30EF,0x30EE,0xA002,0x30ED,0xA002,0x30EC,0x30EB,0xA006,0xA002,0x30EA, 0xA002,0x30E9,0x30E8,0xA002,0x30E7,0xA002,0x30E6,0x30E5,0xA00A,0xA004,0xA002,0x30E4,0x30E3,0xA002,0x30E2,0xA002, 0x30E1,0x30E0,0xA006,0xA002,0x30DF,0xA002,0x30DE,0x30DD,0xA002,0x30DC,0xA002,0x30DB,0x30DA,0xA02C,0xA016,0xA00A, 0xA004,0xA002,0x30D9,0x30D8,0xA002,0x30D7,0xA002,0x30D6,0x30D5,0xA006,0xA002,0x30D4,0xA002,0x30D3,0x30D2,0xA002, 0x30D1,0xA002,0x30D0,0x30CF,0xA00A,0xA004,0xA002,0x30CE,0x30CD,0xA002,0x30CC,0xA002,0x30CB,0x30CA,0xA006,0xA002, 0x30C9,0xA002,0x30C8,0x30C7,0xA002,0x30C6,0xA002,0x30C5,0x30C4,0xA016,0xA00A,0xA004,0xA002,0x30C3,0x30C2,0xA002, 0x30C1,0xA002,0x30C0,0x30BF,0xA006,0xA002,0x30BE,0xA002,0x30BD,0x30BC,0xA002,0x30BB,0xA002,0x30BA,0x30B9,0xA00A, 0xA004,0xA002,0x30B8,0x30B7,0xA002,0x30B6,0xA002,0x30B5,0x30B4,0xA006,0xA002,0x30B3,0xA002,0x30B2,0x30B1,0xA002, 0x30B0,0xA002,0x30AF,0x30AE,0xA01F,0xA000,0xA000,0xA000,0xA014,0xA00A,0xA004,0xA002,0x30AD,0x30AC,0xA002,0x30AB, 0xA002,0x30AA,0x30A9,0xA004,0xA002,0x30A8,0x30A7,0xA002,0x30A6,0xA002,0x30A5,0x30A4,0xA000,0xA004,0xA002,0x30A3, 0x30A2,0xA000,0x30A1,0xA095,0xA03F,0xA013,0xA001,0xA006,0xA001,0xA001,0xA002,0x3093,0x3092,0xA006,0xA002,0x3091, 0xA002,0x3090,0x308F,0xA002,0x308E,0xA002,0x308D,0x308C,0xA016,0xA00A,0xA004,0xA002,0x308B,0x308A,0xA002,0x3089, 0xA002,0x3088,0x3087,0xA006,0xA002,0x3086,0xA002,0x3085,0x3084,0xA002,0x3083,0xA002,0x3082,0x3081,0xA00A,0xA004, 0xA002,0x3080,0x307F,0xA002,0x307E,0xA002,0x307D,0x307C,0xA006,0xA002,0x307B,0xA002,0x307A,0x3079,0xA002,0x3078, 0xA002,0x3077,0x3076,0xA02A,0xA014,0xA00A,0xA004,0xA002,0x3075,0x3074,0xA002,0x3073,0xA002,0x3072,0x3071,0xA004, 0xA002,0x3070,0x306F,0xA002,0x306E,0xA002,0x306D,0x306C,0xA00A,0xA004,0xA002,0x306B,0x306A,0xA002,0x3069,0xA002, 0x3068,0x3067,0xA006,0xA002,0x3066,0xA002,0x3065,0x3064,0xA002,0x3063,0xA002,0x3062,0x3061,0xA016,0xA00A,0xA004, 0xA002,0x3060,0x305F,0xA002,0x305E,0xA002,0x305D,0x305C,0xA006,0xA002,0x305B,0xA002,0x305A,0x3059,0xA002,0x3058, 0xA002,0x3057,0x3056,0xA00A,0xA004,0xA002,0x3055,0x3054,0xA002,0x3053,0xA002,0x3052,0x3051,0xA006,0xA002,0x3050, 0xA002,0x304F,0x304E,0xA002,0x304D,0xA002,0x304C,0x304B,0xA000,0xA000,0xA000,0xA00A,0xA004,0xA002,0x304A,0x3049, 0xA002,0x3048,0xA002,0x3047,0x3046,0xA004,0xA002,0x3045,0x3044,0xA002,0x3043,0xA002,0x3042,0x3041,0xA0CF,0xA0B3, 0xA009,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xFFE3,0xA056,0xA02A,0xA014,0xA00A,0xA004,0xA002,0xFF5D, 0xFF5C,0xA002,0xFF5B,0xA002,0xFF5A,0xFF59,0xA004,0xA002,0xFF58,0xFF57,0xA002,0xFF56,0xA002,0xFF55,0xFF54,0xA00A, 0xA004,0xA002,0xFF53,0xFF52,0xA002,0xFF51,0xA002,0xFF50,0xFF4F,0xA006,0xA002,0xFF4E,0xA002,0xFF4D,0xFF4C,0xA002, 0xFF4B,0xA002,0xFF4A,0xFF49,0xA016,0xA00A,0xA004,0xA002,0xFF48,0xFF47,0xA002,0xFF46,0xA002,0xFF45,0xFF44,0xA006, 0xA002,0xFF43,0xA002,0xFF42,0xFF41,0xA002,0xFF40,0xA002,0xFF3F,0xFF3E,0xA00A,0xA004,0xA002,0xFF3D,0xFF3C,0xA002, 0xFF3B,0xA002,0xFF3A,0xFF39,0xA006,0xA002,0xFF38,0xA002,0xFF37,0xFF36,0xA002,0xFF35,0xA002,0xFF34,0xFF33,0xA02A, 0xA014,0xA00A,0xA004,0xA002,0xFF32,0xFF31,0xA002,0xFF30,0xA002,0xFF2F,0xFF2E,0xA004,0xA002,0xFF2D,0xFF2C,0xA002, 0xFF2B,0xA002,0xFF2A,0xFF29,0xA00A,0xA004,0xA002,0xFF28,0xFF27,0xA002,0xFF26,0xA002,0xFF25,0xFF24,0xA006,0xA002, 0xFF23,0xA002,0xFF22,0xFF21,0xA002,0xFF20,0xA002,0xFF1F,0xFF1E,0xA015,0xA009,0xA004,0xA002,0xFF1D,0xFF1C,0xA002, 0xFF1B,0xA001,0xFF19,0xA006,0xA002,0xFF18,0xA002,0xFF17,0xFF16,0xA002,0xFF15,0xA002,0xFF14,0xFF13,0xA00A,0xA004, 0xA002,0xFF12,0xFF11,0xA002,0xFF10,0xA002,0xFF0F,0xFF0E,0xA005,0xA001,0xA002,0xFF0C,0xFF0B,0xA002,0xFF0A,0xA002, 0xFF09,0xFF08,0xA012,0xA000,0xA000,0xA000,0xA00A,0xA004,0xA002,0xFF07,0xFF06,0xA002,0xFF05,0xA002,0xFFE5,0xFF03, 0xA000,0xA002,0xFF02,0xFF01,0xA001,0xA001,0xA001,0xA001,0xA001,0xA001,0xA002,0x216B,0x216A,0xA092,0xA000,0xA051, 0xA027,0xA014,0xA00A,0xA004,0xA002,0x2169,0x2168,0xA002,0x2167,0xA002,0x2166,0x2165,0xA004,0xA002,0x2164,0x2163, 0xA002,0x2162,0xA002,0x2161,0x2160,0xA007,0xA001,0xA002,0x3229,0xA002,0x3228,0x3227,0xA006,0xA002,0x3226,0xA002, 0x3225,0x3224,0xA002,0x3223,0xA002,0x3222,0x3221,0xA014,0xA008,0xA003,0xA000,0x3220,0xA001,0xA002,0x2469,0x2468, 0xA006,0xA002,0x2467,0xA002,0x2466,0x2465,0xA002,0x2464,0xA002,0x2463,0x2462,0xA00A,0xA004,0xA002,0x2461,0x2460, 0xA002,0x2487,0xA002,0x2486,0x2485,0xA006,0xA002,0x2484,0xA002,0x2483,0x2482,0xA002,0x2481,0xA002,0x2480,0x247F, 0xA02A,0xA014,0xA00A,0xA004,0xA002,0x247E,0x247D,0xA002,0x247C,0xA002,0x247B,0x247A,0xA004,0xA002,0x2479,0x2478, 0xA002,0x2477,0xA002,0x2476,0x2475,0xA00A,0xA004,0xA002,0x2474,0x249B,0xA002,0x249A,0xA002,0x2499,0x2498,0xA006, 0xA002,0x2497,0xA002,0x2496,0x2495,0xA002,0x2494,0xA002,0x2493,0x2492,0xA000,0xA00A,0xA004,0xA002,0x2491,0x2490, 0xA002,0x248F,0xA002,0x248E,0x248D,0xA006,0xA002,0x248C,0xA002,0x248B,0x248A,0xA002,0x2489,0xA000,0x2488,0xA014, 0xA001,0xA001,0xA001,0xA005,0xA001,0xA001,0xA001,0x3013,0xA006,0xA002,0x2193,0xA002,0x2191,0x2190,0xA002,0x2192, 0xA002,0x203B,0x25B2,0xA054,0xA029,0xA013,0xA009,0xA004,0xA002,0x25B3,0x25A0,0xA001,0xA002,0x25C6,0x25C7,0xA004, 0xA002,0x25CE,0x25CF,0xA002,0x25CB,0xA002,0x2605,0x2606,0xA00A,0xA004,0xA002,0x2116,0x00A7,0xA002,0x2030,0xA002, 0xFFE1,0xFFE0,0xA006,0xA002,0x00A4,0xA002,0xFF04,0x2103,0xA002,0x301E,0xA002,0x2032,0x00B0,0xA016,0xA00A,0xA004, 0xA002,0x2640,0x2642,0xA002,0x2234,0xA002,0x2235,0x221E,0xA006,0xA002,0x2267,0xA002,0x2266,0x226F,0xA002,0x226E, 0xA002,0x2260,0x221D,0xA00A,0xA004,0xA002,0x223D,0x2248,0xA002,0x2252,0xA002,0x2261,0x222E,0xA006,0xA002,0x222B, 0xA002,0x2609,0x2312,0xA002,0x2220,0xA001,0x22A5,0xA02C,0xA016,0xA00A,0xA004,0xA002,0x221A,0x2237,0xA002,0x2208, 0xA002,0x2229,0x222A,0xA006,0xA002,0x220F,0xA002,0x2211,0x2228,0xA002,0x2227,0xA002,0xFF1A,0x00F7,0xA00A,0xA004, 0xA002,0x00D7,0x00B1,0xA002,0x3011,0xA002,0x3010,0x3017,0xA006,0xA002,0x3016,0xA002,0x300F,0x300E,0xA002,0x300D, 0xA002,0x300C,0x300B,0xA016,0xA00A,0xA004,0xA002,0x300A,0x3009,0xA002,0x3008,0xA002,0x3015,0x3014,0xA006,0xA002, 0x201D,0xA002,0x201C,0x2019,0xA002,0x2018,0xA002,0x2026,0x2225,0xA00A,0xA004,0xA002,0xFF5E,0xFF0D,0xA002,0x3005, 0xA002,0x3003,0x2025,0xA006,0xA002,0x02C7,0xA002,0x02C9,0x30FB,0xA002,0x3002,0xA002,0x3001,0x3000, }; // gb2312_to_ucs2_elements const TConvFlatTree gb2312_to_ucs2 = { 0xA1A1, // min key 0xF7FE, // max key 0xA000, // links space start 0xEFFF, // links space end gb2312_to_ucs2_numelems, // number of elements (treeval_t *)&gb2312_to_ucs2_elements // elements }; // gb2312_to_ucs2 syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/generic_types.h0000755000373300037200000000774612424517753030023 0ustar00nightlyallusers00000000000000/* generic types to avoid int size dependencies */ /* ============================================ */ /* NOTE: this file is part of the mod_sysync source files. */ /* NOTE: As this file should work for all kind of plain C compilers * comments with double slashes "//" must be avoided !! */ #ifndef GENERIC_TYPES_H #define GENERIC_TYPES_H #ifdef HAVE_CONFIG_H # include #endif #if defined(HAVE_STDINT_H) # include #endif #ifndef __WORDSIZE /* 64 platforms should have this defined, so assume that */ /* platforms without the define are 32 bit. */ # define __WORDSIZE 32 #endif #ifdef __cplusplus namespace sysync { #endif #if defined(HAVE_STDINT_H) typedef uint64_t uInt64; typedef int64_t sInt64; typedef uint32_t uInt32; typedef int32_t sInt32; typedef uint16_t uInt16; typedef int16_t sInt16; typedef uint8_t uInt8; typedef int8_t sInt8; typedef uintptr_t uIntPtr; typedef intptr_t sIntPtr; typedef uintptr_t bufferIndex; /* index into app buffers (small platforms may have 16bit here) */ typedef uintptr_t stringIndex; /* index into string (small platforms may have 16bit here) */ typedef uintptr_t stringSize; /* size of a string object */ typedef uintptr_t memSize; /* size of a memory buffer */ #else /* defined size types */ /* - integers */ #ifdef _MSC_VER typedef unsigned __int64 uInt64; typedef signed __int64 sInt64; #else typedef unsigned long long uInt64; typedef signed long long sInt64; #endif /* machine size integer, at least 32 bits */ typedef unsigned long uIntArch; typedef signed long sIntArch; /* TODO, FIXME %%%% for now, we need uInt32 to be 64bit actually */ /*#define UINT32_HAS_64BITS_ON_ARCH64 1 */ #if defined(UINT32_HAS_64BITS_ON_ARCH64) || defined(__PALM_OS__) || (__WORDSIZE < 32) /* must use long to get a 32bit int (but gets 64bit in 64-bit architectures) */ typedef unsigned long uInt32; typedef signed long sInt32; #ifdef UINT32_HAS_64BITS_ON_ARCH64 #warning "%%% UINT32_HAS_64BITS_ON_ARCH64 - which means that uInt32 is really 64bit: UGLY & DANGEROUS, please be careful" #endif #else /* according to the ILP32/LP64 std for all other platforms, int is 32bit (and long is 64bit) */ typedef unsigned int uInt32; typedef signed int sInt32; #endif typedef unsigned short uInt16; typedef signed short sInt16; typedef unsigned char uInt8; typedef signed char sInt8; #if __WORDSIZE == 64 typedef unsigned long long uIntPtr; typedef signed long long sIntPtr; #else typedef unsigned long uIntPtr; typedef signed long sIntPtr; #endif /* - application integers */ typedef uIntArch bufferIndex; /* index into app buffers (small platforms may have 16bit here) */ typedef uIntArch stringIndex; /* index into string (small platforms may have 16bit here) */ typedef uIntArch stringSize; /* size of a string object */ typedef uIntArch memSize; /* size of a memory buffer */ #endif /* HAVE_STDINT_H */ /* undefined size types */ /* - application chars & pointers */ typedef char appChar; typedef char *appCharP; typedef const char *cAppCharP; /* - application bool */ #ifdef __cplusplus typedef bool appBool; /* Just define application-specific true and false constants */ #define appFalse false #define appTrue true #else /* we have no appBool in C, as C++/C mixture could cause bad */ /* surprises if types were differently defined in C and C++ */ /* Just define application-specific true and false constants */ #define appFalse 0 #define appTrue 1 #endif /* - application pointers */ typedef void * appPointer; typedef const void * cAppPointer; /* - bytes, byte pointers */ /* Note: gcc does not like using "typedef uInt8 *UInt8P" for some strange reason */ typedef uInt8 *uInt8P; typedef const uInt8 *cUInt8P; /* - Context/Version variables */ typedef struct ContextType *CContext; typedef unsigned long CVersion; /* - ssize_t is not predefined for Windows CW or EVC */ #if defined _WIN32 && (!defined _MSC_VER || defined WINCE) typedef sInt32 ssize_t; #endif #ifdef __cplusplus } // namespace #endif #endif /* GENERIC_TYPES_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/lineartime.cpp0000755000373300037200000002631412424517753027637 0ustar00nightlyallusers00000000000000/* * File: lineartime.c * * Author: Lukas Zeller (luz@plan44.ch) * * conversion from/to linear time scale. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-04-14 : luz : created from pascal source (plani.ch) * */ #include "prefix_file.h" #include "sync_include.h" #include "lineartime.h" #include "timezones.h" #if defined(SYSYNC_TOOL) #include "syncappbase.h" // for CONSOLEPRINTF #include "vtimezone.h" // for CONSOLEPRINTF #endif namespace sysync { // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL // convert between different time formats and zones int timeConv(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" time []")); CONSOLEPRINTF((" Convert between time zone representations:")); CONSOLEPRINTF((" special input zone names: ")); CONSOLEPRINTF((" - \"now\" : input is current system time (no required)")); CONSOLEPRINTF((" - \"floating\" : floating time (when no zone from ISO8601 input")); CONSOLEPRINTF((" - \"vtimezone\" : output zone as VTIMEZONE")); return EXIT_SUCCESS; } // check for argument if (argc<2 || argc>3) { CONSOLEPRINTF(("2 or 3 arguments required")); return EXIT_FAILURE; } // mode string inzone,outzone,s,z; // internal representation lineartime_t intime; sInt16 minOffs; timecontext_t incontext,outcontext; GZones zones; // get input mode inzone=argv[0]; outzone=argv[1]; // check special "now" case if (strucmp(inzone.c_str(),"now")==0) { // input time is current time in system zone incontext = TCTX_SYSTEM; intime = getSystemNowAs(incontext,&zones); } else { // get input context from name (internal or olson) if (!TimeZoneNameToContext(inzone.c_str(),incontext,&zones, true)) incontext=TCTX_UNKNOWN; // input time from 3rd argument if (argc!=3) { CONSOLEPRINTF(("input time required as 3rd argument")); return EXIT_FAILURE; } // try to parse as ISO8601 timecontext_t inpctx; uInt16 n=ISO8601StrToTimestamp(argv[2],intime,inpctx); if (n==0 || argv[2][n]!=0) { // no ISO, read as lineartime inpctx=TCTX_UNKNOWN; n=StrToLongLong(argv[2],intime); if (n==0) { CONSOLEPRINTF(("input time must be either ISO8601 or decimal lineartime units")); return EXIT_FAILURE; } } if (!TCTX_IS_UNKNOWN(inpctx)) incontext=inpctx; } // get output context if (strucmp(outzone.c_str(),"vtimezone")==0) { // show input time zone as VTIMEZONE and DAYLIGHT (for current date) intime = getSystemNowAs(incontext,&zones); internalToVTIMEZONE(incontext,z,&zones); CONSOLEPRINTF(("Input time zone represented as VTIMEZONE :\n\nBEGIN:VTIMEZONE\n%sEND:VTIMEZONE\n",z.c_str())); timecontext_t stdoffs; ContextToTzDaylight(incontext,intime,z,stdoffs,&zones); s.erase(); ContextToISO8601StrAppend(s, stdoffs, true); CONSOLEPRINTF(("Input time zone represented as TZ/DAYLIGHT :\n\nTZ:%s\nDAYLIGHT:%s\n",s.c_str(),z.c_str())); } else if (!TimeZoneNameToContext(outzone.c_str(),outcontext,&zones, true)) outcontext=TCTX_UNKNOWN; // now show CONSOLEPRINTF(("")); // - input TimestampToISO8601Str(s, intime, incontext, true, true); TimeZoneContextToName(incontext, z, &zones); TzResolveToOffset(incontext, minOffs, intime, false, &zones); CONSOLEPRINTF(("Input : %-25s (%+03hd:%02hd - '%s')", s.c_str(), minOffs/MinsPerHour, abs(minOffs)%MinsPerHour, z.c_str())); // - convert to output if (!TzConvertTimestamp(intime,incontext,outcontext,&zones)) { CONSOLEPRINTF(("input zone cannot be converted to output zone")); return EXIT_FAILURE; } else { // - input TimestampToISO8601Str(s, intime, outcontext, true, true); TimeZoneContextToName(outcontext, z, &zones); TzResolveToOffset(outcontext, minOffs, intime, false, &zones); CONSOLEPRINTF(("Output : %-25s (%+03hd:%02hd - '%s')", s.c_str(), minOffs/MinsPerHour, abs(minOffs)%MinsPerHour, z.c_str())); } return EXIT_SUCCESS; } // timeConv #endif // SYSYNC_TOOL #ifndef PLATFORM_LROUND // use generic implementation of lround static sInt32 lround(double x) { sInt32 l; l=(sInt32)(x+0.5); return l; } #endif #ifndef PLATFORM_TRUNC // use generic implementation of trunc static double trunc(double x) { sInt64 ll; ll=(sInt64)(x); return (double)ll; } #endif #ifndef PLATFORM_DATE2LINEARDATE // helper: Returns the biggest integer smaller than x static sInt32 lfloor(double x) { #if ( defined __MACH__ && defined __GNUC__ ) || defined _MSC_VER // XCode or Visual Studio if (x<0) x= x-1; return lround( x-0.5 ); #else return (sInt32)floor( x ); #endif } // lfloor // convert date to linear date (generic version using our internal scale) /* procedure calcEphTime(year:integer;month,day:byte;hour:single;var julDat:double); { Berechnet Julianisches Datum aus Weltzeit } */ lineardate_t date2lineardate(sInt16 aYear, sInt16 aMonth, sInt16 aDay) { // use custom algorithm that goes back to year -4712... /* const MinYear= -4712; */ const sInt32 MinYear = -4712; /* var a,b:integer; */ sInt32 a,b; /* if aMonth<3 then begin year:=year-1; aMonth:=aMonth+12; end; */ if (aMonth<3) { aYear--; aMonth+=12; } /* if (aYear<1582) or ((aYear=1582) and (aMonth<10)) or ((aYear=1582) and (aMonth=10) and (aDay<15)) */ if ( aYear<1582 || (aYear==1582 && aMonth<10) || (aYear==1582 && aMonth==10 && aDay<15) ) { // julian /* then b:=0 { julianisch } */ b=0; } else { // gregorian /* else begin a:=floor(aYear/100); b:=2-a+floor(a/4) end; { gregorianisch } */ a=lfloor(aYear/100); b=2-a+lfloor(a/4); } // now calc julian date /*JulDat:=floor(365.25*(aYear-minYear)+1E-6)+round(30.6*(aMonth-3))+aDay+b+58.5; JulDat:=JulDat+hour/24; */ return( (lfloor(365.25*(aYear-MinYear)+1E-6)+lround(30.6*(aMonth-3))+aDay+b+59) - linearDateOriginOffset // apply offset used for this target platform ); } // date2lineardate #endif // PLATFORM_DATE2LINEARDATE // convert date to linear time lineartime_t date2lineartime(sInt16 aYear, sInt16 aMonth, sInt16 aDay) { return date2lineardate(aYear,aMonth,aDay) * linearDateToTimeFactor; } // date2lineartime // convert time to linear time lineartime_t time2lineartime(sInt16 aHour, sInt16 aMinute, sInt16 aSecond, sInt16 aMS) { lineartime_t ti = ((((lineartime_t)aHour)*60 + (lineartime_t)aMinute)*60 + (lineartime_t)aSecond)*secondToLinearTimeFactor; if (secondToLinearTimeFactor==1000) ti+=aMS; return ti; } // time2lineartime // convert lineardate to weekday // 0=sunday, 1=monday ... 6=saturday sInt16 lineardate2weekday(lineardate_t aLinearDate) { return (aLinearDate+linearDateOriginWeekday) % 7; } // lineardate2weekday // convert lineartime to weekday // 0=sunday, 1=monday ... 6=saturday sInt16 lineartime2weekday(lineartime_t aLinearTime) { // juldat seems to be sunday-based :-) return lineardate2weekday(aLinearTime / linearDateToTimeFactor); } // lineardate2weekday // get number of days in a month sInt16 getMonthDays(lineardate_t aLinearDate) { sInt16 y,m,d; lineardate_t ld; // get year and month of given date lineardate2date(aLinearDate,&y,&m,&d); // get first of this month ld = date2lineardate(y,m,1); // calculate next month m++; if (m>12) { m=1; y++; } // return difference between 1st of current and 1st of next month = number of days in month return date2lineardate(y,m,1) - ld; } // getMonthDays #ifndef PLATFORM_LINEARDATE2DATE // convert lineardate to year/month/day /* procedure calcDat(zeitZone,julDat:double;var year:integer;var month,day,hour,min:byte;var sec:single); { Berechnet das Kalenderdatum und Weltzeit aus Julianischem Datum } */ void lineardate2date(lineardate_t aLinearDate,sInt16 *aYearP, sInt16 *aMonthP, sInt16 *aDayP) { // custom algorithm /* var JD0,JD,C,E:double; B,D,F:integer; hh:single; */ double C,E; sInt32 B,D,F; // apply offset correction aLinearDate+=linearDateOriginOffset; // no time, no "correction" for date change at noon /* JD:=julDat+zeitZone/24; JD0:=sInt32(Jd+0.5); */ /* if JD0<2299161 then begin B:=0; C:=JD0+1524; end else begin B:=trunc((JD0-1867216.25)/36524.25); C:=Jd0+(B-trunc(B/4))+1525.0; end; */ if (aLinearDate<2299161) { B=0; C=aLinearDate+1524; } else { B=(sInt32)(trunc((aLinearDate-1867216.25)/36524.25)); C=aLinearDate+(B-trunc((double)B/4))+1525.0; } /* D:=trunc((C-122.1)/365.25); E:=365.0*D+trunc(D/4); F:=trunc((C-E)/30.6001); day:=trunc(C-E+0.5)-trunc(30.6001*F); month:=F-1-12*trunc(F/14); year:=D-4715-trunc((7+month)/10); */ D=(sInt32)(trunc((C-122.1)/365.25)); E=365.0*D+trunc((double)D/4); F=(sInt32)(trunc((C-E)/30.6001)); // return date sInt16 month = (sInt16)(F-1-12*trunc((double)F/14)); if (aDayP) *aDayP=(sInt16)(trunc(C-E+0.5)-trunc(30.6001*F)); if (aMonthP) *aMonthP=month; if (aYearP) *aYearP=(sInt16)(D-4715-trunc((double)(7+month)/10.0)); // no time /* hh:=24*(JD+0.5-JD0); hour:=trunc(hh); hh:=(hh-hour)*60; min:=trunc(hh); hh:=(hh-min)*60; sec:=trunc(hh); */ } // lineardate2date #endif // PLATFORM_LINEARDATE2DATE // convert lineartime to year/month/day void lineartime2date(lineartime_t aLinearTime, sInt16 *aYearP, sInt16 *aMonthP, sInt16 *aDayP) { lineardate2date(lineartime2dateonly(aLinearTime), aYearP, aMonthP, aDayP); } // lineartime2date // convert lineartime to h,m,s,ms void lineartime2time(lineartime_t aLinearTime, sInt16 *aHourP, sInt16 *aMinP, sInt16 *aSecP, sInt16 *aMSP) { if (aLinearTime<0) { // negative time, create wrap around to make sure time remains positive aLinearTime = lineartime2timeonly(aLinearTime); } if (secondToLinearTimeFactor==1) { // no sub-seconds if (aMSP) *aMSP = 0; } else { // we have sub-seconds if (aMSP) *aMSP = aLinearTime % secondToLinearTimeFactor; aLinearTime /= secondToLinearTimeFactor; } if (aSecP) *aSecP = aLinearTime % 60; aLinearTime /= 60; if (aMinP) *aMinP = aLinearTime % 60; aLinearTime /= 60; if (aHourP) *aHourP = aLinearTime % 24; // to make sure we don't convert date part } // lineartime2time // convert seconds to linear time lineartime_t seconds2lineartime(sInt32 aSeconds) { return aSeconds*secondToLinearTimeFactor; } // seconds2lineartime // convert linear time to seconds sInt32 lineartime2seconds(lineartime_t aLinearTime) { return aLinearTime/secondToLinearTimeFactor; } // lineartime2seconds // get time-only part of a linear time lineartime_t lineartime2timeonly(lineartime_t aLinearTime) { //return aLinearTime % linearDateToTimeFactor; return aLinearTime-lineartime2dateonlyTime(aLinearTime); } // lineartime2timeonly // get date-only part of a linear time lineardate_t lineartime2dateonly(lineartime_t aLinearTime) { return aLinearTime/linearDateToTimeFactor - (aLinearTime<0 ? 1 : 0); } // lineartime2dateonly // get date-only part of a linear time, in lineartime_t units lineartime_t lineartime2dateonlyTime(lineartime_t aLinearTime) { lineartime_t ts = lineartime2dateonly(aLinearTime); ts *= linearDateToTimeFactor; return ts; } // lineartime2dateonlyTime } // namespace sysync /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/lineartime.h0000755000373300037200000001621312424517753027301 0ustar00nightlyallusers00000000000000/* * File: lineartime.h * * Author: Lukas Zeller (luz@plan44.ch) * * conversion from/to linear time scale. * * Copyright (c) 2002-2011 by Synthesis AG + plan44.ch * * 2002-04-14 : luz : created from pascal source (plani.ch) * */ #ifndef LINEARTIME_H #define LINEARTIME_H #include "prefix_file.h" #include "generic_types.h" #ifndef PLATFORM_LINEARTIMEDEF // Standard lineartime_t definition as 64bit integer, // in milliseconds since -4712-01-01 00:00:00 // -------------------------------------------------- #ifdef __cplusplus namespace sysync { #endif // Linear date and time types typedef sInt32 lineardate_t; typedef sInt64 lineartime_t; // max and min constants const lineartime_t noLinearTime = 0x0; ///< undefined lineartime value #ifdef _MSC_VER const lineartime_t maxLinearTime = 0x7FFFFFFFFFFFFFFFi64; ///< maximum future lineartime (signed 64 bit) #else const lineartime_t maxLinearTime = 0x7FFFFFFFFFFFFFFFLL; ///< maximum future lineartime (signed 64 bit) #endif // date origin definition relative to algorithm's origin -4712-01-01 00:00:00 const lineardate_t linearDateOriginOffset=0; ///< offset between algorithm's origin (-4712-01-01) and lineardate_t's zero const sInt16 linearDateOriginWeekday=1; ///< weekday of lineartime origin: Monday // scaling of lineartime relative to seconds const lineartime_t secondToLinearTimeFactor = 1000; ///< how many lineartime_t units make a seconds const lineartime_t nanosecondsPerLinearTime = 1000000; ///< duration of one lineartime_t in nanoseconds #ifdef __cplusplus } // namespace sysync #endif #endif // not PLATFORM_LINEARTIMEDEF // the platform specific definitions of the time support // Note: if PLATFORM_LINEARTIMEDEF is set, this must define lineartime_t and related // constants. // If it defines PLATFORM_LINEARDATE2DATE etc., // implementation of these routines must be implemented platform-specific as well. #include "platform_time.h" #ifdef __cplusplus namespace sysync { #endif #ifdef SYSYNC_TOOL // convert between different time formats and zones int timeConv(int argc, const char *argv[]); #endif // Time context type definition. Defined here to avoid mutual inclusion need of // this file and timezones.h. typedef uInt32 timecontext_t; ///< define a time context (dateonly,time zone, etc.) // Generic utility factors and routines // ------------------------------------ /// useful time/date definitions const int SecsPerMin = 60; const int MinsPerHour= 60; const int SecsPerHour= SecsPerMin*MinsPerHour; const int HoursPerDay= 24; const int DaysPerWk = 7; /// @brief conversion factor for lineardate_t to lineartime_t const lineartime_t linearDateToTimeFactor = (secondToLinearTimeFactor*SecsPerHour*HoursPerDay); /// @brief offset from lineartime_t to UNIX time(), which is based 1970-01-01 00:00:00 /// @Note units of this constants are still lineartime_t units and need /// division by secondToLinearTimeFactor to get actual UNIX time in seconds const lineartime_t UnixToLineartimeOffset = ( 2440588 // offset between algorithm base and 1970-01-01 - linearDateOriginOffset // offset between lineardate_t base and algorithm base ) * linearDateToTimeFactor; /// @brief offset from lineartime_t to NSDate reference time, which is based 2001-01-01 00:00:00 /// @Note units of this constants are still lineartime_t units and need /// division by secondToLinearTimeFactor to get actual NSDate in seconds const lineartime_t NSDateToLineartimeOffset = ( 2451911 // offset between algorithm base and 2001-01-01 - linearDateOriginOffset // offset between lineardate_t base and algorithm base ) * linearDateToTimeFactor; /// @brief convert date to linear date /// @return specified date converted to lineardate_t (unit=days) /// @param[in] aYear,aMonth,aDay : date specification lineardate_t date2lineardate(sInt16 aYear, sInt16 aMonth, sInt16 aDay); /// @brief convert date to linear time /// @return specified date converted to lineartime_t (unit=lineartime units) /// @param[in] aYear,aMonth,aDay : date specification lineartime_t date2lineartime(sInt16 aYear, sInt16 aMonth, sInt16 aDay); /// @brief convert time to linear time /// @return specified time converted to lineartime_t units /// @param[in] aMinute,aSecond,aMS : time specification lineartime_t time2lineartime(sInt16 aHour, sInt16 aMinute, sInt16 aSecond, sInt16 aMS); /// @brief convert lineardate to weekday /// @return 0=sunday, 1=monday ... 6=saturday /// @param[in] aLinearDate linear date (in days) sInt16 lineardate2weekday(lineardate_t aLinearDate); /// @brief convert lineartime to weekday /// @return 0=sunday, 1=monday ... 6=saturday /// @param[in] aLinearTime linear time (in lineartime_t units) sInt16 lineartime2weekday(lineartime_t aLinearTime); /// @brief convert lineardate to year/month/day /// @param[in] aLinearDate linear date (in days) /// @param[out] aYearP,aMonthP,aDayP : date components, may be NULL if component not needed void lineardate2date(lineardate_t aLinearDate,sInt16 *aYearP, sInt16 *aMonthP, sInt16 *aDayP); /// @brief convert lineartime to year/month/day /// @param[in] aLinearTime linear time (in lineartime_t units) /// @param[out] aYearP,aMonthP,aDayP : date components, may be NULL if component not needed void lineartime2date(lineartime_t aLinearTime, sInt16 *aYearP, sInt16 *aMonthP, sInt16 *aDayP); /// @brief get number of days in a month /// @return number of days in month (28..31) /// @param[in] aLinearDate linear date (in days) sInt16 getMonthDays(lineardate_t aLinearDate); /// @brief convert lineartime to h,m,s,ms /// @param[in] aLinearTime linear time (in lineartime_t units) /// @param[out] aHourP,aMinP,aSecP,aMSP : time components, may be NULL if component not needed void lineartime2time(lineartime_t aLinearTime, sInt16 *aHourP, sInt16 *aMinP, sInt16 *aSecP, sInt16 *aMSP); /// @brief convert seconds to linear time /// @return number of lineartime_t units /// @param[in] aSeconds a number of seconds lineartime_t seconds2lineartime(sInt32 aSeconds); /// @brief convert linear time to seconds /// @return number of seconds /// @param[in] aLinearTime lineartime_t units sInt32 lineartime2seconds(lineartime_t aLinearTime); /// @brief get time-only part of a linear time /// @return time only in lineartime_t units since midnight /// @param[in] aLinearTime a date/timestamp in lineartime_t units lineartime_t lineartime2timeonly(lineartime_t aLinearTime); /// @brief get date-only part of a linear time /// @return date only in lineardate_t units (days) /// @param[in] aLinearTime a date/timestamp in lineartime_t units lineardate_t lineartime2dateonly(lineartime_t aLinearTime); /// @brief get date-only part, but IN LINEARTIME /// @return date only in lineartime_t units /// @param[in] aLinearTime a date/timestamp in lineartime_t units lineartime_t lineartime2dateonlyTime(lineartime_t aLinearTime); // Implementation of the following routines is platform specific // ------------------------------------------------------------- /// @brief fine resolution sleep support /// @param[in] aHowLong desired time to wait in lineartime_t units void sleepLineartime(lineartime_t aHowLong); #ifdef __cplusplus } // namespace sysync #endif #endif // LINEARTIME_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/prefix_file.h0000644000373300037200000000026412424517753027440 0ustar00nightlyallusers00000000000000/* * File: prefix_file.h * * Author: Beat Forster (bfo@synthesis.ch) * * * Copyright (c) 2006-2011 by Synthesis AG + plan44.ch * */ /* intentionally left blank */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/san.cpp0000755000373300037200000005630412424517753026271 0ustar00nightlyallusers00000000000000/* * File: san.cpp * * Author: Beat Forster (bfo@synthesis.ch) * * Server Alerted Notification * for OMA DS 1.2 * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * * */ /* 128 bit 64 bit + n char +------------+--------------------+--------------------+ | | | | | digest | notification-hdr | notification-body | | | | | +------------+--------------------+--------------------+ / \ \ / \ --------- \ / \ \ \ -------------------- ------ \ \ / \ \ \ / \ \ \ +---------+---------+-----------+--------+---------+--------+--------+ +----------+ | version | ui-mode | initiator | future | session | server | server | | usage | | | | | use | id | ident | ident | | specific | | | | | | | length | | | | +---------+---------+-----------+--------+---------+--------+--------+ +----------+ 10 bit 2 bit 1 bit 27 bit 16 bit 8 bit n char H = MD5 hashing function B64 = Base64 encoding digest= H(B64(H(server-identifier:password)):nonce:B64(H(notification))) notification body: +-------+--------+--------+--------+----------+ | num | future | sync 1 | sync N | vendor | | syncs | use | | | specific | | | | | | | +-------+--------+--------+--------+----------+ 4 bit 4 bit / \ n char / \ ---------- ------- / \ / \ +------+--------+---------+--------+--------+ | sync | future | content | server | server | | type | use | type | URI | URI | | | | | length | | +------+--------+---------+--------+--------+ 4 bit 4 bit 24 bit 8 bit n char */ #ifdef HAVE_CONFIG_H # include #endif #include "prefix_file.h" #include "sync_include.h" #include "san.h" #include "sysync_md5.h" #include "sysync_b64.h" #ifndef WITHOUT_SAN_1_1 #include "sysync_utils.h" #endif const uInt16 SyncML12 = 12; // currently supported SyncML version const uInt16 SyncML11 = 11; // currently supported SyncML version const uInt16 SyncML10 = 10; // currently supported SyncML version #pragma options align= packed // allow direct mapping of the structure using namespace sysync; namespace sysync { // ---- structure definition --------------------------------------------- #define BpB 8 // bits per byte #define NBits 7 // bytes of the notification-hdr bits #define BBits 4 // bytes of the notification-body bits #define DB_Full 420 // memory full error #define DB_Error 510 // general DB error struct TPackage { TDigestField digest; uInt8 bitField[ NBits ]; // version, ui-mode, initiator, future use, sesion id uInt8 serverID_len; }; // TPackage struct TBody { uInt8 bitField[ BBits ]; // sync type, future use, content type uInt8 serverURI_len; }; // TBody // ---- defined locally for the moment to avoid dependencies ---- // // MD5 and B64 given string static void MD5B64_Local(const char *aString, sInt32 aLen, string &aMD5B64) { // determine input length if (aLen<=0) aLen=strlen(aString); // calc MD5 md5::SYSYNC_MD5_CTX context; uInt8 digest[16]; md5::Init (&context); md5::Update (&context, (const uInt8 *)aString,aLen); md5::Final (digest, &context); // b64 encode the MD5 digest uInt32 b64md5len; char *b64md5=b64::encode(digest,16,&b64md5len); // assign result aMD5B64.assign(b64md5,b64md5len); // done b64::free(b64md5); // return buffer allocated by b64::encode } // MD5B64_Local // ---- constructor/destructor ------------------------------------------- SanPackage::SanPackage() // constructor { fBody= NULL; CreateEmptyNotificationBody(); memset( &fDigest, 0, DigestSize ); fProtocolVersion= 0; fUI_Mode = UI_not_specified; fInitiator = Initiator_Server; fSessionID = 0; fSan = NULL; fSanSize = 0; } // constructor SanPackage::~SanPackage() // destructor { ReleasePackage(); ReleaseNotificationBody(); } // destructor // ---- digest creation -------------------------------------------------- TDigestField SanPackage::H( string s ) { TDigestField df; // calc MD5 md5::SYSYNC_MD5_CTX context; md5::Init ( &context ); md5::Update ( &context, (const uInt8 *)s.c_str(), s.length() ); md5::Final( df.b, &context ); return df; } // DigestField string SanPackage::B64_H( string s1, string s2 ) { if (!s2.empty()) s1+= ":" + s2; MD5B64_Local( s1.c_str(), s1.size(), s1 ); return s1; } // B64_H string SanPackage::B64_H_Notification( void* san, size_t sanSize ) { string s; const char* v= (const char*)san + DigestSize; size_t nfySize= sanSize - DigestSize; MD5B64_Local( v, nfySize, s ); return s; } // B64_H /*! Prepare the SAN record */ void SanPackage::PreparePackage( string aB64_H_srvID_pwd, string aNonce, uInt16 aProtocolVersion, UI_Mode aUI_Mode, Initiator aInitiator, uInt16 aSessionID, string aSrvID ) { fB64_H_srvID_pwd= aB64_H_srvID_pwd; fNonce = aNonce; fProtocolVersion= aProtocolVersion; fUI_Mode = aUI_Mode; fInitiator = aInitiator; fSessionID = aSessionID; fServerID = aSrvID; } // PreparePackage // if only hashes are available TSyError SanPackage::CreateDigest( const char* b64_h_serverID_password, const char* aNonce, void* san, size_t sanSize ) { string s= b64_h_serverID_password; if ( s.empty()) { for (int i= 0; ib[ i ]) return false; } // for return true; } // DigestOK // ---- bit operations --------------------------------------------------- void SanPackage::AddBits( void* ptr, int pos, int n, uInt32 value ) { byte* b= (byte*)ptr; int lim= pos+n; if (lim>BpB*NBits) return; // check if within the field while (lim>BpB) { b++; lim-= BpB; } int i; for (i=0; iBpB*NBits) return 0; // check if within the field while (lim>BpB) { b++; lim-= BpB; } int i; for (i=0; i value= value / 2; lim--; if (lim==0) { lim= BpB; b--; } } // for return value; } // GetBits // ---- notification body generation ------------------------------------- void SanPackage::CreateEmptyNotificationBody() { ReleaseNotificationBody(); fEmpty= 0x00; // no sync fields = ALL data stores concerned fBody= &fEmpty; fBodySize= sizeof(fEmpty); fNSync= 0; } // CreateEmptyNotificationBody TSyError SanPackage::AddSync( int syncType, uInt32 contentType, const char* serverURI ) { int len= strlen(serverURI); int nLen= BBits + 1 + len; // length of the new part int newLen= fBodySize + nLen; // total length of the new block void* fb= malloc( newLen ); // allocate it memcpy( fb, fBody,fBodySize ); // copy existing structure to beginning byte* b = (byte*)fb; b+= fBodySize; // get a pointer to the new part ReleaseNotificationBody(); // release the old structure fNSync++; // adapt number of available parts fBody = fb; // now the new bigger structure is assigned fBodySize= newLen; // fill in new counter value AddBits( fBody, 0, 4, fNSync ); // number of sync datastores AddBits( fBody, 4, 4, 0 ); // future use // fill in contents of the nth structure TBody* tb= (TBody*)b; AddBits( tb->bitField, 0, 4, syncType-200 ); // the sync type 206..210 AddBits( tb->bitField, 4, 4, 0 ); // future use AddBits( tb->bitField, 8,24, contentType ); // the content tye tb->serverURI_len= len; byte* pp= (byte*)(tb+1); // = right after TBody memcpy( (void*) pp, (void*)serverURI, len ); return LOCERR_OK; } // AddSync void SanPackage::ReleaseNotificationBody() { if (fBody!=NULL && fBody!=&fEmpty) { free( fBody ); fBody= NULL; } } // ReleaseNotificationBody #ifndef WITHOUT_SAN_1_1 // general callback entry for all others static Ret_t univ( ... ) { //printf( "callback\n" ); return 0; } // univ static Ret_t startM( InstanceID_t id, VoidPtr_t userData, SmlSyncHdrPtr_t pContent ) { cAppCharP Sy= "SyncML/"; size_t n = strlen(Sy); SanPackage* a= (SanPackage*)userData; string mup = ""; string nonce= ""; uInt16 major=0,minor=0; cAppCharP verP = smlPCDataToCharP(pContent->proto); if (strucmp(verP,Sy,n)==0) { n+=StrToUShort(verP+n,major); if (verP[n]=='.') { n++; StrToUShort(verP+n,minor); } } sInt32 sessionID; smlPCDataToLong( pContent->sessionID, sessionID ); string srvID= smlSrcTargLocURIToCharP(pContent->source); a->PreparePackage( mup, nonce, 10*major+minor, UI_not_specified, Initiator_Server, sessionID, srvID ); a->CreateEmptyNotificationBody(); return 0; } // startM static Ret_t alertM( InstanceID_t id, VoidPtr_t userData, SmlAlertPtr_t pContent ) { SanPackage* a= (SanPackage*)userData; sInt32 syncType; smlPCDataToLong( pContent->data, syncType ); uInt32 contentType= 0; // always 0 SmlItemListPtr_t el= pContent->itemList; while (true) { // can be a chained list of elements string locURI= smlSrcTargLocURIToCharP(el->item->source); a->AddSync( syncType, contentType, locURI.c_str() ); // for each element add one if (el->next==NULL) break; el= el->next; } // while //printf( "alert\n" ); return 0; } // alert static Ret_t endM( InstanceID_t id, VoidPtr_t userData, Boolean_t final ) { //printf( "end\n" ); return 0; } // endM // Callback record, most of the routines are not used static const SmlCallbacks_t mySmlCallbacks = { /* message callbacks */ startM, // smlStartMessageCallback, endM, // smlEndMessageCallback, /* grouping commands */ (smlStartSyncFunc) univ, // smlStartSyncCallback, (smlEndSyncFunc) univ, // smlEndSyncCallback, #ifdef ATOMIC_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ univ, // smlStartAtomicCallback, univ, // smlEndAtomicCallback, #endif #ifdef SEQUENCE_RECEIVE univ, // smlStartSequenceCallback, univ, // smlEndSequenceCallback, #endif /* Sync Commands */ (smlAddCmdFunc) univ, // smlAddCmdCallback, alertM, // smlAlertCmdCallback, (smlDeleteCmdFunc)univ, // smlDeleteCmdCallback, (smlGetCmdFunc) univ, // smlGetCmdCallback, (smlPutCmdFunc) univ, // smlPutCmdCallback, #ifdef MAP_RECEIVE (smlMapCmdFunc) univ, // smlMapCmdCallback, #endif #ifdef RESULT_RECEIVE (smlResultsCmdFunc)univ, // smlResultsCmdCallback, #endif (smlStatusCmdFunc) univ, // smlStatusCmdCallback, (smlReplaceCmdFunc)univ, // smlReplaceCmdCallback, /* other commands */ #ifdef COPY_RECEIVE /* these callbacks are NOT included in the Toolkit lite version */ univ, // smlCopyCmdCallback, #endif #ifdef EXEC_RECEIVE univ, // smlExecCmdCallback, #endif #ifdef SEARCH_RECEIVE univ, // smlSearchCmdCallback, #endif smlMoveCmdFunc(univ), // smlMoveCmdCallback, /* Other Callbacks */ smlHandleErrorFunc (univ), // smlHandleErrorCallback, smlTransmitChunkFunc(univ) // smlTransmitChunkCallback }; /* sml_callbacks struct */ // Try to convert a 1.1 message // - if successful, fill in values into 1.2 fields // - if not successful, interpret it as 1.2 structure TSyError SanPackage::Check_11( void* san, size_t sanSize ) { TSyError err; SmlCallbacks_t scb= mySmlCallbacks; SmlInstanceOptions_t sIOpts; InstanceID_t id; Ret_t cer; MemPtr_t wPos; MemSize_t freeSize; // struct assignment / 1k buffer sIOpts.encoding = SML_WBXML; // it is always WBXML sIOpts.workspaceSize = 1024*30; // should be always sufficient sIOpts.maxOutgoingSize= 0; // disabled for now err= smlInitInstance( &scb, &sIOpts, this, &id ); if (err) return err; do { err= smlLockWriteBuffer ( id, &wPos, &freeSize ); if (err) break; memcpy( wPos, san,sanSize ); // now we have a new internal copy err= smlUnlockWriteBuffer( id, sanSize ); if (err) break; err= smlProcessData ( id, SML_ALL_COMMANDS ); if (err) break; } while (false); cer= smlTerminateInstance( id ); if (!err) err= cer; return err; } // Check_11 #endif // WITHOUT_SAN_1_1 TSyError SanPackage::PassSan( void* san, size_t sanSize, int mode) { TSyError err = LOCERR_OK; bool use_as_12= true; ReleasePackage(); //printf( "here we will have the potential 1.1 -> 1.2 conversion\n" ); #ifndef WITHOUT_SAN_1_1 if (mode == 0 || mode == 1) { err= Check_11 ( san,sanSize ); if (!err) err= GetPackage( san,sanSize ); //use_as_12= err==SML_ERR_XLT_INCOMP_WBXML_VERS; use_as_12= err!=0; //printf( "err=%d\n", err ); } #endif if (use_as_12 && mode !=1) { err= DB_Full; fSan= malloc( sanSize ); if (fSan) { fSanSize= sanSize; memcpy( fSan, san,sanSize ); // now we have a new internal copy err= LOCERR_OK; } // if } // if return err; } // PassSan TSyError SanPackage::GetSanSize( void* san, size_t &sanSize ) { TPackage* tp= (TPackage*)san; TBody* tb = NULL; byte* b= (byte*)(tp+1); byte* v; b+= tp->serverID_len; int nth= GetBits( b, 0,4 ); // first not valid = the end b++; // start of 1st element int n= nth; while (n>0) { n--; tb= (TBody*)b; b = (byte*)(tb+1); if (b > (byte*)san+sanSize && sanSize>0) return DB_Forbidden; v= b + tb->serverURI_len; if (b > (byte*)san+sanSize && sanSize>0) return DB_Forbidden; if (n==0) break; b= v; } // while b+= tb->serverURI_len; // finally the serverURI length size_t rslt= b - (byte*)san; if (sanSize>0 && sanSizedigest; fProtocolVersion= GetBits( tp->bitField, 0,10 ); fUI_Mode = (UI_Mode)GetBits( tp->bitField, 10, 2 ); fInitiator = (Initiator)GetBits( tp->bitField, 12, 1 ); fSessionID = GetBits( tp->bitField, 40,16 ); /*If the version does not match, this should be an invalid SAN message*/ if (fProtocolVersion!=SyncML12 && fProtocolVersion!=SyncML11 && fProtocolVersion!=SyncML10) return DB_Forbidden; byte* b= (byte*)(tp+1); byte* v; fServerID.assign( (const char*)b,(unsigned int)tp->serverID_len ); b+= tp->serverID_len; fNSync= GetBits( b, 0,4 ); if (nth==0) return LOCERR_OK; if (nth<1 || nth>fNSync ) return DB_NotFound; b++; // start of 1st element int n= nth; while (n>0) { n--; tb= (TBody*)b; b = (byte*)(tb+1); if (b > (byte*)fSan+fSanSize) return DB_Forbidden; // no access behind the message v= b + tb->serverURI_len; if (v > (byte*)fSan+fSanSize) return DB_Forbidden; // no access behind the message if (n==0) break; b= v; } // while syncType = 200 + GetBits( tb->bitField, 0, 4 ); contentType= GetBits( tb->bitField, 8,24 ); serverURI.assign( (const char*)b,(unsigned int)tb->serverURI_len ); return LOCERR_OK; } // GetNthSync TSyError SanPackage::GetHeader() { int syncType; // these 3 variables are not really used uInt32 contentType; string serverURI; return GetNthSync( 0, syncType,contentType,serverURI ); } // GetHeader // ---- package generation ----------------------------------------------- TSyError SanPackage::GetPackage( void* &san, size_t &sanSize, void* vendorSpecific, size_t vendorSpecificSize ) { ReleasePackage(); // remove a previous one byte len = (byte)fServerID.length(); // calulate the full size sanSize= sizeof(TPackage) + len + fBodySize + vendorSpecificSize; //size_t nfySize= sanSize - DigestSize; fSan = malloc( sanSize ); san = fSan; TPackage* tp= (TPackage*)fSan; // ------------------- AddBits( tp->bitField, 0,10, fProtocolVersion ); AddBits( tp->bitField, 10, 2, fUI_Mode ); AddBits( tp->bitField, 12, 1, fInitiator ); AddBits( tp->bitField, 13,27, 0 ); // future use, must be "0" AddBits( tp->bitField, 40,16, fSessionID ); tp->serverID_len= len; // copy string at the end of TPackage struct byte* pp= (byte*)(tp+1); // = right after TPackage memcpy( (void*) pp, (void*)fServerID.c_str(), len ); memcpy( (void*)(pp+len), fBody, fBodySize ); if (vendorSpecific!=NULL && vendorSpecificSize>0) memcpy( (void*)(pp+len+fBodySize), vendorSpecific,vendorSpecificSize ); CreateDigest( fB64_H_srvID_pwd.c_str(), fNonce.c_str(), san,sanSize ); tp->digest= fDigest; fSanSize= sanSize; return LOCERR_OK; } // GetPackage void SanPackage::ReleasePackage() { if (fSan!=NULL) { free( fSan ); fSan= NULL; } } // ReleasePackage #ifndef WITHOUT_SAN_1_1 const char * const SyncMLVerProtoNames[] = { "undefined", "SyncML/1.0", "SyncML/1.1", "SyncML/1.2" }; const char *const SyncMLVerDTDNames[] = { "???", "1.0", "1.1", "1.2" }; const SmlVersion_t SmlVersionCodes[] = { SML_VERS_UNDEF, SML_VERS_1_0, SML_VERS_1_1, SML_VERS_1_1 }; TSyError SanPackage::GetPackageLegacy( void* &san, size_t &sanSize, const vector >& sources, int alertCode, bool wbxml) { ReleasePackage(); // remove a previous one TSyError err; SmlCallbacks_t scb= mySmlCallbacks; SmlInstanceOptions_t sIOpts; InstanceID_t id; // struct assignment / 1k buffer sIOpts.encoding = wbxml ? SML_WBXML : SML_XML; sIOpts.workspaceSize = 1024; // should be always sufficient sIOpts.maxOutgoingSize= 0; // disabled for now err= smlInitInstance( &scb, &sIOpts, this, &id ); if (err) return err; SmlSyncHdrPtr_t headerP = NULL; SmlAlertPtr_t alertP = NULL; do { SYSYNC_TRY{ //create SyncHdr headerP = SML_NEW (SmlSyncHdr_t); headerP->elementType = SML_PE_HEADER; if (fProtocolVersion != 10 && fProtocolVersion != 11){ //wrong version! err = DB_Error; break; } int version = fProtocolVersion - 10 + 1; headerP->version = newPCDataString (SyncMLVerDTDNames[version]); headerP->proto = newPCDataString (SyncMLVerProtoNames[version]); headerP->sessionID = newPCDataLong (fSessionID); headerP->msgID = newPCDataString ("1"); headerP->target = newLocation ("/", ""); headerP->source = newLocation (fServerID.c_str(), ""); headerP->respURI = NULL; headerP->meta = NULL; headerP->flags = 0; //TODO generate the cred element for authentication headerP->cred = NULL; //create SyncMessage err = smlStartMessageExt (id, headerP, SmlVersionCodes[version]); if (err) break; //create Alert Commands //internal Alert element alertP = SML_NEW (SmlAlert_t); alertP->elementType = SML_PE_ALERT; alertP->cmdID = newPCDataLong(1); alertP->flags = 0; alertP->data = newPCDataLong (alertCode); alertP->cred = NULL; alertP->itemList = NULL; alertP->flags = 0; //for each source, add a item for (unsigned int num =0; num < sources.size(); num++) { SmlItemPtr_t alertItemP = newItem(); alertItemP->source = newOptLocation (sources[num].second.c_str()); alertItemP->meta = newMetaType (sources[num].first.c_str()); addItemToList (alertItemP, &alertP->itemList); } err = smlAlertCmd (id, alertP); if (err) break; err = smlEndMessage (id, true); if (err) break; MemPtr_t buf = NULL; err = smlLockReadBuffer (id, (MemPtr_t *) &buf, (MemSize_t *)&sanSize); if (err) break; fSan = malloc( sanSize ); if (!fSan) {err = DB_Full; break;} san = fSan; memcpy (san, buf, sanSize); err = smlUnlockReadBuffer (id, sanSize); if (err) break; } SYSYNC_CATCH (...) if (headerP) { smlFreeProtoElement (headerP); headerP = NULL; } if (alertP) { smlFreeProtoElement (alertP); alertP = NULL; } err = DB_Full; SYSYNC_ENDCATCH } while (false); if (headerP) { smlFreeProtoElement (headerP); } if (alertP) { smlFreeProtoElement (alertP); } if (err) return err; err = smlTerminateInstance( id ); return err; } #endif } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/san.h0000644000373300037200000002234512424517753025731 0ustar00nightlyallusers00000000000000/* * File: san.h * * Author: Beat Forster (bfo@synthesis.ch) * * Server Alerted Notification * for OMA DS 1.2 * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * */ #ifndef San_H #define San_H // ---------- standalone definitions ------------------------------ #include "generic_types.h" // some basic defs, which aren't available #include "syerror.h" // error code definitions #include "sysync_noncopyable.h" #include // used for printf calls #include // used for strcpy/strlen calls #ifdef __cplusplus #include // STL includes #include #include using namespace std; #endif typedef unsigned char byte; // ---------------------------------------------------- namespace sysync { // The digest field structure #define DigestSize 16 struct TDigestField { uInt8 b[ DigestSize ]; }; // TDigestField enum UI_Mode { UI_not_specified = 0, // "00" UI_background = 1, // "01" UI_informative = 2, // "10" UI_user_interaction = 3 // "11" }; enum Initiator { Initiator_User = 0, // "0" Initiator_Server = 1 // "1" }; /*! * How to create a SAN package (on server side): * 1) Prepare the SAN package using 'PreparePackage' * * If all datastores need to be notified, skip 2 and 3 * If specific datastores need to be notified, call 2 and 3 * * 2) Call 'CreateEmptyNotificationBody' (not needed 1st time) and * 3) call 'AddSync' for each datastore to be notified * * 4) Create the SAN package with 'GetPackage'. * A vendor specific record can be added, if required. * * How to create a Legacy SAN package (server side SAN 1.0/1.1): * 1) Prepare the SAN package using 'PreparePackage' * 2) Call 'CreateEmptyNotificationBody' (not needed 1st time) and * 3) Create the SAN package with 'GetPackageLegacy'. * *-------------------------------------------------------------------- * How to check a SAN package (on client side): * 1) pass the san message with 'PassSan' * 1) create first (using 'CreateDigest') * 2) call 'DigestOK', to verify it * * How to get the th sync message: * call 'GetNthSync( n, .. )' * [ call 'GetHeader ( )' or * GetNthSync( 0, .. )' to get header params only ] * */ class SanPackage : noncopyable { // for Klocwork, noncopyable alone was not enough SanPackage & operator = (const SanPackage &); public: SanPackage(); // constructor ~SanPackage(); // destructor /*! Base64 encoded MD5, two strings can be concatenated with ":" */ string B64_H( string s1, string s2= "" ); /*! Base64 encoded MD5 of the notification part of ,. */ string B64_H_Notification( void* san, size_t sanSize ); /*! Prepare the SAN package */ void PreparePackage( string aB64_H_srvID_pwd, string aNonce, uInt16 aProtocolVersion, UI_Mode aUI_Mode, Initiator aInitiator, uInt16 aSessionID, string aSrvID ); /*! These variables will be assigned with the 'PreparePackage' call * : 10*version => max= V102.3 / V1.0 = 10 ) * for OMA DS 1.2 use '12' */ string fB64_H_srvID_pwd; string fNonce; uInt16 fProtocolVersion; // 10 bit UI_Mode fUI_Mode; // 2 bit Initiator fInitiator; // 1 bit uInt16 fSessionID; // 16 bit string fServerID; /*! Create an empty notification body */ void CreateEmptyNotificationBody(); /*! Add a sync sequence to the notification body * * (in) * @param 206..210 (internally less 200: 206 -> 6) * @param MIME media content type (24 bit) * @param server's URI */ TSyError AddSync( int syncType, uInt32 contentType, const char* serverURI ); /*! Get the SAN package for v1.2 * * (out) * @param get the pointer to the SAN message. * @param get the SAN message size (in bytes). * * (in) * @param reference to vendor specific part * @param size (in bytes) of vendor specific part * * @return error code if operation can't be performed * * NOTE: The notification body will be added automatically * */ TSyError GetPackage( void* &san, size_t &sanSize, void* vendorSpecific= NULL, size_t vendorSpecificSize= 0 ); #ifndef WITHOUT_SAN_1_1 /*! Get the SAN package for v1.1/v1.0 * * (out) * @param get the pointer to the SAN message. * @param get the SAN message size (in bytes). * * (in) * @param vector of alerted sources * @param the synchronization mode * @param use wbxml or plain xml * * @return error code if operation can't be performed * * NOTE: The notification body will be added automatically * */ TSyError GetPackageLegacy( void* &san, size_t &sanSize, const vector > &sources, int alertCode, bool wbxml = true); #endif /*! Create the digest for the SAN package: * digest= H(B64(H(server-identifier:password)):nonce:B64(H(notification))) * where notification will be calculated from /. */ TSyError CreateDigest( const char* aSrvID, const char* aPwd, const char* aNonce, void* san, size_t sanSize ); /*! overloaded version, if only the B64 hashes are available */ TSyError CreateDigest( const char* b64_h_srvID_pwd, const char* aNonce, void* san, size_t sanSize ); /*! Check, if the digest of is correct */ bool DigestOK( void* san ); /*! Pass SAN message , to object, * a local copy will be kept then internally * (in) * @param the pointer to the SAN message * @param the max. SAN message size (in bytes) * @param 0|1|2, 0 tries both San 1.1 and 1.2, 1 tries only * 1.1 and 2 tries only 1.2 */ TSyError PassSan( void* san, size_t sanSize , int mode = 0); /*! Get the effective size of an already created message * (without vendor specific part) * * (in) * @param the pointer to the SAN message * @param the max. SAN message size (in bytes) * 0, if unknown. * (out) * @param the effective SAN message size (in bytes) * * @return error code 403, if input is too small */ TSyError GetSanSize( void* san, size_t &sanSize ); /*! Get the nth sync info * * (in) * @param the pointer to the SAN message * @param the SAN message size (in bytes) * @param asks for the sync info * nth=0 is allowed also, but will only assign * the header variables * (out) * @param 206..210 (internally less 200: 206 -> 6) * @param MIME media content type (24 bit) * @param server's URI * * @return error code 403, if is too small * 404, if is out of range */ //TSyError GetNthSync( void* san, size_t sanSize, int nth, TSyError GetNthSync( int nth, int &syncType, uInt32 &contentType, string &serverURI ); /*! Alternative call for GetNthSync( 0, ... ) */ //TSyError GetHeader ( void* san, size_t sanSize ); TSyError GetHeader (); TDigestField fDigest; // The digest, created with "CreateDigest" int fNSync; // number of actual sync fields private: /*! the internally built notification-body structure */ byte fEmpty; // direct reference to empty structure void* fBody; // the body structure ... size_t fBodySize; // .. and its size /*! local copies of , */ void* fSan; size_t fSanSize; /*! MD5 conversion */ TDigestField H( string s ); /* Try to interpret SyncML 1.1 SAN */ TSyError Check_11( void* san, size_t sanSize ); /*! Add into field at , */ void AddBits( void* ptr, int pos, int n, uInt32 value ); /*! Get value from field at , */ uInt32 GetBits( void* ptr, int pos, int n ); /*! Release notification body */ void ReleaseNotificationBody(); /*! Release the SAN package */ void ReleasePackage(); }; // SanPackage } // namespace sysync #endif // San_H // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/stringutil.cpp0000644000373300037200000001665712424517753027720 0ustar00nightlyallusers00000000000000/* * File: stringutil.cpp * * Authors: Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * C++ string utils * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * */ #include "target_options.h" #ifndef WITHOUT_SAN_1_1 #if defined __MACH__ && !defined __GNUC__ /* used for va_list support */ #include #else #include #endif #ifdef __GNUC__ #include #else #ifndef _MSC_VER #include #endif #endif #include "stringutil.h" #ifdef __cplusplus namespace sysync { #endif // case insensitive strcmp, NULL allowed as empty string input sInt16 strucmp( cAppCharP s1, cAppCharP s2, size_t len1, size_t len2 ) { // allow NULL as empty strings if (!s1) s1 = ""; if (!s2) s2 = ""; // s1>s2 : 1, s1==s2 : 0, s1len2 ? len2 : len1)); for (i=0; (!len || itoupper(*s2) ? 1 : -1; // different // next s1++; s2++; } // equal up to end of shorter string or reached len // - if both reached end or len -> equal if ( ((len1 ? i==len1 : false) || *s1==0) && ((len2 ? i==len2 : false) || *s2==0) ) return 0; // - not equal, longer string is larger // (if not reached end of s1 or stopped before len1, s1 is longer // but note than len1 can be longer than actual length of s1, so we // must check for *s1 to make sure we have really not reached end of s1) return (len1 ? i'9' ? toupper(*p)-'A'+0x0A : *p-'0'); p++; n++; } break; } // c is the char to add } else if (aStopAtQuoteOrCtrl && (c=='"' || c<0x20)) { // terminating char is NOT consumed p--; break; // stop here } // otherwise, ignore any control characters else if (c<0x20 && c!=ignore) continue; // add it to the result if (c) aString+=c; } // return number of converted chars return p-aStr; } // CStrToStrAppend // returns number of string-escaped chars successfully converted to C-string sInt16 StrToCStrAppend( cAppCharP aStr, string &aString, bool aAllow8Bit, char ignore ) { unsigned char c; const char *p=aStr; while ((c=*p++)) { // check for specials if (c==ignore) aString+= c; else if (c==0x09) aString+="\\t"; else if (c==0x0A) aString+="\\n"; else if (c==0x0D) aString+="\\r"; else if (c==0x22) aString+="\\\""; else if (c=='\\') aString+="\\\\"; // escape the backslash as well else if (c<0x20 || c==0x7F || (!aAllow8Bit && c>=0x80)) { StringObjAppendPrintf(aString,"\\x%02hX",(uInt16)c); } else { // as is aString+=c; } } // return number of converted chars return p-aStr; } // StrToCStrAppend // old-style C-formatted output into string object static void vStringObjPrintf( string &aStringObj, cAppCharP aFormat, bool aAppend, va_list aArgs ) { #ifndef NO_VSNPRINTF const size_t bufsiz=128; #else const size_t bufsiz=2048; #endif int actualsize; char buf[bufsiz]; buf[0]='\0'; char *bufP = NULL; if (!aAppend) aStringObj.erase(); actualsize = vsnprintf(buf, bufsiz, aFormat, aArgs); #ifndef NO_VSNPRINTF if (actualsize>=(int)bufsiz) { // default buffer was too small, create bigger dynamic buffer bufP = new char[actualsize+1]; actualsize = vsnprintf(bufP, actualsize+1, aFormat, aArgs); if (actualsize>0) { aStringObj += bufP; } delete [] bufP; } else #endif { // small default buffer was big enough, add it if (actualsize<0) return; // abort, error aStringObj += buf; } } // vStringObjPrintf // old-style C-formatted output appending into string object void StringObjAppendPrintf( string &aStringObj, cAppCharP aFormat, ... ) { va_list args; va_start(args, aFormat); // now make the string vStringObjPrintf(aStringObj,aFormat,true,args); va_end(args); } // StringObjAppendPrintf // returns number of successfully converted chars sInt16 HexStrToULong( cAppCharP aStr, uInt32 &aLong, sInt16 aMaxDigits ) { // our own implementation char c; sInt16 n=0; aLong=0; while (aStr && (c=*aStr++) && (n #include "target_options.h" #include "generic_types.h" using namespace std; #ifdef __cplusplus namespace sysync { #endif // case insensitive strcmp, NULL allowed as empty string input sInt16 strucmp( cAppCharP s1, cAppCharP s2, size_t len1=0, size_t len2=0 ); // returns number of C-string-escaped chars successfully converted to string sInt16 CStrToStrAppend( cAppCharP aStr, string &aString, bool aStopAtQuoteOrCtrl=false, char ignore='\0' ); // returns number of string-escaped chars successfully converted to C-string sInt16 StrToCStrAppend( cAppCharP aStr, string &aString, bool aAllow8Bit=false, char ignore='\0' ); // old-style C-formatted output into string object void StringObjAppendPrintf( string &aStringObj, cAppCharP aFormat, ... ); sInt16 StrToULong ( cAppCharP aStr, uInt32 &aLong, sInt16 aMaxDigits= 100 ); sInt16 StrToLong ( cAppCharP aStr, sInt32 &aLong, sInt16 aMaxDigits= 100 ); sInt16 StrToUShort ( cAppCharP aStr, uInt16 &aShort, sInt16 aMaxDigits= 100 ); sInt16 HexStrToULong ( cAppCharP aStr, uInt32 &aLong, sInt16 aMaxDigits= 100 ); sInt16 HexStrToULongLong( cAppCharP aStr, uInt64 &aLongLong, sInt16 aMaxDigits= 100 ); sInt16 HexStrToUIntPtr ( cAppCharP aStr, uIntPtr &aIntPtr, sInt16 aMaxDigits= 100 ); #ifdef __cplusplus } // namespace #endif #endif // STRINGUTIL_H syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/syerror.h0000644000373300037200000001512312424517753026651 0ustar00nightlyallusers00000000000000/* * File: syerror.h * * Author: luz@synthesis.ch / bfo@synthesis.ch * * Synthesis SyncML engine error code definitions * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * */ #ifndef SYERROR_H #define SYERROR_H #include "generic_types.h" #ifdef __cplusplus namespace sysync { #endif /** * global type for error codes * * Using an integer simplifies some arithmetic, * allows assigning HTTP error codes to it, * and most importantly, ensures that the ABI * does not accidentally change. */ typedef uInt16 TSyError; /** * Local error codes */ enum TSyErrorEnum { /** ok */ LOCERR_OK = 0, /** * May be returned by a store when an operation was started without * completing it yet. Engine will call the same operation again * later. When called a second time, the store must finish the started * operation and return the final result. */ LOCERR_AGAIN = 1, /** no content / end of file / end of iteration / empty/NULL value */ DB_NoContent = 204, /** while adding item, additional data (from external source or other syncset item) has been merged */ DB_DataMerged = 207, /** adding item has replaced an existing item */ DB_DataReplaced = 208, /** not authorized */ DB_Unauthorized = 401, /** forbidden / access denied */ DB_Forbidden = 403, /** object not found / unassigned field */ DB_NotFound = 404, /** command not allowed (possibly: only at this time) */ DB_NotAllowed = 405, /** proxy authentication required */ DB_ProxyAuth = 407, /** conflict, item was not stored because it requires merge (on part of the engine) first */ DB_Conflict = 409, /** item already exists */ DB_AlreadyExists = 418, /** command failed / fatal DB error */ DB_Fatal = 500, /** general DB error */ DB_Error = 510, /** database / memory full error */ DB_Full = 420, /** bad or unknown protocol */ LOCERR_BADPROTO = 20001, /** fatal problem with SML init/setuserdata etc. */ LOCERR_SMLFATAL = 20002, /** cannot open communication (TCP level) */ LOCERR_COMMOPEN = 20003, /** cannot send data */ LOCERR_SENDDATA = 20004, /** cannot receive data */ LOCERR_RECVDATA = 20005, /** Bad content in response (i.e. non-SyncML, exceeding buffer or HTTP status not 200) */ LOCERR_BADCONTENT = 20006, /** SML (or SAN) error processing incoming message */ LOCERR_PROCESSMSG = 20007, /** cannot close communication */ LOCERR_COMMCLOSE = 20008, /** transport layer authorisation (e.g. HTTP auth) failed */ LOCERR_AUTHFAIL = 20009, /** error parsing config file */ LOCERR_CFGPARSE = 20010, /** error reading config file */ LOCERR_CFGREAD = 20011, /** no config/profile found at all, or not enough for requested op (client session start) */ LOCERR_NOCFG = 20012, /** config file could not be found */ LOCERR_NOCFGFILE = 20013, /** expired */ LOCERR_EXPIRED = 20014, /** bad usage (e.g. wrong order of library calls) */ LOCERR_WRONGUSAGE = 20015, /** bad handle (e.g. datastore) */ LOCERR_BADHANDLE = 20016, /** aborted by user */ LOCERR_USERABORT = 20017, /** bad registration (not valid generally or for current product) */ LOCERR_BADREG = 20018, /** limited trial version */ LOCERR_LIMITED = 20019, /** connection timeout */ LOCERR_TIMEOUT = 20020, /** connection SSL certificate expired */ LOCERR_CERT_EXPIRED = 20021, /** connection SSL certificate invalid */ LOCERR_CERT_INVALID = 20022, /** incomplete sync session (some datastores or items have failed) */ LOCERR_INCOMPLETE = 20023, /** internal code signalling that client should retry sending message (instance buffer still contains the message) */ LOCERR_RETRYMSG = 20024, /** out of memory */ LOCERR_OUTOFMEM = 20025, /** we have no means to open a connection (such as phone flight mode etc.) */ LOCERR_NOCONN = 20026, /** connection (not TCP, but underlying PPP/GPRS/BT or whatever) cannot be established */ LOCERR_CONN = 20027, /** element is already installed */ LOCERR_ALREADY = 20028, /** this build is too new for this license (need upgrading license) */ LOCERR_TOONEW = 20029, /** function not implemented */ LOCERR_NOTIMP = 20030, /** this license code is valid, but not for this product */ LOCERR_WRONGPROD = 20031, /** explicitly suspended by user */ LOCERR_USERSUSPEND = 20032, /** this build is too old for this SDK/plugin */ LOCERR_TOOOLD = 20033, /** unknown subsystem */ LOCERR_UNKSUBSYSTEM = 20034, /** internal code signalling that next message will be a session restart (client should disconnect transport) */ LOCERR_SESSIONRST = 20035, /** local datastore is not ready (used to pop up alert) */ LOCERR_LOCDBNOTRDY = 20036, /** session should be restarted from scratch */ LOCERR_RESTART = 20037, /** internal pipe communication problem */ LOCERR_PIPECOMM = 20038, /** buffer too small for requested value */ LOCERR_BUFTOOSMALL = 20039, /** value truncated to fit into field or buffer */ LOCERR_TRUNCATED = 20040, /** bad parameter */ LOCERR_BADPARAM = 20041, /** out of range */ LOCERR_OUTOFRANGE = 20042, /** external transport failure (no details known in engine) */ LOCERR_TRANSPFAIL = 20043, /** class not registered */ LOCERR_CLASSNOTREG = 20044, /** interface not registered */ LOCERR_IIDNOTREG = 20045, /** bad URL */ LOCERR_BADURL = 20046, /** server not found */ LOCERR_SRVNOTFOUND = 20047, /** * ABORTDATASTORE() parameter to flag the current datastore as bad * without aborting the whole session. Exact reason for abort depends * on caller of that macro. */ LOCERR_DATASTORE_ABORT = 20048, /** cURL error code */ LOCERR_CURL = 21000, /** base code for linux signals (SIGXXX). SIGXXX enum value will be added to LOCERR_SIGNAL */ LOCERR_SIGNAL = 20500, /** TSyncException without specific error code set */ LOCERR_EXCEPTION = 20998, /** undefined error message */ LOCERR_UNDEFINED = 20999, /** * A range of error codes not used by the engine itself, start and * end included. Can be used to pass application specific error * codes from the DB layer up to the UI. */ APP_STATUS_CODE_START = 22000, APP_STATUS_CODE_END = 22999, /** * Local codes signalling SyncML status are shown as LOCAL_STATUS_CODE+. * This applies to codes >= LOCAL_STATUS_CODE and <= LOCAL_STATUS_CODE_END = 10599. * * For example, 500 = DB_Fatal = fatal error signaled by peer. * 10500 = LOCAL_STATUS_CODE + DB_Fatal = fatal error encountered locally. */ LOCAL_STATUS_CODE = 10000, LOCAL_STATUS_CODE_END = 10599 }; #ifdef __cplusplus } // namespace #endif #endif /* SYERROR_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sync_dbapi.h0000755000373300037200000013606012424517753027266 0ustar00nightlyallusers00000000000000/* * File: sync_dbapi.h * * Author: Beat Forster (bfo@synthesis.ch) * * C/C++ Programming interface between the * Synthesis SyncML engine and * the database layer for plug-ins * * Copyright (c) 2005-2011 by Synthesis AG + plan44.ch * */ /* * This is the calling interface between the Synthesis SyncML engine * and a customized module "sync_dbapi". * The same interface can be used either for Standard C or for C++. * And there is a equivalent interface for JNI (Java Native Interface). * Normally the customized module will be compiled as DLL and will * be called by the SyncML engine. A linkable library is available * (for C++) as well. * * For more detailed information about the DBApi interface * please consult the SDK_manual.pdf which contains a tutorial, * detailed descriptions and some example code. * * The flow for accessing the datastores is always the same: * The SyncML engine will call these routines step by step * * DATASTORE ACCESS FLOW * ===================== * * 1) CreateContext * 2) [ContextSupport] (optional) * 3) [FilterSupport] (optional) * 4) [Read Admin Data] (optional) * * 5) StartDataRead * 6) do ReadNextItem while (aStatus!=ReadNextItem_EOF); * 7) any number of random calls to: * - ReadItem * - ReadBlob * - [AdaptItem] (optional) * 8) EndDataRead * * 9) StartDataWrite * 10) any number of random calls to: * - InsertItem * - UpdateItem * - DeleteItem * - DeleteSyncSet * - ReadItem * - WriteBlob * - ReadBlob * - DeleteBlob * - [AdaptItem] (optional) * - FinalizeLocalID (at the end) * 11) EndDataWrite * * 12) [Write Admin Data] (optional) * 13) DeleteContext * * * NOTE: 'DisposeObj' calls can occur anywhere between any statement * of the flow above (but not before 'CreateContext' and not after * 'DeleteContext'). The SyncML engine is responsible for * disposing all and objects after use. * * NOTE: Returned errors (value > 0) will influence the flow * Error at 1) will not call any further step. * " " 2)..3) these functions do not return errors * " " 5)..10) will cause an 'EndDataWrite' call with * = false, then 'DeleteContext'. * " " 4) * 11)..12) 'DeleteContext' will be called afterwards. * * The module must be able to handle several contexts in parallel. * All routines will have an parameter (assigned by * 'CreateContext'), which allows to identify the correct context. * Routines can be called from different threads, but they are * always sequential for each context. If the thread changes, * 'ThreadMayChangeNow' will notify the module about this issue. * This routine can left empty and ignored, if not used. * * NOTE: As the SyncML engine calls the plug-in multithreaded, * all global structure accesses must be thread save. */ #ifndef SYNC_DBAPI_H #define SYNC_DBAPI_H /* Global declarations */ #include "sync_dbapidef.h" #if defined __cplusplus /* combine the definitions of different namespaces */ using sysync::sInt32; using sysync::uInt32; using sysync::CContext; using sysync::CVersion; using sysync::TSyError; using sysync::ItemID; using sysync::MapID; using sysync::cItemID; using sysync::cMapID; using sysync::appCharP; using sysync::cAppCharP; using sysync::appPointer; using sysync::memSize; using sysync::KeyH; using sysync::SDK_Interface_Struct; using sysync::DB_Callback; using sysync::UI_Call_In; #endif /* C/C++ and DLL/library support * SYSYNC_ENGINE : true ( within the engine itself ) / false ( outside ) * SYSYNC_ENGINE_TEST: true ( within a test engine module ) / false ( outside ) * DBAPI_LINKED : true ( at standalone APP, e.g. "helloX" ) / false ( within engine/within DLL ) * PLUGIN_INFO : true ( within "plugin_info" program ) / false ( everywhere else ) */ #if !defined SYSYNC_ENGINE && !defined SYSYNC_ENGINE_TEST && !defined DBAPI_LINKED && !defined PLUGIN_INFO && !defined DLL_EXPORT #define DLL_EXPORT 1 #endif #undef _ENTRY_ /* could be defined already here */ #ifdef DLL_EXPORT #define _ENTRY_ ENGINE_ENTRY #else #define _ENTRY_ #endif /* -- MODULE -------------------------------------------------------------------- */ /*! Create a module context \ * This routine will be called as the 2nd call, when the module will be connected. * (The 1st call is a 'Module_Version( 0 )' call outside any context). * * It will be called not only once, but once for each session and datastore context, * as defined at the XML config file. This routine can return error 20028 (LOCERR_ALREADY), * if already created. This will be treated not as an error. For this case, it must * return the same \ as for the former call(s). * * NOTE: The module context can exist once and can be shared for all plug-in accesses. * This can either be done with an allocated global variable at the plug-in or * even better using the "GlobContext" structure provided by the SyncML engine. * Please note, that write access to such a common module context structure must * be thread-safe, when accessed from the session or datastore context. * All the 'Module_CreateContext' calls for this module will be called * sequentially by one thread. The plug-in programmer is responsible not to * re-initialize the context for subsequent calls. * * If the module name at the XML config file is defined as "aaa!bbb!ccc" it will be passed * as "aaa" to \ and "bbb!ccc" to \. This mechanism can be used to * cascade plug-in modules, where the next module gets "bbb" as \ and "ccc" as * \. The JNI plug-in for Java is using this structure to address the JNI plug-in * and its assigned Java class. Error 20034 (LOCERR_UNKSUBSYSTEM) should be returned in case * the subsystem does not exist, no error if no subsystem has been chosen at all. * * * @param Returns a value, which allows to identify this module context. * Allowed values: Anything except 0, which is reserved for no context. * @param Name of this plug-in * @param Name of sub module (if available) * @param Name of the (datastore) context, e.g. "contacts"; * this string is empty for calll concerning the session. * @param DB_Callback structure for module logging * * @return error code if context could not be created (e.g. not enough memory) * LOCERR_ALREADY if global module context already exists (not treated as error) * 0 if context successfully created. */ _ENTRY_ TSyError Module_CreateContext( CContext *mContext, cAppCharP moduleName, cAppCharP subName, cAppCharP mContextName, DB_Callback mCB ); /*! Get the module's version. * * NOTE: The SyncML will take decisions depending on this version number, so * the plug-in developer should not change the values at the delivered sample code. * Plugin_Version( short buildNumber ) of 'SDK_util' should be used. * The \ can be defined by the user. * * NOTE: This function can be called by the engine outside any context with * \ = 0. For this case, any callback is not permitted (as no DB_Callback * is available). * * @param The module context ( 0, if none ). * @return current version as SDK_VERSION_MAJOR | SDK_VERSION_MINOR) * | SDK_SUBVERSION | buildNumber */ _ENTRY_ CVersion Module_Version( CContext mContext ); /*! Get the module's capabilities * Currently the SyncML engine currently understands and supports: * - "plugin_sessionauth" * - "plugin_deviceadmin" * - "plugin_datastoreadmin" * - "plugin_datastore" * * If one of these identifiers will be defined as "no" ( e.g. "plugin_sessionauth:no" ), * the according routines will not be connected and used. * * NOTE: The \ can be allocated with "StrAlloc" (SDK_util.h) for C/C++ * * @param The module context. * @param Returns the module's capabilities as multiline * aa:bb\cc:dd[\] * @return error code */ _ENTRY_ TSyError Module_Capabilities( CContext mContext, appCharP *mCapabilities ); /*! The module's config params will be sent to the plug-in. * It can be used for access path definitions or other things. * The \ can be defined individually for each session and datastore. * The SyncML engine checks the syntax, but not the content. * This routine should return an error 20010 (LOCERR_CFGPARSE), if one of * these parameters is not supported. * * EXAMPLE: Definition at XML config file:\n * \\n * \/var/log/sysync\\n * \42\\n * \ * * will be passed as:\n * "datapath:/var/log/sysync\n * ultimate_answer:42" * * NOTE: Module_PluginParams will be called ALWAYS for each module context, * even if no plug-in parameter is defined. This allows to react consistently * on parameters, which are not always available. * * @param The module context. * @param The plugin params as multiline aa:bb\cc:dd[\] * @param The SyncML engine's version * @return error code */ _ENTRY_ TSyError Module_PluginParams( CContext mContext, cAppCharP mConfigParams, CVersion engineVersion ); /*! Disposes memory, which has been allocated within the module context. * (At the moment this is only the capabilities string). * 'Module_DisposeObj' can occur at any time within \. * * NOTE: - If \ has been allocated with "StrAlloc", use "Str_Dispose" * (SDK_util.h) to release the memory again. * - If it is defined as const within the plugin module (the module * itself knows about !), this routine can be implemented empty. * * @param The module context. * @param Dispose allocated memory. * @return - */ _ENTRY_ void Module_DisposeObj( CContext mContext, void* memory ); /*! This routine will be called as the last call, before this module is disconnected. * The SyncML engine will call 'Module_DisposeObj' (if required) before this call * * NOTE: This routine will be called ONLY, if the server stops in a controlled way. * Its good programming practice not to wait for this 'DeleteContext' call. * * @param The module context. * @return error code */ _ENTRY_ TSyError Module_DeleteContext( CContext mContext ); /* -- SESSION ------------------------------------------------------------------- */ /*! By default the session context will be handled by the ODBC interface. * The session context of this plug-in module will be used only, * if \ and \ is defined * ( \name_of_the_plugin\ ). * \ can be defined individually. * * @param Returns a value, which allows to identify this session context. * @param Name of this session * @param DB_Callback structure for session logging * * @result error code, if context could not be created (e.g. not enough memory) * 0 if context successfully created, * * Flags (at the XML config file): * - \yes\: "Session_CheckDevice", "Session_GetNonce" * "Session_SaveNonce" and * "Session_SaveDeviceInfo" will be used. * * - \yes\: "Session_PasswordMode", * "Session_Login" and "Session_Logout" will be used. */ _ENTRY_ TSyError Session_CreateContext( CContext *sContext, cAppCharP sessionName, DB_Callback sCB ); /*! This function adapts itemData * * @param The session context * @param The 1st item's data * @param The 2nd item's data * @param The local vars * @param To identify, where it is called * * @return error code * * NOTE: The memory for adapted strings must be allocated locally. * The SyncML engine will call 'DisposeObj' later, to release again its memory. * One or more strings can be returned unchanged as well. */ _ENTRY_ TSyError Session_AdaptItem( CContext sContext, appCharP *sItemData1, appCharP *sItemData2, appCharP *sLocalVars, uInt32 sIdentifier ); /*! Check the database entry of \ and return its \ string. * If \ is not yet available at the plug-in, return "" for \ * * @param The session context * @param The assigned device ID string * @param The device key string (will be used for datastore accesses later) * @param The nonce string of the last session * If \ is not yet available, return "" for \ * and error code 0. * * @result error code 403 (Forbidden), if plugin_deviceadmin is not supported; * 0, if successful * * USED ONLY WITH \ */ _ENTRY_ TSyError Session_CheckDevice( CContext sContext, cAppCharP aDeviceID, appCharP *sDevKey, appCharP *nonce ); /*! Get a new nonce from the database. If this routine returns an error, * the SyncML engine will create its own nonce. * * @param The session context * @param A valid new nonce value (for the assigned device ID). * * @return error code 404 (NotFound), if no \ has been generated; * 0, if a valid \ has been generated * * USED ONLY WITH \ */ _ENTRY_ TSyError Session_GetNonce( CContext sContext, appCharP *nonce ); /*! Save the new nonce (which will be expected to be returned in the * next session for this device ID. * * @param The session context * @param New \ for the next session (of the assigned device ID) * * @result error code 403 (Forbidden), if plugin_deviceadmin is not supported; * 0, if successful * * USED ONLY WITH \ */ _ENTRY_ TSyError Session_SaveNonce( CContext sContext, cAppCharP nonce ); /*! Save the device info for \ * * @param The session context * @param More information about the assigned device (for DB and logging) * * @result error code 403 (Forbidden), if plugin_deviceadmin is not supported; * 0, if successful * * USED ONLY WITH \ */ _ENTRY_ TSyError Session_SaveDeviceInfo( CContext sContext, cAppCharP aDeviceInfo ); /*! Get the current DB time of \ * * @param The session context * @param The current time of the plugin's DB (as ISO8601 format). * * @result error code 403 (Forbidden), if plugin_deviceadmin is not supported; * 404 (NotFound), if not available -> the engine creates its own time * 0, if successful */ _ENTRY_ TSyError Session_GetDBTime( CContext sContext, appCharP *currentDBTime ); /*--------------------------------------------------------------------------------*/ /*! Get the password mode. * There are currently 4 different password modes supported. * * @param The session context * * @result * - Password_ClrText_IN : 'SessionLogin' will get clear text password * - Password_ClrText_OUT : " must return clear text password * - Password_MD5_OUT : " must return MD5 coded password * - Password_MD5_Nonce_IN: " will get MD5B64(MD5B64(user:pwd):nonce) * * USED ONLY WITH \ */ _ENTRY_ sInt32 Session_PasswordMode( CContext sContext ); /*! Get \ of \,\ in the session context. * * @param The session context * @param The user name ... * @param ... and the password. \ is an input parameter for 'Password_ClrTxt_IN' mode and an output parameter for * 'Password_ClrText_OUT' and 'Password_MD5_OUT' modes. * @param Returns the internal reference key, which will be passed to * to the datastore contexts later. * * @result error code 403 (Forbidden), if plugin_sessionauth is not supported; * 0, if successful * * USED ONLY WITH \ */ _ENTRY_ TSyError Session_Login( CContext sContext, cAppCharP sUsername, appCharP *sPassword, appCharP *sUsrKey ); /*! Logout for this session context * * @param The session context * * @result error code 403 (Forbidden), if plugin_sessionauth is not supported; * 0, if successful * * USED ONLY WITH \ */ _ENTRY_ TSyError Session_Logout( CContext sContext ); /*! Disposes memory, which has been allocated within the session context. * 'Session_DisposeObj' can occur at any time within \. * * @param The session context. * @param Dispose allocated memory. * * @return - */ _ENTRY_ void Session_DisposeObj( CContext sContext, void* memory ); /*! Due to the architecture of the SyncML engine, the system may run in a multithread * environment. The consequence is that each routine of this plugin module can be * called by a different thread. Normally this is not a problem, nevertheless * this routine notifies about thread changes in \. * It can be ignored ( =implemented empty), if not really needed. * * @param The session context * @return - */ _ENTRY_ void Session_ThreadMayChangeNow( CContext sContext ); /*! Writes the context of all items to dbg output path * This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. Can be implemented empty * * @param The session context * @param true : all fields, also empty ones, will be displayed; * false: only fields <> "" will be shown * @param "" : all items will be shown; * else shows the \ * * @return - */ _ENTRY_ void Session_DispItems( CContext sContext, bool allFields, cAppCharP specificItem ); /*! Delete a session context. * No access to \ will be done after this call * * @param The session context * @return error code, if context could not be deleted. */ _ENTRY_ TSyError Session_DeleteContext( CContext sContext ); /* -- OPEN ---------------------------------------------------------------------- */ /*! This routine is called to create a new context for a datastore access. * It must allocate all resources for this context and initialize the \ * parameter with a value that allows re-identifying the context. * \ can either be a pointer to the local context structure or any key * value which allows to re-identify the context later. * Subsequent calls related to this context will pass the \ value as returned * from CreateContext. The context must be valid until 'DeleteContext' is called. * \ can be defined individually. * * NOTE: The SyncML engine treats \ simply as a key. The only condition * is uniqueness for all datastore contexts. Even \ = 0 can be used. * * @param Returns a value, which allows to identify this datastore context. * @param Allows to identify the context, if more than one must be * handled. \ is defined at the XML configuration. * @param DB_Callback structure for datatstore logging. * @param The result of 'Session_CheckDevice' comes in here. * @param The result of 'Session_Login' comes in here. * * @return error code, if context could not be created (e.g. not enough memory), * 0 if context successfully created. */ _ENTRY_ TSyError CreateContext( CContext *aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ); /*! This function asks for specific context configurations * * @param The datastore context * @param The SyncML sends a list of support rules. * This function has to reply, up to which rule, * contexts are supported (and switched on now). * Data is formatted as multiline aa:bb\cc:dd[\] * * @return Up to \ fields are supported (and switched on) for this context. * If 0 will be returned, no field of \ is supported. * */ _ENTRY_ uInt32 ContextSupport( CContext aContext, cAppCharP aSupportRules ); /*! This function asks for filter support. * * @param The datastore context * @param The SyncML sends a list of filter rules. * This function has to reply, up to which rule, * filters are supported (and switched on now). * Data is formatted as multiline aa:bb\cc:dd[\] * * @return Up to \ filters are supported (and switched on) for this context * If 0 will be returned, no field of \ are supported. */ _ENTRY_ uInt32 FilterSupport( CContext aContext, cAppCharP aFilterRules ); /* -- GENERAL ------------------------------------------------------------------- */ /*! Due to the architecture of the SyncML engine, the system may run in a multithread * environment. The consequence is that each routine of this API module can be * called by a different thread. Normally this is not a problem, nevertheless * this routine notifies about thread changes in \. * It can be ignored ( =implemented empty), if not really needed. * * @param The datastore context. * * @result - */ _ENTRY_ void ThreadMayChangeNow( CContext aContext ); /*! This functions writes \ for this context * Can be implemented empty, if not needed. * * @param The datastore context. * @param Logging information, formatted as multiline aa:bb\cc:dd[\] * * @result - */ _ENTRY_ void WriteLogData( CContext aContext, cAppCharP logData ); /*! Writes the context of all items to dbg output path * This routine is implemented for debug purposes only and will NOT BE CALLED by the * SyncML engine. Can be implemented empty, if not needed. * * @param The datastore context. * @param * - true : all fields, also empty ones, will be displayed; * - false: only fields <> "" will be shown * @param * - "" : all items will be shown; * - else : shows the \ * * @return - */ _ENTRY_ void DispItems( CContext aContext, bool allFields, cAppCharP specificItem ); /* -- ADMINISTRATION ------------------------------------------------------------ */ /* This section contains the 'admin read' and 'admin write' routines. */ /*! This function gets the stored information about the record with the four paramters: * \, \, \, \. * * - \yes\: Admin/Map routines will be used. * * @param The datastore context * @param Name of the local DB * @param Name of the remote DB * @param The data, saved with the last 'SaveAdminData' call * * @return error code 404 (NotFound), if record is not (yet) available, * 0 (no error) if admin data found * * NOTE: \ and \ have been passed with 'CreateContext' already. * The plug-in module must have stored them within the datastore context. * * USED ONLY WITH \ */ _ENTRY_ TSyError LoadAdminData ( CContext aContext, cAppCharP aLocDB, cAppCharP aRemDB, appCharP *adminData ); /*! This is the equivalent to 'LoadAdminData', but using a key instead of a data string */ _ENTRY_ TSyError LoadAdminDataAsKey( CContext aContext, cAppCharP aLocDB, cAppCharP aRemDB, KeyH aItemKey ); /*! This functions stores the new \ for this context * * @param The datastore context * @param The new set of admin data to be stored, will be loaded again * with the next 'LoadAdminData' call. * * @result error code, if data could not be saved (e.g. not enough memory); * 0 if successfully created. * * USED ONLY WITH \ */ _ENTRY_ TSyError SaveAdminData ( CContext aContext, cAppCharP adminData ); /*! This is the equivalent to 'SaveAdminData', but using a key instead of a data string */ _ENTRY_ TSyError SaveAdminDataAsKey( CContext aContext, KeyH aItemKey ); /*! Map table handling: Get the next map item of this context. * If \ is true, the routine must start to return the first element * * @param The datastore context * @param MapID ( with \,\, and \ ). * @param Starting with the first MapID. When creating a context, * the first call will get the first MapID, even if \ * is false. * * @return * - true: as long as there is a MapID available, which must be assigned to * - false: if there is no more MapID. Nothing must be assigned to * * USED ONLY WITH \ */ _ENTRY_ bool ReadNextMapItem( CContext aContext, MapID mID, bool aFirst ); /*! Map table handling: Insert a map item of this context * * @param The datastore context * @param MapID ( with \,\, \ and \ ). * * @return error code, if this MapID can't be inserted, or if already existing * * USED ONLY WITH \ */ _ENTRY_ TSyError InsertMapItem( CContext aContext, cMapID mID ); /*! Map table handling: Update a map item of this context * * @param The datastore context * @param MapID ( with \,\, \ and \ ). * If there is already a MapID element with \ and \, * it will be updated, else created. * * @return error code, if this MapID can't be updated (e.g. not yet existing). * * USED ONLY WITH \ */ _ENTRY_ TSyError UpdateMapItem( CContext aContext, cMapID mID ); /*! Map table handling: Delete a map item of this context * * @param The datastore context * @param MapID ( with \,\, \ and \ ). * * @return error code, if this MapID can't deleted, * or if this MapID does not exist. * * USED ONLY WITH \ */ _ENTRY_ TSyError DeleteMapItem( CContext aContext, cMapID mID ); /* -- READ ---------------------------------------------------------------------- */ /*! This routine initializes reading from the database * StartDataRead must prepare the database to return the objects of this context. * * @param The datastore context. * @param The value which has been returned by this module * at the last "EndDataWrite" call will be given. * It will be "", when called the first time. * Normally this token is an ISO8601 formatted string * which represents the module's current time (at the * beginning of a session). It will be used to decide at * 'ReadNextItem' whether a record has been changed. * @param Token for Suspend/Resume mode. * * @return error code */ _ENTRY_ TSyError StartDataRead( CContext aContext, cAppCharP lastToken, cAppCharP resumeToken ); /*! This routine reads the next ItemID from the database. * \ of 'ContextSupport' ( "ReadNextItem:allfields" ) and * \ of 'FilterSupport' must be considered. * If \ is true, the routine must return the first element (again). * * @param The datastore context. * @param The assigned ItemID in the database; * will be ignored by the SyncML engine, if \ = 0 * @param The data, formatted as multiline aa:bb\cc:dd[\]; * will be ignored by the SyncML engine, if \ = 0 * @param * - ReadItem_EOF ( =0 ) for none ( =eof ), * - ReadItem_Changed ( =1 ) for a changed item, * - ReadItem_Unchanged ( =2 ) for unchanged item. * - ReadItem_Resumed ( =3 ) for a changed item (since resumed) * @param * - true: the routine must return the first element * - false: the routine must return the next element * * @return error code, if not ok. No datasets found is a success as well ! * * * NOTE: The memory for \ and \ must be allocated locally. * The SyncML engine will call 'DisposeObj' later for these objects to * release the memory again. It needn't to be allocated, if \ * is ReadItem_EOF. * * NOTE: By default, the SyncML engine asks for \ only. * \ can be returned, if anyway available or * \ must be returned, if the engine asks for it * (when calling "ReadNextItem:allfields" at 'ContextSupport' with \). */ _ENTRY_ TSyError ReadNextItem ( CContext aContext, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ); /*! This is the equivalent to 'ReadNextItem', but using a key instead of a data string */ _ENTRY_ TSyError ReadNextItemAsKey( CContext aContext, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ); /*! This routine reads the contents of a specific ItemID \ from the database. * * @param The datastore context. * @param The assigned ItemID in the database * @param Returns the data, formatted as multiline aa:bb\cc:dd[\] * * @return error code, if not ok ( e.g. invalid \ ) * * * NOTE: The memory for \ must be allocated locally. * The SyncML engine will call 'DisposeObj' later for \, * to release again its memory. */ _ENTRY_ TSyError ReadItem ( CContext aContext, cItemID aID, appCharP *aItemData ); /*! This is the equivalent to 'ReadItem', but using a key instead of a data string */ _ENTRY_ TSyError ReadItemAsKey( CContext aContext, cItemID aID, KeyH aItemKey ); /*! This routine reads the specific binary logic block \,\ * from the database. * * @param The datastore context. * @param ItemID ( with \,\ ). * @param The assigned ID of the blob. * * @param Position and size (in bytes) of the blob block. * @param * - Input: Maximum size (in bytes) of the blob block to be read. * If \ is 0, the result size is not limited. * - Output: Size (in bytes) of the blob block. * \ must not be larger than its input value. * @param Total size of the blob (in bytes), can be also 0, * if not available, e.g. for a stream. * * @param (Input) * - true : Engine asks for the first block of this blob. * - false: Engine asks for the next block of this blob. * * @param (Output) * - true : This is the last part (or the whole) blob. * - false: More blocks will follow. * * @return error code, if not ok ( e.g. invalid \,\ ) * * * NOTE 1) The memory at \,\ must be allocated locally. * The SyncML engine will call 'DisposeObj' later for \, * to release the memory. * * NOTE 2) Empty blobs are allowed, \ and \ must be set to 0, * \ can be undefined, \ must be true. * No 'DisposeObj' call is required for this case. * * NOTE 3) The SyncML engine can change to read another blob before * having read the whole blob. It will never resume reading of this * incomplete blob, but start reading again with \ = true. */ _ENTRY_ TSyError ReadBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer *aBlkPtr, memSize *aBlkSize, memSize *aTotSize, bool aFirst, bool *aLast ); /*! This routine terminates the read from database phase * It can be used e.g. for termination of a transaction. * In standard case it can be implemented empty, returning simply a value LOCERR_OK = 0. * * @param The datastore context. * @return error code */ _ENTRY_ TSyError EndDataRead( CContext aContext ); /* -- WRITE --------------------------------------------------------------------- */ /*! This routine initializes writing to the database * * @param The datastore context. * @return error code, if not ok (e.g. invalid select options) */ _ENTRY_ TSyError StartDataWrite( CContext aContext ); /*! This routine inserts a new dataset to the database. The assigned * new ItemID \ will be returned. * * @param The datastore context. * @param The data, formatted as multiline aa:bb\cc:dd[\] * @param Database key of the new dataset. * * @return error code * - LOCERR_OK ( =0 ), if successful * - DB_DataMerged ( =207 ), if successful, but item actually stored * was updated with data from * external source or another * sync set item. Engine will * request updated version * using ReadItem. * (server add case only) * - DB_DataReplaced ( =208 ), if successful, but item added replaces * another item that already * existed in the sync set. * (server add case only) * - DB_Conflict ( =409 ), if database requests engine to merge * existing data with the * to-be stored data first. * - DB_Forbidden ( =403 ), if \ can't be resolved * - DB_Full ( =420 ), if not enough space in the DB * - ... or any other SyncML error code, see Reference Manual * * NOTE: The memory for \ must be allocated locally. * The SyncML engine will call 'DisposeObj' later for \, * to release the memory * */ _ENTRY_ TSyError InsertItem ( CContext aContext, cAppCharP aItemData, ItemID aID ); /*! This is the equivalent to 'InsertItem', but using a key instead of a data string */ _ENTRY_ TSyError InsertItemAsKey( CContext aContext, KeyH aItemKey, ItemID aID ); /*! This routine updates an existing dataset of the database * * @param The datastore context. * @param The data, formatted as multiline aa:bb\cc:dd[\] * @param Database key of dataset to be updated * @param * - Input: NULL is assigned as default value to * \ and \. * - Output: The updated database key for \. * Can be NULL, if the same as \ * * @return error code * - LOCERR_OK ( =0 ), if successful * - DB_Forbidden ( =403 ), if \ can't be resolved * - DB_NotFound ( =404 ), if unknown \ * - DB_Full ( =420 ), if not enough space in the DB * - ... or any other SyncML error code, see Reference Manual * * * NOTE: \ must either contain NULL references ( if the same as \ ), * or the memory for \,\ must be allocated locally. * The SyncML engine will call 'DisposeObj' later for \ and * \ to release the memory. * \ can be NULL, if the hierarchical model is not supported. */ _ENTRY_ TSyError UpdateItem ( CContext aContext, cAppCharP aItemData, cItemID aID, ItemID updID ); /*! This is the equivalent to 'UpdateItem', but using a key instead of a data string */ _ENTRY_ TSyError UpdateItemAsKey( CContext aContext, KeyH aItemKey, cItemID aID, ItemID updID ); /*! This routine moves \ from \ to \ * * @param The datastore context. * @param ItemID ( with \,\ ) to be moved. * @param New parent ID for \ * * @return error code * - LOCERR_OK ( =0 ), if successful * - DB_NotFound ( =404 ), if unknown \ * - DB_Full ( =420 ), if not enough space in the DB * - ... or any other SyncML error code, see Reference Manual */ _ENTRY_ TSyError MoveItem( CContext aContext, cItemID aID, cAppCharP newParID ); /*! This routine deletes a dataset from the database * * @param The datastore context. * @param ItemID ( with \,\ ) to be deleted. * * @return error code * - LOCERR_OK ( =0 ), if successful * - DB_NotFound ( =404 ), if unknown \ * - ... or any other SyncML error code, see Reference Manual */ _ENTRY_ TSyError DeleteItem( CContext aContext, cItemID aID ); /*! This routine updates a temporary to an at the end * For cached systems which assign IDs at the end of a run. * * @param The datastore context. * @param Database key of dataset to be updated * @param * - Input: NULL is assigned as default value to * \ and \. * - Output: The updated database key for \. * Can be NULL, if the same as \ * * @return error code * - LOCERR_OK ( =0 ), if successful * - DB_Forbidden ( =403 ), if \ can't be resolved * - DB_NotFound ( =404 ), if unknown \ * - LOCERR_NOTIMP ( =20030 ), if no finalizing is needed at all * - ... or any other SyncML error code, see Reference Manual * * NOTE: \ must either contain NULL references ( if the same as \ ), * or the memory for \ must be allocated locally. * The SyncML engine will call 'DisposeObj' later for \ * to release the memory. \should be always NULL. */ _ENTRY_ TSyError FinalizeLocalID( CContext aContext, cItemID aID, ItemID updID ); /*! This routine deletes all datasets from the database * * @param The datastore context. * * @return error code * - LOCERR_OK ( =0 ), if successful * - LOCERR_NOTIMP ( =20030 ). For this case, the engine removes all items directly * - ... or any other SyncML error code, see Reference Manual */ _ENTRY_ TSyError DeleteSyncSet( CContext aContext ); /*! This routine writes the specific binary logic block \ to the database. * * @param The datastore context. * @param ItemID ( with \,\ ). * @param The assigned ID of the blob. * * @param * @param Position and size (in bytes) of the blob block. * @param Total size of the blob (in bytes), * Can be also 0, if not available, e.g. for a stream. * * @param * - true : this is the first block of the blob. * - false: this is the next block. * @param * - true : this is the last block. * - false: more blocks will follow. * * @return error code, if not ok ( e.g. invalid \,\ ) * * NOTE: Empty blobs are possible, \ and \ will be set to 0, * \ will be NULL, \ and \ will be true. */ _ENTRY_ TSyError WriteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, appPointer aBlkPtr, memSize aBlkSize, memSize aTotSize, bool aFirst, bool aLast ); /*! This routine deletes the specific binary logic block \ at the database. * * @param The datastore context. * @param ItemID ( with \,\ ). * @param The assigned ID of the blob. * * @return error code, if not ok ( e.g. invalid \,\ ) */ _ENTRY_ TSyError DeleteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID ); /*! Advises the database to finsish the running transaction * * @param The datastore context. * @param * - true: All former actions were successful, * so the database can commit * - false: The transaction was not successful, * so the database may rollback or ignore the transaction. * * @param An internally generated string value, which * will be used to identify changed database records. * It is normally an ISO8601 formatted string, which * represents the module's current time (at the * time the 'StartDataRead' of this context has been * called). All changed records of the currrent context * must get this token as timestamp as as well. * The SyncML engine will return this value with the * 'StartDataRead' call within the next session. * It must return NULL in case of no \. * * @return error code, if operation can't be performed. No \ is not an error. * * * NOTE: By default, the SyncML engine expects an ISO8601 string for \. * But the SyncML engine can be configured to treat this value completely * opaque, if implemented in a different way. * * The \ must be allocated locally and will be * disposed with a 'DisposeObj' call later by the SyncML engine. */ _ENTRY_ TSyError EndDataWrite( CContext aContext, bool success, appCharP *newToken ); /* ---- ADAPT ITEM -------------------------------------------------------------- */ /*! This function adapts aItemData * * @param The datastore context * @param The 1st item's data * @param The 2nd item's data * @param The local vars * @param To identify, where it is called * * @return error code * * NOTE: The memory for adapted strings must be allocated locally. * The SyncML engine will call 'DisposeObj' later, to release again its memory. * One or more strings can be returned unchanged as well. */ _ENTRY_ TSyError AdaptItem( CContext aContext, appCharP *aItemData1, appCharP *aItemData2, appCharP *aLocalVars, uInt32 aIdentifier ); /* -- DISPOSE / CLOSE ----------------------------------------------------------- */ /*! Disposes memory, which has been allocated within the datastore context. * 'DisposeObj' can occur at any time within \. * * @param The datastore context. * @param Dispose allocated memory. * * @return - * */ _ENTRY_ void DisposeObj( CContext aContext, void* memory ); /*! This routine is called to delete a context, that was previously created with * 'CreateContext'. The DB Module must free all resources related to this context. * No calls with \ will be done after calling this routine, so the * assigned structure, allocated at 'CreateContext' can be released here. * * @param The datastore context. * * @result error code, if context could not be deleted ( e.g. not existing \ ). */ _ENTRY_ TSyError DeleteContext( CContext aContext ); #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sync_dbapidef.h0000755000373300037200000007715112424517753027752 0ustar00nightlyallusers00000000000000/* * File: sync_dbapidef.h * * Author: Beat Forster (bfo@synthesis.ch) * * C/C++ Programming interface between * the Synthesis SyncML engine * and the database layer * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * * These are the definitions for the calling interface between the * Synthesis SyncML engine and a customized module "sync_dbapi". * The same interface can be used either for Standard C or for C++. * Normally the customized module will be compiled as DLL and will * be called by the SyncML engine. A linkable library is available * (for C++) as well. * */ /* NOTE: As this file should work for all kind of plain C compilers * comments with double slashes "//" must be avoided !! */ #ifndef SYNC_DBAPIDEF_H #define SYNC_DBAPIDEF_H #include "sync_include.h" #include "sync_declarations.h" /* export prefix and suffix is dependent on platform and source language */ #ifdef __cplusplus #define ENTRY_C extern "C" #else #define ENTRY_C #endif #if defined MACOSX #define ENGINE_ENTRY ENTRY_C #define ENGINE_ENTRY_CXX #ifdef __GNUC__ #define ENTRY_ATTR __attribute__((visibility("default"))) #else #define ENTRY_ATTR #endif #elif defined _MSC_VER /* Visual Studio 2005 requires a specific entry point definition */ /* This definition is empty for all other platforms */ #define ENGINE_ENTRY ENTRY_C _declspec(dllexport) #define ENGINE_ENTRY_CXX ENGINE_ENTRY #define ENTRY_ATTR #else #define ENGINE_ENTRY ENTRY_C #define ENGINE_ENTRY_CXX #define ENTRY_ATTR #endif /* compose name of external symbols with C binding: * by default use parameter as-is (backwards compatibility) for client, * and use "SySync_srv_" prefix for server. * Newer builds usually use "SySync_" as prefix for client entry points. * can be changed in any file that is included before * this file */ #ifndef SYSYNC_EXTERNAL # define SYSYNC_EXTERNAL(_x) _x # define SYSYNC_PREFIX "" #endif #ifndef SYSYNC_EXTERNAL_SRV # define SYSYNC_EXTERNAL_SRV(_x) SySync_srv_ ## _x # define SYSYNC_PREFIX_SRV "SySync_srv_" #endif #ifdef __cplusplus namespace sysync { #endif /* ---- Plugin versions ------------------------------------------------------------------------------- */ /* To make the SyncML engine and the Plugin SDK upwards/downwards compatible to each other, * some version info must be checked and compared: VP_XXX is the min version of the plugin to * support a certain feature, VE_XXX is the min version of the engine to support a feature. * The plugin will get the engine's version with "Plugin_Params". * The version number for engine AND plugin is defined as SDK_VERSION/SUBVERSION at "SDK_util.c" * Normally, the version number of the engine must be equal or higher than the plugin's version. */ /* ---- Plugin support ---- */ /* For the first versions, "N" is the platform identifier */ enum Version { /*VP_Init 0x01000000 * V1.0.N.0 : Initial version */ /*VP_1st 0x01000002 * V1.0.N.2 : 1st delivered version */ /*VP_Session_Login 0x01000003 * V1.0.N.3 : VAR_String for Session_Login: this version only */ /*VP_EngineVersionParam 0x01000004 * V1.0.N.4 : param for "Module_PluginParams" */ /*VP_CB_Version2 = 0x01000005 * V1.0.N.5 : Callback version >= 2 supported */ /** V1.0.N.6 : With new function "DeleteBlob" */ VP_DeleteBlob = 0x01000006, /** V1.0.N.7 : With new "scripting" function "AdaptItemData" */ VP_AdaptItemData = 0x01000007, /** V1.0.N.8 : Supports "InsertMapItem" */ VP_InsertMapItem = 0x01000008, /* From now on, the platform info can be found at he capabilities, "X" is a user defined build nr */ /** V1.0.5.X : "X": With customer defined plugin build number */ VP_NewBuildNumber = 0x01000500, /** V1.0.6.X : Suspend/Resume extension for 'StartDataRead' */ VP_ResumeToken = 0x01000600, /** V1.0.8.X : "Session_GetDBTime" supported */ VP_GetDBTime = 0x01000800, /** V1.0.9.X : Callback version >= 3 supported: exotic */ VP_CB_Version3 = 0x01000900, /** V1.0.10.X: Callback version >= 4 supported: allowDLL */ VP_CB_Version4 = 0x01000a00, /** V1.0.10.X: With enhanced "scripting" function "AdaptItem" */ VP_AdaptItem = 0x01000a00, /* The new SyncML engine V2.9.X/V3.X.X runs best with versions from here onwards */ /** V1.1.0.X : Enhanced Plugin Info support: Server > 2.9.5.0 */ VP_Plugin_Info = 0x01010000, /** V1.2.1.X : With additional password mode + JNI adaption */ VP_MD5_Nonce_IN = 0x01020100, /*VP_061012 0x01020200 * V1.2.2 : Released 12-Oct-06 */ /*VP_061207 0x01030000 * V1.3.0 : Released 07-Dec-06, Visual Studio support */ /** V1.3.1.X : With UI function support */ VP_UI_Support = 0x01030100, /*VP_070131 0x01030200 * V1.3.2 : Released 31-Jan-07 */ /*VP_070201 0x01030300 * V1.3.3 : Released 01-Feb-07 */ /** V1.3.4.X : Java Callback with */ VP_Call_cContext = 0x01030400, /** V1.3.4.X : Callback version >= 7 supported: UI / thisCB */ VP_CB_Version7 = 0x01030400, /*VP_070212 0x01030600 * V1.3.6.X : Released 12-Feb-07 */ /** V1.3.8.X : Support for GlobContext structure */ VP_GlobContext = 0x01030800, /** V1.3.9.X : Callback version >= 8 supported: extended UI */ VP_CB_Version8 = 0x01030900, /** V1.4.0.X : With UI application support / Beta release */ VP_UIApp = 0x01040000, /** V1.4.7.X : Callback version >= 9 supported: dbapi tunnel */ VP_CB_Version9 = 0x01040700, /** V1.4.8.X : "FinalizeLocalID"/"DeleteSyncSet" support. */ VP_FLI_DSS = 0x01040800, /** V1.5.0.X : Released version Aug 2008 */ VP_Release_1_5_0 = 0x01050000, /** V1.5.1.X : Multiple global contexts supported */ VP_GlobMulti = 0x01050100, /** V1.5.2.X : Callback version >= 11 supported: dbapi tunnel */ VP_CB_Version11 = 0x01050200, /** V1.6.0.X : Tunnel support */ VP_Tunnel = 0x01060000, /** V1.6.1.X : Correct SetValue support */ VP_SetValue = 0x01060100, /** V1.6.2.X : 64 bit Java BLOB signature */ VP_BLOB_JSignature = 0x01060200, /*VP_091221 0x01060200 * V1.6.2 : Released 21-Dec-09 */ /** V1.7.0.X : First release of the Android client */ VP_Android_1st_Release = 0x01070000, /*VP_100429 0x01070000 * V1.7.0 : Released 29-Apr-10 */ /* 0x01070200 * V1.7.2 : never released as SDK */ VP_ADMIN_AS_KEY = 0x01080000, /*VP_110131 = 0x01090000 * V1.9.0 : Released 31-Jan-11 (Android) */ /** V1.9.1.X : Current version, use 'Plugin_Version()' */ VP_CurrentVersion = 0x01090100, /** -------- : Bad/undefined version */ VP_BadVersion = 0xffffffff, /* ---- Engine support ---- */ /** V1.0.7.0 : Engine supports "InsertMapItem" */ VE_InsertMapItem = 0x01000700 }; /* ---- Function names -------------------------------------------------------------------------------- */ /* ---- module ---- */ #define Mo_CC "Module_CreateContext" #define Mo_Ve "Module_Version" #define Mo_Ca "Module_Capabilities" #define Mo_PP "Module_PluginParams" #define Mo_DO "Module_DisposeObj" #define Mo_DC "Module_DeleteContext" /* ---- session ---- */ #define Se_CC "Session_CreateContext" #define Se_TC "Session_ThreadMayChangeNow" #define Se_DI "Session_DispItems" #define Se_CD "Session_CheckDevice" #define Se_GN "Session_GetNonce" #define Se_SN "Session_SaveNonce" #define Se_SD "Session_SaveDeviceInfo" #define Se_GT "Session_GetDBTime" #define Se_PM "Session_PasswordMode" #define Se_LI "Session_Login" #define Se_LO "Session_Logout" #define Se_DO "Session_DisposeObj" #define Se_DC "Session_DeleteContext" /* ---- datastore ---- */ #define Da_CC "CreateContext" #define Da_CS "ContextSupport" #define Da_FS "FilterSupport" #define Da_LA "LoadAdminData" #define Da_LAK "LoadAdminDataAsKey" #define Da_SA "SaveAdminData" #define Da_SAK "SaveAdminDataAsKey" #define Da_RM "ReadNextMapItem" #define Da_IM "InsertMapItem" #define Da_UM "UpdateMapItem" #define Da_DM "DeleteMapItem" #define Da_TC "ThreadMayChangeNow" #define Da_DI "DispItems" #define Da_WL "WriteLogData" #define Da_SR "StartDataRead" #define Da_RN "ReadNextItem" #define Da_RNK "ReadNextItemAsKey" #define Da_RI "ReadItem" #define Da_RIK "ReadItemAsKey" #define Da_RB "ReadBlob" #define Da_ER "EndDataRead" #define Da_SW "StartDataWrite" #define Da_II "InsertItem" #define Da_IIK "InsertItemAsKey" #define Da_UI "UpdateItem" #define Da_UIK "UpdateItemAsKey" #define Da_MvI "MoveItem" #define Da_DeI "DeleteItem" #define Da_DSS "DeleteSyncSet" #define Da_FLI "FinalizeLocalID" #define Da_WB "WriteBlob" #define Da_DB "DeleteBlob" #define Da_EW "EndDataWrite" #define Da_DO "DisposeObj" #define Da_DC "DeleteContext" /* ---- Predefined capability names ------------------------------------------------------------------- */ #define CA_MinVersion "MINVERSION" /* Minimum requested engine version by the plugin */ #define CA_SubVersion "SUBVERSION" /* version of the sub system */ #define CA_SubSystem "SUBSYSTEM" /* Name of the sub system, used as capability separator */ #define CA_Manufacturer "MANUFACTURER" /* Name of the plugin manufacturer */ #define CA_Description "DESCRIPTION" /* A short description, what the plugin module is doing */ #define CA_Platform "PLATFORM" /* The software platform, e.g. "Windows", "Java", ... */ #define CA_DLL "DLL" /* Indicates, if plugin is a DLL */ #define CA_JNI "JNI" /* Indicates, if plugin is based on JNI */ #define CA_CSHARP "C#" /* Indicates, if plugin is based on C# */ #define CA_GUID "GUID" /* GUID */ #define CA_Plugin "PLUGIN" /* Built-In plugin name */ #define CA_GlobContext "GlobContext" /* The global context, if available */ #define CA_ADMIN_Info "ADMIN_Info" /* Get ADMIN info as "ADMIN" with 'CreateContext' */ /* (supported for V1.3.7 and higher) */ #define CA_ItemAsKey "ITEM_AS_KEY" /* Supports the AsKey" mode */ #define CA_AdminAsKey "ADMIN_AS_KEY" /* Supports the AsKey" mode for Load/SaveAdminData */ #define CA_DeleteSyncSet "DeleteSyncSet"/* DeleteSyncSet ist fully implemented */ #define CA_ResumeSupported "ResumeSupported" /* InsertMapItem is functional, defaults to "yes" if the method is available. Can be used to override its usage. */ #define CA_Error "ERROR" /* Capability error */ /* Predefined identifiers */ #define ADMIN_Ident " ADMIN" /* Appended identifier for admin datastore recognition */ /* Activated with capability CA_ADMIN_Info */ /* ---- Allow to switch off certain parts of the plug-in module --------------------------------------- */ #define Plugin_Start "plugin_start" #define Plugin_Param "plugin_param" #define Plugin_Session "plugin_se" #define Plugin_SE_Adapt "plugin_sessionadapt" #define Plugin_SE_Auth "plugin_sessionauth" #define Plugin_DV_Admin "plugin_deviceadmin" #define Plugin_DV_DBTime "plugin_dbtime" #define Plugin_Datastore "plugin_ds" #define Plugin_DS_General "plugin_datageneral" #define Plugin_DS_Admin "plugin_datastoreadmin" #define Plugin_DS_Admin_Str "plugin_datastoreadmin_str" #define Plugin_DS_Admin_Key "plugin_datastoreadmin_key" #define Plugin_DS_Admin_Map "plugin_datastoreadmin_map" #define Plugin_DS_Data "plugin_datastore" #define Plugin_DS_Data_Str "plugin_datastore_str" #define Plugin_DS_Data_Key "plugin_datastore_key" #define Plugin_DS_Blob "plugin_datablob" #define Plugin_DS_Adapt "plugin_dataadapt" #define Plugin_UI "plugin_ui" /* Compatibility to older versions */ #define Plugin_SE_Auth_OLD "plugin_sessionauth_OLD" #define Plugin_DS_Data_OLD1 "plugin_datastore_OLD1" #define Plugin_DS_Data_OLD2 "plugin_datastore_OLD2" #define Plugin_DS_Admin_OLD "plugin_datastoreadmin_OLD" #define Plugin_DS_Blob_OLD1 "plugin_datablob_OLD1" #define Plugin_DS_Blob_OLD2 "plugin_datablob_OLD2" /* ---------------------------------------------------------------------------------------------------- */ /*! Item and its special definitions */ #define StdPattern ":" /* std identifier */ #define ArrayPattern "[" /* array identifier */ #define BlobPattern ";BLOBID=" /* blob identifier */ #define TZNamePattern ";TZNAME=" /* tzname identifier */ #define TZOffsPattern ";TZOFFS=" /* tzoffs identifier */ /*! Result value of Session_PasswordMode */ enum PasswordMode { Password_Mode_Undefined = -1, /* undefined mode */ Password_ClrText_IN = 0, Password_ClrText_OUT = 1, Password_MD5_OUT = 2, /* MD5B64(user:pwd) */ Password_MD5_Nonce_IN = 3, /* MD5B64(MD5B64(user:pwd):nonce) */ }; /*! Result status of ReadNextItem */ enum ReadNextItemResult { ReadNextItem_EOF = 0, /* no more items to read */ ReadNextItem_Changed = 1, ReadNextItem_Unchanged = 2, ReadNextItem_Resumed = 3, /* OMA DS 1.2 suspend/resume support */ }; /*! Structure of hierarchical item ID */ struct ItemIDType { appCharP item; appCharP parent; }; /*! Structure of map ID */ struct MapIDType { appCharP localID; appCharP remoteID; uInt16 flags; uInt8 ident; }; /*! Structure of GlobContext */ struct GlobContext { void* ref; /* reference field */ struct GlobContext* next; /* reference to the next GlobContext structure */ uInt32 cnt; /* link count */ char refName[ 80 ]; /* the reference's name, length restricted */ }; #define GlobContext_JavaVM "JavaVM" /*! Undefined function for place holder at 'ConnectFunctions', must have pointer size */ #define XX (char *)-1 /* ---- CALLBACK / CALL-IN -------------------------------------------------------- */ /*! The callback structure allows logging of debug information within the * files of the Synthesis SyncML engine. 'CreateContext' for module, session * and datastore will pass a reference to such a struct. * The same structure contains all call-in functions for the UI Api. */ /** * : Reserved plugin specific bit masks. * These flags are only used by the SDK_util logging helper functions. * They are *not* passed into the Synthesis engine and thus cannot * control how the logged text is stored in the log file. */ enum DebugFlags { /** No debugging */ DBG_PLUGIN_NONE = 0x0000, /** Engine internal calls for plugin interface */ DBG_PLUGIN_INT = 0x0001, /** DB access calls, standard for all plugin examples */ DBG_PLUGIN_DB = 0x0002, /** DB access calls, exotic calls as well */ DBG_PLUGIN_EXOT = 0x0004, /** direct printf calls for test */ DBG_PLUGIN_DIRECT= 0x0008, /** GetValue/SetValue debugging */ DBG_GET_SET_VALUE= 0x0010, /** Default mask: all bits set */ DBG_PLUGIN_ALL = 0xffff, }; /*! Function prototypes for Debug calls */ typedef void (*DB_DebugPuts_Func) ( void* aCallbackRef, cAppCharP aText ); typedef void (*DB_DebugExotic_Func) ( void* aCallbackRef, cAppCharP aText ); typedef void (*DB_DebugBlock_Func) ( void* aCallbackRef, cAppCharP aTag, cAppCharP aDesc, cAppCharP aAttrText ); typedef void (*DB_DebugEndBlock_Func) ( void* aCallbackRef, cAppCharP aTag ); typedef void (*DB_DebugEndThread_Func)( void* aCallbackRef ); /* Function prototypes for UI call-in */ /* ---- Engine init ---- */ typedef TSyError (*SetStringMode_Func) ( void* aCB, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ); typedef TSyError (*InitEngineXML_Func) ( void* aCB, cAppCharP aConfigXML ); typedef TSyError (*InitEngineFile_Func) ( void* aCB, cAppCharP aConfigFilePath ); typedef TSyError (*InitEngineCB_Func) ( void* aCB, TXMLConfigReadFunc aReaderFunc, void* aContext ); /* ---- Running a Sync Session ---- */ typedef TSyError (*OpenSession_Func) ( void* aCB, SessionH *aSessionH, uInt32 aSelector, cAppCharP aSessionName ); typedef TSyError (*OpenSessionKey_Func) ( void* aCB, SessionH aSessionH, KeyH *aKeyH, uInt16 aMode ); typedef TSyError (*SessionStep_Func) ( void* aCB, SessionH aSessionH, uInt16 *aStepCmd, TEngineProgressInfo *aInfoP ); typedef TSyError (*GetSyncMLBuffer_Func) ( void* aCB, SessionH aSessionH, bool aForSend, appPointer *aBuffer, memSize *aBufSize ); typedef TSyError (*RetSyncMLBuffer_Func) ( void* aCB, SessionH aSessionH, bool aForSend, memSize aRetSize ); typedef TSyError (*ReadSyncMLBuffer_Func) ( void* aCB, SessionH aSessionH, appPointer aBuffer, memSize aBufSize, memSize *aValSize ); typedef TSyError (*WriteSyncMLBuffer_Func)( void* aCB, SessionH aSessionH, appPointer aBuffer, memSize aValSize ); typedef TSyError (*CloseSession_Func) ( void* aCB, SessionH aSessionH ); /* ---- Settings access ---- */ typedef TSyError (*OpenKeyByPath_Func) ( void* aCB, KeyH *aKeyH, KeyH aParentKeyH, cAppCharP aPath, uInt16 aMode ); typedef TSyError (*OpenSubkey_Func) ( void* aCB, KeyH *aKeyH, KeyH aParentKeyH, sInt32 aID, uInt16 aMode ); typedef TSyError (*DeleteSubkey_Func) ( void* aCB, KeyH aParentKeyH, sInt32 aID ); typedef TSyError (*GetKeyID_Func) ( void* aCB, KeyH aKeyH, sInt32 *aID ); typedef TSyError (*SetTextMode_Func) ( void* aCB, KeyH aKeyH, uInt16 aCharSet, uInt16 aLineEndMode, bool aBigEndian ); typedef TSyError (*SetTimeMode_Func) ( void* aCB, KeyH aKeyH, uInt16 aTimeMode ); typedef TSyError (*CloseKey_Func) ( void* aCB, KeyH aKeyH ); typedef TSyError (*GetValue_Func) ( void* aCB, KeyH aKeyH, cAppCharP aValName, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize ); typedef TSyError (*GetValueByID_Func) ( void* aCB, KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, appPointer aBuffer, memSize aBufSize, memSize *aValSize ); typedef sInt32 (*GetValueID_Func) ( void* aCB, KeyH aKeyH, cAppCharP aName ); typedef TSyError (*SetValue_Func) ( void* aCB, KeyH aKeyH, cAppCharP aValName, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); typedef TSyError (*SetValueByID_Func) ( void* aCB, KeyH aKeyH, sInt32 aID, sInt32 arrIndex, uInt16 aValType, cAppPointer aBuffer, memSize aValSize ); /* ---- Function prototypes for DBApi ------------------------------------------------------------------- */ typedef TSyError (*SDR_Func)( CContext ac, cAppCharP lastToken, cAppCharP resumeToken ); typedef TSyError (*RdNItemSFunc)( CContext ac, ItemID aID, appCharP *aItemData, sInt32 *aStatus, bool aFirst ); typedef TSyError (*RdNItemKFunc)( CContext ac, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ); typedef TSyError (*Rd_ItemSFunc)( CContext ac, cItemID aID, appCharP *aItemData ); typedef TSyError (*Rd_ItemKFunc)( CContext ac, cItemID aID, KeyH aItemKey ); typedef TSyError (*EDR_Func)( CContext ac ); typedef TSyError (*SDW_Func)( CContext ac ); typedef TSyError (*InsItemSFunc)( CContext ac, cAppCharP aItemData, ItemID aID ); typedef TSyError (*InsItemKFunc)( CContext ac, KeyH aItemKey, ItemID aID ); typedef TSyError (*UpdItemSFunc)( CContext ac, cAppCharP aItemData, cItemID aID, ItemID updID ); typedef TSyError (*UpdItemKFunc)( CContext ac, KeyH aItemKey, cItemID aID, ItemID updID ); typedef TSyError (*MovItem_Func)( CContext ac, cItemID aID, cAppCharP newParID ); typedef TSyError (*DelItem_Func)( CContext ac, cItemID aID ); typedef TSyError (*FLI_Func)( CContext ac, cItemID aID, ItemID updID ); typedef TSyError (*DelSS_Func)( CContext ac ); typedef TSyError (*EDW_Func)( CContext ac, bool success, appCharP *newToken ); typedef void (*DisposeProc)( CContext xContext, void* memory ); /* ------------------------------------------------------------------------------------------------------ */ /*!< UI Api methods * NOTE: As this struct is part of the SDK_Interface_Struct, it is frozen and not directly extendable */ typedef struct { SetStringMode_Func SetStringMode; InitEngineXML_Func InitEngineXML; InitEngineFile_Func InitEngineFile; InitEngineCB_Func InitEngineCB; OpenSession_Func OpenSession; OpenSessionKey_Func OpenSessionKey; SessionStep_Func SessionStep; GetSyncMLBuffer_Func GetSyncMLBuffer; RetSyncMLBuffer_Func RetSyncMLBuffer; ReadSyncMLBuffer_Func ReadSyncMLBuffer; WriteSyncMLBuffer_Func WriteSyncMLBuffer; CloseSession_Func CloseSession; OpenKeyByPath_Func OpenKeyByPath; OpenSubkey_Func OpenSubkey; DeleteSubkey_Func DeleteSubkey; GetKeyID_Func GetKeyID; SetTextMode_Func SetTextMode; SetTimeMode_Func SetTimeMode; CloseKey_Func CloseKey; GetValue_Func GetValue; GetValueByID_Func GetValueByID; GetValueID_Func GetValueID; SetValue_Func SetValue; SetValueByID_Func SetValueByID; } SDK_UI_Struct; /*! The SDK dbapi tunnel structure (for internal use only) * NOTE: As this struct is part of the SDK_Interface_Struct, it is frozen and not directly extendable */ typedef struct { SDR_Func StartDataRead; RdNItemSFunc ReadNextItem; Rd_ItemSFunc ReadItem; EDR_Func EndDataRead; SDW_Func StartDataWrite; InsItemSFunc InsertItem; UpdItemSFunc UpdateItem; MovItem_Func MoveItem; DelItem_Func DeleteItem; EDW_Func EndDataWrite; DisposeProc DisposeObj; /* --- asKey functions */ RdNItemKFunc ReadNextItemAsKey; Rd_ItemKFunc ReadItemAsKey; InsItemKFunc InsertItemAsKey; UpdItemKFunc UpdateItemAsKey; } SDK_Tunnel_Struct; enum { /** Current callback version */ DB_Callback_Version = 11 }; /*! The SDK interface structure for callback and call-in */ typedef struct SDK_InterfaceType { uInt16 callbackVersion; /*!< The version of this callback struct */ appPointer callbackRef; /*!< The opaque pointer that must be returned in * the \ argument of all callbacks */ /* ---- callbackVersion>=1 fields ---- */ uInt16 debugFlags; /*!< Debug control flags: if<>0, debug is enabled */ DB_DebugPuts_Func DB_DebugPuts; /*!< Output prodedure to add things to the debug log */ CContext cContext; /*!< Callback C/C++ context, normally identical with * \; different e.g. for JNI */ CContext mContext; /*!< Module context */ CContext sContext; /*!< Session context */ /* ---- callbackVersion>=2 fields ---- */ DB_DebugBlock_Func DB_DebugBlock; /*!< Output proc to open a named (=aTag) structure block in the log */ DB_DebugEndBlock_Func DB_DebugEndBlock; /*!< Output proc to close a prev. opened named structure block in the log */ DB_DebugEndThread_Func DB_DebugEndThread; /*!< Output proc to signal debug logging system that no more debug output * will come from the calling thread */ uInt32 lCount; /*!< Level counter, for internal use only */ /* ---- callbackVersion>=3 fields ---- */ DB_DebugExotic_Func DB_DebugExotic; /*!< Output prodedure to add exotic things to the debug log */ /* ---- callbackVersion>=4 fields ---- */ uInt16 allow_DLL_legacy; /*!< Legacy, because of alignment problems * (as bool) on some platforms, * Use for new applications. */ /* ---- callbackVersion>=5 fields ---- */ uInt16 allow_DLL; /*!< DLLs can be used */ /* ---- callbackVersion>=6 fields ---- */ uInt32 reserved1; /*!< (Legacy UI_* funcs, no longer used) */ uInt32 reserved2; uInt32 reserved3; uInt32 reserved4; /* ---- callbackVersion>=7 fields ---- */ appPointer thisCB; /*!< a reference to this structure directly */ uInt32 logCount; /*!< Incremental counter for logs */ /* ---- callbackVersion>=8 fields ---- */ appPointer thisBase; /*!< base for abstract method calling */ appPointer jRef; /*!< base for java access */ CContext gContext; /*!< common global context */ SDK_UI_Struct ui; /*!< UI Api methods */ /* ---- callbackVersion>=9 fields ---- */ memSize SDK_Interface_size; /* size of this structure */ SDK_Tunnel_Struct dt; /* dbapi tunnel callback functions, for internal use only */ /* ---- callbackVersion>=10 fields ---- */ /* no additional fields, just information that SUBSYSTEM (CA_SubSystem) is supported */ /* ---- callbackVersion>=11 fields ---- */ /* SDK_Tunnel_Struct extended (at the end) with "asKey" functions */ /* ---- callbackVersion>=12 fields will go here ---- */ /* ... */ } SDK_Interface_Struct, *DB_Callback, *UI_Call_In; /* special case for = 8, higher versions contain a size field */ #define SDK_Interface_Struct_V8 8 #define SDK_Interface_Struct_V8_Size 184 /*! Wrapper for tunnel context callback */ struct TunnelWrapper { UI_Call_In tCB; /* the Call-In reference */ SessionH tContext; /* the tunnel session context */ appCharP tContextName; /* the tunnel session context name, needed for reopen in context */ KeyH tItemKey; /* an item key element for AsKey operations */ uInt16 tAfterWrite; /* is true after first Insert/Update/Move/Delete */ }; /* Tunnelwrapper */ /* -------------------------------------------------------------------------------------- */ /*! Function prototypes for engine connection/disconnection */ typedef TSyError (*ConnectEngine_Func) ( UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ); typedef TSyError (*ConnectEngineS_Func) ( UI_Call_In aCI, uInt16 aCallbackVersion, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ); typedef TSyError (*DisconnectEngine_Func) ( UI_Call_In aCI ); /* Entry point for connecting the SyncML engine as client from outside */ ENGINE_ENTRY TSyError SYSYNC_EXTERNAL(ConnectEngine) ( UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR; ENGINE_ENTRY TSyError SYSYNC_EXTERNAL(ConnectEngineS) ( UI_Call_In aCI, uInt16 aCallbackVersion, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR; /* Entry point for connecting the SyncML engine as server from outside */ ENGINE_ENTRY TSyError SYSYNC_EXTERNAL_SRV(ConnectEngine) ( UI_Call_In *aCI, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR; ENGINE_ENTRY TSyError SYSYNC_EXTERNAL_SRV(ConnectEngineS) ( UI_Call_In aCI, uInt16 aCallbackVersion, CVersion *aEngVersion, CVersion aPrgVersion, uInt16 aDebugFlags ) ENTRY_ATTR; /* Entry point for disconnecting the client engine at the end */ ENGINE_ENTRY TSyError SYSYNC_EXTERNAL(DisconnectEngine) ( UI_Call_In aCI ) ENTRY_ATTR; /* Entry point for disconnecting the client engine at the end */ ENGINE_ENTRY TSyError SYSYNC_EXTERNAL_SRV(DisconnectEngine) ( UI_Call_In aCI ) ENTRY_ATTR; #ifdef __cplusplus } // namespace #endif #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sync_declarations.h0000644000373300037200000000327212424517753030652 0ustar00nightlyallusers00000000000000/* * File: sync_declarations.h * * Author: Patrick Ohly * * C/C++ Programming interface between * the Synthesis SyncML engine * and the database layer * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * * These are the declarations for the calling interface between the * Synthesis SyncML engine and a UI and/or DB plugin. Use this * header file when you only need the declaration (= names) of the * various items defined in sync_dbapidef.h. For definitions of * enums include engine_defs.h. * * The following naming convention is used: * - struct fooType = struct or class name * - typedef struct { } foo_Struct = struct itself (in both C++ and C!) * - typedef struct { } *foo = pointer to struct * * This convention has evolved over time and is not used completely * consistently. * * Also note that some types refer to structs which have no real * definition anywhere: they are only introduced to make interfaces * type-safe. These pointer types use fooH as naming scheme. */ #ifndef SYNC_DECLARATIONS_H #define SYNC_DECLARATIONS_H #ifdef __cplusplus namespace sysync { #endif struct SDK_InterfaceType; struct ItemIDType; typedef struct ItemIDType ItemID_Struct, *ItemID; typedef const struct ItemIDType *cItemID; struct MapIDType; typedef struct MapIDType MapID_Struct, *MapID; typedef const struct MapIDType *cMapID; struct TEngineProgressType; typedef struct SessionType *SessionH; typedef struct KeyType *KeyH; /* @TODO: typedef const MapID cMapID: a const pointer or a pointer to const struct?! */ #ifdef __cplusplus } /* namespace sysync */ #endif #endif /* SYNC_DECLARATIONS_H */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sync_include.h0000644000373300037200000000402612424517753027623 0ustar00nightlyallusers00000000000000/* * File: sync_include.h * * Authors: Beat Forster (bfo@synthesis.ch) * * * SDK include definitions * * Copyright (c) 2004-2011 by Synthesis AG + plan44.ch * */ #ifndef SYNC_INCLUDE_H #define SYNC_INCLUDE_H #include "target_options.h" #include "generic_types.h" /* some basic defs, which aren't available */ #include "engine_defs.h" #include "syerror.h" /* "syerror.h" uses "generic_types.h" */ #if !defined(__cplusplus) && !defined(__OBJC__) #if !defined(SYSYNC_ENGINE) || !defined(__MACH__) || defined(__GNUC__) typedef unsigned char bool; #define false 0 #define true 1 #endif #endif #if !defined SYSYNC_ENGINE || !defined LINUX || defined __MACH__ typedef unsigned long ulong; #endif #ifdef SYSYNC_ENGINE /* ==> if it is running within the SyncML engine */ #ifdef __cplusplus #include "sysync.h" #include "platform_file.h" #else #if defined _MSC_VER #define NULL 0 #endif #include "sysync_debug.h" #endif #else /* ==> if running standalone, e.g. at a plug-in module */ #include /* used for printf calls */ #include /* used for the malloc/free calls */ #include /* used for strcpy/strlen calls */ #ifdef __cplusplus #ifndef __MACH__ /* MACH: IOFBF/RAND_MAX duplicate problem */ #include /* STL includes */ #include #endif #ifdef __GNUC__ #include #else #include /* type_info class */ #endif using namespace std; #endif #if defined __MACH__ && !defined __GNUC__ /* used for va_list support */ #include #else #include #endif #endif #ifdef DBAPI_FILEOBJ #ifndef FILEOBJ_SUPPORT #define FILEOBJ_SUPPORT 1 #endif #define PLATFORM_FILE 1 #endif /* JAVA native interface JNI */ #ifdef JNI_SUPPORT #include //#ifdef MACOSX // #include //#else // #include //#endif #endif #endif /* SYNC_INCLUDE_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sync_uiapi.h0000755000373300037200000000564512424517753027322 0ustar00nightlyallusers00000000000000/* * File: sync_uiapi.h * * Author: Beat Forster (bfo@synthesis.ch) * * C/C++ Programming interface between the * Synthesis SyncML engine and * the user interface layer for plug-ins * * Copyright (c) 2007-2011 by Synthesis AG + plan44.ch * */ /* * This is the calling interface between the Synthesis SyncML engine * and a customized module "sync_uiapi". * The same interface can be used either for Standard C or for C++. * And there is a equivalent interface for JNI (Java Native Interface). * Normally the customized module will be compiled as DLL and will * be called by the SyncML engine. A linkable library is available * (for C++) as well. * * NOTE: The plugin's module context is currently defined at * "sync_dbapi.h" as it is the same structure as for the * data base plugin. * * NOTE: As the SyncML engine calls the plug-in multithreaded, * all global structure accesses must be thread save. */ #ifndef SYNC_UIAPI_H #define SYNC_UIAPI_H /* // Global declarations #if defined __cplusplus // combine the definitions of different namespaces #ifdef SYSYNC_ENGINE using sysync::TSyError; #endif #endif */ /* C/C++ and DLL/library support * SYSYNC_ENGINE: true ( within the engine itself ) / false ( outside ) * PLUGIN_INFO : true ( within "plugin_info" program ) / false ( everywhere else ) */ #if !defined SYSYNC_ENGINE && !defined SYSYNC_ENGINE_TEST && !defined DBAPI_LINKED && !defined PLUGIN_INFO && !defined DLL_EXPORT #define DLL_EXPORT #endif /* Visual Studio 2005 requires a specific entry point definition */ /* This definition is empty for all other platforms */ #undef _ENTRY_ #ifdef DLL_EXPORT #define _ENTRY_ ENGINE_ENTRY #else #define _ENTRY_ #endif /* -- UI interface -------------------------------------------------------------- */ /*! Create a user interface context \ * * @param Returns a value, which allows to identify this UI context. * @param Name of this user interface context * @param UI_Callback structure for module logging * * @return error code, if context could not be created (e.g. not enough memory), * 0 if context successfully created. */ _ENTRY_ TSyError UI_CreateContext( CContext *uContext, cAppCharP uiName, UI_Call_In uCI ); /*! Start interaction with user interface at \. */ _ENTRY_ TSyError UI_RunContext( CContext uContext ); /*! This routine will be called as the last call, before this module is disconnected. * The SyncML engine will call 'UI_DisposeObj' (if required) before this call * * NOTE: This routine will be called ONLY, if the server stops in a controlled way. * Its good programming practice not to wait for this 'DeleteContext' call. * * @param The module context. * @return error code */ _ENTRY_ TSyError UI_DeleteContext( CContext uContext ); #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/syncexception.cpp0000755000373300037200000000246212424517753030377 0ustar00nightlyallusers00000000000000/* * File: SyncException.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncException... * SySync Exception classes * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-28 : luz : created * */ // includes #include "prefix_file.h" #include "sync_include.h" #include "sysync.h" #include "syncexception.h" using namespace sysync; TSyncException::TSyncException(const char *aMsg1, localstatus aLocalStatus) NOTHROW { fMessage = aMsg1; fLocalStatus = aLocalStatus; } // TSyncException::TSyncException TSyncException::TSyncException(localstatus aLocalStatus) NOTHROW { fLocalStatus = aLocalStatus; fMessage = "Exception due to local error status"; } // TSyncException::TSyncException TSyncException::~TSyncException() NOTHROW { } // TSyncException::~TSyncException const char *TSyncException::what() const NOTHROW { return fMessage.c_str(); } // TSyncException::getMessage void TSyncException::setMsg(const char *p) { fMessage=p; } // TSyncException::setMsg TSmlException::TSmlException(const char *aMsg, Ret_t aSmlError) NOTHROW { const int msgsiz=256; char msg[msgsiz]; fSmlError=aSmlError; msg[0]=0; snprintf(msg,msgsiz,"SyncML Toolkit error=0x%04hX, %s",(uInt16)fSmlError,aMsg); setMsg(msg); } // TSmlException::TSmlException // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/syncexception.h0000755000373300037200000000372612424517753030050 0ustar00nightlyallusers00000000000000/* * File: SyncException.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * TSyncException... * SySync Exception classes * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-28 : luz : created * */ #ifndef SyncException_H #define SyncException_H using namespace std; namespace sysync { #if defined(WINCE) || defined(__EPOC_OS__) || defined(ANDROID) // eVC + EPOC cannot process throw() qualifier #define NOTHROW // eVC + EPOC has no exception base class class exception { public: exception() {}; exception(const exception&) {}; exception& operator= (const exception&) {return *this;}; virtual ~exception() {}; virtual const char* what() const {return "exception";}; }; #else #define NOTHROW throw() #endif class TSyncException : public exception { typedef exception inherited; public: TSyncException(const char *aMsg1, localstatus aLocalStatus=LOCERR_EXCEPTION) NOTHROW; TSyncException(localstatus aLocalStatus) NOTHROW; TSyncException() NOTHROW { fLocalStatus=LOCERR_EXCEPTION; }; virtual ~TSyncException() NOTHROW; virtual const char * what() const NOTHROW; localstatus status(void) NOTHROW { return fLocalStatus; } protected: void setMsg(const char *p); string fMessage; private: localstatus fLocalStatus; }; // TSyncException class TSmlException : public TSyncException { typedef TSyncException inherited; public: TSmlException(const char *aMsg, Ret_t aSmlError) NOTHROW; Ret_t getSmlError(void) { return fSmlError; }; private: Ret_t fSmlError; }; // TSmlException class TStructException : public TSyncException { typedef TSyncException inherited; public: TStructException(const char *aMsg) NOTHROW: TSyncException (aMsg) {}; }; // TStructException class TMemException : public TSyncException { typedef TSyncException inherited; public: TMemException(const char *aMsg) NOTHROW: TSyncException (aMsg) {}; }; // TMemException } // namespace sysync #endif // SyncException_H // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_b64.cpp0000755000373300037200000001704112424517753027506 0ustar00nightlyallusers00000000000000/* b64 encoding/decoding */ #include "prefix_file.h" #include #include #include "sysync_b64.h" #include "sync_include.h" using namespace b64; static const char table [64] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P', 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f', 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v', 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' }; // free memory allocated with encode or decode above void b64::free(void *mem) { // we use normal malloc below, so use normal free as well ::free(mem); } char *b64::encode (const uInt8 *instr, uInt32 len, uInt32 *outlenP, sInt16 maxLineLen, bool crLineEnd) { // no line breaks -- this is just a straight b64 transform uInt32 i_off = 0; uInt32 o_off = 0; uInt8 inbuf [3]; uInt32 inlen,outlen,inover; uInt32 triples; uInt32 i; sInt16 linechars; char *outstr = NULL; if ( (instr == NULL) || (len == 0) ) { return(NULL); } inlen = len; inover = inlen%3; triples = ((inlen-inover)/3); outlen = 4*triples+1; if (inover) { outlen+=4; } if (maxLineLen) { // make whole number of quads fit on one line maxLineLen &= ~3; // clear bit 0&1 // also add room for CRs or CRLFs outlen += (outlen/maxLineLen+1) << (crLineEnd ? 0 : 1); } outstr = (char *)malloc(outlen*sizeof(char)); memset(outstr,0,outlen); linechars=0; o_off=0; for (i = 0; i < triples; i++) { i_off = i*3; // o_off = i*4; %%% not ok as there might be line ends in between inbuf[0] = instr[i_off]; inbuf[1] = instr[i_off+1]; inbuf[2] = instr[i_off+2]; outstr[o_off++] = table[(inbuf [0] & 0xFC) >> 2]; outstr[o_off++] = table[((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4)]; outstr[o_off++] = table[((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6)]; outstr[o_off++] = table[inbuf [2] & 0x3F]; // check line wrapping linechars+=4; if ( maxLineLen && linechars>=maxLineLen && // line limit enabled (i 1 ) { inbuf[1] = instr[i_off+1]; } inbuf[2] = 0; outstr[o_off] = table[(inbuf [0] & 0xFC) >> 2]; outstr[o_off+1] = table[((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4)]; outstr[o_off+2] = table[((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6)]; outstr[o_off+3] = table[inbuf [2] & 0x3F]; // generate b64 strings that are padded with = to // make multiple's of 4 (this is how it must be) if (inover < 3 ) { outstr[o_off+3] = '='; if (inover < 2 ) { outstr[o_off+2] = '='; } } } // output length is either size of all complete quadruples including line feeds (o_off) or 4 more if // input was not evenly divisible by 3 // (%%% luz added case for inover<>0, which produced 4 NULLs at end of string on inover==0) if (outlenP) *outlenP = o_off+ (inover==0 ? 0 : 4); return(outstr); } uInt8 *b64::decode(const char *instr, uInt32 len, uInt32 *outlenP) { uInt8 inbuf [4]; uInt32 n; sInt16 quadi; bool done; const char *p; char c=0; uInt8 *outstr,*q; // get length if not passed as argument if (!instr) len=0; else if (len==0) len=strlen(instr); p = instr; // this should always be more than enough len: // 3 times number of quads touched plus one for NUL terminator outstr = (uInt8 *)malloc(((3*(len/4+1))+1) * sizeof(uInt8)); if (!outstr) return NULL; q=outstr; // process input string now n=0; quadi=0; // index within quad done=false; // not done yet while (!done) { if (n= 'A') && (c <= 'Z')) c = c - 'A'; else if ((c >= 'a') && (c <= 'z')) c = c - 'a' + 26; else if ((c >= '0') && (c <= '9')) c = c - '0' + 52; else if (c == '+') c = 62; else if (c == '/') c = 63; else if (c == '=') { // reaching a "=" is like end of data done=true; } else continue; // ignore all others } else done=true; // save in char if (!done) inbuf[quadi++] = c; // check if done or full quadruple if (done || quadi==4) { // produce data now if (quadi>=2) { // two input bytes, first byte is there for sure *q++ = (inbuf [0] << 2) | ((inbuf [1] & 0x30) >> 4); if (quadi>=3) { // three input bytes, two output bytes are there *q++ = ((inbuf [1] & 0x0F) << 4) | ((inbuf [2] & 0x3C) >> 2); if (quadi==4) { // all 4 bytes there, produce three bytes *q++ = ((inbuf [2] & 0x03) << 6) | (inbuf [3] & 0x3F); } } } // start new quad quadi=0; } } // while // return length if requested if (outlenP) *outlenP = q-outstr; // make sure output ends with NUL in case it is interpreted as a c string *q=0; // return string return(outstr); /* unsigned int i_off, o_off; uInt8 inbuf [4]; unsigned int inlen,outlen,inover; unsigned int quads; int i,cnt; uInt8 *outstr = NULL; char ch; if (len==0) len=strlen(instr); if ( (instr == NULL) || (len==0) ) { return(NULL); } inlen = len; inover = inlen%4; quads = ((inlen-inover)/4); // this should always be more than enough len outlen = (3*(quads+1))+1; outstr = (uInt8 *)malloc(outlen * sizeof(char)); memset(outstr,0,outlen); for (i = 0; i < quads; i++) { i_off = i*4; o_off = i*3; for (cnt = 0; cnt < 4; cnt++) { ch = instr[i_off+cnt]; if ((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; else if ((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; else if ((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; else if (ch == '+') ch = 62; else if (ch == '=') //no op -- can't ignore this one* ch = 0; else if (ch == '/') ch = 63; inbuf[cnt] = ch; } outstr[o_off] = (inbuf [0] << 2) | ((inbuf [1] & 0x30) >> 4); outstr[o_off+1] = ((inbuf [1] & 0x0F) << 4) | ((inbuf [2] & 0x3C) >> 2); outstr[o_off+2] = ((inbuf [2] & 0x03) << 6) | (inbuf [3] & 0x3F); } // handle b64 strings that are not padded correctly if (inover) { i_off = i*4; o_off = i*3; memset(inbuf,0,4); for (cnt = 0; cnt < inover; cnt++) { ch = instr[i_off+cnt]; if ((ch >= 'A') && (ch <= 'Z')) ch = ch - 'A'; else if ((ch >= 'a') && (ch <= 'z')) ch = ch - 'a' + 26; else if ((ch >= '0') && (ch <= '9')) ch = ch - '0' + 52; else if (ch == '+') ch = 62; else if (ch == '=') //no op -- can't ignore this one* ch = 0; else if (ch == '/') ch = 63; inbuf[cnt] = ch; } outstr[o_off] = (inbuf [0] << 2) | ((inbuf [1] & 0x30) >> 4); outstr[o_off+1] = ((inbuf [1] & 0x0F) << 4) | ((inbuf [2] & 0x3C) >> 2); outstr[o_off+2] = ((inbuf [2] & 0x03) << 6) | (inbuf [3] & 0x3F); } if (outlenP) *outlenP = o_off+3; return(outstr); */ } // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_b64.h0000755000373300037200000000114112424517753027145 0ustar00nightlyallusers00000000000000/* b64 encoding/decoding */ #ifndef SYSYNC_B64_H #define SYSYNC_B64_H #include "generic_types.h" using namespace sysync; namespace b64 { // encode data to B64, returns allocated buffer // does line breaks if maxLineLen!=0 char *encode ( const uInt8 *instr, uInt32 len, uInt32 *outlenP=NULL, sInt16 maxLineLen=0, bool crLineEnd=false ); // decode B64 string to data (len=0 calculates string length automatically) uInt8 *decode(const char *instr, uInt32 len=0, uInt32 *outlenP=NULL); // free memory allocated with encode or decode above void free(void *mem); } #endif /* SYSYNC_B64_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_md5.cpp0000755000373300037200000003030612424517753027577 0ustar00nightlyallusers00000000000000/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /* 2001-05-29: adapted to MW-C and ANSI-C by luz */ /* 2001-08-07: added MD5_MSB_FIRST variant for Motorola order digest output*/ #include "prefix_file.h" #include "sysync_md5.h" /* Constants for MD5Transform routine. */ using namespace md5; #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 /* local prototypes */ static void MD5Transform (SYSYNC_UINT4 [4], const uInt8 [64]); static void Encode (uInt8 *, const SYSYNC_UINT4 *, uInt32); #ifdef MD5_MSB_FIRST static void EncodeMSBfirst (uInt8 *, const SYSYNC_UINT4 *, uInt32); #endif static void Decode (SYSYNC_UINT4 *, const uInt8 *, uInt32); static void MD5_memcpy (SYSYNC_POINTER, SYSYNC_POINTER, uInt32); static void MD5_memset (SYSYNC_POINTER, sInt32, uInt32); /* moved to SYSYNC_MD5_CTX as statics are not allowed in some environments static uInt8 PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; */ /* F, G, H and I are basic MD5 functions. */ #define F(x, y, z) (((x) & (y)) | ((~x) & (z))) #define G(x, y, z) (((x) & (z)) | ((y) & (~z))) #define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z))) /* ROTATE_LEFT rotates x left n bits. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. Rotation is separate from addition to prevent recomputation. */ #define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (SYSYNC_UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (SYSYNC_UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (SYSYNC_UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } #define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (SYSYNC_UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void md5::Init (SYSYNC_MD5_CTX *context) { context->count[0] = context->count[1] = 0; /* Load magic initialization constants. */ context->state[0] = 0x67452301; context->state[1] = 0xefcdab89; context->state[2] = 0x98badcfe; context->state[3] = 0x10325476; /* initialize the padding space, don't know if this is necessary */ MD5_memset ((SYSYNC_POINTER)context->PADDING, 0, 64); context->PADDING[0]=0x80; } /* MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context. */ void md5::Update ( SYSYNC_MD5_CTX *context, /* context */ const uInt8 *input, /* input block */ uInt32 inputLen /* length of input block */ ) { uInt32 i, index, partLen; /* Compute number of bytes mod 64 */ index = (uInt32)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((SYSYNC_UINT4)inputLen << 3)) < ((SYSYNC_UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((SYSYNC_UINT4)inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { MD5_memcpy ((SYSYNC_POINTER)&context->buffer[index], (SYSYNC_POINTER)input, partLen); MD5Transform (context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) MD5Transform (context->state, &input[i]); index = 0; } else i = 0; /* Buffer remaining input */ MD5_memcpy ((SYSYNC_POINTER)&context->buffer[index], (SYSYNC_POINTER)&input[i], inputLen-i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ void md5::Final ( uInt8 digest[16], /* message digest */ SYSYNC_MD5_CTX *context /* context */ ) { uInt8 bits[8]; uInt32 index, padLen; /* Save number of bits */ Encode (bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (uInt32)((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); md5::Update (context, context->PADDING, padLen); /* Append length (before padding) */ md5::Update (context, bits, 8); /* Store state in digest */ Encode (digest, context->state, 16); /* Zeroize sensitive information. */ MD5_memset ((SYSYNC_POINTER)context, 0, sizeof (*context)); } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform ( SYSYNC_UINT4 state[4], const uInt8 block[64] ) { SYSYNC_UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16]; Decode (x, block, 64); /* Round 1 */ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; /* Zeroize sensitive information. */ MD5_memset ((SYSYNC_POINTER)x, 0, sizeof (x)); } /* Encodes input (SYSYNC_UINT4) into output (uInt8). Assumes len is a multiple of 4. */ static void Encode ( uInt8 *output, const SYSYNC_UINT4 *input, uInt32 len ) { uInt32 i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (uInt8)(input[i] & 0xff); output[j+1] = (uInt8)((input[i] >> 8) & 0xff); output[j+2] = (uInt8)((input[i] >> 16) & 0xff); output[j+3] = (uInt8)((input[i] >> 24) & 0xff); } } /* Decodes input (uInt8) into output (SYSYNC_UINT4). Assumes len is a multiple of 4. */ static void Decode ( SYSYNC_UINT4 *output, const uInt8 *input, uInt32 len ) { uInt32 i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = ((SYSYNC_UINT4)input[j]) | (((SYSYNC_UINT4)input[j+1]) << 8) | (((SYSYNC_UINT4)input[j+2]) << 16) | (((SYSYNC_UINT4)input[j+3]) << 24); } /* Note: Replace "for loop" with standard memcpy if possible. */ static void MD5_memcpy ( SYSYNC_POINTER output, SYSYNC_POINTER input, uInt32 len ) { uInt32 i; for (i = 0; i < len; i++) output[i] = input[i]; } /* Note: Replace "for loop" with standard memset if possible. */ static void MD5_memset ( SYSYNC_POINTER output, sInt32 value, uInt32 len ) { uInt32 i; for (i = 0; i < len; i++) ((char *)output)[i] = (char)value; } #ifdef MD5_TEST_FUNCS /* MD5 Test stuff */ /* Digests a string and prints the result. */ void md5::String (const char *aString, char *s) { SYSYNC_MD5_CTX context; uInt8 digest[16]; uInt32 len = strlen (aString); Init (&context); Update (&context, (uInt8 *) aString, len); Final (digest, &context); sprintf (s,"MD5 (\"%s\") = ", aString); s+=strlen(s); Print (digest,s); } /* Prints a message digest in hexadecimal. */ void md5::Print (uInt8 *digest, char * &s) { uInt32 i; for (i = 0; i < 16; i++) { sprintf (s,"%02hx", (uInt16)digest[i]); s+=strlen(s); } } void md5::dotest(void) { printf("================= MD5 Test Suite ==========================="); char buf[1024]; md5::String ("",buf); printf("%s (should be: d41d8cd98f00b204e9800998ecf8427e)",buf); md5::String ("a",buf); printf("%s (should be: 0cc175b9c0f1b6a831c399e269772661)",buf); md5::String ("abc",buf); printf("%s (should be: 900150983cd24fb0d6963f7d28e17f72)",buf); md5::String ("message digest",buf); printf("%s (should be: f96b697d7cb7938d525a2f31aaf161d0)",buf); md5::String ("abcdefghijklmnopqrstuvwxyz",buf); printf("%s (should be: c3fcd3d76192e4007dfb496cca67e13b)",buf); md5::String ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",buf); printf("%s (should be: d174ab98d277d9f5a5611c2c9f419d9f)",buf); md5::String ("12345678901234567890123456789012345678901234567890123456789012345678901234567890",buf); printf("%s (should be: 57edf4a22be3c955ac49da2e2107b67a)",buf); md5::String ("luz:gaga",buf); printf("%s (should be: )",buf); printf("================= end MD5 Test Suite ==========================="); } #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_md5.h0000755000373300037200000000446612424517753027254 0ustar00nightlyallusers00000000000000/* MD5.H - header file for MD5C.C */ /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function. License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /* 2001-05-29: adapted to MW-C and ANSI-C by luz */ /* originally GLOBAL.H - RSAREF types and constants * now moved here to keep everything in namespace */ // define this to add test functions String() and Print() // #define MD5_TEST_FUNCS 1 #ifndef SYSYNC_MD5_H #define SYSYNC_MD5_H #include "generic_types.h" using namespace sysync; namespace md5 { /* POINTER defines a generic pointer type */ typedef uInt8 *SYSYNC_POINTER; /* UINT2 defines a two byte word */ typedef uInt16 SYSYNC_UINT2; /* UINT4 defines a four byte word */ /* Note: "typedef uInt32 SYSYNC_UINT4;" is unreliable as uInt32 was 64bit in some weird builds */ #if !defined(__WORDSIZE) || (__WORDSIZE < 32) typedef unsigned long SYSYNC_UINT4; #else typedef unsigned int SYSYNC_UINT4; #endif /* MD5 context. */ typedef struct { SYSYNC_UINT4 state[4]; /* state (ABCD) */ SYSYNC_UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ uInt8 buffer[64]; /* input buffer */ uInt8 PADDING[64]; /* padding space */ } SYSYNC_MD5_CTX; /* MD5 functions */ void Init (SYSYNC_MD5_CTX *); void Update (SYSYNC_MD5_CTX *, const uInt8 *, uInt32); void Final (uInt8 [16], SYSYNC_MD5_CTX *); #ifdef MD5_TEST_FUNCS /* for test */ void String (const char *aString, char *s); void Print (uInt8 *digest, char * &s); void dotest(void); #endif } // end namespace md5 #endif // SYSYNC_MD5_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_noncopyable.h0000644000373300037200000000136512424517753031070 0ustar00nightlyallusers00000000000000/* * File: sysync_noncopyable.h * * Author: Patrick Ohly (patrick.ohly@intel.com) * * Derive from sysync::noncopyable in all classes which must not be copied, * for example because they contain pointers. * Accidentally copying with the default copy constructor will then * lead to compile instead of runtime errors. * * Same approach as in boost::noncopyable. * * Copyright (c) 2013 by Synthesis AG + plan44.ch */ #ifndef SYSYNC_NONCOPYABLE_H #define SYSYNC_NONCOPYABLE_H namespace sysync { class noncopyable { protected: noncopyable() {} ~noncopyable() {} private: noncopyable( const noncopyable& ); const noncopyable& operator=( const noncopyable& ); }; } // namespace sysync #endif // SYSYNC_NONCOPYABLE syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_utils.cpp0000755000373300037200000027206612424517753030265 0ustar00nightlyallusers00000000000000/* * File: sysync_utils.cpp * * Author: Lukas Zeller (luz@plan44.ch) * * Provides some helper functions interfacing between SyncML Toolkit * and C++ * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-16 : luz : created * */ #include "prefix_file.h" #include "sync_include.h" #include "sysync_utils.h" #include "libmem.h" #ifdef SYSYNC_TOOL #include "syncappbase.h" // for CONSOLEPRINTF #include "customimplagent.h" // for DBCharSetNames #endif namespace sysync { // Support for SySync Diagnostic Tool #ifdef SYSYNC_TOOL // parse RFC 2822 addr spec int parse2822AddrSpec(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" addrparse ")); CONSOLEPRINTF((" Parse name and email address out of a RFC2822-type addr-spec")); return EXIT_SUCCESS; } // check for argument if (argc<1) { CONSOLEPRINTF(("1 argument required")); return EXIT_FAILURE; } // parse string addrname,addremail; const char* p=argv[0]; p=parseRFC2822AddrSpec(p,addrname,addremail); // show CONSOLEPRINTF(("Input : %s",argv[0])); CONSOLEPRINTF(("Name : %s",addrname.c_str())); CONSOLEPRINTF(("email : %s",addremail.c_str())); CONSOLEPRINTF(("unparsed rest : %s",p)); return EXIT_SUCCESS; } // parse2822AddrSpec // convert between character sets int charConv(int argc, const char *argv[]) { if (argc<0) { // help requested CONSOLEPRINTF((" charconv [] ")); CONSOLEPRINTF((" Convert from one charset to another. Default input is UTF-8")); return EXIT_SUCCESS; } #ifdef __TEST_EQUALITY_OF_CP936_WITH_GB2312__ // quick test uInt32 ch_in; for (ch_in=0x8100; ch_in<=0xFFFF; ch_in++) { // convert into internal UTF-8 string s_internal,s_in; s_in.erase(); if (ch_in>=0x8100) s_in+=(ch_in >> 8) & 0xFF; s_in+=(ch_in & 0xFF); s_internal.erase(); appendStringAsUTF8( s_in.c_str(), s_internal, chs_gb2312 ); // convert into output format string s_out; s_out.erase(); appendUTF8ToString( s_internal.c_str(), s_out, chs_cp936 ); // show differences if (s_in!=s_out && s_out.size()>0 && s_out[0]!=INCONVERTIBLE_PLACEHOLDER) { string s1,s2; s1.erase(); StrToCStrAppend(s_in.c_str(), s1); s2.erase(); StrToCStrAppend(s_out.c_str(), s2); CONSOLEPRINTF(("\"%s\" != \"%s\"",s1.c_str(),s2.c_str())); } } return EXIT_SUCCESS; #endif // check for argument if (argc<2) { CONSOLEPRINTF(("2 or 3 arguments required")); return EXIT_FAILURE; } int ochsarg=1; sInt16 enu; // get input charset TCharSets charset_in=chs_utf8; if (argc==3) { // first arg is input charset if (!StrToEnum(DBCharSetNames, numCharSets, enu, argv[0])) { CONSOLEPRINTF(("'%s' is not a valid input charset name",argv[0])); return EXIT_FAILURE; } charset_in = (TCharSets)enu; } else { ochsarg=0; // first arg ist input charset } // get output charset TCharSets charset_out; if (!StrToEnum(DBCharSetNames, numCharSets, enu, argv[ochsarg])) { CONSOLEPRINTF(("'%s' is not a valid output charset name",argv[ochsarg])); return EXIT_FAILURE; } charset_out = (TCharSets)enu; // get string to convert string s_in; s_in.erase(); CStrToStrAppend(argv[ochsarg+1], s_in); // convert into internal UTF-8 string s_internal; s_internal.erase(); appendStringAsUTF8( s_in.c_str(), s_internal, charset_in ); // convert into output format string s_out; s_out.erase(); appendUTF8ToString( s_internal.c_str(), s_out, charset_out ); // show all three string show; // - input show.erase(); StrToCStrAppend(s_in.c_str(), show); CONSOLEPRINTF(("Input : %-20s = \"%s\"",DBCharSetNames[charset_in], show.c_str())); // - internal UTF8 show.erase(); StrToCStrAppend(s_internal.c_str(), show); CONSOLEPRINTF(("Internal : %-20s = \"%s\"",DBCharSetNames[chs_utf8], show.c_str())); // - output show.erase(); StrToCStrAppend(s_out.c_str(), show); CONSOLEPRINTF(("Output : %-20s = \"%s\"",DBCharSetNames[charset_out], show.c_str())); return EXIT_SUCCESS; } // charConv #endif // SYSYNC_TOOL // conversion table from ANSI 0x80..0x9F to UCS4 static const uInt32 Ansi_80_to_9F_to_UCS4[0x20] = { 0x20AC, 0 ,0x201A,0x0192, 0x201E,0x2026,0x2020,0x2021, // 0x80..0x87 0x02C6,0x2030,0x0160,0x2039, 0x0152, 0 ,0x017D, 0 , // 0x88..0x8F 0 ,0x2018,0x2019,0x201C, 0x201D,0x2022,0x2013,0x2014, // 0x90..0x97 0x02DC,0x2122,0x0161,0x203A, 0x0153, 0 ,0x017E,0x0178 // 0x98..0x9F }; // ASCIIfy table to convert umlauts etc. to nearest plain ASCII typedef struct { uInt32 ucs4; uInt8 ascii; } TASCIIfyEntry; static const TASCIIfyEntry ASCIIfyTable[] = { { 0x000000C4, 'A' }, // Adieresis { 0x000000C5, 'A' }, // Aring { 0x000000C7, 'C' }, // Ccedilla { 0x000000C9, 'E' }, // Eacute { 0x000000D1, 'N' }, // Ntilde { 0x000000D6, 'O' }, // Odieresis { 0x000000DC, 'U' }, // Udieresis { 0x000000E1, 'a' }, // aacute { 0x000000E0, 'a' }, // agrave { 0x000000E2, 'a' }, // acircumflex { 0x000000E4, 'a' }, // adieresis { 0x000000E3, 'a' }, // atilde { 0x000000E5, 'a' }, // aring { 0x000000E7, 'c' }, // ccedilla { 0x000000E9, 'e' }, // eacute { 0x000000E8, 'e' }, // egrave { 0x000000EA, 'e' }, // ecircumflex { 0x000000EB, 'e' }, // edieresis { 0x000000ED, 'i' }, // iacute { 0x000000EC, 'i' }, // igrave { 0x000000EE, 'i' }, // icircumflex { 0x000000EF, 'i' }, // idieresis { 0x000000F1, 'n' }, // ntilde { 0x000000F3, 'o' }, // oacute { 0x000000F2, 'o' }, // ograve { 0x000000F4, 'o' }, // ocircumflex { 0x000000F6, 'o' }, // odieresis { 0x000000F5, 'o' }, // otilde { 0x000000FA, 'u' }, // uacute { 0x000000F9, 'u' }, // ugrave { 0x000000FB, 'u' }, // ucircumflex { 0x000000FC, 'u' }, // udieresis { 0x000000DF, 's' }, // germandoubles { 0x000000D8, 'O' }, // Oslash { 0x000000F8, 'o' }, // oslash { 0x000000C0, 'A' }, // Agrave { 0x000000C3, 'A' }, // Atilde { 0x000000D5, 'O' }, // Otilde { 0x00000152, 'O' }, // OE { 0x00000153, 'o' }, // oe { 0x000000C6, 'A' }, // AE { 0x000000E6, 'a' }, // ae { 0x000000C2, 'A' }, // Acircumflex { 0x000000CA, 'E' }, // Ecircumflex { 0x000000C1, 'A' }, // Aacute { 0x000000CB, 'E' }, // Edieresis { 0x000000C8, 'E' }, // Egrave { 0x000000CD, 'I' }, // Iacute { 0x000000CC, 'I' }, // Igrave { 0x000000CE, 'i' }, // Icircumflex { 0x000000CF, 'i' }, // Odieresis { 0x000000D3, 'O' }, // Oacute { 0x000000D2, 'O' }, // Ograve { 0x000000D4, 'O' }, // Ocircumflex // terminator { 0,0 } }; // line end mode names const char * const lineEndModeNames[numLineEndModes] = { "none", // none specified "unix", // 0x0A "mac", // 0x0D "dos", // 0x0D 0x0A "cstr", // as in C strings, '\n' which is 0x0A normally (but might be 0x0D on some platforms) "filemaker" // 0x0B (filemaker tab-separated text format, CR is shown as 0x0B within fields }; // literal quoting mode names const char * const quotingModeNames[numQuotingModes] = { "none", // none specified "singlequote", // single quote must be duplicated "doublequote", // double quote must be duplicated "backslash" // C-string-style escapes of CR,LF,TAB,BS,\," and ' (but no full c-string escape with \xXX etc.) }; // Encoding format names for SyncML const char * const encodingFmtSyncMLNames[numFmtTypes] = { "chr", // plain chars "bin", // binary "b64" // base 64 encoding }; // Encoding format names for user const char * const encodingFmtNames[numFmtTypes] = { "plain-text", // no encoding (plain text) "binary", // plain binary (in WBXML only) "base64" // base 64 encoding }; // field (property) data type names const char * const propDataTypeNames[numPropDataTypes] = { "chr", // Character "int", // Integer "bool", // Boolean "bin", // Binary "datetime", // Date and time of day "phonenum", // Phone number "text", // plain text "???" // unknown }; // Auth type names const char * const authTypeSyncMLNames[numAuthTypes] = { NULL, // no authorisation "syncml:auth-basic", // basic (B64 encoded user pw string) "syncml:auth-md5" // Md5 encoded user:pw:nonce }; // MIME encoding types const char * const MIMEEncodingNames[numMIMEencodings] = { "", "7BIT", "8BIT", "BINARY", "QUOTED-PRINTABLE", "BASE64", "B" }; // Charset names for MIME based strings const char * const MIMECharSetNames[numCharSets] = { "unknown", "US-ASCII", "ANSI", "ISO-8859-1", "UTF-8", "UTF-16", #ifdef CHINESE_SUPPORT "GB2312", "CP936", #endif }; #ifdef SYSYNC_ENGINE // generate RFC2822-style address specificiation // - Common Name will be quoted // - recipient will be put in angle brackets void makeRFC2822AddrSpec( cAppCharP aCommonName, cAppCharP aRecipient, string &aRFCAddr ) { if (aCommonName && *aCommonName) { aRFCAddr='"'; while (*aCommonName) { if (*aCommonName=='"') aRFCAddr += "\\\""; else aRFCAddr += *aCommonName; aCommonName++; } aRFCAddr+="\" <"; aRFCAddr+=aRecipient; aRFCAddr+=">"; } else { // plain email address aRFCAddr=aRecipient; } } // makeRFC2822AddrSpec // sysytool -f syncserv_odbc.xml addrparse "(Lukas Peter) luz@synthesis.ch (Zeller), gaga" // Parse RFC2822-style address specificiation // - aName will receive name and all (possible) comments // - aRecipient will receive the (first, in case of a group) email address cAppCharP parseRFC2822AddrSpec( cAppCharP aText, string &aName, string &aRecipient ) { const char *p; char c; enum { pstate_sepspace, pstate_trailing, pstate_text, pstate_comment, pstate_quoted, pstate_email } pstate = pstate_trailing; string text,groupname; bool textcouldbeemail=true; bool atfound=false; aName.erase(); aRecipient.erase(); p=aText; do { c=*p; // check end of input if (c==0) break; // done with the string // advance to next char p++; // check according to state switch (pstate) { case pstate_sepspace: if (c==' ') { aName+=c; } pstate=pstate_trailing; // otherwise treat like trailing case pstate_trailing: textcouldbeemail=aRecipient.empty(); atfound=false; // skip trailing WSP first if (c==' ' || c=='\t' || c=='\n' || c=='\r') break; // simply ignore WSP in trailing mode else pstate=pstate_text; // fall trough to do text analysis case pstate_text: // now check specials if (c==',') { c=0; break; } // end of address, cause exit from loop, next will start after comma else if (c==';') { c=0; break; } // end of group address list, treat it like single address else if (c=='@' && textcouldbeemail) atfound=true; // flag presence of @ // check if text could still be a email address by itself if (textcouldbeemail && !isalnum(c) && c!='@' && c!='_' && c!='-' && c!='.') { textcouldbeemail=false; if (atfound) { aRecipient=text; text.erase(); } atfound=false; } // now check other specials if (c=='"') { pstate=pstate_quoted; } // start of quoted string else if (c=='(') { pstate=pstate_comment; } // start of comment else if (c=='<') { aRecipient.erase(); pstate=pstate_email; } // start of angle-addr, overrides other recipient texts else if (c==':') { groupname=aRecipient; // what we've probably parsed as recipient groupname+=aName; // plus name so far groupname+=text; // plus additional text text.erase(); aName.erase(); aRecipient.erase(); pstate=pstate_trailing; } // flag presence of a group name (which can be used as name if addr itself does not have one) else { // add other text chars to the text text += c; } break; case pstate_quoted: if (c=='\\') { if (*p) c=*p++; else break; // get next char (if any) and add to result untested } else if (c=='"') { // end of quoted string pstate=pstate_sepspace; aName+=text; text.erase(); break; } // add to text text += c; break; case pstate_comment: if (c==')') { // end of comment aName+=text; text.erase(); pstate=pstate_sepspace; break; } // add to text text += c; break; case pstate_email: if (!isalnum(c) && c!='@' && c!='_' && c!='-' && c!='.') { // any non-email char terminates email, not only '>', but only '>' is swallowed if (c!='>') p--; // re-evaluate char in next state pstate=pstate_sepspace; break; } // add to email aRecipient += c; break; } // switch } while (c!=0); // handle case of pure email address without name and without < > brackets or : if (aRecipient.empty() && textcouldbeemail && atfound) aRecipient = text; else aName += text; // if name is (now) empty, but we have a group name, use the group name if (aName.empty()) aName=groupname; // remove trailing spaces in aName string::size_type n=aName.find_last_not_of(' '); if (n!=string::npos) aName.resize(n+1); // return where to continue parsing for next addr-spec (if not end of string) return p; } // parseRFC2822AddrSpec // append internal UTF8 string as RFC2047 style encoding const char *appendUTF8AsRFC2047( const char *aText, string &aString ) { const char *p,*q,*r; char c; p=aText; do { q=p; // remember start // find chars until next char that must be stored as encoded word do { c=*p; if (c==0 || (c & 0x80) || (c=='=' && *(p+1)=='?')) break; p++; } while(true); // copy chars outside encoded word directly if (p-q>0) aString.append(q,p-q); // check if end of string if (c==0) break; // pack some chars into encoded word // - start word aString.append("=?utf-8?B?"); // 10 chars start (+ 2 chars will be added at end) // - encoded data must be 75-12=63 chars or less // Using B (=b64) encoding, output of 63 chars = 63/4*3 = max 47 chars. // We use 45 max, as this is evenly divisible by 3 and output is 60 chars q=p; while (true) { // find next space while (*q && !isspace(*q) && q-p<45) q++; if (q-p>=45) break; // abort if exhausted already // find next non-space r=q; while (isspace(*r)) r++; // check if next non-space will start a new word if (*r & 0x80) { // we should include the next word as well, if possible without exceeding size if (r-p<45) { q=r; continue; } } break; } // encode binary stream and append to string appendEncoded((const uInt8 *)p,q-p,aString,enc_b); p=q; // - end word aString.append("?="); } while (true); return p; } // appendUTF8AsRFC2047 // parse character string from RFC2047 style encoding to UTF8 internal string const char *appendRFC2047AsUTF8( const char *aRFC2047, stringSize aSize, string &aString, TLineEndModes aLEM ) { const char *p,*q,*r,*w; char c = 0; const char *eot = aRFC2047+aSize; p=aRFC2047; w=NULL; // start of last detected word (to avoid re-scanning) while (p=eot || c==0) break; // try to parse encoded word q=p+2; scanword: // q is now where we start to parse word contents // p is where we would re-start reading normally if current word turns out not to be a word at all // - remember start of word scan (to avoid re-scanning it) w=p; // - get charset r=q; while (q=eot || *q!='?') continue; // is not an encoded word, parse normally sInt16 en; TCharSets charset=chs_unknown; if (StrToEnum(MIMECharSetNames, numCharSets, en, r, q-r)) charset=(TCharSets)en; // - get encoding r=++q; // continue after ? separator while (q=eot || *q!='?') continue; // is not an encoded word, parse normally TEncodingTypes encoding=enc_8bit; if (StrToEnum(MIMEEncodingNames, numMIMEencodings, en, r, q-r)) encoding=(TEncodingTypes)en; // - get data part r=++q; while (q+1=eot || *q!='?') continue; // is not an encoded word, parse normally // - decode string decoded; appendDecoded(r,q-r,decoded,encoding); // - convert to UTF-8 appendStringAsUTF8( decoded.c_str(), aString, charset, aLEM ); // - skip word terminator p=q+2; // - check for special case of adjacent words q=p; while (qp && *q=='=' && *(q+1)=='?') { // adjacent encoded words, only separated by space -> ignore space // p is after previous word q+=2; // q is after lead-in of next word goto scanword; } // p is where we continue reading } return p; } // appendRFC2047AsUTF8 // decode encoded data and append to string const char *appendDecoded( const char *aText, size_t aSize, string &aBinString, TEncodingTypes aEncoding ) { char c; const char *p=aText; uInt32 binsz; uInt8 *binP; switch (aEncoding) { case enc_quoted_printable : // decode quoted-printable content while ((c=*p++)) { // char found if (c=='=') { uInt16 code; char hex[2]; // check for soft break first if (*p=='\x0D' || *p=='\x0A') { // soft break, swallow if (*p=='\x0D') p++; if (*p=='\x0A') p++; continue; } // decode hex[0]=*p; if (*p) { p++; hex[1]=*p; if (*p) { p++; if (HexStrToUShort(hex,code,2)==2) { c=code; // decoded char } else continue; // simply ignore } else break; } else break; } // append char aBinString+=c; } aText=p; break; case enc_base64: case enc_b: // decode base 64 binsz=0; binP = b64::decode(aText, aSize, &binsz); aBinString.append((const char *)binP,binsz); b64::free(binP); aText+=aSize; break; case enc_7bit: case enc_8bit: // copy no more than size if (aSize>0) aBinString.reserve(aBinString.size()+aSize); while (*p && aSize>0) { aBinString+=*p++; aSize--; } aText=p; break; case enc_none: case enc_binary: // copy bytes aBinString.append(aText,aSize); aText+=aSize; break; case numMIMEencodings: // invalid break; } // quoted printable return aText; } // appendDecoded // encode binary stream and append to string void appendEncoded( const uInt8 *aBinary, size_t aSize, string &aString, TEncodingTypes aEncoding, sInt16 aMaxLineSize, sInt32 aCurrLineSize, bool aSoftBreaksAsCR, bool aEncodeBinary ) { char c; string::size_type linestart; const uInt8 *p; bool softbreak; uInt32 b64len; char *b64; bool processed; switch (aEncoding) { case enc_binary : case enc_none : case enc_8bit : case enc_7bit : // assume we have no 8bit chars // just copy 1:1 aString.append((const char *)aBinary,aSize); break; case enc_quoted_printable: // quote-printable encoding // - determine start of last line in aString // Note: this is because property text will be folded when lines aMaxLineSize linestart=aString.size()-aCurrLineSize; for (p=aBinary;p=string::size_type(aMaxLineSize)-8); if (!aEncodeBinary) { if (c=='\r') continue; // ignore them if (c=='\b') continue; // ignore them (optional break indicators, not relevant for QP output) if (c=='\n') { // - encode line ends aString.append("=0D=0A"); // special string for Line Ends (CR LF) processed = true; // c is processed now softbreak = true; } // if } // if // - handle soft line break (but only if really doing line breaking) // Also: avoid adding a soft break at the very end of the string if (softbreak && aMaxLineSize && p+10x7F || (uInt8)c<0x20; // '\0' will be encoded as well if (encodeIt) { // encode all non ASCII chars > 0x7F (and control chars as well) aString+="="; aString+=NibbleToHexDigit(c>>4); aString+=NibbleToHexDigit(c); } else aString+=c; // just copy } // if } break; case enc_base64: case enc_b: // use base64 encoding if (aSize>0) { // don't call b64 with size=0! b64 = b64::encode( aBinary,aSize, // what to encode &b64len, // output size aMaxLineSize, // max line size aSoftBreaksAsCR ); // append to output, if any if (b64) { aString.append(b64,b64len); // release buffer b64::free(b64); } if (aEncoding!=enc_b) { // make sure it ends with a newline for "base64" (but NOT for "b" as used in RFC2047) // Note: when used in vCard2.1, that newline is part of the property and show as an // empty line in the vCard. aString += aSoftBreaksAsCR ? "\r" : "\x0D\x0A"; } } break; default: // do nothing break; } // switch } // appendEncoded #ifdef CHINESE_SUPPORT // the flatBinTree tables for converting to and from GB2312 #include "gb2312_tables_inc.cpp" // the flatBinTree tables for converting to and from CP936 #include "cp936_tables_inc.cpp" #endif // add char (possibly multi-byte) as UTF8 to value and apply charset translation if needed // - returns > 0 if aNumChars was not correct number of bytes needed to convert an entire character; // return value is number of bytes needed to generate one output character. If return value // is<>0, no char has been appended to aVal. uInt16 appendCharsAsUTF8(const char *aChars, string &aVal, TCharSets aCharSet, uInt16 aNumChars) { uInt32 ucs4; // first char uInt8 c=*aChars; // this is a 8-bit char switch(aCharSet) { case chs_utf8 : // UTF8 is native charset of the application, simply add aVal+=c; break; case chs_ansi : case chs_iso_8859_1 : // do poor man's conversion to UCS4 // - most ANSI chars are 1:1 mapped ucs4 = ((uInt8)c & 0xFF); // - except 0x80..0x9F, use table for these if (ucs4>=0x80 && ucs4<=0x9F) ucs4=Ansi_80_to_9F_to_UCS4[ucs4-0x80]; // - convert to UTF8 UCS4toUTF8(ucs4,aVal); break; #ifdef CHINESE_SUPPORT case chs_gb2312 : // simplified Chinese GB-2312 charset // all below 0x80 are passed as-is if (c<0x80) aVal+=c; // simply append else { // 16-bit GB2312 char if (aNumChars!=2) return 2; // we need 2 chars for a successful GB-2312 // we have 2 bytes, convert them ucs4 = searchFlatBintree(gb2312_to_ucs2, (c<<8) + (uInt8)aChars[1], INCONVERTIBLE_PLACEHOLDER); // - convert to UTF8 UCS4toUTF8(ucs4,aVal); } break; case chs_cp936: // simplified chinese Windows codepage CP936 if (c<0x80) aVal+=c; // simply append else { // 0x0080 (euro sign) or 2-byte CP936 if (c==0x80) ucs4=searchFlatBintree(cp936_to_ucs2, 0x0080, INCONVERTIBLE_PLACEHOLDER); else { // 16-bit GB2312 char if (aNumChars!=2) return 2; // we need 2 chars for a successful CP936 // we have 2 bytes, convert them ucs4 = searchFlatBintree(cp936_to_ucs2, (c<<8) + (uInt8)aChars[1], INCONVERTIBLE_PLACEHOLDER); } // - convert to UTF8 UCS4toUTF8(ucs4,aVal); } break; #endif case chs_ascii : // plain 7-bit ASCII default : // unknown // only 7-bit allowed if (c & 0x80) aVal+=INCONVERTIBLE_PLACEHOLDER; else aVal+=c; break; } // switch return 0; // ok, converted aNumChars } // appendCharsAsUTF8 // add string as UTF8 to value and apply charset translation if needed // - if lineEndMode is not lem_none, all sorts of line ends will be converted // to the specified mode. void appendStringAsUTF8(const char *s, string &aVal, TCharSets aCharSet, TLineEndModes aLEM, bool aAllowFilemakerCR) { char c; const char *start=s; if (s) { while ((c=*s++)!=0) { if (aLEM!=lem_none) { // line end handling enabled if (c==0x0D) { // could be mac (0x0D) or DOS (0x0D/0x0A) if (*s==0x0A) { // this is DOS-type line end // - consume the 0x0A as well s++; // - check for 0x0D 0x0D 0x0A special case (caused by // DOS-text-file conversion of non-DOS strings) if (s>=start+3) { if (*(s-3)==0x0D) { // char before the DOS-CRLF was a 0x0D as well (and // has already produced a newline in the output // --> completely ignore this CRLF continue; } } } // is a line end, convert it to platform-lineend c='\n'; // platform } else if (c==0x0A) { // 0x0A without preceeding 0x0D = unix c='\n'; // platform } else if (c==0x0B && aAllowFilemakerCR) { // 0x0B is used as lineend in filemaker export and achilformat c='\n'; } // line end converted to platform if (c=='\n' && aLEM!=lem_cstr) { // produce specified line end switch (aLEM) { case lem_mac : c=0x0D; break; case lem_unix : c=0x0A; break; case lem_filemaker : c=0x0B; break; case lem_dos : c=0x0A; // LF will be added later aVal+=0x0D; // add CR break; default: break; } } } // line end handling enabled // normal add uInt16 i,seqlen=1; // assume logical char consists of single byte do { seqlen=appendCharsAsUTF8(s-seqlen,aVal,aCharSet,seqlen); // add char (possibly with UTF8 expansion) to aVal if (seqlen<=1) break; // done for (i=1;i=start+3) { if (*(aUTF8-3)==0x0D) { // char before the DOS-CRLF was a 0x0D as well (and // has already produced a newline in the output // --> completely ignore this CRLF continue; } } } // is a line end, convert it to platform-lineend c='\n'; // platform } else { // must be 0x0A // 0x0A without preceeding 0x0D = unix c='\n'; // platform } // line end converted to platform if (aLEM!=lem_cstr) { // produce specified line end switch (aLEM) { case lem_mac : c=0x0D; break; case lem_filemaker : c=0x0B; break; case lem_unix : c=0x0A; break; case lem_dos : c=0x0A; // LF will be added later n++; // count it extra if (aMaxBytes && n>=aMaxBytes) goto stringfull; // no room to complete it, ignore it appendCharToString(0x0D,aVal,aQuotingMode); break; default: break; } } appendCharToString(c,aVal,aQuotingMode); n++; // count it } // line end, handling enabled else { // non lineend (or lineend not handled specially) if (aCharSet==chs_utf8) { aUTF8++; // - simply add char appendCharToString(c,aVal,aQuotingMode); n++; } else { // - make UCS4 p=aUTF8; // save previous position to detect if we have processed all aUTF8=UTF8toUCS4(aUTF8,ucs4); // now we have UCS4 if (ucs4==0) { // UTF8 resulting in UCS4 null char is not allowed ucs4=INCONVERTIBLE_PLACEHOLDER; } else { // convert to specified charset switch (aCharSet) { case chs_ansi: case chs_iso_8859_1: if ((ucs4<=0xFF && ucs4>=0xA0) || ucs4<0x80) // 00..7F and A0..FF directly map to ANSI appendCharToString(ucs4,aVal,aQuotingMode); else { // search for matching ANSI in table uInt8 k; for (k=0; k<0x20; k++) { if (ucs4==Ansi_80_to_9F_to_UCS4[k]) { // found in table break; } } if (k<0x20) // conversion found aVal+=k+0x80; else // no conversion found in table aVal+=INCONVERTIBLE_PLACEHOLDER; } // not in 1:1 range 0..7F, A0..FF n++; break; #ifdef CHINESE_SUPPORT case chs_gb2312 : // simplified Chinese GB-2312 charset // all below 0x80 are passed as-is if (ucs4<0x80) { appendCharToString(ucs4,aVal,aQuotingMode); // simply append ASCII codes n++; } else { // convert to 16-bit GB2312 char uInt16 gb = searchFlatBintree(ucs2_to_gb2312, ucs4, INCONVERTIBLE_PLACEHOLDER); // check if we have space if (aMaxBytes!=0 && n+2>aMaxBytes) goto stringfull; // append as two bytes to output string aVal+=gb >> 8; aVal+=gb & 0xFF; n+=2; } break; case chs_cp936 : // simplified Chinese CP936 windows codepage // all below 0x80 are passed as-is if (ucs4<0x80) { appendCharToString(ucs4,aVal,aQuotingMode); // simply append ASCII codes n++; } else { // convert to CP936 16-bit representation uInt16 twobytes = searchFlatBintree(ucs2_to_cp936, ucs4, INCONVERTIBLE_PLACEHOLDER); // append as two bytes to output string, but only this is a CP936 two-byte at all if (twobytes>0x0080) { // check if we have space if (aMaxBytes!=0 && n+2>aMaxBytes) goto stringfull; aVal+=twobytes >> 8; // sub-page lead in n++; } aVal+=twobytes & 0xFF; // sub-page code n++; } break; #endif case chs_ascii: // explicit ASCII: convert some special chars to plain ASCII if ((ucs4 & 0xFFFFFF80) !=0) { // search in ASCIIfy table uInt16 k=0; while (ASCIIfyTable[k].ucs4!=0) { if (ucs4==ASCIIfyTable[k].ucs4) { // found, fetch ASCII-equivalent ucs4=ASCIIfyTable[k].ascii; break; // use it } k++; } } // fall through to default, which does not know ANY non-ASCII default: // only 7 bit ASCII is allowed if ((ucs4 & 0xFFFFFF80) !=0) aVal+=INCONVERTIBLE_PLACEHOLDER; else appendCharToString(ucs4,aVal,aQuotingMode); // simply append ASCII codes n++; break; } // switch } // valid UCS4 } // not already UTF8 } // if not lineend // processed until here p=aUTF8; } // while not end of input string } // not already UTF8 // return true if input string completely consumed stringfull: return (*p==0); } // appendUTF8ToString // convert UTF8 to UCS4 // - returns pointer to next char // - returns UCS4=0 on error (no char, bad sequence, sequence not complete) const char *UTF8toUCS4(const char *aUTF8, uInt32 &aUCS4) { uInt8 c; sInt16 morechars; if ((c=*aUTF8)!=0) { aUTF8++; // there is a char morechars=0; // decode UTF8 lead-in if ((c & 0x80) == 0) { // single byte aUCS4=c; morechars=0; } else if ((c & 0xE0) == 0xC0) { // two bytes aUCS4=c & 0x1F; morechars=1; } else if ((c & 0xF0) == 0xE0) { aUCS4=c & 0x0F; morechars=2; } else if ((c & 0xF8) == 0xF0) { aUCS4=c & 0x07; morechars=3; } else if ((c & 0xFC) == 0xF8) { aUCS4=c & 0x03; morechars=4; } else if ((c & 0xFE) == 0xFC) { aUCS4=c & 0x01; morechars=5; } else { // bad char aUCS4=0; } // process additional chars while(morechars--) { if ((c=*aUTF8)==0) { // unfinished sequence aUCS4=0; break; } aUTF8++; if ((c & 0xC0) != 0x80) { // bad additional char aUCS4=0; break; } // each additional char adds 6 new bits aUCS4 = aUCS4 << 6; // shift existing bits aUCS4 |= (c & 0x3F); // add new bits } } else { // no char aUCS4=0; } // return pointer to next char return aUTF8; } // UTF8toUCS4 // convert UCS4 to UTF8 (0 char is not allowed and will be ignored!) void UCS4toUTF8(uInt32 aUCS4, string &aUTF8) { uInt8 c; // ignore null char if (aUCS4==0) return; // create UTF8 lead-in sInt16 morechars=0; if (aUCS4<0x00000080) { // one byte c=aUCS4; } else if (aUCS4<0x00000800) { // two bytes c=0xC0 | ((aUCS4 >> 6) & 0x1F); morechars=1; } else if (aUCS4<0x00010000) { // three bytes c=0xE0 | ((aUCS4 >> 12) & 0x0F); morechars=2; } else if (aUCS4<0x00200000) { // four bytes c=0xF0 | ((aUCS4 >> 18) & 0x07); morechars=3; } else if (aUCS4<0x04000000) { // five bytes c=0xF8 | ((aUCS4 >> 24) & 0x03); morechars=4; } else { // six bytes c=0xFC | ((aUCS4 >> 30) & 0x01); morechars=5; } // add lead-in aUTF8+=c; // add rest of sequence while (morechars--) { c= 0x80 | ((aUCS4 >> (morechars * 6)) & 0x3F); aUTF8+=c; } } // UCS4toUTF8 /* Encoding UTF-16 (excerpt from RFC 2781, paragraph 2.1) Encoding of a single character from an ISO 10646 character value to UTF-16 proceeds as follows. Let U be the character number, no greater than 0x10FFFF. 1) If U < 0x10000, encode U as a 16-bit unsigned integer and terminate. 2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF, U' must be less than or equal to 0xFFFFF. That is, U' can be represented in 20 bits. 3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and 0xDC00, respectively. These integers each have 10 bits free to encode the character value, for a total of 20 bits. 4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order bits of W1 and the 10 low-order bits of U' to the 10 low-order bits of W2. Terminate. Graphically, steps 2 through 4 look like: U' = yyyyyyyyyyxxxxxxxxxx W1 = 110110yyyyyyyyyy W2 = 110111xxxxxxxxxx */ // convert UCS4 to UTF-16 // - returns 0 for UNICODE range UCS4 and first word of UTF-16 for non UNICODE uInt16 UCS4toUTF16(uInt32 aUCS4, uInt16 &aUTF16) { if (aUCS4<0x10000) { // in unicode range: single UNICODE char aUTF16=aUCS4; return 0; // no second char } else { // out of UNICODE range aUCS4-=0x10000; if (aUCS4>0xFFFF) { // inconvertible aUTF16=INCONVERTIBLE_PLACEHOLDER; return 0; } else { // convert to two-word UNICODE / UCS-2 aUTF16=0xD800+(aUCS4>>10); return 0xDC00+(aUCS4 & 0x03FF); } } } // UCS4toUTF16 /* Decoding UTF-16 Decoding of a single character from UTF-16 to an ISO 10646 character value proceeds as follows. Let W1 be the next 16-bit integer in the sequence of integers representing the text. Let W2 be the (eventual) next integer following W1. 1) If W1 < 0xD800 or W1 > 0xDFFF, the character value U is the value of W1. Terminate. 2) Determine if W1 is between 0xD800 and 0xDBFF. If not, the sequence is in error and no valid character can be obtained using W1. Terminate. 3) If there is no W2 (that is, the sequence ends with W1), or if W2 is not between 0xDC00 and 0xDFFF, the sequence is in error. Terminate. 4) Construct a 20-bit unsigned integer U', taking the 10 low-order bits of W1 as its 10 high-order bits and the 10 low-order bits of W2 as its 10 low-order bits. 5) Add 0x10000 to U' to obtain the character value U. Terminate. Note that steps 2 and 3 indicate errors. Error recovery is not specified by this document. When terminating with an error in steps 2 and 3, it may be wise to set U to the value of W1 to help the caller diagnose the error and not lose information. Also note that a string decoding algorithm, as opposed to the single-character decoding described above, need not terminate upon detection of an error, if proper error reporting and/or recovery is provided. */ // convert UTF-16 to UCS4 // - returns pointer to next char // - returns UCS4=0 on error (no char, bad sequence, sequence not complete) const uInt16 *UTF16toUCS4(const uInt16 *aUTF16P, uInt32 &aUCS4) { uInt16 utf16=*aUTF16P++; if (utf16<0xD800 || utf16>0xDFFF) { // single char unicode aUCS4=utf16; } else { // could be two-char if (utf16<=0xDBFF) { // valid first char: check second char uInt16 utf16_2 = *aUTF16P; // next if (utf16_2 && utf16_2>=0xDC00 && utf16_2<=0xDFFF) { // second char exists and is valid aUTF16P++; // advance now aUCS4 = ((utf16 & 0x3FF) << 10) + (utf16_2 & 0x3FF); } else aUCS4=0; // no char } else { aUCS4=0; // no char } } // return advanced pointer return aUTF16P; } // UCS4toUTF16 // add UTF8 string as UTF-16 byte stream to 8-bit string // - if aLEM is not lem_none, occurrence of any type of Linefeeds // (LF,CR,CRLF and even CRCRLF) in input string will be // replaced by the specified line end type // - output is clipped after ByteString reaches aMaxBytes size (if not 0), = approx half as many Unicode chars // - returns true if all input could be converted, false if output is clipped bool appendUTF8ToUTF16ByteString( cAppCharP aUTF8, string &aUTF16ByteString, bool aBigEndian, TLineEndModes aLEM, uInt32 aMaxBytes ) { uInt32 ucs4; uInt16 utf16=0,utf16_1; cAppCharP p; while (aUTF8 && *aUTF8) { // convert next UTF8 char to UCS4 p=UTF8toUCS4(aUTF8, ucs4); if (ucs4==0) break; // error in UTF8 encoding, exit // convert line ends if (ucs4 == '\n' && aLEM!=lem_none && aLEM!=lem_cstr) { // produce specified line end utf16_1=0; switch (aLEM) { case lem_mac : utf16=0x0D; break; case lem_filemaker : utf16=0x0B; break; case lem_unix : utf16=0x0A; break; case lem_dos : utf16_1=0x0D; // CR.. utf16=0x0A; // ..then LF break; default: break; } } else { // ordinary char, use UTF16 encoding utf16_1 = UCS4toUTF16(ucs4,utf16); } // check if appending UTF16 would exceed max size specified if (aMaxBytes!=0 && aUTF16ByteString.size() + (utf16_1 ? 4 : 2) > aMaxBytes) break; // we can append, advance input pointer aUTF8 = p; // now append if (aBigEndian) { // Big end first, Motorola order if (utf16_1) { aUTF16ByteString += (char)((utf16_1 >> 8) & 0xFF); aUTF16ByteString += (char)(utf16_1 & 0xFF); } aUTF16ByteString += (char)((utf16 >> 8) & 0xFF); aUTF16ByteString += (char)(utf16 & 0xFF); } else { // Little end first, Intel order if (utf16_1) { aUTF16ByteString += (char)((utf16_1 >> 8) & 0xFF); aUTF16ByteString += (char)(utf16_1 & 0xFF); } aUTF16ByteString += (char)(utf16 & 0xFF); aUTF16ByteString += (char)((utf16 >> 8) & 0xFF); } } // while // true if all input consumed return (aUTF8==NULL) || (*aUTF8==0); } // appendUTF8ToUTF16ByteString // add UTF16 byte string as UTF8 to value void appendUTF16AsUTF8( const uInt16 *aUTF16, uInt32 aNumUTF16Chars, bool aBigEndian, string &aVal, bool aConvertLineEnds, bool aAllowFilemakerCR ) { uInt32 ucs4; uInt16 utf16pair[2]; cAppCharP inP = (cAppCharP)aUTF16; bool lastWasCR=false; while (inP && !(*inP==0 && *(inP+1)==0) && aNumUTF16Chars>0) { // get two words (in case of surrogate pair) if (aBigEndian) { // Motorola order utf16pair[0]=((*(inP) & 0xFF)<<8) + (*(inP+1) & 0xFF); if (aNumUTF16Chars>1) utf16pair[1]=((*(inP+2) & 0xFF)<<8) + (*(inP+3) & 0xFF); } else { // Intel order utf16pair[0]=((*(inP+1) & 0xFF)<<8) + (*(inP) & 0xFF); if (aNumUTF16Chars>1) utf16pair[1]=((*(inP+3) & 0xFF)<<8) + (*(inP+2) & 0xFF); } cAppCharP hP = (cAppCharP)UTF16toUCS4(utf16pair, ucs4); /* PDEBUGPRINTFX(DBG_PARSE+DBG_EXOTIC,( "Parsed %ld bytes: *(inP)=0x%02hX, *(inP+1)=0x%02hX, *(inP+2)=0x%02hX, *(inP+3)=0x%02hX, utf16pair[0]=0x%04hX, utf16pair[1]=0x%04hX, ucs4=0x%04lX", (uInt32)(hP-(cAppCharP)utf16pair), (uInt16)*(inP), (uInt16)*(inP+1), (uInt16)*(inP+2), (uInt16)*(inP+3), (uInt16)utf16pair[0], (uInt16)utf16pair[1], (uInt32)ucs4 )); */ uInt32 bytes=hP-(cAppCharP)utf16pair; inP+=bytes; // next UTF16 to check aNumUTF16Chars-=bytes/2; // count down UTF16 chars // convert line ends if selected if (aConvertLineEnds) { if (ucs4 == 0x0D) { lastWasCR=true; continue; } else { if (ucs4 == 0x0A || (aAllowFilemakerCR && ucs4 == 0x0B)) ucs4 = '\n'; // convert to LineEnd else if (lastWasCR) aVal += '\n'; // insert a LineEnd lastWasCR=false; } } // append to UTF-8 string UCS4toUTF8(ucs4, aVal); } if (lastWasCR) aVal += '\n'; // input string ended on CR, must be shown in output } // appendUTF16AsUTF8 #ifdef BINTREE_GENERATOR // add a key/value pair to the binary tree void addToBinTree(TBinTreeNode *&aBinTree, treeval_t aMinKey, treeval_t aMaxKey, treeval_t aKey, treeval_t aValue) { // start at root TBinTreeNode **nextPP = &aBinTree; treeval_t cmpval; do { // create the new decision value from max and min cmpval = aMinKey+((aMaxKey-aMinKey) >> 1); // create the node if not already there if (*nextPP==NULL) { *nextPP = new TBinTreeNode; (*nextPP)->key = cmpval; (*nextPP)->nextHigher=NULL; (*nextPP)->nextLowerOrEqual=NULL; (*nextPP)->value=0; } // check if the node CREATED is a leaf node // this is the case if max==min if (aMaxKey==aMinKey) { // save leaf value (possibly overwriting existing leaf value for same code) (*nextPP)->value=aValue; break; } // decide which way to go if (aKey>cmpval) { // go to the "higher" side nextPP = &((*nextPP)->nextHigher); // determine new minimum aMinKey = cmpval+1; // minimum must be higher than cmpval } else { // go to the "lower or equal" side nextPP = &((*nextPP)->nextLowerOrEqual); // determine new maximum aMaxKey = cmpval; // maximum must be lower or equal than cmpval } } while(true); } // addToBinTree // dispose a bintree void disposeBinTree(TBinTreeNode *&aBinTree) { if (!aBinTree) return; if (aBinTree->nextHigher) disposeBinTree(aBinTree->nextHigher); if (aBinTree->nextLowerOrEqual) disposeBinTree(aBinTree->nextLowerOrEqual); delete aBinTree; aBinTree=NULL; } // disposeBinTree // convert key to value using a flat bintree treeval_t searchBintree(TBinTreeNode *aBinTree, treeval_t aKey, treeval_t aUndefValue, treeval_t aMinKey, treeval_t aMaxKey) { treeval_t cmpval; while(aBinTree) { // create the new decision value from max and min cmpval = aMinKey+((aMaxKey-aMinKey) >> 1); // must match stored cmpval if (cmpval!=aBinTree->key) return aUndefValue; // check if next node must be leaf if the tree contains our key, // this is the case if max==min if (aMaxKey==aMinKey) { if (aBinTree->nextHigher!=NULL || aBinTree->nextLowerOrEqual!=NULL) { // no leaf value here, should not be the case ever (we should have // encountered a node with no left or right link before this!) return aUndefValue; } else { // found a leaf value here return aBinTree->value; } } // decide which way to go if (aKey>cmpval) { // go to the "higher" side = just next element in array, except if we have the special marker here if (aBinTree->nextHigher == NULL) return aUndefValue; // we should go higher-side, but can't -> unknown key aBinTree=aBinTree->nextHigher; // determine new minimum aMinKey = cmpval+1; // minimum must be higher than cmpval } else { // go to the "lower" side = element at index indicated by current element, except if we have the special marker here if (aBinTree->nextLowerOrEqual == NULL) return aUndefValue; // we should go lower-or-equal-side, but can't -> unknown key aBinTree=aBinTree->nextLowerOrEqual; // determine new maximum aMaxKey = cmpval; // maximum must be lower or equal than cmpval } } // if we reach the end of the array, key is not in the tree return aUndefValue; } // searchBintree // make a flat form representation of the bintree in a one-dimensional array // - higher-side links are implicit (nodes following each other), // lower-or-equal-side links are explicit static bool flatBinTreeRecursion( TBinTreeNode *aBinTree, size_t &aIndex, treeval_t *aFlatArray, size_t aArrSize, treeval_t aLinksStart, treeval_t aLinksEnd ) { // check if array is full if (aIndex>=aArrSize) return false; // examine node to flatten if (aBinTree->nextHigher==NULL && aBinTree->nextLowerOrEqual==NULL) { // this is a leaf node, containing only the value if (aBinTree->value>=aLinksStart && aBinTree->value<=aLinksEnd) return false; // link space and value space overlap aFlatArray[aIndex]=aBinTree->value; aIndex++; } else if (aBinTree->nextHigher==NULL) { // lower-side-only node: set special mark to specify that lower-or-equal side // implicitly follows (instead of higher-side) aFlatArray[aIndex]=aLinksStart + 1; // no node points to the immediately following node explicitly, so 1 can be used as special marker aIndex++; // - recurse to generate it if (!flatBinTreeRecursion(aBinTree->nextLowerOrEqual,aIndex,aFlatArray,aArrSize,aLinksStart,aLinksEnd)) return false; } else { // this is a branch // - lower-or-equal side is represented as an index in the array aFlatArray[aIndex]=aLinksStart + 0; // default to not-existing (no node points to itself, so 0 can be used as NIL index value) // - higher side branch follows immediately size_t linkindex = aIndex++; // - recurse to generate it if (!flatBinTreeRecursion(aBinTree->nextHigher,aIndex,aFlatArray,aArrSize,aLinksStart,aLinksEnd)) return false; // - now we have the index where we must insert the lower-or-equal side if (aBinTree->nextLowerOrEqual!=NULL) { // there is a lower-or-equal side // - place relative link from original node uInt32 rellink=aIndex-linkindex; if ((uInt32)aLinksStart+rellink>(uInt32)aLinksEnd-1L) { // we need a long link // - move generated higher side branch one up for (size_t k=aIndex-1; k>linkindex; k--) aFlatArray[k+1]=aFlatArray[k]; aIndex++; // we've eaten up one extra entry now // - now set long link aFlatArray[linkindex]=aLinksEnd-1; // long link marker if (rellink>0xFFFF) return false; // cannot jump more than 64k aFlatArray[linkindex+1]=rellink; // long link } else { // short link is ok aFlatArray[linkindex]=aLinksStart+rellink; } // - now create the lower-or-equal side if (!flatBinTreeRecursion(aBinTree->nextLowerOrEqual,aIndex,aFlatArray,aArrSize,aLinksStart,aLinksEnd)) return false; } } return true; } // flatBinTreeRecursion // make a flat form representation of the bintree in a one-dimensional array // - higher-side links are implicit (nodes following each other), // lower-or-equal-side links are explicit bool flatBinTree( TBinTreeNode *aBinTree, TConvFlatTree &aFlatTree, size_t aArrSize, treeval_t aMinKey, treeval_t aMaxKey, treeval_t aLinksStart, treeval_t aLinksEnd ) { // save tree params aFlatTree.numelems=0; aFlatTree.minkey=aMinKey; aFlatTree.maxkey=aMaxKey; aFlatTree.linksstart=aLinksStart; aFlatTree.linksend=aLinksEnd; // now create actual tree size_t index=0; if (!flatBinTreeRecursion(aBinTree,index,aFlatTree.elements,aArrSize,aLinksStart,aLinksEnd)) return false; aFlatTree.numelems=index; // actual length of array return true; } // flatBinTree #endif // convert key to value using a flat bintree treeval_t searchFlatBintree(const TConvFlatTree &aFlatTree, treeval_t aKey, treeval_t aUndefValue) { treeval_t cmpval,thisnode; size_t index=0; // get start min and max treeval_t minKey = aFlatTree.minkey; treeval_t maxKey = aFlatTree.maxkey; // reject out-of-bounds keys immediately if (aKeymaxKey) return aUndefValue; do { // create the new decision value from max and min cmpval = minKey+((maxKey-minKey) >> 1); thisnode = aFlatTree.elements[index]; // check if next node must be leaf if the tree contains our key, // this is the case if max==min if (maxKey==minKey) { #ifdef BINTREE_GENERATOR if (thisnode>=aFlatTree.linksstart && thisnode<=aFlatTree.linksend) { // no leaf value here, should not be the case ever (we should have // encountered a node with no left or right link before this!) return aUndefValue; } else #endif { // found a leaf value here return (treeval_t) thisnode; } } // decide which way to go if (aKey>cmpval) { // go to the "higher" side = just next element in array, except if we have the special marker here if (thisnode == aFlatTree.linksstart+1) return aUndefValue; // we should go higher-side, but can't -> unknown key // next node is next index (or one more in case this is a long link) if (thisnode == aFlatTree.linksend-1) index++; index++; // determine new minimum minKey = cmpval+1; // minimum must be higher than cmpval } else { // go to the "lower" side = element at index indicated by current element, except if we have the special marker here if (thisnode == aFlatTree.linksstart+1) index++; // special case, "lower" side is immediately following because there is no "higher" side else { #ifdef BINTREE_GENERATOR // if node contains a leaf value instead of a link, something is wrong if (thisnodeaFlatTree.linksend) return aUndefValue; // no leaf expected here #endif if (thisnode==aFlatTree.linksend-1) { // long link index++; // skip long link marker thisnode = aFlatTree.elements[index]; // get link value index = index+thisnode; // jump by link value } else { // short link index = index+(thisnode-aFlatTree.linksstart); // get index of next node (relative branch) } if (index==0) return aUndefValue; // there is no link } // determine new maximum maxKey = cmpval; // maximum must be lower or equal than cmpval } } while(index0) { AppendHexByte(aStringObj,*aBinary++); aBinSz--; } } // StringObjHexString // add (already encoded!) CGI to existing URL string bool addCGItoString(string &aStringObj, cAppCharP aCGI, bool noduplicate) { if (!noduplicate || aStringObj.find(aCGI)==string::npos) { // - Add CGI separator if and only if none exists already if (aStringObj.find("?")==string::npos) aStringObj += '?'; aStringObj += aCGI; return true; // added } return false; // nothing added } // encode string for being used as a CGI key/value element string encodeForCGI(cAppCharP aCGI) { string cgi; cAppCharP p = aCGI; while (p && *p) { if (*p>0x7E || *p<=0x20 || *p=='%' || *p=='?' || *p=='&' || *p=='#') { // CGI encode these cgi += '%'; AppendHexByte(cgi, *p); } else { // use as-is cgi += *p; } p++; } return cgi; } // encodeForCGI // Count bits int countbits(uInt32 aMask) { int bits=0; uInt32 mask=0x0000001; while (mask) { if (aMask & mask) bits++; mask=mask << 1; } return bits; } // countbits // make uppercase void StringUpper(string &aString) { for(uInt32 k=0; kcontent) { // no content at all aStringObj.erase(); } else if ( // NOTE: Opaque works only with modified syncML toolkit which // makes sure opaque content is ALSO TERMINATED LIKE A C-STRING aPcdataP->contentType == SML_PCDATA_STRING || aPcdataP->contentType == SML_PCDATA_OPAQUE ) { // string or opaque type aStringObj.assign((char *)aPcdataP->content, aPcdataP->length); } else if (aPcdataP->contentType == SML_PCDATA_EXTENSION) { // extension type StringObjPrintf(aStringObj,"[PCDATA_EXTENSION Type=%hd]",(sInt16)aPcdataP->extension); } else { // other type StringObjPrintf(aStringObj,"[PCDATA Type=%hd]",(sInt16)aPcdataP->contentType); } } // smlPCDataToStringObj // returns item string or empty string (NEVER NULL) const char *smlItemDataToCharP(const SmlItemPtr_t aItemP) { if (!aItemP) return ""; return smlPCDataToCharP(aItemP->data); } // smlItemDataToCharP // returns first item string or empty string (NEVER NULL) const char *smlFirstItemDataToCharP(const SmlItemListPtr_t aItemListP) { if (!aItemListP) return ""; return smlItemDataToCharP(aItemListP->item); } // smlFirstItemDataToCharP #endif //SYSYNC_ENGINE // returns pointer to PCdata contents or null string. If aSizeP!=NULL, length will be stored in *aSize const char *smlPCDataToCharP(const SmlPcdataPtr_t aPcdataP, stringSize *aSizeP) { const char *str = smlPCDataOptToCharP(aPcdataP, aSizeP); if (str) return str; return ""; } // smlPCDataToCharP // returns pointer to PCdata contents if existing, NULL otherwise. // If aSizeP!=NULL, length will be stored in *aSize const char *smlPCDataOptToCharP(const SmlPcdataPtr_t aPcdataP, stringSize *aSizeP) { if (!aPcdataP || !aPcdataP->content) { return NULL; // we have no value, it could be empty howevert if (aSizeP) *aSizeP=0; } if (aPcdataP->length==0) { // empty content if (aSizeP) *aSizeP=0; return ""; // return empty string } else if ( // NOTE: Opaque works only with modified syncML toolkit which // makes sure opaque content is ALSO TERMINATED LIKE A C-STRING aPcdataP->contentType == SML_PCDATA_STRING || aPcdataP->contentType == SML_PCDATA_CDATA || // XML only aPcdataP->contentType == SML_PCDATA_OPAQUE // WBXML only ) { // return pointer to content if (aSizeP) *aSizeP=aPcdataP->length; return (char *) aPcdataP->content; } else { // no string if (aSizeP) *aSizeP=11; return "[no string]"; } } // smlPCDataOptToCharP // returns pointer to source or target LocURI const char *smlSrcTargLocURIToCharP(const SmlTargetPtr_t aSrcTargP) { if (!aSrcTargP || !aSrcTargP->locURI) { return ""; // empty string } else { // return PCdata string contents return smlPCDataToCharP(aSrcTargP->locURI); } } // smlSrcTargLocURIToCharP // returns pointer to source or target LocName const char *smlSrcTargLocNameToCharP(const SmlTargetPtr_t aSrcTargP) { if (!aSrcTargP || !aSrcTargP->locName) { return ""; // empty string } else { // return PCdata string contents return smlPCDataToCharP(aSrcTargP->locName); } } // smlSrcTargLocNameToCharP #ifdef SYSYNC_ENGINE // returns error code made ready for SyncML sending (that is, remove offset // of 10000 if present, and make generic error 500 for non-SyncML errors, // and return LOCERR_OK as 200) localstatus syncmlError(localstatus aErr) { if (aErr==LOCERR_OK) return 200; // SyncML ok code if (aErr<999) return aErr; // return as is if (aErr>=LOCAL_STATUS_CODE+100 && aErr<=999) return aErr-LOCAL_STATUS_CODE; // return with offset removed // no suitable conversion return 500; // return generic "bad" } // localError // returns error code made local (that is, offset by 10000 in case aErr is a // SyncML status code <10000, and convert 200 into LOCERR_OK) localstatus localError(localstatus aErr) { if (aErr==200 || aErr==0) return LOCERR_OK; if (aErrassign(p,q-p); if (aPort) aPort->assign(q+1); } else { // no prot spec if (aAddr) aAddr->assign(p); if (aPort) aPort->erase(); } } // splitHostname // translate %XX into corresponding character in-place void urlDecode(string *str) { // nothing todo? if (!str || str->find('%') == string::npos) return; string replacement; replacement.reserve(str->size()); const char *in = str->c_str(); char c; while ((c = *in++) != 0) { if (c == '%') { c = tolower(*in++); unsigned char value = 0; if (!c) { break; } else if (c >= '0' && c <= '9') { value = c - '0'; } else if (c >= 'a' && c <= 'f') { value = c - 'a' + 10; } else { // silently skip invalid character } value *= 16; c = tolower(*in++); if (!c) { break; } else if (c >= '0' && c <= '9') { value += c - '0'; replacement.append((char *)&value, 1); } else if (c >= 'a' && c <= 'f') { value += c - 'a' + 10; replacement.append((char *)&value, 1); } else { // silently skip invalid character } } else { replacement.append(&c, 1); } } *str = replacement; } // translate %XX into corresponding character in-place void urlEncode(string *str) { if (!str) { return; } string replacement; size_t i, start = 0; const char *t = str->c_str(); const char *s = t; char buffer[4]; char c; for (i = 0; (c = *t) != 0; i++, t++) { if (!isalnum(c)) { replacement.append(s + start, i - start); start = i + 1; sprintf(buffer, "%%%02X", c); replacement.append(buffer, 3); } } if (start > 0) { // Something was added to replacement because we found unsafe // characters, finish the job. replacement.append(s + start, i - start); *str = replacement; } } // split URL into protocol, hostname, document name and auth-info (user, password); // the optional query and port are not url-decoded, everything else is void splitURL(const char *aURI,string *aProtocol,string *aHost, string *aDoc, string *aUser, string *aPasswd, string *aPort, string *aQuery) { const char *p,*q,*r; p=aURI; // extract protocol q=strchr(p,':'); if (q) { // protocol found if (aProtocol) aProtocol->assign(p,q-p); p=q+1; // past colon int count = 0; while (*p=='/' && count < 2) { p++; // past trailing slashes (two expected, ignore if less are given) count++; } // now identify end of host part string host; q=strchr(p, '/'); if (!q) { // no slash, skip forward to end of string q = p + strlen(p); } host.assign(p, q - p); // if protocol specified, check for auth info const char *h = host.c_str(); q=strchr(h,'@'); r=strchr(h,':'); if (q && r && q>r) { // auth exists if (aUser) aUser->assign(h,r-h); if (aPasswd) aPasswd->assign(r+1,q-r-1); // skip auth in full string p += q + 1 - h; } else { // no auth found if (aUser) aUser->erase(); if (aPasswd) aPasswd->erase(); } // p now points to host part, as expected below } else { // no protocol found if (aProtocol) aProtocol->erase(); // no protocol, no auth if (aUser) aUser->erase(); if (aPasswd) aPasswd->erase(); } // separate hostname and document std::string host; // - check for path q=strchr(p,'/'); // - if no path, check if there is a CGI param directly after the host name if (!q) { // doc part left empty in this case if (aDoc) aDoc->erase(); q=strchr(p,'?'); if (q) { // query directly follows host host.assign(p, q - p); if (aQuery) aQuery->assign(q + 1); } else { // entire string is considered the host host.assign(p); if (aQuery) aQuery->erase(); } } else { // host part stops at slash host.assign(p, q - p); // in case of '/', do not put slash into docname // even if it would be empty (caller expected to add // slash as needed) p = q + 1; // exclude slash // now check for query q=strchr(p,'?'); if (q) { // split at question mark if (aDoc) aDoc->assign(p, q - p); if (aQuery) aQuery->assign(q + 1); } else { // whole string is document name if (aDoc) aDoc->assign(p); if (aQuery) aQuery->erase(); } } // remove optional port from host part before url-decoding, because // that might introduce new : characters into the host name size_t colon = host.find(':'); if (colon != host.npos) { if (aHost) aHost->assign(host.substr(0, colon)); if (aPort) aPort->assign(host.substr(colon + 1)); } else { if (aHost) aHost->assign(host); if (aPort) aPort->erase(); } } // splitURL #ifdef SPLIT_URL_MAIN #include #include static void test(const std::string &in, const std::string &expected) { string protocol, host, doc, user, password, port, query; char buffer[1024]; splitURL(in.c_str(), &protocol, &host, &doc, &user, &password, &port, &query); // URL-decode each part urlDecode(&protocol); urlDecode(&host); urlDecode(&doc); urlDecode(&user); urlDecode(&password); sprintf(buffer, "prot '%s' user '%s' passwd '%s' host '%s' port '%s' doc '%s' query '%s'", protocol.c_str(), user.c_str(), password.c_str(), host.c_str(), port.c_str(), doc.c_str(), query.c_str()); printf("%s -> %s\n", in.c_str(), buffer); assert(expected == buffer); } int main(int argc, char **argv) { test("http://user:passwd@host/patha/pathb?query", "prot 'http' user 'user' passwd 'passwd' host 'host' port '' doc 'patha/pathb' query 'query'"); test("http://user:passwd@host:port/patha/pathb?query", "prot 'http' user 'user' passwd 'passwd' host 'host' port 'port' doc 'patha/pathb' query 'query'"); test("file:///foo/bar", "prot 'file' user '' passwd '' host '' port '' doc 'foo/bar' query ''"); test("http://host%3a:port?param=value", "prot 'http' user '' passwd '' host 'host:' port 'port' doc '' query 'param=value'"); test("http://host%3a?param=value", "prot 'http' user '' passwd '' host 'host:' port '' doc '' query 'param=value'"); test("foo%24", "prot '' user '' passwd '' host 'foo$' port '' doc '' query ''"); test("foo%2f", "prot '' user '' passwd '' host 'foo/' port '' doc '' query ''"); test("foo%2A", "prot '' user '' passwd '' host 'foo*' port '' doc '' query ''"); test("foo%24bar", "prot '' user '' passwd '' host 'foo$bar' port '' doc '' query ''"); test("%24bar", "prot '' user '' passwd '' host '$bar' port '' doc '' query ''"); test("foo%2", "prot '' user '' passwd '' host 'foo' port '' doc '' query ''"); test("foo%", "prot '' user '' passwd '' host 'foo' port '' doc '' query ''"); test("foo%g", "prot '' user '' passwd '' host 'foo' port '' doc '' query ''"); test("foo%gh", "prot '' user '' passwd '' host 'foo' port '' doc '' query ''"); test("%ghbar", "prot '' user '' passwd '' host 'bar' port '' doc '' query ''"); return 0; } #endif // SPLIT_URL_MAIN #endif //SYSYNC_ENGINE // returns type from meta const char *smlMetaTypeToCharP(SmlMetInfMetInfPtr_t aMetaP) { if (!aMetaP) return NULL; // no meta at all return smlPCDataToCharP(aMetaP->type); } // smlMetaTypeToCharP // returns Next Anchor from meta const char *smlMetaNextAnchorToCharP(SmlMetInfMetInfPtr_t aMetaP) { if (!aMetaP) return NULL; // no meta at all if (!aMetaP->anchor) return NULL; // no anchor at all return smlPCDataToCharP(aMetaP->anchor->next); } // smlMetaAnchorToCharP // returns Last Anchor from meta const char *smlMetaLastAnchorToCharP(SmlMetInfMetInfPtr_t aMetaP) { if (!aMetaP) return NULL; // no meta at all if (!aMetaP->anchor) return NULL; // no anchor at all return smlPCDataToCharP(aMetaP->anchor->last); } // smlMetaLastAnchorToCharP // returns DevInf pointer if any in specified PCData, NULL otherwise SmlDevInfDevInfPtr_t smlPCDataToDevInfP(const SmlPcdataPtr_t aPCDataP) { if (!aPCDataP) return NULL; if (aPCDataP->contentType!=SML_PCDATA_EXTENSION) return NULL; if (aPCDataP->extension!=SML_EXT_DEVINF) return NULL; return (SmlDevInfDevInfPtr_t)(aPCDataP->content); } // smlPCDataToDevInfP // returns MetInf pointer if any in specified PCData, NULL otherwise SmlMetInfMetInfPtr_t smlPCDataToMetInfP(const SmlPcdataPtr_t aPCDataP) { if (!aPCDataP) return NULL; if (aPCDataP->contentType!=SML_PCDATA_EXTENSION) return NULL; if (aPCDataP->extension!=SML_EXT_METINF) return NULL; return (SmlMetInfMetInfPtr_t)(aPCDataP->content); } // smlPCDataToMetInfP // allocate memory via SyncML toolkit allocation function, but throw // exception if it fails. Used by SML void *_smlMalloc(MemSize_t size) { void *p; p=smlLibMalloc(size); if (!p) SYSYNC_THROW(TMemException("smlLibMalloc() failed")); return p; } // _smlMalloc // returns true on successful conversion of PCData string to sInt32 bool smlPCDataToULong(const SmlPcdataPtr_t aPCDataP, uInt32 &aLong) { return StrToULong(smlPCDataToCharP(aPCDataP),aLong); } // smlPCDataToLong // returns true on successful conversion of PCData string to sInt32 bool smlPCDataToLong(const SmlPcdataPtr_t aPCDataP, sInt32 &aLong) { return StrToLong(smlPCDataToCharP(aPCDataP),aLong); } // smlPCDataToLong #ifdef SYSYNC_ENGINE // returns true on successful conversion of PCData string to format bool smlPCDataToFormat(const SmlPcdataPtr_t aPCDataP, TFmtTypes &aFmt) { const char *fmt = smlPCDataToCharP(aPCDataP); sInt16 sh; if (*fmt) { if (!StrToEnum(encodingFmtSyncMLNames,numFmtTypes,sh,fmt)) return false; // unknown format aFmt=(TFmtTypes)sh; } else { aFmt=fmt_chr; // no spec = chr } return true; } // smlPCDataToFormat #endif //SYSYNC_ENGINE // build Meta anchor SmlPcdataPtr_t newMetaAnchor(const char *aNextAnchor, const char *aLastAnchor) { SmlPcdataPtr_t metaP; SmlMetInfAnchorPtr_t anchorP; // - create empty meta metaP=newMeta(); // - create new anchor anchorP=SML_NEW(SmlMetInfAnchor_t); // - set anchor contents //%%% anchorP->last=newPCDataOptEmptyString(aLastAnchor); // optional, but omitted only if string is NULL (not if only empty) anchorP->last=newPCDataOptString(aLastAnchor); // optional anchorP->next=newPCDataString(aNextAnchor); // mandatory // - set anchor ((SmlMetInfMetInfPtr_t)(metaP->content))->anchor=anchorP; // return return metaP; } // newMetaAnchor // build Meta type SmlPcdataPtr_t newMetaType(const char *aMetaType) { SmlPcdataPtr_t metaP; // - if not type, we don't create a meta at all if (aMetaType==NULL || *aMetaType==0) return NULL; // - create empty meta metaP=newMeta(); // - set type ((SmlMetInfMetInfPtr_t)(metaP->content))->type=newPCDataString(aMetaType); // return return metaP; } // newMetaType // build empty Meta SmlPcdataPtr_t newMeta(void) { SmlPcdataPtr_t metaP; SmlMetInfMetInfPtr_t metinfP; // - create empty PCData metaP = SML_NEW(SmlPcdata_t); metaP->contentType=SML_PCDATA_EXTENSION; metaP->extension=SML_EXT_METINF; // - %%% assume length is not relevant for structured content (looks like in mgrutil.c) metaP->length=0; // - create empty meta metinfP = SML_NEW(SmlMetInfMetInf_t); metaP->content=metinfP; // link to PCdata // - init meta options metinfP->version=NULL; metinfP->format=NULL; metinfP->type=NULL; metinfP->mark=NULL; metinfP->size=NULL; metinfP->nextnonce=NULL; metinfP->maxmsgsize=NULL; metinfP->mem=NULL; metinfP->emi=NULL; // PCData list metinfP->anchor=NULL; // - SyncML 1.1 metinfP->maxobjsize=NULL; // - SyncML 1.2 metinfP->flags=0; // return return metaP; } // newMeta // copy meta from existing meta (for data items only // anchor, mem, emi, nonce are not copied!) // Note however that we copy maxobjsize, as we (mis-)use it for ZIPPED_BINDATA_SUPPORT SmlPcdataPtr_t copyMeta(SmlPcdataPtr_t aOldMetaP) { if (!aOldMetaP) return NULL; SmlPcdataPtr_t newmetaP=newMeta(); if (!newmetaP) return NULL; SmlMetInfMetInfPtr_t oldmetinfP = smlPCDataToMetInfP(aOldMetaP); if (!oldmetinfP) return NULL; SmlMetInfMetInfPtr_t newmetInfP = smlPCDataToMetInfP(newmetaP); // - copy meta newmetInfP->version = smlPcdataDup(oldmetinfP->version); newmetInfP->format = smlPcdataDup(oldmetinfP->format); newmetInfP->type = smlPcdataDup(oldmetinfP->type); newmetInfP->mark = smlPcdataDup(oldmetinfP->mark); newmetInfP->size = smlPcdataDup(oldmetinfP->size); newmetInfP->maxobjsize = smlPcdataDup(oldmetinfP->maxobjsize); // return return newmetaP; } // copyMeta // add an item to an item list SmlItemListPtr_t *addItemToList( SmlItemPtr_t aItemP, // existing item data structure, ownership is passed to list SmlItemListPtr_t *aItemListPP // adress of pointer to existing item list or NULL ) { if (aItemListPP && aItemP) { // find last itemlist pointer while (*aItemListPP) { aItemListPP=&((*aItemListPP)->next); } // aItemListPP now points to a NULL pointer which must be replaced by addr of new ItemList entry *aItemListPP = SML_NEW(SmlItemList_t); (*aItemListPP)->next=NULL; (*aItemListPP)->item=aItemP; // insert new item // return pointer to pointer to next element (which is now NULL). // Can be passed in to addPCDataToList() again to append more elements without searching // for end-of-list return &((*aItemListPP)->next); } // nop, return pointer unmodified return aItemListPP; } // addItemToList // add a CTData item to a CTDataList SmlDevInfCTDataListPtr_t *addCTDataToList( SmlDevInfCTDataPtr_t aCTDataP, // existing CTData item data structure, ownership is passed to list SmlDevInfCTDataListPtr_t *aCTDataListPP // adress of pointer to existing item list or NULL ) { if (aCTDataListPP && aCTDataP) { // find last itemlist pointer while (*aCTDataListPP) { aCTDataListPP=&((*aCTDataListPP)->next); } // aItemListPP now points to a NULL pointer which must be replaced by addr of new ItemList entry *aCTDataListPP = SML_NEW(SmlDevInfCTDataList_t); (*aCTDataListPP)->next=NULL; (*aCTDataListPP)->data=aCTDataP; // insert new data // return pointer to pointer to next element (which is now NULL). // Can be passed in to addPCDataToList() again to append more elements without searching // for end-of-list return &((*aCTDataListPP)->next); } // nop, return pointer unmodified return aCTDataListPP; } // addCTDataToList // add a CTDataProp item to a CTDataPropList SmlDevInfCTDataPropListPtr_t *addCTDataPropToList( SmlDevInfCTDataPropPtr_t aCTDataPropP, // existing CTDataProp item data structure, ownership is passed to list SmlDevInfCTDataPropListPtr_t *aCTDataPropListPP // adress of pointer to existing item list or NULL ) { if (aCTDataPropListPP && aCTDataPropP) { // find last itemlist pointer while (*aCTDataPropListPP) { aCTDataPropListPP=&((*aCTDataPropListPP)->next); } // aItemListPP now points to a NULL pointer which must be replaced by addr of new ItemList entry *aCTDataPropListPP = SML_NEW(SmlDevInfCTDataPropList_t); (*aCTDataPropListPP)->next=NULL; (*aCTDataPropListPP)->data=aCTDataPropP; // insert new data // return pointer to pointer to next element (which is now NULL). // Can be passed in to addPCDataToList() again to append more elements without searching // for end-of-list return &((*aCTDataPropListPP)->next); } // nop, return pointer unmodified return aCTDataPropListPP; } // addCTDataPropToList // add a CTData describing a property (as returned by newDevInfCTData()) // as a new property without parameters to a CTDataPropList SmlDevInfCTDataPropListPtr_t *addNewPropToList( SmlDevInfCTDataPtr_t aPropCTData, // CTData describing property SmlDevInfCTDataPropListPtr_t *aCTDataPropListPP // adress of pointer to existing item list or NULL ) { SmlDevInfCTDataPropPtr_t propdataP = SML_NEW(SmlDevInfCTDataProp_t); propdataP->param = NULL; // no params propdataP->prop = aPropCTData; return addCTDataPropToList(propdataP, aCTDataPropListPP); } // addNewPropToList // add PCData element to a PCData list SmlPcdataListPtr_t *addPCDataToList( SmlPcdataPtr_t aPCDataP, // Existing PCData element to be added, ownership is passed to list SmlPcdataListPtr_t *aPCDataListPP // adress of pointer to existing PCData list or NULL ) { if (aPCDataListPP) { // find last PCDataList pointer while (*aPCDataListPP) { aPCDataListPP=&((*aPCDataListPP)->next); } // aItemListPP now points to a NULL pointer which must be replaced by addr of new PCDataList entry *aPCDataListPP = SML_NEW(SmlPcdataList_t); (*aPCDataListPP)->next=NULL; (*aPCDataListPP)->data=aPCDataP; // insert new item // return pointer to pointer to next element (which is now NULL). // Can be passed in to addPCDataToList() again to append more elements without searching // for end-of-list return &((*aPCDataListPP)->next); } return NULL; } // addPCDataToList // add PCData string to a PCData list SmlPcdataListPtr_t *addPCDataStringToList( const char *aString, // String to be added SmlPcdataListPtr_t *aPCDataListPP // adress of pointer to existing PCData list or NULL ) { return addPCDataToList(newPCDataString(aString),aPCDataListPP); } // addPCDataStringToList // create new optional location (source or target) // Returns NULL if URI specified is NULL or empty SmlSourcePtr_t newOptLocation( const char *aLocURI, const char *aLocName ) { if (!aLocURI || *aLocURI==0) return NULL; else return newLocation(aLocURI,aLocName); } // newOptLocation // create new location (source or target) // always returns location, even if URI and/or name are empty // If name is NULL or empty, only URI is generated SmlSourcePtr_t newLocation( const char *aLocURI, const char *aLocName ) { SmlSourcePtr_t locP; locP = SML_NEW(SmlSource_t); // URI is always present (might be empty, though) locP->locURI=newPCDataString(aLocURI); // name only if not empty if (aLocName && *aLocName!=0) locP->locName=newPCDataString(aLocName); else locP->locName=NULL; // filter defaults to NULL locP->filter=NULL; return locP; } // newLocation // create new empty Item SmlItemPtr_t newItem(void) { SmlItemPtr_t itemP; itemP = SML_NEW(SmlItem_t); itemP->target=NULL; itemP->source=NULL; itemP->meta=NULL; itemP->data=NULL; // SyncML 1.1, no MoreData set itemP->flags=0; // SyncML 1.2 itemP->targetParent=NULL; itemP->sourceParent=NULL; // custom data of client itemP->aux=NULL; return itemP; } // newItem // create new Item with string-type data SmlItemPtr_t newStringDataItem( const char *aString ) { SmlItemPtr_t itemP=newItem(); itemP->data=newPCDataString(aString); return itemP; } // newStringDataItem // create meta-format PCData SmlPcdataPtr_t newPCDataFormat( TFmtTypes aFmtType, bool aShowDefault ) { if (aFmtType==fmt_chr && !aShowDefault) return NULL; // default else return newPCDataString(encodingFmtSyncMLNames[aFmtType]); // show format type } // newPCDataFormat // create new string-type PCData, if NULL or empty string is passed for aData, // NULL is returned (optional info not there) SmlPcdataPtr_t newPCDataFormatted( const uInt8 *aData, // data sInt32 aLength, // length of data, if<=0 then string length is calculated TFmtTypes aFmtType, // encoding Format bool aNeedsOpaque // set opaque needed (string that could confuse XML parsing or even binary) ) { if (!aData) return NULL; // no data if (aLength==0) aLength=strlen((const char *)aData); if (aLength==0) return NULL; // no data // encode input string if needed SmlPcdataPtr_t pcdataP; char *b64data; uInt32 b64len; switch (aFmtType) { case fmt_b64: // convert to b64 b64len=0; b64data=b64::encode(aData, aLength, &b64len); pcdataP = newPCDataString(b64data,b64len); b64::free(b64data); return pcdataP; default: // just copy into string or opaque/C_DATA string return newPCDataStringX(aData, aNeedsOpaque, aLength); } } // newPCDataEncoded // create new string-type PCData, if NULL or empty string is passed for aString, // NULL is returned (optional info not there) SmlPcdataPtr_t newPCDataOptString( const char *aString, sInt32 aLength // length of string, if<0 then length is calculated ) { if (aString && (*aString!=0)) return newPCDataString(aString,aLength); else return NULL; } // newPCDataOptString // create new string-type PCData, if NULL is passed for aString, // NULL is returned (optional info not there) // if empty string is passed, PCData with empty contents will be created SmlPcdataPtr_t newPCDataOptEmptyString( const char *aString, sInt32 aLength // length of string, if<0 then length is calculated ) { if (aString) return newPCDataString(aString,aLength); else return NULL; } // newPCDataOptEmptyString // create new string-type PCData, if NULL is passed for aString, // an empty string is created (that is, a PCData with string terminator as // content only, length=0) SmlPcdataPtr_t newPCDataString( const char *aString, sInt32 aLength // length of string, if<0 then length is calculated ) { return newPCDataStringX((const uInt8 *)aString,false,aLength); } // newPCDataString // create new PCData, aOpaque can be used to generate non-string data // Note: empty strings are always coded as non-opaque, even if aOpaque is set SmlPcdataPtr_t newPCDataStringX( const uInt8 *aString, bool aOpaque, // if set, an opaque method (OPAQUE or CDATA) is used sInt32 aLength // length of string, if<0 then length is calculated ) { SmlPcdataPtr_t pcdataP; pcdataP = SML_NEW(SmlPcdata_t); // determine length if (aLength>=0 && aString) pcdataP->length = aLength; // as specified, and string argument not NULL else pcdataP->length = aString ? strlen((const char *)aString) : 0; // from argument, if NULL -> length=0 // determine type if (aOpaque && aLength!=0) { // Note: due to modification in RTK, this generates // OPAQUE in WBXML and CDATA in XML pcdataP->contentType=SML_PCDATA_OPAQUE; } else { // non-critical string #ifdef SML_STRINGS_AS_OPAQUE pcdataP->contentType=SML_PCDATA_OPAQUE; #else pcdataP->contentType=SML_PCDATA_STRING; #endif } pcdataP->extension=SML_EXT_UNDEFINED; // - allocate data space (ALWAYS with room for a terminator, even if Opaque or empty string) pcdataP->content=smlLibMalloc(pcdataP->length+1); // +1 for terminator, see below // copy data (if any) if (pcdataP->length>0) { // - copy string smlLibMemcpy(pcdataP->content,aString,pcdataP->length); } // set terminator ((char *)(pcdataP->content))[pcdataP->length]=0; // terminate C string // return return pcdataP; } // newPCDataStringX // create new string-type PCData from C++ string SmlPcdataPtr_t newPCDataString( const string &aString ) { return newPCDataString(aString.c_str(),aString.length()); } // newPCDataString(string&) // create new decimal string representation of sInt32 as PCData SmlPcdataPtr_t newPCDataLong( sInt32 aLong ) { const int ssiz=20; char s[ssiz]; snprintf(s,ssiz,"%ld",(long)aLong); return newPCDataString(s); } // newPCDataLong // Nonce generator allowing last-session nonce to be correctly re-generated in next session void generateNonce(string &aNonce, const char *aDevStaticString, sInt32 aSessionStaticID) { md5::SYSYNC_MD5_CTX context; uInt8 digest[16]; md5::Init (&context); // - add in static device string md5::Update (&context, (const uInt8 *)aDevStaticString, strlen(aDevStaticString)); // - add in session static ID in binary format md5::Update (&context, (const uInt8 *)&aSessionStaticID, sizeof(sInt32)); // - done md5::Final (digest, &context); // - make string of first 48 bit of MD5: 48 bits, use 6 bits per char = 8 chars uInt64 dig48 = ((uInt32)digest[0] << 0) | ((uInt32)digest[1] << 8) | ((uInt32)digest[2] << 16) | ((uInt32)digest[3] << 24); aNonce.erase(); for (sInt16 k=0; k<8; k++) { aNonce+=((dig48 & 0x03F) + 0x21); dig48 = dig48 >> 6; } } // generateNonce // create challenge of requested type SmlChalPtr_t newChallenge(TAuthTypes aAuthType, const string &aNextNonce, bool aBinaryAllowed) { SmlChalPtr_t chalP=NULL; SmlMetInfMetInfPtr_t metaP; if (aAuthType!=auth_none) { // new challenge record chalP = SML_NEW(SmlChal_t); // add empty meta chalP->meta=newMeta(); metaP=(SmlMetInfMetInfPtr_t)(chalP->meta->content); // add type and format // - type metaP->type=newPCDataString(authTypeSyncMLNames[aAuthType]); // - format const char *fmt = NULL; switch (aAuthType) { case auth_basic: // always request b64 fmt=encodingFmtSyncMLNames[fmt_b64]; break; case auth_md5: // request b64 only for non-binary capable encoding (that is, XML) /* %%% dont do that, Nokia9210 miserably fails when we do that, * it sends its data B64 encoded, but obviously with bad * data in it. Ericsson T39m seems to do it correctly however. if (!aBinaryAllowed) fmt=encodingFmtSyncMLNames[fmt_b64]; */ // always request b64 for now, seems to be safer with not fully compatible clients fmt=encodingFmtSyncMLNames[fmt_b64]; break; default: break; } metaP->format=newPCDataOptString(fmt); // set format, but not empty // - add nonce if needed if (aAuthType==auth_md5) { // MD5 also might need nonce if (!aNextNonce.empty()) { // add base64 encoded nonce string uInt32 b64len; char *b64=b64::encode((const uInt8 *)aNextNonce.c_str(),aNextNonce.size(),&b64len); metaP->nextnonce=newPCDataString(b64,b64len); b64::free(b64); // return buffer allocated by b64_encode } } } return chalP; } // newChallenge // create new property or param descriptor for CTCap SmlDevInfCTDataPtr_t newDevInfCTData(cAppCharP aName,uInt32 aSize, bool aNoTruncate, uInt32 aMaxOccur, cAppCharP aDataType) { SmlDevInfCTDataPtr_t result = SML_NEW(SmlDevInfCTData_t); // fill descriptor // - name if property or param result->name=newPCDataString(aName); // - no display name so far result->dname=NULL; // no display name // - datatype (optional) result->datatype=newPCDataOptString(aDataType); // - max size if (aSize==0) result->maxsize=NULL; // no size else result->maxsize=newPCDataLong(aSize); // set size // - no valenum here, will be added later if any result->valenum=NULL; // no valenum // SyncML 1.2 if (aMaxOccur==0) result->maxoccur=NULL; // no maxoccur else result->maxoccur=newPCDataLong(aMaxOccur); // set maxoccur result->flags = aNoTruncate ? SmlDevInfNoTruncate_f : 0; // notruncate flag or none return result; } // newDevInfCTData // frees prototype element and sets calling pointer to NULL void FreeProtoElement(void * &aVoidP) { if (aVoidP) smlFreeProtoElement(aVoidP); aVoidP=NULL; } // FreeProtoElement } // namespace sysync // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/sysync_utils.h0000755000373300037200000005006412424517753027722 0ustar00nightlyallusers00000000000000/* * File: sysync_utils.h * * Author: Lukas Zeller (luz@plan44.ch) * * Provides some helper functions interfacing between SyncML Toolkit * and C++ plus other utilities * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * * 2001-05-16 : luz : created * */ #ifndef SYSYNC_UTILS_H #define SYSYNC_UTILS_H #include "sysync_globs.h" #include "sysync_noncopyable.h" // include external utils in separate files #include "sysync_b64.h" #include "sysync_md5.h" #ifndef SYSYNC_ENGINE #include "stringutil.h" #endif #include "lineartime.h" #include "iso8601.h" #ifndef FULLY_STANDALONE #include "sysync.h" #endif #include "sml.h" #include "smldevinfdtd.h" #include "smlmetinfdtd.h" namespace sysync { #ifdef SYSYNC_TOOL // convert between character sets int charConv(int argc, const char *argv[]); // parse RFC 2822 addr spec int parse2822AddrSpec(int argc, const char *argv[]); #endif // max line size for MIME content (used while encoding and folding) #define MIME_MAXLINESIZE 75 // supported charsets typedef enum { chs_unknown, // invalid chs_ascii, // 7 bit ASCII-only, with nearest char conversion for umlauts etc. chs_ansi, chs_iso_8859_1, chs_utf8, chs_utf16, #ifdef CHINESE_SUPPORT chs_gb2312, chs_cp936, #endif numCharSets } TCharSets; // Note: Char set names are defined after this enum in other files, // such as MimeDirItemType // supported MIME encoding types typedef enum { enc_none, enc_7bit, enc_8bit, enc_binary, enc_quoted_printable, enc_base64, // b64 including terminating with CRLF at end enc_b, // b64 without termination (as needed in RFC2047) numMIMEencodings } TEncodingTypes; // line end modes typedef enum { lem_none, // none specified lem_unix, // 0x0A lem_mac, // 0x0D lem_dos, // 0x0D 0x0A lem_cstr, // as in C strings, '\n' which is 0x0A normally (but might be 0x0D on some platforms) lem_filemaker, // 0x0B (filemaker tab-separated text format, CR is shown as 0x0B within fields numLineEndModes } TLineEndModes; extern const char * const lineEndModeNames[numLineEndModes]; // literal quoting modes typedef enum { qm_none, // none specified qm_duplsingle, // single quote must be duplicated qm_dupldouble, // double quote must be duplicated qm_backslash, // C-string-style escapes of CR,LF,TAB,BS,\," and ' (but no full c-string escape with \xXX etc.) numQuotingModes } TQuotingModes; extern const char * const quotingModeNames[numQuotingModes]; /* The value of this element SHOULD BE one of bin, bool, b64, chr, int, node, null or xml. If the element type is missing, the default value is chr. If the value is bin, then the format of the content is binary data. If the value is bool, then the format of the content is either true or false. If the value is b64, then the format of the content information is binary data that has been character encoded using the Base64 transfer encoding defined by [RFC2045]. If the value is chr, then the format of the content information is clear-text in the character set specified on either the transport protocol, the MIME content type header or the XML prolog. If the value is int, then the format of the content information is numeric text representing an unsigned integer between zero and 2**32-1. If the value is node, then the content represents an interior object in the management tree. If the value is null, then there is no content information. This value is used by some synchronization data models to delete the content, but not the presence of the property. If the value is xml, then the format of the content information is XML structured mark-up data. */ // format types typedef enum { fmt_chr, // default fmt_bin, fmt_b64, numFmtTypes } TFmtTypes; extern const char * const encodingFmtNames[numFmtTypes]; extern const char * const encodingFmtSyncMLNames[numFmtTypes]; extern const char * const MIMEEncodingNames[numMIMEencodings]; extern const char * const MIMECharSetNames[numCharSets]; // field (property) data types typedef enum { proptype_chr, // Character proptype_int, // Integer proptype_bool, // Boolean proptype_bin, // Binary proptype_datetime, // Date and time of day proptype_phonenum, // Phone number proptype_text, // plain text proptype_unknown, // unknown numPropDataTypes } TPropDataTypes; extern const char * const propDataTypeNames[numPropDataTypes]; // Authorization types typedef enum { auth_none, auth_basic, auth_md5, numAuthTypes } TAuthTypes; extern const char * const authTypeSyncMLNames[numAuthTypes]; //extern const char * const authFormatNames[numAuthTypes]; // char that is used for non-convertible chars #define INCONVERTIBLE_PLACEHOLDER '_' // encoding functions // encode binary stream and append to string void appendEncoded( const uInt8 *aBinary, size_t aSize, string &aString, TEncodingTypes aEncoding, sInt16 aMaxLineSize=76, sInt32 aCurrLineSize=0, // how may chars are on the first line bool aSoftBreaksAsCR=false, // if set, soft breaks are not added as CRLF, but only indicated as CR bool aEncodeBinary=false // quoted printable: binary coding: both CR and LF will be // always replaced by "=0D" and "=0A" ); // decode encoded data and append to string const char *appendDecoded( const char *aText, size_t aSize, string &aBinString, TEncodingTypes aEncoding ); // generate RFC2822-style address specificiation // - Common Name will be quoted // - recipient will be put in angle brackets void makeRFC2822AddrSpec( cAppCharP aCommonName, cAppCharP aRecipient, string &aRFCAddr ); // Parse RFC2822-style address specificiation // - aName will receive name and all (possible) comments // - aRecipient will receive the (first, in case of a group) email address cAppCharP parseRFC2822AddrSpec( cAppCharP aText, string &aName, string &aRecipient ); // RFC2047 encoding // append internal UTF8 string as RFC2047 style encoding const char *appendUTF8AsRFC2047( const char *aText, string &aString ); // parse character string from RFC2047 style encoding to UTF8 internal string const char *appendRFC2047AsUTF8( const char *aRFC2047, stringSize aSize, // max number of chars to look at string &aString, TLineEndModes aLEM=lem_none ); // charset conversion functions // generic bintree-based conversion functions typedef uInt16 treeval_t; typedef struct { treeval_t minkey; treeval_t maxkey; treeval_t linksstart; treeval_t linksend; size_t numelems; treeval_t *elements; } TConvFlatTree; #ifdef BINTREE_GENERATOR typedef struct TBinTreeNode { treeval_t key; struct TBinTreeNode *nextHigher; struct TBinTreeNode *nextLowerOrEqual; treeval_t value; // valid only if links are both NULL } TBinTreeNode; // add a key/value pair to the binary tree void addToBinTree(TBinTreeNode *&aBinTree, treeval_t aMinKey, treeval_t aMaxKey, treeval_t aKey, treeval_t aValue); // dispose a bintree void disposeBinTree(TBinTreeNode *&aBinTree); // search directly in bintree treeval_t searchBintree(TBinTreeNode *aBinTree, treeval_t aKey, treeval_t aUndefValue, treeval_t aMinKey, treeval_t aMaxKey); // make a flat form representation of the bintree in a one-dimensional array bool flatBinTree( TBinTreeNode *aBinTree, TConvFlatTree &aFlatTree, size_t aArrSize, treeval_t aMinKey, treeval_t aMaxKey, treeval_t aLinksStart, treeval_t aLinksEnd ); #endif // search flattened bintree for a specific key value treeval_t searchFlatBintree(const TConvFlatTree &aFlatTree, treeval_t aKey, treeval_t aUndefValue); // add byte char as UTF8 to string value and apply charset translation if needed //void appendCharAsUTF8(char c, string &aVal, TCharSets aCharSet); uInt16 appendCharsAsUTF8(const char *aChars, string &aVal, TCharSets aCharSet, uInt16 aNumChars=1); // add string as UTF8 to value and apply charset translation if needed // - if aLineEndChar is specified, occurrence of this will be replaced // by '\n', occurrence of non matching LF/CR will be ignored void appendStringAsUTF8( const char *s, string &aVal, TCharSets aCharSet, TLineEndModes aLEM=lem_cstr, bool aAllowFilemakerCR=false // if set, 0x0B is interpreted as line end as well ); // add UTF8 string to value in custom charset // - aLEM specifies line ends to be used // - aQuotingMode specifies what quoting (for ODBC literals for example) should be used // - output is clipped after aMaxBytes bytes (if not 0) // - returns true if all input could be converted, false if output is clipped bool appendUTF8ToString( cAppCharP aUTF8, string &aVal, TCharSets aCharSet, TLineEndModes aLEM=lem_none, TQuotingModes aQuotingMode=qm_none, size_t aMaxBytes=0 ); // same, but output string is cleared first bool storeUTF8ToString( cAppCharP aUTF8, string &aVal, TCharSets aCharSet, TLineEndModes aLEM=lem_none, TQuotingModes aQuotingMode=qm_none, size_t aMaxBytes=0 ); // convert UTF8 to UCS4 // - returns pointer to next char // - returns UCS4=0 on error (no char, bad sequence, sequence not complete) const char *UTF8toUCS4(const char *aUTF8, uInt32 &aUCS4); // convert UCS4 to UTF8 (0 char is not allowed and will be ignored!) void UCS4toUTF8(uInt32 aUCS4, string &aUTF8); // convert UTF-16 to UCS4 // - returns pointer to next char // - returns UCS4=0 on error (no char, bad sequence, sequence not complete) const uInt16 *UTF16toUCS4(const uInt16 *aUTF16P, uInt32 &aUCS4); // convert UCS4 to UTF-16 // - returns 0 for UNICODE range UCS4 and first word of UTF-16 for non UNICODE uInt16 UCS4toUTF16(uInt32 aUCS4, uInt16 &aUTF16); // add UTF8 string as UTF-16 byte stream to 8-bit string // - if aLEM is not lem_none, occurrence of any type of Linefeeds // (LF,CR,CRLF and even CRCRLF) in input string will be // replaced by the specified line end type // - output is clipped after ByteString reaches aMaxBytes size (if not 0), = approx half as many Unicode chars // - returns true if all input could be converted, false if output is clipped bool appendUTF8ToUTF16ByteString( cAppCharP aUTF8, string &aUTF16ByteString, bool aBigEndian, TLineEndModes aLEM=lem_none, uInt32 aMaxBytes=0 ); // add UTF16 byte string as UTF8 to value void appendUTF16AsUTF8( const uInt16 *aUTF16, uInt32 aNumUTF16Chars, bool aBigEndian, string &aVal, bool aConvertLineEnds=false, bool aAllowFilemakerCR=false ); // MD5 and B64 given string void MD5B64(const char *aString, sInt32 aLen, string &aMD5B64); // format as Timestamp text, usually for logfiles void StringObjTimestamp(string &aStringObj, lineartime_t aTimer); // format as hex byte string void StringObjHexString(string &aStringObj, const uInt8 *aBinary, uInt32 aBinSz); // add (already encoded!) CGI to existing URL string bool addCGItoString(string &aStringObj, cAppCharP aCGI, bool noduplicate=true); // encode string for being used as a CGI key/value element string encodeForCGI(cAppCharP aCGI); // Count bits int countbits(uInt32 aMask); // make uppercase void StringUpper(string &aString); // make lowercase void StringLower(string &aString); // Substitute occurences of pattern with replacement in string void StringSubst( string &aString, const char *aPattern, const string &aReplacement, sInt32 aPatternLen, TCharSets aCharSet, TLineEndModes aLEM, TQuotingModes aQuotingMode ); void StringSubst( string &aString, const char *aPattern, const char *aReplacement, sInt32 aPatternLen, sInt32 aReplacementLen, TCharSets aCharSet=chs_unknown, TLineEndModes aLEM=lem_none, TQuotingModes aQuotingMode=qm_none ); void StringSubst(string &aString, const char *aPattern, const string &aReplacement, sInt32 aPatternLen=-1); void StringSubst(string &aString, const char *aPattern, sInt32 aNumber, sInt32 aPatternLen=-1); /* subst regexp i\=0\; *while\(\(i\=([^.]+)\.find\(\"([^"]+)\",i\)\)\!\=string::npos\) *\{ *[^.]+\.replace\(i,([0-9]+),(.+)\)\; i\+\=.*$ StringSubst(\1,"\2",\4,\3); */ // helper macro for allocation of SyncML Toolkit structures from C++ code #define SML_NEW(ty) ((ty*) _smlMalloc(sizeof(ty))) #define SML_FREE(m) smlLibFree(m) // allocate memory via SyncML toolkit allocation function, but throw // exception if it fails. Used by SML void *_smlMalloc(MemSize_t size); // copy PCdata contents into std::string object void smlPCDataToStringObj(const SmlPcdataPtr_t aPcdataP, string &aStringObj); // returns pointer to PCdata contents or null string. If aSizeP!=NULL, length will be stored in *aSize const char *smlPCDataToCharP(const SmlPcdataPtr_t aPcdata, stringSize *aSizeP=NULL); // returns pointer to PCdata contents if existing, NULL otherwise. // If aSizeP!=NULL, length will be stored in *aSize const char *smlPCDataOptToCharP(const SmlPcdataPtr_t aPcdataP, stringSize *aSizeP=NULL); // returns item string or empty string (NEVER NULL) const char *smlItemDataToCharP(const SmlItemPtr_t aItemP); // returns first item string or empty string (NEVER NULL) const char *smlFirstItemDataToCharP(const SmlItemListPtr_t aItemListP); // split Hostname into address and port parts void splitHostname(const char *aHost,string *aAddr,string *aPort); // split URL into protocol, hostname, document name and auth-info (user, password); // none of the strings are url-decoded, do that as needed void splitURL(const char *aURI,string *aProtocol,string *aHost,string *aDoc,string *aUser, string *aPasswd, string *aPort, string *aQuery); // in-place decoding of %XX, NULL pointer allowed void urlDecode(string *str); // in-place encoding of unsafe characters as %XX, NULL pointer allowed void urlEncode(string *str); // returns error code made ready for SyncML sending (that is, remove offset // of 10000 if present, and make generic error 500 for non-SyncML errors, // and return LOCERR_OK as 200) localstatus syncmlError(localstatus aErr); // returns error code made local (that is, offset by 10000 in case aErr is a // SyncML status code <10000, and convert 200 into LOCERR_OK) localstatus localError(localstatus aErr); // returns pure relative URI, if specified relative or absolute to // optionally given server URI const char *relativeURI(const char *aURI,const char *aServerURI=NULL); // returns pointer to source or target LocURI const char *smlSrcTargLocURIToCharP(const SmlTargetPtr_t aSrcTargP); // returns pointer to source or target LocName const char *smlSrcTargLocNameToCharP(const SmlTargetPtr_t aSrcTargP); // returns DevInf pointer if any in specified PCData, NULL otherwise SmlDevInfDevInfPtr_t smlPCDataToDevInfP(const SmlPcdataPtr_t aPCDataP); // returns MetInf pointer if any in specified PCData, NULL otherwise SmlMetInfMetInfPtr_t smlPCDataToMetInfP(const SmlPcdataPtr_t aPCDataP); // returns true on successful conversion of PCData string to format bool smlPCDataToFormat(const SmlPcdataPtr_t aPCDataP, TFmtTypes &aFmt); // returns type from meta const char *smlMetaTypeToCharP(SmlMetInfMetInfPtr_t aMetaP); // returns Next Anchor from meta const char *smlMetaNextAnchorToCharP(SmlMetInfMetInfPtr_t aMetaP); // returns Last Anchor from meta const char *smlMetaLastAnchorToCharP(SmlMetInfMetInfPtr_t aMetaP); // build Meta anchor SmlPcdataPtr_t newMetaAnchor(const char *aNextAnchor, const char *aLastAnchor=NULL); // build Meta type SmlPcdataPtr_t newMetaType(const char *aMetaType); // build empty Meta SmlPcdataPtr_t newMeta(void); // copy meta from existing meta (for data items only // anchor, mem, emi, maxobjsize, nonce are not copied!) SmlPcdataPtr_t copyMeta(SmlPcdataPtr_t aOldMetaP); // add an item to an item list SmlItemListPtr_t *addItemToList( SmlItemPtr_t aItemP, // existing item data structure, ownership is passed to list SmlItemListPtr_t *aItemListPP // adress of pointer to existing item list or NULL ); // add a CTData item to a CTDataList SmlDevInfCTDataListPtr_t *addCTDataToList( SmlDevInfCTDataPtr_t aCTDataP, // existing CTData item data structure, ownership is passed to list SmlDevInfCTDataListPtr_t *aCTDataListPP // adress of pointer to existing item list or NULL ); // add a CTDataProp item to a CTDataPropList SmlDevInfCTDataPropListPtr_t *addCTDataPropToList( SmlDevInfCTDataPropPtr_t aCTDataPropP, // existing CTDataProp item data structure, ownership is passed to list SmlDevInfCTDataPropListPtr_t *aCTDataPropListPP // adress of pointer to existing item list or NULL ); // add a CTData describing a property (as returned by newDevInfCTData()) // as a new property without parameters to a CTDataPropList SmlDevInfCTDataPropListPtr_t *addNewPropToList( SmlDevInfCTDataPtr_t aPropCTData, // CTData describing property SmlDevInfCTDataPropListPtr_t *aCTDataPropListPP // adress of pointer to existing item list or NULL ); // add PCData element to a PCData list SmlPcdataListPtr_t *addPCDataToList( SmlPcdataPtr_t aPCDataP, // Existing PCData element to be added, ownership is passed to list SmlPcdataListPtr_t *aPCDataListPP // adress of pointer to existing PCData list or NULL ); // add PCData string to a PCData list SmlPcdataListPtr_t *addPCDataStringToList( const char *aString, // String to be added SmlPcdataListPtr_t *aPCDataListPP // adress of pointer to existing PCData list or NULL ); // create new optional location (source or target) SmlSourcePtr_t newOptLocation( const char *aLocURI, const char *aLocName=NULL ); // create new location (source or target) SmlSourcePtr_t newLocation( const char *aLocURI, const char *aLocName=NULL ); // create new empty Item SmlItemPtr_t newItem(void); // create new Item with string-type data SmlItemPtr_t newStringDataItem( const char *aString ); // create format PCData SmlPcdataPtr_t newPCDataFormat( TFmtTypes aFmtType, bool aShowDefault ); // create new string-type PCData, if NULL or empty string is passed for aData, // NULL is returned (optional info not there) SmlPcdataPtr_t newPCDataFormatted( const uInt8 *aData, // data sInt32 aLength, // length of data, if<0 then string length is calculated TFmtTypes aEncType, // encoding bool aNeedsOpaque // set opaque needed (string that could confuse XML parsing or even binary) ); // create new string-type PCData, if NULL is passed for aString, NULL is returned (optional info not there) SmlPcdataPtr_t newPCDataOptString( const char *aString, sInt32 aLength=-1 // length of string, if<0 then length is calculated ); // create new string-type PCData, if NULL is passed for aString, // NULL is returned (optional info not there) // if empty string is passed, PCData with empty contents will be created SmlPcdataPtr_t newPCDataOptEmptyString( const char *aString, sInt32 aLength=-1 // length of string, if<0 then length is calculated ); // create new string-type PCData, if NULL is passed for aString, an empty string is created SmlPcdataPtr_t newPCDataString( const char *aString, sInt32 aLength=-1 // length of string, if<0 then length is calculate ); // create new PCData, aOpaque can be used to generate non-string data SmlPcdataPtr_t newPCDataStringX( const uInt8 *aString, bool aOpaque=false, // if set, an opaque method (OPAQUE or CDATA) is used sInt32 aLength=-1 // length of string, if<0 then length is calculate ); // create new string-type PCData from C++ string SmlPcdataPtr_t newPCDataString(const string &aString); // create new decimal string representation of long as PCData SmlPcdataPtr_t newPCDataLong(sInt32 aLong); // returns true on successful conversion of PCData string to long bool smlPCDataToLong(const SmlPcdataPtr_t aPCDataP, sInt32 &aLong); bool smlPCDataToULong(const SmlPcdataPtr_t aPCDataP, uInt32 &aLong); // create challenge of requested type SmlChalPtr_t newChallenge(TAuthTypes aAuthType, const string &aNextNonce, bool aBinaryAllowed); // Nonce generator allowing last-session nonce to be correctly re-generated in next session void generateNonce(string &aNonce, const char *aDevStaticString, sInt32 aSessionStaticID); // create new property or param descriptor for CTCap SmlDevInfCTDataPtr_t newDevInfCTData(cAppCharP aName,uInt32 aSize=0, bool aNoTruncate=false, uInt32 aMaxOccur=0, cAppCharP aDataType=NULL); // frees prototype element and sets calling pointer to NULL void FreeProtoElement(void * &aVoidP); // macro to overcome pointer reference conversion constraints #ifdef PREFER_MACROS #define FREEPROTOELEMENT(p) FreeProtoElement((void *&)p) #else template void FREEPROTOELEMENT(T *&p) { smlFreeProtoElement(static_cast(p)); p = NULL; } #endif } // namespace sysync #endif // eof syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/timeutil.cpp0000644000373300037200000000703312424517753027334 0ustar00nightlyallusers00000000000000/* * File: timeutil.cpp * * Authors: Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * ISO8601 / Lineartime functions * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * */ //#include "target_options.h" #include "sync_include.h" #if defined LINUX || defined MACOSX // problems with "trunc" #define _ISOC99_SOURCE 1 #include #endif #ifdef _MSC_VER static int trunc( double d ) { return (int)( d-0.5 ); } #endif #ifdef MACOSX #include #endif #include #include "timeutil.h" #include "stringutil.h" using namespace std; #ifdef __cplusplus namespace sysync { #endif typedef struct tm struct_tm; typedef sInt32 lineardate_t; const lineartime_t linearDateToTimeFactor= (secondToLinearTimeFactor*60*60*24); // offset between algorithm base and 1970-01-01 const lineartime_t UnixToLineartimeOffset= 2440588*linearDateToTimeFactor; // static version of time zone calculation // should be replaced by a full functioning version, when used static lineartime_t zoneOffsetAsSeconds() { return (1)*60*60; // for CET //return (1+1)*60*60; // for CEST } // zoneOffsetAsSeconds // get system current date/time // this very simple implementation is rather local time than UTC lineartime_t utcNowAsLineartime() { lineartime_t secs= time(NULL) - zoneOffsetAsSeconds(); return secs*secondToLinearTimeFactor + UnixToLineartimeOffset; } // utcNowAsLineartime static void lineardate2date( lineardate_t julDat,sInt16 *year, sInt16 *month, sInt16 *day ) { double C,E; sInt32 B,D,F; if (julDat<2299161) { B=0; C=julDat+1524; } else { B= (sInt32)(trunc((julDat-1867216.25)/36524.25)); C=julDat+(B-trunc((double)B/4))+1525.0; } // if D=(sInt32)(trunc((C-122.1)/365.25)); E= 365.0*D+trunc((double)D/4); F=(sInt32)(trunc((C-E)/30.6001)); // return date *day = (sInt16)(trunc(C-E+0.5)-trunc(30.6001*F)); *month= (sInt16)(F-1-12*trunc((double)F/14)); *year = (sInt16)(D-4715-trunc((double)(7+*month)/10.0)); } // lineardate2date // convert lineartime to h,m,s,ms static void lineartime2time( lineartime_t aTim, sInt16 *hour, sInt16 *min, sInt16 *sec, sInt16 *ms ) { // we have sub-seconds *ms = aTim % secondToLinearTimeFactor; aTim /= secondToLinearTimeFactor; *sec = aTim % 60; aTim /= 60; *min = aTim % 60; aTim /= 60; *hour= aTim % 24; // to make sure we don't convert date part } // lineartime2time // convert struct tm to linear time (in milliseconds) static void lineartime2tm( lineartime_t aLt, struct_tm *tim ) { sInt16 y,mo,d, h,m,s, ms; // date lineardate2date( aLt/linearDateToTimeFactor, &y,&mo,&d ); tim->tm_year= y-1900; tim->tm_mon = mo-1; tim->tm_mday= d; // time lineartime2time( aLt, &h,&m,&s, &ms ); tim->tm_hour= h; tim->tm_min = m; tim->tm_sec = s; } // tm2lineartime // convert UTC lineartimestamp to ISO8601 string representation // (and return how long expired) sInt32 timeStampToISO8601( lineartime_t aTimeStamp, string &aString, bool dateOnly ) { aString.erase(); if (aTimeStamp==0) return 0; struct_tm t; lineartime2tm( aTimeStamp,&t ); // format as ISO8601 UTC StringObjAppendPrintf ( aString, "%04d%02d%02d", t.tm_year+1900, t.tm_mon+1, t.tm_mday ); if (!dateOnly) { StringObjAppendPrintf( aString, "T%02hd%02hd%02hd", t.tm_hour, t.tm_min, t.tm_sec ); aString+= 'Z'; // add UTC designator } // if return 0; } // timeStampToISO8601 #ifdef __cplusplus } // namespace #endif /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/Sources/timeutil.h0000644000373300037200000000167612424517753027010 0ustar00nightlyallusers00000000000000/* * File: timeutil.h * * Authors: Lukas Zeller (luz@plan44.ch) * Beat Forster (bfo@synthesis.ch) * * ISO8601 / Lineartime functions * * Copyright (c) 2001-2011 by Synthesis AG + plan44.ch * */ #ifndef TIMEUTIL_H #define TIMEUTIL_H #include "sync_dbapidef.h" #ifdef __cplusplus #include using namespace std; #endif #ifdef __cplusplus namespace sysync { #endif #if defined MACOSX || defined _WIN32 || defined LINUX typedef sInt64 lineartime_t; #else #error unknown platform #endif #ifdef __cplusplus const lineartime_t secondToLinearTimeFactor = 1000; // unit is milliseconds // get system current date/time lineartime_t utcNowAsLineartime(); // convert timestamp to ISO8601 string representation sInt32 timeStampToISO8601( lineartime_t aTimeStamp, string &aString, bool dateOnly= false ); #endif #ifdef __cplusplus } // namespace #endif #endif /* TIMEUTIL_H */ /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/0000755000373300037200000000000012424517753024776 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/README0000644000373300037200000000227112424517753025660 0ustar00nightlyallusers00000000000000The sample configs contain common elements (datatypes, scripts, remote rules, debug settings) which are maintained as separate files in the corresponding directories. When modifying those common elements, run "update-samples.pl" in this directory to update the sample configs. The complete samples are under version control for several reasons: 1. avoid dependency on Perl unless common elements need to be updated 2. effect of changes on complete config show up in patches 3. the file layout and unshared parts ( and ) are determined by the sample configs The naming of common elements determines the order in which they get inserted. Files not ending in .xml are ignored. Elements that only apply to a client or server are stored in the corresponding sub directories, while the shared elements are in the "debug/scripting/datatypes/remoterules". It is a somewhat subjective choice which elements are stored in one file and which ones are split up. The three elements of a datatype definition (field list, profile, datatype) where split up because there might be multiple different profiles using the same field list and some users of these files might want to replace the default one. syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/0000755000373300037200000000000012424517753026774 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/00vcard-fieldlist.xml0000644000373300037200000000720212424517753032733 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/01vcard-profile.xml0000644000373300037200000001251212424517753032415 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/02vcard-types.xml0000644000373300037200000000060312424517753032120 0ustar00nightlyallusers00000000000000 2.1 3.0 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/10calendar-fieldlist.xml0000644000373300037200000000634412424517753033414 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/11calendar-profile.xml0000644000373300037200000004724612424517753033104 0ustar00nightlyallusers00000000000000 current olson syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/12calendar-types.xml0000644000373300037200000000145112424517753032575 0ustar00nightlyallusers00000000000000 1.0 2.0 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/20note-fieldlist.xml0000644000373300037200000000047712424517753032612 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/21note-profile.xml0000644000373300037200000000064112424517753032265 0ustar00nightlyallusers00000000000000 1 false true SUBJECT 0 false true syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/22notes-types.xml0000644000373300037200000000053212424517753032154 0ustar00nightlyallusers00000000000000 text/plain 1.0 text/plain 1.1 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/30bookmark-fieldlist.xml0000644000373300037200000000134212424517753033443 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/31bookmark-profile.xml0000644000373300037200000000176012424517753033131 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/32bookmark-type.xml0000644000373300037200000000040712424517753032450 0ustar00nightlyallusers00000000000000 text/x-vbookmark 1.0 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/0000755000373300037200000000000012424517753030302 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/40email-fieldlist.xml0000644000373300037200000000262412424517753034240 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/41email-profile.xml0000644000373300037200000000553612424517753033727 0ustar00nightlyallusers00000000000000 true 100 ATT_COUNT ATT_MIMETYPES ATT_CONTENTS ATT_SIZES ATT_NAMES LIMIT From: rfc2047 true FROM To: rfc2047 true TO Cc: rfc2047 true CC Bcc: rfc2047 true BCC Reply-To: rfc2047 true Subject: rfc2047 true SUBJECT X-Priority: true date Date: true Status: true X-Sync-Parent-Folder: true X-Sync-Message-Read: true X-Sync-Lastmodified: true body 0 false true syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/42email-type-zipped.xml0000644000373300037200000000273112424517753034534 0ustar00nightlyallusers00000000000000 application/x-zip-message 1.1 yes yes 9 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/42email-type.xml0000644000373300037200000000135412424517753033243 0ustar00nightlyallusers00000000000000 text/message 1.0 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/43email-sonyericsson.xml0000644000373300037200000000140112424517753035012 0ustar00nightlyallusers00000000000000 message/rfc822 1.0 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/datatypes/server/44email-nokia9500.xml0000644000373300037200000001172012424517753033701 0ustar00nightlyallusers00000000000000 message/x-rfc822 1.0 SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); } // make sure we never overwrite a body in the inbox BODY = UNASSIGNED; // delete always wins over replace in inbox (to avoid adds to inbox) DELETEWINS(); } } } else if (UPPERCASE(FOLDER)=="OUTBOX") { // never try to change something in outbox IGNOREUPDATE(); if (SYNCOP()!="delete") { // - date of mail is NOW, set it such that a correct date is written to the DB MAILDATE = DBNOW(); // MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted // - echo item as delete (this causes that it is moved to the "sent" folder in the 9500) ECHOITEM("delete"); } CONFLICTSTRATEGY("client-wins"); } else { // Other folder // - silently discard incoming item for other folder than the above // except if it is a delete if (SYNCOP()!="delete") REJECTITEM(0); } ]]> =STARTDATE(); RETURN PASSES; ]]> syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/debug/0000755000373300037200000000000012424517753026064 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/debug/00default.xml0000644000373300037200000000631412424517753030376 0ustar00nightlyallusers00000000000000 buffered yes html auto yes no yes separate no no no no syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/0000755000373300037200000000000012424517753027344 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/0000755000373300037200000000000012424517753030652 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/00_t39m.xml0000644000373300037200000000047612424517753032476 0ustar00nightlyallusers00000000000000 Ericsson R1A yes ANSI Ericsson T39m syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/01_t68.xml0000644000373300037200000000047312424517753032321 0ustar00nightlyallusers00000000000000 Ericsson R1B yes ANSI Ericsson T68 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/02_V3.xml0000644000373300037200000000066312424517753032172 0ustar00nightlyallusers00000000000000 Motorola* V3 yes yes yes ANSI ANSI Motorola V3 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/03_V3i.xml0000644000373300037200000000061712424517753032343 0ustar00nightlyallusers00000000000000 Motorola* V3i yes yes yes ANSI Motorola V3i syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/04_6230.xml0000644000373300037200000000041112424517753032265 0ustar00nightlyallusers00000000000000 NOKIA 6230 yes yes Nokia 6230 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/05_9210.xml0000644000373300037200000000052712424517753032277 0ustar00nightlyallusers00000000000000 NOKIA 9210 yes Nokia 9210 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/06_9210i.xml0000644000373300037200000000053112424517753032444 0ustar00nightlyallusers00000000000000 NOKIA 9210i yes Nokia 9210 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/07_3220.xml0000644000373300037200000000061412424517753032271 0ustar00nightlyallusers00000000000000 NOKIA 3220 yes yes Nokia 3220 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/08_3230.xml0000644000373300037200000000061412424517753032273 0ustar00nightlyallusers00000000000000 NOKIA 3230 yes yes Nokia 3230 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/09_3600.xml0000644000373300037200000000061412424517753032275 0ustar00nightlyallusers00000000000000 NOKIA 3600 yes yes Nokia 3600 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/10_3620.xml0000644000373300037200000000061412424517753032267 0ustar00nightlyallusers00000000000000 NOKIA 3620 yes yes Nokia 3620 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/11_3650.xml0000644000373300037200000000061412424517753032273 0ustar00nightlyallusers00000000000000 NOKIA 3650 yes yes Nokia 3650 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/12_3660.xml0000644000373300037200000000061412424517753032275 0ustar00nightlyallusers00000000000000 NOKIA 3660 yes yes Nokia 3660 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/13_6260.xml0000644000373300037200000000061412424517753032275 0ustar00nightlyallusers00000000000000 NOKIA 6260 yes yes Nokia 6260 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/14_6600.xml0000644000373300037200000000061412424517753032274 0ustar00nightlyallusers00000000000000 NOKIA 6600 yes yes Nokia 6600 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/15_6620.xml0000644000373300037200000000061412424517753032277 0ustar00nightlyallusers00000000000000 NOKIA 6620 yes yes Nokia 6620 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/16_6630.xml0000644000373300037200000000061412424517753032301 0ustar00nightlyallusers00000000000000 NOKIA 6630 yes yes Nokia 6630 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/17_6670.xml0000644000373300037200000000061412424517753032306 0ustar00nightlyallusers00000000000000 NOKIA 6670 yes yes Nokia 6670 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/18_7250.xml0000644000373300037200000000061412424517753032302 0ustar00nightlyallusers00000000000000 NOKIA 7250 yes yes Nokia 7250 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/19_7250i.xml0000644000373300037200000000061712424517753032457 0ustar00nightlyallusers00000000000000 NOKIA 7250i yes yes Nokia 7250i syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/20_7260.xml0000644000373300037200000000061412424517753032274 0ustar00nightlyallusers00000000000000 NOKIA 7260 yes yes Nokia 7260 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/21_7610.xml0000644000373300037200000000061412424517753032274 0ustar00nightlyallusers00000000000000 NOKIA 7610 yes yes Nokia 7610 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/22_7650.xml0000644000373300037200000000061412424517753032301 0ustar00nightlyallusers00000000000000 NOKIA 7650 yes yes Nokia 7650 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/23_N-Gage.xml0000644000373300037200000000062212424517753032736 0ustar00nightlyallusers00000000000000 NOKIA N-Gage yes yes Nokia N-Gage syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/24_N-Gage_QD.xml0000644000373300037200000000063312424517753033325 0ustar00nightlyallusers00000000000000 NOKIA N-Gage QD yes yes Nokia N-Gage QD syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/25_9300.xml0000644000373300037200000000065112424517753032277 0ustar00nightlyallusers00000000000000 NOKIA 9300 yes yes Nokia 9300 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/26_9500.xml0000644000373300037200000000065112424517753032302 0ustar00nightlyallusers00000000000000 NOKIA 9500 yes yes Nokia 9500 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/27_E90.xml0000644000373300037200000000053612424517753032245 0ustar00nightlyallusers00000000000000 NOKIA E90 yes Nokia E90 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/28_X.xml0000644000373300037200000000060312424517753032113 0ustar00nightlyallusers00000000000000 Sendo X yes yes Sendo X syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/29_SX1.xml0000644000373300037200000000100112424517753032311 0ustar00nightlyallusers00000000000000 SIEMENS SX1 yes yes yes Siemens SX1 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/30_M55.xml0000644000373300037200000000041212424517753032241 0ustar00nightlyallusers00000000000000 SIEMENS M55 yes yes Siemens M55 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/31_SL55.xml0000644000373300037200000000041512424517753032367 0ustar00nightlyallusers00000000000000 SIEMENS SL55 yes yes Siemens SL55 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/32_S55.xml0000644000373300037200000000041212424517753032251 0ustar00nightlyallusers00000000000000 SIEMENS S55 yes yes Siemens S55 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/33_S65.xml0000644000373300037200000000041212424517753032253 0ustar00nightlyallusers00000000000000 SIEMENS S65 yes yes Siemens S65 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/34_SL65.xml0000644000373300037200000000041512424517753032373 0ustar00nightlyallusers00000000000000 SIEMENS SL65 yes yes Siemens SL65 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/35_K700.xml0000644000373300037200000000072712424517753032332 0ustar00nightlyallusers00000000000000 SonyEricsson SEMC Phone R3B yes SonyEricsson K700 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/36_T610_T630.xml0000644000373300037200000000210712424517753033052 0ustar00nightlyallusers00000000000000 SonyEricsson R2B yes SonyEricsson T610/T630 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/37_M600i.xml0000644000373300037200000000255312424517753032505 0ustar00nightlyallusers00000000000000 Sony Ericsson M600i no yes SonyEricsson M600i syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/38_P800.xml0000644000373300037200000000255012424517753032337 0ustar00nightlyallusers00000000000000 Sony Ericsson P800 no yes SonyEricsson P800 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/39_P900.xml0000644000373300037200000000255012424517753032341 0ustar00nightlyallusers00000000000000 Sony Ericsson P900 no yes SonyEricsson P900 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/40_P910.xml0000644000373300037200000000255512424517753032337 0ustar00nightlyallusers00000000000000 Sony Ericsson P910 no yes SonyEricsson P910 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/41_P910i.xml0000644000373300037200000000256012424517753032505 0ustar00nightlyallusers00000000000000 Sony Ericsson P910i no yes SonyEricsson P910i syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/42_P990i.xml0000644000373300037200000000113212424517753032510 0ustar00nightlyallusers00000000000000 Sony Ericsson P990i no yes SonyEricsson P990i syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/43_t68i.xml0000644000373300037200000000051212424517753032472 0ustar00nightlyallusers00000000000000 SonyEricsson R2A yes ANSI SonyEricsson T68i syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/44_Funambol_Outlook.xml0000644000373300037200000000051412424517753035162 0ustar00nightlyallusers00000000000000 Funambol Outlook Sync Client yes Funambol Outlook Sync Client syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/remoterules/server/45_SyncJe_Outlook.xml0000644000373300037200000000051112424517753034610 0ustar00nightlyallusers00000000000000 SyncJe Outlook Edition yes NextHaus SyncJe Outlook Client syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/0000755000373300037200000000000012424517753027000 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/10newuid.xml0000644000373300037200000000030212424517753031151 0ustar00nightlyallusers00000000000000 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/11calendar.xml0000644000373300037200000001232412424517753031437 0ustar00nightlyallusers00000000000000 0) { // DTSTART and DTEND represent allday event, make them date-only values // - convert start to user zone (or floating) so it represents midnight DTSTART = CONVERTTOUSERZONE(DTSTART); MAKEALLDAY(DTSTART,DTEND,i); } else { // iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday if (ISDATEONLY(DTSTART)) { // reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers) MAKEALLDAY(DTSTART,DTEND,i); } } // - shape attendees (and make sure ATTENDEES[] is assigned even for empty email addresses) i=0; while(i0) { DUE = DATEONLY(DUE); } } // Common alarm handling // - handle relative alarm time (as possible with VALARM TRIGGER) if (ISDURATION(ALARM_TIME)) { if (ALARM_REL==2) ts = DTEND; // relative to end else { if (ISEVENT) ts = DTSTART; // relative to start for events else ts = DUE; // relative to due for todos } // for now, make ALARM user(=system) zone in all cases ALARM_TIME = CONVERTTOUSERZONE(POINTINTIME(ts),TRUE) + ALARM_TIME; } ]]> syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/client/0000755000373300037200000000000012424517753030256 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/client/00timeout.xml0000644000373300037200000000004212424517753032622 0ustar00nightlyallusers00000000000000 5 syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/server/0000755000373300037200000000000012424517753030306 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/scripting/server/12email.xml0000644000373300037200000001414612424517753032270 0ustar00nightlyallusers00000000000000 SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); } // make sure we never overwrite a body in the inbox BODY = UNASSIGNED; // delete always wins over replace in inbox (to avoid adds to inbox) DELETEWINS(); } } } else if (UPPERCASE(FOLDER)=="OUTBOX") { // never try to change something in outbox IGNOREUPDATE(); if (SYNCOP()!="delete") { // - date of mail is NOW, set it such that a correct date is written to the DB MAILDATE = DBNOW(); // MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted // - echo item as replace (to force-move it to the sent folder) ECHOITEM("replace"); } CONFLICTSTRATEGY("client-wins"); } else if (UPPERCASE(FOLDER)=="SENT") { // never try to change something in sent folder IGNOREUPDATE(); // Server has precedence in case of conflicts CONFLICTSTRATEGY("server-wins"); // Implement reload capability for sent items as well if (SLOWSYNC()) { // do not add new sent items to the server in slowsync PREVENTADD(); // causes extra sent items on the client to be deleted } else { // make sure that existing server item will conflict with this item if (SYNCOP()=="replace") { if (LIMIT!=EMPTY && (LIMIT<0 || LIMIT>SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); REJECTITEM(200); // but do not process the item further } else { // silently ignore other types of changes REJECTITEM(200); } // make sure we never overwrite a body in the sent folder BODY = UNASSIGNED; } } } else { // Other folder // - silently discard incoming item for other folder than the above // except if it is a delete if (SYNCOP()!="delete") REJECTITEM(0); } ]]> =V1.0.8.21 IF (LIMIT==EMPTY) LIMIT = SIZELIMIT(); // if none set already, use default for this item (=default of datastore, if not SETSIZELIMIT() called before for this item generation) } // set limit for item generator if (LIMIT!=EMPTY) SETSIZELIMIT(LIMIT); ]]> =STARTDATE(); RETURN PASSES; ]]> syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/sunbird_client.xml0000755000373300037200000010353612424517753030537 0ustar00nightlyallusers00000000000000 Sunbird/Lightning 0.5 client demo using SQLite direct access $(logpath) flush yes html yes no yes separate yes no no no true 5 1.0 $(prefs_path)\synthesis.ch\syncml_client_$(targetdb) UTF-8 unix $(logpath)\$(targetdb)_synclog.txt $(logpath)/sunbirdsynclog.txt yes 20 1001 $(mozillaprofile)\storage.sdb $(prefs_path)/Sunbird/Profiles/$(sunbirdprofile)/storage.sdb unixtime_us UTF-8 unix UTC yes no yes SELECT id || coalesce(recurrence_id,'') as fullid,last_modified FROM cal_events %WF no SELECT %N FROM cal_events WHERE id || coalesce(recurrence_id,'')='%k' INSERT INTO cal_events (id,last_modified,time_created,%N,cal_id,priority,event_start_tz,event_end_tz) VALUES ('%k',%M,%M,%v,0,0,'/mozilla.org/20070129_1/Africa/Ceuta','/mozilla.org/20070129_1/Africa/Ceuta') UPDATE cal_events SET last_modified=%M,%V WHERE id || coalesce(recurrence_id,'')='%k' DELETE FROM cal_events WHERE id || coalesce(recurrence_id,'')='%k' yes F.KIND:=EVENT yes yes 0) { // all day - make dates span full day (required by SunBird) flags = flags | 0x08; // set allday bit DTSTART = CONVERTTOUSERZONE(DTSTART); // convert non-floating to user zone SETFLOATING(DTSTART); // make floating DTSTART = DATEONLY(DTSTART); // set to beginning of day DTEND = DTSTART + DAYUNITS(i); // make end exact number of days after start } // check for recurrence if (NORMALIZED(RR_FREQ)!=EMPTY) flags = flags | 0x10; // set recurrence bit ]]> 0) RR_FMASK = RR_FMASK | (1<0) { // counting from beginning RR_FMASK = RR_FMASK | (1< syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/syncclient_sample_config.xml0000644000373300037200000015765012424517753032577 0ustar00nightlyallusers00000000000000 Synthesis SyncML Client Engine 3.4 sample config buffered yes html auto yes no yes separate no no no no true 5 0) { // DTSTART and DTEND represent allday event, make them date-only values // - convert start to user zone (or floating) so it represents midnight DTSTART = CONVERTTOUSERZONE(DTSTART); MAKEALLDAY(DTSTART,DTEND,i); } else { // iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday if (ISDATEONLY(DTSTART)) { // reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers) MAKEALLDAY(DTSTART,DTEND,i); } } // - shape attendees (and make sure ATTENDEES[] is assigned even for empty email addresses) i=0; while(i0) { DUE = DATEONLY(DUE); } } // Common alarm handling // - handle relative alarm time (as possible with VALARM TRIGGER) if (ISDURATION(ALARM_TIME)) { if (ALARM_REL==2) ts = DTEND; // relative to end else { if (ISEVENT) ts = DTSTART; // relative to start for events else ts = DUE; // relative to due for todos } // for now, make ALARM user(=system) zone in all cases ALARM_TIME = CONVERTTOUSERZONE(POINTINTIME(ts),TRUE) + ALARM_TIME; } ]]> 2.1 3.0 current olson 1.0 2.0 1 false true SUBJECT 0 false true text/plain 1.0 text/plain 1.1 text/x-vbookmark 1.0 [SDK_textdb] yes yes test test false UTF-8 unix yes 20 [SDK_textdb] yes UTF-8 unix yes yes yes [SDK_textdb] yes UTF-8 unix yes yes yes [SDK_textdb] yes UTF-8 unix yes yes yes [SDK_textdb] yes UTF-8 unix yes yes yes [SDK_textdb] yes UTF-8 unix yes yes yes syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/syncserv_sample_config.xml0000755000373300037200000033110212424517753032265 0ustar00nightlyallusers00000000000000 Synthesis SyncML Server Engine 3.4 sample config buffered yes html auto yes no yes separate no no no no 0) { // DTSTART and DTEND represent allday event, make them date-only values // - convert start to user zone (or floating) so it represents midnight DTSTART = CONVERTTOUSERZONE(DTSTART); MAKEALLDAY(DTSTART,DTEND,i); } else { // iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday if (ISDATEONLY(DTSTART)) { // reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers) MAKEALLDAY(DTSTART,DTEND,i); } } // - shape attendees (and make sure ATTENDEES[] is assigned even for empty email addresses) i=0; while(i0) { DUE = DATEONLY(DUE); } } // Common alarm handling // - handle relative alarm time (as possible with VALARM TRIGGER) if (ISDURATION(ALARM_TIME)) { if (ALARM_REL==2) ts = DTEND; // relative to end else { if (ISEVENT) ts = DTSTART; // relative to start for events else ts = DUE; // relative to due for todos } // for now, make ALARM user(=system) zone in all cases ALARM_TIME = CONVERTTOUSERZONE(POINTINTIME(ts),TRUE) + ALARM_TIME; } ]]> SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); } // make sure we never overwrite a body in the inbox BODY = UNASSIGNED; // delete always wins over replace in inbox (to avoid adds to inbox) DELETEWINS(); } } } else if (UPPERCASE(FOLDER)=="OUTBOX") { // never try to change something in outbox IGNOREUPDATE(); if (SYNCOP()!="delete") { // - date of mail is NOW, set it such that a correct date is written to the DB MAILDATE = DBNOW(); // MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted // - echo item as replace (to force-move it to the sent folder) ECHOITEM("replace"); } CONFLICTSTRATEGY("client-wins"); } else if (UPPERCASE(FOLDER)=="SENT") { // never try to change something in sent folder IGNOREUPDATE(); // Server has precedence in case of conflicts CONFLICTSTRATEGY("server-wins"); // Implement reload capability for sent items as well if (SLOWSYNC()) { // do not add new sent items to the server in slowsync PREVENTADD(); // causes extra sent items on the client to be deleted } else { // make sure that existing server item will conflict with this item if (SYNCOP()=="replace") { if (LIMIT!=EMPTY && (LIMIT<0 || LIMIT>SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); REJECTITEM(200); // but do not process the item further } else { // silently ignore other types of changes REJECTITEM(200); } // make sure we never overwrite a body in the sent folder BODY = UNASSIGNED; } } } else { // Other folder // - silently discard incoming item for other folder than the above // except if it is a delete if (SYNCOP()!="delete") REJECTITEM(0); } ]]> =V1.0.8.21 IF (LIMIT==EMPTY) LIMIT = SIZELIMIT(); // if none set already, use default for this item (=default of datastore, if not SETSIZELIMIT() called before for this item generation) } // set limit for item generator if (LIMIT!=EMPTY) SETSIZELIMIT(LIMIT); ]]> =STARTDATE(); RETURN PASSES; ]]> 2.1 3.0 current olson 1.0 2.0 1 false true SUBJECT 0 false true text/plain 1.0 text/plain 1.1 text/x-vbookmark 1.0 true 100 ATT_COUNT ATT_MIMETYPES ATT_CONTENTS ATT_SIZES ATT_NAMES LIMIT From: rfc2047 true FROM To: rfc2047 true TO Cc: rfc2047 true CC Bcc: rfc2047 true BCC Reply-To: rfc2047 true Subject: rfc2047 true SUBJECT X-Priority: true date Date: true Status: true X-Sync-Parent-Folder: true X-Sync-Message-Read: true X-Sync-Lastmodified: true body 0 false true text/message 1.0 application/x-zip-message 1.1 yes yes 9 message/rfc822 1.0 message/x-rfc822 1.0 SIZELIMIT())) { // force conflict only if this is a reload FORCECONFLICT(); } // make sure we never overwrite a body in the inbox BODY = UNASSIGNED; // delete always wins over replace in inbox (to avoid adds to inbox) DELETEWINS(); } } } else if (UPPERCASE(FOLDER)=="OUTBOX") { // never try to change something in outbox IGNOREUPDATE(); if (SYNCOP()!="delete") { // - date of mail is NOW, set it such that a correct date is written to the DB MAILDATE = DBNOW(); // MAILDATE = (INTEGER)DBNOW() - TIMEUNITS(120); // %%% backdate it 2 mins to make sure it does not get retransmitted // - echo item as delete (this causes that it is moved to the "sent" folder in the 9500) ECHOITEM("delete"); } CONFLICTSTRATEGY("client-wins"); } else { // Other folder // - silently discard incoming item for other folder than the above // except if it is a delete if (SYNCOP()!="delete") REJECTITEM(0); } ]]> =STARTDATE(); RETURN PASSES; ]]> [SDK_textdb] yes yes 42 UTF-8 unix yes 300 md5 md5 yes test test [SDK_textdb] yes 42 no newer-wins duplicate F.SYNCLVL:=10 F.SYNCLVL:=0|F.SYNCLVL*=E F.SYNCLVL:=10 UTF-8 unix SYSTEM yes yes yes [SDK_textdb] yes 42 no newer-wins duplicate F.SYNCLVL:=10 F.SYNCLVL:=0|F.SYNCLVL*=E F.SYNCLVL:=10 UTF-8 unix SYSTEM yes yes yes [SDK_textdb] yes 42 no newer-wins duplicate F.SYNCLVL:=10 F.SYNCLVL:=0|F.SYNCLVL*=E F.SYNCLVL:=10 UTF-8 unix SYSTEM yes yes yes yes yes F.ISEVENT:=1 e F.ISEVENT:=0 t [SDK_textdb] yes 42 no newer-wins duplicate F.SYNCLVL:=10 F.SYNCLVL:=0|F.SYNCLVL*=E F.SYNCLVL:=10 UTF-8 unix SYSTEM yes yes yes [SDK_textdb] yes 42 no newer-wins duplicate F.SYNCLVL:=10 F.SYNCLVL:=0|F.SYNCLVL*=E F.SYNCLVL:=10 UTF-8 unix SYSTEM yes yes yes [SDK_textdb] yes 42 no newer-wins duplicate F.SYNCLVL:=10 F.SYNCLVL:=0|F.SYNCLVL*=E F.SYNCLVL:=10 UTF-8 unix SYSTEM yes yes yes Ericsson R1A yes ANSI Ericsson T39m Ericsson R1B yes ANSI Ericsson T68 Motorola* V3 yes yes yes ANSI ANSI Motorola V3 Motorola* V3i yes yes yes ANSI Motorola V3i NOKIA 6230 yes yes Nokia 6230 NOKIA 9210 yes Nokia 9210 NOKIA 9210i yes Nokia 9210 NOKIA 3220 yes yes Nokia 3220 NOKIA 3230 yes yes Nokia 3230 NOKIA 3600 yes yes Nokia 3600 NOKIA 3620 yes yes Nokia 3620 NOKIA 3650 yes yes Nokia 3650 NOKIA 3660 yes yes Nokia 3660 NOKIA 6260 yes yes Nokia 6260 NOKIA 6600 yes yes Nokia 6600 NOKIA 6620 yes yes Nokia 6620 NOKIA 6630 yes yes Nokia 6630 NOKIA 6670 yes yes Nokia 6670 NOKIA 7250 yes yes Nokia 7250 NOKIA 7250i yes yes Nokia 7250i NOKIA 7260 yes yes Nokia 7260 NOKIA 7610 yes yes Nokia 7610 NOKIA 7650 yes yes Nokia 7650 NOKIA N-Gage yes yes Nokia N-Gage NOKIA N-Gage QD yes yes Nokia N-Gage QD NOKIA 9300 yes yes Nokia 9300 NOKIA 9500 yes yes Nokia 9500 NOKIA E90 yes Nokia E90 Sendo X yes yes Sendo X SIEMENS SX1 yes yes yes Siemens SX1 SIEMENS M55 yes yes Siemens M55 SIEMENS SL55 yes yes Siemens SL55 SIEMENS S55 yes yes Siemens S55 SIEMENS S65 yes yes Siemens S65 SIEMENS SL65 yes yes Siemens SL65 SonyEricsson SEMC Phone R3B yes SonyEricsson K700 SonyEricsson R2B yes SonyEricsson T610/T630 Sony Ericsson M600i no yes SonyEricsson M600i Sony Ericsson P800 no yes SonyEricsson P800 Sony Ericsson P900 no yes SonyEricsson P900 Sony Ericsson P910 no yes SonyEricsson P910 Sony Ericsson P910i no yes SonyEricsson P910i Sony Ericsson P990i no yes SonyEricsson P990i SonyEricsson R2A yes ANSI SonyEricsson T68i Funambol Outlook Sync Client yes Funambol Outlook Sync Client SyncJe Outlook Edition yes NextHaus SyncJe Outlook Client syncevolution-1.5/src/synthesis/src/sysync_SDK/configs/update-samples.pl0000755000373300037200000000347012424517753030266 0ustar00nightlyallusers00000000000000#! /usr/bin/env perl sub basename { $_ = shift; s;.*/;;; return $_; } # Concatenate all files ending in .xml in the given directory # plus those in a specific subdirectory for client or server. # Order lexicographic ascending of the base filename. sub readfragments { my $dir = shift; my $subdir = shift; my @res = (); my @files = (); if (opendir(my $dh, $dir)) { foreach (grep (/.*\.xml$/, readdir($dh))) { push @files, "$dir/$_"; } closedir($dh); if (opendir(my $dh, "$dir/$subdir")) { foreach (grep (/.*\.xml$/, readdir($dh))) { push @files, "$dir/$subdir/$_"; } closedir($dh); } } @files = sort { basename($a) <=> basename($b) } @files; foreach (@files) { open(IN, "<$_") || die "cannot read $_: $!"; push @res, ; close(IN); } return join("", @res); } # replace content of , , and all s # with the corresponding shared and/or client/server .xml fragments sub update { my $file = shift; my $subdir = shift; open(IN, "<$file") || die "cannot read $file: $!"; $_ = join("", ); close(IN) || die "closing $file: $!"; s;(\n).*(\n *);$1 . readfragments("debug", $subdir) . $2;se; s;(\n).*(\n *);$1 . readfragments("scripting", $subdir) . $2;se; s;(\n).*(\n *);$1 . readfragments("datatypes", $subdir) . $2;se; s;(\n *).*;$1 . readfragments("remoterules", $subdir);se; open(OUT, ">$file") || die "cannot write $file: $!"; print OUT; close(OUT) || die "closing $file: $!"; } update("syncclient_sample_config.xml", "client"); update("syncserv_sample_config.xml", "server"); syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/0000755000373300037200000000000012424517753027657 5ustar00nightlyallusers000000000000000000755000373300037200000000000012424517753036757 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeprojproject.pbxproj0000644000373300037200000004166412424517753042046 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ AA747D9F0F9514B9006C5449 /* dbplugin_cocoa_sample_ios_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* dbplugin_cocoa_sample_ios_Prefix.pch */; }; AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; }; EDDBA76A13040BB7005913FE /* dbplugin_cocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA75F13040BB7005913FE /* dbplugin_cocoa.h */; }; EDDBA76C13040BB7005913FE /* dbplugin_cocoa_wrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDDBA76113040BB7005913FE /* dbplugin_cocoa_wrapper.mm */; }; EDDBA76D13040BB7005913FE /* SettingsKey.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA76213040BB7005913FE /* SettingsKey.h */; }; EDDBA76E13040BB7005913FE /* SettingsKey.m in Sources */ = {isa = PBXBuildFile; fileRef = EDDBA76313040BB7005913FE /* SettingsKey.m */; }; EDDBA77513040CB7005913FE /* sample_dbplugin1.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDDBA77413040CB7005913FE /* sample_dbplugin1.mm */; }; EDDBA77913040F7E005913FE /* sample_dbplugin1.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA77813040F7E005913FE /* sample_dbplugin1.h */; }; EDDBA7881304104E005913FE /* SDK_util.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7811304104E005913FE /* SDK_util.h */; }; EDDBA7891304104E005913FE /* syerror.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7821304104E005913FE /* syerror.h */; }; EDDBA78A1304104E005913FE /* sync_dbapi.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7831304104E005913FE /* sync_dbapi.h */; }; EDDBA78B1304104E005913FE /* sync_dbapidef.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7841304104E005913FE /* sync_dbapidef.h */; }; EDDBA78C1304104E005913FE /* sync_declarations.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7851304104E005913FE /* sync_declarations.h */; }; EDDBA78E1304104E005913FE /* sync_uiapi.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7871304104E005913FE /* sync_uiapi.h */; }; EDDBA79413041085005913FE /* sync_include.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA79313041085005913FE /* sync_include.h */; }; EDDBA798130410C7005913FE /* target_options.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA797130410C7005913FE /* target_options.h */; }; EDDBA7EE13042560005913FE /* sample_dbplugin2.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7E813042560005913FE /* sample_dbplugin2.h */; }; EDDBA7EF13042560005913FE /* sample_dbplugin2.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDDBA7E913042560005913FE /* sample_dbplugin2.mm */; }; EDDBA7F013042560005913FE /* sample_dbplugin3.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7EA13042560005913FE /* sample_dbplugin3.h */; }; EDDBA7F113042560005913FE /* sample_dbplugin3.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDDBA7EB13042560005913FE /* sample_dbplugin3.mm */; }; EDDBA7F213042560005913FE /* sample_dbplugin4.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDBA7EC13042560005913FE /* sample_dbplugin4.h */; }; EDDBA7F313042560005913FE /* sample_dbplugin4.mm in Sources */ = {isa = PBXBuildFile; fileRef = EDDBA7ED13042560005913FE /* sample_dbplugin4.mm */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ AA747D9E0F9514B9006C5449 /* dbplugin_cocoa_sample_ios_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbplugin_cocoa_sample_ios_Prefix.pch; sourceTree = SOURCE_ROOT; }; AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D2AAC07E0554694100DB518D /* libdbplugin_cocoa_sample_ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdbplugin_cocoa_sample_ios.a; sourceTree = BUILT_PRODUCTS_DIR; }; EDDBA75F13040BB7005913FE /* dbplugin_cocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbplugin_cocoa.h; sourceTree = ""; }; EDDBA76013040BB7005913FE /* dbplugin_cocoa.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = dbplugin_cocoa.m; sourceTree = ""; }; EDDBA76113040BB7005913FE /* dbplugin_cocoa_wrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dbplugin_cocoa_wrapper.mm; sourceTree = ""; }; EDDBA76213040BB7005913FE /* SettingsKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsKey.h; sourceTree = ""; }; EDDBA76313040BB7005913FE /* SettingsKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsKey.m; sourceTree = ""; }; EDDBA77413040CB7005913FE /* sample_dbplugin1.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = sample_dbplugin1.mm; sourceTree = ""; }; EDDBA77813040F7E005913FE /* sample_dbplugin1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample_dbplugin1.h; sourceTree = ""; }; EDDBA7811304104E005913FE /* SDK_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDK_util.h; sourceTree = ""; }; EDDBA7821304104E005913FE /* syerror.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syerror.h; sourceTree = ""; }; EDDBA7831304104E005913FE /* sync_dbapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_dbapi.h; sourceTree = ""; }; EDDBA7841304104E005913FE /* sync_dbapidef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_dbapidef.h; sourceTree = ""; }; EDDBA7851304104E005913FE /* sync_declarations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_declarations.h; sourceTree = ""; }; EDDBA7871304104E005913FE /* sync_uiapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_uiapi.h; sourceTree = ""; }; EDDBA79313041085005913FE /* sync_include.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_include.h; sourceTree = ""; }; EDDBA797130410C7005913FE /* target_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = target_options.h; sourceTree = ""; }; EDDBA7E813042560005913FE /* sample_dbplugin2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample_dbplugin2.h; sourceTree = ""; }; EDDBA7E913042560005913FE /* sample_dbplugin2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = sample_dbplugin2.mm; sourceTree = ""; }; EDDBA7EA13042560005913FE /* sample_dbplugin3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample_dbplugin3.h; sourceTree = ""; }; EDDBA7EB13042560005913FE /* sample_dbplugin3.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = sample_dbplugin3.mm; sourceTree = ""; }; EDDBA7EC13042560005913FE /* sample_dbplugin4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample_dbplugin4.h; sourceTree = ""; }; EDDBA7ED13042560005913FE /* sample_dbplugin4.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = sample_dbplugin4.mm; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ D2AAC07C0554694100DB518D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 034768DFFF38A50411DB9C8B /* Products */ = { isa = PBXGroup; children = ( D2AAC07E0554694100DB518D /* libdbplugin_cocoa_sample_ios.a */, ); name = Products; sourceTree = ""; }; 0867D691FE84028FC02AAC07 /* dbplugin_cocoa_sample_ios */ = { isa = PBXGroup; children = ( EDDBA78013040FEB005913FE /* sysync_SDK */, EDDBA75E13040BB7005913FE /* sdk_sources_cocoa */, 08FB77AEFE84172EC02AAC07 /* DB_plugins */, 32C88DFF0371C24200C91783 /* Other Sources */, 0867D69AFE84028FC02AAC07 /* Frameworks */, 034768DFFF38A50411DB9C8B /* Products */, ); name = dbplugin_cocoa_sample_ios; sourceTree = ""; }; 0867D69AFE84028FC02AAC07 /* Frameworks */ = { isa = PBXGroup; children = ( AACBBE490F95108600F1A2B1 /* Foundation.framework */, ); name = Frameworks; sourceTree = ""; }; 08FB77AEFE84172EC02AAC07 /* DB_plugins */ = { isa = PBXGroup; children = ( EDDBA77813040F7E005913FE /* sample_dbplugin1.h */, EDDBA77413040CB7005913FE /* sample_dbplugin1.mm */, EDDBA7E813042560005913FE /* sample_dbplugin2.h */, EDDBA7E913042560005913FE /* sample_dbplugin2.mm */, EDDBA7EA13042560005913FE /* sample_dbplugin3.h */, EDDBA7EB13042560005913FE /* sample_dbplugin3.mm */, EDDBA7EC13042560005913FE /* sample_dbplugin4.h */, EDDBA7ED13042560005913FE /* sample_dbplugin4.mm */, ); name = DB_plugins; sourceTree = ""; }; 32C88DFF0371C24200C91783 /* Other Sources */ = { isa = PBXGroup; children = ( EDDBA797130410C7005913FE /* target_options.h */, AA747D9E0F9514B9006C5449 /* dbplugin_cocoa_sample_ios_Prefix.pch */, ); name = "Other Sources"; sourceTree = ""; }; EDDBA75E13040BB7005913FE /* sdk_sources_cocoa */ = { isa = PBXGroup; children = ( EDDBA75F13040BB7005913FE /* dbplugin_cocoa.h */, EDDBA76013040BB7005913FE /* dbplugin_cocoa.m */, EDDBA76113040BB7005913FE /* dbplugin_cocoa_wrapper.mm */, EDDBA76213040BB7005913FE /* SettingsKey.h */, EDDBA76313040BB7005913FE /* SettingsKey.m */, ); name = sdk_sources_cocoa; path = ../sdk_sources_cocoa; sourceTree = SOURCE_ROOT; }; EDDBA78013040FEB005913FE /* sysync_SDK */ = { isa = PBXGroup; children = ( EDDBA79313041085005913FE /* sync_include.h */, EDDBA7811304104E005913FE /* SDK_util.h */, EDDBA7821304104E005913FE /* syerror.h */, EDDBA7831304104E005913FE /* sync_dbapi.h */, EDDBA7841304104E005913FE /* sync_dbapidef.h */, EDDBA7851304104E005913FE /* sync_declarations.h */, EDDBA7871304104E005913FE /* sync_uiapi.h */, ); name = sysync_SDK; path = ../Sources; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ D2AAC07A0554694100DB518D /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( AA747D9F0F9514B9006C5449 /* dbplugin_cocoa_sample_ios_Prefix.pch in Headers */, EDDBA76A13040BB7005913FE /* dbplugin_cocoa.h in Headers */, EDDBA76D13040BB7005913FE /* SettingsKey.h in Headers */, EDDBA77913040F7E005913FE /* sample_dbplugin1.h in Headers */, EDDBA7881304104E005913FE /* SDK_util.h in Headers */, EDDBA7891304104E005913FE /* syerror.h in Headers */, EDDBA78A1304104E005913FE /* sync_dbapi.h in Headers */, EDDBA78B1304104E005913FE /* sync_dbapidef.h in Headers */, EDDBA78C1304104E005913FE /* sync_declarations.h in Headers */, EDDBA78E1304104E005913FE /* sync_uiapi.h in Headers */, EDDBA79413041085005913FE /* sync_include.h in Headers */, EDDBA798130410C7005913FE /* target_options.h in Headers */, EDDBA7EE13042560005913FE /* sample_dbplugin2.h in Headers */, EDDBA7F013042560005913FE /* sample_dbplugin3.h in Headers */, EDDBA7F213042560005913FE /* sample_dbplugin4.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ D2AAC07D0554694100DB518D /* dbplugin_cocoa_sample_ios */ = { isa = PBXNativeTarget; buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "dbplugin_cocoa_sample_ios" */; buildPhases = ( D2AAC07A0554694100DB518D /* Headers */, D2AAC07B0554694100DB518D /* Sources */, D2AAC07C0554694100DB518D /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = dbplugin_cocoa_sample_ios; productName = dbplugin_cocoa_sample_ios; productReference = D2AAC07E0554694100DB518D /* libdbplugin_cocoa_sample_ios.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0430; }; buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "dbplugin_cocoa_sample_ios" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 0867D691FE84028FC02AAC07 /* dbplugin_cocoa_sample_ios */; productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( D2AAC07D0554694100DB518D /* dbplugin_cocoa_sample_ios */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ D2AAC07B0554694100DB518D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( EDDBA76C13040BB7005913FE /* dbplugin_cocoa_wrapper.mm in Sources */, EDDBA76E13040BB7005913FE /* SettingsKey.m in Sources */, EDDBA77513040CB7005913FE /* sample_dbplugin1.mm in Sources */, EDDBA7EF13042560005913FE /* sample_dbplugin2.mm in Sources */, EDDBA7F113042560005913FE /* sample_dbplugin3.mm in Sources */, EDDBA7F313042560005913FE /* sample_dbplugin4.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 1DEB921F08733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../bin/iOS/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; COPY_PHASE_STRIP = NO; DSTROOT = /tmp/dbplugin_cocoa_sample_ios.dst; GCC_DYNAMIC_NO_PIC = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = dbplugin_cocoa_sample_ios_Prefix.pch; INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = dbplugin_cocoa_sample_ios; }; name = Debug; }; 1DEB922008733DC00010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/../bin/iOS/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; DSTROOT = /tmp/dbplugin_cocoa_sample_ios.dst; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = dbplugin_cocoa_sample_ios_Prefix.pch; INSTALL_PATH = /usr/local/lib; PRODUCT_NAME = dbplugin_cocoa_sample_ios; }; name = Release; }; 1DEB922308733DC00010E9CD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; name = Debug; }; 1DEB922408733DC00010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_C_LANGUAGE_STANDARD = c99; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; OTHER_LDFLAGS = "-ObjC"; SDKROOT = iphoneos; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "dbplugin_cocoa_sample_ios" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB921F08733DC00010E9CD /* Debug */, 1DEB922008733DC00010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "dbplugin_cocoa_sample_ios" */ = { isa = XCConfigurationList; buildConfigurations = ( 1DEB922308733DC00010E9CD /* Debug */, 1DEB922408733DC00010E9CD /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0867D690FE84028FC02AAC07 /* Project object */; } 0000755000373300037200000000000012424517753042755 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.xcworkspacecontents.xcworkspacedata0000644000373300037200000000025212424517753047716 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.xcworkspace 0000755000373300037200000000000012424517753041412 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/xcshareddata0000755000373300037200000000000012424517753043374 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/xcshareddata/xcschemesdbplugin_cocoa_sample_ios.xcscheme0000644000373300037200000000403412424517753052301 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/xcshareddata/xcschemes dbplugin_cocoa_sample_ios_Prefix.pch0000644000373300037200000000027412424517753036777 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample// // Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project. // #ifdef __OBJC__ #import #endif syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin.h0000644000373300037200000000506512424517753033203 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin.h * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ #import #import #import "dbplugin_cocoa.h" @interface SamplePluginModule : CocoaPluginModule { //%%% todo: add member variables here } - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB; - (void)dealloc; // Module identification + (int)buildNumber; - (cAppCharP)manufacturerName; - (cAppCharP)moduleName; // parsing plugin parameters - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion; // creating database context in this module's context - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; @end // SamplePluginModule // Wrapper for the DB context @interface SamplePluginDB : CocoaPluginDB { //%%% todo: add member variables here } - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; - (void)dealloc; // Context features - (sInt32)contextSupportRules:(cAppCharP)aContextRules; - (sInt32)filterSupportRules:(cAppCharP)aFilterRules; // Thread change alert - (void)threadMayChangeNow; // Read phase - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; // Write phase - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; #ifdef HAS_FINALIZE_LOCALID - (TSyError)finalizeLocalID:(NSString **)aLocIDP; #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // SamplePluginDB syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin.m0000644000373300037200000001746312424517753033215 0ustar00nightlyallusers00000000000000// // sample_dbplugin.m // // Created by Lukas Zeller on 2008/02/21. // Copyright 2008-2010 Synthesis AG. All rights reserved. // #import "sample_dbplugin.h" PLUGIN_NS_BEGIN // the factory function CocoaPluginModule *newPluginModule( cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ) { return [[SamplePluginModule alloc] initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]; } // newPluginModule PLUGIN_NS_END @implementation SamplePluginModule - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB { if ([ super initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]!=nil) { // allocate an autorelease pool for the module context [self debugOut:@"Module context created"]; // %%% todo: initialize module context } return self; } - (void)dealloc { [self debugOut:@"Module context destroyed"]; // %%% todo: deallocate any memory allocated within the context // done [super dealloc]; } + (int)buildNumber { return 0; } - (cAppCharP)manufacturerName { return "Synthesis AG"; } - (cAppCharP)moduleName { return "Sample Plugin"; } - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion { //%%% todo: parse plugin params if we support any // for now: supports no params // - return error if we get any params here return aParams==NULL || *aParams==0 ? LOCERR_OK : LOCERR_CFGPARSE; } // factory method for creating database context wrappers - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { return [[SamplePluginDB alloc] initWithName:aName inModule:self deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]; } @end // SamplePluginModule @implementation SamplePluginDB - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; { if ([ super initWithName:aName inModule:aModule deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]!=nil) { [self debugOut:@"DB context created"]; //%%% todo: initialize DB context level stuff if there is any } return self; } - (void)dealloc { [self debugOut:@"DB context destroyed"]; //%%% todo: clean up DB context level stuff // done [super dealloc]; } - (sInt32)contextSupportRules:(cAppCharP)aContextRules { [self debugOut:[NSString stringWithFormat: @"Context support rules: %@", [NSString stringWithCString:aContextRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse context support rules // for now none supported return 0; } - (sInt32)filterSupportRules:(cAppCharP)aFilterRules { [self debugOut:[NSString stringWithFormat: @"Filter support rules: %@", [NSString stringWithCString:aFilterRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse filters // for now none supported return 0; } - (void)threadMayChangeNow { [self debugOut:@"threadMayChangeNow"]; // %%% todo: make sure changing thread does not cause problems } - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { [self debugOut:[NSString stringWithFormat: @"startDataReadWithLastToken:%@ andResumeToken:%@", [NSString stringWithCString:aLastToken encoding:NSUTF8StringEncoding], [NSString stringWithCString:aResumeToken encoding:NSUTF8StringEncoding] ]]; //%%% todo: actually prepare everything needed for readNextItemAsKey //%%% for now: just return OK return LOCERR_OK; } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"readNextItemAsKey: aFirst=%d", aFirst]]; //%%% todo: actually read first or next item from DB //%%% for now: just simulate empty DB *aStatusP = ReadNextItem_EOF; sta = LOCERR_OK; // done return sta; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"readItemAsKey: itemID=%@ parentID=%@", aItemID, aParentID ]]; //%%% todo: read item from DB //%%% for now just return "not found" status (our simulated DB is empty) sta = DB_NotFound; // done return sta; } - (TSyError)endDataRead { [self debugOut:@"endDataRead"]; //%%% todo: get rid of ressources only needed during readNextItemAsKey calls (such as cached list of items etc.) //%%% for now: just ok return LOCERR_OK; } - (TSyError)startDataWrite { [self debugOut:@"startDataWrite"]; //%%% todo: prepare DB for writing //%%% for now: just ok return LOCERR_OK; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"insertItemAsKey: parentID=%@", aParentID ]]; //%%% todo: insert item into DB and return new ID //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } #ifdef HAS_FINALIZE_LOCALID // check if insert ID is temporary, and if so return real (persistent) - (TSyError)finalizeLocalID:(NSString **)aLocIDP { [self debugOutExotic:[NSString stringWithFormat: @"finalizeLocalID: tempLocID=%@", *aLocIDP ]]; //%%% todo: check if this is a temporary ID that needs to be finalized // Note: this is for DBs which save all changes at once at endDataWriteWithSuccess // and receive persistent IDs only then. For those, insertItemAsKey can // return temporary items which will be finalized using this call. //%%% for now: no finalisation needed return DB_NoContent; } #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"updateItemAsKey: parentID=%@, itemID=%@", *aParentIdP, *aItemIdP ]]; //%%% todo: update item in DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { [self debugOut:@"moveItem"]; // %%% todo: actually move item to new parent (if possible) return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"deleteItem: parentID=%@, itemID=%@", aParentID, aItemID ]]; //%%% todo: delete item from DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) // done return sta; } - (TSyError)deleteSyncSet { TSyError sta = LOCERR_OK; [self debugOut:@"deleteAllItems"]; //%%% todo:delete all items from the DB which belong to the sync set (=usually all, unless we have filters) // done return sta; } - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"endDataWriteWithSuccess:%d", aSuccess]]; //%%% todo: if needed, commit changes to DB //%%% todo: THEN create "this sync" token (after all changes are saved) //%%% for now we just return the absolute timestamp of now sInt64 ll = CFAbsoluteTimeGetCurrent(); *aNewTokenP = [NSString stringWithFormat:@"%lld",ll]; // done return sta; } @end // SamplePluginDB syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin1.h0000644000373300037200000000507212424517753033262 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin1.h * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ #import #import #import "dbplugin_cocoa.h" @interface SamplePluginModule1 : CocoaPluginModule { //%%% todo: add member variables here } - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB; - (void)dealloc; // Module identification + (int)buildNumber; - (cAppCharP)manufacturerName; - (cAppCharP)moduleName; // parsing plugin parameters - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion; // creating database context in this module's context - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; @end // SamplePluginModule1 // Wrapper for the DB context @interface SamplePluginDB1 : CocoaPluginDB { //%%% todo: add member variables here } - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; - (void)dealloc; // Context features - (sInt32)contextSupportRules:(cAppCharP)aContextRules; - (sInt32)filterSupportRules:(cAppCharP)aFilterRules; // Thread change alert - (void)threadMayChangeNow; // Read phase - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; // Write phase - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; #ifdef HAS_FINALIZE_LOCALID - (TSyError)finalizeLocalID:(NSString **)aLocIDP; #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // SamplePluginDB1 syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin1.mm0000644000373300037200000002116212424517753033442 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin1.mm * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ // The following defines the name of the plugin to be created. #define DB_PLUGIN_NAMESPACE iPhone_dbplugin1 // include actual source, but as this is a C++ file, the inclusion will also // compile as C++ and can contain namespaces // the generic cocoa interface #include "../sdk_sources_cocoa/dbplugin_cocoa.m" // From here on, the code is independent of dylib or static plugin. For making a dylib plugin out of this, // just copy everything below into a .m file. // (therefore the code below is an copy of sample_dbplugin.m, the sample plugin for the Mac OS X // version of the sysync SDK, with only the object names enumerated to distinguish the 4 sample // plugins that need to co-exist in the one any only Objective C namespace) #import "sample_dbplugin1.h" PLUGIN_NS_BEGIN // the factory function CocoaPluginModule *newPluginModule( cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ) { return [[SamplePluginModule1 alloc] initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]; } // newPluginModule PLUGIN_NS_END @implementation SamplePluginModule1 - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB { if ([ super initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]!=nil) { // allocate an autorelease pool for the module context [self debugOut:@"Module context created"]; // %%% todo: initialize module context } return self; } - (void)dealloc { [self debugOut:@"Module context destroyed"]; // %%% todo: deallocate any memory allocated within the context // done [super dealloc]; } + (int)buildNumber { return 0; } - (cAppCharP)manufacturerName { return "plan44.ch"; } - (cAppCharP)moduleName { return "Sample Plugin 1"; } - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion { //%%% todo: parse plugin params if we support any // for now: supports no params // - return error if we get any params here return aParams==NULL || *aParams==0 ? LOCERR_OK : LOCERR_CFGPARSE; } // factory method for creating database context wrappers - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { return [[SamplePluginDB1 alloc] initWithName:aName inModule:self deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]; } @end // SamplePluginModule1 @implementation SamplePluginDB1 - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; { if ([ super initWithName:aName inModule:aModule deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]!=nil) { [self debugOut:@"DB context created"]; //%%% todo: initialize DB context level stuff if there is any } return self; } - (void)dealloc { [self debugOut:@"DB context destroyed"]; //%%% todo: clean up DB context level stuff // done [super dealloc]; } - (sInt32)contextSupportRules:(cAppCharP)aContextRules { [self debugOut:[NSString stringWithFormat: @"Context support rules: %@", [NSString stringWithCString:aContextRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse context support rules // for now none supported return 0; } - (sInt32)filterSupportRules:(cAppCharP)aFilterRules { [self debugOut:[NSString stringWithFormat: @"Filter support rules: %@", [NSString stringWithCString:aFilterRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse filters // for now none supported return 0; } - (void)threadMayChangeNow { [self debugOut:@"threadMayChangeNow"]; // %%% todo: make sure changing thread does not cause problems } - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { [self debugOut:[NSString stringWithFormat: @"startDataReadWithLastToken:%@ andResumeToken:%@", [NSString stringWithCString:aLastToken encoding:NSUTF8StringEncoding], [NSString stringWithCString:aResumeToken encoding:NSUTF8StringEncoding] ]]; //%%% todo: actually prepare everything needed for readNextItemAsKey //%%% for now: just return OK return LOCERR_OK; } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"readNextItemAsKey: aFirst=%d", aFirst]]; //%%% todo: actually read first or next item from DB //%%% for now: just simulate empty DB *aStatusP = ReadNextItem_EOF; sta = LOCERR_OK; // done return sta; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"readItemAsKey: itemID=%@ parentID=%@", aItemID, aParentID ]]; //%%% todo: read item from DB //%%% for now just return "not found" status (our simulated DB is empty) sta = DB_NotFound; // done return sta; } - (TSyError)endDataRead { [self debugOut:@"endDataRead"]; //%%% todo: get rid of ressources only needed during readNextItemAsKey calls (such as cached list of items etc.) //%%% for now: just ok return LOCERR_OK; } - (TSyError)startDataWrite { [self debugOut:@"startDataWrite"]; //%%% todo: prepare DB for writing //%%% for now: just ok return LOCERR_OK; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"insertItemAsKey: parentID=%@", aParentID ]]; //%%% todo: insert item into DB and return new ID //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } #ifdef HAS_FINALIZE_LOCALID // check if insert ID is temporary, and if so return real (persistent) - (TSyError)finalizeLocalID:(NSString **)aLocIDP { [self debugOutExotic:[NSString stringWithFormat: @"finalizeLocalID: tempLocID=%@", *aLocIDP ]]; //%%% todo: check if this is a temporary ID that needs to be finalized // Note: this is for DBs which save all changes at once at endDataWriteWithSuccess // and receive persistent IDs only then. For those, insertItemAsKey can // return temporary items which will be finalized using this call. //%%% for now: no finalisation needed return DB_NoContent; } #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"updateItemAsKey: parentID=%@, itemID=%@", *aParentIdP, *aItemIdP ]]; //%%% todo: update item in DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { [self debugOut:@"moveItem"]; // %%% todo: actually move item to new parent (if possible) return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"deleteItem: parentID=%@, itemID=%@", aParentID, aItemID ]]; //%%% todo: delete item from DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) // done return sta; } - (TSyError)deleteSyncSet { TSyError sta = LOCERR_OK; [self debugOut:@"deleteAllItems"]; //%%% todo:delete all items from the DB which belong to the sync set (=usually all, unless we have filters) // done return sta; } - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"endDataWriteWithSuccess:%d", aSuccess]]; //%%% todo: if needed, commit changes to DB //%%% todo: THEN create "this sync" token (after all changes are saved) //%%% for now we just return the absolute timestamp of now sInt64 ll = CFAbsoluteTimeGetCurrent(); *aNewTokenP = [NSString stringWithFormat:@"%lld",ll]; // done return sta; } @end // SamplePluginDB1 /* eof */syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin2.h0000644000373300037200000000507212424517753033263 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin2.h * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ #import #import #import "dbplugin_cocoa.h" @interface SamplePluginModule2 : CocoaPluginModule { //%%% todo: add member variables here } - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB; - (void)dealloc; // Module identification + (int)buildNumber; - (cAppCharP)manufacturerName; - (cAppCharP)moduleName; // parsing plugin parameters - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion; // creating database context in this module's context - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; @end // SamplePluginModule2 // Wrapper for the DB context @interface SamplePluginDB2 : CocoaPluginDB { //%%% todo: add member variables here } - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; - (void)dealloc; // Context features - (sInt32)contextSupportRules:(cAppCharP)aContextRules; - (sInt32)filterSupportRules:(cAppCharP)aFilterRules; // Thread change alert - (void)threadMayChangeNow; // Read phase - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; // Write phase - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; #ifdef HAS_FINALIZE_LOCALID - (TSyError)finalizeLocalID:(NSString **)aLocIDP; #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // SamplePluginDB2 syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin2.mm0000644000373300037200000002116212424517753033443 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin1.mm * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ // The following defines the name of the plugin to be created. #define DB_PLUGIN_NAMESPACE iPhone_dbplugin2 // include actual source, but as this is a C++ file, the inclusion will also // compile as C++ and can contain namespaces // the generic cocoa interface #include "../sdk_sources_cocoa/dbplugin_cocoa.m" // From here on, the code is independent of dylib or static plugin. For making a dylib plugin out of this, // just copy everything below into a .m file. // (therefore the code below is an copy of sample_dbplugin.m, the sample plugin for the Mac OS X // version of the sysync SDK, with only the object names enumerated to distinguish the 4 sample // plugins that need to co-exist in the one any only Objective C namespace) #import "sample_dbplugin2.h" PLUGIN_NS_BEGIN // the factory function CocoaPluginModule *newPluginModule( cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ) { return [[SamplePluginModule2 alloc] initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]; } // newPluginModule PLUGIN_NS_END @implementation SamplePluginModule2 - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB { if ([ super initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]!=nil) { // allocate an autorelease pool for the module context [self debugOut:@"Module context created"]; // %%% todo: initialize module context } return self; } - (void)dealloc { [self debugOut:@"Module context destroyed"]; // %%% todo: deallocate any memory allocated within the context // done [super dealloc]; } + (int)buildNumber { return 0; } - (cAppCharP)manufacturerName { return "plan44.ch"; } - (cAppCharP)moduleName { return "Sample Plugin 2"; } - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion { //%%% todo: parse plugin params if we support any // for now: supports no params // - return error if we get any params here return aParams==NULL || *aParams==0 ? LOCERR_OK : LOCERR_CFGPARSE; } // factory method for creating database context wrappers - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { return [[SamplePluginDB2 alloc] initWithName:aName inModule:self deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]; } @end // SamplePluginModule2 @implementation SamplePluginDB2 - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; { if ([ super initWithName:aName inModule:aModule deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]!=nil) { [self debugOut:@"DB context created"]; //%%% todo: initialize DB context level stuff if there is any } return self; } - (void)dealloc { [self debugOut:@"DB context destroyed"]; //%%% todo: clean up DB context level stuff // done [super dealloc]; } - (sInt32)contextSupportRules:(cAppCharP)aContextRules { [self debugOut:[NSString stringWithFormat: @"Context support rules: %@", [NSString stringWithCString:aContextRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse context support rules // for now none supported return 0; } - (sInt32)filterSupportRules:(cAppCharP)aFilterRules { [self debugOut:[NSString stringWithFormat: @"Filter support rules: %@", [NSString stringWithCString:aFilterRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse filters // for now none supported return 0; } - (void)threadMayChangeNow { [self debugOut:@"threadMayChangeNow"]; // %%% todo: make sure changing thread does not cause problems } - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { [self debugOut:[NSString stringWithFormat: @"startDataReadWithLastToken:%@ andResumeToken:%@", [NSString stringWithCString:aLastToken encoding:NSUTF8StringEncoding], [NSString stringWithCString:aResumeToken encoding:NSUTF8StringEncoding] ]]; //%%% todo: actually prepare everything needed for readNextItemAsKey //%%% for now: just return OK return LOCERR_OK; } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"readNextItemAsKey: aFirst=%d", aFirst]]; //%%% todo: actually read first or next item from DB //%%% for now: just simulate empty DB *aStatusP = ReadNextItem_EOF; sta = LOCERR_OK; // done return sta; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"readItemAsKey: itemID=%@ parentID=%@", aItemID, aParentID ]]; //%%% todo: read item from DB //%%% for now just return "not found" status (our simulated DB is empty) sta = DB_NotFound; // done return sta; } - (TSyError)endDataRead { [self debugOut:@"endDataRead"]; //%%% todo: get rid of ressources only needed during readNextItemAsKey calls (such as cached list of items etc.) //%%% for now: just ok return LOCERR_OK; } - (TSyError)startDataWrite { [self debugOut:@"startDataWrite"]; //%%% todo: prepare DB for writing //%%% for now: just ok return LOCERR_OK; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"insertItemAsKey: parentID=%@", aParentID ]]; //%%% todo: insert item into DB and return new ID //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } #ifdef HAS_FINALIZE_LOCALID // check if insert ID is temporary, and if so return real (persistent) - (TSyError)finalizeLocalID:(NSString **)aLocIDP { [self debugOutExotic:[NSString stringWithFormat: @"finalizeLocalID: tempLocID=%@", *aLocIDP ]]; //%%% todo: check if this is a temporary ID that needs to be finalized // Note: this is for DBs which save all changes at once at endDataWriteWithSuccess // and receive persistent IDs only then. For those, insertItemAsKey can // return temporary items which will be finalized using this call. //%%% for now: no finalisation needed return DB_NoContent; } #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"updateItemAsKey: parentID=%@, itemID=%@", *aParentIdP, *aItemIdP ]]; //%%% todo: update item in DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { [self debugOut:@"moveItem"]; // %%% todo: actually move item to new parent (if possible) return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"deleteItem: parentID=%@, itemID=%@", aParentID, aItemID ]]; //%%% todo: delete item from DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) // done return sta; } - (TSyError)deleteSyncSet { TSyError sta = LOCERR_OK; [self debugOut:@"deleteAllItems"]; //%%% todo:delete all items from the DB which belong to the sync set (=usually all, unless we have filters) // done return sta; } - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"endDataWriteWithSuccess:%d", aSuccess]]; //%%% todo: if needed, commit changes to DB //%%% todo: THEN create "this sync" token (after all changes are saved) //%%% for now we just return the absolute timestamp of now sInt64 ll = CFAbsoluteTimeGetCurrent(); *aNewTokenP = [NSString stringWithFormat:@"%lld",ll]; // done return sta; } @end // SamplePluginDB2 /* eof */syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin3.h0000644000373300037200000000507212424517753033264 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin3.h * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ #import #import #import "dbplugin_cocoa.h" @interface SamplePluginModule3 : CocoaPluginModule { //%%% todo: add member variables here } - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB; - (void)dealloc; // Module identification + (int)buildNumber; - (cAppCharP)manufacturerName; - (cAppCharP)moduleName; // parsing plugin parameters - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion; // creating database context in this module's context - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; @end // SamplePluginModule3 // Wrapper for the DB context @interface SamplePluginDB3 : CocoaPluginDB { //%%% todo: add member variables here } - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; - (void)dealloc; // Context features - (sInt32)contextSupportRules:(cAppCharP)aContextRules; - (sInt32)filterSupportRules:(cAppCharP)aFilterRules; // Thread change alert - (void)threadMayChangeNow; // Read phase - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; // Write phase - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; #ifdef HAS_FINALIZE_LOCALID - (TSyError)finalizeLocalID:(NSString **)aLocIDP; #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // SamplePluginDB3 syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin3.mm0000644000373300037200000002116212424517753033444 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin3.mm * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ // The following defines the name of the plugin to be created. #define DB_PLUGIN_NAMESPACE iPhone_dbplugin3 // include actual source, but as this is a C++ file, the inclusion will also // compile as C++ and can contain namespaces // the generic cocoa interface #include "../sdk_sources_cocoa/dbplugin_cocoa.m" // From here on, the code is independent of dylib or static plugin. For making a dylib plugin out of this, // just copy everything below into a .m file. // (therefore the code below is an copy of sample_dbplugin.m, the sample plugin for the Mac OS X // version of the sysync SDK, with only the object names enumerated to distinguish the 4 sample // plugins that need to co-exist in the one any only Objective C namespace) #import "sample_dbplugin3.h" PLUGIN_NS_BEGIN // the factory function CocoaPluginModule *newPluginModule( cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ) { return [[SamplePluginModule3 alloc] initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]; } // newPluginModule PLUGIN_NS_END @implementation SamplePluginModule3 - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB { if ([ super initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]!=nil) { // allocate an autorelease pool for the module context [self debugOut:@"Module context created"]; // %%% todo: initialize module context } return self; } - (void)dealloc { [self debugOut:@"Module context destroyed"]; // %%% todo: deallocate any memory allocated within the context // done [super dealloc]; } + (int)buildNumber { return 0; } - (cAppCharP)manufacturerName { return "plan44.ch"; } - (cAppCharP)moduleName { return "Sample Plugin 3"; } - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion { //%%% todo: parse plugin params if we support any // for now: supports no params // - return error if we get any params here return aParams==NULL || *aParams==0 ? LOCERR_OK : LOCERR_CFGPARSE; } // factory method for creating database context wrappers - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { return [[SamplePluginDB3 alloc] initWithName:aName inModule:self deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]; } @end // SamplePluginModule3 @implementation SamplePluginDB3 - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; { if ([ super initWithName:aName inModule:aModule deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]!=nil) { [self debugOut:@"DB context created"]; //%%% todo: initialize DB context level stuff if there is any } return self; } - (void)dealloc { [self debugOut:@"DB context destroyed"]; //%%% todo: clean up DB context level stuff // done [super dealloc]; } - (sInt32)contextSupportRules:(cAppCharP)aContextRules { [self debugOut:[NSString stringWithFormat: @"Context support rules: %@", [NSString stringWithCString:aContextRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse context support rules // for now none supported return 0; } - (sInt32)filterSupportRules:(cAppCharP)aFilterRules { [self debugOut:[NSString stringWithFormat: @"Filter support rules: %@", [NSString stringWithCString:aFilterRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse filters // for now none supported return 0; } - (void)threadMayChangeNow { [self debugOut:@"threadMayChangeNow"]; // %%% todo: make sure changing thread does not cause problems } - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { [self debugOut:[NSString stringWithFormat: @"startDataReadWithLastToken:%@ andResumeToken:%@", [NSString stringWithCString:aLastToken encoding:NSUTF8StringEncoding], [NSString stringWithCString:aResumeToken encoding:NSUTF8StringEncoding] ]]; //%%% todo: actually prepare everything needed for readNextItemAsKey //%%% for now: just return OK return LOCERR_OK; } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"readNextItemAsKey: aFirst=%d", aFirst]]; //%%% todo: actually read first or next item from DB //%%% for now: just simulate empty DB *aStatusP = ReadNextItem_EOF; sta = LOCERR_OK; // done return sta; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"readItemAsKey: itemID=%@ parentID=%@", aItemID, aParentID ]]; //%%% todo: read item from DB //%%% for now just return "not found" status (our simulated DB is empty) sta = DB_NotFound; // done return sta; } - (TSyError)endDataRead { [self debugOut:@"endDataRead"]; //%%% todo: get rid of ressources only needed during readNextItemAsKey calls (such as cached list of items etc.) //%%% for now: just ok return LOCERR_OK; } - (TSyError)startDataWrite { [self debugOut:@"startDataWrite"]; //%%% todo: prepare DB for writing //%%% for now: just ok return LOCERR_OK; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"insertItemAsKey: parentID=%@", aParentID ]]; //%%% todo: insert item into DB and return new ID //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } #ifdef HAS_FINALIZE_LOCALID // check if insert ID is temporary, and if so return real (persistent) - (TSyError)finalizeLocalID:(NSString **)aLocIDP { [self debugOutExotic:[NSString stringWithFormat: @"finalizeLocalID: tempLocID=%@", *aLocIDP ]]; //%%% todo: check if this is a temporary ID that needs to be finalized // Note: this is for DBs which save all changes at once at endDataWriteWithSuccess // and receive persistent IDs only then. For those, insertItemAsKey can // return temporary items which will be finalized using this call. //%%% for now: no finalisation needed return DB_NoContent; } #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"updateItemAsKey: parentID=%@, itemID=%@", *aParentIdP, *aItemIdP ]]; //%%% todo: update item in DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { [self debugOut:@"moveItem"]; // %%% todo: actually move item to new parent (if possible) return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"deleteItem: parentID=%@, itemID=%@", aParentID, aItemID ]]; //%%% todo: delete item from DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) // done return sta; } - (TSyError)deleteSyncSet { TSyError sta = LOCERR_OK; [self debugOut:@"deleteAllItems"]; //%%% todo:delete all items from the DB which belong to the sync set (=usually all, unless we have filters) // done return sta; } - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"endDataWriteWithSuccess:%d", aSuccess]]; //%%% todo: if needed, commit changes to DB //%%% todo: THEN create "this sync" token (after all changes are saved) //%%% for now we just return the absolute timestamp of now sInt64 ll = CFAbsoluteTimeGetCurrent(); *aNewTokenP = [NSString stringWithFormat:@"%lld",ll]; // done return sta; } @end // SamplePluginDB3 /* eof */syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin4.h0000644000373300037200000000507212424517753033265 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin4.h * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ #import #import #import "dbplugin_cocoa.h" @interface SamplePluginModule4 : CocoaPluginModule { //%%% todo: add member variables here } - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB; - (void)dealloc; // Module identification + (int)buildNumber; - (cAppCharP)manufacturerName; - (cAppCharP)moduleName; // parsing plugin parameters - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion; // creating database context in this module's context - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; @end // SamplePluginModule4 // Wrapper for the DB context @interface SamplePluginDB4 : CocoaPluginDB { //%%% todo: add member variables here } - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; - (void)dealloc; // Context features - (sInt32)contextSupportRules:(cAppCharP)aContextRules; - (sInt32)filterSupportRules:(cAppCharP)aFilterRules; // Thread change alert - (void)threadMayChangeNow; // Read phase - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; // Write phase - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; #ifdef HAS_FINALIZE_LOCALID - (TSyError)finalizeLocalID:(NSString **)aLocIDP; #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // SamplePluginDB4 syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin4.mm0000644000373300037200000002116212424517753033445 0ustar00nightlyallusers00000000000000/* * File: sample_dbplugin4.mm * * Author: Lukas Zeller (luz@plan44.ch) * * Sample for statically linked cocoa plugin libraries (as needed for iPhoneOS). * * Copyright (c) 2011 plan44.ch * */ // The following defines the name of the plugin to be created. #define DB_PLUGIN_NAMESPACE iPhone_dbplugin4 // include actual source, but as this is a C++ file, the inclusion will also // compile as C++ and can contain namespaces // the generic cocoa interface #include "../sdk_sources_cocoa/dbplugin_cocoa.m" // From here on, the code is independent of dylib or static plugin. For making a dylib plugin out of this, // just copy everything below into a .m file. // (therefore the code below is an copy of sample_dbplugin.m, the sample plugin for the Mac OS X // version of the sysync SDK, with only the object names enumerated to distinguish the 4 sample // plugins that need to co-exist in the one any only Objective C namespace) #import "sample_dbplugin4.h" PLUGIN_NS_BEGIN // the factory function CocoaPluginModule *newPluginModule( cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ) { return [[SamplePluginModule4 alloc] initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]; } // newPluginModule PLUGIN_NS_END @implementation SamplePluginModule4 - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB { if ([ super initWithModuleName:aModuleName subName:aSubName contextName:aContextName andCB:aCB ]!=nil) { // allocate an autorelease pool for the module context [self debugOut:@"Module context created"]; // %%% todo: initialize module context } return self; } - (void)dealloc { [self debugOut:@"Module context destroyed"]; // %%% todo: deallocate any memory allocated within the context // done [super dealloc]; } + (int)buildNumber { return 0; } - (cAppCharP)manufacturerName { return "plan44.ch"; } - (cAppCharP)moduleName { return "Sample Plugin 4"; } - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion { //%%% todo: parse plugin params if we support any // for now: supports no params // - return error if we get any params here return aParams==NULL || *aParams==0 ? LOCERR_OK : LOCERR_CFGPARSE; } // factory method for creating database context wrappers - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { return [[SamplePluginDB4 alloc] initWithName:aName inModule:self deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]; } @end // SamplePluginModule4 @implementation SamplePluginDB4 - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; { if ([ super initWithName:aName inModule:aModule deviceKey:aDeviceKey userKey:aUserKey andCB:aCB ]!=nil) { [self debugOut:@"DB context created"]; //%%% todo: initialize DB context level stuff if there is any } return self; } - (void)dealloc { [self debugOut:@"DB context destroyed"]; //%%% todo: clean up DB context level stuff // done [super dealloc]; } - (sInt32)contextSupportRules:(cAppCharP)aContextRules { [self debugOut:[NSString stringWithFormat: @"Context support rules: %@", [NSString stringWithCString:aContextRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse context support rules // for now none supported return 0; } - (sInt32)filterSupportRules:(cAppCharP)aFilterRules { [self debugOut:[NSString stringWithFormat: @"Filter support rules: %@", [NSString stringWithCString:aFilterRules encoding:NSUTF8StringEncoding] ]]; // %%% todo: parse filters // for now none supported return 0; } - (void)threadMayChangeNow { [self debugOut:@"threadMayChangeNow"]; // %%% todo: make sure changing thread does not cause problems } - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { [self debugOut:[NSString stringWithFormat: @"startDataReadWithLastToken:%@ andResumeToken:%@", [NSString stringWithCString:aLastToken encoding:NSUTF8StringEncoding], [NSString stringWithCString:aResumeToken encoding:NSUTF8StringEncoding] ]]; //%%% todo: actually prepare everything needed for readNextItemAsKey //%%% for now: just return OK return LOCERR_OK; } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"readNextItemAsKey: aFirst=%d", aFirst]]; //%%% todo: actually read first or next item from DB //%%% for now: just simulate empty DB *aStatusP = ReadNextItem_EOF; sta = LOCERR_OK; // done return sta; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"readItemAsKey: itemID=%@ parentID=%@", aItemID, aParentID ]]; //%%% todo: read item from DB //%%% for now just return "not found" status (our simulated DB is empty) sta = DB_NotFound; // done return sta; } - (TSyError)endDataRead { [self debugOut:@"endDataRead"]; //%%% todo: get rid of ressources only needed during readNextItemAsKey calls (such as cached list of items etc.) //%%% for now: just ok return LOCERR_OK; } - (TSyError)startDataWrite { [self debugOut:@"startDataWrite"]; //%%% todo: prepare DB for writing //%%% for now: just ok return LOCERR_OK; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"insertItemAsKey: parentID=%@", aParentID ]]; //%%% todo: insert item into DB and return new ID //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } #ifdef HAS_FINALIZE_LOCALID // check if insert ID is temporary, and if so return real (persistent) - (TSyError)finalizeLocalID:(NSString **)aLocIDP { [self debugOutExotic:[NSString stringWithFormat: @"finalizeLocalID: tempLocID=%@", *aLocIDP ]]; //%%% todo: check if this is a temporary ID that needs to be finalized // Note: this is for DBs which save all changes at once at endDataWriteWithSuccess // and receive persistent IDs only then. For those, insertItemAsKey can // return temporary items which will be finalized using this call. //%%% for now: no finalisation needed return DB_NoContent; } #endif - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"updateItemAsKey: parentID=%@, itemID=%@", *aParentIdP, *aItemIdP ]]; //%%% todo: update item in DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) sta = DB_Error; // done return sta; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { [self debugOut:@"moveItem"]; // %%% todo: actually move item to new parent (if possible) return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat: @"deleteItem: parentID=%@, itemID=%@", aParentID, aItemID ]]; //%%% todo: delete item from DB //%%% for now just return DB error (our simulated DB is always empty and can't be written) // done return sta; } - (TSyError)deleteSyncSet { TSyError sta = LOCERR_OK; [self debugOut:@"deleteAllItems"]; //%%% todo:delete all items from the DB which belong to the sync set (=usually all, unless we have filters) // done return sta; } - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { TSyError sta = LOCERR_OK; [self debugOut:[NSString stringWithFormat:@"endDataWriteWithSuccess:%d", aSuccess]]; //%%% todo: if needed, commit changes to DB //%%% todo: THEN create "this sync" token (after all changes are saved) //%%% for now we just return the absolute timestamp of now sInt64 ll = CFAbsoluteTimeGetCurrent(); *aNewTokenP = [NSString stringWithFormat:@"%lld",ll]; // done return sta; } @end // SamplePluginDB4 /* eof */syncevolution-1.5/src/synthesis/src/sysync_SDK/dbplugin_cocoa_sample/target_options.h0000644000373300037200000000115612424517753033074 0ustar00nightlyallusers00000000000000// Sysync related target options for sample database adaptor plugin #ifndef TARGET_OPTIONS_H #define TARGET_OPTIONS_H // define platform // - we are on MACOSX (but on the mobile variant of it) #define MACOSX 1 #define MOBOSX 1 // this is not the SyncML engine itself #undef SYSYNC_ENGINE // Sysync related debug #define SYDEBUG 2 // general app debug #if DEBUG // general app debug #define CONSOLEDBG 1 #else // no output to console, please #undef CONSOLEDBG #endif // this can be #undef'ed when the DB does not need finalizing local IDs #define HAS_FINALIZE_LOCALID 1 #endif // TARGET_OPTIONS_H /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/0000755000373300037200000000000012424517753030574 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/AppDelegate.h0000644000373300037200000000232312424517753033120 0ustar00nightlyallusers00000000000000// // AppDelegate.h // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 plan44.ch. All rights reserved. // #import // This defines the datatype ("SyncML target") to be used in the app. // This simple sample app just synchronizes a single "target", but libsynthesis // supports synchronizing more than one datatype/target in one sync session // (needs more elaborate UI to allow configuring multiple target DBs and // providing status display for different data types) // // Note: - For the commercial plugins accessing the iOS native PIM databases, the sample configuration // uses the following IDs: // ID 1001 = iOS Address book (using ABAdressbook API) // ID 1003 = iOS Calendar (using EkEventKit API) // - The opensource sample app which stores data in TAB separated text files uses: // ID 2001 = text file based contacts // ID 2002 = text file based calendar #define SYNCML_TARGET_DBID 2001 @class MainViewController; @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) MainViewController *mainViewController; @end syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/AppDelegate.m0000644000373300037200000000537112424517753033133 0ustar00nightlyallusers00000000000000// // AppDelegate.m // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 plan44.ch. All rights reserved. // #import "AppDelegate.h" #import "MainViewController.h" @implementation AppDelegate @synthesize window = _window; @synthesize mainViewController = _mainViewController; - (void)dealloc { [_window release]; [_mainViewController release]; [super dealloc]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone" bundle:nil] autorelease]; } else { self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad" bundle:nil] autorelease]; } self.window.rootViewController = self.mainViewController; [self.window makeKeyAndVisible]; return YES; } - (void)applicationWillResignActive:(UIApplication *)application { /* Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. */ } - (void)applicationDidEnterBackground:(UIApplication *)application { /* Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. */ } - (void)applicationWillEnterForeground:(UIApplication *)application { /* Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. */ } - (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ } - (void)applicationWillTerminate:(UIApplication *)application { /* Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. */ } @end syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/FlipsideViewController.h0000644000373300037200000000174012424517753035405 0ustar00nightlyallusers00000000000000// // FlipsideViewController.h // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 plan44.ch. All rights reserved. // #import #import "SyncMLClient.h" @class FlipsideViewController; @protocol FlipsideViewControllerDelegate - (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller; @end @interface FlipsideViewController : UIViewController { NSArray *syncModes; } @property (assign, nonatomic) SyncMLClient *syncmlClient; @property (assign, nonatomic) IBOutlet id delegate; @property (retain, nonatomic) IBOutlet UITextField *serverURLfield; @property (retain, nonatomic) IBOutlet UITextField *serverUserField; @property (retain, nonatomic) IBOutlet UITextField *serverPasswordField; @property (retain, nonatomic) IBOutlet UITextField *datastorePathField; @property (retain, nonatomic) IBOutlet UIPickerView *datastoreSyncMode; - (IBAction)done:(id)sender; @end syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/FlipsideViewController.m0000644000373300037200000002613112424517753035413 0ustar00nightlyallusers00000000000000// // FlipsideViewController.m // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 plan44.ch. All rights reserved. // #import "FlipsideViewController.h" #import "ZKeyChainWrapper.h" #import "AppDelegate.h" @implementation FlipsideViewController @synthesize delegate = _delegate; @synthesize syncmlClient = _syncmlClient; @synthesize serverURLfield; @synthesize serverUserField; @synthesize serverPasswordField; @synthesize datastorePathField; @synthesize datastoreSyncMode; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0); } return self; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // - initialize picker contents array with the 6 sync modes available syncModes = [[NSArray alloc] initWithObjects: @"Normal", @"Slow", @"Update device", @"Reload Device", @"Update Server", @"Reload Server", nil ]; } - (void)viewDidUnload { [syncModes release]; syncModes = nil; [self setServerURLfield:nil]; [self setServerUserField:nil]; [self setServerPasswordField:nil]; [self setDatastorePathField:nil]; [self setDatastoreSyncMode:nil]; [super viewDidUnload]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } else { return YES; } } - (void)dealloc { [serverURLfield release]; [serverUserField release]; [serverPasswordField release]; [datastorePathField release]; [datastoreSyncMode release]; [super dealloc]; } #pragma mark - datasource and delegate methods for sync mode picker view - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; // only one component (the sync mode string) } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return [syncModes count]; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return [syncModes objectAtIndex:row]; } #pragma mark - text field delegates - (BOOL)textFieldShouldReturn:(UITextField *)textField { // make sure keyboard gets dismissed [textField performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0]; // otherwise process the return key normally return YES; } //- (BOOL)textFieldShouldEndEditing:(UITextField *)textField //{ // return YES; //} #pragma mark - Actions - (IBAction)done:(id)sender { [self.delegate flipsideViewControllerDidFinish:self]; } #pragma mark - loading and saving SyncML client settings when flip side appears or disappears, resp. - (void)viewWillAppear:(BOOL)animated { // load settings from SyncML engine into controls TSyError sta; // get the first profile's settings. PROFILEID_FIRST_OR_DEFAULT causes a default profile // to be created if none already exists SettingsKey *profileKey = [self.syncmlClient newProfileKeyForID:PROFILEID_FIRST_OR_DEFAULT]; if (profileKey) { // successfully opened profile key. Now we can get the profile-level settings // - Server URL self.serverURLfield.text = [profileKey stringValueByName:"serverURI"]; // - user name self.serverUserField.text = [profileKey stringValueByName:"serverUser"]; // - password. Note that the password can be stored in the profile itself, but this is not recommended // for security reasons (it is stored only obfuscated, not encrypted). // Therefore, we store the password in the keychain, and the SyncMLClient object fetches it // from the keychain when needed while running a session. self.serverPasswordField.text =[[ZKeyChainWrapper sharedKeyChainWrapper] passwordForService:[NSString stringWithFormat:@"SyncMLProfile.%d",[profileKey keyID]] account:@"SyncMLPassword" error:NULL ]; // Now get the per-datastore settings. In this sample, we only have one single datastore. // The datastores are identified by their , which is defined in the the // ios_syncclient_app_sample.xml config file. // For this app, the actual dbtypeid numeric value is defined as SYNCML_TARGET_DBID in AppDelegate.h // - first open the targets container (a "target" represents settings for one datastore) SettingsKey *targetsKey = [profileKey newOpenKeyByPath:"/targets" withMode:0 err:&sta]; if (targetsKey) { // successfully opened targets container // - now open the target we are interested in, by ID ( in the configuration XML file) // Note: See definition of SYNCML_TARGET_DBID in AppDelegate.h for explanation of standard // IDs to use with sample configurations as provided in libsynthesis and plan44.ch // SDKs. SettingsKey *targetKey = [targetsKey newOpenSubKeyByID:SYNCML_TARGET_DBID withMode:0 err:&sta]; if (targetKey) { // successfully opened targets container key. Now we can get the datastore level settings // - the server path for the contacts (defaults to "contacts") self.datastorePathField.text = [targetKey stringValueByName:"remotepath"]; // - the sync mode. This consists of the basic mode (twoway/fromserver/fromclient) plus // a flag with differentiates between slow or normal variant of the basic mode. // // Basic mode Slow end user selection // ------------ ------ ------------------- // two way No Normal // two way Yes Slow // from server No Update device // from server Yes Reload device // from client No Update server // from client Yes Reload server // // - basic mode short syncmode = [targetKey intValueByName:"syncmode"]; // sync mode: 0=twoway, 1=from server only, 2=from client only // - slow sync flag BOOL slowsync = [targetKey intValueByName:"forceslow"]; // YES if user wants to force slow-sync (=reload for one-way mode) // - set current selection in picker [self.datastoreSyncMode selectRow:syncmode*2 + (slowsync ? 1 : 0) inComponent:0 animated:NO]; // close the target key [targetKey release]; } // close the targets container key [targetsKey release]; } // close the current profile [profileKey release]; } [super viewWillAppear:animated]; } - (void)viewWillDisappear:(BOOL)animated { // save settings from controls into SyncML engine TSyError sta; // get the first profile's settings. PROFILEID_FIRST_OR_DEFAULT causes a default profile // to be created if none already exists SettingsKey *profileKey = [self.syncmlClient newProfileKeyForID:PROFILEID_FIRST_OR_DEFAULT]; if (profileKey) { // successfully opened current profile key. Now we can store the profile-level settings // - Server URL [profileKey setStringValueByName:"serverURI" toValue:self.serverURLfield.text]; // - user name [profileKey setStringValueByName:"serverUser" toValue:self.serverUserField.text]; // - password. Note that the password can be stored in the profile itself, but this is not recommended // for security reasons (it is stored only obfuscated, not encrypted). // Therefore, we store the password in the keychain, and the SyncMLClient object fetches it // from the keychain when needed while running a session. [[ZKeyChainWrapper sharedKeyChainWrapper] setPassword:self.serverPasswordField.text forService:[NSString stringWithFormat:@"SyncMLProfile.%d",[profileKey keyID]] account:@"SyncMLPassword" error:NULL ]; // Now save the per-datastore settings. In this sample, we only have one single datastore. // The datastores are identified by their , which is defined in the the // ios_syncclient_app_sample.xml config file. // For this app, the actual dbtypeid numeric value is defined as SYNCML_TARGET_DBID in AppDelegate.h // - first open the targets container (a "target" represents settings for one datastore) SettingsKey *targetsKey = [profileKey newOpenKeyByPath:"/targets" withMode:0 err:&sta]; if (sta==LOCERR_OK) { // successfully opened targets container // - now open the target we are interested in, by ID ( in the configuration XML file) // Note: See definition of SYNCML_TARGET_DBID in AppDelegate.h for explanation of standard // IDs to use with sample configurations as provided in libsynthesis and plan44.ch // SDKs. SettingsKey *targetKey = [targetsKey newOpenSubKeyByID:SYNCML_TARGET_DBID withMode:0 err:&sta]; if (sta==LOCERR_OK) { // successfully opened targets container key. Now we can save the datastore level settings // - always enable sync with our one and only datastore. For SyncML clients supporting multiple datastores, // the enable flag should be presented as a switch to the user to allow synchronizing just // some of the available datastores. [targetKey setIntValueByName:"enabled" toValue:1]; // - the server path for the contacts (defaults to "contacts") [targetKey setStringValueByName:"remotepath" toValue:self.datastorePathField.text]; // - the sync mode. This consists of the basic mode (twoway/fromserver/fromclient) plus // a flag with differentiates between slow or normal variant of the basic mode. // // Basic mode Slow end user selection // - ----------- ------ - ---------------- // 0 two way No 0 Normal // 0 two way Yes 1 Slow // 1 from server No 2 Update device // 1 from server Yes 3 Reload device // 2 from client No 4 Update server // 2 from client Yes 5 Reload server // // - get end user selection short userSyncMode = [self.datastoreSyncMode selectedRowInComponent:0]; // - basic mode [targetKey setIntValueByName:"syncmode" toValue:userSyncMode/2]; // - slow sync flag [targetKey setIntValueByName:"forceslow" toValue:(userSyncMode & 1)!=0]; // odd user selection number means slow-sync (=reload for one-way mode) // close the target key [targetKey release]; } // close the targets container key [targetsKey release]; } // close the current profile [profileKey release]; } [super viewWillDisappear:animated]; } @end syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/MainViewController.h0000644000373300037200000000157712424517753034542 0ustar00nightlyallusers00000000000000// // MainViewController.h // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 plan44.ch. All rights reserved. // #import "FlipsideViewController.h" #import "SyncMLClient.h" @interface MainViewController : UIViewController { // syncml client SyncMLClient *syncmlClient; } @property (strong, nonatomic) UIPopoverController *flipsidePopoverController; @property (retain, nonatomic) IBOutlet UILabel *targetStatusLabel; @property (retain, nonatomic) IBOutlet UILabel *globalStatusLabel; @property (retain, nonatomic) IBOutlet UIButton *startStopSyncButton; @property (retain, nonatomic) IBOutlet UIActivityIndicatorView *syncActivityIndicator; @property (readonly, nonatomic) SyncMLClient *syncmlClient; - (IBAction)showInfo:(id)sender; - (IBAction)startStopSync:(id)sender; @end syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/MainViewController.m0000644000373300037200000004072512424517753034545 0ustar00nightlyallusers00000000000000// // MainViewController.m // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 plan44.ch. All rights reserved. // #import "MainViewController.h" #include "AppDelegate.h" @interface MainViewController () // private methods declaration - (void)updateProgressInfo:(NSNotification *)aNotification; - (void)updateStaticStatus; + (NSString *)stringWithErrorText:(TSyError)aSta; + (NSString *)stringWithEventText:(NSDictionary *)aProgressInfoDict andTranspStatus:(TSyError)aTranspStatus; @end @implementation MainViewController @synthesize flipsidePopoverController = _flipsidePopoverController; @synthesize targetStatusLabel = _targetStatusLabel; @synthesize globalStatusLabel = _globalStatusLabel; @synthesize startStopSyncButton = _startStopSyncButton; @synthesize syncActivityIndicator = _syncActivityIndicator; - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // - install observer for sync progress [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateProgressInfo:) name:@"SyncMLClientProgress" object:nil ]; } - (void)viewDidUnload { [self setTargetStatusLabel:nil]; [self setGlobalStatusLabel:nil]; [self setStartStopSyncButton:nil]; [self setSyncActivityIndicator:nil]; [syncmlClient release]; syncmlClient = nil; [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // update the sync static status [self updateStaticStatus]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); } else { return YES; } } #pragma mark - Flipside View Controller - (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { [self dismissModalViewControllerAnimated:YES]; } else { [self.flipsidePopoverController dismissPopoverAnimated:YES]; } } - (void)dealloc { [_flipsidePopoverController release]; [_syncActivityIndicator release]; [super dealloc]; } - (IBAction)showInfo:(id)sender { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { FlipsideViewController *controller = [[[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil] autorelease]; controller.delegate = self; // pass it the SyncMLClient object controller.syncmlClient = self.syncmlClient; controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:controller animated:YES]; } else { if (!self.flipsidePopoverController) { FlipsideViewController *controller = [[[FlipsideViewController alloc] initWithNibName:@"FlipsideViewController" bundle:nil] autorelease]; controller.delegate = self; // pass it the SyncMLClient object controller.syncmlClient = self.syncmlClient; self.flipsidePopoverController = [[[UIPopoverController alloc] initWithContentViewController:controller] autorelease]; } if ([self.flipsidePopoverController isPopoverVisible]) { [self.flipsidePopoverController dismissPopoverAnimated:YES]; } else { [self.flipsidePopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } } } #pragma mark - SyncML client // On-demand creation of SyncML client object - (SyncMLClient *)syncmlClient { if (syncmlClient==nil) { // create syncML client syncmlClient = [[SyncMLClient alloc] initWithClientConfigFile: [[NSBundle mainBundle] pathForResource:@"ios_syncclient_app_sample" ofType:@"xml"] ]; // make main view controller the delegate syncmlClient.delegate = self; } return syncmlClient; } - (IBAction)startStopSync:(id)sender { // if not running - start sync // if running - suspend sync // if suspending - abort sync if (!self.syncmlClient.isRunning) { // not running - start sync // - turn on activity indicator [self.syncActivityIndicator startAnimating]; // - convert start button into suspend button [self.startStopSyncButton setTitle:@"Suspend sync" forState:UIControlStateNormal]; // - initiate sync [self.syncmlClient startWithProfileID:PROFILEID_FIRST inBackgroundThread:NO]; } else { // already running if (!self.syncmlClient.isSuspending) { // not yet suspending, try suspending [self.syncmlClient suspend]; // - convert suspend button into abort button [self.startStopSyncButton setTitle:@"Abort sync" forState:UIControlStateNormal]; } else { // already suspending, abort now [self.syncmlClient stop]; } } } #pragma mark - SyncMLClient delegate methods - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { // fatal error, end app process exit(1); } // SyncMLClient delegate method: fatal error occurred - (void)fatalSyncMLError:(NSString *)aErrorMsg syncMLClient:(SyncMLClient *)aSyncMLClient { UIActionSheet *alert = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat: @"Fatal error in SyncMLClient: %@", aErrorMsg ] delegate:(id)self cancelButtonTitle:@"Quit" destructiveButtonTitle:nil otherButtonTitles:nil ]; [alert showInView:self.view]; [alert release]; } // SyncMLClient delegate method: opportunity to define additional config vars before XML loading - (void)willInitSyncMLEngine:(SyncEngine *)aSyncEngine { // add setting of SyncML engine configuration variables here. // These will be set before the XML config is loaded TSyError sta; SettingsKey *configVarsKey = [aSyncEngine newOpenKeyByPath:"/configvars" withMode:0 err:&sta]; if (sta==LOCERR_OK) { #if DEBUG // In debug builds, direct XML configuration errors to console (stdout) [configVarsKey setStringValueByName:"conferrpath" toValue:@"console"]; #endif /* %%% enable these if you want a custom model or hardcoded URL // custom devInf model string [configVarsKey setStringValueByName:"custmodel" toValue:@"" CUSTOM_DEVINF_MODEL]; // custom predefined (fixed) URL [configVarsKey setStringValueByName:"serverurl" toValue:@"" CUSTOM_SERVER_URL]; */ } // done with config vars [configVarsKey release]; // if debug build, create the log subdirectory in the sandbox' tmp/, such that // the syncml engine will write detailed HTML logs. The engine checks the presence of // the log directory and disables logging if it is not present. // Note: this has to be in sync with the definition of "logpath" in the XML config #if DEBUG [[NSFileManager defaultManager] createDirectoryAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"tmp/sysynclogs"] withIntermediateDirectories:NO attributes:nil error:NULL]; #endif } // SyncMLClient delegate method: opportunity to create a default profile, return nil if none created - (SettingsKey *)newDefaultSyncMLProfileIn:(SettingsKey *)aProfilesKey { SettingsKey *profileKey = nil; /* // create new empty profile profileKey = [aProfilesKey newOpenSubKeyByID:KEYVAL_ID_NEW withMode:0 err:&lastStatus]; if (profileKey) { // created, now set some values [profileKey setStringValueByName:"serverURI" toValue:@"http://www.sampleserver.com/syncml" [profileKey setStringValueByName:"serverUser" toValue:@"user" [profileKey setStringValueByName:"serverPassword" toValue:@"supersecretpassword" // .... more setup } */ return profileKey; } // SyncMLClient delegate method: sync has completed - (void)completedSyncMLClientSync:(SyncMLClient *)aSyncMLClient { // Sync done // - turn off activity indicator [self.syncActivityIndicator stopAnimating]; // - button ready for starting next sync [self.startStopSyncButton setTitle:@"Start Sync" forState:UIControlStateNormal]; } #pragma mark - SyncML progress and status display // update static (non-syncing) status display - (void)updateStaticStatus { TSyError sta; // use global status label for "Last Sync" title self.globalStatusLabel.text = @"Last Synchronisation:"; // show the time of last sync of the datastore with ID SYNCML_TARGET_DBID // we need to open the current profile, and find the target with ID SYNCML_TARGET_DBID // (this is the of the datastore as configured in the xml config file) SettingsKey *profileKey = [self.syncmlClient newProfileKeyForID:PROFILEID_FIRST]; if (profileKey) { // successfully opened current profile key // - open the targets container (a "target" represents settings for one datastore) SettingsKey *targetsKey = [profileKey newOpenKeyByPath:"/targets" withMode:0 err:&sta]; if (sta==LOCERR_OK) { // successfully opened targets container // - now open the target we are interested in, which is that for the address book // by its ID 1001 SettingsKey *targetKey = [targetsKey newOpenSubKeyByID:SYNCML_TARGET_DBID withMode:0 err:&sta]; if (sta==LOCERR_OK) { // get the date of last sync NSDate *lastSync = [targetKey dateValueByName:"lastSync"]; // show formatted NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterMediumStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; self.targetStatusLabel.text = (lastSync==nil ? @"Never" : [formatter stringFromDate:lastSync]); [formatter release]; // close the target key [targetKey release]; } // close the targets container key [targetsKey release]; } // close the current profile [profileKey release]; } } - (void)updateProgressInfo:(NSNotification *)aNotification { // get textual message for error, nil if nothing to display for this event NSString *msg = [[self class] stringWithEventText:aNotification.userInfo andTranspStatus:syncmlClient.lastTransportStatus]; // if we got a message, show it if (msg) { // targetID determines which datastore this event is related to // - 0 means global event (no particular datastore) // - other values correspond with the of the datastore as configured in the // xml config file. For this sample implementation, we assume only one datastore // and show all datastore related info in targetStatusLabel if ([[aNotification.userInfo objectForKey:@"targetID"] intValue]!=0) { // event specifically related to a particular datastore, show it in the targetStatusLabel self.targetStatusLabel.text = msg; } else { // otherwise, assume the event is global self.globalStatusLabel.text = msg; } } } // error code as string // See SyncML DS specifications for Error codes 100..599 and syerror.h file for Synthesis SyncML // engine related error codes or refer to the "Error Codes" chapter in the SDK manual + (NSString *)stringWithErrorText:(TSyError)aSta { switch (aSta) { case LOCERR_OK : return @""; // ok case 406 : return @"Feature not supported"; case 401 : case 401+LOCAL_STATUS_CODE: case 407 : case 407+LOCAL_STATUS_CODE: case DB_Forbidden : return @"Access denied"; case DB_NotFound : return @"Server database not found"; case DB_NotFound+ LOCAL_STATUS_CODE : return @"Local database not found"; case DB_NotAllowed : return @"Not allowed"; case DB_Error : return @"Server Database error"; case DB_Error+ LOCAL_STATUS_CODE : return @"Local Database error"; case DB_Full : case DB_Full+ LOCAL_STATUS_CODE : return @"Datastore capacity exceeded"; case LOCERR_BADCONTENT : case LOCERR_PROCESSMSG : return @"Invalid data from server (wrong URL?)"; case LOCERR_NOCFG : return @"Configuration missing or no datastore enabled"; case LOCERR_EXPIRED : return @"License or demo period expired"; case LOCERR_USERABORT : return @"Aborted by user"; case LOCERR_BADREG : return @"License not valid here"; case LOCERR_LIMITED : return @"Limited trial version"; case LOCERR_INCOMPLETE : return @"Sync incomplete"; case LOCERR_OUTOFMEM : return @"Out of memory"; case LOCERR_TOONEW : return @"License too old for this version of the software"; case LOCERR_WRONGPROD : return @"License installed is not valid for this product"; case LOCERR_USERSUSPEND : return @"Suspended by User"; case LOCERR_LOCDBNOTRDY : return @"Local datastore not ready"; case LOCERR_TRANSPFAIL : return @"Network error - check internet connection"; case LOCERR_CERT_INVALID : return @"Invalid SSL Server certificate"; case LOCERR_CERT_EXPIRED : return @"Expired SSL Server certificate"; case LOCERR_BADURL : return @"Bad URL - probably http/https missing"; case LOCERR_SRVNOTFOUND : return @"Server not found - check URL"; default : return [NSString stringWithFormat:@"Error %hd",aSta]; } } + (NSString *)stringWithEventText:(NSDictionary *)aProgressInfoDict andTranspStatus:(TSyError)aTranspStatus { NSString *msg=nil; TSyError sta=LOCERR_OK; // get values from dict int eventtype = [[aProgressInfoDict valueForKey:@"eventtype"] intValue]; int extra1 = [[aProgressInfoDict valueForKey:@"extra1"] intValue]; int extra2 = [[aProgressInfoDict valueForKey:@"extra2"] intValue]; int extra3 = [[aProgressInfoDict valueForKey:@"extra3"] intValue]; switch (eventtype) { // transport-related case PEV_SENDSTART : msg = @"Sending..."; break; case PEV_SENDEND : msg = @"Waiting..."; break; case PEV_RECVSTART : msg = @"Receiving..."; break; case PEV_RECVEND : msg = @"Processing..."; break; case PEV_SESSIONSTART : msg = @"Starting..."; break; case PEV_SUSPENDING : msg = @"Suspending..."; break; case PEV_SESSIONEND : case PEV_SYNCEND : // session ended, probably with error in extra sta = extra1; if (sta==LOCERR_OK) msg = @"Sync successfully completed"; else { if (sta==LOCERR_TRANSPFAIL) sta = aTranspStatus; // use probably more detailed transport failure status msg = [NSString stringWithFormat:@"Sync failed: %@",[MainViewController stringWithErrorText:sta]]; } break; // datastore-related case PEV_PREPARING : msg = [NSString stringWithFormat:@"Checking %d/%d",extra1,extra2]; // preparing (e.g. preflight in some clients), extra1=progress, extra2=total break; case PEV_DELETING : msg = [NSString stringWithFormat:@"Deleting %d/%d",extra1,extra2]; // deleting (zapping datastore), extra1=progress, extra2=total break; case PEV_ALERTED : // datastore alerted (extra1=0 for normal, 1 for slow, 2 for first time slow, extra2=1 for resumed session) if (extra2==1) msg = @"Resumed "; else msg = @""; switch (extra1) { case 0 : msg = [msg stringByAppendingString:@"Normal Sync"]; break; case 1 : msg = [msg stringByAppendingString:@"Slow Sync"]; break; case 2 : msg = [msg stringByAppendingString:@"First Time Slow Sync"]; break; } break; case PEV_ITEMRECEIVED : msg = [NSString stringWithFormat:@"Received %d/%d",extra1,extra2]; // item received, extra1=current item count, extra2=number of expected changes (if >= 0) break; case PEV_ITEMSENT : msg = [NSString stringWithFormat:@"Sent %d/%d",extra1,extra2]; // item sent, extra1=current item count, extra2=number of expected items to be sent (if >=0) break; case PEV_ITEMPROCESSED : msg = [NSString stringWithFormat:@"Added %d, Updated %d, Deleted %d",extra1,extra2,extra3]; // item processed break; } return msg; } @end READ-ME-iOS_syncclient_sample.txt0000644000373300037200000001127312424517753036560 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sampleSample code for libsynthesis on iOS =================================== This directory contains a fully functional Cocoa touch based iPhone application using libsynthesis for iPhone to implement two-way SyncML synchronisation of contacts and calendar stored in TAB separated text files (using the built-in textdb plugin). Note that plan44.ch licenses commercial plugins for iOS native contacts and calendars, which are not part of libsynthesis. Direct mapping to SQLite3 databases however is part of libsynthesis and can be used to create sync apps without writing DB plugins. See doc/SySync_config_reference.pdf for information about configuration of libsynthesis. Due to the requirement of static linking in iOS, libsynthesis cannot be linked into a iOS app project without also linking another *.a library containing 4 custom plugins (named iphone_dbplugin1..4). The SDK provides a sample project with those 4 (dummy) plugins, which builds such a library (src/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj). By adding functionality into the sample_dbplugin1..4.mm/.h files, up to 4 different custom DB backends can be implemented. Please contact plan44.ch for licensing conditions for the native contacts and calendar plugins. SyncML Client sample application -------------------------------- The sample application shows how to interface with the libsynthesis to configure the settings and how to run a sync session. The UI is minimal but fully functional. The "SyncMLClientSample" application is based on the "Utility Application" XCode template which is part of the iPhone OS SDK. It includes libsynthesis and the 4 dummy DB plugins as subprojects. To build and run the SyncMLClientSample iPhone application, take the following steps: 1) Open the "ios_syncclient_app_sample.xcodeproj" XCode project using a recent XCode version with a iOS SDK >4.2 2) Choose the "ios_syncclient_app_sample" target. 3) Set the desired target SDK/Platform. You can build for the simulator or the device. For the device, you need to configure the codesign certificates in the target settings. 4) Build the project to create the "ios_syncclient_app_sample.app" application. 5) Run the app (in the simulator or on a connected debug iOS device. Press the small "i" button to open the settings screen where you can put in a SyncML server URL, login, server path and sync mode. Press "Start Synchronisation" to start a sync session synchronizing the contents of TAB separated text files in the /Documents directory of the app's sandbox to a SyncML server. Linking information ------------------- libsynthesis and the plugins are linked as static libraries (iOS does not allow dylibs). For that, the library projects are included as subprojects into the sample app project. Two settings need to be made to have XCode build and link everything (these are already set up in the sample project, but are important to understand in case you want to use another libsynthesis target or another plugin library) 1) In the app's target settings under "build phases", "target dependencies" need to be defined for the libsynthesis target you want to use and for the plugin library target. 2) Also in the app's target settings, under "build phases", "link binary with libraries" the actual library builds (.a files) need to be selected. When you press "+", the first folder presented is called "workspace" and lists the libraries available. Note: The Debug target build configuration has a GCC_PREPROCESSOR_DEFINITIONS setting DEBUG=1. The DEBUG symbol is used to switch on some extra debug information to the console. Make sure you DONT have DEBUG defined in release builds! The Cocoa wrapper classes for the Sync Engine, Settings Keys, and DB Plugins ---------------------------------------------------------------------------- libsynthesis includes three Objective C wrapper files in the "src/sysync_SDK/sdk_sources_cocoa" which wrap the quite complex libsynthesis C API into easy to use Cocoa objects. The sample project uses the wrapper for the sync engine itself (SyncEngine object, used within the SyncMLClient object), for a sync session (SyncSession object) and for the settings key (SettingsKey object). The SettingsKey object has basic KVC capability so it can be used with UI components which use KVC to address their content (this feature is however not used in the sample app, instead direct accessor methods modelled after the C API of the library are used). The file "dbplugin_cocoa" contains wrapper classes for creating custom database adaptor plugins. The dbplugin_cocoa_sample_ios.xcodeproj project contains a set of 4 dummy DB plugins that can be extended to create real DB plugins. (c) 2011-2012 by plan44.chsyncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/0000755000373300037200000000000012424517753033100 5ustar00nightlyallusers00000000000000SyncMLClient.h0000644000373300037200000000506212424517753035501 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient// // SyncMLClient.h // // Created by Lukas Zeller on 2011/02/03. // Copyright 2011 plan44.ch. All rights reserved. // #import #import "SyncEngine.h" #import "ZWebRequest.h" @class SyncMLClient; // Special Profile IDs #define PROFILEID_FIRST -1 // first profile #define PROFILEID_FIRST_OR_DEFAULT -2 // first profile, or newly created default profile if no profile already exists #define PROFILEID_ALL_ENABLED -3 // all profiles enabled for global sync #define PROFILEID_NONE -999 // no profile // custom progress events #define PEV_PROFILEID PEV_CUSTOM_START // extra1=profileID @protocol SyncMLClientDelegate @optional // initialisation - (void)fatalSyncMLError:(NSString *)aErrorMsg syncMLClient:(SyncMLClient *)aSyncMLClient; // report fatal syncml engine error - (void)willInitSyncMLEngine:(SyncEngine *)aSyncEngine; // opportunity to define additional config vars before XML loading - (SettingsKey *)newDefaultSyncMLProfileIn:(SettingsKey *)aProfilesKey; // opportunity to create a default profile, return nil if none created // running syncs - (void)completedSyncMLClientSync:(SyncMLClient *)aSyncMLClient; @end @interface SyncMLClient : ZWebRequest { NSString *clientConfigFile; SyncEngine *syncEngine; TSyError lastStatus; // last status encountered from engine TSyError sessionEndStatus; // end of session status // transport TSyError lastTransportStatus; // last transport status // running sync session SyncSession *syncSession; sInt32 profileSelector; uInt16 stepCmd; BOOL loggingSession; BOOL suspendRequest; BOOL suspendRequested; BOOL abortRequested; BOOL runsInBackgroundThread; BOOL localDataChanged; @private // these need to be kept between startDataExchange and startDataWait memSize syncmlRequestSize; NSString *syncMLURL; // the SyncML URL } @property(readonly) NSString *syncMLURL; @property(readonly) SyncEngine *syncEngine; @property(readonly) TSyError lastStatus; @property(readonly) TSyError lastTransportStatus; @property(readonly) TSyError sessionEndStatus; @property(readonly) BOOL isRunning; @property(readonly) BOOL isSuspending; @property(readonly) BOOL localDataChanged; @property(readonly) BOOL loggingSession; // configure - (id)initWithClientConfigFile:(NSString *)aClientConfigFile; - (SettingsKey *)newProfilesKey; - (SettingsKey *)newProfileKeyForID:(sInt32)aProfileID; - (SettingsKey *)newDefaultProfileKey; // run sync - (BOOL)startWithProfileID:(sInt32)aProfileID inBackgroundThread:(BOOL)aInBackgroundThread; - (void)suspend; - (void)stop; @end // SyncMLClient SyncMLClient.m0000644000373300037200000006057612424517753035521 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient// // SyncMLClient.m // TodoZ // // Created by Lukas Zeller on 2011/02/03. // Copyright 2011 plan44.ch. All rights reserved. // #import "SyncMLClient.h" #import "ZKeyChainWrapper.h" @interface SyncMLClient () // private methods - (void)fatalError:(NSString *)aErrorMsg; - (void)updateProgressStatus:(TEngineProgressInfo *)aProgressInfoP; @end @implementation SyncMLClient @synthesize lastStatus; @synthesize syncMLURL; @synthesize lastTransportStatus; @synthesize sessionEndStatus; @synthesize localDataChanged; @synthesize loggingSession; - (id)initWithClientConfigFile:(NSString *)aClientConfigFile { if ((self = [super init])) { syncEngine = nil; clientConfigFile = [aClientConfigFile retain]; NSAssert(clientConfigFile, @"SyncMLClient: initWithClientConfigFile: No config file path specified"); syncSession = nil; syncMLURL = nil; localDataChanged = NO; loggingSession = NO; abortRequested = NO; suspendRequest = NO; suspendRequested = NO; runsInBackgroundThread = NO; lastStatus = LOCERR_WRONGUSAGE; lastTransportStatus = LOCERR_WRONGUSAGE; } return self; } - (void)dealloc { [syncSession release]; syncSession=nil; [syncEngine release]; syncEngine=nil; [clientConfigFile release]; clientConfigFile=nil; [syncMLURL release]; syncMLURL=nil; [super dealloc]; // includes stop } #pragma private methods - (void)fatalError:(NSString *)aErrorMsg { DBGNSLOG(@"fatalError: %@",aErrorMsg); if (self.delegate && [self.delegate respondsToSelector:@selector(fatalSyncMLError:syncMLClient:)]) { [self.delegate fatalSyncMLError:aErrorMsg syncMLClient:self]; } } #pragma mark Setting up the SyncML engine // standard configuration of sync engine (before config XML loading) // - calls delegate to add custom config // - can also be derived to add custom config - (TSyError)configSyncEngine:(SyncEngine *)aSyncEngine { TSyError sta; SettingsKey *configVarsKey = [syncEngine newOpenKeyByPath:"/configvars" withMode:0 err:&sta]; if (sta==LOCERR_OK) { // sandbox home path [configVarsKey setStringValueByName:"sandbox" toValue:NSHomeDirectory()]; // pass debug status to config #if DEBUG [configVarsKey setStringValueByName:"debugbuild" toValue:@"1"]; #endif // done with config vars } [configVarsKey release]; // call delegate if (self.delegate && [delegate respondsToSelector:@selector(willInitSyncMLEngine:)]) { [self.delegate willInitSyncMLEngine:syncEngine]; } return sta; } - (SyncEngine *)syncEngine { if (!syncEngine) { // Init SyncML engine lastStatus = LOCERR_OK; // - create the engine syncEngine = [[SyncEngine alloc] initWithLibraryPath:@"dummy_because_statically_linked" andDebugFlags:0 andEntryPointPrefix:@"SySync_" // client entry point ]; DBGNSLOG(@"after SyncEngine init, syncEngine=0x%lX",(unsigned long)(void *)syncEngine); if (syncEngine == nil) { [self fatalError:@"Cannot initialize Sync Engine library as client"]; return nil; } // pre-set some config vars [self configSyncEngine:syncEngine]; // init engine with config lastStatus = [syncEngine initEngineFile:clientConfigFile]; DBGNSLOG(@"initEngineFile:%@ sta=%hd\n",clientConfigFile,lastStatus); if (lastStatus != LOCERR_OK) { if (lastStatus == LOCERR_BADREG) { // unregistered - still allow start-up DBGNSLOG(@"xml config returned LOCERR_BADREG - ignore for now"); } else if (lastStatus == LOCERR_EXPIRED) { // expired - display appropriate message [self fatalError:@"application expired"]; } else { [self fatalError:[NSString stringWithFormat:@"Cannot read XML config - err=%hd\n",lastStatus]]; } } // show some config vars again SettingsKey *configVarsKey = [syncEngine newOpenKeyByPath:"/configvars" withMode:0 err:&lastStatus]; if (lastStatus==LOCERR_OK) { DBGNSLOG(@"logpath = %@\n", [configVarsKey stringValueByName:"logpath"]); } else { DBGNSLOG(@"error opening /configvars, sta=%hd\n",lastStatus); } [configVarsKey release]; } return syncEngine; } #pragma mark configuration management /// create a new default profile (and return the newly created key) - (SettingsKey *)newDefaultProfileKey:(SettingsKey *)aProfilesKey { SettingsKey *profileKey = nil; if (delegate && [delegate respondsToSelector:@selector(newDefaultSyncMLProfileIn:)]) { profileKey = [delegate newDefaultSyncMLProfileIn:aProfilesKey]; } if (!profileKey) { profileKey = [aProfilesKey newOpenSubKeyByID:KEYVAL_ID_NEW_DEFAULT withMode:0 err:&lastStatus]; } return profileKey; } /// create a new profile with default values /// Note: default value are either engine-level or obtained via newDefaultSyncMLProfileIn delegate method - (SettingsKey *)newDefaultProfileKey { SettingsKey *profilesKey = [self newProfilesKey]; SettingsKey *newProfile = [self newDefaultProfileKey:profilesKey]; if (newProfile) [newProfile ownParent:profilesKey]; [profilesKey release]; return newProfile; } - (SettingsKey *)newProfilesKey { return [self.syncEngine newOpenKeyByPath:"/profiles" withMode:0 err:&lastStatus ]; } /// open a key for a given profile. /// @param aProfileID profile to open /// PROFILEID_FIRST=first, /// PROFILEID_FIRST_OR_DEFAULT=first, and create default profile if none exists so far - (SettingsKey *)newProfileKeyForID:(sInt32)aProfileID { // open profiles SettingsKey *profileKey = nil; SettingsKey *profilesKey = [self newProfilesKey]; if (lastStatus==LOCERR_OK) { if (aProfileID>=0) { // specific profile profileKey = [profilesKey newOpenSubKeyByID:aProfileID withMode:0 err:&lastStatus]; } else if (aProfileID==PROFILEID_FIRST || aProfileID==PROFILEID_FIRST_OR_DEFAULT) { // load first profile profileKey = [profilesKey newOpenSubKeyByID:KEYVAL_ID_FIRST withMode:0 err:&lastStatus]; // if no profile at all, create default profile if (lastStatus==DB_NoContent && (aProfileID==PROFILEID_FIRST_OR_DEFAULT)) { profileKey = [self newDefaultProfileKey:profilesKey]; } } // attach container to the returned key, will be closed with it if (profileKey) [profileKey ownParent:profilesKey]; [profilesKey release]; } return profileKey; } #pragma mark running a sync session - (BOOL)isRunning { // when we have a sync session, it is running return syncSession!=nil; } - (BOOL)isSuspending { // running sync session and suspend request pending or processing return self.isRunning && (suspendRequest || suspendRequested); } /// start sync with specified profileID /// @param aProfileID profile to sync /// @return YES if sync could be initiated. - (BOOL)startWithProfileID:(sInt32)aProfileID inBackgroundThread:(BOOL)aInBackgroundThread { if (!self.isRunning) { // start new sync // - check for loggin in the profile SettingsKey *profileKey = [self newProfileKeyForID:aProfileID]; if (profileKey) { // save profileSelector profileSelector = aProfileID; // determine if logging this session loggingSession = ([profileKey intValueByName:"profileFlags"] & PROFILEFLAG_LOGNEXTSYNC)!=0; [profileKey release]; // if so, make sure logging dir exists, as this makes the engine actually creating logs. // Note: for DEBUG builds, always create the logdir #ifndef ALWAYS_KEEP_SYNC_LOGS if (loggingSession) #endif { // - get log path as configured SettingsKey *configVarsKey = [self.syncEngine newOpenKeyByPath:"/configvars" withMode:0 err:&lastStatus]; NSString *logpath = [configVarsKey stringValueByName:"logpath"]; [configVarsKey release]; NSError *nserror; // make sure log directory exists [[NSFileManager defaultManager] createDirectoryAtPath:logpath withIntermediateDirectories:NO attributes:nil error:&nserror]; DBGNSLOG(@"Session will create logs in %@",logpath); } } // - init flags suspendRequest = NO; suspendRequested = NO; localDataChanged = NO; // nothing changed yet // create a new session syncSession = [self.syncEngine newOpenSessionWithSelector:aProfileID andSessionName:"syncMLiOS" err:&lastStatus]; if (lastStatus!=LOCERR_OK) { if (lastStatus==LOCERR_EXPIRED) { [self fatalError:@"Demo library or license has expired"]; } else { [self fatalError:[NSString stringWithFormat:@"Cannot open a sync session handle, error=%d",lastStatus]]; } return NO; // failed } // - initialize stepping state stepCmd = STEPCMD_CLIENTSTART; // - issue pseudo-event TEngineProgressInfo pi; pi.eventtype = PEV_PROFILEID; pi.extra1 = aProfileID; pi.targetID = 0; [self updateProgressStatus:&pi]; // - start sync runsInBackgroundThread = aInBackgroundThread; if (runsInBackgroundThread) { // on a separate thread [self performSelectorInBackground:@selector(syncThreadMain) withObject:nil]; } else { // on main thread [self performSelector:@selector(nextSyncStep) withObject:nil afterDelay:0]; } return YES; // initiated } return NO; // already running, not initiated again } - (void)suspend { if (!suspendRequest) { suspendRequest = YES; // request pending suspendRequested = NO; // not yet proapagated to engine // issue a pseudo early "suspending" event such that we have immediate feedback TEngineProgressInfo pi; pi.eventtype = PEV_SUSPENDING; pi.targetID = 0; [self updateProgressStatus:&pi]; } } - (void)stop { // signal abort to engine abortRequested = YES; // make sure pending network request ends as well [self abortRequest]; } #pragma mark - internal methods for transport handling // called in all cases, on failure as well as on success // on transport level failure, failedWebRequestWithReadStream will be called before - (void)completedWebRequestWithStatus:(CFIndex)aHTTPStatus { // ended network activity [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // check status if (aHTTPStatus==200) { // pass filled buffer back to engine [syncSession retSyncMLBufferForSend:NO processed:self.answerSize]; // all data received, signal "got data" for next step stepCmd = STEPCMD_GOTDATA; // signal engine that we have received response data } else { // SyncML request failed stepCmd = STEPCMD_TRANSPFAIL; // signal engine that transport failed // see if we need to analyze the HTTP answer code if (lastTransportStatus==LOCERR_OK) { // no details about transport failure yet, try to get some useful info from HTTP response switch (aHTTPStatus) { case 404: lastTransportStatus = LOCERR_SRVNOTFOUND; break; case 401: case 403: lastTransportStatus = LOCERR_AUTHFAIL; break; case ZWEBREQUEST_STATUS_NONE: lastTransportStatus = LOCERR_BADCONTENT; break; // apparently not HTTP case ZWEBREQUEST_STATUS_ABORTED: lastTransportStatus = LOCERR_USERABORT; break; case ZWEBREQUEST_STATUS_NETWORK_ERROR: lastTransportStatus = LOCERR_TRANSPFAIL; break; default: lastTransportStatus = LOCERR_TRANSPFAIL; break; } } } // done with reqest [syncMLURL release]; syncMLURL=nil; // make sure engine gets called next [self performSelector:@selector(nextSyncStep) withObject:nil afterDelay:0]; } // called BEFORE completedWebRequestWithStatus in case there are transport level problems - (void)failedWebRequestWithReadStream:(CFReadStreamRef)aReadStream { CFErrorRef streamErr; streamErr = CFReadStreamCopyError(aReadStream); CFIndex errCode = CFErrorGetCode(streamErr); // now catch some of the distinct error codes to cause better display in the UI switch (errCode) { // CFNetwork case kCFErrorHTTPBadURL : lastTransportStatus = LOCERR_BADURL; break; case kCFHostErrorHostNotFound : lastTransportStatus = LOCERR_SRVNOTFOUND; break; // SSL case kCFURLErrorServerCertificateHasBadDate: case kCFURLErrorServerCertificateNotYetValid: case -9828: // errSSLPeerCertExpired, but SecureTransport.h is missing in SDK. Probably device never returns this, but Simulator does lastTransportStatus = LOCERR_CERT_EXPIRED; break; case kCFURLErrorServerCertificateUntrusted: case kCFURLErrorServerCertificateHasUnknownRoot: case kCFURLErrorSecureConnectionFailed: lastTransportStatus = LOCERR_CERT_INVALID; // invalid cert (or general SSL error) break; default: // catch-all other SSL errors that largely mean invalid certificate // SecureTransport.h is missing in iPhone OS device SDK headers if (errCode<=-9807 && errCode>=-9849) // errSSLXCertChainInvalid..errCode>=errSSLLast (SecureTransport.h is missing in SDK. Probably device never returns these, but Simulator does) lastTransportStatus = LOCERR_CERT_INVALID; // invalid cert (or general SSL error) else lastTransportStatus = LOCERR_TRANSPFAIL; // general network error break; } } // Start SyncML data exchange by setting up SyncML request to server // Note: as request exchange is one operation, actual exchange will start not before startDataWait - (BOOL)startDataExchange { // no transport failure so far lastTransportStatus = LOCERR_OK; // get params from session SettingsKey *sessionKey = [syncSession newOpenSessionKeyWithMode:0 err:&lastStatus]; if (lastStatus!=LOCERR_OK) return false; // error // get URL [syncMLURL release]; syncMLURL = [[sessionKey stringValueByName:"connectURI"] retain]; // get content type self.contentType = [sessionKey stringValueByName:"contenttype"]; // get extra HTTP parameters from profile SettingsKey *profileKey = [sessionKey newOpenKeyByPath:"profile" withMode:0 err:&lastStatus]; if (lastStatus==LOCERR_OK) { // we can access the profile, get extra params if ([profileKey intValueByName:"transpFlags"] & TRANSPFLAG_USEHTTPAUTH) { // Use HTTP auth self.httpUser = [profileKey stringValueByName:"transportUser"]; // get PW from keychain self.httpPassword = [[ZKeyChainWrapper sharedKeyChainWrapper] passwordForService:[NSString stringWithFormat:@"SyncMLProfile.%d",[profileKey keyID]] account:@"transportPassword" error:NULL ]; } else { // do not use HTTP auth self.httpUser = nil; self.httpPassword = nil; } // - use system proxy switch self.useSysProxy = [profileKey intValueByName:"useConnectionProxy"]; // - SSL self.ignoreSSLErrors = [profileKey intValueByName:"transpFlags"] & TRANSPFLAG_SSLIGNORECERTFAIL; // done [profileKey release]; } // close session key [sessionKey release]; // send data to server and expect answer appPointer syncmlRequestData; lastStatus = [syncSession getSyncMLBufferForSend:YES buffer:&syncmlRequestData bufSize:&syncmlRequestSize]; if (lastStatus==LOCERR_OK) { // prepare request [self setRequestBuffer:syncmlRequestData withSize:syncmlRequestSize]; } // Don't start sending yet, first call sync engine again to indicate we have acknowledged the data return lastStatus==LOCERR_OK; } - (BOOL)startDataWait { // send as POST request if ([self sendRequestToURL:self.syncMLURL withHTTPMethod:@"POST"]) { // request initiated // - starting network activity [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; // started ok lastStatus=LOCERR_OK; } else { // failed starting request lastStatus=LOCERR_TRANSPFAIL; // failed } // anyway, release SyncML request buffer [syncSession retSyncMLBufferForSend:YES processed:syncmlRequestSize]; // prepare answer buffer if (lastStatus==LOCERR_OK) { // get the buffer to put SyncML response into appPointer syncmlAnswerData; // buffer pointer (received from SyncML engine) memSize syncmlAnswerMax; // size of buffer lastStatus = [syncSession getSyncMLBufferForSend:NO buffer:&syncmlAnswerData bufSize:&syncmlAnswerMax]; if (lastStatus==LOCERR_OK) { [self setAnswerBuffer:syncmlAnswerData withSize:syncmlAnswerMax]; } } // in case of successful start, completedWebRequestWithStatus will continue execution of sync session return lastStatus==LOCERR_OK; } # pragma mark internal methods for running sync - (void)sendAndReleaseProgressDict:(NSDictionary *)aDict { [[NSNotificationCenter defaultCenter] postNotificationName:@"SyncMLClientProgress" // the name object:self // the sender userInfo:aDict ]; // done [aDict release]; } // report progress - (void)updateProgressStatus:(TEngineProgressInfo *)aProgressInfoP { // Show status to console when compiled with DEBUG=1 defined DBGNSLOG( @"*** Got SyncML Client progress Info: eventtype=%hd, targetid=%ld, extra1=%ld, extra2=%ld, extra3=%ld\n", aProgressInfoP->eventtype, (long int)aProgressInfoP->targetID, aProgressInfoP->extra1, aProgressInfoP->extra2, aProgressInfoP->extra3 ); // check for event that means local data has changed if (aProgressInfoP->eventtype==PEV_ITEMRECEIVED || aProgressInfoP->eventtype==PEV_DELETING) localDataChanged = YES; // check for event that delivers session status if (aProgressInfoP->eventtype==PEV_SESSIONEND) sessionEndStatus = aProgressInfoP->extra1; // make dict NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt:aProgressInfoP->eventtype], @"eventtype", [NSNumber numberWithInt:aProgressInfoP->targetID], @"targetID", [NSNumber numberWithInt:aProgressInfoP->extra1], @"extra1", [NSNumber numberWithInt:aProgressInfoP->extra2], @"extra2", [NSNumber numberWithInt:aProgressInfoP->extra3], @"extra3", nil ]; // deliver to main thread if (runsInBackgroundThread) { // execute progress notification on the main thread [self performSelectorOnMainThread:@selector(sendAndReleaseProgressDict:) withObject:dict waitUntilDone:YES]; } else { // we are on the main thread, directly send [self sendAndReleaseProgressDict:dict]; } } - (void)notifyDelegateOfEndOfSync { if (delegate && [delegate respondsToSelector:@selector(completedSyncMLClientSync:)]) { [delegate completedSyncMLClientSync:self]; } } // execute next step of a sync session - (BOOL)nextSyncStep { TEngineProgressInfo progressInfo; TSyError sta; BOOL scheduleNextStepNow = YES; BOOL initSession = stepCmd==STEPCMD_CLIENTSTART || stepCmd==STEPCMD_CLIENTAUTOSTART; // take next step // - first check for suspend or abort, if so, modify step command for next step if (abortRequested) { DBGNSLOG(@"!!! abort request detected - setting stepCmd to STEPCMD_ABORT"); stepCmd = STEPCMD_ABORT; abortRequested = NO; } else if (suspendRequest) { DBGNSLOG(@"!!! suspend request detected - setting stepCmd to STEPCMD_SUSPEND"); stepCmd = STEPCMD_SUSPEND; suspendRequest = NO; suspendRequested = YES; // flag for two step button to issue an abort on second use } DBGNSLOG(@"runSyncStep calling sessionStepWithCmd:%hd",stepCmd); sta = [syncSession sessionStepWithCmd:&stepCmd andProgressInfo:&progressInfo]; DBGNSLOG(@"- sessionStepWithCmd returned stepCmd:%hd sta=%d", stepCmd, sta); if (sta!=LOCERR_OK) { // fatal error, immediately terminate with error DBGNSLOG(@"-> unexpected error %hd while processing session step - discontinue session",sta); } else { // step ran ok, evaluate step command if (initSession) { // Note: the following code can be used to provide the session password on-the-fly // rather than relying on passwords stored in the profile (which is stored obfuscated, // but not hard encrypted). For example, passwords can be stored in the keychain // or requested from the user via a dialog, depending on security needs. // For simplicity of this sample however the password is stored in the profile. // last step was initializing the session, now provide session password from keychain SettingsKey *sessionKey = [syncSession newOpenSessionKeyWithMode:0 err:&sta]; if (sta==LOCERR_OK) { SettingsKey *profileKey = [sessionKey newOpenKeyByPath:"profile" withMode:0 err:&sta]; if (sta==LOCERR_OK) { [sessionKey setStringValueByName:"sessionPassword" toValue: [[ZKeyChainWrapper sharedKeyChainWrapper] passwordForService:[NSString stringWithFormat:@"SyncMLProfile.%d",[profileKey keyID]] account:@"SyncMLPassword" error:NULL ] ]; [profileKey release]; } [sessionKey release]; } } switch (stepCmd) { case STEPCMD_OK: // no progress info, call step again stepCmd = STEPCMD_STEP; break; case STEPCMD_PROGRESS: // new progress info to show [self updateProgressStatus:&progressInfo]; stepCmd = STEPCMD_STEP; break; case STEPCMD_ERROR: // error, terminate (should not happen, as status is already checked above) break; case STEPCMD_RESTART: // make sure connection is closed and will be re-opened for next request // %%% Nop at this time as we don't keep the connection anyway in this simplified sample stepCmd = STEPCMD_STEP; break; case STEPCMD_SENDDATA: // send data to remote if (![self startDataExchange]) stepCmd = STEPCMD_TRANSPFAIL; else stepCmd = STEPCMD_SENTDATA; // signal engine that we have sent the request data break; case STEPCMD_NEEDDATA: // initiate receiving data if ([self startDataWait]) { // start waiting initiated - let runloop notify us when complete scheduleNextStepNow = NO; // end of receiving data will restart the timer } else stepCmd = STEPCMD_TRANSPFAIL; // failure break; } // switch stepcmd } // check for end of session if (stepCmd==STEPCMD_DONE || stepCmd==STEPCMD_ERROR) { // done with session DBGNSLOG(@"SyncML Session terminated with stepCmd:%hd, sessionEndStatus=%hd",stepCmd,sessionEndStatus); // release session [syncSession release]; syncSession = nil; // reset logging flag if we did log if (loggingSession) { SettingsKey *profileKey = [self newProfileKeyForID:profileSelector]; if (profileKey) { // reset log session flag in profile uInt32 profileFlags = [profileKey intValueByName:"profileFlags"]; [profileKey setIntValueByName:"profileFlags" toValue:profileFlags & ~PROFILEFLAG_LOGNEXTSYNC]; [profileKey release]; DBGNSLOG(@"Session was logging, reset log-next-sync flag in profile now"); } } // done if (runsInBackgroundThread) { // just clear the background running flag, this will exit the background thread runsInBackgroundThread = NO; // stop the current runloop CFRunLoopStop(CFRunLoopGetCurrent()); } else { // directly inform delegate if requested [self notifyDelegateOfEndOfSync]; } return NO; // no next step } else if (scheduleNextStepNow) { // continues, let runloop issue next step shortly [self performSelector:@selector(nextSyncStep) withObject:nil afterDelay:0]; } return YES; // next step scheduled directly or will be issued by network callback later } // nextSyncStep #pragma mark - support for running sync on a background thread - (void)syncThreadMain { if (runsInBackgroundThread) { // set up autorelease pool NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Top-level pool // init a run loop NSRunLoop* myRunLoop = [NSRunLoop currentRunLoop]; // runloop is created on demand if it does not yet exist // add a timer source to fire the next sync step [self performSelector:@selector(nextSyncStep) withObject:nil afterDelay:0]; // now run the loop do { // Start the run loop for 10 seconds max, but return after each source is handled. SInt32 result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES); // If a source explicitly stopped the run loop, or if there are no // sources or timers, go ahead and exit. if ((result == kCFRunLoopRunStopped) || (result == kCFRunLoopRunFinished)) { runsInBackgroundThread = NO; // done } } while (runsInBackgroundThread); // done with the thread [pool release]; } // have delegate informed on main thread [self performSelectorOnMainThread:@selector(notifyDelegateOfEndOfSync) withObject:nil waitUntilDone:YES]; } @end // SyncMLClient ZKeyChainWrapper.h0000644000373300037200000000260212424517753036360 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient// // ZKeyChainWrapper.h // // Created by Lukas Zeller on 2011/08/16. // Copyright 2011 plan44.ch. All rights reserved. // #import #import #import #if TARGET_IPHONE_SIMULATOR && __IPHONE_OS_VERSION_MAX_ALLOWED < 30000 #error "requires iOS 3.0 or later for testing on simulator (but works on iPhoneOS 2.x devices)" #endif enum { kZKeyChainWrapperErrorBadArguments = -1001, kZKeyChainWrapperErrorNoPassword = -1002 }; extern NSString* const kZKeyChainWrapperErrorDomain; @interface ZKeyChainWrapper : NSObject { NSString *servicePrefix; } /// returns a shared instance of the keyChain wrapper using the bundle identifier /// (plus a dot) as a prefix to service and account strings + (ZKeyChainWrapper *)sharedKeyChainWrapper; /// create a keychain wrapper with a custom service prefix (can be nil to have none) - (id)initWithServicePrefix:(NSString *)aServicePrefix; /// access the passwords - (NSString *)passwordOrEmptyForService:(NSString *)service account:(NSString *)account; - (NSString *)passwordForService:(NSString *)service account:(NSString *)account error:(NSError **)error; - (BOOL)removePasswordForService:(NSString *)service account:(NSString *)account error:(NSError **)error; - (BOOL)setPassword:(NSString *)password forService:(NSString *)service account:(NSString *)account error:(NSError **)error; @end ZKeyChainWrapper.m0000644000373300037200000001105512424517753036367 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient// // ZKeyChainWrapper.m // // Created by Lukas Zeller on 2011/08/16. // Copyright 2011 plan44.ch. All rights reserved. // #import "ZKeyChainWrapper.h" @implementation ZKeyChainWrapper static ZKeyChainWrapper *sharedKeyChainWrapper = nil; NSString* const kZKeyChainWrapperErrorDomain = @"ch.plan44.ZKeyChainWrapper"; - (id)initWithServicePrefix:(NSString *)aServicePrefix { if ((self = [super init])) { servicePrefix = [aServicePrefix retain]; } return self; } - (void)dealloc { [servicePrefix release]; [super dealloc]; } + (ZKeyChainWrapper *)sharedKeyChainWrapper { if (!sharedKeyChainWrapper) { sharedKeyChainWrapper = [[self alloc] initWithServicePrefix: [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"] stringByAppendingString:@"."] ]; } return sharedKeyChainWrapper; } // Most useful info about keychain on iOS so far: // http://useyourloaf.com/blog/2010/4/28/keychain-duplicate-item-when-adding-password.html // Main point is that Apple sample is wrong - what constitues the unique key is account & service, not AttrGeneric - (NSMutableDictionary *)keychainQueryForService:(NSString *)service account:(NSString *)account { NSString *uniqueService = [servicePrefix stringByAppendingString:service]; NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys: (id)kSecClassGenericPassword, (id)kSecClass, // class is "generic password" [uniqueService dataUsingEncoding:NSUTF8StringEncoding], (id)kSecAttrGeneric, // use service as generic attr as well, must be NSData! account, (id)kSecAttrAccount, uniqueService, (id)kSecAttrService, nil ]; return query; } - (NSString *)passwordOrEmptyForService:(NSString *)service account:(NSString *)account { NSString *result = [self passwordForService:service account:account error:NULL]; if (!result) result = @""; return result; } - (NSString *)passwordForService:(NSString *)service account:(NSString *)account error:(NSError **)error { OSStatus status = kZKeyChainWrapperErrorBadArguments; NSString *result = nil; if ([service length]>0 && [account length]>0) { CFDataRef passwordData = NULL; // get the basic query data NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; // add specifics for finding a entry [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; // return password data (rather than all attributes with kSecReturnAttributes=YES) [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; // only one in case of multiples // issue query status = SecItemCopyMatching( (CFDictionaryRef)keychainQuery, (CFTypeRef *)&passwordData ); if (status==noErr && [(NSData *)passwordData length]>0) { // we got a password result = [[[NSString alloc] initWithData:(NSData *)passwordData encoding:NSUTF8StringEncoding ] autorelease]; } if (passwordData!=NULL) { CFRelease(passwordData); } } if (status!=noErr && error!=NULL) { *error = [NSError errorWithDomain:kZKeyChainWrapperErrorDomain code:status userInfo:nil]; } return result; } - (BOOL)removePasswordForService:(NSString *)service account:(NSString *)account error:(NSError **)error { OSStatus status = kZKeyChainWrapperErrorBadArguments; if ([service length]>0 && [account length]>0) { NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; status = SecItemDelete((CFDictionaryRef)keychainQuery); } if (status!=noErr && error!=NULL) { *error = [NSError errorWithDomain:kZKeyChainWrapperErrorDomain code:status userInfo:nil]; } return status==noErr; } - (BOOL)setPassword:(NSString *)password forService:(NSString *)service account:(NSString *)account error:(NSError **)error { OSStatus status = kZKeyChainWrapperErrorBadArguments; if ([service length]>0 && [account length]>0) { // remove old version first [self removePasswordForService:service account:account error:nil]; // now add new version if ([password length]>0) { NSMutableDictionary *keychainQuery = [self keychainQueryForService:service account:account]; NSData *passwordData = [password dataUsingEncoding:NSUTF8StringEncoding]; [keychainQuery setObject:passwordData forKey:(id)kSecValueData]; status = SecItemAdd((CFDictionaryRef)keychainQuery, NULL); } } if (status!=noErr && error!=NULL) { *error = [NSError errorWithDomain:kZKeyChainWrapperErrorDomain code:status userInfo:nil]; } return status==noErr; } @endsyncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/ZWebRequest.h0000644000373300037200000000442612424517753035477 0ustar00nightlyallusers00000000000000// // ZWebRequest.m // // Created by Lukas Zeller on 2011/02/03. // Copyright (c) 2011 by plan44.ch // #import #import // Some pseudo HTTP-errors #define ZWEBREQUEST_STATUS_NONE 0 // no HTTP status received, but otherwise request ok #define ZWEBREQUEST_STATUS_ABORTED 29999 // aborted request #define ZWEBREQUEST_STATUS_NETWORK_ERROR 29998 // network level error occurred @class ZWebRequest; @protocol ZWebRequestDelegate @optional - (void)completedWebRequest:(ZWebRequest *)aWebRequest withStatus:(UInt16)aHTTPStatus; - (void)failedWebRequest:(ZWebRequest *)aWebRequest withReadStream:(CFReadStreamRef)aReadStreamRef; @end @interface ZWebRequest : NSObject { // properties NSString *httpUser; NSString *httpPassword; NSString *contentType; NSData *requestData; id delegate; BOOL ignoreSSLErrors; BOOL useSysProxy; // internal CFHTTPMessageRef webRequest; CFHTTPAuthenticationRef httpAuthentication; CFDictionaryRef httpCredentials; CFReadStreamRef responseStream; BOOL isSSL; // answer NSMutableData *answerData; BOOL answerBufferExternal; UInt8 *answerBufferP; CFIndex answerBufferSize; CFIndex answerSize; CFIndex answerMaxSize; } @property(nonatomic,retain) NSString *httpUser; @property(nonatomic,retain) NSString *httpPassword; @property(nonatomic,assign) id delegate; @property(nonatomic,retain) NSData *requestData; @property(nonatomic,retain) NSString *contentType; @property(nonatomic,assign) BOOL ignoreSSLErrors; @property(nonatomic,assign) BOOL useSysProxy; // answer @property(nonatomic,readonly) CFIndex answerMaxSize; @property(nonatomic,readonly) CFIndex answerSize; @property(nonatomic,readonly) NSMutableData *answerData; @property(nonatomic,readonly) UInt8 *answerBufferP; @property(nonatomic,readonly) CFIndex answerBufferSize; - (id)init; - (void)setRequestString:(NSString *)aString; - (void)setRequestCString:(const char *)aCString; - (void)setRequestBuffer:(UInt8 *)aBuf withSize:(CFIndex)aSize; - (void)setAnswerBuffer:(UInt8 *)aBuf withSize:(CFIndex)aSize; - (void)setAnswerMaxSize:(CFIndex)aSize; - (BOOL)sendRequestToURL:(NSString *)aURL withHTTPMethod:(NSString *)aMethod; - (BOOL)sendDataToWebDAVURL:(NSString *)aURL; - (BOOL)sendRequest; - (void)abortRequest; @end // ZWebRequest syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/ZWebRequest.m0000644000373300037200000003452112424517753035503 0ustar00nightlyallusers00000000000000// // ZWebRequest.m // // Created by Lukas Zeller on 2011/02/03. // Copyright (c) 2011 by plan44.ch // #import "ZWebRequest.h" @interface ZWebRequest () // private methods - (void)cleanRequest; - (void)releaseAnswerBuffer; @end // private functions void responseClientCallBack( CFReadStreamRef aReadStream, CFStreamEventType aEventType, void *aClientCallBackInfo ); @implementation ZWebRequest @synthesize httpUser; @synthesize httpPassword; @synthesize delegate; @synthesize requestData; @synthesize contentType; @synthesize ignoreSSLErrors; @synthesize useSysProxy; // answer @synthesize answerData; @synthesize answerSize, answerMaxSize; @synthesize answerBufferP, answerBufferSize; - (id)init { if ((self = [super init])) { httpUser = nil; httpPassword = nil; requestData = nil; contentType = nil; ignoreSSLErrors = NO; useSysProxy = YES; httpCredentials = NULL; httpAuthentication = NULL; webRequest = NULL; responseStream = NULL; isSSL = NO; // answer answerData = nil; answerMaxSize = 0; // no answer expected answerBufferP = NULL; answerBufferSize = 0; answerSize = 0; answerBufferExternal = NO; } return self; } - (void)dealloc { [self releaseAnswerBuffer]; [self cleanRequest]; [httpUser release], httpUser = nil; [httpPassword release], httpPassword = nil; [requestData release], requestData = nil; [contentType release], contentType = nil; delegate = nil; [super dealloc]; } - (void)cleanRequest { if (responseStream) { CFRelease(responseStream); responseStream = NULL; } if (httpAuthentication) { CFRelease(httpAuthentication); httpAuthentication = NULL; } if (httpCredentials) { CFRelease(httpCredentials); httpCredentials = NULL; } if (webRequest) { CFRelease(webRequest); webRequest = NULL; } } - (void)setRequestCString:(const char *)aCString; { if (!aCString) aCString = ""; self.requestData = [[NSData alloc] initWithBytes:(const void *)aCString length:strlen(aCString)]; } - (void)setRequestString:(NSString *)aString { if (!aString) aString = @""; [self setRequestCString:[aString UTF8String]]; } - (void)setRequestBuffer:(UInt8 *)aBuf withSize:(CFIndex)aSize { // contents of buffer is owned by caller, but NSData is not self.requestData = [[NSData alloc] initWithBytesNoCopy:aBuf length:aSize]; } - (void)releaseAnswer { // forget the current answer. // - if we have a buffer, it will be overwritten with the next answer // - if we had a NSData, it will be released answerSize = 0; if (answerData) { [answerData release]; answerData = nil; } } - (void)releaseAnswerBuffer { [self releaseAnswer]; if (!answerBufferExternal) { // we own the buffer, release memory if (answerBufferP) free(answerBufferP); } answerBufferP = NULL; answerBufferSize = 0; answerBufferExternal = NO; } // set the maximum answer size. If not using an external buffer, this must always be set - (void)setAnswerMaxSize:(CFIndex)aSize { [self releaseAnswer]; if (answerBufferP && aSize>answerBufferSize) { aSize = answerBufferSize; // limit to buffer size } answerMaxSize = aSize; } // pass an external buffer for the answer, also sets max answer size to buffer size - (void)setAnswerBuffer:(UInt8 *)aBuf withSize:(CFIndex)aSize { [self releaseAnswerBuffer]; answerBufferP = aBuf; answerBufferSize = aSize; answerBufferExternal = YES; [self setAnswerMaxSize:aSize]; // by default, answer size is limited by the buffer size } - (BOOL)sendRequestToURL:(NSString *)aURL withHTTPMethod:(NSString *)aMethod { [self cleanRequest]; // - make URL (and trim URL in case it has whitespace or LF in front or at end) CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, (CFStringRef)[aURL stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]], NULL ); // - check for SSL NSString *scheme = (NSString *)CFURLCopyScheme(myURL); isSSL = [scheme isEqualToString:@"https"]; [scheme release]; // - create the request webRequest = CFHTTPMessageCreateRequest( kCFAllocatorDefault, (CFStringRef)aMethod, myURL, kCFHTTPVersion1_1 ); CFRelease(myURL); if (requestData) CFHTTPMessageSetBody(webRequest, (CFDataRef)requestData); // attach the data // - set the content type header CFHTTPMessageSetHeaderFieldValue(webRequest, CFSTR("Content-Type"), (CFStringRef)contentType); // send request now return [self sendRequest]; } - (BOOL)sendDataToWebDAVURL:(NSString *)aURL { return [self sendRequestToURL:aURL withHTTPMethod:@"PUT"]; } - (void)completedWebRequestWithStatus:(CFIndex)aHTTPStatus { // Base class action: inform delegate // Note: subclasses will probably override this if (delegate && [delegate respondsToSelector:@selector(completedWebRequest:withStatus:)]) { [delegate completedWebRequest:self withStatus:aHTTPStatus]; } } - (void)failedWebRequestWithReadStream:(CFReadStreamRef)aReadStream { // Base class action: inform delegate // Note: subclasses will probably override this if (delegate && [delegate respondsToSelector:@selector(failedWebRequest:withReadStream:)]) { [delegate failedWebRequest:self withReadStream:aReadStream]; } } - (void)responseClientCallBackWithStream:(CFReadStreamRef)aReadStream andEvent:(CFStreamEventType)aEventType { const CFIndex chunkSize = 1000; const CFIndex initialDataCapactiy = chunkSize*3; char buf[chunkSize]; CFIndex bytesRead; // check the status CFHTTPMessageRef myResponse = (CFHTTPMessageRef)CFReadStreamCopyProperty(aReadStream, kCFStreamPropertyHTTPResponseHeader); // if we did't get that far (e.g. server not reachable), we'll get nil for myResponse CFIndex myHTTPStatus = ZWEBREQUEST_STATUS_NONE; if (myResponse) { myHTTPStatus = CFHTTPMessageGetResponseStatusCode(myResponse); if (myHTTPStatus==401) { // missing or wrong authentication if (httpAuthentication) { // wrong auth - fail with myHTTPStatus goto requestDone; } // create appropriate auth from response (challenge) httpAuthentication = CFHTTPAuthenticationCreateFromResponse(NULL, myResponse); // no need to read more from this stream CFReadStreamClose(aReadStream); CFRelease(myResponse); myResponse = nil; // retry with new auth [self sendRequest]; return; } } // no auth failure - normally evaluate events switch (aEventType) { case kCFStreamEventHasBytesAvailable: // three modes: read to buffer passed from the outside, read into NSData, or discard answer completely if (answerBufferP && answerSize0 && !answerBufferP && answerMaxSize>0 && answerSize 1280 11C43 1934 1138.17 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 931 IBProxyObject IBUIBarButtonItem IBUILabel IBUITextField IBUINavigationBar IBUINavigationItem IBUIPickerView IBUIView com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework 274 290 {320, 44} NO NO IBCocoaTouchFramework 1 SyncML Settings IBCocoaTouchFramework 1 0 IBCocoaTouchFramework 292 {{117, 90}, {183, 31}} NO NO IBCocoaTouchFramework 0 3 3 MAA 2 YES 17 1 7 9 IBCocoaTouchFramework 1 12 Helvetica 12 16 292 {{20, 95}, {49, 21}} NO YES NO IBCocoaTouchFramework User 1 MSAxIDEAA 1 10 1 17 Helvetica 17 16 292 {{117, 51}, {183, 31}} NO NO IBCocoaTouchFramework 0 3 3 MAA YES 17 1 3 9 IBCocoaTouchFramework 292 {{20, 56}, {89, 21}} NO YES NO IBCocoaTouchFramework Server URL 1 10 292 {{117, 129}, {183, 31}} NO NO IBCocoaTouchFramework 0 3 3 MAA YES 17 1 9 YES IBCocoaTouchFramework 292 {{20, 134}, {75, 21}} NO YES NO IBCocoaTouchFramework Password 1 10 292 {{20, 219}, {90, 21}} NO YES NO IBCocoaTouchFramework Sync mode: 1 10 292 {{117, 178}, {183, 31}} NO NO IBCocoaTouchFramework 0 3 3 MAA YES 17 1 3 9 IBCocoaTouchFramework 292 {{20, 183}, {88, 21}} NO YES NO IBCocoaTouchFramework Server path 1 10 292 {{0, 244}, {320, 216}} NO YES YES IBCocoaTouchFramework YES {{0, 20}, {320, 460}} 3 MC4yNQA NO 2 IBCocoaTouchFramework view 41 serverURLfield 58 serverUserField 59 serverPasswordField 60 datastorePathField 62 datastoreSyncMode 63 done: 46 delegate 71 delegate 70 delegate 72 delegate 73 dataSource 64 delegate 65 0 -1 File's Owner -2 40 42 43 44 47 48 49 50 51 52 53 54 55 56 FlipsideViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 73 FlipsideViewController UIViewController id id done: id editingDidEnd: id UITextField UIPickerView id UITextField UITextField UITextField datastorePathField UITextField datastoreSyncMode UIPickerView delegate id serverPasswordField UITextField serverURLfield UITextField serverUserField UITextField IBProjectSource ./Classes/FlipsideViewController.h 0 IBCocoaTouchFramework YES 3 931 syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/en.lproj/InfoPlist.strings0000644000373300037200000000005512424517753035645 0ustar00nightlyallusers00000000000000/* Localized versions of Info.plist keys */ MainViewController_iPad.xib0000644000373300037200000004706112424517753037500 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/en.lproj 1280 11C74 1938 1138.23 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIView IBUIBarButtonItem IBProxyObject IBUILabel IBUIActivityIndicatorView IBUINavigationBar IBUINavigationItem IBUIButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 274 290 {768, 44} NO NO IBIPadFramework 1 Title Info IBIPadFramework 1 IBIPadFramework 292 {{244, 73}, {280, 37}} NO NO IBIPadFramework 0 0 1 Start Synchronisation Start Synchronisation Start Synchronisation Start Synchronisation 1 MSAxIDEAA 3 MAA 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA Helvetica-Bold Helvetica 2 15 Helvetica-Bold 15 16 292 {{20, 144}, {728, 21}} NO YES NO IBIPadFramework globalStatus 3 MQA 1 10 1 17 Helvetica 17 16 292 {{20, 178}, {728, 21}} NO YES NO IBIPadFramework targetStatus 1 10 292 {{20, 593}, {728, 88}} NO YES 5 NO IBIPadFramework U2FtcGxlIFN5bmNNTCBjbGllbnQgYXBwbGljYXRpb24KZGVtb25zdHJhdGluZyB1c2Ugb2YKbGlic3lu dGhlc2lzIG9wZW4gc291cmNlIFN5bmNNTCBsaWJyYXJ5CsKpIDIwMTEgYnkgcGxhbjQ0LmNoA 1 MCAwLjUwMTk2MDgxIDEAA 10 0 0 Helvetica Helvetica 0 14 Helvetica 14 16 -2147483356 {{366, 369}, {37, 37}} _NS:1062 NO IBIPadFramework 0 {{0, 20}, {768, 1004}} 3 MC4yNQA 2 2 IBIPadFramework view 3 globalStatusLabel 17 targetStatusLabel 18 startStopSyncButton 19 syncActivityIndicator 21 infoButton 22 showInfo: 11 startStopSync: 7 16 0 1 -1 File's Owner -2 7 8 10 12 13 14 15 20 MainViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 22 MainViewController UIViewController id id showInfo: id startStopSync: id UILabel UIButton UIActivityIndicatorView UILabel globalStatusLabel UILabel startStopSyncButton UIButton syncActivityIndicator UIActivityIndicatorView targetStatusLabel UILabel IBProjectSource ./Classes/MainViewController.h 0 IBIPadFramework YES 3 933 MainViewController_iPhone.xib0000644000373300037200000004502112424517753040037 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/en.lproj 1280 11C74 1938 1138.23 567.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIButton IBUIActivityIndicatorView IBUIView IBUILabel IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBCocoaTouchFramework IBFirstResponder IBCocoaTouchFramework 274 265 {{282, 421}, {18, 19}} NO NO IBCocoaTouchFramework 0 0 3 YES 1 MSAxIDEAA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MAA Helvetica-Bold Helvetica 2 15 Helvetica-Bold 15 16 292 {{20, 20}, {280, 37}} NO NO IBCocoaTouchFramework 0 0 1 Start Synchronisation Start Synchronisation Start Synchronisation Start Synchronisation 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA 292 {{20, 81}, {280, 21}} NO YES NO IBCocoaTouchFramework globalStatus 3 MQA 1 10 1 17 Helvetica 17 16 292 {{20, 115}, {280, 21}} NO YES NO IBCocoaTouchFramework targetStatus 1 10 292 {{20, 327}, {280, 88}} NO YES 5 NO IBCocoaTouchFramework U2FtcGxlIFN5bmNNTCBjbGllbnQgYXBwbGljYXRpb24KZGVtb25zdHJhdGluZyB1c2Ugb2YKbGlic3lu dGhlc2lzIG9wZW4gc291cmNlIFN5bmNNTCBsaWJyYXJ5CsKpIDIwMTEgYnkgcGxhbjQ0LmNoA 1 MCAwLjUwMTk2MDgxIDEAA 10 0 0 Helvetica Helvetica 0 14 Helvetica 14 16 -2147483356 {{142, 211}, {37, 37}} _NS:1030 NO IBCocoaTouchFramework 0 {{0, 20}, {320, 460}} 3 MC4yNQA 2 NO IBCocoaTouchFramework view 35 targetStatusLabel 43 globalStatusLabel 44 startStopSyncButton 46 syncActivityIndicator 51 showInfo: 7 38 startStopSync: 7 49 0 -1 File's Owner -2 34 36 39 40 41 42 50 MainViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 51 MainViewController UIViewController id id showInfo: id startStopSync: id UILabel UIButton UIActivityIndicatorView UILabel globalStatusLabel UILabel startStopSyncButton UIButton syncActivityIndicator UIActivityIndicatorView targetStatusLabel UILabel IBProjectSource ./Classes/MainViewController.h 0 IBCocoaTouchFramework YES 3 933 ios_syncclient_app_sample-Info.plist0000644000373300037200000000266712424517753037724 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFiles CFBundleIdentifier ch.plan44.syncmlios.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 LSRequiresIPhoneOS UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIFileSharingEnabled ios_syncclient_app_sample-Prefix.pch0000644000373300037200000000073412424517753037676 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample// // Prefix header for all source files of the 'ios_syncclient_app_sample' target in the 'ios_syncclient_app_sample' project // #import #ifndef __IPHONE_4_0 #warning "This project uses features only available in iOS SDK 4.0 and later." #endif // iOS always has statically linked libraries, so it must link libsynthesis statically as well #define SYSYNC_ENGINE_STATIC 1 #ifdef __OBJC__ #import #import #endif 0000755000373300037200000000000012424517753037737 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeprojproject.pbxproj0000644000373300037200000006720612424517753043026 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ ED46AB23142347BC0057DC96 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB22142347BC0057DC96 /* UIKit.framework */; }; ED46AB25142347BC0057DC96 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB24142347BC0057DC96 /* Foundation.framework */; }; ED46AB27142347BC0057DC96 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB26142347BC0057DC96 /* CoreGraphics.framework */; }; ED46AB2D142347BC0057DC96 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ED46AB2B142347BC0057DC96 /* InfoPlist.strings */; }; ED46AB2F142347BC0057DC96 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB2E142347BC0057DC96 /* main.m */; }; ED46AB33142347BC0057DC96 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB32142347BC0057DC96 /* AppDelegate.m */; }; ED46AB36142347BC0057DC96 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB35142347BC0057DC96 /* MainViewController.m */; }; ED46AB39142347BC0057DC96 /* FlipsideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB38142347BC0057DC96 /* FlipsideViewController.m */; }; ED46AB3C142347BD0057DC96 /* MainViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = ED46AB3A142347BD0057DC96 /* MainViewController_iPhone.xib */; }; ED46AB3F142347BD0057DC96 /* MainViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = ED46AB3D142347BD0057DC96 /* MainViewController_iPad.xib */; }; ED46AB42142347BD0057DC96 /* FlipsideViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = ED46AB40142347BD0057DC96 /* FlipsideViewController.xib */; }; ED46AB78142348C10057DC96 /* SyncEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB6B142348C10057DC96 /* SyncEngine.m */; }; ED46AB7B142348C10057DC96 /* SyncMLClient.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB74142348C10057DC96 /* SyncMLClient.m */; }; ED46AB7C142348C10057DC96 /* ZWebRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB76142348C10057DC96 /* ZWebRequest.m */; }; ED46AB8D14237C4E0057DC96 /* ZKeyChainWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB8C14237C4E0057DC96 /* ZKeyChainWrapper.m */; }; ED46AB8F142381860057DC96 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB8E142381860057DC96 /* CFNetwork.framework */; }; ED46AB91142381A50057DC96 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB90142381A50057DC96 /* Security.framework */; }; ED46AB95142389E40057DC96 /* libstdc++.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB94142389E40057DC96 /* libstdc++.6.dylib */; }; ED46AB9914238A160057DC96 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = ED46AB9814238A160057DC96 /* libsqlite3.dylib */; }; EDAF2DCB14A344510054960A /* ios_syncclient_app_sample.xml in Resources */ = {isa = PBXBuildFile; fileRef = EDAF2DCA14A344510054960A /* ios_syncclient_app_sample.xml */; }; EDC0F81E14A343530006710A /* SettingsKey.m in Sources */ = {isa = PBXBuildFile; fileRef = ED46AB67142348C10057DC96 /* SettingsKey.m */; }; EDE01B23151E975200352246 /* libdbplugin_cocoa_sample_ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EDAF2DD414A346400054960A /* libdbplugin_cocoa_sample_ios.a */; }; EDE01B24151E975200352246 /* libsysync_client_ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EDAF2DDE14A3464D0054960A /* libsysync_client_ios.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ EDAF2DD314A346400054960A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = EDAF2DCC14A346400054960A /* dbplugin_cocoa_sample_ios.xcodeproj */; proxyType = 2; remoteGlobalIDString = D2AAC07E0554694100DB518D; remoteInfo = dbplugin_cocoa_sample_ios; }; EDAF2DDD14A3464D0054960A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = EDAF2DD514A3464D0054960A /* sysync_ios.xcodeproj */; proxyType = 2; remoteGlobalIDString = ED1ECBC31383B0DB00B3DA02; remoteInfo = static_clientEngine_opensource_ios; }; EDAF2DDF14A3464D0054960A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = EDAF2DD514A3464D0054960A /* sysync_ios.xcodeproj */; proxyType = 2; remoteGlobalIDString = ED1ECBC41383B0DB00B3DA02; remoteInfo = static_combiEngine_opensource_ios; }; EDAF2DE114A3466D0054960A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = EDAF2DD514A3464D0054960A /* sysync_ios.xcodeproj */; proxyType = 1; remoteGlobalIDString = ED60E7660DF54F870087381E; remoteInfo = static_clientEngine_opensource_ios; }; EDAF2DE314A346720054960A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = EDAF2DCC14A346400054960A /* dbplugin_cocoa_sample_ios.xcodeproj */; proxyType = 1; remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = dbplugin_cocoa_sample_ios; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ ED46AB1E142347BC0057DC96 /* ios_syncclient_app_sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ios_syncclient_app_sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; ED46AB22142347BC0057DC96 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; ED46AB24142347BC0057DC96 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; ED46AB26142347BC0057DC96 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; ED46AB2C142347BC0057DC96 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; ED46AB2E142347BC0057DC96 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = main.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; ED46AB31142347BC0057DC96 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = AppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; ED46AB32142347BC0057DC96 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = AppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; ED46AB34142347BC0057DC96 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = MainViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; ED46AB35142347BC0057DC96 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = MainViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; ED46AB37142347BC0057DC96 /* FlipsideViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = FlipsideViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; ED46AB38142347BC0057DC96 /* FlipsideViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = FlipsideViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; ED46AB3B142347BD0057DC96 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainViewController_iPhone.xib; sourceTree = ""; }; ED46AB3E142347BD0057DC96 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainViewController_iPad.xib; sourceTree = ""; }; ED46AB41142347BD0057DC96 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/FlipsideViewController.xib; sourceTree = ""; }; ED46AB66142348C10057DC96 /* SettingsKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsKey.h; sourceTree = ""; }; ED46AB67142348C10057DC96 /* SettingsKey.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsKey.m; sourceTree = ""; }; ED46AB6A142348C10057DC96 /* SyncEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SyncEngine.h; sourceTree = ""; }; ED46AB6B142348C10057DC96 /* SyncEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SyncEngine.m; sourceTree = ""; }; ED46AB73142348C10057DC96 /* SyncMLClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SyncMLClient.h; sourceTree = ""; }; ED46AB74142348C10057DC96 /* SyncMLClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SyncMLClient.m; sourceTree = ""; }; ED46AB75142348C10057DC96 /* ZWebRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZWebRequest.h; sourceTree = ""; }; ED46AB76142348C10057DC96 /* ZWebRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZWebRequest.m; sourceTree = ""; }; ED46AB8314237AC90057DC96 /* engine_defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine_defs.h; sourceTree = ""; }; ED46AB8414237AC90057DC96 /* generic_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generic_types.h; sourceTree = ""; }; ED46AB8514237AC90057DC96 /* SDK_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDK_util.h; sourceTree = ""; }; ED46AB8614237AC90057DC96 /* syerror.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syerror.h; sourceTree = ""; }; ED46AB8714237AC90057DC96 /* sync_dbapidef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_dbapidef.h; sourceTree = ""; }; ED46AB8814237AC90057DC96 /* sync_declarations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_declarations.h; sourceTree = ""; }; ED46AB8914237AC90057DC96 /* sync_include.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_include.h; sourceTree = ""; }; ED46AB8A14237AC90057DC96 /* target_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = target_options.h; sourceTree = ""; }; ED46AB8B14237C4E0057DC96 /* ZKeyChainWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZKeyChainWrapper.h; sourceTree = ""; }; ED46AB8C14237C4E0057DC96 /* ZKeyChainWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZKeyChainWrapper.m; sourceTree = ""; }; ED46AB8E142381860057DC96 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; ED46AB90142381A50057DC96 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; ED46AB921423896E0057DC96 /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "usr/lib/libc++.dylib"; sourceTree = SDKROOT; }; ED46AB94142389E40057DC96 /* libstdc++.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libstdc++.6.dylib"; path = "usr/lib/libstdc++.6.dylib"; sourceTree = SDKROOT; }; ED46AB9814238A160057DC96 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; EDAF2DCA14A344510054960A /* ios_syncclient_app_sample.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ios_syncclient_app_sample.xml; sourceTree = ""; }; EDAF2DCC14A346400054960A /* dbplugin_cocoa_sample_ios.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = dbplugin_cocoa_sample_ios.xcodeproj; path = ../dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj; sourceTree = ""; }; EDAF2DD514A3464D0054960A /* sysync_ios.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = sysync_ios.xcodeproj; path = ../../sysync_ios.xcodeproj; sourceTree = ""; }; EDC0F81C14A342A30006710A /* ios_syncclient_app_sample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ios_syncclient_app_sample-Info.plist"; sourceTree = ""; }; EDC0F81D14A342A30006710A /* ios_syncclient_app_sample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "ios_syncclient_app_sample-Prefix.pch"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ ED46AB1B142347BC0057DC96 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( EDE01B23151E975200352246 /* libdbplugin_cocoa_sample_ios.a in Frameworks */, EDE01B24151E975200352246 /* libsysync_client_ios.a in Frameworks */, ED46AB9914238A160057DC96 /* libsqlite3.dylib in Frameworks */, ED46AB95142389E40057DC96 /* libstdc++.6.dylib in Frameworks */, ED46AB91142381A50057DC96 /* Security.framework in Frameworks */, ED46AB8F142381860057DC96 /* CFNetwork.framework in Frameworks */, ED46AB23142347BC0057DC96 /* UIKit.framework in Frameworks */, ED46AB25142347BC0057DC96 /* Foundation.framework in Frameworks */, ED46AB27142347BC0057DC96 /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ ED46AB13142347BC0057DC96 = { isa = PBXGroup; children = ( EDAF2DD514A3464D0054960A /* sysync_ios.xcodeproj */, EDAF2DCC14A346400054960A /* dbplugin_cocoa_sample_ios.xcodeproj */, ED46AB61142348C10057DC96 /* syncmlios_SDK */, ED46AB28142347BC0057DC96 /* ios_syncclient_app_sample */, ED46AB21142347BC0057DC96 /* Frameworks */, ED46AB1F142347BC0057DC96 /* Products */, ); sourceTree = ""; }; ED46AB1F142347BC0057DC96 /* Products */ = { isa = PBXGroup; children = ( ED46AB1E142347BC0057DC96 /* ios_syncclient_app_sample.app */, ); name = Products; sourceTree = ""; }; ED46AB21142347BC0057DC96 /* Frameworks */ = { isa = PBXGroup; children = ( ED46AB9814238A160057DC96 /* libsqlite3.dylib */, ED46AB94142389E40057DC96 /* libstdc++.6.dylib */, ED46AB921423896E0057DC96 /* libc++.dylib */, ED46AB90142381A50057DC96 /* Security.framework */, ED46AB8E142381860057DC96 /* CFNetwork.framework */, ED46AB22142347BC0057DC96 /* UIKit.framework */, ED46AB24142347BC0057DC96 /* Foundation.framework */, ED46AB26142347BC0057DC96 /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; ED46AB28142347BC0057DC96 /* ios_syncclient_app_sample */ = { isa = PBXGroup; children = ( EDAF2DCA14A344510054960A /* ios_syncclient_app_sample.xml */, ED46AB31142347BC0057DC96 /* AppDelegate.h */, ED46AB32142347BC0057DC96 /* AppDelegate.m */, ED46AB34142347BC0057DC96 /* MainViewController.h */, ED46AB35142347BC0057DC96 /* MainViewController.m */, ED46AB3A142347BD0057DC96 /* MainViewController_iPhone.xib */, ED46AB3D142347BD0057DC96 /* MainViewController_iPad.xib */, ED46AB37142347BC0057DC96 /* FlipsideViewController.h */, ED46AB38142347BC0057DC96 /* FlipsideViewController.m */, ED46AB40142347BD0057DC96 /* FlipsideViewController.xib */, ED46AB72142348C10057DC96 /* SyncMLClient */, ED46AB29142347BC0057DC96 /* Supporting Files */, ); name = ios_syncclient_app_sample; sourceTree = SOURCE_ROOT; }; ED46AB29142347BC0057DC96 /* Supporting Files */ = { isa = PBXGroup; children = ( EDC0F81C14A342A30006710A /* ios_syncclient_app_sample-Info.plist */, EDC0F81D14A342A30006710A /* ios_syncclient_app_sample-Prefix.pch */, ED46AB2B142347BC0057DC96 /* InfoPlist.strings */, ED46AB2E142347BC0057DC96 /* main.m */, ); name = "Supporting Files"; sourceTree = ""; }; ED46AB61142348C10057DC96 /* syncmlios_SDK */ = { isa = PBXGroup; children = ( ED46AB8214237AC90057DC96 /* Sources */, ED46AB62142348C10057DC96 /* sdk_sources_cocoa */, ); name = syncmlios_SDK; path = ..; sourceTree = ""; }; ED46AB62142348C10057DC96 /* sdk_sources_cocoa */ = { isa = PBXGroup; children = ( ED46AB8A14237AC90057DC96 /* target_options.h */, ED46AB66142348C10057DC96 /* SettingsKey.h */, ED46AB67142348C10057DC96 /* SettingsKey.m */, ED46AB6A142348C10057DC96 /* SyncEngine.h */, ED46AB6B142348C10057DC96 /* SyncEngine.m */, ); path = sdk_sources_cocoa; sourceTree = ""; }; ED46AB72142348C10057DC96 /* SyncMLClient */ = { isa = PBXGroup; children = ( ED46AB8B14237C4E0057DC96 /* ZKeyChainWrapper.h */, ED46AB8C14237C4E0057DC96 /* ZKeyChainWrapper.m */, ED46AB73142348C10057DC96 /* SyncMLClient.h */, ED46AB74142348C10057DC96 /* SyncMLClient.m */, ED46AB75142348C10057DC96 /* ZWebRequest.h */, ED46AB76142348C10057DC96 /* ZWebRequest.m */, ); path = SyncMLClient; sourceTree = ""; }; ED46AB8214237AC90057DC96 /* Sources */ = { isa = PBXGroup; children = ( ED46AB8314237AC90057DC96 /* engine_defs.h */, ED46AB8414237AC90057DC96 /* generic_types.h */, ED46AB8514237AC90057DC96 /* SDK_util.h */, ED46AB8614237AC90057DC96 /* syerror.h */, ED46AB8714237AC90057DC96 /* sync_dbapidef.h */, ED46AB8814237AC90057DC96 /* sync_declarations.h */, ED46AB8914237AC90057DC96 /* sync_include.h */, ); path = Sources; sourceTree = ""; }; EDAF2DCD14A346400054960A /* Products */ = { isa = PBXGroup; children = ( EDAF2DD414A346400054960A /* libdbplugin_cocoa_sample_ios.a */, ); name = Products; sourceTree = ""; }; EDAF2DD614A3464D0054960A /* Products */ = { isa = PBXGroup; children = ( EDAF2DDE14A3464D0054960A /* libsysync_client_ios.a */, EDAF2DE014A3464D0054960A /* libsysync_combi_ios.a */, ); name = Products; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ ED46AB1D142347BC0057DC96 /* ios_syncclient_app_sample */ = { isa = PBXNativeTarget; buildConfigurationList = ED46AB45142347BD0057DC96 /* Build configuration list for PBXNativeTarget "ios_syncclient_app_sample" */; buildPhases = ( ED46AB1A142347BC0057DC96 /* Sources */, ED46AB1B142347BC0057DC96 /* Frameworks */, ED46AB1C142347BC0057DC96 /* Resources */, ); buildRules = ( ); dependencies = ( EDAF2DE414A346720054960A /* PBXTargetDependency */, EDAF2DE214A3466D0054960A /* PBXTargetDependency */, ); name = ios_syncclient_app_sample; productName = SyncMLClientSample; productReference = ED46AB1E142347BC0057DC96 /* ios_syncclient_app_sample.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ ED46AB15142347BC0057DC96 /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0420; }; buildConfigurationList = ED46AB18142347BC0057DC96 /* Build configuration list for PBXProject "ios_syncclient_app_sample" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = ED46AB13142347BC0057DC96; productRefGroup = ED46AB1F142347BC0057DC96 /* Products */; projectDirPath = ""; projectReferences = ( { ProductGroup = EDAF2DCD14A346400054960A /* Products */; ProjectRef = EDAF2DCC14A346400054960A /* dbplugin_cocoa_sample_ios.xcodeproj */; }, { ProductGroup = EDAF2DD614A3464D0054960A /* Products */; ProjectRef = EDAF2DD514A3464D0054960A /* sysync_ios.xcodeproj */; }, ); projectRoot = ""; targets = ( ED46AB1D142347BC0057DC96 /* ios_syncclient_app_sample */, ); }; /* End PBXProject section */ /* Begin PBXReferenceProxy section */ EDAF2DD414A346400054960A /* libdbplugin_cocoa_sample_ios.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libdbplugin_cocoa_sample_ios.a; remoteRef = EDAF2DD314A346400054960A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; EDAF2DDE14A3464D0054960A /* libsysync_client_ios.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libsysync_client_ios.a; remoteRef = EDAF2DDD14A3464D0054960A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; EDAF2DE014A3464D0054960A /* libsysync_combi_ios.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libsysync_combi_ios.a; remoteRef = EDAF2DDF14A3464D0054960A /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ ED46AB1C142347BC0057DC96 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ED46AB2D142347BC0057DC96 /* InfoPlist.strings in Resources */, ED46AB3C142347BD0057DC96 /* MainViewController_iPhone.xib in Resources */, ED46AB3F142347BD0057DC96 /* MainViewController_iPad.xib in Resources */, ED46AB42142347BD0057DC96 /* FlipsideViewController.xib in Resources */, EDAF2DCB14A344510054960A /* ios_syncclient_app_sample.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ ED46AB1A142347BC0057DC96 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ED46AB2F142347BC0057DC96 /* main.m in Sources */, ED46AB33142347BC0057DC96 /* AppDelegate.m in Sources */, ED46AB36142347BC0057DC96 /* MainViewController.m in Sources */, ED46AB39142347BC0057DC96 /* FlipsideViewController.m in Sources */, ED46AB78142348C10057DC96 /* SyncEngine.m in Sources */, ED46AB7B142348C10057DC96 /* SyncMLClient.m in Sources */, ED46AB7C142348C10057DC96 /* ZWebRequest.m in Sources */, ED46AB8D14237C4E0057DC96 /* ZKeyChainWrapper.m in Sources */, EDC0F81E14A343530006710A /* SettingsKey.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ EDAF2DE214A3466D0054960A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = static_clientEngine_opensource_ios; targetProxy = EDAF2DE114A3466D0054960A /* PBXContainerItemProxy */; }; EDAF2DE414A346720054960A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = dbplugin_cocoa_sample_ios; targetProxy = EDAF2DE314A346720054960A /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ ED46AB2B142347BC0057DC96 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( ED46AB2C142347BC0057DC96 /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; ED46AB3A142347BD0057DC96 /* MainViewController_iPhone.xib */ = { isa = PBXVariantGroup; children = ( ED46AB3B142347BD0057DC96 /* en */, ); name = MainViewController_iPhone.xib; sourceTree = ""; }; ED46AB3D142347BD0057DC96 /* MainViewController_iPad.xib */ = { isa = PBXVariantGroup; children = ( ED46AB3E142347BD0057DC96 /* en */, ); name = MainViewController_iPad.xib; sourceTree = ""; }; ED46AB40142347BD0057DC96 /* FlipsideViewController.xib */ = { isa = PBXVariantGroup; children = ( ED46AB41142347BD0057DC96 /* en */, ); name = FlipsideViewController.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ ED46AB43142347BD0057DC96 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; ED46AB44142347BD0057DC96 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 4.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; ED46AB46142347BD0057DC96 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ios_syncclient_app_sample-Prefix.pch"; INFOPLIST_FILE = "ios_syncclient_app_sample-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Debug; }; ED46AB47142347BD0057DC96 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ios_syncclient_app_sample-Prefix.pch"; INFOPLIST_FILE = "ios_syncclient_app_sample-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ ED46AB18142347BC0057DC96 /* Build configuration list for PBXProject "ios_syncclient_app_sample" */ = { isa = XCConfigurationList; buildConfigurations = ( ED46AB43142347BD0057DC96 /* Debug */, ED46AB44142347BD0057DC96 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ED46AB45142347BD0057DC96 /* Build configuration list for PBXNativeTarget "ios_syncclient_app_sample" */ = { isa = XCConfigurationList; buildConfigurations = ( ED46AB46142347BD0057DC96 /* Debug */, ED46AB47142347BD0057DC96 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = ED46AB15142347BC0057DC96 /* Project object */; } 0000755000373300037200000000000012424517753043735 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.xcworkspacecontents.xcworkspacedata0000644000373300037200000000024312424517753050676 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.xcworkspace 0000755000373300037200000000000012424517753042372 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/xcshareddata0000755000373300037200000000000012424517753044354 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/xcshareddata/xcschemesios_syncclient_app_sample.xcscheme0000644000373300037200000000642512424517753053332 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/xcshareddata/xcschemes ios_syncclient_app_sample.xml0000644000373300037200000011746012424517753036476 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample iOS sample SyncML client app SySync Client iPhone SAMPLE $(logpath) flush yes html yes no yes separate no no yes no 5 0) { // DTSTART and DTEND probably (could be real 24h timed as well in iCalendar 2.0!) represent allday event if (ITEMDATATYPE()=="vcalendar10") { // vCalendar 1.0 - this must be allday // - convert start to user zone (or floating) so it represents midnight DTSTART = CONVERTTOUSERZONE(DTSTART); // - make them real date-only values MAKEALLDAY(DTSTART,DTEND,i); } else { // iCalendar 2.0 - only if DTSTART is a date-only value this really is an allday if (ISDATEONLY(DTSTART)) { // reshape to make sure we don't have invalid zero-duration alldays (old OCS 9 servers) MAKEALLDAY(DTSTART,DTEND,i); } } } // - shape attendees (and make sure ATTENDEES[] is assigned even for empty email addresses) i=0; while(i 2.1 3.0 yes current olson 1.0 2.0 $(binfilespath) UTF-8 unix no yes 2001 contacts textfile 1 yes [SDK_textdb] no $(textfilespath) UTF-8 unix 2002 calendar textfile 2 [SDK_textdb] no $(textfilespath) F.ISEVENT:=1 yes UTF-8 unix UTC yes makes it show in vCalendar as user time, only need to check allday if (allday) { // this is an allday event, make it dayonly MAKEALLDAY(DTSTART,DTEND); } ]]> syncevolution-1.5/src/synthesis/src/sysync_SDK/ios_syncclient_app_sample/main.m0000644000373300037200000000054612424517753031703 0ustar00nightlyallusers00000000000000// // main.m // ios_syncclient_app_sample // // Created by Lukas Zeller on 2011/09/16. // Copyright (c) 2011 __MyCompanyName__. All rights reserved. // #import #import "AppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/0000755000373300037200000000000012424517753027036 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/SettingsKey.h0000644000373300037200000000730212424517753031462 0ustar00nightlyallusers00000000000000/* SettingsKey */ #import #import #include "syerror.h" #include "sync_dbapidef.h" // DBGNSLog helper macro, only included when DEBUG is #defined #ifndef DBGNSLOG #ifdef DEBUG #define DBGNSLOG(...) NSLog(__VA_ARGS__) #else #define DBGNSLOG(...) #endif #endif #ifndef DBGEXNSLOG #if defined(DEBUG) && (DEBUG>1) #define DBGEXNSLOG(...) NSLog(__VA_ARGS__) #else #define DBGEXNSLOG(...) #endif #endif #ifdef __cplusplus using namespace sysync; #endif // wrapper for a SySync settings key (engine, session or item) @interface SettingsKey : NSObject { // the call-in structure UI_Call_In fCI; // the engine key handle KeyH fKeyH; id fParentObj; } - (id)initWithCI:(UI_Call_In)aCI andKeyHandle:(void *)aKeyH; - (void)dealloc; // management - (void)ownParent:(id)aParentObj; - (void *)detachFromKeyHandle; // Access to keys - (KeyH)keyH; - (SettingsKey *)newOpenKeyByPath:(cAppCharP)aPath withMode:(uInt16)aMode err:(TSyError *)aErrP; - (SettingsKey *)newOpenSubKeyByID:(sInt32)aID withMode:(uInt16)aMode err:(TSyError *)aErrP; - (sInt32)keyID; - (TSyError)deleteSubKeyByID:(sInt32)aID; // access to values // - modes - (TSyError)setTextCharset:(uInt16)aCharSet andLineEnds:(uInt16)aLineEndMode isBigEndian:(bool)aBigEndian; - (TSyError)setTimeMode:(uInt16)aTimeMode; // - id - (sInt32)valueIDByName:(cAppCharP)aValName; // - raw values - (TSyError)valueByName:(cAppCharP)aValName asType:(uInt16)aValType intoBuffer:(appPointer)aBuffer ofSize:(memSize)aBufSize valSize:(memSize *)aValSizeP; - (TSyError)valueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex asType:(uInt16)aValType intoBuffer:(appPointer)aBuffer ofSize:(memSize)aBufSize valSize:(memSize *)aValSizeP; - (TSyError)setValueByName:(cAppCharP)aValName asType:(uInt16)aValType fromBuffer:(cAppPointer)aBuffer ofSize:(memSize)aValSize; - (TSyError)setValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex asType:(uInt16)aValType fromBuffer:(cAppPointer)aBuffer ofSize:(memSize)aValSize; // - strings - (NSString *)stringValueByName:(cAppCharP)aValName; - (NSString *)stringValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex; - (NSString *)stringValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP; - (TSyError)setStringValueByName:(cAppCharP)aValName toValue:(NSString *)aString; - (TSyError)setStringValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(NSString *)aString; // - 32 bit integers - (sInt32)intValueByName:(cAppCharP)aValName; - (sInt32)intValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex; - (sInt32)intValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP; - (TSyError)setIntValueByName:(cAppCharP)aValName toValue:(sInt32)aInt; - (TSyError)setIntValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(sInt32)aInt; // - 64 bit integers - (sInt64)int64ValueByName:(cAppCharP)aValName; - (sInt64)int64ValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex; - (sInt64)int64ValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP; - (TSyError)setInt64ValueByName:(cAppCharP)aValName toValue:(sInt64)aInt; - (TSyError)setInt64ValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(sInt64)aInt; // - date/time - (NSDate *)dateValueByName:(cAppCharP)aValName; - (NSDate *)dateValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex; - (NSDate *)dateValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP; - (TSyError)setDateValueByName:(cAppCharP)aValName toValue:(NSDate *)aDate; - (TSyError)setDateValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(NSDate *)aDate; // - KVC - (id)valueForKey:(NSString *)key; - (void)setValue:(id)value forKey:(NSString *)key; @end // SettingsKey syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/SettingsKey.m0000644000373300037200000004123212424517753031467 0ustar00nightlyallusers00000000000000#import "SettingsKey.h" #include #include "sdk_util.h" // for Plugin_Version() // if defined, living instances are recorded in a set to monitor if all are closed properly (DEBUG only) //#define SETTINGSKEY_MONITORINSTANCES 1 #if defined(SETTINGSKEY_MONITORINSTANCES) && defined(DEBUG) NSMutableSet *openSettingsKeySet = nil; void key_created(id aKey) { if (!openSettingsKeySet) { openSettingsKeySet = [[NSMutableSet alloc] init]; } [openSettingsKeySet addObject:[NSNumber numberWithUnsignedLong:(intptr_t)aKey]]; } void key_deleted(id aKey) { [openSettingsKeySet removeObject:[NSNumber numberWithUnsignedLong:(intptr_t)aKey]]; NSMutableString *s = [NSMutableString string]; for (id key in openSettingsKeySet) { id keyPtr = (id)[key unsignedLongValue]; [s appendFormat:@"0x%lX(%d), ", (intptr_t)keyPtr, [keyPtr retainCount]]; } NSLog(@"Still open keys: %@",s); } #define KEY_CREATED(k) key_created(k) #define KEY_DELETED(k) key_deleted(k) #define KEYNSLOG(...) DBGNSLOG(__VA_ARGS__) #else #define KEY_CREATED(k) #define KEY_DELETED(k) #define KEYNSLOG(...) #endif // wrapper for a SySync settings key (engine, session or item) @implementation SettingsKey - (id)initWithCI:(UI_Call_In)aCI andKeyHandle:(void *)aKeyH { if ((self = [super init])) { fCI = aCI; fKeyH = aKeyH; fParentObj=nil; } KEY_CREATED(self); return self; } // initWithCI // have the settings key own another object and release that on close (usually the parent key) - (void)ownParent:(id)aParentObj { fParentObj = [aParentObj retain]; // own it } // ownParent // detach wrapper object from handle - (void *)detachFromKeyHandle { void *keyH = fKeyH; fKeyH = NULL; fCI = NULL; return keyH; } // detachFromKeyHandle // dealloc implicitly closes key (except if it was previously detached with -detachFromKeyHandle) - (void)dealloc { // close key if (fCI && fKeyH) { CloseKey_Func CloseKey= fCI->ui.CloseKey; if (CloseKey) { CloseKey(fCI,fKeyH); fKeyH=NULL; } } // close parent if one is assigned [fParentObj release]; KEYNSLOG(@"Deallocating SettingsKey object = 0x%lX",(intptr_t)self); KEY_DELETED(self); // done [super dealloc]; } // dealloc // Access to keys // note: this is explicitly implemented to make it compatible with 10.4 SDK and compilers - (KeyH)keyH { return fKeyH; } - (SettingsKey *)newOpenKeyByPath:(cAppCharP)aPath withMode:(uInt16)aMode err:(TSyError *)aErrP { TSyError sta=LOCERR_OK; KeyH newKeyH=NULL; SettingsKey *newKey=nil; // no object by default OpenKeyByPath_Func OpenKeyByPath = fCI->ui.OpenKeyByPath; if (!OpenKeyByPath) { sta=LOCERR_NOTIMP; } else { sta = OpenKeyByPath(fCI,&newKeyH,fKeyH,aPath,aMode); if (sta==LOCERR_OK) { newKey=[[SettingsKey alloc] initWithCI:fCI andKeyHandle:newKeyH]; KEYNSLOG(@"Opened settings key %s : SettingsKey object = 0x%lX",aPath,(intptr_t)newKey); } } if (aErrP) *aErrP=sta; return newKey; } // newOpenKeyByPath - (SettingsKey *)newOpenSubKeyByID:(sInt32)aID withMode:(uInt16)aMode err:(TSyError *)aErrP { KeyH newKeyH=NULL; TSyError sta=LOCERR_OK; SettingsKey *newKey=nil; // no object by default OpenSubkey_Func OpenSubkey = fCI->ui.OpenSubkey; if (!OpenSubkey) { sta=LOCERR_NOTIMP; } else { sta = OpenSubkey(fCI,&newKeyH,fKeyH,aID,aMode); if (sta==LOCERR_OK) { newKey=[[SettingsKey alloc] initWithCI:fCI andKeyHandle:newKeyH]; KEYNSLOG(@"Opened settings subkey by ID=%d (actual ID=%d): SettingsKey object = 0x%lX",aID,[newKey keyID],(intptr_t)newKey); } } if (aErrP) *aErrP=sta; return newKey; } // newOpenSubKeyByID - (sInt32)keyID { sInt32 theID = KEYVAL_ID_UNKNOWN; GetKeyID_Func GetKeyID = fCI->ui.GetKeyID; if (!GetKeyID) return KEYVAL_ID_UNKNOWN; GetKeyID(fCI, fKeyH, &theID); return theID; } // keyID - (TSyError)deleteSubKeyByID:(sInt32)aID { DeleteSubkey_Func DeleteSubkey = fCI->ui.DeleteSubkey; if (!DeleteSubkey) return LOCERR_NOTIMP; return DeleteSubkey(fCI, fKeyH, aID); } // deleteSubKeyByID // Modes - (TSyError)setTextCharset:(uInt16)aCharSet andLineEnds:(uInt16)aLineEndMode isBigEndian:(bool)aBigEndian; { SetTextMode_Func SetTextMode = fCI->ui.SetTextMode; if (!SetTextMode) return LOCERR_NOTIMP; return SetTextMode(fCI,fKeyH,aCharSet,aLineEndMode,aBigEndian); } // setTextCharset - (TSyError)setTimeMode:(uInt16)aTimeMode; { SetTimeMode_Func SetTimeMode = fCI->ui.SetTimeMode; if (!SetTimeMode) return LOCERR_NOTIMP; return SetTimeMode(fCI,fKeyH,aTimeMode); } // setTimeMode // IDs - (sInt32)valueIDByName:(cAppCharP)aValName { GetValueID_Func GetValueID= fCI->ui.GetValueID; if (!GetValueID) return KEYVAL_ID_UNKNOWN; return GetValueID(fCI, fKeyH, aValName); } // valueIDByName #pragma mark access to values // - raw - (TSyError)valueByName:(cAppCharP)aValName asType:(uInt16)aValType intoBuffer:(appPointer)aBuffer ofSize:(memSize)aBufSize valSize:(memSize *)aValSizeP { GetValue_Func GetValue= fCI->ui.GetValue; if (!GetValue) return LOCERR_NOTIMP; return GetValue(fCI, fKeyH, aValName, aValType, aBuffer, aBufSize, aValSizeP); } // valueByName - (TSyError)valueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex asType:(uInt16)aValType intoBuffer:(appPointer)aBuffer ofSize:(memSize)aBufSize valSize:(memSize *)aValSizeP { GetValueByID_Func GetValueByID= fCI->ui.GetValueByID; if (!GetValueByID) return LOCERR_NOTIMP; return GetValueByID(fCI, fKeyH, aID, aArrayIndex, aValType, aBuffer, aBufSize, aValSizeP); } // valueByID - (TSyError)setValueByName:(cAppCharP)aValName asType:(uInt16)aValType fromBuffer:(cAppPointer)aBuffer ofSize:(memSize)aValSize { SetValue_Func SetValue= fCI->ui.SetValue; if (!SetValue) return LOCERR_NOTIMP; return SetValue(fCI, fKeyH, aValName, aValType, aBuffer, aValSize); } // setValueByName - (TSyError)setValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex asType:(uInt16)aValType fromBuffer:(cAppPointer)aBuffer ofSize:(memSize)aValSize; { SetValueByID_Func SetValueByID= fCI->ui.SetValueByID; if (!SetValueByID) return LOCERR_NOTIMP; return SetValueByID(fCI, fKeyH, aID, aArrayIndex, aValType, aBuffer, aValSize); } // setValueByID // - strings // Note: it is important NOT to simplify the implementation by emulating the byName access by // trying to use valueIDByName and then valueByID, as some string values can ONLY be accessed // by name, and not by ID! - (NSString *)stringValueByName:(cAppCharP)aValName { const size_t stdBufSiz = 255; appCharP strP; size_t valSz; TSyError sta = LOCERR_OUTOFMEM; NSString *result = nil; // try with standard buffer size first strP = malloc(stdBufSiz); if (strP) { sta = [self valueByName:aValName asType:VALTYPE_TEXT intoBuffer:strP ofSize:stdBufSiz valSize:&valSz]; if (sta==LOCERR_BUFTOOSMALL || sta==LOCERR_TRUNCATED) { // buffer too small to return anything, valSz contains needed size free(strP); if (sta==LOCERR_TRUNCATED) { // buffer too small to return all data, but truncated version was returned. // - measure overall data size (valSz only contains size of truncated data now!) sta = [self valueByName:aValName asType:VALTYPE_TEXT intoBuffer:NULL ofSize:0 valSize:&valSz]; } // allocate a buffer that is large enough strP = malloc(valSz+1); if (strP!=NULL) sta = [self valueByName:aValName asType:VALTYPE_TEXT intoBuffer:strP ofSize:valSz+1 valSize:&valSz]; } if (sta==LOCERR_OK) { // got value ok, now fill into NSString // Note: if strP contains invalid UTF8, this will return nil! result = [NSString stringWithCString:strP encoding:NSUTF8StringEncoding]; #ifdef DEBUG if (!result) { DBGNSLOG(@"stringValueByName:%s returns string with incorrect UTF-8 encoding",aValName); } #endif } // return buffer free(strP); } #ifdef DEBUG if (sta!=LOCERR_OK) { DBGEXNSLOG(@"stringValueByName:%s returns err=%hd",aValName,sta); } #endif return result; } // stringValueByName - (NSString *)stringValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex { return [self stringValueByID:aID arrayIndex:aArrayIndex withStatus:NULL]; } // intValueByID - (NSString *)stringValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP { const size_t stdBufSiz = 255; appCharP strP; size_t valSz; TSyError sta = LOCERR_OUTOFMEM; NSString *result = nil; // try with standard buffer size first strP = malloc(stdBufSiz); if (strP) { sta = [self valueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_TEXT intoBuffer:strP ofSize:stdBufSiz valSize:&valSz]; if (sta==LOCERR_BUFTOOSMALL || sta==LOCERR_TRUNCATED) { // buffer too small to return anything, valSz contains needed size free(strP); if (sta==LOCERR_TRUNCATED) { // buffer too small to return all data, but truncated version was returned. // - measure overall data size (valSz only contains size of truncated data now!) sta = [self valueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_TEXT intoBuffer:NULL ofSize:0 valSize:&valSz]; } // allocate a buffer that is large enough strP = malloc(valSz+1); if (strP!=NULL) sta = [self valueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_TEXT intoBuffer:strP ofSize:valSz+1 valSize:&valSz]; } if (sta==LOCERR_OK) { // got value ok, now fill into NSString result = [NSString stringWithCString:strP encoding:NSUTF8StringEncoding]; } // return buffer free(strP); } #ifdef DEBUG if (sta!=LOCERR_OK) { DBGEXNSLOG(@"stringValueByID:%ld arrayIndex:%ld returns err=%hd",(sIntArch)aID,(sIntArch)aArrayIndex,sta); } #endif if (aStatusP) *aStatusP=sta; return result; } // stringValueByID - (TSyError)setStringValueByName:(cAppCharP)aValName toValue:(NSString *)aString { return [ self setValueByName:aValName asType:VALTYPE_TEXT fromBuffer:[(aString ? aString : @"") cStringUsingEncoding:NSUTF8StringEncoding] ofSize:(uIntArch)-1 // autosize from C-String ]; } // setStringValueByName - (TSyError)setStringValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(NSString *)aString; { return [ self setValueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_TEXT fromBuffer:[(aString ? aString : @"") cStringUsingEncoding:NSUTF8StringEncoding] ofSize:(uIntArch)-1 // autosize from C-String ]; } // setStringValueByID // int32 values - (sInt32)intValueByName:(cAppCharP)aValName { sInt32 myVal=0; size_t myValSz; #ifdef DEBUG TSyError sta; sta = #endif [self valueByName:aValName asType:VALTYPE_INT32 intoBuffer:&myVal ofSize:sizeof(myVal) valSize:&myValSz]; #ifdef DEBUG if (sta!=LOCERR_OK) { DBGEXNSLOG(@"intValueByName:%s returns err=%hd",aValName,sta); } #endif return myVal; } // intValueByName - (sInt32)intValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex { return [self intValueByID:aID arrayIndex:aArrayIndex withStatus:NULL]; } // intValueByID - (sInt32)intValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP { sInt32 myVal=0; size_t myValSz; TSyError sta; sta = [self valueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_INT32 intoBuffer:&myVal ofSize:sizeof(myVal) valSize:&myValSz]; #ifdef DEBUG if (sta!=LOCERR_OK) { DBGEXNSLOG(@"intValueByID:%ld arrayIndex:%ld returns err=%hd",(sIntArch)aID,(sIntArch)aArrayIndex,sta); } #endif if (aStatusP) *aStatusP=sta; return myVal; } // intValueByID withStatus - (TSyError)setIntValueByName:(cAppCharP)aValName toValue:(sInt32)aInt { return [self setValueByName:aValName asType:VALTYPE_INT32 fromBuffer:&aInt ofSize:sizeof(aInt)]; } // setIntValueByName - (TSyError)setIntValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(sInt32)aInt { return [self setValueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_INT32 fromBuffer:&aInt ofSize:sizeof(aInt)]; } // setIntValueByID // int64 values - (sInt64)int64ValueByName:(cAppCharP)aValName { sInt64 myVal=0; size_t myValSz; #ifdef DEBUG TSyError sta; sta = #endif [self valueByName:aValName asType:VALTYPE_INT64 intoBuffer:&myVal ofSize:sizeof(myVal) valSize:&myValSz]; #ifdef DEBUG if (sta!=LOCERR_OK) { DBGEXNSLOG(@"int64ValueByName:%s returns err=%hd\n",aValName,sta); } #endif return myVal; } // int64ValueByName - (sInt64)int64ValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex { return [self int64ValueByID:aID arrayIndex:aArrayIndex withStatus:NULL]; } // int64ValueByID - (sInt64)int64ValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP { sInt64 myVal=0; size_t myValSz; TSyError sta; sta = [self valueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_INT64 intoBuffer:&myVal ofSize:sizeof(myVal) valSize:&myValSz]; #ifdef DEBUG if (sta!=LOCERR_OK) { DBGEXNSLOG(@"intValueByID:%ld arrayIndex:%ld returns err=%hd",(sIntArch)aID,(sIntArch)aArrayIndex,sta); } #endif if (aStatusP) *aStatusP=sta; return myVal; } // int64ValueByID withStatus - (TSyError)setInt64ValueByName:(cAppCharP)aValName toValue:(sInt64)aInt { return [self setValueByName:aValName asType:VALTYPE_INT64 fromBuffer:&aInt ofSize:sizeof(aInt)]; } // setInt64ValueByName - (TSyError)setInt64ValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(sInt64)aInt { return [self setValueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_INT32 fromBuffer:&aInt ofSize:sizeof(aInt)]; } // setInt64ValueByID // date values // Note: Date values must be keys that have an ID. ID-less datetime keys cannot be used (but do not exist // in the engine, so the simplified implementation is ok here) - (NSDate *)dateValueByName:(cAppCharP)aValName { // get ID by name sInt32 valID = [self valueIDByName:aValName]; // obtain by ID return [self dateValueByID:valID arrayIndex:0]; } // dateValueByName - (NSDate *)dateValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex { return [self dateValueByID:aID arrayIndex:aArrayIndex withStatus:NULL]; } - (NSDate *)dateValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex withStatus:(TSyError *)aStatusP { sInt64 myVal; size_t myValSz; TSyError sta; [self setTimeMode:TMODE_UNIXTIME_MS+TMODE_FLAG_UTC]; // unix epoch time in milliseconds sta = [self valueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_TIME64 intoBuffer:&myVal ofSize:sizeof(myVal) valSize:&myValSz]; if (aStatusP) *aStatusP=sta; if (sta!=LOCERR_OK) return nil; // no time else { NSDate *nsdat = [NSDate dateWithTimeIntervalSince1970:(NSTimeInterval)myVal/1000.0]; DBGEXNSLOG(@"dateValueByID: myVal = %lld returned as NSDate = %@", myVal, nsdat); return nsdat; } } // dateValueByID - (TSyError)setDateValueByName:(cAppCharP)aValName toValue:(NSDate *)aDate { // get ID by name sInt32 valID = [self valueIDByName:aValName]; // obtain by ID return [self setDateValueByID:valID arrayIndex:0 toValue:aDate]; } // setDateValueByName - (TSyError)setDateValueByID:(sInt32)aID arrayIndex:(sInt32)aArrayIndex toValue:(NSDate *)aDate { sInt64 myVal = 0; // no time if (aDate!=nil) myVal = [aDate timeIntervalSince1970]*1000.0; // milliseconds DBGEXNSLOG(@"setDateValueByID: aDate = %@, returned as myVal = %lld", aDate, myVal); [self setTimeMode:TMODE_UNIXTIME_MS+TMODE_FLAG_UTC]; // unix epoch time in milliseconds return [self setValueByID:aID arrayIndex:aArrayIndex asType:VALTYPE_TIME64 fromBuffer:&myVal ofSize:sizeof(myVal)]; } // setDateValue #pragma mark basic KVC access to values - (id)valueForKey:(NSString *)key { // determine native value type uInt16 valtype; size_t myValSz; [self valueByName:[[key stringByAppendingString:@"" ".VALTYPE"] UTF8String] asType:VALTYPE_INT16 intoBuffer:&valtype ofSize:sizeof(valtype) valSize:&myValSz ]; // handle according to type switch (valtype) { case VALTYPE_TEXT: return [self stringValueByName:[key UTF8String]]; case VALTYPE_TIME64: case VALTYPE_TIME32: return [self dateValueByName:[key UTF8String]]; case VALTYPE_INT64: return [NSNumber numberWithLongLong:[self int64ValueByName:[key UTF8String]]]; case VALTYPE_INT32: case VALTYPE_INT16: case VALTYPE_INT8: return [NSNumber numberWithLong:[self intValueByName:[key UTF8String]]]; default: return nil; } } - (void)setValue:(id)value forKey:(NSString *)key { // handle according to object type if ([value isKindOfClass:[NSString class]]) { // set as string [self setStringValueByName:[key UTF8String] toValue:value]; return; } else if ([value isKindOfClass:[NSDate class]]) { // set as date [self setDateValueByName:[key UTF8String] toValue:value]; return; } else if ([value isKindOfClass:[NSNumber class]]) { [self setInt64ValueByName:[key UTF8String] toValue:[value longLongValue]]; return; } } @end // SettingsKey syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/SyncEngine.h0000644000373300037200000000637512424517753031264 0ustar00nightlyallusers00000000000000/* SyncEngine */ #import #import #include "syerror.h" #include "sync_dbapidef.h" #include "SettingsKey.h" // wrapper for a sync session @interface SyncSession : NSObject { // the call-in structure UI_Call_In fCI; struct TunnelWrapper fTW; // the session handle SessionH fSessionH; } - (id)initWithCI:(UI_Call_In)aCI andSessionHandle:(SessionH)aSessionH; - (void)dealloc; // access to session key - (SettingsKey *)newOpenSessionKeyWithMode:(uInt16)aMode err:(TSyError *)aErrP; // run the session - (TSyError)sessionStepWithCmd:(uInt16 *)aStepCmdP andProgressInfo:(TEngineProgressInfo *)aInfoP; // read and write the SyncML messages - (TSyError)getSyncMLBufferForSend:(BOOL)aForSend buffer:(appPointer *)aBuffer bufSize:(memSize *)aBufSize; - (TSyError)retSyncMLBufferForSend:(BOOL)aForSend processed:(memSize)aProcessed; // writing to session log - (void)debugLog:(NSString *)aMessage; - (void)errorLog:(NSString *)aMessage; // Tunnel DB API - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readNextItemAsText:(NSString **)aTextP itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)readItemAsText:(NSString **)aTextP itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; //%%%- (TSyError)finalizeLocalID:(NSString **)aLocIDP; - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; //%%%- (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // wrapper object for the SySync Engine @interface SyncEngine : NSObject { // the DLL interface void *fDLL; CVersion fEngineAPIVersion; // SySync interface UI_Call_In fCI; // call-in structure pointer // disconnect entry point DisconnectEngine_Func DisconnectEngine_Var; } // init and cleanup - (id)initWithLibraryPath:(NSString *)aLibraryPath andDebugFlags:(uInt16)aDebugFlags; - (id)initWithLibraryPath:(NSString *)aLibraryPath andDebugFlags:(uInt16)aDebugFlags andEntryPointPrefix:(NSString *)aEntryPointPrefix; - (void)dealloc; // Engine init - (TSyError)setStringCharset:(uInt16)aCharSet andLineEnds:(uInt16)aLineEndMode isBigEndian:(bool)aBigEndian; - (TSyError)initEngineFile:(NSString *)aPath; // sessions - (SyncSession *)newOpenSessionWithSelector:(uInt32)aSelector andSessionName:(cAppCharP)aSessionName err:(TSyError *)aErrP; // Settings access - (SettingsKey *)newOpenKeyByPath:(cAppCharP)aPath withMode:(uInt16)aMode err:(TSyError *)aErrP; @end syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m0000644000373300037200000003153612424517753031266 0ustar00nightlyallusers00000000000000#import "SyncEngine.h" #include #include "sdk_util.h" // for Plugin_Version() // wrapper for a SyncSession @implementation SyncSession - (id)initWithCI:(UI_Call_In)aCI andSessionHandle:(SessionH)aSessionH; { if ((self = [super init])) { fCI = aCI; fSessionH = aSessionH; // also prepare tunnel wrapper fTW.tCB = fCI; fTW.tContext = fSessionH; } return self; } // initWithCI // dealloc implicitly closes session - (void)dealloc { // close key if (fCI) { CloseSession_Func CloseSession= fCI->ui.CloseSession; if (CloseSession) { CloseSession(fCI,fSessionH); fSessionH=NULL; } } // done #if !__has_feature(objc_arc) [super dealloc]; #endif } // dealloc // open a new session key - (SettingsKey *)newOpenSessionKeyWithMode:(uInt16)aMode err:(TSyError *)aErrP { TSyError sta=LOCERR_OK; KeyH newKeyH=NULL; SettingsKey *newKey=nil; // no object by default OpenSessionKey_Func OpenSessionKey = fCI->ui.OpenSessionKey; if (!OpenSessionKey) { sta=LOCERR_NOTIMP; } else { sta = OpenSessionKey(fCI,fSessionH,&newKeyH,aMode); if (sta==LOCERR_OK) { newKey=[[SettingsKey alloc] initWithCI:fCI andKeyHandle:newKeyH]; } } if (aErrP) *aErrP=sta; return newKey; } - (TSyError)sessionStepWithCmd:(uInt16 *)aStepCmdP andProgressInfo:(TEngineProgressInfo *)aInfoP { SessionStep_Func SessionStep = fCI->ui.SessionStep; if (!SessionStep) return LOCERR_NOTIMP; return SessionStep(fCI,fSessionH,aStepCmdP,aInfoP); } - (TSyError)getSyncMLBufferForSend:(BOOL)aForSend buffer:(appPointer *)aBufferPP bufSize:(memSize *)aBufSizeP { GetSyncMLBuffer_Func GetSyncMLBuffer = fCI->ui.GetSyncMLBuffer; if (!GetSyncMLBuffer) return LOCERR_NOTIMP; return GetSyncMLBuffer(fCI,fSessionH,aForSend,aBufferPP,aBufSizeP); } - (TSyError)retSyncMLBufferForSend:(BOOL)aForSend processed:(memSize)aProcessed; { RetSyncMLBuffer_Func RetSyncMLBuffer = fCI->ui.RetSyncMLBuffer; if (!RetSyncMLBuffer) return LOCERR_NOTIMP; return RetSyncMLBuffer(fCI,fSessionH,aForSend,aProcessed); } // writing to session log - (void)debugLog:(NSString *)aMessage { TSyError sta; SettingsKey *sessionKey = [self newOpenSessionKeyWithMode:0 err:&sta]; if (sta==LOCERR_OK) { [sessionKey setStringValueByName:"debugMsg" toValue:aMessage]; #if !__has_feature(objc_arc) [sessionKey release]; #endif } } - (void)errorLog:(NSString *)aMessage { TSyError sta; SettingsKey *sessionKey = [self newOpenSessionKeyWithMode:0 err:&sta]; if (sta==LOCERR_OK) { [sessionKey setStringValueByName:"errorMsg" toValue:aMessage]; #if !__has_feature(objc_arc) [sessionKey release]; #endif } } // Tunnel DB API - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { SDR_Func StartDataRead = fCI->dt.StartDataRead; if (!StartDataRead) return LOCERR_NOTIMP; // call return StartDataRead((CContext)&fTW,aLastToken,aResumeToken); } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { RdNItemKFunc ReadNextItemAsKey = fCI->dt.ReadNextItemAsKey; if (!ReadNextItemAsKey) return LOCERR_NOTIMP; DisposeProc DisposeObj = fCI->dt.DisposeObj; if (!DisposeObj) return LOCERR_NOTIMP; // check params if (!aItemIdP || !aStatusP) return LOCERR_WRONGUSAGE; // prepare item ID ItemID_Struct itemID; itemID.parent = NULL; itemID.item = NULL; *aItemIdP = nil; if (aParentIdP) *aParentIdP = nil; // call TSyError sta = ReadNextItemAsKey((CContext)&fTW,&itemID,[aItemKey keyH],aStatusP,aFirst); // retrieve result strings if (sta==LOCERR_OK) { // get strings if (itemID.item) *aItemIdP = [NSString stringWithUTF8String:itemID.item]; if (itemID.parent && aParentIdP) *aParentIdP = [NSString stringWithUTF8String:itemID.parent]; } // dispose strings (if not NULL) DisposeObj((CContext)&fTW,itemID.item); DisposeObj((CContext)&fTW,itemID.parent); return sta; } - (TSyError)readNextItemAsText:(NSString **)aTextP itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { RdNItemSFunc ReadNextItem = fCI->dt.ReadNextItem; if (!ReadNextItem) return LOCERR_NOTIMP; DisposeProc DisposeObj = fCI->dt.DisposeObj; if (!DisposeObj) return LOCERR_NOTIMP; // check params if (!aItemIdP || !aStatusP) return LOCERR_WRONGUSAGE; // prepare item ID ItemID_Struct itemID; itemID.parent = NULL; itemID.item = NULL; *aItemIdP = nil; if (aParentIdP) *aParentIdP = nil; // call appCharP itemData = NULL; TSyError sta = ReadNextItem((CContext)&fTW,&itemID,&itemData,aStatusP,aFirst); // retrieve result strings if (sta==LOCERR_OK) { // get strings if (itemID.item) *aItemIdP = [NSString stringWithUTF8String:itemID.item]; if (itemID.parent && aParentIdP) *aParentIdP = [NSString stringWithUTF8String:itemID.parent]; if (itemData && aTextP) *aTextP = [NSString stringWithUTF8String:itemData]; } // dispose strings (if not NULL) DisposeObj((CContext)&fTW,itemID.item); DisposeObj((CContext)&fTW,itemID.parent); DisposeObj((CContext)&fTW,itemData); return sta; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { Rd_ItemKFunc ReadItemAsKey = fCI->dt.ReadItemAsKey; if (!ReadItemAsKey) return LOCERR_NOTIMP; // prepare item ID ItemID_Struct itemID; itemID.parent = aParentID ? (appCharP)[aParentID UTF8String] : NULL; if (!aItemID) return LOCERR_WRONGUSAGE; itemID.item = (appCharP)[aItemID UTF8String]; // call return ReadItemAsKey((CContext)&fTW,&itemID,[aItemKey keyH]); } - (TSyError)readItemAsText:(NSString **)aTextP itemID:(NSString *)aItemID parentID:(NSString *)aParentID { Rd_ItemSFunc ReadItem = fCI->dt.ReadItem; if (!ReadItem) return LOCERR_NOTIMP; DisposeProc DisposeObj = fCI->dt.DisposeObj; if (!DisposeObj) return LOCERR_NOTIMP; // prepare item ID ItemID_Struct itemID; itemID.parent = aParentID ? (appCharP)[aParentID UTF8String] : NULL; if (!aItemID) return LOCERR_WRONGUSAGE; itemID.item = (appCharP)[aItemID UTF8String]; // call appCharP itemData = NULL; TSyError sta = ReadItem((CContext)&fTW,&itemID,&itemData); if (sta==LOCERR_OK) { // get strings if (itemData && aTextP) *aTextP = [NSString stringWithUTF8String:itemData]; } // dispose strings (if not NULL) DisposeObj((CContext)&fTW,itemData); return sta; } - (TSyError)endDataRead { EDR_Func EndDataRead = fCI->dt.EndDataRead; if (!EndDataRead) return LOCERR_NOTIMP; // call return EndDataRead((CContext)&fTW); } - (TSyError)startDataWrite { return LOCERR_NOTIMP; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { return LOCERR_NOTIMP; } //%%%- (TSyError)finalizeLocalID:(NSString **)aLocIDP; - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { return LOCERR_NOTIMP; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { return LOCERR_NOTIMP; } //%%%- (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { return LOCERR_NOTIMP; } @end // SyncSession @implementation SyncEngine - (id)initWithLibraryPath:(NSString *)aLibraryPath andDebugFlags:(uInt16)aDebugFlags andEntryPointPrefix:(NSString *)aEntryPointPrefix { TSyError sta=DB_NotFound; // init members fDLL = NULL; DisconnectEngine_Var = NULL; // empty prefix if none specified if (aEntryPointPrefix==nil) aEntryPointPrefix = @""; // init superclass and DLL if ((self = [super init])) { ConnectEngine_Func ConnectEngine_Var = NULL; #ifdef SYSYNC_ENGINE_STATIC // static: just directly use the entry point. // if prefix contains "srv", we want a server engine if ([aEntryPointPrefix rangeOfString:@"srv"].location!=NSNotFound) { // server ConnectEngine_Var = &SySync_srv_ConnectEngine; DisconnectEngine_Var = &SySync_srv_DisconnectEngine; } else { // client ConnectEngine_Var = &ConnectEngine; DisconnectEngine_Var = &DisconnectEngine; } #else // dynamic: open the DLL, query the entry points fDLL = dlopen([aLibraryPath UTF8String], RTLD_LAZY); if (fDLL==NULL) { // try with .dylib ending fDLL = dlopen([[aLibraryPath stringByAppendingString:@".dylib"] UTF8String], RTLD_LAZY); } if (fDLL!=NULL) { // found the DLL, now get connect entry point (if none specified, use default) ConnectEngine_Var = dlsym(fDLL,[[aEntryPointPrefix stringByAppendingString:@"ConnectEngine"] UTF8String]); // and also remember the disconnect entry point DisconnectEngine_Var = dlsym(fDLL,[[aEntryPointPrefix stringByAppendingString:@"DisconnectEngine"] UTF8String]); } else { DBGNSLOG(@"dlopen() failed: %s\n",dlerror()); } #endif // connect to the library if (ConnectEngine_Var!=NULL) { // got the entry, call it sta = ConnectEngine_Var(&fCI, &fEngineAPIVersion, Plugin_Version(0), aDebugFlags); if (!fCI) sta=LOCERR_NOTIMP; } // now engine should be accessible if (sta==LOCERR_OK) { // prepare engine text mode [self setStringCharset:CHS_UTF8 andLineEnds:LEM_UNIX isBigEndian:true]; // get and print version SettingsKey *engineInfo = [self newOpenKeyByPath:"/engineinfo" withMode:0 err:&sta]; if (sta==LOCERR_OK) { DBGNSLOG(@"SySync engine version = '%@'\n", [engineInfo stringValueByName:"version"]); DBGNSLOG(@"SySync engine platform = '%@'\n", [engineInfo stringValueByName:"platform"]); DBGNSLOG(@"library product name = '%@'\n", [engineInfo stringValueByName:"name"]); DBGNSLOG(@"version comment = '%@'\n", [engineInfo stringValueByName:"comment"]); #if !__has_feature(objc_arc) [engineInfo release]; #endif } } } else sta=LOCERR_OUTOFMEM; // probably... // kill or go if (sta!=LOCERR_OK) { #if !__has_feature(objc_arc) [self dealloc]; #endif return nil; } // ok return self; } // initWithLibraryPath - (id)initWithLibraryPath:(NSString *)aLibraryPath andDebugFlags:(uInt16)aDebugFlags { // using standard entry point for client library return [self initWithLibraryPath:aLibraryPath andDebugFlags:aDebugFlags andEntryPointPrefix:nil]; } // initWithLibraryPath // Dealloc - (void)dealloc { // disconnect engine #ifdef SYSYNC_ENGINE_STATIC if (DisconnectEngine_Var) { DisconnectEngine_Var(fCI); } #else if (fDLL!=NULL) { // call disconnect if (DisconnectEngine_Var) { // call disconnect in engine DisconnectEngine_Var(fCI); } // unload the DLL dlclose(fDLL); fDLL=NULL; } #endif // no longer valid fCI = NULL; DisconnectEngine_Var = NULL; // done #if !__has_feature(objc_arc) [super dealloc]; #endif } // General setup - (TSyError)setStringCharset:(uInt16)aCharSet andLineEnds:(uInt16)aLineEndMode isBigEndian:(bool)aBigEndian { SetStringMode_Func SetStringMode = fCI->ui.SetStringMode; if (!SetStringMode) return LOCERR_NOTIMP; return SetStringMode(fCI,aCharSet,aLineEndMode,aBigEndian); } // setStringCharset // Init with config - (TSyError)initEngineFile:(NSString *)aPath { InitEngineFile_Func InitEngineFile = fCI->ui.InitEngineFile; if (!InitEngineFile) return LOCERR_NOTIMP; return InitEngineFile(fCI, [aPath UTF8String]); } // initEngineFile // Create a session - (SyncSession *)newOpenSessionWithSelector:(uInt32)aSelector andSessionName:(cAppCharP)aSessionName err:(TSyError *)aErrP { TSyError sta=LOCERR_OK; SessionH newSessionH=NULL; SyncSession *newSession=nil; // no object by default OpenSession_Func OpenSession = fCI->ui.OpenSession; if (!OpenSession) { sta=LOCERR_NOTIMP; } else { sta = OpenSession(fCI,&newSessionH,aSelector,aSessionName); if (sta==LOCERR_OK) { newSession=[[SyncSession alloc] initWithCI:fCI andSessionHandle:newSessionH]; } } if (aErrP) *aErrP=sta; return newSession; } // Settings access - (SettingsKey *)newOpenKeyByPath:(cAppCharP)aPath withMode:(uInt16)aMode err:(TSyError *)aErrP { TSyError sta=LOCERR_OK; KeyH newKeyH=NULL; SettingsKey *newKey=nil; // no object by default OpenKeyByPath_Func OpenKeyByPath = fCI->ui.OpenKeyByPath; if (!OpenKeyByPath) { sta=LOCERR_NOTIMP; } else { sta = OpenKeyByPath(fCI,&newKeyH,NULL,aPath,aMode); if (sta==LOCERR_OK) { newKey=[[SettingsKey alloc] initWithCI:fCI andKeyHandle:newKeyH]; DBGNSLOG(@"Opened settings key %s : SettingsKey object = 0x%lX",aPath,(intptr_t)newKey); } } if (aErrP) *aErrP=sta; return newKey; } // newOpenKeyByPath @end // SyncEnginesyncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa.h0000644000373300037200000001211412424517753032156 0ustar00nightlyallusers00000000000000/* * File: dbplugin_cocoa.h * * Author: Lukas Zeller (luz@plan44.ch) * * Wrapper for writing Synthesis SyncML engine database plugins as * Cocoa objects. * * Copyright (c) 2008-2011 by Synthesis AG + plan44.ch * */ #import #import #include "sync_include.h" // include general SDK definitions #include "sync_dbapidef.h" // include the interface file and utilities #include "SDK_util.h" // include SDK utilities #include "sync_dbapi.h" #include "SettingsKey.h" // macro used to wrap namespace around entry points for use in statically linked plugins (as needed for iPhoneOS) // in this case, .m files are not directly compiled, but included from a mydatastore_plugin_wrapper.mm C++ file // which also defines DB_PLUGIN_NAMESPACE first. // To compile the common baseclass for all statically linked plugins, dbplugin_cocoa.m must be compiled with // PLUGIN_BASECLASS defined (done by dbplugin_cocoa_wrapper.mm) #ifndef PLUGIN_BASECLASS #ifdef DB_PLUGIN_NAMESPACE #define PLUGIN_NS_BEGIN namespace DB_PLUGIN_NAMESPACE { #define PLUGIN_NS_END } #define PLUGIN_NS_USE(sym) DB_PLUGIN_NAMESPACE::sym #else #define PLUGIN_NS_BEGIN #define PLUGIN_NS_END #define PLUGIN_NS_USE(sym) sym #endif #endif // not PLUGIN_BASECLASS // forward @class CocoaPluginModule; @class CocoaPluginDB; #ifndef PLUGIN_BASECLASS PLUGIN_NS_BEGIN // Prototype for the module factory C function // (must be implemented in a subclass) CocoaPluginModule *newPluginModule( cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ); PLUGIN_NS_END #endif // not PLUGIN_BASECLASS // Wrapper for the module context @interface CocoaPluginModule : NSObject { // names NSString *fModuleName; NSString *fSubName; NSString *fContextName; // the callback structure DB_Callback fCB; } - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB; - (void)dealloc; // module level debug routines - (void)debugOut:(NSString *)aMessage; - (void)debugOutExotic:(NSString *)aMessage; - (void)debugBlockWithTag:(NSString *)aTag andDescription:(NSString *)aDesc andAttrs:(NSString *)aAttrs; - (void)debugEndBlockWithTag:(NSString *)aTag; - (void)debugEndThread; // access to CB - (DB_Callback)getCB; // Module identification + (int)buildNumber; - (cAppCharP)manufacturerName; - (cAppCharP)moduleName; // Module capabilities - (bool)hasDeleteSyncSet; // parsing plugin parameters - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion; // creating database context in this module's context - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; @end // CocoaPluginModule // Wrapper for the DB context @interface CocoaPluginDB : NSObject { // names NSString *fContextName; NSString *fDeviceKey; NSString *fUserKey; // link to module context CocoaPluginModule *fModule; // the callback structure DB_Callback fCB; } - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB; - (void)dealloc; // DB level debug routines - (void)debugOut:(NSString *)aMessage; - (void)debugOutExotic:(NSString *)aMessage; - (void)debugBlockWithTag:(NSString *)aTag andDescription:(NSString *)aDesc andAttrs:(NSString *)aAttrs; - (void)debugEndBlockWithTag:(NSString *)aTag; - (void)debugEndThread; // access to CB - (DB_Callback)getCB; // open a key from root level (same functionality as SyncEngine's newOpenKeyByPath - (SettingsKey *)newOpenKeyByPath:(cAppCharP)aPath withMode:(uInt16)aMode err:(TSyError *)aErrP; // access to session key - (SettingsKey *)newOpenSessionKeyWithMode:(uInt16)aMode err:(TSyError *)aErrP; // Context features - (sInt32)contextSupportRules:(cAppCharP)aContextRules; - (sInt32)filterSupportRules:(cAppCharP)aFilterRules; // Thread change alert - (void)threadMayChangeNow; // Read phase - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken; - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst; - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)endDataRead; // Write phase - (TSyError)startDataWrite; - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP; - (TSyError)finalizeLocalID:(NSString **)aLocIDP; - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP; - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID; - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID; - (TSyError)deleteSyncSet; - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP; @end // CocoaPluginDB syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa.m0000644000373300037200000007443112424517753032175 0ustar00nightlyallusers00000000000000/* * File: dbplugin_cocoa.m * * Author: Lukas Zeller (luz@plan44.ch) * * Wrapper for writing Synthesis SyncML engine database plugins as * Cocoa objects. * * Copyright (c) 2008-2009 by Synthesis AG * */ #include "dbplugin_cocoa.h" #define BuildNumber 0 // User defined build number #define MyDB "cocoaPlugin" /* example debug name */ #define MY_ID 42 /* example datastore context */ #define STRLEN 80 /* Max length of local string copies */ // Note: in case this source file is included from a wrapper .mm file or a static-only plugin.mm // to create statically linked plugins, only the part of the source which is specific to the // C++ namespace of the plugin is compiled, but not the ObjC part which is common to all // statically linked plugins and this must only exist once. // - A defined DB_PLUGIN_NAMESPACE here means that file generates C++ glue in a namespace for // linking the plugin statically // - A defined PLUGIN_BASECLASS here means that file generates only the ObjC baseclass // that must exist only once with statically linked plugins and is shared among all plugins. #ifndef DB_PLUGIN_NAMESPACE /* Show all fields/variables of item represented by aItemKey */ static void ShowFields(DB_Callback cb, KeyH aItemKey) { const stringSize maxstr = 128; appChar fnam[maxstr]; appChar fval[maxstr]; appChar ftz[maxstr]; uInt16 fvaltype; uInt16 farrsize; uInt16 arridx; bool fisarray; uIntArch valsize; TSyError err; uInt32 valueID,nameFlag,typeFlag,arrszFlag,tznamFlag; // set desired time mode cb->ui.SetTimeMode(cb, aItemKey, TMODE_LINEARTIME+TMODE_FLAG_FLOATING); // get flags that can be combined with valueID to get attributes of a value nameFlag = cb->ui.GetValueID(cb, aItemKey, VALNAME_FLAG VALSUFF_NAME); typeFlag = cb->ui.GetValueID(cb, aItemKey, VALNAME_FLAG VALSUFF_TYPE); arrszFlag = cb->ui.GetValueID(cb, aItemKey, VALNAME_FLAG VALSUFF_ARRSZ); tznamFlag = cb->ui.GetValueID(cb, aItemKey, VALNAME_FLAG VALSUFF_TZNAME); // iterate over all fields // - start iteration valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_FIRST); while (valueID != KEYVAL_ID_UNKNOWN && valueID != KEYVAL_NO_ID) { // get field name err = cb->ui.GetValueByID(cb, aItemKey, valueID + nameFlag, 0, VALTYPE_TEXT, fnam, maxstr, &valsize ); // get field type err = cb->ui.GetValueByID(cb, aItemKey, valueID + typeFlag, 0, VALTYPE_INT16, &fvaltype, sizeof(fvaltype), &valsize ); // check if array, and if array, get number of elements err = cb->ui.GetValueByID(cb, aItemKey, valueID + arrszFlag, 0, VALTYPE_INT16, &farrsize, sizeof(farrsize), &valsize ); fisarray = err==LOCERR_OK; if (!fisarray) { // single value err = cb->ui.GetValueByID(cb, aItemKey, valueID, 0, VALTYPE_TEXT, fval, maxstr, &valsize); if (err==LOCERR_OK) { if (fvaltype==VALTYPE_TIME64) { // for timestamps, get time zone name as well cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, 0, VALTYPE_TEXT, ftz, maxstr, &valsize); DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = %s timezone=%s",fnam,fvaltype,fval,ftz); } else DEBUG_(cb, "- %-20s (VALTYPE=%2hd) = '%s'",fnam,fvaltype,fval); } else DEBUG_(cb, "- %-20s (VALTYPE=%2hd) : No value, error=%hd",fnam,fvaltype,err); } else { // array DEBUG_(cb, "- %-20s (VALTYPE=%2d) = Array with %d elements",fnam,fvaltype,farrsize); // show elements for (arridx=0; arridxui.GetValueByID(cb, aItemKey, valueID, arridx, VALTYPE_TEXT, fval, maxstr, &valsize); if (err==LOCERR_OK) { if (fvaltype==VALTYPE_TIME64) { // for timestamps, get time zone name as well cb->ui.GetValueByID(cb, aItemKey, valueID+tznamFlag, arridx, VALTYPE_TEXT, ftz, maxstr, &valsize); DEBUG_(cb, " %20s[%3hd] = %s timezone=%s",fnam,arridx,fval,ftz); } else DEBUG_(cb, " %20s[%3hd] = '%s'",fnam,arridx,fval); } else DEBUG_(cb, " %20s[%3hd] : No value, error=%hd",fnam,arridx,err); } } // next value valueID = cb->ui.GetValueID(cb, aItemKey, VALNAME_NEXT); } // while more values } /* ShowFields */ // MODULE CONTEXT // ============== @implementation CocoaPluginModule - (id)initWithModuleName:(cAppCharP)aModuleName subName:(cAppCharP)aSubName contextName:(cAppCharP)aContextName andCB:(DB_Callback)aCB { if ([super init]!=nil) { // save the name strings fModuleName = [NSString stringWithCString:aModuleName encoding:NSUTF8StringEncoding]; fSubName = [NSString stringWithCString:aSubName encoding:NSUTF8StringEncoding]; fContextName = [NSString stringWithCString:aContextName encoding:NSUTF8StringEncoding]; // save the callback structure fCB = aCB; } return self; } - (void)dealloc { // done [super dealloc]; } // access to CB - (DB_Callback)getCB { return fCB; } // Debug routines for plugin to send messages into SyncML engine log - (void)debugOut:(NSString *)aMessage { DB_DebugPuts_Func DB_DebugPuts = fCB->DB_DebugPuts; if (!DB_DebugPuts) return; // not implemented, no output DB_DebugPuts(fCB->callbackRef, [aMessage cStringUsingEncoding:NSUTF8StringEncoding]); } - (void)debugOutExotic:(NSString *)aMessage { DB_DebugPuts_Func DB_DebugExotic = fCB->DB_DebugExotic; if (!DB_DebugExotic) return; // not implemented, no output DB_DebugExotic(fCB->callbackRef, [aMessage cStringUsingEncoding:NSUTF8StringEncoding]); } - (void)debugBlockWithTag:(NSString *)aTag andDescription:(NSString *)aDesc andAttrs:(NSString *)aAttrs { DB_DebugBlock_Func DB_DebugBlock = fCB->DB_DebugBlock; if (!DB_DebugBlock) return; // not implemented, no output DB_DebugBlock(fCB->callbackRef, [aTag cStringUsingEncoding:NSUTF8StringEncoding], [aDesc cStringUsingEncoding:NSUTF8StringEncoding], [aAttrs cStringUsingEncoding:NSUTF8StringEncoding] ); } - (void)debugEndBlockWithTag:(NSString *)aTag { DB_DebugEndBlock_Func DB_DebugEndBlock = fCB->DB_DebugEndBlock; if (!DB_DebugEndBlock) return; // not implemented, no output DB_DebugEndBlock(fCB->callbackRef,[aTag cStringUsingEncoding:NSUTF8StringEncoding]); } - (void)debugEndThread { DB_DebugEndThread_Func DB_DebugEndThread = fCB->DB_DebugEndThread; if (!DB_DebugEndThread) return; // not implemented, no output DB_DebugEndThread(fCB->callbackRef); } // Dummy implementation - should be overridden in actual DB implementations in subclass + (int)buildNumber { return 0; } - (cAppCharP)manufacturerName { return "Synthesis AG"; } - (cAppCharP)moduleName { return "CocoaPluginModule"; } - (bool)hasDeleteSyncSet { return NO; // not by default, implementation must explicitly override if it really supports it } - (TSyError)pluginParams:(cAppCharP)aParams fromEngineVersion:(long)aEngineVersion { // base class supports no params // - return error if we get any params here return aParams==NULL || *aParams==0 ? LOCERR_OK : LOCERR_CFGPARSE; } // factory method for creating database context wrappers - (CocoaPluginDB *)newPluginDBWithName:(cAppCharP)aName deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { // subclasses must return a subclass of CocoaPluginDB // this base class cannot return a db plugin return nil; } @end // CocoaPluginModule #endif // not defined DB_PLUGIN_NAMESPACE // Entry points // ------------ #ifndef PLUGIN_BASECLASS PLUGIN_NS_BEGIN // create the module context TSyError Module_CreateContext( CContext *aContext, cAppCharP aModuleName, cAppCharP aSubName, cAppCharP aContextName, DB_Callback aCB ) { // call factory C function to return suitable ObjC wrapper object // (which must be a derivate of CocoaPluginModule) // Note: for statically linked plugins, the factory method must exist in the plugin's namespace CocoaPluginModule *module = PLUGIN_NS_USE(newPluginModule)(aModuleName,aSubName,aContextName,aCB); if (module==nil) return DB_Full; // cannot allocate module context // return the object pointer as module context *aContext= (CContext)module; return LOCERR_OK; } // Module_CreateContext // Get the plug-in's version number CVersion Module_Version(CContext mContext) { // This must work with mContext=0 // (therefore, buildNumber is a class method!) return Plugin_Version([CocoaPluginModule buildNumber]); } // Module_Version // Get the plug-in's capabilities TSyError Module_Capabilities(CContext mContext, char** mCapabilities) { CocoaPluginModule *module = (CocoaPluginModule *)mContext; char s[512]; // create local string sprintf( s, CA_Platform ":%s\n" // platform DLL_Info "\n" // DLL_Info CA_MinVersion ":1.4.0.0\n" // Min version (we need >=1.4.x because of AsKey) CA_Manufacturer ":%s\n" // Manufacturer CA_Description ":%s\n" // Module description CA_ItemAsKey ":true\n" // Note: cocoa based plugins ALWAYS use AsKey mechanism CA_DeleteSyncSet ":%s\n" // Only return yes if the implementation is non-dummy! Just having the routine is not enough! Plugin_Session ":no\n" // no session routines Plugin_DS_Admin ":no\n" // no datastore admin Plugin_DS_Data_Str ":no\n" // no datastore string routines (i.e. only AsKey) Plugin_DS_Adapt ":no\n", // no datastore adapt // the variable parts in the above MyPlatform(), [module manufacturerName], [module moduleName], [module hasDeleteSyncSet] ? "yes" : "no" ); // create return string *mCapabilities= StrAlloc( s ); return LOCERR_OK; } // Module_Capabilities // provide plugin parameters TSyError Module_PluginParams(CContext mContext, cAppCharP mConfigParams, CVersion engineVersion) { CocoaPluginModule *module = (CocoaPluginModule *)mContext; return [module pluginParams:mConfigParams fromEngineVersion:engineVersion]; } // Module_PluginParams // Dispose memory created in the module context and passed back to engine void Module_DisposeObj(CContext mContext, void* memory) { StrDispose(memory); } // Module_DisposeObj // Delete module context TSyError Module_DeleteContext(CContext mContext) { CocoaPluginModule *module = (CocoaPluginModule *)mContext; // context ends, release the ObjC wrapper object [module release]; return LOCERR_OK; } // Module_DeleteContext // SESSION CONTEXT (dummy, no wrapper implemented) // Create a context for a new session TSyError Session_CreateContext(CContext *sContext, cAppCharP sessionName, DB_Callback sCB) { *sContext = 0; // Dummy context return LOCERR_OK; } // Session_CreateContext /* TSyError Session_CheckDevice( long sContext, cAppCharP aDeviceID, char** sDevKey, char** nonce ) { // session context not implemented return LOCERR_NOTIMP; } // Session_CheckDevice TSyError Session_GetNonce(long sContext, char** nonce) { // session context not implemented return LOCERR_NOTIMP; } // Session_GetNonce TSyError Session_SaveNonce(long sContext, cAppCharP nonce) { // session context not implemented return LOCERR_NOTIMP; } // Session_SaveNonce TSyError Session_SaveDeviceInfo(long sContext, cAppCharP aDeviceInfo) { // session context not implemented return LOCERR_NOTIMP; } // Session_SaveDeviceInfo // Get the plugin's DB time TSyError Session_GetDBTime(long sContext, char** currentDBTime) { // plugin does not have separate time *currentDBTime= NULL; return DB_NotFound; } // Session_GetDBTime int Session_PasswordMode(long sContext) { // dummy; session context not implemented return Password_MD5_Nonce_IN; } // Session_PasswordMode TSyError Session_Login( long sContext, cAppCharP sUsername, char** sPassword, char** sUsrKey ) { // session context not implemented return LOCERR_NOTIMP; } // Session_Login TSyError Session_Logout(long sContext) { // session context not implemented return LOCERR_NOTIMP; } // Session_Logout void Session_DisposeObj(long sContext, void* memory) { // Should never be called (we have no session!), but if, it's a string to dispose StrDispose(memory); } // Session_DisposeObj void Session_ThreadMayChangeNow(long sContext) { // NOP } // Session_ThreadMayChangeNow void Session_DispItems(long sContext, bool allFields, cAppCharP specificItem) { // NOP } // Session_DispItems */ // Delete a session context TSyError Session_DeleteContext(CContext sContext) { // NOP because we don't have a session context return LOCERR_OK; } // Session_DeleteContext PLUGIN_NS_END #endif // not PLUGIN_BASECLASS #ifndef DB_PLUGIN_NAMESPACE // DATABASE CONTEXT // ================ @implementation CocoaPluginDB - (id)initWithName:(cAppCharP)aName inModule:(CocoaPluginModule *)aModule deviceKey:(cAppCharP)aDeviceKey userKey:(cAppCharP)aUserKey andCB:(DB_Callback)aCB { if ([super init]!=nil) { // save the name strings fContextName = [NSString stringWithCString:aName encoding:NSUTF8StringEncoding]; fDeviceKey = [NSString stringWithCString:aDeviceKey encoding:NSUTF8StringEncoding]; fUserKey = [NSString stringWithCString:aUserKey encoding:NSUTF8StringEncoding]; // save the callback structure fCB = aCB; // save the link to the module wrapper object fModule = [aModule retain]; // keep it as long as I live myself } return self; } - (void)dealloc { // release the module [fModule release]; // done [super dealloc]; } // access to CB - (DB_Callback)getCB { return fCB; } // Debug routines for plugin to send messages into SyncML engine log - (void)debugOut:(NSString *)aMessage { DB_DebugPuts_Func DB_DebugPuts = fCB->DB_DebugPuts; if (!DB_DebugPuts) return; // not implemented, no output DB_DebugPuts(fCB->callbackRef, [aMessage cStringUsingEncoding:NSUTF8StringEncoding]); } - (void)debugOutExotic:(NSString *)aMessage { DB_DebugPuts_Func DB_DebugExotic = fCB->DB_DebugExotic; if (!DB_DebugExotic) return; // not implemented, no output DB_DebugExotic(fCB->callbackRef, [aMessage cStringUsingEncoding:NSUTF8StringEncoding]); } - (void)debugBlockWithTag:(NSString *)aTag andDescription:(NSString *)aDesc andAttrs:(NSString *)aAttrs { DB_DebugBlock_Func DB_DebugBlock = fCB->DB_DebugBlock; if (!DB_DebugBlock) return; // not implemented, no output DB_DebugBlock(fCB->callbackRef, [aTag cStringUsingEncoding:NSUTF8StringEncoding], [aDesc cStringUsingEncoding:NSUTF8StringEncoding], [aAttrs cStringUsingEncoding:NSUTF8StringEncoding] ); } - (void)debugEndBlockWithTag:(NSString *)aTag { DB_DebugEndBlock_Func DB_DebugEndBlock = fCB->DB_DebugEndBlock; if (!DB_DebugEndBlock) return; // not implemented, no output DB_DebugEndBlock(fCB->callbackRef,[aTag cStringUsingEncoding:NSUTF8StringEncoding]); } - (void)debugEndThread { DB_DebugEndThread_Func DB_DebugEndThread = fCB->DB_DebugEndThread; if (!DB_DebugEndThread) return; // not implemented, no output DB_DebugEndThread(fCB->callbackRef); } // open a session key - (SettingsKey *)newOpenSessionKeyWithMode:(uInt16)aMode err:(TSyError *)aErrP { TSyError sta=LOCERR_OK; KeyH newKeyH=NULL; SettingsKey *newKey=nil; // no object by default OpenSessionKey_Func OpenSessionKey = fCB->ui.OpenSessionKey; if (!OpenSessionKey) { sta=LOCERR_NOTIMP; } else { // get session key of current session (implicit for DB plugins) sta = OpenSessionKey(fCB,NULL,&newKeyH,aMode); if (sta==LOCERR_OK) { newKey=[[SettingsKey alloc] initWithCI:fCB andKeyHandle:newKeyH]; } } if (aErrP) *aErrP=sta; return newKey; } // open a key from root level - (SettingsKey *)newOpenKeyByPath:(cAppCharP)aPath withMode:(uInt16)aMode err:(TSyError *)aErrP { TSyError sta=LOCERR_OK; KeyH newKeyH=NULL; SettingsKey *newKey=nil; // no object by default OpenKeyByPath_Func OpenKeyByPath = fCB->ui.OpenKeyByPath; if (!OpenKeyByPath) { sta=LOCERR_NOTIMP; } else { // open from root (no parent) sta = OpenKeyByPath(fCB,&newKeyH,NULL,aPath,aMode); if (sta==LOCERR_OK) { newKey=[[SettingsKey alloc] initWithCI:fCB andKeyHandle:newKeyH]; DBGNSLOG(@"Opened settings key %s : SettingsKey object = 0x%lX",aPath,(intptr_t)newKey); } } if (aErrP) *aErrP=sta; return newKey; } // newOpenKeyByPath // Dummy implementation - should be overridden in actual DB implementations in subclass - (sInt32)contextSupportRules:(cAppCharP)aContextRules { // none supported return 0; } - (sInt32)filterSupportRules:(cAppCharP)aFilterRules { // none supported return 0; } - (void)threadMayChangeNow { // NOP } - (TSyError)startDataReadWithLastToken:(cAppCharP)aLastToken andResumeToken:(cAppCharP)aResumeToken { return LOCERR_NOTIMP; } - (TSyError)readNextItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP statusP:(sInt32 *)aStatusP isFirst:(BOOL)aFirst { // empty data set *aStatusP = ReadNextItem_EOF; return LOCERR_OK; } - (TSyError)readItemAsKey:(SettingsKey *)aItemKey itemID:(NSString *)aItemID parentID:(NSString *)aParentID { return DB_NotFound; } - (TSyError)endDataRead { return LOCERR_OK; } - (TSyError)startDataWrite { return LOCERR_OK; } - (TSyError)insertItemAsKey:(SettingsKey *)aItemKey parentID:(NSString *)aParentID newItemIdP:(NSString **)aNewItemIdP { return DB_Fatal; } - (TSyError)finalizeLocalID:(NSString **)aLocIDP { return DB_NoContent; // no finalisation } - (TSyError)updateItemAsKey:(SettingsKey *)aItemKey itemIdP:(NSString **)aItemIdP parentIdP:(NSString **)aParentIdP { return DB_NotFound; } - (TSyError)moveItem:(NSString *)aItemID fromParentID:(NSString *)aParentID toNewParent:(NSString *)aNewParentID { return LOCERR_NOTIMP; } - (TSyError)deleteItem:(NSString *)aItemID parentID:(NSString *)aParentID { return DB_NotFound; } - (TSyError)deleteSyncSet { return LOCERR_NOTIMP; // means: deleting items not implemented (but may still do some work, like erasing all address book groups) } - (TSyError)endDataWriteWithSuccess:(BOOL)aSuccess andNewToken:(NSString **)aNewTokenP { return LOCERR_OK; } @end // CocoaPluginDB #endif // not defined DB_PLUGIN_NAMESPACE // Entry points // ------------ #ifndef PLUGIN_BASECLASS PLUGIN_NS_BEGIN // Create a database context TSyError CreateContext( CContext* aContext, cAppCharP aContextName, DB_Callback aCB, cAppCharP sDevKey, cAppCharP sUsrKey ) { // retrieve the module context from aCB if (!aCB) return DB_Fatal; CocoaPluginModule *module = (CocoaPluginModule *)aCB->mContext; if (module==nil) return DB_Fatal; // let module context create the DB context CocoaPluginDB *db = [module newPluginDBWithName:aContextName deviceKey:sDevKey userKey:sUsrKey andCB:aCB ]; if (db==nil) return DB_Full; // return the object pointer as context *aContext= (CContext)db; return LOCERR_OK; } // CreateContext void DispItems(CContext aContext, bool allFields, cAppCharP specificItem) { // NOP } // DispItems uInt32 ContextSupport(CContext aContext, cAppCharP aContextRules) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; return [db contextSupportRules:aContextRules]; } // ContextSupport uInt32 FilterSupport(CContext aContext, cAppCharP aFilterRules) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; return [db filterSupportRules:aFilterRules]; } // FilterSupport // Dispose memory created in the DB context and passed back to engine void DisposeObj(CContext aContext, void* memory) { StrDispose(memory); } // DisposeObj /* TSyError LoadAdminData( CContext aContext, cAppCharP aLocalDB, cAppCharP aRemoteDB, const char** adminData ) { // DB admin not implemeted return LOCERR_NOTIMP; } // LoadAdminData TSyError SaveAdminData(CContext aContext, cAppCharP adminData) { // DB admin not implemeted return LOCERR_NOTIMP; } // SaveAdminData bool ReadNextMapItem(CContext aContext, MapID mID, bool aFirst) { // DB admin not implemeted return false; } // ReadNextMapItem TSyError InsertMapItem(CContext aContext, MapID mID) { // DB admin not implemeted return LOCERR_NOTIMP; } // InsertMapItem TSyError UpdateMapItem(CContext aContext, MapID mID) { // DB admin not implemeted return LOCERR_NOTIMP; } // UpdateMapItem TSyError DeleteMapItem(CContext aContext, MapID mID) { // DB admin not implemeted return LOCERR_NOTIMP; } // DeleteMapItem */ void ThreadMayChangeNow(CContext aContext) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; return [db threadMayChangeNow]; } // ThreadMayChangeNow void WriteLogData(CContext aContext, cAppCharP logData) { // not implemented } // WriteLogData /* TSyError AdaptItem( CContext aContext, char** aItemData1, char** aItemData2, char** aLocalVars, int aIdentifier ) { return LOCERR_NOTIMP; } // AdaptItem */ TSyError StartDataRead( CContext aContext, cAppCharP lastToken, cAppCharP resumeToken ) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; return [db startDataReadWithLastToken:lastToken andResumeToken:resumeToken]; } // StartDataRead /* TSyError ReadNextItem( CContext aContext, ItemID aID, char** aItemData, int* aStatus, bool aFirst ) { // Only XXXAsKey variants are supported return LOCERR_NOTIMP; } // ReadNextItem */ TSyError ReadNextItemAsKey( CContext aContext, ItemID aID, KeyH aItemKey, sInt32 *aStatus, bool aFirst ) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings NSString *itemID = nil; NSString *parentID = nil; // create wrapper for the item key SettingsKey *itemKey = [[SettingsKey alloc] initWithCI:[db getCB] andKeyHandle:aItemKey]; // call the method TSyError sta = [db readNextItemAsKey:itemKey itemIdP:&itemID parentIdP:&parentID statusP:aStatus isFirst:aFirst]; // detach the key wrapper from the handle (must NOT close it when disposing the wrapper now!) [itemKey detachFromKeyHandle]; // release the wrapper [itemKey release]; if (sta==LOCERR_OK && itemID) { // convert back IDs aID->item = StrAlloc([itemID cStringUsingEncoding:NSUTF8StringEncoding]); if (parentID) aID->parent= StrAlloc([parentID cStringUsingEncoding:NSUTF8StringEncoding]); } // release the pool [itemPool release]; // return the status return sta; } // ReadNextItemAsKey /* TSyError ReadItem(CContext aContext, ItemID aID, char** aItemData) { // Only XXXAsKey variants are supported return LOCERR_NOTIMP; } // ReadItem */ TSyError ReadItemAsKey( CContext aContext, cItemID aID, KeyH aItemKey ) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings NSString *itemID = [NSString stringWithCString:aID->item encoding:NSUTF8StringEncoding]; NSString *parentID = nil; if (aID->parent) parentID = [NSString stringWithCString:aID->parent encoding:NSUTF8StringEncoding]; // create wrapper for the item key SettingsKey *itemKey = [[SettingsKey alloc] initWithCI:[db getCB] andKeyHandle:aItemKey]; // call the method TSyError sta = [db readItemAsKey:itemKey itemID:itemID parentID:parentID]; // detach the key wrapper from the handle (must NOT close it when disposing the wrapper now!) [itemKey detachFromKeyHandle]; // release the wrapper [itemKey release]; // release the pool [itemPool release]; // return the status return sta; } // ReadItemAsKey TSyError ReadBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, void** aBlkPtr, unsigned long* aBlkSize, unsigned long* aTotSize, bool aFirst, bool* aLast ) { // Not yet implemeted return LOCERR_NOTIMP; } // ReadBlob TSyError EndDataRead(CContext aContext) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; return [db endDataRead]; } // EndDataRead TSyError StartDataWrite(CContext aContext) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; return [db startDataWrite]; } // StartDataWrite /* TSyError InsertItem(CContext aContext, cAppCharP aItemData, ItemID newID) { // Only XXXAsKey variants are supported return LOCERR_NOTIMP; } // InsertItem */ TSyError InsertItemAsKey(CContext aContext, KeyH aItemKey, ItemID newID) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings // - item ID will be returned NSString *newItemID = nil; // - parent ID might be set from caller NSString *parentID = nil; if (newID->parent) parentID = [NSString stringWithCString:newID->parent encoding:NSUTF8StringEncoding]; // create wrapper for the item key SettingsKey *itemKey = [[SettingsKey alloc] initWithCI:[db getCB] andKeyHandle:aItemKey]; // call the method TSyError sta = [db insertItemAsKey:itemKey parentID:parentID newItemIdP:&newItemID]; // detach the key wrapper from the handle (must NOT close it when disposing the wrapper now!) [itemKey detachFromKeyHandle]; // release the wrapper [itemKey release]; // convert back new ID if (sta==LOCERR_OK && newItemID) { newID->item = StrAlloc([newItemID cStringUsingEncoding:NSUTF8StringEncoding]); } // release the pool [itemPool release]; // return the status return sta; } // InsertItemAsKey TSyError FinalizeLocalID(CContext aContext, cItemID aID, ItemID updID) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings NSString *itemID = [NSString stringWithCString:aID->item encoding:NSUTF8StringEncoding]; // call the method TSyError sta = [db finalizeLocalID:&itemID]; // convert back new ID if (sta==LOCERR_OK && updID) { sta = DB_Error; if (itemID) { const char *s = [itemID cStringUsingEncoding:NSUTF8StringEncoding]; if (s) { // actually converted ID back updID->item = StrAlloc([itemID cStringUsingEncoding:NSUTF8StringEncoding]); sta = LOCERR_OK; } } } // release the pool [itemPool release]; // return the status return sta; } // FinalizeLocalID /* TSyError UpdateItem( CContext aContext, cAppCharP aItemData, const ItemID aID, ItemID updID ) { // Only XXXAsKey variants are supported return LOCERR_NOTIMP; } // UpdateItem */ TSyError UpdateItemAsKey(CContext aContext, KeyH aItemKey, cItemID aID, ItemID updID) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings NSString *itemID = [NSString stringWithCString:aID->item encoding:NSUTF8StringEncoding]; NSString *parentID = nil; if (aID->parent) parentID = [NSString stringWithCString:aID->parent encoding:NSUTF8StringEncoding]; // create wrapper for the item key SettingsKey *itemKey = [[SettingsKey alloc] initWithCI:[db getCB] andKeyHandle:aItemKey]; // call the method TSyError sta = [db updateItemAsKey:itemKey itemIdP:&itemID parentIdP:&parentID]; // detach the key wrapper from the handle (must NOT close it when disposing the wrapper now!) [itemKey detachFromKeyHandle]; // release the wrapper [itemKey release]; // convert back new ID if (sta==LOCERR_OK) { updID->item = StrAlloc([itemID cStringUsingEncoding:NSUTF8StringEncoding]); if (parentID) updID->parent= StrAlloc([parentID cStringUsingEncoding:NSUTF8StringEncoding]); } // release the pool [itemPool release]; // return the status return sta; } // UpdateItemAsKey TSyError MoveItem(CContext aContext, cItemID aID, cAppCharP newParentID) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings NSString *itemID = [NSString stringWithCString:aID->item encoding:NSUTF8StringEncoding]; NSString *parentID = [NSString stringWithCString:aID->parent encoding:NSUTF8StringEncoding]; NSString *newParentIDStr = [NSString stringWithCString:newParentID encoding:NSUTF8StringEncoding]; // call the method TSyError sta = [db moveItem:itemID fromParentID:parentID toNewParent:newParentIDStr]; // release the pool [itemPool release]; // return the status return sta; } // MoveItem TSyError DeleteSyncSet(CContext aContext) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // call the method TSyError sta = [db deleteSyncSet]; // release the pool [itemPool release]; // return the status return sta; } // DeleteSyncSet TSyError DeleteItem(CContext aContext, cItemID aID) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare strings NSString *itemID = [NSString stringWithCString:aID->item encoding:NSUTF8StringEncoding]; NSString *parentID = nil; if (aID->parent) parentID = [NSString stringWithCString:aID->parent encoding:NSUTF8StringEncoding]; // call the method TSyError sta = [db deleteItem:itemID parentID:parentID]; // release the pool [itemPool release]; // return the status return sta; } // DeleteItem TSyError WriteBlob( CContext aContext, cItemID aID, cAppCharP aBlobID, void* aBlkPtr, unsigned long aBlkSize, unsigned long aTotSize, bool aFirst, bool aLast ) { // Not yet implemeted return LOCERR_NOTIMP; } // WriteBlob TSyError DeleteBlob(CContext aContext, cItemID aID, cAppCharP aBlobID) { // Not yet implemeted return LOCERR_NOTIMP; } // DeleteBlob TSyError EndDataWrite(CContext aContext, bool success, char** newToken) { CocoaPluginDB *db = (CocoaPluginDB *)aContext; // pool for strings used in this call NSAutoreleasePool *itemPool = [[NSAutoreleasePool alloc] init]; // prepare token string NSString *newTokenString = nil; // call the method TSyError sta = [db endDataWriteWithSuccess:success andNewToken:&newTokenString]; // convert back new token if (sta==LOCERR_OK && newTokenString && newToken) { *newToken = StrAlloc([newTokenString cStringUsingEncoding:NSUTF8StringEncoding]); } // release the pool [itemPool release]; // return the status return sta; } // EndDataWrite // Delete DB context TSyError DeleteContext(CContext mContext) { CocoaPluginDB *db = (CocoaPluginDB *)mContext; // context ends, release the ObjC wrapper object [db release]; return LOCERR_OK; } // DeleteContext PLUGIN_NS_END #endif // not PLUGIN_BASECLASS /* eof */ syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa_wrapper.mm0000644000373300037200000000115212424517753034100 0ustar00nightlyallusers00000000000000/* * File: dbplugin_cocoa_wrapper.mm * * Author: Lukas Zeller (luz@plan44.ch) * * Wrapper for creating statically linked base class for cocoa database plugins * * Copyright (c) 2010 by Synthesis AG * */ // this makes dbplugin_cocoa.m compile as baseclass without C/C++ entry points for common use // for all statically linked plugins. // C++ entry points must be created for each plugin in separate namespaces - this is done by // compiling the plugin wrappers or static-only .mm plugin source files #define PLUGIN_BASECLASS 1 // the generic cocoa interface #include "dbplugin_cocoa.m" /* eof */syncevolution-1.5/src/synthesis/src/sysync_SDK/sdk_sources_cocoa/target_options.h0000644000373300037200000000043512424517753032252 0ustar00nightlyallusers00000000000000// target_options.h for SySync SDK files that need it #ifndef TARGET_OPTIONS #define TARGET_OPTIONS // Sysync related debug #define SYDEBUG 2 #if DEBUG // general app debug #define CONSOLEDBG 1 #else // no output to console, please #undef CONSOLEDBG #endif #endif // TARGET_OPTIONSsyncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/0000755000373300037200000000000012424517753025513 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/project.pbxproj0000644000373300037200000057264112424517753030606 0ustar00nightlyallusers00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ ED16A68E14B9B4E400F24032 /* platform_DLL.h in Headers */ = {isa = PBXBuildFile; fileRef = ED16A68D14B9B4E400F24032 /* platform_DLL.h */; }; ED16A68F14B9B4E400F24032 /* platform_DLL.h in Headers */ = {isa = PBXBuildFile; fileRef = ED16A68D14B9B4E400F24032 /* platform_DLL.h */; }; ED43DAD70E014BC9000A1E5C /* configfiles.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED43DAD60E014BC9000A1E5C /* configfiles.mm */; }; ED4B5EB111523AAB00ECB4A5 /* sysync_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9511523AAB00ECB4A5 /* sysync_utils.h */; }; ED4B5EB211523AAB00ECB4A5 /* sysync_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9611523AAB00ECB4A5 /* sysync_utils.cpp */; }; ED4B5EB311523AAB00ECB4A5 /* syncexception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9711523AAB00ECB4A5 /* syncexception.cpp */; }; ED4B5EB611523AAB00ECB4A5 /* lineartime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9A11523AAB00ECB4A5 /* lineartime.cpp */; }; ED4B5EB711523AAB00ECB4A5 /* san.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9B11523AAB00ECB4A5 /* san.cpp */; }; ED4B5EB811523AAB00ECB4A5 /* san.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9C11523AAB00ECB4A5 /* san.h */; }; ED4B5EB911523AAB00ECB4A5 /* sysync_md5.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9D11523AAB00ECB4A5 /* sysync_md5.h */; }; ED4B5EBA11523AAB00ECB4A5 /* sysync_md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9E11523AAB00ECB4A5 /* sysync_md5.cpp */; }; ED4B5EBB11523AAB00ECB4A5 /* sysync_b64.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9F11523AAB00ECB4A5 /* sysync_b64.h */; }; ED4B5EBC11523AAB00ECB4A5 /* sysync_b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5EA011523AAB00ECB4A5 /* sysync_b64.cpp */; }; ED4B5EBD11523AAB00ECB4A5 /* syncexception.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5EA111523AAB00ECB4A5 /* syncexception.h */; }; ED4B5EBE11523AAB00ECB4A5 /* lineartime.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5EA211523AAB00ECB4A5 /* lineartime.h */; }; ED4B5ECD11523AAB00ECB4A5 /* sysync_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9511523AAB00ECB4A5 /* sysync_utils.h */; }; ED4B5ECE11523AAB00ECB4A5 /* sysync_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9611523AAB00ECB4A5 /* sysync_utils.cpp */; }; ED4B5ECF11523AAB00ECB4A5 /* syncexception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9711523AAB00ECB4A5 /* syncexception.cpp */; }; ED4B5ED211523AAB00ECB4A5 /* lineartime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9A11523AAB00ECB4A5 /* lineartime.cpp */; }; ED4B5ED311523AAB00ECB4A5 /* san.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9B11523AAB00ECB4A5 /* san.cpp */; }; ED4B5ED411523AAB00ECB4A5 /* san.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9C11523AAB00ECB4A5 /* san.h */; }; ED4B5ED511523AAB00ECB4A5 /* sysync_md5.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9D11523AAB00ECB4A5 /* sysync_md5.h */; }; ED4B5ED611523AAB00ECB4A5 /* sysync_md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5E9E11523AAB00ECB4A5 /* sysync_md5.cpp */; }; ED4B5ED711523AAB00ECB4A5 /* sysync_b64.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5E9F11523AAB00ECB4A5 /* sysync_b64.h */; }; ED4B5ED811523AAB00ECB4A5 /* sysync_b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED4B5EA011523AAB00ECB4A5 /* sysync_b64.cpp */; }; ED4B5ED911523AAB00ECB4A5 /* syncexception.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5EA111523AAB00ECB4A5 /* syncexception.h */; }; ED4B5EDA11523AAB00ECB4A5 /* lineartime.h in Headers */ = {isa = PBXBuildFile; fileRef = ED4B5EA211523AAB00ECB4A5 /* lineartime.h */; }; ED55691F10768FAA0008C22F /* enginemodulebase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D3D0D8195A800470E44 /* enginemodulebase.h */; }; ED55692010768FAA0008C22F /* engine_defs.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D3E0D8195A800470E44 /* engine_defs.h */; }; ED55692110768FAA0008C22F /* generic_types.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D3F0D8195A800470E44 /* generic_types.h */; }; ED55692210768FAA0008C22F /* syerror.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D400D8195A800470E44 /* syerror.h */; }; ED55692310768FAA0008C22F /* admindata.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D960D81968D00470E44 /* admindata.h */; }; ED55692410768FAA0008C22F /* blobs.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D980D81968D00470E44 /* blobs.h */; }; ED55692510768FAA0008C22F /* dbitem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D9A0D81968D00470E44 /* dbitem.h */; }; ED55692610768FAA0008C22F /* sync_include.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D810D81968D00470E44 /* sync_include.h */; }; ED55692710768FAA0008C22F /* sync_dbapidef.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D820D81968D00470E44 /* sync_dbapidef.h */; }; ED55692810768FAA0008C22F /* sync_dbapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D830D81968D00470E44 /* sync_dbapi.h */; }; ED55692910768FAA0008C22F /* SDK_util.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D840D81968D00470E44 /* SDK_util.h */; }; ED55692A10768FAA0008C22F /* SDK_support.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D860D81968D00470E44 /* SDK_support.h */; }; ED55692B10768FAA0008C22F /* sync_dbapiconnect.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D7E0D81968D00470E44 /* sync_dbapiconnect.h */; }; ED55692C10768FAA0008C22F /* plugindb.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BAB0D81A0FE00F9A79C /* plugindb.h */; }; ED55692D10768FAA0008C22F /* plugindb_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BAC0D81A0FE00F9A79C /* plugindb_precomp.h */; }; ED55692E10768FAA0008C22F /* dbapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D790D81968D00470E44 /* dbapi.h */; }; ED55692F10768FAA0008C22F /* dbapi_include.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D7B0D81968D00470E44 /* dbapi_include.h */; }; ED55693010768FAA0008C22F /* pluginapiagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D750D81968D00470E44 /* pluginapiagent.h */; }; ED55693110768FAA0008C22F /* pluginapids.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D770D81968D00470E44 /* pluginapids.h */; }; ED55693210768FAA0008C22F /* DLL_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D7C0D81968D00470E44 /* DLL_interface.h */; }; ED55693310768FAA0008C22F /* odbcdb.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D6D0D81968D00470E44 /* odbcdb.h */; }; ED55693410768FAA0008C22F /* odbcdb_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D6E0D81968D00470E44 /* odbcdb_precomp.h */; }; ED55693510768FAA0008C22F /* odbcapiagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D6F0D81968D00470E44 /* odbcapiagent.h */; }; ED55693610768FAA0008C22F /* odbcapids.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D710D81968D00470E44 /* odbcapids.h */; }; ED55693810768FAA0008C22F /* clientengine_custom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DBA0D81969F00470E44 /* clientengine_custom.h */; }; ED55693910768FAA0008C22F /* clientengine_custom_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DBB0D81969F00470E44 /* clientengine_custom_precomp.h */; }; ED55693A10768FAA0008C22F /* clientengine_custom_Base.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DBC0D81969F00470E44 /* clientengine_custom_Base.h */; }; ED55693B10768FAA0008C22F /* platform_pipe.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DDB0D8196BB00470E44 /* platform_pipe.h */; }; ED55693C10768FAA0008C22F /* platform_exec.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DE30D8196BB00470E44 /* platform_exec.h */; }; ED55693D10768FAA0008C22F /* platform_headers.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DE50D8196BB00470E44 /* platform_headers.h */; }; ED55693E10768FAA0008C22F /* platform_time.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DE60D8196BB00470E44 /* platform_time.h */; }; ED55693F10768FAA0008C22F /* binfile.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEA0D8196BB00470E44 /* binfile.h */; }; ED55694010768FAA0008C22F /* configfiles.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEB0D8196BB00470E44 /* configfiles.h */; }; ED55694210768FAA0008C22F /* platform_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DED0D8196BB00470E44 /* platform_thread.h */; }; ED55694310768FAA0008C22F /* platform_mutex.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEE0D8196BB00470E44 /* platform_mutex.h */; }; ED55694410768FAA0008C22F /* platform_file.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEF0D8196BB00470E44 /* platform_file.h */; }; ED55694510768FAA0008C22F /* profiling.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DF00D8196BB00470E44 /* profiling.h */; }; ED55694610768FAA0008C22F /* engine_client_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DFF0D8196CA00470E44 /* engine_client_precomp.h */; }; ED55694710768FAA0008C22F /* engine_client.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E000D8196CA00470E44 /* engine_client.h */; }; ED55694810768FAA0008C22F /* engineclientbase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E020D8196CA00470E44 /* engineclientbase.h */; }; ED55694910768FAA0008C22F /* wsm.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806C3B0D81A89E00F9A79C /* wsm.h */; }; ED55694A10768FAA0008C22F /* sml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BC70D81A5AD00F9A79C /* sml.h */; }; ED55694B10768FAA0008C22F /* smldef.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BC80D81A5AD00F9A79C /* smldef.h */; }; ED55694C10768FAA0008C22F /* smldevinfdtd.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BC90D81A5AD00F9A79C /* smldevinfdtd.h */; }; ED55694D10768FAA0008C22F /* smldtd.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BCA0D81A5AD00F9A79C /* smldtd.h */; }; ED55694E10768FAA0008C22F /* smlerr.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BCB0D81A5AD00F9A79C /* smlerr.h */; }; ED55694F10768FAA0008C22F /* smlmetinfdtd.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BCC0D81A5AD00F9A79C /* smlmetinfdtd.h */; }; ED55695010768FAA0008C22F /* liblock.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBC0D81A58800F9A79C /* liblock.h */; }; ED55695110768FAA0008C22F /* libmem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBD0D81A58800F9A79C /* libmem.h */; }; ED55695210768FAA0008C22F /* libstr.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBE0D81A58800F9A79C /* libstr.h */; }; ED55695310768FAA0008C22F /* libutil.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBF0D81A58800F9A79C /* libutil.h */; }; ED55695410768FAA0008C22F /* mgr.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BD80D81A5D500F9A79C /* mgr.h */; }; ED55695510768FAA0008C22F /* mgrutil.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BD90D81A5D500F9A79C /* mgrutil.h */; }; ED55695610768FAA0008C22F /* xltdeccom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BE60D81A5F400F9A79C /* xltdeccom.h */; }; ED55695710768FAA0008C22F /* xltdecwbxml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BE80D81A5F400F9A79C /* xltdecwbxml.h */; }; ED55695810768FAA0008C22F /* xltdevinf.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BEB0D81A5F400F9A79C /* xltdevinf.h */; }; ED55695910768FAA0008C22F /* xltenccom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BEE0D81A5F400F9A79C /* xltenccom.h */; }; ED55695A10768FAA0008C22F /* xltencwbxml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF00D81A5F400F9A79C /* xltencwbxml.h */; }; ED55695B10768FAA0008C22F /* xltencxml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF20D81A5F400F9A79C /* xltencxml.h */; }; ED55695C10768FAA0008C22F /* xltmetinf.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF40D81A5F400F9A79C /* xltmetinf.h */; }; ED55695D10768FAA0008C22F /* xlttags.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF60D81A5F400F9A79C /* xlttags.h */; }; ED55695E10768FAA0008C22F /* xlttagtbl.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF70D81A5F400F9A79C /* xlttagtbl.h */; }; ED55695F10768FAA0008C22F /* xltutilstack.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF90D81A5F400F9A79C /* xltutilstack.h */; }; ED55696010768FAA0008C22F /* xltdec.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BFB0D81A5F400F9A79C /* xltdec.h */; }; ED55696110768FAA0008C22F /* xltenc.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BFC0D81A5F400F9A79C /* xltenc.h */; }; ED55696210768FAA0008C22F /* binfilebase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E900D81970700470E44 /* binfilebase.h */; }; ED55696310768FAA0008C22F /* binfileimplclient.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E920D81970700470E44 /* binfileimplclient.h */; }; ED55696410768FAA0008C22F /* binfileimplds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E940D81970700470E44 /* binfileimplds.h */; }; ED55696510768FAA0008C22F /* engineentry.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E960D81970700470E44 /* engineentry.h */; }; ED55696610768FAA0008C22F /* engineinterface.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E980D81970700470E44 /* engineinterface.h */; }; ED55696710768FAA0008C22F /* configelement.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E990D81970700470E44 /* configelement.h */; }; ED55696810768FAA0008C22F /* customimplds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E9B0D81970700470E44 /* customimplds.h */; }; ED55696910768FAA0008C22F /* customimplagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E9D0D81970700470E44 /* customimplagent.h */; }; ED55696A10768FAA0008C22F /* dataobjtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E9F0D81970700470E44 /* dataobjtype.h */; }; ED55696B10768FAA0008C22F /* debuglogger.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA10D81970700470E44 /* debuglogger.h */; }; ED55696C10768FAA0008C22F /* iso8601.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA30D81970700470E44 /* iso8601.h */; }; ED55696D10768FAA0008C22F /* itemfield.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA50D81970700470E44 /* itemfield.h */; }; ED55696F10768FAA0008C22F /* localengineds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA90D81970700470E44 /* localengineds.h */; }; ED55697010768FAA0008C22F /* mimediritemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EAB0D81970700470E44 /* mimediritemtype.h */; }; ED55697110768FAA0008C22F /* multifielditem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EAD0D81970700470E44 /* multifielditem.h */; }; ED55697210768FAA0008C22F /* multifielditemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EAF0D81970700470E44 /* multifielditemtype.h */; }; ED55697310768FAA0008C22F /* remotedatastore.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB10D81970700470E44 /* remotedatastore.h */; }; ED55697410768FAA0008C22F /* rrules.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB30D81970700470E44 /* rrules.h */; }; ED55697610768FAA0008C22F /* scriptcontext.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB70D81970700470E44 /* scriptcontext.h */; }; ED55697710768FAA0008C22F /* simpleitem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB90D81970700470E44 /* simpleitem.h */; }; ED55697810768FAA0008C22F /* smltk_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBB0D81970700470E44 /* smltk_precomp.h */; }; ED55697910768FAA0008C22F /* smltk_precomp_xpt.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBC0D81970700470E44 /* smltk_precomp_xpt.h */; }; ED55697A10768FAA0008C22F /* stringutils.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBD0D81970700470E44 /* stringutils.h */; }; ED55697B10768FAA0008C22F /* superdatastore.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBF0D81970700470E44 /* superdatastore.h */; }; ED55697C10768FAA0008C22F /* syncappbase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC10D81970700470E44 /* syncappbase.h */; }; ED55697D10768FAA0008C22F /* syncclientbase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC50D81970700470E44 /* syncclientbase.h */; }; ED55697E10768FAA0008C22F /* synccommand.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC70D81970700470E44 /* synccommand.h */; }; ED55697F10768FAA0008C22F /* syncdatastore.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC90D81970700470E44 /* syncdatastore.h */; }; ED55698110768FAA0008C22F /* syncitem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ECD0D81970700470E44 /* syncitem.h */; }; ED55698210768FAA0008C22F /* syncitemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ECF0D81970700470E44 /* syncitemtype.h */; }; ED55698310768FAA0008C22F /* syncsession.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ED30D81970700470E44 /* syncsession.h */; }; ED55698410768FAA0008C22F /* syserial.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ED70D81970700470E44 /* syserial.h */; }; ED55698510768FAA0008C22F /* sysync.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ED90D81970700470E44 /* sysync.h */; }; ED55698710768FAA0008C22F /* sysync_crc16.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EDC0D81970700470E44 /* sysync_crc16.h */; }; ED55698810768FAA0008C22F /* sysync_globs.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EDE0D81970700470E44 /* sysync_globs.h */; }; ED55698A10768FAA0008C22F /* sysync_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE10D81970700470E44 /* sysync_precomp.h */; }; ED55698B10768FAA0008C22F /* sysync_precomp_xpt.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE20D81970700470E44 /* sysync_precomp_xpt.h */; }; ED55698C10768FAA0008C22F /* stdlogicagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE30D81970700470E44 /* stdlogicagent.h */; }; ED55698D10768FAA0008C22F /* stdlogicds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE50D81970700470E44 /* stdlogicds.h */; }; ED55698F10768FAA0008C22F /* textitemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE90D81970700470E44 /* textitemtype.h */; }; ED55699010768FAA0008C22F /* textprofile.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EEB0D81970700470E44 /* textprofile.h */; }; ED55699110768FAA0008C22F /* timezones.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EED0D81970700470E44 /* timezones.h */; }; ED55699210768FAA0008C22F /* uiapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF00D81970700470E44 /* uiapi.h */; }; ED55699310768FAA0008C22F /* vcalendaritemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF10D81970700470E44 /* vcalendaritemtype.h */; }; ED55699410768FAA0008C22F /* vcarditemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF30D81970700470E44 /* vcarditemtype.h */; }; ED55699510768FAA0008C22F /* vtimezone.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF50D81970700470E44 /* vtimezone.h */; }; ED55699610768FAA0008C22F /* tz_table.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF70D81970700470E44 /* tz_table.h */; }; ED55699710768FAA0008C22F /* zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F4A0D81971700470E44 /* zlib.h */; }; ED55699810768FAA0008C22F /* zutil.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F4B0D81971700470E44 /* zutil.h */; }; ED55699910768FAA0008C22F /* xmlparse.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F460D81971700470E44 /* xmlparse.h */; }; ED55699A10768FAA0008C22F /* pcre_config_macosx.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F420D81971700470E44 /* pcre_config_macosx.h */; }; ED55699B10768FAA0008C22F /* pcre.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F430D81971700470E44 /* pcre.h */; }; ED55699C10768FAA0008C22F /* sysync_debug.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6960DDDBC43001657F6 /* sysync_debug.h */; }; ED55699D10768FAA0008C22F /* sync_uiapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6990DDDBCBC001657F6 /* sync_uiapi.h */; }; ED55699E10768FAA0008C22F /* xmltok.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B69C0DDDBD0A001657F6 /* xmltok.h */; }; ED55699F10768FAA0008C22F /* xmldef.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6A90DDDBD4E001657F6 /* xmldef.h */; }; ED5569A010768FAA0008C22F /* ascii.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6AF0DDDBDD9001657F6 /* ascii.h */; }; ED5569A110768FAA0008C22F /* asciitab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B00DDDBDD9001657F6 /* asciitab.h */; }; ED5569A210768FAA0008C22F /* iasciitab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B10DDDBDD9001657F6 /* iasciitab.h */; }; ED5569A310768FAA0008C22F /* latin1tab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B20DDDBDD9001657F6 /* latin1tab.h */; }; ED5569A410768FAA0008C22F /* nametab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B30DDDBDD9001657F6 /* nametab.h */; }; ED5569A510768FAA0008C22F /* utf8tab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B40DDDBDD9001657F6 /* utf8tab.h */; }; ED5569A610768FAA0008C22F /* xmlrole.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B50DDDBDD9001657F6 /* xmlrole.h */; }; ED5569AA10768FAA0008C22F /* mimedirprofile.h in Headers */ = {isa = PBXBuildFile; fileRef = EDAC08210F179E78005E9AE2 /* mimedirprofile.h */; }; ED5569AB10768FAA0008C22F /* syncagent.h in Headers */ = {isa = PBXBuildFile; fileRef = EDE194C61074A04F00439216 /* syncagent.h */; }; ED5569AE10768FAA0008C22F /* sync_dbapi_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D940D81968D00470E44 /* sync_dbapi_text.cpp */; }; ED5569AF10768FAA0008C22F /* enginemodulebase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D3C0D8195A800470E44 /* enginemodulebase.cpp */; }; ED5569B010768FAA0008C22F /* admindata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D970D81968D00470E44 /* admindata.cpp */; }; ED5569B110768FAA0008C22F /* blobs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D990D81968D00470E44 /* blobs.cpp */; }; ED5569B210768FAA0008C22F /* dbitem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D9B0D81968D00470E44 /* dbitem.cpp */; }; ED5569B310768FAA0008C22F /* SDK_util.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D850D81968D00470E44 /* SDK_util.c */; }; ED5569B410768FAA0008C22F /* SDK_support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D870D81968D00470E44 /* SDK_support.cpp */; }; ED5569B510768FAA0008C22F /* sync_dbapiconnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D7F0D81968D00470E44 /* sync_dbapiconnect.cpp */; }; ED5569B910768FAA0008C22F /* dbapi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D7A0D81968D00470E44 /* dbapi.cpp */; }; ED5569BA10768FAA0008C22F /* pluginapiagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D760D81968D00470E44 /* pluginapiagent.cpp */; }; ED5569BB10768FAA0008C22F /* pluginapids.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D780D81968D00470E44 /* pluginapids.cpp */; }; ED5569BC10768FAA0008C22F /* DLL_interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D7D0D81968D00470E44 /* DLL_interface.cpp */; }; ED5569BD10768FAA0008C22F /* odbcapiagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D700D81968D00470E44 /* odbcapiagent.cpp */; }; ED5569BE10768FAA0008C22F /* odbcapids.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D720D81968D00470E44 /* odbcapids.cpp */; }; ED5569BF10768FAA0008C22F /* clientengine_custom_Base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DBD0D81969F00470E44 /* clientengine_custom_Base.cpp */; }; ED5569C010768FAA0008C22F /* platform_pipe.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDC0D8196BB00470E44 /* platform_pipe.c */; }; ED5569C110768FAA0008C22F /* platform_thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDD0D8196BB00470E44 /* platform_thread.cpp */; }; ED5569C210768FAA0008C22F /* platform_mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDE0D8196BB00470E44 /* platform_mutex.cpp */; }; ED5569C310768FAA0008C22F /* platform_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDF0D8196BB00470E44 /* platform_file.cpp */; }; ED5569C510768FAA0008C22F /* platform_exec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE40D8196BB00470E44 /* platform_exec.c */; }; ED5569C610768FAA0008C22F /* platform_time.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE70D8196BB00470E44 /* platform_time.cpp */; }; ED5569C710768FAA0008C22F /* profiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE80D8196BB00470E44 /* profiling.cpp */; }; ED5569C810768FAA0008C22F /* binfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE90D8196BB00470E44 /* binfile.cpp */; }; ED5569C910768FAA0008C22F /* sysyncinit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DF10D8196BB00470E44 /* sysyncinit.cpp */; }; ED5569CA10768FAA0008C22F /* engineclientbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E010D8196CA00470E44 /* engineclientbase.cpp */; }; ED5569CB10768FAA0008C22F /* liblock.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BB70D81A58800F9A79C /* liblock.c */; }; ED5569CC10768FAA0008C22F /* libmem.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BB80D81A58800F9A79C /* libmem.c */; }; ED5569CD10768FAA0008C22F /* libstr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BB90D81A58800F9A79C /* libstr.c */; }; ED5569CE10768FAA0008C22F /* libutil.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BBA0D81A58800F9A79C /* libutil.c */; }; ED5569CF10768FAA0008C22F /* mgr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD10D81A5D500F9A79C /* mgr.c */; }; ED5569D010768FAA0008C22F /* mgrcmdbuilder.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD20D81A5D500F9A79C /* mgrcmdbuilder.c */; }; ED5569D110768FAA0008C22F /* mgrcmddispatcher.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD30D81A5D500F9A79C /* mgrcmddispatcher.c */; }; ED5569D210768FAA0008C22F /* mgrinstancelist.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD40D81A5D500F9A79C /* mgrinstancelist.c */; }; ED5569D310768FAA0008C22F /* mgrinstancemgr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD50D81A5D500F9A79C /* mgrinstancemgr.c */; }; ED5569D410768FAA0008C22F /* mgrutil.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD60D81A5D500F9A79C /* mgrutil.c */; }; ED5569D510768FAA0008C22F /* xltdec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BE50D81A5F400F9A79C /* xltdec.c */; }; ED5569D610768FAA0008C22F /* xltdecwbxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BE70D81A5F400F9A79C /* xltdecwbxml.c */; }; ED5569D710768FAA0008C22F /* xltdecxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BE90D81A5F400F9A79C /* xltdecxml.c */; }; ED5569D810768FAA0008C22F /* xltdevinf.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BEA0D81A5F400F9A79C /* xltdevinf.c */; }; ED5569D910768FAA0008C22F /* xltenc.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BEC0D81A5F400F9A79C /* xltenc.c */; }; ED5569DA10768FAA0008C22F /* xltenccom.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BED0D81A5F400F9A79C /* xltenccom.c */; }; ED5569DB10768FAA0008C22F /* xltencwbxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BEF0D81A5F400F9A79C /* xltencwbxml.c */; }; ED5569DC10768FAA0008C22F /* xltencxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF10D81A5F400F9A79C /* xltencxml.c */; }; ED5569DD10768FAA0008C22F /* xltmetinf.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF30D81A5F400F9A79C /* xltmetinf.c */; }; ED5569DE10768FAA0008C22F /* xlttags.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF50D81A5F400F9A79C /* xlttags.c */; }; ED5569DF10768FAA0008C22F /* xltutilstack.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF80D81A5F400F9A79C /* xltutilstack.c */; }; ED5569E010768FAA0008C22F /* binfilebase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E8F0D81970700470E44 /* binfilebase.cpp */; }; ED5569E110768FAA0008C22F /* binfileimplclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E910D81970700470E44 /* binfileimplclient.cpp */; }; ED5569E210768FAA0008C22F /* binfileimplds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E930D81970700470E44 /* binfileimplds.cpp */; }; ED5569E310768FAA0008C22F /* engineentry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E950D81970700470E44 /* engineentry.cpp */; }; ED5569E410768FAA0008C22F /* engineinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E970D81970700470E44 /* engineinterface.cpp */; }; ED5569E510768FAA0008C22F /* configelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E9A0D81970700470E44 /* configelement.cpp */; }; ED5569E610768FAA0008C22F /* customimplds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E9C0D81970700470E44 /* customimplds.cpp */; }; ED5569E710768FAA0008C22F /* customimplagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E9E0D81970700470E44 /* customimplagent.cpp */; }; ED5569E810768FAA0008C22F /* dataobjtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA00D81970700470E44 /* dataobjtype.cpp */; }; ED5569E910768FAA0008C22F /* debuglogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA20D81970700470E44 /* debuglogger.cpp */; }; ED5569EA10768FAA0008C22F /* iso8601.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA40D81970700470E44 /* iso8601.cpp */; }; ED5569EB10768FAA0008C22F /* itemfield.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA60D81970700470E44 /* itemfield.cpp */; }; ED5569ED10768FAA0008C22F /* localengineds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EAA0D81970700470E44 /* localengineds.cpp */; }; ED5569EE10768FAA0008C22F /* mimediritemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EAC0D81970700470E44 /* mimediritemtype.cpp */; }; ED5569EF10768FAA0008C22F /* multifielditem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EAE0D81970700470E44 /* multifielditem.cpp */; }; ED5569F010768FAA0008C22F /* multifielditemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB00D81970700470E44 /* multifielditemtype.cpp */; }; ED5569F110768FAA0008C22F /* remotedatastore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB20D81970700470E44 /* remotedatastore.cpp */; }; ED5569F210768FAA0008C22F /* rrules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB40D81970700470E44 /* rrules.cpp */; }; ED5569F410768FAA0008C22F /* scriptcontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB80D81970700470E44 /* scriptcontext.cpp */; }; ED5569F510768FAA0008C22F /* simpleitem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EBA0D81970700470E44 /* simpleitem.cpp */; }; ED5569F610768FAA0008C22F /* stringutils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EBE0D81970700470E44 /* stringutils.cpp */; }; ED5569F710768FAA0008C22F /* superdatastore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC00D81970700470E44 /* superdatastore.cpp */; }; ED5569F810768FAA0008C22F /* syncappbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC20D81970700470E44 /* syncappbase.cpp */; }; ED5569F910768FAA0008C22F /* syncclientbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC60D81970700470E44 /* syncclientbase.cpp */; }; ED5569FA10768FAA0008C22F /* synccommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC80D81970700470E44 /* synccommand.cpp */; }; ED5569FB10768FAA0008C22F /* syncdatastore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ECA0D81970700470E44 /* syncdatastore.cpp */; }; ED5569FD10768FAA0008C22F /* syncitem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ECE0D81970700470E44 /* syncitem.cpp */; }; ED5569FE10768FAA0008C22F /* syncitemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ED00D81970700470E44 /* syncitemtype.cpp */; }; ED5569FF10768FAA0008C22F /* syncsession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ED40D81970700470E44 /* syncsession.cpp */; }; ED556A0210768FAA0008C22F /* sysync_crc16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EDD0D81970700470E44 /* sysync_crc16.cpp */; }; ED556A0410768FAA0008C22F /* stdlogicagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EE40D81970700470E44 /* stdlogicagent.cpp */; }; ED556A0510768FAA0008C22F /* stdlogicds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EE60D81970700470E44 /* stdlogicds.cpp */; }; ED556A0710768FAA0008C22F /* textitemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEA0D81970700470E44 /* textitemtype.cpp */; }; ED556A0810768FAA0008C22F /* textprofile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEC0D81970700470E44 /* textprofile.cpp */; }; ED556A0910768FAA0008C22F /* timezones.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEE0D81970700470E44 /* timezones.cpp */; }; ED556A0A10768FAA0008C22F /* uiapi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEF0D81970700470E44 /* uiapi.cpp */; }; ED556A0B10768FAA0008C22F /* vcalendaritemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EF20D81970700470E44 /* vcalendaritemtype.cpp */; }; ED556A0C10768FAA0008C22F /* vcarditemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EF40D81970700470E44 /* vcarditemtype.cpp */; }; ED556A0D10768FAA0008C22F /* vtimezone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EF60D81970700470E44 /* vtimezone.cpp */; }; ED556A0E10768FAA0008C22F /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4C0D81971700470E44 /* infback.c */; }; ED556A0F10768FAA0008C22F /* gzio.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4D0D81971700470E44 /* gzio.c */; }; ED556A1010768FAA0008C22F /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4E0D81971700470E44 /* deflate.c */; }; ED556A1110768FAA0008C22F /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4F0D81971700470E44 /* uncompr.c */; }; ED556A1210768FAA0008C22F /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F500D81971700470E44 /* trees.c */; }; ED556A1310768FAA0008C22F /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F510D81971700470E44 /* inftrees.c */; }; ED556A1410768FAA0008C22F /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F520D81971700470E44 /* inflate.c */; }; ED556A1510768FAA0008C22F /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F530D81971700470E44 /* inffast.c */; }; ED556A1610768FAA0008C22F /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F540D81971700470E44 /* zutil.c */; }; ED556A1710768FAA0008C22F /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F550D81971700470E44 /* crc32.c */; }; ED556A1810768FAA0008C22F /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F560D81971700470E44 /* compress.c */; }; ED556A1910768FAA0008C22F /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F570D81971700470E44 /* adler32.c */; }; ED556A1A10768FAA0008C22F /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F450D81971700470E44 /* xmlparse.c */; }; ED556A1B10768FAA0008C22F /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F470D81971700470E44 /* xmltok.c */; }; ED556A1C10768FAA0008C22F /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F480D81971700470E44 /* xmlrole.c */; }; ED556A1D10768FAA0008C22F /* pcre_ord2utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F300D81971700470E44 /* pcre_ord2utf8.c */; }; ED556A1E10768FAA0008C22F /* pcre_chartables.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F310D81971700470E44 /* pcre_chartables.c */; }; ED556A1F10768FAA0008C22F /* pcre_compile.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F320D81971700470E44 /* pcre_compile.c */; }; ED556A2010768FAA0008C22F /* pcre_config.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F330D81971700470E44 /* pcre_config.c */; }; ED556A2110768FAA0008C22F /* pcre_dfa_exec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F340D81971700470E44 /* pcre_dfa_exec.c */; }; ED556A2210768FAA0008C22F /* pcre_exec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F350D81971700470E44 /* pcre_exec.c */; }; ED556A2310768FAA0008C22F /* pcre_fullinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F360D81971700470E44 /* pcre_fullinfo.c */; }; ED556A2410768FAA0008C22F /* pcre_get.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F370D81971700470E44 /* pcre_get.c */; }; ED556A2510768FAA0008C22F /* pcre_globals.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F380D81971700470E44 /* pcre_globals.c */; }; ED556A2610768FAA0008C22F /* pcre_info.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F390D81971700470E44 /* pcre_info.c */; }; ED556A2710768FAA0008C22F /* pcre_newline.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3A0D81971700470E44 /* pcre_newline.c */; }; ED556A2810768FAA0008C22F /* pcre_refcount.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3B0D81971700470E44 /* pcre_refcount.c */; }; ED556A2910768FAA0008C22F /* pcre_study.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3C0D81971700470E44 /* pcre_study.c */; }; ED556A2A10768FAA0008C22F /* pcre_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3D0D81971700470E44 /* pcre_tables.c */; }; ED556A2B10768FAA0008C22F /* pcre_try_flipped.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3E0D81971700470E44 /* pcre_try_flipped.c */; }; ED556A2C10768FAA0008C22F /* pcre_valid_utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3F0D81971700470E44 /* pcre_valid_utf8.c */; }; ED556A2D10768FAA0008C22F /* pcre_version.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F400D81971700470E44 /* pcre_version.c */; }; ED556A2E10768FAA0008C22F /* pcre_xclass.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F410D81971700470E44 /* pcre_xclass.c */; }; ED556A2F10768FAA0008C22F /* configfiles.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED43DAD60E014BC9000A1E5C /* configfiles.mm */; }; ED556A3410768FAA0008C22F /* mimedirprofile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDAC08220F179E78005E9AE2 /* mimedirprofile.cpp */; }; ED556A3510768FAA0008C22F /* platform_timezones.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED5B87FA0F8559C40042779A /* platform_timezones.mm */; }; ED556A3610768FAA0008C22F /* syncagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDE194C71074A04F00439216 /* syncagent.cpp */; }; ED556A4410768FD90008C22F /* combi_product_options.h in Headers */ = {isa = PBXBuildFile; fileRef = ED556A3E10768FD90008C22F /* combi_product_options.h */; }; ED556A4510768FD90008C22F /* serverengine_custom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED556A3F10768FD90008C22F /* serverengine_custom.h */; }; ED556A4610768FD90008C22F /* serverengine_custom_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED556A4010768FD90008C22F /* serverengine_custom_precomp.h */; }; ED556A4710768FD90008C22F /* serverengine_custom_Base.h in Headers */ = {isa = PBXBuildFile; fileRef = ED556A4110768FD90008C22F /* serverengine_custom_Base.h */; }; ED556A4810768FD90008C22F /* serverengine_custom_Base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED556A4210768FD90008C22F /* serverengine_custom_Base.cpp */; }; ED556A50107692F20008C22F /* enginesessiondispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED556A4E107692F20008C22F /* enginesessiondispatch.cpp */; }; ED556A51107692F20008C22F /* enginesessiondispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = ED556A4F107692F20008C22F /* enginesessiondispatch.h */; }; ED5B87FB0F8559C40042779A /* platform_timezones.mm in Sources */ = {isa = PBXBuildFile; fileRef = ED5B87FA0F8559C40042779A /* platform_timezones.mm */; }; ED60E7680DF54F870087381E /* enginemodulebase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D3D0D8195A800470E44 /* enginemodulebase.h */; }; ED60E7690DF54F870087381E /* engine_defs.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D3E0D8195A800470E44 /* engine_defs.h */; }; ED60E76A0DF54F870087381E /* generic_types.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D3F0D8195A800470E44 /* generic_types.h */; }; ED60E76B0DF54F870087381E /* syerror.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D400D8195A800470E44 /* syerror.h */; }; ED60E76C0DF54F870087381E /* admindata.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D960D81968D00470E44 /* admindata.h */; }; ED60E76D0DF54F870087381E /* blobs.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D980D81968D00470E44 /* blobs.h */; }; ED60E76E0DF54F870087381E /* dbitem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D9A0D81968D00470E44 /* dbitem.h */; }; ED60E76F0DF54F870087381E /* sync_include.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D810D81968D00470E44 /* sync_include.h */; }; ED60E7700DF54F870087381E /* sync_dbapidef.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D820D81968D00470E44 /* sync_dbapidef.h */; }; ED60E7710DF54F870087381E /* sync_dbapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D830D81968D00470E44 /* sync_dbapi.h */; }; ED60E7720DF54F870087381E /* SDK_util.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D840D81968D00470E44 /* SDK_util.h */; }; ED60E7730DF54F870087381E /* SDK_support.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D860D81968D00470E44 /* SDK_support.h */; }; ED60E7740DF54F870087381E /* sync_dbapiconnect.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D7E0D81968D00470E44 /* sync_dbapiconnect.h */; }; ED60E7750DF54F870087381E /* plugindb.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BAB0D81A0FE00F9A79C /* plugindb.h */; }; ED60E7760DF54F870087381E /* plugindb_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BAC0D81A0FE00F9A79C /* plugindb_precomp.h */; }; ED60E7770DF54F870087381E /* dbapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D790D81968D00470E44 /* dbapi.h */; }; ED60E7780DF54F870087381E /* dbapi_include.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D7B0D81968D00470E44 /* dbapi_include.h */; }; ED60E7790DF54F870087381E /* pluginapiagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D750D81968D00470E44 /* pluginapiagent.h */; }; ED60E77A0DF54F870087381E /* pluginapids.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D770D81968D00470E44 /* pluginapids.h */; }; ED60E77B0DF54F870087381E /* DLL_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D7C0D81968D00470E44 /* DLL_interface.h */; }; ED60E77C0DF54F870087381E /* odbcdb.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D6D0D81968D00470E44 /* odbcdb.h */; }; ED60E77D0DF54F870087381E /* odbcdb_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D6E0D81968D00470E44 /* odbcdb_precomp.h */; }; ED60E77E0DF54F870087381E /* odbcapiagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D6F0D81968D00470E44 /* odbcapiagent.h */; }; ED60E77F0DF54F870087381E /* odbcapids.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3D710D81968D00470E44 /* odbcapids.h */; }; ED60E7810DF54F870087381E /* clientengine_custom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DBA0D81969F00470E44 /* clientengine_custom.h */; }; ED60E7820DF54F870087381E /* clientengine_custom_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DBB0D81969F00470E44 /* clientengine_custom_precomp.h */; }; ED60E7830DF54F870087381E /* clientengine_custom_Base.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DBC0D81969F00470E44 /* clientengine_custom_Base.h */; }; ED60E7840DF54F870087381E /* platform_pipe.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DDB0D8196BB00470E44 /* platform_pipe.h */; }; ED60E7850DF54F870087381E /* platform_exec.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DE30D8196BB00470E44 /* platform_exec.h */; }; ED60E7860DF54F870087381E /* platform_headers.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DE50D8196BB00470E44 /* platform_headers.h */; }; ED60E7870DF54F870087381E /* platform_time.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DE60D8196BB00470E44 /* platform_time.h */; }; ED60E7880DF54F870087381E /* binfile.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEA0D8196BB00470E44 /* binfile.h */; }; ED60E7890DF54F870087381E /* configfiles.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEB0D8196BB00470E44 /* configfiles.h */; }; ED60E78B0DF54F870087381E /* platform_thread.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DED0D8196BB00470E44 /* platform_thread.h */; }; ED60E78C0DF54F870087381E /* platform_mutex.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEE0D8196BB00470E44 /* platform_mutex.h */; }; ED60E78D0DF54F870087381E /* platform_file.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DEF0D8196BB00470E44 /* platform_file.h */; }; ED60E78E0DF54F870087381E /* profiling.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DF00D8196BB00470E44 /* profiling.h */; }; ED60E78F0DF54F870087381E /* engine_client_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3DFF0D8196CA00470E44 /* engine_client_precomp.h */; }; ED60E7900DF54F870087381E /* engine_client.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E000D8196CA00470E44 /* engine_client.h */; }; ED60E7910DF54F870087381E /* engineclientbase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E020D8196CA00470E44 /* engineclientbase.h */; }; ED60E7920DF54F870087381E /* wsm.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806C3B0D81A89E00F9A79C /* wsm.h */; }; ED60E7930DF54F870087381E /* sml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BC70D81A5AD00F9A79C /* sml.h */; }; ED60E7940DF54F870087381E /* smldef.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BC80D81A5AD00F9A79C /* smldef.h */; }; ED60E7950DF54F870087381E /* smldevinfdtd.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BC90D81A5AD00F9A79C /* smldevinfdtd.h */; }; ED60E7960DF54F870087381E /* smldtd.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BCA0D81A5AD00F9A79C /* smldtd.h */; }; ED60E7970DF54F870087381E /* smlerr.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BCB0D81A5AD00F9A79C /* smlerr.h */; }; ED60E7980DF54F870087381E /* smlmetinfdtd.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BCC0D81A5AD00F9A79C /* smlmetinfdtd.h */; }; ED60E7990DF54F870087381E /* liblock.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBC0D81A58800F9A79C /* liblock.h */; }; ED60E79A0DF54F870087381E /* libmem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBD0D81A58800F9A79C /* libmem.h */; }; ED60E79B0DF54F870087381E /* libstr.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBE0D81A58800F9A79C /* libstr.h */; }; ED60E79C0DF54F870087381E /* libutil.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BBF0D81A58800F9A79C /* libutil.h */; }; ED60E79D0DF54F870087381E /* mgr.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BD80D81A5D500F9A79C /* mgr.h */; }; ED60E79E0DF54F870087381E /* mgrutil.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BD90D81A5D500F9A79C /* mgrutil.h */; }; ED60E79F0DF54F870087381E /* xltdeccom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BE60D81A5F400F9A79C /* xltdeccom.h */; }; ED60E7A00DF54F870087381E /* xltdecwbxml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BE80D81A5F400F9A79C /* xltdecwbxml.h */; }; ED60E7A10DF54F870087381E /* xltdevinf.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BEB0D81A5F400F9A79C /* xltdevinf.h */; }; ED60E7A20DF54F870087381E /* xltenccom.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BEE0D81A5F400F9A79C /* xltenccom.h */; }; ED60E7A30DF54F870087381E /* xltencwbxml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF00D81A5F400F9A79C /* xltencwbxml.h */; }; ED60E7A40DF54F870087381E /* xltencxml.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF20D81A5F400F9A79C /* xltencxml.h */; }; ED60E7A50DF54F870087381E /* xltmetinf.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF40D81A5F400F9A79C /* xltmetinf.h */; }; ED60E7A60DF54F870087381E /* xlttags.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF60D81A5F400F9A79C /* xlttags.h */; }; ED60E7A70DF54F870087381E /* xlttagtbl.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF70D81A5F400F9A79C /* xlttagtbl.h */; }; ED60E7A80DF54F870087381E /* xltutilstack.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BF90D81A5F400F9A79C /* xltutilstack.h */; }; ED60E7A90DF54F870087381E /* xltdec.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BFB0D81A5F400F9A79C /* xltdec.h */; }; ED60E7AA0DF54F870087381E /* xltenc.h in Headers */ = {isa = PBXBuildFile; fileRef = ED806BFC0D81A5F400F9A79C /* xltenc.h */; }; ED60E7AB0DF54F870087381E /* binfilebase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E900D81970700470E44 /* binfilebase.h */; }; ED60E7AC0DF54F870087381E /* binfileimplclient.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E920D81970700470E44 /* binfileimplclient.h */; }; ED60E7AD0DF54F870087381E /* binfileimplds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E940D81970700470E44 /* binfileimplds.h */; }; ED60E7AE0DF54F870087381E /* engineentry.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E960D81970700470E44 /* engineentry.h */; }; ED60E7AF0DF54F870087381E /* engineinterface.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E980D81970700470E44 /* engineinterface.h */; }; ED60E7B00DF54F870087381E /* configelement.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E990D81970700470E44 /* configelement.h */; }; ED60E7B10DF54F870087381E /* customimplds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E9B0D81970700470E44 /* customimplds.h */; }; ED60E7B20DF54F870087381E /* customimplagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E9D0D81970700470E44 /* customimplagent.h */; }; ED60E7B30DF54F870087381E /* dataobjtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3E9F0D81970700470E44 /* dataobjtype.h */; }; ED60E7B40DF54F870087381E /* debuglogger.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA10D81970700470E44 /* debuglogger.h */; }; ED60E7B50DF54F870087381E /* iso8601.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA30D81970700470E44 /* iso8601.h */; }; ED60E7B60DF54F870087381E /* itemfield.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA50D81970700470E44 /* itemfield.h */; }; ED60E7B80DF54F870087381E /* localengineds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EA90D81970700470E44 /* localengineds.h */; }; ED60E7B90DF54F870087381E /* mimediritemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EAB0D81970700470E44 /* mimediritemtype.h */; }; ED60E7BA0DF54F870087381E /* multifielditem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EAD0D81970700470E44 /* multifielditem.h */; }; ED60E7BB0DF54F870087381E /* multifielditemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EAF0D81970700470E44 /* multifielditemtype.h */; }; ED60E7BC0DF54F870087381E /* remotedatastore.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB10D81970700470E44 /* remotedatastore.h */; }; ED60E7BD0DF54F870087381E /* rrules.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB30D81970700470E44 /* rrules.h */; }; ED60E7BF0DF54F870087381E /* scriptcontext.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB70D81970700470E44 /* scriptcontext.h */; }; ED60E7C00DF54F870087381E /* simpleitem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EB90D81970700470E44 /* simpleitem.h */; }; ED60E7C10DF54F870087381E /* smltk_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBB0D81970700470E44 /* smltk_precomp.h */; }; ED60E7C20DF54F870087381E /* smltk_precomp_xpt.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBC0D81970700470E44 /* smltk_precomp_xpt.h */; }; ED60E7C30DF54F870087381E /* stringutils.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBD0D81970700470E44 /* stringutils.h */; }; ED60E7C40DF54F870087381E /* superdatastore.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EBF0D81970700470E44 /* superdatastore.h */; }; ED60E7C50DF54F870087381E /* syncappbase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC10D81970700470E44 /* syncappbase.h */; }; ED60E7C70DF54F870087381E /* syncclientbase.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC50D81970700470E44 /* syncclientbase.h */; }; ED60E7C80DF54F870087381E /* synccommand.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC70D81970700470E44 /* synccommand.h */; }; ED60E7C90DF54F870087381E /* syncdatastore.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EC90D81970700470E44 /* syncdatastore.h */; }; ED60E7CB0DF54F870087381E /* syncitem.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ECD0D81970700470E44 /* syncitem.h */; }; ED60E7CC0DF54F870087381E /* syncitemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ECF0D81970700470E44 /* syncitemtype.h */; }; ED60E7CD0DF54F870087381E /* syncsession.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ED30D81970700470E44 /* syncsession.h */; }; ED60E7CE0DF54F870087381E /* syserial.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ED70D81970700470E44 /* syserial.h */; }; ED60E7CF0DF54F870087381E /* sysync.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3ED90D81970700470E44 /* sysync.h */; }; ED60E7D10DF54F870087381E /* sysync_crc16.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EDC0D81970700470E44 /* sysync_crc16.h */; }; ED60E7D20DF54F870087381E /* sysync_globs.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EDE0D81970700470E44 /* sysync_globs.h */; }; ED60E7D40DF54F870087381E /* sysync_precomp.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE10D81970700470E44 /* sysync_precomp.h */; }; ED60E7D50DF54F870087381E /* sysync_precomp_xpt.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE20D81970700470E44 /* sysync_precomp_xpt.h */; }; ED60E7D60DF54F870087381E /* stdlogicagent.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE30D81970700470E44 /* stdlogicagent.h */; }; ED60E7D70DF54F870087381E /* stdlogicds.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE50D81970700470E44 /* stdlogicds.h */; }; ED60E7D90DF54F870087381E /* textitemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EE90D81970700470E44 /* textitemtype.h */; }; ED60E7DA0DF54F870087381E /* textprofile.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EEB0D81970700470E44 /* textprofile.h */; }; ED60E7DB0DF54F870087381E /* timezones.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EED0D81970700470E44 /* timezones.h */; }; ED60E7DC0DF54F870087381E /* uiapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF00D81970700470E44 /* uiapi.h */; }; ED60E7DD0DF54F870087381E /* vcalendaritemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF10D81970700470E44 /* vcalendaritemtype.h */; }; ED60E7DE0DF54F870087381E /* vcarditemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF30D81970700470E44 /* vcarditemtype.h */; }; ED60E7DF0DF54F870087381E /* vtimezone.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF50D81970700470E44 /* vtimezone.h */; }; ED60E7E00DF54F870087381E /* tz_table.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3EF70D81970700470E44 /* tz_table.h */; }; ED60E7E10DF54F870087381E /* zlib.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F4A0D81971700470E44 /* zlib.h */; }; ED60E7E20DF54F870087381E /* zutil.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F4B0D81971700470E44 /* zutil.h */; }; ED60E7E30DF54F870087381E /* xmlparse.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F460D81971700470E44 /* xmlparse.h */; }; ED60E7E40DF54F870087381E /* pcre_config_macosx.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F420D81971700470E44 /* pcre_config_macosx.h */; }; ED60E7E50DF54F870087381E /* pcre.h in Headers */ = {isa = PBXBuildFile; fileRef = ED9D3F430D81971700470E44 /* pcre.h */; }; ED60E7EA0DF54F870087381E /* sysync_debug.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6960DDDBC43001657F6 /* sysync_debug.h */; }; ED60E7EB0DF54F870087381E /* sync_uiapi.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6990DDDBCBC001657F6 /* sync_uiapi.h */; }; ED60E7EC0DF54F870087381E /* xmltok.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B69C0DDDBD0A001657F6 /* xmltok.h */; }; ED60E7ED0DF54F870087381E /* xmldef.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6A90DDDBD4E001657F6 /* xmldef.h */; }; ED60E7EE0DF54F870087381E /* ascii.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6AF0DDDBDD9001657F6 /* ascii.h */; }; ED60E7EF0DF54F870087381E /* asciitab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B00DDDBDD9001657F6 /* asciitab.h */; }; ED60E7F00DF54F870087381E /* iasciitab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B10DDDBDD9001657F6 /* iasciitab.h */; }; ED60E7F10DF54F870087381E /* latin1tab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B20DDDBDD9001657F6 /* latin1tab.h */; }; ED60E7F20DF54F870087381E /* nametab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B30DDDBDD9001657F6 /* nametab.h */; }; ED60E7F30DF54F870087381E /* utf8tab.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B40DDDBDD9001657F6 /* utf8tab.h */; }; ED60E7F40DF54F870087381E /* xmlrole.h in Headers */ = {isa = PBXBuildFile; fileRef = ED55B6B50DDDBDD9001657F6 /* xmlrole.h */; }; ED60E7F70DF54F870087381E /* sync_dbapi_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D940D81968D00470E44 /* sync_dbapi_text.cpp */; }; ED60E7F80DF54F870087381E /* enginemodulebase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D3C0D8195A800470E44 /* enginemodulebase.cpp */; }; ED60E7F90DF54F870087381E /* admindata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D970D81968D00470E44 /* admindata.cpp */; }; ED60E7FA0DF54F870087381E /* blobs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D990D81968D00470E44 /* blobs.cpp */; }; ED60E7FB0DF54F870087381E /* dbitem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D9B0D81968D00470E44 /* dbitem.cpp */; }; ED60E7FC0DF54F870087381E /* SDK_util.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D850D81968D00470E44 /* SDK_util.c */; }; ED60E7FD0DF54F870087381E /* SDK_support.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D870D81968D00470E44 /* SDK_support.cpp */; }; ED60E7FF0DF54F870087381E /* sync_dbapiconnect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D7F0D81968D00470E44 /* sync_dbapiconnect.cpp */; }; ED60E8030DF54F870087381E /* dbapi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D7A0D81968D00470E44 /* dbapi.cpp */; }; ED60E8040DF54F870087381E /* pluginapiagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D760D81968D00470E44 /* pluginapiagent.cpp */; }; ED60E8050DF54F870087381E /* pluginapids.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D780D81968D00470E44 /* pluginapids.cpp */; }; ED60E8060DF54F870087381E /* DLL_interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D7D0D81968D00470E44 /* DLL_interface.cpp */; }; ED60E8070DF54F870087381E /* odbcapiagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D700D81968D00470E44 /* odbcapiagent.cpp */; }; ED60E8080DF54F870087381E /* odbcapids.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3D720D81968D00470E44 /* odbcapids.cpp */; }; ED60E8090DF54F870087381E /* clientengine_custom_Base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DBD0D81969F00470E44 /* clientengine_custom_Base.cpp */; }; ED60E80A0DF54F870087381E /* platform_pipe.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDC0D8196BB00470E44 /* platform_pipe.c */; }; ED60E80B0DF54F870087381E /* platform_thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDD0D8196BB00470E44 /* platform_thread.cpp */; }; ED60E80C0DF54F870087381E /* platform_mutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDE0D8196BB00470E44 /* platform_mutex.cpp */; }; ED60E80D0DF54F870087381E /* platform_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DDF0D8196BB00470E44 /* platform_file.cpp */; }; ED60E8100DF54F870087381E /* platform_exec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE40D8196BB00470E44 /* platform_exec.c */; }; ED60E8110DF54F870087381E /* platform_time.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE70D8196BB00470E44 /* platform_time.cpp */; }; ED60E8120DF54F870087381E /* profiling.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE80D8196BB00470E44 /* profiling.cpp */; }; ED60E8130DF54F870087381E /* binfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DE90D8196BB00470E44 /* binfile.cpp */; }; ED60E8140DF54F870087381E /* sysyncinit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3DF10D8196BB00470E44 /* sysyncinit.cpp */; }; ED60E8150DF54F870087381E /* engineclientbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E010D8196CA00470E44 /* engineclientbase.cpp */; }; ED60E8160DF54F870087381E /* liblock.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BB70D81A58800F9A79C /* liblock.c */; }; ED60E8170DF54F870087381E /* libmem.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BB80D81A58800F9A79C /* libmem.c */; }; ED60E8180DF54F870087381E /* libstr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BB90D81A58800F9A79C /* libstr.c */; }; ED60E8190DF54F870087381E /* libutil.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BBA0D81A58800F9A79C /* libutil.c */; }; ED60E81A0DF54F870087381E /* mgr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD10D81A5D500F9A79C /* mgr.c */; }; ED60E81B0DF54F870087381E /* mgrcmdbuilder.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD20D81A5D500F9A79C /* mgrcmdbuilder.c */; }; ED60E81C0DF54F870087381E /* mgrcmddispatcher.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD30D81A5D500F9A79C /* mgrcmddispatcher.c */; }; ED60E81D0DF54F870087381E /* mgrinstancelist.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD40D81A5D500F9A79C /* mgrinstancelist.c */; }; ED60E81E0DF54F870087381E /* mgrinstancemgr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD50D81A5D500F9A79C /* mgrinstancemgr.c */; }; ED60E81F0DF54F870087381E /* mgrutil.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BD60D81A5D500F9A79C /* mgrutil.c */; }; ED60E8200DF54F870087381E /* xltdec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BE50D81A5F400F9A79C /* xltdec.c */; }; ED60E8210DF54F870087381E /* xltdecwbxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BE70D81A5F400F9A79C /* xltdecwbxml.c */; }; ED60E8220DF54F870087381E /* xltdecxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BE90D81A5F400F9A79C /* xltdecxml.c */; }; ED60E8230DF54F870087381E /* xltdevinf.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BEA0D81A5F400F9A79C /* xltdevinf.c */; }; ED60E8240DF54F870087381E /* xltenc.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BEC0D81A5F400F9A79C /* xltenc.c */; }; ED60E8250DF54F870087381E /* xltenccom.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BED0D81A5F400F9A79C /* xltenccom.c */; }; ED60E8260DF54F870087381E /* xltencwbxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BEF0D81A5F400F9A79C /* xltencwbxml.c */; }; ED60E8270DF54F870087381E /* xltencxml.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF10D81A5F400F9A79C /* xltencxml.c */; }; ED60E8280DF54F870087381E /* xltmetinf.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF30D81A5F400F9A79C /* xltmetinf.c */; }; ED60E8290DF54F870087381E /* xlttags.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF50D81A5F400F9A79C /* xlttags.c */; }; ED60E82A0DF54F870087381E /* xltutilstack.c in Sources */ = {isa = PBXBuildFile; fileRef = ED806BF80D81A5F400F9A79C /* xltutilstack.c */; }; ED60E82B0DF54F870087381E /* binfilebase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E8F0D81970700470E44 /* binfilebase.cpp */; }; ED60E82C0DF54F870087381E /* binfileimplclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E910D81970700470E44 /* binfileimplclient.cpp */; }; ED60E82D0DF54F870087381E /* binfileimplds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E930D81970700470E44 /* binfileimplds.cpp */; }; ED60E82E0DF54F870087381E /* engineentry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E950D81970700470E44 /* engineentry.cpp */; }; ED60E82F0DF54F870087381E /* engineinterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E970D81970700470E44 /* engineinterface.cpp */; }; ED60E8300DF54F870087381E /* configelement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E9A0D81970700470E44 /* configelement.cpp */; }; ED60E8310DF54F870087381E /* customimplds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E9C0D81970700470E44 /* customimplds.cpp */; }; ED60E8320DF54F870087381E /* customimplagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3E9E0D81970700470E44 /* customimplagent.cpp */; }; ED60E8330DF54F870087381E /* dataobjtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA00D81970700470E44 /* dataobjtype.cpp */; }; ED60E8340DF54F870087381E /* debuglogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA20D81970700470E44 /* debuglogger.cpp */; }; ED60E8350DF54F870087381E /* iso8601.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA40D81970700470E44 /* iso8601.cpp */; }; ED60E8360DF54F870087381E /* itemfield.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EA60D81970700470E44 /* itemfield.cpp */; }; ED60E8380DF54F870087381E /* localengineds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EAA0D81970700470E44 /* localengineds.cpp */; }; ED60E8390DF54F870087381E /* mimediritemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EAC0D81970700470E44 /* mimediritemtype.cpp */; }; ED60E83A0DF54F870087381E /* multifielditem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EAE0D81970700470E44 /* multifielditem.cpp */; }; ED60E83B0DF54F870087381E /* multifielditemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB00D81970700470E44 /* multifielditemtype.cpp */; }; ED60E83C0DF54F870087381E /* remotedatastore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB20D81970700470E44 /* remotedatastore.cpp */; }; ED60E83D0DF54F870087381E /* rrules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB40D81970700470E44 /* rrules.cpp */; }; ED60E83F0DF54F870087381E /* scriptcontext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EB80D81970700470E44 /* scriptcontext.cpp */; }; ED60E8400DF54F870087381E /* simpleitem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EBA0D81970700470E44 /* simpleitem.cpp */; }; ED60E8410DF54F870087381E /* stringutils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EBE0D81970700470E44 /* stringutils.cpp */; }; ED60E8420DF54F870087381E /* superdatastore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC00D81970700470E44 /* superdatastore.cpp */; }; ED60E8430DF54F870087381E /* syncappbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC20D81970700470E44 /* syncappbase.cpp */; }; ED60E8450DF54F870087381E /* syncclientbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC60D81970700470E44 /* syncclientbase.cpp */; }; ED60E8460DF54F870087381E /* synccommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EC80D81970700470E44 /* synccommand.cpp */; }; ED60E8470DF54F870087381E /* syncdatastore.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ECA0D81970700470E44 /* syncdatastore.cpp */; }; ED60E8490DF54F870087381E /* syncitem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ECE0D81970700470E44 /* syncitem.cpp */; }; ED60E84A0DF54F870087381E /* syncitemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ED00D81970700470E44 /* syncitemtype.cpp */; }; ED60E84B0DF54F870087381E /* syncsession.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3ED40D81970700470E44 /* syncsession.cpp */; }; ED60E84E0DF54F870087381E /* sysync_crc16.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EDD0D81970700470E44 /* sysync_crc16.cpp */; }; ED60E8500DF54F870087381E /* stdlogicagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EE40D81970700470E44 /* stdlogicagent.cpp */; }; ED60E8510DF54F870087381E /* stdlogicds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EE60D81970700470E44 /* stdlogicds.cpp */; }; ED60E8530DF54F870087381E /* textitemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEA0D81970700470E44 /* textitemtype.cpp */; }; ED60E8540DF54F870087381E /* textprofile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEC0D81970700470E44 /* textprofile.cpp */; }; ED60E8550DF54F870087381E /* timezones.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEE0D81970700470E44 /* timezones.cpp */; }; ED60E8560DF54F870087381E /* uiapi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EEF0D81970700470E44 /* uiapi.cpp */; }; ED60E8570DF54F870087381E /* vcalendaritemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EF20D81970700470E44 /* vcalendaritemtype.cpp */; }; ED60E8580DF54F870087381E /* vcarditemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EF40D81970700470E44 /* vcarditemtype.cpp */; }; ED60E8590DF54F870087381E /* vtimezone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3EF60D81970700470E44 /* vtimezone.cpp */; }; ED60E85A0DF54F870087381E /* infback.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4C0D81971700470E44 /* infback.c */; }; ED60E85B0DF54F870087381E /* gzio.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4D0D81971700470E44 /* gzio.c */; }; ED60E85C0DF54F870087381E /* deflate.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4E0D81971700470E44 /* deflate.c */; }; ED60E85D0DF54F870087381E /* uncompr.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F4F0D81971700470E44 /* uncompr.c */; }; ED60E85E0DF54F870087381E /* trees.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F500D81971700470E44 /* trees.c */; }; ED60E85F0DF54F870087381E /* inftrees.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F510D81971700470E44 /* inftrees.c */; }; ED60E8600DF54F870087381E /* inflate.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F520D81971700470E44 /* inflate.c */; }; ED60E8610DF54F870087381E /* inffast.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F530D81971700470E44 /* inffast.c */; }; ED60E8620DF54F870087381E /* zutil.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F540D81971700470E44 /* zutil.c */; }; ED60E8630DF54F870087381E /* crc32.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F550D81971700470E44 /* crc32.c */; }; ED60E8640DF54F870087381E /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F560D81971700470E44 /* compress.c */; }; ED60E8650DF54F870087381E /* adler32.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F570D81971700470E44 /* adler32.c */; }; ED60E8660DF54F870087381E /* xmlparse.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F450D81971700470E44 /* xmlparse.c */; }; ED60E8670DF54F870087381E /* xmltok.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F470D81971700470E44 /* xmltok.c */; }; ED60E8680DF54F870087381E /* xmlrole.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F480D81971700470E44 /* xmlrole.c */; }; ED60E8690DF54F870087381E /* pcre_ord2utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F300D81971700470E44 /* pcre_ord2utf8.c */; }; ED60E86A0DF54F870087381E /* pcre_chartables.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F310D81971700470E44 /* pcre_chartables.c */; }; ED60E86B0DF54F870087381E /* pcre_compile.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F320D81971700470E44 /* pcre_compile.c */; }; ED60E86C0DF54F870087381E /* pcre_config.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F330D81971700470E44 /* pcre_config.c */; }; ED60E86D0DF54F870087381E /* pcre_dfa_exec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F340D81971700470E44 /* pcre_dfa_exec.c */; }; ED60E86E0DF54F870087381E /* pcre_exec.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F350D81971700470E44 /* pcre_exec.c */; }; ED60E86F0DF54F870087381E /* pcre_fullinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F360D81971700470E44 /* pcre_fullinfo.c */; }; ED60E8700DF54F870087381E /* pcre_get.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F370D81971700470E44 /* pcre_get.c */; }; ED60E8710DF54F870087381E /* pcre_globals.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F380D81971700470E44 /* pcre_globals.c */; }; ED60E8720DF54F870087381E /* pcre_info.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F390D81971700470E44 /* pcre_info.c */; }; ED60E8730DF54F870087381E /* pcre_newline.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3A0D81971700470E44 /* pcre_newline.c */; }; ED60E8740DF54F870087381E /* pcre_refcount.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3B0D81971700470E44 /* pcre_refcount.c */; }; ED60E8750DF54F870087381E /* pcre_study.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3C0D81971700470E44 /* pcre_study.c */; }; ED60E8760DF54F870087381E /* pcre_tables.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3D0D81971700470E44 /* pcre_tables.c */; }; ED60E8770DF54F870087381E /* pcre_try_flipped.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3E0D81971700470E44 /* pcre_try_flipped.c */; }; ED60E8780DF54F870087381E /* pcre_valid_utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F3F0D81971700470E44 /* pcre_valid_utf8.c */; }; ED60E8790DF54F870087381E /* pcre_version.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F400D81971700470E44 /* pcre_version.c */; }; ED60E87A0DF54F870087381E /* pcre_xclass.c in Sources */ = {isa = PBXBuildFile; fileRef = ED9D3F410D81971700470E44 /* pcre_xclass.c */; }; EDAC08250F179E78005E9AE2 /* mimedirprofile.h in Headers */ = {isa = PBXBuildFile; fileRef = EDAC08210F179E78005E9AE2 /* mimedirprofile.h */; }; EDAC08260F179E78005E9AE2 /* mimedirprofile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDAC08220F179E78005E9AE2 /* mimedirprofile.cpp */; }; EDDAFD0511A0989D003E33D5 /* rawdataitemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDAFD0111A0989D003E33D5 /* rawdataitemtype.h */; }; EDDAFD0611A0989D003E33D5 /* rawdataitemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDDAFD0211A0989D003E33D5 /* rawdataitemtype.cpp */; }; EDDAFD0911A0989D003E33D5 /* rawdataitemtype.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDAFD0111A0989D003E33D5 /* rawdataitemtype.h */; }; EDDAFD0A11A0989D003E33D5 /* rawdataitemtype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDDAFD0211A0989D003E33D5 /* rawdataitemtype.cpp */; }; EDDF0814107E435200A119FE /* product_options.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDF0813107E435200A119FE /* product_options.h */; }; EDDF0816107E435200A119FE /* product_options.h in Headers */ = {isa = PBXBuildFile; fileRef = EDDF0813107E435200A119FE /* product_options.h */; }; EDE194C81074A04F00439216 /* syncagent.h in Headers */ = {isa = PBXBuildFile; fileRef = EDE194C61074A04F00439216 /* syncagent.h */; }; EDE194C91074A04F00439216 /* syncagent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDE194C71074A04F00439216 /* syncagent.cpp */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ ED16A68D14B9B4E400F24032 /* platform_DLL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = platform_DLL.h; path = platform_adapters/platform_DLL.h; sourceTree = SOURCE_ROOT; }; ED1ECBC31383B0DB00B3DA02 /* libsysync_client_ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libsysync_client_ios.a; sourceTree = BUILT_PRODUCTS_DIR; }; ED1ECBC41383B0DB00B3DA02 /* libsysync_combi_ios.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libsysync_combi_ios.a; sourceTree = BUILT_PRODUCTS_DIR; }; ED43DAD60E014BC9000A1E5C /* configfiles.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = configfiles.mm; sourceTree = ""; }; ED4B5E9511523AAB00ECB4A5 /* sysync_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_utils.h; sourceTree = ""; }; ED4B5E9611523AAB00ECB4A5 /* sysync_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sysync_utils.cpp; sourceTree = ""; }; ED4B5E9711523AAB00ECB4A5 /* syncexception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncexception.cpp; sourceTree = ""; }; ED4B5E9A11523AAB00ECB4A5 /* lineartime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lineartime.cpp; sourceTree = ""; }; ED4B5E9B11523AAB00ECB4A5 /* san.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = san.cpp; sourceTree = ""; }; ED4B5E9C11523AAB00ECB4A5 /* san.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = san.h; sourceTree = ""; }; ED4B5E9D11523AAB00ECB4A5 /* sysync_md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_md5.h; sourceTree = ""; }; ED4B5E9E11523AAB00ECB4A5 /* sysync_md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sysync_md5.cpp; sourceTree = ""; }; ED4B5E9F11523AAB00ECB4A5 /* sysync_b64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_b64.h; sourceTree = ""; }; ED4B5EA011523AAB00ECB4A5 /* sysync_b64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sysync_b64.cpp; sourceTree = ""; }; ED4B5EA111523AAB00ECB4A5 /* syncexception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncexception.h; sourceTree = ""; }; ED4B5EA211523AAB00ECB4A5 /* lineartime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lineartime.h; sourceTree = ""; }; ED556A3E10768FD90008C22F /* combi_product_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = combi_product_options.h; sourceTree = ""; }; ED556A3F10768FD90008C22F /* serverengine_custom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serverengine_custom.h; sourceTree = ""; }; ED556A4010768FD90008C22F /* serverengine_custom_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serverengine_custom_precomp.h; sourceTree = ""; }; ED556A4110768FD90008C22F /* serverengine_custom_Base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serverengine_custom_Base.h; sourceTree = ""; }; ED556A4210768FD90008C22F /* serverengine_custom_Base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = serverengine_custom_Base.cpp; sourceTree = ""; }; ED556A4E107692F20008C22F /* enginesessiondispatch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enginesessiondispatch.cpp; sourceTree = ""; }; ED556A4F107692F20008C22F /* enginesessiondispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enginesessiondispatch.h; sourceTree = ""; }; ED55B6960DDDBC43001657F6 /* sysync_debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_debug.h; sourceTree = ""; }; ED55B6990DDDBCBC001657F6 /* sync_uiapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_uiapi.h; sourceTree = ""; }; ED55B69C0DDDBD0A001657F6 /* xmltok.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmltok.h; path = expat/xmltok/xmltok.h; sourceTree = ""; }; ED55B6A90DDDBD4E001657F6 /* xmldef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmldef.h; path = expat/xmltok/xmldef.h; sourceTree = ""; }; ED55B6AF0DDDBDD9001657F6 /* ascii.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ascii.h; path = expat/xmltok/ascii.h; sourceTree = ""; }; ED55B6B00DDDBDD9001657F6 /* asciitab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asciitab.h; path = expat/xmltok/asciitab.h; sourceTree = ""; }; ED55B6B10DDDBDD9001657F6 /* iasciitab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iasciitab.h; path = expat/xmltok/iasciitab.h; sourceTree = ""; }; ED55B6B20DDDBDD9001657F6 /* latin1tab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = latin1tab.h; path = expat/xmltok/latin1tab.h; sourceTree = ""; }; ED55B6B30DDDBDD9001657F6 /* nametab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = nametab.h; path = expat/xmltok/nametab.h; sourceTree = ""; }; ED55B6B40DDDBDD9001657F6 /* utf8tab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utf8tab.h; path = expat/xmltok/utf8tab.h; sourceTree = ""; }; ED55B6B50DDDBDD9001657F6 /* xmlrole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmlrole.h; path = expat/xmltok/xmlrole.h; sourceTree = ""; }; ED5B87FA0F8559C40042779A /* platform_timezones.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = platform_timezones.mm; sourceTree = ""; }; ED806BAB0D81A0FE00F9A79C /* plugindb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugindb.h; sourceTree = ""; }; ED806BAC0D81A0FE00F9A79C /* plugindb_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plugindb_precomp.h; sourceTree = ""; }; ED806BB70D81A58800F9A79C /* liblock.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = liblock.c; sourceTree = ""; }; ED806BB80D81A58800F9A79C /* libmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libmem.c; sourceTree = ""; }; ED806BB90D81A58800F9A79C /* libstr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libstr.c; sourceTree = ""; }; ED806BBA0D81A58800F9A79C /* libutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libutil.c; sourceTree = ""; }; ED806BBC0D81A58800F9A79C /* liblock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liblock.h; sourceTree = ""; }; ED806BBD0D81A58800F9A79C /* libmem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libmem.h; sourceTree = ""; }; ED806BBE0D81A58800F9A79C /* libstr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libstr.h; sourceTree = ""; }; ED806BBF0D81A58800F9A79C /* libutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libutil.h; sourceTree = ""; }; ED806BC70D81A5AD00F9A79C /* sml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sml.h; sourceTree = ""; }; ED806BC80D81A5AD00F9A79C /* smldef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smldef.h; sourceTree = ""; }; ED806BC90D81A5AD00F9A79C /* smldevinfdtd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smldevinfdtd.h; sourceTree = ""; }; ED806BCA0D81A5AD00F9A79C /* smldtd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smldtd.h; sourceTree = ""; }; ED806BCB0D81A5AD00F9A79C /* smlerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smlerr.h; sourceTree = ""; }; ED806BCC0D81A5AD00F9A79C /* smlmetinfdtd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smlmetinfdtd.h; sourceTree = ""; }; ED806BD10D81A5D500F9A79C /* mgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mgr.c; sourceTree = ""; }; ED806BD20D81A5D500F9A79C /* mgrcmdbuilder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mgrcmdbuilder.c; sourceTree = ""; }; ED806BD30D81A5D500F9A79C /* mgrcmddispatcher.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mgrcmddispatcher.c; sourceTree = ""; }; ED806BD40D81A5D500F9A79C /* mgrinstancelist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mgrinstancelist.c; sourceTree = ""; }; ED806BD50D81A5D500F9A79C /* mgrinstancemgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mgrinstancemgr.c; sourceTree = ""; }; ED806BD60D81A5D500F9A79C /* mgrutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mgrutil.c; sourceTree = ""; }; ED806BD80D81A5D500F9A79C /* mgr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mgr.h; sourceTree = ""; }; ED806BD90D81A5D500F9A79C /* mgrutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mgrutil.h; sourceTree = ""; }; ED806BE50D81A5F400F9A79C /* xltdec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltdec.c; sourceTree = ""; }; ED806BE60D81A5F400F9A79C /* xltdeccom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltdeccom.h; sourceTree = ""; }; ED806BE70D81A5F400F9A79C /* xltdecwbxml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltdecwbxml.c; sourceTree = ""; }; ED806BE80D81A5F400F9A79C /* xltdecwbxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltdecwbxml.h; sourceTree = ""; }; ED806BE90D81A5F400F9A79C /* xltdecxml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltdecxml.c; sourceTree = ""; }; ED806BEA0D81A5F400F9A79C /* xltdevinf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltdevinf.c; sourceTree = ""; }; ED806BEB0D81A5F400F9A79C /* xltdevinf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltdevinf.h; sourceTree = ""; }; ED806BEC0D81A5F400F9A79C /* xltenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltenc.c; sourceTree = ""; }; ED806BED0D81A5F400F9A79C /* xltenccom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltenccom.c; sourceTree = ""; }; ED806BEE0D81A5F400F9A79C /* xltenccom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltenccom.h; sourceTree = ""; }; ED806BEF0D81A5F400F9A79C /* xltencwbxml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltencwbxml.c; sourceTree = ""; }; ED806BF00D81A5F400F9A79C /* xltencwbxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltencwbxml.h; sourceTree = ""; }; ED806BF10D81A5F400F9A79C /* xltencxml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltencxml.c; sourceTree = ""; }; ED806BF20D81A5F400F9A79C /* xltencxml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltencxml.h; sourceTree = ""; }; ED806BF30D81A5F400F9A79C /* xltmetinf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltmetinf.c; sourceTree = ""; }; ED806BF40D81A5F400F9A79C /* xltmetinf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltmetinf.h; sourceTree = ""; }; ED806BF50D81A5F400F9A79C /* xlttags.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xlttags.c; sourceTree = ""; }; ED806BF60D81A5F400F9A79C /* xlttags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xlttags.h; sourceTree = ""; }; ED806BF70D81A5F400F9A79C /* xlttagtbl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xlttagtbl.h; sourceTree = ""; }; ED806BF80D81A5F400F9A79C /* xltutilstack.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xltutilstack.c; sourceTree = ""; }; ED806BF90D81A5F400F9A79C /* xltutilstack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltutilstack.h; sourceTree = ""; }; ED806BFB0D81A5F400F9A79C /* xltdec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltdec.h; sourceTree = ""; }; ED806BFC0D81A5F400F9A79C /* xltenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xltenc.h; sourceTree = ""; }; ED806C3B0D81A89E00F9A79C /* wsm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wsm.h; sourceTree = ""; }; ED9D3CEC0D81900B00470E44 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; ED9D3CF00D81902F00470E44 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; }; ED9D3D3A0D81959E00470E44 /* global_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = global_options.h; sourceTree = ""; }; ED9D3D3C0D8195A800470E44 /* enginemodulebase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enginemodulebase.cpp; sourceTree = ""; }; ED9D3D3D0D8195A800470E44 /* enginemodulebase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enginemodulebase.h; sourceTree = ""; }; ED9D3D3E0D8195A800470E44 /* engine_defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine_defs.h; sourceTree = ""; }; ED9D3D3F0D8195A800470E44 /* generic_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generic_types.h; sourceTree = ""; }; ED9D3D400D8195A800470E44 /* syerror.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syerror.h; sourceTree = ""; }; ED9D3D6D0D81968D00470E44 /* odbcdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = odbcdb.h; sourceTree = ""; }; ED9D3D6E0D81968D00470E44 /* odbcdb_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = odbcdb_precomp.h; sourceTree = ""; }; ED9D3D6F0D81968D00470E44 /* odbcapiagent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = odbcapiagent.h; sourceTree = ""; }; ED9D3D700D81968D00470E44 /* odbcapiagent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = odbcapiagent.cpp; sourceTree = ""; }; ED9D3D710D81968D00470E44 /* odbcapids.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = odbcapids.h; sourceTree = ""; }; ED9D3D720D81968D00470E44 /* odbcapids.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = odbcapids.cpp; sourceTree = ""; }; ED9D3D750D81968D00470E44 /* pluginapiagent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pluginapiagent.h; sourceTree = ""; }; ED9D3D760D81968D00470E44 /* pluginapiagent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pluginapiagent.cpp; sourceTree = ""; }; ED9D3D770D81968D00470E44 /* pluginapids.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pluginapids.h; sourceTree = ""; }; ED9D3D780D81968D00470E44 /* pluginapids.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pluginapids.cpp; sourceTree = ""; }; ED9D3D790D81968D00470E44 /* dbapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbapi.h; sourceTree = ""; }; ED9D3D7A0D81968D00470E44 /* dbapi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dbapi.cpp; sourceTree = ""; }; ED9D3D7B0D81968D00470E44 /* dbapi_include.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbapi_include.h; sourceTree = ""; }; ED9D3D7C0D81968D00470E44 /* DLL_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DLL_interface.h; sourceTree = ""; }; ED9D3D7D0D81968D00470E44 /* DLL_interface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DLL_interface.cpp; sourceTree = ""; }; ED9D3D7E0D81968D00470E44 /* sync_dbapiconnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_dbapiconnect.h; sourceTree = ""; }; ED9D3D7F0D81968D00470E44 /* sync_dbapiconnect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sync_dbapiconnect.cpp; sourceTree = ""; }; ED9D3D810D81968D00470E44 /* sync_include.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_include.h; sourceTree = ""; }; ED9D3D820D81968D00470E44 /* sync_dbapidef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_dbapidef.h; sourceTree = ""; }; ED9D3D830D81968D00470E44 /* sync_dbapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sync_dbapi.h; sourceTree = ""; }; ED9D3D840D81968D00470E44 /* SDK_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDK_util.h; sourceTree = ""; }; ED9D3D850D81968D00470E44 /* SDK_util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = SDK_util.c; sourceTree = ""; }; ED9D3D860D81968D00470E44 /* SDK_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDK_support.h; sourceTree = ""; }; ED9D3D870D81968D00470E44 /* SDK_support.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SDK_support.cpp; sourceTree = ""; }; ED9D3D940D81968D00470E44 /* sync_dbapi_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sync_dbapi_text.cpp; sourceTree = ""; }; ED9D3D960D81968D00470E44 /* admindata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = admindata.h; sourceTree = ""; }; ED9D3D970D81968D00470E44 /* admindata.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = admindata.cpp; sourceTree = ""; }; ED9D3D980D81968D00470E44 /* blobs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blobs.h; sourceTree = ""; }; ED9D3D990D81968D00470E44 /* blobs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = blobs.cpp; sourceTree = ""; }; ED9D3D9A0D81968D00470E44 /* dbitem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dbitem.h; sourceTree = ""; }; ED9D3D9B0D81968D00470E44 /* dbitem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dbitem.cpp; sourceTree = ""; }; ED9D3DBA0D81969F00470E44 /* clientengine_custom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clientengine_custom.h; sourceTree = ""; }; ED9D3DBB0D81969F00470E44 /* clientengine_custom_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clientengine_custom_precomp.h; sourceTree = ""; }; ED9D3DBC0D81969F00470E44 /* clientengine_custom_Base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clientengine_custom_Base.h; sourceTree = ""; }; ED9D3DBD0D81969F00470E44 /* clientengine_custom_Base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = clientengine_custom_Base.cpp; sourceTree = ""; }; ED9D3DDB0D8196BB00470E44 /* platform_pipe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_pipe.h; sourceTree = ""; }; ED9D3DDC0D8196BB00470E44 /* platform_pipe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = platform_pipe.c; sourceTree = ""; }; ED9D3DDD0D8196BB00470E44 /* platform_thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_thread.cpp; sourceTree = ""; }; ED9D3DDE0D8196BB00470E44 /* platform_mutex.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_mutex.cpp; sourceTree = ""; }; ED9D3DDF0D8196BB00470E44 /* platform_file.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_file.cpp; sourceTree = ""; }; ED9D3DE30D8196BB00470E44 /* platform_exec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_exec.h; sourceTree = ""; }; ED9D3DE40D8196BB00470E44 /* platform_exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = platform_exec.c; sourceTree = ""; }; ED9D3DE50D8196BB00470E44 /* platform_headers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_headers.h; sourceTree = ""; }; ED9D3DE60D8196BB00470E44 /* platform_time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_time.h; sourceTree = ""; }; ED9D3DE70D8196BB00470E44 /* platform_time.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = platform_time.cpp; sourceTree = ""; }; ED9D3DE80D8196BB00470E44 /* profiling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = profiling.cpp; sourceTree = ""; }; ED9D3DE90D8196BB00470E44 /* binfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binfile.cpp; sourceTree = ""; }; ED9D3DEA0D8196BB00470E44 /* binfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binfile.h; sourceTree = ""; }; ED9D3DEB0D8196BB00470E44 /* configfiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = configfiles.h; sourceTree = ""; }; ED9D3DED0D8196BB00470E44 /* platform_thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_thread.h; sourceTree = ""; }; ED9D3DEE0D8196BB00470E44 /* platform_mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_mutex.h; sourceTree = ""; }; ED9D3DEF0D8196BB00470E44 /* platform_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_file.h; sourceTree = ""; }; ED9D3DF00D8196BB00470E44 /* profiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiling.h; sourceTree = ""; }; ED9D3DF10D8196BB00470E44 /* sysyncinit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sysyncinit.cpp; sourceTree = ""; }; ED9D3DFF0D8196CA00470E44 /* engine_client_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine_client_precomp.h; sourceTree = ""; }; ED9D3E000D8196CA00470E44 /* engine_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine_client.h; sourceTree = ""; }; ED9D3E010D8196CA00470E44 /* engineclientbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = engineclientbase.cpp; sourceTree = ""; }; ED9D3E020D8196CA00470E44 /* engineclientbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engineclientbase.h; sourceTree = ""; }; ED9D3E8F0D81970700470E44 /* binfilebase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binfilebase.cpp; sourceTree = ""; }; ED9D3E900D81970700470E44 /* binfilebase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binfilebase.h; sourceTree = ""; }; ED9D3E910D81970700470E44 /* binfileimplclient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binfileimplclient.cpp; sourceTree = ""; }; ED9D3E920D81970700470E44 /* binfileimplclient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binfileimplclient.h; sourceTree = ""; }; ED9D3E930D81970700470E44 /* binfileimplds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binfileimplds.cpp; sourceTree = ""; }; ED9D3E940D81970700470E44 /* binfileimplds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binfileimplds.h; sourceTree = ""; }; ED9D3E950D81970700470E44 /* engineentry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = engineentry.cpp; sourceTree = ""; }; ED9D3E960D81970700470E44 /* engineentry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engineentry.h; sourceTree = ""; }; ED9D3E970D81970700470E44 /* engineinterface.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = engineinterface.cpp; sourceTree = ""; }; ED9D3E980D81970700470E44 /* engineinterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engineinterface.h; sourceTree = ""; }; ED9D3E990D81970700470E44 /* configelement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = configelement.h; sourceTree = ""; }; ED9D3E9A0D81970700470E44 /* configelement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = configelement.cpp; sourceTree = ""; }; ED9D3E9B0D81970700470E44 /* customimplds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = customimplds.h; sourceTree = ""; }; ED9D3E9C0D81970700470E44 /* customimplds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = customimplds.cpp; sourceTree = ""; }; ED9D3E9D0D81970700470E44 /* customimplagent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = customimplagent.h; sourceTree = ""; }; ED9D3E9E0D81970700470E44 /* customimplagent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = customimplagent.cpp; sourceTree = ""; }; ED9D3E9F0D81970700470E44 /* dataobjtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dataobjtype.h; sourceTree = ""; }; ED9D3EA00D81970700470E44 /* dataobjtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dataobjtype.cpp; sourceTree = ""; }; ED9D3EA10D81970700470E44 /* debuglogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = debuglogger.h; sourceTree = ""; }; ED9D3EA20D81970700470E44 /* debuglogger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = debuglogger.cpp; sourceTree = ""; }; ED9D3EA30D81970700470E44 /* iso8601.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iso8601.h; sourceTree = ""; }; ED9D3EA40D81970700470E44 /* iso8601.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iso8601.cpp; sourceTree = ""; }; ED9D3EA50D81970700470E44 /* itemfield.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = itemfield.h; sourceTree = ""; }; ED9D3EA60D81970700470E44 /* itemfield.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = itemfield.cpp; sourceTree = ""; }; ED9D3EA90D81970700470E44 /* localengineds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = localengineds.h; sourceTree = ""; }; ED9D3EAA0D81970700470E44 /* localengineds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = localengineds.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; ED9D3EAB0D81970700470E44 /* mimediritemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mimediritemtype.h; sourceTree = ""; }; ED9D3EAC0D81970700470E44 /* mimediritemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mimediritemtype.cpp; sourceTree = ""; }; ED9D3EAD0D81970700470E44 /* multifielditem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = multifielditem.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; ED9D3EAE0D81970700470E44 /* multifielditem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = multifielditem.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; ED9D3EAF0D81970700470E44 /* multifielditemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = multifielditemtype.h; sourceTree = ""; }; ED9D3EB00D81970700470E44 /* multifielditemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = multifielditemtype.cpp; sourceTree = ""; }; ED9D3EB10D81970700470E44 /* remotedatastore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remotedatastore.h; sourceTree = ""; }; ED9D3EB20D81970700470E44 /* remotedatastore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = remotedatastore.cpp; sourceTree = ""; }; ED9D3EB30D81970700470E44 /* rrules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rrules.h; sourceTree = ""; }; ED9D3EB40D81970700470E44 /* rrules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rrules.cpp; sourceTree = ""; }; ED9D3EB70D81970700470E44 /* scriptcontext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scriptcontext.h; sourceTree = ""; }; ED9D3EB80D81970700470E44 /* scriptcontext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scriptcontext.cpp; sourceTree = ""; }; ED9D3EB90D81970700470E44 /* simpleitem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simpleitem.h; sourceTree = ""; }; ED9D3EBA0D81970700470E44 /* simpleitem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simpleitem.cpp; sourceTree = ""; }; ED9D3EBB0D81970700470E44 /* smltk_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smltk_precomp.h; sourceTree = ""; }; ED9D3EBC0D81970700470E44 /* smltk_precomp_xpt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smltk_precomp_xpt.h; sourceTree = ""; }; ED9D3EBD0D81970700470E44 /* stringutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringutils.h; sourceTree = ""; }; ED9D3EBE0D81970700470E44 /* stringutils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stringutils.cpp; sourceTree = ""; }; ED9D3EBF0D81970700470E44 /* superdatastore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = superdatastore.h; sourceTree = ""; }; ED9D3EC00D81970700470E44 /* superdatastore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = superdatastore.cpp; sourceTree = ""; }; ED9D3EC10D81970700470E44 /* syncappbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncappbase.h; sourceTree = ""; }; ED9D3EC20D81970700470E44 /* syncappbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncappbase.cpp; sourceTree = ""; }; ED9D3EC50D81970700470E44 /* syncclientbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncclientbase.h; sourceTree = ""; }; ED9D3EC60D81970700470E44 /* syncclientbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncclientbase.cpp; sourceTree = ""; }; ED9D3EC70D81970700470E44 /* synccommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = synccommand.h; sourceTree = ""; }; ED9D3EC80D81970700470E44 /* synccommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = synccommand.cpp; sourceTree = ""; }; ED9D3EC90D81970700470E44 /* syncdatastore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncdatastore.h; sourceTree = ""; }; ED9D3ECA0D81970700470E44 /* syncdatastore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncdatastore.cpp; sourceTree = ""; }; ED9D3ECD0D81970700470E44 /* syncitem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = syncitem.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; ED9D3ECE0D81970700470E44 /* syncitem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncitem.cpp; sourceTree = ""; }; ED9D3ECF0D81970700470E44 /* syncitemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncitemtype.h; sourceTree = ""; }; ED9D3ED00D81970700470E44 /* syncitemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncitemtype.cpp; sourceTree = ""; }; ED9D3ED30D81970700470E44 /* syncsession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncsession.h; sourceTree = ""; }; ED9D3ED40D81970700470E44 /* syncsession.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncsession.cpp; sourceTree = ""; }; ED9D3ED70D81970700470E44 /* syserial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syserial.h; sourceTree = ""; }; ED9D3ED90D81970700470E44 /* sysync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync.h; sourceTree = ""; }; ED9D3EDC0D81970700470E44 /* sysync_crc16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_crc16.h; sourceTree = ""; }; ED9D3EDD0D81970700470E44 /* sysync_crc16.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sysync_crc16.cpp; sourceTree = ""; }; ED9D3EDE0D81970700470E44 /* sysync_globs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_globs.h; sourceTree = ""; }; ED9D3EE10D81970700470E44 /* sysync_precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_precomp.h; sourceTree = ""; }; ED9D3EE20D81970700470E44 /* sysync_precomp_xpt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysync_precomp_xpt.h; sourceTree = ""; }; ED9D3EE30D81970700470E44 /* stdlogicagent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdlogicagent.h; sourceTree = ""; }; ED9D3EE40D81970700470E44 /* stdlogicagent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stdlogicagent.cpp; sourceTree = ""; }; ED9D3EE50D81970700470E44 /* stdlogicds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdlogicds.h; sourceTree = ""; }; ED9D3EE60D81970700470E44 /* stdlogicds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stdlogicds.cpp; sourceTree = ""; }; ED9D3EE90D81970700470E44 /* textitemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = textitemtype.h; sourceTree = ""; }; ED9D3EEA0D81970700470E44 /* textitemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = textitemtype.cpp; sourceTree = ""; }; ED9D3EEB0D81970700470E44 /* textprofile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = textprofile.h; sourceTree = ""; }; ED9D3EEC0D81970700470E44 /* textprofile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = textprofile.cpp; sourceTree = ""; }; ED9D3EED0D81970700470E44 /* timezones.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timezones.h; sourceTree = ""; }; ED9D3EEE0D81970700470E44 /* timezones.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = timezones.cpp; sourceTree = ""; }; ED9D3EEF0D81970700470E44 /* uiapi.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = uiapi.cpp; sourceTree = ""; }; ED9D3EF00D81970700470E44 /* uiapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uiapi.h; sourceTree = ""; }; ED9D3EF10D81970700470E44 /* vcalendaritemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vcalendaritemtype.h; sourceTree = ""; }; ED9D3EF20D81970700470E44 /* vcalendaritemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vcalendaritemtype.cpp; sourceTree = ""; }; ED9D3EF30D81970700470E44 /* vcarditemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vcarditemtype.h; sourceTree = ""; }; ED9D3EF40D81970700470E44 /* vcarditemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vcarditemtype.cpp; sourceTree = ""; }; ED9D3EF50D81970700470E44 /* vtimezone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vtimezone.h; sourceTree = ""; }; ED9D3EF60D81970700470E44 /* vtimezone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vtimezone.cpp; sourceTree = ""; }; ED9D3EF70D81970700470E44 /* tz_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tz_table.h; sourceTree = ""; }; ED9D3F300D81971700470E44 /* pcre_ord2utf8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_ord2utf8.c; path = pcre/pcre_ord2utf8.c; sourceTree = ""; }; ED9D3F310D81971700470E44 /* pcre_chartables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_chartables.c; path = pcre/pcre_chartables.c; sourceTree = ""; }; ED9D3F320D81971700470E44 /* pcre_compile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_compile.c; path = pcre/pcre_compile.c; sourceTree = ""; }; ED9D3F330D81971700470E44 /* pcre_config.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_config.c; path = pcre/pcre_config.c; sourceTree = ""; }; ED9D3F340D81971700470E44 /* pcre_dfa_exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_dfa_exec.c; path = pcre/pcre_dfa_exec.c; sourceTree = ""; }; ED9D3F350D81971700470E44 /* pcre_exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_exec.c; path = pcre/pcre_exec.c; sourceTree = ""; }; ED9D3F360D81971700470E44 /* pcre_fullinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_fullinfo.c; path = pcre/pcre_fullinfo.c; sourceTree = ""; }; ED9D3F370D81971700470E44 /* pcre_get.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_get.c; path = pcre/pcre_get.c; sourceTree = ""; }; ED9D3F380D81971700470E44 /* pcre_globals.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_globals.c; path = pcre/pcre_globals.c; sourceTree = ""; }; ED9D3F390D81971700470E44 /* pcre_info.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_info.c; path = pcre/pcre_info.c; sourceTree = ""; }; ED9D3F3A0D81971700470E44 /* pcre_newline.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_newline.c; path = pcre/pcre_newline.c; sourceTree = ""; }; ED9D3F3B0D81971700470E44 /* pcre_refcount.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_refcount.c; path = pcre/pcre_refcount.c; sourceTree = ""; }; ED9D3F3C0D81971700470E44 /* pcre_study.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_study.c; path = pcre/pcre_study.c; sourceTree = ""; }; ED9D3F3D0D81971700470E44 /* pcre_tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_tables.c; path = pcre/pcre_tables.c; sourceTree = ""; }; ED9D3F3E0D81971700470E44 /* pcre_try_flipped.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_try_flipped.c; path = pcre/pcre_try_flipped.c; sourceTree = ""; }; ED9D3F3F0D81971700470E44 /* pcre_valid_utf8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_valid_utf8.c; path = pcre/pcre_valid_utf8.c; sourceTree = ""; }; ED9D3F400D81971700470E44 /* pcre_version.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_version.c; path = pcre/pcre_version.c; sourceTree = ""; }; ED9D3F410D81971700470E44 /* pcre_xclass.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pcre_xclass.c; path = pcre/pcre_xclass.c; sourceTree = ""; }; ED9D3F420D81971700470E44 /* pcre_config_macosx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pcre_config_macosx.h; path = pcre/pcre_config_macosx.h; sourceTree = ""; }; ED9D3F430D81971700470E44 /* pcre.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pcre.h; path = pcre/pcre.h; sourceTree = ""; }; ED9D3F450D81971700470E44 /* xmlparse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xmlparse.c; path = expat/xmlparse/xmlparse.c; sourceTree = ""; }; ED9D3F460D81971700470E44 /* xmlparse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmlparse.h; path = expat/xmlparse/xmlparse.h; sourceTree = ""; }; ED9D3F470D81971700470E44 /* xmltok.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xmltok.c; path = expat/xmltok/xmltok.c; sourceTree = ""; }; ED9D3F480D81971700470E44 /* xmlrole.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xmlrole.c; path = expat/xmltok/xmlrole.c; sourceTree = ""; }; ED9D3F4A0D81971700470E44 /* zlib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zlib.h; path = zlib/zlib.h; sourceTree = ""; }; ED9D3F4B0D81971700470E44 /* zutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zutil.h; path = zlib/zutil.h; sourceTree = ""; }; ED9D3F4C0D81971700470E44 /* infback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = infback.c; path = zlib/infback.c; sourceTree = ""; }; ED9D3F4D0D81971700470E44 /* gzio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gzio.c; path = zlib/gzio.c; sourceTree = ""; }; ED9D3F4E0D81971700470E44 /* deflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = deflate.c; path = zlib/deflate.c; sourceTree = ""; }; ED9D3F4F0D81971700470E44 /* uncompr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = uncompr.c; path = zlib/uncompr.c; sourceTree = ""; }; ED9D3F500D81971700470E44 /* trees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = trees.c; path = zlib/trees.c; sourceTree = ""; }; ED9D3F510D81971700470E44 /* inftrees.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inftrees.c; path = zlib/inftrees.c; sourceTree = ""; }; ED9D3F520D81971700470E44 /* inflate.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inflate.c; path = zlib/inflate.c; sourceTree = ""; }; ED9D3F530D81971700470E44 /* inffast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = inffast.c; path = zlib/inffast.c; sourceTree = ""; }; ED9D3F540D81971700470E44 /* zutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zutil.c; path = zlib/zutil.c; sourceTree = ""; }; ED9D3F550D81971700470E44 /* crc32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = crc32.c; path = zlib/crc32.c; sourceTree = ""; }; ED9D3F560D81971700470E44 /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = compress.c; path = zlib/compress.c; sourceTree = ""; }; ED9D3F570D81971700470E44 /* adler32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adler32.c; path = zlib/adler32.c; sourceTree = ""; }; EDAC08210F179E78005E9AE2 /* mimedirprofile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mimedirprofile.h; sourceTree = ""; }; EDAC08220F179E78005E9AE2 /* mimedirprofile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mimedirprofile.cpp; sourceTree = ""; }; EDDAFD0111A0989D003E33D5 /* rawdataitemtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rawdataitemtype.h; sourceTree = ""; }; EDDAFD0211A0989D003E33D5 /* rawdataitemtype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rawdataitemtype.cpp; sourceTree = ""; }; EDDF0813107E435200A119FE /* product_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = product_options.h; sourceTree = ""; }; EDE194C61074A04F00439216 /* syncagent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = syncagent.h; sourceTree = ""; }; EDE194C71074A04F00439216 /* syncagent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = syncagent.cpp; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ ED556A3710768FAA0008C22F /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; ED60E87B0DF54F870087381E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { isa = PBXGroup; children = ( ED9D3D3A0D81959E00470E44 /* global_options.h */, ED9D3D3B0D8195A800470E44 /* sysync_SDK */, ED9D3D6B0D81968D00470E44 /* DB_interfaces */, ED9D3DB70D81969F00470E44 /* syncapps */, ED9D3DD90D8196BB00470E44 /* platform_adapters */, ED9D3DFD0D8196CA00470E44 /* Transport_interfaces */, ED9D3E200D8196F400470E44 /* syncml_tk */, ED9D3E8E0D81970700470E44 /* sysync */, ED9D3F290D81971700470E44 /* External Code */, 29B97323FDCFA39411CA2CEA /* Frameworks */, ED51F986130AE2DA005A04F2 /* Products */, ); name = CustomTemplate; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( ED9D3CF00D81902F00470E44 /* IOKit.framework */, ED9D3CEC0D81900B00470E44 /* CoreFoundation.framework */, ); name = Frameworks; sourceTree = ""; }; ED51F986130AE2DA005A04F2 /* Products */ = { isa = PBXGroup; children = ( ED1ECBC31383B0DB00B3DA02 /* libsysync_client_ios.a */, ED1ECBC41383B0DB00B3DA02 /* libsysync_combi_ios.a */, ); name = Products; path = ../..; sourceTree = BUILT_PRODUCTS_DIR; }; ED556A3C10768FD90008C22F /* serverEngine_custom */ = { isa = PBXGroup; children = ( ED556A3E10768FD90008C22F /* combi_product_options.h */, ED556A3F10768FD90008C22F /* serverengine_custom.h */, ED556A4010768FD90008C22F /* serverengine_custom_precomp.h */, ED556A4110768FD90008C22F /* serverengine_custom_Base.h */, ED556A4210768FD90008C22F /* serverengine_custom_Base.cpp */, ); path = serverEngine_custom; sourceTree = ""; }; ED806BA80D81A04000F9A79C /* api_db */ = { isa = PBXGroup; children = ( ED9D3D7F0D81968D00470E44 /* sync_dbapiconnect.cpp */, ED9D3D7E0D81968D00470E44 /* sync_dbapiconnect.h */, ED806BAB0D81A0FE00F9A79C /* plugindb.h */, ED806BAC0D81A0FE00F9A79C /* plugindb_precomp.h */, ED9D3D7A0D81968D00470E44 /* dbapi.cpp */, ED9D3D790D81968D00470E44 /* dbapi.h */, ED9D3D7B0D81968D00470E44 /* dbapi_include.h */, ED9D3D760D81968D00470E44 /* pluginapiagent.cpp */, ED9D3D750D81968D00470E44 /* pluginapiagent.h */, ED9D3D780D81968D00470E44 /* pluginapids.cpp */, ED9D3D770D81968D00470E44 /* pluginapids.h */, ED9D3D7D0D81968D00470E44 /* DLL_interface.cpp */, ED9D3D7C0D81968D00470E44 /* DLL_interface.h */, ); path = api_db; sourceTree = ""; }; ED806BB50D81A58800F9A79C /* lib */ = { isa = PBXGroup; children = ( ED806BB60D81A58800F9A79C /* all */, ED806BBB0D81A58800F9A79C /* inc */, ); path = lib; sourceTree = ""; }; ED806BB60D81A58800F9A79C /* all */ = { isa = PBXGroup; children = ( ED806BB70D81A58800F9A79C /* liblock.c */, ED806BB80D81A58800F9A79C /* libmem.c */, ED806BB90D81A58800F9A79C /* libstr.c */, ED806BBA0D81A58800F9A79C /* libutil.c */, ); path = all; sourceTree = ""; }; ED806BBB0D81A58800F9A79C /* inc */ = { isa = PBXGroup; children = ( ED806BBC0D81A58800F9A79C /* liblock.h */, ED806BBD0D81A58800F9A79C /* libmem.h */, ED806BBE0D81A58800F9A79C /* libstr.h */, ED806BBF0D81A58800F9A79C /* libutil.h */, ); path = inc; sourceTree = ""; }; ED806BC40D81A5AD00F9A79C /* inc */ = { isa = PBXGroup; children = ( ED806BC70D81A5AD00F9A79C /* sml.h */, ED806BC80D81A5AD00F9A79C /* smldef.h */, ED806BC90D81A5AD00F9A79C /* smldevinfdtd.h */, ED806BCA0D81A5AD00F9A79C /* smldtd.h */, ED806BCB0D81A5AD00F9A79C /* smlerr.h */, ED806BCC0D81A5AD00F9A79C /* smlmetinfdtd.h */, ); path = inc; sourceTree = ""; }; ED806BCF0D81A5D500F9A79C /* mgr */ = { isa = PBXGroup; children = ( ED806BD00D81A5D500F9A79C /* all */, ED806BD70D81A5D500F9A79C /* inc */, ); path = mgr; sourceTree = ""; }; ED806BD00D81A5D500F9A79C /* all */ = { isa = PBXGroup; children = ( ED806BD10D81A5D500F9A79C /* mgr.c */, ED806BD20D81A5D500F9A79C /* mgrcmdbuilder.c */, ED806BD30D81A5D500F9A79C /* mgrcmddispatcher.c */, ED806BD40D81A5D500F9A79C /* mgrinstancelist.c */, ED806BD50D81A5D500F9A79C /* mgrinstancemgr.c */, ED806BD60D81A5D500F9A79C /* mgrutil.c */, ); path = all; sourceTree = ""; }; ED806BD70D81A5D500F9A79C /* inc */ = { isa = PBXGroup; children = ( ED806BD80D81A5D500F9A79C /* mgr.h */, ED806BD90D81A5D500F9A79C /* mgrutil.h */, ); path = inc; sourceTree = ""; }; ED806BE30D81A5F400F9A79C /* xlt */ = { isa = PBXGroup; children = ( ED806BE40D81A5F400F9A79C /* all */, ED806BFA0D81A5F400F9A79C /* inc */, ); path = xlt; sourceTree = ""; }; ED806BE40D81A5F400F9A79C /* all */ = { isa = PBXGroup; children = ( ED806BE50D81A5F400F9A79C /* xltdec.c */, ED806BE60D81A5F400F9A79C /* xltdeccom.h */, ED806BE70D81A5F400F9A79C /* xltdecwbxml.c */, ED806BE80D81A5F400F9A79C /* xltdecwbxml.h */, ED806BE90D81A5F400F9A79C /* xltdecxml.c */, ED806BEA0D81A5F400F9A79C /* xltdevinf.c */, ED806BEB0D81A5F400F9A79C /* xltdevinf.h */, ED806BEC0D81A5F400F9A79C /* xltenc.c */, ED806BED0D81A5F400F9A79C /* xltenccom.c */, ED806BEE0D81A5F400F9A79C /* xltenccom.h */, ED806BEF0D81A5F400F9A79C /* xltencwbxml.c */, ED806BF00D81A5F400F9A79C /* xltencwbxml.h */, ED806BF10D81A5F400F9A79C /* xltencxml.c */, ED806BF20D81A5F400F9A79C /* xltencxml.h */, ED806BF30D81A5F400F9A79C /* xltmetinf.c */, ED806BF40D81A5F400F9A79C /* xltmetinf.h */, ED806BF50D81A5F400F9A79C /* xlttags.c */, ED806BF60D81A5F400F9A79C /* xlttags.h */, ED806BF70D81A5F400F9A79C /* xlttagtbl.h */, ED806BF80D81A5F400F9A79C /* xltutilstack.c */, ED806BF90D81A5F400F9A79C /* xltutilstack.h */, ); path = all; sourceTree = ""; }; ED806BFA0D81A5F400F9A79C /* inc */ = { isa = PBXGroup; children = ( ED806BFB0D81A5F400F9A79C /* xltdec.h */, ED806BFC0D81A5F400F9A79C /* xltenc.h */, ); path = inc; sourceTree = ""; }; ED806C370D81A89E00F9A79C /* wsm */ = { isa = PBXGroup; children = ( ED806C3A0D81A89E00F9A79C /* inc */, ); name = wsm; path = src/sml/wsm; sourceTree = ""; }; ED806C3A0D81A89E00F9A79C /* inc */ = { isa = PBXGroup; children = ( ED806C3B0D81A89E00F9A79C /* wsm.h */, ); path = inc; sourceTree = ""; }; ED9D3D3B0D8195A800470E44 /* sysync_SDK */ = { isa = PBXGroup; children = ( ED4B5E9511523AAB00ECB4A5 /* sysync_utils.h */, ED4B5E9611523AAB00ECB4A5 /* sysync_utils.cpp */, ED4B5E9711523AAB00ECB4A5 /* syncexception.cpp */, ED4B5E9A11523AAB00ECB4A5 /* lineartime.cpp */, ED4B5E9B11523AAB00ECB4A5 /* san.cpp */, ED4B5E9C11523AAB00ECB4A5 /* san.h */, ED4B5E9D11523AAB00ECB4A5 /* sysync_md5.h */, ED4B5E9E11523AAB00ECB4A5 /* sysync_md5.cpp */, ED4B5E9F11523AAB00ECB4A5 /* sysync_b64.h */, ED4B5EA011523AAB00ECB4A5 /* sysync_b64.cpp */, ED4B5EA111523AAB00ECB4A5 /* syncexception.h */, ED4B5EA211523AAB00ECB4A5 /* lineartime.h */, ED9D3D880D81968D00470E44 /* DB_Interfaces */, ED9D3D3C0D8195A800470E44 /* enginemodulebase.cpp */, ED9D3D3D0D8195A800470E44 /* enginemodulebase.h */, ED9D3D3E0D8195A800470E44 /* engine_defs.h */, ED9D3D3F0D8195A800470E44 /* generic_types.h */, ED9D3D400D8195A800470E44 /* syerror.h */, ED9D3D970D81968D00470E44 /* admindata.cpp */, ED9D3D960D81968D00470E44 /* admindata.h */, ED9D3D990D81968D00470E44 /* blobs.cpp */, ED9D3D980D81968D00470E44 /* blobs.h */, ED9D3D9B0D81968D00470E44 /* dbitem.cpp */, ED9D3D9A0D81968D00470E44 /* dbitem.h */, ED9D3D810D81968D00470E44 /* sync_include.h */, ED9D3D820D81968D00470E44 /* sync_dbapidef.h */, ED9D3D830D81968D00470E44 /* sync_dbapi.h */, ED55B6990DDDBCBC001657F6 /* sync_uiapi.h */, ED9D3D840D81968D00470E44 /* SDK_util.h */, ED9D3D850D81968D00470E44 /* SDK_util.c */, ED9D3D870D81968D00470E44 /* SDK_support.cpp */, ED9D3D860D81968D00470E44 /* SDK_support.h */, ); name = sysync_SDK; path = sysync_SDK/Sources; sourceTree = ""; }; ED9D3D6B0D81968D00470E44 /* DB_interfaces */ = { isa = PBXGroup; children = ( ED806BA80D81A04000F9A79C /* api_db */, ED9D3D6C0D81968D00470E44 /* odbc_db */, ); path = DB_interfaces; sourceTree = ""; }; ED9D3D6C0D81968D00470E44 /* odbc_db */ = { isa = PBXGroup; children = ( ED9D3D6D0D81968D00470E44 /* odbcdb.h */, ED9D3D6E0D81968D00470E44 /* odbcdb_precomp.h */, ED9D3D6F0D81968D00470E44 /* odbcapiagent.h */, ED9D3D700D81968D00470E44 /* odbcapiagent.cpp */, ED9D3D710D81968D00470E44 /* odbcapids.h */, ED9D3D720D81968D00470E44 /* odbcapids.cpp */, ); path = odbc_db; sourceTree = ""; }; ED9D3D880D81968D00470E44 /* DB_Interfaces */ = { isa = PBXGroup; children = ( ED9D3D930D81968D00470E44 /* text_db */, ); name = DB_Interfaces; path = ../DB_Interfaces; sourceTree = ""; }; ED9D3D930D81968D00470E44 /* text_db */ = { isa = PBXGroup; children = ( ED9D3D940D81968D00470E44 /* sync_dbapi_text.cpp */, ); path = text_db; sourceTree = ""; }; ED9D3DB70D81969F00470E44 /* syncapps */ = { isa = PBXGroup; children = ( ED556A3C10768FD90008C22F /* serverEngine_custom */, ED9D3DB80D81969F00470E44 /* clientEngine_custom */, ); path = syncapps; sourceTree = ""; }; ED9D3DB80D81969F00470E44 /* clientEngine_custom */ = { isa = PBXGroup; children = ( EDDF0813107E435200A119FE /* product_options.h */, ED9D3DBA0D81969F00470E44 /* clientengine_custom.h */, ED9D3DBB0D81969F00470E44 /* clientengine_custom_precomp.h */, ED9D3DBC0D81969F00470E44 /* clientengine_custom_Base.h */, ED9D3DBD0D81969F00470E44 /* clientengine_custom_Base.cpp */, ); path = clientEngine_custom; sourceTree = ""; }; ED9D3DD90D8196BB00470E44 /* platform_adapters */ = { isa = PBXGroup; children = ( ED9D3DDA0D8196BB00470E44 /* unix_common */, ED9D3DE00D8196BB00470E44 /* macosx */, ED9D3DE90D8196BB00470E44 /* binfile.cpp */, ED9D3DEA0D8196BB00470E44 /* binfile.h */, ED9D3DEB0D8196BB00470E44 /* configfiles.h */, ED9D3DED0D8196BB00470E44 /* platform_thread.h */, ED9D3DEE0D8196BB00470E44 /* platform_mutex.h */, ED9D3DEF0D8196BB00470E44 /* platform_file.h */, ED9D3DF00D8196BB00470E44 /* profiling.h */, ED9D3DF10D8196BB00470E44 /* sysyncinit.cpp */, ); path = platform_adapters; sourceTree = ""; }; ED9D3DDA0D8196BB00470E44 /* unix_common */ = { isa = PBXGroup; children = ( ED9D3DDB0D8196BB00470E44 /* platform_pipe.h */, ED9D3DDC0D8196BB00470E44 /* platform_pipe.c */, ED9D3DDD0D8196BB00470E44 /* platform_thread.cpp */, ED9D3DDE0D8196BB00470E44 /* platform_mutex.cpp */, ED9D3DDF0D8196BB00470E44 /* platform_file.cpp */, ); path = unix_common; sourceTree = ""; }; ED9D3DE00D8196BB00470E44 /* macosx */ = { isa = PBXGroup; children = ( ED5B87FA0F8559C40042779A /* platform_timezones.mm */, ED43DAD60E014BC9000A1E5C /* configfiles.mm */, ED16A68D14B9B4E400F24032 /* platform_DLL.h */, ED9D3DE30D8196BB00470E44 /* platform_exec.h */, ED9D3DE40D8196BB00470E44 /* platform_exec.c */, ED9D3DE50D8196BB00470E44 /* platform_headers.h */, ED9D3DE60D8196BB00470E44 /* platform_time.h */, ED9D3DE70D8196BB00470E44 /* platform_time.cpp */, ED9D3DE80D8196BB00470E44 /* profiling.cpp */, ); path = macosx; sourceTree = ""; }; ED9D3DFD0D8196CA00470E44 /* Transport_interfaces */ = { isa = PBXGroup; children = ( ED9D3DFE0D8196CA00470E44 /* engine */, ); path = Transport_interfaces; sourceTree = ""; }; ED9D3DFE0D8196CA00470E44 /* engine */ = { isa = PBXGroup; children = ( ED556A4E107692F20008C22F /* enginesessiondispatch.cpp */, ED556A4F107692F20008C22F /* enginesessiondispatch.h */, ED9D3DFF0D8196CA00470E44 /* engine_client_precomp.h */, ED9D3E000D8196CA00470E44 /* engine_client.h */, ED9D3E010D8196CA00470E44 /* engineclientbase.cpp */, ED9D3E020D8196CA00470E44 /* engineclientbase.h */, ); path = engine; sourceTree = ""; }; ED9D3E200D8196F400470E44 /* syncml_tk */ = { isa = PBXGroup; children = ( ED806C370D81A89E00F9A79C /* wsm */, ED9D3E210D8196F400470E44 /* sml */, ); path = syncml_tk; sourceTree = ""; }; ED9D3E210D8196F400470E44 /* sml */ = { isa = PBXGroup; children = ( ED806BC40D81A5AD00F9A79C /* inc */, ED806BB50D81A58800F9A79C /* lib */, ED806BCF0D81A5D500F9A79C /* mgr */, ED806BE30D81A5F400F9A79C /* xlt */, ); name = sml; path = src/sml; sourceTree = ""; }; ED9D3E8E0D81970700470E44 /* sysync */ = { isa = PBXGroup; children = ( ED9D3E8F0D81970700470E44 /* binfilebase.cpp */, ED9D3E900D81970700470E44 /* binfilebase.h */, ED9D3E910D81970700470E44 /* binfileimplclient.cpp */, ED9D3E920D81970700470E44 /* binfileimplclient.h */, ED9D3E930D81970700470E44 /* binfileimplds.cpp */, ED9D3E940D81970700470E44 /* binfileimplds.h */, ED9D3E950D81970700470E44 /* engineentry.cpp */, ED9D3E960D81970700470E44 /* engineentry.h */, ED9D3E970D81970700470E44 /* engineinterface.cpp */, ED9D3E980D81970700470E44 /* engineinterface.h */, ED9D3E990D81970700470E44 /* configelement.h */, ED9D3E9A0D81970700470E44 /* configelement.cpp */, ED9D3E9B0D81970700470E44 /* customimplds.h */, ED9D3E9C0D81970700470E44 /* customimplds.cpp */, ED9D3E9D0D81970700470E44 /* customimplagent.h */, ED9D3E9E0D81970700470E44 /* customimplagent.cpp */, ED9D3E9F0D81970700470E44 /* dataobjtype.h */, ED9D3EA00D81970700470E44 /* dataobjtype.cpp */, ED9D3EA10D81970700470E44 /* debuglogger.h */, ED9D3EA20D81970700470E44 /* debuglogger.cpp */, ED9D3EA30D81970700470E44 /* iso8601.h */, ED9D3EA40D81970700470E44 /* iso8601.cpp */, ED9D3EA50D81970700470E44 /* itemfield.h */, ED9D3EA60D81970700470E44 /* itemfield.cpp */, ED9D3EA90D81970700470E44 /* localengineds.h */, ED9D3EAA0D81970700470E44 /* localengineds.cpp */, ED9D3EAB0D81970700470E44 /* mimediritemtype.h */, ED9D3EAC0D81970700470E44 /* mimediritemtype.cpp */, EDAC08210F179E78005E9AE2 /* mimedirprofile.h */, EDAC08220F179E78005E9AE2 /* mimedirprofile.cpp */, ED9D3EAD0D81970700470E44 /* multifielditem.h */, ED9D3EAE0D81970700470E44 /* multifielditem.cpp */, ED9D3EAF0D81970700470E44 /* multifielditemtype.h */, ED9D3EB00D81970700470E44 /* multifielditemtype.cpp */, EDDAFD0111A0989D003E33D5 /* rawdataitemtype.h */, EDDAFD0211A0989D003E33D5 /* rawdataitemtype.cpp */, ED9D3EB10D81970700470E44 /* remotedatastore.h */, ED9D3EB20D81970700470E44 /* remotedatastore.cpp */, ED9D3EB30D81970700470E44 /* rrules.h */, ED9D3EB40D81970700470E44 /* rrules.cpp */, ED9D3EB70D81970700470E44 /* scriptcontext.h */, ED9D3EB80D81970700470E44 /* scriptcontext.cpp */, ED9D3EB90D81970700470E44 /* simpleitem.h */, ED9D3EBA0D81970700470E44 /* simpleitem.cpp */, ED9D3EBB0D81970700470E44 /* smltk_precomp.h */, ED9D3EBC0D81970700470E44 /* smltk_precomp_xpt.h */, ED9D3EBD0D81970700470E44 /* stringutils.h */, ED9D3EBE0D81970700470E44 /* stringutils.cpp */, ED9D3EBF0D81970700470E44 /* superdatastore.h */, ED9D3EC00D81970700470E44 /* superdatastore.cpp */, ED9D3EC10D81970700470E44 /* syncappbase.h */, ED9D3EC20D81970700470E44 /* syncappbase.cpp */, EDE194C61074A04F00439216 /* syncagent.h */, EDE194C71074A04F00439216 /* syncagent.cpp */, ED9D3EC50D81970700470E44 /* syncclientbase.h */, ED9D3EC60D81970700470E44 /* syncclientbase.cpp */, ED9D3EC70D81970700470E44 /* synccommand.h */, ED9D3EC80D81970700470E44 /* synccommand.cpp */, ED9D3EC90D81970700470E44 /* syncdatastore.h */, ED9D3ECA0D81970700470E44 /* syncdatastore.cpp */, ED9D3ECD0D81970700470E44 /* syncitem.h */, ED9D3ECE0D81970700470E44 /* syncitem.cpp */, ED9D3ECF0D81970700470E44 /* syncitemtype.h */, ED9D3ED00D81970700470E44 /* syncitemtype.cpp */, ED9D3ED30D81970700470E44 /* syncsession.h */, ED9D3ED40D81970700470E44 /* syncsession.cpp */, ED9D3ED70D81970700470E44 /* syserial.h */, ED9D3ED90D81970700470E44 /* sysync.h */, ED9D3EDC0D81970700470E44 /* sysync_crc16.h */, ED9D3EDD0D81970700470E44 /* sysync_crc16.cpp */, ED55B6960DDDBC43001657F6 /* sysync_debug.h */, ED9D3EDE0D81970700470E44 /* sysync_globs.h */, ED9D3EE10D81970700470E44 /* sysync_precomp.h */, ED9D3EE20D81970700470E44 /* sysync_precomp_xpt.h */, ED9D3EE30D81970700470E44 /* stdlogicagent.h */, ED9D3EE40D81970700470E44 /* stdlogicagent.cpp */, ED9D3EE50D81970700470E44 /* stdlogicds.h */, ED9D3EE60D81970700470E44 /* stdlogicds.cpp */, ED9D3EE90D81970700470E44 /* textitemtype.h */, ED9D3EEA0D81970700470E44 /* textitemtype.cpp */, ED9D3EEB0D81970700470E44 /* textprofile.h */, ED9D3EEC0D81970700470E44 /* textprofile.cpp */, ED9D3EED0D81970700470E44 /* timezones.h */, ED9D3EEE0D81970700470E44 /* timezones.cpp */, ED9D3EEF0D81970700470E44 /* uiapi.cpp */, ED9D3EF00D81970700470E44 /* uiapi.h */, ED9D3EF10D81970700470E44 /* vcalendaritemtype.h */, ED9D3EF20D81970700470E44 /* vcalendaritemtype.cpp */, ED9D3EF30D81970700470E44 /* vcarditemtype.h */, ED9D3EF40D81970700470E44 /* vcarditemtype.cpp */, ED9D3EF50D81970700470E44 /* vtimezone.h */, ED9D3EF60D81970700470E44 /* vtimezone.cpp */, ED9D3EF70D81970700470E44 /* tz_table.h */, ); path = sysync; sourceTree = ""; }; ED9D3F290D81971700470E44 /* External Code */ = { isa = PBXGroup; children = ( ED9D3F490D81971700470E44 /* zlib */, ED9D3F440D81971700470E44 /* expat */, ED9D3F2F0D81971700470E44 /* pcre */, ); name = "External Code"; sourceTree = ""; }; ED9D3F2F0D81971700470E44 /* pcre */ = { isa = PBXGroup; children = ( ED9D3F300D81971700470E44 /* pcre_ord2utf8.c */, ED9D3F310D81971700470E44 /* pcre_chartables.c */, ED9D3F320D81971700470E44 /* pcre_compile.c */, ED9D3F330D81971700470E44 /* pcre_config.c */, ED9D3F340D81971700470E44 /* pcre_dfa_exec.c */, ED9D3F350D81971700470E44 /* pcre_exec.c */, ED9D3F360D81971700470E44 /* pcre_fullinfo.c */, ED9D3F370D81971700470E44 /* pcre_get.c */, ED9D3F380D81971700470E44 /* pcre_globals.c */, ED9D3F390D81971700470E44 /* pcre_info.c */, ED9D3F3A0D81971700470E44 /* pcre_newline.c */, ED9D3F3B0D81971700470E44 /* pcre_refcount.c */, ED9D3F3C0D81971700470E44 /* pcre_study.c */, ED9D3F3D0D81971700470E44 /* pcre_tables.c */, ED9D3F3E0D81971700470E44 /* pcre_try_flipped.c */, ED9D3F3F0D81971700470E44 /* pcre_valid_utf8.c */, ED9D3F400D81971700470E44 /* pcre_version.c */, ED9D3F410D81971700470E44 /* pcre_xclass.c */, ED9D3F420D81971700470E44 /* pcre_config_macosx.h */, ED9D3F430D81971700470E44 /* pcre.h */, ); name = pcre; sourceTree = ""; }; ED9D3F440D81971700470E44 /* expat */ = { isa = PBXGroup; children = ( ED55B6AF0DDDBDD9001657F6 /* ascii.h */, ED55B6B00DDDBDD9001657F6 /* asciitab.h */, ED55B6B10DDDBDD9001657F6 /* iasciitab.h */, ED55B6B20DDDBDD9001657F6 /* latin1tab.h */, ED55B6B30DDDBDD9001657F6 /* nametab.h */, ED55B6B40DDDBDD9001657F6 /* utf8tab.h */, ED55B6B50DDDBDD9001657F6 /* xmlrole.h */, ED55B6A90DDDBD4E001657F6 /* xmldef.h */, ED55B69C0DDDBD0A001657F6 /* xmltok.h */, ED9D3F450D81971700470E44 /* xmlparse.c */, ED9D3F460D81971700470E44 /* xmlparse.h */, ED9D3F470D81971700470E44 /* xmltok.c */, ED9D3F480D81971700470E44 /* xmlrole.c */, ); name = expat; sourceTree = ""; }; ED9D3F490D81971700470E44 /* zlib */ = { isa = PBXGroup; children = ( ED9D3F4A0D81971700470E44 /* zlib.h */, ED9D3F4B0D81971700470E44 /* zutil.h */, ED9D3F4C0D81971700470E44 /* infback.c */, ED9D3F4D0D81971700470E44 /* gzio.c */, ED9D3F4E0D81971700470E44 /* deflate.c */, ED9D3F4F0D81971700470E44 /* uncompr.c */, ED9D3F500D81971700470E44 /* trees.c */, ED9D3F510D81971700470E44 /* inftrees.c */, ED9D3F520D81971700470E44 /* inflate.c */, ED9D3F530D81971700470E44 /* inffast.c */, ED9D3F540D81971700470E44 /* zutil.c */, ED9D3F550D81971700470E44 /* crc32.c */, ED9D3F560D81971700470E44 /* compress.c */, ED9D3F570D81971700470E44 /* adler32.c */, ); name = zlib; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ ED55691E10768FAA0008C22F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ED55691F10768FAA0008C22F /* enginemodulebase.h in Headers */, ED55692010768FAA0008C22F /* engine_defs.h in Headers */, ED55692110768FAA0008C22F /* generic_types.h in Headers */, ED55692210768FAA0008C22F /* syerror.h in Headers */, ED55692310768FAA0008C22F /* admindata.h in Headers */, ED55692410768FAA0008C22F /* blobs.h in Headers */, ED55692510768FAA0008C22F /* dbitem.h in Headers */, ED55692610768FAA0008C22F /* sync_include.h in Headers */, ED55692710768FAA0008C22F /* sync_dbapidef.h in Headers */, ED55692810768FAA0008C22F /* sync_dbapi.h in Headers */, ED55692910768FAA0008C22F /* SDK_util.h in Headers */, ED55692A10768FAA0008C22F /* SDK_support.h in Headers */, ED55692B10768FAA0008C22F /* sync_dbapiconnect.h in Headers */, ED55692C10768FAA0008C22F /* plugindb.h in Headers */, ED55692D10768FAA0008C22F /* plugindb_precomp.h in Headers */, ED55692E10768FAA0008C22F /* dbapi.h in Headers */, ED55692F10768FAA0008C22F /* dbapi_include.h in Headers */, ED55693010768FAA0008C22F /* pluginapiagent.h in Headers */, ED55693110768FAA0008C22F /* pluginapids.h in Headers */, ED55693210768FAA0008C22F /* DLL_interface.h in Headers */, ED55693310768FAA0008C22F /* odbcdb.h in Headers */, ED55693410768FAA0008C22F /* odbcdb_precomp.h in Headers */, ED55693510768FAA0008C22F /* odbcapiagent.h in Headers */, ED55693610768FAA0008C22F /* odbcapids.h in Headers */, ED55693810768FAA0008C22F /* clientengine_custom.h in Headers */, ED55693910768FAA0008C22F /* clientengine_custom_precomp.h in Headers */, ED55693A10768FAA0008C22F /* clientengine_custom_Base.h in Headers */, ED55693B10768FAA0008C22F /* platform_pipe.h in Headers */, ED55693C10768FAA0008C22F /* platform_exec.h in Headers */, ED55693D10768FAA0008C22F /* platform_headers.h in Headers */, ED55693E10768FAA0008C22F /* platform_time.h in Headers */, ED55693F10768FAA0008C22F /* binfile.h in Headers */, ED55694010768FAA0008C22F /* configfiles.h in Headers */, ED55694210768FAA0008C22F /* platform_thread.h in Headers */, ED55694310768FAA0008C22F /* platform_mutex.h in Headers */, ED55694410768FAA0008C22F /* platform_file.h in Headers */, ED55694510768FAA0008C22F /* profiling.h in Headers */, ED55694610768FAA0008C22F /* engine_client_precomp.h in Headers */, ED55694710768FAA0008C22F /* engine_client.h in Headers */, ED55694810768FAA0008C22F /* engineclientbase.h in Headers */, ED55694910768FAA0008C22F /* wsm.h in Headers */, ED55694A10768FAA0008C22F /* sml.h in Headers */, ED55694B10768FAA0008C22F /* smldef.h in Headers */, ED55694C10768FAA0008C22F /* smldevinfdtd.h in Headers */, ED55694D10768FAA0008C22F /* smldtd.h in Headers */, ED55694E10768FAA0008C22F /* smlerr.h in Headers */, ED55694F10768FAA0008C22F /* smlmetinfdtd.h in Headers */, ED55695010768FAA0008C22F /* liblock.h in Headers */, ED55695110768FAA0008C22F /* libmem.h in Headers */, ED55695210768FAA0008C22F /* libstr.h in Headers */, ED55695310768FAA0008C22F /* libutil.h in Headers */, ED55695410768FAA0008C22F /* mgr.h in Headers */, ED55695510768FAA0008C22F /* mgrutil.h in Headers */, ED55695610768FAA0008C22F /* xltdeccom.h in Headers */, ED55695710768FAA0008C22F /* xltdecwbxml.h in Headers */, ED55695810768FAA0008C22F /* xltdevinf.h in Headers */, ED55695910768FAA0008C22F /* xltenccom.h in Headers */, ED55695A10768FAA0008C22F /* xltencwbxml.h in Headers */, ED55695B10768FAA0008C22F /* xltencxml.h in Headers */, ED55695C10768FAA0008C22F /* xltmetinf.h in Headers */, ED55695D10768FAA0008C22F /* xlttags.h in Headers */, ED55695E10768FAA0008C22F /* xlttagtbl.h in Headers */, ED55695F10768FAA0008C22F /* xltutilstack.h in Headers */, ED55696010768FAA0008C22F /* xltdec.h in Headers */, ED55696110768FAA0008C22F /* xltenc.h in Headers */, ED55696210768FAA0008C22F /* binfilebase.h in Headers */, ED55696310768FAA0008C22F /* binfileimplclient.h in Headers */, ED55696410768FAA0008C22F /* binfileimplds.h in Headers */, ED55696510768FAA0008C22F /* engineentry.h in Headers */, ED55696610768FAA0008C22F /* engineinterface.h in Headers */, ED55696710768FAA0008C22F /* configelement.h in Headers */, ED55696810768FAA0008C22F /* customimplds.h in Headers */, ED55696910768FAA0008C22F /* customimplagent.h in Headers */, ED55696A10768FAA0008C22F /* dataobjtype.h in Headers */, ED55696B10768FAA0008C22F /* debuglogger.h in Headers */, ED55696C10768FAA0008C22F /* iso8601.h in Headers */, ED55696D10768FAA0008C22F /* itemfield.h in Headers */, ED55696F10768FAA0008C22F /* localengineds.h in Headers */, ED55697010768FAA0008C22F /* mimediritemtype.h in Headers */, ED55697110768FAA0008C22F /* multifielditem.h in Headers */, ED55697210768FAA0008C22F /* multifielditemtype.h in Headers */, ED55697310768FAA0008C22F /* remotedatastore.h in Headers */, ED55697410768FAA0008C22F /* rrules.h in Headers */, ED55697610768FAA0008C22F /* scriptcontext.h in Headers */, ED55697710768FAA0008C22F /* simpleitem.h in Headers */, ED55697810768FAA0008C22F /* smltk_precomp.h in Headers */, ED55697910768FAA0008C22F /* smltk_precomp_xpt.h in Headers */, ED55697A10768FAA0008C22F /* stringutils.h in Headers */, ED55697B10768FAA0008C22F /* superdatastore.h in Headers */, ED55697C10768FAA0008C22F /* syncappbase.h in Headers */, ED55697D10768FAA0008C22F /* syncclientbase.h in Headers */, ED55697E10768FAA0008C22F /* synccommand.h in Headers */, ED55697F10768FAA0008C22F /* syncdatastore.h in Headers */, ED55698110768FAA0008C22F /* syncitem.h in Headers */, ED55698210768FAA0008C22F /* syncitemtype.h in Headers */, ED55698310768FAA0008C22F /* syncsession.h in Headers */, ED55698410768FAA0008C22F /* syserial.h in Headers */, ED55698510768FAA0008C22F /* sysync.h in Headers */, ED55698710768FAA0008C22F /* sysync_crc16.h in Headers */, ED55698810768FAA0008C22F /* sysync_globs.h in Headers */, ED55698A10768FAA0008C22F /* sysync_precomp.h in Headers */, ED55698B10768FAA0008C22F /* sysync_precomp_xpt.h in Headers */, ED55698C10768FAA0008C22F /* stdlogicagent.h in Headers */, ED55698D10768FAA0008C22F /* stdlogicds.h in Headers */, ED55698F10768FAA0008C22F /* textitemtype.h in Headers */, ED55699010768FAA0008C22F /* textprofile.h in Headers */, ED55699110768FAA0008C22F /* timezones.h in Headers */, ED55699210768FAA0008C22F /* uiapi.h in Headers */, ED55699310768FAA0008C22F /* vcalendaritemtype.h in Headers */, ED55699410768FAA0008C22F /* vcarditemtype.h in Headers */, ED55699510768FAA0008C22F /* vtimezone.h in Headers */, ED55699610768FAA0008C22F /* tz_table.h in Headers */, ED55699710768FAA0008C22F /* zlib.h in Headers */, ED55699810768FAA0008C22F /* zutil.h in Headers */, ED55699910768FAA0008C22F /* xmlparse.h in Headers */, ED55699A10768FAA0008C22F /* pcre_config_macosx.h in Headers */, ED55699B10768FAA0008C22F /* pcre.h in Headers */, ED55699C10768FAA0008C22F /* sysync_debug.h in Headers */, ED55699D10768FAA0008C22F /* sync_uiapi.h in Headers */, ED55699E10768FAA0008C22F /* xmltok.h in Headers */, ED55699F10768FAA0008C22F /* xmldef.h in Headers */, ED5569A010768FAA0008C22F /* ascii.h in Headers */, ED5569A110768FAA0008C22F /* asciitab.h in Headers */, ED5569A210768FAA0008C22F /* iasciitab.h in Headers */, ED5569A310768FAA0008C22F /* latin1tab.h in Headers */, ED5569A410768FAA0008C22F /* nametab.h in Headers */, ED5569A510768FAA0008C22F /* utf8tab.h in Headers */, ED5569A610768FAA0008C22F /* xmlrole.h in Headers */, ED5569AA10768FAA0008C22F /* mimedirprofile.h in Headers */, ED5569AB10768FAA0008C22F /* syncagent.h in Headers */, ED556A4410768FD90008C22F /* combi_product_options.h in Headers */, ED556A4510768FD90008C22F /* serverengine_custom.h in Headers */, ED556A4610768FD90008C22F /* serverengine_custom_precomp.h in Headers */, ED556A4710768FD90008C22F /* serverengine_custom_Base.h in Headers */, ED556A51107692F20008C22F /* enginesessiondispatch.h in Headers */, EDDF0814107E435200A119FE /* product_options.h in Headers */, ED4B5ECD11523AAB00ECB4A5 /* sysync_utils.h in Headers */, ED4B5ED411523AAB00ECB4A5 /* san.h in Headers */, ED4B5ED511523AAB00ECB4A5 /* sysync_md5.h in Headers */, ED4B5ED711523AAB00ECB4A5 /* sysync_b64.h in Headers */, ED4B5ED911523AAB00ECB4A5 /* syncexception.h in Headers */, ED4B5EDA11523AAB00ECB4A5 /* lineartime.h in Headers */, EDDAFD0911A0989D003E33D5 /* rawdataitemtype.h in Headers */, ED16A68F14B9B4E400F24032 /* platform_DLL.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; ED60E7670DF54F870087381E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ED60E7680DF54F870087381E /* enginemodulebase.h in Headers */, ED60E7690DF54F870087381E /* engine_defs.h in Headers */, ED60E76A0DF54F870087381E /* generic_types.h in Headers */, ED60E76B0DF54F870087381E /* syerror.h in Headers */, ED60E76C0DF54F870087381E /* admindata.h in Headers */, ED60E76D0DF54F870087381E /* blobs.h in Headers */, ED60E76E0DF54F870087381E /* dbitem.h in Headers */, ED60E76F0DF54F870087381E /* sync_include.h in Headers */, ED60E7700DF54F870087381E /* sync_dbapidef.h in Headers */, ED60E7710DF54F870087381E /* sync_dbapi.h in Headers */, ED60E7720DF54F870087381E /* SDK_util.h in Headers */, ED60E7730DF54F870087381E /* SDK_support.h in Headers */, ED60E7740DF54F870087381E /* sync_dbapiconnect.h in Headers */, ED60E7750DF54F870087381E /* plugindb.h in Headers */, ED60E7760DF54F870087381E /* plugindb_precomp.h in Headers */, ED60E7770DF54F870087381E /* dbapi.h in Headers */, ED60E7780DF54F870087381E /* dbapi_include.h in Headers */, ED60E7790DF54F870087381E /* pluginapiagent.h in Headers */, ED60E77A0DF54F870087381E /* pluginapids.h in Headers */, ED60E77B0DF54F870087381E /* DLL_interface.h in Headers */, ED60E77C0DF54F870087381E /* odbcdb.h in Headers */, ED60E77D0DF54F870087381E /* odbcdb_precomp.h in Headers */, ED60E77E0DF54F870087381E /* odbcapiagent.h in Headers */, ED60E77F0DF54F870087381E /* odbcapids.h in Headers */, ED60E7810DF54F870087381E /* clientengine_custom.h in Headers */, ED60E7820DF54F870087381E /* clientengine_custom_precomp.h in Headers */, ED60E7830DF54F870087381E /* clientengine_custom_Base.h in Headers */, ED60E7840DF54F870087381E /* platform_pipe.h in Headers */, ED60E7850DF54F870087381E /* platform_exec.h in Headers */, ED60E7860DF54F870087381E /* platform_headers.h in Headers */, ED60E7870DF54F870087381E /* platform_time.h in Headers */, ED60E7880DF54F870087381E /* binfile.h in Headers */, ED60E7890DF54F870087381E /* configfiles.h in Headers */, ED60E78B0DF54F870087381E /* platform_thread.h in Headers */, ED60E78C0DF54F870087381E /* platform_mutex.h in Headers */, ED60E78D0DF54F870087381E /* platform_file.h in Headers */, ED60E78E0DF54F870087381E /* profiling.h in Headers */, ED60E78F0DF54F870087381E /* engine_client_precomp.h in Headers */, ED60E7900DF54F870087381E /* engine_client.h in Headers */, ED60E7910DF54F870087381E /* engineclientbase.h in Headers */, ED60E7920DF54F870087381E /* wsm.h in Headers */, ED60E7930DF54F870087381E /* sml.h in Headers */, ED60E7940DF54F870087381E /* smldef.h in Headers */, ED60E7950DF54F870087381E /* smldevinfdtd.h in Headers */, ED60E7960DF54F870087381E /* smldtd.h in Headers */, ED60E7970DF54F870087381E /* smlerr.h in Headers */, ED60E7980DF54F870087381E /* smlmetinfdtd.h in Headers */, ED60E7990DF54F870087381E /* liblock.h in Headers */, ED60E79A0DF54F870087381E /* libmem.h in Headers */, ED60E79B0DF54F870087381E /* libstr.h in Headers */, ED60E79C0DF54F870087381E /* libutil.h in Headers */, ED60E79D0DF54F870087381E /* mgr.h in Headers */, ED60E79E0DF54F870087381E /* mgrutil.h in Headers */, ED60E79F0DF54F870087381E /* xltdeccom.h in Headers */, ED60E7A00DF54F870087381E /* xltdecwbxml.h in Headers */, ED60E7A10DF54F870087381E /* xltdevinf.h in Headers */, ED60E7A20DF54F870087381E /* xltenccom.h in Headers */, ED60E7A30DF54F870087381E /* xltencwbxml.h in Headers */, ED60E7A40DF54F870087381E /* xltencxml.h in Headers */, ED60E7A50DF54F870087381E /* xltmetinf.h in Headers */, ED60E7A60DF54F870087381E /* xlttags.h in Headers */, ED60E7A70DF54F870087381E /* xlttagtbl.h in Headers */, ED60E7A80DF54F870087381E /* xltutilstack.h in Headers */, ED60E7A90DF54F870087381E /* xltdec.h in Headers */, ED60E7AA0DF54F870087381E /* xltenc.h in Headers */, ED60E7AB0DF54F870087381E /* binfilebase.h in Headers */, ED60E7AC0DF54F870087381E /* binfileimplclient.h in Headers */, ED60E7AD0DF54F870087381E /* binfileimplds.h in Headers */, ED60E7AE0DF54F870087381E /* engineentry.h in Headers */, ED60E7AF0DF54F870087381E /* engineinterface.h in Headers */, ED60E7B00DF54F870087381E /* configelement.h in Headers */, ED60E7B10DF54F870087381E /* customimplds.h in Headers */, ED60E7B20DF54F870087381E /* customimplagent.h in Headers */, ED60E7B30DF54F870087381E /* dataobjtype.h in Headers */, ED60E7B40DF54F870087381E /* debuglogger.h in Headers */, ED60E7B50DF54F870087381E /* iso8601.h in Headers */, ED60E7B60DF54F870087381E /* itemfield.h in Headers */, ED60E7B80DF54F870087381E /* localengineds.h in Headers */, ED60E7B90DF54F870087381E /* mimediritemtype.h in Headers */, ED60E7BA0DF54F870087381E /* multifielditem.h in Headers */, ED60E7BB0DF54F870087381E /* multifielditemtype.h in Headers */, ED60E7BC0DF54F870087381E /* remotedatastore.h in Headers */, ED60E7BD0DF54F870087381E /* rrules.h in Headers */, ED60E7BF0DF54F870087381E /* scriptcontext.h in Headers */, ED60E7C00DF54F870087381E /* simpleitem.h in Headers */, ED60E7C10DF54F870087381E /* smltk_precomp.h in Headers */, ED60E7C20DF54F870087381E /* smltk_precomp_xpt.h in Headers */, ED60E7C30DF54F870087381E /* stringutils.h in Headers */, ED60E7C40DF54F870087381E /* superdatastore.h in Headers */, ED60E7C50DF54F870087381E /* syncappbase.h in Headers */, ED60E7C70DF54F870087381E /* syncclientbase.h in Headers */, ED60E7C80DF54F870087381E /* synccommand.h in Headers */, ED60E7C90DF54F870087381E /* syncdatastore.h in Headers */, ED60E7CB0DF54F870087381E /* syncitem.h in Headers */, ED60E7CC0DF54F870087381E /* syncitemtype.h in Headers */, ED60E7CD0DF54F870087381E /* syncsession.h in Headers */, ED60E7CE0DF54F870087381E /* syserial.h in Headers */, ED60E7CF0DF54F870087381E /* sysync.h in Headers */, ED60E7D10DF54F870087381E /* sysync_crc16.h in Headers */, ED60E7D20DF54F870087381E /* sysync_globs.h in Headers */, ED60E7D40DF54F870087381E /* sysync_precomp.h in Headers */, ED60E7D50DF54F870087381E /* sysync_precomp_xpt.h in Headers */, ED60E7D60DF54F870087381E /* stdlogicagent.h in Headers */, ED60E7D70DF54F870087381E /* stdlogicds.h in Headers */, ED60E7D90DF54F870087381E /* textitemtype.h in Headers */, ED60E7DA0DF54F870087381E /* textprofile.h in Headers */, ED60E7DB0DF54F870087381E /* timezones.h in Headers */, ED60E7DC0DF54F870087381E /* uiapi.h in Headers */, ED60E7DD0DF54F870087381E /* vcalendaritemtype.h in Headers */, ED60E7DE0DF54F870087381E /* vcarditemtype.h in Headers */, ED60E7DF0DF54F870087381E /* vtimezone.h in Headers */, ED60E7E00DF54F870087381E /* tz_table.h in Headers */, ED60E7E10DF54F870087381E /* zlib.h in Headers */, ED60E7E20DF54F870087381E /* zutil.h in Headers */, ED60E7E30DF54F870087381E /* xmlparse.h in Headers */, ED60E7E40DF54F870087381E /* pcre_config_macosx.h in Headers */, ED60E7E50DF54F870087381E /* pcre.h in Headers */, ED60E7EA0DF54F870087381E /* sysync_debug.h in Headers */, ED60E7EB0DF54F870087381E /* sync_uiapi.h in Headers */, ED60E7EC0DF54F870087381E /* xmltok.h in Headers */, ED60E7ED0DF54F870087381E /* xmldef.h in Headers */, ED60E7EE0DF54F870087381E /* ascii.h in Headers */, ED60E7EF0DF54F870087381E /* asciitab.h in Headers */, ED60E7F00DF54F870087381E /* iasciitab.h in Headers */, ED60E7F10DF54F870087381E /* latin1tab.h in Headers */, ED60E7F20DF54F870087381E /* nametab.h in Headers */, ED60E7F30DF54F870087381E /* utf8tab.h in Headers */, ED60E7F40DF54F870087381E /* xmlrole.h in Headers */, EDAC08250F179E78005E9AE2 /* mimedirprofile.h in Headers */, EDE194C81074A04F00439216 /* syncagent.h in Headers */, EDDF0816107E435200A119FE /* product_options.h in Headers */, ED4B5EB111523AAB00ECB4A5 /* sysync_utils.h in Headers */, ED4B5EB811523AAB00ECB4A5 /* san.h in Headers */, ED4B5EB911523AAB00ECB4A5 /* sysync_md5.h in Headers */, ED4B5EBB11523AAB00ECB4A5 /* sysync_b64.h in Headers */, ED4B5EBD11523AAB00ECB4A5 /* syncexception.h in Headers */, ED4B5EBE11523AAB00ECB4A5 /* lineartime.h in Headers */, EDDAFD0511A0989D003E33D5 /* rawdataitemtype.h in Headers */, ED16A68E14B9B4E400F24032 /* platform_DLL.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ ED55691D10768FAA0008C22F /* static_combiEngine_opensource_ios */ = { isa = PBXNativeTarget; buildConfigurationList = ED556A3810768FAA0008C22F /* Build configuration list for PBXNativeTarget "static_combiEngine_opensource_ios" */; buildPhases = ( ED55691E10768FAA0008C22F /* Headers */, ED5569AC10768FAA0008C22F /* Sources */, ED556A3710768FAA0008C22F /* Frameworks */, ED1ECC071383F01A00B3DA02 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = static_combiEngine_opensource_ios; productName = clientEngine_PROTO_iPhoneOS_static; productReference = ED1ECBC41383B0DB00B3DA02 /* libsysync_combi_ios.a */; productType = "com.apple.product-type.library.static"; }; ED60E7660DF54F870087381E /* static_clientEngine_opensource_ios */ = { isa = PBXNativeTarget; buildConfigurationList = ED60E87C0DF54F870087381E /* Build configuration list for PBXNativeTarget "static_clientEngine_opensource_ios" */; buildPhases = ( ED60E7670DF54F870087381E /* Headers */, ED60E7F50DF54F870087381E /* Sources */, ED60E87B0DF54F870087381E /* Frameworks */, ED1ECC08138400F400B3DA02 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = static_clientEngine_opensource_ios; productName = clientEngine_PROTO_iPhoneOS_static; productReference = ED1ECBC31383B0DB00B3DA02 /* libsysync_client_ios.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0450; ORGANIZATIONNAME = plan44.ch; }; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "sysync_ios" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; projectDirPath = ""; projectRoot = ""; targets = ( ED60E7660DF54F870087381E /* static_clientEngine_opensource_ios */, ED55691D10768FAA0008C22F /* static_combiEngine_opensource_ios */, ); }; /* End PBXProject section */ /* Begin PBXShellScriptBuildPhase section */ ED1ECC071383F01A00B3DA02 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( "$(BUILT_PRODUCTS_DIR)/$(FULL_PRODUCT_NAME)", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "# Make sure we have a recent copy in the SDK /bin\n\n#echo \"TARGET_BUILD_DIR:\"\n#ls -la \"$TARGET_BUILD_DIR\"\n#echo \"BUILT_PRODUCTS_DIR:\"\n#ls -la \"$BUILT_PRODUCTS_DIR\"\necho \"cp -fpv \\\"$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME\\\" \\\"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\\\"\"\ncp -fpv \"$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME\" \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\"\necho \"cp status = $?\"\n#echo \"BUILT_PRODUCTS_DIR:\"\n#ls -la \"$BUILT_PRODUCTS_DIR\"\n\n# Note: Xcode 4 does some magic and creates (in the Process step at the beginning of the Build)\n# a symlink in BUILT_PRODUCTS_DIR (that's the explicitly specified one in the Sysync SDK /bin)\n# to the actually built library (deep down in XCode's per-scheme build dir)\n# In this case, cp detects the file is \"identical\" and exits with 1. So we must exit with 0\n# here to make the build continue.\n# We'll end up with a link, not a real file, in the SDK /bin in this case, but that's fine\n# for subsequent TodoZ builds.\nexit 0"; }; ED1ECC08138400F400B3DA02 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( "$(BUILT_PRODUCTS_DIR)/$(FULL_PRODUCT_NAME)", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "# Make sure we have a recent copy in the SDK /bin\n\n#echo \"TARGET_BUILD_DIR:\"\n#ls -la \"$TARGET_BUILD_DIR\"\n#echo \"BUILT_PRODUCTS_DIR:\"\n#ls -la \"$BUILT_PRODUCTS_DIR\"\necho \"cp -fpv \\\"$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME\\\" \\\"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\\\"\"\ncp -fpv \"$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME\" \"$BUILT_PRODUCTS_DIR/$FULL_PRODUCT_NAME\"\necho \"cp status = $?\"\n#echo \"BUILT_PRODUCTS_DIR:\"\n#ls -la \"$BUILT_PRODUCTS_DIR\"\n\n# Note: Xcode 4 does some magic and creates (in the Process step at the beginning of the Build)\n# a symlink in BUILT_PRODUCTS_DIR (that's the explicitly specified one in the Sysync SDK /bin)\n# to the actually built library (deep down in XCode's per-scheme build dir)\n# In this case, cp detects the file is \"identical\" and exits with 1. So we must exit with 0\n# here to make the build continue.\n# We'll end up with a link, not a real file, in the SDK /bin in this case, but that's fine\n# for subsequent TodoZ builds.\nexit 0"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ ED5569AC10768FAA0008C22F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ED5569AE10768FAA0008C22F /* sync_dbapi_text.cpp in Sources */, ED5569AF10768FAA0008C22F /* enginemodulebase.cpp in Sources */, ED5569B010768FAA0008C22F /* admindata.cpp in Sources */, ED5569B110768FAA0008C22F /* blobs.cpp in Sources */, ED5569B210768FAA0008C22F /* dbitem.cpp in Sources */, ED5569B310768FAA0008C22F /* SDK_util.c in Sources */, ED5569B410768FAA0008C22F /* SDK_support.cpp in Sources */, ED5569B510768FAA0008C22F /* sync_dbapiconnect.cpp in Sources */, ED5569B910768FAA0008C22F /* dbapi.cpp in Sources */, ED5569BA10768FAA0008C22F /* pluginapiagent.cpp in Sources */, ED5569BB10768FAA0008C22F /* pluginapids.cpp in Sources */, ED5569BC10768FAA0008C22F /* DLL_interface.cpp in Sources */, ED5569BD10768FAA0008C22F /* odbcapiagent.cpp in Sources */, ED5569BE10768FAA0008C22F /* odbcapids.cpp in Sources */, ED5569BF10768FAA0008C22F /* clientengine_custom_Base.cpp in Sources */, ED5569C010768FAA0008C22F /* platform_pipe.c in Sources */, ED5569C110768FAA0008C22F /* platform_thread.cpp in Sources */, ED5569C210768FAA0008C22F /* platform_mutex.cpp in Sources */, ED5569C310768FAA0008C22F /* platform_file.cpp in Sources */, ED5569C510768FAA0008C22F /* platform_exec.c in Sources */, ED5569C610768FAA0008C22F /* platform_time.cpp in Sources */, ED5569C710768FAA0008C22F /* profiling.cpp in Sources */, ED5569C810768FAA0008C22F /* binfile.cpp in Sources */, ED5569C910768FAA0008C22F /* sysyncinit.cpp in Sources */, ED5569CA10768FAA0008C22F /* engineclientbase.cpp in Sources */, ED5569CB10768FAA0008C22F /* liblock.c in Sources */, ED5569CC10768FAA0008C22F /* libmem.c in Sources */, ED5569CD10768FAA0008C22F /* libstr.c in Sources */, ED5569CE10768FAA0008C22F /* libutil.c in Sources */, ED5569CF10768FAA0008C22F /* mgr.c in Sources */, ED5569D010768FAA0008C22F /* mgrcmdbuilder.c in Sources */, ED5569D110768FAA0008C22F /* mgrcmddispatcher.c in Sources */, ED5569D210768FAA0008C22F /* mgrinstancelist.c in Sources */, ED5569D310768FAA0008C22F /* mgrinstancemgr.c in Sources */, ED5569D410768FAA0008C22F /* mgrutil.c in Sources */, ED5569D510768FAA0008C22F /* xltdec.c in Sources */, ED5569D610768FAA0008C22F /* xltdecwbxml.c in Sources */, ED5569D710768FAA0008C22F /* xltdecxml.c in Sources */, ED5569D810768FAA0008C22F /* xltdevinf.c in Sources */, ED5569D910768FAA0008C22F /* xltenc.c in Sources */, ED5569DA10768FAA0008C22F /* xltenccom.c in Sources */, ED5569DB10768FAA0008C22F /* xltencwbxml.c in Sources */, ED5569DC10768FAA0008C22F /* xltencxml.c in Sources */, ED5569DD10768FAA0008C22F /* xltmetinf.c in Sources */, ED5569DE10768FAA0008C22F /* xlttags.c in Sources */, ED5569DF10768FAA0008C22F /* xltutilstack.c in Sources */, ED5569E010768FAA0008C22F /* binfilebase.cpp in Sources */, ED5569E110768FAA0008C22F /* binfileimplclient.cpp in Sources */, ED5569E210768FAA0008C22F /* binfileimplds.cpp in Sources */, ED5569E310768FAA0008C22F /* engineentry.cpp in Sources */, ED5569E410768FAA0008C22F /* engineinterface.cpp in Sources */, ED5569E510768FAA0008C22F /* configelement.cpp in Sources */, ED5569E610768FAA0008C22F /* customimplds.cpp in Sources */, ED5569E710768FAA0008C22F /* customimplagent.cpp in Sources */, ED5569E810768FAA0008C22F /* dataobjtype.cpp in Sources */, ED5569E910768FAA0008C22F /* debuglogger.cpp in Sources */, ED5569EA10768FAA0008C22F /* iso8601.cpp in Sources */, ED5569EB10768FAA0008C22F /* itemfield.cpp in Sources */, ED5569ED10768FAA0008C22F /* localengineds.cpp in Sources */, ED5569EE10768FAA0008C22F /* mimediritemtype.cpp in Sources */, ED5569EF10768FAA0008C22F /* multifielditem.cpp in Sources */, ED5569F010768FAA0008C22F /* multifielditemtype.cpp in Sources */, ED5569F110768FAA0008C22F /* remotedatastore.cpp in Sources */, ED5569F210768FAA0008C22F /* rrules.cpp in Sources */, ED5569F410768FAA0008C22F /* scriptcontext.cpp in Sources */, ED5569F510768FAA0008C22F /* simpleitem.cpp in Sources */, ED5569F610768FAA0008C22F /* stringutils.cpp in Sources */, ED5569F710768FAA0008C22F /* superdatastore.cpp in Sources */, ED5569F810768FAA0008C22F /* syncappbase.cpp in Sources */, ED5569F910768FAA0008C22F /* syncclientbase.cpp in Sources */, ED5569FA10768FAA0008C22F /* synccommand.cpp in Sources */, ED5569FB10768FAA0008C22F /* syncdatastore.cpp in Sources */, ED5569FD10768FAA0008C22F /* syncitem.cpp in Sources */, ED5569FE10768FAA0008C22F /* syncitemtype.cpp in Sources */, ED5569FF10768FAA0008C22F /* syncsession.cpp in Sources */, ED556A0210768FAA0008C22F /* sysync_crc16.cpp in Sources */, ED556A0410768FAA0008C22F /* stdlogicagent.cpp in Sources */, ED556A0510768FAA0008C22F /* stdlogicds.cpp in Sources */, ED556A0710768FAA0008C22F /* textitemtype.cpp in Sources */, ED556A0810768FAA0008C22F /* textprofile.cpp in Sources */, ED556A0910768FAA0008C22F /* timezones.cpp in Sources */, ED556A0A10768FAA0008C22F /* uiapi.cpp in Sources */, ED556A0B10768FAA0008C22F /* vcalendaritemtype.cpp in Sources */, ED556A0C10768FAA0008C22F /* vcarditemtype.cpp in Sources */, ED556A0D10768FAA0008C22F /* vtimezone.cpp in Sources */, ED556A0E10768FAA0008C22F /* infback.c in Sources */, ED556A0F10768FAA0008C22F /* gzio.c in Sources */, ED556A1010768FAA0008C22F /* deflate.c in Sources */, ED556A1110768FAA0008C22F /* uncompr.c in Sources */, ED556A1210768FAA0008C22F /* trees.c in Sources */, ED556A1310768FAA0008C22F /* inftrees.c in Sources */, ED556A1410768FAA0008C22F /* inflate.c in Sources */, ED556A1510768FAA0008C22F /* inffast.c in Sources */, ED556A1610768FAA0008C22F /* zutil.c in Sources */, ED556A1710768FAA0008C22F /* crc32.c in Sources */, ED556A1810768FAA0008C22F /* compress.c in Sources */, ED556A1910768FAA0008C22F /* adler32.c in Sources */, ED556A1A10768FAA0008C22F /* xmlparse.c in Sources */, ED556A1B10768FAA0008C22F /* xmltok.c in Sources */, ED556A1C10768FAA0008C22F /* xmlrole.c in Sources */, ED556A1D10768FAA0008C22F /* pcre_ord2utf8.c in Sources */, ED556A1E10768FAA0008C22F /* pcre_chartables.c in Sources */, ED556A1F10768FAA0008C22F /* pcre_compile.c in Sources */, ED556A2010768FAA0008C22F /* pcre_config.c in Sources */, ED556A2110768FAA0008C22F /* pcre_dfa_exec.c in Sources */, ED556A2210768FAA0008C22F /* pcre_exec.c in Sources */, ED556A2310768FAA0008C22F /* pcre_fullinfo.c in Sources */, ED556A2410768FAA0008C22F /* pcre_get.c in Sources */, ED556A2510768FAA0008C22F /* pcre_globals.c in Sources */, ED556A2610768FAA0008C22F /* pcre_info.c in Sources */, ED556A2710768FAA0008C22F /* pcre_newline.c in Sources */, ED556A2810768FAA0008C22F /* pcre_refcount.c in Sources */, ED556A2910768FAA0008C22F /* pcre_study.c in Sources */, ED556A2A10768FAA0008C22F /* pcre_tables.c in Sources */, ED556A2B10768FAA0008C22F /* pcre_try_flipped.c in Sources */, ED556A2C10768FAA0008C22F /* pcre_valid_utf8.c in Sources */, ED556A2D10768FAA0008C22F /* pcre_version.c in Sources */, ED556A2E10768FAA0008C22F /* pcre_xclass.c in Sources */, ED556A2F10768FAA0008C22F /* configfiles.mm in Sources */, ED556A3410768FAA0008C22F /* mimedirprofile.cpp in Sources */, ED556A3510768FAA0008C22F /* platform_timezones.mm in Sources */, ED556A3610768FAA0008C22F /* syncagent.cpp in Sources */, ED556A4810768FD90008C22F /* serverengine_custom_Base.cpp in Sources */, ED556A50107692F20008C22F /* enginesessiondispatch.cpp in Sources */, ED4B5ECE11523AAB00ECB4A5 /* sysync_utils.cpp in Sources */, ED4B5ECF11523AAB00ECB4A5 /* syncexception.cpp in Sources */, ED4B5ED211523AAB00ECB4A5 /* lineartime.cpp in Sources */, ED4B5ED311523AAB00ECB4A5 /* san.cpp in Sources */, ED4B5ED611523AAB00ECB4A5 /* sysync_md5.cpp in Sources */, ED4B5ED811523AAB00ECB4A5 /* sysync_b64.cpp in Sources */, EDDAFD0A11A0989D003E33D5 /* rawdataitemtype.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; ED60E7F50DF54F870087381E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ED60E7F70DF54F870087381E /* sync_dbapi_text.cpp in Sources */, ED60E7F80DF54F870087381E /* enginemodulebase.cpp in Sources */, ED60E7F90DF54F870087381E /* admindata.cpp in Sources */, ED60E7FA0DF54F870087381E /* blobs.cpp in Sources */, ED60E7FB0DF54F870087381E /* dbitem.cpp in Sources */, ED60E7FC0DF54F870087381E /* SDK_util.c in Sources */, ED60E7FD0DF54F870087381E /* SDK_support.cpp in Sources */, ED60E7FF0DF54F870087381E /* sync_dbapiconnect.cpp in Sources */, ED60E8030DF54F870087381E /* dbapi.cpp in Sources */, ED60E8040DF54F870087381E /* pluginapiagent.cpp in Sources */, ED60E8050DF54F870087381E /* pluginapids.cpp in Sources */, ED60E8060DF54F870087381E /* DLL_interface.cpp in Sources */, ED60E8070DF54F870087381E /* odbcapiagent.cpp in Sources */, ED60E8080DF54F870087381E /* odbcapids.cpp in Sources */, ED60E8090DF54F870087381E /* clientengine_custom_Base.cpp in Sources */, ED60E80A0DF54F870087381E /* platform_pipe.c in Sources */, ED60E80B0DF54F870087381E /* platform_thread.cpp in Sources */, ED60E80C0DF54F870087381E /* platform_mutex.cpp in Sources */, ED60E80D0DF54F870087381E /* platform_file.cpp in Sources */, ED60E8100DF54F870087381E /* platform_exec.c in Sources */, ED60E8110DF54F870087381E /* platform_time.cpp in Sources */, ED60E8120DF54F870087381E /* profiling.cpp in Sources */, ED60E8130DF54F870087381E /* binfile.cpp in Sources */, ED60E8140DF54F870087381E /* sysyncinit.cpp in Sources */, ED60E8150DF54F870087381E /* engineclientbase.cpp in Sources */, ED60E8160DF54F870087381E /* liblock.c in Sources */, ED60E8170DF54F870087381E /* libmem.c in Sources */, ED60E8180DF54F870087381E /* libstr.c in Sources */, ED60E8190DF54F870087381E /* libutil.c in Sources */, ED60E81A0DF54F870087381E /* mgr.c in Sources */, ED60E81B0DF54F870087381E /* mgrcmdbuilder.c in Sources */, ED60E81C0DF54F870087381E /* mgrcmddispatcher.c in Sources */, ED60E81D0DF54F870087381E /* mgrinstancelist.c in Sources */, ED60E81E0DF54F870087381E /* mgrinstancemgr.c in Sources */, ED60E81F0DF54F870087381E /* mgrutil.c in Sources */, ED60E8200DF54F870087381E /* xltdec.c in Sources */, ED60E8210DF54F870087381E /* xltdecwbxml.c in Sources */, ED60E8220DF54F870087381E /* xltdecxml.c in Sources */, ED60E8230DF54F870087381E /* xltdevinf.c in Sources */, ED60E8240DF54F870087381E /* xltenc.c in Sources */, ED60E8250DF54F870087381E /* xltenccom.c in Sources */, ED60E8260DF54F870087381E /* xltencwbxml.c in Sources */, ED60E8270DF54F870087381E /* xltencxml.c in Sources */, ED60E8280DF54F870087381E /* xltmetinf.c in Sources */, ED60E8290DF54F870087381E /* xlttags.c in Sources */, ED60E82A0DF54F870087381E /* xltutilstack.c in Sources */, ED60E82B0DF54F870087381E /* binfilebase.cpp in Sources */, ED60E82C0DF54F870087381E /* binfileimplclient.cpp in Sources */, ED60E82D0DF54F870087381E /* binfileimplds.cpp in Sources */, ED60E82E0DF54F870087381E /* engineentry.cpp in Sources */, ED60E82F0DF54F870087381E /* engineinterface.cpp in Sources */, ED60E8300DF54F870087381E /* configelement.cpp in Sources */, ED60E8310DF54F870087381E /* customimplds.cpp in Sources */, ED60E8320DF54F870087381E /* customimplagent.cpp in Sources */, ED60E8330DF54F870087381E /* dataobjtype.cpp in Sources */, ED60E8340DF54F870087381E /* debuglogger.cpp in Sources */, ED60E8350DF54F870087381E /* iso8601.cpp in Sources */, ED60E8360DF54F870087381E /* itemfield.cpp in Sources */, ED60E8380DF54F870087381E /* localengineds.cpp in Sources */, ED60E8390DF54F870087381E /* mimediritemtype.cpp in Sources */, ED60E83A0DF54F870087381E /* multifielditem.cpp in Sources */, ED60E83B0DF54F870087381E /* multifielditemtype.cpp in Sources */, ED60E83C0DF54F870087381E /* remotedatastore.cpp in Sources */, ED60E83D0DF54F870087381E /* rrules.cpp in Sources */, ED60E83F0DF54F870087381E /* scriptcontext.cpp in Sources */, ED60E8400DF54F870087381E /* simpleitem.cpp in Sources */, ED60E8410DF54F870087381E /* stringutils.cpp in Sources */, ED60E8420DF54F870087381E /* superdatastore.cpp in Sources */, ED60E8430DF54F870087381E /* syncappbase.cpp in Sources */, ED60E8450DF54F870087381E /* syncclientbase.cpp in Sources */, ED60E8460DF54F870087381E /* synccommand.cpp in Sources */, ED60E8470DF54F870087381E /* syncdatastore.cpp in Sources */, ED60E8490DF54F870087381E /* syncitem.cpp in Sources */, ED60E84A0DF54F870087381E /* syncitemtype.cpp in Sources */, ED60E84B0DF54F870087381E /* syncsession.cpp in Sources */, ED60E84E0DF54F870087381E /* sysync_crc16.cpp in Sources */, ED60E8500DF54F870087381E /* stdlogicagent.cpp in Sources */, ED60E8510DF54F870087381E /* stdlogicds.cpp in Sources */, ED60E8530DF54F870087381E /* textitemtype.cpp in Sources */, ED60E8540DF54F870087381E /* textprofile.cpp in Sources */, ED60E8550DF54F870087381E /* timezones.cpp in Sources */, ED60E8560DF54F870087381E /* uiapi.cpp in Sources */, ED60E8570DF54F870087381E /* vcalendaritemtype.cpp in Sources */, ED60E8580DF54F870087381E /* vcarditemtype.cpp in Sources */, ED60E8590DF54F870087381E /* vtimezone.cpp in Sources */, ED60E85A0DF54F870087381E /* infback.c in Sources */, ED60E85B0DF54F870087381E /* gzio.c in Sources */, ED60E85C0DF54F870087381E /* deflate.c in Sources */, ED60E85D0DF54F870087381E /* uncompr.c in Sources */, ED60E85E0DF54F870087381E /* trees.c in Sources */, ED60E85F0DF54F870087381E /* inftrees.c in Sources */, ED60E8600DF54F870087381E /* inflate.c in Sources */, ED60E8610DF54F870087381E /* inffast.c in Sources */, ED60E8620DF54F870087381E /* zutil.c in Sources */, ED60E8630DF54F870087381E /* crc32.c in Sources */, ED60E8640DF54F870087381E /* compress.c in Sources */, ED60E8650DF54F870087381E /* adler32.c in Sources */, ED60E8660DF54F870087381E /* xmlparse.c in Sources */, ED60E8670DF54F870087381E /* xmltok.c in Sources */, ED60E8680DF54F870087381E /* xmlrole.c in Sources */, ED60E8690DF54F870087381E /* pcre_ord2utf8.c in Sources */, ED60E86A0DF54F870087381E /* pcre_chartables.c in Sources */, ED60E86B0DF54F870087381E /* pcre_compile.c in Sources */, ED60E86C0DF54F870087381E /* pcre_config.c in Sources */, ED60E86D0DF54F870087381E /* pcre_dfa_exec.c in Sources */, ED60E86E0DF54F870087381E /* pcre_exec.c in Sources */, ED60E86F0DF54F870087381E /* pcre_fullinfo.c in Sources */, ED60E8700DF54F870087381E /* pcre_get.c in Sources */, ED60E8710DF54F870087381E /* pcre_globals.c in Sources */, ED60E8720DF54F870087381E /* pcre_info.c in Sources */, ED60E8730DF54F870087381E /* pcre_newline.c in Sources */, ED60E8740DF54F870087381E /* pcre_refcount.c in Sources */, ED60E8750DF54F870087381E /* pcre_study.c in Sources */, ED60E8760DF54F870087381E /* pcre_tables.c in Sources */, ED60E8770DF54F870087381E /* pcre_try_flipped.c in Sources */, ED60E8780DF54F870087381E /* pcre_valid_utf8.c in Sources */, ED60E8790DF54F870087381E /* pcre_version.c in Sources */, ED60E87A0DF54F870087381E /* pcre_xclass.c in Sources */, ED43DAD70E014BC9000A1E5C /* configfiles.mm in Sources */, EDAC08260F179E78005E9AE2 /* mimedirprofile.cpp in Sources */, ED5B87FB0F8559C40042779A /* platform_timezones.mm in Sources */, EDE194C91074A04F00439216 /* syncagent.cpp in Sources */, ED4B5EB211523AAB00ECB4A5 /* sysync_utils.cpp in Sources */, ED4B5EB311523AAB00ECB4A5 /* syncexception.cpp in Sources */, ED4B5EB611523AAB00ECB4A5 /* lineartime.cpp in Sources */, ED4B5EB711523AAB00ECB4A5 /* san.cpp in Sources */, ED4B5EBA11523AAB00ECB4A5 /* sysync_md5.cpp in Sources */, ED4B5EBC11523AAB00ECB4A5 /* sysync_b64.cpp in Sources */, EDDAFD0611A0989D003E33D5 /* rawdataitemtype.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_MASTER_OBJECT_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 3.0; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "-mno-thumb"; SDKROOT = iphoneos; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_C_LANGUAGE_STANDARD = c99; GCC_THUMB_SUPPORT = NO; GENERATE_MASTER_OBJECT_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 3.0; OTHER_CFLAGS = "-mno-thumb"; SDKROOT = iphoneos; }; name = Release; }; ED556A3910768FAA0008C22F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/sysync_SDK/bin/iOS/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; GCC_THUMB_SUPPORT = NO; PRODUCT_NAME = sysync_combi_ios; SKIP_INSTALL = YES; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Targets/ReleasedProducts/combiEngine_opensource_ios"; }; name = Debug; }; ED556A3A10768FAA0008C22F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/sysync_SDK/bin/iOS/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_C_LANGUAGE_STANDARD = c99; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_THUMB_SUPPORT = NO; PRODUCT_NAME = sysync_combi_ios; SKIP_INSTALL = YES; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Targets/ReleasedProducts/combiEngine_opensource_ios"; ZERO_LINK = NO; }; name = Release; }; ED60E87D0DF54F870087381E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/sysync_SDK/bin/iOS/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREFIX_HEADER = prefix_file.h; GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; GCC_THUMB_SUPPORT = NO; PRODUCT_NAME = sysync_client_ios; SKIP_INSTALL = YES; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Targets/ReleasedProducts/clientEngine_opensource_ios"; }; name = Debug; }; ED60E87E0DF54F870087381E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CONFIGURATION_BUILD_DIR = "$(PROJECT_DIR)/sysync_SDK/bin/iOS/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_PREFIX_HEADER = prefix_file.h; GCC_THUMB_SUPPORT = NO; PRODUCT_NAME = sysync_client_ios; SKIP_INSTALL = YES; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/Targets/ReleasedProducts/clientEngine_opensource_ios"; ZERO_LINK = NO; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "sysync_ios" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ED556A3810768FAA0008C22F /* Build configuration list for PBXNativeTarget "static_combiEngine_opensource_ios" */ = { isa = XCConfigurationList; buildConfigurations = ( ED556A3910768FAA0008C22F /* Debug */, ED556A3A10768FAA0008C22F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; ED60E87C0DF54F870087381E /* Build configuration list for PBXNativeTarget "static_clientEngine_opensource_ios" */ = { isa = XCConfigurationList; buildConfigurations = ( ED60E87D0DF54F870087381E /* Debug */, ED60E87E0DF54F870087381E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/project.xcworkspace/0000755000373300037200000000000012424517753031511 5ustar00nightlyallusers00000000000000contents.xcworkspacedata0000644000373300037200000000021612424517753036373 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/project.xcworkspace syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/xcshareddata/0000755000373300037200000000000012424517753030146 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/xcshareddata/xcschemes/0000755000373300037200000000000012424517753032130 5ustar00nightlyallusers00000000000000static_clientEngine_opensource_ios.xcscheme0000644000373300037200000000402112424517753042656 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/xcshareddata/xcschemes static_combiEngine_opensource_ios.xcscheme0000644000373300037200000000401712424517753042476 0ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/sysync_ios.xcodeproj/xcshareddata/xcschemes syncevolution-1.5/src/synthesis/src/zlib/0000755000373300037200000000000012424517753022255 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/src/zlib/ChangeLog0000755000373300037200000010621612424517753024040 0ustar00nightlyallusers00000000000000 ChangeLog file for zlib Changes in 1.2.1 (17 November 2003) - Remove a tab in contrib/gzappend/gzappend.c - Update some interfaces in contrib for new zlib functions - Update zlib version number in some contrib entries - Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] - Support shared libraries on Hurd and KFreeBSD [Brown] - Fix error in NO_DIVIDE option of adler32.c Changes in 1.2.0.8 (4 November 2003) - Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas - Add experimental NO_DIVIDE #define in adler32.c - Possibly faster on some processors (let me know if it is) - Correct Z_BLOCK to not return on first inflate call if no wrap - Fix strm->data_type on inflate() return to correctly indicate EOB - Add deflatePrime() function for appending in the middle of a byte - Add contrib/gzappend for an example of appending to a stream - Update win32/DLL_FAQ.txt [Truta] - Delete Turbo C comment in README [Truta] - Improve some indentation in zconf.h [Truta] - Fix infinite loop on bad input in configure script [Church] - Fix gzeof() for concatenated gzip files [Johnson] - Add example to contrib/visual-basic.txt [Michael B.] - Add -p to mkdir's in Makefile.in [vda] - Fix configure to properly detect presence or lack of printf functions - Add AS400 support [Monnerat] - Add a little Cygwin support [Wilson] Changes in 1.2.0.7 (21 September 2003) - Correct some debug formats in contrib/infback9 - Cast a type in a debug statement in trees.c - Change search and replace delimiter in configure from % to # [Beebe] - Update contrib/untgz to 0.2 with various fixes [Truta] - Add build support for Amiga [Nikl] - Remove some directories in old that have been updated to 1.2 - Add dylib building for Mac OS X in configure and Makefile.in - Remove old distribution stuff from Makefile - Update README to point to DLL_FAQ.txt, and add comment on Mac OS X - Update links in README Changes in 1.2.0.6 (13 September 2003) - Minor FAQ updates - Update contrib/minizip to 1.00 [Vollant] - Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] - Update POSTINC comment for 68060 [Nikl] - Add contrib/infback9 with deflate64 decoding (unsupported) - For MVS define NO_vsnprintf and undefine FAR [van Burik] - Add pragma for fdopen on MVS [van Burik] Changes in 1.2.0.5 (8 September 2003) - Add OF to inflateBackEnd() declaration in zlib.h - Remember start when using gzdopen in the middle of a file - Use internal off_t counters in gz* functions to properly handle seeks - Perform more rigorous check for distance-too-far in inffast.c - Add Z_BLOCK flush option to return from inflate at block boundary - Set strm->data_type on return from inflate - Indicate bits unused, if at block boundary, and if in last block - Replace size_t with ptrdiff_t in crc32.c, and check for correct size - Add condition so old NO_DEFLATE define still works for compatibility - FAQ update regarding the Windows DLL [Truta] - INDEX update: add qnx entry, remove aix entry [Truta] - Install zlib.3 into mandir [Wilson] - Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] - Adapt the zlib interface to the new DLL convention guidelines [Truta] - Introduce ZLIB_WINAPI macro to allow the export of functions using the WINAPI calling convention, for Visual Basic [Vollant, Truta] - Update msdos and win32 scripts and makefiles [Truta] - Export symbols by name, not by ordinal, in win32/zlib.def [Truta] - Add contrib/ada [Anisimkov] - Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] - Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] - Add contrib/masm686 [Truta] - Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm [Truta, Vollant] - Update contrib/delphi; rename to contrib/pascal; add example [Truta] - Remove contrib/delphi2; add a new contrib/delphi [Truta] - Avoid inclusion of the nonstandard in contrib/iostream, and fix some method prototypes [Truta] - Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip [Truta] - Avoid the use of backslash (\) in contrib/minizip [Vollant] - Fix file time handling in contrib/untgz; update makefiles [Truta] - Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines [Vollant] - Remove contrib/vstudio/vc15_16 [Vollant] - Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] - Update README.contrib [Truta] - Invert the assignment order of match_head and s->prev[...] in INSERT_STRING [Truta] - Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings [Truta] - Compare function pointers with 0, not with NULL or Z_NULL [Truta] - Fix prototype of syncsearch in inflate.c [Truta] - Introduce ASMINF macro to be enabled when using an ASM implementation of inflate_fast [Truta] - Change NO_DEFLATE to NO_GZCOMPRESS [Truta] - Modify test_gzio in example.c to take a single file name as a parameter [Truta] - Exit the example.c program if gzopen fails [Truta] - Add type casts around strlen in example.c [Truta] - Remove casting to sizeof in minigzip.c; give a proper type to the variable compared with SUFFIX_LEN [Truta] - Update definitions of STDC and STDC99 in zconf.h [Truta] - Synchronize zconf.h with the new Windows DLL interface [Truta] - Use SYS16BIT instead of __32BIT__ to distinguish between 16- and 32-bit platforms [Truta] - Use far memory allocators in small 16-bit memory models for Turbo C [Truta] - Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in zlibCompileFlags [Truta] - Cygwin has vsnprintf [Wilson] - In Windows16, OS_CODE is 0, as in MSDOS [Truta] - In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] Changes in 1.2.0.4 (10 August 2003) - Minor FAQ updates - Be more strict when checking inflateInit2's windowBits parameter - Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well - Add gzip wrapper option to deflateInit2 using windowBits - Add updated QNX rule in configure and qnx directory [Bonnefoy] - Make inflate distance-too-far checks more rigorous - Clean up FAR usage in inflate - Add casting to sizeof() in gzio.c and minigzip.c Changes in 1.2.0.3 (19 July 2003) - Fix silly error in gzungetc() implementation [Vollant] - Update contrib/minizip and contrib/vstudio [Vollant] - Fix printf format in example.c - Correct cdecl support in zconf.in.h [Anisimkov] - Minor FAQ updates Changes in 1.2.0.2 (13 July 2003) - Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons - Attempt to avoid warnings in crc32.c for pointer-int conversion - Add AIX to configure, remove aix directory [Bakker] - Add some casts to minigzip.c - Improve checking after insecure sprintf() or vsprintf() calls - Remove #elif's from crc32.c - Change leave label to inf_leave in inflate.c and infback.c to avoid library conflicts - Remove inflate gzip decoding by default--only enable gzip decoding by special request for stricter backward compatibility - Add zlibCompileFlags() function to return compilation information - More typecasting in deflate.c to avoid warnings - Remove leading underscore from _Capital #defines [Truta] - Fix configure to link shared library when testing - Add some Windows CE target adjustments [Mai] - Remove #define ZLIB_DLL in zconf.h [Vollant] - Add zlib.3 [Rodgers] - Update RFC URL in deflate.c and algorithm.txt [Mai] - Add zlib_dll_FAQ.txt to contrib [Truta] - Add UL to some constants [Truta] - Update minizip and vstudio [Vollant] - Remove vestigial NEED_DUMMY_RETURN from zconf.in.h - Expand use of NO_DUMMY_DECL to avoid all dummy structures - Added iostream3 to contrib [Schwardt] - Replace rewind() with fseek() for WinCE [Truta] - Improve setting of zlib format compression level flags - Report 0 for huffman and rle strategies and for level == 0 or 1 - Report 2 only for level == 6 - Only deal with 64K limit when necessary at compile time [Truta] - Allow TOO_FAR check to be turned off at compile time [Truta] - Add gzclearerr() function [Souza] - Add gzungetc() function Changes in 1.2.0.1 (17 March 2003) - Add Z_RLE strategy for run-length encoding [Truta] - When Z_RLE requested, restrict matches to distance one - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE - Correct FASTEST compilation to allow level == 0 - Clean up what gets compiled for FASTEST - Incorporate changes to zconf.in.h [Vollant] - Refine detection of Turbo C need for dummy returns - Refine ZLIB_DLL compilation - Include additional header file on VMS for off_t typedef - Try to use _vsnprintf where it supplants vsprintf [Vollant] - Add some casts in inffast.c - Enchance comments in zlib.h on what happens if gzprintf() tries to write more than 4095 bytes before compression - Remove unused state from inflateBackEnd() - Remove exit(0) from minigzip.c, example.c - Get rid of all those darn tabs - Add "check" target to Makefile.in that does the same thing as "test" - Add "mostlyclean" and "maintainer-clean" targets to Makefile.in - Update contrib/inflate86 [Anderson] - Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] - Add msdos and win32 directories with makefiles [Truta] - More additions and improvements to the FAQ Changes in 1.2.0 (9 March 2003) - New and improved inflate code - About 20% faster - Does not allocate 32K window unless and until needed - Automatically detects and decompresses gzip streams - Raw inflate no longer needs an extra dummy byte at end - Added inflateBack functions using a callback interface--even faster than inflate, useful for file utilities (gzip, zip) - Added inflateCopy() function to record state for random access on externally generated deflate streams (e.g. in gzip files) - More readable code (I hope) - New and improved crc32() - About 50% faster, thanks to suggestions from Rodney Brown - Add deflateBound() and compressBound() functions - Fix memory leak in deflateInit2() - Permit setting dictionary for raw deflate (for parallel deflate) - Fix const declaration for gzwrite() - Check for some malloc() failures in gzio.c - Fix bug in gzopen() on single-byte file 0x1f - Fix bug in gzread() on concatenated file with 0x1f at end of buffer and next buffer doesn't start with 0x8b - Fix uncompress() to return Z_DATA_ERROR on truncated input - Free memory at end of example.c - Remove MAX #define in trees.c (conflicted with some libraries) - Fix static const's in deflate.c, gzio.c, and zutil.[ch] - Declare malloc() and free() in gzio.c if STDC not defined - Use malloc() instead of calloc() in zutil.c if int big enough - Define STDC for AIX - Add aix/ with approach for compiling shared library on AIX - Add HP-UX support for shared libraries in configure - Add OpenUNIX support for shared libraries in configure - Use $cc instead of gcc to build shared library - Make prefix directory if needed when installing - Correct Macintosh avoidance of typedef Byte in zconf.h - Correct Turbo C memory allocation when under Linux - Use libz.a instead of -lz in Makefile (assure use of compiled library) - Update configure to check for snprintf or vsnprintf functions and their return value, warn during make if using an insecure function - Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that is lost when library is used--resolution is to build new zconf.h - Documentation improvements (in zlib.h): - Document raw deflate and inflate - Update RFCs URL - Point out that zlib and gzip formats are different - Note that Z_BUF_ERROR is not fatal - Document string limit for gzprintf() and possible buffer overflow - Note requirement on avail_out when flushing - Note permitted values of flush parameter of inflate() - Add some FAQs (and even answers) to the FAQ - Add contrib/inflate86/ for x86 faster inflate - Add contrib/blast/ for PKWare Data Compression Library decompression - Add contrib/puff/ simple inflate for deflate format description Changes in 1.1.4 (11 March 2002) - ZFREE was repeated on same allocation on some error conditions. This creates a security problem described in http://www.zlib.org/advisory-2002-03-11.txt - Returned incorrect error (Z_MEM_ERROR) on some invalid data - Avoid accesses before window for invalid distances with inflate window less than 32K. - force windowBits > 8 to avoid a bug in the encoder for a window size of 256 bytes. (A complete fix will be available in 1.1.5). Changes in 1.1.3 (9 July 1998) - fix "an inflate input buffer bug that shows up on rare but persistent occasions" (Mark) - fix gzread and gztell for concatenated .gz files (Didier Le Botlan) - fix gzseek(..., SEEK_SET) in write mode - fix crc check after a gzeek (Frank Faubert) - fix miniunzip when the last entry in a zip file is itself a zip file (J Lillge) - add contrib/asm586 and contrib/asm686 (Brian Raiter) See http://www.muppetlabs.com/~breadbox/software/assembly.html - add support for Delphi 3 in contrib/delphi (Bob Dellaca) - add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) - do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) - use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) - added a FAQ file - Support gzdopen on Mac with Metrowerks (Jason Linhart) - Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) - define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) - avoid some warnings with Borland C (Tom Tanner) - fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) - emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) - allow several arguments to configure (Tim Mooney, Frodo Looijaard) - use libdir and includedir in Makefile.in (Tim Mooney) - support shared libraries on OSF1 V4 (Tim Mooney) - remove so_locations in "make clean" (Tim Mooney) - fix maketree.c compilation error (Glenn, Mark) - Python interface to zlib now in Python 1.5 (Jeremy Hylton) - new Makefile.riscos (Rich Walker) - initialize static descriptors in trees.c for embedded targets (Nick Smith) - use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) - add the OS/2 files in Makefile.in too (Andrew Zabolotny) - fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) - fix maketree.c to allow clean compilation of inffixed.h (Mark) - fix parameter check in deflateCopy (Gunther Nikl) - cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) - Many portability patches by Christian Spieler: . zutil.c, zutil.h: added "const" for zmem* . Make_vms.com: fixed some typos . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists . msdos/Makefile.msc: remove "default rtl link library" info from obj files . msdos/Makefile.*: use model-dependent name for the built zlib library . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) - use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) - replace __far with _far for better portability (Christian Spieler, Tom Lane) - fix test for errno.h in configure (Tim Newsham) Changes in 1.1.2 (19 March 98) - added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) See http://www.winimage.com/zLibDll/unzip.html - preinitialize the inflate tables for fixed codes, to make the code completely thread safe (Mark) - some simplifications and slight speed-up to the inflate code (Mark) - fix gzeof on non-compressed files (Allan Schrum) - add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) - use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) - added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) - add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) - do not wrap extern "C" around system includes (Tom Lane) - mention zlib binding for TCL in README (Andreas Kupries) - added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) - allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) - allow "configure --prefix $HOME" (Tim Mooney) - remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) - move Makefile.sas to amiga/Makefile.sas Changes in 1.1.1 (27 Feb 98) - fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) - remove block truncation heuristic which had very marginal effect for zlib (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the compression ratio on some files. This also allows inlining _tr_tally for matches in deflate_slow. - added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) Changes in 1.1.0 (24 Feb 98) - do not return STREAM_END prematurely in inflate (John Bowler) - revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) - compile with -DFASTEST to get compression code optimized for speed only - in minigzip, try mmap'ing the input file first (Miguel Albrecht) - increase size of I/O buffers in minigzip.c and gzio.c (not a big gain on Sun but significant on HP) - add a pointer to experimental unzip library in README (Gilles Vollant) - initialize variable gcc in configure (Chris Herborth) Changes in 1.0.9 (17 Feb 1998) - added gzputs and gzgets functions - do not clear eof flag in gzseek (Mark Diekhans) - fix gzseek for files in transparent mode (Mark Diekhans) - do not assume that vsprintf returns the number of bytes written (Jens Krinke) - replace EXPORT with ZEXPORT to avoid conflict with other programs - added compress2 in zconf.h, zlib.def, zlib.dnt - new asm code from Gilles Vollant in contrib/asm386 - simplify the inflate code (Mark): . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() . ZALLOC the length list in inflate_trees_fixed() instead of using stack . ZALLOC the value area for huft_build() instead of using stack . Simplify Z_FINISH check in inflate() - Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 - in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) - in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with the declaration of FAR (Gilles VOllant) - install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) - read_buf buf parameter of type Bytef* instead of charf* - zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) - do not redeclare unlink in minigzip.c for WIN32 (John Bowler) - fix check for presence of directories in "make install" (Ian Willis) Changes in 1.0.8 (27 Jan 1998) - fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) - fix gzgetc and gzputc for big endian systems (Markus Oberhumer) - added compress2() to allow setting the compression level - include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) - use constant arrays for the static trees in trees.c instead of computing them at run time (thanks to Ken Raeburn for this suggestion). To create trees.h, compile with GEN_TREES_H and run "make test". - check return code of example in "make test" and display result - pass minigzip command line options to file_compress - simplifying code of inflateSync to avoid gcc 2.8 bug - support CC="gcc -Wall" in configure -s (QingLong) - avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) - fix test for shared library support to avoid compiler warnings - zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) - check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) - do not use fdopen for Metrowerks on Mac (Brad Pettit)) - add checks for gzputc and gzputc in example.c - avoid warnings in gzio.c and deflate.c (Andreas Kleinert) - use const for the CRC table (Ken Raeburn) - fixed "make uninstall" for shared libraries - use Tracev instead of Trace in infblock.c - in example.c use correct compressed length for test_sync - suppress +vnocompatwarnings in configure for HPUX (not always supported) Changes in 1.0.7 (20 Jan 1998) - fix gzseek which was broken in write mode - return error for gzseek to negative absolute position - fix configure for Linux (Chun-Chung Chen) - increase stack space for MSC (Tim Wegner) - get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) - define EXPORTVA for gzprintf (Gilles Vollant) - added man page zlib.3 (Rick Rodgers) - for contrib/untgz, fix makedir() and improve Makefile - check gzseek in write mode in example.c - allocate extra buffer for seeks only if gzseek is actually called - avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) - add inflateSyncPoint in zconf.h - fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def Changes in 1.0.6 (19 Jan 1998) - add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) - Fix a deflate bug occuring only with compression level 0 (thanks to Andy Buckler for finding this one). - In minigzip, pass transparently also the first byte for .Z files. - return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() - check Z_FINISH in inflate (thanks to Marc Schluper) - Implement deflateCopy (thanks to Adam Costello) - make static libraries by default in configure, add --shared option. - move MSDOS or Windows specific files to directory msdos - suppress the notion of partial flush to simplify the interface (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) - suppress history buffer provided by application to simplify the interface (this feature was not implemented anyway in 1.0.4) - next_in and avail_in must be initialized before calling inflateInit or inflateInit2 - add EXPORT in all exported functions (for Windows DLL) - added Makefile.nt (thanks to Stephen Williams) - added the unsupported "contrib" directory: contrib/asm386/ by Gilles Vollant 386 asm code replacing longest_match(). contrib/iostream/ by Kevin Ruland A C++ I/O streams interface to the zlib gz* functions contrib/iostream2/ by Tyge Løvset Another C++ I/O streams interface contrib/untgz/ by "Pedro A. Aranda Guti\irrez" A very simple tar.gz file extractor using zlib contrib/visual-basic.txt by Carlos Rios How to use compress(), uncompress() and the gz* functions from VB. - pass params -f (filtered data), -h (huffman only), -1 to -9 (compression level) in minigzip (thanks to Tom Lane) - use const for rommable constants in deflate - added test for gzseek and gztell in example.c - add undocumented function inflateSyncPoint() (hack for Paul Mackerras) - add undocumented function zError to convert error code to string (for Tim Smithers) - Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. - Use default memcpy for Symantec MSDOS compiler. - Add EXPORT keyword for check_func (needed for Windows DLL) - add current directory to LD_LIBRARY_PATH for "make test" - create also a link for libz.so.1 - added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) - use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) - added -soname for Linux in configure (Chun-Chung Chen, - assign numbers to the exported functions in zlib.def (for Windows DLL) - add advice in zlib.h for best usage of deflateSetDictionary - work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) - allow compilation with ANSI keywords only enabled for TurboC in large model - avoid "versionString"[0] (Borland bug) - add NEED_DUMMY_RETURN for Borland - use variable z_verbose for tracing in debug mode (L. Peter Deutsch). - allow compilation with CC - defined STDC for OS/2 (David Charlap) - limit external names to 8 chars for MVS (Thomas Lund) - in minigzip.c, use static buffers only for 16-bit systems - fix suffix check for "minigzip -d foo.gz" - do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) - use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) - added makelcc.bat for lcc-win32 (Tom St Denis) - in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) - Avoid expanded $ Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. - check for unistd.h in configure (for off_t) - remove useless check parameter in inflate_blocks_free - avoid useless assignment of s->check to itself in inflate_blocks_new - do not flush twice in gzclose (thanks to Ken Raeburn) - rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h - use NO_ERRNO_H instead of enumeration of operating systems with errno.h - work around buggy fclose on pipes for HP/UX - support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) - fix configure if CC is already equal to gcc Changes in 1.0.5 (3 Jan 98) - Fix inflate to terminate gracefully when fed corrupted or invalid data - Use const for rommable constants in inflate - Eliminate memory leaks on error conditions in inflate - Removed some vestigial code in inflate - Update web address in README Changes in 1.0.4 (24 Jul 96) - In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF bit, so the decompressor could decompress all the correct data but went on to attempt decompressing extra garbage data. This affected minigzip too. - zlibVersion and gzerror return const char* (needed for DLL) - port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) - use z_error only for DEBUG (avoid problem with DLLs) Changes in 1.0.3 (2 Jul 96) - use z_streamp instead of z_stream *, which is now a far pointer in MSDOS small and medium models; this makes the library incompatible with previous versions for these models. (No effect in large model or on other systems.) - return OK instead of BUF_ERROR if previous deflate call returned with avail_out as zero but there is nothing to do - added memcmp for non STDC compilers - define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) - define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) - better check for 16-bit mode MSC (avoids problem with Symantec) Changes in 1.0.2 (23 May 96) - added Windows DLL support - added a function zlibVersion (for the DLL support) - fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) - Bytef is define's instead of typedef'd only for Borland C - avoid reading uninitialized memory in example.c - mention in README that the zlib format is now RFC1950 - updated Makefile.dj2 - added algorithm.doc Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] - fix array overlay in deflate.c which sometimes caused bad compressed data - fix inflate bug with empty stored block - fix MSDOS medium model which was broken in 0.99 - fix deflateParams() which could generated bad compressed data. - Bytef is define'd instead of typedef'ed (work around Borland bug) - added an INDEX file - new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) - speed up adler32 for modern machines without auto-increment - added -ansi for IRIX in configure - static_init_done in trees.c is an int - define unlink as delete for VMS - fix configure for QNX - add configure branch for SCO and HPUX - avoid many warnings (unused variables, dead assignments, etc...) - no fdopen for BeOS - fix the Watcom fix for 32 bit mode (define FAR as empty) - removed redefinition of Byte for MKWERKS - work around an MWKERKS bug (incorrect merge of all .h files) Changes in 0.99 (27 Jan 96) - allow preset dictionary shared between compressor and decompressor - allow compression level 0 (no compression) - add deflateParams in zlib.h: allow dynamic change of compression level and compression strategy. - test large buffers and deflateParams in example.c - add optional "configure" to build zlib as a shared library - suppress Makefile.qnx, use configure instead - fixed deflate for 64-bit systems (detected on Cray) - fixed inflate_blocks for 64-bit systems (detected on Alpha) - declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) - always return Z_BUF_ERROR when deflate() has nothing to do - deflateInit and inflateInit are now macros to allow version checking - prefix all global functions and types with z_ with -DZ_PREFIX - make falloc completely reentrant (inftrees.c) - fixed very unlikely race condition in ct_static_init - free in reverse order of allocation to help memory manager - use zlib-1.0/* instead of zlib/* inside the tar.gz - make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion -Wstrict-prototypes -Wmissing-prototypes" - allow gzread on concatenated .gz files - deflateEnd now returns Z_DATA_ERROR if it was premature - deflate is finally (?) fully deterministic (no matches beyond end of input) - Document Z_SYNC_FLUSH - add uninstall in Makefile - Check for __cpluplus in zlib.h - Better test in ct_align for partial flush - avoid harmless warnings for Borland C++ - initialize hash_head in deflate.c - avoid warning on fdopen (gzio.c) for HP cc -Aa - include stdlib.h for STDC compilers - include errno.h for Cray - ignore error if ranlib doesn't exist - call ranlib twice for NeXTSTEP - use exec_prefix instead of prefix for libz.a - renamed ct_* as _tr_* to avoid conflict with applications - clear z->msg in inflateInit2 before any error return - initialize opaque in example.c, gzio.c, deflate.c and inflate.c - fixed typo in zconf.h (_GNUC__ => __GNUC__) - check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) - fix typo in Make_vms.com (f$trnlnm -> f$getsyi) - in fcalloc, normalize pointer if size > 65520 bytes - don't use special fcalloc for 32 bit Borland C++ - use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... - use Z_BINARY instead of BINARY - document that gzclose after gzdopen will close the file - allow "a" as mode in gzopen. - fix error checking in gzread - allow skipping .gz extra-field on pipes - added reference to Perl interface in README - put the crc table in FAR data (I dislike more and more the medium model :) - added get_crc_table - added a dimension to all arrays (Borland C can't count). - workaround Borland C bug in declaration of inflate_codes_new & inflate_fast - guard against multiple inclusion of *.h (for precompiled header on Mac) - Watcom C pretends to be Microsoft C small model even in 32 bit mode. - don't use unsized arrays to avoid silly warnings by Visual C++: warning C4746: 'inflate_mask' : unsized array treated as '__far' (what's wrong with far data in far model?). - define enum out of inflate_blocks_state to allow compilation with C++ Changes in 0.95 (16 Aug 95) - fix MSDOS small and medium model (now easier to adapt to any compiler) - inlined send_bits - fix the final (:-) bug for deflate with flush (output was correct but not completely flushed in rare occasions). - default window size is same for compression and decompression (it's now sufficient to set MAX_WBITS in zconf.h). - voidp -> voidpf and voidnp -> voidp (for consistency with other typedefs and because voidnp was not near in large model). Changes in 0.94 (13 Aug 95) - support MSDOS medium model - fix deflate with flush (could sometimes generate bad output) - fix deflateReset (zlib header was incorrectly suppressed) - added support for VMS - allow a compression level in gzopen() - gzflush now calls fflush - For deflate with flush, flush even if no more input is provided. - rename libgz.a as libz.a - avoid complex expression in infcodes.c triggering Turbo C bug - work around a problem with gcc on Alpha (in INSERT_STRING) - don't use inline functions (problem with some gcc versions) - allow renaming of Byte, uInt, etc... with #define. - avoid warning about (unused) pointer before start of array in deflate.c - avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c - avoid reserved word 'new' in trees.c Changes in 0.93 (25 June 95) - temporarily disable inline functions - make deflate deterministic - give enough lookahead for PARTIAL_FLUSH - Set binary mode for stdin/stdout in minigzip.c for OS/2 - don't even use signed char in inflate (not portable enough) - fix inflate memory leak for segmented architectures Changes in 0.92 (3 May 95) - don't assume that char is signed (problem on SGI) - Clear bit buffer when starting a stored block - no memcpy on Pyramid - suppressed inftest.c - optimized fill_window, put longest_match inline for gcc - optimized inflate on stored blocks. - untabify all sources to simplify patches Changes in 0.91 (2 May 95) - Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h - Document the memory requirements in zconf.h - added "make install" - fix sync search logic in inflateSync - deflate(Z_FULL_FLUSH) now works even if output buffer too short - after inflateSync, don't scare people with just "lo world" - added support for DJGPP Changes in 0.9 (1 May 95) - don't assume that zalloc clears the allocated memory (the TurboC bug was Mark's bug after all :) - let again gzread copy uncompressed data unchanged (was working in 0.71) - deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented - added a test of inflateSync in example.c - moved MAX_WBITS to zconf.h because users might want to change that. - document explicitly that zalloc(64K) on MSDOS must return a normalized pointer (zero offset) - added Makefiles for Microsoft C, Turbo C, Borland C++ - faster crc32() Changes in 0.8 (29 April 95) - added fast inflate (inffast.c) - deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this is incompatible with previous versions of zlib which returned Z_OK. - work around a TurboC compiler bug (bad code for b << 0, see infutil.h) (actually that was not a compiler bug, see 0.81 above) - gzread no longer reads one extra byte in certain cases - In gzio destroy(), don't reference a freed structure - avoid many warnings for MSDOS - avoid the ERROR symbol which is used by MS Windows Changes in 0.71 (14 April 95) - Fixed more MSDOS compilation problems :( There is still a bug with TurboC large model. Changes in 0.7 (14 April 95) - Added full inflate support. - Simplified the crc32() interface. The pre- and post-conditioning (one's complement) is now done inside crc32(). WARNING: this is incompatible with previous versions; see zlib.h for the new usage. Changes in 0.61 (12 April 95) - workaround for a bug in TurboC. example and minigzip now work on MSDOS. Changes in 0.6 (11 April 95) - added minigzip.c - added gzdopen to reopen a file descriptor as gzFile - added transparent reading of non-gziped files in gzread. - fixed bug in gzread (don't read crc as data) - fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). - don't allocate big arrays in the stack (for MSDOS) - fix some MSDOS compilation problems Changes in 0.5: - do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but not yet Z_FULL_FLUSH. - support decompression but only in a single step (forced Z_FINISH) - added opaque object for zalloc and zfree. - added deflateReset and inflateReset - added a variable zlib_version for consistency checking. - renamed the 'filter' parameter of deflateInit2 as 'strategy'. Added Z_FILTERED and Z_HUFFMAN_ONLY constants. Changes in 0.4: - avoid "zip" everywhere, use zlib instead of ziplib. - suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush if compression method == 8. - added adler32 and crc32 - renamed deflateOptions as deflateInit2, call one or the other but not both - added the method parameter for deflateInit2. - added inflateInit2 - simplied considerably deflateInit and inflateInit by not supporting user-provided history buffer. This is supported only in deflateInit2 and inflateInit2. Changes in 0.3: - prefix all macro names with Z_ - use Z_FINISH instead of deflateEnd to finish compression. - added Z_HUFFMAN_ONLY - added gzerror() syncevolution-1.5/src/synthesis/src/zlib/FAQ0000755000373300037200000003347612424517753022627 0ustar00nightlyallusers00000000000000 Frequently Asked Questions about zlib If your question is not there, please check the zlib home page http://www.zlib.org which may have more recent information. The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html 1. Is zlib Y2K-compliant? Yes. zlib doesn't handle dates. 2. Where can I get a Windows DLL version? The zlib sources can be compiled without change to produce a DLL. See the file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the precompiled DLL are found in the zlib web site at http://www.zlib.org. 3. Where can I get a Visual Basic interface to zlib? See * http://www.winimage.com/zLibDll/ * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm * contrib/visual-basic.txt in the zlib distribution 4. compress() returns Z_BUF_ERROR Make sure that before the call of compress, the length of the compressed buffer is equal to the total size of the compressed buffer and not zero. For Visual Basic, check that this parameter is passed by reference ("as any"), not by value ("as long"). 5. deflate() or inflate() returns Z_BUF_ERROR Before making the call, make sure that avail_in and avail_out are not zero. When setting the parameter flush equal to Z_FINISH, also make sure that avail_out is big enough to allow processing all pending input. Note that a Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be made with more input or output space. A Z_BUF_ERROR may in fact be unavoidable depending on how the functions are used, since it is not possible to tell whether or not there is more output pending when strm.avail_out returns with zero. 6. Where's the zlib documentation (man pages, etc.)? It's in zlib.h for the moment, and Francis S. Lin has converted it to a web page zlib.html. Volunteers to transform this to Unix-style man pages, please contact Jean-loup Gailly (jloup@gzip.org). Examples of zlib usage are in the files example.c and minigzip.c. 7. Why don't you use GNU autoconf or libtool or ...? Because we would like to keep zlib as a very small and simple package. zlib is rather portable and doesn't need much configuration. 8. I found a bug in zlib. Most of the time, such problems are due to an incorrect usage of zlib. Please try to reproduce the problem with a small program and send the corresponding source to us at zlib@gzip.org . Do not send multi-megabyte data files without prior agreement. 9. Why do I get "undefined reference to gzputc"? If "make test" produces something like example.o(.text+0x154): undefined reference to `gzputc' check that you don't have old files libz.* in /usr/lib, /usr/local/lib or /usr/X11R6/lib. Remove any old versions, then do "make install". 10. I need a Delphi interface to zlib. See the contrib/delphi directory in the zlib distribution. 11. Can zlib handle .zip archives? See the directory contrib/minizip in the zlib distribution. 12. Can zlib handle .Z files? No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt the code of uncompress on your own. 13. How can I make a Unix shared library? make clean ./configure -s make 14. How do I install a shared zlib library on Unix? make install However, many flavors of Unix come with a shared zlib already installed. Before going to the trouble of compiling a shared version of zlib and trying to install it, you may want to check if it's already there! If you can #include , it's there. The -lz option will probably link to it. 15. I have a question about OttoPDF We are not the authors of OttoPDF. The real author is on the OttoPDF web site Joel Hainley jhainley@myndkryme.com. 16. Why does gzip give an error on a file I make with compress/deflate? The compress and deflate functions produce data in the zlib format, which is different and incompatible with the gzip format. The gz* functions in zlib on the other hand use the gzip format. Both the zlib and gzip formats use the same compressed data format internally, but have different headers and trailers around the compressed data. 17. Ok, so why are there two different formats? The gzip format was designed to retain the directory information about a single file, such as the name and last modification date. The zlib format on the other hand was designed for in-memory and communication channel applications, and has a much more compact header and trailer and uses a faster integrity check than gzip. 18. Well that's nice, but how do I make a gzip file in memory? You can request that deflate write the gzip format instead of the zlib format using deflateInit2(). You can also request that inflate decode the gzip format using inflateInit2(). Read zlib.h for more details. Note that you cannot specify special gzip header contents (e.g. a file name or modification date), nor will inflate tell you what was in the gzip header. If you need to customize the header or see what's in it, you can use the raw deflate and inflate operations and the crc32() function and roll your own gzip encoding and decoding. Read the gzip RFC 1952 for details of the header and trailer format. 19. Is zlib thread-safe? Yes. However any library routines that zlib uses and any application- provided memory allocation routines must also be thread-safe. zlib's gz* functions use stdio library routines, and most of zlib's functions use the library memory allocation routines by default. zlib's Init functions allow for the application to provide custom memory allocation routines. Of course, you should only operate on any given zlib or gzip stream from a single thread at a time. 20. Can I use zlib in my commercial application? Yes. Please read the license in zlib.h. 21. Is zlib under the GNU license? No. Please read the license in zlib.h. 22. The license says that altered source versions must be "plainly marked". So what exactly do I need to do to meet that requirement? You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In particular, the final version number needs to be changed to "f", and an identification string should be appended to ZLIB_VERSION. Version numbers x.x.x.f are reserved for modifications to zlib by others than the zlib maintainers. For example, if the version of the base zlib you are altering is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also update the version strings in deflate.c and inftrees.c. For altered source distributions, you should also note the origin and nature of the changes in zlib.h, as well as in ChangeLog and README, along with the dates of the alterations. The origin should include at least your name (or your company's name), and an email address to contact for help or issues with the library. Note that distributing a compiled zlib library along with zlib.h and zconf.h is also a source distribution, and so you should change ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes in zlib.h as you would for a full source distribution. 23. Will zlib work on a big-endian or little-endian architecture, and can I exchange compressed data between them? Yes and yes. 24. Will zlib work on a 64-bit machine? It should. It has been tested on 64-bit machines, and has no dependence on any data types being limited to 32-bits in length. If you have any difficulties, please provide a complete problem report to zlib@gzip.org 25. Will zlib decompress data from the PKWare Data Compression Library? No. The PKWare DCL uses a completely different compressed data format than does PKZIP and zlib. However, you can look in zlib's contrib/blast directory for a possible solution to your problem. 26. Can I access data randomly in a compressed stream? No, not without some preparation. If when compressing you periodically use Z_FULL_FLUSH, carefully write all the pending data at those points, and keep an index of those locations, then you can start decompression at those points. You have to be careful to not use Z_FULL_FLUSH too often, since it can significantly degrade compression. 27. Does zlib work on MVS, OS/390, CICS, etc.? We don't know for sure. We have heard occasional reports of success on these systems. If you do use it on one of these, please provide us with a report, instructions, and patches that we can reference when we get these questions. Thanks. 28. Is there some simpler, easier to read version of inflate I can look at to understand the deflate format? First off, you should read RFC 1951. Second, yes. Look in zlib's contrib/puff directory. 29. Does zlib infringe on any patents? As far as we know, no. In fact, that was originally the whole point behind zlib. Look here for some more information: http://www.gzip.org/#faq11 30. Can zlib work with greater than 4 GB of data? Yes. inflate() and deflate() will process any amount of data correctly. Each call of inflate() or deflate() is limited to input and output chunks of the maximum value that can be stored in the compiler's "unsigned int" type, but there is no limit to the number of chunks. Note however that the strm.total_in and strm_total_out counters may be limited to 4 GB. These counters are provided as a convenience and are not used internally by inflate() or deflate(). The application can easily set up its own counters updated after each call of inflate() or deflate() to count beyond 4 GB. compress() and uncompress() may be limited to 4 GB, since they operate in a single call. gzseek() and gztell() may be limited to 4 GB depending on how zlib is compiled. See the zlibCompileFlags() function in zlib.h. The word "may" appears several times above since there is a 4 GB limit only if the compiler's "long" type is 32 bits. If the compiler's "long" type is 64 bits, then the limit is 16 exabytes. 31. Does zlib have any security vulnerabilities? The only one that we are aware of is potentially in gzprintf(). If zlib is compiled to use sprintf() or vsprintf(), then there is no protection against a buffer overflow of a 4K string space, other than the caller of gzprintf() assuring that the output will not exceed 4K. On the other hand, if zlib is compiled to use snprintf() or vsnprintf(), which should normally be the case, then there is no vulnerability. The ./configure script will display warnings if an insecure variation of sprintf() will be used by gzprintf(). Also the zlibCompileFlags() function will return information on what variant of sprintf() is used by gzprintf(). If you don't have snprintf() or vsnprintf() and would like one, you can find a portable implementation here: http://www.ijs.si/software/snprintf/ Note that you should be using the most recent version of zlib. Versions 1.1.3 and before were subject to a double-free vulnerability. 32. Is there a Java version of zlib? Probably what you want is to use zlib in Java. zlib is already included as part of the Java SDK in the java.util.zip package. If you really want a version of zlib written in the Java language, look on the zlib home page for links: http://www.zlib.org/ 33. I get this or that compiler or source-code scanner warning when I crank it up to maximally-pendantic. Can't you guys write proper code? Many years ago, we gave up attempting to avoid warnings on every compiler in the universe. It just got to be a waste of time, and some compilers were downright silly. So now, we simply make sure that the code always works. 34. Will zlib read the (insert any ancient or arcane format here) compressed data format? Probably not. Look in the comp.compression FAQ for pointers to various formats and associated software. 35. How can I encrypt/decrypt zip files with zlib? zlib doesn't support encryption. The original PKZIP encryption is very weak and can be broken with freely available programs. To get strong encryption, use gpg ( http://www.gnupg.org/ ) which already includes zlib compression. For PKZIP compatible "encryption", look at http://www.info-zip.org/ 36. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? "gzip" is the gzip format, and "deflate" is the zlib format. They should probably have called the second one "zlib" instead to avoid confusion with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 correctly points to the zlib specification in RFC 1950 for the "deflate" transfer encoding, there have been reports of servers and browsers that incorrectly produce or expect raw deflate data per the deflate specficiation in RFC 1951, most notably Microsoft. So even though the "deflate" transfer encoding using the zlib format would be the more efficient approach (and in fact exactly what the zlib format was designed for), using the "gzip" transfer encoding is probably more reliable due to an unfortunate choice of name on the part of the HTTP 1.1 authors. Bottom line: use the gzip format for HTTP 1.1 encoding. 37. Does zlib support the new "Deflate64" format introduced by PKWare? No. PKWare has apparently decided to keep that format proprietary, since they have not documented it as they have previous compression formats. In any case, the compression improvements are so modest compared to other more modern approaches, that it's not worth the effort to implement. 38. Can you please sign these lengthy legal documents and fax them back to us so that we can use your software in our product? No. Go away. Shoo. syncevolution-1.5/src/synthesis/src/zlib/INDEX0000755000373300037200000000221212424517753023047 0ustar00nightlyallusers00000000000000ChangeLog history of changes FAQ Frequently Asked Questions about zlib INDEX this file Makefile makefile for Unix (generated by configure) Makefile.in makefile for Unix (template for configure) README guess what algorithm.txt description of the (de)compression algorithm configure configure script for Unix zconf.in.h template for zconf.h (used by configure) msdos/ makefiles for MSDOS old/ makefiles for various architectures and zlib documentation files that have not yet been updated for zlib 1.2.x qnx/ makefiles for QNX win32/ makefiles for Windows zlib public header files (must be kept): zconf.h zlib.h private source files used to build the zlib library: adler32.c compress.c crc32.c crc32.h deflate.c deflate.h gzio.c infback.c inffast.c inffast.h inffixed.h inflate.c inflate.h inftrees.c inftrees.h trees.c trees.h uncompr.c zutil.c zutil.h source files for sample programs: example.c minigzip.c unsupported contribution by third parties See contrib/README.contrib syncevolution-1.5/src/synthesis/src/zlib/README0000755000373300037200000001312212424517753023137 0ustar00nightlyallusers00000000000000ZLIB DATA COMPRESSION LIBRARY zlib 1.2.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). These documents are also available in other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html All functions of the compression library are documented in the file zlib.h (volunteer to write man pages welcome, contact zlib@gzip.org). A usage example of the library is given in the file example.c which also tests that the library is working correctly. Another example is given in the file minigzip.c. The compression library itself is composed of all source files except example.c and minigzip.c. To compile all files and run the test program, follow the instructions given at the top of Makefile. In short "make test; make install" should work for most machines. For Unix: "./configure; make test; make install" For MSDOS, use one of the special makefiles such as Makefile.msc. For VMS, use Make_vms.com or descrip.mms. Questions about zlib should be sent to , or to Gilles Vollant for the Windows DLL version. The zlib home page is http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available in http://dogma.net/markn/articles/zlibtool/zlibtool.htm The changes made in version 1.2.1 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory "contrib". A Java implementation of zlib is available in the Java Development Kit http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html See the zlib home page http://www.zlib.org for details. A Perl interface to zlib written by Paul Marquess is in the CPAN (Comprehensive Perl Archive Network) sites http://www.cpan.org/modules/by-module/Compress/ A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see http://www.python.org/doc/lib/module-zlib.html A zlib binding for TCL written by Andreas Kupries is availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html An experimental package to read and write files in .zip format, written on top of zlib by Gilles Vollant , is available in the contrib/minizip directory of zlib. Notes for some targets: - For Windows DLL versions, please see win32/DLL_FAQ.txt - For 64-bit Irix, deflate.c must be compiled without any optimization. With -O, one libpng test fails. The test works in 32 bit mode (with the -n32 compiler flag). The compiler bug has been reported to SGI. - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. - On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with other compilers. Use "make test" to check your compiler. - gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - For PalmOs, see http://palmzlib.sourceforge.net/ - When building a shared, i.e. dynamic library on Mac OS X, the library must be installed before testing (do "make install" before "make test"), since the library location is specified in the library. Acknowledgments: The deflate format used by zlib was defined by Phil Katz. The deflate and zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in zlib; they are too numerous to cite here. Copyright notice: (C) 1995-2003 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup Gailly and Mark Adler; it does not include third-party code. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read the FAQ for more information on the distribution of modified source versions. syncevolution-1.5/src/synthesis/src/zlib/adler32.c0000755000373300037200000000435512424517753023667 0ustar00nightlyallusers00000000000000/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id: adler32.c,v 1.1 2004/10/12 16:03:51 luz Exp $ */ #define ZLIB_INTERNAL #include "zlib.h" #define BASE 65521UL /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {s1 += buf[i]; s2 += s1;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); #ifdef NO_DIVIDE # define MOD(a) \ do { \ if (a >= (BASE << 16)) a -= (BASE << 16); \ if (a >= (BASE << 15)) a -= (BASE << 15); \ if (a >= (BASE << 14)) a -= (BASE << 14); \ if (a >= (BASE << 13)) a -= (BASE << 13); \ if (a >= (BASE << 12)) a -= (BASE << 12); \ if (a >= (BASE << 11)) a -= (BASE << 11); \ if (a >= (BASE << 10)) a -= (BASE << 10); \ if (a >= (BASE << 9)) a -= (BASE << 9); \ if (a >= (BASE << 8)) a -= (BASE << 8); \ if (a >= (BASE << 7)) a -= (BASE << 7); \ if (a >= (BASE << 6)) a -= (BASE << 6); \ if (a >= (BASE << 5)) a -= (BASE << 5); \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long s1 = adler & 0xffff; unsigned long s2 = (adler >> 16) & 0xffff; int k; if (buf == Z_NULL) return 1L; while (len > 0) { k = len < NMAX ? (int)len : NMAX; len -= k; while (k >= 16) { DO16(buf); buf += 16; k -= 16; } if (k != 0) do { s1 += *buf++; s2 += s1; } while (--k); MOD(s1); MOD(s2); } return (s2 << 16) | s1; } syncevolution-1.5/src/synthesis/src/zlib/algorithm.txt0000755000373300037200000002217012424517753025011 0ustar00nightlyallusers000000000000001. Compression algorithm (deflate) The deflation algorithm used by gzip (also zip and zlib) is a variation of LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in the input data. The second occurrence of a string is replaced by a pointer to the previous string, in the form of a pair (distance, length). Distances are limited to 32K bytes, and lengths are limited to 258 bytes. When a string does not occur anywhere in the previous 32K bytes, it is emitted as a sequence of literal bytes. (In this description, `string' must be taken as an arbitrary sequence of bytes, and is not restricted to printable characters.) Literals or match lengths are compressed with one Huffman tree, and match distances are compressed with another tree. The trees are stored in a compact form at the start of each block. The blocks can have any size (except that the compressed data for one block must fit in available memory). A block is terminated when deflate() determines that it would be useful to start another block with fresh trees. (This is somewhat similar to the behavior of LZW-based _compress_.) Duplicated strings are found using a hash table. All input strings of length 3 are inserted in the hash table. A hash index is computed for the next 3 bytes. If the hash chain for this index is not empty, all strings in the chain are compared with the current input string, and the longest match is selected. The hash chains are searched starting with the most recent strings, to favor small distances and thus take advantage of the Huffman encoding. The hash chains are singly linked. There are no deletions from the hash chains, the algorithm simply discards matches that are too old. To avoid a worst-case situation, very long hash chains are arbitrarily truncated at a certain length, determined by a runtime option (level parameter of deflateInit). So deflate() does not always find the longest possible match but generally finds a match which is long enough. deflate() also defers the selection of matches with a lazy evaluation mechanism. After a match of length N has been found, deflate() searches for a longer match at the next input byte. If a longer match is found, the previous match is truncated to a length of one (thus producing a single literal byte) and the process of lazy evaluation begins again. Otherwise, the original match is kept, and the next match search is attempted only N steps later. The lazy match evaluation is also subject to a runtime parameter. If the current match is long enough, deflate() reduces the search for a longer match, thus speeding up the whole process. If compression ratio is more important than speed, deflate() attempts a complete second search even if the first match is already long enough. The lazy match evaluation is not performed for the fastest compression modes (level parameter 1 to 3). For these fast modes, new strings are inserted in the hash table only when no match was found, or when the match is not too long. This degrades the compression ratio but saves time since there are both fewer insertions and fewer searches. 2. Decompression algorithm (inflate) 2.1 Introduction The key question is how to represent a Huffman code (or any prefix code) so that you can decode fast. The most important characteristic is that shorter codes are much more common than longer codes, so pay attention to decoding the short codes fast, and let the long codes take longer to decode. inflate() sets up a first level table that covers some number of bits of input less than the length of longest code. It gets that many bits from the stream, and looks it up in the table. The table will tell if the next code is that many bits or less and how many, and if it is, it will tell the value, else it will point to the next level table for which inflate() grabs more bits and tries to decode a longer code. How many bits to make the first lookup is a tradeoff between the time it takes to decode and the time it takes to build the table. If building the table took no time (and if you had infinite memory), then there would only be a first level table to cover all the way to the longest code. However, building the table ends up taking a lot longer for more bits since short codes are replicated many times in such a table. What inflate() does is simply to make the number of bits in the first table a variable, and then to set that variable for the maximum speed. For inflate, which has 286 possible codes for the literal/length tree, the size of the first table is nine bits. Also the distance trees have 30 possible values, and the size of the first table is six bits. Note that for each of those cases, the table ended up one bit longer than the ``average'' code length, i.e. the code length of an approximately flat code which would be a little more than eight bits for 286 symbols and a little less than five bits for 30 symbols. 2.2 More details on the inflate table lookup Ok, you want to know what this cleverly obfuscated inflate tree actually looks like. You are correct that it's not a Huffman tree. It is simply a lookup table for the first, let's say, nine bits of a Huffman symbol. The symbol could be as short as one bit or as long as 15 bits. If a particular symbol is shorter than nine bits, then that symbol's translation is duplicated in all those entries that start with that symbol's bits. For example, if the symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a symbol is nine bits long, it appears in the table once. If the symbol is longer than nine bits, then that entry in the table points to another similar table for the remaining bits. Again, there are duplicated entries as needed. The idea is that most of the time the symbol will be short and there will only be one table look up. (That's whole idea behind data compression in the first place.) For the less frequent long symbols, there will be two lookups. If you had a compression method with really long symbols, you could have as many levels of lookups as is efficient. For inflate, two is enough. So a table entry either points to another table (in which case nine bits in the above example are gobbled), or it contains the translation for the symbol and the number of bits to gobble. Then you start again with the next ungobbled bit. You may wonder: why not just have one lookup table for how ever many bits the longest symbol is? The reason is that if you do that, you end up spending more time filling in duplicate symbol entries than you do actually decoding. At least for deflate's output that generates new trees every several 10's of kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code would take too long if you're only decoding several thousand symbols. At the other extreme, you could make a new table for every bit in the code. In fact, that's essentially a Huffman tree. But then you spend two much time traversing the tree while decoding, even for short symbols. So the number of bits for the first lookup table is a trade of the time to fill out the table vs. the time spent looking at the second level and above of the table. Here is an example, scaled down: The code being decoded, with 10 symbols, from 1 to 6 bits long: A: 0 B: 10 C: 1100 D: 11010 E: 11011 F: 11100 G: 11101 H: 11110 I: 111110 J: 111111 Let's make the first table three bits long (eight entries): 000: A,1 001: A,1 010: A,1 011: A,1 100: B,2 101: B,2 110: -> table X (gobble 3 bits) 111: -> table Y (gobble 3 bits) Each entry is what the bits decode as and how many bits that is, i.e. how many bits to gobble. Or the entry points to another table, with the number of bits to gobble implicit in the size of the table. Table X is two bits long since the longest code starting with 110 is five bits long: 00: C,1 01: C,1 10: D,2 11: E,2 Table Y is three bits long since the longest code starting with 111 is six bits long: 000: F,2 001: F,2 010: G,2 011: G,2 100: H,2 101: H,2 110: I,3 111: J,3 So what we have here are three tables with a total of 20 entries that had to be constructed. That's compared to 64 entries for a single table. Or compared to 16 entries for a Huffman tree (six two entry tables and one four entry table). Assuming that the code ideally represents the probability of the symbols, it takes on the average 1.25 lookups per symbol. That's compared to one lookup for the single table, or 1.66 lookups per symbol for the Huffman tree. There, I think that gives you a picture of what's going on. For inflate, the meaning of a particular symbol is often more than just a letter. It can be a byte (a "literal"), or it can be either a length or a distance which indicates a base value and a number of bits to fetch after the code that is added to the base value. Or it might be the special end-of-block code. The data structures created in inftrees.c try to encode all that information compactly in the tables. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu References: [LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, pp. 337-343. ``DEFLATE Compressed Data Format Specification'' available in http://www.ietf.org/rfc/rfc1951.txt syncevolution-1.5/src/synthesis/src/zlib/compress.c0000755000373300037200000000467212424517753024270 0ustar00nightlyallusers00000000000000/* compress.c -- compress a memory buffer * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; } syncevolution-1.5/src/synthesis/src/zlib/crc32.c0000755000373300037200000002277412424517753023354 0ustar00nightlyallusers00000000000000/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results about a factor * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $ Id$ */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #define local static /* Find a four-byte integer type for crc32_little() and crc32_big(). */ #ifndef NOBYFOUR # ifdef STDC /* need ANSI C limits.h to determine sizes */ # include # define BYFOUR # if (UINT_MAX == 0xffffffffUL) typedef unsigned int u4; # else # if (ULONG_MAX == 0xffffffffUL) typedef unsigned long u4; # else # if (USHRT_MAX == 0xffffffffUL) typedef unsigned short u4; # else # undef BYFOUR /* can't find a four-byte integer type! */ # endif # endif # endif # endif /* STDC */ #endif /* !NOBYFOUR */ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ #ifdef DYNAMIC_CRC_TABLE local int crc_table_empty = 1; local unsigned long FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const unsigned long FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { unsigned long c; int n, k; unsigned long poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0UL; for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) poly |= 1UL << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (unsigned long)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = REV(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = REV(c); } } #endif /* BYFOUR */ crc_table_empty = 0; #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const unsigned long FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const unsigned long FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const unsigned long FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const unsigned long FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { u4 endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = (u4)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const u4 FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = REV((u4)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const u4 FAR *)buf; buf4--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(REV(c)); } #endif /* BYFOUR */ syncevolution-1.5/src/synthesis/src/zlib/crc32.h0000755000373300037200000007355012424517753023357 0ustar00nightlyallusers00000000000000/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const unsigned long FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; syncevolution-1.5/src/synthesis/src/zlib/deflate.c0000755000373300037200000015326512424517753024044 0ustar00nightlyallusers00000000000000/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $ Id$ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.1 Copyright 1995-2003 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #endif local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_RLE) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); #ifndef USE_DICT_HEAD dictionary += dictLength - length; /* use the tail of the dictionary */ #endif } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; strm->state->bi_valid = bits; strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_RLE) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds * for every combination of windowBits and memLevel, as well as wrap. * But even the conservative upper bound of about 14% expansion does not * seem onerous for output buffer allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong destLen; /* conservative upper bound */ destLen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; /* if can't get parameters, return conservative bound */ if (strm == Z_NULL || strm->state == Z_NULL) return destLen; /* if not default parameters, return conservative bound */ s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) return destLen; /* default settings: return tight bound for that case */ return compressBound(sourceLen); } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, 255); s->status = BUSY_STATE; strm->adler = crc32(0L, Z_NULL, 0); } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; *dest = *source; ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; *ds = *ss; ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifdef ASMV match_init(); /* initialize the asm code */ #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2: */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #endif /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 or strategy == Z_RLE only */ local uInt longest_match_fast(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ #ifdef FASTEST if ((s->strategy < Z_HUFFMAN_ONLY) || (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { s->match_length = longest_match_fast (s, hash_head); } #else if (s->strategy < Z_HUFFMAN_ONLY) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } #endif /* longest_match() or longest_match_fast() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy < Z_HUFFMAN_ONLY) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } /* longest_match() or longest_match_fast() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* FASTEST */ syncevolution-1.5/src/synthesis/src/zlib/deflate.h0000755000373300037200000002724712424517753024051 0ustar00nightlyallusers00000000000000/* deflate.h -- internal compression state * Copyright (C) 1995-2002 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $ Id$ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ int pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ Byte data_type; /* UNKNOWN, BINARY or ASCII */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ int last_eob_len; /* bit length of EOB code for last block */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ /* in trees.c */ void _tr_init OF((deflate_state *s)); int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); void _tr_align OF((deflate_state *s)); void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch _length_code[]; extern uch _dist_code[]; #else extern const uch _length_code[]; extern const uch _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ syncevolution-1.5/src/synthesis/src/zlib/example.c0000755000373300037200000004006512424517753024064 0ustar00nightlyallusers00000000000000/* example.c -- usage example of the zlib compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id$ */ #include #include "zlib.h" #ifdef STDC # include # include #else extern void exit OF((int)); #endif #if defined(VMS) || defined(RISCOS) # define TESTFILE "foo-gz" #else # define TESTFILE "foo.gz" #endif #define CHECK_ERR(err, msg) { \ if (err != Z_OK) { \ fprintf(stderr, "%s error: %d\n", msg, err); \ exit(1); \ } \ } const char hello[] = "hello, hello!"; /* "hello world" would be more standard, but the repeated "hello" * stresses the compression code better, sorry... */ const char dictionary[] = "hello"; uLong dictId; /* Adler32 value of the dictionary */ void test_compress OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_gzio OF((const char *fname, Byte *uncompr, uLong uncomprLen)); void test_deflate OF((Byte *compr, uLong comprLen)); void test_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_large_deflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_large_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_flush OF((Byte *compr, uLong *comprLen)); void test_sync OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); void test_dict_deflate OF((Byte *compr, uLong comprLen)); void test_dict_inflate OF((Byte *compr, uLong comprLen, Byte *uncompr, uLong uncomprLen)); int main OF((int argc, char *argv[])); /* =========================================================================== * Test compress() and uncompress() */ void test_compress(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; uLong len = (uLong)strlen(hello)+1; err = compress(compr, &comprLen, (const Bytef*)hello, len); CHECK_ERR(err, "compress"); strcpy((char*)uncompr, "garbage"); err = uncompress(uncompr, &uncomprLen, compr, comprLen); CHECK_ERR(err, "uncompress"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad uncompress\n"); exit(1); } else { printf("uncompress(): %s\n", (char *)uncompr); } } /* =========================================================================== * Test read/write of .gz files */ void test_gzio(fname, uncompr, uncomprLen) const char *fname; /* compressed file name */ Byte *uncompr; uLong uncomprLen; { #ifdef NO_GZCOMPRESS fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); #else int err; int len = (int)strlen(hello)+1; gzFile file; z_off_t pos; file = gzopen(fname, "wb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } gzputc(file, 'h'); if (gzputs(file, "ello") != 4) { fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err)); exit(1); } if (gzprintf(file, ", %s!", "hello") != 8) { fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err)); exit(1); } gzseek(file, 1L, SEEK_CUR); /* add one zero byte */ gzclose(file); file = gzopen(fname, "rb"); if (file == NULL) { fprintf(stderr, "gzopen error\n"); exit(1); } strcpy((char*)uncompr, "garbage"); if (gzread(file, uncompr, (unsigned)uncomprLen) != len) { fprintf(stderr, "gzread err: %s\n", gzerror(file, &err)); exit(1); } if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad gzread: %s\n", (char*)uncompr); exit(1); } else { printf("gzread(): %s\n", (char*)uncompr); } pos = gzseek(file, -8L, SEEK_CUR); if (pos != 6 || gztell(file) != pos) { fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n", (long)pos, (long)gztell(file)); exit(1); } if (gzgetc(file) != ' ') { fprintf(stderr, "gzgetc error\n"); exit(1); } if (gzungetc(' ', file) != ' ') { fprintf(stderr, "gzungetc error\n"); exit(1); } gzgets(file, (char*)uncompr, (int)uncomprLen); if (strlen((char*)uncompr) != 7) { /* " hello!" */ fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err)); exit(1); } if (strcmp((char*)uncompr, hello + 6)) { fprintf(stderr, "bad gzgets after gzseek\n"); exit(1); } else { printf("gzgets() after gzseek: %s\n", (char*)uncompr); } gzclose(file); #endif } /* =========================================================================== * Test deflate() with small buffers */ void test_deflate(compr, comprLen) Byte *compr; uLong comprLen; { z_stream c_stream; /* compression stream */ int err; uLong len = (uLong)strlen(hello)+1; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); c_stream.next_in = (Bytef*)hello; c_stream.next_out = compr; while (c_stream.total_in != len && c_stream.total_out < comprLen) { c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */ err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); } /* Finish the stream, still forcing small buffers: */ for (;;) { c_stream.avail_out = 1; err = deflate(&c_stream, Z_FINISH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "deflate"); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with small buffers */ void test_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = 0; d_stream.next_out = uncompr; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) { d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */ err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "inflate"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad inflate\n"); exit(1); } else { printf("inflate(): %s\n", (char *)uncompr); } } /* =========================================================================== * Test deflate() with large buffers and dynamic change of compression level */ void test_large_deflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { z_stream c_stream; /* compression stream */ int err; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_SPEED); CHECK_ERR(err, "deflateInit"); c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; /* At this point, uncompr is still mostly zeroes, so it should compress * very well: */ c_stream.next_in = uncompr; c_stream.avail_in = (uInt)uncomprLen; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); if (c_stream.avail_in != 0) { fprintf(stderr, "deflate not greedy\n"); exit(1); } /* Feed in already compressed data and switch to no compression: */ deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); c_stream.next_in = compr; c_stream.avail_in = (uInt)comprLen/2; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); /* Switch back to compressing mode: */ deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED); c_stream.next_in = uncompr; c_stream.avail_in = (uInt)uncomprLen; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { fprintf(stderr, "deflate should report Z_STREAM_END\n"); exit(1); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with large buffers */ void test_large_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = (uInt)comprLen; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); for (;;) { d_stream.next_out = uncompr; /* discard the output */ d_stream.avail_out = (uInt)uncomprLen; err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; CHECK_ERR(err, "large inflate"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (d_stream.total_out != 2*uncomprLen + comprLen/2) { fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); exit(1); } else { printf("large_inflate(): OK\n"); } } /* =========================================================================== * Test deflate() with full flush */ void test_flush(compr, comprLen) Byte *compr; uLong *comprLen; { z_stream c_stream; /* compression stream */ int err; uInt len = (uInt)strlen(hello)+1; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION); CHECK_ERR(err, "deflateInit"); c_stream.next_in = (Bytef*)hello; c_stream.next_out = compr; c_stream.avail_in = 3; c_stream.avail_out = (uInt)*comprLen; err = deflate(&c_stream, Z_FULL_FLUSH); CHECK_ERR(err, "deflate"); compr[3]++; /* force an error in first compressed block */ c_stream.avail_in = len - 3; err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { CHECK_ERR(err, "deflate"); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); *comprLen = c_stream.total_out; } /* =========================================================================== * Test inflateSync() */ void test_sync(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = 2; /* just read the zlib header */ err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); d_stream.next_out = uncompr; d_stream.avail_out = (uInt)uncomprLen; inflate(&d_stream, Z_NO_FLUSH); CHECK_ERR(err, "inflate"); d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */ err = inflateSync(&d_stream); /* but skip the damaged part */ CHECK_ERR(err, "inflateSync"); err = inflate(&d_stream, Z_FINISH); if (err != Z_DATA_ERROR) { fprintf(stderr, "inflate should report DATA_ERROR\n"); /* Because of incorrect adler32 */ exit(1); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); printf("after inflateSync(): hel%s\n", (char *)uncompr); } /* =========================================================================== * Test deflate() with preset dictionary */ void test_dict_deflate(compr, comprLen) Byte *compr; uLong comprLen; { z_stream c_stream; /* compression stream */ int err; c_stream.zalloc = (alloc_func)0; c_stream.zfree = (free_func)0; c_stream.opaque = (voidpf)0; err = deflateInit(&c_stream, Z_BEST_COMPRESSION); CHECK_ERR(err, "deflateInit"); err = deflateSetDictionary(&c_stream, (const Bytef*)dictionary, sizeof(dictionary)); CHECK_ERR(err, "deflateSetDictionary"); dictId = c_stream.adler; c_stream.next_out = compr; c_stream.avail_out = (uInt)comprLen; c_stream.next_in = (Bytef*)hello; c_stream.avail_in = (uInt)strlen(hello)+1; err = deflate(&c_stream, Z_FINISH); if (err != Z_STREAM_END) { fprintf(stderr, "deflate should report Z_STREAM_END\n"); exit(1); } err = deflateEnd(&c_stream); CHECK_ERR(err, "deflateEnd"); } /* =========================================================================== * Test inflate() with a preset dictionary */ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) Byte *compr, *uncompr; uLong comprLen, uncomprLen; { int err; z_stream d_stream; /* decompression stream */ strcpy((char*)uncompr, "garbage"); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; d_stream.next_in = compr; d_stream.avail_in = (uInt)comprLen; err = inflateInit(&d_stream); CHECK_ERR(err, "inflateInit"); d_stream.next_out = uncompr; d_stream.avail_out = (uInt)uncomprLen; for (;;) { err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) break; if (err == Z_NEED_DICT) { if (d_stream.adler != dictId) { fprintf(stderr, "unexpected dictionary"); exit(1); } err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary, sizeof(dictionary)); } CHECK_ERR(err, "inflate with dict"); } err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); if (strcmp((char*)uncompr, hello)) { fprintf(stderr, "bad inflate with dict\n"); exit(1); } else { printf("inflate with dictionary: %s\n", (char *)uncompr); } } /* =========================================================================== * Usage: example [output.gz [input.gz]] */ int main(argc, argv) int argc; char *argv[]; { Byte *compr, *uncompr; uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ uLong uncomprLen = comprLen; static const char* myVersion = ZLIB_VERSION; if (zlibVersion()[0] != myVersion[0]) { fprintf(stderr, "incompatible zlib version\n"); exit(1); } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { fprintf(stderr, "warning: different zlib version\n"); } printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags()); compr = (Byte*)calloc((uInt)comprLen, 1); uncompr = (Byte*)calloc((uInt)uncomprLen, 1); /* compr and uncompr are cleared to avoid reading uninitialized * data and to ensure that uncompr compresses well. */ if (compr == Z_NULL || uncompr == Z_NULL) { printf("out of memory\n"); exit(1); } test_compress(compr, comprLen, uncompr, uncomprLen); test_gzio((argc > 1 ? argv[1] : TESTFILE), uncompr, uncomprLen); test_deflate(compr, comprLen); test_inflate(compr, comprLen, uncompr, uncomprLen); test_large_deflate(compr, comprLen, uncompr, uncomprLen); test_large_inflate(compr, comprLen, uncompr, uncomprLen); test_flush(compr, &comprLen); test_sync(compr, comprLen, uncompr, uncomprLen); comprLen = uncomprLen; test_dict_deflate(compr, comprLen); test_dict_inflate(compr, comprLen, uncompr, uncomprLen); free(compr); free(uncompr); return 0; } syncevolution-1.5/src/synthesis/src/zlib/gzio.c0000755000373300037200000007350112424517753023402 0ustar00nightlyallusers00000000000000/* gzio.c -- IO on .gz files * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. */ /* @(#) $ Id$ */ #include #include "zutil.h" #ifdef NO_DEFLATE /* for compatiblity with old definition */ # define NO_GZCOMPRESS #endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef Z_BUFSIZE # ifdef MAXSEG_64K # define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ # else # define Z_BUFSIZE 16384 # endif #endif #ifndef Z_PRINTF_BUFSIZE # define Z_PRINTF_BUFSIZE 4096 #endif #ifdef __MVS__ # pragma map (fdopen , "\174\174FDOPEN") FILE *fdopen(int, const char *); #endif #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif #define ALLOC(size) malloc(size) #define TRYFREE(p) {if (p) free(p);} static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ typedef struct gz_stream { z_stream stream; int z_err; /* error code for last stream operation */ int z_eof; /* set if end of input file */ FILE *file; /* .gz file */ Byte *inbuf; /* input buffer */ Byte *outbuf; /* output buffer */ uLong crc; /* crc32 of uncompressed data */ char *msg; /* error message */ char *path; /* path name for debugging only */ int transparent; /* 1 if input file is not a .gz file */ char mode; /* 'w' or 'r' */ z_off_t start; /* start of compressed data in file (header skipped) */ z_off_t in; /* bytes into deflate or inflate */ z_off_t out; /* bytes out of deflate or inflate */ int back; /* one character push-back */ int last; /* true if push-back is last character */ } gz_stream; local gzFile gz_open OF((const char *path, const char *mode, int fd)); local int do_flush OF((gzFile file, int flush)); local int get_byte OF((gz_stream *s)); local void check_header OF((gz_stream *s)); local int destroy OF((gz_stream *s)); local void putLong OF((FILE *file, uLong x)); local uLong getLong OF((gz_stream *s)); /* =========================================================================== Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb"). The file is given either by file descriptor or path name (if fd == -1). gz_open returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ local gzFile gz_open (path, mode, fd) const char *path; const char *mode; int fd; { int err; int level = Z_DEFAULT_COMPRESSION; /* compression level */ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ char *p = (char*)mode; gz_stream *s; char fmode[80]; /* copy of mode, without the compression level */ char *m = fmode; if (!path || !mode) return Z_NULL; s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; s->stream.zalloc = (alloc_func)0; s->stream.zfree = (free_func)0; s->stream.opaque = (voidpf)0; s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; s->file = NULL; s->z_err = Z_OK; s->z_eof = 0; s->in = 0; s->out = 0; s->back = EOF; s->crc = crc32(0L, Z_NULL, 0); s->msg = NULL; s->transparent = 0; s->path = (char*)ALLOC(strlen(path)+1); if (s->path == NULL) { return destroy(s), (gzFile)Z_NULL; } strcpy(s->path, path); /* do this early for debugging */ s->mode = '\0'; do { if (*p == 'r') s->mode = 'r'; if (*p == 'w' || *p == 'a') s->mode = 'w'; if (*p >= '0' && *p <= '9') { level = *p - '0'; } else if (*p == 'f') { strategy = Z_FILTERED; } else if (*p == 'h') { strategy = Z_HUFFMAN_ONLY; } else if (*p == 'R') { strategy = Z_RLE; } else { *m++ = *p; /* copy the mode */ } } while (*p++ && m != fmode + sizeof(fmode)); if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateInit2(&(s->stream), level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); /* windowBits is passed < 0 to suppress zlib header */ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); #endif if (err != Z_OK || s->outbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } else { s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); err = inflateInit2(&(s->stream), -MAX_WBITS); /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are * present after the compressed stream. */ if (err != Z_OK || s->inbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } s->stream.avail_out = Z_BUFSIZE; errno = 0; s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); if (s->file == NULL) { return destroy(s), (gzFile)Z_NULL; } if (s->mode == 'w') { /* Write a very simple .gz header: */ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); s->start = 10L; /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * start anyway in write mode, so this initialization is not * necessary. */ } else { check_header(s); /* skip the .gz header */ s->start = ftell(s->file) - s->stream.avail_in; } return (gzFile)s; } /* =========================================================================== Opens a gzip (.gz) file for reading or writing. */ gzFile ZEXPORT gzopen (path, mode) const char *path; const char *mode; { return gz_open (path, mode, -1); } /* =========================================================================== Associate a gzFile with the file descriptor fd. fd is not dup'ed here to mimic the behavio(u)r of fdopen. */ gzFile ZEXPORT gzdopen (fd, mode) int fd; const char *mode; { char name[20]; if (fd < 0) return (gzFile)Z_NULL; sprintf(name, "", fd); /* for debugging */ return gz_open (name, mode, fd); } /* =========================================================================== * Update the compression level and strategy */ int ZEXPORT gzsetparams (file, level, strategy) gzFile file; int level; int strategy; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; /* Make room to allow flushing */ if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; } s->stream.avail_out = Z_BUFSIZE; } return deflateParams (&(s->stream), level, strategy); } /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte(s) gz_stream *s; { if (s->z_eof) return EOF; if (s->stream.avail_in == 0) { errno = 0; s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) s->z_err = Z_ERRNO; return EOF; } s->stream.next_in = s->inbuf; } s->stream.avail_in--; return *(s->stream.next_in)++; } /* =========================================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ local void check_header(s) gz_stream *s; { int method; /* method byte */ int flags; /* flags byte */ uInt len; int c; /* Assure two bytes in the buffer so we can peek ahead -- handle case where first byte of header is at the end of the buffer after the last gzip segment */ len = s->stream.avail_in; if (len < 2) { if (len) s->inbuf[0] = s->stream.next_in[0]; errno = 0; len = fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; s->stream.avail_in += len; s->stream.next_in = s->inbuf; if (s->stream.avail_in < 2) { s->transparent = s->stream.avail_in; return; } } /* Peek ahead to check the gzip magic header */ if (s->stream.next_in[0] != gz_magic[0] || s->stream.next_in[1] != gz_magic[1]) { s->transparent = 1; return; } s->stream.avail_in -= 2; s->stream.next_in += 2; /* Check the rest of the gzip header */ method = get_byte(s); flags = get_byte(s); if (method != Z_DEFLATED || (flags & RESERVED) != 0) { s->z_err = Z_DATA_ERROR; return; } /* Discard time, xflags and OS code: */ for (len = 0; len < 6; len++) (void)get_byte(s); if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ len = (uInt)get_byte(s); len += ((uInt)get_byte(s))<<8; /* len is garbage if EOF but the loop below will quit anyway */ while (len-- != 0 && get_byte(s) != EOF) ; } if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; } /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. */ local int destroy (s) gz_stream *s; { int err = Z_OK; if (!s) return Z_STREAM_ERROR; TRYFREE(s->msg); if (s->stream.state != NULL) { if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateEnd(&(s->stream)); #endif } else if (s->mode == 'r') { err = inflateEnd(&(s->stream)); } } if (s->file != NULL && fclose(s->file)) { #ifdef ESPIPE if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ #endif err = Z_ERRNO; } if (s->z_err < 0) err = s->z_err; TRYFREE(s->inbuf); TRYFREE(s->outbuf); TRYFREE(s->path); TRYFREE(s); return err; } /* =========================================================================== Reads the given number of uncompressed bytes from the compressed file. gzread returns the number of bytes actually read (0 for end of file). */ int ZEXPORT gzread (file, buf, len) gzFile file; voidp buf; unsigned len; { gz_stream *s = (gz_stream*)file; Bytef *start = (Bytef*)buf; /* starting point for crc computation */ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_STREAM_END) return 0; /* EOF */ next_out = (Byte*)buf; s->stream.next_out = (Bytef*)buf; s->stream.avail_out = len; if (s->stream.avail_out && s->back != EOF) { *next_out++ = s->back; s->stream.next_out++; s->stream.avail_out--; s->back = EOF; s->out++; if (s->last) { s->z_err = Z_STREAM_END; return 1; } } while (s->stream.avail_out != 0) { if (s->transparent) { /* Copy first the lookahead bytes: */ uInt n = s->stream.avail_in; if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > 0) { zmemcpy(s->stream.next_out, s->stream.next_in, n); next_out += n; s->stream.next_out = next_out; s->stream.next_in += n; s->stream.avail_out -= n; s->stream.avail_in -= n; } if (s->stream.avail_out > 0) { s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out, s->file); } len -= s->stream.avail_out; s->in += len; s->out += len; if (len == 0) s->z_eof = 1; return (int)len; } if (s->stream.avail_in == 0 && !s->z_eof) { errno = 0; s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) { s->z_err = Z_ERRNO; break; } } s->stream.next_in = s->inbuf; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = inflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err == Z_STREAM_END) { /* Check CRC and original size */ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); start = s->stream.next_out; if (getLong(s) != s->crc) { s->z_err = Z_DATA_ERROR; } else { (void)getLong(s); /* The uncompressed length returned by above getlong() may be * different from s->out in case of concatenated .gz files. * Check for such files: */ check_header(s); if (s->z_err == Z_OK) { inflateReset(&(s->stream)); s->crc = crc32(0L, Z_NULL, 0); } } } if (s->z_err != Z_OK || s->z_eof) break; } s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); return (int)(len - s->stream.avail_out); } /* =========================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ int ZEXPORT gzgetc(file) gzFile file; { unsigned char c; return gzread(file, &c, 1) == 1 ? c : -1; } /* =========================================================================== Push one byte back onto the stream. */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; s->back = c; s->out--; s->last = (s->z_err == Z_STREAM_END); if (s->last) s->z_err = Z_OK; s->z_eof = 0; return c; } /* =========================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { char *b = buf; if (buf == Z_NULL || len <= 0) return Z_NULL; while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; *buf = '\0'; return b == buf && len > 0 ? Z_NULL : b; } #ifndef NO_GZCOMPRESS /* =========================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of bytes actually written (0 in case of error). */ int ZEXPORT gzwrite (file, buf, len) gzFile file; voidpc buf; unsigned len; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.next_in = (Bytef*)buf; s->stream.avail_in = len; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; break; } s->stream.avail_out = Z_BUFSIZE; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err != Z_OK) break; } s->crc = crc32(s->crc, (const Bytef *)buf, len); return (int)(len - s->stream.avail_in); } /* =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ #ifdef STDC #include int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) { char buf[Z_PRINTF_BUFSIZE]; va_list va; int len; buf[sizeof(buf) - 1] = 0; va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(buf, format, va); va_end(va); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = vsprintf(buf, format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(buf, sizeof(buf), format, va); va_end(va); len = strlen(buf); # else len = vsnprintf(buf, sizeof(buf), format, va); va_end(va); # endif #endif if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, (unsigned)len); } #else /* not ANSI C */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { char buf[Z_PRINTF_BUFSIZE]; int len; buf[sizeof(buf) - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(buf); # else len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, len); } #endif /* =========================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned char cc = (unsigned char) c; /* required for big endian systems */ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; } /* =========================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ int ZEXPORT gzputs(file, s) gzFile file; const char *s; { return gzwrite(file, (char*)s, (unsigned)strlen(s)); } /* =========================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. */ local int do_flush (file, flush) gzFile file; int flush; { uInt len; int done = 0; gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.avail_in = 0; /* should be zero already anyway */ for (;;) { len = Z_BUFSIZE - s->stream.avail_out; if (len != 0) { if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { s->z_err = Z_ERRNO; return Z_ERRNO; } s->stream.next_out = s->outbuf; s->stream.avail_out = Z_BUFSIZE; } if (done) break; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), flush); s->out -= s->stream.avail_out; /* Ignore the second of two consecutive flushes: */ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; } return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } int ZEXPORT gzflush (file, flush) gzFile file; int flush; { gz_stream *s = (gz_stream*)file; int err = do_flush (file, flush); if (err) return err; fflush(s->file); return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } #endif /* NO_GZCOMPRESS */ /* =========================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. */ z_off_t ZEXPORT gzseek (file, offset, whence) gzFile file; z_off_t offset; int whence; { gz_stream *s = (gz_stream*)file; if (s == NULL || whence == SEEK_END || s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { return -1L; } if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return -1L; #else if (whence == SEEK_SET) { offset -= s->in; } if (offset < 0) return -1L; /* At this point, offset is the number of zero bytes to write. */ if (s->inbuf == Z_NULL) { s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ if (s->inbuf == Z_NULL) return -1L; zmemzero(s->inbuf, Z_BUFSIZE); } while (offset > 0) { uInt size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (uInt)offset; size = gzwrite(file, s->inbuf, size); if (size == 0) return -1L; offset -= size; } return s->in; #endif } /* Rest of function is for reading only */ /* compute absolute position */ if (whence == SEEK_CUR) { offset += s->out; } if (offset < 0) return -1L; if (s->transparent) { /* map to fseek */ s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; s->in = s->out = offset; return offset; } /* For a negative seek, rewind and use positive seek */ if (offset >= s->out) { offset -= s->out; } else if (gzrewind(file) < 0) { return -1L; } /* offset is now the number of bytes to skip. */ if (offset != 0 && s->outbuf == Z_NULL) { s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); if (s->outbuf == Z_NULL) return -1L; } if (offset && s->back != EOF) { s->back = EOF; s->out++; offset--; if (s->last) s->z_err = Z_STREAM_END; } while (offset > 0) { int size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (int)offset; size = gzread(file, s->outbuf, (uInt)size); if (size <= 0) return -1L; offset -= size; } return s->out; } /* =========================================================================== Rewinds input file. */ int ZEXPORT gzrewind (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return -1; s->z_err = Z_OK; s->z_eof = 0; s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; s->crc = crc32(0L, Z_NULL, 0); if (!s->transparent) (void)inflateReset(&s->stream); s->in = 0; s->out = 0; return fseek(s->file, s->start, SEEK_SET); } /* =========================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. */ z_off_t ZEXPORT gztell (file) gzFile file; { return gzseek(file, 0L, SEEK_CUR); } /* =========================================================================== Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ int ZEXPORT gzeof (file) gzFile file; { gz_stream *s = (gz_stream*)file; /* With concatenated compressed files that can have embedded * crc trailers, z_eof is no longer the only/best indicator of EOF * on a gz_stream. Handle end-of-stream error explicitly here. */ if (s == NULL || s->mode != 'r') return 0; if (s->z_eof) return 1; return s->z_err == Z_STREAM_END; } /* =========================================================================== Outputs a long in LSB order to the given file */ local void putLong (file, x) FILE *file; uLong x; { int n; for (n = 0; n < 4; n++) { fputc((int)(x & 0xff), file); x >>= 8; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets z_err in case of error. */ local uLong getLong (s) gz_stream *s; { uLong x = (uLong)get_byte(s); int c; x += ((uLong)get_byte(s))<<8; x += ((uLong)get_byte(s))<<16; c = get_byte(s); if (c == EOF) s->z_err = Z_DATA_ERROR; x += ((uLong)c)<<24; return x; } /* =========================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. */ int ZEXPORT gzclose (file) gzFile file; { int err; gz_stream *s = (gz_stream*)file; if (s == NULL) return Z_STREAM_ERROR; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return Z_STREAM_ERROR; #else err = do_flush (file, Z_FINISH); if (err != Z_OK) return destroy((gz_stream*)file); putLong (s->file, s->crc); putLong (s->file, (uLong)(s->in & 0xffffffff)); #endif } return destroy((gz_stream*)file); } /* =========================================================================== Returns the error message for the last error which occured on the given compressed file. errnum is set to zlib error number. If an error occured in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ const char * ZEXPORT gzerror (file, errnum) gzFile file; int *errnum; { char *m; gz_stream *s = (gz_stream*)file; if (s == NULL) { *errnum = Z_STREAM_ERROR; return (const char*)ERR_MSG(Z_STREAM_ERROR); } *errnum = s->z_err; if (*errnum == Z_OK) return (const char*)""; m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); TRYFREE(s->msg); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); strcpy(s->msg, s->path); strcat(s->msg, ": "); strcat(s->msg, m); return (const char*)s->msg; } /* =========================================================================== Clear the error and end-of-file flags, and do the same for the real file. */ void ZEXPORT gzclearerr (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL) return; if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; s->z_eof = 0; clearerr(s->file); } syncevolution-1.5/src/synthesis/src/zlib/infback.c0000755000373300037200000005302612424517753024027 0ustar00nightlyallusers00000000000000/* infback.c -- inflate using a call-back interface * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* This code is largely copied from inflate.c. Normally either infback.o or inflate.o would be linked into an application--not both. The interface with inffast.c is retained so that optimized assembler-coded versions of inflate_fast() can be used with either inflate.c or infback.c. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) z_stream FAR *strm; int windowBits; unsigned char FAR *window; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL || window == Z_NULL || windowBits < 8 || windowBits > 15) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (voidpf)state; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; state->write = 0; state->whave = 0; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Set state from registers for inflate_fast() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ #define PULL() \ do { \ if (have == 0) { \ have = in(in_desc, &next); \ if (have == 0) { \ next = Z_NULL; \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflateBack() with an error if there is no input available. */ #define PULLBYTE() \ do { \ PULL(); \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflateBack() with an error. */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ #define ROOM() \ do { \ if (left == 0) { \ put = state->window; \ left = state->wsize; \ state->whave = left; \ if (out(out_desc, put, left)) { \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* strm provides the memory allocation functions and window buffer on input, and provides information on the unused input on return. For Z_DATA_ERROR returns, strm will also provide an error message. in() and out() are the call-back input and output functions. When inflateBack() needs more input, it calls in(). When inflateBack() has filled the window with output, or when it completes with data in the window, it calls out() to write out the data. The application must not change the provided input until in() is called again or inflateBack() returns. The application must not change the window/output buffer until inflateBack() returns. in() and out() are called with a descriptor parameter provided in the inflateBack() call. This parameter can be a structure that provides the information required to do the read or write, as well as accumulated information on the input and output such as totals and check values. in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) z_stream FAR *strm; in_func in; void FAR *in_desc; out_func out; void FAR *out_desc; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Check that the strm exists and that the state was initialized */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* Reset the state */ strm->msg = Z_NULL; state->mode = TYPE; state->last = 0; state->whave = 0; next = strm->next_in; have = next != Z_NULL ? strm->avail_in : 0; hold = 0; bits = 0; put = state->window; left = state->wsize; /* Inflate until end of block marked as last */ for (;;) switch (state->mode) { case TYPE: /* determine and dispatch block type */ if (state->last) { BYTEBITS(); state->mode = DONE; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); /* copy stored block from input to output */ while (state->length != 0) { copy = state->length; PULL(); ROOM(); if (copy > have) copy = have; if (copy > left) copy = left; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); /* get code length code lengths (not a typo) */ state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); /* get length and distance code code lengths */ state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = (unsigned)(state->lens[state->have - 1]); copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: /* use inflate_fast() if we have enough input and output */ if (have >= 6 && left >= 258) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; inflate_fast(strm, state->wsize); LOAD(); break; } /* get a literal, length, or end-of-block code */ for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; /* process literal */ if (this.op == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; } /* process end of block */ if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ state->extra = (unsigned)(this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); /* get distance code */ for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; /* get distance extra bits, if any */ state->extra = (unsigned)(this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ do { ROOM(); copy = state->wsize - state->offset; if (copy < left) { from = put + copy; copy = left - copy; } else { from = put - state->offset; copy = left; } if (copy > state->length) copy = state->length; state->length -= copy; left -= copy; do { *put++ = *from++; } while (--copy); } while (state->length != 0); break; case DONE: /* inflate stream terminated properly -- write leftover output */ ret = Z_STREAM_END; if (left < state->wsize) { if (out(out_desc, state->window, state->wsize - left)) ret = Z_BUF_ERROR; } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; default: /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } /* Return unused input */ inf_leave: strm->next_in = next; strm->avail_in = have; return ret; } int ZEXPORT inflateBackEnd(strm) z_stream FAR *strm; { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } syncevolution-1.5/src/synthesis/src/zlib/inffast.c0000755000373300037200000002764012424517753024067 0ustar00nightlyallusers00000000000000/* inffast.c -- fast decoding * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - 68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; unsigned char FAR *in; /* local strm->next_in */ unsigned char FAR *last; /* while in < last, enough input available */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code this; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); wsize = state->wsize; whave = state->whave; write = state->write; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = lcode[hold & lmask]; dolen: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op == 0) { /* literal */ Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); PUP(out) = (unsigned char)(this.val); } else if (op & 16) { /* length base */ len = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = dcode[hold & dmask]; dodist: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op & 16) { /* distance base */ dist = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } from = window - OFF; if (write == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (write < op) { /* wrap around window */ from += wsize + write - op; op -= write; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (write < len) { /* some from start of window */ op = write; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += write - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ this = dcode[this.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ this = lcode[this.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and write == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ syncevolution-1.5/src/synthesis/src/zlib/inffast.h0000755000373300037200000000062712424517753024070 0ustar00nightlyallusers00000000000000/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void inflate_fast OF((z_streamp strm, unsigned start)); syncevolution-1.5/src/synthesis/src/zlib/inffixed.h0000755000373300037200000001430712424517753024232 0ustar00nightlyallusers00000000000000 /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; syncevolution-1.5/src/synthesis/src/zlib/inflate.c0000755000373300037200000013045312424517753024054 0ustar00nightlyallusers00000000000000/* inflate.c -- zlib decompression * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common write == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, unsigned out)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; state->mode = HEAD; state->last = 0; state->havedict = 0; state->wsize = 0; state->whave = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (voidpf)state; if (windowBits < 0) { state->wrap = 0; windowBits = -windowBits; } else { state->wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } if (windowBits < 8 || windowBits > 15) { ZFREE(strm, state); strm->state = Z_NULL; return Z_STREAM_ERROR; } state->wbits = (unsigned)windowBits; state->window = Z_NULL; return inflateReset(strm); } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, out) z_streamp strm; unsigned out; { struct inflate_state FAR *state; unsigned copy, dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->write = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); state->write = 0; state->whave = state->wsize; } else { dist = state->wsize - state->write; if (dist > copy) dist = copy; zmemcpy(state->window + state->write, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); state->write = copy; state->whave = state->wsize; } else { state->write += dist; if (state->write == state->wsize) state->write = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Reverse the bytes in a 32-bit value */ #define REVERSE(q) \ ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); if (BITS(4) + 8 > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); } while (len && copy < have); if (state->flags & 0x02000) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); } while (len && copy < have); if (state->flags & 0x02000) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = REVERSE(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); break; } for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; if ((int)(this.op) == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); state->mode = LIT; break; } if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(this.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); state->mode = DIST; case DIST: for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; state->extra = (unsigned)(this.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->whave + out - left) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->write) { copy -= state->write; from = state->window + (state->wsize - copy); } else from = state->window + (state->write - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif REVERSE(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long id; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary id */ id = adler32(0L, Z_NULL, 0); id = adler32(id, dictionary, dictLength); if (id != state->check) return Z_DATA_ERROR; /* copy dictionary to window */ if (updatewindow(strm, strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } if (dictLength > state->wsize) { zmemcpy(state->window, dictionary + dictLength - state->wsize, state->wsize); state->whave = state->wsize; } else { zmemcpy(state->window + state->wsize - dictLength, dictionary, dictLength); state->whave = dictLength; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ *dest = *source; *copy = *state; copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) zmemcpy(window, state->window, 1U << state->wbits); copy->window = window; dest->state = (voidpf)copy; return Z_OK; } syncevolution-1.5/src/synthesis/src/zlib/inflate.h0000755000373300037200000001325212424517753024056 0ustar00nightlyallusers00000000000000/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ #ifdef GUNZIP FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ #endif DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN, /* i: waiting for length/lit code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ #ifdef GUNZIP LENGTH, /* i: waiting for 32-bit length (gzip) */ #endif DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to the BAD or MEM mode -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE Read deflate blocks: TYPE -> STORED or TABLE or LEN or CHECK STORED -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN Read deflate codes: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 7K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ }; syncevolution-1.5/src/synthesis/src/zlib/inftrees.c0000755000373300037200000003202012424517753024240 0ustar00nightlyallusers00000000000000/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.1 Copyright 1995-2003 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code this; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 76, 66}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) return -1; /* no codes! */ for (min = 1; min <= MAXBITS; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || (codes - count[0] != 1))) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked when a LENS table is being made against the space in *table, ENOUGH, minus the maximum space needed by the worst case distance code, MAXD. This should never happen, but the sufficiency of ENOUGH has not been proven exhaustively, hence the check. This assumes that when type == LENS, bits == 9. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if (type == LENS && used >= ENOUGH - MAXD) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ this.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { this.op = (unsigned char)0; this.val = work[sym]; } else if ((int)(work[sym]) > end) { this.op = (unsigned char)(extra[work[sym]]); this.val = base[work[sym]]; } else { this.op = (unsigned char)(32 + 64); /* end of block */ this.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; do { fill -= incr; next[(huff >> drop) + fill] = this; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += 1U << curr; /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if (type == LENS && used >= ENOUGH - MAXD) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* Fill in rest of table for incomplete codes. This loop is similar to the loop above in incrementing huff for table indices. It is assumed that len is equal to curr + drop, so there is no loop needed to increment through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ this.op = (unsigned char)64; /* invalid code marker */ this.bits = (unsigned char)(len - drop); this.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; curr = root; this.bits = (unsigned char)len; } /* put invalid code marker in table */ next[huff >> drop] = this; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; } /* set return parameters */ *table += used; *bits = root; return 0; } syncevolution-1.5/src/synthesis/src/zlib/inftrees.h0000755000373300037200000000450512424517753024254 0ustar00nightlyallusers00000000000000/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of dynamic tree. The maximum found in a long but non- exhaustive search was 1004 code structures (850 for length/literals and 154 for distances, the latter actually the result of an exhaustive search). The true maximum is not known, but the value below is more than safe. */ #define ENOUGH 1440 #define MAXD 154 /* Type of code to build for inftable() */ typedef enum { CODES, LENS, DISTS } codetype; extern int inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); syncevolution-1.5/src/synthesis/src/zlib/minigzip.c0000755000373300037200000001750612424517753024263 0ustar00nightlyallusers00000000000000/* minigzip.c -- simulate gzip using the zlib compression library * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * minigzip is a minimal implementation of the gzip utility. This is * only an example of using zlib and isn't meant to replace the * full-featured gzip. No attempt is made to deal with file systems * limiting names to 14 or 8+3 characters, etc... Error checking is * very limited. So use minigzip only for testing; use gzip for the * real thing. On MSDOS, use only on file names without extension * or in pipe mode. */ /* @(#) $ Id$ */ #include #include "zlib.h" #ifdef STDC # include # include #else extern void exit OF((int)); #endif #ifdef USE_MMAP # include # include # include #endif #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) # include # include # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) #else # define SET_BINARY_MODE(file) #endif #ifdef VMS # define unlink delete # define GZ_SUFFIX "-gz" #endif #ifdef RISCOS # define unlink remove # define GZ_SUFFIX "-gz" # define fileno(file) file->__file #endif #if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fileno */ #endif #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ extern int unlink OF((const char *)); #endif #ifndef GZ_SUFFIX # define GZ_SUFFIX ".gz" #endif #define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1) #define BUFLEN 16384 #define MAX_NAME_LEN 1024 #ifdef MAXSEG_64K # define local static /* Needed for systems with limitation on stack size. */ #else # define local #endif char *prog; void error OF((const char *msg)); void gz_compress OF((FILE *in, gzFile out)); #ifdef USE_MMAP int gz_compress_mmap OF((FILE *in, gzFile out)); #endif void gz_uncompress OF((gzFile in, FILE *out)); void file_compress OF((char *file, char *mode)); void file_uncompress OF((char *file)); int main OF((int argc, char *argv[])); /* =========================================================================== * Display error message and exit */ void error(msg) const char *msg; { fprintf(stderr, "%s: %s\n", prog, msg); exit(1); } /* =========================================================================== * Compress input to output then close both files. */ void gz_compress(in, out) FILE *in; gzFile out; { local char buf[BUFLEN]; int len; int err; #ifdef USE_MMAP /* Try first compressing with mmap. If mmap fails (minigzip used in a * pipe), use the normal fread loop. */ if (gz_compress_mmap(in, out) == Z_OK) return; #endif for (;;) { len = (int)fread(buf, 1, sizeof(buf), in); if (ferror(in)) { perror("fread"); exit(1); } if (len == 0) break; if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); } fclose(in); if (gzclose(out) != Z_OK) error("failed gzclose"); } #ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ /* Try compressing the input file at once using mmap. Return Z_OK if * if success, Z_ERRNO otherwise. */ int gz_compress_mmap(in, out) FILE *in; gzFile out; { int len; int err; int ifd = fileno(in); caddr_t buf; /* mmap'ed buffer for the entire input file */ off_t buf_len; /* length of the input file */ struct stat sb; /* Determine the size of the file, needed for mmap: */ if (fstat(ifd, &sb) < 0) return Z_ERRNO; buf_len = sb.st_size; if (buf_len <= 0) return Z_ERRNO; /* Now do the actual mmap: */ buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0); if (buf == (caddr_t)(-1)) return Z_ERRNO; /* Compress the whole file at once: */ len = gzwrite(out, (char *)buf, (unsigned)buf_len); if (len != (int)buf_len) error(gzerror(out, &err)); munmap(buf, buf_len); fclose(in); if (gzclose(out) != Z_OK) error("failed gzclose"); return Z_OK; } #endif /* USE_MMAP */ /* =========================================================================== * Uncompress input to output then close both files. */ void gz_uncompress(in, out) gzFile in; FILE *out; { local char buf[BUFLEN]; int len; int err; for (;;) { len = gzread(in, buf, sizeof(buf)); if (len < 0) error (gzerror(in, &err)); if (len == 0) break; if ((int)fwrite(buf, 1, (unsigned)len, out) != len) { error("failed fwrite"); } } if (fclose(out)) error("failed fclose"); if (gzclose(in) != Z_OK) error("failed gzclose"); } /* =========================================================================== * Compress the given file: create a corresponding .gz file and remove the * original. */ void file_compress(file, mode) char *file; char *mode; { local char outfile[MAX_NAME_LEN]; FILE *in; gzFile out; strcpy(outfile, file); strcat(outfile, GZ_SUFFIX); in = fopen(file, "rb"); if (in == NULL) { perror(file); exit(1); } out = gzopen(outfile, mode); if (out == NULL) { fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile); exit(1); } gz_compress(in, out); unlink(file); } /* =========================================================================== * Uncompress the given file and remove the original. */ void file_uncompress(file) char *file; { local char buf[MAX_NAME_LEN]; char *infile, *outfile; FILE *out; gzFile in; uInt len = (uInt)strlen(file); strcpy(buf, file); if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) { infile = file; outfile = buf; outfile[len-3] = '\0'; } else { outfile = file; infile = buf; strcat(infile, GZ_SUFFIX); } in = gzopen(infile, "rb"); if (in == NULL) { fprintf(stderr, "%s: can't gzopen %s\n", prog, infile); exit(1); } out = fopen(outfile, "wb"); if (out == NULL) { perror(file); exit(1); } gz_uncompress(in, out); unlink(infile); } /* =========================================================================== * Usage: minigzip [-d] [-f] [-h] [-r] [-1 to -9] [files...] * -d : decompress * -f : compress with Z_FILTERED * -h : compress with Z_HUFFMAN_ONLY * -r : compress with Z_RLE * -1 to -9 : compression level */ int main(argc, argv) int argc; char *argv[]; { int uncompr = 0; gzFile file; char outmode[20]; strcpy(outmode, "wb6 "); prog = argv[0]; argc--, argv++; while (argc > 0) { if (strcmp(*argv, "-d") == 0) uncompr = 1; else if (strcmp(*argv, "-f") == 0) outmode[3] = 'f'; else if (strcmp(*argv, "-h") == 0) outmode[3] = 'h'; else if (strcmp(*argv, "-r") == 0) outmode[3] = 'R'; else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' && (*argv)[2] == 0) outmode[2] = (*argv)[1]; else break; argc--, argv++; } if (argc == 0) { SET_BINARY_MODE(stdin); SET_BINARY_MODE(stdout); if (uncompr) { file = gzdopen(fileno(stdin), "rb"); if (file == NULL) error("can't gzdopen stdin"); gz_uncompress(file, stdout); } else { file = gzdopen(fileno(stdout), outmode); if (file == NULL) error("can't gzdopen stdout"); gz_compress(stdin, file); } } else { do { if (uncompr) { file_uncompress(*argv); } else { file_compress(*argv, outmode); } } while (argv++, --argc); } return 0; } syncevolution-1.5/src/synthesis/src/zlib/trees.c0000755000373300037200000012616312424517753023557 0ustar00nightlyallusers00000000000000/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2003 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $ Id$ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ #define Buf_size (8 * 2*sizeof(char)) /* Number of bits used within bi_buf. (bi_buf might be implemented on * more than 16 bits on some systems.) */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local const static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local const static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local const static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local void set_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (value << s->bi_valid); put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (val << s->bi_valid);\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = (struct static_tree_desc_s *)&static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = (struct static_tree_desc_s *)&static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = (struct static_tree_desc_s *)&static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if (tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void _tr_stored_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. * The current inflate code requires 9 bits of lookahead. If the * last two codes for the previous block (real code plus EOB) were coded * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode * the last real code. In this case we send two empty static blocks instead * of one. (There are no problems if the previous block is stored or fixed.) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ void _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); /* Of the 10 bits for the empty block, we have already sent * (10 - bi_valid) bits. The lookahead for the last real code (before * the EOB of the previous block) was thus at least one plus the length * of the EOB plus what we have just sent of the empty static block. */ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; #endif bi_flush(s); } s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void _tr_flush_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is ascii or binary */ if (s->data_type == Z_UNKNOWN) set_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, eof); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+eof, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+eof, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (eof) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*eof)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; ct_data *ltree; /* literal tree */ ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Set the data type to ASCII or BINARY, using a crude approximation: * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. * IN assertion: the fields freq of dyn_ltree are set and the total of all * frequencies does not exceed 64K (to fit in an int on 16 bit machines). */ local void set_data_type(s) deflate_state *s; { int n = 0; unsigned ascii_freq = 0; unsigned bin_freq = 0; while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } syncevolution-1.5/src/synthesis/src/zlib/trees.h0000755000373300037200000002037412424517753023561 0ustar00nightlyallusers00000000000000/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; syncevolution-1.5/src/synthesis/src/zlib/uncompr.c0000755000373300037200000000405012424517753024106 0ustar00nightlyallusers00000000000000/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id$ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } syncevolution-1.5/src/synthesis/src/zlib/zconf.h0000755000373300037200000002154112424517753023553 0ustar00nightlyallusers00000000000000/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflatePrime z_deflatePrime # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Windows CE does not have errno.h file */ #if defined(_WIN32_WCE) && !defined(NO_ERRNO_H) # define NO_ERRNO_H #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) #define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ syncevolution-1.5/src/synthesis/src/zlib/zconf.in.h0000755000373300037200000002134712424517753024164 0ustar00nightlyallusers00000000000000/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id$ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflatePrime z_deflatePrime # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) #define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ syncevolution-1.5/src/synthesis/src/zlib/zlib.30000755000373300037200000001061212424517753023304 0ustar00nightlyallusers00000000000000.TH ZLIB 3 "17 November 2003" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS [see .I zlib.h for full description] .SH DESCRIPTION The .I zlib library is a general purpose data compression library. The code is thread safe. It provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. .LP Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. .LP The library also supports reading and writing files in .IR gzip (1) (.gz) format with an interface similar to that of stdio. .LP The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. .LP All functions of the compression library are documented in the file .IR zlib.h . The distribution source includes examples of use of the library in the files .I example.c and .IR minigzip.c . .LP Changes to this version are documented in the file .I ChangeLog that accompanies the source, and are concerned primarily with bug fixes and portability enhancements. .LP A Java implementation of .I zlib is available in the Java Development Kit 1.1: .IP http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html .LP A Perl interface to .IR zlib , written by Paul Marquess (pmqs@cpan.org), is available at CPAN (Comprehensive Perl Archive Network) sites, including: .IP http://www.cpan.org/modules/by-module/Compress/ .LP A Python interface to .IR zlib , written by A.M. Kuchling (amk@magnet.com), is available in Python 1.5 and later versions: .IP http://www.python.org/doc/lib/module-zlib.html .LP A .I zlib binding for .IR tcl (1), written by Andreas Kupries (a.kupries@westend.com), is availlable at: .IP http://www.westend.com/~kupries/doc/trf/man/man.html .LP An experimental package to read and write files in .zip format, written on top of .I zlib by Gilles Vollant (info@winimage.com), is available at: .IP http://www.winimage.com/zLibDll/unzip.html and also in the .I contrib/minizip directory of the main .I zlib web site. .SH "SEE ALSO" The .I zlib web site can be found at either of these locations: .IP http://www.zlib.org .br http://www.gzip.org/zlib/ .LP The data format used by the zlib library is described by RFC (Request for Comments) 1950 to 1952 in the files: .IP http://www.ietf.org/rfc/rfc1950.txt (concerning zlib format) .br http://www.ietf.org/rfc/rfc1951.txt (concerning deflate format) .br http://www.ietf.org/rfc/rfc1952.txt (concerning gzip format) .LP These documents are also available in other formats from: .IP ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html .LP Mark Nelson (markn@ieee.org) wrote an article about .I zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at: .IP http://dogma.net/markn/articles/zlibtool/zlibtool.htm .SH "REPORTING PROBLEMS" Before reporting a problem, please check the .I zlib web site to verify that you have the latest version of .IR zlib ; otherwise, obtain the latest version and see if the problem still exists. Please read the .I zlib FAQ at: .IP http://www.gzip.org/zlib/zlib_faq.html .LP before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS Version 1.2.1 Copyright (C) 1995-2003 Jean-loup Gailly (jloup@gzip.org) and Mark Adler (madler@alumni.caltech.edu). .LP This software is provided "as-is," without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. See the distribution directory with respect to requirements governing redistribution. The deflate format used by .I zlib was defined by Phil Katz. The deflate and .I zlib specifications were written by L. Peter Deutsch. Thanks to all the people who reported problems and suggested various improvements in .IR zlib ; who are too numerous to cite here. .LP UNIX manual page by R. P. C. Rodgers, U.S. National Library of Medicine (rodgers@nlm.nih.gov). .\" end of man page syncevolution-1.5/src/synthesis/src/zlib/zlib.h0000755000373300037200000016061312424517753023400 0ustar00nightlyallusers00000000000000/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.1, November 17th, 2003 Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.1" #define ZLIB_VERNUM 0x1210 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. This library does not provide any functions to write gzip files in memory. However such functions could be easily written using zlib's deflate function, the documentation in the gzip RFC, and the examples in gzio.c. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: ascii or binary */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_ASCII 1 #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade the compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update data_type if it can make a good guess about the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it get to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm-adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative memLevel). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate if this call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by this call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running crc with the bytes buf[0..len-1] and return the updated crc. If buf is NULL, this function returns the required initial value for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int err)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ syncevolution-1.5/src/synthesis/src/zlib/zutil.c0000755000373300037200000001554012424517753023600 0ustar00nightlyallusers00000000000000/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $ Id$ */ #include "zutil.h" #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef STDC extern void exit OF((int)); #endif const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch (sizeof(uInt)) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch (sizeof(uLong)) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch (sizeof(voidpf)) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch (sizeof(z_off_t)) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1 << 16; #endif #ifdef NO_GZIP flags += 1 << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1 << 20; #endif #ifdef FASTEST flags += 1 << 21; #endif #ifdef STDC # ifdef NO_vsnprintf flags += 1 << 25; # ifdef HAS_vsprintf_void flags += 1 << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1 << 26; # endif # endif #else flags += 1 << 24; # ifdef NO_snprintf flags += 1 << 25; # ifdef HAS_sprintf_void flags += 1 << 26; # endif # else # ifdef HAS_snprintf_void flags += 1 << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int z_verbose = verbose; void z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* does not exist on WCE */ int errno = 0; #endif #ifndef HAVE_MEMCPY void zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ syncevolution-1.5/src/synthesis/src/zlib/zutil.h0000755000373300037200000001454112424517753023605 0ustar00nightlyallusers00000000000000/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $ Id$ */ #ifndef ZUTIL_H #define ZUTIL_H #define ZLIB_INTERNAL #include "zlib.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = (char*)ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) # if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #ifdef OS2 # define OS_CODE 0x06 #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #ifdef WIN32 # ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ # define OS_CODE 0x0b # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0f #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(__CYGWIN__) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #ifndef HAVE_VSNPRINTF # ifdef MSDOS /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif # ifdef __TURBOC__ # define NO_vsnprintf # endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # define vsnprintf _vsnprintf # endif # endif # ifdef __SASC # define NO_vsnprintf # endif #endif #ifdef HAVE_STRERROR extern char *strerror OF((int)); # define zstrerror(errnum) strerror(errnum) #else # define zstrerror(errnum) "" #endif #if defined(pyr) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int z_verbose; extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} #endif /* ZUTIL_H */ syncevolution-1.5/src/synthesis/src/SDK_FILES0000644000373300037200000000017112424707644022602 0ustar00nightlyallusers00000000000000enginemodulebridge.cpp enginemodulebridge.h target_options.h san.cpp san.h timeutil.cpp timeutil.h UI_util.cpp UI_util.h syncevolution-1.5/src/synthesis/src/SDK_EXCLUDE_FILES0000644000373300037200000000003412424707644023751 0ustar00nightlyallusers00000000000000stringutil.cpp stringutil.h syncevolution-1.5/src/synthesis/src/CLIENT_FILES0000644000373300037200000000017312424707644023141 0ustar00nightlyallusers00000000000000binfile.cpp binfileimplds.cpp binfileimplclient.cpp binfilebase.cpp engineclientbase.cpp syncclient.cpp syncclientbase.cpp syncevolution-1.5/src/synthesis/src/SERVER_FILES0000644000373300037200000000012712424707644023170 0ustar00nightlyallusers00000000000000admindata.cpp admindata.h dbitem.cpp dbitem.h enginesessiondispatch.cpp syncserver.cpp syncevolution-1.5/src/synthesis/src/EXTRA_FILES0000644000373300037200000000015412424707644023045 0ustar00nightlyallusers00000000000000clientprovisioning_inc.cpp .*_tables_inc.cpp syncsessiondispatch.cpp enginestubs.c platform_adapters/macosx syncevolution-1.5/src/synthesis/src/EXCLUDE_FILES0000644000373300037200000000047612424707644023262 0ustar00nightlyallusers00000000000000admindata.cpp admindata.h dbitem.cpp dbitem.h enginesessiondispatch.cpp syncserver.cpp binfile.cpp binfileimplds.cpp binfileimplclient.cpp binfilebase.cpp engineclientbase.cpp syncclient.cpp syncclientbase.cpp clientprovisioning_inc.cpp .*_tables_inc.cpp syncsessiondispatch.cpp enginestubs.c platform_adapters/macosx syncevolution-1.5/src/synthesis/src/Makefile.am0000644000373300037200000004336412424707644023363 0ustar00nightlyallusers00000000000000# The Makefile.am is generated from Makefile.am.in by autogen.sh # because the list of files to compile has to be determined # dynamically. # # When adding new files or changing options rerun autogen.sh. # Beware that changes made to Makefile.am will get lost, always # edit Makefile.am.in! The following rule ensures that make # itself will rebuild its makefiles when Makefile.am.in is edited. $(srcdir)/Makefile.am: $(srcdir)/Makefile.am.in $(srcdir)/gen-makefile-am.sh cd $(srcdir) && sh ./gen-makefile-am.sh # versioning for *all* libs # # CURRENT - most recent interface version # REVISION - minor version number of that interface implementation # AGE - number of previous interface versions supported in addition # to the current one # # When adding to the interface, increment CURRENT and AGE and reset # REVISION to zero. When breaking the interface in a backwards # incompatible way, increment CURRENT and reset AGE and REVISION to # zero. When fixing something without interface change, increment # REVISION. ENGINE_CURRENT = 6 ENGINE_REVISION = 0 ENGINE_AGE = 6 CLEANFILES = EXTRA_DIST = lib_LTLIBRARIES = libsmltk.la libsynthesis.la libsynthesissdk.la libsynthesisstubs.la nobase_include_HEADERS = synthesis/SDK_support.h synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h synthesis/blobs.h synthesis/dataconversion.h synthesis/dbitem.h synthesis/engine_defs.h synthesis/enginemodulebase.h synthesis/enginemodulebridge.h synthesis/generic_types.h synthesis/lineartime.h synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h synthesis/syerror.h synthesis/sync_dbapi.h synthesis/sync_dbapidef.h synthesis/sync_declarations.h synthesis/sync_include.h synthesis/sync_uiapi.h synthesis/syncexception.h synthesis/sysync_b64.h synthesis/sysync_md5.h synthesis/sysync_noncopyable.h synthesis/sysync_utils.h synthesis/timeutil.h synthesis/target_options.h # Configuration header files are searched in this order: # - Targets/ReleasedProducts/autotools: files only used when compiling with autotools # - Targets/ReleasedProducts/[combiEngine_opensource_linux|serverEngine_opensource_linux|SDK]: files also used with Synthesis Linux makefile # # Always included first via -include: # - config.h: configure result (top directory) # - Targets/ReleasedProducts/combiEngine_opensource_linux/clientengine_demo_x86_linux_prefix.h resp. Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource_linux_prefix.h # # Included as needed: # - define.h: hard-coded SyncML Toolkit config (from search path above) libsynthesis_la_SOURCES = DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/DLL_interface.h DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/dbapi.h DB_interfaces/api_db/dbapi_include.h DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/pluginapiagent.h DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/pluginapids.h DB_interfaces/api_db/plugindb.h DB_interfaces/api_db/plugindb_precomp.h DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/api_db/sync_dbapiconnect.h DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/odbcapiagent.h DB_interfaces/odbc_db/odbcapids.cpp DB_interfaces/odbc_db/odbcapids.h DB_interfaces/odbc_db/odbcdb.h DB_interfaces/odbc_db/odbcdb_precomp.h Transport_interfaces/engine/engine_client.h Transport_interfaces/engine/engine_client_precomp.h Transport_interfaces/engine/engine_server.h Transport_interfaces/engine/engine_server_precomp.h Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/engineclientbase.h Transport_interfaces/engine/enginesessiondispatch.cpp Transport_interfaces/engine/enginesessiondispatch.h platform_adapters/binfile.cpp platform_adapters/binfile.h platform_adapters/configfiles.h platform_adapters/linux/configfiles.cpp platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/platform_exec.c platform_adapters/linux/platform_exec.h platform_adapters/linux/platform_headers.h platform_adapters/linux/platform_time.cpp platform_adapters/linux/platform_time.h platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/profiling.cpp platform_adapters/platform_DLL.h platform_adapters/platform_file.h platform_adapters/platform_headers.h platform_adapters/platform_mutex.h platform_adapters/platform_thread.h platform_adapters/profiling.h platform_adapters/sysync_glob_vars.h platform_adapters/sysyncinit.cpp platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/platform_mutex.cpp platform_adapters/unix_common/platform_pipe.c platform_adapters/unix_common/platform_pipe.h platform_adapters/unix_common/platform_thread.cpp syncapps/clientEngine_custom/clientengine_custom.h syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/clientEngine_custom/clientengine_custom_Base.h syncapps/clientEngine_custom/clientengine_custom_precomp.h syncapps/clientEngine_custom/product_options.h syncapps/serverEngine_custom/combi_product_options.h syncapps/serverEngine_custom/product_options.h syncapps/serverEngine_custom/serverengine_custom.h syncapps/serverEngine_custom/serverengine_custom_Base.cpp syncapps/serverEngine_custom/serverengine_custom_Base.h syncapps/serverEngine_custom/serverengine_custom_precomp.h sysync/binfilebase.cpp sysync/binfilebase.h sysync/binfileimplclient.cpp sysync/binfileimplclient.h sysync/binfileimplds.cpp sysync/binfileimplds.h sysync/clientautosync_inc.cpp sysync/clientautosync_inc.h sysync/clientprovisioning_inc.h sysync/configelement.cpp sysync/configelement.h sysync/customimplagent.cpp sysync/customimplagent.h sysync/customimplds.cpp sysync/customimplds.h sysync/dataconversion.cpp sysync/dataobjtype.cpp sysync/dataobjtype.h sysync/debuglogger.cpp sysync/debuglogger.h sysync/engineentry.cpp sysync/engineentry.h sysync/engineinterface.cpp sysync/engineinterface.h sysync/global_progress.h sysync/iso8601.cpp sysync/iso8601.h sysync/itemfield.cpp sysync/itemfield.h sysync/localengineds.cpp sysync/localengineds.h sysync/mimediritemtype.cpp sysync/mimediritemtype.h sysync/mimedirprofile.cpp sysync/mimedirprofile.h sysync/multifielditem.cpp sysync/multifielditem.h sysync/multifielditemtype.cpp sysync/multifielditemtype.h sysync/rawdataitemtype.cpp sysync/rawdataitemtype.h sysync/remotedatastore.cpp sysync/remotedatastore.h sysync/rrules.cpp sysync/rrules.h sysync/scriptcontext.cpp sysync/scriptcontext.h sysync/simpleitem.cpp sysync/simpleitem.h sysync/smltk_precomp.h sysync/smltk_precomp_xpt.h sysync/stdlogicagent.cpp sysync/stdlogicagent.h sysync/stdlogicds.cpp sysync/stdlogicds.h sysync/stringutils.cpp sysync/stringutils.h sysync/superdatastore.cpp sysync/superdatastore.h sysync/syncagent.cpp sysync/syncagent.h sysync/syncappbase.cpp sysync/syncappbase.h sysync/syncclientbase.cpp sysync/syncclientbase.h sysync/synccommand.cpp sysync/synccommand.h sysync/syncdatastore.cpp sysync/syncdatastore.h sysync/syncitem.cpp sysync/syncitem.h sysync/syncitemtype.cpp sysync/syncitemtype.h sysync/syncml_globs.h sysync/syncml_tk.h sysync/syncsession.cpp sysync/syncsession.h sysync/syncsessiondispatch.h sysync/syserial.h sysync/sysync.h sysync/sysync_crc16.cpp sysync/sysync_crc16.h sysync/sysync_debug.h sysync/sysync_globs.h sysync/sysync_precomp.h sysync/sysync_precomp_xpt.h sysync/textitemtype.cpp sysync/textitemtype.h sysync/textprofile.cpp sysync/textprofile.h sysync/timezones.cpp sysync/timezones.h sysync/tz_table.h sysync/uiapi.cpp sysync/uiapi.h sysync/vcalendaritemtype.cpp sysync/vcalendaritemtype.h sysync/vcarditemtype.cpp sysync/vcarditemtype.h sysync/vtimezone.cpp sysync/vtimezone.h sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/admindata.h sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/blobs.h sysync_SDK/Sources/dataconversion.h sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/dbitem.h sysync_SDK/Sources/engine_defs.h sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/enginemodulebase.h sysync_SDK/Sources/generic_types.h sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/lineartime.h sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/syerror.h sysync_SDK/Sources/sync_dbapi.h sysync_SDK/Sources/sync_dbapidef.h sysync_SDK/Sources/sync_declarations.h sysync_SDK/Sources/sync_include.h sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/syncexception.h sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/sysync_noncopyable.h sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/sysync_utils.h \ $(XMLPARSE_SOURCES) libsynthesis_la_CPPFLAGS = -I$(srcdir)/sysync_SDK/Sources libsynthesis_la_CFLAGS = \ $(SYNTHESIS_WFLAGS) \ -include $(top_builddir)/config.h \ -include $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h \ -I$(srcdir)/Targets/ReleasedProducts/clientEngine_autotools/ \ -I$(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/ \ -I$(srcdir)/platform_adapters/linux/ \ -I$(srcdir)/platform_adapters/unix_common/ \ -I$(srcdir)/platform_adapters/ \ -I$(srcdir)/syncapps/clientEngine_custom/ \ -I$(srcdir)/syncapps/serverEngine_custom/ \ -I$(srcdir)/sysync/ \ -I$(srcdir)/Transport_interfaces/engine/ \ -I$(srcdir)/ \ -I$(srcdir)/syncml_tk/src/sml/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/ \ -I$(srcdir)/syncml_tk/src/sml/wsm/inc/ \ -I$(srcdir)/syncml_tk/src/sml/xlt/inc \ -I$(srcdir)/syncml_tk/src/sml/xlt/all \ -I$(srcdir)/DB_interfaces/odbc_db/ \ -I$(srcdir)/DB_interfaces/api_db/ \ -I$(srcdir)/sysync_SDK/Sources/ \ $(PCRE_CFLAGS) \ $(DLT_CFLAGS) \ $(SQLITE3_CFLAGS) \ $(ZLIB_CFLAGS) \ $(XMLPARSE_CFLAGS) \ $(XMLPARSE_CFLAGS_BUILTIN) \ $(LIBICAL_CFLAGS) \ $(LIBECAL_CFLAGS) libsynthesis_la_CXXFLAGS = $(libsynthesis_la_CFLAGS) libsynthesis_la_LIBADD = $(PCRE_LIBS) $(DLT_LIBS) $(SQLITE3_LIBS) $(XMLPARSE_LIBS) $(LIBICAL_LIBS) $(LIBECAL_LIBS) libsmltk.la -lz -ldl -lpthread libsynthesis_la_LDFLAGS = -version-info $(ENGINE_CURRENT):$(ENGINE_REVISION):$(ENGINE_AGE) \ -Wl,--version-script=$(srcdir)/synthesis-linker.map libsynthesis_la_DEPENDENCIES = $(srcdir)/synthesis-linker.map libsmltk.la if COND_XMLPARSE XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/expat -I$(srcdir)/expat/xmltok -I$(srcdir)/expat/xmlparse XMLPARSE_SOURCES = \ expat/xmlparse/xmlparse.c \ expat/xmlparse/xmlparse.h \ expat/xmltok/ascii.h \ expat/xmltok/asciitab.h \ expat/xmltok/iasciitab.h \ expat/xmltok/latin1tab.h \ expat/xmltok/nametab.h \ expat/xmltok/utf8tab.h \ expat/xmltok/xmldef.h \ expat/xmltok/xmlrole.c \ expat/xmltok/xmlrole.h \ expat/xmltok/xmltok.c \ expat/xmltok/xmltok.h \ expat/xmltok/xmltok_impl.h EXTRA_DIST += \ expat/xmltok/xmltok_impl.c \ expat/xmltok/xmltok_ns.c else # add path to xmlparse.h which includes the system's xmltok/xmlparse.h XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/Targets/ReleasedProducts/clientEngine_autotools/systemxml endif libsynthesissdk_la_LIBADD = libsmltk.la # san.cpp calls sml* functions directly libsynthesissdk_la_LDFLAGS = -static libsynthesissdk_la_CFLAGS = $(PIC_CXXFLAGS) $(SYNTHESIS_WFLAGS) libsynthesissdk_la_CXXFLAGS = $(PIC_CXXFLAGS) $(SYNTHESIS_WFLAGS) libsynthesissdk_la_SOURCES = synthesis/SDK_support.h synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h synthesis/blobs.h synthesis/dataconversion.h synthesis/dbitem.h synthesis/engine_defs.h synthesis/enginemodulebase.h synthesis/enginemodulebridge.h synthesis/generic_types.h synthesis/lineartime.h synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h synthesis/syerror.h synthesis/sync_dbapi.h synthesis/sync_dbapidef.h synthesis/sync_declarations.h synthesis/sync_include.h synthesis/sync_uiapi.h synthesis/syncexception.h synthesis/sysync_b64.h synthesis/sysync_md5.h synthesis/sysync_noncopyable.h synthesis/sysync_utils.h synthesis/timeutil.h if COND_STATIC libsynthesissdk_la_SOURCES += sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/timeutil.cpp else libsynthesissdk_la_SOURCES += sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/stringutil.cpp sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/timeutil.cpp endif libsynthesissdk_la_CPPFLAGS = \ -D_GNU_SOURCE=1 \ -include $(top_builddir)/config.h \ -I$(srcdir)/Targets/ReleasedProducts/SDK \ -I$(srcdir)/sysync_SDK/Sources \ -I$(srcdir)/platform_adapters/linux/ \ -I$(srcdir)/platform_adapters/unix_common/ \ -I$(srcdir)/platform_adapters/ \ -I$(srcdir)/sysync/ \ -I$(srcdir)/syncml_tk/src/sml/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ libsynthesisstubs_la_LDFLAGS = -static libsynthesisstubs_la_CFLAGS = $(libsynthesissdk_la_CXXFLAGS) libsynthesisstubs_la_CXXFLAGS = $(libsynthesissdk_la_CXXFLAGS) libsynthesisstubs_la_SOURCES = sysync_SDK/Sources/enginestubs.c libsynthesisstubs_la_CPPFLAGS = $(libsynthesissdk_la_CPPFLAGS) # All files needed by libsynthesissdk.a come from either # sysync_SDK/Sources (shared between engine and SDK) or # sysync_SDK/SDK (only in SDK). We patch the files so that # they include their own files via #include "synthesis/..." vpath %.cpp $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK vpath %.c $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK vpath %.h $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK synthesis/SDK_support.h synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h synthesis/blobs.h synthesis/dataconversion.h synthesis/dbitem.h synthesis/engine_defs.h synthesis/enginemodulebase.h synthesis/enginemodulebridge.h synthesis/generic_types.h synthesis/lineartime.h synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h synthesis/syerror.h synthesis/sync_dbapi.h synthesis/sync_dbapidef.h synthesis/sync_declarations.h synthesis/sync_include.h synthesis/sync_uiapi.h synthesis/syncexception.h synthesis/sysync_b64.h synthesis/sysync_md5.h synthesis/sysync_noncopyable.h synthesis/sysync_utils.h synthesis/timeutil.h: synthesis/%: % mkdir -p synthesis sed -e 's;# *include *";#include "synthesis/;' -e 's/defined(HAVE_STDINT_H)/1/' $< >$@ synthesis/target_options.h: $(srcdir)/Targets/ReleasedProducts/SDK/target_options.h mkdir -p synthesis cp $< $@ # ensure that the header file is in place before compiling the SDK @LIBSYNTHESISSDK_SOURCES@: synthesis/target_options.h # libsmltk: compiled just like libsynthesis libsmltk_la_SOURCES = syncml_tk/src/sml/inc/sml.h syncml_tk/src/sml/inc/smldef.h syncml_tk/src/sml/inc/smldevinfdtd.h syncml_tk/src/sml/inc/smldtd.h syncml_tk/src/sml/inc/smlerr.h syncml_tk/src/sml/inc/smlmetinfdtd.h syncml_tk/src/sml/lib/all/liblock.c syncml_tk/src/sml/lib/all/libmem.c syncml_tk/src/sml/lib/all/libstr.c syncml_tk/src/sml/lib/all/libutil.c syncml_tk/src/sml/lib/inc/liblock.h syncml_tk/src/sml/lib/inc/libmem.h syncml_tk/src/sml/lib/inc/libstr.h syncml_tk/src/sml/lib/inc/libutil.h syncml_tk/src/sml/mgr/all/mgr.c syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c syncml_tk/src/sml/mgr/all/mgrinstancelist.c syncml_tk/src/sml/mgr/all/mgrinstancemgr.c syncml_tk/src/sml/mgr/all/mgrutil.c syncml_tk/src/sml/mgr/inc/mgr.h syncml_tk/src/sml/mgr/inc/mgrutil.h syncml_tk/src/sml/wsm/all/wsm.c syncml_tk/src/sml/wsm/inc/wsm.h syncml_tk/src/sml/wsm/inc/wsm_sm.h syncml_tk/src/sml/xlt/all/xltdec.c syncml_tk/src/sml/xlt/all/xltdeccom.h syncml_tk/src/sml/xlt/all/xltdecwbxml.c syncml_tk/src/sml/xlt/all/xltdecwbxml.h syncml_tk/src/sml/xlt/all/xltdecxml.c syncml_tk/src/sml/xlt/all/xltdevinf.c syncml_tk/src/sml/xlt/all/xltdevinf.h syncml_tk/src/sml/xlt/all/xltenc.c syncml_tk/src/sml/xlt/all/xltenccom.c syncml_tk/src/sml/xlt/all/xltenccom.h syncml_tk/src/sml/xlt/all/xltencwbxml.c syncml_tk/src/sml/xlt/all/xltencwbxml.h syncml_tk/src/sml/xlt/all/xltencxml.c syncml_tk/src/sml/xlt/all/xltencxml.h syncml_tk/src/sml/xlt/all/xltmetinf.c syncml_tk/src/sml/xlt/all/xltmetinf.h syncml_tk/src/sml/xlt/all/xlttags.c syncml_tk/src/sml/xlt/all/xlttags.h syncml_tk/src/sml/xlt/all/xlttagtbl.h syncml_tk/src/sml/xlt/all/xltutilstack.c syncml_tk/src/sml/xlt/all/xltutilstack.h syncml_tk/src/sml/xlt/inc/xltdec.h syncml_tk/src/sml/xlt/inc/xltenc.h libsmltk_la_CFLAGS = $(libsynthesis_la_CFLAGS) libsmltk_la_CXXFLAGS = $(libsmltk_la_CFLAGS) # versioning: same as of engine! changes in libsmltk are not tracked separately. libsmltk_la_LDFLAGS = -version-info $(ENGINE_CURRENT):$(ENGINE_REVISION):$(ENGINE_AGE) \ -Wl,--version-script=$(srcdir)/smltk-linker.map libsmltk_la_DEPENDENCIES = $(srcdir)/smltk-linker.map # Doxygen for complete source code as used in autotools build. # The dependency on the libs ensures that doxygen is invoked # anew when any input file for those changes, reusing the # automatic dependency tracking. A side effect (both good # and bad) is that doxygen will not be invoked on code # which does not compile. html/index.html: Doxyfile libsynthesis.la libsynthesissdk.la rm -rf html INPUT="$(srcdir)/platform_adapters $(srcdir)/syncml_tk $(srcdir)/sysync_SDK $(srcdir)/sysync $(srcdir)/DB_interfaces" \ INCLUDE_PATH="$(srcdir)/Targets/ReleasedProducts/autotools $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux $(srcdir)/sysync_SDK/Sources" \ PREDEFINED="`cat $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h | grep '^#define' | grep '1 *$$' | sed -e 's/#define //' -e 's/ 1//'`" \ doxygen $< .PHONY: doxygen doxygen: html/index.html clean-doxygen: rm -rf html if COND_DOXYGEN all: doxygen clean-local: clean-doxygen endifsyncevolution-1.5/src/synthesis/src/Makefile.in0000644000373300037200000101177012424707650023366 0ustar00nightlyallusers00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @COND_XMLPARSE_TRUE@am__append_1 = \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmltok_impl.c \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmltok_ns.c @COND_STATIC_TRUE@am__append_2 = sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/timeutil.cpp @COND_STATIC_FALSE@am__append_3 = sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/san.cpp sysync_SDK/Sources/stringutil.cpp sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/timeutil.cpp subdir = src DIST_COMMON = $(nobase_include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4-repo/dk-warn.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libsmltk_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libsmltk_la_OBJECTS = \ syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo \ syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo \ syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo \ syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo \ syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo \ syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo \ syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo \ syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo \ syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo \ syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo \ syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo \ syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo libsmltk_la_OBJECTS = $(am_libsmltk_la_OBJECTS) libsmltk_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libsmltk_la_CFLAGS) \ $(CFLAGS) $(libsmltk_la_LDFLAGS) $(LDFLAGS) -o $@ am__DEPENDENCIES_1 = am__libsynthesis_la_SOURCES_DIST = \ DB_interfaces/api_db/DLL_interface.cpp \ DB_interfaces/api_db/DLL_interface.h \ DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/dbapi.h \ DB_interfaces/api_db/dbapi_include.h \ DB_interfaces/api_db/pluginapiagent.cpp \ DB_interfaces/api_db/pluginapiagent.h \ DB_interfaces/api_db/pluginapids.cpp \ DB_interfaces/api_db/pluginapids.h \ DB_interfaces/api_db/plugindb.h \ DB_interfaces/api_db/plugindb_precomp.h \ DB_interfaces/api_db/sync_dbapiconnect.cpp \ DB_interfaces/api_db/sync_dbapiconnect.h \ DB_interfaces/odbc_db/odbcapiagent.cpp \ DB_interfaces/odbc_db/odbcapiagent.h \ DB_interfaces/odbc_db/odbcapids.cpp \ DB_interfaces/odbc_db/odbcapids.h \ DB_interfaces/odbc_db/odbcdb.h \ DB_interfaces/odbc_db/odbcdb_precomp.h \ Transport_interfaces/engine/engine_client.h \ Transport_interfaces/engine/engine_client_precomp.h \ Transport_interfaces/engine/engine_server.h \ Transport_interfaces/engine/engine_server_precomp.h \ Transport_interfaces/engine/engineclientbase.cpp \ Transport_interfaces/engine/engineclientbase.h \ Transport_interfaces/engine/enginesessiondispatch.cpp \ Transport_interfaces/engine/enginesessiondispatch.h \ platform_adapters/binfile.cpp platform_adapters/binfile.h \ platform_adapters/configfiles.h \ platform_adapters/linux/configfiles.cpp \ platform_adapters/linux/platform_DLL.cpp \ platform_adapters/linux/platform_exec.c \ platform_adapters/linux/platform_exec.h \ platform_adapters/linux/platform_headers.h \ platform_adapters/linux/platform_time.cpp \ platform_adapters/linux/platform_time.h \ platform_adapters/linux/platform_timezones.cpp \ platform_adapters/linux/profiling.cpp \ platform_adapters/platform_DLL.h \ platform_adapters/platform_file.h \ platform_adapters/platform_headers.h \ platform_adapters/platform_mutex.h \ platform_adapters/platform_thread.h \ platform_adapters/profiling.h \ platform_adapters/sysync_glob_vars.h \ platform_adapters/sysyncinit.cpp \ platform_adapters/unix_common/platform_file.cpp \ platform_adapters/unix_common/platform_mutex.cpp \ platform_adapters/unix_common/platform_pipe.c \ platform_adapters/unix_common/platform_pipe.h \ platform_adapters/unix_common/platform_thread.cpp \ syncapps/clientEngine_custom/clientengine_custom.h \ syncapps/clientEngine_custom/clientengine_custom_Base.cpp \ syncapps/clientEngine_custom/clientengine_custom_Base.h \ syncapps/clientEngine_custom/clientengine_custom_precomp.h \ syncapps/clientEngine_custom/product_options.h \ syncapps/serverEngine_custom/combi_product_options.h \ syncapps/serverEngine_custom/product_options.h \ syncapps/serverEngine_custom/serverengine_custom.h \ syncapps/serverEngine_custom/serverengine_custom_Base.cpp \ syncapps/serverEngine_custom/serverengine_custom_Base.h \ syncapps/serverEngine_custom/serverengine_custom_precomp.h \ sysync/binfilebase.cpp sysync/binfilebase.h \ sysync/binfileimplclient.cpp sysync/binfileimplclient.h \ sysync/binfileimplds.cpp sysync/binfileimplds.h \ sysync/clientautosync_inc.cpp sysync/clientautosync_inc.h \ sysync/clientprovisioning_inc.h sysync/configelement.cpp \ sysync/configelement.h sysync/customimplagent.cpp \ sysync/customimplagent.h sysync/customimplds.cpp \ sysync/customimplds.h sysync/dataconversion.cpp \ sysync/dataobjtype.cpp sysync/dataobjtype.h \ sysync/debuglogger.cpp sysync/debuglogger.h \ sysync/engineentry.cpp sysync/engineentry.h \ sysync/engineinterface.cpp sysync/engineinterface.h \ sysync/global_progress.h sysync/iso8601.cpp sysync/iso8601.h \ sysync/itemfield.cpp sysync/itemfield.h \ sysync/localengineds.cpp sysync/localengineds.h \ sysync/mimediritemtype.cpp sysync/mimediritemtype.h \ sysync/mimedirprofile.cpp sysync/mimedirprofile.h \ sysync/multifielditem.cpp sysync/multifielditem.h \ sysync/multifielditemtype.cpp sysync/multifielditemtype.h \ sysync/rawdataitemtype.cpp sysync/rawdataitemtype.h \ sysync/remotedatastore.cpp sysync/remotedatastore.h \ sysync/rrules.cpp sysync/rrules.h sysync/scriptcontext.cpp \ sysync/scriptcontext.h sysync/simpleitem.cpp \ sysync/simpleitem.h sysync/smltk_precomp.h \ sysync/smltk_precomp_xpt.h sysync/stdlogicagent.cpp \ sysync/stdlogicagent.h sysync/stdlogicds.cpp \ sysync/stdlogicds.h sysync/stringutils.cpp \ sysync/stringutils.h sysync/superdatastore.cpp \ sysync/superdatastore.h sysync/syncagent.cpp \ sysync/syncagent.h sysync/syncappbase.cpp sysync/syncappbase.h \ sysync/syncclientbase.cpp sysync/syncclientbase.h \ sysync/synccommand.cpp sysync/synccommand.h \ sysync/syncdatastore.cpp sysync/syncdatastore.h \ sysync/syncitem.cpp sysync/syncitem.h sysync/syncitemtype.cpp \ sysync/syncitemtype.h sysync/syncml_globs.h sysync/syncml_tk.h \ sysync/syncsession.cpp sysync/syncsession.h \ sysync/syncsessiondispatch.h sysync/syserial.h sysync/sysync.h \ sysync/sysync_crc16.cpp sysync/sysync_crc16.h \ sysync/sysync_debug.h sysync/sysync_globs.h \ sysync/sysync_precomp.h sysync/sysync_precomp_xpt.h \ sysync/textitemtype.cpp sysync/textitemtype.h \ sysync/textprofile.cpp sysync/textprofile.h \ sysync/timezones.cpp sysync/timezones.h sysync/tz_table.h \ sysync/uiapi.cpp sysync/uiapi.h sysync/vcalendaritemtype.cpp \ sysync/vcalendaritemtype.h sysync/vcarditemtype.cpp \ sysync/vcarditemtype.h sysync/vtimezone.cpp sysync/vtimezone.h \ sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp \ sysync_SDK/Sources/SDK_support.cpp \ sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/SDK_util.c \ sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/admindata.cpp \ sysync_SDK/Sources/admindata.h sysync_SDK/Sources/blobs.cpp \ sysync_SDK/Sources/blobs.h sysync_SDK/Sources/dataconversion.h \ sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/dbitem.h \ sysync_SDK/Sources/engine_defs.h \ sysync_SDK/Sources/enginemodulebase.cpp \ sysync_SDK/Sources/enginemodulebase.h \ sysync_SDK/Sources/generic_types.h \ sysync_SDK/Sources/lineartime.cpp \ sysync_SDK/Sources/lineartime.h \ sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/syerror.h \ sysync_SDK/Sources/sync_dbapi.h \ sysync_SDK/Sources/sync_dbapidef.h \ sysync_SDK/Sources/sync_declarations.h \ sysync_SDK/Sources/sync_include.h \ sysync_SDK/Sources/sync_uiapi.h \ sysync_SDK/Sources/syncexception.cpp \ sysync_SDK/Sources/syncexception.h \ sysync_SDK/Sources/sysync_b64.cpp \ sysync_SDK/Sources/sysync_b64.h \ sysync_SDK/Sources/sysync_md5.cpp \ sysync_SDK/Sources/sysync_md5.h \ sysync_SDK/Sources/sysync_noncopyable.h \ sysync_SDK/Sources/sysync_utils.cpp \ sysync_SDK/Sources/sysync_utils.h expat/xmlparse/xmlparse.c \ expat/xmlparse/xmlparse.h expat/xmltok/ascii.h \ expat/xmltok/asciitab.h expat/xmltok/iasciitab.h \ expat/xmltok/latin1tab.h expat/xmltok/nametab.h \ expat/xmltok/utf8tab.h expat/xmltok/xmldef.h \ expat/xmltok/xmlrole.c expat/xmltok/xmlrole.h \ expat/xmltok/xmltok.c expat/xmltok/xmltok.h \ expat/xmltok/xmltok_impl.h @COND_XMLPARSE_TRUE@am__objects_1 = expat/xmlparse/libsynthesis_la-xmlparse.lo \ @COND_XMLPARSE_TRUE@ expat/xmltok/libsynthesis_la-xmlrole.lo \ @COND_XMLPARSE_TRUE@ expat/xmltok/libsynthesis_la-xmltok.lo am_libsynthesis_la_OBJECTS = \ DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo \ DB_interfaces/api_db/libsynthesis_la-dbapi.lo \ DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo \ DB_interfaces/api_db/libsynthesis_la-pluginapids.lo \ DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo \ DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo \ DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo \ Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo \ Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo \ platform_adapters/libsynthesis_la-binfile.lo \ platform_adapters/linux/libsynthesis_la-configfiles.lo \ platform_adapters/linux/libsynthesis_la-platform_DLL.lo \ platform_adapters/linux/libsynthesis_la-platform_exec.lo \ platform_adapters/linux/libsynthesis_la-platform_time.lo \ platform_adapters/linux/libsynthesis_la-platform_timezones.lo \ platform_adapters/linux/libsynthesis_la-profiling.lo \ platform_adapters/libsynthesis_la-sysyncinit.lo \ platform_adapters/unix_common/libsynthesis_la-platform_file.lo \ platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo \ platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo \ platform_adapters/unix_common/libsynthesis_la-platform_thread.lo \ syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo \ syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo \ sysync/libsynthesis_la-binfilebase.lo \ sysync/libsynthesis_la-binfileimplclient.lo \ sysync/libsynthesis_la-binfileimplds.lo \ sysync/libsynthesis_la-clientautosync_inc.lo \ sysync/libsynthesis_la-configelement.lo \ sysync/libsynthesis_la-customimplagent.lo \ sysync/libsynthesis_la-customimplds.lo \ sysync/libsynthesis_la-dataconversion.lo \ sysync/libsynthesis_la-dataobjtype.lo \ sysync/libsynthesis_la-debuglogger.lo \ sysync/libsynthesis_la-engineentry.lo \ sysync/libsynthesis_la-engineinterface.lo \ sysync/libsynthesis_la-iso8601.lo \ sysync/libsynthesis_la-itemfield.lo \ sysync/libsynthesis_la-localengineds.lo \ sysync/libsynthesis_la-mimediritemtype.lo \ sysync/libsynthesis_la-mimedirprofile.lo \ sysync/libsynthesis_la-multifielditem.lo \ sysync/libsynthesis_la-multifielditemtype.lo \ sysync/libsynthesis_la-rawdataitemtype.lo \ sysync/libsynthesis_la-remotedatastore.lo \ sysync/libsynthesis_la-rrules.lo \ sysync/libsynthesis_la-scriptcontext.lo \ sysync/libsynthesis_la-simpleitem.lo \ sysync/libsynthesis_la-stdlogicagent.lo \ sysync/libsynthesis_la-stdlogicds.lo \ sysync/libsynthesis_la-stringutils.lo \ sysync/libsynthesis_la-superdatastore.lo \ sysync/libsynthesis_la-syncagent.lo \ sysync/libsynthesis_la-syncappbase.lo \ sysync/libsynthesis_la-syncclientbase.lo \ sysync/libsynthesis_la-synccommand.lo \ sysync/libsynthesis_la-syncdatastore.lo \ sysync/libsynthesis_la-syncitem.lo \ sysync/libsynthesis_la-syncitemtype.lo \ sysync/libsynthesis_la-syncsession.lo \ sysync/libsynthesis_la-sysync_crc16.lo \ sysync/libsynthesis_la-textitemtype.lo \ sysync/libsynthesis_la-textprofile.lo \ sysync/libsynthesis_la-timezones.lo \ sysync/libsynthesis_la-uiapi.lo \ sysync/libsynthesis_la-vcalendaritemtype.lo \ sysync/libsynthesis_la-vcarditemtype.lo \ sysync/libsynthesis_la-vtimezone.lo \ sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo \ sysync_SDK/Sources/libsynthesis_la-SDK_support.lo \ sysync_SDK/Sources/libsynthesis_la-SDK_util.lo \ sysync_SDK/Sources/libsynthesis_la-admindata.lo \ sysync_SDK/Sources/libsynthesis_la-blobs.lo \ sysync_SDK/Sources/libsynthesis_la-dbitem.lo \ sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo \ sysync_SDK/Sources/libsynthesis_la-lineartime.lo \ sysync_SDK/Sources/libsynthesis_la-syncexception.lo \ sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo \ sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo \ sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo \ $(am__objects_1) libsynthesis_la_OBJECTS = $(am_libsynthesis_la_OBJECTS) libsynthesis_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) \ $(libsynthesis_la_LDFLAGS) $(LDFLAGS) -o $@ libsynthesissdk_la_DEPENDENCIES = libsmltk.la am__libsynthesissdk_la_SOURCES_DIST = synthesis/SDK_support.h \ synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h \ synthesis/blobs.h synthesis/dataconversion.h \ synthesis/dbitem.h synthesis/engine_defs.h \ synthesis/enginemodulebase.h synthesis/enginemodulebridge.h \ synthesis/generic_types.h synthesis/lineartime.h \ synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h \ synthesis/syerror.h synthesis/sync_dbapi.h \ synthesis/sync_dbapidef.h synthesis/sync_declarations.h \ synthesis/sync_include.h synthesis/sync_uiapi.h \ synthesis/syncexception.h synthesis/sysync_b64.h \ synthesis/sysync_md5.h synthesis/sysync_noncopyable.h \ synthesis/sysync_utils.h synthesis/timeutil.h \ sysync_SDK/Sources/UI_util.cpp \ sysync_SDK/Sources/enginemodulebridge.cpp \ sysync_SDK/Sources/san.cpp sysync_SDK/Sources/timeutil.cpp \ sysync_SDK/Sources/SDK_support.cpp \ sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/blobs.cpp \ sysync_SDK/Sources/enginemodulebase.cpp \ sysync_SDK/Sources/lineartime.cpp \ sysync_SDK/Sources/stringutil.cpp \ sysync_SDK/Sources/syncexception.cpp \ sysync_SDK/Sources/sysync_b64.cpp \ sysync_SDK/Sources/sysync_md5.cpp \ sysync_SDK/Sources/sysync_utils.cpp @COND_STATIC_TRUE@am__objects_2 = sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo \ @COND_STATIC_TRUE@ sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo \ @COND_STATIC_TRUE@ sysync_SDK/Sources/libsynthesissdk_la-san.lo \ @COND_STATIC_TRUE@ sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo @COND_STATIC_FALSE@am__objects_3 = sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-blobs.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-san.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo \ @COND_STATIC_FALSE@ sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo am_libsynthesissdk_la_OBJECTS = $(am__objects_2) $(am__objects_3) libsynthesissdk_la_OBJECTS = $(am_libsynthesissdk_la_OBJECTS) libsynthesissdk_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) \ $(libsynthesissdk_la_LDFLAGS) $(LDFLAGS) -o $@ libsynthesisstubs_la_LIBADD = am_libsynthesisstubs_la_OBJECTS = \ sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo libsynthesisstubs_la_OBJECTS = $(am_libsynthesisstubs_la_OBJECTS) libsynthesisstubs_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libsynthesisstubs_la_CFLAGS) $(CFLAGS) \ $(libsynthesisstubs_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libsmltk_la_SOURCES) $(libsynthesis_la_SOURCES) \ $(libsynthesissdk_la_SOURCES) $(libsynthesisstubs_la_SOURCES) DIST_SOURCES = $(libsmltk_la_SOURCES) \ $(am__libsynthesis_la_SOURCES_DIST) \ $(am__libsynthesissdk_la_SOURCES_DIST) \ $(libsynthesisstubs_la_SOURCES) HEADERS = $(nobase_include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLT_CFLAGS = @DLT_CFLAGS@ DLT_LIBS = @DLT_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOOBAR_CFLAGS = @FOOBAR_CFLAGS@ FOOBAR_LIBS = @FOOBAR_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBECAL_CFLAGS = @LIBECAL_CFLAGS@ LIBECAL_LIBS = @LIBECAL_LIBS@ LIBICAL_CFLAGS = @LIBICAL_CFLAGS@ LIBICAL_LIBS = @LIBICAL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_LIBS = @PCRE_LIBS@ PIC_CXXFLAGS = @PIC_CXXFLAGS@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SQLITE3_CFLAGS = @SQLITE3_CFLAGS@ SQLITE3_LIBS = @SQLITE3_LIBS@ STRIP = @STRIP@ SYNTHESIS_WFLAGS = @SYNTHESIS_WFLAGS@ VERSION = @VERSION@ XMLPARSE_CFLAGS = @XMLPARSE_CFLAGS@ XMLPARSE_LIBS = @XMLPARSE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # versioning for *all* libs # # CURRENT - most recent interface version # REVISION - minor version number of that interface implementation # AGE - number of previous interface versions supported in addition # to the current one # # When adding to the interface, increment CURRENT and AGE and reset # REVISION to zero. When breaking the interface in a backwards # incompatible way, increment CURRENT and reset AGE and REVISION to # zero. When fixing something without interface change, increment # REVISION. ENGINE_CURRENT = 6 ENGINE_REVISION = 0 ENGINE_AGE = 6 CLEANFILES = EXTRA_DIST = $(am__append_1) lib_LTLIBRARIES = libsmltk.la libsynthesis.la libsynthesissdk.la libsynthesisstubs.la nobase_include_HEADERS = synthesis/SDK_support.h synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h synthesis/blobs.h synthesis/dataconversion.h synthesis/dbitem.h synthesis/engine_defs.h synthesis/enginemodulebase.h synthesis/enginemodulebridge.h synthesis/generic_types.h synthesis/lineartime.h synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h synthesis/syerror.h synthesis/sync_dbapi.h synthesis/sync_dbapidef.h synthesis/sync_declarations.h synthesis/sync_include.h synthesis/sync_uiapi.h synthesis/syncexception.h synthesis/sysync_b64.h synthesis/sysync_md5.h synthesis/sysync_noncopyable.h synthesis/sysync_utils.h synthesis/timeutil.h synthesis/target_options.h # Configuration header files are searched in this order: # - Targets/ReleasedProducts/autotools: files only used when compiling with autotools # - Targets/ReleasedProducts/[combiEngine_opensource_linux|serverEngine_opensource_linux|SDK]: files also used with Synthesis Linux makefile # # Always included first via -include: # - config.h: configure result (top directory) # - Targets/ReleasedProducts/combiEngine_opensource_linux/clientengine_demo_x86_linux_prefix.h resp. Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource_linux_prefix.h # # Included as needed: # - define.h: hard-coded SyncML Toolkit config (from search path above) libsynthesis_la_SOURCES = DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/DLL_interface.h DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/dbapi.h DB_interfaces/api_db/dbapi_include.h DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/pluginapiagent.h DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/pluginapids.h DB_interfaces/api_db/plugindb.h DB_interfaces/api_db/plugindb_precomp.h DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/api_db/sync_dbapiconnect.h DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/odbcapiagent.h DB_interfaces/odbc_db/odbcapids.cpp DB_interfaces/odbc_db/odbcapids.h DB_interfaces/odbc_db/odbcdb.h DB_interfaces/odbc_db/odbcdb_precomp.h Transport_interfaces/engine/engine_client.h Transport_interfaces/engine/engine_client_precomp.h Transport_interfaces/engine/engine_server.h Transport_interfaces/engine/engine_server_precomp.h Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/engineclientbase.h Transport_interfaces/engine/enginesessiondispatch.cpp Transport_interfaces/engine/enginesessiondispatch.h platform_adapters/binfile.cpp platform_adapters/binfile.h platform_adapters/configfiles.h platform_adapters/linux/configfiles.cpp platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/platform_exec.c platform_adapters/linux/platform_exec.h platform_adapters/linux/platform_headers.h platform_adapters/linux/platform_time.cpp platform_adapters/linux/platform_time.h platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/profiling.cpp platform_adapters/platform_DLL.h platform_adapters/platform_file.h platform_adapters/platform_headers.h platform_adapters/platform_mutex.h platform_adapters/platform_thread.h platform_adapters/profiling.h platform_adapters/sysync_glob_vars.h platform_adapters/sysyncinit.cpp platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/platform_mutex.cpp platform_adapters/unix_common/platform_pipe.c platform_adapters/unix_common/platform_pipe.h platform_adapters/unix_common/platform_thread.cpp syncapps/clientEngine_custom/clientengine_custom.h syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/clientEngine_custom/clientengine_custom_Base.h syncapps/clientEngine_custom/clientengine_custom_precomp.h syncapps/clientEngine_custom/product_options.h syncapps/serverEngine_custom/combi_product_options.h syncapps/serverEngine_custom/product_options.h syncapps/serverEngine_custom/serverengine_custom.h syncapps/serverEngine_custom/serverengine_custom_Base.cpp syncapps/serverEngine_custom/serverengine_custom_Base.h syncapps/serverEngine_custom/serverengine_custom_precomp.h sysync/binfilebase.cpp sysync/binfilebase.h sysync/binfileimplclient.cpp sysync/binfileimplclient.h sysync/binfileimplds.cpp sysync/binfileimplds.h sysync/clientautosync_inc.cpp sysync/clientautosync_inc.h sysync/clientprovisioning_inc.h sysync/configelement.cpp sysync/configelement.h sysync/customimplagent.cpp sysync/customimplagent.h sysync/customimplds.cpp sysync/customimplds.h sysync/dataconversion.cpp sysync/dataobjtype.cpp sysync/dataobjtype.h sysync/debuglogger.cpp sysync/debuglogger.h sysync/engineentry.cpp sysync/engineentry.h sysync/engineinterface.cpp sysync/engineinterface.h sysync/global_progress.h sysync/iso8601.cpp sysync/iso8601.h sysync/itemfield.cpp sysync/itemfield.h sysync/localengineds.cpp sysync/localengineds.h sysync/mimediritemtype.cpp sysync/mimediritemtype.h sysync/mimedirprofile.cpp sysync/mimedirprofile.h sysync/multifielditem.cpp sysync/multifielditem.h sysync/multifielditemtype.cpp sysync/multifielditemtype.h sysync/rawdataitemtype.cpp sysync/rawdataitemtype.h sysync/remotedatastore.cpp sysync/remotedatastore.h sysync/rrules.cpp sysync/rrules.h sysync/scriptcontext.cpp sysync/scriptcontext.h sysync/simpleitem.cpp sysync/simpleitem.h sysync/smltk_precomp.h sysync/smltk_precomp_xpt.h sysync/stdlogicagent.cpp sysync/stdlogicagent.h sysync/stdlogicds.cpp sysync/stdlogicds.h sysync/stringutils.cpp sysync/stringutils.h sysync/superdatastore.cpp sysync/superdatastore.h sysync/syncagent.cpp sysync/syncagent.h sysync/syncappbase.cpp sysync/syncappbase.h sysync/syncclientbase.cpp sysync/syncclientbase.h sysync/synccommand.cpp sysync/synccommand.h sysync/syncdatastore.cpp sysync/syncdatastore.h sysync/syncitem.cpp sysync/syncitem.h sysync/syncitemtype.cpp sysync/syncitemtype.h sysync/syncml_globs.h sysync/syncml_tk.h sysync/syncsession.cpp sysync/syncsession.h sysync/syncsessiondispatch.h sysync/syserial.h sysync/sysync.h sysync/sysync_crc16.cpp sysync/sysync_crc16.h sysync/sysync_debug.h sysync/sysync_globs.h sysync/sysync_precomp.h sysync/sysync_precomp_xpt.h sysync/textitemtype.cpp sysync/textitemtype.h sysync/textprofile.cpp sysync/textprofile.h sysync/timezones.cpp sysync/timezones.h sysync/tz_table.h sysync/uiapi.cpp sysync/uiapi.h sysync/vcalendaritemtype.cpp sysync/vcalendaritemtype.h sysync/vcarditemtype.cpp sysync/vcarditemtype.h sysync/vtimezone.cpp sysync/vtimezone.h sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/SDK_support.h sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/SDK_util.h sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/admindata.h sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/blobs.h sysync_SDK/Sources/dataconversion.h sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/dbitem.h sysync_SDK/Sources/engine_defs.h sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/enginemodulebase.h sysync_SDK/Sources/generic_types.h sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/lineartime.h sysync_SDK/Sources/prefix_file.h sysync_SDK/Sources/syerror.h sysync_SDK/Sources/sync_dbapi.h sysync_SDK/Sources/sync_dbapidef.h sysync_SDK/Sources/sync_declarations.h sysync_SDK/Sources/sync_include.h sysync_SDK/Sources/sync_uiapi.h sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/syncexception.h sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/sysync_b64.h sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/sysync_md5.h sysync_SDK/Sources/sysync_noncopyable.h sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/sysync_utils.h \ $(XMLPARSE_SOURCES) libsynthesis_la_CPPFLAGS = -I$(srcdir)/sysync_SDK/Sources libsynthesis_la_CFLAGS = \ $(SYNTHESIS_WFLAGS) \ -include $(top_builddir)/config.h \ -include $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h \ -I$(srcdir)/Targets/ReleasedProducts/clientEngine_autotools/ \ -I$(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/ \ -I$(srcdir)/platform_adapters/linux/ \ -I$(srcdir)/platform_adapters/unix_common/ \ -I$(srcdir)/platform_adapters/ \ -I$(srcdir)/syncapps/clientEngine_custom/ \ -I$(srcdir)/syncapps/serverEngine_custom/ \ -I$(srcdir)/sysync/ \ -I$(srcdir)/Transport_interfaces/engine/ \ -I$(srcdir)/ \ -I$(srcdir)/syncml_tk/src/sml/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/ \ -I$(srcdir)/syncml_tk/src/sml/wsm/inc/ \ -I$(srcdir)/syncml_tk/src/sml/xlt/inc \ -I$(srcdir)/syncml_tk/src/sml/xlt/all \ -I$(srcdir)/DB_interfaces/odbc_db/ \ -I$(srcdir)/DB_interfaces/api_db/ \ -I$(srcdir)/sysync_SDK/Sources/ \ $(PCRE_CFLAGS) \ $(DLT_CFLAGS) \ $(SQLITE3_CFLAGS) \ $(ZLIB_CFLAGS) \ $(XMLPARSE_CFLAGS) \ $(XMLPARSE_CFLAGS_BUILTIN) \ $(LIBICAL_CFLAGS) \ $(LIBECAL_CFLAGS) libsynthesis_la_CXXFLAGS = $(libsynthesis_la_CFLAGS) libsynthesis_la_LIBADD = $(PCRE_LIBS) $(DLT_LIBS) $(SQLITE3_LIBS) $(XMLPARSE_LIBS) $(LIBICAL_LIBS) $(LIBECAL_LIBS) libsmltk.la -lz -ldl -lpthread libsynthesis_la_LDFLAGS = -version-info $(ENGINE_CURRENT):$(ENGINE_REVISION):$(ENGINE_AGE) \ -Wl,--version-script=$(srcdir)/synthesis-linker.map libsynthesis_la_DEPENDENCIES = $(srcdir)/synthesis-linker.map libsmltk.la # add path to xmlparse.h which includes the system's xmltok/xmlparse.h @COND_XMLPARSE_FALSE@XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/Targets/ReleasedProducts/clientEngine_autotools/systemxml @COND_XMLPARSE_TRUE@XMLPARSE_CFLAGS_BUILTIN = -I$(srcdir)/expat -I$(srcdir)/expat/xmltok -I$(srcdir)/expat/xmlparse @COND_XMLPARSE_TRUE@XMLPARSE_SOURCES = \ @COND_XMLPARSE_TRUE@ expat/xmlparse/xmlparse.c \ @COND_XMLPARSE_TRUE@ expat/xmlparse/xmlparse.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/ascii.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/asciitab.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/iasciitab.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/latin1tab.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/nametab.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/utf8tab.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmldef.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmlrole.c \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmlrole.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmltok.c \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmltok.h \ @COND_XMLPARSE_TRUE@ expat/xmltok/xmltok_impl.h libsynthesissdk_la_LIBADD = libsmltk.la # san.cpp calls sml* functions directly libsynthesissdk_la_LDFLAGS = -static libsynthesissdk_la_CFLAGS = $(PIC_CXXFLAGS) $(SYNTHESIS_WFLAGS) libsynthesissdk_la_CXXFLAGS = $(PIC_CXXFLAGS) $(SYNTHESIS_WFLAGS) libsynthesissdk_la_SOURCES = synthesis/SDK_support.h \ synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h \ synthesis/blobs.h synthesis/dataconversion.h \ synthesis/dbitem.h synthesis/engine_defs.h \ synthesis/enginemodulebase.h synthesis/enginemodulebridge.h \ synthesis/generic_types.h synthesis/lineartime.h \ synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h \ synthesis/syerror.h synthesis/sync_dbapi.h \ synthesis/sync_dbapidef.h synthesis/sync_declarations.h \ synthesis/sync_include.h synthesis/sync_uiapi.h \ synthesis/syncexception.h synthesis/sysync_b64.h \ synthesis/sysync_md5.h synthesis/sysync_noncopyable.h \ synthesis/sysync_utils.h synthesis/timeutil.h $(am__append_2) \ $(am__append_3) libsynthesissdk_la_CPPFLAGS = \ -D_GNU_SOURCE=1 \ -include $(top_builddir)/config.h \ -I$(srcdir)/Targets/ReleasedProducts/SDK \ -I$(srcdir)/sysync_SDK/Sources \ -I$(srcdir)/platform_adapters/linux/ \ -I$(srcdir)/platform_adapters/unix_common/ \ -I$(srcdir)/platform_adapters/ \ -I$(srcdir)/sysync/ \ -I$(srcdir)/syncml_tk/src/sml/inc/ \ -I$(srcdir)/syncml_tk/src/sml/lib/inc/ \ -I$(srcdir)/syncml_tk/src/sml/mgr/inc/ libsynthesisstubs_la_LDFLAGS = -static libsynthesisstubs_la_CFLAGS = $(libsynthesissdk_la_CXXFLAGS) libsynthesisstubs_la_CXXFLAGS = $(libsynthesissdk_la_CXXFLAGS) libsynthesisstubs_la_SOURCES = sysync_SDK/Sources/enginestubs.c libsynthesisstubs_la_CPPFLAGS = $(libsynthesissdk_la_CPPFLAGS) # libsmltk: compiled just like libsynthesis libsmltk_la_SOURCES = syncml_tk/src/sml/inc/sml.h \ syncml_tk/src/sml/inc/smldef.h \ syncml_tk/src/sml/inc/smldevinfdtd.h \ syncml_tk/src/sml/inc/smldtd.h syncml_tk/src/sml/inc/smlerr.h \ syncml_tk/src/sml/inc/smlmetinfdtd.h \ syncml_tk/src/sml/lib/all/liblock.c \ syncml_tk/src/sml/lib/all/libmem.c \ syncml_tk/src/sml/lib/all/libstr.c \ syncml_tk/src/sml/lib/all/libutil.c \ syncml_tk/src/sml/lib/inc/liblock.h \ syncml_tk/src/sml/lib/inc/libmem.h \ syncml_tk/src/sml/lib/inc/libstr.h \ syncml_tk/src/sml/lib/inc/libutil.h \ syncml_tk/src/sml/mgr/all/mgr.c \ syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c \ syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c \ syncml_tk/src/sml/mgr/all/mgrinstancelist.c \ syncml_tk/src/sml/mgr/all/mgrinstancemgr.c \ syncml_tk/src/sml/mgr/all/mgrutil.c \ syncml_tk/src/sml/mgr/inc/mgr.h \ syncml_tk/src/sml/mgr/inc/mgrutil.h \ syncml_tk/src/sml/wsm/all/wsm.c \ syncml_tk/src/sml/wsm/inc/wsm.h \ syncml_tk/src/sml/wsm/inc/wsm_sm.h \ syncml_tk/src/sml/xlt/all/xltdec.c \ syncml_tk/src/sml/xlt/all/xltdeccom.h \ syncml_tk/src/sml/xlt/all/xltdecwbxml.c \ syncml_tk/src/sml/xlt/all/xltdecwbxml.h \ syncml_tk/src/sml/xlt/all/xltdecxml.c \ syncml_tk/src/sml/xlt/all/xltdevinf.c \ syncml_tk/src/sml/xlt/all/xltdevinf.h \ syncml_tk/src/sml/xlt/all/xltenc.c \ syncml_tk/src/sml/xlt/all/xltenccom.c \ syncml_tk/src/sml/xlt/all/xltenccom.h \ syncml_tk/src/sml/xlt/all/xltencwbxml.c \ syncml_tk/src/sml/xlt/all/xltencwbxml.h \ syncml_tk/src/sml/xlt/all/xltencxml.c \ syncml_tk/src/sml/xlt/all/xltencxml.h \ syncml_tk/src/sml/xlt/all/xltmetinf.c \ syncml_tk/src/sml/xlt/all/xltmetinf.h \ syncml_tk/src/sml/xlt/all/xlttags.c \ syncml_tk/src/sml/xlt/all/xlttags.h \ syncml_tk/src/sml/xlt/all/xlttagtbl.h \ syncml_tk/src/sml/xlt/all/xltutilstack.c \ syncml_tk/src/sml/xlt/all/xltutilstack.h \ syncml_tk/src/sml/xlt/inc/xltdec.h \ syncml_tk/src/sml/xlt/inc/xltenc.h libsmltk_la_CFLAGS = $(libsynthesis_la_CFLAGS) libsmltk_la_CXXFLAGS = $(libsmltk_la_CFLAGS) # versioning: same as of engine! changes in libsmltk are not tracked separately. libsmltk_la_LDFLAGS = -version-info $(ENGINE_CURRENT):$(ENGINE_REVISION):$(ENGINE_AGE) \ -Wl,--version-script=$(srcdir)/smltk-linker.map libsmltk_la_DEPENDENCIES = $(srcdir)/smltk-linker.map all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done syncml_tk/src/sml/lib/all/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/lib/all @: > syncml_tk/src/sml/lib/all/$(am__dirstamp) syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/lib/all/$(DEPDIR) @: > syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo: \ syncml_tk/src/sml/lib/all/$(am__dirstamp) \ syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo: \ syncml_tk/src/sml/lib/all/$(am__dirstamp) \ syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo: \ syncml_tk/src/sml/lib/all/$(am__dirstamp) \ syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo: \ syncml_tk/src/sml/lib/all/$(am__dirstamp) \ syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/mgr/all @: > syncml_tk/src/sml/mgr/all/$(am__dirstamp) syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/mgr/all/$(DEPDIR) @: > syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo: \ syncml_tk/src/sml/mgr/all/$(am__dirstamp) \ syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo: \ syncml_tk/src/sml/mgr/all/$(am__dirstamp) \ syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo: \ syncml_tk/src/sml/mgr/all/$(am__dirstamp) \ syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo: \ syncml_tk/src/sml/mgr/all/$(am__dirstamp) \ syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo: \ syncml_tk/src/sml/mgr/all/$(am__dirstamp) \ syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo: \ syncml_tk/src/sml/mgr/all/$(am__dirstamp) \ syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/wsm/all/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/wsm/all @: > syncml_tk/src/sml/wsm/all/$(am__dirstamp) syncml_tk/src/sml/wsm/all/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/wsm/all/$(DEPDIR) @: > syncml_tk/src/sml/wsm/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo: \ syncml_tk/src/sml/wsm/all/$(am__dirstamp) \ syncml_tk/src/sml/wsm/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/xlt/all @: > syncml_tk/src/sml/xlt/all/$(am__dirstamp) syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) syncml_tk/src/sml/xlt/all/$(DEPDIR) @: > syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo: \ syncml_tk/src/sml/xlt/all/$(am__dirstamp) \ syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) libsmltk.la: $(libsmltk_la_OBJECTS) $(libsmltk_la_DEPENDENCIES) $(libsmltk_la_LINK) -rpath $(libdir) $(libsmltk_la_OBJECTS) $(libsmltk_la_LIBADD) $(LIBS) DB_interfaces/api_db/$(am__dirstamp): @$(MKDIR_P) DB_interfaces/api_db @: > DB_interfaces/api_db/$(am__dirstamp) DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) DB_interfaces/api_db/$(DEPDIR) @: > DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo: \ DB_interfaces/api_db/$(am__dirstamp) \ DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/api_db/libsynthesis_la-dbapi.lo: \ DB_interfaces/api_db/$(am__dirstamp) \ DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo: \ DB_interfaces/api_db/$(am__dirstamp) \ DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/api_db/libsynthesis_la-pluginapids.lo: \ DB_interfaces/api_db/$(am__dirstamp) \ DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo: \ DB_interfaces/api_db/$(am__dirstamp) \ DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/odbc_db/$(am__dirstamp): @$(MKDIR_P) DB_interfaces/odbc_db @: > DB_interfaces/odbc_db/$(am__dirstamp) DB_interfaces/odbc_db/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) DB_interfaces/odbc_db/$(DEPDIR) @: > DB_interfaces/odbc_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo: \ DB_interfaces/odbc_db/$(am__dirstamp) \ DB_interfaces/odbc_db/$(DEPDIR)/$(am__dirstamp) DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo: \ DB_interfaces/odbc_db/$(am__dirstamp) \ DB_interfaces/odbc_db/$(DEPDIR)/$(am__dirstamp) Transport_interfaces/engine/$(am__dirstamp): @$(MKDIR_P) Transport_interfaces/engine @: > Transport_interfaces/engine/$(am__dirstamp) Transport_interfaces/engine/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Transport_interfaces/engine/$(DEPDIR) @: > Transport_interfaces/engine/$(DEPDIR)/$(am__dirstamp) Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo: \ Transport_interfaces/engine/$(am__dirstamp) \ Transport_interfaces/engine/$(DEPDIR)/$(am__dirstamp) Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo: \ Transport_interfaces/engine/$(am__dirstamp) \ Transport_interfaces/engine/$(DEPDIR)/$(am__dirstamp) platform_adapters/$(am__dirstamp): @$(MKDIR_P) platform_adapters @: > platform_adapters/$(am__dirstamp) platform_adapters/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) platform_adapters/$(DEPDIR) @: > platform_adapters/$(DEPDIR)/$(am__dirstamp) platform_adapters/libsynthesis_la-binfile.lo: \ platform_adapters/$(am__dirstamp) \ platform_adapters/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/$(am__dirstamp): @$(MKDIR_P) platform_adapters/linux @: > platform_adapters/linux/$(am__dirstamp) platform_adapters/linux/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) platform_adapters/linux/$(DEPDIR) @: > platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/libsynthesis_la-configfiles.lo: \ platform_adapters/linux/$(am__dirstamp) \ platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/libsynthesis_la-platform_DLL.lo: \ platform_adapters/linux/$(am__dirstamp) \ platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/libsynthesis_la-platform_exec.lo: \ platform_adapters/linux/$(am__dirstamp) \ platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/libsynthesis_la-platform_time.lo: \ platform_adapters/linux/$(am__dirstamp) \ platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/libsynthesis_la-platform_timezones.lo: \ platform_adapters/linux/$(am__dirstamp) \ platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/linux/libsynthesis_la-profiling.lo: \ platform_adapters/linux/$(am__dirstamp) \ platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) platform_adapters/libsynthesis_la-sysyncinit.lo: \ platform_adapters/$(am__dirstamp) \ platform_adapters/$(DEPDIR)/$(am__dirstamp) platform_adapters/unix_common/$(am__dirstamp): @$(MKDIR_P) platform_adapters/unix_common @: > platform_adapters/unix_common/$(am__dirstamp) platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) platform_adapters/unix_common/$(DEPDIR) @: > platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp) platform_adapters/unix_common/libsynthesis_la-platform_file.lo: \ platform_adapters/unix_common/$(am__dirstamp) \ platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp) platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo: \ platform_adapters/unix_common/$(am__dirstamp) \ platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp) platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo: \ platform_adapters/unix_common/$(am__dirstamp) \ platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp) platform_adapters/unix_common/libsynthesis_la-platform_thread.lo: \ platform_adapters/unix_common/$(am__dirstamp) \ platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp) syncapps/clientEngine_custom/$(am__dirstamp): @$(MKDIR_P) syncapps/clientEngine_custom @: > syncapps/clientEngine_custom/$(am__dirstamp) syncapps/clientEngine_custom/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) syncapps/clientEngine_custom/$(DEPDIR) @: > syncapps/clientEngine_custom/$(DEPDIR)/$(am__dirstamp) syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo: \ syncapps/clientEngine_custom/$(am__dirstamp) \ syncapps/clientEngine_custom/$(DEPDIR)/$(am__dirstamp) syncapps/serverEngine_custom/$(am__dirstamp): @$(MKDIR_P) syncapps/serverEngine_custom @: > syncapps/serverEngine_custom/$(am__dirstamp) syncapps/serverEngine_custom/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) syncapps/serverEngine_custom/$(DEPDIR) @: > syncapps/serverEngine_custom/$(DEPDIR)/$(am__dirstamp) syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo: \ syncapps/serverEngine_custom/$(am__dirstamp) \ syncapps/serverEngine_custom/$(DEPDIR)/$(am__dirstamp) sysync/$(am__dirstamp): @$(MKDIR_P) sysync @: > sysync/$(am__dirstamp) sysync/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) sysync/$(DEPDIR) @: > sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-binfilebase.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-binfileimplclient.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-binfileimplds.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-clientautosync_inc.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-configelement.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-customimplagent.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-customimplds.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-dataconversion.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-dataobjtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-debuglogger.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-engineentry.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-engineinterface.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-iso8601.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-itemfield.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-localengineds.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-mimediritemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-mimedirprofile.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-multifielditem.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-multifielditemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-rawdataitemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-remotedatastore.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-rrules.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-scriptcontext.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-simpleitem.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-stdlogicagent.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-stdlogicds.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-stringutils.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-superdatastore.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncagent.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncappbase.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncclientbase.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-synccommand.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncdatastore.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncitem.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncitemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-syncsession.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-sysync_crc16.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-textitemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-textprofile.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-timezones.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-uiapi.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-vcalendaritemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-vcarditemtype.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync/libsynthesis_la-vtimezone.lo: sysync/$(am__dirstamp) \ sysync/$(DEPDIR)/$(am__dirstamp) sysync_SDK/DB_Interfaces/text_db/$(am__dirstamp): @$(MKDIR_P) sysync_SDK/DB_Interfaces/text_db @: > sysync_SDK/DB_Interfaces/text_db/$(am__dirstamp) sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) sysync_SDK/DB_Interfaces/text_db/$(DEPDIR) @: > sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/$(am__dirstamp) sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo: \ sysync_SDK/DB_Interfaces/text_db/$(am__dirstamp) \ sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/$(am__dirstamp): @$(MKDIR_P) sysync_SDK/Sources @: > sysync_SDK/Sources/$(am__dirstamp) sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) sysync_SDK/Sources/$(DEPDIR) @: > sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-SDK_support.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-SDK_util.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-admindata.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-blobs.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-dbitem.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-lineartime.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-syncexception.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) expat/xmlparse/$(am__dirstamp): @$(MKDIR_P) expat/xmlparse @: > expat/xmlparse/$(am__dirstamp) expat/xmlparse/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) expat/xmlparse/$(DEPDIR) @: > expat/xmlparse/$(DEPDIR)/$(am__dirstamp) expat/xmlparse/libsynthesis_la-xmlparse.lo: \ expat/xmlparse/$(am__dirstamp) \ expat/xmlparse/$(DEPDIR)/$(am__dirstamp) expat/xmltok/$(am__dirstamp): @$(MKDIR_P) expat/xmltok @: > expat/xmltok/$(am__dirstamp) expat/xmltok/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) expat/xmltok/$(DEPDIR) @: > expat/xmltok/$(DEPDIR)/$(am__dirstamp) expat/xmltok/libsynthesis_la-xmlrole.lo: expat/xmltok/$(am__dirstamp) \ expat/xmltok/$(DEPDIR)/$(am__dirstamp) expat/xmltok/libsynthesis_la-xmltok.lo: expat/xmltok/$(am__dirstamp) \ expat/xmltok/$(DEPDIR)/$(am__dirstamp) libsynthesis.la: $(libsynthesis_la_OBJECTS) $(libsynthesis_la_DEPENDENCIES) $(libsynthesis_la_LINK) -rpath $(libdir) $(libsynthesis_la_OBJECTS) $(libsynthesis_la_LIBADD) $(LIBS) sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-san.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-blobs.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) libsynthesissdk.la: $(libsynthesissdk_la_OBJECTS) $(libsynthesissdk_la_DEPENDENCIES) $(libsynthesissdk_la_LINK) -rpath $(libdir) $(libsynthesissdk_la_OBJECTS) $(libsynthesissdk_la_LIBADD) $(LIBS) sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo: \ sysync_SDK/Sources/$(am__dirstamp) \ sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) libsynthesisstubs.la: $(libsynthesisstubs_la_OBJECTS) $(libsynthesisstubs_la_DEPENDENCIES) $(libsynthesisstubs_la_LINK) -rpath $(libdir) $(libsynthesisstubs_la_OBJECTS) $(libsynthesisstubs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f DB_interfaces/api_db/libsynthesis_la-DLL_interface.$(OBJEXT) -rm -f DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo -rm -f DB_interfaces/api_db/libsynthesis_la-dbapi.$(OBJEXT) -rm -f DB_interfaces/api_db/libsynthesis_la-dbapi.lo -rm -f DB_interfaces/api_db/libsynthesis_la-pluginapiagent.$(OBJEXT) -rm -f DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo -rm -f DB_interfaces/api_db/libsynthesis_la-pluginapids.$(OBJEXT) -rm -f DB_interfaces/api_db/libsynthesis_la-pluginapids.lo -rm -f DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.$(OBJEXT) -rm -f DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo -rm -f DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.$(OBJEXT) -rm -f DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo -rm -f DB_interfaces/odbc_db/libsynthesis_la-odbcapids.$(OBJEXT) -rm -f DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo -rm -f Transport_interfaces/engine/libsynthesis_la-engineclientbase.$(OBJEXT) -rm -f Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo -rm -f Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.$(OBJEXT) -rm -f Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo -rm -f expat/xmlparse/libsynthesis_la-xmlparse.$(OBJEXT) -rm -f expat/xmlparse/libsynthesis_la-xmlparse.lo -rm -f expat/xmltok/libsynthesis_la-xmlrole.$(OBJEXT) -rm -f expat/xmltok/libsynthesis_la-xmlrole.lo -rm -f expat/xmltok/libsynthesis_la-xmltok.$(OBJEXT) -rm -f expat/xmltok/libsynthesis_la-xmltok.lo -rm -f platform_adapters/libsynthesis_la-binfile.$(OBJEXT) -rm -f platform_adapters/libsynthesis_la-binfile.lo -rm -f platform_adapters/libsynthesis_la-sysyncinit.$(OBJEXT) -rm -f platform_adapters/libsynthesis_la-sysyncinit.lo -rm -f platform_adapters/linux/libsynthesis_la-configfiles.$(OBJEXT) -rm -f platform_adapters/linux/libsynthesis_la-configfiles.lo -rm -f platform_adapters/linux/libsynthesis_la-platform_DLL.$(OBJEXT) -rm -f platform_adapters/linux/libsynthesis_la-platform_DLL.lo -rm -f platform_adapters/linux/libsynthesis_la-platform_exec.$(OBJEXT) -rm -f platform_adapters/linux/libsynthesis_la-platform_exec.lo -rm -f platform_adapters/linux/libsynthesis_la-platform_time.$(OBJEXT) -rm -f platform_adapters/linux/libsynthesis_la-platform_time.lo -rm -f platform_adapters/linux/libsynthesis_la-platform_timezones.$(OBJEXT) -rm -f platform_adapters/linux/libsynthesis_la-platform_timezones.lo -rm -f platform_adapters/linux/libsynthesis_la-profiling.$(OBJEXT) -rm -f platform_adapters/linux/libsynthesis_la-profiling.lo -rm -f platform_adapters/unix_common/libsynthesis_la-platform_file.$(OBJEXT) -rm -f platform_adapters/unix_common/libsynthesis_la-platform_file.lo -rm -f platform_adapters/unix_common/libsynthesis_la-platform_mutex.$(OBJEXT) -rm -f platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo -rm -f platform_adapters/unix_common/libsynthesis_la-platform_pipe.$(OBJEXT) -rm -f platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo -rm -f platform_adapters/unix_common/libsynthesis_la-platform_thread.$(OBJEXT) -rm -f platform_adapters/unix_common/libsynthesis_la-platform_thread.lo -rm -f syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.$(OBJEXT) -rm -f syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo -rm -f syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.$(OBJEXT) -rm -f syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-liblock.$(OBJEXT) -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-libmem.$(OBJEXT) -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-libstr.$(OBJEXT) -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-libutil.$(OBJEXT) -rm -f syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.$(OBJEXT) -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.$(OBJEXT) -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.$(OBJEXT) -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.$(OBJEXT) -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.$(OBJEXT) -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.$(OBJEXT) -rm -f syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo -rm -f syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.$(OBJEXT) -rm -f syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.$(OBJEXT) -rm -f syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo -rm -f sysync/libsynthesis_la-binfilebase.$(OBJEXT) -rm -f sysync/libsynthesis_la-binfilebase.lo -rm -f sysync/libsynthesis_la-binfileimplclient.$(OBJEXT) -rm -f sysync/libsynthesis_la-binfileimplclient.lo -rm -f sysync/libsynthesis_la-binfileimplds.$(OBJEXT) -rm -f sysync/libsynthesis_la-binfileimplds.lo -rm -f sysync/libsynthesis_la-clientautosync_inc.$(OBJEXT) -rm -f sysync/libsynthesis_la-clientautosync_inc.lo -rm -f sysync/libsynthesis_la-configelement.$(OBJEXT) -rm -f sysync/libsynthesis_la-configelement.lo -rm -f sysync/libsynthesis_la-customimplagent.$(OBJEXT) -rm -f sysync/libsynthesis_la-customimplagent.lo -rm -f sysync/libsynthesis_la-customimplds.$(OBJEXT) -rm -f sysync/libsynthesis_la-customimplds.lo -rm -f sysync/libsynthesis_la-dataconversion.$(OBJEXT) -rm -f sysync/libsynthesis_la-dataconversion.lo -rm -f sysync/libsynthesis_la-dataobjtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-dataobjtype.lo -rm -f sysync/libsynthesis_la-debuglogger.$(OBJEXT) -rm -f sysync/libsynthesis_la-debuglogger.lo -rm -f sysync/libsynthesis_la-engineentry.$(OBJEXT) -rm -f sysync/libsynthesis_la-engineentry.lo -rm -f sysync/libsynthesis_la-engineinterface.$(OBJEXT) -rm -f sysync/libsynthesis_la-engineinterface.lo -rm -f sysync/libsynthesis_la-iso8601.$(OBJEXT) -rm -f sysync/libsynthesis_la-iso8601.lo -rm -f sysync/libsynthesis_la-itemfield.$(OBJEXT) -rm -f sysync/libsynthesis_la-itemfield.lo -rm -f sysync/libsynthesis_la-localengineds.$(OBJEXT) -rm -f sysync/libsynthesis_la-localengineds.lo -rm -f sysync/libsynthesis_la-mimediritemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-mimediritemtype.lo -rm -f sysync/libsynthesis_la-mimedirprofile.$(OBJEXT) -rm -f sysync/libsynthesis_la-mimedirprofile.lo -rm -f sysync/libsynthesis_la-multifielditem.$(OBJEXT) -rm -f sysync/libsynthesis_la-multifielditem.lo -rm -f sysync/libsynthesis_la-multifielditemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-multifielditemtype.lo -rm -f sysync/libsynthesis_la-rawdataitemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-rawdataitemtype.lo -rm -f sysync/libsynthesis_la-remotedatastore.$(OBJEXT) -rm -f sysync/libsynthesis_la-remotedatastore.lo -rm -f sysync/libsynthesis_la-rrules.$(OBJEXT) -rm -f sysync/libsynthesis_la-rrules.lo -rm -f sysync/libsynthesis_la-scriptcontext.$(OBJEXT) -rm -f sysync/libsynthesis_la-scriptcontext.lo -rm -f sysync/libsynthesis_la-simpleitem.$(OBJEXT) -rm -f sysync/libsynthesis_la-simpleitem.lo -rm -f sysync/libsynthesis_la-stdlogicagent.$(OBJEXT) -rm -f sysync/libsynthesis_la-stdlogicagent.lo -rm -f sysync/libsynthesis_la-stdlogicds.$(OBJEXT) -rm -f sysync/libsynthesis_la-stdlogicds.lo -rm -f sysync/libsynthesis_la-stringutils.$(OBJEXT) -rm -f sysync/libsynthesis_la-stringutils.lo -rm -f sysync/libsynthesis_la-superdatastore.$(OBJEXT) -rm -f sysync/libsynthesis_la-superdatastore.lo -rm -f sysync/libsynthesis_la-syncagent.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncagent.lo -rm -f sysync/libsynthesis_la-syncappbase.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncappbase.lo -rm -f sysync/libsynthesis_la-syncclientbase.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncclientbase.lo -rm -f sysync/libsynthesis_la-synccommand.$(OBJEXT) -rm -f sysync/libsynthesis_la-synccommand.lo -rm -f sysync/libsynthesis_la-syncdatastore.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncdatastore.lo -rm -f sysync/libsynthesis_la-syncitem.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncitem.lo -rm -f sysync/libsynthesis_la-syncitemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncitemtype.lo -rm -f sysync/libsynthesis_la-syncsession.$(OBJEXT) -rm -f sysync/libsynthesis_la-syncsession.lo -rm -f sysync/libsynthesis_la-sysync_crc16.$(OBJEXT) -rm -f sysync/libsynthesis_la-sysync_crc16.lo -rm -f sysync/libsynthesis_la-textitemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-textitemtype.lo -rm -f sysync/libsynthesis_la-textprofile.$(OBJEXT) -rm -f sysync/libsynthesis_la-textprofile.lo -rm -f sysync/libsynthesis_la-timezones.$(OBJEXT) -rm -f sysync/libsynthesis_la-timezones.lo -rm -f sysync/libsynthesis_la-uiapi.$(OBJEXT) -rm -f sysync/libsynthesis_la-uiapi.lo -rm -f sysync/libsynthesis_la-vcalendaritemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-vcalendaritemtype.lo -rm -f sysync/libsynthesis_la-vcarditemtype.$(OBJEXT) -rm -f sysync/libsynthesis_la-vcarditemtype.lo -rm -f sysync/libsynthesis_la-vtimezone.$(OBJEXT) -rm -f sysync/libsynthesis_la-vtimezone.lo -rm -f sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.$(OBJEXT) -rm -f sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo -rm -f sysync_SDK/Sources/libsynthesis_la-SDK_support.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-SDK_support.lo -rm -f sysync_SDK/Sources/libsynthesis_la-SDK_util.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-SDK_util.lo -rm -f sysync_SDK/Sources/libsynthesis_la-admindata.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-admindata.lo -rm -f sysync_SDK/Sources/libsynthesis_la-blobs.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-blobs.lo -rm -f sysync_SDK/Sources/libsynthesis_la-dbitem.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-dbitem.lo -rm -f sysync_SDK/Sources/libsynthesis_la-enginemodulebase.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo -rm -f sysync_SDK/Sources/libsynthesis_la-lineartime.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-lineartime.lo -rm -f sysync_SDK/Sources/libsynthesis_la-syncexception.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-syncexception.lo -rm -f sysync_SDK/Sources/libsynthesis_la-sysync_b64.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo -rm -f sysync_SDK/Sources/libsynthesis_la-sysync_md5.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo -rm -f sysync_SDK/Sources/libsynthesis_la-sysync_utils.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-SDK_support.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-SDK_util.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-UI_util.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-blobs.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-blobs.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-lineartime.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-san.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-san.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-stringutil.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-syncexception.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo -rm -f sysync_SDK/Sources/libsynthesissdk_la-timeutil.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo -rm -f sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.$(OBJEXT) -rm -f sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-DLL_interface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-dbapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapiagent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapids.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-sync_dbapiconnect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapiagent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapids.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-engineclientbase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-enginesessiondispatch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@expat/xmlparse/$(DEPDIR)/libsynthesis_la-xmlparse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@expat/xmltok/$(DEPDIR)/libsynthesis_la-xmlrole.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@expat/xmltok/$(DEPDIR)/libsynthesis_la-xmltok.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/$(DEPDIR)/libsynthesis_la-binfile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/$(DEPDIR)/libsynthesis_la-sysyncinit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/linux/$(DEPDIR)/libsynthesis_la-configfiles.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_DLL.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_exec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_time.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_timezones.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/linux/$(DEPDIR)/libsynthesis_la-profiling.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_file.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_mutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_pipe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_thread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncapps/clientEngine_custom/$(DEPDIR)/libsynthesis_la-clientengine_custom_Base.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncapps/serverEngine_custom/$(DEPDIR)/libsynthesis_la-serverengine_custom_Base.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-liblock.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libmem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libstr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmdbuilder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmddispatcher.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancelist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancemgr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/wsm/all/$(DEPDIR)/libsmltk_la-wsm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecwbxml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecxml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdevinf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenccom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencwbxml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencxml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltmetinf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xlttags.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltutilstack.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-binfilebase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-binfileimplclient.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-binfileimplds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-clientautosync_inc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-configelement.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-customimplagent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-customimplds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-dataconversion.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-dataobjtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-debuglogger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-engineentry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-engineinterface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-iso8601.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-itemfield.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-localengineds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-mimediritemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-mimedirprofile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-multifielditem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-multifielditemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-rawdataitemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-remotedatastore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-rrules.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-scriptcontext.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-simpleitem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-stdlogicagent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-stdlogicds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-stringutils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-superdatastore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncagent.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncappbase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncclientbase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-synccommand.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncdatastore.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncitem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncitemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-syncsession.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-sysync_crc16.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-textitemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-textprofile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-timezones.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-uiapi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-vcalendaritemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-vcarditemtype.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync/$(DEPDIR)/libsynthesis_la-vtimezone.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/libsynthesis_la-sync_dbapi_text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-admindata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-blobs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-dbitem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-enginemodulebase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-lineartime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-syncexception.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_b64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_support.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-UI_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-blobs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebase.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebridge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-lineartime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-san.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-stringutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-syncexception.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_b64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-timeutil.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@sysync_SDK/Sources/$(DEPDIR)/libsynthesisstubs_la-enginestubs.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo: syncml_tk/src/sml/lib/all/liblock.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo -MD -MP -MF syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-liblock.Tpo -c -o syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo `test -f 'syncml_tk/src/sml/lib/all/liblock.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/liblock.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-liblock.Tpo syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-liblock.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/lib/all/liblock.c' object='syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/lib/all/libsmltk_la-liblock.lo `test -f 'syncml_tk/src/sml/lib/all/liblock.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/liblock.c syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo: syncml_tk/src/sml/lib/all/libmem.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo -MD -MP -MF syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libmem.Tpo -c -o syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo `test -f 'syncml_tk/src/sml/lib/all/libmem.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/libmem.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libmem.Tpo syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libmem.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/lib/all/libmem.c' object='syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/lib/all/libsmltk_la-libmem.lo `test -f 'syncml_tk/src/sml/lib/all/libmem.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/libmem.c syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo: syncml_tk/src/sml/lib/all/libstr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo -MD -MP -MF syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libstr.Tpo -c -o syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo `test -f 'syncml_tk/src/sml/lib/all/libstr.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/libstr.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libstr.Tpo syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libstr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/lib/all/libstr.c' object='syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/lib/all/libsmltk_la-libstr.lo `test -f 'syncml_tk/src/sml/lib/all/libstr.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/libstr.c syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo: syncml_tk/src/sml/lib/all/libutil.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo -MD -MP -MF syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libutil.Tpo -c -o syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo `test -f 'syncml_tk/src/sml/lib/all/libutil.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/libutil.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libutil.Tpo syncml_tk/src/sml/lib/all/$(DEPDIR)/libsmltk_la-libutil.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/lib/all/libutil.c' object='syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/lib/all/libsmltk_la-libutil.lo `test -f 'syncml_tk/src/sml/lib/all/libutil.c' || echo '$(srcdir)/'`syncml_tk/src/sml/lib/all/libutil.c syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo: syncml_tk/src/sml/mgr/all/mgr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo -MD -MP -MF syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgr.Tpo -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo `test -f 'syncml_tk/src/sml/mgr/all/mgr.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgr.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgr.Tpo syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/mgr/all/mgr.c' object='syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgr.lo `test -f 'syncml_tk/src/sml/mgr/all/mgr.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgr.c syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo: syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo -MD -MP -MF syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmdbuilder.Tpo -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmdbuilder.Tpo syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmdbuilder.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c' object='syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmdbuilder.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo: syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo -MD -MP -MF syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmddispatcher.Tpo -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmddispatcher.Tpo syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrcmddispatcher.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c' object='syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrcmddispatcher.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrcmddispatcher.c syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo: syncml_tk/src/sml/mgr/all/mgrinstancelist.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo -MD -MP -MF syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancelist.Tpo -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrinstancelist.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrinstancelist.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancelist.Tpo syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancelist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/mgr/all/mgrinstancelist.c' object='syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancelist.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrinstancelist.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrinstancelist.c syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo: syncml_tk/src/sml/mgr/all/mgrinstancemgr.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo -MD -MP -MF syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancemgr.Tpo -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrinstancemgr.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrinstancemgr.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancemgr.Tpo syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrinstancemgr.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/mgr/all/mgrinstancemgr.c' object='syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrinstancemgr.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrinstancemgr.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrinstancemgr.c syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo: syncml_tk/src/sml/mgr/all/mgrutil.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo -MD -MP -MF syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrutil.Tpo -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrutil.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrutil.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrutil.Tpo syncml_tk/src/sml/mgr/all/$(DEPDIR)/libsmltk_la-mgrutil.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/mgr/all/mgrutil.c' object='syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/mgr/all/libsmltk_la-mgrutil.lo `test -f 'syncml_tk/src/sml/mgr/all/mgrutil.c' || echo '$(srcdir)/'`syncml_tk/src/sml/mgr/all/mgrutil.c syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo: syncml_tk/src/sml/wsm/all/wsm.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo -MD -MP -MF syncml_tk/src/sml/wsm/all/$(DEPDIR)/libsmltk_la-wsm.Tpo -c -o syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo `test -f 'syncml_tk/src/sml/wsm/all/wsm.c' || echo '$(srcdir)/'`syncml_tk/src/sml/wsm/all/wsm.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/wsm/all/$(DEPDIR)/libsmltk_la-wsm.Tpo syncml_tk/src/sml/wsm/all/$(DEPDIR)/libsmltk_la-wsm.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/wsm/all/wsm.c' object='syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/wsm/all/libsmltk_la-wsm.lo `test -f 'syncml_tk/src/sml/wsm/all/wsm.c' || echo '$(srcdir)/'`syncml_tk/src/sml/wsm/all/wsm.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo: syncml_tk/src/sml/xlt/all/xltdec.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdec.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdec.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdec.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdec.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltdec.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdec.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdec.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdec.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo: syncml_tk/src/sml/xlt/all/xltdecwbxml.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecwbxml.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdecwbxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdecwbxml.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecwbxml.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecwbxml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltdecwbxml.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecwbxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdecwbxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdecwbxml.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo: syncml_tk/src/sml/xlt/all/xltdecxml.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecxml.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdecxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdecxml.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecxml.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdecxml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltdecxml.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdecxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdecxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdecxml.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo: syncml_tk/src/sml/xlt/all/xltdevinf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdevinf.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdevinf.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdevinf.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdevinf.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltdevinf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltdevinf.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltdevinf.lo `test -f 'syncml_tk/src/sml/xlt/all/xltdevinf.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltdevinf.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo: syncml_tk/src/sml/xlt/all/xltenc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenc.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo `test -f 'syncml_tk/src/sml/xlt/all/xltenc.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltenc.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenc.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltenc.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltenc.lo `test -f 'syncml_tk/src/sml/xlt/all/xltenc.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltenc.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo: syncml_tk/src/sml/xlt/all/xltenccom.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenccom.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo `test -f 'syncml_tk/src/sml/xlt/all/xltenccom.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltenccom.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenccom.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltenccom.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltenccom.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltenccom.lo `test -f 'syncml_tk/src/sml/xlt/all/xltenccom.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltenccom.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo: syncml_tk/src/sml/xlt/all/xltencwbxml.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencwbxml.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltencwbxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltencwbxml.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencwbxml.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencwbxml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltencwbxml.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltencwbxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltencwbxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltencwbxml.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo: syncml_tk/src/sml/xlt/all/xltencxml.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencxml.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltencxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltencxml.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencxml.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltencxml.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltencxml.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltencxml.lo `test -f 'syncml_tk/src/sml/xlt/all/xltencxml.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltencxml.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo: syncml_tk/src/sml/xlt/all/xltmetinf.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltmetinf.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo `test -f 'syncml_tk/src/sml/xlt/all/xltmetinf.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltmetinf.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltmetinf.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltmetinf.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltmetinf.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltmetinf.lo `test -f 'syncml_tk/src/sml/xlt/all/xltmetinf.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltmetinf.c syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo: syncml_tk/src/sml/xlt/all/xlttags.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xlttags.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo `test -f 'syncml_tk/src/sml/xlt/all/xlttags.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xlttags.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xlttags.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xlttags.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xlttags.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xlttags.lo `test -f 'syncml_tk/src/sml/xlt/all/xlttags.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xlttags.c syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo: syncml_tk/src/sml/xlt/all/xltutilstack.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -MT syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo -MD -MP -MF syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltutilstack.Tpo -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo `test -f 'syncml_tk/src/sml/xlt/all/xltutilstack.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltutilstack.c @am__fastdepCC_TRUE@ $(am__mv) syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltutilstack.Tpo syncml_tk/src/sml/xlt/all/$(DEPDIR)/libsmltk_la-xltutilstack.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='syncml_tk/src/sml/xlt/all/xltutilstack.c' object='syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libsmltk_la_CFLAGS) $(CFLAGS) -c -o syncml_tk/src/sml/xlt/all/libsmltk_la-xltutilstack.lo `test -f 'syncml_tk/src/sml/xlt/all/xltutilstack.c' || echo '$(srcdir)/'`syncml_tk/src/sml/xlt/all/xltutilstack.c platform_adapters/linux/libsynthesis_la-platform_exec.lo: platform_adapters/linux/platform_exec.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -MT platform_adapters/linux/libsynthesis_la-platform_exec.lo -MD -MP -MF platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_exec.Tpo -c -o platform_adapters/linux/libsynthesis_la-platform_exec.lo `test -f 'platform_adapters/linux/platform_exec.c' || echo '$(srcdir)/'`platform_adapters/linux/platform_exec.c @am__fastdepCC_TRUE@ $(am__mv) platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_exec.Tpo platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_exec.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='platform_adapters/linux/platform_exec.c' object='platform_adapters/linux/libsynthesis_la-platform_exec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -c -o platform_adapters/linux/libsynthesis_la-platform_exec.lo `test -f 'platform_adapters/linux/platform_exec.c' || echo '$(srcdir)/'`platform_adapters/linux/platform_exec.c platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo: platform_adapters/unix_common/platform_pipe.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -MT platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo -MD -MP -MF platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_pipe.Tpo -c -o platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo `test -f 'platform_adapters/unix_common/platform_pipe.c' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_pipe.c @am__fastdepCC_TRUE@ $(am__mv) platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_pipe.Tpo platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_pipe.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='platform_adapters/unix_common/platform_pipe.c' object='platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -c -o platform_adapters/unix_common/libsynthesis_la-platform_pipe.lo `test -f 'platform_adapters/unix_common/platform_pipe.c' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_pipe.c sysync_SDK/Sources/libsynthesis_la-SDK_util.lo: sysync_SDK/Sources/SDK_util.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-SDK_util.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_util.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-SDK_util.lo `test -f 'sysync_SDK/Sources/SDK_util.c' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_util.c @am__fastdepCC_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_util.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sysync_SDK/Sources/SDK_util.c' object='sysync_SDK/Sources/libsynthesis_la-SDK_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-SDK_util.lo `test -f 'sysync_SDK/Sources/SDK_util.c' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_util.c expat/xmlparse/libsynthesis_la-xmlparse.lo: expat/xmlparse/xmlparse.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -MT expat/xmlparse/libsynthesis_la-xmlparse.lo -MD -MP -MF expat/xmlparse/$(DEPDIR)/libsynthesis_la-xmlparse.Tpo -c -o expat/xmlparse/libsynthesis_la-xmlparse.lo `test -f 'expat/xmlparse/xmlparse.c' || echo '$(srcdir)/'`expat/xmlparse/xmlparse.c @am__fastdepCC_TRUE@ $(am__mv) expat/xmlparse/$(DEPDIR)/libsynthesis_la-xmlparse.Tpo expat/xmlparse/$(DEPDIR)/libsynthesis_la-xmlparse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='expat/xmlparse/xmlparse.c' object='expat/xmlparse/libsynthesis_la-xmlparse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -c -o expat/xmlparse/libsynthesis_la-xmlparse.lo `test -f 'expat/xmlparse/xmlparse.c' || echo '$(srcdir)/'`expat/xmlparse/xmlparse.c expat/xmltok/libsynthesis_la-xmlrole.lo: expat/xmltok/xmlrole.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -MT expat/xmltok/libsynthesis_la-xmlrole.lo -MD -MP -MF expat/xmltok/$(DEPDIR)/libsynthesis_la-xmlrole.Tpo -c -o expat/xmltok/libsynthesis_la-xmlrole.lo `test -f 'expat/xmltok/xmlrole.c' || echo '$(srcdir)/'`expat/xmltok/xmlrole.c @am__fastdepCC_TRUE@ $(am__mv) expat/xmltok/$(DEPDIR)/libsynthesis_la-xmlrole.Tpo expat/xmltok/$(DEPDIR)/libsynthesis_la-xmlrole.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='expat/xmltok/xmlrole.c' object='expat/xmltok/libsynthesis_la-xmlrole.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -c -o expat/xmltok/libsynthesis_la-xmlrole.lo `test -f 'expat/xmltok/xmlrole.c' || echo '$(srcdir)/'`expat/xmltok/xmlrole.c expat/xmltok/libsynthesis_la-xmltok.lo: expat/xmltok/xmltok.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -MT expat/xmltok/libsynthesis_la-xmltok.lo -MD -MP -MF expat/xmltok/$(DEPDIR)/libsynthesis_la-xmltok.Tpo -c -o expat/xmltok/libsynthesis_la-xmltok.lo `test -f 'expat/xmltok/xmltok.c' || echo '$(srcdir)/'`expat/xmltok/xmltok.c @am__fastdepCC_TRUE@ $(am__mv) expat/xmltok/$(DEPDIR)/libsynthesis_la-xmltok.Tpo expat/xmltok/$(DEPDIR)/libsynthesis_la-xmltok.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='expat/xmltok/xmltok.c' object='expat/xmltok/libsynthesis_la-xmltok.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CFLAGS) $(CFLAGS) -c -o expat/xmltok/libsynthesis_la-xmltok.lo `test -f 'expat/xmltok/xmltok.c' || echo '$(srcdir)/'`expat/xmltok/xmltok.c sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo: sysync_SDK/Sources/SDK_util.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CFLAGS) $(CFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_util.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo `test -f 'sysync_SDK/Sources/SDK_util.c' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_util.c @am__fastdepCC_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_util.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_util.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sysync_SDK/Sources/SDK_util.c' object='sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CFLAGS) $(CFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-SDK_util.lo `test -f 'sysync_SDK/Sources/SDK_util.c' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_util.c sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo: sysync_SDK/Sources/enginestubs.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesisstubs_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesisstubs_la_CFLAGS) $(CFLAGS) -MT sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesisstubs_la-enginestubs.Tpo -c -o sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo `test -f 'sysync_SDK/Sources/enginestubs.c' || echo '$(srcdir)/'`sysync_SDK/Sources/enginestubs.c @am__fastdepCC_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesisstubs_la-enginestubs.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesisstubs_la-enginestubs.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sysync_SDK/Sources/enginestubs.c' object='sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesisstubs_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesisstubs_la_CFLAGS) $(CFLAGS) -c -o sysync_SDK/Sources/libsynthesisstubs_la-enginestubs.lo `test -f 'sysync_SDK/Sources/enginestubs.c' || echo '$(srcdir)/'`sysync_SDK/Sources/enginestubs.c .cpp.o: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo: DB_interfaces/api_db/DLL_interface.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo -MD -MP -MF DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-DLL_interface.Tpo -c -o DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo `test -f 'DB_interfaces/api_db/DLL_interface.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/DLL_interface.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-DLL_interface.Tpo DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-DLL_interface.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/api_db/DLL_interface.cpp' object='DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/api_db/libsynthesis_la-DLL_interface.lo `test -f 'DB_interfaces/api_db/DLL_interface.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/DLL_interface.cpp DB_interfaces/api_db/libsynthesis_la-dbapi.lo: DB_interfaces/api_db/dbapi.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/api_db/libsynthesis_la-dbapi.lo -MD -MP -MF DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-dbapi.Tpo -c -o DB_interfaces/api_db/libsynthesis_la-dbapi.lo `test -f 'DB_interfaces/api_db/dbapi.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/dbapi.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-dbapi.Tpo DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-dbapi.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/api_db/dbapi.cpp' object='DB_interfaces/api_db/libsynthesis_la-dbapi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/api_db/libsynthesis_la-dbapi.lo `test -f 'DB_interfaces/api_db/dbapi.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/dbapi.cpp DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo: DB_interfaces/api_db/pluginapiagent.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo -MD -MP -MF DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapiagent.Tpo -c -o DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo `test -f 'DB_interfaces/api_db/pluginapiagent.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/pluginapiagent.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapiagent.Tpo DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapiagent.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/api_db/pluginapiagent.cpp' object='DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/api_db/libsynthesis_la-pluginapiagent.lo `test -f 'DB_interfaces/api_db/pluginapiagent.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/pluginapiagent.cpp DB_interfaces/api_db/libsynthesis_la-pluginapids.lo: DB_interfaces/api_db/pluginapids.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/api_db/libsynthesis_la-pluginapids.lo -MD -MP -MF DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapids.Tpo -c -o DB_interfaces/api_db/libsynthesis_la-pluginapids.lo `test -f 'DB_interfaces/api_db/pluginapids.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/pluginapids.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapids.Tpo DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-pluginapids.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/api_db/pluginapids.cpp' object='DB_interfaces/api_db/libsynthesis_la-pluginapids.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/api_db/libsynthesis_la-pluginapids.lo `test -f 'DB_interfaces/api_db/pluginapids.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/pluginapids.cpp DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo: DB_interfaces/api_db/sync_dbapiconnect.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo -MD -MP -MF DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-sync_dbapiconnect.Tpo -c -o DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo `test -f 'DB_interfaces/api_db/sync_dbapiconnect.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/sync_dbapiconnect.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-sync_dbapiconnect.Tpo DB_interfaces/api_db/$(DEPDIR)/libsynthesis_la-sync_dbapiconnect.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/api_db/sync_dbapiconnect.cpp' object='DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/api_db/libsynthesis_la-sync_dbapiconnect.lo `test -f 'DB_interfaces/api_db/sync_dbapiconnect.cpp' || echo '$(srcdir)/'`DB_interfaces/api_db/sync_dbapiconnect.cpp DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo: DB_interfaces/odbc_db/odbcapiagent.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo -MD -MP -MF DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapiagent.Tpo -c -o DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo `test -f 'DB_interfaces/odbc_db/odbcapiagent.cpp' || echo '$(srcdir)/'`DB_interfaces/odbc_db/odbcapiagent.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapiagent.Tpo DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapiagent.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/odbc_db/odbcapiagent.cpp' object='DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/odbc_db/libsynthesis_la-odbcapiagent.lo `test -f 'DB_interfaces/odbc_db/odbcapiagent.cpp' || echo '$(srcdir)/'`DB_interfaces/odbc_db/odbcapiagent.cpp DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo: DB_interfaces/odbc_db/odbcapids.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo -MD -MP -MF DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapids.Tpo -c -o DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo `test -f 'DB_interfaces/odbc_db/odbcapids.cpp' || echo '$(srcdir)/'`DB_interfaces/odbc_db/odbcapids.cpp @am__fastdepCXX_TRUE@ $(am__mv) DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapids.Tpo DB_interfaces/odbc_db/$(DEPDIR)/libsynthesis_la-odbcapids.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='DB_interfaces/odbc_db/odbcapids.cpp' object='DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o DB_interfaces/odbc_db/libsynthesis_la-odbcapids.lo `test -f 'DB_interfaces/odbc_db/odbcapids.cpp' || echo '$(srcdir)/'`DB_interfaces/odbc_db/odbcapids.cpp Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo: Transport_interfaces/engine/engineclientbase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo -MD -MP -MF Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-engineclientbase.Tpo -c -o Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo `test -f 'Transport_interfaces/engine/engineclientbase.cpp' || echo '$(srcdir)/'`Transport_interfaces/engine/engineclientbase.cpp @am__fastdepCXX_TRUE@ $(am__mv) Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-engineclientbase.Tpo Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-engineclientbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Transport_interfaces/engine/engineclientbase.cpp' object='Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o Transport_interfaces/engine/libsynthesis_la-engineclientbase.lo `test -f 'Transport_interfaces/engine/engineclientbase.cpp' || echo '$(srcdir)/'`Transport_interfaces/engine/engineclientbase.cpp Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo: Transport_interfaces/engine/enginesessiondispatch.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo -MD -MP -MF Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-enginesessiondispatch.Tpo -c -o Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo `test -f 'Transport_interfaces/engine/enginesessiondispatch.cpp' || echo '$(srcdir)/'`Transport_interfaces/engine/enginesessiondispatch.cpp @am__fastdepCXX_TRUE@ $(am__mv) Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-enginesessiondispatch.Tpo Transport_interfaces/engine/$(DEPDIR)/libsynthesis_la-enginesessiondispatch.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Transport_interfaces/engine/enginesessiondispatch.cpp' object='Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o Transport_interfaces/engine/libsynthesis_la-enginesessiondispatch.lo `test -f 'Transport_interfaces/engine/enginesessiondispatch.cpp' || echo '$(srcdir)/'`Transport_interfaces/engine/enginesessiondispatch.cpp platform_adapters/libsynthesis_la-binfile.lo: platform_adapters/binfile.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/libsynthesis_la-binfile.lo -MD -MP -MF platform_adapters/$(DEPDIR)/libsynthesis_la-binfile.Tpo -c -o platform_adapters/libsynthesis_la-binfile.lo `test -f 'platform_adapters/binfile.cpp' || echo '$(srcdir)/'`platform_adapters/binfile.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/$(DEPDIR)/libsynthesis_la-binfile.Tpo platform_adapters/$(DEPDIR)/libsynthesis_la-binfile.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/binfile.cpp' object='platform_adapters/libsynthesis_la-binfile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/libsynthesis_la-binfile.lo `test -f 'platform_adapters/binfile.cpp' || echo '$(srcdir)/'`platform_adapters/binfile.cpp platform_adapters/linux/libsynthesis_la-configfiles.lo: platform_adapters/linux/configfiles.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/linux/libsynthesis_la-configfiles.lo -MD -MP -MF platform_adapters/linux/$(DEPDIR)/libsynthesis_la-configfiles.Tpo -c -o platform_adapters/linux/libsynthesis_la-configfiles.lo `test -f 'platform_adapters/linux/configfiles.cpp' || echo '$(srcdir)/'`platform_adapters/linux/configfiles.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/linux/$(DEPDIR)/libsynthesis_la-configfiles.Tpo platform_adapters/linux/$(DEPDIR)/libsynthesis_la-configfiles.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/linux/configfiles.cpp' object='platform_adapters/linux/libsynthesis_la-configfiles.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/linux/libsynthesis_la-configfiles.lo `test -f 'platform_adapters/linux/configfiles.cpp' || echo '$(srcdir)/'`platform_adapters/linux/configfiles.cpp platform_adapters/linux/libsynthesis_la-platform_DLL.lo: platform_adapters/linux/platform_DLL.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/linux/libsynthesis_la-platform_DLL.lo -MD -MP -MF platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_DLL.Tpo -c -o platform_adapters/linux/libsynthesis_la-platform_DLL.lo `test -f 'platform_adapters/linux/platform_DLL.cpp' || echo '$(srcdir)/'`platform_adapters/linux/platform_DLL.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_DLL.Tpo platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_DLL.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/linux/platform_DLL.cpp' object='platform_adapters/linux/libsynthesis_la-platform_DLL.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/linux/libsynthesis_la-platform_DLL.lo `test -f 'platform_adapters/linux/platform_DLL.cpp' || echo '$(srcdir)/'`platform_adapters/linux/platform_DLL.cpp platform_adapters/linux/libsynthesis_la-platform_time.lo: platform_adapters/linux/platform_time.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/linux/libsynthesis_la-platform_time.lo -MD -MP -MF platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_time.Tpo -c -o platform_adapters/linux/libsynthesis_la-platform_time.lo `test -f 'platform_adapters/linux/platform_time.cpp' || echo '$(srcdir)/'`platform_adapters/linux/platform_time.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_time.Tpo platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_time.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/linux/platform_time.cpp' object='platform_adapters/linux/libsynthesis_la-platform_time.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/linux/libsynthesis_la-platform_time.lo `test -f 'platform_adapters/linux/platform_time.cpp' || echo '$(srcdir)/'`platform_adapters/linux/platform_time.cpp platform_adapters/linux/libsynthesis_la-platform_timezones.lo: platform_adapters/linux/platform_timezones.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/linux/libsynthesis_la-platform_timezones.lo -MD -MP -MF platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_timezones.Tpo -c -o platform_adapters/linux/libsynthesis_la-platform_timezones.lo `test -f 'platform_adapters/linux/platform_timezones.cpp' || echo '$(srcdir)/'`platform_adapters/linux/platform_timezones.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_timezones.Tpo platform_adapters/linux/$(DEPDIR)/libsynthesis_la-platform_timezones.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/linux/platform_timezones.cpp' object='platform_adapters/linux/libsynthesis_la-platform_timezones.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/linux/libsynthesis_la-platform_timezones.lo `test -f 'platform_adapters/linux/platform_timezones.cpp' || echo '$(srcdir)/'`platform_adapters/linux/platform_timezones.cpp platform_adapters/linux/libsynthesis_la-profiling.lo: platform_adapters/linux/profiling.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/linux/libsynthesis_la-profiling.lo -MD -MP -MF platform_adapters/linux/$(DEPDIR)/libsynthesis_la-profiling.Tpo -c -o platform_adapters/linux/libsynthesis_la-profiling.lo `test -f 'platform_adapters/linux/profiling.cpp' || echo '$(srcdir)/'`platform_adapters/linux/profiling.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/linux/$(DEPDIR)/libsynthesis_la-profiling.Tpo platform_adapters/linux/$(DEPDIR)/libsynthesis_la-profiling.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/linux/profiling.cpp' object='platform_adapters/linux/libsynthesis_la-profiling.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/linux/libsynthesis_la-profiling.lo `test -f 'platform_adapters/linux/profiling.cpp' || echo '$(srcdir)/'`platform_adapters/linux/profiling.cpp platform_adapters/libsynthesis_la-sysyncinit.lo: platform_adapters/sysyncinit.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/libsynthesis_la-sysyncinit.lo -MD -MP -MF platform_adapters/$(DEPDIR)/libsynthesis_la-sysyncinit.Tpo -c -o platform_adapters/libsynthesis_la-sysyncinit.lo `test -f 'platform_adapters/sysyncinit.cpp' || echo '$(srcdir)/'`platform_adapters/sysyncinit.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/$(DEPDIR)/libsynthesis_la-sysyncinit.Tpo platform_adapters/$(DEPDIR)/libsynthesis_la-sysyncinit.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/sysyncinit.cpp' object='platform_adapters/libsynthesis_la-sysyncinit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/libsynthesis_la-sysyncinit.lo `test -f 'platform_adapters/sysyncinit.cpp' || echo '$(srcdir)/'`platform_adapters/sysyncinit.cpp platform_adapters/unix_common/libsynthesis_la-platform_file.lo: platform_adapters/unix_common/platform_file.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/unix_common/libsynthesis_la-platform_file.lo -MD -MP -MF platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_file.Tpo -c -o platform_adapters/unix_common/libsynthesis_la-platform_file.lo `test -f 'platform_adapters/unix_common/platform_file.cpp' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_file.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_file.Tpo platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_file.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/unix_common/platform_file.cpp' object='platform_adapters/unix_common/libsynthesis_la-platform_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/unix_common/libsynthesis_la-platform_file.lo `test -f 'platform_adapters/unix_common/platform_file.cpp' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_file.cpp platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo: platform_adapters/unix_common/platform_mutex.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo -MD -MP -MF platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_mutex.Tpo -c -o platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo `test -f 'platform_adapters/unix_common/platform_mutex.cpp' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_mutex.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_mutex.Tpo platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_mutex.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/unix_common/platform_mutex.cpp' object='platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/unix_common/libsynthesis_la-platform_mutex.lo `test -f 'platform_adapters/unix_common/platform_mutex.cpp' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_mutex.cpp platform_adapters/unix_common/libsynthesis_la-platform_thread.lo: platform_adapters/unix_common/platform_thread.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT platform_adapters/unix_common/libsynthesis_la-platform_thread.lo -MD -MP -MF platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_thread.Tpo -c -o platform_adapters/unix_common/libsynthesis_la-platform_thread.lo `test -f 'platform_adapters/unix_common/platform_thread.cpp' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_thread.cpp @am__fastdepCXX_TRUE@ $(am__mv) platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_thread.Tpo platform_adapters/unix_common/$(DEPDIR)/libsynthesis_la-platform_thread.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='platform_adapters/unix_common/platform_thread.cpp' object='platform_adapters/unix_common/libsynthesis_la-platform_thread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o platform_adapters/unix_common/libsynthesis_la-platform_thread.lo `test -f 'platform_adapters/unix_common/platform_thread.cpp' || echo '$(srcdir)/'`platform_adapters/unix_common/platform_thread.cpp syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo: syncapps/clientEngine_custom/clientengine_custom_Base.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo -MD -MP -MF syncapps/clientEngine_custom/$(DEPDIR)/libsynthesis_la-clientengine_custom_Base.Tpo -c -o syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo `test -f 'syncapps/clientEngine_custom/clientengine_custom_Base.cpp' || echo '$(srcdir)/'`syncapps/clientEngine_custom/clientengine_custom_Base.cpp @am__fastdepCXX_TRUE@ $(am__mv) syncapps/clientEngine_custom/$(DEPDIR)/libsynthesis_la-clientengine_custom_Base.Tpo syncapps/clientEngine_custom/$(DEPDIR)/libsynthesis_la-clientengine_custom_Base.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='syncapps/clientEngine_custom/clientengine_custom_Base.cpp' object='syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o syncapps/clientEngine_custom/libsynthesis_la-clientengine_custom_Base.lo `test -f 'syncapps/clientEngine_custom/clientengine_custom_Base.cpp' || echo '$(srcdir)/'`syncapps/clientEngine_custom/clientengine_custom_Base.cpp syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo: syncapps/serverEngine_custom/serverengine_custom_Base.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo -MD -MP -MF syncapps/serverEngine_custom/$(DEPDIR)/libsynthesis_la-serverengine_custom_Base.Tpo -c -o syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo `test -f 'syncapps/serverEngine_custom/serverengine_custom_Base.cpp' || echo '$(srcdir)/'`syncapps/serverEngine_custom/serverengine_custom_Base.cpp @am__fastdepCXX_TRUE@ $(am__mv) syncapps/serverEngine_custom/$(DEPDIR)/libsynthesis_la-serverengine_custom_Base.Tpo syncapps/serverEngine_custom/$(DEPDIR)/libsynthesis_la-serverengine_custom_Base.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='syncapps/serverEngine_custom/serverengine_custom_Base.cpp' object='syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o syncapps/serverEngine_custom/libsynthesis_la-serverengine_custom_Base.lo `test -f 'syncapps/serverEngine_custom/serverengine_custom_Base.cpp' || echo '$(srcdir)/'`syncapps/serverEngine_custom/serverengine_custom_Base.cpp sysync/libsynthesis_la-binfilebase.lo: sysync/binfilebase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-binfilebase.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-binfilebase.Tpo -c -o sysync/libsynthesis_la-binfilebase.lo `test -f 'sysync/binfilebase.cpp' || echo '$(srcdir)/'`sysync/binfilebase.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-binfilebase.Tpo sysync/$(DEPDIR)/libsynthesis_la-binfilebase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/binfilebase.cpp' object='sysync/libsynthesis_la-binfilebase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-binfilebase.lo `test -f 'sysync/binfilebase.cpp' || echo '$(srcdir)/'`sysync/binfilebase.cpp sysync/libsynthesis_la-binfileimplclient.lo: sysync/binfileimplclient.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-binfileimplclient.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-binfileimplclient.Tpo -c -o sysync/libsynthesis_la-binfileimplclient.lo `test -f 'sysync/binfileimplclient.cpp' || echo '$(srcdir)/'`sysync/binfileimplclient.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-binfileimplclient.Tpo sysync/$(DEPDIR)/libsynthesis_la-binfileimplclient.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/binfileimplclient.cpp' object='sysync/libsynthesis_la-binfileimplclient.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-binfileimplclient.lo `test -f 'sysync/binfileimplclient.cpp' || echo '$(srcdir)/'`sysync/binfileimplclient.cpp sysync/libsynthesis_la-binfileimplds.lo: sysync/binfileimplds.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-binfileimplds.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-binfileimplds.Tpo -c -o sysync/libsynthesis_la-binfileimplds.lo `test -f 'sysync/binfileimplds.cpp' || echo '$(srcdir)/'`sysync/binfileimplds.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-binfileimplds.Tpo sysync/$(DEPDIR)/libsynthesis_la-binfileimplds.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/binfileimplds.cpp' object='sysync/libsynthesis_la-binfileimplds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-binfileimplds.lo `test -f 'sysync/binfileimplds.cpp' || echo '$(srcdir)/'`sysync/binfileimplds.cpp sysync/libsynthesis_la-clientautosync_inc.lo: sysync/clientautosync_inc.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-clientautosync_inc.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-clientautosync_inc.Tpo -c -o sysync/libsynthesis_la-clientautosync_inc.lo `test -f 'sysync/clientautosync_inc.cpp' || echo '$(srcdir)/'`sysync/clientautosync_inc.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-clientautosync_inc.Tpo sysync/$(DEPDIR)/libsynthesis_la-clientautosync_inc.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/clientautosync_inc.cpp' object='sysync/libsynthesis_la-clientautosync_inc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-clientautosync_inc.lo `test -f 'sysync/clientautosync_inc.cpp' || echo '$(srcdir)/'`sysync/clientautosync_inc.cpp sysync/libsynthesis_la-configelement.lo: sysync/configelement.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-configelement.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-configelement.Tpo -c -o sysync/libsynthesis_la-configelement.lo `test -f 'sysync/configelement.cpp' || echo '$(srcdir)/'`sysync/configelement.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-configelement.Tpo sysync/$(DEPDIR)/libsynthesis_la-configelement.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/configelement.cpp' object='sysync/libsynthesis_la-configelement.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-configelement.lo `test -f 'sysync/configelement.cpp' || echo '$(srcdir)/'`sysync/configelement.cpp sysync/libsynthesis_la-customimplagent.lo: sysync/customimplagent.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-customimplagent.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-customimplagent.Tpo -c -o sysync/libsynthesis_la-customimplagent.lo `test -f 'sysync/customimplagent.cpp' || echo '$(srcdir)/'`sysync/customimplagent.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-customimplagent.Tpo sysync/$(DEPDIR)/libsynthesis_la-customimplagent.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/customimplagent.cpp' object='sysync/libsynthesis_la-customimplagent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-customimplagent.lo `test -f 'sysync/customimplagent.cpp' || echo '$(srcdir)/'`sysync/customimplagent.cpp sysync/libsynthesis_la-customimplds.lo: sysync/customimplds.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-customimplds.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-customimplds.Tpo -c -o sysync/libsynthesis_la-customimplds.lo `test -f 'sysync/customimplds.cpp' || echo '$(srcdir)/'`sysync/customimplds.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-customimplds.Tpo sysync/$(DEPDIR)/libsynthesis_la-customimplds.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/customimplds.cpp' object='sysync/libsynthesis_la-customimplds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-customimplds.lo `test -f 'sysync/customimplds.cpp' || echo '$(srcdir)/'`sysync/customimplds.cpp sysync/libsynthesis_la-dataconversion.lo: sysync/dataconversion.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-dataconversion.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-dataconversion.Tpo -c -o sysync/libsynthesis_la-dataconversion.lo `test -f 'sysync/dataconversion.cpp' || echo '$(srcdir)/'`sysync/dataconversion.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-dataconversion.Tpo sysync/$(DEPDIR)/libsynthesis_la-dataconversion.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/dataconversion.cpp' object='sysync/libsynthesis_la-dataconversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-dataconversion.lo `test -f 'sysync/dataconversion.cpp' || echo '$(srcdir)/'`sysync/dataconversion.cpp sysync/libsynthesis_la-dataobjtype.lo: sysync/dataobjtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-dataobjtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-dataobjtype.Tpo -c -o sysync/libsynthesis_la-dataobjtype.lo `test -f 'sysync/dataobjtype.cpp' || echo '$(srcdir)/'`sysync/dataobjtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-dataobjtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-dataobjtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/dataobjtype.cpp' object='sysync/libsynthesis_la-dataobjtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-dataobjtype.lo `test -f 'sysync/dataobjtype.cpp' || echo '$(srcdir)/'`sysync/dataobjtype.cpp sysync/libsynthesis_la-debuglogger.lo: sysync/debuglogger.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-debuglogger.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-debuglogger.Tpo -c -o sysync/libsynthesis_la-debuglogger.lo `test -f 'sysync/debuglogger.cpp' || echo '$(srcdir)/'`sysync/debuglogger.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-debuglogger.Tpo sysync/$(DEPDIR)/libsynthesis_la-debuglogger.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/debuglogger.cpp' object='sysync/libsynthesis_la-debuglogger.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-debuglogger.lo `test -f 'sysync/debuglogger.cpp' || echo '$(srcdir)/'`sysync/debuglogger.cpp sysync/libsynthesis_la-engineentry.lo: sysync/engineentry.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-engineentry.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-engineentry.Tpo -c -o sysync/libsynthesis_la-engineentry.lo `test -f 'sysync/engineentry.cpp' || echo '$(srcdir)/'`sysync/engineentry.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-engineentry.Tpo sysync/$(DEPDIR)/libsynthesis_la-engineentry.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/engineentry.cpp' object='sysync/libsynthesis_la-engineentry.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-engineentry.lo `test -f 'sysync/engineentry.cpp' || echo '$(srcdir)/'`sysync/engineentry.cpp sysync/libsynthesis_la-engineinterface.lo: sysync/engineinterface.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-engineinterface.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-engineinterface.Tpo -c -o sysync/libsynthesis_la-engineinterface.lo `test -f 'sysync/engineinterface.cpp' || echo '$(srcdir)/'`sysync/engineinterface.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-engineinterface.Tpo sysync/$(DEPDIR)/libsynthesis_la-engineinterface.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/engineinterface.cpp' object='sysync/libsynthesis_la-engineinterface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-engineinterface.lo `test -f 'sysync/engineinterface.cpp' || echo '$(srcdir)/'`sysync/engineinterface.cpp sysync/libsynthesis_la-iso8601.lo: sysync/iso8601.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-iso8601.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-iso8601.Tpo -c -o sysync/libsynthesis_la-iso8601.lo `test -f 'sysync/iso8601.cpp' || echo '$(srcdir)/'`sysync/iso8601.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-iso8601.Tpo sysync/$(DEPDIR)/libsynthesis_la-iso8601.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/iso8601.cpp' object='sysync/libsynthesis_la-iso8601.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-iso8601.lo `test -f 'sysync/iso8601.cpp' || echo '$(srcdir)/'`sysync/iso8601.cpp sysync/libsynthesis_la-itemfield.lo: sysync/itemfield.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-itemfield.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-itemfield.Tpo -c -o sysync/libsynthesis_la-itemfield.lo `test -f 'sysync/itemfield.cpp' || echo '$(srcdir)/'`sysync/itemfield.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-itemfield.Tpo sysync/$(DEPDIR)/libsynthesis_la-itemfield.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/itemfield.cpp' object='sysync/libsynthesis_la-itemfield.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-itemfield.lo `test -f 'sysync/itemfield.cpp' || echo '$(srcdir)/'`sysync/itemfield.cpp sysync/libsynthesis_la-localengineds.lo: sysync/localengineds.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-localengineds.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-localengineds.Tpo -c -o sysync/libsynthesis_la-localengineds.lo `test -f 'sysync/localengineds.cpp' || echo '$(srcdir)/'`sysync/localengineds.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-localengineds.Tpo sysync/$(DEPDIR)/libsynthesis_la-localengineds.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/localengineds.cpp' object='sysync/libsynthesis_la-localengineds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-localengineds.lo `test -f 'sysync/localengineds.cpp' || echo '$(srcdir)/'`sysync/localengineds.cpp sysync/libsynthesis_la-mimediritemtype.lo: sysync/mimediritemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-mimediritemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-mimediritemtype.Tpo -c -o sysync/libsynthesis_la-mimediritemtype.lo `test -f 'sysync/mimediritemtype.cpp' || echo '$(srcdir)/'`sysync/mimediritemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-mimediritemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-mimediritemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/mimediritemtype.cpp' object='sysync/libsynthesis_la-mimediritemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-mimediritemtype.lo `test -f 'sysync/mimediritemtype.cpp' || echo '$(srcdir)/'`sysync/mimediritemtype.cpp sysync/libsynthesis_la-mimedirprofile.lo: sysync/mimedirprofile.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-mimedirprofile.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-mimedirprofile.Tpo -c -o sysync/libsynthesis_la-mimedirprofile.lo `test -f 'sysync/mimedirprofile.cpp' || echo '$(srcdir)/'`sysync/mimedirprofile.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-mimedirprofile.Tpo sysync/$(DEPDIR)/libsynthesis_la-mimedirprofile.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/mimedirprofile.cpp' object='sysync/libsynthesis_la-mimedirprofile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-mimedirprofile.lo `test -f 'sysync/mimedirprofile.cpp' || echo '$(srcdir)/'`sysync/mimedirprofile.cpp sysync/libsynthesis_la-multifielditem.lo: sysync/multifielditem.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-multifielditem.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-multifielditem.Tpo -c -o sysync/libsynthesis_la-multifielditem.lo `test -f 'sysync/multifielditem.cpp' || echo '$(srcdir)/'`sysync/multifielditem.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-multifielditem.Tpo sysync/$(DEPDIR)/libsynthesis_la-multifielditem.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/multifielditem.cpp' object='sysync/libsynthesis_la-multifielditem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-multifielditem.lo `test -f 'sysync/multifielditem.cpp' || echo '$(srcdir)/'`sysync/multifielditem.cpp sysync/libsynthesis_la-multifielditemtype.lo: sysync/multifielditemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-multifielditemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-multifielditemtype.Tpo -c -o sysync/libsynthesis_la-multifielditemtype.lo `test -f 'sysync/multifielditemtype.cpp' || echo '$(srcdir)/'`sysync/multifielditemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-multifielditemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-multifielditemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/multifielditemtype.cpp' object='sysync/libsynthesis_la-multifielditemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-multifielditemtype.lo `test -f 'sysync/multifielditemtype.cpp' || echo '$(srcdir)/'`sysync/multifielditemtype.cpp sysync/libsynthesis_la-rawdataitemtype.lo: sysync/rawdataitemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-rawdataitemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-rawdataitemtype.Tpo -c -o sysync/libsynthesis_la-rawdataitemtype.lo `test -f 'sysync/rawdataitemtype.cpp' || echo '$(srcdir)/'`sysync/rawdataitemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-rawdataitemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-rawdataitemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/rawdataitemtype.cpp' object='sysync/libsynthesis_la-rawdataitemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-rawdataitemtype.lo `test -f 'sysync/rawdataitemtype.cpp' || echo '$(srcdir)/'`sysync/rawdataitemtype.cpp sysync/libsynthesis_la-remotedatastore.lo: sysync/remotedatastore.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-remotedatastore.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-remotedatastore.Tpo -c -o sysync/libsynthesis_la-remotedatastore.lo `test -f 'sysync/remotedatastore.cpp' || echo '$(srcdir)/'`sysync/remotedatastore.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-remotedatastore.Tpo sysync/$(DEPDIR)/libsynthesis_la-remotedatastore.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/remotedatastore.cpp' object='sysync/libsynthesis_la-remotedatastore.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-remotedatastore.lo `test -f 'sysync/remotedatastore.cpp' || echo '$(srcdir)/'`sysync/remotedatastore.cpp sysync/libsynthesis_la-rrules.lo: sysync/rrules.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-rrules.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-rrules.Tpo -c -o sysync/libsynthesis_la-rrules.lo `test -f 'sysync/rrules.cpp' || echo '$(srcdir)/'`sysync/rrules.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-rrules.Tpo sysync/$(DEPDIR)/libsynthesis_la-rrules.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/rrules.cpp' object='sysync/libsynthesis_la-rrules.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-rrules.lo `test -f 'sysync/rrules.cpp' || echo '$(srcdir)/'`sysync/rrules.cpp sysync/libsynthesis_la-scriptcontext.lo: sysync/scriptcontext.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-scriptcontext.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-scriptcontext.Tpo -c -o sysync/libsynthesis_la-scriptcontext.lo `test -f 'sysync/scriptcontext.cpp' || echo '$(srcdir)/'`sysync/scriptcontext.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-scriptcontext.Tpo sysync/$(DEPDIR)/libsynthesis_la-scriptcontext.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/scriptcontext.cpp' object='sysync/libsynthesis_la-scriptcontext.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-scriptcontext.lo `test -f 'sysync/scriptcontext.cpp' || echo '$(srcdir)/'`sysync/scriptcontext.cpp sysync/libsynthesis_la-simpleitem.lo: sysync/simpleitem.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-simpleitem.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-simpleitem.Tpo -c -o sysync/libsynthesis_la-simpleitem.lo `test -f 'sysync/simpleitem.cpp' || echo '$(srcdir)/'`sysync/simpleitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-simpleitem.Tpo sysync/$(DEPDIR)/libsynthesis_la-simpleitem.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/simpleitem.cpp' object='sysync/libsynthesis_la-simpleitem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-simpleitem.lo `test -f 'sysync/simpleitem.cpp' || echo '$(srcdir)/'`sysync/simpleitem.cpp sysync/libsynthesis_la-stdlogicagent.lo: sysync/stdlogicagent.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-stdlogicagent.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-stdlogicagent.Tpo -c -o sysync/libsynthesis_la-stdlogicagent.lo `test -f 'sysync/stdlogicagent.cpp' || echo '$(srcdir)/'`sysync/stdlogicagent.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-stdlogicagent.Tpo sysync/$(DEPDIR)/libsynthesis_la-stdlogicagent.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/stdlogicagent.cpp' object='sysync/libsynthesis_la-stdlogicagent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-stdlogicagent.lo `test -f 'sysync/stdlogicagent.cpp' || echo '$(srcdir)/'`sysync/stdlogicagent.cpp sysync/libsynthesis_la-stdlogicds.lo: sysync/stdlogicds.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-stdlogicds.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-stdlogicds.Tpo -c -o sysync/libsynthesis_la-stdlogicds.lo `test -f 'sysync/stdlogicds.cpp' || echo '$(srcdir)/'`sysync/stdlogicds.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-stdlogicds.Tpo sysync/$(DEPDIR)/libsynthesis_la-stdlogicds.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/stdlogicds.cpp' object='sysync/libsynthesis_la-stdlogicds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-stdlogicds.lo `test -f 'sysync/stdlogicds.cpp' || echo '$(srcdir)/'`sysync/stdlogicds.cpp sysync/libsynthesis_la-stringutils.lo: sysync/stringutils.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-stringutils.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-stringutils.Tpo -c -o sysync/libsynthesis_la-stringutils.lo `test -f 'sysync/stringutils.cpp' || echo '$(srcdir)/'`sysync/stringutils.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-stringutils.Tpo sysync/$(DEPDIR)/libsynthesis_la-stringutils.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/stringutils.cpp' object='sysync/libsynthesis_la-stringutils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-stringutils.lo `test -f 'sysync/stringutils.cpp' || echo '$(srcdir)/'`sysync/stringutils.cpp sysync/libsynthesis_la-superdatastore.lo: sysync/superdatastore.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-superdatastore.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-superdatastore.Tpo -c -o sysync/libsynthesis_la-superdatastore.lo `test -f 'sysync/superdatastore.cpp' || echo '$(srcdir)/'`sysync/superdatastore.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-superdatastore.Tpo sysync/$(DEPDIR)/libsynthesis_la-superdatastore.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/superdatastore.cpp' object='sysync/libsynthesis_la-superdatastore.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-superdatastore.lo `test -f 'sysync/superdatastore.cpp' || echo '$(srcdir)/'`sysync/superdatastore.cpp sysync/libsynthesis_la-syncagent.lo: sysync/syncagent.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncagent.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncagent.Tpo -c -o sysync/libsynthesis_la-syncagent.lo `test -f 'sysync/syncagent.cpp' || echo '$(srcdir)/'`sysync/syncagent.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncagent.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncagent.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncagent.cpp' object='sysync/libsynthesis_la-syncagent.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncagent.lo `test -f 'sysync/syncagent.cpp' || echo '$(srcdir)/'`sysync/syncagent.cpp sysync/libsynthesis_la-syncappbase.lo: sysync/syncappbase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncappbase.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncappbase.Tpo -c -o sysync/libsynthesis_la-syncappbase.lo `test -f 'sysync/syncappbase.cpp' || echo '$(srcdir)/'`sysync/syncappbase.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncappbase.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncappbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncappbase.cpp' object='sysync/libsynthesis_la-syncappbase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncappbase.lo `test -f 'sysync/syncappbase.cpp' || echo '$(srcdir)/'`sysync/syncappbase.cpp sysync/libsynthesis_la-syncclientbase.lo: sysync/syncclientbase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncclientbase.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncclientbase.Tpo -c -o sysync/libsynthesis_la-syncclientbase.lo `test -f 'sysync/syncclientbase.cpp' || echo '$(srcdir)/'`sysync/syncclientbase.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncclientbase.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncclientbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncclientbase.cpp' object='sysync/libsynthesis_la-syncclientbase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncclientbase.lo `test -f 'sysync/syncclientbase.cpp' || echo '$(srcdir)/'`sysync/syncclientbase.cpp sysync/libsynthesis_la-synccommand.lo: sysync/synccommand.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-synccommand.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-synccommand.Tpo -c -o sysync/libsynthesis_la-synccommand.lo `test -f 'sysync/synccommand.cpp' || echo '$(srcdir)/'`sysync/synccommand.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-synccommand.Tpo sysync/$(DEPDIR)/libsynthesis_la-synccommand.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/synccommand.cpp' object='sysync/libsynthesis_la-synccommand.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-synccommand.lo `test -f 'sysync/synccommand.cpp' || echo '$(srcdir)/'`sysync/synccommand.cpp sysync/libsynthesis_la-syncdatastore.lo: sysync/syncdatastore.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncdatastore.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncdatastore.Tpo -c -o sysync/libsynthesis_la-syncdatastore.lo `test -f 'sysync/syncdatastore.cpp' || echo '$(srcdir)/'`sysync/syncdatastore.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncdatastore.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncdatastore.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncdatastore.cpp' object='sysync/libsynthesis_la-syncdatastore.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncdatastore.lo `test -f 'sysync/syncdatastore.cpp' || echo '$(srcdir)/'`sysync/syncdatastore.cpp sysync/libsynthesis_la-syncitem.lo: sysync/syncitem.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncitem.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncitem.Tpo -c -o sysync/libsynthesis_la-syncitem.lo `test -f 'sysync/syncitem.cpp' || echo '$(srcdir)/'`sysync/syncitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncitem.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncitem.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncitem.cpp' object='sysync/libsynthesis_la-syncitem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncitem.lo `test -f 'sysync/syncitem.cpp' || echo '$(srcdir)/'`sysync/syncitem.cpp sysync/libsynthesis_la-syncitemtype.lo: sysync/syncitemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncitemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncitemtype.Tpo -c -o sysync/libsynthesis_la-syncitemtype.lo `test -f 'sysync/syncitemtype.cpp' || echo '$(srcdir)/'`sysync/syncitemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncitemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncitemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncitemtype.cpp' object='sysync/libsynthesis_la-syncitemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncitemtype.lo `test -f 'sysync/syncitemtype.cpp' || echo '$(srcdir)/'`sysync/syncitemtype.cpp sysync/libsynthesis_la-syncsession.lo: sysync/syncsession.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-syncsession.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-syncsession.Tpo -c -o sysync/libsynthesis_la-syncsession.lo `test -f 'sysync/syncsession.cpp' || echo '$(srcdir)/'`sysync/syncsession.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-syncsession.Tpo sysync/$(DEPDIR)/libsynthesis_la-syncsession.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/syncsession.cpp' object='sysync/libsynthesis_la-syncsession.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-syncsession.lo `test -f 'sysync/syncsession.cpp' || echo '$(srcdir)/'`sysync/syncsession.cpp sysync/libsynthesis_la-sysync_crc16.lo: sysync/sysync_crc16.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-sysync_crc16.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-sysync_crc16.Tpo -c -o sysync/libsynthesis_la-sysync_crc16.lo `test -f 'sysync/sysync_crc16.cpp' || echo '$(srcdir)/'`sysync/sysync_crc16.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-sysync_crc16.Tpo sysync/$(DEPDIR)/libsynthesis_la-sysync_crc16.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/sysync_crc16.cpp' object='sysync/libsynthesis_la-sysync_crc16.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-sysync_crc16.lo `test -f 'sysync/sysync_crc16.cpp' || echo '$(srcdir)/'`sysync/sysync_crc16.cpp sysync/libsynthesis_la-textitemtype.lo: sysync/textitemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-textitemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-textitemtype.Tpo -c -o sysync/libsynthesis_la-textitemtype.lo `test -f 'sysync/textitemtype.cpp' || echo '$(srcdir)/'`sysync/textitemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-textitemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-textitemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/textitemtype.cpp' object='sysync/libsynthesis_la-textitemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-textitemtype.lo `test -f 'sysync/textitemtype.cpp' || echo '$(srcdir)/'`sysync/textitemtype.cpp sysync/libsynthesis_la-textprofile.lo: sysync/textprofile.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-textprofile.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-textprofile.Tpo -c -o sysync/libsynthesis_la-textprofile.lo `test -f 'sysync/textprofile.cpp' || echo '$(srcdir)/'`sysync/textprofile.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-textprofile.Tpo sysync/$(DEPDIR)/libsynthesis_la-textprofile.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/textprofile.cpp' object='sysync/libsynthesis_la-textprofile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-textprofile.lo `test -f 'sysync/textprofile.cpp' || echo '$(srcdir)/'`sysync/textprofile.cpp sysync/libsynthesis_la-timezones.lo: sysync/timezones.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-timezones.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-timezones.Tpo -c -o sysync/libsynthesis_la-timezones.lo `test -f 'sysync/timezones.cpp' || echo '$(srcdir)/'`sysync/timezones.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-timezones.Tpo sysync/$(DEPDIR)/libsynthesis_la-timezones.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/timezones.cpp' object='sysync/libsynthesis_la-timezones.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-timezones.lo `test -f 'sysync/timezones.cpp' || echo '$(srcdir)/'`sysync/timezones.cpp sysync/libsynthesis_la-uiapi.lo: sysync/uiapi.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-uiapi.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-uiapi.Tpo -c -o sysync/libsynthesis_la-uiapi.lo `test -f 'sysync/uiapi.cpp' || echo '$(srcdir)/'`sysync/uiapi.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-uiapi.Tpo sysync/$(DEPDIR)/libsynthesis_la-uiapi.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/uiapi.cpp' object='sysync/libsynthesis_la-uiapi.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-uiapi.lo `test -f 'sysync/uiapi.cpp' || echo '$(srcdir)/'`sysync/uiapi.cpp sysync/libsynthesis_la-vcalendaritemtype.lo: sysync/vcalendaritemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-vcalendaritemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-vcalendaritemtype.Tpo -c -o sysync/libsynthesis_la-vcalendaritemtype.lo `test -f 'sysync/vcalendaritemtype.cpp' || echo '$(srcdir)/'`sysync/vcalendaritemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-vcalendaritemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-vcalendaritemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/vcalendaritemtype.cpp' object='sysync/libsynthesis_la-vcalendaritemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-vcalendaritemtype.lo `test -f 'sysync/vcalendaritemtype.cpp' || echo '$(srcdir)/'`sysync/vcalendaritemtype.cpp sysync/libsynthesis_la-vcarditemtype.lo: sysync/vcarditemtype.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-vcarditemtype.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-vcarditemtype.Tpo -c -o sysync/libsynthesis_la-vcarditemtype.lo `test -f 'sysync/vcarditemtype.cpp' || echo '$(srcdir)/'`sysync/vcarditemtype.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-vcarditemtype.Tpo sysync/$(DEPDIR)/libsynthesis_la-vcarditemtype.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/vcarditemtype.cpp' object='sysync/libsynthesis_la-vcarditemtype.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-vcarditemtype.lo `test -f 'sysync/vcarditemtype.cpp' || echo '$(srcdir)/'`sysync/vcarditemtype.cpp sysync/libsynthesis_la-vtimezone.lo: sysync/vtimezone.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync/libsynthesis_la-vtimezone.lo -MD -MP -MF sysync/$(DEPDIR)/libsynthesis_la-vtimezone.Tpo -c -o sysync/libsynthesis_la-vtimezone.lo `test -f 'sysync/vtimezone.cpp' || echo '$(srcdir)/'`sysync/vtimezone.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync/$(DEPDIR)/libsynthesis_la-vtimezone.Tpo sysync/$(DEPDIR)/libsynthesis_la-vtimezone.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync/vtimezone.cpp' object='sysync/libsynthesis_la-vtimezone.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync/libsynthesis_la-vtimezone.lo `test -f 'sysync/vtimezone.cpp' || echo '$(srcdir)/'`sysync/vtimezone.cpp sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo: sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo -MD -MP -MF sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/libsynthesis_la-sync_dbapi_text.Tpo -c -o sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo `test -f 'sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp' || echo '$(srcdir)/'`sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/libsynthesis_la-sync_dbapi_text.Tpo sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/libsynthesis_la-sync_dbapi_text.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp' object='sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/DB_Interfaces/text_db/libsynthesis_la-sync_dbapi_text.lo `test -f 'sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp' || echo '$(srcdir)/'`sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp sysync_SDK/Sources/libsynthesis_la-SDK_support.lo: sysync_SDK/Sources/SDK_support.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-SDK_support.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_support.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_support.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-SDK_support.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/SDK_support.cpp' object='sysync_SDK/Sources/libsynthesis_la-SDK_support.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/libsynthesis_la-admindata.lo: sysync_SDK/Sources/admindata.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-admindata.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-admindata.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-admindata.lo `test -f 'sysync_SDK/Sources/admindata.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/admindata.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-admindata.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-admindata.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/admindata.cpp' object='sysync_SDK/Sources/libsynthesis_la-admindata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-admindata.lo `test -f 'sysync_SDK/Sources/admindata.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/admindata.cpp sysync_SDK/Sources/libsynthesis_la-blobs.lo: sysync_SDK/Sources/blobs.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-blobs.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-blobs.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-blobs.lo `test -f 'sysync_SDK/Sources/blobs.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/blobs.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-blobs.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-blobs.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/blobs.cpp' object='sysync_SDK/Sources/libsynthesis_la-blobs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-blobs.lo `test -f 'sysync_SDK/Sources/blobs.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/libsynthesis_la-dbitem.lo: sysync_SDK/Sources/dbitem.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-dbitem.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-dbitem.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-dbitem.lo `test -f 'sysync_SDK/Sources/dbitem.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/dbitem.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-dbitem.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-dbitem.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/dbitem.cpp' object='sysync_SDK/Sources/libsynthesis_la-dbitem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-dbitem.lo `test -f 'sysync_SDK/Sources/dbitem.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/dbitem.cpp sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo: sysync_SDK/Sources/enginemodulebase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-enginemodulebase.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-enginemodulebase.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-enginemodulebase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/enginemodulebase.cpp' object='sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/libsynthesis_la-lineartime.lo: sysync_SDK/Sources/lineartime.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-lineartime.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-lineartime.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-lineartime.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-lineartime.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/lineartime.cpp' object='sysync_SDK/Sources/libsynthesis_la-lineartime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/libsynthesis_la-syncexception.lo: sysync_SDK/Sources/syncexception.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-syncexception.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-syncexception.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-syncexception.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-syncexception.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/syncexception.cpp' object='sysync_SDK/Sources/libsynthesis_la-syncexception.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo: sysync_SDK/Sources/sysync_b64.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_b64.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo `test -f 'sysync_SDK/Sources/sysync_b64.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_b64.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_b64.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_b64.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/sysync_b64.cpp' object='sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-sysync_b64.lo `test -f 'sysync_SDK/Sources/sysync_b64.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo: sysync_SDK/Sources/sysync_md5.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_md5.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo `test -f 'sysync_SDK/Sources/sysync_md5.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_md5.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_md5.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_md5.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/sysync_md5.cpp' object='sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-sysync_md5.lo `test -f 'sysync_SDK/Sources/sysync_md5.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo: sysync_SDK/Sources/sysync_utils.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_utils.Tpo -c -o sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_utils.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesis_la-sysync_utils.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/sysync_utils.cpp' object='sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesis_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesis_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesis_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo: sysync_SDK/Sources/UI_util.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-UI_util.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo `test -f 'sysync_SDK/Sources/UI_util.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/UI_util.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-UI_util.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-UI_util.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/UI_util.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-UI_util.lo `test -f 'sysync_SDK/Sources/UI_util.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/UI_util.cpp sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo: sysync_SDK/Sources/enginemodulebridge.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebridge.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo `test -f 'sysync_SDK/Sources/enginemodulebridge.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebridge.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebridge.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebridge.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/enginemodulebridge.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-enginemodulebridge.lo `test -f 'sysync_SDK/Sources/enginemodulebridge.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebridge.cpp sysync_SDK/Sources/libsynthesissdk_la-san.lo: sysync_SDK/Sources/san.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-san.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-san.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-san.lo `test -f 'sysync_SDK/Sources/san.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/san.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-san.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-san.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/san.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-san.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-san.lo `test -f 'sysync_SDK/Sources/san.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/san.cpp sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo: sysync_SDK/Sources/timeutil.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-timeutil.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo `test -f 'sysync_SDK/Sources/timeutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/timeutil.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-timeutil.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-timeutil.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/timeutil.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-timeutil.lo `test -f 'sysync_SDK/Sources/timeutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/timeutil.cpp sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo: sysync_SDK/Sources/SDK_support.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_support.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_support.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-SDK_support.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/SDK_support.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-SDK_support.lo `test -f 'sysync_SDK/Sources/SDK_support.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/SDK_support.cpp sysync_SDK/Sources/libsynthesissdk_la-blobs.lo: sysync_SDK/Sources/blobs.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-blobs.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-blobs.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-blobs.lo `test -f 'sysync_SDK/Sources/blobs.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/blobs.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-blobs.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-blobs.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/blobs.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-blobs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-blobs.lo `test -f 'sysync_SDK/Sources/blobs.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/blobs.cpp sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo: sysync_SDK/Sources/enginemodulebase.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebase.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebase.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-enginemodulebase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/enginemodulebase.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-enginemodulebase.lo `test -f 'sysync_SDK/Sources/enginemodulebase.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/enginemodulebase.cpp sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo: sysync_SDK/Sources/lineartime.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-lineartime.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-lineartime.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-lineartime.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/lineartime.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-lineartime.lo `test -f 'sysync_SDK/Sources/lineartime.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/lineartime.cpp sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo: sysync_SDK/Sources/stringutil.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-stringutil.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo `test -f 'sysync_SDK/Sources/stringutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/stringutil.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-stringutil.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-stringutil.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/stringutil.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-stringutil.lo `test -f 'sysync_SDK/Sources/stringutil.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/stringutil.cpp sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo: sysync_SDK/Sources/syncexception.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-syncexception.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-syncexception.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-syncexception.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/syncexception.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-syncexception.lo `test -f 'sysync_SDK/Sources/syncexception.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/syncexception.cpp sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo: sysync_SDK/Sources/sysync_b64.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_b64.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo `test -f 'sysync_SDK/Sources/sysync_b64.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_b64.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_b64.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_b64.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/sysync_b64.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-sysync_b64.lo `test -f 'sysync_SDK/Sources/sysync_b64.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_b64.cpp sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo: sysync_SDK/Sources/sysync_md5.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_md5.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo `test -f 'sysync_SDK/Sources/sysync_md5.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_md5.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_md5.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_md5.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/sysync_md5.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-sysync_md5.lo `test -f 'sysync_SDK/Sources/sysync_md5.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_md5.cpp sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo: sysync_SDK/Sources/sysync_utils.cpp @am__fastdepCXX_TRUE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -MT sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo -MD -MP -MF sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_utils.Tpo -c -o sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp @am__fastdepCXX_TRUE@ $(am__mv) sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_utils.Tpo sysync_SDK/Sources/$(DEPDIR)/libsynthesissdk_la-sysync_utils.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='sysync_SDK/Sources/sysync_utils.cpp' object='sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsynthesissdk_la_CPPFLAGS) $(CPPFLAGS) $(libsynthesissdk_la_CXXFLAGS) $(CXXFLAGS) -c -o sysync_SDK/Sources/libsynthesissdk_la-sysync_utils.lo `test -f 'sysync_SDK/Sources/sysync_utils.cpp' || echo '$(srcdir)/'`sysync_SDK/Sources/sysync_utils.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf DB_interfaces/api_db/.libs DB_interfaces/api_db/_libs -rm -rf DB_interfaces/odbc_db/.libs DB_interfaces/odbc_db/_libs -rm -rf Transport_interfaces/engine/.libs Transport_interfaces/engine/_libs -rm -rf expat/xmlparse/.libs expat/xmlparse/_libs -rm -rf expat/xmltok/.libs expat/xmltok/_libs -rm -rf platform_adapters/.libs platform_adapters/_libs -rm -rf platform_adapters/linux/.libs platform_adapters/linux/_libs -rm -rf platform_adapters/unix_common/.libs platform_adapters/unix_common/_libs -rm -rf syncapps/clientEngine_custom/.libs syncapps/clientEngine_custom/_libs -rm -rf syncapps/serverEngine_custom/.libs syncapps/serverEngine_custom/_libs -rm -rf syncml_tk/src/sml/lib/all/.libs syncml_tk/src/sml/lib/all/_libs -rm -rf syncml_tk/src/sml/mgr/all/.libs syncml_tk/src/sml/mgr/all/_libs -rm -rf syncml_tk/src/sml/wsm/all/.libs syncml_tk/src/sml/wsm/all/_libs -rm -rf syncml_tk/src/sml/xlt/all/.libs syncml_tk/src/sml/xlt/all/_libs -rm -rf sysync/.libs sysync/_libs -rm -rf sysync_SDK/DB_Interfaces/text_db/.libs sysync_SDK/DB_Interfaces/text_db/_libs -rm -rf sysync_SDK/Sources/.libs sysync_SDK/Sources/_libs install-nobase_includeHEADERS: $(nobase_include_HEADERS) @$(NORMAL_INSTALL) test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo "$(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)/$$dir"; }; \ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'"; \ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(includedir)/$$dir" || exit $$?; }; \ done uninstall-nobase_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(includedir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f DB_interfaces/api_db/$(DEPDIR)/$(am__dirstamp) -rm -f DB_interfaces/api_db/$(am__dirstamp) -rm -f DB_interfaces/odbc_db/$(DEPDIR)/$(am__dirstamp) -rm -f DB_interfaces/odbc_db/$(am__dirstamp) -rm -f Transport_interfaces/engine/$(DEPDIR)/$(am__dirstamp) -rm -f Transport_interfaces/engine/$(am__dirstamp) -rm -f expat/xmlparse/$(DEPDIR)/$(am__dirstamp) -rm -f expat/xmlparse/$(am__dirstamp) -rm -f expat/xmltok/$(DEPDIR)/$(am__dirstamp) -rm -f expat/xmltok/$(am__dirstamp) -rm -f platform_adapters/$(DEPDIR)/$(am__dirstamp) -rm -f platform_adapters/$(am__dirstamp) -rm -f platform_adapters/linux/$(DEPDIR)/$(am__dirstamp) -rm -f platform_adapters/linux/$(am__dirstamp) -rm -f platform_adapters/unix_common/$(DEPDIR)/$(am__dirstamp) -rm -f platform_adapters/unix_common/$(am__dirstamp) -rm -f syncapps/clientEngine_custom/$(DEPDIR)/$(am__dirstamp) -rm -f syncapps/clientEngine_custom/$(am__dirstamp) -rm -f syncapps/serverEngine_custom/$(DEPDIR)/$(am__dirstamp) -rm -f syncapps/serverEngine_custom/$(am__dirstamp) -rm -f syncml_tk/src/sml/lib/all/$(DEPDIR)/$(am__dirstamp) -rm -f syncml_tk/src/sml/lib/all/$(am__dirstamp) -rm -f syncml_tk/src/sml/mgr/all/$(DEPDIR)/$(am__dirstamp) -rm -f syncml_tk/src/sml/mgr/all/$(am__dirstamp) -rm -f syncml_tk/src/sml/wsm/all/$(DEPDIR)/$(am__dirstamp) -rm -f syncml_tk/src/sml/wsm/all/$(am__dirstamp) -rm -f syncml_tk/src/sml/xlt/all/$(DEPDIR)/$(am__dirstamp) -rm -f syncml_tk/src/sml/xlt/all/$(am__dirstamp) -rm -f sysync/$(DEPDIR)/$(am__dirstamp) -rm -f sysync/$(am__dirstamp) -rm -f sysync_SDK/DB_Interfaces/text_db/$(DEPDIR)/$(am__dirstamp) -rm -f sysync_SDK/DB_Interfaces/text_db/$(am__dirstamp) -rm -f sysync_SDK/Sources/$(DEPDIR)/$(am__dirstamp) -rm -f sysync_SDK/Sources/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @COND_DOXYGEN_FALSE@clean-local: clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -rf DB_interfaces/api_db/$(DEPDIR) DB_interfaces/odbc_db/$(DEPDIR) Transport_interfaces/engine/$(DEPDIR) expat/xmlparse/$(DEPDIR) expat/xmltok/$(DEPDIR) platform_adapters/$(DEPDIR) platform_adapters/linux/$(DEPDIR) platform_adapters/unix_common/$(DEPDIR) syncapps/clientEngine_custom/$(DEPDIR) syncapps/serverEngine_custom/$(DEPDIR) syncml_tk/src/sml/lib/all/$(DEPDIR) syncml_tk/src/sml/mgr/all/$(DEPDIR) syncml_tk/src/sml/wsm/all/$(DEPDIR) syncml_tk/src/sml/xlt/all/$(DEPDIR) sysync/$(DEPDIR) sysync_SDK/DB_Interfaces/text_db/$(DEPDIR) sysync_SDK/Sources/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-nobase_includeHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf DB_interfaces/api_db/$(DEPDIR) DB_interfaces/odbc_db/$(DEPDIR) Transport_interfaces/engine/$(DEPDIR) expat/xmlparse/$(DEPDIR) expat/xmltok/$(DEPDIR) platform_adapters/$(DEPDIR) platform_adapters/linux/$(DEPDIR) platform_adapters/unix_common/$(DEPDIR) syncapps/clientEngine_custom/$(DEPDIR) syncapps/serverEngine_custom/$(DEPDIR) syncml_tk/src/sml/lib/all/$(DEPDIR) syncml_tk/src/sml/mgr/all/$(DEPDIR) syncml_tk/src/sml/wsm/all/$(DEPDIR) syncml_tk/src/sml/xlt/all/$(DEPDIR) sysync/$(DEPDIR) sysync_SDK/DB_Interfaces/text_db/$(DEPDIR) sysync_SDK/Sources/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES uninstall-nobase_includeHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool clean-local ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man \ install-nobase_includeHEADERS install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES \ uninstall-nobase_includeHEADERS # The Makefile.am is generated from Makefile.am.in by autogen.sh # because the list of files to compile has to be determined # dynamically. # # When adding new files or changing options rerun autogen.sh. # Beware that changes made to Makefile.am will get lost, always # edit Makefile.am.in! The following rule ensures that make # itself will rebuild its makefiles when Makefile.am.in is edited. $(srcdir)/Makefile.am: $(srcdir)/Makefile.am.in $(srcdir)/gen-makefile-am.sh cd $(srcdir) && sh ./gen-makefile-am.sh # All files needed by libsynthesissdk.a come from either # sysync_SDK/Sources (shared between engine and SDK) or # sysync_SDK/SDK (only in SDK). We patch the files so that # they include their own files via #include "synthesis/..." vpath %.cpp $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK vpath %.c $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK vpath %.h $(srcdir)/sysync_SDK/Sources $(srcdir)/sysync_SDK/SDK synthesis/SDK_support.h synthesis/SDK_util.h synthesis/UI_util.h synthesis/admindata.h synthesis/blobs.h synthesis/dataconversion.h synthesis/dbitem.h synthesis/engine_defs.h synthesis/enginemodulebase.h synthesis/enginemodulebridge.h synthesis/generic_types.h synthesis/lineartime.h synthesis/prefix_file.h synthesis/san.h synthesis/stringutil.h synthesis/syerror.h synthesis/sync_dbapi.h synthesis/sync_dbapidef.h synthesis/sync_declarations.h synthesis/sync_include.h synthesis/sync_uiapi.h synthesis/syncexception.h synthesis/sysync_b64.h synthesis/sysync_md5.h synthesis/sysync_noncopyable.h synthesis/sysync_utils.h synthesis/timeutil.h: synthesis/%: % mkdir -p synthesis sed -e 's;# *include *";#include "synthesis/;' -e 's/defined(HAVE_STDINT_H)/1/' $< >$@ synthesis/target_options.h: $(srcdir)/Targets/ReleasedProducts/SDK/target_options.h mkdir -p synthesis cp $< $@ # ensure that the header file is in place before compiling the SDK @LIBSYNTHESISSDK_SOURCES@: synthesis/target_options.h # Doxygen for complete source code as used in autotools build. # The dependency on the libs ensures that doxygen is invoked # anew when any input file for those changes, reusing the # automatic dependency tracking. A side effect (both good # and bad) is that doxygen will not be invoked on code # which does not compile. html/index.html: Doxyfile libsynthesis.la libsynthesissdk.la rm -rf html INPUT="$(srcdir)/platform_adapters $(srcdir)/syncml_tk $(srcdir)/sysync_SDK $(srcdir)/sysync $(srcdir)/DB_interfaces" \ INCLUDE_PATH="$(srcdir)/Targets/ReleasedProducts/autotools $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux $(srcdir)/sysync_SDK/Sources" \ PREDEFINED="`cat $(srcdir)/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h | grep '^#define' | grep '1 *$$' | sed -e 's/#define //' -e 's/ 1//'`" \ doxygen $< .PHONY: doxygen doxygen: html/index.html clean-doxygen: rm -rf html @COND_DOXYGEN_TRUE@all: doxygen @COND_DOXYGEN_TRUE@clean-local: clean-doxygen # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: syncevolution-1.5/src/synthesis/synthesis-sdk.pc.in0000644000373300037200000000035212424517753024267 0ustar00nightlyallusers00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: synthesis Description: Synthesis SyncML SDK Version: @VERSION@ Libs: -L${libdir} -lsynthesissdk -lsmltk -lsynthesisstubs Cflags: -I${includedir} syncevolution-1.5/src/synthesis/synthesis.pc.in0000644000373300037200000000037712424517753023517 0ustar00nightlyallusers00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: synthesis Description: Synthesis SyncML SDK, Client and Server Engine Version: @VERSION@ Libs: -L${libdir} -lsynthesissdk -lsmltk -lsynthesis Cflags: -I${includedir} syncevolution-1.5/src/synthesis/m4/0000755000373300037200000000000012424707644021046 5ustar00nightlyallusers00000000000000syncevolution-1.5/src/synthesis/m4/libtool.m40000644000373300037200000077464712424707644023005 0ustar00nightlyallusers00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 56 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl _LT_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\[$]0 --fallback-echo"')dnl " lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` ;; esac _LT_OUTPUT_LIBTOOL_INIT ]) # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) cat >"$CONFIG_LT" <<_LTEOF #! $SHELL # Generated by $as_me. # Run this file to recreate a libtool stub with the current configuration. lt_cl_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2008 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. if test "$no_create" != yes; then lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) fi ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_XSI_SHELLFNS sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES # -------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(whole_archive_flag_spec, $1)='' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX # ----------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl AC_LINK_IFELSE(AC_LANG_PROGRAM,[ lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. m4_defun([_LT_PROG_ECHO_BACKSLASH], [_LT_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac ECHO=${lt_ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF [$]* _LT_EOF exit 0 fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(lt_ECHO) ]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that does not interpret backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [AC_CHECK_TOOL(AR, ar, false) test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1]) AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line __oline__ "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[[3-9]]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method == "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC*) # IBM XL 8.0 on PPC _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl*) # IBM XL C 8.0/Fortran 10.1 on PPC _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' ;; linux* | k*bsd*-gnu) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag= tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE(int foo(void) {}, _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' ) LDFLAGS="$save_LDFLAGS" else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then _LT_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], [[If ld is used when linking, flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [fix_srcfile_path], [1], [Fix the shell variable $srcfile for the compiler]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_PROG_CXX # ------------ # Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ # compiler, we have our own version here. m4_defun([_LT_PROG_CXX], [ pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) AC_PROG_CXX if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_CXX dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_CXX], []) # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [AC_REQUIRE([_LT_PROG_CXX])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[[12]]*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=echo else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ]) dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_PROG_F77 # ------------ # Since AC_PROG_F77 is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_F77], [ pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) AC_PROG_F77 if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_F77 dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_F77], []) # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_REQUIRE([_LT_PROG_F77])dnl AC_LANG_PUSH(Fortran 77) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC CC=${F77-"f77"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_PROG_FC # ----------- # Since AC_PROG_FC is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_FC], [ pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) AC_PROG_FC if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_FC dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_FC], []) # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_REQUIRE([_LT_PROG_FC])dnl AC_LANG_PUSH(Fortran) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC CC=${FC-"f95"} compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC="$lt_save_CC" ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC GCC= CC=${RC-"windres"} compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC="$lt_save_CC" ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_XSI_SHELLFNS # --------------------- # Bourne and XSI compatible variants of some useful shell functions. m4_defun([_LT_PROG_XSI_SHELLFNS], [case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $[*] )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } dnl func_dirname_and_basename dnl A portable version of this function is already defined in general.m4sh dnl so there is no need for it here. # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[[^=]]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$[@]"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]+=\$[2]" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]=\$$[1]\$[2]" } _LT_EOF ;; esac ]) syncevolution-1.5/src/synthesis/m4/ltoptions.m40000644000373300037200000002724212424707644023352 0ustar00nightlyallusers00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [0], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) syncevolution-1.5/src/synthesis/m4/ltsugar.m40000644000373300037200000001042412424707644022772 0ustar00nightlyallusers00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) syncevolution-1.5/src/synthesis/m4/ltversion.m40000644000373300037200000000127712424707644023344 0ustar00nightlyallusers00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # Generated from ltversion.in. # serial 3017 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.2.6b]) m4_define([LT_PACKAGE_REVISION], [1.3017]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.2.6b' macro_revision='1.3017' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) syncevolution-1.5/src/synthesis/m4/lt~obsolete.m40000644000373300037200000001311312424707644023661 0ustar00nightlyallusers00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 4 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) syncevolution-1.5/src/synthesis/ltmain.sh0000755000373300037200000073341512424707644022366 0ustar00nightlyallusers00000000000000# Generated from ltmain.m4sh. # ltmain.sh (GNU libtool) 2.2.6b # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print informational messages (default) # --version print version information # -h, --help print short or long help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . PROGRAM=ltmain.sh PACKAGE=libtool VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" TIMESTAMP="" package_revision=1.3017 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # NLS nuisances: We save the old values to restore during execute mode. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done $lt_unset CDPATH : ${CP="cp -f"} : ${ECHO="echo"} : ${EGREP="/bin/grep -E"} : ${FGREP="/bin/grep -F"} : ${GREP="/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # Generated shell functions inserted here. # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: # In the unlikely event $progname began with a '-', it would play havoc with # func_echo (imagine progname=-n), so we prepend ./ in that case: func_dirname_and_basename "$progpath" progname=$func_basename_result case $progname in -*) progname=./$progname ;; esac # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname${mode+: }$mode: $*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` done my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "X$my_tmpdir" | $Xsed } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "X$1" | $Xsed \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_version # Echo version message to standard output and exit. func_version () { $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $SED -n '/^# Usage:/,/# -h/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" $ECHO $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help # Echo long help message to standard output and exit. func_help () { $SED -n '/^# Usage:/,/# Report bugs to/ { s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p }' < "$progpath" exit $? } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { func_error "missing argument for $1" exit_cmd=exit } exit_cmd=: # Check that we have a working $ECHO. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then # Yippee, $ECHO works! : else # Restart under the correct shell, and then maybe $ECHO will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # Parse options once, thoroughly. This comes as soon as possible in # the script to make things like `libtool --version' happen quickly. { # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Parse non-mode specific arguments: while test "$#" -gt 0; do opt="$1" shift case $opt in --config) func_config ;; --debug) preserve_args="$preserve_args $opt" func_echo "enabling shell trace mode" opt_debug='set -x' $opt_debug ;; -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break execute_dlfiles="$execute_dlfiles $1" shift ;; --dry-run | -n) opt_dry_run=: ;; --features) func_features ;; --finish) mode="finish" ;; --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break case $1 in # Valid mode arguments: clean) ;; compile) ;; execute) ;; finish) ;; install) ;; link) ;; relink) ;; uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac mode="$1" shift ;; --preserve-dup-deps) opt_duplicate_deps=: ;; --quiet|--silent) preserve_args="$preserve_args $opt" opt_silent=: ;; --verbose| -v) preserve_args="$preserve_args $opt" opt_silent=false ;; --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break preserve_args="$preserve_args $opt $1" func_enable_tag "$1" # tagname is set here shift ;; # Separate optargs to long options: -dlopen=*|--mode=*|--tag=*) func_opt_split "$opt" set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} shift ;; -\?|-h) func_usage ;; --help) opt_help=: ;; --version) func_version ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) nonopt="$opt" break ;; esac done case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_duplicate_deps ;; esac # Having warned about all mis-specified options, bail out if # anything was wrong. $exit_cmd $EXIT_FAILURE } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } ## ----------- ## ## Main. ## ## ----------- ## $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi test -z "$mode" && func_fatal_error "error: you must specify a MODE." # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$mode' for more information." } # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_ltwrapper_scriptname_result="" if func_ltwrapper_executable_p "$1"; then func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" fi } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case "$@ " in " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T <?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi removelist="$removelist $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist removelist="$removelist $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir command="$command -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then command="$command -o $obj" fi # Suppress compiler output if we already did a PIC compilation. command="$command$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$mode'" ;; esac $ECHO $ECHO "Try \`$progname --help' for more information about other modes." exit $? } # Now that we've collected a possible --mode arg, show help if necessary $opt_help && func_mode_help # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $execute_dlfiles; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_quote_for_eval "$file" args="$args $func_quote_for_eval_result" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" $ECHO "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS $ECHO "X----------------------------------------------------------------------" | $Xsed $ECHO "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done $ECHO $ECHO "If you ever happen to want to link against installed libraries" $ECHO "in a given directory, LIBDIR, you must either use libtool, and" $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" $ECHO "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" $ECHO " during execution" fi if test -n "$runpath_var"; then $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" $ECHO " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $ECHO $ECHO "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" $ECHO "pages." ;; *) $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac $ECHO "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS } test "$mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $ECHO "X$nonopt" | $GREP shtool >/dev/null; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" install_prog="$install_prog$func_quote_for_eval_result" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" install_prog="$install_prog $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for progfile in $progfiles; do func_verbose "extracting global C symbols from \`$progfile'" $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" } done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" fi $ECHO >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; " case $host in *cygwin* | *mingw* | *cegcc* ) $ECHO >> "$output_objdir/$my_dlsyms" "\ /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */" lt_dlsym_const= ;; *osf5*) echo >> "$output_objdir/$my_dlsyms" "\ /* This system does not cope well with relocations in const data */" lt_dlsym_const= ;; *) lt_dlsym_const=const ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) symtab_cflags="$symtab_cflags $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper_part1 [arg=no] # # Emit the first part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part1 () { func_emit_wrapper_part1_arg1=no if test -n "$1" ; then func_emit_wrapper_part1_arg1=$1 fi $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then ECHO=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then # Yippee, \$ECHO works! : else # Restart under the correct shell, and then maybe \$ECHO will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $ECHO "\ # Find the directory that this script lives in. thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done " } # end: func_emit_wrapper_part1 # func_emit_wrapper_part2 [arg=no] # # Emit the second part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part2 () { func_emit_wrapper_part2_arg1=no if test -n "$1" ; then func_emit_wrapper_part2_arg1=$1 fi $ECHO "\ # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # end: func_emit_wrapper_part2 # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=no if test -n "$1" ; then func_emit_wrapper_arg1=$1 fi # split this up so that func_emit_cwrapperexe_src # can call each part independently. func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" } # func_to_host_path arg # # Convert paths to host format when used with build tools. # Intended for use with "native" mingw (where libtool itself # is running under the msys shell), or in the following cross- # build environments: # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # where wine is equipped with the `winepath' executable. # In the native mingw case, the (msys) shell automatically # converts paths for any non-msys applications it launches, # but that facility isn't available from inside the cwrapper. # Similar accommodations are necessary for $host mingw and # $build cygwin. Calling this function does no harm for other # $host/$build combinations not listed above. # # ARG is the path (on $build) that should be converted to # the proper representation for $host. The result is stored # in $func_to_host_path_result. func_to_host_path () { func_to_host_path_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' case $build in *mingw* ) # actually, msys # awkward: cmd appends spaces to result lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_path_tmp1=`( cmd //c echo "$1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_path_tmp1=`cygpath -w "$1"` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # Unfortunately, winepath does not exit with a non-zero # error code, so we are forced to check the contents of # stdout. On the other hand, if the command is not # found, the shell will set an exit code of 127 and print # *an error message* to stdout. So we must check for both # error code of zero AND non-empty stdout, which explains # the odd construction: func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` else # Allow warning below. func_to_host_path_result="" fi ;; esac if test -z "$func_to_host_path_result" ; then func_error "Could not determine host path corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_path_result="$1" fi ;; esac fi } # end: func_to_host_path # func_to_host_pathlist arg # # Convert pathlists to host format when used with build tools. # See func_to_host_path(), above. This function supports the # following $build/$host combinations (but does no harm for # combinations not listed here): # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # # Path separators are also converted from $build format to # $host format. If ARG begins or ends with a path separator # character, it is preserved (but converted to $host format) # on output. # # ARG is a pathlist (on $build) that should be converted to # the proper representation on $host. The result is stored # in $func_to_host_pathlist_result. func_to_host_pathlist () { func_to_host_pathlist_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_to_host_pathlist_tmp2="$1" # Once set for this call, this variable should not be # reassigned. It is used in tha fallback case. func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e 's|^:*||' -e 's|:*$||'` case $build in *mingw* ) # Actually, msys. # Awkward: cmd appends spaces to result. lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # unfortunately, winepath doesn't convert pathlists func_to_host_pathlist_result="" func_to_host_pathlist_oldIFS=$IFS IFS=: for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do IFS=$func_to_host_pathlist_oldIFS if test -n "$func_to_host_pathlist_f" ; then func_to_host_path "$func_to_host_pathlist_f" if test -n "$func_to_host_path_result" ; then if test -z "$func_to_host_pathlist_result" ; then func_to_host_pathlist_result="$func_to_host_path_result" else func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" fi fi fi IFS=: done IFS=$func_to_host_pathlist_oldIFS ;; esac if test -z "$func_to_host_pathlist_result" ; then func_error "Could not determine the host path(s) corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This may break if $1 contains DOS-style drive # specifications. The fix is not to complicate the expression # below, but for the user to provide a working wine installation # with winepath so that path translation in the cross-to-mingw # case works properly. lt_replace_pathsep_nix_to_dos="s|:|;|g" func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_replace_pathsep_nix_to_dos"` fi # Now, add the leading and trailing path separators back case "$1" in :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" ;; esac case "$1" in *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" ;; esac ;; esac fi } # end: func_to_host_pathlist # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include # define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include # define HAVE_SETENV # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif # endif #endif #include #include #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif #ifdef _MSC_VER # define S_IXUSR _S_IEXEC # define stat _stat # ifndef _INTPTR_T_DEFINED # define intptr_t int # endif #endif #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifdef __CYGWIN__ # define FOPEN_WB "wb" #endif #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #undef LTWRAPPER_DEBUGPRINTF #if defined DEBUGWRAPPER # define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args static void ltwrapper_debugprintf (const char *fmt, ...) { va_list args; va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } #else # define LTWRAPPER_DEBUGPRINTF(args) #endif const char *program_name = NULL; void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_fatal (const char *message, ...); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_opt_process_env_set (const char *arg); void lt_opt_process_env_prepend (const char *arg); void lt_opt_process_env_append (const char *arg); int lt_split_name_value (const char *arg, char** name, char** value); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); static const char *script_text_part1 = EOF func_emit_wrapper_part1 yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ "/' -e 's/$/\\n"/' echo ";" cat <"))); for (i = 0; i < newargc; i++) { LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); } EOF case $host_os in mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); return 127; } return rval; EOF ;; *) cat <<"EOF" execv (lt_argv_zero, newargz); return rval; /* =127, but avoids unused variable warning */ EOF ;; esac cat <<"EOF" } void * xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char) name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable (const char *path) { struct stat st; LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", tmp_pathspec)); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { char *errstr = strerror (errno); lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal ("Could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } void lt_setenv (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", (name ? name : ""), (value ? value : ""))); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } int lt_split_name_value (const char *arg, char** name, char** value) { const char *p; int len; if (!arg || !*arg) return 1; p = strchr (arg, (int)'='); if (!p) return 1; *value = xstrdup (++p); len = strlen (arg) - strlen (*value); *name = XMALLOC (char, len); strncpy (*name, arg, len-1); (*name)[len - 1] = '\0'; return 0; } void lt_opt_process_env_set (const char *arg) { char *name = NULL; char *value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); } lt_setenv (name, value); XFREE (name); XFREE (value); } void lt_opt_process_env_prepend (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); } new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_opt_process_env_append (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); } new_value = lt_extend_str (getenv (name), value, 1); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_update_exe_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? value : ""))); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? value : ""))); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF } # end: func_emit_cwrapperexe_src # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) deplibs="$deplibs $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) weak_libs="$weak_libs $arg" prev= continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname '-L' '' "$arg" dir=$func_stripname_result if test -z "$dir"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" linker_flags="$linker_flags $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" compiler_flags="$compiler_flags $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_duplicate_deps ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= case $lib in *.la) func_source "$lib" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` case " $weak_libs " in *" $deplib_base "*) ;; *) deplibs="$deplibs $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" dir=$func_stripname_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $ECHO $ECHO "*** Warning: Trying to link with static lib archive $deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because the file extensions .$libext of this argument makes me believe" $ECHO "*** that it is just a static archive that I should not use here." else $ECHO $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) temp_rpath="$temp_rpath$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded notinst_deplibs="$notinst_deplibs $lib" need_relink=no ;; *) if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then $ECHO if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $ECHO $ECHO "*** And there doesn't seem to be a static archive available" $ECHO "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $ECHO $ECHO "*** Warning: This system can not link to static lib archive $lib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $ECHO "*** But as you try to build a module library, libtool will still create " $ECHO "*** a static module, that should work as long as the dlopening application" $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $ECHO $ECHO "*** However, this would only work if libtool was able to extract symbol" $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" $ECHO "*** not find such a program. So, this module is probably useless." $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_dirname "$deplib" "" "." dir="$func_dirname_result" # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else $ECHO $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" libobjs="$libobjs $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $ECHO $ECHO "*** Warning: linker path does not have real file for library $a_deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $ECHO $ECHO "*** Warning: linker path does not have real file for library $a_deplib." $ECHO "*** I have the capability to make that library automatically link in when" $ECHO "*** you link to this library. But I can only do this if you have a" $ECHO "*** shared version of the library, which you do not appear to have" $ECHO "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` done fi if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | $GREP . >/dev/null; then $ECHO if test "X$deplibs_check_method" = "Xnone"; then $ECHO "*** Warning: inter-library dependencies are not supported in this platform." else $ECHO "*** Warning: inter-library dependencies are not known to be supported." fi $ECHO "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $ECHO $ECHO "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" $ECHO "*** a static module, that should work as long as the dlopening" $ECHO "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $ECHO $ECHO "*** However, this would only work if libtool was able to extract symbol" $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" $ECHO "*** not find such a program. So, this module is probably useless." $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $ECHO "*** The inter-library dependencies that have been dropped here will be" $ECHO "*** automatically added whenever a program is linked with this library" $ECHO "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $ECHO $ECHO "*** Since this library must not contain undefined symbols," $ECHO "*** because either the platform does not support them or" $ECHO "*** it was explicitly requested with -no-undefined," $ECHO "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" delfiles="$delfiles $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" func_len " $cmd" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then func_show_eval "$cmd" 'exit $?' skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output output_la=`$ECHO "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" $ECHO 'INPUT (' > $output for obj in $save_libobjs do $ECHO "$obj" >> $output done $ECHO ')' >> $output delfiles="$delfiles $output" elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do $ECHO "$obj" >> $output done delfiles="$delfiles $output" output=$firstobj\"$file_list_spec$output\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=$obj func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi delfiles="$delfiles $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *cegcc) # Disable wrappers for cegcc, we are cross compiling anyway. wrappers_required=no ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $ECHO for shipping. if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then oldobjs="$oldobjs $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles oldobjs="$oldobjs $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else $ECHO "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" newdlfiles="$newdlfiles $libdir/$name" ;; *) newdlfiles="$newdlfiles $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" newdlprefiles="$newdlprefiles $libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$mode" = link || test "$mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) RM="$RM $arg"; rmforce=yes ;; -*) RM="$RM $arg" ;; *) files="$files $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= origobjdir="$objdir" for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then objdir="$origobjdir" else objdir="$dir/$origobjdir" fi func_basename "$file" name="$func_basename_result" test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result rmfiles="$rmfiles $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$mode" = uninstall || test "$mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 syncevolution-1.5/src/synthesis/aclocal.m40000644000373300037200000012132412424707646022373 0ustar00nightlyallusers00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, [m4_warning([this file was generated for autoconf 2.65. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4-repo/dk-warn.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) syncevolution-1.5/src/synthesis/config.h.in0000644000373300037200000000505612424707647022562 0ustar00nightlyallusers00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* client engine linked statically */ #undef DBAPI_LINKED /* server engine linked statically */ #undef DBAPI_SRV_LINKED /* avoid hard dependency on Evolution shared objects */ #undef EVOLUTION_COMPATIBILITY /* Define to 1 use builtin xmltok as XML Parser */ #undef HAVE_BUILTIN_XMLTOK /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 to use expat as XML parser */ #undef HAVE_EXPAT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* "libecal available" */ #undef HAVE_LIBECAL /* "libical available" */ #undef HAVE_LIBICAL /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 use system xmltok as XML parser */ #undef HAVE_SYS_XMLTOK /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* "regular expressions in scripts" */ #undef ONOFF_REGEX_SUPPORT /* controls whether ODBC backend with libsqlite is enabled */ #undef ONOFF_SQLITE_SUPPORT /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* absolute path to Doxygen HTML output */ #undef SYDEBUG_LOCATION /* libsynthesis.a linked statically */ #undef UIAPI_LINKED /* "optionally use GENIVI Diagnostic Log and Trace for logging" */ #undef USE_DLT /* Version number of package */ #undef VERSION syncevolution-1.5/src/synthesis/compile0000755000373300037200000000727112424707650022110 0ustar00nightlyallusers00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2009-10-06.20; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software # Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use `[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: syncevolution-1.5/src/synthesis/config.guess0000755000373300037200000013105412424707650023047 0ustar00nightlyallusers00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd | genuineintel) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: syncevolution-1.5/src/synthesis/config.sub0000755000373300037200000010242512424707650022512 0ustar00nightlyallusers00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-06-11' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: syncevolution-1.5/src/synthesis/install-sh0000755000373300037200000003253712424707650022541 0ustar00nightlyallusers00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: syncevolution-1.5/src/synthesis/missing0000755000373300037200000002623312424707650022130 0ustar00nightlyallusers00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: syncevolution-1.5/src/synthesis/depcomp0000755000373300037200000004426712424707650022115 0ustar00nightlyallusers00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: syncevolution-1.5/src/synthesis/Makefile.in0000644000373300037200000006255212424707650022602 0ustar00nightlyallusers00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/synthesis-sdk.pc.in $(srcdir)/synthesis.pc.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ compile config.guess config.sub depcomp install-sh ltmain.sh \ missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4-repo/dk-warn.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = synthesis.pc synthesis-sdk.pc CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLT_CFLAGS = @DLT_CFLAGS@ DLT_LIBS = @DLT_LIBS@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FOOBAR_CFLAGS = @FOOBAR_CFLAGS@ FOOBAR_LIBS = @FOOBAR_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBECAL_CFLAGS = @LIBECAL_CFLAGS@ LIBECAL_LIBS = @LIBECAL_LIBS@ LIBICAL_CFLAGS = @LIBICAL_CFLAGS@ LIBICAL_LIBS = @LIBICAL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_LIBS = @PCRE_LIBS@ PIC_CXXFLAGS = @PIC_CXXFLAGS@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SQLITE3_CFLAGS = @SQLITE3_CFLAGS@ SQLITE3_LIBS = @SQLITE3_LIBS@ STRIP = @STRIP@ SYNTHESIS_WFLAGS = @SYNTHESIS_WFLAGS@ VERSION = @VERSION@ XMLPARSE_CFLAGS = @XMLPARSE_CFLAGS@ XMLPARSE_LIBS = @XMLPARSE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src # list all additional files which need to be included by "make dist", # check with "make distcheck" EXTRA_DIST = # extra files which need to be removed during "make distclean" MAINTAINERCLEANFILES = Makefile.in config.guess config.sub configure depcomp install-sh ltmain.sh missing mkinstalldirs # required for rebuilding autotools files via make ACLOCAL_AMFLAGS = -I m4 -I m4-repo ${ACLOCAL_FLAGS} pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = synthesis.pc synthesis-sdk.pc all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 synthesis.pc: $(top_builddir)/config.status $(srcdir)/synthesis.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ synthesis-sdk.pc: $(top_builddir)/config.status $(srcdir)/synthesis-sdk.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-pkgconfigDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: syncevolution-1.5/src/synthesis/configure0000755000373300037200000210036712424707651022444 0ustar00nightlyallusers00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65 for synthesis 3.4.0.47.5. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac ECHO=${lt_ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF $* _LT_EOF exit 0 fi # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='synthesis' PACKAGE_TARNAME='synthesis' PACKAGE_VERSION='3.4.0.47.5' PACKAGE_STRING='synthesis 3.4.0.47.5' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS COND_STATIC_FALSE COND_STATIC_TRUE COND_XMLPARSE_FALSE COND_XMLPARSE_TRUE XMLPARSE_CFLAGS XMLPARSE_LIBS LIBECAL_LIBS LIBECAL_CFLAGS LIBICAL_LIBS LIBICAL_CFLAGS DLT_LIBS DLT_CFLAGS PCRE_LIBS PCRE_CFLAGS SQLITE3_LIBS SQLITE3_CFLAGS FOOBAR_LIBS FOOBAR_CFLAGS PKG_CONFIG COND_DOXYGEN_FALSE COND_DOXYGEN_TRUE PIC_CXXFLAGS SYNTHESIS_WFLAGS CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB AR OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld enable_libtool_lock enable_warnings enable_debug_logs enable_sqlite enable_regex enable_dlt enable_libical enable_evolution_compatibility with_xmltok with_expat ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP CXXCPP PKG_CONFIG FOOBAR_CFLAGS FOOBAR_LIBS SQLITE3_CFLAGS SQLITE3_LIBS PCRE_CFLAGS PCRE_LIBS DLT_CFLAGS DLT_LIBS LIBICAL_CFLAGS LIBICAL_LIBS LIBECAL_CFLAGS LIBECAL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures synthesis 3.4.0.47.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/synthesis] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of synthesis 3.4.0.47.5:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-warnings=[min|max|fatal|no] control compiler pickyness [min] --enable-debug-logs For developers: add links to call location to HTML log files. Depends on Doxygen (for HTML version of source) and g++ (for __PRETTY_FUNCTION__). --enable-sqlite enable the sqlite-based ODBC backend, depends on libsqlite3, enabled by default --enable-regex enable regular expression support in scripts, depends on libpcre, enabled by default --enable-dlt enable logging mode "dlt" = GENIVI Diagnostic Log and Trace --enable-libical use libical (if necessary, the one in libecal) to improve time zone support, enabled by default if necessary libs are found --enable-evolution-compatibility build executables which only call Evolution via dlopen/dlsym: this avoids all hard dependencies on EDS shared objects, but might lead to crashes when their ABI changes Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-xmltok= Chooses which xmltok/xmlparse gets used. "builtin" = compile code into libsynthesis. "system" = use header files and libxmlparse from standard search paths. "path" = use header files in "path/include" and libxmlparse in "path/lib". Default is system if header files are found, otherwise builtin. --with-expat= Choose expat as the XML parser library. Replaces --with-xmltok. "system" = use header files and libexpat from standard search paths. "path" = use header files in "path/include", and libexpat in "path/lib". Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility FOOBAR_CFLAGS C compiler flags for FOOBAR, overriding pkg-config FOOBAR_LIBS linker flags for FOOBAR, overriding pkg-config SQLITE3_CFLAGS C compiler flags for SQLITE3, overriding pkg-config SQLITE3_LIBS linker flags for SQLITE3, overriding pkg-config PCRE_CFLAGS C compiler flags for PCRE, overriding pkg-config PCRE_LIBS linker flags for PCRE, overriding pkg-config DLT_CFLAGS C compiler flags for DLT, overriding pkg-config DLT_LIBS linker flags for DLT, overriding pkg-config LIBICAL_CFLAGS C compiler flags for LIBICAL, overriding pkg-config LIBICAL_LIBS linker flags for LIBICAL, overriding pkg-config LIBECAL_CFLAGS C compiler flags for LIBECAL, overriding pkg-config LIBECAL_LIBS linker flags for LIBECAL, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF synthesis configure 3.4.0.47.5 generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by synthesis $as_me 3.4.0.47.5, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='synthesis' VERSION='3.4.0.47.5' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h" enable_dlopen=yes ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C++ compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.2.6b' macro_revision='1.3017' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if test "${ac_cv_path_SED+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if test "${ac_cv_path_FGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test "${lt_cv_path_NM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$ac_tool_prefix"; then for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in "dumpbin -symbols" "link -dump -symbols" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if test "${lt_cv_nm_interface+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:5078: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:5081: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:5084: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if test "${lt_cv_sys_max_cmd_len+set}" = set; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if test "${lt_cv_deplibs_check_method+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 6290 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if test "${lt_cv_cc_needs_belf+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) LD="${LD-ld} -m elf64_sparc" ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if test "${lt_cv_apple_cc_single_mod+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} _lt_caught_CXX_error=yes; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi # Set options enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if test "${lt_cv_objdir+set}" = set; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8345: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8349: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl*) # IBM XL C 8.0/Fortran 10.1 on PPC lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test "${lt_cv_prog_compiler_pic_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8684: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8688: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test "${lt_cv_prog_compiler_static_works+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8789: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8793: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:8844: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:8848: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu) link_all_deplibs=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag= tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo(void) {} _ACEOF if ac_fn_c_try_link "$LINENO"; then : archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 $as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if test "${ac_cv_lib_svld_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if test "${ac_cv_lib_dld_dld_link+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 11228 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line 11324 "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if test "${lt_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if test "${lt_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5]* | *pgcpp\ [1-5]*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=echo else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='echo' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC*) # IBM XL 8.0 on PPC lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5 $as_echo "$lt_prog_compiler_pic_CXX" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13280: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13284: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13379: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13383: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13431: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13435: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' ;; linux* | k*bsd*-gnu) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 $as_echo "$archive_cmds_need_lc_CXX" >&6; } ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; interix[3-9]*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi # --enable-warning=min/max/fatal/none # Check whether --enable-warnings was given. if test "${enable_warnings+set}" = set; then : enableval=$enable_warnings; dk_enable_warnings=$enableval else dk_enable_warnings=min fi dk_lang= case $ac_compile in *'$CXXFLAGS '*) dk_lang='C++' dk_cc=$CXX dk_conftest=conftest.${ac_ext-cc} ;; *'$CFLAGS '*) dk_lang=C dk_cc=$CC dk_conftest=conftest.${ac_ext-c} ;; esac if test "x$dk_lang" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking which $dk_lang compiler warning flags to use" >&5 $as_echo_n "checking which $dk_lang compiler warning flags to use... " >&6; } case $dk_enable_warnings in no) dk_warning_flags=;; max) dk_warning_flags="-Wall -Wno-unknown-pragmas -Wno-unused-but-set-variable";; fatal) dk_warning_flags="-Wall -Wno-unknown-pragmas -Wno-unused-but-set-variable -Werror";; *) dk_warning_flags="-Wall -Wno-unknown-pragmas -Wno-unused-but-set-variable";; esac dk_deprecation_flags= dk_tested_flags= if test "x$dk_warning_flags" != x; then : # Keep in mind that the dummy source must be devoid of any # problems that might cause diagnostics. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(int argc, char** argv) { return (argv != 0) ? argc : 0; } _ACEOF for dk_flag in $dk_warning_flags do # Test whether the compiler accepts the flag. GCC doesn't bail # out when given an unsupported flag but prints a warning, so # check the compiler output instead. dk_cc_out=`$dk_cc $dk_tested_flags $dk_flag -c "$dk_conftest" 2>&1 || echo failed` rm -f "conftest.${OBJEXT-o}" if test "x$dk_cc_out" = x; then : if test "x$dk_tested_flags" = x; then : dk_tested_flags=$dk_flag else dk_tested_flags="$dk_tested_flags $dk_flag" fi else echo "$dk_cc_out" >&5 fi done rm -f "$dk_conftest" fi dk_all_flags=$dk_deprecation_flags$dk_tested_flags SYNTHESIS_WFLAGS=$dk_all_flags test "x$dk_all_flags" != x || dk_all_flags=none { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dk_all_flags" >&5 $as_echo "$dk_all_flags" >&6; } fi PIC_CXXFLAGS="$lt_prog_compiler_pic_CXX" # Check whether --enable-debug-logs was given. if test "${enable_debug_logs+set}" = set; then : enableval=$enable_debug_logs; enable_debug_logs="$enableval" else enable_debug_logs="no" fi if test "$enable_debug_logs" = "yes"; then cat >>confdefs.h <<_ACEOF #define SYDEBUG_LOCATION "`pwd`/src/html" _ACEOF fi if test "$enable_debug_logs" = "yes"; then COND_DOXYGEN_TRUE= COND_DOXYGEN_FALSE='#' else COND_DOXYGEN_TRUE='#' COND_DOXYGEN_FALSE= fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FOOBAR" >&5 $as_echo_n "checking for FOOBAR... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$FOOBAR_CFLAGS"; then pkg_cv_FOOBAR_CFLAGS="$FOOBAR_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"foobar\""; } >&5 ($PKG_CONFIG --exists --print-errors "foobar") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FOOBAR_CFLAGS=`$PKG_CONFIG --cflags "foobar" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$FOOBAR_LIBS"; then pkg_cv_FOOBAR_LIBS="$FOOBAR_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"foobar\""; } >&5 ($PKG_CONFIG --exists --print-errors "foobar") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FOOBAR_LIBS=`$PKG_CONFIG --libs "foobar" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FOOBAR_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "foobar"` else FOOBAR_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "foobar"` fi # Put the nasty error message in config.log where it belongs echo "$FOOBAR_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } true elif test $pkg_failed = untried; then true else FOOBAR_CFLAGS=$pkg_cv_FOOBAR_CFLAGS FOOBAR_LIBS=$pkg_cv_FOOBAR_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } true fi # Check whether --enable-sqlite was given. if test "${enable_sqlite+set}" = set; then : enableval=$enable_sqlite; enable_sqlite=$enableval else enable_sqlite="yes" fi if test "$enable_sqlite" == "yes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLITE3" >&5 $as_echo_n "checking for SQLITE3... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$SQLITE3_CFLAGS"; then pkg_cv_SQLITE3_CFLAGS="$SQLITE3_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3\""; } >&5 ($PKG_CONFIG --exists --print-errors "sqlite3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SQLITE3_CFLAGS=`$PKG_CONFIG --cflags "sqlite3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$SQLITE3_LIBS"; then pkg_cv_SQLITE3_LIBS="$SQLITE3_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sqlite3\""; } >&5 ($PKG_CONFIG --exists --print-errors "sqlite3") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_SQLITE3_LIBS=`$PKG_CONFIG --libs "sqlite3" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then SQLITE3_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sqlite3"` else SQLITE3_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sqlite3"` fi # Put the nasty error message in config.log where it belongs echo "$SQLITE3_PKG_ERRORS" >&5 as_fn_error "Package requirements (sqlite3) were not met: $SQLITE3_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables SQLITE3_CFLAGS and SQLITE3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " "$LINENO" 5 elif test $pkg_failed = untried; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables SQLITE3_CFLAGS and SQLITE3_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." "$LINENO" 5; } else SQLITE3_CFLAGS=$pkg_cv_SQLITE3_CFLAGS SQLITE3_LIBS=$pkg_cv_SQLITE3_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi HAVE_SQLITE=1 else HAVE_SQLITE=0 fi cat >>confdefs.h <<_ACEOF #define ONOFF_SQLITE_SUPPORT $HAVE_SQLITE _ACEOF # Check whether --enable-regex was given. if test "${enable_regex+set}" = set; then : enableval=$enable_regex; enable_regex=$enableval else enable_regex="yes" fi if test "$enable_regex" == "yes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PCRE" >&5 $as_echo_n "checking for PCRE... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PCRE_CFLAGS"; then pkg_cv_PCRE_CFLAGS="$PCRE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcre") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PCRE_CFLAGS=`$PKG_CONFIG --cflags "libpcre" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PCRE_LIBS"; then pkg_cv_PCRE_LIBS="$PCRE_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpcre\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpcre") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PCRE_LIBS=`$PKG_CONFIG --libs "libpcre" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PCRE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libpcre"` else PCRE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libpcre"` fi # Put the nasty error message in config.log where it belongs echo "$PCRE_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error "libpcre not found, required for --enable-regex" "$LINENO" 5 elif test $pkg_failed = untried; then as_fn_error "libpcre not found, required for --enable-regex" "$LINENO" 5 else PCRE_CFLAGS=$pkg_cv_PCRE_CFLAGS PCRE_LIBS=$pkg_cv_PCRE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_PCRE=1 fi HAVE_PCRE=1 else HAVE_PCRE=0 fi cat >>confdefs.h <<_ACEOF #define ONOFF_REGEX_SUPPORT $HAVE_PCRE _ACEOF # Check whether --enable-dlt was given. if test "${enable_dlt+set}" = set; then : enableval=$enable_dlt; enable_dlt=$enableval test $enable_dlt = "yes" || test $enable_dlt = "no" || as_fn_error "invalid value of --enable-dlt: $enableval" "$LINENO" 5 else enable_dlt="no" fi if test "$enable_dlt" = "yes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DLT" >&5 $as_echo_n "checking for DLT... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$DLT_CFLAGS"; then pkg_cv_DLT_CFLAGS="$DLT_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"automotive-dlt\""; } >&5 ($PKG_CONFIG --exists --print-errors "automotive-dlt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DLT_CFLAGS=`$PKG_CONFIG --cflags "automotive-dlt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$DLT_LIBS"; then pkg_cv_DLT_LIBS="$DLT_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"automotive-dlt\""; } >&5 ($PKG_CONFIG --exists --print-errors "automotive-dlt") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_DLT_LIBS=`$PKG_CONFIG --libs "automotive-dlt" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then DLT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "automotive-dlt"` else DLT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "automotive-dlt"` fi # Put the nasty error message in config.log where it belongs echo "$DLT_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error "dlt not found, required for --enable-dlt" "$LINENO" 5 elif test $pkg_failed = untried; then as_fn_error "dlt not found, required for --enable-dlt" "$LINENO" 5 else DLT_CFLAGS=$pkg_cv_DLT_CFLAGS DLT_LIBS=$pkg_cv_DLT_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } USE_DLT=1 fi $as_echo "#define USE_DLT 1" >>confdefs.h fi ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = x""yes; then : else as_fn_error "zlib.h not found." "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "xmltok/xmlparse.h" "ac_cv_header_xmltok_xmlparse_h" "$ac_includes_default" if test "x$ac_cv_header_xmltok_xmlparse_h" = x""yes; then : have_system_xmltok="yes" fi ac_fn_c_check_header_mongrel "$LINENO" "expat.h" "ac_cv_header_expat_h" "$ac_includes_default" if test "x$ac_cv_header_expat_h" = x""yes; then : have_system_expat="yes" fi # Check whether --enable-libical was given. if test "${enable_libical+set}" = set; then : enableval=$enable_libical; enable_libical=$enableval else enable_libical="yes" fi if test "$enable_libical" == "yes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBICAL" >&5 $as_echo_n "checking for LIBICAL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBICAL_CFLAGS"; then pkg_cv_LIBICAL_CFLAGS="$LIBICAL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libical\""; } >&5 ($PKG_CONFIG --exists --print-errors "libical") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBICAL_CFLAGS=`$PKG_CONFIG --cflags "libical" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBICAL_LIBS"; then pkg_cv_LIBICAL_LIBS="$LIBICAL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libical\""; } >&5 ($PKG_CONFIG --exists --print-errors "libical") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBICAL_LIBS=`$PKG_CONFIG --libs "libical" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBICAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libical"` else LIBICAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libical"` fi # Put the nasty error message in config.log where it belongs echo "$LIBICAL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBECAL" >&5 $as_echo_n "checking for LIBECAL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBECAL_CFLAGS"; then pkg_cv_LIBECAL_CFLAGS="$LIBECAL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libecal-1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libecal-1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBECAL_CFLAGS=`$PKG_CONFIG --cflags "libecal-1.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBECAL_LIBS"; then pkg_cv_LIBECAL_LIBS="$LIBECAL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libecal-1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libecal-1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBECAL_LIBS=`$PKG_CONFIG --libs "libecal-1.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBECAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libecal-1.2"` else LIBECAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libecal-1.2"` fi # Put the nasty error message in config.log where it belongs echo "$LIBECAL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } true elif test $pkg_failed = untried; then true else LIBECAL_CFLAGS=$pkg_cv_LIBECAL_CFLAGS LIBECAL_LIBS=$pkg_cv_LIBECAL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_LIBICAL 1" >>confdefs.h $as_echo "#define HAVE_LIBECAL 1" >>confdefs.h fi elif test $pkg_failed = untried; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBECAL" >&5 $as_echo_n "checking for LIBECAL... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$LIBECAL_CFLAGS"; then pkg_cv_LIBECAL_CFLAGS="$LIBECAL_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libecal-1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libecal-1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBECAL_CFLAGS=`$PKG_CONFIG --cflags "libecal-1.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$LIBECAL_LIBS"; then pkg_cv_LIBECAL_LIBS="$LIBECAL_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libecal-1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libecal-1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBECAL_LIBS=`$PKG_CONFIG --libs "libecal-1.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBECAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libecal-1.2"` else LIBECAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libecal-1.2"` fi # Put the nasty error message in config.log where it belongs echo "$LIBECAL_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } true elif test $pkg_failed = untried; then true else LIBECAL_CFLAGS=$pkg_cv_LIBECAL_CFLAGS LIBECAL_LIBS=$pkg_cv_LIBECAL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_LIBICAL 1" >>confdefs.h $as_echo "#define HAVE_LIBECAL 1" >>confdefs.h fi else LIBICAL_CFLAGS=$pkg_cv_LIBICAL_CFLAGS LIBICAL_LIBS=$pkg_cv_LIBICAL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define HAVE_LIBICAL 1" >>confdefs.h fi fi # Check whether --enable-evolution-compatibility was given. if test "${enable_evolution_compatibility+set}" = set; then : enableval=$enable_evolution_compatibility; enable_evolution_compatibility="$enableval" else enable_evolution_compatibility="no" fi if test "$enable_evolution_compatibility" == "yes"; then $as_echo "#define EVOLUTION_COMPATIBILITY 1" >>confdefs.h LIBICAL_LIBS= LIBECAL_LIBS= fi # Check whether --with-xmltok was given. if test "${with_xmltok+set}" = set; then : withval=$with_xmltok; if test "$withval" = "builtin"; then with_xmltok="builtin" elif test "$withval" = "system" || test "$withval" = "yes"; then with_xmltok="system" else with_xmltok="$withval" fi else with_xmltok="no" fi # Check whether --with-expat was given. if test "${with_expat+set}" = set; then : withval=$with_expat; if test "$withval" = "system" || test "$withval" = "yes"; then with_expat="system" else with_expath="$withval" fi else with_expat="no" fi if test "$with_xmltok" = "no" && test "$with_expat" = "no"; then if test "$have_system_expat" = "yes"; then with_expat="yes" XMLPARSE_LIBS="-lexpat" elif test "$have_system_xmltok" = "yes"; then with_xmltok="yes" XMLPARSE_LIBS="-lxmlparse" else with_xmltok="builtin" fi elif test "$with_expat" != "no"; then if test "$with_expat" = "system"; then if test "$have_system_expat" = "yes"; then XMLPARSE_LIBS="-lexpat" else as_fn_error "expat.h not found." "$LINENO" 5 fi else # user path XMLPARSE_LIBS="-L$with_expat/lib -lexpat" XMLPARSE_CFLAGS="-I$with_expat/include" fi with_expat="yes" else # with_xmltok if test "$with_xmltok" = "system"; then if test "$have_system_xmltok" = "yes"; then XMLPARSE_LIBS="-lxmlparse" else as_fn_error "xmltok/xmplarse.h not found." "$LINENO" 5 fi elif test "$with_xmltok" != "builtin"; then XMLPARSE_LIBS="-L$with_xmltok/lib -lxmlparse" XMLPARSE_CFLAGS="-I$with_xmltok/include" fi fi if test "$with_expat" = "yes"; then $as_echo "#define HAVE_EXPAT 1" >>confdefs.h elif test "$with_xmltok" != "builtin"; then $as_echo "#define HAVE_SYS_XMLTOK 1" >>confdefs.h else $as_echo "#define HAVE_BUILTIN_XMLTOK 1" >>confdefs.h fi if test "$with_xmltok" = "builtin"; then COND_XMLPARSE_TRUE= COND_XMLPARSE_FALSE='#' else COND_XMLPARSE_TRUE='#' COND_XMLPARSE_FALSE= fi ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" if test "x$ac_cv_header_stdint_h" = x""yes; then : fi # the autotools SDK always assumes that it is linked against the engine $as_echo "#define UIAPI_LINKED 1" >>confdefs.h $as_echo "#define DBAPI_LINKED 1" >>confdefs.h $as_echo "#define DBAPI_SRV_LINKED 1" >>confdefs.h # determines which object files are needed in the SDK: # if linking statically, some object files are shared with # libsynthesis.a if test "$enable_shared" = "no"; then COND_STATIC_TRUE= COND_STATIC_FALSE='#' else COND_STATIC_TRUE='#' COND_STATIC_FALSE= fi # Disable unconditionally at the moment. Would add dependency of SDK # on SyncML Toolkit. #AC_DEFINE(WITHOUT_SAN_1_1, 1, # [support for Server Alerted Notifications according to SyncML 1.1]) ac_config_files="$ac_config_files Makefile src/Makefile synthesis.pc synthesis-sdk.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_DOXYGEN_TRUE}" && test -z "${COND_DOXYGEN_FALSE}"; then as_fn_error "conditional \"COND_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_XMLPARSE_TRUE}" && test -z "${COND_XMLPARSE_FALSE}"; then as_fn_error "conditional \"COND_XMLPARSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COND_STATIC_TRUE}" && test -z "${COND_STATIC_FALSE}"; then as_fn_error "conditional \"COND_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by synthesis $as_me 3.4.0.47.5, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ synthesis config.status 3.4.0.47.5 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ AR \ AR_FLAGS \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ SHELL \ ECHO \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ fix_srcfile_path \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ fix_srcfile_path_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` ;; esac ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "synthesis.pc") CONFIG_FILES="$CONFIG_FILES synthesis.pc" ;; "synthesis-sdk.pc") CONFIG_FILES="$CONFIG_FILES synthesis-sdk.pc" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == "file_magic". file_magic_cmd=$lt_file_magic_cmd # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name of the directory that contains temporary libtool files. objdir=$objdir # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that does not interpret backslashes. ECHO=$lt_ECHO # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $* )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[^=]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$@"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1+=\$2" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1=\$$1\$2" } _LT_EOF ;; esac sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi syncevolution-1.5/src/synthesis/ChangeLog0000644000373300037200000057270312424707661022315 0ustar00nightlyallusers00000000000000# Generated by configure. Do not edit. # git revision f9202de6af47a44a227106e7a76f46cdeb1a6d53 # git tag libsynthesis_3.4.0.47+syncevolution-1-5 2014-10-30 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for RELAXEDCOMPARE() 2014-10-17 Patrick Ohly * src/sysync/multifielditemtype.cpp: merge script: check order of entries in RELAXEDCOMPARE() 2014-10-09 Patrick Ohly * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.cpp: merge scripts: new RELAXEDCOMPARE(), enhanced MERGEFIELDS() 2014-09-10 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for memory function pointers and bug fixes 2014-09-10 Patrick Ohly * src/sysync/syncsession.cpp: engine: fix use-after-free bug when delaying command execution 2014-09-01 Patrick Ohly * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: config: enable memory function pointers for Linux combi engine 2014-09-01 Patrick Ohly * src/syncml_tk/src/sml/inc/smldef.h: * src/syncml_tk/src/sml/lib/all/libmem.c: * src/syncml_tk/src/sml/lib/inc/libmem.h: SMLTK: call memory functions through pointers 2014-09-01 Patrick Ohly * src/syncml_tk/src/sml/inc/smldef.h: SMLTK: use sane MemSize_t when stdint.h is available 2014-09-02 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/syncagent.cpp: * src/sysync/synccommand.cpp: * src/sysync/syncitemtype.cpp: avoid assumptions about MemSize_t type 2014-09-01 Patrick Ohly * src/syncml_tk/src/sml/inc/sml.h: SMLTK: eliminate redundant prototypes in sml.h 2014-09-03 Patrick Ohly * src/platform_adapters/binfile.cpp: binfile: avoid unnecessary write and truncate 2014-08-29 Patrick Ohly * src/sysync/binfileimplds.cpp: binfileclient: avoid disk writes in changeLogPreflight() 2014-08-29 Patrick Ohly * src/sysync/syncsession.cpp: syncsession: avoid unnecessary nonce update 2014-07-22 Patrick Ohly * configure.in: autotools: modernize AM_INIT_AUTOMAKE/AC_INIT 2014-07-22 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for /dev/null binfiles 2014-07-22 Patrick Ohly * src/platform_adapters/binfile.cpp: * src/platform_adapters/binfile.h: binfile: /dev/null datadir path 2014-07-22 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/mimediritemtype.cpp: * src/sysync/scriptcontext.cpp: dead code removal 2014-07-22 Patrick Ohly * src/sysync/binfileimplds.cpp: binfile: avoid error logging of LOCERR_AGAIN 2014-07-22 Patrick Ohly * src/DB_interfaces/odbc_db/odbcapiagent.cpp: ODBC: avoid clang warning 2014-07-14 Patrick Ohly * src/sysync/itemfield.cpp: string fields: full compare 2014-07-02 Patrick Ohly * src/sysync/customimplds.cpp: fix asynchronous item update 2014-07-02 Patrick Ohly * src/sysync/stdlogicds.cpp: stdlogicds: avoid implicit NULL->false conversion 2014-07-02 Patrick Ohly * src/DB_interfaces/odbc_db/odbcapids.h: odbc: remove unused member 2014-07-02 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: smltk: fix signed/unsigned comparison 2014-07-02 Patrick Ohly * src/sysync/binfileimplclient.cpp: binfile: remove unused local variables 2014-07-02 Patrick Ohly * src/DB_interfaces/api_db/dbapi.cpp: SDK: fix gcc 4.9 warning 2014-07-01 Patrick Ohly * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: cppcheck annotations 2014-07-01 Patrick Ohly * src/sysync_SDK/Sources/dbitem.cpp: SDK: avoid cppcheck warning 2014-05-17 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for URLENCODE/DECODE and sharedfield 2014-05-12 Patrick Ohly * src/sysync/mimedirprofile.cpp: mimedir parser: avoid reusing group tag 2014-05-12 Patrick Ohly * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: logging: threaded logging when reusing logger 2014-05-12 Patrick Ohly * src/sysync/mimedirprofile.cpp: MIME parser + encoder: remove dead code 2014-05-12 Patrick Ohly * src/sysync/scriptcontext.cpp: scripting: fix memory leak in SWAP() 2014-05-09 Patrick Ohly * src/sysync/scriptcontext.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: scripting: URL encode/decode 2014-05-06 Patrick Ohly * src/sysync/mimedirprofile.cpp: MIME parser + encoder: no backslash quoting in parameter values 2014-05-06 Patrick Ohly * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: profile: 2014-01-27 Patrick Ohly * src/sysync/debuglogger.cpp: debuglogger: close log file on exec 2014-01-24 Patrick Ohly * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: binfileclient: support sending NumberOfChanges 2014-01-08 Patrick Ohly * src/sysync_SDK/Sources/sysync_b64.cpp: sysync_b64: avoid false positive with scan-build 2014-01-08 Patrick Ohly * src/sysync/syncsession.cpp: syncsession: track pointer 2014-01-08 Patrick Ohly * src/syncml_tk/src/sml/mgr/all/mgrutil.c: SyncML TK: fix invalid memory allocation 2014-01-08 Patrick Ohly * src/Transport_interfaces/engine/enginesessiondispatch.cpp: enginesessiondispatch: additional NULL check 2014-01-08 Patrick Ohly * src/sysync/binfileimplclient.cpp: binfileimplclient: simplify code flow analysis 2014-01-08 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: fix delete/delete [] mistakes 2014-01-07 Patrick Ohly * src/sysync/binfilebase.cpp: binfilebase: avoid virtual methods in destructor 2014-01-07 Patrick Ohly * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/textprofile.cpp: * src/sysync_SDK/Sources/stringutil.cpp: fix new [] and delete mismatch 2013-11-21 Patrick Ohly * configure.in: autotools: bump version to upstream release 2013-11-21 Patrick Ohly * src/sysync/syncsession.cpp: engine: fix LOCERR_AGAIN handling with strict exec ordering 2013-10-29 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for DLT support 2013-10-27 Patrick Ohly * src/platform_adapters/linux/configfiles.cpp: Linux: avoid expensive network hostname lookup (FDO #70771) 2013-10-22 Patrick Ohly * README.DLT: * configure.in: * src/Makefile.am.in: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: logging: support DLT 2013-07-11 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for CA_ResumeSupported 2013-07-11 Patrick Ohly * src/platform_adapters/linux/platform_time.cpp: Linux: speed up getSystemNowAs(TCTX_SYSTEM) 2013-07-11 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/sysync_SDK/Sources/sync_dbapidef.h: Plugin: allow overriding support for suspend/resume 2013-07-10 Patrick Ohly * src/platform_adapters/unix_common/platform_thread.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/synccommand.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: linux: fix multithreading under valgrind 2013-07-05 Patrick Ohly * src/sysync/multifielditem.cpp: * src/sysync/multifielditemtype.cpp: * src/sysync/multifielditemtype.h: engine: + caching mode 2013-07-05 Patrick Ohly * src/sysync/multifielditemtype.cpp: engine: fix MERGEFIELDS() 2013-07-10 Patrick Ohly * src/sysync/customimplagent.cpp: * src/sysync/scriptcontext.h: scripting: share param arrays 2013-07-05 Patrick Ohly * src/sysync/localengineds.cpp: engine: conflict counting + caching 2013-06-11 Patrick Ohly * src/sysync/synccommand.cpp: synccommand: fix StatusCmd leak when command gets queued 2013-06-10 Patrick Ohly * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync/sysync_globs.h: ensure ordering of status replies 2013-06-10 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/syncml_tk/src/sml/inc/smldtd.h: * src/syncml_tk/src/sml/mgr/all/mgrutil.c: * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync_SDK/Sources/syerror.h: * src/sysync_SDK/Sources/sysync_utils.cpp: asynchronous command execution 2013-06-10 Patrick Ohly * src/sysync/engineinterface.cpp: logging: include prefix in output 2013-06-10 Patrick Ohly * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: syncsession: move code into new tryDelayedExecutionCommands() 2013-04-24 Patrick Ohly * configure.in: autotools: bump Linux/SyncEvolution sub-version for thread support 2013-04-17 Patrick Ohly * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: * src/gen-makefile-am.sh: Linux: enable multithreading for combi engine 2013-05-06 Patrick Ohly * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: debuglogger: fix use-after-free bug with separate logs 2013-05-06 Patrick Ohly * src/sysync/debuglogger.cpp: debuglogger: fix uninitialized memory read when using separate logs 2013-04-26 Patrick Ohly * src/platform_adapters/unix_common/platform_thread.cpp: * src/synthesis-linker.map: Linux: allow overriding blocking pthread code 2013-04-25 Patrick Ohly * src/platform_adapters/unix_common/platform_thread.cpp: Linux: fix compiler warning in threading code 2013-04-24 Patrick Ohly * src/sysync/stdlogicds.cpp: TStdLogicDS: fix uninitialized memory read when using multithreading 2013-04-17 Patrick Ohly * src/platform_adapters/platform_thread.h: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/stdlogicds.cpp: engine: fix thread support for Linux 2013-03-22 Patrick Ohly * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/blobs.cpp: SDK: handle malloc failures 2013-03-22 Patrick Ohly * src/sysync/binfileimplds.cpp: binfileimplds: avoid potential uninitialized memory read 2013-03-22 Patrick Ohly * src/sysync/binfileimplclient.cpp: binfileclient: avoid leak 2013-03-22 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdec.c: SyncML Toolkit: avoid use-after-free bug 2013-03-22 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.h: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/sysync/debuglogger.h: * src/sysync/engineinterface.h: * src/sysync/itemfield.h: * src/sysync/mimedirprofile.h: * src/sysync/syncappbase.h: * src/sysync/synccommand.h: * src/sysync/syncdatastore.h: * src/sysync/syncitem.h: * src/sysync/syncitemtype.h: * src/sysync_SDK/Sources/dbitem.h: * src/sysync_SDK/Sources/enginemodulebase.h: * src/sysync_SDK/Sources/san.h: * src/sysync_SDK/Sources/sysync_noncopyable.h: * src/sysync_SDK/Sources/sysync_utils.h: mark classes a noncopyable 2013-03-19 Patrick Ohly * src/DB_interfaces/api_db/DLL_interface.cpp: DLL DB interface: fix memory leak in error path 2013-02-27 Patrick Ohly Merge remote-tracking branch 'gitorious/master' 2013-02-21 Patrick Ohly * src/sysync/stdlogicds.cpp: caching mode: fix memory leak 2012-12-27 Lukas Zeller * src/global_options.h: libsynthesis 3.4.0.47 2012-12-27 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/iossdkfull' into syncmlios 2012-12-24 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync_ios.xcodeproj/project.pbxproj: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: Silenced warning, updated settings according to XCode recommendations 2012-12-24 Lukas Zeller * src/sysync/stdlogicds.cpp: Added missing #ifdef that prevented client-only library build since 758c470e92 (engine: initial support for caching of remote data) 2012-11-26 Lukas Zeller * src/sysync/syncagent.cpp: Minor comment cosmetics 2012-11-26 Lukas Zeller * src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa.h: * src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa.m: cocoa db plugin: added newOpenKeyByPath to allow plugins to open global settings keys (like for example engine info or config vars) 2012-11-05 Lukas Zeller * src/global_options.h: libsynthesis 3.4.0.46 2012-11-01 Patrick Ohly Merge tag 'libsynthesis_3.4.0.45' into pbap 2012-10-29 Lukas Zeller * src/sysync/synccommand.cpp: processing sync op command containing chunked item w/o data (as OCS apparently can generate): made sure command returns status 2012-10-10 Lukas Zeller * src/sysync/localengineds.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: SyncModeExtensions: added config flag that must be set in config to enable non-standard sync modes to be added into config. This is because some servers fail to work when non-standard modes are present, so by default they are off now. 2012-10-02 Lukas Zeller * src/global_options.h: libsynthesis 3.4.0.45 2012-10-02 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/syncmlios' into luz 2012-10-01 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/syncagent.cpp: Fixes small ifdef issues which made compiling for server-only fail 2012-10-01 Lukas Zeller Merge branch 'refs/heads/luz_rebased' into luz 2012-09-26 Lukas Zeller * src/platform_adapters/macosx/configfiles.mm: iOS6 bug workaround - identifierForVendor returning 00000000-0000-0000-0000-000000000000 will now fall back to return UDID instead. 2012-09-22 Lukas Zeller * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: XCode 4.5 - cosmetic scheme opening side effect 2012-09-17 Lukas Zeller * Synthesis_AG_Contributor_Agreement.doc: * Synthesis_AG_Contributor_Agreement.pdf: * libsynthesis_contributor_agreement.doc: * libsynthesis_contributor_agreement.pages: * libsynthesis_contributor_agreement.pdf: updated contributor agreement name 2012-09-15 Lukas Zeller * src/Targets/ReleasedProducts/clientEngine_opensource_ios/target_options.h: * src/Targets/ReleasedProducts/combiEngine_opensource_ios/target_options.h: iOS: release builds no longer have extended debug, just normal. 2012-09-14 Lukas Zeller * src/sysync_ios.xcodeproj/project.pbxproj: iOS6/XCode 4.5: no longer building for armv6, but now for armv7s (in addition to armv7) 2012-09-13 Patrick Ohly Merge branch 'master' into pbap 2012-09-10 Lukas Zeller * src/platform_adapters/macosx/configfiles.mm: configfiles: Fixed iOS6 case, was missing conversion to C string 2012-09-10 Lukas Zeller * src/platform_adapters/macosx/configfiles.mm: iOS: changed to using identifierForVendor instead of deprecated UUID in iOS6 2012-09-10 Patrick Ohly * configure.in: autotools: bumped minor version 2012-09-09 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/syncmlios' into syncmlios_air 2012-09-09 Lukas Zeller * src/sysync/binfileimplclient.cpp: binfile: Fixed bug in deleteProfile() introduced in 2008 - after deleting last profile settings file was not recreated correctly, so subsequent operations (like adding a new profile) did not work until app was restarted. 2012-09-07 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: TPluginAPIDS: protected dsFinalizeLocalID() from calling into plugin before DBApi_Data has been initialized (created a DB context). 2012-09-06 Lukas Zeller * src/sysync_ios.xcodeproj/project.pbxproj: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: XCode 4.4: applied recommended scheme updates (use LLDB, no longer GDB - howvever needed to do it manually as debugger for test action is not automatically upgraded, only setting for run action is). 2012-09-05 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/luz_rebased' into syncmlios 2012-09-05 Lukas Zeller * src/sysync/syncagent.cpp: Fixed merge artifact (missing comma) 2012-09-05 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/luz_rebased' into syncmlios 2012-08-24 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.cpp: * src/sysync/syncitem.h: engine: override merge options 2012-08-24 Patrick Ohly * src/sysync/itemfield.cpp: engine: ignore unassigned entries at end of array 2012-08-23 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: engine: initial support for caching of remote data 2012-09-03 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: engine: updated logging of sync keys 2012-09-03 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdec.c: * src/syncml_tk/src/sml/xlt/all/xltdeccom.h: * src/syncml_tk/src/sml/xlt/all/xltdecwbxml.c: * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: SyncML TK: don't read past end of buffer 2012-08-16 Patrick Ohly * src/sysync/textitemtype.cpp: * src/sysync/textitemtype.h: engine: allow text->VJOURNAL conversion 2012-07-12 Patrick Ohly * src/Makefile.am.in: autotools: must link against libpthreads 2012-06-19 Patrick Ohly * src/sysync/localengineds.cpp: CtCap: Funambol workaround 2012-06-08 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: sync client: made sync mode choice configurable 2012-06-06 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: SyncCap: compatibility enhancement for Nokia phones 2012-08-29 Lukas Zeller * src/sysync/stdlogicds.cpp: engine: item counting corrected (before, items that could not be sent in the current message and were queued for the next message were not counted in the statistics and also not reported via pev_itemsent progress event) 2012-08-23 Lukas Zeller * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m: Cocoa wrapper: added conditionals to allow using in ARC code, silenced some LLVM analyzer warnings 2012-08-10 Lukas Zeller * src/global_options.h: Engine Version 3.4.0.44 2012-07-27 Lukas Zeller * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: Delayed termination of sync session added - experimental for now 2012-06-19 Lukas Zeller * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: XCode upgrade version changed 2012-06-08 Patrick Ohly * src/synthesis-linker.map: * src/sysync/debuglogger.cpp: * src/sysync/sysync_debug.h: console printing: allow app to override printf() 2012-06-08 Patrick Ohly * src/sysync/sysync_debug.h: console printing: added line break to CONSOLEINFO_LIBC version 2012-06-07 Lukas Zeller * src/sysync/debuglogger.cpp: * src/sysync/sysync_debug.h: SyncML TK (and other global) debug output: added LF when using CONSOLEINFO_LIBC mode (introduced in 13ff1e4149 (logging + Linux: enable console output)) 2012-05-29 Lukas Zeller * src/global_options.h: libsynthesis 3.4.0.42 2012-05-22 Patrick Ohly * src/sysync/syncappbase.cpp: logging: avoid hard-coding log settings when is set 2012-05-22 Patrick Ohly * src/sysync/localengineds.cpp: SyncML server: avoid Replace command without IDs during resumed sync 2012-05-22 Patrick Ohly * src/sysync/debuglogger.cpp: debug logger: avoid deadlock when opening log file fails 2012-05-22 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: engine: fixed memory leaks 2012-05-03 Patrick Ohly * src/sysync/scriptcontext.cpp: script context: fixed out-of-bounds memory access 2012-05-02 Patrick Ohly * configure.in: autotools: bumped minor version 2012-05-02 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/multifielditemtype.cpp: * src/sysync/remotedatastore.cpp: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncdatastore.h: datastore + CTCap: added support for flags 2012-05-02 Patrick Ohly * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: super datastore: implemented canRestart() 2012-03-29 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/remotedatastore.cpp: SyncCap: X-SYNTHESIS-RESTART -> 390001 (for Funambol) 2012-05-29 Andris Pavenis * src/syncml_tk/src/sml/xlt/all/xltmetinf.c: Workaround problem with Sony Xperia 2012 (S and perhaps also P and U) phones 2012-05-25 Andris Pavenis * configure.in: Fix configure option --enable-debug-logs help string 2012-05-25 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltmetinf.c: SyncML TK: Added missing parsing error debug output for parsing 2012-05-23 Lukas Zeller * src/global_options.h: * src/sysync/syncappbase.cpp: sysytool/sysytest: added error message output when wbxml2xml conversion is aborted due to an internal ENcoder error. 2012-05-23 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltenc.c: SyncML TK: Fixed stoneage (2003) bug in encoder which caused XML generation of empty tags to fail, such as in SE LT26i devInf. 2012-03-25 Lukas Zeller * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.pbxproj: * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/xcshareddata/xcschemes/dbplugin_cocoa_sample_ios.xcscheme: * src/sysync_SDK/ios_syncclient_app_sample/MainViewController.m: * src/sysync_SDK/ios_syncclient_app_sample/READ-ME-iOS_syncclient_sample.txt: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.pbxproj: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/xcshareddata/xcschemes/ios_syncclient_app_sample.xcscheme: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xml: iOS sample app: changed linking of libsynthesis and plugins to standard way to do it. Also improved default logging. 2012-03-16 Lukas Zeller * src/sysync_SDK/ios_syncclient_app_sample/FlipsideViewController.m: * src/sysync_SDK/ios_syncclient_app_sample/MainViewController.m: iOS sample app: fixed inconsistencies with dbtypeid, now using SYNCML_TARGET_DBID definition everywhere. 2012-03-16 Lukas Zeller * src/sysync_SDK/ios_syncclient_app_sample/READ-ME-iOS_syncclient_sample.txt: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.pbxproj: iOS: added readme and fixed SYNCMMLIB build setting which was pointing to the wrong library (sample uses the client lib, not the combi lib) 2012-03-24 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync_ios.xcodeproj/project.pbxproj: XCode/iOS/LLVM/CLANG: Very weird THUMB calculation errors in release builds (but not in debug). Note: This was caused by a compiler bug (see rdar://11116189 and http://openradar.appspot.com/radar?id=1614412) which has been resolved as of XCode 4.4 DP5 2012-03-24 Lukas Zeller * src/sysync/remotedatastore.cpp: show RemoteSyncTypes block in log collapsed by default (stretches devInf log part too much for most cases) 2012-03-23 Lukas Zeller * src/sysync/remotedatastore.cpp: * src/sysync/synccommand.cpp: Debug log cosmetics: clarified MaxMsgSize reception and RemoteSyncTypes checking in devInf 2012-03-08 Patrick Ohly * src/sysync/binfileimplds.cpp: binfile client: better random LUID generation 2012-03-06 Patrick Ohly * src/sysync/itemfield.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncclientbase.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: scripting: file URI decoding 2012-08-10 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/configelement.cpp: * src/sysync/customimplds.cpp: * src/sysync/itemfield.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/timezones.cpp: * src/sysync_SDK/Sources/lineartime.cpp: timezones: previous commit (DAYLIGHT recognition...) broke persisting TZ names in DBs, as TimeZoneContextToName() ignored the aPrefIdent argument and also its default value by hard-coding it to "o". 2012-03-04 Beat Forster * src/platform_adapters/macosx/platform_timezones.mm: * src/sysync/timezones.cpp: * src/sysync/timezones.h: * src/sysync/vtimezone.cpp: vCalendar 1.0 DAYLIGHT recognition improved, now works with floating DST start/end time specs as well 2012-03-02 Patrick Ohly * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: source link: always allow config options 2012-02-29 Patrick Ohly * src/sysync/syncagent.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: restarting sync: support multiple datastores 2012-02-29 Patrick Ohly * src/sysync/localengineds.cpp: TLocalDSConfig: fCanRestart might have been undefined 2012-02-24 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/remotedatastore.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncdatastore.cpp: * src/sysync/syncdatastore.h: restart sync: extend DevInf and check whether datastores support restarts 2012-02-23 Patrick Ohly * src/sysync/syncagent.cpp: SyncML extensions: multiple cycles + DevInf 2012-02-27 Patrick Ohly * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: * src/syncapps/serverEngine_custom/combi_product_options.h: * src/syncml_tk/src/sml/xlt/all/xltdec.c: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncsession.cpp: * src/sysync/sysync_debug.h: logging + Linux: enable console output 2012-03-02 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: SyncML TK: support (hexa-)decimal character entities in XML 2012-02-16 Lukas Zeller * src/sysync_ios.xcodeproj/project.pbxproj: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: XCode 4.3: applied recommended project settings updates (= now using LLDB, no longer GDB, and disable THUMB support), added scheme for client-only build of engine 2012-02-25 Lukas Zeller * src/sysync/syncagent.h: libsynthesis: fRestartSyncOnce must be present in client-only builds as well 2012-02-07 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: datastore: explicitly tell the engine whether restarting a sync is supported 2012-02-07 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: * src/sysync/localengineds.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: SyncML extensions: multiple cycles in the same session 2012-02-07 Patrick Ohly * src/sysync/binfileimplds.cpp: DB_Conflict (409): different implementation in binfileimplds.cpp 2012-02-07 Patrick Ohly * src/sysync/customimplds.cpp: TCustomImplDS::implMarkOnlyUngeneratedForResume: fixed endless loop 2012-02-06 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: plugin API: pass firstReadNextItem=true on first call 2012-02-06 Patrick Ohly * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: sync agent: code refactoring for allFromClientOnly 2012-02-02 Lukas Zeller * src/global_options.h: * src/sysync/syncagent.cpp: * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.h: * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m: engine 3.4.0.41: Added "errorMsg" and "debugMsg" write-only session key values - these can be used to write messages into the debug log (such as transport level problems) 2012-02-02 Lukas Zeller * src/sysync/localengineds.cpp: Abort sync of the datastore when filters specified for SyncML version < 1.2 2012-09-05 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/pbap' into luz 2012-09-05 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/master' into luz 2012-09-03 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: engine: updated logging of sync keys 2012-09-03 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdec.c: * src/syncml_tk/src/sml/xlt/all/xltdeccom.h: * src/syncml_tk/src/sml/xlt/all/xltdecwbxml.c: * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: SyncML TK: don't read past end of buffer 2012-08-30 Lukas Zeller * src/sysync/stdlogicds.cpp: engine: previous patch was accidentally server-only, same correction needed for client case as well. 2012-08-24 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.cpp: * src/sysync/syncitem.h: engine: override merge options 2012-08-24 Patrick Ohly * src/sysync/itemfield.cpp: engine: ignore unassigned entries at end of array 2012-08-23 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: engine: initial support for caching of remote data 2012-08-29 Lukas Zeller * src/sysync/stdlogicds.cpp: engine: item counting corrected (before, items that could not be sent in the current message and were queued for the next message were not counted in the statistics and also not reported via pev_itemsent progress event) 2012-08-24 Lukas Zeller * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m: Cocoa wrapper: result of super should be assigned to self in init (Analyzer warning silenced) 2012-08-23 Lukas Zeller * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m: Cocoa wrapper: added conditionals to allow using in ARC code 2012-08-16 Patrick Ohly * src/sysync/textitemtype.cpp: * src/sysync/textitemtype.h: engine: allow text->VJOURNAL conversion 2012-08-10 Lukas Zeller * src/global_options.h: Engine Version 3.4.0.44 2012-08-10 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/configelement.cpp: * src/sysync/customimplds.cpp: * src/sysync/itemfield.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/timezones.cpp: * src/sysync_SDK/Sources/lineartime.cpp: timezones: since 9dd44b3366 (DAYLIGHT recognition adapted), TimeZoneContextToName() ignored the aPrefIdent argument and also its default value by overriding it with "o". 2012-07-27 Lukas Zeller * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: Delayed termination of sync session added - experimental for now 2012-07-12 Patrick Ohly * src/Makefile.am.in: autotools: must link against libpthreads 2012-06-19 Lukas Zeller * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: XCode upgrade version changed 2012-06-19 Patrick Ohly * src/sysync/localengineds.cpp: CtCap: Funambol workaround 2012-06-08 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: sync client: made sync mode choice configurable 2012-06-08 Patrick Ohly * src/synthesis-linker.map: * src/sysync/debuglogger.cpp: * src/sysync/sysync_debug.h: console printing: allow app to override printf() 2012-06-08 Patrick Ohly * src/sysync/sysync_debug.h: console printing: added line break to CONSOLEINFO_LIBC version 2012-06-07 Lukas Zeller * src/sysync/debuglogger.cpp: * src/sysync/sysync_debug.h: SyncML TK (and other global) debug output: added LF when using CONSOLEINFO_LIBC mode (introduced in 13ff1e4149 (logging + Linux: enable console output)) 2012-06-06 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: SyncCap: compatibility enhancement for Nokia phones 2012-05-29 Lukas Zeller * src/global_options.h: libsynthesis 3.4.0.42 2012-05-29 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/master' into luz 2012-05-29 Andris Pavenis * src/syncml_tk/src/sml/xlt/all/xltmetinf.c: Workaround problem with Sony Xperia 2012 (S and perhaps also P and U) phones 2012-05-25 Andris Pavenis * configure.in: Fix configure option --enable-debug-logs help string 2012-05-25 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltmetinf.c: SyncML TK: Added missing parsing error debug output for parsing 2012-05-23 Patrick Ohly Merge remote-tracking branch 'gitorious/luz' 2012-05-23 Lukas Zeller * src/global_options.h: * src/sysync/syncappbase.cpp: sysytool/sysytest: added error message output when wbxml2xml conversion is aborted due to an internal ENcoder error. 2012-05-23 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltenc.c: SyncML TK: Fixed stoneage (2003) bug in encoder which caused XML generation of empty tags to fail, such as in SE LT26i devInf. 2012-05-22 Patrick Ohly * src/sysync/syncappbase.cpp: logging: avoid hard-coding log settings when is set 2012-05-22 Patrick Ohly * src/sysync/localengineds.cpp: SyncML server: avoid Replace command without IDs during resumed sync 2012-05-22 Patrick Ohly * src/sysync/debuglogger.cpp: debug logger: avoid deadlock when opening log file fails 2012-05-22 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: engine: fixed memory leaks 2012-05-03 Patrick Ohly * src/sysync/scriptcontext.cpp: script context: fixed out-of-bounds memory access 2012-05-02 Patrick Ohly * configure.in: autotools: bumped minor version 2012-05-02 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/multifielditemtype.cpp: * src/sysync/remotedatastore.cpp: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncdatastore.h: datastore + CTCap: added support for flags 2012-05-02 Patrick Ohly * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: super datastore: implemented canRestart() 2012-03-29 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/remotedatastore.cpp: SyncCap: X-SYNTHESIS-RESTART -> 390001 (for Funambol) 2012-03-29 Lukas Zeller * src/sysync_SDK/ios_syncclient_app_sample/MainViewController.m: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xml: iOS app sample: enabled config error messages to console and creation of tmp/sysynclogs directory in DEBUG builds 2012-03-25 Lukas Zeller * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.pbxproj: * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/xcshareddata/xcschemes/dbplugin_cocoa_sample_ios.xcscheme: * src/sysync_SDK/ios_syncclient_app_sample/READ-ME-iOS_syncclient_sample.txt: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.pbxproj: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/xcshareddata/xcschemes/ios_syncclient_app_sample.xcscheme: iOS sample app: changed linking of libsynthesis and plugins to standard way to do it. 2012-03-24 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync_ios.xcodeproj/project.pbxproj: XCode/iOS/LLVM/CLANG: Very weird calculation errors in release builds (but not in debug) seemingly fixed by specifying -mno-thumb. 2012-03-24 Lukas Zeller * src/sysync/remotedatastore.cpp: show RemoteSyncTypes block in log collapsed by default (stretches devInf log part too much for most cases) 2012-03-24 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/luz' into syncmlios 2012-03-23 Lukas Zeller * src/sysync/remotedatastore.cpp: * src/sysync/synccommand.cpp: Debug log cosmetics: clarified MaxMsgSize reception and RemoteSyncTypes checking in devInf 2012-03-16 Lukas Zeller * src/sysync_SDK/ios_syncclient_app_sample/FlipsideViewController.m: * src/sysync_SDK/ios_syncclient_app_sample/MainViewController.m: iOS sample app: fixed inconsistencies with dbtypeid, now using SYNCML_TARGET_DBID definition everywhere. 2012-03-16 Lukas Zeller * src/sysync_SDK/ios_syncclient_app_sample/READ-ME-iOS_syncclient_sample.txt: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.pbxproj: iOS: added readme and fixed SYNCMMLIB build setting which was pointing to the wrong library (sample uses the client lib, not the combi lib) 2012-03-13 Lukas Zeller * src/sysync_ios.xcodeproj/project.pbxproj: XCode 4.3: applied recommended project settings updates: disable THUMB support 2012-03-11 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/for-master/fake-local-id' into syncmlios 2012-03-08 Patrick Ohly * src/sysync/binfileimplds.cpp: binfile client: better random LUID generation 2012-03-06 Patrick Ohly * src/sysync/itemfield.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncclientbase.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: scripting: file URI decoding 2012-03-07 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/for-master/sourcelink-config' into luz 2012-03-02 Patrick Ohly * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: source link: always allow config options 2012-03-02 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: SyncML TK: support (hexa-)decimal character entities in XML 2012-03-05 Lukas Zeller * src/platform_adapters/macosx/platform_timezones.mm: iOS: adapted platform_timezones.mm to new signature of Get_tChange() 2012-03-04 Beat Forster * src/sysync/timezones.cpp: * src/sysync/timezones.h: * src/sysync/vtimezone.cpp: vCalendar 1.0 DAYLIGHT recognition improved, now works with floating DST start/end time specs as well 2012-03-05 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/for-master/sourcelink-config' into luz 2012-03-05 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/for-master/xmldecode' into luz 2012-03-02 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: SyncML TK: support (hexa-)decimal character entities in XML 2012-03-02 Patrick Ohly * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: source link: always allow config options 2012-03-02 SyncEvolution Nightly Testing Merge remote branch 'origin/for-master/internal-sync' into nightly 2012-02-29 Patrick Ohly * src/sysync/syncagent.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: restarting sync: support multiple datastores 2012-02-29 Patrick Ohly * src/sysync/localengineds.cpp: TLocalDSConfig: fCanRestart might have been undefined 2012-02-27 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltdec.c: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncsession.cpp: logging: fixed CONSOLEPRINTF format conversion issues 2012-02-27 Patrick Ohly * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: * src/syncapps/serverEngine_custom/combi_product_options.h: * src/sysync/sysync_debug.h: logging + Linux: enable console output 2012-02-25 Lukas Zeller Merge remote-tracking branch 'refs/remotes/plan44.ch/syncmlios' into luz 2012-02-25 Lukas Zeller * src/global_options.h: Expiry date for non-OS-builds now in 2013 2012-02-25 Lukas Zeller * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: XCode: added scheme for client-only build of engine 2012-02-25 Lukas Zeller * src/sysync/syncagent.h: libsynthesis: fRestartSyncOnce must be present in client-only builds as well 2012-02-24 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/remotedatastore.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncdatastore.cpp: * src/sysync/syncdatastore.h: restart sync: extend DevInf and check whether datastores support restarts 2012-02-23 Patrick Ohly * src/sysync/syncagent.cpp: SyncML extensions: multiple cycles + DevInf 2012-02-16 Lukas Zeller * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: XCode 4.3: applied recommended project settings updates (= now using LLDB, no longer GDB) 2012-02-16 Lukas Zeller Merge Patrick's internal-sync' into syncmlios for testing resolved conflict in session key list (Patrick added restartSync, while I added erroMsg+debugMsg) 2012-02-07 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: datastore: explicitly tell the engine whether restarting a sync is supported 2012-02-07 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: * src/sysync/localengineds.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: SyncML extensions: multiple cycles in the same session 2012-02-07 Patrick Ohly * src/sysync/binfileimplds.cpp: DB_Conflict (409): different implementation in binfileimplds.cpp 2012-02-07 Patrick Ohly * src/sysync/customimplds.cpp: TCustomImplDS::implMarkOnlyUngeneratedForResume: fixed endless loop 2012-02-06 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: plugin API: pass firstReadNextItem=true on first call 2012-02-06 Patrick Ohly * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: sync agent: code refactoring for allFromClientOnly 2012-02-02 Lukas Zeller * src/global_options.h: * src/sysync/syncagent.cpp: * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.h: * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m: engine 3.4.0.41: Added "errorMsg" and "debugMsg" write-only session key values - these can be used to write messages into the debug log (such as transport level problems) 2012-02-02 Lukas Zeller * src/sysync/localengineds.cpp: Abort sync of the datastore when filters specified for SyncML version < 1.2 2012-01-14 Lukas Zeller * src/global_options.h: libsynthesis 3.4.0.40 - first release including iOS 2012-01-12 Patrick Ohly * src/gen-makefile-am.sh: autotools: exclude Mac OS X files 2012-01-12 Patrick Ohly * src/sysync/syncagent.cpp: syncagent: properly handle empty buffer 2012-01-08 Lukas Zeller * src/platform_adapters/macosx/configfiles.cpp: * src/platform_adapters/macosx/configfiles.mm: * src/platform_adapters/macosx/platform_DLL.cpp: * src/platform_adapters/macosx/platform_timezones.cpp: * src/sysync_ios.xcodeproj/project.pbxproj: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: iOS: cleanup, removed obsolete and unneeded files 2011-12-22 Lukas Zeller * src/sysync_SDK/ios_syncclient_app_sample/AppDelegate.h: * src/sysync_SDK/ios_syncclient_app_sample/AppDelegate.m: * src/sysync_SDK/ios_syncclient_app_sample/FlipsideViewController.h: * src/sysync_SDK/ios_syncclient_app_sample/FlipsideViewController.m: * src/sysync_SDK/ios_syncclient_app_sample/MainViewController.h: * src/sysync_SDK/ios_syncclient_app_sample/MainViewController.m: * src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/SyncMLClient.h: * src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/SyncMLClient.m: * src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/ZKeyChainWrapper.h: * src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/ZKeyChainWrapper.m: * src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/ZWebRequest.h: * src/sysync_SDK/ios_syncclient_app_sample/SyncMLClient/ZWebRequest.m: * src/sysync_SDK/ios_syncclient_app_sample/en.lproj/FlipsideViewController.xib: * src/sysync_SDK/ios_syncclient_app_sample/en.lproj/InfoPlist.strings: * src/sysync_SDK/ios_syncclient_app_sample/en.lproj/MainViewController_iPad.xib: * src/sysync_SDK/ios_syncclient_app_sample/en.lproj/MainViewController_iPhone.xib: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample-Info.plist: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample-Prefix.pch: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.pbxproj: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xcodeproj/xcshareddata/xcschemes/ios_syncclient_app_sample.xcscheme: * src/sysync_SDK/ios_syncclient_app_sample/ios_syncclient_app_sample.xml: * src/sysync_SDK/ios_syncclient_app_sample/main.m: iOS: added sample app, synchronizing contacts (or calendar) into a TAB-separated text file 2011-12-22 Lukas Zeller * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.pbxproj: * src/sysync_SDK/dbplugin_cocoa_sample/target_options.h: iOS: fixed dbplugin_cocoa_sample_ios project, must not include dbplugin_cocoa.m into compilation. 2011-12-22 Lukas Zeller * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.pbxproj: * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata: * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios.xcodeproj/xcshareddata/xcschemes/dbplugin_cocoa_sample_ios.xcscheme: * src/sysync_SDK/dbplugin_cocoa_sample/dbplugin_cocoa_sample_ios_Prefix.pch: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin.h: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin.m: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin1.h: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin1.mm: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin2.h: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin2.mm: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin3.h: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin3.mm: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin4.h: * src/sysync_SDK/dbplugin_cocoa_sample/sample_dbplugin4.mm: * src/sysync_SDK/dbplugin_cocoa_sample/target_options.h: iOS: added dbplugin_cocoa_sample_ios project to create library with 4 empty plugins to link libsynthesis against. 2011-12-21 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: DB_Conflict (409): added missing implementation in binfileimplds.cpp 2011-12-21 Lukas Zeller * src/sysync_ios.xcodeproj/project.pbxproj: iOS: enhanced linkability - removed duplicate implementation of some functions, enabled single-object prelink. 2011-12-20 Lukas Zeller * .gitignore: * src/Targets/ReleasedProducts/clientEngine_opensource_ios/define.h: * src/Targets/ReleasedProducts/clientEngine_opensource_ios/prefix_file.h: * src/Targets/ReleasedProducts/clientEngine_opensource_ios/syncml_tk_prefix_file.h: * src/Targets/ReleasedProducts/clientEngine_opensource_ios/target_options.h: * src/Targets/ReleasedProducts/combiEngine_opensource_ios/define.h: * src/Targets/ReleasedProducts/combiEngine_opensource_ios/prefix_file.h: * src/Targets/ReleasedProducts/combiEngine_opensource_ios/syncml_tk_prefix_file.h: * src/Targets/ReleasedProducts/combiEngine_opensource_ios/target_options.h: * src/global_options.h: * src/sysync/rrules.h: * src/sysync_SDK/Sources/sysync_utils.h: * src/sysync_ios.xcodeproj/project.pbxproj: * src/sysync_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_clientEngine_opensource_ios.xcscheme: * src/sysync_ios.xcodeproj/xcshareddata/xcschemes/static_combiEngine_opensource_ios.xcscheme: iOS: XCode project and target definitions for opensource iOS client-only and client-server libraries 2011-12-20 Lukas Zeller * src/sysync_SDK/sdk_sources_cocoa/SettingsKey.h: * src/sysync_SDK/sdk_sources_cocoa/SettingsKey.m: * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.h: * src/sysync_SDK/sdk_sources_cocoa/SyncEngine.m: * src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa.h: * src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa.m: * src/sysync_SDK/sdk_sources_cocoa/dbplugin_cocoa_wrapper.mm: * src/sysync_SDK/sdk_sources_cocoa/target_options.h: iOS: Objective C / Cocoa wrapper classes for easy using libsynthesis API 2011-12-20 Lukas Zeller * src/platform_adapters/macosx/configfiles.cpp: * src/platform_adapters/macosx/configfiles.mm: * src/platform_adapters/macosx/platform_DLL.cpp: * src/platform_adapters/macosx/platform_exec.c: * src/platform_adapters/macosx/platform_exec.h: * src/platform_adapters/macosx/platform_headers.h: * src/platform_adapters/macosx/platform_time.cpp: * src/platform_adapters/macosx/platform_time.h: * src/platform_adapters/macosx/platform_timezones.cpp: * src/platform_adapters/macosx/platform_timezones.mm: * src/platform_adapters/macosx/profiling.cpp: iOS: Added platform adapters for Mac OS X / iOS 2011-12-20 Lukas Zeller * src/pcre/132html: * src/pcre/AUTHORS: * src/pcre/CMakeLists.txt: * src/pcre/COPYING: * src/pcre/ChangeLog: * src/pcre/CleanTxt: * src/pcre/Detrail: * src/pcre/HACKING: * src/pcre/INSTALL: * src/pcre/LICENCE: * src/pcre/Makefile.am: * src/pcre/NEWS: * src/pcre/NON-UNIX-USE: * src/pcre/PrepareRelease: * src/pcre/README: * src/pcre/RunGrepTest: * src/pcre/RunTest: * src/pcre/RunTest.bat: * src/pcre/config-cmake.h.in: * src/pcre/config.h: * src/pcre/config.h.generic: * src/pcre/configure.ac: * src/pcre/dftables.c: * src/pcre/libpcre.pc.in: * src/pcre/libpcrecpp.pc.in: * src/pcre/makevp.bat: * src/pcre/makevp_c.txt: * src/pcre/makevp_l.txt: * src/pcre/pcre-config.in: * src/pcre/pcre.h: * src/pcre/pcre.h.generic: * src/pcre/pcre.h.in: * src/pcre/pcre_chartables.c: * src/pcre/pcre_chartables.c.dist: * src/pcre/pcre_compile.c: * src/pcre/pcre_config.c: * src/pcre/pcre_config_android.h: * src/pcre/pcre_config_macosx.h: * src/pcre/pcre_config_win32.h: * src/pcre/pcre_dfa_exec.c: * src/pcre/pcre_exec.c: * src/pcre/pcre_fullinfo.c: * src/pcre/pcre_get.c: * src/pcre/pcre_globals.c: * src/pcre/pcre_info.c: * src/pcre/pcre_internal.h: * src/pcre/pcre_maketables.c: * src/pcre/pcre_newline.c: * src/pcre/pcre_ord2utf8.c: * src/pcre/pcre_printint.src: * src/pcre/pcre_refcount.c: * src/pcre/pcre_scanner.cc: * src/pcre/pcre_scanner.h: * src/pcre/pcre_scanner_unittest.cc: * src/pcre/pcre_setup.h: * src/pcre/pcre_stringpiece.cc: * src/pcre/pcre_stringpiece.h.in: * src/pcre/pcre_stringpiece_unittest.cc: * src/pcre/pcre_study.c: * src/pcre/pcre_tables.c: * src/pcre/pcre_try_flipped.c: * src/pcre/pcre_ucp_searchfuncs.c: * src/pcre/pcre_valid_utf8.c: * src/pcre/pcre_version.c: * src/pcre/pcre_xclass.c: * src/pcre/pcrecpp.cc: * src/pcre/pcrecpp.h: * src/pcre/pcrecpp_internal.h: * src/pcre/pcrecpp_unittest.cc: * src/pcre/pcrecpparg.h.in: * src/pcre/pcredemo.c: * src/pcre/pcregexp.pas: * src/pcre/pcregrep.c: * src/pcre/pcreposix.c: * src/pcre/pcreposix.h: * src/pcre/pcretest.c: * src/pcre/perltest.pl: * src/pcre/ucp.h: * src/pcre/ucpinternal.h: * src/pcre/ucptable.h: iOS: needs PCRE sources, added them 2011-12-20 Lukas Zeller * src/sysync/timezones.h: * src/sysync/tz_table.h: timezones/tz_table: Don't include C++ STL headers in tz_table, as this file is included from within a namespace context. 2011-12-20 Lukas Zeller * .gitignore: iOS: exclude XCode build dir from git 2011-12-19 Lukas Zeller Merge branch 'refs/heads/meego' into luz 2011-11-21 Patrick Ohly * configure.in: autotools: bumped minor version 2011-11-21 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xlttags.c: SyncML Toolkit: fixed clang compiler warning 2011-11-17 Patrick Ohly * configure.in: autotools: avoid warnings for set but unused variables 2011-10-28 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.h: * src/sysync/superdatastore.cpp: * src/sysync/syncdatastore.h: server engine: more efficient deletion in superdatastore 2011-10-12 Patrick Ohly * configure.in: autotools: bumped minor version 2011-10-12 Patrick Ohly * src/sysync/customimplds.cpp: engine: fixed handling of 508 2011-09-15 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: engine: added to allow StartDataRead to occur early and possibly force a slow sync by returning 508 error code 2011-10-10 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: white space cleanup 2011-10-13 Patrick Ohly * Makefile.am: autotools: must include m4-repo in ACLOCAL_AMFLAGS 2011-10-13 Patrick Ohly * configure.in: * src/Makefile.am.in: autotools: version bump for SyncEvolution 1.2 2011-10-10 Patrick Ohly * configure.in: autotools: same suppressions for all warning levels 2011-10-11 Patrick Ohly * src/sysync/customimplds.cpp: DB_Conflict (409): fixed uninitialized memory access 2011-10-10 Patrick Ohly * configure.in: autotools: bumped version to 3.4.0.16.3 2011-09-30 Patrick Ohly * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: DB_Conflict (409): avoid sending unnecessary changes back to client 2011-09-30 Patrick Ohly * src/sysync/customimplds.cpp: DB_Conflict (409): correctly count updated and unmodified items 2011-09-30 Patrick Ohly * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: DB_Conflict (409): do age comparison before merging, avoid unneeded changes 2011-09-30 Patrick Ohly * src/sysync/customimplds.cpp: DB_Conflict (409): avoid confusing log message 2011-09-30 Patrick Ohly * src/sysync/multifielditemtype.cpp: COMPAREFIELDS(): fix -1 case 2011-09-15 Lukas Zeller * src/sysync/customimplds.cpp: engine: fixed bad object delete case (Patrick found it) - SendDBVersionOfItemAsServer() does not pass ownership for item returned! 2011-09-15 Patrick Ohly * src/sysync/customimplds.cpp: DB_DataMerged (207): avoid double free 2011-09-13 Patrick Ohly * configure.in: autotools: bumped version to 3.4.0.16.2 2011-09-12 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: plugin API: support new DB_DataReplaced/Merged/Conflict status codes 2011-08-29 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: plugin API: treat DB_DataMerged as success 2011-08-29 Patrick Ohly * src/sysync/dataconversion.cpp: dataconversion.cpp: added dummy getConflictingItemByLocalID() to resolve compile problem 2011-09-12 Lukas Zeller * src/DB_interfaces/api_db/dbapi.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync_SDK/Sources/syerror.h: * src/sysync_SDK/Sources/sync_dbapi.h: engine: added more merge options for DB implementations to ask engine for. 2011-08-29 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/superdatastore.h: server engine: better support for backend doing its own duplicate merging (status 207 from API) 2011-09-15 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/bmc22783' into luz 2011-09-15 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/master' into luz 2011-09-15 Lukas Zeller * src/global_options.h: * src/syncml_tk/src/sml/xlt/all/xlttags.c: * src/sysync/scriptcontext.cpp: * src/sysync_SDK/Sources/engine_defs.h: engine 3.4.0.35 + mixed minor cosmetic stuff 2011-09-15 Lukas Zeller * src/sysync/binfileimplclient.cpp: binfileimplclient: added "binfilesdir" fields to both target and profile key, returning the path where the *.bfi files are stored. 2011-09-15 Lukas Zeller * src/sysync/customimplds.cpp: Made sure zapping a datastore generates at least one pev_deleting progress event; slightly better total estimation for zapping filtered syncsets. 2011-09-15 Lukas Zeller * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/remotedatastore.cpp: * src/sysync/syncdatastore.cpp: * src/sysync/syncitem.cpp: * src/sysync/syncitemtype.cpp: * src/sysync/syncitemtype.h: Named methods for registering and getting types more clearly (local/remote) 2011-09-15 Lukas Zeller * src/DB_interfaces/api_db/dbapi.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync_SDK/Sources/syerror.h: * src/sysync_SDK/Sources/sync_dbapi.h: engine: added more merge options for DB implementations to ask engine for. 2011-09-13 Patrick Ohly * configure.in: autotools: bumped version to 3.4.0.16.2 2011-09-13 Patrick Ohly * autogen.sh: * m4-repo/dk-warn.m4: * m4/dk-warn.m4: autotools: fixed --enable-warning integration 2011-09-12 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: plugin API: support new DB_DataReplaced/Merged/Conflict status codes 2011-08-29 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: plugin API: treat DB_DataMerged as success 2011-08-29 Patrick Ohly * src/sysync/dataconversion.cpp: dataconversion.cpp: added dummy getConflictingItemByLocalID() to resolve compile problem 2011-09-12 Lukas Zeller * src/DB_interfaces/api_db/dbapi.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync_SDK/Sources/syerror.h: * src/sysync_SDK/Sources/sync_dbapi.h: engine: added more merge options for DB implementations to ask engine for. 2011-09-06 Lukas Zeller * src/Targets/ReleasedProducts/clientEngine_opensource_linux/clientengine_demo++.pch: * src/Targets/ReleasedProducts/clientEngine_opensource_linux/clientengine_demo.pch: cosmetic only - obsolete comment cleanup 2011-09-06 Lukas Zeller * .gitignore: .gitignore excluded local management script and related dirs 2011-09-02 Patrick Ohly * autogen.sh: * configure.in: * m4/dk-warn.m4: * src/Makefile.am.in: autotools: added --enable-warnings 2011-08-29 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/superdatastore.h: server engine: better support for backend doing its own duplicate merging (status 207 from API) 2011-08-29 Lukas Zeller Merge remote-tracking branch 'refs/remotes/meego/master' into luz 2011-08-18 Lukas Zeller * src/sysync/mimedirprofile.cpp: engine: MIME-DIR, fixed de-escaping in only-de-escape-linefeeds mode 2011-08-25 Andris Pavenis * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: Race condition writting global logs 2011-08-18 Lukas Zeller * src/sysync/mimedirprofile.cpp: engine: MIME-DIR, fixed de-escaping in only-de-escape-linefeeds mode 2011-08-22 Patrick Ohly * src/sysync_SDK/Sources/enginemodulebase.cpp: TEngineModuleBase::GetStrValue: use more efficient std::string::assign() 2011-08-17 Patrick Ohly * configure.in: * src/Makefile.am.in: bumped version to 3.4.0.16.1 and .so revision by one 2011-08-16 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/superdatastore.h: server engine: better support for backend doing its own duplicate merging (status 207 from API) 2011-08-15 Lukas Zeller Merge branch 'meego_patches_luz' into luz 2011-08-15 Lukas Zeller Merge remote-tracking branch 'meego/master' into luz 2011-08-15 Andris Pavenis * src/DB_interfaces/api_db/pluginapiagent.cpp: Make it possible to use plain text (B64) authentication when plugin uses Password_MD5_Nonce_IN 2011-08-09 Rohan Garg * src/Makefile.am.in: Add dl libraries to libsynthesis_la_LIBADD to make the sources compile on Ubuntu Oneiric 2011-07-22 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: "blob" fields: Added separate CONVMODE_BLOB_AUTO conversion mode for fields that should be rendered as B64 only in case they are really non-printable or non-ASCII 2011-07-22 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: "blob" fields: Added separate CONVMODE_BLOB_AUTO conversion mode for fields that should be rendered as B64 only in case they are really non-printable or non-ASCII 2011-07-22 Patrick Ohly * src/sysync/scriptcontext.cpp: scripting: added READ() method 2011-07-22 Patrick Ohly * src/sysync/scriptcontext.cpp: script error messages: fixed invalid memory access 2011-07-22 Patrick Ohly * src/sysync/mimedirprofile.cpp: "blob" fields: avoid binary encoding if possible 2011-07-22 Patrick Ohly * src/syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c: SMLTK: fixed g++ 4.6 compiler warning 2011-06-21 Patrick Ohly * src/sysync/mimedirprofile.cpp: engine: updated implementation of "unprocessed" wildcard properties 2011-06-20 Patrick Ohly Merge branch 'master' into overridedevinf 2011-06-20 Lukas Zeller * src/sysync/multifielditemtype.cpp: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: : added COMPAREMODE(), needed to determine compare mode 2011-06-16 Patrick Ohly * src/smltk-linker.map: libsmltk.so: export xltDecInit/xltDecTerminate/xltDecNext 2011-06-15 Patrick Ohly * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: remote rules + OverrideDevInf: parse DevInf as part of checking the config 2011-06-15 Patrick Ohly * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/localengineds.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: remote rules: added OverrideDevInf 2011-05-20 Lukas Zeller * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi.h: * src/DB_interfaces/api_db/dbapi_include.h: * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/DB_interfaces/odbc_db/odbcdb_precomp.h: * src/Transport_interfaces/engine/engineclientbase.cpp: * src/Transport_interfaces/engine/engineclientbase.h: * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/platform_adapters/binfile.cpp: * src/platform_adapters/binfile.h: * src/platform_adapters/configfiles.h: * src/platform_adapters/platform_headers.h: * src/platform_adapters/platform_thread.h: * src/platform_adapters/profiling.h: * src/platform_adapters/sysync_glob_vars.h: * src/platform_adapters/sysyncinit.cpp: * src/platform_adapters/unix_common/platform_pipe.c: * src/platform_adapters/unix_common/platform_pipe.h: * src/platform_adapters/unix_common/platform_thread.cpp: * src/sysync/binfilebase.cpp: * src/sysync/binfilebase.h: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.h: * src/sysync/clientautosync_inc.h: * src/sysync/clientprovisioning_inc.cpp: * src/sysync/configelement.cpp: * src/sysync/configelement.h: * src/sysync/customimplagent.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/dataobjtype.cpp: * src/sysync/dataobjtype.h: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: * src/sysync/iso8601.cpp: * src/sysync/iso8601.h: * src/sysync/mimediritemtype.cpp: * src/sysync/mimediritemtype.h: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.cpp: * src/sysync/multifielditemtype.h: * src/sysync/rawdataitemtype.cpp: * src/sysync/rawdataitemtype.h: * src/sysync/remotedatastore.cpp: * src/sysync/remotedatastore.h: * src/sysync/rrules.cpp: * src/sysync/rrules.h: * src/sysync/scriptcontext.cpp: * src/sysync/scriptcontext.h: * src/sysync/simpleitem.cpp: * src/sysync/simpleitem.h: * src/sysync/stdlogicagent.cpp: * src/sysync/stdlogicagent.h: * src/sysync/stringutils.cpp: * src/sysync/stringutils.h: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclientbase.cpp: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncdatastore.cpp: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync/syncsessiondispatch.cpp: * src/sysync/syncsessiondispatch.h: * src/sysync/syserial.h: * src/sysync/sysync_crc16.cpp: * src/sysync/sysync_crc16.h: * src/sysync/sysync_debug.h: * src/sysync/sysync_globs.h: * src/sysync/textitemtype.cpp: * src/sysync/textitemtype.h: * src/sysync/textprofile.cpp: * src/sysync/textprofile.h: * src/sysync/timezones.cpp: * src/sysync/timezones.h: * src/sysync/vcalendaritemtype.cpp: * src/sysync/vcalendaritemtype.h: * src/sysync/vcarditemtype.cpp: * src/sysync/vcarditemtype.h: * src/sysync/vtimezone.cpp: * src/sysync_SDK/Sources/engine_defs.h: * src/sysync_SDK/Sources/enginemodulebase.h: * src/sysync_SDK/Sources/generic_types.h: * src/sysync_SDK/Sources/lineartime.cpp: * src/sysync_SDK/Sources/lineartime.h: * src/sysync_SDK/Sources/san.cpp: * src/sysync_SDK/Sources/san.h: * src/sysync_SDK/Sources/sync_dbapi.h: * src/sysync_SDK/Sources/sync_dbapidef.h: * src/sysync_SDK/Sources/sysync_b64.cpp: * src/sysync_SDK/Sources/timeutil.cpp: * src/sysync_SDK/Sources/timeutil.h: whitespace cosmetics only: detabbed once again 2011-05-20 Lukas Zeller * src/sysync/localengineds.cpp: tempGUID checking: disabled expensive checks in normal builds (SYDEBUG>1 will enable it) 2011-05-20 Lukas Zeller * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/Makefile.am.in: * src/global_options.h: * src/sysync/mimedirprofile.h: * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/sync_dbapidef.h: engine 3.4.0.30, SDK 1.9.1 updates 2011-05-20 Lukas Zeller * src/sysync/binfileimplclient.cpp: Made d00c705d95 (binfile client: allow configs without server URL) conditional. Older Synthesis targets need that check. 2011-05-20 Lukas Zeller Merge remote branch 'refs/remotes/meego/master' into luz 2011-05-19 Patrick Ohly * src/sysync/debuglogger.cpp: TDebugLoggerBase: improved clang error suppression 2011-05-19 Patrick Ohly * src/sysync/customimplds.h: BinFileImplDS: ignore apiEndDataWrite() name clash 2011-05-19 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: Revert "BinFileImplDS: apiEndDataWrite() ambiguous" 2011-05-05 Patrick Ohly * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplds.cpp: gcc 4.6: fixed compile issue 2011-04-20 Patrick Ohly * src/sysync/mimedirprofile.cpp: MAKE/PARSETEXTWITHPROFILE(): support recursive 2011-04-19 Patrick Ohly * src/sysync/localengineds.cpp: * src/sysync_SDK/Sources/engine_defs.h: server progress events: report stable sync mode 2011-04-11 Patrick Ohly * src/sysync/scriptcontext.cpp: * src/sysync/stringutils.cpp: * src/sysync/syncappbase.cpp: * src/sysync_SDK/Sources/SDK_support.cpp: fixed compiler warnings around "unsigned >= 0" 2011-04-11 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: BinFileImplDS: apiEndDataWrite() ambiguous 2011-03-28 Patrick Ohly * src/Makefile.am.in: * synthesis-sdk.pc.in: * synthesis.pc.in: Synthesis SDK: explicitly define dependency on libsmltk 2011-02-28 Patrick Ohly * configure.in: * src/Makefile.am.in: version bump: new revision, mark in .pc file 2011-02-18 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/platform_adapters/binfile.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: * src/sysync/debuglogger.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/rrules.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncappbase.cpp: * src/sysync/timezones.cpp: * src/sysync_SDK/Sources/dbitem.cpp: compiler fixes for clang 2.8 2011-01-31 Patrick Ohly Merge remote branch 'synthesis/luz' 2011-01-28 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: mime-dir: Improved QP decoding, now detects not only CRLF, but also CR and LF within QP. Also fixed generator to avoid softbreak indicator at end of string. 2011-01-28 Lukas Zeller * src/global_options.h: * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: B64 decoding: fixed bad bug found by Patrick (thanks!) that caused B64 encoded properties not to be decoded any more. This was introduced with 3529d3cb09 2011-01-27 Patrick Ohly Merge remote branch 'synthesis/luz' 2011-01-27 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: * src/sysync/vcalendaritemtype.h: mimedir: more generic solution for conversion options (instead of special modes like BDAY, which is removed again) 2011-01-26 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: added conversion="BDAY" to render BDAY in ISO8601 extended format (special case for this property, even in vCard 3.0). 2011-01-26 Patrick Ohly Merge remote branch 'synthesis/luz' 2011-01-25 Lukas Zeller * src/global_options.h: * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: engine: implemented "unprocessed" wildcard properties to allow handling unknown extensions (like X-xxxx properies) 2011-01-25 Patrick Ohly * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: MAKE/PARSETEXTWITHPROFILE(): allow rule parameter to influence global conversion options 2011-01-25 Patrick Ohly * src/sysync/mimedirprofile.cpp: TMimeDirProfileHandler::getOptionsFromDatastore(): clarify usage of session pointer 2011-01-25 Patrick Ohly * src/sysync/binfileimplclient.cpp: binfile client: allow configs without server URL 2011-01-20 Lukas Zeller * src/DB_interfaces/api_db/DLL_interface.cpp: * src/DB_interfaces/api_db/DLL_interface.h: * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi.h: * src/DB_interfaces/api_db/dbapi_include.h: * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/DB_interfaces/api_db/sync_dbapiconnect.cpp: * src/DB_interfaces/api_db/sync_dbapiconnect.h: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/DB_interfaces/odbc_db/odbcapids.h: * src/Targets/ReleasedProducts/SDK/target_options.h: * src/Transport_interfaces/engine/engineclientbase.cpp: * src/Transport_interfaces/engine/engineclientbase.h: * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/platform_adapters/binfile.cpp: * src/platform_adapters/binfile.h: * src/platform_adapters/configfiles.h: * src/platform_adapters/linux/configfiles.cpp: * src/platform_adapters/linux/platform_DLL.cpp: * src/platform_adapters/linux/platform_exec.c: * src/platform_adapters/linux/platform_exec.h: * src/platform_adapters/linux/platform_headers.h: * src/platform_adapters/linux/platform_time.cpp: * src/platform_adapters/linux/platform_time.h: * src/platform_adapters/linux/platform_timezones.cpp: * src/platform_adapters/linux/profiling.cpp: * src/platform_adapters/platform_DLL.h: * src/platform_adapters/platform_file.h: * src/platform_adapters/platform_headers.h: * src/platform_adapters/platform_mutex.h: * src/platform_adapters/platform_thread.h: * src/platform_adapters/profiling.h: * src/platform_adapters/sysync_glob_vars.h: * src/platform_adapters/sysyncinit.cpp: * src/platform_adapters/unix_common/platform_file.cpp: * src/platform_adapters/unix_common/platform_mutex.cpp: * src/platform_adapters/unix_common/platform_pipe.c: * src/platform_adapters/unix_common/platform_pipe.h: * src/platform_adapters/unix_common/platform_thread.cpp: * src/syncapps/clientEngine_custom/clientengine_custom_Base.cpp: * src/syncapps/clientEngine_custom/clientengine_custom_Base.h: * src/syncapps/serverEngine_custom/serverengine_custom_Base.cpp: * src/syncapps/serverEngine_custom/serverengine_custom_Base.h: * src/syncapps/sysytool/sysytool.cpp: * src/syncapps/sysytool/sysytool_dispatch.cpp: * src/syncapps/sysytool/sysytool_dispatch.h: * src/sysync/binfilebase.cpp: * src/sysync/binfilebase.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/clientautosync_inc.cpp: * src/sysync/clientprovisioning_inc.cpp: * src/sysync/configelement.cpp: * src/sysync/configelement.h: * src/sysync/customimplagent.cpp: * src/sysync/customimplagent.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/dataobjtype.cpp: * src/sysync/dataobjtype.h: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/engineentry.cpp: * src/sysync/engineentry.h: * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: * src/sysync/global_progress.h: * src/sysync/iso8601.cpp: * src/sysync/iso8601.h: * src/sysync/itemfield.cpp: * src/sysync/itemfield.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/mimediritemtype.cpp: * src/sysync/mimediritemtype.h: * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.cpp: * src/sysync/multifielditemtype.h: * src/sysync/rawdataitemtype.cpp: * src/sysync/rawdataitemtype.h: * src/sysync/remotedatastore.cpp: * src/sysync/remotedatastore.h: * src/sysync/rrules.cpp: * src/sysync/rrules.h: * src/sysync/scriptcontext.cpp: * src/sysync/scriptcontext.h: * src/sysync/simpleitem.cpp: * src/sysync/simpleitem.h: * src/sysync/stdlogicagent.cpp: * src/sysync/stdlogicagent.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/stringutils.cpp: * src/sysync/stringutils.h: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclientbase.cpp: * src/sysync/syncclientbase.h: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncdatastore.cpp: * src/sysync/syncdatastore.h: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: * src/sysync/syncitemtype.cpp: * src/sysync/syncitemtype.h: * src/sysync/syncml_globs.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync/syncsessiondispatch.cpp: * src/sysync/syncsessiondispatch.h: * src/sysync/syserial.h: * src/sysync/sysync_crc16.cpp: * src/sysync/sysync_crc16.h: * src/sysync/sysync_debug.h: * src/sysync/sysync_globs.h: * src/sysync/textitemtype.cpp: * src/sysync/textitemtype.h: * src/sysync/textprofile.cpp: * src/sysync/textprofile.h: * src/sysync/timezones.cpp: * src/sysync/timezones.h: * src/sysync/tz_table.h: * src/sysync/uiapi.cpp: * src/sysync/uiapi.h: * src/sysync/vcalendaritemtype.cpp: * src/sysync/vcalendaritemtype.h: * src/sysync/vcarditemtype.cpp: * src/sysync/vcarditemtype.h: * src/sysync/vtimezone.cpp: * src/sysync/vtimezone.h: * src/sysync_SDK/DB_Interfaces/demo/DLL/target_options.h: * src/sysync_SDK/DB_Interfaces/demo/sync_dbapi_demo.c: * src/sysync_SDK/DB_Interfaces/snowwhite/DLL/target_options.h: * src/sysync_SDK/DB_Interfaces/snowwhite/myadapter.h: * src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.cpp: * src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.h: * src/sysync_SDK/DB_Interfaces/snowwhite/snowwhite.cpp: * src/sysync_SDK/DB_Interfaces/snowwhite/snowwhite.h: * src/sysync_SDK/DB_Interfaces/text_db/DLL/target_options.h: * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/SDK_support.h: * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/SDK_util.h: * src/sysync_SDK/Sources/UI_util.cpp: * src/sysync_SDK/Sources/UI_util.h: * src/sysync_SDK/Sources/admindata.cpp: * src/sysync_SDK/Sources/admindata.h: * src/sysync_SDK/Sources/blobs.cpp: * src/sysync_SDK/Sources/blobs.h: * src/sysync_SDK/Sources/dbitem.cpp: * src/sysync_SDK/Sources/dbitem.h: * src/sysync_SDK/Sources/engine_defs.h: * src/sysync_SDK/Sources/enginemodulebase.cpp: * src/sysync_SDK/Sources/enginemodulebase.h: * src/sysync_SDK/Sources/enginemodulebridge.cpp: * src/sysync_SDK/Sources/enginemodulebridge.h: * src/sysync_SDK/Sources/lineartime.cpp: * src/sysync_SDK/Sources/lineartime.h: * src/sysync_SDK/Sources/prefix_file.h: * src/sysync_SDK/Sources/san.cpp: * src/sysync_SDK/Sources/san.h: * src/sysync_SDK/Sources/stringutil.cpp: * src/sysync_SDK/Sources/stringutil.h: * src/sysync_SDK/Sources/syerror.h: * src/sysync_SDK/Sources/sync_dbapi.h: * src/sysync_SDK/Sources/sync_dbapidef.h: * src/sysync_SDK/Sources/sync_declarations.h: * src/sysync_SDK/Sources/sync_include.h: * src/sysync_SDK/Sources/sync_uiapi.h: * src/sysync_SDK/Sources/syncexception.cpp: * src/sysync_SDK/Sources/syncexception.h: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: * src/sysync_SDK/Sources/timeutil.cpp: * src/sysync_SDK/Sources/timeutil.h: Updated copyright notice, year and author email address (comment only, no code changes) 2011-01-20 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/localengineds.cpp: * src/sysync/mimedirprofile.cpp: changed debug logging channel for tempGUID mapping debug: now is DBG_ADMIN+DBG_EXOTIC 2011-01-20 Lukas Zeller Merge remote branch 'refs/remotes/meego/master' into luz_updates 2011-01-19 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: engine: ODBC: SQLEXECUTE() within sometimes did not execute on the new connection, but on the old one. 2010-12-15 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/global_options.h: ODBC: adjusted for 64bit, especially using SQLLEN which is not same as SQLINTEGER in 64bit 2011-01-13 Lukas Zeller * src/global_options.h: * src/sysync/customimplds.cpp: engine: fixed problem when client-replace wins conflict over server-delete. 2011-01-13 Lukas Zeller * src/sysync/mimedirprofile.cpp: engine: comment cosmetics 2010-12-18 Lukas Zeller * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/itemfield.cpp: * src/sysync/itemfield.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: whitespace cosmetics ONLY: detabbed some files once again 2010-12-18 Lukas Zeller * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: engine: server: optimized tempGUIDs - only generate them when needed. 2010-12-16 Lukas Zeller * src/sysync/localengineds.cpp: engine: server case: fixed bad bug that could mess up tempGUIDs. These must be cleared when first is received. 2010-12-15 Lukas Zeller * src/global_options.h: * src/sysync/itemfield.cpp: * src/sysync/itemfield.h: engine 3.4.0.22: to test the assigned status of an array field, access to array index -1 now returns status. 2010-12-15 Lukas Zeller * src/sysync/mimedirprofile.cpp: engine: in valuelists with suppressempty not set, an exhaused array must generate an empty property (and NOT no property at all) 2010-12-14 Lukas Zeller * src/sysync/mimedirprofile.cpp: engine: prevent generating invalid recurrence end specifications in vCalendar 1.0 RRULE (date-only not allowed, must be date+time) 2010-12-05 Lukas Zeller * src/global_options.h: * src/syncapps/sysytool/sysytool.cpp: engine: decoupled displayed release year from license-relevant "release" (now called "start of release period for product") 2010-12-02 Lukas Zeller * src/global_options.h: * src/sysync/binfileimplds.cpp: engine 3.4.0.20 - no longer forces slow sync on other profiles when one profile is zapped (with separate changelogs) 2010-10-25 Lukas Zeller * src/sysync/binfileimplclient.cpp: engine: added check for first time sync (no remote anchor saved) for zap warnings. 2010-10-22 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltdec.c: SyncMLTK: in xltdec error message, dump of hex was ok, but ASCII showed the wrong bytes 2010-09-21 Lukas Zeller * src/global_options.h: engine 3.4.0.19 - with Patrick's patch for TZNAME TZID encoding 2010-09-21 Lukas Zeller * src/sysync/syncagent.cpp: engine: added missing ifdef for compiling client-only library 2011-01-20 Beat Forster * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi.h: * src/DB_interfaces/api_db/dbapi_include.h: * src/DB_interfaces/api_db/sync_dbapiconnect.cpp: * src/DB_interfaces/api_db/sync_dbapiconnect.h: * src/sysync_SDK/DB_Interfaces/demo/sync_dbapi_demo.c: * src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.cpp: * src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.h: * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: * src/sysync_SDK/Sources/sync_dbapi.h: * src/sysync_SDK/Sources/sync_dbapidef.h: engine: LoadAdminAsKey/SaveAdminAsKey prepared in DB-API (actual usage in engine still missing) 2011-01-20 Lukas Zeller * AUTHORS: * COPYING: * LICENSE.EPL: Updated licensing files and author emails 2011-01-17 Patrick Ohly * src/syncml_tk/src/sml/xlt/all/xltenc.c: SyncML TK: adjust size of DevInf buffer dynamically 2011-01-10 Patrick Ohly Merge remote branch 'synthesis/luz' 2010-12-16 Lukas Zeller * src/sysync/localengineds.cpp: engine: server case: fixed bad bug that could mess up tempGUIDs. These must be cleared when first is received. 2010-12-19 Patrick Ohly * src/sysync/localengineds.cpp: temporary ID mapping: flag unexpected state as real errors 2010-12-15 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux time zones: use TZID= instead of TZID=/softwarestudio.org/Tzfile/ 2010-12-14 Lukas Zeller * src/sysync/mimedirprofile.cpp: engine: prevent generating invalid recurrence end specifications in vCalendar 1.0 RRULE (date-only not allowed, must be date+time) 2010-12-14 Patrick Ohly * src/sysync/mimedirprofile.cpp: Revert "vCalendar 1.0: avoid RRULE end date without time" 2010-12-14 Patrick Ohly * configure.in: * src/Makefile.am.in: autotools: fix compilation with old libtool 1.5.22 on CentOS 5.5 2010-12-13 Patrick Ohly * src/sysync/mimedirprofile.cpp: vCalendar 1.0: avoid RRULE end date without time 2010-12-12 Patrick Ohly * src/sysync/vtimezone.cpp: vtimezone: retain original TZID in imported definitions 2010-12-12 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: * src/sysync/timezones.h: * src/sysync/vtimezone.cpp: * src/sysync/vtimezone.h: vtimezones: explicitly store std and dst TZNAME 2010-12-10 Patrick Ohly * src/sysync/localengineds.cpp: maximum UID size: avoid redundant tempUID->localUID mappings 2010-12-08 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/localengineds.cpp: temporary IDs: avoid reusing existing ID 2010-12-06 Patrick Ohly * src/syncml_tk/src/sml/mgr/all/mgrinstancemgr.c: SyncML Toolkit: fixed memory leak in case of error 2010-12-06 Patrick Ohly * src/sysync/syncsession.cpp: sync session: handle empty Target URI 2010-11-28 David Bremner * src/Targets/ReleasedProducts/SDK/target_options.h: improve detection of MacOS X, to avoid confusion on other Mach systems 2010-08-24 Lukas Zeller * src/sysync/multifielditemtype.cpp: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: engine: added new compare mode for fields: "scripted" 2010-10-19 Patrick Ohly * src/sysync/itemfield.cpp: newItemField(): incorrect parameters 2010-09-30 Lukas Zeller Merge remote branch 'refs/remotes/meego/master' into luz 2010-09-29 Patrick Ohly * src/sysync/vtimezone.cpp: vtimezone: fixed handling of TZID with special characters 2010-09-16 Lukas Zeller * src/sysync/timezones.cpp: engine 3.4.0.17: fixed bad timezones bug causing imported TZ to be treated as "Z" zone 2010-09-16 Lukas Zeller * src/global_options.h: * src/sysync/timezones.cpp: engine 3.4.0.17: fixed bad timezones bug causing imported TZ to be treated as "Z" zone 2010-09-08 Lukas Zeller * src/global_options.h: engine 3.4.0.16 - internal and libsynthesis sources in sync 2010-09-08 Lukas Zeller * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/sync_dbapidef.h: SDK version is now 1.8.0 2010-09-08 Lukas Zeller * src/sysync/rawdataitemtype.cpp: * src/sysync/stdlogicds.cpp: some whitespace cosmetics 2010-09-08 Lukas Zeller * src/sysync/binfileimplds.cpp: binfileimplds: added some more debug output for observing pseudo-change suppression and CRC checking in general 2010-08-29 Lukas Zeller * src/global_options.h: engine 3.4.0.15 - version built as update for command line clients and all servers 2010-08-26 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltdecwbxml.c: * src/syncml_tk/src/sml/xlt/all/xltenc.c: * src/sysync/syncappbase.cpp: engine: Now allows WBXML 1.3 2010-08-25 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: engine: now checks for CA_DeleteSyncSet module capability to optimize performance in some "reload device" cases. 2010-08-24 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: engine: we need getItemFromSyncSetItem() in all cases 2010-08-24 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: engine: added option for datastores with records that get touched (modified date updated) too often. 2010-08-24 Lukas Zeller * src/sysync/multifielditemtype.cpp: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: engine: added new compare mode for fields: "scripted" 2010-08-24 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: engine: prepared (but not yet enabled) optimization for pluginApiDS such that syncset is not loaded in a slow refresh from remote case. 2010-08-24 Lukas Zeller * src/sysync/customimplds.cpp: engine: fixed boolean bug from 041c7f808f (engine 3.4.0.14: implemented filtered sync set deletion) 2010-08-24 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/global_options.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: engine 3.4.0.14: implemented filtered sync set deletion 2010-07-29 Lukas Zeller * src/sysync/itemfield.cpp: engine: cosmetic - removed obsolete commented out code 2010-07-25 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: engine: refined folding for pre-MIME-DIR and MIME-DIR - new "foldbetween" attribute. 2010-07-17 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: engine: improved folding for pre-MIME-DIR formats. 2010-07-12 Lukas Zeller * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: engine: client side filtering: when re-alerting, filters must be reset before re-creating the alert. 2010-07-12 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/global_options.h: * src/sysync/binfileimplds.cpp: engine 3.4.0.11: fixed problems with change detection when items can disappear and re-appear with same ID in syncset, and with some filtering scenarios. 2010-06-28 Lukas Zeller * src/sysync/rrules.cpp: engine: rrules: cosmetic comment only: clarification of enddate TZ for iCalendar 2.0 2010-06-25 Lukas Zeller * src/sysync/binfileimplds.cpp: engine: multi-profile: when a new profile was added AFTER migration to separate profiles, the changelog was created with the unified name instead of per-profile. 2010-06-25 Lukas Zeller * src/sysync/binfilebase.cpp: * src/sysync/binfilebase.h: binfile: added aOverwrite option for createAsCopyFrom() to allow/prevent overwriting possibly existing target. 2010-06-24 Lukas Zeller * src/sysync/binfileimplclient.cpp: engine: search datastores by dbtypeID, not name. 2010-06-24 Lukas Zeller * src/sysync/syncagent.cpp: engine: added "isserver" sessionKey value for plugins to check if they run as a server or client 2010-06-24 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: engine: errors from StartDataRead now propagate correctly, binfilelog and events get correct local status code now. 2010-06-23 Lukas Zeller * src/sysync/configelement.cpp: engine: fixed config parsing bug that could cause some elements to get ignored when preceeded by a ifdeffed-out element. 2010-06-22 Lukas Zeller * src/sysync/itemfield.cpp: * src/sysync/itemfield.h: engine: itemFields: arrayfield now always have one field (firstField) instantiated to be able to perform type check using elementsBasedOn() 2010-06-22 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/customimplds.cpp: engine: when post-processing items read via plugins from AsKey, now correctly apply if it is set. 2010-06-22 Lukas Zeller * src/global_options.h: * src/sysync/binfilebase.cpp: * src/sysync/binfilebase.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.cpp: engine 3.4.0.10: separate changelogs, pendingmaps and pendingitem for each profile to allow for different syncsets in profiles (as needed by SyncML PRO iOS) 2010-06-21 Lukas Zeller * src/sysync/binfileimplclient.cpp: engine: added read-only "profileID" value in target key, for backreferencing the profile from the target. 2010-06-17 Lukas Zeller * src/global_options.h: engine 3.4.0.9 - mobile OS X platforms (iPhone, iPad, iPod touch) now are called "iOS". Engine also contains work-in-progress EventKit plugin. 2010-06-17 Lukas Zeller * src/global_options.h: engine: iOS: that's how the platform (MOBOSX) is now called 2010-05-23 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync/syncappbase.cpp: engine license checking: added "enabledStatus" key to /licensing to check enabled status including free evaluation period 2010-05-21 Lukas Zeller * src/sysync/dataobjtype.cpp: dataobjtype: fixed bug that caused dataobjs without a profile (e.g. "file") to crash on creation. 2010-05-19 Lukas Zeller * src/sysync/rawdataitemtype.cpp: rawdataitemtype: eliminated warning (unused var) 2010-05-16 Lukas Zeller * src/sysync/rawdataitemtype.cpp: iPhoneOS and MacOS X builds: included rawdataitemtype (simpletype) 2010-05-16 Lukas Zeller * src/sysync/syncagent.cpp: engine: server-only library did not compile w/o PROGRESS_EVENTS defined 2010-05-14 Lukas Zeller * src/sysync/syncagent.h: client-only-engine: made compile again, progress event vars must be common for server and client! 2010-09-03 Patrick Ohly * src/sysync/mimedirprofile.cpp: MIME Profile: setting one rule also activates all included rules 2010-09-03 Patrick Ohly * src/sysync/mimedirprofile.cpp: MIME Profile: check when parsing 2010-09-03 Patrick Ohly * src/sysync/mimedirprofile.cpp: MIME Profile: check when generating 2010-09-03 Patrick Ohly * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: MIME Profile: added 2010-09-07 Patrick Ohly * src/sysync/binfileimplds.cpp: TBinfileImplDS: fixed some valgrind reports 2010-06-17 Patrick Ohly * src/gen-makefile-am.sh: gen-makefile-am.sh: make file order deterministic 2010-06-09 Patrick Ohly * src/Makefile.am.in: Linux .so: API extension => version bump 2010-05-27 Zhu, Yongsheng * src/sysync/binfileimplds.cpp: * src/sysync/stringutils.cpp: * src/sysync/syncagent.cpp: valgrind issues: fix memory issues reported by valgrind 2010-05-27 Patrick Ohly * src/sysync/vtimezone.cpp: VTIMEZONEtoTZEntry/GetTZInfo: fixed unitialized read of bias 2010-05-26 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux time zones: avoid crash when reading time zone definitions fails 2010-05-23 Patrick Ohly * src/sysync/rawdataitemtype.cpp: avoid warnings, they are treated as errors in SyncEvolution builds 2010-05-17 Patrick Ohly * src/sysync/timezones.cpp: * src/sysync/timezones.h: GZones: only call finalizeSystemZoneDefinitions() once 2010-05-14 Lukas Zeller * src/global_options.h: * src/sysync/rawdataitemtype.cpp: * src/sysync/rawdataitemtype.h: * src/sysync/syncappbase.cpp: * src/sysync/syncitemtype.cpp: Engine 3.4.0.8: Added rawdataitemtype (passes SyncML data 1:1 to DBAPI) 2010-05-14 Lukas Zeller * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: * src/sysync/sysync_debug.h: Source-Linked Logs: fixed to work with older monolithic Synthesis targets as well 2010-05-13 Lukas Zeller * src/sysync/debuglogger.cpp: Source-Linked Logs: added ifdef to compile without SYDEBUG_LOCATION again 2010-05-13 Lukas Zeller Merge remote branch 'moblin/doxygen' into luz 2010-05-13 Lukas Zeller * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: Source-Linked Logs: added more options, now can also create txmt://-links that open BBEdit or TextMate 2010-05-11 Patrick Ohly * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/Doxyfile: * src/Makefile.am.in: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/engineinterface.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncclientbase.cpp: * src/sysync/sysync_debug.h: Source-Linked Logs: record and link call location of debug messages in (HTML) log files 2010-05-10 Patrick Ohly * src/Doxyfile: Source-Linked Logs: Doxyfile: generic one without modifications 2010-05-12 Lukas Zeller * src/platform_adapters/linux/platform_timezones.cpp: * src/sysync/timezones.cpp: * src/sysync/timezones.h: TZ init: some cleanup and updates for non-Linux platforms 2010-05-04 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/timezones.cpp: * src/sysync/timezones.h: TZ init: split initialisation of system time zone list into two parts (basic usability of TZ system must be ready before config reading, extra TZ retrieved from system can be added later) 2010-05-10 Patrick Ohly * src/sysync/rrules.cpp: fixed compiler warning on 64 bit: printf %llX size mismatch 2010-05-04 Patrick Ohly * src/sysync/timezones.cpp: * src/sysync/timezones.h: * src/sysync/vtimezone.cpp: time zone matching: added debug and error logging 2010-05-04 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux platform time zones: added debug output 2010-05-11 Patrick Ohly * configure.in: * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/Doxyfile: * src/Makefile.am.in: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/engineinterface.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncclientbase.cpp: * src/sysync/sysync_debug.h: log call location of debug messages 2010-05-10 Patrick Ohly * src/Doxyfile: Doxyfile: generic one without modifications 2010-05-12 Patrick Ohly * src/sysync/vtimezone.cpp: VTIMEZONEtoTZEntry(): flagged failure incorrectly for VTIMEZONE without summer saving 2010-05-11 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: * src/sysync/syncappbase.cpp: * src/sysync/timezones.cpp: * src/sysync/timezones.h: time zone init and logging: split into part before and after config parsing 2010-05-10 Patrick Ohly * src/sysync/rrules.cpp: fixed compiler warning on 64 bit: printf %llX size mismatch 2010-05-04 Patrick Ohly * src/sysync/timezones.cpp: * src/sysync/timezones.h: * src/sysync/vtimezone.cpp: time zone matching: added debug and error logging 2010-05-04 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux platform time zones: added debug output 2010-05-04 Patrick Ohly * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: TSyncAppBase: moved system time zone parsing after config reading 2010-05-07 Lukas Zeller * src/sysync/rrules.cpp: rrules: cosmetics for debug and formatting 2010-05-07 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/scriptcontext.cpp: VTIMEZONE conversion: added logging so we can see what's happening (RRULE parsing) 2010-05-07 Lukas Zeller * src/sysync/sysync_debug.h: engine debug: enhanced LOGDEBUG... macros (made safe against logger==NULL), added LOGDEBUGTEST 2010-05-07 Lukas Zeller * src/sysync/syncappbase.h: engine: fixed problems with new progress events (many errors in targets w/o progress events) 2010-05-07 Lukas Zeller * src/sysync/rrules.cpp: * src/sysync/rrules.h: * src/sysync/vtimezone.cpp: engine: enhanced RRULE parsing such that it can accept YEARLY rules with BYMONTH and BYDAY with a start date that is not an occurrence (happens in some 3rd party VTIMEZONE) 2010-05-04 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: engine: configvars can now be unset (undefined) by writing VALTYPE_NULL to them 2010-04-30 Lukas Zeller * src/sysync/binfileimplds.cpp: Cosmetic whitespace changes 2010-03-16 Beat Forster * src/platform_adapters/linux/configfiles.cpp: * src/platform_adapters/linux/platform_timezones.cpp: * src/sysync/timezones.cpp: * src/sysync/tz_table.h: - Android gets system timezone correctly now - Get Olson timezone names for Android - HST/HPT added at tz_table.h (Honolulu) 2010-03-16 Beat Forster * src/sysync_SDK/Sources/engine_defs.h: new mode PROFILEFLAG_MSGNEXTSYNC added 2010-03-16 Beat Forster * src/DB_interfaces/api_db/DLL_interface.cpp: * src/DB_interfaces/api_db/DLL_interface.h: Android reporting more specific for ConsolePrintf 2010-03-19 Beat Forster * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi.h: * src/sysync_SDK/Sources/sync_dbapidef.h: DBAPI SDK: AsKey interface for Load/SaveAdminData (ADMIN_AS_KEY) 2010-03-22 Beat Forster * src/sysync/syncappbase.cpp: Android: Display config errors 2010-04-30 Lukas Zeller Merge remote branch 'refs/remotes/moblin/mb7838' into luz 2010-04-30 Lukas Zeller * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/global_options.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclientbase.cpp: * src/sysync/syncclientbase.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: engine 3.4.0.7: Progress events now session local and available for server sessions 2010-04-20 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: engine: added support for free demo period after first use without needing license 2010-03-19 Lukas Zeller * src/sysync/synccommand.cpp: Cosmetic comment fix 2010-04-13 Chen Congwu * src/DB_interfaces/odbc_db/odbcapiagent.cpp: ODBCApiAgent builtin function table 2010-04-08 Patrick Ohly * src/sysync/configelement.cpp: TConfigElement::endElement(): fixed invalid memory read 2010-03-24 Chen Congwu * src/syncml_tk/src/sml/xlt/all/xltdevinf.c: smltk+DevInf decoding: avoid a possible infinite loop 2010-03-24 Chen Congwu * src/syncml_tk/src/sml/xlt/all/xltdevinf.c: smltk: DevInf decoding 2010-03-22 Patrick Ohly * .gitignore: .gitignore: add SDK_EXCLUDE_FILES 2010-03-19 Chen Congwu * src/gen-makefile-am.sh: Build: pull blob.h/blob.cpp in libsynthesissdk dynamic build 2010-03-18 Lukas Zeller * src/sysync/syserial.h: syserial.h: New SYSER_PRODFLAG_CLIENT_APP flag 2010-03-18 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/dataobjtype.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncitemtype.cpp: * src/sysync/syncsession.cpp: * src/sysync_SDK/Sources/san.cpp: * src/sysync_SDK/Sources/sysync_b64.cpp: * src/sysync_SDK/Sources/sysync_b64.h: * src/sysync_SDK/Sources/sysync_utils.cpp: sysync_b64: added b64::free() that can be called to dispose blocks allocated by b64::decode/encode 2010-03-16 Lukas Zeller * src/sysync/mimedirprofile.cpp: MIME-DIR "group" feature: fixed extra increment of array index in some cases 2010-03-15 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: engine: compilable again without engineinterface and AsKey 2010-03-09 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/syncsession.cpp: pluginapids: ReadNextItem can now return error without causing exceptions. 2010-03-18 Lukas Zeller Merge remote branch 'moblin/master' into luz 2010-03-18 Lukas Zeller * src/global_options.h: engine 3.4.0.5: new version for SAN 1.1 related changes in file location etc. 2010-03-18 Lukas Zeller * src/sysync/sysync_globs.h: SAN 1.1: fix needed to compile Synthesis internal projects again with changes related to SAN 1.1 2010-03-18 Lukas Zeller Merge remote branch 'moblin/san11' into luz 2010-03-18 Lukas Zeller * src/sysync/cp936_tables_inc.cpp: * src/sysync/gb2312_tables_inc.cpp: * src/sysync_SDK/Sources/cp936_tables_inc.cpp: * src/sysync_SDK/Sources/gb2312_tables_inc.cpp: SAN 1.1 preparation: when moving sysync_utils, these (included) files need to be moved as well to support the Chinese character set (CHINESE_SUPPORT #defineD) 2010-03-17 Lukas Zeller * src/sysync/localengineds.cpp: engine: fix for very late suspend 2010-03-17 Lukas Zeller * src/sysync/customimplds.cpp: engine: getItemByID: made sure newly inserted items can be retrieved 2010-03-16 Lukas Zeller Merge remote branch 'refs/remotes/moblin/subdatastores-devinf' into luz 2010-03-15 Patrick Ohly * src/sysync/synccommand.cpp: resume + pending item fix in SyncML server 2010-03-11 Chen Congwu * src/sysync/syncsession.cpp: Valgrind warning fixed: initialize the conditonal variables 2010-03-08 Chen Congwu * src/gen-makefile-am.sh: * src/synthesis-linker.map: * src/sysync/sysync.h: * src/sysync_SDK/Sources/lineartime.cpp: * src/sysync_SDK/Sources/stringutil.cpp: * src/sysync_SDK/Sources/stringutil.h: * src/sysync_SDK/Sources/syncexception.cpp: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: Build script and code changes for the new moved utility code. 2010-03-08 Chen Congwu * src/sysync/lineartime.cpp: * src/sysync/lineartime.h: * src/sysync/syncexception.cpp: * src/sysync/syncexception.h: * src/sysync/sysync_utils.cpp: * src/sysync/sysync_utils.h: * src/sysync_SDK/Sources/lineartime.cpp: * src/sysync_SDK/Sources/lineartime.h: * src/sysync_SDK/Sources/syncexception.cpp: * src/sysync_SDK/Sources/syncexception.h: * src/sysync_SDK/Sources/sysync_utils.cpp: * src/sysync_SDK/Sources/sysync_utils.h: SAN 1.1 generation support: Moved utility code from engine to sdk 2010-03-09 Chen Congwu * src/sysync_SDK/Sources/san.cpp: SAN parsing version check fix: should be && instead of || 2010-03-08 Chen Congwu * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/san.cpp: San1.1 : compiler warning fixed 2010-03-05 Patrick Ohly * src/sysync_SDK/Sources/blobs.h: TBlob: export Init() properties read-only 2010-03-02 Chen Congwu * src/sysync_SDK/Sources/san.cpp: * src/sysync_SDK/Sources/san.h: SAN 1.0/1.1 generation: check for invalid SAN package 2010-02-26 Chen Congwu * src/synthesis-linker.map: * src/sysync_SDK/Sources/san.cpp: * src/sysync_SDK/Sources/san.h: SAN 1.0/1.1 generation support 2010-02-23 Chen Congwu * configure.in: * src/Makefile.am.in: * src/Targets/ReleasedProducts/SDK/define.h: * src/Targets/ReleasedProducts/SDK/target_options.h: * src/synthesis-linker.map: * src/sysync_SDK/Sources/stringutil.cpp: Accept SAN 1.0 pacakge (only wbxml is supported) 2010-03-01 Chen Congwu * src/sysync/syncagent.cpp: Server: made silently swallow garbage after end of incoming SyncML message 2010-03-04 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/stdlogicds.cpp: server engine: added missing check for re-sent during resume. 2010-03-04 Lukas Zeller * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/sysync/syncagent.cpp: server engine: added option to implement client resent message handling. 2010-03-04 Lukas Zeller * src/sysync/superdatastore.cpp: Fixed server case of superdatastore which was broken by 6626a57e9e (Engine 3.4.0.5: implemented client-side superdatastores...) 2010-02-25 Patrick Ohly * src/sysync/debuglogger.cpp: debuglogger: avoid segfault when log file cannot be reopened 2010-02-23 Patrick Ohly * src/Makefile.am.in: .so version bumped to 0.3.1 (minor revision increased) 2010-02-22 Patrick Ohly * src/sysync/localengineds.cpp: DevInf + superdatastore: avoid redundant 2010-02-18 Lukas Zeller Merge remote branch 'moblin/master' into luz 2010-02-18 Lukas Zeller * src/global_options.h: * src/sysync/binfileimplclient.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicds.h: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncagent.cpp: Engine 3.4.0.5: implemented client-side superdatastores according to suggestion/draft implementation of Patrick 2010-02-18 Lukas Zeller * src/sysync/syncsession.cpp: engine: now shows engine-determined OS/version as well as configured hwv/fwv in log 2010-02-16 Lukas Zeller * src/sysync/syncappbase.cpp: engine: added more configurable devInf data via config variables 2010-02-13 Lukas Zeller * src/sysync/syncagent.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncsession.cpp: engine: added configurable device ID (via "customdeviceid" config variable) 2010-02-11 Chen Congwu * src/syncml_tk/src/sml/lib/all/libstr.c: * src/syncml_tk/src/sml/lib/inc/libstr.h: * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: * src/syncml_tk/src/sml/xlt/all/xlttags.c: xmltk fixes for Nokia ovi service 2010-02-09 Patrick Ohly * src/sysync_SDK/Sources/enginemodulebase.cpp: TEngineModuleBase::Connect() - fixed compiler warning 2010-02-09 Patrick Ohly * src/sysync/synccommand.cpp: do not treat 418 = "item exists" as an error 2010-02-04 Patrick Ohly * src/sysync/syncagent.cpp: * src/sysync_SDK/Sources/syerror.h: LOCERR_DATASTORE_ABORT: abort store, not session 2010-02-05 Lukas Zeller * src/global_options.h: * src/sysync/localengineds.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: * src/sysync/scriptcontext.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: Engine 3.4.0.4: enhanced remote rules with subrules and multiple active rules per session 2010-02-05 Lukas Zeller Merge remote branch 'moblin/master' into luz 2010-02-03 Lukas Zeller * src/Targets/clientEngine_dbg/target_options.h: target_options for basic DBG engine: cosmetic cleanup, not relevant for normal libsynthesis builds 2010-02-03 Beat Forster * src/platform_adapters/linux/configfiles.cpp: Android: configfiles: avoid double slash in path name 2010-02-03 Beat Forster * src/sysync_SDK/Sources/SDK_util.c: SDK_util.c : cosmetic - renamed define 2010-02-03 Beat Forster * src/sysync_SDK/Sources/sync_dbapidef.h: sync_dbapidef.h: - Comment 1.7.0 adapted correctly - DBG_GET_SET_VALUE added 2010-02-01 Patrick Ohly * src/sysync_SDK/configs/README: * src/sysync_SDK/configs/datatypes/00vcard-fieldlist.xml: * src/sysync_SDK/configs/datatypes/01vcard-profile.xml: * src/sysync_SDK/configs/datatypes/02vcard-types.xml: * src/sysync_SDK/configs/datatypes/10calendar-fieldlist.xml: * src/sysync_SDK/configs/datatypes/11calendar-profile.xml: * src/sysync_SDK/configs/datatypes/12calendar-types.xml: * src/sysync_SDK/configs/datatypes/20note-fieldlist.xml: * src/sysync_SDK/configs/datatypes/21note-profile.xml: * src/sysync_SDK/configs/datatypes/22notes-types.xml: * src/sysync_SDK/configs/datatypes/30bookmark-fieldlist.xml: * src/sysync_SDK/configs/datatypes/31bookmark-profile.xml: * src/sysync_SDK/configs/datatypes/32bookmark-type.xml: * src/sysync_SDK/configs/datatypes/server/40email-fieldlist.xml: * src/sysync_SDK/configs/datatypes/server/41email-profile.xml: * src/sysync_SDK/configs/datatypes/server/42email-type-zipped.xml: * src/sysync_SDK/configs/datatypes/server/42email-type.xml: * src/sysync_SDK/configs/datatypes/server/43email-sonyericsson.xml: * src/sysync_SDK/configs/datatypes/server/44email-nokia9500.xml: * src/sysync_SDK/configs/debug/00default.xml: * src/sysync_SDK/configs/remoterules/server/00_t39m.xml: * src/sysync_SDK/configs/remoterules/server/01_t68.xml: * src/sysync_SDK/configs/remoterules/server/02_V3.xml: * src/sysync_SDK/configs/remoterules/server/03_V3i.xml: * src/sysync_SDK/configs/remoterules/server/04_6230.xml: * src/sysync_SDK/configs/remoterules/server/05_9210.xml: * src/sysync_SDK/configs/remoterules/server/06_9210i.xml: * src/sysync_SDK/configs/remoterules/server/07_3220.xml: * src/sysync_SDK/configs/remoterules/server/08_3230.xml: * src/sysync_SDK/configs/remoterules/server/09_3600.xml: * src/sysync_SDK/configs/remoterules/server/10_3620.xml: * src/sysync_SDK/configs/remoterules/server/11_3650.xml: * src/sysync_SDK/configs/remoterules/server/12_3660.xml: * src/sysync_SDK/configs/remoterules/server/13_6260.xml: * src/sysync_SDK/configs/remoterules/server/14_6600.xml: * src/sysync_SDK/configs/remoterules/server/15_6620.xml: * src/sysync_SDK/configs/remoterules/server/16_6630.xml: * src/sysync_SDK/configs/remoterules/server/17_6670.xml: * src/sysync_SDK/configs/remoterules/server/18_7250.xml: * src/sysync_SDK/configs/remoterules/server/19_7250i.xml: * src/sysync_SDK/configs/remoterules/server/20_7260.xml: * src/sysync_SDK/configs/remoterules/server/21_7610.xml: * src/sysync_SDK/configs/remoterules/server/22_7650.xml: * src/sysync_SDK/configs/remoterules/server/23_N-Gage.xml: * src/sysync_SDK/configs/remoterules/server/24_N-Gage_QD.xml: * src/sysync_SDK/configs/remoterules/server/25_9300.xml: * src/sysync_SDK/configs/remoterules/server/26_9500.xml: * src/sysync_SDK/configs/remoterules/server/27_E90.xml: * src/sysync_SDK/configs/remoterules/server/28_X.xml: * src/sysync_SDK/configs/remoterules/server/29_SX1.xml: * src/sysync_SDK/configs/remoterules/server/30_M55.xml: * src/sysync_SDK/configs/remoterules/server/31_SL55.xml: * src/sysync_SDK/configs/remoterules/server/32_S55.xml: * src/sysync_SDK/configs/remoterules/server/33_S65.xml: * src/sysync_SDK/configs/remoterules/server/34_SL65.xml: * src/sysync_SDK/configs/remoterules/server/35_K700.xml: * src/sysync_SDK/configs/remoterules/server/36_T610_T630.xml: * src/sysync_SDK/configs/remoterules/server/37_M600i.xml: * src/sysync_SDK/configs/remoterules/server/38_P800.xml: * src/sysync_SDK/configs/remoterules/server/39_P900.xml: * src/sysync_SDK/configs/remoterules/server/40_P910.xml: * src/sysync_SDK/configs/remoterules/server/41_P910i.xml: * src/sysync_SDK/configs/remoterules/server/42_P990i.xml: * src/sysync_SDK/configs/remoterules/server/43_t68i.xml: * src/sysync_SDK/configs/remoterules/server/44_Funambol_Outlook.xml: * src/sysync_SDK/configs/remoterules/server/45_SyncJe_Outlook.xml: * src/sysync_SDK/configs/scripting/10newuid.xml: * src/sysync_SDK/configs/scripting/11calendar.xml: * src/sysync_SDK/configs/scripting/client/00timeout.xml: * src/sysync_SDK/configs/scripting/server/12email.xml: * src/sysync_SDK/configs/syncclient_sample_config.xml: * src/sysync_SDK/configs/syncserv_sample_config.xml: * src/sysync_SDK/configs/update-samples.pl: XML config samples: split up into individual fragments 2010-02-02 Lukas Zeller * src/sysync/stdlogicds.cpp: Added check such that if calls ABORTDATASTORE(), the abort gets propagated 2010-02-01 Patrick Ohly * src/sysync_SDK/configs/syncserv_sample_config.xml: syncserv_sample_config.xml: removed white space 2010-01-28 BeatForster * src/sysync/tz_table.h: tz_table.h: Argentina changed to America/Buenos_Aires 2010-01-25 BeatForster * src/sysync/tz_table.h: ART/ARST timezone definitions for Buenos Aires, Argentina added 2009-12-23 BeatForster * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi.h: * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/SDK_support.h: * src/sysync_SDK/Sources/sync_dbapidef.h: SDK: - create list of built-in plugins (plugin_info/logger) - plugins can be accessed via #1..#X - break recursion at the logger - dbapi: added - Definition for CA_Plugin 2009-12-23 BeatForster * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/sync_dbapidef.h: SDK: - Version changed to V1.7.0 - at least callbackVersion=2 must be supported 2009-12-20 BeatForster * src/client_engine_linux.mk: Linux makefiles, several tabs/spaces replaced, did not work any more like this 2009-12-17 Beat Forster * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi_include.h: * src/DB_interfaces/api_db/sync_dbapiconnect.cpp: * src/sysync_SDK/Sources/sync_dbapidef.h: DBAPi: Old variant of Module_PluginParams no longer supported 2009-12-03 Beat Forster * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/dbapi.h: * src/DB_interfaces/api_db/dbapi_include.h: * src/DB_interfaces/api_db/sync_dbapiconnect.cpp: * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/sync_dbapidef.h: JNI/Java: Several bug fixes and enhancements - Preparing com/sysync package for V1.6.2 - Old BLOB signature supported until V1.6.1 - ModSubName() method added to TDB_Api_Config - both syntax versions for package path supported - multiple connection problems fixed - correct error for non-existing packages - sysytest output layout adapted for packages 2009-12-02 Beat Forster * src/sysync/engineinterface.cpp: * src/sysync_SDK/Sources/enginemodulebase.cpp: SDK: enginemodulebase applies older callbackVersion correctly now 2010-01-27 Lukas Zeller * doc/SySync_script_call_flow.numbers/Contents/PkgInfo: * doc/SySync_script_call_flow.numbers/QuickLook/Thumbnail.jpg: * doc/SySync_script_call_flow.numbers/SySync diagram_plugin_small.jpg: * doc/SySync_script_call_flow.numbers/document-thumbnail.tiff: * doc/SySync_script_call_flow.numbers/index.xml.gz: * doc/SySync_script_call_flow.pdf: Doc: useful table showing the call flow of scripts within a server session 2010-01-27 Lukas Zeller * src/global_options.h: New Engine Version 3.4.0.3 started to show fact that moblin patches are now included 2010-01-27 Lukas Zeller Merge remote branch 'moblin/master' into luz_tmp 2010-01-27 Lukas Zeller * src/global_options.h: * src/sysync/localengineds.cpp: Engine 3.4.0.2: fixed long standing bug parsing CGI filters with paranthesized subexpressions 2010-01-27 Lukas Zeller * src/sysync/syncappbase.cpp: * src/sysync/syserial.h: NEVER_EXPIRES_IS_OK define is now required in target_options.h to build targets without any licensing or expiry date 2010-01-27 Lukas Zeller * src/sysync/syncagent.cpp: * src/sysync/syncsession.cpp: bugfix for unilib regression: there must be no requestmaxtime limit for clients! 2010-01-27 Lukas Zeller * src/sysync/rrules.cpp: rrules: recurrence expansion bug with weekly recurrences fixed 2010-01-27 Lukas Zeller * src/sysync/debuglogger.cpp: debuglogger: avoid the need to create an empty va_list (which is not cleanly possible) 2010-01-18 Ove Kaaven * src/gen-makefile-am.sh: autotools: unnecessarily depends on too new findutils (MB #9112) 2010-01-04 Patrick Ohly * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/sysync/dataconversion.cpp: * src/sysync/syncagent.cpp: Android: fixed/added exception handling macros 2010-01-04 Patrick Ohly * src/sysync/sysync.h: Android: use android/log.h 2010-01-04 Patrick Ohly * src/sysync/multifielditem.cpp: TMultiFieldItem::standardMergeWith(): Android compiler warning 2010-01-04 Patrick Ohly * src/syncapps/serverEngine_custom/serverengine_custom_Base.cpp: gcc warning: missing line break at end of file 2010-01-04 Patrick Ohly * configure.in: * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: autotools: added more configure options 2010-01-04 Patrick Ohly * src/platform_adapters/linux/platform_DLL.cpp: Linux: improved support for static linking via //static/ 2010-01-04 Patrick Ohly * src/sysync_SDK/Sources/SDK_util.c: SDK_util.c: fixed crash in vasprintf() 2009-12-16 Patrick Ohly * src/sysync/localengineds.cpp: ABORTDATASTORE(): allow calling it inside 2009-12-16 Patrick Ohly * src/sysync_SDK/Sources/syerror.h: syerror.h: added new codes and explanations 2009-12-10 Patrick Ohly * configure.in: * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: autotools: regular expression support in scripts is configurable (MB #7931) 2009-12-10 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: VE_InsertMapItem: signed/unsigned comparison warning from g++ 4.4 2009-12-10 Patrick Ohly * src/sysync/debuglogger.cpp: TDebugLoggerBase::DebugOpenBlock(): unused va_list 2009-12-10 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: fixed several %ld <-> size_t mismatches 2009-12-10 Patrick Ohly * src/sysync/binfileimplds.cpp: TBinfileImplDS::changeLogPreflight(): dataCRC used uninitialized? 2009-12-09 Patrick Ohly * src/platform_adapters/configfiles.h: * src/sysync/itemfield.cpp: * src/sysync/syncclientbase.cpp: fixed more %lld sInt64 mismatches 2009-11-30 Patrick Ohly * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: * src/sysync/syncsession.cpp: log file base name: configurable via "filename" config option 2009-11-26 Zhu, Yongsheng * src/syncml_tk/src/sml/xlt/all/xltenc.c: devinfo: increase memory size for encoding devinfo in WBXML 2009-11-11 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: autotools + old libical: crash when compiled without --enable-evolution-compatibility 2009-11-10 Patrick Ohly * src/sysync/syncsession.cpp: Revert "TSyncSession::checkCredentials(): none => accept invalid credentials" 2009-11-04 Patrick Ohly * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: TEngineInterface::debugPuts(): not active in server 2009-11-03 Patrick Ohly * src/sysync/syncsession.cpp: TSyncSession::checkCredentials(): none => accept invalid credentials 2009-10-29 Patrick Ohly * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: DebugPuts(): added to the unilib engine 2009-10-29 Patrick Ohly * src/sysync/syncappbase.cpp: TSyncAppBase::encodingFromData(): detect Oracle Beehive XML messages 2009-10-23 Patrick Ohly * src/Transport_interfaces/engine/enginesessiondispatch.cpp: TServerEngineInterface::SessionStep(): removed obsolete label 2009-10-23 Patrick Ohly * src/Transport_interfaces/engine/enginesessiondispatch.cpp: TServerEngineInterface::OpenSessionInternal(): printf format for uInt64 2009-10-23 Patrick Ohly * src/Transport_interfaces/engine/enginesessiondispatch.cpp: TEngineSessionDispatch::generateRespURI(): result of string::find downcasted to sInt16 2009-10-23 Patrick Ohly * src/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h: Linux platform: need _GNU_SOURCE for vasprintf 2009-10-23 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: another unhandled enum 2009-10-23 Patrick Ohly * src/DB_interfaces/api_db/pluginapids.cpp: another #warning 2009-10-23 Patrick Ohly * src/sysync/localengineds.cpp: TLocalEngineDS::newDevInfDatastore(): fixed 64 biit issue 2009-10-23 Patrick Ohly * src/sysync/superdatastore.cpp: superdatastore: add unhandled sop enum values 2009-10-23 Patrick Ohly * src/sysync/syncsession.cpp: TSyncSession::initSync(): avoid #warning in gcc 2009-10-23 Patrick Ohly * src/sysync/stdlogicds.cpp: TStdLogicDS::logicGenerateSyncCommandsAsServer: invalid logical expression?! 2009-10-23 Patrick Ohly * src/sysync/stdlogicds.cpp: TStdLogicDS::startDataAccessForServer(): fioxed signed/unsigned comparison 2009-10-23 Patrick Ohly * src/sysync/customimplds.cpp: TCustomImplDS::modifyMap(): added redundant parenthesis for gcc -Wall 2009-10-21 Patrick Ohly * .gitignore: * src/gen-makefile-am.sh: gen-makefile-am.sh + autotools: avoid GNU find --printf and shell wildcards 2009-11-30 Lukas Zeller * src/global_options.h: engine version set to 3.4.0.0 for server releases - because we said even=release, odd=beta 2009-11-30 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/superdatastore.cpp: engine: fixed bug that could crash server sessions when using a superdatastore. 2009-11-30 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/DB_interfaces/odbc_db/odbcapids.h: * src/sysync/configelement.cpp: * src/sysync/customimplagent.cpp: * src/sysync/customimplds.cpp: * src/sysync/localengineds.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/multifielditem.cpp: * src/sysync/rrules.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/superdatastore.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncappbase.cpp: * src/sysync/synccommand.cpp: * src/sysync/syncsession.cpp: * src/sysync/sysync_utils.cpp: * src/sysync/sysync_utils.h: * src/sysync/textprofile.cpp: * src/sysync/timezones.cpp: * src/sysync_SDK/Sources/dbitem.cpp: english language cosmetics: there were still a lot of "eventual" uses that should have been "possible" 2009-11-18 Beat Forster * src/DB_interfaces/api_db/dbapi.cpp: JNI: Switch off Java connection groups consistently 2009-12-02 Lukas Zeller * src/sysync_SDK/configs/syncclient_sample_config.xml: client config: some cleanup, added samples (commented out) for filtering 2009-12-02 Lukas Zeller * src/sysync_SDK/configs/syncserv_sample_config.xml: server config: updated for 3.4.0.0 engine, fixed some bugs 2009-12-02 Lukas Zeller * doc/SySync_config_reference.doc: * doc/SySync_config_reference.pdf: doc: updated config reference for 3.4.0.0 engine 2009-11-24 Lukas Zeller * src/global_options.h: * src/sysync/engineinterface.cpp: engine 3.3.0.4: fixed some more 64bit gotchas 2009-11-24 Lukas Zeller * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: engine: added option to silently discard non-acceptable items 2009-11-18 Lukas Zeller * src/platform_adapters/configfiles.h: * src/sysync/binfileimplds.cpp: * src/sysync/iso8601.cpp: * src/sysync/itemfield.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/syncclientbase.cpp: * src/sysync/syncsession.cpp: * src/sysync_SDK/Sources/generic_types.h: Touch up to make compile again in client-only builds (and also WinMobile) 2009-11-17 Lukas Zeller * src/sysync/customimplds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: client side filtering: fixed to work with dynamic filters as well 2009-11-16 Lukas Zeller * src/global_options.h: * src/sysync/stdlogicds.cpp: Engine 3.3.0.3: client side filtering: enhanced sync set filtering 2009-11-16 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: binfileds: eliminated fAllRecords flag which was only a duplicate of fSlowSync 2009-11-16 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: engine: made getNumberOfChanges() work correctly in unilib server case 2009-11-13 Lukas Zeller * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: engine: added to define alternate names for datastores 2009-11-12 Lukas Zeller * src/global_options.h: * src/sysync/mimedirprofile.cpp: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: MIME-DIR "group" feature bug fixes - group tag was not stored/generated correctly when group field(s) is not an array 2009-11-11 Lukas Zeller * src/sysync/syncclientbase.cpp: client: syncing another profile except first did not work because of wrong mask 2009-11-10 Lukas Zeller * src/platform_adapters/platform_thread.h: * src/platform_adapters/unix_common/platform_thread.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: 64bit bugfixes: some more params need to be uIntArch to work properly in 64bit builds 2009-11-10 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/DB_interfaces/odbc_db/odbcapids.h: * src/sysync/itemfield.cpp: pluginapi: blob proxy: redone completely messed up implementation 2009-11-09 Beat Forster * src/sysync_SDK/Sources/sync_dbapidef.h: JNI: Requires at least engine version V1.6.1 for correct SetValue support 2009-11-06 Lukas Zeller * src/sysync/engineinterface.cpp: SetValue() now works without C-String terminator when setting integers or dates using string input 2009-11-06 Lukas Zeller * src/sysync/rrules.cpp: RRULE expansion: fixed bug that caused missing occurrences when expansion started within week 2009-11-04 Beat Forster * src/sysync/scriptcontext.cpp: * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/SDK_support.h: * src/sysync_SDK/Sources/sync_dbapi.h: Updates for Android 2009-11-24 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.cpp: anonymous login: improved passing anonymous login attempts to DB Api 2009-11-09 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.cpp: anonymous login: improved passing anonymous login attempts to DB Api 2009-11-04 Beat Forster * src/sysync_SDK/Sources/UI_util.cpp: * src/sysync_SDK/Sources/UI_util.h: UI_util: Use DisconnectEngine_Func; unused functions moved to UI_app_demo 2009-11-04 Lukas Zeller * src/sysync/syncsession.cpp: Some compilers don't not like #ifdefs within function argument list 2009-11-04 Lukas Zeller * src/sysync/engineinterface.cpp: SetValue() did not work without C-String terminator in some cases 2009-11-03 Lukas Zeller * src/global_options.h: * src/sysync/binfileimplds.cpp: Engine 3.3.0.1 - new version signifying reasonably field-tested version of unilib 2009-11-03 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/syncml_tk/src/sml/mgr/all/mgrcmdbuilder.c: * src/syncml_tk/src/sml/xlt/all/xltenc.c: * src/sysync/binfilebase.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplagent.cpp: * src/sysync/customimplagent.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/itemfield.cpp: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/mimedirprofile.cpp: * src/sysync/remotedatastore.cpp: * src/sysync/rrules.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/scriptcontext.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/stringutils.cpp: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncagent.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncclientbase.cpp: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncitemtype.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync/sysync_globs.h: * src/sysync/sysync_utils.cpp: * src/sysync/timezones.cpp: * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: * src/sysync_SDK/Sources/syerror.h: comments: corrected wrong usage of english word "eventually" throughout all sources. 2009-11-03 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: GetValue improved - now LOCERR_TRUNCATED also works for VALTYPE_BUF, better description in comments 2009-11-03 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: DB specific error code: avoid showing confusing "Err = 0" and "(DBError = 0)" texts in log and SyncML 2009-11-03 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapids.cpp: ODBC: bug fix: in case of datastore-level connection error, wrong (session's) connection handle was queried for status 2009-11-03 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: MIME-DIR "group" feature supported now: can have "groupfield" attribute 2009-10-27 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/sysync/localengineds.cpp: Filtering: fixed stone-age (2003) bug that caused fLocalDBFilter not to work in all cases 2009-10-27 Lukas Zeller * src/sysync/binfileimplds.cpp: CRC change detection: slightly improved changelog V2/V3 -> >=V5 migration code 2009-10-27 Lukas Zeller * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.h: Unified "undefined field" ID definition - FID_NOT_SUPPORTED and VARIDX_UNDEFINED have the same meaning 2009-10-27 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: Comment only: DB Api - clarified use of ContextSupport("ReadNextItem:allfields") 2009-10-27 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: CRC change detection: added to enable CRC-based change detection 2009-10-27 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: MIME-DIR, remote rules: default charset interpretation now UTF-8 (no longer ANSI), added to override 2009-10-21 Lukas Zeller * src/sysync/customimplds.cpp: DB mapping: added to allow specifying details for ped fields 2009-10-26 Beat Forster * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/generic_types.h: * src/sysync_SDK/Sources/sync_dbapidef.h: Plain C does not allow // as comment 2009-10-22 Lukas Zeller * src/sysync/scriptcontext.cpp: scripts: variable definitions only shown with SYDEBUG>1 2009-10-13 Beat Forster * src/DB_interfaces/api_db/DLL_interface.cpp: * src/DB_interfaces/api_db/sync_dbapiconnect.cpp: * src/platform_adapters/linux/configfiles.cpp: * src/sysync/sysync.h: * src/sysync/sysync_globs.h: * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/UI_util.cpp: * src/sysync_SDK/Sources/sync_dbapi.h: * src/sysync_SDK/Sources/sync_dbapidef.h: * src/sysync_SDK/Sources/sync_include.h: Adaptations for Android 2009-10-21 Beat Forster * src/sysync_SDK/Sources/dbitem.cpp: dbitem (SDK_textdb) missing fChanged= true added 2009-10-17 Lukas Zeller * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: Alert 222 loop detector improved: do not trigger as long as valid status is received 2009-10-16 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: ODBC STD servers and clients: did not work at all (connection string always empty) 2009-10-16 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync_SDK/Sources/sync_dbapidef.h: comment cosmetics 2009-10-15 Lukas Zeller * src/sysync/mimedirprofile.cpp: vcard/vcal folding: Made sure folding does not occur within UTF-8 sequences 2009-10-15 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/sysync_utils.cpp: vcard/vcal B64 properties: base64 encoded properties must be terminated with a CRLF even if folding is disabled 2009-10-14 Lukas Zeller * src/sysync/mimedirprofile.cpp: vcard/vcal B64 properties: added workaround to recognize improperly folded B64 properties 2009-10-13 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/localengineds.cpp: * src/sysync/multifielditem.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/syncagent.cpp: * src/sysync/syncsession.cpp: unilib: eliminated another bunch of printf argument warnings by casting all %ld arguments to (long) 2009-10-13 Lukas Zeller * src/sysync/engineinterface.cpp: engineinterface: added missing return statement for returnLineartime() 2009-10-08 Beat Forster * src/sysync/customimplds.cpp: stl_minimal has no != operator => use == 2009-10-08 Beat Forster * src/global_options.h: * src/platform_adapters/linux/configfiles.cpp: ANDROID strings added 2009-10-08 Beat Forster * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/syncagent.cpp: * src/sysync_SDK/Sources/stringutil.cpp: unilib: several type adaptions for changes due to unilib 2009-10-13 Lukas Zeller Merge remote branch 'moblin/unilib' into unilib 2009-10-13 Lukas Zeller * src/sysync/syncclientbase.cpp: unilib: make sure no half-constructed session is left over at failed OpenSession() 2009-10-08 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/customimplagent.cpp: * src/sysync/customimplds.cpp: * src/sysync/syncsession.cpp: unilib cleanup: fixed some build problems introduced through unilib 2009-10-08 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/customimplagent.h: unilib: fixed case for targets with no binfile compiled in at all 2009-10-07 Lukas Zeller * src/sysync/syserial.h: syserial product codes: added codes for Android client and server libs, changed Win32 server code (was overlapping iPhone client lib) 2009-10-07 Beat Forster * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/sync_dbapidef.h: SDK: version changed to V1.6.1 2009-10-13 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: * src/sysync/syncagent.cpp: engine: added "lastused" and "timeout" session keys for server session timeout handling 2009-10-12 Patrick Ohly * src/gen-makefile-am.sh: autotools build: only build SAN code as part of the SDK 2009-10-08 Lukas Zeller Merge remote branch 'moblin/unilib' into unilib 2009-10-08 Lukas Zeller Merge branch 'luz' into unilib 2009-10-08 Lukas Zeller Merge remote branch 'moblin/san' into luz 2009-10-07 Lukas Zeller Merge branch 'luz' into unilib 2009-10-07 Beat Forster * src/platform_adapters/linux/configfiles.cpp: * src/platform_adapters/linux/platform_time.cpp: platform adapters Linux: Android adaptions 2009-10-07 Lukas Zeller * src/sysync/localengineds.cpp: localengineds: avoid using != operator on strings because STLs exist that only support == 2009-10-07 Patrick Ohly * Makefile.am: * configure.in: * src/Makefile.am.in: * src/gen-makefile-am.sh: * src/sysync_SDK/Sources/enginestubs.c: * synthesis-sdk.pc.in: * synthesis.pc.in: autotools + pkg-config: added synthesis-sdk.pc 2009-10-02 Patrick Ohly * src/Makefile.am.in: libsynthesis + autotools: must be linked against libz 2009-10-07 Patrick Ohly * src/sysync/syncappbase.cpp: syncappbasse: turned extern "C" into static functions 2009-10-02 Patrick Ohly * configure.in: * src/Makefile.am.in: * src/gen-makefile-am.sh: * src/synthesis-linker.map: * src/sysync_SDK/Sources/UI_util.cpp: autotools build: switched to new combi engine 2009-10-07 Patrick Ohly * src/sysync/dataconversion.cpp: DataConversion(): adapted dummy engine to server API 2009-09-24 Patrick Ohly * configure.in: * src/sysync/san.cpp: * src/sysync/san.h: * src/sysync/sysync_b64.cpp: * src/sysync/sysync_b64.h: * src/sysync/sysync_md5.cpp: * src/sysync/sysync_md5.h: * src/sysync_SDK/Sources/san.cpp: * src/sysync_SDK/Sources/san.h: * src/sysync_SDK/Sources/sysync_b64.cpp: * src/sysync_SDK/Sources/sysync_b64.h: * src/sysync_SDK/Sources/sysync_md5.cpp: * src/sysync_SDK/Sources/sysync_md5.h: SAN: moved to SDK, together with the corresponding utility classes 2009-10-03 Lukas Zeller * src/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h: unilib linux compile: corrected include (no separate combi-engine include file exists here) 2009-10-03 Lukas Zeller * src/client_engine_linux.mk: * src/combi_engine_linux.mk: * src/server_engine_linux.mk: unilib: added plain makefile for combined client+server engine, adapted client-only and server-only to use syncagent.h/.cpp 2009-10-03 Lukas Zeller * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: * src/sysync/syncserver.cpp: * src/sysync/syncserver.h: unilib: removed now obsolete syncclient/syncserver files 2009-10-03 Lukas Zeller Merge branch 'luz' into unilib 2009-10-03 Lukas Zeller * src/sysync_SDK/Sources/UI_util.cpp: engine entry points: adjusted as per discussion (Patrick/bfo) 2009-10-01 Patrick Ohly * src/sysync_SDK/Sources/UI_util.cpp: * src/sysync_SDK/Sources/UI_util.h: * src/sysync_SDK/Sources/enginemodulebridge.cpp: * src/sysync_SDK/Sources/enginemodulebridge.h: SDK engine connect: allow choosing between client and server engine 2009-10-01 Patrick Ohly * src/platform_adapters/linux/platform_DLL.cpp: Linux platform_DLL: open shared library with name as requested 2009-10-01 Patrick Ohly * src/sysync/engineentry.h: * src/sysync_SDK/Sources/sync_dbapidef.h: use ENGINE_ENTRY_CXX to mark external C++ functions 2009-10-01 Patrick Ohly * src/sysync/dataobjtype.cpp: added "namespace sysync" 2009-09-27 Patrick Ohly * src/Makefile.am.in: * src/gen-makefile-am.sh: autotools: added make rules for server engine (libsynthesisserver.so) 2009-10-03 Lukas Zeller Merge remote branch 'origin/bfo' into luz 2009-09-27 Patrick Ohly * src/sysync/syncsession.cpp: TSyncSession: unitialized fEncoding 2009-10-03 Lukas Zeller Merge remote branch 'moblin/master' into luz 2009-10-03 Lukas Zeller * src/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_demo++.pch: * src/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_demo.pch: * src/Targets/ReleasedProducts/combiEngine_opensource_linux/combiengine_opensource_linux_prefix.h: * src/Targets/ReleasedProducts/combiEngine_opensource_linux/define.h: * src/Targets/ReleasedProducts/combiEngine_opensource_linux/target_options.h: opensource linux combiengine: added new target files 2009-10-02 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/Transport_interfaces/engine/engineclientbase.cpp: * src/Transport_interfaces/engine/engineclientbase.h: * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/syncapps/serverEngine_custom/serverengine_custom_Base.cpp: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/stdlogicagent.h: * src/sysync/stdlogicds.cpp: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclientbase.cpp: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncdatastore.cpp: * src/sysync/syncdatastore.h: * src/sysync/syncitem.cpp: * src/sysync/syncitem.h: * src/sysync/syncsession.cpp: * src/sysync/syncsessiondispatch.cpp: * src/sysync/sysync_globs.h: unilib: fixes needed to actually have both client&server enabled in the same build 2009-10-02 Lukas Zeller * src/syncapps/clientEngine_custom/product_options.h: * src/syncapps/serverEngine_custom/combi_product_options.h: unilib: "combiEngine" product options added 2009-10-02 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/platform_adapters/platform_thread.h: * src/platform_adapters/unix_common/platform_thread.cpp: * src/sysync/stdlogicds.cpp: * src/sysync/stringutils.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncsessiondispatch.cpp: * src/sysync/sysync_md5.cpp: * src/sysync/sysync_md5.h: * src/sysync_SDK/Sources/generic_types.h: 64 bit: adjusted generic_types.h to make sure uInt32/sInt32 IS 32bits 2009-10-02 Lukas Zeller * src/syncapps/clientEngine_custom/clientengine_custom_Base.cpp: * src/syncapps/clientEngine_custom/product_options.h: * src/syncapps/serverEngine_custom/product_options.h: * src/syncapps/serverEngine_custom/serverengine_custom_Base.cpp: * src/sysync/binfileimplclient.cpp: * src/sysync/customimplagent.cpp: * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: * src/sysync/syncagent.cpp: * src/sysync/syncappbase.cpp: * src/sysync/syncclientbase.cpp: * src/sysync_SDK/Sources/enginemodulebase.h: * src/sysync_SDK/Sources/sync_dbapidef.h: unilib: prepared co-existence of server and client library instance, added entry points 2009-10-01 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/DB_interfaces/odbc_db/odbcdb.h: * src/global_options.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplagent.cpp: * src/sysync/customimplagent.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/stdlogicagent.cpp: * src/sysync/stdlogicagent.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/sysync_precomp.h: unilib: binfile/customimpl: Now binfile can be included but kept inactive 2009-10-01 Lukas Zeller * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/syncsession.h: binfiles: made binfileimplclient/ds such that they can be switched off (e.g. for unilib server) 2009-10-01 Lukas Zeller * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: unilib: unified TClientParamsKey and TServerParamsKey into TAgentParamsKey 2009-10-01 Lukas Zeller * src/Transport_interfaces/engine/engineclientbase.h: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/syncapps/sysytool/sysytool.cpp: * src/sysync/binfileimplclient.h: * src/sysync/localengineds.cpp: * src/sysync/remotedatastore.cpp: * src/sysync/stdlogicagent.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncappbase.h: * src/sysync/syncclient.h: * src/sysync/syncclientbase.cpp: * src/sysync/syncclientbase.h: * src/sysync/syncserver.h: * src/sysync/syncsession.h: * src/sysync/syncsessiondispatch.h: unlib: including syncagent.h everywhere where we had syncclient.h or syncserver.h 2009-09-30 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/customimplagent.cpp: * src/sysync/customimplagent.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/mimedirprofile.cpp: * src/sysync/remotedatastore.cpp: * src/sysync/remotedatastore.h: * src/sysync/stdlogicagent.cpp: * src/sysync/stdlogicagent.h: * src/sysync/syncagent.cpp: * src/sysync/syncagent.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: * src/sysync/syncclientbase.cpp: * src/sysync/syncclientbase.h: * src/sysync/synccommand.cpp: * src/sysync/syncserver.cpp: * src/sysync/syncserver.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync/syncsessiondispatch.cpp: * src/sysync/syncsessiondispatch.h: unilib: united former syncserver/syncclient into syncagent.h/.cpp 2009-09-29 Lukas Zeller * src/DB_interfaces/api_db/pluginapiagent.cpp: * src/DB_interfaces/api_db/pluginapiagent.h: * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/DB_interfaces/odbc_db/odbcapiagent.h: * src/DB_interfaces/odbc_db/odbcapids.cpp: * src/global_options.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/multifielditemtype.cpp: * src/sysync/remotedatastore.cpp: * src/sysync/stdlogicagent.cpp: * src/sysync/stdlogicagent.h: * src/sysync/stdlogicds.cpp: * src/sysync/stdlogicds.h: * src/sysync/superdatastore.cpp: * src/sysync/superdatastore.h: * src/sysync/syncappbase.cpp: * src/sysync/syncclient.cpp: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncsession.cpp: * src/sysync/sysync_globs.h: * src/sysync/textprofile.cpp: unilib started: engine version 3.3.0.0 to differentiate from normal 3.2.x.x non-unified builds 2009-09-28 Beat Forster * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: save changed nonce value (again) 2009-09-09 Beat Forster * src/platform_adapters/linux/configfiles.cpp: * src/platform_adapters/linux/platform_time.cpp: * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: cleanup: appCharP type casting added, some updates for Android port 2009-09-25 Lukas Zeller * src/sysync/scriptcontext.cpp: scripts: added TIMEONLY() function, enhanced POINTINTIME() not only to convert duration, but also dateonly and timeonly to timestamp 2009-09-25 Lukas Zeller * src/sysync/customimplds.cpp: debug log: wrapped finalizing item into block which shows localID 2009-09-25 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapids.cpp: Debug output cosmetics (array map name is always "array", so do not show it) 2009-09-24 Lukas Zeller * src/sysync/syncclient.cpp: client engine: when incoming data is not SyncML, this must abort the session and dump the message 2009-10-02 Patrick Ohly * src/Makefile.am.in: libsynthesis + autotools: must be linked against libz 2009-09-30 Beat Forster * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: SetNonce fChanged problem fixed; some type casting cAppChar 2009-09-24 Lukas Zeller Merge remote branch 'moblin/master' into luz 2009-09-24 Lukas Zeller * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclient.cpp: * src/sysync/syncserver.cpp: * src/sysync/syncserver.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: libsynthesis_srv: implementation complete - runs sync sessions ok with textDB backend. 2009-09-24 Lukas Zeller * src/sysync/localengineds.cpp: * src/sysync/mimedirprofile.cpp: * src/sysync/syncsession.cpp: cleanup: eliminated some compiler warnings about shadowing local declarations 2009-09-24 Lukas Zeller * src/Targets/ReleasedProducts/serverEngine_opensource_linux/target_options.h: * src/server_engine_linux.mk: * src/syncapps/serverEngine_custom/product_options.h: libsynthesis_srv configuration adjusted 2009-09-24 Lukas Zeller * src/sysync_SDK/configs/syncserv_sample_config.xml: libsynthesis_srv: added sample config for a TextDB based server 2009-09-23 Patrick Ohly * src/sysync_SDK/Sources/engine_defs.h: event codes: reserve range for application use 2009-09-22 Lukas Zeller * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_demo++.pch: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_demo.pch: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource++.pch: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource.pch: * src/Transport_interfaces/engine/engine_server.h: * src/Transport_interfaces/engine/engine_server_precomp.h: * src/Transport_interfaces/engine/enginesessiondispatch.cpp: * src/Transport_interfaces/engine/enginesessiondispatch.h: * src/client_engine_linux.mk: * src/server_engine_linux.mk: * src/syncapps/serverEngine_custom/product_options.h: * src/syncapps/serverEngine_custom/serverengine_custom.h: * src/syncapps/serverEngine_custom/serverengine_custom_Base.cpp: * src/syncapps/serverEngine_custom/serverengine_custom_Base.h: * src/syncapps/serverEngine_custom/serverengine_custom_precomp.h: libsynthesis_srv: added required files, traditional non-automake works for server engine 2009-09-22 Lukas Zeller * src/sysync/localengineds.cpp: engine: statistics workaround for servers not sending status 201 for completed adds 2009-09-21 Lukas Zeller * src/global_options.h: * src/sysync/binfileimplclient.cpp: * src/sysync/localengineds.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/synccommand.cpp: * src/sysync/synccommand.h: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: * src/sysync_SDK/Sources/engine_defs.h: engine 3.2.1.0: added "lenientMode" to ignore anchor mismatches in client, ignore missing status for get/alert 222 2009-09-21 Lukas Zeller * src/global_options.h: engine 3.2.0.35 - stable version used in synthesis products 2009-09-21 Lukas Zeller * src/sysync/syncsession.cpp: memory leak fixed: session script context was not deleted in session destructor 2009-09-21 Lukas Zeller * src/sysync/binfilebase.cpp: * src/sysync/binfilebase.h: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: binfiles: added smooth upgrading from changelog V2 to V3/V4 to avoid slow syncs 2009-09-21 Patrick Ohly * src/sysync/syncclient.cpp: Revert "client state engine: allow multiple calls with STEP_SENTDATA" 2009-09-17 Patrick Ohly * src/sysync/syncclient.cpp: client state engine: allow multiple calls with STEP_SENTDATA 2009-09-16 Patrick Ohly * src/Makefile.am.in: compiler warning on Linux: vasprintf() not declared unless _GNU_SOURCE is set, SDK 2009-09-15 Patrick Ohly Merge commit 'synthesis/luz' 2009-09-15 Patrick Ohly * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/localengineds.cpp: * src/sysync/synccommand.cpp: * src/sysync/sysync_globs.h: Revert "client + statistics workaround: treat status 200 as 201 for Replace cmd (which is really" 2009-09-15 Chen Congwu * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: binfileds: multi-profile safe reliable detection of adds (vs. replaces) for sync clients 2009-09-15 Patrick Ohly * src/sysync/customimplds.cpp: compiler warning: #endif DBAPI_TUNNEL_SUPPORT 2009-09-15 Patrick Ohly * src/Targets/ReleasedProducts/clientEngine_opensource_linux/clientengine_demo_x86_linux_prefix.h: compiler warning on Linux: vasprintf() not declared unless _GNU_SOURCE is set 2009-09-15 Patrick Ohly Merge commit 'synthesis/luz' 2009-09-14 Lukas Zeller * src/syncml_tk/src/sml/mgr/all/mgrinstancemgr.c: * src/sysync/syncclient.cpp: Client: made silently swallow garbage after end of incoming SyncML message 2009-07-16 Chen Congwu * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/localengineds.cpp: * src/sysync/synccommand.cpp: * src/sysync/sysync_globs.h: client + statistics workaround: treat status 200 as 201 for Replace cmd (which is really an Add) 2009-09-14 Lukas Zeller Merge remote branch 'moblin/congwu' into luz 2009-09-14 Beat Forster * src/DB_interfaces/api_db/dbapi.cpp: * src/DB_interfaces/api_db/pluginapids.cpp: * src/platform_adapters/binfile.h: * src/platform_adapters/linux/configfiles.cpp: * src/platform_adapters/linux/platform_timezones.cpp: * src/platform_adapters/platform_thread.h: * src/platform_adapters/unix_common/platform_file.cpp: * src/platform_adapters/unix_common/platform_thread.cpp: * src/sysync/binfilebase.h: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: * src/sysync/stringutils.h: * src/sysync/syncexception.h: * src/sysync/sysync_globs.h: * src/sysync/textitemtype.cpp: * src/sysync/timezones.cpp: * src/sysync/vtimezone.cpp: * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/SDK_support.h: * src/sysync_SDK/Sources/blobs.h: * src/sysync_SDK/Sources/dbitem.cpp: * src/sysync_SDK/Sources/dbitem.h: Adaptations in preparation for new platform and Tunnel API cleanup 2009-09-14 Lukas Zeller * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: Client: Endless Alert222 detection (with luz' patch to use lineartime_t, not time_t) 2009-09-14 Lukas Zeller * src/sysync/engineinterface.cpp: engineinterface: InsertItem/InsertItemAsKey signatures are fixed, removed casts/warnings 2009-09-14 Chen Congwu * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: Client: Endless Alert222 detection 2009-09-08 Beat Forster * src/sysync_SDK/Sources/enginemodulebridge.cpp: * src/sysync_SDK/Sources/enginemodulebridge.h: signature InsertItem/AsKey corrected: ItemID instead of cItemID 2009-09-08 Lukas Zeller * src/sysync/multifielditemtype.cpp: * src/sysync/scriptcontext.cpp: * src/sysync/syncserver.cpp: libsynthesis_srv: changes to make it compilable (not yet functional, however) 2009-09-08 Beat Forster * src/sysync_SDK/Sources/SDK_util.c: buffer size for debug output is no longer restricted to 1kB on Mac/Linux 2009-09-08 Beat Forster * src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.cpp: * src/sysync_SDK/DB_Interfaces/snowwhite/oceanblue.h: * src/sysync_SDK/DB_Interfaces/snowwhite/snowwhite.cpp: * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/SDK_support.h: * src/sysync_SDK/Sources/enginemodulebase.cpp: * src/sysync_SDK/Sources/enginemodulebase.h: array support for tunnel asKey / new itemkey before update/insert operations / UI_Open+Close moved to app_demo 2009-09-08 Lukas Zeller * src/sysync/itemfield.cpp: DBAPI_TUNNEL_SUPPORT: fixed problem with item TZ reading of DATE and DURATION timestamps 2009-09-08 Lukas Zeller * src/Targets/ReleasedProducts/clientEngine_opensource_linux/target_options.h: Comment cosmetics 2009-09-08 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapids.cpp: ODBC/SQL: commented out excessive log messages for substitution 2009-09-08 Lukas Zeller * src/sysync/binfilebase.cpp: * src/sysync/binfilebase.h: binfiles: added checking for record size, should catch 32bit<->64bit data migration issues 2009-09-08 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/Targets/clientEngine_dbg/target_options.h: * src/global_options.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplagent.cpp: * src/sysync/customimplagent.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/engineentry.cpp: * src/sysync/engineentry.h: * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: * src/sysync/localengineds.cpp: * src/sysync/localengineds.h: * src/sysync/multifielditem.cpp: * src/sysync/multifielditem.h: * src/sysync/syncappbase.cpp: * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: * src/sysync/syncclientbase.cpp: * src/sysync/syncsession.h: * src/sysync_SDK/Sources/engine_defs.h: * src/sysync_SDK/Sources/sync_dbapidef.h: DBAPI_TUNNEL_SUPPORT: Implemented now. This allows directly accessing data items from the main application (e.g. for test) 2009-09-08 Lukas Zeller * src/Targets/ReleasedProducts/serverEngine_opensource_linux/define.h: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_demo++.pch: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_demo.pch: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/serverengine_opensource_linux_prefix.h: * src/Targets/ReleasedProducts/serverEngine_opensource_linux/target_options.h: libsynthesis_srv: added new target files for SyncML server variant of libsynthesis 2009-09-08 Lukas Zeller * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/localengineds.cpp: * src/sysync/synccommand.cpp: * src/sysync/sysync_globs.h: REVERTED for now: Add/Replace statistics workaround 2009-09-08 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltdevinf.c: devInf without datastore list: clarified comments why this is needed (comment change only) 2009-09-08 Lukas Zeller Merge remote branch 'moblin/yongsheng' 2009-09-08 Lukas Zeller * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: STEPCMD_RESENDDATA: modified such that it is clear state is different from after STEPCMD_SENDDATA 2009-09-03 Patrick Ohly * src/sysync/debuglogger.cpp: TDebugLoggerBase::DebugOpenBlock: fixed build failure on Alpha CPU architecture 2009-09-03 Zhu, Yongsheng * src/syncml_tk/src/sml/xlt/all/xltdevinf.c: DevInf: Allow devinf not containing datastore when encoding 2009-09-03 Zhu, Yongsheng * src/sysync/syncclient.cpp: Message: do 'FinishMessage' processing at the end of session 2009-08-25 Patrick Ohly * src/Makefile.am.in: bumped version to current/revision/age 2/0/2 because of STEP_RESENDDATA 2009-07-22 Chen Congwu * src/sysync/syncclient.cpp: * src/sysync_SDK/Sources/engine_defs.h: Client+Resend data: bug#3427, add sysync::STEP_RESENDDATA 2009-08-18 Patrick Ohly * src/sysync/stdlogicds.cpp: Revert "slow sync: avoid empty anchors, that confuses ScheduleWorld" 2009-08-18 Patrick Ohly Merge commit 'synthesis/master' 2009-08-13 Patrick Ohly * src/sysync/itemfield.cpp: reading keys: fixed string handling errors 2009-08-13 Patrick Ohly * src/sysync/vtimezone.cpp: * src/sysync/vtimezone.h: vtimezone: accept alternative line ends, using const string & for efficiency 2009-08-13 Patrick Ohly * src/sysync/sysync_utils.cpp: compiler warning in generateNonce(): casting char array 2009-08-13 Patrick Ohly * src/sysync/synccommand.cpp: TSyncCommand::analyze: compiler warning about uninitialized variable (return code!) 2009-08-13 Patrick Ohly * src/sysync/engineinterface.cpp: TSettingsKeyImpl::SetValueByID: compiler warning about pointer aliasing 2009-08-12 Lukas Zeller Merge commit 'origin/master' 2009-08-12 Beat Forster * src/sysync_SDK/Sources/SDK_util.c: * src/sysync_SDK/Sources/sync_dbapidef.h: SDK version changed to 1.6.0 2009-08-12 Beat Forster * src/sysync_SDK/DB_Interfaces/text_db/sync_dbapi_text.cpp: * src/sysync_SDK/Sources/dbitem.cpp: * src/sysync_SDK/Sources/dbitem.h: TextDB: minor fixes 2009-08-12 Lukas Zeller * src/global_options.h: * src/sysync/binfileimplclient.cpp: engine 3.2.0.33: enhanced URIpath profile settings functionality 2009-08-12 Lukas Zeller * src/sysync/mimedirprofile.cpp: mimedirprofile: autoenddate 23:59:59 detection bug fixed 2009-08-11 Zhu, Yongsheng * src/sysync/rrules.cpp: RRULE: rrule2internal will lose the last item of daylist of fields like 'BY***' 2009-08-05 Patrick Ohly * src/sysync/engineinterface.cpp: TSettingsKeyImpl::SetValueByID: compiler warning about pointer aliasing 2009-08-05 Patrick Ohly * src/sysync/synccommand.cpp: TSyncCommand::analyze: compiler warning about uninitialized variable (return code!) 2009-08-05 Patrick Ohly * src/sysync/sysync_utils.cpp: appendRFC2047AsUTF8: compiler warning about uninitialized variable 2009-08-05 Patrick Ohly * src/sysync/sysync_utils.cpp: compiler warning in generateNonce(): casting char array 2009-07-30 Patrick Ohly * src/sysync/stdlogicds.cpp: slow sync: avoid empty anchors, that confuses ScheduleWorld 2009-07-29 Patrick Ohly * src/sysync/vtimezone.cpp: timezone parsing: accept \r\n and \r as line ends in addition to \n 2009-07-28 Patrick Ohly * src/sysync/vtimezone.cpp: * src/sysync/vtimezone.h: vtimezone: use const string & instead of string copy 2009-07-21 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux timezones: previous fix for icalcomponent_as_ical_string_r was incomplete 2009-07-21 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux timezones: compile fix for libecal and --disable-evolution-compatibility 2009-07-21 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux timezones: use icalcomponent_as_ical_string_r() if possible 2009-07-17 Patrick Ohly * Makefile.am: * configure.in: * synthesis.pc.in: autotools: added synthesis.pc file for pkg-config 2009-07-17 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: Linux timezones: avoid compiler warning 2009-07-16 Chen Congwu * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/localengineds.cpp: * src/sysync/synccommand.cpp: * src/sysync/sysync_globs.h: client + statistics workaround: treat status 200 as 201 for Replace cmd (which is really an Add) 2009-07-15 Patrick Ohly * configure.in: * src/platform_adapters/linux/platform_timezones.cpp: autotools: add --enable-evolution-compatibility 2009-07-15 Patrick Ohly * README: README: mentioned that expat 2.x can be used instead of the older expat 1.x 2009-07-14 Patrick Ohly Merge commit 'origin/master' 2009-07-13 Patrick Ohly * autogen.sh: autgen.sh: wipe out old files before recreating them 2009-07-13 Patrick Ohly * src/synthesis-linker.map: SySyncDebugPuts: fixed dynamic link problem 2009-07-10 Lukas Zeller * src/sysync/syncserver.cpp: * src/sysync/syncserver.h: server: fixed to compile again with ENGINEINTERFACE_SUPPORT (for XXXAsKey) but no ENGINE_LIBRARY (traditional Synthesis builds) 2009-07-10 Beat Forster * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: syncml_tk: Fix for BOM checker: In pure C variables must be defined before any other statement 2009-07-10 Lukas Zeller * src/sysync/syncclient.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: Suspend ALERT: renamed flags and accessors to include "suspend" (to make clear it is the suspend alert) 2009-07-10 Lukas Zeller Merge commit 'moblin/congwu' 2009-07-10 Patrick Ohly * src/sysync_SDK/Sources/enginemodulebase.cpp: * src/sysync_SDK/Sources/enginemodulebase.h: TEngineModuleBridge::Term() + fCI: memory leak 2009-07-10 Patrick Ohly * src/sysync/scriptcontext.cpp: MakeTextWithProfile: did not free profile handler 2009-07-10 Patrick Ohly * src/sysync/mimedirprofile.cpp: MIMEStringToField: unitialized time context 2009-07-10 Patrick Ohly * src/sysync/engineinterface.cpp: TSettingsKeyImpl::checkFieldAttrs: don't read before start of string 2009-07-03 Patrick Ohly * src/sysync/engineentry.cpp: * src/sysync/syncclientbase.cpp: * src/sysync/syncclientbase.h: * src/sysync_SDK/Sources/enginemodulebase.h: * src/sysync_SDK/Sources/sync_dbapidef.h: engine logging: new API with more information provided to the engine 2009-07-03 Patrick Ohly * src/sysync/debuglogger.h: engine logging: fix message dumping in combination with 2009-07-03 Patrick Ohly * src/sysync/scriptcontext.cpp: fixed compiler warnings: signed/unsigned comparison 2009-07-03 Patrick Ohly * src/sysync/syncsession.cpp: configuration: accept configs without any datastore definition 2009-06-26 Chen Congwu * src/sysync/syncclient.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: Suspend ALERT: make sure synthesis client sends the suspend alert 2009-07-01 Lukas Zeller * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: remoterules build dependency removed - new setRemoteRule() function implementation needed #ifdefs 2009-07-01 Lukas Zeller * src/sysync/debuglogger.cpp: * src/sysync/debuglogger.h: * src/sysync/syncappbase.cpp: * src/sysync/syncappbase.h: * src/sysync/syncsession.cpp: engine logging: added to direct session logs into global log 2009-07-01 Lukas Zeller * src/sysync/scriptcontext.cpp: * src/sysync/scriptcontext.h: scripts: Added macro arguments for script macros 2009-06-26 tester * src/DB_interfaces/odbc_db/odbcapiagent.cpp: compiler warning: uninitialized variable 2009-06-26 tester * src/sysync/syncsession.cpp: compiler warning: parenthesis in boolean expression 2009-06-26 zhu, yongsheng * src/sysync/mimedirprofile.cpp: MIMEPROFILE: Add \N to represent newline 2009-06-25 tester * configure.in: configure + XML lib: fixed the situation where only expat was installed 2009-06-25 Patrick Ohly Merge commit 'moblin/yong' 2009-06-25 Patrick Ohly Merge commit 'origin/master' 2009-06-23 Patrick Ohly * src/Makefile.am.in: * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: * src/sysync/multifielditem.h: * src/sysync/scriptcontext.cpp: MAKE/PARSETEXTWITHPROFILE: added remote rule name parameter 2009-06-23 Patrick Ohly * src/Targets/ReleasedProducts/clientEngine_opensource_linux/target_options.h: compile configuration: enable remote rules in client engine 2009-06-22 Lukas Zeller * src/sysync/stdlogicds.cpp: * src/sysync/syncclient.cpp: * src/sysync/syncsession.cpp: * src/sysync/syncsession.h: engine: cleaned up around fRemoteMustSeeDevinf and mustSendDevInf() 2009-06-22 Wu, Yong * src/sysync/syncclient.cpp: client: Added check to make sure devInf gets sent (Put) to server when config has changed 2009-06-22 Wu, Yong * src/sysync/syncappbase.h: Avoid "if without value" compiling warnings. 2009-06-19 Wu, Yong * configure.in: Fix a typo in help text. 2009-06-19 Wu, Yong * configure.in: * src/sysync/syncappbase.h: Bug 3312. add expat support. Synthesis can work in 3 modes: a) system expat, b) system xmltok, c) builtin xmltok. The original configuration works with either system xmltok or builtin xmltok. We added the expat support and made expat as the default xml parser. 2009-06-18 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/DB_interfaces/api_db/pluginapids.h: * src/DB_interfaces/odbc_db/odbcapids.h: * src/global_options.h: * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplds.cpp: * src/sysync/binfileimplds.h: * src/sysync/customimplds.cpp: * src/sysync/customimplds.h: * src/sysync/engineinterface.cpp: * src/sysync/sysync_utils.cpp: engine 3.2.0.32: cleaned up binfile changelog update tracking 2009-06-16 Lukas Zeller * Synthesis_AG_Contributor_Agreement.doc: Contributor agreement: Added Word version for helping incremental workflows completing the agreement 2009-06-10 Lukas Zeller * doc/SySync_config_reference.doc: * doc/SySync_config_reference.pdf: docs: updated SySync_config_reference for engine 3.2.0.31 2009-06-10 Lukas Zeller * src/global_options.h: engine 3.2.0.31 2009-06-10 Lukas Zeller * src/DB_interfaces/api_db/pluginapids.cpp: * src/sysync/localengineds.cpp: * src/sysync/syncappbase.h: * src/sysync/syncclientbase.cpp: * src/sysync/syncclientbase.h: * src/sysync/syncserver.cpp: * src/sysync/syncserver.h: server engine: some preparations, work in progress 2009-06-10 Lukas Zeller * src/sysync/syncclient.cpp: * src/sysync/syncclient.h: * src/sysync/sysync_globs.h: client: added "smart" retry (mainly as ZYB workaround) 2009-06-10 Lukas Zeller * src/sysync/scriptcontext.cpp: * src/sysync/syncsession.cpp: Scripting: Made SETLOG, SETDEBUGLOG and SETREADONLY generally accessible 2009-06-10 Lukas Zeller * src/sysync/binfileimplclient.cpp: * src/sysync/binfileimplclient.h: * src/sysync/binfileimplds.cpp: * src/sysync/engineinterface.cpp: * src/sysync/itemfield.cpp: * src/sysync_SDK/Sources/engine_defs.h: engine: settings key access improvements 2009-06-10 Lukas Zeller * src/DB_interfaces/odbc_db/odbcapiagent.cpp: * src/sysync/customimplagent.cpp: * src/sysync/customimplagent.h: * src/sysync/lineartime.h: DB interfacing: support for Apple "nsdate" DB field type 2009-06-10 Lukas Zeller * src/sysync/customimplds.cpp: * src/sysync/dataobjtype.cpp: * src/sysync/multifielditem.h: * src/sysync/timezones.h: warnings elimination 2009-06-09 zhu, yongsheng * src/syncml_tk/src/sml/xlt/all/xltdecxml.c: BOM Processing for SyncML Toolkit 2009-05-13 Patrick Ohly * src/platform_adapters/linux/platform_timezones.cpp: libical time zone import: imported time zones were skipped during matching 2009-05-12 Lukas Zeller * src/global_options.h: * src/sysync/mimedirprofile.cpp: * src/sysync/mimedirprofile.h: mime-dir: added "expandedlist" option for 2009-05-12 Lukas Zeller * src/sysync/iso8601.cpp: iso8601: less than 1h negative minute offset was displayed as positive 2009-05-12 Lukas Zeller * src/sysync/engineinterface.cpp: * src/sysync/engineinterface.h: engine interface: added support for querying value type in all settings keys 2009-05-12 Beat Forster * src/sysync/timezones.cpp: * src/sysync/tz_table.h: * src/sysync/vtimezone.cpp: * src/sysync/vtimezone.h: timezones: improved matching for UTC, bug fix 2009-05-12 Lukas Zeller * src/sysync_SDK/configs/syncclient_sample_config.xml: sample client config: EXDATE is comma separated in iCalendar 2.0! 2009-05-07 Lukas Zeller * Synthesis_AG_Contributor_Agreement.pdf: Contributor Agreement: clarified "Contributor" term, more space for filling out the form 2009-05-05 Beat Forster * src/sysync/vtimezone.cpp: timezones: zones without DST rules (e.g. China) will be recognized correctly 2009-05-05 Beat Forster * src/sysync/vtimezone.cpp: timezones: pure minute offset TZ will now get TZID with name, e.g. TZID:OFFS-0057 or TZID:OFFS+0130 2009-05-05 Lukas Zeller * src/sysync/syncserver.cpp: sysytool: made sure pseudo test session is in "remote understands UTC" mode. 2009-05-05 Lukas Zeller * src/sysync/mimedirprofile.cpp: vCalendar 1.0 TZ parsing: now searches in internal zone list 2009-05-04 Lukas Zeller * src/global_options.h: Version changed to 3.2.0.27 2009-05-04 Lukas Zeller * src/syncml_tk/src/sml/xlt/all/xltenc.c: SyncML-TK: fixed strange bracketing found by Gary Tyler 2009-05-04 Lukas Zeller * src/sysync/syncclientbase.cpp: * src/sysync_SDK/Sources/engine_defs.h: Suspend: Fixed problem with STEPCMD_SUSPEND 2009-05-04 Beat Forster * src/sysync_SDK/Sources/SDK_support.cpp: * src/sysync_SDK/Sources/SDK_support.h: SDK_support: Added CLine:GetName() 2009-04-22 Lukas Zeller * src/global_options.h: Version changed to 3.2.0.26 2009-04-21 Patrick Ohly * src/sysync/vtimezone.cpp: time zones: VTIMEZONE definitions may end in \r\n, strip \r from name 2009-04-17 Synthesis AG Initial Commit by Synthesis AG for Open Source libsynthesis 3.2.0.25 and libsmltk syncevolution-1.5/test/0000755000373300037200000000000012424707642016663 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/Algorithm/0000755000373300037200000000000012424707641020610 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/Algorithm/Artistic0000644000373300001540000001373712326412403022140 0ustar00nightlynightly00000000000000 The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End syncevolution-1.5/test/Algorithm/COPYING0000644000373300001540000000131312326412403021451 0ustar00nightlynightly00000000000000This is a subset of the original Algorithm::Diff distribution, added here to avoid the external dependency. No other changes were made. The original sources should always be available from the Comprehensive Perl Archive Network (CPAN). Visit to find a CPAN site near you. The Algorithm::Diff copyright is as follows: | Parts Copyright (c) 2000-2004 Ned Konz. All rights reserved. | Parts by Tye McQueen. | | This program is free software; you can redistribute it and/or modify it | under the same terms as Perl. The content of this directory is distributed under the original license: dual-licensed under GPL-2 (../../COPYING) and Larry Wall's "Artistic License" (./Artistic). syncevolution-1.5/test/Algorithm/README0000644000373300001540000000641012326412403021301 0ustar00nightlynightly00000000000000This is a module for computing the difference between two files, two strings, or any other two lists of things. It uses an intelligent algorithm similar to (or identical to) the one used by the Unix "diff" program. It is guaranteed to find the *smallest possible* set of differences. This package contains a few parts. Algorithm::Diff is the module that contains several interfaces for which computing the differences betwen two lists. The several "diff" programs also included in this package use Algorithm::Diff to find the differences and then they format the output. Algorithm::Diff also includes some other useful functions such as "LCS", which computes the longest common subsequence of two lists. A::D is suitable for many uses. You can use it for finding the smallest set of differences between two strings, or for computing the most efficient way to update the screen if you were replacing "curses". Algorithm::DiffOld is a previous version of the module which is included primarilly for those wanting to use a custom comparison function rather than a key generating function (and who don't mind the significant performance penalty of perhaps 20-fold). diff.pl implements a "diff" in Perl that is as simple as (was previously) possible so that you can see how it works. The output format is not compatible with regular "diff". It needs to be reimplemented using the OO interface to greatly simplify the code. diffnew.pl implements a "diff" in Perl with full bells and whistles. By Mark-Jason, with code from cdiff.pl included. cdiff.pl implements "diff" that generates real context diffs in either traditional format or GNU unified format. Original contextless "context" diff supplied by Christian Murphy. Modifications to make it into a real full-featured diff with -c and -u options supplied by Amir D. Karger. Yes, you can use this program to generate patches. OTHER RESOURCES "Longest Common Subsequences", at http://www.ics.uci.edu/~eppstein/161/960229.html This code was adapted from the Smalltalk code of Mario Wolczko , which is available at ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st THANKS SECTION Thanks to Ned Konz's for rewriting the module to greatly improve performance, for maintaining it over the years, and for readilly handing it over to me so I could plod along with my improvements. (From Ned Konz's earlier versions): Thanks to Mark-Jason Dominus for doing the original Perl version and maintaining it over the last couple of years. Mark-Jason has been a huge contributor to the Perl community and CPAN; it's because of people like him that Perl has become a success. Thanks to Mario Wolczko for writing and making publicly available his Smalltalk version of diff, which this Perl version is heavily based on. Thanks to Mike Schilli for writing sdiff and traverse_balanced and making them available for the Algorithm::Diff distribution. (From Mark-Jason Dominus' earlier versions): Huge thanks to Amir Karger for adding full context diff supprt to "cdiff.pl", and then for waiting patiently for five months while I let it sit in a closet and didn't release it. Thank you thank you thank you, Amir! Thanks to Christian Murphy for adding the first context diff format support to "cdiff.pl". syncevolution-1.5/test/Algorithm/Diff.pm0000644000373300001540000014362612326412403021642 0ustar00nightlynightly00000000000000package Algorithm::Diff; # Skip to first "=head" line for documentation. use strict; use integer; # see below in _replaceNextLargerWith() for mod to make # if you don't use this use vars qw( $VERSION @EXPORT_OK ); $VERSION = 1.19_01; # ^ ^^ ^^-- Incremented at will # | \+----- Incremented for non-trivial changes to features # \-------- Incremented for fundamental changes require Exporter; *import = \&Exporter::import; @EXPORT_OK = qw( prepare LCS LCSidx LCS_length diff sdiff compact_diff traverse_sequences traverse_balanced ); # McIlroy-Hunt diff algorithm # Adapted from the Smalltalk code of Mario I. Wolczko, # by Ned Konz, perl@bike-nomad.com # Updates by Tye McQueen, http://perlmonks.org/?node=tye # Create a hash that maps each element of $aCollection to the set of # positions it occupies in $aCollection, restricted to the elements # within the range of indexes specified by $start and $end. # The fourth parameter is a subroutine reference that will be called to # generate a string to use as a key. # Additional parameters, if any, will be passed to this subroutine. # # my $hashRef = _withPositionsOfInInterval( \@array, $start, $end, $keyGen ); sub _withPositionsOfInInterval { my $aCollection = shift; # array ref my $start = shift; my $end = shift; my $keyGen = shift; my %d; my $index; for ( $index = $start ; $index <= $end ; $index++ ) { my $element = $aCollection->[$index]; my $key = &$keyGen( $element, @_ ); if ( exists( $d{$key} ) ) { unshift ( @{ $d{$key} }, $index ); } else { $d{$key} = [$index]; } } return wantarray ? %d : \%d; } # Find the place at which aValue would normally be inserted into the # array. If that place is already occupied by aValue, do nothing, and # return undef. If the place does not exist (i.e., it is off the end of # the array), add it to the end, otherwise replace the element at that # point with aValue. It is assumed that the array's values are numeric. # This is where the bulk (75%) of the time is spent in this module, so # try to make it fast! sub _replaceNextLargerWith { my ( $array, $aValue, $high ) = @_; $high ||= $#$array; # off the end? if ( $high == -1 || $aValue > $array->[-1] ) { push ( @$array, $aValue ); return $high + 1; } # binary search for insertion point... my $low = 0; my $index; my $found; while ( $low <= $high ) { $index = ( $high + $low ) / 2; # $index = int(( $high + $low ) / 2); # without 'use integer' $found = $array->[$index]; if ( $aValue == $found ) { return undef; } elsif ( $aValue > $found ) { $low = $index + 1; } else { $high = $index - 1; } } # now insertion point is in $low. $array->[$low] = $aValue; # overwrite next larger return $low; } # This method computes the longest common subsequence in $a and $b. # Result is array or ref, whose contents is such that # $a->[ $i ] == $b->[ $result[ $i ] ] # foreach $i in ( 0 .. $#result ) if $result[ $i ] is defined. # An additional argument may be passed; this is a hash or key generating # function that should return a string that uniquely identifies the given # element. It should be the case that if the key is the same, the elements # will compare the same. If this parameter is undef or missing, the key # will be the element as a string. # By default, comparisons will use "eq" and elements will be turned into keys # using the default stringizing operator '""'. # Additional parameters, if any, will be passed to the key generation # routine. sub _longestCommonSubsequence { my $a = shift; # array ref or hash ref my $b = shift; # array ref or hash ref my $counting = shift; # scalar my $keyGen = shift; # code ref my $compare; # code ref if ( ref($a) eq 'HASH' ) { # prepared hash must be in $b my $tmp = $b; $b = $a; $a = $tmp; } # Check for bogus (non-ref) argument values if ( !ref($a) || !ref($b) ) { my @callerInfo = caller(1); die 'error: must pass array or hash references to ' . $callerInfo[3]; } # set up code refs # Note that these are optimized. if ( !defined($keyGen) ) # optimize for strings { $keyGen = sub { $_[0] }; $compare = sub { my ( $a, $b ) = @_; $a eq $b }; } else { $compare = sub { my $a = shift; my $b = shift; &$keyGen( $a, @_ ) eq &$keyGen( $b, @_ ); }; } my ( $aStart, $aFinish, $matchVector ) = ( 0, $#$a, [] ); my ( $prunedCount, $bMatches ) = ( 0, {} ); if ( ref($b) eq 'HASH' ) # was $bMatches prepared for us? { $bMatches = $b; } else { my ( $bStart, $bFinish ) = ( 0, $#$b ); # First we prune off any common elements at the beginning while ( $aStart <= $aFinish and $bStart <= $bFinish and &$compare( $a->[$aStart], $b->[$bStart], @_ ) ) { $matchVector->[ $aStart++ ] = $bStart++; $prunedCount++; } # now the end while ( $aStart <= $aFinish and $bStart <= $bFinish and &$compare( $a->[$aFinish], $b->[$bFinish], @_ ) ) { $matchVector->[ $aFinish-- ] = $bFinish--; $prunedCount++; } # Now compute the equivalence classes of positions of elements $bMatches = _withPositionsOfInInterval( $b, $bStart, $bFinish, $keyGen, @_ ); } my $thresh = []; my $links = []; my ( $i, $ai, $j, $k ); for ( $i = $aStart ; $i <= $aFinish ; $i++ ) { $ai = &$keyGen( $a->[$i], @_ ); if ( exists( $bMatches->{$ai} ) ) { $k = 0; for $j ( @{ $bMatches->{$ai} } ) { # optimization: most of the time this will be true if ( $k and $thresh->[$k] > $j and $thresh->[ $k - 1 ] < $j ) { $thresh->[$k] = $j; } else { $k = _replaceNextLargerWith( $thresh, $j, $k ); } # oddly, it's faster to always test this (CPU cache?). if ( defined($k) ) { $links->[$k] = [ ( $k ? $links->[ $k - 1 ] : undef ), $i, $j ]; } } } } if (@$thresh) { return $prunedCount + @$thresh if $counting; for ( my $link = $links->[$#$thresh] ; $link ; $link = $link->[0] ) { $matchVector->[ $link->[1] ] = $link->[2]; } } elsif ($counting) { return $prunedCount; } return wantarray ? @$matchVector : $matchVector; } sub traverse_sequences { my $a = shift; # array ref my $b = shift; # array ref my $callbacks = shift || {}; my $keyGen = shift; my $matchCallback = $callbacks->{'MATCH'} || sub { }; my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; my $finishedACallback = $callbacks->{'A_FINISHED'}; my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; my $finishedBCallback = $callbacks->{'B_FINISHED'}; my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ ); # Process all the lines in @$matchVector my $lastA = $#$a; my $lastB = $#$b; my $bi = 0; my $ai; for ( $ai = 0 ; $ai <= $#$matchVector ; $ai++ ) { my $bLine = $matchVector->[$ai]; if ( defined($bLine) ) # matched { &$discardBCallback( $ai, $bi++, @_ ) while $bi < $bLine; &$matchCallback( $ai, $bi++, @_ ); } else { &$discardACallback( $ai, $bi, @_ ); } } # The last entry (if any) processed was a match. # $ai and $bi point just past the last matching lines in their sequences. while ( $ai <= $lastA or $bi <= $lastB ) { # last A? if ( $ai == $lastA + 1 and $bi <= $lastB ) { if ( defined($finishedACallback) ) { &$finishedACallback( $lastA, @_ ); $finishedACallback = undef; } else { &$discardBCallback( $ai, $bi++, @_ ) while $bi <= $lastB; } } # last B? if ( $bi == $lastB + 1 and $ai <= $lastA ) { if ( defined($finishedBCallback) ) { &$finishedBCallback( $lastB, @_ ); $finishedBCallback = undef; } else { &$discardACallback( $ai++, $bi, @_ ) while $ai <= $lastA; } } &$discardACallback( $ai++, $bi, @_ ) if $ai <= $lastA; &$discardBCallback( $ai, $bi++, @_ ) if $bi <= $lastB; } return 1; } sub traverse_balanced { my $a = shift; # array ref my $b = shift; # array ref my $callbacks = shift || {}; my $keyGen = shift; my $matchCallback = $callbacks->{'MATCH'} || sub { }; my $discardACallback = $callbacks->{'DISCARD_A'} || sub { }; my $discardBCallback = $callbacks->{'DISCARD_B'} || sub { }; my $changeCallback = $callbacks->{'CHANGE'}; my $matchVector = _longestCommonSubsequence( $a, $b, 0, $keyGen, @_ ); # Process all the lines in match vector my $lastA = $#$a; my $lastB = $#$b; my $bi = 0; my $ai = 0; my $ma = -1; my $mb; while (1) { # Find next match indices $ma and $mb do { $ma++; } while( $ma <= $#$matchVector && !defined $matchVector->[$ma] ); last if $ma > $#$matchVector; # end of matchVector? $mb = $matchVector->[$ma]; # Proceed with discard a/b or change events until # next match while ( $ai < $ma || $bi < $mb ) { if ( $ai < $ma && $bi < $mb ) { # Change if ( defined $changeCallback ) { &$changeCallback( $ai++, $bi++, @_ ); } else { &$discardACallback( $ai++, $bi, @_ ); &$discardBCallback( $ai, $bi++, @_ ); } } elsif ( $ai < $ma ) { &$discardACallback( $ai++, $bi, @_ ); } else { # $bi < $mb &$discardBCallback( $ai, $bi++, @_ ); } } # Match &$matchCallback( $ai++, $bi++, @_ ); } while ( $ai <= $lastA || $bi <= $lastB ) { if ( $ai <= $lastA && $bi <= $lastB ) { # Change if ( defined $changeCallback ) { &$changeCallback( $ai++, $bi++, @_ ); } else { &$discardACallback( $ai++, $bi, @_ ); &$discardBCallback( $ai, $bi++, @_ ); } } elsif ( $ai <= $lastA ) { &$discardACallback( $ai++, $bi, @_ ); } else { # $bi <= $lastB &$discardBCallback( $ai, $bi++, @_ ); } } return 1; } sub prepare { my $a = shift; # array ref my $keyGen = shift; # code ref # set up code ref $keyGen = sub { $_[0] } unless defined($keyGen); return scalar _withPositionsOfInInterval( $a, 0, $#$a, $keyGen, @_ ); } sub LCS { my $a = shift; # array ref my $b = shift; # array ref or hash ref my $matchVector = _longestCommonSubsequence( $a, $b, 0, @_ ); my @retval; my $i; for ( $i = 0 ; $i <= $#$matchVector ; $i++ ) { if ( defined( $matchVector->[$i] ) ) { push ( @retval, $a->[$i] ); } } return wantarray ? @retval : \@retval; } sub LCS_length { my $a = shift; # array ref my $b = shift; # array ref or hash ref return _longestCommonSubsequence( $a, $b, 1, @_ ); } sub LCSidx { my $a= shift @_; my $b= shift @_; my $match= _longestCommonSubsequence( $a, $b, 0, @_ ); my @am= grep defined $match->[$_], 0..$#$match; my @bm= @{$match}[@am]; return \@am, \@bm; } sub compact_diff { my $a= shift @_; my $b= shift @_; my( $am, $bm )= LCSidx( $a, $b, @_ ); my @cdiff; my( $ai, $bi )= ( 0, 0 ); push @cdiff, $ai, $bi; while( 1 ) { while( @$am && $ai == $am->[0] && $bi == $bm->[0] ) { shift @$am; shift @$bm; ++$ai, ++$bi; } push @cdiff, $ai, $bi; last if ! @$am; $ai = $am->[0]; $bi = $bm->[0]; push @cdiff, $ai, $bi; } push @cdiff, 0+@$a, 0+@$b if $ai < @$a || $bi < @$b; return wantarray ? @cdiff : \@cdiff; } sub diff { my $a = shift; # array ref my $b = shift; # array ref my $retval = []; my $hunk = []; my $discard = sub { push @$hunk, [ '-', $_[0], $a->[ $_[0] ] ]; }; my $add = sub { push @$hunk, [ '+', $_[1], $b->[ $_[1] ] ]; }; my $match = sub { push @$retval, $hunk if 0 < @$hunk; $hunk = [] }; traverse_sequences( $a, $b, { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add }, @_ ); &$match(); return wantarray ? @$retval : $retval; } sub sdiff { my $a = shift; # array ref my $b = shift; # array ref my $retval = []; my $discard = sub { push ( @$retval, [ '-', $a->[ $_[0] ], "" ] ) }; my $add = sub { push ( @$retval, [ '+', "", $b->[ $_[1] ] ] ) }; my $change = sub { push ( @$retval, [ 'c', $a->[ $_[0] ], $b->[ $_[1] ] ] ); }; my $match = sub { push ( @$retval, [ 'u', $a->[ $_[0] ], $b->[ $_[1] ] ] ); }; traverse_balanced( $a, $b, { MATCH => $match, DISCARD_A => $discard, DISCARD_B => $add, CHANGE => $change, }, @_ ); return wantarray ? @$retval : $retval; } ######################################## my $Root= __PACKAGE__; package Algorithm::Diff::_impl; use strict; sub _Idx() { 0 } # $me->[_Idx]: Ref to array of hunk indices # 1 # $me->[1]: Ref to first sequence # 2 # $me->[2]: Ref to second sequence sub _End() { 3 } # $me->[_End]: Diff between forward and reverse pos sub _Same() { 4 } # $me->[_Same]: 1 if pos 1 contains unchanged items sub _Base() { 5 } # $me->[_Base]: Added to range's min and max sub _Pos() { 6 } # $me->[_Pos]: Which hunk is currently selected sub _Off() { 7 } # $me->[_Off]: Offset into _Idx for current position sub _Min() { -2 } # Added to _Off to get min instead of max+1 sub Die { require Carp; Carp::confess( @_ ); } sub _ChkPos { my( $me )= @_; return if $me->[_Pos]; my $meth= ( caller(1) )[3]; Die( "Called $meth on 'reset' object" ); } sub _ChkSeq { my( $me, $seq )= @_; return $seq + $me->[_Off] if 1 == $seq || 2 == $seq; my $meth= ( caller(1) )[3]; Die( "$meth: Invalid sequence number ($seq); must be 1 or 2" ); } sub getObjPkg { my( $us )= @_; return ref $us if ref $us; return $us . "::_obj"; } sub new { my( $us, $seq1, $seq2, $opts ) = @_; my @args; for( $opts->{keyGen} ) { push @args, $_ if $_; } for( $opts->{keyGenArgs} ) { push @args, @$_ if $_; } my $cdif= Algorithm::Diff::compact_diff( $seq1, $seq2, @args ); my $same= 1; if( 0 == $cdif->[2] && 0 == $cdif->[3] ) { $same= 0; splice @$cdif, 0, 2; } my @obj= ( $cdif, $seq1, $seq2 ); $obj[_End] = (1+@$cdif)/2; $obj[_Same] = $same; $obj[_Base] = 0; my $me = bless \@obj, $us->getObjPkg(); $me->Reset( 0 ); return $me; } sub Reset { my( $me, $pos )= @_; $pos= int( $pos || 0 ); $pos += $me->[_End] if $pos < 0; $pos= 0 if $pos < 0 || $me->[_End] <= $pos; $me->[_Pos]= $pos || !1; $me->[_Off]= 2*$pos - 1; return $me; } sub Base { my( $me, $base )= @_; my $oldBase= $me->[_Base]; $me->[_Base]= 0+$base if defined $base; return $oldBase; } sub Copy { my( $me, $pos, $base )= @_; my @obj= @$me; my $you= bless \@obj, ref($me); $you->Reset( $pos ) if defined $pos; $you->Base( $base ); return $you; } sub Next { my( $me, $steps )= @_; $steps= 1 if ! defined $steps; if( $steps ) { my $pos= $me->[_Pos]; my $new= $pos + $steps; $new= 0 if $pos && $new < 0; $me->Reset( $new ) } return $me->[_Pos]; } sub Prev { my( $me, $steps )= @_; $steps= 1 if ! defined $steps; my $pos= $me->Next(-$steps); $pos -= $me->[_End] if $pos; return $pos; } sub Diff { my( $me )= @_; $me->_ChkPos(); return 0 if $me->[_Same] == ( 1 & $me->[_Pos] ); my $ret= 0; my $off= $me->[_Off]; for my $seq ( 1, 2 ) { $ret |= $seq if $me->[_Idx][ $off + $seq + _Min ] < $me->[_Idx][ $off + $seq ]; } return $ret; } sub Min { my( $me, $seq, $base )= @_; $me->_ChkPos(); my $off= $me->_ChkSeq($seq); $base= $me->[_Base] if !defined $base; return $base + $me->[_Idx][ $off + _Min ]; } sub Max { my( $me, $seq, $base )= @_; $me->_ChkPos(); my $off= $me->_ChkSeq($seq); $base= $me->[_Base] if !defined $base; return $base + $me->[_Idx][ $off ] -1; } sub Range { my( $me, $seq, $base )= @_; $me->_ChkPos(); my $off = $me->_ChkSeq($seq); if( !wantarray ) { return $me->[_Idx][ $off ] - $me->[_Idx][ $off + _Min ]; } $base= $me->[_Base] if !defined $base; return ( $base + $me->[_Idx][ $off + _Min ] ) .. ( $base + $me->[_Idx][ $off ] - 1 ); } sub Items { my( $me, $seq )= @_; $me->_ChkPos(); my $off = $me->_ChkSeq($seq); if( !wantarray ) { return $me->[_Idx][ $off ] - $me->[_Idx][ $off + _Min ]; } return @{$me->[$seq]}[ $me->[_Idx][ $off + _Min ] .. ( $me->[_Idx][ $off ] - 1 ) ]; } sub Same { my( $me )= @_; $me->_ChkPos(); return wantarray ? () : 0 if $me->[_Same] != ( 1 & $me->[_Pos] ); return $me->Items(1); } my %getName; BEGIN { %getName= ( same => \&Same, diff => \&Diff, base => \&Base, min => \&Min, max => \&Max, range=> \&Range, items=> \&Items, # same thing ); } sub Get { my $me= shift @_; $me->_ChkPos(); my @value; for my $arg ( @_ ) { for my $word ( split ' ', $arg ) { my $meth; if( $word !~ /^(-?\d+)?([a-zA-Z]+)([12])?$/ || not $meth= $getName{ lc $2 } ) { Die( $Root, ", Get: Invalid request ($word)" ); } my( $base, $name, $seq )= ( $1, $2, $3 ); push @value, scalar( 4 == length($name) ? $meth->( $me ) : $meth->( $me, $seq, $base ) ); } } if( wantarray ) { return @value; } elsif( 1 == @value ) { return $value[0]; } Die( 0+@value, " values requested from ", $Root, "'s Get in scalar context" ); } my $Obj= getObjPkg($Root); no strict 'refs'; for my $meth ( qw( new getObjPkg ) ) { *{$Root."::".$meth} = \&{$meth}; *{$Obj ."::".$meth} = \&{$meth}; } for my $meth ( qw( Next Prev Reset Copy Base Diff Same Items Range Min Max Get _ChkPos _ChkSeq ) ) { *{$Obj."::".$meth} = \&{$meth}; } 1; __END__ =head1 NAME Algorithm::Diff - Compute `intelligent' differences between two files / lists =head1 SYNOPSIS require Algorithm::Diff; # This example produces traditional 'diff' output: my $diff = Algorithm::Diff->new( \@seq1, \@seq2 ); $diff->Base( 1 ); # Return line numbers, not indices while( $diff->Next() ) { next if $diff->Same(); my $sep = ''; if( ! $diff->Items(2) ) { sprintf "%d,%dd%d\n", $diff->Get(qw( Min1 Max1 Max2 )); } elsif( ! $diff->Items(1) ) { sprintf "%da%d,%d\n", $diff->Get(qw( Max1 Min2 Max2 )); } else { $sep = "---\n"; sprintf "%d,%dc%d,%d\n", $diff->Get(qw( Min1 Max1 Min2 Max2 )); } print "< $_" for $diff->Items(1); print $sep; print "> $_" for $diff->Items(2); } # Alternate interfaces: use Algorithm::Diff qw( LCS LCS_length LCSidx diff sdiff compact_diff traverse_sequences traverse_balanced ); @lcs = LCS( \@seq1, \@seq2 ); $lcsref = LCS( \@seq1, \@seq2 ); $count = LCS_length( \@seq1, \@seq2 ); ( $seq1idxref, $seq2idxref ) = LCSidx( \@seq1, \@seq2 ); # Complicated interfaces: @diffs = diff( \@seq1, \@seq2 ); @sdiffs = sdiff( \@seq1, \@seq2 ); @cdiffs = compact_diff( \@seq1, \@seq2 ); traverse_sequences( \@seq1, \@seq2, { MATCH => \&callback1, DISCARD_A => \&callback2, DISCARD_B => \&callback3, }, \&key_generator, @extra_args, ); traverse_balanced( \@seq1, \@seq2, { MATCH => \&callback1, DISCARD_A => \&callback2, DISCARD_B => \&callback3, CHANGE => \&callback4, }, \&key_generator, @extra_args, ); =head1 INTRODUCTION (by Mark-Jason Dominus) I once read an article written by the authors of C; they said that they worked very hard on the algorithm until they found the right one. I think what they ended up using (and I hope someone will correct me, because I am not very confident about this) was the `longest common subsequence' method. In the LCS problem, you have two sequences of items: a b c d f g h j q z a b c d e f g i j k r x y z and you want to find the longest sequence of items that is present in both original sequences in the same order. That is, you want to find a new sequence I which can be obtained from the first sequence by deleting some items, and from the secend sequence by deleting other items. You also want I to be as long as possible. In this case I is a b c d f g j z From there it's only a small step to get diff-like output: e h i k q r x y + - + + - + + + This module solves the LCS problem. It also includes a canned function to generate C-like output. It might seem from the example above that the LCS of two sequences is always pretty obvious, but that's not always the case, especially when the two sequences have many repeated elements. For example, consider a x b y c z p d q a b c a x b y c z A naive approach might start by matching up the C and C that appear at the beginning of each sequence, like this: a x b y c z p d q a b c a b y c z This finds the common subsequence C. But actually, the LCS is C: a x b y c z p d q a b c a x b y c z or a x b y c z p d q a b c a x b y c z =head1 USAGE (See also the README file and several example scripts include with this module.) This module now provides an object-oriented interface that uses less memory and is easier to use than most of the previous procedural interfaces. It also still provides several exportable functions. We'll deal with these in ascending order of difficulty: C, C, C, OO interface, C, C, C, C, and C. =head2 C Given references to two lists of items, LCS returns an array containing their longest common subsequence. In scalar context, it returns a reference to such a list. @lcs = LCS( \@seq1, \@seq2 ); $lcsref = LCS( \@seq1, \@seq2 ); C may be passed an optional third parameter; this is a CODE reference to a key generation function. See L. @lcs = LCS( \@seq1, \@seq2, \&keyGen, @args ); $lcsref = LCS( \@seq1, \@seq2, \&keyGen, @args ); Additional parameters, if any, will be passed to the key generation routine. =head2 C This is just like C except it only returns the length of the longest common subsequence. This provides a performance gain of about 9% compared to C. =head2 C Like C except it returns references to two arrays. The first array contains the indices into @seq1 where the LCS items are located. The second array contains the indices into @seq2 where the LCS items are located. Therefore, the following three lists will contain the same values: my( $idx1, $idx2 ) = LCSidx( \@seq1, \@seq2 ); my @list1 = @seq1[ @$idx1 ]; my @list2 = @seq2[ @$idx2 ]; my @list3 = LCS( \@seq1, \@seq2 ); =head2 C $diff = Algorithm::Diffs->new( \@seq1, \@seq2 ); $diff = Algorithm::Diffs->new( \@seq1, \@seq2, \%opts ); C computes the smallest set of additions and deletions necessary to turn the first sequence into the second and compactly records them in the object. You use the object to iterate over I, where each hunk represents a contiguous section of items which should be added, deleted, replaced, or left unchanged. =over 4 The following summary of all of the methods looks a lot like Perl code but some of the symbols have different meanings: [ ] Encloses optional arguments : Is followed by the default value for an optional argument | Separates alternate return results Method summary: $obj = Algorithm::Diff->new( \@seq1, \@seq2, [ \%opts ] ); $pos = $obj->Next( [ $count : 1 ] ); $revPos = $obj->Prev( [ $count : 1 ] ); $obj = $obj->Reset( [ $pos : 0 ] ); $copy = $obj->Copy( [ $pos, [ $newBase ] ] ); $oldBase = $obj->Base( [ $newBase ] ); Note that all of the following methods C if used on an object that is "reset" (not currently pointing at any hunk). $bits = $obj->Diff( ); @items|$cnt = $obj->Same( ); @items|$cnt = $obj->Items( $seqNum ); @idxs |$cnt = $obj->Range( $seqNum, [ $base ] ); $minIdx = $obj->Min( $seqNum, [ $base ] ); $maxIdx = $obj->Max( $seqNum, [ $base ] ); @values = $obj->Get( @names ); Passing in C for an optional argument is always treated the same as if no argument were passed in. =item C $pos = $diff->Next(); # Move forward 1 hunk $pos = $diff->Next( 2 ); # Move forward 2 hunks $pos = $diff->Next(-5); # Move backward 5 hunks C moves the object to point at the next hunk. The object starts out "reset", which means it isn't pointing at any hunk. If the object is reset, then C moves to the first hunk. C returns a true value iff the move didn't go past the last hunk. So C will return true iff the object is not reset. Actually, C returns the object's new position, which is a number between 1 and the number of hunks (inclusive), or returns a false value. =item C C is almost identical to C; it moves to the $Nth previous hunk. On a 'reset' object, C [and C] move to the last hunk. The position returned by C is relative to the I of the hunks; -1 for the last hunk, -2 for the second-to-last, etc. =item C $diff->Reset(); # Reset the object's position $diff->Reset($pos); # Move to the specified hunk $diff->Reset(1); # Move to the first hunk $diff->Reset(-1); # Move to the last hunk C returns the object, so, for example, you could use C<< $diff->Reset()->Next(-1) >> to get the number of hunks. =item C $copy = $diff->Copy( $newPos, $newBase ); C returns a copy of the object. The copy and the orignal object share most of their data, so making copies takes very little memory. The copy maintains its own position (separate from the original), which is the main purpose of copies. It also maintains its own base. By default, the copy's position starts out the same as the original object's position. But C takes an optional first argument to set the new position, so the following three snippets are equivalent: $copy = $diff->Copy($pos); $copy = $diff->Copy(); $copy->Reset($pos); $copy = $diff->Copy()->Reset($pos); C takes an optional second argument to set the base for the copy. If you wish to change the base of the copy but leave the position the same as in the original, here are two equivalent ways: $copy = $diff->Copy(); $copy->Base( 0 ); $copy = $diff->Copy(undef,0); Here are two equivalent way to get a "reset" copy: $copy = $diff->Copy(0); $copy = $diff->Copy()->Reset(); =item C $bits = $obj->Diff(); C returns a true value iff the current hunk contains items that are different between the two sequences. It actually returns one of the follow 4 values: =over 4 =item 3 C<3==(1|2)>. This hunk contains items from @seq1 and the items from @seq2 that should replace them. Both sequence 1 and 2 contain changed items so both the 1 and 2 bits are set. =item 2 This hunk only contains items from @seq2 that should be inserted (not items from @seq1). Only sequence 2 contains changed items so only the 2 bit is set. =item 1 This hunk only contains items from @seq1 that should be deleted (not items from @seq2). Only sequence 1 contains changed items so only the 1 bit is set. =item 0 This means that the items in this hunk are the same in both sequences. Neither sequence 1 nor 2 contain changed items so neither the 1 nor the 2 bits are set. =back =item C C returns a true value iff the current hunk contains items that are the same in both sequences. It actually returns the list of items if they are the same or an emty list if they aren't. In a scalar context, it returns the size of the list. =item C $count = $diff->Items(2); @items = $diff->Items($seqNum); C returns the (number of) items from the specified sequence that are part of the current hunk. If the current hunk contains only insertions, then C<< $diff->Items(1) >> will return an empty list (0 in a scalar conext). If the current hunk contains only deletions, then C<< $diff->Items(2) >> will return an empty list (0 in a scalar conext). If the hunk contains replacements, then both C<< $diff->Items(1) >> and C<< $diff->Items(2) >> will return different, non-empty lists. Otherwise, the hunk contains identical items and all of the following will return the same lists: @items = $diff->Items(1); @items = $diff->Items(2); @items = $diff->Same(); =item C $count = $diff->Range( $seqNum ); @indices = $diff->Range( $seqNum ); @indices = $diff->Range( $seqNum, $base ); C is like C except that it returns a list of I to the items rather than the items themselves. By default, the index of the first item (in each sequence) is 0 but this can be changed by calling the C method. So, by default, the following two snippets return the same lists: @list = $diff->Items(2); @list = @seq2[ $diff->Range(2) ]; You can also specify the base to use as the second argument. So the following two snippets I return the same lists: @list = $diff->Items(1); @list = @seq1[ $diff->Range(1,0) ]; =item C $curBase = $diff->Base(); $oldBase = $diff->Base($newBase); C sets and/or returns the current base (usually 0 or 1) that is used when you request range information. The base defaults to 0 so that range information is returned as array indices. You can set the base to 1 if you want to report traditional line numbers instead. =item C $min1 = $diff->Min(1); $min = $diff->Min( $seqNum, $base ); C returns the first value that C would return (given the same arguments) or returns C if C would return an empty list. =item C C returns the last value that C would return or C. =item C ( $n, $x, $r ) = $diff->Get(qw( min1 max1 range1 )); @values = $diff->Get(qw( 0min2 1max2 range2 same base )); C returns one or more scalar values. You pass in a list of the names of the values you want returned. Each name must match one of the following regexes: /^(-?\d+)?(min|max)[12]$/i /^(range[12]|same|diff|base)$/i The 1 or 2 after a name says which sequence you want the information for (and where allowed, it is required). The optional number before "min" or "max" is the base to use. So the following equalities hold: $diff->Get('min1') == $diff->Min(1) $diff->Get('0min2') == $diff->Min(2,0) Using C in a scalar context when you've passed in more than one name is a fatal error (C is called). =back =head2 C Given a reference to a list of items, C returns a reference to a hash which can be used when comparing this sequence to other sequences with C or C. $prep = prepare( \@seq1 ); for $i ( 0 .. 10_000 ) { @lcs = LCS( $prep, $seq[$i] ); # do something useful with @lcs } C may be passed an optional third parameter; this is a CODE reference to a key generation function. See L. $prep = prepare( \@seq1, \&keyGen ); for $i ( 0 .. 10_000 ) { @lcs = LCS( $seq[$i], $prep, \&keyGen ); # do something useful with @lcs } Using C provides a performance gain of about 50% when calling LCS many times compared with not preparing. =head2 C @diffs = diff( \@seq1, \@seq2 ); $diffs_ref = diff( \@seq1, \@seq2 ); C computes the smallest set of additions and deletions necessary to turn the first sequence into the second, and returns a description of these changes. The description is a list of I; each hunk represents a contiguous section of items which should be added, deleted, or replaced. (Hunks containing unchanged items are not included.) The return value of C is a list of hunks, or, in scalar context, a reference to such a list. If there are no differences, the list will be empty. Here is an example. Calling C for the following two sequences: a b c e h j l m n p b c d e f j k l m r s t would produce the following list: ( [ [ '-', 0, 'a' ] ], [ [ '+', 2, 'd' ] ], [ [ '-', 4, 'h' ], [ '+', 4, 'f' ] ], [ [ '+', 6, 'k' ] ], [ [ '-', 8, 'n' ], [ '-', 9, 'p' ], [ '+', 9, 'r' ], [ '+', 10, 's' ], [ '+', 11, 't' ] ], ) There are five hunks here. The first hunk says that the C at position 0 of the first sequence should be deleted (C<->). The second hunk says that the C at position 2 of the second sequence should be inserted (C<+>). The third hunk says that the C at position 4 of the first sequence should be removed and replaced with the C from position 4 of the second sequence. And so on. C may be passed an optional third parameter; this is a CODE reference to a key generation function. See L. Additional parameters, if any, will be passed to the key generation routine. =head2 C @sdiffs = sdiff( \@seq1, \@seq2 ); $sdiffs_ref = sdiff( \@seq1, \@seq2 ); C computes all necessary components to show two sequences and their minimized differences side by side, just like the Unix-utility I does: same same before | after old < - - > new It returns a list of array refs, each pointing to an array of display instructions. In scalar context it returns a reference to such a list. If there are no differences, the list will have one entry per item, each indicating that the item was unchanged. Display instructions consist of three elements: A modifier indicator (C<+>: Element added, C<->: Element removed, C: Element unmodified, C: Element changed) and the value of the old and new elements, to be displayed side-by-side. An C of the following two sequences: a b c e h j l m n p b c d e f j k l m r s t results in ( [ '-', 'a', '' ], [ 'u', 'b', 'b' ], [ 'u', 'c', 'c' ], [ '+', '', 'd' ], [ 'u', 'e', 'e' ], [ 'c', 'h', 'f' ], [ 'u', 'j', 'j' ], [ '+', '', 'k' ], [ 'u', 'l', 'l' ], [ 'u', 'm', 'm' ], [ 'c', 'n', 'r' ], [ 'c', 'p', 's' ], [ '+', '', 't' ], ) C may be passed an optional third parameter; this is a CODE reference to a key generation function. See L. Additional parameters, if any, will be passed to the key generation routine. =head2 C C is much like C except it returns a much more compact description consisting of just one flat list of indices. An example helps explain the format: my @a = qw( a b c e h j l m n p ); my @b = qw( b c d e f j k l m r s t ); @cdiff = compact_diff( \@a, \@b ); # Returns: # @a @b @a @b # start start values values ( 0, 0, # = 0, 0, # a ! 1, 0, # b c = b c 3, 2, # ! d 3, 3, # e = e 4, 4, # f ! h 5, 5, # j = j 6, 6, # ! k 6, 7, # l m = l m 8, 9, # n p ! r s t 10, 12, # ); The 0th, 2nd, 4th, etc. entries are all indices into @seq1 (@a in the above example) indicating where a hunk begins. The 1st, 3rd, 5th, etc. entries are all indices into @seq2 (@b in the above example) indicating where the same hunk begins. So each pair of indices (except the last pair) describes where a hunk begins (in each sequence). Since each hunk must end at the item just before the item that starts the next hunk, the next pair of indices can be used to determine where the hunk ends. So, the first 4 entries (0..3) describe the first hunk. Entries 0 and 1 describe where the first hunk begins (and so are always both 0). Entries 2 and 3 describe where the next hunk begins, so subtracting 1 from each tells us where the first hunk ends. That is, the first hunk contains items C<$diff[0]> through C<$diff[2] - 1> of the first sequence and contains items C<$diff[1]> through C<$diff[3] - 1> of the second sequence. In other words, the first hunk consists of the following two lists of items: # 1st pair 2nd pair # of indices of indices @list1 = @a[ $cdiff[0] .. $cdiff[2]-1 ]; @list2 = @b[ $cdiff[1] .. $cdiff[3]-1 ]; # Hunk start Hunk end Note that the hunks will always alternate between those that are part of the LCS (those that contain unchanged items) and those that contain changes. This means that all we need to be told is whether the first hunk is a 'same' or 'diff' hunk and we can determine which of the other hunks contain 'same' items or 'diff' items. By convention, we always make the first hunk contain unchanged items. So the 1st, 3rd, 5th, etc. hunks (all odd-numbered hunks if you start counting from 1) all contain unchanged items. And the 2nd, 4th, 6th, etc. hunks (all even-numbered hunks if you start counting from 1) all contain changed items. Since @a and @b don't begin with the same value, the first hunk in our example is empty (otherwise we'd violate the above convention). Note that the first 4 index values in our example are all zero. Plug these values into our previous code block and we get: @hunk1a = @a[ 0 .. 0-1 ]; @hunk1b = @b[ 0 .. 0-1 ]; And C<0..-1> returns the empty list. Move down one pair of indices (2..5) and we get the offset ranges for the second hunk, which contains changed items. Since C<@diff[2..5]> contains (0,0,1,0) in our example, the second hunk consists of these two lists of items: @hunk2a = @a[ $cdiff[2] .. $cdiff[4]-1 ]; @hunk2b = @b[ $cdiff[3] .. $cdiff[5]-1 ]; # or @hunk2a = @a[ 0 .. 1-1 ]; @hunk2b = @b[ 0 .. 0-1 ]; # or @hunk2a = @a[ 0 .. 0 ]; @hunk2b = @b[ 0 .. -1 ]; # or @hunk2a = ( 'a' ); @hunk2b = ( ); That is, we would delete item 0 ('a') from @a. Since C<@diff[4..7]> contains (1,0,3,2) in our example, the third hunk consists of these two lists of items: @hunk3a = @a[ $cdiff[4] .. $cdiff[6]-1 ]; @hunk3a = @b[ $cdiff[5] .. $cdiff[7]-1 ]; # or @hunk3a = @a[ 1 .. 3-1 ]; @hunk3a = @b[ 0 .. 2-1 ]; # or @hunk3a = @a[ 1 .. 2 ]; @hunk3a = @b[ 0 .. 1 ]; # or @hunk3a = qw( b c ); @hunk3a = qw( b c ); Note that this third hunk contains unchanged items as our convention demands. You can continue this process until you reach the last two indices, which will always be the number of items in each sequence. This is required so that subtracting one from each will give you the indices to the last items in each sequence. =head2 C C used to be the most general facility provided by this module (the new OO interface is more powerful and much easier to use). Imagine that there are two arrows. Arrow A points to an element of sequence A, and arrow B points to an element of the sequence B. Initially, the arrows point to the first elements of the respective sequences. C will advance the arrows through the sequences one element at a time, calling an appropriate user-specified callback function before each advance. It willadvance the arrows in such a way that if there are equal elements C<$A[$i]> and C<$B[$j]> which are equal and which are part of the LCS, there will be some moment during the execution of C when arrow A is pointing to C<$A[$i]> and arrow B is pointing to C<$B[$j]>. When this happens, C will call the C callback function and then it will advance both arrows. Otherwise, one of the arrows is pointing to an element of its sequence that is not part of the LCS. C will advance that arrow and will call the C or the C callback, depending on which arrow it advanced. If both arrows point to elements that are not part of the LCS, then C will advance one of them and call the appropriate callback, but it is not specified which it will call. The arguments to C are the two sequences to traverse, and a hash which specifies the callback functions, like this: traverse_sequences( \@seq1, \@seq2, { MATCH => $callback_1, DISCARD_A => $callback_2, DISCARD_B => $callback_3, } ); Callbacks for MATCH, DISCARD_A, and DISCARD_B are invoked with at least the indices of the two arrows as their arguments. They are not expected to return any values. If a callback is omitted from the table, it is not called. Callbacks for A_FINISHED and B_FINISHED are invoked with at least the corresponding index in A or B. If arrow A reaches the end of its sequence, before arrow B does, C will call the C callback when it advances arrow B, if there is such a function; if not it will call C instead. Similarly if arrow B finishes first. C returns when both arrows are at the ends of their respective sequences. It returns true on success and false on failure. At present there is no way to fail. C may be passed an optional fourth parameter; this is a CODE reference to a key generation function. See L. Additional parameters, if any, will be passed to the key generation function. If you want to pass additional parameters to your callbacks, but don't need a custom key generation function, you can get the default by passing undef: traverse_sequences( \@seq1, \@seq2, { MATCH => $callback_1, DISCARD_A => $callback_2, DISCARD_B => $callback_3, }, undef, # default key-gen $myArgument1, $myArgument2, $myArgument3, ); C does not have a useful return value; you are expected to plug in the appropriate behavior with the callback functions. =head2 C C is an alternative to C. It uses a different algorithm to iterate through the entries in the computed LCS. Instead of sticking to one side and showing element changes as insertions and deletions only, it will jump back and forth between the two sequences and report I occurring as deletions on one side followed immediatly by an insertion on the other side. In addition to the C, C, and C callbacks supported by C, C supports a C callback indicating that one element got C by another: traverse_balanced( \@seq1, \@seq2, { MATCH => $callback_1, DISCARD_A => $callback_2, DISCARD_B => $callback_3, CHANGE => $callback_4, } ); If no C callback is specified, C will map C events to C and C actions, therefore resulting in a similar behaviour as C with different order of events. C might be a bit slower than C, noticable only while processing huge amounts of data. The C function of this module is implemented as call to C. C does not have a useful return value; you are expected to plug in the appropriate behavior with the callback functions. =head1 KEY GENERATION FUNCTIONS Most of the functions accept an optional extra parameter. This is a CODE reference to a key generating (hashing) function that should return a string that uniquely identifies a given element. It should be the case that if two elements are to be considered equal, their keys should be the same (and the other way around). If no key generation function is provided, the key will be the element as a string. By default, comparisons will use "eq" and elements will be turned into keys using the default stringizing operator '""'. Where this is important is when you're comparing something other than strings. If it is the case that you have multiple different objects that should be considered to be equal, you should supply a key generation function. Otherwise, you have to make sure that your arrays contain unique references. For instance, consider this example: package Person; sub new { my $package = shift; return bless { name => '', ssn => '', @_ }, $package; } sub clone { my $old = shift; my $new = bless { %$old }, ref($old); } sub hash { return shift()->{'ssn'}; } my $person1 = Person->new( name => 'Joe', ssn => '123-45-6789' ); my $person2 = Person->new( name => 'Mary', ssn => '123-47-0000' ); my $person3 = Person->new( name => 'Pete', ssn => '999-45-2222' ); my $person4 = Person->new( name => 'Peggy', ssn => '123-45-9999' ); my $person5 = Person->new( name => 'Frank', ssn => '000-45-9999' ); If you did this: my $array1 = [ $person1, $person2, $person4 ]; my $array2 = [ $person1, $person3, $person4, $person5 ]; Algorithm::Diff::diff( $array1, $array2 ); everything would work out OK (each of the objects would be converted into a string like "Person=HASH(0x82425b0)" for comparison). But if you did this: my $array1 = [ $person1, $person2, $person4 ]; my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; Algorithm::Diff::diff( $array1, $array2 ); $person4 and $person4->clone() (which have the same name and SSN) would be seen as different objects. If you wanted them to be considered equivalent, you would have to pass in a key generation function: my $array1 = [ $person1, $person2, $person4 ]; my $array2 = [ $person1, $person3, $person4->clone(), $person5 ]; Algorithm::Diff::diff( $array1, $array2, \&Person::hash ); This would use the 'ssn' field in each Person as a comparison key, and so would consider $person4 and $person4->clone() as equal. You may also pass additional parameters to the key generation function if you wish. =head1 ERROR CHECKING If you pass these routines a non-reference and they expect a reference, they will die with a message. =head1 AUTHOR This version released by Tye McQueen (http://perlmonks.org/?node=tye). =head1 LICENSE Parts Copyright (c) 2000-2004 Ned Konz. All rights reserved. Parts by Tye McQueen. This program is free software; you can redistribute it and/or modify it under the same terms as Perl. =head1 MAILING LIST Mark-Jason still maintains a mailing list. To join a low-volume mailing list for announcements related to diff and Algorithm::Diff, send an empty mail message to mjd-perl-diff-request@plover.com. =head1 CREDITS Versions through 0.59 (and much of this documentation) were written by: Mark-Jason Dominus, mjd-perl-diff@plover.com This version borrows some documentation and routine names from Mark-Jason's, but Diff.pm's code was completely replaced. This code was adapted from the Smalltalk code of Mario Wolczko , which is available at ftp://st.cs.uiuc.edu/pub/Smalltalk/MANCHESTER/manchester/4.0/diff.st C and C were written by Mike Schilli . The algorithm is that described in I, CACM, vol.20, no.5, pp.350-353, May 1977, with a few minor improvements to improve the speed. Much work was done by Ned Konz (perl@bike-nomad.com). The OO interface and some other changes are by Tye McQueen. =cut syncevolution-1.5/test/testcases/0000755000373300037200000000000012424707640020657 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/lcs/0000755000373300037200000000000012424707640021440 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/lcs/file1.txt0000644000373300001540000000002012326412404023003 0ustar00nightlynightly00000000000000begin item1 end syncevolution-1.5/test/testcases/lcs/file2.txt0000644000373300001540000000004012326412404023006 0ustar00nightlynightly00000000000000begin item2 end begin item1 end syncevolution-1.5/test/testcases/synctests/0000755000373300037200000000000012424707640022716 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/apple/0000755000373300037200000000000012424707640024017 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/apple/eds_contact/0000755000373300037200000000000012424707640026305 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testDownload/0000755000373300037200000000000012424707641030755 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testDownload/modify-local0000775000373300001540000000051712336456617033117 0ustar00nightlynightly00000000000000#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) for i in $IN/*; do perl -e '$_ = join("", <>); if (1) {' \ -e 's/END:VCARD/EMAIL:new local email\r\nEND:VCARD/;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testDownload/local0000664000373300001540000000017612336456617031630 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 FN:simple contact N:contact;simple;;; UID:foo-bar-1234 X-EVOLUTION-FILE-AS:contact\, simple END:VCARD syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testDownload/remote0000664000373300001540000000013112336456617032020 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 FN:simple contact N:contact;simple;;; UID:foo-bar-1234 END:VCARD syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testDownload/remote-synced0000664000373300001540000000022412336456617033306 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 FN:simple contact N:contact;simple;;; UID:foo-bar-1234 EMAIL:new local email X-EVOLUTION-FILE-AS:contact\, simple END:VCARD syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testUpload/0000755000373300037200000000000012424707641030432 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testUpload/local-synced0000664000373300001540000000022512336456617032563 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 FN:simple contact N:contact;simple;;; UID:foo-bar-1234 EMAIL:new remote email X-EVOLUTION-FILE-AS:contact\, simple END:VCARD syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testUpload/local0000664000373300001540000000017612336456617031305 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 FN:simple contact N:contact;simple;;; UID:foo-bar-1234 X-EVOLUTION-FILE-AS:contact\, simple END:VCARD syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testUpload/modify-remote0000775000373300001540000000052012336456617032767 0ustar00nightlynightly00000000000000#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) for i in $IN/*; do perl -e '$_ = join("", <>); if (1) {' \ -e 's/END:VCARD/EMAIL:new remote email\r\nEND:VCARD/;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete syncevolution-1.5/test/testcases/synctests/apple/eds_contact/testUpload/remote0000664000373300001540000000017612336456617031506 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 FN:simple contact N:contact;simple;;; UID:foo-bar-1234 X-EVOLUTION-FILE-AS:contact\, simple END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/0000755000373300037200000000000012424707640025731 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/0000755000373300037200000000000012424707640030217 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testDownload/0000755000373300037200000000000012424707641032667 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testDownload/modify-local0000775000373300001540000000051712336456617035031 0ustar00nightlynightly00000000000000#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) for i in $IN/*; do perl -e '$_ = join("", <>); if (1) {' \ -e 's/END:VCARD/EMAIL:new local email\r\nEND:VCARD/;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testDownload/local0000664000373300001540000000546712336456617033552 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 UID:pas-id-5363657E0000002F PRODID:-//Synthesis AG//NONSGML SyncML Engine V3.4.0.47//EN REV:20140502T092918Z N:Doe;John;1;Mr.;Sr. FN:Mr. John 1 Doe Sr. X-EVOLUTION-FILE-AS:Doe\, John NICKNAME:Johnny TITLE:tester ORG:at company;;; TEL;TYPE=WORK,VOICE:business 1 TEL;TYPE=CELL:mobile TEL;TYPE=HOME,VOICE:home TEL:main TEL;TYPE=WORK,FAX:work fax TEL;TYPE=HOME,FAX:home fax TEL;TYPE=PAGER:pager TEL;X-ABLabel="Google Voice":google voice TEL;X-ABLabel="custom-label4":custom EMAIL;TYPE=HOME:john.doe@home.com EMAIL;TYPE=WORK:doe@work.com EMAIL;X-ABLabel="custom-label2":john@custom.com URL;X-ABLabel=Profile:http://profile.com URL;X-ABLabel=Blog:http://blog.com URL;X-ABLabel=HomePage:http://homepage.com URL;X-ABLabel=Work:http://company.com URL;X-ABLabel="Custom-label6 Backslash ":http://custom.com X-EVOLUTION-MANAGER:manager X-EVOLUTION-ASSISTANT:assistant X-ABRELATEDNAMES;X-ABLabel=Child:child X-ABRELATEDNAMES;X-ABLabel=Mother:mother X-ABRELATEDNAMES;X-ABLabel=Father:father X-ABRELATEDNAMES;X-ABLabel=Parent:parent X-ABRELATEDNAMES;X-ABLabel=Brother:brother X-ABRELATEDNAMES;X-ABLabel=Sister:sister X-ABRELATEDNAMES;X-ABLabel=Friend:friend X-ABRELATEDNAMES;X-ABLabel=relative:relative X-ABRELATEDNAMES;X-ABLabel="referred-by-label":referred-by X-ABRELATEDNAMES;X-ABLabel=Partner:partner X-ABRELATEDNAMES;X-ABLabel="domestic-partner-label":domestic partner X-ABRELATEDNAMES;X-ABLabel="custom-label5 Umlaut ä Semicolon ; Backslash \ newline tab end of label":custom relationship X-EVOLUTION-SPOUSE:spouse X-EVOLUTION-ANNIVERSARY:19710101 X-ABDATE;X-ABLabel="custom-label3":20000201 IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ IMPP;X-SERVICE-TYPE="Chat-label":x-apple:custom%20chat X-AIM:aim X-ICQ:ICQ X-YAHOO:yahoo X-SKYPE:skype X-MSN:MSN X-JABBER:Jabber X-MOZILLA-HTML:FALSE ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country ADR;TYPE=WORK:;;work address;;;; ADR:;;custom address;;;; BDAY:19701230 NOTE:A test contact. PHOTO;TYPE=png;ENCODING=b:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBOQA AAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu0tcU RAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWPsAU6wP xHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6THlejbWSt0 Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkFjQX9g5e4yk GUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOcBHcEv7FvyN8x xqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdNowXWEQlOBXMYyI 4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV8E5iEvxPDjv8CyVa xQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC X-PHONETIC-FIRST-NAME:John X-PHONETIC-LAST-NAME:Doe END:VCARDsyncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testDownload/remote0000664000373300001540000000707012336456617033743 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 N:Doe;John;1;Mr.;Sr. FN:Mr. John 1 Doe Sr. NICKNAME:Johnny TITLE:tester ORG:at company REV:2014-04-11T08:43:42Z UID:6f354d698b7ccd22 BDAY;VALUE=DATE:1970-12-30 ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country ADR;TYPE=WORK:;;work address;;;; ADR:;;custom address;;;; TEL;TYPE=WORK:business 1 TEL;TYPE=CELL:mobile TEL;TYPE=HOME:home TEL:main TEL;TYPE=FAX,WORK:work fax TEL;TYPE=FAX,HOME:home fax item14.TEL:google voice TEL;TYPE=PAGER:pager item15.TEL:custom EMAIL;TYPE=HOME,PREF:john.doe@home.com EMAIL;TYPE=WORK:doe@work.com item2.EMAIL:john@custom.com NOTE:A test contact. PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu 0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV 8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC item5.IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk item6.IMPP;X-SERVICE-TYPE=AIM:aim:aim item7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:yahoo item8.IMPP;X-SERVICE-TYPE=Skype:skype:skype item9.IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ item10.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN item11.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ item12.IMPP;X-SERVICE-TYPE=Jabber:xmpp:Jabber item13.IMPP;X-SERVICE-TYPE=chat-label:x-apple:custom%20chat X-EVOLUTION-FILE-AS:Doe\, John X-MOZILLA-HTML:FALSE X-PHONETIC-FIRST-NAME:John X-PHONETIC-LAST-NAME:Doe item2.X-ABLabel:custom-label2 item3.X-ABDATE:1971-01-01 item3.X-ABLabel:Anniversary item4.X-ABDATE:2000-02-01 item4.X-ABLabel:custom-label3 item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABLabel:Other item12.X-ABLabel:Other item13.X-ABLabel:Other item14.X-ABLabel:Google Voice item15.X-ABLabel:custom-label4 item16.X-ABRELATEDNAMES:spouse item16.X-ABLabel:Spouse item17.X-ABRELATEDNAMES:child item17.X-ABLabel:Child item18.X-ABRELATEDNAMES:mother item18.X-ABLabel:Mother item19.X-ABRELATEDNAMES:father item19.X-ABLabel:Father item20.X-ABRELATEDNAMES:parent item20.X-ABLabel:Parent item21.X-ABRELATEDNAMES:brother item21.X-ABLabel:Brother item22.X-ABRELATEDNAMES:sister item22.X-ABLabel:Sister item23.X-ABRELATEDNAMES:friend item23.X-ABLabel:Friend item24.X-ABRELATEDNAMES:relative item24.X-ABLabel:relative item25.X-ABRELATEDNAMES:manager item25.X-ABLabel:Manager item26.X-ABRELATEDNAMES:assistant item26.X-ABLabel:Assistant item27.X-ABRELATEDNAMES:referred-by item27.X-ABLabel:referred-by-label item28.X-ABRELATEDNAMES:partner item28.X-ABLabel:Partner item29.X-ABRELATEDNAMES:domestic partner item29.X-ABLabel:domestic-partner-label item30.X-ABRELATEDNAMES:custom relationship item30.X-ABLabel:custom-label5\nUmlaut ä\nSemicolon \; Backslash \\ newline \n tab end of label item31.URL:http\://profile.com item31.X-ABLabel:Profile item32.URL:http\://blog.com item32.X-ABLabel:Blog item33.URL:http\://homepage.com item33.X-ABLabel:HomePage item34.URL:http\://company.com item34.X-ABLabel:Work item35.URL:http\://custom.com item35.X-ABLabel:Custom-label6 Backslash \\ END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testDownload/remote-synced0000664000373300001540000000710412336456617035224 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 N:Doe;John;1;Mr.;Sr. FN:Mr. John 1 Doe Sr. NICKNAME:Johnny TITLE:tester ORG:at company REV:2014-04-11T08:43:42Z UID:6f354d698b7ccd22 BDAY;VALUE=DATE:19701230 ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country ADR;TYPE=WORK:;;work address;;;; ADR:;;custom address;;;; TEL;TYPE=WORK:business 1 TEL;TYPE=CELL:mobile TEL;TYPE=HOME:home TEL:main TEL;TYPE=FAX,WORK:work fax TEL;TYPE=FAX,HOME:home fax item14.TEL:google voice TEL;TYPE=PAGER:pager item15.TEL:custom EMAIL;TYPE=HOME,PREF:john.doe@home.com EMAIL;TYPE=WORK:doe@work.com item2.EMAIL:john@custom.com EMAIL:new local email NOTE:A test contact. PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu 0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV 8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC item5.IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk item6.IMPP;X-SERVICE-TYPE=AIM:aim:aim item7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:yahoo item8.IMPP;X-SERVICE-TYPE=Skype:skype:skype item9.IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ item10.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN item11.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ item12.IMPP;X-SERVICE-TYPE=Jabber:xmpp:Jabber item13.IMPP;X-SERVICE-TYPE=Chat-label:x-apple:custom%20chat X-EVOLUTION-FILE-AS:Doe\, John X-MOZILLA-HTML:FALSE X-PHONETIC-FIRST-NAME:John X-PHONETIC-LAST-NAME:Doe item2.X-ABLabel:custom-label2 item3.X-ABDATE:1971-01-01 item3.X-ABLabel:Anniversary item4.X-ABDATE:20000201 item4.X-ABLabel:custom-label3 item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABLabel:Other item12.X-ABLabel:Other item13.X-ABLabel:Other item14.X-ABLabel:Google Voice item15.X-ABLabel:custom-label4 item16.X-ABRELATEDNAMES:spouse item16.X-ABLabel:Spouse item17.X-ABRELATEDNAMES:child item17.X-ABLabel:Child item18.X-ABRELATEDNAMES:mother item18.X-ABLabel:Mother item19.X-ABRELATEDNAMES:father item19.X-ABLabel:Father item20.X-ABRELATEDNAMES:parent item20.X-ABLabel:Parent item21.X-ABRELATEDNAMES:brother item21.X-ABLabel:Brother item22.X-ABRELATEDNAMES:sister item22.X-ABLabel:Sister item23.X-ABRELATEDNAMES:friend item23.X-ABLabel:Friend item24.X-ABRELATEDNAMES:relative item24.X-ABLabel:relative item25.X-ABRELATEDNAMES:manager item25.X-ABLabel:Manager item26.X-ABRELATEDNAMES:assistant item26.X-ABLabel:Assistant item27.X-ABRELATEDNAMES:referred-by item27.X-ABLabel:referred-by-label item28.X-ABRELATEDNAMES:partner item28.X-ABLabel:Partner item29.X-ABRELATEDNAMES:domestic partner item29.X-ABLabel:domestic-partner-label item30.X-ABRELATEDNAMES:custom relationship item30.X-ABLabel:custom-label5 Umlaut ä Semicolon \; Backslash \\ newline tab end of label item31.URL:http\://profile.com item31.X-ABLabel:Profile item32.URL:http\://blog.com item32.X-ABLabel:Blog item33.URL:http\://homepage.com item33.X-ABLabel:HomePage item34.URL:http\://company.com item34.X-ABLabel:Work item35.URL:http\://custom.com item35.X-ABLabel:Custom-label6 Backslash END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/0000755000373300037200000000000012424707641034156 5ustar00nightlyallusers00000000000000modify-local0000775000373300001540000000101212424466461036224 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) for i in $IN/*; do # Modify second and third contact by changing a field. # The second contact will also get modified locally. perl -e '$_ = join("", <>); if (/John [23] Doe/) {' \ -e 's/primary 8/primary 8xx/;' \ -e 's/END:VCARD/BDAY:2006-01-01\r\nEMAIL:new local email\r\nEND:VCARD/;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete local-synced0000664000373300001540000002347212424466461036235 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWinsBEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 1 Doe N:Doe;John;1;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL;TYPE=OTHER:john.doe@other.world EMAIL;TYPE=OTHER:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice:business 1 TEL;TYPE=homE;TYPE=VOICE:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=WORK;TYPE=FAX:businessfax 4 TEL;TYPE=HOME;TYPE=FAX:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx X-AIM:AIM JOHN X-YAHOO:YAHOO JDOE X-ICQ:ICQ JD X-GROUPWISE:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= TEL;TYPE=HOME:new remote tel 1 TEL;X-ABLabel=new-remote-tel-label:new remote tel 2 EMAIL;X-ABLabel=new-remote-email-label:new remote email 1 EMAIL;TYPE=HOME:new remote email 2 X-ABDATE;X-ABLabel=date-label-2014:2014-01-01 URL;X-ABLabel=example-url-label:http://www.example.com/foobar X-AIM:new-aim X-GADUGADU:new-gadugadu X-GROUPWISE:new-groupwise X-ICQ:new-icq X-JABBER:new-jabber X-MSN:new-MSN X-YAHOO:new-yahoo X-SKYPE:new-skype X-SIP:new-sip IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc X-ABRELATEDNAMES;X-ABLabel=cousin:new person ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-01 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 2 Doe N:Doe;John;2;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000002 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world EMAIL:new local email TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8xx X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== TEL;TYPE=HOME:new remote tel 1 TEL;X-ABLabel=new-remote-tel-label:new remote tel 2 EMAIL;X-ABLabel=new-remote-email-label:new remote email 1 EMAIL;TYPE=HOME:new remote email 2 X-ABDATE;X-ABLabel=date-label-2014:2014-01-01 URL;X-ABLabel=example-url-label:http://www.example.com/foobar X-AIM:new-aim X-GADUGADU:new-gadugadu X-GROUPWISE:new-groupwise X-ICQ:new-icq X-JABBER:new-jabber X-MSN:new-MSN X-YAHOO:new-yahoo X-SKYPE:new-skype X-SIP:new-sip IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc X-ABRELATEDNAMES;X-ABLabel=cousin:new person ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 3 Doe N:Doe;John;3;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000003 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world EMAIL:new local email TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8xx X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== BDAY:2006-01-01 END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/local0000664000373300001540000002156312336456617035034 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 1 Doe N:Doe;John;1;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 2 Doe N:Doe;John;2;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000002 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 3 Doe N:Doe;John;3;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000003 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD modify-remote0000775000373300001540000000472112424466461036437 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) # TODO: X-SERVICE-TYPE, one for each kind, etc. for i in $IN/*; do # Modify first and second contact by changing a field. # The second contact will also get modified locally. # We add a new BDAY property here, too, that will be added to # the local side during the merge by the engine, and # new array entries, that need special handling by the merge script. # # Each -e generates a line break, so no \n is necessary inside the expanded vCard. perl -e '$_ = join("", <>); if (/John [12] Doe/) {' \ -e 's/primary 8/primary 8xx/;' \ -e 's!END:VCARD!BDAY:2006-01-08\r' \ -e 'TEL;TYPE=HOME:new remote tel 1\r' \ -e 'tel2.TEL:new remote tel 2\r' \ -e 'tel2.X-ABLabel:new-remote-tel-label\r' \ -e 'email1.EMAIL:new remote email 1\r' \ -e 'email1.X-ABLabel:new-remote-email-label\r' \ -e 'EMAIL;TYPE=HOME:new remote email 2\r' \ -e 'date1.X-ABDATE:2014-01-01\r' \ -e 'date1.X-ABLabel:date-label-2014\r' \ -e 'url1.URL:http\\://www.example.com/foobar\r' \ -e 'url1.X-ABLabel:example-url-label\r' \ -e 'impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim\r' \ -e 'impp1.X-ABLabel:Other\r' \ -e 'impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu\r' \ -e 'impp2.X-ABLabel:Other\r' \ -e 'impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise\r' \ -e 'impp3.X-ABLabel:Other\r' \ -e 'impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq\r' \ -e 'impp4.X-ABLabel:Other\r' \ -e 'impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber\r' \ -e 'impp5.X-ABLabel:Other\r' \ -e 'impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN\r' \ -e 'impp6.X-ABLabel:Other\r' \ -e 'impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo\r' \ -e 'impp7.X-ABLabel:Other\r' \ -e 'impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype\r' \ -e 'impp8.X-ABLabel:Other\r' \ -e 'impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip\r' \ -e 'impp9.X-ABLabel:Other\r' \ -e 'impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc\r' \ -e 'impp10.X-ABLabel:Other\r' \ -e 'name1.X-ABRELATEDNAMES:new person\r' \ -e 'name1.X-ABLabel:cousin\r' \ -e 'ADR;TYPE=WORK:box;;street;town;county;12346;country\r' \ -e 'END:VCARD!;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete remote-synced0000664000373300001540000002710312424466461036431 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWinsBEGIN:VCARD VERSION:3.0 N:Doe;John;1;; FN:John 1 Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 BDAY;VALUE=DATE:2006-01-08 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other TEL;TYPE=HOME:new remote tel 1 tel2.TEL:new remote tel 2 tel2.X-ABLabel:new-remote-tel-label email1.EMAIL:new remote email 1 email1.X-ABLabel:new-remote-email-label EMAIL;TYPE=HOME:new remote email 2 date1.X-ABDATE:2014-01-01 date1.X-ABLabel:date-label-2014 url1.URL:http\://www.example.com/foobar url1.X-ABLabel:example-url-label impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim impp1.X-ABLabel:Other impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu impp2.X-ABLabel:Other impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise impp3.X-ABLabel:Other impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq impp4.X-ABLabel:Other impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber impp5.X-ABLabel:Other impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN impp6.X-ABLabel:Other impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo impp7.X-ABLabel:Other impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype impp8.X-ABLabel:Other impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip impp9.X-ABLabel:Other impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc impp10.X-ABLabel:Other name1.X-ABRELATEDNAMES:new person name1.X-ABLabel:cousin ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 N:Doe;John;2;; FN:John 2 Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 BDAY;VALUE=DATE:2006-01-01 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world EMAIL:new local email NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other TEL;TYPE=HOME:new remote tel 1 tel2.TEL:new remote tel 2 tel2.X-ABLabel:new-remote-tel-label email1.EMAIL:new remote email 1 email1.X-ABLabel:new-remote-email-label EMAIL;TYPE=HOME:new remote email 2 date1.X-ABDATE:2014-01-01 date1.X-ABLabel:date-label-2014 url1.URL:http\://www.example.com/foobar url1.X-ABLabel:example-url-label impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim impp1.X-ABLabel:Other impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu impp2.X-ABLabel:Other impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise impp3.X-ABLabel:Other impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq impp4.X-ABLabel:Other impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber impp5.X-ABLabel:Other impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN impp6.X-ABLabel:Other impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo impp7.X-ABLabel:Other impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype impp8.X-ABLabel:Other impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip impp9.X-ABLabel:Other impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc impp10.X-ABLabel:Other name1.X-ABRELATEDNAMES:new person name1.X-ABLabel:cousin ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 N:Doe;John;3;; FN:John 3 Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world EMAIL:new local email NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other BDAY:2006-01-01 END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/0000755000373300037200000000000012424707641034357 5ustar00nightlyallusers00000000000000modify-local0000775000373300001540000000106312424466461036433 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) for i in $IN/*; do # Modify second and third contact by changing a field. # The second contact will also get modified locally. # Add a different BDAY than the peer. perl -e '$_ = join("", <>); if (/John [23] Doe/) {' \ -e 's/primary 8/primary 8xx/;' \ -e 's/END:VCARD/BDAY:2006-01-01\r\nEMAIL:new local email\r\nEND:VCARD/;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete local-synced0000664000373300001540000002302312424466461036426 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWinsBEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 1 Doe N:Doe;John;1;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL;TYPE=OTHER:john.doe@other.world EMAIL;TYPE=OTHER:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice:business 1 TEL;TYPE=homE;TYPE=VOICE:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=WORK;TYPE=FAX:businessfax 4 TEL;TYPE=HOME;TYPE=FAX:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx X-AIM:AIM JOHN X-YAHOO:YAHOO JDOE X-ICQ:ICQ JD X-GROUPWISE:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= TEL;TYPE=HOME:new remote tel 1 TEL;X-ABLabel=new-remote-tel-label:new remote tel 2 EMAIL;X-ABLabel=new-remote-email-label:new remote email 1 EMAIL;TYPE=HOME:new remote email 2 X-ABDATE;X-ABLabel=date-label-2014:2014-01-01 URL;X-ABLabel=example-url-label:http://www.example.com/foobar X-AIM:new-aim X-GADUGADU:new-gadugadu X-GROUPWISE:new-groupwise X-ICQ:new-icq X-JABBER:new-jabber X-MSN:new-MSN X-YAHOO:new-yahoo X-SKYPE:new-skype X-SIP:new-sip IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc X-ABRELATEDNAMES;X-ABLabel=cousin:new person ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 2 Doe N:Doe;John;2;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000002 EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL;TYPE=OTHER:john.doe@other.world EMAIL;TYPE=OTHER:john.doe@yet.another.world EMAIL:new local email TEL;TYPE=work;TYPE=Voice:business 1 TEL;TYPE=homE;TYPE=VOICE:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=WORK;TYPE=FAX:businessfax 4 TEL;TYPE=HOME;TYPE=FAX:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx X-AIM:AIM JOHN X-YAHOO:YAHOO JDOE X-ICQ:ICQ JD X-GROUPWISE:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= TEL;TYPE=HOME:new remote tel 1 TEL;X-ABLabel=new-remote-tel-label:new remote tel 2 EMAIL;X-ABLabel=new-remote-email-label:new remote email 1 EMAIL;TYPE=HOME:new remote email 2 X-ABDATE;X-ABLabel=date-label-2014:2014-01-01 URL;X-ABLabel=example-url-label:http://www.example.com/foobar X-AIM:new-aim X-GADUGADU:new-gadugadu X-GROUPWISE:new-groupwise X-ICQ:new-icq X-JABBER:new-jabber X-MSN:new-MSN X-YAHOO:new-yahoo X-SKYPE:new-skype X-SIP:new-sip IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc X-ABRELATEDNAMES;X-ABLabel=cousin:new person ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 3 Doe N:Doe;John;3;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000003 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world EMAIL:new local email TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8xx X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== BDAY:2006-01-01 END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/local0000664000373300001540000002156312336456617035235 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 1 Doe N:Doe;John;1;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 2 Doe N:Doe;John;2;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000002 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John 3 Doe N:Doe;John;3;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000003 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD modify-remote0000775000373300001540000000472112424466461036640 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) # TODO: X-SERVICE-TYPE, one for each kind, etc. for i in $IN/*; do # Modify first and second contact by changing a field. # The second contact will also get modified locally. # We add a new BDAY property here, too, that will be added to # the local side during the merge by the engine, and # new array entries, that need special handling by the merge script. # # Each -e generates a line break, so no \n is necessary inside the expanded vCard. perl -e '$_ = join("", <>); if (/John [12] Doe/) {' \ -e 's/primary 8/primary 8xx/;' \ -e 's!END:VCARD!BDAY:2006-01-08\r' \ -e 'TEL;TYPE=HOME:new remote tel 1\r' \ -e 'tel2.TEL:new remote tel 2\r' \ -e 'tel2.X-ABLabel:new-remote-tel-label\r' \ -e 'email1.EMAIL:new remote email 1\r' \ -e 'email1.X-ABLabel:new-remote-email-label\r' \ -e 'EMAIL;TYPE=HOME:new remote email 2\r' \ -e 'date1.X-ABDATE:2014-01-01\r' \ -e 'date1.X-ABLabel:date-label-2014\r' \ -e 'url1.URL:http\\://www.example.com/foobar\r' \ -e 'url1.X-ABLabel:example-url-label\r' \ -e 'impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim\r' \ -e 'impp1.X-ABLabel:Other\r' \ -e 'impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu\r' \ -e 'impp2.X-ABLabel:Other\r' \ -e 'impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise\r' \ -e 'impp3.X-ABLabel:Other\r' \ -e 'impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq\r' \ -e 'impp4.X-ABLabel:Other\r' \ -e 'impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber\r' \ -e 'impp5.X-ABLabel:Other\r' \ -e 'impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN\r' \ -e 'impp6.X-ABLabel:Other\r' \ -e 'impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo\r' \ -e 'impp7.X-ABLabel:Other\r' \ -e 'impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype\r' \ -e 'impp8.X-ABLabel:Other\r' \ -e 'impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip\r' \ -e 'impp9.X-ABLabel:Other\r' \ -e 'impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc\r' \ -e 'impp10.X-ABLabel:Other\r' \ -e 'name1.X-ABRELATEDNAMES:new person\r' \ -e 'name1.X-ABLabel:cousin\r' \ -e 'ADR;TYPE=WORK:box;;street;town;county;12346;country\r' \ -e 'END:VCARD!;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete remote-synced0000664000373300001540000002710312424466461036632 0ustar00nightlynightly00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWinsBEGIN:VCARD VERSION:3.0 N:Doe;John;1;; FN:John 1 Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 BDAY;VALUE=DATE:2006-01-08 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other TEL;TYPE=HOME:new remote tel 1 tel2.TEL:new remote tel 2 tel2.X-ABLabel:new-remote-tel-label email1.EMAIL:new remote email 1 email1.X-ABLabel:new-remote-email-label EMAIL;TYPE=HOME:new remote email 2 date1.X-ABDATE:2014-01-01 date1.X-ABLabel:date-label-2014 url1.URL:http\://www.example.com/foobar url1.X-ABLabel:example-url-label impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim impp1.X-ABLabel:Other impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu impp2.X-ABLabel:Other impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise impp3.X-ABLabel:Other impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq impp4.X-ABLabel:Other impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber impp5.X-ABLabel:Other impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN impp6.X-ABLabel:Other impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo impp7.X-ABLabel:Other impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype impp8.X-ABLabel:Other impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip impp9.X-ABLabel:Other impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc impp10.X-ABLabel:Other name1.X-ABRELATEDNAMES:new person name1.X-ABLabel:cousin ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 N:Doe;John;2;; FN:John 2 Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 BDAY;VALUE=DATE:2006-01-08 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world EMAIL:new local email NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other TEL;TYPE=HOME:new remote tel 1 tel2.TEL:new remote tel 2 tel2.X-ABLabel:new-remote-tel-label email1.EMAIL:new remote email 1 email1.X-ABLabel:new-remote-email-label EMAIL;TYPE=HOME:new remote email 2 date1.X-ABDATE:2014-01-01 date1.X-ABLabel:date-label-2014 url1.URL:http\://www.example.com/foobar url1.X-ABLabel:example-url-label impp1.IMPP;X-SERVICE-TYPE=AIM:aim:new-aim impp1.X-ABLabel:Other impp2.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:new-gadugadu impp2.X-ABLabel:Other impp3.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:new-groupwise impp3.X-ABLabel:Other impp4.IMPP;X-SERVICE-TYPE=ICQ:aim:new-icq impp4.X-ABLabel:Other impp5.IMPP;X-SERVICE-TYPE=Jabber:xmpp:new-jabber impp5.X-ABLabel:Other impp6.IMPP;X-SERVICE-TYPE=MSN:msnim:new-MSN impp6.X-ABLabel:Other impp7.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:new-yahoo impp7.X-ABLabel:Other impp8.IMPP;X-SERVICE-TYPE=Skype:skype:new-skype impp8.X-ABLabel:Other impp9.IMPP;X-SERVICE-TYPE=Sip:x-apple:new-sip impp9.X-ABLabel:Other impp10.IMPP;X-SERVICE-TYPE=Abc:x-apple:new-abc impp10.X-ABLabel:Other name1.X-ABRELATEDNAMES:new person name1.X-ABLabel:cousin ADR;TYPE=WORK:box;;street;town;county;12346;country END:VCARD BEGIN:VCARD VERSION:3.0 N:Doe;John;3;; FN:John 3 Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8xx EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world EMAIL:new local email NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other BDAY:2006-01-01 END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpload/0000755000373300037200000000000012424707641032344 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpload/local-synced0000644000373300001540000000543212360740724034470 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing\, test#1 X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;;; X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL;TYPE=OTHER:john.doe@other.world EMAIL;TYPE=OTHER:john.doe@yet.another.world EMAIL:new remote email TEL;TYPE=work;TYPE=Voice:business 1 TEL;TYPE=homE;TYPE=VOICE:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=WORK;TYPE=FAX:businessfax 4 TEL;TYPE=HOME;TYPE=FAX:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8 X-AIM:AIM JOHN X-YAHOO:YAHOO JDOE X-ICQ:ICQ JD X-GROUPWISE:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpload/local0000664000373300001540000000621212336456617033214 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing;test#1 ROLE:professional test case X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;;; X-EVOLUTION-FILE-AS:Doe\, John CATEGORIES:TEST X-EVOLUTION-BLOG-URL:web log GEO:30.12;-130.34 CALURI:calender FBURL:free/busy X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpload/modify-remote0000775000373300001540000000052012336456617034701 0ustar00nightlynightly00000000000000#! /bin/sh set -ex IN=$1 OUT=$2 rm -rf $OUT mkdir $OUT [ -d $IN ] || (echo >&2 "$IN not a directory"; false) for i in $IN/*; do perl -e '$_ = join("", <>); if (1) {' \ -e 's/END:VCARD/EMAIL:new remote email\r\nEND:VCARD/;' \ -e 'print;' \ -e '}' \ <$i >$OUT/$(basename $i) done find $OUT -size 0 -delete syncevolution-1.5/test/testcases/synctests/googlecontacts/eds_contact/testUpload/remote0000644000373300001540000000612412360740724033405 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 N:Doe;John;;; FN:John Doe NICKNAME:user1 TITLE:Senior Tester ORG:Test Inc.;Testing\, test#1 REV:2014-05-07T11:26:32Z UID:33a304690a6719e0 BDAY;VALUE=DATE:2006-01-08 ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia ADR;TYPE=OTHER:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;Ne w Testonia TEL;TYPE=WORK:business 1 TEL;TYPE=HOME:home 2 TEL;TYPE=CELL:mobile 3 TEL;TYPE=FAX,WORK:businessfax 4 TEL;TYPE=FAX,HOME:homefax 5 TEL;TYPE=PAGER:pager 6 TEL;TYPE=CAR:car 7 TEL;TYPE=PREF:primary 8 EMAIL;TYPE=WORK:john.doe@work.com EMAIL;TYPE=HOME:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world NOTE:This is a test case which uses almost all Evolution fields. PHOTO;ENCODING=B:/9j/4AAQSkZJRgABAQEASABIAAD/4QBgRXhpZgAASUkqAAgAAAACADEBAg AHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAkA AAAA6AEAAEAAAAXAAAAAAAAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8R ERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4 eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIABcAJAMBIg ACEQEDEQH/xAAZAAEAAwEBAAAAAAAAAAAAAAAABgcIBAX/xAAyEAABAgUDAgMECwAAAAAAAAABA gQAAwUGEQcSIRMxFBUiCBYzQRgkR1FWd5alw9Pj/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/EABQR AQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/ALl+lHoT+Of2l7/TEz0y1SsTUrzD3Krvmvl 3S8X9Unyen1N+z4qE5zsX2zjHPyiGe1P9lX5k0f8Amipbuvm5bv1Iu9s8VrVJplDq02lsJFg09P RT0eCufOzla1H1bCMBJTzzwGwI8a9rpoVl2w7ua5n3gKSz2eIcdJczZvWlCfSgFRypSRwD3+6Mz y6lrfcumdBDxpqCzY06uPGtYmsmyWFedshLQprOSiZgE+tSV7SclHckExHNVpTKpezdf6Geo2oF WVRX1MmT6RcuZb1nMVO2dNwVJBmS1ialYT2C5CCDwRAbUhFMjQLIyNatZv1T/lCAsC/7KpV6e7/ mjh7J8hrbattfDLSnfPkbtiV7knKDuOQMHtgiIvemiltXFcrm5GFcuq06s9CfGubdqqmZdFIwDM GCknHzwCfnCEBxz9A7YVRWjFrdF8MXrZzOdCrNq7MS+mTJyZSZm+YQQQRIlcYwNvHc56qPoXZLG 0Lktx7OrVbTc3TNWf1R+ZztwZfwiZmByg8p4798whAeay0DaNGyG8nVjVsSpY2y0C6FpCEjgJAS gAAQhCA//9k= item2.IMPP;X-SERVICE-TYPE=AIM:aim:AIM%20JOHN item3.IMPP;X-SERVICE-TYPE=Gadugadu:x-apple:GADUGADU%20DOE item4.IMPP;X-SERVICE-TYPE=Groupwise:x-apple:GROUPWISE%20DOE item5.IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ%20JD item6.IMPP;X-SERVICE-TYPE=Jabber:xmpp:JABBER%20DOE item7.IMPP;X-SERVICE-TYPE=MSN:msnim:MSN%20DOE item8.IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:YAHOO%20JDOE item9.IMPP;X-SERVICE-TYPE=Skype:skype:SKYPE%20DOE item10.IMPP;X-SERVICE-TYPE=Sip:x-apple:SIP%20DOE X-EVOLUTION-FILE-AS:Doe\, John X-EVOLUTION-BLOG-URL:web log X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE item1.X-ABDATE:2006-01-09 item1.X-ABLabel:Anniversary item2.X-ABLabel:Other item3.X-ABLabel:Other item4.X-ABLabel:Other item5.X-ABLabel:Other item6.X-ABLabel:Other item7.X-ABLabel:Other item8.X-ABLabel:Other item9.X-ABLabel:Other item10.X-ABLabel:Other item11.X-ABRELATEDNAMES:John Doe Junior item11.X-ABLabel:Assistant item12.X-ABRELATEDNAMES:John Doe Senior item12.X-ABLabel:Manager item13.X-ABRELATEDNAMES:Joan Doe item13.X-ABLabel:Spouse item14.URL:http\://john.doe.com item14.X-ABLabel:Other END:VCARD syncevolution-1.5/test/testcases/templates/0000755000373300037200000000000012424707640022655 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/templates/clients/0000755000373300037200000000000012424707640024316 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/templates/clients/phone/0000755000373300037200000000000012424707640025427 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/templates/clients/phone/nokia/0000755000373300037200000000000012424707640026530 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/templates/clients/phone/nokia/S40/0000755000373300037200000000000012424707640027076 5ustar00nightlyallusers00000000000000syncevolution-1.5/test/testcases/templates/clients/phone/nokia/S40/7210c.ini0000644000373300001540000000104212326412404030142 0ustar00nightlynightly00000000000000=== template.ini === fingerprint = Nokia 7210c,Nokia description = Template for Nokia S40 series Phone templateName = Nokia S40 === config.ini === PeerIsClient = 1 ConsumerReady = 1 === sources/addressbook/config.ini === sync = two-way uri = Contacts === sources/calendar/config.ini === sync = none === sources/todo/config.ini === sync = none === sources/memo/config.ini === sync = two-way uri = memo === sources/calendar+todo/config.ini === sync = two-way type = virtual:text/x-calendar:1.0 evolutionsource = calendar,todo uri = Calendar syncevolution-1.5/test/testcases/templates/clients/SyncEvolution.ini0000644000373300001540000000070312326412404027452 0ustar00nightlynightly00000000000000=== template.ini === fingerprint = SyncEvolution Client description = SyncEvolution server side template === config.ini === username = test password = test PeerIsClient = 1 ConsumerReady = 1 === sources/addressbook/config.ini === sync = two-way uri = addressbook === sources/calendar/config.ini === sync = two-way uri = calendar === sources/todo/config.ini === sync = two-way uri = todo === sources/memo/config.ini === sync = two-way uri = memo syncevolution-1.5/test/testcases/eds_event.ics0000666000373300001540000002454612326412404023164 0ustar00nightlynightly00000000000000BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:/softwarestudio.org/Olson_20011030_5/Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT SUMMARY:phone meeting DESCRIPTION:let's talk CATEGORIES:MEETING DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Berlin: 20060406T163000 DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Berlin: 20060406T160000 UID:20060406T211449Z-4562-727-1-63@gollum DTSTAMP:20060406T211449Z LAST-MODIFIED:20060416T203532Z CREATED:20060416T203532Z LOCATION:my office CLASS:PUBLIC TRANSP:OPAQUE SEQUENCE:1 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T203656Z-4272-727-1-241@gollum DTSTAMP:20060416T203656Z DTSTART:20060406T170000Z DTEND:20060406T173000Z TRANSP:OPAQUE SEQUENCE:3 SUMMARY:recurrence weekly\, limited DESCRIPTION:recurrs four times due its end date CLASS:PUBLIC CREATED:20060416T203724Z LAST-MODIFIED:20060416T203758Z RRULE:FREQ=WEEKLY;UNTIL=20060427T173000Z;INTERVAL=1;BYDAY=TH END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T203551Z-4272-727-1-240@gollum DTSTAMP:20060416T203551Z DTSTART:20060406T163000Z DTEND:20060406T170000Z TRANSP:OPAQUE SEQUENCE:3 SUMMARY:recurrence daily unlimited CLASS:PUBLIC CREATED:20060416T203646Z LAST-MODIFIED:20060416T203806Z RRULE:FREQ=DAILY;INTERVAL=1 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T203813Z-4272-727-1-242@gollum DTSTAMP:20060416T203813Z DTSTART:20060406T173000Z DTEND:20060406T180000Z TRANSP:OPAQUE SEQUENCE:3 SUMMARY:recurrence monthly\, 6th day\, limited DESCRIPTION:recurrs three times on the 6th of each month CLASS:PUBLIC CREATED:20060416T203924Z LAST-MODIFIED:20060416T203949Z RRULE:FREQ=MONTHLY;INTERVAL=1;UNTIL=20060606T173000Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T203954Z-4272-727-1-243@gollum DTSTAMP:20060416T203954Z DTSTART:20060406T180000Z DTEND:20060406T183000Z TRANSP:OPAQUE SEQUENCE:2 SUMMARY:recurrence\, yearly\, two times CLASS:PUBLIC RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20070406T180000Z CREATED:20060416T204021Z LAST-MODIFIED:20060416T204021Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204026Z-4272-727-1-244@gollum DTSTAMP:20060416T204026Z DTSTART;VALUE=DATE:20060406 DTEND;VALUE=DATE:20060407 TRANSP:TRANSPARENT SEQUENCE:2 SUMMARY:all day event CLASS:PUBLIC CREATED:20060416T204042Z LAST-MODIFIED:20060416T204042Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204047Z-4272-727-1-245@gollum DTSTAMP:20060416T204047Z DTSTART;VALUE=DATE:20060406 DTEND;VALUE=DATE:20060408 TRANSP:TRANSPARENT SEQUENCE:2 SUMMARY:two day event CLASS:PUBLIC CREATED:20060416T204104Z LAST-MODIFIED:20060416T204104Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204647Z-4272-727-1-248@gollum DTSTAMP:20060416T204647Z DTSTART:20060406T183000Z DTEND:20060406T190000Z TRANSP:OPAQUE SEQUENCE:2 SUMMARY:recurrence\, daily\, with exceptions DESCRIPTION:recurrs seven times\, excluding (but counting) Friday and Saturday CLASS:PUBLIC RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20060412T183000Z EXDATE:20060408T183000Z EXDATE:20060407T183000Z CREATED:20060416T204808Z LAST-MODIFIED:20060416T204808Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204647Z-4272-727-1-248-allday@gollum DTSTAMP:20060416T204647Z DTSTART;VALUE=DATE:20060406 DTEND;VALUE=DATE:20060407 TRANSP:OPAQUE SEQUENCE:2 SUMMARY:all-day recurrence\, daily\, with exceptions DESCRIPTION:recurrs seven times\, excluding (but counting) Friday and Saturday CLASS:PUBLIC RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20060412 EXDATE;VALUE=DATE:20060408 EXDATE;VALUE=DATE:20060407 CREATED:20060416T204808Z LAST-MODIFIED:20060416T204808Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204136Z-4272-727-1-247@gollum DTSTAMP:20060416T204136Z DTSTART:20060406T190000Z DTEND:20060406T193000Z TRANSP:TRANSPARENT SEQUENCE:4 SUMMARY:all fields LOCATION:virtual CATEGORIES:Business,test,bar CLASS:PRIVATE CREATED:20060416T204625Z LAST-MODIFIED:20060416T204833Z DESCRIPTION:this is an appointment with plenty of fields set\, and special attributes...\n\nempty line above\, line\nbreak\n\nspecial characters:\na-umlaut ä\nexclamation mark !\nampersand disabled\nhash #\nleft angle bracket disabled\nright angle bracket disabled\nleft square bracket [\nright square bracket ]\nleft bracket (\nright bracket )\nbackslash \\\nbackslash lf \\n\nbackslash cr \\r\nstar *\ncarret ^\npercent %\ntilde ~\ntick `\nbacktick `\ndouble quotation - not tested because Evolution encodes it incorrectly\nsingle quotation '\ncolon :\n semicolon \;\ncomma \,\n BEGIN:VALARM X-EVOLUTION-ALARM-UID:20060416T204833Z-4250-727-1-85@gollum ACTION:DISPLAY DESCRIPTION:This is an event reminder TRIGGER;VALUE=DURATION;RELATED=START:-PT1H END:VALARM END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204922Z-4272-727-1-250@gollum DTSTAMP:20060416T204922Z DTSTART:20060406T193000Z DTEND:20060406T200000Z TRANSP:OPAQUE SEQUENCE:2 CATEGORIES:BUSINESS,MEETING SUMMARY:meeting invitation CLASS:PUBLIC ORGANIZER;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED; RSVP=TRUE;CN=Patrick Ohly:MAILTO:Patrick.Ohly@gmx.de ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION; RSVP=TRUE:MAILTO:john@bar.com CREATED:20060416T205003Z LAST-MODIFIED:20060416T205003Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50@gollum DTSTAMP:20080407T193125Z DTSTART:20080406T090000Z DTEND:20080406T093000Z TRANSP:OPAQUE SEQUENCE:2 SUMMARY:Recurring DESCRIPTION:recurs each Sonday\, 10 times CLASS:PUBLIC RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU;UNTIL=20080608T090000Z CREATED:20080407T193241Z LAST-MODIFIED:20080407T193241 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50@gollum DTSTAMP:20080407T193125Z DTSTART:20080413T090000Z DTEND:20080413T093000Z TRANSP:OPAQUE SEQUENCE:7 SUMMARY:Recurring: Modified CLASS:PUBLIC CREATED:20080407T193241Z LAST-MODIFIED:20080407T193647 RECURRENCE-ID:20080413T090000Z DESCRIPTION:second instance modified END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50@gollum DTSTAMP:20080407T193125Z DTSTART:20080420T100000Z DTEND:20080420T103000Z TRANSP:OPAQUE SEQUENCE:7 SUMMARY:Recurring: Modified II CLASS:PUBLIC CREATED:20080407T193241Z LAST-MODIFIED:20080407T193647 RECURRENCE-ID:20080420T090000Z DESCRIPTION:third instance modified\, different time END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50-XX@gollum DTSTAMP:20080407T193125Z DTSTART:20080406T090000Z DTEND:20080406T093000Z TRANSP:OPAQUE SEQUENCE:2 SUMMARY:Recurring 2 DESCRIPTION:recurs each Sunday\, 10 times CLASS:PUBLIC RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU;UNTIL=20080608T090000Z CREATED:20080407T193241Z LAST-MODIFIED:20080407T193241 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50-XX@gollum DTSTAMP:20080407T193125Z DTSTART:20080413T090000Z DTEND:20080413T093000Z TRANSP:OPAQUE SEQUENCE:7 SUMMARY:Recurring 2: Modified CLASS:PUBLIC CREATED:20080407T193241Z LAST-MODIFIED:20080407T193647 RECURRENCE-ID:20080413T090000Z DESCRIPTION:second instance modified\, single detached recurrence END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50-YY@gollum DTSTAMP:20080407T193125Z DTSTART:20080413T090000Z DTEND:20080413T093000Z TRANSP:OPAQUE SEQUENCE:7 SUMMARY:Recurring 3: Modified CLASS:PUBLIC CREATED:20080407T193241Z LAST-MODIFIED:20080407T193647 RECURRENCE-ID:20080413T090000Z DESCRIPTION:second instance modified END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50-YY@gollum DTSTAMP:20080407T193125Z DTSTART:20080420T100000Z DTEND:20080420T103000Z TRANSP:OPAQUE SEQUENCE:7 SUMMARY:Recurring 3: Modified II CLASS:PUBLIC CREATED:20080407T193241Z LAST-MODIFIED:20080407T193647 RECURRENCE-ID:20080420T090000Z DESCRIPTION:third instance modified\, different time END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:EST/EDT BEGIN:STANDARD TZOFFSETFROM:-0400 TZOFFSETTO:-0500 TZNAME:EST DTSTART:19671029T020000 RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT TZOFFSETFROM:-0500 TZOFFSETTO:-0400 TZNAME:EDT DTSTART:19870405T020000 RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=1SU END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT UID:20060416T205224Z-4272-727-1-251@gollum DTSTAMP:20060416T205224Z DTSTART;TZID=EST/EDT:20060406T140000 DTEND;TZID=EST/EDT:20060406T143000 TRANSP:OPAQUE SEQUENCE:2 SUMMARY:timezone New York with custom definition for 2006 CLASS:PUBLIC CREATED:20060416T205301Z LAST-MODIFIED:20060416T205301Z END:VEVENT END:VCALENDAR syncevolution-1.5/test/testcases/eds_event.ics.local0000666000373300001540000000263012326412404024243 0ustar00nightlynightly00000000000000BEGIN:VCALENDAR VERSION:2.0 PRODID:Schedule World BEGIN:VTIMEZONE X-LIC-LOCATION:Europe/Berlin TZID:/foobar/Tzfile/Europe/Berlin BEGIN:STANDARD DTSTART:19701025T020000 TZNAME:CET TZOFFSETFROM:+0200 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD BEGIN:DAYLIGHT DTSTART:19700328T030000 TZNAME:CEST TZOFFSETFROM:+0100 TZOFFSETTO:+0200 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT CLASS:PUBLIC DESCRIPTION:foobar CREATED:20100503T101836Z DTSTAMP:20100503T150027Z DTSTART;TZID=/foobar/Tzfile/Europe/Berlin:20100511T143000 DTEND;TZID=/foobar/Tzfile/Europe/Berlin:20100511T160000 LAST-MODIFIED:20100503T150026Z SEQUENCE:2 SUMMARY:foobar END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 METHOD:PUBLISH BEGIN:VTIMEZONE TZID:GMT Standard Time BEGIN:STANDARD DTSTART:16010101T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T010000 TZOFFSETFROM:+0000 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT SUMMARY:test event DTSTART;TZID=GMT Standard Time:20100421T150000 DTEND;TZID=GMT Standard Time:20100421T160000 UID:040000008200E00074C5B7101A82E0080000000000B5A586D0A4CA01000000000000000010 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20100415T035521Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:4 END:VEVENT END:VCALENDAR syncevolution-1.5/test/testcases/eds_task.ics0000666000373300001540000000221312326412404022770 0ustar00nightlynightly00000000000000BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:/softwarestudio.org/Tzfile/America/New_York X-LIC-LOCATION:America/New_York BEGIN:STANDARD TZNAME:EST DTSTART:19701101T010000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19700308T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT END:VTIMEZONE BEGIN:VTODO UID:20090401T145153Z-22321-1000-1-18@pohly-MOBL DTSTAMP:20090401T145153Z SUMMARY:test task with plenty of fields PRIORITY:7 CREATED:20090401T145153Z LAST-MODIFIED:20090401T145153Z DESCRIPTION:This is a test task in time zone New York\, to be started May 1st 2009\, due Mai 2st 2009.\n\nIt uses non-standard status values. DUE;TZID=/softwarestudio.org/Tzfile/America/New_York:20090502T130000 DTSTART;TZID=/softwarestudio.org/Tzfile/America/New_York:20090501T100000 CLASS:PUBLIC PERCENT-COMPLETE:99 STATUS:COMPLETED CATEGORIES:Business,Waiting COMPLETED:20090401T030000Z URL:http://foo.com SEQUENCE:1 END:VTODO END:VCALENDAR syncevolution-1.5/test/testcases/vcal10.ics0000666000373300001540000000277012326412404022271 0ustar00nightlynightly00000000000000BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DESCRIPTION:recurrs four times due its end date DTSTART:20060406T170000Z DTEND:20060406T173000Z RRULE:W1 TH 20060427T000000Z SUMMARY:recurrence weekly, limited TRANSP:OPAQUE END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DTSTART:20060406T160000Z DTEND:20060406T163000Z RRULE:MP1 1+ SU #2 SUMMARY:recurr at end of month TRANSP:OPAQUE END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DTSTART:20060406T180000Z DTEND:20060406T183000Z RRULE:YM1 4 #2 SUMMARY:recurrence, yearly, two times TRANSP:OPAQUE END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DTSTART:20060405T220000Z DTEND:20060407T220000Z SUMMARY:two day event TRANSP:TRANSPARENT END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DESCRIPTION:recurrs three times on the 6th of each month DTSTART:20060406T173000Z DTEND:20060406T180000Z RRULE:MD1 6 #3 SUMMARY:recurrence monthly, 6th day, limited TRANSP:OPAQUE END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DESCRIPTION:let's talk DTSTART:20060406T140000Z DTEND:20060406T143000Z LOCATION:my office SUMMARY:phone meeting TRANSP:OPAQUE END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DTSTART:20060406T163000Z DTEND:20060406T170000Z RRULE:D1 #0 SUMMARY:recurrence daily unlimited TRANSP:OPAQUE END:VEVENT END:VCALENDAR BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT DTSTART:20060405T000000Z DTEND:20060406T000000Z SUMMARY:all day event TRANSP:TRANSPARENT END:VEVENT END:VCALENDAR syncevolution-1.5/test/testcases/carddav.vcf0000664000373300001540000004425312336456617022626 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 UID:unique-id-user17 NICKNAME:user17 NOTE:triggers parser bug in Funambol 3.0: trailing = is mistaken for soft line break= FN:parserbug= N:parserbug=;;;; X-EVOLUTION-FILE-AS:parserbug= END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user16 NICKNAME:user16 NOTE:test case with empty email FN:incomplete N:incomplete;;;; EMAIL: X-EVOLUTION-FILE-AS:incomplete END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user11 NICKNAME:user11 NOTE:This is a long line without any special characters. This is a simpler example that should require folding in vcards. Does folding insert a crlf before a space or does it insert crlf _plus_ a space? vCard 2.1 inserts before a space\, 3.0 inserts line break plus space. FN:long line N:line;long;;; X-EVOLUTION-FILE-AS:line\, long END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user12 NICKNAME:user12 NOTE:ampersand entity &\; less-than entity <\; FN:xml entities N:xml;entities;;; X-EVOLUTION-FILE-AS:xml\, entities END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user13 NICKNAME:user13 NOTE:a colon is not a special character so here it comes : and not quoting necessary FN:colon N:colon;unquoted;;; X-EVOLUTION-FILE-AS:colon\, unquoted END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user14 NICKNAME:user14 NOTE:here are some quotation marks: single ' double " back ` - none of them is special FN:quotation marks N:marks;quotation;;; X-EVOLUTION-FILE-AS:marks\, quotation END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user15 NICKNAME:user15 NOTE:Spouse's Name: foobar FN:spouse name N:name;spouse;;; X-EVOLUTION-FILE-AS:spouse\, name END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user9 NICKNAME:user9 NOTE;CHARSET="UTF-8":Tests charset specification with quotation marks. FN:charset N:set;char;;; X-EVOLUTION-FILE-AS:set\, char END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user2 NICKNAME:user2 X-EVOLUTION-SPOUSE: NOTE:This user tests some of the advanced aspects of vcards:\n- non-ASCII c haracters (with umlauts in the name)\n- line break (in this note and the mailing address)\n- long lines (in this note)\n- special characters (in this note)\n- tabs (in this note)\n\nVery long line\, very very long th is time... still not finished... blah blah blah blah blah 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\ncomma \,\ncolon :\nsemicolon \;\nbackslash \\\n\nThe same\, in the middle of a line:\ncomma \, comma\ncolon : col on\nsemicolon \; semicolon\nbackslash \\ backslash\n\nA tab tab done\n line starts with tab FN:Umlaut Ä Ö Ü ß N:Ü;Ä;Ö;Umlaut;ß X-EVOLUTION-FILE-AS:Ü\, Ä CATEGORIES:Business X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE ADR;TYPE=HOME:test 5;Line 2;Umlaut Ä in Line 1;test 1;test 3;test 2;test 4 LABEL;TYPE=HOME:Umlaut Ä in Line 1\nLine 2\n\ntest 1\, test 3\ntest 2\ntest 5\ntest 4 END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user8 NICKNAME:user8 X-EVOLUTION-SPOUSE: NOTE:Here are some special characters: comma \, colon : semicolon \; FN:special characters N:characters;special;;; X-EVOLUTION-FILE-AS:characters\, special X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user7 NICKNAME:user7 X-EVOLUTION-SPOUSE: NOTE:This test case uses line breaks. This is line 1.\nLine 2.\n\nLine brea ks in vcard 2.1 are encoded as =0D=0A.\nThat means the = has to be encod ed itself... FN:line breaks N:breaks;line;;; X-EVOLUTION-FILE-AS:breaks\, line X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE ADR;TYPE=HOME:;Address Line 2\nAddress Line 3;Address Line 1;;;; LABEL;TYPE=HOME:Address Line 1\nAddress Line 2\nAddress Line 3 END:VCARD BEGIN:VCARD VERSION:3.0 N:Doe;John;1;Mr.;Sr. FN:Mr. John 1 Doe Sr. NICKNAME:user1 TITLE:tester ORG:at company REV:2014-04-11T08:43:42Z UID:6f354d698b7ccd22 BDAY;VALUE=DATE:1970-12-30 ADR;TYPE=HOME:PO;neighborhood;home address\n;City;State;ZIP;Country ADR;TYPE=WORK:;;work address;;;; ADR:;;custom address;;;; TEL;TYPE=WORK:business 1 TEL;TYPE=CELL:mobile TEL;TYPE=HOME:home TEL:main TEL;TYPE=FAX,WORK:work fax TEL;TYPE=FAX,HOME:home fax item14.TEL:google voice TEL;TYPE=PAGER:pager item15.TEL:custom EMAIL;TYPE=HOME,PREF:john.doe@home.com EMAIL;TYPE=WORK:doe@work.com item2.EMAIL:john@custom.com NOTE:A test contact. PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu 0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV 8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC IMPP;X-SERVICE-TYPE=GoogleTalk:xmpp:google%20talk IMPP;X-SERVICE-TYPE=AIM:aim:aim IMPP;X-SERVICE-TYPE=Yahoo:ymsgr:yahoo IMPP;X-SERVICE-TYPE=Skype:skype:skype IMPP;X-SERVICE-TYPE=QQ:x-apple:QQ IMPP;X-SERVICE-TYPE=MSN:msnim:MSN IMPP;X-SERVICE-TYPE=ICQ:aim:ICQ IMPP;X-SERVICE-TYPE=Jabber:xmpp:Jabber IMPP;X-SERVICE-TYPE=chat-label:x-apple:custom%20chat X-EVOLUTION-FILE-AS:Doe\, John X-MOZILLA-HTML:FALSE X-PHONETIC-FIRST-NAME:John X-PHONETIC-LAST-NAME:Doe item2.X-ABLabel:custom-label2 item3.X-ABDATE:1971-01-01 item3.X-ABLabel:Anniversary item4.X-ABDATE:2000-02-01 item4.X-ABLabel:custom-label3 item14.X-ABLabel:Google Voice item15.X-ABLabel:custom-label4 item16.X-ABRELATEDNAMES:spouse item16.X-ABLabel:Spouse item17.X-ABRELATEDNAMES:child item17.X-ABLabel:Child item18.X-ABRELATEDNAMES:mother item18.X-ABLabel:Mother item19.X-ABRELATEDNAMES:father item19.X-ABLabel:Father item20.X-ABRELATEDNAMES:parent item20.X-ABLabel:Parent item21.X-ABRELATEDNAMES:brother item21.X-ABLabel:Brother item22.X-ABRELATEDNAMES:sister item22.X-ABLabel:Sister item23.X-ABRELATEDNAMES:friend item23.X-ABLabel:Friend item24.X-ABRELATEDNAMES:relative item24.X-ABLabel:relative item25.X-ABRELATEDNAMES:manager item25.X-ABLabel:Manager item26.X-ABRELATEDNAMES:assistant item26.X-ABLabel:Assistant item27.X-ABRELATEDNAMES:referred-by item27.X-ABLabel:referred-by-label item28.X-ABRELATEDNAMES:partner item28.X-ABLabel:Partner item29.X-ABRELATEDNAMES:domestic partner item29.X-ABLabel:domestic-partner-label item30.X-ABRELATEDNAMES:custom relationship item30.X-ABLabel:custom-label5 item31.URL:http://profile.com item31.X-ABLabel:Profile item32.URL:http://blog.com item32.X-ABLabel:Blog item33.URL:http://homepage.com item33.X-ABLabel:HomePage item34.URL:http://company.com item34.X-ABLabel:Work item35.URL:http://custom.com item35.X-ABLabel:Custom-label6 END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user5 NICKNAME:user5 X-EVOLUTION-SPOUSE: NOTE:image in JPG format FN:Ms. JPG N:;JPG;;Ms.; X-EVOLUTION-FILE-AS:JPG X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user4 NICKNAME:user4 X-EVOLUTION-SPOUSE: NOTE:image in PNG format FN:Mrs. PNG N:;PNG;;Mrs.; X-EVOLUTION-FILE-AS:PNG X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu 0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV 8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user6 NICKNAME:user6 X-EVOLUTION-SPOUSE: NOTE:The first name is "First \; special \;". FN:Mr. First \; special \; middle Last N:Last;First \; special \;;middle;Mr.; X-EVOLUTION-FILE-AS:Last\, First \; special \; X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user3 NICKNAME:user3 X-EVOLUTION-SPOUSE: NOTE:image in GIF format FN:Mr. GIF N:;GIF;;Mr.; X-EVOLUTION-FILE-AS:GIF X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE PHOTO;ENCODING=b;TYPE=GIF:R0lGODlhJAAXAIABAAAAAP///yH+FUNyZWF0ZWQgd2l0aCBUa GUgR0lNUAAh+QQBCgABACwAAAAAJAAXAAACVYyPqcvtD6OctNqLFdi8b/sd3giAJRNmqXaKH TIaZJKSpx3McLtyeSuTAWm34e+4WBGFuJ/P1QjZek9ksjiRGqFCTW5pZblmzdiO+GJWncqM+ w2PwwsAOw== END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user10 NICKNAME:user10 X-EVOLUTION-SPOUSE: NOTE:large vcard with plenty of special chars < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < FN:large vcard N:;vcard;;large; X-EVOLUTION-FILE-AS:large END:VCARD syncevolution-1.5/test/testcases/eds_contact.vcf0000664000373300001540000004240212330727742023474 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 UID:unique-id-user17 NICKNAME:user17 NOTE:triggers parser bug in Funambol 3.0: trailing = is mistaken for soft line break= FN:parserbug= N:parserbug=;;;; X-EVOLUTION-FILE-AS:parserbug= END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user16 NICKNAME:user16 NOTE:test case with empty email FN:incomplete N:incomplete;;;; EMAIL: X-EVOLUTION-FILE-AS:incomplete END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user11 NICKNAME:user11 NOTE:This is a long line without any special characters. This is a simpler example that should require folding in vcards. Does folding insert a crlf before a space or does it insert crlf _plus_ a space? vCard 2.1 inserts before a space\, 3.0 inserts line break plus space. FN:long line N:line;long;;; X-EVOLUTION-FILE-AS:line\, long END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user12 NICKNAME:user12 NOTE:ampersand entity &\; less-than entity <\; FN:xml entities N:xml;entities;;; X-EVOLUTION-FILE-AS:xml\, entities END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user13 NICKNAME:user13 NOTE:a colon is not a special character so here it comes : and not quoting necessary FN:colon N:colon;unquoted;;; X-EVOLUTION-FILE-AS:colon\, unquoted END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user14 NICKNAME:user14 NOTE:here are some quotation marks: single ' double " back ` - none of them is special FN:quotation marks N:marks;quotation;;; X-EVOLUTION-FILE-AS:marks\, quotation END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user15 NICKNAME:user15 NOTE:Spouse's Name: foobar FN:spouse name N:name;spouse;;; X-EVOLUTION-FILE-AS:spouse\, name END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user9 NICKNAME:user9 NOTE;CHARSET="UTF-8":Tests charset specification with quotation marks. FN:charset N:set;char;;; X-EVOLUTION-FILE-AS:set\, char END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user2 NICKNAME:user2 X-EVOLUTION-SPOUSE: NOTE:This user tests some of the advanced aspects of vcards:\n- non-ASCII c haracters (with umlauts in the name)\n- line break (in this note and the mailing address)\n- long lines (in this note)\n- special characters (in this note)\n- tabs (in this note)\n\nVery long line\, very very long th is time... still not finished... blah blah blah blah blah 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\n\ncomma \,\ncolon :\nsemicolon \;\nbackslash \\\n\nThe same\, in the middle of a line:\ncomma \, comma\ncolon : col on\nsemicolon \; semicolon\nbackslash \\ backslash\n\nA tab tab done\n line starts with tab FN:Umlaut Ä Ö Ü ß N:Ü;Ä;Ö;Umlaut;ß X-EVOLUTION-FILE-AS:Ü\, Ä CATEGORIES:Business X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE ADR;TYPE=HOME:test 5;Line 2;Umlaut Ä in Line 1;test 1;test 3;test 2;test 4 LABEL;TYPE=HOME:Umlaut Ä in Line 1\nLine 2\n\ntest 1\, test 3\ntest 2\ntest 5\ntest 4 END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user8 NICKNAME:user8 X-EVOLUTION-SPOUSE: NOTE:Here are some special characters: comma \, colon : semicolon \; FN:special characters N:characters;special;;; X-EVOLUTION-FILE-AS:characters\, special X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user7 NICKNAME:user7 X-EVOLUTION-SPOUSE: NOTE:This test case uses line breaks. This is line 1.\nLine 2.\n\nLine brea ks in vcard 2.1 are encoded as =0D=0A.\nThat means the = has to be encod ed itself... FN:line breaks N:breaks;line;;; X-EVOLUTION-FILE-AS:breaks\, line X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE ADR;TYPE=HOME:;Address Line 2\nAddress Line 3;Address Line 1;;;; LABEL;TYPE=HOME:Address Line 1\nAddress Line 2\nAddress Line 3 END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc.;Testing;test#1 ROLE:professional test case X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior UID:unique-id-user1 NICKNAME:user1 BDAY:2006-01-08 X-FOOBAR-EXTENSION;X-FOOBAR-PARAMETER=foobar:has to be stored internally by engine and preserved in testExtensions test\; never sent to a peer X-TEST;PARAMETER1=nonquoted;PARAMETER2="quoted because of spaces":Content with\nMultiple\nText lines\nand national chars: äöü X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;;; X-EVOLUTION-FILE-AS:Doe\, John CATEGORIES:TEST X-EVOLUTION-BLOG-URL:web log GEO:30.12;-130.34 CALURI:calender FBURL:free/busy X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=WORK:Test Box #2;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=HOME:Test Box #1;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR:Test Box #3;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia EMAIL;TYPE=WORK;X-EVOLUTION-UI-SLOT=1:john.doe@work.com EMAIL;TYPE=HOME;X-EVOLUTION-UI-SLOT=2:john.doe@home.priv EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=3:john.doe@other.world EMAIL;TYPE=OTHER;X-EVOLUTION-UI-SLOT=4:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=WORK;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=HOME;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;TYPE=CAR;X-EVOLUTION-UI-SLOT=7:car 7 TEL;TYPE=PREF;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE X-GADUGADU:GADUGADU DOE X-JABBER:JABBER DOE X-MSN:MSN DOE X-SKYPE:SKYPE DOE X-SIP:SIP DOE END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user5 NICKNAME:user5 X-EVOLUTION-SPOUSE: NOTE:image in JPG format FN:Ms. JPG N:;JPG;;Ms.; X-EVOLUTION-FILE-AS:JPG X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQEASABIAAD/4QAWRXhpZgAATU0AKgAA AAgAAAAAAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAFAwQEBAMFBAQEBQUFBgcM CAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEF BQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4e/8AAEQgAFwAkAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAGBwgE Bf/EADIQAAECBQMCAwQLAAAAAAAAAAECBAADBQYRBxIhEzEUFSIIFjNBGCRHUVZ3lqXD0+P/ xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMR AD8AuX6UehP45/aXv9MTPTLVKxNSvMPcqu+a+XdLxf1SfJ6fU37PioTnOxfbOMc/KIZ7U/2V fmTR/wCaKlu6+blu/Ui72zxWtUmmUOrTaWwkWDT09FPR4K587OVrUfVsIwElPPPAbAjxr2um hWXbDu5rmfeApLPZ4hx0lzNm9aUJ9KAVHKlJHAPf7ozPLqWt9y6Z0EPGmoLNjTq48a1iaybJ YV52yEtCms5KJmAT61JXtJyUdyQTEc1WlMql7N1/oZ6jagVZVFfUyZPpFy5lvWcxU7Z03BUk GZLWJqVhPYLkIIPBEBtSEUyNAsjI1q1m/VP+UICwL/sqlXp7v+aOHsnyGttq218MtKd8+Ru2 JXuScoO45Awe2CIi96aKW1cVyubkYVy6rTqz0J8a5t2qqZl0UjAMwYKScfPAJ+cIQHHP0Dth VFaMWt0XwxetnM50Ks2rsxL6ZMnJlJmb5hBBBEiVxjA28dznqo+hdksbQuS3Hs6tVtNzdM1Z /VH5nO3Bl/CJmYHKDynjv3zCEB5rLQNo0bIbydWNWxKljbLQLoWkISOAkBKAABCEID//2Q== END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user4 NICKNAME:user4 X-EVOLUTION-SPOUSE: NOTE:image in PNG format FN:Mrs. PNG N:;PNG;;Mrs.; X-EVOLUTION-FILE-AS:PNG X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE PHOTO;ENCODING=b;TYPE=PNG:iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAAB mJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gEICjgdiWkBO QAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAABaElEQVRIx+3Wu 0tcURAG8F98gRKTYGORRqwksJV/QOqFFIFgKgsRYbHV1larDQQCKQxpUscyhUmXJuCSNpYWP sAU6wPxHW6aWbgsu+ve3RUs7geHc+fON3O+M4c5HHLkyHG/eISkg5heIGmUr++hVWigyY6TH lejbWSt0Bv8QBXX2MF7jKU4IyjjJ45xg31sYKZuw7Xv9Gh6vvXO9QbBtbGNJ8Ert+AlTURkF jQX9g5e4ykGUcBm+FaDexx2MUQOYhIL2Lpj09oV9CvsQgPuePj+hP037BL6M6yRSdDZHWVOc BHcEv7FvyN8xxqmeynovA1Baf4UVvANhyn/Uq8E/Q57ssNufhvx1QZrDHfS9p9i3sQsnscdN owXWEQlOBXMYyI4j3EavqFUzpOYl4OTqUJ9+NzmkbXyb6Ryfumm7Wso4it2cYXL6K6PeBmcV 8E5iEvxPDjv8CyVaxQfsIfbqGIlf17k6Bb/Ae0cnahfg6KuAAAAAElFTkSuQmCC END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user6 NICKNAME:user6 X-EVOLUTION-SPOUSE: NOTE:The first name is "First \; special \;". FN:Mr. First \; special \; middle Last N:Last;First \; special \;;middle;Mr.; X-EVOLUTION-FILE-AS:Last\, First \; special \; X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE END:VCARD BEGIN:VCARD VERSION:3.0 URL: TITLE: ROLE: X-EVOLUTION-MANAGER: X-EVOLUTION-ASSISTANT: UID:unique-id-user3 NICKNAME:user3 X-EVOLUTION-SPOUSE: NOTE:image in GIF format FN:Mr. GIF N:;GIF;;Mr.; X-EVOLUTION-FILE-AS:GIF X-EVOLUTION-BLOG-URL: CALURI: FBURL: X-EVOLUTION-VIDEO-URL: X-MOZILLA-HTML:FALSE PHOTO;ENCODING=b;TYPE=GIF:R0lGODlhJAAXAIABAAAAAP///yH+FUNyZWF0ZWQgd2l0aCBUa GUgR0lNUAAh+QQBCgABACwAAAAAJAAXAAACVYyPqcvtD6OctNqLFdi8b/sd3giAJRNmqXaKH TIaZJKSpx3McLtyeSuTAWm34e+4WBGFuJ/P1QjZek9ksjiRGqFCTW5pZblmzdiO+GJWncqM+ w2PwwsAOw== END:VCARD BEGIN:VCARD VERSION:3.0 UID:unique-id-user10 NICKNAME:user10 X-EVOLUTION-SPOUSE: NOTE:large vcard with plenty of special chars < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < & < FN:large vcard N:;vcard;;large; X-EVOLUTION-FILE-AS:large END:VCARD syncevolution-1.5/test/testcases/eds_memo.ics0000666000373300001540000000134612326412404022771 0ustar00nightlynightly00000000000000BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 METHOD:PUBLISH BEGIN:VJOURNAL SUMMARY:Only Summary END:VJOURNAL END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 METHOD:PUBLISH BEGIN:VJOURNAL SUMMARY:Summary DESCRIPTION:Summary\nBody <> END:VJOURNAL END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 METHOD:PUBLISH BEGIN:VJOURNAL SUMMARY:Simple DESCRIPTION:Simple END:VJOURNAL END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 METHOD:PUBLISH BEGIN:VJOURNAL SUMMARY:Umlaute DESCRIPTION:Umlaute\nä ö ü Ä Ö Ü END:VJOURNAL END:VCALENDAR syncevolution-1.5/test/testcases/google_event.ics0000666000373300001540000002213412326412404023654 0ustar00nightlynightly00000000000000BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:/softwarestudio.org/Olson_20011030_5/Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT SUMMARY:phone meeting DESCRIPTION:let's talk CATEGORIES:MEETING DTEND;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Berlin: 20060406T163000 DTSTART;TZID=/softwarestudio.org/Olson_20011030_5/Europe/Berlin: 20060406T160000 UID:20060406T211449Z-4562-727-1-63@gollum DTSTAMP:20060406T211449Z LAST-MODIFIED:20060416T203532Z CREATED:20060416T203532Z LOCATION:my office CLASS:PUBLIC TRANSP:OPAQUE SEQUENCE:1 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20060416T203656Z-4272-727-1-241@gollum DTSTAMP:20060416T203656Z DTSTART;TZID=Europe/Berlin:20060406T190000 DTEND;TZID=Europe/Berlin:20060406T193000 TRANSP:OPAQUE SEQUENCE:3 SUMMARY:recurrence weekly\, limited DESCRIPTION:recurrs four times due its end date CLASS:PUBLIC CREATED:20060416T203724Z LAST-MODIFIED:20060416T203758Z RRULE:FREQ=WEEKLY;UNTIL=20060427T173000Z;INTERVAL=1;BYDAY=TH END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20060416T203551Z-4272-727-1-240@gollum DTSTAMP:20060416T203551Z DTSTART;TZID=Europe/Berlin:20060406T183000 DTEND;TZID=Europe/Berlin:20060406T190000 TRANSP:OPAQUE SEQUENCE:3 SUMMARY:recurrence daily unlimited CLASS:PUBLIC CREATED:20060416T203646Z LAST-MODIFIED:20060416T203806Z RRULE:FREQ=DAILY;INTERVAL=1 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20060416T203813Z-4272-727-1-242@gollum DTSTAMP:20060416T203813Z DTSTART;TZID=Europe/Berlin:20060406T193000 DTEND;TZID=Europe/Berlin:20060406T200000 TRANSP:OPAQUE SEQUENCE:3 SUMMARY:recurrence monthly\, 6th day\, limited DESCRIPTION:recurrs three times on the 6th of each month CLASS:PUBLIC CREATED:20060416T203924Z LAST-MODIFIED:20060416T203949Z RRULE:BYMONTHDAY=6;FREQ=MONTHLY;INTERVAL=1;UNTIL=20060606T173000Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20060416T203954Z-4272-727-1-243@gollum DTSTAMP:20060416T203954Z DTSTART;TZID=Europe/Berlin:20060406T200000 DTEND;TZID=Europe/Berlin:20060406T203000 TRANSP:OPAQUE SEQUENCE:2 SUMMARY:recurrence\, yearly\, two times CLASS:PUBLIC RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20070406T180000Z CREATED:20060416T204021Z LAST-MODIFIED:20060416T204021Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204026Z-4272-727-1-244@gollum DTSTAMP:20060416T204026Z DTSTART;VALUE=DATE:20060406 DTEND;VALUE=DATE:20060407 TRANSP:TRANSPARENT SEQUENCE:2 SUMMARY:all day event CLASS:PUBLIC CREATED:20060416T204042Z LAST-MODIFIED:20060416T204042Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204047Z-4272-727-1-245@gollum DTSTAMP:20060416T204047Z DTSTART;VALUE=DATE:20060406 DTEND;VALUE=DATE:20060408 TRANSP:TRANSPARENT SEQUENCE:2 SUMMARY:two day event CLASS:PUBLIC CREATED:20060416T204104Z LAST-MODIFIED:20060416T204104Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20060416T204647Z-4272-727-1-248@gollum DTSTAMP:20060416T204647Z DTSTART;TZID=Europe/Berlin:20060406T203000 DTEND;TZID=Europe/Berlin:20060406T210000 TRANSP:OPAQUE SEQUENCE:2 SUMMARY:recurrence\, daily\, with exceptions DESCRIPTION:recurrs seven times\, excluding (but counting) Friday and Saturday CLASS:PUBLIC RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20060412T183000Z EXDATE;VALUE=DATE:20060408 EXDATE;VALUE=DATE:20060407 CREATED:20060416T204808Z LAST-MODIFIED:20060416T204808Z END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VEVENT UID:20060416T204136Z-4272-727-1-247@gollum DTSTAMP:20060416T204136Z DTSTART:20060406T190000Z DTEND:20060406T193000Z TRANSP:TRANSPARENT SEQUENCE:4 SUMMARY:all fields LOCATION:virtual CATEGORIES:Business,test,bar CLASS:PRIVATE CREATED:20060416T204625Z LAST-MODIFIED:20060416T204833Z DESCRIPTION:this is an appointment with plenty of fields set\, and special attributes...\n\nempty line above\, line\nbreak\n\nspecial characters:\na-umlaut ä\nexclamation mark !\nampersand disabled\nhash #\nleft angle bracket disabled\nright angle bracket disabled\nleft square bracket [\nright square bracket ]\nleft bracket (\nright bracket )\nbackslash \\ backslash lf \\n\nbackslash cr \\r\nstar *\ncarret ^\npercent %\ntilde ~\ntick `\nbacktick `\ndouble quotation - not tested because Evolution encodes it incorrectly\nsingle quotation '\ncolon :\n semicolon \;\ncomma \,\n BEGIN:VALARM X-EVOLUTION-ALARM-UID:20060416T204833Z-4250-727-1-85@gollum ACTION:DISPLAY TRIGGER;VALUE=DURATION;RELATED=START:-PT1H DESCRIPTION:This is an event reminder END:VALARM END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50@gollum DTSTAMP:20080407T193125Z DTSTART;TZID=Europe/Berlin:20080406T110000 DTEND;TZID=Europe/Berlin:20080406T113000 TRANSP:OPAQUE SEQUENCE:2 SUMMARY:Recurring DESCRIPTION:recurs each Sonday\, 10 times CLASS:PUBLIC RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=SU;UNTIL=20080608T090000Z CREATED:20080407T193241Z LAST-MODIFIED:20080407T193241 END:VEVENT END:VCALENDAR BEGIN:VCALENDAR PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20080407T193125Z-19554-727-1-50@gollum DTSTAMP:20080407T193125Z DTSTART;TZID=Europe/Berlin:20080413T110000 DTEND;TZID=Europe/Berlin:20080413T113000 TRANSP:OPAQUE SEQUENCE:7 SUMMARY:Recurring: Modified CLASS:PUBLIC CREATED:20080407T193241Z LAST-MODIFIED:20080407T193647 RECURRENCE-ID;TZID=Europe/Berlin:20080413T110000 DESCRIPTION:second instance modified END:VEVENT END:VCALENDAR syncevolution-1.5/test/testcases/yahoo_contact.vcf0000666000373300001540000000643212326412404024034 0ustar00nightlynightly00000000000000BEGIN:VCARD VERSION:3.0 NICKNAME:user17 NOTE:triggers parser bug in Funambol 3.0: trailing = is mistaken for soft line break= FN:parserbug= N:parserbug= X-EVOLUTION-FILE-AS:parserbug= END:VCARD BEGIN:VCARD VERSION:3.0 NICKNAME:user16 NOTE:test case with empty email FN:incomplete N:incomplete EMAIL: X-EVOLUTION-FILE-AS:incomplete END:VCARD BEGIN:VCARD VERSION:3.0 NICKNAME:user11 NOTE:This is a long line without any special characters. This is a simpler example that should require folding in vcards. Does folding insert a crlf before a space or does it insert crlf _plus_ a space? vCard 2.1 inserts before a space\, 3.0 inserts line break plus space. FN:long line N:line;long;;; X-EVOLUTION-FILE-AS:line\, long END:VCARD BEGIN:VCARD VERSION:3.0 NICKNAME:user13 NOTE:a colon is not a special character so here it comes : and not quoting necessary FN:colon N:colon;unquoted;;; X-EVOLUTION-FILE-AS:colon\, unquoted END:VCARD BEGIN:VCARD VERSION:3.0 NICKNAME:user14 NOTE:here are some quotation marks: single ' double " back ` - none of them is special FN:quotation marks N:marks;quotation;;; X-EVOLUTION-FILE-AS:marks\, quotation END:VCARD BEGIN:VCARD VERSION:3.0 NICKNAME:user15 NOTE:Spouse's Name: foobar FN:spouse name N:name;spouse;;; X-EVOLUTION-FILE-AS:spouse\, name END:VCARD BEGIN:VCARD VERSION:3.0 NICKNAME:user9 NOTE;CHARSET="UTF-8":Tests charset specification with quotation marks. FN:charset N:set;char;;; X-EVOLUTION-FILE-AS:set\, char END:VCARD BEGIN:VCARD VERSION:3.0 URL:http://john.doe.com TITLE:Senior Tester ORG:Test Inc. ROLE:professional test case X-EVOLUTION-MANAGER:John Doe Senior X-EVOLUTION-ASSISTANT:John Doe Junior NICKNAME:user1 BDAY:2006-01-08 X-EVOLUTION-ANNIVERSARY:2006-01-09 X-EVOLUTION-SPOUSE:Joan Doe NOTE:This is a test case which uses almost all Evolution fields. FN:John Doe N:Doe;John;;; X-EVOLUTION-FILE-AS:Doe\, John CATEGORIES:TEST X-EVOLUTION-BLOG-URL:web log CALURI:calender FBURL:free/busy X-EVOLUTION-VIDEO-URL:chat X-MOZILLA-HTML:TRUE ADR;TYPE=PARCEL;TYPE=POSTAL;TYPE=WORK:;;Test Drive 2;Test Town;Upper Test County;12346;O ld Testovia LABEL;TYPE=PARCEL;TYPE=POSTAL;TYPE=WORK:Test Drive 2\nTest Town\, Upper Test County\n12346\nTest Bo x #2\nOld Testovia ADR;TYPE=PARCEL;TYPE=POSTAL;TYPE=HOME:;;Test Drive 1;Test Village;Lower Test County;1234 5;Testovia LABEL;TYPE=HOME:Test Drive 1\nTest Village\, Lower Test County\n12345\nTest Box #1\nTestovia ADR;TYPE=PARCEL;TYPE=POSTAL:;;Test Drive 3;Test Megacity;Test County;12347;New Testonia LABEL;TYPE=OTHER:Test Drive 3\nTest Megacity\, Test County\n12347\nTest Box #3\nNew Testonia UID:pas-id-43C0ED3900000001 EMAIL:john.doe@work.com EMAIL:john.doe@home.priv EMAIL:john.doe@other.world EMAIL:john.doe@yet.another.world TEL;TYPE=work;TYPE=Voice;X-EVOLUTION-UI-SLOT=1:business 1 TEL;TYPE=homE;TYPE=VOICE;X-EVOLUTION-UI-SLOT=2:home 2 TEL;TYPE=CELL;X-EVOLUTION-UI-SLOT=3:mobile 3 TEL;TYPE=FAX;X-EVOLUTION-UI-SLOT=4:businessfax 4 TEL;TYPE=FAX;X-EVOLUTION-UI-SLOT=5:homefax 5 TEL;TYPE=PAGER;X-EVOLUTION-UI-SLOT=6:pager 6 TEL;X-EVOLUTION-UI-SLOT=8:primary 8 X-AIM;X-EVOLUTION-UI-SLOT=1:AIM JOHN X-YAHOO;X-EVOLUTION-UI-SLOT=2:YAHOO JDOE X-ICQ;X-EVOLUTION-UI-SLOT=3:ICQ JD X-GROUPWISE;X-EVOLUTION-UI-SLOT=4:GROUPWISE DOE END:VCARD syncevolution-1.5/test/testcases/local.png0000666000373300001540000000027512326412404022301 0ustar00nightlynightly00000000000000‰PNG  IHDR[ñ~sRGB®Îé pHYs  šœtIMEÛÕB·ûtEXtCommentCreated with GIMPW*IDAT(ÏcüÏ€01ŒLi8‹Iô?‘ºQ•‘áÿh R,Í8BS*M9~ 3}IEND®B`‚syncevolution-1.5/test/README.Ovi0000644000373300001540000001216012326412403020106 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with Nokia Ovi server. http://bugzilla.moblin.org/show_bug.cgi?id=3182 * How to get the password Register your account at Ovi.com. Add your phone by Ovi.com->Login->Add Device. At the end of your adding device page, the synchronization configuration will be sent to your phone by mms but it also provides a 'Manual Setting' link which provides the synchronization password used to sync this device in case you could not receive the mms. Please use your Ovi user name and this per-device password for SyncEvolution. * The Ovi Server's device information Man=Intellisync Mod=- SwV=6.5.0.OVI.1033 HwV=- OEM=- DevID=Ovi.com DevTyp=server VerDTD=1.2 UTC= SupportLargeObjs=true SupportNumberOfChanges=true * Test Environment Variables Settings CLIENT_TEST_SERVER=Ovi \ CLIENT_TEST_DELETE_REFRESH=1 \ CLIENT_TEST_NUM_ITEMS=50 \ CLIENT_TEST_MAX_ITEM_SIZE=512\ CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ \ CLIENT_TEST_SKIP=Client::Sync::vcard30::testRefreshFromServerSync, \ Client::Sync::vcard30::testOneWayFromClient, \ Client::Sync::vcard30::testOneWayFromServer, \ Client::Sync::vcard30::testSlowSyncSemantic, \ Client::Sync::vcard30::testComplexRefreshFromServerSemantic, \ Client::Sync::vcard30::testDelete, \ Client::Sync::vcard30::testManyDeletes, \ Client::Sync::vcard30::testDeleteAllSync, \ Client::Sync::vcard30::testRetry,Client::Sync::vcard30::Suspend \ Client::Sync::calendar+task::testRefreshFromServerSync, \ Client::Sync::calendar+task::testOneWayFromClient, \ Client::Sync::calendar+task::testOneWayFromServer, \ Client::Sync::calendar+task::testSlowSyncSemantic, \ Client::Sync::calendar+task::testComplexRefreshFromServerSemantic, \ Client::Sync::calendar+task::testDelete, \ Client::Sync::calendar+task::testManyDeletes, \ Client::Sync::calendar+task::testDeleteAllSync, \ Client::Sync::calendar+task::testRetry,Client::Sync::vcard30::Suspend, \ Client::Sync::calendar+task::testDeleteAllRefresh, \ Client::Sync::calendar+task::testItemsXML, \ Client::Sync::calendar+task::testMaxMsg, \ Client::Sync::calendar+task::testLargeObject * Data formats we need to test: Client::Sync::vcard30 * Know Limitations in Ovi server: The server is unstable, during testing, it returns '400' error from time to time. The authentication process need 3 retries to success. Delete in normal sync (including two-way, one-way-from-client) does not effectively delete the data in the server, we can only use (refresh-from-client). because of this limitation, many cases failed. VCard30 -- The server does not accept entries without an empty REV field. -- Below properties are lost: X-AIM X-EVOLUTION-UI-SLOT FBURL CALURI -- 'FN' value mismatch -- 'X-EVOLUTION-FILE-AS' mismatch, the server adds '\' -- 'ADR' only support maximum two fields -- Several fields is accepted by the server but do not send back to client (PHOTO, URL, EMAIL). -- Character 'Tab' in Note will confuse the server and causing value mismatch * Known test failures: Client::Sync::vcard30 -- Client::Sync::vcard30::testRefreshFromServerSync, Client::Sync::vcard30::testComplexRefreshFromServerSemantic, Client::Sync::vcard30::testOneWayFromClient, Client::Sync::vcard30::testOneWayFromServer, Client::Sync::vcard30::testSlowSyncSemantic, Client::Sync::vcard30::testManyDeletes, Client::Sync::vcard30::testDelete, Client::Sync::vcard30::testDeleteAllSync, Client::Sync::vcard30::testRetry,Client::Sync::vcard30::Suspend Client::Sync::calendar+todo (vcalendar1.0) EVENTS: --All day event not supported --Yearly recur and Monthly recur event not supported --'attendee' not supported --The maxsize of an event items seems less than 512 (tested with MAX_ITEM_SIZE=512) TODO: --Lost properties: SEQUENCE, PERCENT-COMPLETE --MISMATCH properties: DTSTART, COMPLETED; TODO only supports date not datetime testDeleteAllRefresh, testItemsXML, testMaxMsg, testLargeObject these cases were tested OK sometime with serveral retires but the server is quite unstable and usually failed with an unexpected response. Also tried with icalendar 2.0 format which also works badly (all day event recognized but with one additional day added, events with VTimeZone rejected by server, some events have the closing date wrongly calculatd (seems treating DTEND as inclusive). Client::Sync::text Reject contents, No devinfo. Items sent from client is rejected by server. Adding a note from the web interface and try testFreshFromServerSync, the server sends 1 item with empty content thus also rejected by our client. syncevolution-1.5/test/README.funambol0000644000373300001540000000500612326412403021155 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with funambol server. http://bugzilla.moblin.org/show_bug.cgi?id=2422 * The Funambol Server's device information Funambol Data Synchronization Server v.7.1.1 Man=Funambol Mod=DS Server CarEd SwV=7.1.1 HwV=- FwV=- OEM=- DevID=funambol DevTyp=server VerDTD=1.2 UTC=true SupportLargeObjs=true SupportNumberOfChanges=true Ext=X-funambol-smartslow * Test Environment Variables Settings CLIENT_TEST_SERVER=funambol CLIENT_TEST_XML=1 CLIENT_TEST_MAX_ITEMSIZE=2048 \ CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ * Test Profiles Settings Make sure your calendar type is 'calendar:text/calendar!' and task type is 'tasks:text/calendar!' to force to use ical20 * Data formats we need to test: Client::Sync::vcard21 Client::Sync::ical20 Client::Sync::itodo20 Client::Sync::text * Know Limitations in Funambol server: VCard21 -- Below properties are lost: CALURI, FBURL, X-MOZILLA-HTML, X-EVOLUTION-FILE-AS, X-AIM, X-EVOLUTION-BLOG-URL, X-EVOLUTION-VIDEO-URL, X-GROUPWISE, X-ICQ, X-YAHOO, X-ASSISTANT -- The parameter 'X-EVOLUTION-URI-SLOT'of properties like 'TEL' and 'EMAIL' is lost -- 'ORG' loses 'office' -- 'TEL' has no concept of 'preferred' phone number ical20 -- Below properties are lost: UID, SEQUENCE, TRANSP, LAST-MODIFIED, X-EVOLUTION-ALARM-UID, RECURRENCE-ID, ATTENDEE -- Below properties(together with default values) are added by server: REPEAT:0 -- Below properties lose parameters by server: ORGANIZER(CN) http://forge.ow2.org/tracker/index.php?func=detail&aid=313968&group_id=96&atid=100096 -- If 'BYMONTHDAY' of 'RRULE' is not presented in 'monthly', funambol will generate a 'BYMONTHDAY' part automatically. itodo20 -- Below properties are lost: UID, SEQUENCE, TRANSP, LAST-MODIFIED, X-EVOLUTION-ALARM-UID, STATUS, URL, COMPLETED -- Below properties(together with default values) are added by server: CLASS:PUBLIC, PERCENT-COMPLETE:0 Both itodo20 and ical20: -- ACTION in VALARM is never sent although required by standard http://forge.ow2.org/tracker/index.php?func=detail&aid=313969&group_id=96&atid=100096 -- TRIGGER + relative alarm time is replaced with a fixed UTC date+time (wrong, fires only once for recurring meetings, ignores timezone changes) * Known test failures: Client::Sync::vcard21 -- NONE Client::Sync::ical20 -- Client::Sync::ical20::testItems Client::Sync::itodo20 -- NONE Client::Sync::text -- NONE syncevolution-1.5/test/README.google0000644000373300001540000000437512326412403020636 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with google server. http://bugzilla.moblin.org/show_bug.cgi?id=2423 * The google Server's device information Man=Google Mod=Sync SwV=0.01 HwV=- OEM=- DevID=Google DevTyp=server VerDTD=1.2 UTC= SupportLargeObjs=true SupportNumberOfChanges=true * Test Environment Variables Settings CLIENT_TEST_SERVER=google CLIENT_TEST_XML=0 CLIENT_TEST_MAX_ITEMSIZE=2048 \ CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ \ CLIENT_TEST_SKIP=Client::Sync::vcard21::testRefreshFromClientSync, \ Client::Sync::vcard21::testRefreshFromClientSemantic, \ Client::Sync::vcard21::testRefreshStatus, \ Client::Sync::vcard21::testOneWayFromClient, \ Client::Sync::vcard21::testItemsXML, \ Client::Sync::vcard21::testRetry,Client::Sync::vcard21::Suspend * Data formats we need to test: Client::Sync::vcard21 * Know Limitations in google server: Only supports Contact Sync over SyncML and only supports vcard2.1 format. Only supports WBXML for transmitting. Don't support one-way-from-client and refresh-from-client sync. Return 200(OK) instead of 201(Added) for replace operation from client. Delete operation does not permanently remove items. The server drops photos if they exceed a certain size. The limit is somewhere between 40KB (okay) and 80KB (dropped). VCard21 -- Below properties are lost: X-EVOLUTION-FILE-AS X-AIM X-EVOLUTION-UI-SLOT X-ANNIVERSARY X-ASSISTANT X-EVOLUTION-BLOG-URL X-EVOLUTION-VIDEO-URL X-GROUPWISE X-ICQ X-MANAGER X-SPOUSE X-MOZILLA-HTML X-YAHOO CATEGORIES NICKNAME BDAY URL FBURL CALURI ROLE -- 'FN' value mismatch -- 'NOTE' lost ';' -- 'TEL' do not support 'CAR' sub type -- 'ORG' lost ';' as the delimiter * Known test failures: Client::Sync::vcard21 -- Client::Sync::vcard21::testRefreshFromClientSync Client::Sync::vcard21::testRefreshFromClientSemantic Client::Sync::vcard21::testRefreshStatus Client::Sync::vcard21::testOneWayFromClient Client::Sync::vcard21::testItemsXML Client::Sync::vcard21::Retry Client::Sync::vcard21::Suspend syncevolution-1.5/test/README.googlecalendar0000644000373300001540000000237612326412403022327 0ustar00nightlynightly00000000000000Done via CalDAV. Running backend tests (no syncing): CLIENT_TEST_SIMPLE_UID=1 \ CLIENT_TEST_UNIQUE_UID=1 \ CLIENT_TEST_SERVER=google \ "CLIENT_TEST_WEBDAV=google caldav testcases=testcases/google_event.ics" \ ./client-test Client::Source "simple UID" needed because special characters like % confuse the server. "unique ID" works around issues with unintentionally restoring older revisions of the test cases (?). google_event.ics is derived from eds_event.ics and was modified to avoid test breakage because of the following changes seen in testImport (all caused by the server): * EST/DST timezone mapped to America/New_York, despite not having quite the same transition rules * all recurring events must have a time zone, UTC is not supported (but correctly converted into time zone of calendar) * BYMONTHDAY=6 is added in a sitatution were it is redundant (can be inferred from day of recurring event) * UNTIL clause turned into UTC * "DESCRIPTION:This is an event reminder" added to VALARM * CN property is replaced with lower case email * email address all lower case * ATTENDEE RSVP not supported * X-NUM-GUESTS added to ATTENDEE Changes dealt with in synccompare: * calendar owner is added as ATTENDEE to meetings, regardless whether it was meant to attend syncevolution-1.5/test/README.memotoo0000644000373300001540000001541112326412403021032 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with Memotoo server. http://bugzilla.moblin.org/show_bug.cgi?id=5635 * The Memotoo Server's device information Man=Memotoo.com Mod=SyncML SwV=2.14 HwV=- FwV=- OEM=- DevID=memotoo DevTyp=server VerDTD=1.2 UTC=- SupportLargeObjs=- SupportNumberOfChanges=- * Test Environment Variables Settings CLIENT_TEST_SERVER=memotoo CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ \ CLIENT_TEST_NUM_ITEMS=10 \ CLIENT_TEST_NOCHECK_SYNCMODE=1 \ CLIENT_TEST_SKIP=Client::Sync::vcard21::testRefreshFromClientSync, \ Client::Sync::vcard21::testRefreshFromClientSemantic, \ Client::Sync::vcard21::testRefreshStatus, \ Client::Sync::vcard21::testOneWayFromServer, \ Client::Sync::vcard21::Retry,Client::Sync::vcard21::Suspend, \ Client::Sync::vcard21::Resend, \ Client::Sync::ical20::testRefreshFromClientSync, \ Client::Sync::ical20::testRefreshFromClientSemantic, \ Client::Sync::ical20::testRefreshStatus, \ Client::Sync::ical20::testOneWayFromServer, \ Client::Sync::ical20::Retry,Client::Sync::ical20::Suspend, \ Client::Sync::ical20::Resend, \ Client::Sync::itodo20::testRefreshFromClientSync, \ Client::Sync::itodo20::testRefreshFromClientSemantic, \ Client::Sync::itodo20::testRefreshStatus, \ Client::Sync::itodo20::testOneWayFromServer, \ Client::Sync::itodo20::Retry,Client::Sync::itodo20::Suspend, \ Client::Sync::itodo20::Resend, \ Client::Sync::text::testRefreshFromClientSync, \ Client::Sync::text::testRefreshFromClientSemantic, \ Client::Sync::text::testRefreshStatus, \ Client::Sync::text::testOneWayFromServer, \ Client::Sync::text::Retry,Client::Sync::text::Suspend, \ Client::Sync::text::Resend * Test Profiles Settings N/A * Data formats we need to test: Client::Sync::vcard21 Client::Sync::ical20 Client::Sync::itodo20 Client::Sync::text * Known Limitations or issues in memotoo server: All -- If no data in memotoo server, it always initiates a slow sync. This causes failures of testRefreshFromClientSync,testRefreshFromClientSemantic, testRefreshStatus, testOneWayFromServer. vCard21 -- Below properties are not supported: CALURI, FBURL, ROLE, X-MOZILLA-HTML, X-EVOLUTION-FILE-AS,X-EVOLUTION-BLOG-URL, X-EVOLUTION-VIDEO-URL, X-ICQ, X-YAHOO -- Some extension properties are supported: X-AIM, X-ANNIVERSARY, X-ASSISTANT, X-MANAGER, X-SPOUSE -- The parameter 'X-EVOLUTION-URI-SLOT'of properties like 'TEL' and 'EMAIL' is lost -- 'PHOTO' is compressed by server but still be correct -- 'FN' is not reserved and is replaced by the composition of 'N' -- If 'ADR' has type information, then the last field value is lost -- All properties value has parser's bugs for escaped char "\;". This string is lost -- 'N' property lost "\;" if containing it -- ‘ORG’ only reserves its first and second fields ‘org name’ and 'department' -- 'URL' will be added 'TYPE=HOME' if no type information -- 'TEL' will be lost if it has only 'TYPE=PREF' information -- 'EMAIL' will be added 'TYPE=HOME' if no any type information -- For emails without type information, memotoo only preserves one of them -- If 'X-GROUPWISE' is present, CATEGORIES will be set as the value of 'X-GROUPWISE' instead -- For the string "=3D0D=3D0A", which is encoded for "=0D=0A", it could not be treated as "\n". ical20 -- Support iCalendar2.0 -- Below properties are not supported by server: UID, SEQUENCE, TRANSP, X-EVOLUTION-ALARM-UID, RECURRENCE-ID, ORGANIZER -- Timezone related information isn't kept on the server and relative date-time is converted into UTC time correctly, such as DTSTART, DTEND -- The 'UNTIL' component of the 'RRULE' property is converted to UTC time if it is floating time -- String "\\n" is interpreted as "\n" -- String "\\r" is interpreted as "" -- 'DESCRIPTION' in the 'VALARM' component is lost itodo20 -- Support iCalendar2.0 -- Below properties are not supported by server: UID, SEQUENCE, URL -- 'PERCENT-COMPLETE' is set as '0' by default if absent -- 'CLASS' value is always changed to 'private' by server -- 'PRIORITY': Server only accepts 5 values, '1', '3', '5', '7' and '9'. Others will be converted into these values. Default value is '5' text -- '<' and '>' in the plain text are converted to "<" and ">" separately * Known test failures: Client::Sync::vcard21 Client::Sync::vcard21::testRefreshFromClientSync, Client::Sync::vcard21::testRefreshFromClientSemantic, Client::Sync::vcard21::testRefreshStatus, Client::Sync::vcard21::testOneWayFromServer, Client::Sync::vcard21::Retry,Client::Sync::vcard21::Suspend, Client::Sync::vcard21::Resend, Client::Sync::ical20 Client::Sync::ical20::testRefreshFromClientSync, Client::Sync::ical20::testRefreshFromClientSemantic, Client::Sync::ical20::testRefreshStatus, Client::Sync::ical20::testOneWayFromServer, Client::Sync::ical20::Retry,Client::Sync::ical20::Suspend, Client::Sync::ical20::Resend, Client::Sync::itodo20 Client::Sync::itodo20::testRefreshFromClientSync, Client::Sync::itodo20::testRefreshFromClientSemantic, Client::Sync::itodo20::testRefreshStatus, Client::Sync::itodo20::testOneWayFromServer, Client::Sync::itodo20::Retry,Client::Sync::itodo20::Suspend, Client::Sync::itodo20::Resend, Client::Sync::text Client::Sync::text::testRefreshFromClientSync, Client::Sync::text::testRefreshFromClientSemantic, Client::Sync::text::testRefreshStatus, Client::Sync::text::testOneWayFromServer, Client::Sync::text::Retry,Client::Sync::text::Suspend, Client::Sync::text::Resend syncevolution-1.5/test/README.mobical0000644000373300001540000002005512326412403020761 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with Mobical server. http://bugzilla.moblin.org/show_bug.cgi?id=3009 * Password: beware that the Mobical SyncML password is *not* the same as the one for their web site. Log into mobical.net, the go to "my accounts >> configure new device >> manual settings" to find the SyncML credentials. * The Mobical Server's device information mobical Data Synchronization Server v.7.1.1 Man=Tactel AB Mod=Mobical Sync Server SwV=3.0 HwV=- FwV=- OEM=- DevID=http://www.mobical.net/sync/server DevTyp=server VerDTD=1.2 UTC=- SupportLargeObjs=- SupportNumberOfChanges=- * Test Environment Variables Settings CLIENT_TEST_SERVER=mobical CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ \ CLIENT_TEST_MAX_ITEMSIZE=1 \ CLIENT_TEST_NOCHECK_SYNCMODE=1 \ CLIENT_TEST_SKIP=Client::Sync::vcard21::testRefreshFromClientSync, \ Client::Sync::vcard21::testSlowSyncSemantic, \ Client::Sync::vcard21::testRefreshStatus, \ Client::Sync::vcard21::testDelete, \ Client::Sync::vcard21::testItemsXML, \ Client::Sync::vcard21::testOneWayFromServer, \ Client::Sync::vcard21::testOneWayFromClient, \ Client::Sync::vcard21::Retry,Client::Sync::vcard21::Suspend, \ Client::Sync::ical20::testRefreshFromClientSync, \ Client::Sync::ical20::testSlowSyncSemantic, \ Client::Sync::ical20::testRefreshStatus, \ Client::Sync::ical20::testDelete, \ Client::Sync::ical20::testItemsXML, \ Client::Sync::ical20::testOneWayFromServer, \ Client::Sync::ical20::testOneWayFromClient, \ Client::Sync::ical20::Retry,Client::Sync::ical20::Suspend, \ Client::Sync::itodo20::testRefreshFromClientSync, \ Client::Sync::itodo20::testSlowSyncSemantic, \ Client::Sync::itodo20::testRefreshStatus, \ Client::Sync::itodo20::testDelete, \ Client::Sync::itodo20::testItemsXML, \ Client::Sync::itodo20::testOneWayFromServer, \ Client::Sync::itodo20::testOneWayFromClient, \ Client::Sync::itodo20::Retry,Client::Sync::itodo20::Suspend, \ Client::Sync::text::testRefreshFromClientSync, \ Client::Sync::text::testSlowSyncSemantic, \ Client::Sync::text::testRefreshStatus, \ Client::Sync::text::testDelete, \ Client::Sync::text::testItemsXML, \ Client::Sync::text::testOneWayFromServer, \ Client::Sync::text::testOneWayFromClient, \ Client::Sync::text::Retry,Client::Sync::text::Suspend, \ disable "prevent slow sync" * Test Profiles Settings N/A * Data formats we need to test: Client::Sync::vcard21 Client::Sync::ical20 Client::Sync::itodo20 Client::Sync::text * Know Limitations in Mobical server: All -- If no data of any type of PIM in Mobical server, it always initiates a slow-sync. This causes failures of testSlowSyncSemantic, testRefreshStatus, testDelete, testOneWayFromServer,testRefreshFromClientSync. -- It fails in xml mode due to devinfo wrapped with cdata type This causes failure of testItemsXML. -- Server initiates a slow-sync when one client syncs with server in one-way-from-client mode from the second time. vCard21 -- Below properties are not supported: CALURI, CATEGORIES, FBURL, NICKNAME, X-MOZILLA-HTML, X-EVOLUTION-FILE-AS, X-AIM, X-ANNIVERSARY, X-SPOUSE, X-EVOLUTION-BLOG-URL, X-EVOLUTION-VIDEO-URL, X-GROUPWISE, X-ICQ, X-YAHOO, X-ASSISTANT -- The parameter 'X-EVOLUTION-URI-SLOT'of properties like 'TEL' and 'EMAIL' is lost -- 'FN' is not reserved and is replaced by server's composition of 'N' -- 'NOTE' length is less than 4000 -- vcard must have one of 'tel', 'email', or 'url','addr', otherwise, this vcard will not treat as a full item and server won't send them to client when sync -- 'ADR' if it has no type information, -- 'N' has parser's bugs for escaped char "\;" -- 'BDAY' is always one-day behind the date client sends to server -- ‘ORG’ property only reserves its first field ‘org name’ ical20 -- Only support vCalendar1.0 -- Only Below properties are support by server: DTSTART, DTEND, SUMMARY, DESCRIPTION, LOCATION, CATEGORIES, LAST-MODIFIED, DCREATED, CLASS, RRULE, EXRULE, RDATE, EXDATE, DTSTART, AALARM, DALARM -- Below properties are lost by server though they are in the support list: CLASS, AALARM, DALARM -- Below properties are not accepted but in our test: TRANSP, SEQUENCE,UID,RECURRENCE-ID, ATTENDEE,ORGANIZER -- Timezone related information is lost by server: TZ, DAYLIGHT -- DTSTART, DTEND: if no timezone information and their value are not UTC time, server will convert them into UTC time according to your account timezone information -- If RRULE is 'yearly', server converts it into dayofyear mode. That is not supported by synthesis -- The 'UNTIL' component of the 'RRULE' property is converted to UTC time if it is floating time -- The value of 'EXDATE' property is converted to UTC time if it is floating time itodo20 -- Only support vCalendar1.0 -- Only below properties are supported by server: DUE, COMPLETED, LAST-COMPLETED, DCREATED, DALARM, AALARM, DESCRIPTION, SUMMARY, STATUS, CATEGORIES, PRIORITY -- 'PRIORITY': if value is '0', it is lost by server -- Below properties are not accepted but in our test: UID, DTSTART,PERCENT-COMPLETE,SEQUENCE, URL, CLASS text -- N/A -- All-day events are not supported. The server is sent such events as DTSTART/END 00:00:00/23:59:59 floating time and returns them with shifted times (DTSTART 22:00:00 UTC on a different day). This cannot be recognized as an all-day event anymore by the client. -- For the same reason, exceptions to a recurring meeting may shift during synchronization (EXDATE:20001231 -> EXDATE:20001230T220000Z). * Known test failures: Client::Sync::vcard21 -- Client::Sync::vcard21::testRefreshFromClientSync Client::Sync::vcard21::testRefreshStatus Client::Sync::vcard21::testSlowSyncSemantic Client::Sync::vcard21::testDelete Client::Sync::vcard21::testItemsXML Client::Sync::vcard21::testOneWayFromServer Client::Sync::vcard21::Retry Client::Sync::vcard21::Suspend Client::Sync::ical20 -- Client::Sync::ical20::testRefreshFromClientSync Client::Sync::ical20::testRefreshStatus Client::Sync::ical20::testSlowSyncSemantic Client::Sync::ical20::testDelete Client::Sync::ical20::testItemsXML Client::Sync::ical20::testOneWayFromServer Client::Sync::ical20::Retry Client::Sync::ical20::Suspend Client::Sync::itodo20 -- Client::Sync::itodo20::testRefreshFromClientSync Client::Sync::itodo20::testRefreshStatus Client::Sync::itodo20::testSlowSyncSemantic Client::Sync::itodo20::testDelete Client::Sync::itodo20::testOneWayFromServer Client::Sync::itodo20::testItemsXML Client::Sync::itodo20::Retry Client::Sync::itodo20::Suspend Client::Sync::text -- Client::Sync::text::testRefreshFromClientSync Client::Sync::text::testRefreshStatus Client::Sync::text::testSlowSyncSemantic Client::Sync::text::testDelete Client::Sync::text::testOneWayFromServer Client::Sync::text::testItemsXML Client::Sync::text::Retry Client::Sync::text::Suspend syncevolution-1.5/test/README.nokia_7210c0000644000373300001540000000510512326412403021267 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with Nokia phone 7210c. * Nokia 7210c's (S40 5the) device information Man=Nokia Mod=Nokia 7210c SwV=V 05.60 10-12-08 RM-436 (c) N.. FwV=V 05.60 10-12-08 RM-436 (c) N.. Hwv=1001 DevID=Phone's device id DevTyp=phone VerDTD=1.2 UTC=- SupportLargeObjs=true SupportNumberOfChanges=true * Test Environment Variables Settings CLIENT_TEST_SERVER=nokia_7210c CLIENT_TEST_XML=0 CLIENT_TEST_NOCHECK_SYNCMOD=1\ CLIENT_TEST_DELAY=3 CLIENT_TEST_MAX_ITEM_SIZE=512 CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ CLIENT_TEST_NOCHECK_SYNCSTATS=1 CLIENT_TEST_MODE=server CLIENT_TEST_FORCESLOW=1 CLIENT_TEST_NOREFRESH=1 CLIENT_TEST_NOUTC=1 * Data formats we need to test: vcard21 vcal1.0 * Know Limitations: Only supports WBXML for transmitting. Don't support refresh-from-client and refresh-from-server sync. Treat one-way-from-client and one-way-from-server the same as two-way sync. VCard21 'NOTE' has a limited size, about 80 characters, add/lost spaces in between. 'DESCRIPTION' add/lost spaces in between. supoprts only one 'ADR', 'type' in 'ADR' is lost, only preserves one line. supports three 'EMAIL', 'type' and 'X-EVOLUTION-UI-SLOT' lost. supports 5 'TEL' sometimes add a default 'unknown' photo. -- Below properties are lost: X-MOZILLA-HTML NICKNAME CALURL CATEGORIES FBURL ROLE X-AIM X-ANNIVERSARY X-ASSISTANT X-EVOLUTION-BLOG-URL X-EVOLUTION-VIDEO-URL X-GROUPWISE X-ICQ X-MANAGER X-SPOUSE X-YAHOO -- 'TEL' value do not preserve non-digits, add type=PREF by default. -- 'N' mismatch, sometimes lost part of the value -- 'ORG' only stores the first component. -- 'X-EVOLUTION-FILE-AS' value incorrect * Known test failures: Not supported/applicable test: testConversion testComplexRefreshFromServer testDeleteAllRefresh testSlowSync testSlowSyncSemantic testRefresh* testOneWay* testMerge testManyDeletes testManyItems testItemsXML VCal1.0 VEVENT: 'DESCRIPTION' add/lost spaces in between. UTC time is supported by the phone though it does not declare in DevInf. (It correctly parse UTC time but will not rely with UTC time). Add 'CATEGORIES' by default as 'MEETING', 'PRIORITY' by default '0' VTODO: 'PRIORITY' , 'CATEGORIES' and 'STATUS' value mismatch. Don't support 'ORGANIZER' 'ALARM' is not recognized. Lost 'DTSTART' * Known test failures: Not supported/applicable test: testConversion testComplexRefreshFromServer testDeleteAllRefresh testSlowSync testSlowSyncSemantic testRefresh* testOneWay* testMerge testManyDeletes testManyItems testItemsXML syncevolution-1.5/test/README.qtcontacts0000644000373300001540000000354612326412403021544 0ustar00nightlynightly00000000000000This document is used to show the limitation of qtcontacts and interoperability test information between Buteo and Google. QtContacts -- Below properties are not supported in Qtcontacts: X-AIM, X-GROUPWISE, X-ICQ, X-YAHOO, FBURL, CALURI, LOGO, LABEL -- Other Qtcontacts limitations X-GENDER: Male or Female, first letter in upper-case, others in lower-case TEL: type [HOME | WORK] and [VOICE | FAX | PAGER] are mandantory ADR: type POSTAL is mandantory EMAIL: type INTERNET is not supported ORG: only value of the first field in organization are supported VCard30 (interoperability) -- Google contacts limitations Below properties can be set on web page and are kept by Google but are not transferred when doing sync: Birthday, Anniversary, Home-URL, Profile-URL, Blog-URL, Work-URL, Relationship, AIM, Google Talk, Yahoo, Skype, QQ, MSN, ICQ, Jabber, Phonetic Name, File As. ADR: Once updated on Google web page, its value is empty if doing sync with client. TEL doesn't support TYPE PAGER. But 'TYPE VOICE' is added by default. BDAY, X-GENDER, X-ASSISTANT, X-ASSISTANT-TEL, URL and X-SIP are kept by Google, but they are not shown in Google web page. X-IMPP, CATEGORIES, X-NICKNAME and ROLE are not supported, thus not keep them * Known test failures: Client::Sync::vcard21 -- Client::Sync::qt_vcard30::testDeleteAllRefresh Client::Sync::qt_vcard30::testRefreshFromClientSync Client::Sync::qt_vcard30::testConversion Client::Sync::qt_vcard30::testRefreshFromClientSemantic Client::Sync::qt_vcard30::testRefreshStatus Client::Sync::qt_vcard30::testComplexUpdate Client::Sync::qt_vcard30::testItemsXML Client::Sync::qt_vcard30::testOneWayFromServer Client::Sync::qt_vcard30::testOneWayFromClient syncevolution-1.5/test/README.scheduleworld0000644000373300001540000000045312326412403022217 0ustar00nightlynightly00000000000000Very complete support for Evolution data. No known lost properties at this time. Interrupted sync sessions are not resumed. Instead the server falls back to a slow sync, which may lead to duplicates (Bugzilla #3733). Resuming from a failed sync is currently only supported by the Synthesis server. syncevolution-1.5/test/README.syncevolution-server0000644000373300001540000000502212326412403023575 0ustar00nightlynightly00000000000000Here are some quick (and probably incomplete) notes about setting up SyncEvolution as HTTP server for client-test runs using just the local account and machine. # 1. run client-test like this: CLIENT_TEST_SERVER=syncevolution --help # 2. set the URL (using IPv4 here, in case that "localhost" expands to IPv6, which # can be problematic): for i in 1 2; do syncevolution --configure --sync-property syncURL=http://127.0.0.1:9000/syncevolution syncevolution_$i done # 3. configure the server, using a separate context with the four standard URIs # implemented via files in /tmp, no credential checking, maximum message size # which forces the clients to split items (makes testInterruptResume*Big more # interesting), low timeout to keep tests going quickly, with device IDs as # set by client-test-app.cpp in step 1: for i in 1 2; do syncevolution --configure --template SyncEvolutionClient \ --sync-property username= \ --sync-property password= \ --sync-property maxMsgSize=20000 \ --sync-property RetryDuration=20 \ syncevolution_client_$i@server done syncevolution --configure \ --source-property type=file:text/vcard:3.0 \ --source-property evolutionsource=file:///tmp/server_addressbook \ @server addressbook syncevolution --configure \ --source-property type=file:text/calendar:2.0 \ --source-property evolutionsource=file:///tmp/server_calendar \ @server calendar syncevolution --configure \ --source-property type=file:text/plain:1.0 \ --source-property evolutionsource=file:///tmp/server_memo \ @server memo syncevolution --configure \ --source-property type=file:text/calendar:2.0 \ --source-property evolutionsource=file:///tmp/server_todo \ @server todo syncevolution --configure --sync-property remoteDeviceId=sc-api-nat syncevolution_client_1@server syncevolution --configure --sync-property remoteDeviceId=sc-pim-ppc syncevolution_client_2@server # 4. run the syncevo-dbus-server (necessary when not installed): syncevo-dbus-server -d 1000000 & # 5. run http server: syncevo-http-server http://localhost:9000/syncevolution & # 6. run testing, here using again file backends: CLIENT_TEST_SERVER=syncevolution \ CLIENT_TEST_RETRY=t CLIENT_TEST_RESEND=t CLIENT_TEST_SUSPEND=t \ CLIENT_TEST_SOURCES=file_vcard30,file_ical20 \ CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test_ \ client-test syncevolution-1.5/test/README.yahoo0000644000373300001540000000174112326412403020473 0ustar00nightlynightly00000000000000CardDAV ======= Not usable at the moment. Several valid test cases cause the server to fail with a 500 error (Source::testImport) Other test cases with special characters have these characters replaced. Tests pass only because all the problematic test cases were removed. See git log for testcases/yahoo_contact.vcf. Other data changes seen in server: * first component in ADR removed * TYPE=CAR not supported in TEL, complete entry removed * TYPE=PREF stripped from TEL * TYPE=PARCEL;TYPE=POSTAL added to all ADRs * no distinction between TYPE=HOME,FAX and TYPE=WORK,FAX, both become TYPE=FAX * no TYPE at all for EMAIL * only one level in ORG It works a bit better with vCards encoded by Synthesis (Sync::testItems): there's no 500 error. Apparently line folding (enabled in Source::testImport test cases, disabled during sync) is something that the server has problems with. But photos still get lost. Results for non-ASCII characters is inconclusive; testing is currently disabled. syncevolution-1.5/test/README.zyb0000644000373300001540000000174312326412403020162 0ustar00nightlynightly00000000000000This document is used to show interoperability test information with zyb server. http://bugzilla.moblin.org/show_bug.cgi?id=2424 * The zyb Server's device information ZYB HTTP SyncML Server Version:3.9.18 Build:3.9.18b572 * Test Environment Variables Settings CLIENT_TEST_SERVER=zyb CLIENT_TEST_EVOLUTION_PREFIX=file:///tmp/test/ * Test Profiles Settings -- N/A * Data formats we need to test: -- Client::Sync::vcard21 * Know Limitations in ZYB server: VCard21 -- Only below properties are accepted: FN, N, PHOTO, BDAY, ADR, LABEL, TEL, EMAIL, TZ, GEO, TITLE, ROLE, LOGO, ORG, NOTE, REV, SOUND, URL -- The property 'N' parser error: treat "\;" as the delimiter -- The property 'ADR': if it is long, three extra chars '\r', '\n' and ' 'will be added in the property value. -- Server does escaped text processing, e.g, "<\;" is converted to "<" -- Server sends mismatch anchors between two sync even if there is no failure. * Known test failures: -- NONE syncevolution-1.5/test/syncevo-http-server-logging.conf0000644000373300001540000000260212326412404024735 0ustar00nightlynightly00000000000000# Logging configuration for a syncevo-http-server. Writes log files # into the current directory, with rotation. Log levels are chosen so # that important messages (>= INFO) are shown on the console and # written info syncevo-http-server.log. # # The console output is similar to that of the SyncEvolution command # line whereas the one for files includes a data. # # See http://docs.python.org/library/logging.html#configuration-file-format [loggers] # root = collects messages from other modules # twisted = generic HTTP server framework # syncevo-http = syncevo-http-server output # sync = normal SyncEvolution output keys=root,twisted,syncevo_http,sync [handlers] keys=consoleHandler,fileHandler [formatters] keys=consoleFormatter,fileFormatter [logger_root] level=NOTSET handlers=consoleHandler,fileHandler [logger_twisted] level=NOTSET handlers= propagate=1 qualname=twisted [logger_syncevo_http] level=NOTSET handlers= propagate=1 qualname=syncevo-http [logger_sync] level=NOTSET handlers= propagate=1 qualname=sync [handler_consoleHandler] class=StreamHandler level=INFO formatter=consoleFormatter args=(sys.stdout,) [handler_fileHandler] class=FileHandler level=INFO formatter=fileFormatter args=('syncevo-http-server.log', 'w') [formatter_consoleFormatter] format=[%(levelname)s] %(name)s: %(message)s [formatter_fileFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s syncevolution-1.5/test/abort-redirect.cpp0000644000373300001540000000400012326412403022076 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Patrick Ohly * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include SE_BEGIN_CXX int main(int argc, char **argv) { // Check that we catch stderr message generated // while the process shut down. We assume that // libc detects double frees. The expected // outcome of this program is that the message // appears in abort-redirect.log instead of // stderr. A core file should be written normally. LogRedirect redirect; LoggerStdout out(fopen("abort-redirect.log", "w")); out.pushLogger(&out); // write without explicit flushing fprintf(stdout, "a normal info message, also redirected"); // cause libc error and abort: for small chunks // glibc tends to detect double frees while large // chunks are done as mmap()/munmap() and just // segfault void *small = malloc(1); free(small); // cppcheck-suppress deallocDealloc // cppcheck-suppress doubleFree // cppcheck-suppress uninitvar free(small); void *large = malloc(1024 * 1024); free(large); // cppcheck-suppress deallocDealloc // cppcheck-suppress doubleFree // cppcheck-suppress uninitvar free(large); return 0; } SE_END_CXX syncevolution-1.5/test/ClientTest.h0000644000373300001540000011644312414460504020735 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008 Funambol, Inc. * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_TESTSYNCCLIENT #define INCL_TESTSYNCCLIENT #include #include #include #include #include #include #include #include #include #include "test.h" #include "ClientTestAssert.h" #ifdef ENABLE_INTEGRATION_TESTS #include #include #include #include #include #include #include SE_BEGIN_CXX class SyncContext; class EvolutionSyncSource; class TransportWrapper; class TestingSyncSource; /** * This class encapsulates logging and checking of a SyncReport. * When constructed with default parameters, no checking will be done. * Otherwise the sync report has to contain exactly the expected result. * When multiple sync sources are active, @b all of them have to behave * alike (which is how the tests are constructed). * * No item is ever supposed to fail. */ class CheckSyncReport { public: CheckSyncReport(int clAdded = -1, int clUpdated = -1, int clDeleted = -1, int srAdded = -1, int srUpdated = -1, int srDeleted = -1, bool mstSucceed = true, SyncMode mode = SYNC_NONE) : clientAdded(clAdded), clientUpdated(clUpdated), clientDeleted(clDeleted), serverAdded(srAdded), serverUpdated(srUpdated), serverDeleted(srDeleted), restarts(0), mustSucceed(mstSucceed), syncMode(mode), m_report(NULL) {} int clientAdded, clientUpdated, clientDeleted, serverAdded, serverUpdated, serverDeleted; int restarts; bool mustSucceed; SyncMode syncMode; // if set, then the report is copied here SyncReport *m_report; CheckSyncReport &setMode(SyncMode mode) { syncMode = mode; return *this; } CheckSyncReport &setReport(SyncReport *report) { m_report = report; return *this; } CheckSyncReport &setRestarts(int r) { restarts = r; return *this; } /** * checks that the sync completed as expected and throws * CPPUnit exceptions if something is wrong * * @param res return code from SyncClient::sync() * @param report the sync report stored in the SyncClient */ void check(SyncMLStatus status, SyncReport &report) const; /** * checks that the source report matches with expectations */ void check(const std::string &name, const SyncSourceReport &report) const; }; /** * parameters for running a sync */ struct SyncOptions { /** default maximum message size */ static const long DEFAULT_MAX_MSG_SIZE = 128 * 1024; /** default maximum object size */ static const long DEFAULT_MAX_OBJ_SIZE = 1024 * 1024 * 1024; /** sync mode chosen by client */ SyncMode m_syncMode; /** * has to be called after a successful or unsuccessful sync, * will dump the report and (optionally) check the result; * beware, the later may throw exceptions inside CPPUNIT macros */ CheckSyncReport m_checkReport; /** maximum message size supported by client */ long m_maxMsgSize; /** maximum object size supported by client */ long m_maxObjSize; /** enabled large object support */ bool m_loSupport; /** enabled WBXML (default) */ bool m_isWBXML; /** overrides resend properties */ int m_retryDuration; int m_retryInterval; boost::shared_ptr m_isSuspended; boost::shared_ptr m_isAborted; /** * Callback to be invoked after setting up local sources, but * before running the engine. May throw exception to indicate * error and return true to stop sync without error. */ typedef boost::function Callback_t; Callback_t m_startCallback; /** * called while configuration is prepared for sync, see * SyncContext::prepare() */ Callback_t m_prepareCallback; boost::shared_ptr m_transport; SyncOptions(SyncMode syncMode = SYNC_NONE, const CheckSyncReport &checkReport = CheckSyncReport(), long maxMsgSize = DEFAULT_MAX_MSG_SIZE, // 128KB = large enough that normal tests should run with a minimal number of messages long maxObjSize = DEFAULT_MAX_OBJ_SIZE, // 1GB = basically unlimited... bool loSupport = false, bool isWBXML = defaultWBXML(), Callback_t startCallback = EmptyCallback, boost::shared_ptr transport = boost::shared_ptr()) : m_syncMode(syncMode), m_checkReport(checkReport), m_maxMsgSize(maxMsgSize), m_maxObjSize(maxObjSize), m_loSupport(loSupport), m_isWBXML(isWBXML), m_retryDuration(300), m_retryInterval(60), m_startCallback(startCallback), m_transport (transport) {} SyncOptions &setSyncMode(SyncMode syncMode) { m_syncMode = syncMode; return *this; } SyncOptions &setCheckReport(const CheckSyncReport &checkReport) { m_checkReport = checkReport; return *this; } SyncOptions &setMaxMsgSize(long maxMsgSize) { m_maxMsgSize = maxMsgSize; return *this; } SyncOptions &setMaxObjSize(long maxObjSize) { m_maxObjSize = maxObjSize; return *this; } SyncOptions &setLOSupport(bool loSupport) { m_loSupport = loSupport; return *this; } SyncOptions &setWBXML(bool isWBXML) { m_isWBXML = isWBXML; return *this; } SyncOptions &setRetryDuration(int retryDuration) { m_retryDuration = retryDuration; return *this; } SyncOptions &setRetryInterval(int retryInterval) { m_retryInterval = retryInterval; return *this; } SyncOptions &setStartCallback(const Callback_t &callback) { m_startCallback = callback; return *this; } SyncOptions &setPrepareCallback(const Callback_t &callback) { m_prepareCallback = callback; return *this; } SyncOptions &setTransportAgent(const boost::shared_ptr transport) {m_transport = transport; return *this;} static bool EmptyCallback(SyncContext &, SyncOptions &) { return false; } /** if CLIENT_TEST_XML=1, then XML, otherwise WBXML */ static bool defaultWBXML(); }; class LocalTests; class SyncTests; /** * This is the interface expected by the testing framework for sync * clients. It defines several methods that a derived class must * implement if it wants to use that framework. Note that this class * itself is not derived from SyncClient. This gives a user of this * framework the freedom to implement it in two different ways: * - implement a class derived from both SyncClient and ClientTest * - add testing of an existing subclass of SyncClient by implementing * a ClientTest which uses that subclass * * The client is expected to support change tracking for multiple * servers. Although the framework always always tests against the * same server, for most tests it is necessary to access the database * without affecting the next synchronization with the server. This is * done by asking the client for two different sync sources via * Config::createSourceA and Config::createSourceB which have to * create them in a suitable way - pretty much as if the client was * synchronized against different server. A third, different change * tracking is needed for real synchronizations of the data. * * Furthermore the client is expected to support multiple data sources * of the same kind, f.i. two different address books. This is used to * test full client A <-> server <-> client B synchronizations in some * tests or to check server modifications done by client A with a * synchronization against client B. In those tests client A is mapped * to the first data source and client B to the second one. * * Handling configuration and creating classes is entirely done by the * subclass of ClientTest, the frameworks makes no assumptions * about how this is done. Instead it queries the ClientTest for * properties (like available sync sources) and then creates several * tests. */ class ClientTest : private boost::noncopyable { public: ClientTest(int serverSleepSec = 0, const std::string &serverLog= ""); virtual ~ClientTest(); /** a unique string - "1" or "2" in practice */ virtual std::string getClientID() const = 0; /** set up before running a test */ virtual void setup() { } /** cleanup function to be called when shutting down testing */ typedef void (*Cleanup_t)(void); /** * Call this to register another shutdown cleanup functions. * Every unique function will be called exactly once. */ static void registerCleanup(Cleanup_t cleanup); /** * Call cleanup functions. */ static void shutdown(); /** * This function registers tests using this instance of ClientTest for * later use during a test run. * * The instance must remain valid until after the tests were * run. To run them use a separate test runner, like the one from * client-test-main.cpp. */ virtual void registerTests(); typedef ClientTestConfig Config; /** * Creates an instance of LocalTests (default implementation) or a * class derived from it. LocalTests provides tests which cover * the SyncSource interface and can be executed without a SyncML * server. It also contains utility functions for working with * SyncSources. * * A ClientTest implementation can, but doesn't have to extend * these tests by instantiating a derived class here. */ virtual LocalTests *createLocalTests(const std::string &name, int sourceParam, ClientTest::Config &co); /** * Creates an instance of SyncTests (default) or a class derived * from it. SyncTests provides tests which cover the actual * interaction with a SyncML server. * * A ClientTest implementation can, but doesn't have to extend * these tests by instantiating a derived class here. */ virtual SyncTests *createSyncTests(const std::string &name, std::vector sourceIndices, bool isClientA = true); /** * utility function for dumping items which are C strings with blank lines as separator */ static int dump(ClientTest &client, TestingSyncSource &source, const std::string &file); /** * utility function for splitting file into items with blank lines as separator * * @retval realfile If ..tem exists, then it is used instead * of the generic version. The caller gets the name of the * file that was opened here. */ static void getItems(const std::string &file, std::list &items, std::string &realfile); /** * utility function for importing items with blank lines as separator, * for ClientTestConfig::m_import */ static std::string import(ClientTest &client, TestingSyncSource &source, const ClientTestConfig &config, const std::string &file, std::string &realfile, std::list *luids); /** * utility function for comparing vCard and iCal files with the external * synccompare.pl Perl script */ static bool compare(ClientTest &client, const std::string &fileA, const std::string &fileB); /** * utility function: update a vCard or iCalendar item by inserting "MOD-" into * FN, N, resp. SUMMARY; used for ClientTestConfig::update */ static void update(std::string &item); struct ClientTestConfig config; /** * A derived class can use this call to get default test * cases, but still has to add callbacks which create sources * and execute a sync session. * * Some of the test cases are compiled into the library, other * depend on the auxiliary files from the "test" directory. * Currently supported types: * - eds_contact = vCard 3.0 contacts, with Evolution extensions * - eds_event = iCalendar 2.0 events, as used by Evolution * - eds_task = iCalendar 2.0 tasks, as used by Evolution * - eds_memo = iCalendar 2.0 journals, as used by Evolution */ static void getTestData(const char *type, Config &config); /** * Data sources are enumbered from 0 to n-1 for the purpose of * testing. This call returns n. */ virtual int getNumLocalSources() = 0; virtual int getNumSyncSources() = 0; /** * Called to fill the given test source config with information * about a sync source identified by its index. It's okay to only * fill in the available pieces of information and set everything * else to zero. * Two kinds of source config indexs are maintained, used for localSources * and SyncSources, this is because virtual datasoures should be visible as * a whole to the synccontext while should be viewed as a list of sub * datasoures for Localtests. */ virtual void getLocalSourceConfig(int source, Config &config) = 0; virtual void getSyncSourceConfig(int source, Config &config) = 0; /** * Find the correspoding test source config via config name. */ virtual void getSourceConfig(const string &configName, Config &config) =0; /* * Give me a test source config name, return the index in localSyncSources. * */ virtual int getLocalSourcePosition (const string &configName) =0; /** * The instance to use as second client. Returning NULL disables * all checks which require a second client. The returned pointer * must remain valid throughout the life time of the tests. * * The second client must be configured to access the same server * and have data sources which match the ones from the primary * client. */ virtual ClientTest *getClientB() = 0; /** * Execute a synchronization with the selected sync sources * and the selected synchronization options. The log file * in LOG has been set up already for the synchronization run * and should not be changed by the client. * * @param activeSources a -1 terminated array of sync source indices * @param logbase basename for logging: can be used for directory or as file (by adding .log suffix) * @param options sync options to be used * @return return code of SyncClient::sync() */ virtual SyncMLStatus doSync( const int *activeSources, const std::string &logbase, const SyncOptions &options) = 0; /** * This is called after successful sync() calls (res == 0) as well * as after unsuccessful ones (res != 1). The default implementation * sleeps for the number of seconds specified when constructing this * instance and copies the server log if one was named. * * @param res result of sync() * @param logname base name of the current sync log (without ".client.[AB].log" suffix) */ virtual void postSync(int res, const std::string &logname); protected: /** * time to sleep in postSync() */ int serverSleepSeconds; /** * server log file which is copied by postSync() and then * truncated (Unix only, Windows does not allow such access * to an open file) */ std::string serverLogFileName; private: /** * really a CppUnit::TestFactory, but declared as void * to avoid * dependencies on the CPPUnit header files: created by * registerTests() and remains valid until the client is deleted */ void *factory; void freeFactory(); }; /** * helper class to encapsulate ClientTest::Config::createsource_t * pointer and the corresponding parameters */ class CreateSource { public: CreateSource(const ClientTest::Config::createsource_t &createSourceParam, ClientTest &clientParam, int sourceParam, bool isSourceAParam) : createSource(createSourceParam), client(clientParam), source(sourceParam), isSourceA(isSourceAParam) {} TestingSyncSource *operator() () { CPPUNIT_ASSERT(createSource); return createSource(client, client.getClientID(), source, isSourceA); } const ClientTest::Config::createsource_t createSource; ClientTest &client; const int source; const bool isSourceA; }; /** * local test of one sync source and utility functions also used by * sync tests */ class LocalTests : public CppUnit::TestSuite, public CppUnit::TestFixture { public: /** the client we are testing */ ClientTest &client; /** number of the source we are testing in that client */ const int source; /** configuration that corresponds to source */ const ClientTest::Config config; /** shortcut for config.m_sourceName */ const std::string &getSourceName() const { return config.m_sourceName; } /** * A list of config pointers which share the same * database. Normally, sources are tested in isolation, but for * such linked sources we also need to test interdependencies, in * particular regarding change tracking and item listing. * * This includes *all* configs, not just the other ones. */ std::list m_linkedSources; /** helper funclets to create sources */ CreateSource createSourceA, createSourceB; LocalTests(const std::string &name, ClientTest &cl, int sourceParam, ClientTest::Config &co) : CppUnit::TestSuite(name), client(cl), source(sourceParam), config(co), createSourceA(co.m_createSourceA, cl, sourceParam, true), createSourceB(co.m_createSourceB, cl, sourceParam, false) {} /** set up before running a test */ virtual void setUp() { client.setup(); } /** * adds the supported tests to the instance itself; * this is the function that a derived class can override * to add additional tests */ virtual void addTests(); /** * opens source and inserts the given item; can be called * regardless whether the data source already contains items or not * * @param relaxed if true, then disable some of the additional checks after adding the item * @retval inserted actual data that was inserted, optional * @param uniqueUIDSuffix gets added to UID of the inserted item if unique UIDs are necessary * @return the LUID of the inserted item */ virtual std::string insert(CreateSource createSource, const std::string &data, bool relaxed = false, std::string *inserted = NULL, const std::string &uniqueUIDSuffix = ""); /** * assumes that exactly one element is currently inserted and updates it with the given item * * @param check if true, then reopen the source and verify that the reported items are as expected * @param uniqueUIDSuffix same UID suffix as when creating the item */ virtual void update(CreateSource createSource, const std::string &data, bool check = true, const std::string &uniqueUIDSuffix = ""); /** * updates one item identified by its LUID with the given item * * The type of the item is cleared, as in insert() above. */ virtual void update(CreateSource createSource, const std::string &data, const std::string &luid); /** deletes all items locally via sync source */ virtual void deleteAll(CreateSource createSource); /** * takes two databases, exports them, * then compares them using synccompare * * @param refFile existing file with source reference items, NULL uses a dump of sync source A instead * @param copy a sync source which contains the copied items, begin/endSync will be called * @param raiseAssert raise assertion if comparison yields differences (defaults to true) * @return true if the two databases are equal */ virtual bool compareDatabases(const char *refFile, TestingSyncSource ©, bool raiseAssert = true); /** * compares data using synccompare * * @param refFile existing file with source reference items * @param actualFile existing file with actual items which are expected to match * @param raiseAssert raise assertion if comparison yields differences (defaults to true) * @return true if the two databases are equal */ bool compareDatabases(const std::string &refFile, const std::string &actualFile, bool raiseAssert = true); /** * compare data in source with set of items */ void compareDatabasesRef(TestingSyncSource ©, const std::list &items); /** * compare data in source with vararg list of std::string pointers, NULL terminated */ void compareDatabases(TestingSyncSource *copy, ...); /** * insert artificial items, number of them determined by TEST_EVOLUTION_NUM_ITEMS * unless passed explicitly * * @param createSource a factory for the sync source that is to be used * @param startIndex IDs are generated starting with this value * @param numItems number of items to be inserted if non-null, otherwise TEST_EVOLUTION_NUM_ITEMS is used * @param size minimum size for new items * @return number of items inserted */ virtual std::list insertManyItems(CreateSource createSource, int startIndex = 1, int numItems = 0, int size = -1); virtual std::list insertManyItems(TestingSyncSource *source, int startIndex = 1, int numItems = 0, int size = -1); /** * Update existing items. Must match a corresponding previous call to * insertManyItems(). * * @param revision revision number, used to distinguish different generations of each item * @param luids result from corresponding insertManyItems() call * @param offset skip that many items at the start of luids before updating the following ones */ void updateManyItems(CreateSource createSource, int startIndex, int numItems, int size, int revision, std::list &luids, int offset); /** * Delete items. Skips offset items in luids before deleting numItems. */ void removeManyItems(CreateSource createSource, int numItems, std::list &luids, int offset); /** * update every single item, using config.update */ virtual void updateData(CreateSource createSource); /** * create an artificial item for the current database * * @param item item number: items with different number should be * recognized as different by SyncML servers * @param revision differentiates items with the same item number (= updates of an older item) * @param size if > 0, then create items at least that large (in bytes) * @return created item */ std::string createItem(int item, const std::string &revision, int size); std::string createItem(int item, int revision, int size) { char buffer[32]; sprintf(buffer, "%d", revision); return createItem(item, std::string(buffer), size); } /* for more information on the different tests see their implementation */ virtual void testOpen(); virtual void testIterateTwice(); virtual void testDelete404(); virtual void testReadItem404(); void doInsert(bool withUID = true); virtual void testSimpleInsert(); virtual void testLocalDeleteAll(); virtual void testComplexInsert(); virtual void testInsertTwice(); virtual void testLocalUpdate(); void doChanges(bool restart); virtual void testChanges(); virtual void testChangesMultiCycles(); virtual void testLinkedSources(); void doImport(const std::string &testcases); virtual void testImport(); virtual void testImportDelete(); virtual void testRemoveProperties(); virtual void testManyChanges(); virtual void testLinkedItemsParent(); virtual void testLinkedItemsChild(); virtual void testLinkedItemsParentChild(); virtual void testLinkedItemsChildParent(); virtual void testLinkedItemsChildChangesParent(); virtual void testLinkedItemsRemoveParentFirst(); virtual void testLinkedItemsRemoveNormal(); virtual void testLinkedItemsInsertParentTwice(); virtual void testLinkedItemsInsertChildTwice(); virtual void testLinkedItemsParentUpdate(); virtual void testLinkedItemsUpdateChild(); virtual void testLinkedItemsInsertBothUpdateChild(); virtual void testLinkedItemsInsertBothUpdateParent(); virtual void testLinkedItemsInsertBothUpdateChildNoIDs(); virtual void testLinkedItemsUpdateChildNoIDs(); virtual void testLinkedItemsSingle404(); virtual void testLinkedItemsMany404(); virtual void testSubset(); /** retrieve right set of items for running test */ ClientTestConfig::LinkedItems_t getParentChildData(); }; std::list listItemsOfType(TestingSyncSource *source, int state); /** * Tests synchronization with one or more sync sources enabled. * When testing multiple sources at once only the first config * is checked to see which tests can be executed. */ class SyncTests : public CppUnit::TestSuite, public CppUnit::TestFixture { public: /** the client we are testing */ ClientTest &client; SyncTests(const std::string &name, ClientTest &cl, std::vector sourceIndices, bool isClientA = true); ~SyncTests(); /** * adds the supported tests to the instance itself * @param isFirstSource the tests are getting generated for a single source, * the one which was listed first; some tests are the * same for all sources and should only be run once */ virtual void addTests(bool isFirstSource = false); /** set up before running a test */ virtual void setUp() { client.setup(); } protected: /** list with all local test classes for manipulating the sources and their index in the client */ typedef std::vector< std::pair > source_array_t; source_array_t sources; typedef source_array_t::iterator source_it; /** * Stack of log file prefixes which are to be appended to the base name, * which already contains the current test name. Add a new prefix by * instantiating SyncPrefix. Its destructor takes care of popping * the prefix. */ std::list logPrefixes; class SyncPrefix { SyncTests &m_tests; public: SyncPrefix(const std::string &prefix, SyncTests &tests) : m_tests(tests) { tests.logPrefixes.push_back(prefix); } ~SyncPrefix() { m_tests.logPrefixes.pop_back(); } }; friend class SyncPrefix; /** the indices from sources, terminated by -1 (for sync()) */ int *sourceArray; /** utility functions for second client */ SyncTests *accessClientB; enum DeleteAllMode { DELETE_ALL_SYNC, /**< make sure client and server are in sync, delete locally, sync again */ DELETE_ALL_REFRESH /**< delete locally, refresh server */ }; /** * Compare databases second client with either reference file(s) * or first client. The reference file(s) must follow the naming * scheme .dat */ virtual bool compareDatabases(const char *refFileBase = NULL, bool raiseAssert = true); /** deletes all items locally and on server */ virtual void deleteAll(DeleteAllMode mode = DELETE_ALL_SYNC); /** get both clients in sync with empty server, then copy one item from client A to B */ virtual void doCopy(); /** * replicate server database locally: same as SYNC_REFRESH_FROM_SERVER, * but done with explicit local delete and then a SYNC_SLOW because some * servers do no support SYNC_REFRESH_FROM_SERVER */ virtual void refreshClient(SyncOptions options = SyncOptions()); /* for more information on the different tests see their implementation */ virtual void testTwoWaySync(); virtual void testSlowSync(); virtual void testRefreshFromServerSync(); virtual void testRefreshFromClientSync(); virtual void testRefreshFromRemoteSync(); virtual void testRefreshFromLocalSync(); virtual void testDeleteAllSync(); virtual void testDeleteAllRefresh(); virtual void testRefreshFromClientSemantic(); virtual void testRefreshFromServerSemantic(); virtual void testRefreshStatus(); void doRestartSync(SyncMode mode); void testTwoWayRestart(); void testSlowRestart(); void testRefreshFromLocalRestart(); void testOneWayFromLocalRestart(); void testRefreshFromRemoteRestart(); void testOneWayFromRemoteRestart(); void testManyRestarts(); void testCopy(); virtual void testUpdate(); virtual void testComplexUpdate(); virtual void testDelete(); virtual void testMerge(); virtual void testTwinning(); void doOneWayFromRemote(SyncMode oneWayFromRemote); void testOneWayFromServer(); void testOneWayFromRemote(); void doOneWayFromLocal(SyncMode oneWayFromLocal); void testOneWayFromClient(); void testOneWayFromLocal(); bool doConversionCallback(bool *success, SyncContext &client, SyncOptions &options); virtual void testConversion(); virtual void testItems(); virtual void testItemsXML(); virtual void testExtensions(); virtual void testAddUpdate(); void testMaxMsg(); void testLargeObject(); virtual void testManyItems(); virtual void testManyDeletes(); virtual void testSlowSyncSemantic(); virtual void testComplexRefreshFromServerSemantic(); virtual void testDeleteBothSides(); virtual void testAddBothSides(); virtual void testAddBothSidesRefresh(); virtual void testLinkedItemsParentChild(); virtual void testLinkedItemsChild(); virtual void testLinkedItemsChildParent(); virtual void doInterruptResume(int changes, boost::shared_ptr wrapper); /** * CLIENT_ = change made on client B before interrupting * SERVER_ = change made on client A and applied to server before interrupting * while sending to B * _ADD = new item added * _REMOVE = existing item deleted * _UPDATE = existing item replaced * BIG = when adding or updating, make the new item so large that it does * not fit into a single message */ enum { CLIENT_ADD = (1<<0), CLIENT_REMOVE = (1<<1), CLIENT_UPDATE = (1<<2), SERVER_ADD = (1<<3), SERVER_REMOVE = (1<<4), SERVER_UPDATE = (1<<5), BIG = (1<<6) }; virtual void testInterruptResumeClientAdd(); virtual void testInterruptResumeClientRemove(); virtual void testInterruptResumeClientUpdate(); virtual void testInterruptResumeServerAdd(); virtual void testInterruptResumeServerRemove(); virtual void testInterruptResumeServerUpdate(); virtual void testInterruptResumeClientAddBig(); virtual void testInterruptResumeClientUpdateBig(); virtual void testInterruptResumeServerAddBig(); virtual void testInterruptResumeServerUpdateBig(); virtual void testInterruptResumeFull(); virtual void testUserSuspendClientAdd(); virtual void testUserSuspendClientRemove(); virtual void testUserSuspendClientUpdate(); virtual void testUserSuspendServerAdd(); virtual void testUserSuspendServerRemove(); virtual void testUserSuspendServerUpdate(); virtual void testUserSuspendClientAddBig(); virtual void testUserSuspendClientUpdateBig(); virtual void testUserSuspendServerAddBig(); virtual void testUserSuspendServerUpdateBig(); virtual void testUserSuspendFull(); virtual void testResendClientAdd(); virtual void testResendClientRemove(); virtual void testResendClientUpdate(); virtual void testResendServerAdd(); virtual void testResendServerRemove(); virtual void testResendServerUpdate(); virtual void testResendFull(); virtual void testResendProxyClientAdd(); virtual void testResendProxyClientRemove(); virtual void testResendProxyClientUpdate(); virtual void testResendProxyServerAdd(); virtual void testResendProxyServerRemove(); virtual void testResendProxyServerUpdate(); virtual void testResendProxyFull(); virtual void testTimeout(); virtual void testUpload(); virtual void testDownload(); void doUpdateConflict(const std::string &testname, bool localWins); virtual void testUpdateLocalWins(); virtual void testUpdateRemoteWins(); /** * implements testMaxMsg(), testLargeObject(), testLargeObjectEncoded() * using a sequence of items with varying sizes */ virtual void doVarSizes(bool withMaxMsgSize, bool withLargeObject); /** * executes a sync with the given options, * checks the result and (optionally) the sync report */ virtual void doSync(const SyncOptions &options); virtual void doSync(const char *logPrefix, const SyncOptions &options) { SyncPrefix prefix(logPrefix, *this); doSync(options); } void doSync(const char *file, int line, const char *logPrefix, const SyncOptions &options) { CT_WRAP_ASSERT(file, line, doSync(logPrefix, options), CT_ASSERT_EXE_CLANG_BUILD(doSync(logPrefix, options))); } void doSync(const char *file, int line, const SyncOptions &options) { CT_WRAP_ASSERT(file, line, doSync(options), CT_ASSERT_EXE_CLANG_BUILD(doSync(options))); } virtual void postSync(int res, const std::string &logname); private: void allSourcesInsert(bool withUID = true); void allSourcesUpdate(); void allSourcesDeleteAll(); void allSourcesInsertMany(int startIndex, int numItems, std::map > &luids); void allSourcesUpdateMany(int startIndex, int numItems, int revision, std::map > &luids, int offset); void allSourcesRemoveMany(int numItems, std::map > &luids, int offset); }; /* * A transport wraper wraps a real transport impl and gives user * possibility to do additional work before/after transport operation. * We use TransportFaultInjector to emulate a network failure; * We use UserSuspendInjector to emulate a user suspend after receving * a response. */ class TransportWrapper : public TransportAgent { protected: int m_interruptAtMessage, m_messageCount; boost::shared_ptr m_wrappedAgent; Status m_status; SyncOptions *m_options; public: TransportWrapper() { m_messageCount = 0; m_interruptAtMessage = -1; m_wrappedAgent = boost::shared_ptr(); m_status = INACTIVE; m_options = NULL; } ~TransportWrapper() { } /** * -1 for wrappers which are meant to be used without message resending, * otherwise the number x for which "interrupt" <= x will lead to * an aborted sync (0 for TransportResendInjector, 2 for TransportResendProxy) */ virtual int getResendFailureThreshold() { return -1; } virtual int getMessageCount() { return m_messageCount; } virtual void setURL(const std::string &url) { m_wrappedAgent->setURL(url); } virtual void setContentType(const std::string &type) { m_wrappedAgent->setContentType(type); } virtual void setAgent(boost::shared_ptr agent) {m_wrappedAgent = agent;} virtual void setSyncOptions(SyncOptions *options) {m_options = options;} virtual void setInterruptAtMessage (int interrupt) {m_interruptAtMessage = interrupt;} virtual void cancel() { m_wrappedAgent->cancel(); } virtual void shutdown() { m_wrappedAgent->shutdown(); } virtual void rewind() { m_messageCount = 0; m_interruptAtMessage = -1; m_status = INACTIVE; m_options = NULL; m_wrappedAgent.reset(); } virtual Status wait(bool noReply = false) { return m_status; } virtual void setTimeout(int seconds) { m_wrappedAgent->setTimeout(seconds); } }; /** write log message into *.log file of a test */ #define CLIENT_TEST_LOG(_format, _args...) \ SE_LOG_DEBUG(NULL, "\n%s:%d *** " _format, \ getBasename(__FILE__).c_str(), __LINE__, \ ##_args) /** assert equality, include string in message if unequal */ #define CLIENT_TEST_EQUAL( _prefix, \ _expected, \ _actual ) \ CT_ASSERT_EQUAL_MESSAGE( std::string(_prefix) + ": " + #_expected + " == " + #_actual, \ _expected, \ _actual ) /** execute _x and then check the status of the _source pointer */ #define SOURCE_ASSERT_NO_FAILURE(_source, _x) \ { \ CT_ASSERT_NO_THROW(_x); \ CT_ASSERT((_source)); \ } /** check _x for true and then the status of the _source pointer */ #define SOURCE_ASSERT(_source, _x) \ { \ CT_ASSERT(_x); \ CT_ASSERT((_source)); \ } /** check that _x evaluates to a specific value and then the status of the _source pointer */ #define SOURCE_ASSERT_EQUAL(_source, _value, _x) \ { \ CT_ASSERT_EQUAL(_value, _x); \ CT_ASSERT((_source)); \ } /** same as SOURCE_ASSERT() with a specific failure message */ #define SOURCE_ASSERT_MESSAGE(_message, _source, _x) \ { \ CT_ASSERT_MESSAGE((_message), (_x)); \ CT_ASSERT((_source)); \ } /** * convenience macro for adding a test name like a function, * to be used inside addTests() of an instance of that class * * @param _class class which contains the function * @param _function a function without parameters in that class */ #define ADD_TEST(_class, _function) \ ADD_TEST_TO_SUITE(this, _class, _function) #define ADD_TEST_TO_SUITE(_suite, _class, _function) \ _suite->addTest(FilterTest(new CppUnit::TestCaller<_class>(_suite->getName() + "::" #_function, &_class::_function, *this))) #define ADD_TEST_TO_SUITE_SUFFIX(_suite, _class, _function, _suffix) \ _suite->addTest(FilterTest(new CppUnit::TestCaller<_class>(_suite->getName() + "::" #_function + _suffix, &_class::_function, *this))) SE_END_CXX #endif // ENABLE_INTEGRATION_TESTS #endif // INCL_TESTSYNCCLIENT syncevolution-1.5/test/ClientTestAssert.h0000644000373300001540000001627312327422650022122 0ustar00nightlynightly00000000000000/* * Copyright (C) 2011 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef INCL_CLIENTTESTASSERT #define INCL_CLIENTTESTASSERT #include #include #include SE_BEGIN_CXX /** * All of the macros below include the behavior of the corresponding * CPUNIT assertion. In addition they catch exceptions and turn them * into the following, extended CPPUnit exception by preserving the * information from the original exception and adding the current * source code line. * * Source information is listed as inner first (as part of the error * preamble), followed by error at that location and all locations * that the error passed through until caught at the top level of a * test. */ class CTException : public CppUnit::Exception { public: CTException(const CppUnit::Message &message = CppUnit::Message(), const std::string ¤tMessage = "", const CppUnit::SourceLine ¤tSourceLine = CppUnit::SourceLine(), const CppUnit::SourceLine &previousSourceLine = CppUnit::SourceLine()) : CppUnit::Exception(message, previousSourceLine) { CppUnit::Message extendedMessage = message; if (!currentMessage.empty()) { extendedMessage.addDetail(currentMessage); } if (currentSourceLine.isValid()) { extendedMessage.addDetail(StringPrintf("%s:%d", getBasename(currentSourceLine.fileName()).c_str(), currentSourceLine.lineNumber())); } setMessage(extendedMessage); } }; // Avoid clang 'error: attributes are not allowed on a function-definition' by putting the SE_NORETURN // into a separate declaration. static void ClientTestExceptionHandle(const char *file, int line, const std::string &message = "") SE_NORETURN; static void ClientTestExceptionHandle(const char *file, int line, const std::string &message) { CppUnit::SourceLine here(file, line); try { throw; } catch (const CTException &ex) { throw(CTException(ex.message(), message, here, ex.sourceLine())); } catch (const CppUnit::Exception &ex) { if (ex.sourceLine() == CPPUNIT_SOURCELINE()) { /* failure in condition expression itself, already includes source info, pass through */ throw; } else { throw(CTException(ex.message(), message, here, ex.sourceLine())); } } catch (const Exception &ex) { throw(CTException(CppUnit::Message(ex.what()), message, here, CppUnit::SourceLine(ex.m_file, ex.m_line))); } catch (const std::exception &ex) { CppUnit::Message msg(CPPUNIT_EXTRACT_EXCEPTION_TYPE_(ex, "std::exception or derived")); msg.addDetail(std::string("What(): ") + ex.what()); throw(CTException(msg, message, here)); } } // The only purpose of this here is to teach clang's scan-build that certain // code paths are not taken. Because the program just exists on failed // asserts, the resulting binary should not be used for real testing. // (http://clang-analyzer.llvm.org/annotations.html#custom_assertions). #ifdef CT_ASSERT_SIMPLE // Disable CPPUNIT, use simple assert. # define CT_ASSERT_NO_CLANG_BUILD(_assert) # define CT_ASSERT_TRUE_CLANG_BUILD(_expression) if (!(_expression)) { exit(1); } # define CT_ASSERT_EXE_CLANG_BUILD(_statement) _statement #else // Use CPPUNIT assert, disable simple assert. # define CT_ASSERT_NO_CLANG_BUILD(_assert) _assert # define CT_ASSERT_TRUE_CLANG_BUILD(_expression) # define CT_ASSERT_EXE_CLANG_BUILD(_statement) #endif #define CT_WRAP_ASSERT(_file, _line, _assert, _expression) \ do { \ try { \ SE_LOG_DEBUG(NULL, "%s:%d: starting %s", getBasename(_file).c_str(), _line, #_assert); \ CT_ASSERT_NO_CLANG_BUILD(_assert); \ _expression; \ SE_LOG_DEBUG(NULL, "%s:%d: ending %s", getBasename(_file).c_str(), _line, #_assert); \ } catch (...) { \ ClientTestExceptionHandle(_file, _line); \ } \ } while (false) #define CT_WRAP_ASSERT_MESSAGE(_file, _line, _message, _assert, _expression) \ do { \ try { \ SE_LOG_DEBUG(NULL, "%s:%d: starting %s %s", \ getBasename(_file).c_str(), _line, \ std::string(_message).c_str(), \ #_assert); \ CT_ASSERT_NO_CLANG_BUILD(_assert); \ _expression; \ SE_LOG_DEBUG(NULL, "%s:%d: ending %s", getBasename(_file).c_str(), _line, #_assert); \ } catch (...) { \ ClientTestExceptionHandle(_file, _line, _message); \ } \ } while (false) #define CT_ASSERT(condition) CT_WRAP_ASSERT(__FILE__, __LINE__, CPPUNIT_ASSERT(condition), CT_ASSERT_TRUE_CLANG_BUILD(condition)) #define CT_ASSERT_NO_THROW(expression) CT_WRAP_ASSERT(__FILE__, __LINE__, expression, CT_ASSERT_EXE_CLANG_BUILD(expression)) #define CT_ASSERT_NO_THROW_MESSAGE(message, expression) CT_WRAP_ASSERT_MESSAGE(__FILE__, __LINE__, message, expression, CT_ASSERT_EXE_CLANG_BUILD(expression)) #define CT_ASSERT_MESSAGE(message,condition) CT_WRAP_ASSERT(__FILE__, __LINE__, CPPUNIT_ASSERT_MESSAGE(message, (condition)), CT_ASSERT_TRUE_CLANG_BUILD(condition)) #define CT_FAIL(message) CPPUNIT_FAIL(message) #define CT_ASSERT_EQUAL(expected,actual) CT_WRAP_ASSERT(__FILE__, __LINE__, CPPUNIT_ASSERT_EQUAL((expected),(actual)), CT_ASSERT_TRUE_CLANG_BUILD((expected) == (actual))) #define CT_ASSERT_EQUAL_MESSAGE(message,expected,actual) CT_WRAP_ASSERT(__FILE__, __LINE__, CPPUNIT_ASSERT_EQUAL_MESSAGE(message,(expected),(actual)), CT_ASSERT_TRUE_CLANG_BUILD((expected) == (actual))) #define CT_ASSERT_DOUBLES_EQUAL(expected,actual,delta) CT_WRAP_ASSERT(__FILE__, __LINE__, CPPUNIT_ASSERT_DOUBLES_EQUAL((expected),(actual),(delta)), CT_ASSERT_TRUE_CLANG_BUILD(fabs((expected) - (actual)) < (delta))) #define CT_ASSERT_DOUBLES_EQUAL_MESSAGE(message,expected,actual,delta) CT_WRAP_ASSERT(__FILE__, __LINE__, CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(__FILE__, __LINE__, message,(expected),(actual),(delta)), CT_ASSERT_TRUE_CLANG_BUILD(fabs((expected) - (actual)) < (delta))) SE_END_CXX #endif // INCL_CLIENTTESTASSERT syncevolution-1.5/test/ClientTest.cpp0000664000373300001540000126222412424466461021303 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008 Funambol, Inc. * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** @cond API */ /** @addtogroup ClientTest */ /** @{ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef ENABLE_INTEGRATION_TESTS #include "ClientTest.h" #include "test.h" #include "ClientTestAssert.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace CppUnit { /** * behaves like an int and can be compared against one in ASSERT_EQUAL, * but includes the item list when being printed */ struct ItemCount { SyncEvo::SyncSourceChanges::Items_t m_items; ItemCount() {} ItemCount(const SyncEvo::SyncSourceChanges::Items_t &items) : m_items(items) {} int size() const { return m_items.size(); } operator int () const { return size(); } }; static std::ostream &operator << (ostream &out, const ItemCount &count) { out << count.size() << " ( "; BOOST_FOREACH(const std::string &id, count.m_items) { out << id << " "; } out << ")"; return out; } template<> struct assertion_traits { template static bool equal(const E &expected, const ItemCount &count) { return expected == count; } static std::string toString(const ItemCount &count) { std::ostringstream out; out << count; return out.str(); } }; /** comparison between arbitrary type A and B */ template void assertEquals(const A& expected, const B& actual, SourceLine sourceLine, const std::string &message) { if (!assertion_traits::equal(expected,actual)) { Asserter::failNotEqual(assertion_traits::toString(expected), assertion_traits::toString(actual), sourceLine, message); } } } SE_BEGIN_CXX /** * A command line using keyring as configured, but no interactive * password lookup. The base Cmdline class uses a generic SyncContext * which uses a SimpleUserInterface without keyring support. */ class TestCmdline : public Cmdline { public: // If we could inherit the Cmdline constructor, life would be a lot // easier... because we can't, we have to copy-and-paste the code // and rely on protected inheritance of Cmdline members. TestCmdline(const char *arg, ...) : Cmdline(std::vector()) { va_list argList; va_start(argList, arg); for (const char *curr = arg; curr; curr = va_arg(argList, const char *)) { m_args.push_back(curr); } va_end(argList); m_argc = m_args.size(); m_argvArray.reset(new const char *[m_args.size()]); for (int i = 0; i < m_argc; i++) { m_argvArray[i] = m_args[i].c_str(); } m_argv = m_argvArray.get(); } virtual SyncContext *createSyncClient() { std::auto_ptr context(new SyncContext(m_server, true)); boost::shared_ptr ui(new SimpleUserInterface(context->getKeyring())); context->setUserInterface(ui); return context.release(); } }; static set cleanupSet; /** * true when running as server, * relevant for sources instantiated by us * and testConversion, which does not work in * server mode (Synthesis engine not in the right * state when we try to run the test) */ static bool isServerMode() { const char *serverMode = getenv("CLIENT_TEST_MODE"); return serverMode && !strcmp(serverMode, "server"); } /** * CLIENT_TEST_SERVER env variable or "" if unset */ std::string currentServer() { const char *tmp = getenv("CLIENT_TEST_SERVER"); return tmp ? tmp : ""; } /** * This function checks whether the data on the server is accessible * directly. This is the case for tests where the server side is * syncevo-http-server or the sync is local. In both cases, this * method checks the config of _1 (the first client's sync config) * to find the peer and the uri of the given local source. The peer * is expected to a source under that name (no alias!). * * CLIENT_TEST_SERVER must be set. _1 must exist and (if * syncing via HTTP) have a deviceId that matches a remoteDeviceId in * the config used by syncevo-http-server. * * @return pair of + ; sync config name empty if not found */ std::pair getPeerConfig(const std::string &source) { static const char LOCAL_SYNC[] = "local://"; SyncConfig local(currentServer() + "_1"); std::vector syncURLs = local.getSyncURL(); boost::shared_ptr sourceConfig(local.getSyncSourceConfig(source)); std::string uri = sourceConfig->getURI(); if (uri.empty()) { uri = source; } std::string peerConfig; if (syncURLs.size() == 1) { const std::string &syncURL = syncURLs.front(); if (boost::starts_with(syncURL, LOCAL_SYNC)) { // Local sync. "target-config" is implied and may be relevant // later when using the peer source. peerConfig = syncURL.substr(strlen(LOCAL_SYNC)); if (boost::starts_with(peerConfig, "@")) { peerConfig = "target-config" + peerConfig; } } } if (peerConfig.empty()) { // Check for local HTTP server. std::string deviceId = local.getDevID(); BOOST_FOREACH (const StringPair &peer, SyncConfig::getConfigs()) { SyncConfig remote(peer.first); if (remote.getRemoteDevID() == deviceId) { peerConfig = peer.first; break; } } } return std::make_pair(peerConfig, uri); } /** * Tests involving a specific peer use testcases/synctests////, where is test * specific. The resulting string typically references a directory * with individual items. can be empty. */ std::string getPeerTestdata(const std::string &source, const std::string &test, const std::string &aspect) { std::string path = StringPrintf("testcases/synctests/%s/%s/%s/%s", currentServer().c_str(), source.c_str(), test.c_str(), aspect.c_str()); return path; } /** * CLIENT_TEST_NUM_ITEMS env variable or 100 */ int defNumItems() { char *numitems = getenv("CLIENT_TEST_NUM_ITEMS"); return numitems ? atoi(numitems) : 100; } static SyncMode RefreshFromPeerMode() { return isServerMode() ? SYNC_REFRESH_FROM_CLIENT : SYNC_REFRESH_FROM_SERVER; } static SyncMode RefreshFromLocalMode() { return isServerMode() ? SYNC_REFRESH_FROM_SERVER : SYNC_REFRESH_FROM_CLIENT; } static SyncMode OneWayFromPeerMode() { return isServerMode() ? SYNC_ONE_WAY_FROM_CLIENT : SYNC_ONE_WAY_FROM_SERVER; } static SyncMode OneWayFromLocalMode() { return isServerMode() ? SYNC_ONE_WAY_FROM_SERVER : SYNC_ONE_WAY_FROM_CLIENT; } /** * remove a certain property from buffer, return removed line */ static string stripProperty(std::string &data, const std::string &prop) { std::string res; size_t start = data.find(prop); if (start != data.npos) { size_t end = data.find('\n', start); if (end != data.npos) { size_t len = end + 1 - start; res = data.substr(start, len); data.erase(start, len); } } return res; } /** * insert a property (must include line end) before the end of an item */ static void insertProperty(std::string &data, const std::string &prop, const std::string &endProp = "END:VEVENT") { size_t pos = data.find(endProp); data.insert(pos, prop); } /** * remove parameter in all properties */ static void stripParameters(std::string &data, const std::string ¶m) { while (true) { size_t start = data.find(";" + param + "="); if (start == data.npos) { break; } size_t end = data.find_first_of(";:", start + 1); if (end == data.npos) { break; } data.erase(start, end - start); } } static void stripComponent(std::string &data, const std::string &comp) { size_t start = data.find("BEGIN:" + comp); if (start != data.npos) { size_t end = data.find("END:" + comp); if (end != data.npos) { end = data.find('\n', end); if (end != data.npos) { data.erase(start, end + 1 - start); } } } } /** * Using this pointer automates the open()/beginSync()/endSync()/close() * life cycle: it automatically calls these functions when a new * pointer is assigned or deleted. * * Anchors are stored globally in a hash which uses the tracking node * name as key. This name happens to be the unique file path that * is created for each source (see TestEvolution::createSource() and * SyncConfig::getSyncSourceNodes()). */ class TestingSyncSourcePtr : public std::auto_ptr { typedef std::auto_ptr base_t; bool m_active; static StringMap m_anchors; static std::string m_testName; public: TestingSyncSourcePtr() : m_active(false) {} TestingSyncSourcePtr(const TestingSyncSourcePtr &other) : m_active(false) { CPPUNIT_ASSERT(!other.get()); } ~TestingSyncSourcePtr() { // We can skip the full cleanup if the test has already failed. // Also avoids letting an exception escape from the // destructor during exception handling (= program aborted!) // when the endSync() call invoked by reset() needs to // report a proble. CT_ASSERT_NO_THROW() itself catches that // exception, but then forwards it, and thus does not // prevent the exception from escaping. if (!std::uncaught_exception()) { CT_ASSERT_NO_THROW(reset(NULL)); } } enum Flags { SLOW, /**< erase anchor, start accessing database from scratch */ INCREMENTAL /**< allow source to do incremental data read */ }; void reset(TestingSyncSource *source = NULL, Flags flags = INCREMENTAL) { if (get() && m_active) { stopAccess(); } // avoid deleting the instance that we are setting // (shouldn't happen) if (get() != source) { base_t::reset(source); } if (source) { startAccess(flags); } } /** * done automatically as part of reset(), only to be called * after an explicit stopAccess() */ void startAccess(Flags flags = INCREMENTAL) { CT_ASSERT(get()); CT_ASSERT(!m_active); int delay = atoi(getEnv("CLIENT_TEST_SOURCE_DELAY", "0")); if (delay) { CLIENT_TEST_LOG("CLIENT_TEST_SOURCE_DELAY: sleep for %d seconds", delay); sleep(delay); } CT_ASSERT_NO_THROW(get()->open()); string node = get()->getTrackingNode()->getName(); string anchor = m_anchors[node]; if (flags == SLOW) { anchor = ""; } get()->beginSync(anchor, ""); if (isServerMode()) { CT_ASSERT_NO_THROW(get()->enableServerMode()); } // the replaced m_endSession callback was invoked here, // which shouldn't have been necessary - not calling // m_endDataWrite post-signal at the moment // CT_ASSERT_NO_THROW(get()->getOperations().m_endDataWrite.getPostSignal()()); m_active = true; } /** * finish change tracking, source must be activated again * with startAccess() */ void stopAccess() { CT_ASSERT(get()); CT_ASSERT(m_active); m_active = false; char *dummy = const_cast("testing-source"); CT_ASSERT_NO_THROW(get()->getOperations().m_endDataWrite.getPostSignal()(*get(), OPERATION_FINISHED, sysync::LOCERR_OK, true, &dummy)); string node = get()->getTrackingNode()->getName(); string anchor; CT_ASSERT_NO_THROW(anchor = get()->endSync(true)); m_anchors[node] = anchor; CT_ASSERT_NO_THROW(get()->close()); } }; StringMap TestingSyncSourcePtr::m_anchors; std::string TestingSyncSourcePtr::m_testName; bool SyncOptions::defaultWBXML() { const char *t = getenv("CLIENT_TEST_XML"); if (t && (!strcmp(t, "1") || !strcasecmp(t, "t"))) { // use XML return false; } else { return true; } } std::list listItemsOfType(TestingSyncSource *source, int state) { std::list res; BOOST_FOREACH(const string &luid, source->getItems(SyncSourceChanges::State(state))) { res.push_back(luid); } return res; } static std::list listNewItems(TestingSyncSource *source) { return listItemsOfType(source, SyncSourceChanges::NEW); } static std::list listUpdatedItems(TestingSyncSource *source) { return listItemsOfType(source, SyncSourceChanges::UPDATED); } static std::list listDeletedItems(TestingSyncSource *source) { return listItemsOfType(source, SyncSourceChanges::DELETED); } static std::list listItems(TestingSyncSource *source) { return listItemsOfType(source, SyncSourceChanges::ANY); } static CppUnit::ItemCount countItemsOfType(TestingSyncSource *source, int type) { return source->getItems(SyncSourceChanges::State(type)); } static CppUnit::ItemCount countNewItems(TestingSyncSource *source) { return countItemsOfType(source, SyncSourceChanges::NEW); } static CppUnit::ItemCount countUpdatedItems(TestingSyncSource *source) { return countItemsOfType(source, SyncSourceChanges::UPDATED); } static CppUnit::ItemCount countDeletedItems(TestingSyncSource *source) { return countItemsOfType(source, SyncSourceChanges::DELETED); } static CppUnit::ItemCount countItems(TestingSyncSource *source) { return countItemsOfType(source, SyncSourceChanges::ANY); } /** insert new item, return LUID */ static std::string importItem(TestingSyncSource *source, const ClientTestConfig &config, std::string &data) { CT_ASSERT(source); if (data.size()) { SyncSourceRaw::InsertItemResult res; SOURCE_ASSERT_NO_FAILURE(source, res = source->insertItemRaw("", config.m_mangleItem(data, false, ""))); CT_ASSERT(!res.m_luid.empty()); return res.m_luid; } else { return ""; } } /** overwrite existing item */ static void updateItem(TestingSyncSource *source, std::string &data, const std::string &luid) { CT_ASSERT(source); CT_ASSERT(!data.empty()); CT_ASSERT(!luid.empty()); SyncSourceRaw::InsertItemResult res; SOURCE_ASSERT_NO_FAILURE(source, res = source->insertItemRaw(luid, data)); CT_ASSERT_EQUAL(luid, res.m_luid); } /** remove existing item */ static void removeItem(TestingSyncSource *source, const std::string &luid) { CT_ASSERT(source); CT_ASSERT(!luid.empty()); SOURCE_ASSERT_NO_FAILURE(source, source->deleteItem(luid)); } static void restoreStorage(const ClientTest::Config &config, ClientTest &client) { } static void backupStorage(const ClientTest::Config &config, ClientTest &client) { } /** adds the supported tests to the instance itself */ void LocalTests::addTests() { if (config.m_createSourceA) { ADD_TEST(LocalTests, testOpen); ADD_TEST(LocalTests, testIterateTwice); ADD_TEST(LocalTests, testDelete404); ADD_TEST(LocalTests, testReadItem404); if (!config.m_insertItem.empty()) { ADD_TEST(LocalTests, testSimpleInsert); ADD_TEST(LocalTests, testLocalDeleteAll); ADD_TEST(LocalTests, testComplexInsert); if (config.m_uniqueID) { ADD_TEST(LocalTests, testInsertTwice); } if (!config.m_updateItem.empty()) { ADD_TEST(LocalTests, testLocalUpdate); if (config.m_createSourceB) { ADD_TEST(LocalTests, testChanges); ADD_TEST(LocalTests, testChangesMultiCycles); if (!config.m_linkedSources.empty()) { ADD_TEST(LocalTests, testLinkedSources); } } } if (config.m_import && config.m_dump && config.m_compare && !config.m_testcases.empty()) { ADD_TEST(LocalTests, testImport); ADD_TEST(LocalTests, testImportDelete); if (!config.m_essentialProperties.empty()) { ADD_TEST(LocalTests, testRemoveProperties); } } if (!config.m_templateItem.empty()) { ADD_TEST(LocalTests, testManyChanges); } // create a sub-suite for each set of linked items for (int i = 0; i < (int)config.m_linkedItems.size(); i++) { const ClientTestConfig::LinkedItems_t &items = config.m_linkedItems[i]; CppUnit::TestSuite *linked = new CppUnit::TestSuite(getName() + "::LinkedItems" + items.m_name); ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsParent); if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsChild); } ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsParentChild); if (items[1].find("RECURRENCE-ID") != items[1].npos && config.m_sourceKnowsItemSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsInsertBothUpdateChildNoIDs); } if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsChildParent); } if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsChildChangesParent); } if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsRemoveParentFirst); } ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsRemoveNormal); if (config.m_sourceKnowsItemSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsInsertParentTwice); if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsInsertChildTwice); } } ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsParentUpdate); if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsUpdateChild); if (items[1].find("RECURRENCE-ID") != items[1].npos && config.m_sourceKnowsItemSemantic) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsUpdateChildNoIDs); } } ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsInsertBothUpdateChild); ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsInsertBothUpdateParent); // tests independent of data, only add to default item set if (i == 0) { ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsSingle404); ADD_TEST_TO_SUITE(linked, LocalTests, testLinkedItemsMany404); } addTest(linked); } // Create a sub-suite for each set of linked items. // items.size() can be fairly large for these tests, // so avoid testing all possible combinations. BOOST_FOREACH(const ClientTestConfig::LinkedItems_t &items, config.m_linkedItemsSubset) { CppUnit::TestSuite *linked = new CppUnit::TestSuite(getName() + "::LinkedItems" + items.m_name); int stride = (items.size() + 4) / 5; for (int start = 0; (size_t)start < items.size(); start += stride ) { for (int skip = 0; !skip || (size_t)(start + skip + 1) < items.size(); skip++) { ADD_TEST_TO_SUITE_SUFFIX(linked, LocalTests, testSubset, StringPrintf("Start%dSkip%d", start, skip)); } // add a test which uses start, start + 1 and last item // if that leads to a gap (EXDATE) if (start > 0 && items.size() - start > 3) { ADD_TEST_TO_SUITE_SUFFIX(linked, LocalTests, testSubset, StringPrintf("Start%dExdate", start)); } } addTest(linked); } } } } std::string LocalTests::insert(CreateSource createSource, const std::string &data, bool relaxed, std::string *inserted, const std::string &uniqueUIDSuffix) { restoreStorage(config, client); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // count number of already existing items int numItems = 0; CT_ASSERT_NO_THROW(numItems = countItems(source.get())); SyncSourceRaw::InsertItemResult res; std::string mangled = config.m_mangleItem(data, false, uniqueUIDSuffix); if (inserted) { *inserted = mangled; } SOURCE_ASSERT_NO_FAILURE(source.get(), res = source->insertItemRaw("", mangled)); CT_ASSERT(!res.m_luid.empty()); bool updated = false; if (res.m_state == ITEM_NEEDS_MERGE) { // conflict detected, overwrite existing item as done in the past std::string luid = res.m_luid; SOURCE_ASSERT_NO_FAILURE(source.get(), res = source->insertItemRaw(luid, mangled)); CT_ASSERT_EQUAL(luid, res.m_luid); CT_ASSERT(res.m_state == ITEM_OKAY); updated = true; } // delete source again CT_ASSERT_NO_THROW(source.reset()); if (!relaxed) { // two possible results: // - a new item was added // - the item was matched against an existing one SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); CT_ASSERT_EQUAL(numItems + ((res.m_state == ITEM_REPLACED || res.m_state == ITEM_MERGED || updated) ? 0 : 1), countItems(source.get())); CT_ASSERT_EQUAL(0, countNewItems(source.get())); CT_ASSERT_EQUAL(0, countUpdatedItems(source.get())); CT_ASSERT_EQUAL(0, countDeletedItems(source.get())); } backupStorage(config, client); return res.m_luid; } /** deletes specific item locally via sync source */ static std::string updateItem(CreateSource createSource, const ClientTestConfig &config, const std::string &uid, const std::string &data, std::string *updated = NULL) { std::string newuid; CT_ASSERT(createSource.createSource); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // insert item SyncSourceRaw::InsertItemResult res; std::string mangled; CT_ASSERT_NO_THROW(mangled = config.m_mangleItem(data, true, "")); if (updated) { *updated = mangled; } SOURCE_ASSERT_NO_FAILURE(source.get(), res = source->insertItemRaw(uid, mangled.c_str())); SOURCE_ASSERT(source.get(), !res.m_luid.empty()); return res.m_luid; } /** updates specific item locally via sync source */ static void removeItem(CreateSource createSource, const std::string &luid) { CT_ASSERT(createSource.createSource); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // remove item SOURCE_ASSERT_NO_FAILURE(source.get(), source->deleteItem(luid)); } void LocalTests::update(CreateSource createSource, const std::string &data, bool check, const std::string &uniqueUIDSuffix) { CT_ASSERT(createSource.createSource); restoreStorage(config, client); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // get existing item, then update it SyncSourceChanges::Items_t::const_iterator it; SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getAllItems().begin()); CT_ASSERT(it != source->getAllItems().end()); string luid = *it; SyncSourceRaw::InsertItemResult res; std::string mangled = config.m_mangleItem(data, true, uniqueUIDSuffix); SOURCE_ASSERT_NO_FAILURE(source.get(), res = source->insertItemRaw(luid, mangled)); CT_ASSERT_NO_THROW(source.reset()); CT_ASSERT_EQUAL(luid, res.m_luid); CT_ASSERT_EQUAL(ITEM_OKAY, res.m_state); if (!check) { return; } // check that the right changes are reported when reopening the source SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); CT_ASSERT_EQUAL(1, countItems(source.get())); CT_ASSERT_EQUAL(0, countNewItems(source.get())); CT_ASSERT_EQUAL(0, countUpdatedItems(source.get())); CT_ASSERT_EQUAL(0, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getAllItems().begin()); CT_ASSERT(it != source->getAllItems().end()); CT_ASSERT_EQUAL(luid, *it); backupStorage(config, client); } void LocalTests::update(CreateSource createSource, const std::string &data, const std::string &luid) { CT_ASSERT(createSource.createSource); restoreStorage(config, client); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // update it SOURCE_ASSERT_NO_FAILURE(source.get(), source->insertItemRaw(luid, config.m_mangleItem(data, true, ""))); backupStorage(config, client); } /** deletes all items locally via sync source */ void LocalTests::deleteAll(CreateSource createSource) { CT_ASSERT(createSource.createSource); restoreStorage(config, client); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // delete all items SOURCE_ASSERT_NO_FAILURE(source.get(), source->removeAllItems()); CT_ASSERT_NO_THROW(source.reset()); // check that all items are gone SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); SOURCE_ASSERT_MESSAGE( "should be empty now", source.get(), countItems(source.get()) == 0); CT_ASSERT_EQUAL( 0, countNewItems(source.get()) ); CT_ASSERT_EQUAL( 0, countUpdatedItems(source.get()) ); CT_ASSERT_EQUAL( 0, countDeletedItems(source.get()) ); backupStorage(config, client); } /** deletes specific item locally via sync source */ static void deleteItem(CreateSource createSource, const std::string &uid) { CT_ASSERT(createSource.createSource); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); // delete item SOURCE_ASSERT_NO_FAILURE(source.get(), source->deleteItem(uid)); } /** * takes two databases, exports them, * then compares them using synccompare * * @param refFile existing file with source reference items, NULL uses a dump of sync source A instead * @param copy a sync source which contains the copied items, begin/endSync will be called * @param raiseAssert raise assertion if comparison yields differences (defaults to true) */ bool LocalTests::compareDatabases(const char *refFile, TestingSyncSource ©, bool raiseAssert) { CT_ASSERT(config.m_dump); std::string sourceFile, copyFile; if (refFile) { sourceFile = refFile; } else { sourceFile = getCurrentTest() + ".A.test.dat"; simplifyFilename(sourceFile); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); SOURCE_ASSERT_EQUAL(source.get(), 0, config.m_dump(client, *source.get(), sourceFile)); CT_ASSERT_NO_THROW(source.reset()); } copyFile = getCurrentTest() + ".B.test.dat"; simplifyFilename(copyFile); SOURCE_ASSERT_EQUAL(©, 0, config.m_dump(client, copy, copyFile)); return compareDatabases(sourceFile, copyFile); } bool LocalTests::compareDatabases(const std::string &refFile, const std::string &actualFile, bool raiseAssert) { bool equal = false; CT_ASSERT_NO_THROW(equal = config.m_compare(client, refFile.c_str(), actualFile.c_str())); CT_ASSERT(!raiseAssert || equal); return equal; } /** * compare data in source with vararg list of std::string pointers, NULL terminated */ void LocalTests::compareDatabases(TestingSyncSource *copy, ...) { std::string sourceFile = getCurrentTest() + ".ref.test.dat"; simplifyFilename(sourceFile); ofstream out(sourceFile.c_str()); va_list ap; va_start(ap, copy); std::string *item; while ((item = va_arg(ap, std::string *)) != NULL) { out << *item; } va_end(ap); out.close(); compareDatabases(sourceFile.c_str(), *copy); } void LocalTests::compareDatabasesRef(TestingSyncSource ©, const std::list &items) { std::string sourceFile = getCurrentTest() + ".ref.test.dat"; simplifyFilename(sourceFile); ofstream out(sourceFile.c_str()); BOOST_FOREACH(const std::string &item, items) { out << item; } out.close(); compareDatabases(sourceFile.c_str(), copy); } std::string LocalTests::createItem(int item, const std::string &revision, int size) { std::string data = config.m_mangleItem(config.m_templateItem, false, ""); std::stringstream prefix; // string to be inserted at start of unique properties; // avoid adding white space (not sure whether it is valid for UID) prefix << std::setfill('0') << std::setw(3) << item << "-"; BOOST_FOREACH (std::string curProp, boost::tokenizer< boost::char_separator >(config.m_uniqueProperties, boost::char_separator(":"))) { std::string property; // property is expected to not start directly at the // beginning property = "\n"; property += curProp; property += ":"; size_t off = data.find(property); if (off != data.npos) { data.insert(off + property.size(), prefix.str()); } } boost::replace_all(data, "<>", prefix.str()); boost::replace_all(data, "<>", revision); if (size > 0 && (int)data.size() < size) { int additionalBytes = size - (int)data.size(); int added = 0; /* vCard 2.1 and vCal 1.0 need quoted-printable line breaks */ bool quoted = data.find("VERSION:1.0") != data.npos || data.find("VERSION:2.1") != data.npos; size_t toreplace = 1; CT_ASSERT(!config.m_sizeProperty.empty()); /* stuff the item so that it reaches at least that size */ size_t off = data.find(config.m_sizeProperty); CT_ASSERT(off != data.npos); std::stringstream stuffing; if (quoted) { stuffing << ";ENCODING=QUOTED-PRINTABLE:"; } else { stuffing << ":"; } // insert after the first line, it often acts as the summary if (data.find("BEGIN:VJOURNAL") != data.npos) { size_t start = data.find(":", off); CT_ASSERT( start != data.npos ); size_t eol = data.find("\\n", off); CT_ASSERT( eol != data.npos ); stuffing << data.substr(start + 1, eol - start + 1); toreplace += eol - start + 1; } while(added < additionalBytes) { int linelen = 0; while(added + 4 < additionalBytes && linelen < 60) { stuffing << 'x'; added++; linelen++; } // insert line breaks to allow folding if (quoted) { stuffing << "x=0D=0Ax"; added += 8; } else { stuffing << "x\\nx"; added += 4; } } off = data.find(":", off); data.replace(off, toreplace, stuffing.str()); } return data; } /** * insert artificial items, number of them 100 * unless passed explicitly * * @param createSource a factory for the sync source that is to be used * @param startIndex IDs are generated starting with this value * @param numItems number of items to be inserted if non-null, otherwise config.numItems is used * @param size minimum size for new items * @return LUIDs of all inserted items */ std::list LocalTests::insertManyItems(CreateSource createSource, int startIndex, int numItems, int size) { std::list luids; CT_ASSERT(!config.m_templateItem.empty()); restoreStorage(config, client); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); CT_ASSERT(startIndex > 1 || !countItems(source.get())); int firstIndex = startIndex; if (firstIndex < 0) { firstIndex = 1; } int lastIndex = firstIndex + (numItems >= 1 ? numItems : defNumItems()) - 1; for (int item = firstIndex; item <= lastIndex; item++) { std::string data = createItem(item, "", size); luids.push_back(importItem(source.get(), config, data)); } backupStorage(config, client); return luids; } std::list LocalTests::insertManyItems(TestingSyncSource *source, int startIndex, int numItems, int size) { std::list luids; CT_ASSERT(!config.m_templateItem.empty()); CT_ASSERT(startIndex > 1 || !countItems(source)); int firstIndex = startIndex; if (firstIndex < 0) { firstIndex = 1; } int lastIndex = firstIndex + (numItems >= 1 ? numItems : defNumItems()) - 1; for (int item = firstIndex; item <= lastIndex; item++) { std::string data = createItem(item, "", size); luids.push_back(importItem(source, config, data)); } return luids; } void LocalTests::updateManyItems(CreateSource createSource, int startIndex, int numItems, int size, int revision, std::list &luids, int offset) { CT_ASSERT(!config.m_templateItem.empty()); restoreStorage(config, client); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); int firstIndex = startIndex; if (firstIndex < 0) { firstIndex = 1; } int lastIndex = firstIndex + (numItems >= 1 ? numItems : defNumItems()) - 1; std::string revstring = StringPrintf("REVISION #%d", revision); std::list::const_iterator it = luids.begin(); for (int i = 0; i < offset && it != luids.end(); i++, ++it) {} for (int item = firstIndex; item <= lastIndex && it != luids.end(); item++, ++it) { std::string data = createItem(item, revstring, size); updateItem(source.get(), data, *it); } backupStorage(config, client); } void LocalTests::removeManyItems(CreateSource createSource, int numItems, std::list &luids, int offset) { restoreStorage(config, client); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); std::list::const_iterator it = luids.begin(); for (int i = 0; i < offset && it != luids.end(); i++, ++it) {} for (int item = 0; item < numItems && it != luids.end(); item++, ++it) { removeItem(source.get(), *it); } backupStorage(config, client); } // update every single item in the database void LocalTests::updateData(CreateSource createSource) { // check additional requirements CT_ASSERT(config.m_update); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSource())); BOOST_FOREACH(const string &luid, source->getAllItems()) { string item; CT_ASSERT_NO_THROW(source->readItemRaw(luid, item)); CT_ASSERT_NO_THROW(config.m_update(item)); CT_ASSERT_NO_THROW(source->insertItemRaw(luid, item)); } CT_ASSERT_NO_THROW(source.reset()); } // creating sync source void LocalTests::testOpen() { // check requirements CT_ASSERT(config.m_createSourceA); // Intentionally use the plain auto_ptr here and // call open directly. That way it is a bit more clear // what happens and where it fails, if it fails. std::auto_ptr source; CT_ASSERT_NO_THROW(source.reset(createSourceA())); // got a sync source? CT_ASSERT(source.get() != 0); // can it be opened? SOURCE_ASSERT_NO_FAILURE(source.get(), source->open()); // delete it CT_ASSERT_NO_THROW(source.reset()); } // restart scanning of items void LocalTests::testIterateTwice() { // check requirements CT_ASSERT(config.m_createSourceA); // open source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); SOURCE_ASSERT_MESSAGE( "iterating twice should produce identical results", source.get(), countItems(source.get()) == countItems(source.get())); } // deleteItem() must raise 404 for unknown item void LocalTests::testDelete404() { // check requirements CT_ASSERT(config.m_createSourceA); // open source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); SyncMLStatus status = STATUS_OK; try { source->deleteItem("no-such-item"); } catch (const StatusException &ex) { status = ex.syncMLStatus(); } CT_ASSERT_EQUAL(STATUS_NOT_FOUND, status); } // deleteItem() must raise 404 for unknown item void LocalTests::testReadItem404() { // check requirements CT_ASSERT(config.m_createSourceA); // open source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); SyncMLStatus status = STATUS_OK; try { std::string data; source->readItem("no-such-item", data); } catch (const StatusException &ex) { status = ex.syncMLStatus(); } CT_ASSERT_EQUAL(STATUS_NOT_FOUND, status); } void LocalTests::doInsert(bool withUID) { // check requirements CT_ASSERT(!config.m_insertItem.empty()); CT_ASSERT(!config.m_createSourceA.empty()); std::string item = config.m_insertItem; if (!withUID) { CT_ASSERT_NO_THROW(stripProperty(item, "UID")); } CT_ASSERT_NO_THROW(insert(createSourceA, item)); } // insert one contact without clearing the source first void LocalTests::testSimpleInsert() { // Insert the item without the UID. There is no guarantee that the // item wasn't already inserted before (database not cleaned by // test) and some backends (CalDAV) will catch an attempt to // add the same item twice. doInsert(false); } // delete all items void LocalTests::testLocalDeleteAll() { // check requirements CT_ASSERT(!config.m_insertItem.empty()); CT_ASSERT(config.m_createSourceA); // make sure there is something to delete, then delete again std::string item = config.m_insertItem; CT_ASSERT_NO_THROW(stripProperty(item, "UID")); CT_ASSERT_NO_THROW(insert(createSourceA, item)); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); } // clean database, then insert void LocalTests::testComplexInsert() { CT_ASSERT(config.m_createSourceA); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); CT_ASSERT_NO_THROW(doInsert()); CT_ASSERT_NO_THROW(testIterateTwice()); } // insert the same item (identified by UID) twice => either // ITEM_NEEDS_MERGE, ITEM_REPLACED or ITEM_MERGED are acceptable void LocalTests::testInsertTwice() { CT_ASSERT(config.m_createSourceA); CT_ASSERT(!config.m_insertItem.empty()); CT_ASSERT(config.m_insertItem.find("\nUID:") != std::string::npos); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); // create source TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); // mangle data once std::string data = config.m_mangleItem(config.m_insertItem, false, ""); // insert new item SyncSourceRaw::InsertItemResult first; SOURCE_ASSERT_NO_FAILURE(source.get(), first = source->insertItemRaw("", data)); CT_ASSERT_EQUAL(ITEM_OKAY, first.m_state); // and again SyncSourceRaw::InsertItemResult second; SOURCE_ASSERT_NO_FAILURE(source.get(), second = source->insertItemRaw("", data)); CLIENT_TEST_LOG("item %s", second.m_state == ITEM_NEEDS_MERGE ? "needs to be merged" : second.m_state == ITEM_REPLACED ? "was replaced" : second.m_state == ITEM_MERGED ? "was merged" : second.m_state == ITEM_OKAY ? "was added, which is broken!" : "unknown result ?!"); if (config.m_sourceKnowsItemSemantic) { CT_ASSERT(second.m_state == ITEM_NEEDS_MERGE || second.m_state == ITEM_REPLACED || second.m_state == ITEM_MERGED); CT_ASSERT_EQUAL(first.m_luid, second.m_luid); } else { CT_ASSERT(second.m_state == ITEM_OKAY); CT_ASSERT(first.m_luid != second.m_luid); } if (second.m_state == ITEM_REPLACED || second.m_state == ITEM_MERGED) { CT_ASSERT(first.m_revision != second.m_revision); } } // clean database, insert item, update it void LocalTests::testLocalUpdate() { // check additional requirements CT_ASSERT(!config.m_updateItem.empty()); CT_ASSERT(config.m_createSourceA); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); CT_ASSERT_NO_THROW(doInsert()); CT_ASSERT_NO_THROW(update(createSourceA, config.m_updateItem)); } // Complex sequence of changes, with one restarted instance of source // B to observe the changes or multiple instances of it. // Changes are made both via source A and via source B itself. void LocalTests::doChanges(bool restart) { SyncSourceChanges::Items_t::const_iterator it, it2; // check additional requirements CT_ASSERT(config.m_createSourceB); CT_ASSERT(config.m_createSourceA); CLIENT_TEST_LOG("clean via source A"); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); CLIENT_TEST_LOG("insert item via source A"); CT_ASSERT_NO_THROW(doInsert()); CLIENT_TEST_LOG("clean changes in sync source B by creating and closing it"); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceB())); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("no new changes now in source B"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); string item; string luid; SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getAllItems().begin()); CT_ASSERT(it != source->getAllItems().end()); luid = *it; // It is not required for incremental syncing that sources must be // able to return unchanged items. For example, ActiveSyncSource doesn't support // it because it gets only IDs and data of added or updated items. // Don't test it. // SOURCE_ASSERT_NO_FAILURE(source.get(), source->readItem(*it, item)); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("delete item again via sync source A"); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); CLIENT_TEST_LOG("check for deleted item via source B"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getDeletedItems().begin()); CT_ASSERT(it != source->getDeletedItems().end()); CT_ASSERT(!it->empty()); CT_ASSERT_EQUAL(luid, *it); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); // Now make changes via source B directly: these changes are not to be // reported back. Google CalDAV is very strict about UID/SEQUENCE, // work around that by not reusing a UID inside this test. SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); // add std::string mangled = config.m_mangleItem(config.m_insertItem, false, "-B"); SyncSourceRaw::InsertItemResult res; SOURCE_ASSERT_NO_FAILURE(source.get(), res = source->insertItemRaw("", mangled)); CT_ASSERT(!res.m_luid.empty()); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); // update SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); mangled = config.m_mangleItem(config.m_updateItem, false, "-B"); SOURCE_ASSERT_NO_FAILURE(source.get(), res = source->insertItemRaw(res.m_luid, mangled)); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); // delete SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), source->deleteItem(res.m_luid)); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("insert another item via source A"); CT_ASSERT_NO_THROW(insert(createSourceA, config.m_insertItem, false, NULL, "-C")); CLIENT_TEST_LOG("check for new item via source B"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getAllItems().begin()); CT_ASSERT(it != source->getAllItems().end()); luid = *it; SOURCE_ASSERT_NO_FAILURE(source.get(), source->readItem(*it, item)); string newItem; SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getNewItems().begin()); CT_ASSERT(it != source->getNewItems().end()); SOURCE_ASSERT_NO_FAILURE(source.get(), source->readItem(*it, item)); CT_ASSERT_EQUAL(luid, *it); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("update item via source A"); CT_ASSERT_NO_THROW(update(createSourceA, config.m_updateItem, "-C")); CLIENT_TEST_LOG("check for updated item via source B"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); string updatedItem; SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getUpdatedItems().begin()); CT_ASSERT(it != source->getUpdatedItems().end()); SOURCE_ASSERT_NO_FAILURE(source.get(), source->readItem(*it, updatedItem)); CT_ASSERT_EQUAL(luid, *it); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("one item, no changes in source B"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("start anew in both sources"); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("create and update an item in source A"); // Must use a UID different than the one used before despite that data being gone, // to keep Google CalDAV server happy. CT_ASSERT_NO_THROW(insert(createSourceA, config.m_insertItem, false, NULL, "-D")); CT_ASSERT_NO_THROW(update(createSourceA, config.m_updateItem, "-D")); CLIENT_TEST_LOG("should only be listed as new or updated in source B, but not both"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()) + countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("start anew once more in both sources"); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); CT_ASSERT_NO_THROW(restart ? source.stopAccess() : source.reset()); CLIENT_TEST_LOG("create, delete and recreate an item in source A"); CT_ASSERT_NO_THROW(insert(createSourceA, config.m_insertItem, false, NULL, "-E")); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); CT_ASSERT_NO_THROW(insert(createSourceA, config.m_insertItem, false, NULL, "-F")); CLIENT_TEST_LOG("should only be listed as new or updated in source B, even if\n " "(as for calendar with UID) the same LUID gets reused"); SOURCE_ASSERT_NO_FAILURE(source.get(), restart ? source.startAccess() : source.reset(createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get()) + countUpdatedItems(source.get())); if (countDeletedItems(source.get()) == 1) { // It's not nice, but acceptable to send the LUID of a deleted item to a // server which has never seen that LUID. The LUID must not be the same as // the one we list as new or updated, though. SOURCE_ASSERT_NO_FAILURE(source.get(), it = source->getDeletedItems().begin()); CT_ASSERT(it != source->getDeletedItems().end()); SOURCE_ASSERT_NO_FAILURE(source.get(), it2 = source->getNewItems().begin()); if (it2 == source->getNewItems().end()) { SOURCE_ASSERT_NO_FAILURE(source.get(), it2 = source->getUpdatedItems().begin()); CT_ASSERT(it2 != source->getUpdatedItems().end()); } CT_ASSERT(*it != *it2); } else { SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); } CT_ASSERT_NO_THROW(source.reset()); } // complex sequence of changes, with source B instantiated anew // after each change void LocalTests::testChanges() { doChanges(false); } // complex sequence of changes, with source B only instantiated once // and restarted multiple times void LocalTests::testChangesMultiCycles() { doChanges(true); } // Make changes in one source and verify that other linked // sources do not see and report any changes in their view // of the shared database. Source A of the other sources // is created once and is restarted, source B is created // from scratch after each change. void LocalTests::testLinkedSources() { // make changes in each of the sources (doesn't have t be // the current one) BOOST_FOREACH (LocalTests *main, m_linkedSources) { CLIENT_TEST_LOG("making changes in %s", main->getSourceName().c_str()); // first delete via *all* sources BOOST_FOREACH (LocalTests *test, m_linkedSources) { CLIENT_TEST_LOG("clean via source A of %s", test->getSourceName().c_str()); CT_ASSERT_NO_THROW(test->deleteAll(test->createSourceA)); // reset change tracking in source B TestingSyncSourcePtr sourceB; SOURCE_ASSERT_NO_FAILURE(sourceB.get(), sourceB.reset(test->createSourceB())); } std::map sourcesA; BOOST_FOREACH (LocalTests *test, m_linkedSources) { if (test == main) { continue; } TestingSyncSourcePtr &source = sourcesA[test->getSourceName()]; CLIENT_TEST_LOG("creating source A of %s", test->getSourceName().c_str()); SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(test->createSourceA())); CT_ASSERT_NO_THROW(source.stopAccess()); } // insert one item CLIENT_TEST_LOG("inserting into %s", main->getSourceName().c_str()); CT_ASSERT_NO_THROW(main->doInsert()); BOOST_FOREACH (LocalTests *test, m_linkedSources) { if (test == main) { continue; } TestingSyncSourcePtr &source = sourcesA[test->getSourceName()]; CLIENT_TEST_LOG("checking %s after insertion into %s", test->getSourceName().c_str(), main->getSourceName().c_str()); SOURCE_ASSERT_NO_FAILURE(source.get(), source.startAccess()); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), source.stopAccess()); TestingSyncSourcePtr sourceB; SOURCE_ASSERT_NO_FAILURE(sourceB.get(), sourceB.reset(test->createSourceB())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countNewItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countUpdatedItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countDeletedItems(sourceB.get())); } // update one item CLIENT_TEST_LOG("updating in %s", main->getSourceName().c_str()); CT_ASSERT_NO_THROW(main->update(main->createSourceA, main->config.m_updateItem)); BOOST_FOREACH (LocalTests *test, m_linkedSources) { if (test == main) { continue; } TestingSyncSourcePtr &source = sourcesA[test->getSourceName()]; CLIENT_TEST_LOG("checking %s after update into %s", test->getSourceName().c_str(), main->getSourceName().c_str()); SOURCE_ASSERT_NO_FAILURE(source.get(), source.startAccess()); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), source.stopAccess()); TestingSyncSourcePtr sourceB; SOURCE_ASSERT_NO_FAILURE(sourceB.get(), sourceB.reset(test->createSourceB())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countNewItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countUpdatedItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countDeletedItems(sourceB.get())); } // delete one item CLIENT_TEST_LOG("deleting in %s", main->getSourceName().c_str()); CT_ASSERT_NO_THROW(main->deleteAll(main->createSourceA)); BOOST_FOREACH (LocalTests *test, m_linkedSources) { if (test == main) { continue; } TestingSyncSourcePtr &source = sourcesA[test->getSourceName()]; CLIENT_TEST_LOG("checking %s after delete in %s", test->getSourceName().c_str(), main->getSourceName().c_str()); SOURCE_ASSERT_NO_FAILURE(source.get(), source.startAccess()); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_NO_FAILURE(source.get(), source.stopAccess()); TestingSyncSourcePtr sourceB; SOURCE_ASSERT_NO_FAILURE(sourceB.get(), sourceB.reset(test->createSourceB())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countNewItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countUpdatedItems(sourceB.get())); SOURCE_ASSERT_EQUAL(sourceB.get(), 0, countDeletedItems(sourceB.get())); } } } // clean database, import file, then export again and compare void LocalTests::doImport(const std::string &testcases) { // check additional requirements CT_ASSERT(config.m_import); CT_ASSERT(config.m_dump); CT_ASSERT(config.m_compare); CT_ASSERT(!testcases.empty()); CT_ASSERT(config.m_createSourceA); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); // import via sync source A TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); restoreStorage(config, client); std::string actualData; std::string importFailures = config.m_import(client, *source.get(), config, testcases, actualData, NULL); backupStorage(config, client); CT_ASSERT_NO_THROW(source.reset()); // export again and compare against original file, // without relying on change tracking (because // Google ActiveSync has problems with Fetch, // which would be needed for a data dump whenr // using the incremental approach) TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceA(), TestingSyncSourcePtr::SLOW)); bool equal = compareDatabases(actualData.c_str(), *copy.get(), false); CT_ASSERT_NO_THROW(source.reset()); if (importFailures.empty()) { CT_ASSERT_MESSAGE("imported and exported data equal", equal); } else { CT_ASSERT_EQUAL(std::string(""), importFailures); } } void LocalTests::testImport() { doImport(config.m_testcases); } // same as testImport() with immediate delete void LocalTests::testImportDelete() { CT_ASSERT_NO_THROW(testImport()); // delete again, because it was observed that this did not // work right with calendars in SyncEvolution CT_ASSERT_NO_THROW(deleteAll(createSourceA)); } // clean database, import file, update with minimized test data (= all // non-essential properties removed), compare: verifies that updates // can remove data void LocalTests::testRemoveProperties() { // check additional requirements CT_ASSERT(config.m_import); CT_ASSERT(config.m_dump); CT_ASSERT(config.m_compare); CT_ASSERT(!config.m_testcases.empty()); CT_ASSERT(config.m_createSourceA); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); // import via sync source A TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); restoreStorage(config, client); std::string testcases; std::list luids; std::string importFailures = config.m_import(client, *source.get(), config, config.m_testcases, testcases, &luids); backupStorage(config, client); CT_ASSERT_NO_THROW(source.reset()); // don't check for correct importing - that is done in testImport // reduce data std::list items; std::string dummy; CT_ASSERT_NO_THROW(ClientTest::getItems(testcases, items, dummy)); static const pcrecpp::RE bodyre("^BEGIN:(VCARD|VEVENT|VTODO|VJOURNAL)\\r?\\n(.*)^(END:\\g1)", pcrecpp::RE_Options().set_multiline(true).set_dotall(true)); std::string updated = getCurrentTest(); updated += ".updated."; updated += config.m_sourceName; updated += ".dat"; simplifyFilename(updated); ofstream out(updated.c_str()); BOOST_FOREACH (std::string &item, items) { std::string kind; pcrecpp::StringPiece body; CT_ASSERT(bodyre.PartialMatch(item, &kind, &body)); static const pcrecpp::RE propre("^((\\S[^;:]*).*\\n(?:\\s.*\\n)*)", pcrecpp::RE_Options().set_multiline(true)); pcrecpp::StringPiece input(body); pcrecpp::StringPiece prop; std::string propname; std::list result; while (propre.Consume(&input, &prop, &propname)) { if (config.m_essentialProperties.find(propname) != config.m_essentialProperties.end()) { result.push_back(prop.as_string()); } } item.replace(body.data() - item.c_str(), body.size(), boost::join(result, "")); out << item << "\n"; } out.close(); // update SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); std::string updateFailures = config.m_import(client, *source.get(), config, updated, dummy, &luids); CT_ASSERT_NO_THROW(source.reset()); // compare TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceA(), TestingSyncSourcePtr::SLOW)); std::auto_ptr envProps; if (currentServer() == "googlecontacts") { // Google CardDAV server does not remove X- properties when // they are not sent at all. TODO (?): send them as empty // properties. envProps.reset(new ScopedEnvChange("CLIENT_TEST_STRIP_PROPERTIES", "(X-.*)")); } bool equal = compareDatabases(updated.c_str(), *copy.get(), false); CT_ASSERT_NO_THROW(source.reset()); if (importFailures.empty() && updateFailures.empty()) { CT_ASSERT_MESSAGE("imported and exported data equal", equal); } else { CT_ASSERT_EQUAL(std::string(""), importFailures + updateFailures); } } // test change tracking with large number of items void LocalTests::testManyChanges() { // check additional requirements CT_ASSERT(!config.m_templateItem.empty()); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); // check that everything is empty, also resets change counter of sync source B TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // now insert plenty of items int numItems; CT_ASSERT_NO_THROW(numItems = insertManyItems(createSourceA).size()); // check that exactly this number of items is listed as new SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), numItems, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), numItems, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // delete all items CT_ASSERT_NO_THROW(deleteAll(createSourceA)); // verify again SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), numItems, countDeletedItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); } template int countEqual(const T &container, const V &value) { return count(container.begin(), container.end(), value); } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsParent() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // now insert main item CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); // check that exactly the parent is listed as new SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } // delete all items CT_ASSERT_NO_THROW(deleteAll(createSourceA)); // verify again SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsChild() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // same as above for child item CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteAll(createSourceA)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsParentChild() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // insert parent first, then child CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (config.m_supportsReccurenceEXDates) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); CLIENT_TEST_LOG("retrieve parent as reported to the Synthesis engine, check for X-SYNCEVOLUTION-EXDATE-DETACHED"); std::string parentDataEngine; CT_ASSERT_NO_THROW(source->readItem(parent, parentDataEngine)); size_t pos = childData.find("RECURRENCE-ID"); CT_ASSERT(pos != childData.npos); size_t end = childData.find_first_of("\r\n", pos); CT_ASSERT(end != childData.npos); std::string exdate = childData.substr(pos, end - pos); boost::replace_first(exdate, "RECURRENCE-ID", "X-SYNCEVOLUTION-EXDATE-DETACHED"); // not generated because not needed by Synthesis engine boost::replace_first(exdate, ";VALUE=DATE", ""); pos = parentDataEngine.find(exdate); CT_ASSERT_MESSAGE(exdate + " not found in:\n" + parentDataEngine, pos != parentDataEngine.npos); } if (config.m_supportsReccurenceEXDates) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); CLIENT_TEST_LOG("retrieve parent as reported to the Synthesis engine, check for X-SYNCEVOLUTION-EXDATE-DETACHED"); std::string parentDataEngine; CT_ASSERT_NO_THROW(source->readItem(parent, parentDataEngine)); size_t pos = childData.find("RECURRENCE-ID"); CT_ASSERT(pos != childData.npos); size_t end = childData.find_first_of("\r\n", pos); CT_ASSERT(end != childData.npos); std::string exdate = childData.substr(pos, end - pos); boost::replace_first(exdate, "RECURRENCE-ID", "X-SYNCEVOLUTION-EXDATE-DETACHED"); // not generated because not needed by Synthesis engine boost::replace_first(exdate, ";VALUE=DATE", ""); pos = parentDataEngine.find(exdate); CT_ASSERT_MESSAGE(exdate + " not found in:\n" + parentDataEngine, pos != parentDataEngine.npos); } if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteAll(createSourceA)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsChildParent() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // insert child first, then parent CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &parentData)); CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], true, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteAll(createSourceA)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsChildChangesParent() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // insert child first, check changes, then insert the parent CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], true, &parentData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listNewItems(copy.get()), parent)); } // relaxed semantic: the child item might be considered updated now if // it had to be modified when inserting the parent SOURCE_ASSERT(copy.get(), 1 >= countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteAll(createSourceA)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsRemoveParentFirst() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // insert both items, remove parent, then child CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(deleteItem(createSourceA, parent)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); // deleting the parent may or may not modify the child SOURCE_ASSERT(copy.get(), 1 >= countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, child)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsRemoveNormal() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr source, copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // insert both items, remove child, then parent CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(deleteItem(createSourceA, child)); // The removal of the child fails with Exchange (BMC #22849). // Skip the testing, proceed to full removal. if (currentServer() != "exchange") { SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); if (getCurrentTest().find("::eds_event::") != std::string::npos) { bool usingEDSLT36; #ifdef EVOLUTION_COMPATIBILITY // Need to check at runtime. // We are using EDS < 3.6 if (and only if) we found the right libs. usingEDSLT36 = EDSAbiHaveEcal; #elif defined(USE_EDS_CLIENT) // Detected at runtime: new EDS API. usingEDSLT36 = false; #else // Detected at runtime: old EDS API. usingEDSLT36 = true; #endif if (usingEDSLT36) { // hack: ignore EDS < 3.6 side effect of adding EXDATE to parent, see http://bugs.meego.com/show_bug.cgi?id=10906 size_t pos = parentData.rfind("DTSTART"); parentData.insert(pos, getCurrentTest().find("LinkedItemsAllDay") == std::string::npos ? "EXDATE:20080413T090000\n" : "EXDATE:20080413\n"); } } CT_ASSERT_NO_THROW(compareDatabases(source.get(), &parentData, (void *)NULL)); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); // parent might have been updated int updated = false; CT_ASSERT_NO_THROW(updated = countUpdatedItems(copy.get())); SOURCE_ASSERT(copy.get(), 0 <= updated && updated <= 1); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); } CT_ASSERT_NO_THROW(deleteItem(createSourceA, parent)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), // Exchange did not actually remove child above, done now. currentServer() != "exchange" ? 1 : 2, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsInsertParentTwice() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // add parent twice (should be turned into update) CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listUpdatedItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, parent)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsInsertChildTwice() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // add child twice (should be turned into update) CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1])); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listUpdatedItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, child)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsParentUpdate() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // add parent, then update it CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(parent = updateItem(createSourceA, config, parent, items[0], &parentData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listUpdatedItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, parent)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsUpdateChild() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // add child, then update it CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(child = updateItem(createSourceA, config, child, items[1], &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listUpdatedItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, child)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 1, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsInsertBothUpdateChild() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // add parent and child, then update child CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(child = updateItem(createSourceA, config, child, items[1], &childData)); // child has to be listed as modified, parent may be SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT(copy.get(), 1 <= countUpdatedItems(copy.get())); SOURCE_ASSERT(copy.get(), 2 >= countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listUpdatedItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, parent)); CT_ASSERT_NO_THROW(deleteItem(createSourceA, child)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } CT_ASSERT_NO_THROW(copy.reset()); } // test inserting, removing and updating of parent + child item in // various order plus change tracking void LocalTests::testLinkedItemsInsertBothUpdateParent() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // check that everything is empty, also resets change counter of sync source B SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // add parent and child, then update parent CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), child)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); CT_ASSERT_NO_THROW(parent = updateItem(createSourceA, config, parent, items[0], &parentData)); // parent has to be listed as modified, child may be SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); SOURCE_ASSERT_EQUAL(copy.get(), 2, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT(copy.get(), 1 <= countUpdatedItems(copy.get())); SOURCE_ASSERT(copy.get(), 2 >= countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listUpdatedItems(copy.get()), parent)); } CT_ASSERT_NO_THROW(copy.reset()); if (getenv("CLIENT_TEST_LINKED_ITEMS_NO_DELETE")) { return; } CT_ASSERT_NO_THROW(deleteItem(createSourceA, parent)); CT_ASSERT_NO_THROW(deleteItem(createSourceA, child)); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countNewItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countUpdatedItems(copy.get())); SOURCE_ASSERT_EQUAL(copy.get(), 2, countDeletedItems(copy.get())); if (!config.m_sourceLUIDsAreVolatile) { SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), parent)); SOURCE_ASSERT_EQUAL(copy.get(), 1, countEqual(listDeletedItems(copy.get()), child)); } } // - insert parent and child // - update child *without* UID and RECURRENCE-ID: source expected to re-insert them void LocalTests::testLinkedItemsInsertBothUpdateChildNoIDs() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; std::string parentData, childData; TestingSyncSourcePtr copy; // add parent and child, then update child CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false, &parentData)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); // remove UID and RECURRENCE-ID before updating std::string reducedChildData = items[1]; std::string uid; CT_ASSERT_NO_THROW(uid = stripProperty(reducedChildData, "UID")); std::string rid; CT_ASSERT_NO_THROW(rid = stripProperty(reducedChildData, "RECURRENCE-ID")); CT_ASSERT_NO_THROW(child = updateItem(createSourceA, config, child, reducedChildData, &childData)); // compare SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceA())); CT_ASSERT_NO_THROW(insertProperty(childData, uid, "END:VEVENT")); CT_ASSERT_NO_THROW(insertProperty(childData, rid, "END:VEVENT")); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &parentData, &childData, (void *)NULL)); } // - insert child // - update child *without* UID and RECURRENCE-ID: source expected to re-insert them void LocalTests::testLinkedItemsUpdateChildNoIDs() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string child; std::string childData; TestingSyncSourcePtr copy; // add child, then update child CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false, &childData)); // remove UID and RECURRENCE-ID before updating std::string reducedChildData = items[1]; std::string uid; CT_ASSERT_NO_THROW(uid = stripProperty(reducedChildData, "UID")); std::string rid; CT_ASSERT_NO_THROW(rid = stripProperty(reducedChildData, "RECURRENCE-ID")); CT_ASSERT_NO_THROW(child = updateItem(createSourceA, config, child, reducedChildData, &childData)); // compare SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceA())); CT_ASSERT_NO_THROW(insertProperty(childData, uid, "END:VEVENT")); CT_ASSERT_NO_THROW(insertProperty(childData, rid, "END:VEVENT")); CT_ASSERT_NO_THROW(compareDatabases(copy.get(), &childData, (void *)NULL)); } // insert parent, try to delete or retrieve non-existent child: // must report 404 void LocalTests::testLinkedItemsSingle404() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; // now insert main item CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false)); // fake subid: works for CalDAV and EDS child = parent + "no-such-subitem"; // read TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset((createSourceA()))); SyncMLStatus status = STATUS_OK; CT_ASSERT_NO_THROW(try { std::string data; source->readItem(child, data); } catch (const StatusException &ex) { status = ex.syncMLStatus(); } ); CT_ASSERT_EQUAL(STATUS_NOT_FOUND, status); // delete status = STATUS_OK; CT_ASSERT_NO_THROW(try { source->deleteItem(child); } catch (const StatusException &ex) { status = ex.syncMLStatus(); } ); CT_ASSERT_EQUAL(STATUS_NOT_FOUND, status); } // insert parent and child, try to delete or retrieve non-existent child: // must report 404 void LocalTests::testLinkedItemsMany404() { ClientTestConfig::LinkedItems_t items = getParentChildData(); CT_ASSERT_NO_THROW(deleteAll(createSourceA)); std::string parent, child; // now insert two items CT_ASSERT_NO_THROW(parent = insert(createSourceA, items[0], false)); CT_ASSERT_NO_THROW(child = insert(createSourceA, items[1], false)); // fake subid: works for CalDAV and EDS child = parent + "no-such-subitem"; // read TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(createSourceA())); SyncMLStatus status = STATUS_OK; CT_ASSERT_NO_THROW(try { std::string data; source->readItem(child, data); } catch (const StatusException &ex) { status = ex.syncMLStatus(); } ); CT_ASSERT_EQUAL(STATUS_NOT_FOUND, status); // delete status = STATUS_OK; CT_ASSERT_NO_THROW(try { source->deleteItem(child); } catch (const StatusException &ex) { status = ex.syncMLStatus(); } ); CT_ASSERT_EQUAL(STATUS_NOT_FOUND, status); } // Is run as Client::Source::LinkedItems::testSubsetStartSkip // where start = first detached recurrence to send and skip = detached recurrences // to skip before adding the next one (=> 0 = send all). // // "Exdate" instead of Skip is special: it picks the , + 1 and last // item, which typically leads to an irregular pattern and requires adding EXDATEs // in the activesyncd. void LocalTests::testSubset() { ClientTestConfig::LinkedItems_t items = getParentChildData(); int start, skip; std::string test = getCurrentTest(); pcrecpp::RE re("testSubsetStart(\\d+)(?:Skip(\\d+)|(Exdate))"); std::string exdate, optSkip; CT_ASSERT(re.PartialMatch(test, &start, &optSkip, &exdate)); if (exdate.empty()) { // skip case CT_ASSERT(!optSkip.empty()); skip = atoi(optSkip.c_str()); } else { // EXDATE case CT_ASSERT_EQUAL(std::string("Exdate"), exdate); skip = -1; } CT_ASSERT(items.size() > (size_t)start); CT_ASSERT(skip >= -1); // check that everything is empty, also resets change counter of sync source B CT_ASSERT_NO_THROW(deleteAll(createSourceA)); TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); // insert parent first, then child std::list sent; int i = start; while ((size_t)i < items.size() && ((start == 0 && skip == 0) || /* _0_0 really uses all items (stress test) */ skip == -1 || /* _x_e already is limited to 3 items */ i - start < 5)) { /* avoid huge number of items per test */ std::string data; std::string message = StringPrintf("start %d, skip %d, at %d of %d", start, skip, i, (int)items.size()); CT_ASSERT_NO_THROW_MESSAGE(message, insert(createSourceA, items[i], false, &data)); sent.push_back(data); SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(createSourceB())); std::list actual(sent); if (items.m_testLinkedItemsSubsetAdditional) { std::string event = items.m_testLinkedItemsSubsetAdditional(start, skip, i, items.size()); if (!event.empty()) { actual.push_back(event); } } CT_ASSERT_NO_THROW_MESSAGE(message, compareDatabasesRef(*copy, actual)); if (skip >= 0) { // skip intermediate items i += skip + 1; } else if (i == start) { // go to second item i++; } else if (i == start + 1) { // go to last item CT_ASSERT((size_t)i != items.size() - 1); i = items.size() - 1; } else { // done with first, second and last item break; } } } ClientTestConfig::LinkedItems_t LocalTests::getParentChildData() { // extract suffix and use it as index for our config std::string test = getCurrentTest(); const std::string testname = "LinkedItems"; size_t off = test.find(testname); CT_ASSERT(off != test.npos); off += testname.size(); size_t end = test.find(':', off); CT_ASSERT(end != test.npos); std::string name = test.substr(off, end - off); BOOST_FOREACH(const ClientTestConfig::LinkedItems_t &items, config.m_linkedItems) { if (items.m_name == name) { return items; } } BOOST_FOREACH(const ClientTestConfig::LinkedItems_t &items, config.m_linkedItemsSubset) { if (items.m_name == name) { return items; } } CT_ASSERT_MESSAGE("linked items test data not found", false); return ClientTestConfig::LinkedItems_t(); } SyncTests::SyncTests(const std::string &name, ClientTest &cl, std::vector sourceIndices, bool isClientA) : CppUnit::TestSuite(name), client(cl) { sourceArray = new int[sourceIndices.size() + 1]; int offset = 0; for (std::vector::iterator it = sourceIndices.begin(); it != sourceIndices.end(); ++it) { ClientTest::Config config; client.getSyncSourceConfig(*it, config); if (!config.m_sourceName.empty()) { sourceArray[sources.size()+offset] = *it; if (!config.m_subConfigs.empty()) { vector subs; boost::split (subs, config.m_subConfigs, boost::is_any_of(",")); offset++; ClientTest::Config subConfig; BOOST_FOREACH (string sub, subs) { client.getSourceConfig (sub, subConfig); sources.push_back(std::pair(*it, cl.createLocalTests(sub, client.getLocalSourcePosition(sub), subConfig))); offset--; } } else { sources.push_back(std::pair(*it, cl.createLocalTests(config.m_sourceName, client.getLocalSourcePosition(config.m_sourceName), config))); } } } sourceArray[sources.size()+ offset] = -1; // check whether we have a second client ClientTest *clientB = cl.getClientB(); if (clientB) { accessClientB = clientB->createSyncTests(name, sourceIndices, false); } else { accessClientB = 0; } } SyncTests::~SyncTests() { for (source_it it = sources.begin(); it != sources.end(); ++it) { delete it->second; } delete [] sourceArray; if (accessClientB) { delete accessClientB; } } /** adds the supported tests to the instance itself */ void SyncTests::addTests(bool isFirstSource) { if (sources.size()) { const ClientTest::Config &config(sources[0].second->config); // run this test first, even if it is more complex: // if it works, all the following tests will run with // the server in a deterministic state if (config.m_createSourceA) { if (!config.m_insertItem.empty()) { ADD_TEST(SyncTests, testDeleteAllRefresh); } } ADD_TEST(SyncTests, testTwoWaySync); ADD_TEST(SyncTests, testSlowSync); ADD_TEST(SyncTests, testRefreshFromServerSync); ADD_TEST(SyncTests, testRefreshFromClientSync); ADD_TEST(SyncTests, testRefreshFromRemoteSync); ADD_TEST(SyncTests, testRefreshFromLocalSync); // testTimeout is independent of the actual peer; all it needs // is a SyncML client config. Can't test for that explicitly // here, so only rule out the test if we run in server mode. if (isFirstSource && (!getenv("CLIENT_TEST_MODE") || strcmp(getenv("CLIENT_TEST_MODE"), "server"))) { ADD_TEST(SyncTests, testTimeout); } if (config.m_compare && !config.m_testcases.empty() && !isServerMode()) { ADD_TEST(SyncTests, testConversion); } if (config.m_createSourceA) { if (!config.m_insertItem.empty()) { ADD_TEST(SyncTests, testRefreshFromServerSemantic); ADD_TEST(SyncTests, testRefreshFromClientSemantic); ADD_TEST(SyncTests, testRefreshStatus); // This test works regardless whether the peer can // restart: if restarts are not possible, it checks // that they don't occur. The rest of the tests then // only make sense when restarting works. ADD_TEST(SyncTests, testTwoWayRestart); if (getenv("CLIENT_TEST_PEER_CAN_RESTART")) { ADD_TEST(SyncTests, testSlowRestart); ADD_TEST(SyncTests, testRefreshFromLocalRestart); ADD_TEST(SyncTests, testOneWayFromLocalRestart); ADD_TEST(SyncTests, testRefreshFromRemoteRestart); ADD_TEST(SyncTests, testOneWayFromRemoteRestart); ADD_TEST(SyncTests, testManyRestarts); } if (accessClientB && config.m_dump && config.m_compare) { ADD_TEST(SyncTests, testCopy); ADD_TEST(SyncTests, testDelete); ADD_TEST(SyncTests, testAddUpdate); ADD_TEST(SyncTests, testManyItems); ADD_TEST(SyncTests, testManyDeletes); ADD_TEST(SyncTests, testSlowSyncSemantic); ADD_TEST(SyncTests, testComplexRefreshFromServerSemantic); ADD_TEST(SyncTests, testDeleteBothSides); if (config.m_updateItem.find("UID:") != std::string::npos && config.m_updateItem.find("LAST-MODIFIED:") != std::string::npos && sources.size() == 1) { ADD_TEST(SyncTests, testAddBothSides); ADD_TEST(SyncTests, testAddBothSidesRefresh); } // only add when testing individual source, // test data not guaranteed to be available for all sources if (sources.size() == 1 && !config.m_linkedItems.empty()) { ADD_TEST(SyncTests, testLinkedItemsParentChild); if (config.m_linkedItemsRelaxedSemantic) { ADD_TEST(SyncTests, testLinkedItemsChild); ADD_TEST(SyncTests, testLinkedItemsChildParent); } } if (!config.m_updateItem.empty()) { ADD_TEST(SyncTests, testUpdate); } if (!config.m_complexUpdateItem.empty()) { ADD_TEST(SyncTests, testComplexUpdate); } if (!config.m_mergeItem1.empty() && !config.m_mergeItem2.empty()) { ADD_TEST(SyncTests, testMerge); } if (config.m_import) { ADD_TEST(SyncTests, testTwinning); ADD_TEST(SyncTests, testItems); ADD_TEST(SyncTests, testItemsXML); if (config.m_update) { ADD_TEST(SyncTests, testExtensions); } } if (!config.m_templateItem.empty()) { ADD_TEST(SyncTests, testMaxMsg); ADD_TEST(SyncTests, testLargeObject); ADD_TEST(SyncTests, testOneWayFromServer); ADD_TEST(SyncTests, testOneWayFromClient); ADD_TEST(SyncTests, testOneWayFromRemote); ADD_TEST(SyncTests, testOneWayFromLocal); } } } // Tests which depend on item manipulation in the peer. // These tests get enabled if their testdata is found in // testcases/synctests/ and if we are // currently testing only a single source. The tests will // fail if SyncEvolution was not configured correctly for // them (see getPeerConfig()). if (sources.size() == 1) { const std::string sourceName = config.m_sourceName; #define ADD_PEER_TEST(_x) if (isDir(getPeerTestdata(sourceName, #_x, ""))) { ADD_TEST(SyncTests, _x); } ADD_PEER_TEST(testDownload); ADD_PEER_TEST(testUpload); ADD_PEER_TEST(testUpdateLocalWins); ADD_PEER_TEST(testUpdateRemoteWins); } } if (config.m_retrySync && !config.m_insertItem.empty() && !config.m_updateItem.empty() && accessClientB && config.m_dump && config.m_compare) { CppUnit::TestSuite *retryTests = new CppUnit::TestSuite(getName() + "::Retry"); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientAdd); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientRemove); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientUpdate); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerAdd); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerRemove); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerUpdate); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientAddBig); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeClientUpdateBig); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerAddBig); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeServerUpdateBig); ADD_TEST_TO_SUITE(retryTests, SyncTests, testInterruptResumeFull); addTest(FilterTest(retryTests)); } if (config.m_suspendSync && !config.m_insertItem.empty() && !config.m_updateItem.empty() && accessClientB && config.m_dump && config.m_compare) { CppUnit::TestSuite *suspendTests = new CppUnit::TestSuite(getName() + "::Suspend"); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientAdd); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientRemove); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientUpdate); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerAdd); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerRemove); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerUpdate); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientAddBig); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendClientUpdateBig); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerAddBig); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendServerUpdateBig); ADD_TEST_TO_SUITE(suspendTests, SyncTests, testUserSuspendFull); addTest(FilterTest(suspendTests)); } if (config.m_resendSync && !config.m_insertItem.empty() && !config.m_updateItem.empty() && accessClientB && config.m_dump && config.m_compare) { CppUnit::TestSuite *resendTests = new CppUnit::TestSuite(getName() + "::Resend"); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendClientAdd); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendClientRemove); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendClientUpdate); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendServerAdd); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendServerRemove); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendServerUpdate); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendFull); addTest(FilterTest(resendTests)); } if (getenv("CLIENT_TEST_RESEND_PROXY") && !config.m_insertItem.empty() && !config.m_updateItem.empty() && accessClientB && config.m_dump && config.m_compare) { CppUnit::TestSuite *resendTests = new CppUnit::TestSuite(getName() + "::ResendProxy"); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyClientAdd); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyClientRemove); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyClientUpdate); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyServerAdd); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyServerRemove); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyServerUpdate); ADD_TEST_TO_SUITE(resendTests, SyncTests, testResendProxyFull); addTest(FilterTest(resendTests)); } } } bool SyncTests::compareDatabases(const char *refFileBase, bool raiseAssert) { source_it it1; source_it it2; bool equal = true; CT_ASSERT(accessClientB); for (it1 = sources.begin(), it2 = accessClientB->sources.begin(); it1 != sources.end() && it2 != accessClientB->sources.end(); ++it1, ++it2) { TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(it2->second->createSourceB())); if (refFileBase) { std::string refFile = refFileBase; refFile += it1->second->config.m_sourceName; refFile += ".dat"; simplifyFilename(refFile); if (!it1->second->compareDatabases(refFile.c_str(), *copy.get(), raiseAssert)) { equal = false; } } else { if (!it1->second->compareDatabases(NULL, *copy.get(), raiseAssert)) { equal = false; } } CT_ASSERT_NO_THROW(copy.reset()); } CT_ASSERT(it1 == sources.end()); CT_ASSERT(it2 == accessClientB->sources.end()); CT_ASSERT(!raiseAssert || equal); return equal; } /** deletes all items locally and on server */ void SyncTests::deleteAll(DeleteAllMode mode) { SyncPrefix prefix("deleteall", *this); const char *value = getenv ("CLIENT_TEST_DELETE_REFRESH"); if (value) { mode = DELETE_ALL_REFRESH; } switch(mode) { case DELETE_ALL_SYNC: // a refresh from server would slightly reduce the amount of data exchanged, but not all servers support it CT_ASSERT_NO_THROW(allSourcesDeleteAll()); doSync(__FILE__, __LINE__, "init", SyncOptions(SYNC_SLOW)); // now that client and server are in sync, delete locally and sync again CT_ASSERT_NO_THROW(allSourcesDeleteAll()); doSync(__FILE__, __LINE__, "twoway", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,-1, true, SYNC_TWO_WAY))); break; case DELETE_ALL_REFRESH: // delete locally and then tell the server to "copy" the empty databases CT_ASSERT_NO_THROW(allSourcesDeleteAll()); doSync(__FILE__, __LINE__, "refreshserver", SyncOptions(RefreshFromLocalMode(), CheckSyncReport(0,0,0, 0,0,-1, true, SYNC_REFRESH_FROM_LOCAL))); break; } } /** get both clients in sync with empty server, then copy one item from client A to B */ void SyncTests::doCopy() { SyncPrefix copy("copy", *this); // check requirements CT_ASSERT(accessClientB); CT_ASSERT_NO_THROW(deleteAll()); accessClientB->deleteAll(); bool allowLocalUpdate = getenv("CLIENT_TEST_MAY_COPY_BACK") != NULL; // insert into first database, copy to server CT_ASSERT_NO_THROW(allSourcesInsert()); doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0, allowLocalUpdate? -1 : 0, 0, 1,0,0, true, SYNC_TWO_WAY))); // copy into second database accessClientB->doSync(__FILE__, __LINE__, "recv", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 0,0,0, true, SYNC_TWO_WAY))); CT_ASSERT_NO_THROW(compareDatabases()); } /** * Replicate server database locally. Works with all servers * (including those which do not support refresh sync) because the * Synthesis engine will do a local delete + slow sync (by default) * and a real refresh sync only when asked to explicitly (Funambol). */ void SyncTests::refreshClient(SyncOptions options) { doSync(__FILE__, __LINE__, "refresh", options .setSyncMode(SYNC_REFRESH_FROM_REMOTE) .setCheckReport(CheckSyncReport(-1,0,-1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); } // delete all items, locally and on server using refresh-from-client sync void SyncTests::testDeleteAllRefresh() { source_it it; // start with clean local data CT_ASSERT_NO_THROW(allSourcesDeleteAll()); // copy something to server first; doesn't matter whether it has the // item already or not, as long as it exists there afterwards CT_ASSERT_NO_THROW(allSourcesInsert()); doSync(__FILE__, __LINE__, "insert", SyncOptions(SYNC_SLOW)); // now ensure we can delete it deleteAll(DELETE_ALL_REFRESH); // nothing stored locally? for (it = sources.begin(); it != sources.end(); ++it) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceA())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } // make sure server really deleted everything doSync(__FILE__, __LINE__, "check", SyncOptions(SYNC_SLOW, CheckSyncReport(0,0,0, 0,0,0, true, SYNC_SLOW))); for (it = sources.begin(); it != sources.end(); ++it) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceA())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // refresh-from-server sync, regardless of peer's role void SyncTests::testRefreshFromServerSync() { doSync(__FILE__, __LINE__, SyncOptions(SYNC_REFRESH_FROM_SERVER, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, isServerMode() ? SYNC_REFRESH_FROM_LOCAL : SYNC_REFRESH_FROM_REMOTE))); } // do a refresh-from-client sync, regardless of peer's role void SyncTests::testRefreshFromClientSync() { doSync(__FILE__, __LINE__, SyncOptions(SYNC_REFRESH_FROM_CLIENT, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, isServerMode() ? SYNC_REFRESH_FROM_REMOTE : SYNC_REFRESH_FROM_LOCAL))); } // do a refresh-from-remote sync, regardless of peer's role void SyncTests::testRefreshFromRemoteSync() { doSync(__FILE__, __LINE__, SyncOptions(SYNC_REFRESH_FROM_REMOTE, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_REFRESH_FROM_REMOTE))); } // do a refresh-from-local sync, regardless of peer's role void SyncTests::testRefreshFromLocalSync() { doSync(__FILE__, __LINE__, SyncOptions(SYNC_REFRESH_FROM_LOCAL, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_REFRESH_FROM_LOCAL))); } // delete all items, locally and on server using two-way sync void SyncTests::testDeleteAllSync() { CT_ASSERT_NO_THROW(deleteAll(DELETE_ALL_SYNC)); } // test that a refresh sync from an empty server leads to an empty datatbase // and no changes are sent to server during next two-way sync void SyncTests::testRefreshFromServerSemantic() { source_it it; // clean client and server CT_ASSERT_NO_THROW(deleteAll()); // insert item, then refresh from empty server CT_ASSERT_NO_THROW(allSourcesInsert()); doSync(__FILE__, __LINE__, "refresh", SyncOptions(RefreshFromPeerMode(), CheckSyncReport(0,0,-1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); // check for (it = sources.begin(); it != sources.end(); ++it) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceA())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } doSync(__FILE__, __LINE__, "two-way", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,0, true, SYNC_TWO_WAY))); } // test that a refresh sync from an empty client leads to an empty datatbase // and no changes are sent to server during next two-way sync void SyncTests::testRefreshFromClientSemantic() { source_it it; // clean client and server CT_ASSERT_NO_THROW(deleteAll()); // insert item, send to server CT_ASSERT_NO_THROW(allSourcesInsert()); doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); // delete locally CT_ASSERT_NO_THROW(allSourcesDeleteAll()); // refresh from client doSync(__FILE__, __LINE__, "refresh", SyncOptions(RefreshFromLocalMode(), CheckSyncReport(0,0,0, 0,0,0, true, SYNC_REFRESH_FROM_LOCAL))); // check doSync(__FILE__, __LINE__, "check", SyncOptions(RefreshFromPeerMode(), CheckSyncReport(0,0,0, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); } // tests the following sequence of events: // - insert item // - delete all items // - insert one other item // - refresh from client // => no items should now be listed as new, updated or deleted for this client during another sync void SyncTests::testRefreshStatus() { source_it it; CT_ASSERT_NO_THROW(allSourcesInsert(false)); CT_ASSERT_NO_THROW(allSourcesDeleteAll()); CT_ASSERT_NO_THROW(allSourcesInsert()); doSync(__FILE__, __LINE__, "refresh-from-client", SyncOptions(RefreshFromLocalMode(), CheckSyncReport(0,0,0, -1,-1,-1, /* strictly speaking 1,0,0, but not sure exactly what the server will be told */ true, SYNC_REFRESH_FROM_LOCAL))); doSync(__FILE__, __LINE__, "two-way", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,0, true, SYNC_TWO_WAY))); } static void log(const char *text) { CLIENT_TEST_LOG("%s", text); } static void logSyncSourceReport(SyncSource *source) { CLIENT_TEST_LOG("source %s, start of cycle #%d: local new/mod/del/conflict %d/%d/%d/%d, remote %d/%d/%d/%d, mode %s", source->getName().c_str(), source->getRestarts(), source->getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ADDED, SyncSource::ITEM_TOTAL), source->getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_UPDATED, SyncSource::ITEM_TOTAL), source->getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_REMOVED, SyncSource::ITEM_TOTAL), source->getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSource::ITEM_REJECT), source->getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ADDED, SyncSource::ITEM_TOTAL), source->getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_UPDATED, SyncSource::ITEM_TOTAL), source->getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_REMOVED, SyncSource::ITEM_TOTAL), source->getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, SyncSource::ITEM_REJECT), PrettyPrintSyncMode(source->getFinalSyncMode()).c_str()); } /** * Helper function, to be used inside a SyncOptions start callback * to connect all sources instantiated for a sync with the given * pre-operation signal. */ template bool connectSourceSignal(SyncContext &context, W SyncSource::Operations::*operation, M getSignal, const S &slot) { BOOST_FOREACH(const SyncSource *source, *context.getSources()) { ((source->getOperations().*operation).*getSignal)().connect(slot); } return false; } void SyncTests::doRestartSync(SyncMode mode) { CT_ASSERT_NO_THROW(deleteAll()); int startCount = 0; bool needToConnect = true; typedef std::map Reports_t; typedef std::map Cycles_t; Cycles_t results; // Triggered for every m_startDataRead. // // It records the current source statistics for later checking and // logs it. // // Also requests a restart at the very beginning, once. Must be // done before m_endDataWrite, because then it might be too late // to restart. boost::function start = (boost::lambda::if_then(boost::lambda::bind(&Cycles_t::empty, boost::ref(results)), (boost::lambda::bind(log, "requesting restart"), boost::lambda::bind(SyncContext::requestAnotherSync))), (boost::lambda::var(results)[boost::lambda::bind(&SyncSource::getRestarts, &boost::lambda::_1)] [boost::lambda::bind(&SyncSource::getName, &boost::lambda::_1)] = boost::lambda::_1), boost::lambda::bind(logSyncSourceReport, &boost::lambda::_1), boost::lambda::constant(STATUS_OK) ); // Triggered at the end of each m_endDataWrite. // // Adds a new item or (in later syncs) updates/deletes // it. Because the cycle is other, those changes won't // interfere with the cycle. Doing real concurrent // changes is something for another tests... boost::function end = boost::bind(boost::function( (boost::lambda::if_then(++boost::lambda::var(startCount) == sources.size(), (boost::lambda::bind(log, "inserting one item"), boost::lambda::bind(&SyncTests::allSourcesInsert, this, true))), boost::lambda::constant(STATUS_OK) ))); SyncOptions::Callback_t setup = (boost::lambda::if_then(boost::lambda::var(needToConnect), (boost::lambda::var(needToConnect) = false, boost::lambda::bind(connectSourceSignal, boost::lambda::_1, &SyncSource::Operations::m_startDataRead, &SyncSource::Operations::StartDataRead_t::getPreSignal, boost::cref(start)), boost::lambda::bind(connectSourceSignal, boost::lambda::_1, &SyncSource::Operations::m_endDataWrite, &SyncSource::Operations::EndDataWrite_t::getPostSignal, boost::cref(end)) )), boost::lambda::constant(false) ); bool canRestart = getenv("CLIENT_TEST_PEER_CAN_RESTART") != NULL && !isServerMode(); CT_ASSERT_NO_THROW(doSync(__FILE__, __LINE__, "add", SyncOptions(mode, CheckSyncReport(0, 0, // TODO (?): should the item added after the initial refresh-from-remote be deleted in the second cycle? // Right now it isn't, because the second sync is // a one-way-from-remote. mode == SYNC_REFRESH_FROM_REMOTE ? /* 1 */ 0 : 0, // nothing transferred when item only exists locally // and not transferring to peer !canRestart ? 0 : (mode == SYNC_ONE_WAY_FROM_REMOTE || mode == SYNC_REFRESH_FROM_REMOTE) ? 0 : 1, 0, 0, true, mode) .setRestarts(canRestart ? 1 : 0)) .setStartCallback(setup) )); // two cycles if restarted, one otherwise CT_ASSERT_EQUAL((size_t)(canRestart ? 2 : 1), results.size()); // nothing transfered before first or second cycle BOOST_FOREACH(const Cycles_t::value_type &cycle, results) { CT_ASSERT_EQUAL(sources.size(), cycle.second.size()); BOOST_FOREACH(const Reports_t::value_type &entry, cycle.second) { CT_ASSERT_NO_THROW(CheckSyncReport(0,0, 0, 0,0,0) .setRestarts(cycle.first) .check(entry.first, entry.second)); } } // one item exists now, in all cases // (but see remark about refresh-from-remote!) BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(source_pair.second->createSourceA())); CT_ASSERT_EQUAL(1, countItems(source.get())); } if (mode == SYNC_REFRESH_FROM_REMOTE || !canRestart) { // Can't continue testing for refresh-from-remote, because the // item was never sent to remote and will be gone locally // after the next refresh-from-remote (prevents updating and // deleting it locally). // Without restart support further tests don't make much sense. // We already verified above that a restart request was // correctly rejected/ignored. return; } // update item while the sync runs #ifndef __clang_analyzer__ needToConnect = true; #endif startCount = 0; results.clear(); end = boost::bind(boost::function( (boost::lambda::if_then(++boost::lambda::var(startCount) == sources.size(), (boost::lambda::bind(log, "update one item"), boost::lambda::bind(&SyncTests::allSourcesUpdate, this))), STATUS_OK) )); CT_ASSERT_NO_THROW(doSync(__FILE__, __LINE__, "update", SyncOptions(mode, CheckSyncReport(0,0,0, // refresh-from-local and slow sync transfer existing item // in first cycle anew (mode == SYNC_REFRESH_FROM_LOCAL || mode == SYNC_SLOW) ? 1 : 0, // nothing transferred when item only exists locally // and not transferring to peer mode == SYNC_ONE_WAY_FROM_REMOTE ? 0 : 1, 0, true, mode) .setRestarts(1)) .setStartCallback(setup) )); // two cycles CT_ASSERT_EQUAL((size_t)2, results.size()); // nothing transfered before first or second cycle BOOST_FOREACH(const Cycles_t::value_type &cycle, results) { CLIENT_TEST_LOG("checking cycle #%d", cycle.first); CT_ASSERT_EQUAL(sources.size(), cycle.second.size()); BOOST_FOREACH(const Reports_t::value_type &entry, cycle.second) { CT_ASSERT_NO_THROW(CheckSyncReport(0,0,0, // refresh-from-local and slow sync transfer existing item // in first cycle anew (cycle.first == 1 && (mode == SYNC_REFRESH_FROM_LOCAL || mode == SYNC_SLOW)) ? 1 : 0, 0,0) .setRestarts(cycle.first) .check(entry.first, entry.second)); } } // one item exists now, in all cases // (but see remark about refresh-from-remote!) BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(source_pair.second->createSourceA())); CT_ASSERT_EQUAL(1, countItems(source.get())); } // delete item while the sync runs #ifndef __clang_analyzer__ needToConnect = true; #endif startCount = 0; results.clear(); end = boost::bind(boost::function( (boost::lambda::if_then(++boost::lambda::var(startCount) == sources.size(), (boost::lambda::bind(log, "delete one item"), boost::lambda::bind(&SyncTests::allSourcesDeleteAll, this))), STATUS_OK) )); CT_ASSERT_NO_THROW(doSync(__FILE__, __LINE__, "delete", SyncOptions(mode, CheckSyncReport(0,0,0, // refresh-from-local and slow sync transfer existing item // in first cycle anew (mode == SYNC_REFRESH_FROM_LOCAL || mode == SYNC_SLOW) ? 1 : 0, 0, // nothing transferred when item only existed locally // and not transferring to peer mode == SYNC_ONE_WAY_FROM_REMOTE ? 0 : 1, true, mode) .setRestarts(1)) .setStartCallback(setup) )); // two cycles CT_ASSERT_EQUAL((size_t)2, results.size()); // nothing transfered before first or second cycle BOOST_FOREACH(const Cycles_t::value_type &cycle, results) { CT_ASSERT_EQUAL(sources.size(), cycle.second.size()); BOOST_FOREACH(const Reports_t::value_type &entry, cycle.second) { CT_ASSERT_NO_THROW(CheckSyncReport(0,0, 0, // refresh-from-local and slow sync transfer existing item // in first cycle anew (cycle.first == 1 && (mode == SYNC_REFRESH_FROM_LOCAL || mode == SYNC_SLOW)) ? 1 : 0, 0,0) .setRestarts(cycle.first) .check(entry.first, entry.second)); } } // no item exists now, in all cases BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(source_pair.second->createSourceA())); CT_ASSERT_EQUAL(0, countItems(source.get())); } } // two-way sync when both sides are empty, // insert item locally while sync runs, restart // => one item sent to peer void SyncTests::testTwoWayRestart() { CT_ASSERT_NO_THROW(doRestartSync(SYNC_TWO_WAY)); } // slow sync when both sides are empty, // insert item locally while sync runs, restart // => one item sent to peer void SyncTests::testSlowRestart() { CT_ASSERT_NO_THROW(doRestartSync(SYNC_SLOW)); } // refresh-from-local sync when both sides are empty, // insert item locally while sync runs, restart // => one item sent to peer void SyncTests::testRefreshFromLocalRestart() { CT_ASSERT_NO_THROW(doRestartSync(SYNC_REFRESH_FROM_LOCAL)); } // one-way-from-local sync when both sides are empty, // insert item locally while sync runs, restart // => one item sent to peer void SyncTests::testOneWayFromLocalRestart() { CT_ASSERT_NO_THROW(doRestartSync(SYNC_ONE_WAY_FROM_LOCAL)); } // refresh-from-remote sync when both sides are empty, // insert item locally while sync runs, restart // => *nothing* sent to peer void SyncTests::testRefreshFromRemoteRestart() { CT_ASSERT_NO_THROW(doRestartSync(SYNC_REFRESH_FROM_REMOTE)); } // one-way-from-remote sync when both sides are empty, // insert item locally while sync runs, restart // => *nothing* sent to peer void SyncTests::testOneWayFromRemoteRestart() { CT_ASSERT_NO_THROW(doRestartSync(SYNC_ONE_WAY_FROM_REMOTE)); } // Start with empty database, refresh peer. // Then add 1, 2, 4, 8 items in four cycles, // update them the same way, and finally delete them. // Results in 12 cycles with different changes and // one empty, final cycle. void SyncTests::testManyRestarts() { CT_ASSERT_NO_THROW(deleteAll()); int startCount = 0; bool needToConnect = true; typedef std::map Reports_t; typedef std::map Cycles_t; Cycles_t results; std::map > luids; // Triggered for every m_startDataRead. // // It records the current source statistics for later checking, // logs it, and does the item changes. boost::function start = (boost::lambda::if_then(boost::lambda::var(startCount) % sources.size() == 0, ( boost::lambda::switch_statement(boost::lambda::var(startCount) / sources.size(), boost::lambda::case_statement<0>( (boost::lambda::bind(log, "insert 1 item, restart"), boost::lambda::bind(&SyncTests::allSourcesInsertMany, this, 1, 1, boost::ref(luids)), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<1>( (boost::lambda::bind(log, "insert 2 items, restart"), boost::lambda::bind(&SyncTests::allSourcesInsertMany, this, 2, 2, boost::ref(luids)), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<2>( (boost::lambda::bind(log, "insert 4 items, restart"), boost::lambda::bind(&SyncTests::allSourcesInsertMany, this, 4, 4, boost::ref(luids)), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<3>( (boost::lambda::bind(log, "insert 8 items, restart"), boost::lambda::bind(&SyncTests::allSourcesInsertMany, this, 8, 8, boost::ref(luids)), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<4>( (boost::lambda::bind(log, "update 1 item, restart"), boost::lambda::bind(&SyncTests::allSourcesUpdateMany, this, 1, 1, 1, boost::ref(luids), 0), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<5>( (boost::lambda::bind(log, "update 2 items, restart"), boost::lambda::bind(&SyncTests::allSourcesUpdateMany, this, 2, 2, 1, boost::ref(luids), 1), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<6>( (boost::lambda::bind(log, "update 4 items, restart"), boost::lambda::bind(&SyncTests::allSourcesUpdateMany, this, 4, 4, 1, boost::ref(luids), 3), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<7>( (boost::lambda::bind(log, "update 8 items, restart"), boost::lambda::bind(&SyncTests::allSourcesUpdateMany, this, 8, 8, 1, boost::ref(luids), 7), boost::lambda::bind(SyncContext::requestAnotherSync) )) ), // must break up switch statement, it only has a limited number of case slots boost::lambda::switch_statement(boost::lambda::var(startCount) / sources.size(), boost::lambda::case_statement<8>( (boost::lambda::bind(log, "delete 1 item, restart"), boost::lambda::bind(&SyncTests::allSourcesRemoveMany, this, 1, boost::ref(luids), 0), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<9>( (boost::lambda::bind(log, "delete 2 items, restart"), boost::lambda::bind(&SyncTests::allSourcesRemoveMany, this, 2, boost::ref(luids), 1), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<10>( (boost::lambda::bind(log, "delete 4 items, restart"), boost::lambda::bind(&SyncTests::allSourcesRemoveMany, this, 4, boost::ref(luids), 3), boost::lambda::bind(SyncContext::requestAnotherSync) )), boost::lambda::case_statement<11>( (boost::lambda::bind(log, "delete 8 items, restart"), boost::lambda::bind(&SyncTests::allSourcesRemoveMany, this, 8, boost::ref(luids), 7), boost::lambda::bind(SyncContext::requestAnotherSync) )) ) ) ), (boost::lambda::var(results)[boost::lambda::bind(&SyncSource::getRestarts, &boost::lambda::_1)] [boost::lambda::bind(&SyncSource::getName, &boost::lambda::_1)] = boost::lambda::_1 ), boost::lambda::bind(logSyncSourceReport, &boost::lambda::_1), ++boost::lambda::var(startCount), boost::lambda::constant(STATUS_OK) ); SyncOptions::Callback_t setup = (boost::lambda::if_then(boost::lambda::var(needToConnect), (boost::lambda::var(needToConnect) = false, boost::lambda::bind(connectSourceSignal, boost::lambda::_1, &SyncSource::Operations::m_startDataRead, &SyncSource::Operations::StartDataRead_t::getPreSignal, boost::cref(start)) )), boost::lambda::constant(false) ); CT_ASSERT_NO_THROW(doSync(__FILE__, __LINE__, SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0, 0, 0, 15, 15, 15, true, SYNC_TWO_WAY) .setRestarts(12)) .setStartCallback(setup) )); // 13 cycles CT_ASSERT_EQUAL((size_t)13, results.size()); static const int changes[13][3] = { { 0, 0, 0 }, // nothing before first cycle { 1, 0, 0 }, // result of first cycle { 3, 0, 0 }, // statistics are cummulative: first + second { 7, 0, 0 }, { 15, 0, 0 }, { 15, 1, 0 }, { 15, 3, 0 }, { 15, 7, 0 }, { 15, 15, 0 }, { 15, 15, 1 }, { 15, 15, 3 }, { 15, 15, 7 }, { 15, 15, 15 } }; BOOST_FOREACH(const Cycles_t::value_type &cycle, results) { CT_ASSERT_EQUAL(sources.size(), cycle.second.size()); BOOST_FOREACH(const Reports_t::value_type &entry, cycle.second) { const int *c = changes[cycle.first]; CLIENT_TEST_LOG("Checking stats before cycle #%d, source %s: expected remote %d/%d/%d", cycle.first, entry.first.c_str(), c[0], c[1], c[2]); CT_ASSERT_NO_THROW(CheckSyncReport(0,0,0, c[0], c[1], c[2]) .setRestarts(cycle.first) .check(entry.first, entry.second)); } } // no item exists now BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(source_pair.second->createSourceA())); CT_ASSERT_EQUAL(0, countItems(source.get())); } } // test that a two-way sync copies an item from one address book into the other void SyncTests::testCopy() { CT_ASSERT_NO_THROW(doCopy()); CT_ASSERT_NO_THROW(compareDatabases()); } // test that a two-way sync copies updates from database to the other client, // using simple data commonly supported by servers void SyncTests::testUpdate() { CT_ASSERT(sources.begin() != sources.end()); CT_ASSERT(!sources.begin()->second->config.m_updateItem.empty()); // setup client A, B and server so that they all contain the same item CT_ASSERT_NO_THROW(doCopy()); source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->update(it->second->createSourceA, it->second->config.m_updateItem)); } doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,1,0, true, SYNC_TWO_WAY))); accessClientB->doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,1,0, 0,0,0, true, SYNC_TWO_WAY))); CT_ASSERT_NO_THROW(compareDatabases()); } // test that a two-way sync copies updates from database to the other client, // using data that some, but not all servers support, like adding a second // phone number to a contact void SyncTests::testComplexUpdate() { // setup client A, B and server so that they all contain the same item CT_ASSERT_NO_THROW(doCopy()); source_it it; for (it = sources.begin(); it != sources.end(); ++it) { it->second->update(it->second->createSourceA, /* this test might get executed with some sources which have a complex update item while others don't: use the normal update item for them or even just the same item */ !it->second->config.m_complexUpdateItem.empty() ? it->second->config.m_complexUpdateItem : !it->second->config.m_updateItem.empty() ? it->second->config.m_updateItem : it->second->config.m_insertItem ); } doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,1,0, true, SYNC_TWO_WAY))); accessClientB->doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,1,0, 0,0,0, true, SYNC_TWO_WAY))); CT_ASSERT_NO_THROW(compareDatabases()); } // test that a two-way sync deletes the copy of an item in the other database void SyncTests::testDelete() { // setup client A, B and server so that they all contain the same item CT_ASSERT_NO_THROW(doCopy()); // delete it on A CT_ASSERT_NO_THROW(allSourcesDeleteAll()); // transfer change from A to server to B doSync(__FILE__, __LINE__, "delete", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,1, true, SYNC_TWO_WAY))); accessClientB->doSync(__FILE__, __LINE__, "delete", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,1, 0,0,0, true, SYNC_TWO_WAY))); // check client B: shouldn't have any items now for (source_it it = sources.begin(); it != sources.end(); ++it) { TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(it->second->createSourceA())); SOURCE_ASSERT_EQUAL(copy.get(), 0, countItems(copy.get())); CT_ASSERT_NO_THROW(copy.reset()); } } // test what the server does when it finds that different // fields of the same item have been modified void SyncTests::testMerge() { // setup client A, B and server so that they all contain the same item CT_ASSERT_NO_THROW(doCopy()); // update in client A source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->update(it->second->createSourceA, it->second->config.m_mergeItem1)); } // update in client B for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->update(it->second->createSourceA, it->second->config.m_mergeItem2)); } // send change to server from client A (no conflict) doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,1,0, true, SYNC_TWO_WAY))); // Now the changes from client B (conflict!). // There are several possible outcomes: // - client item completely replaces server item // - server item completely replaces client item (update on client) // - server merges and updates client accessClientB->doSync(__FILE__, __LINE__, "conflict", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_TWO_WAY))); // figure out how the conflict during ".conflict" was handled for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(it->second->createSourceA())); int numItems = 0; SOURCE_ASSERT_NO_FAILURE(copy.get(), numItems = countItems(copy.get())); CT_ASSERT(numItems >= 1); CT_ASSERT(numItems <= 2); std::cerr << " \"" << it->second->config.m_sourceName << ": " << (numItems == 1 ? "conflicting items were merged" : "both of the conflicting items were preserved") << "\" "; std::cerr.flush(); CT_ASSERT_NO_THROW(copy.reset()); } // now pull the same changes into client A doSync(__FILE__, __LINE__, "refresh", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(-1,-1,-1, 0,0,0, true, SYNC_TWO_WAY))); // client A and B should have identical data now CT_ASSERT_NO_THROW(compareDatabases()); // Furthermore, it should be identical with the server. // Be extra careful and pull that data anew and compare once more. doSync(__FILE__, __LINE__, "check", SyncOptions(RefreshFromPeerMode(), CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_REFRESH_FROM_REMOTE))); CT_ASSERT_NO_THROW(compareDatabases()); } // test what the server does when it has to execute a slow sync // with identical data on client and server: // expected behaviour is that nothing changes void SyncTests::testTwinning() { // clean server and client A CT_ASSERT_NO_THROW(deleteAll()); // import test data source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->testImport()); } // send to server doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY)); // ensure that client has the same data, thus ignoring data conversion // issues (those are covered by testItems()) CT_ASSERT_NO_THROW(refreshClient()); // copy to client B to have another copy CT_ASSERT_NO_THROW(accessClientB->refreshClient()); // slow sync should not change anything doSync(__FILE__, __LINE__, "twinning", SyncOptions(SYNC_SLOW)); // check CT_ASSERT_NO_THROW(compareDatabases()); } // tests one-way sync from peer: // - get both clients and server in sync with no items anywhere // - add one item on first client, copy to server // - add a different item on second client, one-way-from-server // - two-way sync with first client // => one item on first client, two on second // - delete on first client, sync that to second client // via two-way sync + one-way-from-server // => one item left on second client (the one inserted locally) void SyncTests::doOneWayFromRemote(SyncMode oneWayFromRemote) { // no items anywhere CT_ASSERT_NO_THROW(deleteAll()); CT_ASSERT_NO_THROW(accessClientB->refreshClient()); // check that everything is empty, also resets change tracking // in second sources of each client source_it it; for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // add one item on first client, copy to server, and check change tracking via second source for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insertManyItems(it->second->createSourceA, 200, 1)); } doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // add a different item on second client, one-way-from-server // => one item added locally, none sent to server for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insertManyItems(it->second->createSourceA, 2, 1)); if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } accessClientB->doSync(__FILE__, __LINE__, "recv", SyncOptions(oneWayFromRemote, CheckSyncReport(1,0,0, 0,0,0, true, SYNC_ONE_WAY_FROM_REMOTE))); for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 2, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // two-way sync with first client for verification // => no changes doSync(__FILE__, __LINE__, "check", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,0, true, SYNC_TWO_WAY))); for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // delete items on clientA, sync to server for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA)); if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } doSync(__FILE__, __LINE__, "delete", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,1, true, SYNC_TWO_WAY))); for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // sync the same change to second client // => one item left (the one inserted locally) accessClientB->doSync(__FILE__, __LINE__, "delete", SyncOptions(oneWayFromRemote, CheckSyncReport(0,0,1, 0,0,0, true, SYNC_ONE_WAY_FROM_REMOTE))); for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } } // one-way-from-remote test with one-way-from-client/server, depending // on role of remote side void SyncTests::testOneWayFromServer() { CT_ASSERT_NO_THROW(doOneWayFromRemote(OneWayFromPeerMode())); } void SyncTests::testOneWayFromRemote() { CT_ASSERT_NO_THROW(doOneWayFromRemote(SYNC_ONE_WAY_FROM_REMOTE)); } // tests one-way sync from local side: // - get both clients and server in sync with no items anywhere // - add one item on first client, copy to server // - add a different item on second client, one-way-from-client // - two-way sync with first client // => two items on first client, one on second // - delete on second client, sync that to first client // via one-way-from-client, two-way // => one item left on first client (the one inserted locally) void SyncTests::doOneWayFromLocal(SyncMode oneWayFromLocal) { // no items anywhere CT_ASSERT_NO_THROW(deleteAll()); CT_ASSERT_NO_THROW(accessClientB->deleteAll()); // check that everything is empty, also resets change tracking // in second sources of each client source_it it; for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // add one item on first client, copy to server, and check change tracking via second source for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insertManyItems(it->second->createSourceA, 1, 1)); } doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // add a different item on second client, one-way-from-client // => no item added locally, one sent to server for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insertManyItems(it->second->createSourceA, 2, 1)); if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } accessClientB->doSync(__FILE__, __LINE__, "send", SyncOptions(oneWayFromLocal, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_ONE_WAY_FROM_LOCAL))); for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // two-way sync with client A for verification // => receive one item doSync(__FILE__, __LINE__, "check", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 0,0,0, true, SYNC_TWO_WAY))); for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 2, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // delete items on client B, sync to server for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->deleteAll(it->second->createSourceA)); if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } accessClientB->doSync(__FILE__, __LINE__, "delete", SyncOptions(oneWayFromLocal, CheckSyncReport(0,0,0, 0,0,1, true, SYNC_ONE_WAY_FROM_LOCAL))); for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // sync the same change to client A // => one item left (the one inserted locally) doSync(__FILE__, __LINE__, "delete", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,1, 0,0,0, true, SYNC_TWO_WAY))); for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 1, countItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countNewItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 1, countDeletedItems(source.get())); SOURCE_ASSERT_EQUAL(source.get(), 0, countUpdatedItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } } // do a two-way sync without additional checks, // may or may not actually be done in two-way mode void SyncTests::testTwoWaySync() { doSync(__FILE__, __LINE__, SyncOptions(SYNC_TWO_WAY)); } void SyncTests::testSlowSync() { doSync(__FILE__, __LINE__, SyncOptions(SYNC_SLOW, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_SLOW))); } // one-way-from-local test with one-way-from-client/server, depending // on role of local side void SyncTests::testOneWayFromClient() { CT_ASSERT_NO_THROW(doOneWayFromLocal(OneWayFromLocalMode())); } // do a slow sync without additional checks void SyncTests::testOneWayFromLocal() { CT_ASSERT_NO_THROW(doOneWayFromLocal(SYNC_ONE_WAY_FROM_LOCAL)); } // get engine ready, then use it to convert our test items // to and from the internal field list void SyncTests::testConversion() { bool success = false; SyncOptions::Callback_t callback = boost::bind(&SyncTests::doConversionCallback, this, &success, _1, _2); doSync(__FILE__, __LINE__, SyncOptions(SYNC_TWO_WAY, CheckSyncReport(-1,-1,-1, -1,-1,-1, false)) .setStartCallback(callback)); CT_ASSERT(success); } bool SyncTests::doConversionCallback(bool *success, SyncContext &syncClient, SyncOptions &options) { *success = false; for (source_it it = sources.begin(); it != sources.end(); ++it) { const ClientTest::Config *config = &it->second->config; TestingSyncSource *source = static_cast(syncClient.findSource(config->m_sourceName)); CT_ASSERT(source); std::string type = source->getNativeDatatypeName(); if (type.empty()) { continue; } std::list items; std::string testcases; ClientTest::getItems(config->m_testcases, items, testcases); std::string converted = getCurrentTest(); converted += ".converted."; converted += config->m_sourceName; converted += ".dat"; simplifyFilename(converted); std::ofstream out(converted.c_str()); BOOST_FOREACH(const string &item, items) { string convertedItem = item; if(!sysync::DataConversion(syncClient.getSession().get(), type.c_str(), type.c_str(), convertedItem)) { SE_LOG_ERROR(NULL, "failed parsing as %s:\n%s", type.c_str(), item.c_str()); } else { out << convertedItem << "\n"; } } out.close(); // The test used peer-specific test cases, but the actual // result does not depend on the peer because we haven't // received the peer's DevInf at the point where we // import/export the test cases (=> don't apply peer-specific // synccompare workarounds). // // Due to the lack of DevInf, properties and parameters which // need to be enabled via DevInf get lost (= filter them out). ScopedEnvChange env("CLIENT_TEST_SERVER", ""); ScopedEnvChange envParams("CLIENT_TEST_STRIP_PARAMETERS", "X-EVOLUTION-UI-SLOT"); CT_ASSERT(config->m_compare(client, testcases, converted)); } // abort sync after completing the test successfully (no exception so far!) *success = true; return true; } // imports test data, transmits it from client A to the server to // client B and then compares which of the data has been transmitted void SyncTests::testItems() { // clean server and first test database CT_ASSERT_NO_THROW(deleteAll()); // import data source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->testImport()); } // transfer from client A to server to client B doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY).setWBXML(true)); CT_ASSERT_NO_THROW(accessClientB->refreshClient(SyncOptions().setWBXML(true))); CT_ASSERT_NO_THROW(compareDatabases()); } // creates several items, transmits them back and forth and // then compares which of them have been preserved void SyncTests::testItemsXML() { // clean server and first test database CT_ASSERT_NO_THROW(deleteAll()); // import data source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->testImport()); } // transfer from client A to server to client B using the non-default XML format doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY).setWBXML(false)); CT_ASSERT_NO_THROW(accessClientB->refreshClient(SyncOptions().setWBXML(false))); CT_ASSERT_NO_THROW(compareDatabases()); } // imports test data, transmits it from client A to the server to // client B, update on B and transfers back to the server, // then compares against reference data that has the same changes // applied on A void SyncTests::testExtensions() { // clean server and first test database CT_ASSERT_NO_THROW(deleteAll()); // import data and create reference data source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->testImport()); string refDir = getCurrentTest() + "." + it->second->config.m_sourceName + ".ref.dat"; simplifyFilename(refDir); rm_r(refDir); mkdir_p(refDir); TestingSyncSourcePtr source; int counter = 0; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); BOOST_FOREACH(const string &luid, source->getAllItems()) { string item; source->readItemRaw(luid, item); CT_ASSERT_NO_THROW(it->second->config.m_update(item)); ofstream out(StringPrintf("%s/%d", refDir.c_str(), counter).c_str()); out.write(item.c_str(), item.size()); counter++; } CT_ASSERT_NO_THROW(source.reset()); } // transfer from client A to server to client B doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY)); CT_ASSERT_NO_THROW(accessClientB->refreshClient(SyncOptions())); // update on client B for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->updateData(it->second->createSourceB)); } // send back accessClientB->doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY)); doSync(__FILE__, __LINE__, "patch", SyncOptions(SYNC_TWO_WAY)); bool equal = true; for (it = sources.begin(); it != sources.end(); ++it) { string refDir = getCurrentTest() + "." + it->second->config.m_sourceName + ".ref.dat"; simplifyFilename(refDir); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); // Compare data in source A against reference data *without* // telling synccompare to ignore known data loss for the // server. CLIENT_TEST_SERVER is relevant for finding the // right source config and thus setting it must come after the // createSourceB() call. ScopedEnvChange env("CLIENT_TEST_SERVER", ""); ScopedEnvChange envParams("CLIENT_TEST_STRIP_PARAMETERS", "X-EVOLUTION-UI-SLOT"); // X-EVOLUTION-FILE-AS is not preserved correctly with EDS due // to setting it on incoming items. It is not always set as already stored // locally, so when writing back, the new, artificially generated value overwrites // the one chosen by the user. Not ideal, but the alternative (not setting it on // incoming items) is worse. ScopedEnvChange envProps("CLIENT_TEST_STRIP_PROPERTIES", "(PHOTO|FN|X-EVOLUTION-FILE-AS)"); if (!it->second->compareDatabases(refDir.c_str(), *source, false)) { equal = false; } } CT_ASSERT(equal); } // tests the following sequence of events: // - both clients in sync with server // - client 1 adds item // - client 1 updates the same item // - client 2 gets item: the client should be asked to add the item // // However it has been observed that sometimes the item was sent as "update" // for a non-existant local item. This is a server bug, the client does not // have to handle that. See // http://forge.objectweb.org/tracker/?func=detail&atid=100096&aid=305018&group_id=96 void SyncTests::testAddUpdate() { // clean server and both test databases CT_ASSERT_NO_THROW(deleteAll()); accessClientB->refreshClient(); // add item source_it it; for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_insertItem, false)); } doSync(__FILE__, __LINE__, "add", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); // update it for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->update(it->second->createSourceB, it->second->config.m_updateItem)); } doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,1,0, true, SYNC_TWO_WAY))); // now download the updated item into the second client accessClientB->doSync(__FILE__, __LINE__, "recv", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 0,0,0, true, SYNC_TWO_WAY))); // compare the two databases CT_ASSERT_NO_THROW(compareDatabases()); } // test copying with maxMsg and no large object support void SyncTests::testMaxMsg() { CT_ASSERT_NO_THROW(doVarSizes(true, false)); } // test copying with maxMsg and large object support void SyncTests::testLargeObject() { CT_ASSERT_NO_THROW(doVarSizes(true, true)); } // // stress tests: execute some of the normal operations, // but with large number of artificially generated items // // two-way sync with clean client/server, // followed by slow sync and comparison // via second client void SyncTests::testManyItems() { // clean server and client A CT_ASSERT_NO_THROW(deleteAll()); // import artificial data: make them large to generate some // real traffic and test buffer handling source_it it; int num_items = defNumItems(); for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insertManyItems(it->second->createSourceA, 0, num_items, 2000)); } // send data to server doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, num_items,0,0, true, SYNC_TWO_WAY), SyncOptions::DEFAULT_MAX_MSG_SIZE, SyncOptions::DEFAULT_MAX_OBJ_SIZE, true)); // ensure that client has the same data, ignoring data conversion // issues (those are covered by testItems()) CT_ASSERT_NO_THROW(refreshClient()); // also copy to second client accessClientB->refreshClient(); // slow sync now should not change anything doSync(__FILE__, __LINE__, "twinning", SyncOptions(SYNC_SLOW, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_SLOW), SyncOptions::DEFAULT_MAX_MSG_SIZE, SyncOptions::DEFAULT_MAX_OBJ_SIZE, true)); // compare CT_ASSERT_NO_THROW(compareDatabases()); } /** * Tell server to delete plenty of items. */ void SyncTests::testManyDeletes() { // clean server and client A CT_ASSERT_NO_THROW(deleteAll()); // import artificial data: make them small, we just want // many of them source_it it; int num_items = defNumItems(); for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insertManyItems(it->second->createSourceA, 0, num_items, 100)); } // send data to server doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, num_items,0,0, true, SYNC_TWO_WAY), 64 * 1024, 64 * 1024, true)); // ensure that client has the same data, ignoring data conversion // issues (those are covered by testItems()) CT_ASSERT_NO_THROW(refreshClient()); // also copy to second client accessClientB->refreshClient(); // slow sync now should not change anything doSync(__FILE__, __LINE__, "twinning", SyncOptions(SYNC_SLOW, CheckSyncReport(-1,-1,-1, -1,-1,-1, true, SYNC_SLOW), 64 * 1024, 64 * 1024, true)); // compare CT_ASSERT_NO_THROW(compareDatabases()); // delete everything locally CT_ASSERT_NO_THROW(allSourcesDeleteAll()); doSync(__FILE__, __LINE__, "delete-server", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,num_items, true, SYNC_TWO_WAY), 10 * 1024)); // Reporting locally deleted items depends on sync mode // recognition, see SyncContext.cpp. const char* checkSyncModeStr = getenv("CLIENT_TEST_NOCHECK_SYNCMODE"); // update second client accessClientB->doSync(__FILE__, __LINE__, "delete-client", SyncOptions(RefreshFromPeerMode(), checkSyncModeStr ? CheckSyncReport() : CheckSyncReport(0,0,num_items, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE), 10 * 1024)); } /** * - get client A, server, client B in sync with one item * - force slow sync in A: must not duplicate items, but may update it locally * - refresh client B (in case that the item was updated) * - delete item in B and server via two-way sync * - refresh-from-server in B to check that item is gone * - two-way in A: must delete the item */ void SyncTests::testSlowSyncSemantic() { // set up one item everywhere CT_ASSERT_NO_THROW(doCopy()); // slow in A doSync(__FILE__, __LINE__, "slow", SyncOptions(SYNC_SLOW, CheckSyncReport(0,-1,0, -1,-1,0, true, SYNC_SLOW))); // refresh B, delete item accessClientB->doSync(__FILE__, __LINE__, "refresh", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,-1,0, 0,0,0, true, SYNC_TWO_WAY))); CT_ASSERT_NO_THROW(accessClientB->allSourcesDeleteAll()); accessClientB->doSync(__FILE__, __LINE__, "delete", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,1, true, SYNC_TWO_WAY))); accessClientB->doSync(__FILE__, __LINE__, "check", SyncOptions(RefreshFromPeerMode(), CheckSyncReport(0,0,0, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); // now the item should also be deleted on A doSync(__FILE__, __LINE__, "delete", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,1, 0,0,0, true, SYNC_TWO_WAY))); } /** * check that refresh-from-server works correctly: * - create the same item on A, server, B via testCopy() * - refresh B (one item deleted, one created) * - delete item on A and server * - refresh B (one item deleted) */ void SyncTests::testComplexRefreshFromServerSemantic() { CT_ASSERT_NO_THROW(testCopy()); // Reporting locally deleted items depends on sync mode // recognition, see SyncContext.cpp. const char* checkSyncModeStr = getenv("CLIENT_TEST_NOCHECK_SYNCMODE"); // check refresh with one item on server const char *value = getenv ("CLIENT_TEST_NOREFRESH"); // If refresh_from_server or refresh_from_client (depending on this is a // server or client) is not supported, we can still test via slow sync. if (value) { accessClientB->refreshClient(); } else { accessClientB->doSync(__FILE__, __LINE__, "refresh-one", SyncOptions(RefreshFromPeerMode(), checkSyncModeStr ? CheckSyncReport() : CheckSyncReport(1,0,1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); } // delete that item via A, check again CT_ASSERT_NO_THROW(allSourcesDeleteAll()); doSync(__FILE__, __LINE__, "delete-item", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,1, true, SYNC_TWO_WAY))); if (value) { accessClientB->refreshClient(); } else { accessClientB->doSync(__FILE__, __LINE__, "refresh-none", SyncOptions(RefreshFromPeerMode(), checkSyncModeStr ? CheckSyncReport() : CheckSyncReport(0,0,1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); } } /** * - create the same item on A, server, B via testCopy() * - delete on both sides * - sync A * - sync B * * Must not fail, even though the Synthesis engine will ask the backends * for deletion of an already deleted item. */ void SyncTests::testDeleteBothSides() { CT_ASSERT_NO_THROW(testCopy()); CT_ASSERT_NO_THROW(allSourcesDeleteAll()); CT_ASSERT_NO_THROW(accessClientB->allSourcesDeleteAll()); doSync(__FILE__, __LINE__, "delete-item-A", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,1, true, SYNC_TWO_WAY))); source_it it; for (it = sources.begin(); it != sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } // it is undefined whether the item is meant to be reported as deleted again here: // a SyncML client test will mark it as deleted, local sync as server won't accessClientB->doSync(__FILE__, __LINE__, "delete-item-B", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,-1, true, SYNC_TWO_WAY))); for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { if (it->second->config.m_createSourceB) { TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceB())); SOURCE_ASSERT_EQUAL(source.get(), 0, countItems(source.get())); CT_ASSERT_NO_THROW(source.reset()); } } } /** * - clean A, server, B * - create an item on A * - sync A * - create a modified version of the item on B * - sync B * * Depends on UID and LAST-MODIFIED in item data, i.e., iCalendar 2.0. * Uses the normal "insertItem" test case. Only works for a single source. * * The server must not duplicate the item *and* preserve the modified * properties. * * Temporary: because conflict resolution is server-dependent, such a strict * test fails. For example, with SyncEvolution 1.2 as server, DESCRIPTION and * LOCATION end up being concatenated (merge=lines mode). The test now avoids * using different data, with the expected outcome that only one item * is present at the end and no unnecessary data transfers happen (only true * for SyncEvolution server). * * A similar situation occurs on the client side, but it is harder to * trigger: the updated item must be added to the client's database * after it has reported its changes. Because if it happens earlier, * it would send an Add to the server and the server would have to * resolve the add<->add conflict, as in this test here. */ // using updated item data makes the test harder to pass: // server must use exactly the right item, which currently // is not the case for SyncEvolution bool addBothSidesUsesUpdateItem = true; // SyncEvolution passes with addBothSidesUsesUpdateItem == true // if we avoid changes to those properties in the iCalendar test // set which currently use merge=lines. bool addBothSidesNoMergeLines=true; // if true, relax expectations for updates from server: // may or may not send one bool addBothSidesMayUpdate = false; // if true, then accept that the Synthesis server mode counts // Add commands as "added items" even if they are turned into updates bool addBothSidesAddStatsBroken = false; // if true, then the peer is a SyncML server which does not // support UID/RECURRENCE-ID and thus doesn't detect // duplicates itself; the client needs to do that bool addBothSidesServerIsDumb = getenv("CLIENT_TEST_ADD_BOTH_SIDES_SERVER_IS_DUMB") != NULL; static void testAddBothSidesFixUpdateItem(std::string &updateItem) { if (addBothSidesNoMergeLines) { // VEVENT boost::replace_all(updateItem, "LOCATION:big meeting room", "LOCATION:my office"); boost::replace_all(updateItem, "DESCRIPTION:nice to see you", "DESCRIPTION:let's talk<>"); // VJOURNAL boost::replace_all(updateItem, "DESCRIPTION:Summary\\nBody text", "DESCRIPTION:Summary Modified\\nBody text"); // VTODO boost::replace_all(updateItem, "DESCRIPTION:to be done", "DESCRIPTION:to be done<>"); } } void SyncTests::testAddBothSides() { CT_ASSERT_NO_THROW(deleteAll()); accessClientB->deleteAll(); std::string insertItem = sources[0].second->config.m_insertItem; std::string updateItem = sources[0].second->config.m_updateItem; testAddBothSidesFixUpdateItem(updateItem); CT_ASSERT_NO_THROW(sources[0].second->insert(sources[0].second->createSourceA, insertItem)); doSync(__FILE__, __LINE__, "send-old", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); // insert updated item data on B std::string data; CT_ASSERT_NO_THROW(accessClientB->sources[0].second->insert(accessClientB->sources[0].second->createSourceA, addBothSidesUsesUpdateItem ? updateItem: insertItem, false, &data)); // As far as the client knows, it is adding an item; // server not expected to send back an update (our data was more recent // and completely overwrites the server's data). // When acting as server, we do the duplicate detection and thus know // more about the actual outcome. accessClientB->doSync(__FILE__, __LINE__, "send-update", SyncOptions(SYNC_TWO_WAY, isServerMode() ? CheckSyncReport(addBothSidesAddStatsBroken ? -1 : 0,0,0, 0, addBothSidesMayUpdate ? -1 : addBothSidesUsesUpdateItem ? 1 : 0, 0, true, SYNC_TWO_WAY) : addBothSidesServerIsDumb ? CheckSyncReport(addBothSidesServerIsDumb ? 1 : 0, addBothSidesMayUpdate ? -1 : 0, 0, // client got one redundant item from // server, had to receive it, match against // its own copy, then tell the server to // update one copy and delete the other; // no update necessary on server because // it already had the latest copy 1,0,1, true, SYNC_TWO_WAY).setRestarts(1) : CheckSyncReport(0, addBothSidesMayUpdate ? -1 : 0, 0, // client doesn't know that the add // was an update, in contrast to server 1,0,0, true, SYNC_TWO_WAY))); // update sent to client A doSync(__FILE__, __LINE__, "update", SyncOptions(SYNC_TWO_WAY, (!isServerMode() && addBothSidesServerIsDumb) ? // server had to be told to update old item // and delete redundant one, which is what it now // also tells us here CheckSyncReport(1,0,1, 0,0,0, true, SYNC_TWO_WAY) : CheckSyncReport(0, addBothSidesMayUpdate ? -1 : addBothSidesUsesUpdateItem ? 1 : 0, 0, 0,0,0, true, SYNC_TWO_WAY))); // nothing necessary for client B accessClientB->doSync(__FILE__, __LINE__, "nop", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,0, true, SYNC_TWO_WAY))); // now compare client A against reference data TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceB())); sources[0].second->compareDatabases(copy.get(), &data, (void *)NULL); CT_ASSERT_NO_THROW(copy.reset()); } /** * compared to testAddBothSides the age of the items is reversed now; * a server which always copies the client's data passes testAddBothSides * but fails here */ void SyncTests::testAddBothSidesRefresh() { CT_ASSERT_NO_THROW(deleteAll()); accessClientB->deleteAll(); std::string insertItem = sources[0].second->config.m_insertItem; std::string updateItem = sources[0].second->config.m_updateItem; testAddBothSidesFixUpdateItem(updateItem); // insert initial item data on B CT_ASSERT_NO_THROW(accessClientB->sources[0].second->insert(accessClientB->sources[0].second->createSourceA, insertItem)); // sleep one second to ensure that it's mangled LAST-MODIFIED is older than // the one from the next item, inserted on A sleep(1); // more recent data sent to server first std::string data; CT_ASSERT_NO_THROW(sources[0].second->insert(sources[0].second->createSourceA, addBothSidesUsesUpdateItem ? updateItem : insertItem, false, &data)); doSync(__FILE__, __LINE__, "send-new", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); // As far as the client knows, it is adding an item; // server expected to send back an update (client's data was out-dated); // When acting as server, we do the duplicate detection and thus // know more about the actual outcome. accessClientB->doSync(__FILE__, __LINE__, "send-old", SyncOptions(SYNC_TWO_WAY, isServerMode() ? CheckSyncReport(addBothSidesAddStatsBroken ? -1 : 0, addBothSidesMayUpdate ? -1 : addBothSidesUsesUpdateItem ? 1 : 0, 0, 0, addBothSidesMayUpdate ? -1 : 0, 0, true, SYNC_TWO_WAY) : // When the server is dumb, it // will just accept the added // item and send us an // with an item that has the // same UID as the one it just // received. The client then // must start a second sync and // fix the server by sending an update // (of the old version) and a delete (of the // new one) addBothSidesServerIsDumb ? CheckSyncReport(1,0,0, 1,1,1, true, SYNC_TWO_WAY).setRestarts(1) : CheckSyncReport(0, addBothSidesMayUpdate ? -1 : addBothSidesUsesUpdateItem ? 1 : 0, 0, // client doesn't know that add was // an update 1,0,0, true, SYNC_TWO_WAY))); // potentially send update to A doSync(__FILE__, __LINE__, "nopA", SyncOptions(SYNC_TWO_WAY, (!isServerMode() && addBothSidesServerIsDumb) ? // receives extra changes because dumb server had to be fixed CheckSyncReport(1,0,1, 0,0,0, true, SYNC_TWO_WAY) : CheckSyncReport(0,addBothSidesMayUpdate ? -1 : 0,0, 0,0,0, true, SYNC_TWO_WAY))); // nothing necessary for client B (already synchronized completely above in one sync) accessClientB->doSync(__FILE__, __LINE__, "nopB", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,0,0, true, SYNC_TWO_WAY))); // now compare client A against reference data TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceB())); sources[0].second->compareDatabases(copy.get(), &data, (void *)NULL); CT_ASSERT_NO_THROW(copy.reset()); } /** * - adds parent on client A * - syncs A * - adds unrelated item via client B (necessary to trigger corner cases in * change tracking, see BMC #22329) * - syncs B * - adds child on client A * - syncs A and B * - compares */ void SyncTests::testLinkedItemsParentChild() { source_it it; // clean server, client A and client B CT_ASSERT_NO_THROW(deleteAll()); accessClientB->refreshClient(); // create and copy parent item for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT(!it->second->config.m_linkedItems.empty()); CT_ASSERT(it->second->config.m_linkedItems[0].size() >= 2); TestingSyncSourcePtr source; CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_linkedItems[0][0], false)); } doSync(__FILE__, __LINE__, "send-parent", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); // create independent item, refresh client B and server for (it = accessClientB->sources.begin(); it != accessClientB->sources.end(); ++it) { CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_insertItem, false)); } accessClientB->doSync(__FILE__, __LINE__, "recv-parent", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 1,0,0, true, SYNC_TWO_WAY))); // add child on client A for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT(!it->second->config.m_linkedItems.empty()); CT_ASSERT(it->second->config.m_linkedItems[0].size() >= 2); TestingSyncSourcePtr source; CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_linkedItems[0][1], false)); } // parent may or may not be considered updated doSync(__FILE__, __LINE__, "send-child", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 1,-1,0, true, SYNC_TWO_WAY))); // parent may or may not be considered updated here accessClientB->doSync(__FILE__, __LINE__, "recv-child", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,-1,0, 0,0,0, true, SYNC_TWO_WAY))); // final comparison CT_ASSERT_NO_THROW(compareDatabases()); } /** * - adds child on client A * - syncs A * - syncs B * - compare */ void SyncTests::testLinkedItemsChild() { source_it it; // clean server, client A and client B CT_ASSERT_NO_THROW(deleteAll()); accessClientB->refreshClient(); // create and copy child item for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT(!it->second->config.m_linkedItems.empty()); CT_ASSERT(it->second->config.m_linkedItems[0].size() >= 2); TestingSyncSourcePtr source; CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_linkedItems[0][1], false)); } doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); accessClientB->doSync(__FILE__, __LINE__, "recv", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 0,0,0, true, SYNC_TWO_WAY))); // final comparison CT_ASSERT_NO_THROW(compareDatabases()); } /** * - adds child on client A * - syncs A and B * - adds parent on client A * - syncs A and B * - compares */ void SyncTests::testLinkedItemsChildParent() { source_it it; // clean server, client A and client B CT_ASSERT_NO_THROW(deleteAll()); accessClientB->refreshClient(); // create and copy child item for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT(!it->second->config.m_linkedItems[0].empty()); CT_ASSERT(it->second->config.m_linkedItems[0].size() >= 2); TestingSyncSourcePtr source; CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_linkedItems[0][1], false)); } doSync(__FILE__, __LINE__, "send-child", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,0,0, true, SYNC_TWO_WAY))); accessClientB->doSync(__FILE__, __LINE__, "recv-child", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,0,0, 0,0,0, true, SYNC_TWO_WAY))); // add parent on client A for (it = sources.begin(); it != sources.end(); ++it) { CT_ASSERT(!it->second->config.m_linkedItems.empty()); CT_ASSERT(it->second->config.m_linkedItems[0].size() >= 2); TestingSyncSourcePtr source; // relaxed change checks because child event is also modified CT_ASSERT_NO_THROW(it->second->insert(it->second->createSourceA, it->second->config.m_linkedItems[0][0], true)); } // child may or may not be considered updated doSync(__FILE__, __LINE__, "send-parent", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 1,-1,0, true, SYNC_TWO_WAY))); // child may or may not be considered updated here accessClientB->doSync(__FILE__, __LINE__, "recv-parent", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(1,-1,0, 0,0,0, true, SYNC_TWO_WAY))); // final comparison CT_ASSERT_NO_THROW(compareDatabases()); } /** * implements testMaxMsg(), testLargeObject(), testLargeObjectEncoded() * using a sequence of items with varying sizes */ void SyncTests::doVarSizes(bool withMaxMsgSize, bool withLargeObject) { int maxMsgSize = 8 * 1024; const char* maxItemSize = getenv("CLIENT_TEST_MAX_ITEMSIZE"); int tmpSize = maxItemSize ? atoi(maxItemSize) : 0; if(tmpSize > 0) maxMsgSize = tmpSize; // clean server and client A CT_ASSERT_NO_THROW(deleteAll()); // insert items, doubling their size, then restart with small size source_it it; for (it = sources.begin(); it != sources.end(); ++it) { int item = 1; restoreStorage(it->second->config, client); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceA())); for (int i = 0; i < 2; i++ ) { int size = 1; while (size < 2 * maxMsgSize) { CT_ASSERT_NO_THROW(it->second->insertManyItems(source.get(), item, 1, it->second->config.m_templateItem.size() + 10 + size)); size *= 2; item++; } } backupStorage(it->second->config, client); } // transfer to server doSync(__FILE__, __LINE__, "send", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, -1,0,0, true, SYNC_TWO_WAY), // number of items sent to server depends on source withMaxMsgSize ? SyncOptions::DEFAULT_MAX_MSG_SIZE: 0, withMaxMsgSize ? SyncOptions::DEFAULT_MAX_OBJ_SIZE : 0, withLargeObject)); // copy to second client const char *value = getenv ("CLIENT_TEST_NOREFRESH"); // If refresh_from_server or refresh_from_client (depending on this is a // server or client) is not supported, we can still test via slow sync. if (value) { accessClientB->refreshClient(); } else { accessClientB->doSync(__FILE__, __LINE__, "recv", SyncOptions(RefreshFromPeerMode(), CheckSyncReport(-1,0,-1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE), // number of items received from server depends on source withLargeObject ? maxMsgSize : withMaxMsgSize ? maxMsgSize * 100 /* large enough so that server can sent the largest item */ : 0, withMaxMsgSize ? maxMsgSize * 100 : 0, withLargeObject)); } // compare CT_ASSERT_NO_THROW(compareDatabases()); } /** * Send message to server, then pretend that we timed out at exactly * one specific message, specified via m_interruptAtMessage. The * caller is expected to resend the message, without aborting the * session. That resend and all following message will get through * again. * * Each send() is counted as one message, starting at 1 for the first * message. */ class TransportResendInjector : public TransportWrapper{ private: int timeout; public: TransportResendInjector() :TransportWrapper() { const char *s = getenv("CLIENT_TEST_RESEND_TIMEOUT"); timeout = s ? atoi(s) : 0; } ~TransportResendInjector() { } virtual int getResendFailureThreshold() { return 0; } virtual void send(const char *data, size_t len) { m_messageCount++; if (m_interruptAtMessage >= 0 && m_messageCount == m_interruptAtMessage+1) { m_wrappedAgent->send(data, len); m_status = m_wrappedAgent->wait(); //trigger client side resend sleep (timeout); m_status = TIME_OUT; } else { m_wrappedAgent->send(data, len); m_status = m_wrappedAgent->wait(); } } virtual void getReply(const char *&data, size_t &len, std::string &contentType) { if (m_status == FAILED) { data = ""; len = 0; } else { m_wrappedAgent->getReply(data, len, contentType); } } }; /** * Stop sending at m_interruptAtMessage. The caller is forced to abort * the current session and will recover by retrying in another * session. * * Each send() increments the counter by two, so that 1 aborts before * the first message and 2 after it. */ class TransportFaultInjector : public TransportWrapper{ public: TransportFaultInjector() :TransportWrapper() { } ~TransportFaultInjector() { } virtual void send(const char *data, size_t len) { if (m_interruptAtMessage == m_messageCount) { SE_LOG_DEBUG(NULL, "TransportFaultInjector: interrupt before sending message #%d", m_messageCount); } m_messageCount++; if (m_interruptAtMessage >= 0 && m_messageCount > m_interruptAtMessage) { throw string("TransportFaultInjector: interrupt before send"); } m_wrappedAgent->send(data, len); m_status = m_wrappedAgent->wait(); if (m_interruptAtMessage == m_messageCount) { SE_LOG_DEBUG(NULL, "TransportFaultInjector: interrupt after receiving reply #%d", m_messageCount); } m_messageCount++; if (m_interruptAtMessage >= 0 && m_messageCount > m_interruptAtMessage) { m_status = FAILED; } } virtual void getReply(const char *&data, size_t &len, std::string &contentType) { if (m_status == FAILED) { data = ""; len = 0; } else { m_wrappedAgent->getReply(data, len, contentType); } } }; /** * Swallow data at various points: * - between "client sent data" and "server receives data" * - after "server received data" and before "server sends reply" * - after "server has sent reply" * * The client deals with it by resending. This is similar to * TransportResendInjector and the ::Resend tests, but more thorough, * and stresses the HTTP server more (needs to deal with "reply not * delivered" error). * * Each send() increments the counter by three, so that 0 aborts * before the first message, 1 after sending it, and 2 after receiving * its reply. * * Swallowing data is implemented via the proxy.py script. This is * necessary because the wrapped agent has no API to trigger the second * error scenario. The wrapped agent is told to use a specific port * on localhost, with the base port passing message and reply through, * "base + 1" intercepting the message, etc. * * Because of the use of a proxy, this cannot be used to test servers * where a real proxy is needed. */ class TransportResendProxy : public TransportWrapper { private: int port; public: TransportResendProxy() : TransportWrapper() { const char *s = getenv("CLIENT_TEST_RESEND_PROXY"); port = s ? atoi(s) : 0; } virtual int getResendFailureThreshold() { return 2; } virtual void send(const char *data, size_t len) { HTTPTransportAgent *agent = dynamic_cast(m_wrappedAgent.get()); CT_ASSERT(agent); m_messageCount += 3; if (m_interruptAtMessage >= 0 && m_interruptAtMessage < m_messageCount && m_interruptAtMessage >= m_messageCount - 3) { int offset = m_interruptAtMessage - m_messageCount + 4; SE_LOG_DEBUG(NULL, "TransportResendProxy: interrupt %s", offset == 1 ? "before sending message" : offset == 2 ? "directly after sending message" : "after receiving reply"); agent->setProxy(StringPrintf("http://127.0.0.1:%d", offset + port)); } else { agent->setProxy(""); } agent->send(data, len); m_status = agent->wait(); } virtual void getReply(const char *&data, size_t &len, std::string &contentType) { if (m_status == FAILED) { data = ""; len = 0; } else { m_wrappedAgent->getReply(data, len, contentType); } } }; /** * Emulates a user suspend just after receving response * from server. */ class UserSuspendInjector : public TransportWrapper{ public: UserSuspendInjector() :TransportWrapper() { } ~UserSuspendInjector() { } virtual void send(const char *data, size_t len) { m_wrappedAgent->send(data, len); m_status = m_wrappedAgent->wait(); } virtual void getReply(const char *&data, size_t &len, std::string &contentType) { if (m_status == FAILED) { data = ""; len = 0; } else { if (m_interruptAtMessage == m_messageCount) { SE_LOG_DEBUG(NULL, "UserSuspendInjector: user suspend after getting reply #%d", m_messageCount); } m_messageCount++; if (m_interruptAtMessage >= 0 && m_messageCount > m_interruptAtMessage) { m_options->m_isSuspended = SuspendFlags::getSuspendFlags().suspend(); } m_wrappedAgent->getReply(data, len, contentType); } } }; /** * This function covers different error scenarios that can occur * during real synchronization. To pass, clients must either force a * slow synchronization after a failed synchronization or implement * the error handling described in the design guide (track server's * status for added/updated/deleted items and resend unacknowledged * changes). * * The items used during these tests are synthetic. They are * constructed so that normally a server should be able to handle * twinning during a slow sync correctly. * * Errors are injected into a synchronization by wrapping the normal * HTTP transport agent. The wrapper enumerates messages sent between * client and server (i.e., one message exchange increments the * counter by two), starting from zero. It "cuts" the connection before * sending out the next message to the server respectively after the * server has replied, but before returning the reply to the client. * The first case simulates a lost message from the client to the server * and the second case a lost message from the server to the client. * * The expected result is the same as in an uninterrupted sync, which * is done once at the beginning. * * Each test goes through the following steps: * - client A and B reset local data store * - client A creates 3 new items, remembers LUIDs * - refresh-from-client A sync * - refresh-from-client B sync * - client B creates 3 different items, remembers LUIDs * - client B syncs * - client A syncs => A, B, server are in sync * - client A modifies his items (depends on test) and * sends changes to server => server has changes for B * - client B modifies his items (depends on test) * - client B syncs, transport wrapper simulates lost message n * - client B syncs again, resuming synchronization if possible or * slow sync otherwise (responsibility of the client!) * - client A syncs (not tested yet: A should be sent exactly the changes made by B) * - test that A and B contain same items * - test that A contains the same items as the uninterrupted reference run * - repeat the steps above ranging starting with lost message 0 until no * message got lost * * Set the CLIENT_TEST_INTERRUPT_AT env variable to a message number * >= 0 to execute one uninterrupted run and then interrupt at that * message. Set to -1 to just do the uninterrupted run. */ void SyncTests::doInterruptResume(int changes, boost::shared_ptr wrapper) { int interruptAtMessage = -1; const char *t = getenv("CLIENT_TEST_INTERRUPT_AT"); int requestedInterruptAt = t ? atoi(t) : -2; const char *s = getenv("CLIENT_TEST_INTERRUPT_SLEEP"); int sleep_t = s ? atoi(s) : 0; size_t i; std::string refFileBase = getCurrentTest() + ".ref."; bool equal = true; bool resend = wrapper->getResendFailureThreshold() != -1; bool suspend = dynamic_cast (wrapper.get()) != NULL; bool interrupt = dynamic_cast (wrapper.get()) != NULL; // better be large enough for complete DevInf, 20000 is already a // bit small when running with many stores size_t maxMsgSize = 20000; size_t changedItemSize = (changes & BIG) ? 5 * maxMsgSize / 2 : // large enough to be split over three messages 0; // After running the uninterrupted sync, we remember the number // of sent messages. We never interrupt between sending our // own last message and receiving the servers last reply, // because the server is unable to detect that we didn't get // the reply. It will complete the session whereas the client // suspends, leading to an unexpected slow sync the next time. int maxMsgNum = 0; while (true) { char buffer[80]; sprintf(buffer, "%d", interruptAtMessage); const char *prefix = interruptAtMessage == -1 ? "complete" : buffer; SyncPrefix prefixA(prefix, *this); SyncPrefix prefixB(prefix, *accessClientB); std::vector< std::list > clientAluids; std::vector< std::list > clientBluids; // create new items in client A and sync to server clientAluids.resize(sources.size()); for (i = 0; i < sources.size(); i++) { sources[i].second->deleteAll(sources[i].second->createSourceA); clientAluids[i] = sources[i].second->insertManyItems(sources[i].second->createSourceA, 1, 3, 0); } doSync(__FILE__, __LINE__, "fromA", SyncOptions(RefreshFromLocalMode())); // init client B and add its items to server and client A accessClientB->doSync(__FILE__, __LINE__, "initB", SyncOptions(RefreshFromPeerMode())); clientBluids.resize(sources.size()); for (i = 0; i < sources.size(); i++) { clientBluids[i] = accessClientB->sources[i].second->insertManyItems(accessClientB->sources[i].second->createSourceA, 11, 3, 0); } accessClientB->doSync(__FILE__, __LINE__, "fromB", SyncOptions(SYNC_TWO_WAY)); doSync(__FILE__, __LINE__, "updateA", SyncOptions(SYNC_TWO_WAY)); // => client A, B and server in sync with a total of six items // make changes as requested on client A and sync to server for (i = 0; i < sources.size(); i++) { if (changes & SERVER_ADD) { sources[i].second->insertManyItems(sources[i].second->createSourceA, 4, 1, changedItemSize); } if (changes & SERVER_REMOVE) { // remove second item removeItem(sources[i].second->createSourceA, *(++clientAluids[i].begin())); } if (changes & SERVER_UPDATE) { // update third item updateItem(sources[i].second->createSourceA, sources[i].second->config, *(++ ++clientAluids[i].begin()), sources[i].second->createItem(3, "updated", changedItemSize).c_str()); } } // send using the same mode as in the interrupted sync with client B if (changes & (SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE)) { doSync(__FILE__, __LINE__, "changesFromA", SyncOptions(SYNC_TWO_WAY).setMaxMsgSize(maxMsgSize)); } // make changes as requested on client B for (i = 0; i < sources.size(); i++) { if (changes & CLIENT_ADD) { accessClientB->sources[i].second->insertManyItems(accessClientB->sources[i].second->createSourceA, 14, 1, changedItemSize); } if (changes & CLIENT_REMOVE) { // remove second item removeItem(accessClientB->sources[i].second->createSourceA, *(++clientBluids[i].begin())); } if (changes & CLIENT_UPDATE) { // update third item updateItem(accessClientB->sources[i].second->createSourceA, accessClientB->sources[i].second->config, *(++ ++clientBluids[i].begin()), accessClientB->sources[i].second->createItem(13, "updated", changedItemSize).c_str()); } } // Now do an interrupted sync between B and server. // The explicit delete of the TransportAgent is suppressed // by overloading the delete operator. int wasInterrupted; { CheckSyncReport check(-1, -1, -1, -1, -1, -1, false); if (resend && interruptAtMessage > wrapper->getResendFailureThreshold()) { // resend tests must succeed, except for the first // message in the session, which is not resent check.mustSucceed = true; } SyncOptions options(SYNC_TWO_WAY, check); options.setTransportAgent(wrapper); options.setMaxMsgSize(maxMsgSize); // disable resending completely or shorten the resend // interval to speed up testing options.setRetryInterval(resend ? 10 : 0); wrapper->setInterruptAtMessage(interruptAtMessage); accessClientB->doSync(__FILE__, __LINE__, "changesFromB", options); wasInterrupted = interruptAtMessage != -1 && wrapper->getMessageCount() <= interruptAtMessage; if (!maxMsgNum) { maxMsgNum = wrapper->getMessageCount(); } wrapper->rewind(); } if (interruptAtMessage != -1) { if (wasInterrupted) { // uninterrupted sync, done break; } // continue, wait until server timeout if(sleep_t) sleep (sleep_t); // no need for resend tests, unless they were interrupted at the first message if (!resend || interruptAtMessage <= wrapper->getResendFailureThreshold()) { SyncReport report; accessClientB->doSync(__FILE__, __LINE__, "retryB", SyncOptions(SYNC_TWO_WAY, CheckSyncReport().setMode(SYNC_TWO_WAY).setReport(&report))); // Suspending at first and last message doesn't need a // resume, everything else does. When multiple sources // are involved, some may suspend, some may not, so we // cannot check. if (suspend && interruptAtMessage != 0 && interruptAtMessage + 1 != maxMsgNum && report.size() == 1) { BOOST_FOREACH(const SyncReport::SourceReport_t &sourceReport, report) { CT_ASSERT(sourceReport.second.isResumeSync()); } } } } // copy changes to client A doSync(__FILE__, __LINE__, "toA", SyncOptions(SYNC_TWO_WAY)); // compare client A and B if (interruptAtMessage != -1 && !compareDatabases(refFileBase.c_str(), false)) { equal = false; std::cerr << "====> comparison of client B against reference file(s) failed after interrupting at message #" << interruptAtMessage << std::endl; std::cerr.flush(); } if (!compareDatabases(NULL, false)) { equal = false; std::cerr << "====> comparison of client A and B failed after interrupting at message #" << interruptAtMessage << std::endl; std::cerr.flush(); } // save reference files from uninterrupted run? if (interruptAtMessage == -1) { for (source_it it = sources.begin(); it != sources.end(); ++it) { std::string refFile = refFileBase; refFile += it->second->config.m_sourceName; refFile += ".dat"; simplifyFilename(refFile); TestingSyncSourcePtr source; SOURCE_ASSERT_NO_FAILURE(source.get(), source.reset(it->second->createSourceA())); SOURCE_ASSERT_EQUAL(source.get(), 0, it->second->config.m_dump(client, *source.get(), refFile.c_str())); CT_ASSERT_NO_THROW(source.reset()); } } // pick next iteration if (requestedInterruptAt == -1) { // user requested to stop after first iteration break; } else if (requestedInterruptAt >= 0) { // only do one interrupted run of the test if (requestedInterruptAt == interruptAtMessage) { break; } else { interruptAtMessage = requestedInterruptAt; } } else { // interrupt one message later than before interruptAtMessage++; if (interrupt && interruptAtMessage + 1 >= maxMsgNum) { // Don't interrupt before the server's last reply, // because then the server thinks we completed the // session when we think we didn't, which leads to a // slow sync. Testing that is better done with a // specific test. break; } if (interruptAtMessage >= maxMsgNum) { // next run would not interrupt at all, stop now break; } } } CT_ASSERT(equal); } void SyncTests::testInterruptResumeClientAdd() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeClientRemove() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_REMOVE, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeClientUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_UPDATE, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeServerAdd() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_ADD, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeServerRemove() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_REMOVE, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeServerUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_UPDATE, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeClientAddBig() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD|BIG, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeClientUpdateBig() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_UPDATE|BIG, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeServerAddBig() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_ADD|BIG, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeServerUpdateBig() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_UPDATE|BIG, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testInterruptResumeFull() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE| SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE, boost::shared_ptr (new TransportFaultInjector()))); } void SyncTests::testUserSuspendClientAdd() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendClientRemove() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_REMOVE, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendClientUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_UPDATE, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendServerAdd() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_ADD, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendServerRemove() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_REMOVE, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendServerUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_UPDATE, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendClientAddBig() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD|BIG, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendClientUpdateBig() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_UPDATE|BIG, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendServerAddBig() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_ADD|BIG, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendServerUpdateBig() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_UPDATE|BIG, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testUserSuspendFull() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE| SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE, boost::shared_ptr (new UserSuspendInjector()))); } void SyncTests::testResendClientAdd() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendClientRemove() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_REMOVE, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendClientUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_UPDATE, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendServerAdd() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_ADD, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendServerRemove() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_REMOVE, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendServerUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_UPDATE, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendFull() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE| SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE, boost::shared_ptr (new TransportResendInjector()))); } void SyncTests::testResendProxyClientAdd() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD, boost::shared_ptr (new TransportResendProxy()))); } void SyncTests::testResendProxyClientRemove() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_REMOVE, boost::shared_ptr (new TransportResendProxy()))); } void SyncTests::testResendProxyClientUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_UPDATE, boost::shared_ptr (new TransportResendProxy()))); } void SyncTests::testResendProxyServerAdd() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_ADD, boost::shared_ptr (new TransportResendProxy()))); } void SyncTests::testResendProxyServerRemove() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_REMOVE, boost::shared_ptr (new TransportResendProxy()))); } void SyncTests::testResendProxyServerUpdate() { CT_ASSERT_NO_THROW(doInterruptResume(SERVER_UPDATE, boost::shared_ptr (new TransportResendProxy()))); } void SyncTests::testResendProxyFull() { CT_ASSERT_NO_THROW(doInterruptResume(CLIENT_ADD|CLIENT_REMOVE|CLIENT_UPDATE| SERVER_ADD|SERVER_REMOVE|SERVER_UPDATE, boost::shared_ptr (new TransportResendProxy()))); } static bool setDeadSyncURL(SyncContext &context, SyncOptions &options, int port, bool *skipped) { vector urls = context.getSyncURL(); string url; if (urls.size() == 1) { url = urls.front(); } // use IPv4 localhost address, that's what we listen on string fakeURL = StringPrintf("http://127.0.0.1:%d/foobar", port); if (boost::starts_with(url, "http")) { context.setSyncURL(fakeURL, true); context.setSyncUsername("foo", true); context.setSyncPassword("bar", true); return false; } else if (boost::starts_with(url, "local://")) { FullProps props = context.getConfigProps(); string target = url.substr(strlen("local://")); props[target].m_syncProps["syncURL"] = fakeURL; props[target].m_syncProps["retryDuration"] = InitStateString("10", true); props[target].m_syncProps["retryInterval"] = InitStateString("10", true); context.setConfigProps(props); return false; } else { // cannot run test, tell parent *skipped = true; return true; } } void SyncTests::testTimeout() { // Create a dead listening socket, then run a sync with a sync URL // which points towards localhost at that port. Do this with no // message resending and a very short overall timeout. The // expectation is that the transmission timeout strikes. time_t start = time(NULL); int fd = socket(AF_INET, SOCK_STREAM, 0); CT_ASSERT(fd != -1); struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); int res = bind(fd, (sockaddr *)&servaddr, sizeof(servaddr)); CT_ASSERT_EQUAL(0, res); socklen_t len = sizeof(servaddr); res = getsockname(fd, (sockaddr *)&servaddr, &len); CT_ASSERT_EQUAL(0, res); res = listen(fd, 10); CT_ASSERT_EQUAL(0, res); bool skipped = false; SyncReport report; doSync(__FILE__, __LINE__, "timeout", SyncOptions(SYNC_SLOW, CheckSyncReport(-1, -1, -1, -1, -1, -1, false).setReport(&report)) .setPrepareCallback(boost::bind(setDeadSyncURL, _1, _2, ntohs(servaddr.sin_port), &skipped)) .setRetryDuration(20) .setRetryInterval(20)); time_t end = time(NULL); close(fd); if (!skipped) { CT_ASSERT_EQUAL(STATUS_TRANSPORT_FAILURE, report.getStatus()); std::string delta = StringPrintf("%lds", (long)(end - start)); CT_ASSERT_MESSAGE(delta, end - start >= 19); // needs to be sufficiently larger than 20s timeout // because under valgrind the startup time is considerable CT_ASSERT_MESSAGE(delta, end - start < 50); } } static void UpdateLocal(const std::string &config, const std::string &source, const std::string &actualLocalData, const std::string &localModified, const std::string &modifyLocal) { // The local side also uses the Cmdline class because then we only // need to implement one way of updating items. But first we need to // get the actual data. std::auto_ptr cmdline; rm_r(actualLocalData); mkdir_p(actualLocalData); cmdline.reset(new TestCmdline("--daemon=no", "--export", actualLocalData.c_str(), config.c_str(), source.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("export " + currentServer() + "_1 " + source, cmdline->run()); CT_ASSERT(!system(StringPrintf("%s %s %s", modifyLocal.c_str(), actualLocalData.c_str(), localModified.c_str()).c_str())); CT_ASSERT(isDir(localModified)); cmdline.reset(new TestCmdline("--daemon=no", "--update", localModified.c_str(), config.c_str(), source.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("update " + config + " " + source, cmdline->run()); } void SyncTests::testUpload() { const std::string testname = "testUpload"; CT_ASSERT_EQUAL(sources.size(), 1); const ClientTest::Config &config(sources[0].second->config); StringPair peerConfig = getPeerConfig(config.m_sourceName); const std::string &peer = peerConfig.first; const std::string &peerSource = peerConfig.second; CT_ASSERT(!peer.empty()); CT_ASSERT(!peerSource.empty()); std::string localTestdata = getPeerTestdata(config.m_sourceName, testname, "local"); CT_ASSERT_MESSAGE(localTestdata, !access(localTestdata.c_str(), R_OK)); std::string remoteTestdata = getPeerTestdata(config.m_sourceName, testname, "remote"); CT_ASSERT_MESSAGE(remoteTestdata, !access(remoteTestdata.c_str(), R_OK)); std::string modifyRemote = getPeerTestdata(config.m_sourceName, testname, "modify-remote"); CT_ASSERT_MESSAGE(modifyRemote, !access(modifyRemote.c_str(), R_OK|X_OK)); std::string localSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "local-synced"); CT_ASSERT_MESSAGE(localSyncedTestdata, !access(localSyncedTestdata.c_str(), R_OK)); std::auto_ptr cmdline; // Import locally into empty database. sources[0].second->deleteAll(sources[0].second->createSourceA); sources[0].second->doImport(localTestdata); // Sync to remote. doSync(__FILE__, __LINE__, "upload", SyncOptions(RefreshFromLocalMode(), CheckSyncReport(0,0,0, -1,0,0, true, SYNC_REFRESH_FROM_LOCAL))); // Export from remote directly. std::string actualData = getCurrentTest() + ".remote.test.dat"; simplifyFilename(actualData); mkdir_p(actualData); cmdline.reset(new TestCmdline("--daemon=no", "--export", actualData.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE(peer + " " + peerSource, cmdline->run()); // Compare against expected result. We use the compare operation // of the local source and apply it to data from the remote one. // This typically works if the data has the same format. { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(remoteTestdata, actualData)); } // Modify remotely. std::string remoteModified = getCurrentTest() + ".remote.modified.test.dat"; simplifyFilename(remoteModified); CT_ASSERT(!system(StringPrintf("%s %s %s", modifyRemote.c_str(), actualData.c_str(), remoteModified.c_str()).c_str())); CT_ASSERT(isDir(remoteModified)); cmdline.reset(new TestCmdline("--daemon=no", "--update", remoteModified.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("update " + peer + " " + peerSource, cmdline->run()); // Sync between both sides to update the local data. doSync(__FILE__, __LINE__, "two-way", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,-1,0, 0,0,0, true, SYNC_TWO_WAY))); // Compare against expected result. TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceA(), TestingSyncSourcePtr::SLOW)); { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(localSyncedTestdata.c_str(), *copy)); } } void SyncTests::testDownload() { const std::string testname = "testDownload"; CT_ASSERT_EQUAL(sources.size(), 1); const ClientTest::Config &config(sources[0].second->config); StringPair peerConfig = getPeerConfig(config.m_sourceName); const std::string &peer = peerConfig.first; const std::string &peerSource = peerConfig.second; CT_ASSERT(!peer.empty()); CT_ASSERT(!peerSource.empty()); std::string localTestdata = getPeerTestdata(config.m_sourceName, testname, "local"); CT_ASSERT_MESSAGE(localTestdata, !access(localTestdata.c_str(), R_OK)); std::string remoteTestdata = getPeerTestdata(config.m_sourceName, testname, "remote"); CT_ASSERT_MESSAGE(remoteTestdata, !access(remoteTestdata.c_str(), R_OK)); std::string modifyLocal = getPeerTestdata(config.m_sourceName, testname, "modify-local"); CT_ASSERT_MESSAGE(modifyLocal, !access(modifyLocal.c_str(), R_OK|X_OK)); std::string remoteSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "remote-synced"); CT_ASSERT_MESSAGE(remoteSyncedTestdata, !access(remoteSyncedTestdata.c_str(), R_OK)); std::auto_ptr cmdline; // Wipe remote directly, then import. cmdline.reset(new TestCmdline("--daemon=no", "--delete-items", peer.c_str(), peerSource.c_str(), "*", (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE(peer + " " + peerSource, cmdline->run()); cmdline.reset(new TestCmdline("--daemon=no", "--import", remoteTestdata.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE(peer + " " + peerSource, cmdline->run()); // Sync into local database. doSync(__FILE__, __LINE__, "download", SyncOptions(SYNC_REFRESH_FROM_REMOTE, CheckSyncReport(-1,0,-1, 0,0,0, true, SYNC_REFRESH_FROM_REMOTE))); // Compare against expected result. TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceA(), TestingSyncSourcePtr::SLOW)); { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(localTestdata.c_str(), *copy)); } // Modify locally. std::string actualLocalData = getCurrentTest() + ".local.test.dat"; simplifyFilename(actualLocalData); std::string localModified = getCurrentTest() + ".local.modified.test.dat"; simplifyFilename(localModified); CT_ASSERT_NO_THROW(UpdateLocal(currentServer() + "_1", config.m_sourceName, actualLocalData, localModified, modifyLocal)); // Sync between both sides to update the remote. doSync(__FILE__, __LINE__, "two-way", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,0,0, 0,-1,0, true, SYNC_TWO_WAY))); // Check remote. std::string syncedRemoteData = getCurrentTest() + ".remote.test.dat"; simplifyFilename(syncedRemoteData); rm_r(syncedRemoteData); mkdir_p(syncedRemoteData); cmdline.reset(new TestCmdline("--daemon=no", "--export", syncedRemoteData.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run()); // Compare against expected result. We use the compare operation // of the local source and apply it to data from the remote one. // This typically works if the data has the same format. { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(remoteSyncedTestdata, syncedRemoteData)); } } void SyncTests::doUpdateConflict(const std::string &testname, bool localWins) { CT_ASSERT_EQUAL(sources.size(), 1); const ClientTest::Config &config(sources[0].second->config); StringPair peerConfig = getPeerConfig(config.m_sourceName); const std::string &peer = peerConfig.first; const std::string &peerSource = peerConfig.second; CT_ASSERT(!peer.empty()); CT_ASSERT(!peerSource.empty()); std::string localTestdata = getPeerTestdata(config.m_sourceName, testname, "local"); CT_ASSERT_MESSAGE(localTestdata, !access(localTestdata.c_str(), R_OK)); std::string localSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "local-synced"); CT_ASSERT_MESSAGE(localSyncedTestdata, !access(localSyncedTestdata.c_str(), R_OK)); std::string remoteSyncedTestdata = getPeerTestdata(config.m_sourceName, testname, "remote-synced"); CT_ASSERT_MESSAGE(remoteSyncedTestdata, !access(remoteSyncedTestdata.c_str(), R_OK)); std::string modifyLocal = getPeerTestdata(config.m_sourceName, testname, "modify-local"); CT_ASSERT_MESSAGE(modifyLocal, !access(modifyLocal.c_str(), R_OK|X_OK)); std::string modifyRemote = getPeerTestdata(config.m_sourceName, testname, "modify-remote"); CT_ASSERT_MESSAGE(modifyRemote, !access(modifyRemote.c_str(), R_OK|X_OK)); // Import locally into empty database. sources[0].second->deleteAll(sources[0].second->createSourceA); sources[0].second->doImport(localTestdata); // Sync to remote. doSync(__FILE__, __LINE__, "upload", SyncOptions(RefreshFromLocalMode(), CheckSyncReport(0,0,0, -1,0,0, true, SYNC_REFRESH_FROM_LOCAL))); // Export from remote directly. std::string actualRemoteData = getCurrentTest() + ".remote.test.dat"; simplifyFilename(actualRemoteData); std::auto_ptr cmdline; rm_r(actualRemoteData); mkdir_p(actualRemoteData); cmdline.reset(new TestCmdline("--daemon=no", "--export", actualRemoteData.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run()); // Modify all items on both sides. In both cases the modification // is done with a shell script which must make a copy of the data. // The shell scripts can be used to cause one or the other side // to have a modified version of an item or both at the same time, // which will trigger merging in the engine. The shell script // needs to create an entry for each item which is meant to be // updated, using the same file name (= luid) as in the input // directory. // // The order and timing of updating matters for the test because // the engine will look at time stamps (REV resp. LAST-MODIFIED) // to determine which side has the more recent change. for (int i = 0; i < 2; i++) { if (localWins ? i == 0 : i == 1) { // The remote side can use the data downloaded earlier. std::string remoteModified = getCurrentTest() + ".remote.modified.test.dat"; simplifyFilename(remoteModified); CT_ASSERT(!system(StringPrintf("%s %s %s", modifyRemote.c_str(), actualRemoteData.c_str(), remoteModified.c_str()).c_str())); CT_ASSERT(isDir(remoteModified)); cmdline.reset(new TestCmdline("--daemon=no", "--update", remoteModified.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("update " + peer + " " + peerSource, cmdline->run()); // Check remote after update. std::string remoteActualModified = getCurrentTest() + ".remote.actual.test.dat"; simplifyFilename(remoteActualModified); rm_r(remoteActualModified); mkdir_p(remoteActualModified); cmdline.reset(new TestCmdline("--daemon=no", "--export", remoteActualModified.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run()); // Copy all unmodified items before the comparison. ReadDir dir(remoteModified); std::set modified(dir.begin(), dir.end()); BOOST_FOREACH(const std::string &luid, ReadDir(actualRemoteData)) { if (modified.find(luid) == modified.end()) { std::string content; CT_ASSERT(ReadFile(actualRemoteData + "/" + luid, content)); std::ofstream((remoteModified + "/" + luid).c_str()).write(content.c_str(), content.size()); } } // Compare against expected result. We use the compare operation // of the local source and apply it to data from the remote one. // This typically works if the data has the same format. { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(remoteModified, remoteActualModified)); } } else { std::string actualLocalData = getCurrentTest() + ".local.test.dat"; simplifyFilename(actualLocalData); std::string localModified = getCurrentTest() + ".local.modified.test.dat"; simplifyFilename(localModified); CT_ASSERT_NO_THROW(UpdateLocal(currentServer() + "_1", config.m_sourceName, actualLocalData, localModified, modifyLocal)); } // System time must be synchronized with the remote side for the // test to pass reliably. Wait here and/or check that // loosing side's time is in the past (TODO). sleep(5); } // Sync between both sides. doSync(__FILE__, __LINE__, "two-way", SyncOptions(SYNC_TWO_WAY, CheckSyncReport(0,-1,-1, 0,-1,0, true, SYNC_TWO_WAY))); // Check remote. std::string syncedRemoteData = getCurrentTest() + ".remote.test.dat"; simplifyFilename(syncedRemoteData); rm_r(syncedRemoteData); mkdir_p(syncedRemoteData); cmdline.reset(new TestCmdline("--daemon=no", "--export", syncedRemoteData.c_str(), peer.c_str(), peerSource.c_str(), (const char *)NULL)); CT_ASSERT(cmdline->parse()); CT_ASSERT_MESSAGE("export " + peer + " " + peerSource, cmdline->run()); // Compare against expected result. We use the compare operation // of the local source and apply it to data from the remote one. // This typically works if the data has the same format. { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(remoteSyncedTestdata, syncedRemoteData)); } // Check local. TestingSyncSourcePtr copy; SOURCE_ASSERT_NO_FAILURE(copy.get(), copy.reset(sources[0].second->createSourceA(), TestingSyncSourcePtr::SLOW)); { ScopedEnvChange fullSyncCompare("CLIENT_TEST_SERVER", "none"); CT_ASSERT(sources[0].second->compareDatabases(localSyncedTestdata.c_str(), *copy)); } } void SyncTests::testUpdateRemoteWins() { // Local side gets updated first, then remote -> remote wins during merge conflict. doUpdateConflict("testUpdateRemoteWins", false); } void SyncTests::testUpdateLocalWins() { // Remote side gets updated first, then local -> local wins during merge conflict. doUpdateConflict("testUpdateLocalWins", true); } void SyncTests::doSync(const SyncOptions &options) { int res = 0; static int syncCounter = 0; static std::string lastTest; std::stringstream logstream; // reset counter when switching tests if (lastTest != getCurrentTest()) { syncCounter = 0; lastTest = getCurrentTest(); } std::string prefix; prefix.reserve(80); for (std::list::iterator it = logPrefixes.begin(); it != logPrefixes.end(); ++it) { prefix += "."; prefix += *it; } if (!prefix.empty()) { printf(" %s", prefix.c_str() + 1); fflush(stdout); } logstream /* << std::setw(4) << std::setfill('0') << syncCounter << "_" */ << getCurrentTest() << prefix << ".client." << (accessClientB ? "A" : "B"); std::string logname = logstream.str(); simplifyFilename(logname); syncCounter++; SE_LOG_DEBUG(NULL, "%d. starting %s with sync mode %s", syncCounter, logname.c_str(), PrettyPrintSyncMode(options.m_syncMode).c_str()); try { CT_ASSERT_NO_THROW(res = client.doSync(sourceArray, logname, options)); } catch (...) { postSync(res, logname); throw; } CT_ASSERT_NO_THROW(postSync(res, logname)); } void SyncTests::postSync(int res, const std::string &logname) { client.postSync(res, logname); } void SyncTests::allSourcesInsert(bool withUID) { BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { CT_ASSERT_NO_THROW(source_pair.second->doInsert(withUID)); } } void SyncTests::allSourcesUpdate() { BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { CT_ASSERT_NO_THROW(source_pair.second->update(source_pair.second->createSourceA, source_pair.second->config.m_updateItem)); } } void SyncTests::allSourcesDeleteAll() { BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { CT_ASSERT_NO_THROW(source_pair.second->deleteAll(source_pair.second->createSourceA)); } } void SyncTests::allSourcesInsertMany(int startIndex, int numItems, std::map > &luids) { BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { std::list l; CT_ASSERT_NO_THROW(l = source_pair.second->insertManyItems(source_pair.second->createSourceA, startIndex, numItems, 0)); CT_ASSERT_EQUAL((size_t)numItems, l.size()); // append instead of overwriting - useful when multiple // insertMany calls share the same luid buffer luids[source_pair.first].insert(luids[source_pair.first].end(), l.begin(), l.end()); } } void SyncTests::allSourcesUpdateMany(int startIndex, int numItems, int revision, std::map > &luids, int offset) { BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { CT_ASSERT_NO_THROW(source_pair.second->updateManyItems(source_pair.second->createSourceA, startIndex, numItems, 0, revision, luids[source_pair.first], offset)); } } void SyncTests::allSourcesRemoveMany(int numItems, std::map > &luids, int offset) { BOOST_FOREACH(source_array_t::value_type &source_pair, sources) { CT_ASSERT_NO_THROW(source_pair.second->removeManyItems(source_pair.second->createSourceA, numItems, luids[source_pair.first], offset)); } } /** generates tests on demand based on what the client supports */ class ClientTestFactory : public CppUnit::TestFactory { public: ClientTestFactory(ClientTest &c) : client(c) {} virtual CppUnit::Test *makeTest() { int source; CppUnit::TestSuite *alltests = new CppUnit::TestSuite("Client"); CppUnit::TestSuite *tests; // create local source tests typedef std::map ConfigMap; ConfigMap configs; tests = new CppUnit::TestSuite(alltests->getName() + "::Source"); for (source=0; source < client.getNumLocalSources(); source++) { ClientTest::Config config; client.getLocalSourceConfig(source, config); if (!config.m_sourceName.empty()) { LocalTests *sourcetests = client.createLocalTests(tests->getName() + "::" + config.m_sourceName, source, config); sourcetests->addTests(); tests->addTest(FilterTest(sourcetests)); configs[config.m_sourceName] = sourcetests; } } // link configs of sources which share the same database BOOST_FOREACH (const ConfigMap::value_type &entry, configs) { LocalTests *sourcetests = entry.second; const ClientTest::Config &config = sourcetests->config; if (!config.m_linkedSources.empty()) { sourcetests->m_linkedSources.push_back(sourcetests); BOOST_FOREACH (const std::string &source, config.m_linkedSources) { sourcetests->m_linkedSources.push_back(configs[source]); } } } alltests->addTest(FilterTest(tests)); // create sync tests with just one source tests = new CppUnit::TestSuite(alltests->getName() + "::Sync"); for (source=0; source < client.getNumSyncSources(); source++) { ClientTest::Config config; client.getSyncSourceConfig(source, config); if (!config.m_sourceName.empty()) { std::vector sources; sources.push_back(source); SyncTests *synctests = client.createSyncTests(tests->getName() + "::" + config.m_sourceName, sources); synctests->addTests(source == 0); tests->addTest(FilterTest(synctests)); } } // create sync tests with all sources enabled, unless we only have one: // that would be identical to the test above std::vector sources; std::string name, name_reversed; for (source=0; source < client.getNumSyncSources(); source++) { ClientTest::Config config; client.getSyncSourceConfig(source, config); if (!config.m_sourceName.empty()) { sources.push_back(source); if (name.size() > 0) { name += "_"; name_reversed = std::string("_") + name_reversed; } name += config.m_sourceName; name_reversed = config.m_sourceName + name_reversed; } } if (sources.size() > 1) { SyncTests *synctests = client.createSyncTests(tests->getName() + "::" + name, sources); synctests->addTests(); tests->addTest(FilterTest(synctests)); synctests = 0; if (getenv("CLIENT_TEST_REVERSE_SOURCES")) { // now also in reversed order - who knows, it might make a difference; // typically it just makes the whole run slower, so not enabled // by default std::reverse(sources.begin(), sources.end()); synctests = client.createSyncTests(tests->getName() + "::" + name_reversed, sources); synctests->addTests(); tests->addTest(FilterTest(synctests)); synctests = 0; } } alltests->addTest(FilterTest(tests)); tests = 0; return alltests; } private: ClientTest &client; }; void ClientTest::registerTests() { freeFactory(); factory = (void *)new ClientTestFactory(*this); CppUnit::TestFactoryRegistry::getRegistry().registerFactory((CppUnit::TestFactory *)factory); } ClientTest::ClientTest(int serverSleepSec, const std::string &serverLog) : serverSleepSeconds(serverSleepSec), serverLogFileName(serverLog), factory(NULL) { } void ClientTest::freeFactory() { if(factory) { CppUnit::TestFactoryRegistry::getRegistry().unregisterFactory((CppUnit::TestFactory *)factory); delete (CppUnit::TestFactory *)factory; factory = NULL; } } ClientTest::~ClientTest() { freeFactory(); } void ClientTest::registerCleanup(Cleanup_t cleanup) { cleanupSet.insert(cleanup); } void ClientTest::shutdown() { BOOST_FOREACH(Cleanup_t cleanup, cleanupSet) { cleanup(); } } LocalTests *ClientTest::createLocalTests(const std::string &name, int sourceParam, ClientTest::Config &co) { return new LocalTests(name, *this, sourceParam, co); } SyncTests *ClientTest::createSyncTests(const std::string &name, std::vector sourceIndices, bool isClientA) { return new SyncTests(name, *this, sourceIndices, isClientA); } int ClientTest::dump(ClientTest &client, TestingSyncSource &source, const std::string &file) { BackupReport report; boost::shared_ptr node(new VolatileConfigNode); rm_r(file); mkdir_p(file); CT_ASSERT(source.getOperations().m_backupData); source.getOperations().m_backupData(SyncSource::Operations::ConstBackupInfo(), SyncSource::Operations::BackupInfo(SyncSource::Operations::BackupInfo::BACKUP_OTHER, file, node), report); return 0; } void ClientTest::getItems(const std::string &file, list &items, std::string &testcases) { items.clear(); // import the file, trying a .tem file (base file plus patch) // first std::ifstream input; string server = currentServer(); testcases = file + '.' + server +".tem"; input.open(testcases.c_str()); if (input.fail()) { // try server-specific file (like eds_event.ics.local) testcases = file + '.' + server; input.open(testcases.c_str()); } if (input.fail()) { // try base file testcases = file; input.open(testcases.c_str()); } CT_ASSERT(!input.bad()); CT_ASSERT(input.is_open()); std::string data, line; while (input) { bool wasend = false; do { getline(input, line); CT_ASSERT(!input.bad()); // empty lines directly after line which starts with END mark end of record; // check for END necessary becayse vCard 2.1 ENCODING=BASE64 may have empty lines in body of VCARD! if ((line != "\r" && line.size() > 0) || !wasend) { data += line; data += "\n"; } else { if (!data.empty()) { items.push_back(data); } data = ""; } wasend = !line.compare(0, 4, "END:"); } while(!input.eof()); } if (data != "" && data != "\r\n" && data != "\n") { items.push_back(data); } } std::string ClientTest::import(ClientTest &client, TestingSyncSource &source, const ClientTestConfig &config, const std::string &file, std::string &realfile, std::list *luids) { list items; getItems(file, items, realfile); SE_LOG_DEBUG(NULL, "importing %d test cases from file %s", (int)items.size(), realfile.c_str()); std::string failures; bool doImport = !luids || luids->empty(); std::list::const_iterator it; if (!doImport) { it = luids->begin(); } BOOST_FOREACH(string &data, items) { std::string luid; try { if (doImport) { luid = importItem(&source, config, data); CT_ASSERT(!luid.empty()); if (luids) { luids->push_back(luid); } } else { CT_ASSERT(it != luids->end()); luid = *it; ++it; // Did import already fail? If yes, then don't try to // update because it will also fail. if (!luid.empty()) { // TODO: should fail for status = 6 in eas updateItem(&source, data, luid); } } } catch (...) { std::string explanation; Exception::handle(explanation); failures += "Failed to "; if (doImport) { failures += "import:\n"; } else { failures += "update " + luid + ":\n"; } failures += data; failures += "\n"; failures += explanation; failures += "\n"; if (doImport && luids) { luids->push_back(""); } } } return failures; } bool ClientTest::compare(ClientTest &client, const std::string &fileA, const std::string &fileB) { setenv("CLIENT_TEST_HEADER", "\n\n", 1); setenv("CLIENT_TEST_LEFT_NAME", fileA.c_str(), 1); setenv("CLIENT_TEST_RIGHT_NAME", fileB.c_str(), 1); setenv("CLIENT_TEST_REMOVED", "only in left file", 1); setenv("CLIENT_TEST_ADDED", "only in right file", 1); bool success = false; const char* compareLog = getenv("CLIENT_TEST_COMPARE_LOG"); if(compareLog && strlen(compareLog)) { std::string cmdstr = std::string("synccompare ") + fileA + " " + fileB; string tmpfile = "____compare.log"; cmdstr =string("bash -c 'set -o pipefail;") + cmdstr; cmdstr += " 2>&1|tee " +tmpfile+"'"; success = system(cmdstr.c_str()) == 0; } else { // Shortcut: run synccompare directly, without shell in the middle // (reduces overhead and output when running under valgrind). pid_t child = fork(); switch (child) { case -1: perror("fork"); break; case 0: // child execl("synccompare", "synccompare", fileA.c_str(), fileB.c_str(), (char *)NULL); perror("synccompare"); exit(1); break; default: // parent int status; child = waitpid(child, &status, 0); if (child == -1) { perror("wait for synccompare"); } else if (WIFEXITED(status) && WEXITSTATUS(status) == 0) { success = true; } break; } } if (!success) { printf("failed: env CLIENT_TEST_SERVER=%s 'CLIENT_TEST_STRIP_PARAMETERS=%s' 'CLIENT_TEST_STRIP_PROPERTIES=%s'synccompare %s %s\n", getEnv("CLIENT_TEST_SERVER", ""), getEnv("CLIENT_TEST_STRIP_PARAMETERS", ""), getEnv("CLIENT_TEST_STRIP_PROPERTIES", ""), fileA.c_str(), fileB.c_str()); } return success; } void ClientTest::update(std::string &item) { const static char *props[] = { "\nSUMMARY", "\nNOTE", NULL }; for (const char **prop = props; *prop; prop++) { size_t pos; pos = item.find(*prop); if (pos != item.npos) { // Modify existing property. Fast-forward to : (works as // long as colon is not in parameters). pos = item.find(':', pos); } if (pos != item.npos) { item.insert(pos + 1, "MOD-"); } else if (!strcmp(*prop, "\nNOTE") && (pos = item.find("END:VCARD")) != item.npos) { // add property, but only if it is allowed in the item item.insert(pos, "NOTE:MOD\n"); } } } void ClientTest::postSync(int res, const std::string &logname) { #ifdef WIN32 Sleep(serverSleepSeconds * 1000); #else sleep(serverSleepSeconds); // make a copy of the server's log (if found), then truncate it if (serverLogFileName.size()) { int fd = open(serverLogFileName.c_str(), O_RDWR); if (fd >= 0) { int out = open((logname + ".server.log").c_str(), O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); if (out >= 0) { char buffer[4096]; bool cont = true; ssize_t len; while (cont && (len = read(fd, buffer, sizeof(buffer))) > 0) { ssize_t total = 0; while (cont && total < len) { ssize_t written = write(out, buffer, len); if (written < 0) { perror(("writing " + logname + ".server.log").c_str()); cont = false; } else { total += written; } } } if (len < 0) { perror(("reading " + serverLogFileName).c_str()); } close(out); } if (ftruncate(fd, 0)) { perror("truncating log file"); } close(fd); } else { perror(serverLogFileName.c_str()); } } #endif } static string mangleGeneric(const std::string &data, bool update, const std::string &uniqueUIDSuffix) { std::string item = data; if (update) { boost::replace_first(item, "NOTE:", "NOTE:U "); } return item; } static string mangleICalendar20(const std::string &data, bool update, const std::string &uniqueUIDSuffix) { std::string item = data; std::string type; static const pcrecpp::RE re("BEGIN:(VEVENT|VJOURNAL|VTODO)\n"); re.PartialMatch(data, &type); if (update) { if (type == "VJOURNAL") { // Need to modify first line of description and summary // consistently for a note because in plain text // representation, these lines are expected to be // identical. boost::replace_first(item, "SUMMARY:", "SUMMARY:U "); } boost::replace_first(item, "DESCRIPTION:", "DESCRIPTION:U "); } if (getenv("CLIENT_TEST_NO_UID")) { stripProperty(item, "UID"); } else if (getenv("CLIENT_TEST_SIMPLE_UID")) { boost::replace_all(item, "UID:1234567890!@#$%^&*()<>@dummy", "UID:1234567890@dummy"); } const char *uniqueUID = getenv("CLIENT_TEST_UNIQUE_UID"); if (uniqueUID) { // Making UID unique per test to avoid issues // when the source already holds older copies. // Might still be an issue in real life?! static time_t start; static std::string test; if (test != getCurrentTest()) { start = time(NULL); test = getCurrentTest(); } std::string unique = StringPrintf("UID:UNIQUE-UID-%llu-", (long long unsigned)start); boost::replace_all(item, "UID:", unique); if (atoi(uniqueUID) > 1) { // Also avoid reusing the same UID inside the same test. // Required by Google CalDAV in calendar testChanges, because // they keep even deleted items around and check the SEQUENCE // number against their old data. boost::replace_all(item, "UNIQUE-UID", "UNIQUE-UID" + uniqueUIDSuffix); } } else if (getenv("CLIENT_TEST_LONG_UID")) { boost::replace_all(item, "UID:", "UID:this-is-a-ridiculously-long-uid-"); } size_t offset = item.find("\nLAST-MODIFIED:"); static const size_t len = strlen("\nLAST-MODIFIED:20100131T235959Z"); if (offset != item.npos) { // Special semantic for iCalendar 2.0: LAST-MODIFIED should be // incremented in updated items. Emulate that by inserting the // current time. time_t now = time(NULL); struct tm tm; gmtime_r(&now, &tm); std::string mod = StringPrintf("\nLAST-MODIFIED:%04d%02d%02dT%02d%02d%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); item.replace(offset, len, mod); } const static string sequence("\nSEQUENCE:XXX"); offset = item.find(sequence); if (offset != item.npos) { if (getenv("CLIENT_TEST_INCREASE_SEQUENCE")) { // Increment sequence number in steps of 100 to ensure that our // new item is considered more recent than any corresponding // item in the source. Some storages (Google CalDAV) check that. static int counter = 100; item.replace(offset, sequence.size(), StringPrintf("\nSEQUENCE:%d", counter)); counter += 100; } else { item.replace(offset, sequence.size(), "\nSEQUENCE:1"); } } return item; } static std::string additionalYearly(const std::string &single, const std::string &many, int start, int skip, int index, int total) { int startYear = 2012 + start - 1; std::string event; if (start == 0) { // no missing parent, nothing to add } else if (start == index) { // inserting a single detached recurrence event = StringPrintf(single.c_str(), startYear); } else { // many detached recurrences int endYear = startYear + index - start; std::string exdates; for (int year = startYear; year <= endYear; year++) { // a gap? if ((year - startYear) % (skip + 1)) { exdates += StringPrintf("EXDATE;TZID=Standard Timezone:%04d0101T120000\n", year); } } event = StringPrintf(many.c_str(), startYear, endYear, exdates.c_str()); } SE_LOG_DEBUG(NULL, "additional yearly: start %d, skip %d, index %d/%d:\n%s", start, skip, index, total, event.c_str()); return event; } static std::string additionalMonthly(const std::string &single, const std::string &many, int day, int start, int skip, int index, int total) { int startMonth = 1 + start - 1; std::string event; int endMonth = startMonth + index - start; int time = (endMonth >= 4 && endMonth <= 10) ? 10 : 11; if (start == 0) { } else if (start == index) { event = StringPrintf(single.c_str(), startMonth, day, time); } else { // Monthly recurrence uses INTERVAL instead of // EXDATEs, in contrast to yearly recurrence // (where Exchange somehow didn't grok the // INTERVAL). So EXDATEs are only necessary // for the first, second, last case. if (skip == -1 ) { std::string exdates; for (int month = startMonth; month <= endMonth; month++) { int step = month - startMonth; // a gap? if (step > 1 && step < total - start - 1) { exdates += StringPrintf("EXDATE;TZID=Standard Timezone:2012%02d01T120000\n", month); } } event = StringPrintf(many.c_str(), startMonth, day, endMonth, time, 1, exdates.c_str()); } else { event = StringPrintf(many.c_str(), startMonth, day, endMonth, time, skip + 1, ""); } } SE_LOG_DEBUG(NULL, "additional monthly: start %d, skip %d, index %d/%d:\n%s", start, skip, index, total, event.c_str()); return event; } // instead of trying to determine the dates of all Sundays in 2012 // algorithmically, hard-code them... static const struct { int m_month, m_day; } sundays[] = { { 1, 1 }, { 1, 8 }, { 1, 15 }, { 1, 22 }, { 1, 29 }, { 2, 5 }, { 2, 12 }, { 2, 19 }, { 2, 26 }, { 3, 4 }, { 3, 11 }, { 3, 18 }, // winter time ends on March 25th, week 12 (counting from zero) #define SUNDAYS_2012_WINTER_TIME_ENDS 12 { 3, 25 }, { 4, 1 }, { 4, 8 }, { 4, 15 }, { 4, 22 }, { 4, 29 }, { 5, 6 }, { 5, 13 }, { 5, 20 }, { 5, 27 }, { 6, 3 }, { 6, 10 }, { 6, 17 }, { 6, 24 }, { 7, 1 }, { 7, 8 }, { 7, 15 }, { 7, 22 }, { 7, 29 }, { 8, 5 }, { 8, 12 }, { 8, 19 }, { 8, 26 }, { 9, 2 }, { 9, 9 }, { 9, 16 }, { 9, 23 }, { 9, 30 }, { 10, 7 }, { 10, 14 }, { 10, 21 }, // winter time start on October 28th, week 43 (counting from zero) #define SUNDAYS_2012_WINTER_TIME_STARTS 43 { 10, 28 }, { 11, 4 }, { 11, 11 }, { 11, 18 }, { 11, 25 }, { 12, 2 }, { 12, 9 }, { 12, 16 }, { 12, 23 }, { 12, 30 }, { 0, 0 } }; static std::string additionalWeekly(const std::string &single, const std::string &many, int start, int skip, int index, int total) { int startWeek = start - 1; // numbered from zero in "sundays" array if (startWeek < 0) { startWeek = 0; } std::string event; int endWeek = startWeek + index - start; int time = (endWeek >= SUNDAYS_2012_WINTER_TIME_ENDS && endWeek < SUNDAYS_2012_WINTER_TIME_STARTS) ? 12 : 13; int startMonth = sundays[startWeek].m_month; int startDay = sundays[startWeek].m_day; if (start == 0) { } else if (start == index) { event = StringPrintf(single.c_str(), startMonth, startDay, time); } else { int endMonth = sundays[endWeek].m_month; int endDay = sundays[endWeek].m_day; // Weekly recurrence uses INTERVAL instead of // EXDATEs, in contrast to yearly recurrence // (where Exchange somehow didn't grok the // INTERVAL). So EXDATEs are only necessary // for the first, second, last case. std::string exdates; if (skip == -1 ) { for (int week = startWeek; week <= endWeek; week++) { int step = week - startWeek; // a gap? if (step > 1 && step < total - start - 1) { exdates += StringPrintf("EXDATE;TZID=Standard Timezone:2012%02d%02dT140000\n", sundays[week].m_month, sundays[week].m_day); } } event = StringPrintf(many.c_str(), startMonth, startDay, endMonth, endDay, time, 1, exdates.c_str()); } else { event = StringPrintf(many.c_str(), startMonth, startDay, endMonth, endDay, time, skip + 1, ""); } } SE_LOG_DEBUG(NULL, "additional weekly: start %d, skip %d, index %d/%d:\n%s", start, skip, index, total, event.c_str()); return event; } static void addMonthly(size_t &index, ClientTestConfig::MultipleLinkedItems_t &subset, const std::string &pre, const std::string &post, const char *suffix, int day, int months) { index++; subset.resize(index + 1); ClientTestConfig::LinkedItems_t *items = &subset[index]; items->m_name = std::string("Monthly") + suffix; /* month varies */ std::string parent = pre + "BEGIN:VEVENT\n" "UID:monthly\n" "DTSTAMP:20110101T120000Z\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T121000\n" "SUMMARY:monthly " + suffix + " Berlin\n" "RRULE:BYMONTHDAY=1;COUNT=12;FREQ=MONTHLY\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; std::string child = pre + "BEGIN:VEVENT\n" "UID:monthly\n" "DTSTAMP:20110101T120000Z\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T121000\n" "SUMMARY:%1$04d monthly " + suffix + " Berlin\n" "RECURRENCE-ID;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; items->push_back(StringPrintf(parent.c_str(), 1, day)); for (int month = 1; month <= months; month++) { items->push_back(StringPrintf(child.c_str(), month, day)); } if (currentServer() == "exchange") { /* month of event varies and UTC time of UNTIL clause (11 during winter time, 10 during summer) */ std::string single = pre + "BEGIN:VEVENT\n" "SUMMARY:[[activesyncd pseudo event - ignore me]]\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "RRULE:FREQ=YEARLY;UNTIL=2012" "%1$02d" "%2$02d" "T" "%3$02d" "0000Z;BYMONTHDAY=1;BYMONTH=%1$d\n" "UID:monthly\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; /* first month, last month, UTC time, INTERVAL and sometimes EXDATE varies */ std::string many = pre + "BEGIN:VEVENT\n" "SUMMARY:[[activesyncd pseudo event - ignore me]]\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T120000\n" "RRULE:BYMONTHDAY=1;FREQ=MONTHLY;INTERVAL=%5$d;UNTIL=2012" "%3$02d" "%2$02d" "T" "%4$02d" "0000Z\n" "%6$s" "UID:monthly\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; items->m_testLinkedItemsSubsetAdditional = boost::bind(additionalMonthly, single, many, day, _1, _2, _3, _4); } } void ClientTest::getTestData(const char *type, Config &config) { std::string server = currentServer(); config = Config(); char *env = getenv("CLIENT_TEST_RETRY"); config.m_retrySync = (env && !strcmp (env, "t")) ?true :false; env = getenv("CLIENT_TEST_RESEND"); config.m_resendSync = (env && !strcmp (env, "t")) ?true :false; env = getenv("CLIENT_TEST_SUSPEND"); config.m_suspendSync = (env && !strcmp (env, "t")) ?true :false; config.m_sourceKnowsItemSemantic = true; config.m_linkedItemsRelaxedSemantic = true; config.m_itemType = ""; config.m_import = import; config.m_dump = dump; config.m_compare = compare; // Sync::*::testExtensions not enabled by default. config.m_update = 0; config.m_genericUpdate = update; // redirect requests for "eds_event" towards "eds_event_noutc"? bool noutc = false; env = getenv ("CLIENT_TEST_NOUTC"); if (env && !strcmp (env, "t")) { noutc = true; } config.m_mangleItem = mangleGeneric; // True for most item kinds, exceptions set below. config.m_uniqueID = true; static std::set vCardEssential = boost::assign::list_of("FN")("N")("UID")("VERSION"), iCalEssential = boost::assign::list_of("DTSTART")("DTEND")("DTSTAMP")("SUMMARY")("UID")("RRULE")("RECURRENCE-ID")("VERSION"); // RRULE is not essential for a valid item, but removing it has implications // for other properties (EXDATE) and other items (detached recurrences) and // thus cannot be tested in testRemoveProperties (because it doesn't know about // these inter-depdendencies). if (!strcmp(type, "eds_contact")) { config.m_sourceName = "eds_contact"; config.m_sourceNameServerTemplate = "addressbook"; config.m_uri = "card3"; // ScheduleWorld config.m_type = "text/vcard"; config.m_essentialProperties = vCardEssential; config.m_uniqueID = false; config.m_insertItem = "BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:tester\n" "FN:John Doe\n" "N:Doe;John;;;\n" "UID:25741c35e5431f054444fdf4571219c3\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "X-EVOLUTION-FILE-AS:Doe\\, John\n" "X-MOZILLA-HTML:FALSE\n" "END:VCARD\n"; config.m_updateItem = "BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:tester\n" "FN:Joan Doe\n" "N:Doe;Joan;;;\n" "UID:25741c35e5431f054444fdf4571219c3\n" "X-EVOLUTION-FILE-AS:Doe\\, Joan\n" "TEL;TYPE=WORK;TYPE=VOICE:business 2\n" "BDAY:2006-01-08\n" "X-MOZILLA-HTML:TRUE\n" "END:VCARD\n"; /* adds a second phone number: */ config.m_complexUpdateItem = "BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:tester\n" "FN:Joan Doe\n" "N:Doe;Joan;;;\n" "UID:25741c35e5431f054444fdf4571219c3\n" "X-EVOLUTION-FILE-AS:Doe\\, Joan\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "TEL;TYPE=HOME;TYPE=VOICE:home 2\n" "BDAY:2006-01-08\n" "X-MOZILLA-HTML:TRUE\n" "END:VCARD\n"; /* add a telephone number, email and X-AIM to initial item */ config.m_mergeItem1 = "BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:tester\n" "FN:John Doe\n" "N:Doe;John;;;\n" "UID:25741c35e5431f054444fdf4571219c3\n" "X-EVOLUTION-FILE-AS:Doe\\, John\n" "X-MOZILLA-HTML:FALSE\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "EMAIL:john.doe@work.com\n" "X-AIM:AIM JOHN\n" "END:VCARD\n"; config.m_mergeItem2 = "BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:developer\n" "FN:John Doe\n" "N:Doe;John;;;\n" "UID:25741c35e5431f054444fdf4571219c3\n" "TEL;TYPE=WORK;TYPE=VOICE:123456\n" "X-EVOLUTION-FILE-AS:Doe\\, John\n" "X-MOZILLA-HTML:TRUE\n" "BDAY:2006-01-08\n" "END:VCARD\n"; // use NOTE and N to make the item unique config.m_templateItem = "BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:tester\n" "N:Doe;<>;<>;;\n" "FN:<> Doe\n" "UID:<>-25741c35e5431f054444fdf4571219c3\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "X-EVOLUTION-FILE-AS:Doe\\, <>\n" "X-MOZILLA-HTML:FALSE\n" "NOTE:<>\n" "END:VCARD\n"; config.m_uniqueProperties = ""; config.m_sizeProperty = "NOTE"; config.m_testcases = "testcases/eds_contact.vcf"; if (server == "exchange" || server == "googleeas") { // X-MOZILLA-HTML not supported by ActiveSync. boost::replace_first(config.m_updateItem, "X-MOZILLA-HTML:TRUE", "X-MOZILLA-HTML:FALSE"); boost::replace_first(config.m_complexUpdateItem, "X-MOZILLA-HTML:TRUE", "X-MOZILLA-HTML:FALSE"); boost::replace_first(config.m_mergeItem2, "X-MOZILLA-HTML:TRUE", "X-MOZILLA-HTML:FALSE"); } } else if (!strcmp(type, "eds_event") && !noutc) { config.m_sourceName = "eds_event"; config.m_sourceNameServerTemplate = "calendar"; config.m_uri = "cal2"; // ScheduleWorld config.m_type = "text/x-vcalendar"; config.m_essentialProperties = iCalEssential; if (server == "exchange") { // currently cannot remove EXDATE properties, see BMC #24290 config.m_essentialProperties.insert("EXDATE"); } config.m_mangleItem = mangleICalendar20; config.m_insertItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting - old\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "UID:1234567890!@#$%^&*()<>@dummyVEVENT\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201Z\n" "CREATED:20060409T213201Z\n" "LOCATION:my office\n" "DESCRIPTION:let's talk<>\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "END:VEVENT\n" "END:VCALENDAR\n"; config.m_updateItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "SUMMARY:meeting on site - updated\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "UID:1234567890!@#$%^&*()<>@dummyVEVENT\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201Z\n" "CREATED:20060409T213201Z\n" "SEQUENCE:XXX\n" "LOCATION:big meeting room\n" "DESCRIPTION:nice to see you\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "END:VEVENT\n" "END:VCALENDAR\n"; /* change location and description of insertItem in testMerge(), add alarm */ config.m_mergeItem1 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "UID:1234567890!@#$%^&*()<>@dummyVEVENT\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201Z\n" "CREATED:20060409T213201Z\n" "SEQUENCE:XXX\n" "LOCATION:calling from home\n" "DESCRIPTION:let's talk\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "BEGIN:VALARM\n" "DESCRIPTION:alarm\n" "ACTION:DISPLAY\n" "TRIGGER;VALUE=DURATION;RELATED=START:-PT15M\n" "END:VALARM\n" "END:VEVENT\n" "END:VCALENDAR\n"; /* change location to something else, add category */ config.m_mergeItem2 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "UID:1234567890!@#$%^&*()<>@dummyVEVENT\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201Z\n" "CREATED:20060409T213201Z\n" "SEQUENCE:XXX\n" "LOCATION:my office\n" "CATEGORIES:WORK\n" "DESCRIPTION:what the heck\\, let's even shout a bit\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "END:VEVENT\n" "END:VCALENDAR\n"; // Servers have very different understandings of how // recurrence interacts with time zones and RRULE. // Must use different test cases for some servers to // avoid having the linkedItems test cases fail // because of that. // default: time zones + UNTIL in UTC, with VALARM config.m_linkedItems.resize(1); config.m_linkedItems[0].m_name = "Default"; config.m_linkedItems[0].resize(2); config.m_linkedItems[0][0] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:Europe/Berlin\n" "X-LIC-LOCATION:Europe/Berlin\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:+0100\n" "TZOFFSETTO:+0200\n" "TZNAME:CEST\n" "DTSTART:19700329T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\n" "END:DAYLIGHT\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:+0200\n" "TZOFFSETTO:+0100\n" "TZNAME:CET\n" "DTSTART:19701025T030000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART;TZID=Europe/Berlin:20080406T090000\n" "DTEND;TZID=Europe/Berlin:20080406T093000\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring\n" "DESCRIPTION:recurs each Monday\\, 10 times\n" "CLASS:PUBLIC\n" "RRULE:FREQ=WEEKLY;UNTIL=20080608T070000Z;INTERVAL=1;BYDAY=SU\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193241Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; config.m_linkedItems[0][1] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:Europe/Berlin\n" "X-LIC-LOCATION:Europe/Berlin\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:+0100\n" "TZOFFSETTO:+0200\n" "TZNAME:CEST\n" "DTSTART:19700329T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\n" "END:DAYLIGHT\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:+0200\n" "TZOFFSETTO:+0100\n" "TZNAME:CET\n" "DTSTART:19701025T030000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART;TZID=Europe/Berlin:20080413T090000\n" "DTEND;TZID=Europe/Berlin:20080413T093000\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring: Modified\n" "CLASS:PUBLIC\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193647Z\n" "RECURRENCE-ID;TZID=Europe/Berlin:20080413T090000\n" "DESCRIPTION:second instance modified\n" "END:VEVENT\n" "END:VCALENDAR\n"; bool recurringAllDay = false; bool recurringNoTZ = false; bool subsets = false; if (server == "funambol") { // converts UNTIL into floating time - broken?! config.m_linkedItems[0].m_name = "UntilFloatTime"; config.m_linkedItems[0][0] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:Europe/Berlin\n" "X-LIC-LOCATION:Europe/Berlin\n" "BEGIN:DAYLIGHT\n" "TZOFFSETFROM:+0100\n" "TZOFFSETTO:+0200\n" "TZNAME:CEST\n" "DTSTART:19700329T020000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\n" "END:DAYLIGHT\n" "BEGIN:STANDARD\n" "TZOFFSETFROM:+0200\n" "TZOFFSETTO:+0100\n" "TZNAME:CET\n" "DTSTART:19701025T030000\n" "RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART;TZID=Europe/Berlin:20080406T090000\n" "DTEND;TZID=Europe/Berlin:20080406T093000\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring\n" "DESCRIPTION:recurs each Monday\\, 10 times\n" "CLASS:PUBLIC\n" "RRULE:FREQ=WEEKLY;UNTIL=20080608T090000;INTERVAL=1;BYDAY=SU\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193241Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; } else if (server == "mobical") { // UTC time config.m_linkedItems[0].m_name = "UTC"; config.m_linkedItems[0][0] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART:20080406T070000Z\n" "DTEND:20080406T073000Z\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring\n" "DESCRIPTION:recurs each Monday\\, 10 times\n" "CLASS:PUBLIC\n" "RRULE:FREQ=WEEKLY;UNTIL=20080608T070000Z;INTERVAL=1;BYDAY=SU\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193241Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; config.m_linkedItems[0][1] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART:20080413T070000Z\n" "DTEND:20080413T073000Z\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring: Modified\n" "CLASS:PUBLIC\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193647Z\n" "RECURRENCE-ID:20080413T070000Z\n" "DESCRIPTION:second instance modified\n" "END:VEVENT\n" "END:VCALENDAR\n"; } else if (server == "memotoo") { // local floating time, always, regardless what the original // time zone might have been (TZID, UTC, floating) config.m_linkedItems[0].m_name = "LocalTime"; config.m_linkedItems[0][0] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART:20080406T070000\n" "DTEND:20080406T073000\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring\n" "DESCRIPTION:recurs each Monday\\, 10 times\n" "CLASS:PUBLIC\n" "RRULE:FREQ=WEEKLY;UNTIL=20080608T070000;INTERVAL=1;BYDAY=SU\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193241Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; config.m_linkedItems[0][1] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:20080407T193125Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART:20080413T070000\n" "DTEND:20080413T073000\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring: Modified\n" "CLASS:PUBLIC\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193647Z\n" "RECURRENCE-ID:20080413T070000\n" "DESCRIPTION:second instance modified\n" "END:VEVENT\n" "END:VCALENDAR\n"; // also affects normal test items std::string *items[] = { &config.m_insertItem, &config.m_updateItem, &config.m_mergeItem1, &config.m_mergeItem2 }; BOOST_FOREACH(std::string *item, items) { static const pcrecpp::RE times("^(DTSTART|DTEND)(.*)Z$", pcrecpp::RE_Options().set_multiline(true)); times.GlobalReplace("\\1\\2", item); } } else if (server == "exchange") { config.m_linkedItems[0].m_name = "StandardTZ"; BOOST_FOREACH(std::string &item, config.m_linkedItems[0]) { // time zone name changes on server to "Standard Timezone", // with some information stripped boost::replace_all(item, "Europe/Berlin", "Standard Timezone"); // some properties are not stored/supported boost::replace_all(item, "TZNAME:CET\n", ""); boost::replace_all(item, "TZNAME:CEST\n", ""); boost::replace_all(item, "X-LIC-LOCATION:Standard Timezone\n", ""); } recurringAllDay = true; subsets = true; } else { // in particular for Google Calendar: also try with // VALARM, because testing showed that the server works // differently with and without VALARM data included config.m_linkedItems.resize(2); config.m_linkedItems[1].m_name = "WithVALARM"; config.m_linkedItems[1].resize(2); const std::string valarm = "BEGIN:VALARM\n" "ACTION:DISPLAY\n" "DESCRIPTION:This is an event reminder\n" "TRIGGER;VALUE=DURATION;RELATED=START:-PT1H\n" "X-EVOLUTION-ALARM-UID:foo@bar\n" "END:VALARM\nEND:VEVENT"; config.m_linkedItems[1][0] = config.m_linkedItems[0][0]; boost::replace_first(config.m_linkedItems[1][0], "END:VEVENT", valarm); config.m_linkedItems[1][1] = config.m_linkedItems[0][1]; boost::replace_first(config.m_linkedItems[1][1], "END:VEVENT", valarm); // also enable other linked item variants recurringAllDay = true; recurringNoTZ = true; } if (boost::starts_with(server, "google")) { // converts local time into time zone of the user, // which breaks the test recurringNoTZ = false; } // test is fairly slow, only test with some CalDAV servers if (boost::starts_with(server, "apple")) { subsets = true; } if (recurringAllDay) { // also test recurring all-day events with exceptions size_t index = config.m_linkedItems.size(); config.m_linkedItems.resize(index + 1); config.m_linkedItems[index].m_name = "AllDay"; config.m_linkedItems[index].resize(2); config.m_linkedItems[index][0] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:20110829T130000Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART;VALUE=DATE:20080406\n" "DTEND;VALUE=DATE:20080407\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring all day event\n" "DESCRIPTION:recurs each Monday\\, 3 times\n" "CLASS:PUBLIC\n" "RRULE:FREQ=WEEKLY;UNTIL=20080420;INTERVAL=1;BYDAY=SU\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193241Z\n" "END:VEVENT\n" "END:VCALENDAR\n"; // workaround for http://code.google.com/p/google-caldav-issues/issues/detail?id=63 // Google CalDAV inserts a time into the UNTIL clause, do the same in the // reference data. if (boost::starts_with(server, "google")) { config.m_linkedItems[index].m_name = "AllDayGoogle"; boost::replace_first(config.m_linkedItems[index][0], "UNTIL=20080420", "UNTIL=20080420T070000Z"); } config.m_linkedItems[index][1] = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VEVENT\n" "UID:20110829T130000Z-19554-727-1-50@dummyVEVENT\n" "DTSTAMP:20080407T193125Z\n" "DTSTART;VALUE=DATE:20080413\n" "DTEND;VALUE=DATE:20080414\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "SUMMARY:Recurring: Modified second instance\n" "CLASS:PUBLIC\n" "CREATED:20080407T193241Z\n" "LAST-MODIFIED:20080407T193647Z\n" "RECURRENCE-ID;VALUE=DATE:20080413\n" "DESCRIPTION:second instance modified\n" "END:VEVENT\n" "END:VCALENDAR\n"; } if (recurringNoTZ) { // also test recurring event with no timezone size_t index = config.m_linkedItems.size(); config.m_linkedItems.resize(index + 1); config.m_linkedItems[index].m_name = "NoTZ"; config.m_linkedItems[index].resize(2); config.m_linkedItems[index][0] = config.m_linkedItems[0][0]; config.m_linkedItems[index][1] = config.m_linkedItems[0][1]; stripComponent(config.m_linkedItems[index][0], "VTIMEZONE"); stripParameters(config.m_linkedItems[index][0], "TZID"); stripComponent(config.m_linkedItems[index][1], "VTIMEZONE"); stripParameters(config.m_linkedItems[index][1], "TZID"); } if (subsets) { static const std::string pre = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" // Actually, this is Europe/Berlin. // Was renamed to fit the simplified activesyncd naming // and DTSTART was adapted. "TZID:Standard Timezone\n" "BEGIN:STANDARD\n" "DTSTART:19701025T030000\n" "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" "TZOFFSETFROM:+0200\n" "TZOFFSETTO:+0100\n" "END:STANDARD\n" "BEGIN:DAYLIGHT\n" "DTSTART:19700329T020000\n" "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\n" "TZOFFSETFROM:+0100\n" "TZOFFSETTO:+0200\n" "END:DAYLIGHT\n" "END:VTIMEZONE\n"; static const std::string post = "END:VCALENDAR\n"; size_t index = config.m_linkedItemsSubset.size(); config.m_linkedItemsSubset.resize(index + 1); ClientTestConfig::LinkedItems_t *items = &config.m_linkedItemsSubset[index]; items->m_name = "Yearly"; /* year varies */ std::string parent = pre + "BEGIN:VEVENT\n" "UID:yearly\n" "DTSTAMP:20110101T120000Z\n" "DTSTART;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "DTEND;TZID=Standard Timezone:" "%1$04d" "0101T121000\n" "SUMMARY:yearly Berlin\n" "RRULE:BYMONTH=1;BYMONTHDAY=1;UNTIL=20140101T110000Z;FREQ=YEARLY\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; std::string child = pre + "BEGIN:VEVENT\n" "UID:yearly\n" "DTSTAMP:20110101T120000Z\n" "DTSTART;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "DTEND;TZID=Standard Timezone:" "%1$04d" "0101T121000\n" "SUMMARY:" "%1$04d" "yearly Berlin\n" "RECURRENCE-ID;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; boost::assign::push_back(config.m_linkedItemsSubset[index]) (StringPrintf(parent.c_str(), 2012)) (StringPrintf(child.c_str(), 2012)) (StringPrintf(child.c_str(), 2013)) (StringPrintf(child.c_str(), 2014)) ; if (server == "exchange") { /* only year of event varies */ std::string single = pre + "BEGIN:VEVENT\n" "SUMMARY:[[activesyncd pseudo event - ignore me]]\n" "DTSTART;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "DTEND;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "RRULE:FREQ=YEARLY;UNTIL=" "%1$04d" "0101T110000Z;BYMONTHDAY=1;BYMONTH=1\n" "UID:yearly\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; /* first year, last year and EXDATE varies */ std::string many = pre + "BEGIN:VEVENT\n" "SUMMARY:[[activesyncd pseudo event - ignore me]]\n" "DTSTART;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "DTEND;TZID=Standard Timezone:" "%1$04d" "0101T120000\n" "RRULE:FREQ=YEARLY;UNTIL=" "%2$04d" "0101T110000Z;BYMONTHDAY=1;BYMONTH=1\n" "%3$s" "UID:yearly\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; items->m_testLinkedItemsSubsetAdditional = boost::bind(additionalYearly, single, many, _1, _2, _3, _4); } addMonthly(index, config.m_linkedItemsSubset, pre, post, "First", 1, 12); addMonthly(index, config.m_linkedItemsSubset, pre, post, "Middle", 1, 6); index++; config.m_linkedItemsSubset.resize(index + 1); items = &config.m_linkedItemsSubset[index]; items->m_name = "Weekly"; items->push_back(pre + "BEGIN:VEVENT\n" "UID:weekly\n" "DTSTAMP:20110101T120000Z\n" "DTSTART;TZID=Standard Timezone:20120101T140000\n" "DTEND;TZID=Standard Timezone:20120101T141000\n" "SUMMARY:weekly Sunday Berlin\n" "RRULE:FREQ=WEEKLY;COUNT=54;BYDAY=SU\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post); for (int i = 0; sundays[i].m_month; i++) { items->push_back(StringPrintf((pre + "BEGIN:VEVENT\n" "UID:weekly\n" "DTSTAMP:20110101T120000Z\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d%2$02d" "T140000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d%2$02d" "T141000\n" "SUMMARY:2012-%1$02d-%2$02d %3$d. weekly Sunday Berlin\n" "RECURRENCE-ID;TZID=Standard Timezone:2012" "%1$02d%2$02d" "T140000\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post).c_str(), sundays[i].m_month, sundays[i].m_day, i + 1)); } if (server == "exchange") { /* date varies and UTC time of UNTIL clause (11 during winter time, 10 during summer) */ std::string single = pre + "BEGIN:VEVENT\n" "SUMMARY:[[activesyncd pseudo event - ignore me]]\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T140000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T140000\n" "RRULE:FREQ=YEARLY;UNTIL=2012" "%1$02d" "%2$02d" "T" "%3$02d" "0000Z;BYMONTHDAY=%2$d;BYMONTH=%1$d\n" "UID:weekly\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; /* first month, last month, UTC time, INTERVAL and sometimes EXDATE varies */ std::string many = pre + "BEGIN:VEVENT\n" "SUMMARY:[[activesyncd pseudo event - ignore me]]\n" "DTSTART;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T140000\n" "DTEND;TZID=Standard Timezone:2012" "%1$02d" "%2$02d" "T140000\n" "RRULE:BYDAY=SU;FREQ=WEEKLY;INTERVAL=%6$d;UNTIL=2012" "%3$02d" "%4$02d" "T" "%5$02d" "0000Z\n" "%7$s" "UID:weekly\n" "TRANSP:TRANSPARENT\n" "END:VEVENT\n" + post; items ->m_testLinkedItemsSubsetAdditional = boost::bind(additionalWeekly, single, many, _1, _2, _3, _4); } } config.m_templateItem = config.m_insertItem; config.m_uniqueProperties = "SUMMARY:UID:LOCATION"; config.m_sizeProperty = "DESCRIPTION"; config.m_testcases = "testcases/eds_event.ics"; } else if (!strcmp(type, "eds_event_noutc") || (!strcmp(type, "eds_event") && noutc)) { config.m_sourceName = "eds_event"; config.m_sourceNameServerTemplate = "calendar"; config.m_uri = "cal2"; // ScheduleWorld config.m_type = "text/x-vcalendar"; config.m_essentialProperties = iCalEssential; config.m_mangleItem = mangleICalendar20; config.m_insertItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:Asia/Shanghai\n" "BEGIN:STANDARD\n" "DTSTART:19670101T000000\n" "TZOFFSETFROM:+0800\n" "TZOFFSETTO:+0800\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VTIMEZONE\n" "TZID:/freeassociation.sourceforge.net/Tzfile/Asia/Shanghai\n" "X-LIC-LOCATION:Asia/Shanghai\n" "BEGIN:STANDARD\n" "TZNAME:CST\n" "DTSTART:19700914T230000\n" "TZOFFSETFROM:+0800\n" "TZOFFSETTO:+0800\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Shanghai:20060406T163000\n" "DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Shanghai:20060406T160000\n" "UID:1234567890!@#$%^&*()<>@dummyVEVENT\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201Z\n" "CREATED:20060409T213201Z\n" "LOCATION:my office\n" "DESCRIPTION:let's talk<>\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "END:VEVENT\n" "END:VCALENDAR\n"; config.m_updateItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTIMEZONE\n" "TZID:Asia/Shanghai\n" "BEGIN:STANDARD\n" "DTSTART:19670101T000000\n" "TZOFFSETFROM:+0800\n" "TZOFFSETTO:+0800\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VTIMEZONE\n" "TZID:/freeassociation.sourceforge.net/Tzfile/Asia/Shanghai\n" "X-LIC-LOCATION:Asia/Shanghai\n" "BEGIN:STANDARD\n" "TZNAME:CST\n" "DTSTART:19700914T230000\n" "TZOFFSETFROM:+0800\n" "TZOFFSETTO:+0800\n" "END:STANDARD\n" "END:VTIMEZONE\n" "BEGIN:VEVENT\n" "SUMMARY:meeting on site\n" "DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Shanghai:20060406T163000\n" "DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Asia/Shanghai:20060406T160000\n" "UID:1234567890!@#$%^&*()<>@dummyVEVENT\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201Z\n" "CREATED:20060409T213201Z\n" "LOCATION:big meeting room\n" "DESCRIPTION:nice to see you\n" "CLASS:PUBLIC\n" "TRANSP:OPAQUE\n" "SEQUENCE:XXX\n" "END:VEVENT\n" "END:VCALENDAR\n"; /* change location and description of insertItem in testMerge(), add alarm */ config.m_mergeItem1 = ""; config.m_mergeItem2 = ""; config.m_templateItem = config.m_insertItem; config.m_uniqueProperties = "SUMMARY:UID:LOCATION"; config.m_sizeProperty = "DESCRIPTION"; config.m_testcases = "testcases/eds_event.ics"; } else if(!strcmp(type, "eds_task")) { config.m_sourceName = "eds_task"; config.m_sourceNameServerTemplate = "todo"; config.m_uri = "task2"; // ScheduleWorld config.m_type = "text/x-vcalendar"; config.m_essentialProperties = iCalEssential; config.m_mangleItem = mangleICalendar20; config.m_insertItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTODO\n" "UID:20060417T173712Z-4360-727-1-2730@dummyVTODO\n" "DTSTAMP:20060417T173712Z\n" "SUMMARY:do me\n" "DESCRIPTION:to be done<>\n" "PRIORITY:0\n" "STATUS:NEEDS-ACTION\n" "CREATED:20060417T173712Z\n" "LAST-MODIFIED:20060417T173712Z\n" "END:VTODO\n" "END:VCALENDAR\n"; config.m_updateItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTODO\n" "UID:20060417T173712Z-4360-727-1-2730@dummyVTODO\n" "DTSTAMP:20060417T173712Z\n" "SUMMARY:do me ASAP\n" "DESCRIPTION:to be done\n" "PRIORITY:1\n" "STATUS:NEEDS-ACTION\n" "CREATED:20060417T173712Z\n" "LAST-MODIFIED:20060417T173712Z\n" "END:VTODO\n" "END:VCALENDAR\n"; /* change summary in insertItem in testMerge() */ config.m_mergeItem1 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTODO\n" "UID:20060417T173712Z-4360-727-1-2730@dummyVTODO\n" "DTSTAMP:20060417T173712Z\n" "SUMMARY:do me please\\, please\n" "DESCRIPTION:to be done\n" "PRIORITY:0\n" "STATUS:NEEDS-ACTION\n" "CREATED:20060417T173712Z\n" "LAST-MODIFIED:20060417T173712Z\n" "END:VTODO\n" "END:VCALENDAR\n"; config.m_mergeItem2 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VTODO\n" "UID:20060417T173712Z-4360-727-1-2730@dummyVTODO\n" "DTSTAMP:20060417T173712Z\n" "SUMMARY:do me\n" "DESCRIPTION:to be done\n" "PRIORITY:7\n" "STATUS:NEEDS-ACTION\n" "CREATED:20060417T173712Z\n" "LAST-MODIFIED:20060417T173712Z\n" "END:VTODO\n" "END:VCALENDAR\n"; config.m_templateItem = config.m_insertItem; config.m_uniqueProperties = "SUMMARY:UID"; config.m_sizeProperty = "DESCRIPTION"; config.m_testcases = "testcases/eds_task.ics"; } else if(!strcmp(type, "eds_memo")) { // The "eds_memo" test uses iCalendar 2.0 VJOURNAL // as format because synccompare doesn't handle // plain text. A backend which wants to use this // test data must support importing/exporting // the test data in that format, see EvolutionMemoSource // for an example. config.m_uri = "note"; // ScheduleWorld config.m_sourceName = "eds_memo"; config.m_sourceNameServerTemplate = "memo"; config.m_type = "memo"; config.m_itemType = "text/calendar"; config.m_essentialProperties = iCalEssential; config.m_mangleItem = mangleICalendar20; // Although iCalendar 2.0 is used in EDS, uniqueness is not // really enforced when syncing. The test data does not have // UID set and thus would not pass testInsertTwice. config.m_uniqueID = false; config.m_insertItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VJOURNAL\n" "SUMMARY:Summary\n" "DESCRIPTION:Summary\\nBody text\n" "END:VJOURNAL\n" "END:VCALENDAR\n"; config.m_updateItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VJOURNAL\n" "SUMMARY:Summary Modified\n" "DESCRIPTION:Summary Modified\\nBody text\n" "END:VJOURNAL\n" "END:VCALENDAR\n"; /* change summary, as in updateItem, and the body in the other merge item */ config.m_mergeItem1 = config.m_updateItem; config.m_mergeItem2 = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VJOURNAL\n" "SUMMARY:Summary\n" "DESCRIPTION:Summary\\nBody modified\n" "END:VJOURNAL\n" "END:VCALENDAR\n"; config.m_templateItem = "BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "BEGIN:VJOURNAL\n" "SUMMARY:Summary\n" "DESCRIPTION:Summary\\nBody text <>\n" "END:VJOURNAL\n" "END:VCALENDAR\n"; config.m_uniqueProperties = "SUMMARY:DESCRIPTION"; config.m_sizeProperty = "DESCRIPTION"; config.m_testcases = "testcases/eds_memo.ics"; }else if (!strcmp (type, "calendar+todo")) { config.m_uri=""; config.m_sourceNameServerTemplate = "calendar+todo"; } } void CheckSyncReport::check(SyncMLStatus status, SyncReport &report) const { if (m_report) { *m_report = report; } stringstream str; str << report; str << "----------|--------CLIENT---------|--------SERVER---------|\n"; str << " | NEW | MOD | DEL | NEW | MOD | DEL |\n"; str << "----------|-----------------------------------------------|\n"; str << StringPrintf("Expected | %3d | %3d | %3d | %3d | %3d | %3d |\n", clientAdded, clientUpdated, clientDeleted, serverAdded, serverUpdated, serverDeleted); str << "Expected sync mode: " << PrettyPrintSyncMode(syncMode) << "\n"; str << "Expected cycles: " << restarts + 1 << "\n"; SE_LOG_INFO(NULL, "sync report:\n%s\n", str.str().c_str()); if (mustSucceed) { // both STATUS_OK and STATUS_HTTP_OK map to the same // string, so check the formatted status first, then // the numerical one CT_ASSERT_EQUAL(string("no error (remote, status 0)"), Status2String(status)); CT_ASSERT_EQUAL(STATUS_OK, status); } BOOST_FOREACH(SyncReport::value_type &entry, report) { const std::string &name = entry.first; const SyncSourceReport &source = entry.second; SE_LOG_DEBUG(NULL, "Checking sync source %s...", name.c_str()); if (mustSucceed) { CLIENT_TEST_EQUAL(name, STATUS_OK, source.getStatus()); } check(name, source); } SE_LOG_DEBUG(NULL, "Done with checking sync report."); } void CheckSyncReport::check(const std::string &name, const SyncSourceReport &source) const { // this code is intentionally duplicated to produce nicer CPPUNIT asserts CLIENT_TEST_EQUAL(name, 0, source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_REJECT)); CLIENT_TEST_EQUAL(name, 0, source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ANY, SyncSourceReport::ITEM_REJECT)); const char* checkSyncModeStr = getenv("CLIENT_TEST_NOCHECK_SYNCMODE"); bool checkSyncMode = true; bool checkSyncStats = getenv ("CLIENT_TEST_NOCHECK_SYNCSTATS") ? false : true; if (checkSyncModeStr && (!strcmp(checkSyncModeStr, "1") || !strcasecmp(checkSyncModeStr, "t"))) { checkSyncMode = false; } if (syncMode != SYNC_NONE && checkSyncMode) { CLIENT_TEST_EQUAL(name, syncMode, source.getFinalSyncMode()); } CLIENT_TEST_EQUAL(name, restarts + 1, source.getRestarts() + 1); if (clientAdded != -1 && checkSyncStats) { CLIENT_TEST_EQUAL(name, clientAdded, source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_ADDED, SyncSourceReport::ITEM_TOTAL)); } if (clientUpdated != -1 && checkSyncStats) { CLIENT_TEST_EQUAL(name, clientUpdated, source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_UPDATED, SyncSourceReport::ITEM_TOTAL)); } if (clientDeleted != -1 && checkSyncStats) { CLIENT_TEST_EQUAL(name, clientDeleted, source.getItemStat(SyncSourceReport::ITEM_LOCAL, SyncSourceReport::ITEM_REMOVED, SyncSourceReport::ITEM_TOTAL)); } if (serverAdded != -1 && checkSyncStats) { CLIENT_TEST_EQUAL(name, serverAdded, source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_ADDED, SyncSourceReport::ITEM_TOTAL)); } if (serverUpdated != -1 && checkSyncStats) { CLIENT_TEST_EQUAL(name, serverUpdated, source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_UPDATED, SyncSourceReport::ITEM_TOTAL)); } if (serverDeleted != -1 && checkSyncStats) { CLIENT_TEST_EQUAL(name, serverDeleted, source.getItemStat(SyncSourceReport::ITEM_REMOTE, SyncSourceReport::ITEM_REMOVED, SyncSourceReport::ITEM_TOTAL)); } } /** @} */ /** @endcond */ #endif // ENABLE_INTEGRATION_TESTS SE_END_CXX syncevolution-1.5/test/client-test-main.cpp0000664000373300001540000003336712424466461022405 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008 Funambol, Inc. * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** @cond API */ /** @addtogroup ClientTest */ /** @{ */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "test.h" #include #ifdef HAVE_VALGRIND_VALGRIND_H # include # include #endif #ifdef HAVE_EXECINFO_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "ClientTest.h" #include #include #include #include #include #ifdef HAVE_SIGNAL_H # include #endif #include #include #include #include #include #include #include SE_BEGIN_CXX using namespace std; void simplifyFilename(string &filename) { size_t pos = 0; while (true) { pos = filename.find(":", pos); if (pos == filename.npos ) { break; } filename.replace(pos, 1, "_"); } pos = 0; while (true) { pos = filename.find("__", pos); if (pos == filename.npos) { break; } filename.erase(pos, 1); } } class ClientOutputter : public CppUnit::CompilerOutputter { public: ClientOutputter(CppUnit::TestResultCollector *result, std::ostream &stream) : CompilerOutputter(result, stream) {} void write() { // Suppress writing useless test summary. We run only one test per process, // so this Outputter would not show the overall results. // CompilerOutputter::write(); } }; class ClientListener : public CppUnit::TestListener { public: ClientListener() : m_failed(false), // Not really necessary, will be initialized once the test starts. // Set it anyway, to keep cppcheck happy. m_testFailed(false) { #ifdef HAVE_SIGNAL_H // install signal handler which turns an alarm signal into a runtime exception // to abort tests which run too long const char *alarm = getenv("CLIENT_TEST_ALARM"); m_alarmSeconds = alarm ? atoi(alarm) : -1; struct sigaction action; memset(&action, 0, sizeof(action)); action.sa_handler = alarmTriggered; action.sa_flags = SA_NOMASK; sigaction(SIGALRM, &action, NULL); #endif } ~ClientListener() { m_logger.reset(); } void addAllowedFailures(string allowedFailures) { boost::split(m_allowedFailures, allowedFailures, boost::is_from_range(',', ',')); } void startTest (CppUnit::Test *test) { m_currentTest = test->getName(); std::cout << m_currentTest << std::flush; if (!getenv("SYNCEVOLUTION_DEBUG")) { string logfile = m_currentTest + ".log"; simplifyFilename(logfile); m_logger.reset(new LogRedirect(LogRedirect::STDERR_AND_STDOUT, logfile.c_str())); m_logger->setLevel(Logger::DEBUG); } SE_LOG_DEBUG(NULL, "*** starting %s ***", m_currentTest.c_str()); m_failures.reset(); m_testFailed = false; #ifdef HAVE_SIGNAL_H if (m_alarmSeconds > 0) { alarm(m_alarmSeconds); } #endif } void addFailure(const CppUnit::TestFailure &failure) { m_failures.addFailure(failure); m_testFailed = true; } void endTest (CppUnit::Test *test) { #ifdef HAVE_SIGNAL_H if (m_alarmSeconds > 0) { alarm(0); } #endif std::string result; std::string failure; if (m_testFailed) { stringstream output; CppUnit::CompilerOutputter formatter(&m_failures, output); formatter.printFailureReport(); failure = output.str(); bool failed = true; BOOST_FOREACH (const std::string &re, m_allowedFailures) { if (pcrecpp::RE(re).FullMatch(m_currentTest)) { result = "*** failure ignored ***"; failed = false; break; } } if (failed) { result = "*** failed ***"; m_failed = true; } } else { result = "okay"; } SE_LOG_DEBUG(NULL, "*** ending %s: %s ***", m_currentTest.c_str(), result.c_str()); if (!failure.empty()) { SE_LOG_ERROR(NULL, "%s", failure.c_str()); } m_logger.reset(); string logfile = m_currentTest + ".log"; simplifyFilename(logfile); const char* compareLog = getenv("CLIENT_TEST_COMPARE_LOG"); if(compareLog && strlen(compareLog)) { int fd = open("____compare.log", O_RDONLY); if (fd >= 0) { int out = open(logfile.c_str(), O_WRONLY|O_APPEND); if (out >= 0) { char buffer[4096]; bool cont = true; ssize_t len; while (cont && (len = read(fd, buffer, sizeof(buffer))) > 0) { ssize_t total = 0; while (cont && total < len) { ssize_t written = write(out, buffer, len); if (written < 0) { perror(("writing " + logfile).c_str()); cont = false; } else { total += written; } } } if (len < 0) { perror("reading ____compare.log"); } close(out); } close(fd); } } std::cout << " " << result << "\n"; if (!failure.empty()) { std::cout << failure << "\n"; } std::cout << std::flush; } bool hasFailed() { return m_failed; } const string &getCurrentTest() const { return m_currentTest; } private: set m_allowedFailures; bool m_failed, m_testFailed; string m_currentTest; #ifdef HAVE_SIGNAL_H int m_alarmSeconds; #endif PushLogger m_logger; CppUnit::TestResultCollector m_failures; static void alarmTriggered(int signal) { CPPUNIT_ASSERT_MESSAGE("test timed out", false); } } syncListener; const string &getCurrentTest() { return syncListener.getCurrentTest(); } static void printTests(CppUnit::Test *test, int indention) { if (!test) { return; } std::string name = test->getName(); printf("%*s%s\n", indention * 3, "", name.c_str()); for (int i = 0; i < test->getChildTestCount(); i++) { printTests(test->getChildTestAt(i), indention+1); } } static void addEnabledTests(CppUnit::Test *test, bool parentEnabled, char **beginEnabled, char **endEnabled, std::list &result) { if (!test) { return; } std::string name = test->getName(); bool enabled = false; if (parentEnabled) { enabled = true; } else { for (char **selected = beginEnabled; selected < endEnabled; selected++) { if (name == *selected) { enabled = true; break; } } } if (dynamic_cast(test)) { if (enabled) { result.push_back(name); } } else { for (int i = 0; i < test->getChildTestCount(); i++) { addEnabledTests(test->getChildTestAt(i), enabled, beginEnabled, endEnabled, result); } } } static void handler(int sig) { void *buffer[100]; int size; fprintf(stderr, "client-test %ld: \ncaught signal %d\n", (long)getpid(), sig); fflush(stderr); #ifdef HAVE_EXECINFO_H size = backtrace(buffer, sizeof(buffer)/sizeof(buffer[0])); backtrace_symbols_fd(buffer, size, 2); #endif #ifdef HAVE_VALGRIND_VALGRIND_H VALGRIND_PRINTF_BACKTRACE("\ncaught signal %d\n", sig); #endif /* system("objdump -l -C -d client-test >&2"); */ struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, NULL); abort(); } extern "C" int main(int argc, char* argv[]) { SyncContext::initMain("client-test"); struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = handler; sigaction(SIGABRT, &act, NULL); sigaction(SIGSEGV, &act, NULL); sigaction(SIGILL, &act, NULL); // Get the top level suite from the registry CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); if (argc >= 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) { printf("usage: %s [test name]+\n\n" "Without arguments all available tests are run.\n" "Otherwise only the tests or group of tests listed are run.\n" "Here is the test hierarchy of this test program:\n", argv[0]); printTests(suite, 1); return 0; } // Adds the test to the list of test to run CppUnit::TextUi::TestRunner runner; runner.addTest( suite ); // Change the default outputter to a compiler error format outputter runner.setOutputter( new ClientOutputter( &runner.result(), std::cout ) ); // track current test and failure state const char *allowedFailures = getenv("CLIENT_TEST_FAILURES"); if (allowedFailures) { syncListener.addAllowedFailures(allowedFailures); } runner.eventManager().addListener(&syncListener); if (getenv("SYNCEVOLUTION_DEBUG")) { Logger::instance().setLevel(Logger::DEBUG); } try { // Find all enabled tests. std::list tests; if (argc <= 1) { // All tests. addEnabledTests(suite, true, NULL, NULL, tests); } else { // Some selected tests. addEnabledTests(suite, false, argv + 1, argv + argc, tests); } bool failed = false; if (tests.size() == 1) { // If one test, run it ourselves. runner.run(tests.front(), false, true, false); failed = syncListener.hasFailed(); } else { // Otherwise act as test runner which invokes itself // recursively for each test. This way we keep running // even if one test crashes hard, valgrind can check // each test individually and uses less memory. BOOST_FOREACH (const std::string &name, tests) { #ifdef USE_SYSTEM if (system(StringPrintf("%s %s", argv[0], name.c_str()).c_str())) { failed = true; } #else // Avoid the intermediate shell process that system() uses and // do better result reporting. pid_t child = fork(); if (child > 0) { while (true) { int status; pid_t completed = waitpid(child, &status, 0); if (completed == -1) { perror("waitpid"); failed = true; } else { if (WIFEXITED(status)) { int retcode = WEXITSTATUS(status); if (retcode != 0) { printf("%s (%ld): failed with return code %d", name.c_str(), (long)child, retcode); failed = true; } } else if (WIFSIGNALED(status)) { printf("%s (%ld): killed by signal %d", name.c_str(), (long)child, WTERMSIG(status)); failed = true; } fflush(stdout); break; } } } else if (child == -1) { perror("fork"); } else { // Use the test name also as name of the process. execlp(argv[0], name.c_str(), name.c_str(), (char *)NULL); perror("execlp"); _exit(1); } #endif } } // Return error code 1 if the one of test failed. if (tests.size() > 1) { printf("%s", failed ? "FAILED" : "OK"); } ClientTest::shutdown(); return failed; } catch (invalid_argument e) { // Test path not resolved std::cout << std::endl << "ERROR: " << e.what() << std::endl; ClientTest::shutdown(); return 1; } } /** @} */ /** @endcond */ SE_END_CXX syncevolution-1.5/test/test.h0000644000373300001540000000500012326412404017616 0ustar00nightlynightly00000000000000/* * Copyright (C) 2008 Funambol, Inc. * Copyright (C) 2008-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ /** * This file is used by source files which depend on CPPUnit and thus * the STL => using it here is allowed. */ #ifndef INCL_TEST_H #define INCL_TEST_H /** @cond DEV */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include // These defines are set in config.h when using the autotools // mechanism and by the project setup on Windows. They control whether // tests inside the libraries source code (ENABLE_UNIT_TESTS) or of // the final library are enabled (ENABLE_INTEGRATION_TESTS). #if defined(ENABLE_UNIT_TESTS) || defined(ENABLE_INTEGRATION_TESTS) // make common macros like CPPUNIT_TEST_ASSERT() available */ # include # include # include SE_BEGIN_CXX // until a better solution is found use the helper function from TestMain.cpp // to get the name of the currently running test; beware, will contain colons extern const std::string &getCurrentTest(); // removes special characters like colons and slashes extern void simplifyFilename(std::string &filename); // redefine CPPUNIT_TEST so that we can filter tests #undef CPPUNIT_TEST #define CPPUNIT_TEST(testMethod) \ CPPUNIT_TEST_SUITE_ADD_TEST( \ ( FilterTest(new CPPUNIT_NS::TestCaller( \ context.getTestNameFor( #testMethod), \ &TestFixtureType::testMethod, \ context.makeFixture() ) ) ) ) /** * replace test with dummy if filtered out via CLIENT_TEST_SKIP */ CppUnit::Test *FilterTest(CppUnit::Test *test); SE_END_CXX #endif // ENABLE_UNIT_TESTS /** @endcond */ #endif // INCL_TEST_H syncevolution-1.5/test/test.cpp0000644000373300001540000000405712326412404020164 0ustar00nightlynightly00000000000000/* * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #if defined(ENABLE_INTEGRATION_TESTS) || defined(ENABLE_UNIT_TESTS) #include "test.h" #include #include #include #include #include #include #include #include SE_BEGIN_CXX class SkipTest : public CppUnit::TestCase { public: SkipTest(const std::string &name) : TestCase(name) {} void run (CppUnit::TestResult *result) { std::cerr << getName() << " *** skipped ***\n"; } }; CppUnit::Test *FilterTest(CppUnit::Test *test) { static std::set filter; static bool filterValid; if (!filterValid) { const char *str = getenv("CLIENT_TEST_SKIP"); if (str) { boost::split(filter, str, boost::is_any_of(",")); } filterValid = true; } std::string name = test->getName(); BOOST_FOREACH (const std::string &re, filter) { if (pcrecpp::RE(re).FullMatch(name)) { delete test; return new SkipTest(name); } } return test; } SE_END_CXX #endif // defined(ENABLE_INTEGRATION_TESTS) || defined(ENABLE_UNIT_TESTS) syncevolution-1.5/test/COPYING0000644000373300001540000000250312326412403017525 0ustar00nightlynightly00000000000000The following files were written exclusively by Patrick Ohly: ClientTest.cpp ClientTest.h client-test.cpp client-test-main.cpp test.h synccompare.pl They were contributed to the Funambol C++ client library under the "docs/Sync4jContribution.pdf" agreement. They were maintained there by Patrick and on February 17th 2009 copied back to SyncEvolution, without any commits by other authors except for the license and copyright changes applied by Funambol. On March 25 2009 they were relicensed by Patrick Ohly, executing the rights granted by the contributor agreement. ------------------------------------------------------------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) version 3. 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser 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 syncevolution-1.5/test/syncevo-http-server.py0000755000373300001540000006563712326412404023040 0ustar00nightlynightly00000000000000#! /usr/bin/python '''Usage: syncevo-http-server.py Runs a SyncML HTTP server under the given base URL.''' # use the same glib main loop in D-Bus and twisted from dbus.mainloop.glib import DBusGMainLoop from twisted.internet import glib2reactor # for non-GUI apps DBusGMainLoop(set_as_default=True) glib2reactor.install() import dbus import gobject import sys import urlparse import optparse import os import atexit import signal import time import subprocess import logging import logging.config import twisted.web import twisted.python.log import twisted.web.error from twisted.web import server, resource, http from twisted.internet import ssl, reactor from OpenSSL import SSL # for output from this script itself logger = logging.getLogger("syncevo-http") # Timeout for D-Bus method calls. Both synchronous and asynchronous # calls have a low (?) default timeout of 60 seconds. We increase that # to something which is essentially infinite, to allow more time for # processing or interactive debugging. timeout=100000 class ChainedOpenSSLContextFactory(ssl.DefaultOpenSSLContextFactory): def __init__(self, privateKeyFileName, certificateChainFileName, sslmethod = SSL.SSLv3_METHOD): """ @param privateKeyFileName: Name of a file containing a private key @param certificateChainFileName: Name of a file containing a certificate chain @param sslmethod: The SSL method to use """ self.privateKeyFileName = privateKeyFileName self.certificateChainFileName = certificateChainFileName self.sslmethod = sslmethod self.cacheContext() def cacheContext(self): ctx = SSL.Context(self.sslmethod) ctx.use_certificate_chain_file(self.certificateChainFileName) ctx.use_privatekey_file(self.privateKeyFileName) self._context = ctx # cached information about previous POST and reply, # in case that we need to resend class OldRequest: sessionid = None data = None reply = None type = None # holds global variables which will be set later: # - bus = D-Bus session bus # - dbusserver = path to syncevo-dbus-server if it needs to be started, None if using system class Context: bus = None dbusserver = None _server = None @staticmethod def checkServer(): if Context._server: retcode = Context._server.poll() if retcode == None: return elif retcode < 0: logger.error("syncevo-dbus-server was terminated by signal %d", -retcode) elif retcode > 0: logger.error("syncevo-dbus-server failed, return code %d", retcode) else: logger.debug("syncevo-dbus-server shut down normally") Context._server = None @staticmethod def getDBusServer(): if not Context.dbusserver: # standard D-Bus activation return dbus.Interface(Context.bus.get_object('org.syncevolution', '/org/syncevolution/Server'), 'org.syncevolution.Server') # check status of previously started server Context.checkServer() # start executable if not Context._server: logger.debug("starting %s", Context.dbusserver) Context._server = subprocess.Popen(Context.dbusserver, stdout=open("/dev/null", "w")) # wait until the daemon shows up on D-Bus (slightly racy) while Context._server.poll() == None: time.sleep(0.5) if 'org.syncevolution' in Context.bus.list_names(): return dbus.Interface(Context.bus.get_object('org.syncevolution', '/org/syncevolution/Server'), 'org.syncevolution.Server') # Startup failed?! Clean up, then give up and return nothing (probably triggers further errors). Context.checkServer() return None class SyncMLSession: sessions = [] def __init__(self): self.sessionid = None self.request = None self.aborted_request = None self.conpath = None self.abort_match = None self.reply_match = None self.connection = None def destruct(self, code, message=""): '''Tell both HTTP client and D-Bus server that we are shutting down, then remove the session''' logger.debug("destructing connection %s with code %s message %s", self.conpath, code, message) if self.request: self.request.setResponseCode(code, message) self.request.finish() self.request = None if self.connection: try: self.connection.Close(False, message, timeout=timeout) except dbus.exceptions.DBusException, ex: if ex.get_dbus_name() == "org.freedesktop.DBus.Error.UnknownMethod": # triggered if connection instance is already gone, hide from user logger.debug("self.connection.Close() failed, connection probably already gone: %s", ex) else: raise self.connection = None if self.abort_match: Context.bus.remove_signal_receiver(self.abort_match) if self.reply_match: Context.bus.remove_signal_receiver(self.reply_match) if self in SyncMLSession.sessions: SyncMLSession.sessions.remove(self) logger.debug("removed SyncML session %s", self) def abort(self, **keywords): '''D-Bus server requests to close connection, so cancel everything''' conpath = keywords['conpath'] logger.debug("connection %s went down, active connection %s", conpath, self.conpath) if conpath == self.conpath: self.destruct(http.INTERNAL_SERVER_ERROR, "lost connection to SyncEvolution") else: logger.debug("ignore shutdown of obsolete connection") def reply(self, data, type, meta, final, session, **keywords): '''sent reply to HTTP client and/or close down normally''' conpath = keywords['conpath'] logger.debug("reply session %s connection %s (active %s) final %s data len %d %s", session, conpath, self.conpath, final, len(data), meta) if conpath != self.conpath: logger.debug("ignore reply via obsolete connection") return self.logMessage("outgoing", self.request, data, type) # When the D-Bus server sends an empty array, Python binding # puts the four chars in 'None' into the data array?! if data and len(data) > 0 and data != 'None': request = self.request self.request = None OldRequest.reply = data OldRequest.type = type if request: request.setHeader('Content-Type', type) request.setHeader('Content-Length', len(data)) request.setResponseCode(http.OK) request.write(data) request.finish() self.sessionid = session else: # syncevo-dbus-server does not need to know about lost connection # to client, because client might still resend logger.debug("could not send reply immediately, buffering it") if final: logger.debug("closing connection for connection %s session %s", self.conpath, session) if self.connection: self.connection.Close(True, "", timeout=timeout) self.connection = None self.destruct(http.GONE, "D-Bus server done") def done(self, error): '''lost connection to HTTP client, either normally or in error''' logger.debug("done with request in session %s, error %s", self.sessionid, error) # Keep request if client closed the connection, the client # might be about to resend. if error != None: self.aborted_request = self.request else: self.aborted_request = None # keep connection to syncevo-dbus-server, client might still # retry the request self.request = None def start(self, request, config, url): '''start a new session based on the incoming message''' data = request.content.read() type = request.getHeader('content-type') self.logMessage("incoming", request, data, type) logger.debug("requesting new session") self.object = Context.getDBusServer() self.request = request deferred = request.notifyFinish() deferred.addCallback(self.done) deferred.addErrback(self.done) self.conpath = self.object.Connect({'description': 'syncevo-server-http.py', 'transport': 'HTTP', 'config': config, 'URL': url}, True, '', timeout=timeout) logger.debug("started new connection %s" % self.conpath) self.connection = dbus.Interface(Context.bus.get_object('org.syncevolution', self.conpath), 'org.syncevolution.Connection') if self.abort_match: Context.bus.remove_signal_receiver(self.abort_match) if self.reply_match: Context.bus.remove_signal_receiver(self.reply_match) self.abort_match = \ Context.bus.add_signal_receiver(self.abort, 'Abort', 'org.syncevolution.Connection', 'org.syncevolution', self.conpath, path_keyword='conpath', utf8_strings=True, byte_arrays=True) self.reply_match = \ Context.bus.add_signal_receiver(self.reply, 'Reply', 'org.syncevolution.Connection', 'org.syncevolution', self.conpath, path_keyword='conpath', utf8_strings=True, byte_arrays=True) # feed new data into SyncEvolution and wait for reply request.content.seek(0, 0) self.connection.Process(data, type, timeout=timeout) SyncMLSession.sessions.append(self) logger.debug("added new SyncML session %s", self) def process(self, request, data): '''process next message by client in running session''' type = request.getHeader('content-type') self.logMessage("incoming", request, data, type) mustprocess = True if self.request: # Message resend?! Ignore old, active request. self.logMessage("new message while still processing one on active TCP connection", self.request, self.request.processingdata, self.request.processingtype) self.request.finish() if self.request.processingdata == data and self.request.processingtype == type: logger.debug("is message resend, no need to process again") mustprocess = False else: logger.debug("different message, send to syncevo-dbus-server") self.request = None if self.aborted_request != None: # Message resend after closing connection and thus aborting the currently # active request? self.logMessage("new message after aborting the previous one", self.aborted_request, self.aborted_request.processingdata, self.aborted_request.processingtype) if self.aborted_request.processingdata == data and self.aborted_request.processingtype == type: logger.debug("is message resend, no need to process again") mustprocess = False else: logger.debug("different message, send to syncevo-dbus-server") self.aborted_request = None deferred = request.notifyFinish() deferred.addCallback(self.done) deferred.addErrback(self.done) self.request = request request.processingdata = data request.processingtype = type if mustprocess: self.connection.Process(data, type, timeout=timeout) def logMessage(self, direction, request, data, type): if 'plain' in type or "+xml" in type: logger.debug("processing %s message of type %s and length %d:\n%s" % (direction, type, len(data), data)) else: logger.debug("processing %s message of type %s and length %d, binary data" % (direction, type, len(data))) class SyncMLPost(resource.Resource): isLeaf = True def __init__(self, url): self.url = url def render_GET(self, request): logger.info("GET %s from %s", self.url, request.getClientIP()) return "SyncEvolution SyncML Server" def render_POST(self, request): config = request.postpath if config: config = config[0] else: config = "" type = request.getHeader('content-type') len = request.getHeader('content-length') sessionid = request.args.get('sessionid') if sessionid: sessionid = sessionid[0] logger.debug("POST from %s config %s type %s session %s args %s length %s", request.getClientIP(), config, type, sessionid, request.args, len) if not sessionid: logger.info("new SyncML session for %s", request.getClientIP()) session = SyncMLSession() session.start(request, config, urlparse.urljoin(self.url.geturl(), request.path)) return server.NOT_DONE_YET else: data = request.content.read() # Detect resent message. We support that for # independently from the session, because it # might already be gone (server sends last reply # in session, closes session, client doesn't # get reply, reposts). if sessionid == OldRequest.sessionid and \ OldRequest.data == data and \ OldRequest.reply: logger.debug("resend reply session %s", sessionid) request.setHeader('Content-Type', OldRequest.type) request.setResponseCode(http.OK) request.write(OldRequest.reply) request.finish() return server.NOT_DONE_YET else: # prepare resending, will be completed in # SyncSession.reply() OldRequest.sessionid = sessionid OldRequest.data = data OldRequest.reply = None for session in SyncMLSession.sessions: if session.sessionid == sessionid: session.process(request, data) return server.NOT_DONE_YET # fallback when session not found logger.error("unknown session %s => 404 error", sessionid) page = twisted.web.error.NoResource(message="The session %s was not found" % sessionid) return page.render(request) class TwistedLogging(object): "same as Twisted's PythonLoggingObserver, except that it uses loglevels debug and error" def __init__(self): self.logger = logging.getLogger("twisted") def emit(self, eventDict): if 'logLevel' in eventDict: level = eventDict['logLevel'] elif eventDict['isError']: if 'failure' in eventDict and \ eventDict['failure'].type == dbus.exceptions.DBusException and \ eventDict['failure'].value.get_dbus_name() == "org.syncevolution.Exception": # special case: errors inside the syncevo-dbus-server are better shown # to users as part of the syncevo-dbus-server output, so treat the # syncevo-http-server side of it as something for debugging. level = logging.DEBUG else: level = logging.ERROR else: level = logging.DEBUG text = twisted.python.log.textFromEventDict(eventDict) if text is None: return self.logger.log(level, text) def start(self): twisted.python.log.startLoggingWithObserver(self.emit, setStdout=False) def stop(self): twisted.python.log.removeObserver(self.emit) evo2python = { "DEBUG": logging.DEBUG, "DEVELOPER": logging.DEBUG, "INFO": logging.INFO, "SHOW": logging.INFO, "ERROR": logging.ERROR, "WARNING": logging.WARNING } def logSyncEvoOutput(path, level, output, component): logging.getLogger(component or 'sync').log(evo2python.get(level, logging.ERROR), "%s: %s", path, output) usage = """usage: %prog [options] http://localhost:/ Runs a HTTP server which listens on all network interfaces on the given port and answers requests for the given path. Configurations for clients must be created manually, see http://syncevolution.org/development/http-server-howto""" def main(): parser = optparse.OptionParser(usage=usage) parser.add_option("-d", "--debug", action="store_true", dest="debug", default=False, help="enables debug messages") parser.add_option("-q", "--quiet", action="store_true", dest="quiet", default=False, help="limits output to real error messages; ignored if --debug is given") parser.add_option("", "--log-config", action="store", type="string", dest="logConfig", default=None, help="configure logging via Python logging config file; --debug and --quiet override the log level in the root logger") parser.add_option("", "--server-certificate", action="store", type="string", dest="cert", default=None, help="certificate file used by the server to identify itself (required for https)") parser.add_option("", "--server-key", action="store", type="string", dest="key", default=None, help="key file used by the server to identify itself (optional, certificate file is used as fallback, which then must contain key and certificate)") parser.add_option("", "--start-dbus-session", action="store_true", dest="startDBus", default=False, help="""creates a new D-Bus session for communication with syncevo-dbus-server and (inside that server) with other D-Bus services like Evolution Data Server, removes it when shutting down; should only be used if it is guaranteed that the current user will not have another session running, because these services can get confused when started multiple times; without this option, syncevo-http-server a) uses the session specified in the environment or b) looks for a session of the current user (depends on ConsoleKit and might not always work)""") parser.add_option("", "--start-syncevolution", action="store_true", dest="startSyncEvo", default=False, help="""sets up the right environment for syncevo-dbus-server and (re)starts it explicitly, instead of depending on D-Bus auto-activation; to be used when SyncEvolution is not installed at the location it was compiled for""") parser.add_option("", "--syncevolution-path", action="store", type="string", dest="path", default=None, help="""sets the installation path (the directory which contains 'bin', 'libexec', etc.) to be used in --start-syncevolution, default is the location where syncevo-http-server itself is installed""") (options, args) = parser.parse_args() # determine level chosen via command line level = None if options.debug: level = logging.DEBUG elif options.quiet: level = logging.ERROR else: level = None # create logging infrastructure if options.logConfig: logging.config.fileConfig(options.logConfig) # only override level if explicitly set if level != None: logging.getLogger().setLevel(level) else: root = logging.getLogger() ch = logging.StreamHandler() formatter = logging.Formatter("[%(levelname)s" + (level == logging.DEBUG and " %(asctime)s" or "") + "] %(name)s: %(message)s") ch.setFormatter(formatter) root.addHandler(ch) if level == None: level = logging.INFO root.setLevel(level) # redirect output from Twisted observer = TwistedLogging() observer.start() # Set up D-Bus. First check for an existing session in env. # # Doing the check via ConsoleKit here would be nice, but that # led to the following problem with --start-dbus-session: # - dbus module is initialized in dbus.SystemBus() # - DISPLAY remains unset, dbus-launch creates new DBUS_SESSION_BUS_ADDRESS # - dbus.SessionBus() fails with "Autolaunch error: X11 initialization failed." # Presumably the session bus address is not checked again after setting it. # Not touching D-Bus before dbus-launch avoids that problem. havedbus = os.environ.get("DBUS_SESSION_BUS_ADDRESS") or os.environ.get("DISPLAY") if options.startDBus: if havedbus: logger.info("%s session found (DISPLAY=%s DBUS_SESSION_BUS_ADDRESS=%s), but starting a new D-Bus session as requested", os.environ.get("DBUS_SESSION_BUS_ADDRESS") and "D-Bus" or "potential", os.environ.get("DISPLAY", ""), os.environ.get("DBUS_SESSION_BUS_ADDRESS", "")) p = subprocess.Popen("dbus-launch", stdout=subprocess.PIPE) output = p.communicate()[0] if p.wait(): logger.error("dbus-launch failed") exit(1) for line in output.split(): logger.debug("dbus-launch: %s", line) var, value = line.split("=", 1) if var == "DBUS_SESSION_BUS_PID": # kill that process when we quit atexit.register(os.kill, int(value), signal.SIGTERM) os.environ[var] = value else: if not havedbus: # code inspired by Ross Burton's http://burtonini.com/blog/computers/offlineimap-2008-11-04-20-00 logger.debug("looking for X11 session via ConsoleKit") bus = dbus.SystemBus() try: manager_obj = bus.get_object('org.freedesktop.ConsoleKit', '/org/freedesktop/ConsoleKit/Manager') manager = dbus.Interface(manager_obj, 'org.freedesktop.ConsoleKit.Manager') for ssid in manager.GetSessionsForUnixUser(os.getuid()): obj = bus.get_object('org.freedesktop.ConsoleKit', ssid) session = dbus.Interface(obj, 'org.freedesktop.ConsoleKit.Session') dpy = session.GetX11Display() logger.debug("ConsoleKit session %s has DISPLAY=%s", session, dpy) if dpy: if havedbus: # already found a session earlier, now what?! logger.error("multiple X11 sessions found for current user, please set DISPLAY to the one to be used for syncing") exit(1) else: # use this X11 session to find D-Bus session bus os.environ["DISPLAY"] = dpy havedbus = True except dbus.exceptions.DBusException, ex: if ex.get_dbus_name() == "org.freedesktop.DBus.Error.ServiceUnknown": logger.debug("org.freedesktop.ConsoleKit service not available") else: raise if not havedbus: logger.error("no D-Bus session, use --start-dbus-session") exit(1) # Now at least one of DISPLAY or DBUS_SESSION_BUS_ADDRESS should be set. # DISPLAY is sufficient for the D-Bus autolaunch mechanism in libdbus (which # reuses a session bus if one exists or creates a new one), # whereas DBUS_SESSION_BUS_ADDRESS explicitly selects an existing bus. logger.debug("connecting to D-Bus session with DISPLAY=%s DBUS_SESSION_BUS_ADDRESS=%s", os.environ.get("DISPLAY", ""), os.environ.get("DBUS_SESSION_BUS_ADDRESS", "")) Context.bus = dbus.SessionBus() # catch output from syncevo-dbus-server Context.bus.add_signal_receiver(logSyncEvoOutput, "LogOutput", "org.syncevolution.Server", "org.syncevolution", None) # start syncevo-dbus-server? if options.startSyncEvo: path = options.path if not path: path = os.path.dirname(os.path.dirname(sys.argv[0])) Context.dbusserver = os.path.join(path, "libexec/syncevo-dbus-server") logger.info("using SyncEvolution installation in %s", path) os.environ["SYNCEVOLUTION_BACKEND_DIR"] = os.path.join(path, "lib/syncevolution/backends") os.environ["LD_LIBRARY_PATH"] = ":".join((os.path.join(path, "lib/"), os.path.join(path, "lib/syncevolution"), os.environ.get("LD_LIBRARY_PATH", ""))) os.environ["PATH"] = ":".join((os.path.join(path, "libexec/"), os.path.join(path, "bin"), os.environ.get("PATH", ""))) os.environ["SYNCEVOLUTION_DATA_DIR"] = os.path.join(path, "share/syncevolution") os.environ["SYNCEVOLUTION_XML_CONFIG_DIR"] = os.path.join(path, "share/syncevolution/xml") os.environ["SYNCEVOLUTION_TEMPLATE_DIR"] = os.path.join(path, "share/syncevolution/templates") # try whether it can be started Context.getDBusServer() if len(args) != 1: logger.error("need exactly on URL as command line parameter") exit(1) url = urlparse.urlparse(args[0]) root = resource.Resource() root.putChild(url.path[1:], SyncMLPost(url)) site = server.Site(root) if url.scheme == "https": if not options.cert: logger.error("need server certificate for https") exit(1) port = reactor.listenSSL(url.port, site, ChainedOpenSSLContextFactory(options.key or options.cert, options.cert)) else: port = reactor.listenTCP(url.port, site) logger.info("listening on port %d", port.getHost().port) reactor.run() if __name__ == '__main__': main() syncevolution-1.5/test/syncevo-phone-config.py0000755000373300001540000007647212326412404023130 0ustar00nightlynightly00000000000000#!/usr/bin/python # # Copyright (C) 2010 Intel Corporation # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA ''' Automatically trying different configurations for a phone to sync with SyncEvolution. ''' import sys, optparse, os, time, tempfile import shutil import ConfigParser import glob import os.path # source names as commonly used in SyncEvolution allSources = ['addressbook', 'calendar', 'todo', 'memo', 'calendar+todo'] # valid SyncMLVersion values allVersions = ['1.2', '1.1', '1.0'] ########################### cmdline options ########################################## parser = optparse.OptionParser() parser.add_option("-b", "--bt-address", action = "store", type = "string", dest = "btaddr", help = "The Bluetooth mac address for the testing phone", default = "") parser.add_option ("-p", "--protocol-version", action = "store", type = "string", dest="version", help = "The SyncML protocal version for testing, can be one of " + "|".join(allVersions) + ", by default it will try all versions one by one", default = "") parser.add_option ("-s", "--source", action = "store", type = "string", dest= "source", help = "The local database for testing, can be one of " + "|".join(allSources), default = "") parser.add_option ("-u", "--uri", action = "store", type = "string", dest = "uri", help = "The URI for testing the selected source, invalid when no specific source is selected via --source", default = "") parser.add_option ("-t", "--type", action = "store", type = "string", dest = "type", help = "The content type for testing the selected source, invalid when no specific source is selected via --source" ,default = "") parser.add_option ("-i", "--identifier", action = "store", type="string", dest = "identifier", help = "The identifier used when contacting the phone, can be arbitray string. By default it will try 'PC Suite','Nokia PC Suite' and empty string", default = "") parser.add_option ("", "--without-ctcap", action = "store_true", default =False, dest = "ctcap", help = "Testing without sending CTCap information") parser.add_option ("-v", "--verbose", action = "count", dest = "verbose", help = "Increase amount of output") parser.add_option ("-a", "--advanced", action = "store_true", default = False, dest = "advanced", help = "More extensive test with sending/receving data, WARNING: will destroy your data on the tested phone") parser.add_option("-c", "--create-config", action ="store", type = "string", dest = "create", help = "If set, a configuration file with the name will be created based on the testing result", default ="") (options, args) = parser.parse_args() ####################semantic check for cmdline options ####################################### if not options.btaddr: parser.error ("Please provide the Bluetooth MAC address for the phone with -b/--bt-address.") if options.version and options.version not in allVersions: parser.error("Option -p/--protocol-version can only be one of " + "|".join(allVersions) + ".") if options.source and options.source not in allSources: parser.error("Option -s/--source can only be one of " + "|".join(allSources) + ".") if options.uri and not options.source: parser.error ("Option -u/--uri only works in combination with -s/--source.") if options.type and not options.source: parser.error ("Option -t/--type only works in combination with -s/--source.") #######################some global parameters ###################### syncevoCmd = 'syncevolution' configName = 'test-phone' # inside temporary testConfig dir # real paths set in main() inside temporary directory testFolder = '/dev/null/data' testResult = '/dev/null/cache' testConfig = '/dev/null/config' #################### Configuration Parameter ####################### class ConfigurationParameter: def __init__ (self, version, source, uri, type, ctcap, identifier): self.version = version self.source = source self.uri = uri self.type = type self.ctcap = ctcap self.identifier = identifier def printMe(self): print "Test parameter: " print "With CTCap: %s" %(self.ctcap,) print "Identifier: %s" %(self.identifier,) print "SyncML version: %s" %(self.version,) print "Sync Source: %s" %(self.source,) print "URI: %s" %(self.uri,) print "Content Type: %s" %(self.type,) def __str__(self): res = [] if self.ctcap: res.append("with CTCap") else: res.append("without CTCap") res.append(self.identifier) res.append(self.version) res.append("%s = %s + %s" % (self.source, self.uri, self.type)) return ", ".join(res) def equalWith(self, config): return (config and \ self.ctcap == config.ctcap and \ self.identifier == config.identifier and \ self.version == config.version and \ self.uri == config.uri and \ self.type == config.type) ###################### utility functions #################### def clearLocalSyncData(sources): for source in sources: dirname = "%s/%s" % (testFolder, source) rm_r(dirname) os.makedirs(dirname) def createFile(filename, content): f = open(filename, "w") f.write(content) def insertLocalSyncData(sources, type): for source in sources: testcase, keys = getTestCase (source, type) createFile(os.path.join(testFolder, source, "0"), testcase) def getTestCase(source, type): """Returns a pair of test item string plus a list of sub strings which are expected to come back from the phone. Type comparison is intentionally a bit vague, so that it doesn't matter whether the type contains a version or a ! force flag.""" if source == 'addressbook' and type.startswith('text/vcard'): return ("BEGIN:VCARD\n" "VERSION:3.0\n" "TITLE:tester\n" "FN:John Doe\n" "N:Doe;John;;;\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "X-EVOLUTION-FILE-AS:Doe\\, John\n" "X-MOZILLA-HTML:FALSE\n" "NOTE:test-phone\n" "END:VCARD\n", ["VCARD", "TITLE:tester", "Doe", "John"]) if source == 'addressbook' and type.startswith('text/x-vcard'): return ("BEGIN:VCARD\n" "VERSION:2.1\n" "TITLE:tester\n" "FN:John Doe\n" "N:Doe;John;;;\n" "TEL;TYPE=WORK;TYPE=VOICE:business 1\n" "X-MOZILLA-HTML:FALSE\n" "NOTE:REVISION\n" "END:VCARD\n", ["VCARD", "TITLE:tester", "Doe", "John"]) if source == 'calendar' and type.startswith('text/calendar'): return ("BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "METHOD:PUBLISH\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "DTSTAMP:20060406T211449Z\n" "LAST-MODIFIED:20060409T213201\n" "CREATED:20060409T213201\n" "LOCATION:my office\n" "DESCRIPTION:let's talkREVISION\n" "END:VEVENT\n" "END:VCALENDAR\n", ["VCALENDAR", "VEVENT", "phone meeting", "my office"]) if source == 'calendar' and type.startswith('text/x-vcalendar'): return ("BEGIN:VCALENDAR\n" "VERSION:1.0\n" "BEGIN:VEVENT\n" "SUMMARY:phone meeting\n" "DTEND:20060406T163000Z\n" "DTSTART:20060406T160000Z\n" "DTSTAMP:20060406T211449Z\n" "LOCATION:my office\n" "DESCRIPTION:let's talkREVISION\n" "END:VEVENT\n" "END:VCALENDAR\n", ["VCALENDAR", "VEVENT", "phone meeting", "my office"]) if source == 'todo' and type.startswith('text/calendar'): return ("BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:2.0\n" "METHOD:PUBLISH\n" "BEGIN:VTODO\n" "DTSTAMP:20060417T173712Z\n" "SUMMARY:do me\n" "DESCRIPTION:to be doneREVISION\n" "CREATED:20060417T173712\n" "LAST-MODIFIED:20060417T173712\n" "END:VTODO\n" "END:VCALENDAR\n", ["VCALENDAR", "VTODO", "do me"]) if source == 'todo' and type.startswith('text/x-vcalendar'): return ("BEGIN:VCALENDAR\n" "PRODID:-//Ximian//NONSGML Evolution Calendar//EN\n" "VERSION:1.0\n" "METHOD:PUBLISH\n" "BEGIN:VTODO\n" "DTSTAMP:20060417T173712Z\n" "SUMMARY:do me\n" "DESCRIPTION:to be doneREVISION\n" "CREATED:20060417T173712\n" "LAST-MODIFIED:20060417T173712\n" "END:VTODO\n" "END:VCALENDAR\n", ["VCALENDAR", "VTODO", "do me"]) if source == 'memo': return ("Summary Line\n" "BODY TEXT\n", ["Summary Line"]) raise "no test data defined for source %s and type %s" % (source, type) # Compare the received data with the sent data, we only match selected keywords in received # data for a basic sanity test def compareSyncData(sources, type): for source in sources: testcase, keys = getTestCase (source, type) received = '' recFile = "%s/%s/0" %(testFolder, source) try: rf = open (recFile) received = rf.read() except: return False if (options.verbose > 1): print "comparing received file:" print received print "with built in keywords in test case:" print keys for key in keys: if (received.find(key) <0): return False return True # wrapper of running a shell command def runCommand(cmd, exception = True): """Log and run the given command, throwing an exception if it fails.""" if (options.verbose > 1): print "%s: %s" % (os.getcwd(), cmd) else: cmd += ' >/dev/null' sys.stdout.flush() result = os.system(cmd) if result != 0 and exception: raise Exception("%s: failed (return code %d)" % (cmd, result>>8)) def runSync(sync): rm_r("%s/syncevolution" % testResult) status = True interrupt = False try: runCommand (sync) except: status = False pass # session name is unknown, but we know there is only one, so let # glob find it for us resultFile = glob.glob("%s/syncevolution/*/status.ini" % testResult)[0] # inject [main] at start of file for ConfigParser, # because SyncEvolution doesn't write sections class IniFile: def __init__(self, filename): self.fp = open(filename, "r") self.read = False def readline(self): if not self.read: self.read = True return "[main]" else: return self.fp.readline() ini = ConfigParser.ConfigParser({"status": "0", "error": ""}) ini.readfp(IniFile(resultFile)) statuscode = ini.get("main", "status") if statuscode == "20015": # aborted by user, stop testing status = False interrupt = True if statuscode == "22002": # syncevolution failed (for example, kill -9), warn and abort print "\nSyncEvolution binary died prematurely, aborting testing." status = False interrupt = True return (status, interrupt) # recursive directory removal, without throwing an error if directory does not exist def rm_r(dirname): if os.path.isdir(dirname): shutil.rmtree(dirname) def hash2ini(hash): """convert key/value pairs into .ini file without sections""" res = [] for key, value in hash.items(): res.append("%s = %s" % (key, value)) return "\n".join(res) def strip_version(type): """turn type[:version][!] into type[!]""" res = type.split(':')[0] if type.endswith('!'): res += '!' return res ##############################TestConfiguration################################## class TestingConfiguration(): def __init__(self, versions, sources, uris, types, ctcaps, identifiers, btaddr): if (versions): self.versions = versions else: self.versions = allVersions # If "calendar+todo" is tested, then "calendar" and "todo" # must be tested first. If they lead to the same result, # then they have to be combined for "calendar+todo". # "calendar+todo" itself is never tested directly. if sources: self.sources = sources else: self.sources = allSources if "calendar+todo" in self.sources: self.sources.remove("calendar+todo") if not "calendar" in self.sources: self.sources.append("calendar") if not "todo" in self.sources: self.sources.append("todo") if (uris): self.uris = uris else: self.uris = {} self.uris['addressbook'] = ['Contact', 'contact', 'Contacts', 'contacts', 'Addressbook', 'addressbook'] self.uris['calendar'] = ['Calendar', 'calendar', 'Agenda','agenda'] self.uris['todo'] = self.uris['calendar'] + ['Task', 'task', 'Tasks', 'tasks', 'Todo','todo'] self.uris['memo'] = ['Memo', 'memo', 'Notes', 'notes', 'Note', 'note'] if (types): self.types = types else: # - must include version numbers because file backend needs them # - current types like 'text/vcard:3.0' are "downgraded" to the # legacy types when sending a SAN, so they are basically identical; # to really send a SAN with these current types, we have to "force" them self.types = {} self.types['addressbook'] = ['text/vcard:3.0', 'text/x-vcard:2.1', 'text/vcard:3.0!'] self.types['calendar'] = self.types['todo'] = ['text/calendar:2.0', 'text/x-vcalendar:1.0', 'text/calendar:2.0!'] self.types['memo'] = ['text/plain:1.0'] if (ctcaps): self.ctcaps = ctcaps else: self.ctcaps = [True, False] if (identifiers): self.identifiers = identifiers else: self.identifiers = ['PC Suite','','Nokia PC Suite'] self.btaddr = btaddr #before each configuration is really tested, prepare is called. #returns True if we decide current configuration need not be tested def prepare (self, allconfigs, curconfig): # Decide whether this config should be skipped (because we already found # a working configuration # Test is skipped either because # 1) we already found a working configuration for the data source; # 2) based on the working configuration for source A, we can reasonably # guess a working configuration for source B must have the same # 'identifier', 'ctcap' and 'SyncMLVersion' setting. # 3) we already found a working configuration for combined calendar and # task, thus seperate testing for calendar and task is not needed. skip = False for source, config in self.wConfigs.items(): if (config): if ( (config.source == self.source) or (config.identifier != self.identifier ) or (config.ctcap != self.ctcap) or (config.version != self.version)): skip = True if (skip): if (options.verbose > 1): print "Test %d/%d skipped because already found a working configuration" % (curconfig, allconfigs) elif options.verbose > 0: print "Test %d/%d skipped" %(curconfig, allconfigs), \ ConfigurationParameter(self.version, self.source, self.uri, self.type, self.ctcap, self.identifier) else: print "Test %d/%d skipped" %(curconfig, allconfigs) else: print ("Start %d/%d test" % (curconfig, allconfigs)), if (options.verbose > 0): config = ConfigurationParameter(self.version, self.source, self.uri, self.type, self.ctcap, self.identifier) if (options.verbose > 1): print config.printMe() else: print config else: print return skip #run the real sync test with current configuration parameter #if advanced option is set and the basic test succeed, it will contintue with #the advanced test def testWithCurrentConfiguration(self): """ Prepare the configuration and run a sync session, Returns true if the test was successful, otherwise false""" rm_r(testConfig) cmdPrefix = "XDG_CACHE_HOME=%s XDG_CONFIG_HOME=%s " %(testResult, testConfig) syncevoTest = "%s %s --daemon=no" % (cmdPrefix, syncevoCmd) runCommand ("%s -c --template 'SyncEvolution Client' --sync-property peerIsClient=1 %s" % (syncevoTest, configName)) # set the local database filesource = testFolder+'/'+self.source configCmd = "%s --configure --source-property evolutionsource='file:///%s' %s %s" %(syncevoTest, filesource, configName, self.source) runCommand (configCmd) configCmd = "%s --configure --sync-property logLevel=5 --sync-property SyncURL=obex-bt://%s --sync-property SyncMLVersion=%s %s" % (syncevoTest, self.btaddr,self.version, configName) runCommand (configCmd) if (self.identifier): configCmd = "%s --configure --sync-property remoteIdentifier='%s' %s" %(syncevoTest, self.identifier, configName) runCommand (configCmd) configCmd = "%s --configure --source-property 'type=file:%s' --source-property uri=%s %s %s" %(syncevoTest, self.type, self.uri, configName, self.source) runCommand (configCmd) """ start the sync session """ if (not self.ctcap): cmdPrefix += "SYNCEVOLUTION_NOCTCAP=t " cmdPrefix += "SYNCEVOLUTION_NO_SYNC_SIGNALS=1" syncCmd = " ".join((cmdPrefix, syncevoCmd, "--daemon=no", configName, self.source)) (status,interrupt) = runSync(syncCmd) if (options.advanced and status and not interrupt): (status,interrupt)= self.advancedTestWithCurrentConfiguration() return (status, interrupt) '''Basic test for sending/receiving data It will work as: Clear local data and data on the phone via 'slow-sync' and 'two-way' sync Send local test case to the phone via 'two-way' Clear local data and get the data from the phone via 'slow-sync' compare the sent data with the received data to decide whether the test was successful Note that this depends on the phone support 'slow-sync' and 'two-way' sync and implements the semantics correctly as specified in the spec. Otherwise the results will be undefined. ''' def advancedTestWithCurrentConfiguration (self): """ Sending/receving real data for basic sanity test """ sources = [] sources.append(self.source) #step 1: clean the data both locally and remotely using a 'slow-sync' and 'two-way' clearLocalSyncData(sources) cmdPrefix="XDG_CACHE_HOME=%s XDG_CONFIG_HOME=%s " % (testResult, testConfig) if (not self.ctcap): cmdPrefix += "SYNCEVOLUTION_NOCTCAP=t " syncevoTest = "%s %s --daemon=no" % (cmdPrefix, syncevoCmd) syncCmd = "%s --sync slow %s %s" % (syncevoTest, configName, self.source) status,interrupt = runSync(syncCmd) if (not status or interrupt): return (status, interrupt) clearLocalSyncData(sources) syncCmd = "%s --sync two-way %s %s" % (syncevoTest, configName, self.source) status,interrupt = runSync(syncCmd) if (not status or interrupt): return (status, interrupt) #step 2: insert testcase to local data and sync with 'two-way' insertLocalSyncData(sources, self.type) syncCmd = "%s --sync two-way %s %s" % (syncevoTest, configName, self.source) status,interrupt = runSync(syncCmd) if (not status or interrupt): return (status, interrupt) #step 3: delete local data and sync with 'slow-sync' clearLocalSyncData(sources) syncCmd = "%s --sync slow %s %s" % (syncevoTest, configName, self.source) status,interrupt = runSync(syncCmd) if (not status or interrupt): return (status, interrupt) #step 4: compare the received data with test case status = compareSyncData(sources, self.type) return (status, interrupt) ''' The test driver iterating all possible test combinations and try them one by one ''' def run(self): #first round of iterating, calculating all possible configuration numbers allconfigs = 0 for self.ctcap in self.ctcaps: for self.identifier in self.identifiers: for self.version in self.versions: for self.source in self.sources: for self.uri in self.uris[self.source]: for self.type in self.types[self.source]: allconfigs +=1 print "Starting test for %d configurations..." %(allconfigs,) curconfig = 0 self.wConfigs = {} for source in self.sources: self.wConfigs[source] = None #second round of iterating, test for each configuration interrupt = False for self.source in self.sources: if(interrupt): break for self.ctcap in self.ctcaps: if(interrupt): break for self.version in self.versions: if(interrupt): break for self.identifier in self.identifiers: if(interrupt): break for self.uri in self.uris[self.source]: if(interrupt): break for self.type in self.types[self.source]: curconfig +=1 skip = self.prepare (allconfigs, curconfig) if (not skip): (status, interrupt) = self.testWithCurrentConfiguration () if (status and not interrupt): self.wConfigs[self.source] = ConfigurationParameter (self.version, self.source, self.uri, self.type, self.ctcap, self.identifier) print "Found a working configuration for %s" % (self.source,) if (options.verbose > 0): self.wConfigs[self.source].printMe() if (interrupt): break; if(interrupt): print "Test Interrupted" return 1 print "Test Ended" #Test finished, print summary and generating configurations print "****************SUMMARY****************" found = False for source,config in self.wConfigs.items(): if (config): found = True print "------------------------------------------" print "Configuration parameter for %s:" % (source,) config.printMe() if (not found): print "No working configuration found" else: have_combined = \ self.wConfigs.has_key('calendar') and \ self.wConfigs.has_key('todo') and \ self.wConfigs['calendar'] and \ self.wConfigs['todo'] and \ self.wConfigs['calendar'].uri == self.wConfigs['todo'].uri if (options.create): #first remove the previous configuration if there is a configuration with the same name create = options.create cmd = "%s --remove '%s'" %(syncevoCmd, create) try: runCommand (cmd) except: pass cmd = "%s -c --template 'SyncEvolution Client' --sync-property peerIsClient=1 %s" %(syncevoCmd, create) runCommand (cmd) #disable all sources by default for source in allSources: if source == 'calendar+todo': continue cmd = "%s -c --source-property sync='disabled' %s %s" %(syncevoCmd, create, source) runCommand(cmd) syncCreated = False for source,config in self.wConfigs.items(): if (config): if (not syncCreated): #set the sync parameter cmd = "%s --configure --sync-property syncURL='obex-bt://%s' --sync-property remoteIdentifier='%s' --sync-property SyncMLVersion='%s' '%s'" %(syncevoCmd, self.btaddr, config.identifier, config.version, create) syncCreated = True runCommand (cmd) #set each source parameter ltype = strip_version(config.type) cmd = "%s --configure --source-property sync='two-way' --source-property URI='%s' --source-property type='%s:%s' '%s' '%s'" %(syncevoCmd, config.uri, source, ltype, create, config.source) runCommand(cmd) if have_combined: ltype = strip_version(self.wConfigs['calendar'].type) uri = self.wConfigs['calendar'].uri cmd = "%s --configure --source-property evolutionsource='calendar,todo' --source-property sync='two-way' --source-property URI='%s' --source-property type='virtual:%s' '%s' calendar+todo" %(syncevoCmd, uri, ltype, create) runCommand(cmd) for source in ('calendar', 'todo'): cmd = "%s --configure --source-property sync='none' --source-property URI='%s' '%s' %s" %(syncevoCmd, uri, create, source) runCommand(cmd) if (options.advanced): print "" print "We have conducted basic test by sending and receiving" print "data to the phone. You can help the SyncEvolution project" print "and other users by submitting the following configuration" print "template at http://syncevolution.org/wiki/phone-compatibility-template" print "" configini = { "peerIsClient": "1" } sourceConfigInis = {} for source,config in self.wConfigs.items(): if(config): sourceini = {} if (config.identifier): configini["remoteIdentifier"] = config.identifier if (config.version != '1.2'): configini["SyncMLVersion"] = config.version sourceini["sync"] = "two-way" sourceini["uri"] = config.uri sourceini["backend"] = source sourceini["syncFormat"] = strip_version(config.type) sourceConfigInis[source] = sourceini # create 'calendar+todo' entry, disable separate 'calendar' and 'todo'? if have_combined: sourceini = {} sourceini["sync"] = "two-way" sourceini["database"] = "calendar,todo" sourceini["uri"] = self.wConfigs['calendar'].uri sourceini["backend"] = "virtual" sourceini["syncFormat"] = strip_version(self.wConfigs['calendar'].type) sourceConfigInis['calendar+todo'] = sourceini # disable the sub datasources for source in ('calendar', 'todo'): sourceConfigInis[source]["sync"] = "none" sourceConfigInis[source].pop("uri") # print template to stdout sep = "--------------------> snip <--------------------" print sep print "=== template.ini ===" print "fingerprint = " print "=== config.ini ===" print hash2ini(configini) print "consumerReady = 1" for source, configini in sourceConfigInis.items(): print "=== sources/%s/config.ini ===" % source print hash2ini(configini) print sep else: print "" print "We just conducted minimum test by syncing with the phone" print "without checking received data. For more reliable result," print "use the --advanced option, but beware that it will overwrite" print "contacts, events, tasks and memos on the phone." if (options.create): print "" print "Created configuration: %s" %(options.create) print "You may start syncing with: syncevolution %s" %(options.create) def main(): versions = [] sources = [] ctcaps = [] identifiers = [] uris = {} types = {} if (options.version): versions.append (options.version) if (options.source): sources.append (options.source) if (options.uri): uris[sources[0]] = [] uris[sources[0]].append(options.uri) if (options.type): types[sources[0]] = [] types[sources[0]].append(options.type) if (options.ctcap): ctcaps.append (options.ctcap) if (options.identifier): identifiers.append (options.identifier) config = TestingConfiguration (versions, sources, uris, types, ctcaps, identifiers, options.btaddr) tmpdir = tempfile.mkdtemp(prefix="syncevo-phone-config") global testFolder global testResult global testConfig testFolder = tmpdir+'/data' testResult = tmpdir+'/cache' testConfig = tmpdir+'/config' print "Running test with test data inside %s and test results inside %s" %(testFolder, testResult) config.run() if __name__ == "__main__": main() syncevolution-1.5/test/synccompare.pl0000664000373300001540000012677512424466461021412 0ustar00nightlynightly00000000000000#! /usr/bin/env perl # # Copyright (C) 2008 Funambol, Inc. # Copyright (C) 2008-2009 Patrick Ohly # Copyright (C) 2009 Intel Corporation # # Usage: # # Either normalizes a file or compares two of them in a side-by-side # diff. # # Checks environment variables: # # CLIENT_TEST_SERVER=funambol|scheduleworld|egroupware|synthesis # Enables code which simplifies the text files just like # certain well-known servers do. This is useful for testing # to ignore the data loss introduced by these servers or (for # users) to simulate the effect of these servers on their data. # # CLIENT_TEST_CLIENT=evolution|addressbook (Mac OS X/iPhone) # Same as for servers this replicates the effect of storing # data in the clients. # # CLIENT_TEST_LEFT_NAME="before sync" # CLIENT_TEST_RIGHT_NAME="after sync" # CLIENT_TEST_REMOVED="removed during sync" # CLIENT_TEST_ADDED="added during sync" # Setting these variables changes the default legend # print above the left and right file during a # comparison. # # CLIENT_TEST_COMPARISON_FAILED=1 # Overrides the default error code when changes are found. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) version 3. # # 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA use strict; # Various crashes have been encountered in the Perl interpreter # executable when enabling UTF-8. It is only needed for nicer # side-by-side comparison of changes (correct column width), # so not much functionality is lost by disabling this. # use encoding 'utf8'; # Instead enable writing the result as UTF-8. Input # files are read as UTF-8 via PerlIO parameters in open(). binmode(STDOUT, ":utf8"); use Algorithm::Diff; use MIME::Base64; use Digest::MD5 qw(md5 md5_hex md5_base64); # ignore differences caused by specific servers or local backends? my $server = $ENV{CLIENT_TEST_SERVER}; my $client = $ENV{CLIENT_TEST_CLIENT} || "evolution"; my $scheduleworld = $server =~ /scheduleworld/; my $synthesis = $server =~ /synthesis/; my $zyb = $server =~ /zyb/; my $mobical = $server =~ /mobical/; my $memotoo = $server =~ /memotoo/; my $nokia_7210c = $server =~ /nokia_7210c/; my $ovi = $server =~ /Ovi/; my $unique_uid = $ENV{CLIENT_TEST_UNIQUE_UID}; my $full_timezones = $ENV{CLIENT_TEST_FULL_TIMEZONES}; # do not simplify VTIMEZONE definitions my $no_timezones = $ENV{CLIENT_TEST_NO_TIMEZONES}; # TODO: this hack ensures that any synchronization is limited to # properties supported by Synthesis. Remove this again. # $synthesis = 1; my $exchange = $server =~ /exchange/; # Exchange via ActiveSync my $egroupware = $server =~ /egroupware/; my $funambol = $server =~ /funambol/; my $googlesyncml = $server eq "google"; my $googlecaldav = $server eq "googlecalendar"; my $googlecarddav = $server eq "googlecontacts"; my $googleeas = $server eq "googleeas"; my $google_valarm = $ENV{CLIENT_TEST_GOOGLE_VALARM}; my $yahoo = $server =~ /yahoo/; my $davical = $server =~ /davical/; my $apple = $server =~ /apple/; my $oracle = $server =~ /oracle/; my $radicale = $server =~ /radicale/; my $zimbra = $server =~ /zimbra/; my $evolution = $client =~ /evolution/; my $addressbook = $client =~ /addressbook/; my $akonadi = $server =~ /kde/; sub Usage { print "$0 = 60) { $minutes++; $seconds -= 60; } while ($minutes >= 60) { $hours++; $minutes -= 60; } while ($hours >= 24) { $days++; $hours -= 24; } $value = $sign; $value .= ($days . "D") if $days; $value .= ($hours . "H") if $hours; $value .= ($minutes . "M") if $minutes; $value .= ($seconds . "S") if $seconds; return $value; } # decode base64 string, return size and hash sub describeBase64 { my $data = decode_base64($1); return sprintf("%d b64 characters = %d bytes, %s md5sum", length($1), length($data), md5_hex($data)); } # called for one VCALENDAR (with single VEVENT/VTODO/VJOURNAL) or VCARD, # returns normalized one sub NormalizeItem { my $width = shift; $_ = shift; # Reduce \N to \n (both are allowed in vCard 3.0). # Using a regular expression is a bit too broad # because it also matches \\N, which must not be # changed. s/\\N/\\n/g; # Ignore blank lines. Akonadi inserts them. s/\n{2,}/\n/s; # undo line continuation s/\n\s//gs; # ignore charset specifications, assume UTF-8 s/;CHARSET="?UTF-8"?//g; # UID may differ, but only in vCards and journal entries: # in calendar events the UID needs to be preserved to handle # meeting invitations/replies correctly s/((VCARD|VJOURNAL).*)^UID:[^\n]*\n/$1/msg; # intentional changes to UID are acceptable when running with CLIENT_TEST_UNIQUE_UID if ($unique_uid) { s/UID:UNIQUE-UID-\d+-/UID:/g; } # merge all CATEGORIES properties into one comma-separated one while ( s/^CATEGORIES:([^\n]*)\n(.*)^CATEGORIES:([^\n]*)\n/CATEGORIES:$1,$3\n$2/ms ) {} # exact order of categories is irrelevant s/^CATEGORIES:(\S+)/"CATEGORIES:" . sortlist($1)/mge; # expand shortcuts to TYPE= while (s/^(ADR|EMAIL|TEL)([^:\n]*);(HOME|OTHER|WORK|PARCEL|INTERNET|CAR|VOICE|CELL|PAGER)/$1;TYPE=$3/mg) {} # the distinction between an empty and a missing property # is vague and handled differently, so ignore empty properties s/^[^:\n]*:;*\n//mg; # use separate TYPE= fields while( s/^(\w*[^:\n]*);TYPE=(\w*),(\w*)/$1;TYPE=$2;TYPE=$3/mg ) {} # make TYPE uppercase (in vCard 3.0 at least those parameters are case-insensitive) while( s/^(\w*[^:\n]*);TYPE=(\w*?[a-z]\w*?)([;:])/ $1 . ";TYPE=" . uppercase($2) . $3 /mge ) {} # Replace parameters with a sorted parameter list. Cannot be done with # a regular expression because of quoted strings. While we know exact # parameter values, normalize them to use quoted strings if and only # if the content is more complex than alphanumeric plus underscore and # hyphen. my @lines; my ($propname, $sep, $rest); foreach (split /\n/) { ($propname, $sep, $rest) = /^([^;:]+)([:;])(.*)/; if ($sep eq ";") { my @params; my $c; my $i = 0; my $n = length($rest); my $quoted = 0; my $start = 0; while ($i < $n) { $c = substr($rest, $i, 1); $i++; if ($quoted) { if ($c eq '"') { $quoted = 0; } } else { if ($c eq '"') { $quoted = 1; } elsif ($c eq ';' || $c eq ':') { my $param = substr($rest, $start, $i - $start - 1); my ($name, $value) = $param =~ /^([^=]*)="?([^"]*)"?$/; if ($value =~ /^[a-zA-Z0-9_-]*$/) { $param = $name . '=' . $value; } else { $param = $name . '="' . $value . '"'; } push @params, $param; $start = $i; if ($c eq ':') { last; } } } } $_ = $propname . ';' . join(";", sort(@params)) . ':' . substr($rest, $start); } push @lines, $_; } $_ = join("\n", @lines); # VALUE=DATE is the default, no need to show it s/^(EXDATE|BDAY);VALUE=DATE:/\1:/mg; # default opacity is OPAQUE s/^TRANSP:OPAQUE\r?\n?//gm; # multiple EXDATEs may be joined into one, use separate properties as normal form s/^(EXDATE[^:]*):(.*)(\r?\n)/splitvalue($1, $2, $3)/mge; # sort value lists of specific properties s!^(RRULE.*):(.*)!$1 . ":" . join(';',sort(split(/;/, $2)))!meg; # INTERVAL=1 is the default and thus can be removed s/^RRULE(.*?);INTERVAL=1(;|$)/RRULE$1$2/mg; # Ignore remaining "other" email, address and telephone type - this is # an Evolution specific extension which might not be preserved. s/^(ADR|EMAIL|TEL)([^:\n]*);TYPE=OTHER/$1$2/mg; # TYPE=PREF on the other hand is not used by Evolution, but # might be sent back. s/^(ADR|EMAIL)([^:\n]*);TYPE=PREF/$1$2/mg; # Evolution does not need TYPE=INTERNET for email s/^(EMAIL)([^:\n]*);TYPE=INTERNET/$1$2/mg; # ignore TYPE=PREF in address, does not matter in Evolution s/^((ADR|LABEL)[^:\n]*);TYPE=PREF/$1/mg; # ignore extra separators in multi-value fields s/^((ORG|N|(ADR[^:\n]*?)):.*?);*$/$1/mg; # the type of certain fields is ignore by Evolution s/^X-(AIM|GROUPWISE|ICQ|YAHOO);TYPE=HOME/X-$1/gm; # Evolution ignores an additional pager type s/^TEL;TYPE=PAGER;TYPE=WORK/TEL;TYPE=PAGER/gm; # PAGER property is sent by Evolution, but otherwise ignored s/^LABEL[;:].*\n//mg; # TYPE=VOICE is the default in Evolution and may or may not appear in the vcard; # this simplification is a bit too agressive and hides the problematic # TYPE=PREF,VOICE combination which Evolution does not handle :-/ s/^TEL([^:\n]*);TYPE=VOICE,([^:\n]*):/TEL$1;TYPE=$2:/mg; s/^TEL([^:\n]*);TYPE=([^;:\n]*),VOICE([^:\n]*):/TEL$1;TYPE=$2$3:/mg; s/^TEL([^:\n]*);TYPE=VOICE([^:\n]*):/TEL$1$2:/mg; # don't care about the TYPE property of PHOTOs s/^PHOTO;(.*)TYPE=[A-Z]*/PHOTO;$1/mg; # encoding is not case sensitive, skip white space in the middle of binary data if (s/^PHOTO;.*?ENCODING=(b|B|BASE64).*?:\s*/PHOTO;ENCODING=B: /mgi) { if ($memotoo) { # transcodes image data, can't compare it s/(^PHOTO.*:).*/$1/mg; } else { while (s/^PHOTO(.*?): (\S+)[\t ]+(\S+)/PHOTO$1: $2$3/mg) {} } } # Don't show base64 encoded PHOTO data (makes diff very long). Instead # decode and show size + hash. s/^PHOTO;ENCODING=B: (.*)$/"PHOTO: " . describeBase64($1)/mge; # special case for the inlining of the local test case PHOTO s!^PHOTO;;VALUE=uri:file://testcases/local.png$!PHOTO;;VALUE=uri:!m; s!^PHOTO;ENCODING=B: iVBORw0KGgoAAAANSUh.*UQOVkeH/aKBSLM04QlMqAAFNBTl\+CjN9AAAAAElFTkSuQmCC$!PHOTO;;VALUE=uri:!m; # ignore extra day factor in front of weekday s/^RRULE:(.*)BYDAY=\+?1(\D)/RRULE:$1BYDAY=$2/mg; # remove default VALUE=DATE-TIME s/^(DTSTART|DTEND)([^:\n]*);VALUE=DATE-TIME/$1$2/mg; # remove default LANGUAGE=en-US s/^([^:\n]*);LANGUAGE=en-US/$1/mg; # normalize values which look like a date to YYYYMMDD because the hyphen is optional s/:(\d{4})-(\d{2})-(\d{2})/:$1$2$3/g; # mailto is case insensitive s/^((ATTENDEE|ORGANIZER).*):[Mm][Aa][Ii][Ll][Tt][Oo]:/$1:mailto:/mg; # remove fields which may differ s/^(PRODID|CREATED|DTSTAMP|LAST-MODIFIED|REV)(;X-VOBJ-FLOATINGTIME-ALLOWED=(TRUE|FALSE))?:.*\r?\n?//gm; # remove optional properties and parameters s/^(METHOD|X-WSS-[A-Z]*|X-WR-[A-Z]*|CALSCALE|X-KDE-ICAL-IMPLEMENTATION-VERSION|X-KDE-KCALCORE-ENABLED):.*\r?\n?//gm; s/^(ATTENDEE[^:]*);X-UID=[^;:]*/$1/mg; # trailing line break(s) in a DESCRIPTION may or may not be # removed or added by servers s/^DESCRIPTION:(.*?)(\\n)+$/DESCRIPTION:$1/gm; # use the shorter property name when there are alternatives, # but avoid duplicates foreach my $i ("SPOUSE", "MANAGER", "ASSISTANT", "ANNIVERSARY") { if (/^X-\Q$i\E:(.*?)$/m) { s/^X-EVOLUTION-\Q$i\E:\Q$1\E\n//m; } } s/^X-EVOLUTION-(SPOUSE|MANAGER|ASSISTANT|ANNIVERSARY)/X-$1/gm; # some properties are always lost because we don't transmit them if ($ENV{CLIENT_TEST_SERVER}) { s/^(X-FOOBAR-EXTENSION|X-TEST)(;[^:;\n]*)*:.*\r?\n?//gm; } # if there is no DESCRIPTION in a VJOURNAL, then use the # summary: that's what is done when exchanging such a # VJOURNAL as plain text if (/^BEGIN:VJOURNAL$/m && !/^DESCRIPTION/m) { s/^SUMMARY:(.*)$/SUMMARY:$1\nDESCRIPTION:$1/m; } # strip configurable X- parameters or properties my $strip = $ENV{CLIENT_TEST_STRIP_PROPERTIES}; if ($strip) { s/^$strip(;[^:;\n]*)*:.*\r?\n?//gm; } $strip = $ENV{CLIENT_TEST_STRIP_PARAMETERS}; if ($strip) { while (s/^(\w+)([^:\n]*);$strip=\d+/$1$2/mg) {} } # strip redundant VTIMEZONE definitions (happen to be # added by Google CalDAV server when storing an all-day event # which doesn't need any time zone definition) # http://code.google.com/p/google-caldav-issues/issues/detail?id=63 # # Also strip all definitions if requested. while (m/(BEGIN:VTIMEZONE.*?TZID:([^\n]*)\n.*?END:VTIMEZONE\n)/gs) { my $def = $1; my $tzid = $2; # Strip all, or not used as parameter? if ($no_timezones || ! m/;TZID="?\Q$tzid\E"?/) { # no, remove definition s!\Q$def\E!!s; } } if (!$full_timezones) { # Strip trailing digits from TZID. They are appended by # Evolution and SyncEvolution to distinguish VTIMEZONE # definitions which have the same TZID, but different rules. # This appending of digits may even get repeated, leading to: # TZID=EST/EDT 1 1 s/(^TZID:|;TZID=)([^;:]*?)( \d+)+/$1$2/gm; # Strip trailing -(Standard) from TZID. Evolution 2.24.5 adds # that (not sure exactly where that comes from). s/(^TZID:|;TZID=)([^;:]*?)-\(Standard\)/$1$2/gm; # VTIMEZONE and TZID do not have to be preserved verbatim as long # as the replacement is still representing the same timezone. # Reduce TZIDs which specify a proper location # to their location part and strip the VTIMEZONE - makes the # diff shorter, too. my $location = "[^\n]*((?:Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Brazil|Canada|Chile|Egypt|Eire|Europe|Hongkong|Iceland|India|Iran|Israel|Jamaica|Japan|Kwajalein|Libya|Mexico|Mideast|Navajo|Pacific|Poland|Portugal|Singapore|Turkey|Zulu)[-a-zA-Z0-9_/]*)"; s;^BEGIN:VTIMEZONE.*?^TZID:$location.*^END:VTIMEZONE;BEGIN:VTIMEZONE\n TZID:$1 [...]\nEND:VTIMEZONE;gms; s;TZID="?$location"?;TZID=$1;gm; } # normalize iCalendar 2.0 if (/^BEGIN:(VEVENT|VTODO|VJOURNAL)$/m) { # CLASS=PUBLIC is the default, no need to show it s/^CLASS:PUBLIC\r?\n//m; # RELATED=START is the default behavior s/^TRIGGER([^\n:]*);RELATED=START/TRIGGER$1/mg; # VALUE=DURATION is the default behavior s/^TRIGGER([^\n:]*);VALUE=DURATION/TRIGGER$1/mg; s/^(TRIGGER.*):(\S*)/$1 . ":" . NormalizeTrigger($2)/mge; # INDIVIDUAL is default for CUTYPE. s/;CUTYPE=INDIVIDUAL([;:])/$1/mg; # Print without quotation marks (probably not save in general, but okay for our test data). s/;CN="([^;]*)"/;CN=$1/g; } # Added by EDS >= 2.32, presumably to cache some internal computation. # Because it can be recreated, it doesn't have to be preserved during # sync and such changes can be ignored: # # RRULE:BYDAY=SU;COUNT=10;FREQ=WEEKLY | RRULE;X-EVOLUTION-ENDDATE=20080608T # > 070000Z:BYDAY=SU;COUNT=10;FREQ=WEEK # > LY s/^(\w+)([^:\n]*);X-EVOLUTION-ENDDATE=[0-9TZ]*/$1$2/mg; if ($scheduleworld || $egroupware || $synthesis || $addressbook || $funambol ||$googlesyncml || $googleeas || $googlecarddav || $mobical || $memotoo || $zimbra) { # does not preserve X-EVOLUTION-UI-SLOT= s/^(\w+)([^:\n]*);X-EVOLUTION-UI-SLOT=\d+/$1$2/mg; } if ($scheduleworld) { # cannot distinguish EMAIL types s/^EMAIL;TYPE=\w*/EMAIL/mg; # replaces certain TZIDs with more up-to-date ones s;TZID(=|:)/(scheduleworld.com|softwarestudio.org)/Olson_\d+_\d+/;TZID$1/foo.com/Olson_20000101_1/;mg; } if ($synthesis || $mobical) { # only preserves ORG "Company", but loses "Department" and "Office" s/^ORG:([^;:\n]+)(;[^\n]*)/ORG:$1/mg; } if ($funambol) { # only preserves ORG "Company";"Department", but loses "Office" s/^ORG:([^;:\n]+)(;[^;:\n]*)(;[^\n]*)/ORG:$1$2/mg; # drops the second address line s/^ADR(.*?):([^;]*?);[^;]*?;/ADR$1:$2;;/mg; # has no concept of "preferred" phone number s/^(TEL.*);TYPE=PREF/$1/mg; } if($googlesyncml || $googleeas || $googlecarddav) { # ignore the PHOTO encoding data s/^PHOTO(.*?): .*\n/PHOTO$1: [...]\n/mg; } if($googlesyncml || $googlecarddav) { # FN property gets synthesized by Google. s/^FN:.*\n/FN$1: [...]\n/mg; } # Properties and parameters are case-insensitive. ownCloud uses # X-ABLABEL while everyone else uses X-ABLabel. s/X-ABLABEL/X-ABLabel/g; if ($googlesyncml) { # Not support car type in telephone s!^TEL\;TYPE=CAR(.*)\n!TEL$1\n!mg; # some properties are lost s/^(X-EVOLUTION-FILE-AS|NICKNAME|BDAY|CATEGORIES|CALURI|FBURL|GEO|ROLE|URL|X-AIM|X-EVOLUTION-UI-SLOT|X-ANNIVERSARY|X-ASSISTANT|X-EVOLUTION-BLOG-URL|X-EVOLUTION-VIDEO-URL|X-GROUPWISE|X-ICQ|X-GADUGADU|X-JABBER|X-MSN|X-SIP|X-SKYPE|X-MANAGER|X-SPOUSE|X-MOZILLA-HTML|X-YAHOO)(;[^:;\n]*)*:.*\r?\n?//gm; } if ($googlecaldav) { #several properties are not preserved by Google in icalendar2.0 format s/^(SEQUENCE|X-EVOLUTION-ALARM-UID|TRANSP)(;[^:;\n]*)*:.*\r?\n?//gm; # Google adds calendar owner as attendee of meetings, regardless # whether it was on the original attendee list. Ignore this # during testing by removing all attendees with @googlemail.com # email address. s/^ATTENDEE.*googlemail.com\r?\n//gm; } if ($apple) { # remove some parameters added by Apple Calendar server in CalDAV s/^(ORGANIZER[^:]*);SCHEDULE-AGENT=NONE/$1/gm; s/^(ORGANIZER[^:]*);SCHEDULE-STATUS=5.3/$1/gm; # seems to require a fixed number of recurrences; hmm, okay... s/^RRULE:COUNT=400;FREQ=DAILY/RRULE:FREQ=DAILY/gm; } if ($oracle) { # remove extensions added by server s/^(X-S1CS-RECURRENCE-COUNT)(;[^:;\n]*)*:.*\r?\n?//gm; # ignore loss of LANGUAGE=xxx property in ATTENDEE s/^ATTENDEE([^\n:]*);LANGUAGE=([^\n;:]*)/ATTENDEE$1/mg; } if ($radicale) { # remove extensions added by server s/^(X-RADICALE-NAME)(;[^:;\n]*)*:.*\r?\n?//gm; } if ($googlecaldav || $yahoo) { # default status is CONFIRMED s/^STATUS:CONFIRMED\r?\n?//gm; } # Ignore VALARM ACTION:NONE. This has to be added to avoid default alarms in Google CalDAV. s/^BEGIN:VALARM\r?\n.*?^ACTION:NONE\r?\n.*?^END:VALARM\r?\n//ms; if ($yahoo) { s/^(X-MICROSOFT-[-A-Z0-9]*)(;[^:;\n]*)*:.*\r?\n?//gm; # some properties cannot be stored s/^(FN)(;[^:;\n]*)*:.*\r?\n?//gm; } if ($addressbook) { # some properties cannot be stored s/^(X-MOZILLA-HTML|X-EVOLUTION-FILE-AS|X-EVOLUTION-ANNIVERSARY|X-EVOLUTION-BLOG-URL|X-EVOLUTION-VIDEO-URL|X-GROUPWISE|ROLE|CATEGORIES|FBURL|CALURI|FN)(;[^:;\n]*)*:.*\r?\n?//gm; # only some parts of ADR are preserved my $type; s/^ADR(.*?)\:(.*)/$type=($1 || ""); @_ = split(\/(?[1] - $b->[1]) || # Compare indention, more indented last. ($b->[0] - $a->[0]) || # Compare importance, less important last. $a->[3] cmp $b->[3] } # Compare property name, parameters and value without group tag. @body ); # Combine lines with the same group tag. my %tags; my @tagged; my $tag; my $entry; my $index; foreach (@sorted) { $tag = $_->[2]; # Has a line a group tag? if ($tag) { # Same as one found before? $index = $tags{$tag}; if (defined($index)) { # Append to previous instance of the tag, keeping tag indices the same. push @{$tagged[$index]}, $_; } else { # Add at end, remember index for next line with the same tag. push @tagged, $_; $tags{$tag} = $#tagged; } } else { push @tagged, $_; } } # Convert back into individual, indented text lines. my @expanded; foreach (@tagged) { if ($_->[2]) { if ($#{$_} == 4) { # Simplify IMPP + X-ABLabel:Other to just IMPP without group tag. # For the sake of simplicity we only do that if the number of # grouped properties is exactly two. Otherwise we would have # to search in the list of extra properties. if ($_->[3] =~ /^IMPP[;:]/ && $_->[4][3] =~ /^X-ABLabel:Other$/) { splice(@{$_}, 4); } } if ($#{$_} == 3) { # If the last remaining property is X-ABLabel, then ignore it. # We ignore empty properties, which can cause their labels to # be left as redundant information (happens with Google CardDAV # when sending an empty URL). if ($_->[3] =~ "X-ABLabel:") { next; } # Remove redundant group tag from other properties. $_->[2] = ""; } } push @expanded, (" " x $_->[1]) . ($_->[2] ? "- " : "") . $_->[3]; if ($#{$_} > 3) { foreach ($_->[4,-1]) { push @expanded, (" " x $_->[1]) . " " . $_->[3]; } } } # Create one BEGIN/END block. $_ = join("\n", $begin, @expanded, $end); push @{$formatted[$#formatted]}, $_; } } return ${$formatted[0]}[0]; } # parameters: text, width to use for reformatted lines # returns list of lines without line breaks sub Normalize { $_ = shift; my $width = shift; s/\r//g; my @items = (); # split into individual items foreach $_ ( split( /(?:(?<=\nEND:VCARD)|(?<=\nEND:VCALENDAR))\n*/ ) ) { if (/END:VEVENT\s+BEGIN:VEVENT/s) { # remove multiple events from calendar item s/(BEGIN:VEVENT.*END:VEVENT\n)//s; my $events = $1; my $calendar = $_; my $event; # inject every single one back into the calendar and process the result foreach $event ( split ( /(?:(?<=\nEND:VEVENT))\n*/, $events ) ) { $_ = $calendar; s/\nEND:VCALENDAR/\n$event\nEND:VCALENDAR/; push @items, NormalizeItem($width, $_); } } else { # already a single item push @items, NormalizeItem($width, $_); } } return split( /\n/, join( "\n\n", sort @items )); } # number of columns available for output: # try tput without printing the shells error if not found, # default to 80 my $columns = `which tput >/dev/null 2>/dev/null && tput 2>/dev/null && tput cols`; if ($? || !$columns) { $columns = 80; } if($#ARGV > 1) { # error Usage(); exit 1; } elsif($#ARGV == 1) { # comparison my ($file1, $file2) = ($ARGV[0], $ARGV[1]); my $singlewidth = int(($columns - 3) / 2); $columns = $singlewidth * 2 + 3; my @normal1; my @normal2; if (-d $file1 && -d $file2) { # Both "files" are really directories of individual files. # Don't include files in the comparison which are known # to be identical because the refer to the same inode. # - build map from inode to filename(s) (each inode might be used more than once!) my %files1; my %files2; my @content1; my @content2; my $inode; my $fullname; my $entry; opendir(my $dh, $file1) || die "cannot read $file1: $!"; foreach $entry (grep { -f "$file1/$_" } readdir($dh)) { $fullname = "$file1/$entry"; $inode = (stat($fullname))[1]; if (!$files1{$inode}) { $files1{$inode} = []; } push(@{$files1{$inode}}, $entry); } closedir($dh); # - remove common files, read others opendir(my $dh, $file2) || die "cannot read $file2: $!"; foreach $entry (grep { -f "$file2/$_" } readdir($dh)) { $fullname = "$file2/$entry"; $inode = (stat($fullname))[1]; if (@{$files1{$inode}}) { # randomly match against the last file pop @{$files1{$inode}}; } else { open(IN, "<:utf8", "$fullname") || die "$fullname: $!"; push @content2, ; } } # - read remaining entries from first dir foreach my $array (values %files1) { foreach $entry (@{$array}) { $fullname = "$file1/$entry"; open(IN, "<:utf8", "$fullname") || die "$fullname: $!"; push @content1, ; } } my $content1 = join("", @content1); my $content2 = join("", @content2); @normal1 = Normalize($content1, $singlewidth); @normal2 = Normalize($content2, $singlewidth); } else { if (-d $file1) { open(IN1, "-|:utf8", "find $file1 -type f -print0 | xargs -0 cat") || die "$file1: $!"; } else { open(IN1, "<:utf8", $file1) || die "$file1: $!"; } if (-d $file2) { open(IN2, "-|:utf8", "find $file2 -type f -print0 | xargs -0 cat") || die "$file2: $!"; } else { open(IN2, "<:utf8", $file2) || die "$file2: $!"; } my $buf1 = join("", ); my $buf2 = join("", ); @normal1 = Normalize($buf1, $singlewidth); @normal2 = Normalize($buf2, $singlewidth); close(IN1); close(IN2); } # Produce output where each line is marked as old (aka remove) with o, # as new (aka added) with n, and as unchanged with u at the beginning. # This allows simpler processing below. my $res = 0; if (0) { # $_ = `diff "--old-line-format=o %L" "--new-line-format=n %L" "--unchanged-line-format=u %L" "$normal1" "$normal2"`; # $res = $?; } else { # convert into same format as diff above - this allows reusing the # existing output formatting code my $diffs_ref = Algorithm::Diff::sdiff(\@normal1, \@normal2); @_ = (); my $hunk; foreach $hunk ( @{$diffs_ref} ) { my ($type, $left, $right) = @{$hunk}; if ($type eq "-") { push @_, "o $left"; $res = 1; } elsif ($type eq "+") { push @_, "n $right"; $res = 1; } elsif ($type eq "c") { push @_, "o $left"; push @_, "n $right"; $res = 1; } else { push @_, "u $left"; } } $_ = join("\n", @_); } if ($res) { print $ENV{CLIENT_TEST_HEADER}; printf "%*s | %s\n", $singlewidth, ($ENV{CLIENT_TEST_LEFT_NAME} || "before sync"), ($ENV{CLIENT_TEST_RIGHT_NAME} || "after sync"); printf "%*s <\n", $singlewidth, ($ENV{CLIENT_TEST_REMOVED} || "removed during sync"); printf "%*s > %s\n", $singlewidth, "", ($ENV{CLIENT_TEST_ADDED} || "added during sync"); print "-" x $columns, "\n"; # fix confusing output like: # BEGIN:VCARD BEGIN:VCARD # > N:new;entry # > FN:new # > END:VCARD # > # > BEGIN:VCARD # and replace it with: # > BEGIN:VCARD # > N:new;entry # > FN:new # > END:VCARD # # BEGIN:VCARD BEGIN:VCARD # # With the o/n/u markup this presents itself as: # u BEGIN:VCARD # n N:new;entry # n FN:new # n END:VCARD # n # n BEGIN:VCARD # # The alternative case is also possible: # o END:VCARD # o # o BEGIN:VCARD # o N:old;entry # u END:VCARD # case one above while( s/^u BEGIN:(VCARD|VCALENDAR)\n((?:^n .*\n)+?)^n BEGIN:/n BEGIN:$1\n$2u BEGIN:/m) {} # same for the other direction while( s/^u BEGIN:(VCARD|VCALENDAR)\n((?:^o .*\n)+?)^o BEGIN:/o BEGIN:$1\n$2u BEGIN:/m) {} # case two while( s/^o END:(VCARD|VCALENDAR)\n((?:^o .*\n)+?)^u END:/u END:$1\n$2o END:/m) {} while( s/^n END:(VCARD|VCALENDAR)\n((?:^n .*\n)+?)^u END:/u END:$1\n$2n END:/m) {} # split at end of each record my $spaces = " " x $singlewidth; foreach $_ (split /(?:(?<=. END:VCARD\n)|(?<=. END:VCALENDAR\n))(?:^. \n)*/m, $_) { # ignore unchanged records if (!length($_) || /^((u [^\n]*\n)*(u [^\n]*?))$/s) { next; } # make all lines equally long in terms of printable characters s/^(.*)$/$1 . (" " x ($singlewidth + 2 - length($1)))/gme; # convert into side-by-side output my @buffer = (); foreach $_ (split /\n/, $_) { if (/^u (.*)/) { print join(" <\n", @buffer), " <\n" if $#buffer >= 0; @buffer = (); print $1, " ", $1, "\n"; } elsif (/^o (.*)/) { # preserve in buffer for potential merging with "n " push @buffer, $1; } else { /^n (.*)/; # have line to be merged with? if ($#buffer >= 0) { print shift @buffer, " | ", $1, "\n"; } else { print join(" <\n", @buffer), " <\n" if $#buffer >= 0; print $spaces, " > ", $1, "\n"; } } } print join(" <\n", @buffer), " <\n" if $#buffer >= 0; @buffer = (); print "-" x $columns, "\n"; } } # unlink($normal1); # unlink($normal2); exit($res ? ((defined $ENV{CLIENT_TEST_COMPARISON_FAILED}) ? int($ENV{CLIENT_TEST_COMPARISON_FAILED}) : 1) : 0); } else { # normalize my $in; if( $#ARGV >= 0 ) { my $file1 = $ARGV[0]; if (-d $file1) { open(IN, "-|:utf8", "find $file1 -type f -print0 | xargs -0 cat") || die "$file1: $!"; } else { open(IN, "<:utf8", $file1) || die "$file1: $!"; } $in = *IN{IO}; } else { $in = *STDIN{IO}; } my $buf = join("", <$in>); print STDOUT join("\n", Normalize($buf, $columns)), "\n"; } syncevolution-1.5/test/log2html.py0000644000373300001540000000540712326412403020602 0ustar00nightlynightly00000000000000#!/usr/bin/python """ Converts the .log output for a client-test test into HTML, with hightlighting and local hrefs to ClientTest.html and test directories. """ import sys import re import cgi filename = sys.argv[1] if filename == '-': log = sys.stdin else: log = open(filename) out = sys.stdout # matches [DEBUG/DEVELOPER/...] tags at the start of the line, # used to mark text via class ModeSpan: mode=None @staticmethod def setMode(newmode): if ModeSpan.mode != newmode: if ModeSpan.mode: out.write('') ModeSpan.mode = newmode if ModeSpan.mode: out.write('' % ModeSpan.mode) # detect SyncEvolution line prefix tag = re.compile(r'^(\[([A-Z]+) [^\]]*\])( .*)') # hyperlink to HTML version of source code sourcefile = re.compile(r'((\w+\.(?:cpp|c|h)):(\d+))') # highlight: # - any text after *** # *** clean via source A # *** starting Client::Source::egroupware-dav_caldav::testChanges *** # - simple prefixes at the start of a line, after the [] tag (removed already) # caldav #A: # - HTTP requests # REPORT /egw/groupdav.php/syncevolution/calendar/ HTTP/1.1 # PROPFIND /egw/groupdav.php/syncevolution/calendar/1234567890%40dummy.ics HTTP/1.1 highlight = re.compile(r'(\*\*\* .*|^ [a-zA-Z0-9_\- #]*: |(?:REPORT|PUT|GET|DELETE|PROPFIND) .*HTTP/\d\.\d$)') # hyperlink to sync session directory session = re.compile(r'(Client_(?:Source|Sync)(?:_\w+)+\S+)') out.write(''' ''') syncevolution-1.5/test/run_src_client_test.sh0000755000373300001540000000041012326412403023074 0ustar00nightlynightly00000000000000#!/bin/sh # This script is run by `make check'. Since `make check' is run from top source # directory and `client-test' is expected to be run from `src' directory, this # script have to be employed, so `client-test' can find some files. cd 'src' && ./client-test syncevolution-1.5/test/test.am0000664000373300001540000002166312363672170020014 0ustar00nightlynightly00000000000000dist_noinst_DATA += \ test/abort-redirect.cpp \ test/ClientTest.h \ test/ClientTestAssert.h \ test/ClientTest.cpp \ test/client-test-main.cpp \ test/test.h \ test/test.cpp dist_noinst_SCRIPTS += \ test/Algorithm/Diff.pm \ test/syncevo-http-server.py \ test/syncevo-phone-config.py \ test/synccompare.pl \ test/log2html.py \ test/run_src_client_test.sh test_testcases = \ test/testcases/eds_event.ics \ test/testcases/eds_event.ics.local \ test/testcases/eds_task.ics \ test/testcases/vcal10.ics \ test/testcases/carddav.vcf \ test/testcases/eds_contact.vcf \ test/testcases/eds_memo.ics \ test/testcases/google_event.ics \ test/testcases/yahoo_contact.vcf \ test/testcases/lcs/file1.txt \ test/testcases/lcs/file2.txt \ test/testcases/local.png \ test/testcases/templates/clients/phone/nokia/S40/7210c.ini \ test/testcases/templates/clients/SyncEvolution.ini \ test/testcases/synctests/apple/eds_contact/testUpload/local-synced \ test/testcases/synctests/apple/eds_contact/testUpload/local \ test/testcases/synctests/apple/eds_contact/testUpload/modify-remote \ test/testcases/synctests/apple/eds_contact/testUpload/remote \ test/testcases/synctests/apple/eds_contact/testDownload/modify-local \ test/testcases/synctests/apple/eds_contact/testDownload/local \ test/testcases/synctests/apple/eds_contact/testDownload/remote \ test/testcases/synctests/apple/eds_contact/testDownload/remote-synced \ test/testcases/synctests/googlecontacts/eds_contact/testUpload/local-synced \ test/testcases/synctests/googlecontacts/eds_contact/testUpload/local \ test/testcases/synctests/googlecontacts/eds_contact/testUpload/modify-remote \ test/testcases/synctests/googlecontacts/eds_contact/testUpload/remote \ test/testcases/synctests/googlecontacts/eds_contact/testDownload/modify-local \ test/testcases/synctests/googlecontacts/eds_contact/testDownload/local \ test/testcases/synctests/googlecontacts/eds_contact/testDownload/remote \ test/testcases/synctests/googlecontacts/eds_contact/testDownload/remote-synced \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/modify-local \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/local-synced \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/local \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/modify-remote \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateRemoteWins/remote-synced \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/modify-local \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/local-synced \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/local \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/modify-remote \ test/testcases/synctests/googlecontacts/eds_contact/testUpdateLocalWins/remote-synced \ $(NOP) dist_noinst_DATA += \ $(test_testcases) \ test/COPYING \ test/Algorithm/Artistic \ test/Algorithm/COPYING \ test/Algorithm/README \ test/syncevo-http-server-logging.conf \ $(wildcard test/testcases/*.patch) # generic D-Bus client/server tests if COND_DBUS noinst_PROGRAMS += test/dbus-client-server test_dbus_client_server_SOURCES = test/dbus-client-server.cpp test_dbus_client_server_CPPFLAGS = -I$(gdbus_dir) -I$(top_srcdir)/src test_dbus_client_server_CXXFLAGS = $(CPPUNIT_CXXFLAGS) $(SYNCEVOLUTION_CXXFLAGS) $(BACKEND_CPPFLAGS) $(DBUS_CFLAGS) $(GLIB_CFLAGS) $(GOBJECT_CFLAGS) $(PCRECPP_CFLAGS) test_dbus_client_server_LDFLAGS = $(CPPUNIT_LDFLAGS) test_dbus_client_server_LDADD = $(gdbus_build_dir)/libgdbussyncevo.la src/syncevo/libsyncevolution.la $(DBUS_LIBS) $(GLIB_LIBS) $(GOBJECT_LIBS) $(PCRECPP_LIBS) test_dbus_client_server_DEPENDENCIES = $(gdbus_build_dir)/libgdbussyncevo.la src/syncevo/libsyncevolution.la if ENABLE_UNIT_TESTS test_dbus_client_server_SOURCES += test/test.cpp endif endif if ENABLE_TESTING test_SCRIPTS += \ test/__init__.py \ test/test-dbus.py \ test/testdbus.py \ $(NOP) # Install symbolic links, to ensure that testing in the testdir # uses the right SyncEvolution without depending on the PATH. # client-test should have been installed in testdir already as # normal executable, see src.am. all_install_exec_hooks += install-test-files install-test-files: mkdir -p $(DESTDIR)/$(testdir) ln -f -s $(bindir)/syncevolution $(DESTDIR)/$(testdir) ln -f -s $(bindir)/synccompare $(DESTDIR)/$(testdir) ln -f -s $(libexecdir)/syncevo-dbus-server $(DESTDIR)/$(testdir) ln -f -s $(bindir)/synclog2html $(DESTDIR)/$(testdir) ln -f -s $(bindir)/syncevo-webdav-lookup $(DESTDIR)/$(testdir) cp config.h $(top_srcdir)/src/syncevo/SyncConfig.h src/ClientTest.cpp.html $(DESTDIR)/$(testdir) # needed by test-dbus.py all_uninstall_hooks += uninstall-test-files uninstall-test-files: rm -f $(DESTDIR)/$(testdir)/syncevolution \ $(DESTDIR)/$(testdir)/synccompare \ $(DESTDIR)/$(testdir)/syncevo-dbus-server \ $(DESTDIR)/$(testdir)/synclog2html \ $(DESTDIR)/$(testdir)/syncevo-webdav-lookup \ $(DESTDIR)/$(testdir)/SyncConfig.h \ $(DESTDIR)/$(testdir)/ClientTests.cpp.html \ $(DESTDIR)/$(testdir)/config.h \ $(NOP) test_DATA += \ test/Makefile \ $(NOP) nobase_testparent_DATA += \ $(test_testcases) \ test/test-dbus/templates/templates/clients/phone/nokia/S40/7210c.ini \ test/test-dbus/templates/templates/clients/SyncEvolution.ini \ test/test-dbus/auto-sync/config/syncevolution/.internal.ini \ test/test-dbus/auto-sync/config/syncevolution/default/.internal.ini \ test/test-dbus/auto-sync/config/syncevolution/default/config.ini \ test/test-dbus/auto-sync/config/syncevolution/default/peers/scheduleworld/.internal.ini \ test/test-dbus/auto-sync/config/syncevolution/default/peers/scheduleworld/config.ini \ test/test-dbus/auto-sync/config/syncevolution/config.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/todo.after.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/todo.current/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/addressbook.before.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.before.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/todo.current.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.current.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.after/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.after/2 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/status.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.before/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/todo.after/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/addressbook.current/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.after.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.after/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.after/3 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.after/2 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.after.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.before.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/addressbook.current.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/addressbook.after/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.current/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/memo.current/2 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/addressbook.after.ini \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.before/1 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.before/3 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/calendar.before/2 \ test/test-dbus/restore/cache/syncevolution/dummy_+test-2009-12-21-13-19/todo.before.ini \ test/test-dbus/reports/cache/syncevolution/dummy_+test-2009-11-18-12-57/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy-2009-11-18-13-00/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy_+test-2009-11-18-12-55/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy_+test-2009-11-18-13-01/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy_+test-2009-11-18-12-59/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy_+test-2009-11-18-12-58/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy_+test@context-2010-01-20-10-10/status.ini \ test/test-dbus/reports/cache/syncevolution/dummy__test-2009-11-18-12-56/status.ini \ $(NOP) endif # ENABLE_TESTING syncevolution-1.5/test/IcalTest.cpp0000644000373300001540000000640112326412403020707 0ustar00nightlynightly00000000000000/* * Copyright (C) 2005-2009 Patrick Ohly * Copyright (C) 2009 Intel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) version 3. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "config.h" #ifdef ENABLE_ICAL #include "test.h" #include #include #include SE_BEGIN_CXX class IcalTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(IcalTest); CPPUNIT_TEST(testTimezone); CPPUNIT_TEST_SUITE_END(); protected: /** * Ensures that we get VTIMEZONE with RRULE from libical. * * This only works with libical 1.0 if we successfully * pick up our icaltimezone_get_component() or * libical uses our icaltzutil_fetch_timezone(). * * This test uses the function lookup via eds_abi_wrapper.h if that * was enabled, otherwise goes via the static or dynamic linker. * * It only passes if the given timezone has not been loaded by * libical internally yet, because we cannot influence that. Only * direct calls to icaltimezone_get_component() as done by * libsynthesis are caught. This means that "Europe/Paris" must * not be used by, for example, test data used in * Client::Source::eds_event. */ void testTimezone() { icaltimezone *zone = icaltimezone_get_builtin_timezone("Europe/Paris"); CPPUNIT_ASSERT(zone); icalcomponent *comp = icaltimezone_get_component(zone); CPPUNIT_ASSERT(comp); SyncEvo::eptr str(ical_strdup(icalcomponent_as_ical_string(comp))); CPPUNIT_ASSERT(str); // We are very specific here. This'll work until we change our // code or the zone data from Europe/Paris changes (not likely). CPPUNIT_ASSERT_EQUAL(std::string(str), std::string( "BEGIN:VTIMEZONE\r\n" "TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Paris\r\n" "X-LIC-LOCATION:Europe/Paris\r\n" "BEGIN:STANDARD\r\n" "TZNAME:CET\r\n" "DTSTART:19701026T030000\r\n" "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\r\n" "TZOFFSETFROM:+0200\r\n" "TZOFFSETTO:+0100\r\n" "END:STANDARD\r\n" "BEGIN:DAYLIGHT\r\n" "TZNAME:CEST\r\n" "DTSTART:19700330T020000\r\n" "RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3\r\n" "TZOFFSETFROM:+0100\r\n" "TZOFFSETTO:+0200\r\n" "END:DAYLIGHT\r\n" "END:VTIMEZONE\r\n" )); } }; CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(IcalTest, "SyncEvolution" ); SE_END_CXX #endif // ENABLE_ICAL syncevolution-1.5/test/dbus-client-server.cpp0000664000373300001540000002700112363672170022727 0ustar00nightlynightly00000000000000#include "gdbus-cxx-bridge.h" #include #include #include #include #include #include #include #include SyncEvo::GMainLoopCXX loop; // closes child connection boost::scoped_ptr guard; class Test { GDBusCXX::DBusObjectHelper m_server; // GDBusCXX::DBusRemoteObject m_dbusAPI; // GDBusCXX::SignalWatch0 m_disconnected; public: Test(const GDBusCXX::DBusConnectionPtr &conn) : // will close connection m_server(conn, "/test", "org.example.Test", GDBusCXX::DBusObjectHelper::Callback_t(), true) // m_dbusAPI(conn, DBUS_PATH_LOCAL, DBUS_INTERFACE_LOCAL, "" /* sender? */), // m_disconnected(m_dbusAPI, "Disconnected") { m_server.add(this, &Test::hello, "Hello"); m_server.add(this, &Test::getstrings, "GetStrings"); m_server.add(this, &Test::getmixed, "GetMixed"); m_server.add(this, &Test::kill, "Kill"); } void activate() { m_server.activate(); // fails with an unspecific error inside libdbus, don't rely on "Disconnected" // m_disconnected.activate(boost::bind(&Test::disconnected, this)); // not implemented either // b_dbus_set_disconnect_function(m_server.getConnection(), // staticDisconnected, // NULL, // NULL); } std::string hello(const std::string &in) { std::cout << "hello() called with " << in << std::endl; return "world"; } void getstrings(std::string &first, std::string &second) { first = "hello"; second = "world"; } void getmixed(std::string &first, int &second, std::string &third) { first = "hello"; second = 1; third = "world"; } void kill() { std::cout << "killing myself as requested" << std::endl; abort(); } void disconnected() { std::cout << "connection disconnected"; } // static void staticDisconnected(DBusConnection*conn, void *data) // { // std::cout << "connection disconnected"; // } }; static void newClientConnection(GDBusCXX::DBusServerCXX &server, GDBusCXX::DBusConnectionPtr &conn, boost::scoped_ptr &testptr) { std::cout << "new connection" << std::endl; testptr.reset(new Test(conn.get())); testptr->activate(); } static void onChildConnect(const GDBusCXX::DBusConnectionPtr &conn, boost::scoped_ptr &testptr) { std::cout << "child is ready" << std::endl; testptr.reset(new Test(conn.get())); testptr->activate(); } static void onQuit(int status) { std::cout << "child has quit, status " << status << std::endl; // always quit the process, not just on failure g_main_loop_quit(loop.get()); } static void onFailure(const std::string &error) { std::cout << "failure, quitting now: " << error << std::endl; g_main_loop_quit(loop.get()); } class TestProxy : public GDBusCXX::DBusRemoteObject { public: TestProxy(const GDBusCXX::DBusConnectionPtr &conn) : GDBusCXX::DBusRemoteObject(conn.get(), "/test", "org.example.Test", "direct.peer"), m_hello(*this, "Hello"), m_kill(*this, "Kill") { } GDBusCXX::DBusClientCall1 m_hello; GDBusCXX::DBusClientCall0 m_kill; }; static void onChildConnectKill(const GDBusCXX::DBusConnectionPtr &conn, boost::scoped_ptr &testptr) { std::cout << "child is ready, kill it" << std::endl; testptr.reset(new Test(conn.get())); testptr->activate(); // process messages already before returning from this onConnect callback dbus_bus_connection_undelay(conn); TestProxy proxy(conn); try { proxy.m_kill(); } catch (const std::runtime_error &ex) { std::cout << "caught exception, as expected: " << ex.what() << std::endl; std::cout << "aborting..." << std::endl; abort(); } std::cout << "did not get the expected exception" << std::endl; abort(); } static void helloCB(GMainLoop *loop, const std::string &res, const std::string &error) { if (!error.empty()) { std::cout << "call failed: " << error << std::endl; } else { std::cout << "hello('hello') = " << res << std::endl; } g_main_loop_quit(loop); } static void callServer(const GDBusCXX::DBusConnectionPtr &conn) { TestProxy proxy(conn); Test test(conn.get()); test.activate(); // process messages already before returning from this onConnect callback dbus_bus_connection_undelay(conn); std::cout << "blocking call to server without callback" << std::endl; std::cout << proxy.m_hello(std::string("blocking world, II")) << std::endl; try { GDBusCXX::DBusClientCall1 nosuchcall(proxy, "nosuchcall"); std::cout << nosuchcall(std::string("ignoreme")) << std::endl; } catch (const std::runtime_error &ex) { std::cout << "caught exception, as expected: " << ex.what() << std::endl; } GDBusCXX::DBusClientCall2 getstrings(proxy, "GetStrings"); std::pair r = getstrings(); std::cout << "Got pair: (" << r.first << ", " << r.second << ")" << std::endl; GDBusCXX::DBusClientCall3 getmixed(proxy, "GetMixed"); std::cout << "Got tuple: " << getmixed() << std::endl; std::cout << "calling server" << std::endl; proxy.m_hello.start(std::string("world"), boost::bind(helloCB, loop.get(), _1, _2)); // keep connection open until child quits guard.reset(new GDBusCXX::DBusObject(conn, "foo", "bar", true)); } static void killServer(const GDBusCXX::DBusConnectionPtr &conn) { TestProxy proxy(conn); // process messages already before returning from this onConnect callback dbus_bus_connection_undelay(conn); try { proxy.m_kill(); } catch (const std::runtime_error &ex) { std::cout << "caught exception, as expected: " << ex.what() << std::endl; std::cout << "aborting..." << std::endl; abort(); } std::cout << "did not get the expected exception" << std::endl; abort(); } static void calledByServer(const GDBusCXX::DBusConnectionPtr &conn) { // run until Test::kill() is invoked by server Test test(conn.get()); test.activate(); dbus_bus_connection_undelay(conn); g_main_loop_run(loop.get()); } void signalHandler (int sig) { if (loop) { g_main_loop_quit(loop.get()); } } int main(int argc, char **argv) { int ret = 0; signal (SIGABRT, &signalHandler); signal (SIGTERM, &signalHandler); signal (SIGINT, &signalHandler); try { gboolean opt_server; gboolean opt_fork_exec; gboolean opt_fork_exec_failure; gchar *opt_address; gchar *opt_kill; GOptionContext *opt_context; // gboolean opt_allow_anonymous; SyncEvo::GErrorCXX gerror; GDBusCXX::DBusErrorCXX dbusError; GOptionEntry opt_entries[] = { { "server", 's', 0, G_OPTION_ARG_NONE, &opt_server, "Start a server instead of a client", NULL }, { "forkexec", 'e', 0, G_OPTION_ARG_NONE, &opt_fork_exec, "Use fork+exec to start the client (implies --server)", NULL }, { "forkfailure", 'f', 0, G_OPTION_ARG_NONE, &opt_fork_exec_failure, "Fork /bin/false to simulate a failure in the child (implies )", NULL }, { "forkkill", 'a', 0, G_OPTION_ARG_STRING, &opt_kill, "'child/parent' call peer which kills itself before replying (implies --forkexec)", NULL }, { "address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, "D-Bus address to use when connecting to server", NULL }, // { "allow-anonymous", 'n', 0, G_OPTION_ARG_NONE, &opt_allow_anonymous, "Allow anonymous authentication", NULL }, { NULL} }; #if !GLIB_CHECK_VERSION(2,36,0) g_type_init(); #endif opt_address = NULL; opt_kill = NULL; opt_server = FALSE; opt_fork_exec = FALSE; opt_fork_exec_failure = FALSE; // opt_allow_anonymous = FALSE; opt_context = g_option_context_new("peer-to-peer example"); g_option_context_add_main_entries(opt_context, opt_entries, NULL); bool success = g_option_context_parse(opt_context, &argc, &argv, gerror); g_option_context_free(opt_context); if (!success) { gerror.throwError(SE_HERE, "parsing command line options"); } // if (!opt_server && opt_allow_anonymous) { // throw stdruntime_error("The --allow-anonymous option only makes sense when used with --server."); // } loop = SyncEvo::GMainLoopStealCXX(g_main_loop_new (NULL, FALSE)); if (!loop) { throw std::runtime_error("could not allocate main loop"); } if (opt_fork_exec || opt_fork_exec_failure) { boost::scoped_ptr testptr; boost::shared_ptr forkexec = SyncEvo::ForkExecParent::create(opt_fork_exec_failure ? "/bin/false" : argv[0]); if (opt_kill) { forkexec->addEnvVar("DBUS_CLIENT_SERVER_KILL", opt_kill); } forkexec->m_onConnect.connect(g_strcmp0(opt_kill, "child") ? boost::bind(onChildConnect, _1, boost::ref(testptr)) : boost::bind(onChildConnectKill, _1, boost::ref(testptr))); forkexec->m_onQuit.connect(onQuit); forkexec->m_onFailure.connect(boost::bind(onFailure, _2)); forkexec->start(); g_main_loop_run(loop.get()); } else if (opt_server) { boost::scoped_ptr testptr; boost::shared_ptr server = GDBusCXX::DBusServerCXX::listen(boost::bind(newClientConnection, _1, _2, boost::ref(testptr)), &dbusError); if (!server) { dbusError.throwFailure("starting server"); } std::cout << "Server is listening at: " << server->getAddress() << std::endl; g_main_loop_run(loop.get()); } else if (SyncEvo::ForkExecChild::wasForked()) { boost::shared_ptr forkexec = SyncEvo::ForkExecChild::create(); forkexec->m_onConnect.connect(!g_strcmp0(getenv("DBUS_CLIENT_SERVER_KILL"), "child") ? calledByServer : !g_strcmp0(getenv("DBUS_CLIENT_SERVER_KILL"), "server") ? killServer : callServer); forkexec->m_onFailure.connect(boost::bind(onFailure, _2)); forkexec->connect(); g_main_loop_run(loop.get()); } else { if (!opt_address) { throw std::runtime_error("need server address"); } GDBusCXX::DBusConnectionPtr conn = dbus_get_bus_connection(opt_address, &dbusError); if (!conn) { dbusError.throwFailure("connecting to server"); } // closes connection callServer(conn); g_main_loop_run(loop.get()); } loop.reset(); } catch (const std::exception &ex) { std::cout << ex.what() << std::endl; ret = 1; loop.reset(); } std::cout << "server done" << std::endl; return ret; } syncevolution-1.5/README0000644000373300037200000023260012424702455016564 0ustar00nightlyallusers00000000000000=============== SyncEvolution =============== ------------------------------------------------ synchronize personal information management data ------------------------------------------------ :Manual section: 1 :Version: 1.5 :Date: 2014-10-31 SYNOPSIS ======== List and manipulate databases: syncevolution --print-databases|--create-database|--remove-database [] [ ] Show information about configuration(s): syncevolution --print-servers|--print-configs|--print-peers Show information about a specific configuration: syncevolution --print-config [--quiet] [--] [main| ...] List sessions: syncevolution --print-sessions [--quiet] [--] Show information about SyncEvolution: syncevolution --help|-h|--version Run a synchronization as configured: syncevolution [ ...] Run a synchronization with properties changed just for this run: syncevolution --run [--] [ ...] Restore data from the automatic backups: syncevolution --restore --before|--after [--dry-run] [--] ... Create, update or remove a configuration: syncevolution --configure [--] [ ...] syncevolution --remove|--migrate [--] List items: syncevolution --print-items [--] [ []] Export item(s): syncevolution [--delimiter ] --export ||- [--] [ [ [ ...]]] --luids ... Add item(s): syncevolution [--delimiter |none] --import ||- [--] [ []] --luids ... Update item(s): syncevolution --update [--] syncevolution [--delimiter |none] --update |- [--] ... --luids ... Remove item(s): syncevolution --delete-items [--] ( ... | '*') DESCRIPTION =========== This text explains the usage of the SyncEvolution command line. SyncEvolution synchronizes personal information management (PIM) data such as contacts, appointments, tasks and memos using the Synthesis sync engine, which provides support for the SyncML synchronization protocol. SyncEvolution synchronizes with SyncML servers over HTTP and with SyncML capable phones locally over Bluetooth (new in 1.0). Plugins provide access to the data which is to be synchronized. Binaries are available for Linux desktops (synchronizing data in GNOME Evolution, with KDE supported indirectly already and Akonadi support in development), for MeeGo (formerly Moblin) and for Maemo 5/Nokia N900. The source code can be compiled for Unix-like systems and provides a framework to build custom SyncML clients or servers. TERMINOLOGY =========== peer A peer is the entity that data is synchronized with. This can be another device (like a phone), a server (like Google) or even the host itself (useful for synchronizing two different databases). host The device or computer that SyncEvolution runs on. item The smallest unit of synchronization. Examples of items include calendar events and individual contacts, memos, or tasks. database Each peer has one or more databases that get synchronized (Google Calendar, Google Contacts). Conceptually a database is a set of items where each item is independent of the others. backend Access to databases is provided by SyncEvolution backends. It does not matter where that data is stored. Some backends provide access to data outside of the host itself (`CalDAV and CardDAV`_, ActiveSync). datastore (or just "store") Used for the combination of SyncEvolution backend and database settings. A datastore provides read/write access to a database, which is a prerequisite for syncing the database. The datastore is independent of the peers that the database might be synchronized with. This used to be called "data source" or just "source", which is a term still found in older documentation, some file paths and the source code of SyncEvolution. local/remote Synchronization always happens between a pair of databases and thus has two sides. One database or side of a sync is remote (the one of the peer), the other is local (SyncEvolution). For the sake of consistency (and lack of better terms), these terms are used even if the peer is another instance of SyncEvolution and/or all data resides on the same storage. sync config A sync configuration defines how to talk with a peer: the protocol which is to be used, how to find the peer, credentials, etc. Sync configs can be used to initiate a sync (like contacting a SyncML server) or to handle an incoming sync request (when acting as SyncML server which is contacted by the peer). If the peer supports SyncML as sync protocol, a sync only uses one sync config on the SyncEvolution side. If the peer supports data access via some other protocols, then SyncEvolution can make that data available via SyncML and run a sync where SyncML is used internally. Such a sync involves two sync configs, see ``originating config`` and ``target config``. A sync config can use all datastores defined in the same context (see below). Some properties of the datastore can be set differently for each peer and thus sync config (``per-peer``). One of these, the ``sync`` property, defines if and how a datastore is used during a sync. context Sync and datastore configs are defined inside one or more configuration contexts. There is always a ``@default`` context that gets used if nothing else is specified. Typically each context represents a certain set of related datastores. For example, normally the ``@default`` context is used for local databases. Datastores related to a certain peer can be defined in a context ``@peer-name`` named after that peer. configuration properties SyncEvolution uses key/value pairs to store configuration options. A configuration is a set of unique keys and their values that together describe a certain object. These sets of properties are addressed via the main config name (a sync config name with or without an explicit context, or just the context name) and optionally the datastore name (if the properties are for a specific datastore). Sync properties are set for sync configs, independently of a particular datastore. Properties that cannot be set without specifying they datastore that they apply to are datastore properties. This includes properties that belong both to a datastore and a sync config. The property names were chosen so that they are unique, i.e., no sync property has the same name as a datastore property. For historic reasons, internally these properties are treated as two different sets and there are two different command line options to query the list of sync resp. datastore properties. Some configuration properties are shared between configurations automatically. This sharing is hard-coded and cannot be configured. It has the advantage that certain settings only need to be set once and/or can be changed for several different configs at once. A property can be *unshared* (has separate values for each peer, therefore sometimes also called *per-peer*; for example the ``sync`` property), *shared* (same value for all peers; for example the ``database`` property for selecting the local database) or *global* (exactly one value). Together with the distinction between sync and datastore properties, this currently results in five different groups of properties: * Sync properties (by definition, this also includes properties independent of a particular sync config because they are set for all sync configs at once, independently of any particular datastore): * global (= ``~/.config/syncevolution/config.ini``): independent of a particular context, for example ``keyring`` * shared (= ``~/.config/syncevolution//config.ini``): set once for each context, for example ``logdir`` * unshared (= ``~/.config/syncevolution//peers//config.ini``): set separately for each sync config, for example ``syncURL`` * Datastore properties: * shared (= ``~/.config/syncevolution//sources//config.ini``): the properties required for access to the data, primarily ``backend`` and ``database`` * unshared (= ``~/.config/syncevolution//peers//sources//config.ini``): the already mentioned ``sync`` and ``uri`` properties, but also a per-peer sync format properties Many properties have reasonable defaults, either defined in the configuration layer or chosen at runtime by the SyncEvolution engine reading the configuration, and therefore do not have to be set. The configuration layer in SyncEvolution has a very limited understanding of the semantic of each property. It just knows about some generic types (strings, boolean, integers, ...) and where properties are supposed to be stored. It is the layer above that, the one which actually tries to use the configuration, that determines whether the property values make sense as specified. Beware that it is possible to set properties to values that conflict with other property values (triggering errors when using the configuration) or to set properties that are not used (typically they get ignored silently, unless an explicit error check was implemented). configuration template Templates define the settings for specific peers. Some templates are packaged together with SyncEvolution, others may be added by packagers or users. Settings from templates are copied once into the sync config when creating it. There is no permanent link back to the template, so updating a template has no effect on configs created from it earlier. A template only contains unshared properties. Therefore it is possible to first set shared properties (for example, choosing which databases to synchronize in the default context), then add sync configs for different peers to that context without reseting the existing settings. In SyncEvolution's predefined configuration templates, the following names for datastores are used. Different names can be chosen for datastores that are defined manually. * addressbook: a list of contacts * calendar: calendar *events* * memo: plain text notes * todo: task list * calendar+todo: a virtual datastore combining one local "calendar" and one "todo" datastore (required for synchronizing with some phones) local sync Traditionally, a sync config specifies SyncML as the synchronization protocol via the `syncURL` property. The peer must support SyncML for this to work. In a so called local sync, SyncEvolution acts as SyncML server and client at the same time, connecting the two sides via internal message passing. Both sides have their own set of datastores, which may use CalDAV, CardDAV or ActiveSync to access the data. See `Synchronization beyond SyncML`_. originating config In a local sync, the sync config used to start the sync is called the originating sync config, or just originating config. target config In addition to the originating config, a local sync also uses a target config. At the configuration level, this target config is just another sync config. It becomes a target config when referenced by a sync config for local syncing. COMMAND LINE CONVENTIONS ======================== The ```` and the ```` strings in the command line synopsis are used to find the sync resp. datastore configs. Depending on which other parameters are given, different operations are executed. The ```` string has the format ``[][@]``. When the context is not specified explicitly, SyncEvolution first searches for an existing sync configuration with the given ```` name. If not found, the configuration can only be created, but not read. It will be created in the ``@default`` context as fallback. The empty ```` string is an alias for ``@default``. The ```` part identifies a specific sync or target config inside the context. It is optional and does not have to be specified when not needed, for example when configuring the shared settings of datastores (``--configure @default addressbook``) or accessing items inside a datastore (``--print-items @work calendar``). Listing datastores on the command line limits the operation to those datastores (called *active datastores* below). If not given, all datastores enabled for the config are active. Some operations require the name of exactly one datastore. Properties are set with key/value assignments and/or the ``--sync/store-property`` keywords. Those keywords are only needed for the hypothetical situation that a sync and datastore property share the same name (which was intentionally avoided). Without them, SyncEvolution automatically identifies which kind of property is meant based on the name. A ```` assignment has the following format:: [/][@|@@]= The optional ```` or ``@`` suffix limits the scope of the value to that particular configuration. This is useful when running a local sync, which involves a sync and a target configuration. For example, the log level can be specified separately for both sides:: --run loglevel@default=1 loglevel@google-calendar=4 google-calendar@default A string without a second @ sign inside is always interpreted as a context name, so in contrast to the ```` string, ``foo`` cannot be used to reference the ``foo@default`` configuration. Use the full name including the context for that. When no config or context is specified explicitly, a value is changed in all active configs, typically the one given with ````. The priority of multiple values for the same config is `more specific definition wins`, so ``@`` overrides ``@``, which overrides `no suffix given`. Specifying some suffix which does not apply to the current operation does not trigger an error, so beware of typos. Datastore properties can be specified with a ``/`` prefix. This allows limiting the value to the selected datastore. For example:: --configure "addressbook/database=My Addressbook" \ "calendar/database=My Calendar" \ @default addressbook calendar Another way to achieve the same effect is to run the ``--configure`` operation twice, once for ``addressbook`` and once for ``calendar``:: --configure "database=My Addressbook" @default addressbook --configure "database=My Calendar" @default calendar If the same property is set both with and without a ``/`` prefix, then the more specific value with that prefix is used for that datastore, regardless of the order on the command line. The following command enables all datastores except for the addressbook:: --configure addressbook/sync=none \ sync=two-way \ USAGE ===== :: syncevolution --print-databases [] [ ] If no additional arguments are given, then SyncEvolution will list all available backends and the databases that can be accessed through each backend. This works without existing configurations. However, some backends, like for example the CalDAV backend, need additional information (like credentials or URL of a remote server). This additional information can be provided on the command line with property assignments (``username=...``) or in an existing configuration. When listing all databases of all active datastores, the output starts with a heading that lists the values for the ``backend`` property which select the backend, followed by the databases. Each database has a name and a unique ID (in brackets). Typically both can be used as value of the 'database' property. One database might be marked as ``default``. It will be used when ``database`` is not set explicitly. When selecting an existing datastore configuration or specifying the ``backend`` property on the command line, only the databases for that backend are listed and the initial line shows how that backend was selected (/ resp. backend value). Some backends do not support listing of databases. For example, the file backend synchronizes directories with one file per item and always needs an explicit ``database`` property because it cannot guess which directory it is meant to use. :: syncevolution --create-database [] [ ] Creates a new database for the selected ``backend``, using the information given in the ``database`` property. As with ``--print-databases``, it is possible to give the properties directly without configuring a datastore first. The interpretation of the ``database`` property depends on the backend. Not all backends support this operation. The EDS backend uses the value of the ``database`` as name of the new database and assigns a unique URI automatically. :: syncevolution --remove-database [] [ ] Looks up the database based on the ``database`` property (depending on the backend, both name and a URI are valid), then deletes the data. Note that datastore configurations using the database are not removed. :: syncevolution Without the optional list of datastores, all datastores which are enabled in their configuration file are synchronized. :: syncevolution ... Otherwise only the ones mentioned on the command line are active. It is possible to configure datastores without activating their synchronization: if the synchronization mode of a datastore is set to `disabled`, the datastore will be ignored. Explicitly listing such a datastore will synchronize it in `two-way` mode once. Progress and error messages are written into a log file that is preserved for each synchronization run. Details about that is found in the `Automatic Backups and Logging` section below. All errors and warnings are printed directly to the console in addition to writing them into the log file. Before quitting SyncEvolution will print a summary of how the local data was modified. This is done with the `synccompare` utility script described in the `Exchanging Data`_ section. When the ``logdir`` property is enabled (since v0.9 done by default for new configurations), then the same comparison is also done before the synchronization starts. In case of a severe error the synchronization run is aborted prematurely and SyncEvolution will return a non-zero value. Recovery from failed synchronization is done by forcing a full synchronization during the next run, i.e. by sending all items and letting the SyncML server compare against the ones it already knows. This is avoided whenever possible because matching items during a slow synchronization can lead to duplicate entries. After a successful synchronization the server's configuration file is updated so that the next run can be done incrementally. If the configuration file has to be recreated e.g. because it was lost, the next run recovers from that by doing a full synchronization. The risk associated with this is that the server might not recognize items that it already has stored previously which then would lead to duplication of items. :: syncevolution --configure [ ...] Options in the configuration can be modified via the command line. The and the optional parameters define what gets created or modified. The remaining parameters define which values get set or modified. To change settings of specific datastores, either invoke syncevolution multiple times with exactly one parameter or use the ``[/]`` prefix described above for property assignments. :: syncevolution --remove Deletes the configuration. If the refers to a specific peer, only that peer's configuration is removed. If it refers to a context, that context and all peers and datastores defined inside it are removed. Note that there is no confirmation question. Neither local data referenced by the configuration nor the content of log dirs are deleted. :: syncevolution --run [ ...] Options can also be overridden for just the current run, without changing the configuration. In order to prevent accidentally running a sync session when a configuration change was intended, either --configure or --run must be given explicitly if options are specified on the command line. :: syncevolution --status [ ...] Prints what changes were made locally since the last synchronization. Depends on access to database dumps from the last run, so enabling the ``logdir`` property is recommended. :: syncevolution --print-servers|--print-configs|--print-peers syncevolution --print-config [--quiet] [main| ...] syncevolution --print-sessions [--quiet] These commands print information about existing configurations. When printing a configuration a short version without comments can be selected with --quiet. When datastores are listed, only their configuration is shown. `Main` instead or in combination with datastores lists only the main peer configuration. :: syncevolution --restore --before|--after [--dry-run] ... This restores local data from the backups made before or after a synchronization session. The --print-sessions command can be used to find these backups. The datastore(s) have to be listed explicitly. There is intentionally no default, because as with --remove there is no confirmation question. With --dry-run, the restore is only simulated. The session directory has to be specified explicitly with its path name (absolute or relative to current directory). It does not have to be one of the currently active log directories, as long as it contains the right database dumps for the selected datastores. A restore tries to minimize the number of item changes (see section `Item Changes and Data Changes`_). This means that items that are identical before and after the change will not be transmitted anew to the peer during the next synchronization. If the peer somehow needs to get a clean copy of all local items, then use ``--sync refresh-from-local`` in the next run. :: syncevolution --print-items syncevolution [--delimiter ] --export ||- [ [ [ ...]]] syncevolution [--delimiter |none] --import ||- [ ] syncevolution --update syncevolution [--delimiter |none] --update |- ... syncevolution --delete-items ( ... | *) Restore depends on the specific format of the automatic backups created by SyncEvolution. Arbitrary access to item data is provided with additional options. here is the unique local identifier assigned to each item in the datastore, transformed so that it contains only alphanumeric characters, dash and underscore. A star * in --delete-items selects all items for deletion. There are two ways of specifying luids: either as additional parameters after the config and datastore parameters (which may be empty in this case, but must be given) or after the ``--luids`` keyword. and may be given to define the database which is to be used. If not given or not refering to an existing configuration (which is not an error, due to historic reasons), the desired backend must be given via the ``backend`` property, like this:: syncevolution --print-items backend=evolution-contacts syncevolution --export - backend=evolution-contacts \ --luids pas-id-4E33F24300000006 pas-id-4E36DD7B00000007 The desired backend database can be chosen via ``database=``. See ``--print-databases``. OPTIONS ======= Here is a full description of all that can be put in front of the server name. Whenever an option accepts multiple values, a question mark can be used to get the corresponding help text and/or a list of valid values. --sync|-s |? Temporarily synchronize the active datastores in that mode. Useful for a `refresh-from-local` or `refresh-from-remote` sync which clears all data at one end and copies all items from the other. **Warning:** `local` is the data accessed via the sync config directly and `remote` is the data on the peer, regardless where the data is actually stored physically. --print-servers|--print-configs|--print-peers Prints the names of all configured peers to stdout. There is no difference between these options, the are just aliases. --print-servers|--print-configs|--print-peers|-p Prints the complete configuration for the selected to stdout, including up-to-date comments for all properties. The format is the normal .ini format with datastore configurations in different sections introduced with [] lines. Can be combined with --sync-property and --datastore-property to modify the configuration on-the-fly. When one or more datastores are listed after the name on the command line, then only the configs of those datastores are printed. `main` selects the main configuration instead of datastore configurations. Using --quiet suppresses the comments for each property. When setting a --template, then the reference configuration for that peer is printed instead of an existing configuration. \--print-sessions Prints information about previous synchronization sessions for the selected peer or context are printed. This depends on the ``logdir`` property. The information includes the log directory name (useful for --restore) and the synchronization report. In combination with --quiet, only the paths are listed. --configure|-c Modify the configuration files for the selected peer and/or datastores. If no such configuration exists, then a new one is created using one of the template configurations (see --template option). Choosing a template sets most of the relevant properties for the peer and the default set of datastores (see above for a list of those). Anything specific to the user (like username/password) still has to be set manually. When creating a new configuration and listing datastores explicitly on the command line, only those datastores will be set to active in the new configuration, i.e. `syncevolution -c memotoo addressbook` followed by `syncevolution memotoo` will only synchronize the address book. The other datastores are created in a disabled state. When modifying an existing configuration and datastores are specified, then the datastore properties of only those datastores are modified. By default, creating a config requires a template. Datastore names on the command line must match those in the template. This allows catching typos in the peer and datastore names. But it also prevents some advanced use cases. Therefore it is possible to disable these checks in two ways:: - use `--template none` or - specify all required sync and datastore properties that are normally in the templates on the command line (syncURL, backend, ...) --run|-r To prevent accidental sync runs when a configuration change was intended, but the `--configure` option was not used, `--run` must be specified explicitly when sync or datastore properties are selected on the command line and they are meant to be used during a sync session triggered by the invocation. \--migrate In older SyncEvolution releases a different layout of configuration files was used. Using --migrate will automatically migrate to the new layout and rename the into .old to prevent accidental use of the old configuration. WARNING: old SyncEvolution releases cannot use the new configuration! The switch can also be used to migrate a configuration in the current configuration directory: this preserves all property values, discards obsolete properties and sets all comments exactly as if the configuration had been created from scratch. WARNING: custom comments in the configuration are not preserved. --migrate implies --configure and can be combined with modifying properties. \--print-items Shows all existing items using one line per item using the format "[: ]". Whether the description is available depends on the backend and the kind of data that it stores. \--export Writes all items in the datastore or all items whose is given into a directory if the --export parameter exists and is a directory. The of each item is used as file name. Otherwise it creates a new file under that name and writes the selected items separated by the chosen delimiter string. stdout can be selected with a dash. The default delimiter (two line breaks) matches a blank line. As a special case, it also matches a blank line with DOS line ending (line break, carriage return, line break). This works for vCard 3.0 and iCalendar 2.0, which never contain blank lines. When exporting, the default delimiter will always insert two line breaks regardless whether the items contain DOS line ends. As a special case, the initial newline of a delimiter is skipped if the item already ends in a newline. \--import Adds all items found in the directory or input file to the datastore. When reading from a directory, each file is treated as one item. Otherwise the input is split at the chosen delimiter. "none" as delimiter disables splitting of the input. \--update Overwrites the content of existing items. When updating from a directory, the name of each file is taken as its luid. When updating from file or stdin, the number of luids given on the command line must match with the number of items in the input. \--delete-items Removes the specified items from the datastore. Most backends print some progress information about this, but besides that, no further output is produced. Trying to remove an item which does not exist typically leads to an ERROR message, but is not reflected in a non-zero result of the command line invocation itself because the situation is not reported as an error by backends (removal of non-existent items is not an error in SyncML). Use a star \* instead or in addition to listing individual luids to delete all items. --sync-property|-y =|=?|? Overrides a datastore-independent configuration property for the current synchronization run or permanently when --configure is used to update the configuration. Can be used multiple times. Specifying an unused property will trigger an error message. --datastore-property|--source-property|-z =|=?|? Same as --sync-property, but applies to the configuration of all active datastores. `--sync ` is a shortcut for `--datastore-property sync=`. --template|-l |default|? Can be used to select from one of the built-in default configurations for known SyncML peers. Defaults to the name, so --template only has to be specified when creating multiple different configurations for the same peer, or when using a template that is named differently than the peer. `default` is an alias for `memotoo` and can be used as the starting point for servers which do not have a built-in template. A pseudo-random device ID is generated automatically. Therefore setting the `deviceId` sync property is only necessary when manually recreating a configuration or when a more descriptive name is desired. The available templates for different known SyncML servers are listed when using a single question mark instead of template name. When using the `?` format, a fuzzy search for a template that might be suitable for talking to such a device is done. The matching works best when using ` = `. If you don't know the manufacturer, you can just keep it as empty. The output in this mode gives the template name followed by a short description and a rating how well the template matches the device (100% is best). --status|-t The changes made to local data since the last synchronization are shown without starting a new one. This can be used to see in advance whether the local data needs to be synchronized with the server. --quiet|-q Suppresses most of the normal output during a synchronization. The log file still contains all the information. --keyring[=]|-k A legacy option, now the same as setting the global keyring sync property. When not specifying a value explicitly, "true" for "use some kind of keyring" is implied. See "--sync-property keyring" for details. --daemon[=yes/no] By default, the SyncEvolution command line is executed inside the syncevo-dbus-server process. This ensures that synchronization sessions started by the command line do not conflict with sessions started via some other means (GUI, automatically). For debugging purposes or very special use cases (running a local sync against a server which executes inside the daemon) it is possible to execute the operation without the daemon (--daemon=no). --help|-h Prints usage information. \--version Prints the SyncEvolution version. CONFIGURATION PROPERTIES ======================== This section lists predefined properties. Backends can add their own properties at runtime if none of the predefined properties are suitable for a certain setting. Those additional properties are not listed here. Use ``--sync/datastore-property ?`` to get an up-to-date list. The predefined properties may also be interpreted slightly differently by each backend and sync protocol. Sometimes this is documented in the comment for each property, sometimes in the documentation of the backend or sync protocol. Properties are listed together with all recognized aliases (in those cases where a property was renamed at some point), its default value, sharing state (unshared/shared/global). Some properties must be defined, which is marked with the word `required`. Sync properties --------------- syncURL (no default, unshared, required) Identifies how to contact the peer, best explained with some examples. HTTP(S) SyncML servers:: http://example.com/sync OBEX over Bluetooth uses the MAC address, with the channel chosen automatically:: obex-bt://00:0A:94:03:F3:7E If the automatism fails, the channel can also be specified:: obex-bt://00:0A:94:03:F3:7E+16 For peers contacting us via Bluetooth, the MAC address is used to identify it before the sync starts. Multiple urls can be specified in one syncURL property:: obex-bt://00:0A:94:03:F3:7E obex-bt://00:01:02:03:04:05 In the future this might be used to contact the peer via one of several transports; right now, only the first one is tried. username (no default, unshared) user name used for authorization with the SyncML server password (no default, unshared) password used for authorization with the peer; in addition to specifying it directly as plain text, it can also be read from the standard input or from an environment variable of your choice:: plain text : password = ask : password = - env variable: password = ${} logdir (no default, shared) full path to directory where automatic backups and logs are stored for all synchronizations; if unset, then "${XDG_CACHE_HOME}/syncevolution/" (which usually expands to ${HOME}/.cache/...) will be used; if "none", then no backups of the databases are made and any output is printed directly to the screen loglevel (0, unshared) level of detail for log messages: - 0 (or unset) = INFO messages without log file, DEBUG with log file - 1 = only ERROR messages - 2 = also INFO messages - 3 = also DEBUG messages > 3 = increasing amounts of debug messages for developers notifyLevel (3, unshared) Level of detail for desktop notifications. Currently such notifications are generated only for automatically started sync sessions. 0 - suppress all notifications 1 - show only errors 2 - show information about changes and errors (in practice currently the same as level 3) 3 - show all notifications, including starting a sync printChanges (TRUE, unshared) enables or disables the detailed (and sometimes slow) comparison of database content before and after a sync session dumpData (TRUE, unshared) enables or disables the automatic backup of database content before and after a sync session (always enabled if printChanges is enabled) maxlogdirs (10, shared) Controls how many session directories are kept at most in the logdir. Unless set to zero, SyncEvolution will remove old directories and all their content to prevent the number of log directories from growing beyond the given limit. It tries to be intelligent and will remove sessions in which nothing interesting happened (no errors, no data changes) in favor of keeping sessions where something happened, even if those sessions are older. autoSync (0, unshared) Controls automatic synchronization. Currently, automatic synchronization is done by running a synchronization at regular intervals. This may drain the battery, in particular when using Bluetooth! Because a peer might be reachable via different transports at some point, this option provides detailed control over which transports may be used for automatic synchronization: 0 don't do auto sync 1 do automatic sync, using whatever transport is available http only via HTTP transport obex-bt only via Bluetooth transport http,obex-bt pick one of these autoSyncInterval (30M, unshared) This is the minimum number of seconds since the start of the last synchronization that has to pass before starting an automatic synchronization. Can be specified using a 1h30m5s format. Before reducing this interval, consider that it will increase resource consumption on the local and remote side. Some SyncML server operators only allow a certain number of sessions per day. The value 0 has the effect of only running automatic synchronization when changes are detected (not implemented yet, therefore it basically disables automatic synchronization). autoSyncDelay (5M, unshared) An automatic sync will not be started unless the peer has been available for this duration, specified in seconds or 1h30m5s format. This prevents running a sync when network connectivity is unreliable or was recently established for some other purpose. It is also a heuristic that attempts to predict how long connectivity be available in the future, because it should better be available long enough to complete the synchronization. preventSlowSync (TRUE, unshared) During a slow sync, the SyncML server must match all items of the client with its own items and detect which ones it already has based on properties of the items. This is slow (client must send all its data) and can lead to duplicates (when the server fails to match correctly). It is therefore sometimes desirable to wipe out data on one side with a refresh-from-client/server sync instead of doing a slow sync. When this option is enabled, slow syncs that could cause problems are not allowed to proceed. Instead, the affected datastores are skipped, allowing the user to choose a suitable sync mode in the next run (slow sync selected explicitly, refresh sync). The following situations are handled: - running as client with no local data => unproblematic, slow sync is allowed to proceed automatically - running as client with local data => client has no information about server, so slow sync might be problematic and is prevented - client has data, server asks for slow sync because all its data was deleted (done by Memotoo and Mobical, because they treat this as 'user wants to start from scratch') => the sync would recreate all the client's data, even if the user really wanted to have it deleted, therefore slow sync is prevented useProxy (FALSE, unshared) set to T to choose an HTTP proxy explicitly; otherwise the default proxy settings of the underlying HTTP transport mechanism are used; only relevant when contacting the peer via HTTP proxyHost (no default, unshared) proxy URL (``http://:``) proxyUsername (no default, unshared) authentication for proxy: username proxyPassword (no default, unshared) proxy password, can be specified in different ways, see SyncML server password for details clientAuthType (md5, unshared) - empty or "md5" for secure method (recommended) - "basic" for insecure method This setting is only for debugging purpose and only has an effect during the initial sync of a client. Later it remembers the method that was supported by the server and uses that. When acting as server, clients contacting us can use both basic and md5 authentication. RetryDuration (5M, unshared) The total amount of time in seconds in which the SyncML client tries to get a response from the server. During this time, the client will resend messages in regular intervals (RetryInterval) if no response is received or the message could not be delivered due to transport problems. When this time is exceeded without a response, the synchronization aborts without sending further messages to the server. When acting as server, this setting controls how long a client is allowed to not send a message before the synchronization is aborted. RetryInterval (2M, unshared) The number of seconds between the start of SyncML message sending and the start of the retransmission. If the interval has already passed when a message send returns, the message is resent immediately. Resending without any delay will never succeed and therefore specifying 0 disables retries. Servers cannot resend messages, so this setting has no effect in that case. The WebDAV backend also resends messages after a temporary network error. It uses exponential backoff to determine when the server is available again. This setting is divided by 24 to obtain the initial delay (default: 2m => 5s), which is then doubled for each retry. remoteIdentifier (no default, unshared) the identifier sent to the remote peer for a server initiated sync. if not set, deviceId will be used instead PeerIsClient (FALSE, unshared) Indicates whether this configuration is about a client peer or server peer. SyncMLVersion (no default, unshared) On a client, the latest commonly supported SyncML version is used when contacting a server. One of '1.0/1.1/1.2' can be used to pick a specific version explicitly. On a server, this option controls what kind of Server Alerted Notification is sent to the client to start a synchronization. By default, first the format from 1.2 is tried, then in case of failure, the older one from 1.1. 1.2/1.1 can be set explicitly, which disables the automatism. Instead or in adddition to the version, several keywords can be set in this property (separated by spaces or commas): - NOCTCAP - avoid sending CtCap meta information - NORESTART - disable the sync mode extension that SyncEvolution client and server use to negotiate whether both sides support running multiple sync iterations in the same session - REQUESTMAXTIME=
    ''')
    
    def simplifyFilename(test):
        "same as client-test-main.cpp simplifyFilename()"
        test = test.replace(':', '_')
        test = test.replace('__', '_')
        return test
    
    for line in log:
        line = line.rstrip()
        m = tag.match(line)
        if m:
            ModeSpan.setMode(m.group(2))
            out.write('%s' % m.group(1))
            line = m.group(3)
        line = cgi.escape(line)
        line = sourcefile.sub(r'\1', line)
        line = highlight.sub(r'\1', line)
        line = session.sub(r'\1', line)
        out.write(line)
        out.write('\n')
    
    # close any  opened before
    ModeSpan.setMode(None)
    
    out.write('''